summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 19:44:05 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 19:44:05 +0000
commitd318611dd6f23fcfedd50e9b9e24620b102ba96a (patch)
tree8b9eef82ca40fdd5a8deeabf07572074c236095d
parentInitial commit. (diff)
downloadgroff-upstream.tar.xz
groff-upstream.zip
Adding upstream version 1.23.0.upstream/1.23.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
-rw-r--r--.tarball-version1
-rw-r--r--.version1
-rw-r--r--AUTHORS0
-rw-r--r--BUG-REPORT72
-rw-r--r--COPYING674
-rw-r--r--ChangeLog18665
-rw-r--r--ChangeLog.1156156
-rw-r--r--ChangeLog.1161397
-rw-r--r--ChangeLog.1172199
-rw-r--r--ChangeLog.1183803
-rw-r--r--ChangeLog.1195240
-rw-r--r--ChangeLog.1203053
-rw-r--r--ChangeLog.121788
-rw-r--r--ChangeLog.1225331
-rw-r--r--FDL451
-rw-r--r--FOR-RELEASE58
-rw-r--r--HACKING178
-rw-r--r--INSTALL368
-rw-r--r--INSTALL.REPO136
-rw-r--r--INSTALL.extra273
-rw-r--r--LICENSES219
-rw-r--r--MANIFEST191
-rw-r--r--MORE.STUFF189
-rw-r--r--Makefile.am915
-rw-r--r--Makefile.in15815
-rw-r--r--NEWS3594
-rw-r--r--PROBLEMS1321
-rw-r--r--PROJECTS52
-rw-r--r--README130
-rw-r--r--README.MinGW326
-rw-r--r--THANKS0
-rw-r--r--TODO41
-rw-r--r--acinclude.m425
-rw-r--r--aclocal.m41593
-rw-r--r--arch/djgpp/README361
-rw-r--r--arch/djgpp/config.bat100
-rw-r--r--arch/djgpp/config.sed21
-rw-r--r--arch/djgpp/config.site38
-rw-r--r--arch/djgpp/t-groff.bat83
-rw-r--r--arch/mingw/afmtodit.cmd2
-rw-r--r--arch/mingw/chem.cmd2
-rw-r--r--arch/mingw/gperl.cmd2
-rw-r--r--arch/mingw/gpinyin.cmd2
-rw-r--r--arch/mingw/grap2graph.cmd86
-rw-r--r--arch/mingw/grog.cmd2
-rw-r--r--arch/mingw/gropdf.cmd2
-rw-r--r--arch/mingw/mingw.am49
-rw-r--r--arch/mingw/mmroff.cmd2
-rw-r--r--arch/mingw/neqn.cmd6
-rw-r--r--arch/mingw/pdfmom.cmd2
-rw-r--r--arch/mingw/roff2dvi.cmd2
-rw-r--r--arch/mingw/roff2html.cmd2
-rw-r--r--arch/mingw/roff2pdf.cmd2
-rw-r--r--arch/mingw/roff2ps.cmd2
-rw-r--r--arch/mingw/roff2text.cmd2
-rw-r--r--arch/mingw/roff2x.cmd2
-rw-r--r--arch/misc/misc.am35
-rw-r--r--arch/misc/shdeps.sh117
-rwxr-xr-xbuild-aux/compile348
-rwxr-xr-xbuild-aux/config.guess1774
-rwxr-xr-xbuild-aux/config.rpath684
-rwxr-xr-xbuild-aux/config.sub1907
-rwxr-xr-xbuild-aux/depcomp790
-rwxr-xr-xbuild-aux/git-version-gen227
-rwxr-xr-xbuild-aux/install-sh541
-rwxr-xr-xbuild-aux/missing215
-rwxr-xr-xbuild-aux/test-driver153
-rwxr-xr-xbuild-aux/ylwrap247
-rwxr-xr-xconfigure31918
-rw-r--r--configure.ac263
-rw-r--r--contrib/chem/ChangeLog373
-rw-r--r--contrib/chem/README.txt50
-rw-r--r--contrib/chem/chem.1.man925
-rw-r--r--contrib/chem/chem.am120
-rw-r--r--contrib/chem/chem.pic89
-rwxr-xr-xcontrib/chem/chem.pl1231
-rw-r--r--contrib/chem/examples/122/README.txt57
-rw-r--r--contrib/chem/examples/122/ch2a_ethyl.chem43
-rw-r--r--contrib/chem/examples/122/ch2b_benzene.chem38
-rw-r--r--contrib/chem/examples/122/ch2c_benzene_right.chem36
-rw-r--r--contrib/chem/examples/122/ch4a_stick.chem45
-rw-r--r--contrib/chem/examples/122/ch4b_methyl_acetate.chem47
-rw-r--r--contrib/chem/examples/122/ch4c_colon.chem42
-rw-r--r--contrib/chem/examples/122/ch4d_HCl.H2O.chem38
-rw-r--r--contrib/chem/examples/122/ch4e_CaSO4.2H2O.chem38
-rw-r--r--contrib/chem/examples/122/ch4f_C.chem48
-rw-r--r--contrib/chem/examples/122/ch4g_BP.chem48
-rw-r--r--contrib/chem/examples/122/ch4h_methacrylate.chem65
-rw-r--r--contrib/chem/examples/122/ch4i_cyclo.chem45
-rw-r--r--contrib/chem/examples/122/ch4j_ring4.chem40
-rw-r--r--contrib/chem/examples/122/ch4k_ring3.chem40
-rw-r--r--contrib/chem/examples/122/ch4l_vertex.chem45
-rw-r--r--contrib/chem/examples/122/ch4m_double.chem38
-rw-r--r--contrib/chem/examples/122/ch4n_triple.chem38
-rw-r--r--contrib/chem/examples/122/ch4o_aromatic.chem37
-rw-r--r--contrib/chem/examples/122/ch4p_cholestanol.chem60
-rw-r--r--contrib/chem/examples/122/ch4q_rings.chem46
-rw-r--r--contrib/chem/examples/122/ch4r_spiro.chem42
-rw-r--r--contrib/chem/examples/122/ch4s_heteroatoms.chem38
-rw-r--r--contrib/chem/examples/122/ch4t_polycyclic.chem49
-rw-r--r--contrib/chem/examples/122/ch4u_nicotine.chem42
-rw-r--r--contrib/chem/examples/122/ch4v_histidine.chem44
-rw-r--r--contrib/chem/examples/122/ch4w_lsd.chem50
-rw-r--r--contrib/chem/examples/122/ch4x_anisole.chem42
-rw-r--r--contrib/chem/examples/122/ch4y_reserpine.chem62
-rw-r--r--contrib/chem/examples/122/ch4z1_eqn_glutamic.chem78
-rw-r--r--contrib/chem/examples/122/ch4z2_text.chem53
-rw-r--r--contrib/chem/examples/122/ch5a_size.chem45
-rw-r--r--contrib/chem/examples/122/ch6a_pic.chem43
-rw-r--r--contrib/chem/examples/122/ch6b_dna.chem59
-rw-r--r--contrib/chem/examples/122/chAa_polymer.chem72
-rw-r--r--contrib/chem/examples/122/chAb_vinyl_chloro.chem62
-rw-r--r--contrib/chem/examples/122/chAc_morphine.chem52
-rw-r--r--contrib/chem/examples/122/chAd_chlorophyll.chem69
-rw-r--r--contrib/chem/examples/122/chAe_chair.chem49
-rw-r--r--contrib/chem/examples/122/chAf_arrow.chem68
-rw-r--r--contrib/chem/examples/122/chAg_circle.chem54
-rw-r--r--contrib/chem/examples/122/chAh_brackets.chem60
-rw-r--r--contrib/chem/examples/122/chAi_poly_vinyl_chloride.chem141
-rw-r--r--contrib/chem/examples/122/chBa_jump.chem41
-rw-r--r--contrib/chem/examples/122/chBb_bonds.chem42
-rw-r--r--contrib/chem/examples/122/chBc_rings.chem43
-rw-r--r--contrib/chem/examples/README.txt47
-rw-r--r--contrib/chem/examples/atp.chem58
-rw-r--r--contrib/chem/examples/cholesterin.chem47
-rw-r--r--contrib/chem/examples/ethamivan.chem43
-rw-r--r--contrib/chem/examples/lsd.chem46
-rw-r--r--contrib/chem/examples/morphine.chem51
-rw-r--r--contrib/chem/examples/penicillin.chem52
-rw-r--r--contrib/chem/examples/reserpine.chem63
-rw-r--r--contrib/eqn2graph/eqn2graph.1.man188
-rw-r--r--contrib/eqn2graph/eqn2graph.am40
-rw-r--r--contrib/eqn2graph/eqn2graph.sh108
-rw-r--r--contrib/gdiffmk/ChangeLog212
-rw-r--r--contrib/gdiffmk/README53
-rw-r--r--contrib/gdiffmk/gdiffmk.1.man304
-rw-r--r--contrib/gdiffmk/gdiffmk.am59
-rw-r--r--contrib/gdiffmk/gdiffmk.sh367
-rw-r--r--contrib/gdiffmk/tests/baseline17
-rw-r--r--contrib/gdiffmk/tests/baseline.1026
-rw-r--r--contrib/gdiffmk/tests/baseline.617
-rw-r--r--contrib/gdiffmk/tests/baseline.6a17
-rw-r--r--contrib/gdiffmk/tests/baseline.72
-rw-r--r--contrib/gdiffmk/tests/baseline.826
-rw-r--r--contrib/gdiffmk/tests/baseline.926
-rw-r--r--contrib/gdiffmk/tests/baseline.9a26
-rw-r--r--contrib/gdiffmk/tests/file111
-rw-r--r--contrib/gdiffmk/tests/file211
-rwxr-xr-xcontrib/gdiffmk/tests/runtests.sh187
-rw-r--r--contrib/glilypond/ChangeLog290
-rw-r--r--contrib/glilypond/ChangeLog.0x104
-rw-r--r--contrib/glilypond/README.txt43
-rw-r--r--contrib/glilypond/examples/example.groff46
-rw-r--r--contrib/glilypond/glilypond.1.man881
-rw-r--r--contrib/glilypond/glilypond.am64
-rwxr-xr-xcontrib/glilypond/glilypond.pl1907
-rw-r--r--contrib/gperl/ChangeLog142
-rw-r--r--contrib/gperl/gperl.1.man491
-rw-r--r--contrib/gperl/gperl.am48
-rwxr-xr-xcontrib/gperl/gperl.pl257
-rw-r--r--contrib/gpinyin/ChangeLog200
-rw-r--r--contrib/gpinyin/gpinyin.1.man378
-rw-r--r--contrib/gpinyin/gpinyin.am56
-rwxr-xr-xcontrib/gpinyin/gpinyin.pl725
-rw-r--r--contrib/grap2graph/grap2graph.1.man205
-rw-r--r--contrib/grap2graph/grap2graph.am40
-rw-r--r--contrib/grap2graph/grap2graph.sh107
-rw-r--r--contrib/hdtbl/ChangeLog548
-rw-r--r--contrib/hdtbl/TODO21
-rw-r--r--contrib/hdtbl/examples/chess_board.roff64
-rw-r--r--contrib/hdtbl/examples/col_rowspan_colors.roff82
-rw-r--r--contrib/hdtbl/examples/color_boxes.roff52
-rw-r--r--contrib/hdtbl/examples/color_nested_tables.roff60
-rw-r--r--contrib/hdtbl/examples/color_table_cells.roff54
-rw-r--r--contrib/hdtbl/examples/color_transitions.roff58
-rw-r--r--contrib/hdtbl/examples/common.roff295
-rw-r--r--contrib/hdtbl/examples/fonts_n.in149
-rw-r--r--contrib/hdtbl/examples/fonts_x.in160
-rw-r--r--contrib/hdtbl/examples/mixed_pickles.roff104
-rw-r--r--contrib/hdtbl/examples/rainbow.roff86
-rw-r--r--contrib/hdtbl/examples/short_reference.roff86
-rw-r--r--contrib/hdtbl/examples/test-hdtbl.sh.in47
-rw-r--r--contrib/hdtbl/groff_hdtbl.7.man1346
-rw-r--r--contrib/hdtbl/hdmisc.tmac327
-rw-r--r--contrib/hdtbl/hdtbl.am136
-rw-r--r--contrib/hdtbl/hdtbl.tmac1003
-rw-r--r--contrib/mm/ChangeLog1672
-rw-r--r--contrib/mm/Makefile.sim84
-rw-r--r--contrib/mm/NOTES116
-rw-r--r--contrib/mm/README27
-rw-r--r--contrib/mm/examples/APP359
-rw-r--r--contrib/mm/examples/B1B298
-rw-r--r--contrib/mm/examples/COVER242
-rw-r--r--contrib/mm/examples/IND4198
-rw-r--r--contrib/mm/examples/LT1065
-rw-r--r--contrib/mm/examples/LT.se1069
-rw-r--r--contrib/mm/examples/ML176
-rw-r--r--contrib/mm/examples/MOVE182
-rw-r--r--contrib/mm/examples/MUL542
-rw-r--r--contrib/mm/examples/NCOL203
-rw-r--r--contrib/mm/examples/ND24
-rw-r--r--contrib/mm/examples/README40
-rw-r--r--contrib/mm/examples/References982
-rw-r--r--contrib/mm/examples/SETR116
-rw-r--r--contrib/mm/examples/letter.mm51
-rw-r--r--contrib/mm/groff_mm.7.man5428
-rw-r--r--contrib/mm/groff_mmse.7.man183
-rw-r--r--contrib/mm/m.tmac3734
-rw-r--r--contrib/mm/mm.am128
-rw-r--r--contrib/mm/mm.tmac4
-rw-r--r--contrib/mm/mm/0.MT175
-rw-r--r--contrib/mm/mm/4.MT110
-rw-r--r--contrib/mm/mm/5.MT61
-rw-r--r--contrib/mm/mm/ms.cov121
-rw-r--r--contrib/mm/mm/se_ms.cov3
-rw-r--r--contrib/mm/mmroff.1.man171
-rw-r--r--contrib/mm/mmroff.pl179
-rw-r--r--contrib/mm/mmse.tmac4
-rw-r--r--contrib/mm/mse.tmac166
-rw-r--r--contrib/mm/refer-mm.tmac109
-rwxr-xr-xcontrib/mm/tests/LT_SP_AU_without_AT_works.sh50
-rwxr-xr-xcontrib/mm/tests/LT_SP_multi-word_LO_SJ_works.sh49
-rwxr-xr-xcontrib/mm/tests/MT-1-reports-all-TM-numbers.sh53
-rwxr-xr-xcontrib/mm/tests/MT_5_includes_AT_in_SG.sh43
-rwxr-xr-xcontrib/mm/tests/P-indentation-works.sh135
-rw-r--r--contrib/mm/tests/artifacts/60657.ref11
-rwxr-xr-xcontrib/mm/tests/ms_cover_sheet_robust_to_missing_AF.sh39
-rwxr-xr-xcontrib/mm/tests/mse_has-sufficient-footnote-space.sh77
-rwxr-xr-xcontrib/mm/tests/place-equation-labels-correctly-in-displays.sh62
-rwxr-xr-xcontrib/mm/tests/remove-stale-bib-entry-data.sh72
-rwxr-xr-xcontrib/mm/tests/short-pages-do-not-overflow-stack.sh59
-rw-r--r--contrib/mom/BUGS985
-rw-r--r--contrib/mom/ChangeLog1788
-rw-r--r--contrib/mom/NEWS710
-rw-r--r--contrib/mom/TODO10
-rw-r--r--contrib/mom/copyright24
-rw-r--r--contrib/mom/examples/README-fr.txt126
-rw-r--r--contrib/mom/examples/README.txt119
-rw-r--r--contrib/mom/examples/copyright-chapter.mom160
-rw-r--r--contrib/mom/examples/copyright-default.mom149
-rw-r--r--contrib/mom/examples/elvis_syntax96
-rw-r--r--contrib/mom/examples/elvis_syntax.new116
-rw-r--r--contrib/mom/examples/letter.mom46
-rw-r--r--contrib/mom/examples/mom-pdf.mom620
-rw-r--r--contrib/mom/examples/mom.vim140
-rw-r--r--contrib/mom/examples/mon_premier_doc.mom140
-rw-r--r--contrib/mom/examples/penguin.pdf148
-rw-r--r--contrib/mom/examples/penguin.ps461
-rw-r--r--contrib/mom/examples/sample_docs.mom713
-rw-r--r--contrib/mom/examples/slide-demo.mom438
-rw-r--r--contrib/mom/examples/test-mom.sh.in92
-rw-r--r--contrib/mom/examples/typesetting.mom707
-rw-r--r--contrib/mom/groff_mom.7.man3427
-rw-r--r--contrib/mom/mom.am182
-rw-r--r--contrib/mom/mom.tmac3
-rw-r--r--contrib/mom/momdoc/appendices.html901
-rw-r--r--contrib/mom/momdoc/color.html505
-rw-r--r--contrib/mom/momdoc/cover.html851
-rw-r--r--contrib/mom/momdoc/definitions.html995
-rw-r--r--contrib/mom/momdoc/docelement.html6639
-rw-r--r--contrib/mom/momdoc/docprocessing.html4420
-rw-r--r--contrib/mom/momdoc/goodies.html1785
-rw-r--r--contrib/mom/momdoc/graphical.html689
-rw-r--r--contrib/mom/momdoc/headfootpage.html2341
-rw-r--r--contrib/mom/momdoc/images.html3515
-rw-r--r--contrib/mom/momdoc/inlines.html1112
-rw-r--r--contrib/mom/momdoc/intro.html487
-rw-r--r--contrib/mom/momdoc/letters.html577
-rw-r--r--contrib/mom/momdoc/macrolist.html1529
-rw-r--r--contrib/mom/momdoc/rectoverso.html350
-rw-r--r--contrib/mom/momdoc/refer.html2129
-rw-r--r--contrib/mom/momdoc/reserved.html2736
-rw-r--r--contrib/mom/momdoc/stylesheet.css691
-rw-r--r--contrib/mom/momdoc/tables-of-contents.html1224
-rw-r--r--contrib/mom/momdoc/toc.html476
-rw-r--r--contrib/mom/momdoc/typesetting.html4988
-rw-r--r--contrib/mom/momdoc/using.html319
-rw-r--r--contrib/mom/momdoc/version-2.html424
-rw-r--r--contrib/mom/om.tmac24571
-rw-r--r--contrib/pdfmark/ChangeLog683
-rw-r--r--contrib/pdfmark/PROBLEMS32
-rw-r--r--contrib/pdfmark/README57
-rw-r--r--contrib/pdfmark/TODO60
-rw-r--r--contrib/pdfmark/cover.ms70
-rw-r--r--contrib/pdfmark/pdfmark.am99
-rw-r--r--contrib/pdfmark/pdfmark.ms2831
-rw-r--r--contrib/pdfmark/pdfmark.tmac1953
-rw-r--r--contrib/pdfmark/pdfroff.1.man981
-rw-r--r--contrib/pdfmark/pdfroff.sh682
-rw-r--r--contrib/pdfmark/sanitize.tmac170
-rw-r--r--contrib/pdfmark/spdf.tmac328
-rw-r--r--contrib/pic2graph/pic2graph.1.man234
-rw-r--r--contrib/pic2graph/pic2graph.am40
-rw-r--r--contrib/pic2graph/pic2graph.sh122
-rw-r--r--contrib/rfc1345/COPYRIGHT23
-rw-r--r--contrib/rfc1345/groff_rfc1345.7.man265
-rw-r--r--contrib/rfc1345/rfc1345.am41
-rw-r--r--contrib/rfc1345/rfc1345.tmac1705
-rwxr-xr-xcontrib/rfc1345/tests/rfc1345-smoke-test.sh31
-rw-r--r--contrib/sboxes/ChangeLog202
-rw-r--r--contrib/sboxes/msboxes.ms.in272
-rw-r--r--contrib/sboxes/notquine.sed18
-rw-r--r--contrib/sboxes/sboxes.am74
-rw-r--r--contrib/sboxes/sboxes.tmac147
-rw-r--r--doc/automake.mom789
-rw-r--r--doc/doc.am711
-rw-r--r--doc/fdl.texi505
-rw-r--r--doc/gnu.eps784
-rw-r--r--doc/gnu.xpm198
-rw-r--r--doc/grnexmpl.g3250
-rw-r--r--doc/grnexmpl.me88
-rw-r--r--doc/groff.css17
-rw-r--r--doc/groff.dvibin0 -> 1369752 bytes
-rw-r--r--doc/groff.html24945
-rw-r--r--doc/groff.html.node/Adjustment.html57
-rw-r--r--doc/groff.html.node/Argument-Units.html68
-rw-r--r--doc/groff.html.node/Artificial-Fonts.html252
-rw-r--r--doc/groff.html.node/Assigning-Register-Formats.html188
-rw-r--r--doc/groff.html.node/Auto_002dincrement.html124
-rw-r--r--doc/groff.html.node/Background.html96
-rw-r--r--doc/groff.html.node/Basics.html232
-rw-r--r--doc/groff.html.node/Blank-Line-Traps.html71
-rw-r--r--doc/groff.html.node/Breaking.html119
-rw-r--r--doc/groff.html.node/Built_002din-Registers.html253
-rw-r--r--doc/groff.html.node/Calling-Macros.html164
-rw-r--r--doc/groff.html.node/Changing-the-Type-Size.html159
-rw-r--r--doc/groff.html.node/Changing-the-Vertical-Spacing.html146
-rw-r--r--doc/groff.html.node/Character-Classes.html140
-rw-r--r--doc/groff.html.node/Character-Translations.html200
-rw-r--r--doc/groff.html.node/Colors.html208
-rw-r--r--doc/groff.html.node/Columnation.html53
-rw-r--r--doc/groff.html.node/Command-Reference.html60
-rw-r--r--doc/groff.html.node/Comment-Command.html65
-rw-r--r--doc/groff.html.node/Comments.html157
-rw-r--r--doc/groff.html.node/Common-Features.html89
-rw-r--r--doc/groff.html.node/Compatibility-Mode.html221
-rw-r--r--doc/groff.html.node/Concept-Index.html2359
-rw-r--r--doc/groff.html.node/Conditional-Blocks.html174
-rw-r--r--doc/groff.html.node/Conditionals-and-Loops.html64
-rw-r--r--doc/groff.html.node/Configuration-and-Customization.html56
-rw-r--r--doc/groff.html.node/Control-Characters.html137
-rw-r--r--doc/groff.html.node/Conventions-Used-in-This-Manual.html124
-rw-r--r--doc/groff.html.node/Copy-Mode.html256
-rw-r--r--doc/groff.html.node/Copying-This-Manual.html534
-rw-r--r--doc/groff.html.node/Credits.html58
-rw-r--r--doc/groff.html.node/DESC-File-Format.html258
-rw-r--r--doc/groff.html.node/Debugging.html317
-rw-r--r--doc/groff.html.node/Default-Units.html87
-rw-r--r--doc/groff.html.node/Deferring-Output.html106
-rw-r--r--doc/groff.html.node/Delimiters.html233
-rw-r--r--doc/groff.html.node/Device-Control-Commands.html185
-rw-r--r--doc/groff.html.node/Device-and-Font-Description-Files.html77
-rw-r--r--doc/groff.html.node/Differences-from-AT_0026T-ms.html171
-rw-r--r--doc/groff.html.node/Displays-and-Keeps.html74
-rw-r--r--doc/groff.html.node/Diversion-Traps.html79
-rw-r--r--doc/groff.html.node/Diversions.html394
-rw-r--r--doc/groff.html.node/Document-Formats.html57
-rw-r--r--doc/groff.html.node/Document-Parts.html84
-rw-r--r--doc/groff.html.node/Drawing-Geometric-Objects.html361
-rw-r--r--doc/groff.html.node/Dummy-Characters.html166
-rw-r--r--doc/groff.html.node/End_002dof_002dinput-Traps.html187
-rw-r--r--doc/groff.html.node/Environment.html151
-rw-r--r--doc/groff.html.node/Environments.html250
-rw-r--r--doc/groff.html.node/Escape-Sequence-Index.html162
-rw-r--r--doc/groff.html.node/Fields.html98
-rw-r--r--doc/groff.html.node/File-Formats.html62
-rw-r--r--doc/groff.html.node/File-Keyword-Index.html215
-rw-r--r--doc/groff.html.node/Filling.html79
-rw-r--r--doc/groff.html.node/Font-Description-File-Format.html280
-rw-r--r--doc/groff.html.node/Font-Directories.html113
-rw-r--r--doc/groff.html.node/Font-Families.html182
-rw-r--r--doc/groff.html.node/Font-Positions.html138
-rw-r--r--doc/groff.html.node/Font-and-Size-Changes.html56
-rw-r--r--doc/groff.html.node/Footnotes-and-Endnotes.html60
-rw-r--r--doc/groff.html.node/Formatter-Instructions.html83
-rw-r--r--doc/groff.html.node/GNU-troff-Reference.html99
-rw-r--r--doc/groff.html.node/Graphics-Commands.html247
-rw-r--r--doc/groff.html.node/Groff-Options.html536
-rw-r--r--doc/groff.html.node/Gtroff-Internals.html187
-rw-r--r--doc/groff.html.node/Headers-and-Footers.html61
-rw-r--r--doc/groff.html.node/Headings-in-ms.html214
-rw-r--r--doc/groff.html.node/Hyphenation.html66
-rw-r--r--doc/groff.html.node/I_002fO.html457
-rw-r--r--doc/groff.html.node/Identifiers.html210
-rw-r--r--doc/groff.html.node/Implementation-Differences.html64
-rw-r--r--doc/groff.html.node/Indented-regions-in-ms.html112
-rw-r--r--doc/groff.html.node/Indexing.html58
-rw-r--r--doc/groff.html.node/Input-Conventions.html171
-rw-r--r--doc/groff.html.node/Input-Encodings.html154
-rw-r--r--doc/groff.html.node/Input-Line-Traps.html185
-rw-r--r--doc/groff.html.node/Installation.html57
-rw-r--r--doc/groff.html.node/Intermediate-Output-Examples.html171
-rw-r--r--doc/groff.html.node/Interpolating-Registers.html99
-rw-r--r--doc/groff.html.node/Introduction.html68
-rw-r--r--doc/groff.html.node/Invocation-Examples.html120
-rw-r--r--doc/groff.html.node/Invoking-Requests.html143
-rw-r--r--doc/groff.html.node/Invoking-groff.html82
-rw-r--r--doc/groff.html.node/Italic-Corrections.html96
-rw-r--r--doc/groff.html.node/Language-Concepts.html70
-rw-r--r--doc/groff.html.node/Leaders.html126
-rw-r--r--doc/groff.html.node/Leading-Space-Traps.html82
-rw-r--r--doc/groff.html.node/Ligatures-and-Kerning.html157
-rw-r--r--doc/groff.html.node/Line-Continuation.html166
-rw-r--r--doc/groff.html.node/Line-Layout.html267
-rw-r--r--doc/groff.html.node/Lists-in-ms.html216
-rw-r--r--doc/groff.html.node/Macro-Directories.html125
-rw-r--r--doc/groff.html.node/Macro-Index.html335
-rw-r--r--doc/groff.html.node/Macro-Package-Intro.html63
-rw-r--r--doc/groff.html.node/Macro-Packages.html64
-rw-r--r--doc/groff.html.node/Major-Macro-Packages.html103
-rw-r--r--doc/groff.html.node/Manipulating-Filling-and-Adjustment.html501
-rw-r--r--doc/groff.html.node/Manipulating-Hyphenation.html580
-rw-r--r--doc/groff.html.node/Manipulating-Spacing.html220
-rw-r--r--doc/groff.html.node/Manipulating-Type-Size-and-Vertical-Spacing.html74
-rw-r--r--doc/groff.html.node/Measurements.html177
-rw-r--r--doc/groff.html.node/Miscellaneous.html275
-rw-r--r--doc/groff.html.node/Missing-Unix-Version-7-ms-Macros.html78
-rw-r--r--doc/groff.html.node/Motion-Quanta.html93
-rw-r--r--doc/groff.html.node/Numeric-Expressions.html395
-rw-r--r--doc/groff.html.node/Obsolete-Command.html74
-rw-r--r--doc/groff.html.node/Operator-Index.html188
-rw-r--r--doc/groff.html.node/Operators-in-Conditionals.html222
-rw-r--r--doc/groff.html.node/Optional-man-extensions.html264
-rw-r--r--doc/groff.html.node/Other-Differences.html248
-rw-r--r--doc/groff.html.node/Output-Device-Intro.html63
-rw-r--r--doc/groff.html.node/Output-Language-Compatibility.html103
-rw-r--r--doc/groff.html.node/Page-Control.html218
-rw-r--r--doc/groff.html.node/Page-Geometry.html140
-rw-r--r--doc/groff.html.node/Page-Layout-Adjustment.html57
-rw-r--r--doc/groff.html.node/Page-Layout.html188
-rw-r--r--doc/groff.html.node/Page-Location-Traps.html326
-rw-r--r--doc/groff.html.node/Page-Motions.html454
-rw-r--r--doc/groff.html.node/Paper-Format.html101
-rw-r--r--doc/groff.html.node/Paragraphs-in-ms.html160
-rw-r--r--doc/groff.html.node/Paragraphs.html109
-rw-r--r--doc/groff.html.node/Parameters.html195
-rw-r--r--doc/groff.html.node/Postprocessor-Access.html144
-rw-r--r--doc/groff.html.node/Predefined-Text.html53
-rw-r--r--doc/groff.html.node/Preprocessor-Intro.html78
-rw-r--r--doc/groff.html.node/Preprocessor-Support.html56
-rw-r--r--doc/groff.html.node/Program-and-File-Index.html239
-rw-r--r--doc/groff.html.node/Punning-Names.html190
-rw-r--r--doc/groff.html.node/Register-Index.html349
-rw-r--r--doc/groff.html.node/Registers.html65
-rw-r--r--doc/groff.html.node/Request-Index.html394
-rw-r--r--doc/groff.html.node/Requests-and-Macros.html221
-rw-r--r--doc/groff.html.node/Safer-Mode.html61
-rw-r--r--doc/groff.html.node/Sections-and-Chapters.html56
-rw-r--r--doc/groff.html.node/Selecting-Fonts.html227
-rw-r--r--doc/groff.html.node/Sentences.html174
-rw-r--r--doc/groff.html.node/Separation.html94
-rw-r--r--doc/groff.html.node/Setting-Registers.html215
-rw-r--r--doc/groff.html.node/Simple-Commands.html207
-rw-r--r--doc/groff.html.node/Special-Fonts.html93
-rw-r--r--doc/groff.html.node/String-Index.html344
-rw-r--r--doc/groff.html.node/Strings.html429
-rw-r--r--doc/groff.html.node/Suppressing-Output.html147
-rw-r--r--doc/groff.html.node/Tab-Stops-in-ms.html67
-rw-r--r--doc/groff.html.node/Table-of-Contents.html71
-rw-r--r--doc/groff.html.node/Tabs-and-Fields.html276
-rw-r--r--doc/groff.html.node/Tabs-and-Leaders.html87
-rw-r--r--doc/groff.html.node/Text-settings-in-ms.html76
-rw-r--r--doc/groff.html.node/Text.html81
-rw-r--r--doc/groff.html.node/The-Implicit-Page-Trap.html74
-rw-r--r--doc/groff.html.node/Traps.html73
-rw-r--r--doc/groff.html.node/Tutorial-for-Macro-Users.html68
-rw-r--r--doc/groff.html.node/Typeface-and-decoration.html212
-rw-r--r--doc/groff.html.node/Typographical-symbols-in-ms.html80
-rw-r--r--doc/groff.html.node/Using-Escape-Sequences.html206
-rw-r--r--doc/groff.html.node/Using-Fonts.html148
-rw-r--r--doc/groff.html.node/Using-Fractional-Type-Sizes.html172
-rw-r--r--doc/groff.html.node/Using-Symbols.html632
-rw-r--r--doc/groff.html.node/Vertical-Position-Traps.html94
-rw-r--r--doc/groff.html.node/Warnings.html246
-rw-r--r--doc/groff.html.node/What-Is-groff_003f.html68
-rw-r--r--doc/groff.html.node/Writing-Macros.html267
-rw-r--r--doc/groff.html.node/als.html33
-rw-r--r--doc/groff.html.node/groff-Capabilities.html91
-rw-r--r--doc/groff.html.node/groff.html_fot.html525
-rw-r--r--doc/groff.html.node/gtroff-Output.html100
-rw-r--r--doc/groff.html.node/if_002delse.html97
-rw-r--r--doc/groff.html.node/if_002dthen.html111
-rw-r--r--doc/groff.html.node/index.html453
-rw-r--r--doc/groff.html.node/man.html71
-rw-r--r--doc/groff.html.node/mdoc.html61
-rw-r--r--doc/groff.html.node/me.html67
-rw-r--r--doc/groff.html.node/mm.html64
-rw-r--r--doc/groff.html.node/mom.html85
-rw-r--r--doc/groff.html.node/ms-Body-Text.html70
-rw-r--r--doc/groff.html.node/ms-Document-Control-Settings.html524
-rw-r--r--doc/groff.html.node/ms-Document-Description-Macros.html189
-rw-r--r--doc/groff.html.node/ms-Document-Structure.html106
-rw-r--r--doc/groff.html.node/ms-Footnotes.html155
-rw-r--r--doc/groff.html.node/ms-Headers-and-Footers.html122
-rw-r--r--doc/groff.html.node/ms-Insertions.html181
-rw-r--r--doc/groff.html.node/ms-Introduction.html60
-rw-r--r--doc/groff.html.node/ms-Legacy-Features.html285
-rw-r--r--doc/groff.html.node/ms-Margins.html56
-rw-r--r--doc/groff.html.node/ms-Multiple-Columns.html88
-rw-r--r--doc/groff.html.node/ms-Naming-Conventions.html89
-rw-r--r--doc/groff.html.node/ms-Page-Layout.html64
-rw-r--r--doc/groff.html.node/ms-TOC.html242
-rw-r--r--doc/groff.html.node/ms-basic-information.html211
-rw-r--r--doc/groff.html.node/ms-keeps-and-displays.html207
-rw-r--r--doc/groff.html.node/ms-language-and-localization.html135
-rw-r--r--doc/groff.html.node/ms.html75
-rw-r--r--doc/groff.html.node/troff-and-nroff-Modes.html114
-rw-r--r--doc/groff.html.node/while.html161
-rw-r--r--doc/groff.info423
-rw-r--r--doc/groff.info-17824
-rw-r--r--doc/groff.info-27529
-rw-r--r--doc/groff.info-3bin0 -> 238373 bytes
-rw-r--r--doc/groff.pdfbin0 -> 1148308 bytes
-rw-r--r--doc/groff.texi18927
-rw-r--r--doc/groff.txt18123
-rw-r--r--doc/me-revisions261
-rw-r--r--doc/meintro.me.in2266
-rw-r--r--doc/meintro_fr.me.in2374
-rw-r--r--doc/meref.me.in2439
-rw-r--r--doc/ms.ms4486
-rw-r--r--doc/pic.ms3287
-rw-r--r--doc/txi-en.tex74
-rw-r--r--doc/webpage.ms2580
-rw-r--r--font/devX100-12/CB215
-rw-r--r--font/devX100-12/CBI215
-rw-r--r--font/devX100-12/CI215
-rw-r--r--font/devX100-12/CR215
-rw-r--r--font/devX100-12/DESC9
-rw-r--r--font/devX100-12/HB215
-rw-r--r--font/devX100-12/HBI215
-rw-r--r--font/devX100-12/HI215
-rw-r--r--font/devX100-12/HR215
-rw-r--r--font/devX100-12/NB215
-rw-r--r--font/devX100-12/NBI215
-rw-r--r--font/devX100-12/NI215
-rw-r--r--font/devX100-12/NR215
-rw-r--r--font/devX100-12/S221
-rw-r--r--font/devX100-12/TB215
-rw-r--r--font/devX100-12/TBI215
-rw-r--r--font/devX100-12/TI215
-rw-r--r--font/devX100-12/TR215
-rw-r--r--font/devX100-12/devX100-12.am65
-rw-r--r--font/devX100/CB215
-rw-r--r--font/devX100/CBI215
-rw-r--r--font/devX100/CI215
-rw-r--r--font/devX100/CR215
-rw-r--r--font/devX100/DESC9
-rw-r--r--font/devX100/HB215
-rw-r--r--font/devX100/HBI215
-rw-r--r--font/devX100/HI215
-rw-r--r--font/devX100/HR215
-rw-r--r--font/devX100/NB215
-rw-r--r--font/devX100/NBI215
-rw-r--r--font/devX100/NI215
-rw-r--r--font/devX100/NR215
-rw-r--r--font/devX100/S221
-rw-r--r--font/devX100/TB215
-rw-r--r--font/devX100/TBI215
-rw-r--r--font/devX100/TI215
-rw-r--r--font/devX100/TR215
-rw-r--r--font/devX100/devX100.am65
-rw-r--r--font/devX75-12/CB215
-rw-r--r--font/devX75-12/CBI215
-rw-r--r--font/devX75-12/CI215
-rw-r--r--font/devX75-12/CR215
-rw-r--r--font/devX75-12/DESC9
-rw-r--r--font/devX75-12/HB215
-rw-r--r--font/devX75-12/HBI215
-rw-r--r--font/devX75-12/HI215
-rw-r--r--font/devX75-12/HR215
-rw-r--r--font/devX75-12/NB215
-rw-r--r--font/devX75-12/NBI215
-rw-r--r--font/devX75-12/NI215
-rw-r--r--font/devX75-12/NR215
-rw-r--r--font/devX75-12/S221
-rw-r--r--font/devX75-12/TB215
-rw-r--r--font/devX75-12/TBI215
-rw-r--r--font/devX75-12/TI215
-rw-r--r--font/devX75-12/TR215
-rw-r--r--font/devX75-12/devX75-12.am65
-rw-r--r--font/devX75/CB215
-rw-r--r--font/devX75/CBI215
-rw-r--r--font/devX75/CI215
-rw-r--r--font/devX75/CR215
-rw-r--r--font/devX75/DESC9
-rw-r--r--font/devX75/HB215
-rw-r--r--font/devX75/HBI215
-rw-r--r--font/devX75/HI215
-rw-r--r--font/devX75/HR215
-rw-r--r--font/devX75/NB215
-rw-r--r--font/devX75/NBI215
-rw-r--r--font/devX75/NI215
-rw-r--r--font/devX75/NR215
-rw-r--r--font/devX75/S221
-rw-r--r--font/devX75/TB215
-rw-r--r--font/devX75/TBI215
-rw-r--r--font/devX75/TI215
-rw-r--r--font/devX75/TR215
-rw-r--r--font/devX75/devX75.am65
-rw-r--r--font/devascii/DESC.proto8
-rw-r--r--font/devascii/R.proto190
-rw-r--r--font/devascii/devascii.am51
-rw-r--r--font/devcp1047/DESC.proto8
-rw-r--r--font/devcp1047/R.proto322
-rw-r--r--font/devcp1047/devcp1047.am49
-rw-r--r--font/devdvi/CW152
-rw-r--r--font/devdvi/CWEC280
-rw-r--r--font/devdvi/CWI151
-rw-r--r--font/devdvi/CWIEC281
-rw-r--r--font/devdvi/CWITC138
-rw-r--r--font/devdvi/CWTC137
-rw-r--r--font/devdvi/DESC.in11
-rw-r--r--font/devdvi/EX144
-rw-r--r--font/devdvi/HB297
-rw-r--r--font/devdvi/HBEC2078
-rw-r--r--font/devdvi/HBI298
-rw-r--r--font/devdvi/HBIEC2079
-rw-r--r--font/devdvi/HBITC138
-rw-r--r--font/devdvi/HBTC137
-rw-r--r--font/devdvi/HI298
-rw-r--r--font/devdvi/HIEC2079
-rw-r--r--font/devdvi/HITC138
-rw-r--r--font/devdvi/HR297
-rw-r--r--font/devdvi/HREC2078
-rw-r--r--font/devdvi/HRTC137
-rw-r--r--font/devdvi/MI137
-rw-r--r--font/devdvi/S150
-rw-r--r--font/devdvi/SA142
-rw-r--r--font/devdvi/SB132
-rw-r--r--font/devdvi/SC137
-rw-r--r--font/devdvi/TB348
-rw-r--r--font/devdvi/TBEC2306
-rw-r--r--font/devdvi/TBI354
-rw-r--r--font/devdvi/TBIEC2765
-rw-r--r--font/devdvi/TBITC138
-rw-r--r--font/devdvi/TBTC137
-rw-r--r--font/devdvi/TI355
-rw-r--r--font/devdvi/TIEC2765
-rw-r--r--font/devdvi/TITC138
-rw-r--r--font/devdvi/TR431
-rw-r--r--font/devdvi/TREC2306
-rw-r--r--font/devdvi/TRTC137
-rw-r--r--font/devdvi/devdvi.am96
-rwxr-xr-xfont/devdvi/generate/CompileFonts15
-rw-r--r--font/devdvi/generate/Makefile211
-rw-r--r--font/devdvi/generate/ec.map255
-rw-r--r--font/devdvi/generate/msam.map127
-rw-r--r--font/devdvi/generate/msbm.map121
-rw-r--r--font/devdvi/generate/tc.map81
-rw-r--r--font/devdvi/generate/texb.map128
-rw-r--r--font/devdvi/generate/texex.map100
-rw-r--r--font/devdvi/generate/texi.map128
-rw-r--r--font/devdvi/generate/texmi.map46
-rw-r--r--font/devdvi/generate/texr.map128
-rw-r--r--font/devdvi/generate/texsy.map127
-rw-r--r--font/devdvi/generate/textex.map34
-rw-r--r--font/devdvi/generate/textt.map128
-rw-r--r--font/devhtml/DESC.proto13
-rw-r--r--font/devhtml/R.in8
-rw-r--r--font/devhtml/R.proto1035
-rw-r--r--font/devhtml/devhtml.am69
-rw-r--r--font/devlatin1/DESC.proto8
-rw-r--r--font/devlatin1/R.proto322
-rw-r--r--font/devlatin1/devlatin1.am49
-rw-r--r--font/devlbp/CB216
-rw-r--r--font/devlbp/CI216
-rw-r--r--font/devlbp/CR216
-rw-r--r--font/devlbp/DESC.in9
-rw-r--r--font/devlbp/EB216
-rw-r--r--font/devlbp/EI216
-rw-r--r--font/devlbp/ER216
-rw-r--r--font/devlbp/HB400
-rw-r--r--font/devlbp/HBI401
-rw-r--r--font/devlbp/HI401
-rw-r--r--font/devlbp/HNB400
-rw-r--r--font/devlbp/HNBI400
-rw-r--r--font/devlbp/HNI400
-rw-r--r--font/devlbp/HNR400
-rw-r--r--font/devlbp/HR400
-rw-r--r--font/devlbp/TB422
-rw-r--r--font/devlbp/TBI402
-rw-r--r--font/devlbp/TI430
-rw-r--r--font/devlbp/TR426
-rw-r--r--font/devlbp/devlbp.am60
-rw-r--r--font/devlj4/AB428
-rw-r--r--font/devlj4/ABI428
-rw-r--r--font/devlj4/AI426
-rw-r--r--font/devlj4/ALBB756
-rw-r--r--font/devlj4/ALBR771
-rw-r--r--font/devlj4/AOB720
-rw-r--r--font/devlj4/AOI782
-rw-r--r--font/devlj4/AOR708
-rw-r--r--font/devlj4/AR430
-rw-r--r--font/devlj4/CB330
-rw-r--r--font/devlj4/CBI331
-rw-r--r--font/devlj4/CI331
-rw-r--r--font/devlj4/CLARENDON331
-rw-r--r--font/devlj4/CORONET332
-rw-r--r--font/devlj4/CR330
-rw-r--r--font/devlj4/DESC.in9
-rw-r--r--font/devlj4/GB718
-rw-r--r--font/devlj4/GBI718
-rw-r--r--font/devlj4/GI653
-rw-r--r--font/devlj4/GR836
-rw-r--r--font/devlj4/LGB330
-rw-r--r--font/devlj4/LGI331
-rw-r--r--font/devlj4/LGR330
-rw-r--r--font/devlj4/MARIGOLD331
-rw-r--r--font/devlj4/OB784
-rw-r--r--font/devlj4/OBI776
-rw-r--r--font/devlj4/OI887
-rw-r--r--font/devlj4/OR863
-rw-r--r--font/devlj4/S319
-rw-r--r--font/devlj4/SYMBOL220
-rw-r--r--font/devlj4/TB953
-rw-r--r--font/devlj4/TBI1006
-rw-r--r--font/devlj4/TI1090
-rw-r--r--font/devlj4/TNRB444
-rw-r--r--font/devlj4/TNRBI433
-rw-r--r--font/devlj4/TNRI450
-rw-r--r--font/devlj4/TNRR436
-rw-r--r--font/devlj4/TR843
-rw-r--r--font/devlj4/UB797
-rw-r--r--font/devlj4/UBI748
-rw-r--r--font/devlj4/UCB758
-rw-r--r--font/devlj4/UCBI666
-rw-r--r--font/devlj4/UCI806
-rw-r--r--font/devlj4/UCR727
-rw-r--r--font/devlj4/UI950
-rw-r--r--font/devlj4/UR848
-rw-r--r--font/devlj4/WINGDINGS230
-rw-r--r--font/devlj4/devlj4.am111
-rw-r--r--font/devlj4/generate/Makefile274
-rw-r--r--font/devlj4/generate/special.awk80
-rw-r--r--font/devlj4/generate/special.map271
-rw-r--r--font/devlj4/generate/symbol.map199
-rw-r--r--font/devlj4/generate/text.map845
-rw-r--r--font/devlj4/generate/wingdings.map233
-rw-r--r--font/devpdf/DESC.in11
-rw-r--r--font/devpdf/Foundry.in121
-rw-r--r--font/devpdf/devpdf.am210
-rwxr-xr-xfont/devpdf/tests/check-default-foundry.sh.in99
-rwxr-xr-xfont/devpdf/tests/check-urw-foundry.sh.in86
-rw-r--r--font/devpdf/util/BuildFoundries.pl578
-rw-r--r--font/devps/AB700
-rw-r--r--font/devps/ABI701
-rw-r--r--font/devps/AI688
-rw-r--r--font/devps/AR687
-rw-r--r--font/devps/BMB696
-rw-r--r--font/devps/BMBI697
-rw-r--r--font/devps/BMI648
-rw-r--r--font/devps/BMR670
-rw-r--r--font/devps/CB266
-rw-r--r--font/devps/CBI267
-rw-r--r--font/devps/CI267
-rw-r--r--font/devps/CR266
-rw-r--r--font/devps/DESC.in11
-rw-r--r--font/devps/EURO33
-rw-r--r--font/devps/HB1513
-rw-r--r--font/devps/HBI1514
-rw-r--r--font/devps/HI1645
-rw-r--r--font/devps/HNB1513
-rw-r--r--font/devps/HNBI1514
-rw-r--r--font/devps/HNI1645
-rw-r--r--font/devps/HNR1644
-rw-r--r--font/devps/HR1644
-rw-r--r--font/devps/NB964
-rw-r--r--font/devps/NBI1614
-rw-r--r--font/devps/NI1222
-rw-r--r--font/devps/NR1175
-rw-r--r--font/devps/PB728
-rw-r--r--font/devps/PBI754
-rw-r--r--font/devps/PI753
-rw-r--r--font/devps/PR767
-rw-r--r--font/devps/S244
-rw-r--r--font/devps/SS210
-rw-r--r--font/devps/TB573
-rw-r--r--font/devps/TBI548
-rw-r--r--font/devps/TI561
-rw-r--r--font/devps/TR554
-rw-r--r--font/devps/ZCMI910
-rw-r--r--font/devps/ZD222
-rw-r--r--font/devps/ZDR222
-rw-r--r--font/devps/devps.am193
-rw-r--r--font/devps/download6
-rw-r--r--font/devps/freeeuro.afm34
-rw-r--r--font/devps/freeeuro.ps321
-rw-r--r--font/devps/generate/Makefile314
-rwxr-xr-xfont/devps/generate/afmname44
-rw-r--r--font/devps/generate/dingbats-reversed.map4
-rw-r--r--font/devps/generate/dingbats.map5
-rw-r--r--font/devps/generate/freeeuro.sfd623
-rwxr-xr-xfont/devps/generate/make-zapfdr89
-rw-r--r--font/devps/generate/sfdtopfa.pe9
-rw-r--r--font/devps/generate/slanted-symbol.map31
-rw-r--r--font/devps/generate/symbol.map449
-rw-r--r--font/devps/generate/symbol.sed32
-rw-r--r--font/devps/generate/symbolchars13
-rw-r--r--font/devps/generate/symbolsl.awk19
-rw-r--r--font/devps/generate/text.map434
-rw-r--r--font/devps/generate/zapfdr.sed2
-rw-r--r--font/devps/old/CB281
-rw-r--r--font/devps/old/CBI282
-rw-r--r--font/devps/old/CI282
-rw-r--r--font/devps/old/CR281
-rw-r--r--font/devps/old/HB481
-rw-r--r--font/devps/old/HBI482
-rw-r--r--font/devps/old/HI521
-rw-r--r--font/devps/old/HNB481
-rw-r--r--font/devps/old/HNBI482
-rw-r--r--font/devps/old/HNI521
-rw-r--r--font/devps/old/HNR520
-rw-r--r--font/devps/old/HR520
-rw-r--r--font/devps/old/NB392
-rw-r--r--font/devps/old/NBI510
-rw-r--r--font/devps/old/NI453
-rw-r--r--font/devps/old/NR440
-rw-r--r--font/devps/old/PB370
-rw-r--r--font/devps/old/PBI376
-rw-r--r--font/devps/old/PI375
-rw-r--r--font/devps/old/PR377
-rw-r--r--font/devps/old/S229
-rw-r--r--font/devps/old/SS194
-rw-r--r--font/devps/old/TB460
-rw-r--r--font/devps/old/TBI443
-rw-r--r--font/devps/old/TI456
-rw-r--r--font/devps/old/TR448
-rw-r--r--font/devps/old/symbol.afm212
-rw-r--r--font/devps/old/symbolsl.afm203
-rw-r--r--font/devps/old/zapfdr.afm222
-rw-r--r--font/devps/old/zapfdr.ps225
-rw-r--r--font/devps/prologue.ps261
-rw-r--r--font/devps/psstrip.sed6
-rw-r--r--font/devps/symbol.afm215
-rw-r--r--font/devps/symbolsl.afm225
-rw-r--r--font/devps/symbolsl.ps42
-rw-r--r--font/devps/text.enc236
-rw-r--r--font/devps/zapfdr.afm224
-rw-r--r--font/devps/zapfdr.ps225
-rw-r--r--font/devutf8/DESC.proto9
-rw-r--r--font/devutf8/NOTES47
-rw-r--r--font/devutf8/R.in4
-rw-r--r--font/devutf8/R.proto1029
-rw-r--r--font/devutf8/devutf8.am59
-rwxr-xr-xfont/scripts/gendesc.sh18
-rwxr-xr-xfont/scripts/genfonts.sh23
-rw-r--r--font/scripts/scripts.am27
-rwxr-xr-xfont/util/make-Rproto47
-rw-r--r--gendef.sh52
-rw-r--r--gnulib_m4/00gnulib.m485
-rw-r--r--gnulib_m4/absolute-header.m4100
-rw-r--r--gnulib_m4/alloca.m4106
-rw-r--r--gnulib_m4/assert_h.m467
-rw-r--r--gnulib_m4/errno_h.m4131
-rw-r--r--gnulib_m4/exponentd.m4116
-rw-r--r--gnulib_m4/exponentf.m492
-rw-r--r--gnulib_m4/exponentl.m4112
-rw-r--r--gnulib_m4/extensions.m4232
-rw-r--r--gnulib_m4/extern-inline.m4130
-rw-r--r--gnulib_m4/float_h.m4106
-rw-r--r--gnulib_m4/fpieee.m454
-rw-r--r--gnulib_m4/fprintf-posix.m4110
-rw-r--r--gnulib_m4/free.m452
-rw-r--r--gnulib_m4/frexp.m4181
-rw-r--r--gnulib_m4/frexpl.m4233
-rw-r--r--gnulib_m4/fseterr.m413
-rw-r--r--gnulib_m4/gnulib-cache.m474
-rw-r--r--gnulib_m4/gnulib-common.m41243
-rw-r--r--gnulib_m4/gnulib-comp.m4616
-rw-r--r--gnulib_m4/include_next.m4224
-rw-r--r--gnulib_m4/intmax_t.m459
-rw-r--r--gnulib_m4/inttypes.m4184
-rw-r--r--gnulib_m4/inttypes_h.m429
-rw-r--r--gnulib_m4/isnand.m496
-rw-r--r--gnulib_m4/isnanf.m4197
-rw-r--r--gnulib_m4/isnanl.m4248
-rw-r--r--gnulib_m4/ldexpl.m4135
-rw-r--r--gnulib_m4/libunistring-base.m4145
-rw-r--r--gnulib_m4/limits-h.m441
-rw-r--r--gnulib_m4/math_h.m4391
-rw-r--r--gnulib_m4/memchr.m4106
-rw-r--r--gnulib_m4/mmap-anon.m455
-rw-r--r--gnulib_m4/multiarch.m465
-rw-r--r--gnulib_m4/nocrash.m4131
-rw-r--r--gnulib_m4/off_t.m418
-rw-r--r--gnulib_m4/printf-frexp.m438
-rw-r--r--gnulib_m4/printf-frexpl.m448
-rw-r--r--gnulib_m4/printf.m41728
-rw-r--r--gnulib_m4/signbit.m4393
-rw-r--r--gnulib_m4/size_max.m475
-rw-r--r--gnulib_m4/snprintf.m462
-rw-r--r--gnulib_m4/ssize_t.m423
-rw-r--r--gnulib_m4/stdbool.m4118
-rw-r--r--gnulib_m4/stddef_h.m4104
-rw-r--r--gnulib_m4/stdint.m4531
-rw-r--r--gnulib_m4/stdint_h.m427
-rw-r--r--gnulib_m4/stdio_h.m4237
-rw-r--r--gnulib_m4/stdlib_h.m4209
-rw-r--r--gnulib_m4/string_h.m4150
-rw-r--r--gnulib_m4/sys_types_h.m470
-rw-r--r--gnulib_m4/unistd_h.m4275
-rw-r--r--gnulib_m4/vasnprintf.m4298
-rw-r--r--gnulib_m4/vsnprintf.m462
-rw-r--r--gnulib_m4/warn-on-use.m462
-rw-r--r--gnulib_m4/wchar_h.m4258
-rw-r--r--gnulib_m4/wchar_t.m424
-rw-r--r--gnulib_m4/wctype_h.m4200
-rw-r--r--gnulib_m4/wcwidth.m4115
-rw-r--r--gnulib_m4/wint_t.m457
-rw-r--r--gnulib_m4/xsize.m412
-rw-r--r--gnulib_m4/zzgnulib.m423
-rw-r--r--lib/_Noreturn.h50
-rw-r--r--lib/alloca.in.h72
-rw-r--r--lib/arg-nonnull.h26
-rw-r--r--lib/asnprintf.c34
-rw-r--r--lib/assert.in.h27
-rw-r--r--lib/attribute.h226
-rw-r--r--lib/c++defs.h331
-rw-r--r--lib/errno.in.h279
-rw-r--r--lib/float+.h147
-rw-r--r--lib/float.c33
-rw-r--r--lib/float.in.h194
-rw-r--r--lib/fprintf.c73
-rw-r--r--lib/fpucw.h108
-rw-r--r--lib/free.c53
-rw-r--r--lib/frexp.c168
-rw-r--r--lib/frexpl.c35
-rw-r--r--lib/fseterr.c84
-rw-r--r--lib/fseterr.h45
-rw-r--r--lib/gnulib.mk1823
-rw-r--r--lib/inttypes.in.h1028
-rw-r--r--lib/isnan.c190
-rw-r--r--lib/isnand-nolibm.h33
-rw-r--r--lib/isnand.c19
-rw-r--r--lib/isnanf-nolibm.h41
-rw-r--r--lib/isnanf.c20
-rw-r--r--lib/isnanl-nolibm.h34
-rw-r--r--lib/isnanl.c20
-rw-r--r--lib/itold.c28
-rw-r--r--lib/limits.in.h131
-rw-r--r--lib/localcharset.c1159
-rw-r--r--lib/localcharset.h137
-rw-r--r--lib/math.c22
-rw-r--r--lib/math.in.h2735
-rw-r--r--lib/memchr.c172
-rw-r--r--lib/memchr.valgrind30
-rw-r--r--lib/printf-args.c183
-rw-r--r--lib/printf-args.h150
-rw-r--r--lib/printf-frexp.c190
-rw-r--r--lib/printf-frexp.h23
-rw-r--r--lib/printf-frexpl.c37
-rw-r--r--lib/printf-frexpl.h23
-rw-r--r--lib/printf-parse.c623
-rw-r--r--lib/printf-parse.h193
-rw-r--r--lib/signbitd.c64
-rw-r--r--lib/signbitf.c64
-rw-r--r--lib/signbitl.c64
-rw-r--r--lib/size_max.h30
-rw-r--r--lib/snprintf.c71
-rw-r--r--lib/stdbool.in.h126
-rw-r--r--lib/stddef.in.h147
-rw-r--r--lib/stdint.in.h740
-rw-r--r--lib/stdio-impl.h218
-rw-r--r--lib/stdio-read.c168
-rw-r--r--lib/stdio-write.c206
-rw-r--r--lib/stdio.in.h1723
-rw-r--r--lib/stdlib.in.h1678
-rw-r--r--lib/streq.h176
-rw-r--r--lib/string.in.h1355
-rw-r--r--lib/sys_types.in.h106
-rw-r--r--lib/unictype/bitmap.h48
-rw-r--r--lib/unistd.c22
-rw-r--r--lib/unistd.in.h2393
-rw-r--r--lib/unitypes.in.h61
-rw-r--r--lib/uniwidth.in.h72
-rw-r--r--lib/uniwidth/cjk.h37
-rw-r--r--lib/uniwidth/width.c95
-rw-r--r--lib/uniwidth/width0.h494
-rw-r--r--lib/uniwidth/width2.h549
-rw-r--r--lib/vasnprintf.c5741
-rw-r--r--lib/vasnprintf.h72
-rw-r--r--lib/verify.h365
-rw-r--r--lib/vsnprintf.c70
-rw-r--r--lib/warn-on-use.h149
-rw-r--r--lib/wchar.in.h1378
-rw-r--r--lib/wctype-h.c23
-rw-r--r--lib/wctype.in.h732
-rw-r--r--lib/wcwidth.c73
-rw-r--r--lib/xsize.c21
-rw-r--r--lib/xsize.h108
-rw-r--r--m4/ax_compare_version.m4177
-rw-r--r--m4/ax_prog_perl_version.m470
-rw-r--r--m4/codeset.m423
-rw-r--r--m4/fcntl-o.m4134
-rw-r--r--m4/glibc21.m433
-rw-r--r--m4/groff.m41886
-rw-r--r--m4/iconv.m4271
-rw-r--r--m4/lib-ld.m4119
-rw-r--r--m4/lib-link.m4777
-rw-r--r--m4/lib-prefix.m4224
-rw-r--r--m4/localcharset.m417
-rw-r--r--makevarescape.sed9
-rw-r--r--man/groff.7.man8055
-rw-r--r--man/groff_char.7.man2282
-rw-r--r--man/groff_diff.7.man6188
-rw-r--r--man/groff_font.5.man1114
-rw-r--r--man/groff_out.5.man1963
-rw-r--r--man/groff_tmac.5.man1474
-rw-r--r--man/man.am46
-rw-r--r--man/roff.7.man2613
-rwxr-xr-xmdate.pl32
-rw-r--r--src/devices/grodvi/dvi.cpp988
-rw-r--r--src/devices/grodvi/grodvi.1.man633
-rw-r--r--src/devices/grodvi/grodvi.am32
-rw-r--r--src/devices/grohtml/grohtml.1.man731
-rw-r--r--src/devices/grohtml/grohtml.am40
-rw-r--r--src/devices/grohtml/html-table.cpp848
-rw-r--r--src/devices/grohtml/html-table.h133
-rw-r--r--src/devices/grohtml/html-text.cpp1056
-rw-r--r--src/devices/grohtml/html-text.h138
-rw-r--r--src/devices/grohtml/html.h97
-rw-r--r--src/devices/grohtml/output.cpp363
-rw-r--r--src/devices/grohtml/post-html.cpp5684
-rw-r--r--src/devices/grolbp/charset.h89
-rw-r--r--src/devices/grolbp/grolbp.1.man504
-rw-r--r--src/devices/grolbp/grolbp.am36
-rw-r--r--src/devices/grolbp/lbp.cpp738
-rw-r--r--src/devices/grolbp/lbp.h544
-rw-r--r--src/devices/grolj4/grolj4.1.man896
-rw-r--r--src/devices/grolj4/grolj4.am32
-rw-r--r--src/devices/grolj4/lj4.cpp715
-rw-r--r--src/devices/gropdf/TODO31
-rw-r--r--src/devices/gropdf/gropdf.1.man1845
-rw-r--r--src/devices/gropdf/gropdf.am58
-rw-r--r--src/devices/gropdf/gropdf.pl3928
-rw-r--r--src/devices/gropdf/pdfmom.1.man229
-rw-r--r--src/devices/gropdf/pdfmom.pl150
-rw-r--r--src/devices/grops/TODO24
-rw-r--r--src/devices/grops/grops.1.man1831
-rw-r--r--src/devices/grops/grops.am38
-rw-r--r--src/devices/grops/ps.cpp1894
-rw-r--r--src/devices/grops/ps.h129
-rw-r--r--src/devices/grops/psfig.diff106
-rw-r--r--src/devices/grops/psrm.cpp1189
-rw-r--r--src/devices/grotty/TODO3
-rw-r--r--src/devices/grotty/grotty.1.man810
-rw-r--r--src/devices/grotty/grotty.am39
-rwxr-xr-xsrc/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh205
-rwxr-xr-xsrc/devices/grotty/tests/osc8_works.sh119
-rw-r--r--src/devices/grotty/tty.cpp1043
-rw-r--r--src/devices/xditview/ChangeLog556
-rw-r--r--src/devices/xditview/DESC.in9
-rw-r--r--src/devices/xditview/Dvi.c603
-rw-r--r--src/devices/xditview/Dvi.h46
-rw-r--r--src/devices/xditview/DviP.h235
-rw-r--r--src/devices/xditview/FontMap-X1117
-rw-r--r--src/devices/xditview/GXditview-color.ad15
-rw-r--r--src/devices/xditview/GXditview.ad71
-rw-r--r--src/devices/xditview/Menu.h46
-rw-r--r--src/devices/xditview/README13
-rw-r--r--src/devices/xditview/TODO21
-rw-r--r--src/devices/xditview/ad2c64
-rw-r--r--src/devices/xditview/device.c565
-rw-r--r--src/devices/xditview/device.h21
-rw-r--r--src/devices/xditview/draw.c709
-rw-r--r--src/devices/xditview/draw.h18
-rw-r--r--src/devices/xditview/font.c446
-rw-r--r--src/devices/xditview/font.h6
-rw-r--r--src/devices/xditview/gray1.bm4
-rw-r--r--src/devices/xditview/gray2.bm4
-rw-r--r--src/devices/xditview/gray3.bm4
-rw-r--r--src/devices/xditview/gray4.bm4
-rw-r--r--src/devices/xditview/gray5.bm4
-rw-r--r--src/devices/xditview/gray6.bm4
-rw-r--r--src/devices/xditview/gray7.bm4
-rw-r--r--src/devices/xditview/gray8.bm4
-rw-r--r--src/devices/xditview/gxditview.1.man815
-rw-r--r--src/devices/xditview/lex.c100
-rw-r--r--src/devices/xditview/lex.h1
-rw-r--r--src/devices/xditview/page.c86
-rw-r--r--src/devices/xditview/page.h5
-rw-r--r--src/devices/xditview/parse.c343
-rw-r--r--src/devices/xditview/parse.h1
-rw-r--r--src/devices/xditview/xdit.bm14
-rw-r--r--src/devices/xditview/xdit_mask.bm14
-rw-r--r--src/devices/xditview/xditview.am130
-rw-r--r--src/devices/xditview/xditview.c684
-rw-r--r--src/include/DviChar.h55
-rw-r--r--src/include/XFontName.h50
-rw-r--r--src/include/cmap.h55
-rw-r--r--src/include/color.h88
-rw-r--r--src/include/config.hin1584
-rw-r--r--src/include/cset.h74
-rw-r--r--src/include/curtime.h27
-rw-r--r--src/include/device.h25
-rw-r--r--src/include/driver.h38
-rw-r--r--src/include/errarg.h46
-rw-r--r--src/include/error.h69
-rw-r--r--src/include/font.h343
-rw-r--r--src/include/geometry.h26
-rw-r--r--src/include/getopt.h226
-rw-r--r--src/include/getopt_int.h130
-rw-r--r--src/include/gettext.h22
-rw-r--r--src/include/html-strings.h26
-rw-r--r--src/include/htmlhint.h36
-rw-r--r--src/include/include.am47
-rw-r--r--src/include/index.h41
-rw-r--r--src/include/itable.h193
-rw-r--r--src/include/lf.h21
-rw-r--r--src/include/lib.h161
-rw-r--r--src/include/localcharset.h40
-rw-r--r--src/include/macropath.h22
-rw-r--r--src/include/nonposix.h230
-rw-r--r--src/include/paper.h36
-rw-r--r--src/include/posix.h66
-rw-r--r--src/include/printer.h97
-rw-r--r--src/include/ptable.h233
-rw-r--r--src/include/refid.h34
-rw-r--r--src/include/relocate.h37
-rw-r--r--src/include/search.h100
-rw-r--r--src/include/searchpath.h30
-rw-r--r--src/include/stringclass.h194
-rw-r--r--src/include/symbol.h88
-rw-r--r--src/include/unicode.h63
-rw-r--r--src/libs/libbib/common.cpp37
-rw-r--r--src/libs/libbib/index.cpp688
-rw-r--r--src/libs/libbib/libbib.am35
-rw-r--r--src/libs/libbib/linear.cpp506
-rw-r--r--src/libs/libbib/map.c86
-rw-r--r--src/libs/libbib/search.cpp136
-rw-r--r--src/libs/libdriver/input.cpp1841
-rw-r--r--src/libs/libdriver/libdriver.am31
-rw-r--r--src/libs/libdriver/printer.cpp268
-rw-r--r--src/libs/libgroff/assert.cpp38
-rw-r--r--src/libs/libgroff/change_lf.cpp37
-rw-r--r--src/libs/libgroff/cmap.cpp56
-rw-r--r--src/libs/libgroff/color.cpp404
-rwxr-xr-xsrc/libs/libgroff/config.charset684
-rw-r--r--src/libs/libgroff/cset.cpp104
-rw-r--r--src/libs/libgroff/curtime.cpp55
-rw-r--r--src/libs/libgroff/device.cpp39
-rw-r--r--src/libs/libgroff/errarg.cpp136
-rw-r--r--src/libs/libgroff/error.cpp185
-rw-r--r--src/libs/libgroff/fatal.cpp30
-rw-r--r--src/libs/libgroff/filename.cpp31
-rw-r--r--src/libs/libgroff/fmod.c27
-rw-r--r--src/libs/libgroff/font.cpp1321
-rw-r--r--src/libs/libgroff/fontfile.cpp80
-rw-r--r--src/libs/libgroff/geometry.cpp180
-rw-r--r--src/libs/libgroff/getcwd.c54
-rw-r--r--src/libs/libgroff/getopt.c1241
-rw-r--r--src/libs/libgroff/getopt1.c172
-rw-r--r--src/libs/libgroff/glyphuni.cpp523
-rw-r--r--src/libs/libgroff/htmlhint.cpp60
-rw-r--r--src/libs/libgroff/hypot.cpp34
-rw-r--r--src/libs/libgroff/iftoa.c76
-rw-r--r--src/libs/libgroff/invalid.cpp59
-rw-r--r--src/libs/libgroff/itoa.c67
-rw-r--r--src/libs/libgroff/lf.cpp78
-rw-r--r--src/libs/libgroff/libgroff.am182
-rw-r--r--src/libs/libgroff/lineno.cpp20
-rw-r--r--src/libs/libgroff/localcharset.c579
-rw-r--r--src/libs/libgroff/macropath.cpp29
-rwxr-xr-xsrc/libs/libgroff/make-uniuni162
-rw-r--r--src/libs/libgroff/matherr.c48
-rw-r--r--src/libs/libgroff/maxfilename.cpp75
-rw-r--r--src/libs/libgroff/maxpathname.cpp70
-rw-r--r--src/libs/libgroff/mksdir.cpp33
-rw-r--r--src/libs/libgroff/mkstemp.cpp33
-rw-r--r--src/libs/libgroff/nametoindex.cpp167
-rw-r--r--src/libs/libgroff/new.cpp75
-rw-r--r--src/libs/libgroff/paper.cpp82
-rw-r--r--src/libs/libgroff/prime.cpp55
-rw-r--r--src/libs/libgroff/progname.c18
-rw-r--r--src/libs/libgroff/ptable.cpp57
-rw-r--r--src/libs/libgroff/putenv.c97
-rw-r--r--src/libs/libgroff/quotearg.c213
-rw-r--r--src/libs/libgroff/ref-add.sin29
-rw-r--r--src/libs/libgroff/ref-del.sin24
-rw-r--r--src/libs/libgroff/relocatable.h19
-rw-r--r--src/libs/libgroff/relocate.cpp244
-rw-r--r--src/libs/libgroff/searchpath.cpp215
-rw-r--r--src/libs/libgroff/spawnvp.c120
-rw-r--r--src/libs/libgroff/strcasecmp.c65
-rw-r--r--src/libs/libgroff/strerror.c46
-rw-r--r--src/libs/libgroff/string.cpp354
-rw-r--r--src/libs/libgroff/strncasecmp.c19
-rw-r--r--src/libs/libgroff/strsave.cpp40
-rw-r--r--src/libs/libgroff/strtol.c131
-rw-r--r--src/libs/libgroff/symbol.cpp157
-rw-r--r--src/libs/libgroff/tmpfile.cpp188
-rw-r--r--src/libs/libgroff/tmpname.cpp117
-rw-r--r--src/libs/libgroff/unicode.cpp65
-rw-r--r--src/libs/libgroff/uniglyph.cpp497
-rw-r--r--src/libs/libgroff/uniuni.cpp2128
-rw-r--r--src/libs/libxutil/DviChar.c679
-rw-r--r--src/libs/libxutil/XFontName.c260
-rw-r--r--src/libs/libxutil/libxutil.am35
-rw-r--r--src/libs/libxutil/xmalloc.c28
-rw-r--r--src/preproc/eqn/TODO49
-rw-r--r--src/preproc/eqn/box.cpp651
-rw-r--r--src/preproc/eqn/box.h278
-rw-r--r--src/preproc/eqn/delim.cpp418
-rw-r--r--src/preproc/eqn/eqn.1.man2240
-rw-r--r--src/preproc/eqn/eqn.am79
-rw-r--r--src/preproc/eqn/eqn.cpp2112
-rw-r--r--src/preproc/eqn/eqn.h57
-rw-r--r--src/preproc/eqn/eqn.hpp210
-rw-r--r--src/preproc/eqn/eqn.ypp333
-rw-r--r--src/preproc/eqn/lex.cpp1236
-rw-r--r--src/preproc/eqn/limit.cpp217
-rw-r--r--src/preproc/eqn/list.cpp241
-rw-r--r--src/preproc/eqn/main.cpp485
-rw-r--r--src/preproc/eqn/mark.cpp120
-rw-r--r--src/preproc/eqn/neqn.1.man92
-rw-r--r--src/preproc/eqn/neqn.sh26
-rw-r--r--src/preproc/eqn/other.cpp706
-rw-r--r--src/preproc/eqn/over.cpp204
-rw-r--r--src/preproc/eqn/pbox.h140
-rw-r--r--src/preproc/eqn/pile.cpp354
-rw-r--r--src/preproc/eqn/script.cpp250
-rw-r--r--src/preproc/eqn/special.cpp117
-rw-r--r--src/preproc/eqn/sqrt.cpp186
-rwxr-xr-xsrc/preproc/eqn/tests/diagnostics-report-correct-line-numbers.sh55
-rw-r--r--src/preproc/eqn/text.cpp957
-rw-r--r--src/preproc/grn/README68
-rw-r--r--src/preproc/grn/gprint.h90
-rw-r--r--src/preproc/grn/grn.1.man978
-rw-r--r--src/preproc/grn/grn.am35
-rw-r--r--src/preproc/grn/hdb.cpp441
-rw-r--r--src/preproc/grn/hgraph.cpp1060
-rw-r--r--src/preproc/grn/hpoint.cpp59
-rw-r--r--src/preproc/grn/main.cpp977
-rw-r--r--src/preproc/html/html.am32
-rw-r--r--src/preproc/html/pre-html.cpp1819
-rw-r--r--src/preproc/html/pre-html.h38
-rw-r--r--src/preproc/html/pushback.cpp336
-rw-r--r--src/preproc/html/pushback.h52
-rw-r--r--src/preproc/pic/TODO35
-rw-r--r--src/preproc/pic/common.cpp647
-rw-r--r--src/preproc/pic/common.h79
-rw-r--r--src/preproc/pic/lex.cpp2039
-rw-r--r--src/preproc/pic/main.cpp664
-rw-r--r--src/preproc/pic/object.cpp2079
-rw-r--r--src/preproc/pic/object.h227
-rw-r--r--src/preproc/pic/output.h82
-rw-r--r--src/preproc/pic/pic.1.man1569
-rw-r--r--src/preproc/pic/pic.am56
-rw-r--r--src/preproc/pic/pic.cpp5080
-rw-r--r--src/preproc/pic/pic.h122
-rw-r--r--src/preproc/pic/pic.hpp348
-rw-r--r--src/preproc/pic/pic.ypp1957
-rw-r--r--src/preproc/pic/position.h46
-rw-r--r--src/preproc/pic/tex.cpp458
-rw-r--r--src/preproc/pic/text.h46
-rw-r--r--src/preproc/pic/troff.cpp579
-rw-r--r--src/preproc/preconv/preconv.1.man559
-rw-r--r--src/preproc/preconv/preconv.am37
-rw-r--r--src/preproc/preconv/preconv.cpp1318
-rwxr-xr-xsrc/preproc/preconv/tests/do-not-seek-the-unseekable.sh59
-rwxr-xr-xsrc/preproc/preconv/tests/smoke-test.sh88
-rw-r--r--src/preproc/refer/TODO124
-rw-r--r--src/preproc/refer/command.cpp814
-rw-r--r--src/preproc/refer/command.h35
-rw-r--r--src/preproc/refer/label.cpp2607
-rw-r--r--src/preproc/refer/label.hpp98
-rw-r--r--src/preproc/refer/label.ypp1195
-rw-r--r--src/preproc/refer/ref.cpp1161
-rw-r--r--src/preproc/refer/ref.h127
-rw-r--r--src/preproc/refer/refer.1.man2020
-rw-r--r--src/preproc/refer/refer.am61
-rw-r--r--src/preproc/refer/refer.cpp1267
-rw-r--r--src/preproc/refer/refer.h81
-rw-r--r--src/preproc/refer/tests/artifacts/62124.bib4
-rwxr-xr-xsrc/preproc/refer/tests/report-correct-line-numbers.sh136
-rw-r--r--src/preproc/refer/token.cpp377
-rw-r--r--src/preproc/refer/token.h87
-rw-r--r--src/preproc/soelim/TODO1
-rw-r--r--src/preproc/soelim/soelim.1.man456
-rw-r--r--src/preproc/soelim/soelim.am31
-rw-r--r--src/preproc/soelim/soelim.cpp315
-rw-r--r--src/preproc/tbl/main.cpp1692
-rw-r--r--src/preproc/tbl/table.cpp3161
-rw-r--r--src/preproc/tbl/table.h179
-rw-r--r--src/preproc/tbl/tbl.1.man2018
-rw-r--r--src/preproc/tbl/tbl.am54
-rwxr-xr-xsrc/preproc/tbl/tests/boxes-and-vertical-rules.sh174
-rwxr-xr-xsrc/preproc/tbl/tests/check-horizontal-line-length.sh78
-rwxr-xr-xsrc/preproc/tbl/tests/check-line-intersections.sh52
-rwxr-xr-xsrc/preproc/tbl/tests/check-vertical-line-length.sh49
-rwxr-xr-xsrc/preproc/tbl/tests/cooperate-with-nm-request.sh47
-rwxr-xr-xsrc/preproc/tbl/tests/count-continued-input-lines.sh43
-rwxr-xr-xsrc/preproc/tbl/tests/do-not-overdraw-page-top-in-nroff-mode.sh225
-rwxr-xr-xsrc/preproc/tbl/tests/do-not-overlap-bottom-border-in-nroff.sh62
-rwxr-xr-xsrc/preproc/tbl/tests/do-not-segv-on-invalid-vertical-span-entry.sh41
-rwxr-xr-xsrc/preproc/tbl/tests/do-not-segv-when-backslash-R-in-text-block.sh75
-rwxr-xr-xsrc/preproc/tbl/tests/expand-region-option-works.sh173
-rwxr-xr-xsrc/preproc/tbl/tests/format-time-diagnostics-work.sh268
-rwxr-xr-xsrc/preproc/tbl/tests/save-and-restore-hyphenation-parameters.sh58
-rwxr-xr-xsrc/preproc/tbl/tests/save-and-restore-inter-sentence-space.sh79
-rwxr-xr-xsrc/preproc/tbl/tests/save-and-restore-line-numbering.sh85
-rwxr-xr-xsrc/preproc/tbl/tests/save-and-restore-tab-stops.sh84
-rwxr-xr-xsrc/preproc/tbl/tests/warn-on-long-boxed-unkept-table.sh56
-rwxr-xr-xsrc/preproc/tbl/tests/x-column-modifier-works.sh172
-rw-r--r--src/roff/groff/groff.1.man2403
-rw-r--r--src/roff/groff/groff.am87
-rw-r--r--src/roff/groff/groff.cpp866
-rw-r--r--src/roff/groff/pipeline.c589
-rw-r--r--src/roff/groff/pipeline.h30
-rwxr-xr-xsrc/roff/groff/tests/ab_works.sh46
-rwxr-xr-xsrc/roff/groff/tests/adjustment_works.sh92
-rw-r--r--src/roff/groff/tests/artifacts/HONEYPOT15
-rw-r--r--src/roff/groff/tests/artifacts/devascii/README1
-rwxr-xr-xsrc/roff/groff/tests/break_zero-length_output_line_sanely.sh43
-rwxr-xr-xsrc/roff/groff/tests/device_control_escapes_express_basic_latin.sh60
-rwxr-xr-xsrc/roff/groff/tests/do_not_loop_infinitely_when_breaking_cjk.sh29
-rwxr-xr-xsrc/roff/groff/tests/dot-cp_register_works.sh48
-rwxr-xr-xsrc/roff/groff/tests/dot-nm_register_works.sh40
-rwxr-xr-xsrc/roff/groff/tests/dot-nn_register_works.sh77
-rwxr-xr-xsrc/roff/groff/tests/evc_produces_no_output_if_invalid.sh25
-rwxr-xr-xsrc/roff/groff/tests/fp_should_not_traverse_directories.sh63
-rwxr-xr-xsrc/roff/groff/tests/handle_special_input_code_points.sh47
-rwxr-xr-xsrc/roff/groff/tests/html_works_with_grn_and_eqn.sh46
-rwxr-xr-xsrc/roff/groff/tests/initialization_is_quiet.sh59
-rwxr-xr-xsrc/roff/groff/tests/localization_works.sh61
-rwxr-xr-xsrc/roff/groff/tests/msoquiet_works.sh35
-rwxr-xr-xsrc/roff/groff/tests/on_latin1_device_oq_is_0x27.sh30
-rwxr-xr-xsrc/roff/groff/tests/output_driver_C_and_G_options_work.sh50
-rwxr-xr-xsrc/roff/groff/tests/recognize_end_of_sentence.sh33
-rwxr-xr-xsrc/roff/groff/tests/regression_savannah_56555.sh27
-rwxr-xr-xsrc/roff/groff/tests/regression_savannah_58153.sh34
-rwxr-xr-xsrc/roff/groff/tests/regression_savannah_58162.sh26
-rwxr-xr-xsrc/roff/groff/tests/regression_savannah_58337.sh32
-rwxr-xr-xsrc/roff/groff/tests/regression_savannah_59202.sh29
-rwxr-xr-xsrc/roff/groff/tests/smoke-test_html_device.sh90
-rwxr-xr-xsrc/roff/groff/tests/some_escapes_accept_newline_delimiters.sh128
-rwxr-xr-xsrc/roff/groff/tests/soquiet_works.sh34
-rwxr-xr-xsrc/roff/groff/tests/string_case_xform_errors.sh30
-rwxr-xr-xsrc/roff/groff/tests/string_case_xform_requests.sh32
-rwxr-xr-xsrc/roff/groff/tests/string_case_xform_unicode_escape.sh42
-rwxr-xr-xsrc/roff/groff/tests/substring_works.sh120
-rwxr-xr-xsrc/roff/groff/tests/use_point_size_escape_with_single_digit_arg.sh44
-rw-r--r--src/roff/nroff/nroff.1.man358
-rw-r--r--src/roff/nroff/nroff.am44
-rw-r--r--src/roff/nroff/nroff.sh204
-rwxr-xr-xsrc/roff/nroff/tests/verbose_option_works.sh68
-rw-r--r--src/roff/troff/TODO125
-rw-r--r--src/roff/troff/charinfo.h301
-rw-r--r--src/roff/troff/column.cpp731
-rw-r--r--src/roff/troff/dictionary.cpp209
-rw-r--r--src/roff/troff/dictionary.h91
-rw-r--r--src/roff/troff/div.cpp1212
-rw-r--r--src/roff/troff/div.h175
-rw-r--r--src/roff/troff/env.cpp4138
-rw-r--r--src/roff/troff/env.h421
-rw-r--r--src/roff/troff/hvunits.h339
-rw-r--r--src/roff/troff/input.cpp9209
-rw-r--r--src/roff/troff/input.h120
-rw-r--r--src/roff/troff/mtsm.cpp651
-rw-r--r--src/roff/troff/mtsm.h165
-rw-r--r--src/roff/troff/node.cpp6656
-rw-r--r--src/roff/troff/node.h670
-rw-r--r--src/roff/troff/number.cpp712
-rw-r--r--src/roff/troff/reg.cpp479
-rw-r--r--src/roff/troff/reg.h74
-rw-r--r--src/roff/troff/request.h97
-rw-r--r--src/roff/troff/token.h249
-rw-r--r--src/roff/troff/troff.1.man1047
-rw-r--r--src/roff/troff/troff.am66
-rw-r--r--src/roff/troff/troff.h97
-rw-r--r--src/utils/addftinfo/addftinfo.1.man236
-rw-r--r--src/utils/addftinfo/addftinfo.am35
-rw-r--r--src/utils/addftinfo/addftinfo.cpp237
-rw-r--r--src/utils/addftinfo/guess.cpp489
-rw-r--r--src/utils/addftinfo/guess.h43
-rw-r--r--src/utils/afmtodit/afmtodit.1.man635
-rw-r--r--src/utils/afmtodit/afmtodit.am56
-rw-r--r--src/utils/afmtodit/afmtodit.pl645
-rw-r--r--src/utils/afmtodit/afmtodit.tables6163
-rwxr-xr-xsrc/utils/afmtodit/make-afmtodit-tables139
-rw-r--r--src/utils/grog/grog.1.man628
-rw-r--r--src/utils/grog/grog.am50
-rw-r--r--src/utils/grog/grog.pl721
-rwxr-xr-xsrc/utils/grog/tests/PF-does-not-start-pic-region.sh33
-rwxr-xr-xsrc/utils/grog/tests/avoid-refer-fakeout.sh34
-rw-r--r--src/utils/grog/tests/foo.man146
-rwxr-xr-xsrc/utils/grog/tests/preserve-groff-options.sh30
-rwxr-xr-xsrc/utils/grog/tests/recognize-perl-pod.sh31
-rwxr-xr-xsrc/utils/grog/tests/smoke-test.sh153
-rw-r--r--src/utils/hpftodit/hpftodit.1.man476
-rw-r--r--src/utils/hpftodit/hpftodit.am34
-rw-r--r--src/utils/hpftodit/hpftodit.cpp1465
-rw-r--r--src/utils/hpftodit/hpuni.cpp697
-rw-r--r--src/utils/indxbib/eign133
-rw-r--r--src/utils/indxbib/indxbib.1.man347
-rw-r--r--src/utils/indxbib/indxbib.am57
-rw-r--r--src/utils/indxbib/indxbib.cpp803
-rw-r--r--src/utils/indxbib/signal.c77
-rw-r--r--src/utils/lkbib/lkbib.1.man212
-rw-r--r--src/utils/lkbib/lkbib.am30
-rw-r--r--src/utils/lkbib/lkbib.cpp144
-rw-r--r--src/utils/lookbib/lookbib.1.man166
-rw-r--r--src/utils/lookbib/lookbib.am29
-rw-r--r--src/utils/lookbib/lookbib.cpp146
-rw-r--r--src/utils/pfbtops/pfbtops.1.man129
-rw-r--r--src/utils/pfbtops/pfbtops.am32
-rw-r--r--src/utils/pfbtops/pfbtops.c243
-rw-r--r--src/utils/tfmtodit/tfmtodit.1.man415
-rw-r--r--src/utils/tfmtodit/tfmtodit.am29
-rw-r--r--src/utils/tfmtodit/tfmtodit.cpp889
-rw-r--r--src/utils/xtotroff/xtotroff.1.man237
-rw-r--r--src/utils/xtotroff/xtotroff.am41
-rw-r--r--src/utils/xtotroff/xtotroff.c368
-rw-r--r--test-groff.in54
-rw-r--r--tmac/62bit.tmac203
-rw-r--r--tmac/LOCALIZATION60
-rw-r--r--tmac/TESTING-HINTS19
-rw-r--r--tmac/TODO36
-rw-r--r--tmac/X.tmac136
-rw-r--r--tmac/Xps.tmac65
-rw-r--r--tmac/an-ext.tmac205
-rw-r--r--tmac/an.tmac1574
-rw-r--r--tmac/andoc.tmac115
-rw-r--r--tmac/composite.tmac30
-rw-r--r--tmac/cp1047.tmac108
-rw-r--r--tmac/cs.tmac214
-rw-r--r--tmac/de.tmac218
-rw-r--r--tmac/den.tmac31
-rw-r--r--tmac/devtag.tmac124
-rw-r--r--tmac/doc-old.tmac1862
-rw-r--r--tmac/doc.tmac6957
-rw-r--r--tmac/dvi.tmac802
-rw-r--r--tmac/e.tmac2255
-rw-r--r--tmac/ec.tmac71
-rw-r--r--tmac/en.tmac77
-rw-r--r--tmac/eqnrc67
-rw-r--r--tmac/europs.tmac44
-rw-r--r--tmac/fallbacks.tmac214
-rw-r--r--tmac/fixmacros.sed7
-rw-r--r--tmac/fr.tmac213
-rw-r--r--tmac/groff_man.7.man.in4287
-rw-r--r--tmac/groff_mdoc.7.man5375
-rw-r--r--tmac/groff_me.7.man601
-rw-r--r--tmac/groff_ms.7.man2906
-rw-r--r--tmac/groff_trace.7.man335
-rw-r--r--tmac/groff_www.7.man760
-rw-r--r--tmac/html-end.tmac31
-rw-r--r--tmac/html.tmac550
-rw-r--r--tmac/hyphen.cs3672
-rw-r--r--tmac/hyphen.den23437
-rw-r--r--tmac/hyphen.det23515
-rw-r--r--tmac/hyphen.en5018
-rw-r--r--tmac/hyphen.fr1325
-rw-r--r--tmac/hyphen.it431
-rw-r--r--tmac/hyphen.sv4765
-rw-r--r--tmac/hyphenex.cs18
-rw-r--r--tmac/hyphenex.en115
-rw-r--r--tmac/hyphenex.pl91
-rw-r--r--tmac/it.tmac194
-rw-r--r--tmac/ja.tmac62
-rw-r--r--tmac/latin1.tmac114
-rw-r--r--tmac/latin2.tmac242
-rw-r--r--tmac/latin5.tmac134
-rw-r--r--tmac/latin9.tmac138
-rw-r--r--tmac/lbp.tmac103
-rw-r--r--tmac/lj4.tmac41
-rw-r--r--tmac/man.local31
-rw-r--r--tmac/man.tmac5
-rw-r--r--tmac/man.ultrix105
-rw-r--r--tmac/mandoc.tmac5
-rw-r--r--tmac/mdoc.local15
-rw-r--r--tmac/mdoc.tmac5
-rw-r--r--tmac/mdoc/doc-common1729
-rw-r--r--tmac/mdoc/doc-ditroff287
-rw-r--r--tmac/mdoc/doc-nroff229
-rw-r--r--tmac/mdoc/doc-syms908
-rw-r--r--tmac/me.tmac5
-rw-r--r--tmac/ms.tmac5
-rw-r--r--tmac/papersize.tmac167
-rw-r--r--tmac/pdf.tmac834
-rw-r--r--tmac/pdfpic.tmac287
-rw-r--r--tmac/pic.tmac24
-rw-r--r--tmac/ps.tmac698
-rw-r--r--tmac/psatk.tmac78
-rw-r--r--tmac/psfig.tmac104
-rw-r--r--tmac/psold.tmac70
-rw-r--r--tmac/pspic.tmac178
-rw-r--r--tmac/ptx.tmac50
-rw-r--r--tmac/refer-me.tmac107
-rw-r--r--tmac/refer-ms.tmac94
-rw-r--r--tmac/refer.tmac362
-rw-r--r--tmac/s.tmac2177
-rw-r--r--tmac/sv.tmac184
-rwxr-xr-xtmac/tests/an-ext_MR-works.sh61
-rwxr-xr-xtmac/tests/an-ext_MT-works.sh55
-rwxr-xr-xtmac/tests/an-ext_UR-works.sh56
-rwxr-xr-xtmac/tests/an_AT-and-UC-footer-saved-and-restored.sh106
-rwxr-xr-xtmac/tests/an_CS-register-off.sh27
-rwxr-xr-xtmac/tests/an_CS-register-on.sh27
-rwxr-xr-xtmac/tests/an_CS-register-unspecified.sh27
-rwxr-xr-xtmac/tests/an_CT-register-off.sh27
-rwxr-xr-xtmac/tests/an_CT-register-on.sh27
-rwxr-xr-xtmac/tests/an_CT-register-unspecified.sh27
-rwxr-xr-xtmac/tests/an_FT-bad-value-should-not-trash-titles.sh93
-rwxr-xr-xtmac/tests/an_HY-register-works.sh78
-rwxr-xr-xtmac/tests/an_LL-init-sanely.sh48
-rwxr-xr-xtmac/tests/an_ME-punct-hyphenates.sh55
-rwxr-xr-xtmac/tests/an_MR-works.sh75
-rwxr-xr-xtmac/tests/an_MT-body-hyphenates.sh37
-rwxr-xr-xtmac/tests/an_MT-works.sh86
-rwxr-xr-xtmac/tests/an_P-register-works.sh51
-rwxr-xr-xtmac/tests/an_TH-repairs-ad-damage.sh41
-rwxr-xr-xtmac/tests/an_TH-repairs-hy-damage.sh41
-rwxr-xr-xtmac/tests/an_TS-adds-no-vertical-space.sh47
-rwxr-xr-xtmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh51
-rwxr-xr-xtmac/tests/an_UE-breaks-before-long-URIs.sh68
-rwxr-xr-xtmac/tests/an_UE-punct-hyphenates.sh53
-rwxr-xr-xtmac/tests/an_UR-body-hyphenates.sh37
-rwxr-xr-xtmac/tests/an_UR-works.sh86
-rwxr-xr-xtmac/tests/an_X-register-works.sh62
-rwxr-xr-xtmac/tests/an_adjust-link-text-correctly.sh40
-rwxr-xr-xtmac/tests/an_avoid-two-font-denial-of-service.sh36
-rwxr-xr-xtmac/tests/an_do-not-abbreviate-escape-using-TH-arguments.sh51
-rwxr-xr-xtmac/tests/an_font-remapping-does-not-affect-titles.sh60
-rwxr-xr-xtmac/tests/an_handle-degenerate-input-quietly.sh29
-rwxr-xr-xtmac/tests/an_inner-footer-abbreviation-works.sh70
-rwxr-xr-xtmac/tests/an_link-macros-work-in-paragraph-tags.sh88
-rwxr-xr-xtmac/tests/an_link-trailing-text-hugs-previous.sh52
-rwxr-xr-xtmac/tests/an_no-break-after-short-paragraph-tags.sh43
-rwxr-xr-xtmac/tests/an_output-footer-when-continuously-rendering.sh41
-rwxr-xr-xtmac/tests/an_page-footers-present.sh68
-rwxr-xr-xtmac/tests/an_page-header-has-current-data.sh70
-rwxr-xr-xtmac/tests/an_reset-hyphenation-correctly.sh63
-rwxr-xr-xtmac/tests/an_title-abbreviation-works.sh61
-rwxr-xr-xtmac/tests/an_use-input-traps-correctly.sh113
-rwxr-xr-xtmac/tests/an_works-with-ec.sh40
-rwxr-xr-xtmac/tests/andoc_P-register-works.sh117
-rwxr-xr-xtmac/tests/andoc_check-an-to-doc-transition.sh68
-rwxr-xr-xtmac/tests/andoc_clear-doc-traps.sh47
-rwxr-xr-xtmac/tests/andoc_flush-between-packages.sh77
-rwxr-xr-xtmac/tests/doc_CS-works.sh42
-rwxr-xr-xtmac/tests/doc_CT-works.sh42
-rwxr-xr-xtmac/tests/doc_D-places-page-numbers-correctly.sh45
-rwxr-xr-xtmac/tests/doc_Lk-respect-sentence-ending-punctuation.sh40
-rwxr-xr-xtmac/tests/doc_Mt-works.sh48
-rwxr-xr-xtmac/tests/doc_Nm-works.sh74
-rwxr-xr-xtmac/tests/doc_P-register-works.sh54
-rwxr-xr-xtmac/tests/doc_X-register-works.sh70
-rwxr-xr-xtmac/tests/doc_accept-mixed-case-section-headings.sh76
-rwxr-xr-xtmac/tests/doc_do-not-loop-infinitely-when-shortening-headers.sh37
-rwxr-xr-xtmac/tests/doc_heading-font-remapping-works.sh58
-rwxr-xr-xtmac/tests/doc_indents-correctly.sh89
-rwxr-xr-xtmac/tests/doc_output-footer-when-continuously-rendering.sh43
-rwxr-xr-xtmac/tests/doc_smoke-test.sh66
-rwxr-xr-xtmac/tests/e_chapter-titles-work.sh68
-rwxr-xr-xtmac/tests/e_columns-work-on-long-pages.sh38
-rwxr-xr-xtmac/tests/e_delayed-text-marks-work.sh55
-rwxr-xr-xtmac/tests/e_footnote-marks-work.sh74
-rwxr-xr-xtmac/tests/e_footnotes-work-with-columns.sh43
-rwxr-xr-xtmac/tests/e_ld-works.sh131
-rwxr-xr-xtmac/tests/e_line-numbering-works.sh141
-rwxr-xr-xtmac/tests/e_rejects-too-short-page-lengths.sh61
-rwxr-xr-xtmac/tests/ec_works.sh45
-rwxr-xr-xtmac/tests/latin2_works.sh76
-rwxr-xr-xtmac/tests/latin5_works.sh30
-rwxr-xr-xtmac/tests/latin9_works.sh30
-rwxr-xr-xtmac/tests/localization-works.sh189
-rwxr-xr-xtmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh83
-rwxr-xr-xtmac/tests/pdfpic_falls-back-to-PSPIC.sh77
-rwxr-xr-xtmac/tests/s_IP-indents-using-paragraph-type-size.sh50
-rwxr-xr-xtmac/tests/s_IP-respects-inter-sentence-space-in-tags.sh40
-rwxr-xr-xtmac/tests/s_PN-works.sh37
-rwxr-xr-xtmac/tests/s_R-handles-its-arguments.sh41
-rwxr-xr-xtmac/tests/s_SH-resets-IP-indentation-amount.sh40
-rwxr-xr-xtmac/tests/s_TC-works-with-percent-in-custom-titles.sh52
-rwxr-xr-xtmac/tests/s_XA-literal-no-argument-suppresses-leader.sh59
-rwxr-xr-xtmac/tests/s_honor-MINGW-when-two-columns.sh37
-rwxr-xr-xtmac/tests/s_mark-column-start-correctly.sh38
-rwxr-xr-xtmac/tests/s_no-excess-space-around-displays.sh39
-rwxr-xr-xtmac/tests/s_rejects-too-short-page-lengths.sh61
-rw-r--r--tmac/tmac.am385
-rw-r--r--tmac/trace.tmac346
-rw-r--r--tmac/trans.tmac176
-rw-r--r--tmac/troffrc71
-rw-r--r--tmac/troffrc-end34
-rw-r--r--tmac/tty-char.tmac251
-rw-r--r--tmac/tty.tmac100
-rw-r--r--tmac/www.tmac.in1638
-rw-r--r--tmac/zh.tmac61
1589 files changed, 847909 insertions, 0 deletions
diff --git a/.tarball-version b/.tarball-version
new file mode 100644
index 0000000..a6c2798
--- /dev/null
+++ b/.tarball-version
@@ -0,0 +1 @@
+1.23.0
diff --git a/.version b/.version
new file mode 100644
index 0000000..a6c2798
--- /dev/null
+++ b/.version
@@ -0,0 +1 @@
+1.23.0
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/AUTHORS
diff --git a/BUG-REPORT b/BUG-REPORT
new file mode 100644
index 0000000..0ca6f2d
--- /dev/null
+++ b/BUG-REPORT
@@ -0,0 +1,72 @@
+ Copyright (C) 1999-2020, 2022 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without
+ modification, are permitted in any medium without royalty provided
+ the copyright notice and this notice are preserved.
+
+ groff Bug Report
+
+[Please read the 'PROBLEMS' file before submitting a bug report.
+
+Please fill in all fields, even if you think they are not relevant.
+
+Please delete the text in square brackets before submitting it.
+
+Please report distinguishable problems separately.
+
+Place this completed form in a new bug report at
+<http://savannah.gnu.org/bugs/?group=groff>. Click on the "Bugs" link,
+then select "Submit new" from the menu.]
+
++verbatim+
+GROFF VERSION:
+[Put the output of the failing command when run with the '--version'
+option here. For example, "groff --version" or "indxbib --version".]
+
+PLATFORM:
+[Put the output of the "uname -a" command here. On non-POSIX systems,
+some alternative should be available; on Windows systems, use "ver".]
+
+CONFIGURATION REPORT:
+[If you compiled groff yourself, include the portion of the 'configure'
+script's output between rows of dashes. If you didn't compile groff
+yourself, supply the packaging information from your distributor: in
+DEB- and RPM-based GNU/Linux distributions, gather it with the commands
+"dpkg -s groff" or "rpm -qi groff", respectively.]
+
+INPUT FILES:
+[Include all the files necessary to reproduce the problem that are not
+part of the standard groff distribution. This includes device and font
+description files and any macro files your document uses that groff does
+not supply. Attach them to the bug report.
+
+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. Further, a short example is more
+convenient than a long one, but don't worry if you can't find a short
+example. A claim like "any file that X" is not helpful: always include
+a concrete example.]
+
+COMMAND LINE:
+[The command line that we should run in order to observe the bug. For
+example, "groff -Tps bug.tr".]
+
+DESCRIPTION OF INCORRECT BEHAVIOUR:
+[What goes wrong when that command line is run? For example, "groff
+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, you might include a unified
+diff here. But don't delay submitting a bug report in the hope of
+finding a fix. A guess about a bug's cause is not usually helpful.]
+-verbatim-
+
+##### Editor settings
+Local Variables:
+fill-column: 72
+mode: text
+End:
+vim: set filetype= textwidth=72:
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. 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
+them 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 prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. 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.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey 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;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If 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 convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU 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 that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ 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.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+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.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ 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
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 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, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program 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, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU 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 Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..bfcc345
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,18665 @@
+2023-06-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Offer advice to users of PDF who want a table of contents
+ at the front of the document.
+
+ * doc/groff.texi (ms Document Structure): Move mention of
+ pdfjam(1) from here...
+ (ms TOC): ...to here, and identify alternatives, including
+ gropdf(1)'s `pdfswitchtopage` macro.
+
+ * doc/ms.ms (General structure of an ms document):
+ (Creating a table of contents): Similar.
+
+ Fixes <https://savannah.gnu.org/bugs/?64278>. Thanks to Michał
+ Kruszewski for the report.
+
+2023-06-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [docs]: Migrate terminology to "scaling unit".
+
+ ...from "scaling indicator".
+
+ Fixes <https://savannah.gnu.org/bugs/?60957>. Thanks to Ingo
+ Schwarze for the discussion.
+
+2023-05-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [docs]: Revise discussion of fonts.
+
+ * doc/groff.texi:
+ - Rename node/section "Fonts and Symbols" to "Using Fonts". Add
+ giant new introduction, properly establishing terminology.
+ - Rename node/section "Changing Fonts" to "Selecting Fonts".
+ Shift location of `.fn` and `.sty` register documentation.
+ Rewrite presentation of `ft` and `\f`. Discuss typeface
+ selection by mounting position and font (or style) name
+ together; since arguments to these formatter instructions are
+ always interpreted as mounting positions first, it doesn't
+ make much sense to me to present them separately, and the new
+ introduction provides the necessary background. Tighten
+ example. Document that current and previous font selections
+ are environment properties.
+ - Add several concept index entries.
+ - Do more migration from "symbol" and "glyph" names to "special
+ character" names.
+
+ * man/groff.7 (Using fonts): Introduce new section, synced with
+ the renamed node from our Texinfo manual above.
+
+ Fixes <https://savannah.gnu.org/bugs/?62973>.
+
+2023-05-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [docs]: Revise "Page Layout" material.
+
+ * doc/groff.texi:
+ - Recast generally.
+ - Describe behavior of `pl` in more detail.
+ - Migrate terminology from "scaling indicator" to "scaling
+ unit".
+ - Stop discussing page margins in the context of the `pl`
+ request.
+ - Move concept index entries regarding margins from here to
+ "Traps".
+ - Move discussion of `pn` request to precede `tl` request.
+ - Add concept index entries.
+ - Recast description of `tl` request. Migrate terminology from
+ "justification" to "alignment".
+ - Recast description of `lt` request. Describe behavior in more
+ detail.
+ - Recast description of `pc` request.
+ - Add example of `lt` and `tl` usage. Add forward reference to
+ "Traps", mentioning page header and footer traps.
+
+ Fixes <https://savannah.gnu.org/bugs/?55124>. Thanks to Dave
+ Kemper for the report.
+
+2023-05-22 Dave Kemper <saint.snit@gmail.com>
+
+ [docs]: Correct minor punctuation, grammar, and spelling issues.
+
+ Also remove a couple instances of unnecessarily telling the
+ reader to note something.
+
+ * doc/groff.texi:
+ * man/groff.7.man:
+ * man/groff_char.7.man:
+ * man/groff_diff.7.man:
+ * man/roff.7.man:
+ * src/roff/nroff/nroff.1.man: Do it.
+
+ Fixes <https://savannah.gnu.org/bugs/?64230>. [I threw in a few
+ more fixes. --GBR]
+
+2023-04-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [docs]: Attempt to further clarify end-of-sentence detection.
+
+ * doc/groff.texi (Sentences):
+ * man/roff.7 (Concepts): Do it.
+
+ Fixes <https://savannah.gnu.org/bugs/?64091>. Thanks to Ingo
+ Schwarze and Dave Kemper for the report.
+
+2023-04-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [docs]: Minimally document `tag`, `taga` requests.
+
+ * doc/groff.texi (Postprocessor Access):
+ * man/groff.7 (Request short reference): Do it.
+
+ Fixes <https://savannah.gnu.org/bugs/?62695>.
+
+2023-04-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [docs]: Fix typos.
+
+ * doc/groff.texi (ms basic information):
+ * doc/ms.ms (Basic information): Do it.
+
+ Fixes <https://savannah.gnu.org/bugs/?64032>. Thanks to an
+ anonymous reporter.
+
+2023-03-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Operators in Conditionals):
+ * man/groff.7.in (Conditional expressions): Clarify how the
+ output comparison operator is recognized.
+
+ Fixes <https://savannah.gnu.org/bugs/?63812>. Thanks to John
+ Gardner for the report.
+
+2023-03-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Use a better type for symbol hashes.
+
+ * bootstrap.conf: Add "stdint" module to ensure that the
+ `uintptr_t` type is available.
+ * src/include/symbol.h: Include <stdint.h> for `uintptr_t`.
+ (class symbol):
+ (symbol::hash): Change return type from `unsigned long`, which
+ causes build failures on 64-bit MinGW, to `uintptr_t`.
+ (symbol::hash): Use a C++ type cast, not a C-style one.
+
+ Thanks to Bruno Haible for reporting the build failure in the
+ 64-bit MinGW environment, and for suggesting a remedy.
+
+2023-03-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [groff]: Revise a test to be more revealing.
+
+ * src/roff/groff/tests/initialization_is_quiet.sh: Stop using
+ "set -e". Instead use `fail` variable and `wail` function (and
+ lowercase names for our internal variables) like many of our
+ other tests. If the "unset" shell built-in fails, skip the
+ test (prompted by /usr/xpg4/bin/sh on Solaris). Attempt every
+ groff locale, with and without compatibility mode initially
+ enabled, instead of stopping at the first failure. Report
+ standard error and standard output content separately. Use
+ groff's `-a` flag to prepare the standard output, for
+ readability.
+ * PROBLEMS: Document that this test might be skipped rather than
+ failing on Solaris. (What actually happens depends on which
+ shell you run it with, and we advise a variety of approaches.)
+
+ Thanks to Bruno Haible for feedback regarding mysterious
+ failures of this test on GNU/Hurd and NetBSD systems.
+
+2023-03-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * bootstrap.conf (gnulib_modules): Add "stdbool-c99" per
+ recommendation from Bruno Haible.
+
+ Fixes build problem on Solaris using Sun compiler.
+
+2023-03-06 Bruno Haible <bruno@clisp.org>
+
+ * Makefile.am (AR): Remove hardcoded value. Let Automake use the
+ value from config.status.
+
+ {Fixes build problem on 64-bit AIX. Problem appears to date
+ back to commit 5fec19d453, 2014-08-15. --GBR}
+
+2023-03-06 Bruno Haible <bruno@clisp.org>
+
+ * arch/misc/misc.am (shdeps.sed): Rename target from this...
+ ($(SH_DEPS_SED_SCRIPT)): ...to this, to work better with make(1)
+ on FreeBSD, NetBSD, and AIX.
+
+2023-03-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Discard now-unneeded Autoconf macro and variables.
+
+ * configure.ac: Stop calling `GROFF_POPPLER`. Stop populating
+ the Automake conditional `HAVE_PDFTOOLS`. Eliminate chatter
+ about their availability in the configuration report.
+ * m4/groff.m4 (GROFF_POPPLER): Delete.
+
+2023-03-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_URW_FONTS_NOTICE): Adapt wording of notice
+ to presence and identity of Ghostscript interpreter command.
+ Clarify that it is gropdf(1) specifically that traverses the
+ Ghostscript search path reported by its "-h" option.
+
+ Continues <https://savannah.gnu.org/bugs/?63808>. Thanks to
+ Deri James for the ongoing discussion.
+
+2023-02-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [devpdf]: Revise tests.
+
+ * font/devpdf/tests/check-default-foundry.sh.in: Test only the
+ base 14 fonts of the PDF standard unconditionally. Test the
+ remainder from the set of 35 commonly distributed only if a
+ Ghostscript interpreter was detected at configuration time,
+ because the latter fonts _must_ be embedded in PDF documents.
+ If they're not present, skip the test rather than failing it.
+ * font/devpdf/tests/check-urw-foundry.sh.in: Skip test if no URW
+ fonts detected at configuration time, rather than failing it.
+ * m4/groff.m4 (GROFF_GROPDF_PROGRAM_NOTICE)
+ (GROFF_URW_FONTS_NOTICE): Drop warnings of expected test
+ failures. The tests no longer fail in the anticipated
+ circumstances.
+
+2023-02-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [devpdf]: Generate tests from template files, so we can populate
+ the test scripts with information determined at configuration.
+ The default foundry test depends on $GHOSTSCRIPT, and the URW
+ foundry test on $urwfontsdir.
+
+ * font/devpdf/tests/check-default-foundry.sh:
+ * font/devpdf/tests/check-urw-foundry.sh: Rename these...
+ * font/devpdf/tests/check-default-foundry.sh.in:
+ * font/devpdf/tests/check-urw-foundry.sh.in: ...to these.
+
+ * font/devpdf/devpdf.am (font_devpdf_default_test)
+ (font_devpdf_urw_test): New variables store names of generated
+ test scripts.
+ (font/devpdf/tests/check-default-foundry.sh):
+ (font/devpdf/tests/check-urw-foundry.sh): New targets produce
+ test scripts from corresponding .in files.
+
+2023-02-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [devpdf]: Trivially refactor. Rename sed-substitutum [Lat.]
+ from "@GROFF_GHOSTSCRIPT_INTERPRETERS@" to "@GHOSTSCRIPT@" for
+ clarity and brevity; this is a scalar value containing the
+ Autoconf-determined name of the Ghostscript interpreter. It is
+ not the same as the replacement that occurs in contrib/pdfmark.
+
+ * font/devpdf/devpdf.am:
+ * font/devpdf/util/BuildFoundries.pl: Do it.
+
+2023-02-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Stop scraping output of Ghostscript executable with
+ "-h" option to attempt to find URW fonts. Fonts that ship with
+ Ghostscript are regarded as the "default" foundry, not the URW
+ foundry (though they often ultimately originate with URW fonts).
+ They are often missing Adobe Font Metric (AFM) files, so it is
+ impossible for groff to generate font description files for them
+ at build time.
+
+ * m4/groff.m4 (GROFF_URW_FONTS_CHECK): Drop `AC_REQUIRE` on
+ `GROFF_AWK_PATH`. Drop awk-based scraping of Ghostscript "-h"
+ output. Annotate need for sync between this list of
+ characteristic font file names and the one in BuildFoundries.
+
+ Thanks to Deri James for the ongoing discussions.
+
+2023-02-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * configure.ac: Drop now-redundant explicit
+ `GROFF_URW_FONTS_CHECK`. `GROFF_GROPDF_DEPENDENCIES_CHECK`
+ `AC_REQUIRE`s it as of commit ec001d2a23, 18 February.
+
+2023-02-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_URW_FONTS_CHECK): When looking for a
+ characteristic URW font by its file name, also check for
+ "URWGothic-Book" with no file extension. Avoids false negatives
+ in URW Type 1 font detection when using Ghostscript 9.53.3.
+ Thanks to Deri James for suggesting the test procedure that
+ uncovered this flaw.
+
+2023-02-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * Makefile.am (uninstall_groffdirs): Remove "html.mono" and
+ "html.node" directories corresponding to HTML version of our
+ Texinfo manual.
+ * doc/doc.am (uninstall-html): Uninstall HTML version of our
+ Texinfo manual more reliably.
+
+ Fixes a regression introduced by me in commit c2698aade, 6 April
+ {my claim "we're only deleting files with this command, not
+ directories" was not correct}.
+
+2023-02-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [doc]: Handle output formats of our Texinfo manual more
+ consistently.
+
+ * doc/doc.am (install-doc): Add dependency on (Automake
+ standard) target 'install-dvi'.
+ (maintainer-clean-local): Remove our Texinfo manual in plain
+ text format.
+ (install-data-local): Add dependency on new target
+ 'install-txt'.
+ (install-txt): Install our Texinfo manual in plain text format.
+ (uninstall-local): Add dependency on new target 'uninstall-txt'.
+ (uninstall-txt): Uninstall our Texinfo manual in plain text
+ format.
+
+ Thanks to T. Kurt Bond for noticing the discrepancy.
+
+2023-02-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (install-pdf-local, install-html-local): Enable
+ rules to work in out-of-tree builds.
+
+2023-02-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (uninstall-hook): Drop dependency on
+ "uninstall_mom"; this is not the appropriate place to declare
+ it, and "uninstall_groffdirs" already depends on it in mom's
+ Automake file.
+
+2023-02-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tests]: Have more tests report output.
+
+ * src/roff/groff/tests/ab_works.sh:
+ * src/roff/groff/tests/handle_special_input_code_points.sh:
+ * src/roff/groff/tests/initialization_is_quiet.sh:
+ * src/roff/groff/tests/msoquiet_works.sh:
+ * src/roff/groff/tests/soquiet_works.sh:
+ * tmac/tests/an-ext_MR-works.sh:
+ * tmac/tests/an_MR-works.sh: Do it.
+
+2023-02-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tests]: Prevent failures when $GROFF_ENCODING is set.
+
+ * src/roff/groff/tests/ab_works.sh:
+ * src/roff/groff/tests/handle_special_input_code_points.sh:
+ * src/roff/groff/tests/initialization_is_quiet.sh:
+ * src/roff/groff/tests/msoquiet_works.sh:
+ * src/roff/groff/tests/soquiet_works.sh:
+ * tmac/tests/an-ext_MR-works.sh:
+ * tmac/tests/an_MR-works.sh:
+ * tmac/tests/an_font-remapping-does-not-affect-titles.sh: Unset
+ $GROFF_ENCODING before running test because preconv(1) confounds
+ these tests.
+
+ Thanks to Alexis for reporting this problem.
+
+2023-02-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Rename test.
+
+ * tmac/tests/s_no-excess-space-around-displays.tmac: Rename...
+ * tmac/tests/s_no-excess-space-around-displays.sh: ...to this.
+ * tmac/tmac.am (tmac_TESTS): Update.
+
+2023-02-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [gropdf]: Revise tests to run unconditionally, rather than
+ configuring them away at build time, which can cause a
+ distribution archive to be incorrectly structured. Update
+ configuration notices when optional dependencies are absent.
+
+ * font/devpdf/devpdf.am (font_devpdf_TESTS): Remove `USE_GROPDF`
+ and `HAVE_URW_FONTS` conditionals.
+ * m4/groff.m4 (GROFF_GROPDF_PROGRAM_NOTICE):
+ (GROFF_URW_FONTS_NOTICE): Warn reader that a gropdf test failure
+ is to be expected.
+
+ Fixes <https://savannah.gnu.org/bugs/?63824> (2/2).
+
+2023-02-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grohtml]: Revise tests to check for requisite programs at test
+ time and skip if not found, rather than configuring them away at
+ build time, which can cause a distribution archive to be
+ incorrectly structured.
+
+ * m4/groff.m4: Annotate requisite program list since we're
+ violating the DRY principle.
+ * src/roff/groff/groff.am (groff_TESTS): Populate
+ unconditionally.
+
+ * src/roff/groff/tests/html_works_with_grn_and_eqn.sh:
+ * src/roff/groff/tests/smoke-test_html_device.sh: Check for
+ requisite programs and skip test if any are not found.
+
+ Fixes <https://savannah.gnu.org/bugs/?63824> (1/2).
+
+2023-02-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man pages]: Define page-local `MR` fallback.
+
+ [man pages]: Provide page-local fallback definition of new `MR`
+ macro. I didn't think I was going to have to do this, but the
+ premier site on the web for viewing Linux man pages, Michael
+ Kerrisk's man7.org, has been pulling snapshots of the pages
+ themselves without upgrading the underlying macros, and so man
+ page cross references set with `MR` are getting lost in its
+ presentations. (I acknowledge: Ingo Schwarze warned me
+ something like this could happen.) This definition is intended
+ as a stopgap measure only. I want to revert this after groff
+ 1.23 is released and has spread to some reasonable degree.
+
+ * contrib/chem/chem.1.man:
+ * contrib/eqn2graph/eqn2graph.1.man:
+ * contrib/gdiffmk/gdiffmk.1.man:
+ * contrib/glilypond/glilypond.1.man:
+ * contrib/gperl/gperl.1.man:
+ * contrib/gpinyin/gpinyin.1.man:
+ * contrib/grap2graph/grap2graph.1.man:
+ * contrib/hdtbl/groff_hdtbl.7.man:
+ * contrib/mm/groff_mm.7.man:
+ * contrib/mm/groff_mmse.7.man:
+ * contrib/mm/mmroff.1.man:
+ * contrib/mom/groff_mom.7.man:
+ * contrib/pdfmark/pdfroff.1.man:
+ * contrib/pic2graph/pic2graph.1.man:
+ * contrib/rfc1345/groff_rfc1345.7.man:
+ * man/groff.7.man:
+ * man/groff_char.7.man:
+ * man/groff_diff.7.man:
+ * man/groff_font.5.man:
+ * man/groff_out.5.man:
+ * man/groff_tmac.5.man:
+ * man/roff.7.man:
+ * src/devices/grodvi/grodvi.1.man:
+ * src/devices/grohtml/grohtml.1.man:
+ * src/devices/grolbp/grolbp.1.man:
+ * src/devices/grolj4/grolj4.1.man:
+ * src/devices/gropdf/gropdf.1.man:
+ * src/devices/gropdf/pdfmom.1.man:
+ * src/devices/grops/grops.1.man:
+ * src/devices/grotty/grotty.1.man:
+ * src/devices/xditview/gxditview.1.man:
+ * src/preproc/eqn/eqn.1.man:
+ * src/preproc/eqn/neqn.1.man:
+ * src/preproc/grn/grn.1.man:
+ * src/preproc/pic/pic.1.man:
+ * src/preproc/preconv/preconv.1.man:
+ * src/preproc/refer/refer.1.man:
+ * src/preproc/soelim/soelim.1.man:
+ * src/preproc/tbl/tbl.1.man:
+ * src/roff/groff/groff.1.man:
+ * src/roff/nroff/nroff.1.man:
+ * src/roff/troff/troff.1.man:
+ * src/utils/addftinfo/addftinfo.1.man:
+ * src/utils/afmtodit/afmtodit.1.man:
+ * src/utils/grog/grog.1.man:
+ * src/utils/hpftodit/hpftodit.1.man:
+ * src/utils/indxbib/indxbib.1.man:
+ * src/utils/lkbib/lkbib.1.man:
+ * src/utils/lookbib/lookbib.1.man:
+ * src/utils/pfbtops/pfbtops.1.man:
+ * src/utils/tfmtodit/tfmtodit.1.man:
+ * src/utils/xtotroff/xtotroff.1.man:
+ * tmac/groff_man.7.man.in:
+ * tmac/groff_me.7.man:
+ * tmac/groff_ms.7.man:
+ * tmac/groff_trace.7.man:
+ * tmac/groff_www.7.man: Do it.
+
+ Fixes <https://savannah.gnu.org/bugs/?63825>. Thanks greatly to
+ Alexis for identifying an issue with mandoc(1)'s handling of an
+ earlier iteration of this fallback, and to John Gardner for
+ identifying a method of detecting mandoc as the renderer at
+ formatting time.
+
+2023-02-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh: Improve
+ portability of script by using shell constructs instead of the
+ nonstandard GNU coreutils 'seq' utility. Resolves test failure
+ on Solaris 10.
+ * HACKING: Document this problem.
+
+2023-02-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_MAKE_DEFINES_RM): Test the make(1) in the
+ environment variable $MAKE if defined, not a literal "make".
+ Required on (some) Solaris 10 configurations where traditional
+ make(1) is not installed but GNU make is installed as "gmake".
+
+2023-02-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/latin2_works.sh: Fix missing backslash in printf.
+ Solaris printf(1) was sensitive to this error; macOS and GNU
+ printf were not. Fixes a test failure on Solaris 11.
+
+2023-02-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/tests/regression_savannah_58153.sh: Improve
+ portability. Avoid the unpredictability of implementations when
+ putting backslashes inside a groff-piped printf shell command
+ inside a here document inside a command substitution by changing
+ the groff escape character to something meaningless to the shell
+ and to printf ('@'). Fixes a test failure on Solaris 11.
+
+2023-02-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/Foundry.in: Recognize URW foundry replacements for
+ Helvetica Bold-Oblique and Helvetica Oblique under the file
+ names "NimbusSans-BoldItalic.t1" and "NimbusSans-Italic.t1",
+ respectively.
+
+2023-02-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (uninstall-pdf): Clean more fastidiously; try to
+ remove the configured `pdfdocdir` in the event it is empty, but
+ do not fail if it isn't. (It can be a directory shared with
+ other groff components; we don't know in what order the
+ uninstall targets will serialize, but the last one run should
+ succeed.)
+
+2023-02-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Detangle "pdfroff" and "gropdf" configuration (2/2).
+
+ * m4/groff.m4: Give pdfroff its own Autoconf macros to handle
+ dependency checking, build objectives, and user notice.
+ (GROFF_PDFROFF_DEPENDENCIES_CHECK): New macro requires
+ `GROFF_AWK_PATH` and `GROFF_GHOSTSCRIPT_PATH`, determines
+ whether pdfroff can be used at build time, and (if not)
+ constructs part of message to be shown to user explaining why.
+ (GROFF_PDFROFF_PROGRAM_NOTICE): New macro requires
+ `GROFF_PDFROFF_DEPENDENCIES_CHECK` and emits message if needed.
+ (GROFF_GHOSTSCRIPT_AVAILABILITY_NOTICE): Drop mention of impact
+ on pdfroff since its dedicated notice covers this now.
+ * configure.ac: Call the new macros at appropriate times.
+ Produce a new Automake macro, `USE_PDFROFF`, to replace
+ inapposite use of `USE_GROPDF` in pdfmark.am.
+ * contrib/pdfmark/pdfmark.am: Use `USE_PDFROFF` instead of
+ `USE_GROPDF`.
+
+2023-02-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Detangle "pdfroff" and "gropdf" configuration (1/2).
+
+ * m4/groff.m4 (GROFF_GROPDF_DEPENDENCIES_CHECK): Add
+ `AC_REQUIRE`ment on `GROFF_URW_FONTS_CHECK`. Per discussion
+ with Deri James, if _either_ Ghostscript or the URW fonts are
+ avilable, gropdf will be fully functional, consequent to commit
+ d5515, 22 June. Drop dependency on awk; it is used only at
+ configuration time (in an Autoconf macro) and since Savannah
+ #62775 was resolved (19 September), it has not been strictly
+ necessary. (It is useful for searching more locations for URW
+ fonts, but several others are searched even if it is absent.)
+ Stop populating notice text here, instead moving it...
+ (GROFF_GROPDF_PROGRAM_NOTICE): ...here, since it no longer needs
+ to be dynamically constructed.
+
+ Continues <https://savannah.gnu.org/bugs/?63808>. Thanks to
+ Deri James for the continued discussion.
+
+2023-02-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Rename `GROFF_CHECK_GROPDF_PROGRAMS` macro to
+ `GROFF_GROPDF_DEPENDENCIES_CHECK` to generalize for greater
+ accuracy in forthcoming change.
+
+ * configure.ac:
+ * m4/groff.m4: Do it.
+
+2023-02-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [gropdf]: Don't run automated tests if 'gropdf' will be
+ operating with reduced function. If neither Ghostscript nor the
+ URW fonts are available at configuration time, there is no point
+ testing for successful build-time population of the font
+ descriptions for the default and URW foundries.
+
+ * font/devpdf/devpdf.am (font_devpdf_TESTS) [USE_GROPDF]: Run
+ "check-default-foundry" only if gropdf is fully functional.
+ (font_devpdf_TESTS) [USE_GROPDF && HAVE_URW_FONTS]: Run
+ "check-urw-foundry" only if the URW fonts were found.
+
+ Continues <https://savannah.gnu.org/bugs/?63808>. Thanks to
+ Deri James for the continued discussion.
+
+2023-02-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [gropdf]: Rename tests to more accurately characterize their
+ purpose.
+
+ * font/devpdf/tests/basic-fonts-present.sh:
+ * font/devpdf/tests/urw-fonts-present.sh: Rename these...
+ * font/devpdf/tests/check-default-foundry.sh:
+ * font/devpdf/tests/check-urw-foundry.sh: ...to these.
+ * font/devpdf/devpdf.am (font_devpdf_TESTS): Reflect rename.
+
+2023-02-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [gropdf]: Revise tests to be foundry-focussed.
+
+ * font/devpdf/tests/basic-fonts-present.sh: Stop trying to match
+ font descriptions in the "devps" directory with ones in
+ "devpdf"; instead, test whether "BuildFoundries" did its job.
+ Test for font descriptions corresponding to the full 35
+ PostScript Level 2 font repertoire, plus groff's "EURO".
+ * font/devpdf/tests/urw-fonts-present.sh: Drop stale comment and
+ rename variable for better parallelism with the other test
+ above.
+
+ Continues <https://savannah.gnu.org/bugs/?63808>. Thanks to
+ Deri James for the continued discussion.
+
+2023-02-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Tweak fix to Savannah #63768.
+
+ * tmac/an.tmac (MR): Ensure `an*url` always has a value,
+ defaulting to "format 1" (man:page(section)). Resequence the
+ macOS URL formats to sort the contemporary one before the
+ others.
+ * tmac/man.local: Reflect resequencing of integer assignments to
+ formats. Clarify historicity of annotations.
+
+ Continues <https://savannah.gnu.org/bugs/?63768>. Thanks to
+ John Gardner for further discussion.
+
+2023-02-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Port a test to Solaris 11 sed.
+
+ * tmac/tests/s_TC-works-with-percent-in-custom-titles.sh: Put
+ newlines after opening braces in sed scripts. macOS and GNU sed
+ tolerate their absence, but this sed does not.
+ * HACKING: Document this problem.
+
+2023-02-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/groff.am (groff_TESTS) [!USE_GROHTML]: Don't
+ test the 'grohtml' driver if we know it won't work.
+
+2023-02-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/tests/\
+ device_control_escapes_express_basic_latin.sh: Use printf(1),
+ which is often a shell built-in command, more consistently.
+ Double backslashes intended as literals in the format string,
+ and single-quote format strings using them. Fixes test failure
+ seen on Solaris 11 with GNU Bash 4.4 and ksh 93u+ (2012-08-01).
+
+2023-02-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/an_use-input-traps-correctly.sh: Explicitly test
+ `SM` and `SB` with 'ps' output device. If one set
+ GROFF_TYPESETTER=utf8 in the test environment, these test cases
+ would fail. Thanks to John Gardner for the report.
+
+2023-02-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * configure.ac: Add Automake conditional, `HAVE_GHOSTSCRIPT`, so
+ that we can populate the list of PDF device font tests
+ dynamically. Call new macro
+ `GROFF_GHOSTSCRIPT_AVAILABILITY_NOTICE`. Call
+ `GROFF_GHOSTSCRIPT_VERSION_NOTICE` after it, but before
+ `GROFF_URW_FONTS_NOTICE`.
+ * m4/groff.m4 (GROFF_AWK_NOTICE): New macro produces warning if
+ no awk could be found. This reduces gropdf functionality, but
+ so do missing URW fonts, so we report this problem separately.
+ Report the names under which we sought it, since there's a
+ configure script option for that.
+ (GROFF_GHOSTSCRIPT_AVAILABILITY_NOTICE): New macro explains
+ consequences of missing optional dependency on Ghostscript
+ program: reduced grohtml functionality, nonfunctional pdfroff.
+ Report the names under which we sought it, since there's a
+ configure script option for that.
+ (GROFF_CHECK_GROPDF_PROGRAMS): Better characterize gropdf's
+ reduced function, pointing out the ways in which it would be
+ more useful if the dependencies were met. Also simplify the
+ computational grammar.
+ (GROFF_URW_FONTS_NOTICE): Identify 'U' as the foundry name
+ gropdf uses for the URW fonts. Confirm continuing availability
+ of most recent URW fonts release; bump date.
+ * font/devpdf/devpdf.am: Test availability of "basic" (PDF base
+ 14) fonts (plus groff's "EURO") if either Ghostscript or URW
+ fonts are available. Test availability of URW fonts (35) only
+ if Ghostscript _and_ the URW fonts were found at configuration
+ time.
+
+ Fixes <https://savannah.gnu.org/bugs/?63808>. Thanks to Deri
+ James for the report and extremely helpful pseudocode.
+
+2023-02-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_GHOSTSCRIPT_VERSION_CHECK,
+ GROFF_URW_FONTS_NOTICE): Add macro dependency on
+ `GROFF_GHOSTSCRIPT_PATH`, which should have been there already.
+ (GROFF_GROHTML_PROGRAM_NOTICE): Add macro dependency on
+ `GROFF_CHECK_GROHTML_PROGRAMS`, which should have been there
+ already.
+
+ (GROFF_CHECK_GROHTML_PROGRAMS, GROFF_PNMTOOLS_CAN_BE_QUIET):
+ Move `AC_REQUIRE` expansions to precede shell variable
+ assignments (after checking that the required macros don't
+ clobber the assignments we're making).
+
+2023-02-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/tests/basic-fonts-present.sh: Revise test again,
+ per feedback from Deri James. Even without Ghostscript or URW
+ fonts available, gropdf can generate valid PDF documents; it
+ simply can't embed fonts in general (without further
+ arrangements made on the host system), which means it is
+ restricted to the PDF base 14 fonts. That's enough for many
+ purposes, including generating our compiled man pages document
+ {with minor degradations to the typeface lists in gropdf(1) and
+ grops(1)}. Drop the 'gs' command check, which also didn't check
+ for the name of the Ghostscript interpreter determined by the
+ "configure" script. Replace dynamically generated font list
+ with a static one (the base 14 fonts plus groff's EURO).
+
+2023-02-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/tests/basic-fonts-present.sh: Revise test.
+ Improve explanation of why we're looking for the gs(1) command
+ in a font availability test. Prefix diagnostic output with name
+ of test script. Perform a search for the 'ps' device font
+ descriptions that will work in more build scenarios (i.e., don't
+ assume an out-of-tree build taking place in an immediate
+ subdirectory of the source). Distinguish failure to find the
+ font descriptions from a failure to locate the 'gs' command,
+ skipping the test in both scenarios. Reduce noise in output.
+ * m4/groff.m4 (GROFF_CHECK_GROPDF_PROGRAMS): Revise warning
+ issued when awk and Ghostscript are unavailable; gropdf will not
+ be completely inoperative. Characterize its reduced function.
+
+ Thanks to Deri James in <https://lists.gnu.org/archive/html/\
+ groff-commit/2023-02/msg00089.html> for prompting me to take a
+ another look at this.
+
+2023-02-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/latin2_works.sh:
+ * tmac/tests/latin5_works.sh:
+ * tmac/tests/latin9_works.sh: Port to work around macOS's
+ apparently POSIX non-conforming 'od' command. Use single-byte
+ octal output format instead of "character", and update test
+ expectations accordingly. Apparently gratuitously, macOS also
+ puts more spaces after the octal address field when using this
+ output format.
+ * HACKING: Document, and elaborate upon, this problem.
+
+2023-02-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Port a test to work with macOS sed.
+
+ * tmac/tests/doc_heading-font-remapping-works.sh: Put semicolons
+ between commands and closing braces in sed script. Put each of
+ multiple closing braces on a separate input line, because macOS
+ doesn't accept them otherwise. Resolves test failure observed
+ on macOS.
+ * HACKING: Document the closing brace sequence problem.
+
+2023-02-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Port a test to work with macOS sed.
+
+ * tmac/tests/an_TS-adds-no-vertical-space.sh: Put semicolons
+ between commands and closing braces in sed script. Separate
+ command stream into multiple '-e' expressions, breaking them
+ after branch and label commands. Resolves test failure observed
+ on macOS.
+ * HACKING: Document the above problems.
+
+2023-02-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/tests/\
+ some_escapes_accept_newline_delimiters.sh: Weaken regexes in two
+ test cases to accommodate excessive output from macOS's 'od'
+ command. Resolves test failure seen on macOS.
+ * HACKING: Add section "Writing Tests" and document the above
+ since this is the second time I've cracked my shin on this.
+
+2023-02-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/tests/basic-fonts-present.sh: Skip test if 'gs'
+ command not available. The test is to ensure that gropdf will
+ produce sound documents using the base fonts from PostScript,
+ but since gropdf requires Ghostscript to do this (as noted in
+ our "./configure" messages), it makes no sense to validate font
+ availability if the program is absent. Resolves test failure
+ seen on macOS with minimal dependencies installed.
+
+2023-02-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Manipulating Filling and Adjustment): Say more
+ about the consequences of a break.
+
+ Fixes <https://savannah.gnu.org/bugs/?63777>. Thanks to Dave
+ Kemper for the report.
+
+2023-02-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [docs]: Re-re-christen 'ESCAPE_AMPERSAND' ('\&'). Now call it a
+ {non-transparent} "dummy character". Also rechristen
+ 'ESCAPE_RIGHT_PARENTHESIS', ('\)') as the "transparent dummy
+ character"; it has no impact on sentence-ending detection.
+
+ * doc/groff.texi:
+ * doc/meref.me.in:
+ * man/groff.7.man:
+ * man/groff_diff.7.man:
+ * man/roff.7.man:
+ * src/preproc/refer/refer.1.man:
+ * tmac/groff_man.7.man.in: Do it.
+
+ Fixes <https://savannah.gnu.org/bugs/?62816>. Thanks to Dave
+ Kemper for the report and to the groff mailing list for the
+ vigorous discussion. I don't expect my solution to please
+ everyone.
+
+2023-02-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac: Add internal register `an*MR-URL-format` to
+ select from a few known formats of man page hyperlink. There
+ are three known on macOS, and one used everywhere else.
+ * tmac/man.local: Document this feature so macOS users can enjoy
+ the OSC 8 hyperlink feature if their terminal application
+ supports it.
+
+ I hope that this feature will be a temporary measure while macOS
+ implements support for the man page URL format used everywhere
+ else in the world.
+
+ Fixes <https://savannah.gnu.org/bugs/?63768>. Thanks to John
+ Gardner for the report, research, consultation, and testing.
+
+2023-02-11 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ [BuildFoundries]: Fails if neither ghostcript nor URW fonts
+ are installed.
+
+ * font/devpdf/util/BuildFoundries.pl: When the change to hold
+ paths in an array, rather than a delimited string (see commit
+ 4ae4aeb6555f4f16c28fcb03eb1f56577826054c), the FindGSpath
+ subroutine should return a pointer to an empty array when the
+ call to ghostscript fails, rather than return an empty string,
+ as was done previously.
+
+ See <https://lists.gnu.org/archive/html/groff/2023-02/\
+ msg00042.html>; thanks to Bruno Haible for the report.
+
+2023-02-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Switch to using system's assert.h header file. It is futile to
+ attempt to preserve compatibility with ISO C90 systems by
+ providing a bespoke predicate-reporting assert() (a C99 feature)
+ when gnulib, which we require, itself demands C99. This ensures
+ that `static_assert` remains defined so that gnulib can use it.
+ Thanks to Bruno Haible for the consultation.
+ <https://lists.gnu.org/archive/html/groff/2023-02/msg00034.html>
+
+ * src/include/assert.h: Delete.
+
+ * src/devices/grodvi/dvi.cpp:
+ * src/devices/grolbp/lbp.cpp:
+ * src/devices/grolj4/lj4.cpp:
+ * src/include/itable.h:
+ * src/include/stringclass.h:
+ * src/libs/libbib/linear.cpp:
+ * src/libs/libbib/search.cpp:
+ * src/libs/libdriver/printer.cpp:
+ * src/libs/libgroff/assert.cpp:
+ * src/libs/libgroff/color.cpp:
+ * src/libs/libgroff/errarg.cpp:
+ * src/libs/libgroff/font.cpp:
+ * src/libs/libgroff/nametoindex.cpp:
+ * src/libs/libgroff/prime.cpp:
+ * src/libs/libgroff/relocate.cpp:
+ * src/libs/libgroff/searchpath.cpp:
+ * src/preproc/eqn/box.cpp:
+ * src/preproc/eqn/delim.cpp:
+ * src/preproc/eqn/pile.cpp:
+ * src/preproc/eqn/script.cpp:
+ * src/preproc/html/pre-html.cpp:
+ * src/preproc/pic/pic.h:
+ * src/preproc/preconv/preconv.cpp:
+ * src/preproc/soelim/soelim.cpp:
+ * src/roff/groff/groff.cpp:
+ * src/roff/troff/troff.h:
+ * src/utils/hpftodit/hpftodit.cpp:
+ * src/utils/indxbib/indxbib.cpp:
+ * src/utils/lkbib/lkbib.cpp:
+ * src/utils/lookbib/lookbib.cpp:
+ * src/utils/tfmtodit/tfmtodit.cpp: Respell "assert.h" inclusion
+ with angle brackets instead of quotation marks.
+
+ Fixes <https://savannah.gnu.org/bugs/?63078>.
+
+2023-02-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (token::next): Use correct kind of
+ null object in comparison. Fixes latent bug that would be
+ exposed if we were to migrate from zero literals to `nullptr`.
+
+2023-02-09 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ [gropdf] Parse multiple entries in 'papersize' as specified in
+ the groff_font man page. Reported by Ben Wong and fix based on
+ his patch, thanks.
+
+ * src/devices/gropdf/gropdf.pl: Parse papersize string for
+ possible multiple (space separated) entries. First valid entry
+ wins.
+
+ Fixes https://savannah.gnu.org/bugs/?63757
+
+2023-02-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Correct numerous typos and solecisms throughout the source tree.
+
+ * ChangeLog:
+ * ChangeLog.115:
+ * ChangeLog.116:
+ * ChangeLog.117:
+ * ChangeLog.118:
+ * ChangeLog.119:
+ * ChangeLog.121:
+ * ChangeLog.122:
+ * Makefile.am:
+ * NEWS:
+ * PROBLEMS:
+ * README:
+ * contrib/chem/chem.am:
+ * contrib/chem/chem.pl:
+ * contrib/glilypond/README.txt:
+ * contrib/glilypond/glilypond.pl:
+ * contrib/hdtbl/groff_hdtbl.7.man:
+ * contrib/mm/ChangeLog:
+ * contrib/mm/m.tmac:
+ * contrib/pdfmark/pdfmark.ms:
+ * doc/automake.mom:
+ * doc/groff.texi:
+ * doc/me-revisions:
+ * doc/webpage.ms:
+ * m4/lib-link.m4:
+ * man/groff.7.man:
+ * man/groff_diff.7.man:
+ * man/roff.7.man:
+ * src/devices/grohtml/post-html.cpp:
+ * src/devices/grolbp/lbp.h:
+ * src/devices/gropdf/TODO:
+ * src/devices/gropdf/gropdf.1.man:
+ * src/devices/gropdf/gropdf.pl:
+ * src/devices/xditview/ChangeLog:
+ * src/devices/xditview/xditview.c:
+ * src/libs/libdriver/input.cpp:
+ * src/libs/libgroff/glyphuni.cpp:
+ * src/preproc/eqn/eqn.1.man:
+ * src/preproc/grn/gprint.h:
+ * src/preproc/grn/main.cpp:
+ * src/preproc/html/pre-html.cpp:
+ * src/preproc/preconv/preconv.cpp:
+ * src/preproc/tbl/table.cpp:
+ * src/roff/groff/pipeline.c:
+ * src/roff/groff/tests/substring_works.sh:
+ * src/roff/groff/tests/
+ use_point_size_escape_with_single_digit_arg.sh:
+ * src/roff/troff/div.cpp:
+ * src/roff/troff/input.cpp:
+ * src/roff/troff/troff.1.man:
+ * src/utils/grog/grog.pl:
+ * src/utils/indxbib/indxbib.cpp:
+ * src/utils/tfmtodit/tfmtodit.1.man:
+ * tmac/doc-old.tmac:
+ * tmac/doc.tmac:
+ * tmac/groff_man.7.man.in:
+ * tmac/hyphen.fr: Do it.
+
+ Fixes <https://savannah.gnu.org/bugs/?63589>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2023-02-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Drop XFAIL test. It was written with an unclear
+ understanding of how DWB (AT&T) and Heirloom Doctools troff
+ behaved. The individual checks might come back, modified.
+
+ * src/preproc/tbl/tests/table-lacks-spurious-top-border.sh:
+ Delete.
+
+ * src/preproc/tbl/tbl.am (tbl_TESTS): Drop it.
+ (tbl_XFAIL_TESTS, XFAIL_TESTS): Drop now empty assignment and
+ unnecessary update, respectively.
+
+2023-02-04 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Update gnulib submodule
+
+ gnulib now points on sha1 4e9fcc7b84fcac07a3e5a3cd5f66d1ff320dc8e8
+
+2023-02-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Fix bugs using boxes or vertical rules at table edges on
+ nroff devices, particularly when combined with region or column
+ expansion.
+
+ * src/preproc/tbl/table.h (class table): Add `GAP_EXPAND`
+ enumeration constant. James Clark seems to have designed GNU
+ tbl carefully to avoid distinguishing region expansion from
+ column expansion in a categorical way, but I needed a way for
+ formatting-time logic to know which was in use. (Column
+ expansion, the "x" modifier, expands columns--i.e., text.
+ Region expansion expands [or compresses] the _gaps_ between
+ columns.)
+ * src/preproc/tbl/main.cpp (process_options): Set `GAP_EXPAND`
+ flag in table if "expand" region option seen.
+ * src/preproc/tbl/table.cpp: Add new macro `LEFTOVER_FACTOR_REG`
+ to name a new roff register for the remainder of gap-expansion
+ space when the amount of space available for expansion is
+ divided by the number of gaps.
+ (table::compute_overall_width): If _not_ expanding a table in
+ either respect and in nroff mode, reduce line length by 1n for
+ each of any left and right border (because the vertical lines
+ eat character cells). This prevents bordered or boxed tables
+ from being overset even when they use neither expansion feature.
+ (table::compute_separation_factor): If gap-expanding a table,
+ store any remainder from the division used to compute the
+ separation factor into the new `LEFTOVER_FACTOR_REG`.
+ (table::compute_column_positions): Insert that remainder into
+ the gap before the last (rightmost) column of the table. This
+ _could_ be done more elegantly by spreading each en in a
+ symmetric way across a subset of the gaps. (It is necessarily a
+ subset by the pigeonhole principle.) But it didn't seem worth
+ the effort for a feature (region expansion) that few users
+ employ. (Usually what you want is the "x" column modifier.)
+ Alternatively, "forget it, Jake--it's a terminal emulator".
+
+ * src/preproc/tbl/tbl.am (tbl_XFAIL_TESTS): Remove now-passing
+ tests.
+
+ Fixes <https://savannah.gnu.org/bugs/?63640> and
+ <https://savannah.gnu.org/bugs/?63749>.
+
+2023-02-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/table.cpp (table::compute_column_positions):
+ Stop multiplying the gaps at the left and right edges of a table
+ {which occur when it is boxed or has a leading and/or trailing
+ vertical line} by the column separation factor. Only interior
+ column gaps should be spread. This change prevents tables using
+ the "expand" region option from being overset (exceeding the
+ line length), but might not (yet) fully expand to that length on
+ low-resolution devices due to integer roundoff.
+
+2023-02-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/table.cpp (table::compute_total_separation)
+ (table::compute_separation_factor, table::compute_widths): Add
+ comments to generated roff output to assist the mystified user.
+
+2023-02-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Refactor.
+
+ * src/preproc/tbl/table.cpp:
+ * src/preproc/tbl/table.h: Rename `compute_expand_width` to
+ `compute_overall_width`, since this member function is used on
+ _all_ tables, not just those undergoing column or gap expansion.
+ For instance, in a post-groff 1.22.4 development, it throws a
+ diagnostic if an unexpanded table overruns the line length.
+ * src/preproc/tbl/table.cpp (table::compute_widths): Update call
+ site of `compute_overall_width`.
+ * src/preproc/tbl/table.cpp: Split the roff register behind the
+ `EXPAND_REG` C++ preprocessor macro into two, adding
+ `AVAILABLE_WIDTH_REG`. Annotate the distinction.
+ (compute_overall_width): Annotate. Move and conditionalize
+ logic so as not to produce as much unnecessary roff output.
+
+2023-02-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/main.cpp (main): Avoid reading from invalid
+ memory upon failure to open an input file.
+
+ Fixes <https://savannah.gnu.org/bugs/?63751>.
+
+2023-02-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/eqn/lex.cpp (get_delimited_text): Avoid reading
+ from invalid memory when throwing diagnostic. Duplicate
+ `filename` string, then free it on all paths out of function.
+
+ Fixes <https://savannah.gnu.org/bugs/?63214>.
+
+2023-02-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Add more tests.
+
+ * src/preproc/tbl/tests/boxes-and-vertical-rules.sh:
+ * src/preproc/tbl/tests/expand-region-option-works.sh:
+ * src/preproc/tbl/tests/x-column-modifier-works.sh: Do it.
+
+ * src/preproc/tbl/tbl.am (tbl_TESTS): Run tests.
+ (tbl_XFAIL_TESTS): Add; future changes will resolve these.
+
+2023-02-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/table.cpp (table::compute_column_positions):
+ If a table has "left separation" (it is boxed, or has a vertical
+ rule on the left-hand side), increase the first column's start
+ register value by 1n, for symmetry with the right-hand size.
+
+ * src/preproc/tbl/tests/check-horizontal-line-length.sh:
+ * src/preproc/tbl/tests/check-line-intersections.sh:
+ * src/preproc/tbl/tests/check-vertical-line-length.sh: Update
+ output expectations.
+
+ * src/preproc/tbl/tbl.am (tbl_XFAIL_TESTS): Remove now-passing
+ test.
+
+ See <https://savannah.gnu.org/bugs/?61597> for background.
+
+2023-02-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/table.cpp (table::compute_total_separation):
+ Trivially refactor; rename loop indices so it's obvious which
+ dimension of a matrix they're referring to.
+
+2023-02-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/table.cpp (table::determine_row_type)
+ (table::compute_widths, table::do_row): Boolify some local ints.
+
+2023-02-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Refactor handling of vertical lines in format. Validate
+ input more strictly. Add diagnostics when vertical lines are
+ redundant with box borders.
+
+ * src/preproc/tbl/main.cpp (process_format): Shift diagnostic
+ about excess vertical lines in a sequence at the beginning of a
+ row description to later, after the first proper column
+ descriptor has been interpreted. Normalize a sequence of more
+ than two consecutive vertical lines to 2 when they occur at the
+ beginning of a row description. Unconditionally update
+ `list->vline` and reset `vline_count` once we start looking for
+ modifiers, since we know we've finished any sequence of vertical
+ lines, and at the end of a row definition. Rename and retype
+ loop variable int `success` to Boolean
+ `is_valid_modifier_sequence`. Drop now-invalid assertion.
+ * src/preproc/tbl/table.cpp (table::add_vlines): Throw new
+ diagnostics when vertical lines are redundant with box borders.
+ Add assertion to ensure we got a valid vertical line value (0,
+ 1, or 2) from `process_format`. Throw these only once per table
+ format, not for every row.
+
+2023-01-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/main.cpp (process_table): Trivially refactor.
+ Rename `form` to `fmt` to imply "format", not "form".
+
+2023-01-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/main.cpp (process_format): Throw error
+ diagnostic if more than 2 vertical lines are specified at the
+ beginning of a row definition.
+
+ Fixes <https://savannah.gnu.org/bugs/?63731>.
+
+2023-01-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/main.cpp (process_format): Recast diagnostic
+ message to refer to character by its Unicode name and generalize
+ to accurately cover additional circumstance of excess '|'
+ symbols at end of row definition.
+
+2023-01-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/ms.ms: Remove redundant initializations.
+
+2023-01-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/ms.ms: Define appropriate hyphen-minus mapping on 'cp1047'
+ output device.
+
+2023-01-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac (TE): Enable no-space mode after outputting the
+ display distance vertically, replacing any inter-paragraph
+ distance that might follow.
+
+2023-01-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grohtml]: Fix misleading diagnostic message.
+
+ * src/preproc/html/pre-html.cpp (main): The suggestion should be
+ to re-run the formatter (groff, troff), not "pre-grohtml", with
+ a different output driver since the document may be malformed.
+
+2023-01-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/main.cpp (process_format): Fix code hygiene
+ nit: nullify `list` pointer after freeing its target.
+
+2023-01-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Really fix Savannah #63449.
+
+ * src/preproc/tbl/main.cpp (process_format): "Or" on the
+ `HAS_TOP_VLINE` flag if the format specification begins with a
+ "|"; the beginning is a separate state in the FSM used to parse
+ the description. I missed it in commit 0e93ab4102, 1 December.
+
+ Fixes <https://savannah.gnu.org/bugs/?63449>.
+
+2023-01-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/tests/\
+ do-not-overdraw-page-top-in-nroff-mode.sh: Correct erroneous
+ check of test output, and add two more test cases.
+
+2023-01-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-ext.tmac: Move the saving of the hyphenation mode from
+ the "top level" to...
+ (mY): ...this new macro.
+ (SY, mQ, MR): Call `mY` before disabling hyphenation.
+
+ Problem introduced by me in commit 096c2f0567, 16 February.
+ "an-ext.tmac" gets sourced by "an.tmac" before any
+ command-line setting of the `HY` register is handled, so (for
+ groff) the stored hyphenation mode was the default for the
+ language, not reflecting user disablement. The synopsis macros,
+ which do not have an alternate implementation in "an.tmac" for
+ leverage of groff features, were causing hyphenation to be
+ resurrected (after `YS`) even if the user had disabled it.
+ Saving the hyphenation mode anew upon entry to these macros is
+ arguably inefficient, but it is more correct since a man page
+ could conceivably manipulate the automatic hyphenation mode
+ {even if that's not recommended outside of tbl(1) text blocks}.
+
+2023-01-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Add regression test for hyphenation getting wrongly
+ restored by `YS`, `ME`, `UE`, and `MR` macros.
+
+ * tmac/tests/an_HY-register-works.sh: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2023-01-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-common (Sh, Ss): Narrow scope of font remappings
+ lexically and restrict remapping to the heading font family (if
+ any) to avoid undesired remapping of fonts in page headers if,
+ say, a (sub)section heading begins just prior to a page
+ break--which is ugly anyway and should be avoided, but the
+ package has no keep macros and solving that problem in an
+ automatic way promises to be complex.
+
+2023-01-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac (MT, UR): Throw style warning if macro called
+ without (exactly one) argument.
+
+2022-12-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (doc/groff-man-pages.pdf): Set (sub)section
+ headings in Helvetica bold in compiled man pages, as a test and
+ demonstration of the `HF` feature's application to both man(7)
+ and mdoc(7) documents.
+
+2022-12-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Support `HF` string.
+
+ * tmac/doc.tmac (initialization): Add logic supporting `HF`
+ string just as our man(7) implementation does. If the font name
+ ends with `B` (as the default does), set
+ `doc-remap-I-style-in-headings` register and extract font
+ family, which can be empty (as is the default).
+ * tmac/mdoc/doc-common (Sh, Ss): If
+ `doc-remap-I-style-in-headings` register set, perform (and
+ unwind) font remapping of italic to bold-italic face.
+ * tmac/mdoc/doc-ditroff:
+ * tmac/mdoc/doc-nroff: Define `doc-Sh-font` in terms of `HF`.
+
+ * tmac/tests/doc_heading-font-remapping-works.sh: Test it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+ * tmac/groff_mdoc.7.man (Options): Document it.
+ * NEWS: Update item.
+
+ Fixes last part of <https://savannah.gnu.org/bugs/?63046>.
+
+2022-12-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tmac]: Revise "fallback" character definitions in several
+ respects for Unicode characters from General Punctuation block.
+
+ * tmac/fallbacks.tmac: Comment out fallbacks for U+200B, U+2010,
+ U+2011, and U+201[89CD], due to ineffectuality or apparent groff
+ bugs. Redefine U+2012 fallback to include hair space (\^)
+ around synthetic figure dash. Redefine U+2016 to use `\[ba]`
+ special characters instead of ordinary `|` characters to dodge
+ possible character translations by user.
+
+ Fixes part of <https://savannah.gnu.org/bugs/?63354>. Thanks to
+ Dave Kemper for the (multifarious) discussion.
+
+2022-12-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Invoking groff, Built-in Registers):
+ * man/groff.7.man (Writable predefined registers):
+ * src/roff/groff/groff.1.man (Environment):
+ * src/roff/troff/troff.1.man (Environment): Replace erroneous
+ reference to ctime(3) with localtime(3).
+
+ Fixes <https://savannah.gnu.org/bugs/?63509>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2022-12-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tests]: Fix potential problem(s) in trap handler.
+
+ * src/roff/groff/tests/smoke-test_html_device.sh: Move call of
+ `cleanup` function from end of script to after the tests that
+ generate temporary files have been run, and before script
+ possibly exits with status 77 to skip some checks. Within trap
+ handler, mask trapped signals while running handler.
+ (cleanup): Reset trap dispositions to default after removing
+ files; once the temporary files are gone, we no longer need a
+ trap handler. One might already be running however, and this
+ ensures that its "suicide" ("kill -s INT $$") will succeed.
+
+2022-12-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Support `FT` register.
+
+ * tmac/doc.tmac (initialization): Add logic supporting `FT`
+ register just as our man(7) implementation does.
+ * tmac/mdoc/doc-common (doc-set-up-titles): Plant footer trap in
+ validated user-requested location.
+ * tmac/groff_mdoc.7.man (Options): Document it.
+ * NEWS: Update item.
+
+ Fixes part of <https://savannah.gnu.org/bugs/?63046>.
+
+2022-12-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac: Fix code style nit: use `as` requests to
+ avoid overlong input lines.
+
+2022-12-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/doc.tmac: Inform user we're ignoring their "-rD1" setting
+ if also formatting HTML; parallels groff man(7) behavior.
+
+2022-12-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/doc.tmac: Trivially refactor. Relocate handling of `D`
+ command-line register to prepare for greater synchronization
+ with groff man(7).
+
+2022-12-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/table.cpp: Trivially refactor. Rename
+ {portion of} internal register to include an interword hyphen
+ for readability.
+
+2022-12-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Change default line length to 6.5 inches.
+
+ * tmac/s.tmac (par@load-init): Do it.
+
+ * doc/groff.texi (ms Document Control Settings):
+ * doc/ms.ms (Document control settings):
+ * tmac/groff_ms.7.man (Document control settings): Document it.
+
+ * tmac/tests/s_honor-MINGW-when-two-columns.sh:
+ * tmac/tests/s_mark-column-start-correctly.sh: Update test
+ expectations.
+
+ * NEWS: Add item.
+
+2022-12-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac (TH): Relocate `an-break-body-text` trap to be
+ one half-inch above footer (instead of twice the footer
+ distance). I reason that anyone who customizes `FT` is doing so
+ to overprint some kind of material at the bottoms of pages, or
+ simply to make the margin larger. (One then wonders why we
+ don't have an `HD` register for the top.) Also remove register
+ when done with it.
+ * tmac/groff_man.7.man.in (Options) <FT>: Document this.
+
+2022-12-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac (TH): Trivially refactor. Rename
+ `an-footer-location` to `an*footer-location` and set page traps
+ in order descending the page.
+
+2022-12-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Support `X` register.
+
+ * tmac/doc.tmac (initialization): Add logic supporting `X`
+ register just as our man(7) implementation does.
+ * tmac/groff_mdoc.7.man (Options): Document it.
+ * NEWS: Update item.
+
+ Fixes part of <https://savannah.gnu.org/bugs/?63046>.
+
+2022-12-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Add unit test for `X` register.
+
+ * tmac/tests/doc_X-register-works.sh: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-12-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/doc.tmac (Nm): Fix `if` -> `ie` typo/thinko.
+
+ Fixes <https://savannah.gnu.org/bugs/?63527>. Thanks to John
+ Gardner for the report.
+
+2022-12-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/doc_Nm-works.sh: Add more checks.
+
+2022-12-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/tests/smoke-test_html_device.sh: Add checks for
+ inlining of images when tbl(1) or eqn(1) used.
+
+2022-12-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/andoc.tmac (reload-man): Unplant `doc-break-body-text`
+ trap, added in commit 892703b17e, 6 September. Its survival
+ into man(7) pages didn't seem to cause any problems but I have
+ no confidence that will remain true forever.
+
+2022-12-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac (initialization): Fix problem with `FT` register
+ validation. Small but valid values were being rejected due to
+ inappropriate use of scaling operator. Also throw user a bone
+ by expressing what size '1v' is for the output device, in basic
+ units.
+
+2022-12-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man, mdoc]: Fix Savannah #63500. Support use of `P` (initial
+ page number) register when batch rendering, regardless of
+ switching macro packages between man(7) and mdoc(7) or setting
+ of `C` (continuous numbering) register. (`P` without `C` means
+ "start numbering each rendered document at \n[P]".)
+
+ * tmac/an.tmac (an-end): Call `an*break-page-with-new-number`
+ instead of invoking `bp`.
+ (an*break-page-with-new-number): If `P` is set and `C` is not,
+ use value of `P` as the next page number.
+ (TH): If `C` register is set, remove `P` register after ending a
+ previous document.
+ (initialization): If `P` is set, assign the page number using
+ the `pn` request if the transition to the first formatted page
+ has not yet occurred; otherwise update page number register `%`
+ directly. Also ignore it with diagnostic if `ps4html` register
+ {for grohtml's internal use} is set. Add explanatory comment.
+
+ * tmac/mdoc/doc-common (Dd): If `C` register is set, remove `P`
+ register after ending a previous document.
+ (doc-end-macro): Call `doc-break-page-with-new-number` instead
+ of invoking `bp`.
+ (doc-break-page-with-new-number): If `P` is set and `C` is not,
+ use value of `P` as the next page number.
+ * tmac/doc.tmac (initialization): If `P` is set, assign the page
+ number using the `pn` request if the transition to the first
+ formatted page has not yet occurred; otherwise update page
+ number register `%` directly. Also ignore it with diagnostic if
+ `ps4html` register (for grohtml's internal use) is set. Add
+ explanatory comment.
+
+ Fixes <https://savannah.gnu.org/bugs/?63500>.
+
+2022-12-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Support `P` register.
+
+ * tmac/doc.tmac (initialization): Add logic supporting `P`
+ register just as our man(7) implementation does.
+ * tmac/groff_mdoc.7.man (Formatting with groff, troff, and
+ nroff): Document it.
+ * NEWS: Update item.
+
+ Fixes part of <https://savannah.gnu.org/bugs/?63046>.
+
+2022-12-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tests]: Add unit tests for man/mdoc `P` register.
+
+ * tmac/tests/an_P-register-works.sh:
+ * tmac/tests/andoc_P-register-works.sh:
+ * tmac/tests/doc_P-register-works.sh: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run tests.
+
+2022-12-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man, mdoc]: Refactor. Rename a Boolean register to more
+ clearly communicate its purpose. This also reverses its sense.
+
+ * tmac/an.tmac (TH): Rename `an-is-first-page-of-document` to
+ `an*need-titles-reset`. Drop redundant store. Reverse sense of
+ test.
+ (initialization): Initialize it to zero.
+
+ * tmac/mdoc/doc-common (Dd): Rename
+ `doc-is-first-page-of-document` to `doc-need-titles-reset`.
+ Drop redundant store. Reverse sense of test.
+ (initialization): Initialize it to zero.
+
+2022-12-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tests]: Add future regression test for header/footer
+ mishandling that wasn't already covered (not a live bug; was
+ exposed by attempted refactoring).
+
+ * tmac/tests/andoc_check-an-to-doc-transition.sh: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-12-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man, mdoc]: Trivially refactor.
+
+ * tmac/an.tmac (an-start-new-document): Rename this...
+ (an*break-page-with-new-number): ...to reflect its reduced
+ responsibility.
+
+ * tmac/mdoc/doc-common (doc-start-new-document): Rename this...
+ (doc-break-page-with-new-number): ...to reflect its reduced
+ responsibility.
+
+2022-12-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man, mdoc]: Refactor to separate page number management from
+ header trap management.
+
+ * tmac/an.tmac (an-start-new-document): Stop removing
+ `an-header` trap.
+ (TH): Clear the trap here even if not continuously rendering,
+ and call `an-start-new-document`.
+
+ * tmac/mdoc/doc-common (doc-start-new-document): Stop removing
+ `doc-header` trap.
+ (Dd): Clear the trap here even if not continuously rendering,
+ and call `doc-start-new-document`.
+
+2022-12-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-common: Refactor for better parallelism with our
+ man(7) implementation and to prepare for a synchronized change
+ to both.
+ (Dd): Move open-coded (inlined) operations from here...
+ (doc-start-new-document): ...to this new macro.
+ (doc-end-macro): Drop unnecessary register assignment. `Dd`
+ takes care of it if there is a subsequent mdoc(7) document.
+
+2022-12-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Fix off-by-one error in generated diagnostic message.
+
+ * src/preproc/tbl/table.cpp: Define new preprocessor macro,
+ `PREVIOUS_PAGE_REG`.
+ (table::init_output): Compute value for register named using
+ `PREVIOUS_PAGE_REG`, use it in diagnostic, and then remove it.
+ Also fix verb tense in message.
+
+2022-12-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Expose the fact of a table's boxedness via a troff
+ register so that macro packages can make more intelligent
+ decisions about space requirements (since box borders occupy
+ significant space on nroff devices).
+
+ * src/preproc/tbl/table.cpp: Define new preprocessor macro,
+ `IS_BOXED_REG`.
+ (table::do_top): Initialize "boxedness" register.
+
+2022-12-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac (TH): Clarify computation and diagnostic message.
+
+2022-12-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Fix Savannah #61878.
+
+ * src/preproc/tbl/table.cpp: Define new preprocessor macro,
+ `STARTING_PAGE_REG`.
+ (table::define_bottom_macro): Have the formatter issue a warning
+ if an unkept, boxed table ends on a different page than it
+ began.
+ (table::do_top): Save current page number when table begins.
+
+ Fixes <https://savannah.gnu.org/bugs/?61878>.
+
+2022-12-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Regression-test Savannah #61878.
+
+ * src/preproc/tbl/tests/\
+ warn-on-long-boxed-unkept-table.sh: Do it.
+ * src/preproc/tbl/tbl.am (tbl_TESTS): Run test.
+
+2022-12-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/table.cpp: Write comments to generated output;
+ these correspond to functions in this file and to major
+ operations of table construction.
+ (init_output, compute_widths, define_bottom_macro, do_row)
+ (do_top, do_bottom): Do it.
+
+2022-12-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Trivially refactor. Rename class `constant_int_reg` to
+ `readonly_register`. Say "readonly" instead of "const" to
+ try to avoid confusion with C++ constness. Drop "int" because
+ integer-valued registers are the norm, not the exception.
+
+ * src/roff/troff/column.cpp (init_column_requests):
+ * src/roff/troff/div.cpp (init_div_requests):
+ * src/roff/troff/input.cpp (top level, init_input_requests):
+ * src/roff/troff/node.cpp (init_node_requests):
+ * src/roff/troff/reg.h: Do it.
+
+2022-12-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Trivially refactor. Rename class `constant_reg` to
+ `readonly_text_register`. Say "readonly" instead of "const" to
+ try to avoid confusion with C++ constness. Say "text" because
+ this class is _mostly_ used for interpolation of string-valued
+ registers like the version registers `.x`, `.y` and `.Y`.
+ Nevertheless there are some abuses (apparently because the
+ constructors for register classes don't accept integer
+ parameters for initialization--why?).
+
+ * src/roff/troff/input.cpp (top level)
+ (readonly_text_register::readonly_text_register)
+ (readonly_text_register::get_string)
+ (main, init_registers, init_requests): Do it.
+
+2022-12-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Trivially refactor. Rename `number_reg_dictionary` to
+ `register_dictionary`. It's shorter _and_ non-abbreviated _and_
+ matches our documentation.
+
+ * src/roff/troff/column.cpp (init_column_requests):
+ * src/roff/troff/div.cpp (page_number, init_div_requests):
+ * src/roff/troff/env.cpp (print_env, init_env_requests)
+ (init_hyphen_requests):
+ * src/roff/troff/input.cpp (length_request)
+ (interpolate_number_format, do_register, do_if_request, main)
+ (init_registers, init_input_requests):
+ * src/roff/troff/node.cpp (get_register, init_node_requests):
+ * src/roff/troff/reg.cpp (top level, define_number_reg)
+ (inline_define_reg, alter_format, remove_reg, alias_reg)
+ (rename_reg, print_number_regs):
+ * src/roff/troff/reg.h: Do it.
+
+2022-12-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Add regression test.
+
+ * tmac/tests/an_link-trailing-text-hugs-previous.sh: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-12-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/fallbacks.tmac: Really use troff-mode fallbacks only on
+ typesetting devices; because this macro file is loaded so early,
+ we cannot rely on ".if t". Thanks to Dave Kemper for the
+ discussion in Savannah #63354.
+
+2022-12-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-ext.tmac: Use more mnemonic register names, thanks to
+ the recent freeing up of some name space.
+ - mJ -> mH: saved automatic hyphenation mode
+ - mX -> mE: formatting in EX/EE context (Boolean)
+
+2022-12-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/pdf.tmac: Drop deletion of unused string `PDFHREF.TEXT`.
+
+2022-12-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac (an-end, AT, UC, DT, PD, SH, IP, BI, BR, IB, IR)
+ (RB, RI, OP, an*end-hyperlink, MR): Refactor; "nop"ify macros
+ that produce formatted output or call other macros using string
+ interpolations--except where we can't: see Savannah #63470.
+
+2022-12-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac (R): Drop macro definition, which implements a
+ hack for people who try to use "R" as a font style macro. This
+ doesn't seem to happen much in actual practice (though perhaps
+ the diagnostic this hack produces is responsible for suppression
+ of the mistake). Retaining it interferes with the
+ "nop"-ification of this macro file.
+ * NEWS: Add item.
+
+2022-12-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-ext.tmac: Use truly traditional hyphenation mode on
+ non-groff-compatible formatters.
+
+2022-12-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Update test coverage and expectations.
+
+ * tmac/tests/an_ME-punct-hyphenates.sh: Test both "an.tmac" and
+ "an-ext.tmac" implementations of `ME`.
+ * tmac/tests/an_UE-punct-hyphenates.sh: Test both "an.tmac" and
+ "an-ext.tmac" implementations of `UE`.
+ * tmac/tests/an_UE-breaks-before-long-URIs.sh: Update test
+ expectations. I appear to have inadvertently fixed some
+ inelegant rendering.
+
+2022-12-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tests]: Rename to reflect code reorganization.
+
+ * tmac/tests/an-ext_ME-punct-hyphenates.sh:
+ * tmac/tests/an-ext_MT-body-hyphenates.sh:
+ * tmac/tests/an-ext_UE-breaks-before-long-URIs.sh:
+ * tmac/tests/an-ext_UE-punct-hyphenates.sh:
+ * tmac/tests/an-ext_UR-body-hyphenates.sh: Rename these...
+ * tmac/tests/an_ME-punct-hyphenates.sh:
+ * tmac/tests/an_MT-body-hyphenates.sh:
+ * tmac/tests/an_UE-breaks-before-long-URIs.sh:
+ * tmac/tests/an_UE-punct-hyphenates.sh:
+ * tmac/tests/an_UR-body-hyphenates.sh: ...to these.
+
+ * tmac/tmac.am (tmac_TESTS): Reflect renames.
+
+2022-12-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-ext.tmac: Remove groff-feature-dependent code for
+ hyperlink management, greatly reducing the size of the file,
+ which we permissively license and encourage people to copy
+ around. Drop register definitions corresponding to
+ groff-specific output device names. Drop definition and use of
+ `mL` and `mR` strings for angle brackets; no observable change
+ on non-groff formatters. Recognize `mG` register to enable
+ testing of these macros even if the formatter is groff.
+ (mV): Radically simplify. This internal "back-end" for `MT` and
+ `UR` now just stores its argument in a string, `m1`.
+ (mQ): Radically simplify. This internal "back-end" for `ME` and
+ `UE` now just disables automatic hyphenation, formats the saved
+ `m1` string between angle brackets, suffixes it with the
+ optional argument, and restores automatic hyphenation.
+ (UR, MT): Call `mV` with one argument, not nine.
+ (UE, ME): Call `mQ` with one argument, not nine.
+
+ * tmac/tests/an-ext_MR-works.sh: Add test of this file's
+ simplified `MR` implementation.
+ * tmac/tests/an-ext_MT-works.sh:
+ * tmac/tests/an-ext_UR-works.sh: Move tests of groff-specific
+ hyperlink output from here...
+ * tmac/tests/an_MT-works.sh:
+ * tmac/tests/an_UR-works.sh: ...to these new files.
+ * tmac/tests/an_MR-works.sh:
+ * tmac/tests/an_MT-works.sh:
+ * tmac/tests/an_UR-works.sh: Add tests for valid HTML formatting
+ of hyperlinks, which experience shows is a bit fragile in the
+ face of diversion manipulation and output line continuation.
+
+ * tmac/tmac.am (tmac_TESTS): Run new tests.
+
+2022-12-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-ext.tmac: Support `mG` register: clear it to force the
+ loading of this file's macros even if they have an
+ implementation in tmac/an.tmac and the formatter claims groff
+ compatibility. This is to ease these macros' testing under
+ groff and keep the implementations here simple.
+ * tmac/an.tmac: Initialize `mG` register to 1 if not set on
+ command line.
+
+2022-12-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-ext.tmac: Initialize `mX` register.
+
+2022-12-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-ext.tmac: Define `mC` string (constant-width typeface
+ used by `EX`/`EE` macros) as `R` in nroff mode. Thanks to
+ Russ Allbery for prompting me to think more about the
+ limitations of Solaris troff. Implementations do varying
+ things with the "previous" font restored by `\fP` or an
+ unargumented `.ft` if a requested font is not found.
+
+2022-11-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Fix Savannah #63449.
+
+ * src/preproc/tbl/table.h (class table): Add new enumeration
+ constants for use with `flags` member variable: `HAS_TOP_VLINE`
+ and `HAS_TOP_HLINE`, which track properties of the table.
+ Unlike others, these have no correspondence to table region
+ options.
+ * src/preproc/tbl/main.cpp (process_format): Add new local
+ Boolean to track whether we're interpreting a format for the
+ first row. Use this to "or" on the `HAS_TOP_VLINE` or
+ `HAS_TOP_HLINE` flags if "|" or [_-] are encountered in the
+ first row's format, as appropriate.
+ (process_data): "Or" on `HAS_TOP_HLINE` if a single or double
+ horizontal line is used as the first row's data.
+ * src/preproc/tbl/table.cpp (do_top): On nroff mode devices, add
+ one vee of space above the table if we're going to be drawing an
+ unintersected vertical rule above the table's top.
+
+ Fixes <https://savannah.gnu.org/bugs/?63449>.
+
+2022-11-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Regression-test Savannah #63449.
+
+ * src/preproc/tbl/tests/\
+ do-not-overdraw-page-top-in-nroff-mode.sh: Do it.
+ * src/preproc/tbl/tbl.am (tbl_TESTS): Run test.
+
+2022-11-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/main.cpp (struct input_entry_format)
+ (input_entry_format::input_entry_format)
+ free_input_entry_format_list, process_format): Trivially
+ refactor. Rename `pre_vline` to `vline_count`.
+
+2022-11-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/table.cpp
+ (vertical_rule::contribute_to_bottom_macro, table::print)
+ (table::init_output, table::divide_span)
+ (table::compute_expand_width, table::define_bottom_macro)
+ (table::do_bottom): Produce roff output that is more readable,
+ for maintainability. Indent control lines inside macro
+ definitions. Standardize form of `if`, `ie`, and `el` requests.
+ Some output will not be indented because it is produced within
+ narrowly-scoped C++ functions (set_troff_location,
+ table::print_single_hline, table::print_double_hline,
+ table::do_row), I haven't verified that each one is called from
+ a consistent troff indentation level, and I'm not sure it's a
+ win to parameterize those functions in the indentation level.
+
+2022-11-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Fix Savannah #61909.
+
+ * src/preproc/tbl/table.cpp (SAVED_INTER_WORD_SPACE_SIZE)
+ (SAVED_INTER_SENTENCE_SPACE_SIZE): Add new preprocessor macros.
+ (block_entry::do_divert): Restore saved inter-word and
+ inter-sentence space when formatting a text entry.
+ (table::init_output): When a table region begions, save the
+ values of inter-word and inter-sentence space. Add request to
+ the reset macro to restore saved inter-word and inter-sentence
+ space when leaving table region.
+ (table::do_top): Set inter-sentence space to be equal to
+ inter-word space. This way spaces are "literal" in ordinary
+ table extries (but not text blocks).
+
+ Fixes <https://savannah.gnu.org/bugs/?61909>.
+
+2022-11-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Regression-test Savannah #61909.
+
+ * src/preproc/tbl/tests/\
+ save-and-restore-inter-sentence-space.sh: Do it.
+ * src/preproc/tbl/tbl.am (tbl_TESTS): Run test.
+
+2022-11-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Suppress line numbering when formatting tables, and
+ restore it afterward.
+
+ * src/preproc/tbl/table.cpp: Revert much of commit b69062693's
+ {2011-07-20} changes to this file. They were too complex for me
+ to understand, and permitted Savannah #60140 to persist (or
+ caused it).
+ (ROW_START_LINE_REG, ROW_SAVE_LINE_REG, ROW_MAX_LINE_REG)
+ (REPEATED_NM_SET_MACRO, REPEATED_NM_SUS_MACRO): Drop
+ preprocessor macros.
+ (SAVED_NUMBERING_LINENO, SAVED_NUMBERING_SUPPRESSION_COUNT): Add
+ new preprocessor macros.
+ (table::init_output, table::print_single_hline)
+ (table::print_double_hline, table::define_bottom_macro)
+ (table::do_row, table::do_top, table::do_bottom): Drop old
+ logic.
+
+ (table::init_output): When the table begins, save the current
+ line number register `ln` and the count of remaining lines to be
+ suppressed (the new `.nn` register). Then suppress numbering
+ for the next 2 billion+ lines of output, with a groveling
+ apology to the elegance police.
+ (table::do_bottom): Restore saved value of `.nn`. If numbering
+ was active (even if suppressed), restore it with `nm` request.
+ If it wasn't, disable it, in case it was turned on inside the
+ table region.
+
+ Fixes <https://savannah.gnu.org/bugs/?60140>. Thanks to Hans
+ Bezemer for noting the practical significance of this bug.
+
+2022-11-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Regression-test Savannah #60140.
+
+ * src/preproc/tbl/tests/save-and-restore-line-numbering.sh: Do
+ it.
+ * src/preproc/tbl/tbl.am (tbl_TESTS): Run test.
+
+2022-11-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Implement new `.nn` register to report the remaining
+ count of lines to have their numbering suppressed.
+
+ * src/roff/troff/env.h (class environment): Declare new member
+ function `get_no_number_count()`.
+ * src/roff/troff/env.cpp (get_no_number_count): Define new
+ member function, returning value of member variable
+ `no_number_count`.
+ (init_env_requests): Define new ".nn" register and attach it to
+ `get_no_number_count()`.
+
+ * doc/groff.texi (Miscellaneous): Document it. Include example
+ of use to determine whether current output line will be
+ numbered. Also clarify meaning of register; `.nn` is not
+ decremented except when output line numbering is enabled.
+ * man/groff.7.man (Read-only registers): Document it.
+
+ * src/roff/groff/tests/dot-nn_register_works.sh: Test it.
+ * src/roff/groff/groff.am (groff_TESTS): Run test.
+
+ * NEWS: Add item.
+
+ See <https://lists.gnu.org/archive/html/groff/2022-11/\
+ msg00153.html>.
+
+2022-11-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/fallbacks.tmac: Comment out four of the fallback
+ character definitions for (preconv'd) Unicode character input
+ added to address Savannah #58930 (corresponding to \[dg], \[dd],
+ \[%0], and \[rn]; they are failing for not yet understood
+ reasons involving "macros" attached to groff character info
+ structs, and the semantics of what it means for a character to
+ "exist" per the 'c' conditional operator. Fixes regression when
+ using "tty-char.tmac" (which nroff loads by default). Problem
+ introduced by me in commit 132182bd71, 23 October. The hope is
+ to resolve this issue post-groff 1.23.0. Thanks to Dave Kemper
+ for the report and discussion in Savannah #63332.
+
+2022-11-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-ext.tmac (SY, YS, mV): Remove `mA`, `mI`, and `mT`
+ registers when done with them.
+
+2022-11-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/node.h (character_exists):
+ * src/roff/troff/node.cpp (character_exists): Boolify.
+
+2022-11-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [doc]: Add make(1) dependency.
+
+ * doc/doc.am (doc/groff-man-pages.pdf): Add dependency on our
+ FreeEuro font since we embed it.
+
+2022-11-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Refactor generation of "freeeuro.pfa" to make more
+ economical use of existing infrastructure, per a suggestion from
+ Deri James. This also puts the file where gropdf's "download"
+ file can find it when running it in a separate build directory.
+ We use it to generate "groff-man-pages.pdf".
+
+ * font/devps/freeeuro.pfa: Rename this...
+ * font/devps/freeeuro.ps: ...to this. We can now use the suffix
+ rule that also applies to "symbolsl.ps" and "zapfdr.ps".
+
+ * font/devps/devps.am (DEVPSFONTFILES): Move "freeeuro.pfa" from
+ here...
+ (DEVPSFONTFILES_GENERATED): ...to here.
+ (EXTRA_DIST): Ship the "new" "freeeuro.ps" file.
+
+2022-11-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devps/psstrip.sed: Stop stripping comment lines in
+ general instead of preserving only ones that use the form in the
+ Document Structuring Conventions. This way we won't strip
+ copyright notices, like Werner Lemberg's in the FreeEuro font.
+ Thanks to Deri James for pointing this out.
+
+2022-11-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ tmac/an-ext.tmac: Refactor to reduce code size.
+
+ * tmac/an-ext.tmac: Refactor to reduce code size. `UE` and `ME`
+ have nearly identical implementations so...
+
+ (mQ): Define new macro to perform the requisite actions, and...
+
+ (UE, ME): Make these into wrappers calling mQ.
+
+2022-11-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Add unit tests for `MT/ME` and `UR/UE`.
+
+ * tmac/tests/an-ext_MT-works.sh:
+ * tmac/tests/an-ext_UR-works.sh: Do it.
+
+ * tmac/tmac.am (tmac_TESTS): Run tests.
+
+2022-11-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/gropdf/gropdf.pl: Throw warning if paper format is
+ unrecognized.
+
+2022-11-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/gropdf/gropdf.pl (Msg): Align more closely with
+ diagnostic message format prescribed by GNU Coding Standards:
+ emit space (only) prior to message severity.
+
+2022-11-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/meref.me.in: Drop unnecessary initialization parameters
+ from document. The line and title length do not need to be set
+ in troff mode; the document lays out fine for a variety of paper
+ formats if these are not forced to 6.5 inches. Also drop
+ redundant initialization of `pp` register.
+
+2022-11-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Fix Savannah #63377.
+
+ * tmac/doc.tmac (Nm): Properly leverage new
+ `doc-in-name-section` variable. Set page topic `doc-topic-name`
+ to the first encountered argumentful `Nm` call in the "Name"
+ section while handling other "Name" section concerns, instead of
+ later after deciding we're not in the "Synopsis" section.
+ Problem caused by me when fixing antediluvian mdoc bug in commit
+ 0d85615c62, 5 November.
+
+ Fixes <https://savannah.gnu.org/bugs/?63377>. Thanks to John
+ Gardner for the report.
+
+2022-11-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Add tests for `Nm` macro.
+
+ * tmac/tests/doc_Nm-works.sh: Do it. Test regression reported
+ in Savannah #63377. Also ensure that we handle the case where
+ multiple `Nm` items are declared in the "Name" section (as might
+ happen in library man pages).
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-11-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/papersize.tmac: Improve integration with mm(7) macro
+ package. If a paper format has been selected, set `W` register
+ to new line length (if not already set on command line).
+ Similarly, set `O` register to 1 inch for the symmetric
+ horizontal margins otherwise assumed by this macro file. This
+ means that "groff -mm" and "groff -dpaper=letter -mm" are _not_
+ synonymous (when groff is configured to use U.S. letter as the
+ default paper format), because groff mm(7) uses a page offset of
+ 0.963 inches on typesetters for compatibility with DWB mm.
+ * NEWS: Add item.
+
+ See discussion in <https://lists.gnu.org/archive/html/\
+ groff/2022-11/msg00081.html> and (some) follow-ups.
+
+2022-11-16 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ * src/devices/gropdf/gropdf.pl: If the argument to the paper
+ format option '-p' matches a recognized format but includes a
+ trailing 'L' or 'l' ("legalL" or "a4l", for example), rotate the
+ document's MediaBox.
+
+2022-11-16 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ * src/devices/gropdf/gropdf.pl: Fix incorrect hotspot placement
+ if page is in landscape orientation.
+ (FixRect): Perform coordinate transform if page is rotated.
+ (Rotate): New function performs relevant trigonometry.
+
+ Fixes <https://savannah.gnu.org/bugs/?63380>. Thanks to Blake
+ McBride for the report.
+
+2022-11-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac: Integrate better with papersize.tmac by no longer
+ forcing line (and title) length to 6 inches for typesetters on
+ initialization. Gather default line length from output device
+ description, possibly modified later (by other macro file or
+ input). No change to terminal ("nroff mode") output.
+ * NEWS: Add item.
+
+2022-11-16 Peter Schaffter <peter@schaffter.ca>
+
+ * tmac/papersize.tmac: If a paper format has been selected,
+ smuggle right margin setting to mom(7) if not overridden by the
+ user. See discussion in <https://lists.gnu.org/archive/html/\
+ groff/2022-11/msg00081.html> and (some) follow-ups.
+
+2022-11-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (doc/groff-man-pages.pdf)
+ (doc/groff-man-pages.utf8.txt): Add dependencies on new
+ `TMAC_PACKAGE_MAN` and `TMAC_PACKAGE_MDOC` convenience macros.
+
+2022-11-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tmac.am (TMAC_PACKAGE_MAN, TMAC_PACKAGE_MDOC): Define
+ convenience macros for in-tree documents to depend on.
+
+2022-11-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac: Trivially refactor. Rename `an-section` to
+ `an*section`.
+
+2022-11-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grolbp/lbp.cpp (usage): Tweak usage message. The
+ output driver should be perfectly capable of handling output
+ from non-GNU (but device-independent) troffs.
+
+2022-11-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grops/ps.cpp (usage): Employ more informative
+ metasyntactic variable names in usage message. Also summarize
+ program's function and direct reader to man page if help
+ explicitly requested (inferred from identity of output stream).
+
+2022-11-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac: Trivially refactor for congruence with
+ documentary terminology. Rename strings and macros.
+ - an-title -> an*topic
+ - an-abbreviate-page-title -> an*abbreviate-page-topic
+ - an-title-abbv -> an*topic-abbv
+ - an-title-string -> an*topic-string
+ - an-title-length -> an*topic-length
+ - an-title-length-prev -> an*topic-length-prev
+ - an-title-new-length -> an*topic-new-length
+ - an-page-title-style -> an*topic-style
+ (TH): Recast diagnostic message to refer to "section", not
+ "volume" title.
+
+2022-11-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-ext.tmac: Refactor to reduce code size. `UR` and `MT`
+ have identical implementations so...
+ (mV): Define new macro to perform the requisite actions, and...
+ (UR, MT): Make these into wrappers calling mV.
+
+2022-11-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-ext.tmac (UR, MT): Fix problem with incorrect line
+ lengths and occasional "can't adjust" warnings when using
+ hyperlinks. Reduce the line length within the diversion by the
+ amount of indentation used in the context. Without this, lines
+ were getting set too short. (You might think they'd be too
+ long, but when creating a new environment, the _formatter's_
+ default line length is used; that's 65n on terminal devices.)
+
+2022-11-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Add test to ensure that link text (when the hyperlink
+ itself is not formatted because the device supports
+ hyperlinking) uses the correct line length and is adjusted.
+
+ * tmac/tests/an_adjust-link-text-correctly.sh: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run tests.
+
+2022-11-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/devpdf.am: Refactor.
+ (MOSTLYCLEANFILES): Populate macro incrementally, adjacent to
+ the targets that build the files to be cleaned. This will
+ enable cleaner refactoring in the future.
+ (DEFAULT_BASE35_FONTS): Add new macro storing the targets of the
+ PostScript Level 2 standard base 35 font descriptions.
+ (devpdffont_DATA): Populate using `DEFAULT_BASE35_FONTS`.
+ (URW_BASE35_FONTS): Add new macro, empty if [!HAVE_URW_FONTS];
+ and [HAVE_URW_FONTS] otherwise naming the `U` foundry font
+ description counterparts of the `DEFAULT_BASE35_FONTS`.
+ (devpdffont_DATA): Append `URW_BASE35_FONTS`.
+ ($(DEFAULT_BASE35_FONTS) $(URW_BASE35_FONTS)): Assert dependency
+ on "font/devpdf/download". This isn't literally true, but
+ BuildFoundries generates all of these together, so if the
+ "font/devpdf/download" target rule runs successfully, the font
+ description files named in these macro expansions will be
+ generated too.
+
+2022-11-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/afmtodit/afmtodit.pl: Add new command-line option to
+ specify the generated font description's "spacewidth" parameter;
+ in commit bf7f6862c3, 2021-09-24, I made libgroff complain if
+ this directive is missing (since any font, even a "special" one,
+ can be selected as current and the formatter's behavior when
+ encountering an input space should be well-defined under that
+ circumstance). Adding this option enables a well-formed font
+ description to be produced.
+ * src/utils/afmtodit/afmtodit.pl (usage):
+ * src/utils/afmtodit/afmtodit.1.man (Synopsis, Options):
+ Document it.
+ * NEWS: Add item.
+
+2022-11-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/afmtodit/afmtodit.pl: Use our own fatal exit
+ function instead of Perl's "die".
+ (croak): New subroutine emits argument as part of diagnostic
+ message and exits with status 1.
+ (usage): Exit with status 2, not 1, on usage errors.
+
+ * NEWS: Document new exit behavior.
+
+2022-11-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/devpdf.am (font/devpdf/download): Improve
+ comprehensibility of comments in generated "download" file.
+ Stop bracketing path element separator with spaces.
+
+2022-11-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/util/BuildFoundries.pl (LoadFoundry): Stop
+ capitalizing beginning of diagnostic message (per GNU Coding
+ Standards). Drop ellipsis from end since no further diagnostics
+ relevant to that message are expected. Trim trailing slashes
+ from font path elements.
+
+2022-11-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devps/devps.am: Refactor. Turn two identical target
+ rules into a (BSD-make-style, old-fashioned) pattern rule.
+
+2022-11-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * configure.ac: Rechristen self "GNU roff".
+
+2022-11-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/pic/pic.ypp: Slightly refactor. Rename parameter
+ `form` (format) to `fmt` to make its nature as an abbreviation
+ clear.
+ (format_number, do_sprintf): Reorder null pointer equality
+ comparisons to avoid inadvertent lvalue assignment.
+ (do_sprintf): Declare lists of valid format conversion
+ specifiers and modifiers explicitly instead of as happenstance
+ literals. Recast diagnostic messages to refer to "invalid", not
+ "bad" input; refer to input keyword correctly as "sprintf" (not
+ "snprintf"); and report the identity of the invalid conversion
+ specifier we reject.
+
+2022-11-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/doc.tmac (Fl, doc-flag-recursion, doc-print-recursive)
+ (doc-print-prefixes, Ar, Nm, Pa, Xr, doc-do-func, Fn)
+ (doc-do-func-args, Fo): Remove now-relic resets of type size to
+ previous value. Since commit 5125754cdf, 23 February, no mdoc
+ macro ever changes the type size.
+
+2022-11-08 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ [gropdf]: Cater for invalid entries in download file.
+
+ * src/devices/gropdf/gropdf.pl: Test if path in the "download"
+ file points to a readable file. Also change order so that the
+ first valid entry is used as the font to embed. This replaces
+ previous order where last found entry is used.
+
+ Fixes <https://savannah.gnu.org/bugs/?62950>.
+
+2022-11-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Set page topic in roman in "Name" section.
+
+ * tmac/doc.tmac (Nm): If in the "Name" section of the page, set
+ argument(s) with the `No` (normal formatting) macro instead of
+ handling them...normally. Since `Nm`'s usual behavior is to set
+ the next argument in boldface, in this circumstance it is set in
+ roman. Aligns page rendering with man(7) and fixes a bug
+ documented in the 4.3BSD-Reno mdoc.samples(7) page (1990-06-22),
+ upon which the groff_mdoc(7) page is based.
+ * tmac/groff_mdoc.7.man (Bugs): De-document bug.
+
+ Fixes part of <https://savannah.gnu.org/bugs/?62926>.
+
+2022-11-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-common: Add internal register
+ `doc-in-name-section` to keep track of whether a macro is called
+ within the "Name" section of the document, to prepare a means of
+ fixing a long-standing bug with `Nm`.
+ (Sh): Canonicalize capitalization of section heading sooner.
+ Set or clear `doc-in-name-section` based on result.
+ (Rd): Add new register to dump.
+ * tmac/doc.tmac (doc-save-global-vars, doc-restore-global-vars):
+ Handle new register.
+
+2022-11-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Use font CR, not CB, for `Cm` ("command modifier") and
+ `Fl` ("flag") macros on typesetters.
+
+ * tmac/mdoc/doc-ditroff (doc-Cm-font, doc-Fl-Font): Switch to
+ Courier roman from Courier bold. This congrues better with
+ other `Li` literals, which were not in boldface.
+
+2022-11-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-nroff (doc-Li-Font): Switch from roman to bold.
+ On typesetters, the use of Courier (roman) plainly distinguishes
+ unquoted literals from their context. On terminals there was no
+ such visible distinction. Fortunately, in groff_mdoc(7) itself,
+ this does not result in a blinding blitz of boldface because the
+ `Ql` (quoted literal) macro is so often used, and it maintains
+ the roman style. This change further aligns groff mdoc(7) with
+ groff man(7) style conventions. (Also see how we handle
+ literals for typesetters and terminals in the "ms.ms" document.)
+
+2022-11-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Make `Sx` macro perform quotation, not italicization.
+ It's thorougly inconsistent with English composition practices
+ to refer to (sub)section headings within a document as if they
+ were major works.
+
+ * tmac/doc.tmac (Sx): Implement.
+ * tmac/mdoc/doc-ditroff (doc-Sx-font):
+ * tmac/mdoc/doc-nroff (doc-Sx-font): Delete.
+ * tmac/groff_mdoc.7.man (Section Cross References): Rename...
+ ((Sub)section cross references): ...to this. Recognize
+ existence of `Ss` macro, curiously overlooked before.
+ * NEWS: Add item.
+
+2022-11-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Drop now-unused `doc-pageref` string. It was nowhere
+ interpolated outside of state management macros.
+
+ * tmac/doc.tmac (doc-save-global-vars, doc-restore-global-vars):
+ * tmac/mdoc/doc-common: Do it.
+
+2022-11-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-common (doc-header, doc-footer): Revise for
+ clarity and to use correct typefaces for titles.
+ (doc-header): Add new strings to ease title construction.
+ `doc-xref` stores the fully formatted page topic and section
+ number, e.g., "troff(1)"; `doc-abbv` stores the its potentially
+ abbreviated form when it is too long to fit.
+ (doc-footer): Use `doc-xref` as above. Stop setting the `Os`
+ and `Dd` parameters in the ("semantic"?) font used for the
+ page's section number (probably unnoticed all these years
+ because the font used to render that was (Times) roman).
+
+2022-11-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/doc.tmac:
+ * tmac/mdoc/doc-common: Rename strings for clarity.
+ - doc-document-title -> doc-page-topic
+ - doc-document-title-saved -> doc-page-topic-saved
+ * tmac/mdoc/doc-common: Use new name.
+
+2022-11-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-ditroff (doc-page-topic-font):
+ * tmac/mdoc/doc-nroff (doc-page-topic-font): Set man page topic
+ names in italics.
+
+2022-11-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-ditroff:
+ * tmac/mdoc/doc-nroff: Rename strings for clarity.
+ - doc-caption-font -> doc-page-topic-font
+ - doc-caption-font2 -> doc-page-section-font
+ * tmac/mdoc/doc-common (doc-header, doc-footer): Use new names.
+
+2022-11-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/doc.tmac: Delete suppression of `Pa` font selection in a
+ "Files" section. This special handling was not documented.
+
+2022-11-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-ditroff (doc-Pa-font): Set file specifications
+ in italics on typesetters. (Terminals already use italics.)
+
+2022-11-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-ditroff (doc-Xr-font):
+ * tmac/mdoc/doc-nroff (doc-Xr-font): Set man page topic cross
+ references in italics.
+
+2022-11-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-ditroff:
+ * tmac/mdoc/doc-nroff: Rename `doc-Tn-font-shape` to
+ `doc-Tn-font` for better parallelism with other font selection
+ strings for mdoc macros, since the `Tn` macro no longer
+ manipulates the type size.
+ * tmac/doc.tmac (Tn): Use new name.
+
+2022-11-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Debugging): Fix misleading claim. The
+ arguments to the `tm`, `tmc`, and `tm1` requests are not read in
+ copy mode. For example, you don't need to double backslashes to
+ get them to interpolate registers or strings.
+
+2022-11-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac (an-end):
+ * tmac/mdoc/doc-common (doc-end-macro): Ensure that document
+ footer appears in continuous rendering mode even when a final
+ pending output line in the document is 1v from the page bottom.
+ Replace `fl` call with `br`, which IMO has clearer semantics.
+ Extend page length by 1v before doing so if the current vertical
+ position is within 1v of the page bottom.
+
+ Thanks to Alex Colomar for the report.
+
+2022-11-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man, mdoc]: Regression-test special case of continuous
+ rendering when the last pending output line in the document is
+ 1v from the (notional) page bottom.
+
+ * tmac/tests/an_output-footer-when-continuously-rendering.sh:
+ * tmac/tests/doc_output-footer-when-continuously-rendering.sh:
+ Do it.
+ * tmac/tmac.am (tmac_TESTS): Run tests.
+
+2022-11-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac (TE): Update diagnostic to mention another
+ failure mode: a man page that is simply a `so` request requires
+ soelim(1) to be run if the sourced page uses tbl(1).
+
+2022-11-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/xditview/xditview.am
+ ($(GXDITVIEW_GROFF_VERSION_H)): Run `$(MKDIR_P)` and `printf` as
+ separate rule commands in order to use them with `$(AM_V_at)`
+ and `$(AM_V_GEN)`, respectively. Prevents noise from build.
+
+ Fixes <https://savannah.gnu.org/bugs/?63302>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2022-10-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [eqn]: Fix Savannah #63299.
+
+ * src/preproc/eqn/main.cpp: Revise input file line number
+ handling.
+ (read_line): Stop dealing with `current_lineno` here; it's now
+ up to its caller (`do_file()`) to manipulate the line number.
+ (do_file): When reading new file, initialize `current_lineno` to
+ 1 instead of 0. Reset it to zero when encountering EOF (so that
+ diagnostics will not include a line number at all). When
+ performing nested call to `read_line()` to gather '.EN' from
+ input, increment the line number. Write correct line number in
+ output groff `lf` requests; in groff, its first argument assigns
+ the number of the _next_ input line. Increment line number at
+ end of outer `read_line()` loop.
+
+ Fixes <https://savannah.gnu.org/bugs/?63299>. Thanks to Alex
+ Colomar for the report.
+
+2022-10-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [eqn]: Regression-test Savannah #63299.
+
+ * src/preproc/eqn/tests/\
+ diagnostics-report-correct-line-numbers.sh: Do it.
+ * src/preproc/eqn/eqn.am (eqn_TESTS, TESTS, EXTRA_DIST): Run
+ test.
+
+2022-10-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/grog.pl (fail, warn, construct_command)
+ (version): Restore trailing newlines to `print`ed output. They
+ went missing when I removed the assignment of the output record
+ separator in commit 6f2e367836, 24 October. Thanks to Dave
+ Kemper for catching this.
+
+2022-10-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/preconv/preconv.cpp: Trivially refactor. Rename
+ `default_encoding` to `fallback_encoding` for clarity. Update
+ comments and debugging diagnostic messages accordingly.
+
+2022-10-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grolj4]: Absorb lj4_font(5) man page into grolj4(1).
+
+ * src/devices/grolj4/lj4_font.5.man: Delete, moving content...
+ * src/devices/grolj4/grolj4.1.man (Fonts): ...hither.
+
+ * doc/doc.am (GROFF_MAN_PAGES1):
+ * src/devices/grolj4/grolj4.am (man5_MANS, EXTRA_DIST): Stop
+ formatting and shipping removed page.
+
+ * src/roff/groff/groff.1.man:
+ * src/utils/hpftodit/hpftodit.1.man: Drop references to page.
+
+ Fixes <https://savannah.gnu.org/bugs/?61819>.
+
+2022-10-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Support `SN` register to configure subsection heading
+ indentation.
+
+ * tmac/doc.tmac: Recognize `SN` register if set on command line
+ and use groff man(7)-compatible default if it is not.
+ * tmac/mdoc/doc-common (Ss): Use this register instead of a
+ literal.
+ * tmac/groff_mdoc.7.man (Formatting with groff, troff, and
+ nroff): Document it.
+ * NEWS: Update item.
+
+ Fixes part of <https://savannah.gnu.org/bugs/?62926>.
+
+2022-10-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Support `IN` register to configure paragraph
+ indentation.
+
+ * tmac/doc.tmac: Recognize `IN` register if set on command line
+ and use groff man(7)-compatible defaults if it is not.
+ * tmac/mdoc/doc-common (Sh): Use this register instead of
+ `doc-paragraph-indentation`.
+ * tmac/mdoc/doc-ditroff:
+ * tmac/mdoc/doc-nroff: Stop setting pargraph indentation
+ defaults here.
+ * tmac/groff_mdoc.7.man (Formatting with groff, troff, and
+ nroff): Document it.
+ * NEWS: Update item.
+
+ * tmac/tests/doc_Mt-works.sh:
+ * tmac/tests/doc_indents-correctly.sh: Update test expectations.
+
+ Fixes part of <https://savannah.gnu.org/bugs/?62926>.
+
+2022-10-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-common (Sh): Fix code style nit. Set paragraph
+ indentation absolutely rather than incrementally. mdoc(7)
+ doesn't have relative inset macros like man(7)'s `RS`/`RE`, so
+ the relative measurement could mislead the reader. (The
+ section heading itself uses an indentation of 0.)
+
+2022-10-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Fix Debian #1022179.
+
+ * tmac/mdoc/doc-common (Ss): Indent entire subsection heading by
+ 3 ens, even if it breaks across output lines. (Change and
+ restore indentation explicitly instead of using a temporary
+ indent to achieve this. Also indent absolutely by 3n instead of
+ retreating by one quarter inch.)
+
+ Fixes <https://bugs.debian.org/1022179>. Thanks to наб for the
+ report.
+
+2022-10-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/doc_indents-correctly.sh: Add regression test for
+ Debian #1022179.
+
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-10-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Fix misleading register name.
+
+ * tmac/mdoc/doc-common (Sh):
+ * tmac/mdoc/doc-ditroff:
+ * tmac/mdoc/doc-nroff: Rename `doc-subheader-indent` to
+ `doc-paragraph-indentation`, because the latter is what it's
+ used for.
+
+2022-10-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_POPPLER): Improve shell code portability.
+ Per the GNU Autoconf manual, "The -a, -o, '(', and ')' operands
+ are not present in all implementations, and have been marked
+ obsolete by Posix 2008. ...portable uses of test should never
+ have more than four arguments, and scripts should use shell
+ constructs like '&&' and '||' instead."
+
+2022-10-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/preconv/preconv.cpp: Alter usage message handling.
+ (usage): Summarize purpose of program and steer reader to man
+ page (only) if help was explicitly requested, and exit
+ successfully from here...
+ (main): ...instead of calling scope.
+
+2022-10-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/preconv/preconv.cpp (usage): Use more
+ communicative metasyntactic variable names.
+ * src/preproc/preconv/preconv.1.man (Synopsis, Options): Align
+ with updated usage message.
+
+2022-10-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/html/pre-html.cpp: Alter usage message handling.
+ (usage): Summarize purpose of program and steer reader to man
+ page (only) if help was explicitly requested, and exit
+ successfully from here...
+ (main): ...instead of calling scope.
+
+2022-10-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grolbp/lbp.cpp: Alter usage message handling.
+ (usage): Summarize purpose of program and steer reader to man
+ page (only) if help was explicitly requested, and exit
+ successfully from here...
+ (main): ...instead of calling scope.
+
+2022-10-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grolbp/lbp.cpp (main): Handle `getopt_long()`
+ return value more idiomatically.
+
+2022-10-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grolbp/lbp.cpp: Fix code style nits.
+ (main): Use standard C library symbols `EXIT_SUCCESS` and
+ `EXIT_FAILURE` instead of integer literals as arguments to
+ `exit()`. Add assertion.
+
+2022-10-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grotty/tty.cpp: Alter usage message handling.
+ (usage): Summarize purpose of program and steer reader to man
+ page (only) if help was explicitly requested, and exit
+ successfully from here...
+ (main): ...instead of calling scope.
+
+2022-10-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grotty/tty.cpp: Fix code style nits.
+ (main): Use standard C library symbols `EXIT_SUCCESS` and
+ `EXIT_FAILURE` instead of integer literals as arguments to
+ `exit()`. Replace `assert(0)` call with communicative
+ predicate.
+
+2022-10-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/groff.cpp: Alter usage message handling.
+ (synopsis, help): Coalesce these two functions...
+ (usage): ...into this one. Summarize purpose of program and
+ steer reader to man page only if help was explicitly requested,
+ rather than blitzing user with text upon a usage error. Also
+ drop option summary from usage message, as it duplicates
+ groff(1).
+
+2022-10-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/grog.pl: Alter usage message handling.
+ (help): Rename this subroutine...
+ (usage): ...to this. Summarize purpose of program and steer
+ reader to man page only if help was explicitly requested, rather
+ than blitzing user with text upon a usage error. Also drop
+ option summary from usage message, as it duplicates grog(1).
+
+2022-10-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/grog.pl: Drop relic code and comments.
+
+2022-10-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grog]: Migrate expansion of Perl interpreter in shebang.
+ Use the same technique as afmtodit, mmroff, gropdf, and pdfmom.
+
+ * src/utils/grog/grog.am (grog): Replace "@PERL@" instead of
+ '^\(#! \).*perl'.
+ * src/utils/grog/grog.pl: Use "@PERL@" in shebang.
+
+2022-10-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [afmtodit]: Give program a usage message.
+
+ * src/utils/afmtodit/afmtodit.pl: Add new scalar `want_help` of
+ Boolean sense. Recognize new long option `--help`, attached to
+ `$want_help`. Stop stripping off directory name components from
+ program name when emitting diagnostics. No other groff program
+ does this (well, gropdf did until recently), and it might save
+ users some confusion if they're working with multiple copies of
+ afmtodit.
+ (usage): New subroutine reports usage message. If help was
+ explicitly requested, summarize purpose of program and steer
+ reader to man page.
+
+2022-10-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [afmtodit]: Migrate expansion of Perl interpreter in shebang.
+ Use the same technique as mmroff, gropdf, and pdfmom.
+
+ * src/utils/afmtodit/afmtodit.am (afmtodit): Replace "@PERL@"
+ instead of "/usr/bin/perl".
+ * src/utils/afmtodit/afmtodit.pl: Use "@PERL@" in shebang.
+
+2022-10-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [gropdf] Give program a usage message.
+
+ * src/devices/gropdf/gropdf.pl: Add new scalar `want_help` of
+ Boolean sense. Recognize new long option `--help`, attached to
+ `$want_help`.
+ (usage): New subroutine reports usage message. If help was
+ explicitly requested, summarize purpose of program and steer
+ reader to man page.
+
+2022-10-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/xditview/xditview.c (Syntax): "#if 0" out
+ reference to `-noPolyText` option, whose effect is likewise
+ bracketed in another file.
+
+2022-10-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (enable_warning, disable_warning):
+ Recast diagnostic messages for clarity.
+
+2022-10-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [pfbtops]: Fix code style and diagnostic nits.
+
+ * src/utils/pfbtops/pfbtops.c (error): Exit with `EXIT_FAILURE`
+ status (from standard C library) instead of status 2.
+ (main): Exit with `EXIT_SUCCESS` status when writing version or
+ help information. Exit with status 2 when dying due to usage
+ error. Use `fprintf()` and `strerror()` to construct error
+ message when dying due to inability to open input file instead
+ of using `perror()`, which anonymizes its caller and thus should
+ never be used in serious work. Avoid it like `gets()`.
+ * NEWS: Add item for exit status changes.
+
+ Continues the long process of fixing Savannah #52463.
+
+2022-10-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man pages]: Don't document macro package compatibility wrapper
+ directory if it's not used.
+
+ * Makefile.am (.man): Use sed to replace
+ '@COMPATIBILITY_WRAPPERS@' in man page text with value of
+ `compatibility_wrappers` shell variable. Document its purpose.
+ * src/preproc/eqn/eqn.1.man (Description):
+ * src/preproc/grn/grn.1.man (Options):
+ * src/roff/groff/groff.1.man (Installation directories):
+ * src/roff/troff/troff.1.man (Environment): Mention
+ `@SYSTEMMACRODIR@` only if `@COMPATIBILITY_WRAPPERS@` expands to
+ something other than "no" (it could be "yes" or "manual").
+
+ Thanks to Alexander Kanavin and Jeremy Puhlman for the report.
+
+2022-10-21 Robert Yang <liezhi.yang@windriver.com>
+
+ * font/devpdf/util/BuildFoundries.pl:
+ * src/devices/gropdf/gropdf.pl:
+ * src/devices/gropdf/pdfmom.pl: Replace use of '-w' in shebang
+ line with "use warnings;".
+
+2022-10-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/fallbacks.tmac: Define fallback characters for many code
+ points from the Unicode General Punctuation Block. This is to
+ ease migration from other documentation formats; in many cases
+ there are more idiomatic *roff ways of getting results that
+ typeset better and are amenable to fine tuning. For instance,
+ Unicode defines spaces and dashes of various discrete widths;
+ when typesetting with *roff, you can have a space or dash (among
+ other things) of any length achievable by the output device.
+ * tmac/ps.tmac: Migrate non-breaking hyphen fallback character
+ definition from here to the foregoing.
+
+ Fixes <https://savannah.gnu.org/?58930>. Thanks to Dave Kemper
+ for the report and discussion.
+
+2022-10-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac:
+ * tmac/s.tmac: Escape newlines when opening conditional blocks.
+
+ Fixes <https://savannah.gnu.org/?63197>. Thanks to Bjarni Ingi
+ Gislason for the report and Dave Kemper for the quick fix.
+
+2022-10-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grodvi/dvi.cpp (usage):
+ * src/devices/grohtml/post-html.cpp (usage):
+ * src/devices/grolbp/lbp.cpp (usage):
+ * src/devices/grolj4/lj4.cpp (usage):
+ * src/devices/grops/ps.cpp (usage):
+ * src/devices/grotty/tty.cpp (usage):
+ * src/devices/xditview/xditview.cpp (usage):
+ * src/preproc/eqn/main.cpp (usage):
+ * src/preproc/grn/main.cpp (usage):
+ * src/preproc/html/pre-html.cpp (usage):
+ * src/preproc/pic/main.cpp (usage):
+ * src/preproc/preconv/preconv.cpp (usage):
+ * src/preproc/refer/refer.cpp (usage):
+ * src/preproc/soelim/soelim.cpp (usage):
+ * src/preproc/tbl/main.cpp (usage):
+ * src/roff/groff/groff.cpp (synopsis, help):
+ * src/roff/nroff/nroff.sh:
+ * src/roff/troff/input.cpp (usage):
+ * src/utils/addftinfo/addftinfo.cpp (usage):
+ * src/utils/hpftodit/hpftodit.cpp (usage):
+ * src/utils/indxbib/indxbib.cpp (usage):
+ * src/utils/lkbib/lkbib.cpp (usage):
+ * src/utils/lookbib/lookbib.cpp (usage):
+ * src/utils/pfbtops/pfbtops.c (usage):
+ * src/utils/tfmtodit/tfmtodit.cpp (usage):
+ * src/utils/xtotroff/xtotroff.c (usage): Update usage message.
+ Present different modes of operation on separate output lines.
+ Sort options in English lexicographic order. Document help
+ option(s) as last mode of operation.
+
+2022-10-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/gropdf/gropdf.pl: Revise handling of argument 0.
+ Rename scalar `progname` to `prog` for brevity (and preparation
+ for writing a usage message). Also stop stripping off directory
+ name components from it. No other groff program does this, and
+ it might save users some confusion if they're working with
+ multiple copies of gropdf.
+
+2022-10-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Migrate terminology from "paper size" to "paper format" or
+ "paper dimensions" as appropriate in documentation and
+ diagnostic messages. "Format" implies an orientation (which can
+ be overridden in many cases) whereas size does not. When only
+ the magnitudes of measurements are at issue (mainly for internal
+ purposes), use the term "dimensions".
+
+ * NEWS:
+ * PROBLEMS:
+ * doc/groff.texi:
+ * m4/groff.m4 (GROFF_PAGE):
+ * man/groff_font.5.man:
+ * man/groff_tmac.5.man:
+ * src/devices/grodvi/dvi.cpp (main):
+ * src/devices/grolbp/grolbp.1.man:
+ * src/devices/grolbp/lbp.cpp (main):
+ * src/devices/grolj4/grolj4.1.man:
+ * src/devices/grolj4/lj4.cpp (lj4_printer::lj4_printer, main):
+ * src/devices/grolj4/lj4_font.5.man:
+ * src/devices/gropdf/gropdf.1.man:
+ * src/devices/grops/grops.1.man:
+ * src/devices/grops/ps.cpp (main):
+ * src/roff/groff/groff.1.man:
+ * tmac/papersize.tmac: Do it.
+
+2022-10-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-ditroff (doc-left-parenthesis)
+ (doc-right-parenthesis, doc-left-bracket, doc-right-bracket):
+ Drop thin and hair space escape sequences from these string
+ definitions. (Also, doc-right-bracket was inconsistent with
+ doc-left-bracket, the former inserting horizontal motion only
+ before the bracket character.) Eliminates excess space when
+ using Pq, Po, Pc and Bq, Bo, Bc macros and formatting for
+ typesetters, and aligns output with behavior of `Pq` and `Bq` as
+ documented in groff_mdoc(7).
+
+ Fixes <https://bugs.debian.org/1021795>. Thanks to наб for the
+ report.
+
+2022-10-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-ditroff: Use groff-canonical typeface names in
+ font selection escape sequences. Migrate 'C' to 'CR' and 'CO'
+ to 'CI'. (Admittedly, "Courier oblique" is more pedantically
+ correct than "Courier italic". But the iron ball of Unix troff
+ history and its style trio [later quartet] of "R", "I", "B"
+ {then "BI"} will not be ignored.)
+
+2022-10-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-ditroff: Drop nilpotent type size escape
+ sequences from string definitions.
+
+2022-10-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Document a CSTR #54 erratum regarding \n(st and \n(sb.
+
+ * doc/groff.texi (Page Motions):
+ * man/groff.7.man (Writable registers):
+ * man/groff_diff.7.man (New registers): Do it.
+
+ * PROBLEMS: Further clarify. Note DWB and Heirloom behavior.
+
+2022-10-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/eqn/main.cpp (read_line): Fix switched test
+ consequents when updating `current_lineno`.
+
+2022-10-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/xtotroff/xtotroff.c (main): Annotate "xtotroff" as a
+ GNU program in version information.
+
+2022-10-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/xditview/xditview.am
+ ($(GXDITVIEW_GROFF_VERSION_H): Perform correct substitution to
+ get groff version string into `Version_string` C symbol.
+ Continues commit c73decb58f, 9 October.
+
+2022-10-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/afmtodit/afmtodit.1.man (Files): Fix ordering error.
+
+ Fixes <https://savannah.gnu.org/bugs/?63228>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2022-10-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/eqn/lex.cpp (get_delimited_text): Clear line
+ number when hitting EOF.
+ * src/preproc/eqn/main.cpp: Revise end-of-file handling. Clear
+ line number upon reaching EOF so that we don't report a nonsense
+ value one greater than the number of lines in the input file.
+ (read_line): Boolify. Make static (local linkage only), since
+ it has no external callers. Introduce new Boolean variable
+ `is_end_of_file`. Clear `current_lineno` if EOF, and increment
+ it otherwise.
+ (do_file, main): Clarify diagnostic messages.
+
+2022-10-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [eqn]: Improve diagnostics involving unprintable characters.
+
+ * src/preproc/eqn/main.cpp (input_char_description): New
+ function constructs a human-readable string describing
+ characters.
+ (read_line, inline_equation, main): Call new function and adjust
+ diagnostic message wording to accommodate the phrase it returns.
+
+ Fixes <https://savannah.gnu.org/bugs/?63218>.
+
+2022-10-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [eqn]: Improve diagnostics.
+
+ * src/preproc/eqn/lex.cpp (file_input::~file_input):
+ * src/preproc/eqn/main.cpp (main): Die if `fclose()` fails and
+ report underlying system error.
+ (inline_equation): Identify inline equation context.
+
+2022-10-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac (2c, 1c): Throw diagnostic if changing columnation
+ with a footnote pending. This isn't necessarily an error per
+ se, but in many cases it will flag an undesirable page layout
+ due to the limited flexibility of me(7)'s footnote support at
+ present. See <https://savannah.gnu.org/bugs/?63176>.
+
+2022-10-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/eqn/main.cpp: Fix code style nits.
+ (usage): Align output with man page. Document separate
+ invocation modes separately.
+ (main): Use standard C library symbols `EXIT_SUCCESS` and
+ `EXIT_FAILURE` with `exit()` calls instead of integer literals.
+ Replace `assert(0)` call with communicative predicate. Check
+ return value of `fclose()`, and exit with fatal error if it
+ fails. Distinguish `ferror()` status and `fflush(stdout)`
+ failures when cleaning up before exit.
+
+2022-10-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (read_color_draw_node): Clarify
+ diagnostic.
+
+2022-10-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/dvi.tmac: Always render \[aq] as a neutral apostrophe.
+ Thanks to the TC fonts, we can do this even when the default CM
+ text fonts are in use.
+
+ Fixes <https://savannah.gnu.org/bugs/?63200>.
+
+2022-10-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/ec.tmac: Remove apparently unnecessary remappings of
+ styles (and reassertion of style slots in the font mounting
+ position list, albeit in an unusual order (RBI instead of RIB)).
+ This code frustrated the rendering of man pages with post-1.22.4
+ groff for the 'dvi' output device when using EC fonts. Instead
+ remap the T and H family typefaces in all four styles
+ explicitly. (The CW and CWI faces were already handled.) Also
+ add remappings of groff+PostScriptish font names "CB" and "CBI"
+ to CW EC faces of normal weight, corresponding to dvi.tmac; see
+ commits 529e2ca0c4, 2002-03-23 and c9741da6c0, 2021-05-06.
+
+ Fixes <https://savannah.gnu.org/bugs/?63194>.
+
+2022-10-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/an_works-with-ec.sh: Add regression test for
+ Savannah #63194.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-10-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/ec_works.sh: Add unit test to validate use of EC
+ fonts when "-mec" option given.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-10-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/latin2.tmac:
+ * tmac/latin5.tmac:
+ * tmac/latin9.tmac: Perform the character remapping shenanigans
+ of the fix for Savannah #63112 only if the output device is
+ "latin1" (a terminal using an 8-bit character encoding). Only
+ then can we be sure that Latin-1 glyphs will be unavailable when
+ other encodings are used and that `\N` escape sequences will
+ identify correct glyph indices in a font (because there is no
+ font per se accessible to groff--simply a terminal implementing
+ a character encoding).
+
+2022-10-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/gropdf/gropdf.pl (GetType1): Clarify diagnostic.
+ When failing to open a font file for embedding in a PDF, mention
+ this context.
+
+2022-10-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/afmtodit/afmtodit.tables: Update against Unicode 15.
+ No substantive changes.
+
+ Fixes <https://savannah.gnu.org/bugs/?63188>.
+
+2022-10-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * configure.ac: If URW fonts were located, add the directory
+ where they were found to the configuration report.
+
+ Attempts to fix <https://savannah.gnu.org/bugs/?62860> (2/2).
+
+2022-10-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4: Try to make gropdf's search for URW font files
+ more deterministic. To disambiguate cases where multiple--not
+ necessarily identical--copies may be found on the system, search
+ _only_ in the directory given to the `--with-urw-fonts-dir`
+ configure option, if present. This populates the "Foundry" file
+ generated by the build, causing gropdf to search there first.
+ (GROFF_URW_FONTS_PATH): Stop `AC_SUBST`ing `urwfontsdir` here.
+ (GROFF_URW_FONTS_CHECK): `AC_REQUIRE` `GROFF_URW_FONTS_PATH` to
+ be run first. If `urwfontsdir` is not null, search only there
+ for URW fonts. Assign `urwfontsdir` the value of the directory
+ in which the fonts are found. Assign it an empty value if none
+ are found. Either way, `AC_SUBST` the variable.
+
+ Attempts to fix <https://savannah.gnu.org/bugs/?62860> (1/2).
+
+2022-10-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/gropdf/gropdf.pl (LoadFont): Clarify diagnostic.
+ gropdf opens "fonts" in two distinct ways. On the one hand, it
+ opens groff font description files for essentially all
+ nontrivial output. On the other, it may open actual Type 1 font
+ files for embedding in a PDF. Make failure of the former case
+ less confusable with the latter.
+
+2022-10-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Document new XN/XH and related macros.
+
+ * doc/groff.texi (Creating a table of contents):
+ * doc/ms.ms (Creating a table of contents):
+ * tmac/groff_ms.7.man (Creating a table of contents): Do it.
+
+ Fixes <https://savannah.gnu.org/bugs/?63110>.
+
+2022-10-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [gxditview]: Support `-version`, `--version` option. As a C
+ program, gxditview had no access to the (C++) libgroff
+ `Version_string` symbol, so construct a header file to store
+ this datum at build time. If groff gets other user-facing C
+ programs, we should consider generating this header in
+ src/include instead.
+
+ * src/devices/xditview/xditview.am: Generate "groff_version.h"
+ file.
+ (GXDITVIEW_GROFF_VERSION_H): Define new macro.
+ ($(GXDITVIEW_GROFF_VERSION_H)): Define target to generate file.
+ (XDITVIEW_GENHDRS): Add $(GXDITVIEW_GROFF_VERSION_H).
+
+ * src/devices/xditview/xditview.c: Include new header file.
+ (Syntax): Report newly supported options.
+ (main): Recognize and handle new options.
+
+ * src/devices/xditview/gxditview.1.man (Synopsis): Document
+ them.
+
+2022-10-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [gxditview]: Update usage message production and contents.
+
+ * src/devices/xditview/xditview.c: Use C99 Boolean type.
+ (Syntax): Accept additional Boolean argument indicating whether
+ the usage message is to be issued due to an error. Write
+ message to stderr if so, and stdout otherwise. Stop presuming
+ length of output line; guessing where to wrap is unreliable due
+ to variable terminal width and length of argv[0]. Write one
+ line per invocation mode of the program. Stop duplicatively
+ documenting standard X Toolkit options. Exit with standard C
+ library `EXIT_FAILURE` status if there was an error, and
+ `EXIT_SUCCESS` otherwise.
+ (main): Refactor to prepare for `--version` support.
+
+ * src/devices/xditview/gxditview.1.man (Synopsis): Sync list of
+ options with usage message.
+
+2022-10-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/afmtodit/afmtodit.pl: Recognize "--version" as
+ synonym for "-v". To achieve this, use Getopt::Long instead of
+ Getopt::Std.
+ * src/utils/afmtodit/afmtodit.1.man (Synopsis, Options):
+ Document it.
+
+2022-10-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/gropdf/pdfmom.pl: Recognize "--version" as synonym
+ for "-v".
+ * src/devices/gropdf/pdfmom.1.man (Synopsis, Description):
+ Document it.
+
+2022-10-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/grog.pl (version): Identify as a GNU program.
+
+2022-10-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grolj4/grolj4.1.man (Typefaces): Add new
+ subsection.
+
+ Fixes <https://savannah.gnu.org/bugs/?60929>. Thanks to T. Kurt
+ Bond for the report.
+
+2022-10-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/meref.me.in (Columnated Output): Document persistence of
+ `$s` register value across columnation mode changes.
+
+ Fixes <https://savannah.gnu.org/bugs/?62717>. Thanks to Dave
+ Kemper for the report.
+
+2022-10-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/meref.me.in: Annotate empty default arguments more
+ consistently.
+
+ Fixes <https://savannah.gnu.org/bugs/?62801>. Thanks to Dave
+ Kemper for the report.
+
+2022-10-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/meref.me.in: Fix documentation error.
+ (Summary) <\_>: Describe as "underrule", not "underscore".
+ These are distinct: the latter is a glyph; the former is drawn
+ by typesetters and rendered with SGR attributes on terminals.
+
+2022-10-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * NEWS: Advise users of changes to "name" directive handling in
+ font description files.
+
+ Fixes <https://savannah.gnu.org/bugs/?61423>. Thanks to Dave
+ Kemper for the report.
+
+2022-10-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/number.cpp: Refactor and fix code style nits.
+ Boolify and rename static (local) functions.
+ - parse_expr -> is_valid_expression
+ - start_number -> is_valid_expression_start
+ - parse_term -> is_valid_term
+ Rename preprocessor macro `SCALE_INDICATOR_CHARS` to
+ `SCALING_UNITS`.
+ (is_valid_expression, is_valid_term): Rename parameters and
+ demote them from `int` to `bool`.
+ - scaling_indicator -> scaling_unit (no demotion)
+ - parenthesised -> is_parenthesized
+ - rigid -> is_mandatory
+ (is_valid_expression_start, is_valid_expression, is_valid_term):
+ Return Boolean rather than integer literals.
+ (get_vunits, get_hunits, get_number_rigidly, get_number)
+ (get_integer): Update call sites of renamed functions. Replace
+ Boolean-valued integer literals used as Booleans with Boolean
+ literals and annotate their purposes. (See <https://\
+ stackoverflow.com/questions/38076786/\
+ why-doesnt-c-support-named-parameters>.)
+ (get_vunits, get_hunits, get_number, get_integer): Replace `0`
+ in assertions with a communicative predicate. In all of these
+ it's an unhandled `switch()` case.
+
+2022-10-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (do_expr_test, do_zero_width): Use
+ better terminology in diagnostic messages.
+
+2022-10-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Fix Savannah #63151.
+
+ * src/roff/troff/input.cpp (read_draw_node): Throw "delim"
+ warning diagnostic when a drawing escape sequence ends the line
+ without a closing delimiter.
+
+ Fixes <https://savannah.gnu.org/bugs/?63151>.
+
+2022-10-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/fallbacks.tmac: Define fallbacks for characters in ISO
+ Latin-{2,5,9} but not in Latin-1.
+
+ Fixes <https://bugs.debian.org/782903>. Thanks to Rafal Pietrak
+ for the report.
+
+2022-10-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Fix Savannah #63149.
+
+ * src/roff/troff/reg.cpp (alter_format): Throw comprehensible
+ diagnostic when input delete character encountered in register
+ format.
+
+ Fixes <https://savannah.gnu.org/bugs/?63149>.
+
+2022-10-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Describe an input delete character comprehensibly.
+
+ * src/roff/troff/input.cpp (token::description): The delete
+ character (ISO 127 decimal, EBCDIC 7) is a valid `TOKEN_CHAR`
+ but is not printable. Don't attempt to output it literally in
+ diagnostics; describe it in a phrase instead.
+
+2022-10-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Apply consistent terminology.
+
+ * src/roff/troff/input.cpp: Rename functions to better align
+ with our documentation, and decouple their names from an
+ assumption of diagnostic severity. Also give them imperative
+ names since they are called for their side effects, not their
+ return values.
+ - empty_name_warning -> diagnose_missing_identifier
+ - non_empty_name_warning -> diagnose_invalid_identifier
+ (diagnose_missing_identifier): Refer to absent operand as
+ "identifier", not "name", in diagnostic messages since the
+ latter (strictly) refers to the request/macro/string/diversion
+ name space, and this function is also used to gather register
+ identifiers.
+
+2022-10-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tmac]: Fix Savannah #63112 (3/3).
+
+ * tmac/latin2.tmac: Replace characters that ISO Latin-1 has but
+ Latin-2 doesn't. Map characters that ISO Latin-2 has and
+ Latin-1 doesn't to their numeric code points.
+
+2022-10-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tmac]: Regression-test Savannah #63112 (3/3).
+
+ * tmac/tests/latin2_works: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-10-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tmac]: Fix Savannah #63112 (2/3).
+
+ * tmac/latin5.tmac: Replace characters that ISO Latin-1 has but
+ Latin-5 doesn't. Map characters that ISO Latin-5 has and
+ Latin-1 doesn't to their numeric code points.
+
+2022-10-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tmac]: Regression-test Savannah #63112 (2/3).
+
+ * tmac/tests/latin5_works: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-10-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tmac]: Fix Savannah #63112 (1/3).
+
+ * tmac/latin9.tmac: Replace characters that ISO Latin-1 has but
+ Latin-9 doesn't. Map characters that ISO Latin-9 has and
+ Latin-1 doesn't to their numeric code points.
+
+2022-10-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tmac]: Regression-test Savannah #63112 (1/3).
+
+ * tmac/tests/latin9_works: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-10-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp: Refactor to parallelize logic in
+ similar routines; namely, those handling escape sequences that
+ accept newlines as argument delimiters.
+
+2022-10-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp: Fix inconsistencies in handling of
+ escape sequences that accept newlines as delimiters. Some threw
+ spurious warnings as in Savannah #63011; others failed to treat
+ a newline-terminated escape sequence also as the ending of an
+ input line.
+ (do_name_test, do_zero_width): Suppress spurious warning.
+ (do_zero_width, do_width, do_special): Synthesize newline to
+ terminate input line.
+
+2022-10-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/tests/\
+ some_escapes_accept_newline_delimiters.sh: Add test cases for
+ `\A` and test formatted output of escape sequences, not just the
+ absence of diagnostics from permitted use of newlines as
+ argument delimiters.
+
+2022-09-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libdriver/input.cpp (do_file): Make use of
+ positioning commands before the first page is started fatal
+ errors; they suggest ill-formed input. The 'p' command
+ clobbers the vertical position anyway. (See
+ https://bugs.debian.org/421437 for discussion.)
+
+2022-09-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/pdf.tmac: Add inclusion guard; if a `pdfmark` macro is
+ already defined, skip inclusion of this file. Unfortunately
+ there are multiple name collisions with pdfmark.tmac.
+
+2022-09-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp:
+ * src/roff/troff/request.h: Trivially refactor. Boolify
+ `interpolate_macro` and `request::invoke`. Also rename
+ parameter `no_next` to `do_not_want_next_token`, exposing
+ potentially confusing interface design.
+
+2022-09-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (spring_trap, interpolate_string)
+ (interpolate_string_with_args): Improve error diagnostics: when
+ a sprung trap or an interpolation fails because it's being
+ attempted on a request, say so explicitly and _name_ it. If the
+ argument to the trap-planting request or to a string
+ interpolation escape sequence is itself an interpolation, this
+ name might not be obvious. Consider:
+ .wh \n[pos] \*[mac]
+ .em \*[mac]
+ .itc 1 \*[mac]
+ \*[\*[mac]]
+ Supplying this information requires no additional overhead.
+
+2022-09-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (interpolate_string): Trivially
+ refactor. Rename function parameter from `s` to `nm` to more
+ obviously align with `interpolate_string_with_args()`.
+
+2022-09-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (do_zero_width, token::description)
+ (interpolate_string, interpolate_string_with_args)
+ (token::get_char): Revise diagnostic messages to stop presuming
+ the identity of the escape character.
+
+2022-09-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (set_escape_char): Recast error
+ message to describe attempted operation and tell the user what
+ we're doing about being instructed to use an invalid escape
+ character.
+
+2022-09-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (read_size): Be more helpful to
+ ambiguous type size escape sequence users; offer advice in
+ terms of the current escape character.
+
+2022-09-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/groff.cpp (main): Fix SEGV when exiting
+ gxditview. The `postdriver` pointer always referred to
+ allocated memory except when the `-X` option was given; it was
+ then assigned the address of a #defined string literal. It was
+ thus statically allocated and an error to attempt to `free()`
+ it. Duplicate the string on the heap instead so that we can
+ clean up uniformly regardless of postprocessor. Problem caused
+ by me when introducing `xexit()` in commit 6769e56aab, 20 June.
+
+2022-09-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac (@o, n2, sk (f, ++): Consistently call `@err`
+ macro with `do`.
+
+2022-09-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac: Initialize new register `_f`, the value of `$m`
+ {column count} of the previous pending footnote, to zero,
+ meaning there is no previous pending footnote.
+ (@o): Emit diagnostic when flushing footnotes into a different
+ column layout than the pending footnote last added. Set `_f` to
+ zero.
+ ((f): Emit diagnostic when enqueueing footnote using a different
+ column layout than the previous pending footnote used. Set `_f`
+ to `$m`.
+
+ Fixes <https://savannah.gnu.org/bugs/?58736>. Thanks to Dave
+ Kemper for the report and discussion.
+
+2022-09-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac: Explicitly initialize and annotate internal
+ register `?f`.
+
+2022-09-08 Nikita Ivanov <nikita.vyach.ivanov@gmail.com>
+
+ * tmac/ps.tmac: Fallback definitions for glyphs that usually
+ come from special fonts should use `schar` instead of `fchar`.
+ {Define fallback special characters using `schar` instead of
+ `fchar` for glyphs that we do not expect to find in text fonts;
+ that is, they don't have bold, italic, and bold-italic stylistic
+ variants. This means all special character definitions in the
+ file except for rules, ligatures, and digraphs. Problem dates
+ back to a series of commits from March 2002 to February 2003,
+ straddling the introduction of the `schar` request in November
+ 2002. --GBR}
+
+ Fixes <https://savannah.gnu.org/bugs/?62955>.
+
+2022-09-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Slightly simplify new `XN` macro feature to align it more
+ closely with Berkeley TOC macro behavior; don't prepend the
+ table of contents entry with the section number (`\*[SN]`). If
+ desired, a document can define `XN-REPLACEMENT`. This does not
+ regress "pdfmark.ms" because it uses an alternative, older
+ implementation of these features from "spdf.tmac".
+
+ * tmac/s.tmac (XH-UPDATE-TOC): Update comments.
+ (XN-REPLACEMENT): Do it.
+
+2022-09-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/pdf.tmac (pdf*href-I): Call `pdf:error` macro by its
+ correct name. Both this macro file and
+ contrib/pdfmark/pdfmark.tmac seem to want to use the 'pdf'
+ prefix for their macro names, with much confusing overlap.
+ Problem dates back to commit 87046b2948, 2011-07-26.
+
+2022-09-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_URW_FONTS_CHECK): If Ghostscript or awk are
+ unavailable, skip only the prepopulation of the URW font search
+ path instead of the entire check. This way we still locate the
+ URW fonts if they are in one of several standard locations.
+
+ Fixes <https://savannah.gnu.org/bugs/?62775>.
+
+2022-09-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Trivially refactor.
+
+ * src/roff/troff/input.cpp (do_name_test): Boolify and rename
+ local variables to..."impredicate" their names.
+ - bad_char -> got_bad_char
+ - some_char -> got_some_char
+
+2022-09-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grodvi, ...]: Trivially refactor.
+
+ Tidy up #includes of the "assert.h" header, which we locally
+ provide to ensure a C99-conformant implementation. Drop
+ inclusion of header from files that don't directly need it, add
+ it where they do, and spell the inclusion consistently with
+ double quotes to cue the reader of its local status.
+
+ * src/devices/grodvi/dvi.cpp:
+ * src/devices/grolj4/lj4.cpp:
+ * src/libs/libdriver/printer.cpp:
+ * src/preproc/eqn/box.cpp:
+ * src/preproc/eqn/delim.cpp:
+ * src/preproc/eqn/pile.cpp:
+ * src/preproc/eqn/script.cpp: Add inclusion.
+
+ * src/include/driver.h:
+ * src/libs/libgroff/fontfile.cpp:
+ * src/preproc/eqn/eqn.h:
+ * src/preproc/html/pushback.cpp:
+ * src/preproc/refer/refer.h:
+ * src/preproc/tbl/table.h:
+ * src/utils/addftinfo/addftinfo.cpp: Drop inclusion.
+
+ * src/include/itable.h:
+ * src/include/stringclass.h:
+ * src/libs/libbib/linear.cpp:
+ * src/libs/libbib/search.cpp:
+ * src/libs/libgroff/color.cpp:
+ * src/libs/libgroff/font.cpp:
+ * src/libs/libgroff/nametoindex.cpp:
+ * src/libs/libgroff/prime.cpp:
+ * src/libs/libgroff/searchpath.cpp:
+ * src/preproc/html/pre-html.cpp:
+ * src/preproc/preconv/preconv.cpp:
+ * src/preproc/soelim/soelim.cpp:
+ * src/utils/indxbib/indxbib.cpp:
+ * src/utils/lkbib/lkbib.cpp:
+ * src/utils/lookbib/lookbib.cpp: Respell inclusion.
+
+ Fixes <https://savannah.gnu.org/bugs/?63079>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2022-09-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff, ...]: Trivially refactor.
+
+ Boolify and rename internal library function from
+ `invalid_input_char` to `is_invalid_input_char`.
+
+ * src/include/lib.h: Do it.
+
+ * src/libs/libgroff/font.cpp (text_file::next_line):
+ * src/preproc/eqn/lex.cpp (file_input::read_line):
+ * src/preproc/eqn/main.cpp (read_line, main):
+ * src/preproc/pic/lex.cpp (file_input::read_line,
+ simple_file_input::get, simple_file_input::peek):
+ * src/preproc/pic/main.cpp (top_input::get, top_input::peek)
+ (do_file):
+ * src/preproc/refer/command.cpp (input_stack::push_file):
+ * src/preproc/refer/refer.cpp (do_file, do_bib):
+ * src/roff/troff/env.cpp (environment::make_tag):
+ * src/roff/troff/input.cpp (file_iterator::fill)
+ (file_iterator::peek, get_char_for_escape_parameter)
+ (transparent_translate, read_request, asciify)
+ (input_char_description, read_string, transparent_file,
+ set_string): Update call sites.
+
+2022-09-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Tweak diagnostic messages.
+
+ * src/roff/troff/input.cpp (token::description)
+ (input_char_description): Consistently use articles in
+ descriptive noun phrases.
+
+2022-09-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Tweak diagnostic messages.
+
+ * src/roff/troff/input.cpp (non_empty_name_warning): Say
+ "identifier", not "name", in diagnostic message; it can be
+ thrown for attempted assignments to invalid register
+ identifiers, and some of our documentation refers to identifiers
+ in the name space shared by requests, macros, strings, and
+ diversions as "names".
+
+ * src/roff/troff/env.cpp (hyphen_trie::read_patterns_file):
+ * src/roff/troff/input.cpp (get_char_for_escape_parameter)
+ (token::usable_as_delimiter, non_empty_name_warning)
+ (pipe_source, psbb_locator::psbb_locator, open_request)
+ (opena_request, define_class, pipe_output, system_request):
+ Consistently say "_is_ not allowed". The zero copula poses too
+ great a risk of incomprehension IMO.
+
+2022-09-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Add internal string `doc-Lk-font` to manage the typeface
+ in which to render URIs.
+
+ * tmac/mdoc/doc-ditroff:
+ * tmac/mdoc/doc-nroff: Add it. Use roman instead of (Courier)
+ bold. This is more consistent with man(7)'s `UR` and less with
+ mandoc(1).
+
+ * tmac/doc.tmac (Lk): Use it instead of `doc-Sy-font`.
+
+2022-09-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Fix Savannah #59738.
+
+ * tmac/doc.tmac (Lk): Process further macro arguments more like
+ other macros do, calling `doc-print-recursive`. This permits
+ recognition of end-of-sentence punctuation in the argument list.
+
+ Fixes <https://savannah.gnu.org/bugs/?59738>.
+
+2022-09-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Regression-test Savannah #59738.
+
+ * tmac/tests/doc_Lk-respect-sentence-ending-punctuation.sh: Do
+ it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-09-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Fix code style nit. Rename `doc-arg-limit` to
+ `doc-arg-count`. This register doesn't track any sort of limit
+ on the number of arguments you can give to an mdoc(7) macro, or
+ anything like that. It is simply a count of the number of
+ arguments visible to the currently operating macro.
+
+ * tmac/doc.tmac:
+ * tmac/mdoc/doc-common:
+ * tmac/mdoc/doc-ditroff:
+ * tmac/mdoc/doc-nroff:
+ * tmac/mdoc/doc-syms: Do it.
+
+2022-09-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [docs]: Fix errors in documentation regarding which escape
+ sequences accept newlines as argument delimiters, and other
+ inaccuracies.
+
+ * doc/groff.texi (Escape Sequences): Cover general cases before
+ exceptional ones. Leaders can be used as argument delimiters.
+ Call out letters and numerals as (usually) usable as well.
+ Correct an almost completely inaccurate list of escape sequences
+ that accept a newline as an argument delimiter: \A, \b, \o, \w,
+ \X, and \Z do; \B does not. Correct example of use of newline
+ as delimiter with \o escape sequence. Stop referring to the
+ decimal point as an "operator". Drop "newline" from a list of
+ prohibited delimiters by several escape sequences since it has
+ already been discussed.
+
+ * man/groff.7.man (Escape sequences): Replace weaksauce cross
+ reference to our Texinfo manual with a proper discussion of
+ acceptable delimiters in escape sequences, synced with the
+ foregoing change. Stop using quotation marks around escape
+ sequences, except for "\ " which obviously needs it.
+
+ Fixes <https://savannah.gnu.org/bugs/?63002>. Thanks to Dave
+ Kemper for the report.
+
+2022-09-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Don't throw a spurious warning when using newline as
+ delimiter with the few escape sequences that permit this.
+
+ * src/roff/troff/input.cpp (do_overstrike, do_bracket, do_width)
+ (do_special): Do it.
+
+ Fixes <https://savannah.gnu.org/bugs/?63011>. Thanks to Bjarni
+ Ingi Gislason for the report and Dave Kemper for the discussion.
+
+2022-09-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Add regression test for Savannah #63011.
+
+ * src/roff/groff/tests/\
+ some_escapes_accept_newline_delimiters.sh: Do it.
+ * src/roff/groff/groff.am (groff_TESTS): Run it.
+
+2022-09-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (do_special): Fix code style nit;
+ align function definition with declaration (internal linkage).
+
+2022-09-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grops/ps.cpp (ps_printer::special)
+ (resource_manager::process_file): Fix code style nit. Mark
+ static structs initialized within functions and never modified
+ thereafter as `const`. This attempts to work around an apparent
+ false positive from AddressSanitizer. If it doesn't pacify
+ ASAN, please explain to me how constant structure members
+ initialized to string literals and pointers to functions within
+ the translation unit can ever be null. If that is infeasible,
+ please report a bug to your compiler vendor.
+
+ Fixes (addresses, at any rate) https://savannah.gnu.org/bugs/\
+ ?61643>. Thanks to Bjarni Ingi Gislason for the report.
+
+2022-09-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Refactor: relocate most rendering option handling to
+ "doc.tmac" from "doc-ditroff" and "doc-nroff", cutting down on a
+ lot of duplication. The `S` register retains separate handling.
+
+ * tmac/doc.tmac:
+ * tmac/mdoc/doc-ditroff:
+ * tmac/mdoc/doc-nroff: Do it.
+
+2022-09-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-ditroff (doc-setup-page-layout): In troff mode,
+ if the user does not define the `LL` register, use the device's
+ default line length, not 6.5 inches. If the user does not
+ define the `LT` register, make the default line length for
+ titles the same as the regular line length, not 6.5 inches
+ independently of it. This is consistent with man(7)'s handling
+ of `LL` and `LT`.
+
+2022-09-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Support `AD` string to set default adjustment mode.
+
+ * tmac/mdoc/doc-common (Sh): Set adjustment mode to
+ user-specified default, not troff's default (and not only in
+ troff mode).
+
+ * tmac/mdoc/doc-ditroff:
+ * tmac/mdoc/doc-nroff: Process `AD` string setting from command
+ line as man(7) does.
+
+ * tmac/groff_mdoc.7.man (Formatting with groff, troff, and
+ nroff): Document it.
+
+ * NEWS: Add and update items.
+
+ Fixes part of <https://savannah.gnu.org/bugs/?63046>.
+
+2022-09-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/doc.tmac (doc-tag-list): Fix code style nit: don't give
+ `ad` request a numeric argument. Say `l` instead of `0`.
+
+2022-09-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Align inter-paragraph spacing with man(7).
+
+ * tmac/mdoc/doc-common: Use `doc-paragraph-space` when spacing
+ prior to section and subsection headings instead of spacing by
+ the 1v default.
+ * tmac/mdoc/doc-ditroff: Align inter-paragraph distance amount
+ in troff mode with man(7), reducing to 0.4v from 0.5v.
+
+2022-09-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-nroff: Map monospaced fonts (CR, CB, CI, CBI) to
+ standard styles as man(7) has done for 15 years. This silences
+ warnings from the formatter when a man page attempts to use
+ fonts from the Courier family in tbl(1) tables, which is about
+ the only place a reasonable man page attempts such a thing.
+
+2022-09-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Stop prefixing center header with name of operating
+ system. This was hard-coded to "BSD" and stuck on all mdoc(7)
+ pages using a default manual section number, regardless of host
+ operating system. Bad idea. Further, the argument to the `Os`
+ call, if any, or a default, is always disclosed in the left
+ footer.
+
+ * tmac/mdoc/doc-common: Do it.
+ (Dt): Initialize `doc-volume` as empty and annotate it;
+ calling the macro with a numeric second argument overrides the
+ fallback default of "LOCAL". A slash is no longer needed to
+ separate a recognized architecture string from the OS name, so
+ drop it.
+
+ * tmac/tests/doc_smoke-test.sh: Update test expectations.
+
+2022-09-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Drop dead code. The register
+ `doc-volume-operating-system-ateol`, introduced in groff 1.18
+ {July 2002}, was being tested but never set to a nonzero value.
+ In fact, it seems never to have been.
+
+ * tmac/mdoc/doc-common: Get rid of it...
+ (Dt): ...and the dependent block.
+
+2022-09-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Make `Ux` render "Unix" in mixed case.
+
+ * tmac/mdoc/doc-syms (Ux): Do it. Also remove local string
+ after we're done with it.
+
+ Continues work begun prior to groff 1.22.4 release.
+
+2022-09-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Align spacing around headers with man(7).
+
+ * tmac/doc.tmac (doc-save-global-vars, doc-restore-global-vars):
+ * tmac/mdoc/doc-common (Rd):
+ * tmac/mdoc/doc-ditroff:
+ * tmac/mdoc/doc-nroff: Stop defining, saving, and restoring
+ `doc-header-space`.
+
+ * tmac/mdoc/doc-common (doc-header): When starting new document
+ and not continuously rendering, space by one half-inch instead
+ of by the now-defunct `doc-header-space` amount (which,
+ strictly, should not have applied to this measurement). If
+ continuously rendering, extend page length by 1v to accommodate
+ header line. After formatting header, if not continuously
+ rendering, space to 1 inch below first text baseline.
+
+2022-09-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Support `C` register for consecutive page numbering.
+
+ * tmac/mdoc/doc-common (Dd): Reset page number to 1 upon new
+ document only if not consecutively numbering.
+
+ * tmac/mdoc/doc-ditroff:
+ * tmac/mdoc/doc-nroff: Process `C` register setting from command
+ line as man(7) does.
+
+ * tmac/groff_mdoc.7.man (Formatting with groff, troff, and
+ nroff): Document it.
+
+ Fixes part of <https://savannah.gnu.org/bugs/?63046>.
+
+2022-09-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Align trap management more closely with man(7).
+
+ * tmac/mdoc/doc-common: Call new macro (see below)
+ `doc-set-up-continuous-rendering` when initializing, if that
+ mode is configured.
+ (doc-ne): New macro replaces `ne` request
+ in continuous rendering mode. It extends the page length by the
+ amount in the argument or by 1v if none given.
+ (doc-bp): New macro replaces `bp` request in continuous
+ rendering mode, setting the page length to the vertical drawing
+ position.
+ (doc-set-up-continuous-rendering): New macro renames requests to
+ emplace the foregoing.
+ (Dd): Interpret this macro call strictly as starting a new
+ mdoc(7) document. (andoc.tmac already makes this assumption,
+ and has for over 20 years. groff_mdoc(7) and mandoc_mdoc(7)
+ also prescribe the sequence `Dd`, `Dt`, `Os`.) We require this
+ invariant even more rigidly now because it's the only way we can
+ be sure that we can process multiple documents while rendering
+ headers and footers with information corresponding to the
+ appropriate document. (man(7)'s `TH` has an advantage here in
+ that calling it is "atomic": from its arguments alone you can
+ obtain everything you need to know to format the header and
+ footer. In mdoc(7), permuting the initialization macro order
+ reliably produces chaos.) Break the page (if necessary)
+ _before_ processing any arguments (instead of after), to flush
+ the previous page's footer. Stop calling `doc-set-up-titles`
+ here; we don't have enough information to do that yet. Also
+ stop writing the PDF bookmark here, because `doc-document-title`
+ and `doc-section` will not reflect the new page content yet.
+ (Os): Once the `doc-operating-system` string content has been
+ determined, call `doc-set-up-titles`, write the PDF bookmark for
+ the page, and call `doc-header`, causing the page header to be
+ formatted. These changes further imply a stronger requirement
+ on initialization macro ordering being canonical.
+
+ Fixes <https://savannah.gnu.org/bugs/?62774> (7/7).
+
+2022-09-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Trivially refactor. Relocate string and macro
+ definition within file. mdoc(7) mandates that the document
+ setup macros `Dd`, `Dt`, and `Os` be called in that order;
+ arrange their definitions accordingly, for maintainability.
+
+2022-09-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Refactor. Rename strings and macro for clarity. These
+ things don't only affect headers.
+ - doc-header-string -> doc-pageref
+ - doc-header-string-saved -> doc-pageref-saved
+ - doc-setup-header -> doc-set-up-titles
+
+ * tmac/doc.tmac:
+ * tmac/mdoc/doc-common: Do it.
+
+2022-09-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Refactor. There is no difference in
+ `doc-header-string` and `doc-setup-header` between the files
+ "doc-ditroff" and "doc-nroff", so define them only once, in
+ "doc-common".
+
+ * tmac/mdoc/doc-common:
+ * tmac/mdoc/doc-ditroff:
+ * tmac/mdoc/doc-nroff: Do it.
+
+2022-09-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Align footer management more closely with man(7).
+
+ * tmac/doc.tmac (doc-save-global-vars, doc-restore-global-vars):
+ * tmac/mdoc/doc-common (Rd):
+ * tmac/mdoc/doc-ditroff:
+ * tmac/mdoc/doc-nroff: Stop defining, saving, and restoring
+ `doc-footer-space`.
+
+ * tmac/mdoc/doc-common (doc-break-body-text): New macro, called
+ only when not continuously rendering, schedules a page break.
+ (doc-footer): Stop vertically spacing by `doc-footer-space`,
+ instead relying upon a trap to move us here.
+
+ * tmac/mdoc/doc-ditroff (doc-setup-header):
+ * tmac/mdoc/doc-nroff (doc-setup-header): Set traps at the end
+ of the page where man(7) does by default; break the body text at
+ 1 inch from the page bottom, and write the footer at ½ inch.
+
+ * tmac/mdoc/doc-nroff (doc-setup-header): Add 1/6 em "thin
+ space" between man page name and parenthesized section, for
+ precise parity with doc-ditroff implementation. (`\|` does not
+ take up any character cells on nroff devices.)
+
+ Fixes <https://savannah.gnu.org/bugs/?62774> (6/7).
+
+2022-09-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-common (Dt, Dd): Emit diagnostic warnings if
+ macros called with no arguments.
+
+ Fixes <https://savannah.gnu.org/bugs/?62774> (5/7).
+
+2022-09-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Fix code style nit: stop using Control+G as an escape
+ sequence argument delimiter. This is not necessary in groff and
+ hasn't been for at least thirty years. See the node/section
+ "Implementation Differences" of our Texinfo manual. Our mdoc
+ implementation does not operate in compatibility mode, so using
+ control characters like this obfuscates input to no advantage.
+
+ * tmac/doc.tmac:
+ * tmac/mdoc/doc-common:
+ * tmac/mdoc/doc-ditroff:
+ * tmac/mdoc/doc-nroff:
+ * tmac/mdoc/doc-syms: Do it.
+
+2022-09-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-common (doc-footer): Pull more footer concerns
+ into this macro. Don't bail out if continuously rendering;
+ instead, format the appropriate footer text if we are. For now,
+ break the page only if we are not continuously rendering.
+ (doc-end-macro): Call `doc-footer` instead of formatting footer
+ here.
+
+ Fixes <https://savannah.gnu.org/bugs/?62774> (4/7).
+
+2022-09-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-common (doc-end-macro): When continuously
+ rendering, set the page reference (e.g., "ls(1)") in the right
+ footer instead of repeating the left footer. Thanks to Ingo
+ Schwarze for the discussion.
+
+ * tmac/tests/doc_smoke-test.sh: Update expectations of footer
+ regression test.
+
+ Fixes part of <https://savannah.gnu.org/bugs/?62926>.
+
+2022-09-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-common (doc-end-macro): Reset strings to reduce
+ info leaks from one man page to the next.
+
+ Fixes <https://savannah.gnu.org/bugs/?62774> (3/7).
+
+2022-09-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-common (Dt): Stop reinitializing `doc-volume`
+ and `doc-section`. This is the job of package initialization
+ {and, soon, the end-of-input macro}.
+
+ Fixes <https://savannah.gnu.org/bugs/?62774> (2/7).
+
+2022-09-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-common: Populate default date string
+ `doc-date-string` with "UNDATED".
+ (Dd, Dt, Os): Make more orthogonal: stop touching
+ `doc-topic-name`. It is "doc.tmac"'s job to initialize it and
+ the `Nm` macro's job to update it.
+ (Dd): Do nothing if given no arguments. (You can still blank
+ out the document date with an explicitly empty argument:
+ .Dd ""
+ .)
+
+ Fixes <https://savannah.gnu.org/bugs/?62774> (1/7).
+
+2022-09-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-common: Change `doc-default-operating-system`
+ string from "BSD" to "GNU", per discussion with Ingo Schwarze.
+ See <https://lists.gnu.org/archive/html/groff/2022-07/\
+ msg00280.html>.
+
+ * tmac/tests/doc_smoke-test.sh: Update expectations of footer
+ regression test.
+
+2022-09-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-common (Dt): Delete lingering and useless
+ definition of `doc-command-name` string. Thanks to Steffen
+ Nurpmeso for the report. See commit e9e92ee008, 27 August.
+
+2022-09-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/pic/pic.ypp (not_lower_than): Emit deprecation
+ warning for use of 'rand()' with a (non-empty) argument. The
+ man page has declared it thus for over 30 years, at least since
+ groff 1.02 (June 1991).
+
+2022-09-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/pic/pic.ypp (object_spec): Emit deprecation
+ diagnostic for "plot" command. The man page has declared it
+ thus for over 30 years, at least since groff 1.02 (June 1991).
+
+2022-09-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/pic/pic.ypp (placeless_element): Explicitly say
+ that an unsafe command is being ignored in diagnostic.
+
+2022-09-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/eqn/main.cpp (main): Drop man page reference from
+ deprecation diagnostics. The man page might be installed with a
+ prefix determined at configuration time, and that's too much
+ trouble to mess with for construction of a message. Trust the
+ user of these ancient options to try reading the man page with
+ the same name as the command.
+
+2022-09-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [docs]: Revise discussion of measurements.
+
+ * doc/groff.texi: Drop Texinfo @codequote* command brackets
+ around revised sections; relevant nodes have been reviewed for
+ correct glyph usage. Move concept index entries for obsolescent
+ term "machine units" to same location as "basic units".
+ Bump document date.
+ (Measurements): Rewrite presentation. We have already
+ introduced page geometry concepts, including the concept of
+ basic units.
+ (Motion Quanta): New subsection node; introduce this concept
+ much sooner, right after measurement units. Relocate
+ documentation of `.H` and `.V` registers from a miscellaneous
+ read-only register list here. Introduce example of rounding to
+ horizontal motion quantum.
+ (Default Units): Revise discussion. Stop abusing @result
+ notation in example.
+ (Built-In Registers): Relocate `.H` and `.V` as above.
+
+ * man/groff.7.man: Sync with Texinfo content updates.
+
+ Fixes <https://savannah.gnu.org/bugs/?61432>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2022-09-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Drop groff_filenames(5) document. It says nothing accurate that
+ is not covered elsewhere.
+
+ * contrib/groff_filenames: Delete.
+ * doc/doc.am (GROFF_MAN_PAGES): Drop.
+ * src/roff/groff/groff.1.man: Drop cross reference to it.
+ * NEWS: Add item.
+
+ Fixes <https://savannah.gnu.org/bugs/?61818>.
+
+2022-09-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/tbl.1.man (Table data): Generalize discussion
+ of roff control line use in tables.
+ (Examples): Illustrate how to embed a comment in a table.
+
+2022-08-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * NEWS: man(7)'s `TS` no longer adds vertical space. See commit
+ 7ec36dc9b9, 30 July.
+
+2022-08-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/eqn/main.cpp (main): Issue deprecation warning
+ upon use of '-p' or '-s' options. The eqn(1) man page has
+ documented these as deprecated since at least groff 1.02 (June
+ 1991). Don't count on them sticking around another 30 years.
+
+2022-08-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/eqn/main.cpp (main): Clarify error diagnostics
+ regarding invalid option arguments. Identify the option being
+ handled at the time and characterize the argument as "invalid",
+ not "bad".
+
+2022-08-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [eqn]: Drop support for undocumented '-D' option. It has been
+ undocumented, and issued a warning of its obsolescence upon use,
+ for 30 years, since groff 1.06 (September 1992). That's plenty
+ long enough for a deprecation cycle.
+
+ * src/preproc/eqn/main.cpp (main): Do it.
+ * NEWS: Add item.
+
+2022-08-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: (EX, EE): Always break line, even if call invalid.
+
+ * tmac/an.tmac (EX, EE):
+ * tmac/an-ext.tmac (EX, EE): Do it. Ingo Schwarze pointed out
+ that page authors will expect breaking semantics from these
+ macros even if using them in an ill-formed way. In a
+ well-formed document, the breaks are redundant but harmless (the
+ later `nf` and `fi` requests, respectively, also cause breaks).
+
+2022-08-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Trivially refactor.
+
+ * tmac/doc.tmac:
+ * tmac/mdoc/doc-common: Rename string `doc-command-name` to
+ `doc-topic-name`; the former is misleading for man pages not in
+ sections 1, 6, or 8.
+
+2022-08-25 Bjarni Ingi Gislason <bjarniig@vortex.is>
+
+ * man/groff_char.7.man: Fix bad example syntax.
+
+ Fixes <https://savannah.gnu.org/bugs/?62959>.
+
+2022-08-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Trivially refactor.
+
+ * tmac/mdoc/doc-common:
+ * tmac/mdoc/doc-ditroff:
+ * tmac/mdoc/doc-nroff: Stop using "Null" as an empty string
+ indicator when comparing a string interpolation to an empty
+ parameter will serve just as well; it is also more idiomatic.
+ The string in question, `doc-section`, is never formatted if it
+ is empty anyway; the very tests at issue, which populate
+ `doc-header-string`, ensure this.
+
+2022-08-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/env.cpp (environment::set_family): Throw error
+ if user requests a font family that (when combined with the
+ current style) can't be resolved to a real font name. Fixes a
+ regression introduced by me in commit d8cb8cf9d8, 2021-09-15,
+ arising from a revision of font selection logic in node.cpp to
+ enable a bunch of _other_ font error diagnostics.
+
+ Fixes <https://savannah.gnu.org/bugs/?62941>. Thanks to Dave
+ Kemper for the report and two useful end points for a bisection.
+
+2022-08-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/env.cpp (environment::set_family): Add some
+ paranoia. Add `assert()`s on the previous font mounting
+ position still being valid and the font family dictionary lookup
+ not returning a null pointer. Add an early return for the
+ latter case (which should be impossible).
+
+2022-08-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/node.cpp (font_family::make_definite):
+ Refactor. Rename parameter from inscrutable `i` to
+ `mounting_position`. Add `assert()` to enforce invariant: we're
+ passed a mounting position that is nonnegative. Use `pos` as
+ short alias of parameter once we're into the function body.
+ Relocate conditional branches to front-load early returns as
+ well as those requiring little code to handle. This reduces the
+ average indentation level of the function, a readability win.
+
+2022-08-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Restore robustness to `EE` misuse.
+
+ * tmac/an.tmac: Add `an*is-in-example` register to track state
+ of within-exampleness. Not doing so can cause a spurious use of
+ `EE` to wrongly set the inter-paragraph distance to zero.
+ (TH): Initialize register.
+ (EX): Test register; if set, ignore macro call and, if
+ `CHECKSTYLE` warnings are on, throw diagnostic. Set register.
+ (EE): Test register; if clear, ignore macro call and, if
+ `CHECKSTYLE` warnings are on, throw diagnostic. Clear register.
+
+ * tmac/an-ext.tmac (EX, EE): Similar, using `mX` register.
+ Because AT&T troff had no `return` request, invert the sense of
+ the tests and put the entire macro bodies inside conditionals.
+
+ This regressed post-1.22.4. Thanks to Ingo Schwarze for the
+ report and a proposed patch.
+
+2022-08-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-ext.tmac: Refactor. Rename `mX` to `mZ` so we can use
+ `mX` for an "in-example" state register in a future commit.
+ Rename `mE` to `mF` to store the current font's mounting
+ position. Bizarrely, `mF` was not already used for this
+ purpose.
+
+2022-08-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libgroff/error.cpp (do_error_with_file_and_line):
+ Trivially refactor. Use separate string constant for invariant
+ material. (This will make it easier to, for example, store the
+ diagnostic level strings in an array that can be indexed by
+ their corresponding `enum` type.)
+
+2022-08-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (fatal_with_file_and_line)
+ (error_with_file_and_line, debug_with_file_and_line): Align more
+ closely with GNU Coding Standards regarding diagnostics: don't
+ suffix the colon after the program name with a space when
+ location information follows.
+
+2022-08-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grohtml/grohtml.1.man: Fix erroneous claim.
+ Images are not generated when "baseline rules" or "box rules"
+ are encountered in the input. These are troff special
+ characters; the former is converted to an underscore and the
+ latter to U+2502, "box drawings light vertical". This remains
+ true even if a series of them is drawn with the `\l` escape
+ sequence. (I also checked vertical line drawing with `\L`.
+ grohtml's handling of that provoked a rather wet eructation from
+ my lower esophageal sphincter--the output is assuredly not
+ correct. But it's still not an image.)
+
+2022-08-22 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Bug #62934 - after glyph remapped mark it as used
+
+ When many glyphs are remapped from code points above 255
+ such as writing documents in cyrillic with the U-TR fonts,
+ gropdf starts reusing code points in the range 128-255.
+ If subsequently one of those code points is actually required,
+ such as \(em (code 138), and it has been replaced by a
+ cyrillic, then it needs to be mapped to another free code.
+
+ To determine if a particular code point is free each glyph
+ has a USED flag. The bug was caused because after remapping
+ \(em to the next free glyph the USED flag was not set. So the
+ next new cyrillic character to be entered was given the same
+ code point as had been allocated to \(em.
+
+ * src/devices/gropdf/gropdf.pl: Set the USED flag on remapped
+ glyphs.
+
+ Fixes <https://savannah.gnu.org/bugs/?62934>.
+
+ Thanks to Nikita Ivanov for spotting the problem and testing
+ the fix.
+
+2022-08-20 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Bug #62923 - problem using aliased glyphs
+
+ With a large font if 2 characters above the 255 code
+ point limit are aliased, the aliased glyph has incorrect meta
+ data.
+
+ * src/devices/gropdf/gropdf.pl: Instead of duplicating a pointer
+ to the font metadata, duplicate the data itself. Then, if the
+ glyph is remapped to a code point under 256, the metadata is
+ preserved.
+
+ Fixes <https://savannah.gnu.org/bugs/?62923>. Thanks to Nikita
+ Ivanov for the report.
+
+2022-08-18 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ [gropdf]: Improve parsing of troff font files.
+
+ * src/devices/gropdf/gropdf.pl: Allow the glyph code number
+ to be octal or hex as well as a decimal number. If entity_name
+ is missing use name instead.
+
+2022-08-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Support pic(1) "flyback" feature.
+
+ * tmac/s.tmac (PF): Add macro; it does what `PE` formerly did,
+ minus vertical spacing.
+ (PE): Call `PF` and vertically space as before.
+
+ * doc/groff.texi (ms Insertions):
+ * doc/ms.ms (Tables, figures, equations, and references):
+ * tmac/groff_ms.7.man (Tables, figures, equations, and
+ references): Document it.
+
+ * NEWS: Add item.
+
+ Fixes <https://savannah.gnu.org/bugs/?60558>.
+
+2022-08-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac (@PS): Validate better; check for 2 arguments
+ exactly.
+
+2022-08-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [pic]: Recognize `.PY` as synonym of `.PF`.
+
+ * src/preproc/pic/main.cpp:
+ * src/preproc/pic/pic.h: Add new Boolean variable,
+ `want_alternate_flyback` to record `.PY` usage.
+
+ * src/preproc/pic/main.cpp (top_input::get, top_input::peek):
+ Recognize it. Update diagnostic messages to mention it.
+ (main): Define `PY` troff macro as empty if not defined.
+
+ * src/preproc/pic/troff.cpp (troff_output::finish_picture):
+ Don't advance the vertical position if `want_alternate_flyback`.
+ Write out the `PY` macro call if it was on the input.
+
+ * src/preproc/pic/pic.1.man: Document it.
+
+ * tmac/pic.tmac (PY): Define the same as `PF`.
+
+ * NEWS: Add item.
+
+ Fixes <https://savannah.gnu.org/bugs/?62901>.
+
+2022-08-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [pic]: Refactor `flyback_flag`.
+
+ * src/preproc/pic/main.cpp:
+ * src/preproc/pic/pic.h:
+ * src/preproc/pic/troff.cpp: Rename to `want_flyback`.
+
+ * src/preproc/pic/main.cpp:
+ * src/preproc/pic/pic.h: Demote type from `int` to `bool`.
+
+ * src/preproc/pic/main.cpp (top_input::get, top_input::peek):
+ Use parentheses to clarify operation precedence.
+
+2022-08-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/eqn/eqn.1.man: Expand to include lists of
+ recognized primitives and predefined macros.
+
+2022-08-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * NEWS: Add item for new groff mm `V` register support.
+
+2022-08-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/eqn/lex.cpp (do_delim): Recognize "delim on" even
+ in compatibility mode, enabling tbl to toggle eqn delimiter
+ recognition when it is run in compatibility mode as well.
+ * src/preproc/eqn/eqn.1.man (Controlling delimiters): Update.
+ * NEWS: Add item.
+
+ Fixes <https://savannah.gnu.org/bugs/?62852>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2022-08-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac (TH): Fix spurious complaint from `CHECKSTYLE`
+ feature when a custom manual section title is declared for a
+ standard section number. Thanks to Quentin Monnet for the
+ report.
+
+2022-07-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/pdfpic.tmac: Finish incomplete string renames. Continues
+ 0fd6ab6b4c, 21 January.
+ pdfpic*file-name -> pdfpic*file-name-base
+ pspic-args -> pdfpic*pspic-args
+
+2022-07-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac (TS): Stop inserting space before tables. Unlike
+ ms(7), man(7) has no concept of "displays" and thus none of
+ "display distance". It is up to the page author to use
+ paragraphing macros around tables if vertical space is desired.
+ And not up to us to impose it.
+
+ Fixes <https://savannah.gnu.org/bugs/?62841>.
+
+2022-07-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Regression-test Savannah #62841.
+
+ * tmac/tests/an_TS-adds-no-vertical-space.sh: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-07-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/table.cpp (table::do_bottom): Avoid
+ overprinting a double-boxed table's bottom border on nroff
+ devices.
+
+2022-07-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Expand regression test for Savannah #49390. Check for
+ overlap of double box borders, too.
+
+ * src/preproc/tbl/tests/\
+ do-not-overlap-bottom-border-in-nroff.sh: Do it.
+
+2022-07-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Fix Savannah #49390.
+
+ * src/preproc/tbl/table.cpp (table::do_bottom): Avoid
+ overprinting a boxed table's bottom border on nroff devices.
+
+ Fixes <https://savannah.gnu.org/bugs/?49390>. Thanks to Osamu
+ Sayama for the report.
+
+2022-07-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Regression-test Savannah #49390.
+
+ * src/preproc/tbl/tests/\
+ do-not-overlap-bottom-border-in-nroff.sh: Do it.
+ * src/preproc/tbl/tbl.am (tbl_TESTS): Run test.
+
+2022-07-28 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ [gropdf]: Improve slant application to lowercase Greek letters.
+ <https://lists.gnu.org/archive/html/groff/2022-07/msg00210.html>
+
+ * tmac/pdf.tmac: Slant only if the glyph is sourced from a
+ special font, not a regular (text) font containing Greek glyphs.
+
+2022-07-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac: Add italic correction support to `I` and `BI`
+ macros. Call `par*define-font-macro` with newly recognized
+ third argument indicating that italic corrections should be
+ applied.
+ (par*define-font-macro): Apply the corrections if directed.
+
+2022-07-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (input_char_description): Clear
+ static buffer on every entry to the function so that calling it
+ twice in succession where the second call populates the buffer
+ with less data than the first doesn't leave garbage characters
+ in a diagnostic message. Problem appears to date back to 1991
+ or earlier.
+
+ Fixes <https://savannah.gnu.org/bugs/?62813>.
+
+2022-07-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (token::usable_as_delimiter):
+ (do_non_interpreted, interpolate_arg): Recast diagnostic
+ messages for clarity.
+
+2022-07-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac: Initialize section number registers. Fixes
+ warnings when starting section numbering at a depth greater than
+ 1.
+
+ Fixes <https://savannah.gnu.org/bugs/?62812>.
+
+2022-07-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_PAGE): Use 'grep -q' instead of redirecting
+ standard output to null device. The '-q' option was
+ standardized in POSIX Issue 5 (1997) or earlier. Also drop the
+ redirection of the standard error stream; we have already
+ checked the file named in "$descfile" for existence and
+ readability. grep should thus not emit diagnostic messages.
+
+2022-07-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_PAGE): Macro used awk(1) without
+ `AC_REQUIRE`-ing a relevant macro or checking for its existence.
+ Fortunately, sed is powerful enough for our needs. Remove
+ dependency on awk. Cope with "search" directive in resolv.conf
+ having multiple arguments. Match "domain" directive in same
+ file instead of "dom", which I cannot find attested (this logic
+ dates to 1991). Rename `dom` shell variable to `domains` for
+ clarity, since its multiplicity could be greater than 1.
+
+2022-07-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_PAGE): Refactor: drop AC_DEFINE of
+ `PAGEA4`. This symbol appears to be a relic; it is nowhere
+ tested or dereferenced.
+
+2022-07-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tty-char.tmac: Drop definition of \[sd] special
+ character. This was superseded by commit 78e666246c, 8 May,
+ which defined a fallback for the character in tty.tmac instead.
+ Thanks to Dave Kemper for the catch.
+
+2022-07-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh:
+ Skip test if "pdfinfo" command not available.
+
+2022-07-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Add sanity checks for font description file generation
+ for PDF output device, prompted by discussion with Ingo
+ Schwarze. See <https://lists.gnu.org/archive/html/groff/\
+ 2022-06/msg00094.html>.
+
+ * font/devpdf/tests/basic-fonts-present.sh:
+ * font/devpdf/tests/urw-fonts-present.sh: Add files.
+
+ * font/devpdf/devpdf.am (font_devpdf_TESTS): Add the former test
+ unconditionally, and the latter only if `HAVE_URW_FONTS`.
+
+2022-07-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/devpdf.am: Refactor to simplify. Now that
+ symbol.map lives in the "devpdf/generate" directory along with
+ the other map files, it doesn't need a dedicated Makefile target
+ to produce it.
+ (DEVPDFFONTMAP_1, DEVPDFFONTMAP_2): Coalesce and rename to...
+ (devpdffontmapdata): ...this.
+ (font/devpdf/map/symbol.map:): Drop target.
+ (devpdffontmap_DATA, font/devpdf/download): Update dependencies.
+
+2022-07-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/util/BuildFoundries.pl (LoadFoundry): Recast
+ diagnostic message so that the user understands the consequence
+ of failure to locate a Type 1 font file (that isn't one of the
+ base 14 PostScript level 1 fonts): the font will be unavailable
+ for the "pdf" output device.
+
+2022-07-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/util/BuildFoundries.pl (LoadFoundry): Separate
+ lists of Type 1 font names with spaces as well as commas, for
+ better diagnostic message readability. Also begin message in
+ lowercase (per GNU Coding Standards).
+
+2022-07-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/util/BuildFoundries.pl (LoadFoundry): Verify that
+ `$foundrypath->[$j]` is defined before operating on it.
+
+2022-07-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [afmtodit]: Clarify diagnostic message.
+
+ * src/utils/afmtodit/afmtodit.pl: When we have excess Adobe
+ Glyph List mappings for a groff special character identifier
+ {making the reverse mapping from groff special character to font
+ glyph name ambiguous}, report that we're ignoring the excess.
+ Use "print STDERR" instead of Perl "warn" built-in since we want
+ diagnostic messages to start with the name of the program
+ emitting them.
+
+2022-07-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Name and place PS->groff glyph name maps consistently.
+
+ * font/devps/symbolmap: Rename from this...
+ * font/devps/generate/symbol.map: ...to this.
+
+ * font/devpdf/devpdf.am (font/devpdf/map/symbolmap): Rename
+ target...
+ (font/devpdf/map/symbol.map): ...to this.
+ (font/devpdf/map/symbol.map): Copy "devps" version of file from
+ its new location in the "generate" subdirectory.
+
+ * font/devpdf/Foundry.in: Reflect rename.
+
+ * font/devps/generate/Makefile (symbolmap): Rename target...
+ ($(srcdir)/symbol.map): ...to this.
+
+ * font/devps/devps.am (DEVPSGENFILES, EXTRA_DIST):
+ * font/devps/generate/Makefile (S, EURO $(SPECIALFONTS), clean):
+ * src/utils/afmtodit/afmtodit.1.man: Reflect rename and
+ relocation.
+
+ * font/devps/generate/dingbats.rmap: Rename from this...
+ * font/devps/generate/dingbats-reversed.map: ...to this.
+
+ * font/devps/devps.am (DEVPSGENFILES):
+ * font/devps/generate/Makefile (ZDR):
+ * src/utils/afmtodit/afmtodit.1.man: Reflect rename.
+
+ * font/devps/generate/lgreekmap: Rename from this...
+ * font/devps/generate/slanted-symbol.map: ...to this.
+
+ * font/devps/devps.am (DEVPSGENFILES):
+ * font/devps/generate/Makefile (SS):
+ * src/utils/afmtodit/afmtodit.1.man: Reflect rename.
+
+ * font/devps/generate/textmap: Rename from this...
+ * font/devps/generate/text.map: ...to this.
+
+ * font/devpdf/Foundry.in:
+ * font/devpdf/devpdf.am (DEVPDFFONTMAP_1):
+ * font/devps/devps.am (DEVPSGENFILES):
+ * font/devps/generate/Makefile (TEXTMAP):
+ * src/devices/gropdf/gropdf.1.man:
+ * src/devices/grops/grops.1.man:
+ * src/utils/afmtodit/afmtodit.1.man: Reflect rename.
+
+2022-07-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (doc/ms.ps): Add dependency on "eqn", and call
+ groff with "-e" option.
+ * src/utils/grog/tests/smoke-test.sh: Update expected "grog"
+ output for the ms.ms document.
+
+2022-07-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (doc/ms.ps): Add dependency on "tbl".
+
+2022-07-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/node.cpp (suppress_node::tprint): Add source
+ file line number after its name when emitting "grohtml-info", to
+ aid debugging.
+
+2022-07-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/node.cpp (get_register, get_string): Reorder
+ null pointer inequality comparisons; they don't need to be in a
+ funny order because it's pretty hard to mistype `!=` as an
+ assignment operator. Annotate them as null pointers to ease any
+ future migration to ISO C++11. Use primitive type constructor
+ instead of C-style cast operator; this seems more idiomatic.
+
+2022-07-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/html/pre-html.cpp (generateImages): Flush the
+ standard error stream after writing to it in a loop.
+
+2022-07-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac (RP): Recognize new optional arguments
+ `no-renumber` and `no-repeat-info`, the latter as a synonym for
+ the existing `no`. The former suppresses the page number
+ manipulation that normally occurs. Drop now-unnecessary `pn 0`
+ request.
+ (top level, cov*first-page-init, RP, cov*print): Rename
+ `cov*rp-format` to `cov*use-rp-format` for clarity.
+ (cov*break-page): New macro breaks the cover page at the end,
+ resetting next page number to 1 only if desired by user.
+ (cov*print, cov*rp-print): Call `cov*break-page` instead of
+ invoking `bp`.
+
+ * doc/groff.texi (Document Description Macros) <RP>:
+ * doc/ms.ms (Document description macros) <RP>:
+ * tmac/groff_ms.7.man (Document description macros) <RP>:
+ Document them.
+
+ * NEWS: Add item.
+
+2022-07-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac: Rename register `cov*rp-no` to
+ `cov*rp-no-repeat-info`.
+
+2022-07-08 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ * font/devpdf/util/BuildFoundries.pl (LocateFile): Some systems
+ store .afm files in a parallel directory to the Type 1 files,
+ restore original path after checking for parallel directory.
+
+2022-07-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/devpdf.am (font/devpdf/download): Call
+ "BuildFoundries" with new `--strict` option so that the build
+ fails if the AFM files for the URW fonts can't be found.
+
+2022-07-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/util/BuildFoundries.pl: Add Boolean-valued scalar
+ `beStrict` (defaults false) and new command-line option
+ `--strict` to make it true.
+ (LoadFoundry): Check return value of subroutine `LocateAF`.
+ Emit diagnostic if it is null, as a warning if not "strict", and
+ fatal if so.
+
+2022-07-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/devpdf.am (font/devpdf/util/BuildFoundries): Add
+ dependency on "afmtodit" since "BuildFoundries" calls this
+ program when generating groff font description files from URW
+ fonts.
+
+2022-07-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Fix Savannah #62690.
+
+ * tmac/s.tmac (P1, SC, UC, P2): Drop undocumented support for
+ document-private macros used by Kernighan & Cherry's
+ "Typesetting Mathematics -- User's Guide (Second Edition)".
+
+ Fixes <https://savannah.gnu.org/bugs/?62690>.
+
+2022-07-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Fix Savannah #62688.
+
+ * tmac/s.tmac (DE): Set no-space mode when ending displays.
+ (@EN): Set no-space mode after outputting the display distance
+ so that it doesn't combine with inter-paragraph space.
+
+ Fixes <https://savannah.gnu.org/bugs/?62688>.
+
+2022-07-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Regression-test Savannah #62688.
+
+ * tmac/tests/s_no-excess-space-around-displays.tmac: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-07-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Fix Savannah #62687.
+
+ * tmac/s.tmac (@MC): Honor `MINGW` register even when setting
+ only two columns, as clearly implied by our documentation.
+
+ Fixes <https://savannah.gnu.org/bugs/?62687>.
+
+2022-07-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Regression-test Savannah #62687.
+
+ * tmac/tests/s_honor-MINGW-when-two-columns.sh: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-07-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Fix Savannah #62686.
+
+ * tmac/s.tmac (@MC): Set no-space mode before doing a paragraph
+ reset, not after: we don't want vertical space at the top of the
+ first column when entering multi-column mode, because then it
+ doesn't align with the tops of subsequent columns.
+
+ Fixes <https://savannah.gnu.org/bugs/?62686>.
+
+2022-07-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Regression-test Savannah #62686.
+
+ * tmac/tests/s_mark-column-start-correctly.sh: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-07-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac (IX): Drop.
+ * NEWS: Add item.
+
+2022-07-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac: Add "sorry" implementations for documented but
+ unsupported Unix Version 7 ms macros. This way it's easier to
+ tell when a historical document needs one and this case is
+ distinguishable from a document-private macro warned about with
+ "groff -w mac".
+
+2022-07-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac (UX): Drop undocumented support for this macro.
+ This implementation isn't consistent with historical ones, which
+ identified the trademark holder. But doing that is a problem,
+ so just stop trying to cope. Also, spelling Unix in full caps
+ was an imposition by the AT&T legal department on the CSRC.
+
+ "The name Unix is a trademark, originally owned by Bell Labs and
+ subsequently traded off like a baseball card among a number of
+ companies." -- Ben Klemens
+
+2022-07-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Replace incomplete documentation of unimplemented macros.
+
+ * doc/groff.texi (Missing ms Macros):
+ * doc/ms.ms (AT&T ms macros not appearing in groff ms): Drop,
+ replacing with...
+
+ * doc/groff.texi (Unix Version 7 ms Macros Not Implemented by
+ groff ms):
+ * doc/ms.ms (Unix Version 7 ms macros not implemented by groff
+ ms):
+ * tmac/groff_ms.7.man (Unix Version 7 macros not implemented by
+ groff ms): ...these.
+
+2022-07-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (do_translate): Throw an error
+ diagnostic when the user attempts to translate space characters.
+ {By contrast, translating _to_ [unbreakable, unadjustable]
+ spaces is an old troff hack often seen as ".tr ~ ", and largely
+ superseded by groff's "\~" escape sequence, now widely supported
+ by other troffs.}
+
+ Fixes <https://savannah.gnu.org/bugs/?60803>. Thanks to T. Kurt
+ Bond and Oliver Corff for the report.
+
+2022-07-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/pipeline.c: Refactor. Drop function rename via
+ preprocessor macro usage. Declare and define `c_error` by its
+ correct name.
+ (run_pipeline): Update call sites. Stop flushing standard error
+ stream after calling libgroff's `error` function (which
+ `c_error` wraps); libgroff already guarantees this operation.
+
+2022-07-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (abort_request): Flush the standard
+ error stream before exiting, to improve chances of user seeing
+ any message as arguments to the `ab` request.
+
+2022-06-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/html/pre-html.cpp
+ (char_buffer::run_output_filter): Die if platform supports
+ neither `fork()` nor `spawn()` for child process creation.
+
+2022-06-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/html/pre-html.cpp (cleanup): Add function to tidy
+ memory before exiting.
+ (main): Register aforementioned function with `atexit()`. Die
+ if registration fails.
+
+2022-06-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/html/pre-html.cpp (do_file): Die if `fclose()`
+ fails; such a situation suggests a pretty hosed environment.
+
+2022-06-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/html/pre-html.cpp (checkImageDir): If `mkdir()`
+ fails, use `strerror()` to report the underlying problem.
+
+2022-06-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/html/pre-html.cpp: Refactor. Drop unnecessary
+ prototype for static function. Use idiomatic C++98 null pointer
+ constant. Annotate it as null pointer to ease any future
+ migration to ISO C++11. Boolify. Use C++98 bool data type
+ instead of preprocessor macros `TRUE` and `FALSE`. Demote some
+ global Boolean variables from `int` to `bool` and rename some to
+ be more clear: `show_progress` -> `want_progress_report`;
+ `debugging`; `eqn_flag` -> `need_eqn`.
+ (make_message): Rename this...
+ (make_string): ...to this. Align more closely with contemporary
+ version of example from Linux man-pages printf(3) page. Use
+ `vsnprintf()` to determine size of memory buffer needed prior to
+ allocation instead of iteratively growing it until it is large
+ enough. Always die if `vsnprintf()` fails: this function now
+ always returns a valid pointer if it returns at all.
+ (makeFileName, setupAntiAlias, imageList::createPage,
+ imageList::createImage): Update call sites to use
+ `make_string()`.
+ (char_buffer::can_see): Demote return type from `int` to `bool`.
+ (char_buffer::skip_spaces): Drop unused member function.
+ (char_buffer::read_file, makeTempFiles): Demote return type from
+ `int` to `void`. Stop returning after calling functions that
+ don't return.
+ (char_buffer::read_file): Call `sys_fatal()` if `fread()`
+ returns an error, similarly to other calls into the standard C
+ library that this file makes. Improve check for error from
+ `fread()` by not regarding a return value of zero when the
+ end-of-file indicator is set as an error condition.
+ (makeFileName, checkImageDir, char_buffer::run_output_filter,
+ scanArguments): Call `fatal()` instead of `error()` and then
+ `exit(1)`.
+ (makeFileName, scanArguments): Dismiss Shlemiel the Painter:
+ save return value of `strlen()` and call `strcpy()` multiple
+ times instead of mixing `strcpy()` and `strcat()`; the latter
+ approach rescans the string unnecessarily.
+ (char_buffer::run_output_filter): Stop passing unnecessary null
+ pointer argument to diagnostic message functions. Stop calling
+ `fflush()` after libgroff diagnostic function, which always
+ {ultimately} flushes the standard error stream itself.
+ (makeTempFiles, do_file, main): Boolify.
+ (makeTempFiles, do_file): Reorder null pointer equality
+ comparisons to avoid inadvertent lvalue assignment.
+ (scanArguments, main): Use `EXIT_SUCCESS` and `EXIT_FAILURE`
+ constants from C library instead of integer literals for exit
+ status.
+ (do_file): Demote return type from `int` to `bool`. Return
+ Boolean literals. Drop conditional with empty consequent.
+ (main): Declare local variables closer to the points of use.
+ Stop trying to be a register allocator: stop reusing loop index
+ variable `i` as integer storage for another (albeit related)
+ purpose; introduce `operand_index` instead. Clarify logic by
+ splitting combined initialization and comparison operations, and
+ by testing function return value directly instead of storing it
+ in a pointless temporary. Use `EXIT_SUCCESS` and `EXIT_FAILURE`
+ constants from C library instead of integer literals for exit
+ status.
+
+2022-06-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/groff.cpp (run_commands): Trivially refactor.
+ Rename variable for clarity; add comment.
+
+2022-06-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/html/pre-html.cpp
+ (char_buffer::run_output_filter): Return wait status of child
+ process.
+ (char_buffer::run_output_filter, main): Rename local variable
+ `status` to `wstatus` to recognize distinction between exit
+ status (a 7-bit quantity) and wait status (a wider type).
+ (main): Issue fatal diagnostic if child process exited with
+ nonzero status. Since the child's output to the standard error
+ stream is lost, advise re-running with different output driver
+ to see them. This unhappy shortcoming is filed as Savannah
+ #62673. Explicitly return zero otherwise.
+
+ Fixes <https://savannah.gnu.org/bugs/?60782>.
+
+2022-06-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/tests/ab_works.sh: Add regression test for
+ Savannah #60782.
+
+2022-06-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Trivially refactor.
+
+ * src/roff/troff/input.cpp (token::next): Rename statement label
+ to use documentary terminology.
+ * src/roff/troff/node.cpp (make_composite_node)
+ (make_glyph_node): Make functions static since nothing outside
+ this translation unit calls them.
+ * src/roff/troff/node.cpp (make_glyph_node): Refactor optional
+ argument and its usage. Put it down, flip it, and reverse it.
+ That is, demote its type from `int` to `bool`, invert its sense,
+ and rename it since it affects warning, not error, diagnostics.
+ (character_exists): Update only call site of `make_glyph_node()`
+ that uses non-default argument value.
+
+2022-06-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Adjust diagnostic message text to clarify and better
+ match terminology used in documentation.
+
+ * src/roff/troff/input.cpp (set_escape_char, do_overstrike)
+ (do_bracket, do_name_test, do_width, do_special):
+ * src/roff/troff/node.cpp (suppress_node::tprint): Migrate from
+ "escape" to "escape sequence".
+
+ * src/roff/troff/node.cpp (make_composite_node)
+ (make_glyph_node): Clarify what went wrong.
+
+ * src/roff/troff/input.cpp (token::get_char)
+ (check_missing_character): Migrate from "normal character" to
+ "ordinary character" (see groff_char(7)).
+
+2022-06-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Rename a function for clarity.
+
+ * src/roff/troff/input.cpp (add_to_node_list): Rename this...
+ (add_to_zero_width_node_list): ...to this.
+ (do_zero_width): Update call site.
+ * src/roff/troff/token.h: Update declaration.
+
+2022-06-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/groff.cpp (handle_unknown_desc_command):
+ Refactor to skip unnecessary string comparisons. We explicitly
+ return in the final case instead of falling off the end of this
+ void function for consistency if additional cases are added.
+
+2022-06-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/groff.cpp (handle_unknown_desc_command):
+ Partially revert commit 64dc40d23a, 19 June. I forgot to save
+ and restore the previous values of the globals
+ `current_filename` and `current_lineno`, and, noticing that this
+ function has 3 return paths, decided that it's cheaper just to
+ go back to `error_with_file_and_line()`.
+
+2022-06-21 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ [gropdf]: Add more search paths to the Foundry file.
+
+ * font/devpdf/Foundry.in: Use the directory specified with the
+ config flag --with-urw-fonts-dir to populate the default foundry
+ as well as the U foundry. Important to populate the download
+ file with font files to embed the fonts not part of the base
+ pdf fonts or if user wants all fonts embedded.
+
+2022-06-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-ext.tmac (UR, MT): Fix problem with hyphenation
+ occurring before the end of the line when the line length was
+ not the device default (common for man pages at the terminal)
+ and hyperlinks were enabled. The issue is that the new
+ environment we created inherits the default environment's line
+ length (its state at troff initialization, prior to macro
+ package loading and configuration). This latent issue was
+ exposed by post-groff 1.22.4 changes to enable the hyphenation
+ of link text and add the hyperlink feature. Fix it by copying
+ the line length at the time the macro is called, which is
+ necessarily after man(7) sets up the line length, to the new
+ environment.
+
+2022-06-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grops/psrm.cpp (resource_manager::output_prolog):
+ (resource_manager::supply_resource):
+ (resource_manager::read_download_file): Update diagnostic
+ message language and report underlying problem encountered by
+ system when failing to open files. This will probably be the
+ text for ENOENT in most cases, but should help avoid frustration
+ in those where it isn't.
+
+2022-06-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grops/psrm.cpp
+ (resource_manager::read_download_file): Align diagnostic message
+ wording with gropdf in the same circumstance.
+
+2022-06-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Throw warning in font category when a font selection
+ escape sequence is used after the output line continuation
+ escape sequence on an input line, because it is ignored.
+
+ * src/roff/troff/env.cpp (environment::set_font): Do it.
+
+ * doc/groff.texi (Warnings):
+ * src/roff/troff/troff.1.man (Warnings): Document it.
+
+2022-06-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/env.cpp (font_change): Boolify.
+
+2022-06-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/gropdf/gropdf.pl (LoadFont): Revise error message
+ when a font can't be found for embedding. User failure to add
+ an entry for locating the font file seems a more likely scenario
+ than outright corruption of the file.
+
+2022-06-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/env.cpp (font_change): Warn upon selection of a
+ nonexistent font name.
+
+ Fixes <https://savannah.gnu.org/bugs/?62656>.
+
+2022-06-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Revise `environment::set_font` to return Boolean value
+ indicating success of font selection operation.
+
+ * src/roff/troff/env.cpp (environment::set_font):
+ * src/roff/troff/env.h (environment::set_font): Do it.
+
+ This prepares the way for a fix for Savannah #62656.
+
+2022-06-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/groff.cpp: Use single exit path, freeing
+ memory allocated for strings.
+ (xexit): Add `exit()` wrapper; free allocated memory.
+ (main): Use it in all three exit paths.
+
+2022-06-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/groff.cpp: Refactor to be more meticulous with
+ memory. Add globals `saved_path`, `groff_bin_path`, and
+ `groff_font` to store pointers into the process environment
+ returned by `putenv()`; once used, they need to remain valid for
+ the lifetime of the program.
+ (xstrdup): Add `strdup()` wrapper: dies if `strdup()` fails.
+ (main): Split nested `strsave()` and `xputenv()` (until recently
+ `putenv()`) calls. Free duplicate strings prior to exit.
+
+2022-06-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/groff.cpp (main): Rename temporary variable to
+ avoid shadowing one in enclosing scope, which can lead to
+ cut-and-paste errors (ask me how I know).
+
+2022-06-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/groff.cpp: Slightly refactor to indirect
+ `putenv` calls through an error-checking wrapper.
+ (xputenv): Add new function to die if `putenv()` fails.
+ (main): Update call sites to use it.
+
+2022-06-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [groff]: Add information to diagnostic messages.
+
+ * src/roff/groff/groff.cpp (main): Report underlying system
+ error if `putenv()` fails.
+ (handle_unknown_desc_command): Set globals `current_filename`
+ and `current_lineno` from `filename` and `lineno` arguments
+ passed to us to we can use the simpler interface of `error()`
+ rather than `error_with_file_and_line()`.
+
+2022-06-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Update return type of `font::load_desc` function to
+ enable more informative diagnostics from callers.
+
+ * src/include/font.h (font::load_desc): Change return type from
+ `bool` to `const char` pointer.
+ * src/libs/libgroff/font.cpp (font::load_desc): Return null
+ pointer literal on failed `open()` or validation failures.
+ Return filespec on success.
+
+ * src/libs/libdriver/input.cpp (do_file):
+ * src/preproc/grn/main.cpp (getres):
+ * src/roff/groff/groff.cpp (main):
+ * src/roff/troff/input.cpp (main): Compare `font::load_desc()`
+ return value to null pointer literal instead of treating it as a
+ Boolean.
+
+ * src/roff/groff/groff.cpp (main): Report full filespec of
+ troublesome "DESC" file when complaining of missing "postpro"
+ directive.
+
+2022-06-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/groff.cpp: Add new Boolean global,
+ `need_postdriver`, and initialize it true.
+ (main): Make `need_postdriver` false if the `-X` or `-Z` options
+ are given. Test it later. This prevents groff from exiting
+ with a fatal error if an output driver is not available, but
+ also not required. Also reorder null pointer equality
+ comparison to avoid inadvertent lvalue assignment.
+
+ Fixes <https://savannah.gnu.org/bugs/?62640>.
+
+2022-06-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/groff.cpp (help): Revise usage message for
+ expressiveness and clarity.
+
+2022-06-21 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ [gropdf]: Correct display of pathnames used.
+
+ * font/devpdf/util/BuildFoundries.pl: Convert array to
+ string of pathnames.
+
+2022-06-21 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ [gropdf]: Fix to gropdf.
+
+ * src/devices/gropdf/gropdf.pl: If pdfbookmark was called
+ within 5p of top of page (e.g. straight after a .bp when
+ \n[nl] was zero) the click destination would be off by a
+ page.
+
+2022-06-19 Ingo Schwarze <schwarze@openbsd.org>
+
+ * font/devpdf/devpdf.am: Always build PDF font description
+ files.
+
+ Build font/devpdf/download and the various TR, TB, CR etc.
+ files in the same directory even when they are not required
+ by the build because USE_GROPDF is unset, usually because
+ ghostscript is either unavailable or deliberately disabled
+ by the person running the build. These files need to be
+ built and installed anyway, and can be used on the target
+ system when the required infrastructure is available at run
+ time.
+
+2022-06-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [docs]: Revise introduction of vertical spacing concept to avoid
+ render inference that the formatter will compute a vertical
+ spacing appropriate to the type size automagically--it will not.
+
+ Fixes <https://savannah.gnu.org/bugs/?62617>. Thanks to Dave
+ Kemper for the report.
+
+2022-06-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [docs]: Revise discussion of end-of-sentence detection.
+
+ * doc/groff.texi (Filling):
+ * man/roff.7.man (Concepts): Do it. "Spaces" is a now a term
+ with a much more restricted usage. Emphasize the input context,
+ now explicitly identified as plain text files with Unix line
+ endings.
+
+ Fixes (one hopes) <https://savannah.gnu.org/bugs/?62593>.
+ Thanks to Ingo Schwarze for the report and Dave Kemper for the
+ discussion.
+
+2022-06-10 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ [gropdf]: Changes to BuildFoundries.
+
+ * font/devpdf/util/BuildFoundries.pl: Collect search paths into
+ an array rather than a colon delimited string, this allows
+ the @PATH_SEPARATOR@ character (':' or ';') to be used to
+ delimit paths yielded by the command 'gs -h' but still use ':'
+ to delimit paths in the Foundry file. This means the same
+ Foundry file can be used on all systems.
+
+ * font/devpdf/Foundry.in: Add more likely paths to find the URW
+ fonts.
+
+2022-06-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Weaken dependency on TeX, instead using it (to generate
+ the DVI and PDF forms of our Texinfo manual) only if it is
+ available.
+
+ * m4/groff.m4 (GROFF_USE_TEX_CHECK): Check for presence of 'tex'
+ executable in path. Set shell variable `groff_use_tex` to "yes"
+ if present, and "no" otherwise. This check runs only if the
+ 'makeinfo' and 'texi2dvi' version checks have already passed.
+
+ * configure.ac: Run the new check. Set Automake conditional
+ `USE_TEX` only if shell variable `groff_use_tex` is "yes".
+ Report whether "groff.dvi" and "groff.pdf" are (re-)buildable.
+
+ * doc/doc.am: Parameterize names of groff.{dvi,pdf} targets as
+ Make macros `GROFF_DVI` and `GROFF_PDF`. Define them only if
+ `USE_TEX`. Do _not_ update `EXTRA_DIST` macro; leave the
+ literal file names there because we require that distribution
+ archives contain these files.
+ (.texi.dvi, .texi.pdf): Update suffix rules to check `USE_TEX`
+ and fail, complaining of missing 'tex' program, if these targets
+ are attempted without it being true. Only manually specifying
+ the file names as targets to 'make' or attempting to generate a
+ distribution archive without TeX present should cause these
+ errors.
+
+ * INSTALL.REPO: Update dependency information.
+
+ Fixes <https://savannah.gnu.org/bugs/?62592>. Thanks to Deri
+ James for the report.
+
+2022-06-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (.texi.dvi, .texi.pdf, $(DOC_GNU_EPS)): Quote names
+ of programs when aborting because they're missing.
+
+2022-06-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_PROG_MAKEINFO, GROFF_PROG_TEXI2DVI):
+ Largely revert commit d5013ededc, 21 May: run checks for
+ 'makeinfo' and 'texi2dvi' programs regardless of presence of
+ ".tarball-version" file. Their presence is a necessary (but not
+ sufficient) condition for refresh of formatted forms of our
+ Texinfo manual if the source is modified.
+
+ Begins addressing <https://savannah.gnu.org/bugs/?62592>.
+
+2022-06-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Rename some groff Autoconf macros to better match
+ Autoconf's own naming conventions.
+
+ * m4/groff.m4 (GROFF_MAKEINFO): Rename to...
+ (GROFF_PROG_MAKEINFO): ...this.
+ (GROFF_TEXI2DVI): Rename to...
+ (GROFF_PROG_TEXI2DVI): ...this.
+
+ * configure.ac:
+ * m4/groff.m4 (GROFF_TEXI2DVI): Update call sites.
+
+2022-06-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac (SH, SS, B, I, SM, SB): Set input trap with `it`
+ instead of `itc` for better Unix Version 7 man(7) compatibility.
+
+ Fixes <https://savannah.gnu.org/bugs/?51468>. Also see
+ discussion at
+ https://lists.gnu.org/archive/html/groff/2022-06/msg00020.html
+ et sequentia (amid a vigorous bikeshedding of `\&`'s name).
+
+2022-06-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Regression-test use of input traps.
+
+ * tmac/tests/an_use-input-traps-correctly.sh: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-06-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/gropdf/gropdf.pl (LoadDesc): Validate device
+ description file for essential directives and acceptable values
+ as grops(1) does.
+
+2022-06-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff, grohtml, grops, grotty]: Update wording of diagnostic
+ messages to refer to "motion quantum" rather than "resolution"
+ where appropriate.
+
+ * src/devices/grohtml/post-html.cpp
+ (html_printer::html_printer):
+ * src/devices/grops/ps.cpp (ps_printer::ps_printer):
+ * src/devices/grotty/tty.cpp (tty_printer::set_char)
+ (tty_printer::add_char, tty_printer::end_page):
+ * src/roff/troff/env.cpp (line_length, title_length): Do it.
+
+2022-06-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/gropdf/gropdf.pl: Do more "DESC" file validation.
+ (LoadDesc): Bomb out gracefully if any of "unitwidth", "res", or
+ "sizescale" missing from "DESC" file. This prevents Perl
+ warnings about use of uninitialized values, and undoubtedly
+ mangled output.
+
+2022-06-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/gropdf/gropdf.pl: Revise diagnostic message
+ handling.
+ (top level): Add new scalar `progname` to house executable name.
+ (Msg): Output messages in format recommended by GNU Coding
+ Standards manual. Identify who's talking (Savannah #52463).
+ Rename `lev` scalar to `fatal` since it is used only as a
+ Boolean for immediately exiting with failure status. Report
+ diagnostic severity as part of message.
+ (Warn, Die): Add new subroutines through which all diagnostics
+ are now emitted.
+ (top level): Migrate a use of Perl `die` builtin to our `Die`.
+ (top level, ToPoints, LoadDownload, LoadDesc, do_x, GetPoints,
+ LoadSWF, LoadPDF, LoadStream, BuildStream, ParsePDFHash,
+ LoadFont, GetType1, GetChunk, RemapChr, do_N): Migrate `Msg(0,
+ ...)` calls to `Warn` and `Msg(1, ...)` to `Die`. Begin
+ messages in lowercase (GNU Coding Standards). Recast a few
+ messages for clarity.
+
+ Continues the long process of fixing Savannah #52463.
+
+2022-06-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/gropdf/gropdf.pl (Load_Config): Drop unused
+ subroutine and its commented-out call site, which came in that
+ way in July 2011.
+
+2022-06-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/gropdf/gropdf.pl (LoadFont): Warn if a font to be
+ embedded in PDF output cannot be located in the "download" file.
+
+ Fixes <https://savannah.gnu.org/bugs/?62572>. Thanks to Deri
+ James.
+
+2022-06-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/a4.tmac: Drop file from distribution. It has been
+ superseded by papersize.tmac for nearly 20 years.
+ * tmac/tmac.am (TMACNORMALFILES): Delete reference.
+ * NEWS: Add item.
+
+ Fixes <https://savannah.gnu.org/bugs/?62569>.
+
+2022-06-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Parameterize X11-related man pages, so they don't get
+ spuriously generated (and not cleaned) when building with X11
+ support disabled.
+
+ * Makefile.am (.man): Fix logic nit: drop unnecessary removal of
+ target before clobbering it with sed.
+ * src/devices/xditview/xditview.am (GXDITVIEW_MAN1): Add new
+ macro, expanding to nothing if `WITHOUT_X11` and to the target
+ name otherwise.
+ (man1_MANS): Append `GXDITVIEW_MAN1` expansion, not a literal.
+ * src/devices/xditview/xditview.am (XTOTROFF_MAN1): Add new
+ macro, expanding to nothing if `WITHOUT_X11` and to the target
+ name otherwise.
+ (man1_MANS): Append `XTOTROFF_MAN1` expansion, not a literal.
+ * doc/doc.am (GROFF_MAN_PAGES1): Append foregoing expansions
+ instead of literals.
+
+2022-06-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * configure.ac: Add `AM_CONDITIONAL`: `HAVE_URW_FONTS`, so our
+ Automake files can more easily cope with their absence.
+ * font/devpdf/Foundry.in: Add easily matched phrases to
+ comments, to clearly delimit the URW foundry portion of the file
+ so it can be omitted if those fonts are absent.
+ * font/devpdf/devpdf.am (font/devpdf/Foundry): Generate file
+ differently depending on `HAVE_URW_FONTS`; keep the existing
+ procedure if true, and delete the URW section from the generated
+ file otherwise, avoiding diagnostic messages from afmtodit(1)
+ and our BuildFoundries script.
+
+ Fixes <https://savannah.gnu.org/bugs/?62570>.
+
+2022-06-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/devpdf.am (font/devpdf/util/BuildFoundries):
+ Generate script using the `PATH_SEPARATOR` Automake macro.
+ * font/devpdf/util/BuildFoundries.pl: Add `pathsep` scalar to
+ house the build-time path separator.
+ (LocateFile): Use it.
+ (LoadFoundry, CheckFoundry): Stop using spaces as part of the
+ path separation delimiter. It is not idiomatic.
+
+2022-06-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * configure.ac: Explicitly identify poppler tools in report.
+
+2022-06-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/util/BuildFoundries.pl: Trivially refactor. Drop
+ unused hash `foundry`. Drop scalar `warn` that was set and
+ updated but never tested.
+
+2022-06-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/util/BuildFoundries.pl: Alter script to write to
+ the standard output stream instead of (re)writing a file named
+ "download" in the current working directory. This recovers from
+ a problem I introduced in commit 6e62be835d, 2 May, as an
+ unforeseen side effect of improving build parallelism so that
+ the "download" file wouldn't be read until it was fully
+ populated. As a side benefit, this approach is more Unixy, and
+ less dependent on $PWD.
+ (top level): Stop calling `WriteDownload` with an argument.
+ (LoadFoundry): Close only the file handle of interest when done,
+ not all of them (including `STDOUT`, which we now need).
+ (CheckFoundry): Same--just for cleanliness, since at present
+ running the script in 'check' mode doesn't write to any streams.
+ (WriteDownload): Stop taking an argument and manipulating file
+ handles. Write download file to standard output.
+ (LoadDownload, WriteDownload): Drop `top` scalar, used as a
+ mutex to serialize read and write access to "download" file; it
+ is no longer needed since the "download" file is now only read.
+
+2022-06-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Rename shell variables and Autoconf/Automake macros of
+ Boolean sense to have names more like logical predicates and
+ avoid doofy "DONT" nomenclature.
+
+ * m4/groff.m4 (GROFF_MAKE_RM): Rename shell variable
+ `groff_is_rm_defined` to `groff_make_defines_rm` (purely for
+ clarity; it already had a good name).
+ (GROFF_MAKE_RM): Rename this...
+ (GROFF_MAKE_DEFINES_RM): to this, to make parallelism obvious,
+ and enabling...
+ * configure.ac: ...rename of `MAKE_DONT_HAVE_RM` to
+ `MAKE_DEFINES_RM` with sense of test reversed. Also interpolate
+ `GROFF_MAKE_DEFINES_RM` instead of `GROFF_MAKE_RM`. This in
+ turn enables...
+ * Makefile.am: ...revision of conditional from
+ `MAKE_DONT_HAVE_RM` to "!`MAKE_DEFINES_RM`".
+
+2022-06-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_URW_FONTS_PATH)
+ (GROFF_WITH_COMPATIBILITY_WRAPPERS, GROFF_APPDEFDIR_OPTION)
+ (GROFF_UCHARDET): Recast help strings to more closely parallel
+ structure and style of Autoconf's own help strings.
+ (GROFF_WITH_COMPATIBILITY_WRAPPERS): Recast to tighten wording.
+
+2022-06-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * configure.ac:
+ * m4/groff.m4 (GROFF_APPDEFDIR_OPTION, GROFF_APPDEFDIR_DEFAULT)
+ (GROFF_APPDEFDIR_CHECK): Rename m4 macros and shell variable
+ from "*appres*" to "*appdef*. Update interpolation sites.
+
+ * configure.ac:
+ * m4/groff.m4 (GROFF_APPDEFDIR_CHECK): Further rename this...
+ (GROFF_APPDEFDIR_NOTICE): ...to this, for consistency with other
+ post-report output macros.
+
+ * Makefile.am:
+ * PROBLEMS:
+ * doc/automake.mom:
+ * src/devices/xditview/xditview.am: Update interpolation sites
+ of `appresdir`.
+
+ * Makefile.am:
+ * src/devices/xditview/gxditview.1.man:
+ * src/roff/groff/groff.1.man: Update interpolation sites of
+ `APPRESDIR`.
+
+ * NEWS: Add item.
+
+2022-06-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_X11, GROFF_UCHARDET): Drop redundant
+ messages (which are easily overlooked amid the torrent of
+ "checking" output anyway). Discovery failures of X11 and the
+ uchardet library are already parts of the configuration report
+ at or near the end of output.
+
+2022-06-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_PNMTOPS_NOSETPAGE): Partially revert change
+ from 21 May and document why in a comment.
+
+2022-06-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/troffrc: Skip loading of "papersize.tmac" if not in troff
+ mode.
+
+ Fixes <https://savannah.gnu.org/bugs/?62238>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2022-05-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * configure.ac: Report use of "g" prefix for commands and macro
+ package compatibility wrappers.
+ * m4/groff.m4 (GROFF_G): Fix code style nits. Update
+ indentation to match recent practice.
+
+2022-05-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * configure.ac: Fix code style nits and tweak report. Stop
+ superfluously using braces for shell parameter expansions that
+ don't require them. The shell is not make(1). Say
+ "installation _directory_ prefix" since another kind of prefix
+ can be used by groff (the "g" in front of command and macro
+ package names shared with AT&T troff).
+
+2022-05-31 Dave Kemper <saint.snit@gmail.com>
+
+ * doc/groff.texi: Fix content and style nits.
+ - Remove redundancy ("fixed-width... character that can't be
+ adjusted").
+ - Fix incorrect word ("environment value" -> "environment
+ variable").
+ - Add or change the placement of a couple tie{}s to comport
+ with style-guide recommendation.
+ - Grammarify.
+ - Clarify and tighten wording.
+
+ Fixes <https://savannah.gnu.org/bugs/?62551>.
+
+2022-05-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/node.cpp (font_position): If mounting a font
+ fails and a third argument was given (to the `fp` request),
+ report its value in the diagnostic message. This could reveal a
+ prohibited attempt at directory traversal. See commit
+ a891161bc9, 7 November.
+
+2022-05-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libgroff/fontfile.cpp (font::open_file): Refactor.
+ Move more logic, including memory allocation, inside conditional
+ that accepts only file names without '/' characters, skipping
+ unnecessary work in the alternative. Annotate use of zero
+ literals as null pointers to ease any future migration to ISO
+ C++11. Add 'const' qualifier to variable that doesn't require
+ modification (and which is used in the LHS of an equality
+ comparison, so that clumsy operator misuse will provoke a
+ compiler warning).
+
+ Fixes <https://savannah.gnu.org/bugs/?62532>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2022-05-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * configure.ac: In configuration report, say that we're
+ reporting compiler options along with the compiler executable.
+ Fix leftover test(1) comparison with garbage, overlooked in
+ commit faa22d89d2, 20 May.
+
+2022-05-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (doc/meintro_fr.ps): Build with '-t' option.
+
+ Fixes <https://savannah.gnu.org/bugs/?62542>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2022-05-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/groff.1.man (Options) <-l>: Handle case where
+ no default print spooler is configured, and report formatter
+ behavior correctly if it isn't.
+
+ Fixes <https://savannah.gnu.org/bugs/?62535>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2022-05-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * Makefile.am (.man): Process '@PSPRINT@' substitutions with
+ "makevarescape.sed".
+
+2022-05-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_PROG_YACC, GROFF_MAKEINFO, GROFF_TEXI2DVI):
+ Fix logic error in detection of build scenario: the presence of
+ a ".git" directory is not an indicator that we're not building
+ from a distribution archive, because we might be building from a
+ snapshot archive (which also lacks it). Instead, perform checks
+ required only by builds from Git checkouts and snapshot archives
+ if the ".tarball-version" file is not present.
+
+2022-05-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * Makefile.am (EXTRA_DIST): Ship "HACKING" file.
+
+2022-05-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * bootstrap.conf: Add "pkg-config" to `buildreq`. Not having it
+ causes pretty horrible macro expansion problems and diagnostics
+ when 'autoreconf' is run; they're still pretty bad even if you
+ use `AC_REQUIRE` and `m4_pattern_forbid`. So just demand it.
+
+2022-05-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devps/S:
+ * font/devps/symbolmap: Drop excess mapping of `*U` special
+ character. groff maps it to the Adobe Glyph List name
+ 'Upsilon1'. (The AGL 'Upsilon' is a homoglyph of the Latin
+ capital 'Y'.)
+ * PROBLEMS: De-document build-time warning, now resolved.
+
+2022-05-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/afmtodit/afmtodit.tables: Regenerate using Unicode
+ 14.0. No substantive changes.
+
+2022-05-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/afmtodit/make-afmtodit-tables: Refactor. Drop
+ unused variable `prog`. Use value of `CPP` from environment (if
+ defined) and use parameter expansion to apply a default if null
+ or not set. Use for loop to eliminate duplicative if statement.
+ Test input files for readability, not just existence. Use more
+ portable test(1) and shell syntax. Swap usage error and fatal
+ error exit statuses; using "1" for failure and "2" for usage
+ errors is more common in shell scripts I've seen. Update usage
+ message to put non-literal parameter in full caps, and clarify
+ its name. Update comment blocks written to generated files to
+ further clarify data provenance.
+
+2022-05-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_PRINT): Refactor. Stop performing checks
+ for spooler options if none is available. Stop redundantly
+ reporting command name used for spooling PostScript files. If
+ an option is required for spooling DVI files, report it alone
+ instead of repeating the command name as well.
+
+2022-05-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Fix insensitivity of groff(1) man page to configured spooler.
+
+ * Makefile.am (.man): Replace `@PSPRINT@` in man page sources
+ with name of configured print spooler command.
+ * src/roff/groff/groff.1.man (Options) <-l>: Use configured
+ print spooler command instead of literal 'lpr'.
+
+2022-05-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_UCHARDET_CHECK): Fix grammar nit in failure
+ message when user demands uchardet support but the library
+ cannot be located.
+
+2022-05-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_CHECK_GROHTML_PROGRAMS): Fix logic error in
+ computation of verb to be used in notice message.
+
+2022-05-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_PROG_YACC, GROFF_URW_FONTS_CHECK)
+ (GROFF_WITH_COMPATIBILITY_WRAPPERS, GROFF_UCHARDET_NOTICE):
+ Improve shell code portability. Per the GNU Autoconf manual,
+ "The -a, -o, '(', and ')' operands are not present in all
+ implementations, and have been marked obsolete by Posix 2008.
+ ...portable uses of test should never have more than four
+ arguments, and scripts should use shell constructs like '&&' and
+ '||' instead."
+
+2022-05-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/groff.1.man (Installation directories): Don't
+ output a tagged paragraph for the X11 application defaults
+ directory if the build symbol '@APPRESDIR@' is not defined (that
+ is, we didn't build with X11 support).
+
+2022-05-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_GHOSTSCRIPT_VERSION_CHECK): Fix code style
+ nits. Use lowercase for shell variables we define. Don't quote
+ literal operands to test(1) that don't contain syntactically
+ shell-significant characters. Update indentation to match
+ recent practice.
+
+2022-05-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_URW_FONTS_NOTICE): Don't emit the notice if
+ Ghostscript isn't available, since it was a prerequisite for
+ the `GROFF_URW_FONTS_CHECK` macro in the first place.
+
+2022-05-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Add print spooler determination to configuration
+ report.
+
+ * m4/groff.m4 (GROFF_PRINT): Add shell variable
+ `groff_have_spooler` to house the name of the print spooler
+ {"lp" or "lpr"} or the word "no".
+ * configure.ac: Report determined spooler, or its absence.
+
+2022-05-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/preconv/tests/do-not-seek-the-unseekable.sh: Skip
+ seekability check of the standard input stream if there is no
+ controlling terminal.
+
+ Fixes <https://savannah.gnu.org/bugs/?62506>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2022-05-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_CHECK_GROHTML_PROGRAMS): Migrate from
+ `AC_FOREACH` to `m4_foreach` to avoid obsolescence warning from
+ GNU Autoconf 2.70 or later.
+
+ Fixes <https://savannah.gnu.org/bugs/?61059>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2022-05-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * man/groff.7.man: Rename "pilot" list macros for man(7) from
+ `BL`/`EL` to `LS`/`LE`, per suggestion from Alejandro Colomar.
+
+2022-05-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_MAKEINFO, GROFF_TEXI2DVI): Check for
+ makeinfo(1) and texi2dvi(1) programs only if building from Git,
+ not a distribution archive.
+
+2022-05-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (doc/meintro_fr.ps): Call groff with `-K utf8`
+ instead of `-k`, in case the "configure" script didn't find
+ uchardet (and preconv(1) thus can't auto-detect an encoding).
+
+ Fixes <https://savannah.gnu.org/bugs/?59463>.
+
+2022-05-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/preconv/tests/do-not-seek-the-unseekable.sh: Skip
+ a check if /dev/stdin is not a character special device.
+
+2022-05-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_PDFTOOLS): Rename this...
+ (GROFF_POPPLER): ...to this.
+ * configure.ac: Update call site.
+
+2022-05-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_UCHARDET_CHECK): Rename this...
+ (GROFF_UCHARDET_NOTICE): ...to this.
+ * configure.ac: Update call site.
+
+ * m4/groff.m4 (GROFF_UCHARDET_NOTICE): Tighten wording of
+ message reported to user.
+
+ Fixes <https://savannah.gnu.org/bugs/?59481>. Thanks to Dave
+ Kemper for the report.
+
+2022-05-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_PNMTOOLS_CAN_BE_QUIET)
+ (GROFF_PNMTOPS_NOSETPAGE): Skip check if prerequisite not met.
+
+2022-05-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_URW_FONTS_CHECK): Rename this...
+ (GROFF_URW_FONTS_NOTICE): ...to this.
+ (GROFF_URW_FONTS): ...and this...
+ (GROFF_URW_FONTS_CHECK): ...to this.
+ (GROFF_URW_FONTS_NOTICE): Give lengthy notice message a one-line
+ summary.
+ * configure.ac: Update call sites.
+
+2022-05-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_URW_FONTS): Refactor. If our prerequisites
+ are not met (availability of 'awk' and 'gs'), don't even run the
+ check logic or print a "checking" message.
+
+2022-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Handle missing programs required to construct files needed at
+ runtime by gropdf more gracefully. Rename and refactor
+ configuration-time logic to be more understandable.
+
+ * configure.ac:
+ * m4/groff.m4: Rename `GROFF_PDFDOC_PROGRAMS` macro to
+ `GROFF_CHECK_GROPDF_PROGRAMS`. Rename shell variable
+ `make_pdfdoc` to `use_gropdf`. Set it explicitly to "no" or
+ "yes" instead of null or not null.
+
+ * configure.ac:
+ * m4/groff.m4:
+ * doc/doc.am: Rename `BUILD_PDFDOC` to `USE_GROPDF`.
+
+ * configure.ac: Call `GROFF_GROPDF_PROGRAM_NOTICE`.
+
+ * doc/doc.am: Bracket definition of `PROCESSEDDOCFILES_PDF`
+ macro and `$(PROCESSEDDOCFILES_PDF)` dependency declaration in
+ Automake `if USE_GROPDF` conditional. This prevents attempts
+ to build PDF documents using groff that are doomed to fail.
+
+ * m4/groff.m4: Refactor gropdf runtime-dependency program check.
+ Split into two macros: one (`GROFF_CHECK_GROPDF_PROGRAMS`)
+ performs the check, the other (`GROFF_GROPDF_PROGRAM_NOTICE`)
+ issues a notice at the end of the configuration process if at
+ least one program was not found. Rename `docnote` shell
+ variable to `gropdf_notice`. Tighten wording of notice. Drop
+ unused `make_install_pdfdoc` and `make_uninstall_pdfdoc` shell
+ variables.
+
+2022-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Handle missing programs required at runtime by grohtml more
+ gracefully. Rename and refactor configuration-time logic to be
+ more understandable.
+
+ * configure.ac:
+ * m4/groff.m4: Rename `GROFF_HTML_PROGRAMS` macro to
+ `GROFF_CHECK_GROHTML_PROGRAMS`. Rename shell variable
+ `make_htmldoc` to `use_grohtml`. Set it explicitly to "no" or
+ "yes" instead of null or not null.
+
+ * configure.ac:
+ * m4/groff.m4:
+ * doc/doc.am: Rename `BUILD_HTML` to `USE_GROHTML`.
+
+ * configure.ac: Call `GROFF_GROHTML_PROGRAM_NOTICE`.
+
+ * doc/doc.am: Bracket definition of `PROCESSEDDOCFILES_HTML`
+ macro and `$(PROCESSEDDOCFILES_HTML)` dependency declaration
+ in Automake `if USE_GROHTML` conditional. This prevents an
+ attempt to build an HTML version of the "pic.ms" document that
+ is doomed to fail (noisily).
+
+ * m4/groff.m4: Refactor grohtml runtime-dependency program
+ check. Split into two macros: one
+ {`GROFF_CHECK_GROHTML_PROGRAMS`} performs the check, the other
+ {`GROFF_GROHTML_PROGRAM_NOTICE`} issues a notice at the end of
+ the configuration process if at least one program was not found.
+ Rename `html_docnote` shell variable to `grohtml_notice`.
+ Tighten wording of notice. Drop unused `make_install_htmldoc`
+ and `make_uninstall_htmldoc` shell variables.
+
+2022-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_GHOSTSCRIPT_VERSION_NOTICE): Add newline at
+ end of buggy Ghostscript notification, so that the multiple
+ possible lengthy notices after the configuration report have
+ blank lines separating them.
+
+2022-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Check for m4 program at configuration time.
+
+ * m4/groff.m4 (GROFF_PROG_M4): Define new macro to perform the
+ check and error out if the program is missing.
+ * configure.ac: Call the new macro.
+ * tmac/tmac.am (tmac/groff_man.7.man)
+ (tmac/groff_man_style.7.man): Use the new implicitly AC_SUBST-ed
+ variable `M4` to run the program.
+
+2022-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_PROG_YACC): Update wording of error
+ message: we search for "yacc", so report it as missing if it is
+ not found (along with "byacc" and "bison").
+
+2022-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * configure.ac: Fix shell style nits. Get rid of string
+ {non-}nullity tests and comparisons involving concatenation with
+ garbage (usually "x"). See 13 November entry regarding m4. Use
+ idiomatic shell "brace style" for control structures.
+
+2022-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Trivially refactor libgroff allocator configuration.
+
+ * m4/groff.m4 (GROFF_USE_GROFF_ALLOCATOR): Update description of
+ configuration flag to clarify that it's implemented in a
+ library. Rename shell variable to prefix it with "groff_",
+ putting it in an ad hoc name space as with other variables. If
+ feature disabled, set variable to literal "no".
+ * configure.ac: Use renamed variable and interpolate it directly
+ into configuration report, simplifying shell logic.
+
+2022-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * configure.ac: Revise configuration report for intelligibility.
+ Add report of C++ compiler and flags used: we compile much more
+ C++ than C code so this seems appropriate. Report Perl
+ interpreter version so that we can collect build reports and
+ turn the ratchet past Perl 5.6.1 at some point. Fix X11
+ "resources" misnomer (application defaults are what is meant).
+ Rephrase generally.
+
+2022-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * Makefile.am (EXTRA_DIST): Ship "ChangeLog.122" in distribution
+ archive. Overlooked in commit c11995df16, 19 February 2021.
+
+2022-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh:
+ Fix portability problem: POSIX says that "od -c" (and "od -t c")
+ are supposed to emit printing characters as defined by the
+ underlying locale, but GNU coreutils od doesn't do this and
+ macOS od does. Set `LC_ALL` to "C" when running it to force
+ 3-digit octal reporting of characters with their eighth bit set.
+
+ Fixes <https://savannah.gnu.org/bugs/?62357>. Thanks to John
+ Gardner for the report. Also see <https://pubs.opengroup.org/\
+ onlinepubs/9699919799/utilities/od.html>.
+
+2022-05-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * INSTALL.extra (In Case of Trouble): Add advice on using the
+ test suite, particularly if it fails.
+
+ Fixes <https://savannah.gnu.org/bugs/?62478> (one hopes).
+
+2022-05-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Input Line Traps): Expand discussion. The
+ `it` and `itc` requests count neither input lines (strictly) nor
+ text lines. Instead, they count input lines that _directly
+ produce formatted output_ (and, in the case of `itc`, are not
+ "interrupted" or continued with the `\c` escape sequence). This
+ is useful--empty requests and requests that don't put nodes on
+ the output don't break things--but does demand some explanation.
+ Clarify and provide example.
+ * man/groff.7.man (Escape sequence short reference) <it>: Sync.
+
+2022-05-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/env.cpp (environment::choose_breakpoint): Tweak
+ diagnostic message ("can't" -> "cannot").
+ * doc/groff.texi (Breaking): Update example.
+
+2022-05-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Copy Mode):
+ * man/groff.7.man (Copy mode): Fix omission; `\?` is interpreted
+ in copy mode.
+
+2022-05-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac (PT): Unclutter name space; remove
+ `pg*saved-page-number-format` string when we're done with it.
+
+2022-05-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Add unit tests, including one XFAIL for bad behavior.
+
+ * src/preproc/tbl/tests/check-horizontal-line-length.sh:
+ * src/preproc/tbl/tests/check-line-intersections.sh:
+ * src/preproc/tbl/tests/check-vertical-line-length.sh:
+ * src/preproc/tbl/tests/table-lacks-spurious-top-border.sh: Do
+ it.
+ * src/preproc/tbl/tbl.am (tbl_TESTS): Run tests.
+ (tbl_XFAIL_TESTS, XFAIL_TESTS): Expect one test failure.
+
+2022-05-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grotty/tty.cpp (tty_printer::add_char): Modify
+ diagnostic message: what gets written "above [the] first line"
+ might not be a character (glyph) per se, but a line (rule) from
+ a drawing command, and in fact the occurrence of these from
+ boxed tables is the most common cause of this message I've seen.
+
+2022-05-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grotty]: Do more input validation.
+
+ * src/devices/grotty/tty.cpp (tty_printer::draw): Throw warning
+ if an unsupported geometric primitive is encountered.
+ (tty_printer::line): Throw warning if a line is diagonal. Die
+ if length of a horizontal or vertical line is not a multiple of
+ the appropriate motion quantum of the device (troff should never
+ emit such nonsense, and currently doesn't appear to).
+
+2022-05-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/tbl.1.man (Miscellaneous): Document GNU tbl's
+ use of `#T` and `T.` registers.
+
+2022-05-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (read_color_draw_node): Tweak
+ diagnostic message to better distinguish drawing commands and
+ device control commands.
+
+2022-05-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grohtml]: Mitigate double-free problem exposed by malformed
+ input.
+
+ * src/roff/troff/mtsm.h (struct statem): Place member variable
+ `issue_no` behind `DEBUGGING` preprocessor symbol, omitting it
+ from production and ordinary development builds.
+ * src/roff/troff/mtsm.cpp (no_of_statems): Place global variable
+ behind `DEBUGGING` preprocessor symbol, omitting it from
+ production and ordinary development builds.
+ (statem::statem): Make constructor trivial if `DEBUGGING` not
+ defined in preprocessor; it manipulates only `issue_no` and
+ `no_of_statems`, which are synchronized.
+ (statem::statem {copy}): Gate assignment of `issue_no` member
+ variable from copy constructor behind `DEBUGGING` preprocessor
+ symbol.
+ (statem::flush, mtsm::inherit): Gate debugging output, already
+ runtime-gated on `debug_state` symbol, of `issue_no` member
+ variable, so that we don't reference it when it is not declared.
+
+ See <https://savannah.gnu.org/bugs/?62040>.
+
+2022-05-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [refer]: Rename a test artifact; it's a bibliographic database
+ file, not a refer(1) command file.
+
+ * src/preproc/refer/tests/artifacts/62124.ref: Rename this...
+ * src/preproc/refer/tests/artifacts/62124.bib: ...to this.
+ * src/preproc/refer/refer.am (EXTRA_DIST):
+ * src/preproc/refer/tests/report-correct-line-numbers.sh: Use
+ new name.
+
+2022-05-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/refer/command.cpp (process_commands): Begin
+ migration to use existing global variables for location reports
+ in diagnostic messages. Save current file name and line number
+ before calling `command_loop()` and restore them afterward.
+ Also decrement line counter before entering that loop because it
+ would be too far advanced by one due to the final newline on a
+ parsed input line.
+
+2022-05-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/refer/refer.cpp (main): Report system error on
+ `fflush()` failure. POSIX Issue 5 a.k.a. SUSv2 (1997) specifies
+ several possible `errno` values this C standard library function
+ can set; see
+ <https://pubs.opengroup.org/onlinepubs/007908799/xsh/fflush.html>.
+
+2022-05-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [refer]: Refactor: drop unused version of function (taking only
+ a `const char *` parameter).
+
+ * src/preproc/refer/command.cpp (process_commands): Drop
+ definition.
+ * src/preproc/refer/command.h (process_commands): Drop
+ declaration.
+
+2022-05-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/refer/refer.cpp (do_file): Fix another off-by-one
+ line number reporting bug exposed by fix for Savannah #62391.
+
+2022-05-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/refer/tests/report-correct-line-numbers.sh: Add
+ more regression tests.
+
+2022-05-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [refer]: Trivially refactor: boolify.
+
+ * src/preproc/refer/command.cpp (input_stack::push_file): Demote
+ and rename local variable from `int` to `bool`.
+ (bol): Renamed from this...
+ (is_at_beginning_of_line): ...to this.
+
+2022-05-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [refer]: Trivially refactor.
+
+ * src/preproc/refer/command.cpp (input_stack::push_file):
+ * src/preproc/refer/refer.cpp (do_file): Drop unnecessary
+ construction of integer from integer (return type of `getc()`)
+ in argument to error diagnostic functions; parallelizes with
+ other diagnostic function calls.
+
+2022-05-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/refer/command.cpp: Refactor to simplify.
+ (get_location): Demote return type from `int` to `void`. The
+ function only ever returned a `1` literal.
+ (input_stack::error): Update call site to stop uselessly testing
+ return value of `get_location()`.
+
+2022-05-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (dist-info-bits, install_infodoc, dist-gnueps): Fix
+ logic error. When checking both source and build trees for
+ files to copy, break after successfully copying the files, not
+ after the first iteration of the loop unconditionally. This
+ caused the Info documents not to be installed from out-of-tree
+ builds, and potentially would prevent them and doc/gnu.eps from
+ being included in the distribution archive if for some reason
+ they didn't build and that build failure were not treated as an
+ error. Problems introduced by me in commits e78bd20d54, 27
+ March, and d79c3f3a4a, 11 November.
+
+2022-05-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_APPRESDIR_OPTION): Update comments and
+ human-readable output to (1) stop claiming that existing
+ gxditview application defaults in the installation directory
+ will be backed up; this is no longer true as of commit
+ c66cb7725f, 3 April; and (2) refer to these files as
+ "application defaults", not "resources". (X11 application
+ defaults are client-side and mandatory [for Xt-based programs];
+ X resources are stored server-side and need not be configured to
+ determine an X client's geometry and rendering.)
+
+2022-05-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devX100-12/devX100-12.am (devX100_12_fontdir):
+ * font/devX100/devX100.am (devX100_fontdir):
+ * font/devX75-12/devX75-12.am (devX75_12_fontdir):
+ * font/devX75/devX75.am (devX75_fontdir): Define macros without
+ an extra "font/" layer in the directory hierarchy.
+
+ Fixes problem introduced by me in commit 3c82cbbfe5, 27
+ February.
+
+2022-05-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/devpdf.am (font/devpdf/util/BuildFoundries): Spell
+ dependency on `$(SH_DEPS_SED_SCRIPT)` using that macro expansion
+ instead of a literal file name. See doc/automake.mom.
+
+2022-05-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/eqn/eqn.am (MAINTAINERCLEANFILES):
+ * src/preproc/pic/pic.am (MAINTAINERCLEANFILES):
+ * src/preproc/refer/refer.am (MAINTAINERCLEANFILES): Preserve
+ byacc/bison output artifacts unless "maintainer-clean"ing. Per
+ the GNU Automake manual, "The intermediate files generated by
+ yacc (or lex) will be included in any distribution that is made.
+ That way the user doesn’t need to have yacc or lex."
+
+2022-05-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * Makefile.am: Stop manually handling "test-groff". Per the
+ GNU Automake manual, "If configure built it, then distclean
+ should delete it." This is taken care of automatically if we
+ don't interfere.
+ (BUILT_SOURCES, MOSTLYCLEANFILES): Drop "test-groff".
+
+2022-05-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/eqn/eqn.am (neqn): Produce temporary file first
+ and set its permissions before moving it into place. If
+ anything in the future ever has a dependency on it, this avoids
+ a race where the file exists, satisfying a dependency, but
+ execution is attempted before its `x` permission bit is set.
+
+2022-05-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Ensure that we install *.me source files, but don't
+ include them in the distribution archive.
+
+ * doc/doc.am (dist_otherdoc_DATA): Move `$(GENERATEDDOCFILES)`
+ from here...
+ (nodist_otherdoc_DATA): ...to here.
+ (.PRECIOUS): Add `$(GENERATEDDOCFILES)` so that make(1) doesn't
+ automatically remove "intermediate" objects in the .me.in -> .me
+ -> .ps chain.
+
+2022-05-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Handle "gnu.eps" file better.
+
+ * doc/doc.am (GENERATEDDOCFILES): Remove `$(DOC_GNU_EPS)`.
+ (EXTRA_DIST): Ship `$(DOC_GNU_EPS)` in distribution archive.
+ ($(DOC_GNU_EPS)): Simplify rule commands; stop trying to copy
+ the file around since it will either be (1) in the distribution
+ archive from which a build is performed; or (2) missing because
+ a build is being done from Git, in which case we expect the PNM
+ tools to be available.
+
+2022-05-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (clean_otherdoc): Drop target: it doesn't seem to
+ accomplish anything.
+ (clean_infodoc): Drop target, moving its rules into...
+ (maintainer-clean-local): ...this. Drop deps, both gone now.
+
+2022-05-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (distclean-local): Drop target: stop cleaning
+ generated forms of our Texinfo manual with the "distclean"
+ target. They ship with the distribution archive and should
+ remain in the tree even if the user needs to re-./configure.
+
+2022-05-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Fix problems exposed by high build parallelism.
+
+ * font/devpdf/devpdf.am (font/devpdf/util/BuildFoundries)
+ (font/devpdf/DESC, font/devpdf/Foundry): Drop
+ unnecessary removal of target prior to creating it.
+ (font/devpdf/Foundry): Add creation of destination build
+ directory as other targets do.
+ (font/devpdf/download): Create dedicated target instead of
+ lumping its generation under the stamp file. Add missing
+ dependencies on `$(DEVPDFFONTMAP_1)`, `$(DEVPDFFONTMAP_2)`,
+ `font/devpdf/Foundry` and `font/devpdf/enc/text.enc`. Remove
+ now-unnecessarily complicated "forgery" of "GEN" line in quiet
+ builds. Tweak format of comment written to "download" file to
+ make field identities clearer. Construct output (with multiple
+ shell commands) in temporary file so it is not read prematurely
+ by the "BuildFoundries" script. Move target into place as the
+ last step.
+ (font/devpdf/stamp): Relocate target to follow its dependencies.
+ Add dependency on "font/devpdf/download".
+
+2022-05-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Tweak diagnostic messages in BuildFoundries script.
+
+ * font/devpdf/util/BuildFoundries.pl (LoadFoundry)
+ (WriteDownload, CheckFoundry): Recast for specificity and
+ consistent style.
+ (Die): Stop reporting line number with fatal errors; none of the
+ call sites are parsing input.
+
+2022-05-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [refer]: Fix off-by-one error in line number for some
+ diagnostics.
+
+ * src/preproc/refer/command.cpp (input_item::get_location):
+ Decrement reported line number by one after looping over input
+ so that we report the line number as it was before the last
+ newline character seen. This off-by-one error was partially
+ masked by...
+ * src/preproc/refer/refer.cpp (do_file): ...initialization of
+ `current_lineno` to zero. However, for syntax problems (as
+ opposed to the semantic problems of refer(1) command
+ processing), this could result in complaints about the line
+ number before they occurred, even on "line zero". Initialize
+ the variable to 1.
+
+ Fixes <https://savannah.gnu.org/bugs/?62391>.
+
+2022-05-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/refer/tests/report-correct-line-numbers.sh: Add
+ regression test for Savannah #62391.
+
+2022-05-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/tfmtodit/tfmtodit.cpp (usage): Tweak usage message.
+ Condense `-v` and `--version` into a single output line with
+ brace and pipe notation, which we do not use in our man pages,
+ but consistently do in our usage messages. Use lowercase for
+ option arguments since they are separated from option flag
+ letters by space. Call `fprintf()` once instead of 3 times.
+
+2022-05-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/refer/refer.cpp (main): Tweak wording of
+ diagnostic messages to refer to options consistently and to
+ characterize input as "invalid" rather than "bad".
+ (usage): Document --version option. Use more informative
+ metasyntactic variable names. Organize usage message
+ consistently with our others, and stop wrapping the output
+ lines: we know neither the width of the terminal nor the length
+ of the `program_name` string we're interpolating. See commit
+ b4de44f0, 19 July 2021.
+
+2022-05-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (string_iterator::backtrace): Fix
+ spurious output when `mac.filename` is empty. Provoked by:
+ $ printf '\\(' | troff -b
+
+2022-05-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/refer/refer.cpp: Trivially refactor. Demote
+ global variable `recognize_R1_R2` from integer to Boolean.
+ (main, do_bib): Give expressions to `assert()` meaningful
+ content.
+ (is_list): Demote return type from `int` to `bool`.
+ (do_file): Demote and rename integer local variables
+ `start_of_line` to Boolean `at_start_of_line`.
+ (is_list, do_file): Reorder equality comparisons to avoid
+ inadvertent lvalue assignment.
+
+2022-05-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Reduce and rationalize in-tree document dependencies.
+ This eliminates spurious rebuilds of numerous documents
+ {including the 380+-page groff-man-pages collections}. It also
+ fixes missing dependencies when using the build's groff to
+ generate PostScript documents.
+
+ * .gitignore: Drop old name of devpdf stamp file.
+ * doc/.gitignore: Drop now-unused "example.stamp" file.
+ * doc/doc.am (PROCESSEDDOCFILES_HTML, PROCESSEDDOCFILES_PDF)
+ (PROCESSEDDOCFILES_TXT): Add new macros grouping targets by the
+ format/output driver used to produce them, to better organize
+ dependencies for their generation.
+ (PROCESSEDDOCFILES): Redefine as simply the expansions of the
+ foregeoing.
+ (PROCESSEDFILES_DEPS_HTML, PROCESSEDFILES_DEPS_HTML,
+ PROCESSEDFILES_DEPS_PDF, PROCESSEDFILES_DEPS_TXT): Add new
+ macros defining prerequisites for production of the
+ corresponding output document formats.
+ ($(PROCESSEDDOCFILES_HTML), $(PROCESSEDDOCFILES_PDF),
+ $(PROCESSEDDOCFILES_PS), $(PROCESSEDDOCFILES_TXT)): Declare the
+ dependencies using expansions of the foregoing macros.
+ (MOSTLYCLEANFILES): Drop "doc/automake.pdf", now part of
+ `PROCESSEDDOCFILES_PDF`.
+ (doc/automake.pdf): Drop dependencies already supplied by
+ `PROCESSEDFILES_DEPS_PDF`.
+ (HTMLDOCFILES): Drop macro. "doc/pic.html" is now in the
+ expansion of `PROCESSEDDOCFILES_HTML`.
+ (htmlpic_DATA): Redefine as expansion of
+ `PROCESSEDDOCFILES_HTML` instead of `HTMLDOCFILES`.
+ (PROCESSEDEXAMPLEFILES_HTML) [BUILD_HTML]: Define as
+ "doc/webpage.html", otherwise as empty.
+ (PROCESSEDEXAMPLEFILES_PS): Contain "doc/webpage.ps" and
+ "doc/grnexampl.ps".
+ (PROCESSEDEXAMPLEFILES): Redefine as expansions of
+ `PROCESSEDEXAMPLEFILES_HTML` and `PROCESSEDEXAMPLEFILES_PS`.
+ ($(PROCESSEDEXAMPLEFILES_HTML), $(PROCESSEDEXAMPLEFILES_PS)):
+ Declare dependencies using `PROCESSEDFILES_DEPS_HTML` and
+ `PROCESSEDFILES_DEPS_PS`, respectively.
+ (HTMLEXAMPLEFILES): Drop macro. "doc/webpage.html" is now in
+ the expansion of `PROCESSEDDOCFILES_HTML`.
+ (nodist_htmlexamples_DATA): Drop macro, no longer needed.
+ ($(PROCESSEDDOCFILES_PS)): Relocated and redefined above.
+ ($(PROCESSEDEXAMPLEFILES) $(PROCESSEDDOCFILES)): Drop overbroad
+ dependency declarations in favor of the above.
+ (MOSTLYCLEANFILES, doc/examples.stamp): Drop generation and
+ removal of unnecessary stamp file.
+ (doc/pic.html, doc/webpage.html): Add explicit dependency on
+ required preprocessors. Drop redundant and spurious
+ dependencies.
+ * font/devhtml/devhtml.am (MOSTLYCLEANFILES)
+ (font/devhtml/stamp): Generate and remove stamp file to enable
+ reliable target dependencies for build-time generation of HTML
+ documents by groff.
+ * font/devpdf/devpdf.am (MOSTLYCLEANFILES, font/devpdf/stamp):
+ Rename stamp file from "font/devpdf/build_font_files".
+ (font/devpdf/stamp): Drop unnecessary dependency on "afmtodit".
+ * font/devps/devps.am (MOSTLYCLEANFILES, font/devps/stamp):
+ Generate and remove stamp file to enable reliable target
+ dependencies for build-time generation of PostScript documents
+ by groff.
+ * font/devutf8/devutf8.am (MOSTLYCLEANFILES)
+ (font/devutf8/stamp): Generate and remove stamp file to enable
+ reliable target dependencies for build-time generation of
+ UTF-8-encoded text documents by groff.
+
+ Fixes <https://savannah.gnu.org/bugs/?62084>; thanks to
+ Sergei Trofimovich for the report. Also fixes
+ <https://savannah.gnu.org/bugs/?62297>; thanks to Bjarni Ingi
+ Gislason for the report.
+
+2022-04-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Fix code style nits in Automake files.
+
+ * doc/doc.am: Put spaces around (Auto)make variable assignments,
+ for consistency with the rest of this .am file, and our others.
+ * font/devpdf/devpdf.am (font/devpdf/build_font_files): Use
+ shell '>' operator instead of touch(1).
+ * font/devhtml/devhtml.am (font/devhtml/DESC):
+ * font/devps/devps.am (font/devps/DESC): Construct target in
+ temporary file, since doing so is a multi-step process, moving
+ it to the target name when it is complete and usable by
+ dependencies.
+
+2022-04-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/refer/refer.cpp (main): When complaining of
+ unrecognized option, report the entire option string (after
+ the leading dash), not just its first character.
+
+2022-04-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libgroff/error.cpp: Trivially refactor. Explicitly
+ compare pointer lvalues to null pointers instead of punningly
+ treating them as Booleans. Annotate use of zero literals as
+ null pointers to ease any future migration to ISO C++11.
+
+2022-04-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac (an*abbreviate-inner-footer): Clean up better
+ before early returns. Remove temporary registers.
+
+2022-04-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/fallbacks.tmac: Add fallbacks for U+02C6 MODIFIER LETTER
+ CIRCUMFLEX ACCENT and U+02DC SMALL TILDE to Basic Latin
+ characters.
+
+2022-04-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tests]: Fix portability problem. Don't pass echo(1) arguments
+ containing backslashes because implementations handle them
+ differently. Use printf(1) instead. Thanks to Bertrand
+ Garrigues for reporting the problem and confirming the fix on
+ his build host.
+
+ * tmac/tests/e_chapter-titles-work.sh:
+ * tmac/tests/e_ld-works.sh:
+ * tmac/tests/localization-works.sh: Do it.
+
+2022-04-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/gropdf/gropdf.pl (ppsz): Recognize "com10" (U.S.
+ commercial envelope) paper format.
+
+ Addresses the original issue reported in
+ <https://bugs.debian.org/1009248>. We have however broadened
+ its scope; see <https://savannah.gnu.org/bugs/?62344>.
+
+2022-04-27 Dave Kemper <saint.snit@gmail.com>
+
+ * src/devices/gropdf/gropdf.pl (ppsz): Recognize ISO B-series
+ paper formats using strings of the form "b0-b6", not "isob0-b6",
+ for consistency with libgroff and papersize.tmac.
+
+ Fixes <http://savannah.gnu.org/bugs/?62346>.
+
+2022-04-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Refactor to simplify. Ingo's removal of the
+ "--with-doc" "configure" option, among other changes, clears the
+ way to remove many phony targets and simplify dependencies
+ involving generation of the 5 formats of our Texinfo manual.
+ (build_infodoc, doc, doc_all, doc_txt, dvi, doc_dvi, pdf,
+ doc_pdf, html, doc_html): Drop phony targets.
+ (all): Depend directly on doc/groff.{info,txt,html,dvi,pdf}.
+ * NEWS: Add item since "make doc" is no longer necessary and
+ will do nothing.
+
+2022-04-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Handle `\R` sequences in text blocks robustly.
+
+ * src/preproc/tbl/table.cpp (table::add_entry): Fix SEGV when
+ repeating glyph table entry syntax (`\Rx`) used in a text block.
+ Lift extraction of entry string to be done unconditionally,
+ rather than in 5 different special cases. This frees us up to
+ rewrite the entry if necessary, changing '\R' to '\&' inside a
+ text block. Recast diagnostic to describe the problem
+ clearly--"bad repeated character" suggests that something is
+ wrong with the "argument" to `\R`, when really the problem is
+ the _context_.
+
+ Fixes <http://savannah.gnu.org/bugs/?62366>.
+
+2022-04-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Regression-test Savannah #62366.
+
+ * src/preproc/tbl/tests/\
+ do-not-segv-when-backslash-R-in-text-block.sh: Do it.
+ * src/preproc/tbl/tbl.am (tbl_TESTS): Run test.
+
+2022-04-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libgroff/string.cpp (string::extract): Check return
+ value of `malloc()` for nullity, and only poke into the buffer
+ returned if it is valid. Discovered while troubleshooting
+ Savannah #62366.
+
+2022-04-23 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ gnulib: replace non-recursive-gnulib-prefix-hack with
+ automake-subdir option
+
+ 'non-recursive-gnulib-prefix-hack' is deprecated by gnulib's
+ commit f8eed11b15e9141d061900e4068ea1f3ba9b63f6 and replaced by
+ '--automake-subdir'.
+
+ * bootstrap.conf:
+ (gnulib_modules): Remove option
+ 'non-recursive-gnulib-prefix-hack'.
+ (gnulib_tool_option_extras): Add option '--automake-subdir'.
+ (bootstrap_post_import_hook): Remove the invocation of
+ 'build-aux/prefix-gnulib-mk'.
+
+ * doc/automake.mom: update documentation accordingly.
+
+ Fixes <http://savannah.gnu.org/bugs/?61708> and
+ <https://savannah.gnu.org/bugs/?62205> , issues reported and fix
+ suggested by Bjarni Ingi Gislason <bjarniig@rhi.hi.is>. Fix
+ also suggested by Werner LEMBERG <wl@gnu.org> (see
+ <https://repo.or.cz/ttfautohint.git/commit/a938fc63cb55ef48393a924d7083b13c1352d294>).
+
+2022-04-23 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Update gnulib submodule
+
+ * gnulib now points on c8b8f3bbcde37a53cd226f4c9cebd0dde6aca37f
+
+ * bootstrap: merge the latest version from gnulib/build-aux
+ {groff's bootstrap has a patch for OS X}.
+
+ * bootstrap.conf: update copyright date.
+
+2022-04-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac (XH-UPDATE-TOC): Modify Keith Marshall's new XN/XH
+ feature to indent TOC entries by section heading depth. The
+ increment is 2 ens per depth level.
+
+2022-04-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac (XA): Drop apparently useless `ll` request. It
+ doesn't do anything according to my tests.
+
+2022-04-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/refer/label.ypp: Drop redundant declaration of
+ `yyparse`. Both byacc 20140715 and GNU Bison 3.3.2 supply the
+ the function prototype themselves. Addresses
+ "-Wredundant-decls" warning from GCC.
+
+ Fixes <https://savannah.gnu.org/bugs/?43569>.
+
+2022-04-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/grn/hdb.cpp (DBGetType): Lower fatal diagnostics
+ to errors when encounting invalid element type characters.
+ Return a value interpreted by our caller as an error indication
+ instead. Helps compilers determine that we're not implicitly
+ falling through our cases. Addresses "-Wimplicit-fallthrough"
+ warnings from GCC.
+
+ Fixes https://savannah.gnu.org/bugs/?54702>.
+
+2022-04-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/grn/hdb.cpp (DBRead): Add more validity checking.
+ Verify that the number of conversions returned by fscanf() is as
+ expected instead of throwing this information away--abort
+ processing ("giving up" like pic(1) does) if it does not.
+ Consistently report this abandonment in diagnostic messages.
+ Similarly validate pointer returned by fgets(). Soften handling
+ of invalid text condition from fatal error, introduced in
+ commit eb4f0675e, 16 August, to a normal one with abandonment of
+ Gremlin file. Addresses "-Wunused-result" warnings from GCC.
+
+2022-04-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/grn/main.cpp (conv): Throw an error diagnostic
+ when failing to open a Gremlin picture file.
+
+2022-04-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Fix extraneous space in output after `ME` or `UE` when
+ mandoc wrapper is used.
+
+ * tmac/an-ext.tmac (UE, ME): Double backslashes in macro
+ definitions when interpolating `.$` register (just like we tell
+ everyone else to do). This one was interesting to track down.
+ When using just `-man`, the problem never manifested; only with
+ `-mandoc`. The difference is that with the former, the `.$`
+ register is initialized to zero; with the latter, because `TH`
+ is aliased to another macro (then unaliased), `.$` has the
+ argument count to the `TH` macro, not to the macros actually
+ being called. This caused the wrong branch of a conditional to
+ be taken and put an extra space node on the output.
+
+ Fixes <https://savannah.gnu.org/bugs/?62044>.
+
+2022-04-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/cp1047.tmac:
+ * tmac/latin1.tmac:
+ * tmac/latin2.tmac:
+ * tmac/latin5.tmac:
+ * tmac/latin9.tmac: Stop remapping input soft hyphen characters
+ with `tr` requests in character encoding macro files. The
+ formatter does this for us now.
+
+2022-04-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Translate 8-bit NBSP and SHY on input.
+
+ * src/roff/troff/input.h: Define constant integers for "input"
+ no-break spaces and soft hyphens for EBCDIC and non-EBCDIC
+ (presumably ASCII/ISO 8859/Unicode) systems.
+
+ * src/roff/troff/input.cpp (token::next): Translate the input
+ character codes for NBSP to \~ and SHY to \%.
+
+ Fixes <https://savannah.gnu.org/bugs/?58962>. Thanks to Dave
+ Kemper for the report, code review, and his suggestion to push
+ more work to compile time.
+
+2022-04-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [groff]: Regression-test Savannah #58962.
+
+ * src/roff/groff/handle_special_input_code_points.diff: Do it.
+ * src/roff/groff/groff.am (groff_TESTS): Run test.
+
+2022-04-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (do_if_request): Clarify diagnostic;
+ at the point it is thrown, we know not merely that we're in a
+ conditional expression, but processing an output comparison
+ operator.
+
+2022-04-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi:
+ * doc/ms.ms:
+ * man/groff.7.man: Characterize "roff language" in the singular,
+ not the plural, emphasizing the similarity of extant specimens.
+
+ * doc/groff.texi (Conventions Used in This Manual): Add
+ paragraph discussing denotations of "groff" and "roff".
+
+ Fixes <https://savannah.gnu.org/bugs/?62233>. Thanks to John
+ Gardner and Dave Kemper for the discussion.
+
+2022-04-12 Ingo Schwarze <schwarze@openbsd.org>
+
+ Delete the harmful, ill-designed, buggy, and essentially
+ unmaintained and untested --with-doc option of the configure
+ script.
+
+ * configure.ac: Delete five AM_CONDITIONAL variables, one
+ autoconf(1) macro call, and some related diagnostic output.
+ * doc/doc.am: Delete two BUILD_EXAMPLES and one BUILD_OTHERDOC
+ conditional and use BUILD_HTML instead of BUILD_HTMLEXAMPLES.
+ * m4/groff.m4: Delete the GROFF_DOC_CHECK macro and simplify the
+ macros GROFF_HTML_PROGRAMS, GROFF_INSTALL_INFO, GROFF_MAKEINFO,
+ and GROFF_PDFDOC_PROGRAMS. This also deletes more than thirty
+ configuration variables.
+ * Makefile.am: Delete comments about 16 variables that are no
+ longer set.
+ * NEWS: Add details regarding the rationale.
+
+2022-04-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/preconv/preconv.cpp (unicode_entity): Convert
+ input U+00A0 to \~ as troff would, not to \[u00A0].
+
+ Fixes <https://savannah.gnu.org/bugs/?62300>.
+
+2022-04-11 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ [gropdf] fails to deal with 255th glyph in font.
+
+ * src/devices/gropdf/gropdf.pl: a pdf font can only contain 255
+ glyphs. The array which holds the glyph names also holds the
+ start position (zero) as first element, it is legal for it to
+ contain 256 elements, so truncate to 256 (not 255).
+
+ Fixes <https://savannah.gnu.org/bugs/?62294>.
+
+2022-04-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [localization]: Define hyphenation mode registers for Japanese
+ and Chinese. They are set to zero but must be defined so that
+ macro packages can rely on their existence without causing 'reg'
+ warnings.
+
+ * tmac/ja.tmac:
+ * tmac/zh.tmac: Do it.
+
+2022-04-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tests]: Add test for multi-lingual man(7) scenario.
+
+ * tmac/tests/localization-works.sh: Test two more cases. Ensure
+ that the 'trap bit' (hyphenation value 2, which has nothing to
+ do with any language) is preserved when switching locales back
+ from a CJK language, since those languages' modes
+ unconditionally clear it. We test Japanese and Chinese; we have
+ no localization macro file for Korean at this time.
+
+2022-04-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Slightly refactor `an*abbreviate-inner-footer`.
+
+ * tmac/an.tmac (an*abbreviate-inner-footer): Discard
+ unnecessary string.
+
+2022-04-09 Ingo Schwarze <schwarze@openbsd.org>
+
+ Fix the configuration of texi2dvi.
+
+ * m4/groff.m4: Set groff_have_texi2dvi if texi2dvi(1) is
+ available and usable, even if the availability was specified by
+ the user by manually providing the configure variable
+ PROG_TEXI2DVI, and not only if it was autodetected.
+ Also, set the PROG_TEXI2DVI Makefile variable to the name of
+ the texi2dvi program specified by the user or autodetected,
+ and not to the string "found", such that this Makefile variable
+ can be used for invoking the program.
+ * doc/doc.am: Call the texi2dvi program specified by the user
+ or autodetected rather than hardcoding "texi2dvi". This lets
+ the groff build succeed on systems where the first texi2dvi
+ in the $PATH is an old version unfit for groff's purposes.
+
+2022-04-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Abbreviate long `TH` arguments more carefully.
+
+ * tmac/an.tmac: Do it.
+ (an*scan-string-for-backslash): Add new helper macro.
+ (an*abbreviate-inner-footer): Rewrite. Use the foregoing and a
+ different technique to compute available space and shorten the
+ string.
+
+ Fixes <https://savannah.gnu.org/bugs/?62257>.
+
+2022-04-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Add regression test for Savannah #62257.
+
+ * tmac/tests/an_do-not-abbreviate-escape-using-TH-arguments.sh:
+ Do it.
+ * tmac/tmac.am (tmac_TESTS): Run it.
+
+2022-04-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac: Trivially refactor. Rename strings `an-ifoot`
+ to `an*ifoot` and `an-outer-footer-text` to `an*ofoot`.
+
+2022-04-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac: Refactor. Abbreviate page title and inner
+ footer only once per document instead of once per page.
+ Exception: the legacy macros `AT` and `UC` change the inner
+ footer, so re-abbreviate it if they are called.
+ (TH, AT, UC): Call abbreviation macros from here...
+ (an-header, an-footer): ...instead of here.
+
+2022-04-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac: Refactor: initialize header/footer environment
+ only once. Also rename it to `an*env-header-and-footer`.
+ (TH): Do it here...
+ (an-header, an-footer): ...instead of here.
+
+2022-04-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac: Trivially refactor.
+ (an*prepare-page-title): Rename this...
+ (an*abbreviate-page-title): ...to this.
+ (an-prepare-inner-footer): And this...
+ (an*abbreviate-inner-footer): ...to this.
+ (an-header, an-footer): Update call sites.
+
+2022-04-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/eqn/other.cpp (hmotion_box::output): Fix typo in
+ generated MathML diagnostic message.
+
+2022-04-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (EXTRA_DIST): Add "groff.dvi" and "groff.pdf" to
+ ensure that the GNU-released groff distribution archive contains
+ our Texinfo manual in these formats. (This doesn't increase the
+ build-dependency requirements unless you want to "make dist", in
+ which case it _should_.)
+
+2022-04-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Add nroff mode fallback for `UL` macro.
+
+ * tmac/s.tmac (UL): On nroff devices, bracket the first argument
+ with \(ul (underline rule) special character escape sequences.
+ {In plain language, '.UL "like this"' renders "_like this_".}
+ See corresponding 12 February change to "tmac/e.tmac".
+
+2022-04-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Drop unnecessary `-I` options to groff.
+ (DOC_GROFF): There is no need to look at the top of the build
+ directory for any file inclusions.
+ (doc/webpage.html): There is no need to look in `doc_builddir`
+ for file inclusions, since that is the current working directory
+ when "webpage.ms" is processed.
+
+2022-04-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Trivially refactor. Use `RM` macro idiomatically.
+ Automake ensures that it is defined to call an `rm` command with
+ the `-f` option, and this in turn ignores failures to delete
+ nonexistent files, so...
+ (uninstall_doc_examples, uninstall-pdf): Stop adding superfluous
+ `-f` flag.
+ (clean_infodoc uninstall-pdf, uninstall-html): Stop prefixing
+ command with `-` to ignore error exit status.
+ (uninstall-html): Drop superfluous `-r` flag; we're only
+ deleting files with this command, not directories.
+
+2022-04-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Trivially refactor shell style in rule commands.
+ The placement of `&&` was inconsistent. Always begin a
+ continued rule line with it, and don't give it its own
+ indentation level. In general, operators adjacent to line
+ continuations should _follow_ the continuations because they are
+ easier for humans to spot at the (possibly indented) beginning
+ of a physical line.
+
+2022-04-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * Makefile.am: Rename `TFLAG` macro, which means "tmac flag", to
+ `MFLAG`, because it expands to `-M` options to groff, not the
+ `-T` option, which can be bewildering.
+ * doc/doc.am (DOC_GROFF): Update expansion site.
+
+2022-03-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Rename `DOC_GROFF_ONLY` to `DOC_GROFF`.
+
+2022-03-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Refactor. Drop ghastly hack used to get file
+ names into troff diagnostics when reading from standard input.
+ We've refactored so that it no longer does, making the hack
+ unnecessary. For the same reason, no users of the `DOC_GROFF`
+ macro remain, so delete it. Add comments to explain what
+ `DOC_SED` and `DOC_GROFF_ONLY` are for.
+
+2022-03-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Refactor.
+ (doc/pic.html, doc/webpage.html): Drop indirection of source
+ document through `DOC_SED` macro. It was not necessary since
+ neither of these documents are parameterized in configuration
+ options (that is, they don't contain @VERSION@ or @g@).
+
+2022-04-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Trivially refactor.
+ (doc/webpage.html): Tidy up dependency list. Create directory
+ using the same macro interpolation we use to change into it.
+
+2022-04-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Refactor and fix error in builds in remote
+ out-of-source-tree builds exposed by pending commit and `make
+ distcheck`. The images generated for the pic.html and
+ webpage.html files were being built in the wrong directory, and
+ subsequently not found by an install rule.
+ (imagedir): Add comment explaining purpose of macro. It should
+ _not_ be used with any file specifications relative to the
+ source or build trees--it is for installation directories only.
+ (htmldocimagedir, exampleimagedir): Drop macros.
+
+ (doc/pic.html, doc/webpage.html): Replace interpolations of
+ `imagedir` with literal "img", since these files are being
+ generated within the build tree: the directory name is known.
+
+ (mostlyclean_doc, install_doc_htmldoc, install_doc_examples):
+ Replace interpolations of `htmldocimagedir` relative to
+ `doc_builddir` with "img" literals.
+
+ (install_doc_htmldoc, uninstall_doc_htmldoc): Interpolate
+ concatenation of `htmldocdir` and `imagedir` instead of
+ `htmldocimagedir` (relative to `DESTDIR`).
+ (install_doc_examples, uninstall_doc_examples): Interpolate
+ concatenation of `exampledir` and `imagedir` instead of
+ `exampleimagedir` (relative to `DESTDIR`).
+
+2022-04-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Refactor. Relocate "doc/grnexampl.ps" target to
+ group it with other me(7) documents. Put addition of
+ "doc/examples.stamp" to `MOSTLYCLEANFILES` adjacent to its
+ target rule. Relocate same rule so that it precedes the target
+ depending on it (make(1) might not benefit from this, but human
+ readers can).
+
+2022-03-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Refactor.
+ (DOC_GROFF_ONLY): Drop preprocessor options from groff command.
+ This macro is now, simply, a way to run the in-tree groff: no
+ assumptions about preprocessors, macro packages, or output
+ device are made.
+ (doc/pic.html, doc/webpage.html): Add only necessary
+ preprocessor options after expansion of `DOC_GROFF_ONLY`.
+
+2022-03-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Refactor. Add explicit dependencies of compiled
+ man page documents on preprocessors needed to generate them. In
+ their target rules, explicitly use groff's preprocessor options,
+ freeing us up to simplify the `DOC_GROFF_ONLY` macro.
+
+2022-03-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Rationalize dependencies. Drop dependency of
+ `PROCESSEDEXAMPLEFILES` and `PROCESSEDDOCFILES` on expansion of
+ `hdtbltmac_DATA`, because nothing in this directory uses the
+ hdtbl package. Move dep of same expansions on "gnu.eps" to
+ "doc/webpage.html", which actually uses it. Put the numerous
+ dependencies of "doc/pic.html" and "doc/webpage.html" in a
+ parallel ordering so that they are easier for humans to
+ evaluate. These targets' dependencies on `bin_PROGRAMS` and
+ `prefixexecbin_PROGRAMS` are overkill and should be reviewed at
+ a later date.
+
+2022-04-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Refactor use of target and suffix rules.
+ (doc/meintro.me, doc/meintro_fr.me, doc/meref.me): Add target
+ rules, with lengthy, exasperated comment about lack of feature
+ parity in various make(1) implementations.
+ (doc/meintro_fr.ps): Add target rule, as this seems to be the
+ only way to keep GNU Make from ignoring a '_fr.me._fr.ps' suffix
+ rule in favor of '.me.ps', which doesn't call preconv (and
+ doesn't need to--and moreover we don't want to build English
+ me(7) documents with the `-mfr` option). Depend on `preconv`.
+ (doc/webpage.ps): Convert from suffix rule to target rule.
+ (doc/ms.ps, doc/pic.ps, doc/webpage.ps): Add target rules and
+ dependencies.
+ (.ms.ps): Add commented-out suffix rule (since nothing uses it,
+ but might in the future).
+ (doc/meintro_fr.ps, .me.ps, doc/pic.ps, doc/webpage.ps): Migrate
+ expansions of `DOC_GROFF` to `DOC_GROFF_ONLY` to prepare for a
+ forthcoming simplification.
+
+2022-04-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Clean generated doc files better. doc/me*.me were
+ getting left behind in the build tree.
+ (MOSTLYCLEANFILES): Add `GENERATEDDOCFILES`. This includes
+ `DOC_GNU_EPS`, so...
+ (clean_maintdoc): Drop phony target that manually removes it.
+ (maintainer-clean-local): Drop dependency on foregoing.
+
+2022-04-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/xditview/xditview.am (install_xditview)
+ [!WITHOUT_X11]: Stop backing up existing "GXditview" and
+ "GXditview-color" application defaults files. There is no
+ symmetric restoration of them in the uninstall target, and it
+ seems like unjustifiable complexity to add such. These are
+ groff-specific file names, installed (by default) to /usr,
+ not /etc, so they are not going to be "configuration files" in
+ Debian-based systems, for example (and likely not elsewhere).
+ There are other ways to supersede application defaults for
+ programs using the X Toolkit Intrinsics.
+
+2022-04-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Stop treating "gnu.eps" as an "example" file; it
+ is also used by pdfmark's cover.ms, which is ordinary
+ documentation. We therefore must not omit it when building.
+ (install-data-hook): Add dependency on new phony target,
+ "install_doc_gnu_eps".
+ (install_doc_examples): Move installation of "gnu.eps" from
+ here...
+ (install_doc_gnu_eps): ...to here. Also refactor the loop we
+ use to locate the file to follow a more idiomatic pattern.
+
+2022-04-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (dist-info-bits, install_infodoc, dist-gnueps): Fix
+ code style nit: use consistent "brace style" in conditionals and
+ loops.
+
+2022-04-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (mostlyclean_doc): When cleaning, try harder to
+ remove the image directory created by the "pic.html" and
+ "webpage.html" targets.
+
+2022-04-02 Ingo Schwarze <schwarze@openbsd.org>
+
+ * doc/doc.am: Stop installing doc/meintro.me.in,
+ doc/meintro_fr.me.in, and doc/meref.me.in.
+
+2022-03-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/webpage.ms: Die horribly if `PSPIC` call fails.
+
+2022-03-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/pspic.tmac (pspic*error-hook): Define (as empty).
+ * man/groff_tmac.5.man (Auxiliary packages) <pspic>: Document.
+ * NEWS: Add item.
+
+2022-03-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (doc/webpage.ps): Relocate target rule.
+
+2022-03-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh:
+ * tmac/tests/pdfpic_falls-back-to-PSPIC.sh: Remove output file
+ even when skipping test. Quote `fail` variable when checking it
+ with `test -z`.
+
+2022-03-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * man/groff_tmac.7.man (Auxiliary packages): Tweak sboxes
+ documentation to imply ms dependency.
+
+ Fixes <https://savannah.gnu.org/bugs/?62062>.
+
+2022-03-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac (an*bookmark): Trivially refactor. Now that
+ we're no longer doing arithmetic on our first argument, simplify
+ our definition. Made possible by commit 3baf0e2f3, 23 February.
+
+2022-03-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/preconv/preconv.cpp (detect_file_encoding): Demote
+ an error diagnostic to a debugging message. libuchardet has no
+ man page, and inspecting the source of the
+ `uchardet_handle_data` function we find that it effectively
+ returns a Boolean value (if the result of a
+ `reinterpret_cast`(!) is not `NS_OK`). This is useless
+ information for a user-facing tool. We're designed to muddle on
+ regardless (see preconv(1)).
+
+2022-03-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grodvi/dvi.cpp (dvi_printer::set_color)
+ (draw_dvi_printer::fill_next):
+ * src/devices/grops/ps.cpp (output::put_color):
+ * src/libs/libgroff/color.cpp (color::print_color): Construct
+ doubles instead of casting to them.
+
+2022-03-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [doc]: Refactor handling of "gnu.eps" file.
+
+ * doc/doc.am: Put "gnu.eps" in a Make macro, `DOC_GNU_EPS`.
+ ($(PROCESSEDEXAMPLEFILES) $(PROCESSEDDOCFILES),
+ doc/webpage.html, install_doc_examples): Migrate dependency to
+ `DOC_GNU_EPS`.
+ (doc/webpage.ps): Add (missing) dependency on `DOC_GNU_EPS`.
+ (DOC_GROFF_ONLY): Drop `-I` flag; it's not necessary given the
+ following.
+ (.ms.ps): Drop `-mwww` argument from suffix rule. A truly
+ generic ms document won't need it.
+ (doc/webpage.ps): Add target rule. Include `-mwww` argument.
+ (doc/webpage.ps, doc/webpage.html): Pass `-I` option to
+ `DOC_GROFF` and `DOC_GROFF_ONLY` (respectively) to enable
+ location of "gnu.eps" file. Search the build and source trees'
+ "doc" directories because the file can be generated as part of
+ the build or can come with the distribution archive.
+ (EXTRA_DIST): Drop redundant inclusion of "doc/gnu.xpm".
+ (clean_maintdoc): Add phony target to dispose of `DOC_GNU_EPS`.
+ (maintainer-clean-local): Depend on "clean_maintdoc".
+
+ * tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh:
+ * tmac/tests/pdfpic_falls-back-to-PSPIC.sh: Update tests to look
+ for "gnu.eps" in "doc" directory of build tree. Give generated
+ files distinguishable names so their tests can run concurrently.
+
+2022-03-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Add new macro `PROCESSEDDOCFILES_PS` to isolate
+ names of targets in PostScript format. Expand this macro in
+ definition of `PROCESSEDDOCFILES` and use it to move PostScript
+ font description file dependencies of the latter and
+ `PROCESSEDEXAMPLEFILES` to the former. (At present, the
+ dependency might seem superfluous, since those files are in the
+ source distribution, but it's conceivable that in the near
+ future, they will be produced at build time from Adobe font
+ metric files; see font/devps/generate/Makefile). The "pic.html"
+ and "webpage.html" targets already had such a dependency because
+ of the way grohtml (pre-grohtml) works.
+
+2022-03-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * INSTALL.extra: Add a section on uninstalling.
+
+2022-03-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Create target rule for "doc/grnexampl.ps" instead
+ of relying on a suffix rule. Explicitly depend on grn and eqn
+ executables. Produce output using their groff flags, "-ge".
+
+2022-03-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/pdfpic.tmac (PDFPIC): Fix breakage when no temporary
+ directory environment variables are defined: actually use string
+ interpolation syntax in comparand to output comparison
+ operator. Problem introduced by me in commits adc1999af and
+ 24900cf6d, 15 February.
+
+2022-03-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devX100-12/devX100-12.am:
+ * font/devX100/devX100.am:
+ * font/devX75-12/devX75-12.am:
+ * font/devX75/devX75.am: Fix in-tree build; expand `fontdir`
+ instead of `abs_top_builddir` Make macro when defining Automake
+ variable for generated artifacts. Problem introduced by me in
+ commit 3c82cbbfe, 27 February. Thanks to Robert Goulding for
+ the report.
+
+2022-03-22 Ingo Schwarze <schwarze@openbsd.org>
+
+ * doc/doc.am: delete redundant "SUFFIXES +=" line
+
+2022-03-22 Ingo Schwarze <schwarze@openbsd.org>
+
+ * doc/doc.am: fix non-portable syntax in the meintro_fr.ps
+ target: This rule requires DOC_GROFF and hence $<, so turn it
+ into a suffix rule.
+
+2022-03-22 Ingo Schwarze <schwarze@openbsd.org>
+
+ * doc/doc.am: fix non-portable syntax in the doc/me*.me targets:
+ POSIX does not define the meaning of $< in non-suffix rules, so
+ use the portable $? instead. This is adequate here because each
+ of these three rules has exactly one prerequisite.
+
+2022-03-22 Ingo Schwarze <schwarze@openbsd.org>
+
+ * doc/doc.am: fix non-portable syntax in the groff-man-pages.*
+ targets by using DOC_GROFF_ONLY rather than DOC_GROFF in order
+ to not use $< outside a suffix rule; DOC_GROFF functionality is
+ not needed here in the first place.
+
+2022-03-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac:
+ * tmac/doc.tmac: Stop remapping input hyphens on `utf8` device.
+
+2022-03-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/doc.tmac: Stop remapping ` and ' on `utf8` output device.
+ Aligns mdoc(7) with commit 697e6db7f, 19 October 2020 (for
+ man(7)).
+
+2022-03-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/afmtodit/afmtodit.pl: Fix bug introduced in commit
+ 0d451902c, 10 March. Don't store a newline in the version
+ string. Put `\n` in its interpolation context as necessary.
+
+2022-03-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Install ptx.tmac.
+
+ * tmac/tmac.am (TMACNORMALFILES): Add it.
+ * NEWS: Report availability.
+
+ Fixes <https://savannah.gnu.org/bugs/?62201>. Thanks to Ralph
+ Corderoy for the report.
+
+2022-03-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Drop ditroff(7) document. It says nothing that is not covered
+ elsewhere.
+
+ * man/ditroff.7.man: Delete.
+ * doc/doc.am (GROFF_MAN_PAGES):
+ * man/man.am (man7_MANS, EXTRA_DIST): Stop processing, shipping.
+ * src/roff/groff/groff.1.man: Drop cross reference to it.
+ * NEWS: Add item.
+
+ Fixes <https://savannah.gnu.org/bugs/?61817>.
+
+2022-03-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [preconv]: Trivially refactor.
+
+ * src/preproc/preconv/preconv.cpp: Use diagnostic message
+ functions from libgroff where possible. Explain in a comment
+ why we don't use `debug()`. Boolify and rename some variables,
+ and use Boolean literals to assign to them.
+ debug_flag -> is_debugging
+ invalid_warning -> emit_invalid_utf8_warning
+ incomplete_warning -> emit_incomplete_utf8_warning
+ Rename `expected_bytes` to `expected_byte_count`. Except for
+ the debugging flag, these are all members of `struct
+ conversion`.
+ (get_tag_lines): Migrate to `warning()`.
+ (detect_file_encoding): Migrate to `error()` and `fatal()`, as
+ appropriate.
+ (utf8::invalid, utf8::incomplete, get_tag_lines): Don't break a
+ line in the middle of a diagnostic; doing so frustrates grepping
+ and necessarily makes an assumption about the terminal width.
+
+2022-03-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Trivially refactor.
+
+ * src/roff/troff/input.cpp: Rename global variable
+ `have_string_arg` to `have_multiple_params` and demote it from
+ an integer to a Boolean. Assign Boolean literals to it.
+ (read_long_escape_parameters, get_copy, token::next): Do it.
+
+2022-03-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Fix Savannah #62191.
+
+ * src/preproc/tbl/main.cpp (table_input::get): Increment input
+ line counter when encountering an escaped newline; this fixes
+ inaccurate diagnostics from the formatter at any point in a
+ document after a line-continued row of table data. Also drop a
+ "perhaps" comment. I tested the surmise (setting the FSM state
+ to "START"), and it results in bad formatting.
+
+ Fixes <https://savannah.gnu.org/bugs/?62191>. Problem appears
+ to date back to groff 1.02 (June 1991) at the latest.
+
+2022-03-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Regression-test Savannah #62191.
+
+ * src/preproc/tbl/tests/count-continued-input-lines.sh: Do it.
+ * src/preproc/tbl/tbl.am (tbl_TESTS): Run test.
+
+2022-03-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Environments): Clarify environment handling.
+ * man/groff.7.man (Environments): Add new section.
+
+ Fixes <https://savannah.gnu.org/bugs/?62036>. Thanks to Dave
+ Kemper for the report and a suggested patch.
+
+2022-03-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac (initialization): Define `@b` as empty if
+ formatting for HTML, because no page breaks occur in that
+ format.
+
+ Fixes <https://savannah.gnu.org/bugs/?62039>.
+
+2022-03-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grodvi/dvi.cpp (usage): Align usage message with
+ man page; disclose `-l` option.
+
+2022-03-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grodvi/dvi.cpp (main):
+ * src/devices/grops/ps.cpp (main): Update diagnostic:
+ characterize bad `-w` argument as "invalid", not "bad", and
+ explicitly report it as ignored.
+
+ * src/devices/grodvi/dvi.cpp (main): Report invalid parameter
+ in `-w` diagnostic.
+
+2022-03-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grodvi/dvi.cpp (dvi_printer::set_color)
+ (draw_dvi_printer::fill_next):
+ * src/devices/grops/ps.cpp (output::put_color):
+ * src/libs/libgroff/color.cpp (color::print_color): Explicitly
+ cast `enum` divisors to `double`; quietens
+ `-Wdeprecated-enum-float-conversion` warnings.
+
+ Fixes <https://savannah.gnu.org/bugs/?61964>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2022-03-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac: Recover more quickly from missing `EE` calls.
+ (initialization): Define new strings, `an*body-family` and
+ `an*example-family` to house the font families used in these
+ rendering contexts.
+ (TH, SH, SS): Restore the font family to `an*body-family`.
+ (TH): Set font style to roman as well.
+ (EX): Change to `an*example-family` instead of literal "C".
+
+ Fixes <https://savannah.gnu.org/bugs/?62187>.
+
+2022-03-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac: Test register for existence before using it to
+ set hyphenation mode. A site troffrc or other local
+ customization might remove the register (which is guaranteed to
+ be set under the stock configuration) and, perversely, Heirloom
+ Doctools troff interprets a `do` request, instead of ignoring it
+ as a historical troff implementation would, so if they borrow
+ our me(7) changes, the register would be unset, interpolate
+ zero, and hyphenation would wind up disabled.
+
+ Fixes <https://savannah.gnu.org/bugs/?62181>. Thanks to Dave
+ Kemper for the report.
+
+2022-03-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tests]: Rename test to apply naming scheme.
+
+ * tmac/tests/pdfpic_falls_back_to_PSPIC.sh: Rename this...
+ * tmac/tests/pdfpic_falls-back-to-PSPIC.sh: ...to this.
+ * tmac/tmac.am (tmac_TESTS): Use new name.
+
+2022-03-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grops/ps.cpp (usage): Align usage message with man
+ page synopsis.
+
+2022-03-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Input Line Traps): Fix error; input traps do
+ _not_ ignore control lines. Error appears to have crept in with
+ the first version of our Texinfo manual, shipped with groff 1.14
+ {December 1999}.
+
+2022-03-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devps/devps.am: Rename targets.
+ (fonts):
+ (devps_fonts): Rename these...
+ (maintainer-font-descriptions):
+ (devps_font-descriptions): ...to these. Add comments explaining
+ what they're for and why they aren't used in a build.
+
+ * font/devps/generate/Makefile: Add `outdir` variable to store
+ destination directory of font description files, and update all
+ targets that write artifacts to use this directory. This makes
+ the targets "phony", which I don't regard as a problem since the
+ generated artifacts are kept under source control, and this
+ isn't really a user-facing script (even though it gets
+ installed). I think there is a good chance that this will
+ become a shell script, because to avoid regressions we need to
+ generate the font descriptions using both the 229-glyph and
+ 314-glyph versions of the Adobe fonts' AFM files (so that we get
+ wider glyph coverage _and_ more kerning pair data) and we need
+ to add kerning information for the ellipsis (Savannah #58897).
+ (symbolsl.afm): Revise generation process to be sensitive to
+ failure.
+
+2022-03-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devps/symbolsl.afm: New file.
+ * font/devps/devps.am (EXTRA_DIST): We have long shipped
+ "symbol.afm" with the distribution archive--I don't see why we
+ don't ship "symbolsl.afm" and "zapfdr.afm" as well (metrics for
+ `SS`, the slanted symbol font, and ZDR, reversed Zapf Dingbats).
+ Like the Type 1 font descriptions themselves, this file is
+ updated only in "maintainer mode", not as part of the build.
+ Moreover, these fonts are not part of the PostScript level 2
+ base 35 fonts so their AFM files are unlikely to be readily
+ available elsewhere.
+
+2022-03-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/afmtodit/afmtodit.pl: Trivially refactor. Store the
+ program's version string in scalar `afmtodit_version` and use
+ that in the usage message and comment embedded in the output.
+
+2022-03-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/afmtodit/afmtodit.pl: Fix code style nits. Migrate
+ to the shebang line style we use in more recently modified Perl
+ scripts. Replace `-w` with `use warnings;`. Shorten an output
+ comment since the groff version string can grow long (see commit
+ 1264531310, 14 January 2018).
+
+2022-03-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/afmtodit/afmtodit.pl: Stop writing full file name to
+ the generated font description file as the "name" (i.e., don't
+ include directory components).
+
+ Fixes <https://savannah.gnu.org/bugs/?62150>. Thanks to Dave
+ Kemper for the discussion and code review.
+
+2022-03-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/afmtodit/afmtodit.1.man:
+ * src/utils/afmtodit/afmtodit.pl: Update and align man page
+ synopsis, option descriptions, and command usage output.
+
+2022-03-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/X.tmac: Redirect `fchar` requests for \[lq] and \[rq] to
+ \[dq] since the X11 Type 1-based text fonts encode ISO 8859-1
+ {Latin-1} and don't have typopgrapher's quotes. Drop `fchar`
+ request for \[aq], which _is_ represented, per recent changes.
+
+2022-03-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * /font/devX100-12/CB:
+ * /font/devX100-12/CBI:
+ * /font/devX100-12/CI:
+ * /font/devX100-12/CR:
+ * /font/devX100-12/HB:
+ * /font/devX100-12/HBI:
+ * /font/devX100-12/HI:
+ * /font/devX100-12/HR:
+ * /font/devX100-12/NB:
+ * /font/devX100-12/NBI:
+ * /font/devX100-12/NI:
+ * /font/devX100-12/NR:
+ * /font/devX100-12/TB:
+ * /font/devX100-12/TBI:
+ * /font/devX100-12/TI:
+ * /font/devX100-12/TR:
+ * /font/devX100/CB:
+ * /font/devX100/CBI:
+ * /font/devX100/CI:
+ * /font/devX100/CR:
+ * /font/devX100/HB:
+ * /font/devX100/HBI:
+ * /font/devX100/HI:
+ * /font/devX100/HR:
+ * /font/devX100/NB:
+ * /font/devX100/NBI:
+ * /font/devX100/NI:
+ * /font/devX100/NR:
+ * /font/devX100/TB:
+ * /font/devX100/TBI:
+ * /font/devX100/TI:
+ * /font/devX100/TR:
+ * /font/devX75-12/CB:
+ * /font/devX75-12/CBI:
+ * /font/devX75-12/CI:
+ * /font/devX75-12/CR:
+ * /font/devX75-12/HB:
+ * /font/devX75-12/HBI:
+ * /font/devX75-12/HI:
+ * /font/devX75-12/HR:
+ * /font/devX75-12/NB:
+ * /font/devX75-12/NBI:
+ * /font/devX75-12/NI:
+ * /font/devX75-12/NR:
+ * /font/devX75-12/TB:
+ * /font/devX75-12/TBI:
+ * /font/devX75-12/TI:
+ * /font/devX75-12/TR:
+ * /font/devX75/CB:
+ * /font/devX75/CBI:
+ * /font/devX75/CI:
+ * /font/devX75/CR:
+ * /font/devX75/HB:
+ * /font/devX75/HBI:
+ * /font/devX75/HI:
+ * /font/devX75/HR:
+ * /font/devX75/NB:
+ * /font/devX75/NBI:
+ * /font/devX75/NI:
+ * /font/devX75/NR:
+ * /font/devX75/TB:
+ * /font/devX75/TBI:
+ * /font/devX75/TI:
+ * /font/devX75/TR: Regenerate font descriptions with xtotroff,
+ using updated ISO-8859_1 map. \[aq] and \[oq] are now aliases
+ of "'" and \[ga] is an alias of "`". This change probably
+ should have been made when the X11 fonts were corrected in
+ XFree86 4.0 (March 2000). See
+ <https://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html>.
+
+ Fixes <https://bugs.debian.org/243238>.
+
+2022-03-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libxutil/DviChar.c (ISO_8859_1_map): Fix incorrect
+ assignment of Latin-1 grave accent to \[oq] special character;
+ reassign it to the neutral apostrophe. Map \[aq] to neutral
+ apostrophe. Map \[ga] to '`'.
+
+2022-03-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/xtotroff/xtotroff.1.man (Options) <-d>: Document new
+ option.
+ * src/utils/xtotroff/xtotroff.c (usage): Align with man page.
+
+2022-03-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Manipulating Filling and Adjustment):
+ Explicitly identify the page offset as an output line property
+ that is not determined until a break occurs.
+
+ (Line Layout) <po>: Correct error; the page offset for terminal
+ devices is set by "tty.tmac", not "troffrc". (The manual has
+ been wrong for a long time; we've had it in tty.tmac since James
+ Clark put it there in 1992.) Recast and tighten wording. Drop
+ the word "horizontal"; there is no vertical page offset (as
+ such) in *roff. Replace hand-waving about unexpected results
+ with a description of the formatter's behavior. Document
+ request behavior without an argument before getting into the
+ weeds (and CSTR #54 errata). Migrate terminology from "scaling
+ indicator" to "scaling unit".
+
+ Fixes <https://savannah.gnu.org/bugs/?58035>.
+
+2022-03-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Expressions): Expand '|' operator explanation.
+ Split discussion of its application into horizontal and vertical
+ contexts. Add example of vertical usage.
+
+ Fixes <https://savannah.gnu.org/bugs/?60820>.
+
+2022-03-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp: Trivially refactor. Drop `#define`
+ that was working around a GCC 2.95-era libstdc++ problem.
+ Shorten long line.
+ (get_char_for_escape_parameter): Demote parameter from `int` to
+ `bool` and use Boolean literal for default argument. Annotate a
+ null pointer constant.
+
+2022-03-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Rename some internal functions.
+
+ * src/roff/troff/input.cpp: Do it.
+ (read_escape_name):
+ (read_long_escape_name):
+ (read_two_char_escape_name):
+ (get_char_for_escape_name):
+ (read_increment_and_escape_name): Rename these...
+ (read_escape_parameter):
+ (read_long_escape_parameters):
+ (get_char_for_escape_parameter):
+ (read_two_char_escape_parameter):
+ (read_increment_and_escape_parameter): ...to these.
+ (read_two_char_escape_parameter, read_long_escape_parameters,
+ read_escape_parameter, read_increment_and_escape_parameter,
+ get_copy, token::next): Update call sites.
+
+2022-03-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (get_char_for_escape_name): Recast
+ diagnostic messages to more accurately refer to escape
+ "sequence" rather than "name". "Name" is a confusing term here,
+ given that it also applies to a group of objects sharing a name
+ space (natch): requests, macros, strings, and diversions.
+ Further, the "escape name" cited by these diagnostics is not the
+ escape function selector; that is, the character after the
+ escape character which determines how the escape sequence is to
+ be interpreted. These diagnostics are only thrown after that
+ function is known, however, when parsing of an escape sequence
+ parameter is attempted.
+ (input_char_description): Drop leading articles ("a") from
+ input character descriptions, to economize in diagnostic
+ messages this function helps produce.
+ (non_empty_name_warning): Use zero copula for economy.
+
+ * src/roff/troff/input.cpp (empty_name_warning, read_size)
+ (token::get_char, check_missing_character):
+ * src/roff/troff/number.cpp (start_number, parse_term): Recast
+ messages to more consistently use the form "expected X, got Y"
+ where feasible.
+
+ * src/roff/troff/number.cpp (start_number): Say "numeric
+ expression missing" instead of "missing number"; we don't
+ require a terminal symbol in the expression grammar here. Also
+ use `tok.description()` where we can, and remove assumption that
+ the escape character is the default.
+
+2022-03-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac (AT, UC, HP): Add deprecation warnings. For the
+ last, only do so if we're not inside a synopsis (SY/YS), since
+ our definition of `SY` calls `HP` internally. (This does seem
+ hypocritical. Perhaps if we knew the correct CSS incantation
+ to speak in grohtml, we could un-deprecate `HP`.)
+
+2022-03-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tmac.an (M4CHECK): Rename stamp file to make its purpose
+ clearer.
+
+2022-03-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Tweak customization management.
+
+ * tmac/an.tmac: Load "man.local" with `msoquiet` request, so
+ people can get rid of the file if they don't need it.
+ (PT, BT): Define these macros only if not already defined. This
+ is slightly less paranoid but far more ergonomic, given
+ interactions with the andoc wrapper. Now user-defined page
+ header traps (PT) defined in man.local can take effect on the
+ first page rendered.
+
+ * tmac/groff_man.7.man.in (Hooks): Document how to remove page
+ headers and/or footers entirely.
+
+ Fixes <https://savannah.gnu.org/bugs/?61954>.
+
+2022-03-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [refer,mm]: Add and use `ref*reset` macro to clean up between
+ bibilography entries.
+
+ * tmac/refer.tmac (]-): Move string clean up logic from here...
+ (ref*reset): ...to this new macro. Now we can also use it...
+
+ * contrib/mm/refer-mm.tmac (ref*][-first-pass): ...here.
+
+ Problem appears to date back to refer-mm.tmac's introduction in
+ January 2011. Thanks to Bjarni Ingi Gislason for the root-cause
+ analysis and proposed fix, to which I applied the DRY principle
+ and added a reset of `ref*string` as well.
+
+ Fixes <https://savannah.gnu.org/bugs/?60657>.
+
+2022-03-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mm]: Regression-test Savannah #60657.
+
+ * contrib/mm/tests/remove-stale-bib-entry-data.sh: Do it.
+ * contrib/mm/tests/artifacts/60657.ref: Add new file.
+ * contrib/mm/mm.am (mm_TESTS): Run test.
+ (EXTRA_DIST): Ship test artifact in distribution archive.
+
+ Thanks to Bjarni Ingi Gislason for the straightforward
+ bug reproducer.
+
+2022-03-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [refer]: Report correct line number in bibliography file
+ diagnostics.
+
+ * src/preproc/refer/refer.cpp (do_bib): Set line number to 1
+ upon successfully opening a bibliography file.
+
+ Problem appears to date back to groff 1.02 (June 1991) at the
+ latest.
+
+ Fixes <https://savannah.gnu.org/bugs/?62142>.
+
+2022-03-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [refer]: Regression-test Savannah #62124.
+
+ * src/preproc/refer/tests/report-correct-line-numbers.sh: Do it.
+ * src/preproc/refer/tests/artifacts/62124.ref: Add new file.
+ * src/preproc/refer/refer.am (refer_TESTS): Run test.
+ (EXTRA_DIST): Ship test artifact in distribution archive.
+
+2022-03-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/div.cpp
+ (top_level_diversion::transparent_output):
+ * src/roff/troff/input.cpp (transparent_translate): Suppress two
+ troublesome (i.e., more or less spurious) error diagnostics
+ about transparent output/throughput unless the environment
+ variable `GROFF_ENABLE_TRANSPARENCY_WARNINGS` is present. This
+ is a bit of a bodge until we get diversion sanitization worked
+ out. See Savannah #61407.
+
+2022-03-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [preconv]: Stop assuming that the default input stream, or an
+ explicit '-' operand, is the only unseekable stream. Check
+ instead.
+
+ * src/preproc/preconv/preconv.cpp (do_file): Add new Boolean
+ `is_seekable`. Test the input stream with `fseek()` per a
+ suggestion from Ingo Schwarze. Report unseekability in debug
+ output and skip coding tag and uchardet tests altogether
+ {precisely paralleling our description in the preconv(1) man
+ page}. Also update debugging output to say "<standard input>"
+ instead of "-".
+
+ Fixes <https://savannah.gnu.org/bugs/?62131>.
+
+2022-03-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [preconv]: Regression-test Savannah #62131.
+
+ * src/preproc/preconv/tests/do-not-seek-the-unseekable.sh: Do
+ it.
+ * src/preproc/preconv/preconv.am (preconv_TESTS): Run test.
+
+2022-03-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/main.cpp (process_format): Update diagnostic
+ to recognize that a font mounting position is also an acceptable
+ argument to the 'f' column modifier.
+
+2022-02-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Refactor X11 font description generation. Integrate it with our
+ "new" (post-2014) Automake-based build system.
+
+ * src/utils/xtotroff/Makefile.in: Delete relic of old build
+ system. Also, it had a bug: it generated X11 output device
+ 'DESC' files with a "unitwidth 10" directive even for the "-12"
+ devices, which is not correct (the in-tree DESC files we've been
+ shipping for years were nevertheless correct, apparently fixed
+ by hand by James Clark in groff 1.07 [March 1993]).
+
+ * src/utils/xtotroff/xtotroff.am: Define `xtotroff` variable for
+ use by X11 font description generation targets below.
+
+ * font/devX100-12/devX100-12.am:
+ * font/devX100/devX100.am:
+ * font/devX75-12/devX75-12.am:
+ * font/devX75/devX75.am: Add new (phony) targets, variously
+ named "devX{100,100_12,75,75_12}", to generate the corresponding
+ output device's DESC file and run xtotroff(1) to generate its
+ font description files. Be sure to set the correct "unitwidth"
+ for the "-12" devices. Add new dependency-only rule
+ "maintainer-font-descriptions" depending on these new targets
+ for convenience (and future expansion to devps and devlj4).
+
+ * FOR-RELEASE: Document existence of
+ "maintainer-font-descriptions" Make target and when to run it.
+
+ Running this target with the aforementioned bug fix, overwriting
+ the in-tree DESC and font description files using data gathered
+ from a running X server, results in no changes whatsoever. Say
+ what you will about X11 core font technology--it's stable.
+
+2022-02-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Rename and ship "FontMap-X11". xtotroff(1) is not very useful
+ without a font name mapping file to read. To date it has been
+ available only in the source distribution. Remedy that. The
+ file is placed directly in the groff font directory alongside
+ the device directories because it applies to four different
+ devices, and four copies of this data are not required.
+
+ * src/devices/xditview/FontMap: Rename to...
+ * src/devices/xditview/FontMap-X11: ...this.
+
+ * LICENSES:
+ * src/devices/xditview/xditview.am (EXTRA_DIST): Reflect rename.
+
+ * src/devices/xditview/xditview.am (install_xditview
+ [!WITHOUT_X11], uninstall_xtdiview): (Un-)install it.
+
+ * src/utils/xtotroff/xtotroff.1.man (Files): Add section
+ documenting the presence and purpose of this file.
+
+2022-02-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [xtotroff]: Add `-d` option to produce font description files in
+ specified directory.
+
+ * src/utils/xtotroff/xtotroff.c: Do it. Add global `destdir`
+ pointer.
+ (xtotroff_exit): Add new function to clean up storage allocated
+ by `strdup()` (below) for destination directory.
+ (MapFont): Introduce new variable `file_name`, into which we
+ assemble a destination file name from `destdir` (if not null)
+ and the troff font name. Handle memory allocation failure (by
+ carefully dying). Free allocated storage on success and failure
+ paths out of the function.
+ (usage): Document new `-d` option.
+ (main): Instruct `getopt_long` to expect a `-d` flag with an
+ argument. Use `strdup()` to make a copy of any such option
+ argument. Call `xtotroff_exit()` instead of `exit()`.
+
+ * src/utils/xtotroff/xtotroff.1.man: Document new `-d` option.
+
+2022-02-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [xtotroff]: Trivially refactor.
+
+ * src/utils/xtotroff/xtotroff.c: Boolify. Include `stdbool.h`
+ and `errno.h` headers.
+ (charExists, CanonicalizeFontName, FontNamesAmbiguous, MapFont):
+ Boolify. Demote return type from `int` to `bool` and return
+ Boolean instead of integer literals.
+ (FontNamesAmbiguous, main): Reorder equality comparisons with
+ simple left-hand sides to avoid inadvertent lvalue assignments.
+ (FontNamesAmbiguous, MapFont): Refer to font name as "invalid",
+ not "bad", in diagnostic messages.
+ (MapFont, main): Use `strerror()` instead of `perror()` so that
+ diagnostics include the program name and an indication of
+ problem severity.
+ (MapFont): Compare `FILE` stream pointer to `NULL` instead of
+ treating it as a Boolean.
+ (main): Use `EXIT_SUCCESS` and `EXIT_FAILURE` constants from C
+ library instead of integer literals for exit status.
+
+2022-02-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [pic]: Fix "unused result" compiler warning.
+
+ * src/preproc/pic/pic.ypp (placeless_element) <SH>: Check return
+ value of `system()` to quieten `-Wunused-result` warning; if it
+ is less than zero, report it to the standard error stream.
+
+2022-02-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/safer.tmac: Drop file from distribution. It contained
+ only comments.
+ * tmac/tmac.am (TMACNORMALFILES): Delete reference.
+ * NEWS: Add item. Suggest two workarounds for its absence.
+
+ Fixes <https://savannah.gnu.org/bugs/?61831>.
+
+2022-02-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/doc.tmac (initialization): Drop definition of
+ `doc-curr-size` register. It is no longer needed since nothing
+ internal to the package now changes the type size.
+
+ * tmac/doc.tmac (Fl, doc-print-recursive, doc-print-prefixes)
+ (doc-generic-macro, Ar, Cd, doc-do-func-decl, Fd, In, Nm, Pa)
+ (Tn, doc-enclose-string, Ef, Bd, doc-save-global-vars)
+ (doc-restore-global-vars, doc-diag-list, Xr, Dl, Vt, Ft, Fa)
+ (doc-do-func, Fn, doc-do-func-args, Fo, Fc, %A, %B, %C, %D, %I)
+ (%J, %N, %O, %P, %Q, %R, %T, %U, %V, doc-do-reference, Hf, An)
+ Lk):
+ * tmac/mdoc/doc-common (Sh, Ss, Rd):
+ * tmac/mdoc/doc-syms (Ux, Bx, At, Dx, Fx, Nx, Ox, Bsx, St, Lb):
+ Drop interpolations of the string and comments documenting that
+ each macro has a side effect on the type size.
+
+2022-02-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/doc.tmac (Tn):
+ * tmac/mdoc/doc-syms (Ux, Bx): Stop interpolating string
+ `doc-Tn-font-size` to set macro arguments at a smaller type
+ size. This leaves the string without a purpose, so...
+
+ * tmac/mdoc/doc-ditroff:
+ * tmac/mdoc/doc-nroff: Drop definitions of `doc-Tn-font-size`.
+
+ * tmac/mdoc/doc-syms: Drop interpolations of that string from
+ numerous other string definitions.
+
+ Fixes <https://savannah.gnu.org/bugs/?60616>.
+
+2022-02-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Revert addition of man(7) `BD` register. This feature, which I
+ introduced in commit ea3b27102f (31 January) doesn't work
+ because pdf.tmac normalizes the bookmark depth. Embedding a man
+ page in a larger PDF document with appropriately nested
+ bookmarks is a project that will have to await another day (or
+ perhaps already has tools to implement it).
+
+ * tmac/an.tmac: Do it.
+ * tmac/groff_man.7.man.in: De-document it.
+
+2022-02-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/pdf.tmac: Add string containing the name of the macro
+ package for use in diagnostic messages.
+ (pdf:warn, pdf:error): Use it.
+
+ Continues the long process of fixing Savannah #52463.
+
+2022-02-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man,mdoc,me]: Revise hyphenation localization.
+
+ * tmac/an.tmac (an*reset-hyphenation-mode): New macro sets the
+ hyphenation mode appropriate to the locale depending on the
+ values of `cR` (continuous rendering mode) and `HY` (hyphenation
+ enablement); the latter is now interpreted as a Boolean. Define
+ new register `an*hyphenation-mode` reflecting these conditions.
+ (TH): Call the foregoing instead of invoking `hy` request.
+ (MR): Restore hyphenation mode to `an*hyphenation-mode`.
+ (initialization): Simplify; if not defined, set `HY` to 1.
+
+ * tmac/e.tmac (ld): Set the hyphenation mode here instead of in
+ initialization (which already calls this macro). Set the mode
+ to 6 for the benefit of anyone borrowing our me(7) changes, but
+ then immediately change to the mode determined by the
+ localization file.
+
+ * tmac/mdoc/doc-common (doc-hyphen-flags): Set a hyphenation
+ mode appropriate to the locale, depending on the values of `cR`
+ and `HY`.
+ * tmac/mdoc/doc-ditroff:
+ * tmac/mdoc/doc-nroff: Simplify initialization; if not defined,
+ set `HY` to 1.
+
+ * tmac/cs.tmac:
+ * tmac/de.tmac:
+ * tmac/en.tmac:
+ * tmac/fr.tmac:
+ * tmac/it.tmac:
+ * tmac/sv.tmac: Before switching locales, set a flag if
+ troublesome value 2 of the hyphenation mode is set so that we
+ can preserve it. Shift man(7) and me(7) logic to follow setup
+ of the new hyphenation mode; for the former, call the new
+ `an*reset-hyphenation-mode`.
+
+ * tmac/groff_man.7.man.in:
+ * tmac/groff_mdoc.7.man: Document updated meaning of `HY`
+ register.
+
+ * NEWS: Add item noting change of man(7) `HY`'s meaning. Update
+ existing item regarding mdoc(7)'s support for it (groff 1.22.4
+ mdoc(7) didn't recognize the register at all).
+
+ Fixes <https://savannah.gnu.org/bugs/?61734> (for real this
+ time?).
+
+2022-02-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Regression-test Savannah #61734.
+
+ * tmac/tests/an_reset-hyphenation-correctly.sh: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-02-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * man/groff_char.7.man (History): Add new section.
+ (See also): Add cross reference to 1976 edition of CSTR #54.
+
+2022-02-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/groff_man.7.man.in (Document structure macros) <EX, EE>
+ [style]: Add material cautioning writers against asoociating
+ the disablement of filling with some sort of "literal mode".
+ Document still-operational status of inter-sentence space
+ supplementation.
+ (Notes) [style]: Describe an alternative (and macro
+ call-symmetrical) means of using `RS` and `RE` with `TP`.
+
+2022-02-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Add phony targets "man-all" and "man-clean" to
+ {re-}generate and delete all man pages, respectively.
+
+ Arguably fixes <https://savannah.gnu.org/bugs/?61167>.
+
+2022-02-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * Makefile.am (.man): Prefix hyphenation control escape
+ sequences to more configuration-time interpolations to prevent
+ their hyphenation: @DEVICE@, @g@, @INDEX_SUFFIX@, @PAGE@,
+ @TMAC_{AN,M,S}_PREFIX@, @TMAC_MDIR@.
+
+2022-02-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Refactor `EX` and `EE` macros.
+
+ * tmac/an-ext.tmac: Add new `mC` string to store the font name
+ to be used for example regions. In AT&T device-independent
+ troff, "CW" was a common name, so use that. It is however a
+ terrible fit for groff's font family and style-combination
+ functionality, and is inflexible in the face of font selection
+ requests and escape sequences within the example region. (One
+ either needs to know the names of the fonts available on the
+ output device, or suffer the indignity of mixed constant-width
+ and proportional typefaces.) Relatedly, drop groff-specific
+ font remapping requests.
+ (EX, EE): Ignore definition if GNU troff is the formatter. Drop
+ font family manipulation. Drop specialized logic for groff's
+ DVI output device.
+
+ * tmac/an.tmac (initialization): Resurrect font remapping
+ requests here.
+ (EX, EE): Add new definitions, saving and restoring more state
+ and remapping DVI output device fonts to reflect the absence of
+ CWB and CWBI faces.
+
+2022-02-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-ext.tmac: Slightly refactor. Stop using groff's `HY`
+ register to restore the hyphenation mode, since I plan to change
+ its semantics to a Boolean value (see Savannah #61734).
+ Introduce new register `mJ` to store "1" (if not groff) and the
+ current hyphenation mode otherwise. Explain why in a comment.
+ (YS, UE, ME, MR): Restore hyphenation mode using `mJ` instead of
+ `HY`.
+
+2022-02-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-ext.tmac: Trivially refactor. Use a better idiom
+ {seen in James Clark's changes to BSD me(7)} for conditionally
+ defining a (simple) macro.
+
+2022-02-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grotty/tty.cpp (tty_printer::special): Warn upon
+ encountering unrecognized device control commands using the
+ 'tty:' tag.
+
+2022-02-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grotty]: Remove 'sgr' device control command.
+
+ * src/devices/grotty/tty.cpp (tty_printer::special): Do it.
+ * src/devices/grotty/grotty.1.man (Device control commands):
+ {De-}document it.
+ * NEWS: Add item.
+
+ Fixes <https://savannah.gnu.org/bugs/?61561>.
+
+2022-02-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/pdfpic.tmac: Add support for Cygwin/MinGW temporary
+ directory conventions.
+
+2022-02-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/pdfpic.tmac: Search for temporary directories as groff(1)
+ does, instead of going straight to /tmp.
+ (pdfpic@get-temporary-directory): New function checks each of
+ its arguments for validity as a temporary directory; if one is
+ found, its name is left in `pdfpic*temporary-directory`.
+ (pdfpic@cleanup): Remove strings `pdfpic*temporary-directory`
+ and `pdfpic*temporary-file`.
+ (PDFPIC): Call `pdfpic@get-temporary-directory`, using the
+ contents of the environment variables $GROFF_TMPDIR and $TMPDIR,
+ and then /tmp, in that order. Store the temporary file name in
+ string `pdfpic*temporary-file`. Use this string in subsequent
+ `sy` and `so` requests.
+
+ Fixes <https://savannah.gnu.org/bugs/?62055> for Unix systems.
+
+2022-02-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tests]: Add test for PDFPIC fallback to PSPIC.
+
+ * tmac/tests/pdfpic_falls_back_to_PSPIC.sh: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-02-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tests]: Tweak PDFPIC test input.
+
+ * tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh:
+ Eliminate unnecessary blank lines from input. Also call gs(1)
+ with '-q' in addition to '-o'. (Why does the latter not imply
+ the former?!) Thanks to Deri James for the advice.
+
+2022-02-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/pdfpic.tmac: Slightly refactor.
+ (pdfpic@cleanup, PDFPIC): Rename `pdfpic*file-name` to
+ `pdfpic*file-name-base` since it is not used as a complete file
+ name (but rather a basis for an ".eps" extension).
+ (PDFPIC): When testing PDF file extension, include the "."; a
+ file name like "mxyzptlkpdf" is too dubious to accept. Also
+ explicitly compare `systat` register as equal or not equal to
+ zero, since its truth value is inverted from the expectations of
+ *roff expressions.
+
+2022-02-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/pdfpic.tmac (PDFPIC): Refactor PDFPIC_NOSPACE handling.
+ Stop shelling out to create, and then sourcing, a temporary file
+ just to obtain the value of an environment variable. groff
+ already has the `\V` escape sequence for that purpose (it's even
+ safe!). Check that the value of $GROFF_PDFPIC_NOSPACE is a
+ valid numeric expression before assigning it to a register.
+ Trivially, use '=' instead of '==' as an equality operator.
+ *roff languages do not use '=' as an assignment operator, and I
+ believe the '==' synonym to be a sop to C programmers.
+
+2022-02-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Stop attempting to adjust pargraph tag lines.
+
+ * tmac/an.tmac (TP): Disable adjustment inside the diversion.
+ (an-write-paragraph-tag): Restore adjustment outside of it.
+
+ Fixes <https://savannah.gnu.org/bugs/?62051>.
+
+2022-02-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac (@z): Conceal bare tab after request name (exposed
+ by no longer stripping the macro file). See commit ad0575f20, 9
+ December.
+
+2022-02-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grops,troff]: Migrate to term "scaling unit" in diagnostics.
+
+ * src/devices/grops/ps.cpp (ps_printer::do_import):
+ * src/roff/troff/input.cpp (warnscale_request):
+ * src/roff/troff/number.cpp (parse_term): Do it.
+
+2022-02-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [me]: Add nroff mode fallback for `u` macro.
+
+ * tmac/e.tmac (u): On nroff devices, bracket the first argument
+ with \(ul (underline rule) special character escape sequences.
+ {In plain language, '.u "like this"' renders "_like this_".}
+
+ I regard this as a cosmetic and semantic improvement; since the
+ quarter-em vertical motions used in troff mode were ignored in
+ nroff mode, the effect was not underlining but a sort of
+ strike-through, visible only at spaces in the argument. The use
+ of this macro was thus invisible in nroff output if no spaces
+ were present in the argument. This is probably the best we can
+ do without a fatter interface to terminal device capabilities.
+
+2022-02-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [me]: Simulate boxed text support on nroff devices with ISO 6429
+ color escape sequences.
+
+ * tmac/e.tmac (bx): Do it. Add further fallback for non-groff
+ formatters in nroff mode, bracketing the boxed argument with '|'
+ glyphs.
+ * doc/meref.me.in: Document it.
+
+ Fixes <https://savannah.gnu.org/bugs/?62038>.
+
+2022-02-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [me]: Rename registers `$v` -> `tv`, `$V` -> `dv`.
+
+ * tmac/e.tmac: Do it. Also include much commentary (including
+ some from James Clark in 1992) attempting to illuminate the
+ confusing history (and naming) of `$[rRvV]`.
+
+ * doc/meref.me.in: Document it. Introduce new terms
+ "text vertical spacing" and "display vertical spacing" earlier
+ and use them to condense and clarify discussions of their use.
+
+ * NEWS: Add item.
+
+ Fixes <https://savannah.gnu.org/bugs/?61710>.
+
+2022-02-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Deferring Output): Add new node introducing
+ and motivating environments, diversions, and traps.
+
+2022-02-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tmac]: Add more compatibility mode guards.
+
+2022-02-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/pdf.tmac: Add compatibility mode guards so that we can
+ run even if troff is given the -C option. Resurrect your
+ vintage 1975 Sixth Edition Unix manuals from '.deth' and format
+ them in PDF today!
+
+ Fixes <https://savannah.gnu.org/bugs/?61995>.
+
+2022-02-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/andoc.tmac: Prefix diagnostic with package file name
+ literally.
+
+2022-02-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Trivially refactor.
+
+ * tmac/an.tmac (an*localize): Rename to...
+ (an*localize-strings): ...this.
+ (TH): Update call site.
+
+2022-02-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [docs]: Present several fundamental concepts.
+
+ * doc/groff.texi (Page Geometry):
+ * man/roff.7.man (Concepts): Add new node/section.
+ - page geometry
+ - basic units
+ - device resolution
+ - drawing position
+ - text baseline
+ - page offset
+ - vertical spacing
+ - page break
+
+ Fixes the remainder of <https://savannah.gnu.org/bugs/?58035>.
+
+2022-02-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [me]: Add page length insufficiency check.
+
+ * tmac/e.tmac (@h): Port Keith Marshall's page length checker
+ from ms(7).
+
+ Fixes <https://savannah.gnu.org/bugs/?61034> and
+ <https://savannah.gnu.org/bugs/?61428>.
+
+2022-02-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [me]: Add test for insufficient page length error.
+
+ * tmac/tests/e_rejects-too-short-page-lengths.sh: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-02-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [me]: Slightly refactor.
+
+ * tmac/e.tmac (@h): Use groff default scaling operator in
+ conditional expression. Add `do` requests so that the logic for
+ checking the line length works in compatibility mode. Also move
+ misplaced parenthesis in conditional expression.
+
+2022-02-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Refactor insufficient page length check.
+
+ * tmac/s.tmac (pg@top): Drop extraneous closing parenthesis from
+ numeric expression. Change operator from '>' to '>='; a page
+ length right at the boundary causes a spurious extra page break
+ when a paragraphing macro is used to initialize the document.
+ Condense diagnostic emission using the @error macro instead of
+ duplicating it. Change indentation to fit the style of the rest
+ of the file (use hard tabs). If aborting, truncate the page
+ length to the current vertical position so that we don't
+ uselessly output further vertical space.
+
+2022-02-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Add test for insufficient page length error.
+
+ * tmac/tests/s_rejects-too-short-page-lengths.sh: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-02-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [me]: Vertically space delayed text like other annotations.
+
+ * tmac/e.tmac ((d): Set vertical spacing using percentage in
+ `$V` register.
+ ()d): Restore vertical spacing using percentage in `$v`
+ register.
+
+ Fixes <https://savannah.gnu.org/bugs/?61973>.
+
+2022-01-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Expand '@PAGE@' when generating man pages.
+
+ * Makefile.am (.man): Substitute the './configure'd paper format
+ for @PAGE@.
+ * src/roff/groff/groff.1.man: Use it.
+
+2022-01-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Trivially refactor an-ext.tmac.
+
+ * tmac/an-ext.tmac (EX, EE): Do a better job of keeping the
+ name space promise made in comments at the top of the file.
+ Rename `sP` register to `mP`. Problem introduced by me in
+ commit 69895ec20, 15 January 2020. Also rename `la` and `ra`
+ strings to `mL` and `mR`, respectively. These (undocumented)
+ string names date back to commit 259929625, 15 January 2007.
+
+ * tmac/groff_man.7.man.in (Files) <an-ext.tmac>: Document the
+ aforementioned promise.
+
+2022-01-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Refactor PDF bookmark support.
+
+ * tmac/an.tmac (an*bookmark): New internal macro calls
+ `pdfbookmark` (only if the output device is 'pdf').
+ (initialization): Migrate macro appendments to appropriate
+ definitions. Two cases...
+ (SH, SS): ...were straightforward.
+ (initialization): Another (for the man page title) was poorly
+ placed when appended to the `TH` macro, skipping over the page
+ header. Move it instead...
+ (PT): ...here. But to keep this bookmark from being generated
+ on every page of a document, we need a new variable
+ `an*was-TH-bookmark-emitted` which is tested here and assigned
+ once one bookmark corresponding to a `TH` call has been written.
+ (TH): Initialize `an*was-TH-bookmark-emitted` to zero.
+ (SS): Write the bookmark _before_ the subsection heading text.
+ (initialization): Drop short-lived `BM` register. It seems
+ harmless to unconditionally include bookmarks in PDF output. A
+ PDF tool can strip them out if they're not desired, and viewers
+ seem capable of minimizing or reducing the navigation pane (if
+ they even offer one in the first place).
+
+ * tmac/an.tmac (initialization): Rename new `BN` register to
+ `BD`...
+ * tmac/groff_man.7.man.in (Options) <BD>: ...and document it.
+ Also document `PT`'s new bookmarking responsibility.
+
+ Fixes <https://savannah.gnu.org/bugs/?58949> and
+ <https://savannah.gnu.org/bugs/?58950>.
+
+2022-01-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grohtml,groff,nroff,troff]: Tweak usage message.
+
+ * src/devices/grohtml/post-html.cpp (usage):
+ * src/roff/groff/groff.cpp (synopsis):
+ * src/roff/nroff/nroff.sh:
+ * src/roff/troff/input.cpp (usage): Partly revert commit
+ 06ae7b0b8, 16 January. Move an ellipsis back inside a bracketed
+ operand (that is, an optional one). On reflection, I think this
+ notation makes it clearer that the command can be meaningfully
+ run without operands.
+
+2022-01-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/papersize.tmac: Slightly refactor. Use new `stringdown`
+ request instead of a combination of `tr`, `di`, `asciify`, and
+ `chop`.
+
+2022-01-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Slightly refactor.
+
+ * tmac/an.tmac (an-prepare-page-title): Rename to...
+ (an*prepare-page-title): ...this. Also simplify numeric
+ expression. Add comment regarding necessity of correct
+ environment.
+
+ (an-header): Update call site of `an*prepare-page-title`.
+
+ (TH): Move planting of `an-header` trap from out of the midst of
+ footer trap management. Add comments.
+
+ (an-header): Move `pl` and `sp` requests from here...
+ (PT): ...to here. While it's conceptually nice to have these
+ macros consist solely of `tl` requests, it doesn't yield enough
+ power to those who want to redefine them. Add comment.
+
+ (an-footer, BT): ...simile.
+
+2022-01-27 Dave Kemper <saint.snit@gmail.com>
+
+ [man pages]: Add more references to pic(1)'s .PF.
+
+ * contrib/chem/chem.1.man:
+ * contrib/pic2graph/pic2graph.1.man:
+ * src/utils/grog/grog.1.man: Do it.
+
+ Fixes <https://savannah.gnu.org/bugs/?61949>.
+
+2022-01-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Implement PDF bookmark support for man pages. Limitation: A
+ {sub}section can only be bookmarked if it is specified in the
+ arguments to the `SH` or `SS` requests, not on the next line in
+ an input trap. Thanks to Deri James for providing the
+ fundamentals (blame me for any weird bits).
+
+ * tmac/an.tmac (an-prepare-page-title): Define a new string,
+ `an*page-ref-string`, which is the man page's own reference
+ {such as "groff(1)"} without any abbreviation, ellipsis, or font
+ selection or italic correction escape sequences.
+ (SS): Define a new string, `an*subsection-heading`, storing the
+ macro arguments (if any). These could contain font selection
+ escape sequences, for instance, a fact that becomes important
+ later.
+ (initialization):
+ - Recognize `BM` register to enable PDF bookmarks (only on the
+ 'pdf' output device); defaults on. Recognize `BN` register to
+ set a base level/depth for the bookmarks; this is to ease
+ embedding of man pages in other PDF documents that already use
+ bookmarks. The default is 0. The registers are not yet
+ documented.
+ - If the output device is 'pdf' and bookmarks are enabled, set
+ `PDFOUTLINE.FOLDLEVEL` and `PDFHREF.VIEW.LEADING` registers
+ {recognized by 'pdf.tmac'}. Append to `TH`, `SH`, `SS` to get
+ the `an*page-ref-string`, `an-section-heading`, and
+ `an*subsection-heading` bookmarks in the document at the
+ applicable levels.
+
+ * tmac/mdoc/doc-common: Add straw-man implementation--it doesn't
+ support the `BM` and `BN` configuration parameters yet. (This
+ is enough to get bookmarks for the groff_mdoc(7) page to
+ correctly appear in the new 'groff-man-pages.pdf' document.)
+ (Dt, Sh, Ss): If the output device is 'pdf', place bookmarks in
+ the document at levels 1, 2, and 3.
+
+ Fixes <https://savannah.gnu.org/bugs/?58950>.
+
+2022-01-26 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ [gropdf]: Allow multiline text in .pdfinfo
+
+ * src/devices/gropdf/gropdf.pl: Use either '\\\\\\\\n' or
+ '\[u000a]' as line separators in the string.
+
+2022-01-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/trans.tmac: Further follow up commit c64fd60dff. If the
+ `andoc` wrapper is being used, perform man(7) localization (not
+ just when `an` is loaded).
+
+2022-01-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man pages]: Fix options used to generate compilations.
+
+ * doc/doc.am (doc/groff-man-pages.pdf): Drop `-rU0` option (it's
+ unnecessary since we don't yet have PDF hyperlink support in
+ this document). Add `-rC1` option to enable continuous page
+ numbering.
+ (doc/groff-man-pages.utf8.txt): Drop `-rC1 -rU1`. Continuous
+ page numbering is superfluous since page numbers are not shown
+ in continuous rendering mode. Stop turning on OSC 8 defaults;
+ we don't know if the document will be viewed with a supporting
+ pager+terminal combination, and further we don't yet have a
+ mechanism for making `MR` man page cross references internal to
+ the document when they indicate groff man pages.
+
+2022-01-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man pages]: Ship compilations in UTF-8 text and PDF.
+
+ Localization support and the resolution of Savannah #61266 have
+ made it practical to batch-render all of groff's man pages as a
+ single giant document. Provide PDF and UTF-8 text (with ECMA-48
+ escape sequences, but not the italic attribute or OSC 8
+ sequences).
+
+ Reasons for this addition include: {1} it is now possible,
+ whereas I don't believe it was in any previous groff release;
+ {2} many people still don't realize how much more pleasant
+ reading typeset man pages can be (while a subjective assessment,
+ I'm not alone[1]); {3} providing these forms permits full-text
+ searching of groff's entire man page corpus via the PDF viewer
+ or a pager like "less -R", the latter without sacrificing the
+ style variations of the text that aid the reader to comprehend
+ the material; {4} sentimentally, it honors the 50th anniversary
+ of the first Unix manual (dated 3 November 1971)
+ <https://www.bell-labs.com/usr/dmr/www/1stEdman.html>.
+
+ * doc/doc.am (PROCESSEDDOCFILES): Add
+ 'doc/groff-man-pages.{pdf,utf8.txt}'.
+ (GROFF_MAN_PAGES{1,2,3}): Add new macro storing names of all man
+ pages generated in the build tree. Motivate the reason for 3
+ variables in a comment (it's due to groff locale switching).
+ (GROFF_MAN_PAGES_ALL): Add convenience macro for use in
+ dependency lists required by...
+ ('doc/groff-man-pages.{pdf,utf8.txt}'): ...these targets.
+ Generate pages with the lint dial turned all the way up.
+
+ Fixes <https://savannah.gnu.org/bugs/?61900>.
+
+ [1] "The manual was intended to be typeset; some detail is
+ sacrificed on terminals." (man(1), _Unix Time-Sharing System
+ Programmer's Manual_, Eighth Edition, Volume 1, February 1985)
+
+2022-01-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Commit c64fd60dff was not quite cooked. The localized
+ strings (in English) for the manual section titles need to be
+ set at every document load (i.e., when `TH` is called), but only
+ if the groff locale is "english". When switching locales, these
+ strings were getting "stuck" in their non-English translations
+ even when returning to an English page.
+
+ * tmac/an.tmac (an*localize): New macro initializes strings.
+ (TH): Call `an*localize` if the locale is "english".
+ (initialization): Drop initialization of section title strings.
+
+ Continues fixing <https://savannah.gnu.org/bugs/?61734>.
+
+2022-01-24 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ [gropdf]: Fix Savannah #61908
+
+ * src/devices/gropdf/gropdf.pl: Adjust text position when
+ given landscape media (i.e -P-l).
+
+ Fixes <https://savannah.gnu.org/bugs/?61908>.
+
+ Thanks to KUBO Koichi for finding the problem and supplying a
+ patch.
+
+2022-01-24 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ * src/devices/gropdf/gropdf.pl: A fix to importing pdf
+ versions > 1.4.
+
+2022-01-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grotty]: Skip part of test if locale doesn't support UTF-8.
+
+ * src/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh:
+ Skip test of 'utf8' output device if locale lacks UTF-8 support.
+ But if the 'ascii' or 'latin1' test cases have already failed,
+ report that instead.
+
+ Fixes <https://savannah.gnu.org/bugs/?61891>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2022-01-23 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ [man pages]: Fix typos.
+
+ Fixes <https://savannah.gnu.org/bugs/?61430>.
+
+2022-01-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tmac]: Fix style nits in test.
+
+ * tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh:
+ - Emit complaints about test environment to standard error.
+ - Replace lingering literal file name with variable expansion.
+ - Skip test if gs(1) fails, instead of reporting failure.
+ - Begin continued lines with operators, for visibility.
+
+2022-01-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grohtml]: Fix misspelled member variable.
+
+ * src/devices/grohtml/post-html.cpp (class html_printer):
+ Rename `supress_sub_sup` to `suppress_sub_sup`.
+
+2022-01-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [pdfpic]: Fix Savannah #58206.
+
+ * tmac/pdfpic.tmac (PDFPIC): Scrub null bytes out of pdfinfo(1)
+ output. Thanks to an anonymous contributor for the patch (the
+ commentary about it is mine, if someone wants an argument).
+
+ Fixes <https://savannah.gnu.org/bugs/?58206>.
+
+2022-01-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [pdfpic]: Regression-test Savannah #58206.
+
+ * tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh: Do
+ it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-01-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [pdfpic]: Refactor.
+
+ Now that the package does not abort upon the first whiff of any
+ trouble, avoid littering groff's name spaces. Take this
+ opportunity to rename registers and strings to have obvious
+ meaning to even the casual reader.
+
+ * tmac/pdfpic.tmac: Do it.
+ (pdfpic@cleanup): New macro removes temporary strings and
+ registers.
+ (PDFPIC): Call the cleanup macro upon entry; this way, if we
+ errored out from a previous call, we avoid confusion. (We don't
+ clean up upon an error return because the leftover objects might
+ be useful for troubleshooting.) Rename registers and strings,
+ to get them under name space discipline and also to better
+ suggest their purpose.
+ - convert-pdf -> pdfpic*do-conversion
+ - pdf-offset-mode -> pdfpic*offset-mode
+ - pspic-args -> pdfpic*pspic-args
+ - pdf-offset -> pdfpic*indentation
+ - is-pdf -> pdfpic*file-extension
+ - img-file -> pdfpic*file-name
+ - pdf-wid -> pdfpic*width
+ - pdf-ht -> pdfpic*height
+ - pdf-deswid -> pdfpic*desired-width
+ - pdf-desht -> pdfpic*desired-height
+ Call cleanup macro before returning upon successful operation.
+
+2022-01-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [pdfpic]: Improve robustness.
+
+ * tmac/pdfpic.tmac (@abort): Rename to `pdfpic@error`. This is
+ an auxiliary package, and something else could very well step on
+ the former name (or worse, we break it if we're loaded later).
+ (pdfpic@error): Stop aborting; simply report an error. It's up
+ to the user how serious `PDFPIC` macro problems are. As noted
+ in a comment, the user can easily `am pdfpic@error` to tack an
+ `ab` request onto the end of its definition. Always report
+ input file name and line number. Replace "[PDFPIC]" prefix with
+ the name of the macro file complaining, to make it easier for
+ groff non-experts to find.
+ (PDFPIC): Return upon errors. Recast diagnostic messages. Stop
+ implying that we perform any sort of probing test of file type
+ {there's no telling what pdfinfo(1) will say}. Apply new
+ 'stringdown' request so that we accept '.pdf' file name
+ extension in any lettercase. Test file argument for existence
+ before proceeding (acknowledge TOCTTOU exposure). Skip file if
+ pipeline returned a non-zero exit status or the registers into
+ which we extract the height and width are undefined (indicating
+ failure of a temporary file to be created or read). Reject
+ files with non-positive image width or height reported by
+ pdfinfo. Validate `width` and `height` arguments, if given,
+ rejecting non-positive values.
+
+ Fixes <https://savannah.gnu.org/bugs/?61892>.
+
+2022-01-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mdoc]: Make `Pa` macro interpolate basic Latin tilde on all
+ output devices.
+
+ * tmac/doc.tmac (Pa): Do it.
+
+2022-01-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Fix incorrect line numbers in diagnostics. Line numbers
+ for multiple format-time diagnostics emitted by tbl(1)-generated
+ groff input were off by +5 lines.
+
+ * src/preproc/tbl/table.cpp: Fix it.
+ (NOP_NAME): Add new preprocessor symbol to construct name of
+ "nop" macro to be used as end macro for `ig` requests inside
+ macro definitions.
+ (table::init_output, table::compute_expand_list,
+ table::compute_separation_factor):
+ - Move `entry_list->set_location()` calls to more auspicious
+ locations.
+ - Replace "around line X" language in diagnostic messages with a
+ more idiomatic, and less embarrassing, simple report of an
+ integer.
+ (table::init_output):
+ - Add `entry_list->set_location()` call right before emitting
+ diagnostic about a table row not fitting on a page.
+ - Turn off eqn(1) delimiters when emitting diagnostic about a
+ boxed table not fitting on a page (necessitating `.TS H`
+ support), using new NOP_NAME-based end macro to achieve this
+ inside a macro definition.
+ (table::compute_expand_list): Suppress issue of too-wide table
+ diagnostic when the `EXPAND` table flag is set (corresponding to
+ the `expand` region option), because other code already emits
+ diagnostics in this case.
+
+ Fixes <https://savannah.gnu.org/bugs/?60598>. Problem appears
+ to date back to commit 3bc4a53a45, 2013-01-07.
+
+2022-01-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Add unit test for format-time diagnostics.
+
+ Ensure that the various format-time diagnostics that a
+ tbl-preprocessed document can generate (1) occur when they are
+ supposed to and (2) are appropriately suppressed by the
+ "nowarn" and/or "nokeep" region options. One of them is an
+ error and cannot be suppressed by the former, but _can_ be by
+ "nokeep", which is arguably a bug (Savannah #61878).
+
+ * src/preproc/tbl/tests/format-time-diagnostics-work.sh: Do it.
+ * src/preproc/tbl/tbl.am (tbl_TEST): Run test.
+
+2022-01-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Trivially refactor.
+
+ * src/preproc/tbl/table.cpp (table::compute_expand_width):
+ Declare and initialize variables closer to use. Also, the width
+ computed is compared to the line length and indentation, so use
+ these well-established *roff terms in the diagnostic message.
+
+2022-01-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Fix Savannah #61854.
+
+ * src/preproc/tbl/table.cpp (compute_expand_width): To properly
+ warn if a table is too wide to fit between the indentation and
+ the right margin, we need to compute its column widths including
+ those eligible for expansion via the 'x' column modifier; we
+ cannot use the same expression that we do to determine the
+ amount of space we have to distribute among the expanded
+ columns. Iterate through columns again (the function was
+ already doing so twice), once to potentially produce the
+ warning, and then as before to distribute any available width.
+ In other words, warnings were only being emitted for too-wide
+ tables where one or more columns used the 'x' modifier.
+
+ Fixes <https://savannah.gnu.org/bugs/?61854>.
+
+2022-01-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Don't add leaders that don't lead anywhere.
+
+ * tmac/s.tmac (toc*end-entry): If no page number string
+ `toc*num` is defined, don't interpolate its emptiness prefixed
+ with a leader (and tab). This makes "no" as the first argument
+ to `XS` and `XA` work as documented, suppressing not only the
+ page number but the leader after the entry.
+
+ Fixes <https://savannah.gnu.org/bugs/?61853>.
+
+2022-01-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Add regression test for Savannah #61853.
+
+ * tmac/tests/s_XA-literal-no-argument-suppresses-leader.sh: Do
+ it.
+ * tmac/tmac.am (tmac_TESTS): Run it.
+
+2022-01-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [me]: Fix bad unit test.
+
+ * tmac/tests/e_chapter-titles-work.sh: Fix missing shell test at
+ end of script, which caused it to exit successfully regardless
+ of any test failures. Irritating. This is among the fruits of
+ the "never, ever use 'set -e'" tree. (This religion has a thick
+ bible: <https://mywiki.wooledge.org/BashFAQ/105>.) Fortunately,
+ all the tests pass legitimately.
+
+2022-01-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [font]: For 'ascii' and 'latin1' devices, consistently define
+ glyphs for ordinary characters before their special character
+ aliases. This parallels existing usage for the 'cp1047' device,
+ and, I think, makes the file contents slightly more accessible.
+
+ * font/devascii/R.proto:
+ * font/devlatin1/R.proto: Do it.
+
+2022-01-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grohtml]: Update diagnostic messages.
+
+ * src/devices/grohtml/post-html.cpp (assert_state::add)
+ (assert_state::compare, replace_negate_str)
+ (assert_state::check_value_error, make_val): Make format of
+ internal assertion system messages shorter and more mutually
+ parallel.
+ (html_printer::set_char, html_printer::set_numbered_char)
+ (html_printer::set_char_and_width): Parallelize diagnostic
+ messages with libdriver; see yesterday's commit.
+ (main): Put information in argument to `assert()`; see commit
+ 11b43053, 24 November.
+
+2022-01-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [nroff]: Emit usage message on usage errors.
+
+ * src/roff/nroff/nroff.sh: Store the usage message in a shell
+ variable instead of a here document, and sling it to the
+ standard output or standard error streams, as appropriate.
+
+2022-01-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grohtml,groff,nroff,troff]: Tweak usage message.
+
+ * src/devices/grohtml/post-html.cpp (usage):
+ * src/roff/groff/groff.cpp (synopsis):
+ * src/roff/nroff/nroff.sh:
+ * src/roff/troff/input.cpp (usage): Stop putting an ellipsis
+ inside a bracket expression (for file arguments); that suggests
+ misleading complexity.
+
+ * src/devices/grohtml/post-html.cpp (usage): Also don't set
+ metasyntactic variable names in screaming capitals when they are
+ separated from option letters by space and thus can't be
+ confused with them.
+
+2022-01-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libdriver]: Update diagnostic messages.
+
+ * src/libs/libdriver/printer.cpp (printer::find_font): Describe
+ the problem encountered instead of saying lamely "sorry, I can't
+ continue".
+ (printer::set_char_and_width, printer::set_numbered_char):
+ Characterize input as "invalid", not "bad"; see commit bb7512b5,
+ 17 September. When referring to font mounting position, say so.
+ (printer::set_char_and_width): Describe required input character
+ as "ordinary", not "ascii". Apart from the incorrect casing,
+ doing so better aligns with our terminology in groff_char(7),
+ groff_out(5), our Texinfo manual, and other diagnostic messages;
+ moreover, the use of "ascii" is potentially confusing to those
+ whose environments use another encoding, like UTF-8 or IBM code
+ page 1047.
+
+ Fixes <https://savannah.gnu.org/bugs/?61829>.
+
+2022-01-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grotty]: Check basic Latin ("ASCII") glyph mappings.
+
+ * src/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh:
+ Do it.
+ * src/devices/grotty/grotty.am (grotty_TESTS): Run test.
+
+2022-01-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [font,tmac]: Simplify Unicode character mapping process.
+
+ * tmac/unicode.tmac: Drop. It was originally added in 2005 to
+ suppress horizontal spacing of glyphs in the range U+0483..9.
+ Its purpose has wandered over the years; most recently to map
+ the Basic Latin ("ASCII") hyphen-minus, apostrophe, and grave
+ accent to special characters (and thus ultimately to the General
+ Punctuation block). But this is unnecessary since the font
+ descriptions for devices with the `unicode` property can provide
+ this information, and anyone who wants to alter the mappings can
+ change either font description files, output device macro files,
+ or troffrc; or add `char` requests to their macro packages or
+ documents (in decreasing magnitude of ambition).
+
+ * tmac/html.tmac:
+ * tmac/tty.tmac: Stop sourcing unicode.tmac.
+
+ * tmac/tmac.am (TMACNORMALFILES): Stop shipping it.
+
+ * font/devutf8/NOTES: Drop remarks about mapping of \[a~],
+ \[a^], and Basic Latin circumflex accent and tilde. Not only do
+ I disagree with the reasoning (whether these glyphs are "too
+ small" depends on the font used by the terminal emulator, over
+ which we have no control), but this mapping happens in a
+ completely different part of the source tree,
+ src/libs/libgroff/glyphuni.cpp.
+
+ * font/devhtml/R.proto:
+ * font/devutf8/R.proto: Add mappings for the five Basic Latin
+ characters that map surprisingly (see groff_char(7)) and are not
+ syntactically significant to troff. Three of these are ported
+ from unicode.tmac.
+ (html): Don't migrate the hyphen-minus--yet.
+
+2022-01-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tty-char.tmac: Drop redundant logic. We don't need to
+ source the `cp1047` or `latin1` files here; `troffrc` will
+ already have loaded `tty` for us, which loads whichever applies.
+
+2022-01-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Separate concerns better; stop re-generating plain
+ text and HTML documents when the 'doc' target is updated; these
+ are already handled by the 'build_infodoc' target.
+ (build_infodoc): Use existing phony targets for plain text and
+ HTML output files instead of repeating filename literals.
+ (doc_all): Remove those same two phony targets from this one's
+ dependencies.
+
+2022-01-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp: Rename `eoi_macro_name` to
+ `end_of_input_macro_name`. It's long, yes, but better parallels
+ `blank_line_macro_name` and `leading_spaces_macro_name`. It is
+ not used in lengthy expressions and furthermore clarifies the
+ meaning of the nearby function name `eoi_macro` in one use.
+
+2022-01-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/preconv/preconv.1.man (Limitations): Add
+ subsection.
+
+ Fixes <https://savannah.gnu.org/bugs/?55035>.
+
+2022-01-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [docs]: Be more careful with control characters when they are
+ word-initial in filled text lines. The idea is to prevent
+ baffling surprises if a sentence is recast in a text editor, and
+ a word beginning with a dot or neutral apostrophe is reflowed
+ onto the beginning of the next input line--suddenly it is parsed
+ as a control character. Based on a patch by Bjarni Ingi
+ Gislason.
+
+ * contrib/hdtbl/groff_hdtbl.7.man:
+ * doc/automake.mom:
+ * doc/meintro.me.in:
+ * doc/meintro_fr.me.in:
+ * doc/pic.ms:
+ * doc/webpage.ms:
+ * src/devices/gropdf/gropdf.1.man: Do it.
+
+ Fixes <https://savannah.gnu.org/bugs/?51312>.
+
+2022-01-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Font Description File Format):
+ * man/groff_font.5.man (Font description file format): Document
+ restriction of kerning adjustment to glyph pairs from within a
+ single font (since that is the scope of the font description).
+
+ Fixes <https://savannah.gnu.org/bugs/?44715>.
+
+2022-01-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * contrib/groff_filenames/groff_filenames.5.man: Remove
+ superfluous paragraphing macro.
+
+ Fixes <https://savannah.gnu.org/bugs/?55084>. Thanks to Bjarni
+ Ingi Gislason for the report and a suggested patch.
+
+2022-01-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Operators in Conditionals): Update explanation
+ of output-comparison conditional operator.
+
+ Fixes <https://savannah.gnu.org/bugs/?60836>.
+
+2022-01-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Use pnmtops(1)'s -quiet option if possible, to quieten
+ build.
+
+ * m4/groff.m4 (GROFF_PNMTOOLS_CAN_BE_QUIET): Add new macro to
+ test pnmtops for support for (undocumented) '-quiet' option.
+
+ * configure.ac: Perform the check.
+
+ * doc/doc.am: Alter check of shell variable `pnmtops_nosetpage`
+ {processed by AC_SUBST} to correctly match even if pnmtops
+ accepts the '-quiet' option.
+
+2022-01-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tmac]: Manage hyphenation mode more carefully in localization
+ packages.
+
+ * tmac/{cs,de,it,sv}.tmac: Localize the man(7) package's HY
+ register.
+
+ * tmac/{cs,de,fr,it,sv}.tmac: When localizing the ms(7) package,
+ use mode "2" instead of "3": the 'hy' request complains of
+ contradictory hyphenation modes if "3" is used (the semantics of
+ the hyphenation mode are complex and non-orthogonal; see
+ groff(7) or our Texinfo manual).
+
+ * tmac/{cs,de,en,fr,it,sv}.tmac: If the one language-independent
+ hyphenation bit (don't hyphenate just prior to a page location
+ trap) is set, preserve it; this way a system's troffrc or a
+ macro package can set it and it will not get turned off by the
+ localization package, which for best results should be loaded
+ after any full-service package (and any auxiliary package
+ requiring localized strings, though none are yet distributed
+ with groff).
+
+2022-01-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tmac]: Add unit test for localization macro files. Right now
+ this just covers the hyphenation mode.
+
+ * tmac/tests/localization-works.sh: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2022-01-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [indxbib]: Document --version in usage message.
+
+ * src/utils/indxbib/indxbib.cpp (usage): Document --version
+ option. Use more informative metasyntactic variable names.
+ Organize usage message consistently with our others, and stop
+ wrapping the output lines: we know neither the width of the
+ terminal nor the length of the `program_name` string we're
+ interpolating. See commit b4de44f0, 19 July 2021.
+
+2022-01-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libbib]: Refactor index header checking.
+
+ * src/libs/libbib/index.cpp: Move more header validity checks...
+ (index_search_item::load): ...from here...
+
+ (index_search_item::check_header): ...to here. Test all size
+ values in header for negative values (never valid) before
+ proceeding. (These data could be changed to unsigned integer
+ types in the file format, but that would require bumping the
+ file version. That in turn would make indexes generated with
+ groff 1.23 unusable on systems running older groffs and, perhaps
+ worse, would make groff 1.23 reject index files produced by
+ older groffs. On the other hand, the regeneration of index
+ files should be, for those who use them, a common activity, and
+ as long as the original database files are kept intact, it seems
+ likely that most people, given modern machines, won't even
+ notice a slowdown in document generation when refer(1) and
+ friends fail to open the indices and fall back to full-text
+ searches of the originals. So we could still consider revising
+ the file format before the groff 1.23 release.)
+
+ * src/libs/libbib/index.cpp (index_search_item::load):
+ Explicitly perform widening conversion from signed `off_t` value
+ {from a stat(2) buffer} to an unsigned integer; quietens
+ compiler warning about comparison between integers differing in
+ signedness.
+
+2022-01-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * configure.ac (AC_CHECK_HEADERS): Expect stdbool.h, since we
+ now use it in src/include/lib.h.
+
+2022-01-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libbib, libgroff, indxbib]: Slightly refactor.
+
+ Also, it's silly to test even numbers > 2 for primality. Stop.
+
+ * src/include/lib.h: Include `stdbool.h` since this header file
+ is used for both C and C++ code.
+
+ * src/include/lib.h (is_prime):
+ * src/libs/libgroff/prime.cpp (is_prime): Boolify. Return
+ Boolean instead of integer literals and demote return type to
+ `bool`. Include `assert.h` and add assertion to reject
+ mathematically offensive input.
+
+ * src/libs/libbib/index.cpp
+ (index_search_item::read_common_words_file): Test only odd
+ numbers for primality.
+ * src/utils/indxbib/indxbib.cpp (main): Same. Since the number
+ comes from user input, make it (a potential hash table size) odd
+ first.
+
+2022-01-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Internationalize and localize.
+
+ * tmac/an.tmac (TH): Indirect predefined manual section titles
+ through new strings `an*section[1-9]` so that they can be
+ localized.
+ (initialization): Give these strings English defaults.
+ (TH): Move `ss` request from here...
+
+ * tmac/en.tmac: ...to here. It's not the man(7) package's
+ business what the inter-word and inter-sentence spacing values
+ are. Also, having the correct[disputed] inter-sentence spacing
+ value for English in its localization file restores it for the
+ benefit of multi-lingual documents (mainly roff applications
+ other than man(7)).
+
+ * tmac/{cs,de,fr,it,sv}.tmac: Supply translations for the manual
+ section titles; these were done by a monoglot American employing
+ Google Translate, so those scandalized or running into howlingly
+ wrong locutions are warmly invited to submit corrections.
+
+ * tmac/trans.tmac: Load localized strings.
+
+ Fixes <https://savannah.gnu.org/bugs/?61734>.
+
+2022-01-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/grog.pl: Handle auxiliary macro package
+ arguments correctly.
+ (process_arguments): Don't append the argument to the '-m'
+ option to the command line; requested macro packages have
+ dedicated logic.
+ (construct_command): When iterating through requested package
+ list, assume each element is an auxiliary package unless it
+ matches an element in the list of main packages. If the
+ assumption holds, append the package name to a new list,
+ `auxiliary_package_argument` (prefixed with '-m'). Push this
+ list onto the command line after any main package.
+
+ Also rename `$selected_main_package` to `$main_package` for
+ brevity, and drop unused global lists `m` and
+ `supplemental_package`.
+
+ Fixes <https://savannah.gnu.org/bugs/?61758>.
+
+2022-01-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/tests/smoke-test.sh: Add test cases for user
+ specification of auxiliary macro packages.
+
+2022-01-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [me]: Drop unnecessary code. Apart from being superfluous, it
+ prevented a user-defined value of the `sx` register from being
+ applied to the first footnote marker interpolated, a subtlety
+ that escaped my notice because the first footnotes in our
+ "meref" and "meintro" documents are not numeric, but symbolic,
+ and their markers occurred on lines with vertical space above
+ and below. (The bug was further masked by an otherwise
+ redundant redefinition of the `*` string inside the `)f` macro.)
+
+ * tmac/e.tmac ()f, +c): Stop redefining footnote marker string
+ `*` after updating the automatic footnote number; its
+ interpolation is already backslash-protected.
+ ()d, pd): Stop redefining delayed text marker string `#` for an
+ analogous reason.
+ (initialization): Drop unneeded `_*` and `_#` strings.
+
+ Thanks to Robert Goulding for his feedback and patience. See
+ <https://savannah.gnu.org/bugs/?61025>.
+
+2022-01-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/e_footnote-marks-work.sh: Enhance test. Confirm
+ that the automatic footnote number is reset to 1 by starting a
+ new chapter with the `+c` macro.
+
+2022-01-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [me]: Revise `n1` and `n2` interface and behavior.
+
+ There were several bugs in the previous implementation.
+
+ * tmac/e.tmac (po): Issue diagnostic if an attempt is made to
+ set the page offset to a negative value.
+
+ (n1): Accept new optional "C" argument to behave more (but not
+ exactly) like roff(1), as the formerly-recognized "c" argument
+ to `n2` did. If present, the line length is reduced by the same
+ amount (in new interface register `no`) as the line number field
+ to preserve the overall line length. Save the previous line
+ length in internal register `_l` and set a flag, stored in `?N`,
+ indicating this reduction. Otherwise, the macro expects to be
+ able to reduce the page offset to accommodate the line number.
+ If it cannot (for example, with the zero page offset default
+ used by nroff output devices), see above re: the `po` macro.
+
+ (n2): Cache the last line number that may have been output,
+ instead of the current one, so that we can operate on it
+ consistently with user expectations. Do this earlier, and
+ rename this macro-local variable from `_ln` to `_n` so that we
+ don't need groff's `do` request to operate on it. Drop
+ recognition of "c" as an optional second argument. If turning
+ off line numbering: if the line length was shortened (`?N`)
+ restore the saved value and delete `_l` register; otherwise,
+ reverse the change to the page offset. Delete `_n` register.
+
+ (initialization): Assign `\w'0000'u` to `no` register; this was
+ previously hard-coded in `n1` and `n2`. Initialize `?N` with 0.
+
+ * doc/meref.me.in (roff Support): Update to reflect interface
+ changes and describe behavior more accurately.
+
+ * doc/meref.me.in (Summary):
+ * tmac/groff_me.7.in (Registers): Document new `no` register and
+ mark it as a groff extension.
+
+ * NEWS: Add item documenting interface changes.
+
+ Fixes <https://savannah.gnu.org/bugs/?61646>. See the comments
+ in the report for a lengthy enumeration of rendering problems
+ exhibited by the previous implementation.
+
+2022-01-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [me]: Add unit test for line numbering feature.
+
+ * tmac/tests/e_line-numbering-works.sh: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2021-12-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grohtml/post-html.cpp (style::style): Add
+ initializer to argumentless constructor to avoid later read from
+ uninitialized memory in `html_printer::do_font`.
+
+ Fixes <https://savannah.gnu.org/bugs/?61748>.
+
+2021-12-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [groff]: Add regression test for Savannah #61748.
+
+ * src/roff/groff/tests/html_works_with_grn_and_eqn.sh: Do it.
+ * src/roff/groff/groff.am (groff_TESTS): Run it.
+
+2021-12-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grohtml/post-html.cpp
+ (html_printer::do_file_components): Emit fatal diagnostic if
+ we're unable to `freopen()` standard output. Quietens
+ `-Wunused-result` warning from GCC 8.3.
+
+2021-12-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grohtml/html.h (INT_HEXDIGITS): Add new constant
+ to store the maximum possible quantity of digits in the
+ hexadecimal representation of an `int`.
+
+ * src/devices/grohtml/html-text.cpp (html_text::issue_tag):
+ * src/devices/grohtml/post-html.cpp (html_printer::do_body):
+ Guard against format string overflow by large integers in RGB
+ color channel specifications; in a *printf format string, the
+ precision (like the field width) is a _minimum_. Quietens
+ `-Wformat-overflow` warnings from GCC 8.3.
+
+2021-12-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/html/pre-html.cpp (get_image_generator): Clarify
+ complex conditional expression. Quietens `-Wparentheses`
+ warning from GCC 8.3.
+
+2021-12-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [me]: Rename new `$x` register to `sx`. Since we expect the
+ user to set this register directly, it should not be named with
+ a leading '$' per the "me Reference Manual".
+
+ * tmac/e.tmac (initialization, {, }): Do it.
+
+ * tmac/groff_me.7.man:
+ * doc/meref.me.in:
+ * NEWS: Update documentation.
+
+ * doc/meintro.me.in:
+ * doc/meintro_fr.me.in:
+ * doc/meref.me.in: Sync with new register name.
+
+ See <https://savannah.gnu.org/bugs/?61025>. Thanks to Dave
+ Kemper for the discussion in
+ <https://savannah.gnu.org/bugs/?61710>.
+
+2021-12-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Slightly refactor.
+
+ * src/roff/troff/div.cpp:
+ * src/roff/troff/div.h:
+ * src/roff/troff/input.cpp: Rename variables to reduce confusion
+ between "end macros" and "end-of-input macros". Call the latter
+ "eoi" macros for brevity.
+
+2021-12-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac: Fix code style nits.
+ - Use new terminology in diagnostic. See commit 66ac1a8db9,
+ 11 December.
+ - Drop unused '&&&' annotation for macro definitions. This
+ was a BSD me(7) implementation detail wherein parts of the
+ package were broken out into module files, loaded if/when
+ their macros were called. groff me(7) is monolithic, except
+ for devtag and refer(1) support.
+ - Remove '&&' end macro when we're done using it.
+
+2021-12-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [me]: (Re-)localize strings.
+
+ * tmac/{cs,de,fr,it,sv}.tmac: Update package localizations to
+ use new resources. As a happy side effect (and with the new
+ appendix string), the `+c` macro is now localized for Czech,
+ German, and Swedish.
+
+ * doc/meintro_fr.me.in (Les Parties du Document): Update example
+ to reflect mixed-case default string used in chapter headings.
+
+ * tmac/tests/e_ld-works.sh: Add tests for localization.
+
+2021-12-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [me]: Internationalize strings.
+
+ * tmac/e.tmac (initialization): Introduce internal
+ `_mo1`..`_mo12`, `_dw1`..`_dw7`, and `_td_format` strings (with
+ English defaults). Define them outside of the new `ld` macro so
+ that they can be overridden by localization packages.
+ (ld) <dw, mo, td>: Populate via the above new strings.
+ * tmac/trans.tmac: Stop defining `mo` and `dw`. Instead, make
+ them aliases of the new strings above. Handle `wa` and `wc`
+ similarly.
+
+2021-12-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [me]: Add `ld` macro to re-init date/l10n stuff.
+
+ * tmac/e.tmac (ld): New macro updates `y2` and `y4` registers
+ and `wa`, `wc`, `mo`, `dw`, and `td` strings.
+
+ * doc/meref.me.in (Miscellaneous, Predefined Strings):
+ * tmac/groff_me.7.man (Macros): Document it.
+
+ * tmac/tests/e_ld-works.sh: Add unit test.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+ Fixes <https://savannah.gnu.org/bugs/?61670>.
+
+2021-12-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/e_chapter-titles-work.sh: Add unit test for chapter
+ heading feature.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2021-12-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac: Ease localization and customization by exposing
+ strings for "Chapter" and "Appendix" instead of hard-coding
+ these words into the `$c` macro.
+ (initialization): Define new `wa` and `wc` strings. Separate
+ these and existing localization strings from `y2` and `y4`
+ initialization since the latter don't involve natural languages.
+ ($c): Interpolate these strings in chapter and appendix headings
+ and in calls to `$C` hook macro. Set "Chapter" and "Appendix"
+ in mixed case instead of full capitals, and set one
+ adjustable nonbreaking word space `\~` between them and the
+ chapter number instead of two unadjustable nonbreaking spaces.
+ {These changes do slightly alter the default output of the
+ package when the `+c` macro is used.}
+
+ * doc/meref.me.in (Predefined Strings):
+ * tmac/groff_me.7.man (Strings): Document new strings.
+
+ * doc/meintro.me.in (Parts of the Basic Paper): Update example
+ to reflect mixed-case default string.
+
+ Fixes <https://savannah.gnu.org/bugs/?61661>.
+
+2021-12-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac (@p): Deactivate right alignment (the effect of
+ groff's `rj` request) when starting a new paragraph.
+ * doc/meref.me.in (Paragraphing) <lp>: Document this.
+
+2021-12-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac ()c): Add bounds check to avoid attempting to set
+ a negative indentation, provoking a troff warning. Problem
+ exposed by formatting "meintro_fr.me" document with default
+ nroff mode line length.
+
+2021-12-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Slightly refactor (boolify).
+
+ * src/roff/troff/div.cpp:
+ * src/roff/troff/div.h:
+ * src/roff/troff/env.cpp:
+ * src/roff/troff/input.cpp: Rename variables and demote from
+ `int` to `bool`. Initialize and assign them using Boolean
+ literals. The new names try harder to express a logical
+ predicate, and start with verbs to resist interpretation as
+ noun phrases.
+ - exit_started -> is_exit_underway
+ - done_end_macro -> is_end_macro_finished
+ - seen_last_page_ejector (demoted but not renamed)
+ - began_page_in_end_macro (demoted but not renamed)
+
+2021-12-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac: Explain presence of undocumented `$r` and `$R`
+ registers.
+
+ Fixes <https://savannah.gnu.org/bugs/?61683>.
+
+2021-12-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac (bc): To get to the next column, space by the page
+ length `.p`, not by the distance to the next trap (or 24 inches,
+ as hard-coded in me(7) traditionally). It is up to any sprung
+ traps to issue further space requests or otherwise ensure a
+ transition to the next column.
+
+ See <https://savannah.gnu.org/bugs/?55081> for discussion.
+
+2021-12-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac ({): Fix missing scaling unit in arithmetic
+ expression: broke footnotes in troff mode. Problem introduced
+ by me in commit 6eafd208, 16 December. Thanks to Robert
+ Goulding for the (informal) report.
+
+2021-12-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (doc/{pic,webpage}.html): Quieten build. Stop
+ passing `-p` (progress) option to postprocessor, which produces
+ TeX-like bracketed page numbers when images occur.
+
+2021-12-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (.ms.html): Drop unused suffix rule.
+
+2021-12-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tmac.am (tmac_XFAIL_TESTS): Mark test
+ "e_footnotes-work-with-columns.sh" as expected to fail (as it
+ does now, consequent to a reverted commit).
+
+2021-12-16 Dave Kemper <saint.snit@gmail.com>
+
+ * man/groff_tmac.5.man: Fix minor errors.
+
+ Fixes <https://savannah.gnu.org/bugs/?61633>.
+
+2021-12-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Parameterize line height adjustment when super/subscripting.
+
+ * tmac/e.tmac (initialization): Assign 0.2m to register `$x`.2m.
+ ({, <}: Apply adjustment, multiplied by -1 for superscripts.
+
+ * doc/meref.me.in:
+ * tmac/groff_me.7.man: Document it.
+
+ * NEWS: Add item.
+
+ * doc/meintro.me.in:
+ * doc/meintro_fr.me.in:
+ * doc/meref.me.in: Forego extra line height for more attractive
+ typesetting.
+
+ Fixes <https://savannah.gnu.org/bugs/?61025>. Thanks to Robert
+ Goulding for the suggestion.
+
+2021-12-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac ($c): Draw the footnote separator no wider than
+ the column width.
+
+ Fixes <https://savannah.gnu.org/bugs/?61675>.
+
+2021-12-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac (2c): Accept an empty first argument, permitting
+ the number of columns to be specified but preserving the default
+ column separation.
+
+ Fixes <https://savannah.gnu.org/bugs/?61671>.
+
+2021-12-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac (initialization): Initialize `$C` hook, preventing
+ `mac` warnings from troff(1) if chapter title feature is used.
+
+2021-12-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac (i, bi): Add italic corrections.
+
+2021-12-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac: Fix groff warnings and correctness issue.
+ (n2): Prefix `ie` request with `do` because it uses the groff
+ `\B` escape sequence. Use braces to group multiple requests
+ after an `el` request: `ie` and `el` count as two requests, not
+ one. Add comment regarding the unfortunate choice of brace
+ style given *roff's syntactical constraints.
+ (n2, (c): Conceal bare tab in request argument list (exposed by
+ no longer stripping the macro file).
+
+2021-12-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [me]: Revise diagnostic messages to follow GNU Coding Standards,
+ identifying what is emitting them.
+
+ * tmac/e.tmac (_e): New string holds "e.tmac".
+ (@err): New macro constructs and issues diagnostics. Add file
+ name to messages when available. Suppress line number when
+ unavailable.
+ (check_page_length, @z, @h, n2, sk, @p, @(, @), (c, )c, EQ, (f,
+ ++, @U): Call `@err` instead of invoking `tm` request. Revise
+ wording of messages in an attempt at clarity.
+
+ Continues the long process of fixing Savannah #52463.
+
+2021-12-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac: Slightly refactor footnote numbering.
+ ()f): Tighten code style and end string definition with comment.
+ (+c, initialization): Drop unused auto-incrementation of
+ footnote number register `$f`. Add new string `_*` to use when
+ {re-}initializing `*` outside of a footnote diversion, and
+ interpolate the footnote number register instead of a literal.
+
+2021-12-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/e_footnote-marks-work.sh: Add unit test.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2021-12-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac: Fix automatic numbering of delayed text.
+ (initialization): Add `_#` string for use in multiple
+ assignments of `#` string.
+ (initialization, pd): Remove unused auto-incrementation from
+ `$d` delayed text number register.
+ ()d): Increment `$d` register unconditionally, no longer
+ conditionally on whether the delayed text marker string `#` has
+ been interpolated.
+ ()d, pd): Update `#` string using new `_#` string. Stop
+ initializing the string with `\k` mark-setting escape sequence.
+
+ * doc/meref.me (Annotations) <)d>: Document now-unconditional
+ incrementation of `$d` register.
+
+ Fixes <https://savannah.gnu.org/bugs/?61632>.
+
+2021-12-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/e_delayed-text-marks-work.sh: Add test.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2021-12-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac: Rename internal register out of user name space.
+ (@f): Rename `VL` to `__`; remove it immediately after using it.
+
+2021-12-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/meref.me: Fix documentation error; the `$s` macro draws a
+ horizontal line of 2 inches' length, not 1.5 inches.
+
+ Fixes <https://savannah.gnu.org/bugs/?58682>. Thanks to Dave
+ Kemper for the report.
+
+2021-12-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Generate me(7) manual sources as part of the build. We had been
+ shipping 'me' sources with the string '@VERSION@' in them and
+ only sed-replacing that to produce generated PostScript, but
+ this replacement was not occurring for users who processed the
+ documents themselves.
+
+ * doc/meintro.me:
+ * doc/meintro_fr.me:
+ * doc/meref.me: Rename these to...
+ * doc/meintro.me.in:
+ * doc/meintro_fr.me.in:
+ * doc/meref.me.in: ...these.
+
+ * doc/doc.am (DOCFILES): Add the new *.in files. Move the *.me
+ files from here...
+ (GENERATEDDOCFILES): ...to this new variable.
+ (dist_otherdoc_DATA, EXTRA_DIST): Add `$(GENERATEDDOCFILES)`.
+ (doc/me{intro{,_fr},ref}.me): Add new target rules.
+
+ * src/utils/grog/tests/smoke-test.sh: Update test to look for
+ the above source tree documents under their new names.
+
+2021-12-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (.me.txt, .ms.txt): Drop unused suffix rules.
+
+2021-12-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (DOC_SED): Add substitution of command prefix
+ {"@g@"} so we can make accurate reference to groff commands with
+ Unix counterparts in our documentation.
+
+2021-12-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac: Add nroff mode string definitions for 4.4BSD
+ compatibility.
+ - Define '{' and '}' (superscripting) strings as '[' and ']'.
+ - Define '<' and '>' (subscripting) strings as '\(la and
+ '\(ra' if available on the device, otherwise '<' and '>'.
+
+ * tmac/tests/e_footnote-marks-work.sh: Update expected output.
+
+ * doc/meref.me: Document it.
+
+ Fixes <https://savannah.gnu.org/bugs/?61619>.
+
+2021-12-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (doc/meintro_fr.ps): Add target rule (overriding
+ suffix rule) to generate this file using `-mfr` (load the French
+ localization macro file).
+
+2021-11-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Drop redundant `do_divert()` declaration.
+
+ * src/roff/troff/env.h: Do it.
+
+ Fixes <https://savannah.gnu.org/bugs/?61433>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2021-11-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Remove `DEBUGGING` preprocessor cruft.
+
+ * src/roff/troff/input.cpp:
+ * src/roff/troff/mtsm.cpp: Stop defining `DEBUGGING`
+ preprocessor macro (as empty).
+
+ * src/roff/troff/input.cpp: Give `DEBUG_OPTION` an empty string
+ value if the former is undefined, so the `getopt_long()` call
+ will compile.
+
+ Fixes <https://savannah.gnu.org/bugs/?61436>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2021-11-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Slightly refactor table format column modifier `p` and
+ `v` validation.
+
+ * src/preproc/tbl/main.cpp (process_format): Make code terser by
+ introducing references to `list->point_size` and
+ `list->vertical_spacing`. Doing this requires a new scope
+ {because a switch case isn't one} so add it, without updating
+ indentation for this commit. When complaining of out-of-range
+ type size or vertical spacing, report the limit.
+
+2021-11-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Improve diagnostic messages.
+
+ Revise diagnostic messages generally to use terminology
+ consistent with the recent rewrite of tbl(1), identify a
+ contextual token when possible, and communicate more helpfully.
+
+ * src/preproc/tbl/main.cpp (process_options): Tell the user
+ which region option is missing a closing parenthesis or cannot
+ accept an empty argument. Refer to region options as such, not
+ simply "options" (so they can't be confused with command-line
+ options). Say that input is "invalid" instead of "bad".
+ (process_format): Say "table format specification" instead of
+ just "format". Say "column classifier" instead of "format".
+ When a column modifier is missing an argument or a closing
+ parenthesis, identify it and refer to it as a "column modifier"
+ instead of omitting context. Inform user that arguments to `p`
+ and `v` column modifiers must be "(optionally signed) integer"s,
+ not "numbers", lower these diagnostics' levels from error to
+ warning, and indicate that the modifier is ignored. Clarify
+ diagnostic when extra characters trail `.` at the end of a table
+ format line.
+ (process_data): Say "table entry" instead of "data entry" when
+ discarding an excess one.
+ (process_table): Say we're giving up on "this table region", not
+ this "table", particularly since any table continuations (.T&)
+ are ignored.
+
+2021-11-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Fix call to `getopt_long()`.
+
+ * src/preproc/tbl/main.cpp (main): Stop telling `getopt_long()`
+ to look for a `T` option. Continues b4bbf32e, 16 October 2020.
+
+2021-11-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Tweak usage message.
+
+ * src/preproc/tbl/main.cpp (usage): Document `--version`. Give
+ version retrieval mode separate synopsis. Use more normative
+ synopsis syntax.
+
+2021-11-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Fix code style nits.
+
+ * src/preproc/tbl/main.cpp (process_input_file)
+ (entry_format::debug_print, process_data, main): Replace
+ `assert(0)` calls with communicative predicates.
+ (struct input_entry_format, input_entry_format::debug_print,
+ process_format): Boolify. Demote and rename `int`s
+ `last_column` and `equal` to `bool`s named `is_last_column` and
+ `is_equal_width`. Assign them Boolean literals.
+ (process_format): Boolify. Demote `have_expand`, `got_format`,
+ and `got_period` from `int` to `bool`. Use Boolean literals in
+ assignments thereto.
+ (process_options): Swap order of null pointer comparison when a
+ typo or thinko could lead to lvalue assignment.
+ (process_data): Boolify. Demote `give_up` from `int` to `bool`.
+ Demote and rename `int` `row_comment` to `bool`
+ `seen_row_comment`. Use Boolean literals in assignments
+ thereto.
+ (main): Use standard C library symbols `EXIT_SUCCESS` and
+ `EXIT_FAILURE` with `exit()` calls instead of `0` and `1`.
+
+2021-11-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grog]: Fix Savannah #61520.
+
+ * src/utils/grog/grog.pl: Move hash `preprocessor_for_macro` to
+ global scope since it is now mutable across `do_line` subroutine
+ calls.
+ (do_line): Adjust regex matching an end macro to work better.
+ Check names of macros being defined by the document; if they
+ start with '[' or ']', stop attempting to detect refer(1) usage,
+ by deleting its key from the `preprocessor_for_macro` hash.
+
+ Fixes <https://savannah.gnu.org/bugs/?61520>.
+
+2021-11-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grog]: Add regression test for Savannah #61520.
+
+ * src/utils/grog/tests/avoid-refer-fakeout.sh: Do it.
+ * src/utils/grog/grog.am (grog_TESTS): Run test.
+
+2021-11-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Page Motions):
+ * man/groff.7.man (Escape short reference): Fix error: the `\r`,
+ `\u`, and `\d` escape sequences move in ems, not vees, despite
+ being vertical motions. Add discussion and example. Thanks to
+ Bjarni Ingi Gislason for pointing out the problem in groff(7)
+ and Tadziu Hoffman for his lucid explanation.
+
+ Fixes <https://savannah.gnu.org/bugs/?61437>. Thanks to Bjarni
+ Ingi Gislason for the report and a suggested patch.
+
+2021-11-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/include/error.h: Drop `extern` storage class from
+ diagnostic function prototypes. Drop parameter names from
+ prototypes, in keeping with the Stroustrup-style C++ used in
+ most of groff.
+
+2021-11-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libgroff/font.cpp (font::load): Update diagnostic
+ messages to say "kerning pair" instead of "kern pair".
+
+2021-11-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (read_size): Update diagnostic
+ messages to use more normative language: say "type size" instead
+ of "point-size", and "escape sequence" instead of "escape".
+ * src/roff/groff/tests/\
+ use_point_size_escape_with_single_digit_arg.sh: Update expected
+ diagnostic wording in text.
+
+2021-11-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (read_size): Boolify. Update
+ prototype. Demote return type from `int` to `bool`. Use
+ Boolean literals for return values. Similarly demote local
+ variable, rename it from `bad_digit` to
+ `contains_invalid_digit`, and use Boolean literals with it.
+
+2021-11-16 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ * src/devices/gropdf/gropdf.pl: Fixes to importing pdf versions
+ > 1.4.
+
+2021-11-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: If "nowarn", suppress table row warning.
+
+ * src/preproc/tbl/table.cpp (table::init_output): Bracket the
+ generated groff code that emits a warning if a table row
+ overruns a page location trap (usually, is too long to
+ vertically fit on the page) in a test for whether the "nowarn"
+ region option was given, so that this warning is suppressed as
+ well when that option is used.
+ * src/preproc/tbl/tbl.1.man (Region options): Document new
+ "nowarn" behavior.
+
+ {"nokeep" also suppresses this warning, for a different reason;
+ no diversion is created to hold the table row, so its vertical
+ size does not exist to be compared to the distance to the next
+ page trap.}
+
+ Fixes <https://savannah.gnu.org/bugs/?61477>.
+
+2021-11-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/table.cpp (table::do_vspan): Fix code style
+ nits. Swap order of null pointer and zero equality comparisons
+ when a typo or thinko could lead to lvalue assignment. Break a
+ series of 6 and-ed assertion predicates into separate `assert()`
+ calls--sure to be less maddening for anyone who has to debug
+ such a contingency. Clarify comment since C++98 didn't yet have
+ `nullptr`.
+
+2021-11-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [m4]: Clean up shell variable quoting and bracing.
+
+ * m4/groff.m4 (GROFF_PROG_YACC, GROFF_MAKEINFO)
+ (GROFF_BROKEN_SPOOLER_FLAGS, GROFF_TARGET_PATH_SEPARATOR): Stop
+ bracing shell variable expansions that don't require it; the
+ shell is not make(1).
+ (GROFF_PROG_YACC, GROFF_MAKEINFO): Double-quote shell variable
+ expansions that might produce whitespace.
+ (GROFF_MAKEINFO): Drop unnecessary leading zeroes from version
+ number component construction. Drop unnecessary escaping of
+ plus sign in expr(1) input.
+
+2021-11-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [m4]: Clean up test(1) usage.
+
+ Get rid of string (non-)nullity tests and comparisons involving
+ concatenation with garbage (usually "x"). Even the GNU Autoconf
+ manual's shell portability material doesn't recommend this. It
+ must be either a bodge cooked up by shell programmers who
+ couldn't remember to quote variable expansions, or a workaround
+ for shells of such poor quality that they defied the odds and
+ decayed out of usage or got fixed.
+
+ Instead, use double quotes (only where necessary). Test for
+ non-empty strings with "test -n" and empty strings with "test
+ -z". Stop quoting literal comparands that obviously have no
+ shell metacharacters in them.
+
+ * m4/groff.m4 (GROFF_PRINT, GROFF_PROG_YACC, GROFF_PERL)
+ (GROFF_DOC_CHECK, GROFF_MAKEINFO, GROFF_TEXI2DVI)
+ (GROFF_HTML_PROGRAMS, GROFF_PDFDOC_PROGRAMS, GROFF_PAGE)
+ (GROFF_TMAC, GROFF_WITH_COMPATIBILITY_WRAPPERS, GROFF_X11)
+ (GROFF_APPRESDIR_DEFAULT, GROFF_APPRESDIR_CHECK)
+ (GROFF_HAVE_TEST_EF_OPTION, GROFF_BASH, GROFF_UCHARDET)
+ (GROFF_UCHARDET_CHECK, GROFF_PDFTOOLS)
+ (GROFF_USE_GROFF_ALLOCATOR): Do it.
+
+2021-11-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_TEXI2DVI): Add dependency on
+ `GROFF_MAKEINFO` macro. Rewrite to also test `MAKEINFO`
+ variable, which is empty if the `makeinfo` command is not
+ installed or too old. Consequently ignore `texi2dvi` if is too
+ old without having to do a version check (since it and
+ `makeinfo` are distributed together, both being part of GNU
+ Texinfo).
+
+ * doc/doc.am (.texi.dvi, .texi.pdf): Update error message to
+ indicate that `texi2dvi` is _either_ missing or too old.
+
+2021-11-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_MAKEINFO): Stop throwing a warning if the
+ installed `makeinfo` is old but the distributed Info manual is
+ up to date. This is not a configure-time problem; the user will
+ be notified when they run 'make' if they modify doc/groff.texi,
+ or if they run 'make doc' (which has required a TeX installation
+ for years). Empty the `MAKEINFO` variable immediately if a
+ too-old version is detected. Drop needless `AC_SUBST`itution of
+ the detected `makeinfo` version.
+
+2021-11-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_HTML_PROGRAMS): Clarify message; it is only
+ groff-generated HTML that is disabled by the absence of the
+ programs checked for. (`makeinfo` can still generate our
+ Texinfo manual in HTML format.)
+
+2021-11-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [build]: Drop `BUILD_INFODOC` symbol. Ship manual in GNU Info,
+ text, and HTML forms in distribution archive.
+
+ * Makefile.am (MAINTAINERCLEANFILES): Initialize.
+ (MOSTLYCLEANADD): Drop unused variable.
+ * configure.ac: Drop `AM_CONDITIONAL([BUILD_INFODOC]...`.
+ * doc/doc.am (EXTRA_DIST): Rearrange shipment of our Texinfo
+ manual source files to precede all of the generated forms, for
+ clarity. Drop all `BUILD_INFODOC` conditionals. Make
+ `build_infodoc` phony target depend on plain text, GNU Info, and
+ HTML forms of Texinfo manual unconditionally. Also drop unused
+ variables `groffinfodir`, `groffpdfdir`, and `texi2dvi_missing`.
+ (EXTRA_DIST, MAINTAINERCLEANFILES): Add Info form of manual.
+ Drop glob pattern attempting to match the segments that
+ `makeinfo` breaks it into. It isn't necessary for
+ MAINTAINERCLEANFILES.
+ (EXTRA_DIST, MAINTAINERCLEANFILES): Add text form of manual.
+ (EXTRA_DIST, MAINTAINERCLEANFILES): Add HTML form of manual.
+ (dist-hook): Depend on new (phony) target `dist-info-bits`.
+ (dist-info-bits): Look for the info document in the build
+ directory, then the source directory. (It could be in either
+ place depending on whether the build from a Git working tree is
+ being done in or out of a separate build directory.) When
+ found, copy the segments to the assembly area for the
+ distribution archive.
+ (install_infodoc): Refactor. Remove any groff info files from
+ the destination info directory using a shell glob directly
+ instead of a partly redundant ls(1) command substitution.
+ Similarly, use a shell glob to cp(1) the info files (including
+ any matched segments) to the destination info directory before
+ running `install-info`. (In this process I learned that
+ `install-info` doesn't "install" anything; instead, it
+ {de-}registers info files with their top-level catalog.)
+
+2021-11-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (.texi.txt, .texi.html): Reorder pattern rules to
+ make it clearer which formats require only `makeinfo` and which
+ require `texi2dvi`. The latter imposes more build dependencies,
+ including a full TeX installation.
+
+2021-11-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mom]: Build more quietly.
+
+ * contrib/mom/mom.am (penguin.{ps,.pdf}): Make targets quiet by
+ default; they are simple file copies.
+
+2021-11-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tests]: Revise a test's setup.
+
+ * src/roff/groff/tests/fp_should_not_traverse_directories.sh:
+ Revise search for device/font description directory to work in
+ within-source-tree builds and (for now) with the approach used
+ by Automake's "distcheck" target.
+
+2021-11-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Accept `\&` as an empty table entry.
+
+ * src/preproc/tbl/table.cpp (table::add_entry): Suppress
+ diagnostic about non-empty table entries classified as `_` or
+ `=` if the entry consists of exactly `\&`.
+
+ * src/preproc/tbl/tbl.1.man (Table data): Document this idiom.
+
+2021-11-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Update diagnostic messages.
+
+ * src/preproc/tbl/main.cpp (process_options, process_format):
+ * src/preproc/tbl/table.cpp (table::add_entry): Align diagnostic
+ text with terminology now used in tbl(1) man page.
+ - "global option" -> "region option"
+ - "specifier" -> "column modifier"
+ - "format" -> "column classifier"
+
+2021-11-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Fix missing colon in diagnostic messages.
+
+ * src/libs/libgroff/error.cpp (do_error_with_file_and_line):
+ Restore missing colon to diagnostic text. Problem introduced by
+ me in commit 9a038161, 8 November.
+
+2021-11-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff,grops]: Slightly refactor.
+
+ * src/devices/grops/ps.cpp: Explicitly preprocessor-include
+ "lib.h" since we use the `PI` symbol it defines.
+
+ * src/include/lib.h: Add inclusion guard. Wrap only `extern "C"
+ and its braces in preprocessor conditionals, so that prototypes
+ are present in the header even for C language code that
+ #includes this header. Add `static` storage class to `PI`
+ symbol to avoid redefinition errors from the linker.
+
+ * src/libs/libgroff/iftoa.c (if_to_a):
+ * src/libs/libgroff/itoa.c (i_to_a, ui_to_a): Add `const` type
+ qualifier to function definitions for agreement with prototypes
+ in "lib.h". Drop local copies of prototypes.
+
+2021-11-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Centralize definitions of {U,}INT_DIGITS.
+
+ * src/libs/libgroff/iftoa.c:
+ * src/libs/libgroff/itoa.c: Move definitions of `INT_DIGITS` and
+ `UINT_DIGITS` from here...
+ * src/include/lib.h: ...to here.
+
+ * src/libs/libgroff/iftoa.c:
+ * src/libs/libgroff/itoa.c: Preprocessor-include "lib.h". This
+ revealed missing guards around `extern "C"` declarations, so...
+
+ * src/include/lib.h: Add them where necessary.
+
+2021-11-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac (OP): Fix code style nits. Don't quote macro
+ arguments unnecessarily. Use consistent backslashing. Use
+ groff font escape sequence syntax. Use adjustable non-breaking
+ space escape sequence instead of a non-adjustable one.
+ Parenthesize numeric expression for better readability.
+
+2021-11-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Make allocator replacement optional. Switch it
+ off by default, relying on C++ runtime new/delete support.
+
+ * configure.ac: Call new `GROFF_USE_GROFF_ALLOCATOR` m4 macro.
+ Use `AM_CONDITIONAL` to set Automake variable
+ `USE_GROFF_ALLOCATOR` if appropriate. Report whether the
+ allocator is used in configure script output summary.
+ * m4/groff.m4 (GROFF_USE_GROFF_ALLOCATOR): Define new macro to
+ collect user preference. The default is off.
+ * src/libs/libgroff/libgroff.am (libgroff_a_SOURCES): Build and
+ link new.cpp only if we are to `USE_GROFF_ALLOCATOR`.
+
+ * NEWS: Add item.
+
+2021-11-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_TMAC): Report a human-readable message if
+ no system tmac prefix is found, instead of leaving the ellipsis
+ hanging.
+
+2021-11-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_TMAC): Use separate shell variable for
+ `AC_MSG_RESULT()` content since the human-readable string we
+ populate it with in the empty case is not appropriate for later
+ `AC_SUBST()`-itution. Problem introduced by me in commit
+ 19670348, 31 October.
+
+2021-11-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tmac.am (MOSTLYCLEANFILES): Remove `$(TMACMDOCFILES)`.
+ This variable, formerly named `TMACMDOCSTRIPFILES`, should not
+ be used in a clean target because its contents are (no longer)
+ generated files. Problem introduced by me in commit 24602f42, 4
+ July (only noticeable in within-source-tree builds).
+
+2021-11-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff,pic]: Check `strdup()` return value.
+
+ * src/libs/libgroff/font.cpp (struct text_file): Add `fatal()`
+ member function.
+ (text_file::fatal): Implement it.
+
+ * src/libs/libgroff/font.cpp (font::load_desc):
+ * src/preproc/pic/troff.cpp (troff_output::set_location): Die if
+ `strdup()` returned a null pointer.
+
+2021-11-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libgroff/error.cpp (do_error_with_file_and_line):
+ Revise to eliminate `fprintf()` calls, which might perform
+ dynamic memory allocation, rendering this function unsafe to
+ call after memory allocation failures. Since this function is
+ near the top of our diagnostic output call stack, that would be
+ unfortunate. `errprint()` does not use dynamic allocation, nor
+ do the `i_to_a()` and `ui_to_a()` functions it calls to format
+ integers.
+
+2021-11-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * configure.ac: Add `strdup` to AC_CHECK_FUNCS since we are
+ using it and the whole point of libgroff's `strsave()` was to
+ get along without it. But `strdup` has been standardized in
+ POSIX for 20 years (SUSv3, POSIX:2001) and is on its way into
+ ISO standard C (N2353) and C++ (P2391R0) as well.
+
+2021-11-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libgroff/strsave.cpp (strsave): Call `strcpy()` only
+ if `malloc()` did not return a null pointer. Problem noted by
+ Ingo Schwarze.
+
+2021-11-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libgroff/fontfile.cpp (font::open_file): Don't open
+ user-specified font file names with slashes in them; i.e., don't
+ traverse directories outside the configured font path. Also
+ refuse to open the file if the `sprintf()` used to construct its
+ file name doesn't write the expected quantity of bytes to the
+ destination buffer.
+
+ Fixes <https://savannah.gnu.org/bugs/?61424>. Thanks to Ingo
+ Schwarze for feedback.
+
+2021-11-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Regression-test Savannah #61424.
+
+ * src/roff/groff/tests/fp_should_not_traverse_directories.sh: Do
+ it.
+ * src/roff/groff/tests/artifacts/HONEYPOT: Add test artifact.
+ * src/roff/groff/tests/artifacts/devascii/README: ...and this;
+ we need a directory to make the test work but empty ones tend to
+ look unintentional.
+ * src/roff/groff/groff.am (groff_TESTS): Run test.
+ (EXTRA_DIST): Ship artifacts.
+
+2021-11-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Fix diagnostic error wording.
+
+ * src/libs/libgroff/font.cpp (font::load): Fix diagnostic
+ message; this is issued when an unrecognized directive is
+ encountered, so it necessarily occurs _before_ any `charset` or
+ `kernpairs` directive. Give the user a hint accordingly.
+
+2021-11-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Fix paragraph tag regressions.
+
+ * tmac/an-ext.mac (UR, MR): Only create an environment and
+ diversion if we're not already in one of the latter. If we are
+ {in groff man, this occurs only when collecting a `TP` paragraph
+ tag}, then typeset the URI as part of the indented paragraph.
+ (UE, ME): Pop the diversion and environment stacks only if we
+ pushed them in the first place. Eliminate spurious space in
+ post-URI arguments by only typesetting excess macro parameters
+ if there were any.
+
+2021-11-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Regression-test Savannah #61425.
+
+ * tmac/tests/an-ext_link-macros-work-in-paragraph-tags.sh: Do
+ it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2021-11-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac (DS): Drop a redundant unconditional break; every
+ display macro we call in the event of a valid call already
+ breaks the line, and it's polite to not break if we're given an
+ invalid argument. Emit a diagnostic error if the argument we're
+ given is invalid, and immediately end the diversion we just
+ opened.
+
+2021-11-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/env.cpp (environment::set_font): Clarify
+ diagnostic warning.
+
+2021-11-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/table.cpp (table::add_entry): If we see a '\^'
+ entry on the first row of a table, it's invalid, but we need to
+ create an empty entry in its place. Otherwise, someone can put
+ another '\^' right below the one on the first row, creating a
+ reference to a nonexistent table entry and provoking a SEGV.
+ Issue an error diagnostic (distinct from the one in
+ `do_vspan()`), create the entry, and skip `do_vspan()` (given a
+ '^' in a first-row definition, it issues an error diagnostic and
+ returns early, which suffices). Problem appears to date back to
+ groff 1.02 (June 1991) at the latest.
+
+ Fixes <https://savannah.gnu.org/bugs/?61417>.
+
+2021-11-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Regression-test Savannah #61417.
+
+ * src/preproc/tbl/tests/\
+ do-not-segv-on-invalid-vertical-span-entry.sh: Do it.
+ * src/preproc/tbl/tbl.am (tbl_TESTS): Run test.
+
+2021-11-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Fix Savannah #61408.
+
+ * tmac/an.tmac (an-prepare-inner-footer): Don't try to get a
+ substring of an empty string; the man page author might not have
+ specified a third argument to `TH` (or supplied an empty one).
+
+ Fixes <https://savannah.gnu.org/bugs/?61408>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2021-11-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Add regression test for Savannah #61408.
+
+ * tmac/tests/an_inner-footer-abbreviation-works.sh: Do it.
+
+2021-11-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Tweak computation in URI breaking.
+
+ * tmac/an-ext.tmac (UE, ME): Stop adding the page offset `.o`
+ when performing the available horizontal space computation for
+ the typeset URI string. This made no difference on nroff
+ devices (grotty; even with `.po 15n`), but it caused the
+ breaking decision to be too conservative on troff devices
+ {grops}, forcing some URIs that would fit on the current line to
+ the next one.
+
+ * tmac/tests/an-ext_UE-breaks-before-long-URIs.sh: Add test of
+ URI with no link text, which also has break points after every
+ character, so that we detect even slight alterations.
+
+2021-11-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Do more device and font description file validation,
+ resolve an assertion failure arising from a negative declared
+ device resolution, and correct a documentation error.
+
+ * src/libs/libgroff/font.cpp (font::load): Include more
+ information about invalid input in diagnostic messages.
+ - When a kern pair's amount is missing or invalid, report the
+ name of the kern pair.
+ - When someone tries to declare the first entry in the charset
+ section as an alias, report the glyph name.
+ - Identify the token for the unnamed character if an attempt
+ is made to alias it.
+ - When an out-of-range character type is applied to a glyph,
+ name the glyph.
+ (font::load_desc): Same.
+ - Drop redundant zero initialization of `res`.
+ - Check all directives that take basic units for positive
+ values, adding `res`, `unitwidth`, `paperwidth`, and
+ `paperlength`. Update this diagnostic to demand positive,
+ not nonnegative, values.
+ - When the font count is long in a `fonts` directive, report
+ how many font names were declared (and thus expected). (If
+ the count is short, the next line is read for a font name,
+ like 'tcommand' in our devutf8/DESC.)
+ - When interpreting a `papersize` directive, throw an error
+ and return false if `res` has not yet been encountered,
+ since it is used in subsequent computations.
+ - When a paper format cannot be determined, report the
+ original declared value from the DESC file. Use `strdup()`
+ to save it since it gets clobbered by the resolving process.
+ `free()` the saved string when we're done, regardless of
+ error condition.
+
+ * doc/groff.texi (Device and Font Files):
+ * man/groff_font.5.man (DESC file format): Document additional
+ exception to order-indifference of directives: (at least one)
+ `res` must precede `papersize`.
+
+ Fixes <https://savannah.gnu.org/bugs/?61414>.
+
+2021-11-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grohtml/post-html.cpp
+ (html_printer::do_file_components): Add assertion.
+
+2021-11-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grops/ps.cpp (usage): Document -p and --version
+ options.
+
+2021-10-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-nroff (doc-setup-page-layout): Set the title
+ length to the device line length (register `.l`) if register
+ `LT` is not defined. This keeps the title length from being set
+ to 78n when the line length is not, preventing the output from
+ looking silly.
+
+2021-10-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/main.cpp (main): Emit groff code to define
+ macro `T&` as empty if it is not already defined. (All of our
+ full-service macro packages [except mdoc(7)] already do this, so
+ there's no change in semantics; mom(7) even defines it as an
+ empty _string_.)
+
+2021-10-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/tests/string_case_xform_requests.sh: Migrate
+ test to POSIX shell, dropping use of process substitution (a
+ Bashism). Also rewrite to stop using a here document within a
+ command substitution, mainly for paranoia.
+
+ * src/roff/groff/tests/string_case_xform_requests.sh:
+ * src/roff/groff/tests/on_latin1_device_oq_is_0x27.sh: Update
+ shebang lines to use /bin/sh as the interpreter.
+
+2021-10-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grops/ps.cpp (encode_subfont): Update assertion to
+ check for `sub` parameter being a null pointer rather than
+ `sub->glyphs`; the latter is a member array of a `subencoding`
+ struct so it can't be a null pointer. (`glyphs` is an array of
+ pointers to `const char`; the _elements_ of the array can [and
+ are initialized to] be null pointers, but the address of the
+ array itself will never be in a C/C++ implementation.) Detected
+ by Clang 13's "-Wtautological-pointer-compare".
+
+2021-10-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libgroff/new.cpp (delete): Declare `throw()` (no
+ exceptions thrown); quiets "-Wimplicit-exception-spec-mismatch"
+ from Clang 13.
+
+2021-10-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4: Fix messaging nits.
+ (GROFF_MAKEINFO): Set `missing` to "missing 'makeinfo'" for
+ consistency with other assignments to `missing`.
+ (GROFF_TMAC): Utter an intelligible result in the configure
+ check when no system macro files requiring groff wrapping are
+ located.
+
+2021-10-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Handle special character escape sequences that map to
+ basic Latin glyphs in device control escape sequences
+ consistently among output devices.
+
+ * src/roff/troff/input.cpp (encode_char): Rearrange
+ conditionals. This is the logic that puts the "whatever" within
+ a \X'whatever' escape sequence into GNU troff's intermediate
+ output. Handle adjustable and nonadjustable space escape
+ sequences ("\~" and \ ") first. Then, if the token is a special
+ character escape sequence, retrieve its "contents" (glyph name).
+ Move the basic Latin mapping for the seven glyph names '-',
+ 'aq', 'dq', 'ga', 'ha', 'rs', and 'ti' here, before checking
+ whether the device description issued the
+ 'use_charnames_in_special' directive. This way, the 'html' and
+ 'xhtml' output devices can straightforwardly embed these basic
+ Latin characters in device control escapes (notably, "html:",
+ for which the present convention is to follow the this tag
+ immediately with a literal HTML URI, complete with `<a href>`
+ element syntax). If the special character is none of these and
+ we should 'use_charnames_in_special', proceed as groff 1.22.4
+ and earlier did. This is a behavior change, as was my addition
+ of this translation mechanism in the first place, so...
+
+ * doc/groff.texi (Postprocessor Access): Document it.
+
+ * src/roff/groff/tests/\
+ device_control_escapes_express_basic_latin.sh: Test it.
+ * src/roff/groff/groff.am (groff_TESTS): Run test.
+
+ Fixes <https://savannah.gnu.org/bugs/?61401>.
+
+2021-10-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Map \[ti] correctly in device control escape sequences.
+
+ * src/roff/troff/input.cpp (encode_char): Fix copy-and-paste
+ error. \[ti] should put '~', not '^', into a device control
+ command.
+
+ Fixes <https://savannah.gnu.org/bugs/?61403>; problem introduced
+ by me in commit 9d61b3d1, 1 October.
+
+2021-10-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Handle degenerate input quietly.
+
+ * tmac/an.tmac (TH): Define new register `an-TH-was-called`.
+ (an-end): Return immediately if that register is not defined;
+ to format the default page footer we must have the information
+ declared in a valid `TH` call. (`TH` also initializes the type
+ size and baseline spacing registers we use to prepare the page
+ footer environment.) If the register _is_ defined, remove it
+ just prior to the end of this macro definition, in preparation
+ for next page to be rendered.
+
+ * tmac/tests/an_handle-degenerate-input-quietly.sh: Test it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+ Fixes <https://savannah.gnu.org/bugs/61402>, a regression from
+ groff 1.22.4 (problem introduced by me in the course of many
+ changes to trap management and header/footer handling to work
+ nicely in batch rendering with -mandoc and mdoc(7) documents).
+
+2021-10-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Warn if `TE` table macro called but `TW` register (set by
+ tbl(1)) undefined. Arrange it so that we warn only once per
+ man(7) document, not per table region.
+
+ * tmac/an.tmac (TH): Remove `TW` register when processing new
+ document and clear `an-was-tbl-failure-reported` register.
+ (TE): Check `TW` and `an-was-tbl-failure-reported` registers; if
+ the former is undefined and the latter false, emit the message
+ and set `an-was-tbl-failure-reported`.
+
+ Addresses part of <https://savannah.gnu.org/bugs/?61379>.
+ Thanks to Bjarni Ingi Gislason for the suggestion.
+
+2021-10-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tests]: Improve portability.
+
+ * src/devices/grotty/tests/osc8_works.sh: Fix typo in test.
+ Multiple regex quantifiers after an atom were not flagged with a
+ diagnostic by GNU grep 3.3, but were by BSD grep 2.5.1-FreeBSD.
+
+ * src/roff/groff/tests/smoke-test_html_device.sh: Stop trying to
+ set $LC_CTYPE to "C.UTF-8"; some systems don't support this
+ expediency. Skip the test if the tester hasn't configured the
+ environment adequately.
+
+ * tmac/tests/s_TC-works-with-percent-in-custom-titles.sh: Fix
+ portability problems exposed by FreeBSD sed (which version is
+ unclear). {1} Use POSIX BREs, dropping use of '+' quantifier.
+ {2} Add semicolons to terminate commands before braces on the
+ same line. Simplify surrounding test structure.
+ * tmac/tests/e_footnotes-work-with-columns.sh: Fix same two sed
+ problems.
+ * tmac/tests/andoc_flush-between-packages.sh:
+ * tmac/tests/doc_accept-mixed-case-section-headings.sh:
+ * tmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh: Fix same
+ sed semicolon problem.
+
+ * src/roff/groff/tests/on_latin1_device_oq_is_0x27.sh: Rewrite
+ test to stop using a here document (containing an unpaired
+ single quote) inside a command substitution, which is broken in
+ GNU Bash 3.2 and some other versions. Instead construct the
+ input with printf(1). Also gets rid of a Bashism (process
+ substitution) that Ingo pointed out years ago.
+ * src/utils/grog/tests/recognize-perl-pod.sh: Same problem,
+ different solution. The Perl POD output is far too large to
+ construct programmatically, so move it into an external file...
+ * src/utils/grog/tests/foo.man: ...here.
+ * src/utils/grog/grog.am (EXTRA_DIST): Ship new test artifact.
+
+2021-10-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Make sed-based insertion of `lf` requests more
+ portable: a dance is required to embed a literal newline inside
+ a sed expression inside a shell command executed as part of a
+ Make target rule. We assume that neither the POSIX shell $''
+ operator nor a working printf(1) is available.
+ (DOC_GROFF): Define a shell variable containing a literal
+ newline, evading make(1) and echo(1)'s valiant attempts to
+ consume it.
+ (doc/pic.html, doc/webpage.html): Repeat trick, slightly
+ modified since the dependency needs to be manually identified.
+
+ Solution adapted from the GNU Autoconf manual, "Newlines in Make
+ Rules".
+
+ Fixes <https://savannah.gnu.org/bugs/?61265>. Thanks to John
+ Gardner for the report.
+
+2021-10-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac (TH): Stop populating `an-extra3` (the default
+ center header) if the section argument is "3p". "3p" does not
+ always mean a Perl-related man page; Debian- and Arch
+ Linux-based systems[1][2] (at least) have long used a "3perl"
+ suffix, while OpenBSD appears to still use "3p" for Perl[3],
+ which is also used by the POSIX man page distribution[4].
+ Fortunately, Perl and POSIX are reliable at providing a fifth
+ argument to `TH` anyway, so our fallback is as unnecessary as it
+ is non-impartial.
+ * tmac/groff_man.7.man.in (Document structure macros) <TH>:
+ De-document the above behavior.
+
+ [1] https://manpages.debian.org/bullseye/perl-doc/\
+ Pod::Man.3perl.en.html
+ [2] https://man.archlinux.org/man/Pod::Man.3perl
+ [3] https://man.openbsd.org/man3p/Pod::Man.3p
+ [4] https://man7.org/linux/man-pages/man3/system.3p.html
+
+2021-10-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Abbreviate the inside footer if necessary.
+
+ * tmac/an.tmac (an-prepare-inner-footer): Prevent the inside
+ footer from overrunning the center footer.
+ (BT): Use new string `an-ifoot` instead of `an-extra2` in page
+ footers.
+
+ Fixes <https://savannah.gnu.org/bugs/?61386>.
+
+2021-10-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Add regression test for Savannah #61386.
+
+ * tmac/tests/an_inner-footer-abbreviation-works.sh: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2021-10-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * man/groff_char.7.man (Description, Special character escape
+ forms): Document the `\C` escape sequence. Fix error: \[a] is
+ _not_ "translated to \a, the uninterpreted leader escape
+ sequence," but requests a glyph _named_ '\a' internally--it
+ appears thus in diagnostic messages and, importantly, in the
+ font description files defining special character glyph names.
+
+2021-10-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac: Refactor to reduce repetition.
+ (an-break-paragraph): New macro handles paragraph-breaking tasks
+ previously duplicated.
+ (SH, SS, P, TP, IP, HP): Call it rather than issuing its
+ constituent requests.
+
+2021-10-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac (TP): Reset type size, vertical spacing, and font
+ to defaults before setting the new paragraph.
+
+ Fixes <https://savannah.gnu.org/bugs/?61380>.
+
+2021-10-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Auto-increment): Fix error; the `\R` escape
+ sequence does _not_ support an auto-incrementation amount.
+ * man/groff_out.5.man (Command reference/Simple commands): Fix
+ erroneous claim: 'N' is not a GNU roff extension; it appears on
+ page 27 of CSTR#54 (1992).
+
+2021-10-24 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ [ms]: Provide global default XH and XN implementations.
+
+ cf. <https://savannah.gnu.org/bugs/?58946#comment13>
+
+ * tmac/s.tmac (XH-INIT, XN-INIT, XH-UPDATE-TOC)
+ (XH, XN, XH-REPLACEMENT, XN-REPLACEMENT): Implement them, and...
+ * tmac/groff_ms.7.man: ...document them.
+
+2021-10-24 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ [ms]: Fix misleading NH macro indentation.
+
+ * tmac/s.tmac (@NH) [.T is html]: .if statement should exhibit
+ same indentation as preceding .DEVTAG-NH statement, but is
+ overindented; fix it.
+
+2021-10-23 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ [ms]: Defend against uncontrolled page trap recursion.
+
+ * tmac/s.tmac (pg@top) [HM+FM+.V>.p]: Diagnose insufficient page
+ length, and abort; cf. <https://savannah.gnu.org/bugs/?61294>
+
+2021-10-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [groff]: Fix code style nits.
+
+ * src/roff/groff/groff.cpp (main, help): Use standard C library
+ preprocessor symbols `EXIT_SUCCESS` and `EXIT_FAILURE` instead
+ of 0 and 1 literals, respectively. See commit fa4c27e9, 7
+ September.
+ (main): Replace `assert(0)` with a communicative predicate.
+
+2021-10-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grotty/tty.cpp (tty_printer::special_link):
+ Eliminate casts by retyping `uri` and `pair` to pointers to
+ `const char`s.
+
+2021-10-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tmac.am: Build more quietly.
+ (tmac/stamp-wrap): Prefix all rule commands with `$(AM_V_at)`;
+ since this target is a stamp file instead of a useful artifact
+ to be distributed, make its creation completely silent by
+ default.
+
+2021-10-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/troff.am: Build more robustly.
+ (src/roff/troff/majorminor.cpp): Drop progress-reporting `echo`
+ in favor of prefixing final rule command with `$(AM_V_GEN)`.
+ Prefix earlier rule commands with `$(AM_V_at)`. Use `printf`
+ instead of `echo` to build the file, and create a temporary file
+ at first so that we don't race with the compiler on parallelized
+ builds.
+
+2021-10-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/eqn/eqn.am (neqn): Simplify: drop removal of
+ target prior to overwriting it; any system we can build groff on
+ should have a shell that implements the clobbering semantics of
+ the POSIX shell '>' operator. (If this isn't true, we have
+ _many_ other target rules in our build to which we must add
+ prefatory `$(RM)`s, or I miss my guess.)
+
+2021-10-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libgroff/libgroff.am: Build more quietly and
+ robustly.
+ (src/libs/libgroff/version.cpp): Drop progress-reporting `echo`
+ in favor of prefixing final rule command with `$(AM_V_GEN)`.
+ Prefix earlier rule commands with `$(AM_V_at)`. Use `printf`
+ instead of `echo` to build the file, and create a temporary file
+ at first so that we don't race with the compiler on parallelized
+ builds. Drop nilpotent sed transformation; this looks like a
+ relic of past times when we'd drop a trailing ".0" from the
+ version number stored in the C symbol `Version_string`.
+ (charset.alias, ref-del.sed, ref-add.sed): Prefix rule command
+ with `$(AM_V_GEN)`.
+
+2021-10-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/xditview/xditview.am: Build more quietly.
+ (src/devices/xditview/GXditview-ad.h): Drop progress-reporting
+ `echo` in favor of prefixing rule command with `$(AM_V_GEN)`.
+
+2021-10-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/devpdf.am: Build more quietly.
+ (font/devpdf/enc/text.enc, font/devpdf/map/symbolmap,
+ $(DEVPDFFONTMAP_1)): Prefix all rule commands with
+ `$(AM_V_at)`; since these are all `mkdir`s and `cp`s, I reason
+ that little can go wrong with them that won't be disclosed by
+ these tools' own diagnostic messages, so they are insignificant
+ from a perspective of build progress.
+
+2021-10-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Build more quietly.
+ (doc/examples.stamp): Prefix all rule commands with
+ `$(AM_V_at)`; since this target is a stamp file instead of
+ a useful artifact to be distributed, make its creation
+ completely silent by default.
+ (doc/groff.info, .texi.txt): Prefix directory creation with
+ `$(AM_V_at)` and `makeinfo` command with `$(AM_V_GEN)`.
+ (.texi.dvi, .texi.pdf): Prefix directory creation with
+ `$(AM_V_at)` and `makeinfo` command with `$(AM_V_GEN)`. Send
+ diagnostic message to standard error if `texi2dvi` is
+ unavailable.
+ (.texi.html): Prefix directory creation with
+ `$(AM_V_at)`. Two HTML versions are produced, in split and
+ unsplit versions; prefix one `makeinfo` command with
+ `$(AM_V_GEN)` and the other with `$(AM_V_at)` so that only one
+ message is produced.
+ (gnu.eps): Drop useless/noisy `echo` command. Prefix copy
+ operation with `$(AM_V_at)`. Send diagnostic messages to
+ standard error if there are problems with the Netpbm tools.
+
+ (MOSTLYCLEANFILES): The `mostlyclean` target was leaving a file,
+ `groff.info-3`, behind in the build tree. At some point our
+ Texinfo manual grew beyond earlier expectations. Use a glob
+ `[0-9]` instead (giving a hostage to fortune that `makeinfo`
+ will never split our manual into more than nine chunks).
+
+2021-10-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * arch/misc/misc.am:
+ (arch_shdeps_sh): Pull file name into a new variable.
+ (EXTRA_DIST, shdeps.sed): Use it.
+ (shdeps.sed): Build more quietly; prefix with `$(AM_GEN_V)`.
+
+2021-10-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [nroff]: Support groff's -R flag to run refer(1).
+
+ There's no reason not to support calling `refer` with nroff-mode
+ documents; typographically, it's less demanding than tbl(1).
+ GNU troff(1) supports an incompatible `-R` flag to suppress the
+ reading of troffrc{,-end} files, but this is likely not the `-R`
+ that users will want--it is most useful for troubleshooting
+ troff, and nroff already unconditionally loads a macro file
+ {tty-char.tmac}.
+
+ * src/roff/nroff/nroff.sh: Do it.
+
+ * src/roff/nroff/nroff.1.man:
+ * NEWS: Document it.
+
+2021-10-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tmac.am (tmac/groff_man.7.man)
+ (tmac/groff_man_style.7.man): Be quieter by default; use
+ $(AM_V_GEN) more consistently with the rest of the build.
+
+2021-10-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (do_error): Format diagnostic
+ messages in closer alignment with GNU Coding Standards: don't
+ introduce a space between the program name and the input file
+ name.
+
+ * src/roff/groff/tests/string_case_xform_errors.sh: Update
+ expected output.
+
+2021-10-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/env.cpp (distribute_space): Revert an
+ `assert()` I added in commit b93eacd8d7 (5 September); we can
+ indeed reach this code with a negative amount of desired space,
+ and in fact the "show hyphenation points" trick
+ <https://froude.eu/groff/examples/hyphenation-points.html>
+ relies upon it. Add explanatory comment.
+
+ Fixes <https://savannah.gnu.org/bugs/?61348>.
+
+2021-10-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * test-groff.in: Add support for sboxes.tmac.
+
+2021-10-11 Paul Eggert <eggert@cs.ucla.edu>
+
+ Include <config.h> before any standard headers.
+
+ Gnulib requires that files that might use Gnulib features (which
+ pretty much means every C or C++ source file) must include
+ <config.h> first. Arrange for that. This will be needed once
+ Groff updates to the latest Gnulib; see Bjarni Ingi Gislason's
+ problem report in:
+ <https://lists.gnu.org/r/bug-gnulib/2021-10/msg00008.html>
+
+ The only exception I can see is src/utils/addftinfo/guess.cpp,
+ which does not include any standard include file either directly
+ or indirectly, and so need not include <config.h>.
+
+ * src/devices/xditview/Dvi.c:
+ * src/devices/xditview/font.c:
+ * src/devices/xditview/lex.c:
+ * src/devices/xditview/page.c:
+ * src/devices/xditview/parse.c:
+ * src/libs/libbib/map.c:
+ * src/libs/libgroff/change_lf.cpp:
+ * src/libs/libgroff/cmap.cpp:
+ * src/libs/libgroff/cset.cpp:
+ * src/libs/libgroff/fmod.c:
+ * src/libs/libgroff/getcwd.c:
+ * src/libs/libgroff/lf.cpp:
+ * src/libs/libgroff/ptable.cpp:
+ * src/libs/libgroff/quotearg.c:
+ * src/libs/libxutil/DviChar.c:
+ * src/libs/libxutil/XFontName.c:
+ * src/libs/libxutil/xmalloc.c:
+ * src/utils/indxbib/signal.c: Do it.
+
+ [Fixes <https://savannah.gnu.org/bugs/?61315>. --GBR]
+
+2021-10-10 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Handle pdfs > v1.4 loaded by \X'pdf: pdfpic'.
+
+ * src/devices/gropdf/gropdf.pl: Improve loading of pdfs above
+ version 1.4, i.e. handle compressed nodes in /ObjStm. Also
+ improve code in \X'pdf: import'.
+
+2021-10-10 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Add new background boxes to gropdf.
+
+ * src/devices/gropdf/gropdf.pl: New \X'pdf: background' command.
+ * tmac/pdf.tmac: Covenience command .pdfbackground added.
+ * contrib/sboxes/: Files which demonstrate use of background
+ boxes using -ms macros.
+
+2021-10-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tests]: Fix portability problems in 2 tests.
+
+ * src/roff/groff/tests/break_zero-length_output_line_sanely.sh:
+ * tmac/tests/s_PN-works.sh: Migrate from `echo` to `printf` for
+ test inputs containing backslashes to be interpreted literally.
+
+ Fixes part of <https://savannah.gnu.org/bugs/?61302>. Thanks to
+ Deri James for identifying the problem.
+
+2021-10-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grotty]: Slightly refactor.
+
+ * src/devices/grotty/tty.cpp: Boolify. Demote numerous
+ variables (and one return type) from `int` to `bool`, use
+ Boolean instead of integer literals with them, and give the
+ variables names resembling logical predicates.
+ - horizontal_tab_flag -> want_horizontal_tabs
+ - form_feed_flag -> want_form_feeds
+ - bold_flag_option -> want_emboldening_by_overstriking
+ - bold_flag -> do_bold
+ - underline_flag_option -> want_italics_by_underlining
+ - underline_flag -> do_underline
+ - overstrike_flag -> want_glyph_composition_by_overstriking
+ - draw_flag -> allow_drawing_commands
+ - italic_flag_option -> want_sgr_italics
+ - italic_flag -> do_sgr_italics
+ - reverse_flag_option -> want_reverse_video_for_italics
+ - reverse_flag -> do_reverse_video
+ - old_drawing_scheme -> use_overstriking_drawing_scheme
+ (class tty_printer:printer): Similarly.
+ - is_underline -> is_underlining
+ - is_bold -> is_boldfacing
+ - cu_flag -> is_continuously_underlining
+ (tty_printer::tty_color): Demote return type as above. Invert
+ its sense; rename `unknown_color` to `is_known_color`.
+ (tty_printer::color_to_idx): Invert sense of test at
+ `tty_color()` call site.
+
+2021-10-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Finish documenting new `TC-MARGIN` register and
+ `TC-LEADER` special character.
+
+ Fixes <https://savannah.gnu.org/bugs/?61157>.
+
+2021-10-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grotty]: Slightly refactor.
+
+ * src/devices/grotty/tty.cpp (tty_printer::special_link): Use
+ consistent loop styles and drop unnecessary arithmetic.
+
+2021-10-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Fix oversight and improve `MR` test.
+
+ * tmac/an-ext.tmac (initialization): Enable `mY` register to
+ indicate use of grotty(1) (and therefore OSC 8 support) if the
+ "ascii", "cp1047", or "latin1" output devices are used, not just
+ "utf8".
+
+ * tmac/tests/an_MR-works.sh: Drop copy-and-paste cruft from a
+ different test. Update expected output and check for the
+ presence of "link" device control subcommands, not just correct
+ font selections.
+
+2021-10-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Add `MR` macro for man page cross references.
+
+ * tmac/an.tmac (an-prepare-page-title): After a possibly
+ abbreviated man page title is determined, redefine `an-pageref`
+ to set the title portion in the font stored in the `MF` string
+ and bracket it with italic corrections if that font is thought
+ to be oblique.
+ (MR): Add macro to format the text of a man page cross
+ reference, and hyperlink it on HTML and terminal output devices
+ if permitted by the `U` register.
+ (initialization): Define `MF` string as `I` if not already set.
+ Define `an-lic` and `an-ic` strings as either empty or as
+ containing italic corrections.
+
+ * tmac/an-ext.tmac (MR): If the formatter is not GNU troff,
+ define macro to format the text of a man page cross reference.
+
+ * tmac/groff_man.7.man.in: Document it.
+ (Description): Add macro to summary table.
+ (Description/Hyperlink macros): Document new feature. Note
+ origin in Plan 9 troff. [style] Add examples of use.
+ (Description/Font style macros): Drop man page cross references
+ from list of items whose typeface conventions are disputed,
+ since we have a semantic macro now and a configurable means of
+ resolving the problem.
+ (History): Add `MR` item.
+ (Options) <MF>: Document new string.
+ (Files) <an-ext.tmac>: Revise discussion to accommodate `MR`.
+ (Authors): Add myself an author of extension macros.
+
+ * tmac/tests/an_MR-works.sh: Test it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+ * NEWS: Add item.
+
+2021-10-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac (SH, SS): Invoke `ne` request _before_ performing
+ font remapping: any page-breaking decision will be taken before
+ the remapping happens, and so won't be in effect across a page
+ boundary, undesirably impacting header and footer text.
+
+ Fixes <https://savannah.gnu.org/bugs/?61279>.
+
+2021-10-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Regression-test Savannah #61279.
+
+ * tmac/tests/an_font-remapping-does-not-affect-titles.sh: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2021-10-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac (an-abbreviate-title): Rename to...
+ (an-prepare-page-title): ...this.
+
+2021-10-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [docs]: Correct erroneous claim: the ".NH S" extension to ms(7)
+ comes from 4.2BSD, not GNU.
+
+2021-10-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/ms.ms (Creating a table of contents): Sync with recent
+ additions to groff_ms(7), expand, and heavily revise.
+
+2021-10-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [andoc,man,mdoc]: Fix Savannah #61266. Resolve problems in
+ batch rendering of man pages to PDF arising from entanglement
+ of end-of-input traps, page location traps, continuous rendering
+ mode, and andoc's reloading of the (m)an and (m)doc packages.
+
+ * tmac/andoc.tmac (reload-doc, reload-man): Remove end-of-input
+ traps alongside others.
+
+ * tmac/an.tmac (an-end): Only perform flush and "manual" page
+ footer placement if in continuous rendering mode, since this
+ macro is not only called by a trap placed only in continuous
+ rendering mode, but also by andoc when changing macro packages.
+ Unconditionally remove the `an-header` trap since the next
+ document might be using a different macro package.
+
+ * tmac/mdoc/doc-common: In initialization, set flag indicating
+ that manual header placement will be required.
+ (Dt): Call `doc-setup-header` (which sets up several types of
+ trap) unconditionally, and break the page if the vertical
+ drawing position is anywhere but at the top.
+ (Os): If the package has just been initialized, call
+ `doc-header` to force the page header to be written.
+ (doc-end-macro): Remove `doc-header` trap since the next
+ document might be using a different macro package. Break the
+ page. Set flag indicating that manual header placement will be
+ required for the next document.
+
+ * tmac/mdoc/doc-ditroff (doc-setup-header): Only set page
+ location traps for the header and footer if not continuously
+ rendering.
+ * tmac/mdoc/doc-nroff (doc-setup-header): Stop calling
+ `doc-header` here if continuously rendering. Emit an
+ unconditional break. Except for the location of the footer
+ trap, the `doc-setup-header` implementations are now identical.
+
+ Refactoring is needed: some macros and registers have misleading
+ names, there is some code duplication in mdoc, and some of the
+ trap management problems are solved in slightly different ways
+ in man(7) and mdoc(7), perhaps unnecessarily. We also need some
+ test scripts to protect us from regressions. But this fixes the
+ rendering problems.
+
+ Fixes <https://savannah.gnu.org/bugs/?61266>.
+
+2021-10-02 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Correct manpage typo/inconsistency.
+
+ * tmac/groff_ms.7.man (TC_LEADER, TC_MARGIN): Correct; should
+ be...
+ (TC\-LEADER, TC\-MARGIN): ...respectively, for consistency
+ with...
+ * tmac/s.tmac (TC-LEADER, TC-MARGIN): ...these.
+
+2021-10-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (encode_char): Update diagnostic
+ messages to not presume the identity of the escape character;
+ continues 9be3f8e3 (4 June).
+
+2021-10-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grotty/tty.cpp (tty_printer:special_link): Tighten
+ code slightly by taking advantage of preprocessor string literal
+ concatenation.
+
+2021-10-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Fix `U` enablement override so it actually works the way
+ I had in mind.
+ - The package proper enables it by default, but
+ - the sample site configuration file switches it off, on the
+ assumption that distributors and users will know better than
+ we do when they get a capable pager in place, and
+ - a register setting at the command line (or otherwise prior to
+ the loading of the macro package) is dispositive.
+
+ * tmac/an-ext.tmac: Rename URI output device capability register
+ from `U` to `mU`.
+ (UR, UE, MT, ME): Test both `U` and `mU` before handling
+ hyperlinks specially.
+ * tmac/an.tmac: If `man.local` did not initialize `U`, switch it
+ on. The hope is that we can drop the stuff in `man.local`
+ completely at some point.
+ * tman/man.local: Only initialize `U` if it is not already
+ defined.
+
+2021-10-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Use OSC 8 hyperlinks.
+
+ * tmac/an-ext.tmac: Add registers `mY` (output driver is
+ "grotty") and `U` (generate hyperlinks). `U` is intended to
+ apply to hyperlinking support in general, not just grotty's OSC
+ 8 feature. If the output driver is either grohtml or grotty,
+ make `U` true (`man.local` is read subsequently and can override
+ it).
+ (UR, MT): Conditionalize diversion production on hyperlink
+ support, not grohtml use per se.
+ (UE, ME): Generate device control commands for `tty` device to
+ emit hyperlinks.
+
+ * tmac/groff_man.7.man.in (Options): Document -rU.
+ (Files) [style]: Add example of `U` register enablement.
+
+ * tmac/man.local: Disable `U` register by default, except on the
+ `html` device.
+
+ * NEWS: Add item.
+
+2021-10-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grotty]: Add OSC 8 hyperlink support.
+
+ * src/devices/grotty/tty.cpp: Do it. Define `OSC` (Operating
+ System Command) and `ST` (String Terminator) preprocessor
+ symbols for these ECMA-48 (ISO 6429) character sequences.
+ (tty_printer::simple_add_char): Add stripped-down alternative to
+ `add_char()` member function for cases where we want to use many
+ defaults because we're writing a terminal escape sequence, not
+ rendering a glyph. (A function like `add_char()` that takes 8
+ arguments of varying types is a code smell--phew!)
+ (tty_printer::special): Call `special_link()` member function if
+ the device control command is `link`.
+ (tty_printer::special_link): Add new member function to generate
+ OSC 8 hyperlinks.
+
+ * src/devices/grotty/grotty.1.man: Document it. Observe in
+ multiple places that disablement of SGR escape sequences
+ disables OSC 8 too.
+
+ * src/devices/grotty/tests/osc8_works.sh: Test it.
+ * src/devices/grotty/grotty.am (TESTS, grotty_TESTS): Run test.
+ (EXTRA_DIST): Ship test.
+
+ * NEWS: Add item.
+
+ Fixes <https://savannah.gnu.org/bugs/?60666>. Thanks to Steffen
+ Nurpmeso for supplying a proof-of-concept. (I went with my own
+ implementation, though, so blame me if it breaks.)
+
+2021-10-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Convert special character glyphs corresponding to
+ Unicode Basic Latin ("ASCII") code points to those code points
+ when they occur in device escapes. (They should be correct for
+ IBM code page 1047 as well, but this is untested.) This is
+ necessary for encoding URLs in device control commands. Special
+ character identifiers are presumed to be the defaults documented
+ in groff_char(7); this is a design gap that we should consider
+ addressing. (We don't have a way to ask "is this the special
+ character corresponding to Unicode basic Latin code point X?")
+
+ * src/roff/troff/input.cpp (encode_char): Do it.
+
+2021-09-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man, mdoc]: Draw line after each page more consistently in
+ continuous rendering mode.
+
+ * tmac/an.tmac (an-bp): Move responsibility for line-drawing
+ after each document from here...
+ (an-end): ...to here. Refactor; drop
+ `an-do-draw-line-after-document` register in favor of testing
+ `\n[.F]` for nullity; if it is not null, then another document
+ is due to be processed (in fact, `.F` already contains its file
+ name), and we need to draw a separating line. If it is null, we
+ have reached the end of input and none is necessary.
+
+ * tmac/mdoc/doc-ditroff.tmac (doc-setup-page-layout):
+ * tmac/mdoc/doc-nroff.tmac (doc-setup-page-layout): Save
+ configured line length in new register `doc-line-length`.
+ * tmac/mdoc/doc-common.tmac (doc-end-macro): Port the above
+ man(7) feature to mdoc(7); draw a line of this length after each
+ document if continuously rendering.
+
+2021-10-01 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ [ms]: Update footnote handling documentation.
+
+ * tmac/groff_ms.7.man: Make some linguistic style adjustments.
+ (FP): Document it; see <https://savannah.gnu.org/bugs/?61022>.
+ (FS-MARK): Likewise, document this recently added feature.
+
+2021-10-01 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ [ms]: Support user-defined TOC leader style.
+
+ * tmac/s.tmac (toc*leader-char): Rename it as...
+ (TC-LEADER): ...this; within PX, leave it unchanged, if
+ predefined.
+ (TC-MARGIN): New numeric register; if predefined, leave it
+ unchanged, otherwise define as \w'000'; use it instead of
+ hard-wired definition, within PX; see
+ <https://savannah.gnu.org/bugs/?61157>.
+
+ * tmac/groff_ms.7.man (TC-LEADER, TC-MARGIN): Document them.
+
+2021-09-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [pic]: Update input file name correctly.
+
+ * src/preproc/pic/troff.cpp (troff_output::set_location): Copy
+ the inbound file name argument with `strdup()` and store pointer
+ to this copy in `last_filename` instead of aliasing argument.
+ (troff_output::~troff_output): `free()` the memory allocated by
+ `strdup()` in destructor.
+
+ Fixes <https://savannah.gnu.org/bugs/?61206>. Pointer
+ assignment instead of a string copy was being performed, which
+ means that after its initial assignment, `last_filename` always
+ shared its value ultimately with the `current_filename` pointer
+ {a libgroff symbol}, so `strcmp()` was always being performed on
+ identical pointers. Problem appears to date back 30+ years, to
+ the dawn of our repo history.
+
+2021-09-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devlj4/S: Make font name consistent with file name.
+
+2021-09-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libgroff/font.cpp (font::load): Throw error if a font
+ description file is missing a `spacewidth` directive, since it
+ is now re-documented as mandatory. Atypically, we don't return
+ false in this scenario; instead we proceed with the existing
+ logic to compute a space width for the font based on typical
+ practices for Western alphabetic fonts (see, e.g.,
+ <https://type.today/en/journal/spaces>.
+
+ * font/devdvi/EX:
+ * font/devdvi/MI:
+ * font/devdvi/S:
+ * font/devdvi/SA:
+ * font/devps/EURO: Add `spacewidth` directive to font
+ description files we ship that were missing it. We use the same
+ values that libgroff would have computed, so there should be no
+ visible difference.
+
+2021-09-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * Makefile.am: Mark `$(TEST_SUITE_LOG)` as `.PRECIOUS`. This
+ prevents the test suite log from being deleted if there are any
+ failures.
+
+ Fixes <https://savannah.gnu.org/bugs/?61213>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2021-09-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/grog.pl (do_line): Move first-macro-call test
+ for `TH` to a more appropriate location.
+
+2021-09-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grog]: Refactor to make it easier to generalize a per-package
+ scoring mechanism.
+
+ * src/utils/grog/grog.pl: Convert `inferred_main_package` from
+ scalar to list. Add scalar `selected_main_package` to store a
+ "winner" from the list of main packages inferred.
+ (push_main_package): Add subroutine to populate
+ `inferred_main_package`.
+ (do_line, infer_man_or_ms_package): Update to use
+ `push_main_package`.
+ (construct_command): Rewrite to select a main package from the
+ list `inferred_main_package`, taking user-supplied arguments
+ into account as an overriding factor. Drop now-unused `msupp`
+ list.
+
+2021-09-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/groff.cpp (main): If the `-I` option is given,
+ run the grn preprocessor and pass it an `-M` option with `-I`'s
+ argument.
+
+ * NEWS:
+ * src/roff/groff/groff.1.man (Options): Document it. Also
+ document that `-I` options are passed to the output driver.
+
+2021-09-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/grog.pl (do_line): Don't strip groff-style
+ comments \# if AT&T compatibility mode is enabled.
+
+2021-09-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Perform more font description file validation. Our
+ documentation said that the `name` directive was mandatory but
+ we didn't actually enforce this. Also be more specific in our
+ complaints of ill-formedness.
+
+ * src/libs/libgroff/font.cpp (font::load): Add local Boolean
+ variable `saw_name_directive`. Rename `had_charset` to
+ `saw_charset_directive` for symmetry. Emit distinct diagnostics
+ for `spacewidth` and `slant` directives having a missing,
+ non-numeric, or out-of-range argument. Emit diagnostic if the
+ file lacks a `name` directive.
+
+2021-09-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Slightly refactor.
+
+ * src/libs/libgroff/font.cpp (struct text_file): Rename member
+ variable `size` to `linebufsize` for clarity (it's certainly not
+ the size of the text file).
+ (text_file::text_file): Initialize `linebufsize` in constructor.
+ (text_file::next_line): Allocate new `buf` using `linebufsize`
+ instead of magic number (which was also stored to `size`, making
+ it only semi-magic, I guess). Rename local variable `i` to
+ `length` since it is in fact the length (in `char`s) of the
+ string stored in `buf`.
+
+2021-09-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Revisit fix for Savannah #61173.
+
+ * src/libs/libgroff/font.cpp (text_file::text_file): Restore
+ setting of `lineno` member variable to `0` in constructor
+ initializer list, but...
+ (text_file::next_line): ...unconditionally increment it every
+ time through this member function's outer loop.
+
+2021-09-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Align diagnostic message format with libgroff.
+
+ * src/roff/troff/input.cpp (fatal_with_file_and_line): Report
+ the program name if one is defined.
+ (fatal_with_file_and_line, error_with_file_and_line,
+ debug_with_file_and_line): Report the line number of the input
+ file only if it is positive, so that other values can be used
+ for "whole file" complaints. See commit cd0457b6, 17 September.
+
+2021-09-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Drop redundant diagnostic.
+
+ * src/libs/libgroff/font.cpp (font::load): Drop redundant
+ diagnostic; a missing `charset` directive is already checked for
+ later, circa line 998.
+
+2021-09-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Fix code style nits.
+
+ * src/libs/libgroff/font.cpp (font::font): Use initializer list
+ as much as possible in constructor.
+ (font::unit_scale, font::get_width, font::get_height,
+ font::get_depth, font::get_italic_correction,
+ font::get_left_italic_correction,
+ font::get_subscript_correction, font::get_character_type,
+ font::get_code, font::get_special_device_encoding): These member
+ functions rely on the font being either indexed or associated
+ with an output device that uses the `unicode` directive in its
+ `DESC` file. The compiler doesn't know this, so annotate the
+ `abort()` calls that conclude them. Add an `assert()` before
+ each one to more usefully describe the violated invariant in the
+ event this unreachable code is somehow reached.
+ (font::get_width): Annotate special meaning of zero zoom factor.
+
+2021-09-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/include/font.h (UNDEFINED_GLYPH): Use idiomatic C++98 null
+ pointer constant.
+
+2021-09-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grohtml]: Fix compiler warning and dead store.
+
+ * src/devices/grohtml/post-html.cpp (html_printer::special):
+ Update call of `font::load_font()` to stop passing obsolete
+ parameter (deleted by me in 2dff87d3, 17 September). The value
+ stored to the parameter by that function was never read anyway,
+ so also get rid of the variable that contained it.
+
+ Fixes <https://savannah.gnu.org/bugs/?61187>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2021-09-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Slightly refactor.
+
+ * src/include/font.h (font::scan_papersize): Demote return type
+ from `int` to `bool`.
+ * src/libs/libgroff/font.cpp (font::scan_papersize): As above.
+ Use Boolean instead of integer literals. Also rename `FILE`
+ stream pointer from `f` to `fp` and perform an explicit
+ comparison against the idiomatic C++98 null pointer constant.
+
+2021-09-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff, troff]: Slightly refactor device and font description
+ file loading. Remove dead code.
+
+ * src/include/font.h (font::load_font): Drop second parameter.
+ It was never used for its intended purpose.
+ (load): Drop first parameter; likewise.
+ * src/libs/libgroff/font.cpp (font::load, load): As above.
+
+ * src/libs/libgroff/font.cpp (struct text_file): Rename
+ `skip_comments` to `recognize_comments`. Demote that and
+ `silent` from `int` to `bool`.
+ (text_file::text_file): Use Boolean rather than integer literals
+ in constructor.
+ (text_file::next_line, font::load): Apply above renaming.
+
+ * src/libs/libgroff/font.cpp (font::load): Rename parameter from
+ `head_only` to `load_header_only` to be more communicative.
+ Drop test of font description file name being `DESC`; this code
+ was not being reached. Stop throwing errors from this function
+ on failure to open the file; the caller will handle this when it
+ sees our false return value. Rename local variable `command` to
+ `directive` for alignment with our documentation. Replace "I
+ dont think this should happen" test and comment with `assert()`.
+ (struct table): Rename member from `command` to
+ `numeric_directive` to indicate its specificity, tracking only a
+ subset of valid `DESC` file directives.
+
+ * src/libs/libgroff/font.cpp (font::load, font::load_desc):
+ Remove redundant assignments to the member variable formerly
+ known as `skip_comments`.
+
+ * src/libs/libgroff/font.cpp (font::load_desc): Rename local
+ variable `directive_found` to `numeric_directive_found` to
+ clarify logic.
+
+ * src/roff/troff/node.cpp (mount_font_no_translate): Simplify
+ call of `font::load_font`. The `not_found` in-out parameter
+ which was so agonizingly passed up through layers of library
+ calls was never actually read. Drop code that has been `#if
+ 0`-ed out since 1993.
+
+2021-09-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libgroff/font.cpp (font::load_desc): Clear line
+ number before emitting whole-file validity diagnostics.
+
+2021-09-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libgroff/font.cpp (font::load_desc): Emit correct
+ line numbers when complaining of invalid `sizescale`, `hor`, or
+ `vert` values in device description files.
+
+ Fixes <https://savannah.gnu.org/bugs/?61174>.
+
+2021-09-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Increase validation of device and font description
+ files.
+
+ * src/libs/libgroff/font.cpp (font::load): Validate the syntax
+ and value of the `name` directive.
+ (font::load_desc): Issue distinct diagnostics for a `fonts`
+ directive that is missing arguments and for a first argument
+ that can't be interpreted as a valid number.
+
+2021-09-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Make error reporting more flexible.
+
+ * src/libs/libgroff/error.cpp (do_error_with_file_and_line):
+ Interpret a nonpositive line number specially: treat the
+ diagnostic as applying to the entire file, and omit the line
+ number.
+
+2021-09-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Add information to diagnostics.
+
+ * src/libs/libgroff/font.cpp (font::load): Drop unused argument
+ from `error()` call.
+ (font::load_desc): In another, add name of numeric directive
+ that is given an unparsable number.
+
+2021-09-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Tweak code style.
+
+ * src/libs/libgroff/font.cpp (trim_args, font::load)
+ (font::load_desc): Compare pointer explicitly to null pointer
+ literal `0` instead of using logical complementation.
+ (font::load, font::load_desc): Swap order of null pointer
+ equality comparisons when a typo or thinko could lead to lvalue
+ assignment.
+
+2021-09-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Use idiomatic C++98 null pointer constant.
+
+ * src/libs/libgroff/font.cpp (text_file::error)
+ (glyph_to_unicode, font::get_special_device_encoding)
+ (font::load):
+ * src/libs/libgroff/fontfile.cpp (font::image_generator):
+ * src/libs/libgroff/nametoindex.cpp (class charinfo)
+ (character_indexer::named_char_glyph)
+ (character_indexer::numbered_char_glyph):
+ * src/libs/libgroff/string.cpp (string::clear):
+ * src/libs/libgroff/tmpfile.cpp (temp_init::temp_init):
+ * src/libs/libgroff/tmpname.cpp (gen_tempname): Use `0` literal
+ instead of `NULL` to represent a null pointer; this was
+ idiomatic in C++98 and is mostly the practice elsewhere in
+ groff. Also swap order of null pointer equality comparisons
+ when a typo or thinko could lead to lvalue assignment.
+
+ * src/roff/troff/input.cpp (input_stack::diversion_state)
+ (input_stack::get_diversion_state, charinfo::contains)
+ (glyph_to_name): Similar.
+
+2021-09-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Slightly refactor.
+
+ * src/libs/libgroff/font.cpp (font::load): Use same loop style
+ as `font::load_desc()`.
+
+2021-09-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Fix off-by-one error in font and device description
+ file reader diagnostics.
+
+ * src/libs/libgroff/font.cpp (text_file::text_file): All text
+ files begin with line 1, not line 0.
+
+ Fixes <https://savannah.gnu.org/bugs/?61173>.
+
+2021-09-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Boolify more interfaces.
+
+ * src/include/font.h (font::unit_scale):
+ * src/libs/libgroff/font.cpp (font::unit_scale): Demote return
+ type from `int` to `bool`. Use Boolean literals instead of
+ integers.
+
+ * src/libs/libgroff/font.cpp (struct text_file): Rename `next`
+ member function to `next_line`. Demote its return type from
+ `int` to `bool`. Use Boolean literals instead of integers.
+
+2021-09-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Boolify local variables.
+
+ * src/libs/libgroff/font.cpp (font::load, font::load_desc):
+ Demote local variables used as Booleans from `int` to `bool` and
+ update literals used with them from integer to Boolean.
+
+2021-09-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grn, groff, troff]: Communicate better when device DESC file
+ can't be loaded.
+
+ * src/libs/libgroff/font.cpp (font::load_desc): Stop writing
+ diagnostic to standard error.
+ * src/preproc/grn/main.cpp (getres):
+ * src/roff/troff/troff.cpp (main): Replace "sorry, I can't
+ continue" fatal diagnostic with a more informative message.
+ Instead say which device's DESC file the program was trying to
+ open, which might reveal a user's logic error or typo.
+ * src/roff/groff/groff.cpp (main): Replace "invalid device" text
+ of fatal diagnostic similarly. I think it is more helpful to
+ indicate the operation that failed rather than saying the device
+ was invalid, particularly since there are other ways for a
+ device description to be invalid even if a DESC file is found
+ and loaded.
+
+2021-09-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Throw warning diagnostic if device DESC file attempts
+ to load unavailable fonts.
+
+ * src/roff/troff/input.cpp (main): Take advantage of new Boolean
+ return values of `mount_style()` and `mount_font()` to produce
+ warning diagnostics if mounting a style or font as directed by
+ the DESC file fails. Explain in a comment why, at present, this
+ style mount warning will never actually trip.
+
+2021-09-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Lift font mounting diagnostic messages to be closer to
+ their user-controlled contexts to provide more information. In
+ many cases no diagnostic was being thrown at all when an
+ unavailable font was requested by name, which is the method most
+ users prefer, and which meant that failures resulting from typos
+ in font names for many requests (`uf`, `fschar`, `rfschar`,
+ `special`, `fspecial`, `fzoom`, `bd`, `tkf`, `cs`) were going
+ unreported. Further, promote these font warnings to errors
+ because the request will utterly fail to do what was requested
+ with no reasonable fallback. Possibly, they were formerly
+ warnings because at the low level they were being emitted, they
+ could also have originated from unavailable fonts encountered in
+ device description files, and while that's bad news, it results
+ in no formatting problems if it doesn't affect fonts that an
+ input document actually uses.
+
+ * src/roff/troff/node.cpp (struct font_lookup_info): New struct
+ keeps the font name or position requested, and the position of
+ successful font lookup.
+ (font_lookup_info::font_lookup_info): Add constructor.
+ (font_lookup_error): New function builds error message using a
+ `font_lookup_info` struct and a message argument.
+ (get_fontno): Rename to...
+ (has_font): ...this. Add argument to take a pointer to a
+ `font_lookup_info` struct. Return a `bool` indicating whether
+ the lookup succeeded. Place former `int` return value into the
+ struct instead. Populate the other struct members with the
+ requested font name or position, as appropriate.
+ (mount_font_no_translate): Stop throwing warning diagnostic here
+ if a font cannot be loaded. Instead, throw them...
+ (font_position): ...here, and...
+ (underline_font, define_font_special_character,
+ remove_font_special_character, read_special_fonts,
+ font_special_request, font_zoom_request, bold_font, track_kern,
+ constant_space): ...here, using `font_lookup_info` structs and
+ `has_font()`.
+ (remove_font_special_character): Stop returning early if font
+ lookup fails; it's gratuitously inconsistent with other similar
+ functions (save one, which has a reason to be different).
+ (define_font_special_character): Return early if font lookup
+ fails and say why in a comment (we can't `skip_line()`).
+
+ Fixes <https://savannah.gnu.org/bugs/?59522>.
+
+2021-09-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * [libgroff, troff]: Further boolify.
+
+ * src/include/font.h (load_font, font): Demote parameters from
+ {pointer to} `int` to `bool` and update default literal from
+ integer to Boolean (except for the pointer). Update comment.
+ * src/libs/libgroff/font.cpp (load_font, load): Similarly.
+
+ * src/roff/troff/node.h (mount_font):
+ * src/roff/troff/node.cpp (mount_font): Demote return type from
+ `int` to `bool`.
+
+ * src/roff/troff/node.h (mount_style):
+ * src/roff/troff/node.cpp (mount_style): Promote return type
+ from `void` to `bool`.
+
+ * src/roff/troff/node.cpp (mount_font_no_translate): Demote
+ return type and `check_only` parameter from `int` to `bool` and
+ use Boolean rather than integer literals with them.
+ (check_font): Update call site of `mount_font_no_translate` to
+ use Boolean literal.
+ (font_position): Indicate that "error" is ignored by casting
+ return value of `mount_font` to void instead of using a comment.
+ (style): Cast return value of `mount_style` to `void`.
+
+2021-09-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * Makefile.am: Add `.DELETE_ON_ERROR` special target; both GNU
+ and FreeBSD make(1)s support it so maybe it will be portable
+ enough. This avoids, among other problems, a target appearing
+ falsely up-to-date (often as an empty file) when the troff
+ process generating it experiences an assertion failure.
+
+2021-09-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Since June 1991 if not earlier, groff (technically, the refer,
+ lookbib, and lkbib programs) has trusted the header contents of
+ binary bibliographic index files (canonically generated with
+ indxbib(1)) regarding the sizes of the data structures that
+ follow in the file, a notorious class of security problem. In
+ July 2013, the Mayhem Team at Carnegie Mellon University
+ reported to the Debian Bug Tracking System a problem with
+ groff's refer(1) implementation dumping core when reading an
+ index file prepared by a fuzzer.
+
+ * src/libs/libbib/index.cpp (index_search_item::check_header):
+ Add new member function to validate the header of an indexed
+ bibliography file, returning a string describing in detail the
+ first validity problem encountered.
+ (index_search_item::load): Perform the foregoing check before
+ using any of the size values taken from the header; they are
+ relied upon for pointer arithmetic. If in verification mode
+ {using the undocumented `-V` flag to refer(1), lkbib(1), or
+ lookbib(1)}, report the details of the problem encountered.
+ Regardless of that mode, if there is a validity problem, report
+ corruption of the index file and abandon it, forcing fallback to
+ the text version of the corresponding bibliography file.
+
+ Fixes <https://bugs.debian.org/716109>.
+
+2021-09-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libbib/index.cpp
+ (index_search_item::get_invalidity_reason): Don't complain about
+ a last list element being nonnegative if the list size was zero
+ in the first place, as can happen with an empty index. More
+ seriously from a language standpoint, avoid reading through a
+ negative array index (this can escape a compiler's attention
+ because we're reading from the midst of a heap-allocated or
+ `mmap()`ed region, but it's still a code smell).
+
+ Fixes <https://savannah.gnu.org/bugs/?61144>.
+
+2021-09-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libbib/index.cpp (index_search_item::load)
+ (index_search_item::get_invalidity_reason)
+ (index_search_item::add_out_of_date_file): Clarify diagnostic
+ messages. Make it more obvious when we're complaining of a
+ problem in an indexed bibliographic database file (rather than a
+ plain text one). Dial down the amount of Unix jargon a little.
+
+2021-09-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libbib]: Partially boolify.
+
+ * src/include/search.h:
+ * src/libs/libbib/index.cpp:
+ * src/preproc/refer/refer.cpp:
+ * src/utils/lkbib/lkbib.cpp:
+ * src/utils/lookbib/lookbib.cpp: Demote `verify_flag` from an
+ `int` to a `bool`, rename it to `do_verify`, use Boolean
+ instead of integer literals with it, and update call sites.
+
+ * src/libs/libbib/index.cpp: Rename `do_verify()` member
+ function to `get_invalidity_reason()` (it returns a string).
+ Demote `load()` from `int` to `bool`; do the same for `verify()`
+ and rename it to `is_valid()` as well. Use Boolean instead of
+ integer literals with them.
+ (index_search_item::is_valid, make_index_search_item): Update
+ call sites of renamed member functions.
+
+2021-09-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libbib/map.c (mapread): Compare return value of
+ `mmap()` to `MAP_FAILED` instead of `(char *)-1`. `MAP_FAILED`
+ is documented in POSIX Issue 5 a.k.a. SUSv2
+ <https://pubs.opengroup.org/onlinepubs/007908799/xsh/mmap.html>
+ {1997} and should be portable enough by now.
+
+2021-09-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Clamp negative tab stop positions to zero instead of
+ throwing an assertion failure.
+
+ * src/roff/troff/env.cpp (tab_stops::distance_to_next_tab):
+ Replace `assert` with clamping logic, ensuring that `lastpos`
+ can never be negative. While negative tab stop positions don't
+ make much sense (they result in zero horizontal motion), user
+ input like `.ta T -5` should never provoke an assertion failure.
+
+ (set_tabs): Throw range warning in additional scenario, viz., if
+ a repeating tab offset is negative.
+
+ Fixes <https://bugs.debian.org/990406>. Thanks to наб for the
+ report.
+
+2021-09-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Boolify `set_tabs` function.
+
+ * src/roff/troff/env.cpp (set_tabs): Demote local variables from
+ `int` to `bool` and give them predicate-like names.
+ - `first` -> `is_first_stop`
+ - `repeated` -> `is_repeating_stop`
+ Use Boolean instead of integer literals in assignments to them.
+
+2021-09-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Deprecate `OP` macro.
+
+ * tmac/an-ext.tmac (OP): Move implementation from here...
+ * tmac/an.tmac (OP): ...to here. Throw deprecation warning.
+ Throw style warning if wrong number of arguments given.
+
+ * tmac/groff_man.7.man.in (Description): Drop from introductory
+ macro summary.
+ (Description/Command synopsis macros): Move discussion from
+ here...
+ (Description/Deprecated features): ...to here. Explain why it's
+ deprecated.
+
+2021-09-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Make `ab` request quiet if given no arguments. The
+ `tm`, `tm1`, and `tmc` requests provide ample flexibility for
+ constructing diagnostic messages prior to an error exit, and
+ it's convenient to make `ab` itself quiet instead of saying
+ "User Abort." as Unix Version 7 troff did. Further, there is no
+ standardization across troffs regarding what `ab` should emit if
+ arguments are absent.
+
+ * src/roff/troff/input.cpp (abort_request): Do it.
+
+ * src/roff/groff/tests/ab_works.sh:
+ * src/roff/groff/groff.am (groff_TESTS): Test it.
+
+ * doc/groff.texi (Debugging, Implementation Differences):
+ * man/groff.7.man (Requests/Request short reference):
+ * man/groff_diff.7.man (Implementation differences): Document
+ it.
+
+ Fixes <https://savannah.gnu.org/bugs/?61070>. Thanks to Dave
+ Kemper for the discussion.
+
+2021-09-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Update exit status literals.
+
+ * src/roff/troff/div.cpp (top_level_diversion::begin_page):
+ * src/roff/troff/input.cpp (exit_troff, abort_request, do_error)
+ (fatal_with_file_and_line): Use standard C library preprocessor
+ symbols `EXIT_SUCCESS` and `EXIT_FAILURE` instead of 0 and 1
+ literals, respectively.
+
+2021-09-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Drop unused member function.
+
+ * src/roff/troff/token.h (class token): Drop unused `title`
+ member function. Its implementation was apparently removed in
+ the prehistory of our Git repository: see James Clark's
+ ChangeLog entry of 1990-09-06.
+
+2021-09-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Remove workaround for Cfront 1.2 bug.
+
+ * src/roff/troff/input.cpp (do_define_macro): Move `dot_symbol`
+ from to file to function local scope as originally intended.
+
+2021-09-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Rename parameter.
+
+ * src/roff/troff/input.cpp (token::usable_as_delimiter): Rename
+ parameter from `err` to `report_error` to be more communicative.
+
+2021-09-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Boolify members of `token` class.
+
+ * src/roff/troff/token.h (class token): Demote return type of
+ several member functions from `int` to `bool` and rename them.
+ - `backspace` -> `is_backspace`
+ - `delimiter` -> `usable_as_delimiter`
+ - `dummy` -> `is_dummy`
+ - `eof` -> `is_eof`
+ - `horizontal_space` -> `is_horizontal_space`
+ - `hyphen_indicator` -> `is_hyphen_indicator`
+ - `leader` -> `is_leader`
+ - `left_brace` -> `is_left_brace`
+ - `newline` -> `is_newline`
+ - `page_ejector` -> `is_page_ejector`
+ - `right_brace` -> `is_right_brace`
+ - `space` -> `is_space`
+ - `special` -> `is_special`
+ - `stretchable_space` -> `is_stretchable_space`
+ - `tab` -> `is_tab`
+ - `transparent_dummy` -> `is_transparent_dummy`
+ - `transparent` -> `is_transparent`
+ - `unstretchable_space` -> `is_unstretchable_space`
+ - `white_space` -> `is_white_space`
+ - `zero_width_break` -> `is_zero_width_break`
+ (class token): Drop 1991 comment anticipating that member
+ function `nspaces` could return "2" for a "double space"; this
+ was apparently never implemented.
+ (class token): Drop parameter names from declarations; the
+ prevailing style (familiar from Stroustrup) is not to use them.
+ (token::is_special): Simplify implementation.
+
+ * src/roff/troff/input.cpp (has_arg)
+ (token::usable_as_delimiter): Update definitions of above member
+ functions not defined in token.h.
+
+ * src/roff/troff/div.cpp (begin_page, space_request, need_space)
+ (output_saved_vertical_space, flush_output):
+ * src/roff/troff/env.cpp (fill, no_fill, center)
+ (right_justify, indent, temporary_indent, margin_character)
+ (number_lines, do_break_request, hyphen_word):
+ * src/roff/troff/input.cpp (next_file, do_overstrike)
+ (do_bracket, do_name_test, do_expr_test, do_zero_width)
+ (token::skip, has_arg, skip_line, empty_name_warning)
+ (non_empty_name_warning, do_get_long_name, process_input_stack)
+ (flush_pending_lines, decode_args, read_request)
+ (do_define_string, do_define_character, remove_character)
+ (do_define_macro, length_request, get_delim_number)
+ (get_line_arg, read_size, get_delim_name, do_register, do_width)
+ (read_title_parts, encode_char, do_special, device_request)
+ (output_request, skip_alternative, begin_alternative)
+ (nop_request, do_if_request, do_source, pipe_source)
+ (ps_bbox_request, tag, taga, do_terminal, do_translate)
+ (hyphenation_code, hyphenation_patterns_file_code, define_class)
+ (get_optional_char, check_missing_character, abort_request)
+ (copy_file, transparent_file, do_macro_source)
+ (charinfo_to_node_list, read_draw_node, read_color_draw_node):
+ * src/roff/troff/node.cpp (get_fontno)
+ (remove_font_special_character, bold_font):
+ * src/roff/troff/number.cpp (start_number, parse_term):
+ * src/roff/troff/reg.cpp (define_number_reg, alter_format):
+ Update call sites to use new names.
+
+ * src/roff/troff/input.cpp (token::usable_as_delimiter)
+ (read_draw_node): Return Boolean, not integer, literals.
+
+2021-09-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Clamp line and title lengths to device horizontal
+ resolution.
+
+ * src/roff/troff/env.cpp (line_length, title_length): Do it.
+
+ Fixes <https://savannah.gnu.org/bugs/?61116>.
+
+2021-09-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/env.cpp (do_hyphenation_patterns_file):
+ Refactor slightly. Demote `append` from `int` to `bool`.
+ (hyphenation_patterns_file, hyphenation_patterns_file_append):
+ Update call sites to use Boolean, not integer, literals.
+
+2021-09-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/hvunits.h:
+ * src/roff/groff/number.cpp: Mark `H0`, `V0` objects as `const`.
+
+2021-09-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/env.cpp (do_underline_special): Refactor
+ slightly.
+ - Rename `underline_spaces` -> `do_underline_spaces`.
+ - Demote it from an `int` to a `bool`.
+ - Use ternary operator and explicit character literals when
+ writing device control command instead of doing arithmetic
+ on a character literal.
+ - Update call sites to use Boolean literals.
+ - Relocate function to avoid forward reference.
+ - Mark function as static to eliminate external linkage.
+ Remove now-unnecessary prototype.
+
+2021-09-04 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Add "ms" footnote marker placement hook.
+
+ * tmac/s.tmac (FS-MARK): New macro; define as no-op, by default.
+ (@FS): Invoke FS-MARK as first action, allowing caller to "hook" it.
+
+2021-09-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/env.cpp (distribute_space): Refactor slightly.
+ - Rename `force_reverse` to `force_reverse_node_list`.
+ - Rename `reverse` to `do_reverse`.
+ - Demote both of the above from `int` to `bool`.
+ - Use Boolean literals with them.
+ - Add assertions to enforce positive values of `nspaces` and
+ `desired_space`.
+ - Remove now-redundant test for `nspaces` being positive.
+ - Add explanatory comments.
+ (environment::wrap_up_field): Update call sites of
+ `distribute_space` when non-default value of
+ `force_reverse_node_list` is supplied.
+
+2021-09-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Don't adjust nonadjustable lines. This means that the
+ direction from which an output line in adjustment mode "b" (or
+ its "n" synonym) is filled with supplemental space is not
+ changed if that output line does not require adjustment. This
+ will result in whitespace changes to documents using that
+ adjustment mode, and these changes will be plainly visible on
+ low-resolution output devices like terminals.
+
+ To illustrate, in the following "A" means an output line
+ requiring adjustment; "F" a line that is "full" and does not;
+ and "L" and "R" indicate distribution of adjustment spaces from
+ the left and right, respectively.
+
+ groff 1.22.4 groff 1.23.0
+ ------------ ------------
+ A L A L
+ A R A R
+ F L F R
+ A R A L
+
+ * src/roff/troff/env.cpp (distribute_space): Return early if
+ either the amount of desired space to be distributed or the
+ count of space nodes in the output line to distribute it among
+ is zero.
+
+ * tmac/tests/an_TH-repairs-ad-damage.sh: Update test to expect
+ space to be distributed differently.
+
+ Fixes <https://savannah.gnu.org/bugs/?61089> and
+ <https://savannah.gnu.org/bugs/?60673>.
+
+2021-09-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Skip core-dump-checking test if a core file already exists.
+
+ * src/roff/groff/tests/regression_savannah_59202.sh: Skip test
+ if a core dump is already present.
+
+2021-09-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Add regression test for Savannah #60189.
+
+ * src/roff/groff/tests/break_zero-length_output_line_sanely.sh:
+ Do it.
+ * src/roff/groff/groff.am (groff_TESTS): Run test.
+
+2021-08-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Tweak diagnostic message.
+
+ * src/roff/troff/env.cpp (environment::environment): Use
+ terminology more rigorously in diagnostic.
+
+2021-08-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Fix code style nit.
+
+ * src/libs/libgroff/errarg.cpp (errprint): Replace `assert(0)`
+ with a meaningful predicate.
+
+2021-08-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Demote `need_space` to Boolean.
+
+ * src/libs/libgroff/error.cpp (do_error_with_file_and_line):
+ Demote local integer `need_space` and its assignments to `bool`.
+
+2021-08-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Boolify `font::load()` and `font::load_desc()`
+ return values.
+
+ * src/include/font.h (font::load, font::load_desc):
+ * src/libs/libgroff/font.cpp (font::load, font::load_desc): Do
+ it.
+
+2021-08-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (TRADITIONAL_CPP): Update `AC_MSG_CHECKING`
+ argument to refer to "pre-ISO C90 syntax" instead of a
+ "traditional" preprocessor. Call `AC_MSG_ERROR` (aborting
+ configuration) if the check (for pre-C90 transformation)
+ succeeds. We thus withdraw support for such superannuated
+ {"Reiser"} C preprocessors.
+
+2021-08-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Un-indirect token concatenation through macro.
+
+ * src/include/itable.h:
+ * src/include/ptable.h: Do it.
+
+2021-08-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Drop support for `TRADITIONAL_CPP`. This means a C
+ preprocessor that does not support the ANSI C89/ISO C90
+ token concatenation operator "##".
+
+ * src/include/itable.h:
+ * src/include/ptable.h: Do it.
+
+ * Makefile.am: Undocument preprocessor symbol.
+
+2021-08-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Drop `a_delete` preprocessor wrapper for the
+ `delete` operator. It has been rendered unnecessary by the
+ removal of support for ancient C++ compilers.
+
+ * src/include/lib.h (a_delete): Drop symbol definition.
+
+ * src/devices/grohtml/output.cpp (word::~word):
+ * src/devices/grohtml/post-html.cpp (char_block::char_block)
+ (assert_state::~assert_state, assert_state::add)
+ (assert_state::close, replace_negate_str):
+ * src/devices/grops/ps.cpp (ps_font::ps_font)
+ (subencoding::subencoding, ps_printer::define_encoding)
+ (ps_printer::encode_fonts):
+ * src/devices/grops/psrm.cpp (resource_manager::document_setup)
+ (resource_manager::supply_resource):
+ * src/devices/grotty/tty.cpp (tty_printer::tty_color)
+ (tty_printer::tty_printer, tty_printer::color_to_idx)
+ (tty_printer::add_char):
+ * src/include/itable.h (ITABLE(T)::~ITABLE(T))
+ (ITABLE(T)::define):
+ * src/include/ptable.h (PTABLE(T)::~PTABLE(T))
+ (PTABLE(T)::define):
+ * src/libs/libbib/index.cpp
+ (index_search_item::~index_search_item, make_index_search_item,
+ index_search_item_iterator::index_search_item_iterator,
+ index_search_item::get_tag, index_search_item::munge_filename,
+ index_search_item::search):
+ * src/libs/libbib/linear.cpp (bmpattern::~bmpattern)
+ (file_buffer::file_buffer, file_buffer::load)
+ (linear_searcher::linear_searcher)
+ (linear_searcher::~linear_searcher):
+ * src/libs/libbib/search.cpp
+ (search_list_iterator::search_list_iterator)
+ (search_item::search_item):
+ * src/libs/libdriver/input.cpp (IntArray::~IntArray)
+ (IntArray::append, StringBuf::~StringBuf, StringBuf::append)
+ (get_integer_arg, parse_x_command, do_file):
+ * src/libs/libdriver/printer.cpp (printer::printer)
+ (printer::load_font, text_file::~text_file, text_file::next)
+ (font::~font, font_widths_cache::~font_widths_cache)
+ (font:alloc_ch_index, font::extend_ch, font::compact)
+ (font::load_desc):
+ * src/libs/libgroff/fontfile.cpp (font::open_file):
+ * src/libs/libgroff/relocate.cpp (searchpath, searchpathext)
+ (set_current_prefix):
+ * src/libs/libgroff/searchpath.cpp (search_path::search_path)
+ (search_path::command_line_dir, search_path::open_file)
+ (search_path::open_file_cautious):
+ * src/libs/libgroff/string.cpp (sfree, srealloc)
+ (string::remove_spaces):
+ * src/libs/libgroff/symbol.cpp (symbol::symbol, concat):
+ * src/libs/libgroff/tmpfile.cpp (temp_init::temp_init)
+ (xtmpfile_list_init::~xtmpfile_list_init, xtmpfile):
+ * src/preproc/eqn/box.cpp (set_gfont, set_grfont, set_gbfont)
+ (box_list::append, box_list::~box_list):
+ * src/preproc/eqn/delim.cpp (make_delim_box)
+ (delim_box::~delim_box):
+ * src/preproc/eqn/eqn.ypp (number):
+ * src/preproc/eqn/lex.ypp (file_input::~file_input)
+ (argument_macro_input::~argument_macro_input):
+ * src/preproc/eqn/pile.ypp (matrix_box::~matrix_box)
+ (matrix_box::append):
+ * src/preproc/eqn/special.cpp (special_box::~special_box):
+ * src/preproc/eqn/text.ypp (set_char_type):
+ * src/preproc/html/pre-html.cpp (get_line, scanArguments):
+ * src/preproc/pic/object.cpp (output::~output)
+ (output::set_args, text_item::~text_item)
+ (object_spec::~object_spec, command_object::~command_object)
+ (line_object::~line_object):
+ * src/preproc/pic/pic.ypp (placeless_element, reset_variables)
+ (print_args, text_expr, object_spec, text, sprintf_args, path):
+ * src/preproc/refer/command.cpp (input_item::~input_item)
+ (input_item::peek_char):
+ * src/preproc/refer/label.ypp (lookup_label):
+ * src/preproc/refer/refer.cpp (store_citation, store_reference):
+ * src/preproc/tbl/main.cpp (format::add_rows, format::~format):
+ * src/preproc/tbl/table.cpp (block_entry::~block_entry)
+ (table::~table, table::allocate):
+ * src/roff/groff/groff.cpp (possible_command::~possible_command)
+ (possible_command::clear_name):
+ * src/roff/troff/column.cpp
+ ((justification_spec::~justification_spec)
+ (justification_spec::append):
+ * src/roff/troff/dictionary.cpp (dictionary::lookup):
+ * src/roff/troff/env.cpp (override_sizes, tab_stops::to_string)
+ (hyphen_word, hyphen_trie::insert_hyphenation):
+ * src/roff/troff/input.cpp (read_long_escape_name, token::next)
+ (do_get_long_name, temp_iterator::~temp_iterator)
+ (get_delim_name, pipe_source, read_string, pipe_output)
+ (system_request, open_mac_file, do_macro_source)
+ (do_register_assignment, do_string_assignment, read_draw_node)
+ (copy_mode_error):
+ * src/roff/troff/node.cpp (troff_output_file::set_font)
+ (troff_output_file::~troff_output_file, draw_node::is_tag)
+ (grow_font_table, font_family::~font_family)
+ (font_family::make_definite):
+ * src/utils/hpftodit/hpftodit.cpp (name_list::~name_list)
+ (read_map):
+ * src/utils/indxbib/indxbib.cpp (main, get_cwd):
+ * src/utils/tfmtodit/tfmtodit.cpp (tfm::~tfm, tfm::load): Port
+ uses of `a_delete` to `delete[]`.
+
+2021-08-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Drop `ad_delete` preprocessor wrapper for the
+ `delete` operator. It has been rendered unnecessary by the
+ removal of support for ancient C++ compilers.
+
+ * src/include/lib.h (ad_delete): Drop symbol definition.
+
+ * src/preproc/pic/object.cpp (graphic_object::print_text):
+ * src/preproc/refer/ref.cpp (reference::reference)
+ (reference::merge, reference::insert_field)
+ (reference::delete_field):
+ * src/preproc/tbl/main.cpp (format::add_rows): Port uses of
+ `ad_delete` to `delete[]`.
+
+2021-08-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_ARRAY_DELETE): Update `AC_MSG_CHECKING`
+ argument to refer to "ISO C++98" instead of "ANSI". Call
+ `AC_MSG_ERROR` (aborting configuration) if the check fails.
+
+2021-08-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Drop support for `ARRAY_DELETE_NEEDS_SIZE`.
+
+ * src/include/lib.h [ARRAY_DELETE_NEEDS_SIZE]: Drop preprocessor
+ conditional branch. This abandons support for certain pre-ISO
+ C++98 compilers. (According to a now-removed comment, unsized
+ array deletion was documented in "ARM", meaning _The C++
+ Annotated Reference Manual_, published in 1989.)
+
+ * Makefile.am: Undocument preprocessor symbol.
+
+2021-08-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Drop redefinition of `INT_MIN`.
+
+ * src/include/lib.h: Drop redefinition of `INT_MIN`. It was
+ motivated by a bug in the AT&T C++ compiler (cfront), version
+ 2.0, released in June 1989. Implementations have had 30 years
+ to get this right; assume that they have.
+
+ * PROBLEMS: Drop corresponding item.
+
+2021-08-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Drop long-dead `COOKIE_BUG` logic.
+
+ * src/libs/libgroff/new.cpp (operator new, operator delete):
+ Drop preprocessor conditional branches on the `COOKIE_BUG`
+ symbol. This was de-documented, and an autoconf check for its
+ necessity removed, way back in groff 1.10 (November 1995). It
+ was relevant only to GCC from versions 2.0 to 2.2.2 (all 1992).
+
+2021-08-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Refactor `font::scan_papersize()`.
+
+ * src/libs/libgroff/font.cpp (font::scan_papersize): Ensure
+ successful return value of `fgets()` before attempting to parse
+ string for paper format. Convert `test_file` to Boolean and
+ rename to `attempt_file_open`. Quiets GCC `-Wunused-result`
+ warning.
+
+2021-08-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tests]: Apply naming convention.
+
+ * tmac/tests/e_footnotes_work_with_columns.sh: Rename from...
+ * tmac/tests/e_footnotes-work-with-columns.sh: ...to this.
+ * tmac/tmac.am (tmac_TESTS): Update.
+
+2021-08-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an.tmac (IP): Make code more accessible by using a
+ Boolean operator rather than an arithmetic one (assembly
+ language programmers are comfortable with the interchangeability
+ of subtraction and comparison, but not everyone is).
+
+2021-08-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ groff(7): Document more escapes.
+
+ * man/groff.7.man (Escape short reference): Document
+ `\[charNNN]`, `\[uNNNN]`, `\[uNNNN_NNNN...]` escape sequences.
+ Revise descriptions of `\O0` and `\O1` escape sequences.
+ Document `\O2`, `\O3`, `\O4`, and `\O5` escape sequences.
+
+2021-08-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ groff(7): Fix bug in `\?` escape rendering.
+
+ * man/groff.7.man (ESC?): Fix bug in page-private macro: the
+ question mark that ends this uniquely-syntaxed escape sequence
+ was not shown with the mandatory escape character before it.
+ Problem dates back at least to commit 41b0e794, 19 February
+ 2007, but possiby to f790bc7a9, 6 January 2002.
+
+2021-08-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [docs]: Elaborate macro definition discussion.
+
+ Fixes <https://savannah.gnu.org/bugs/?57944>. Thanks to Dave
+ Kemper for the report.
+
+2021-08-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tests]: Make robust against $GROFF_TYPESETTER settings.
+
+ * src/roff/groff/tests/\
+ use_point_size_escape_with_single_digit_arg.sh:
+ * src/roff/nroff/tests/verbose_option_works.sh:
+ * tmac/tests/s_IP-indents-using-paragraph-type-size.sh: Export
+ an empty $GROFF_TYPESETTER to the environment.
+
+ Fixes <https://savannah.gnu.org/bugs/?60140>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2021-08-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Treat an empty $GROFF_TYPESETTER as unset.
+
+ * src/libs/libgroff/device.cpp (device_init::device_init): Test
+ both returned pointer from `getenv()` and, if that's not null,
+ the first character of the string for nullity before assigning
+ it to `device`.
+
+ Fixes <https://savannah.gnu.org/bugs/?61068>.
+
+2021-08-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff]: Rename font class member variable.
+
+ * src/include/font.h (font class): Rename `unscaled_charwidths`
+ member variable to `use_unscaled_charwidths`: since it is a
+ Boolean, make it read more like a logical predicate.
+
+ * src/libs/libgroff/font.cpp (font::get_width, font::load_desc):
+ * src/libs/libgroff/fontfile.cpp (font class): Update
+ initialization and assignments.
+
+2021-08-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (get_copy): Demote integer arguments
+ to Booleans and use Boolean literals for default values. Rename
+ `defining` to `is_defining`.
+ (get_char_for_escape_name, do_define_macro): Update call sites
+ that use non-default arguments to use Boolean literals and
+ comments to document what's being requested.
+
+2021-08-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (DOC_GROFF_ONLY): Stop running groff in unsafe
+ mode; no documents (in _this_ directory) appear to require it.
+
+2021-08-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grn]: Fix code style issues.
+
+ * src/preproc/grn/hgraph.cpp:
+ * src/preproc/grn/hpoint.cpp:
+ * src/preproc/grn/main.cpp:
+ * src/preproc/grn/hdb.cpp: Drop use of `register` storage class.
+
+ Fixes <https://savannah.gnu.org/bugs/?57733>. Thanks to Bjarni
+ Ingi Gislason for the report and a suggested patch.
+
+ * src/preproc/grn/hgraph.cpp (len, HGPrintElt, picurve):
+ * src/preproc/grn/hdb.cpp (DBRead): Wrap long lines.
+
+ * src/preproc/grn/hgraph.cpp: Rename function from
+ `Paramaterize` to `Parameterize`.
+ (HGCurve): Update call site.
+
+ * src/preproc/grn/main.cpp (add_file): Drop redundant cast in
+ `realloc()` call.
+ (conv, interpret): Use standard English in diagnostic messages.
+
+2021-08-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/grn/hdb.cpp: Perform more input validation.
+ Improve diagnostics by taking advantage of libgroff
+ infrastructure and tracking the line number of the input file.
+ Add global `lineno`.
+ (DBRead): Increment `lineno` after reading newlines from input.
+ Call `error_with_file_and_line()` instead of `error()`. If
+ input reports a negative length for the text (string) to follow
+ in the file, exit with a fatal diagnostic. Check for EOF while
+ reading text string.
+ (DBGetType): Convert `fprintf()` call for warning diagnostic to
+ `warning_with_file_and_line()`.
+ (DBRead, DBGetType): Add contextual information to diagnostic
+ messages.
+
+ Fixes <https://savannah.gnu.org/bugs/?61043>. Thanks to
+ Savannah user eqkws for the report.
+
+2021-08-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/grn/main.cpp (usage): Update usage message.
+
+2021-08-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grn]: Add and use `malloc()` wrapper.
+
+ * /src/preproc/grn/main.cpp (grnmalloc): New function takes
+ argument of `size_t` type and constant string argument to
+ describe what is being allocated. Return non-null pointer from
+ `malloc()`, otherwise call `fatal()`, describing what was being
+ allocated and the problem reported by the system.
+
+ * src/preproc/grn/hdb.cpp (DBCreateElt):
+ * src/preproc/grn/hpoint.cpp (PTMakePoint):
+ * /src/preproc/grn/main.cpp (main, interpret): Migrate
+ `malloc()` callers to `grnmalloc()`.
+
+2021-08-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/grn/hdb.cpp (DBRead): Check return value of
+ `sscanf()` and call `fatal()` if no conversions succeeded. The
+ blithe discard of a useful return value is bad enough, but this
+ one took place inside a do-while such that it could loop
+ forever trying fruitlessly to parse two doubles out of strings
+ that didn't contain them (the loop never checked the EOF status
+ of the file stream from which it was reading, and relied on
+ `fgets()` to keep advancing the stream pointer). Discovered
+ while root-causing Savannah #61043.
+
+2021-08-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Resolve compiler warnings relating to format string security and
+ ISO C++98 conformance.
+
+ * src/preproc/eqn/delim.cpp (define_extensible_string):
+ * src/preproc/pic/pic.ypp (do_sprintf): Use #pragma to silence
+ GCC "format-nonliteral" warning and explain why our usage is
+ safe in a comment.
+
+ * src/preproc/preconv/preconv.cpp (detect_file_encoding): Use
+ `l` modifier to `%u` `fprintf()` conversion instead of `z`, and
+ cast return values of `size_t` to unsigned long; "ISO C++98
+ does not support the ‘z’ gnu_printf length modifier" (it doesn't
+ support `ll` either). N.B. this is debugging output only.
+
+ * src/roff/groff/groff.cpp (synopsis):
+ * src/roff/troff/input.cpp (usage): Repeat variadic argument for
+ `%s` conversion in `fprintf()` call because "ISO C++98 does not
+ support %n$ operand number formats".
+
+ * src/roff/troff/env.cpp: Initialize adjustment and hyphenation
+ mode enums without commas at the end of the enumeration lists.
+
+2021-08-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Clean up the interface between `an-footer` and `BT`, and
+ HTML header and footer suppression generally. Move
+ responsibility for checking the `ps4html` register from the
+ latter to the former. This is not something a `BT` redefiner
+ {see groff_man(7)} should have to worry about.
+
+ * tmac/an.tmac (BT): Drop test of `ps4html` register and early
+ return.
+ (an-header, an-footer): Return immediately if
+ `an-suppress-header-and-footer` is true. Remove conditional on
+ `an-is-output-html`.
+ (initialization): Define `an-suppress-header-and-footer`
+ register; true if `an-is-output-html` is true, or if `ps4html`
+ is defined.
+
+2021-08-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/html/pre-html.cpp (get_resolution): Unbrace a
+ single-statement `while` loop per prevailing coding style. Add
+ comments noting how we aren't parsing DESC files _precisely_ as
+ our documentation specifies.
+
+2021-08-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Convert font class `int` members to `bool` where appropriate.
+
+ * src/include/font.h (font class): Demote integers to Booleans
+ and use Boolean literals where possible. Rename some member
+ variables to look like logical predicates.
+ - contains()
+ - is_special()
+ - has_ligature()
+ - tcommand -> has_tcommand
+ - unscaled_charwidths
+ - pass_filenames
+ - use_charnames_in_special
+ - is_unicode
+ - special (private)
+ * src/libs/libgroff/font.cpp (font::font): Construct object
+ using Boolean literal.
+ (font::contains):
+ (font::is_special):
+ (font::has_ligature): Convert return type to `bool`.
+ (font::load):
+ (font::load_desc): Assign to member variables using Boolean
+ literals.
+ * src/libs/libgroff/fontfile.cpp: Initialize appropriate globals
+ using `bool` type and Boolean literals.
+ * src/roff/troff/troff.h:
+ * src/roff/troff/input.cpp (main):
+ * src/roff/troff/node.cpp (troff_output_file::put_char_width):
+ Rename `tcommand_flag` to `device_has_tcommand` to suggest a
+ logical predicate, and to emphasize the formatter's concern with
+ what the output device can accept in the intermediate output
+ language.
+ * src/roff/troff/input.cpp: Initialize `device_has_tcommand`
+ global using `bool` type and Boolean literal.
+
+2021-08-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [me]: Clarify breadth of application of `ll` macro.
+
+ * doc/meref.me: Document application of .ll macro only to the 3
+ environments that me(7) uses, not any the user might create.
+ * tmac/e.tmac (@C, xl, ll): Update comments.
+
+ Fixes <https://savannah.gnu.org/bugs/?55060>.
+
+2021-08-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Add regression test for Savannah #58736.
+
+ * tmac/tests/e_footnotes_work_with_columns.sh: Test it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2021-08-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac (bc): Fix problem with multiple columns on long
+ pages. Space to the next page location trap, not 24 inches.
+ Thanks to Dave Kemper and Bjarni Ingi Gislason for help tracking
+ this bug down.
+
+ Fixes <https://savannah.gnu.org/bugs/?55081>.
+
+2021-08-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Add regression test for Savannah #55081.
+
+ * tmac/tests/e_columns-work-on-long-pages.sh: Test it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2021-08-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * man/groff.7.man (Localization): Add section.
+
+2021-08-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/cs.tmac:
+ * tmac/de.tmac:
+ * tmac/fr.tmac:
+ * tmac/it.tmac:
+ * tmac/sv.tmac: Update ms package localization to use an
+ appropriate hyphenation mode for the `HY` register (the
+ mode for the pattern files, plus 2 as is traditional in ms).
+
+2021-08-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac (1c): Place comment escape sequence immediately
+ after macro argument. (When redefining a request, one needs to
+ remember that request arguments are not parsed exactly as macro
+ arguments are.) Quiets "-w tab" warning.
+
+2021-08-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [me]: Fix misleading documentation claim; gremlin(1) pictures
+ cannot be included directly; they must be preprocessed with
+ grn(1).
+
+ * doc/meref.me:
+ * tmac/groff_me.7.man: Replace "gremlin" with "grn".
+
+2021-08-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/groff_me.7.man: Document `n1` and `n2` macros.
+
+2021-08-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [me]: Fix PS/n1 combination diagnostic spew and apparent logic
+ error.
+
+ * tmac/e.tmac (@h): Place comment escape sequence immediately
+ after macro argument. (When redefining a request, one needs to
+ remember that request arguments are not parsed exactly as macro
+ arguments are.)
+ (n2): Prefix with `do` requests using long register names.
+ (n2): Add macro-local register `|l` to store length of first
+ argument. Don't attempt to extract a substring beyond the
+ bounds of its source, which produces a warning diagnostic.
+ (&&): Define no-op macro for use as end macro in nested macro
+ definition.
+ (PS): Fix unbalanced-else diagnostic by changing `if` to `ie`.
+ (PS): Initialize `PS_nm_cnt` register to 0 instead of relying on
+ implicit definition.
+ (PS): Prefix with `do` definition of long macro name.
+ (PS): Indent call of end macro.
+ (PS): Add comment after escaped space.
+ (PS, PF): Prefix with `do` call of long macro name.
+
+ Fixes <https://savannah.gnu.org/bugs/?61019>.
+
+2021-08-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/grog.pl (do_line): Recognize `n1` and `n2` as
+ characteristic me(7) macros.
+
+2021-08-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/groff_me.7.man: Document GF, IE, IF, IS, and PF macros.
+
+2021-08-08 Dave Kemper <saint.snit@gmail.com>
+
+ * tmac/e.tmac: Rename `PE` to `PF` but remove vertical spacing.
+ (PE): New `PE` calls `PF` and then spaces as old `PE` did.
+
+ Fixes <https://savannah.gnu.org/bugs/?60479>.
+
+2021-08-06 Dave Kemper <saint.snit@gmail.com>
+
+ * doc/meref.me: Improve documentation of image-inclusion macros.
+
+ Fixes <https://savannah.gnu.org/bugs/?60478>.
+
+2021-08-06 Dave Kemper <saint.snit@gmail.com>
+
+ GNU pic recognizes two possible endings of a pic block: .PE or
+ .PF. This fact was documented in doc/pic.ms but not in the pic
+ man page. The minimal pic implementation provided by pic.tmac
+ also did not include a .PF definition.
+
+ * src/preproc/pic/main.cpp (main): Add dummy definition of `PF`
+ macro.
+ * tmac/pic.tmac (PF): Add macro that performs indentation only.
+ (PE): Call PF for indentation.
+
+ * doc/pic.ms (Interface to [gt]roff/How Scaling is Handled):
+ * src/preproc/pic/pic.1.man (Description, Options): Mention `PF`
+ in addition to `PS` and `PE`.
+
+ Fixes <https://savannah.gnu.org/bugs/?60504>.
+
+2021-08-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/refer-ms.tmac:
+ * tmac/s.tmac (fn@init, @PP): Rename strings
+ `fn@sup-{start,end}` to `fn@mark-{start,end}`. This makes it
+ more clear that the strings are brackets for the footnote
+ marker, and not so much to do with the note text. Further, in
+ nroff mode, they aren't superscripts at all, but bracket glyphs.
+
+2021-08-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/refer/refer.1.man (Examples): Add section.
+
+ Addresses part of <https://savannah.gnu.org/bugs/?57667>.
+
+2021-08-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/refer-ms.tmac: Use `fn@sup-{start,end}` instead of
+ `par@sup-{start,end}` when setting refer(1) citation labels.
+ This improves the appearance of the default labels on nroff
+ devices. Continues commit caeede07, 1 May.
+
+2021-08-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tman/an-ext.tmac (EX, EE): Stop manipulating hyphenation.
+ It's redundant since disabling fill mode already prevents
+ automatic breaking, and therefore automatic hyphenation.
+ * tmac/groff_man.7.man.in (Description/Document structure
+ macros) <EX, EE>: Update documentation.
+
+2021-08-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/grog.pl: Update authorship credits. I appear
+ to have removed or refactored all of the "device" (recte: macro
+ package) inference logic adapted from Ralph Corderoy's grog.sh;
+ see commit 3617f42048f54cc3f0adc282ee3b9e481c75ebd5, 13 June
+ 2014.
+
+2021-07-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/grog.pl: Refactor through relocation and
+ renaming. Move several global objects into subroutines.
+ - `@request` -> `&do_line`
+ - `@macro_ms`, `@macro_man`, `@macro_man_or_ms` ->
+ `&infer_man_or_ms_package`
+ - `@main_package` -> `&construct_command`
+ Rename some objects for clarity.
+ - `%Groff` -> `%score`
+ - `@filespec` -> `$input_file`
+ Delete unused object.
+ - `@standard_macro`
+ Add comments.
+
+2021-07-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/grog.pl (do_line): When matching macro/request
+ names, accept any non-whitespace character (Perl: \S) instead of
+ just a word-constituent character (Perl: \w), since roff
+ identifiers can contain unusual characters (refer(1) and
+ groff_me(7) illustrate some real-world cases).
+
+2021-07-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/grog.pl: Refactor macro package inference.
+ - Stop manually populating `Groff` hash. (It's itching for a
+ rename.)
+ - Stop calling now-dead subroutine `infer_macro_packages`.
+ (do_line): Always store the names of all macros called to the
+ `Groff` hash, incrementing it. Now it's a proper scoreboard.
+ Populate `inferred_main_package` from here upon encountering
+ characteristic (i.e., uniquely named) macros of each package.
+ Bug fix: drop "SP" from list of characteristic mom(7) macros;
+ it's shared with mm(7).
+ (infer_man_or_ms_package): Update comment. Return 0 (false) if
+ document appears to be "raw", using no full-service macro
+ package.
+ (infer_macro_packages): Delete; do_line() does this work.
+
+2021-07-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/grog.pl: Refactor preprocessor inference.
+ - Add new list, `inferred_preprocessor`.
+ - Drop preprocessor-related keys from `Groff` hash.
+ - Drop scalar `inside_tbl_table`.
+ (do_line): Set up hash `preprocessor_for_macro`. Detect
+ preprocessor macros the way the preprocessors do, explained in a
+ comment. Respect AT&T compatibility mode when doing so. Build
+ list of inferred preprocessors. This replaces the extensive and
+ gaseous series of `if` statements that manipulated the `Groff`
+ hash.
+ (infer_preprocessors): Completely replace. Set up a hash
+ `option_for_preprocessor` mapping preprocessor names to groff
+ options (where applicable). Append to `command` and
+ `preprocessor` lists as appropriate. Sort the preprocessor
+ options so they don't move around in the argument list depending
+ on the order of their macros' appearance in the input.
+
+ * src/utils/grog/tests/smoke-test.sh: Update test cases to
+ expect preprocessor options to show up in sorted order.
+
+2021-07-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/grog.pl: Drop dead code. Delete global
+ hash `preprocs_tmacs`, unused since commit b0de53c9, 30 June.
+
+2021-07-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grohtml]: Fix code nit.
+
+ * src/preproc/html/pre-html.cpp (get_image_generator):
+ Type-qualify `keyword_len` as `const` to encourage the compiler
+ to compute this value (the length of a string literal) at build
+ time.
+
+2021-07-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Slightly refactor.
+
+ * src/roff/troff/node.cpp: Add static `image_filename_len` to
+ store length of cached image file name, so we don't wastefully
+ recompute its length every time one is re-used.
+ (suppress_node::tprint): Compute image file name length only
+ when saving a new image file name. Use saved length in later
+ expressions.
+ (min): Drop unused inline function.
+
+2021-07-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Fix regression (breaking important pdfmark/pdfroff
+ features) caused by my commit
+ e876d4bfd193abb9a7d1fb6e76519349bded482a, 27 July. An empty
+ image file name is in fact semantically valid when writing a
+ bounding box; pdfmark uses such boxes to frame hyperlinks.
+ Avoid null pointer dereference by initializing `image_filename`
+ to an empty string literal. Thanks to Tadziu Hoffman and Keith
+ Marshall for their patient explanations.
+
+2021-07-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Refactor some internal functions.
+
+ * src/roff/troff/node.cpp: Rename two functions that have only
+ one caller.
+ - get_reg_int -> get_register
+ - get_reg_str -> get_string
+ We now have:
+ (get_register, get_string): Use `assert()` aggressively because
+ these are deeply internal and validation is imperative. Get rid
+ of diagnostic messages (one of which perpetuated the dubious
+ "number register" nomenclature) accordingly.
+ (fetch_register): Also rename `prev_value`, misleadingly
+ specific and seemingly copy-and-pasted out of a context where an
+ auto-increment or -decrement might have been applied. It's just
+ the `value`.
+ (suppress_node::tprint): Update call site.
+
+2021-07-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Refactor `get_value` member functions. Given their
+ names and popular "getter/setter" paradigms from many OO
+ languages, the return type is misleading. Change it from `int`
+ to `bool` since it returns only a success/failure status and
+ modifies an argument (passed by reference) to deliver the
+ requested data.
+
+ * src/roff/troff/reg.h (reg, variable_reg):
+ * src/roff/troff/div.cpp (page_offset_reg, page_length_reg)
+ (vertical_position_reg, high_water_mark_reg)
+ (distance_to_next_trap_reg, page_number_reg, no_space_mode_reg):
+ * src/roff/troff/env.cpp (int_env_reg, vunits_env_reg)
+ (hunits_env_reg, horizontal_place_reg):
+ * src/roff/troff/input.cpp (writable_lineno_reg):
+ * src/roff/troff/reg.cpp (reg, number_reg, variable_reg): Update
+ class and member function definitions to reflect the new type.
+ Update member function definitions to return appropriate Boolean
+ literals instead of 0 and 1.
+
+2021-07-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grohtml]: Fix Savannah #60981. Refactor device description
+ file handling and make it more robust. Make pre-grohtml's
+ -F option work as documented and honor device description file
+ semantics documented in groff_font(5).
+
+ * src/preproc/html/pre-html.cpp: Store partial filespecs of HTML
+ and PostScript device files in constant strings.
+ (get_resolution): Initialize `res` to zero. Only `free()` the
+ pointer `pathp` if `open_file()` succeeded (populating it).
+ Stop checking for valid `sscanf()` conversions of an integer to
+ store in `res`, and don't return early. Instead process the
+ whole DESC file; per our Texinfo manual and groff_font(5),
+ "Later entries in the file ... override previous values."
+ (get_image_generator): Add new function, paralleling
+ `get_resolution()`, replacing open-coded logic in `main()`.
+ Only the body of the `while` loop significantly differs.
+ Instead of using `sscanf`, process the input character by
+ character matching the keyword and {1,} spaces or tabs
+ after it. Whatever follows in `linebuf` must be the program
+ name.
+ (imageList::createPage): Add `assert()` to cause failure if an
+ empty image generator program gets this far, because it creates
+ repeated messes if it does. (Something isn't checking exit
+ statuses.)
+ (main): Condense `image_gen` collection to a function call, a
+ null pointer check, and a fatal diagnostic. Add a sanity check
+ and a fatal diagnostic if the PostScript resolution is garbage.
+ {It's initialized to -1 and `get_resolution()` will return 0 if
+ it doesn't find one.}
+
+ Fixes <https://savannah.gnu.org/bugs/?60981>.
+
+2021-07-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grohtml]: Delete or rename `debug` symbols to avoid clash with
+ new `debug` function in libgroff.
+
+ * src/preproc/html/pre-html.cpp: Update a comment to refer to
+ "debugging" mode. Rename static global from `debug` to
+ `debugging`.
+ (html_system, imageList::createPage, imageList::createImage,
+ print_args, char_buffer::do_html, char_buffer::do_image,
+ scanArguments): Update uses of static global.
+
+ * src/preproc/html/pushback.cpp:
+ * src/preproc/html/pushback.h: Delete unused `debug` member
+ variable.
+
+2021-07-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/nroff/nroff.sh: Fix straggling use of `$1`, which
+ might not have a clear meaning in some shells after being
+ shifted (what if we just shifted the last argument?). Also
+ `continue` after processing a (groff) option argument, as we
+ should make no attempt to parse it.
+
+2021-07-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (do_suppress): Recast diagnostic
+ messages for clarity, to communicate in terms of what the
+ escape sequence _is_, and to quote literals expected as input.
+ * src/roff/troff/node.cpp (suppress_node::tprint): Recast
+ diagnostic to prevent misinterpretation of image "description"
+ as being HTML IMG tag alt text or something like that.
+ Unfortunately, the new language speaks in terms of internal
+ implementation details ("grohtml-info"), but at least that way
+ it's easier for a user to decide if they care about it.
+
+2021-07-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Avoid using sprintf() with user-controlled format
+ string.
+
+ * src/preproc/html/pre-html.cpp (makeFileName): Add comment
+ noting need for implementation synchrony between this function,
+ which generates \O5 escape sequences, and troff's
+ suppress_node::tprint member function, which interprets them.
+ * src/roff/troff/node.cpp: Rename 2 static globals for clarity.
+ - `last_image_filename` -> `image_filename`
+ - `last_image_id` -> `subimage_counter`
+ (suppress_node::tprint): Set up the buffer for image file name
+ to be written using a constant rather than an embedded literal.
+ Unconditionally initialize the buffer with a string terminator,
+ so there is no chance of a read from uninitialized storage.
+ Drop unused code involving `tem`. Drop stale comments. Clarify
+ comment: an `image_filename` doesn't _always_ contain a format
+ string, only sometimes. Replace use of `sprintf` with manual
+ construction of a new image filename string. There are two
+ cases, one where a format string {presently "%d"} is present,
+ and one where it is not. If it is present, locate it
+ {`percent`}. This means a limited/bounded image ("subimage") is
+ being processed; increment the subimage counter. Write a new
+ image file name preserving the parts before and after "%d" (the
+ "prefix" and "suffix", and replacing only the middle, using
+ `sprintf` with the subimage counter and the (string literal)
+ format. Be mindful of string bounds and memory allocation,
+ issuing diagnostics or aborting as necessary. If the image file
+ name does _not_ contain a format string, but needs only to be
+ copied, do that (`strcpy`), again instead of using `sprintf`.
+
+ Fixes <https://savannah.gnu.org/bugs/?60977>.
+
+2021-07-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grohtml]: Fix Savannah #60971.
+
+ * src/preproc/html/pre-html.cpp (makeFileName): Consistently put
+ a dash at the end of `macroset_template` whether the image file
+ name stem is user-supplied or the default. Stop adding the dash
+ before the image number in `image_template` instead. This makes
+ the image file name format reliable whether the image needs to
+ be subdivided (eqn) or not (tbl).
+
+ Fixes <https://savannah.gnu.org/bugs/?60971>.
+
+2021-07-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grohtml]: Reduce noise to standard error stream.
+
+ * src/preproc/html/pre-html.cpp (imageList::createImage): Fix
+ apparent oversight: `EXE_EXT` was not being applied to the
+ second of three commands being run in a pipeline (did Windows
+ users notice?). Also issue (undocumented!) `-quiet` option to
+ `pnmtopng` to shut up its commentary about counting colors.
+
+2021-07-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grohtml]: Stop discarding standard error output.
+
+ * src/preproc/html/pre-html.cpp (html_system): Stop sending the
+ standard error stream to /dev/null; this just makes debugging
+ harder, and doesn't produce much more output for well-formed
+ input documents. Rename `save_stdout` to `saved_stdout`.
+
+2021-07-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grohtml]: Fix misspelled variable.
+
+ * src/preproc/html/pre-html.cpp: Rename `IMAGE_BOARDER_PIXELS`
+ to `IMAGE_BORDER_PIXELS`.
+
+2021-07-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [libgroff, troff]: Add debug diagnostic level.
+
+ * src/include/error.h: Declare functions
+ `debug_with_file_and_line` and `debug`.
+ * src/libs/libgroff/error.cpp: Add `DEBUG` to enum `error_type`.
+ (do_error_with_file_and_line): Add case for `DEBUG` in switch.
+ (debug, debug_with_file_and_line): Add new functions.
+
+ Do the same for troff since it has a private implementation of
+ the diagnostic functions (thanks to `output_warning()`).
+
+ * src/roff/troff/input.cpp: Add `DEBUG` to enum `error_type`.
+ (do_error_with_file_and_line): Add case for `DEBUG` in switch.
+ (debug, debug_with_file_and_line): Add new functions.
+
+2021-07-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/hpftodit/hpftodit.cpp (hp_msl_to_ucode_name)
+ (unicode_to_ucode_name): Hush "format nonliteral" compiler
+ warnings by using a preprocessor-defined string literal as an
+ sprintf() format string instead of a C++ variable that just
+ compared identically to the same thing.
+
+2021-07-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/hpftodit/hpftodit.cpp (show_symset): Prevent
+ sprintf() from overunning a static buffer. Thanks to Bjarni
+ Ingi Gislason for the report. Resize buffer to be large enough
+ to accommodate a 64-bit unsigned int type formatted as decimal.
+ Also add assert() before the sprintf() to abort if the int type
+ is even larger than that. Use "%u" conversion instead of "%d"
+ since the quantity is unsigned.
+ (hp_msl_to_ucode_name): Similar, but for a signed int.
+ (unicode_to_ucode_name): Similar, but for a signed int formatted
+ as (unsigned) hexadecimal.
+
+ Fixes <https://savannah.gnu.org/bugs/?60964>.
+
+2021-07-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/nroff/nroff.sh: Refactor, mostly by relocation. Move
+ locale character set inference logic so that we only run it if
+ we have to (`-T` option was invalid or not given and
+ `GROFF_TYPESETTER` was not set in the environment or invalid).
+ Initialize `T` variable as empty.
+
+2021-07-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/nroff/nroff.sh: Use Version 7 Unix sh-compatible form
+ of parameter expansion; per the GNU Autoconf manual[1], "[o]ld
+ BSD shells, including the Ultrix sh, don't accept the colon for
+ any shell substitution, and complain and die." This is also the
+ form of such substitutions used elsewhere in the script, so they
+ should be mutually consistent.
+
+ [1] https://www.gnu.org/software/autoconf/manual/autoconf-2.60/\
+ html_node/Shell-Substitutions.html
+
+2021-07-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/nroff/nroff.sh: Slightly refactor. Rename formerly
+ unused loop index variable from `i` to `arg` to leverage it in a
+ later diagnostic message without a separate definition. Inside
+ the loop, expand `arg` instead of positional parameter 1, the
+ meaning of which is less obvious after the parameter list is
+ shifted by the new `is_option_argument_pending` logic (commit
+ 2b955c57, 20 July).
+
+2021-07-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/groff.1.man (Options) <-S>: Fix error: `-S`
+ sets safer mode (redundantly) but is not passed to pic and troff
+ as was claimed.
+
+2021-07-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/number.cpp (parse_term): Tweak diagnostic
+ messages. When a left operand to a binary operator is empty,
+ report the operator in question (helpful for string
+ interpolations in complex expressions). When handling input
+ scaling indicators, drop word "this" from "this context", since
+ the parser's context might not be clear from a file name and
+ line number. Say "scaling indicator" instead of "scale
+ indicator".
+ (parse_expr, parse_term): Rename function parameter from
+ `scale_indicator` to `scaling_indicator`.
+
+2021-07-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (define_color): Tweak warning
+ diagnostics for clarity. Only one value is expected when
+ defining a color in the `gray` color space. Quote recognized
+ color space names when complaining of an unknown one.
+
+2021-07-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [nroff]: Pass a supplied `-c` option to groff. While at present
+ this does little more than `-P-c` already achieves, that might
+ not be true forever. Further, there is a distinction between
+ ignoring color-related requests in groff input documents and
+ ignoring color-related commands in device-independent output.
+ This distinction would make it unwise to adapt `-c` to any other
+ purpose in nroff in the future.
+
+ * NEWS: Update item from commit dd725dce, 10 February 2020.
+ * src/roff/nroff/nroff.sh: Pass `-c` option to groff in addition
+ to synthesizing a `-P-c` option (for grotty) when it is seen.
+ * src/roff/nroff/nroff.1.man (Options): Document `-c` as an
+ option recognized by troff(1).
+
+2021-07-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [nroff]: Support space between option flags and their arguments.
+
+ * src/roff/nroff/nroff.sh: Add new `is_option_argument_pending`
+ flag to add an additional state to the option parser. Set it if
+ an argument-requiring option is encountered with no abutting
+ argument. If it is set when a new argument is encountered,
+ absorb the argument into the groff option list and clear the
+ flag. Modernize script in a couple of other ways.
+ - Exit with status 2 upon usage errors so that this condition
+ is easily distinguished from a groff abort (which exits with
+ status 1).
+ - Test shell variables for non-nullity with test(1) -n
+ operator instead of a string comparison.
+ * src/roff/nroff/tests/verbose_option_works.sh: Test correct
+ construction of groff command using this input form.
+ * src/roff/nroff/nroff.1.man (Options): Add spaces between
+ option flags and option arguments. Sync metasyntactic variable
+ names with groff(1) while we're at it.
+ (Description): Drop sentence warning of whitespace prohibition.
+ (Exit status): Add new section.
+
+ Fixes <https://savannah.gnu.org/bugs/?60943>.
+
+2021-07-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (main): Emit error diagnostic if `-d`
+ or `-r` option is given a malformed argument. This prevents a
+ string or register with an empty name from being created.
+
+ Fixes <https://savannah.gnu.org/bugs/?60935>.
+
+2021-07-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/nroff/nroff.sh:
+ * src/roff/troff/input.cpp (usage): Use "dev" as metasyntactic
+ variable name for -T option argument to achieve consistency with
+ our other documentation.
+
+2021-07-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [groff]: Comment out vestiges of gideal support. It would be
+ lovely to have, but no free (and GPL-compatible) implementation
+ has showed up after decades of waiting. Production of the
+ original was a Ph.D. thesis. Excited by de Moivre's theorem?
+ Take a stab at it.
+
+ * src/roff/groff/groff.cpp (main): Comment out effect of `-J`
+ option. It remains recognized, but silently ignored (instead of
+ attempting to execute a nonexistent preprocessor).
+ (synopsis): Add comment reminding us to document the option if
+ we ever get the support.
+ (help): Comment out documentation of option.
+
+2021-07-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [[gnt]roff]: Make usage messages more accurate.
+
+ * src/roff/groff/groff.cpp (synopsis): Drop `-h` and `-v` from
+ normal operation synopsis. Sort options in en_US lexicographic
+ order. Tighten presentation of alternate usage forms.
+ (help): Document longer forms of `-d` and `-r`.
+ * src/roff/nroff/nroff.sh: Report `$prog` instead of "nroff"
+ literal. Refer to `-P` option argument as "arg" instead of
+ "opt", for consistency with groff usage message. Use opposite
+ case from option letter for option argument.
+ * src/roff/troff/input.cpp (usage): Put brackets around options.
+ Sort options in en_US lexicographic order. Drop `-v` from
+ normal operation synopsis. Use opposite case from option letter
+ for option argument. Put operand name in capitals. Set valid
+ usage forms on one physical line each (see 89648fb4, 5 June).
+ Add synopsis line for alternate usage forms.
+
+2021-07-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Refactor environment initialization, switching, and
+ copying.
+
+ * src/roff/troff/env.cpp: Rename struct `env_list` to
+ `env_list_node` since it describes a node of a singly-linked
+ list. Remove constant `NENVIRONMENTS` and array `env_table`.
+ Add static symbol `default_environment_name` to replace string
+ literal.
+ (init_environments): Stop initializing `curenv` through
+ `env_table`. Use `default_environment_name` for that
+ initialization and add the default environment to
+ `env_dictionary`.
+ (environment_switch): Simplify. Shorten "dummy environment"
+ diagnostic message. Stop creating an integer-named
+ environment inside the `env_table` array, only falling through
+ to use the `env_dictionary` if the named environment is not a
+ valid integer or if the array is full. Instead use
+ `env_dictionary` always. Drop no longer needed `pop`
+ quasi-Boolean integer with extra state to suppress environment
+ stack underflow errors. Instead report the error if underflow
+ occurs, regardless of any other circumstance.
+ (environment_copy): Simplify. Stop searching the `env_table`
+ array for an environment to copy from, only falling through to
+ use the `env_dictionary` if the named environment is not a valid
+ integer or if the array is full. Instead search
+ `env_dictionary` always. Emit "no environment specified to copy
+ from" diagnostic only if the `evc` request is given no argument.
+ If the source environment to copy from is given but not found,
+ emit a new diagnostic naming the nonexistent environment. Fix
+ bug: stop returning early if no copying could be done; instead
+ fall through to the end of the function, which calls
+ `skip_line()` and prevents anything on the remainder of the
+ {invalid} control line from being interpreted. Problem dates
+ back to commit da3b7137, 6 March 2000 (groff 1.16).
+
+ Fixes <https://savannah.gnu.org/bugs/?60913>.
+
+2021-07-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/tests/evc_produces_no_output_if_invalid.sh:
+ Regression-test Savannah #60913.
+ * src/roff/groff/groff.am (groff_TESTS): Run test.
+
+2021-07-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Update English hyphenation patterns.
+
+ * NEWS: Add item.
+ * tmac/hyphen.en: Update file using `hyph-en-us.tex` patterns
+ file from the TeX hyph-utf8 project.
+ * tmac/hyphenex.en: Remove explicit hyphenations for words that
+ no longer require them when using the new patterns. Add one
+ item scraped from an erratum comment in hyphen.en
+ {"dem-o-crat"}.
+
+ The new patterns likely _will_ change the automatic hyphenation
+ break points of your English documents. Here is a sample of
+ affected words found within groff's own documentary corpus.
+
+ OLD NEW
+ === ===
+ arâ€rangeâ€ment arrangeâ€ment
+ colâ€umns columns
+ conâ€strucâ€ted conâ€structed
+ cusâ€tomâ€ized cusâ€tomized
+ defâ€iâ€niâ€tions deâ€fâ€iâ€nâ€iâ€tions
+ derâ€iâ€vaâ€tions deâ€rivaâ€tions
+ hyâ€phenâ€aâ€tion hyâ€phenâ€ation
+ maâ€teâ€rial maâ€teâ€râ€ial
+ Miâ€croâ€soft Miâ€crosoft
+ pipeâ€lines pipelines
+ postâ€proâ€cesâ€sors postâ€procesâ€sors
+ proâ€cessed processed
+ proâ€cesses processes
+ spaâ€ces spaces
+ Werâ€ner Werner
+
+2021-07-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Add unit test for `substring` request.
+
+ * src/roff/groff/tests/substring_works.sh: Do it.
+ * src/roff/groff/groff.am (groff_TESTS): Run test.
+
+2021-07-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tmac]: Remove compatibility mode save registers after using
+ them.
+
+ * tmac/an.tmac:
+ * tmac/andoc.tmac:
+ * tmac/cp1047.tmac:
+ * tmac/devtag.tmac:
+ * tmac/ec.tmac:
+ * tmac/fallbacks.tmac:
+ * tmac/latin1.tmac:
+ * tmac/latin2.tmac:
+ * tmac/latin5.tmac:
+ * tmac/latin9.tmac:
+ * tmac/papersize.tmac:
+ * tmac/pdfpic.tmac:
+ * tmac/psold.tmac:
+ * tmac/pspic.tmac:
+ * tmac/trace.tmac:
+ * tmac/unicode.tmac: Do it.
+
+ * doc/groff.texi (Implementation Differences):
+ * man/groff_diff.7.man (Implementation Differences): Illustrate
+ doing so in relevant examples.
+
+2021-07-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/troffrc: Load the English localization file `en.tmac` by
+ default, instead of dealing with hyphenation language and
+ patterns directly in this file. (This also replaces a
+ localization-determination mechanism that was never part of a
+ groff release.)
+
+ * src/roff/groff/tests/initialization_is_quiet.sh:
+ * src/roff/groff/tests/localization_works.sh: Rewrite to use
+ explicit macro file loading localization mechanism.
+
+2021-07-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Move core man(7) implementation to an.tmac.
+
+ * tmac/an.tmac: Delete andoc-sourcing wrapper.
+
+ * tmac/an-old.tmac: Rename...
+ * tmac/an.tmac: ...to this.
+
+ * tmac/tests/an-old_AT-and-UC-footer-saved-and-restored.sh:
+ * tmac/tests/an-old_CS-register-off.sh:
+ * tmac/tests/an-old_CS-register-on.sh:
+ * tmac/tests/an-old_CS-register-unspecified.sh:
+ * tmac/tests/an-old_CT-register-off.sh:
+ * tmac/tests/an-old_CT-register-on.sh:
+ * tmac/tests/an-old_CT-register-unspecified.sh:
+ * tmac/tests/an-old_FT-bad-value-should-not-trash-titles.sh:
+ * tmac/tests/an-old_LL-init-sanely.sh:
+ * tmac/tests/an-old_TH-repairs-ad-damage.sh:
+ * tmac/tests/an-old_TH-repairs-hy-damage.sh:
+ * tmac/tests/an-old_TS-do-not-keep-tables-when-cR-set.sh:
+ * tmac/tests/an-old_X-register-works.sh:
+ * tmac/tests/an-old_avoid-two-font-denial-of-service.sh:
+ * tmac/tests/an-old_no-break-after-short-paragraph-tags.sh:
+ * tmac/tests/an-old_page-footers-present.sh:
+ * tmac/tests/an-old_page-header-has-current-data.sh:
+ * tmac/tests/an-old_title-abbreviation-works.sh: Rename...
+
+ * tmac/tests/an_AT-and-UC-footer-saved-and-restored.sh:
+ * tmac/tests/an_CS-register-off.sh:
+ * tmac/tests/an_CS-register-on.sh:
+ * tmac/tests/an_CS-register-unspecified.sh:
+ * tmac/tests/an_CT-register-off.sh:
+ * tmac/tests/an_CT-register-on.sh:
+ * tmac/tests/an_CT-register-unspecified.sh:
+ * tmac/tests/an_FT-bad-value-should-not-trash-titles.sh:
+ * tmac/tests/an_LL-init-sanely.sh:
+ * tmac/tests/an_TH-repairs-ad-damage.sh:
+ * tmac/tests/an_TH-repairs-hy-damage.sh:
+ * tmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh:
+ * tmac/tests/an_X-register-works.sh:
+ * tmac/tests/an_avoid-two-font-denial-of-service.sh:
+ * tmac/tests/an_no-break-after-short-paragraph-tags.sh:
+ * tmac/tests/an_page-footers-present.sh:
+ * tmac/tests/an_page-header-has-current-data.sh:
+ * tmac/tests/an_title-abbreviation-works.sh: ...to these.
+
+ * tmac/tmac.am (TMACNORMALFILES): Remove an-old.tmac.
+ (tmac_TESTS): Reflect renames of test files above.
+ (tmac/stamp-wrap): Macro-source `an.tmac` in the man wrapper.
+
+ * tmac/andoc.tmac: Refer to (and macro-source) an.tmac.
+ * tmac/man.tmac: Macro-source `an.tmac`, not `andoc.tmac`.
+ * tmac/tests/andoc_flush-between-packages.sh: Call groff with
+ `-mandoc` option instead of `-man`. Henceforth, if you want the
+ andoc wrapper, you have to ask for it.
+
+ * tmac/an.tmac: Drop "-old" nomenclature.
+
+ * PROBLEMS:
+ * doc/groff.texi (man):
+ * tmac/man.local: Update documentation appropriately.
+
+ * NEWS: Add item.
+
+ * man/groff_tmac.5.man (Macro packages/man pages):
+ * src/roff/groff/groff.1.man (Usage/Macro packages): Update
+ discussion of an, doc, and andoc.
+ * tmac/groff_man.7.man.in (Files): Update descriptions of
+ an.tmac, andoc.tmac, man.tmac, and mandoc.tmac.
+
+ Fixes <https://savannah.gnu.org/bugs/?60789>.
+
+2021-07-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Slightly refactor. Make the source code slightly more
+ accessible by using a `bool` type for a function's default
+ parameter used as a Boolean, and comment it at call sites where
+ the default is overridden.
+
+ * src/roff/troff/token.h (get_name, get_long_name): Change type
+ of parameter from `int` to `bool` and default from 0 to `false`.
+ * src/roff/troff/input.cpp (do_get_long_name)
+ (empty_name_warning, get_name, get_long_name): Change type of
+ parameter from `int` to `bool` in declarations and definitions.
+ * src/roff/troff/column.cpp (column_justify):
+ * src/roff/troff/div.cpp (diversion_trap):
+ * src/roff/troff/env.cpp (environment_switch, environment_copy)
+ (do_input_trap, set_hyphenation_language)
+ (do_hyphenation_patterns_file):
+ * src/roff/troff/input.cpp (define_color, composite_request)
+ (do_define_string, do_define_macro, rename_macro, alias_macro)
+ (chop_macro, do_string_case_transform, substring_request)
+ (length_request, asciify_macro, unformat_macro, do_register)
+ (device_macro_request, do_if_request, do_source)
+ (ps_bbox_request, do_open, close_request, do_write_request)
+ (write_macro_request, define_class, copy_file, vjustify)
+ (transparent_file, do_macro_source):
+ * src/roff/troff/node.cpp (font_translate, font_position, style)
+ (get_fontno):
+ * src/roff/troff/reg.cpp (define_number_reg, inline_define_reg)
+ (alter_format, alias_reg, rename_reg): Update call sites. Add
+ (comment indicating meaning of parameter.
+
+ Do similarly for token::delimiter() member function.
+
+ * src/roff/troff/token.h (token::delimiter): Change type of
+ parameter from `int` to `bool`, name from `warn` to `err` (to
+ match definition and behavior in input.cpp) and default from 0
+ to `false`.
+ * src/roff/troff/input.cpp (token::delimiter): Change type of
+ parameter from `int` to `bool` in definition.
+ * src/roff/troff/input.cpp (do_expr_test, get_delim_number)
+ (get_line_arg, read_size, do_register, read_draw_node):
+ * src/roff/troff/reg.cpp (inline_define_reg): Update call sites.
+ Add comment indicating meaning of parameter.
+
+2021-07-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (an-footer): Remove string
+ `an-outer-footer-text` after we're done with it.
+
+2021-07-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Remove the stripper script and its vestiges.
+
+ * contrib/hdtbl/hdmisc.tmac:
+ * contrib/hdtbl/hdtbl.tmac:
+ * contrib/mom/om.tmac:
+ * tmac/doc.tmac:
+ * tmac/e.tmac:
+ * tmac/mdoc/doc-common:
+ * tmac/mdoc/doc-ditroff:
+ * tmac/mdoc/doc-nroff:
+ * tmac/mdoc/doc-syms: Remove `%beginstrip` comment.
+
+ * tmac/strip.sed: Delete.
+
+ * tmac/tmac.am (EXTRA_DIST): Stop shipping `strip.sed`.
+
+ Fixes <https://savannah.gnu.org/bugs/?55091>.
+
+2021-07-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Skip the stripper, part 3/3 (mdoc).
+
+ * tmac/doc-old.tmac-u:
+ * tmac/doc.tmac-u:
+ * tmac/mdoc/doc-common-u:
+ * tmac/mdoc/doc-ditroff-u:
+ * tmac/mdoc/doc-nroff-u:
+ * tmac/mdoc/doc-syms-u: Rename these...
+
+ * tmac/doc-old.tmac:
+ * tmac/doc.tmac:
+ * tmac/mdoc/doc-common:
+ * tmac/mdoc/doc-ditroff:
+ * tmac/mdoc/doc-nroff:
+ * tmac/mdoc/doc-syms: ...to these.
+
+ * tmac/tmac.am (TMACNORMALFILES): Add `doc-old.tmac` and
+ `doc.tmac`.
+ (TMACUNSTRIPFILES, TMACSTRIPFILES): Delete variables.
+ (dist_tmac_DATA): Drop `$(TMACUNSTRIPFILES)`.
+ (nodist_tmac_DATA): Drop `$(TMACSTRIPFILES)`.
+ (TMACMDOCSTRIPFILES): Rename...
+ (TMACMDOCFILES): ...to this.
+ (nodist_mdoc_DATA, MOSTLYCLEANFILES): Reflect above rename.
+ (nodist_mdoc_DATA): Rename...
+ (dist_mdoc_DATA): ...to this.
+ (TMACMDOCUNSTRIPFILES): Delete variable.
+ (EXTRA_DIST): Drop `$(TMACMDOCUNSTRIPFILES)`.
+ ($(TMACSTRIPFILES), $(TMACMDOCSTRIPFILES)): Drop targets.
+
+ The portions above are based on a patch by Ingo Schwarze.
+
+ * tmac/doc.tmac:
+ * tmac/mdoc/doc-common:
+ * tmac/mdoc/doc-ditroff:
+ * tmac/mdoc/doc-nroff:
+ * tmac/mdoc/doc-syms: Bracket macro definitions tightly with
+ `eo` and `ec` requests since they were written under this
+ assumption. The files in general were also drafted under the
+ assumption that they'd be stripped, so `eo` was in effect for
+ broad swaths of the file including portions outside of any macro
+ definition where comments were used. But comments are expressed
+ using the escape character! So we got warnings about an
+ undefined '\"' macro, and that was just the beginning of a
+ wrecking ball of trouble that smashed through the
+ implementation. Some--but not all--string definitions (and
+ appendments) needed to be bracketed with `eo` and `ec` as well,
+ to delay interpolation of embedded string names that are not
+ defined until macros interpolate them later. I did what
+ appeared necessary to pass our tests and keep -Tutf8 and -Tps
+ renderings of tmac/groff_mdoc.7 from changing from their
+ strip-influenced output. Subtle bugs might linger, but some
+ won't be the fault of the unstripping process. (For instance,
+ try provoking a usage message on the `Hf` macro.)
+
+2021-07-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man pages]: Remove compatibility save register.
+
+ * **/*.man*: Remove page-local compatibility save register after
+ using it.
+
+2021-07-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tmac]: Simplify `mso` requests.
+
+ * tmac/X.tmac:
+ * tmac/Xps.tmac:
+ * tmac/dvi.tmac:
+ * tmac/html.tmac:
+ * tmac/lbp.tmac:
+ * tmac/lj4.tmac:
+ * tmac/ps.tmac:
+ * tmac/tty-char.tmac:
+ * tmac/tty.tmac:
+ * tmac/www.tmac.in: Move `mso` requests to be inside regions
+ where compatibility mode is turned off. I believe they were
+ placed where they were because things didn't work when the
+ compatibility mode register being saved was .C, rather than the
+ .cp register introduced in commit 6a37bb5f, 17 April 2020. Now
+ the logic is less mysterious. Also, remove the register used to
+ save compatibility mode after we're done with it, to reduce name
+ space clutter.
+
+2021-07-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/it.tmac: Drop sourcing of `latin1.tmac` and set up of
+ hyphenation codes; since the `hyphen.it` file is pure ASCII, we
+ don't need to expect Latin-1-encoded code points in it.
+
+2021-07-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tmac]: Make localization files work in compatibility mode.
+
+ * tmac/cs.tmac:
+ * tmac/de.tmac:
+ * tmac/en.tmac:
+ * tmac/fr.tmac:
+ * tmac/it.tmac:
+ * tmac/ja.tmac:
+ * tmac/sv.tmac:
+ * tmac/zh.tmac: Save and restore compatibility mode.
+
+ * tmac/den.tmac: Invoke requests with `do`.
+
+ Fixes <https://savannah.gnu.org/bugs/?60874>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2021-07-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Add regression test for Savannah #60874.
+
+ * src/roff/groff/tests/initialization_is_quiet.sh: Test it.
+ * src/roff/groff/groff.am (groff_TESTS): Run test.
+
+2021-07-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Integrate Italian localization.
+
+ * NEWS: Add item. Update an existing list of localization macro
+ files.
+ * doc/groff.texi (Manipulating Hyphenation): Update table of
+ hyphenation pattern left and right minimums and list of
+ available localization files to include Italian.
+ * man/groff_tmac.5.man: Update list of available localization
+ files to include Italian.
+ * src/roff/groff/tests/localization_works.sh: Test it.
+ * tmac/tmac.am (TMACNORMALFILES): Add `it.tmac` and `hyphen.it`.
+
+ Fixes <https://savannah.gnu.org/bugs/?60828>.
+
+2021-07-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tmac]: Flesh out Italian localization.
+
+ * tmac/hyphen.it: Add hyphenation patterns from TeX hyph-utf8
+ project.
+ * tmac/it.tmac:
+ - Revise copyright date to just this year (it had been copied
+ from fr.tmac).
+ - Use grave accents instead of acute ones to indicate stress
+ on word-final vowels. Per the University of Wikipedia and a
+ sampling of apparently well-typeset Italian language
+ documents online, this appears to be correct. Yell at me if
+ I'm wrong.
+ - Source latin1.tmac instead of latin9.tmac; Italian doesn't
+ require any letter code points from Latin-9, unlike the
+ French file upon which this one was based, and Latin-1 is
+ less of a pain to work with.
+ - Set the hyphenation mode to 1 instead of 4 for congruence
+ with the requirements of the hyphenation patterns.
+ - Set up hyphenation codes. This (and sourcing latin1.tmac)
+ might not be necessary as the hyphenation pattern file, of a
+ more recent vintage than the others we're using, is pure
+ ASCII. However I don't understand these issues perfectly so
+ I am making the conservative choice. Again per the
+ University of Wikipedia, Italian requires only acute and
+ grave accents, in contrast to the rich French diacritical
+ bouillabaisse.
+ - Set the hyphenation language and load the pattern file.
+ - Add comments in parallel with other localization files and
+ to supply text editors with hints.
+
+2021-07-02 Edmond Orignac <edmond.orignac@wanadoo.fr>
+
+ * tmac/it.tmac: Add Italian localization.
+
+2021-07-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Skip the stripper, part 1/3 ("me").
+
+ * tmac/e.tmac-u: Rename to...
+ * tmac/e.tmac: ...this.
+
+ * tmac/tmac.am (TMACNORMALFILES): Add tmac/e.tmac.
+ (TMACUNSTRIPFILES): Remove tmac/e.tmac-u.
+ (TMACSTRIPFILES): Remove tmac/e.tmac.
+
+ Fixes one third of <https://savannah.gnu.org/bugs/?55091>.
+
+2021-07-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/grog.pl: Simplify parsing. Dave Kemper pointed
+ out that preprocessors like pic(1) use pretty unsophisticated
+ *roff parsing to determine where to perform their textual
+ replacements. My enhancements to support input line
+ continuation and cope with brace escapes were thus
+ overengineered. Remove them.
+ - Drop scalars `is_continued_line` and `logical_line`.
+ (do_line): Stop performing logical line concatenation and
+ detecting input line continuation. Perform operations on
+ `line` instead of `logical_line`. Stop removing brace
+ escapes.
+ * src/utils/grog/grog.1.man (Limitations): Update discussion.
+
+ Fixes <https://savannah.gnu.org/bugs/?60862>. Thanks, Dave!
+
+2021-06-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/reg.cpp (lookup_number_reg, alias_reg): In
+ diagnostic messages, say simply "register" instead of "number
+ register" (there is no other kind).
+
+2021-06-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grog]: Refactor input parsing.
+
+ * src/utils/grog/grog.pl:
+ - Add scalar `use_compatibility_mode` (see below).
+ - Add list `request` to store the names of all requests
+ recognized by groff so that they aren't confused with macro
+ names.
+ - Add scalars `have_seen_first_macro_call` (replaces
+ `before_first_command`, but at global scope),
+ `is_continued_line` and `logical_line`. The latter two
+ enable us to handle *roff input line continuation correctly.
+ (process_arguments): Set `use_compatibility_mode` if `-C`
+ option specified.
+ (process_input): Refactor to greatly simplify, to not attempt
+ to read the first line of an input file as a special case, and
+ to avoid sending `do_line` an undefined argument (when EOF is
+ reached).
+ (do_first_line): Delete.
+ (do_line): Rewrite the early stages of input parsing.
+ - Concatenate continued input lines, setting
+ `is_continued_line` and returning early as each one is seen,
+ storing the accumulating input in `logical_line`.
+ - Check the input line for the form of comment deposited by
+ Perl's Pod::Man, which uses a highly accented dialect of
+ man(7); if it's present, inflate `man_score` to compensate
+ for the page-private `IX` macro it defines but which
+ duplicates the name and function of a 4.2BSD-era ms(7)
+ extension that would otherwise deceive our scoring
+ mechanism, because Pod::Man produces `IX` calls to
+ metastatic excess. (An alternative to this kludge is
+ documented in comments: if a "standard" macro is redefined,
+ we could delete it from the relevant lists and hashes.)
+ - Strip *roff comments from input.
+ - Normalize control lines; convert the no-break control
+ character to the regular one and remove unnecessary
+ white space.
+ - Remove brace escapes.
+ - Recognize two-character macro calls when not followed by
+ white space in compatibility mode.
+ - Drop logic that erroneously attempted to infer soelim(1) use
+ from macro calls and request invocations. The grog(1) and
+ soelim(1) man pages now both explain why such an effort was
+ misguided.
+ - Recognize macro definitions created by .am and .am1 requests
+ {not just .de and .de1}.
+ - Ignore all other *roff requests.
+ - What remains must be a ("standard") macro call, so set
+ `have_seen_first_macro_call`.
+
+ * src/utils/grog/grog.1.man (Limitations): Document a further
+ restriction: don't change the escape character, either.
+
+ * src/utils/grog/tests/smoke-test.sh: Comment out pic-detection
+ test on soelim(1). The pic macro calls are guarded by roff
+ control structures and only worked previously by accident
+ because grog did not recognize *roff input line continuation,
+ now it does and the illusion is dispelled. (A reliable way to
+ fool grog before and after my refactoring is now documented in
+ its man page.)
+
+ Fixes <https://savannah.gnu.org/bugs/?59622>.
+
+2021-06-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Add regression test for Savannah #59622.
+
+ * src/utils/grog/tests/recognize-perl-pod.sh: Test it.
+ * src/utils/grog/grog.am (grog_TESTS): Run test.
+
+2021-06-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/grog.1.man (Limitations): Document further
+ restrictions (no changing of control characters, control
+ structures not interpreted).
+
+2021-06-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grog]: Refactor command-line argument handling.
+
+ * src/utils/grog/grog.pl:
+ - Drop scalars `groff_opts`, `device`, and `with_warnings`.
+ - Move scalar `pdf_with_ligatures`...
+ (process_arguments): ...here. Recognize all groff options
+ that take an optionally whitespace-separated option argument
+ and apply the existing "delayed option" handling to them.
+ Push any groff option except `-m` as-is onto the constructed
+ groff command's argument list (`-m` handling is unchanged).
+ Match long option names exactly, not sloppily. Stop
+ recognizing `--warnings` option. Emit error diagnostic if
+ unrecognized long option encountered.
+ (infer_device): Delete subroutine and its top-level call site.
+ (help): Undocument `--warnings`.
+
+ * src/utils/grog/grog.1.man:
+ (Synopsis): Use font style macros instead of .OP. Undocument
+ `--warnings`.
+ (Options): Note that the groff arguments produced by the grog
+ `--ligatures` option are supported only by the `pdf` device.
+ Undocument `--warnings`. Undocument groff-incompatible
+ restriction on whitespace before option arguments; grog is
+ compatible now. Simplify discussion in light of simplified
+ grog logic.
+ (Details): Undocument scenario where grog infers multiple
+ main/major/full-service macro packages; this no longer
+ happens.
+ (Examples): Update to no longer illustrate inclusion of `-T
+ ps` option; this no longer happens by default.
+
+ * NEWS: Document removal of grog's `--warnings` option.
+
+ Fixes <https://savannah.gnu.org/bugs/?57873>; groff options are
+ no longer "mangled".
+
+2021-06-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Add regression test for Savannah #57873.
+
+ * src/utils/grog/tests/preserve-groff-options.sh: Test it.
+ * src/utils/grog/grog.am (grog_TESTS): Run test.
+
+2021-06-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grog]: Refactor device (`-T` option) handling.
+
+ * src/utils/grog/grog.pl: Redeclare `device` as a scalar instead
+ of a list.
+ (process_arguments): Generalize handling of `-T` and `-m`
+ options to permit optional whitespace. Rename scalar `was_T` to
+ `delayed_option`.
+ (infer_device): Stop unconditionally adding a `-T ps` argument
+ to the generated groff command. Remove logic that validates any
+ given `-T` option argument; instead, let groff fail if a bad one
+ is supplied (its own diagnostics in this scenario were improved
+ in commit 5a721a30, 27 May). This makes grog agnostic about any
+ differently configured default device in groff itself, and about
+ the GROFF_TYPESETTER environment variable.
+
+ Fixes <https://savannah.gnu.org/bugs/?55301> by getting out of
+ the way.
+
+ * src/utils/grog/tests/PF-does-not-start-pic-region.sh:
+ * src/utils/grog/tests/smoke-test.sh: Update expected output.
+
+2021-06-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/grog.am (grog): Drop sed replacement of unused
+ configuration variables @g@, @BINDIR@, @libdir@, and @EGREP@.
+ * src/utils/grog/grog.pl (process_arguments, construct_command):
+ Tweak warning diagnostics to use a style where an empty argument
+ will be easy to spot.
+ (do_first_line): Stop emitting pseudo-diagnostic (to standard
+ output!) if we see a "groff options line" [it's not] of
+ incorrect form. The preprocessor encoding hint convention of
+ concern here is particular to man pages, disregarded by at least
+ one major implementation thereof (man-db man), and not used by
+ other types of roff documents; at this point, we don't yet know
+ if the document we're processing is a man page.
+ (construct_command): Correct comment and related logic error.
+ Clear the inferred main macro package if _any_ `-m` argument
+ matching any main macro package is given. Warn only if what is
+ specified doesn't match the inference.
+
+2021-06-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grog]: Heavily refactor.
+
+ * src/utils/grog/grog.pl:
+ - Drop import of unused module `Data::Dumper`.
+ - Drop unused scalars `Sp` and `correct_tmac`.
+ - Simplify determination of version number. Drop hash `at_at`
+ which only stored one key, `GROFF_VERSION`. Initialize
+ scalar `groff_version` to "DEVELOPMENT". Rename scalar
+ `before_make` to `in_source_tree` and initialize to zero.
+ Update `groff_version` with Automake-determined version
+ variable if it is defined (i.e., grog is not running outside
+ of, or in an unbuilt, groff source or binary distribution).
+ - Drop unused `Mparams` list. Replace it with new list
+ `requested_package`, which stores the arguments to any grog
+ `-m` options specified by the user.
+ - Rename many objects so that I, and others, can better
+ comprehend their purpose, and for consistent letter casing.
+ . @Command -> @command
+ . @devices -> @device
+ . $Prog -> $program_name
+ . %macros -> %user_macro
+ . $have_any_valid_args -> $have_any_valid_arguments
+ . &handle_args -> &process_arguments
+ . &handle_whole_files -> &process_input
+ . @preprograms -> @preprocessor
+ . &make_groff_device -> &infer_device
+ . &make_groff_preproc -> &infer_preprocessors
+ . &make_groff_tmac_others -> &infer_macro_packages
+ . &make_groff_tmac_man_ms -> &infer_man_or_ms_package
+ . &make_groff_line_rest -> &construct_command
+ - Drop many unused keys in `Groff` hash.
+ - Add new lists, `macro_ms`, `macro_man`, and
+ `macro_man_or_ms` to support new scoring technique to
+ disambiguate input documents between these two packages.
+ - Append the foregoing 3 lists to new list `standard_macro`,
+ and add these as keys to the `Groff` hash.
+ - Add new list `main_package` to keep track of full-service
+ package names.
+ - Add new scalars `man_score`, `ms_score`, and
+ `inside_tbl_table` to aid disambiguation of .TH macro calls
+ and the many macro names shared between man(7) and ms(7).
+ (process_arguments): Strip '-m' off of argument before storing
+ the remainder in `@requested_package`.
+ (do_line): Detect .TH macro call even if white space occurs
+ between the control character and the macro name.
+ (do_line): Inflate `$man_score` by 100 if .TH is the first
+ macro call seen in a document.
+ (do_line): Fix bug; clear `$before_first_command` in correct
+ scope--after any macro call, not just if we saw a .TH as the
+ first macro call.
+ (do_line): Set `$inside_tbl_table` when we see a .TS call.
+ (do_line): Clear `$inside_tbl_table` when we see a .TE call.
+ Also increment `$Groff{'tbl')' again, increasing the "score"
+ of tbl(1) usage evidence.
+ (do_line): Drop a lot of code that manually increments %Groff
+ keys corresponding to man and ms macros. This is now done
+ differently and elsewhere.
+ (do_line): Drop "P" from list of characteristic mm(7) macros.
+ (do_line): Simplify matching of mom(7) macros (match $command,
+ not $line). Extend list of characteristic mom(7) macros.
+ (do_line): Increment $Groff{$key} if $key is in
+ @standard_macro.
+ (infer_man_or_ms_package): Rewrite. Compute a score for each
+ package by counting occurrences of their characteristic
+ macros. If both have a score of zero, assume that the input
+ is a raw roff document. If the scores are equal
+ {doc/webpage.ms, startlingly, comes within 1 point of a tied
+ score}, infer ms(7) if 'TH' was never called, and if it was,
+ issue a diagnostic advising user to supply a disambiguating
+ `-m` option. Otherwise, the scores are unequal: infer the
+ package of the winner. Set scalar `inferred_main_package`
+ instead of pushing `-m` options onto `@m`.
+ (infer_macro_packages): Set scalar `inferred_main_package`
+ instead of pushing `-m` options onto `@m`. Explicitly return
+ 0 if we fall off the end of the function.
+ (construct_command): Rewrite handling of -m options. Add new
+ list `msupp` to store supplementary (non-main) macro package
+ arguments. If a full-service package was explicitly
+ requested, it had better not clash with what we inferred. If
+ it does, explicitly unset `inferred_main_package` so that the
+ -m arguments are placed in the same order that the user gave
+ them; caveat dictator. If `--run` option was given, just
+ print the command; don't preface it with __FILE__ and __LINE__
+ noise.
+ - Remove comments documenting shared variables used by
+ subroutines. These are far from useless but too tedious to
+ keep up to date while the code is in flux.
+ - Note several places for further code review or refactoring
+ with "XXX" comments.
+ - Add Vim modeline.
+
+ grog now passes all its tests and correctly infers arguments for
+ all in-tree groff documents (except for a known, and already
+ documented in grog(1), false positive detection of soelim in
+ soelim(1)). This refactor also obviates or resolves several
+ outstanding Savannah tickets.
+
+ Fixes <https://savannah.gnu.org/bugs/?44707> by obviating it;
+ grog no longer cares about file name extensions on man pages (or
+ any other input).
+
+ Fixes <https://savannah.gnu.org/bugs/?55302>; same. The quality
+ of diagnostic messages has been improved as well.
+
+ Fixes <https://savannah.gnu.org/bugs/?59753>; same.
+
+ Fixes <https://savannah.gnu.org/bugs/?59664>. The attached
+ patch was a less aggressive refactor of &do_line and %Groff.
+ Its author made the following claim for it: "With this patch,
+ all 'man', 'me', 'mom, and 'ms' files in the repository are
+ correctly identified. The only example of a 'mm'-file is
+ "letter.mm", which is not recognized correctly." As noted
+ above, the present refactor achieves correct recognition of all
+ of the files, including letter.mm.
+
+2021-06-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/tests/smoke-test.sh: Perform whole-line
+ matches. Apply DRY principle to expected output. In
+ anticipation of pending changes to grog.pl, uncomment and add
+ tests for several in-tree documents.
+ doc/meref.me
+ contrib/mom/examples/copyright-chapter.mom
+ contrib/mom/examples/copyright-default.mom
+ contrib/mom/examples/letter.mom
+ contrib/mom/examples/mom-pdf.mom
+ contrib/mom/examples/mon_premier_doc.mom
+ contrib/mom/examples/sample_docs.mom
+ contrib/mom/examples/slide-demo.mom
+ contrib/mom/examples/typesetting.mom
+ doc/webpage.ms
+
+2021-06-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grog]: Refactor. Discard filename extension-based inference.
+
+ * src/utils/grog/grog.pl (do_line): Stop saving the control
+ character in the matched scalar `command` (the request or macro
+ name). We don't need it, and it simplifies much later matching.
+ (handle_file_ext): Delete.
+ (top level): Drop call site.
+
+ * src/utils/grog/grog.pl: Rename `tmac_ext` scalar to
+ `inferred_main_package`.
+
+2021-06-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/grog.pl (handle_args): Complain less noisily
+ and more comprehensibly when given unrecognized groff options.
+
+2021-06-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grog]: Handle "--" argument as documented.
+
+ * src/utils/grog/grog.pl (handle_args): Rename scalar
+ `double_minus` to `no_more_options` so it actually communicates
+ something. Drop openability check of operand encountered after
+ "--"; since it's on the operand list, it will be checked later
+ {in `handle_whole_files`}. Stop pushing "--" itself onto the
+ `filespec` list.
+
+ Fixes <https://savannah.gnu.org/bugs/?60834>.
+
+2021-06-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grog]: Revise operand handling, diagnostics, and exit status.
+
+ * src/utils/grog/grog.pl: Track more state so that we can
+ process the argument list more intelligently and exit with a
+ meaningful status. Add `had_inference_problem`,
+ `had_processing_problem`, and `have_any_valid_args` Boolean
+ scalars.
+ (fail): Add diagnostic subroutine for serious problems; sets
+ `had_processing_problem`.
+ (handle_args, handle_file_ext): Stop complaining here about
+ unopenable file operands.
+ (handle_whole_files): Complain only here, with `fail` if a file
+ operand cannot be opened.
+ (make_groff_line_rest): Don't exit immediately if there is a
+ macro package inference clash, because there might be more
+ operands to process. Instead, set `had_inference_problem`.
+ Stop exiting from this subroutine.
+ (top level): Only call the inference subroutines if we had a
+ valid operand to work with (including an implicit read from
+ stdin). Exit with a status corresponding to the Booleans
+ declared above.
+
+ * src/utils/grog/grog.1.man (Exit status): Add section; describe
+ semantics of exit status values.
+
+ Fixes <https://savannah.gnu.org/bugs/?60833>.
+
+2021-06-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grog]: Revise diagnostic messages.
+
+ * src/utils/grog/grog.1.man (err): Rename from this...
+ (warn): ...to this. Prefix diagnostic with command name and
+ diagnostic severity level. The subroutine didn't change the
+ exit status and was not used to report serious trouble, so
+ "warning" seems appropriate.
+ (make_groff_tmac_man_ms): Update call sites. Modify diagnostic
+ wording to stop calling macros "requests".
+
+2021-06-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/grog.1.man (Limitations): Add subsection
+ covering the problem grog has with soelim inference. Undocument
+ groff's -s option as one that can be inferred, because at
+ present it cannot be.
+
+ Prompted by Savannah #60421.
+
+2021-06-26 Dave Kemper <saint.snit@gmail.com>
+
+ [grog]: Fix erroneous detection of pic(1) usage.
+
+ Fixes <https://savannah.gnu.org/bugs/?60772>.
+
+2021-06-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/grog/tests/PF-does-not-start-pic-region.sh:
+ Regression-test Savannah #60772.
+ * src/utils/grog/grog.am (grog_TESTS): Run test.
+
+2021-06-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grog]: Add smoke test.
+
+ * src/utils/grog/tests/smoke-test.sh: Add test.
+ * src/utils/grog/grog.am (grog_TESTS): Run it.
+ (TESTS): Add `grog_TESTS`.
+ (EXTRA_DIST): Ship test.
+
+2021-06-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grog]: Relocate in source tree.
+
+ * src/roff/grog: Move from here...
+ * src/utils/grog: ...to here.
+
+ * MANIFEST:
+ * Makefile.am:
+ * src/utils/grog/grog.am: Reflect move.
+
+ Fixes <https://savannah.gnu.org/bugs/?60788>.
+
+2021-06-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Assigning Formats): Revise discussion.
+ Clarify that a format never causes truncation of an interpolated
+ magnitude. Note that non-Arabic number formats cannot be used
+ as operands to arithmetic expressions. Add example of how to
+ work around this.
+
+2021-06-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Clarify diagnostics.
+
+ * src/roff/troff/reg.cpp (reg::set_increment): Update diagnostic
+ to unabbreviate "auto".
+ (reg::alter_format): Update diagnostic to say "assign" instead
+ of "alter", since the documentation consistently uses the former
+ term.
+
+2021-06-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [troff]: Slightly refactor. Make the source code slightly more
+ accessible by using a `bool` type for a member function's
+ default parameter used as a Boolean, and comment it at call
+ sites where the default is overridden.
+
+ * src/roff/troff/token.h (token::get_char): Change type of
+ parameter from `int` to `bool` and default from 0 to `false`.
+ * src/roff/troff/input.cpp (token::get_char): Update definition.
+ * src/roff/troff/env.cpp (hyphen_word):
+ * src/roff/troff/node.cpp (remove_font_special_character):
+ * src/roff/troff/input.cpp (do_overstrike, do_bracket, next)
+ (do_define_character, remove_character, get_line_arg)
+ (encode_char, do_if_request, do_translate, char_flags)
+ (hyphenation_code, define_class): Update call sites. Add
+ comment indicating meaning of parameter.
+
+2021-06-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (TH): When outputting HTML, write the
+ possibly case-transformed (but not yet abbreviated) page title
+ as the `title` element instead of the unaltered first argument
+ to `TH`.
+
+2021-06-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (an-abbreviate-title): Define with `de`, not
+ `de1`, since it is not intended for call by traps or users.
+
+2021-06-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Tab Stops): Fix erroneous claim; tab stops are
+ not set "every half inch across the page". This is only true in
+ "line tabs mode", which is not enabled by default. The default
+ behavior, to keep compatibility with AT&T troff, measures tab
+ stops relative to the current position on the input line.
+
+2021-06-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-nroff-u: Set the usekeeps register used by tbl
+ to the logical complement of the cR (continuous rendering)
+ register. This prevents blank lines from creeping into tables
+ in that mode.
+
+2021-06-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (an-blank-line-trap, an-leading-space-trap):
+ We say in a comment, "Macros ... that are called by traps of any
+ kind must be defined with `de1` because they might be called
+ from a context where compatibility mode is enabled." So do it.
+
+2021-06-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (an-header): Lightly refactor; tighten.
+
+2021-06-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (an-write-paragraph-tag): Lightly refactor
+ for clarity and to reduce code duplicated in both branches of an
+ `ie`/`el` structure.
+
+2021-06-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac: Rename `an-HF-remap-I-style` register to
+ `an-remap-I-style-in-headings` for greater clarity.
+
+2021-06-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-common-u (doc-header, doc-end-macro): Partially
+ revert bf4b3dde (from 20 May); per Ingo Schwarze, continuous
+ rendering in mdoc(7) documents has always used only one vee
+ between headers, footers, and man page body text.
+
+2021-06-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/en.tmac: Stop using `do` request; it's unnecessary since
+ the file is already loaded with compatibility mode off.
+
+2021-06-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Fix doc omission; .ID can take an argument.
+
+ * doc/groff.texi (ms Document Control Settings) <DI>:
+ Characterize register setting as a _default_.
+ (ms Displays and Keeps): Add optional variable "indent" argument
+ to syntax summary of ".DS I" and ".ID". Note that the given
+ indentation is used if present, and \n[DI] otherwise.
+ * doc/ms.ms (Displays and keeps): Add optional variable "indent"
+ argument to syntax summary of ".ID". Switch fonts more
+ carefully and apply italic corrections.
+ * tmac/groff_ms.7.man (Displays and keeps): Sync with doc/ms.ms.
+
+2021-06-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac: Properly situate devtag flag-related register
+ names in the package name space. Rename `need_eo_h` to
+ `s@devtag-needs-end-of-heading'. Rename `need_eo_tl` to
+ `s@devtag-needs-end-of-title`.
+ ((initialization), par@reset, @SH, par@finish, @NH): Do it.
+ (par@reset): Test their values more idiomatically.
+
+ Fixes last third of <https://savannah.gnu.org/bugs/?42515>.
+
+2021-06-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac-u (@h): Migrate SCCS revision 2.37 to be idiomatic
+ for groff (and not throw warnings of type 'mac').
+
+2021-06-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Improve diagnostics during documentation
+ generation; none should occur normally, but when they do, seeing
+ troff complain about "<standard input>" is disheartening.
+ (DOC_GROFF_ONLY): Add -b option so we get backtraces (also kill
+ off trailing whitespace).
+ (DOC_GROFF):
+ (doc/pic.html):
+ (doc/webpage.html): Add sed expression to inject `lf` request
+ into the stream to identify the file being processed.
+
+2021-06-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/me-revisions: Supplement history with subsequent BSD work
+ from versions 2.29 (1988-04-22) to 8.1 (1993-06-05).
+
+2021-06-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/me-revisions: Add 'me' macro package revision log, scraped
+ from <https://svnweb.freebsd.org/csrg/share/me/revisions>.
+ * doc/doc.am (DOCFILES): Ship it.
+
+2021-06-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac-u: Rename registers for clarity. Unlike other
+ macro packages supplied by groff, "me" mostly remains within the
+ AT&T 2-character name space, accessing extended names
+ selectively through `do` and `de1` requests. The package
+ therefore has no characteristic name prefix.
+ need_eo_h -> devtag-needs-end-of-heading
+ need_eo_tl -> devtag-needs-end-of-title
+ need_tl -> devtag-needs-title
+ (@html_check_need_title, sh, EQ): The foregoing registers are
+ effectively Booleans, so perform Boolean-style tests on their
+ interpolations.
+
+ Fixes a second third of <https://savannah.gnu.org/bugs/?42515>.
+
+2021-06-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/e.tmac-u: Work in compatibility mode. It seems this was
+ the intention (reasonable, since "me" originates in pre-groff
+ BSD Unix), but there were several problems.
+ (@R): Prefix register existence test with `do`.
+ (@html_check_need_title): Define with `do` since the macro name
+ is long, and also with `de1` so that we can freely use groff
+ extensions within. Drop many `do` requests from macro
+ definition.
+ (@check_need_title): Define with `do`, as above. Add comment
+ explaining why `de1` is not needed for this macro definition.
+ (@S): Prefix macro/string existence test with `do`. Remove
+ spurious space so that the argument string name is truly defined
+ as empty.
+ (nm, n1, n2): Prefix handling of long register names `_#p` and
+ `_#f` with `do` request.
+ (top level): Prefix `mso` request with `do`.
+ ((x-html): Define with `do` and `de1` instead of `de`. Drop
+ now-unnecessary `do` requests from macro body.
+ ()x-html): Define with `do` and `de1` instead of `de` for
+ symmetry.
+ (xp-html): Define with `do` and `de1` instead of `de`. Drop
+ now-unnecessary `do` requests from macro body.
+
+ Fixes <https://savannah.gnu.org/bugs/?60785>.
+
+2021-06-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/devtag.tmac: Work in compatibility mode; define macros
+ with the `de1` instead of the `de` request.
+
+2021-06-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/refer-me.tmac:
+ * tmac/refer.tmac: Add include guards.
+
+2021-06-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/refer-me.tmac: Handle being loaded in compatibility mode.
+
+2021-06-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac: Properly situate devtag flag-related
+ register names in the package name space. Rename `need_eo_h` to
+ `an-devtag-needs-end-of-heading'. Rename `need_col2` to
+ `an-devtag-needs-second-column`.
+ (an-input-trap, SH, SS, HP, (initialization)): Do it.
+ (an-input-trap): Test their values more idiomatically.
+
+ Fixes one third of <https://savannah.gnu.org/bugs/?42515>.
+
+2021-06-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (do_if_request): Improve diagnostic
+ message; say "conditional operator", not just "conditional".
+
+2021-06-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (an-end, an-header): In continuous rendering
+ mode, use same spacing amount after header and before footer as
+ mdoc in its own continuous rendering mode. Thanks to Ingo
+ Schwarze for the suggestion.
+
+ Fixes <https://savannah.gnu.org/bugs/?60653>.
+
+2021-06-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (P): Define this as the "canonical"
+ paragraphing macro.
+ (LP, PP): Make these aliases of P.
+
+2021-06-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (spring_trap): Tighten lexical
+ discipline; describe macro as "trap-called" rather than
+ "trap-invoked".
+
+2021-06-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Don't spuriously break a page after a paragraph tag when
+ the tag is short enough to fit within the paragraph's
+ indentation.
+
+ * tmac/an-old.tmac (an-write-paragraph-tag): Reserve ("need") 2
+ vees plus 1 basic unit of vertical space regardless of the width
+ of the tag. In the short tag case, we reverse space by one vee
+ after outputting the diversion in which the tag is stored, but
+ it will always contain a break, and by the time we reverse, we
+ might have already hit a page location trap
+ {an-break-body-text}, and by then it's too late to back up.
+
+ * tmac/tests/an-old_no-break-after-short-paragraph-tags.sh: Test
+ it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+ Fixes <https://savannah.gnu.org/bugs/?60624>.
+
+2021-06-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac: Rename environments to be more descriptive.
+ an-env -> an-env-header-or-footer
+ an-2 -> an-env-paragraph-tag
+ (an-header, an-footer, an-write-paragraph-tag): Do it.
+
+2021-06-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac: Add diagnostic error if .EQ used within .TS/.TE.
+ Introduce register `tbl@within-table` to track whether we're
+ inside a table.
+ (@EQ): Check register and issue error if it is true.
+ (@TS): Set register.
+ (@TE): Clear register.
+
+ Prompted by Savannah #55754.
+
+2021-06-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac: Permit document to start with .PS.
+ (cov*ab-init): Alias PS to @PS.
+ (PS): Call LP, then re-execute (aliased) self as TS does.
+ (TS): Update comment to parallel the one in PS.
+
+2021-06-11 Tadziu Hoffmann <hoffmann@usm.uni-muenchen.de>
+
+ Indent an IP paragraph based on the type size of the paragraph
+ text, not a preceding heading. We have to delay evaluating IP's
+ argument until the font size has been reset, which I've
+ attempted to do by simply passing the argument unevaluated down
+ the call hierarchy, instead of saving it in a number register
+ right away, as appears customary in this ms implementation.
+
+ However, par@reset is called from a great number of places, and
+ these usually set the indent registers beforehand. I've left
+ this as it is, so now two ways of setting the indents exist: via
+ register and optionally via argument.
+
+ * tmac/s.tmac (par@reset): Move font-size setting stuff before
+ indent-setting stuff; set registers from optional arguments with
+ default "n" scaling indicator before setting indents.
+ (par*start, par@finish): Don't set registers, but instead pass
+ arguments to par@reset.
+ (@IP): Pass argument unevaluated to par*start.
+
+ Fixes <https://savannah.gnu.org/bugs/?59604>.
+
+2021-06-11 Tadziu Hoffmann <hoffmann@usm.uni-muenchen.de>
+
+ * tmac/s.tmac (@QP, @XP): Be more scrupulous about using "u"
+ scaling indicator.
+
+2021-06-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Add regression test for Savannah #59604.
+
+ * tmac/tests/s_IP-indents-using-paragraph-type-size.sh: Add it.
+ * tmac/tmac.am (tmac_TEST): Run it.
+
+2021-06-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Refactor grog even more aggressively. Make the tedious search
+ for subs.pl unnecessary by inlining it into grog.pl directly.
+ This makes the script stand alone and much more convenient to
+ work with, and doesn't contribute to bloat, in my
+ opinion--subs.pl was 10 times the size of grog.pl, and most of
+ the code in the latter was dedicated to trying to locate
+ subs.pl.
+
+ * Makefile.am: Delete references to $(grog_dir).
+ * configure.ac: Delete call of `GROFF_GROGDIR_DEFAULT` macro.
+ * m4/groff.m4: Delete definition of same.
+ * src/roff/grog/grog.am (GROG, dist_grog_DATA, grogdir): Drop
+ variables.
+ (grog): Remove target's dependency on `$(GROG)`. Remove sed
+ expression replacing `@grog_dir@` with `$(grog_dir)` in grog.pl.
+ * src/roff/grog/grog.pl: Inline most of subs.pl (except for
+ author/license comment banner). Delete sub-hunting logic.
+ * src/roff/grog/subs.pl: Delete.
+
+2021-06-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/pic.ms (Basic PIC Concepts, Decorating Objects/Filled
+ Objects, PIC Reference/Semi-Formal Grammar): Fix error: the
+ keyword "solid" sets a line style, not a fill for a closed
+ figure. Thanks to Dave Kemper and Wim Stockman for reporting
+ and researching this issue.
+
+ Fixes <https://savannah.gnu.org/bugs/?60470>.
+
+2021-06-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * NEWS:
+ * doc/webpage.ms:
+ * man/groff.7.man (Registers/Read-only registers) <.U>:
+ * man/groff_diff.7.man (Language/New number registers) <.U>: Fix
+ error; the sense of this Boolean variable was backwardly
+ documented {perhaps due to an implementation detail from 2004
+ that was reversed in commit 7a0e2f15, 26 February 2008}.
+
+2021-06-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/groff.cpp: Revise usage message.
+ (synopsis): Set primary synopsis on a single output line, for
+ convenience of parsing and also because we have no control over
+ the width of the program name in character cells; it comes from
+ argv[0] and is under user control. There is thus no point in
+ trying to get pretty formatting. Also include separate synopsis
+ lines for short and long help options. Use opposite case from
+ option flags for option arguments.
+ (help): Collate option flags in English lexicographic order.
+ Include space after flag letters for options that take
+ arguments. Consistently use capitals for option arguments
+ because they are space-separated here. Illustrate longer forms
+ of -d and -r options. Update language (some, like "tmac.name",
+ was very old). Add reference to groff(1) man page at end.
+ (usage): Drop appendnment of notice regarding -h option; this is
+ now covered in `synopsis()` unconditionally.
+
+2021-06-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Eliminate "groff_opts_no_arg.txt" and "groff_opts_with_arg.txt"
+ files from distribution. They are not needed by any live code
+ in the tree; possibly only groffer ever used them.
+
+ * src/roff/groff/groff.am (GROFF_OPTS_OUTPUT, groffoptsdir)
+ (groffopts_DATA): Delete variables.
+ (MOSTLYCLEANFILES): Stop adding to target.
+ (groff_opts.tmp, groff_opts_no_arg.txt,
+ groff_opts_with_arg.txt): Delete targets.
+
+2021-06-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/grog/subs.pl (version): Report version information in
+ a format consistent with our other programs.
+
+2021-06-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/grog/grog.pl: Refactor initialization so that the
+ program can be run from a build tree--and tested. Drop much
+ cruft from before Bertrand Garrigues's 2018 work to adopt
+ `git-version-gen`.
+
+2021-06-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/an-old_title-abbreviation-works.sh: Log more
+ accurate messages in test failures.
+
+2021-06-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (an-abbreviate-title): Add new internal macro
+ to reduce the length of a man page title (i.e., the "ls" in
+ "ls(1)", if it is too wide to fit in the page header (and would
+ overwrite the center header material, usually the title of the
+ manual section). Since the beginning and end of the title might
+ be important for disambiguation, truncation at either end would
+ be unwise; replace the middle of the title with an ellipsis.
+ Define new an-pageref and an-title-abbv strings for use by other
+ macros and user-defined PT and BT traps.
+ (PT, an-footer): Use new an-pageref string for economy.
+ (an-header): Call an-abbreviate-title after setting the title
+ length.
+
+ * tmac/tests/an-old_title-abbreviation-works.sh: Test it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+ Fixes <https://savannah.gnu.org/bugs/?43532>.
+
+2021-06-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * man/groff.7.man (Copy mode): Add new section.
+
+2021-06-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (else_request, while_request)
+ (pipe_source, open_request, opena_request, pipe_output)
+ (system_request): Update diagnostic messages to not presume the
+ identities of the control or escape characters.
+
+2021-06-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Conventions Used in This Manual): Add node.
+
+2021-05-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/groff.1.man: Expand to aid beginners.
+ (initialization): Define `TeX` string.
+ (Usage): Rewrite.
+ (Usage/Getting started): Add "Hello, world!" example using
+ multiple output devices (formats).
+ (Usage/Using groff as a REPL): Add example of likely interest to
+ programmers. Or so I hope. It illustrates the Turing
+ fundamentals; we read, store, test, and branch.
+
+2021-05-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/papersize.tmac: Improve diagnostic message; when
+ complaining about unrecognized input, report back the input we
+ actually received, not what it looks like after we transform it.
+ Also add name of macro package to diagnostic so the user knows
+ who is speaking, continuing the long process of fixing Savannah
+ #52463.
+
+2021-05-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/groff_ms.7.man (Usage/Paragraphs) <QP>: Fix error: .QP
+ paragraphs are indented by \n[QI], not \n[PI].
+
+2021-05-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libdriver/input.cpp (do_file): Make fatal diagnostic
+ from output driver when the device description file "DESC" can't
+ be found more informative by including the name of the device
+ for which the input was prepared. Also makes malformed input of
+ intermediate format more obvious.
+
+2021-05-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/tbl.1.man (Miscellaneous): Add paragraph
+ cautioning users against making tbl(1) tables conditional
+ document content.
+
+2021-05-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Add style warnings for documents with input lines that
+ are blank or have leading spaces, since they can cause
+ surprising rendering; enabled if the CHECKSTYLE register is
+ greater than 2.
+
+ * tmac/an-old.tmac (an-blank-line-trap, an-leading-space-trap):
+ Issue style warning if enabled (and only if fill mode enabled in
+ leading space trap); in any event, recreate the default *roff
+ behavior.
+ (TH): Install traps.
+
+ * doc/andoc.tmac (reload-doc): Remove man(7) traps before
+ loading doc.tmac.
+
+2021-05-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/andoc.tmac (reload-doc): Fix spurious blank line.
+
+2021-05-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Operators in Conditionals):
+ * man/groff.7.man (Control structures/Conditional expressions):
+ Fix omission; the conditional operators "F", "m", and "S" also
+ accept optional spaces and/or tabs between themselves and their
+ arguments.
+
+2021-05-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * man/groff.7.man (Requests/Request short reference) <.ta>:
+ Describe the request as tersely as possible without omitting its
+ essential syntax and semantics. (The AT&T troff "+" relative
+ prefix for normally absolute positions ".ta 1i +1i +1i" and
+ alignment-specifying suffixes "L", "R", and "C" had both been
+ omitted.)
+
+2021-05-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * man/groff.7.man (Registers/Writable registers): Fix error:
+ \n[nl] interpolates the current vertical position, not the
+ vertical position of the "last printed text baseline"; the
+ latter is \n[.h].
+
+2021-05-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Manipulating Filling and Adjustment): Update
+ inter-sentence space example to be more illustrative. Thanks to
+ Dave Kemper and Doug McIlroy for the discussion.
+
+ Fixes <https://savannah.gnu.org/bugs/?60404>.
+
+2021-05-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-common-u: Add comment warning source divers that
+ \n[doc-header-space] is re-used for a purpose for which it is
+ not documented.
+ * tmac/mdoc/doc-nroff-u: Initialize doc-{header,footer}-space
+ registers, which define the vertical spacing between body text
+ and the relevant titles (not between the titles and the page
+ margins) to 1v instead of 0.5i. This is what mdoc(7) has always
+ done in practice, per Ingo Schwarze.
+
+2021-05-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grohtml/post-html.cpp (assert_state::add): Avoid
+ potential deallocation of statically-allocated strings. Use
+ strsave() to duplicate them so that they can be safely handed to
+ a_delete(). Also update diagnostic message to report name of
+ complaining program (continuing the long process of fixing
+ Savannah #52463).
+
+ Fixes <https://savannah.gnu.org/bugs/?55693>. Thanks to
+ Petru-Florin Mihancea for the report.
+
+2021-05-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/troffrc-end: Fix transposition error (in commit a248aa33
+ on 15 January) that broke most table image generation in HTML
+ output.
+
+ Fixes <https://savannah.gnu.org/bugs/?60656>.
+
+2021-05-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-ext.tmac (UE, ME): Replace calls to HTML-NS macro for
+ emissions of HTML 'A' tags with direct usage of \X device
+ control escapes. Replace .nop requests with text lines since
+ this file is supposed to be maximally portable to other *roffs.
+
+2021-05-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/html/pre-html.cpp (main): Call `scanArguments()`
+ earlier, before trying to load a font description, so that -v,
+ --version, and --help work.
+
+2021-05-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [grohtml]: Add -C and -G options to postprocessor, to suppress
+ output of CreationDate and Creator HTML comments, respectively.
+ These can inject unwanted noise into build artifacts.
+
+ * src/devices/grohtml/post-html.cpp: Add static globals
+ `do_write_creator_comment` and `do_write_date_comment`.
+ (html_printer::{do_file_components,~html_printer}): Write
+ comments per corresponding global variables.
+ (main): Add to `getopt_long()` call parameter and set as needed.
+ (usage): Document them.
+
+ * src/preproc/html/pre-html.cpp (scanArguments): Add to
+ `getopt_long()` parameter, but ignore.
+
+ * src/devices/grohtml/grohtml.1.man (Synopsis, Options):
+ Document them.
+
+ * src/roff/groff/tests/output_driver_C_and_G_options_work.sh:
+ Test them.
+ * tmac/tmac.am (groff_TESTS): Run test.
+
+ Fixes 1/3rd of <https://savannah.gnu.org/bugs/?60655>.
+
+2021-05-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/html/pre-html.cpp (usage):
+ * src/devices/grohtml/post-html.cpp (usage): Fix inaccuracies in
+ supported option summary.
+
+2021-05-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/html/pre-html.cpp (scanArguments):
+ * src/devices/grohtml/post-html.cpp (main): Use libgroff's
+ warning() instead of printf() to emit diagnostic about
+ unrecognized parameter to `-x` option. This sends the
+ diagnostic to the standard error stream and continues the long
+ process of fixing Savannah #52463.
+
+2021-05-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/groff_www.7.man: Stop using the "www" macro package. The
+ macros it exposes are not part of the quasi-standardized man(7)
+ language, and thus should not be used in man(7) documents. See
+ groff_man_style(7) for portability advice. Besides, the
+ extension macros in the permissively-licensed an-ext.tmac are
+ sufficient to support URL and email hyperlinks, and our SH and
+ SS macro implementations already support anchor placement
+ without requiring explicit effort from page authors.
+ (initialization): Stop sourcing www.tmac. Stop calling .LK and
+ .HR; the page-internal navigation links were being placed after
+ the apropos line instead of at the beginning of the page,
+ contradicting the comment that was there (possibly a bug).
+ (Requests) <URL, LK>: Stop calling .TAG.
+ <LK>: Drop paragraph advising reader to format page for groff's
+ HTML output device to observe the navigation links at that point
+ in the test.
+
+2021-05-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Comments): Fix error in description of parser
+ operation; '.\"' is an effective whole-line comment not because
+ it is a call of an undefined macro named '\"' (no 'mac' warning
+ is emitted when that warning type is enabled), but because the
+ comment escape is recognized normally and what remains is
+ handled as the empty request. Clarify that the optional
+ argument to the .ig request is the name of a macro (which will
+ be called normally _and_ end the ignored region; this is
+ analogous to ".de foo bar").
+
+2021-05-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-ext.tmac (UR, UE, MT, ME): Rename environment and
+ diversion for clarity; they apply to the link text, not the URL
+ {or email address}. The latter might not visibly appear,
+ depending on the output driver.
+
+2021-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (TH): Remove extraneous right-brace escape.
+
+ Fixes <https://savannah.gnu.org/bugs/?60651>. Thanks to Bjarni
+ Ingi Gislason for catching it.
+
+2021-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Copy Mode): Fix omissions from list of escape
+ sequences interpreted even in copy mode. Add \g, \V, "\.",
+ '\"', \#, \a, \e and \E (with caveat), and \t. Parallels
+ groff(7) now. Add cross reference to "Character Translations"
+ node.
+
+2021-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * man/groff.7.man (Escape Sequences): Fix omission; the escape
+ character in an unrecognized escape sequence is not merely
+ ignored; the sequence produces a warning diagnostic, albeit of a
+ type that is disabled by default.
+ (Escape Sequences/Escape short reference): Fix omissions; \# and
+ \V are interpreted even in copy mode.
+
+2021-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (an-header): Fix missing brace escape.
+
+2021-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Slightly refactor footer spacing management when
+ continuously rendering.
+
+ * tmac/an-old.tmac (an-end): Increase the page length _after_
+ flushing a pending output line. Do so only by the amount of
+ spacing we actually perform next. Make the scaling indicator on
+ the .sp request explicit. The amount seemed magical because it
+ was accounting for the one line to be consumed by output of the
+ footer title line. Instead, move that further increase of the
+ page length from here...
+ (an-footer): ...to here (~250 lines away), before calling BT.
+
+2021-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-common-u (doc-end-macro): When continuously
+ rendering and after flushing the last line of the body text of a
+ page, vertically space by 3 vees instead of 1, for consistency
+ with our man(7) implementation. Also increase page length by
+ same amount _after_ flushing a pending output line, for symmetry
+ with other spacing requests (and to prevent nasty surprises
+ analogous to those in Savannah #60611).
+ (doc-header): Put 3 vees of space after the header in continuous
+ rendering mode, not 1 (and increase page length accordingly).
+
+2021-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Add warnings for macros deprecated in groff_man(7),
+ emitted if the CHECKSTYLE register is greater than 1.
+
+ * tmac/an-old.tmac (an-deprecation-warn): New macro emits
+ diagnostic.
+ (DT, PD): Call the foregoing, re-using arguments.
+
+2021-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac: Refactor to move bodies of DT and PD into
+ private macros.
+ (an-reset-tab-stops, an-reset-paragraph-spacing): New names for
+ the former DT and PT.
+ (TH): Call these new macro names.
+ (DT, PD): Wrap the corresponding private macros.
+
+2021-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (an-bp): In continuous rendering mode, draw
+ a horizontal line between a page footer of one man page document
+ and the header of the next, but only if multiple documents are
+ being rendered.
+ (initialization): Use variable to ensure we don't draw this line
+ after finishing the only document we render.
+
+ Fixes other half of <https://savannah.gnu.org/bugs/?60611>.
+
+2021-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Fix stochastic vertical space loss problems in continuous
+ rendering mode by being more scrupulous about extending the page
+ length. As noted in Savannah #60611, sometimes the vertical
+ space between a header line and the first section heading
+ {"Name"} would be reduced or removed altogether, in a way that
+ was highly sensitive to circumstances. As far as I can tell,
+ the problem is that this vertical space disappeared only when we
+ were in double-secret probation no-space mode; this is the
+ special non-spacing mode {not apparent with inspection of
+ \n[.ns]} that happens when the stealth internal page location
+ trap is sprung. This trap does not appear in .ptr output but
+ can be disabled with ".vpt 0", which is an alternative fix for
+ this problem {because continuous rendering mode does not use
+ vertical position traps at all}. Another fix might have been to
+ simply call the moral equivalent of ".pl MAXINT" as soon as
+ continuous rendering mode was decided upon.
+
+ * tmac/an-old.tmac (an-header): In continuous rendering mode,
+ extend the page length by one line before calling PT to output
+ the page header, and afterwards, extend the page length by 3
+ vees and space by that amount (instead of half an inch).
+
+ Fixes half of <https://savannah.gnu.org/bugs/?60611>.
+
+2021-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (an-header, an-footer): Drop no-op .tl
+ requests.
+
+2021-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (an-footer): Improve symmetry with an-header.
+ If rendering to HTML, don't bother setting the
+ an-outer-footer-text, an-extra1, and an-extra2 strings to empty
+ values; instead don't call BT, just as we don't call PT in
+ an-header.
+
+2021-05-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (an-end): Drop needless .nr % assignment.
+ Call our (wrapped) bp instead of the .pl request directly.
+ (an-bp): Drop needless .br and (aliased) real .bp request.
+
+2021-05-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (an-footer): Refactor complex conditional.
+
+2021-05-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/an-old_X-register-works.sh: Add test for footer
+ creeping into page content.
+
+2021-05-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (initialization): Ignore P and X rendering
+ parameter registers if specified with continuous rendering
+ enabled (the default in the nroff mode used for terminals), and
+ emit diagnostic.
+
+2021-05-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/an-old_X-register-works.sh: Rewrite. Increase test
+ coverage and stop assuming that -rcR=1 and -rX=anything is a
+ supported combination. (Continuous rendering is supposed to
+ suppress the printing of page numbers anyway.)
+
+2021-05-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (initialization): Refactor handling of P and
+ X rendering parameter register validation in preparation for
+ disabling them in continuous rendering mode, where they don't
+ make any sense.
+
+2021-05-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/an-old_TH-repairs-ad-damage.sh: Tweak test
+ internals to make troubleshooting easier.
+
+2021-05-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (TH): Relocate some initialization logic to
+ be adjacent to (most of) the rest of it.
+
+2021-05-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (TH): Remove useless .if. Its condition is
+ always true now in the wake of the fix for Savannah #60609.
+
+2021-05-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac: Rename many package macros, strings, and
+ registers (and the lone named environment) to be more expressive
+ of their function. "an-footer" is now the proper complement of
+ "an-header" (setting up an environment and calling a
+ user-redefinable trap macro).
+ an-first -> an-is-first-page-of-document
+ an-html -> an-is-output-html
+ an-footer -> an-break-body-text
+ an-p-footer -> an-footer
+ an-set-margin -> an-reset-margin-and-inset-level
+ an-level -> an-inset-level
+ an-tag-sep -> an-tag-separation
+ an-no-space-flag -> an-need-no-space-mode
+ an-break-flag -> an-need-break
+ an-div? -> an-is-in-diversion
+ an-page-string -> an-outer-footer-text
+ an-trap -> an-input-trap
+ an-do-tag -> an-write-paragraph-tag
+ an-1 -> an-env
+
+ * tmac/andoc.tmac (reload-doc): ...as above for the exposed
+ parts of the interface.
+ an-footer -> an-break-body-text
+ an-p-footer -> an-footer
+
+2021-05-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac: Rearrange alternating font macros to be in
+ alphabetical order (and the order documented in groff_man(7).
+
+2021-05-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac: Refactor alternating font macros. These
+ macros are hard enough to understand without adding gratuitous
+ structural differences to the reader's burden. Make their
+ implementations rigidly parallel. Update comments.
+ (RI, IR, IB, BI, RB, BR): Always define the `an-result` string
+ as empty except for a dummy character '\&' for the sake of
+ compatibility mode.
+ (RI, IR, IB, BI): Defer interpolation of the first argument to
+ the while loop if there are at least two (like the existing RB,
+ BR). This way the style name arguments to the font selection
+ escape sequences in the appendment to `an-result` match the
+ order of the letters in the macro name (useful to make sense of
+ diffs).
+ (RI, IR, IB, BI, RB, BR): Always remove the `an-result` string
+ after interpolating it.
+ (RB, BR): Only do work if there are any arguments.
+
+2021-05-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Apply italic corrections more consistently.
+
+ * tmac/an-old.tmac (BI, IB, IR, RI): Apply italic corrections
+ more consistently. Add lengthy comment rationalizing approach.
+ (RI, BI): An italic correction is now applied after the last
+ argument if it is of even parity (i.e., the 2nd, 4th, 6th, ...).
+
+ * tmac/groff_man.7.man.in (Description/Font style macros): Note
+ that italic corrections are applied.
+
+ Fixes <https://savannah.gnu.org/bugs/?53541>.
+
+ Thanks to Bjarni Ingi Gislason for the report and a suggested
+ patch.
+
+2021-05-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Ignore FT register when appropriate.
+
+ * tmac/an-old.tmac (initialization): Validate user-specified
+ value of \n[FT]. Continuous rendering ignores FT (page location
+ traps are not used for footers in that mode). Measuring a
+ footer distance from the page top isn't done. A footer distance
+ of over half the page length is unlikely. A footer distance of
+ less than one line height is too. Issue diagnostics in all of
+ these cases.
+
+ * tmac/tests/tmac/tests/\
+ an-old_FT-bad-value-should-not-trash-titles.sh: Test it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+ Fixes <https://savannah.gnu.org/bugs/?60612>.
+
+2021-05-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (TH): Plant the an-footer trap (where we
+ schedule a break in the page text prior to spacing down to the
+ footer) at twice the value of \n[FT], not a hard-coded -1i.
+ This way, the user can't make the an-p-footer trap (planted at
+ \n[FT]) spring before the an-footer trap that should precede it.
+
+ * tmac/groff_man.7.man.in (Options) <-rFT>: Document this.
+
+2021-05-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_GHOSTSCRIPT_VERSION_CHECK): Add new
+ autoconf macro to check Ghostscript version. Versions 9.00 <= x
+ < 9.54 suffer from a rendering glitch that affects the AT&T
+ troff (and groff) special character \(lh; see
+ <https://bugs.ghostscript.com/show_bug.cgi?id=703187>. Store
+ the result of the check.
+ (GROFF_GHOSTSCRIPT_VERSION_NOTICE): Add new macro to report the
+ problem detected by GROFF_GHOSTSCRIPT_VERSION_CHECK to the user.
+
+ * configure.ac: Call the macros in appropriate places.
+
+ Fixes <https://savannah.gnu.org/bugs/?59531>.
+
+2021-05-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/andoc.tmac (reload-man): Remove removal of RI macro, made
+ unnecessary by commit 551f138 (15 May).
+
+2021-05-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_HTML_PROGRAMS, GROFF_PDFDOC_PROGRAMS):
+ Tweak autoconf warning messages when Ghostscript (gs) command
+ missing to be more mutually congruent.
+ (GROFF_URW_FONTS_CHECK): Tweak to note that gs is only run to
+ locate the URW fonts if gs is available.
+
+2021-05-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/an-old_AT-and-UC-footer-saved-and-restored.sh:
+ Tweak to be more helpful when troubleshooting exasperating
+ header/footer problems as in Savannah #60609.
+
+2021-05-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Fix missing page footers when continuously rendering
+ multiple documents. Resolving this uncovered entangled header
+ and footer management bugs with batch processing even when _not_
+ continuously rendering.
+
+ * tmac/an-old.tmac (an-start-new-document): New macro clears
+ header trap so it doesn't get called with stale information.
+ {The TH macro already replants a header trap with every man
+ page if not continuously rendering.} This macro also absorbs
+ the break-page and page number incrementation logic from TH.
+ (TH): Adapt semantics of "an-first" register to mean not "first
+ page rendered" (apparently) but "first page of new document".
+ If we are _not_ on the first page of a new document and the TH
+ macro is called, we must be batch processing: force the previous
+ man page to end (call an-end if continuously rendering, or
+ an-start-new-document if not). After all the header and footer
+ strings have been configured for the man page, call an-header if
+ we're on the first page of the document, not (just) if we're
+ continuously rendering. Zero an-first register at end of macro
+ here unconditionally instead of conditionally in .an-header.
+ (an-header): Drop conditional on continuous rendering.
+
+ When I batch-render our 62 man pages to the terminal, I do note
+ one cosmetic regression: the lj4_font(5) page, when continuously
+ rendered in batch processing, has no space between its header
+ line and first section heading ("Name"). Another cosmetic issue
+ in this scenario is that the footers for every rendered page but
+ the last, which had (wrongly) been absent entirely, are set with
+ no space after them and the header of the next.
+
+ * tmac/tests/an-old_page-footers-present.sh:
+ * tmac/tests/an-old_page-header-has-current-data.sh: Add man
+ page header/footer regression tests.
+ * tmac/tmac.am (tmac_TESTS): Run the tests.
+
+ Fixes <https://savannah.gnu.org/bugs/?60609>.
+
+2021-05-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (initialization): Key the reprocessing guard
+ {like a C language #include guard} on the existence of the TH
+ macro instead of RI. The latter seemed kind of random and TH
+ is even more guaranteed to exist; it is the macro name most
+ characteristic of the man(7) language and the andoc.tmac
+ superstructure relies on it. (TH may have been avoided because
+ of its use with tbl(1); however, neither man(7) nor mdoc(7)
+ support tbl's TH feature, and GNU tbl does not supply its own
+ empty fallback definition as it does for TS and TE. If we ever
+ want TH-like functionality in future man pages, I suggest we
+ pick a new, non-colliding name for it.)
+ (initialization): Relocate load of devtag package; we don't
+ need it before entering compatibility mode. Move assignment of
+ format of an-page-letter register from a "loose declaration"
+ amid macro definitions to within existence test of X register.
+ Stop initializing an-extra[123] strings outside of any macro;
+ they need to be reinitialized at every TH call when batch
+ rendering.
+ (TH): Call DT in a less surprising place.
+ (TH): Initialize all header/footer-related strings before
+ calling header macros, even those not needed for the default
+ header configuration.
+ (TH): Add style warnings for underspecified arguments.
+ (an-ne): Rename register from "an-need", which is pretty
+ confusing in context, to "an-amount", since (1) a (vertical)
+ amount is what it is, and (2) it's only used within this macro.
+ Also due to factor (2), remove the register after using it.
+
+2021-05-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_URW_FONTS): Update configure script check
+ for URW fonts to recognize recent releases of the URW Base 35
+ fonts from Artifex Software. Look for the AR (Arial roman
+ equivalent) font under all of the names recognized by
+ fonts/devpdf/Foundry.in.
+ * m4/groff.m4 (GROFF_URW_FONTS_CHECK): Update wording of notice
+ when URW fonts are not found. Replace dead URL with working
+ one. Try to hedge against the future, but the Web is an
+ ephemeral place, as are the file names Artifex gives to its
+ fonts. Thanks to T. Kurt Bond and Thomas Dupond for reporting
+ and investigating the problem.
+
+ Fixes <https://savannah.gnu.org/bugs/?60604>.
+
+2021-05-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (ms Document Control Settings) <DI>:
+ * doc/ms.ms (Document control settings, Displays and keeps)
+ <DI>:
+ * tmac/groff_ms.7.man (Document control settings, Displays and
+ keeps) <DI>: Document this register; it had been mentioned only
+ in passing.
+
+2021-05-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (ms Document Control Settings) <DD>:
+ * doc/ms.ms (Document control settings) <DD>:
+ * tmac/groff_ms.7.man (Document control settings) <DD>: Fix
+ error; changes to \n[DD] take effect at the next display
+ boundary (including the end of the active one), not the next
+ "paragraph" (paragraph macros cannot be called inside a display
+ anyway).
+
+2021-05-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/andoc.tmac (reload-man): Delete no-op line that attempts
+ to restore compatibility mode. Individual pages have to do
+ this, and ".do cp \n(.C" is not effective for the reason
+ discussed in the 2020-04-16 ChangeLog entry.
+
+2021-05-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac (@RT): Delete definition; make it an alias for
+ par@finish. Until commit 021ba0e7 (1 May), they had identical
+ definitions. I find it difficult to imagine what use it would
+ be to have an undocumented reset macro that resets everything
+ _except_ the deeply internal \n[.ev]:ai.
+
+2021-05-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: Handle HF strings with an embedded font family when
+ applying italic-to-bold-italic remapping; the feature now works
+ on troff devices as well.
+
+ * tmac/an-old.tmac (initialization): Do more validity checking.
+ Store heading family in new string \*[an-heading-family]. Clean
+ up after self.
+ (SH, SS): Include the heading family in the remapping target.
+
+ * tmac/groff_man.7.man.in (Description/Document structure
+ macros) <.SH, .SS>: Document it.
+
+2021-05-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * man/groff_char.7.man (Glyph tables/Mathematical symbols): Fix
+ errors in special character descriptions; \[sqrt] is a "special"
+ glyph (that is, it uses mathematical metrics on typesetter
+ devices), and \[radicalex) is not (and is thus a "text" glyph).
+ See Werner Lemberg's ChangeLog entry of 2003-01-05. Problem
+ dates to 07a6233ad, 27 May 2014.
+
+ The overloaded use of the word "special" really pinches here.
+
+2021-05-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tty.tmac: Replace fallback glyphs for radical extension
+ and square root extension; use \[rn] instead, which works fine.
+
+ Now the only glyph in the page that doesn't render on a UTF-8
+ terminal (if one's font has adequate coverage) is the Bell
+ System logo.
+
+2021-05-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tty.char: Add fallback characters for \[fm] and \[sd].
+
+2021-05-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [man]: If \*[HF] is a bold style, substitute bold italics for
+ italics in section and subsection headings, keeping the font
+ weight consistent.
+
+ * tmac/an-old.tmac (initialization): Set a flag for this based
+ on the interpolation of \*[HF] matching "B" as its last
+ character.
+ (SH, SS): Apply and reverse font remapping based on this flag.
+
+2021-05-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-ext.tmac (EX): Work around Savannah #59522 by changing
+ fonts differently on DVI output, avoiding a font warning.
+
+2021-05-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-ext.tmac: If in nroff mode, remap font CBI to BI.
+ * tmac/dvi.tmac: Remap font CBI to CWI. (Computer Modern
+ Constant Width has no bold styles.)
+
+2021-05-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac (NL, SM, LG): Issue warning diagnostic if macro
+ called with arguments.
+ (par*define-font-macro): Construct font macro with diagnostic to
+ warn if called with excess arguments.
+ (UL, BX): Issue warning diagnostic if macro called with excess
+ arguments.
+
+ Fixes <https://savannah.gnu.org/bugs/?60522>.
+
+2021-05-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi: Delete redefinition of \putwordAppendix
+ Texinfo macro. This restores the word "Appendix" to the names
+ of all appendices and fixes two bad internal links to Appendix
+ E, the Register Index, in the DVI and PDF output formats. Per
+ consultation with Texinfo maintainer Gavin Smith, it's difficult
+ to get the behavior we want, so give up trying for now.
+
+2021-05-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac (@MC): Actually diagnose and recover when user
+ tries to .MC inside a diversion.
+
+2021-05-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Differences from AT&T ms):
+ * doc/ms.ms (Differences from AT&T ms):
+ * tmac/groff_ms.7.man (Differences from AT&T ms): Document our
+ different default (empty) for the center footer in nroff mode;
+ this behavior appears to date back to June 1991 or earlier,
+ drawing few complaints.
+
+ Fixes <https://savannah.gnu.org/bugs/?59826>.
+
+2021-05-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/*: Rename files to use consistent scheme; one
+ underscore to separate the package name from the test objective,
+ dashes to otherwise separate words.
+ * tmac/tmac.am (tmac_TESTS): Use new names.
+
+2021-05-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Restore support for AT&T ms PN register.
+
+ * tmac/s.tmac (pg): Make register PN an alias of %.
+
+ * doc/groff.texi (Differences from AT&T ms):
+ * doc/ms.ms (Differences from AT&T ms):
+ * tmac/groff_ms.7.man (Differences from troff ms): We don't need
+ PN, and it was removed in commit 08291b40 (25 October 2020), but
+ since it is documented in Lesk 1978 we're stuck with it. Advise
+ users to stick with %. Also warn them of the hoop they must
+ jump through if they redefine the page trap macro PT, which Lesk
+ 1978 also encourages.
+
+ * tmac/tests/s_PN-works.sh: Test it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+ Fixes <https://savannah.gnu.org/bugs/?59823>.
+
+2021-05-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Restore default IP paragraph indentation after an SH call.
+
+ * tmac/s.tmac (par@finish): Set "ai" register for the current
+ environment to the paragraph indent (PI) setting for the current
+ environment.
+
+ * doc/groff.texi (Highlighting in ms) <IP>:
+ * doc/ms.ms (Highlighting) <IP>:
+ * tmac/groff_ms.7.man (Usage/Highlighting) <IP>: Update
+ documentation.
+
+ * tmac/tests/s_SH_resets_IP_indentation_amount: Test it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+ Fixes <https://savannah.gnu.org/bugs/?60222>.
+
+2021-05-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac (DS): Issue diagnostic and attempt recovery if
+ document attempts to start a display within another display.
+
+ Fixes <https://savannah.gnu.org/bugs/?55136>.
+
+2021-04-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac: Implement alternative rendering for automatic
+ footnote numbers in nroff mode, inspired by Heirloom Doctools
+ ms; since superscripting is not universally available on
+ terminals, surround number with square brackets instead.
+ (fn@init): New macro finishes initializing footnote module,
+ setting up aliases to par@sup-{start,end} strings in troff mode
+ and otherwise defining fn@sup-{start,end} as brackets. Define *
+ string here, using new strings.
+ (par): Call fn@init after par@sup-{start,end} are defined, and
+ prior to other footnote integration material.
+ (par*fp!0): Migrate from par@sup-{start,end} to
+ fn@sup-{start,end}.
+
+ * doc/groff.texi (ms Document Control Settings) <FF>:
+ * doc/ms.ms (Footnotes) <FF>:
+ * tmac/groff_ms.7.man (Usage/Footnotes) <FF>: Document it.
+
+ Fixes <https://savannah.gnu.org/bugs/?60228>.
+
+2021-04-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * test-groff.in: Stop passing the built groff executable -b and
+ -ww options by default. This reverses a change from 2017. Dave
+ Kemper has convincingly argued that there's no way to override
+ -b and turn backtraces on warnings/errors back off, and that the
+ built groff should behave as much like a "normal" one as
+ possible. The latter factor is of added importance now that we
+ are using test-groff for generation of documents.
+
+ * src/roff/groff/tests/regression_savannah_58153.sh: Adapt.
+
+2021-04-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac (BX): Add alternative implementation for terminal
+ {nroff} devices. Store width of boxed text, adding .4m only on
+ troff devices (to make room for the vertical box lines). Break
+ long input line in troff implementation. If not in troff mode,
+ use ISO 6429 color escapes to render boxed text in black on
+ white. Use the \Z escape to match breaking semantics of macro
+ in troff mode.
+
+ * doc/groff.texi (Highlighting in ms) <BX>:
+ * doc/ms.ms (Highlighting) <BX>:
+ * tmac/groff_ms.7.man (Usage/Highlighting) <BX>: Document it.
+
+ Fixes <https://savannah.gnu.org/bugs/?60477>.
+
+2021-04-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Make $(PROCESSEDDOCFILES) depend on all the same
+ targets as $(PROCESSEDEXAMPLEFILES); this way the me, ms, and
+ pic.ms manuals are all regenerated upon changes to their
+ underlying macro packages.
+
+2021-04-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * INSTALL.extra: Update.
+ (Evaluation): New section updates material on "test-groff"
+ script. Also tell people how to preview our Texinfo manual (in
+ info, text, DVI, PDF, and HTML formats).
+ (In Case of Trouble): New section updates bug reporting URL.
+
+ Fixes <https://savannah.gnu.org/bugs/?57863>.
+
+2021-04-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac: Make the FAM string work more sensibly; it now
+ applies to headers, footers, and footnotes only if set
+ before the first call of a sectioning, paragraphing, or
+ {non-date} document description macro.
+ (PT, BT): Set the font family to that saved for titles.
+ (fn*do-FS): Set the font family to that saved for footnotes.
+ (par@init): Copy the document font family to independent strings
+ for titles and footnotes.
+ (par@reset): If in a footnote environment, set the font family
+ to that saved for footnotes; otherwise use \*[FAM].
+
+ * tmac/groff_ms.7.man (Differences from troff ms/Text settings):
+ Describe placement-dependent effect of FAM string setting.
+
+ * doc/groff.texi (Highlighting in ms):
+ * doc/ms.ms (Highlighting): As above, and suggest different
+ occasions in which ".ds FAM C" and "CW" are convenient.
+
+ Fixes <https://savannah.gnu.org/bugs/?60422>.
+
+2021-04-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (source, source_quietly)
+ (macro_source, macro_source_quietly): Use idiomatic Boolean
+ literals.
+
+2021-04-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi: Drop workarounds for Texinfo pre-5.0 versions;
+ our local macros produced many warnings during generation of our
+ Texinfo manual.
+ (Langlemacro):
+ (Ranglemacro):
+ (Lparenmacro):
+ (Rparenmacro):
+ (Lbrackmacro):
+ (Rbrackmacro): Delete. Replace call sites with literals.
+ (Lbracemacro):
+ (Rbracemacro): Delete. Replace call sites with @lbracechar{}
+ and @rbracechar{}.
+ (angles): Reimplement in terms of @guilsinglleft{} and
+ @guilsinglright{}. Flesh out comment.
+
+ Fixes remainder of <https://savannah.gnu.org/bugs/?59524>.
+
+2021-04-17 Dave Kemper <saint.snit@gmail.com>
+
+ * doc/meintro.me:
+ * doc/meref.me: Correct and make consistent usage of the term
+ "point size".
+
+ Fixes <https://savannah.gnu.org/bugs/?60403>.
+
+2021-04-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (SS): Add devtags support. Set a subsection
+ title as a second-level heading and add it to a table of
+ contents, if any. Prompted by a query from Hans Unzner to the
+ groff mailing list. Thanks, Hans!
+
+2021-04-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (SH): Fix apparent thinko. Pass the devtags
+ macro a literal "1" argument. Passing it \n[an-level] wasn't
+ correct (it stores the relative inset level, not a sectioning
+ level), and was useless anyway: SH has already called
+ .an-set-margin by this point, which resets \n[an-level] to 1.
+ man(7) does not support nesting of SH macros. Also call
+ .DEVTAG-NH by its alias .DEVTAG-SH since section headings are
+ not numbered in man(7).
+
+2021-04-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tmac]: Adjust editor file encoding hints.
+
+ * tmac/cs.tmac: Tell Vim the file is "iso-8859-2" (ISO Latin-2).
+ * tmac/en.tmac: Stop telling Emacs the file is "latin-1"; it's
+ ASCII.
+ * tmac/fr.tmac: Tell Vim file is "iso-8859-15" (ISO Latin-9).
+
+ Vim users may need to use ":e ++enc=iso-8859-2", for instance,
+ to see correct glyphs.
+
+2021-04-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ The first-order determinant of hyphenation points is language,
+ not territory. Use ISO 639 2-letter language codes for
+ hyphenation and exception patterns instead of ISO 3166 2-letter
+ territory codes.
+
+ * tmac/*.us: Rename *.us files to *.en.
+ * tmac/troffrc: Change hyphenation language "us" to "en".
+ * tmac/en.tmac: Add English localization file. Set hyphenation
+ mode to 4.
+ * tmac/troffrc: Derive groff locale from system.
+
+ * doc/groff.texi (Manipulating Hyphenation):
+ * man/groff.7.man (Hyphenation):
+ * man/groff_diff.7.man (Implementation differences): Refer to
+ "U.S. English" hyphenation patterns as simply "English"; they
+ will be mostly correct for Commonwealth English as well, and no
+ alternative English hyphenation patterns for other territories
+ are available.
+
+ * doc/groff.texi (Manipulating Hyphenation):
+ * man/groff_diff.7.man (New requests): Note that default
+ hyphenation mode depends on the language used on the system.
+ Add concept index entry for localization. Add file index
+ entries for the locale macro files (cs.tmac, etc.). Update to
+ reflect rename of English hyphenation patterns and .hla
+ identifier from "us" to "en".
+
+ * src/roff/groff/tests/localization_works.sh: Add 10 test cases.
+ * src/roff/groff/groff.am (groff_TESTS): Run test.
+
+ * tmac/LOCALIZATION: Rewrite.
+
+ Fixes <https://savannah.gnu.org/bugs/?59814>.
+
+2021-04-12 Dave Kemper <saint.snit@gmail.com>
+
+ * doc/meref.me: Correct various small issues.
+
+ Fixes <https://savannah.gnu.org/bugs/?60379>.
+
+2021-04-12 Dave Kemper <saint.snit@gmail.com>
+
+ * man/groff.7.man (Registers/Writable registers) <year, yr>:
+ Drop discussion of Y2K issues.
+
+ Fixes <https://savannah.gnu.org/bugs/?60372>.
+
+2021-04-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Setting Registers) <rnn>: Fix error: the
+ request is not ignored if the second argument (the new name)
+ does not exist. Problem dates back to 52a6d12a (11 May 2000).
+
+2021-04-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Implement new .soquiet and .msoquiet requests.
+
+ Needed for two planned developments: {1} the i18n patch in
+ Savannah #59814 can use this to quietly attempt to open a
+ localization file. groff only supports a few locales, so people
+ with LANG=es_ES, for instance, would ordinarily see warning
+ diagnostics on every groff startup; and {2} system- or
+ site-configurable support of per-user {.,}troffrc or man.local
+ files, gracefully failing if they don't exist.
+
+ * src/roff/troff/input.cpp:
+ (do_source): Add new function, taking boolean "quietly"
+ parameter and absorbing function of source(), with added
+ conditional.
+ (source): Convert into a wrapper to call do_source() unquietly.
+ (source_quietly): Wrap do_source(), quietly.
+ (do_macro_source, macro_source, macro_source_quietly): Analogous
+ to the foregoing.
+ (init_requests): Hook "msoquiet" to macro_source_quietly() and
+ "soquiet" to "source_quietly().
+
+ * doc/groff.texi (I/O):
+ * man/groff.7.man (Requests/Request short reference):
+ * man/groff_diff.7.man (Language/New requests): Document them.
+
+ * src/roff/groff/tests/msoquiet_works.sh:
+ * src/roff/groff/tests/soquiet_works.sh: Test them.
+
+ * src/roff/groff/groff.am (groff_TESTS): Add tests.
+
+ Fixes <https://savannah.gnu.org/bugs/?59973>.
+
+2021-04-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (ms Document Control Settings) <FF>: Update
+ description to cover application of footnote format to footnote
+ markers in general, not just numbers. Clarify different
+ behavior of format 1 with respect to automatic numbers and other
+ markers.
+ (ms Footnotes) <*>: Describe string operation in more detail.
+ <FS>: Describe more precisely how the optional argument is
+ handled.
+
+ * doc/ms.ms (Footnotes): Synchronize with doc/groff.texi. Add
+ example using document's own text as a model.
+
+ * tmac/groff_ms.7.man (Usage/Footnotes): Resync relevant
+ portions with doc/ms.ms.
+
+ Fixes <https://savannah.gnu.org/bugs/?60227>.
+
+2021-04-06 Dave Kemper <saint.snit@gmail.com>
+
+ * src/roff/nroff/nroff.sh: Recognize -k and -K options and pass
+ them through to troff. Document them in usage message.
+ * src/roff/nroff/nroff.1.man: Document new -k and -K options.
+
+ Fixes <https://savannah.gnu.org/bugs/?60349>.
+
+2021-04-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Manipulating Hyphenation):
+ Recast introductory paragraph to better distinguish the
+ automatic breaking of words and placement of hyphens at
+ user-specified hyphenation points (done with the \% escape) and
+ automatic determination of hyphenation points within words (what
+ the pattern files and most of the hyphenation mode parameters
+ are for). Clarify that what our manual calls "automatic
+ hyphenation" pertains only to the latter.
+ <hw> Correct over-general claim; hyphenation exceptions defined
+ with the .hw request _do_ honor .hy value 2 (don't break a word
+ at the bottom of a page), but none of the others.
+ <\%> Recast description of escape to emphasize independence of
+ its two uses (e.g., "\%pseudo\%unununium" is hyphenated only
+ after "pseudo-", if at all).
+ <\:> Clarify that escape is an input word boundary.
+ <shc> Clarify that the soft hyphen glyph is applied to manual as
+ well as automatically-determined hyphenation points.
+ <hy> Recharacterize as setting the _automatic_ hyphenation mode.
+ Note that restrictions apart from value 2 are not applied to
+ words with manually-assigned hyphenation points.
+ <nh> Note that request affects only automatic hyphenation.
+
+ * man/groff.7.man (Requests/Request short reference) <.hy,.nh>:
+ Clarify that requests deal with _automatic_ hyphenation.
+ (Registers/Read-only registers) <.hy>:
+ Clarify that register applies to _automatic_ hyphenation.
+ (Hyphenation): Add new introductory paragraph summarizing manual
+ hyphenation support and features, including notice that breaking
+ at explicit hyphens is performed in fill mode, i.e., even if
+ _automatic_ hyphenation is disabled.
+
+ Thanks to Peter Schaffter for the report.
+
+ Fixes <https://savannah.gnu.org/bugs/?60332>.
+
+2021-03-27 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Changes to the ghostscript fontnames (9.53.3).
+
+ * font/devpdf/Foundry.in: HI and HBI switch to using
+ Italic rather than Oblique.
+
+2021-03-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Manipulating Filling and Adjustment):
+ * man/groff_diff.7.man (Language/Extended requests): Fix
+ incorrect claim that additional inter-sentence space is applied
+ only in fill mode. Drop word "parameter" from description of
+ unit used in .ss request arguments; it is a needlessly specific
+ reference to the font file format. Tighten wording.
+
+ * man/groff.7.man (Control Characters): Fix incorrect claim that
+ end-of-sentence detection is attempted only in fill mode. Note
+ that .ss request also affects inter-word spacing.
+
+ * man/groff_diff.7.man (Language/Extended requests):
+ - Drop example.
+ - Move discussion of AT&T vs. GNU troff difference in .ss
+ handling from here...
+ (Implementation Differences): ...to here.
+
+ Thanks to Dave Kemper for his continued scrutiny!
+
+2021-03-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (ms Cover Page Macros):
+ * doc/ms.ms (Cover page macros):
+ * tmac/groff_ms.7.man (Usage/Cover page macros): Revise and
+ rename (sub)sections to "Document description macros".
+
+2021-03-15 Dave Kemper <saint.snit@gmail.com>
+
+ * Makefile.am: Fix typos. Thanks to Bjarni Ingi Gislason for
+ the report.
+
+ Fixes <https://savannah.gnu.org/bugs/?59457>.
+
+2021-03-14 Dave Kemper <saint.snit@gmail.com>
+
+ * man/groff_tmac.5.man: Correct erroneous reference to PSPIC
+ where PDFPIC was intended. Fix numerous smaller style and
+ content problems.
+
+ Fixes <https://savannah.gnu.org/bugs/?60229>.
+
+2021-03-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Optional man extensions) <CW, EX, PN, Pn>:
+ (Highlighting in ms) <CW>:
+ (Additional ms macros) <CW>: Use "monospaced" to refer to font
+ selected, retaining "constant-width" term only where it explains
+ the macro mnemonic. Thanks to Dave Kemper for pointing out the
+ issue. Also fix error: .CW in the ms package seems to have
+ originated with Research Unix, not Berkeley.
+
+ * doc/ms.ms (Highlighting) <CW>: Sync with our Texinfo manual.
+ * tmac/groff_ms.7.man: Sync with ms.ms, omitting FAM advice.
+
+ Fixes <https://savannah.gnu.org/bugs/?60037>.
+
+2021-03-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Identifiers, Strings, Writing Macros)
+ (Diversions): Improve cross-linkage of documentation regarding
+ shared name space of macros, strings, diversions, and boxes.
+
+ Fixes <https://savannah.gnu.org/bugs/?58995>.
+
+2021-03-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac: Improve diagnostic messages.
+ (@diag): New macro wraps .tm request, always prefixing it with
+ the name of the macro package, as well as file and line
+ indicators only if these are set to non-empty or non-zero
+ values, respectively.
+ (@error, @warning): Call @diag instead of .tm directly.
+ (@fatal): Retire; it had only one call site and it would have
+ greatly complicated @diag to support calling .ab instead of .tm.
+ An ugly alternative would have been to call .ab with a redundant
+ message after calling @diag.
+ (@divert): New macro wraps .di request, remembering the name of
+ the current file (\n[.F]) when a diversion is started.
+ (@error-recover): Call .ab instead of (deleted) @fatal.
+ (pg@super-eject): Tell user what the last file name seen was
+ when recovering from an unfinished diversion when processing
+ ends.
+
+ Fixes <https://savannah.gnu.org/bugs/?55099>.
+
+2021-02-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Fix bug where having line numbering off but the output line
+ number register \n[ln] set to a positive value would cause
+ tbl(1) table rows to spontaneously become numbered. Use new
+ \n[.nm] register to determine whether line numbering is enabled.
+
+ * src/preproc/tbl/table.cpp (table::init_output, table::do_row)
+ (table::do_bottom): Predicate all conditions on \n[ln]
+ additionally on \n[.nm].
+
+ Thanks to Olle Lögdahl for the report. Problem appears to date
+ back to commit b69062693d3360efce9d4d63fac337be21e07db7, 20 July
+ 2011.
+
+ Fixes <https://savannah.gnu.org/bugs/?59812>.
+
+2021-02-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Add regression test for Savannah #59812.
+
+ * src/preproc/tbl/tests/cooperate-with-nm-request.sh: Do it.
+ * src/preproc/tbl/tbl.am (tbl_TEST): Run test.
+
+2021-02-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Implement new read-only register ".nm". It reports the
+ enablement status of output line numbering (caused by the .nm
+ request) irrespective of the temporary suspension of numbering
+ with the .nn request. Needed because there was no way to
+ introspect its state, tbl(1) needs to do so, and the writable
+ line number register \n[ln] is not a reliable proxy for it.
+
+ * src/roff/troff/env.h: Add get_numbering_nodes(), returning
+ `int`, to public interface of `environment` class.
+ * src/roff/troff/env.cpp: Implement get_numbering_nodes().
+
+ * src/roff/groff/tests/dot-nm_register_works.sh: Test it.
+ * src/roff/groff/groff.am (groff_TESTS): Run test.
+
+ * doc/groff.texi (Miscellaneous):
+ * man/groff_diff.7.man (Language/New number registers):
+ * man/groff.7.man (Registers/Read-only registers): Document it.
+
+ * NEWS: Add item.
+
+2021-02-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac: Emit warning diagnostic when using a multi-page
+ table with a repeating header (".TS H").
+ (KS): Rename diversion from "kp*div" to "kp@div" since the name
+ is now referenced outside the keep module.
+ (KF): ...similarly for kp@fdiv.
+ (generally): Update diversion dereference sites and derived
+ names.
+ (@TS): When handling "H" argument, check identity of current
+ diversion and emit appropriately worded warning.
+
+2021-02-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * FOR-RELEASE: Add more procedures and information related to
+ incrementing groff's version number.
+
+2021-02-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libgroff/searchpath.cpp (search_path::open_file)
+ (search_path::open_file_cautious): Save errno before calling
+ free() and restore it afterwards. A future version of POSIX
+ will require that free() not change errno if it succeeds[1];
+ some C library implementations, including recent versions of
+ glibc[2], lack this property. free() is called in these
+ libgroff functions to clean up after an unsuccessful fopen() of
+ a heap-allocated file name string, and because the errno from
+ fopen() may be passed to strerror() in a diagnostic message, it
+ needs to be accurate. I checked the rest of groff's codebase
+ and found no other instances of free() being used to clean up
+ after fopen() failure.
+
+ [1] https://www.austingroupbugs.net/view.php?id=385
+ [2] https://sourceware.org/bugzilla/attachment.cgi?id=13073
+
+2021-02-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Address build failure on macOS.
+
+ Follow the advice of the gnulib manual ("Changing your source
+ for use with gnulib") more scrupulously; include config.h in
+ more files.
+
+ * src/libs/libgroff/curtime.cpp [HAVE_CONFIG_H]:
+ * src/libs/libgroff/device.cpp [HAVE_CONFIG_H]:
+ * src/libs/libgroff/fatal.cpp [HAVE_CONFIG_H]:
+ * src/libs/libgroff/string.cpp [HAVE_CONFIG_H]:
+ * src/libs/libgroff/strsave.cpp [HAVE_CONFIG_H]:
+ * src/preproc/eqn/other.cpp [HAVE_CONFIG_H]:
+ * src/preproc/eqn/text.cpp [HAVE_CONFIG_H]:
+ * src/preproc/pic/object.cpp [HAVE_CONFIG_H]: Do it.
+
+ * src/libs/libgroff/assert.cpp [HAVE_CONFIG_H]:
+ * src/libs/libgroff/errarg.cpp [HAVE_CONFIG_H]:
+ * src/libs/libgroff/error.cpp [HAVE_CONFIG_H]: #include
+ config.h using angle brackets instead of quotation marks.
+
+ Fixes <https://savannah.gnu.org/bugs/?60035>.
+
+2021-02-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Add regression test for Savannah #60025.
+
+ * tmac/tests/doc_Mt-works.sh: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2021-02-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Demote definition of \[yogh] special character escape from
+ unconditional availability to be defined only if the output
+ device defines it or if .AM macro is called to enable support
+ for Berkeley-style accent marks.
+
+ See
+ https://lists.gnu.org/archive/html/groff/2021-01/msg00000.html
+ and follow-ups for discussion.
+
+ * tmac/s.tmac (initialization): Move definition of \[yogh] (only
+ if the output device doesn't already define it) from here...
+ (AM): ...to here.
+
+2021-02-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/ms.ms: Use \[ps] special character instead of local
+ character definition using numeric code point escape, which is
+ less portable.
+
+ Fixes <https://savannah.gnu.org/bugs/?59528>. Thanks to Bjarni
+ Ingi Gislason for the report and a suggested patch.
+
+2021-02-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac (initialization): Call par*define-font-macro with
+ arguments "CW" and "R" in nroff mode to silence font warnings
+ from documents using .CW macro in nroff mode.
+
+2021-02-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/table.cpp (table::init_output): Save value of
+ hyphenation maximum consecutive line count register (\n[.hlm])
+ more carefully to keep it from being incorrectly parsed as a
+ decrement, because negative values of \n[.hlm] are valid (in
+ fact, "-1" is the default). In documents with a large number of
+ tables, this can lead to a Persian chessboard problem and an
+ integer overflow (at the groff language level, caught and
+ handled by src/roff/troff/number.cpp:parse_term()).
+
+ It is wise to wrap a non-literal second argument to the .nr
+ request in parentheses if assignment is desired and its value
+ can be negative. See section 5.6.1 ("Setting Registers") of the
+ groff Texinfo manual.
+
+ Fixes <https://savannah.gnu.org/bugs/?59993>.
+
+2021-02-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * test-groff.in: Add support for rfc1345.tmac.
+
+2021-02-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Integrate rfc1345.tmac into build system.
+
+ * contrib/rfc1345/rfc1345.am: Do it.
+ * Makefile.am: Include contrib/rfc1345/rfc1345.am.
+
+2021-02-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (open_mac_file): Report problem when
+ attempting to open macro files (-m arguments) and the error is
+ something other than ENOENT.
+ (process_macro_file): Update diagnostic to be more precise; the
+ file couldn't be _opened_, not necessarily _found_, and clarify
+ that the string being reported back to the user is the argument
+ to the -m option, not a file name.
+ (macro_source): Update diagnostic to report that the file
+ couldn't be _opened_, not necessarily _found_, and include the
+ nature of the problem.
+
+2021-01-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [tbl]: Save and restore hyphenation parameters.
+
+ * src/preproc/tbl/table.cpp (table::init_output): When starting
+ a table, save the hyphenation parameters (\n[.hy], \n[.hla],
+ \n[.hlm], \n[.hym], \n[.hys]). Restore them in the table reset
+ macro (confusingly called "3init"), which is called before
+ performing each diversion and before exiting a table.
+
+ This enables people to, e.g., turn off hyphenation in a table
+ text block with .nh, just as they can turn off adjustment with
+ .na, without having to manually reset it. The next text block,
+ and the material after the table, will not be affected.
+
+ Fixes <https://savannah.gnu.org/bugs/?59971>.
+
+2021-01-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Add regression test for Savannah #59971.
+
+ * src/preproc/tbl/tests/\
+ save-and-restore-hyphenation-parameters.sh: Do it.
+ * src/preproc/tbl/tbl.am (tbl_TEST): Run test.
+
+2021-01-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tmac.am ($(TMACSTRIPFILES)):
+ ($(TMACMDOCSTRIPFILES)): Remove unidiomatic for loop which
+ frustrated parallel make operation.
+
+ Thanks to an anonymous contributor for the report and patch.
+
+ Fixes <https://savannah.gnu.org/bugs/?59958>.
+
+2021-01-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/ms.ms (Document control settings): Document old FAM string
+ and new FR string.
+
+2021-01-29 T. Kurt Bond <tkurtbond@gmail.com>
+
+ [ms]: Add new string FR to hold an expression for computing the
+ footnote length relative to the line length, consistently for
+ single- and multi-column modes, which \n[FL] has never done.
+
+ * tmac/s.tmac: Initialize FR string to "11/12".
+ (@MC): Compute footnote column width using \*[FR] instead of a
+ hard-coded "11/12" expression.
+ (par@init): Compute default \n[FL] using \*[FR] instead of a
+ hard-coded "11/12" expression.
+
+ * doc/groff.texi (Macro Packages/ms/Document control settings):
+ * tmac/groff_ms.7.man (Usage/Document control registers):
+ Document it.
+
+ Fixes <https://savannah.gnu.org/bugs/?59605>.
+
+2021-01-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/env.cpp: Add ADJUST_MAX enumeration constant to
+ record maximum valid numerical adjustment mode.
+ (adjust): Verify numeric argument against ADJUST_MAX instead of
+ a numeric literal. Ignore excessively large values instead of
+ setting adjustment mode to "right". Update warning diagnostic.
+
+2021-01-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Add regression test for .ad and .na requests.
+
+ * src/roff/groff/tests/adjustment_works.sh: Do it.
+ * src/roff/groff/groff.am (groff_TESTS): Run test.
+
+2021-01-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Manipulating Filling and Adjustment):
+ * man/groff.7 (Requests/Request short reference): Clarify
+ behavior of ".na" and ".ad l".
+
+ Thanks to Bjarni Ingi Gislason for pointing out the potential
+ for confusion and for his careful review of the new text.
+
+ Fixes <https://savannah.gnu.org/bugs/?59795>.
+
+2021-01-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/grog/grog.pl: Report program name in fatal error
+ diagnostics. Also drop sentence-ending punctuation since Perl
+ supplies additional information.
+
+ Continues the long process of fixing Savannah #52463.
+
+2021-01-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (RE): Style-warn if macro arguments are out
+ of range or redundant.
+
+ Fixes <https://savannah.gnu.org/bugs/?55320>.
+
+2021-01-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Improve style of troffrc{,-end} files. Follow established
+ idioms and make them consistent with each other.
+
+ * tmac/troffrc:
+ * tmac/troffrc-end:
+ - Identify files in header comments as part of GNU troff.
+
+ * tmac/troffrc:
+ - Clarify purpose of .do request.
+ - Identify .X (set by groff -X) as a register, not a string.
+ - Remove temporary registers one per line to make
+ synchronization with foregoing logic easier. Fixes name
+ space management nits: an undefined string troffrc!Xps was
+ being removed, and troffrc!{ascii,latin1,utf8,cp1047} were
+ not being removed despite being defined.
+
+ * tmac/troffrc-end:
+ - Clarify that file is read after -m file arguments (not "all
+ macro sets", which can be loaded with .mso after this file
+ is processed).
+ - Advise usage of .do for groff extensions.
+ - Line-break one-off conditionals as troffrc does.
+ - Add empty string comment to empty string definitions.
+
+2021-01-14 Dave Kemper <saint.snit@gmail.com>
+
+ Commit 87edb525, from 2003, added character U+2026 (HORIZONTAL
+ ELLIPSIS) to most base groff fonts, but there has been no
+ kerning information for this character. To produce consistent
+ typography, it should be kerned the same way as the period,
+ which is in 818 kern pairs across all the devps fonts.
+
+ Apply the following shell command to the groff description files
+ of the PostScript fonts.
+
+ for file in font/devps/*[A-Z]
+ do sed -Ei\~ 's/(.*)(^| )\. (.*)/&\n\1\2u2026 \3/' $file
+ done
+
+ * font/devps/AB:
+ * font/devps/ABI:
+ * font/devps/AI:
+ * font/devps/AR:
+ * font/devps/BMB:
+ * font/devps/BMBI:
+ * font/devps/BMI:
+ * font/devps/BMR:
+ * font/devps/HB:
+ * font/devps/HBI:
+ * font/devps/HI:
+ * font/devps/HNB:
+ * font/devps/HNBI:
+ * font/devps/HNI:
+ * font/devps/HNR:
+ * font/devps/HR:
+ * font/devps/NB:
+ * font/devps/NBI:
+ * font/devps/NI:
+ * font/devps/NR:
+ * font/devps/PB:
+ * font/devps/PBI:
+ * font/devps/PI:
+ * font/devps/PR:
+ * font/devps/TB:
+ * font/devps/TBI:
+ * font/devps/TI:
+ * font/devps/TR:
+ * font/devps/ZCMI: Apply above script.
+
+ Fixes <https://savannah.gnu.org/bugs/?58897>. However, this
+ will need to be done again if afmtodit is used to regenerate the
+ above files, or afmtodit will need to be modified to add this
+ kerning information itself.
+
+2021-01-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libgroff/relocate.cpp (set_current_prefix) [_WIN32]:
+ Move declaration of `pathextstr` to lie within preprocessor
+ conditional, since it is dereferenced only there.
+
+2021-01-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Add support for strsignal().
+
+ POSIX.1-2008 added strsignal() to the C library and recommended
+ its use over sys_siglist[], but groff's pipeline management
+ hadn't been updated in that respect since that time.
+
+ * configure.ac: Check for strsignal().
+ * src/roff/groff/pipeline.c (xstrsignal): Return strsignal() if
+ it is defined.
+
+ Thanks to an anonymous contributor for the report and the patch.
+
+ Fixes <https://savannah.gnu.org/bugs/?59835>.
+
+2021-01-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libgroff/relocate.cpp (relocatep): Add assertion to
+ identify logic error if `curr_prefix` is unexpectedly a null
+ pointer.
+ (set_current_prefix) [_WIN32]: Allocate memory from heap for
+ `curr_prefix` only on Windows; on other systems, this file's
+ searchpath() is used to populate `curr_prefix`, and that
+ function (except on Windows) performs its own allocation. Fixes
+ memory leak noted by Ingo Schwarze.
+ (set_current_prefix) [!_WIN32]: Move logic attempting to set
+ `curr_prefix` by calling searchpathext() from here...
+ [WIN32]: ...to here. The PATHEXT environment variable has
+ semantics only under Windows, not POSIX systems, so the
+ placement of this code seemed erroneous.
+
+ See <https://savannah.gnu.org/bugs/?55475>.
+
+2021-01-06 Colin Watson <cjwatson@debian.org>
+
+ * contrib/glilypond/glilypond.pl:
+ * contrib/gperl/gperl.pl:
+ * contrib/gpinyin/gpinyin.pl:
+ * tmac/hyphenex.pl: Avoid Perl's unsafe "<>" operator.
+
+ The "<>" operator is implemented using the two-argument form of
+ "open", which interprets magic such as pipe characters, allowing
+ execution of arbitrary commands which is unlikely to be
+ expected. Perl >= 5.22 has a "<<>>" operator which avoids this,
+ but also forbids the use of "-" to mean the standard input,
+ which is a facility that the affected groff programs document.
+
+ ARGV::readonly would probably also fix this, but I fundamentally
+ dislike the approach of escaping data in preparation for a
+ language facility to unescape it, especially when the required
+ escaping is as non-obvious as it is here. (For the same reason,
+ I prefer to use subprocess invocation facilities that allow
+ passing the argument list as a list rather than as a string to
+ be interpreted by the shell.) So I've abandoned this dubious
+ convenience and changed the affected programs to iterate over
+ command-line arguments manually using the three-argument form of
+ open.
+
+ glilypond doesn't need the initial unshift since that's already
+ handled in contrib/glilypond/args.pl.
+
+ Fixes <https://savannah.gnu.org/bugs/?55557>.
+
+2021-01-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac: Set footnote line length in multi-column
+ environments to 11/12ths of the text line length for consistency
+ with earlier change to FL register default.
+
+ Thanks to T. Kurt Bond for bringing this issue to my attention.
+
+2021-01-04 John Gardner <gardnerjohng@gmail.com>
+
+ * tmac/strip.sed: Escape '.' wildcard when matching lines using
+ .as and .ds requests.
+
+ Fixes <https://savannah.gnu.org/bugs/?59498>.
+
+2021-01-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Document use of SOURCE_DATE_EPOCH and TZ.
+
+ The semantics of SOURCE_DATE_EPOCH to groff were not established
+ with respect to time zone selection, prompting divergent
+ interpretations; Debian and distributions derived from it have
+ for several years patched groff to implicitly use UTC as the
+ time zone when interpreting the current time (or
+ SOURCE_DATE_EPOCH) as a local time. While a convenient and
+ defensible choice for reproducible build efforts[1], it runs
+ against the grain of user expectations. Systems programmers
+ like monotonically increasing clocks; the broader user base
+ usually prefers a clock that follows an applicable civil
+ calendar. To the latter audience, a difference between
+ $ date "+%Y-%M-%d %H:%m:%S"
+ and
+ $ groff <<EOF
+ .af year 0000
+ .af mo 00
+ .af dy 00
+ .af hours 00
+ .af minutes 00
+ .af seconds 00
+ .tm \n[year]-\n[mo]-\n[dy] \n[hours]:\n[minutes]:\n[seconds]
+ EOF
+ is difficult to explain.
+
+ * doc/groff.texi (Environment):
+ * src/devices/grohtml/grohtml.1.man (Environment):
+ * src/devices/gropdf/gropdf.1.man (Environment):
+ * src/devices/grops/grops.1.man (Environment):
+ * src/roff/groff/groff.1.man (Environment):
+ * src/roff/troff/troff.1.man (Environment): Expand description
+ of use of SOURCE_DATE_EPOCH to note that it converts the time
+ {as seconds since the Epoch} to local time, which motivates
+ documentation of the TZ environment variable. Explain what the
+ time stamps are used for: troff merely stores the human-readable
+ time components in registers; the grohtml, gropdf, and grops
+ output drivers write the information to the output in comments.
+
+ Fixes <https://savannah.gnu.org/bugs/?57218>.
+
+ [1] https://reproducible-builds.org/docs/source-date-epoch/
+
+2020-12-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am (.texi.dvi): Call texi2dvi with FORCE_SOURCE_DATE=1
+ in the environment, avoiding an embedded timestamp in the
+ generated groff.dvi file, which frustrated reproducible builds.
+ Thanks to Werner Lemberg for the suggestion.
+
+ * src/roff/groff/tests/string_case_xform_unicode_escape.sh: Fix
+ test to no longer use Bash process substitution, resulting in
+ nondeterministic file descriptor numbers appearing in test logs,
+ frustrating reproducible builds.
+
+ * contrib/pdfmark/pdfmark.am (PDFROFF): Call pdfroff without
+ `--keep-temporary-files` option. Temporary directories are
+ created with mktemp(1) and files with an embedded process
+ identifier, which frustrates reproducible builds.
+
+ See <https://savannah.gnu.org/bugs/?57218>.
+
+2020-12-21 Dorai Sitaram <ds26gte@yahoo.com>
+
+ * tmac/s.tmac (@IP): Handle inter-sentence space correctly in
+ paragraph tags by copying \n[.sss] from the enclosing
+ environment to that used to format the paragraph tag.
+
+ Fixes <https://savannah.gnu.org/bugs/?59742>.
+
+2020-12-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Add regression test for Savannah #59742.
+
+ * tmac/tests/s_IP_respects_inter-sentence_space_in_tags.sh: Do
+ it.
+ * tmac/tmac.am (tmac_TESTS): Run it.
+
+2020-12-21 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ * src/utils/addftinfo/addftinfo.cpp (usage): Use size_t for loop
+ index when iterating over a count of size_t items. Quiets
+ signedness mismatch compiler warning.
+
+ Fixes <https://savannah.gnu.org/bugs/?59583>.
+
+2020-12-20 Colin Watson <cjwatson@debian.org>
+
+ * src/devices/gropdf/gropdf.pl:
+ * src/utils/afmtodit/afmtodit.pl: Sort Perl hash keys. Hash
+ iteration order may differ between runs, which makes builds
+ harder to reproduce. Sort hash keys in gropdf and afmtodit
+ output to avoid this.
+
+2020-12-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/ms.ms (Basic Information): Tweak unit definitions. groff
+ defines a typesetter's point as precisely 1/72 inches. Also use
+ the correct symbol for inch units--strictly, it's the same as
+ that for "seconds" as in subdivisions of the degree, and not a
+ typographical quote of any sort.
+
+ Fixes <https://savannah.gnu.org/bugs/?59463>.
+
+2020-12-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [ms]: Set footnote line length to AT&T default.
+
+ groff ms has since its initial implementation used a default
+ footnote line length of 5/6ths of the text line length; this may
+ correspond to an early AT&T ms default (perhaps documented in
+ the 1974 version of the M. E. Lesk paper, "Typing Documents on
+ the UNIX System"[1]). However, as early as V6 Unix (1975), AT&T
+ ms actually used a footnote line length of 11/12ths of the text
+ line length instead[2].
+
+ Heirloom Doctools and neatroff ms also use this default.
+
+ * tmac/s.tmac: Set default footnote line length to 11/12ths of
+ the text line length.
+
+ * doc/groff.texi (ms Document Control Settings):
+ * doc/ms.ms (Document control registers): Document new default.
+
+ [1] https://www.troff.org/using-ms.pdf
+ [2] https://minnie.tuhs.org/cgi-bin/utree.pl?file=V6/usr/lib/tmac.s
+
+2020-12-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Lower new unplanted trap error to 'mac' warning.
+
+ * src/roff/troff/div.cpp (top_level_diversion::change_trap):
+ Change error upon invalid attempt to move an unplanted trap into
+ a warning of type 'mac'.
+
+ * doc/groff.texi (Warnings):
+ * src/roff/troff/troff.1.man (Warnings): Recast description of
+ 'mac' warning type to include the above scenario.
+
+ Thanks to Bjarni Ingi Gislason for reporting the diagnostic
+ arising in real life, and to Peter Schaffter for the discussion
+ and recommendation. Some bike sheds get painted quickly!
+
+ Fixes <https://savannah.gnu.org/bugs/?59573>.
+
+2020-12-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/groff_mdoc.7.man: Tweak mandatory macro explanations.
+
+ Update descriptions and template of .Dd, .Dt, .Os usage to
+ reflect recent changes and recommended conventions.
+
+ Thanks to Ingo Schwarze, Colin Watson, and Alan D. Salewski for
+ the discussion, and Florent Rougon and Robert Bihlmeyer (many
+ years ago) for the original report.
+
+ Fixes <https://bugs.debian.org/284002>.
+
+2020-12-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/xtotroff/xtotroff.c (MapFont): Avoid writing past
+ the end of a static buffer. Problem found and patch supplied by
+ Bjarni Ingi Gislason. I tweaked it to comment it differently
+ {in case the buffer ever needs to grow, but the prospects of
+ future X11 server-side font rendering development seem dim} and
+ use snprintf() instead of retaining the existing sprintf().
+
+ Fixes <https://savannah.gnu.org/bugs/?55257>.
+
+2020-12-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/xtotroff/xtotroff.c (CanonicalizeFontName)
+ (FontNamesAmbiguous, MapFont, main): Format diagnostic messages
+ more consistently with GNU Coding Standards. Prefix with name
+ of complaining command. Put argument literals in quotation
+ marks. Put each message on one line only.
+
+2020-11-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Parameters): Fix error in example. Arguments
+ to .als were in the wrong order (.als is not ln(1)). Also mark
+ output to the standard error stream using the @error Texinfo
+ command instead of @result.
+
+ Thanks to Dorai Sitaram for finding this error.
+
+ Fixes <https://savannah.gnu.org/bugs/?59566>.
+
+2020-11-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Debugging): Update with a more helpful
+ introduction, summarizing available procedures. Mention
+ backtracing since it is much more useful now (post-groff
+ 1.22.4.)
+
+ * man/groff.7 (Debugging): Add new section summarizing
+ material added to our Texinfo manual.
+
+ * man/groff_diff.7.man (Debugging): Add new section describing
+ groff extensions.
+
+2020-11-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Traps): Update. Organize subsubsections "Page
+ Location Traps" and "Diversion Traps" under new subsection node
+ "Vertical Position Traps" to make the conceptual organization
+ more clear. Define and discuss trap visibility earlier.
+ Document unit used for page location trap reporting. Introduce
+ analogy of .wh and .ch requests as queue operations. Document
+ what happens when the same macro is planted as a trap in
+ multiple locations; supply example. Supply example of .itc
+ usage. Consistently refer to an end-of-input macro as such, to
+ contrast it with the "end macro" that can be used with, e.g.,
+ .de and .ig requests.
+
+ * man/groff.7 (Traps): Add new section summarizing
+ language feature.
+
+2020-11-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-common-u (doc-footer): When performing
+ double-sided page layout, set page number on outside of _recto_
+ {odd-numbered} pages, as is conventional and for consistency
+ with man(7).
+
+ * tmac/groff_mdoc.7.man
+ (Formatting with groff, troff, and nroff): Document what
+ double-sided layout (not "printing") means. Also correct
+ description of continuous rendering, which implied that page
+ headers and footers were not written at all, and used an
+ incorrect groff driver name.
+
+ Fixes <https://bugs.debian.org/919890>. Also see:
+ https://lists.gnu.org/archive/html/groff/2019-01/msg00021.html
+ Thanks to Ralph Corderoy for the discussion.
+
+ * tmac/tests/doc-D_places_page_numbers_correctly.sh: Test it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2020-11-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-common-u (doc-header): Fix infinite loop when
+ attempting to trim header string (like "FTP(1)") to fit when the
+ available title length won't allow even extreme shortening.
+ Measure the string before and after calling .substring on it,
+ and break out of loop if it didn't get shorter.
+
+ Problem dates back to at least
+ ed63b0ae76a611b581601a1afc192f6a7367be6f (7 July 2002), possibly
+ as far as the Great Mdoc Rewrite of
+ 058f72af832fc68488d33cd09ec819e5c560fa09 (23 March 2001).
+
+ One can never check loop invariants too many times...
+
+ Fixes <https://bugs.debian.org/411227>.
+
+ * tmac/tests/\
+ doc-do_not_loop_infinitely_when_shortening_headers.sh: Test it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2020-11-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/nroff/nroff.sh: Recognize -b and -z options and pass
+ them through to troff. Document them in usage message.
+ * src/roff/nroff/nroff.1.man: Document new -b and -z options.
+
+2020-11-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/div.cpp (top_level_diversion::change_trap):
+ Emit error diagnostic if an attempt is made to move an unplanted
+ macro. This could have been a warning, as it's pretty harmless
+ {though possibly a big surprise to anyone who was wondering why
+ their .ch was a no-op}, but there's no good warning category for
+ this kind of problem and I am not about to start a bike shed
+ discussion about it right now.
+
+2020-11-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi: Update. Add introductory material. Rewrite
+ the first section of the "gtroff Reference" chapter of our
+ Texinfo manual. It is written as an introduction for readers
+ who want to go straight to "raw" troff without knowing much or
+ anything about existing macro packages. Thanks to Dave Kemper
+ and John Gardner for feedback and support.
+
+ Clarify whitespace usage. "Whitespace" is defined in this
+ manual as "spaces, tabs, and newlines". Say only "spaces and
+ tabs" when newlines should not be included.
+
+ Rename "Font Files" to "Device and Font Files".
+
+ Rename "Manipulating Filling and Adjusting" to "Manipulating
+ Filling and Adjustment".
+
+ Update discussion of "copy mode". Rename from "copy-in mode",
+ which I don't think eludicdated anything; is there a "copy-out
+ mode"? Rename nodes accordingly. Attempt to explain more
+ clearly. Recast to shift emphasis to what _isn't_ merely copied
+ in copy mode, since that is what seems to cause confusion among
+ the inexperienced.
+
+ Update "Conditionals and Loops". Add introductory paragraph.
+ Add nodes/subsections "if-then" and "Conditional Blocks". Add
+ subsection "Conditional Blocks" to explain the behavior of the
+ \{ and \} escapes much more precisely. I don't think this
+ syntactical area is well understood. Supply examples.
+
+2020-11-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Add style checks to man(7) macro package.
+
+ Not otherwise documented yet; experimental--subject to change.
+
+ * tmac/an-old.tmac: Initialize CHECKSTYLE to false if not
+ already set.
+ (an-style-warn): New macro emits diagnostic of type "style" when
+ called if CHECKSTYLE register is true.
+ (TH): Call an-style-warn if fewer than two or more than five
+ arguments are seen.
+ (RI, IR, IB, BI, RB, BR): Call an-style-warn if fewer than two
+ arguments are seen.
+
+2020-11-11 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Update copyright.
+
+ * update-copyright.sh: use gnulib's 'update-copyright' script.
+ Pass this script in directories 'arch', 'contrib', 'font',
+ 'man', 'tmac', 'src' and on a list of extra files.
+
+ * FOR-RELEASE: mention this point.
+
+2020-11-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/preconv/preconv.1.man (Description): Fix error:
+ groff's -K option, not -k, specifies a character econding (and
+ overrides GROFF_ENCODING in the environment). Also explain how
+ valid encoding strings are determined.
+
+ Thanks to Bjarni Ingi Gislason for the report.
+
+ Fixes <https://savannah.gnu.org/bugs/?59445>.
+
+2020-11-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/table.cpp (table::compute_separation_factor):
+ Add word "table" to diagnostic message to better cue the user
+ that it is produced by roff that has been injected into the
+ document by the tbl(1) preprocessor. The other 3 such possible
+ diagnostic messages already do this. Thanks to Bjarni Ingi
+ Gislason for bringing the inconsistency to light.
+
+ Fixes <https://savannah.gnu.org/bugs/?59443>.
+
+2020-11-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/groff_mdoc.7.man (Predefined strings): Ensure the table
+ fits even on ASCII and Latin-1 terminals. Thanks to Bjarni Ingi
+ Gislason for the report.
+
+ Fixes <https://savannah.gnu.org/bugs/?59424>.
+
+2020-11-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/groff_mdoc.7.man (General text domain/Enclosure and
+ Quoting Macros): Fix errors in macro descriptions.
+ <.Dq>: Encloses its arguments in directional double quotes where
+ available.
+ <.Eq>: Misrendered example; say "XstringY" rather than
+ "XXstring".
+ <.Sq>: Encloses its arguments in directional single quotes where
+ available.
+
+2020-10-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Add support for CS and CT registers to mdoc(7), just like in
+ man(7), from a year ago.
+
+ * tmac/doc.tmac-u (doc-print-recursive): Call .stringup on each
+ argument if register doc-do-capitalize is true.
+ * tmac/mdoc/doc-common-u (Dt): Call .stringup on
+ doc-document-title if \n[CT] is true.
+ (Sh): Set doc-do-capitalize to value of \n[CS]. Set
+ doc-do-capitalize false before returning.
+ * tmac/mdoc/doc-ditroff-u:
+ * tmac/mdoc/doc-nroff-u: Set CS and CT registers to 0 (false)
+ if the user has not defined them.
+
+ * tmac/groff_mdoc.7.man \
+ (Formatting with groff, troff, and nroff): Document it.
+
+ * tmac/tests/doc-CS_works.sh:
+ * tmac/tests/doc-CT_works.sh: Test it.
+ * tmac/tmac.am (tmac_TESTS): Run tests.
+
+2020-10-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (do_overstrike, do_bracket)
+ (do_name_test, do_expr_test, do_zero_width, do_width)
+ (do_special, do_if_request, read_color_draw_node): Improve
+ diagnostic messages for missing closing delimiters by describing
+ the incomplete structure and the problem token.
+ (read_rgb, read_cmy, read_cmyk, read_gray): Improve English
+ syntax of diagnostic message when color definition missing.
+
+2020-10-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-ditroff-u:
+ * tmac/mdoc/doc-nroff-u: Recognize but ignore the groff_man(7)
+ string HF and registers FT, IN, P, SN, and X (by initializing
+ them empty or zero if they are not set). This reserves them so
+ that they don't become used for divergent purposes. man(1)
+ programs set these and other parameters already handled (like
+ LL) to configure page rendering, and it would break the
+ macro-package agnosticism afforded by andoc.tmac to expose
+ different externally-programmable registers and strings.
+ * tmac/groff_mdoc.7.man \
+ (Formatting with groff, troff, and nroff): Document this.
+
+2020-10-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac: Implement \*< and \*> strings for subscripting.
+ groff ms has had (extension) strings for superscripting since
+ 1991 at the latest, and the asymmetry possessed me of a madness.
+ Both pairs of string names follow similar usage in Eric Allman's
+ "me" macros.
+
+ * NEWS:
+ * doc/groff.texi:
+ * tmac/groff_ms.7.man: Document it.
+
+2020-10-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/groff_mdoc.7.man (Predefined strings): Fix error: the
+ \*[Lq] and \*[Rq] strings degrade to neutral double quotes (")
+ on "nroff" devices (-Tascii and -Tlatin1), not "``" and "''".
+
+2020-10-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac (ds*end!0): Improve diagnostic to mention .RD.
+
+2020-10-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/s.tmac: Revise diagnostic messages. Define a common
+ prefix string, starting all such messages with "s.tmac".
+ Continues the long process of fixing Savannah #52463. Drop the
+ word "macro" from diagnostic since this will now be clear from
+ the prefix. Prefix every macro name in a diagnostic message
+ with a leading dot; this was already done in four cases.
+ (cov*first-page-init): Use temporary string to avoid multi-line
+ diagnostic message.
+ (@NH): Use temporary string to prevent overlength line.
+
+ A further benefit of this revision is that index information
+ produced by ms's .IX macro (which writes to the standard error
+ stream) will now be trivially easy to extract even for documents
+ that cause diagnostic messages. One can simply filter them with
+ grep -v '^s\.tmac:'
+ or similar.
+
+2020-10-28 Ingo Schwarze <schwarze@openbsd.org>
+
+ * man/roff.7.man, tmac/groff_man.7.man.in: Correct man(7)
+ history.
+
+2020-10-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Fix ms .R macro to work as documented, by handling its arguments
+ instead of ignoring them.
+
+ * tmac/s.tmac (R): Delete. During set up, call
+ par*define-font-macro for R font just as we do for B, I, and BI.
+
+ Problem dates back at least to groff 1.02, June 1991.
+
+ * tmac/tests/s_R-handles-its-arguments.sh: Test it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+ Fixes <https://savannah.gnu.org/bugs/?59348>.
+
+2020-10-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Fix ms .TC macro by allowing it to actually use lowercase Roman
+ numerals for the page(s) of the table of contents when a custom
+ title (header or footer) is defined containing '%'.
+
+ As a side effect, eliminate the PN register, which was
+ apparently misused because it was undocumented and had a name
+ just long enough to be both suggestive and ambiguous. Another
+ pin goes into my Ken Thompson voodoo doll.
+
+ * tmac/s.tmac (IX): Write out page number of index term(s) using
+ the % register (instead of PN), obtaining whatever format is
+ assigned to the register at that time.
+ (CH): Similarly, output %, not PN, in the center of the default
+ heading.
+ (PT): Save the format of %, set it to decimal, copy its value to
+ a new register, pg*page-number-in-decimal, then restore %'s
+ previous format. Compare the new register, not %, to 1 to
+ determine whether special page one behavior should be used.
+ (pg*end-page): Assign pg*next-format to %, not PN.
+ (XA): Define toc*num with the interpolation of %, not PN.
+
+ * tmac/tests/s_TC-works-with-percent-in-custom-titles.sh: Test.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+ Problem appears to be very old; as I read it, Larry Kollar was
+ complaining of it in his ms.ms document over 20 years ago.
+
+ Fixes <https://savannah.gnu.org/bugs/?59345>.
+
+2020-10-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * man/groff.7 (Requests/Request short reference) <.af>: Fix
+ error; "l" is not a valid register format. Explain what the
+ request does, and the default format, as tersely as possible.
+
+2020-10-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Use only `malloc()` and `free()` to manage memory of paths
+ opened by the parser instead of mixing in C++ new/delete
+ management under some runtime-dependent circumstances.
+
+ * src/libs/libgroff/relocate.cpp (relocatep): Use `malloc()`,
+ not new.
+ * src/roff/troff/input.cpp (process_macro_file)
+ (process_startup_file, macro_source): Use `free()`, not
+ `{a_,}delete()`.
+
+ Thanks to an anonymous contributor for the report and patch.
+
+ Fixes <https://savannah.gnu.org/bugs/?56694>.
+
+2020-10-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * man/groff_char.7.man (Description/Special character escape
+ forms): Clarify discussion of Unicode Normalization Form D and
+ its applicability to code points acceptable in Unicode numeric
+ special character escapes. Also document that these escapes
+ must use uppercase hexadecimal digits.
+
+ Attempts once again to slay the unkillable beast that is
+ <https://savannah.gnu.org/bugs/?57618>.
+
+2020-10-21 Ingo Schwarze <schwarze@openbsd.org>
+
+ On systems without NAME_MAX, use FILENAME_MAX as a last resort.
+
+ Problem reported by Eli Zaretskii <eliz at gnu dot org>
+ on MS Windows in https://savannah.gnu.org/bugs/?55449
+
+2020-10-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/env.cpp (environment::possibly_break_line):
+ Emit break warning and return if the output width is not
+ positive. The code assumes that it will be and loops infinitely
+ if it isn't. I _think_ this is because we're not able to get
+ width data for (some?) CJK glyphs. Based on a patch by Osamu
+ Sayama.
+
+ * src/roff/groff/tests/\
+ do_not_loop_infinitely_when_breaking_cjk.sh: Test it.
+ * src/roff/groff/groff.am: Run test.
+
+ Fixes <https://savannah.gnu.org/bugs/?44018>.
+
+2020-10-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/table.cpp (table::init_output): Save the value
+ of \n[.tabs] when starting a table. In the reset macro, restore
+ the saved value.
+
+ Based on a patch by Bjarni Ingi Gislason (tweaked to use a more
+ normative preprocessor symbol; "REG"s aren't "NAME"s).
+
+ * src/preproc/tbl/tests/save-and-restore-tab-stops.sh: Test it.
+ * src/preproc/tbl/tbl.am (tbl_TESTS): Run test.
+
+ Fixes <https://savannah.gnu.org/bugs/?42978>.
+
+2020-10-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/nroff/nroff.sh: Recognize -E option and pass it
+ through to troff. Document it in usage message.
+ * src/roff/nroff/nroff.1.man: Document new -E option.
+
+ Based on a patch by Ingo Schwarze.
+
+ Fixes <https://savannah.gnu.org/bugs/?44289>.
+
+2020-10-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac: Stop remapping ` and '. Our own pages now
+ appear to be clear of wrong-quote problems, so let's make them
+ visible if they recur. Those who don't want to fix bad man
+ pages (distributors, site admins) can restore the mappings in
+ their man.local files.
+
+2020-10-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (an-warn): New; emits warning diagnostic.
+ (R): Use new macro instead of .tm* requests directly.
+
+2020-10-18 Ingo Schwarze <schwarze@openbsd.org>
+
+ #include "config.h" before <stdio.h>
+
+ Required with e.g. gcc 4.2.1 because gnulib/lib/stdio.in.h
+ uses the "restrict" keyword since this gnulib commit:
+ commit 182afcba2635cbff91240656c7fb3742dd23ab6f
+ Author: Bruno Haible <bruno@clisp.org>
+ Date: Sat Feb 22 20:57:30 2020 +0100
+
+ Otherwise, the build may die from the declaration of
+ various printf-like functions with messages like:
+ ./lib/stdio.h:851: error: expected ',' or '...' before 'fp'
+
+ * src/libs/libgroff/assert.cpp, src/libs/libgroff/errarg.cpp,
+ src/libs/libgroff/error.cpp, src/preproc/eqn/eqn.ypp:
+ #include "config.h".
+
+2020-10-18 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ hpftodit: incorrect 'delete' after new[]
+
+ * src/utils/hpftodit/hpftodit.cpp (output_font_name): use
+ 'delete[]'.
+
+ Fixes bug #55331. Found by David Binderman, fixed by Ingo
+ Schwarze.
+
+2020-10-18 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ preconv: don't use libuchardet if input is stdin
+
+ * src/preproc/preconv/preconv.cpp (do_file): don't call
+ detect_file_encoding if input file is "-"
+
+ This fixes the failure on MS-Windows described #55334, however
+ this does not fix the encoding detection with uchardet if the
+ input is stdin (the user would have to pass with -D the correct
+ encoding as explained in the man page).
+
+2020-10-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/eqn/lex.cpp (troff_defs): Set the "..." token on
+ the baseline, not vertically centered, aligning the actual
+ behavior with what our eqn(1) man page has claimed since 2007.
+
+ Fixes <https://savannah.gnu.org/bugs/?59285>.
+
+2020-10-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grops/grops.1.man
+ (Usage/TrueType and other font formats): Remove dead URL to
+ ttftot42 utility. Update URL to fontforge tool. Replace much
+ of the discussion with an example, motivated by Jordan Torbiak's
+ "groff-install-font" script on GitHub Gist, of how to add the
+ Roboto Slab Regular font to a user-local groff font directory
+ {and how to test it, too}.
+
+ Fixes <https://savannah.gnu.org/bugs/?58077>.
+
+2020-10-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/afmtodit/afmtodit.pl: Report program name in warning
+ diagnostics.
+
+ Continues the long process of fixing Savannah #52463.
+
+2020-10-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac: Add fallback for lq, rq strings.
+
+ Define \*(lq and \*(rq as '"' if the output device has no \(lq
+ or \(rq special character escapes defined (respectively).
+
+ This is a bit belt-and-suspenders for groff since our output
+ devices all guarantee availability of these glyphs, but if this
+ macro file gets used with other implementations (and if they
+ support the 'c' conditional), it should prevent the strings from
+ producing empty output.
+
+ Man page writers should simply use \(lq and \(rq unless they are
+ aiming for pathological levels of portability (e.g., composing
+ man pages today for consumption on simulators of 1980s Unix
+ systems).
+
+2020-10-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac: Define an-end with .de1. We need to define
+ an-end with de1 (execute macro with compatibility mode off)
+ because, as of 37b4180a27a6eeaea429e40ec278abefcda7f3a7 (11
+ October), it can now be called from a trap executing in a
+ context whence compatibility mode might be on (namely,
+ "reload-doc" in andoc.tmac).
+
+2020-10-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/eqn/main.cpp (main):
+ * src/preproc/pic/main.cpp (main):
+ * src/preproc/tbl/main.cpp (main):
+ * tmac/eqnrc:
+ * tmac/troffrc: Perform checks of register and macro definitions
+ with a .do request, since we might be in compatibility mode.
+
+2020-10-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (do_if_request): Emit warning of type
+ "syntax" if a groff conditional expression extension is used
+ when compatibility mode is active.
+
+ * doc/groff.texi:
+ * src/roff/troff/troff.1.man: Update description of "syntax"
+ warning type to be more general. It was inaccurate, referring
+ only to "dubious syntax in numeric expressions", which was not
+ the case. Instead it was being used only for poor construction
+ of character classes with the .class request.
+
+2020-10-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/main.cpp (main): Stop ignoring -T. GNU tbl
+ was undocumentedly ignoring the -T option; apparently IRIX tbl
+ implemented it, something on the system called tbl with that
+ option (I'm guessing IRIX's man(1)) and its users spammed James
+ Clark with bug reports. We can probably weather the volume of
+ such spurious reports from IRIX users today.
+
+2020-10-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/main.cpp (main): Clarify fatal diagnostic in
+ generated document by informing the user that the program is
+ aborting, and also that it is groff extensions that are required
+ rather than GNU troff per se (since Heirloom Doctools troff
+ claims groff extension support via the .g register).
+
+2020-10-14 Ingo Schwarze <schwarze@openbsd.org>
+
+ In groff(1), fix the combination of -v with -k, -j, and -J.
+
+ * src/roff/groff/groff.cpp: Pass the -v option through to the
+ preconv, chem, and ideal preprocessors, just like for all
+ other preprocessors, to print the version of the preprocessor
+ and to avoid garbage output.
+
+ Bugfix patch from Eli Zaretskii <eliz at gnu dot org>
+ submitted in: https://savannah.gnu.org/bugs/?55297
+
+2020-10-12 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Update 'gnulib' submodule.
+
+ * gnulib: now points on d60a35e94c4f5b8f09f15828242418f5073d46e7
+ from 'gnulib' repository.
+
+ * configure.ac: minimum autoconf version is now 2.64 due to
+ gnulib upgrade.
+
+ * FOR-RELEASE: add the gnulib update to the checklist.
+
+2020-10-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/andoc.tmac: When switching between macro packages in
+ andoc and using continuous-rendering mode, flush any partially
+ collected output line and write page footer.
+ (reload-doc): Call an-end if it is defined.
+ (reload-man): Call doc-end-macro if it is defined.
+ * tmac/tests/andoc-flush-between-packages.sh: Add regression
+ test.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+ Fixes <https://savannah.gnu.org/bugs/?59106>.
+
+2020-10-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/andoc.tmac: Remove traps set by mdoc package by the names
+ they actually use.
+ * tmac/tests/andoc-clear-doc-traps.sh: Add regression test.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+ Fixes <https://savannah.gnu.org/bugs/?59246>.
+
+2020-10-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/table.cpp (table::init_output): In the release
+ macro written to the output, reword the warning diagnostic that
+ is emitted when a table row is to be output without enough room
+ before the next page location trap. The former wording said
+ that a "text block" would not fit on the page, and that is
+ normally how table rows grow longer than one line in the first
+ place. However, there are other ways the conditional can be
+ satisfied, as witnessed in Savannah #57665, so simply say what
+ is known; that the table _row_ overruns the space to the next
+ trap (we say the row won't "fit on [the] page").
+
+ Fixes <https://savannah.gnu.org/bugs/?59233>.
+
+2020-10-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/table.cpp
+ (double_line_entry::double_line_entry):
+ (double_line_entry::simple_print): Remove garbage lines
+ inadvertently added in previous commit.
+
+2020-10-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Stop tbl from injecting spurious blank lines (and emitting
+ spurious warnings about tables and "text blocks" not "fitting on
+ a page") into long tables in man pages when continuous rendering
+ is used (the default for nroff output devices).
+
+ * src/preproc/tbl/table.cpp (USE_KEEPS_REG): New preprocessor
+ symbol stores name of groff register for dynamic determination
+ of keep usage.
+ (table::init_output): If the NOKEEP flag is not set, then in
+ generated groff output, see if the usekeeps register is defined;
+ if not, define it and enable usage of keeps.
+ (table::do_row): In groff output, check usekeeps register before
+ calling keep and release macros.
+ (table::do_bottom): In groff output, check usekeeps register
+ before calling release macro.
+
+ * tmac/an-old.tmac (TS): Set the usekeeps register used by tbl
+ to the logical complement of the man(7) cR (continuous
+ rendering) register.
+
+ * tmac/tests/an-old_TS_do_not_keep_tables_when_cR_set.sh: Add
+ regression test.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+ Problem appears to date back to the introduction of continuous
+ rendering in groff 1.17 (3 May 2001).
+
+ Fixes <https://savannah.gnu.org/bugs/?57665>.
+
+2020-10-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/table.cpp (simple_entry::position_vertically):
+ (block_entry::position_vertically):
+ (table::determine_row_type):
+ (printfs): Update assertions to indicate what actually went
+ wrong.
+
+2020-10-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/node.cpp: Make diagnostics slightly more
+ informative in unusual error cases.
+ (real_output_file::~real_output_file): If ferror() reports error
+ status on a stream say that, instead of "error writing". If it
+ does not, but fflush() fails on the stream, describe the flush
+ as failing, and use strerror() since fflush() sets errno. If
+ pclose() fails, say that we were unable to close a pipe instead
+ of repeating the name of the C library function to the user, who
+ might not be a C programmer. Report strerror() in this case and
+ for a failing fclose().
+ (real_output_file::flush): Repeat updated fflush() logic from
+ previous function.
+
+2020-09-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (register setup): Make interaction of \n[C]
+ register and HTML output more clear in code and comments.
+
+2020-09-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/tests/regression_savannah_59202.sh: Reduce test
+ case.
+
+2020-09-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Fix SEGV arising from recursing destructor.
+
+ * src/roff/troff/node.h (output_file): Add class member
+ `is_dying` to track whether destructor has already been entered;
+ initialize false.
+ * src/roff/troff/node.cpp (real_output_file::~real_output_file):
+ Set `is_dying` true when destructor entered.
+ * src/roff/troff/div.cpp (cleanup_and_exit): Only delete
+ `the_output` object if it is not already being destroyed.
+ * src/roff/groff/tests/regression_savannah_59202.sh: Add test.
+ * src/roff/groff/groff.am (groff_TESTS): Run test.
+
+ Thanks to "hackerb9" for reporting the problem. Problem appears
+ to date back to groff 1.02 (June 1991) or earlier.
+
+ Fixes <https://savannah.gnu.org/bugs/?59202>.
+
+2020-09-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (register setup): Condition decisions on
+ \n[an-html] rather than a string comparison using \*[.T]; that
+ is what the register is there for.
+
+2020-09-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/andoc.tmac: Save alias to .ne request.
+ (reload-doc): Restore .ne request, which an-old.tmac meddles
+ with if continuous rendering is used. (The meddling ultimately
+ dates back to 777e2d262862621966c18d685a000cc88f432bc6, 26
+ January 2002, which simply redefined .ne as empty on nroff
+ devices.)
+
+2020-09-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Ship tests in distribution archive.
+
+ * src/preproc/preconv/preconv.am (EXTRA_DIST):
+ * src/roff/groff/groff.am (EXTRA_DIST):
+ * src/roff/nroff/nroff.am (EXTRA_DIST):
+ * tmac/tmac.am (EXTRA_DIST): Add
+ $({preconv,groff,nroff,tmac}_TESTS), as appropriate.
+
+ * src/roff/nroff/nroff.am (MOSTLYCLEANFILES): Stop adding
+ $(nroff_TESTS), which can only have unhappy consequences.
+
+2020-09-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tmac.am: Fix problem with recently-relocated mdoc macro
+ files not ending up in the right place in the distribution
+ archive.
+ (dist_tmac_DATA): Also include $(TMACUNSTRIPFILES).
+ (TMACMDOCSTRIPFILES): Rename from $(TMACMDOCFILES). Update
+ interpolation sites.
+ (TMACMDOCUNSTRIPFILES): New variable holds mdoc macro files in
+ the tmac/mdoc subdirectory. Stop adding these files to
+ $(TMACUNSTRIPFILES) since those reside in tmac/ directly.
+ (EXTRA_DIST): Add $(TMACMDOCUNSTRIPFILES).
+ ($(TMACSTRIPFILES)): Depend only on $(TMACUNSTRIPFILES).
+ ($(TMACMDOCSTRIPFILES)): Add new rule, much like the foregoing.
+ Depend on $(TMACMDOCUNSTRIPFILES) and copy files into tmac/mdoc.
+ (dist-hook, tmac-dist-hook): Remove; they no longer do any
+ distinct work.
+
+ Fixes <https://savannah.gnu.org/bugs/?59186>.
+
+2020-09-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/tbl/table.cpp (table::init_output):
+ (table::compute_expand_width):
+ (table::compute_separation_factor): Use consistent format for
+ diagnostic messages.
+ - Do not spread a single diagnostic across multiple lines.
+ - Report messages in GNU Coding Standards format, that is:
+ - Report the name of the file the problem is in...
+ - ...then the line number...
+ - ...then the diagnostic severity level...
+ - ...then the specific problem.
+
+2020-09-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac: Emit warnings when configuration registers
+ are ignored when producing output for HTML.
+
+2020-09-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (an-p-footer): Define \*[an-page-string] if
+ (1) the output device is not HTML; (2) \n[X] has been defined;
+ and (3) the page number has not yet reached the threshold
+ defined by \n[X].
+
+ Fixes <https://savannah.gnu.org/bugs/?59179>.
+
+2020-09-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Add regression test for Savannah #59179.
+
+ * tmac/tests/an-old_X_register_works.sh: Do it.
+ * tmac/tmac.am (tmac_TESTS): Run it.
+
+2020-09-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac:
+ * tmac/doc.tmac-u: Emit more informative fatal diagnostic when
+ installed version of groff is too old. Report the version found
+ and explicitly note consequent abort.
+
+2020-09-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tmac.am: Regenerate stripped macro files upon changes to
+ any of their unstripped counterparts. This is crude, but they
+ weren't being regenerated at _all_. Defeating a central
+ function of Make is bad.
+ (TMACUNSTRIPFILES): New variable. Populate with -u files.
+ ($(TMACMDOCFILES) $(TMACSTRIPFILES)): Depend on
+ $(TMACUNSTRIPFILES).
+
+2020-09-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac:
+ * tmac/andoc.tmac:
+ * tmac/doc.tmac-u:
+ * tmac/s.tmac: Clarify fatal diagnostics by informing the user
+ that the program is aborting.
+
+2020-09-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/www.tmac.in: Revise diagnostic message handling.
+ (www:fatal): New macro handles fatal macro usage errors.
+ (www:lenstr): Use www:fatal instead of writing to standard error
+ with .tm (rather than www:error) and then calling .ab without
+ arguments, which produces an unsightly "User Abort." message.
+ (www:lenstr):
+ (www:splitstr):
+ (www:url_breaks):
+ (www:url_breaks_split):
+ (LINKSTYLE): Report expected number of arguments in diagnostics.
+ (www:fontstyle): Shorten diagnostic message.
+
+2020-09-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/div.cpp
+ (top_level_diversion::clear_diversion_trap): Fix copy and paste
+ error in diagnostic, which wrongly reported that a top-level
+ diversion trap couldn't be "set" when "clear"ed was meant.
+
+2020-09-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/grn/main.cpp (conv):
+ * src/roff/troff/node.cpp (suppress_node::tprint): Remove
+ embedded newlines from diagnostic messages.
+
+2020-09-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac: Move setup of remaining rendering option
+ parameters (registers C, D, P, and X) to end of file.
+
+2020-09-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (TH): Move setup of rendering parameter
+ registers IN and SN from here to the end of the file. Update
+ comments.
+
+2020-09-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac: Drop \*[an-empty] string. This string is
+ documented as preventing "looping" (presumably infinitely) if
+ someone calls a two-font macro with an inconvenient parameter;
+ the example shown is ".RB ( \\ )". This string was being
+ interpolated at the end of each argument pair to the two-font
+ macros BI, BR, IB, RB, and RI. This code dates back to groff
+ 1.10 (dc5351364982f78f8c630f1e856d692d4a82666f, 26 November
+ 1995). Did you notice a two-font macro missing? It was: IR.
+ Using it with the proscribed input fails to cause a problem; the
+ others similarly operate just fine when the empty string
+ interpolation is removed. Presumably at some point in the past
+ 25 years, this workaround became unnecessary.
+ (BI, BR, IB, RB, RI): Remove interpolations of string.
+
+ * tmac/tests/an-old_avoid_two-font_denial_of_service.sh: Add
+ regression test.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2020-09-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac: Refactor continuous rendering handling.
+ Relocate set up of \n[cR] to end of file in parallel with other
+ rendering parameter management. Instead of conditionally
+ defining the an-ne and an-bp macros, define them
+ unconditionally. Also define them with .de instead of .de1,
+ since they will only be called within the contexts of macros
+ that are already running with compatibility mode off (i.e., the
+ public interface macros). Relocate definition of an-end to sit
+ alongside these other continuous-rendering-mode specific macros
+ and avoid a forward reference and scattering of \n[cR]
+ conditionals around the file.
+ (an-set-up-continuous-rendering): Define new macro to move
+ macros (and end macro) into place. Call it at the end of the
+ file only if cR eventually winds up being true.
+
+2020-09-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac: Improve name space management. Rename .ne
+ request to .an-ne instead of outright clobbering it (and in
+ parallel with .an-bp). Rename 'an-ne' register to 'an-need' to
+ prevent confusion with renamed request.
+
+2020-09-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac: Drop .ll hack for LL register.
+
+ Drop the .ll hack for setting the line length on nroff devices.
+
+ Once upon a time, the only way to get man pages to render on a
+ terminal at any width other than the nroff default of 65n was to
+ put an .ll request into the page--a mortal sin against
+ portability--or your man(1) program could sneak such a request
+ into nroff's input stream.
+
+ Also, long ago, John Eaton of UT Austin wrote a man(1) program.
+ In a few years this implementation branched into two lines of
+ development, which I'll call man-db man (Wilford/Polacco/Watson)
+ and another, Brouwer/Lucifredi man, which as of this writing saw
+ its last release in 2011 (1.6g).
+
+ The man and mdoc macros of groff 1.18 (July 2002) introduced an
+ LL register to configure the line length, respecting an -rLL
+ command-line option. The source change was made by Werner
+ Lemberg on 3 May 2002 and Colin Watson updated man-db man(1)--on
+ the same day!--to synthesize the option when calling groff.
+
+ Later, in August 2005, Keith Marshall, a user of version 1.5m of
+ Brouwer/Lucifredi man(1), which did not set the LL register,
+ suggested that the existing .ll setting (technically, the value
+ of \n[.l], the only way the result of an .ll request could be
+ introspected) be honored in the absence of the LL register.
+ However, it is impossible to distinguish a user-supplied ".ll
+ 65n" request from nroff's default setting, which was in that
+ case overridden to the modern default of 78n.
+
+ And so, in what is now git commit
+ f9d5df4aebd3d834b4084ffefa52a115e00dce38 (1 September 2005), it
+ was done.
+
+ This led to (1) surprising behavior for users accustomed to old
+ methods and desirous of the nroff default and (2) lengthy
+ apologia in groff source code comments and the groff_man(7) man
+ page.
+
+ Ironically, Brouwer/Lucifredi man(1) had already added support
+ for the LL register by the time of its 1.6 release two months
+ earlier (20 June 2005). (Curiously, it did so similarly to the
+ old .ll hack, by injecting an '.nr LL' request into groff's
+ input stream, rather than using the -r command-line option.)
+ Moreover, Marshall and the groff list were already aware of
+ this, but the change was accepted anyway because version 1.6
+ was "too new"! (Distributions are slow sometimes, true...)
+
+ Let us survey the field in 2020. man-db man(1) has supported
+ the LL register for eighteen years, and Brouwer/Lucifredi man(1)
+ for fifteen. Heirloom Doctools's man macros set the line length
+ to 78n on nroff devices unconditionally. mandoc(1) similarly
+ also always formats for 78 columns on terminals. groff's
+ mdoc(7) macros grew support for LL in parallel with man(7) in
+ 2002 and never added the \n[.l] introspection at all.
+
+ There no longer seems to be any reason to preserve this hack.
+
+ * tmac/an-old.tmac (initialization): Drop complex setup of LL
+ register.
+ (TH): Relocate line length reset; no behavior change.
+ (after .mso man.local): Initialize LL only if the user hasn't;
+ use device default in troff mode, and 78n in nroff mode.
+
+ * tmac/groff_man.7.man.in (Options) <-rLL>: Stop documenting .ll
+ hack.
+
+ Fixes <https://savannah.gnu.org/bugs/?58992>.
+
+2020-09-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/an-old_LL_init_sanely.sh: Add test.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2020-09-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/xditview/GXditview.ad: Widen the default geometry
+ to accommodate the width of a page rendered using the X100-12
+ device. Display devices these days have much greater horizontal
+ resolution than they did 20 years ago.
+
+2020-09-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac: Use correct point size default for
+ X{75,100}-12 devices.
+
+2020-09-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/mdoc/doc-common-u (doc-prepare-section-heading): New
+ macro defines new string doc-sec-head to enable recognition of
+ mixed-case section headings in mdoc man pages. For example,
+ "Name" and "Description" are now recognized in addition to
+ "NAME" and "DESCRIPTION".
+ (doc-section-{name,synopsis,library,description,see-also,files,
+ authors}): Redefine strings to be mixed-case. Add trailing
+ comment guard per recommended best practice.
+ (Sh): Call doc-prepare-section-heading instead of
+ doc-first-parameter, and compare predefined section strings to
+ doc-sec-head instead of doc-str-dfp.
+
+ * tmac/tests/doc-accept-mixed-case-section-headings.sh: Test it.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+ * tmac/tests/doc-smoke-test.sh: Use mixed-case section headings.
+
+2020-09-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * makevarescape.sed: Use \[] form of special character escapes.
+
+ The only man page we have that doesn't turn compatibility mode
+ off (neqn) also doesn't use any sed-substituted patterns where
+ characters replaced by a \[] special character escape form are
+ likely to be used.
+
+ The @g@ command prefix is the main avenue for intrusion of such
+ escapes, but I think it improbable that many people are going to
+ include apostrophes, double quotes, carets, grave accents, or
+ tildes in the command prefix; some or all of these will pick
+ fights with the shell and require quoting that we don't
+ represent in man page text anyway.
+
+ On top of that, neqn is largely a stub page.
+
+ If it's a problem, a better fix than reverting this is to make
+ neqn switch out of compatibility mode like our other man pages.
+
+2020-09-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * FOR-RELEASE: Start a release checklist. We probably should
+ have done the afmtodit.tables update for 1.22.4. There were no
+ AGL changes and the Unicode decomposition changes were limited
+ to additions for Balinese (11), CJK compatibility ideographs
+ (5), and 13 code points outside the Basic Multilingual Plane.
+
+2020-09-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/afmtodit/afmtodit.tables: Regenerate using Unicode
+ 13.0.0.
+
+2020-09-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ make-afmtodit-tables: Automate AGL reassignments.
+
+ Automate the procedure done manually in
+ b72b91e85e80a69304e6569db535bcca0e0ecab5 (9 April 2007), so that
+ it doesn't regress when we regenerate afmtodit.tables.
+
+ * src/utils/afmtodit/make-afmtodit-tables: Do it.
+ * src/utils/afmtodit/afmtodit.tables: Regenerate it.
+
+2020-09-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/groff.1.man (Options) <-E>:
+ * src/roff/troff/troff.1.man (Options) <-E>: Document that -E
+ implies -Ww.
+
+ Fixes <https://savannah.gnu.org/bugs/?59030>.
+
+2020-09-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * man/groff_char.7.man: Revise glyph descriptions.
+
+ Fixes <https://savannah.gnu.org/bugs/?59031>.
+
+2020-09-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tty.tmac: Define fallback glyphs for Bell System logo
+ {non-breaking adjustable space} and radical extension and square
+ root extension (both dummy characters '\&') to suppress warnings
+ from groff_char(7). As none of these are encoded in Unicode it
+ seems unlikely they will become supported soon.
+
+2020-08-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/troff.1.man (Options) <-I>: The current working
+ directory is searched _last_, not first, unless the order is
+ altered with "-I .".
+
+ * src/roff/groff/groff.1.man (Options) <-I>: Rearrange
+ description.
+
+2020-08-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Update mdoc package to honor HY register as man does now, per
+ suggestion from Colin Watson. Recognize but ignore AD string
+ for man package compatibility (essentially "reserving" it),
+ though mdoc intentionally does not permit configuration of
+ adjustment.
+
+ * tmac/mdoc/doc-ditroff-u:
+ * tmac/mdoc/doc-nroff-u: Do it.
+
+ * tmac/mdoc/doc-common-u: Initialize \n[doc-hyphen-flags] from
+ \n[HY].
+
+ * tmac/groff_mdoc.7.man \
+ (FORMATTING WITH GROFF, TROFF, AND NROFF): Document it.
+
+2020-08-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (TH): Reset inter-word and inter-sentence
+ spacing to default with each new page rendered.
+
+ {To observe the problem prior to this change,
+ $ groff -mandoc groff_mmse.7 $any_other_man_page
+ groff_mmse(7) loads sv.tmac, which changes the sentence
+ spacing.}
+
+2020-08-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * PROBLEMS: Undocument the problem with test-groff and mdoc.
+ It's resolved.
+
+ Fixes <https://savannah.gnu.org/bugs/?51073>.
+
+2020-08-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tmac.am (NORMALFILES, MDOCFILES): Drop unused variables.
+ ($(TMACMDOCFILES) $(TMACSTRIPFILES)): Scrub trailing whitespace.
+ Wrap long line.
+
+2020-08-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ mdoc: Relocate within build tree.
+
+ The (modern) mdoc macro package has not been usable within the
+ build tree, unlike the others. This makes it more troublesome
+ to test changes, and frustrates deploying our test
+ infrastructure against it. Re-arrange the build tree to
+ resemble an installation tree closely enough for the macro
+ package to load.
+
+ * tmac/doc-common-u:
+ * tmac/doc-ditroff-u:
+ * tmac/doc-nroff-u:
+ * tmac/doc-syms-u: Rename to...
+ * tmac/mdoc/doc-common-u:
+ * tmac/mdoc/doc-ditroff-u:
+ * tmac/mdoc/doc-nroff-u:
+ * tmac/mdoc/doc-syms-u: ...these.
+
+ * tmac/tmac.am (TMACMDOCFILES): Look for files in tmac/mdoc.
+ ($(TMACMDOCFILES)): Create tmac/mdoc in build tree.
+
+ Fixes <https://savannah.gnu.org/bugs/?51003>.
+
+2020-08-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Add regression test for usable in-tree mdoc.
+
+ * tmac/tests/doc-smoke-test.sh: Add test.
+ * tmac/tmac.am (tmac_TESTS): Run test.
+
+2020-08-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/an-old_TH_repairs_ad_damage.sh:
+ * tmac/tests/an-old_TH_repairs_hy_damage.sh: Add tests.
+ * tmac/tmac.am (tmac_TESTS): Run tests.
+
+2020-08-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (TH): Set hyphenation mode to user preference
+ with each new page rendered, in case a hostile page meddled with
+ '.hy' or '.nh'.
+ (after .mso man.local): Relocate setting of default hyphenation
+ mode here (instead of just before .mso man.local). Eliminate
+ conditional on \n[an-html]; this doesn't matter because
+ grohtml(1) doesn't support hyphenation anyway. If it does learn
+ to hyphenate, we should treat it the same as other output
+ devices in any case. Add comment explaining why we fall back to
+ different defaults depending on \n[cR].
+
+2020-08-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (TH): Set adjustment to user preference with
+ each new page rendered, in case a hostile page meddled with
+ '.ad' or '.na'.
+ (after .mso man.local): Set the default adjustment mode only if
+ a -d option or man.local did not. Also do the same for the HF
+ string; relocate its definition here and make it similarly
+ conditional. Also update comment on setting of CS and CT
+ registers and style their conditionals consistently with the
+ rest of the package.
+
+ * tmac/groff_man.7.man.in (Strings) <\*(AD>: Document it.
+ (Strings) <\*(HF>: Parallelize language with new \*(AD.
+ (Options) Expand introductory sentence to discuss -d and -r
+ options.
+ (Options) <-dAD>: Document default and likely values. Nobody
+ right-justifies or centers man page text; send the curious to
+ groff(7) for '.ad' request documentation.
+ (Options) <-dHF>: Document default and steer people to groff(7)
+ for '.ft' request documentation.
+
+2020-08-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac (set-an-margin): Rename...
+ (an-set-margin): ...to this. It was the only package-internal
+ register, macro, string, or diversion that wasn't named using
+ the "an-*" schema.
+ (TH, SH, SS): Update call sites.
+
+2020-08-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-ext.tmac (.ME, .UE): Restore hyphenation after
+ "punctuation" arguments have been output. The next token will
+ always be a space node, the end of the document, or similar.
+
+ * tmac/tmac.am (tmac_XFAIL_TESTS): Mark the punctuation
+ hyphenation tests as expected to fail, because they now do.
+
+2020-08-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/ps.tmac: Define ordinary hyphen-minus as fallback
+ character for U+2011 (non-breaking hyphen). Prompted by
+ discussion with Dave Kemper in Savannah #58390.
+
+2020-08-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Fix hyphenation bug. The UR/UE and MT/ME macros were much too
+ aggressive about turning hyphenation off. Disable it only when
+ writing the actual URL or email address.
+
+ * tmac/an-ext.tmac (.MT, .UR): Stop disabling hyphenation here.
+ (.ME, .UE): Disable hyphenation right before output of
+ URL/address; restore it right before output of supplementary
+ arguments ("punctuation").
+
+ * tmac/tests/an-ext_ME_punct_hyphenates.sh:
+ * tmac/tests/an-ext_MT_body_hyphenates.sh:
+ * tmac/tests/an-ext_UE_punct_hyphenates.sh:
+ * tmac/tests/an-ext_UR_body_hyphenates.sh: Test behavior.
+
+ * tmac/tmac.am (tmac_TESTS): Run tests.
+
+2020-08-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Adapt to the fact that \: reënables hyphenation. Rename
+ "hyphenless [discretionary] break" to "non-printing break point"
+ in documentation.
+
+ * doc/groff.texi (Manipulating Hyphenation): Rename "hyphenless
+ break" to "non-printing break point". Clarify that it is the
+ soft hyphen glyph, not necessarily a hyphen, that is ordinarily
+ written to the output on hyphenation breaks. Note that the
+ remainder of a word after \: is subject to hyphenation as
+ normal. Note (new) '\:\%' idiom for getting what people will
+ want at least some of the time. Update example to use it.
+ * makevarescape.sed: Insert \% after we insert \: to rewrite
+ slashes in filenames, to protect later portions of the filename
+ from hyphenation.
+ * man/groff.7.man (Escape Sequences/Escape short reference):
+ Rename "hyphenless break" to "non-printing break point".
+ * man/groff_diff.7.man (Language/Escape sequences): Resync with
+ our Texinfo manual.
+ * tmac/groff_man.7.man.in (Description/Hyperlink and email
+ macros): Rename "hyphenless break" to "non-printing break
+ point".
+
+2020-08-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ documentation: Re-christen 'ESCAPE_AMPERSAND'.
+
+ s/zero[- ]width space character/non-printing input break/
+
+ * doc/groff.texi (Requests): Rename. Update conceptual index
+ entries; retain old name (with an appended "[sic]") to aid
+ readers accustomed to it.
+ (Ligatures and kerning): Update conceptual index entries.
+ Supply context ("effect on kerning").
+ (Drawing requests): Update conceptual index entries. Supply
+ context ("effect on '\l'").
+ * man/groff.7.man (Description): Rename in macro-advice-writing
+ shorthand.
+ (Escape Sequences/Escape short reference): Rename.
+ * tmac/groff_man.7.man.in (Description/Command synopsis macros
+ [style]: Rename.
+ (Description/Portability) [style]: Rename.
+ * tmac/groff_mdoc.7.man (TROFF IDIOSYNCRASIES/Macro Usage):
+ Rename.
+ (TROFF IDIOSYNCRASIES/Other Possible Pitfalls): Rename.
+
+2020-08-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/groff_man.7.man.in (Description/{Document structure
+ macros <.TH>, Horizontal and vertical spacing}): Fix erroneous
+ use of "flush left". The current uses were introduced by me,
+ but the page has borne incorrect uses of it as far back as 1999
+ {in the description of .TP}. Simply say "with no indentation"
+ instead.
+
+2020-08-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/groff_man.7.man.in (Description/Number registers): Inform
+ reader that registers can be set in man.local file and
+ cross-reference it.
+ (Files/*/man.local): [style] Supply example of man.local
+ customizations, prompted by recent discussions on groff,
+ linux-man, and man-db mailing lists.
+
+2020-08-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tmac.am: Use a stamp file for m4 keyword check.
+ (M4CHECK): Add stamp file variable.
+ ($(M4CHECK)): Create stamp file if check succeeds.
+
+2020-08-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Split groff_man(7) into two pages; one a (relatively) terse
+ reference and the other a tutorial and style guide. Both are
+ generated from the same source, which is processed by m4 into
+ two man page sources.
+
+ * tmac/groff_man.7.man: Rename...
+ * tmac/groff_man.7.man.in: ...to this.
+
+ * tmac/groff_man.7.man.in: Add m4 directives and define macros.
+ Protect m4 keywords in English from unintended expansion (this
+ affected the word "include"). Add new .TH and apropos lines for
+ style guide. Convert marker comments into m4 macros for content
+ control. Uncomment material intended only for basic reference
+ page.
+
+ * tmac/tmac.am (man7_MANS): Add groff_man_style.7.
+ (EXTRADIST) Add groff_man.7.man.in.
+ (MOSTLYCLEANFILES): Add m4-generated man page sources
+ tmac/groff_man{,_style}.7.man.
+ Add targets to generate those same two pages from the renamed
+ file. Add target to grep the page for unprotected English m4
+ keywords and halt the build if they are found. Make generation
+ of those pages depend on this new target.
+
+2020-08-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/groff_man.7.man: Add material on hooks and encoding.
+ (Description, ./Deprecated features): Stop identifying .PT and
+ .BT as "deprecated"; they shouldn't ever be called in man pages,
+ but that has never been their intention.
+ (Description): Identify character encoding and line-ending
+ requirements (tutorial/style-guide material).
+ (Description/Hooks): Add new subsection to house descriptions of
+ .PT and .BT. Add mnemonic expansions for both.
+
+2020-07-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * man/groff.7.man (Control Characters): Incorrect claims were
+ made. Double quotes can indeed be used to enclose arguments to
+ string interpolations. The statement about a leading " in a
+ string definition (or appendment with .as) was stated too
+ generally. The leading quote is not necessary to include
+ leading tab characters, which can be input as-is, even in
+ compatibility mode.
+
+2020-07-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * man/groff.7.man (Requests/Request short reference/.ft): Fix
+ some outright damage in the description of the request; the
+ escape sequences that are synonymous with a nullary .ft had been
+ wrongly removed.
+
+2020-07-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/meintro.me:
+ * doc/meref.me:
+ * tmac/e.tmac-u: Remove postal address for Eric Allman. It's
+ probably decades out of date. Adjust footnote symbols. Thanks
+ to Dave Kemper for the bug report and the patch. Fixes
+ <https://savannah.gnu.org/bugs/?58726>.
+
+2020-07-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Migrate macro packages from font CW to CR. The font name "CW"
+ {"constant-width"} is a legacy item we can dispose of (except
+ for the DVI device, which also has CWI for "constant-width
+ italic"), and much of the groff codebase already did starting
+ with commit 0de1d6d79cdb959ffa7dac3af77c2a36ef31873f {October
+ 2017}. Courier is available in the usual four styles {roman,
+ bold, italic, bold+italic}.
+
+ * tmac/an-ext.tmac (.EX): Set font to R, not CW. The existing
+ .ft request was somewhat redundant with the '.do fam C'
+ immediately before, which set the font family to Courier.
+ * tmac/s.tmac (.UC): Use font CR, not CW.
+
+2020-07-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tty.tmac: Stop suppressing nonexistent font warning.
+ Prompted by a 2017 suggestion and patch from Bjarni Ingi
+ Gislason. Documents and macro packages that want to change the
+ font family should do so in awareness that this is meaningless
+ on terminal (nroff) devices (and -Thtml as well).
+
+ Fixes <https://savannah.gnu.org/bugs/?51364>.
+
+2020-07-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/groff_man.7.man (.PP, .LP, .P): Fix error: these macros
+ do not reset the left margin.
+
+2020-07-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Strings): Document behavior of .ds request
+ when only one argument is supplied. (The string is defined as
+ empty.) Thanks to Dave Kemper for the report and the patch.
+
+ Fixes <https://savannah.gnu.org/bugs/?58746>.
+
+2020-07-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Using Symbols): Fix error in .rfschar
+ description, which should refer to "font f" rather than "glyph
+ f". Thanks to Dave Kemper for the report and the patch.
+
+ Fixes <https://savannah.gnu.org/bugs/?58767>.
+
+2020-07-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/groff_man.7.man (.EE, .YS): Fix error: refer to "initial
+ hyphenation setting" instead of "previous hyphenation mode".
+ Incidentally, this fact points out why putting ".hy 0" or ".nh"
+ in your man page is futile.
+
+2020-06-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * man/groff.7.man (Requests/Request short reference): Fix error
+ in description of .hc; it changes the hyphenation character
+ rather than supplying an additional one.
+
+2020-06-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Groff Options): Remove editorial comment about
+ '-a' option being "useless". It isn't. Update example for
+ contemporary systems (like Debian) and to reflect the fact that
+ the GNU troff(1) man page needs to be preprocessed with tbl(1).
+ (Invoking grotty): Recast discussion of -c option, importing
+ much language from grotty(1) page rewrite from a year ago. Add
+ program index entries for col, more, and ul. Fix transposition
+ error in ISO document number.
+
+ * src/devices/grotty/grotty.1.man (Description/Legacy output
+ format): Make slight wording changes prompted by content of
+ parallel section in our Texinfo manual.
+
+ * src/roff/groff/groff.1.man (Options/-a): Parallelize with
+ first sentence of corresponding material in our Texinfo
+ manual.
+
+ * src/roff/troff/troff.1.man (Options/-a): Parallelize with
+ our Texinfo manual.
+
+ Fixes the rest of
+ <https://savannah.gnu.org/bugs/?55278>.
+
+2020-06-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * man/groff_diff.7.man (Language/Long names): Fix error: groff
+ adds three new requests with short names, not two. List them in
+ an adjacent comment.
+
+2020-06-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-ext.tmac (.ME, .UE): Fix portability issue. While
+ widely supported, the \$* escape is not documented in CSTR #54.
+ If groff is not the typesetter, append macro arguments using
+ \$1, \$2, ..., \$9 instead.
+
+2020-05-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * man/groff.7.man (Numerical Expressions): Fix error: negative
+ expressions evaluate false, not true as was implied.
+ Parallelize descriptions with our Texinfo manual and
+ groff_diff(7) (in abbreviated form).
+
+2020-05-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Manipulating Filling and Adjusting): Fix error
+ in code sample: missing 'n' in number register interpolation.
+
+2020-05-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/preconv/tests/smoke-test.sh: Make BOM detection
+ override less hinky (i.e., use more normative input). Add tests
+ for all five detected BOMs.
+
+2020-05-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/env.cpp (space_size): Prevent assertion
+ failure. If an argument to the .ss request is negative, throw a
+ range warning and ignore it.
+ * src/roff/groff/tests/regression_savannah_58337.sh: Add test.
+ * src/roff/groff/groff.am (groff_TESTS): Run test.
+
+ Fixes https://savannah.gnu.org/bugs/?58337.
+
+2020-05-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Update documentation of .ss request.
+
+ * doc/groff.texi (Manipulating Filling and Adjusting): Rewrite
+ documentation of .ss request and \n[.ss] and \n[.sss] escapes.
+ Note that negative values are not permitted in either argument
+ to .ss. Use new terminology, "minimal inter-word spacing" and
+ "additional inter-sentence spacing" for clarity. Clarify that
+ additional inter-sentence spacing is only used when the output
+ line is not full when the end of a sentence occurs. Add index
+ nodes to help readers find discussion of details of spacing
+ between words and sentences. Move discussion of differences
+ from AT&T troff to section "Implementation Differences". Update
+ example to more closely resemble a real-world case, use second
+ argument to .ss request, and eliminate hackish use of .nop
+ request.
+
+ * man/groff_diff.7.man (New number registers): Recast in
+ parallel with the foregoing.
+
+ * man/groff.7.man (Read-only registers): Use new terminology and
+ describe \n[.ss] and \n[.sss] in meaningful terms, not by
+ reference to arguments to the .ss request (which wasn't even
+ accurate, because these registers have default values).
+
+ Fixes https://savannah.gnu.org/bugs/?54101.
+
+2020-05-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Undocument plans to support end-of-file GNU Emacs coding tags.
+
+ * src/preproc/preconv/preconv.cpp (check_coding_tag): Update
+ comments.
+ (detect_file_encoding): Alter debugging output so it's easier to
+ grep and verify Emacs coding tag detection.
+
+ * src/preproc/preconv/preconv.1.man (Bugs): Delete; its sole
+ concern was the absence of this feature.
+ (Usage): Document detection algorithm in more detail. Note
+ which detection methods don't work on unseekable input (pipes).
+ Offer recommendations for those struggling with encoding
+ detection.
+ (Usage/Coding Tags): Stop manipulating line adjustment. Use
+ hyphen-minus (\- escape) characters in coding tag names, since
+ they are literals that one might copy and paste. Stop
+ referencing XEmacs, whose development appears moribund.
+ (See Also): Add cross-references to iconv(3) and locale(7) man
+ pages.
+
+ * src/preproc/preconv/tests/smoke-test.sh: Test each of the
+ steps in the detection algorithm.
+ * src/preproc/preconv/preconv.am: Run test.
+ (preconv_TESTS): Add new variable.
+ (TESTS): Append $(preconv_TESTS).
+
+2020-05-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/afmtodit/afmtodit.pl: Format usage message with
+ full capitals for parameters, and break out -v option in a
+ separate "synopsis".
+
+2020-05-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/util/BuildFoundries.pl: Stop throwing away
+ diagnostics from afmtodit. This results in only one extra line
+ of build output:
+
+ both Upsilon1 and Upsilon map to *U at .../afmtodit line
+ 6413.
+
+2020-05-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Correct documentation of .pm request.
+
+ * man/groff.7.man (Requests/Request short reference): The .pm
+ request's classical behavior was described instead of groff's,
+ and omitted mention of strings and diversions; correct it.
+
+ * man/groff_diff.7.man (Implementation Differences): Document
+ this difference between AT&T troff and groff.
+
+ * doc/groff.texi (Debugging): Relocate description of .pm
+ behavioral difference...
+ (Implementation Differences): ...hither.
+
+2020-04-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/addftinfo/addftinfo.cpp (usage):
+ * src/utils/tfmtodit/tfmtodit.cpp (usage): Add "usage:" prefix
+ to messages documenting auxiliary modes of invoking the program.
+ The output doesn't look right without one, and it feels
+ dishonest to not document the relevant options (-v, --version)
+ disjunctively. I'm trying to strike a balance between the
+ ultra-terse BSD approach and the ultra-garrulous GNU one (see,
+ e.g., ls(1)). Likely both camps will be unhappy. :-/
+
+2020-04-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/tfmtodit/tfmtodit.cpp (read_map): Report invalid
+ character code from map file in diagnostic.
+ (main): Report invalid skew character position in diagnostic.
+ Explicitly report insufficient arguments in addition to usage
+ message. Lift invariant computed expressions out of loops (more
+ to shorten long lines than because I think the compiler won't
+ figure it out). Give content to "impossible assertion".
+ (tfm::load): Capitalize TFM initialism in diagnostics.
+ (usage): Use full capitals for parameters as is conventional.
+ Document disjunction of -v/--version flag from other
+ invocations.
+
+2020-04-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/addftinfo/addftinfo.cpp (usage): Add overloaded
+ version that accepts a constant string argument, which emits the
+ argument as a diagnostic and then calls usage().
+ (main): Add diagnostics to usage message where the problem is
+ clear. Add comment explaining why it sometimes isn't.
+ (usage): Refactor main usage message (which prints the summary)
+ to report the actual names of the accepted option arguments
+ instead of just "-param", which is not literally accepted.
+
+ Sort param_table alphabetically for use by the usage message.
+
+2020-04-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Delete groffer.
+
+ Per discussion on the groff development mailing list, there is
+ no desire to retain the maintenance of this portion of the groff
+ distribution.
+
+ See
+ <https://lists.gnu.org/archive/html/groff/2020-04/msg00051.html>
+ et seq.
+
+ * contrib/groffer: Recursively delete.
+
+ * Makefile.am:
+ * arch/mingw/mingw.am: Stop building groffer.
+
+ * m4/groff.m4 (GROFF_GROFFERDIR_DEFAULT):
+ (GROFF_GROFFERDIR_OPTION): Delete; remove "--with-grofferdir"
+ configuration option.
+ * configure.ac: Stop calling these macros.
+
+ * MANIFEST:
+ * NEWS:
+ * PROJECTS:
+ * TODO:
+ * contrib/chem/chem.1.man:
+ * contrib/chem/examples/122/README.txt:
+ * contrib/chem/examples/README.txt:
+ * contrib/glilypond/glilypond.1.man:
+ * contrib/gperl/gperl.1.man:
+ * contrib/gpinyin/gpinyin.1.man:
+ * contrib/groff_filenames/groff_filenames.5.man:
+ * man/groff_font.5.man:
+ * man/roff.7.man:
+ * src/roff/groff/groff.1.man:
+ * src/roff/grog/grog.1.man:
+ * src/utils/addftinfo/addftinfo.1.man:
+ * tmac/groff_trace.7.man: Delete references to groffer.
+
+2020-04-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/include/curtime.h: #include <time.h> if we're returning
+ a time_t from current_time().
+
+ * src/libs/libgroff/curtime.cpp (current_time): Quote
+ $SOURCE_DATE_EPOCH variable content in diagnostics produced due
+ to bad input since it's under user control and could have all
+ kinds of bogosity in it (like whitespace).
+
+2020-04-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * **/*.{man,tmac}: Save compatibility mode robustly.
+
+ Use new \n[.cp] register to save compatibility mode.
+
+ Use register names based on the filename (at the source
+ maintenance level) to avoid clobbering other files' saved
+ compatibility modes.
+
+ * tmac/html.tmac: Eliminate test of saved-compatibility
+ register by moving its body inside the block where compatibility
+ mode is off. This is the only part of this changeset that was
+ not automated.
+
+ Fixes <https://savannah.gnu.org/bugs/?58162>.
+
+2020-04-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Implement new read-only .cp register.
+
+ Within a .do request, \n[.cp] holds the saved value of
+ compatibility mode.
+
+ The register \n[.cp] is specialized and may require a statement
+ of rationale. When writing macro packages or documents that use
+ groff features and which may be mixed with other packages or
+ documents that do not—common scenarios include serial processing
+ of man pages or use of the .so or .mso requests—you may desire
+ correct operation regardless of compatibility mode in the
+ surrounding context. It may occur to you to save the existing
+ value of \n(.C into a register, say, _C, at the beginning of
+ your file, turn compatibility mode off with “.cp 0â€, then
+ restore it from that register at the end with “.cp \n(_Câ€. At
+ the same time, a modular design of a document or macro package
+ may lead you to multiple layers of inclusion. You cannot use
+ the same register name everywhere or you risk “clobbering†the
+ value from a preceding or enclosing context. The twoâ€character
+ register namespace of AT&T troff is confining and mnemonically
+ challenging; you may wish to use groff's more capacious
+ namespace. However, attempting “.nr _my_saved_C \n(.C†will not
+ work in compatibility mode; the register name is too long.
+ “This is exactly what .do is for,†you think, “.do nr
+ _my_saved_C \n(.Câ€. The foregoing will always save zero to your
+ register, because .do turns compatibility mode off while it
+ interprets its argument list. What you need is:
+ .do nr _my_saved_C \n[.cp]
+ .cp 0
+ at the beginning of your file, followed by
+ .cp \n[_my_saved_C]
+ at the end. As in the C language, we all have to share one big
+ namespace, so choose a register name that is unlikely to collide
+ with other uses.
+
+ * src/roff/troff/input.cpp (do_request, init_input_requests):
+ Implement it.
+
+ * doc/groff.texi:
+ * man/groff.7.man:
+ * man/groff_diff.7.man: Document it.
+
+ * src/roff/groff/tests/dot-cp_register_works.sh: Test it.
+ * src/roff/groff/groff.am (groff_TESTS): Run test.
+
+ Enables a fix for
+ <https://savannah.gnu.org/bugs/?58162>.
+
+ Thanks to John Gardner and Ingo Schwarze for the discussion.
+
+2020-04-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Implementation Differences):
+ * man/groff_diff.7.man (New requests): Rewrite description of
+ .do request, and replace example with a more illustrative one.
+
+ * man/groff.7.man (Request short reference): Rewrite description
+ of .do request briefly.
+
+2020-04-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Implementation Differences): Remove incorrect
+ claim. The .C register cannot be manipulated manually.
+
+2020-04-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/tests/smoke-test_html_device.sh: Simplify
+ charmap test.
+
+2020-04-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ It's too easy for the nroff version to get desynced from the
+ groff version when we're running test cases, leading to spurious
+ results. Make it easier to see a discrepancy.
+
+ * src/roff/nroff/nroff.sh: Call groff with -v or --version when
+ we are called that way. Let test cases tell us to use
+ test-groff as groff with an environment variable.
+
+ * src/roff/nroff/tests/verbose_option_works.sh.in: Rename to...
+ * src/roff/nroff/tests/verbose_option_works.sh: ...this. Check
+ the nroff version being tested against the groff version being
+ wrapped. This exposes a bug; the system groff rather than the
+ build tree groff was being invoked. Refactor. Stop messing
+ with @GROFF_BIN_PATH_SETUP@ (enabling the rename); instead, let
+ test-groff handle that for us. Locate it and export the
+ variable GROFF_TEST_GROFF so nroff can find it. Because we
+ manipulate $PATH to run the tests, the $PATH of an installed
+ groff system will _always_ differ from that used by a build
+ tree; ignore it in the test cases. Dispose of bashisms and set
+ shebang to /bin/sh.
+
+ * src/roff/nroff/nroff.am: Stop generating the above test
+ script. It can now be run as it ships.
+
+2020-04-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Make our assert() C99-conformant.
+
+ groff has its own implementation of the standard C library's
+ assert() macro. It hasn't been updated since C89. C99 requires
+ that the diagnostic emitted by assert() contain the failing
+ expression and name of the function in scope.
+
+ * src/include/assert.h: Add additional pointer to const char
+ arguments to do_assert() and assertion_failed() for function
+ name and stringified expression.
+ (assertion_failed): Update prototype.
+ (do_assert): Accept 'func' and 'msg' parameters and pass them to
+ assertion_failed().
+ (assert): Update macro to collect '__func__' and stringify the
+ expr parameter (as 'msg') and pass them do do_assert().
+ * src/libs/libgroff/assert.cpp (assertion_failed): Rewrite
+ diagnostic to more closely match GNU Coding Style format and
+ also report function and failing expression.
+
+ Example output:
+ troff: ../src/roff/troff/input.cpp:2644: do_request():
+ assertion failed: '0 == "But first, here's a rotten old
+ BBC programme."'
+
+ We have no excuse to assert(0) ever again. Express the
+ invariant that has been violated.
+
+2020-04-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/tests/smoke-test_html_device.sh: Set
+ LC_CTYPE=C.UTF-8 so that byte sequences in the pipelines are
+ handled correctly. Skip the test if the environment doesn't
+ support UTF-8. Thanks to Bjarni Ingi Gislason for the trouble
+ report.
+
+ Fixes <https://savannah.gnu.org/bugs/?58164>.
+
+2020-04-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/html.tmac: Use .do so we correctly load unicode.tmac in
+ compatibility mode.
+
+ Fixes the following problem (wrapped, filenames abbreviated):
+
+ $ echo | ./build/test-groff -C -Thtml >/dev/null
+ troff: backtrace: file '.../groff/build/../tmac/html.tmac':546
+ troff: backtrace: file '.../groff/build/../tmac/troffrc':30
+ troff: .../groff/build/../tmac/html.tmac:546: warning: macro
+ 'ms' not defined
+
+2020-04-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/tests/smoke-test_html_device.sh: Add test.
+ * src/roff/groff/groff.am (groff_TESTS): Run test.
+
+2020-04-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/tests/regression_savannah_58153.sh:
+ * src/roff/groff/tests/\
+ use_point_size_escape_with_single_digit_arg.sh: Use "set -e" to
+ ensure that multi-test script files don't hide problems. There
+ are arguments against "set -e" (and you can ask Greg Wooledge
+ for all of them), but I'm so used to it from years of writing
+ Debian package maintainer scripts that I feel comfortable with
+ it. It is less verbose than several alternatives (especially
+ having one test script per case).
+
+ * src/roff/groff/tests/string_case_xform_unicode_escape.sh:
+ Update with respect to new failure output (in a comment only,
+ since this is an XFAIL test).
+
+ * tmac/tests/an-old_AT_and_UC_footer_saved_and_restored.sh:
+ Drop unnecessary "|| exit 1" from end of script. Incidentally,
+ this script illustrates an alternative to "set -e".
+
+2020-04-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Rework documentation of .spreadwarn.
+
+ * doc/groff.texi (Debugging):
+ * man/groff.7.man (Request short reference):
+ * man/groff_diff.7.man (New requests): Recast description of
+ .spreadwarn request, some based on suggestions from Dave Kemper.
+ Make more prominent the fact that spreading only applies to
+ adjustment mode 'b'. Document warning type used.
+
+ Fixes half of Savannah #58035.
+
+2020-04-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Require Texinfo 5.0 (February 2013) at a minimum.
+
+ * m4/groff.m4 (GROFF_MAKEINFO): Check for version 5.0 (increased
+ from 4.8). Update diagnostics and comments.
+
+ * INSTALL.extra:
+ * README:
+ * doc/groff.texi:
+ * doc/webpage.ms: Document updated requirement.
+
+ * doc/fixinfo.sh: Delete; it is no longer necessary to work
+ around Texinfo 4.x bugs.
+
+ * doc/doc.am (EXTRA_DIST): Stop shipping fixinfo.sh.
+ (.texi.html): Remove makeinfo < 5.0 version check and consequent
+ execution of fixinfo.sh. Update comment.
+
+2020-04-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Enable backtracing across process/file boundaries when errors or
+ non-ignored warnings are encountered.
+
+ Experimentation reveals that .so, .mso, and .pso requests acted
+ as barriers to backtracing except when explicitly requested with
+ the .backtrace request. Judging by the git history, this
+ behavior dates back to June 1991 or earlier. The intention,
+ according to a source comment, was only to suppress the
+ backtrace output for the line corresponding to the outermost
+ level of the input stack (commonly, a file argument to groff).
+ Unfortunately, that wasn't its only effect.
+
+ This change does result in one additional line of output for
+ each error or (non-ignored) warning when -b is given. However,
+ I regard this as unobjectionable because {1} a backtrace was in
+ fact explicitly requested; and {2} it seems a poor tradeoff to
+ suppress most of the backtrace in some complicated and
+ frustrating cases for the sake of one fewer line of backtrace
+ output in a trivial one.
+
+ Now, backtracing behaves the same no matter what triggers it.
+
+ Fixes Savannah #58153.
+
+ * src/roff/troff/input.cpp (file_iterator::backtrace): Call
+ get_location() for its side effect of rewriting a filename of
+ "-" to "<standard input>", for consistency with other diagnostic
+ messages. (In this class, this member function always returns
+ 1, so ignore the return value. This fact is an essential part
+ of what led to the bug; the conditional
+ p && !p->get_location(0, &f, &n)
+ which appeared in the for loop of input_stack::backtrace() prior
+ to this change would always evaluate to false when a node of the
+ file_iterator class was encountered.)
+ (input_stack::backtrace): Replace member function body with that
+ of input_stack::backtrace_all().
+ (input_stack::backtrace_all): Delete.
+ (backtrace_request): Update the only call site of the above.
+
+ * src/roff/groff/tests/regression_savannah_58153.sh: Add test.
+ * src/roff/groff/groff.am (groff_TESTS): Run test.
+
+ * src/roff/groff/tests/string_case_xform_errors.sh: Update
+ regression test to not be confounded by additional line of
+ backtrace output. Remove bashism along the way.
+
+ * doc/groff.texi:
+ * man/groff.7.man:
+ * man/groff_diff.7.man: Update documentation.
+
+2020-04-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Reorganize backtrace output.
+
+ * src/roff/troff/input.cpp (string_iterator::backtrace):
+ Prefix the output with the program name if it is known. In a
+ deviation from the GNU Coding Standards, put the string
+ "backtrace:" immediately next instead of the file and line
+ number; this is because, particularly in cases where the
+ backtrace is most interesting or needed, it will produce
+ multiple lines of output and the common prefix aids visual
+ understanding.
+ (file_iterator::backtrace): As above; also, change prefix for
+ popened nodes in the iterator from "process" to "pipe". This
+ seemed preferable to omitting the information entirely or using
+ an inscrutable sigil like 'f' or 'p'. The advantage is that the
+ output is better aligned--better ergonomics for those who have
+ to cope with a lot of it. Furthermore, output the filename only
+ once.
+
+ Example of old and new output:
+
+ /tmp/inner:2: backtrace: file '/tmp/inner'
+ echo .so /tmp/inner:1: backtrace: process 'echo .so /tmp/inner'
+ /tmp/outer:1: backtrace: file '/tmp/outer'
+
+ troff: backtrace: file '/tmp/inner':2
+ troff: backtrace: pipe 'echo .so /tmp/inner':1
+ troff: backtrace: file '/tmp/outer':1
+
+2020-04-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (read_size): Add units to diagnostic.
+ This function works only with device-specific basic units
+ internally; users likely think in terms of point size, so add
+ the basic unit suffix "u" to offer a hint about what's going on.
+
+ Example:
+ $ groff -ww >/dev/null
+ \s[10]A\s[-12]B
+ troff: <standard input>:1: warning: point-size escape results in
+ non-positive size -2000u; set to 1u
+
+ On a PostScript device with 1000 basic units to the point, the
+ difference is important and would be confusing without the unit
+ indication.
+
+2020-04-08 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Correct and clarify point size documentation.
+
+ Our Texinfo manual has long documented the request '.ps 0' as
+ restoring the previous point size (just as '\s0' or '.ps' with
+ no argument does), but this is incorrect; since groff 1.02 or
+ earlier (June 1991), the request has not actually worked this
+ way. Instead, '.ps 0' sets the point size to 1 basic unit
+ {though output drivers may clamp this to a higher value}. This
+ behavior is consistent with AT&T troff, Hierloom Doctools troff
+ and, per Ingo Schwarze, Plan 9 troff. (It is, however, not
+ consistent with neatroff.)
+
+ * doc/groff.texi (Changing Type Sizes): Stop claiming that '.ps
+ 0' works like '\s0'. Note that the resulting (computed) point
+ size, not the argument, is clamped. Note that it is
+ non-positive, not negative, point sizes that are clamped to 1u.
+ Add (forward) cross-reference to section where \n[.ps] is
+ defined since it is mentioned here. Move explanation of special
+ handling of zero argument to \s escape description.
+
+ * man/groff.7.man (Request short reference): Explain .ps N
+ independently of \s. Note clamping behavior.
+
+2020-04-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (read_size): Correctly brace 'else'
+ block.
+
+ * src/roff/groff/tests/\
+ use_point_size_escape_with_single_digit_arg.sh:
+ Check that we get a diagnostic when relying on ambiguous form.
+
+2020-04-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp (read_size): Move special-case
+ interpretation of the '\sN' form of point-size escapes when 'N'
+ is 1, 2, or 3 to compatibility mode (groff -C) only, and throw
+ error diagnostic with suggestion for remedy if encountered.
+
+ Traditionally, '\s36A' is interpreted as "set point size to 36,
+ then emit 'A'". However, only values in the range 10-39 are
+ handled specially; '\s40A' is interpreted as a four-point "0A".
+ This is unlike anything else in *roff grammar; see \*, \$, \f,
+ \F, \g, \k, \m, \M, \n, \V, \Y, and \z.
+
+ To anticipate objections: Why not throw only a warning? Because
+ there isn't a warning category for supported but ambiguous
+ syntax (this behavior of AT&T troff dates back to the mid-1970s
+ but was not documented in the Troff User's Manual until 1992).
+ Why not throw the error outside of compatibility mode too?
+ Because outside of compatibility mode we (now) have an
+ unambiguous parse.
+
+ Background: The Graphic Systems C/A/T phototypesetter (the
+ original device target for AT&T troff) only supported a few
+ discrete point sizes in the range 6..36, so Ossanna
+ special-cased the parser to do what the user must have meant.
+ Kernighan warned of this in the 1992 revision of CSTR #54
+ {§2.3}, and more recently, McIlroy referred to it as a "living
+ fossil".
+
+ See:
+ https://lists.gnu.org/archive/html/groff/2020-03/msg00054.html
+ https://lists.gnu.org/archive/html/groff/2020-04/msg00002.html
+ https://lists.gnu.org/archive/html/groff/2020-04/msg00015.html
+ and follow-ups for discussion.
+
+ * NEWS: Advise users of behavior change and offer guidance.
+
+ * doc/groff.texi:
+ * man/groff.7.man: Document the restriction of special handling
+ of point-size arguments to '\s' to compatibility mode.
+
+ * src/roff/groff/tests/\
+ use_point_size_escape_with_single_digit_arg.sh: Add regression
+ test.
+ * src/roff/groff/groff.am (groff_TESTS): Run test.
+
+2020-04-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Improve point-size escape diagnostics.
+
+ * src/roff/troff/input.cpp (read_size): Disclose context
+ {point-size escape interpretation} in diagnostic messages. When
+ a "bad digit" is encountered, describe it if possible. When a
+ relative adjustment results in a negative point size, report the
+ computed value. Also rename a variable for slightly more
+ clarity ("bad" does not refer to all bad parses, just some cases
+ of bad digits), and update an insufficiently generalized comment
+ {"\s(00" is also an acceptable expression for point-size zero}.
+
+ Based on suggestions by Ingo Schwarze and Bjarni Ingi Gislason.
+
+2020-04-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Align diagnostic message format.
+
+ * src/libs/libgroff/error.cpp (do_error_with_file_and_line):
+ * src/roff/troff/input.cpp (do_error):
+ Display the diagnostic level when it is "error", instead of
+ leaving it implicit.
+
+ * src/roff/troff/input.cpp (error_with_file_and_line): Include
+ the program name in the diagnostic message if it is known.
+
+ * src/roff/groff/tests/string_case_xform_errors.sh: Update
+ diagnostic message expectation.
+
+2020-02-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi (Page Motions):
+ * man/groff.7.man (Single-character escapes): Document
+ non-breaking spaces as such.
+
+ Report and patch by Dave Kemper <saint.snit@gmail.com>.
+ Fixes <https://savannah.gnu.org/bugs/?55954>.
+
+2020-02-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ nroff: Implement -P and -V options.
+
+ * src/roff/nroff/nroff.sh: Recognize -P option (with argument)
+ and pass it through to groff. Recognize -V option; if given,
+ display constructed groff command instead of executing it.
+ Update usage message to document new options. Tidy up shell
+ style and indentation. Add comments.
+ * src/roff/nroff/nroff.1.man: Document new -P and -V options.
+ * src/roff/nroff/tests/verbose_option_works.sh.in: Test -V
+ option.
+ * src/roff/nroff/nroff.am: Generate test and run it.
+
+2020-02-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Stop ms macro package from manipulating warnings.
+
+ * tmac/s.tmac: Remove code block that attempted to enable all
+ warnings "only if none are given on the command line". It did
+ this by simply comparing the value of the warn register
+ {\n[.warn]} against the default value; but of course, a user
+ could specify -w options that exactly matched the default and
+ the test would not be able to tell, causing puzzling and
+ undesired behavior. Furthermore, the hard-coded default was out
+ of date and did not correspond to recent releases of groff. If
+ you want all warnings on, use the ".warn" request with no
+ arguments in your ms document or pass "-w w" to groff (see
+ troff(1) or our Texinfo manual for more on warnings).
+
+ Thanks to Bjarni Ingi Gislason for bringing this issue to our
+ attention.
+
+ Resolves <https://savannah.gnu.org/bugs/?57583>.
+
+2020-01-21 George HELFFRICH <ghfbsd@gmail.com>
+
+ [me]: Fix regression of '.nm' (#57638).
+
+ * tmac/e.tmac-u (nm): Use saved point size and font position
+ for line numbering only if those registers exist.
+
+ Fixes <https://savannah.gnu.org/bugs/?57638>.
+
+2020-01-18 Ingo Schwarze <schwarze@openbsd.org>
+
+ Accept any number of arguments for .Dd in the groff_mdoc(7)
+ macros.
+
+ * tmac/doc-common-u: The .Dd macro behaved in a weird way:
+ Without arguments, it printed the string "Epoch".
+ With one, two, four, or more arguments, it ignored all arguments
+ and used the current date instead.
+ Only for exactly three arguments, it printed the arguments.
+ None of this made sense. Giving the date as "Epoch" is
+ absurd, and printing the current date is just misleading:
+ why should a document be considered up-to-date when the author
+ did not even bother to state the date of the last change?
+ Admittedly, the behaviour for 0 and 4 or more arguments
+ already appeared 4.3BSD-Reno, and the behaviour for 2 or 3
+ arguments in 4.4BSD. But it was already wrong even in those
+ days: several manual pages in 4.4BSD gave .Dd a single, quoted
+ argument, e.g. .Dd "June 9, 1993": cap_mkdb(1), id(1), sed(1),
+ err(3), getcap(3), sysctl(3), amd(8), disklabel(8), and others.
+ Consequently, simply print all the arguments, no matter how
+ many there are.
+
+ This bug was found by Jonathan Gray <jsg@openbsd.org>
+ while he looked at 4.xBSD manual pages.
+
+2020-01-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi: Document initial empty set membership of
+ characters with cflags values of 128, 256, or 512 in parallel
+ with preceding paragraphs regarding smaller powers of two.
+
+ Report and patch by Dave Kemper <saint.snit@gmail.com>.
+ Fixes <https://savannah.gnu.org/bugs/?57549>.
+
+2020-01-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/tests/*.sh: Rename some tests so their
+ filenames are more self-descriptive.
+ * src/roff/groff/groff.am (groff_TESTS): Update.
+
+2020-01-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/groff/tests/transparent_end-of-sentence_chars.sh: Add
+ test for end-of-sentence recognition.
+ * src/roff/groff/groff.am (groff_TESTS): Run test.
+
+2020-01-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp: Mark \[dd] character (double dagger)
+ as transparent for purposes of end-of-sentence recognition.
+
+ * doc/groff.texi (Sentences):
+ * man/groff_diff.7.man (New requests/.cflags): Document this.
+
+ Report and patch by Dave Kemper <saint.snit@gmail.com>.
+ Fixes <https://savannah.gnu.org/bugs/?57546>.
+
+2020-01-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/refer/refer.1.man (See Also):
+ * src/utils/indxbib/indxbib.1.man (See Also):
+ * src/utils/lkbib/lkbib.1.man (See Also):
+ * src/utils/lookbib/lookbib.1.man (See Also): Add bibliographic
+ reference to the original Bell Labs "refer" paper by Mike Lesk.
+
+2020-01-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/an-old_AT_and_UC_footer_saved_and_restored.sh: Add
+ regression test for Ingo's change below.
+
+2020-01-16 Ingo Schwarze <schwarze@openbsd.org>
+
+ Repair .AT and .UC in the groff_man(7) macros.
+
+ * tmac/an-old.tmac: Setting user-defined strings in a macro that
+ will later be called indirectly from page location traps is
+ excessively complicated. Besides, the implementation doesn't
+ work: when the trap is finally sprung, the defaults from the
+ an-init macro clobber what the author specified with .AT or .UC.
+ Instead, all that is needed is setting the strings for the
+ header before triggering the page break, such that they appear
+ right away, while setting the strings for the footer after the
+ page break, such that they don't appear on the previous page.
+
+ This bug was found by Jonathan Gray <jsg@openbsd.org> while he
+ looked at 4.xBSD manual pages.
+
+2020-01-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/groff_man.7.man (Document structure macros/.SH): Fix
+ errors in footer description.
+
+2020-01-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/tests/an-old_CS_register_on.sh: Tweak flags; all the
+ other tests in this group pass "-Tascii -P-cbou" instead of
+ "-Tutf8". (This is so that output is easy to grep from a shell
+ script.) Bring this test into line. Does not regress anything.
+
+2019-12-30 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Certain pdfmark destination names caused gropdf to fail.
+
+ * src/devices/gropdf/gropdf.pl: Look for pdfmark types, (i.e.
+ DEST, OUT, ANN), only preceding 'pdfmark' at end of line, not
+ anywhere else.
+
+2019-12-30 Ingo Schwarze <schwarze@openbsd.org>
+
+ Correct output of sprintf("%%") in pic(1).
+
+ * src/preproc/pic/pic.ypp: Print "%" rather than "%%".
+
+ Bug reported by Doug McIlroy <doug at cs dot dartmouth dot edu>.
+ Patch using feedback from Larry McVoy <lm at mcvoy dot com>.
+
+2019-12-29 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Update man page of gropdf to document \X calls.
+
+ * src/devices/gropdf/gropdf.1.man: The calls 'pagename' and
+ 'switchtopage' (used by mom to relocate TOC) are documented,
+ together with their convenience commands '.pdfpagename' and
+ '.pdfswitchtopage'.
+
+2019-12-29 Ingo Schwarze <schwarze@openbsd.org>
+
+ Improve documentation of pic(1) regarding printf.
+
+ * src/preproc/pic/pic.1.man:
+ Document which conversion specifications are supported.
+ * doc/pic.ms:
+ Correct the list of supported conversion specifications.
+
+2019-12-21 Ingo Schwarze <schwarze@openbsd.org>
+
+ Update NetBSD, OpenBSD, FreeBSD, Darwin, and DragonFly version
+ strings.
+
+ * tmac/doc-common-u: Update.
+ * tmac/groff_mdoc.7.man: Synchronize.
+
+ Based on a patch from Guillem Jover <guillem@debian.org>
+ via Colin Watson <cjwatson@debian.org>, tweaked by me.
+ Fixes: https://bugs.debian.org/867123
+
+2019-09-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Use a vertical spacing of 1v between paragraphs in man page
+ examples. This looks better (on typesetter devices like
+ PostScript and PDF) with the Courier font family also used in
+ examples. Typewriter devices (like the terminal) already used
+ an inter-paragraph spacing of 1v.
+
+ * tmac/an-ext.tmac (EX): Save the value of the PD number
+ register (inter-paragraph distance), and set it to 1v.
+ (EE): Restore previous value of the PD register.
+
+2019-09-21 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Changes to allow configure to check for URW fonts
+
+ * font/devpdf/util/BuildFoundries.pl: Call the program with
+ --dirURW with path provided to ./configure, and --check to do
+ a dry-run just checking if the fonts are available. (bug #56748)
+
+2019-09-21 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Add new ghostscript font names (bug #56748)
+
+ * font/devpdf/Foundry.in: Add changed font names
+
+2019-09-21 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Prevent gropdf executing arbitrary commands
+
+ * src/devices/gropdf/gropdf.pl: See bug #55557
+
+2019-09-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac: Move test for definitions of CS and CT
+ registers to after man.local is sourced; this way we can both
+ respect any setting of those registers in that file (which is
+ intended for customization by the site administrator) and ensure
+ that the registers are defined when dereferenced later.
+
+2019-09-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * **/*.man: Put section headings in title case.
+
+2019-09-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp: Lift invariant out of loop.
+
+2019-09-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/refer/refer.1.man: Add mention of man and mm
+ packages as supporting the "refer" preprocessor (GNU mm grew
+ this support back in groff 1.22.1).
+
+2019-09-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Mark expected-to-fail test as XFAIL.
+
+ Automake supports XFAIL and XPASS, so actually use the
+ infrastructure as intended.
+
+ * Makefile.am: Declare XFAIL_TESTS variable.
+ * src/roff/groff/groff.am (groff_XFAIL_TESTS): Add
+ string_case_xform_unicode_escape.sh.
+ * src/roff/groff/tests/string_case_xform_unicode_escape.sh: Set
+ the expected output to what it would be if string case
+ transforms worked on groff Unicode escapes.
+
+2019-09-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Retire '@G@' build system macro.
+
+ It existed only for forcibly-capitalized man page titles; it was
+ the uppercase-transformed counterpart of @g@.
+
+ * Makefile.am: Delete sed transformation of @G@.
+ * src/preproc/tbl/tbl.1.man: Replace '@G@EQN' in section heading
+ with '@g@eqn'.
+
+2019-09-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * **/*.man: Downcase man page titles, except for glilypond and
+ roff2*, which did not require it.
+
+ Here's a sed script for the aid of those who have a corpus of
+ man pages to migrate.
+
+ # Downcase man page titles.
+ #
+ # Use the first line to skip any .TH lines that require
+ # special handling, perhaps because the name of the
+ # command gets externally macro-expanded. In groff, the
+ # "roff2.1.man" page is an example.
+ #
+ # This script operates _only_ on .TH lines.
+ #
+ # usage: sed -i -f this_script.sed your_man_page.1 ...
+ /@ROFF2MODE@/b
+ /^\.\s*TH/{
+ h
+ s/^\.\s*TH \+\([^ ]\+\) .*/\1/
+ y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+ G
+ s/\([^ ]\+\)\n\(^\.\s*TH \+\)[^ ]\+\( .*\)/\2\1\3/
+ }
+
+2019-09-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ The an (man) macro package supports new CS and CT number
+ registers to control rendering of man page section headings and
+ titles, respectively, in full capitals. These default off (with
+ no visible effect on pages which already fully capitalize these
+ strings in man page sources). The rationale is to encourage man
+ page authors to preserve case distinction information in (or
+ restore it to) their titles and section headings, while giving
+ users (including system administrators, distributors,
+ integrators, and maintainers of man(1) implementations) a way to
+ view the rendered page elements in full capitals if desired.
+
+ * tmac/an-old.tmac (TH/an-init): If number register CT is
+ defined and nonzero, call .stringup on \*[an-title].
+ (SH): Store macro argument list to \*[an-section-heading]. If
+ number register CS is defined and nonzero, call .stringup on it.
+ * tmac/groff_man.7.man (OPTIONS): Document the CS and CT number
+ registers.
+ * tmac/tests/an-old_CS_register_off.sh:
+ * tmac/tests/an-old_CS_register_on.sh:
+ * tmac/tests/an-old_CS_register_unspecified.sh:
+ * tmac/tests/an-old_CT_register_off.sh:
+ * tmac/tests/an-old_CT_register_on.sh:
+ * tmac/tests/an-old_CT_register_unspecified.sh: Add tests.
+ * tmac/tmac.am (tmac_TESTS): Run tests.
+
+2019-09-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Add regression test to check behavior of case transformation
+ request on a string containing a Unicode character escape.
+ Right now, this is not supported, so it is an XFAIL test in the
+ parlance of DejaGNU/POSIX 1003.3.
+
+ * src/roff/groff/tests/string_case_xform_unicode_escape.sh: New
+ test.
+ * src/roff/groff/groff.am (groff_TESTS): Run test.
+
+2019-09-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Implement .stringdown and .stringup requests.
+
+ * src/roff/troff/input.cpp: Add .stringdown and .stringup
+ requests.
+ * doc/groff.texi: Document them, including example.
+ * man/groff_diff.7.man: Same.
+ * man/groff.7.man: Document them briefly.
+
+2019-09-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Regression-test string case transform feature.
+
+ * src/roff/groff/tests/string_case_xform_errors.sh: New test.
+ * src/roff/groff/tests/string_case_xform_requests.sh: New test.
+ * src/roff/groff/groff.am (groff_TESTS): Run tests.
+
+2019-06-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/devices/grotty/grotty.1.man (Options/-i): Note support of
+ recent versions of xterm for italic (oblique) styles.
+
+ Fixes part of <https://savannah.gnu.org/bugs/?55278>.
+
+2019-06-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ devlatin1: Map \(oq to ' on output.
+
+ * font/devlatin1/R.proto: Render the output glyph \[oq]
+ {opening quote} as 0x27 (apostrophe) instead of 0x60 (grave
+ accent). A grave accent is just flat wrong for the Latin-1
+ character set, a.k.a. ISO 8859-1. The defining document ECMA-94
+ {June 1986} is freely available for perusal. The ECMA-94 Latin
+ character sets do not define any glyphs for directional
+ {"typographer's"} quotation marks, but the apostrophe is
+ depicted as a neutral (vertical) glyph, whereas the grave accent
+ 0x60 and acute accent 0xB4 are mirror-symmetric diacritical
+ marks.
+
+ Note that this change has no effect on _input_ conventions for
+ roff source documents. You can still get directional single
+ quotes on UTF-8, PostScript, PDF, and other output devices
+ supporting them by typing sequences like `this' in the input
+ {character remapping with ".char" requests and similar
+ notwithstanding}.
+
+ Patch and idea from Ingo Schwarze, who originally proposed it
+ for ASCII as well, and included Latin-1 for parallelism.
+ The groff developers could reach no consensus about the wisdom
+ of such a change for ASCII (which was designed to support
+ ambiguity for some code points, requiring the development of
+ supplementary interpretation conventions between parties).
+ ECMA-94/ISO-8859 is more strongly prescriptive.
+
+ See https://savannah.gnu.org/bugs/?55616 and the groff mailing
+ list archives for 31 January to 23 February 2019 at
+ https://lists.gnu.org/archive/html/groff for lengthy discussion.
+
+ * src/roff/groff/tests/on-latin1-device-oq-is-0x27.sh: Check for
+ correct output glyph.
+
+ * src/roff/groff/groff.am: Add test.
+
+2019-06-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/unicode.tmac: Save and restore compatibility mode since
+ the script uses a GNU extension (.char).
+
+2019-06-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ libdriver: Fix SEGV (Savannah #56555).
+
+ * src/libs/libdriver/printer.cpp: Check result of
+ set_char_and_width() for error condition before relying on it.
+
+ * src/roff/groff/tests/regression-56555.sh: Provoke segfault
+ with five bytes of input using transparent line indicator.
+
+ * src/roff/groff/groff.am: Add test.
+
+ Fixes <https://savannah.gnu.org/bugs/?55278>.
+
+2019-01-12 Ingo Schwarze <schwarze@openbsd.org>
+
+ Correctly handle groff_mdoc(7) .Lk arguments starting with a
+ dot.
+
+ * tmac/doc.tmac-u: Each argument to the .Lk macro is printed
+ on its own roff input line. If it happens to start with a dot
+ or apostroph, it was misinterpreted as a request or macro.
+ Force it to be treated as text by adding "\&" in front of it.
+
+2018-12-31 Ingo Schwarze <schwarze@openbsd.org>
+
+ * man/groff_diff.7.man: remove two stray .RE macros
+
+
+________________________________________________________________________
+
+##### License
+
+Copyright 2018-2021 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+
+##### Editor settings
+Local Variables:
+fill-column: 72
+mode: change-log
+version-control: never
+End:
+vim:set autoindent textwidth=72:
diff --git a/ChangeLog.115 b/ChangeLog.115
new file mode 100644
index 0000000..6f8b17b
--- /dev/null
+++ b/ChangeLog.115
@@ -0,0 +1,6156 @@
+
+Version 1.15 released
+=====================
+
+1999-12-28 Werner LEMBERG <wl@gnu.org>
+
+ * NEWS, VERSION: Changed to 1.15
+
+1999-12-27 Paul Eggert <eggert@twinsun.com>
+
+ * 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 <wl@gnu.org>
+
+ * NEWS, VERSION: Changed to 1.14.
+
+1999-12-24 Werner LEMBERG <wl@gnu.org>
+
+ * refer/refer.cc: Fixing the last fix.
+
+Version 1.13 released
+=====================
+
+1999-12-23 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * VERSION: Changed to 1.12.1.
+
+1999-12-22 Alan Rooks <arooks@istar.ca>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * Makefile.in: Doc fixes.
+
+1999-12-17 Fabrizio Polacco <fab@prosa.it>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * doc/groff.texinfo: Regenerated nodes and menus with emacs.
+
+ * doc/Makefile (clean): Added cleaning commands for groff.texinfo.
+
+1999-12-06 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * tmac/tmac.html: Small changes.
+
+1999-09-26 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Minor fixes.
+
+1999-09-26 Gaius Mulley <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ * doc/groff.texinfo (Common Features): Added Copying chapter.
+ Changed format to @smallbook.
+
+1999-09-15 Werner LEMBERG <wl@gnu.org>
+
+ * NEWS: Added info about groff.texinfo.
+
+ * doc/groff.texinfo: Will now compile (using texi2dvi) without
+ warning messages.
+
+1999-09-14 Werner LEMBERG <wl@gnu.org>
+
+ * groff/groff.man: More updates.
+
+1999-09-13 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: New file. This manual is still very
+ rudimentary. It has been originally contributed by Trent
+ A. Fisher <trent@gnurd.portland.or.us> 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 <bjarniig@rhi.hi.is>
+
+ * 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 <jeff@opennt.com>
+
+ * grolj4/lj4.cc: Added duplex printing (option `-d').
+
+ * grolj4/grolj4.man: Document duplex printing.
+
+1999-09-12 Werner LEMBERG <wl@gnu.org>
+
+ * 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
+ <sgk@debian.org>.
+
+ * 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 <gaius@glam.ac.uk>
+
+ 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 <wsanchez@apple.com>
+
+ * tmac/doc-common, tmac/tmac.an: Removed the word `UNIX' in
+ default strings.
+
+1999-09-11 Luke Mewburn <lukem@netbsd.org>
+
+ * libgroff/string.cc (search): Small fix to test against NULL
+ pointer.
+
+1999-09-11 Jeff Conrad <jeff_conrad@msn.com>
+
+ * 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 <peterm@jna.com.au>
+
+ * 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 <larry.jones@sdrc.com>
+
+ * tbl/main.cc (process_options): Unix (at least Documenter's
+ Workbench) tbl allows arbitrary non-alpha characters between
+ options.
+
+1999-09-11 Paul Eggert <eggert@twinsun.com>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * Makefile.sub (DISTCLEANFILES): Added `config.log' and
+ `config.cache'.
+
+ * Removed configure.old.
+
+1999-08-31 Werner LEMBERG <wl@gnu.org>
+
+ * VERSION: Updated to 1.11.1
+
+1999-05-27 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <esr@snark.thyrsus.com>
+
+ * 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 <jjc@jclark.com>
+
+ * Version 1.10 released.
+
+Fri Nov 24 09:56:16 1995 James Clark <jjc@jclark.com>
+
+ * afmtodit/afmtodit.pl: Avoid comment on first line.
+
+Mon Nov 20 11:13:49 1995 James Clark <jjc@jclark.com>
+
+ * 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 <jjc@jclark.com>
+
+ * grog/grog.sh: Use print "" rather than print in END rule.
+
+Wed Aug 23 13:30:52 1995 James Clark <jjc@jclark.com>
+
+ * 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 <jjc@jclark.com>
+
+ * 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 <jjc@jclark.com>
+
+ * troff/env.cc (hyphenate): Loop over all consecutive sequences
+ of non-zero hyphenation codes.
+
+Sat Jul 1 00:42:15 1995 James Clark <jjc@jclark.com>
+
+ * aclocal.m4 (GROFF_POSIX): Use conflicting declaration technique.
+
+Thu Jun 29 13:58:36 1995 James Clark <jjc@jclark.com>
+
+ * tmac/tmac.e (ip): Divert the tag so as to freeze the spaces.
+
+Tue Jun 27 12:30:16 1995 James Clark <jjc@jclark.com>
+
+ * 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 <jjc@jclark.com>
+
+ * tbl/main.cc (main): Ignore -T option.
+
+Thu Jun 22 09:08:06 1995 James Clark <jjc@jclark.com>
+
+ * 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 <jjc@jclark.com>
+
+ * 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 <jjc@jclark.com>
+
+ * troff/input.cc (interpolate_macro): Rephrase missing space
+ warning.
+
+Thu May 11 01:07:16 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * 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 <jjc@jclark.com>
+
+ * 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 <jjc@jclark.com>
+
+ * 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 <jjc@jclark.com>
+
+ * tmac/tmac.pspic: Immediately remove the temporary file.
+
+Sat Mar 25 10:43:11 1995 James Clark <jjc@jclark.com>
+
+ * tmac/tmac.pspic (PSPIC): Scale graphic uniformly even when
+ height is specified.
+
+Thu Jan 26 16:20:13 1995 James Clark <jjc@jclark.com>
+
+ * 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 <jjc@jclark.com>
+
+ * 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 <jjc@jclark.com>
+
+ * 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 <jjc@jclark.com>
+
+ * troff/node.cc (kern_pair_node::vertical_extent): New function.
+
+Sun Dec 4 13:19:07 1994 James Clark <jjc@jclark.com>
+
+ * 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 <jjc@jclark.com>
+
+ * 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 <fcntl.h> only if not using <osfcn.h>.
+
+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 <osfcn.h> 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): Similarly.
+
+ * 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 <time.h>.
+
+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 <ctype.h> 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 <unistd.h> 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 <stdlib.h> is STDLIB_H_DECLARES_GETOPT is
+ defined; otherwise include <sys/types.h> and <unistd.h> 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. Transparently 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 check 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 necessary.
+ (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 <sys/dir.h> only if <dirent.h>
+ 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 <osfcn.h>. Instead
+ check that we can link a call to a function declared in <stdio.h>.
+ (GROFF_UNISTD_H): New macro.
+ * configure.in: Call it.
+ * Makefile.in: Document it.
+ * include/posix.h: New file.
+ * troff/troff.h: Don't include <osfcn.h>
+ * 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 <sys/types.h>, <sys/stat.h>, <osfcn.h>,
+ <fcntl.h>.
+ * 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 <osfcn.h>.
+
+ * 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 <fcntl.h>.
+ (O_RDONLY): Define if necessary.
+ (make_index_search_item, index_search_item_iterator::get_tag,
+ index_search_item::check_files): Use O_RDONLY.
+ * libbib/search.cc: Include <fcntl.h>, <sys/types.h>, <sys/stat.h>.
+ (O_RDONLY): Define if necessary.
+ (search_list::add_file): Use O_RDONLY.
+ * indxbib/indxbib.cc: Include <fcntl.h>, <sys/types.h>,
+ <sys/stat.h>.
+ (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 <errno.h>.
+
+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 <limits.h> 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 <file' correctly.
+
+ * troff/input.cc (input_stack::push): Improve error message when
+ input stack limit exceeded.
+
+Fri Aug 7 13:08:16 1992 James Clark (jjc at jclark)
+
+ * refer/refer.cc (main): Fix typo in handling of `a' option.
+
+ * refer/refer.cc (do_bib): In state START after a newline remain
+ in state START.
+
+ * groff/groff.sh: Deleted.
+ * groff/Makefile.sub: Delete handling of groff.sh.
+
+ * pic/troff.cc (troff_output::text): Test \n(0p rather than \*(.T
+ to determine whether to use \X'ps:...'.
+ * tmac/troffrc: Set 0p register to 0.
+ * tmac/tmac.ps: Set 0p register to 1.
+
+ * groff/groff.cc: Support -X option. Give warning for -TXps and
+ transform to -X -Tps. Pass troff a -r.X=1 option if -X is used.
+ * tmac/troffrc: Support -r.X=1.
+
+ * pic/troff.cc (troff_output::dot): Don't test
+ zero_length_line_flag.
+
+Thu Aug 6 13:32:08 1992 James Clark (jjc at jclark)
+
+ * include/lib.h: Declare getopt() and friends unless
+ STDLIB_H_DECLARES_GETOPT is defined.
+
+ * doc/chars.tr: Delete.
+ * man/groff_char.man: New file.
+
+Wed Aug 5 00:38:58 1992 James Clark (jjc at jclark)
+
+ * tmac/tmac.e (np, bu): Test \n($p with string expression in case
+ user has changed register format.
+
+Mon Aug 3 11:22:18 1992 James Clark (jjc at jclark)
+
+ * groff/groff.cc: Get rid of device_table. Get postprocessor from
+ `postpro' command in DESC file. Get spooler command from `print'
+ command in DESC file. Execute spooler command with /bin/sh.
+
+ * groff/groff.cc: Split Unix-specific parts into...
+ * groff/pipeline.c: New file.
+
+ * LICENSE: Delete.
+ * COPYING: New file.
+ * all files: Update copyright notices.
+
+ * Rearrange files. Redo Makefiles. Use autoconf.
+
+Sat Aug 1 09:36:50 1992 James Clark (jjc at jclark)
+
+ * troff/input.c (charinfo_to_node_list): Interpret character
+ definition with escape_char of `\'.
+
+Tue Jul 28 12:20:12 1992 James Clark (jjc at jclark)
+
+ * lib/strerror.c, lib/iftoa.c, lib/itoa.c: Don't include lib.h.
+ Define INT_DIGITS as big enough for 64-bit integer.
+ * lib/strtol.c: Don't include lib.h.
+ * lib/lib.h: Delete ifdef __cplusplus stuff.
+
+Mon Jul 27 11:08:50 1992 James Clark (jjc at jclark)
+
+ * ps/devps/Makefile: Add DESC to DEVICEFILES. Separate out rule
+ for making DESC. Make $(FONTS) depend on DESC. afmtodit should
+ get DESC from current directory.
+
+Sun Jul 26 15:38:26 1992 James Clark (jjc at jclark)
+
+ * tbl/main.c (main): Always reset the line number when reading
+ from stdin.
+
+ * tbl/table.c (table::print_single_hline, table::print_double_hline,
+ table::define_bottom_macro, table::do_row, table::do_top): Round
+ vertical spacing up to vertical resolution.
+
+Fri Jul 24 14:32:07 1992 James Clark (jjc at jclark)
+
+ * ps/ps.h (enum resource_type): Avoid comma at end of
+ enumerator-list.
+ * dvi/dvi.c (class dvi_printer): Likewise.
+ * dvi/tfmtodit.c (gf::load): Likewise.
+ * refer/label.y (struct expression): Likewise.
+ * refer/refer.c (class label_processing_state): Likewise.
+ * refer/indxbib.c (do_file): Likewise.
+ * troff/troff.c (enum warning_type): Likewise.
+ * tbl/main.c (process_data): Likewise.
+ * troff/charinfo.h (class charinfo):
+
+Wed Jul 22 09:17:58 1992 James Clark (jjc at jclark)
+
+ * dvi/devdvi/textt.map: Add entry for `-'. Regenerate fonts.
+
+Tue Jul 21 11:39:26 1992 James Clark (jjc at jclark)
+
+ * groff.c: Move to new groff subdirectory.
+ * groff/Makefile: New file.
+ * Makefile: Remove handling of groff.c. Add groff to SUBDIRS.
+
+ * man/mdate.sh: Use ls -L if supported.
+
+ * Consolidate all header files produced by gendef into lib/defs.h.
+ * lib/macropath.c, lib/fontfile.c, lib/device.c: Include defs.h.
+ Don't include path.h.
+ * lib/Makefile (path.h): Don't generate.
+ * troff/input.c: Include defs.h. Don't include config.h.
+ * troff/Makefile (config.h): Don't generate.
+ * refer/index.h: Don't include suffix.h.
+ * refer/index.c: Include defs.h.
+ * refer/indxbib.c: Include defs.h.
+ * refer/refer.h, refer/lkbib.h: Don't include path.h. Include
+ defs.h.
+ * refer/Makefile (suffix.h, path.h): Don't generate.
+ * groff.c: Don't include config.h. Include defs.h.
+ * Makefile (config.h): Don't generate.
+ (lib/defs.h): Generate.
+ (topclean): Remove lib/defs.h.
+
+Mon Jul 20 10:12:57 1992 James Clark (jjc at jclark)
+
+ * lib/malloc.c, lib/getpagesize.h: Deleted.
+ * Makefile: Add COOKIE_BUG configuration option. Delete malloc
+ related stuff.
+ * lib/Makefile: Delete malloc-related stuff.
+ * lib/new.c: Workaround COOKIE_BUG if necessary.
+
+ * refer/lkbib.c, refer/indxbib.c: Don't include refer.h. Include
+ needed header files directly.
+ * refer/refer.h: Omit definition of DEFAULT_INDEX.
+ * Makefile: Include definition of DEFAULT_INDEX in path.h.
+
+Sun Jul 19 10:19:22 1992 James Clark (jjc at jclark)
+
+ * lib/font.c (FONT_COMMAND_HANDLER): Pass command name and single
+ argument.
+ * lib/font (font::load_desc, font::load): Don't split argument of
+ unknown command.
+ (font::handle_unknown_font_command): Change type.
+ * ps/ps.c (ps_font::handle_unknown_font_command,
+ handle_unknown_desc_command): Change type.
+ * dvi/dvi.c (dvi_font::handle_unknown_font_command): Change type.
+
+Fri Jul 17 11:12:49 1992 James Clark (jjc at jclark)
+
+ * lib/font.h (font::handle_unknown_font_command): Add file and
+ line arguments.
+ * lib/font.c (font::handle_unknown_font_command):
+ * ps/ps.c (ps_font::handle_unknown_font_command):
+ * dvi/dvi.c (dvi_font::handle_unknown_font_command): Add file and
+ lineno arguments. Use _with_file_and_line functions for error
+ reporting.
+
+ * lib/fontfile.c (font::unknown_desc_command_handler): New static
+ data member.
+ * lib/font.c (font::set_unknown_desc_command_handler): New
+ function.
+ (font::load_desc): For unknown commands, call
+ unknown_desc_command_handler if not null.
+ * lib/font.h (class font): Declare them.
+ (FONT_COMMAND_HANDLER): New typedef.
+ * ps/ps.c (handle_unknown_desc_command): New function.
+ (main): Set bflag if we had a -b option. Call
+ font::set_unknown_desc_command_handler.
+ (broken.h): Don't include.
+ * ps/Makefile: No need for broken.h. Pass BROKEN_SPOOLER_FLAGS to
+ submake
+ * ps/devps/Makefile: Add `broken' command to DESC file using
+ BROKEN_SPOOLER_FLAGS.
+
+ * macros/tmac.e ([, ]): Add as synonyms for { and }.
+
+ * macros/tmac.e ($p): Only exdent if \$3 > 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 <unistd.h> 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 _ character 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 <osfcn.h>.
+
+ * lib/strtol.c, lib/getcwd.c, ps/psbb.c: Declare errno in case
+ <errno.h> 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 <errno.h>.
+
+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 functions 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
+ <sys/types.h>.
+
+ * 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 <errno.h>.
+
+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 MS-DOS 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 <stdio.h>.
+ * 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 <errno.h>.
+
+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 <sys/dir.h> if HAVE_SYS_DIR_H is defined.
+ Delete second inclusion of <sys/param.h>.
+
+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 possibility 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 definition 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 invalid 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 families. 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 <osfcn.h>.
+
+ * 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: Similarly.
+ * 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 unsuccessful
+ 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. Similarly 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, invalid 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): Similarly.
+
+ * 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): Similarly.
+
+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 invalid 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: Similarly.
+
+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: Similarly.
+ * lib/fmod.c: Remove #ifdef NEED_FMOD.
+
+ * Makefile: Rename OPTIMISE to OPTIMIZE.
+
+ * groff.sh: Remove assignment to PATH.
+ * Makefile: Remove SHPATH variable.
+ * Makefile.bd: Similarly.
+
+ * 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 similarly 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): Similarly.
+ (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): Similarly.
+
+ * 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 encountered 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): Similarly.
+ * 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): Similarly.
+ * 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.
+
+Copyright 1990-1999 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+Local Variables:
+fill-column: 72
+mode: change-log
+version-control: never
+End:
+vim:set autoindent textwidth=72:
diff --git a/ChangeLog.116 b/ChangeLog.116
new file mode 100644
index 0000000..85f26b7
--- /dev/null
+++ b/ChangeLog.116
@@ -0,0 +1,1397 @@
+
+Version 1.16.1 released
+=======================
+
+2000-07-31 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * doc/texinfo.tex: Update to latest version.
+
+2000-06-28 Paul Eggert <eggert@twinsun.com>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <eliz@is.elta.co.il>
+
+ * 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 <eliz@is.elta.co.il>
+
+ * 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 <unistd.h>.
+ (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 <gqueri@mail.dotcom.fr>
+
+ 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ú <pandres@dragonet.es>
+
+ * src/devices/grolbp/lbp.h: Removed unused variables.
+
+2000-05-31 Keith Thompson <kst@sdsc.edu>
+
+ * src/devices/grolbp/lbp.cc (set_papersizes): Add declaration of
+ strncasecmp().
+
+2000-05-31 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <Andrej.Borsenkow@mow.siemens.ru>
+
+ * src/preproc/grn/Makefile.sub: Add MLIB.
+
+2000-05-29 Nix <nix@esperi.demon.co.uk>
+
+ * Makefile.in: Use @datadir@ and @mandir@ appropriately.
+
+2000-05-29 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <kst@sdsc.edu>
+
+ * src/roff/nroff/nroff.sh: Fix main loop syntax.
+
+ * src/utils/indxbib/indxbib.cc: Add declaration of mkstemp().
+
+2000-05-25 Werner LEMBERG <wl@gnu.org>
+
+ * man/roff.man: Removed unused macro.
+
+2000-05-24 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <bwarken@mayn.de>
+
+ * man/roff.man, tmac/groff_tmac.man: Updates (with corrections by
+ WL).
+
+2000-05-19 Bernd Warken <bwarken@mayn.de>
+
+ * man/groff.man: Complete update (with a lot of corrections by WL).
+
+2000-05-18 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * README, win32-diffs: Small fixes and improvements.
+
+2000-05-16 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * MORE.STUFF: Added Robert Marks's utilities.
+
+2000-05-12 Werner LEMBERG <wl@gnu.org>
+
+ Added win32 port contributed by Blake McBride
+ <blake@florida-software.com>.
+
+ * 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 <okazaki@be.to>
+
+ * tmac/tmac.doc: Documentation fix.
+
+2000-05-11 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * doc/groff.texinfo: Completed tab section. Added info about
+ fields.
+
+2000-05-06 Mike MacIsaac <mikemac@us.ibm.com>
+
+ * PROBLEMS: Describe configure script fix for OS/390 Unix.
+
+2000-05-05 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <bwarken@mayn.de>
+ (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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * TODO: Some additions.
+
+2000-04-25 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/troff.man, doc/groff.texinfo: Fixing documentation
+ of mso request.
+
+2000-04-23 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/troff.man: Minor fixes.
+
+2000-04-22 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * src/include/htmlindicate.h, src/include/lib.h,
+ src/include/posix.h: Fix copyright.
+
+ * src/include/Makefile.sub: Update.
+
+2000-04-20 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * src/devices/grops/ps.cc (ps_printer::flush_sbuf): Removing
+ dependency on ASCII order.
+
+2000-04-16 Sandor BARANY <S.Barany@infosys.tuwien.ac.at>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * doc/groff.texinfo: More conversions to @Deffn.
+
+2000-04-12 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * doc/groff.texinfo: More conversions to @Deffn.
+
+2000-04-08 Werner LEMBERG <wl@gnu.org>
+
+ * src/libs/libgroff/{getopt.c,getopt1.c}, src/include/getopt.h:
+ Updated to latest version (glibc 2.1.3).
+
+2000-04-07 Werner LEMBERG <wl@gnu.org>
+
+ * doc/Makefile (clean): Include more index files.
+ Add rule texinfo->dvi.
+
+2000-04-05 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * */*.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 <wl@gnu.org>
+
+ 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<package> which simply
+ load tmac.<package>.
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * doc/groff.texinfo: Removed all occurrences of `you', `we', etc.
+ Other minor fixes.
+
+ * doc/texinfo.tex: New file.
+
+2000-03-18 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Improved section on number registers. Other
+ minor updates.
+
+2000-03-16 Werner LEMBERG <wl@gnu.org>
+
+ * 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ú <pandres@dragonet.es>
+
+ * 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 <okazaki@be.to>
+
+ * Makefile.comm: Add $(INCLUDES) to $(ALL_CFLAGS).
+
+2000-03-11 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * src/libs/libgroff/tmpfile.cc (xtmptemplate, xtmpfile): Removing
+ initializers from arguments (some compilers don't like this).
+
+2000-03-09 Gaius Mulley <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ * tmac/tmac.safer: Will now work correctly in compatibility mode.
+ * tmac/groff_man.man: More fixes.
+
+2000-03-08 Werner LEMBERG <wl@gnu.org>
+
+ * doc/Makefile: Added texput.log to the `clean' target.
+ * doc/groff.texinfo: Added info about delimiters for escapes.
+
+2000-03-08 Bernd Warken <bwarken@mayn.de>
+
+ * src/preproc/pic/pic.man: Add info on conversion of pic images to
+ other graphic formats.
+
+2000-03-07 OKAZAKI Tetsurou <okazaki@be.to>
+
+ * 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 <wl@gnu.org>
+
+ * doc/groff.texinfo: Spelling fixes.
+
+2000-03-06 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <abramo@alsa-project.org>
+
+ 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ú <pandres@dragonet.es>
+
+ Adding strsep() -- Solaris 8 doesn't have it.
+
+ * configure.in: Test it.
+ * src/devices/grolbp/lbp.cc: Add code.
+
+2000-03-05 Werner LEMBERG <wl@gnu.org>
+
+ * 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
+ <Andries.Brouwer@cwi.nl> 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 <wl@gnu.org>
+
+ * tmac/troffrc: Add tmac.lbp.
+
+2000-03-03 Francisco Andrés Verdú <pandres@dragonet.es>
+
+ * tmac/tmac.lbp: New file.
+ * src/devices/grolbp/grolbp.man: Add documentation of `lbpname'
+ command.
+
+2000-03-03 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <blake@florida-software.com>
+
+ * 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 <crp22@cam.ac.uk>
+
+ * src/utils/indxbib/indxbib.cc (main): Use mkstemp() for temporary
+ files.
+
+2000-02-29 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <blake@florida-software.com>
+
+ 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 <wl@gnu.org>
+
+ 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ú <pandres@dragonet.es>.
+
+ * 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 <wl@gnu.org>
+
+ * src/preproc/grn/grn.man: Added info about the gremlin file format
+ (contributed by Daniel Senderowicz <daniel@synchrods.com>).
+
+2000-02-25 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 embarrassing bugs.
+
+ * doc/groff.texinfo: Further checking/updating.
+
+2000-02-21 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * 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 <abramo@alsa-project.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * src/roff/groff/groff.man: Added an example.
+
+2000-02-06 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * NEWS, MORE.STUFF: Updated.
+
+2000-01-30 Cary D. Renzema <caryr@dollar.mxim.com>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * man/groff_font.man: Minor clarifications.
+
+ * NEWS: Updated.
+
+2000-01-28 Werner LEMBERG <wl@gnu.org>
+
+ * afmtodit/afmtodit.pl: Use new `--' comment delimiter.
+
+2000-01-28 Gaius Mulley <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <haible@clisp.cons.org>
+
+ * 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 <wl@gnu.org>
+
+ * doc/groff.texinfo: Updated version/copyright info.
+
+2000-01-21 Gaius Mulley <gaius@glam.ac.uk>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * README: Added info how to apply patches.
+
+2000-01-15 Jan Echternach <echter@informatik.uni-rostock.de>
+
+ * troff/node.cc (ligature_note::operator delete): Fix g++ warning.
+
+2000-01-15 Gaius Mulley <gaius@glam.ac.uk>
+
+ * 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 <haible@clisp.cons.org>
+
+ * devutf8/R.proto: Add mappings for ti, Fn, st, an. Change mappings
+ of Im, Re.
+
+ * devutf8/NOTES: Updated.
+
+2000-01-08 Bruno Haible <haible@clisp.cons.org>
+
+ * 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 <fab@prosa.it>
+
+ 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 <wl@gnu.org>
+
+ * troff/Makefile.sub (majorminor.cc): Fix incorrect path to
+ `REVISION'.
+
+2000-01-10 Werner LEMBERG <wl@gnu.org>
+
+ * 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 `<major>.<minor>.<revision>'
+ * 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 <fab@prosa.it>
+
+ 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 <haible@clisp.cons.org>
+
+ * 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 <wl@gnu.org>
+
+ * tmac/Makefile.sub: tmac.a4 and tmac.trace will now be installed.
+
+2000-01-07 Paul Eggert <eggert@twinsun.com>
+
+ 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 <wl@gnu.org>
+
+ * PROBLEMS: Fixed typo.
+
+2000-01-04 Paul Eggert <eggert@twinsun.com>
+
+ * PROBLEMS: Add Y2k advice for the yr number register.
+
+2000-01-03 Paul Eggert <eggert@twinsun.com>
+
+ * doc/groff.texinfo: Fix Y2k bug in documentation of \n(yr.
+
+2000-01-02 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/tmac.arkup: Slight modification of macros to provide better
+ appearance for non-HTML formats.
+
+2000-01-01 Charles Levert <charles@comm.polymtl.ca>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * doc/Makefile: Added instructions to create HTML and text
+ versions of some files.
+
+1999-12-31 Werner LEMBERG <wl@gnu.org>
+
+ * Updated INSTALL.gen.
+
+ * tmac/tmac.arkup: Added fixes so that .FTP and .MAILTO works
+ better resp. correctly with non-HTML devices.
+
+Copyright 1999-2000 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+Local Variables:
+coding: latin-1
+fill-column: 72
+mode: change-log
+version-control: never
+End:
+vim:set autoindent textwidth=72:
diff --git a/ChangeLog.117 b/ChangeLog.117
new file mode 100644
index 0000000..5724952
--- /dev/null
+++ b/ChangeLog.117
@@ -0,0 +1,2199 @@
+
+Version 1.17.2 released
+=======================
+
+2001-07-07 Werner LEMBERG <wl@gnu.org>
+
+ * src/utils/indxbib/indxbib.cc (main): Change type of `name_max'
+ to size_t.
+
+2001-07-06 Ruslan Ermilov <ru@FreeBSD.org>
+
+ * tmac/doc.tmac (Rv): Make `Rv' really not parseable.
+ Fix synopsis.
+ * tmac/groff_mdoc.man: Fix synopsis.
+
+2001-07-05 Ruslan Ermilov <ru@FreeBSD.org>
+
+ * tmac/doc.tmac (doc-inset-list, doc-hang-list, doc-ohang-list):
+ Restore `doc-Pa-font'.
+
+2001-07-04 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * tmac/www.tmac (.IMAGE): Add fourth parameter to specify vertical
+ image location.
+
+2001-07-02 Ruslan Ermilov <ru@FreeBSD.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wwwutz@molgen.mpg.de>
+
+ * src/preproc/eqn/neqn.sh: Put `export' keyword in a new line to
+ make it portable.
+
+2001-06-27 Werner LEMBERG <wl@gnu.org>
+
+ 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 <andras@cs.wits.ac.za>
+
+ * 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 <andras@cs.wits.ac.za>
+
+ * aclocal.m4 (GROFF_PAGE): Fix page detection code.
+ * configure: Regenerated.
+
+2001-06-24 Werner LEMBERG <wl@gnu.org>
+
+ * 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. <gin@mo.msk.ru>
+
+ * aclocal.m4 (GROFF_NEED_DECLARATION): Fix inclusion of strings.h.
+ * configure: Updated.
+
+2001-06-20 Gaius Mulley <gaius@glam.ac.uk>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * src/roff/troff/input.cc (do_suppress): Fix typo.
+
+2001-06-18 Gaius Mulley <gaius@glam.ac.uk>
+
+ 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 <wl@gnu.org>
+
+ * src/roff/grog/Makefile.sub: Remove NAMEPREFIX.
+
+ * src/devices/grohtml/grohtml.man: Minor improvements.
+
+2001-06-14 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/html/Makefile.sub: Remove NAMEPREFIX.
+
+2001-06-11 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <okazaki@be.to>
+
+ * test-groff: Don't use PATH but GROFF_BIN_PATH.
+
+2001-06-08 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <jfriedl@yahoo-inc.com>
+
+ * src/roff/troff/input.cc (read_size): Fix special case `\s0'.
+
+2001-05-16 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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
+ <hoffmann@usm.uni-muenchen.de>.
+
+ * 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 <wl@gnu.org>
+
+ 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 <solar@openwall.com>
+
+ * Makefile.in: Use $(mandir).
+
+2001-05-06 Alexios Zavras <zvr@pobox.com>
+
+ * src/utils/afmtodit/afmtodit.pl: Fix serious typo.
+
+2001-05-05 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * src/roff/nroff/nroff.man: Improved documentation (especially
+ locales).
+
+2001-05-02 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * tmac/an-old.tmac: Fix minor compatibility mode issue.
+ * tmac/troffrc-end: Make it really work in compatibility mode.
+
+2001-04-27 Werner LEMBERG <wl@gnu.org>
+
+ * src/utils/lkbib/lkbib.cc: Switch inclusion order of stdio.h and
+ stdlib.h.
+
+2001-04-22 Werner LEMBERG <wl@gnu.org>
+
+ * 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
+ <c.zeelenberg@hccnet.nl>.
+
+2001-04-21 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <china@thewrittenword.com>
+
+ * 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 <blilly@erols.com>
+
+ `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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <ru@FreeBSD.org>
+
+ * 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 <wl@gnu.org>
+
+ * NEWS: Fixing typos.
+ Updated.
+
+Version 1.17 released
+=====================
+
+2001-04-17 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/Makefile.sub (install-data): mdoc.local-s is in current
+ directory, not in $(srcdir).
+
+2001-04-16 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: More info on conditionals.
+
+2001-04-15 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <ru@FreeBSD.org>
+
+ * src/roff/troff/troff.man: Fixing typos.
+
+2001-04-13 Werner LEMBERG <wl@gnu.org>
+
+ * doc/pic.ms: Fixing many font switches.
+ * doc/groff.texinfo: Fixes, additions.
+ * MORE.STUFF: Updated.
+
+2001-04-12 Gaius Mulley <gaius@glam.ac.uk>
+
+ * 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 <haible@clisp.cons.org>
+
+ * 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 <wl@gnu.org>
+
+ * PROBLEMS: Add some words on how to avoid wrapper macros.
+
+2001-04-11 Blake McBride <blake@florida-software.com>
+
+ * src/include/nonposix.h (fileno) [_MSC_VER]: Removed.
+
+2001-04-11 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <ru@FreeBSD.org>
+
+ 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 <wl@gnu.org>
+
+ * NEWS: Updated.
+ * doc/groff.texinfo: Many fixes, additions, clarifications, etc.
+
+2001-04-10 Bruno Haible <haible@clisp.cons.org>
+
+ * 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 <ru@freebsd.org>
+
+ 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 <ru@freebsd.org>
+
+ * tmac/doc.tmac (Cd): Simplify code.
+ * tmac/groff_mdoc.man: Document some behaviour of `Cd' request.
+
+2001-04-06 Werner LEMBERG <wl@gnu.org>
+
+ 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
+ initialization 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 <haible@clisp.cons.org>
+
+ * font/devutf8/R.proto: Fix code of 'shc'.
+
+2001-04-06 Ruslan Ermilov <ru@freebsd.org>
+
+ 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 <wl@gnu.org>
+
+ * src/devices/grotty/grotty.man: Fix grammatical error.
+
+2001-03-30 Ruslan Ermilov <ru@freebsd.org>
+
+ 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 <wl@gnu.org>
+
+ * tmac/troffrc-end: Protect data with `.do'. Reported by T. Kurt
+ Bond <tkb@tkb.mpl.com>.
+ * tmac/www.tmac: Save compatibility mode.
+
+2001-03-28 Ruslan Ermilov <ru@freebsd.org>
+
+ * tmac/groff_mdoc.man: Many fixes.
+
+2001-03-28 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/soelim/soelim.man: Document that `.<whitespace>so'
+ isn't recognized.
+
+2001-03-27 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/an-old.tmac (TP, an-do-tag): Reduce line length while in
+ diversion. This fixes overlong tags.
+
+2001-03-26 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <ru@freebsd.org>
+
+ * tmac/Makefile.sub: Strip mdoc.local also
+ * tmac/strip.sed: Fixed.
+
+2001-03-24 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <kollar@alltel.net>
+
+ * doc/groff.texinfo: Complete revision. Added many @Deffn to gain
+ consistency.
+
+2001-03-19 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * 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 `<td width=...>' handling.
+ (html_text::do_table): Add parameter.
+ (html_text::do_indent): Updated.
+ * src/devices/grohtml/html-text.h: Updated.
+
+2001-03-16 Gaius Mulley <gaius@glam.ac.uk>
+
+ 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 <ru@freebsd.org>
+
+ * mdate.sh: Make it POSIX compliant.
+
+2001-03-09 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * src/roff/troff/input.cc (input_iterator::is_boundary): Minor
+ cleanup.
+
+2001-03-07 Werner LEMBERG <wl@gnu.org>
+
+ 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 <gaius@glam.ac.uk>
+
+ 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 <bram@avontuur.org>
+
+ * src/libs/libgroff/font.cc (font_widths_cache): Fixing syntax of
+ constructor.
+
+2001-02-26 David Leonard <david.leonard@csee.uq.edu.au>
+
+ * doc/meref.me: Fixing some typos.
+
+2001-02-16 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <ru@FreeBSD.org>
+
+ * tmac/groff_tmac.man: Fix typo.
+
+2001-02-16 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * src/roff/troff/troff.man, NEWS, man/groff.man: Improved
+ documentation of `asciify' and `unformat' requests.
+
+2001-02-13 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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
+ `foo<ignore><ignore>bar'.
+
+2001-02-05 Yoshiteru Kageyama <yt-kage@cb3.so-net.ne.jp>
+
+ * tmac/groff_tmac.man: Fix `BIR' macro.
+
+2001-02-04 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * doc/groff.texinfo: Minor improvement of `.in' documentation.
+
+2001-01-18 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ 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 <wl@gnu.org>
+
+ * NEWS, src/roff/troff/troff.man, doc/groff.texinfo: Fix
+ documentation of `asciify' request.
+
+2001-01-12 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * man/groff_char.man: Use table header traps only conditionally.
+
+2001-01-09 Bjarni Ingi Gíslason <bjarniig@hi.is>
+
+ * man/groff_char.man: Add `ý' and `Ý' to the `acute' group.
+
+2001-01-08 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * src/roff/troff/troff.man, NEWS: Document `writem' request.
+
+2000-12-21 Werner LEMBERG <wl@gnu.org>
+
+ 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 <ru@FreeBSD.org>
+
+ * tmac/troffrc, tmac/troffrc-end: Convert tmac.* to *.tmac.
+
+2000-12-13 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/eqn/Makefile.sub (MAN1): Added neqn.man.
+ * src/preproc/eqn/neqn.man: Small fixes and additions.
+
+2000-12-13 Ruslan Ermilov <ru@FreeBSD.org>
+
+ * 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 <wl@gnu.org>
+
+ * src/include/lib.h: Replaced __ALPHA with __alpha symbol.
+
+2000-12-06 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <token::TOKEN_NODE>):
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * tmac/safer.tmac: Empty file added (again) for compatibility
+ reasons.
+ * tmac/Makefile.sub: Updated.
+
+2000-11-16 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * doc/groff.texinfo: Fix typo.
+
+2000-10-26 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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/<version><revision>/... 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 <wl@gnu.org>
+
+ 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 <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <ricardo@conectiva.com.br>
+
+ 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 <wl@gnu.org>
+
+ * INSTALL: Add info about selecting paper format.
+
+2000-09-21 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * tmac/groff_mdoc.samples.man: Small fixes.
+
+2000-09-08 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/groff_mdoc.man: Fixing typo.
+
+2000-09-02 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * doc/groff.texinfo: Added some comments.
+
+2000-08-30 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/TODO: Updated.
+
+2000-08-25 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Fix comment how to compile the DVI file.
+
+2000-08-25 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <eliz@is.elta.co.il>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ Added the new troff command .output <arg> 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 <wl@gnu.org>
+
+ * src/devices/grolbp/lbp.cc: Same workaround for sinix as for AIX.
+
+2000-08-22 Werner LEMBERG <wl@gnu.org>
+
+ * src/include/lib.h: Provide a fix for IRIX to not include
+ groff-getopt.h.
+
+2000-08-18 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <eggert@twinsun.com>
+
+ * src/roff/groff/pipeline.c (is_system_shell):
+ Fix typo: "monocased_shell" no longer exists.
+
+2000-08-07 Paul Eggert <eggert@twinsun.com>
+
+ 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 <tschmidt@micron.com>
+
+ * src/include/posix.h: Add a default value for FILENAME_MAX.
+
+2000-08-06 Paul Eggert <eggert@twinsun.com>
+
+ 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 <wl@gnu.org>
+
+ * src/roff/troff/troff.man: Fixing typos.
+
+Copyright 2000-2001 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+Local Variables:
+coding: latin-1
+fill-column: 72
+mode: change-log
+version-control: never
+End:
+vim:set autoindent textwidth=72:
diff --git a/ChangeLog.118 b/ChangeLog.118
new file mode 100644
index 0000000..a87d02c
--- /dev/null
+++ b/ChangeLog.118
@@ -0,0 +1,3803 @@
+
+Version 1.18.1 released
+=======================
+
+2002-10-08 Werner LEMBERG <wl@gnu.org>
+
+ * doc/webpage.ms, NEWS: Updated.
+
+2002-10-07 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <ru@FreeBSD.org>
+
+ * 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 <daniel@synchrods.com>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <ru@FreeBSD.org>
+
+ * tmac/doc-common (ds-operating-system-FreeBSD-4.*): New version
+ strings.
+
+2002-09-27 Colin Watson <cjwatson@debian.org>
+
+ * src/roff/troff/node.cc (bracket_node::copy): Check `list' != 0.
+
+2002-09-23 Werner LEMBERG <wl@gnu.org>
+
+ * 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ú <pandres@dragonet.es>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * configure: Regenerated with autoconf 2.54.
+
+2002-09-20 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * src/roff/troff/env.cc (environent_switch, environment_copy):
+ Emit glyph and fill color nodes to initialize colors properly.
+
+2002-09-17 Colin Watson <cjwatson@debian.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * doc/groff.texinfo, man/groff_font.man: Clarify argument of \N.
+ * man/groff_out.man: Fix documentation of 'N'.
+
+2002-09-09 Gaius Mulley <gaius@glam.ac.uk>
+
+ * 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) <P_TAG,
+ PRE_TAG>: Call `begin' with `FALSE'.
+
+2002-09-09 Ralph Corderoy <ralph@inputplus.demon.co.uk>
+
+ * src/libs/libgroff/string.cc (string::extract): Fix position of
+ terminating null byte.
+
+2002-09-08 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ * doc/groff.texinfo, tmac/groff_man.man: Improve documentation of
+ default indentation.
+
+2002-09-04 Gaius Mulley <gaius@glam.ac.uk>
+
+ * src/preproc/html/pre-html.cc (imageList::createPage): Use
+ -sPAPERSIZE for gs.
+ (generateImages): Clean up push-back buffer.
+
+2002-09-04 Ralph Corderoy <ralph@inputplus.demon.co.uk>
+
+ * doc/groff.texinfo: Minor fixes.
+
+2002-08-21 Gaius Mulley <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * INSTALL: Mention texinfo 4.2 as a prerequisite.
+
+2002-08-21 Gaius Mulley <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ 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 <gaius@glam.ac.uk>
+
+ 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 <wl@gnu.org>
+
+ * src/devices/grops/grops.man, src/devices/grolj4/grolj4.man,
+ src/devices/grodvi/grodvi.man: Document default line thickness.
+
+2002-08-15 Gaius Mulley <gaius@glam.ac.uk>
+
+ * src/devices/grohtml/post-html.cc (char_block): Increase SIZE to
+ 8192.
+
+2002-08-14 Werner LEMBERG <wl@gnu.org>
+
+ * doc/webpage.ms: Updated.
+
+2002-08-09 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/node.cc (node::add_char): Call `freeze_space' for
+ unbreakable space.
+
+2002-08-08 Aaron Campbell <aaron@monkey.org>
+
+ * src/preproc/pic/object.cc (object_spec::make_move): Fix typo
+ (&& -> &).
+
+2002-08-08 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ 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 <wl@gnu.org>
+
+ * 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 <cjwatson@debian.org>
+
+ * 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 <wl@gnu.org>
+
+ * doc/grnexmpl.me: Remove calls to .st and .sc which are undefined.
+
+2002-07-29 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/pic/pic.y (print_arg, relative_path): Add missing
+ final semicolon.
+
+2002-07-28 Colin Watson <cjwatson@debian.org>
+
+ * src/devices/grohtml/post-html (html_printer::troff_tag): Handle
+ `.ps'.
+ (html_printer::html_printer): Initialize `pointsize'.
+
+2002-07-26 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <pere@hungry.com>
+
+ * src/libs/libdriver/input.cc (Char): Add const to `operator=='.
+ Add `operator!='.
+
+2002-07-24 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * doc/groff.texinfo: Document `papersize' keyword.
+ * NEWS, man/groff_font.man: Updated.
+
+2002-07-23 Colin Watson <cjwatson@debian.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * NEWS: Add `output' request.
+
+ * REVISION: Increased to 1.
+
+Version 1.18.0 released
+=======================
+
+2002-07-19 Gaius Mulley <gaius@glam.ac.uk>
+
+ 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 <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ 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_<foo>' 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_<foo>', `insert_<foo>', `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 <wl@gnu.org>
+
+ * src/utils/afmtodit/afmtodit.pl: Don't use `-P-' for invoking perl.
+
+2002-07-14 Eric S. Raymond <esr@thyrsus.com>
+
+ * contrib/pic2graph/pic2graph.*: Use convert(1).
+ * contrib/eqn2graph/eqn2graph.*: Minor fixes.
+
+2002-07-14 Bernd Warken <bwarken@mayn.de>
+
+ * tmac/groff_trace.man: New file.
+ * tmac/Makefile.sub: Updated.
+ * NEWS: Updated.
+
+2002-07-13 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/groff/groff.man: Add some cross references.
+
+2002-07-12 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/input.cc (substring_request): Add warnings for
+ string indices out of range.
+
+2002-07-11 Werner LEMBERG <wl@gnu.org>
+
+ * font/devdvi/generate/ec.map: Fix typo (`(l' -> `/l').
+ * font/devdvi/*EC: Regenerated.
+
+2002-07-10 Bernd Warken <bwarken@mayn.de>
+
+ * man/groff_char.man: Updated and extended.
+
+2002-07-10 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <goulding@Princeton.EDU>
+
+ * src/roff/grog/grog.sh: Fix typo.
+
+2002-07-08 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <bwarken@mayn.de>
+
+ * man/groff_tmac.man: Updated and extended.
+
+2002-06-24 Werner LEMBERG <wl@gnu.org>
+
+ * doc/pic.ms, src/preproc/pic/pic.man: Fix description of `:='.
+
+2002-06-23 Werner LEMBERG <wl@gnu.org>
+
+ * doc/pic.ms: Improve documentation of composite block objects.
+
+2002-06-22 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <cjwatson@debian.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <dradul@007mundo.com>
+
+ * src/devices/grops/grops.man: Add info about Type 42 fonts.
+
+2002-06-15 Gaius Mulley <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ 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 <bwarken@mayn.de>
+
+ * 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 <bwarken@mayn.de>
+
+ * src/roff/grog/grog.pl: Fix typo.
+
+2002-06-07 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Add more info on .tr arguments.
+
+2002-06-05 Werner LEMBERG <wl@gnu.org>
+
+ * NEWS, src/roff/grog/grog.man, doc/groff.texinfo: Updated.
+
+ * aclocal.m4 (GROFF_MKSTEMP): Include unistd.h.
+ * configure: Regenerated.
+
+2002-06-05 Ralph Corderoy <ralph@inputplus.demon.co.uk>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * doc/homepage.ms: Renamed to ...
+ * doc/webpage.ms: This.
+ Use `.NHR'.
+
+2002-05-23 Werner LEMBERG <wl@gnu.org>
+
+ Integrating the `mom' macro package, contributed by Peter Schaffter
+ <df191@ncf.ca>.
+
+ * 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 <gaius@glam.ac.uk>
+
+ 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 <wl@gnu.org>
+
+ * MORE.STUFF: Add info about David Frey's deroff implementation.
+ Mention troff.org.
+
+2002-05-16 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * src/devices/grops/grops.man: Clarify handling of `download' file.
+
+2002-05-11 Werner LEMBERG <wl@gnu.org>
+
+ Adding `warnscale' and `spreadwarn' requests, based on a patch from
+ Jeffrey Friedl <jfriedl@yahoo.com>.
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * doc/groff.texinfo: Integrated groff_out.man.
+ Some macro fixes.
+
+2002-04-23 Werner LEMBERG <wl@gnu.org>
+
+ * man/groff_out.man: Minor fixes.
+
+2002-04-23 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Moving @cindex entries after @Def* to get
+ correct page references.
+ Fixed many index entries.
+
+2002-04-23 Bernd Warken <bwarken@mayn.de>
+
+ * man/roff.man: Enlarged.
+
+2002-04-22 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: More examples, other fixes.
+
+2002-04-20 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * doc/groff.texinfo: Document \\, \e, \E, \., and \c.
+
+2002-04-16 Bernd Warken <bwarken@mayn.de>
+
+ * src/roff/groff/groff.man: Improve documentation of -P option.
+ Other minor fixes.
+
+2002-04-15 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * tmac/doc.tmac (doc-tag-list): Use \Z to avoid stretching of
+ spaces in tags.
+
+2002-04-13 Werner LEMBERG <wl@gnu.org>
+
+ 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 <bwarken@mayn.de>
+
+ * 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 <wl@gnu.org>
+
+ * doc/groff.texinfo: Completed pass on gtroff reference.
+
+2002-04-11 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: More fixes.
+
+2002-04-11 Bernd Warken <bwarken@mayn.de>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ * man/groff_diff.man, man/groff.man, NEWS, doc/groff.texinfo:
+ Document pvs request and .pvs register.
+
+2002-04-09 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Improve and fix documentation of diversions
+ and environments.
+
+2002-04-08 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Fix documentation of drawing functions.
+ Other minor fixes.
+
+2002-04-07 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Better documentation of double quotes as
+ arguments.
+ Other minor fixes.
+
+2002-04-06 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <hoffmann@usm.uni-muenchen.de>
+
+ * 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 <mas@ssl.co.uk>
+
+ * src/drivers/grops/psrm.cc (resource_manager::do_begin_binary):
+ Fix typo.
+
+2002-04-03 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <dradul@yahoo.com>
+
+ * src/include/nonposix.h, src/roff/groff/pipeline.c:
+ s/__CYGWIN32__/__CYGWIN__/.
+
+2002-03-28 Gaius Mulley <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ * src/libs/libgroff/getopt.c: Updated to latest version.
+
+ * tmac/README: More on hyphen.tex license.
+
+2002-03-26 Larry Kollar <kollar@alltel.net>
+
+ * doc/groff.texinfo: Add documentation of most missing requests.
+
+2002-03-25 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <phil@perkpartners.com>
+
+ * Makefile.comm (.y.o): New rule for make on Solaris 2.5.1 -- the
+ internal .y.o rule took precedence over the .y.cc rule, compiling
+ the yacc files with gcc instead of g++.
+
+2002-03-23 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * doc/groff.texinfo: Document possible conflict between `tr' and
+ `char' requests.
+
+2002-03-21 Werner LEMBERG <wl@gnu.org>
+
+ 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 <kollar@alltel.net>
+
+ * doc/groff.texinfo: Add documentation for `hpfa' and `trin'
+ requests.
+
+2002-03-18 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/html.tmac: Fix serious typo.
+
+2002-03-17 Larry Kollar <kollar@alltel.net>
+
+ * doc/groff.texinfo: Add documentation for `writec' request.
+
+2002-03-17 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <kollar@alltel.net>
+
+ * doc/groff.texinfo: Improve documentation of .RS and .RE.
+
+2002-03-14 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * doc/groff.texinfo: More fixes for texinfo 4.1 and higher.
+
+2002-03-10 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * PROBLEMS: The static constructor bug has been fixed in z/OS V1R3.
+
+2002-03-09 Larry Kollar <kollar@alltel.net>
+
+ * tmac/groff_ms.man: Add documentation for RS and RE macros.
+
+2002-03-08 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Fixes for texinfo 4.1.
+
+2002-03-07 Werner LEMBERG <wl@gnu.org>
+
+ * 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ú <pandres@dragonet.es>
+
+ * font/devlbp/Makefile.sub (DEVFILES): Add some missing fonts.
+ * tmac/lbp.tmac: Add some font translations.
+
+2002-03-02 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <phil@perkpartners.com>
+
+ * src/include/lib.h [HAVE_SNPRINTF]: Include stdarg.h.
+
+2002-02-20 Ralph Corderoy <ralph@inputplus.demon.co.uk>
+
+ * src/roff/grog/grog.pl: Fix computation of $refer.
+
+2002-02-19 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ Simplify image handling for grohtml.
+ Fix <p> 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 <p>.
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * tmac/groff_tmac.man: Moved to...
+ * man/groff_tmac.man: This place.
+ * tmac/Makefile.sub, man/Makefile.sub: Updated.
+
+2002-02-12 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ * doc/pic.ms: Fixed typos (\(*tx -> \*(tx).
+ Added `linethick' to table in section `Style Variables'.
+
+2002-02-08 Gaius Mulley <gaius@glam.ac.uk>
+
+ * src/libs/libdriver/input.cc (get_extended_arg): Fix conditional.
+
+2002-02-07 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <bwarken@mayn.de>
+
+ * src/libs/libdriver/input.cc: Introduce `EnvInt' typedef and use
+ it. This is a preparation for future changes.
+
+2002-02-05 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <kollar@alltel.net>
+
+ * doc/groff.texinfo: More fixes.
+
+2002-02-04 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <kollar@alltel.net>
+
+ * doc/groff.texinfo, tmac/groff_ms.man: More fixes.
+
+2002-01-31 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/an-old.tmac (I): Use \, and \/ to improve spacing.
+
+2002-01-31 Bernd Warken <bwarken@mayn.de>
+
+ * src/devices/grolbp/lbp.cc (main): Delete `pr'.
+ * man/groff_out.man: Revised and updated.
+
+2002-01-30 Bernd Warken <bwarken@mayn.de>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ 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 <wl@gnu.org>
+
+ * tmac/ps.tmac, tmac/html.tmac: Fix compatibility mode issues.
+
+2002-01-27 Gaius Mulley <gaius@glam.ac.uk>
+
+ 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 <wl@gnu.org>
+
+ * doc/groff.texinfo (Def*): Call index function after deffn.
+
+ * tmac/html.tmac: Call `nroff' request.
+
+2002-01-26 Larry Kollar <kollar@alltel.net>
+
+ * tmac/groff_ms.man: Add some omissions.
+
+2002-01-25 Larry Kollar <kollar@alltel.net>
+
+ * tmac/groff_ms.man: Typographical improvements.
+
+2002-01-25 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * tmac/groff_www.man, NEWS: Fix typos.
+
+2002-01-21 Werner LEMBERG <wl@gnu.org>
+
+ 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 <bwarken@mayn.de>
+
+ * src/libs/libdriver/input.cc: Completely rewritten. See comments
+ in this file for what has been changed.
+
+2002-01-19 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * src/libs/libgroff/geometry.cc (check_output_arc_limits): Fix
+ quadrant boundaries.
+
+2002-01-18 Werner LEMBERG <wl@gnu.org>
+
+ * devices/grops/ps.cc: Aargh! Fix the fix of the incorrectly
+ applied last patch.
+
+2002-01-17 Ruslan Ermilov <ru@FreeBSD.org>
+
+ * 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 <haible@clisp.cons.org>
+
+ * src/preproc/pic/lex.cc (get_token): Fix typo.
+
+2002-01-17 Werner LEMBERG <wl@gnu.org>
+
+ * devices/grops/ps.cc: Fix incorrectly applied last patch.
+
+2002-01-17 Larry Kollar <kollar@alltel.net>
+
+ * tmac/groff_ms.man: Completely rewritten.
+
+2002-01-16 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/an-old.tmac (TS): Force break, inserting some vertical space.
+
+2002-01-15 Gaius Mulley <gaius@glam.ac.uk>
+
+ * devices/grops/ps.cc (ps_printer::fill_path): Fix handling of
+ fill colors.
+ (ps_printer::draw): Ditto.
+
+2002-01-14 Ruslan Ermilov <ru@FreeBSD.org>
+
+ * tmac/groff_mdoc.man: Minor fixes.
+
+2002-01-13 Werner LEMBERG <wl@gnu.org>
+
+ * man/groff_out.man: Some fixes.
+
+2002-01-13 Gaius Mulley <gaius@glam.ac.uk>
+
+ * doc/pic.ms: Fix typos.
+
+2002-01-12 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo, doc/groff.man: More on a printable backslash.
+
+2002-01-10 Werner LEMBERG <wl@gnu.org>
+
+ * font/devutf8/R.proto, font/devhtml/R.prot: Add `Eu' and `eu'
+ symbols.
+ * NEWS: Updated.
+
+2002-01-09 Bernd Warken <bwarken@mayn.de>
+
+ * man/groff_out.man: Revised.
+ * man/roff.man: Minor fixes.
+ * src/roff/troff/troff.man: Some reordering.
+
+2002-01-09 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/an-old.tmac: Add dummy macros for equation support.
+
+2002-01-07 Werner LEMBERG <wl@gnu.org>
+
+ 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 <bwarken@mayn.de>
+
+ * man/groff_diff.man: Revised.
+
+2002-01-06 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/www.tmac: Remove extraneous backslash.
+
+2002-01-06 Bernd Warken <bwarken@mayn.de>
+
+ * man/ditroff.man, src/roff/groff/groff.man, man/groff.man: Revised.
+
+2002-01-05 Werner LEMBERG <wl@gnu.org>
+
+ Integrated groffer, contributed by Bernd Warken.
+
+ * contrib/groffer/*: New.
+ * Makefile.in, NEWS: Updated.
+
+2002-01-04 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Added macros `@Defmpreg' and `@Defmpregx' for
+ registers defined in macro packages.
+ Revising the ms part.
+
+2002-01-04 Larry Kollar <kollar@alltel.net>
+
+ * doc/groff.texinfo: Add documentation for ms macros.
+
+2002-01-02 Werner LEMBERG <wl@gnu.org>
+
+ 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 <bwarken@mayn.de>
+
+ * man/roff.man: Revised.
+
+2002-01-01 Bernd Warken <bwarken@mayn.de>
+
+ * src/roff/groff/groff.man: Completely rewritten.
+
+2001-12-31 Werner LEMBERG <wl@gnu.org>
+
+ * doc/Makefile: Updated.
+
+2001-12-30 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ 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 <wl@gnu.org>
+
+ * src/roff/troff/input.cc (default_black): Fix return value.
+
+2001-12-24 Ruslan Ermilov <ru@FreeBSD.org>
+
+ * tmac/doc-common (Dt): Change output of architecture strings.
+ Do some syntax cleanup.
+ * tmac/groff_mdoc.man: Updated.
+
+2001-12-23 Werner LEMBERG <wl@gnu.org>
+
+ 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 <ru@FreeBSD.org>
+
+ * tmac/doc-common, tmac/doc-syms: Small updates.
+
+2001-12-22 Colin Watson <cjwatson@debian.org>
+
+ * tmac/an-old.tmac (an-p-footer): Set title length in environment 1.
+
+2001-12-22 Bernd Warken <bwarken@mayn.de>
+
+ * MANIFEST: New file.
+
+2001-12-22 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/grn/grn.man: Updated.
+
+2001-12-22 Solar Designer <solar@openwall.com>
+
+ * src/preproc/grn/hdb.cc (MAXSTRING_S): New macro.
+ (DBRead): Use it.
+
+2001-12-19 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * groff.texinfo: Document exact search algorithm for glyphs.
+
+2001-12-15 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * src/roff/troff/input.cc (default_black): Define default color
+ `black' if not yet defined.
+
+2001-12-13 Werner LEMBERG <wl@gnu.org>
+
+ 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 <ralph@inputplus.demon.co.uk>
+
+ * src/preproc/eqn/main.cc (inline_equation): Fix typos.
+
+2001-12-12 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/groff_man.man, doc/groff.texinfo: There is no .R macro.
+
+2001-12-10 Gaius Mulley <gaius@glam.ac.uk>
+
+ * man/groff_diff.man: Adding documentation for \O.
+
+2001-12-10 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * man/roff.man: Revised.
+ * src/roff/groff/groff.man: Replace man page references with a
+ pointer to roff.man.
+
+2001-12-09 Bernd Warken <bwarken@mayn.de>
+
+ * man/roff.man: Completely rewritten.
+
+2001-12-06 Ralph Corderoy <ralph@inputplus.demon.co.uk>
+
+ * src/preproc/eqn/main.cc (inline_equation): Improve error message.
+
+2001-12-05 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ * tmac/groff_mdoc.man: Fix typo.
+
+2001-12-01 Colin Watson <cjwatson@debian.org>
+
+ * man/roff.man: Fix typo.
+
+2001-11-29 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * src/roff/groff/groff.man, tmac/groff_tmac.man,
+ tmac/groff_www.man: s/mwww/www/.
+
+2001-11-26 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * doc/groff.texinfo: Improve documentation of the `\v' escape.
+ Fix explanation of `\D' and `rt'.
+
+2001-11-20 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * NEWS, man/Makefile.sub: Updated.
+
+2001-11-19 Bernd Warken <bwarken@mayn.de>
+
+ * man/ditroff.man: New file.
+
+2001-11-17 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <bwarken@mayn.de>
+
+ * 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 <ru@FreeBSD.org>
+
+ * tmac/doc-common (doc-header): Handle very long document titles
+ better.
+
+2001-11-16 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/doc.tmac (doc-do-Bl-args): Fix .substring requests.
+
+2001-11-15 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * tmac/an-old.tmac (TS, TE): New macros for table support.
+
+2001-11-12 Werner LEMBERG <wl@gnu.org>
+
+ * src/include/lib.h: Provide a fix for emx to not include
+ groff-getopt.h.
+
+2001-10-27 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/input.cc (substring_macro): Fix computation of
+ boundary values.
+
+2001-10-20 Werner LEMBERG <wl@gnu.org>
+
+ 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 <ru@FreeBSD.org>
+
+ * tmac/doc.tmac (doc-flag-recursion): Protect arguments against
+ being handled as end-of-sentence characters,
+
+2001-10-10 Gaius Mulley <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ * tmac/color.tmac, tmac/color-html.tmac: Use `.do' to make those
+ files work with -C also.
+
+2001-10-05 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ Implementing color support in troff, pic, grops, and grohtml. These
+ changes are based on a major patch provided by Gaius Mulley
+ <gaius@glam.ac.uk>.
+
+ 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 function.
+ 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 <gaius@glam.ac.uk>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * man/groff.man: Use
+
+ .ev xxx
+ .na
+ .nh
+ <table>
+ .ev
+
+ instead of the old code (`.ad .hy' after the table) to suppress
+ incorrect hyphenation for grohtml output.
+
+2001-09-22 Werner LEMBERG <wl@gnu.org>
+
+ * man/groff_font.man, man/groff_out.man: Minor fixes.
+
+2001-09-20 Werner LEMBERG <wl@gnu.org>
+
+ * PROBLEMS: Updated, reordered. Improved EPS section (thanks to
+ Arnold Robbins <arnold@skeeve.com>).
+
+2001-09-09 Werner LEMBERG <wl@gnu.org>
+
+ * configure: Regenerated with autoconf 2.52.
+
+ * doc/groff.texinfo: Complete revision of indices.
+
+2001-09-07 Werner LEMBERG <wl@gnu.org>
+
+ * doc/Makefile (clean): Updated to delete all indices.
+
+2001-09-05 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * man/groff.man, src/preproc/eqn/eqn.man, tmac/groff_mdoc.man: Don't
+ use .ne for TTY devices.
+
+2001-08-31 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/token.h, src/roff/troff/input.cc:
+ s/TOKEN_TRANSPARENT_ESCAPE/TOKEN_OPAQUE_ESCAPE/.
+
+2001-08-28 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * tmac/an-old.tmac: Fix `S' string.
+
+2001-08-26 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/troff.man: Don't use .ne for TTY devices.
+
+2001-08-25 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * src/include/getopt.h, src/libs/libgroff/{getopt.c, getopt1.c}:
+ Updated to latest version of libc.
+
+2001-08-23 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * doc/pic.ms: Fix typo.
+ * src/preproc/tbl/tbl.man: Document case of global options.
+
+2001-08-21 Gaius Mulley <gaius@glam.ac.uk>
+
+ * src/devices/grohtml/post-html.cc (html_printer::end_font): Fix
+ handling of `CR' font.
+
+2001-08-20 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * NEWS: Updated.
+
+2001-08-18 Sebastian Krahmer <krahmer@suse.de>
+
+ * src/preproc/pic/pic.y (format_number): Use do_sprintf().
+ (do_sprintf): Use snprintf().
+
+2001-08-18 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <ru@FreeBSD.org>
+
+ * tmac/doc.tmac (Ex): New implementation.
+ * tmac/doc-common, tmac/groff_tmac.man: Updated.
+
+2001-08-13 Ruslan Ermilov <ru@FreeBSD.org>
+
+ * tmac/doc.tmac (Rv): Implement support for 0 or more than 1
+ argument.
+ * tmac/groff_tmac.man: Updated.
+
+2001-08-13 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/tbl/tbl.man: Minor documentation update.
+
+2001-08-13 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <esr@thyrsus.com>
+
+ * src/preproc/tbl/tbl.man: Extended to cover all tbl features.
+
+2001-08-09 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/tbl/main.cc (process_data): Fix recognition of .lf
+ requests.
+
+2001-08-08 Paul Eggert <eggert@twinsun.com>
+
+ * Makefile.sub (configure): Depend on configure.ac, not
+ configure.in.
+ * INSTALL.gen: Upgrade to autoconf 2.52's INSTALL.
+
+2001-08-07 Werner LEMBERG <wl@gnu.org>
+
+ * src/utils/afmtodit/afmtodit.man, src/roff/groff/groff.man: Minor
+ fixes.
+
+2001-08-06 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/troff.man: Improve documentation of -E option.
+
+2001-07-28 Ralph Corderoy <ralph@inputplus.demon.co.uk>
+
+ * src/preproc/html/pushbackbuffer.cc (pushBackBuffer::readNumber):
+ Simplified.
+
+2001-07-27 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/refer/refer.cc: Undo last change.
+ * src/devices/grohtml/post-html.cc: Ditto.
+
+2001-07-26 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/refer/refer.cc: Include `lib.h'.
+ * src/devices/grohtml/post-html.cc: Ditto.
+
+2001-07-25 Gaius Mulley <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * doc/groff.texinfo: Minor fixes.
+
+2001-07-21 Gaius Mulley <gaius@glam.ac.uk>
+
+ * doc/Makefile (.ms.html): Put image files into a subdirectory.
+ (clean): Updated.
+
+2001-07-20 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * NEWS: Updated.
+
+2001-07-18 Ruslan Ermilov <ru@FreeBSD.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ 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 <esr@snark.thyrsus.com>
+
+ * doc/pic.ms: Documentation fixes.
+
+2001-07-17 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * win32-diffs: Updated.
+
+2001-07-14 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <ralph@inputplus.demon.co.uk>
+
+ * src/libs/libgroff/tmpfile.cc (xtmpfile): Fix guard for `namep'.
+
+2001-07-12 Ruslan Ermilov <ru@FreeBSD.org>
+
+ 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 <gaius@glam.ac.uk>
+
+ * src/devices/grohtml/post-html.cc (text_glob::is_br): Stop titles
+ running into centered or non-formatted text.
+
+2001-07-11 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * REVISION: Increased to 3.
+
+Copyright 2001-2002 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+Local Variables:
+coding: latin-1
+fill-column: 72
+mode: change-log
+version-control: never
+End:
+vim:set autoindent textwidth=72:
diff --git a/ChangeLog.119 b/ChangeLog.119
new file mode 100644
index 0000000..2840368
--- /dev/null
+++ b/ChangeLog.119
@@ -0,0 +1,5240 @@
+
+Version 1.19.2 released
+=======================
+
+ * 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 <jgrahn@algonet.se>
+
+ * tmac/groff_ms.man: Document `PO' better.
+
+2005-09-03 Werner LEMBERG <wl@gnu.org>
+
+ * NEWS: Document grotty changes.
+
+2005-09-01 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ 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 (Man options): Document
+ altered `LL' register initialization priorities.
+
+2005-08-29 Gary W. Swearingen <garys@opusnet.com>
+
+ * tmac/groff_mdoc.man: Go into more details how the `AUTHORS'
+ section should look like.
+
+2005-08-29 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/groff_mdoc.man: The month's name in a call to .Dd shouldn't
+ be abbreviated.
+
+2005-08-27 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * tmac/groff_man.man: Add man(7) too SEE ALSO and more minor
+ fixes.
+
+2005-08-11 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * tmac/www.tmac (URL, MTO): Handle empty \\$1 better.
+
+2005-08-09 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * tmac/www.tmac (URL, MTO): Use bold series if color support is
+ deactivated.
+
+2005-08-02 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * 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 <groff-bernd.warken-72@web.de>
+
+ * 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 <wl@gnu.org>
+
+ * ChangeLog: Split off older entries into...
+ * ChangeLog.115 ChangeLog.116, ChangeLog.117, ChangeLog.118: New
+ files.
+
+2005-06-26 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/devices/xditview/gxditview.man: More minor fixes.
+
+2005-06-24 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <groff-bernd.warken-72@web.de>
+
+ * src/devices/xditview/gxditview.man: More minor fixes.
+ * README: Formatting issues.
+ Mention some problems with Debian.
+
+2005-06-23 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/devices/xditview/gxditview.man: Revised and improved.
+
+2005-06-22 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * src/include/lib.h: Provide a fix for Mac OS X to not include
+ groff-getopt.h.
+
+2005-06-20 Denis M. Wilson <dmw@oxytropis.plus.com>
+
+ * font/devps/prologue.ps (EP): Don't 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 <jgrahn@algonet.se>
+
+ * src/preproc/soelim/soelim.cpp (do_file): Append trailing zero
+ earlier to get correct error message.
+
+2005-06-16 Bernd Warken <groff-bernd.warken-72@web.de>
+ * src/roff/nroff/nroff.sh: Add support for iso-8859-15.
+
+2005-06-15 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * doc/fdl.texi: Updated to version 1.2. Reported by
+ Bernd Warken <groff-bernd.warken-72@web.de>.
+
+2005-05-28 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * MANIFEST, README, doc/webpage.ms: Updated.
+
+2005-05-26 Werner LEMBERG <wl@gnu.org>
+
+ * All affected files: Update postal address of FSF.
+
+2005-05-25 Keith Marshall <keith.d.marshall@ntlworld.com>
+ Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * README: More fixes.
+
+ * README.CVS: Removed. Its contents is now part of the README file.
+
+2005-05-21 Werner LEMBERG <wl@gnu.org>
+
+ * README: Updated. Based on a patch from
+ Bernd Warken <groff-bernd.warken-72@web.de>.
+
+2005-05-16 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ 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/grap2graph/grap2graph.sh: 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 <keith.d.marshall@ntlworld.com>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * src/preproc/refer/refer.man: Many small typographic fixes.
+
+2005-05-06 Jeff Conrad <jeff_conrad@msn.com>
+
+ * src/devices/grohtml/post-html.cpp (assert_state::~assert_state):
+ Use `char *' cast for a_delete.
+
+2005-05-03 Werner LEMBERG <wl@gnu.org>
+
+ * src/libs/libgroff/maxpathname.cpp: Include stdlib.h.
+ src/libs/libgroff/relocate.cpp: Use path_name_max everywhere.
+
+2005-05-03 Jeff Conrad <jeff_conrad@msn.com>
+
+ * src/devices/grohtml/post-html.cpp: Use casts to `char *' if using
+ `a_delete' for `const char *'.
+
+2005-05-03 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <keith.d.marshall@ntlworld.com>
+
+ 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 <wl@gnu.org>
+
+ 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 <lawrence.jones@ugs.com>
+
+ * src/utils/xtotroff/xtotroff.c (MapFont): Fix variable declaration.
+
+2005-04-18 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/groff/pipeline.c: Don't include ctype.h.
+
+2005-04-13 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/nroff/nroff.man: Document option `-M'.
+
+2005-04-13 Bruce Lilly <blilly@erols.com>
+
+ * src/roff/nroff/nroff.sh: Make the script accept option `-M'.
+
+2005-04-01 Kees Zeelenberg <kzlg@users.sourceforge.net>
+ Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * configure.ac: Undo change from 2005-03-24.
+ * configure: Regenerated.
+
+2005-03-24 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <kollar@alltel.net>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * doc/Makefile.sub (CLEANADD): Add `groff.html'.
+
+2005-03-17 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <gaius@glam.ac.uk>
+
+ * src/devices/grohtml/post-html.cpp
+ (html_printer::lookahead_for_tables): End .ce properly to avoid a
+ segfault.
+
+2005-03-15 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <keith.d.marshall@ntlworld.com>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <keith.d.marshall@ntlworld.com>
+
+ 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 <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ * src/preproc/eqn/eqn.man, NEWS: Document various extensions of
+ eqn.
+
+2005-02-17 Werner LEMBERG <wl@gnu.org>
+
+ * doc/pic.ms, man/groff.man: Fix typos.
+
+ * doc/groff.texinfo: Fix typos.
+ (\LEmacro): Get proper mathematical spacing.
+
+2005-02-16 Werner LEMBERG <wl@gnu.org>
+
+ * aclocal.m4 (GROFF_APPRESDIR_CHECK): Improve warning message.
+ * configure: Regenerated with autoconf 2.59b.
+
+2005-02-16 Gaius Mulley <gaius@glam.ac.uk>
+
+ * 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 <gaius@glam.ac.uk>
+
+ These patches modify the indentation implementation to use `<p
+ style=margin-left: n%>'. 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) <P_TAG, PRE_TAG>: Updated.
+ (html_text::issue_tag): Add argument to handle space style.
+ (html_text::start_tag) <P_TAG, PRE_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 parameter 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 <wl@gnu.org>
+
+ * 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 <master@iaas.msu.ru>
+ Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <palopez@etb.net.co> (tiny change)
+
+ * doc/groff.texinfo (ms Document Control Registers): Document `HY'
+ and `FAM' registers.
+
+2005-02-05 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * src/roff/groff/groff.man: Add information about paper size.
+
+2005-01-25 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/nroff/nroff.sh: Handle `*.ISO8859-1' in locale. From
+ NetBSD bin/29114.
+
+2005-01-22 Ruslan Ermilov <ru@FreeBSD.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <ken@chiltonfamily.org>.
+
+ * src/devices/grops/grops.man: Add more info on DSC.
+
+2005-01-17 Ruslan Ermilov <ru@FreeBSD.org>
+
+ * tmac/doc-common (Dd), tmac/doc-ditroff (gX, doc-setup-header):
+ Remove dead code.
+
+2005-01-17 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/div.cpp (top_level_diversion::space): Protect
+ against division by zero.
+
+2005-01-13 Ruslan Ermilov <ru@FreeBSD.org>
+
+ * tmac/doc.tmac (Ef): Restore doc-curr-font and doc-curr-size.
+
+2004-12-19 Werner LEMBERG <wl@gnu.org>
+
+ * install-sh: New version; taken from texinfo CVS.
+
+2004-12-17 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/devtag.tmac: Protect against loading twice.
+ Protect against 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 <mbianchi@Foveal.com>
+
+ * configure.ac: Produce `contrib/gdiffmk/tests/runtests'.
+ * configure: Updated.
+
+2004-12-15 Thomas Klausner <wiz@netbsd.org>
+
+ * tmac/doc-syms, tmac/groff_mdoc.man: Add `libpam' library.
+
+2004-12-15 Werner LEMBERG <wl@gnu.org>
+
+ 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 <gaius@glam.ac.uk>
+
+ 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 <wl@gnu.org>
+
+ Import Mike's `gdiffmk' package.
+
+ * contrib/gdiffmk/*: New files.
+ * Makefile.in (OTHERDIRS): Add contrib/gdiffmk.
+ * NEWS: Updated.
+
+2004-12-08 Werner LEMBERG <wl@gnu.org>
+
+ 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 <gaius@glam.ac.uk>
+
+ 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 <dradul@etb.net.co>
+
+ * man/groff_char.man: Minor imrovements.
+
+2004-12-04 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/eqn/eqn.man: Revised.
+
+2004-11-25 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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</p>', not `HTML'.
+
+ * doc/webpage.ms: Minor updates.
+
+2004-11-23 Larry Kollar <kollar@alltel.net>
+
+ 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 <doarhop@hotmail.com>
+
+ * tmac/s.tmac (ref*add-V, ref*add-N): New macros for handling
+ the volume and number refer entries.
+
+2004-11-22 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * tmac/www.tmac (HTML-NS, HTML-TAG-NS, HTML-TAG-NEXT): Simplified.
+ (HTML</p>): Minor clean-up.
+
+ * tmac/groff_www.man: Updated.
+
+ * src/devices/grohtml/grohtml.man: Revised and updated.
+
+ * NEWS: Updated.
+
+2004-11-18 Gaius Mulley <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * NEWS, README, doc/webpage.ms: Updated.
+
+ * tmac/www.tmac (HTML, HTML-TAG): Minor clean-ups.
+
+2004-10-30 Gaius Mulley <gaius@glam.ac.uk>
+
+ * 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 <hoffmann@usm.uni-muenchen.de>
+
+ * src/preproc/tbl/table.cpp (table::do_row): Fix handling of the `d'
+ column key letter suffix.
+
+2004-10-14 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * 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</p>, 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</p>|.
+ (LI): Call `www:paraspace'.
+ (HEAD): New macro.
+
+2004-10-11 Gaius Mulley <gaius@glam.ac.uk>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ * tmac/trace.tmac: Fix handling of `am' and `am1' calls.
+
+2004-10-06 Gaius Mulley <gaius@glam.ac.uk>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * tmac/html.tmac: Handle \[sqrtex].
+
+2004-10-04 Gaius Mulley <gaius@glam.ac.uk>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ * INSTALL.gen: Updated (taken from texinfo CVS).
+
+2004-09-28 Werner LEMBERG <wl@gnu.org>
+
+ * NEWS: Updated.
+
+2004-09-28 Heinz-Jürgen Oertel <hj.oertel@surfeu.de>
+
+ * tmac/groff_www.man: Revised and updated.
+
+2004-09-26 Werner LEMBERG <wl@gnu.org>
+
+ 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 <keith.d.marshall@ntlworld.com>
+
+ * tmac/groff_ms.man, doc/groff.texinfo (ms Document Control
+ Registers): Document changes from 2004-09-19.
+
+2004-09-23 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/an-old.tmac (ne): Using default scaling operator.
+
+2004-09-19 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ 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 <keith.d.marshall@ntlworld.com>
+
+ * NEWS, doc/groff.texinfo (ms Display and Keeps), tmac/groff_ms.man:
+ Document the deletion of `Ds' and `De' macros.
+
+2004-09-10 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * tmac/doc.tmac (An): Fix error message.
+
+2004-08-06 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <doarhop@hotmail.com>
+
+ * 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 <wl@gnu.org>
+
+ * src/preproc/soelim/soelim.man: Improved. Based on suggestions
+ from Tadziu Hoffmann.
+
+2004-08-03 Werner LEMBERG <wl@gnu.org>
+
+ * doc/meref.me: Document `_M' register.
+
+2004-08-03 Martin Husemann <martin@duskware.de>
+
+ 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 <wl@gnu.org>
+
+ * 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 <jeff_conrad@msn.com>
+
+ * 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 <egil@kvaleberg.no>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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
+ (Colors): Document new requests.
+
+2004-07-24 Werner LEMBERG <wl@gnu.org>
+
+ 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 (ms Document Control
+ Registers), NEWS: Document it.
+
+2004-07-19 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wiz@netbsd.org>
+
+ * tmac/doc-syms (doc-str-St--p1003.1-2004): New string.
+ * tmac/groff_mdoc.man: Updated.
+
+2004-07-05 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo (Manipulating Hyphenation): Further improve
+ documentation of `hcode'.
+
+2004-07-04 Sang Dae Yu <sdyu@bh.knu.ac.kr>
+
+ 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 <hj.oertel@surfeu.de>
+
+ * tmac/groff_www.man: Update documentation of .MPIMG.
+
+2004-07-03 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/an-old.tmac (RI): Always start with font `R'.
+ (RI, IR): Properly end with font `R'.
+
+2004-07-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ Implement two new conditional operators `F <name>' and `S <name>'
+ which check whether <name> 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * src/preproc/tbl/main.cpp (process_data) <GOT_RIGHT_BRACE>: Handle
+ `nospaces' option.
+
+2004-06-10 Colin Percival <colin.percival@wadham.ox.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ * Makefile.sub (install_data): New target.
+
+2004-06-04 Werner LEMBERG <wl@gnu.org>
+
+ * src/libs/libxutil/Makefile.sub (EXTRA_CFLAGS): Define.
+
+2004-06-03 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <sagawa@sohgoh.net>
+
+ * Makefile.in (CPPFLAGS): Define.
+ (MDEFINES): Add CPPFLAGS.
+
+2004-05-27 Werner LEMBERG <wl@gnu.org>
+
+ * arch/misc/Makefile.sub (shdeps.sed): Use $(srcdir).
+
+2004-05-26 Niklas Edmundsson <nikke@acc.umu.se>
+
+ 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 <bwarken@mayn.de>
+
+ * src/preproc/pic/pic.man, doc/pic.ms: Add example for `command'.
+
+2004-05-25 Werner LEMBERG <wl@gnu.org>
+
+ * src/libs/libgroff/cset.cpp, src/libs/libgroff/lf.cpp,
+ src/libs/libgroff/color.cpp: Include lib.h.
+
+2004-05-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ * 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 <wl@gnu.org>
+
+ * PROBLEMS: Document problems with gcc 3.4.0 on Sun. Reported
+ by Paul Eggert.
+
+2004-05-15 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * arch/misc/Makefile.sub (shdeps.sed): Don't use `$<' in explicit
+ rule.
+
+2004-05-14 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+Version 1.19.1 released
+=======================
+
+2004-05-10 Stephen Gildea <http://www.gildea.com/stephen>
+
+ * src/preproc/refer/label.y (same_author_last_name,
+ same_author_name): Handle empty sort keys.
+
+2004-05-10 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <jschauma@netmeister.org>
+
+ * 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 <keith.d.marshall@ntlworld.com>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <kollar@alltel.net>
+
+ 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 <wl@gnu.org>
+
+ * install-sh, mkinstalldirs: New versions; taken from texinfo CVS.
+
+2004-04-17 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <keith.d.marshall@ntlworld.com>
+
+ * tmac/s.tmac (@init, RP): Allow initialization of the PO register
+ before the first page.
+
+2004-04-14 Thomas Klausner <wiz@netbsd.org>
+
+ * 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 <ahaas@airmail.net>
+
+ * src/utils/hpftodit/hpuni.cpp (hp_msl_to_unicode_list): Don't
+ use anonymous type.
+
+2004-04-09 Art Haas <ahaas@airmail.net>
+
+ * src/utils/tfmtodit.cpp (lig_chars): Don't use anonymous type.
+
+2004-04-09 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * arch/misc/shdeps.sh: Generate better comment for sed script.
+
+2004-04-08 Art Haas <ahaas@airmail.net>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * Makefile.sub (DISTCLEANFILES): Add `test-groff'.
+
+2004-04-06 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ 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 <keith.d.marshall@ntlworld.com>
+
+ * src/roff/nroff/nroff.sh: Implement work-around for sh.exe from
+ Cygwin which doesn't handle stderr correctly.
+
+2004-03-08 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile.comm (install_dev, uninstall_dev): Protect `for' loops
+ against empty argument. Problem reported by <cgd@broadcom.com>.
+
+2004-03-05 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * 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.
+
+ * 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 <wl@gnu.org>
+
+ * font/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 <wl@gnu.org>
+
+ * src/devices/grolj4/lj4.cpp (main): Fix argument of getopt_long.
+ s/operand/argument/ in error message.
+
+2004-03-01 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * src/roff/groff/groff.cpp (main): Don't allow option -o if -Thtml
+ is in use.
+
+2004-03-01 Antti Kantee <pooka@netbsd.org>
+
+ * tmac/s.tmac (XE): Fix error message.
+
+2004-02-27 Jeff Conrad <jeff_conrad@msn.com>
+
+ * 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 <keith.d.marshall@ntlworld.com>
+
+ * 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 <wl@gnu.org>
+
+ * src/roff/troff/troff.h (WARN_TOTAL): Fix value.
+
+2004-02-21 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * 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 <jeff_conrad@msn.com>
+
+ * src/preproc/html/pre-html.cpp [__CYGWIN__ ...]: Declare
+ spawnvp_wrapper.
+ [MAY_SPAWN_ASYNCHRONOUS_CHILD]: Declare i and j.
+
+2004-02-20 Jeff Conrad <jeff_conrad@msn.com>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * font/devlj4/Makefile.sub (DEVFILES): Updated to contain all
+ new font and mapping files.
+
+2004-02-18 Jeff Conrad <jeff_conrad@msn.com>
+ Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * 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 <wl@gnu.org>
+
+ * 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ú <pandres@dragonet.es>
+
+ * src/devices/grolbp/lbp.h (vmdvarc): Fix formatting string.
+
+2004-01-25 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * font/devlj4/generate/Makefile (SYMBOL): Use 9nb28703.tfm.
+
+2004-01-16 Jeff Conrad <jeff_conrad@msn.com>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <jeff_conrad@msn.com>
+
+ * 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 <wl@gnu.org>
+
+ * README: Mention ffii's viewcvs access.
+
+2004-01-09 Werner LEMBERG <wl@gnu.org>
+
+ * font/devlj4/generate/special.map: Map MSL 228 to U+221F.
+
+2004-01-09 Jeff Conrad <jeff_conrad@msn.com>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * src/roff/troff/node.cpp (space_node::get_breakpoints,
+ space_node::nbreaks): Protect against zero `next' field.
+
+2004-01-03 Jeff Conrad <jeff_conrad@msn.com>
+
+ 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 <wl@gnu.org>
+
+ * font/devlj4/generate/text.map: Add more MSL numbers.
+
+2004-01-02 Jeff Conrad <jeff_conrad@msn.com>
+
+ * 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 <wl@gnu.org>
+
+ * font/devlj4/generate/text.map, font/devlj4/generate/special.map:
+ Fix placement of comments.
+
+2004-01-01 Jeff Conrad <jeff_conrad@msn.com>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <jeff_conrad@msn.com>
+
+ * 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 <wl@gnu.org>
+
+ * font/devlj4/generate (text.map, special.map): Rewritten to work
+ with the new hpftodit version.
+
+2003-12-30 Jeff Conrad <jeff_conrad@msn.com>
+
+ * src/utils/hpftodit/hpftodit.cpp (output_charset): Emit HP symbol
+ set and 8bit character code for all glyphs also.
+
+2003-12-30 Werner LEMBERG <wl@gnu.org>
+
+ * src/libs/libgroff/strcasecmp.c: Updated from gnulib.
+
+2003-12-29 Werner LEMBERG <wl@gnu.org>
+
+ More fixes for MSVC compiler.
+
+ * doc/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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <jeff_conrad@msn.com>
+
+ 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 <wl@gnu.org>
+
+ * src/include/nonposix.h (read) [_MSC_VER]: Define.
+
+2003-12-24 Werner LEMBERG <wl@gnu.org>
+
+ * src/utils/afmtodit/afmtodit.man: Some reformulations as suggested
+ by Michail Vidiassov <master@iaas.msu.ru>.
+
+2003-12-20 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <nilgun@superonline.com>
+
+ * tmac/latin5.tmac: New file.
+
+2003-12-19 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * src/devices/grops/ps.cc (ps_output::put_float): Revert change
+ from 2001-10-04.
+ Remove trailing zeros.
+
+2003-12-17 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * doc/groff.texinfo: Document `dt' request correctly.
+ Other minor typographical improvements.
+
+2003-12-10 Michail Vidiassov <master@iaas.msu.ru>
+
+ * src/utils/afmtodit/Makefile.sub (afmtodit): Fix typo.
+
+2003-12-10 Richard Stallman <rms@gnu.org>
+
+ * LICENSE: Better wording.
+
+2003-12-09 Werner LEMBERG <wl@gnu.org>
+
+ * aclocal.m4 (GROFF_BROKEN_SPOOLER_FLAGS): Set default value to 0.
+ * configure, NEWS: Updated.
+
+2003-12-08 Werner LEMBERG <wl@gnu.org>
+
+ * FDL: Updated to version 1.2 (from www.gnu.org/copyleft).
+
+2003-12-07 Bernd Warken <bwarken@mayn.de>
+
+ * LICENSE: Updated.
+
+2003-12-07 Werner LEMBERG <wl@gnu.org>
+
+ * INSTALL: Improved.
+
+2003-12-05 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ 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 <wl@gnu.org>
+
+ * src/include/nonposix.h (PATH_SEP_CHAR): New definition.
+ Replace `PATH_SEP[0]' with `PATH_SEP_CHAR' everywhere.
+
+2003-12-04 Bernd Warken <bwarken@mayn.de>
+
+ * LICENSE: New file.
+
+2003-12-03 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <jeff_conrad@msn.com>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <keith.d.marshall@ntlworld.com>
+
+ * src/preproc/htlp/pre-html.cpp (__tmpfile): Renamed to
+ `DEBUG_FILE'.
+ Updated all users.
+
+2003-12-01 Werner LEMBERG <wl@gnu.org>
+
+ * groff.texinfo: Document special behaviour of `.vs 0'.
+ Improve documentation of `cflags' request.
+ * NEWS: Updated.
+
+2003-11-29 Werner LEMBERG <wl@gnu.org>
+
+ * font/devlj4/generate/Makefile (CORONET): Use correct TFM.
+ * font/devlj4/CORONET: Regenerated.
+
+2003-11-24 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <keith.d.marshall@ntlworld.com>
+
+ * src/roff/groff/pipeline.c (xstrsignal): Fix usage of
+ HAVE_DECL_SYS_LIST.
+
+2003-11-17 Werner LEMBERG <wl@gnu.org>
+
+ * COPYING: Use correct version.
+
+2003-11-11 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * src/devices/grops/grops.man: Improve section on creating EPS.
+
+2003-10-29 Werner LEMBERG <wl@gnu.org>
+
+ * contrib/pic2graph/pic2graph.sh: Fix typo (-P-letter ->
+ -P-pletter).
+
+2003-10-28 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Fix documentation of `.if'.
+
+2003-10-27 Michail Vidiassov <master@iaas.msu.ru>
+
+ * src/utils/afmtodit/afmtodit.pl: Handle unmapped characters of
+ the form `uniXXXX' also.
+
+2003-10-27 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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) <token::TOKEN_NEWLINE>: Call
+ `trapping_blank_line' depending on `old_have_input', not
+ `have_input'.
+
+2003-10-20 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <keith.d.marshall@ntlworld.com>
+
+ 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 <keith.d.marshall@ntlworld.com>
+
+ * 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-12 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <millerp@canb.auug.org.au>
+
+ * 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 <ru@FreeBSD.org>
+
+ 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 <ru@FreeBSD.org>
+
+ * tmac/doc-common (doc-default-operating-system): New variable.
+ (Os): Use it.
+
+2003-09-08 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/doc.tmac (doc-reset-reference): Handle data for `%I' also.
+
+2003-08-31 Werner LEMBERG <wl@gnu.org>
+
+ * 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-23 Stephen Gildea <http://www.gildea.com/stephen>
+
+ * src/preproc/refer/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 sorted before all entries that
+ have that field, before refer looks to the next field.
+
+2003-08-23 Werner LEMBERG <wl@gnu.org>
+
+ * src/utils/pfbtops/Makefile.sub (LINK.c): Define it so that the
+ g++ linker is used. Reported by Mark J. Reed
+ <mark.reed@turner.com>.
+
+2003-08-16 Heinz-Jürgen Oertel <hj.oertel@surfeu.de>
+
+ 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 <wl@gnu.org>
+
+ * doc/groff.texinfo: Minor fixes.
+
+2003-08-09 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/an-old.tmac [cR]: Fix redefinition of `bp'.
+
+2003-08-07 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <hj.oertel@surfeu.de>
+
+ 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 <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ * src/libs/libgroff/strerror.c: Include errno.h to be in sync with
+ the corresponding test in aclocal.m4.
+
+2003-07-21 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * PROBLEMS: Add solution for UTF-8 problem with hyphens.
+
+2003-07-18 Werner LEMBERG <wl@gnu.org>
+
+ * *.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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * doc/Makefilesub (HTMLDOCFILESALL): New macro.
+ (HTMLDOCFILES): Revert to `pic.html'.
+ (CLEANADD, install_html, uninstall_sub): Use HTMLDOCFILESALL.
+
+2003-07-11 Werner LEMBERG <wl@gnu.org>
+
+ * doc/pic.ms: Improve documentation of absolute coordinates.
+ Document absolute positioning of pictures.
+
+ * NEWS: Add new pic capability.
+
+2003-07-09 Hartmut Henkel <hartmut_henkel@gmx.de>
+
+ * src/libs/libgroff/geometry.cpp (check_output_arc_limits):
+ Rewritten.
+
+2003-07-07 Werner LEMBERG <wl@gnu.org>
+
+ Implement support for dashed and dotted ellipses in pic. Based on
+ a patch from Hartmut Henkel <hartmut_henkel@gmx.de>.
+
+ * 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 <wl@gnu.org>
+
+ Make grotty work on platforms which have unsigned char as the
+ default for char. Based on a patch by Thomas Klausner
+ <wiz@netbsd.org>.
+
+ * 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 <ru@FreeBSD.org>
+
+ * src/roff/nroff/nroff.sh: Add option -d for completeness.
+ * src/roff/nroff/nroff.man: Updated.
+
+2003-07-05 Werner LEMBERG <wl@gnu.org>
+
+ * NEWS, tmac/groff_www.man: Updated.
+ * doc/Makefile.sub: Updated.
+
+2003-07-05 Gaius Mulley <gaius@glam.ac.uk>
+
+ 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 <ru@FreeBSD.org>
+
+ * tmac/groff_mdoc.man: Improve documentation of punctuation
+ characters.
+
+2003-07-04 Ruslan Ermilov <ru@FreeBSD.org>
+
+ * tmac/doc.tmac (Bd): Change to doc-Li-font later.
+
+2003-07-03 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/an-old.tmac [cR]: Redefine `bp' to avoid empty lines.
+
+2003-07-01 Ruslan Ermilov <ru@FreeBSD.org>
+
+ * 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.
+
+ * tmac/groff_mdoc.man: Updated.
+
+2003-07-01 Werner LEMBERG <wl@gnu.org>
+
+ 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 <cjwatson@debian.org>
+
+ * src/xditview/*.c: Add prototypes, fix return types, add includes.
+ Based on work by Fumitoshi UKAI <ukai@debian.or.jp>.
+
+2003-06-31 Ruslan Ermilov <ru@FreeBSD.org>
+
+ * tmac/tty-char.tmac: Provide `lb', `rb', `lk', `rk', `lt', `rt'.
+
+2003-06-31 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * Makefile.in (SHELL): Define as @SHELL@.
+ (mkinstalldirs): Use $(SHELL).
+ (MDEFINES): Add $(SHELL).
+ * Makefile.comm (SHELL): Removed.
+
+2003-06-29 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <goulding@Princeton.EDU>
+
+ * tmac/e.tmac (@C): Handle .ad also.
+
+2003-06-12 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/tbl/tbl.man: Document formatting of text blocks.
+
+ * src/roff/troff/input.cc (token::next) <handle_escape_char>:
+ 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 <wl@gnu.org>
+
+ * README.WIN32: Removed.
+ * MANIFEST: Updated.
+
+2003-06-07 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/nroff/nroff.sh: Don't emit SGR for option -u.
+
+2003-06-05 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/pic/pic.y <sprintf_args>: Implement workaround for bug
+ in Compaq C++ V6.5-033 for Compaq Tru64 UNIX V5.1A (Rev. 1885).
+
+2003-06-03 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/grn/hdb.cpp (DBRead): Don't close file handle; this
+ is done by the calling function.
+
+2003-05-22 Ruslan Ermilov <ru@FreeBSD.org>
+
+ * tmac/X.tmac: Fix definition of `em'.
+
+2003-05-22 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/input.cc (return_macro_request): Fix detection of
+ argument.
+
+2003-05-18 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <kollar@alltel.net>
+
+ * tmac/groff_ms.man, doc/groff.texinfo: Improve documentation of
+ registers `FPS', `FVS', and `FPD'.
+
+2003-05-15 Werner LEMBERG <wl@gnu.org>
+
+ * src/utils/pfbtops/pfbtops.c (get_text): Handle loop counter
+ correctly.
+
+2003-05-03 Ruslan Ermilov <ru@FreeBSD.org>
+
+ * tmac/groff_mdoc.man: Slight improvements.
+
+2003-05-03 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * TODO: Updated.
+
+2003-05-01 Ruslan Ermilov <ru@FreeBSD.org>
+
+ * tmac/doc-common (Nd): Use \[em].
+
+2003-05-01 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * REVISION: Set to 1.
+
+ * doc/pic.ms: Document possible problems with `figname'.
+
+2003-04-29 Werner LEMBERG <wl@gnu.org>
+
+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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ * src/devices/grohtml/post-html.cpp (html_printer::~html_printer):
+ Use a loose DTD.
+
+2003-04-24 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * src/preproc/pic/tex.cpp (tex_output::start_picture): Fix TeX code.
+ * doc/pic.ms: Fixed.
+
+2003-04-21 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ Add keyword `figname' to pic, specifying the name of the picture
+ box in TeX mode. Based on a patch from William J Poser
+ <wjposer@unagi.cis.upenn.edu>.
+
+ * src/preproc/pic/pic.y: New token `FIGNAME'.
+ (macro_name): New rule of type <str>.
+ (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 <hartmut_henkel@gmx.de>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ Renamed all `*.cc' files to `*.cpp'.
+ Updated all configuration files, makefiles, and documentation.
+
+2003-04-14 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/hyphenex.sh: Slight improvements.
+
+2003-04-13 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * doc/groff.texinfo, man/groff_out.man: \S only accepts integer
+ values.
+
+2003-04-10 Werner LEMBERG <wl@gnu.org>
+
+ * PROBLEMS: Revised.
+
+2003-04-10 Bernd Warken <bwarken@mayn.de>
+
+ * doc/webpage.ms: Improved.
+
+2003-04-09 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * man/groff_out.man: Document negative values of `N' if -Thtml is
+ used.
+
+2003-04-06 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile.comm (depend.temp): Check location of YTABC.
+
+2003-04-05 Maciej W. Rozycki <macro@ds2.pg.gda.pl>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 &nbsp; 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
+ &nbsp; 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-<width>'.
+ * 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 <osa@freebsd.org.ru>
+
+ * man/roff.man: Small fixes.
+
+2003-04-03 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * src/devices/grohtml/html-text.cc (html_text::do_space): Handle
+ `space_emitted' properly.
+
+2003-03-31 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ Make groff emit `&nbsp;' 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 `&nbsp' at position 0xA0 (as defined
+ in the HTML standard).
+
+2003-03-29 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ src/devices/grops/ps.cc (ps_printer::do_import): Fix error message.
+
+2003-03-27 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/an-old.tmac (BT): Don't call .tl if register `ps4html' is
+ defined.
+
+2003-03-20 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/env.cc (vertical_spacing): Allow zero value for
+ `.vs'.
+ * doc/groff.texinfo: Updated.
+
+2003-03-19 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/input.cc (process_input_stack) <TOKEN_BEGIN_TRAP,
+ TOKEN_END_TRAP>: Reset `have_input'.
+
+2003-03-18 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/groff/groff.man: Mention groff_trace man page.
+
+2003-03-16 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <cjwatson@debian.org>
+
+ * src/roff/groff/groff.man: Minor syntax fix.
+
+2003-03-14 Egil Kvaleberg <egil@kvaleberg.no>
+
+ * src/devices/grops/ps.cc (ps_printer::media_set,
+ ps_printer::~ps_printer): Handle zero paper width and length.
+
+2003-03-13 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ Make variable `pr' local to libdriver/input.cc. Based on a patch
+ by Bernd Warken <bwarken@mayn.de>.
+
+ * 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 <wl@gnu.org>
+
+ * 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 embarrassing
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * src/roff/troff/input.cc (charinfo_to_node_list): Reset
+ `have_input'.
+
+2003-03-03 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile.sub (DISTCLEANFILES): Add gxditview._man.
+
+ * font/devps/generate/textmap: Remove entry `similarequal'.
+ * font/devps/symbolmap: Updated.
+
+2003-03-02 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ Document composite glyphs and the `composite' request.
+
+ * man/groff.man, man/groff_diff.man, doc/groff.texinfo: Do it.
+
+2003-02-28 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <egil@kvaleberg.no>
+
+ * 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 <ralph@inputplus.co.uk>
+
+ * 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 <kollar@alltel.net>
+
+ 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 <wl@gnu.org>
+
+ * 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 <jjramsey_6x9eq42@yahoo.com>.
+ * 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 <gaius@glam.ac.uk>
+
+ * 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 <wl@gnu.org>
+
+ * src/devices/grops/ps.cc (ps_printer::define_encoding): Avoid
+ buffer overflow.
+
+2003-02-24 Werner LEMBERG <wl@gnu.org>
+
+ 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 <gaius@glam.ac.uk>
+
+ * src/devices/grohtml/post-html.cc (element_list::~element_list):
+ New destructor, fixing a major memory leak.
+
+2003-02-22 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <gaius@glam.ac.uk>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * src/devices/grotty/tty.cc (tty_printer::tty_printer): Fix pointer
+ to `dummy'.
+
+2003-02-14 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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) <POLYGON>: 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 <wl@gnu.org>
+
+ * src/roff/troff/input.cc (do_name_test, do_expr_test,
+ do_zero_width): Push `\n' if closing delimiter is missing.
+
+ (token::next) <ESCAPE_NEWLINE>, <'\n'>, <\'\n'>: Reset `have_input'.
+ <'F'>: Make \F non-transparent at the beginning of line.
+ (process_input_stack) <token::TOKEN_CHAR, token::TOKEN_NEWLINE,
+ token::TOKEN_REQUEST, token::TOKEN_BEGIN_TRAP>: 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 <wl@gnu.org>
+
+ * 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) <POLYGON>: 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <type>[1]'.
+
+ * src/preproc/eqn/lex.cc (init_table, do_definition): Use `new
+ <type>[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
+ <type>[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 <type>[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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * src/utils/indxbib/indxbib.cc (main) [__EMX__]: Fix typo:
+ s/unline/unlink/.
+
+2003-01-25 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo (Ligatures and Kerning): Mention limitations.
+
+2003-01-24 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * NEWS: Updated.
+
+2003-01-16 Jörgen Grahn <jgrahn@algonet.se>
+
+ * src/preproc/refer/refer.man: Mention REFER environment variable.
+
+2003-01-05 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ `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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <cjwatson@debian.org>
+
+ * contrib/pic2graph/pic2graph.sh: Add missing `;;'.
+
+2002-12-10 Werner LEMBERG <wl@gnu.org>
+
+ 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 <dvi>: Use `integral' instead of `is' glyph.
+
+2002-12-08 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <jeff_conrad@msn.com>
+
+ * src/roff/groff/pipeline.c: Don't define `const' for _WIN32.
+ (run_pipeline) [_WIN32]: Provide working function without `fork'.
+
+2002-12-06 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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
+ directory.
+
+ * tmac/europs.tmac: Updated to new glyph indices.
+ Use Euro.symbol for font family `A'.
+
+ * doc/groff.texinfo: Minor improvements.
+
+2002-12-02 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * src/roff/troff/node.cc (troff_output_file::put_char): Always
+ call flush_tbuf.
+
+2002-11-10 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <kollar@alltel.net>
+
+ * PROBLEMS: Document how to solve Mac OS X compilation problems.
+
+2002-11-02 Werner LEMBERG <wl@gnu.org>
+
+ 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 <ru@FreeBSD.org>
+
+ * src/roff/nroff/nroff.man, src/roff/nroff/nroff.sh: Fix description
+ of options.
+
+2002-10-29 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * tmac/www.tmac (DC): Fix case of overlapping images.
+
+2002-10-23 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * doc/groff.texinfo, man/groff_tmac.man: Document that it is not
+ possible to use multiple main macro packages.
+
+2002-10-19 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <wl@gnu.org>
+
+ * NEWS, doc/webpage.ms: Updated.
+
+2002-10-14 Werner LEMBERG <wl@gnu.org>
+
+ * 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 <ru@FreeBSD.org>
+
+ 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 <ru@FreeBSD.org>
+
+ * 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 <wl@gnu.org>
+
+ * REVISION: Increased to 2.
+
+Copyright 2002-2005 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+Local Variables:
+coding: latin-1
+fill-column: 72
+mode: change-log
+version-control: never
+End:
+vim:set autoindent textwidth=72:
diff --git a/ChangeLog.120 b/ChangeLog.120
new file mode 100644
index 0000000..0451689
--- /dev/null
+++ b/ChangeLog.120
@@ -0,0 +1,3053 @@
+
+Version 1.20.1 released
+=======================
+
+ `gnu.png' isn't needed any more.
+
+ * doc/Makefile.in: Don't handle or create `gnu.png'.
+ Update all affected targets.
+
+ * doc/Makefile.sub: Don't handle or create `gnu.png'.
+ Update alll affected targets.
+
+
+ `gnu.eps' was missing in the tarball.
+ Problem reported by Patrik Gräser.
+
+ (PROCESSEDEXAMPLEFILES): Remove `gnu.eps'.
+ (MOSTLYCLEANNOTSRCDIRADD): Fix names of info files.
+ (install_data): Handle `gnu.eps' specially.
+
+ * MORE.STUFF: Mention texi2html's troff backend.
+ Mention http://groff.ffii.org/groff/contrib.
+
+ * README: Mention `MORE.STUFF'.
+
+ * NEWS, doc/webpage.ms, doc/groff.texinfo: Updated.
+
+2009-01-08 Werner LEMBERG <wl@gnu.org>
+
+ * */Makefile.* (CLEANADD, CLEANNOTSRCDIRADD, CLEANDIRADD): Renamed
+ to...
+ (MOSTLYCLEANADD, MOSTLYCLEANNOTSRCDIRADD, MOSTLYCLEANDIRADD): This.
+
+2009-01-06 Werner LEMBERG <wl@gnu.org>
+
+ Remove heuristics for LIBEXT.
+
+ * configure.ac: Provide LIBEXT.
+ * Makefile.in: Use it.
+
+ * configure: Regenerated.
+
+2009-01-05 Werner LEMBERG <wl@gnu.org>
+
+Version 1.20 released
+=====================
+
+2009-01-05 Werner LEMBERG <wl@gnu.org>
+
+ * */*: Update FDL 1.1 to FDL 1.3.
+
+2009-01-05 Werner LEMBERG <wl@gnu.org>
+
+ * */*: Update copyright year.
+
+2009-01-05 Werner LEMBERG <wl@gnu.org>
+
+ * MANIFEST: Updated.
+
+2009-01-05 Werner LEMBERG <wl@gnu.org>
+
+ * doc/texinfo.tex (\key): Fix excessive whitespace.
+ (\texinfoversion): Tag file as patched.
+
+2009-01-05 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/s.tmac (@TS, TE, @EQ, @EN), tmac/an-old.tmac (TS, TE, EQ,
+ EN), tmac/e.tmac (TS, TE, EQ, EN): Set line length to a large value
+ if processed with -Thtml.
+
+2009-01-04 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/www.tmac (TS, TE, EQ, EN): Set line length to a large value
+ if processed with -Thtml to avoid warning messages (from code
+ inserted by tbl, for example).
+
+2009-01-04 Gunnar Florus <http://florus.no>
+
+ * */*: Update GPL2 to GPL3.
+
+2009-01-04 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile.in (dist): Don't use soft links but copy files to
+ preserve the file's time stamps.
+ * Makefile.sub (configure): Remove `autom4te.cache'.
+
+2009-01-04 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/de.tmac: Fix German date strings. Reported by Axel Kielhorn.
+
+2009-01-04 Werner LEMBERG <wl@gnu.org>
+
+ * doc/texinfo.tex: Updated from `texinfo' CVS repository.
+ * doc/txi-en.tex: New file from `texinfo' CVS repository.
+
+2009-01-04 Werner LEMBERG <wl@gnu.org>
+
+ * font/make-Rproto: Moved to...
+ * font/util/make-Rproto: Here.
+
+ * Makefile.in (NOMAKEDIRS): Add `m4', `font/devps/old', and
+ `font/util'.
+
+2009-01-04 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/TODO: Mention local variables.
+
+2009-01-03 Werner LEMBERG <wl@gnu.org>
+
+ * contrib/hdtbl/examples/col_rowspan_colors.roff,
+ contrib/hdtbl/examples/color_boxes.roff,
+ contrib/hdtbl/examples/color_nested_tables.roff,
+ contrib/hdtbl/examples/color_table_cells.roff,
+ contrib/hdtbl/examples/color_transitions.roff,
+ contrib/hdtbl/examples/short_reference.roff: Minor improvements.
+
+2009-01-03 Werner LEMBERG <wl@gnu.org>
+
+ * doc/webpage.ms: Updated.
+
+2009-01-03 Werner LEMBERG <wl@gnu.org>
+
+ * NEWS, doc/groff.texinfo, font/devps/*, VERSION, REVISION: Prepare
+ for version 1.20.
+
+2009-01-03 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/tbl/table.cpp (table::compute_expand_width,
+ table::compute_separation_factor): In warning messages, don't refer
+ to pages but to input line numbers.
+
+2009-01-03 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/groff_ms.man: Improve formatting of tables.
+
+2009-01-03 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/www.tmac (www->): Handle XHTML.
+ (HTML</p>): Handle non-HTML devices.
+ (www:url_check_tag): Avoid warnings.
+
+2009-01-03 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/an-old.tmac, tmac/doc.tmac: For -Tutf8, map \-, -, ', and `
+ conservatively to ASCII for the sake of easy cut and paste.
+
+2009-01-03 Werner LEMBERG <wl@gnu.org>
+
+ * NEWS: Mention hdtbl.
+
+2009-01-02 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/groff_mdoc.man: Update OS version string listing.
+
+2009-01-02 Werner LEMBERG <wl@gnu.org>
+
+ * config.rpath, m4/codeset.m4, m4/glibc21.m4, m4/iconv.m4,
+ m4/lib-link.m4, m4/lib-prefix.m4, src/include/localcharset.h,
+ src/libs/libgroff/config.charset, src/libs/libgroff/localcharset.c,
+ src/libs/libgroff/ref-add.sin, src/libs/libgroff/ref-del.sin:
+ Updated from `gnulib' git repository.
+
+ * configure: Regenerated.
+
+2009-01-02 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/ptx.tmac: New file.
+
+ * NEWS, man/groff_tmac: man: Document it.
+
+2008-12-30 Werner LEMBERG <wl@gnu.org>
+
+ Fix more quoting issues.
+
+ * tmac/www.tmac (BCL, BGIMG, PIMG, MPIMG, LNS): For the sake of
+ XHTML, quote more arguments.
+ (IMG): Fix quoting.
+
+2008-12-30 Werner LEMBERG <wl@gnu.org>
+
+ Fix quoting issues in www.tmac.
+
+ * tmac/www.tmac (www:url_breaks_splitted): Renamed to...
+ (www:url_breaks_split): This.
+ (www->): New string to close tag singletons like <img> or <hr>. In
+ XHTML mode (not implemented yet), this has to be changed from `>' to
+ `/>'.
+ (IMG): Don't use </img>
+ Use www->.
+ (PIMG, MPIMG): Don't use </img>
+ Use www->.
+ Fix doublequote issues.
+ (HR): Don't use </hr>.
+ Use www->.
+ (LNS): Fix doublequote issues.
+
+2008-12-24 Michail Vidiassov <master@iaas.msu.ru>
+
+ * tmac/doc-common: Add entries for Mac OS X and FreeBSD.
+
+2008-12-22 Alexey Gladkov <legion@altlinux.ru>
+
+ * contrib/groffer/perl/roff2.pl: Fix syntax error.
+
+2008-12-15 Werner LEMBERG <wl@gnu.org>
+
+ * NEWS: Mention `preconv'.
+
+2008-11-12 Werner LEMBERG <wl@gnu.org>
+
+ Implement `x' specifier for expanded columns. Contrary to old DWB
+ tbl, more than a single `x' specifier can be used. At the same
+ time, remove most of the code from change 2007-02-09 which collides
+ with the new implementation.
+
+ * src/preproc/tbl/main.cpp (format): Add `expand' array.
+ (format::format, format::~format): Updated.
+ (input_entry_format): Add `expand' field.
+ (input_entry_format::input_entry_format): Updated.
+ (input_entry_format::debug_print): Handle `expand'.
+ (process_format): Handle `x' specifier.
+ (process_data): Updated.
+
+ * src/preproc/tbl/table.cpp (AVAILABLE_REG, COLCOUNT_REG): Remove.
+ (EXPAND_REG): New macro.
+ (table_entry::divert, block_entry::divert,
+ alphabetic_block_entry::divert): Add parameter to control whether
+ expanded columns shall be handled.
+ (block_entry::do_width): Remove.
+ (block_entry::do_divert): Add parameter to control whether expanded
+ columns shall be handled.
+ Treat expanded columns like columns with a minimum width.
+ Remove `experimental' code.
+ (table::table, table::~table, table::allocate): Updated.
+ (table::set_expand_column): New function.
+ (table::count_block_columns): Replace with...
+ (table::count_expand_columns): This function.
+ (table::divide_span): Handle expanded columns the same as equal
+ columns.
+ (table::sum_columns): Add parameter to control whether expanded
+ columns shall be handled.
+ (table::compute_available_block_width): Replace with...
+ (table::compute_expand_width): This function.
+ (table::compute_total_separation): New function, taking code from
+ `compute_separation_factor'.
+ (table::compute_separation_factor): Simpler code. The check for the
+ `EXPAND' flag has been moved to the caller.
+ (table::compute_widths): Add `top-level' changes to handle expanded
+ blocks.
+
+ * src/preproc/tbl/table.h (table): New field `total_separation'.
+ Remove `blockflag' array.
+ Add `expand' array.
+ Update member function declarations.
+
+ * src/preproc/tbl/tbl.man: Document `x' specifier.
+ Expand documentation to cover all aspects of Lesk's tbl reference.
+
+ * NEWS: Document `x' specifier.
+
+2008-11-08 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/tbl/tbl.man: Restructuring.
+ Improve text block documentation.
+
+2008-11-07 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/tbl/table.cpp (table::compute_widths): Use default
+ scaling operator for minimum width. Without this fix, `lw3' (or
+ `lw(3)' would be handled as a column with a minimum width of 3u
+ instead of 3n.
+
+2008-11-05 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/doc-common (Dt): Start a new page if necessary and set up
+ headers.
+
+ * tmac/andoc.tmac (reload-doc): Simplify due to change in
+ doc-common.
+
+ * NEWS: Document it.
+
+2008-10-18 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/tbl/main.cpp (process_format): Rename `x' and `X' to
+ `m' and `M', respectively.
+ Sort entries in `switch' block.
+ * src/preproc/tbl/tbl.man: Updated.
+ Sort key entries; other minor improvements.
+
+2008-10-17 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/tbl/table.cpp (table::compute_available_block_width):
+ New function.
+ (table::compute_widths): Replace some code with new function
+ (shifted to a more appropriate place).
+ * src/preproc/tbl/table.h: Updated.
+
+2008-10-16 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/doc-common (doc-operating-system-*), tmac/groff_mdoc.man: Add
+ NetBSD 4.0.1.
+
+2008-10-13 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/groff_mdoc.man: Update documentation on BSD-like OS string
+ versions.
+
+2008-10-10 Werner LEMBERG <wl@gnu.org>
+
+ * man/roff.man, doc/groff.texinfo: Improve the history part. This
+ is based on input from Tom Van Vleck <thvv@multicians.org>.
+
+
+ * src/preproc/eqn/sqrt.cpp (sqrt_box::compute_metrics): Assure that
+ value of `rst' register is not zero, as can happen for the HTML
+ output device. Otherwise, there are too many loops, and we get a
+ stack overflow because of recursion.
+
+2008-10-05 Stephen Gildea <http://www.gildea.com/stephen/>
+
+ * src/preproc/ref/ref.cpp (reference::compute_sort_key): Do
+ not insert SORT_SEP before the first field, so that sort_key
+ has the same format as before the patch of 2003-08-23.
+
+2008-10-04 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/doc-common (doc-operating-system-*): Update releases.
+
+ * tmac/an-old.tmac (an-extra1, an-extra2, an-extra3): Initialize.
+
+ * tmac/andoc.tmac: Rewritten, based on a preliminary version from
+ Tadziu Hoffmann. It can now process multiple man pages with both
+ man and mdoc formats intermixed.
+
+ * NEWS, tmac/groff_man.man, tmac/groff_mdoc.man,
+ man/groff_tmac.man: Document it.
+
+2008-10-04 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/input.cpp (do_suppress): Make \O[3], \O[4], and
+ \O[5] non-transparent w.r.t. beginning-of-line recognition (similar
+ to the other \O variants).
+
+ * tmac/www.tmac (TS, TE, EQ, EN): Don't use .als for setting up
+ default macros. This causes endless loops (at least for TE).
+
+ * doc/groff.texinfo: Improve documentation of `.als'.
+
+2008-10-03 Werner LEMBERG <wl@gnu.org>
+
+ * src/devices/grops/grops.man, src/roff/troff/troff.man,
+ src/preproc/soelim/soelim.man: Correct documentation of -I switch.
+ Reported by Larry Kollar.
+ Other minor formatting issues.
+
+2008-10-02 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/trace.tmac: Much improved.
+ (trace-full): New register to be set on the command line; it
+ controls whether number and string register assignments get traced
+ also.
+ (!!c): New macro for comments.
+ (rm): New traced macro.
+ (de, de1, am, am1): Use \\[xxx]\\ calling method to pass \$0 to
+ `!!xxx'; this makes doc.tmac completely traceable.
+ Trace call of .de and friends also.
+
+ * tmac/groff_tmac.man, NEWS: Update.
+
+2008-09-30 Werner LEMBERG <wl@gnu.org>
+
+ Restore behaviour of \$0 if a macro is called with string syntax
+ (problem caused by change on 2008-09-29).
+
+ * src/roff/troff/input.cpp (input_iterator, input_stack,
+ macro_iterator): Add `get_macro_name' member function.
+ (interpolate_string): Use it.
+
+2008-09-29 Werner LEMBERG <wl@gnu.org>
+
+ Make \\*[xxx]\\ within a macro (with `xxx' a macro too) work as
+ expected. Without the patch,
+
+ .de aaa
+ \\*[bbb]\\
+ . tm \\$*
+ ..
+ .de bbb
+ . shift
+ ..
+ .aaa 1 2 3
+
+ prints `2 3' instead of `1 2 3'.
+
+ * src/roff/troff/input.cpp (input_iterator, input_stack,
+ macro_iterator): Add `get_arg_list' member function.
+ (macro): Add `is_a_string', `is_string', and `clear_string_flag'
+ members.
+ Update constructors and operators.
+ (arg_list): Add copy constructor.
+ (macro_iterator): Add optional argument to constructor to indicate
+ whether arguments shall be inherited from calling macro.
+ (interpolate_string): If string argument is a macro, push a macro
+ iterator on the stack.
+ (do_define_macro): Call clear_string_flag if macro data contains a
+ newline.
+
+ * src/roff/troff/request.h: Updated.
+
+2008-09-29 Eric S. Raymond <esr@snark.thyrsus.com>
+
+ * doc/pic.ms: Fold in documentation of pic2plot(1) capabilities.
+ Improve the documentation of text objects.
+
+2008-09-28 Eric S. Raymond <esr@snark.thyrsus.com>
+
+ * contrib/pic2graph, contrib/pic2graph.man, contrib/eqn2graph,
+ contrib/eqn2graph.man: Tweak scripts to cope with incompatible
+ changes in ImageMagick crop options. Document the bugs.
+
+2008-09-28 Werner LEMBERG <wl@gnu.org>
+
+ If a macro is called as a string, inherit value of \n[.br] from the
+ caller. This is useful for `trace.tmac'.
+
+ * src/roff/troff/input.cpp (string_iterator): New members
+ `with_break' and `get_break_flag'.
+ (string_iterator::string_iterator): Updated.
+
+ * doc/groff.texinfo: Improve documentation of \$0 and string syntax
+ calling of macros.
+ Document behaviour of \n[.br] within strings.
+
+2008-09-26 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/trace.tmac: Add copyright message.
+ Use `.de1' where possible to make source code more readable.
+ (so, mso, als, rn): Restore escape character before executing the
+ request.
+ (de, de1, am, am1): Trace `.foo' also if called as `\\[foo]'.
+
+2008-09-24 Werner LEMBERG <wl@gnu.org>
+
+ Fix incompatibility between `.de1' and `.do'. Without this change,
+ the following snippet
+
+ .de1 xx
+ . tm \\n(.C
+ ..
+ .cp 1
+ .do xx
+
+ prints 1 instead of 0.
+
+ * src/roff/troff/input.cc (do_request): If a macro gets processed,
+ call tok.next().
+ (interpolate_macro): Add optional argument. Update callers.
+ (request::invoke): Add optional argument.
+ (macro::invoke): Add optional argument to delay call of tok.next().
+
+ * src/roff/troff/request.h (request_or_macro): Add argument to
+ `invoke' member. Update all derived classes.
+
+ * doc/groff.texinfo: Improve documentation of .do request.
+
+2008-09-09 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/an-old.tmac (FT): Initialize properly. Reported by Tadziu
+ Hoffmann.
+
+2008-09-06 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/doc-common (Dd, Os, Dt): Reset `doc-command-name' to make
+ `.Nm' work properly if next manual page is printed.
+
+2008-08-20 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/tbl/tbl.man: Document computation of element widths.
+
+2008-08-20 Alexey Gladkov <legion@altlinux.ru>
+ Werner LEMBERG <wl@gnu.org>
+
+ Add default encoding option -D to preconv and groff.
+
+ * src/preproc/preconv/preconv.cpp (default_encoding): Make it an
+ array.
+ Update all users.
+ (main): Handle new option -D.
+ (usage): Updated.
+ * src/preproc/preconv/preconv.man: Updated.
+
+ * src/roff/groff/groff.cpp (main): Handle new option -D.
+ (synopsis, help): Updated.
+ * src/roff/groff/groff.man: Updated.
+
+2008-07-26 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/eqnrc (.EQ, .EN): Provide default definitions. Reported
+ by Denis M. Wilson.
+
+ * tmac/www.tmac (.EQ, .EN, .TS, .TE): Fix definitions.
+
+2008-07-24 Denis M. Wilson <dmw@oxytropis.plus.com>
+
+ New options -f and -k for afmtodit.
+
+ * src/afmtodit/afmtodit.pl: New options `-f NAME' sets the internal
+ name of the groff font.
+ New option `-k' disables output of kerning data.
+ * src/afmtodit/afmtodit.man, NEWS: Document new options.
+
+2008-07-18 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/tbl/table.cpp (table::compute_separation_factor): Emit
+ warning messages if table gets squeezed.
+ (table::compute_widths): Fix computation of AVAILABLE_REG.
+ Emit warning if table is wider than line length.
+
+ * src/preproc/tbl/tbl.man: Minor improvements.
+
+2008-05-02 Larry Jones <lawrence.jones@siemens.com>
+
+ * contrib/chem/Makefile.sub (README, examples/README): In makefiles,
+ the `$<' macro is only guaranteed to be defined in inference rules,
+ not in explicit target rules. Since there is only one input file in
+ the places where it is used, the `$?' macro (which is guaranteed to be
+ defined for both kinds of rules) is a suitable replacement.
+
+ * hdtbl/examples/fonts_n.in, hdtbl/examples/fonts_n.in: Most
+ versions of ls don't have a `--color' option.
+
+2008-04-30 Larry Jones <lawrence.jones@siemens.com>
+
+ * Makefile.comm (depend.temp): Add `EXTRA_CCFLAGS'.
+
+2008-04-29 Larry Jones <lawrence.jones@siemens.com>
+
+ * src/eqn/script.cpp (script_box::output): Portability fix.
+
+2008-04-05 Dorai Sitaram <ds26gte@yahoo.com>
+
+ Add better support for `.TAG #<label>' in non-HTML documents: In
+ case of a forward reference in a call to .URL, write `(see below)'.
+ In case of a backwards reference use the page number instead. The
+ reference gets stored in a string `TAG_<label>' and can be
+ overridden while calling `.TAG' with its new optional argument --
+ this is useful for a second-pass system which resolves forward
+ references.
+
+ * tmac/www.tmac (www:url_check_tag): New function.
+ (URL): Use it.
+ (TAG): Add optional argument to define string `TAG_<label>'.
+
+2008-03-24 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/trace.tmac (so, mso): Added.
+
+ * tmac/www.tmac (PIMG): Replace `.ie' (without `.el') with `.if'.
+ If used with -mtrace, and this clause was active, the macro was
+ executed twice.
+
+ * tmac/pspic.tmac (PSPIC): Accept option `-C' for orthogonality.
+ This makes `.PIMG -C <file>' (from www.tmac) work on non-HTML
+ devices.
+ * man/groff_tmac.man: Document it.
+
+2008-02-26 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/input.cpp: s/safer_flag/unsafe_flag/.
+ Update all occurrences so that \n[.U] works as advertised. Bug
+ reported by Dorai Sitaram.
+
+2008-02-17 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Improve documentation of .cf request.
+
+2008-01-19 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/html/pre-html.cpp (usage): Don't describe options but
+ mention that it should never be called stand-alone.
+
+ * tmac/groff_www.man, doc/groff.texinfo, man/groff_font.man,
+ man/groff_tmac.man, man/groff_out.man, README, README.MinGW,
+ src/roff/groff/groff.man: Mention -Txhtml.
+
+ * man/groff_font.man, man/groff_tmac.man, man/roff.man: Revised.
+
+2008-01-16 Werner LEMBERG <wl@gnu.org>
+
+ * src/libs/libgroff/font.cpp (font::contains, font::get_code):
+ Handle single-letter names correctly.
+
+ * doc/groff.texinfo, man/groff_diff.man: Extend documentation of \^
+ and \|.
+ * NEWS: Updated.
+
+2008-01-15 Werner LEMBERG <wl@gnu.org>
+
+ * man/groff_font.man: Revised.
+
+2008-01-14 Werner LEMBERG <wl@gnu.org>
+
+ * man/groff.man: Mention glyph and characters.
+ Minor other updates.
+ * man/groff_char.man: Minor updates.
+ * man/groff_diff.man: Better clarification between characters and
+ glyphs.
+
+2008-01-12 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Fix top-level structure to make it compilable
+ again with all texinfo modes. Reported by Jörg van den Hoff
+ <j.van_den_hoff@fzd.de>.
+
+2008-01-11 Werner LEMBERG <wl@gnu.org>
+
+ * doc/pic.ms: Mention that compass points of line objects are
+ arbitrarily located.
+
+2008-01-06 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/node.cpp (left_italic_corrected_node::add_self):
+ Don't remove itself if there is no glyph associated with the node
+ yet. This happens, for example, in this situation:
+
+ .ll 15000u
+ .ft I
+ x x
+ (\,f
+
+2008-01-05 Werner LEMBERG <wl@gnu.org>
+
+ * man/groff_char.man, man/groff.man: Revised.
+
+ * src/preproc/eqn/lex.cpp (troff_defs): Fix typo.
+
+2008-01-04 Werner LEMBERG <wl@gnu.org>
+ * */*: s/Osanna/Ossanna/.
+
+ * */*.man: Replace .URL with .UR/.UE (except in groff_www.tmac).
+ Replace .MTO with .MT/.ME (except in groff_www.tmac).
+ Insert `\:' in URLs where appropriate.
+ Don't include www.tmac (except in groff_www.tmac).
+
+ * man/groff.man (.ESC[]): Fix font of closing bracket.
+ (.ESCq): Fix font of closing quote character.
+ Many other improvements.
+
+2007-12-30 Bernhard Fisseni <bfi@ikp.uni-bonn.de>
+
+ * src/devices/grohtml/post-html.cc
+ (html_printer::writeHeadMetaStyle): Fix CSS output.
+
+2007-12-29 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/ec.tmac: Add CM fonts to the .fspecial lines; those fonts
+ contain additional glyphs (like some uppercase Greek letters).
+
+2007-12-06 Werner LEMBERG <wl@gnu.org>
+
+ * NEWS: Updated.
+
+2007-12-06 Colin Watson <cjwatson@debian.org>
+
+ * src/roff/nroff/nroff.sh: Add options -w and -W.
+ * src/roff/nroff/nroff.man: Document them.
+
+2007-12-06 Karl Berry <karl@freefriends.org>
+
+ * tmac/hyphenex.pl: Update header output.
+
+2007-11-29 Werner LEMBERG <wl@gnu.org>
+
+ * src/devices/grotty/tty.cpp (tty_printer::line): Fix line lengths.
+
+2007-11-20 Werner LEMBERG <wl@gnu.org>
+
+ * doc/pic.ms: Add Heinz-Jürgen's 3d boxes example.
+
+2007-11-17 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/nroff/nroff.sh: Handle GROFF_TYPESETTER environment
+ variable. Problem reported by Michael G Schwern
+ <schwern@pobox.com>.
+
+ * src/roff/nroff/nroff.man: Document it.
+ Other minor updates.
+
+2007-11-17 Heinz-Jürgen Oertel <hj.oertel@t-online.de>
+
+ * src/groff/preproc/pic/lex.cpp (table): Add box attributes
+ `xslanted' and `yslanted'.
+
+ * src/groff/preproc/pic/object.cpp (object_spec::object_spec):
+ Initialize `xslanted' and `yslanted'.
+ (graphic_object): Add methods `set_xlanted' and `set_yslanted'.
+ (closed_object): Ditto.
+ Add members `xslanted' and `yslanted'.
+ (box_object::print): Use them.
+ (object_spec::make_object): Handle slant values.
+ * src/groff/preproc/pic/object.h (IS_XSLANTED, IS_YSLANTED): New
+ constants.
+ (object_spec): Add members `xslanted' and `yslanted'.
+ * src/groff/preproc/pic/pic.y (XSLANTED, YSLANTED): New left-valued
+ tokens.
+ Add rules for them.
+
+ * src/groff/preproc/pic/pic.man, NEWS, doc/pic.ms: Document above
+ changes.
+
+2007-11-16 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/hyphenex.pl: Generate copyright notice (this has been
+ approved by Barbara Beeton).
+ * tmac/hyphenex.us: Updated.
+
+2007-11-10 Michail Vidiassov <master@iaas.msu.ru>
+
+ * tmac/doc-syms (doc-str-St--susv3): New string.
+ * tmac/groff_mdoc.man: Document it.
+
+2007-11-08 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/preconv/preconv.cpp (emacs_to_mime): Add `utf-16be',
+ `utf-16le', `utf-16be-with-signature', `utf-16le-with-signature'.
+ (is_comment_line): Handle '\" and '\# also.
+
+ * src/preproc/preconv/preconv.man: Revise and make complete.
+
+2007-10-25 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/cs.tmac: New file holding Czech strings, contributed by
+ Marcela Maslanova <mmaslano@redhat.com>.
+ * tmac/hyphen.cs, tmac/hyphenex.cs: New hyphenation pattern files
+ for Czech, taken from CTAN.
+ * LICENSES: Updated.
+ * tmac/Makefile (NORMALFILES): Add Czech stuff.
+ * doc/groff_tmac.man: Mention cs.tmac.
+
+2007-10-21 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/input.cpp (do_ps_file): Handle `%X' in header
+ comments correctly. Reported by Frank Jahnke
+ <jahnke@sonatabio.com>.
+
+2007-10-02 Ruslan Ermilov <ru@FreeBSD.org>
+
+ * tmac/doc-common, tmac/groff_doc.man: Add FreeBSD 6.2, document
+ FreeBSD 5.5 and 7.0.
+
+ * tmac/doc-syms: Give better names for System V releases.
+
+2007-09-25 Gaius Mulley <gaius@glam.ac.uk>
+
+ * doc/Makefile.in, doc/Makefile.sub (.ms.html): Add -P-V switch to
+ the production of html files.
+ (pic.html): Ditto.
+ Remove background colour switch.
+ (.SUFFIXES, clean): Handle *.xhtml files.
+
+ * src/devices/grohtml/grohtml.man: Document that -V option now
+ generates an HTML-4.01 validator or XHTML validator.
+
+ * src/devices/grohtml/html-text.cpp (html_text::end_tag,
+ html_text::start_tag): Suppress <small>, <big>, and <color> tags if
+ we are inside a <pre> block.
+
+ * src/devices/grohtml/post-html.cpp
+ (html_printer::handle_valid_flag): Add a parameter to indicate
+ whether it needs to generate a paragraph block.
+ (html_printer::write_navigation): Updated.
+ (html_printer::do_file_components): Generate an HTML-4.01 blue
+ validator button also.
+
+2007-09-23 Axel Kielhorn <A.Kielhorn@web.de>
+
+ * man/groff.man: Fix URL of CSTR 54.
+
+2007-09-23 Werner LEMBERG <wl@gnu.org>
+
+ * man/groff_char.man: Normalize character set names as defined
+ by IANA. Based on a patch from Axel Kielhorn.
+
+ * src/preproc/refer/label.y: Undo change from 2007-09-19.
+
+2007-09-19 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/input.cpp (interpolate_arg): Remove compiler
+ warning.
+
+ * src/preproc/eqn/pile.cpp (pile_box::output, matrix_box::output):
+ Remove compiler warning.
+
+ * src/preproc/refer/label.y: Remove compiler warning.
+
+ * src/preproc/pic/pic.y: Remove doubled token entries.
+
+2007-09-19 Gaius Mulley <gaius@glam.ac.uk>
+
+ * doc/groff.texinfo: Document new .O register and add cross
+ reference entries.
+
+ * NEWS: Updated.
+
+ * src/devices/grohtml/grohtml.man: Document new -V and -y options.
+
+ * src/devices/grohtml/html-table.cpp: Add support for XHTML 1.1.
+ (html_table:: emit_colspan, html_table::emit_td): New methods.
+ (html_table::emit_col): Use html_table::emit_td.
+ (html_table::emit_table_header): Use html_table::emit_colspan if
+ dialect xhtml is specified.
+ (html_table::finish_row): Updated.
+
+ * src/devices/grohtml/html-table.h (html_table): Declare
+ emit_colspan, emit_td.
+
+ * src/devices/grohtml/html-text.cpp: Modified tags to comply with
+ xhtml if this dialect was requested.
+
+ * src/devices/grohtml/html-text.h (html_dialect): New enumeration.
+ (html_text): Add new variable `dialect'.
+
+ * src/devices/grohtml/post-html.cpp: Modify header tags to be XHTML
+ compliant.
+ (valid_flag, groff_sig, dialect): New global variables.
+ (html_printer::handle_valid_flag, html_printer::do_math,
+ html_printer::write_html_anchor, html_printer::write_xhtml_anchor,
+ html_printer::do_math, html_printer::handle_valid_flag): New
+ methods.
+ (html_printer::emit_line, html_printer::emit_raw,
+ html_printer::do_check_center, html_printer::write_title,
+ write_rule, html_printer::writeHeadMetaStyle, generate_img_src,
+ html_printer::begin_page): Altered to be XHTML compliant.
+ (html_printer::write_header): Updated.
+ (html_printer::troff_tag): Call do_math.
+ (html_printer::insert_split_file, html_printer::do_file_components,
+ html_printer::write_navigation): Create XHTML file components if
+ necessary and also produces a groff signature if requested.
+ (~html_printer): Call writeHeadMetaStyle at appropriate places
+ depending upon html_dialect.
+ (html_printer::special): Handle new tags `html<?p>' and `math<?p>'.
+ (main): Added options -x, -V, and -y.
+ (usage): Updated.
+
+ * src/preproc/eqn/box.cpp: Create a distinction between
+ the MathML device and the XHTML device.
+ (do_text): Issue a newline at the end of the equation if XHTML was
+ specified.
+ (box::top_level): Prefix the output of an equation by the .MATHML
+ macro.
+ (output_string): Suppress \n if XHTML was specified.
+
+ * src/preproc/eqn/main.cpp (xhtml): New global flag.
+ (inline_equation): Skip leading spaces after inline equation for
+ XHTML device.
+ (main): Set `xhtml' flag if `-Tmathml:xhtml' is specified.
+
+ * src/preproc/eqn/eqn.h (xhtml): New external flag.
+
+ * src/preproc/eqn/text.cpp (entity_table): Fix typo.
+
+ * src/preproc/html/pre-html.cpp (html_dialect): New enumeration.
+ (dialect, eqn_flag): New global variables.
+ (html_system): Improve debugging support.
+ (alterDeviceTo): Test for -Txhtml when altering device to the image
+ device and reset to -Txhtml.
+ (addZ): Renamed to...
+ (addArg): This.
+ Introducea a general parameter.
+ (print_args): New debugging function.
+ (char_buffer::run_output_filter): Use print_args and addArg rather
+ than addZ.
+ (char_buffer::do_html, char_buffer::do_image): Add -rxhtml=1 command
+ line parameter as an argument to the html generation of text when
+ xhtml is needed. Include -e on the command line if mathml is
+ required.
+ (scanArguments): Allow -e, -V, -y and -x options.
+ -V, -y are handled by the back end. -e sets `eqn_flag'.
+ -x determines HTML dialect.
+
+ * src/roff/groff/groff.cpp (possible_command): New method
+ `clear_name'.
+ (main): Set eflag if -e is present on command line.
+ Set is_xhtml if -Txhtml is present.
+ Pass `-x x' to the HTML pre and post processors.
+ Pass `-e' to the HTML pre processor if required.
+ Pass `-Tmathml:xhtml' to eqn if XHTML is requested.
+
+ * src/roff/troff/input.cpp (init_input_requests): Introduce new
+ number register `\n[.O]'.
+
+ * tmac/s.tmac: (LP): Use .nop for semantic sugar.
+ (cov*ab-init) reformat.
+ (@EQ): Use EQN-HTML-IMAGE and friends rather than HTML-IMAGE.
+ (CHECK-FOOTER-AND-KEEP): Define FS, FE such that they use
+ <cite></cite> for the html device rather than generate images for
+ footnotes.
+
+ * tmac/troffrc-end: Define EQN-HTML-IMAGE,
+ EQN-HTML-IMAGE-END, EQN-HTML-IMAGE-RIGHT,
+ EQN-HTML-IMAGE-LEFT, EQN-HTML-IMAGE-INLINE,
+ EQN-HTML-DO-IMAGE, EQN-HTML-IMAGE-END as null strings.
+
+ * tmac/www.tmac: (HTML<?p>): New macro.
+ (MATH<?p>): New macro.
+ (IMG, PIMG, MPIMG, HR): Use XHTML compliant syntax.
+ (www-emit-ltag): New macro.
+ (www-push-li): Updated.
+ (ULS): Ensure that tags are balanced in order by use of
+ www-emit-ltag.
+ (ULE): Likewise: Use www-emit-ltag and shut down paragraphs in
+ order.
+ (OLS, OLE, DLS, DLE): Ditto.
+ <global>: Define EQ and EN to EQN-HTML-IMAGE and EQN-HTML-IMAGE-END
+ respectively.
+ (www-li-ul, www-li-ol, www-li-dl): Updated.
+ (EQN-HTML-IMAGE, EQN-HTML-IMAGE-RIGHT, EQN-HTML-IMAGE-LEFT,
+ EQN-HTML-IMAGE-INLINE, EQN-HTML-DO-IMAGE, EQN-HTML-IMAGE-END,
+ MATHML): New macros.
+
+2007-09-17 Werner LEMBERG <wl@gnu.org>
+
+ * man/groff_font.man: Document `unicode' keyword.
+ * doc/groff.texinfo (DESC File Format): Synchronize with
+ groff_font.man.
+
+2007-09-15 Werner LEMBERG <wl@nu.org>
+
+ * man/groff.man: Document `\_'.
+ * doc/groff.texinfo: Ditto.
+ Remove references to `\@' which isn't a valid escape sequence in
+ groff.
+
+
+ * tmac/unicode.tmac: Add ` and '.
+ * tmac/html.tmac: Load unicode.tmac.
+
+2007-09-14 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/unicode.tmac: Make `-' a pure input character by mapping it
+ to `hy'.
+
+ * src/roff/troff/input.cpp (init_charset_table): Handle `hy'.
+
+2007-09-11 Werner LEMBERG <wl@gnu.org>
+
+ * src/libs/libgroff/string.cpp (string::remove_spaces): Fix memory
+ allocation.
+
+ * src/preproc/tbl/table.cpp (table::allocate): Initialize
+ `blockflag' array.
+
+2007-09-10 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * README.MinGW: Add warnings about use of MSYS-RXVT, and about
+ defective GnuWin32 versions of netpbm/libpng.
+
+2007-07-15 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * tmac/s.tmac (cov*first-page-init): Remove invoking trap, to avoid
+ possible recursion.
+
+2007-07-11 Werner LEMBERG <wl@gnu.org>
+
+ * gendef.sh: Add shebang.
+
+2007-07-05 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/papersize.tmac: Fix dimensions of executive paper format.
+ Reported by John Rupley <rupley@u.arizona.edu>.
+
+2007-07-02 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * tmac/s.tmac (cov*first-page-init): Emit error message if not in
+ top-level environment.
+
+2007-06-12 Werner LEMBERG <wl@gnu.org>
+
+ * src/devices/xditview/TODO, NEWS: Updated.
+ * src/devices/xditview/Makefile.sub (install_data, uninstall_sub):
+ Handle `GXditview-color'.
+ * src/devices/xditview/gxditview.man: Updated.
+
+ * m4/groff.m4 (GROFF_APPRESDIR_CHECK): Updated.
+ * m4/codeset.m4, m4/glibc21.m4, m4/iconv.m4, m4/lib-link.m4: Updated
+ from `gnulib' git repository.
+
+ * configure.ac: Updated.
+ * configure: Regenerated (using autoconf 2.61).
+
+ * config.guess, config.sub: Updated from `config' CVS repository.
+ * config.rpath, install-sh, mkinstalldirs: Updated from `gnulib' git
+ repository.
+
+2007-06-12 Tadziu Hoffmann <hoffmann@usm.uni-muenchen.de>
+
+ * src/devices/xditview/GXditview.ad: Split off color definitions
+ into...
+ * src/devices/xditview/GXditview-color.ad: This new file.
+
+2007-06-08 Fabrice Ménard <menard.fabrice@wanadoo.fr>
+
+ * tmac/fr.tmac: Handle chapter system for `me'.
+
+2007-06-05 Tadziu Hoffmann <hoffmann@usm.uni-muenchen.de>
+
+ * src/devices/xditview/xditview.c (main): Add support for
+ accelerators.
+
+ * src/devices/xditview/GXditview.ad: Updated.
+ Make widget more colourful.
+
+2007-05-30 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/groff_mdoc.man: Convert `-' to `\-' where appropriate.
+ Recommend `tbl' instead of `-column' lists for more complicated
+ cases.
+
+2007-05-21 Werner LEMBERG <wl@gnu.org>
+
+ * src/devices/grops/ps.cpp (ps_printer::set_char): Handle subfonts
+ correctly.
+
+2007-04-10 Werner LEMBERG <wl@gnu.org>
+
+ In pic, make rounded boxes work with colors. Reported by Urs Eggli
+ <Urs.Eggli@zuerich.ch>.
+
+ * src/preproc/pic/common.h (common_output), src/preproc/pix/output.h
+ (output): Add color parameter to `rounded_box' member function.
+
+ * src/preproc/pic/common.cpp (common_output::rounded_box): Use it.
+
+ * src/preproc/pic/object.cpp (box_object::print): Pass `color_fill'
+ to `out->rounded_box'.
+
+2007-04-09 Michail Vidiassov <master@iaas.msu.ru>
+
+ * font/devps/generate/textmap: Add Greek letters and some more.
+
+ * src/utils/afmtodit/afmtodit.tables: Change values of `Delta',
+ `Omega', and `mu' to the ones from aglfn.txt.
+
+2007-04-08 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * tmac/s.tmac (SN): Define unconditionally.
+ (SN-STYLE): New string; define.
+
+ * NEWS, tmac/groff_ms.man, doc/groff.texinfo (SN-STYLE): Document it.
+
+2007-03-22 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/pspic.tmac: Fix harmless numeric overflow warning. Reported
+ by Jörg van den Hoff <j.van_den_hoff@fzd.de>.
+
+2007-03-20 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/trace.tmac (rn): Added.
+ (nr, ds, ds1, as, as1, substring): Restore escape character while
+ executing the macro.
+ (nr): Remove dead code.
+
+ * src/preproc/eqn/box.cpp (box::top_level): Use \E in string
+ definitions to make them traceable.
+
+2007-03-19 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/input.cpp (get_copy): Add third argument to control
+ whether \E shall be expanded.
+ (get_char_for_escape_name): Allow \E.
+
+2007-03-15 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/s.tmac (MO, CH, pg*OH, pg*EH, pg*OF, pg*EF, *, [., .],
+ par*define-font-macro, \[hooko]): Use \E to make it traceable.
+
+ (ref*field): Add argument to control the space between previous and
+ current argument.
+ Update all callers.
+ (ref*add-N): Fix handling of opening parenthesis. Problem reported
+ by Jörg van den Hoff <j.van_den_hoff@fzd.de>.
+
+2007-03-14 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/trace.tmac (als): Added.
+ (de, de1, am, am1): Make traced macros aliased with .als work.
+
+2007-02-25 Werner LEMBERG <wl@gnu.org>
+
+ * src/devices/xditview/TODO: Add some more items.
+
+ * Makefile.comm (.man.n): Add @APPRESDIR@.
+ Sort entries.
+
+ * src/devices/xditview/gxditview.man: Document GXditview resource
+ file.
+ Other documentation enhancements based on a patch from Jörg.
+
+2007-02-25 Tadziu Hoffmann <hoffmann@usm.uni-muenchen.de>
+ Joerg van den Hoff <j.van_den_hoff@fzd.de>
+
+ * src/devices/xditview/GXditview.ad: Make all keys work regardless
+ of the current mouse position.
+
+2007-02-20 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/groff_man.man: Revised to improve visual appearance.
+ Reduce use of future tense.
+
+ * tmac/groff_trace.man: Revosed to improve visual appearance.
+
+2007-02-19 Eric S. Raymond <esr@snark.thyrsus.com>
+
+ Make groff.man viewer-portable.
+
+ * tmac/groff.man: Eliminate use of .eo/.ec.
+ (.REQ): Surround args 2 through N with quotes. This will enable us
+ not to rely on the shift request, which is nonportable.
+ (ExecFF): Remove. The code is simpler without it.
+
+2007-02-18 Eric S. Raymond <esr@snark.thyrsus.com>
+
+ * tmac/groff_www.man: Viewer-portability fixes.
+
+2007-02-16 Eric S. Raymond <esr@snark.thyrsus.com>
+
+ * man/groff.man: Remove some unneeded code and a no-longer-used
+ inclusion of the www macros.
+
+2007-02-12 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/tbl/table.cpp (compute_span_width): Fix use of
+ AVAILABLE_REG.
+ (table::compute_widths): Simplify.
+
+2007-02-11 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/tbl/table.h: Don't include `stdbool.h'.
+ (table): Replace `bool' type with `char' for orthogonality.
+ Update all users.
+
+ * src/preproc/tbl/table.cpp (block_entry::do_divert): Fix usage of
+ AVAILABLE_REG and COLCOUNT_REG.
+ (table::table): Fix order call of initializers.
+ (table::~table): Deallocate `blockflag'.
+
+2007-02-09 Eric S. Raymond <esr@snark.thyrsus.com>
+
+ A try at the new rule for block column allocation is now enabled by
+ the new `experimental' global option: The horizontal space up to the
+ right margin which is not used by columns without text blocks is
+ evenly distributed to the columns with text blocks.
+
+ It doesn't work right as yet; there appears to be some error in the
+ computation of `3avail', the available line length. The purpose of
+ this patch is (a) to make experimenting with other formulas easy,
+ and (b) leave the infrastructure for flag `experimental' in place
+ for future experiments. Do not document any behavior associated
+ with this flag!
+
+ * src/preproc/tbl/table.h: Include `stdbool.h'.
+ (table): Make `flags' public.
+ Add `count_block_columns' function.
+ Add `blockflag' array.
+ Add `EXPERIMENTAL' enumeration value.
+
+ * src/preproc/tbl/table.cpp (AVAILABLE_REG, COLCOUNT_REG): New
+ macros.
+ (table_entry): New member `parent' so that class and subclass
+ members can set a parent field. Update all users.
+ (block_entry::do_divert): Handle `EXPERIMENTAL' flag.
+ (block_entry::do_width): Set the parent's `blockflag'.
+ (table::allocate): Handle `blockflag'.
+ (table::count_block_columns): New function.
+ (compute_span_width): Adjust AVAILABLE_REG.
+ (table::compute_widths): Handle COLCOUNT_REG and AVAILABLE_REG.
+
+ * src/preproc/tbl/main.cpp (process_options): Handle `experimental'
+ option.
+
+2007-02-08 Zhao, Yu (William) <yzhao2@alcatel-lucent.com>
+
+ * src/devices/grodvi/dvi.cpp (draw_dvi_printer::draw) <'e'>: Set
+ line thickness.
+
+2007-02-08 Werner LEMBERG <wl@gnu.org>
+
+ * man/groff_out.man (offset): Make it work reliably.
+
+2007-02-07 Eric S. Raymond <esr@snark.thyrsus.com>
+
+ * man/groff_out.man: Simplify some font changes so \fP is less
+ likely to do something surprising.
+
+ * man/groff_out.man: We can simplify the command macros still
+ further if we stop trying to hide structural requests inside them.
+ Also, fix some instances of \} at start of line without a dot, and
+ make some font changes explicit in strings.
+
+ * man/groff_out.man: Cleanup -- remove now-unneeded uses of .do and
+ .cp.
+
+ * man/groff_out.man: Final step: Reduce x-command, get rid of eo/ec
+ calls and fix macros to do without them. File should now be
+ viewer-portable.
+
+ * man/groff_out.man: Fourth step: Eliminate use of eqn in favor of
+ micromotions that produce the same visual result and can be lifted
+ to XML-DocBook.
+
+ * man/groff_out.man: Third step: Reduce Da-comand, fix a
+ call-sequence bug in the original.
+
+ * man/groff_out.man: Second step: Reduce D-commmand and D-command+,
+ move font-change escapes to portable form.
+
+ * man/groff_out.man: First step in macro simplification; eliminate
+ list1..n, simplify .offset and .index_offset so they no longer
+ require groff-specific features or eqn (instead, use troff
+ micromotions for subscripting).
+
+2007-02-06 Eric S. Raymond <esr@snark.thyrsus.com>
+
+ * src/preproc/eqn/eqn.man: Minor corrections.
+
+ * tmac/an-ext.tmac: Change .UR/.UE and .MT/.ME so the start macro no
+ longer takes a second argument that is pasted to the end of the
+ generated text. Instead, the end macro takes an argument that does
+ the same thing.
+
+ * man/ditroff.man, man/groff_diff.man, man/groff.man,
+ man/groff_out.man, man/groff_tmac.man, man/roff.man,
+ src/roff/groff/groff.man, src/roff/grog/grog.man,
+ tmac/groff_man.man, tmac/groff_trace.man: Update accordingly.
+
+ * src/roff/troff/troff.man: .SY and .YS are canned macros now,
+ so we can use them here.
+
+2007-02-05 Eric S. Raymond <esr@snark.thyrsus.com>
+
+ * src/preproc/eqn/lex.cpp, src/preproc/eqn/eqn.man:
+ By popular demand, make ... set three lower dots again
+ and introduce a new predefined macro 'cdots' to set
+ three centered dots.
+
+2007-02-05 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/eqn/eqn.man: Revised.
+
+ * src/preproc/eqn/text.cpp (map, special_char_boc::output): Use
+ `const'.
+ (spacing_type): Fix typo.
+ (special_to_entity): Use `const'.
+ Remove unused variable.
+ * src/preproc/eqn/other.cpp (font_box::output): Use `const'.
+
+2007-02-05 Eric S. Raymond <esr@snark.thyrsus.com>
+
+ * src/devices/grotty/grotty.man: \m[] and \M[] aren't portable,
+ which is a shame as the effect was cute.
+
+2007-02-04 Eric S. Raymond <esr@snark.thyrsus.com>
+
+ * man/groff_tmac.man, man/groff_diff.man: Portability conversion;
+ rip out over-elaborate macrology, use .EX/.EE and .UR/.UE where
+ possible, remove preamble declarations and macros that are no
+ longer needed. Conversion checked using the protocol described in
+ tmac/TESTING-HINTS.
+
+2007-02-03 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/an-old.tmac (LP, IP, HP): Use .ns to suppress additional
+ vertical space.
+
+2007-02-03 Eric S. Raymond <esr@snark.thyrsus.com>
+
+ * tmac/groff_man.man: Documented the extension macros, and
+ added portability advice.
+
+ * MORE.STUFF: More-stuff entries for doclifter and pic2plot.
+
+
+ Add support for MathML output to eqn.
+
+ The strategy used is very simple and relies on the fact that the box
+ models of eqn and Presentation MathML differ in only trivial ways.
+ It leaves the grammar and existing internal object structures
+ unchanged. A new global, `output_format', is defined as an
+ enumerated type with values {troff, mathml}. Most of the functions
+ and methods that emit actual output acquire a top-level conditional,
+ dispatching on this global, which has one arm for troff mode and one
+ for MathML mode. In most cases the MathML arm is drastically
+ simpler.
+
+ (This strategy could be easily generalized to support other output
+ formats. TeX is a possibility that leaps to mind.)
+
+ The only even moderately tricky changes are in the lexer. Some of
+ the predefined macros used constructs like `up', `down', `fwd',
+ `back', and `vcenter' that have no equivalents in MathML. I
+ attacked this problem in these ways:
+
+ 1. I eliminated three uses of `back' to compose characters in favor
+ of using equivalent groff specials `\(<<', `\(>>', and `\(<>'
+ that did not exist when these macros were written. (This will be
+ a quality improvement for troff users.)
+
+ 2. I eliminated one use of `vcenter' by using \\(md. (Likewise...)
+
+ 3. I then split the table of pre-definitions in three; one large
+ common table and two small troff-specific and MathML-specific
+ tables. Use of troff-only operations (up, down, back, fwd,
+ vcenter) is now confined to the former. The latter now uses
+ `size big' and drops out the explicit positioning operations,
+ counting on MathML processors to do them.
+
+ POTENTIAL TROUBLE SPOTS:
+
+ Here are notes for reviewers on places I'm not 100% sure I've done
+ the right thing:
+
+ * In the process of preparing the troff table, I translated three
+ definitions (dot_def, dotdot_def, and utilde def) that previously
+ used explicit \v escapes to use `up' and `down' instead. I
+ modeled the new definitions on the way `vec' and `dyad' work, but
+ it's possible I got something subtle wrong.
+
+ * I'm not certain the MathML implementation of font_box::output() is
+ right, because I don't quite get what the switcheroo between
+ `current_roman_font' and `old_roman_font' is supposed to
+ accomplish. It does seem to generare good MathML, though.
+
+ Finally, I made one purely cosmetic change in `text.cpp'; I replaced
+ with an enum some magic numbers for spacing types that I thought
+ were too ugly to live.
+
+ REMAINING ISSUES:
+
+ The entirety of eqn is translated when `-TMathML' is specified,
+ with the following exceptions...
+
+ Limitations that cannot be fixed include non-support for special,
+ up/down/fwd/back, and vcenter.
+
+ Limitations that might be fixable include non-support for mark and
+ lineup. I will investigate further, but if these can be implemented
+ at all it's going to be in a very complicated and nasty way.
+
+ The way character boxes are output means that each digit of a
+ multi-digit number gets its own <mn></mn> tag pair in the MathHTML.
+ While this is not technically wrong for Presentation MathML, it is
+ ugly and inefficient. Fixing this will require implementing a
+ little state machine in the `text.cpp' output method.
+
+ * src/preproc/eqn/box.cpp, src/preproc/eqn/delim.cpp,
+ src/preproc/eqn/eqn.h, src/preproc/eqn/eqn.man,
+ src/preproc/eqn/lex.cpp, src/preproc/eqn/limit.cpp,
+ src/preproc/eqn/list.cpp, src/preproc/eqn/main.cpp,
+ src/preproc/eqn/other.cpp, src/preproc/eqn/over.cpp,
+ src/preproc/eqn/pile.cpp, src/preproc/eqn/script.cpp,
+ src/preproc/eqn/sqrt.cpp, src/preproc/eqn/text.cpp,
+ src/preproc/eqn/eqn.man: MathML output mode.
+
+ * NEWS: Document it.
+
+2007-02-02 Eric S. Raymond <esr@snark.thyrsus.com>
+
+ * src/roff/groff/groff.man: Converted to use .SY/.OP/.YS
+ and for cross-viewer portability. Conversion checked
+ using the protocol described in tmac/TESTING-HINTS.
+
+2007-02-02 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/an-ext.tmac (ME): Don't use `\:'.
+
+ * src/roff/grog/grog.man: Further refinements and normalizations.
+
+2007-02-02 Eric S. Raymond <esr@snark.thyrsus.com>
+
+ * src/roff/grog/grog.man: Converted to use .SY/.OP/.YS and for
+ cross-viewer portability. Conversion checked using the protocol
+ described in tmac/TESTING-HINTS.
+
+2007-02-01 Eric S. Raymond <esr@thyrsus.com>
+
+ * tmac/TESTING-HINTS: Added.
+
+2007-02-01 Eric S. Raymond <esr@thyrsus.com>
+
+ Enable the support for Bell archaisms on .SC, so the `-r bell'
+ switch is no longer needed to format old AT&T papers like
+ the EQN user guide.
+
+ * tmac/s.tmac (.SC, .UC, .P1, .P2): Updated.
+
+ * tmac/groff_ms.man, doc/groff.texinfo, NEWS: Updated.
+
+2007-02-01 Eric S. Raymond <esr@thyrsus.com>
+
+ Add some Bell labs extensions to the -ms macros.
+
+ * tmac/s.tmac (.SC, .UC, .P1, .P2) [bell]: New macros.
+
+ * tmac/groff_ms.man, doc/groff.texinfo, NEWS: Document `-r bell'.
+
+2007-01-30 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/an-ext.tmac (\n[EX]): Rename to \n[mX].
+ (\n[mH]): New register (set if grohtml is used).
+ (\n[SY]): Rename to \n[mS].
+ (\n[a]): Rename to \n[mA].
+ (\n[i]): Rename to \n[mI].
+ (mU): New auxiliary input trap macro.
+ (UR, UE): Replace stub with real definition.
+ (URL): Remove.
+ (MT, ME): New macros.
+ (MTO): Remove.
+ (EX, EE): Don't insert vertical space.
+ Use a register to store (and restore) the current font.
+
+ * man/ditroff.man, man/groff_diff.man, man/roff.man: Revised, based
+ on patches from Eric Raymond.
+ Fix URL addresses.
+
+2007-01-22 Gaius Mulley <gaius@glam.ac.uk>
+
+ * tmac/an-old.tmac (an-trap, HP): Make `HP' work as expected.
+
+2007-01-22 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/an-ext.tmac: Protect against being sourced twice.
+ (URL, EE): Use always two backslashes.
+ (MTO): New macro.
+
+2007-01-16 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/an-ext.tmac: Remove code for grodvi.
+ (SY): Fix typos.
+ Don't insert empty line.
+ (URL, TQ): Fix typos.
+
+2007-01-14 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/an-ext.tmac: New file, containing extension macros
+ for -man. See discussion on the groff mailing list for
+ background information.
+ * tmac/an-old.tmac: Load an-ext.tmac.
+ Decorate .ds and as with comment escapes where appropriate.
+ * tmac/Makefile.sub (NORMALFILES): Add an-ext.tmac.
+
+2007-01-05 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/tbl/tbl.man: Document .T# and \n[TW].
+
+2007-01-04 Gaius Mulley <gaius@glam.ac.uk>
+
+ Make -me macros ready for grohtml.
+
+ * tmac/e.tmac: Load devtag.tmac.
+ (need_eo_h, need_eo_tl, need_tl): New registers.
+ (check_need_title, (x-html, )x-html, xp-html): New macros.
+ (@h, hl, ip, @p, sh, (b, (l, EQ, EN, TS, TE, PS, PE, GS, GE, r, i,
+ b, rb, bi, bx, (x, )x, xp): Adapt for use with grohtml.
+ (bp): Rename to @b only if output device is not html.
+
+2007-01-01 Werner LEMBERG <wl@gnu.org>
+
+ * man/groff_font.man: Document empty lines.
+
+ * src/utils/afmtodit/afmtodit.pl: Always print a header comment at
+ the very beginning of the output.
+ [!$opt_x]: Fix typo.
+
+ * font/devps/*: Regenerate font definition files.
+
+2007-01-01 Werner LEMBERG <wl@gnu.org>
+
+ * font/devps/generate/Makefile (AFMTODIT): Use -c flag.
+
+ * font/devps/*: Regenerate font definition files.
+
+2006-12-31 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile.in (oldfontdir): New variable.
+ (MDEFINES): Add $(oldfontdir).
+ (uninstall_dirs): Remove `current' link.
+ Remove $(oldfontdir).
+
+ * Makefile.comm (oldfontsubdir): New variable.
+ (install_dev): Install files collected in $(OLDDEVFILES) into
+ $(oldfontsubdir).
+ (uninstall_dev): Remove data in $(oldfontsubdir).
+ (.man.n): Handle @OLDFONTDIR@.
+
+ * src/devices/grodvi/grodvi.man, src/devices/grohtml/grohtml.man,
+ src/devices/grolbp/grolbp.man, src/devices/grolj4/grolj4.man,
+ src/devices/grotty/grotty.man, src/devices/xditview/gxditview.man:
+ Document GROFF_FONT_PATH.
+
+ * src/devices/grops/grops.man: Document GROFF_FONT_PATH and
+ old font description files.
+
+ * font/devps/Makefile.sub (OLDDISTFILES, OLDDEVFILES): New
+ variables.
+
+ * font/devps/old/*: New directory, holding the previous version
+ of the 35 Adobe core font description files.
+
+ * font/devps/*: Regenerated the 35 Adobe core fonts, using the
+ Adobe-Core35_AFMs-229.tar.bz2 bundle from ftp.dante.de.
+
+ * NEWS: Document font update.
+
+2006-12-31 Werner LEMBERG <wl@gnu.org>
+
+ * font/devps/generate/Makefile (symbolsl.afm): Use $(srcdir).
+
+ * Makefile.comm (fonts): New (empty) target.
+ * Makefile.in (TARGETS): Add `fonts'.
+
+ * MANIFEST: Add `chem'.
+
+ * doc/groff.texinfo (Changing Fonts): Font translations with .ftr
+ can't be chained.
+
+2006-12-26 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/grn/hdb.cpp: Include gprint.h later. From NetBSD.
+
+2006-12-19 Werner LEMBERG <wl@gnu.org>
+
+ Add support for German. For activation, simply use -mde or -mden
+ (for traditional and new orthgraphy, respectively) as the last
+ macro package.
+
+ * tmac/de.tmac, tmac/den.tmac, tmac/hyphen.det, tmac/hyphen.den,
+ tmac/hyphenex.det: New files, partly taken from CTAN.
+ * LICENSES: Updated list of hyphenation patterns.
+ * man/groff_tmac.man: Mention de.tmac and den.tmac.
+ * NEWS: Updated.
+
+2006-12-11 Werner LEMBERG <wl@gnu.org>
+
+ Support up to 32 macro arguments in pic (and up to 16 on EBCDIC
+ hosts).
+
+ * src/preproc/pic/lex.cpp (ARG1): Redefine. Update all users.
+ (MAX_ARG): New macro. Use it everywhere to replace hard-coded
+ limit of 9 arguments.
+ (process_body): Handle argument numbers with more than a single
+ digit.
+ (interpolate_macro_with_args): Protect against exceeding number of
+ arguments.
+
+ * NEWS, src/preproc/pic/pic.man, doc/pic.ms: Document it.
+
+2006-12-10 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile.in (site.exp, docheck): Commented out. Not working
+ currently.
+ (check): Just emit dummy message.
+
+2006-12-08 Werner LEMBERG <wl@gnu.org>
+
+ During installation, create soft link from <version> to `current' in
+ <datadir>/groff.
+
+ * Makefile.comm (install): Renamed to...
+ (do_install): This.
+ (prefix_must_exist): Removed. Code moved to Makefile.in.
+
+ * Makefile.in (TARGETS): Remove `install'.
+
+ (install): New target which first creates the directory given by
+ --prefix, then calling `make' to do the installation, and finishing
+ with the creation of the soft link.
+
+2006-11-21 Werner LEMBERG <wl@gnu.org>
+
+ * doc/Makefile.sub (uninstall_sub): Fix names for info files.
+
+2006-11-18 Werner LEMBERG <wl@gnu.org>
+
+ * man/roff.man, doc/groff.texinfo: Improve history of roff, based on
+ information from Tom Van Vleck <thvv@multicians.org>.
+
+2006-11-16 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/62bit.tmac: New macro package.
+ * tmac/Makefile.sub (NORMALFILES): Add it.
+ * NEWS: Document it.
+
+ * tmac/trace.tmac: Protect against being loaded again.
+ (nr): Always show result.
+
+ * doc/groff.texinfo (Input Encodings): Document latin-5.
+
+ * man/grof_tmac.man: Document sv, latinX, cp1047, 60bit, ec.
+
+2006-11-13 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo (Page Location Traps) [.wh]: Give more details
+ on negative trap positions.
+
+2006-11-10 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile.comm (.man.n): Handle @DATASUBDIR@.
+
+2006-11-09 Werner LEMBERG <wl@gnu.org>
+
+ * INSTALL: Move information about external installation from
+ INSTALL.gen into this file.
+ Updated.
+
+ * INSTALL.gen: Update to new version (from texinfo CVS).
+
+2006-11-09 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * INSTALL.gen: Extend the file by information on `external
+ installation'. Reorder the installation instruction as `normal
+ installation'.
+
+2006-11-08 Werner LEMBERG <wl@gnu.org>
+
+ * doc/Makefile.sub (install_data): Take care of proper paths while
+ installing info files. Bug reported by
+ Bernd Warken <groff-bernd.warken-72@web.de>.
+
+2006-11-06 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/grog.pl: Rewrite.
+ - Call by `#! /usr/bin/env perl'. That isn't replaced.
+ - Rename usage() to version().
+ - Use warnings.
+ - For `use strict', start all global variables with an upper case
+ character. Use `my' for all variables. Use several new variables.
+ - Add option `-h'.
+ - Add copyright to GPL and Emacs comment.
+ - Handle several `-m*' options.
+ - Fix handling of `-ms' and `-mm'. Add .TL and .NH.
+ - Allow options after file names.
+ - Allow only one `-' parameter (standard input).
+ - Add option abbreviations.
+ - Expand the usage information.
+ - Add `chem'.
+ - Add single quote "'" as additional first character and allow
+ arbitrary space after the first character.
+
+ * src/roff/grog/grog.sh: Rewrite.
+ - Remove option `-e' of `sed'.
+ - Allow file names with space characters.
+ - Add option `-h'.
+ - Add copyright to GPL.
+ - Handle several `-m*' options.
+ - Fix handling of `-ms' and `-mm'. Add .TL and .NH.
+ - Allow options after file names.
+ - Allow only one `-' parameter (standard input).
+ - Add option abbreviations.
+ - Expand the usage information.
+ - Add `chem'.
+ - Add single quote "'" as additional first character and allow
+ arbitrary space after the first character.
+
+ * src/roff/grog/Makefile.sub:
+ - Add copyright to GPL.
+ - Remove `grog:'. Move `grog.old:' to `grog:' in order to have a
+ fair chance to choose between the shell version and the Perl
+ version of `grog'. This is now again comparable to grog in groff
+ version 1.10.
+
+ * src/roff/grog/grog.man: Rewrite.
+ - Move the license to GPL.
+ - New sections: OPTIONS, DETAILS, EXAMPLES, COPYING.
+ - Take over some setup and macros from `groffer'.
+ - Add information on options.
+
+2006-10-28 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/trace.tmac: Improve tracing of `.nr'.
+ Trace `.substring' also.
+
+ * NEWS: Updated.
+
+2006-10-28 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * man/roff.man, src/roff/groff/groff.man: Add `chem', fix position
+ of groff development site, fix fonts.
+
+ * News: Add information on `chem' and `groffer'.
+
+2006-10-26 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * Makefile.in (OTHERDIRS, NOMAKEDIRS): Add `chem' bundle.
+
+2006-10-26 Werner LEMBERG <wl@gnu.org>
+
+ Add `\$^' escape to handle the parameters to a macro as a string
+ argument.
+
+ * src/roff/troff/input.h (DOUBLE_QUOTE): New special character.
+
+ * src/roff/troff/input.cpp (input_iterator, input_stack,
+ macro_iterator): Add `space_follows_arg' member function.
+ (macro_iterator::add_arg): Add parameter to set the `space_follows'
+ flag.
+ (arg_list): Add member `space_follows'.
+ Update constructor and all callers.
+ (decode_args): Store discarded double quotes.
+ (interpolate_args): Handle DOUBLE_QUOTE.
+ Add `\$^' escape.
+ (get_copy, token::next, composite_glyph_name): Handle DOUBLE_QUOTE.
+
+ * tmac/trace.tmac: Trace .nr, .ds, .ds1, .as, .as1.
+
+ * docs/groff.texinfo (Parameters), man/groff.man,
+ man/groff_diff.man, NEWS: Document it.
+
+2006-10-24 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * Makefile.in (NOMAKEDIRS): Add groffer subdirectories.
+
+2006-10-24 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/groff_trace.man: Mention problem with `\\\\'.
+
+2006-10-23 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo (Expressions): Improve documentation of `!'.
+
+ * tmac/trace.tmac (return): Don't call `substring'.
+
+2006-09-10 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/input.cpp (read_size): Revert previous change
+ w.r.t. `\s-[-...]'.
+
+ * doc/groff.texinfo (Fractional Size Types): Clarify syntax of \s.
+
+2006-09-09 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/input.cpp (read_size): Fix `\s[-\n[.s]]' so that it
+ behave the same as `\s-[\n[.s]]' (this is, emit a warning and set
+ point size to 1). Reported by Gunnar Ritter.
+ Also catch `\s-[-...]' and friends (causing an error).
+
+2006-09-06 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/env.cpp (environment::do_break): Insert zero-width
+ space only if there is no previous space. This fixes a bug which
+ caused unwanted filling of the last line in a paragraph. Thanks to
+ Gunnar Ritter for an analysis.
+
+2006-09-03 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/groff/groff.cpp (main): Pass -U flag to pic also.
+ Reported by Jennifer Sayers <jenjen@isu.usyd.edu.au>.
+
+2006-09-01 Nick Stoughton <nick@msbit.com>
+ Werner LEMBERG <wl@gnu.org>
+
+ Add a request `pev' to print environment information (similar to
+ `pnr' and `ptr' to print number registers and traps).
+
+ * src/roff/troff/env.h (environment): Add member function print_env.
+
+ * src/roff/troff/env.cpp: (environment::print_env): New function to
+ print a given environment state.
+ (print_env): New global function to iterate through the
+ environments, printing each one.
+ (init_env_requests): Register `pev'.
+
+ * doc/groff.texinfo (Debugging), man/groff.man, man/groff_diff.man,
+ NEWS: Document `pev' request.
+
+2006-09-01 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/preproc/soelim/soelim.cpp (usage): Fix option argument of
+ `-I' to `dir'.
+
+2006-09-01 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/pic/main.cpp (usage): Add missing options.
+
+2006-08-25 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/soelim/soelim.man: Document how to insert `\' and ` '
+ in file names.
+
+2006-08-19 Werner LEMBERG <wl@gnu.org>
+
+ * configure: Regenerated.
+
+2006-08-18 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * m4/groff.m4 (GROFF_MAKEINFO): Correct `makeinfo version testing
+ logic; it previously caused an `expr' syntax error, if no version of
+ `makinfo' was present. Also, remove dependency on `makeinfo' in VPATH
+ builds, if an up to date `groff.info' is present in either `builddir'
+ or in `srcdir'.
+
+2006-08-12 Tadziu Hoffmann <hoffmann@usm.uni-muenchen.de>
+
+ * font/devps/prologue.ps: Add BPhook.
+
+ * src/devices/grops/grops.man: Document BPHook.
+ Reorder some sections for better readability.
+
+2006-08-12 Werner LEMBERG <wl@gnu.org>
+
+ * src/include/lib.h (getlocale): New macro.
+ (setlocale, LC_ALL, LC_CTYPE) [!HAVE_SETLOCALE]: Define, as
+ suggested by Bruno.
+
+ * src/preproc/preconv/preconv.cpp (main): Use getlocale.
+
+2006-08-11 Werner LEMBERG <wl@gnu.org>
+
+ Add new flag to .cflags to enable hyphenation without looking at
+ hcode values.
+
+ * src/roff/troff/charinfo.h (charinfo): New enumeration value
+ `IGNORE_HCODES'.
+ New member function `ignore_hcodes'.
+
+ * src/roff/troff/node.cpp (break_char_node::add_self,
+ node::add_char): Updated.
+
+ * doc/groff.texinfo, man/groff_diff.man, NEWS: Document it.
+
+2006-08-09 Werner LEMBERG <wl@gnu.org>
+
+ Support composite Unicode characters again. Reported by Colin.
+
+ * font/devhtml/R.proto: Renamed to...
+ * font/devhtml/R.in: This.
+
+ * font/devutf8/R.proto: Renamed to...
+ * font/devutf8/R.in: This.
+ Add `charset' line.
+
+ * font/make-Rproto: New script.
+ * font/devhtml/R.proto, font/devutf8/R.proto: Generated.
+
+2006-07-26 Werner LEMBERG <wl@gnu.org>
+
+ * README: Fix description of CVS access. Reported by Joachim.
+
+2006-07-11 Werner LEMBERG <wl@gnu.org>
+
+ Add a request `.fzoom' and a number register `.zoom' to magnify
+ fonts.
+
+ * src/include/font.h (font): Add member variable `zoom'.
+ Add member functions `set_zoom' and `get_zoom'.
+ Remove `static' attribute from `scale' member function.
+
+ * src/libs/libgroff/font.cpp (font::font): Updated.
+ (scale_round): New version with three parameters to handle zoom
+ factor.
+ (font::scale, font::get_width): Handle zoom factor.
+ (font::set_zoom, font::get_zoom): New functions.
+ (font::load): Handle `zoom' while computing `space_width'.
+
+ * src/roff/troff/env.h: Declare `env_get_zoom'.
+ (environment): Add member function `get_zoom'.
+
+ * src/roff/troff/env.cpp (environment::get_zoom): New function.
+ (init_env_requests): Initialize `.zoom' register.
+
+ * src/roff/troff/node.cpp (font_info): New member functions
+ `set_zoom' and `get_zoom'.
+ (tfont): New member function `get_zoom'.
+ (env_get_zoom): New function.
+ (troff_output_file::set_font): Handle zoom factor.
+ (font_zoom_request): New function.
+ (init_node_requests): Initialize `fzoom' request.
+
+ * docs/groff.texinfo (Changing Fonts), man/groff.man,
+ man/groff_diff.man, NEWS: Document `fzoom' request and `.zoom'
+ register.
+
+ * src/roff/troff/TODO: Updated.
+
+2006-07-10 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo (Drawing Requests): Improve documentation of
+ \D'P ...'.
+
+2006-07-02 Werner LEMBERG <wl@gnu.org>
+
+ * man/groff_tmac.man: Document usage of .PSPIC within diversions.
+
+2006-07-01 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/pspic.tmac: Make .PSPIC work for all devices.
+ Print image file name for devices which don't support PS image
+ inclusion.
+ Handle multiple inclusions.
+ Add lots of comments.
+
+ * tmac/dvi.tmac, tmac/html.tmac, tmac/ps.tmac: Don't load
+ pspic.tmac.
+
+ * tmac/troffrc: Load pspic.tmac.
+
+ * man/groff_tmac.man: Update .PSPIC documentation.
+
+ * NEWS: Updated.
+
+2006-06-29 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/input.cpp (interpolate_macro):
+ s/probably/possibly/, as suggested by Keith.
+
+2006-06-28 Werner LEMBERG <wl@gnu.org>
+
+ Add support for \D'p...' to grotty.
+
+ * src/devices/grotty/grotty.cpp (tty_printer::draw): Move most of
+ its code to...
+ (tty_printer::line): This function.
+ (tty_printer::draw): Rewritten; just call either draw_line or
+ draw_polygon.
+ (tty_printer::draw_line, tty_printer::draw_polygon): New functions.
+
+ * src/devices/grotty/grotty.man, NEWS: Document it.
+
+2006-06-27 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/refer/command.h (have_bibliography): New variable
+ declaration.
+
+ * src/preproc/refer/command.cpp (bibliography_command): Set
+ `have_bibliography'.
+
+ * src/preproc/refer/refer.cpp: Initialize `have_bibliography'.
+ (output_references): Emit warning only if `have_bibliography' is
+ set.
+
+2006-06-15 Michail Vidiassov <master@iaas.msu.ru>
+
+ * font/devps/Makefile.sub (DISTFILES): Add freeeuro.afm.
+ * font/devps/generate/Makefile (clean): Don't remove symbolsl.afm
+ and zapfdr.afm.
+
+2006-06-15 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/tbl/tbl.man: Document limitations of .TS/.TE within a
+ macro (as suggested by Tadziu Hoffmann).
+
+2006-06-12 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/tbl/tbl.man: Add example for use of .TS/.TE within a
+ macro (as suggested by Tadziu Hoffmann).
+
+2006-06-05 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/strip.sed: Strip `\#' also.
+
+ * doc/groff.texinfo (Operators in Conditionals): Document usage of
+ \? for string comparison.
+
+2006-06-04 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Add more index entries for copy-in mode.
+ (Changing Fonts) <.ft>: Document that a font definition file must
+ not be called `DESC'.
+
+2006-05-31 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/input.cpp (token::next) <\N>: Catch negative values
+ here.
+
+ * doc/Makefile.sub (EXAMPLEFILES): Move gnu.eps to...
+ (PROCESSEDEXAMPLEFILES): Here.
+
+2006-05-30 Werner LEMBERG <wl@gnu.org>
+
+ * src/libs/libgroff/font.cpp (font::load): Reject fonts called
+ `DESC'.
+ Reduce number of false positives for `.if F ...' conditionals.
+ Improve warning messages.
+
+2006-05-29 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/Makefile.sub: Add copyright notice.
+ (NORMALFILES): Add man.tmac and ms.tmac.
+ (SPECIALFILES): Remove man.tmac and ms.tmac.
+ (CLEANADD): Remove man.tmac-sed and ms.tmac-sed.
+ (install_data, uninstall_sub): Don't handle man.tmac and ms.tmac
+ specially.
+ (stamp-sed): Don't handle man.tmac and ms.tmac.
+ Remove obsolete components in sed's regexp.
+
+ * doc/Makefile.sub (EXAMPLEFILES): Add gnu.eps.
+
+ * Makefile.in (OTHERDIRS, NOMAKEDIRS): Add hdtbl.
+
+2006-05-28 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo (History): Correct death circumstances of Joe
+ Ossanna.
+
+2006-05-27 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/an-old.tmac (an-do-tag): Simplify.
+
+2006-05-26 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/an-old.tmac (an-do-tag): Make margin characters work.
+ (an-header, an-p-footer): Use named environment.
+
+ * src/roff/troff/env.cpp (environment::copy): Copy margin character
+ node.
+
+2006-05-21 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/trace.tmac (de1): Fix serious typo (.di -> .do) and minor
+ omissions.
+
+2006-05-11 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * src/roff/groff/groff.man: Remove superfluous word `intermediate'.
+
+2006-05-10 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * src/roff/groff/groff.man: Update copyright notice.
+ Improved wording to describe effect of `-Z' option.
+
+2006-05-06 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/www.tmac: Decorate `.ds' with trailing `\"' where missing.
+ Normalize handling of `"' in arguments.
+ (PIMG): Remove debug message.
+ Simplify code.
+
+2006-05-05 Werner LEMBERG <wl@gnu.org>
+
+ * src/devices/grohtml/post-html.cpp (page::add_and_encode): Don't
+ swallow character immediately after `\[...]'.
+ Simplify code.
+
+2006-05-02 Gaius Mulley <gaius@glam.ac.uk>
+
+ * tmac/www.tmac (PIMG): Fix the HTML device specific components.
+
+2006-05-02 Larry Kollar <kollar@alltel.net>
+
+ * tmac/www.tmac (PIMG): Really default to `-C' if the alignment
+ option is missing.
+
+2006-04-30 Michail Vidiassov <master@iaas.msu.ru>
+
+ * src/utils/afmtodit/afmtodit.pl: New option `-c' to add font
+ information as a comment in output.
+ * src/utils/afmtodit/afmtodit.man, NEWS: Document it.
+
+2006-04-26 Werner LEMBERG <wl@gnu.org>
+
+ * src/devices/grohtml/post-html.cpp (html_printer::~html_printer):
+ Handle current_paragraph only if it is non-NULL.
+
+ * src/libs/libdriver/input.cpp (parse_x_command <'F'>, do_file
+ <'F'>): Use `get_extended_arg' to behave as documented. Reported by
+ Bill Ward <william.a.ward.jr@erdc.usace.army.mil>.
+
+
+ Surround the (pseudo) file name for the .pso request with `<' and
+ `>'.
+
+ * src/roff/troff/node.cpp (real_output_file, troff_output_file): Add
+ second parameter to `really_put_filename' and `put_filename'.
+ (troff_output_file::really_put_filename): Emit `<' and `>' around
+ filename if second argument is set.
+ * src/roff/troff/node.h: Updated.
+
+ * src/roff/troff/input.cpp (file_iterator::file_iterator,
+ file_iterator::set_location): Update to changes in node.cpp.
+
+2006-04-25 Tetsurou Okazaki <okazaki@FreeBSD.org>
+
+ * src/preproc/preconv/preconv.cpp (do_file): Fix conditional
+ preprocessor expression (I18N -> HAVE_ICONV).
+ (main): Fix handling of option `-h'.
+ Fix conditional preprocessor expression.
+
+2006-04-04 Werner LEMBERG <wl@gnu.org>
+
+ Implement new number register `.br' which is set to 1 if a macro has
+ been called as .foo and to 0 if called as 'bar. This is useful for
+ -mtrace so that requests can be reliably traced too.
+
+ * src/roff/troff/input.cpp (input_iterator): Add virtual function
+ `get_break_flag'.
+ (macro_iterator): Add `with_break' member and `get_break_flag'
+ function.
+ Update constructors.
+ (input_stack): Add function `get_break_flag'.
+ (break_flag_reg): New number register class.
+ (input_init_requests): Register `.br'.
+
+ * src/roff/troff/TODO: Updated.
+
+ * tmac/trace.tmac: s/!!sp/!!!sp/.
+ Modify definitions of `de', `de1', `am', and `am1' to use \n[.br].
+
+ * docs/groff.texinfo (Requests), man/groff.man, man/groff_diff.man,
+ NEWS: Document it.
+
+2006-03-29 Werner LEMBERG <wl@gnu.org>
+
+ * src/devices/grops/ps.cpp: s/must not/should not/ in warning
+ messages where appropriate.
+
+2006-03-28 Werner LEMBERG <wl@gnu.org>
+
+ * configure.ac: Call AC_PROG_EGREP.
+ * configure: Regenerated.
+
+ * Makefile.in (EGREP): New variable.
+ (MDEFINES): Add $(EGREP).
+
+ * src/roff/grog/grog.sh: Treat .TH between .TS and .TE properly
+ (bug reported by Robert Goulding <Goulding.2@nd.edu>).
+ Use @EGREP@.
+
+ * src/roff/grog/Makefile.sub (grog, grog.old): Use $(EGREP).
+
+2006-03-27 Werner LEMBERG <wl@gnu.org>
+
+ Add two requests `.device' and `.devicem' which are equivalent to
+ `\X' and `\Y', respectively.
+
+ * src/roff/troff/input.cpp (device_request, device_macro_request):
+ New functions.
+ (init_input_requests): Register them.
+
+ * doc/groff.texinfo (Postprocessor Access), man/groff_diff.man,
+ man/groff.man, NEWS: Document them.
+
+2006-03-27 Gaius Mulley <gaius@glam.ac.uk>
+
+ * src/roff/troff/input.cpp (encode_char): Emit special characters
+ for -Thtml as `\[...]'.
+ * src/devices/grohtml/post-html.cpp (page::add_and_encode): Updated.
+
+ * doc/groff.texinfo (Postprocessor Access) <\X>: Updated.
+
+2006-03-27 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/Makefile.sub (NORMALFILES, SPECIALFILES): Add various missing
+ files.
+
+2006-03-26 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo (Writing Macros): More documentation on
+ end-of-macro symbol of `.de'.
+ (Diversions): Minor addition to `.di' description.
+
+ * src/devices/grops/grops.man: Some clarifications regarding
+ insertion of PostScript snippets.
+
+2006-03-25 Michail Vidiassov <master@iaas.msu.ru>
+
+ Add rules to generate `symbolsl.afm'.
+
+ * font/devps/generate/zapfdr.sed,
+ font/devps/generate/symbolsl.awk: New files.
+
+ * font/devps/generate/Makefile (symbolfont, PRINTAFM): New
+ variables.
+ (SS, clean): Updated.
+ (freeeuro.afm): Use $(srcdir).
+ (symbolsl.afm): New rule.
+ (zapfdr.afm): Use zapfdr.sed.
+
+2006-03-22 Dwight Aplevich <aplevich@uwaterloo.ca>
+
+ * src/preproc/pic/pic.y (expr <INT>): Fix code.
+
+2006-03-22 Jörgen Grahn <jgrahn@algonet.se>
+
+ * tmac/sv.tmac: Add missing translations and activate support for
+ other macro packages.
+
+2006-03-21 Francis GUDIN <fgudin@nerim.net>
+
+ * tmac/doc-syms (Dx): New macro to identify DragonFly.
+ (doc-str-St--ieee1275-94, doc-str-St--isoC-amd1,
+ doc-str-St--isoC-tcor1, doc-str-St--isoC-tcor2): New standard
+ strings.
+ (doc-operating-system-FreeBSD-5.5, doc-operating-system-FreeBSD-7.0,
+ doc-operating-system-NetBSD-1.6.3, doc-operating-system-NetBSD-4.0
+ doc-operating-system-DragonFly-*): New operating system strings.
+
+ * tmac/groff_mdoc.man, NEWS: Document `Dx'.
+
+2006-03-21 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/pic/pic.y (object_spec THEN): For compatibility with
+ both DWB pic and dpic, make
+
+ right;
+ line then down;
+
+ equal to
+
+ right;
+ line right then down;
+
+ instead of
+
+ right;
+ line 0 then down;
+
+ * doc/pic.ms: Document this.
+
+2006-03-20 Werner LEMBERG <wl@gnu.org>
+
+ * doc/pic.ms: With permission of Eric Raymond, put it under the
+ GPL.
+
+ * NEWS: Updated.
+
+2006-03-19 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/pic/pic.y (expr <INT>): Really return integer part.
+
+ * src/preproc/pic/objects.cpp (object_spec::make_line): Handle `at'
+ attribute in combination with `with'. Bug reported by Jennifer
+ Sayers <jenjen@mail.usyd.edu.au>.
+
+2006-03-19 Miklos Somogyi <msom@netspace.net.au>
+
+ * doc/groff.texinfo (Manipulating Spacing): Improve documentation of
+ `.sp'.
+
+2006-03-18 Werner LEMBERG <wl@gnu.org>
+
+ * LICENSE: Renamed to...
+ * LICENSES: This. Collect all licensing information in this file.
+ * tmac/README, src/libs/snprintf/README: Removed.
+
+ * src/devices/grops/grops.man: Add section how to install fonts.
+
+ * src/utils/xtotroff/xtotroff.c: Add GPL.
+
+2006-03-17 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile.comm (.y.cpp): Fix #line arguments in output.
+
+2006-03-13 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/tbl/tbl.man: Mention default length of text blocks.
+
+ * tmac/doc-common (Os): Add more Darwin versions.
+ * tmac/groff_mdoc.man: Document them.
+
+ * doc/groff.texinfo (Operators in Conditionals): Mention that `c'
+ works with \N'...' also.
+ * man/groff_diff.man: Ditto. Remove use of future tense where
+ possible.
+
+2006-03-12 Michail Vidiassov <master@iaas.msu.ru>
+
+ * font/devps/generate/make-zapfdr, font/devps/symbolsl.ps,
+ font/devps/zapfdr.ps: Add `%%EndComments' line.
+
+2006-03-10 Larry Kollar <kollar@alltel.net>
+
+ * doc/groff.texinfo (Headers and footers): Document PT, HD, and BT.
+
+2006-03-10 Werner LEMBERG <wl@gnu.org>
+
+ * src/devices/grops/ps.cpp (ps_printer::do_exec, ps_printer::do_def,
+ ps_printer::do_mdef): Overlong lines now cause a warning message,
+ not an error.
+
+2006-03-09 Werner LEMBERG <wl@gnu.org>
+
+ * font/devps/generate/make-zapfdr: New script for generating
+ `zapfdr.ps'.
+
+2006-03-08 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.css (pre): Fix `background-color' value.
+
+2006-03-04 Larry Kollar <kollar@alltel.net>
+
+ * tmac/groff_ms.man: Document PT, HD, and BT.
+
+2006-03-04 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/node.cpp (make_glyph_node): Improve warning message
+ for single-letter glyph names.
+
+2006-03-02 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/sv.tmac: New file; currently holding only the Swedish strings
+ for -mm.
+ * tmac/hyphen.sv: New hyphenation pattern file for Swedish, taken
+ from CTAN.
+ * tmac/README: Updated.
+
+2006-02-27 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/trans.tmac (Liec, Letdate, Letns!14): Add it (for -mm).
+ * tmac/fr.tmac: Add French translations.
+
+ * tmac/composite.tmac: Add entry for `:'.
+
+2006-02-26 Werner LEMBERG <wl@gnu.org>
+
+ * doc/Makefile.sub (HTMLEXAMPLEFILESALL): New variable.
+ (CLEANADD): Use it.
+ (install_html, uninstall_sub): Updated.
+
+2006-02-26 Bruno Haible <bruno@clisp.org>
+
+ Introduce Unicode fonts.
+
+ * font/devhtml/DESC.proto: Mark as unicode.
+ * font/devhtml/R.proto: Remove all charset entries that are already
+ in glyphuni.cpp.
+ * font/devutf8/DESC.proto: Mark as unicode.
+ * font/devutf8/R.proto: Remove all charset entries.
+ * src/include/font.h (font): New static field `is_unicode'.
+ Change order of fields.
+ * src/libs/libgroff/font.cpp: Include unicode.h.
+ (font::font): Update for changed order of fields.
+ (font::contains, font::get_width, font::get_height, font::get_depth,
+ font::get_italic_correction, font::get_left_italic_correction,
+ font::get_subscript_correction, font::get_character_type,
+ font::get_code, font::get_special_device_encoding): Handle both the
+ explicitly enumerated glyphs and use general code for Unicode fonts.
+ (font::load): Make the charset section optional when the font is
+ declared unicode.
+ (font::load_desc): Recognize the `unicode' attribute.
+ * src/libs/libgroff/fontfile.cpp (font::is_unicode): New variable.
+
+2006-02-26 Claudio Fontana <claudio@gnu.org>
+
+ * Makefile.in: Add comment about DESTDIR.
+
+ * Makefile.sub: Add DESTDIR to install and uninstall targets
+ to support staged installations.
+ * Makefile.comm: Likewise.
+ * doc/Makefile.sub: Likewise.
+ * contrib/eqn2graph/Makefile.sub: Likewise.
+ * contrib/grap2graph/Makefile.sub: Likewise.
+ * contrib/pic2graph/Makefile.sub: Likewise.
+ * src/devices/xditview/Makefile.sub: Likewise.
+ * src/preproc/eqn/Makefile.sub: Likewise.
+ * src/roff/grog/Makefile.sub: Likewise.
+ * src/roff/nroff/Makefile.sub: Likewise.
+ * src/utils/afmtodit/Makefile.sub: Likewise.
+ * src/utils/indxbib/Makefile.sub: Likewise.
+ * tmac/Makefile.sub: Likewise.
+
+2006-02-24 Werner LEMBERG <wl@gnu.org>
+
+ * src/libs/libgroff/glyphuni.cpp (glyph_to_unicode_list): Use entry
+ for \-.
+ Remove commented out entries for \' and \` (there are no such glyph
+ names).
+
+ * src/libs/libgroff/uniglyph.cpp (unicode_to_glyph_list): Remove
+ commented out entries for \' and \`.
+
+
+ * */*: s/legal/valid/ where appropriate.
+
+2006-06-23 Werner LEMBERG <wl@gnu.org>
+
+ * font/devhtml/R.proto, font/devutf8/R.proto: Remove incorrect \'
+ and \` entries.
+
+2006-02-22 Werner LEMBERG <wl@gnu.org>
+
+ Remove all remaining traces from the `shc' glyph.
+
+ * src/libs/libgroff/glyphuni.cpp (glyph_to_unicode_list),
+ src/libs/libgroff/uniglyph.cpp (unicode_to_glyph_list): Remove
+ entry for `shc'.
+
+ * font/devlatin1/R.proto, font/devcp1046/R.proto: Replace `shc'
+ entry with unnamed glyph.
+
+ * tmac/html/tmac: Remove `shc' entry from call to `.cflags'.
+
+ * src/preproc/preconv/preconv.cpp (unicode_entity): Handle U+00AD
+ specially.
+
+2006-02-22 Bruno Haible <bruno@clisp.org>
+
+ Concretize the `glyph' datatype.
+
+ * src/include/font.h (glyph): Remove class.
+ (glyph): Renamed from struct `glyphinfo'.
+ (glyph_to_index): New inline function.
+ (glyph_to_name): Make extern, not inline.
+ (glyph_to_number): Update.
+ (font): Use `glyph *' instead of `glyph'.
+
+ * src/libs/libgroff/nametoindex.cpp (charinfo): Inherit from class
+ `glyph'. Make `name' field public.
+ (character_indexer, number_to_glyph, name_to_glyph): Use `glyph *'
+ instead of `glyph'.
+ (glyph_to_name): Renamed from `glyph::glyph_name'.
+
+ * src/roff/troff/charinfo.h (charinfo): Inherit from class `glyph'.
+ Use `glyph *' instead of `glyph'.
+
+ * src/roff/troff/input.cpp (name_to_glyph, number_to_glyph): Use
+ `glyph *' instead of `glyph'.
+ (glyph_to_name): Renamed from `glyph::glyph_name'.
+
+ * src/libs/libgroff/font.cpp: Use `glyph *' instead of `glyph',
+ and `glyph_to_index' instead of `glyph::glyph_index'.
+
+ * src/include/printer.h (printer): Use `glyph *' instead of `glyph'.
+ * src/libs/libdriver/printer.cpp: Likewise.
+ * src/devices/grodvi/dvi.cpp: Likewise.
+ * src/devices/grohtml/post-html.cpp: Likewise.
+ * src/devices/grolbp/lbp.cpp: Likewise.
+ * src/devices/grolj4/lj4.cpp: Likewise.
+ * src/devices/grops/ps.cpp: Likewise.
+ * src/devices/grotty/tty.cpp: Likewise.
+
+2006-02-22 Werner LEMBERG <wl@gnu.org>
+
+ * font/devdvi/generate/tc.map: Add `sr' glyph.
+ * font/devdvi/*TC: Regenerated.
+
+ * src/libs/libgroff/glyphuni.cpp (glyph_to_unicode_list): Use entry
+ for `sqrt'.
+
+2006-02-21 Werner LEMBERG <wl@gnu.org>
+
+ * man/groff_char.man: Explain `***' marker.
+
+2006-02-17 Bruno Haible <bruno@clisp.org>
+
+ * src/libs/libgroff/nametoindex.cpp (character_indexer): Rename
+ methods and fields from *_index to *_glyph.
+ (character_indexer::named_char_glyph): Test for `charNNN' name
+ here...
+ (name_to_glyph): ... not here.
+
+2006-02-17 Bruno Haible <bruno@clisp.org>
+
+ * src/include/font.h (name_to_glyph): Renamed from
+ font::name_to_index.
+ (number_to_glyph): Renamed from font::number_to_index.
+ (glyph_to_name): Renamed from font::index_to_name.
+ (glyph_to_number): Renamed from font::index_to_number.
+ * src/libs/libgroff/nametoindex.cpp: Likewise.
+ * src/roff/troff/charinfo.h (charinfo::as_glyph): Renamed from
+ charinfo::get_index.
+
+ * src/roff/troff/input.cpp: All callers changed.
+ * src/roff/troff/node.cpp: Likewise.
+ * src/libs/libgroff/font.cpp: Likewise.
+ * src/devices/grops/ps.cpp: Likewise.
+ * src/devices/grohtml/post-html.cpp: Likewise.
+ * src/libs/libdriver/printer.cpp: Likewise.
+
+2006-02-17 Werner LEMBERG <wl@gnu.org>
+
+ * src/include/ptable.h, src/include/itable.h
+ (NEXT_PTABLE_SIZE_DEFINED): Use it to avoid multiple declaration
+ of external symbol `next_ptable_size' (used by both header files).
+
+2006-02-15 Bruno Haible <bruno@clisp.org>
+
+ * src/include/font.h (glyphinfo): New class.
+ (glyph): Change internal representation.
+ Change constructor signature.
+ New method glyph::glyph_number().
+ (glyph::glyph, glyph glyph::undefined_glyph, glyph::glyph_index,
+ glyph::operator==, glyph::operator!=): Update.
+ (font::index_to_name, font::index_to_number): New functions.
+
+ * src/include/itable.h: New file, based on src/include/ptable.h.
+
+ * src/libs/libgroff/nametoindex.cpp: Include itable.h.
+ (class charinfo): New class.
+ (class character_indexer): Change table result type from `int' to
+ `class charinfo'.
+ Add table with integer key.
+ (character_indexer::character_indexer): Update.
+ (character_indexer::ascii_char_index): Update.
+ (character_indexer::numbered_char_index): Use NULL as name, not a
+ string starting with a space.
+ (character_indexer::named_char_index): Update.
+ (font::number_to_index, font::name_to_index): Remove no-op cast.
+ (glyph::glyph_name): New method.
+ * src/roff/troff/charinfo.h (class charinfo): Inherit from class
+ glyphinfo.
+ (NUMBERED): Remove flag bit.
+ (charinfo::numbered, charinfo::get_index): Update.
+
+ * src/roff/troff/input.cpp (charinfo::charinfo): Update.
+ (charinfo::set_number, charinfo::get_number): Update.
+ (glyph::glyph_name): New method.
+
+2006-02-15 Werner LEMBERG <wl@gnu.org>
+
+ * src/libs/libgroff/glyphuni.cpp (glyph_to_unicode_list): Fix
+ entries for `>>', `<<', `*f', and `+f'. Reported by Bruno.
+
+2006-02-13 Werner LEMBERG <wl@gnu.org>
+
+ * font/devps/prologue.ps (RE): Check `UniqueID' also, similar to
+ dvips.
+
+2006-02-11 Werner LEMBERG <wl@gnu.org>
+
+ * src/include/font.h: s/glyph_t/glyph/.
+ Update all callers.
+
+ * src/devices/grotty/tty.cpp: s/glyph/tty_glyph/.
+ s/output_character_t/output_character/.
+
+2006-02-11 Bruno Haible <bruno@clisp.org>
+
+ New accessor method glyph_t::glyph_name().
+
+ * src/include/ptable.h (declare_ptable): Add a return value to the
+ `define' method, and declare a `lookupassoc' method.
+ (implement_ptable): Return the stored key in `define'. Implement
+ lookupassoc.
+ * src/include/font.h (glyph_t): Add `name' field. Add an argument
+ to the constructor.
+ (glyph_t::glyph_name): New method.
+
+ * src/libs/libgroff/nametoindex.cpp (character_indexer): Change
+ return type of methods and field member type to glyph_t.
+ (character_indexer::character_indexer): Update.
+ (character_indexer::ascii_char_index): Allocate a name for the
+ glyph.
+ Return a glyph_t with name.
+ (character_indexer::numbered_char_index): Return a glyph_t without a
+ name.
+ (character_indexer::named_char_index): Return a glyph_t with a name.
+ (font::number_to_index, font::name_to_index): Update.
+
+ * src/roff/troff/input.cpp (charinfo::charinfo): Use the symbol as
+ the glyph's name.
+
+2006-02-11 Bruno Haible <bruno@clisp.org>
+
+ * src/devices/grotty/tty.cpp (output_character_t): New type.
+ (tty_printer::make_bold, tty_printer::add_char,
+ tty_printer::put_char): Change argument type to output_character_t.
+ (crossings): Change element type to output_character_t.
+
+2006-02-11 Bruno Haible <bruno@clisp.org>
+
+ Make the glyph data type abstract.
+
+ * src/include/font.h (glyph_t): New class.
+ (name_to_index, number_to_index): Change return type to glyph_t.
+ (font::contains, font::get_width, font::get_height, font::get_depth,
+ font::get_character_type, font::get_kern, font::get_skew,
+ font::get_italic_correction, font::get_left_italic_correction,
+ font::get_subscript_correction, font::get_code,
+ font::get_special_device_encoding, font::add_entry,
+ font::copy_entry, font::add_kern, font::hash_kern): Change argument
+ type to glyph_t.
+
+ * src/libs/libgroff/font.cpp (font_kern_list): Change members
+ type and constructor argument types to glyph_t.
+ (font::contains, font::get_width, font::get_height, font::get_depth,
+ font::get_character_type, font::get_kern, font::get_skew,
+ font::get_italic_correction, font::get_left_italic_correction,
+ font::get_subscript_correction, font::get_code,
+ font::get_special_device_encoding, font::add_entry,
+ font::copy_entry, font::add_kern, font::hash_kern): Change argument
+ type to glyph_t.
+ (font::load): Use glyph_t variables.
+
+ * src/libs/libgroff/nametoindex.cpp (name_to_index,
+ number_to_index): Change return type to glyph_t.
+
+ * src/roff/troff/charinfo.h (charinfo::index): Change type to
+ glyph_t.
+ (charinfo::get_index): Change return type to glyph_t.
+
+ * src/roff/troff/env.cpp: Include font.h.
+
+ * src/roff/troff/node.cpp: Include font.h before charinfo.h.
+
+ * src/roff/troff/input.cpp: Include font.h before charinfo.h.
+ (charinfo::charinfo): Update.
+ (name_to_index, number_to_index): Change return type to glyph_t.
+
+ * src/include/printer.h (printer::set_char_and_width): Change return
+ type to glyph_t.
+
+ * src/libs/libdriver/printer.cpp (printer::set_char_and_width):
+ Change return type to glyph_t.
+
+ * src/devices/grodvi/dvi.cpp (dvi_printer::set_char): Change
+ argument type to glyph_t.
+
+ * src/devices/grohtml/post-html.cpp (page::add_and_encode): Update.
+ (html_printer::space_glyph): Renamed from space_char_index.
+ (html_printer::add_to_sbuf, html_printer::sbuf_continuation,
+ html_printer::overstrike, html_printer::set_char): Change argument
+ type to glyph_t.
+ (html_printer::set_char_and_width): Change return type to glyph_t.
+
+ * src/devices/grolbp/lbp.cpp (lbp_printer::set_char): Change
+ argument type to glyph_t.
+
+ * src/devices/grolj4/lj4.cpp (lj4_printer::set_char): Change
+ argument type to glyph_t.
+
+ * src/devices/grops/ps.cpp (ps_printer::space_glyph): Renamed from
+ space_char_index.
+ (ps_printer::set_subencoding, ps_printer::set_char): Change argument
+ type to glyph_t.
+
+ * src/devices/grotty/tty.cpp (tty_printer::set_char): Change
+ argument type to glyph_t.
+
+2006-02-11 Bruno Haible <bruno@clisp.org>
+
+ * src/roff/troff/input.cpp (font::name_to_index): Never return a
+ negative value.
+
+ * src/libs/libgroff/font.cpp (font::load): Remove failure tests for
+ font::name_to_index.
+
+2006-02-10 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo (Assigning Formats): Number registers are always
+ interpolated.
+ Apply some rephrasing, contributed by Michael Burt.
+
+2006-02-07 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/fr.tmac <ms>: Set `HY' register.
+
+2006-02-07 Werner LEMBERG <wl@gnu.org>
+
+ Add framework for simple adaptation of the main macro packages (mm,
+ me, ms, mom) to different locales. In particular, add support for
+ French. For activation, simply use `-mfr' as the last macro
+ package. This feature has been contributed by Fabrice Ménard
+ <menard.fabrice@wanadoo.fr>.
+
+ * tmac/fr.tmac, tmac/trans.tmac, tmac/hyphen.fr, tmac/LOCALIZATION:
+ New files.
+ * tmac/README: Mention hyphen.fr.
+ * man/groff_tmac.man: Mention fr.tmac.
+ * NEWS: Updated.
+
+2006-01-27 Werner LEMBERG <wl@gnu.org>
+
+ * man/groff_font.man: Updated documentation of `entity_name' field.
+ Avoid future tense.
+
+2006-01-27 Bruno Haible <bruno@clisp.org>
+
+ * font/devhtml/R.proto: Remove the entity names from the font's
+ special_encoding_encoding column.
+ * src/devices/grohtml/post-html.cpp (get_html_entity): New function,
+ handling the entity names here.
+ (get_html_translation): Use it. Change return type to `const
+ char *'.
+ (page::add_and_encode): Update, removing a useless cast.
+
+2006-01-26 Werner LEMBERG <wl@gnu.org>
+
+ This change is based on a patch by Bruno Haible <bruno@clisp.org>.
+
+ * src/include/device.h: Add comments.
+ * src/include/font.h: Add comments.
+ * src/include/unicode.h: Likewise.
+ * src/include/ptable.h, src/libs/libgroff/ptable.cpp: Likewise.
+
+2006-01-26 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Suppress `.st' request emission by `grn'.
+
+ * src/preproc/grn/main.cpp (USE_ST_REQUEST): New macro.
+ (conv): Use it.
+
+2006-01-22 Werner LEMBERG <wl@gnu.org>
+
+ * install-sh: New version; taken from texinfo CVS.
+
+2006-01-21 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/preconv/preconv.cpp (main): Set program_name. Bug
+ reported by Alexander E. Patrakov <patrakov@ums.usu.ru>.
+
+2006-01-19 Bruno Haible <bruno@clisp.org>
+
+ Let `make -k install' install more files.
+
+ * Makefile.in (MAKE_K_FLAG): New variable. Use it everywhere where
+ $(MAKE) and $(MDEFINES) are used.
+ (CPROGDIRS): Remove $(XPROGDIRS). Treat $(XPROGDIRS) like
+ $(CPROGDIRS) everywhere.
+ ($(DEVDIRS) $(XDEVDIRS) $(OTHERDEVDIRS) $(TTYDEVDIRS)): Don't depend
+ on $(XPROGDIRS).
+ ($(OTHERDIRS)): Likewise.
+
+
+ * src/devices/grohtml/post-html.cpp (get_html_translation): Remove
+ failure test for font::name_to_index -- it can never fail.
+
+2006-01-19 Werner LEMBERG <wl@gnu.org>
+
+ * src/devices/grops/grops.man: Fix section on creating EPS files.
+ Don't use future time in manual.
+ Other minor fixes.
+
+2006-01-15 Gaius Mulley <gaius@glam.ac.uk>
+
+ * tmac/www.tmac: New macro LINKSTYLE which allows users to set
+ various typographical URL attributes for non-HTML devices.
+
+ * tmac/groff_www.man: Document LINKSTYLE.
+
+2006-01-11 Werner LEMBERG <wl@gnu.org>
+
+ * configure.ac: Test for getc_unlocked (needed for localcharset).
+ * configure, src/include/config.hin: Regenerated.
+
+ * src/libs/libgroff/Makefile.sub (EXTRA_CFLAGS): Define
+ ENABLE_RELOCATABLE.
+
+ * src/libs/libgroff/relocatable.h: New dummy header file for
+ localcharset.c.
+
+ * src/libs/libgroff/localcharset.c: Updated to (unchanged) CVS
+ gnulib version.
+
+2006-01-10 Bruno Haible <bruno@clisp.org>
+
+ Work around unportability of nl_langinfo(CODESET).
+
+ * m4/glibc21.m4: New file, from gnulib.
+ * Makefile.sub (M4MACROS): Add m4/glibc21.m4.
+ * configure.ac: Also test for stddef.h, and invoke jm_GLIBC21.
+ * Makefile.in (HOST, GLIBC21): New variables.
+ (MDEFINES): Pass them to subdirectories.
+ * src/include/relocate.h (relocatep): Define with C linkage.
+ * src/include/localcharset.h: New file, from gnulib.
+ * src/libs/libgroff/localcharset.c: New file, from gnulib with a
+ modification for relocate().
+ * src/libs/libgroff/config.charset: New file, from gnulib.
+ * src/libs/libgroff/ref-add.sin: New file, from gnulib.
+ * src/libs/libgroff/ref-del.sin: New file, from gnulib.
+ * src/libs/libgroff/Makefile.sub (EXTRA_CFLAGS): Also define LIBDIR.
+ (OBJS): Add localcharset.o.
+ (CSRCS): Add localcharset.c.
+ (all): Add dependencies to charset.alias, ref-add.sed, ref-del.sed.
+ (charset.alias): New rule.
+ (PACKAGE): New variable.
+ (ref-add.sed, ref-del.sed): New rules.
+ (MKINSTALLDIRS): New variable.
+ (install_data): Depend on install_charset_data.
+ (install_charset_data): New rule for creating or updating
+ charset.alias.
+ (uninstall_sub): Depend on uninstall_charset_data.
+ (uninstall_charset_data): New rule for uninstalling or updating
+ charset.alias.
+ * src/preproc/preconv/preconv.cpp: Include localcharset.h instead
+ of <langinfo.h>.
+ (main): Initialize default_encoding from locale_charset() instead of
+ nl_langinfo(CODESET).
+
+ * aclocal.m4, configure, src/include/config.hin: Regenerated.
+
+2006-01-10 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/preconv/preconv.cpp (conversion_iconv): Use
+ ICONV_CONST in call to iconv. Reported by Robert Goulding.
+
+2006-01-07 Werner LEMBERG <wl@gnu.org>
+
+ * font/devps/generate/freeeuro.sfd: Run auto-hinter with recent
+ fontforge version.
+ Bump font version to 001.001.
+
+ * font/devps/generate/Makefile (freeeuro.afm, freeeuro.pfa):
+ Call fontforge, not pfaedit.
+
+ * font/devps/freeeuro.afm, font/devps/freeeuro.pfa: Regenerated.
+
+2006-01-05 Ruslan Ermilov <ru@FreeBSD.org>
+
+ * tmac/doc-common: Add new FreeBSD and NetBSD versions.
+ * tmac/groff_mdoc.man: Updated.
+
+2006-01-05 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/preconv/preconv.cpp: s/debug/debug_flag/.
+ (raw_flag): New global variable.
+ (do_file): Use .lf to set file name (if `raw_flag' isn't set).
+ Don't pass BOM to `conversion_utf8'.
+ (usage): Updated.
+ (main): Handle `-r' command line switch to set `raw_flag'.
+ (get_BOM): Fix encodings in `BOM_table'.
+
+ * src/preproc/preconv/preconv.man: New file. Not complete yet.
+ * src/preproc/proconv/Makefile.sub (MAN1): New variable.
+
+2006-01-04 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/preconv/preconv.cpp (emacs_to_mime): As suggested by
+ Bruno, comment out most encodings to support only a small set of
+ coding tags, thus reducing potential problems with legacy encodings
+ and character sets in the future.
+ Add many XEmacs coding tags (now commented out).
+ Add `cp1047'.
+ (check_encoding_tag): Renamed to...
+ (check_coding_tag): This.
+ (get_BOM): Return encoding as specified by BOM.
+ Test for UTF32-LE too.
+ (do_file): Don't check for coding tag if a BOM has been found.
+
+2006-01-03 Bruno Haible <bruno@clisp.org>
+
+ * m4/groff.m4: Renamed from aclocal.m4.
+ * m4/codeset.m4: New file, from gnulib.
+ * m4/iconv.m4: New file, from gnulib.
+ * m4/lib-ld.m4, m4/lib-link.m4, m4/lib-prefix.m4: New files, from
+ gnulib.
+ * config.rpath: New file, from gnulib.
+ * config.guess, config.sub: New files, from gnulib.
+ * Makefile.sub (M4MACROS): New variable.
+ (configure): Fix typo.
+ (aclocal.m4): New rule.
+ (stamp-h.in): Depend on aclocal.m4.
+ * configure.ac: Invoke AM_ICONV and AM_LANGINFO_CODESET.
+ * Makefile.in (LIBICONV): New variable.
+ (MDEFINES): Pass it to recursive makes.
+ * src/preproc/preconv/preconv.cpp: Use HAVE_LANGINFO_CODESET and
+ HAVE_ICONV instead of I18N macro.
+ * src/preproc/preconv/Makefile.sub (EXTRA_LDFLAGS): New variable.
+
+ * aclocal.m4, configure, src/include/config.hin: (Re)generated.
+
+2006-01-03 Werner LEMBERG <wl@gnu.org>
+
+ * doc/Makefile.in (webpage.html): Simplify.
+ * doc/Makefile.sub (webpage.html): Synchronize with doc/Makefile.in.
+ * doc/webpage.ms, tmac/groff_www.man, tmac/www.tmac: Minor updates.
+
+2006-01-01 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/doc-common (Os): Add some Darwin versions.
+ * tmac/groff_mdoc.man: Document them.
+
+2006-01-01 Bruno Haible <bruno@clisp.org>
+
+ * src/preproc/preconv/preconv.cpp (emacs_to_mime): Various
+ corrections:
+ . Don't map ascii to latin-1.
+ . Don't use IBMxxx encodings but cpxxx for portability.
+ . Map cp932, cp936, cp949, cp950 to itself.
+ (emacs2mime): Protect calls to strcasecmp.
+ (conversion_iconv): Add missing call to iconv_close.
+ (do_file): Emit error message in case of unsupported encoding.
+
+2005-12-31 Werner LEMBERG <wl@gnu.org>
+
+ Integrate preconv into the groff binary. Changes based on a patch
+ from Michail Vidiassov.
+
+ * src/roff/groff/pipeline.h (MAX_COMMANDS): Increase by 1.
+
+ * src/roff/groff/groff.cpp (PRECONV_INDEX): New macro.
+ (SOELIM_INDEX): Updated.
+ (help, synopsis): Updated.
+ (main): Add command line options `-k' and `-K enc' to select
+ encoding.
+ Add support for GROFF_ENCODING environment variable.
+
+ * src/roff/groff/groff.man: Updated and revised.
+
+
+ Start with autoconf support for preconv.
+
+ * configure.ac: Call AC_C_BIGENDIAN.
+ * configure, src/include/config.hin: Regenerated.
+
+2005-12-30 Werner LEMBERG <wl@gnu.org>
+
+ New preprocessor `preconv' to convert input encodings to something
+ groff can understand. Not yet integrated within groff. Proper
+ autoconf stuff is missing too.
+
+ Tomohiro Kubota has written a first draft of this program, and some
+ ideas have been reused (while almost no code has been taken
+ actually).
+
+ * src/preproc/preconv/preconv.cpp. src/preproc/preconv/Makefile.sub:
+ New files.
+
+ * MANIFEST, Makefile.in (CCPROGDIRS), test-groff.in
+ (GROFF_BIN_PATH): Add preconv.
+
+2005-12-12 Werner LEMBERG <wl@gnu.org>
+
+ * aclocal.m4 (GROFF_MAKEINFO): Fix regexps to be POSIX conformant.
+ In particular, don't use `\+' since it is a GNU sed extension.
+
+ * configure: Regenerated.
+
+2005-12-09 Werner LEMBERG <wl@gnu.org>
+
+ * src/libs/libgroff/make-uniuni: New script to generate uniuni.cpp.
+
+ * src/libs/libgroff/uniuni.cpp: Regenerated, using data from Unicode
+ 4.1.0.
+
+
+ * src/utils/afmtodit/make-afmtodit-tables: New script to generate
+ afmtodit.tables.
+
+ * src/utils/afmtodit/afmtodit.tables: New file, representing Unicode
+ 4.1.0 data.
+
+ * src/utils/afmtodit/afmtodit.pl (%unicode_decomposed,
+ %AGL_to_unicode): Removed. Replace it with a tag.
+
+ * src/utils/afmtodit/Makefile.sub (afmtodit): Adjust sed expression
+ to replace tag with actual file contents.
+
+2005-12-08 Werner LEMBERG <wl@gnu.org>
+
+ The change 2005-06-20 can indeed cause problems, so we follow the
+ advice by using marks.
+
+ * font/devps/prologue.ps (PBEGIN): Use `mark'.
+ (PEND): Use `cleartomark'.
+
+2005-12-07 Michail Vidiassov <master@iaas.msu.ru>
+
+ * src/utils/afmtodit.pl: Fix kerning output to avoid warnings for
+ glyphs which have kern values but aren't handled (glyph variants,
+ for example).
+
+2005-12-02 Werner LEMBERG <wl@gnu.org>
+
+ * src/devices/grops/ps.cpp (ps_printer::get_subfont): Use correct
+ subfont index. Reported by Michail Vidiassov <master@iaas.msu.ru>.
+
+2005-11-28 Gaius Mulley <gaius@glam.ac.uk>
+
+ * doc/Makefile.in: Separate rule for webpage.html so that extra
+ command line options can be passed to grohtml.
+ * doc/groff.css: Change all margins to 0%.
+ * doc/webpage.ms: Now use new macros ALN, LNS, and LNE so that left
+ navigation is exploited. Also update webpage to contain new
+ sections on licenses, mailing lists, cvs/ftp access, groff
+ dependencies, and bug reports.
+ * tmac/groff_www.man: Document the new macros ALN, LNS, and LNE.
+ * tmac/www.tmac: Implement the new macros ALN, LNS, and LNE.
+
+2005-11-25 Gaius Mulley <gaius@glam.ac.uk>
+
+ * src/devices/grohtml/post-html.cpp
+ (html_printer::do_file_components): Add fputs calls to emit the
+ head contents and shut down the head tag whenever a new file
+ component is generated.
+
+2005-11-22 Gaius Mulley <gaius@glam.ac.uk>
+
+ * src/devices/grohtml/post-html.cpp (html_printer::flush_page): Add
+ call to flush_text to flush any outstanding html tags on the
+ paragraph stack.
+
+2005-11-18 Werner LEMBERG <wl@gnu.org>
+
+ * aclocal.m4 (GROFF_MAKEINFO): Use `groff.info' in tests.
+ Announce makeinfo version.
+ * configure: Regenerated.
+
+2005-11-18 Mike Frysinger <vapier@gentoo.org>
+
+ * Makefile.in: Declare proper dependencies between make targets.
+
+ * doc/Makefile.in: Rename groff info page to `groff.info'.
+ * doc/Makefile.sub: Likewise.
+ * doc/groff.texinfo: Likewise.
+
+2005-11-17 Peter O'Gorman <mlists@thewrittenword.com>
+
+ * src/utils/pfbtops/pfbtops.c, src/utils/xtotroff/xtotroff.c: Move
+ definition of __GETOPT_PREFIX to the beginning of file to ensure
+ that it is defined even on platforms where getopt.h is already
+ included by other header files.
+
+2005-11-10 Gaius Mulley <gaius@glam.ac.uk>
+
+ * src/devices/grohtml/post-html.cpp (html_printer::do_heading):
+ Reset font to NULL to ensure that a font block is recreated during
+ the next paragraph.
+
+2005-11-04 Werner LEMBERG <wl@gnu.org>
+
+ * aclocal.m4 (GROFF_MAKEINFO): Fix sed expression.
+ * configure: Regenerated.
+
+2005-10-27 Werner LEMBERG <wl@gnu.org>
+
+ * aclocal.m4 (GROFF_MAKEINFO): New function for checking whether
+ makeinfo 4.8 or newer is available.
+ * configure.ac: Call GROFF_MAKEINFO.
+ * configure: Regenerated.
+
+ * Makefile.in (MAKEINFO): Use autoconf variable.
+ (MDEFINES): Add MAKEINFO.
+
+ * doc/Makefile.in (MAKEINFO): Use autoconf variable.
+ * doc/Makefile.sub (MAKEINFO): Remove.
+
+2005-10-26 Werner LEMBERG <wl@gnu.org>
+
+ * REVISION: Set to 3.
+
+2005-10-17 Werner LEMBERG <wl@gnu.org>
+
+ Mention $MANPAGER variable used with some `man' systems.
+
+ * doc/webpage.ms, src/devices/grotty/grotty.man, NEWS: Updated.
+
+2005-09-13 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/hyphenex.us: New version (`ushyphex.tex' from ftp.dante.de).
+
+Copyright 2005-2009 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+Local Variables:
+coding: latin-1
+fill-column: 72
+mode: change-log
+version-control: never
+End:
+vim:set autoindent textwidth=72:
diff --git a/ChangeLog.121 b/ChangeLog.121
new file mode 100644
index 0000000..80f4197
--- /dev/null
+++ b/ChangeLog.121
@@ -0,0 +1,788 @@
+
+Version 1.21 released
+=====================
+
+ * NEWS, REVISION, VERSION, doc/groff.texinfo, doc/webpage.ms:
+ Updated.
+ * aclocal.m4, configure: Regenerated.
+
+2010-12-31 Werner LEMBERG <wl@gnu.org>
+
+ * doc/webpage.ms: Updated.
+
+2010-12-31 Werner LEMBERG <wl@gnu.org>
+
+ * configure: Regenerate with autoconf 2.67.
+
+2010-12-31 Werner LEMBERG <wl@gnu.org>
+
+ Update various scripts.
+
+ * config.guess, config.sub: Update from `config' repository.
+ * install-sh, mkinstalldirs: Update from `gnulib' repository.
+
+2010-12-31 Werner LEMBERG <wl@gnu.org>
+
+ Update texinfo.tex.
+
+ * doc/texinfo.tex: Update from `texinfo' repository.
+
+2010-12-30 Werner LEMBERG <wl@gnu.org>
+
+ Call texi2dvi with correct makeinfo binary.
+
+ * doc/Makefile.in (.texinfo.dvi, .texinfo.pdf): Use $(MAKEINFO).
+
+2010-12-30 Werner LEMBERG <wl@gnu.org>
+
+ Documentation updates.
+
+ * NEWS, PROBLEMS, MANIFEST: Update.
+
+2010-12-26 Werner LEMBERG <wl@gnu.org>
+
+ Speed up troff.
+
+ * src/include/ptable.h (PTABLE): Make hash tables much more sparse
+ by changing the ratio `FULL_NUM/FULL_DEN' from 2/3 to 1/4. This
+ increases the allocated memory by about 200kByte (which is nothing
+ today) but assures that there aren't extremely long searches for a
+ free hash slot in case that the hash function doesn't return a free
+ one. Due to the nature of the entries in uniuni.cpp, the used hash
+ function in ptable.cpp is not optimal, but using a sparse array
+ compensates this.
+
+2010-12-20 Werner LEMBERG <wl@gnu.org>
+
+ Replace patch from 2010-12-18 with a much faster implementation.
+
+ * src/roff/troff/node.h (node): Add virtual function
+ `get_break_code'.
+
+ * src/roff/troff/node.cpp (inter_char_space_node): Remove class
+ completely.
+ (glyph_node::merge_glyph_node): Restore previous version.
+
+ (break_char_node): Add `prev_break_code' field and update
+ constructors.
+ (node::get_break_code, break_char_node::get_break_code): Implement.
+
+ (node::add_char): Pass remaining cflags values.
+
+ (break_char_node::add_self): Use the logic of the now deleted
+ `inter_char_space_node::add_self' function to insert a space node if
+ necessary.
+
+2010-12-20 Daiki Ueno <ueno@unixuser.org>
+
+ A new try to not changing srcdir if building in separate builddir.
+
+ Makefile.in ($GNULIBDIRS): Disable calls to autoconf and friends.
+
+2010-12-20 Werner LEMBERG <wl@gnu.org>
+
+ Speed up access to cflags values.
+
+ We now recompute the cflags values for all charinfo objects if
+ `.class' has been called.
+
+ * src/roff/troff/charinfo.h: Add external references to `class_flag'
+ and `get_flags'.
+ (charinfo): `get_flags' no longer has a return value.
+ (charinfo::overlaps_horizontally, charinfo::overlaps_vertically,
+ charinfo::can_break_before, charinfo::can_break_after,
+ charinfo::can_break_after, charinfo::ends_sentence,
+ charinfo::transparent,, charinfo:ignore_hcodes,
+ charinfo::prohibit_break_before, charinfo::prohibit_break_after,
+ charinfo::inter_char_space): Call global `get_flags' only if
+ necessary.
+ (charinfo::add_to_class): Set `class_flag'.
+
+ * src/roff/troff/input.cpp (class_flag): New global flag.
+ (charinfo::charinfo): Call `get_flags' member function.
+ (get_flags): New global function which iterates over all entries in
+ the charinfo dictionary.
+ (charinfo::get_flags): Set `flags' directly.
+
+2010-12-19 Werner LEMBERG <wl@gnu.org>
+
+ Protect `.class' against cyclic nesting.
+
+ * src/roff/troff/charinfo.h (charinfo::contains): Add optional
+ boolean argument.
+ * src/roff/troff/input.cpp (define_class, charinfo::contains): Check
+ for cyclic nesting.
+
+2010-12-18 Werner LEMBERG <wl@gnu.org>
+
+ Improve CJK support with new values for `.cflags'.
+
+ This patch introduces three new values to `.cflags':
+
+ don't break before character: 128
+ don't break after character: 256
+ allow inter-character break: 512
+
+ They are handled differently if compared to other cflags values:
+
+ (1) hcode values are completely ignored
+ (2) similar to kern values, and contrary to the other cflags
+ values, troff looks at pairs of characters to decide whether a
+ break gets inserted
+
+ A yet-to-be-written patch should add inter-character spacing if
+ those flags are active; currently, only zero-width breakpoints are
+ inserted.
+
+ * src/roff/troff/charinfo.h (charinfo): Change type of `flags' to
+ `int'. Update callers accordingly.
+ New enum values `DONT_BREAK_BEFORE', `DONT_BREAK_AFTER', and
+ `INTER_CHAR_SPACE'.
+ New member functions `prohibit_break_before',
+ `prohibit_break_after', and `inter_char_space'.
+ * src/roff/troff/input.cpp: Updated.
+
+ * src/roff/troff/node.cpp (inter_char_space_node): New class similar
+ to kern_pair_node, collecting charinfo entities with the
+ abovementioned cflags values.
+ (break_char_type): Add new enum values.
+ (glyph_node::merge_glyph_node): Handle abovementioned cflags values
+ and emit an `inter_char_space_node' if necessary.
+
+ * tmac/ja.tmac: Use new cflags values.
+
+ * doc/groff.texinfo, NEWS, man/groff_diff.man: Document new values.
+
+2010-12-18 Werner LEMBERG <wl@gnu.org>
+
+ Remove compiler warning.
+
+ * src/libs/libgroff/relocate.cpp (msw2posixpath): Remove redundant
+ dereferencing.
+
+2010-12-16 Daiki Ueno <ueno@unixuser.org>
+
+ Don't change srcdir if building in a separate builddir.
+
+ * Makefile.in ($GNULIBDIRS): Copy configuring stuff of gnulib if
+ necessary.
+
+2010-12-15 Werner LEMBERG <wl@gnu.org>
+
+ Fix compilation problem.
+
+ This issue happens with gcc 4.2.4.
+
+ * src/roff/troff/node.cpp (node::~node): Move to...
+ * src/roff/troff/node.h: Here. This ensures that the inline
+ member function is publicly visible.
+
+2010-12-15 Werner LEMBERG <wl@gnu.org>
+
+ Remove unused code.
+
+ * src/roff/troff/node.cpp, src/roff/troff/node.h
+ (space_node::space_node): Remove unused constructor.
+
+2010-12-15 Werner LEMBERG <wl@gnu.org>
+
+ Use enum to increase readability.
+
+ * src/roff/troff/node.cpp (break_char_type): New enum.
+ (break_char_node::add_self, node::add_char): Use it.
+
+2010-12-13 Daiki Ueno <ueno@unixuser.org>
+ Werner LEMBERG <wl@gnu.org>
+
+ Add wide character support to grotty.
+
+ This is a huge patch, mainly by adding the gnulib infrastructure in
+ a separate directory tree (in `src/libs/gnulib/lib') for its
+ `wcwidth' module. However, the actual changes to native groff
+ source files are just a few lines.
+
+ * Makefile.comm (INCLUDES): Updated.
+ (LIBGNU): Define.
+
+ * Makefile.in (NOMAKEDIRS): Updated.
+ (GNULLIBDIRS): Define.
+ (DISTDIRS): Add GNULLIBDIRS.
+ ($LIBDIRS): Depend on GNULLIBDIRS.
+ ($GNULLIBDIRS): New target.
+
+ * src/libs/libgroff/font.cpp (font::get_width, font::load)
+ [is_unicode]: Use `wcwidth'.
+
+ * src/roff/troff/Makefile.sub (XLIBS): Add LIBGNU.
+ * src/roff/troff/input.cpp (main): Set LC_CTYPE.
+
+ * src/devices/grotty/Makefile.sub (XLIBS): Add LIBGNU.
+ * src/devices/grotty/tty.cpp (main): Set LC_CTYPE.
+
+ * src/libs/gnulib/*: New files. The import was done as follows:
+
+ . Call
+
+ gnulib-tool --create-testdir \
+ --dir=src/libs/gnulib \
+ wcwidth
+
+ to get a testbed.
+
+ . Manually move directories src/libs/gl{lib,m4} to
+ src/libs/{lib,m4}, and do s/gllib/lib/ and s/glm4/m4/ everywhere
+ to `convert' the gnulib testbed to a standard gnulib
+ configuration as maintained by gnulib-tool.
+
+ . Call
+
+ gnulib-tool --add-import \
+ --dir=src/libs/gnulib \
+ wcwidth
+
+ to update everything.
+
+2010-12-13 Werner LEMBERG <wl@gnu.org>
+
+ `.class' must not emit empty lines.
+
+ * src/roff/troff/input.cpp (define_class): Add missing `skip_line'
+ calls.
+
+2010-12-06 UKAI Fumitoshi <ukai@debian.or.jp>
+ Colin Watson <cjwatson@debian.org>
+
+ Add Japanese localization.
+
+ * tmac/ja.tmac: New file.
+ * tmac/Makefile.sub (NORMALFILES): Updated.
+
+2010-12-06 Colin Watson <cjwatson@debian.org>
+ Daiki Ueno <ueno@unixuser.org>
+
+ Implement support for character classes.
+
+ This patch uses standard C++ headers, contrary to the rest of groff.
+ Ideally, everything in groff should be updated to do the same.
+
+ * src/include/font.h (glyph_to_unicode): New function.
+
+ * src/libs/libgroff/font.cpp (glyph_to_unicode): Implement it.
+ (font::contains, font::get_code): Use it.
+
+ * src/roff/troff/charinfo.h: Include <vector> and <utility>.
+ (charinfo): New members `ranges' and `nested_classes'.
+ New member functions `get_unicode_code' and `get_flags'.
+ New member functions `add_to_class', `is_class', and `contains'.
+ (charinfo::overlaps_horizontally, charinfo::overlaps_vertically,
+ charinfo::can_break_before, charinfo::can_break_after,
+ charinfo::can_break_after, charinfo::ends_sentence,
+ charinfo::transparent,, charinfo:ignore_hcodes): Use `get_flags',
+ which handles character classes also.
+
+ * src/roff/troff/input.cpp (char_class_dictionary): New global
+ variable.
+ (define_class): New function.
+ (init_input_requests): Register `class'.
+
+ (charinfo::get_unicode_code, charinfo::get_flags,
+ charinfo::contains): Implement it.
+
+ * NEWS, doc/groff.texinfo (Character Classes), man/groff_diff.man,
+ man/groff.man: Document it.
+
+2010-11-11 Anton Shepelev <anton.txt@gmail.com>
+
+ [grohtml]: Improve texinfo documentation.
+
+ * doc/groff.texinfo (grohtml): Insert man page description, slightly
+ extended.
+
+2010-11-11 Werner LEMBERG <wl@gnu.org>
+
+ Fix crash in tbl with option `nospaces'.
+ Reported by Louis Guillaume <louis@zabrico.com>.
+
+ * src/libs/libgroff/string.cpp (string::remove_spaces): If input
+ data consists of spaces only and thus reduces to nothing, set `sz'
+ to 0.
+
+2010-11-02 Ulrich Spörlein <uqs@spoerlein.net>
+
+ [mdoc]: Complete previous patch and document OpenBSD releases.
+
+ * tmac/doc-common (doc-operating-system-NetBSD): Add versions 5.0,
+ 5.0.1, and 5.0.2.
+ (doc-operating-system-OpenBSD-*): New strings.
+ (doc-operating-system-FreeBSD-*): Add version 8.1.
+ (doc-operating-system-DragonFly-*): Add versions 2.2, 2.4, 2.6, and
+ 2.8.
+ (Os): Handle DragonFly and OpenBSD.
+
+ * tmac/groff_mdoc.man: Document OpenBSD releases.
+ Add DragonFly release 2.8.
+
+2010-11-02 Ulrich Spörlein <uqs@spoerlein.net>
+
+ [mdoc]: Improve man page.
+
+ * tmac/groff_tmac.man: Fix prologue macro order.
+ Update NetBSD, FreeBSD, and DragonflyBSD version numbers.
+ Other minor layout improvements.
+
+2010-11-02 Anton Shepelev <anton.txt@gmail.com>
+
+ [grohtml] Improve man page.
+
+ * src/devices/grohtml/grohtml.man: Document two-pass handling of
+ input data.
+
+2010-09-19 Werner LEMBERG <wl@gnu.org>
+
+ [groff] Don't use prefix for preconv.
+ Reported by Dorai Sitaram <ds26gte@yahoo.com>
+
+ * src/roff/groff/groff.cpp (main): Fix it.
+
+2010-07-28 Larry Kollar <kollar@windstream.net>
+
+ * doc/groff.texinfo, man/groff.man: Document `!' operator better.
+
+2010-06-28 Jan Vcelak <jvcelak@redhat.com>
+
+ * src/roff/troff/node.cpp (make_node): Adding missing `%'.
+ Reported in
+ http://lists.gnu.org/archive/html/bug-groff/2010-06/msg00022.html
+
+2010-06-05 Larry Jones <lawrence.jones@siemens.com>
+
+ * man/groff_diff.man: Document \n[.P].
+
+2010-06-04 Werner LEMBERG <wl@gnu.org>
+
+ * NEWS: Updated.
+
+2010-06-04 Denis M. Wilson <dmw@oxytropis.plus.com>
+
+ afmtodit: Add option `-o' to specify an output file.
+
+ * src/utils/afmtodit.pl: Implement it.
+ * src/utils/afmtodit.man: Document it.
+
+2010-06-04 Larry Jones <lawrence.jones@siemens.com>
+
+ * man/groff_diff.man: Document \n[.O].
+
+2010-05-30 Werner LEMBERG <wl@gnu.org>
+
+ Fix metric files for devps families A, BM, and font ZCMI.
+ Problem reported by Denis M. Wilson <dmw@oxytropis.plus.com>.
+
+ * font/devps/{AB, ABI, AI, AR, BMB, BMBI, BMI, BMR, ZCMI}:
+ Regenerated, using correct AFM files (from the Adobe Core 35 fonts
+ with 229 glyphs).
+
+2010-05-28 Werner LEMBERG <wl@gnu.org>
+
+ Don't use obsolete intermediate output command `F'.
+ Reported by Krzysztof Zelechowski <giecrilj@stegny.2a.pl>
+
+ * src/roff/troff/nodes.cpp (troff_output_file::really_put_filename):
+ Replace `F' command with `x F'.
+
+2010-05-24 Werner LEMBERG <wl@gnu.org>
+
+ * PROBLEMS: Document that mdoc doesn't work with test-groff.
+ Reported by Krzysztof Zelechowski <giecrilj@stegny.2a.pl>
+
+2010-05-22 Werner LEMBERG <wl@gnu.org>
+
+ Document preconv in texinfo.
+
+ * doc/groff.texinfo: Mention preconv and its related command line
+ options for groff.
+ Add stubs for direct preconv documentation.
+ Sort groff options and environment variables.
+
+2010-05-22 Werner LEMBERG <wl@gnu.org>
+
+ Use DESC's `unicode' keyword for grotty.
+
+ Consequently, no longer check directly for the `utf8' device name
+ which prevented the creation of arbitrarily called output device
+ directories like `devunicode'.
+
+ Problem reported by Christopher Yeleighton <giecrilj@stegny.2a.pl>
+ in Savannah bug #29895.
+
+ * src/devices/grotty/tty.cpp (tty_printer): Remove `is_utf8' member.
+ Replace all occurrences with `font::is_unicode'.
+ (tty_printer::tty_printer): Remove argument.
+
+ * src/devices/grotty/grotty.man: Document `unicode' keyword.
+
+2010-05-19 Werner LEMBERG <wl@gnu.org>
+
+ Update symbol tables for devps font generation.
+
+ * font/devps/generate/textmap: Sort alphabetically.
+ Replace tabs with spaces.
+
+ * font/devps/generate/symbolchars: Update list to remove duplicates
+ which have already been added to `textmap' on 2007-04-09.
+
+ * font/devps/symbolmap: Regenerated.
+
+ * font/devps/*: Regenerate font definition files.
+
+2010-05-09 Colin Watson <cjwatson@debian.org>
+
+ Handle ditroff command `Dt' without argument gracefully.
+
+ Without this patch, grotty goes into an infinite loop if it tries to
+ process
+
+ x T utf8
+ x res 240 24 40
+ x init
+ p1
+ Dt
+
+ * src/libs/libdriver/input.cpp (get_integer_arg): Emit a fatal error
+ on a non-integer argument, bringing the code into line with the
+ behaviour documented in the header comment.
+ (get_possibly_integer_args): Terminate the loop on a non-integer
+ argument.
+ (next_arg_begin): Return newline or EOF after emitting the
+ corresponding error, rather than continuing on to the next line.
+
+2010-05-01 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Improve documentation of \R escape.
+
+2010-03-10 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Document \n[DD] register.
+ Updated version stuff.
+
+2010-03-10 Larry Kollar <kollar@windstream.net>
+
+ * tmac/groff_ms.man: Document \n[DD] register.
+ Problem reported by Ted.
+
+2010-02-25 Colin Watson <cjwatson@debian.org>
+
+ Use named signals for `trap' in shell scripts.
+
+ * contrib/eqn2graph/eqn2graph.sh, contrib/grap2graph/grap2/graph.sh,
+ contrib/pic2graph/pic2graph.sh: Do it.
+
+2010-02-25 Werner LEMBERG <wl@gnu.org>
+
+ Fix angle brackets in grohtml.
+ Reported by Colin Watson <cjwatson@debian.org>.
+
+ * src/devices/grohtml/post-html.cpp (get_html_entity): Add U+27E8
+ and U+27E9.
+
+2010-02-24 Colin Watson <cjwatson@debian.org>
+
+ Add new FreeBSD and Posix versions.
+
+ * tmac/doc-common: Add FreeBSD versions 7.2, 7.3, and 8.0
+ * tmac/doc-syms: Add Posix 2008.
+ * tmac/groff_mdoc.man: Document it.
+
+2010-02-16 Larry Kollar <kollar@windstream.net>
+
+ tbl: Add `nowarn' option.
+
+ * src/preproc/tbl/table.h (table): Add `NOWARN' enumeration value.
+
+ * src/preproc/tbl/main.cpp (process_options),
+ src/preprox/tbl/table.cpp (table::compute_expand_width,
+ table::compute_separation_factor): Handle `NOWARN'.
+
+ * src/preproc/tbl/tbl.man, NEWS: Document it.
+
+2010-02-08 Larry Kollar <kollar@windstream.net>
+
+ * tmac/www.tmac (www-li-ol): Fix indentation if more than 10 items.
+
+2010-02-04 Larry Kollar <kollar@windstream.net>
+
+ Improve `tbl' warnings.
+
+ * src/preproc/tbl/table.cpp (table::compute_expand_width,
+ table::compute_separation_factor): Add file name strings to
+ warnings.
+
+2010-01-23 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ Fix `MC' macro of the ms package.
+
+ * tmac/s.tmac (@MC): Define `pg*col-top' after the paragraph has
+ been initialized. Otherwise, using this example,
+
+ .nh
+ .nf
+ .kern 0
+ .pl 6c
+ .ll 70n
+ .MC 30n
+ Text for multiple columns.
+ Text for multiple columns.
+ Text for multiple columns.
+ Text for multiple columns.
+ Text for multiple columns.
+
+ the columns start at different vertical positions.
+
+2010-01-23 Larry Kollar <kollar@alltel.net>
+
+ * tmac/www.tmac (www-li-{ul,ol,dl}): Handle `PORPHANS' register.
+
+2010-01-23 Larry Kollar <kollar@alltel.net>
+
+ PROBLEMS: Document some Mac OS issues.
+
+2010-01-02 Deri James <deri@chuzzlewit.demon.co.uk>
+
+ Don't hardcode `ps' device.
+ This is needed for cooperation with gropdf.
+
+ * src/preproc/pic/troff.cpp (troff_output::text): Use GROPS_REG.
+
+2009-12-31 Werner LEMBERG <wl@gnu.org>
+
+ Make patterns with uppercase letters work.
+ Problem reported by Bjarni Ingi Gislason <bjarniig@rhi.hi.is>.
+
+ * src/roff/troff/input.cpp (init_hpf_code_table): Use `cmlower'.
+ * doc/groff.texinfo, man/groff_diff.man: Update documentation of
+ `hpfcode' request.
+
+2009-11-24 Maurice van der Pot <griffon26@kfk4ever.com>
+
+ Fix double frees and memory leaks.
+
+ * src/roff/troff/env.cpp (environment::make_tag): Use local object.
+ * src/roff/troff/input.cpp (input_stack::check_end_diversion): Free
+ `diversion_state' here.
+ (interpolate_arg): Fix memory leaks.
+ * src/roff/troff/mtsm.cpp (mtsm::pop_state): Don't free `sp->state'.
+
+2009-11-20 Paulo Ricardo Zanoni <pzanoni@mandriva.com>
+
+ * */*.cpp: Replace `printf(string);' with `printf("%s", string);'.
+
+2009-10-28 Werner LEMBERG <wl@gnu.org>
+
+ Document limitations with `#' characters, tbl, and eqn.
+ Problem reported by Michael Kain <mcain6925@comcast.net>.
+
+ * src/preproc/eqn/eqn.man, src/preproc/tbl/tbl.man: Do it.
+
+2009-10-26 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/doc-common (Dx): Define register.
+
+2009-10-26 Jörg Sonnenberger <joerg@britannica.bec.de>
+
+ Implement `%U' in mdoc for URL references.
+
+ * tmac/doc-common (%U): New register.
+ (Rd): Handle `doc-url-count' and `doc-url-name'.
+
+ * tmac/doc.tmac (doc-url-count, doc-url-name): New registers.
+ (doc-save-global-vars, doc-restore-global-vars, doc-reset-reference,
+ doc-print-reference): Handle `doc-url-count' and `doc-url-name'.
+ (%U): New macro.
+
+ * NEWS, tmac/groff_mdoc.man: Document `%U' macro.
+
+2009-09-09 Jari Aalto <jari.aalto@cante.net>
+
+ * src/roff/groff/groff.man: Point to troff(1) for `-w' and `-W'.
+
+2009-09-08 Werner LEMBERG <wl@gnu.org>
+
+ [troff]: Fix hyphenation problem with kerned letters.
+ Problem reported by Steve Izma <sizma@golden.net>.
+
+ * src/roff/troff/node.cpp
+ (kern_pair_node::add_discretionary_hyphen): Compute `tf' using the
+ first node, `n1'. `n2' might be another kerning node, and the
+ `get_tfont' member function isn't defined then.
+
+2009-09-01 Michael Cain <mcain6925@comcast.net>
+
+ [pic] Fix a border case for arc computation.
+
+ * src/preproc/pic/object.cpp (object_spec::make_arc): It can happen
+ that test `radius < d' in the loop is satisfied, but the difference
+ in the two values is on the order of 1e-10. If `radius' is small,
+ doubling the value can lead to a fairly gross error.
+
+ The original code appears to have been intended to deal with the
+ situation when radius is orders of magnitude less than `d'. The
+ replacement code simply assigns `radius' the smallest value that
+ avoids problems with the floating point code further on in the
+ routine.
+
+2009-08-14 Roger Leigh <rleigh@debian.org>
+
+ * man/groff_char.man: Fix white heart and diamond unicode values.
+
+2009-07-29 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/hyphen.fr: Fix typo which prevents hyphenation.
+ Reported by Seb <sbb@tuxfamily.org>.
+
+2009-06-25 Werner LEMBERG <wl@gnu.org>
+
+ Make groff compile on Interix.
+ Reported by Jay Krell <jay.krell@cornell.edu>.
+
+ * configure.ac: Call AC_USE_SYTEM_EXTENSIONS.
+
+ * src/include/lib.h [__INTERIX]: Define _ALL_SOURCE.
+
+ * configure: Regenerated.
+
+2009-05-29 Werner LEMBERG <wl@gnu.org>
+
+ pic: Fix handling of nested positions.
+ Reported by Doug McIlroy <doug@cs.dartmouth.edu>.
+
+ * src/preproc/pic/pic.y: Split `expr' into `expr_lower_than' and
+ `expr_not_lower_than' so that we can handle
+
+ (1/3)<(1/2)<foo,bar>,baz>
+
+ correctly. Without the patch, `(1/3)<(1/2)' is handled prematurely
+ as a comparison.
+
+2009-05-07 Werner LEMBERG <wl@gnu.org>
+
+ Accept \0 and friends within \o.
+ Reported by Doug McIlroy <doug@cs.dartmouth.edu>.
+
+ * src/roff/troff/token.h (token): Add TOKEN_HORIZONTAL_SPACE
+ enumeration value together with `horizontal_space' member function.
+ Add `do_overstrike' as a friend.
+
+ * src/roff/troff/input.cpp: Use TOKEN_HORIZONTAL_SPACE for \0, \|,
+ \^, and \h.
+ Update all affected places.
+ (do_overstrike): Remove `static' attribute.
+ Accept all escapes which produce a fixed horizontal space.
+
+2009-04-24 Werner LEMBERG <wl@gnu.org>
+
+ Use straight quotes where appropriate.
+ Reported by Reuben Thomas <rrt@sc3d.org>.
+
+ * man/groff.man: Do it.
+
+2009-04-14 Werner LEMBERG <wl@gnu.org>
+
+ Fix documentation of `em' request.
+ Reported by Joachim Walsdorff
+ <Joachim.Walsdorff@urz.uni-heidelberg.de>.
+
+ * doc/groff.texinfo (End-of-input Traps): Rewrite.
+
+2009-04-10 Werner LEMBERG <wl@gnu.org>
+
+ Fix a memory leak in troff for -Thtml.
+ Reported by Urs Eggli <Urs.Eggli@zuerich.ch>.
+
+ * src/roff/troff/node.h (node::~node): Move to...
+ * src/roff/troff/node.cpp: Here. Free `state' and `push_state'.
+
+2009-04-01 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/doc.tmac: Call `ec' before mapping characters.
+
+2009-03-07 Werner LEMBERG <wl@gnu.org>
+ Gunnar Florus <http://florus.no>
+
+ Improve configuration.
+
+ * configure.ac: Read `VERSION' and `REVISION' files to provide
+ proper values for AC_INIT.
+ * Makefile.in: Use `@datarootdir@' and `@docdir@' so that
+ configure's `--datarootdir' and `--docdir' options are honoured.
+ Documentation is now by default installed into something like
+ `/usr/local/share/doc/groff-1.20.1'.
+
+ * configure: Regenerated.
+
+2009-02-21 Colin Watson <cjwatson@debian.org>
+ Werner LEMBERG <wl@gnu.org>
+
+ Add a new `file' warning category.
+
+ * src/roff/troff/troff.h (warning_type): Add WARN_FILE.
+ * src/roff/troff/input.cpp (DEFAULT_WARNING_MASK): Include
+ WARN_FILE.
+ (warning_table): Add `file' category.
+ (macro_source): Convert error on missing macro file to a
+ warning.
+ * NEWS, doc/groff.texinfo (I/O, Warnings), man/groff_diff.man,
+ src/roff/troff/troff.man: Document new warning category.
+
+2009-02-18 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Improve documentation of `lsm' request.
+
+2009-02-14 Werner LEMBERG <wl@gnu.org>
+
+ Implement a leading spaces macro request, `lsm', in analogy to
+ `blm'.
+ Implement two new number registers, \n[lsn] and \n[lss], which hold
+ the number of spaces and the horizontal space, respectively, which
+ would be inserted if the macro registered by `lsm' wasn't called.
+
+ * src/roff/troff/input.cpp (leading_spaces_macro_name,
+ leading_spaces_number, leading_spaces_space): New global
+ variables.
+ (leading_spaces_macro): New function.
+ (process_input_stack) <token::TOKEN_SPACE>: Handle `lsm'.
+ (init_input_requests): Register `lsm', \n[lsn], and \n[lss].
+
+ * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo
+ (Leading Spaces Traps): Document new requests and registers.
+
+2009-02-10 Denis M. Wilson <dmw@oxytropis.plus.com>
+
+ * man/groff.man: Document missing number registers (`$$', `.b',
+ `.F', `.j', `.k', `.L', `.O', `.P', `.R', `opmaxx', `opmaxy',
+ `opminx', `opminy').
+
+ * doc/groff.texinfo: Document missing `.R' register.
+ Add `.U' to register index.
+
+2009-01-19 Werner LEMBERG <wl@gnu.org>
+
+ Fix incorrect grops color state before \X'...'.
+ Problem reported by Miklos Somogyi <msom@netspace.net.au>.
+
+ * src/devices/grops/ps.cpp (ps_printer::special): Check color state
+ before doing a PS special and flush buffer.
+ Update called functions.
+
+Copyright 2009-2010 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+Local Variables:
+coding: utf-8
+fill-column: 72
+mode: change-log
+version-control: never
+End:
+vim:set autoindent textwidth=72:
diff --git a/ChangeLog.122 b/ChangeLog.122
new file mode 100644
index 0000000..b33249b
--- /dev/null
+++ b/ChangeLog.122
@@ -0,0 +1,5331 @@
+Version 1.22.4 released
+=======================
+
+2018-12-18 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Fix 'dvi' and 'pdf' texinfo doc generation.
+
+ GNU make has a built-in variable 'TEXI2DVI' but it is not the case
+ of all 'make' implementations, which causes 'make doc' to fail
+ with an unclear message although 'texi2dvi' is available. Also,
+ 'texi2dvi' is invoked inconditionnally.
+
+ * m4/groff.m4 (GROFF_TEXI2DVI): new macro to detect properly the
+ presence of 'texi2dvi'.
+
+ * configure.ac: use 'GROFF_TEXI2DVI' and define automake conditional
+ 'HAVE_TEXI2DVI'.
+
+ * doc/doc.am:
+ - Define TEXI2DVI to 'texi2dvi'.
+ - Print an error message if 'texi2dvi' is not available.
+
+2018-12-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi: Drop documentation of "man" macro package from
+ our Texinfo manual. The mdoc, me, mm, and mom packages all
+ maintain their documentation externally to this manual as
+ well. Exception: portions not about man proper--which are not
+ duplicated from groff_man(7)--on use of man.local (including
+ examples of Ultrix-compatible macros) are retained.
+
+2018-12-08 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Install texinfo doc on 'make install-pdf' and 'make install-html'
+
+ * doc/doc.am:
+ - Use automake 'install-pdf-local' and 'install-html-local' rules
+ to install groff.pdf and groff.html
+ - New rules 'uninstall_pdf' and 'uninstall_html'.
+ - Use $(RM) instead of 'rm'.
+ - Don't try to build doc if 'BUILD_INFODOC' is not set.
+ * INSTALL.REPO: document texinfo build and installation.
+
+2018-12-10 Ingo Schwarze <schwarze@openbsd.org>
+
+ * Makefile.am: Remove the unused variables PREFIXMAN5 and PREFIXMAN7.
+
+ They caused installation failures on Solaris 9.
+
+2018-12-08 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Remove gnulib's hypot module.
+
+ The removal of 'GROFF_NEED_DECLARATION([hypot])' in 'configure.ac'
+ was correct as the test was buggy, but there is no need to use
+ gnulib's hypot module as previously we did not need to provide a
+ replacement function.
+
+ * bootstrap.conf: do it.
+
+2018-12-08 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Problem running gropdf on big endian (Sparc)
+
+ * src/devices/gropdf/gropdf.pl: Prior to perl v5.9 the 'L<'
+ template for 'unpack' was unavailable. Solaris 10 uses v5.8.4
+ so safer to use the template 'V' rather than 'L<'.
+
+2018-12-08 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Use gnulib's 'hypot' module.
+
+ In 'configure.ac', the macro call
+ 'GROFF_NEED_DECLARATION([hypot])' checks whether the function
+ 'hypot' is correctly declared in 'math.h', but the test is buggy
+ and may yields false results.
+
+ * bootstrap.conf: add 'hypot' module.
+
+ * configure.ac: Remove GROFF_NEED_DECLARATION([hypot]).
+
+ * src/libs/libgroff/hypot.cpp: remove declaration of hypot.
+
+2018-12-07 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Problem running gropdf on big endian (Sparc)
+
+ * src/devices/gropdf/gropdf.pl: When loading a binary (.pfb)
+ font for embedding always use little endian to unpack chunk
+ headers.
+
+2018-12-05 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Skip mom tests if needed config is missing.
+
+ * contrib/mom/examples/test-mom.sh.in: exit 77 if URW fonts are
+ not available.
+
+ * contrib/mom/mom.am: distribute inconditionnally test-mom.in.
+
+ * m4/groff.m4 (GROFF_URW_FONTS): check if 'awk' and 'gs' are
+ available, and replace non-portable 'grep' command by awk script.
+
+2018-12-01 Colin Watson <cjwatson@debian.org>
+
+ Fix error handling in tests of mom examples
+
+ * contrib/mom/examples/test-mom.sh.in (check_number_pages): Correct
+ error message.
+ (check_has_images): Correct shell syntax error.
+
+2018-11-26 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Document .sp behaviour in -me doc -- French translation
+
+ * doc/meintro_fr.me: translation of commit
+ 7a83f7f5003e24f020306f09f4d497e04e82cb14.
+
+ Fixes bug https://savannah.gnu.org/bugs/?54958.
+
+2018-11-24 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Fix tarball generation: script 'makevarescape.sed' was missing.
+
+ * Makefile.am (EXTRA_DIST): add it.
+
+2018-11-24 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Add automatic tests on mom examples
+
+ * m4/groff.m4 (GROFF_PDFTOOLS): check presence of some pdf tools.
+ * configure.ac: use 'GROFF_PDFTOOLS', add new AM conditional.
+ * contrib/mom/examples/test-mom.sh.in: new file that use 'pdfinfo'
+ and 'pdfimages' to make some basic checks on mom examples.
+
+2018-11-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ tmac/sv.tmac: Set Swedish hyphenation flags to 32.
+
+ This permits hyphenation after the first character but continues
+ prohibiting it before the last character of a word, in
+ congruence with the TeX-based hyphenation patterns we use.
+
+ Fixes <https://savannah.gnu.org/bugs/index.php?55066>.
+
+2018-11-19 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Fix build on environment where /etc/papersize contains comments
+
+ Issue introduced on commit efea81c75f831ddc6717c2ef25556e0f49d1f679.
+
+ * m4/groff.m4 (GROFF_PAGE): remove comments and get the 1st string
+ of '/etc/papersize'.
+
+2018-11-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_PAGE): Try /etc/papersize first.
+
+ Fixes <https://savannah.gnu.org/bugs/index.php?53271>.
+
+2018-11-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * bootstrap.conf: Bump Autoconf dependency to 2.68. We need it
+ to support our bug-reporting URL, which contains a "?".
+ Strictly, Autoconf 2.65 is fine, but 2.66 and 2.67 broke this.
+ Even 2.69 is over 6 years old now.
+
+ See <https://savannah.gnu.org/support/?107450>.
+
+2018-11-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4 (GROFF_PAGE): Quote shell variables that are under
+ external control and may contain embedded whitespace. A test
+ shows that our configure script is now robust in this way, but
+ our Automake files are not, starting with
+ src/utils/afmtodit/afmtodit.am.
+
+2018-11-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * makevarescape.sed:
+ - Escape plain spaces and double-quotes (ASCII 32 and 34) so
+ that bad things don't happen if they are embedded in a Make
+ variable expanded in a man page @THUS@ _and_ given as an
+ argument to a macro that distinguishes its parameters, such
+ as .IR.
+ - Add discretionary breaks after groups of slashes not
+ preceded by a space; e.g., transform "/usr/bin/groff" into
+ "/usr/\:bin/\:groff". Will also work on URLs
+ {"https://\:example.com/\:page.html"} in case we need that.
+
+2018-11-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Undocument Werner and Ted as groff maintainers.
+
+ * README:
+ * doc/pic.ms:
+ * src/roff/grog/grog.pl:
+ * src/roff/nroff/nroff.sh: Werner (and Ted) retired from the
+ role some time ago and Bertrand Garrigues has stepped up; see
+ https://lists.gnu.org/archive/html/groff/2017-09/msg00048.html.
+ I'll let him document his maintainer status as and where he
+ prefers.
+
+2018-11-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Stop spelling "Unix" as "UNIX".
+
+ Per AT&T Bell Labs veterans Doug McIlroy and Meg McRoberts,
+ spelling "Unix" in full caps was a contrivance insisted upon by
+ AT&T lawyers, and not a practice used in the Unix manuals
+ themselves or the Bell Labs Technical Journal. See
+ https://lists.gnu.org/archive/html/groff/2015-01/msg00026.html
+ and
+ https://lists.gnu.org/archive/html/groff/2015-01/msg00029.html
+ for support.
+
+ There are instances I did _not_ change; they may require further
+ review.
+ ChangeLog.*
+ NEWS
+ One reference relevant to mdoc; see below.
+ doc/meintro{,_fr}.me
+ These documents also give the small caps
+ treatment to groff, troff, and nroff, suggesting
+ a separate changeset.
+ src/preproc/pic/pic.ypp
+ Contains a comment referring to "Compaq Tru64
+ UNIX"; not worth the candle IMO.
+ tmac/s.tmac:
+ {ms macro package} Leaving UX macro definition
+ alone until/unless it can be established that
+ this doesn't change the rendering of historical
+ documents in an objectionable way.
+ tmac/doc-syms-u:
+ tmac/doc-old.tmac-u:
+ tmac/doc-common-u:
+ tmac/groff_mdoc.7.man:
+ {mdoc macro package} Similar; mdoc defines many
+ strings that spit out "UNIX" (albeit not with a
+ font size change).
+
+ * MORE.STUFF:
+ * NEWS:
+ * README.MinGW:
+ * contrib/groffer/README:
+ * contrib/pdfmark/pdfmark.ms:
+ * contrib/pdfmark/pdfroff.1.man:
+ * doc/groff.texi:
+ * doc/webpage.ms:
+ * m4/groff.m4:
+ * man/groff_diff.7.man:
+ * man/groff_tmac.5.man:
+ * man/roff.7.man:
+ * src/preproc/html/pre-html.cpp:
+ * src/roff/troff/troff.1.man: Change "UNIX" to "Unix",
+ discarding markup as necessary.
+
+2018-11-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ man pages: Escape interpolated Make variables.
+
+ * makevarescape.sed: Transform - to \-, ~ to \(ti, and so forth,
+ {with an extra layer of backslashes--see below} so that Makefile
+ variables containing ASCII characters that do not represent
+ themselves literally in *roff (see groff_char(7)) are correctly
+ interpolated into man page text.
+
+ * Makefile.am (.man): Transform Makefile variables with the
+ above script when interpolating them into man page text.
+
+ Note that while the script, combined with this target, will
+ transform ` to \(ga, including grave accents in Makefile
+ variables is likely to fail when the shell lexes the argument to
+ echo within the old-style command substitution ``. Testing
+ shows that grave accents should work[1] if POSIX-style command
+ substitution $() is done instead. However, $() is less
+ portable. (Triple-escaping grave accents \\\` inside the
+ interpolated Makefile variable will work, but is not attempted
+ at present.)
+
+ Note also that the amount of backslash-escaping in the sed
+ script is excessive (and incorrect) for normal purposes, but
+ required here because a command substitution is being nested
+ inside yet another invocation of sed.
+
+ {1} For this target; no assurances about the good behavior of
+ unusual characters in Makefile variables in other aspects of the
+ groff build are offered.
+
+ Fixes <https://savannah.gnu.org/bugs/index.php?55004>.
+
+2018-11-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/lookbib/lookbib.cpp: Doesn't make much sense to mark
+ Version_string as a C extern if you're just going to hide it in
+ a throwaway scope again. Remove braces, exposing it.
+
+ "lookbib -v" now reports a version number, instead of "(null)".
+
+ Fixes <https://savannah.gnu.org/bugs/index.php?54972>.
+
+2018-11-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libgroff/error.cpp (do_error_with_file_and_line):
+ If:
+ a program name is known;
+ but
+ no file is being processed or the line number is negative,
+ then there was no space between the program name (with colon),
+ and the succeeding diagnostic message.
+
+ Example: lookbib:fatal error: no databases
+
+ Fixes <https://savannah.gnu.org/bugs/index.php?54971>.
+
+2018-11-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Make strip.sed operate only if given permission.
+
+ * tmac/strip.sed: Do nothing whatsoever to any input file that
+ lacks a line matching "%beginstrip%". This implements a
+ contract between the macro file writer and the stripper script
+ {roff input is not parseable with crude weaponry like regular
+ expressions}. In practice, most of the changes performed by the
+ script were already in a block enforcing this. My changes:
+ - Stop unconditionally inserting a roff comment noting the
+ reader of stripping at line 2. Instead, replace the line
+ matching "%beginstrip%" with this comment if and only if it
+ is present.
+ - Stop deleting lines containing only the empty request if
+ they occur before "%beginstrip%".
+ - Tweak the wording of the roff comment.
+ - Remove comment within the sed script; see
+ https://lists.gnu.org/archive/html/groff/2017-11/msg00057.html
+ and the sed section of "Limitations of Usual Tools" in the
+ GNU Autoconf Manual.
+
+ Invalidates <https://savannah.gnu.org/bugs/index.php?53784>.
+
+2018-11-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/an-old.tmac: When emitting diagnostics, report the name
+ of the macro file complaining, and the name and line number of
+ the input file at the time of trouble. Thanks to Bjarni Ingi
+ Gislason for part of the patch.
+
+ Fixes <https://savannah.gnu.org/bugs/?54175> and continues the
+ long process of fixing <https://savannah.gnu.org/bugs/?52463>.
+
+2018-11-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/meintro_fr.me: Add encoding hint to top of file so preconv
+ works correctly even if the build environment's encoding is not
+ UTF-8. Adapted from Bjarni Ingi Gislason's patch. Also add
+ long-form Emacs coding declaration at end of file. Vim's
+ auto-detection seems to be fine, so did not update its modeline.
+
+ Fixes <https://savannah.gnu.org/bugs/index.php?54530>.
+
+2018-11-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/groff_man.7.man: Reorganize and largely rewrite to more
+ precisely document the macro package's behavior and to be more
+ helpful and accessible to man page writers who may never read
+ any other groff documentation.
+
+2018-10-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Clarify meaning of \p escape. Also make more explicit that line
+ adjustment for the .brp request and \p escape depends on the
+ current adjustment mode.
+
+ * doc/groff.texi: Clarify that \p has effect at the next word
+ boundary. Thanks to Dave <barx> for pointing out the issue and
+ providing elucidating language.
+
+ * man/groff.7.man: Similar, but terser.
+
+ Fixes https://savannah.gnu.org/bugs/index.php?54894.
+
+2018-10-04 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Savannah bug # 54812
+
+ * font/devpdf/util/BuildFoundries.pl: If a font is not found
+ report list of paths searched.
+
+ Fix https://savannah.gnu.org/bugs/?54812
+
+2018-10-10 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Update 'gnulib' submodule.
+
+ * gnulib: now points on dce8759f0f0236a860a3e68b63c5e99cc6f168f9
+ from 'gnulib' repository. This fixes build error with glibc 2.28
+ (see https://bugzilla.redhat.com/show_bug.cgi?id=1595702).
+
+2018-10-04 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Savannah bug # 54779
+
+ * font/devpdf/Foundry.in: Recent ghostscript changed name
+ used for embedding groff font HNBI
+
+ Fix https://savannah.gnu.org/bugs/?54779
+
+2018-08-27 Ingo Schwarze <schwarze@openbsd.org>
+
+ * tmac/groff_www.7.man: Do not use .URL, .MTO, .FTP.
+
+2018-08-21 Ingo Schwarze <schwarze@openbsd.org>
+
+ Improve terminal rendering for a few special characters:
+
+ * tmac/tty.tmac: add \[.j] (dotless j)
+ * tmac/tty-char.tmac: for \[a.], fall back to "."
+ * tmac/tty-char.tmac: add playing card suits
+
+2018-08-16 Ingo Schwarze <schwarze@openbsd.org>
+
+ * src/preproc/preconv/preconv.1.man: add -D to the SYNOPSIS
+
+2018-08-09 Ingo Schwarze <schwarze@openbsd.org>
+
+ * Makefile.am: correctly calculate MAJOR_VERSION etc.
+
+2018-06-19 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Fixes to gropdf
+
+ * src/devices/gropdf/gropdf.pl: Make default line width 0.4pt
+ to match grops. Use 'S' operator (stroke) rather than 's' (close
+ and stroke) when Dl command received. Improve switching between
+ text and graphic modes.
+
+2018-07-01 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ [me] paragraph with umlaut incorrectly rendered
+
+ * tmac/e.tmac-u: workaround done by Werner LEMBERG <wl@gnu.org>.
+
+ Fix https://savannah.gnu.org/bugs/?42191
+
+2018-06-19 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Add gropdf new features to NEWS file.
+
+ * NEWS: new features.
+
+2018-05-29 Werner LEMBERG <wl@gnu.org>
+
+ [dvi] Fix glyph map for `cmitt10'.
+
+ Problem reported by Pali Rohár <pali.rohar@gmail.com>.
+
+ http://lists.gnu.org/archive/html/groff/2018-05/msg00088.html
+
+ * font/devdvi/texitt.map: New file. This is identical to
+ `textt.map' except the dollar glyph, which gets replaced by the
+ pound glyph.
+
+ * font/devdvi/generate/Makefile (CWI): Use `texitt.map'.
+
+ * font/devdvi/CWI: Regenerated.
+
+2018-05-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Improve diagnostics on bad hyphenation requests.
+
+ * src/roff/troff/env.cpp: Add new HYPHEN_* symbols to anonymous
+ enum.
+
+ * src/roff/troff/env.cpp (hyphenate_request):
+ - Warn about hyphenation request values that are completely
+ out of range.
+ - Report bad hyphenation request value in diagnostic messages.
+
+2018-04-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ grap2graph: Parallelize changes with pic2graph.
+
+ * contrib/grap2graph/grap2graph.sh:
+ - Refactor temp directory handling.
+ - Handle embedded whitespace in temp dir.
+ - Adapt to old convert(1) programs.
+
+ * contrib/grap2graph/grap2graph.1.man: Make editorial/style
+ changes and minor corrections.
+
+2018-04-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ eqn2graph: Remove -unsafe option.
+
+ * contrib/eqn2graph/eqn2graph.sh: Unrecognize "-unsafe" option
+ and eliminate $groff_opts variable. As far as I can tell, this
+ option had no effect because (1) pic is not run on the input
+ stream (no -p argument to groff); (2) eqn doesn't support
+ "shelling out" as pic does; and (3) there is no way to embed
+ *roff requests inside a sequence of eqn commands. If I'm wrong,
+ let me know.
+
+ * contrib/eqn2graph/eqn2graph.1.man: Undocument "-unsafe"
+ option.
+
+2018-04-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ eqn2graph: Parallelize changes with pic2graph.
+
+ * contrib/eqn2graph/eqn2graph.sh:
+ - Refactor temp directory handling.
+ - Handle embedded whitespace in temp dir.
+ - Adapt to old convert(1) programs.
+
+ * contrib/eqn2graph/eqn2graph.1.man: Make editorial/style
+ changes and minor corrections.
+
+2018-04-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ pic2graph: Refactor temp directory handling.
+
+ * contrib/pic2graph/pic2graph.sh: Issue a diagnostic and give up
+ if the user's desired temporary directory does not exist. Also
+ document the Bashism $RANDOM and work around its absence.
+
+2018-04-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ pic2graph: Handle embedded whitespace in temp dir.
+
+ * contrib/pic2graph/pic2graph.sh: Quote shell variables having
+ to do with the temporary directory's location; without
+ quotation, temporary directory names with embedded whitespace
+ are wrongly handled.
+
+2018-04-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/groff.texi: Bump end of copyright range to 2018. Werner
+ added substantial text this year about hyphenation.
+
+2018-04-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Set version to 1.22.4 in the few places that hard-code it.
+
+ * arch/mingw/grap2graph.cmd:
+ * contrib/groffer/version.sh:
+ * doc/groff.texi:
+ * doc/webpage.ms: Bump from 1.22.3 to 1.22.4.
+
+2018-04-24 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Restrict scaling factors to 3dp and better handle CR/LF in import.
+
+ * src/devices/gropdf/gropdf.pl: Restrict scaling factors to 3dp
+ rounded. If pdf imported with pdfpic uses CR/LF line termination
+ ibclude XObject Image, length of stream out by 1.
+
+2018-04-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ man pages: Shorten version footer.
+
+ * **/*.man: Replace "Groff Version" with "groff" in the fourth
+ argument to .TH in all man pages. This suffices to keep that
+ part of the footer from overrunning the date, even in dirty
+ trees on 80-column terminals.
+
+ Fixes https://savannah.gnu.org/bugs/index.php?53721.
+
+2018-04-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ pic2graph(1): Make editorial/style changes and minor
+ corrections.
+
+2018-04-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ pic2graph: Adapt to old convert(1) programs.
+
+ * contrib/pic2graph/pic2graph.sh: Grep convert's -help output
+ for the string "-trim". If it is not found, the old method for
+ image trimming documented in pic2graph's man page, "-crop 0x0",
+ is used. I am motivated by the fact that the warning about this
+ in our man page is very old (10 years or more), and I wanted to
+ get rid of it.
+
+ pic2graph emits a warning when performing this fallback, in the
+ event the ImageMagick and/or GraphicsMagick teams surprise the
+ world again.
+
+ * contrib/pic2graph/pic2graph.1.man: Remove BUGS section, the
+ entire contents of which was dedicated to convert's change in
+ behavior.
+
+2018-04-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ groff_man(7): Expand command synopsis section.
+
+ This section now explains in detail how to write (and read) a
+ command synopsis.
+
+2018-04-12 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Make PDFPIC behave the same whether -Tps or -Tpdf used.
+
+ Previously the -Tpdf version did not cause a break nor position
+ to the line beneath the imported picture, whilst the -Tps
+ version did.
+
+ * tmac/pdfpic.tmac: Corrected behavior.
+
+ * NEWS: Explain the change of behaviour and how to reinstate
+ the previous behaviour using register PDFPIC_NOSPACE or the
+ environment variable GROFF_PDFPIC_NOSPACE.
+
+2018-03-27 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Define a short version for data installation dir name.
+
+ This is the full version stripped of any characters after the
+ third digit. Used for installation of font, macro and various
+ data (by default in /usr/local/share/groff). The various programs
+ and scripts still use the full version from gnulib script
+ 'git-version-gen' .
+
+ * configure.ac (SHORT_VERSION): short version definition.
+
+ * Makefile.am: use 'SHORT_VERSION' for 'docdir' and 'datasubdir'
+ definitions.
+
+2018-03-11 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Remove doc/automake_migration_tests.txt
+
+ Automake migration was completed long time ago and this file is no
+ longer needed.
+
+2018-03-11 Colin Watson <cjwatson@debian.org>
+
+ Switch to Gnulib implementation of snprintf
+
+ This is more actively maintained, straightforward to integrate now
+ that we have Gnulib integration, and simplifies groff's overall
+ licensing.
+
+ * bootstrap.conf (gnulib_modules): Add `snprintf' and `vsnprintf'.
+ * configure.ac: Remove local checks for `snprintf' and `vsnprintf'.
+ * Makefile.am: Remove various comments related to local checks for
+ `snprintf' and `vsnprintf'.
+ * src/include/lib.h: Remove declarations of `snprintf' and
+ `vsnprintf'.
+ * src/libs/libgroff/libgroff.am (EXTRA_DIST): Remove
+ `src/libs/snprintf/snprintf.c'.
+ * src/libs/snprintf/snprintf.c: Remove.
+
+ * LICENSES: Remove section about `src/libs/snprintf/snprintf.c'.
+ * MANIFEST: Remove entry for `src/libs/libxutil'.
+
+2018-03-09 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ PDF must not open in presentation mode.
+
+ * src/devices/gropdf/gropdf.pl: When GROPDF_NOSLIDE=1
+ passed do not set pdf to presentation mode.
+
+2018-03-09 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Allow a "." to signify a missing parameter in .pdftransition
+
+ * src/devices/gropdf/gropdf.1.man: Explain the .pdftransition
+ macro (and underlying '\X' command) accepts a "." to specify
+ a parameter retains its current value.
+
+2018-03-09 Colin Watson <cjwatson@debian.org>
+
+ man pages: fix incorrect cross-referenced section
+
+ * man/roff.7.man (FILE NAME EXTENSIONS): Correct reference to
+ groff_filenames(5).
+
+2018-03-09 Colin Watson <cjwatson@debian.org>
+
+ mdate.sh: rewrite in Perl
+
+ groff already requires perl to build. This version is much shorter
+ and easier to understand than the shell/awk version: we don't have
+ to worry about convincing ls to produce output that we can parse,
+ and we don't have to play games with the way that the same field may
+ contain either the year or the time depending on how old the file
+ is.
+
+ While I'm at it, this version also adds `SOURCE_DATE_EPOCH' support
+ for reproducible builds: when `SOURCE_DATE_EPOCH' is set, files are
+ considered to have been last modified at that time.
+
+ * mdate.sh: Rewrite in Perl, moving to ...
+ * mdate.pl: ... this new file.
+ * Makefile.am (EXTRA_DIST, .man): Update references.
+
+2018-03-09 Colin Watson <cjwatson@debian.org>
+
+ Remove #! lines from non-executable files
+
+ These are always invoked by the build system (either in-tree or via
+ the installed Makefiles) using the necessary program, so the #!
+ lines were unnecessary. They were harmless except that they caused
+ Debian's `lintian` tool to complain about installed non-executable
+ scripts.
+
+ * font/devlj4/generate/special.awk: Remove #! line.
+ * font/devps/generate/symbol.sed: Likewise.
+
+2018-03-09 Colin Watson <cjwatson@debian.org>
+
+ doc: stop generating W3C validation icons
+
+ Debian's `lintian' tool says:
+
+ These badges may be displayed to tell readers that care has been
+ taken to make a page compliant with W3C standards. Unfortunately,
+ downloading the image from www.w3.org might expose the reader's IP
+ address to potential tracking.
+
+ I think the risk is a small one, but I also don't think the badges
+ are especially valuable, so it doesn't seem like much to ask to just
+ drop them at least for groff's own documentation.
+
+ * doc/doc.am (.ms.html, doc/pic.html): Remove `-P-V' option.
+
+2018-03-01 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Place pdf in presentation mode if new commands used.
+
+ * src/devices/gropdf/gropdf: The new commands which
+ control page transitions should result in the pdf being
+ opened in presentation mode.
+
+2018-03-02 Werner LEMBERG <wl@gnu.org>
+
+ Hyphenation exceptions in pattern files now obey `.hy' (#53196).
+
+ * src/roff/troff/env.cpp (hyphen_trie::read_patterns_file): Mark
+ `\hyphenation' entries with a trailing space.
+ (hyphen_trie::insert_hyphenation): Updated.
+ (hyphenate): Make `\hyphenation' entries obey `.hy' restrictions.
+
+ * doc/groff.texi (.hy): Updated.
+
+2018-03-01 Werner LEMBERG <wl@gnu.org>
+
+ Adjust `.hy' values.
+
+ In most cases hyphenation constraints were too strict. The now
+ selected values reflect the parameters used for the generation of
+ the (TeX) hyphenation patterns.
+
+ * tmac/an-old.tmac, tmac/cs.tmac, tmac/de.tmac, tmac/doc-common-u,
+ tmac/e.tmac-u, tmac/fr.tmac, tmac/s.tmac, tmac/sv.tmac: Fix `.hy',
+ `\n[HY]', and `\n[doc-hyphen-flags]' values.
+
+ * doc/groff.texi, tmac/groff_man.7.man, tmac/groff_ms.7.man, NEWS:
+ Updated.
+
+2018-03-01 Werner LEMBERG <wl@gnu.org>
+
+ Fix some problems related to hyphenation.
+
+ Introduce values 16 (allow hyphenation before last character) and 32
+ (allow hyphenation after first character) to the `hy' request
+ (#48904).
+
+ Really fix problem reported in issue #48904.
+
+ Fix #53243, which is a regression introduced in 2016-09-09.
+
+ * src/roff/troff/env.cpp (HYPHEN_LAST_CHAR, HYPHEN_FIRST_CHAR): New
+ enumeration values.
+ (hyphenate_request): Check for contradicting values.
+ (environment::hyphenate_line): Fix minimum word length considered
+ for hyphenation.
+ (environment::print_env): Updated.
+ (hyphenate): Fix and extend logic. The original patch to handle
+ #48904 was bad.
+
+ * doc/groff.texi, man/groff_diff.7.man, NEWS: Updated.
+
+2018-03-01 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Add page transitions to pdfs created with gropdf.
+
+ * src/devices/gropdf.pl: Handle new '\X' commands to support page
+ transitions in presentation mode pdfs. These commands are a subset
+ of the commands used in present.tmac allowing slideshows to be
+ directly produced from -Tpdf without using postscript -> gpresent.pl
+ -> ghostscript.
+
+ * tmac/pdf.tmac: New macros '.pdfpause' and '.pdftransition' to
+ support page transitions.
+
+ * src/devices/gropdf.1.man: Document the '\X' commands supported.
+
+2018-03-01 Werner LEMBERG <wl@gnu.org>
+
+ Use $(AM_V_GEN) and $(AM_V_P) to silence even more file generation.
+
+ * font/devpdf/devpdf.am (BuildFoundries, DESC, Foundry,
+ build_font_files): Do it.
+
+2018-02-28 Werner LEMBERG <wl@gnu.org>
+
+ Use $(GROFF_V) to silence documentation creation.
+
+ * Makefile.am (GROFF_V): Define.
+
+ * doc/doc.am (.me.txt, .me.ps, .ms.html, .ms.txt, .ms.ps, pic.html,
+ webpage.html): Use $(GROFF_V).
+
+2018-02-28 Werner LEMBERG <wl@gnu.org>
+
+ Use $(AM_V_GEN) to silence file generation.
+
+ * Makefile.am (.man), contrib/eqn2graph/eqn2graph.am (eqn2graph),
+ contrib/grap2graph/grap2graph.am (grap2graph), contrib/pic2graph.am
+ (pic2graph), src/devices/gropdf/gropdf.am (gropdf, pdfmom),
+ src/preproc/eqn/eqn.am (neqn), src/roff/grog/grog.am (grog),
+ src/roff/nroff/nroff.am (nroff), src/utils/afmtodit/afmtodit.am
+ (afmtodit), font/devascii/devascii.am (DEVASCIIFONTSFILES, DESC),
+ font/devcp1047/devcp1047.am (DEVCP1047FONTSFILES, DESC),
+ font/devhtml/devhtml.am (DEVHTMLFONTSFILES, DESC),
+ font/devlatin1/devlatin1.am (DEVLATIN1FONTSFILES, DESC),
+ font/devutf8/devutf8.am (DEVUTF8FONTSFILES, DESC),
+ font/devps/devps.am (DESC, prologue, zapfdr.pfa, symbolsl.pfa),
+ font/devdvi/devdvi.am (DESC), font/devlbp/devlbp.am (DESC),
+ font/devlj4/devlj4.am (DESC): Do it.
+
+2018-02-28 Werner LEMBERG <wl@gnu.org>
+
+ * configure.ac: Activate silent Makefile rules.
+
+2018-02-28 Werner LEMBERG <wl@gnu.org>
+
+ Minor compilation warnings.
+
+ * src/devices/xditview/draw.c: Don't declare `MaxFontPosition'.
+
+ * src/roff/troff/input.cpp (psbb_locator::context_args): Avoid
+ shadowing of `buf'.
+
+2018-02-28 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/troff/env.cpp: s/HYPHEN_/HYPHEN_NOT/ for clarification.
+
+2018-02-26 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Update installation doc.
+
+ * INSTALL.REPO: mention that 'pkg-config' is a dependency.
+
+ * INSTALL.extra: add dependency 'makeinfo' and optional
+ dependencies 'pkg-config' and 'uchardet'.
+
+ * TESTS: move to doc/automake_migration_tests.txt
+
+ * INSTALL.gen: remove, this file is redundant with the 'INSTALL'
+ file from gnulib.
+
+2018-02-02 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Update 'gnulib' submodule.
+
+ * gnulib: now points on cf56f8f618c48cfadd2499ced58574633d12f129
+ from 'gnulib' repository.
+
+2018-02-02 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Use gnulib script 'git-version-gen' to define groff's version
+
+ * bootstrap.conf: add 'git-version-gen' script.
+
+ * configure.ac: suppress 'GROFF_VERSION_STRING' and replace it by
+ the script. If the current commit corresponds to a tag, then the
+ version is simply the tag name. Otherwise the version has the
+ format: <tag>-<nb_commits_from_latest_tag>-<commit sha1>. The
+ version is now stored in '.version'.
+
+ * REVISION: removed.
+
+ * VERSION: removed.
+
+ * Makefile.am: define 'MAJOR_VERSION', 'MINOR_VERSION' and
+ 'REVISION'.
+
+ * src/libs/libgroff/libgroff.am: use 'MAJOR_VERSION',
+ 'MINOR_VERSION' and 'REVISION', add dependency on '.version'.
+
+ * src/roff/troff/troff.am: ditto.
+
+ * contrib/mom/om.tmac-u (short_revision): new string that extracts
+ the first digit of the revision, to be used when checking groff
+ version.
+
+2018-01-18 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ On reflection using an array for Filter is not optimal.
+
+ * src/devices/gropdf.pl: revert single line from commit
+ 18fd1fd0bf05eb9a5ba0d2be1a655a044662a8bf.
+
+2018-01-17 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ All values should be 3 decimals
+
+ * src/devices/gropdf.pl: for values approaching zero values
+ in the for 0.nnnnnnE-nn could be written, not valid syntax for
+ PDF. Make all values rounded to 3 decimals, becomes 0.000.
+
+ Also changed stream Filter dictionary entry to an array.
+
+2018-01-14 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Fix tarball generation ('make distcheck' failed)
+
+ * src/devices/xditview/xditview.am: add .h created by commit
+ 382ab4af269a1dea422c8f9bb5c67a065d026deb to EXTRA_DIST
+
+ * contrib/mm/mm.am: restore distribution of files removed by
+ commit 445bf58765b759546e238a235651eb0bf5b34325.
+
+2018-01-13 Ingo Schwarze <schwarze@openbsd.org>
+
+ Makefile.am: Re-add -F and -M flags needed to build out of src.
+
+2018-01-13 Ingo Schwarze <schwarze@openbsd.org>
+
+ [mdoc]: rewrite the implementation of the .Lk macro
+
+ * tmac/doc.tmac-u (Lk): Rewrite.
+
+ The old implementation was written before the big mdoc
+ rewrite for groff-1.17. In contrast to most other macros,
+ it was never updated to use the new techniques.
+ This new implementation makes .Lk callable, makes trailing
+ punctuation work in the normal way, and makes the style of
+ the implementation consistent with other macros.
+
+ It also removes the feature of automatically switching
+ between in-line and displayed rendering depending on the
+ length of the link because that was inconsistent across
+ output modes and counter-intuitive, resulting in ugly
+ output for many existing real-world manual pages.
+ It now always renders in-line. Use .D1 Lk where desired.
+
+ Merging http://savannah.gnu.org/bugs/?52849
+ OK wl@gnu, jmc@openbsd, bentley@openbsd
+
+2017-12-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ man pages: Comment compatibility-mode switching.
+
+ The '.do' and '.cp' requests (both groffisms) are some of the
+ more obscure features of groff's own man page corpus.
+ Consequently, they get cargo-culted around, within and outside
+ groff. Thanks to Werner Lemberg for the discussion, which
+ revealed (to me) that groff ships with compatibility mode on by
+ default on Solaris 10 and 11.
+
+ Fix bug https://savannah.gnu.org/bugs/?52444.
+
+2017-11-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/roff/troff/input.cpp:
+ Make writers to stderr identify themselves.
+
+ * font/devpdf/util/BuildFoundries.pl:
+ Same; also refactor all diagnostics into Notice(), Warn(), and
+ Die() functions, which delegate their common message-printing to
+ Msg().
+
+ Fix part of bug https://savannah.gnu.org/bugs/?52463.
+
+2017-11-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ man pages: Fix compatibility-mode problems.
+
+ * contrib/gperl/gperl.1.man: Use idiomatic .BI macro instead of
+ leading an input line with a font escape followed by a dot,
+ the interpretation of which differs based on compatibility
+ mode.
+
+ * src/preproc/soelim/soelim.1.man: Make .mso request only after
+ compatibility mode is turned off.
+
+2017-11-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * Makefile.am: Protect arguments to "tr" from globbing.
+
+ Prevents errors from tr during man page generation and possible
+ incorrect program prefixing in those pages if, for example, some
+ doofus has directories called "A", "B", ... hanging around in
+ the build tree.
+
+2017-11-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/groff_mdoc.7.man: Use unstripped symbol names.
+
+ Fix bug https://savannah.gnu.org/bugs/?52442.
+
+2017-11-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/include/.gitignore: Ignore config.hin~ files.
+
+2017-11-18 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ test-groff.in: Enable backtraces and all warnings by default.
+
+ Fix bug https://savannah.gnu.org/bugs/?51482.
+
+2017-11-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/**: Migrate macro package diagnostics away from `quotes'.
+
+2017-11-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libgroff/new.cpp: Quieten compiler warning.
+
+ Define sized version of overloaded delete operator. Duplicate
+ code from unsized delete operator because simply calling through
+ to it provokes another warning, -Wdelete-incomplete.
+
+ Fix rest of https://savannah.gnu.org/bugs/?52335.
+
+2017-11-12 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Better handle glyphs in font positions > 255
+
+ * src/devices/gropdf/gropdf.pl: Improve handling
+ when glyphs above 255 are used.
+
+2017-11-12 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ gropdf should load ALL 'download' files
+
+ * src/devices/gropdf/gropdf.pl: only the first 'download' file
+ found was loaded, it should load all found.
+
+2017-11-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libxutil/DviChar.c: Initialize "buckets" field of
+ structs.
+
+ Resolves missing-field-initializers warnings.
+
+2017-11-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/strip.sed: Stop rewriting symbol names. A substitution
+ originally intended to strip the "doc-" prefix off of mdoc macro
+ and string names unintentionally caught some mom stuff.
+ Harmlessly in this instance, but with potentially surprising
+ future effects. Remove (only) this substitution per discussion
+ in
+ https://lists.gnu.org/archive/html/groff/2017-11/msg00055.html
+ et sequentia.
+
+2017-11-11 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ * src/devices/grolbp/lbp.cpp (lbp_printer::setfillmode): Address
+ misleading indentation warning.
+
+ * src/roff/troff/mtsm.cpp (mtsm::push_state, mtsm::pop_state):
+ Same. Only flush standard error if we just wrote to it,
+ instead of unconditionally.
+
+ Fix bug https://savannah.gnu.org/bugs/?51483.
+
+2017-11-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/utils/xtotroff/xtotroff.c: Mark private function static.
+
+2017-11-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/libs/libxutil/xmalloc.c: Quieten gcc warning. Mollify
+ -Wmissing-prototypes for xmalloc() in single-function file.
+
+2017-11-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ gxditview: Migrate extern declarations to headers.
+
+ Also mark some private functions as static.
+
+2017-11-11 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ src: Declare function protypes where necessary.
+
+ Fix bug https://savannah.gnu.org/bugs/?51513.
+
+2017-11-10 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ mom: Abort early with diagnostic in compatibility mode.
+
+ Fix bug https://savannah.gnu.org/bugs/?52333.
+
+2017-11-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * contrib/**: Migrate diagnostics away from `quotes'.
+
+2017-11-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/**: Migrate diagnostics away from `these quotes'.
+
+ Fix bug https://savannah.gnu.org/bugs/?52374.
+
+2017-11-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tmac/strip.sed: Remove nilpotent capture from address.
+
+2017-11-05 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ `preconv': fix usage of lib `uchardet'.
+
+ * src/preproc/preconv/preconv.cpp (detect_file_encoding): Fix
+ usage of uchardet 0.0.1, which may fail but return an empty string
+ instead of a null pointer, and fix some incorrect error
+ managements that might cause memory leaks.
+
+2017-11-05 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/devpdf.am: Silence warning from grep during clean.
+
+2017-11-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * Makefile.am: Drop unnecessary -F and -M flags from pdfmom
+ call.
+
+2017-11-02 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ man/groff_diff.7.man: Correct the explanation of the request
+ ".itc"--it was backwards.
+
+ Fix bug https://savannah.gnu.org/bugs/?51502.
+
+2017-11-02 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ test-groff.in: Recognize additional contrib tmacs.
+
+ Fix bug https://savannah.gnu.org/bugs/?51598.
+
+2017-11-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * Makefile.am: Force build to generate test-groff script.
+
+2017-11-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * font/devpdf/devpdf.am: Silence warning from grep during build.
+
+2017-11-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * doc/doc.am: Fix build of pic.html from clean tree.
+
+2017-11-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m4/groff.m4: Kill whitespace in macro diagnostic.
+
+2017-11-01 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ src/roff/grog/subs.pl: Fix typo in usage message.
+
+ Fix bug https://savannah.gnu.org/bugs/?51540.
+
+2017-10-28 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ m.tmac: Fix some formatting and textual issues.
+ * Protect full stops in strings \*[Letns!{1,2,10,11}].
+ * Remove extraneous whitespace from string \*[Pg_type!1].
+
+ Fix bug https://savannah.gnu.org/bugs/?51610.
+
+2017-10-22 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ refer-mm.tmac: Protect full stop in abbreviation of "ed.".
+
+ Fix bug https://savannah.gnu.org/bugs/?51611.
+
+2017-10-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/html/pre-html.cpp: Fix grammar in usage message.
+ When used attributively, e.g. as an adjectival phrase,
+ "command-line" should be hyphenated.
+
+2017-10-22 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ pdfpic: Suppress warning if in compatibility mode.
+
+ Fix bug https://savannah.gnu.org/bugs/?51945.
+
+2017-10-22 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ www.tmac: Rename font 'C' to 'CR'; define 'CR'.
+
+ The font name 'C' ('CW') is not a part of groff's fonts.
+
+ Fix bug https://savannah.gnu.org/bugs/?51417.
+ Also see https://savannah.gnu.org/bugs/?51426.
+
+2017-10-04 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Fix build on MacOS X
+
+ See https://savannah.gnu.org/bugs/?49651
+
+2017-09-11 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Build from git: Make `configure' fail if `yacc' is not found.
+
+ * m4/groff.m4 (GROFF_PROG_YACC): look for (in this order) `byacc',
+ `bison -y', `yacc'. Set `YACC' to `missing' is nothing is found
+ and generate an error. Don't generate an error if build is not
+ done from git as tarball already distribute files generated by
+ `yacc'.
+
+2017-09-02 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Update `gnulib' submodule with latest version.
+
+ * gnulib: now points on 07a187be7f66d3ced66587405f18205971c762e9
+ from `gnulib' repository.
+
+2017-09-02 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Fix .gitignore files for in-source build.
+
+ Fix bug https://savannah.gnu.org/bugs/?51415.
+
+2017-09-01 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Fix build on MacOS X
+
+ * Makefile.am: define `SED' command with LANG and LC_ALL set to C.
+ * contrib/mm/mm.am: use it.
+ * doc/doc.am: Ditto.
+
+ Fix bug https://savannah.gnu.org/bugs/?49649
+
+2017-08-30 Colin Watson <cjwatson@debian.org>
+
+ `BuildFoundries' should not be installed.
+
+ * font/devpdf/devpdf.am: remove installation of generated script
+ `BuildFoundries'.
+
+2017-08-30 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ pic2graph.1.man: Fix wrong macro for e-mail addresses.
+
+ Fix bug https://savannah.gnu.org/bugs/?51110.
+
+2017-08-30 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ groff_diff(7): Remove a repeated word.
+
+ Fix bug https://savannah.gnu.org/bugs/?51077.
+
+2017-08-30 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ groff_tmac(5): Fix double dot before request.
+
+ Fix bug https://savannah.gnu.org/bugs/?51070.
+
+2017-08-28 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ groff.texi: remove repeated words.
+
+ Fix bug https://savannah.gnu.org/bugs/?51046.
+
+2017-08-28 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ groff_man(7) manual page: Fix explanation of the ".itc" request.
+
+ See bug at https://savannah.gnu.org/bugs/?51043.
+
+2017-08-28 Ingo Schwarze <schwarze@usta.de>
+
+ groff_man(7) manual page: recommendations for escape sequences.
+
+ See bug at https://savannah.gnu.org/bugs/?51021.
+
+2017-08-28 Ingo Schwarze <schwarze@usta.de>
+
+ groff_char(7) manual: fix table "7-bit Character Codes"
+
+ See bug at https://savannah.gnu.org/bugs/?51020.
+
+2017-08-28 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Fix troff.1 misleading definition of -w all.
+
+ See bug at https://savannah.gnu.org/bugs/?47784. Suggested by Kaz
+ Kylheku <kaz@kylheku.com>.
+
+2017-08-25 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ `preconv --version' crashes.
+
+ See bug at: https://savannah.gnu.org/bugs/?51587.
+
+ * src/preproc/preconv/preconv.cpp: Add a missing comma in the
+ argument list of "printf".
+
+2017-08-25 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ Fix bug: `.itc' request breaks subsequent `.it' requests.
+
+ See bug at: https://savannah.gnu.org/bugs/?51376. Using `.itc'
+ lets all later uses of `.it' behave like `.itc', that is,
+ interrupted text line ending with \c is not counted as a separate
+ line.
+
+ * env.cpp: Restore input_trap state to normal when '.it' is
+ called.
+
+2017-08-25 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ Fix a part of a virtual (pseudo) structure in "tty.tmac".
+
+ * tmac/tty.tmac: Fix warning: ".../git/groff/tmac/tty.tmac:19:
+ warning: unbalanced .el request"
+
+2017-08-25 Ingo Schwarze <schwarze@usta.de>
+
+ `tty-char.tmac': focus on meaning rather than graphical shape
+
+ * tmac/tty-char.tmac: add ASCII renderings for six missing
+ mathematical symbols
+
+2017-08-22 Ingo Schwarze <schwarze@usta.de>
+
+ `tty-char.tmac': focus on meaning rather than graphical shape
+
+ * tmac/tty-char.tmac: Switch the policy from trying to imitate the
+ characters' graphical shapes, which resulted in unintelligible
+ renderings in many cases, to transliterations conveying the
+ characters' meanings. One benefit is making these characters
+ usable for portable manual pages.
+
+2017-08-21 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ 'gropdf' does not correctly load new ghostscript fonts
+
+ See bug at: https://savannah.gnu.org/bugs/?50989. Since ghostscript
+ 9.21 the fonts supplied have changed from .pfb to .pfa type (with a
+ raw binary section). These failed to be properly loaded.
+
+ * src/devices/gropdf/gropdf: Changes to handle raw binary section in
+ a .pfa type font.
+
+2017-08-18 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ `pdfmom' man page incorrectly displayed.
+
+ * src/devices/gropdf/pdfmom.1.man: Remove `]' character mistakenly
+ added at the beginning of the file.
+
+2017-08-18 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Incorrect font name for CBI in Foundry.in.
+
+2017-08-15 Ingo Schwarze <schwarze@usta.de>
+
+ Fix build if `configure' check for `fprintf-posix' fails.
+
+ See bug at: https://savannah.gnu.org/bugs/?51554. If tests for
+ posix compliance of fprintf from `gnulib_m4/fprintf-posix.m4'
+ fail, a replacement function of `fprintf' is used. Consequently,
+ all executables that use this function must link against the
+ gnulib (`libgnu.a'). The bug was introduced by commit
+ fa41eeba06987a12bc0434f8b51896d4618a3997.
+
+ * src/devices/xditview/xditview.am
+ * src/preproc/eqn/eqn.am
+ * src/preproc/pic/pic.am
+ * src/preproc/preconv/preconv.am
+ * src/preproc/refer/refer.am
+ * src/preproc/soelim/soelim.am
+ * src/preproc/tbl/tbl.am
+ * src/utils/addftinfo/addftinfo.am
+ * src/utils/hpftodit/hpftodit.am
+ * src/utils/indxbib/indxbib.am
+ * src/utils/lkbib/lkbib.am
+ * src/utils/lookbib/lookbib.am
+ * src/utils/pfbtops/pfbtops.am
+ * src/utils/tfmtodit/tfmtodit.am
+ * src/utils/xtotroff/xtotroff.am: link against libgnu.a
+
+ * INSTALL.REPO: recommend the autoconf and automake versions used
+ during automake migration rather than the minimum versions.
+
+2017-08-04 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ See bug at: https://savannah.gnu.org/bugs/?51568
+
+ * src/devices/gropdf/gropdf: Further 'fix' to handle those octal
+ characters. See comment #5 - thank you Bjarni.
+
+2017-07-31 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ See bug at: https://savannah.gnu.org/bugs/?51568
+
+ * src/devices/gropdf/gropdf: previous 'fix' was too narrow, all
+ '\' characters should be escaped. Also there was an unwanted
+ interaction with code in routine 'do_t'. Sometimes, do_C, when
+ the named glyph is mapped to a chr < 32, this is encoded as octal
+ \nnn, so in this case the '\' must not be escaped.
+
+2017-07-25 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ If input text contained string which could be interpreted as
+ escaped octal (\ddd) a pdf viewer would interpret as an octal
+ character. See bug at: https://savannah.gnu.org/bugs/?51568
+
+ * src/devices/gropdf/gropdf: protect text which resembles \ddd
+ by escaping with extra '\'.
+
+2017-07-12 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Use uchardet library in `preconv' to detect input file encoding
+
+ * m4/groff.m4 (GROFF_UCHARDET): new macro that use pkg-config to
+ check if uchardet library is available and define new option
+ `--with-uchardet':
+ - If `yes' is passed and uchardet is not found, configure fails.
+ - If `no' is passed we don't use uchardet and don't display any
+ warning.
+ - If `auto' (or any other option) is passed of if --with-uchardet
+ is not passed, we use uchardet if available, otherwise the build
+ goes on but a warning is displayed at the end of the configuration
+ phase.
+
+ * configure.ac: use pkg-config and `GROFF_UCHARDET' to detect the
+ presence of uchardet library.
+
+ * src/preproc/preconv/preconv.am: link against uchardet library if
+ available.
+
+ * src/preproc/preconv/preconv.cpp (detect_file_encoding): new
+ function that uses uchardet library to detect input file encoding.
+ (do_file): `detect_file_encoding'.
+
+ * src/preproc/preconv/preconv.1.man: update `preconv'
+ documentation.
+
+ See https://savannah.gnu.org/bugs/?51330
+
+2017-07-12 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Add gnulib module fprintf-posix
+
+ * bootstrap.conf: do it.
+
+ * Fix compilation in some files that needed inclusion of
+ `config.h'.
+
+ See https://savannah.gnu.org/bugs/?51330
+
+2017-05-09 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Package `ghostscript' 9.21 renamed some fonts installed in
+ `/usr/share/ghostscript/9.21/Resource/Font', e.g. URWGothicL-Demi
+ renamed to URWGothic-Demi, and dropped the installation of URW
+ fonts in `/usr/share/fonts/type1/gsfonts/', breaking font
+ generation in `font/devpdf/util/BuildFoundries.pl'.
+
+ * m4/groff.m4 (GROFF_URW_FONTS_PATH): New option
+ `--with-urw-fonts-dir' to pass a custom path to URW fonts.
+ (GROFF_URW_FONTS): search the presence of URW fonts by checking if
+ file `a010013l.pfb' exists in the paths given by `gs -h', in the
+ default paths used in `Foundry.in' and in the path given with
+ option `--with-urw-fonts-dir'.
+ (GROFF_URW_FONTS_CHECK): print a warning at the end of the
+ configuration phase if no URW fonts were found.
+
+ * configure.ac: call new macros `GROFF_URW_FONTS_PATH',
+ `GROFF_URW_FONTS' and `GROFF_URW_FONTS_CHECK'.
+
+ * font/devpdf/Foundry.in: add new basic fonts names and pass
+ custom URW fonts path `urwfontsdir'.
+
+ * font/devpdf/devpdf.am: substitute `urwfontsdir' in `Foundry'
+ generation.
+
+ Fixes https://savannah.gnu.org/bugs/?50786
+
+2017-05-04 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Fixes for gropdf
+
+ * src/devices/gropdf/gropdf.pl: Escape '(' and ')' if
+ used in a bookmark, and ignore relative move 'h' if
+ followed by absolute move 'H' in groff intermediate output.
+
+2017-04-29 Ingo Schwarze <schwarze@usta.de>
+
+ groff_char(7): improve description of ASCII characters
+
+ * man/groff_char.7.man: improve description of ASCII
+ characters that do not render as themselves
+
+ See https://savannah.gnu.org/bugs/?50898
+
+2017-04-28 Osamu Sayama
+
+ lkbib with empty file dumps core
+
+ * src/libs/libbib/index.cpp: Test if argument to malloc(3)
+ is zero.
+
+ See https://savannah.gnu.org/bugs/?48433
+
+2017-04-28 David Gilman
+
+ Typo in groff.texi
+
+ * doc/groff.texi: Dp instead of DP used
+
+ https://savannah.gnu.org/bugs/index.php?42251
+
+2017-04-28 Rich Burridge
+
+ "grops -c a" dumps core
+
+ * src/devices/grops/ps.cpp: conversion specifier %s changed
+ to %1 (errprint() uses special syntax different from
+ printf(3))
+
+ https://savannah.gnu.org/bugs/?42190
+
+2017-04-28 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ Macro "itc" is needed to make escape "\c" useful
+
+ * tmac/an-old.tmac: .it changed to .itc
+
+ https://savannah.gnu.org/bugs/?42907
+
+2017-04-28 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ First italic correction (\,) is absent in macros IR and IB
+
+ * tmac/an-old.tmac: Italic correction added
+
+ https://savannah.gnu.org/bugs/?42906
+
+2017-04-13 Ingo Schwarze <schwarze@usta.de>
+
+ * tmac/doc.tmac-u: Make .Lk with more than two arguments
+ mdoc(7) conform
+
+ Use the second and following arguments as the link text.
+
+ Do not mark up the following colon with \fI.
+
+ Handle any number of trailing delimiters.
+
+ Problem reported by Anthony Bentley <bentley@openbsd.org>,
+ fixed by Ingo Schwarze <schwarze@usta.de>.
+
+ https://savannah.gnu.org/bugs/?50789
+
+2017-04-12 Werner LEMBERG <wl@gnu.org>
+
+ Update German hyphenation patterns.
+
+ * tmac/de.tmac: Add more hcode values.
+ No longer use `hyphenex.det'.
+ * tmac/hyphen.den, tmac/hyphen.det: Updated to `dehyph-exptl-0.41'.
+ * tmac/hyphenex.det: Removed, no longer needed.
+ * tmac/tmac.am (TMACNORMALFILES): Updated.
+
+2017-04-10 Ingo Schwarze <schwarze@usta.de>
+
+ * tmac/doc.tmac-u: Punctuation handling of .Lk fixed
+
+ The implementation of the groff_mdoc(7) .Lk (hyperlink) macro
+ contains code to make sure that the second argument is not
+ punctuation before treating it as a link text, but the test
+ can never lead to the result "punctuation" because the
+ initialization of the global variable doc-width was missing
+ before the call to doc-get-arg-type. Consequently, even "."
+ was not recognized as punctuation.
+
+ Problem reported by Anthony Bentley <bentley@openbsd.org>,
+ fixed by Ingo Schwarze <schwarze@usta.de>.
+
+ https://savannah.gnu.org/bugs/?50771
+
+2017-04-07 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/hyphenex.us: Updated to current release from TeXLive.
+
+2017-02-23 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ * bootstrap: update with latest version from gnulib.
+ * gnulib: update the git submodule with latest version (commit
+ 4084b3a1094372b960ce4a97634e08f4538c8bdd from gnulib).
+
+2017-02-18 Colin Watson <cjwatson@debian.org>
+
+ * src/preproc/eqn/main.cpp: Define EQ and EN if they are not already
+ defined, to appease "groff -wmac".
+ * src/preproc/pic/main.cpp: Likewise for PS and PE.
+
+ Fixes: http://bugs.debian.org/495713
+
+2017-02-16 Ingo Schwarze <schwarze@usta.de>
+
+ mdoc %T: use typographic quotes
+
+ * tmac/doc.tmac-u: Changed \*[q] to \*[Lq] and \*[Rq]
+
+ Citing Anthony J. Bentley:
+
+ The below patch causes -mdoc to generate typographic quotes
+ around a %T (reference title) instead of straight quotes.
+
+ I also submitted similar diffs to mandoc and heirloom troff
+ (which haven't been committed yet). It would be nice for
+ the major implementations not to differ here, and the change
+ is trivial.
+
+ It's worth noting that groff's refer(1) already uses typographic
+ quotes around %T with my -ms documents.
+
+ https://savannah.gnu.org/bugs/?43553
+ http://comments.gmane.org/gmane.comp.tools.mdocml.devel/723
+ https://github.com/n-t-roff/heirloom-doctools/pull/6
+
+2017-02-16 Ingo Schwarze <schwarze@usta.de>
+
+ mdoc \*[Lq], \*[Rq]: map to \[lq], \[rq] for all terminal
+ devices
+
+ * tmac/doc-nroff-u: .ds Lq \[lq], .ds Rq \[rq]
+
+ If you use \[lq] and \[rq] directly in your document, the
+ quotes already render nicely for all terminal devices:
+ as U+201C and U+201D for devutf8 and as ASCII 0x22 (") for
+ devascii and devlatin1.
+ So it is not quite clear why doc-nroff should avoid
+ \[lq] and \[rq] when resolving \[Lq] and \[Rq] for devascii
+ and devlatin1. Quite to the contrary, many people seem to
+ consider "``" and "''" ugly renderings because they look
+ unbalanced.
+
+ See
+
+ https://savannah.gnu.org/bugs/?43554
+
+2017-02-16 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ Use the traditional (portable) method of using a backslash
+ after '\{'
+
+ * contrib/mm/m.tmac, tmac/e.tmac-u,
+ tmac/s.tmac: Add '\' after "\{"
+
+ See
+
+ https://savannah.gnu.org/bugs/?49917
+
+2017-02-16 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ Use explicit \s±n after a variable string instead of \s0
+
+ * tmac/e.tmac-u: Change \s0 to \s+3
+
+ See
+
+ https://savannah.gnu.org/bugs/?49915
+
+2016-12-29 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Remove duplicate '-e' from gropdf manual.
+
+ * src/devices/gropdf/gropdf.1.man: Remove first '-e'.
+
+2016-11-25 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Remove incorrect info from gropdf manual.
+
+ * src/devices/gropdf/gropdf.1.man: Remove references
+ to postscript.
+
+2016-11-22 George HELFFRICH <ghfbsd@gmail.com>
+
+ [me]: Fix alignment of `(c' macro (#43306).
+
+ * tmac/e.tmac-u ((c): Properly initialize environment.
+
+2016-11-20 George HELFFRICH <ghfbsd@gmail.com>
+
+ [me] Fix vertical spacing of `(b' macro (#42217).
+
+ * tmac/e.tmac-u (@k): Apply pre-spacing conditionally.
+ ()b): Updated.
+
+2016-11-19 George HELFFRICH <ghfbsd@gmail.com>
+
+ [me] Fix remaining bugs with line numbering (#49650).
+
+ * tmac/e.tmac-u (nm): Redefine.
+ (.n1, .n2): Update so all environments affected.
+ (.ip): Fix double numbering.
+ (.)c, .)l): Restore numbering after diversion included.
+
+2016-11-01 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ gropdf remaps characters to position 13 (#48986).
+
+ * src/devices/gropdf/gropdf: Do not remap anything to chr(13).
+
+2016-11-01 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ pdfmom was not including $preconv in the initial groff run.
+
+ * src/devices/gropdf/pdfmom.pl: Include $preconv in first
+ groff run which resolves forward pdf references.
+
+2016-10-05 Ingo Schwarze <schwarze@usta.de>
+
+ * tmac/doc.tmac-u: Simplify behaviour of .Bl -tag
+ * tmac/groff_mdoc.7.man: Update documentation to the new
+ behaviour of .Bl -tag
+
+ If an mdoc(7) .Bl -tag macro lacks the -width argument, the
+ body indentation is calculated separately for each child .It
+ macro. Neither the Heirloom nor the mandoc(1) implementation
+ of the mdoc(7) language show such behaviour; both use a
+ constant default width for the whole list in that case.
+
+ Apart from doubts whether lists with variable indentation are
+ typographically sound in the first place, support for variable
+ widths in groff is so restricted that it's practically
+ useless. For each .It, the width will be the default width of
+ whatever happens to be the leading macro after the .It, or of
+ .No if .It is not followed by a macro.
+
+ See
+
+ https://savannah.gnu.org/bugs/index.php?49272
+
+ and
+
+ http://lists.gnu.org/archive/html/groff/2016-10/msg00006.html
+
+
+2016-09-09 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/sv.tmac: Fix `.hy' settings (#48904).
+
+ The Swedish patterns allow hyphenation after the first character and
+ before the last two characters, not vice versa.
+
+2016-09-09 Werner LEMBERG <wl@gnu.org>
+
+ troff: Fix hyphenation (#48904).
+
+ This commit fixes two bugs present from the very beginning: troff
+ (a) didn't allow to hyphenate words shorter than 4 characters
+ (ignoring `.hy' settings), and (b) never tried to hyphenate after
+ the first character due to wrong handling of the `.hy' settings.
+
+ * src/roff/troff/env.cpp (environment::hyphenate_line): Use
+ hyphenation flags to determine the minimum word length considered
+ for hyphenation.
+ (hyphenate): Fix handling of `HYPHEN_FIRST_CHARS'.
+
+2016-07-29 Colin Watson <cjwatson@debian.org>
+
+ Implement `SOURCE_DATE_EPOCH' for reproducible builds.
+
+ * src/include/curtime.h: New file.
+ * src/libs/libgroff/curtime.cpp: New file.
+ * src/libs/libgroff/libgroff.am (libgroff_a_SOURCES): Add
+ src/libs/libgroff/curtime.cpp.
+
+ * src/roff/troff/input.cpp (init_registers): Use `current_time'
+ instead of `time(0)'.
+ * src/devices/grohtml/post-html.cpp
+ (html_printer::do_file_components): Likewise.
+ (html_printer::~html_printer): Likewise.
+ * src/devices/grops/ps.cpp (ps_printer::~ps_printer): Likewise.
+ * src/devices/gropdf/gropdf.pl: Use `$ENV{SOURCE_DATE_EPOCH}` if
+ available in preference to `time`.
+
+ * doc/groff.texi (Environment): Document `SOURCE_DATE_EPOCH'.
+ * src/devices/grohtml/grohtml.1.man (ENVIRONMENT): Likewise.
+ * src/devices/gropdf/gropdf.1.man (ENVIRONMENT): Likewise.
+ * src/devices/grops/grops.1.man (ENVIRONMENT): Likewise.
+
+2016-04-19 Carsten Kunze <carsten.kunze@arcor.de>
+
+ eqn: Fix problem with explicit spacing before unary operator
+
+ * src/preproc/eqn/list.cpp (list_box::compute_metrics): Change
+ item spacing type from BINARY to ORDINARY also when previous
+ type is SUPPRESS_TYPE.
+
+ As reported in
+
+ http://lists.gnu.org/archive/html/groff/2016-04/msg00024.html
+
+ by Douglas McIlroy <doug@cs.dartmouth.edu>
+
+ an implicit space is added between an unary operator and its
+ operand when an explicit space is put before the unary
+ operator. Unary operators are initially set up as binary.
+ Depending on the preceding element their type can be changed
+ to unary. This did not happen when an explicit space ('~' or
+ '^') had been before that operator.
+
+2016-02-16 Bálint Réczey <balint@balintreczey.hu>
+
+ Fix many malloc/new vs. free/delete/delete[] mismatches (#47164)
+
+ * src/devices/grops/ps.cpp (ps_font::~ps_font,
+ ps_printer::define_encoding): Use `free'.
+ * src/devices/grops/psrm.cpp (resource::~resource,
+ resource_manager::output_prolog, resource_manager::supply_resource,
+ resource_manager::read_download_file): Ditto.
+
+ * src/include/ptable.h (PTABLE::~PTABLE, PTABLE::define): Ditto.
+
+ * src/libs/libgroff/searchpath.cpp
+ (search_path::open_file_cautious): Ditto.
+
+ * src/libs/libgroff/string.cpp: Include `stdlib.h'.
+ (string::extract): Use `malloc'.
+
+ * src/preproc/eqn/box.cpp (quoted_text_box::~quoted_text_box): Use
+ `free'.
+
+ * src/preproc/eqn/lex.cpp (definition::~definition,
+ macro_input::~macro_input, top_input::~top_input, do_definition):
+ Ditto.
+
+ * src/preproc/eqn/main.cpp (main): Ditto.
+
+ * src/preproc/eqn/other.cpp: Include `stdlib.h'.
+ (size_box::~size_box, font_box::~font_box): Use `free'.
+
+ * src/preproc/eqn/text.cpp: Include `stdlib.h'.
+ (box::set_spacing_type, special_char_box::~special_char_box,
+ split_text): Use `free'.
+
+ * src/preproc/grn/main.cpp (conv): Use `free'.
+
+ * src/preproc/html/pre-html.cpp (get_resolution): Ditto.
+
+ * src/preproc/pic/lex.cpp (macro_input::~macro_input,
+ argument_macro_input::~argument_macro_input, for_input::~for_input):
+ Ditto.
+
+ * src/preproc/pic/main.cpp (do_picture): Ditto.
+
+ * src/preproc/pic/object.cpp: Include `stdlib.h'.
+ (text_piece::~text_piece, string_list::~string_list): Use `free'.
+
+ * src/preproc/pic/pic.ypp (placeless_element, element, text, label,
+ expr_not_lower_than): Ditto.
+
+ * src/preproc/pic/troff.cpp (troff_output::reset_color): Ditto.
+
+ * src/preproc/preconv/preconv.cpp (check_coding_tag): Ditto.
+
+ * src/preproc/soelim/soelim.cpp (do_file): Ditto.
+
+ * src/preproc/tbl/table.cpp (text_entry::~text_entry): Ditto.
+
+ * src/roff/groff/groff.cpp (possible_command::~possible_command,
+ possible_command::set_name): Ditto.
+
+ * src/roff/troff/env.cpp (hyphen_trie::read_patterns_file): Ditto.
+
+ * src/roff/troff/node.cpp (suppress_node::tprint): Ditto.
+
+2016-02-16 Bálint Réczey <balint@balintreczey.hu>
+
+ Use `malloc' in `strsave'; use `free' for returned pointers (#47164).
+
+ * src/libs/libgroff/font.cpp (text_file::~text_file): Use `free'.
+
+ * src/libs/libgroff/searchpath.cpp (search_path::open_file): Use
+ `free'.
+
+ * src/libs/libgroff/strsave.cpp: Include `stdlib.h'.
+ (strsave): Use `malloc'.
+
+2016-02-16 Bálint Réczey <balint@balintreczey.hu>
+
+ Simplify memory allocation (#47162).
+
+ Many invalid memory accesses were caught by UBSAN (e.g., invalid
+ memory access in `small_temp_iterator::operator new') while
+ bootstrapping hardened1-linux-amd64 Debian port in the `free_list'
+ handling because it doesn't properly handle the padding between
+ array elements.
+
+ Some places were already #if 0-d out anyway.
+
+ * src/roff/troff/input.cpp (small_temp_iterator): Remove class.
+ (make_temp_iterator): Use `temp_iterator' only.
+
+ * src/devices/grotty/tty.cpp (tty_glyph): Remove `free_list', `new',
+ and `delete'.
+
+ * src/include/color.h, src/include/color.cpp (color): Ditto.
+
+ * src/roff/troff/env.cpp (tab): Ditto.
+
+ * src/roff/troff/node.cpp (glyph_node): Ditto.
+
+2016-02-15 Bálint Réczey <balint@balintreczey.hu>
+
+ [pre-grohtml] Fix out-of-bounds array access (#47161).
+
+ * src/preproc/html/pre-html.cpp (char_buffer::write_upto_newline):
+ Implement it.
+
+2016-02-15 Bálint Réczey <balint@balintreczey.hu>
+
+ Don't use `memcpy' with NULL input or output argument (#47160).
+
+ * src/libs/libgroff/string.cpp (string::string, string::operator=):
+ Implement it.
+
+ * src/roff/troff/input.cpp (temp_iterator::temp_iterator): Implement
+ it.
+
+2016-02-04 Carsten Kunze <carsten.kunze@arcor.de>
+
+ * tmac/s.tmac: Bugfix of previous commit simplified (and
+ introduced redundancy removed) by use of .par*start for .QS and
+ .QE. This is consistent since any other paragraph macro is
+ using .par*start.
+
+2016-02-02 Carsten Kunze <carsten.kunze@arcor.de>
+
+ * tmac/s.tmac: Macros .QS and .QE changed to insert vertical
+ inter-paragraph space. A paragraph bracketed with .QS/.QE
+ should appear identical to a .QP paragraph followed by .LP.
+
+ * tmac/groff_ms.7.man, doc/groff.texi: Documentation of macros
+ .QS and .QE added and .QP information improved (effect of
+ registers QI and PD).
+
+ See also discussion at groff@gnu.org, thread starting at
+
+ http://lists.gnu.org/archive/html/groff/2016-01/msg00033.html
+
+ Issue reported by Douglas McIlroy <doug@cs.dartmouth.edu>
+
+2015-12-26 Carsten Kunze <carsten.kunze@arcor.de>
+
+ * contrib/mm/m.tmac: Disable macro misc@tag in case output
+ type is not HTML.
+
+ This macro did cause unwanted space in case a MM macros .H
+ had been followed immediately by .DS.
+
+ (See also discussion at groff@gnu.org, thread starting at
+ http://lists.gnu.org/archive/html/groff/2015-12/msg00033.html)
+
+ Bug reported by Damian McGuckin <damianm@esi.com.au>.
+
+2015-12-14 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/eqn/text.cpp (entity_table): s/lamda/lambda/.
+
+ Bug reported by Brian McGuinness <mcguinne@fdu.edu>.
+
+2015-10-27 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ gropdf was choking on -I flag passed by groff, now uses
+ these directories to search for included pdfs.
+
+ * src/devices/gropdf/gropdf.pl: Handle -I flag, avoid
+ unitialised values.
+
+ * src/roff/groff/groff.1.man: Include 'X pdf: pdfpic'
+
+ * src/devices/gropdf/gropdf.1.man: Document -I flag
+
+2015-09-10 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/subs.pl: fix comments
+
+2015-09-03 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * tmac/troffrc: Add .mso for file `pdfpic.tmac'.
+
+2015-08-28 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ * Makefile.am:
+ - Use only the naming `.section.man' for all man.pages.
+ - Replace `.man.n' by `.man' only, such that no `.n' is
+ generated.
+ - For example, the source `groff.7.man' is transformed into
+ `groff.7' in the same directory and then is by installing just
+ copied into one of the suitable installed man directory.
+
+2015-08-27 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * tmac/pfdpic.tmac: Add tmac file for macro `PDFPIC'.
+
+ * tmac/tmac.am: Add new `pdfpic.tmac' file.
+
+ * man/groff_tmac.5.man: Add definition for the new tmac.
+
+2015-08-22 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * all man-pages *.man: Rename man-pages such that the man section
+ number before the final `.man'.
+
+ * all *.am: Include renaming.
+
+ * Makefile.am: Reset `.man.n' by `.[157].man.n' with SUFFIXES
+ `.[157].man .n'.
+
+2015-08-20 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * Makefile.am: Fix definition of man[157]_MANS.
+
+2015-08-13 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * all *.am: Correct Emacs mode `End:' instead of `End.'.
+
+2015-08-09 Werner LEMBERG <wl@gnu.org>
+
+ Revert previous commit, since it doesn't work correctly yet.
+
+2015-08-07 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ Add section name to all man-page names.
+
+ * Makefile.am: In `install-prefix-man' and `uninstall-prefix-man'
+ change `sed' commands. Correct saving in man[157]_MANS.
+
+ * all *.man in source tree: Rename `manpage.man' to
+ `manpage.[157].man'.
+
+ * all makefile.am in source tree: Add new man-page file name.
+
+2015-08-05 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * Makefile.am, arch/mingw/mingw.am, arch/misc/misc.am,
+ * contrib/eqn2graph/eqn2graph.am, contrib/grap2graph/grap2graph,
+ * contrib/pic2graph/pic2graph.am, doc/doc.am,
+ * font/devX100/devX100.am, font/devX100-12/devX100-12.am,
+ * font/devX75/devX75.am, font/devX75-12/devX75-12.am,
+ * font/devascii/devascii.am, font/devcp1047/devcp1047.am,
+ * font/devdvi/devdvi.am, font/devhtml/devhtml.am,
+ * font/devlatin1/devlatin1.am, font/devlbp/devlbp.am,
+ * font/devlj4/devlj4.am, font/devpdf/devpdf.am,
+ * font/devps/devps.am, font/devutf8/devutf8.am,
+ * font/scripts/scripts.am, man/man.am,
+ * src/devices/grodvi/grodvi.am, src/devices/grohtml/grohtml.am,
+ * src/devices/grolbp/grolbp.am, src/devices/grolj4/grolj4.am,
+ * src/devices/gropdf/gropdf.am, src/devices/grops/grops.am,
+ * src/devices/grotty/grotty.am,
+ * src/include/include.am, src/libs/libbib/libbib.am,
+ * src/libs/libdriver/libdriver.am, src/libs/libgroff/libgroff.am,
+ * src/libs/libxutil/libxutil.am, src/preproc/grn/grn.am,
+ * src/preproc/html/html.am, src/preproc/pic/pic.am,
+ * src/preproc/preconv/preconv.am, src/preproc/tbl/tbl.am
+ * src/preproc/refer/refer.am, src/preproc/soelim/soelim.am,
+ * src/roff/groff/groff.am, src/roff/grog/grog.am,
+ * src/roff/nroff/nroff.am, src/roff/troff/troff.am,
+ * src/utils/addftinfo/addftinfo.am,
+ * src/utils/afmtodit/afmtodit.am, src/utils/hpftodit/hpftodit.am,
+ * src/utils/indxbib/indxbib.am, src/utils/lkbib/lkbib.am,
+ * src/utils/lookbib/lookbib.am, src/utils/pfbtops/pfbtops.am,
+ * src/utils/tfmtodit/tfmtodit.am, src/utils/xtotroff/xtotroff.am,
+ * tmac/tmac.am:
+ Add `Last update'. Setup Emacs mode.
+
+2015-07-29 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/subs.pl: Add -T for all `grog' output, also using
+ -Tps when no option -T is given in the arguments.
+
+ * src/roff/grog/grog.man: Add information about -T output.
+
+2015-07-23 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * man/groff.man: Add last update. Add link on Wikipedia on groff.
+ Add link of groff tutorial by Laha.
+
+2015-07-19 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/*.pl: Add last update.
+
+ * src/roff/grog/subs.pl: Remove call to Perl INC::System::Simple,
+ use backticks instead.
+ Define &err().
+ Reorder some extensions.
+ Distinguish between .TH at first command for man and later on for
+ ms.
+
+2015-07-01 Peter Bray <pdb_ml@yahoo.com.au>
+
+ Fix Savannah bug #44784.
+
+ Compatibility Mode rendering of groff manual pages
+
+ * m4/groff.m4 (GROFF_WITH_COMPATIBILITY_WRAPPERS): New macro to
+ implement 'configure' option
+ '--with-compatibility-wrappers=<value>'. With this option the
+ user can control how groff compatibility wrappers for
+ vendor-provided non-GNU macro sets are installed.
+
+ * configure.ac: Use new macro GROFF_WITH_COMPATIBILITY_WRAPPERS.
+
+ * Makefile.am: Define tmac_*_prefix if 'compatibility_wrappers' is
+ set to 'yes'.
+
+ * tmac/tmac.am: Use 'compatibility_wrappers' to control the
+ installation:
+
+ - If set to `no', the groff-provided macro set are installed in
+ <prefix>/share/groff/<version>/tmac/ with the original macro set
+ name.
+
+ - If set to `yes', the groff-provided macro set are installed in
+ <prefix>/share/groff/<version>/tmac/ with a prefix of
+ $(tmac_prefix) (which is usually `g') and the generated
+ compatibility wrappers are installed in
+ <prefix>/lib/groff/site-tmac, with the original macro set name.
+
+ - If set to `manual', the groff-provided macro set are installed
+ in <prefix>/share/groff/<version>/tmac/ with the original macro
+ set name and the generated compatibility wrappers are installed in
+ <prefix>/lib/groff/site-tmac, with a name of
+ <macro><wrapper_suffix> (which is usually `-os').
+
+2015-06-17 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/tty.tmac: Fix mapping of \[bu] character for -Tutf8.
+
+ Problem reported by carsten.kunze@arcor.de.
+
+2015-06-15 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ pdfmom should use $RT_SEP as path separator.
+
+ * src/devices/gropdf/gropdf.am: Use @RT_SEP@ as path separator.
+
+ * src/devices/gropdf/pdfmom.pl: As above but also fix typo in regex
+ for grep.
+
+2015-05-08 Eli Zaretskii <eliz@gnu.org>
+
+ [groff] Make relocation really work.
+
+ See
+
+ https://lists.gnu.org/archive/html/groff/2015-05/msg00000.html
+
+ * src/roff/groff/groff.cpp: Include `relocate.h'.
+ (main): Use `relocatep'.
+
+2015-05-03 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Fix Savannah bug #44768 (Solaris 10 compatibility issues).
+
+ * m4/groff.m4 (GROFF_DIFF_D): new macro to check if `diff' has
+ option -D, and search for `gdiff' if not (new variable DIFF_PROG
+ will contain the `diff' program to be used).
+
+ * m4/groff.m4 (GROFF_HAVE_TEST_EF_OPTION): new macro to check if
+ `test' supports the option -ef (created new variable
+ HAVE_TEST_EF_OPTION).
+
+ * m4/groff.m4 (GROFF_BASH): new macro to search for `bash' (new
+ variable BASH_PROG will contain the full path to `bash' or
+ `/bin/sh' if `bash' was not found).
+
+ * configure.ac: use the 3 new macros defined in m4/groff.m4.
+
+ * contrib/gdiffmk/gdiffmk.am: set HAVE_TEST_EF_OPTION, BASH_PROG,
+ DIFF_PROG in the generated script `gdiffmk'.
+
+ * contrib/gdiffmk/gdiffmk.sh:
+ - Fix incorrect space after '!' in sed script regex.
+ - `test -ef' is not portable: If `bash' is not available and the
+ shell does not support `test -ef', the option to pass a third
+ argument as the output file is disabled.
+ - Report an error if `diff' does not support -D option.
+ - GNU diff and Solaris diff support -D, but #ifndef / #endif are
+ treated differently (GNU adds a '!' in the #endif): modify the
+ regexs in the sed script accordingly.
+
+2015-05-01 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/tmac.am (TMACNORMALFILES): Add `zh.tmac'.
+
+2015-04-30 Darcy SHEN <sadhen1992@gmail.com>
+
+ Fix Savannah bug #44941.
+
+ * tmac/zh.tmac: New file to support basic Chinese (both simplified
+ and traditional).
+
+2015-04-22 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Fix Savannah bug #44891.
+
+ * src/devices/gropdf/gropdf.pl: If module Compress::Zlib is not
+ available fall back to producing uncompressed PDF and output a
+ warning.
+
+2015-04-22 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ Fix Savannah bug #44894.
+
+ * tmac/strip.sed: Add a `generated file' warning.
+
+2015-04-21 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Fix Savannah bug #44890.
+ Patch by Peter Bray.
+
+ * font/devpdf/devpdf.am: Don't use 'find -maxdepth'.
+
+2015-03-07 Ingo Schwarze <schwarze@openbsd.org>
+
+ [mdoc] Fix Savannah bug #44733.
+
+ Prevent mdoc(7) Bl with trailing -width or -offset from picking up
+ old args.
+
+ * tmac/doc.tmac-u (doc-do-Bl-args): When checking whether there is
+ another argument to a Bl macro, do not inspect the argument list
+ because it is never cleaned and may contain arguments from previous
+ macro invocations. Instead, inspect the argument count which is
+ always up to date.
+
+2015-04-10 Daiki Ueno <ueno@gnu.org>
+
+ Fix link error on NetBSD 6.
+
+ Reported by carsten.kunze@arcor.de in:
+ <https://lists.gnu.org/archive/html/groff/2015-04/msg00000.html>.
+ The problem can also be reproduced if gl_cv_func_wcwidth_works=no
+ is passed to configure.
+
+ * src/preproc/grn/grn.am (grn_LDADD): Change the link order of
+ libgroff.a and lib/libgnu.a according to dependency.
+ * src/roff/troff/troff.am (troff_LDADD): Likewise.
+
+2015-04-08 Werner LEMBERG <wl@gnu.org>
+
+ Fix Savannah bug #44767.
+ Patch by Peter Bray.
+
+ * src/roff/grog/grog.am (grog): Correctly substitute `grog_dir'.
+
+2015-04-03 Werner LEMBERG <wl@gnu.org>
+
+ Fix Savannah bug #44708 (2/2).
+
+ Make man pages work in compatibility mode.
+ Also fix some minor typos.
+
+ * contrib/pic2graph/pic2graph.man, man/ditroff.man, man/groff.man,
+ man/groff_diff.man, man/groff_out.man, man/groff_tmac.man,
+ man/roff.man, src/devices/grodvi/grodvi.man,
+ src/devices/grohtml/grohtml.man, src/devices/grolbp/grolbp.man,
+ src/devices/grolj4/grolj4.man, src/devices/grolj4/lj4_font.man,
+ src/devices/gropdf/gropdf.man, src/devices/gropdf/pdfmom.man,
+ src/devices/grops/grops.man, src/devices/grotty/grotty.man,
+ src/devices/xditview/xditview.man, src/preproc/eqn/eqn.man,
+ src/preproc/eqn/neqn.man, src/preproc/grn/grn.man,
+ src/preproc/pic/pic.man, src/preproc/preconv/preconv.man,
+ src/preproc/refer/refer.man, src/preproc/soelim/soelim.man,
+ src/preproc/tbl/tbl.man, src/roff/groff/groff.man,
+ src/roff/grog/grog.man, src/roff/nroff/nroff.man,
+ src/roff/troff/troff.man, src/utils/addftinto/addftinfo.man,
+ src/utils/afmtodit/afmtodit.man, src/utils/hpftodit/hpftodit.man,
+ src/utils/indxbib/indxbib.man, src/utils/lkbib/lkbib.man,
+ src/utils/lookbib/lookbib.man, src/utils/pfbtops/pfbtops.man,
+ src/utils/tfmtodit/tfmtodit.man, src/utils/xtotroff/xtotroff.man,
+ tmac/groff_man.man, tmac/groff_trace.man: Do it.
+
+2015-04-03 Werner LEMBERG <wl@gnu.org>
+
+ Fix Savannah bug #44708 (1/2).
+
+ * tmac/andoc.tmac (reload_doc, reload_man): Don't use `de1',
+ otherwise we can't manipulate the compatibility flag within the
+ macro.
+
+ * tmac/doc-common-u (Dt): Remove invalid leading whitespace.
+
+2015-03-11 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ * src/devices/gropdf/gropdf.pl: Was not handling the final glyph
+ correctly in the "standard" fonts which are not embedded. They
+ actually have 257 glyphs (0-256) not 256 as I'd assumed, so the
+ remappiing code needs to be applied for them as well as the
+ embedded downloadable fonts.
+
+2015-03-11 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ * src/devices/gropdf/gropdf.pl: Fix problem remappiing
+ ellipsis (affects all glyphs > 255).
+
+2015-03-07 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/tmac.am (TMACSPECIALFILES): Removed. No longer used.
+
+2015-03-07 Ingo Schwarze <schwarze@openbsd.org>
+
+ * tmac/doc-common-u (Dd): Avoid warning `unbalanced .el request'.
+
+2015-02-12 Werner LEMBERG <wl@gnu.org>
+
+ Minor fixes due to renaming `groff.texinfo' to `groff.texi'.
+
+ * doc/doc.am (SUFFIXES): Update.
+ * m4/groff.m4 (GROFF_MAKEINFO): Update.
+
+2015-01-30 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Automake migration and Gnulib integration.
+
+ Gnulib:
+ - Added gnulib as a git submodule.
+ - Integrated bootstrap scripts from gnulib.
+ - Gnulib m4 directory is now in `gnulib_m4', while Gnulib's .c
+ files are located in `lib'. `gnulib_m4' and `lib' are generated
+ and distributed.
+
+ Automake:
+ - Removed Makefiles from the old build system.
+ - Converted Makefile.in into Makefile.am.
+ - Converted Makefile.sub files in all directories to a .am file.
+ - Removed configure, src/include/config.hin (now generated).
+ - Removed various helper scripts (config.guess, config.rpath...),
+ now installed by bootstrap in `build-aux'.
+ - Moved aclocal.m4 to acinclude.m4 (aclocal.m4 is now generated).
+ - Makefile in non-recursive style.
+ - Updated INSTALL.REPO (INSTALL is now a symlink to
+ gnulib/doc/INSTALL, original INSTALL file moved to INSTALL.extra)
+ - Added (empty) THANKS, AUTHORS files.
+ - Added a document on the usage of automake in groff in
+ doc/automake.pdf.
+
+ Additional features:
+ - Out-of-source build is supported.
+ - Parallel build is possible (make -j).
+ - Automatic targets from Automake: `make dist', `make distcheck'.
+ - 'make check' is available for automatic testing, gdiffmk's test
+ was plugged to this target.
+ - Auto-detect if make has builtin variable `RM'.
+
+2015-01-14 Ingo Schwarze <schwarze@openbsd.org>
+
+ Fix Savannah bug #43905.
+
+ * src/libs/libgroff/glyphuni.cpp (glyph_to_unicode_list),
+ * src/libs/libgroff/uniglyph.cpp (unicode_to_glyph_list): Remove
+ double entries for `rk', `lk', `lt', `rt', `rb', and `lb'.
+
+2014-12-16 Werner LEMBERG <wl@gnu.org>
+
+ Update Unicode-to-Unicode mapping to version 7.0.0.
+
+ * src/libs/libgroff/make-uniuni: Update emitted copyright.
+
+ * src/libs/libgroff/uniuni.cpp: Regenerated.
+
+2014-11-29 Werner LEMBERG <wl@gnu.org>
+
+ Fix previous commit.
+
+ We forgot to test whether the patch works if compiling from
+ scratch...
+
+ Problem reported by Bertrand Garrigues
+ <bertrand.garrigues@laposte.net>.
+
+ * src/include/lib.h (interpret_lf_args, normalize_for_lf): Move
+ declarations to...
+ * src/include/lf.h: This new file.
+
+ * src/libs/libgroff/lf.cpp, src/preproc/pic/pic.h,
+ src/preproc/preconv/preconv.cpp, src/preproc/refer/refer.h,
+ src/preproc/soelim/soelim.cpp, src/preproc/tbl/table.h: Include
+ `lf.h'.
+ Make `lib.h' the first included header file.
+
+ * src/preproc/eqn/eqn.h: Don't include `stringclass.h'.
+ * src/preproc/eqn/main.cpp: Include `stringclass.h' and `lf.h'.
+
+ * src/roff/groff/groff.cpp: Make `lib.h' the first included header
+ file.
+
+2014-11-10 Eli Zaretskii <eliz@gnu.org>
+
+ Improve native Windows port.
+
+ This patch fixes two issues.
+
+ . Handle backslashes in `.lf' arguments for MS-DOS and Windows.
+ . Fix file name quoting for the groff pipeline.
+
+ * src/preproc/soelim/soelim.cpp (do_file):
+ * src/preproc/refer/refer.cpp (do_file):
+ * src/preproc/preconv/preconv.cpp (do_file):
+ * src/preproc/pic/main.cpp (do_file):
+ * src/preproc/eqn/main.cpp (do_file): Call `normalize_for_lf' to
+ convert backslashes in the file name being processed to forward
+ slashes.
+
+ * src/include/lib.h (normalize_for_lf): Add prototype.
+
+ * src/preproc/eqn/eqn.h:
+ * src/preproc/pic/pic.h:
+ * src/preproc/refer/refer.h:
+ * src/preproc/tbl/table.h: Include stringclass.h before lib.h.
+
+ * src/libs/libgroff/lf.cpp (normalize_for_lf): New function.
+
+ * src/roff/groff/groff.cpp: Include stringclass.h before lib.h.
+ (append_arg_to_string) [_WIN32 && !__CYGWIN__]: Use only "..." for
+ quoting in native Windows builds.
+
+2014-11-18 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ My commit '3fe78135c9fe666dadffde2a822b0535d8db6feb' introduced
+ problem in subroutine `TextWid'. Octal char `\nnn' returns width of
+ 4 char string rather than width of single character.
+
+ * src/devices/gropdf/gropdf.pl: Change `TextWid' to recognise octal
+ escaped characters (\nnn).
+
+2014-11-07 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ See bug #43555.
+
+ * src/devices/gropdf/gropdf.pl: Correct Date Format.
+
+2014-11-04 Werner LEMBERG <wl@gnu.org>
+
+ * src/libs/gnulib/*: Regenerate autotool files.
+
+2014-11-04 Werner LEMBERG <wl@gnu.org>
+
+Version 1.22.3 released
+=======================
+
+ * NEWS, README, doc/webpage.ms: Updated.
+
+ * doc/texinfo.tex: Updated from `texinfo' repository.
+
+2014-10-29 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ * Makefile.in (OTHERDIRS): Mention `afmtodit' first.
+
+ Otherwise, some fonts in `devpdf' (`U-*') are not built.
+
+2014-10-26 Eli Zaretskii <eliz@gnu.org>
+ Werner LEMBERG <wl@gnu.org>
+
+ Add Windows `.cmd' wrapper files.
+
+ * arch/mingw/*: New files, provided by Eli.
+
+ * Makefile.in (make_winscripts, make_install_winscripts,
+ make_uninstall_winscripts): New target variables.
+ (MDEFINES): Add them.
+ (OTHERDIRS): Add `arch/mingw'.
+
+ * m4/groff.m4 (GROFF_CMD_FILES): New macro
+ * configure.ac: Call it.
+ * configure: Regenerated.
+
+2014-10-23 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Fix `install' and `uninstall' issues.
+
+ * contrib/chem/Makefile.sub (install_data): Fix build with option
+ --with-doc=no passed to configure (target `install_examples'
+ should not be executed).
+
+ * contrib/chem/Makefile.sub (uninstall_sub): `uninstall' failed
+ if directories to be removed were not present.
+
+ * contrib/gpinyin/Makefile.sub (uninstall_sub): Ditto.
+
+ * contrib/hdtbl/Makefile.sub (GENFILES): generated files should
+ depend on the creation of the `examples' directory.
+
+2014-10-23 Daiki Ueno <ueno@gnu.org>
+
+ * m4/iconv.m4: Really avoid false detection of non-working iconv.
+
+2014-10-21 Daiki Ueno <ueno@gnu.org>
+
+ iconv: avoid false detection of non-working iconv
+
+ The INBUF/OUTBUF arguments of iconv can be either 'const char **'
+ or 'char **'. If CC is g++, the difference causes a compile error
+ and thus leads to a false detection of non-working iconv.
+ Reported by Eli Zaretskii and Werner LEMBERG in:
+ <https://lists.gnu.org/archive/html/bug-gnulib/2014-10/msg00023.html>.
+
+ * m4/iconv.m4 (AM_ICONV_LINK): Try all possible argument types of
+ iconv. Bump serial number.
+
+2014-10-20 Werner LEMBERG <wl@gnu.org>
+
+ * src/libs/gnulib/lib/wctype.in.h: Include `config.h'.
+
+ Problem reported by Eli Zaretskii <eliz@gnu.org>.
+
+ This is a temporary hack to make groff compile with MinGW. After
+ the switch to an automake infrastructure, together with proper use
+ of `gnulib', we can safely replace the patched file with a standard
+ version.
+
+2014-10-19 Doug McIlroy <doug@cs.dartmouth.edu>
+
+ Fix Savannah bug #42151.
+
+ * src/preproc/eqn/lex.cpp (file_input::read_line): Handle CR/LF.
+ * src/preproc/pic/pic.cpp (file_input::read_line): Ditto.
+
+2014-10-18 Werner LEMBERG <wl@gnu.org>
+
+ [mdoc] Add Darwin version string for OS X 10.10.
+
+ * tmac/doc-common (doc-operating-system-Darwin-14.0.0): New string.
+
+ * tmac/groff_mdoc.man: Updated.
+
+2014-10-15 Werner LEMBERG <wl@gnu.org>
+
+ * doc/webpage.ms: Remove obsolete references to tarballs and diffs.
+
+ Reported by Dave Kemper <saint.snit@gmail.com>.
+
+2014-10-15 Colin Watson <cjwatson@debian.org>
+
+ Always distribute the parts of groff that require X11.
+
+ * Makefile.in (ALLLIBDIRS): Clone from `LIBDIRS', but include
+ src/devices/libxutil unconditionally.
+ (ALLPROGDIRS): Clone from `PROGDIRS', but include
+ src/devices/xditview and src/utils/xtotroff unconditionally.
+ (DISTDIRS): Use `ALLLIBDIRS' and `ALLPROGDIRS' rather than `LIBDIRS'
+ and `PROGDIRS'.
+
+2014-10-14 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Minor update to NEWS for pdfroff.
+
+ * NEWS (pdfroff): Note use of PHASE register, and not pdf:href.map,
+ to choose when to emit toc_relocation control record.
+
+2014-10-13 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ For pdfroff, deduce "--no-toc-relocation" from input stream.
+
+ * NEWS: Add notification; document the effect of changes, as recorded
+ in contrib/pdfmark/ChangeLog.
+
+2014-10-12 Ingo Schwarze <schwarze@openbsd.org>
+
+ [mdoc] Support `Mdocdate' CVS keyword substitution.
+ This fixes Savannah bug #42968.
+
+ This feature is used for OpenBSD manuals.
+
+ * tmac/doc-common (Dd): Handle `$Mdocdate:' argument.
+
+ * tmac/groff_mdoc.man: Document it.
+
+2014-10-12 Ingo Schwarze <schwarze@openbsd.org>
+
+ [mdoc] Add `.At III' and `.St -iso8601'.
+ This fixes Savannah bug #42971.
+
+ * tmac/doc-syms: Add corresponding version strings.
+
+ * tmac/groff_mdoc.man: Synchronize.
+
+2014-10-12 Ingo Schwarze <schwarze@openbsd.org>
+
+ [mdoc] Update operating system release numbers.
+ This fixes Savannah bug #42969.
+
+ * tmac/doc-common: Update NetBSD, OpenBSD, FreeBSD, and DragonFly
+ version strings.
+
+ * tmac/groff_mdoc.man: Synchronize.
+
+2014-10-12 Werner LEMBERG <wl@gnu.org>
+
+ * doc/Makefile.in: Use `LC_ALL' in addition to `LANG'.
+ Suggested by Steffen.
+
+2014-10-12 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Make PDF version compilable with makeinfo 5.x.
+
+ makeinfo 5.x handles macro expansion better, which changes the way
+ how an \LE macro (for a less-than sign) has to be defined. However,
+ since we can't be sure that the latest version of `texinfo.tex' gets
+ used with makeinfo 5.x only, we would have to support both 4.x and
+ 5.x. No idea whether this is possible at all... For this reason,
+ we now simply use @value directly instead of wrapping it into a
+ macro, avoiding any issues.
+
+2014-10-12 Werner LEMBERG <wl@gnu.org>
+
+ [doc] Protect against picky `sed' programs.
+ Problem reported by Axel Kielhorn <tex@axelkielhorn.de>.
+
+ * doc/Makefile.in (GROFF_BIN_PATH, GROFF): Add `LANG=' to avoid
+ interpretation of non-ASCII characters by sed.
+
+2014-10-12 Michail Vidiassov <master@iaas.msu.ru>
+
+ * tmac/doc-common: Add new Darwin versions.
+
+2014-10-12 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: s/which/that/ where appropriate.
+
+2014-10-12 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Various minor fixes.
+
+ Most of those glitches have been found by comparing the info output
+ from makeinfo 4.13 and the current SVN development version (of
+ makeinfo).
+
+2014-10-12 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Improve indexing.
+
+ Change @DefXXXItem and @DefXXXListEnd macros to not insert an index
+ entry. New macro variants with a trailing `x' (like `@DefreqItemx')
+ can override this.
+
+ Update macro calls where necessary.
+
+2014-10-12 Werner LEMBERG <wl@gnu.org>
+
+ [doc] Improve call to generation of `groff.pdf'.
+ Problem reported by Axel Kielhorn <tex@axelkielhorn.de>.
+
+ Since `groff.texinfo' contains latin-1 characters, some sed
+ implementations (like the one used on Mac OS 10.8) fail if called
+ with the wrong locale. Basically, this is a `texi2dvi' bug, but we
+ can set `LANG' by ourselves to improve the situation.
+
+ * doc/Makefile.in (.texinfo.dvi, .texinfo.pdf): Set `LANG'
+ environment variable to empty string.
+
+2014-10-12 Werner LEMBERG <wl@gnu.org>
+
+ [doc] Correctly handle `MAKEINFO' environment variable.
+ Bug introduced in commit from 2014-03-29.
+
+ * m4/groff.m4 (GROFF_MAKEINFO): Don't set MAKEINFO to empty string
+ before actually testing it.
+
+ * configure: Regenerated.
+
+2014-10-11 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Fix an issue on `make dist'.
+
+ In order to make the tarball, `make dist' copies src/libs/gnulib
+ directories into the `tmp' directory without the `.deps'
+ directories, causing the failure of `make distclean' in
+ tmp/src/libs/gnulib. Forcing a call to `config.status' recreates
+ the `.deps' directories.
+
+ * Makefile.in (dist): For gnulib, call `config.status' before `make
+ distclean'.
+
+2014-10-11 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/*.pl: Remove call from `IPC', use normal system
+ `instead'.
+
+2014-10-11 Guillem Jover <guillem@hadrons.org>
+
+ Add support for various BSD versions.
+
+ * tmac/doc-common: Add new FreeBSD and DragonFly versions.
+
+2014-10-11 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Refactor .psbb request handling code.
+
+ * src/roff/troff/input.cpp (do_ps_file): Reimplement it, using...
+ (psbb_locator): ...this new locally declared and implemented class;
+ its constructor replaces all `do_ps_file()' capability, delegating
+ to other class methods, as appropriate.
+ (assign_registers): Encapsulate it, as a `psbb_locator' method.
+ (ps_get_line): Likewise, also renaming it to become...
+ (get_line): ...this class method; its internally defined `lastc'
+ static variable also becomes a non-static class member variable.
+ (PSBB_RANGE_IS_BAD, PSBB_RANGE_IS_SET, PSBB_RANGE_AT_END): New
+ manifest constants; define them. They are now used by...
+ (parse_bounding_box): ...this function, now also encapsulated as
+ a `psbb_locator' class method, to convey parsing status.
+ (bounding_box): Struct obsoleted by `psbb_locator'; delete it.
+ (ps_bbox_request): Delegate to `psbb_locator'.
+
+2014-10-11 Werner LEMBERG <wl@gnu.org>
+
+ Various clean-ups.
+
+ * NEWS: More updates.
+
+ * REVISION: Set to 3.
+
+ * doc/groff.texinfo: Update version and year.
+
+ * configure: Regenerated.
+
+ * src/roff/groff/groff.cpp (main) <'v'>: Update copyright year.
+
+2014-10-11 Werner LEMBERG <wl@gnu.org>
+
+ Update generic GNU files to recent versions.
+
+ * INSTALL.gen, config.guess, config.rpath, config.sub,
+ contrib/groff_filenames/Makefile.sub, doc/fdl.texi, doc/texinfo.tex,
+ doc/txi-en.tex, install-sh, m4/ax_prog_perl_version.m4,
+ m4/codeset.m4, m4/fcntl-o.m4, m4/glibc21.m4, m4/iconv.m4,
+ m4/lib-ld.m4, m4/lib-link.m4, m4/lib-prefix.m4, m4/localcharset.m4,
+ src/include/localcharset.h, src/libs/gnulib/Makefile.in,
+ src/libs/gnulib/aclocal.m4, src/libs/gnulib/build-aux/compile,
+ src/libs/gnulib/build-aux/config.guess,
+ src/libs/gnulib/build-aux/config.sub,
+ src/libs/gnulib/build-aux/depcomp,
+ src/libs/gnulib/build-aux/install-sh,
+ src/libs/gnulib/build-aux/snippet/arg-nonnull.h,
+ src/libs/gnulib/build-aux/snippet/c++defs.h,
+ src/libs/gnulib/build-aux/snippet/warn-on-use.h,
+ src/libs/gnulib/configure, src/libs/gnulib/lib/Makefile.in,
+ src/libs/gnulib/lib/config.charset, src/libs/gnulib/lib/intprops.h,
+ src/libs/gnulib/lib/localcharset.c,
+ src/libs/gnulib/lib/localcharset.h, src/libs/gnulib/lib/ref-add.sin,
+ src/libs/gnulib/lib/ref-del.sin, src/libs/gnulib/lib/stdbool.in.h,
+ src/libs/gnulib/lib/stddef.in.h, src/libs/gnulib/lib/streq.h,
+ src/libs/gnulib/lib/unitypes.in.h,
+ src/libs/gnulib/lib/uniwidth.in.h,
+ src/libs/gnulib/lib/uniwidth/cjk.h,
+ src/libs/gnulib/lib/uniwidth/width.c, src/libs/gnulib/lib/verify.h,
+ src/libs/gnulib/lib/wchar.in.h, src/libs/gnulib/lib/wctype-h.c,
+ src/libs/gnulib/lib/wctype.in.h, src/libs/gnulib/lib/wcwidth.c,
+ src/libs/gnulib/m4/00gnulib.m4, src/libs/gnulib/m4/Makefile.in,
+ src/libs/gnulib/m4/codeset.m4, src/libs/gnulib/m4/configmake.m4,
+ src/libs/gnulib/m4/extensions.m4, src/libs/gnulib/m4/fcntl-o.m4,
+ src/libs/gnulib/m4/glibc21.m4, src/libs/gnulib/m4/gnulib-tool.m4,
+ src/libs/gnulib/m4/inttypes-pri.m4,
+ src/libs/gnulib/m4/localcharset.m4, src/libs/gnulib/m4/longlong.m4,
+ src/libs/gnulib/m4/onceonly.m4, src/libs/gnulib/m4/wchar_t.m4,
+ src/libs/gnulib/m4/wint_t.m4, src/libs/libgroff/config.charset,
+ src/libs/libgroff/localcharset.c, src/libs/libgroff/ref-add.sin,
+ src/libs/libgroff/ref-del.sin, src/preproc/refer/refer.man: Do it.
+
+2014-10-11 Werner LEMBERG <wl@gnu.org>
+
+ * NEWS, MANIFEST: Updated.
+
+2014-10-11 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile.in (OTHERDIRS, NOMAKEDIRS): Remove `ideal' references.
+
+2014-10-10 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * contrib/gideal: Temporarily remove this directory, because the
+ documentation and the preprocessor are not yet finished for
+ groff-1.2.23.
+
+2014-10-10 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile.in (dist): Clean up `src/libs/gnulib'.
+
+2014-10-10 Werner LEMBERG <wl@gnu.org>
+
+ * doc/webpage.ms: Updates.
+
+ The README and NEWS sections are not yet synchronized, though.
+
+2014-10-09 Ingo Schwarze <schwarze@openbsd.org>
+
+ * Makefile.in: Let `clean' and `distclean' descend into gnulib.
+
+ This fixes Savannah bug #42970.
+
+2014-10-02 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Set default X11 resources dir to `$prefix/lib/X11/app-defaults'.
+
+ Previously, X11 resources for gxditview were installed in
+ `/usr/X11/lib/X11/app-defaults', no matter which prefix was set.
+
+ Now, gxditview resources are installed in
+ `appresdir=$prefix/lib/X11/app-defaults'. If `appresdir' is not a
+ standard X11 resource directory, the environment variable
+ `XFILESEARCHPATH' should be set to this path.
+
+ The behaviour of `--with-appresdir' is unchanged: This option can
+ still be used to set `appresdir', and its value will not be modified
+ by the prefix.
+
+ * m4/groff.m4 (GROFF_APPRESDIR_DEFAULT): Implement new behaviour.
+ Fix detection app-defaults location on the system.
+ (GROFF_APPRESDIR_CHECK): Updated.
+
+ * configure.ac: Improve output of configuration.
+ * configure: Regenerated.
+
+ * NEWS: Mention it.
+
+2014-09-27 Werner LEMBERG <wl@gnu.org>
+
+ Set `transparent' flag for `\[cq].
+ Problem reported by Dave Kemper <saint.snit@gmail.com>.
+
+ * src/roff/troff/input.cpp (init_charset_table): Do it.
+
+ * doc/groff.texinfo (Sentences, Using Symbols), man/groff_diff.man:
+ Document it.
+
+2014-09-25 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/*.pl: Program more reasonable subs (functions).
+ Repair details in many places.
+
+2014-09-24 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Refactor psbb line input function; avoid a buffer overrun.
+
+ * src/roff/troff/input.cpp (ps_get_line): Declare it as `static'.
+ Refactor, to avoid the overhead of character look-ahead and push-back
+ on CR stream input. Add new `dscopt' parameter, in place of internal
+ `err' variable; update all call references, passing value of...
+ (DSC_LINE_MAX_ENFORCE): ...this new manifest constant; define it.
+ (DSC_LINE_MAX_IGNORED): Likewise; currently unused, but intended for
+ future use as an alternative to `DSC_LINE_MAX_ENFORCE'.
+ (DSC_LINE_MAX_CHECKED): New manifest constant; used internally only.
+ (PS_LINE_MAX): Manifest constant, renamed for notional consistency...
+ (DSC_LINE_MAX): ...to this; defined value remains as 255.
+ (do_ps_file): Increase stack allocation for `buf' char array; former
+ allocation of PS_LINE_MAX (now DSC_LINE_MAX) bytes exposed a potential
+ buffer overrun, after reading DSC_LINE_MAX bytes; two additional bytes
+ are required, to accommodate a terminating LF and NUL. Add `dscopt'
+ parameter, with value `DSC_LINE_MAX_ENFORCE', in each of three calls
+ to `ps_get_line()'.
+
+2014-09-20 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/groff/Makefile.sub: Remove too much deleting while
+ running `make'.
+
+2014-09-20 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * `Makefile.sub' in the whole groff source tree: Add $(RM) and
+ change all `rm -f'. Add directory test before `rmdir'.
+
+2014-09-20 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * Man-pages (*.man) in the whole groff source tree: Improve
+ documents by adding \[co], \[cq], \[aq] instead of ` or ' and use
+ also \[co] as long as it makes sense. Remove \[en] in the years
+ date in order to allow the automatic license year increasing.
+
+2014-09-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * <groff-source-top>/*: Improve the license information and Emacs
+ setup.
+
+2014-09-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * tmac/*: Improve the license information and Emacs setup.
+
+2014-09-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/utils/xtotroff/*: Improve the license information and Emacs
+ setup.
+
+2014-09-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/utils/tfmtodit/*: Improve the license information and Emacs
+ setup.
+
+2014-09-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/utils/pfbtops/*: Improve the license information and Emacs
+ setup.
+
+2014-09-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/utils/lookbib/*: Improve the license information and Emacs
+ setup.
+
+2014-09-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/utils/lkbib/*: Improve the license information and Emacs
+ setup.
+
+2014-09-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/utils/indxbib/*: Improve the license information and Emacs
+ setup.
+
+2014-09-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/utils/hpftodit/*: Improve the license information and Emacs
+ setup.
+
+2014-09-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/utils/afmtodit/*: Improve the license information and Emacs
+ setup.
+
+2014-09-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/utils/addftinfo/*: Improve the license information and Emacs
+ setup.
+
+2014-09-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/troff/*: Improve the license information and Emacs
+ setup.
+
+2014-09-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/nroff/*: Improve the license information and Emacs
+ setup.
+
+2014-09-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/*: Improve the license information and Emacs
+ setup.
+
+2014-09-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/groff/*: Improve the license information and Emacs
+ setup.
+
+2014-09-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/preproc/tbl/*: Improve the license information and Emacs
+ setup.
+
+2014-09-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/preproc/soelim/*: Improve the license information and Emacs
+ setup.
+
+2014-09-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/preproc/refer/*: Improve the license information and Emacs
+ setup.
+
+2014-09-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/preproc/preconv/*: Improve the license information and Emacs
+ setup.
+
+2014-09-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/preproc/pic/*: Improve the license information and Emacs
+ setup.
+
+2014-09-17 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/preproc/html/*: Improve the license information and Emacs
+ setup.
+
+2014-09-17 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/preproc/grn/*: Improve the license information and Emacs
+ setup.
+
+2014-09-17 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/preproc/eqn/*: Improve the license information and Emacs
+ setup.
+
+2014-09-17 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/libs/libxutil/*: Improve the license information and Emacs
+ setup.
+
+2014-09-17 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/libs/libgroff/*: Improve the license information and Emacs
+ setup.
+
+2014-09-17 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/libs/libdriver/*: Improve the license information and Emacs
+ setup.
+
+2014-09-17 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/libs/libbib/*: Improve the license information and Emacs
+ setup.
+
+2014-09-17 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/libs/gnulib/*: Improve the license information and Emacs
+ setup. The former run of that was not yet complete.
+
+2014-09-17 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/libs/gnulib/*: Improve the license information and Emacs
+ setup.
+
+2014-09-17 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/include/*: Improve the license information and Emacs setup.
+
+2014-09-17 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/devices/grotty/*: Improve the license information and Emacs
+ setup.
+
+2014-09-17 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/devices/grops/*: Improve the license information and Emacs
+ setup.
+
+2014-09-17 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/devices/gropdf/*: Improve the license information and Emacs
+ setup.
+
+2014-09-17 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/devices/grolj4/*: Improve the license information and Emacs
+ setup.
+
+2014-09-17 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/devices/grolbp/*: Improve the license information and Emacs
+ setup.
+
+2014-09-17 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/devices/grohtml/*: Improve the license information and Emacs
+ setup.
+
+2014-09-17 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/devices/grodvi/*: Improve the license information and Emacs
+ setup.
+
+2014-09-15 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * man/*.man: Improve the license information (definition of .co
+ and .au).
+
+2014-09-15 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * m4/*.m4: Improve the license information without changing the
+ related information.
+
+2014-09-06 Werner LEMBERG <wl@gnu.org>
+
+ Fix build issues.
+
+ * m4/groff.m4: Fix typo.
+ s/refer_dir/referdir/ for consistency.
+
+ * configure: Regenerated.
+
+ * Makefile.in: s/refer_dir/referdir/ for consistency.
+
+ * src/preproc/refer/Makefile.sub (install_data, uninstall_sub):
+ Don't handle binaries or manpages; this is handled elsewhere
+ already. Right now, only install and uninstall the `refer' data
+ directory.
+
+2014-09-04 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * configure: When I change the `configure' file manually, the
+ refer data dir is created. But when running aclocal/autoreconf,
+ the dir is again not created.
+
+2014-09-04 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * m4/groff.m4, configure.ac, Makefile.in,
+ src/preproc/refer/Makefile.sub: Add information to create a refer
+ data directory by installing. That dir is not yet generated
+ anyway.
+
+2014-09-05 Werner LEMBERG <wl@gnu.org>
+
+ Regenerate configure files with correct parameters.
+
+ * configure.ac: Comment out m4 macros still missing.
+
+ * aclocal.m4, config.hin, configure: Regenerated.
+
+2014-09-04 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * some files in doc: Change the copying years to package form.
+ But many files have strange or no copying information.
+
+2014-09-04 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * contrib/pic2graph/Makefile.sub: Change the copying years to
+ package form.
+
+2014-09-04 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * FDL: Replace the changed actual file by the original `fdl.txt'
+ from <http://www.gnu.org/licenses/>.
+
+2014-09-03 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * contrib/grap2graph/Makefile.sub: Remove `Last updates' from all
+ files. Add and repair copyright. Write Emacs setup.
+
+2014-09-03 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/preproc/refer/refer.man: Include more distances for better
+ reading of the source file. Add `%' for documentation of
+ bibliographic database lines.
+
+2014-09-03 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * tree contrib/eqn2graph: Remove `Last updates' from all files.
+ Add and repair copyright. Write Emacs setup.
+
+2014-09-03 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * tree `arch': Remove `Last updates' from all files. Add
+ and repair copyright. Write Emacs seetup.
+
+2014-09-03 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * <groff top source directory>: Remove `Last updates' from all
+ files. Only `timestamp' values are left.
+
+2014-09-03 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * <groff top source directory>: Repair copyright years from
+ starting year to actual year for almost all files.
+
+2014-09-03 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * autom4te.cache: Remove that tree after running
+ `autoconf' or `autoreconf'.
+
+ * .gitignore: Add all files within `autom4te.cache' to get rid of
+ them automatically. Not sure so far, if this works.
+
+2014-09-03 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * BUG-REPORT, FDL, INSTALL*, MANIFEST, MORE.STUFF, NEWS, PROBLEMS,
+ PROJECTS, README*: Remove Emacs settings for coding style. Change
+ copyright years from 1989-2014 and 1993-2014 into 2014 only.
+
+2014-09-03 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * configure.ac, Makefile.in: Try to use /usr/local/share directory
+ for `refer'. Does not work so far.
+
+2014-09-02 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * All Makefile*: Add Emacs settings and lacking licenses.
+
+2014-09-02 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * BUG-REPORT, FDL, INSTALL*, MANIFEST, MORE.STUFF, NEWS, PROBLEMS,
+ PROJECTS, README*: Add Emacs settings.
+
+2014-09-02 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * PROJECTS: Add TODO for `refer'.
+
+2014-08-31 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * man/roff.man (roff.7): Replace Heirloom links to more actual
+ places. Create macro definitions for authors (.au) and copying
+ (.co).
+
+2014-08-30 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * man/groff_font.man (groff_font.7): Restructure
+ file format, but keep content.
+
+2014-08-30 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/utils/addftinfo/addftinfo.man (addftinfo.1): Restructure
+ file format, but keep content.
+
+2014-08-30 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * man/roff.man (roff.7): Repair documentation of heirloom.
+
+2014-08-28 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/grog.pl, src/roff/grog/subs.pl: Add `gpinyin'.
+
+ * src/roff/grog/grog.man: Restructure `SEE ALSO'.
+
+2014-08-28 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * contrib/gpinyin: Make it runnable, version 1.0.0.
+
+2014-08-20 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * groff.7 (man/groff.man): Add further preprocessor regions.
+ Repair documentation for Unicode.
+
+2014-08-08 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * configure.ac, configure, Makefile.in, m4/groff.m4: Install paths
+ for implementing contrib/gpinyin's sub.pl.
+
+2014-08-06 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * man/groff_char.man: Add description for displaying `uxxxx' as
+ `\[uxxxx]'.
+
+2014-08-05 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * man/groff.man (groff.7): Replace \[rs] to \e as far as useful.
+
+2014-08-05 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * man/groff.man (groff.7): Add documentation for the Unicode
+ escapes \[u....] and \[u.....].
+
+2014-08-02 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/groff/groff.man: Improve documentation for `utf8'.
+
+2014-08-01 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * contrib/gpinyin: New preprocessor for having the European-style
+ writing `pinyin' for the Chinese language.
+
+2014-07-22 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * groff.7 (man/groff.man): Add some useful special characters.
+
+2014-07-21 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * tbl.1 (src/preproc/tbl/tbl.man): Add simple examples.
+
+2014-07-12 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * groff.7 (man/groff.man): Add section about underlining.
+
+2014-07-07 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * man/groff.man (groff.7): Add some basic special characters
+ `\(xy'.
+
+2014-07-06 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * grog, groffer: Minor repairing.
+
+2014-07-06 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/subs.pl: Repair ligatures handling.
+
+2014-07-06 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/subs.pl: Correct handling of standard input.
+
+2014-07-06 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/groff/groff.man: Minor correction.
+
+2014-07-06 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/*: Minor corrections.
+
+2014-07-05 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/groff/groff.cpp: In `usage()' and `help()' order
+ alphabetically.
+
+2014-07-05 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * grog.pl, subs.pl: Heavily improve argument handling and `groff'
+ command line creation.
+
+2014-07-05 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * grog.man: Make file runnable for `doclifter'.
+
+2014-07-05 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * grog.man: Replace all .de by copying. Restrict all .char names
+ to length 2 only.
+
+2014-07-04 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * grog.man: Minor optimization.
+
+2014-07-04 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * grog.man: Transform in classical man-page style.
+
+2014-07-04 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * grog.pl, subs.pl: Add option `--warnings'. Rename
+ `--with_ligatures' to `--ligatures', but keep `--with_ligatures'
+ for compatibility.
+
+2014-07-03 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * Makefile.in: Remove directories `groffer/perl' and
+ `groffer.shell', which don't exist any more.
+
+2014-07-03 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * PROJECTS: Mention the start of the `ideal' project.
+
+2014-06-21 Ingo Schwarze <schwarze@openbsd.org>
+
+ * Makefile.in: Unbreak make install:
+ Add missing gideal dirs to the dist tarball.
+
+2014-06-19 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/groff/groff.man: Correct the collection of the
+ installation directories.
+
+2014-06-19 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/groff/groff.man: Add the installation file and
+ directory positions of the whole package with @...@.
+
+2014-06-19 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * man/groff.man, src/roff/groff/groff.man: Add file position
+ before and after installation and the latest update.
+
+2014-06-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/grog.pl: Corrections about `require' and `our'
+ definitions.
+
+ * src/roff/grog/subs.pl: In the `groff' output command line, split
+ the single character options collections into different
+ 1-character options, each with a leading minus `-'..
+2014-06-20 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/subs.pl: Repair call of `push'.
+
+2014-06-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/subs.pl: Minor correction at `do_first_line'.
+
+2014-06-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/subs.pl: Adjust for first lines with non-preproc
+ and not-tmac names to be ignored.
+
+2014-06-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/grog.pl, src/roff/grog/subs.pl: Add new first line
+ of roff files with the names of the needed preprocessors and the
+ actual tmac, see 2014-06-17 Ulrich Lauther. Replace the
+ word `ideal' by `gideal', when the preprocessor is meant.
+
+2014-06-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/Makefile.sub: Add $(RM).
+
+ * src/roff/grog/grog.pl: Remove call to perl_test.pl. `require
+ 5.6;' is enough as Perl test.
+
+ * src/roff/grog/perl_test.pl: Remove this file.
+
+2014-06-18 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * ChangeLog: Add Emacs-mode and a separator for the license.
+
+2014-06-17 Ulrich Lauther <ulrich.lauther@t-online.de>
+
+ * grog: Invent new first comment line of roff files with long
+ names of needed preprocessors and the tmac.
+
+2014-06-17 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/subs.pl: Correct handling of option `-J' for
+ ideal.
+
+2014-06-17 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/groff/groff.cpp, src/roff/groff/pipeline.h,
+ * src/roff/grog/subs.pl: Add `groff' option `-J' for `gideal'.
+
+2014-06-16 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/subs.pl: Remove too early listing of 3 `groff'
+ preprocessors options: gideal, glilypond, gperl.
+
+2014-06-16 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * contrib/gideal: New project for installing `ideal' for `groff'.
+
+ * Makefile.in: Add `gideal' for `OTHERDIRS'.
+
+2014-06-15 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/grog.pl, src/roff/grog/subs.pl: Repair argument
+ handling for output `groff' line.
+
+2014-06-15 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/grog.pl, src/roff/grog/grog.man: Correct and add
+ the documentation for filespec options.
+
+2014-06-14 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/subs.pl: Activate handling of `--run', such that
+ now the generated `groff' command line can run.
+
+2014-06-14 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/subs.pl: Repair handling of filespec arguments.
+
+2014-06-12 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/grog.pl, src/roff/grog/subs.pl: Add testing
+ methods of Ralph Corderoy's `grog.sh' of 2006. Add primary usage
+ of file name extensions.
+
+2014-06-10 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/grog.pl: Totally rewrite the `grog' version,
+ starting at the last stable version. Write many parts as `sub'
+ functions.
+
+ * src/roff/grog/subs.pl: New file by splitting the src file
+ `grog.pl', such that all functions get into the new file
+ `subs.pl'.
+
+ * src/roff/grog/Makefile.sub: Add file `subs.pl', which goes into
+ the `grog' libdir.
+
+2014-06-03 James Cloos <cloos@jhcloos.com>
+
+ * src/roff/grog/grog.pl: The errors with `ligatures' come also
+ from `TeX GYRE' fonts. Print this information, when `grog' should
+ work with the `pdf' device.
+
+2014-06-02 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/grog.pl: The `grog' version of yesterday has many
+ bugs. So reinstall an old version of `grog'.
+
+2014-06-01 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/Makefile.sub: Remove changing of first line
+ `#! ...'.
+
+2014-06-01 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/grog.pl: Remove `$Sp' mostly. Reorder script.
+ Check and repair requests. Add final character `$' to many
+ checked requests.
+
+2014-06-01 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * man/roff.man: Move .TH at the beginning.
+
+2014-05-29 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * man/groff.man: In special characters, add the mentioning of the
+ `groff' writing `\[xy]'.
+
+2014-05-27 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * man/groff_char.man: Finish notes in all tables.
+
+2014-05-26 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * man/groff_char.man: Add notes in some tables, more will come.
+
+2014-05-26 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/grog.pl: Add further first line characters for
+ single character `groff' options.
+
+ * src/roff/grog/grog.man: make generated options more readable.
+
+2014-05-26 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/grog.pl: Add detection of `.\" [eprt]' as first
+ line to `grog'. Change usage of `$Sp' to reasonable efforts in
+ `groff'.
+
+ * src/roff/grog/grog.man, man/groff_char.man: Add website for
+ license text, not only the postal address.
+
+2014-04-03 Steffen Nurpmeso <sdaoden@yandex.com>
+
+ * */Makefile.*: Path quoting fixes, whitespace, formatting.
+
+ Remove many quotes (and introduce a few as additional guards)
+ since groff's build system is generally not set up to properly
+ handle paths that need quoting.
+
+2014-04-03 Steffen Nurpmeso <sdaoden@yandex.com>
+
+ * Makefile.comm (extraclean): Don't delete `old'.
+
+ The rule calling `rm -f' was originally thought to remove private,
+ temporary files. However, we now have a subdirectory called `old'
+ in `fonts/devps' that may not be removed, and trying so now causes
+ an error because we no longer ignore the returned error code of
+ `rm'.
+
+2014-04-03 Steffen Nurpmeso <sdaoden@yandex.com>
+
+ * Makefile.in (OTHERDIRS): Fix directory order.
+
+ This has been accidentally broken in commit 51476bee from
+ 2014-02-25.
+
+2014-04-03 Steffen Nurpmeso <sdaoden@yandex.com>
+
+ * src/devices/gropdf/pdfmom.pl: Fix perl(1) warning.
+
+2014-03-30 Werner LEMBERG <wl@gnu.org>
+
+ * configure: Regenerated.
+
+2014-03-30 Steffen Nurpmeso <sdaoden@yandex.com>
+
+ * */Makefile.*: Put straight error-prevention prefixes for `rm'.
+
+2014-03-30 Steffen Nurpmeso <sdaoden@yandex.com>
+
+ `uninstall' target: Avoid spurious and misleading error messages.
+
+ * Makefile.comm (uninstall_dev): Improve.
+
+ * font/devpdf/Makefile.sub (install_data): Remove superfluous `rm'.
+ (uninstall_sub): Improve.
+
+ * src/roff/groff/Makefile.sub (uninstall_sub): Fix.
+
+2014-03-30 Steffen Nurpmeso <sdaoden@yandex.com>
+
+ Fixes for `uninstall' target.
+
+ * Makefile.in (uninstall_dirs): Use `DESTDIR'.
+
+ * src/libs/libgroff/Makefile.sub (uninstall_charset_data): Typo.
+
+ * src/roff/groff/Makefile.sub (uninstall_sub): Typo.
+
+ * src/roff/grog/Makefile.sub (uninstall_sub): Minor.
+
+2014-03-30 Steffen Nurpmeso <sdaoden@yandex.com>
+
+ * src/roff/grog/Makefile.sub (install_data): Typo.
+
+2014-03-29 Steffen Nurpmeso <sdaoden@yandex.com>
+
+ Add fine-tuning of doc generation to `configure'.
+
+ * m4/groff.m4 (GROFF_DOC_CHECK): New macro, handling option
+ `--with-doc' and its new arguments. It sets
+ `docadd_{html,info,other,pdf,examples}' and exports
+ `make{_,_install_,_uninstall_}{otherdoc,examples}'.
+ (GROFF_MAKEINFO): Extended to export
+ `make{_,_install_,_uninstall_}infodoc'.
+ (GROFF_HTML_PROGRAMS): Extended to export
+ `make{_,_install_,_uninstall_}{htmldoc,htmlexamples}'.
+ (GROFF_PDFDOC_PROGRAMS): Extended to export
+ `make{_,_install_,_uninstall_}{pdfdoc,pdfexamples}'.
+ (GROFF_INSTALL_INFO): Guard test with `docadd_info'.
+
+ * configure.ac: Use GROFF_DOC_CHECK.
+ * Makefile.in: Updated.
+
+ * doc/Makefile.sub: Handle examples separately, controlled by
+ $(make{_,_install_,_uninstall_}examples).
+
+2014-03-27 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ * tmac/www.tmac (TAG): Define register `PN'.
+
+2014-03-27 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ * tmac/an-ext.tmac (EX, EE): Preserve font family.
+
+2014-03-17 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/eqn/box.cpp (set_script_size): Fix minimum test.
+
+ Problem reported by Ted Harding <ted.harding@wlandres.net> in a
+ thread starting with
+
+ http://lists.gnu.org/archive/html/groff/2014-03/msg00181.html
+
+2014-03-16 Werner LEMBERG <wl@gnu.org>
+
+ Fix previous commit.
+
+ Problem reported (with a patch) by Ingo Schwarze
+ <schwarze@openbsd.org>.
+
+ * doc/Makefile.sub (groff_bin_dirs): Add `preconv'.
+
+ * doc/Makefile.in (groff_bin_dirs): Add `preconv'.
+ (.me.txt): Call preconv. Use UTF8 as output encoding.
+ (.me.ps): Call preconv.
+
+2014-03-14 Werner LEMBERG <wl@gnu.org>
+
+ [me] Add translation of `meintro.me' to French.
+
+ Contributed by Grégoire Babey <gibux@gmx.ch>.
+
+ * doc/meintro_fr.me: New file.
+ * LICENSES, doc/Makefile.sub: Updated.
+
+2014-03-13 Ingo Schwarze <schwarze@openbsd.org> (tiny change)
+
+ man: Correctly reset margins.
+
+ See
+
+ http://lists.gnu.org/archive/html/groff/2013-11/msg00026.html
+
+ for more.
+
+ * tmac/an-old.tmac (set-an-margin): Whenever (re)setting
+ `\n[an-level]' to 1 (which happens when encountering `.TH', `.SH',
+ and `.SS') make sure to also (re)set `\n[an-saved-margin1]' and
+ `\n[an-saved-prevailing-indent1]' to a sane value such that an
+ immediate `.RE' cannot wreak havoc.
+ (TH, SH, SS): Updated.
+
+2014-03-11 Ingo Schwarze <schwarze@openbsd.org> (tiny change)
+
+ * Makefile.in: Do not forget to install gropdf manuals.
+
+ This got broken in 290eaaac6cfc33856cd683838accc72ccf3e5a84:
+ src/devices/gropdf was split out of OTHERDIRS into SHPROGDIRS, and
+ consequently, Makefile.man was no longer used there. Note that
+ Makefile.dev is *not* needed, even though it's below /devices/.
+
+2014-03-11 Ingo Schwarze <schwarze@openbsd.org> (tiny change)
+
+ * src/roff/groff/Makefile.sub: POSIX conformance.
+
+ - POSIX says that the meaning of the make(1) `$<' macro shall be
+ unspecified except in inference rules. Consequently, use `$?'
+ for portability.
+
+ That's safe because the rules have only one prerequisite and
+ are not `.PHONY', so `$?' will always expand to one item.
+
+ - While here, clean up two instances of superfluous use of cat(1).
+
+2014-03-11 Ingo Schwarze <schwarze@openbsd.org> (tiny change)
+
+ * Makefile.in (dist): Improve.
+
+ - Bugfix: Do not error out if one of the DISTDIRS
+ contains a subdirectory.
+ - Make debugging easier by splitting the huge "cd tmp; ...; ..."
+ command sequence into several independent shell commands,
+ such that one can see which command actually fails.
+
+2014-03-06 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Missing RE escape in grep.
+
+ * src/devices/gropdf/pdfmom.pl: Escape '\' dot in grep RE.
+
+2014-02-26 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/grog.pl: Add detection of `gperl' to `grog'.
+
+2014-02-25 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * contrib/gperl: New preprocessor for Perl parts in groff files.
+
+2014-02-15 Ingo Schwarze <schwarze@openbsd.org>
+
+ * tmac/groff_mdoc.man: Improve the manual page template.
+
+ - Add the EXIT STATUS section. It is widely used in at least
+ NetBSD, FreeBSD, OpenBSD, and DragonFly manuals.
+ - Recommend the DIAGNOSTICS section for section 4 manuals. Such
+ usage is very widespread, in particular for kernel printf
+ messages emitted by device drivers.
+ - Do not recommend the DIAGNOSTICS section for command return
+ values to the shell any longer. While such usage historically
+ existed, it does not seem common nowadays, and in any case, using
+ the now well-established EXIT STATUS section seems preferable to
+ me.
+ - Mention the possibility to use ERRORS for section 4 manuals.
+ While most section 4 manuals have a DIAGNOSTICS section, only
+ some will need an ERRORS section, but these cases aren't exactly
+ rare, either. Quite some device driver manuals explain how to
+ use the device using system calls like ioctl(2), open(2), read(2)
+ or write(2), in which case the ERRORS section is the natural
+ place to explain which errno values the driver may set during
+ such system calls.
+ - Mentioning signal handling as a content of the ERRORS section
+ seems redundant, it is already covered by talking about the
+ errno. The case of errno == EINTR should be handled just like
+ all other errno cases. For an example showing that there is no
+ need to single out error handling in any way, please look at a
+ typical read(2) manual page.
+ - Mention the CAVEATS section. It first appeared in the 4.2BSD
+ execve(2) manual in 1983, was already used by several manuals by
+ the time of 4.4BSD-Lite2 in 1995, and is in whidespread use
+ today, not just in BSD base system manuals, but for example in
+ Perl manuals as well.
+
+2014-02-14 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/grog.pl: Add detection of glilypond-parts in groff
+ files. For example `grog example.groff' from the glilypond source
+ gets `glilypond example.groff | groff'.
+
+2014-02-12 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/grog.pl: With the former bugfix of 2014-02-12,
+ it's now possible to run `grog meref.me' etc., which wasn't
+ possible before. That addition of the macro handling was
+ necessary for the automatic for `groffer'.
+
+2014-02-12 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/grog/grog.pl: Add handling of macro definition and fix
+ problems with @VERSION@.
+
+2014-02-12 Rich Burridge <rich.burridge@oracle.com>
+
+ [grn] Prevent crash if more than 50 command line arguments.
+
+ * src/preproc/grn/main.cpp (INIT_FILE_SIZE, FILE_SIZE_INCR): New
+ macros.
+ (add_file): New function.
+ (main): Use it to add file arguments.
+
+2014-01-29 Ulrich Spörlein <uqs@FreeBSD.org>
+
+ * tmac/doc-common: Add even more DragonFlyBSD releases.
+
+2014-01-28 Ulrich Spörlein <uqs@FreeBSD.org>
+
+ * tmac/doc-common: Add some new *BSD version strings.
+
+2014-01-06 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * man/roff.man: Add information of new archives for RUNOFF and
+ roff_classical.
+
+ * Makefile.in: Replace `contrib/RUNOFF' by
+ `contrib/groff_filenames'.
+
+2014-01-05 Bernd Warken <groff-bernd.warken-72@web.de>
+ Werner LEMBERG <wl@gnu.org>
+
+ * groff/tmac/groff_man.man: Minor typos, formatting, reordering.
+
+2014-01-05 Werner LEMBERG <wl@gnu.org>
+
+ Revert recent changes to `an-ext.tmac' and `groff_man.man'.
+
+ * groff/tmac/an-ext.tmac (.FONT): Remove. This doesn't belong into
+ this file.
+
+ * groff/tmac/groff_man.man: Reset to state previous to 2014-01-04.
+ Useful changes will be re-committed in smaller, logical chunks.
+
+2014-01-05 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * groff/tmac/an-ext.tmac: in .FONT change variable name `result'
+ to `an_ext_FONT_result'.
+
+2014-01-04 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * groff/tmac/an-ext.tmac: add new request .FONT for using
+ different font names on a single line.
+
+ * groff/tmac/groff_man.man: put under GPL2, reordered and enhanced.
+
+2014-01-02 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ * src/devices/gropdf/gropdf.pl: gropdf use to fail when handling
+ output from preconv, now works.
+
+ * src/devices/gropdf/pdfmom.pl: can now be used as a pipeline, and
+ improvements made to its switch handling and use with preconv.
+
+ * tmac/pdf.tmac: changes to support preconv.
+
+2014-01-02 Colin Watson <cjwatson@debian.org>
+
+ * font/devascii/Makefile.sub ($(FONTS)): Convert extended regex
+ syntax to basic for sed.
+ * font/devcp1047/Makefile.sub ($(FONTS)): Likewise.
+ * font/devhtml/Makefile.sub ($(FONTS)): Likewise.
+ * font/devlatin1/Makefile.sub ($(FONTS)): Likewise.
+ * font/devutf8/Makefile.sub ($(FONTS)): Likewise.
+
+2013-12-23 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * groff/src/roff/groff/groff.cpp: add groff option `-G' to the
+ documentation in `synopsis()'.
+
+2013-12-06 Mike Frysinger <vapier@gentoo.org>
+
+ Fix parallel build with gropdf and mom examples.
+
+ The `contrib/mom/examples/' directory uses the helper script from
+ `src/devices/gropdf/'. Currently though, parallel builds might fail
+ like so:
+
+ ...
+ make[2]: Entering directory `.../groff-1.22.2/contrib/mom'
+ <groff command> examples/letter.mom >examples/letter.pdf
+ <groff command> examples/mom-pdf.mom >examples/mom-pdf.pdf
+ /bin/sh: .../groff-1.22.2/src/devices/gropdf/pdfmom: No such file or directory
+ make[2]: *** [examples/letter.pdf] Error 127
+ /bin/sh: .../groff-1.22.2/src/devices/gropdf/pdfmom: No such file or directory
+ make[2]: *** [examples/mom-pdf.pdf] Error 127
+ make[2]: Leaving directory `.../groff-1.22.2/contrib/mom'
+ make[1]: *** [contrib/mom] Error 2
+ ...
+ make[2]: Entering directory `.../groff-1.22.2/src/devices/gropdf'
+ sed -f .../groff-1.22.2/arch/misc/shdeps.sed \
+ -e "s|@VERSION@|1.22.2|" \
+ -e "s|@PERLPATH@|/usr/bin/perl|" ./pdfmom.pl >pdfmom
+
+ The top level makefile tries to account for this in general with
+ OTHERDIRS, but looks like `src/devices/gropdf/' was added to this
+ variable (which holds `contrib/mom/' too) because gropdf installs a
+ shell script, and the other prog vars require it to be a dir of
+ things to compile.
+
+ URL: http://crbug.com/324116
+ URL: https://bugs.gentoo.org/487276
+
+ * Makefile.in (SHPROGDIRS): Declare.
+ (PROGDIRS): Add $(SHPROGDIRS).
+ (OTHERDIRS): Delete src/devices/gropdf.
+ ($(SHPROGDIRS):): Add to existing rule.
+ ($(OTHERDIRS):): Depend on $(SHPROGDIRS).
+
+2013-12-08 Eric S. Raymond <esr@thyrsus.com>
+
+ Repository fully converted to git.
+
+2013-11-21 Werner LEMBERG <wl@gnu.org>
+
+ * config.guess, config.sub: Updated from `config' repository.
+
+2013-11-06 Werner LEMBERG <wl@gnu.org>
+
+ * src/libs/libgroff/tmpname.cpp (gen_tempname): Use O_BINARY.
+
+ Problem reported by Charlie Van Dien <charlie@vandien.com>; see
+
+ http://lists.gnu.org/archive/html/groff/2013-10/msg00006.html
+
+2013-11-06 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile.comm (.man.n): Use C locale.
+
+ Problem reported by Petr Man <petr@madnetwork.org>; fix suggested by
+ Ralph Corderoy <ralph@inputplus.co.uk>.
+
+2013-07-24 Ingo Schwarze <schwarze@openbsd.org>
+
+ [mdoc] Implement `.%C'.
+
+ * tmac/doc.tmac, tmac/doc-common: Do it.
+ * tmac/groff_mdoc.man: Updated.
+
+2013-07-31 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Fix overprinting issue with Acrobat reader.
+
+ Problem reported by Heinz-Jürgen Oertel <hj.oertel@t-online.de>.
+
+ * src/devices/gropdf/gropdf.pl (do_t, FindChar): Use ascii octal
+ notation (i.e., \015) when outputting characters with value < 32.
+ This fixes a bug which affected acroread when control-M (cr) was
+ embedded in a text string.
+
+2013-07-16 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/fallbacks.tmac: Make it work in compatibility mode.
+
+ Problem reported by Y T <doarhop@hotmail.com>.
+
+2013-07-16 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/grog/Makefile.sub (install_data, uninstall_sub): Typos.
+
+2013-07-16 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile.in (GREP, MDEFINES): Define and use plain grep.
+
+ Necessary for Bernd's code to extract groff options.
+
+2013-07-16 Ingo Schwarze <schwarze@openbsd.org>
+
+ * tmac/an-old.tmac (TP): Do not clobber line length after double
+ call to `.TP'.
+
+2013-07-02 Colin Watson <cjwatson@debian.org>
+
+ * doc/groff.texinfo: Fix syntax error in documentation of `\z'.
+
+2013-07-02 Colin Watson <cjwatson@debian.org>
+
+ * src/devices/grolbp/lbp.cpp (main): Don't write trailer if no
+ printer was created.
+
+2013-06-19 Eric S. Raymond <esr@thyrsus.com>
+
+ * src/utils/lkbib/lbib.man: Move running text out of synopsis.
+
+2013-05-06 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/groff/Makefile.sub: Replace `cpp' by `groff.cpp'.
+
+2013-05-06 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * Makefile.in: Add new `contrib' directory `RUNOFF'.
+
+2013-05-01 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/groff/Makefile.sub: Remove all `.PHONY:' lines.
+
+2013-04-30 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/groff/Makefile.sub: Replace `egrep' by `$(GREP)'.
+ commands. Don't use $(CCSRCS) any more.
+
+2013-04-30 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * Makefile.in, m4/groff.m4: Add `@libprogramdir@' and
+ `$libprogramdir' (usually `/usr/local/lib/groff'). Change
+ `$libdir/groff' into $libprogramdir for several `groff' programs.
+ Run `autoreconf -I m4'.
+
+ * src/roff/groff/MAkefile.sub: Add $(DESTDIR) and $(srcdir) in
+ order to support installation outside of source code.
+
+ * contrib/glilypond/Makefile.sub, contrib/glilypond/glilypond.pl:
+ Correct the install directories.
+
+2013-04-29 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/groff/Makefile.sub: Replace some variables by shell
+ commands. Improve the output for the `make' runs.
+
+2013-04-28 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/groff/Makefile.sub: Make this Makefile compatible.
+
+2013-04-28 Bernd Warken <groff-bernd.warken-72@web.de>
+2013-04-28 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/groff/Makefile.sub: Use `make' variables to get
+ `groff' options from `getopt' in `groff.cpp'. Create 2 files
+ `groff_opts_no_arg.txt' and `groff_opts_with_arg.txt'.
+
+2013-04-26 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/groff/read_groff_options.pl: Remove this file. It's
+ no longer needed.
+
+ * src/roff/groff/Makefile.sub: Get the `groff' options from the
+ use of `getopt...' in `groff.cpp' using `$(EGREP)' and `sed'.
+ Store this information in a new file `groff_options.txt', which
+ is copied to `groff libdir' during the installation.
+
+2013-04-26 Werner LEMBERG <wl@gnu.org>
+
+ Various minor fixes.
+
+ * INSTALL.gen: Take the newest version from the `gnulib'
+ repository.
+
+ * configure: Regenerated.
+
+2013-04-26 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * INSTALL.gen: Restore an older version from `2006' in
+ `groff-1.21'.
+
+ * FOR-RELEASE: New file which describes how to prepare `groff'
+ for a new release.
+
+2013-04-26 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * src/roff/groff/read_groff_options.pl: Reads `groff' options
+ from `groff.cpp' and writes them into the file `groff_options.info'.
+
+ * src/roff/groff/Makefile.sub: Have the generated file
+ `groff_options.info' be installed into the `groff libdir'.
+
+2013-04-16 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * INSTALL.gen: Replace this file by the daily `git' version of
+ `automake' `INSTALL' file.
+
+ * INSTALL.autotools: Remove file.
+
+ * INSTALL.CVS: New file, moved from `INSTALL.autotools'.
+
+ * m4/ax_prog_perl_version.m4: New file, taken from package
+ `autoconf-archive-2013.04.06'.
+
+ * m4/groff.m4: Remove unnecessary blank line.
+
+ * Makefile.in: Add `$(PERLVERSION)'.
+
+ * aclocal.m4: Run `autoreconf -I m4' (this includes
+ `aclocal -I m4'). This creates a suitable `aclocal.m4'. Remove
+ generated subdirectory `autom4te.cache'.
+
+ * src/roff/grog/Makefile.sub: Correct `sed' command. Use `tabs'
+ that are needed by `GNU make'.
+
+2013-04-16 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * Makefile.sub: Add `m4/ax_compare_version.m4'.
+
+ * aclocal.m4: Run the latest `aclocal -I m4' which generates a
+ suitable content in that file.
+
+ * INSTALL.autotools: Information of the usage of `GNU autotools'
+ with `groff'.
+
+ * INSTALL.gen: Move `autotool' parts to file `INSTALL.autotools'.
+
+2013-04-15 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * m4/groff.m4: Replace tabs by spaces. Use a double line between
+ AC_DEFUNs.
+
+2013-04-15 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ In the whole `groff' system, rename autoconf variable `$PERLPATH'
+ to `$PERL', which has the same content. But `$PERL' suits to
+ `AX_PROG_PERL_VERSION' in m4 macro `GROFF_PERL' in `m4/groff.m4'.
+
+ * src/utils/afmtodit/Makefile.sub,
+ * src/devices/gropdf/gropdf.pl,
+ * src/devices/gropdf/Makefile.sub,
+ * src/devices/gropdf/pdfmom.pl,
+ * arch/djgpp/config.site,
+ * font/devpdf/Makefile.sub,
+ * contrib/mm/Makefile.sub,
+ * m4/groff.m4,
+ * Makefile.in: Replace `$PERLPATH' by `$PERL'.
+
+ * m4/ax_compare_version.m4: New file, copied from daily version of
+ `GNU autoconf-archive'.
+
+ `autoconf' was not yet run, a newer version is needed.
+
+2013-04-15 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * README, INSTALL, INSTALL.gen, MANIFEST: Add documentation in the
+ top directory about some parts of `autotools' and `glilypond'.
+
+2013-04-15 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * configure.ac: Add information of the macro `GROFF_PERL'.
+
+ * Makefile.in: Add definitions of the macro variables and their
+ `@...@' counterparts.
+
+ Run `autoreconf -I m4'.
+
+2013-04-15 Bernd Warken <groff-bernd.warken-72@web.de>
+2013-04-15 Werner LEMBERG <wl@gnu.org>
+2013-04-15 Ralph Corderoy <ralph@inputplus.co.uk>
+
+ Add Perl test to configuration. During the run of `configure' the
+ program is broken with error when there is no `Perl' or the `perl'
+ program is too old.
+
+ * m4/groff.m4: Add macro `GROFF_PERL' that tests the availability
+ of the `perl' program and tests whether this has a version of at
+ most `v5.6.1'. Define variables $PERL and $PERLPATH for the full
+ name of the `perl' program and $PERLVERSION as the lest version.
+
+2013-04-13 Keith Marshall <keithmarshall@users.sourceforge.net>
+
+ Avoid consideration of autotool cache for CVS inclusion.
+
+ * .cvsignore (autom4te.cache): Add reference.
+
+2013-04-13 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * `autotools': During the run of `autoconf' and `autoreconf' a
+ subdirectory `autom4te.cache' was created. I first added this to
+ groff CVS and removed it again after an email-discussion.
+
+2013-04-12 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * `grog': Remove the shell version of `grog'. Now there is only
+ Perl version.
+
+ * src/roff/grog/perl.sh: Remove this file.
+
+ * src/roff/grog/Makefile.sub: This file handles the removement of
+ the shell version.
+
+ * src/roff/grog/perl_test.pl: New file for testing the available
+ Perl version in the system to be installed into. This file will
+ be installed into the grog lib-directory.
+
+2013-04-12 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * `grog': In the following, the file `grog.pl' will be split. For
+ the coming files, a lib-directory is needed for storage.
+
+ * m4/groff.m4, configure.ac: Add libdir information for `grog'.
+
+ * Makefile.in: Add @grog_dir@.
+
+ Run `autoconf'.
+
+ `grog' has now a lib-directory at `$prefix/lib/groff/grog'.
+
+2013-04-11 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * contrib/groffer/: There is a free `git' package containing all
+ old `groffer' versions `v0.*' and `v1.*'. The new versions
+ `groffer 2.*' will actually not be included. This package can be
+ got at:
+
+ $ git clone git@github.com:RUNOFF/groffer.git
+
+2013-04-11 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * contrib/glilypond/: There is a free `git' package containing all
+ old versions of the former name `groff_lilypond v0.*'. They work
+ with `lilypond' parts in `roff' files, but were not installed.
+ This package can be got at:
+
+ $ git clone git@github.com:RUNOFF/groff_lilypond.git
+
+ The new versions `glilypond v1.*' are not included there.
+
+2013-04-11 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * man/roff.man: For roff(7), add information about the free git
+ package RUNOFF.git with documentation about historical RUNOFF and
+ the available files written in the classical RUNOFF language..
+
+2013-03-29 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ Rename `groff_lilypond' to `glilypond'. So remove the former
+ source directory `<groff_src_dir>/contrib/lilypond' and newly
+ install `<groff_src_dir>/contrib/glilypond', which now has many
+ files. The new version starts at `v1.0'.
+
+ * m4/groff.m4, configure.ac: Add libdir information for
+ `glilypond'.
+
+ * Makefile.in: Add `<groff_src_dir>/contrib/glilypond'.
+
+ Run `autoconf'.
+
+ `glilypond' can now be installed to the system.
+
+2013-03-17 Ingo Schwarze <schwarze@openbsd.org>
+
+ * font/devpdf/Makefile.sub: Build system fixes.
+
+ (GROFF_FONT_FILES): Avoid installing Makefile.sub.orig when it's
+ around.
+ (install): Create $(DESTDIR)$(fontsubdir)/util when missing.
+
+2013-03-05 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Improve documentation of `\s'.
+
+ Reported by Jim Avera <james_avera@yahoo.com>.
+
+2013-02-16 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Improve documentation of `.substring'.
+
+ Reported by Jim Avera <james_avera@yahoo.com>.
+
+2013-02-13 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Fix if-else example.
+
+ Reported by Jim Avera <james_avera@yahoo.com>.
+
+2013-02-10 Werner LEMBERG <wl@gnu.org>
+
+ [grops] Make binary `%%BeginData' work; support `fontset' resource.
+
+ * src/devices/grops/psrm.cpp (resource_table): Add `fontset'.
+
+ (resource_manager::read_resource_arg): Do a case insensitive
+ comparison. The PostScript Reference Manual gives the following
+ example for a CFF resource (example 5.7):
+
+ %!PS-Adobe-3.0 Resource-FontSet
+ %%DocumentNeedResources: ProcSet (FontSetInit)
+ %%Title: (FontSet/CFFRoman27)
+ %%Version: 1.000
+ %%EndComments
+ %%IncludeResource: ProcSet (FontSetInit)
+ %%BeginResource: FontSet (CFFRoman27)
+ /FontSetInit /ProcSet findresource begin
+ %%BeginData: 622532 Binary Bytes
+ /CFFRoman27 622503 StartData
+ ... 622,503 bytes of binary data ...
+ %%EndData
+ %%EndResource
+ %%EOF
+
+ Note the `ProcSet' and `FontSet' keywords. While the old DSC
+ (Document Structure Convention) documentation doesn't cover
+ `FontSet' at all (the DSC documentation predates the invention of
+ CFF), it describes only `procset' (all letters downcase), and it
+ also says that the DSC parser works in a case sensitive manner.
+
+ In other words, `ProcSet' is not valid according to the DSC
+ documentation, only `procset' is. So much about today's validity
+ of DSC... This patch adapts grops's code to the PostScript
+ reality.
+
+ (resource_manager::do_begin_data): Fix typo (present since the
+ beginning) which prevented correct handling of binary data.
+
+ * src/devices/grops/ps.h (resource_type): Add RESOURCE_FONTSET.
+
+2013-02-10 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * contrib/lilypond: New files for adding lilypond parts into groff
+ files.
+
+2013-02-07 Werner LEMBERG <wl@gnu.org>
+
+Version 1.22.2 released
+=======================
+
+ * NEWS, REVISION, doc/groff.texinfo, doc/webpage.ms: Updated.
+
+ * configure: Regenerated.
+
+ * doc/texinfo.tex: Updated from `texinfo' repository.
+
+ * src/roff/groff/groff.cpp (main) <'v'>: Update copyright year.
+
+2013-02-07 Werner LEMBERG <wl@gnu.org>
+
+ * src/libs/gnulib/*: Update `gnulib' files.
+
+2013-02-02 Gilles Espinasse <g.esp@free.fr>
+
+ [grohtml] Don't ignore return value of `dup'.
+
+ * src/preproc/html/pushback.cpp (pushBackBuffer::pushBackBuffer,
+ pushBackBuffer::~pushBackBuffer): Abort if `dup' fails.
+
+2013-01-30 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * tmac/groff_man.man: Fix wrong connection for tbl(1).
+
+2013-01-29 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Fix documentation of .LP macro in ms.
+ Problem reported by Omari Norman <omari@smileystation.com>.
+
+2013-01-29 Werner LEMBERG <wl@gnu.org>
+
+ * doc/Makefile.sub (uninstall_sub): Handle `gnu.eps'.
+
+2013-01-29 Werner LEMBERG <wl@gnu.org>
+
+ Building clean-ups.
+
+ * Makefile.in: Use $(top_srcdir) where appropriate.
+ * Makefile.sub (M4MACROS): Add `fcntl-o.m4' and `localcharset.m4'.
+
+ * font/devpdf/Makefile.sub (UTILFILES): Removed, unused.
+ (MOSTLYCLEANADD): Add `BuildFoundries'.
+ * src/devices/gropdf/Makefile.sub (MOSTLYCLEANADD): Add `pdfmom'.
+
+2013-01-24 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * Add a shell command to 'MANIFEST' that displays all man source
+ files and their section.
+
+2013-01-22 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * Add email address in all files having the name.
+
+2013-01-14 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ * src/devices/gropdf/gropdf.pl (do_x, do_p, do_s, Set_LWidth): The
+ grops driver defaults to round linecaps and linejoins, gropdf
+ incorrectly used butt caps and miter joins.
+
+ (Since the MOM package expects to use butt caps and miter joins
+ (emitting the necessary postscript code to change the caps and
+ joins), gropdf now parses the same postscript commands.)
+
+ * src/devices/gropdf/gropdf.man: Document the handling of linecaps
+ and linejoins.
+
+ * tmac/pdf.tmac (pdfbookmark): Fix bug where the current
+ PDFOUTLINE.FOLDLEVEL may not be honoured if warnings of the type
+
+ macro warning: adjusted level n bookmark; should be <= n
+
+ Added copyright and mention debt owed to Keith Marshall for
+ original `pdfmark.tmac', upon which `pdf.tmac' is largely based.
+
+ * font/devpdf/Foundry.in, font/devpdf/util/BuildFoundries.pl
+ (LocateFile): The font for EURO had the wrong entry in the
+ `download' file (it pointed to The font in the build directory,
+ which is wrong). It has always been permissible to include a
+ path along with the font name in the Foundry file, but until now
+ the font had to exist to be valid. It is now permitted to start
+ the path with an asterisk which tells BuildFoundry to use the
+ path/filename in the download file without checking if the font
+ exists. This allows the font to be found in `../devps' even
+ though it is not there during the build (if source and build are
+ different), but will be there after the install.
+
+2013-01-13 Werner LEMBERG <wl@gnu.org>
+
+ [eqn] Fix display of matrices in nroff output.
+
+ Problem reported by Andy Spencer <andy753421@gmail.com>.
+
+ * src/preproc/eqn/pile.cpp (pile_box::compute_metrics,
+ matrix_box::compute_metrics): Fix rounding.
+
+2013-01-07 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ * tmac/europs.tmac: Protect against missing fonts.
+
+2013-01-07 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ * font/devpdf/util/BuildFoundries.pl (LoadFoundry): Improve
+ warning.
+
+2013-01-07 Werner LEMBERG <wl@gnu.org>
+
+ [tbl] Allow characters #, `, and ' as eqn delimiters.
+
+ While problems ` and ' have been unintentionally introduced rather
+ recently, the limitation regarding # was there from the beginning.
+
+ At the same time, fix a small bug causing `.lf' requests not
+ starting a line.
+
+ * src/preproc/tbl/table.cpp (table::init_output)
+ (table::compute_expand_width, table::compute_separation_factor)
+ (table::define_bottom_macro, table::do_bottom): Temporarily switch
+ off eqn delimiters, wrapping the code into a `.ig' block. This
+ uses the new functionality just added to eqn.
+
+ * src/preproc/eqn/eqn.man, src/preproc/tbl/tbl.man: Updated.
+
+2013-01-06 Werner LEMBERG <wl@gnu.org>
+
+ [eqn] Add `delim on'.
+
+ * src/preproc/eqn/lex.cpp (start_delim_saved, end_delim_saved):
+ New global variables.
+ (do_delim): Handle `delim on' to restore previous start and end
+ delimiters.
+
+ * src/preproc/eqn/eqn.man, NEWS: Document it.
+
+2013-01-02 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ [gropdf] Various minor fixes.
+
+ * src/devices/gropdf/gropdf (do_x) <'X'> <'pdfpic'>: Using
+
+ \X'pdf: pdfpic'
+
+ with a zero width now works correctly.
+
+ (LoadPDF): Scale width in proportion to given height.
+
+ (do_s): In some circumstances a font size change is emitted before
+ current font is established. Fix handles this situation.
+
+2012-12-30 Werner LEMBERG <wl@gnu.org>
+
+Version 1.22.1 released
+=======================
+
+ Due to CVE-2012-3386, ftp.gnu.org rejected uploading of version
+ 1.22 -- in other words, 1.22 has never been released.
+
+ * NEWS, REVISION, doc/groff.texinfo, doc/webpage.ms: Updated.
+
+ * Makefile.in (NOMAKEDIRS): Updated.
+
+2012-12-30 Werner LEMBERG <wl@gnu.org>
+
+ * src/libs/gnulib/*: Update `gnulib' files.
+
+ Because we currently don't support `gnulib-tool' directly but add
+ everything to the CVS repository, and many internal details of the
+ gnulib setup has changed, it is necessary to do redo the import.
+
+ . Temporarily rename `src/libs/gnulib' to `src/libs/gnulib.old'.
+
+ . Call
+
+ gnulib-tool --create-testdir \
+ --dir=src/libs/gnulib \
+ wcwidth
+
+ . Manually move directories `src/libs/gnulib/gl{lib,m4}' to
+ `src/libs/gnulib/{lib,m4}', and do `s/gllib/lib/' and `s/glm4/m4/'
+ in all files to `convert' the gnulib testbed to a standard gnulib
+ configuration as maintained by gnulib-tool. Additionally, remove
+ the directory `src/libs/gnulib/gltests' and the references to
+ `gltests' in all files.
+
+ (All of this could be done with a script, but I hope that this is
+ eventually replaced with migrating groff as a whole to gnulib and
+ its setup).
+
+ . Call
+
+ gnulib-tool --add-import \
+ --dir=src/libs/gnulib \
+ wcwidth
+
+ to update everything.
+
+ . Merge the changed, new, and deleted files into `gnulib.old',
+ delete `gnulib', rename `gnulib.old' to `gnulib', then commit.
+
+2012-12-28 Werner LEMBERG <wl@gnu.org>
+
+ [doc] More documentation generation rules.
+
+ * doc/Makefile.in (.texinfo.txt): New rule.
+ (.texinfo.html): Use `LANG='.
+ (split-html): New target.
+
+2012-12-28 Werner LEMBERG <wl@gnu.org>
+
+ * doc/fixinfo.sh: Make it work with makinfo 4.13 also.
+
+2012-12-28 Werner LEMBERG <wl@gnu.org>
+
+ Split ChangeLog.
+
+ * ChangeLog: Split off older entries into...
+ * ChangeLog.121: this new file.
+
+2012-12-28 Werner LEMBERG <wl@gnu.org>
+
+Version 1.22 released
+=====================
+
+ * NEWS, VERSION, doc/groff.texinfo, doc/webpage.ms: Updated.
+
+ * config.guess, config.sub: Updated from `config' repository.
+
+ * INSTALL.gen: Updated from `gnulib' repository (file `INSTALL').
+
+ * aclocal.m4, configure: Regenerated.
+
+ * doc/texinfo.tex: Updated from `texinfo' repository.
+
+ * src/roff/groff/groff.cpp (main) <'v'>: Update copyright year.
+
+2012-12-27 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ * man/groff_font.man: Typographical improvements and typos.
+
+2012-12-27 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ * man/ditroff.man: Typographical improvements and typos.
+
+2012-12-18 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ * man/groff_diff.man: Typographical improvements and typos.
+
+2012-12-16 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ * man/groff.man: Typographical improvements (and one typo).
+ * man/groff_char.man: Typographical improvements.
+
+2012-10-17 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ * src/devices/gropdf/gropdf.pl (do_D): The command \D't N' moves
+ horizontal position by 'N'. gropdf now obeys this rule.
+ (do_t): Fixed kerning issue where width of non-kerned text could
+ be wrongly calculated using previous kern factor.
+
+2012-09-21 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Improve documentation of `.ad'.
+
+2012-09-20 Werner LEMBERG <wl@gnu.org>
+
+ * doc/Makefile.sub (uninstall_sub): Fix removal of info files.
+
+2012-09-20 Werner LEMBERG <wl@gnu.org>
+
+ Simplify environment handling.
+
+ Suggested by Ivan Shmakov <oneingray@gmail.com>.
+
+ * doc/Makefile.in, doc/Makefile.sub (GROFF): Don't use export.
+
+2012-09-20 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ [gropdf] Various minor fixes.
+
+ * font/devpdf/Foundry.in: Add font path to debian `gsfonts'
+ package.
+
+ * font/devpdf/util/BuildFoundries.pl: Handle missing fonts in a
+ more sane way, do NOT abort the complete make run!
+
+ * src/devices/gropdf/gropdf: Accept papersize names (i.e. A4) as
+ either upper or lower case. The -p (papersize) option should be
+ length,width (currently reversed - width,length)
+
+ * src/devices/gropdf/pdfmom.pl: Support use of GROFF_BIN_PATH.
+
+2012-09-11 Ralph Corderoy <ralph@inputplus.co.uk>
+ Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/tbl/tbl.man: Better document `d' column specifier.
+
+2012-08-31 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ Add `pdfmom' to handle mom documents with gropdf.
+
+ * Makefile.in (OTHERDIRS): Move contrib/mom to be run after
+ devices/gropdf.
+
+ * src/devices/gropdf/gropdf.pl: Various fixes:
+
+ . Correct image scaling issue.
+ . Handle relative horizontal movement 'h' followed by absolute
+ vertical movement 'V'.
+ . Correct handling of track kerning.
+
+ * src/devices/gropdf/pdfmom.pl: New wrapper for mom (pdfmom)
+ using gropdf or grops driver.
+ * src/devices/gropdf/pdfmom.man: New man page.
+ * src/devices/gropdf/Makefile.sub: Updated to handle new files.
+
+2012-08-31 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ * Makefile.in (OTHERDIRS): Move contrib/mom to be run after
+ devices/gropdf.
+
+ * src/devices/gropdf/gropdf.pl: Various fixes:
+
+ . Correct image scaling issue.
+ . Handle relative horizontal movement 'h' followed by absolute
+ vertical movement 'V'.
+ . Correct handling of track kerning.
+
+ * src/devices/gropdf/pdfmom.pl: New wrapper for mom (pdfmom)
+ using gropdf or grops driver.
+ * src/devices/gropdf/pdfmom.man: New man page.
+ * src/devices/gropdf/Makefile.sub: Updated to handle new files.
+
+2012-08-31 Julien Moutinho <julm+groff@autogeree.net>
+
+ * tmac/www.tmac (www-push-li): Fix indentation.
+
+ See
+
+ http://lists.gnu.org/archive/html/bug-groff/2012-08/msg00009.html
+
+ for the full report.
+
+2012-08-08 Eric S. Raymond <esr@thyrsus.com>
+
+ TBLization, as discussed on the list. There's a rewrite of
+ this file in planning, but this gets the content clean for now.
+
+ * tmac/groff_mdoc.man: In this file.
+
+2012-08-09 Werner LEMBERG <wl@gnu.org>
+
+ Provide proper Unicode mapping from and to dotless j.
+
+ * src/libs/libgroff/glyphuni.cpp (glyph_to_unicode_list),
+ src/libs/libgroff/uniglyph.cpp (unicode_to_glyph_list): Add it.
+
+2012-08-08 Eric S. Raymond <esr@thyrsus.com>
+
+ Added Unicode code point for dotless j.
+
+ * man/groff_char.man: In this file.
+
+2012-08-08 Werner LEMBERG <wl@gnu.org>
+
+ * man/groff_char.man: Clean-ups.
+
+2012-08-08 Eric S. Raymond <esr@thyrsus.com>
+
+ Elimination of nasty presentation-level macro tangles makes
+ structural translation to XML possible.
+
+ * man/groff_char.man: Clean up the mess, use real TBL tables.
+
+2012-07-23 Eric S. Raymond <esr@thyrsus.com>
+
+ More elimination of low-level troff hackery in the documentation
+ so it can be lifted to structural markup.
+
+ * tmac/groff_me.man: Use TBL rather than wacky diversions and .ti
+ requests.
+
+2012-07-24 Werner LEMBERG <wl@gnu.org>
+
+ Fix appearance of groff.texinfo's HTML output.
+
+ Cartouches within an `example' environment don't work.
+
+ * doc/groff.texinfo (CartoucheExample, endCartoucheExample): New
+ macros. Use them where appropriate.
+
+2012-07-17 Ingo Schwarze <schwarze@usta.de>
+
+ [mdoc] Make `Fl' correctly restore fonts.
+
+ * tmac/doc.tmac (doc-flag-recursion): Do it.
+
+2012-07-07 Eric S. Raymond <esr@thyrsus.com>
+
+ * src/preproc/eqn/eqn.man, src/preproc/grn/grnn.man,
+ src/devices/grodvi/grodvi.man, src/devices/grolj4/grolj4.man,
+ src/devices/grops/grops.man, src/utils/lkbib/lkbib.man,
+ src/utils/indxbib/indxbib.man, src/utils/tfmtodit/tfmtodit.man,
+ src/utils/xtotroff/xtotroff.man:
+ Remove running text in the synopses of various manual pages,
+ as it badly screws up attempts to mechanically parse them.
+
+ * contrib/mom/groff_mom.man: Use .URL rather than .UR/.UE, as this
+ is now preferred for manual pages.
+
+2012-07-03 Werner LEMBERG <wl@gnu.org>
+
+ Fix Unicode mapping of Greek stroked and curly phi.
+
+ Problem reported by Alkis Georgopoulos <alkisg@gmail.com>;
+ see
+
+ https://bugs.launchpad.net/ubuntu/+source/groff/+bug/1008115
+
+ * src/libs/libgroff/uniglyph.cpp (unicode_to_glyph_list): Flip
+ values of U+03C6 and U+03D5.
+
+2012-06-13 Deri James <deri@chuzzlewit.demon.co.uk>
+
+ * src/devices/gropdf/gropdf.pl: When using variable page
+ sizes (with \X'papersize ...') ensure final page is correct
+ size.
+
+2012-05-24 Werner LEMBERG <wl@gnu.org>
+
+ * src/roff/grog/grog.pl (process): Fix .so handling.
+
+ This does the same as the previous commit.
+
+2012-05-24 Denis M. Wilson <dmw@oxytropis.plus.com>
+
+ * src/roff/grog/grog.sh: Fix .so handling.
+
+ See
+
+ http://lists.gnu.org/archive/html/bug-groff/2012-05/msg00000.html
+
+ for the report and the bug fix.
+
+2012-05-24 Ivan Shmakov <oneingray@gmail.com>
+
+ Add some generic fallback characters.
+
+ * tmac/fallbacks.tmac: New file.
+ * tmac/troffrc: Include it.
+ * tmac/Makefile.sub (NORMALFILES): Include it.
+
+2012-05-20 Deri James <deri@chuzzlewit.demon.co.uk>
+
+ * doc/groff.texinfo: Add extra info about `.asciify'.
+ Document new gropdf options -u and -s.
+
+ * src/devices/gropdf/gropdf.man: Remove references to Type 42
+ fonts, they do not work in PDFs.
+
+ Document new option -s which adds `statistics' line to end of PDF
+ file showing number of pages in document. This has always been
+ the default behaviour (to add this line), all other software seems
+ to ignore it as intended, but `gs' sometimes complains, so the
+ default is now to omit the statistics.
+
+ Document new option -u[cmapfilename] to allow a user ToUnicode
+ CMap instead of gropdf's default. If no `cmapfilename' given then
+ do not include any ToUnicode CMap.
+
+ * src/devices/gropdf/gropdf.pl <top>: Allow `bundled' flags on
+ command line (i.e. -de = -d -e).
+
+ Use $RT_SEP as multi path separator, not hard coded `:'. Update
+ all users.
+
+ New flags -u and -s. Once a custom papersize has been set as
+ \X'papersize x,y' make it sticky so all following pages use custom
+ size. When importing pdf with \X'pdf: pdfpic ...' do not compress
+ objects which are already compressed! This caused problems with
+ PDFs created with ImageMagick, now fixed.
+
+ (IsText, PutLine, do_t): The troff `u' command can contain a
+ kerning adjustment number, this was not being handled, now fixed.
+
+ (do_c): The troff `c' command was not being handled correctly, now
+ fixed.
+ (FindChar, RemapChr, do_N): Handle fonts with more than 255 glyphs.
+ ($ucmap): Define CMap ToUnicode to convert ligatures
+ (fl,fi,ff,ffl,ffi) back to individual characters, useful for
+ cut'n'paste and text searching.
+ (LoadFont): Handle it.
+ (ToPoints, GetPoints): Handle `z' unit.
+ (do_x, FixPDFColour, PutHotSpot): Allow Annotation colour to be
+ groff colour, i.e. 0-65535 *3, or #rrggbb, or #rrrrbbbbgggg.
+ (do_p):The papersize width/length in switch -p were reversed,
+ corrected.
+
+ * src/devices/gropdf/Makefile.sub (gropdf): Use $RT_SEP.
+ Use $fontpath rather than $fontdir (this ensures site-font is
+ included in searches).
+
+ * tmac/pdf.tmac (PDFBOOKMARK.VIEW, PDFHREF.VIEW, PDFPAGE.Y): Fix
+ strings.
+ (pdfbookmark): Correct handling of bookmark levels.
+ Convert \[em] to hyphen in bookmarks
+
+ Rather use -N than -T for "named" bookmarks (-T already used for
+ "tag" in pdfmark.tmac)
+
+ (.pdfclean): New macro which attempts to asciify bookmark text.
+ (.pdfpagename): New wrapper macro for \X'pdf: pagename'.
+ (.pdfswitchtopage): New wrapper macro for \X'pdf: switchtopage'.
+
+2012-03-10 Werner LEMBERG <wl@gnu.org>
+
+ Fix compiler warnings.
+
+ * src/preproc/html/pre-html.cpp (alterDeviceTo): Avoid ambiguous
+ if-else clause.
+
+ * src/preproc/grn/main.cpp (sccsid): Comment out.
+
+ * src/roff/troff/number.cpp (parse_expr) <case '*'>: Add cast.
+
+ * src/devices/xditview/Makefile.sub (EXTRA_CFLAGS): Add `-Dlint'
+ so that unused static ID arrays don't cause a warning.
+
+ (Some) problems reported by Bjarni Ingi Gislason
+ <bjarniig@rhi.hi.is>.
+
+2012-03-05 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/an-ext.tmac (SY): Handle argument with spaces correctly.
+
+ Problem reported by Bjarni Ingi Gislason <bjarniig@rhi.hi.is>.
+
+2012-03-01 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ [an-old] Fix warnings.
+
+ * tmac/an-old.tmac (an-init): Insert missing braces.
+
+2012-02-26 Werner LEMBERG <wl@gnu.org>
+
+ Update configuration files from `gnulib' and `config' repositories.
+
+ This also fixes a problem with `iconv' on Solaris 10, as reported
+ in
+
+ http://lists.gnu.org/archive/html/bug-groff/2012-02/msg00007.html
+
+ * configure.ac: Call `gl_LOCALCHARSET.
+ Call `AM_ICONV' as C++.
+
+ * config.guess, config.rpath, config.sub, install-sh, mkinstalldir:
+ Updated.
+
+ * m4/codeset.m4, m4/glib21.m4, m4/iconv.m4, m4/lib-ld.m4,
+ m4/lib-link.m4, m4/lib-prefix.m4: Updated.
+ * m4/fcntl-o.m4, m4/localcharset.m4: New files.
+
+ * Makefile.in: Updated.
+
+ * src/include/localcharset.h, src/libs/libgroff/config.charset,
+ src/libs/libgroff/localcharset.c: Updated.
+
+ * aclocal.m4, configure, src/include/config.hin: Regenerated.
+
+2012-02-20 Werner LEMBERG <wl@gnu.org>
+
+ Update `gnulib' files.
+
+ The invocation was
+
+ gnulib-tool --add-import \
+ --dir=src/libs/gnulib \
+ wcwidth
+
+ Additionally, src/libs/gnulib/configure.ac was adjusted from a
+ `test' run as described in the change from 2010-12-13.
+
+ * src/libs/gnulib/*: Updated.
+
+2012-02-15 Deri James <deri@chuzzlewit.demon.co.uk>
+
+ [gropdf] Fixes and omissions.
+
+ * src/devices/gropdf/gropdf.pl (<top>, do_u): Add facility to
+ handle track kerning (.tkf).
+
+ (do_x, do_p, do_t): If pages are reordered using `pagename' and
+ `switchtopage' keep track of outline bookmarks.
+ (do_x): Handle multiple files on gropdf command line, stitch
+ multiple groff_out files together. In the main read loop any argc
+ values not consumed by options are taken as input files and
+ processed in order. What prevented it working properly before is
+ the way an `x i' (initialize) record has been handled. It now
+ processes the initialization code only in the first file.
+
+ (PutHotSpot): Allow user to control size of hotspot bounding box
+ on clickable links by setting PDFHREF.LEADING
+
+ * tmac/pdf.tmac (PDFHREF.LEADING): Adjust value.
+ (pdf*href): Pass value of PDFHREF.LEADING to gropdf.
+
+2012-02-10 Deri James <deri@chuzzlewit.demon.co.uk>
+
+ [gropdf] Fix compatibility issues with pdfmark.
+
+ * tmac/pdf.tmac (PDFHREF.VIEW.LEADING): Fix value.
+ (pdf:href.opt-X): Add check for -X option for .pdfhref.
+
+2012-02-08 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/pic/main.cpp (do_file): Check for invalid characters.
+
+ Problem reported by Doug McIlroy <doug@cs.dartmouth.edu>.
+
+2012-01-25 Ingo Schwarze <schwarze@usta.de>
+
+ [mdoc] * tmac/doc-syms: Fix meaning of XBD acronym.
+
+2012-01-25 Tadziu Hoffmann <hoffmann@usm.uni-muenchen.de>
+
+ * tmac/e.tmac (bl): Make it work inside blocks.
+
+ See threads starting with
+
+ http://lists.gnu.org/archive/html/groff/2011-12/msg00055.html
+ http://lists.gnu.org/archive/html/groff/2012-01/msg00000.html
+
+2012-01-10 Bruno Haible <bruno@clisp.org>
+
+ Fix handling of MAKEFLAGS variable.
+
+ * Makefile.in (MAKE_K_FLAGS): Improved definition,
+ as explained and discussed in
+
+ http://lists.gnu.org/archive/html/groff/2012-01/msg00039.html
+
+2012-01-03 Ingo Schwarze <schwarze@usta.de>
+
+ Improve parallel builds.
+
+ Some hdtbl and mom examples want PostScript formatting which
+ requires the `DESC' file to be ready; however, the top-level
+ `Makefile.in' doesn't currently enforce the proper order of
+ building of `font/dev' before `contrib/hdtbl', `contrib/mom', and
+ so on.
+
+ Given that `font/dev' and the contrib examples are in different
+ child processes of the recursive make system, it doesn't seem
+ possible to solve this using clean Makefile dependencies. We now
+ enforce the order by splitting the shell command invoking
+ recursive make in the top level `Makefile.in'.
+
+ * Makefile.in (ALLDIRS): Remove `OTHERDIRS'.
+ (dodirs): Updated.
+ (`$(TARGETS)'): Handle `OTHERDIRS' separately.
+
+2012-01-03 Kristaps Dzonsons <kristaps@bsd.lv>
+
+ [mdoc] Add `-isoC-2011'.
+
+ * tmac/doc-syms (doc-str-St--isoC-2011): Add it.
+ * tmac/groff_mdoc.man: Document it.
+
+2011-12-26 Deri James <deri@chuzzlewit.demon.co.uk>
+
+ * font/devpdf/Makefile.sub: Only build fonts on first `make'.
+
+2011-12-08 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo (.tl): Improve documentation.
+ Wording suggested by Keith Marshall
+ <keithmarshall@users.sourceforge.net>.
+
+2011-12-01 Werner LEMBERG <wl@gnu.org>
+
+ [me] Fix behaviour of centered block.
+ Problem and possible fix reported in thread starting at
+
+ http://lists.gnu.org/archive/html/groff/2011-11/msg00002.html
+
+ * tmac/e.tmac (`(c'): Always start with a new line.
+
+2011-12-01 Ingo Schwarze <schwarze@usta.de>
+
+ [man] Print volume headers like mdoc.
+
+ * tmac/an-old.tmac (an-init): Add default volume name if fifth
+ argument to `.TH' is missing.
+
+2011-11-22 Werner LEMBERG <wl@gnu.org>
+
+ * tmac/groff_man.man: Minor documentation improvements.
+ Suggested by Jeff Conrad <jeff_conrad@msn.com>.
+
+2011-11-14 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Improve doc for calling undefined identifiers.
+
+2011-11-14 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/tbl/tbl.man: Improve documentation of `_' and
+ friends.
+
+2011-10-31 Werner LEMBERG <wl@gnu.org>
+
+ Fix compiler warnings.
+
+ * src/preproc/eqn/main.cpp (do_file), src/roff/troff/env.cpp
+ (environment::print_env), src/roff/troff/mtsm.cpp
+ (statem::display_state): Add syntactical sugar.
+
+ * src/utils/tfmtodit/tfmtodit.cpp (char_info_word): Use `unsigned
+ char' for all members.
+
+ * src/devices/grohtml/html-text.cpp (html_text::remove_def):
+ Remove unused variable `q'.
+
+ * src/devices/grohtml/post-html.cpp
+ (html_printer::lookahead_for_tables): Remove unused variable `left'
+ and `seen_text'.
+
+2011-10-23 Ingo Schwarze <schwarze@openbsd.org>
+
+ [mdoc] Synchronize string tables with the mandoc(1) utility.
+
+ * tmac/doc-common: Add many architecture names used in NetBSD and
+ OpenBSD (and "arm" from FreeBSD) and remove the duplicate OS
+ version entry for Darwin-10.6.0.
+
+ * tmac/doc-syms: Add many library names used in NetBSD and FreeBSD.
+
+ * tmac/groff_mdoc.man: Document all supported architecture names)
+ (OS versions, and library names.
+
+2011-09-11 Joseph Koshy <jkoshy@users.sourceforge.net>
+
+ [mdoc] Add some library strings.
+
+ * tmac/doc-syms: Add `libdwarf' and `libelf'.
+ * tmac/groff_mdoc.man: Document them.
+
+2011-08-14 Deri James <deri@chuzzlewit.demon.co.uk>
+
+ [gropdf] More minor fixes.
+
+ * font/devpdf/Makefile.sub (MOSTLYCLEANADD): Don't attempt to
+ install 'util/BuildFoundries', only used in 'make'.
+
+ * src/devices/gropdf/gropdf.pl (<top>, GetType1): Make STDOUT and
+ any font files read to be accessed in binary rather than text mode.
+ Prevents errors when running on systems set up for UTF-8.
+
+2011-08-10 Deri James <deri@chuzzlewit.demon.co.uk>
+
+ [gropdf] Minor updates and fixes.
+
+ * src/devices/gropdf/gropdf.pl: Change command line option `-fy'
+ to `-y' for consistency.
+
+ Better support for Windows platform.
+ (do_x): Handle keywords `pagename' and `switchtopage'.
+
+ * doc/groff.texinfo, src/devices/gropdf/gropdf.man: Updated.
+
+ * font/devpdf/Foundry: Renamed to...
+ * font/devpdf/Foundry.in: This.
+ Add default alias font names.
+
+ * font/devpdf/util/BuildFoundries.pl: This is now an installation
+ helper script and gets not longer installed.
+ Support alternative font file names (separated with `!').
+
+ * font/devpdf/Makefile.sub: Fixes to work with a separate build
+ directory.
+ Font files are now build at `make' time; this makes `test-groff'
+ work with -Tpdf.
+
+ * font/devpdf/util/Makefile.sub: Removed.
+
+ * Makefile.in (DEVDIRS, OTHERDIRS, EXTRADIRS): Handle devpdf
+ specially.
+
+2011-07-29 Daiki Ueno <ueno@unixuser.org>
+
+ Fix cross building. Problem reported by Christophe Jarry
+ <christophe.jarry@ouvaton.org>.
+
+ * Makefile.in ($GNULIBDIRS): Pass original config arguments to
+ src/libs/gnulib/configure.
+
+2011-06-25 Deri James <deri@chuzzlewit.demon.co.uk>
+
+ Add new output device `gropdf'.
+
+ * font/devpdf/*: New device files for gropdf.
+ * src/devices/gropdf/*: New device.
+
+ * Makefile.comm (install_dev, uninstall_dev): Handle more
+ subdirectories.
+ * Makefile.in (DEVDIRS, OTHERDIRS, EXTRADIRS): Add directories
+ related to gropdf.
+ * MANIFEST: Updated.
+ * test-groff.in (GROFF_BIN_PATH): Updated.
+
+ * tmac/Makefile.sub (NORMALFILES): Updated.
+ * tmac/pdf.tmac: New file.
+ * tmac/troffrc: Updated.
+
+ * doc/groff.texinfo: Document it.
+ * doc/Makefile.in, doc/Makefile.sub (groff_bin_dirs): Updated.
+ * doc/pic.ms: Updated.
+
+ * man/groff_out.man, src/devices/grops/grops.man,
+ src/preproc/pic/pic.man, src/roff/groff/groff.man,
+ src/utils/afmtodit/afmtodit.man, src/utils/pfbtops/pfbtops.man:
+ Updated.
+
+ * contrib/pdfmark/pdfmark.ms: Updated.
+
+2011-07-20 George HELFFRICH <ghfbsd@gmail.com>
+
+ Improve line numbering support in tbl and with me macros.
+
+ * tmac/e.tmac (n1, n2, TH, PS): Implement it.
+ (@h, @n, @o, @t, @k, )b, (c, (q, )q, (l, )l, (f, @q, PE): Updated.
+ * doc/meref.me: Document changes.
+
+ * src/preproc/tbl/table.cpp (ROW_START_LINE_REG)
+ (ROW_SAVE_LINE_REG, ROW_MAX_LINE_REG, REPEATED_NM_SET_MACRO)
+ (REPEATED_NM_SUS_MACRO): New macros.
+
+ (table::init_output): Define REPEATED_NM_SET_MACRO and
+ REPEATED_NM_SUS_MACRO.
+ (table::print_single_hline, table::print_double_hline,
+ table::define_bottom_macro, table::do_row, table::do_top,
+ table::do_bottom): Updated.
+
+ * doc/webpage.ms: Updated.
+
+2011-07-12 Ted Harding <ted.harding@wlandres.net>
+ Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/tbl/tbl.man: Mention trick to get abutting rules.
+
+2011-07-03 Ben Laurie <benl@FreeBSD.org>
+
+ Fix clang warnings.
+
+ * src/libs/libdriver/input.cpp (odd): Use parentheses.
+
+ * src/roff/troff/mtsm.cpp (state_set::is_in): Fix parentheses;
+ previous code always tested for bit 0.
+
+2011-07-03 Guillem Jover <guillem@debian.org>
+
+ mdoc: Update more OS versions strings.
+
+ * tmac/doc-common: Add versions strings for NetBSD, OpenBSD,
+ FreeBSD, and DragonFly.
+
+2011-04-08 Michail Vidiassov <master@iaas.msu.ru>
+
+ mdoc: Update various strings related to Mac OS X and FreeBSD.
+
+ * tmac/doc-common: Add strings for FreeBSD 8.2 and Darwin 9.7-11.0.
+ * tmac/doc-syms: Add strings -lbsm and -lSystem.
+
+2011-03-29 Christian Weisgerber <naddy@mips.inka.de>
+
+ Fix compilation issues with gcc 2.95.
+
+ * src/roff/troff/input.cpp (my_input_iterator): Define as an alias
+ for `input_iterator' which is predefined by an old libstdc++.
+
+2011-03-29 Ingo Schwarze <schwarze@usta.de>
+
+ Add another POSIX standard.
+
+ * tmac/doc-syms: Add POSIX 1003.1b.
+
+2011-03-29 Christian Weisgerber <naddy@mips.inka.de>
+
+ Fix build with non-GNU make.
+
+ * Makefile.in ($TARGETS): We must not pass `$MDEFINES' recursively
+ down to the sub-makes started in src/libs/gnulib, because that
+ directory has its own values for `$top_srcdir' etc., and
+ overriding those from the command line will cause the build to
+ fail. Currently, `$MAKEOVERRIDES' will prevent the recursive
+ passing of those overrides with GNU make, but not with other
+ make(1) implementations. It looks like all targets that require
+ `$MDEFINES' set them explicitly anyway, so we shouldn't need to
+ set `$MDEFINES' on the top level.
+
+2011-03-21 Jan Vcelak <jvcelak@redhat.com>
+ Bernd Warken <groff-bernd.warken-72@web.de>
+
+ [groffer] Remove hardcoded path to 'libdir/groff/groffer'
+ directory.
+
+ * configure.ac: add GROFFERDIR variables.
+
+ * Makefile.in: add and handle variable groffer_dir
+
+ * m4/groff.m4: set up the --with-grofferdir command line option.
+
+2011-03-18 Werner LEMBERG <wl@gnu.org>
+
+ [troff] Improve error message.
+
+ * src/roff/troff/input.cc (token::delimiter): Improve error
+ message. Suggested by Doug McIlroy <doug@cs.dartmouth.edu>.
+
+2011-03-04 Werner LEMBERG <wl@gnu.org>
+
+ [mdoc] Within .An, .Aq, .Ao, and .Ac now use `<' and `>'.
+ Problem reported by Ulrich Spörlein <uqs@spoerlein.net>
+
+ * tmac/doc.tmac (Aq, Ao, Ac): Implement it to follow RFC 822 and
+ RFC 2822.
+
+2011-02-14 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Add another example for .em request
+ Based on a patch from Anton Shepelev <anton.txt@gmail.com>.
+
+2011-01-31 Werner LEMBERG <wl@gnu.org>
+
+ More fixes for Savannah bug #32301.
+
+ * src/devices/grops/Makefile.sub (XLIBS),
+ src/devices/grodvi/Makefile.sub, src/devices/grolj4/Makefile.sub,
+ src/devices/grohtml/Makefile.sub, src/devices/grolbp/Makefile.sub:
+ Add $(LIBGNU).
+
+2011-01-31 Werner LEMBERG <wl@gnu.org>
+
+ Fix Savannah bug #32301.
+
+ * src/roff/groff/Makefile.sub (XLIBS),
+ src/preproc/grn/Makefile.sub, src/preproc/html/Makefile.sub: Add
+ $(LIBGNU).
+
+2011-01-29 Krzysztof Żelechowski <giecrilj@stegny.2a.pl>
+
+ * doc/groff.texinfo: Complete documentation on output devices.
+
+2011-01-28 Werner LEMBERG <wl@gnu.org>
+
+ Handle `refer*.tmac'.
+
+ * tmac/Makefile.sub (NORMALFILES): Add `refer*.tmac'.
+ * tmac/refer-mm.tmac: Moved to contrib/mm.
+
+2011-01-28 Werner LEMBERG <wl@gnu.org>
+
+ Improve `refer' support of -me.
+
+ * tmac/refer.tmac, tmac/refer-me.tmac, tmac/refer-ms.tmac,
+ tmac/refer-mm.tmac: New files. The code in refer.tmac is
+ based on the old code from `s.tmac'.
+
+ * tmac/s.tmac: Remove direct refer support and include
+ `refer-ms.tmac' instead.
+ * tmac/e.tmac: Remove direct refer support and include
+ `refer-me.tmac' instead.
+
+ * NEWS: Updated.
+
+2011-01-22 Werner LEMBERG <wl@gnu.org>
+
+ [groff.texinfo]: Updates.
+
+ * doc/groff.texinfo: Document groff's `-j' option.
+ Add dummy section for `chem' preprocessor.
+
+2011-01-22 Werner LEMBERG <wl@gnu.org>
+
+ Update `grog'.
+
+ * src/roff/grog/{groff.sh,groff.pl}: `groff' now calls `pic'
+ automatically if `grap' or `chem' is used.
+ `chem' has been folded into `groff'.
+ * src/roff/grog/grog.man: Updated.
+
+2011-01-22 Werner LEMBERG <wl@gnu.org>
+
+ Make `groff -G' imply `-p'.
+
+ * src/roff/groff/groff.cpp (main): Implement it.
+ * src/roff/groff/groff.man: Updated.
+
+2011-01-22 Werner LEMBERG <wl@gnu.org>
+
+ Integrate `chem' into `groff' (new option -j).
+
+ * src/roff/groff/groff.cpp (CHEM_INDEX): New constant.
+ (main) ['j']: Add `chem'.
+ (synopsis, help): Updated.
+ * src/roff/troff/pipeline.h (MAX_COMMANDS): Increase to 14.
+
+ * src/roff/groff/groff.man: Document new command line option.
+ * NEWS: Updated.
+
+2011-01-22 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: `chem' is now part of groff.
+
+2011-01-22 Werner LEMBERG <wl@gnu.org>
+
+ * doc/groff.texinfo: Improve description of `.de'.
+
+ Based on suggestions by Ted Harding and Deri James.
+
+2011-01-20 Colin Watson <cjwatson@debian.org>
+
+ Fix handling of wide characters in no-SGR mode.
+
+ * src/devices/grotty/tty.cpp (tty_printer::make_underline): Only
+ emit a single backspace in no-SGR mode. less (at least)
+ backspaces over a character at a time.
+ (tty_printer::make_bold): Likewise.
+
+2011-01-19 Werner LEMBERG <wl@gnu.org>
+
+ * src/preproc/pic/pic.man: Add pic manual to `SEE ALSO' section.
+
+2011-01-14 Werner LEMBERG <wl@gnu.org>
+
+ Split ChangeLog.
+
+ * ChangeLog: Split off older entries into...
+ * ChangeLog.119, ChangeLog.120: these new files.
+
+2011-01-15 Colin Watson <cjwatson@debian.org>
+
+ * Makefile.comm (INCLUDES): Fix typo.
+
+2011-01-05 Werner LEMBERG <wl@gnu.org>
+
+ * doc/webpage.ms: Fix rendering of title image.
+
+
+________________________________________________________________________
+
+##### License
+
+Copyright 2011-2018 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+
+##### Editor settings
+Local Variables:
+fill-column: 72
+mode: change-log
+version-control: never
+End:
+vim:set autoindent textwidth=72:
diff --git a/FDL b/FDL
new file mode 100644
index 0000000..2f7e03c
--- /dev/null
+++ b/FDL
@@ -0,0 +1,451 @@
+
+ GNU Free Documentation License
+ Version 1.3, 3 November 2008
+
+
+ Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+ <http://fsf.org/>
+ 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.
+
+The "publisher" means any person or entity that distributes copies of
+the Document to the public.
+
+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 under this License. Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+
+
+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. If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy's public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+
+11. RELICENSING
+
+"Massive Multiauthor Collaboration Site" (or "MMC Site") means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works. A
+public wiki that anybody can edit is an example of such a server. A
+"Massive Multiauthor Collaboration" (or "MMC") contained in the site
+means any set of copyrightable works thus published on the MMC site.
+
+"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+
+"Incorporate" means to publish or republish a Document, in whole or in
+part, as part of another Document.
+
+An MMC is "eligible for relicensing" if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole or
+in part into the MMC, (1) had no cover texts or invariant sections, and
+(2) were thus incorporated prior to November 1, 2008.
+
+The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+
+
+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.3
+ 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/FOR-RELEASE b/FOR-RELEASE
new file mode 100644
index 0000000..592a48f
--- /dev/null
+++ b/FOR-RELEASE
@@ -0,0 +1,58 @@
+ Copyright 2013-2022 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+This file describes how to prepare 'groff' for a new release.
+
+
+########################################################################
+
+* Update font description files that we generate from external data and
+ provide with our source distribution.
+
+ Directory Format Tool
+ --------- ------ ----
+ devX* X11 core/server font xtotroff
+
+ The make(1) target "maintainer-font-descriptions" produces these font
+ descriptions.
+
+* Retrieve current versions of UnicodeData.txt[1] and the Adobe Glyph
+ List (AGL)[2], and use them with
+ src/utils/afmtodit/make-afmtodit-tables to update
+ src/utils/afmtodit/afmtodit.tables.
+
+ [1] E.g., <https://www.unicode.org/Public/15.0.0/ucd/UnicodeData.txt>.
+ Check for the latest _released_ version of Unicode at the time.
+ Data for the forthcoming release may be available.
+ [2] <https://github.com/adobe-type-tools/agl-aglfn/blob/master/\
+ glyphlist.txt>
+
+ (<https://raw.githubusercontent.com/adobe-type-tools/agl-aglfn/\
+ master/glyphlist.txt> may be more convenient.)
+
+* Update the 'gnulib' sub-module to the latest version and the
+ corresponding required commit hash identifier in 'INSTALL.REPO'.
+
+* Update the release version number where it is hard-coded.
+ + NEWS
+ + BUG-REPORT
+ + arch/mingw/grap2graph.cmd
+ + doc/groff.texi (multiple occurrences)
+ + doc/webpage.ms
+
+* If the major or minor version number is being incremented, split off
+ a historical ChangeLog file and add it to `EXTRA_DIST` in Makefile.am.
+
+* Update in 'src/roff/groff/groff.cpp' the 'printf' that displays the
+ copyright.
+
+* Update the copyright year with 'update-copyright.sh'.
+
+* Increment the version number by tagging the release, beta, or release
+ candidate. groff requires an explicit three-part version,
+ major.minor.revision, due to the .Y register.
+
+ $ git tag 1.23.0.rc1
diff --git a/HACKING b/HACKING
new file mode 100644
index 0000000..6b6c449
--- /dev/null
+++ b/HACKING
@@ -0,0 +1,178 @@
+ Copyright 2022-2023 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without
+ modification, are permitted in any medium without royalty provided
+ the copyright notice and this notice are preserved.
+
+This file contains advice on developing and contributing to groff. It
+assumes that developers will install the 'git' revision control
+system and build groff using the instructions in 'INSTALL.repo'.
+Familiarize yourself with the structure of the source tree by studying
+its 'MANIFEST' file at the top level.
+
+Implementation languages
+------------------------
+
+Beyond what is said under "Dependencies" in 'INSTALL.extra',
+contributors should note that due to the age of the code base, much of
+the C++ dialect employed by groff components, while standard, is older
+than C++98--closer to Annotated Reference Manual C++ (Ellis, Stroustrup;
+Addison-Wesley, 1990). groff implements its own string class and the
+Standard Template Library is little used. A modest effort is underway
+to update the code to more idiomatic C++98. Where a C++11 feature
+promises to be advantageous, it may be annotated in a code comment.
+
+
+Automake
+--------
+
+A document explaining the basics of GNU Automake and its usage in groff
+is available in 'doc/automake.mom'; peruse a PDF rendering in
+'doc/automake.pdf' in your build tree.
+
+
+Testing
+-------
+
+Running the test suite with 'make check' after building any substantive
+change to groff logic is encouraged. You should certainly do so, and
+confirm that the tests pass, before submitting patches to the groff
+mailing list <groff@gnu.org> or Savannah issue tracker.
+
+If you find a defect in a test script, that can be reported via Savannah
+like any other bug.
+
+
+Documenting changes
+-------------------
+
+The groff project has a long history and a large, varied audience.
+Changes may need to be documented in up to three places depending on
+their impact.
+
+1. Changes should of course be documented in the Git commit message.
+ If a change alters only comments or formatting of source code, or
+ makes editorial changes to documentation, and does not resolve a
+ Savannah ticket, you can stop at that.
+
+2. The 'ChangeLog' file follows the format and practices documented in
+ the GNU Coding Standards.
+ https://www.gnu.org/prep/standards/html_node/Change-Logs.html
+
+ The sub-projects in the 'contrib' directory each have their own
+ dedicated ChangeLog files. The file specifications documented there
+ are relative to the sub-project, not the root of the groff source
+ tree. When converted to a commit message, add 'contrib/$SUBPROJECT'
+ to the entries.
+
+ Apart from 'contrib', groff uses a single (current) 'ChangeLog' file
+ for the rest of its source tree.
+
+ It is convenient to write the ChangeLog entry or entries first, then
+ construct a commit message from it (or them).
+
+3. The 'NEWS' file documents changes to groff that a user, not just a
+ developer, would notice, not including the resolution of defects.
+
+ As a hypothetical example, correcting a rendering error in tbl(1)
+ such that any table with more than 20 rows no longer had the text
+ "FOOBAR" spuriously added to some entries would not be a 'NEWS'
+ item, because the appearance of such text in the first place is a
+ surprising deviation from tbl's ideal and historical behavior. In
+ contrast, adding a command-line option to tbl, or changing the
+ meaning of its "expand" region option such that it no longer
+ horizontally compresses tables as well, _would_ be 'NEWS'-worthy.
+
+
+Writing Tests
+-------------
+
+Here are some portability notes on writing automated tests.
+
+* Write to the POSIX standard for the shell and utilities where
+ possible. Issue 4 from 1994 is old enough that no contemporary system
+ has a good reason for not conforming. A copy of the standard is
+ available at the Open Group's web site.
+ https://pubs.opengroup.org/onlinepubs/009656399/toc.pdf
+
+* The GNU coreutils "seq" command is handy but not standardized by
+ POSIX. Replace it with a while loop.
+
+ # emulate "seq 53"
+ n=1; while [ $n -le 53 ]; do echo $n; n=$(( n + 1 )); done; unset n
+
+* The "od" command on macOS can put extra space characters (i.e., spaces
+ that don't correspond to the input) at the ends of lines when using
+ the "od -t c" format; GNU od does not.
+
+ So a regex like this that works with GNU od:
+ grep -Eqx '0000000 +A +\\b +B +\\b +C D +\\n'
+ might need to be weakened to the following on macOS.
+ grep -Eqx '0000000 +A +\\b +B +\\b +C D +\\n *'
+
+* The "od" command on macOS does not respect the environment variable
+ assignment "LC_ALL=C" when processing byte values 127<x<256 decimal
+ and using the "character" output format (option "-t c"). An
+ alternative output must be used, like bytewise octal (option "-t o1").
+ (macOS od may be non-conforming here, despite the claim of its man
+ page. POSIX Issue 4 od's description says "The type specifier
+ character c specifies that bytes will be interpreted as characters
+ specified by the current setting of the LC_CTYPE locale category. ...
+ Other non-printable characters will be written as one three-digit
+ octal number for each byte in the character." (p. 538) The language
+ in Issue 7 (2018) appears unchanged.
+ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/od.html )
+
+* macOS sed requires semicolons after commands even if they are followed
+ immediately by a closing brace.
+
+ Rewrite
+ sed -n '/Foo\./{n;s/^$/FAILURE/;p}'
+ as follows.
+ sed -n '/Foo\./{n;s/^$/FAILURE/;p;}'
+
+ But see below regarding the opening braces.
+
+* POSIX doesn't say that sed has to accept semicolons as command
+ separators after label (':') and branch ('t') commands, or after brace
+ commands, so macOS sed doesn't. GNU sed does.
+
+ So rewrite tidy, compact sed scripts like this:
+ sed -n '/Foo\./{n;s/^$/FAILURE/;tA;s/.*/SUCCESS/;:A;p}'
+ as this more cumbersome alternative.
+ sed -n \
+ -e '/Foo\./{n;s/^$/FAILURE/;tA;' \
+ -e 's/.*/SUCCESS/;:A;' \
+ -e 'p;}')
+
+ But see below regarding the opening braces.
+
+ Similarly, a brace sequence like that in this partial sed script:
+ /f1/p}}}}}}
+ must be rewritten as follows (or with '-e' expressions).
+ /f1/p;}
+ }
+ }
+ }
+ }
+ }
+
+* macOS and GNU sed don't require newlines (or '-e' expression endings)
+ after _opening_ braces, but Solaris 11 sed does.
+
+ So the sed script
+ /i/{N;/Table of Contents/{N;/Foo[. ][. ]*1/p;};}
+ must be rewritten as follows (or with '-e' expressions).
+ /i/{
+ N;/Table of Contents/{
+ N;/Foo[. ][. ]*1/p;
+ };
+ }
+
+
+##### Editor settings
+Local Variables:
+fill-column: 72
+mode: text
+End:
+vim: set autoindent textwidth=72:
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..6e3904a
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,368 @@
+Installation Instructions
+*************************
+
+ Copyright © 1994–1996, 1999–2002, 2004–2017, 2020–2023 Free Software
+Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved. This file is offered as-is,
+without warranty of any kind.
+
+Basic Installation
+==================
+
+ Briefly, the shell command ‘./configure && make && make install’
+should configure, build, and install this package. The following
+more-detailed instructions are generic; see the ‘README’ file for
+instructions specific to this package. Some packages provide this
+‘INSTALL’ file but do not implement all of the features documented
+below. The lack of an optional feature in a given package is not
+necessarily a bug. More recommendations for GNU packages can be found
+in *note Makefile Conventions: (standards)Makefile Conventions.
+
+ 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 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.
+
+ Running ‘configure’ might take a while. 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, generally using the just-built uninstalled binaries.
+
+ 4. Type ‘make install’ to install the programs and any data files and
+ documentation. When installing into a prefix owned by root, it is
+ recommended that the package be configured and built as a regular
+ user, and only the ‘make install’ phase executed with root
+ privileges.
+
+ 5. Optionally, type ‘make installcheck’ to repeat any self-tests, but
+ this time using the binaries in their final installed location.
+ This target does not install anything. Running this target as a
+ regular user, particularly if the prior ‘make install’ required
+ root privileges, verifies that the installation completed
+ correctly.
+
+ 6. 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.
+
+ 7. Often, you can also type ‘make uninstall’ to remove the installed
+ files again. In practice, not all packages have tested that
+ uninstallation works correctly, even though it is required by the
+ GNU Coding Standards.
+
+ 8. Some packages, particularly those that use Automake, provide ‘make
+ distcheck’, which can by used by developers to test that all other
+ targets like ‘make install’ and ‘make uninstall’ work correctly.
+ This target is generally not run by end users.
+
+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=c99 CFLAGS=-g 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 can use 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 ‘..’. This is known
+as a “VPATH†build.
+
+ With a non-GNU ‘make’, it is safer 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.
+
+ On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types—known as “fat†or
+“universal†binaries—by specifying multiple ‘-arch’ options to the
+compiler but only a single ‘-arch’ option to the preprocessor. Like
+this:
+
+ ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CPP="gcc -E" CXXCPP="g++ -E"
+
+ This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the ‘lipo’ tool if you have problems.
+
+Installation Names
+==================
+
+ By default, ‘make install’ installs the package’s commands under
+‘/usr/local/bin’, include files under ‘/usr/local/include’, etc. You
+can specify an installation prefix other than ‘/usr/local’ by giving
+‘configure’ the option ‘--prefix=PREFIX’, where PREFIX must be an
+absolute file name.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+pass the option ‘--exec-prefix=PREFIX’ to ‘configure’, the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files 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. In general, the default
+for these options is expressed in terms of ‘${prefix}’, so that
+specifying just ‘--prefix’ will affect all of the other directory
+specifications that were not explicitly provided.
+
+ The most portable way to affect installation locations is to pass the
+correct locations to ‘configure’; however, many packages provide one or
+both of the following shortcuts of passing variable assignments to the
+‘make install’ command line to change installation locations without
+having to reconfigure or recompile.
+
+ The first method involves providing an override variable for each
+affected directory. For example, ‘make install
+prefix=/alternate/directory’ will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+‘${prefix}’. Any directories that were specified during ‘configure’,
+but not in terms of ‘${prefix}’, must each be overridden at install time
+for the entire installation to be relocated. The approach of makefile
+variable overrides for each directory variable is required by the GNU
+Coding Standards, and ideally causes no recompilation. However, some
+platforms have known limitations with the semantics of shared libraries
+that end up requiring recompilation when using this method, particularly
+noticeable in packages that use GNU Libtool.
+
+ The second method involves providing the ‘DESTDIR’ variable. For
+example, ‘make install DESTDIR=/alternate/directory’ will prepend
+‘/alternate/directory’ before all installation names. The approach of
+‘DESTDIR’ overrides is not required by the GNU Coding Standards, and
+does not work on platforms that have drive letters. On the other hand,
+it does better at avoiding recompilation issues, and works well even
+when some directory options were not specified in terms of ‘${prefix}’
+at ‘configure’ time.
+
+Optional Features
+=================
+
+ 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’.
+
+ 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.
+
+ Some packages offer the ability to configure how verbose the
+execution of ‘make’ will be. For these packages, running ‘./configure
+--enable-silent-rules’ sets the default to minimal output, which can be
+overridden with ‘make V=1’; while running ‘./configure
+--disable-silent-rules’ sets the default to verbose, which can be
+overridden with ‘make V=0’.
+
+Particular systems
+==================
+
+ On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC
+is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+ ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+
+and if that doesn’t work, install pre-built binaries of GCC for HP-UX.
+
+ HP-UX ‘make’ updates targets which have the same timestamps as their
+prerequisites, which makes it generally unusable when shipped generated
+files such as ‘configure’ are involved. Use GNU ‘make’ instead.
+
+ On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its ‘<wchar.h>’ header file. The option ‘-nodtk’ can be used as a
+workaround. If GNU CC is not installed, it is therefore recommended to
+try
+
+ ./configure CC="cc"
+
+and if that doesn’t work, try
+
+ ./configure CC="cc -nodtk"
+
+ On Solaris, don’t put ‘/usr/ucb’ early in your ‘PATH’. This
+directory contains several dysfunctional programs; working variants of
+these programs are available in ‘/usr/bin’. So, if you need ‘/usr/ucb’
+in your ‘PATH’, put it _after_ ‘/usr/bin’.
+
+ On Haiku, software installed for all users goes in ‘/boot/common’,
+not ‘/usr/local’. It is recommended to use the following options:
+
+ ./configure --prefix=/boot/common
+
+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 option ‘--target=TYPE’ 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
+
+causes the specified ‘gcc’ to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for ‘CONFIG_SHELL’ due to an
+Autoconf limitation. Until the limitation is lifted, you can use this
+workaround:
+
+ CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+‘configure’ Invocation
+======================
+
+ ‘configure’ recognizes the following options to control how it
+operates.
+
+‘--help’
+‘-h’
+ Print a summary of all of the options to ‘configure’, and exit.
+
+‘--help=short’
+‘--help=recursive’
+ Print a summary of the options unique to this package’s
+ ‘configure’, and exit. The ‘short’ variant lists options used only
+ in the top level, while the ‘recursive’ variant lists options also
+ present in any nested packages.
+
+‘--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.
+
+‘--prefix=DIR’
+ Use DIR as the installation prefix. *note Installation Names:: for
+ more details, including other options available for fine-tuning the
+ installation locations.
+
+‘--no-create’
+‘-n’
+ Run the configure checks, but stop before creating any output
+ files.
+
+‘configure’ also accepts some other, not widely useful, options. Run
+‘configure --help’ for more details.
diff --git a/INSTALL.REPO b/INSTALL.REPO
new file mode 100644
index 0000000..c078359
--- /dev/null
+++ b/INSTALL.REPO
@@ -0,0 +1,136 @@
+ Copyright 2013-2022 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without
+ modification, are permitted in any medium without royalty provided
+ the copyright notice and this notice are preserved.
+
+This information supplements the generic installation instructions in
+the file 'INSTALL'. It is meant for people building from the
+development repository, rather than a distribution archive.
+Distribution archives include a 'configure' script, among other files;
+the repository does not. If you want to start building the 'groff'
+system using an existing 'configure' script, you don't need the
+information in this file.
+
+Dependencies
+------------
+
+The dependencies documented in the 'INSTALL.extra' file are required, as
+are several others.
+
+* You will need Autoconf version 2.68 or higher and Automake version
+ 1.12.2 or higher. These requirements are asserted in the
+ 'bootstrap.conf' file.
+
+ On operating systems supporting concurrent installation of multiple
+ versions of the GNU Autotools, set environment variables as in the
+ following example, adjusting the version numbers as required.
+
+ $ export AUTOMAKE_VERSION=1.14
+ $ export AUTOCONF_VERSION=2.69
+
+* You will need a 'yacc' program. We recommend Berkeley yacc ('byacc')
+ or GNU Bison ('bison').
+
+* groff's Texinfo manual is generated in several formats: GNU Info,
+ HTML, plain text, TeX DVI, and PDF. The former three require
+ 'makeinfo' from GNU Texinfo 5.0 or later. The latter two additionally
+ require a TeX installation, such as TeX Live. If TeX is not
+ installed, the DVI and PDF formats of the manual cannot be generated.
+ This will cause a build failure only if the Texinfo source file
+ "groff.texi" is updated and the make(1) "dist" or relevant file
+ targets are manually specified.
+
+* You will need the 'xpmtoppm', 'pnmdepth', and 'pnmtops' programs from
+ the Netpbm distribution.
+
+
+Bootstrapping from a Git checkout
+---------------------------------
+
+Invoke the bootstrap script.
+
+ $ ./bootstrap
+
+
+What bootstrapping does
+-----------------------
+
+The foregoing procedure will do two things:
+
+ - clone the gnulib repository as a Git submodule in 'gnulib', add the
+ needed gnulib source files in 'lib' as well as required gnulib m4
+ macros in 'gnulib_m4'; and
+
+ - invoke 'autoreconf', which will call the GNU Autotools ('aclocal',
+ 'autoconf', 'automake') in the right order to create the following
+ files.
+
+ -- INSTALL (a symlink to gnulib's INSTALL file)
+ -- Makefile.in
+ -- aclocal.m4
+ -- autom4te.cache/
+ -- build-aux/ (which contains all the helper scripts)
+ -- configure
+ -- src/include/config.hin
+
+'aclocal.m4' is a generated file; groff's m4 macros are included via the
+'acinclude.m4' file.
+
+
+Building
+--------
+
+You can now invoke the 'configure' script. It produces the
+'config.status' script, which generates the Makefile. Then call 'make'
+to build the groff project. You can do these from the source tree.
+
+ $ ./configure
+ $ make # run with -j option if desired
+
+You can alternatively build groff outside of its source tree, which is
+cleaner, leaving fewer files to confuse 'git status' if you aim to
+undertake development.
+
+ $ mkdir build
+ $ cd build
+ $ ../configure
+ $ make # run with -j option if desired
+
+A separate build tree need not be a subdirectory of the source.
+
+
+Evaluation
+----------
+
+Several dozen sanity checks can be performed within the build tree.
+
+ $ make check # run with -j option if desired
+
+
+Installation
+------------
+
+When the build is finished you can install the groff build artifacts.
+
+ $ make install install-doc # run with 'sudo' if necessary
+
+
+Uninstalling
+------------
+
+See "Uninstalling" in the 'INSTALL.extra' file.
+
+
+Rebuilding
+----------
+
+Start over from "Building" above.
+
+
+##### Editor settings
+Local Variables:
+fill-column: 72
+mode: text
+End:
+# vim: set autoindent textwidth=72:
diff --git a/INSTALL.extra b/INSTALL.extra
new file mode 100644
index 0000000..78d4139
--- /dev/null
+++ b/INSTALL.extra
@@ -0,0 +1,273 @@
+ Copyright 1997-2022 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+This file contains information that supplements the generic
+installation instructions in file 'INSTALL'.
+
+
+Building and Installing from within the Source Tree
+===================================================
+
+A simple method of building and installing groff is as follows.
+
+ 1. 'cd' to the directory containing groff's source code and type
+ './configure' to configure groff for your system. If you are
+ using 'csh' on an old version of AT&T Unix System V, you might need
+ to type 'sh ./configure' instead to prevent 'csh' from trying to
+ execute 'configure' itself.
+
+ While 'configure' runs, it reports properties of the host system
+ that determine how the build is to be performed.
+
+ 2. Type 'make' to compile groff. You may wish to add the '-j' option
+ to accelerate the build on multicore systems.
+
+ 3. Optionally, check the build for sound operation as described under
+ "Evaluation" below.
+
+ 4. Type 'sudo make install install-doc' to install groff's programs,
+ data files, and documentation. This is the only step for which you
+ need 'root' access; 'sudo' obtains this access.
+
+ 5. You can remove the groff executables and other generated files from
+ the source code directory by typing 'make clean'. To also remove
+ the files that 'configure' created (so you can compile groff for a
+ different kind of computer or with different options to
+ 'configure'), type 'make distclean'.
+
+
+Building and Installing from outside the Source Tree
+====================================================
+
+It is also possible to perform the build and installation procedure
+outside the source code directory. In this case an external build
+directory structure is created without changing any parts of the source
+tree. This practice is useful if the source code is read-only or if
+several different installations, such as for multiple architectures,
+should be constructed.
+
+As an example, we will imagine that groff's source code is in
+'/usr/local/src/groff' and that the build should happen within the
+directory '/home/my/groff-build'. These directory names can be anything
+valid on the operating system.
+
+ 0. Create '/home/my/groff-build' and 'cd' to that directory.
+
+ 1. Type '/usr/local/src/groff/configure' to configure groff for your
+ system. If you are using 'csh' on an old version of AT&T System V
+ Unix, you might need to type 'sh /usr/local/src/groff/configure'
+ instead.
+
+ 2. Type 'make' to compile groff. You may wish to add the '-j' option
+ to accelerate the build on multicore systems.
+
+ 3. Optionally, check the build for sound operation as described under
+ "Evaluation" below.
+
+ 4. Type 'sudo make install install-doc' to install groff's programs,
+ data files, and documentation. This is the only step for which you
+ need 'root' access; 'sudo' obtains this access.
+
+ 5. You can remove the groff executables and other generated files from
+ the source code directory by typing 'make clean'. To also remove
+ the files that 'configure' created (so you can compile groff for a
+ different kind of computer or with different options to
+ 'configure'), type 'make distclean'.
+
+
+Unprivileged Installation
+=========================
+
+The use of 'sudo' is necessary only if one or more destination
+directories used by the 'make install' command are in locations that
+require administrative access for writing. You can 'configure' groff
+with options like '--prefix' that select an alternative directory that
+is writable by the user conducting the build. Type './configure --help'
+from the groff source tree for documentation of relevant options.
+Running groff commands from such a directory may require you to set the
+'GROFF_BIN_PATH', 'GROFF_FONT_PATH', and 'GROFF_TMAC_PATH' environment
+variables. See the groff(1) man page. See "Evaluation" below for
+instructions on viewing this man page without having groff installed.
+
+
+Non-POSIX Platforms
+===================
+
+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.
+
+
+Dependencies
+============
+
+groff is predominantly written in ISO C++98, so you need a C++ compiler
+capable of handling this standardized version of the language. The C++
+source files use a suffix of '.cpp'; your C++ compiler must be able to
+handle this. A C/C++ preprocessor that conforms to ISO C90 is also
+required. If you don't already have a C++ compiler, we suggest GCC 9.4
+or later. To override the 'configure' script's choice of C++ compiler,
+you can set the CXX environment variable to the name of its executable.
+
+A few components of groff are written in ISO C99. Features later made
+optional by ISO C11 (the 'complex' primitive data type and
+variable-length arrays) are not used.
+
+Several programs distributed with GNU roff are written in the Perl
+language. Version 5.6.1 (1 April 2001) or later is required.
+
+The 'uchardet' library is an optional dependency of the 'preconv'
+program: if this library is found by 'configure', it will be
+automatically used by 'preconv'. Discovery of the 'uchardet' library
+requires the 'pkg-config' program to be installed on your system, as
+well as the library's C header files--on a package-based host system,
+this can mean installing uchardet's '-dev' or '-devel' package.
+
+URW fonts
+---------
+
+The 'configure' script searches for PostScript Type 1 fonts originating
+with the URW foundry; these are metrically compatible replacements for
+the Adobe PostScript Level 2 base 35 fonts required by that standard.
+These URW fonts are packaged with Ghostscript and in various derivative
+versions. The Adobe fonts are not free software, but the replacements,
+often named "Nimbus Roman", "Nimbus Sans", and "Nimbus Mono", and so
+forth, are. The PostScript and early PDF standards assumed that these
+base fonts would be supplied by the rendering device (a printer or PDF
+viewer). Nowadays the PDF standard expects all fonts to be embedded in
+the document; if groff's gropdf(1) output driver knows where to find
+these fonts, you can use its "-e" option for this purpose.
+
+The build process populates "Foundry" and "download" files that tell
+gropdf where to find their groff font descriptions and the font files
+themselves, respectively. If you have multiple versions of the URW
+fonts available on your system, or the 'configure' script cannot locate
+them on its own, use its "--with-urw-fonts-dir" option to tell the
+script where to find them. If you never use groff to generate
+PostScript or PDF documents, you can ignore any output from the
+'configure' script about URW fonts.
+
+
+Miscellaneous
+=============
+
+If you want A4 or U.S. letter paper format and the 'configure' script
+produces an incorrect guess, say
+
+ PAGE=xxx ./configure
+
+where 'xxx' should be either 'A4' or 'letter'. This affects only the
+media size used by some groff output drivers, like grops (which can
+still be overridden on the command line). For compatibility with AT&T
+troff, GNU troff's default page length is always 11 inches. The page
+length can be changed with the 'pl' request or with the "papersize"
+macro package; see section "Paper format" in groff(1).
+
+
+Evaluation
+==========
+
+Once groff is built, you can check it for correct operation without
+having to install it. groff comes with a test suite; use 'make check'
+to run it.
+
+You can also try it out from the directory you used to build it. A
+script called 'test-groff' is supplied for this purpose. It sets up
+environment variables to allow groff to run without being installed.
+For example, from the directory where you built groff, the command
+
+ ./test-groff -t -man -Tascii src/roff/groff/groff.1 | less -R
+
+displays the groff(1) man page with the 'less' pager. (You might prefer
+either the '-Tlatin1' or '-Tutf8' option to '-Tascii' depending on the
+character set you're using.)
+
+
+Documentation
+=============
+
+The groff Texinfo manual can be viewed in several formats. Versions
+corresponding to the source document 'doc/groff.texi' are supplied with
+the source distribution archive. You can browse it in GNU info format.
+
+ info doc/groff.info
+
+It can be viewed as text encoded in ISO Latin-1 as well.
+
+ iconv -f latin1 -t utf8 doc/groff.txt | less # for UTF-8 users
+ less doc/groff.txt # for Latin-1 users
+
+Renderings in HTML, TeX DVI, and PDF are also available.
+
+ lynx doc/groff.html
+ xdvi doc/groff.dvi
+ evince doc/groff.pdf
+
+A compilation of groff's man pages is available in text (with ISO 6429
+escape sequences) and PDF.
+
+ less -R doc/groff-man-pages.utf8.txt
+ evince doc/groff-man-pages.pdf
+
+
+In Case of Trouble
+==================
+
+If a test fails, gather its log file from the build directory. For
+instance, the test "tmac/tests/localization-works.sh" (in the source
+directory) will have a log file called
+"tmac/tests/localization-works.sh.log" in the build directory.
+
+To re-run a test, change to the top of the build directory (if
+necessary) and run the test by name from the shell prompt.
+
+For example, to rerun the test mentioned above from a "build" directory
+I created as a subdirectory in the source tree, I would do this.
+
+ (cd build && ../tmac/tests/localization-works.sh)
+
+I can view the test log as follows.
+
+ cat build/tmac/tests/localization-works.sh.log
+
+Many known issues are documented in the 'PROBLEMS' file; some apply to
+historical systems. You can also browse groff bug reports via the GNU
+Savannah issue tracker to see if your issue has already been reported.
+
+ https://savannah.gnu.org/bugs/?group=groff
+
+If that doesn't help and you need support, please contact the groff
+mailing list at groff@gnu.org. If you think that you have found a bug,
+please submit a ticket using the 'BUG-REPORT' file as a template.
+
+ https://savannah.gnu.org/bugs/?group=groff&func=additem
+
+
+Uninstalling
+============
+
+If you are dissatisfied with groff, or to prepare for a new installation
+from source, you can uninstall it to ensure that no stale files persist
+on the system. Run the command 'sudo make uninstall'. (If you
+successfully used 'make install', simply run 'make uninstall'.) At a
+minimum, some directories not particular to groff, like 'bin' and
+(depending on configuration) an X11 'app-defaults' directory will
+remain, as will one plain file called 'dir', created by GNU Texinfo's
+'install-info' command. (As of this writing, 'install-info' offers no
+provision for removing an effectively empty 'dir' file, and groff does
+not attempt to parse this file to determine whether it can be safely
+removed.) All other groff artifacts will be deleted from the
+installation hierarchy.
+
+
+##### Editor settings
+Local Variables:
+fill-column: 72
+mode: text
+End:
+vim: set autoindent textwidth=72:
diff --git a/LICENSES b/LICENSES
new file mode 100644
index 0000000..160cf5f
--- /dev/null
+++ b/LICENSES
@@ -0,0 +1,219 @@
+ Copyright 2003-2022 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+LICENSES
+--------
+
+groff is a free software project. It is licensed under the GNU General
+Public License (GPL), version 3 or later.
+
+The file COPYING in the top directory of the groff source distribution
+contains a copy of the GPL that was downloaded from the GNU web site
+<http://www.gnu.org/copyleft/gpl.txt> on 3 January 2009.
+
+All files in the groff source distribution are distributed under the
+terms of this version of the GPL. You are free to choose version 3 or
+any subsequent version of the GPL. Some are distributed under
+alternative terms as well.
+
+The text of the GPL contains a postal address from which you can obtain
+the current version of the license. Further information is available on
+the Web at <http://www.gnu.org/copyleft>.
+
+groff is an effort of the GNU Project of the Free Software Foundation
+(FSF); with the exceptions noted below, the copyrights of all files
+comprising it have been assigned to the FSF. Information on GNU and the
+FSF may be found at <http://www.fsf.org/>.
+
+Files in the contrib/ subdirectory of the source distribution are not
+strictly part of groff. That is, they are distributed with it and are
+Free Software <https://www.gnu.org/philosophy/free-sw.en.html>, but they
+are not considered essential parts of the distribution. Further, they
+may bear licenses other than the GPL or the FSF does not administer
+their copyrights. To determine their copyright status and licensing,
+see the "COPYRIGHT" file in the appropriate subdirectory of contrib/.
+
+Some files are part of groff but bear licenses in addition to the GPL,
+or have been placed into the public domain. This is because they
+originated elsewhere; often, the groff project has modified them,
+sometimes extensively. These multi-licensed groff components are as
+follows. Their file names are not always identical to those in their
+original distributions, but we have kept them similar.
+
+grn preprocessor
+================
+
+grn, written by Barry Roitblat <barry@rentonww.com> and David
+Slattengren <slatteng@Xinet.COM>, was part of the Berkeley
+device-independent troff distribution. The files contain no AT&T code
+and are in the public domain. Historically, the original package could
+be found at <http://ftp.cs.wisc.edu/pub/misc/grn.tar.Z>.
+
+ src/preproc/grn/gprint.h
+ src/preproc/grn/hdb.cpp
+ src/preproc/grn/hgraph.cpp
+ src/preproc/grn/hpoint.cpp
+ src/preproc/grn/main.cpp
+
+gxditview output driver
+=======================
+
+gxditview is based on the X Window System (Version 11)'s "xditview"
+program, and is licensed under the same terms as the rest of X11R5.
+
+ src/devices/xditview/DESC.in
+ src/devices/xditview/Dvi.c
+ src/devices/xditview/Dvi.h
+ src/devices/xditview/DviP.h
+ src/devices/xditview/FontMap-X11
+ src/devices/xditview/GXditview.ad
+ src/devices/xditview/Menu.h
+ src/devices/xditview/ad2c
+ src/devices/xditview/device.c
+ src/devices/xditview/device.h
+ src/devices/xditview/draw.c
+ src/devices/xditview/font.c
+ src/devices/xditview/gray1.bm
+ src/devices/xditview/gray2.bm
+ src/devices/xditview/gray3.bm
+ src/devices/xditview/gray4.bm
+ src/devices/xditview/gray5.bm
+ src/devices/xditview/gray6.bm
+ src/devices/xditview/gray7.bm
+ src/devices/xditview/gray8.bm
+ src/devices/xditview/gxditview.man
+ src/devices/xditview/lex.c
+ src/devices/xditview/page.c
+ src/devices/xditview/parse.c
+ src/devices/xditview/xdit.bm
+ src/devices/xditview/xdit_mask.bm
+ src/devices/xditview/xditview.c
+
+ src/include/DviChar.h
+ src/include/XFontName.h
+
+ src/libs/libxutil/DviChar.c
+ src/libs/libxutil/XFontName.c
+
+mdoc macro package
+==================
+
+mdoc uses the BSD "three-clause" license; that is, it is subject to the
+advertising clause rescission.
+
+ tmac/doc.tmac
+ tmac/doc-old.tmac
+ tmac/mdoc/doc-common
+ tmac/mdoc/doc-ditroff
+ tmac/mdoc/doc-nroff
+ tmac/mdoc/doc-syms
+ tmac/groff_mdoc.7.man
+
+me macro package
+================
+
+"me" uses the BSD "three-clause" license; that is, it is subject to the
+advertising clause rescission.
+
+ tmac/e.tmac
+ tmac/groff_me.man
+ doc/meintro.me
+ doc/meintro_fr.me
+ doc/meref.me
+
+Hyphenation patterns
+====================
+
+groff's hyphenation pattern files are adapted from those used by various
+TeX-related projects.
+
+* "tmac/hyphen.cs" is renamed from "czhyphen.tex", and obtained from
+ <http://dante.ctan.org/CTAN/macros/cstex/base/csplain.tar.gz>.
+
+ It is under the GNU General Public License, version 2 or later.
+
+* "tmac/hyphen.den" and "tmac/hyphen.det" are renamed from
+ "dehyphn-x-2017-03-31.pat" and "dehypht-x-2017-03-31.pat",
+ respectively, in the "dehyph-exptl-0.41" package.
+
+ Copyright (c) 2013-2017
+ Stephan Hennig, Werner Lemberg, Guenter Milde, Sander van Geloven,
+ Georg Pfeiffer, Gisbert W. Selke, Tobias Wendorf
+
+ Licensed under the MIT license. Full license text available from
+
+ http://opensource.org/licenses/mit-license.php
+
+* "tmac/hyphen.en" is renamed from "hyph-en-us.tex" in the "hyph-utf8"
+ CTAN package.
+
+ Copyright (C) 1990, 2004, 2005 Gerard D.C. Kuiken
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+* "tmac/hyphen.fr" is renamed from "frhyph.tex", obtained from
+ <http://dante.ctan.org/CTAN/language/hyphenation/frhyph.tex>.
+
+ It identifies no copyright holder but bears a license statement.
+
+ This file is available for free and can used and redistributed
+ asis for free. Modified versions should have another name.
+
+* "tmac/hyphen.it" is renamed from "hyph-it.tex" in the "hyph-utf8" CTAN
+ package.
+
+ Copyright (C) 2008-2011 Claudio Beccari
+
+ This file is available under any of the following licences:
+
+ name: LPPL
+ version: 1.3
+ or_later: true
+ url: http://www.latex-project.org/lppl.txt
+ status: maintained
+ maintainer: Claudio Beccari, e-mail claudio dot beccari at gmail dot
+ com
+
+ name: MIT
+ url: https://opensource.org/licenses/MIT
+ text: >
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation
+ files (the "Software"), to deal in the Software without
+ restriction, including without limitation the rights to use,
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following
+ conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ OTHER DEALINGS IN THE SOFTWARE.
+
+* "tmac/hyphen.sv" is renamed from "svhyph.tex", obtained from
+ <http://dante.ctan.org/CTAN/language/hyphenation/svhyph.tex>.
+
+ Copyright 1994 by Jan Michael Rynning. All rights reserved.
+
+ This program may be distributed and/or modified under the conditions
+ of the LaTeX Project Public License, either version 1.2 of this
+ license or (at your option) any later version. The latest version of
+ this license is in http://www.latex-project.org/lppl.txt and version
+ 1.2 or later is part of all distributions of LaTeX version 1999/12/01
+ or later.
+
+Any omissions from the above list are unintentional; please contact the
+groff development mailing list at groff@gnu.org to point them out.
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..736b211
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,191 @@
+ Copyright 2001-2022 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+This file summarizes the structure of the groff source distribution.
+
+
+1) Top-level directory contents
+
+ BUG-REPORT A template for bug reports.
+ ChangeLog Log of changes since last groff minor version release.
+ ChangeLog.* Logs of changes in past groff versions.
+ COPYING The GNU General Public License (GPL).
+ FDL The GNU Free Documentation License (FDL).
+ FOR-RELEASE Release procedures for groff maintainer(s) to follow.
+ HACKING Advice for contributors to groff.
+ INSTALL Generic information on configuration and compiling.
+ INSTALL.extra How to install groff from a distribution archive.
+ INSTALL.REPO How to install groff from a Git repository checkout.
+ LICENSES Copyright and licensing information.
+ MANIFEST The file you are reading.
+ MORE.STUFF Useful stuff in other packages.
+ NEWS Log of feature changes in groff.
+ PROBLEMS Tips to handle known situations of concern.
+ PROJECTS Long-term additions to groff.
+ README Introduction to and contact information for groff.
+ README.MinGW Build information for MinGW.
+ TODO Things planned for future groff versions.
+
+ All other files in the top-level directory are related to
+ configuration, compilation, and installation procedures.
+
+
+2) Directory structure
+
+./arch Resources to facilitate building on non-POSIX systems.
+ djgpp Resources for the 32-bit MS-DOS compiler djgpp.
+ mingw Resources for the MinGW environment.
+ misc Resources for various other platforms.
+
+./contrib Resources provided with groff, but maintained by others.
+ chem Embed chemical structure diagrams in groff documents.
+ eqn2graph Convert eqn(1) equations into graphical images.
+ gdiffmk An improved implementation of the diffmk command to mark
+ differences between groff/nroff/troff files.
+ glilypond Embed LilyPond sheet music in groff documents.
+ gperl Populate groff registers and strings using perl(1).
+ gpinyin Use Hanyu Pinyin input to compose groff documents.
+ grap2graph Convert grap(1) diagrams into graphical images.
+ hdtbl A sophisticated table macro package.
+ mm The groff memorandum macro package.
+ mom Peter Schaffter's "mom", a friendly groff macro package.
+ pdfmark Add PDF marks to groff documents; includes "pdfroff",
+ which eases creation of PDF documents.
+ pic2graph Convert pic(1) diagrams into graphical images.
+ rfc1345 Use RFC 1345 mnemonics as groff special characters.
+ sboxes Use bordered, shaded background boxes with ms and PDF.
+
+./doc Manuals for various components of groff.
+
+./font Device and font description files.
+ devX100 100dpi X11 device (10 point base type size).
+ devX100-12 100dpi X11 device (12 point base type size).
+ devX75 75dpi X11 device (10 point base type size).
+ devX75-12 75dpi X11 device (12 point base type size).
+ devascii Terminal device with ASCII (ISO 646) encoding.
+ devcp1047 Terminal device with EBCDIC (code page 1047) encoding.
+ devdvi TeX DVI device.
+ devhtml HTML device.
+ devlatin1 Terminal device with ISO Latin-1 (8859-1) encoding.
+ devlbp Canon CaPSL laser printers.
+ devlj4 HP LaserJet 4/PCL 5 and compatible printers.
+ devps PostScript device.
+ devpdf PDF device.
+ devutf8 Terminal device with UTF-8 encoding.
+ scripts Scripts used in generation of device/font descriptions.
+ util Tools to aid groff developers with new device support.
+
+./m4 M4 macro files used to create the "configure" script.
+
+./man groff manual pages of general applicability.
+
+./src groff programs and libraries.
+
+./src/devices Output drivers for devices and file formats.
+ grodvi TeX DVI.
+ grohtml HTML.
+ grolbp Canon CaPSL laser printers.
+ grolj4 HP LaserJet 4/PCL 5 and compatible printers.
+ grops PostScript.
+ gropdf PDF.
+ grotty Terminal output.
+ xditview A troff output (pre)viewer for the X Window System.
+
+./src/include C/C++ header files.
+
+./src/libs C++ code shared among several groff components.
+ libbib Manage bibliographic database.
+ libdriver Parse troff output; also output utility functions.
+ libgroff General support functions used everywhere.
+ libxutil Utility functions for gxditview and xtotroff.
+
+./src/preproc Preprocessors.
+ eqn Typeset mathematical formulae.
+ grn Draw Gremlin pictures.
+ html Prepare tbl and eqn input for grohtml.
+ pic Draw diagrams.
+ preconv Convert document input encoding for input to troff.
+ refer Generate bibliographic references.
+ soelim Expose 'so' (sourced) documents to preprocessing.
+ tbl Lay out tables.
+
+./src/roff Programs that run the formatter.
+ groff troff wrapper. This is the main user program.
+ nroff groff wrapper convenient for terminal users.
+ troff Formatter.
+
+./src/utils Utility programs relevant to groff.
+ addftinfo Supplement AT&T troff font descriptions with metrics
+ groff requires.
+ afmtodit Create font description files for the PostScript device.
+ grog Guess groff command-line options required by a document.
+ 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 Type 1 font in PFB format to PFA.
+ tfmtodit Create font description files for TeX DVI device.
+ xtotroff Create font description files for gxditview.
+
+./tmac Macro files.
+ mdoc Modules for the mdoc package.
+
+Various directories contain a "tests" subdirectory. These are automated
+tests performed when groff's Makefile is run with the "check" target.
+
+
+3) Documentation
+
+groff documentation is spread throughout the tree; where possible, it is
+close to the source code it describes.
+
+- The top-level directory contains text files presenting groff as a
+ software project, with its focus on organization of the code,
+ development procedures, and project administration.
+
+ If you don't know where to begin, start with "README"; it contains the
+ information you will require to obtain the groff distribution archive,
+ report bugs, and contact the developers.
+
+- A man page for each program (for section 1 of the manual) is
+ maintained in the source directory of the program itself.
+
+- Extensive man pages documenting GNU roff's input language, special
+ character repertoire, differences from AT&T troff, device and font
+ description file formats, macro files, and historical and conceptual
+ background are maintained in the "man" directory.
+
+- Documentation in other formats is located in the "doc" directory,
+ including groff's Texinfo manual, and tutorial and/or reference
+ manuals written using groff macro packages.
+
+- Documentation for contributed components is kept in the relevant
+ subdirectory of "contrib".
+
+
+4) groff language parser
+
+The "troff" program in "src/roff/troff" parses the groff input language.
+There, "input.cpp" implements the main loop and tokenizes input. Input
+tokens are transformed into nodes (a GNU troff internal data structure)
+by "env.cpp" and "node.cpp". Routines in the latter file generate the
+page description language from lists of nodes.
+
+
+5) page description language parser
+
+The parser for the page description language produced by troff is
+implemented in "src/libs/libdriver/input.cpp". This is used by all
+groff output drivers written in C++. ("gropdf", written in Perl,
+performs its own parsing.)
+
+
+##### Editor settings
+Local Variables:
+fill-column: 72
+mode: text
+End:
+vim: set expandtab textwidth=72:
diff --git a/MORE.STUFF b/MORE.STUFF
new file mode 100644
index 0000000..9b978fc
--- /dev/null
+++ b/MORE.STUFF
@@ -0,0 +1,189 @@
+ Copyright 2000-2020 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+Ports of groff to non-POSIX environments
+========================================
+
+Microsoft Windows
+-----------------
+
+Cygwin makes a groff package available.
+
+ https://cygwin.com/
+
+Look for a convenient mirror site at the followung URL.
+
+ https://cygwin.com/mirrors.html
+
+Cygwin maintains a port status page.
+
+ https://cygwin.com/packages/summary/groff.html
+
+Cygwin, like most GNU/Linux distributions, separates groff build
+artifacts into multiple components, largely for dependency management.
+You may find the source package page of interest.
+
+ https://cygwin.com/packages/summary/groff-src.html
+
+The port is maintained in a Git repository.
+
+ https://cygwin.com/git-cygwin-packages/?p=git/cygwin-packages/groff.git
+
+
+grap
+----
+
+Ted Faber has written an implementation of Kernighan & Bentley's grap
+language for typesetting graphs.
+
+ http://www.lunabase.org/~faber/Vault/software/grap/
+
+
+troffcvt
+--------
+
+Per its 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.
+
+ http://www.snake.net/software/troffcvt/
+
+
+unroff
+------
+
+Per its 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.
+
+ https://www-rn.informatik.uni-bremen.de/software/unroff/
+
+
+Haart deroff
+------------
+
+Per its ReadMe.txt file,
+
+ Deroff removes roff constructs from documents for the purpose of
+ indexing, spell checking etc. My own 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.
+
+ https://caio.ueberalles.net/deroff/
+
+
+doclifter
+---------
+
+Per its web page,
+
+ [doclifter lifts] documents in nroff markups to XML-DocBook.
+
+ Lifting documents from presentation level to semantic level is hard,
+ and a really good job requires human polishing. This tool aims to do
+ everything that can be mechanized, and to preserve any troff-level
+ information that might have structural implications in XML comments.
+ This tool does the hard parts. TBL tables are translated into DocBook
+ table markup, PIC into SVG, and EQN into MathML (relying on pic2svg
+ and GNU eqn for the last two).
+
+ http://catb.org/~esr/doclifter
+
+
+pic2plot
+--------
+
+pic2plot, part of the GNU plotutils package, can lift pic markup to SVG.
+The plotutils package is available at
+
+ http://www.gnu.org/software/plotutils/
+
+
+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 <baruchel@libertysurf.fr> 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 <bobd@science.uva.nl>. 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
+-------------
+
+Documentation of the AT&T implementations of the troff, tbl, pic, eqn,
+and refer programs can be found at the following site.
+
+ https://www.troff.org/papers.html
+
+##### Editor settings
+Local Variables:
+fill-column: 72
+mode: text
+End:
+vim: set textwidth=72:
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..f7ab410
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,915 @@
+# Copyright (C) 1989-2023 Free Software Foundation, Inc.
+# Original Makefile.in written by James Clark (jjc@jclark.com)
+# Migrated to Automake by Bertrand Garrigues
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# Makefile.am
+#
+
+# The variables that are listed in the following comments will be
+# automatically set by automake in the generated Makefile.in
+
+# SHELL
+
+# PACKAGE_TARNAME
+
+# srcdir
+
+# top_srcdir
+
+# VPATH
+
+# top_builddir
+
+# HOST
+# `HOST' is the canonical host specification,
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+
+# `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@
+
+# GLIBC2
+# `GLIBC21' is yes if the host operating system uses GNU libc 2.1 or newer,
+# otherwise no.
+
+
+# VERSION is set by automake, based on what is passed to AC_INIT.
+
+# PAGE
+# 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).
+
+# GHOSTSCRIPT
+# The name of the ghostscript program. Normally, gs, on GNU/Linux
+# but it might be different on MS-DOS/MS-WIN32 systems.
+
+# ALT_GHOSTSCRIPT_PROGS
+# `ALT_GHOSTSCRIPT_PROGS' specifies a list alternative names,
+# which can be tried if `GHOSTSCRIPT' cannot be found at run time.
+
+# ALT_AWK_PROGS
+# Similarly, `ALT_AWK_PROGS' specifies a list of alternative names,
+# which can be tried at run time, to identify the awk program.
+
+# BROKEN_SPOOLER_FLAGS
+# 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.
+
+
+# `DEVICE' is the default device.
+DEVICE=ps
+
+# XDEVIDIRS
+# `XDEVDIRS' is either `font/devX{75,100}{,-12}' or empty.
+
+# XPROGDIRS
+# `XPROGDIRS' is either `src/devices/xditview src/utils/xtotroff' or empty.
+
+# XLIBDIRS
+# `XLIBDIRS' is either `src/libs/libxutil' or empty.
+
+# `TTYDEVDIRS' is either `font/devascii font/devlatin1' (for
+# ASCII) or `font/devcp1047' (for EBCDIC) plus font/devutf8.
+TTYDEVDIRS=@TTYDEVDIRS@ font/devutf8
+
+# OTHERDEVDIRS
+# `OTHERDEVDIRS' is either `font/devlj4 font/devlbp' (for ASCII) or
+# empty (for EBCDIC).
+
+# PSPRINT
+# `PSPRINT' is the command to use for printing a PostScript file,
+# for example `lpr'.
+
+# DVIPRINT
+# `DVIPRINT' is the command to use for printing a TeX dvi file,
+# for example `lpr -d'.
+
+# g
+# 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.
+
+# prefix
+# exec_prefix
+# Common prefix for installation directories.
+# Used in definitions of exec_prefix, datasubdir, fontpath, manroot.
+# This must already exist when you do make install.
+
+# bindir
+# `bindir' says where to install executables.
+
+# libdir
+# `libdir' says where to install platform-dependent data.
+
+# libprogramdir
+# `libprogramdir' is $(libdir)/groff
+
+# `datasubdir' says where to install platform-independent data files.
+# datadir
+# datarootdir
+dataprogramdir=$(datadir)/groff
+datasubdir=$(dataprogramdir)/$(SHORT_VERSION)
+
+# infodir
+# `infodir' says where to install info files.
+
+# docdir
+# `docdir' says where to install documentation files. The default
+# location is ${datarootdir}/doc/${PACKAGE}, but we add the version
+docdir=$(datarootdir)/doc/${PACKAGE}-$(SHORT_VERSION)
+
+# `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
+
+# `oldfontdir' says where to install old font sets (as dev*/*).
+oldfontdir=$(datasubdir)/oldfont
+
+# `localfontdir' says where local fonts will be installed (as dev*/*).
+localfontdir=$(dataprogramdir)/site-font
+
+# `legacyfontdir' is for compatibility with AT&T/DWB 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
+
+# appdefdir
+# `appdefdir' says where to install the application defaults file for
+# gxditview.
+
+# glilypond_dir
+# gpinyin_dir
+
+# `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
+# `sys_tmac_prefix' is prefix (if any) for system macro packages.
+
+# pnmtops_nosetpage
+# `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.
+
+# tmac_wrap
+# `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.
+
+# compatibility_wrappers
+# (groff compatibility wrappers for vendor-provided non-GNU macro sets)
+#
+# `compatibility_wrappers' controls the creation and installation of
+# compatibility wrappers for the macro sets named in `tmac_wrap'.
+# Its value must be one of:
+# `yes' install compatibility wrappers as the original macro set name
+# (that is, the default implementation of that macro set), and
+# install the groff implementation with a prefix (usually g).
+# `no' do not install compatibility wrappers; only install the groff
+# implementation of each macro set.
+# `manual' install the compatibility wrappers as `<macro>-os' and install
+# the groff implementation of each macro set as the default
+# implementation of that macro set.
+
+# Don't make this empty.
+wrapper_suffix_default="-os"
+
+wrapper_suffix=`if test $(compatibility_wrappers) = manual; then echo $(wrapper_suffix_default); fi`
+
+# When `compatibility_wrappers' is `yes', if there is a groff implementation
+# of a macro set listed in $(tmac_wrap), then the groff implementation will be
+# installed with a prefix of $(tmac_prefix) via the collision detection
+# variables $(tmac_m_prefix), $(tmac_s_prefix), and $(tmac_an_prefix).
+
+# Don't make this empty.
+tmac_prefix=g
+
+# The groff -mm macros will be available as -m$(tmac_m_prefix)m.
+tmac_m_prefix=\
+ `if test $(compatibility_wrappers) = yes; then \
+ for i in $(tmac_wrap) ""; do \
+ case "$$i" in m) echo $(tmac_prefix);; esac; \
+ done; \
+ fi`
+
+# The groff -ms macros will be available as -m$(tmac_s_prefix)s.
+tmac_s_prefix=\
+ `if test $(compatibility_wrappers) = yes; then \
+ for i in $(tmac_wrap) ""; do \
+ case "$$i" in s) echo $(tmac_prefix);; esac; \
+ done; \
+ fi`
+
+# The groff -man macros will be available as -m$(tmac_an_prefix)an.
+tmac_an_prefix=\
+ `if test $(compatibility_wrappers) = yes; then \
+ for i in $(tmac_wrap) ""; do \
+ case "$$i" in an) echo $(tmac_prefix);; esac; \
+ done; \
+ fi`
+
+# Extension to be used for refer index files. Index files are not
+# shareable 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
+
+# mandir
+# `manroot' is the root of the man page directory tree.
+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 can we build the HTML documentation.
+# make_htmldoc
+# make_install_htmldoc
+# make_uninstall_htmldoc
+
+# The configure script also checks whether all necessary utility programs
+# for pdfroff are available -- only then can we build PDF documentation.
+# make_pdfdoc
+# make_install_pdfdoc
+# make_uninstall_pdfdoc
+
+# Windows `.cmd' files
+# make_winscripts
+# make_install_winscripts
+# make_uninstall_winscripts
+
+# All the previous installation directories, when used, are prefixed with
+# $(DESTDIR) during install and uninstall, to support staged installations.
+
+# config.h might set the following defines:
+#
+# WORDS_BIGENDIAN if your target platform is big-endian
+# IS_EBCDIC_HOST if the host's encoding is EBCDIC
+#
+# HAVE_DIRECT_H if you have <direct.h>
+# HAVE_DIRENT_H if you have <dirent.h>
+# HAVE_CC_INTTYPES_H if you have a C++ <inttypes.h>
+# HAVE_PROCESS_H if you have <process.h>
+# HAVE_LIMITS_H if you have <limits.h>
+# HAVE_CC_LIMITS_H if you have a C++ <limits.h>
+# HAVE_MATH_H if you have <math.h>
+# HAVE_CC_OSFCN_H if you have a C++ <osfcn.h>
+# HAVE_STDDEF_H if you have <stddef.h>
+# HAVE_STDLIB_H if you have <stdlib.h>
+# HAVE_STRING_H if you have <string.h>
+# HAVE_STRINGS_H if you have <strings.h>
+# HAVE_SYS_DIR_H if you have <sys/dir.h>
+# HAVE_SYS_PARAM_H if you have <sys/param.h>
+# HAVE_SYS_STAT_H if you have <sys/stat.h>
+# HAVE_SYS_TIME_H if you have <sys/time.h>
+# HAVE_SYS_TYPES_H if you have <sys/types.h>
+# HAVE_UNISTD_H if you have <unistd.h>
+#
+# HAVE_FMOD if you have fmod()
+# HAVE_GETCWD if you have getcwd()
+# HAVE_GETTIMEOFDAY if you have gettimeofday()
+# HAVE_ICONV if you have iconv()
+# HAVE_ISATTY if you have isatty()
+# HAVE_KILL if you have kill()
+# HAVE_LANGINFO_CODESET if you have nl_langinfo()
+# HAVE_MKSTEMP if you have mkstemp()
+# HAVE_MMAP if you have mmap()
+# HAVE_PUTENV if you have putenv()
+# HAVE_RENAME if you have rename()
+# HAVE_SETLOCALE if you have setlocale()
+# HAVE_STRCASECMP if you have strcasecmp()
+# HAVE_STRNCASECMP if you have strncasecmp()
+# HAVE_STRERROR if you have strerror()
+# HAVE_STRSEP if you have strsep()
+# HAVE_STRTOL if you have strtol()
+# HAVE_SYMLINK if you have symlink()
+#
+# NEED_DECLARATION_GETTIMEOFTODAY
+# if your C++ <sys/time.h> doesn't declare
+# gettimeofday()
+# NEED_DECLARATION_HYPOT if your C++ <math.h> doesn't declare hypot()
+# NEED_DECLARATION_PCLOSE if your C++ <stdio.h> doesn't declare pclose()
+# NEED_DECLARATION_POPEN if your C++ <stdio.h> doesn't declare popen()
+# NEED_DECLARATION_PUTENV if your C++ <stdlib.h> doesn't declare
+# putenv()
+# NEED_DECLARATION_RAND if your C++ <stdlib.h> doesn't declare rand()
+# NEED_DECLARATION_SRAND if your C++ <stdlib.h> doesn't declare srand()
+# NEED_DECLARATION_STRCASECMP if your C++ <string.h> doesn't declare
+# strcasecmp()
+# NEED_DECLARATION_STRNCASECMP
+# if your C++ <string.h> doesn't declare
+# strncasecmp()
+# NEED_DECLARATION_VFPRINTF if your C++ <stdio.h> doesn't declare
+# vfprintf()
+#
+# HAVE_DECL_GETC_UNLOCKED if you have getc_unlocked()
+# HAVE_DECL_SYS_SIGLIST if you have sys_siglist[]
+#
+# HAVE_STRUCT_EXCEPTION if <math.h> defines struct exception
+# HAVE_SYS_NERR if you have sysnerr in <errno.h> or <stdio.h>
+# HAVE_SYS_ERRLIST if you have sys_errlist in <errno.h> or
+# <stdio.h>
+# ICONV_CONST=const if declaration of iconv() needs const
+# LONG_FOR_TIME_T if localtime() takes a long * not a time_t *
+# RETSIGTYPE=int if signal handlers return int not void
+# RET_TYPE_SRAND_IS_VOID if srand() returns void not int
+#
+# WCOREFLAG=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
+#
+# HAVE_WORKING_O_NOATIME define if <fcntl.h>'s O_NOATIME flag works
+# HAVE_WORKING_O_NOFOLLOW define if <fcntl.h>'s O_NOFOLLOW flag works
+#
+# uintmax_t=<value> define to `unsigned long' or `unsigned long
+# long' if <inttypes.h> does not exist
+#
+# PAGE=A4 if the printer's page size is A4
+# GHOSTSCRIPT=gs the name (and directory if required) of the
+# ghostscript program
+
+# Include
+#
+# {fmod,getcwd,mkstemp,putenv,strcasecmp,
+# strerror,strncasecmp,strtol}.$(OBJEXT)
+#
+# LIBOBJS
+# in LIBOBJS if your C library is missing the corresponding function.
+
+# `CCC' is the compiler for C++ (.cpp) files.
+CCC=@CXX@
+# CC
+# CFLAGS
+# CPPFLAGS
+# LDFLAGS
+
+# X_CFLAGS
+# X_LIBS
+# X_EXTRA_LIBS
+# X_PRE_LIBS
+
+# YACC
+
+# GREP
+# EGREP
+
+# MAKEINFO
+
+# EXEEXT
+# OBJEXT
+# LIBEXT
+# LIBS
+# LIBM
+# LIBICONV
+# AR
+# RANLIB
+# INSTALL
+# INSTALL_PROGRAM
+# INSTALL_SCRIPT
+# INSTALL_DATA
+# INSTALL_INFO
+# LN_S
+
+ETAGS=etags
+ETAGSFLAGS=
+# Flag that tells etags to assume C++.
+ETAGSCCFLAG=-C
+# Full path to perl.
+# PERL
+# PERLVERSION
+# Sed command with which to edit sh scripts.
+# SH_SCRIPT_SED_CMD
+# Sed script to deal with OS dependencies in sh scripts.
+SH_DEPS_SED_SCRIPT=$(top_builddir)/shdeps.sed
+
+# On some platforms we need to set LANG and LC_ALL to C for sed
+SED=\
+ LANG=C \
+ LC_ALL=C \
+ sed
+
+# The program to create directory hierarchies.
+# mkinstalldirs is now in gnulib/build-aux
+
+PURIFY=purify
+PURIFYCCFLAGS=
+#PURIFYCCFLAGS=-g++=yes \
+# -collector=`dirname \`$(CCC) -print-libgcc-file-name\``/ld
+
+# Add groff and gnulib m4 macros
+ACLOCAL_AMFLAGS = -I m4 -I gnulib_m4
+
+# Common preprocessor flags: gnulib includes, common includes in
+# src/include, and config.h that is generated in the build tree
+AM_CPPFLAGS = \
+ -I$(top_srcdir)/src/include \
+ -I$(top_srcdir)/lib \
+ -I$(top_builddir)/src/include \
+ -I$(top_builddir)/lib
+
+# Define a custom string for rules that call groff in make's silence mode.
+GROFF_V = $(GROFF_V_@AM_V@)
+GROFF_V_ = $(GROFF_V_@AM_DEFAULT_V@)
+GROFF_V_0 = @echo " GROFF " $@;
+
+# The following Automake variables will be supplemented by the various
+# .am files.
+bin_PROGRAMS =
+nobase_bin_PROGRAMS =
+bin_SCRIPTS =
+dist_bin_SCRIPTS =
+# stuff that should be in distribution archives but not in source repo
+MAINTAINERCLEANFILES =
+MOSTLYCLEANFILES =
+noinst_LIBRARIES =
+BUILT_SOURCES =
+CLEANFILES =
+# gnulib asks to include this file
+EXTRA_DIST = gnulib_m4/gnulib-cache.m4
+FONTFILES =
+PREFIXMAN1 =
+man1_MANS =
+man5_MANS =
+man7_MANS =
+
+# for lex/yacc
+AM_YFLAGS = -d -v
+
+SUFFIXES =
+
+# tests launched by make check
+check_SCRIPTS =
+check_PROGRAMS =
+TESTS =
+XFAIL_TESTS =
+AM_TESTS_ENVIRONMENT = \
+ abs_top_srcdir=$(abs_top_srcdir) \
+ abs_top_builddir=$(abs_top_builddir) \
+ export abs_top_srcdir abs_top_builddir;
+
+# We use Automake's Uniform Naming Scheme.
+#
+# prefixexecbin_PROGRAMS is the list of programs that may have a
+# NAMEPREFIX if an existing non-GNU troff system was detected.
+#
+# This is done by the m4 macro GROFF_G that checks for the presence of
+# GNU Troff built-in \n[.g] macro. If a Unix Troff binary was
+# detected, the following programs and scripts names will have a 'g'
+# prefix: chem, tbl, eqn, neqn, pic, soelim, grn, refer, lookbib,
+# troff, nroff. Also, PROG_PREFIX will be set to 'g' in the generated
+# header defs.h so that these programs could be called correctly.
+#
+# prefixexecbindir is used to temporary install these programs. They
+# are then moved to bindir during the install-exec-hook. Same thing
+# for the scripts.
+NAMEPREFIX=$(g)
+prefixexecbin_PROGRAMS =
+prefixexecbin_SCRIPTS =
+if USEPROGRAMPREFIX
+# We use datadir because the uninstall rule for the PROGRAMS attempts
+# to cd into prefixexecbindir, and thus if prefixexecbindir is removed
+# two consecutive uninstalls would fail
+prefixexecbindir = $(datadir)
+else
+prefixexecbindir = $(bindir)
+endif
+
+# Path to binaries and flags used by contribs and doc to generated doc.
+# These may be overridden if cross-compiling.
+GROFFBIN = $(abs_top_builddir)/groff
+GROFF_BIN_PATH = $(abs_top_builddir)
+PDFMOMBIN = $(abs_top_builddir)/pdfmom
+# Search for macro files and device/font description directories in
+# source _and_ build trees; some of each are generated.
+FFLAG=-F$(abs_top_builddir)/font -F$(abs_top_srcdir)/font
+MFLAG=-M$(abs_top_builddir)/tmac -M$(abs_top_srcdir)/tmac
+
+if !MAKE_DEFINES_RM
+RM=rm -f
+endif
+
+# 'VERSION' is generated by gnulib script git-version-gen, using the
+# command 'git describe':
+#
+# - From a git repository: if the current commit corresponds to a
+# tag, then 'VERSION' is simply the tag (e.g. 1.22.3). Otherwise
+# 'VERSION' has the following format:
+# <tag>-<nb_commits>-<commit>
+#
+# With:
+# . tag: the most recent tag reachable from the current commit
+# . nb_commits: number of commits between the most recent tag and
+# the current commit.
+# . current commit, abbreviated.
+# For example: 1.22.3.real.434-5aafd
+# The version is stored in .version.
+#
+# - From a tarball, the version is taken from .tarball-version
+#
+# REVISION is the full revision given by git-version-gen, which can
+# have non-alphanumeric symbols.
+#
+# Also see configure.ac for the related SHORT_VERSION macro.
+
+MAJOR_VERSION = `echo $(VERSION) | cut -d . -f 1`
+MINOR_VERSION = `echo $(VERSION) | cut -d . -f 2`
+REVISION = `echo $(VERSION) | cut -d . -f 3`
+
+# Non-recursive makefile system. See Automake manual '7.3 An
+# Alternative Approach to Subdirectories'. We use a single Makefile.am
+# that includes other .am files, rather than using SUBDIRS. Note that
+# relative paths in the following .am files are relative to the top
+# source directory.
+
+include $(top_srcdir)/lib/gnulib.mk
+include $(top_srcdir)/arch/mingw/mingw.am
+include $(top_srcdir)/arch/misc/misc.am
+include $(top_srcdir)/contrib/chem/chem.am
+include $(top_srcdir)/contrib/eqn2graph/eqn2graph.am
+include $(top_srcdir)/contrib/gdiffmk/gdiffmk.am
+include $(top_srcdir)/contrib/glilypond/glilypond.am
+include $(top_srcdir)/contrib/gperl/gperl.am
+include $(top_srcdir)/contrib/gpinyin/gpinyin.am
+include $(top_srcdir)/contrib/grap2graph/grap2graph.am
+include $(top_srcdir)/contrib/hdtbl/hdtbl.am
+include $(top_srcdir)/contrib/mm/mm.am
+include $(top_srcdir)/contrib/mom/mom.am
+include $(top_srcdir)/contrib/pdfmark/pdfmark.am
+include $(top_srcdir)/contrib/pic2graph/pic2graph.am
+include $(top_srcdir)/contrib/rfc1345/rfc1345.am
+include $(top_srcdir)/contrib/sboxes/sboxes.am
+include $(top_srcdir)/doc/doc.am
+include $(top_srcdir)/font/devX100/devX100.am
+include $(top_srcdir)/font/devX100-12/devX100-12.am
+include $(top_srcdir)/font/devX75/devX75.am
+include $(top_srcdir)/font/devX75-12/devX75-12.am
+include $(top_srcdir)/font/devascii/devascii.am
+include $(top_srcdir)/font/devcp1047/devcp1047.am
+include $(top_srcdir)/font/devdvi/devdvi.am
+include $(top_srcdir)/font/devhtml/devhtml.am
+include $(top_srcdir)/font/devlatin1/devlatin1.am
+include $(top_srcdir)/font/devlbp/devlbp.am
+include $(top_srcdir)/font/devlj4/devlj4.am
+include $(top_srcdir)/font/devpdf/devpdf.am
+include $(top_srcdir)/font/devps/devps.am
+include $(top_srcdir)/font/devutf8/devutf8.am
+include $(top_srcdir)/font/scripts/scripts.am
+include $(top_srcdir)/man/man.am
+include $(top_srcdir)/src/include/include.am
+include $(top_srcdir)/src/libs/libbib/libbib.am
+include $(top_srcdir)/src/libs/libdriver/libdriver.am
+include $(top_srcdir)/src/libs/libgroff/libgroff.am
+include $(top_srcdir)/src/libs/libxutil/libxutil.am
+include $(top_srcdir)/src/devices/grodvi/grodvi.am
+include $(top_srcdir)/src/devices/grohtml/grohtml.am
+include $(top_srcdir)/src/devices/grolbp/grolbp.am
+include $(top_srcdir)/src/devices/grolj4/grolj4.am
+include $(top_srcdir)/src/devices/gropdf/gropdf.am
+include $(top_srcdir)/src/devices/grops/grops.am
+include $(top_srcdir)/src/devices/grotty/grotty.am
+include $(top_srcdir)/src/devices/xditview/xditview.am
+include $(top_srcdir)/src/preproc/eqn/eqn.am
+include $(top_srcdir)/src/preproc/grn/grn.am
+include $(top_srcdir)/src/preproc/html/html.am
+include $(top_srcdir)/src/preproc/pic/pic.am
+include $(top_srcdir)/src/preproc/preconv/preconv.am
+include $(top_srcdir)/src/preproc/refer/refer.am
+include $(top_srcdir)/src/preproc/soelim/soelim.am
+include $(top_srcdir)/src/preproc/tbl/tbl.am
+include $(top_srcdir)/src/roff/groff/groff.am
+include $(top_srcdir)/src/roff/nroff/nroff.am
+include $(top_srcdir)/src/roff/troff/troff.am
+include $(top_srcdir)/src/utils/addftinfo/addftinfo.am
+include $(top_srcdir)/src/utils/afmtodit/afmtodit.am
+include $(top_srcdir)/src/utils/grog/grog.am
+include $(top_srcdir)/src/utils/hpftodit/hpftodit.am
+include $(top_srcdir)/src/utils/indxbib/indxbib.am
+include $(top_srcdir)/src/utils/lkbib/lkbib.am
+include $(top_srcdir)/src/utils/lookbib/lookbib.am
+include $(top_srcdir)/src/utils/pfbtops/pfbtops.am
+include $(top_srcdir)/src/utils/tfmtodit/tfmtodit.am
+include $(top_srcdir)/src/utils/xtotroff/xtotroff.am
+include $(top_srcdir)/tmac/tmac.am
+
+# Adding defs.h to BUILT_SOURCES will ensure that it will be built on
+# make all or make check before all other targets. However, if another
+# target is built from a clean build tree, (for example make groff)
+# the files in BUILT_SOURCES will not be built first. That is why
+# additional dependencies were added in the .am files that list
+# objects that use defs (for example in groff.am:
+# src/roff/groff/groff.$(OBJEXT): defs.h)
+BUILT_SOURCES += defs.h
+
+.DELETE_ON_ERROR:
+.PRECIOUS: $(TEST_SUITE_LOG)
+
+# if there is a name prefix we install the man pages by hand
+all: generate_man_files
+install-data-hook: install-prefix-man
+uninstall-hook: uninstall-prefix-man
+if USEPROGRAMPREFIX
+generate_man_files: $(PREFIXMAN1)
+install-prefix-man:
+ for f in $(PREFIXMAN1); do \
+ cp -f $$f $(DESTDIR)$(man1dir)/$(NAMEPREFIX)`basename $$f`; \
+ done
+uninstall-prefix-man:
+ for f in $(PREFIXMAN1); do \
+ rm -f $(DESTDIR)$(man1dir)/$(NAMEPREFIX)`basename $$f`; \
+ done
+else
+man1_MANS += $(PREFIXMAN1)
+install-prefix-man:
+uninstall-prefix-man:
+generate_man_files:
+endif
+
+# Hook to create the 'current' symlink
+install-data-hook: create_current_symlink
+create_current_symlink:
+ cd $(DESTDIR)$(dataprogramdir); \
+ rm -f current; \
+ $(LN_S) $(SHORT_VERSION) current
+
+# Hook to move the binaries that potentially have a prefix from
+# prefixexecbindir to bindir.
+install-exec-hook: move_binaries_with_prefix
+move_binaries_with_prefix:
+if USEPROGRAMPREFIX
+ if test -n "$(NAMEPREFIX)"; then \
+ for f in $(prefixexecbin_PROGRAMS) $(prefixexecbin_SCRIPTS); do \
+ mv -f $(DESTDIR)$(prefixexecbindir)/$$f$(EXEEXT) \
+ $(DESTDIR)$(bindir)/$(NAMEPREFIX)$$f$(EXEEXT); \
+ done \
+ fi
+endif
+
+# Always create the site-font directory as a guide to the user.
+install-data-hook: install_site_font
+install_site_font:
+ -test -d $(DESTDIR)$(localfontdir) \
+ || $(mkinstalldirs) $(DESTDIR)$(localfontdir)
+
+# Create systemtmacdir if not present
+install-data-hook: install_tmacdir
+install_tmacdir:
+ -test -d $(DESTDIR)$(systemtmacdir) \
+ || $(mkinstalldirs) $(DESTDIR)$(systemtmacdir)
+
+# directories specific to groff
+uninstall-hook: uninstall_groffdirs
+uninstall_groffdirs:
+ if test -d $(DESTDIR)$(datasubdir); then \
+ rm -rf $(DESTDIR)$(fontdir); \
+ rm -rf $(DESTDIR)$(oldfontdir); \
+ rmdir $(DESTDIR)$(datasubdir); \
+ fi
+ if test -d $(DESTDIR)$(dataprogramdir); then \
+ if test -h $(DESTDIR)$(dataprogramdir)/current; then \
+ rm -f $(DESTDIR)$(dataprogramdir)/current; \
+ fi; \
+ if test -d $(DESTDIR)$(localfontdir); then \
+ rm -f $(DESTDIR)$(localfontdir)/*; \
+ rmdir $(DESTDIR)$(localfontdir); \
+ fi; \
+ rmdir $(DESTDIR)$(dataprogramdir); \
+ fi
+ if test -d $(DESTDIR)$(libprogramdir); then \
+ if test -d $(DESTDIR)$(systemtmacdir); then \
+ rm -f $(DESTDIR)$(systemtmacdir)/*; \
+ rmdir $(DESTDIR)$(systemtmacdir); \
+ fi; \
+ rmdir $(DESTDIR)$(libprogramdir); \
+ fi
+ if test -d $(DESTDIR)$(docdir); then \
+ if test -d $(DESTDIR)$(exampledir); then \
+ rmdir $(DESTDIR)$(exampledir); \
+ fi; \
+ if test -d $(DESTDIR)$(htmldocdir); then \
+ if test -d $(DESTDIR)$(htmldocdir)/groff.html.mono; then \
+ rmdir $(DESTDIR)$(htmldocdir)/groff.html.mono; \
+ fi; \
+ if test -d $(DESTDIR)$(htmldocdir)/groff.html.node; then \
+ rmdir $(DESTDIR)$(htmldocdir)/groff.html.node; \
+ fi; \
+ rmdir $(DESTDIR)$(htmldocdir); \
+ fi; \
+ rmdir $(DESTDIR)$(docdir); \
+ fi
+
+# Uninstall program that have a 'g' prefix
+uninstall-hook: uninstall_binaries_with_prefix
+uninstall_binaries_with_prefix:
+if USEPROGRAMPREFIX
+ if test -n "$(NAMEPREFIX)"; then \
+ for f in $(prefixexecbin_PROGRAMS) $(prefixexecbin_SCRIPTS); do \
+ rm -f $(DESTDIR)$(bindir)/$(NAMEPREFIX)$$f$(EXEEXT); \
+ done; \
+ fi
+endif
+
+# Other files that should be present in the distribution tarball.
+EXTRA_DIST += \
+ BUG-REPORT \
+ ChangeLog.115 \
+ ChangeLog.116 \
+ ChangeLog.117 \
+ ChangeLog.118 \
+ ChangeLog.119 \
+ ChangeLog.120 \
+ ChangeLog.121 \
+ ChangeLog.122 \
+ FDL \
+ FOR-RELEASE \
+ gendef.sh \
+ HACKING \
+ INSTALL.REPO \
+ INSTALL.extra \
+ LICENSES \
+ MANIFEST \
+ mdate.pl \
+ MORE.STUFF \
+ PROBLEMS \
+ PROJECTS \
+ README.MinGW \
+ arch/djgpp \
+ font/util/make-Rproto \
+ makevarescape.sed
+
+MOSTLYCLEANFILES += $(prefixexecbin_SCRIPTS) $(bin_SCRIPTS) \
+ $(man1_MANS) $(man5_MANS) $(man7_MANS) \
+ $(PREFIXMAN1)
+
+# Suffix rule to build .1, .5 and .7 files from .1.man, .5.man and
+# .7.man files. The brackets around the @ are used to prevent the
+# substitution of the variable by automake.
+#
+# The sed script transforms - to \-, ~ to \(ti, and so forth, (with an
+# extra layer of backslashes--see below) so that Makefile variables
+# containing ASCII characters that do not represent themselves literally
+# in *roff (see groff_char(7)) are correctly interpolated into man page
+# text.
+#
+# Note that while the script, combined with this target, will transform
+# ` to \(ga, including grave accents in Makefile variables is likely to
+# fail when the shell lexes the argument to echo within the old-style
+# command substitution `` below. Testing shows that grave accents
+# should work* if POSIX-style command substitution $() is done instead.
+# However, $() is less portable. (Triple-escaping grave accents \\\`
+# inside the interpolated Makefile variable will work, but is not
+# attempted here.)
+#
+# Note also that the amount of backslash-escaping in the sed script is
+# excessive (and incorrect) for normal purposes, but required here
+# because a command substitution is being nested inside yet another
+# invocation of sed.
+#
+# * For this target, no assurances about the good behavior of unusual
+# characters in Makefile variables in other aspects of the groff build
+# are offered.
+#
+# COMPATIBILITY_WRAPPERS is intended only for use in conditional
+# expressions in man pages (to see if the legacy macro package wrappers
+# feature is enabled) and not for expansion as formatted text.
+makevarescape=$(top_srcdir)/makevarescape.sed
+
+SUFFIXES += .man
+.man:
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && LC_ALL=C \
+ sed -e "s|[@]APPDEFDIR[@]|`echo $(appdefdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]BINDIR[@]|`echo $(bindir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]COMMON_WORDS_FILE[@]|`echo $(common_words_file) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]COMPATIBILITY_WRAPPERS[@]|$(compatibility_wrappers)|g" \
+ -e "s|[@]DATASUBDIR[@]|`echo $(datasubdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]DEFAULT_INDEX[@]|`echo $(indexdir)/$(indexname) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]DEFAULT_INDEX_NAME[@]|`echo $(indexname) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]DEVICE[@]|\\\\%$(DEVICE)|g" \
+ -e "s|[@]DOCDIR[@]|`echo $(docdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]EXAMPLEDIR[@]|`echo $(exampledir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]FONTDIR[@]|`echo $(fontdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]g[@]|\\\\%$(g)|g" \
+ -e "s|[@]HTMLDOCDIR[@]|`echo $(htmldocdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]INDEX_SUFFIX[@]|\\\\%$(indexext)|g" \
+ -e "s|[@]LEGACYFONTDIR[@]|`echo $(legacyfontdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]LOCALFONTDIR[@]|`echo $(localfontdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]LOCALMACRODIR[@]|`echo $(localtmacdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]MACRODIR[@]|`echo $(tmacdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]MAN1EXT[@]|$(man1ext)|g" \
+ -e "s|[@]MAN5EXT[@]|$(man5ext)|g" \
+ -e "s|[@]MAN7EXT[@]|$(man7ext)|g" \
+ -e "s|[@]MDATE[@]|`$(PERL) $(top_srcdir)/mdate.pl $<`|g" \
+ -e "s|[@]OLDFONTDIR[@]|`echo $(oldfontdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]PAGE[@]|\\\\%$(PAGE)|g" \
+ -e "s|[@]PDFDOCDIR[@]|`echo $(pdfdocdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]PSPRINT[@]|`echo $(PSPRINT) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]SYSTEMMACRODIR[@]|`echo $(systemtmacdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]TMAC_AN_PREFIX[@]|\\\\%$(tmac_an_prefix)|g" \
+ -e "s|[@]TMAC_M_PREFIX[@]|\\\\%$(tmac_m_prefix)|g" \
+ -e "s|[@]TMAC_MDIR[@]|`echo $(tmacdir) | sed -f $(makevarescape)`/mm|g" \
+ -e "s|[@]TMAC_S_PREFIX[@]|\\\\%$(tmac_s_prefix)|g" \
+ -e "s|[@]VERSION[@]|$(VERSION)|g" \
+ $< \
+ >$@
+
+# Version files - see script 'build-aux/git-version-gen'
+EXTRA_DIST += $(top_srcdir)/.version
+BUILT_SOURCES += $(top_srcdir)/.version
+$(top_srcdir)/.version:
+ echo $(VERSION) > $@-t && mv $@-t $@
+dist-hook:
+ echo $(VERSION) > $(distdir)/.tarball-version
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..a47df30
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,15815 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright (C) 1989-2023 Free Software Foundation, Inc.
+# Original Makefile.in written by James Clark (jjc@jclark.com)
+# Migrated to Automake by Bertrand Garrigues
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# Makefile.am
+#
+
+# The variables that are listed in the following comments will be
+# automatically set by automake in the generated Makefile.in
+
+# SHELL
+
+# PACKAGE_TARNAME
+
+# srcdir
+
+# top_srcdir
+
+# VPATH
+
+# top_builddir
+
+# HOST
+# `HOST' is the canonical host specification,
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+
+# Copyright (C) 2002-2023 Free Software Foundation, Inc.
+#
+# This file 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 3 of the License, or
+# (at your option) any later version.
+#
+# This file 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 file. If not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License,
+# this file may be distributed as part of a program that
+# contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# Generated by gnulib-tool.
+# Reproduce by:
+# gnulib-tool --import --local-dir=gl \
+# --lib=libgnu \
+# --source-base=lib \
+# --m4-base=gnulib_m4 \
+# --doc-base=doc \
+# --tests-base=tests \
+# --aux-dir=build-aux \
+# --makefile-name=gnulib.mk \
+# --automake-subdir \
+# --no-conditional-dependencies \
+# --no-libtool \
+# --macro-prefix=gl \
+# fprintf-posix \
+# git-version-gen \
+# havelib \
+# snprintf \
+# stdbool-c99 \
+# stdint \
+# vsnprintf \
+# wcwidth
+
+# Copyright (C) 2004-2023 Free Software Foundation, Inc.
+# Original Makefile.sub written by Keith Marshall
+# <keith.d.marshall@ntlworld.com>.
+# Adapted to Automake by Bertrand Garrigues
+# <bertrand.garrigues@laposte.net>.
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Automake rules for 'chem'
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+# Moved to automake by Bertrand Garrigues
+#
+# This file is part of 'chem' 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+#
+# '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.
+#
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+# Copyright (C) 2002-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# eqn2graph.am
+#
+
+# Automake rules for 'gdiffmk' (integration into the groff source tree)
+#
+# Copyright (C) 2004-2020 Free Software Foundation, Inc.
+# Written by Mike Bianchi <MBianchi@Foveal.com <mailto:MBianchi@Foveal.com>>
+# Automake migration by Bertrand Garrigues
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Automake rules for 'glilypond'
+
+# Copyright (C) 2013-2020 Free Software Foundation, Inc.
+# Written by Werner Lemberg <wl@gnu.org> and
+# Bernd Warken <groff-bernd.warken-72@web.de>.
+# Automake migration by Bertrand Garrigues
+
+# This file is part of 'glilypond' 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Automake rules for 'gperl' (preprocessor for added Perl parts)
+
+# Copyright (C) 2014-2020 Free Software Foundation, Inc.
+# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+# Automake migration by Bertrand Garrigues
+
+# This file is part of 'gperl' 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 of the License, 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 this program. If not, see
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+# Automake rules for 'gpinyin' (preprocessor for added Perl parts)
+
+# Copyright (C) 2014-2020 Free Software Foundation, Inc.
+# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+# Moved to automake by Bertrand Garrigues
+
+# This file is part of 'gpinyin' 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 of the License, 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 this program. If not, see
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+# Copyright (C) 2003-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# grap2graph.am
+#
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+# Written by Werner Lemberg <wl@gnu.org>
+# Automake migration by Bertrand Garrigues
+# <bertrand.garrigues@laposte.net>
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright 1991-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# mm.am
+#
+
+# Copyright (C) 2002-2020 Free Software Foundation, Inc.
+# Written by Werner Lemberg <wl@gnu.org>
+# Automake migration by Bertrand Garrigues
+# <bertrand.garrigues@laposte.net>
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2005-2021 Free Software Foundation, Inc.
+# Written by Keith Marshall (keith.d.marshall@ntlworld.com)
+# Automake migration by Bertrand Garrigues
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2001-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# pic2graph.am
+#
+
+# Copyright 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2021 Free Software Foundation, Inc.
+# Written by Bertrand Garrigues <bertrand.garrigues@laposte.net>
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2002-2022 Free Software Foundation, Inc.
+# Original Makefile.sub written by Werner Lemberg <wl@gnu.org>.
+# Adapted to Automake by Bertrand Garrigues
+# (bertrand.garrigues@laposte.net).
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2011-2020 Free Software Foundation, Inc.
+# Written by Deri James <deri@chuzzlewit.myzen.co.uk>
+# Automake migration by Bertrand Garrigues
+# <bertrand.garrigues@laposte.net>
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2015-2020 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 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Automake rules for 'include'
+#
+# Copyright (C) 2014-2020 Free Software Foundation, Inc.
+#
+# '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 of the License, 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 this program. If not, see
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+#
+########################################################################
+
+# Automake rules for 'libbib'
+#
+# Copyright (C) 2014-2020 Free Software Foundation, Inc.
+#
+# '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 of the License, 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 this program. If not, see
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+#
+########################################################################
+
+# Automake rules for 'libdriver'
+#
+# Copyright (C) 2014-2020 Free Software Foundation, Inc.
+#
+# '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 of the License, 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 this program. If not, see
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+#
+########################################################################
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Automake rules for 'libxutil'
+#
+# Copyright (C) 2014-2020 Free Software Foundation, Inc.
+#
+# '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 of the License, 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 this program. If not, see
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+#
+########################################################################
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2011-2020 Free Software Foundation, Inc.
+# Written by Deri James <deri@chuzzlewit.myzen.co.uk>
+# Automake migration by Bertrand Garrigues
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 1993-2020 Free Software Foundation, Inc.
+#
+# Original Makefile.sub rewritten by
+# Bernd Warken <groff-bernd.warken-72@web.de>
+# and Werner LEMBERG <wl@gnu.org>
+#
+# Automake migration by
+# Bertrand Garrigues <bertrand.garrigues@laposte.net>
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Automake rules for 'src utils addftinfo'
+#
+# Copyright (C) 2014-2020 Free Software Foundation, Inc.
+#
+# '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 of the License, 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 this program. If not, see
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+#
+########################################################################
+
+# Automake rules for 'src utils afmtodit'
+#
+# Copyright (C) 2013-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+########################################################################
+
+# Copyright (C) 1993-2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Automake rules for 'src utils hpftodit'
+#
+# Copyright (C) 2014-2020 Free Software Foundation, Inc.
+#
+# '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 of the License, 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 this program. If not, see
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+#
+########################################################################
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (C) 1989-2020 Free Software Foundation, Inc.
+# Written by James Clark <jjc@jclark.com>
+# Automake migration by Bertrand Garrigues
+# <bertrand.garrigues@laposte.net>
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = grodvi$(EXEEXT) post-grohtml$(EXEEXT) grolbp$(EXEEXT) \
+ grolj4$(EXEEXT) grops$(EXEEXT) grotty$(EXEEXT) $(am__EXEEXT_1) \
+ pre-grohtml$(EXEEXT) preconv$(EXEEXT) groff$(EXEEXT) \
+ addftinfo$(EXEEXT) hpftodit$(EXEEXT) lkbib$(EXEEXT) \
+ pfbtops$(EXEEXT) tfmtodit$(EXEEXT) $(am__EXEEXT_2)
+nobase_bin_PROGRAMS =
+check_PROGRAMS =
+prefixexecbin_PROGRAMS = eqn$(EXEEXT) grn$(EXEEXT) pic$(EXEEXT) \
+ refer$(EXEEXT) soelim$(EXEEXT) tbl$(EXEEXT) troff$(EXEEXT) \
+ indxbib$(EXEEXT) lookbib$(EXEEXT)
+@GL_COND_OBJ_FLOAT_TRUE@am__append_1 = lib/float.c
+@GL_COND_OBJ_ITOLD_TRUE@am__append_2 = lib/itold.c
+@GL_COND_OBJ_FREE_TRUE@am__append_3 = lib/free.c
+@GL_COND_OBJ_FSETERR_TRUE@am__append_4 = lib/fseterr.c
+@GL_COND_OBJ_MEMCHR_TRUE@am__append_5 = lib/memchr.c
+@GL_COND_OBJ_SIGNBIT3_TRUE@am__append_6 = lib/signbitf.c lib/signbitd.c lib/signbitl.c
+@GL_COND_OBJ_STDIO_READ_TRUE@am__append_7 = lib/stdio-read.c
+@GL_COND_OBJ_STDIO_WRITE_TRUE@am__append_8 = lib/stdio-write.c
+@LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE@am__append_9 = lib/uniwidth/width.c
+@GL_COND_OBJ_WCWIDTH_TRUE@am__append_10 = lib/wcwidth.c
+@BUILD_WINSCRIPTS_TRUE@am__append_11 = $(WINSCRIPTS)
+@BUILD_WINSCRIPTS_FALSE@am__append_12 = $(WINSCRIPTS)
+@HAVE_URW_FONTS_TRUE@@USE_GROPDF_TRUE@am__append_13 = contrib/mom/examples/typesetting.pdf
+@USE_PDFROFF_TRUE@am__append_14 = $(PDFDOCFILES)
+@USE_PDFROFF_FALSE@am__append_15 = $(PDFDOCFILES)
+@USE_GROFF_ALLOCATOR_TRUE@am__append_16 = \
+@USE_GROFF_ALLOCATOR_TRUE@ src/libs/libgroff/new.cpp
+
+@WITHOUT_X11_FALSE@am__append_17 = libxutil.a
+@WITHOUT_X11_TRUE@am__append_18 = $(GXDITVIEWSOURCES)
+@WITHOUT_X11_FALSE@am__append_19 = gxditview
+@WITHOUT_X11_FALSE@am__append_20 = $(XDITVIEW_GENHDRS)
+@WITHOUT_X11_FALSE@am__append_21 = $(GXDITVIEW_MAN1)
+@WITHOUT_X11_FALSE@am__append_22 = xtotroff
+@WITHOUT_X11_FALSE@am__append_23 = $(XTOTROFF_MAN1)
+@USEPROGRAMPREFIX_FALSE@am__append_24 = $(PREFIXMAN1)
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/gnulib_m4/00gnulib.m4 \
+ $(top_srcdir)/gnulib_m4/absolute-header.m4 \
+ $(top_srcdir)/gnulib_m4/alloca.m4 \
+ $(top_srcdir)/gnulib_m4/assert_h.m4 \
+ $(top_srcdir)/gnulib_m4/errno_h.m4 \
+ $(top_srcdir)/gnulib_m4/exponentd.m4 \
+ $(top_srcdir)/gnulib_m4/exponentf.m4 \
+ $(top_srcdir)/gnulib_m4/exponentl.m4 \
+ $(top_srcdir)/gnulib_m4/extensions.m4 \
+ $(top_srcdir)/gnulib_m4/extern-inline.m4 \
+ $(top_srcdir)/gnulib_m4/float_h.m4 \
+ $(top_srcdir)/gnulib_m4/fpieee.m4 \
+ $(top_srcdir)/gnulib_m4/fprintf-posix.m4 \
+ $(top_srcdir)/gnulib_m4/free.m4 \
+ $(top_srcdir)/gnulib_m4/frexp.m4 \
+ $(top_srcdir)/gnulib_m4/frexpl.m4 \
+ $(top_srcdir)/gnulib_m4/fseterr.m4 \
+ $(top_srcdir)/gnulib_m4/gnulib-common.m4 \
+ $(top_srcdir)/gnulib_m4/gnulib-comp.m4 \
+ $(top_srcdir)/gnulib_m4/include_next.m4 \
+ $(top_srcdir)/gnulib_m4/intmax_t.m4 \
+ $(top_srcdir)/gnulib_m4/inttypes.m4 \
+ $(top_srcdir)/gnulib_m4/inttypes_h.m4 \
+ $(top_srcdir)/gnulib_m4/isnand.m4 \
+ $(top_srcdir)/gnulib_m4/isnanf.m4 \
+ $(top_srcdir)/gnulib_m4/isnanl.m4 \
+ $(top_srcdir)/gnulib_m4/ldexpl.m4 \
+ $(top_srcdir)/gnulib_m4/libunistring-base.m4 \
+ $(top_srcdir)/gnulib_m4/limits-h.m4 \
+ $(top_srcdir)/gnulib_m4/math_h.m4 \
+ $(top_srcdir)/gnulib_m4/memchr.m4 \
+ $(top_srcdir)/gnulib_m4/mmap-anon.m4 \
+ $(top_srcdir)/gnulib_m4/multiarch.m4 \
+ $(top_srcdir)/gnulib_m4/nocrash.m4 \
+ $(top_srcdir)/gnulib_m4/off_t.m4 \
+ $(top_srcdir)/gnulib_m4/printf-frexp.m4 \
+ $(top_srcdir)/gnulib_m4/printf-frexpl.m4 \
+ $(top_srcdir)/gnulib_m4/printf.m4 \
+ $(top_srcdir)/gnulib_m4/signbit.m4 \
+ $(top_srcdir)/gnulib_m4/size_max.m4 \
+ $(top_srcdir)/gnulib_m4/snprintf.m4 \
+ $(top_srcdir)/gnulib_m4/ssize_t.m4 \
+ $(top_srcdir)/gnulib_m4/stdbool.m4 \
+ $(top_srcdir)/gnulib_m4/stddef_h.m4 \
+ $(top_srcdir)/gnulib_m4/stdint.m4 \
+ $(top_srcdir)/gnulib_m4/stdint_h.m4 \
+ $(top_srcdir)/gnulib_m4/stdio_h.m4 \
+ $(top_srcdir)/gnulib_m4/stdlib_h.m4 \
+ $(top_srcdir)/gnulib_m4/string_h.m4 \
+ $(top_srcdir)/gnulib_m4/sys_types_h.m4 \
+ $(top_srcdir)/gnulib_m4/unistd_h.m4 \
+ $(top_srcdir)/gnulib_m4/vasnprintf.m4 \
+ $(top_srcdir)/gnulib_m4/vsnprintf.m4 \
+ $(top_srcdir)/gnulib_m4/warn-on-use.m4 \
+ $(top_srcdir)/gnulib_m4/wchar_h.m4 \
+ $(top_srcdir)/gnulib_m4/wchar_t.m4 \
+ $(top_srcdir)/gnulib_m4/wctype_h.m4 \
+ $(top_srcdir)/gnulib_m4/wcwidth.m4 \
+ $(top_srcdir)/gnulib_m4/wint_t.m4 \
+ $(top_srcdir)/gnulib_m4/xsize.m4 \
+ $(top_srcdir)/gnulib_m4/zzgnulib.m4 $(top_srcdir)/acinclude.m4 \
+ $(top_srcdir)/m4/ax_compare_version.m4 \
+ $(top_srcdir)/m4/ax_prog_perl_version.m4 \
+ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \
+ $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/groff.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/localcharset.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+ $(am__configure_deps) $(dist_bin_SCRIPTS) \
+ $(dist_chemexample_DATA) $(dist_chempic_DATA) \
+ $(dist_devlj4font_DATA) $(dist_devlj4fontgen_DATA) \
+ $(dist_devpsfont_DATA) $(dist_devpsgen_DATA) \
+ $(dist_docexamples_DATA) $(dist_hdtblexample_DATA) \
+ $(dist_hdtbltmac_DATA) $(dist_localtmac_DATA) \
+ $(dist_mdoc_DATA) $(dist_mm_DATA) $(dist_mmexample_DATA) \
+ $(dist_momexample_DATA) $(dist_momtmac_DATA) \
+ $(dist_olddevpsfont_DATA) $(dist_otherdoc_DATA) \
+ $(dist_pdfmarktmac_DATA) $(dist_rfc1345tmac_DATA) \
+ $(dist_sboxestmac_DATA) $(dist_tmac_DATA) $(dist_tmacmm_DATA) \
+ $(am__DIST_COMMON)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/include/config.h
+CONFIG_CLEAN_FILES = test-groff
+CONFIG_CLEAN_VPATH_FILES =
+@WITHOUT_X11_FALSE@am__EXEEXT_1 = gxditview$(EXEEXT)
+@WITHOUT_X11_FALSE@am__EXEEXT_2 = xtotroff$(EXEEXT)
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" \
+ "$(DESTDIR)$(prefixexecbindir)" "$(DESTDIR)$(bindir)" \
+ "$(DESTDIR)$(bindir)" "$(DESTDIR)$(prefixexecbindir)" \
+ "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man5dir)" \
+ "$(DESTDIR)$(man7dir)" "$(DESTDIR)$(devX100_12_fontdir)" \
+ "$(DESTDIR)$(devX100_fontdir)" \
+ "$(DESTDIR)$(devX75_12_fontdir)" "$(DESTDIR)$(devX75_fontdir)" \
+ "$(DESTDIR)$(devasciifontdir)" "$(DESTDIR)$(devcp1047fontdir)" \
+ "$(DESTDIR)$(devdvifontdir)" "$(DESTDIR)$(devdvigendir)" \
+ "$(DESTDIR)$(devhtmlfontdir)" "$(DESTDIR)$(devlatin1fontdir)" \
+ "$(DESTDIR)$(devlbpfontdir)" "$(DESTDIR)$(devpdffontdir)" \
+ "$(DESTDIR)$(devpdffontencdir)" \
+ "$(DESTDIR)$(devpdffontmapdir)" "$(DESTDIR)$(devutf8fontdir)" \
+ "$(DESTDIR)$(chemexampledir)" "$(DESTDIR)$(chempicdir)" \
+ "$(DESTDIR)$(devlj4fontdir)" "$(DESTDIR)$(devlj4fontgendir)" \
+ "$(DESTDIR)$(devpsfontdir)" "$(DESTDIR)$(devpsgendir)" \
+ "$(DESTDIR)$(docexamplesdir)" "$(DESTDIR)$(hdtblexampledir)" \
+ "$(DESTDIR)$(hdtbltmacdir)" "$(DESTDIR)$(localtmacdir)" \
+ "$(DESTDIR)$(mdocdir)" "$(DESTDIR)$(mmdir)" \
+ "$(DESTDIR)$(mmexampledir)" "$(DESTDIR)$(momexampledir)" \
+ "$(DESTDIR)$(momtmacdir)" "$(DESTDIR)$(olddevpsfontdir)" \
+ "$(DESTDIR)$(otherdocdir)" "$(DESTDIR)$(pdfmarktmacdir)" \
+ "$(DESTDIR)$(rfc1345tmacdir)" "$(DESTDIR)$(sboxestmacdir)" \
+ "$(DESTDIR)$(tmacdir)" "$(DESTDIR)$(tmacmmdir)" \
+ "$(DESTDIR)$(htmlpicdir)" "$(DESTDIR)$(momhtmldir)" \
+ "$(DESTDIR)$(chemexampledir)" "$(DESTDIR)$(chemexample122dir)" \
+ "$(DESTDIR)$(devlj4fontdir)" "$(DESTDIR)$(devpsfontdir)" \
+ "$(DESTDIR)$(docexamplesdir)" "$(DESTDIR)$(docpdfdocdir)" \
+ "$(DESTDIR)$(hdtblexampledir)" \
+ "$(DESTDIR)$(momprocessedexampledir)" \
+ "$(DESTDIR)$(otherdocdir)" "$(DESTDIR)$(pdfmarkpdfdocdir)" \
+ "$(DESTDIR)$(sboxesotherdocdir)" \
+ "$(DESTDIR)$(sboxespdfdocdir)" "$(DESTDIR)$(tmacdir)"
+PROGRAMS = $(bin_PROGRAMS) $(nobase_bin_PROGRAMS) \
+ $(prefixexecbin_PROGRAMS)
+LIBRARIES = $(noinst_LIBRARIES)
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo " AR " $@;
+am__v_AR_1 =
+lib_libgnu_a_AR = $(AR) $(ARFLAGS)
+am__DEPENDENCIES_1 =
+am__lib_libgnu_a_SOURCES_DIST = lib/float.c lib/itold.c lib/free.c \
+ lib/fseterr.c lib/localcharset.c lib/math.c lib/memchr.c \
+ lib/printf-frexp.c lib/printf-frexpl.c lib/signbitf.c \
+ lib/signbitd.c lib/signbitl.c lib/size_max.h lib/stdio-read.c \
+ lib/stdio-write.c lib/unistd.c lib/uniwidth/width.c \
+ lib/wctype-h.c lib/wcwidth.c lib/xsize.h lib/xsize.c
+am__dirstamp = $(am__leading_dot)dirstamp
+@GL_COND_OBJ_FLOAT_TRUE@am__objects_1 = lib/libgnu_a-float.$(OBJEXT)
+@GL_COND_OBJ_ITOLD_TRUE@am__objects_2 = lib/libgnu_a-itold.$(OBJEXT)
+@GL_COND_OBJ_FREE_TRUE@am__objects_3 = lib/libgnu_a-free.$(OBJEXT)
+@GL_COND_OBJ_FSETERR_TRUE@am__objects_4 = \
+@GL_COND_OBJ_FSETERR_TRUE@ lib/libgnu_a-fseterr.$(OBJEXT)
+@GL_COND_OBJ_MEMCHR_TRUE@am__objects_5 = \
+@GL_COND_OBJ_MEMCHR_TRUE@ lib/libgnu_a-memchr.$(OBJEXT)
+@GL_COND_OBJ_SIGNBIT3_TRUE@am__objects_6 = \
+@GL_COND_OBJ_SIGNBIT3_TRUE@ lib/libgnu_a-signbitf.$(OBJEXT) \
+@GL_COND_OBJ_SIGNBIT3_TRUE@ lib/libgnu_a-signbitd.$(OBJEXT) \
+@GL_COND_OBJ_SIGNBIT3_TRUE@ lib/libgnu_a-signbitl.$(OBJEXT)
+@GL_COND_OBJ_STDIO_READ_TRUE@am__objects_7 = lib/libgnu_a-stdio-read.$(OBJEXT)
+@GL_COND_OBJ_STDIO_WRITE_TRUE@am__objects_8 = lib/libgnu_a-stdio-write.$(OBJEXT)
+@LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE@am__objects_9 = lib/uniwidth/libgnu_a-width.$(OBJEXT)
+@GL_COND_OBJ_WCWIDTH_TRUE@am__objects_10 = \
+@GL_COND_OBJ_WCWIDTH_TRUE@ lib/libgnu_a-wcwidth.$(OBJEXT)
+am_lib_libgnu_a_OBJECTS = $(am__objects_1) $(am__objects_2) \
+ $(am__objects_3) $(am__objects_4) \
+ lib/libgnu_a-localcharset.$(OBJEXT) \
+ lib/libgnu_a-math.$(OBJEXT) $(am__objects_5) \
+ lib/libgnu_a-printf-frexp.$(OBJEXT) \
+ lib/libgnu_a-printf-frexpl.$(OBJEXT) $(am__objects_6) \
+ $(am__objects_7) $(am__objects_8) \
+ lib/libgnu_a-unistd.$(OBJEXT) $(am__objects_9) \
+ lib/libgnu_a-wctype-h.$(OBJEXT) $(am__objects_10) \
+ lib/libgnu_a-xsize.$(OBJEXT)
+lib_libgnu_a_OBJECTS = $(am_lib_libgnu_a_OBJECTS)
+libbib_a_AR = $(AR) $(ARFLAGS)
+libbib_a_LIBADD =
+am_libbib_a_OBJECTS = src/libs/libbib/common.$(OBJEXT) \
+ src/libs/libbib/index.$(OBJEXT) \
+ src/libs/libbib/linear.$(OBJEXT) \
+ src/libs/libbib/search.$(OBJEXT) src/libs/libbib/map.$(OBJEXT)
+libbib_a_OBJECTS = $(am_libbib_a_OBJECTS)
+libdriver_a_AR = $(AR) $(ARFLAGS)
+libdriver_a_LIBADD =
+am_libdriver_a_OBJECTS = src/libs/libdriver/input.$(OBJEXT) \
+ src/libs/libdriver/printer.$(OBJEXT)
+libdriver_a_OBJECTS = $(am_libdriver_a_OBJECTS)
+libgroff_a_AR = $(AR) $(ARFLAGS)
+libgroff_a_LIBADD =
+am__libgroff_a_SOURCES_DIST = src/libs/libgroff/assert.cpp \
+ src/libs/libgroff/change_lf.cpp src/libs/libgroff/cmap.cpp \
+ src/libs/libgroff/color.cpp src/libs/libgroff/cset.cpp \
+ src/libs/libgroff/curtime.cpp src/libs/libgroff/device.cpp \
+ src/libs/libgroff/errarg.cpp src/libs/libgroff/error.cpp \
+ src/libs/libgroff/fatal.cpp src/libs/libgroff/filename.cpp \
+ src/libs/libgroff/font.cpp src/libs/libgroff/fontfile.cpp \
+ src/libs/libgroff/geometry.cpp src/libs/libgroff/getopt.c \
+ src/libs/libgroff/getopt1.c src/libs/libgroff/glyphuni.cpp \
+ src/libs/libgroff/htmlhint.cpp src/libs/libgroff/hypot.cpp \
+ src/libs/libgroff/iftoa.c src/libs/libgroff/invalid.cpp \
+ src/libs/libgroff/itoa.c src/libs/libgroff/lf.cpp \
+ src/libs/libgroff/lineno.cpp src/libs/libgroff/localcharset.c \
+ src/libs/libgroff/macropath.cpp src/libs/libgroff/matherr.c \
+ src/libs/libgroff/maxfilename.cpp \
+ src/libs/libgroff/maxpathname.cpp src/libs/libgroff/mksdir.cpp \
+ src/libs/libgroff/nametoindex.cpp src/libs/libgroff/paper.cpp \
+ src/libs/libgroff/prime.cpp src/libs/libgroff/progname.c \
+ src/libs/libgroff/ptable.cpp src/libs/libgroff/quotearg.c \
+ src/libs/libgroff/relocate.cpp \
+ src/libs/libgroff/searchpath.cpp src/libs/libgroff/spawnvp.c \
+ src/libs/libgroff/string.cpp src/libs/libgroff/strsave.cpp \
+ src/libs/libgroff/symbol.cpp src/libs/libgroff/tmpfile.cpp \
+ src/libs/libgroff/tmpname.cpp src/libs/libgroff/unicode.cpp \
+ src/libs/libgroff/uniglyph.cpp src/libs/libgroff/uniuni.cpp \
+ src/libs/libgroff/relocatable.h src/libs/libgroff/new.cpp
+@USE_GROFF_ALLOCATOR_TRUE@am__objects_11 = src/libs/libgroff/libgroff_a-new.$(OBJEXT)
+am_libgroff_a_OBJECTS = src/libs/libgroff/libgroff_a-assert.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-change_lf.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-cmap.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-color.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-cset.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-curtime.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-device.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-errarg.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-error.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-fatal.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-filename.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-font.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-fontfile.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-geometry.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-getopt.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-getopt1.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-glyphuni.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-htmlhint.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-hypot.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-iftoa.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-invalid.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-itoa.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-lf.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-lineno.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-localcharset.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-macropath.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-matherr.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-maxfilename.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-maxpathname.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-mksdir.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-nametoindex.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-paper.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-prime.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-progname.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-ptable.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-quotearg.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-relocate.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-searchpath.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-spawnvp.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-string.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-strsave.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-symbol.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-tmpfile.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-tmpname.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-unicode.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-uniglyph.$(OBJEXT) \
+ src/libs/libgroff/libgroff_a-uniuni.$(OBJEXT) \
+ $(am__objects_11)
+nodist_libgroff_a_OBJECTS = \
+ src/libs/libgroff/libgroff_a-version.$(OBJEXT)
+libgroff_a_OBJECTS = $(am_libgroff_a_OBJECTS) \
+ $(nodist_libgroff_a_OBJECTS)
+libxutil_a_AR = $(AR) $(ARFLAGS)
+libxutil_a_LIBADD =
+am__libxutil_a_SOURCES_DIST = src/libs/libxutil/DviChar.c \
+ src/libs/libxutil/XFontName.c src/libs/libxutil/xmalloc.c
+@WITHOUT_X11_FALSE@am_libxutil_a_OBJECTS = src/libs/libxutil/libxutil_a-DviChar.$(OBJEXT) \
+@WITHOUT_X11_FALSE@ src/libs/libxutil/libxutil_a-XFontName.$(OBJEXT) \
+@WITHOUT_X11_FALSE@ src/libs/libxutil/libxutil_a-xmalloc.$(OBJEXT)
+libxutil_a_OBJECTS = $(am_libxutil_a_OBJECTS)
+am_addftinfo_OBJECTS = src/utils/addftinfo/addftinfo.$(OBJEXT) \
+ src/utils/addftinfo/guess.$(OBJEXT)
+addftinfo_OBJECTS = $(am_addftinfo_OBJECTS)
+addftinfo_DEPENDENCIES = libgroff.a lib/libgnu.a
+am_eqn_OBJECTS = src/preproc/eqn/eqn-main.$(OBJEXT) \
+ src/preproc/eqn/eqn-lex.$(OBJEXT) \
+ src/preproc/eqn/eqn-box.$(OBJEXT) \
+ src/preproc/eqn/eqn-limit.$(OBJEXT) \
+ src/preproc/eqn/eqn-list.$(OBJEXT) \
+ src/preproc/eqn/eqn-over.$(OBJEXT) \
+ src/preproc/eqn/eqn-text.$(OBJEXT) \
+ src/preproc/eqn/eqn-script.$(OBJEXT) \
+ src/preproc/eqn/eqn-mark.$(OBJEXT) \
+ src/preproc/eqn/eqn-other.$(OBJEXT) \
+ src/preproc/eqn/eqn-delim.$(OBJEXT) \
+ src/preproc/eqn/eqn-sqrt.$(OBJEXT) \
+ src/preproc/eqn/eqn-pile.$(OBJEXT) \
+ src/preproc/eqn/eqn-special.$(OBJEXT) \
+ src/preproc/eqn/eqn-eqn.$(OBJEXT)
+eqn_OBJECTS = $(am_eqn_OBJECTS)
+eqn_DEPENDENCIES = $(am__DEPENDENCIES_1) libgroff.a lib/libgnu.a
+am_grn_OBJECTS = src/preproc/grn/hdb.$(OBJEXT) \
+ src/preproc/grn/hpoint.$(OBJEXT) \
+ src/preproc/grn/hgraph.$(OBJEXT) \
+ src/preproc/grn/main.$(OBJEXT)
+grn_OBJECTS = $(am_grn_OBJECTS)
+grn_DEPENDENCIES = libgroff.a lib/libgnu.a $(am__DEPENDENCIES_1)
+am_grodvi_OBJECTS = src/devices/grodvi/dvi.$(OBJEXT)
+grodvi_OBJECTS = $(am_grodvi_OBJECTS)
+grodvi_DEPENDENCIES = libdriver.a libgroff.a lib/libgnu.a \
+ $(am__DEPENDENCIES_1)
+am_groff_OBJECTS = src/roff/groff/groff.$(OBJEXT) \
+ src/roff/groff/pipeline.$(OBJEXT)
+groff_OBJECTS = $(am_groff_OBJECTS)
+groff_DEPENDENCIES = libgroff.a lib/libgnu.a $(am__DEPENDENCIES_1)
+am_grolbp_OBJECTS = src/devices/grolbp/lbp.$(OBJEXT)
+grolbp_OBJECTS = $(am_grolbp_OBJECTS)
+grolbp_DEPENDENCIES = $(am__DEPENDENCIES_1) libdriver.a libgroff.a \
+ lib/libgnu.a
+am_grolj4_OBJECTS = src/devices/grolj4/lj4.$(OBJEXT)
+grolj4_OBJECTS = $(am_grolj4_OBJECTS)
+grolj4_DEPENDENCIES = $(am__DEPENDENCIES_1) libdriver.a libgroff.a \
+ lib/libgnu.a
+am_grops_OBJECTS = src/devices/grops/ps.$(OBJEXT) \
+ src/devices/grops/psrm.$(OBJEXT)
+grops_OBJECTS = $(am_grops_OBJECTS)
+grops_DEPENDENCIES = $(am__DEPENDENCIES_1) libdriver.a libgroff.a \
+ lib/libgnu.a
+am_grotty_OBJECTS = src/devices/grotty/tty.$(OBJEXT)
+grotty_OBJECTS = $(am_grotty_OBJECTS)
+grotty_DEPENDENCIES = $(am__DEPENDENCIES_1) libdriver.a libgroff.a \
+ lib/libgnu.a
+am__gxditview_SOURCES_DIST = src/devices/xditview/device.c \
+ src/devices/xditview/draw.c src/devices/xditview/draw.h \
+ src/devices/xditview/Dvi.c src/devices/xditview/font.c \
+ src/devices/xditview/font.h src/devices/xditview/lex.c \
+ src/devices/xditview/lex.h src/devices/xditview/page.c \
+ src/devices/xditview/page.h src/devices/xditview/parse.c \
+ src/devices/xditview/parse.h src/devices/xditview/xditview.c \
+ src/devices/xditview/device.h src/devices/xditview/DviP.h \
+ src/devices/xditview/Menu.h src/devices/xditview/Dvi.h
+am__objects_12 = src/devices/xditview/gxditview-device.$(OBJEXT) \
+ src/devices/xditview/gxditview-draw.$(OBJEXT) \
+ src/devices/xditview/gxditview-Dvi.$(OBJEXT) \
+ src/devices/xditview/gxditview-font.$(OBJEXT) \
+ src/devices/xditview/gxditview-lex.$(OBJEXT) \
+ src/devices/xditview/gxditview-page.$(OBJEXT) \
+ src/devices/xditview/gxditview-parse.$(OBJEXT) \
+ src/devices/xditview/gxditview-xditview.$(OBJEXT)
+@WITHOUT_X11_FALSE@am_gxditview_OBJECTS = $(am__objects_12)
+am__objects_13 =
+@WITHOUT_X11_FALSE@am__objects_14 = $(am__objects_13)
+@WITHOUT_X11_FALSE@nodist_gxditview_OBJECTS = $(am__objects_14)
+gxditview_OBJECTS = $(am_gxditview_OBJECTS) \
+ $(nodist_gxditview_OBJECTS)
+@WITHOUT_X11_FALSE@gxditview_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+@WITHOUT_X11_FALSE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+@WITHOUT_X11_FALSE@ $(am__DEPENDENCIES_1) libxutil.a \
+@WITHOUT_X11_FALSE@ lib/libgnu.a
+am_hpftodit_OBJECTS = src/utils/hpftodit/hpftodit.$(OBJEXT) \
+ src/utils/hpftodit/hpuni.$(OBJEXT)
+hpftodit_OBJECTS = $(am_hpftodit_OBJECTS)
+hpftodit_DEPENDENCIES = libgroff.a $(am__DEPENDENCIES_1) lib/libgnu.a
+am_indxbib_OBJECTS = src/utils/indxbib/indxbib.$(OBJEXT) \
+ src/utils/indxbib/signal.$(OBJEXT)
+indxbib_OBJECTS = $(am_indxbib_OBJECTS)
+indxbib_DEPENDENCIES = libbib.a libgroff.a $(am__DEPENDENCIES_1) \
+ lib/libgnu.a
+am_lkbib_OBJECTS = src/utils/lkbib/lkbib.$(OBJEXT)
+lkbib_OBJECTS = $(am_lkbib_OBJECTS)
+lkbib_DEPENDENCIES = libbib.a libgroff.a $(am__DEPENDENCIES_1) \
+ lib/libgnu.a
+am_lookbib_OBJECTS = src/utils/lookbib/lookbib.$(OBJEXT)
+lookbib_OBJECTS = $(am_lookbib_OBJECTS)
+lookbib_DEPENDENCIES = libbib.a libgroff.a $(am__DEPENDENCIES_1) \
+ lib/libgnu.a
+am_pfbtops_OBJECTS = src/utils/pfbtops/pfbtops.$(OBJEXT)
+pfbtops_OBJECTS = $(am_pfbtops_OBJECTS)
+pfbtops_DEPENDENCIES = libgroff.a $(am__DEPENDENCIES_1) lib/libgnu.a
+am_pic_OBJECTS = src/preproc/pic/pic-pic.$(OBJEXT) \
+ src/preproc/pic/pic-lex.$(OBJEXT) \
+ src/preproc/pic/pic-main.$(OBJEXT) \
+ src/preproc/pic/pic-object.$(OBJEXT) \
+ src/preproc/pic/pic-common.$(OBJEXT) \
+ src/preproc/pic/pic-troff.$(OBJEXT) \
+ src/preproc/pic/pic-tex.$(OBJEXT)
+pic_OBJECTS = $(am_pic_OBJECTS)
+pic_DEPENDENCIES = libgroff.a $(am__DEPENDENCIES_1) lib/libgnu.a
+am_post_grohtml_OBJECTS = src/devices/grohtml/post-html.$(OBJEXT) \
+ src/devices/grohtml/html-table.$(OBJEXT) \
+ src/devices/grohtml/html-text.$(OBJEXT) \
+ src/devices/grohtml/output.$(OBJEXT)
+post_grohtml_OBJECTS = $(am_post_grohtml_OBJECTS)
+post_grohtml_DEPENDENCIES = $(am__DEPENDENCIES_1) libdriver.a \
+ libgroff.a lib/libgnu.a
+am_pre_grohtml_OBJECTS = src/preproc/html/pre-html.$(OBJEXT) \
+ src/preproc/html/pushback.$(OBJEXT)
+pre_grohtml_OBJECTS = $(am_pre_grohtml_OBJECTS)
+pre_grohtml_DEPENDENCIES = libgroff.a lib/libgnu.a \
+ $(am__DEPENDENCIES_1)
+am_preconv_OBJECTS = src/preproc/preconv/preconv-preconv.$(OBJEXT)
+preconv_OBJECTS = $(am_preconv_OBJECTS)
+preconv_DEPENDENCIES = libgroff.a $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) lib/libgnu.a
+am_refer_OBJECTS = src/preproc/refer/refer-command.$(OBJEXT) \
+ src/preproc/refer/refer-ref.$(OBJEXT) \
+ src/preproc/refer/refer-refer.$(OBJEXT) \
+ src/preproc/refer/refer-token.$(OBJEXT) \
+ src/preproc/refer/refer-label.$(OBJEXT)
+refer_OBJECTS = $(am_refer_OBJECTS)
+refer_DEPENDENCIES = libbib.a libgroff.a $(am__DEPENDENCIES_1) \
+ lib/libgnu.a
+am_soelim_OBJECTS = src/preproc/soelim/soelim.$(OBJEXT)
+soelim_OBJECTS = $(am_soelim_OBJECTS)
+soelim_DEPENDENCIES = libgroff.a $(am__DEPENDENCIES_1) lib/libgnu.a
+am_tbl_OBJECTS = src/preproc/tbl/main.$(OBJEXT) \
+ src/preproc/tbl/table.$(OBJEXT)
+tbl_OBJECTS = $(am_tbl_OBJECTS)
+tbl_DEPENDENCIES = libgroff.a $(am__DEPENDENCIES_1) lib/libgnu.a
+am_tfmtodit_OBJECTS = src/utils/tfmtodit/tfmtodit.$(OBJEXT)
+tfmtodit_OBJECTS = $(am_tfmtodit_OBJECTS)
+tfmtodit_DEPENDENCIES = libgroff.a $(am__DEPENDENCIES_1) lib/libgnu.a
+am_troff_OBJECTS = src/roff/troff/dictionary.$(OBJEXT) \
+ src/roff/troff/div.$(OBJEXT) src/roff/troff/env.$(OBJEXT) \
+ src/roff/troff/input.$(OBJEXT) src/roff/troff/mtsm.$(OBJEXT) \
+ src/roff/troff/node.$(OBJEXT) src/roff/troff/number.$(OBJEXT) \
+ src/roff/troff/reg.$(OBJEXT)
+nodist_troff_OBJECTS = src/roff/troff/majorminor.$(OBJEXT)
+troff_OBJECTS = $(am_troff_OBJECTS) $(nodist_troff_OBJECTS)
+troff_DEPENDENCIES = libgroff.a lib/libgnu.a $(am__DEPENDENCIES_1)
+am__xtotroff_SOURCES_DIST = src/utils/xtotroff/xtotroff.c
+@WITHOUT_X11_FALSE@am_xtotroff_OBJECTS = src/utils/xtotroff/xtotroff-xtotroff.$(OBJEXT)
+xtotroff_OBJECTS = $(am_xtotroff_OBJECTS)
+@WITHOUT_X11_FALSE@xtotroff_DEPENDENCIES = libxutil.a libgroff.a \
+@WITHOUT_X11_FALSE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+@WITHOUT_X11_FALSE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+@WITHOUT_X11_FALSE@ lib/libgnu.a
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+SCRIPTS = $(bin_SCRIPTS) $(dist_bin_SCRIPTS) $(prefixexecbin_SCRIPTS)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/include
+depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = lib/$(DEPDIR)/libgnu_a-asnprintf.Po \
+ lib/$(DEPDIR)/libgnu_a-float.Po \
+ lib/$(DEPDIR)/libgnu_a-fprintf.Po \
+ lib/$(DEPDIR)/libgnu_a-free.Po lib/$(DEPDIR)/libgnu_a-frexp.Po \
+ lib/$(DEPDIR)/libgnu_a-frexpl.Po \
+ lib/$(DEPDIR)/libgnu_a-fseterr.Po \
+ lib/$(DEPDIR)/libgnu_a-isnan.Po \
+ lib/$(DEPDIR)/libgnu_a-isnand.Po \
+ lib/$(DEPDIR)/libgnu_a-isnanf.Po \
+ lib/$(DEPDIR)/libgnu_a-isnanl.Po \
+ lib/$(DEPDIR)/libgnu_a-itold.Po \
+ lib/$(DEPDIR)/libgnu_a-localcharset.Po \
+ lib/$(DEPDIR)/libgnu_a-math.Po \
+ lib/$(DEPDIR)/libgnu_a-memchr.Po \
+ lib/$(DEPDIR)/libgnu_a-printf-args.Po \
+ lib/$(DEPDIR)/libgnu_a-printf-frexp.Po \
+ lib/$(DEPDIR)/libgnu_a-printf-frexpl.Po \
+ lib/$(DEPDIR)/libgnu_a-printf-parse.Po \
+ lib/$(DEPDIR)/libgnu_a-signbitd.Po \
+ lib/$(DEPDIR)/libgnu_a-signbitf.Po \
+ lib/$(DEPDIR)/libgnu_a-signbitl.Po \
+ lib/$(DEPDIR)/libgnu_a-snprintf.Po \
+ lib/$(DEPDIR)/libgnu_a-stdio-read.Po \
+ lib/$(DEPDIR)/libgnu_a-stdio-write.Po \
+ lib/$(DEPDIR)/libgnu_a-unistd.Po \
+ lib/$(DEPDIR)/libgnu_a-vasnprintf.Po \
+ lib/$(DEPDIR)/libgnu_a-vsnprintf.Po \
+ lib/$(DEPDIR)/libgnu_a-wctype-h.Po \
+ lib/$(DEPDIR)/libgnu_a-wcwidth.Po \
+ lib/$(DEPDIR)/libgnu_a-xsize.Po \
+ lib/uniwidth/$(DEPDIR)/libgnu_a-width.Po \
+ src/devices/grodvi/$(DEPDIR)/dvi.Po \
+ src/devices/grohtml/$(DEPDIR)/html-table.Po \
+ src/devices/grohtml/$(DEPDIR)/html-text.Po \
+ src/devices/grohtml/$(DEPDIR)/output.Po \
+ src/devices/grohtml/$(DEPDIR)/post-html.Po \
+ src/devices/grolbp/$(DEPDIR)/lbp.Po \
+ src/devices/grolj4/$(DEPDIR)/lj4.Po \
+ src/devices/grops/$(DEPDIR)/ps.Po \
+ src/devices/grops/$(DEPDIR)/psrm.Po \
+ src/devices/grotty/$(DEPDIR)/tty.Po \
+ src/devices/xditview/$(DEPDIR)/gxditview-Dvi.Po \
+ src/devices/xditview/$(DEPDIR)/gxditview-device.Po \
+ src/devices/xditview/$(DEPDIR)/gxditview-draw.Po \
+ src/devices/xditview/$(DEPDIR)/gxditview-font.Po \
+ src/devices/xditview/$(DEPDIR)/gxditview-lex.Po \
+ src/devices/xditview/$(DEPDIR)/gxditview-page.Po \
+ src/devices/xditview/$(DEPDIR)/gxditview-parse.Po \
+ src/devices/xditview/$(DEPDIR)/gxditview-xditview.Po \
+ src/libs/libbib/$(DEPDIR)/common.Po \
+ src/libs/libbib/$(DEPDIR)/index.Po \
+ src/libs/libbib/$(DEPDIR)/linear.Po \
+ src/libs/libbib/$(DEPDIR)/map.Po \
+ src/libs/libbib/$(DEPDIR)/search.Po \
+ src/libs/libdriver/$(DEPDIR)/input.Po \
+ src/libs/libdriver/$(DEPDIR)/printer.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-assert.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-change_lf.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-cmap.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-color.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-cset.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-curtime.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-device.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-errarg.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-error.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-fatal.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-filename.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-font.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-fontfile.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-geometry.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt1.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-glyphuni.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-htmlhint.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-hypot.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-iftoa.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-invalid.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-itoa.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-lf.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-lineno.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-localcharset.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-macropath.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-matherr.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-maxfilename.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-maxpathname.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-mksdir.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-nametoindex.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-paper.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-prime.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-progname.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-ptable.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-quotearg.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-relocate.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-searchpath.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-spawnvp.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-string.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-strsave.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-symbol.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-tmpfile.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-tmpname.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-unicode.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-uniglyph.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-uniuni.Po \
+ src/libs/libgroff/$(DEPDIR)/libgroff_a-version.Po \
+ src/libs/libxutil/$(DEPDIR)/libxutil_a-DviChar.Po \
+ src/libs/libxutil/$(DEPDIR)/libxutil_a-XFontName.Po \
+ src/libs/libxutil/$(DEPDIR)/libxutil_a-xmalloc.Po \
+ src/preproc/eqn/$(DEPDIR)/eqn-box.Po \
+ src/preproc/eqn/$(DEPDIR)/eqn-delim.Po \
+ src/preproc/eqn/$(DEPDIR)/eqn-eqn.Po \
+ src/preproc/eqn/$(DEPDIR)/eqn-lex.Po \
+ src/preproc/eqn/$(DEPDIR)/eqn-limit.Po \
+ src/preproc/eqn/$(DEPDIR)/eqn-list.Po \
+ src/preproc/eqn/$(DEPDIR)/eqn-main.Po \
+ src/preproc/eqn/$(DEPDIR)/eqn-mark.Po \
+ src/preproc/eqn/$(DEPDIR)/eqn-other.Po \
+ src/preproc/eqn/$(DEPDIR)/eqn-over.Po \
+ src/preproc/eqn/$(DEPDIR)/eqn-pile.Po \
+ src/preproc/eqn/$(DEPDIR)/eqn-script.Po \
+ src/preproc/eqn/$(DEPDIR)/eqn-special.Po \
+ src/preproc/eqn/$(DEPDIR)/eqn-sqrt.Po \
+ src/preproc/eqn/$(DEPDIR)/eqn-text.Po \
+ src/preproc/grn/$(DEPDIR)/hdb.Po \
+ src/preproc/grn/$(DEPDIR)/hgraph.Po \
+ src/preproc/grn/$(DEPDIR)/hpoint.Po \
+ src/preproc/grn/$(DEPDIR)/main.Po \
+ src/preproc/html/$(DEPDIR)/pre-html.Po \
+ src/preproc/html/$(DEPDIR)/pushback.Po \
+ src/preproc/pic/$(DEPDIR)/pic-common.Po \
+ src/preproc/pic/$(DEPDIR)/pic-lex.Po \
+ src/preproc/pic/$(DEPDIR)/pic-main.Po \
+ src/preproc/pic/$(DEPDIR)/pic-object.Po \
+ src/preproc/pic/$(DEPDIR)/pic-pic.Po \
+ src/preproc/pic/$(DEPDIR)/pic-tex.Po \
+ src/preproc/pic/$(DEPDIR)/pic-troff.Po \
+ src/preproc/preconv/$(DEPDIR)/preconv-preconv.Po \
+ src/preproc/refer/$(DEPDIR)/refer-command.Po \
+ src/preproc/refer/$(DEPDIR)/refer-label.Po \
+ src/preproc/refer/$(DEPDIR)/refer-ref.Po \
+ src/preproc/refer/$(DEPDIR)/refer-refer.Po \
+ src/preproc/refer/$(DEPDIR)/refer-token.Po \
+ src/preproc/soelim/$(DEPDIR)/soelim.Po \
+ src/preproc/tbl/$(DEPDIR)/main.Po \
+ src/preproc/tbl/$(DEPDIR)/table.Po \
+ src/roff/groff/$(DEPDIR)/groff.Po \
+ src/roff/groff/$(DEPDIR)/pipeline.Po \
+ src/roff/troff/$(DEPDIR)/dictionary.Po \
+ src/roff/troff/$(DEPDIR)/div.Po \
+ src/roff/troff/$(DEPDIR)/env.Po \
+ src/roff/troff/$(DEPDIR)/input.Po \
+ src/roff/troff/$(DEPDIR)/majorminor.Po \
+ src/roff/troff/$(DEPDIR)/mtsm.Po \
+ src/roff/troff/$(DEPDIR)/node.Po \
+ src/roff/troff/$(DEPDIR)/number.Po \
+ src/roff/troff/$(DEPDIR)/reg.Po \
+ src/utils/addftinfo/$(DEPDIR)/addftinfo.Po \
+ src/utils/addftinfo/$(DEPDIR)/guess.Po \
+ src/utils/hpftodit/$(DEPDIR)/hpftodit.Po \
+ src/utils/hpftodit/$(DEPDIR)/hpuni.Po \
+ src/utils/indxbib/$(DEPDIR)/indxbib.Po \
+ src/utils/indxbib/$(DEPDIR)/signal.Po \
+ src/utils/lkbib/$(DEPDIR)/lkbib.Po \
+ src/utils/lookbib/$(DEPDIR)/lookbib.Po \
+ src/utils/pfbtops/$(DEPDIR)/dummy.Po \
+ src/utils/pfbtops/$(DEPDIR)/pfbtops.Po \
+ src/utils/tfmtodit/$(DEPDIR)/tfmtodit.Po \
+ src/utils/xtotroff/$(DEPDIR)/xtotroff-xtotroff.Po
+am__mv = mv -f
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+am__yacc_c2h = sed -e s/cc$$/hh/ -e s/cpp$$/hpp/ -e s/cxx$$/hxx/ \
+ -e s/c++$$/h++/ -e s/c$$/h/
+YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS)
+AM_V_YACC = $(am__v_YACC_@AM_V@)
+am__v_YACC_ = $(am__v_YACC_@AM_DEFAULT_V@)
+am__v_YACC_0 = @echo " YACC " $@;
+am__v_YACC_1 =
+YLWRAP = $(top_srcdir)/build-aux/ylwrap
+SOURCES = $(lib_libgnu_a_SOURCES) $(EXTRA_lib_libgnu_a_SOURCES) \
+ $(libbib_a_SOURCES) $(libdriver_a_SOURCES) \
+ $(libgroff_a_SOURCES) $(nodist_libgroff_a_SOURCES) \
+ $(libxutil_a_SOURCES) $(addftinfo_SOURCES) $(eqn_SOURCES) \
+ $(grn_SOURCES) $(grodvi_SOURCES) $(groff_SOURCES) \
+ $(grolbp_SOURCES) $(grolj4_SOURCES) $(grops_SOURCES) \
+ $(grotty_SOURCES) $(gxditview_SOURCES) \
+ $(nodist_gxditview_SOURCES) $(hpftodit_SOURCES) \
+ $(indxbib_SOURCES) $(lkbib_SOURCES) $(lookbib_SOURCES) \
+ $(pfbtops_SOURCES) $(nodist_EXTRA_pfbtops_SOURCES) \
+ $(pic_SOURCES) $(post_grohtml_SOURCES) $(pre_grohtml_SOURCES) \
+ $(preconv_SOURCES) $(refer_SOURCES) $(soelim_SOURCES) \
+ $(tbl_SOURCES) $(tfmtodit_SOURCES) $(troff_SOURCES) \
+ $(nodist_troff_SOURCES) $(xtotroff_SOURCES)
+DIST_SOURCES = $(am__lib_libgnu_a_SOURCES_DIST) \
+ $(EXTRA_lib_libgnu_a_SOURCES) $(libbib_a_SOURCES) \
+ $(libdriver_a_SOURCES) $(am__libgroff_a_SOURCES_DIST) \
+ $(am__libxutil_a_SOURCES_DIST) $(addftinfo_SOURCES) \
+ $(eqn_SOURCES) $(grn_SOURCES) $(grodvi_SOURCES) \
+ $(groff_SOURCES) $(grolbp_SOURCES) $(grolj4_SOURCES) \
+ $(grops_SOURCES) $(grotty_SOURCES) \
+ $(am__gxditview_SOURCES_DIST) $(hpftodit_SOURCES) \
+ $(indxbib_SOURCES) $(lkbib_SOURCES) $(lookbib_SOURCES) \
+ $(pfbtops_SOURCES) $(pic_SOURCES) $(post_grohtml_SOURCES) \
+ $(pre_grohtml_SOURCES) $(preconv_SOURCES) $(refer_SOURCES) \
+ $(soelim_SOURCES) $(tbl_SOURCES) $(tfmtodit_SOURCES) \
+ $(troff_SOURCES) $(am__xtotroff_SOURCES_DIST)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+NROFF = nroff
+MANS = $(man1_MANS) $(man5_MANS) $(man7_MANS)
+DATA = $(devX100_12_font_DATA) $(devX100_font_DATA) \
+ $(devX75_12_font_DATA) $(devX75_font_DATA) \
+ $(devasciifont_DATA) $(devcp1047font_DATA) $(devdvifont_DATA) \
+ $(devdvigen_DATA) $(devhtmlfont_DATA) $(devlatin1font_DATA) \
+ $(devlbpfont_DATA) $(devpdffont_DATA) $(devpdffontenc_DATA) \
+ $(devpdffontmap_DATA) $(devutf8font_DATA) \
+ $(dist_chemexample_DATA) $(dist_chempic_DATA) \
+ $(dist_devlj4font_DATA) $(dist_devlj4fontgen_DATA) \
+ $(dist_devpsfont_DATA) $(dist_devpsgen_DATA) \
+ $(dist_docexamples_DATA) $(dist_hdtblexample_DATA) \
+ $(dist_hdtbltmac_DATA) $(dist_localtmac_DATA) \
+ $(dist_mdoc_DATA) $(dist_mm_DATA) $(dist_mmexample_DATA) \
+ $(dist_momexample_DATA) $(dist_momtmac_DATA) \
+ $(dist_olddevpsfont_DATA) $(dist_otherdoc_DATA) \
+ $(dist_pdfmarktmac_DATA) $(dist_rfc1345tmac_DATA) \
+ $(dist_sboxestmac_DATA) $(dist_tmac_DATA) $(dist_tmacmm_DATA) \
+ $(htmlpic_DATA) $(momhtml_DATA) $(nodist_chemexample_DATA) \
+ $(nodist_chemexample122_DATA) $(nodist_devlj4font_DATA) \
+ $(nodist_devpsfont_DATA) $(nodist_docexamples_DATA) \
+ $(nodist_docpdfdoc_DATA) $(nodist_hdtblexample_DATA) \
+ $(nodist_momprocessedexample_DATA) $(nodist_otherdoc_DATA) \
+ $(nodist_pdfmarkpdfdoc_DATA) $(nodist_sboxesotherdoc_DATA) \
+ $(nodist_sboxespdfdoc_DATA) $(nodist_tmac_DATA)
+HEADERS = $(nodist_noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+AM_RECURSIVE_TARGETS = cscope check recheck
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red=''; \
+ grn=''; \
+ lgn=''; \
+ blu=''; \
+ mgn=''; \
+ brg=''; \
+ std=''; \
+ fi; \
+}
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)'
+RECHECK_LOGS = $(TEST_LOGS)
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/test-groff.in \
+ $(top_srcdir)/arch/mingw/mingw.am \
+ $(top_srcdir)/arch/misc/misc.am \
+ $(top_srcdir)/build-aux/compile \
+ $(top_srcdir)/build-aux/config.guess \
+ $(top_srcdir)/build-aux/config.rpath \
+ $(top_srcdir)/build-aux/config.sub \
+ $(top_srcdir)/build-aux/depcomp \
+ $(top_srcdir)/build-aux/install-sh \
+ $(top_srcdir)/build-aux/missing \
+ $(top_srcdir)/build-aux/test-driver \
+ $(top_srcdir)/build-aux/ylwrap \
+ $(top_srcdir)/contrib/chem/chem.am \
+ $(top_srcdir)/contrib/eqn2graph/eqn2graph.am \
+ $(top_srcdir)/contrib/gdiffmk/gdiffmk.am \
+ $(top_srcdir)/contrib/glilypond/glilypond.am \
+ $(top_srcdir)/contrib/gperl/gperl.am \
+ $(top_srcdir)/contrib/gpinyin/gpinyin.am \
+ $(top_srcdir)/contrib/grap2graph/grap2graph.am \
+ $(top_srcdir)/contrib/hdtbl/hdtbl.am \
+ $(top_srcdir)/contrib/mm/mm.am \
+ $(top_srcdir)/contrib/mom/mom.am \
+ $(top_srcdir)/contrib/pdfmark/pdfmark.am \
+ $(top_srcdir)/contrib/pic2graph/pic2graph.am \
+ $(top_srcdir)/contrib/rfc1345/rfc1345.am \
+ $(top_srcdir)/contrib/sboxes/sboxes.am \
+ $(top_srcdir)/doc/doc.am \
+ $(top_srcdir)/font/devX100-12/devX100-12.am \
+ $(top_srcdir)/font/devX100/devX100.am \
+ $(top_srcdir)/font/devX75-12/devX75-12.am \
+ $(top_srcdir)/font/devX75/devX75.am \
+ $(top_srcdir)/font/devascii/devascii.am \
+ $(top_srcdir)/font/devcp1047/devcp1047.am \
+ $(top_srcdir)/font/devdvi/devdvi.am \
+ $(top_srcdir)/font/devhtml/devhtml.am \
+ $(top_srcdir)/font/devlatin1/devlatin1.am \
+ $(top_srcdir)/font/devlbp/devlbp.am \
+ $(top_srcdir)/font/devlj4/devlj4.am \
+ $(top_srcdir)/font/devpdf/devpdf.am \
+ $(top_srcdir)/font/devps/devps.am \
+ $(top_srcdir)/font/devutf8/devutf8.am \
+ $(top_srcdir)/font/scripts/scripts.am \
+ $(top_srcdir)/lib/gnulib.mk $(top_srcdir)/man/man.am \
+ $(top_srcdir)/src/devices/grodvi/grodvi.am \
+ $(top_srcdir)/src/devices/grohtml/grohtml.am \
+ $(top_srcdir)/src/devices/grolbp/grolbp.am \
+ $(top_srcdir)/src/devices/grolj4/grolj4.am \
+ $(top_srcdir)/src/devices/gropdf/gropdf.am \
+ $(top_srcdir)/src/devices/grops/grops.am \
+ $(top_srcdir)/src/devices/grotty/grotty.am \
+ $(top_srcdir)/src/devices/xditview/xditview.am \
+ $(top_srcdir)/src/include/config.hin \
+ $(top_srcdir)/src/include/include.am \
+ $(top_srcdir)/src/libs/libbib/libbib.am \
+ $(top_srcdir)/src/libs/libdriver/libdriver.am \
+ $(top_srcdir)/src/libs/libgroff/libgroff.am \
+ $(top_srcdir)/src/libs/libxutil/libxutil.am \
+ $(top_srcdir)/src/preproc/eqn/eqn.am \
+ $(top_srcdir)/src/preproc/grn/grn.am \
+ $(top_srcdir)/src/preproc/html/html.am \
+ $(top_srcdir)/src/preproc/pic/pic.am \
+ $(top_srcdir)/src/preproc/preconv/preconv.am \
+ $(top_srcdir)/src/preproc/refer/refer.am \
+ $(top_srcdir)/src/preproc/soelim/soelim.am \
+ $(top_srcdir)/src/preproc/tbl/tbl.am \
+ $(top_srcdir)/src/roff/groff/groff.am \
+ $(top_srcdir)/src/roff/nroff/nroff.am \
+ $(top_srcdir)/src/roff/troff/troff.am \
+ $(top_srcdir)/src/utils/addftinfo/addftinfo.am \
+ $(top_srcdir)/src/utils/afmtodit/afmtodit.am \
+ $(top_srcdir)/src/utils/grog/grog.am \
+ $(top_srcdir)/src/utils/hpftodit/hpftodit.am \
+ $(top_srcdir)/src/utils/indxbib/indxbib.am \
+ $(top_srcdir)/src/utils/lkbib/lkbib.am \
+ $(top_srcdir)/src/utils/lookbib/lookbib.am \
+ $(top_srcdir)/src/utils/pfbtops/pfbtops.am \
+ $(top_srcdir)/src/utils/tfmtodit/tfmtodit.am \
+ $(top_srcdir)/src/utils/xtotroff/xtotroff.am \
+ $(top_srcdir)/tmac/tmac.am AUTHORS COPYING ChangeLog INSTALL \
+ NEWS README THANKS TODO build-aux/compile \
+ build-aux/config.guess build-aux/config.rpath \
+ build-aux/config.sub build-aux/depcomp build-aux/install-sh \
+ build-aux/missing build-aux/ylwrap src/preproc/eqn/eqn.cpp \
+ src/preproc/eqn/eqn.hpp src/preproc/pic/pic.cpp \
+ src/preproc/pic/pic.hpp src/preproc/refer/label.cpp \
+ src/preproc/refer/label.hpp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ if test -d "$(distdir)"; then \
+ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -rf "$(distdir)" \
+ || { sleep 5 && rm -rf "$(distdir)"; }; \
+ else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+DIST_TARGETS = dist-gzip
+# Exists only to be overridden by the user if desired.
+AM_DISTCHECK_DVI_TARGET = dvi
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALLOCA_H = @ALLOCA_H@
+ALT_AWK_PROGS = @ALT_AWK_PROGS@
+ALT_GHOSTSCRIPT_PROGS = @ALT_GHOSTSCRIPT_PROGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@
+AR = @AR@
+ARFLAGS = @ARFLAGS@
+ASSERT_H = @ASSERT_H@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BASH_PROG = @BASH_PROG@
+BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@
+BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@
+BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@
+BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@
+BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@
+BROKEN_SPOOLER_FLAGS = @BROKEN_SPOOLER_FLAGS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIFF_PROG = @DIFF_PROG@
+DVIPRINT = @DVIPRINT@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@
+EMULTIHOP_VALUE = @EMULTIHOP_VALUE@
+ENOLINK_HIDDEN = @ENOLINK_HIDDEN@
+ENOLINK_VALUE = @ENOLINK_VALUE@
+EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@
+EOVERFLOW_VALUE = @EOVERFLOW_VALUE@
+ERRNO_H = @ERRNO_H@
+# CC
+# CFLAGS
+# CPPFLAGS
+# LDFLAGS
+
+# X_CFLAGS
+# X_LIBS
+# X_EXTRA_LIBS
+# X_PRE_LIBS
+
+# YACC
+
+# GREP
+# EGREP
+
+# MAKEINFO
+
+# EXEEXT
+# OBJEXT
+# LIBEXT
+# LIBS
+# LIBM
+# LIBICONV
+# AR
+# RANLIB
+# INSTALL
+# INSTALL_PROGRAM
+# INSTALL_SCRIPT
+# INSTALL_DATA
+# INSTALL_INFO
+# LN_S
+ETAGS = etags
+EXEEXT = @EXEEXT@
+FLOAT_H = @FLOAT_H@
+GDIFF = @GDIFF@
+GHOSTSCRIPT = @GHOSTSCRIPT@
+GLIBC21 = @GLIBC21@
+GL_CFLAG_ALLOW_WARNINGS = @GL_CFLAG_ALLOW_WARNINGS@
+GL_CFLAG_GNULIB_WARNINGS = @GL_CFLAG_GNULIB_WARNINGS@
+GL_GNULIB_ACCESS = @GL_GNULIB_ACCESS@
+GL_GNULIB_ACOSF = @GL_GNULIB_ACOSF@
+GL_GNULIB_ACOSL = @GL_GNULIB_ACOSL@
+GL_GNULIB_ALIGNED_ALLOC = @GL_GNULIB_ALIGNED_ALLOC@
+GL_GNULIB_ASINF = @GL_GNULIB_ASINF@
+GL_GNULIB_ASINL = @GL_GNULIB_ASINL@
+GL_GNULIB_ATAN2F = @GL_GNULIB_ATAN2F@
+GL_GNULIB_ATANF = @GL_GNULIB_ATANF@
+GL_GNULIB_ATANL = @GL_GNULIB_ATANL@
+GL_GNULIB_ATOLL = @GL_GNULIB_ATOLL@
+GL_GNULIB_BTOWC = @GL_GNULIB_BTOWC@
+GL_GNULIB_CALLOC_GNU = @GL_GNULIB_CALLOC_GNU@
+GL_GNULIB_CALLOC_POSIX = @GL_GNULIB_CALLOC_POSIX@
+GL_GNULIB_CANONICALIZE_FILE_NAME = @GL_GNULIB_CANONICALIZE_FILE_NAME@
+GL_GNULIB_CBRT = @GL_GNULIB_CBRT@
+GL_GNULIB_CBRTF = @GL_GNULIB_CBRTF@
+GL_GNULIB_CBRTL = @GL_GNULIB_CBRTL@
+GL_GNULIB_CEIL = @GL_GNULIB_CEIL@
+GL_GNULIB_CEILF = @GL_GNULIB_CEILF@
+GL_GNULIB_CEILL = @GL_GNULIB_CEILL@
+GL_GNULIB_CHDIR = @GL_GNULIB_CHDIR@
+GL_GNULIB_CHOWN = @GL_GNULIB_CHOWN@
+GL_GNULIB_CLOSE = @GL_GNULIB_CLOSE@
+GL_GNULIB_COPYSIGN = @GL_GNULIB_COPYSIGN@
+GL_GNULIB_COPYSIGNF = @GL_GNULIB_COPYSIGNF@
+GL_GNULIB_COPYSIGNL = @GL_GNULIB_COPYSIGNL@
+GL_GNULIB_COPY_FILE_RANGE = @GL_GNULIB_COPY_FILE_RANGE@
+GL_GNULIB_COSF = @GL_GNULIB_COSF@
+GL_GNULIB_COSHF = @GL_GNULIB_COSHF@
+GL_GNULIB_COSL = @GL_GNULIB_COSL@
+GL_GNULIB_DPRINTF = @GL_GNULIB_DPRINTF@
+GL_GNULIB_DUP = @GL_GNULIB_DUP@
+GL_GNULIB_DUP2 = @GL_GNULIB_DUP2@
+GL_GNULIB_DUP3 = @GL_GNULIB_DUP3@
+GL_GNULIB_ENVIRON = @GL_GNULIB_ENVIRON@
+GL_GNULIB_EUIDACCESS = @GL_GNULIB_EUIDACCESS@
+GL_GNULIB_EXECL = @GL_GNULIB_EXECL@
+GL_GNULIB_EXECLE = @GL_GNULIB_EXECLE@
+GL_GNULIB_EXECLP = @GL_GNULIB_EXECLP@
+GL_GNULIB_EXECV = @GL_GNULIB_EXECV@
+GL_GNULIB_EXECVE = @GL_GNULIB_EXECVE@
+GL_GNULIB_EXECVP = @GL_GNULIB_EXECVP@
+GL_GNULIB_EXECVPE = @GL_GNULIB_EXECVPE@
+GL_GNULIB_EXP2 = @GL_GNULIB_EXP2@
+GL_GNULIB_EXP2F = @GL_GNULIB_EXP2F@
+GL_GNULIB_EXP2L = @GL_GNULIB_EXP2L@
+GL_GNULIB_EXPF = @GL_GNULIB_EXPF@
+GL_GNULIB_EXPL = @GL_GNULIB_EXPL@
+GL_GNULIB_EXPLICIT_BZERO = @GL_GNULIB_EXPLICIT_BZERO@
+GL_GNULIB_EXPM1 = @GL_GNULIB_EXPM1@
+GL_GNULIB_EXPM1F = @GL_GNULIB_EXPM1F@
+GL_GNULIB_EXPM1L = @GL_GNULIB_EXPM1L@
+GL_GNULIB_FABSF = @GL_GNULIB_FABSF@
+GL_GNULIB_FABSL = @GL_GNULIB_FABSL@
+GL_GNULIB_FACCESSAT = @GL_GNULIB_FACCESSAT@
+GL_GNULIB_FCHDIR = @GL_GNULIB_FCHDIR@
+GL_GNULIB_FCHOWNAT = @GL_GNULIB_FCHOWNAT@
+GL_GNULIB_FCLOSE = @GL_GNULIB_FCLOSE@
+GL_GNULIB_FDATASYNC = @GL_GNULIB_FDATASYNC@
+GL_GNULIB_FDOPEN = @GL_GNULIB_FDOPEN@
+GL_GNULIB_FFLUSH = @GL_GNULIB_FFLUSH@
+GL_GNULIB_FFSL = @GL_GNULIB_FFSL@
+GL_GNULIB_FFSLL = @GL_GNULIB_FFSLL@
+GL_GNULIB_FGETC = @GL_GNULIB_FGETC@
+GL_GNULIB_FGETS = @GL_GNULIB_FGETS@
+GL_GNULIB_FLOOR = @GL_GNULIB_FLOOR@
+GL_GNULIB_FLOORF = @GL_GNULIB_FLOORF@
+GL_GNULIB_FLOORL = @GL_GNULIB_FLOORL@
+GL_GNULIB_FMA = @GL_GNULIB_FMA@
+GL_GNULIB_FMAF = @GL_GNULIB_FMAF@
+GL_GNULIB_FMAL = @GL_GNULIB_FMAL@
+GL_GNULIB_FMOD = @GL_GNULIB_FMOD@
+GL_GNULIB_FMODF = @GL_GNULIB_FMODF@
+GL_GNULIB_FMODL = @GL_GNULIB_FMODL@
+GL_GNULIB_FOPEN = @GL_GNULIB_FOPEN@
+GL_GNULIB_FOPEN_GNU = @GL_GNULIB_FOPEN_GNU@
+GL_GNULIB_FPRINTF = @GL_GNULIB_FPRINTF@
+GL_GNULIB_FPRINTF_POSIX = @GL_GNULIB_FPRINTF_POSIX@
+GL_GNULIB_FPURGE = @GL_GNULIB_FPURGE@
+GL_GNULIB_FPUTC = @GL_GNULIB_FPUTC@
+GL_GNULIB_FPUTS = @GL_GNULIB_FPUTS@
+GL_GNULIB_FREAD = @GL_GNULIB_FREAD@
+GL_GNULIB_FREE_POSIX = @GL_GNULIB_FREE_POSIX@
+GL_GNULIB_FREOPEN = @GL_GNULIB_FREOPEN@
+GL_GNULIB_FREXP = @GL_GNULIB_FREXP@
+GL_GNULIB_FREXPF = @GL_GNULIB_FREXPF@
+GL_GNULIB_FREXPL = @GL_GNULIB_FREXPL@
+GL_GNULIB_FSCANF = @GL_GNULIB_FSCANF@
+GL_GNULIB_FSEEK = @GL_GNULIB_FSEEK@
+GL_GNULIB_FSEEKO = @GL_GNULIB_FSEEKO@
+GL_GNULIB_FSYNC = @GL_GNULIB_FSYNC@
+GL_GNULIB_FTELL = @GL_GNULIB_FTELL@
+GL_GNULIB_FTELLO = @GL_GNULIB_FTELLO@
+GL_GNULIB_FTRUNCATE = @GL_GNULIB_FTRUNCATE@
+GL_GNULIB_FWRITE = @GL_GNULIB_FWRITE@
+GL_GNULIB_GETC = @GL_GNULIB_GETC@
+GL_GNULIB_GETCHAR = @GL_GNULIB_GETCHAR@
+GL_GNULIB_GETCWD = @GL_GNULIB_GETCWD@
+GL_GNULIB_GETDELIM = @GL_GNULIB_GETDELIM@
+GL_GNULIB_GETDOMAINNAME = @GL_GNULIB_GETDOMAINNAME@
+GL_GNULIB_GETDTABLESIZE = @GL_GNULIB_GETDTABLESIZE@
+GL_GNULIB_GETENTROPY = @GL_GNULIB_GETENTROPY@
+GL_GNULIB_GETGROUPS = @GL_GNULIB_GETGROUPS@
+GL_GNULIB_GETHOSTNAME = @GL_GNULIB_GETHOSTNAME@
+GL_GNULIB_GETLINE = @GL_GNULIB_GETLINE@
+GL_GNULIB_GETLOADAVG = @GL_GNULIB_GETLOADAVG@
+GL_GNULIB_GETLOGIN = @GL_GNULIB_GETLOGIN@
+GL_GNULIB_GETLOGIN_R = @GL_GNULIB_GETLOGIN_R@
+GL_GNULIB_GETOPT_POSIX = @GL_GNULIB_GETOPT_POSIX@
+GL_GNULIB_GETPAGESIZE = @GL_GNULIB_GETPAGESIZE@
+GL_GNULIB_GETPASS = @GL_GNULIB_GETPASS@
+GL_GNULIB_GETPASS_GNU = @GL_GNULIB_GETPASS_GNU@
+GL_GNULIB_GETPROGNAME = @GL_GNULIB_GETPROGNAME@
+GL_GNULIB_GETSUBOPT = @GL_GNULIB_GETSUBOPT@
+GL_GNULIB_GETUSERSHELL = @GL_GNULIB_GETUSERSHELL@
+GL_GNULIB_GRANTPT = @GL_GNULIB_GRANTPT@
+GL_GNULIB_GROUP_MEMBER = @GL_GNULIB_GROUP_MEMBER@
+GL_GNULIB_HYPOT = @GL_GNULIB_HYPOT@
+GL_GNULIB_HYPOTF = @GL_GNULIB_HYPOTF@
+GL_GNULIB_HYPOTL = @GL_GNULIB_HYPOTL@
+GL_GNULIB_ILOGB = @GL_GNULIB_ILOGB@
+GL_GNULIB_ILOGBF = @GL_GNULIB_ILOGBF@
+GL_GNULIB_ILOGBL = @GL_GNULIB_ILOGBL@
+GL_GNULIB_IMAXABS = @GL_GNULIB_IMAXABS@
+GL_GNULIB_IMAXDIV = @GL_GNULIB_IMAXDIV@
+GL_GNULIB_ISATTY = @GL_GNULIB_ISATTY@
+GL_GNULIB_ISFINITE = @GL_GNULIB_ISFINITE@
+GL_GNULIB_ISINF = @GL_GNULIB_ISINF@
+GL_GNULIB_ISNAN = @GL_GNULIB_ISNAN@
+GL_GNULIB_ISNAND = @GL_GNULIB_ISNAND@
+GL_GNULIB_ISNANF = @GL_GNULIB_ISNANF@
+GL_GNULIB_ISNANL = @GL_GNULIB_ISNANL@
+GL_GNULIB_ISWBLANK = @GL_GNULIB_ISWBLANK@
+GL_GNULIB_ISWCTYPE = @GL_GNULIB_ISWCTYPE@
+GL_GNULIB_ISWDIGIT = @GL_GNULIB_ISWDIGIT@
+GL_GNULIB_ISWXDIGIT = @GL_GNULIB_ISWXDIGIT@
+GL_GNULIB_LCHOWN = @GL_GNULIB_LCHOWN@
+GL_GNULIB_LDEXPF = @GL_GNULIB_LDEXPF@
+GL_GNULIB_LDEXPL = @GL_GNULIB_LDEXPL@
+GL_GNULIB_LINK = @GL_GNULIB_LINK@
+GL_GNULIB_LINKAT = @GL_GNULIB_LINKAT@
+GL_GNULIB_LOG = @GL_GNULIB_LOG@
+GL_GNULIB_LOG10 = @GL_GNULIB_LOG10@
+GL_GNULIB_LOG10F = @GL_GNULIB_LOG10F@
+GL_GNULIB_LOG10L = @GL_GNULIB_LOG10L@
+GL_GNULIB_LOG1P = @GL_GNULIB_LOG1P@
+GL_GNULIB_LOG1PF = @GL_GNULIB_LOG1PF@
+GL_GNULIB_LOG1PL = @GL_GNULIB_LOG1PL@
+GL_GNULIB_LOG2 = @GL_GNULIB_LOG2@
+GL_GNULIB_LOG2F = @GL_GNULIB_LOG2F@
+GL_GNULIB_LOG2L = @GL_GNULIB_LOG2L@
+GL_GNULIB_LOGB = @GL_GNULIB_LOGB@
+GL_GNULIB_LOGBF = @GL_GNULIB_LOGBF@
+GL_GNULIB_LOGBL = @GL_GNULIB_LOGBL@
+GL_GNULIB_LOGF = @GL_GNULIB_LOGF@
+GL_GNULIB_LOGL = @GL_GNULIB_LOGL@
+GL_GNULIB_LSEEK = @GL_GNULIB_LSEEK@
+GL_GNULIB_MALLOC_GNU = @GL_GNULIB_MALLOC_GNU@
+GL_GNULIB_MALLOC_POSIX = @GL_GNULIB_MALLOC_POSIX@
+GL_GNULIB_MBRLEN = @GL_GNULIB_MBRLEN@
+GL_GNULIB_MBRTOWC = @GL_GNULIB_MBRTOWC@
+GL_GNULIB_MBSCASECMP = @GL_GNULIB_MBSCASECMP@
+GL_GNULIB_MBSCASESTR = @GL_GNULIB_MBSCASESTR@
+GL_GNULIB_MBSCHR = @GL_GNULIB_MBSCHR@
+GL_GNULIB_MBSCSPN = @GL_GNULIB_MBSCSPN@
+GL_GNULIB_MBSINIT = @GL_GNULIB_MBSINIT@
+GL_GNULIB_MBSLEN = @GL_GNULIB_MBSLEN@
+GL_GNULIB_MBSNCASECMP = @GL_GNULIB_MBSNCASECMP@
+GL_GNULIB_MBSNLEN = @GL_GNULIB_MBSNLEN@
+GL_GNULIB_MBSNRTOWCS = @GL_GNULIB_MBSNRTOWCS@
+GL_GNULIB_MBSPBRK = @GL_GNULIB_MBSPBRK@
+GL_GNULIB_MBSPCASECMP = @GL_GNULIB_MBSPCASECMP@
+GL_GNULIB_MBSRCHR = @GL_GNULIB_MBSRCHR@
+GL_GNULIB_MBSRTOWCS = @GL_GNULIB_MBSRTOWCS@
+GL_GNULIB_MBSSEP = @GL_GNULIB_MBSSEP@
+GL_GNULIB_MBSSPN = @GL_GNULIB_MBSSPN@
+GL_GNULIB_MBSSTR = @GL_GNULIB_MBSSTR@
+GL_GNULIB_MBSTOK_R = @GL_GNULIB_MBSTOK_R@
+GL_GNULIB_MBTOWC = @GL_GNULIB_MBTOWC@
+GL_GNULIB_MDA_ACCESS = @GL_GNULIB_MDA_ACCESS@
+GL_GNULIB_MDA_CHDIR = @GL_GNULIB_MDA_CHDIR@
+GL_GNULIB_MDA_CLOSE = @GL_GNULIB_MDA_CLOSE@
+GL_GNULIB_MDA_DUP = @GL_GNULIB_MDA_DUP@
+GL_GNULIB_MDA_DUP2 = @GL_GNULIB_MDA_DUP2@
+GL_GNULIB_MDA_ECVT = @GL_GNULIB_MDA_ECVT@
+GL_GNULIB_MDA_EXECL = @GL_GNULIB_MDA_EXECL@
+GL_GNULIB_MDA_EXECLE = @GL_GNULIB_MDA_EXECLE@
+GL_GNULIB_MDA_EXECLP = @GL_GNULIB_MDA_EXECLP@
+GL_GNULIB_MDA_EXECV = @GL_GNULIB_MDA_EXECV@
+GL_GNULIB_MDA_EXECVE = @GL_GNULIB_MDA_EXECVE@
+GL_GNULIB_MDA_EXECVP = @GL_GNULIB_MDA_EXECVP@
+GL_GNULIB_MDA_EXECVPE = @GL_GNULIB_MDA_EXECVPE@
+GL_GNULIB_MDA_FCLOSEALL = @GL_GNULIB_MDA_FCLOSEALL@
+GL_GNULIB_MDA_FCVT = @GL_GNULIB_MDA_FCVT@
+GL_GNULIB_MDA_FDOPEN = @GL_GNULIB_MDA_FDOPEN@
+GL_GNULIB_MDA_FILENO = @GL_GNULIB_MDA_FILENO@
+GL_GNULIB_MDA_GCVT = @GL_GNULIB_MDA_GCVT@
+GL_GNULIB_MDA_GETCWD = @GL_GNULIB_MDA_GETCWD@
+GL_GNULIB_MDA_GETPID = @GL_GNULIB_MDA_GETPID@
+GL_GNULIB_MDA_GETW = @GL_GNULIB_MDA_GETW@
+GL_GNULIB_MDA_ISATTY = @GL_GNULIB_MDA_ISATTY@
+GL_GNULIB_MDA_J0 = @GL_GNULIB_MDA_J0@
+GL_GNULIB_MDA_J1 = @GL_GNULIB_MDA_J1@
+GL_GNULIB_MDA_JN = @GL_GNULIB_MDA_JN@
+GL_GNULIB_MDA_LSEEK = @GL_GNULIB_MDA_LSEEK@
+GL_GNULIB_MDA_MEMCCPY = @GL_GNULIB_MDA_MEMCCPY@
+GL_GNULIB_MDA_MKTEMP = @GL_GNULIB_MDA_MKTEMP@
+GL_GNULIB_MDA_PUTENV = @GL_GNULIB_MDA_PUTENV@
+GL_GNULIB_MDA_PUTW = @GL_GNULIB_MDA_PUTW@
+GL_GNULIB_MDA_READ = @GL_GNULIB_MDA_READ@
+GL_GNULIB_MDA_RMDIR = @GL_GNULIB_MDA_RMDIR@
+GL_GNULIB_MDA_STRDUP = @GL_GNULIB_MDA_STRDUP@
+GL_GNULIB_MDA_SWAB = @GL_GNULIB_MDA_SWAB@
+GL_GNULIB_MDA_TEMPNAM = @GL_GNULIB_MDA_TEMPNAM@
+GL_GNULIB_MDA_UNLINK = @GL_GNULIB_MDA_UNLINK@
+GL_GNULIB_MDA_WCSDUP = @GL_GNULIB_MDA_WCSDUP@
+GL_GNULIB_MDA_WRITE = @GL_GNULIB_MDA_WRITE@
+GL_GNULIB_MDA_Y0 = @GL_GNULIB_MDA_Y0@
+GL_GNULIB_MDA_Y1 = @GL_GNULIB_MDA_Y1@
+GL_GNULIB_MDA_YN = @GL_GNULIB_MDA_YN@
+GL_GNULIB_MEMCHR = @GL_GNULIB_MEMCHR@
+GL_GNULIB_MEMMEM = @GL_GNULIB_MEMMEM@
+GL_GNULIB_MEMPCPY = @GL_GNULIB_MEMPCPY@
+GL_GNULIB_MEMRCHR = @GL_GNULIB_MEMRCHR@
+GL_GNULIB_MEMSET_EXPLICIT = @GL_GNULIB_MEMSET_EXPLICIT@
+GL_GNULIB_MKDTEMP = @GL_GNULIB_MKDTEMP@
+GL_GNULIB_MKOSTEMP = @GL_GNULIB_MKOSTEMP@
+GL_GNULIB_MKOSTEMPS = @GL_GNULIB_MKOSTEMPS@
+GL_GNULIB_MKSTEMP = @GL_GNULIB_MKSTEMP@
+GL_GNULIB_MKSTEMPS = @GL_GNULIB_MKSTEMPS@
+GL_GNULIB_MODF = @GL_GNULIB_MODF@
+GL_GNULIB_MODFF = @GL_GNULIB_MODFF@
+GL_GNULIB_MODFL = @GL_GNULIB_MODFL@
+GL_GNULIB_OBSTACK_PRINTF = @GL_GNULIB_OBSTACK_PRINTF@
+GL_GNULIB_OBSTACK_PRINTF_POSIX = @GL_GNULIB_OBSTACK_PRINTF_POSIX@
+GL_GNULIB_PCLOSE = @GL_GNULIB_PCLOSE@
+GL_GNULIB_PERROR = @GL_GNULIB_PERROR@
+GL_GNULIB_PIPE = @GL_GNULIB_PIPE@
+GL_GNULIB_PIPE2 = @GL_GNULIB_PIPE2@
+GL_GNULIB_POPEN = @GL_GNULIB_POPEN@
+GL_GNULIB_POSIX_MEMALIGN = @GL_GNULIB_POSIX_MEMALIGN@
+GL_GNULIB_POSIX_OPENPT = @GL_GNULIB_POSIX_OPENPT@
+GL_GNULIB_POWF = @GL_GNULIB_POWF@
+GL_GNULIB_PREAD = @GL_GNULIB_PREAD@
+GL_GNULIB_PRINTF = @GL_GNULIB_PRINTF@
+GL_GNULIB_PRINTF_POSIX = @GL_GNULIB_PRINTF_POSIX@
+GL_GNULIB_PTSNAME = @GL_GNULIB_PTSNAME@
+GL_GNULIB_PTSNAME_R = @GL_GNULIB_PTSNAME_R@
+GL_GNULIB_PUTC = @GL_GNULIB_PUTC@
+GL_GNULIB_PUTCHAR = @GL_GNULIB_PUTCHAR@
+GL_GNULIB_PUTENV = @GL_GNULIB_PUTENV@
+GL_GNULIB_PUTS = @GL_GNULIB_PUTS@
+GL_GNULIB_PWRITE = @GL_GNULIB_PWRITE@
+GL_GNULIB_QSORT_R = @GL_GNULIB_QSORT_R@
+GL_GNULIB_RANDOM = @GL_GNULIB_RANDOM@
+GL_GNULIB_RANDOM_R = @GL_GNULIB_RANDOM_R@
+GL_GNULIB_RAWMEMCHR = @GL_GNULIB_RAWMEMCHR@
+GL_GNULIB_READ = @GL_GNULIB_READ@
+GL_GNULIB_READLINK = @GL_GNULIB_READLINK@
+GL_GNULIB_READLINKAT = @GL_GNULIB_READLINKAT@
+GL_GNULIB_REALLOCARRAY = @GL_GNULIB_REALLOCARRAY@
+GL_GNULIB_REALLOC_GNU = @GL_GNULIB_REALLOC_GNU@
+GL_GNULIB_REALLOC_POSIX = @GL_GNULIB_REALLOC_POSIX@
+GL_GNULIB_REALPATH = @GL_GNULIB_REALPATH@
+GL_GNULIB_REMAINDER = @GL_GNULIB_REMAINDER@
+GL_GNULIB_REMAINDERF = @GL_GNULIB_REMAINDERF@
+GL_GNULIB_REMAINDERL = @GL_GNULIB_REMAINDERL@
+GL_GNULIB_REMOVE = @GL_GNULIB_REMOVE@
+GL_GNULIB_RENAME = @GL_GNULIB_RENAME@
+GL_GNULIB_RENAMEAT = @GL_GNULIB_RENAMEAT@
+GL_GNULIB_RINT = @GL_GNULIB_RINT@
+GL_GNULIB_RINTF = @GL_GNULIB_RINTF@
+GL_GNULIB_RINTL = @GL_GNULIB_RINTL@
+GL_GNULIB_RMDIR = @GL_GNULIB_RMDIR@
+GL_GNULIB_ROUND = @GL_GNULIB_ROUND@
+GL_GNULIB_ROUNDF = @GL_GNULIB_ROUNDF@
+GL_GNULIB_ROUNDL = @GL_GNULIB_ROUNDL@
+GL_GNULIB_RPMATCH = @GL_GNULIB_RPMATCH@
+GL_GNULIB_SCANF = @GL_GNULIB_SCANF@
+GL_GNULIB_SECURE_GETENV = @GL_GNULIB_SECURE_GETENV@
+GL_GNULIB_SETENV = @GL_GNULIB_SETENV@
+GL_GNULIB_SETHOSTNAME = @GL_GNULIB_SETHOSTNAME@
+GL_GNULIB_SIGABBREV_NP = @GL_GNULIB_SIGABBREV_NP@
+GL_GNULIB_SIGDESCR_NP = @GL_GNULIB_SIGDESCR_NP@
+GL_GNULIB_SIGNBIT = @GL_GNULIB_SIGNBIT@
+GL_GNULIB_SINF = @GL_GNULIB_SINF@
+GL_GNULIB_SINHF = @GL_GNULIB_SINHF@
+GL_GNULIB_SINL = @GL_GNULIB_SINL@
+GL_GNULIB_SLEEP = @GL_GNULIB_SLEEP@
+GL_GNULIB_SNPRINTF = @GL_GNULIB_SNPRINTF@
+GL_GNULIB_SPRINTF_POSIX = @GL_GNULIB_SPRINTF_POSIX@
+GL_GNULIB_SQRTF = @GL_GNULIB_SQRTF@
+GL_GNULIB_SQRTL = @GL_GNULIB_SQRTL@
+GL_GNULIB_STDIO_H_NONBLOCKING = @GL_GNULIB_STDIO_H_NONBLOCKING@
+GL_GNULIB_STDIO_H_SIGPIPE = @GL_GNULIB_STDIO_H_SIGPIPE@
+GL_GNULIB_STPCPY = @GL_GNULIB_STPCPY@
+GL_GNULIB_STPNCPY = @GL_GNULIB_STPNCPY@
+GL_GNULIB_STRCASESTR = @GL_GNULIB_STRCASESTR@
+GL_GNULIB_STRCHRNUL = @GL_GNULIB_STRCHRNUL@
+GL_GNULIB_STRDUP = @GL_GNULIB_STRDUP@
+GL_GNULIB_STRERROR = @GL_GNULIB_STRERROR@
+GL_GNULIB_STRERRORNAME_NP = @GL_GNULIB_STRERRORNAME_NP@
+GL_GNULIB_STRERROR_R = @GL_GNULIB_STRERROR_R@
+GL_GNULIB_STRNCAT = @GL_GNULIB_STRNCAT@
+GL_GNULIB_STRNDUP = @GL_GNULIB_STRNDUP@
+GL_GNULIB_STRNLEN = @GL_GNULIB_STRNLEN@
+GL_GNULIB_STRPBRK = @GL_GNULIB_STRPBRK@
+GL_GNULIB_STRSEP = @GL_GNULIB_STRSEP@
+GL_GNULIB_STRSIGNAL = @GL_GNULIB_STRSIGNAL@
+GL_GNULIB_STRSTR = @GL_GNULIB_STRSTR@
+GL_GNULIB_STRTOD = @GL_GNULIB_STRTOD@
+GL_GNULIB_STRTOIMAX = @GL_GNULIB_STRTOIMAX@
+GL_GNULIB_STRTOK_R = @GL_GNULIB_STRTOK_R@
+GL_GNULIB_STRTOL = @GL_GNULIB_STRTOL@
+GL_GNULIB_STRTOLD = @GL_GNULIB_STRTOLD@
+GL_GNULIB_STRTOLL = @GL_GNULIB_STRTOLL@
+GL_GNULIB_STRTOUL = @GL_GNULIB_STRTOUL@
+GL_GNULIB_STRTOULL = @GL_GNULIB_STRTOULL@
+GL_GNULIB_STRTOUMAX = @GL_GNULIB_STRTOUMAX@
+GL_GNULIB_STRVERSCMP = @GL_GNULIB_STRVERSCMP@
+GL_GNULIB_SYMLINK = @GL_GNULIB_SYMLINK@
+GL_GNULIB_SYMLINKAT = @GL_GNULIB_SYMLINKAT@
+GL_GNULIB_SYSTEM_POSIX = @GL_GNULIB_SYSTEM_POSIX@
+GL_GNULIB_TANF = @GL_GNULIB_TANF@
+GL_GNULIB_TANHF = @GL_GNULIB_TANHF@
+GL_GNULIB_TANL = @GL_GNULIB_TANL@
+GL_GNULIB_TMPFILE = @GL_GNULIB_TMPFILE@
+GL_GNULIB_TOWCTRANS = @GL_GNULIB_TOWCTRANS@
+GL_GNULIB_TRUNC = @GL_GNULIB_TRUNC@
+GL_GNULIB_TRUNCATE = @GL_GNULIB_TRUNCATE@
+GL_GNULIB_TRUNCF = @GL_GNULIB_TRUNCF@
+GL_GNULIB_TRUNCL = @GL_GNULIB_TRUNCL@
+GL_GNULIB_TTYNAME_R = @GL_GNULIB_TTYNAME_R@
+GL_GNULIB_UNISTD_H_GETOPT = @GL_GNULIB_UNISTD_H_GETOPT@
+GL_GNULIB_UNISTD_H_NONBLOCKING = @GL_GNULIB_UNISTD_H_NONBLOCKING@
+GL_GNULIB_UNISTD_H_SIGPIPE = @GL_GNULIB_UNISTD_H_SIGPIPE@
+GL_GNULIB_UNLINK = @GL_GNULIB_UNLINK@
+GL_GNULIB_UNLINKAT = @GL_GNULIB_UNLINKAT@
+GL_GNULIB_UNLOCKPT = @GL_GNULIB_UNLOCKPT@
+GL_GNULIB_UNSETENV = @GL_GNULIB_UNSETENV@
+GL_GNULIB_USLEEP = @GL_GNULIB_USLEEP@
+GL_GNULIB_VASPRINTF = @GL_GNULIB_VASPRINTF@
+GL_GNULIB_VDPRINTF = @GL_GNULIB_VDPRINTF@
+GL_GNULIB_VFPRINTF = @GL_GNULIB_VFPRINTF@
+GL_GNULIB_VFPRINTF_POSIX = @GL_GNULIB_VFPRINTF_POSIX@
+GL_GNULIB_VFSCANF = @GL_GNULIB_VFSCANF@
+GL_GNULIB_VPRINTF = @GL_GNULIB_VPRINTF@
+GL_GNULIB_VPRINTF_POSIX = @GL_GNULIB_VPRINTF_POSIX@
+GL_GNULIB_VSCANF = @GL_GNULIB_VSCANF@
+GL_GNULIB_VSNPRINTF = @GL_GNULIB_VSNPRINTF@
+GL_GNULIB_VSPRINTF_POSIX = @GL_GNULIB_VSPRINTF_POSIX@
+GL_GNULIB_WCPCPY = @GL_GNULIB_WCPCPY@
+GL_GNULIB_WCPNCPY = @GL_GNULIB_WCPNCPY@
+GL_GNULIB_WCRTOMB = @GL_GNULIB_WCRTOMB@
+GL_GNULIB_WCSCASECMP = @GL_GNULIB_WCSCASECMP@
+GL_GNULIB_WCSCAT = @GL_GNULIB_WCSCAT@
+GL_GNULIB_WCSCHR = @GL_GNULIB_WCSCHR@
+GL_GNULIB_WCSCMP = @GL_GNULIB_WCSCMP@
+GL_GNULIB_WCSCOLL = @GL_GNULIB_WCSCOLL@
+GL_GNULIB_WCSCPY = @GL_GNULIB_WCSCPY@
+GL_GNULIB_WCSCSPN = @GL_GNULIB_WCSCSPN@
+GL_GNULIB_WCSDUP = @GL_GNULIB_WCSDUP@
+GL_GNULIB_WCSFTIME = @GL_GNULIB_WCSFTIME@
+GL_GNULIB_WCSLEN = @GL_GNULIB_WCSLEN@
+GL_GNULIB_WCSNCASECMP = @GL_GNULIB_WCSNCASECMP@
+GL_GNULIB_WCSNCAT = @GL_GNULIB_WCSNCAT@
+GL_GNULIB_WCSNCMP = @GL_GNULIB_WCSNCMP@
+GL_GNULIB_WCSNCPY = @GL_GNULIB_WCSNCPY@
+GL_GNULIB_WCSNLEN = @GL_GNULIB_WCSNLEN@
+GL_GNULIB_WCSNRTOMBS = @GL_GNULIB_WCSNRTOMBS@
+GL_GNULIB_WCSPBRK = @GL_GNULIB_WCSPBRK@
+GL_GNULIB_WCSRCHR = @GL_GNULIB_WCSRCHR@
+GL_GNULIB_WCSRTOMBS = @GL_GNULIB_WCSRTOMBS@
+GL_GNULIB_WCSSPN = @GL_GNULIB_WCSSPN@
+GL_GNULIB_WCSSTR = @GL_GNULIB_WCSSTR@
+GL_GNULIB_WCSTOK = @GL_GNULIB_WCSTOK@
+GL_GNULIB_WCSWIDTH = @GL_GNULIB_WCSWIDTH@
+GL_GNULIB_WCSXFRM = @GL_GNULIB_WCSXFRM@
+GL_GNULIB_WCTOB = @GL_GNULIB_WCTOB@
+GL_GNULIB_WCTOMB = @GL_GNULIB_WCTOMB@
+GL_GNULIB_WCTRANS = @GL_GNULIB_WCTRANS@
+GL_GNULIB_WCTYPE = @GL_GNULIB_WCTYPE@
+GL_GNULIB_WCWIDTH = @GL_GNULIB_WCWIDTH@
+GL_GNULIB_WMEMCHR = @GL_GNULIB_WMEMCHR@
+GL_GNULIB_WMEMCMP = @GL_GNULIB_WMEMCMP@
+GL_GNULIB_WMEMCPY = @GL_GNULIB_WMEMCPY@
+GL_GNULIB_WMEMMOVE = @GL_GNULIB_WMEMMOVE@
+GL_GNULIB_WMEMPCPY = @GL_GNULIB_WMEMPCPY@
+GL_GNULIB_WMEMSET = @GL_GNULIB_WMEMSET@
+GL_GNULIB_WRITE = @GL_GNULIB_WRITE@
+GL_GNULIB__EXIT = @GL_GNULIB__EXIT@
+GNULIBHEADERS_OVERRIDE_WINT_T = @GNULIBHEADERS_OVERRIDE_WINT_T@
+GREP = @GREP@
+GROFF_PATH_SEPARATOR = @GROFF_PATH_SEPARATOR@
+HAVE_ACOSF = @HAVE_ACOSF@
+HAVE_ACOSL = @HAVE_ACOSL@
+HAVE_ALIGNED_ALLOC = @HAVE_ALIGNED_ALLOC@
+HAVE_ALLOCA_H = @HAVE_ALLOCA_H@
+HAVE_ASINF = @HAVE_ASINF@
+HAVE_ASINL = @HAVE_ASINL@
+HAVE_ATAN2F = @HAVE_ATAN2F@
+HAVE_ATANF = @HAVE_ATANF@
+HAVE_ATANL = @HAVE_ATANL@
+HAVE_ATOLL = @HAVE_ATOLL@
+HAVE_BTOWC = @HAVE_BTOWC@
+HAVE_C99_STDINT_H = @HAVE_C99_STDINT_H@
+HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@
+HAVE_CBRT = @HAVE_CBRT@
+HAVE_CBRTF = @HAVE_CBRTF@
+HAVE_CBRTL = @HAVE_CBRTL@
+HAVE_CHOWN = @HAVE_CHOWN@
+HAVE_COPYSIGN = @HAVE_COPYSIGN@
+HAVE_COPYSIGNL = @HAVE_COPYSIGNL@
+HAVE_COPY_FILE_RANGE = @HAVE_COPY_FILE_RANGE@
+HAVE_COSF = @HAVE_COSF@
+HAVE_COSHF = @HAVE_COSHF@
+HAVE_COSL = @HAVE_COSL@
+HAVE_CRTDEFS_H = @HAVE_CRTDEFS_H@
+HAVE_DECL_ACOSL = @HAVE_DECL_ACOSL@
+HAVE_DECL_ASINL = @HAVE_DECL_ASINL@
+HAVE_DECL_ATANL = @HAVE_DECL_ATANL@
+HAVE_DECL_CBRTF = @HAVE_DECL_CBRTF@
+HAVE_DECL_CBRTL = @HAVE_DECL_CBRTL@
+HAVE_DECL_CEILF = @HAVE_DECL_CEILF@
+HAVE_DECL_CEILL = @HAVE_DECL_CEILL@
+HAVE_DECL_COPYSIGNF = @HAVE_DECL_COPYSIGNF@
+HAVE_DECL_COSL = @HAVE_DECL_COSL@
+HAVE_DECL_ECVT = @HAVE_DECL_ECVT@
+HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@
+HAVE_DECL_EXECVPE = @HAVE_DECL_EXECVPE@
+HAVE_DECL_EXP2 = @HAVE_DECL_EXP2@
+HAVE_DECL_EXP2F = @HAVE_DECL_EXP2F@
+HAVE_DECL_EXP2L = @HAVE_DECL_EXP2L@
+HAVE_DECL_EXPL = @HAVE_DECL_EXPL@
+HAVE_DECL_EXPM1L = @HAVE_DECL_EXPM1L@
+HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@
+HAVE_DECL_FCLOSEALL = @HAVE_DECL_FCLOSEALL@
+HAVE_DECL_FCVT = @HAVE_DECL_FCVT@
+HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@
+HAVE_DECL_FLOORF = @HAVE_DECL_FLOORF@
+HAVE_DECL_FLOORL = @HAVE_DECL_FLOORL@
+HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@
+HAVE_DECL_FREXPL = @HAVE_DECL_FREXPL@
+HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@
+HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@
+HAVE_DECL_GCVT = @HAVE_DECL_GCVT@
+HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@
+HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@
+HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@
+HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@
+HAVE_DECL_GETLOGIN = @HAVE_DECL_GETLOGIN@
+HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@
+HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@
+HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@
+HAVE_DECL_GETW = @HAVE_DECL_GETW@
+HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@
+HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@
+HAVE_DECL_INITSTATE = @HAVE_DECL_INITSTATE@
+HAVE_DECL_LDEXPL = @HAVE_DECL_LDEXPL@
+HAVE_DECL_LOG10L = @HAVE_DECL_LOG10L@
+HAVE_DECL_LOG2 = @HAVE_DECL_LOG2@
+HAVE_DECL_LOG2F = @HAVE_DECL_LOG2F@
+HAVE_DECL_LOG2L = @HAVE_DECL_LOG2L@
+HAVE_DECL_LOGB = @HAVE_DECL_LOGB@
+HAVE_DECL_LOGL = @HAVE_DECL_LOGL@
+HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@
+HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@
+HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@
+HAVE_DECL_PUTW = @HAVE_DECL_PUTW@
+HAVE_DECL_REMAINDER = @HAVE_DECL_REMAINDER@
+HAVE_DECL_REMAINDERL = @HAVE_DECL_REMAINDERL@
+HAVE_DECL_RINTF = @HAVE_DECL_RINTF@
+HAVE_DECL_ROUND = @HAVE_DECL_ROUND@
+HAVE_DECL_ROUNDF = @HAVE_DECL_ROUNDF@
+HAVE_DECL_ROUNDL = @HAVE_DECL_ROUNDL@
+HAVE_DECL_SETENV = @HAVE_DECL_SETENV@
+HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@
+HAVE_DECL_SETSTATE = @HAVE_DECL_SETSTATE@
+HAVE_DECL_SINL = @HAVE_DECL_SINL@
+HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@
+HAVE_DECL_SQRTL = @HAVE_DECL_SQRTL@
+HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@
+HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@
+HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@
+HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@
+HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@
+HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@
+HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@
+HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@
+HAVE_DECL_TANL = @HAVE_DECL_TANL@
+HAVE_DECL_TRUNC = @HAVE_DECL_TRUNC@
+HAVE_DECL_TRUNCATE = @HAVE_DECL_TRUNCATE@
+HAVE_DECL_TRUNCF = @HAVE_DECL_TRUNCF@
+HAVE_DECL_TRUNCL = @HAVE_DECL_TRUNCL@
+HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@
+HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@
+HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@
+HAVE_DECL_WCSDUP = @HAVE_DECL_WCSDUP@
+HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@
+HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@
+HAVE_DPRINTF = @HAVE_DPRINTF@
+HAVE_DUP3 = @HAVE_DUP3@
+HAVE_EUIDACCESS = @HAVE_EUIDACCESS@
+HAVE_EXECVPE = @HAVE_EXECVPE@
+HAVE_EXPF = @HAVE_EXPF@
+HAVE_EXPL = @HAVE_EXPL@
+HAVE_EXPLICIT_BZERO = @HAVE_EXPLICIT_BZERO@
+HAVE_EXPM1 = @HAVE_EXPM1@
+HAVE_EXPM1F = @HAVE_EXPM1F@
+HAVE_FABSF = @HAVE_FABSF@
+HAVE_FABSL = @HAVE_FABSL@
+HAVE_FACCESSAT = @HAVE_FACCESSAT@
+HAVE_FCHDIR = @HAVE_FCHDIR@
+HAVE_FCHOWNAT = @HAVE_FCHOWNAT@
+HAVE_FDATASYNC = @HAVE_FDATASYNC@
+HAVE_FEATURES_H = @HAVE_FEATURES_H@
+HAVE_FFSL = @HAVE_FFSL@
+HAVE_FFSLL = @HAVE_FFSLL@
+HAVE_FMA = @HAVE_FMA@
+HAVE_FMAF = @HAVE_FMAF@
+HAVE_FMAL = @HAVE_FMAL@
+HAVE_FMODF = @HAVE_FMODF@
+HAVE_FMODL = @HAVE_FMODL@
+HAVE_FREXPF = @HAVE_FREXPF@
+HAVE_FSEEKO = @HAVE_FSEEKO@
+HAVE_FSYNC = @HAVE_FSYNC@
+HAVE_FTELLO = @HAVE_FTELLO@
+HAVE_FTRUNCATE = @HAVE_FTRUNCATE@
+HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@
+HAVE_GETENTROPY = @HAVE_GETENTROPY@
+HAVE_GETGROUPS = @HAVE_GETGROUPS@
+HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@
+HAVE_GETLOGIN = @HAVE_GETLOGIN@
+HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@
+HAVE_GETPASS = @HAVE_GETPASS@
+HAVE_GETPROGNAME = @HAVE_GETPROGNAME@
+HAVE_GETSUBOPT = @HAVE_GETSUBOPT@
+HAVE_GRANTPT = @HAVE_GRANTPT@
+HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@
+HAVE_HYPOTF = @HAVE_HYPOTF@
+HAVE_HYPOTL = @HAVE_HYPOTL@
+HAVE_ILOGB = @HAVE_ILOGB@
+HAVE_ILOGBF = @HAVE_ILOGBF@
+HAVE_ILOGBL = @HAVE_ILOGBL@
+HAVE_IMAXABS = @HAVE_IMAXABS@
+HAVE_IMAXDIV = @HAVE_IMAXDIV@
+HAVE_IMAXDIV_T = @HAVE_IMAXDIV_T@
+HAVE_INITSTATE = @HAVE_INITSTATE@
+HAVE_INTTYPES_H = @HAVE_INTTYPES_H@
+HAVE_ISNAND = @HAVE_ISNAND@
+HAVE_ISNANF = @HAVE_ISNANF@
+HAVE_ISNANL = @HAVE_ISNANL@
+HAVE_ISWBLANK = @HAVE_ISWBLANK@
+HAVE_ISWCNTRL = @HAVE_ISWCNTRL@
+HAVE_LCHOWN = @HAVE_LCHOWN@
+HAVE_LDEXPF = @HAVE_LDEXPF@
+HAVE_LINK = @HAVE_LINK@
+HAVE_LINKAT = @HAVE_LINKAT@
+HAVE_LOG10F = @HAVE_LOG10F@
+HAVE_LOG10L = @HAVE_LOG10L@
+HAVE_LOG1P = @HAVE_LOG1P@
+HAVE_LOG1PF = @HAVE_LOG1PF@
+HAVE_LOG1PL = @HAVE_LOG1PL@
+HAVE_LOGBF = @HAVE_LOGBF@
+HAVE_LOGBL = @HAVE_LOGBL@
+HAVE_LOGF = @HAVE_LOGF@
+HAVE_LOGL = @HAVE_LOGL@
+HAVE_MAX_ALIGN_T = @HAVE_MAX_ALIGN_T@
+HAVE_MBRLEN = @HAVE_MBRLEN@
+HAVE_MBRTOWC = @HAVE_MBRTOWC@
+HAVE_MBSINIT = @HAVE_MBSINIT@
+HAVE_MBSLEN = @HAVE_MBSLEN@
+HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@
+HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@
+HAVE_MBTOWC = @HAVE_MBTOWC@
+HAVE_MEMPCPY = @HAVE_MEMPCPY@
+HAVE_MEMSET_EXPLICIT = @HAVE_MEMSET_EXPLICIT@
+HAVE_MKDTEMP = @HAVE_MKDTEMP@
+HAVE_MKOSTEMP = @HAVE_MKOSTEMP@
+HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@
+HAVE_MKSTEMP = @HAVE_MKSTEMP@
+HAVE_MKSTEMPS = @HAVE_MKSTEMPS@
+HAVE_MODFF = @HAVE_MODFF@
+HAVE_MODFL = @HAVE_MODFL@
+HAVE_OS_H = @HAVE_OS_H@
+HAVE_PCLOSE = @HAVE_PCLOSE@
+HAVE_PIPE = @HAVE_PIPE@
+HAVE_PIPE2 = @HAVE_PIPE2@
+HAVE_POPEN = @HAVE_POPEN@
+HAVE_POSIX_MEMALIGN = @HAVE_POSIX_MEMALIGN@
+HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@
+HAVE_POWF = @HAVE_POWF@
+HAVE_PREAD = @HAVE_PREAD@
+HAVE_PTSNAME = @HAVE_PTSNAME@
+HAVE_PTSNAME_R = @HAVE_PTSNAME_R@
+HAVE_PWRITE = @HAVE_PWRITE@
+HAVE_QSORT_R = @HAVE_QSORT_R@
+HAVE_RANDOM = @HAVE_RANDOM@
+HAVE_RANDOM_H = @HAVE_RANDOM_H@
+HAVE_RANDOM_R = @HAVE_RANDOM_R@
+HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@
+HAVE_READLINK = @HAVE_READLINK@
+HAVE_READLINKAT = @HAVE_READLINKAT@
+HAVE_REALLOCARRAY = @HAVE_REALLOCARRAY@
+HAVE_REALPATH = @HAVE_REALPATH@
+HAVE_REMAINDER = @HAVE_REMAINDER@
+HAVE_REMAINDERF = @HAVE_REMAINDERF@
+HAVE_RENAMEAT = @HAVE_RENAMEAT@
+HAVE_RINT = @HAVE_RINT@
+HAVE_RINTL = @HAVE_RINTL@
+HAVE_RPMATCH = @HAVE_RPMATCH@
+HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = @HAVE_SAME_LONG_DOUBLE_AS_DOUBLE@
+HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@
+HAVE_SETENV = @HAVE_SETENV@
+HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@
+HAVE_SETSTATE = @HAVE_SETSTATE@
+HAVE_SIGABBREV_NP = @HAVE_SIGABBREV_NP@
+HAVE_SIGDESCR_NP = @HAVE_SIGDESCR_NP@
+HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@
+HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@
+HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@
+HAVE_SINF = @HAVE_SINF@
+HAVE_SINHF = @HAVE_SINHF@
+HAVE_SINL = @HAVE_SINL@
+HAVE_SLEEP = @HAVE_SLEEP@
+HAVE_SQRTF = @HAVE_SQRTF@
+HAVE_SQRTL = @HAVE_SQRTL@
+HAVE_STDINT_H = @HAVE_STDINT_H@
+HAVE_STPCPY = @HAVE_STPCPY@
+HAVE_STPNCPY = @HAVE_STPNCPY@
+HAVE_STRCASESTR = @HAVE_STRCASESTR@
+HAVE_STRCHRNUL = @HAVE_STRCHRNUL@
+HAVE_STRERRORNAME_NP = @HAVE_STRERRORNAME_NP@
+HAVE_STRPBRK = @HAVE_STRPBRK@
+HAVE_STRSEP = @HAVE_STRSEP@
+HAVE_STRTOD = @HAVE_STRTOD@
+HAVE_STRTOL = @HAVE_STRTOL@
+HAVE_STRTOLD = @HAVE_STRTOLD@
+HAVE_STRTOLL = @HAVE_STRTOLL@
+HAVE_STRTOUL = @HAVE_STRTOUL@
+HAVE_STRTOULL = @HAVE_STRTOULL@
+HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@
+HAVE_STRVERSCMP = @HAVE_STRVERSCMP@
+HAVE_SYMLINK = @HAVE_SYMLINK@
+HAVE_SYMLINKAT = @HAVE_SYMLINKAT@
+HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@
+HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@
+HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@
+HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@
+HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@
+HAVE_TANF = @HAVE_TANF@
+HAVE_TANHF = @HAVE_TANHF@
+HAVE_TANL = @HAVE_TANL@
+HAVE_TEST_EF_OPTION = @HAVE_TEST_EF_OPTION@
+HAVE_UNISTD_H = @HAVE_UNISTD_H@
+HAVE_UNLINKAT = @HAVE_UNLINKAT@
+HAVE_UNLOCKPT = @HAVE_UNLOCKPT@
+HAVE_USLEEP = @HAVE_USLEEP@
+HAVE_VASPRINTF = @HAVE_VASPRINTF@
+HAVE_VDPRINTF = @HAVE_VDPRINTF@
+HAVE_WCHAR_H = @HAVE_WCHAR_H@
+HAVE_WCHAR_T = @HAVE_WCHAR_T@
+HAVE_WCPCPY = @HAVE_WCPCPY@
+HAVE_WCPNCPY = @HAVE_WCPNCPY@
+HAVE_WCRTOMB = @HAVE_WCRTOMB@
+HAVE_WCSCASECMP = @HAVE_WCSCASECMP@
+HAVE_WCSCAT = @HAVE_WCSCAT@
+HAVE_WCSCHR = @HAVE_WCSCHR@
+HAVE_WCSCMP = @HAVE_WCSCMP@
+HAVE_WCSCOLL = @HAVE_WCSCOLL@
+HAVE_WCSCPY = @HAVE_WCSCPY@
+HAVE_WCSCSPN = @HAVE_WCSCSPN@
+HAVE_WCSDUP = @HAVE_WCSDUP@
+HAVE_WCSFTIME = @HAVE_WCSFTIME@
+HAVE_WCSLEN = @HAVE_WCSLEN@
+HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@
+HAVE_WCSNCAT = @HAVE_WCSNCAT@
+HAVE_WCSNCMP = @HAVE_WCSNCMP@
+HAVE_WCSNCPY = @HAVE_WCSNCPY@
+HAVE_WCSNLEN = @HAVE_WCSNLEN@
+HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@
+HAVE_WCSPBRK = @HAVE_WCSPBRK@
+HAVE_WCSRCHR = @HAVE_WCSRCHR@
+HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@
+HAVE_WCSSPN = @HAVE_WCSSPN@
+HAVE_WCSSTR = @HAVE_WCSSTR@
+HAVE_WCSTOK = @HAVE_WCSTOK@
+HAVE_WCSWIDTH = @HAVE_WCSWIDTH@
+HAVE_WCSXFRM = @HAVE_WCSXFRM@
+HAVE_WCTRANS_T = @HAVE_WCTRANS_T@
+HAVE_WCTYPE_H = @HAVE_WCTYPE_H@
+HAVE_WCTYPE_T = @HAVE_WCTYPE_T@
+HAVE_WINT_T = @HAVE_WINT_T@
+HAVE_WMEMCHR = @HAVE_WMEMCHR@
+HAVE_WMEMCMP = @HAVE_WMEMCMP@
+HAVE_WMEMCPY = @HAVE_WMEMCPY@
+HAVE_WMEMMOVE = @HAVE_WMEMMOVE@
+HAVE_WMEMPCPY = @HAVE_WMEMPCPY@
+HAVE_WMEMSET = @HAVE_WMEMSET@
+HAVE__BOOL = @HAVE__BOOL@
+HAVE__EXIT = @HAVE__EXIT@
+INCLUDE_NEXT = @INCLUDE_NEXT@
+INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_INFO = @INSTALL_INFO@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@
+INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@
+LDFLAGS = @LDFLAGS@
+LIBC = @LIBC@
+LIBEXT = @LIBEXT@
+LIBGNU_LIBDEPS = @LIBGNU_LIBDEPS@
+LIBGNU_LTLIBDEPS = @LIBGNU_LTLIBDEPS@
+LIBICONV = @LIBICONV@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBUNISTRING_UNITYPES_H = @LIBUNISTRING_UNITYPES_H@
+LIBUNISTRING_UNIWIDTH_H = @LIBUNISTRING_UNIWIDTH_H@
+LIMITS_H = @LIMITS_H@
+LN_S = @LN_S@
+LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@
+LP = @LP@
+LPQ = @LPQ@
+LPR = @LPR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+NEXT_ASSERT_H = @NEXT_ASSERT_H@
+NEXT_AS_FIRST_DIRECTIVE_ASSERT_H = @NEXT_AS_FIRST_DIRECTIVE_ASSERT_H@
+NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@
+NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@
+NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H = @NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H@
+NEXT_AS_FIRST_DIRECTIVE_LIMITS_H = @NEXT_AS_FIRST_DIRECTIVE_LIMITS_H@
+NEXT_AS_FIRST_DIRECTIVE_MATH_H = @NEXT_AS_FIRST_DIRECTIVE_MATH_H@
+NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@
+NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@
+NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@
+NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@
+NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@
+NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@
+NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@
+NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H@
+NEXT_ERRNO_H = @NEXT_ERRNO_H@
+NEXT_FLOAT_H = @NEXT_FLOAT_H@
+NEXT_INTTYPES_H = @NEXT_INTTYPES_H@
+NEXT_LIMITS_H = @NEXT_LIMITS_H@
+NEXT_MATH_H = @NEXT_MATH_H@
+NEXT_STDDEF_H = @NEXT_STDDEF_H@
+NEXT_STDINT_H = @NEXT_STDINT_H@
+NEXT_STDIO_H = @NEXT_STDIO_H@
+NEXT_STDLIB_H = @NEXT_STDLIB_H@
+NEXT_STRING_H = @NEXT_STRING_H@
+NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@
+NEXT_UNISTD_H = @NEXT_UNISTD_H@
+NEXT_WCHAR_H = @NEXT_WCHAR_H@
+NEXT_WCTYPE_H = @NEXT_WCTYPE_H@
+OBJEXT = @OBJEXT@
+OTHERDEVDIRS = @OTHERDEVDIRS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PAGE = @PAGE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PERL_VERSION = @PERL_VERSION@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PRAGMA_COLUMNS = @PRAGMA_COLUMNS@
+PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@
+PRIPTR_PREFIX = @PRIPTR_PREFIX@
+PROG_TEX = @PROG_TEX@
+PROG_TEXI2DVI = @PROG_TEXI2DVI@
+PSPRINT = @PSPRINT@
+PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
+RANLIB = @RANLIB@
+REPLACE_ACCESS = @REPLACE_ACCESS@
+REPLACE_ACOSF = @REPLACE_ACOSF@
+REPLACE_ALIGNED_ALLOC = @REPLACE_ALIGNED_ALLOC@
+REPLACE_ASINF = @REPLACE_ASINF@
+REPLACE_ATAN2F = @REPLACE_ATAN2F@
+REPLACE_ATANF = @REPLACE_ATANF@
+REPLACE_BTOWC = @REPLACE_BTOWC@
+REPLACE_CALLOC_FOR_CALLOC_GNU = @REPLACE_CALLOC_FOR_CALLOC_GNU@
+REPLACE_CALLOC_FOR_CALLOC_POSIX = @REPLACE_CALLOC_FOR_CALLOC_POSIX@
+REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@
+REPLACE_CBRTF = @REPLACE_CBRTF@
+REPLACE_CBRTL = @REPLACE_CBRTL@
+REPLACE_CEIL = @REPLACE_CEIL@
+REPLACE_CEILF = @REPLACE_CEILF@
+REPLACE_CEILL = @REPLACE_CEILL@
+REPLACE_CHOWN = @REPLACE_CHOWN@
+REPLACE_CLOSE = @REPLACE_CLOSE@
+REPLACE_COPY_FILE_RANGE = @REPLACE_COPY_FILE_RANGE@
+REPLACE_COSF = @REPLACE_COSF@
+REPLACE_COSHF = @REPLACE_COSHF@
+REPLACE_DPRINTF = @REPLACE_DPRINTF@
+REPLACE_DUP = @REPLACE_DUP@
+REPLACE_DUP2 = @REPLACE_DUP2@
+REPLACE_DUP3 = @REPLACE_DUP3@
+REPLACE_EXECL = @REPLACE_EXECL@
+REPLACE_EXECLE = @REPLACE_EXECLE@
+REPLACE_EXECLP = @REPLACE_EXECLP@
+REPLACE_EXECV = @REPLACE_EXECV@
+REPLACE_EXECVE = @REPLACE_EXECVE@
+REPLACE_EXECVP = @REPLACE_EXECVP@
+REPLACE_EXECVPE = @REPLACE_EXECVPE@
+REPLACE_EXP2 = @REPLACE_EXP2@
+REPLACE_EXP2L = @REPLACE_EXP2L@
+REPLACE_EXPF = @REPLACE_EXPF@
+REPLACE_EXPL = @REPLACE_EXPL@
+REPLACE_EXPM1 = @REPLACE_EXPM1@
+REPLACE_EXPM1F = @REPLACE_EXPM1F@
+REPLACE_EXPM1L = @REPLACE_EXPM1L@
+REPLACE_FABSL = @REPLACE_FABSL@
+REPLACE_FACCESSAT = @REPLACE_FACCESSAT@
+REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@
+REPLACE_FCLOSE = @REPLACE_FCLOSE@
+REPLACE_FDATASYNC = @REPLACE_FDATASYNC@
+REPLACE_FDOPEN = @REPLACE_FDOPEN@
+REPLACE_FFLUSH = @REPLACE_FFLUSH@
+REPLACE_FFSLL = @REPLACE_FFSLL@
+REPLACE_FLOOR = @REPLACE_FLOOR@
+REPLACE_FLOORF = @REPLACE_FLOORF@
+REPLACE_FLOORL = @REPLACE_FLOORL@
+REPLACE_FMA = @REPLACE_FMA@
+REPLACE_FMAF = @REPLACE_FMAF@
+REPLACE_FMAL = @REPLACE_FMAL@
+REPLACE_FMOD = @REPLACE_FMOD@
+REPLACE_FMODF = @REPLACE_FMODF@
+REPLACE_FMODL = @REPLACE_FMODL@
+REPLACE_FOPEN = @REPLACE_FOPEN@
+REPLACE_FOPEN_FOR_FOPEN_GNU = @REPLACE_FOPEN_FOR_FOPEN_GNU@
+REPLACE_FPRINTF = @REPLACE_FPRINTF@
+REPLACE_FPURGE = @REPLACE_FPURGE@
+REPLACE_FREE = @REPLACE_FREE@
+REPLACE_FREOPEN = @REPLACE_FREOPEN@
+REPLACE_FREXP = @REPLACE_FREXP@
+REPLACE_FREXPF = @REPLACE_FREXPF@
+REPLACE_FREXPL = @REPLACE_FREXPL@
+REPLACE_FSEEK = @REPLACE_FSEEK@
+REPLACE_FSEEKO = @REPLACE_FSEEKO@
+REPLACE_FTELL = @REPLACE_FTELL@
+REPLACE_FTELLO = @REPLACE_FTELLO@
+REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@
+REPLACE_GETCWD = @REPLACE_GETCWD@
+REPLACE_GETDELIM = @REPLACE_GETDELIM@
+REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@
+REPLACE_GETDTABLESIZE = @REPLACE_GETDTABLESIZE@
+REPLACE_GETENTROPY = @REPLACE_GETENTROPY@
+REPLACE_GETGROUPS = @REPLACE_GETGROUPS@
+REPLACE_GETLINE = @REPLACE_GETLINE@
+REPLACE_GETLOADAVG = @REPLACE_GETLOADAVG@
+REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@
+REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@
+REPLACE_GETPASS = @REPLACE_GETPASS@
+REPLACE_GETPASS_FOR_GETPASS_GNU = @REPLACE_GETPASS_FOR_GETPASS_GNU@
+REPLACE_GETPROGNAME = @REPLACE_GETPROGNAME@
+REPLACE_GETSUBOPT = @REPLACE_GETSUBOPT@
+REPLACE_HUGE_VAL = @REPLACE_HUGE_VAL@
+REPLACE_HYPOT = @REPLACE_HYPOT@
+REPLACE_HYPOTF = @REPLACE_HYPOTF@
+REPLACE_HYPOTL = @REPLACE_HYPOTL@
+REPLACE_ILOGB = @REPLACE_ILOGB@
+REPLACE_ILOGBF = @REPLACE_ILOGBF@
+REPLACE_ILOGBL = @REPLACE_ILOGBL@
+REPLACE_IMAXABS = @REPLACE_IMAXABS@
+REPLACE_IMAXDIV = @REPLACE_IMAXDIV@
+REPLACE_INITSTATE = @REPLACE_INITSTATE@
+REPLACE_ISATTY = @REPLACE_ISATTY@
+REPLACE_ISFINITE = @REPLACE_ISFINITE@
+REPLACE_ISINF = @REPLACE_ISINF@
+REPLACE_ISNAN = @REPLACE_ISNAN@
+REPLACE_ISWBLANK = @REPLACE_ISWBLANK@
+REPLACE_ISWCNTRL = @REPLACE_ISWCNTRL@
+REPLACE_ISWDIGIT = @REPLACE_ISWDIGIT@
+REPLACE_ISWXDIGIT = @REPLACE_ISWXDIGIT@
+REPLACE_ITOLD = @REPLACE_ITOLD@
+REPLACE_LCHOWN = @REPLACE_LCHOWN@
+REPLACE_LDEXPL = @REPLACE_LDEXPL@
+REPLACE_LINK = @REPLACE_LINK@
+REPLACE_LINKAT = @REPLACE_LINKAT@
+REPLACE_LOG = @REPLACE_LOG@
+REPLACE_LOG10 = @REPLACE_LOG10@
+REPLACE_LOG10F = @REPLACE_LOG10F@
+REPLACE_LOG10L = @REPLACE_LOG10L@
+REPLACE_LOG1P = @REPLACE_LOG1P@
+REPLACE_LOG1PF = @REPLACE_LOG1PF@
+REPLACE_LOG1PL = @REPLACE_LOG1PL@
+REPLACE_LOG2 = @REPLACE_LOG2@
+REPLACE_LOG2F = @REPLACE_LOG2F@
+REPLACE_LOG2L = @REPLACE_LOG2L@
+REPLACE_LOGB = @REPLACE_LOGB@
+REPLACE_LOGBF = @REPLACE_LOGBF@
+REPLACE_LOGBL = @REPLACE_LOGBL@
+REPLACE_LOGF = @REPLACE_LOGF@
+REPLACE_LOGL = @REPLACE_LOGL@
+REPLACE_LSEEK = @REPLACE_LSEEK@
+REPLACE_MALLOC_FOR_MALLOC_GNU = @REPLACE_MALLOC_FOR_MALLOC_GNU@
+REPLACE_MALLOC_FOR_MALLOC_POSIX = @REPLACE_MALLOC_FOR_MALLOC_POSIX@
+REPLACE_MBRLEN = @REPLACE_MBRLEN@
+REPLACE_MBRTOWC = @REPLACE_MBRTOWC@
+REPLACE_MBSINIT = @REPLACE_MBSINIT@
+REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@
+REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@
+REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@
+REPLACE_MBTOWC = @REPLACE_MBTOWC@
+REPLACE_MEMCHR = @REPLACE_MEMCHR@
+REPLACE_MEMMEM = @REPLACE_MEMMEM@
+REPLACE_MEMPCPY = @REPLACE_MEMPCPY@
+REPLACE_MKOSTEMP = @REPLACE_MKOSTEMP@
+REPLACE_MKOSTEMPS = @REPLACE_MKOSTEMPS@
+REPLACE_MKSTEMP = @REPLACE_MKSTEMP@
+REPLACE_MODF = @REPLACE_MODF@
+REPLACE_MODFF = @REPLACE_MODFF@
+REPLACE_MODFL = @REPLACE_MODFL@
+REPLACE_NAN = @REPLACE_NAN@
+REPLACE_NULL = @REPLACE_NULL@
+REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@
+REPLACE_PERROR = @REPLACE_PERROR@
+REPLACE_PIPE2 = @REPLACE_PIPE2@
+REPLACE_POPEN = @REPLACE_POPEN@
+REPLACE_POSIX_MEMALIGN = @REPLACE_POSIX_MEMALIGN@
+REPLACE_POSIX_OPENPT = @REPLACE_POSIX_OPENPT@
+REPLACE_PREAD = @REPLACE_PREAD@
+REPLACE_PRINTF = @REPLACE_PRINTF@
+REPLACE_PTSNAME = @REPLACE_PTSNAME@
+REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@
+REPLACE_PUTENV = @REPLACE_PUTENV@
+REPLACE_PWRITE = @REPLACE_PWRITE@
+REPLACE_QSORT_R = @REPLACE_QSORT_R@
+REPLACE_RANDOM = @REPLACE_RANDOM@
+REPLACE_RANDOM_R = @REPLACE_RANDOM_R@
+REPLACE_READ = @REPLACE_READ@
+REPLACE_READLINK = @REPLACE_READLINK@
+REPLACE_READLINKAT = @REPLACE_READLINKAT@
+REPLACE_REALLOCARRAY = @REPLACE_REALLOCARRAY@
+REPLACE_REALLOC_FOR_REALLOC_GNU = @REPLACE_REALLOC_FOR_REALLOC_GNU@
+REPLACE_REALLOC_FOR_REALLOC_POSIX = @REPLACE_REALLOC_FOR_REALLOC_POSIX@
+REPLACE_REALPATH = @REPLACE_REALPATH@
+REPLACE_REMAINDER = @REPLACE_REMAINDER@
+REPLACE_REMAINDERF = @REPLACE_REMAINDERF@
+REPLACE_REMAINDERL = @REPLACE_REMAINDERL@
+REPLACE_REMOVE = @REPLACE_REMOVE@
+REPLACE_RENAME = @REPLACE_RENAME@
+REPLACE_RENAMEAT = @REPLACE_RENAMEAT@
+REPLACE_RINTL = @REPLACE_RINTL@
+REPLACE_RMDIR = @REPLACE_RMDIR@
+REPLACE_ROUND = @REPLACE_ROUND@
+REPLACE_ROUNDF = @REPLACE_ROUNDF@
+REPLACE_ROUNDL = @REPLACE_ROUNDL@
+REPLACE_SETENV = @REPLACE_SETENV@
+REPLACE_SETHOSTNAME = @REPLACE_SETHOSTNAME@
+REPLACE_SETSTATE = @REPLACE_SETSTATE@
+REPLACE_SIGNBIT = @REPLACE_SIGNBIT@
+REPLACE_SIGNBIT_USING_BUILTINS = @REPLACE_SIGNBIT_USING_BUILTINS@
+REPLACE_SINF = @REPLACE_SINF@
+REPLACE_SINHF = @REPLACE_SINHF@
+REPLACE_SLEEP = @REPLACE_SLEEP@
+REPLACE_SNPRINTF = @REPLACE_SNPRINTF@
+REPLACE_SPRINTF = @REPLACE_SPRINTF@
+REPLACE_SQRTF = @REPLACE_SQRTF@
+REPLACE_SQRTL = @REPLACE_SQRTL@
+REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@
+REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@
+REPLACE_STPCPY = @REPLACE_STPCPY@
+REPLACE_STPNCPY = @REPLACE_STPNCPY@
+REPLACE_STRCASESTR = @REPLACE_STRCASESTR@
+REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@
+REPLACE_STRDUP = @REPLACE_STRDUP@
+REPLACE_STRERROR = @REPLACE_STRERROR@
+REPLACE_STRERRORNAME_NP = @REPLACE_STRERRORNAME_NP@
+REPLACE_STRERROR_R = @REPLACE_STRERROR_R@
+REPLACE_STRNCAT = @REPLACE_STRNCAT@
+REPLACE_STRNDUP = @REPLACE_STRNDUP@
+REPLACE_STRNLEN = @REPLACE_STRNLEN@
+REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@
+REPLACE_STRSTR = @REPLACE_STRSTR@
+REPLACE_STRTOD = @REPLACE_STRTOD@
+REPLACE_STRTOIMAX = @REPLACE_STRTOIMAX@
+REPLACE_STRTOK_R = @REPLACE_STRTOK_R@
+REPLACE_STRTOL = @REPLACE_STRTOL@
+REPLACE_STRTOLD = @REPLACE_STRTOLD@
+REPLACE_STRTOLL = @REPLACE_STRTOLL@
+REPLACE_STRTOUL = @REPLACE_STRTOUL@
+REPLACE_STRTOULL = @REPLACE_STRTOULL@
+REPLACE_STRTOUMAX = @REPLACE_STRTOUMAX@
+REPLACE_SYMLINK = @REPLACE_SYMLINK@
+REPLACE_SYMLINKAT = @REPLACE_SYMLINKAT@
+REPLACE_TANF = @REPLACE_TANF@
+REPLACE_TANHF = @REPLACE_TANHF@
+REPLACE_TMPFILE = @REPLACE_TMPFILE@
+REPLACE_TOWLOWER = @REPLACE_TOWLOWER@
+REPLACE_TRUNC = @REPLACE_TRUNC@
+REPLACE_TRUNCATE = @REPLACE_TRUNCATE@
+REPLACE_TRUNCF = @REPLACE_TRUNCF@
+REPLACE_TRUNCL = @REPLACE_TRUNCL@
+REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@
+REPLACE_UNLINK = @REPLACE_UNLINK@
+REPLACE_UNLINKAT = @REPLACE_UNLINKAT@
+REPLACE_UNSETENV = @REPLACE_UNSETENV@
+REPLACE_USLEEP = @REPLACE_USLEEP@
+REPLACE_VASPRINTF = @REPLACE_VASPRINTF@
+REPLACE_VDPRINTF = @REPLACE_VDPRINTF@
+REPLACE_VFPRINTF = @REPLACE_VFPRINTF@
+REPLACE_VPRINTF = @REPLACE_VPRINTF@
+REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@
+REPLACE_VSPRINTF = @REPLACE_VSPRINTF@
+REPLACE_WCRTOMB = @REPLACE_WCRTOMB@
+REPLACE_WCSFTIME = @REPLACE_WCSFTIME@
+REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@
+REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@
+REPLACE_WCSTOK = @REPLACE_WCSTOK@
+REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@
+REPLACE_WCTOB = @REPLACE_WCTOB@
+REPLACE_WCTOMB = @REPLACE_WCTOMB@
+REPLACE_WCWIDTH = @REPLACE_WCWIDTH@
+REPLACE_WMEMPCPY = @REPLACE_WMEMPCPY@
+REPLACE_WRITE = @REPLACE_WRITE@
+REPLACE__EXIT = @REPLACE__EXIT@
+
+# On some platforms we need to set LANG and LC_ALL to C for sed
+SED = \
+ LANG=C \
+ LC_ALL=C \
+ sed
+
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHORT_VERSION = @SHORT_VERSION@
+SH_SCRIPT_SED_CMD = @SH_SCRIPT_SED_CMD@
+SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@
+SIZE_T_SUFFIX = @SIZE_T_SUFFIX@
+STDBOOL_H = @STDBOOL_H@
+STDDEF_H = @STDDEF_H@
+STDINT_H = @STDINT_H@
+STRIP = @STRIP@
+
+# XDEVIDIRS
+# `XDEVDIRS' is either `font/devX{75,100}{,-12}' or empty.
+
+# XPROGDIRS
+# `XPROGDIRS' is either `src/devices/xditview src/utils/xtotroff' or empty.
+
+# XLIBDIRS
+# `XLIBDIRS' is either `src/libs/libxutil' or empty.
+
+# `TTYDEVDIRS' is either `font/devascii font/devlatin1' (for
+# ASCII) or `font/devcp1047' (for EBCDIC) plus font/devutf8.
+TTYDEVDIRS = @TTYDEVDIRS@ font/devutf8
+UCHARDET_CFLAGS = @UCHARDET_CFLAGS@
+UCHARDET_LIBS = @UCHARDET_LIBS@
+UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@
+UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@
+UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@
+UNISTD_H_HAVE_SYS_RANDOM_H = @UNISTD_H_HAVE_SYS_RANDOM_H@
+UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@
+UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+VERSION = @VERSION@
+WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@
+WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@
+WINDOWS_STAT_INODES = @WINDOWS_STAT_INODES@
+WINT_T_SUFFIX = @WINT_T_SUFFIX@
+XDEVDIRS = @XDEVDIRS@
+XLIBDIRS = @XLIBDIRS@
+XMKMF = @XMKMF@
+XPMTOPPM = @XPMTOPPM@
+XPROGDIRS = @XPROGDIRS@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+YACC = @YACC@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AWK = @ac_ct_AWK@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_GHOSTSCRIPT = @ac_ct_GHOSTSCRIPT@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+appdefdir = @appdefdir@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+compatibility_wrappers = @compatibility_wrappers@
+datadir = @datadir@
+datarootdir = @datarootdir@
+
+# infodir
+# `infodir' says where to install info files.
+
+# docdir
+# `docdir' says where to install documentation files. The default
+# location is ${datarootdir}/doc/${PACKAGE}, but we add the version
+docdir = $(datarootdir)/doc/${PACKAGE}-$(SHORT_VERSION)
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+g = @g@
+gl_LIBOBJDEPS = @gl_LIBOBJDEPS@
+gl_LIBOBJS = @gl_LIBOBJS@
+gl_LTLIBOBJS = @gl_LTLIBOBJS@
+glilypond_dir = @glilypond_dir@
+gltests_LIBOBJDEPS = @gltests_LIBOBJDEPS@
+gltests_LIBOBJS = @gltests_LIBOBJS@
+gltests_LTLIBOBJS = @gltests_LTLIBOBJS@
+gltests_WITNESS = @gltests_WITNESS@
+gpinyin_dir = @gpinyin_dir@
+groff_have_urw_fonts = @groff_have_urw_fonts@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+libprogramdir = @libprogramdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+make_htmldoc = @make_htmldoc@
+make_winscripts = @make_winscripts@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pnmcrop = @pnmcrop@
+pnmcut = @pnmcut@
+pnmtools_quiet = @pnmtools_quiet@
+pnmtopng = @pnmtopng@
+pnmtops = @pnmtops@
+pnmtops_nosetpage = @pnmtops_nosetpage@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+psselect = @psselect@
+referdir = @referdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sys_tmac_prefix = @sys_tmac_prefix@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+tmac_wrap = @tmac_wrap@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+urwfontsdir = @urwfontsdir@
+use_gropdf = @use_gropdf@
+use_pdfroff = @use_pdfroff@
+
+# `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@
+
+# GLIBC2
+# `GLIBC21' is yes if the host operating system uses GNU libc 2.1 or newer,
+# otherwise no.
+
+# VERSION is set by automake, based on what is passed to AC_INIT.
+
+# PAGE
+# 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).
+
+# GHOSTSCRIPT
+# The name of the ghostscript program. Normally, gs, on GNU/Linux
+# but it might be different on MS-DOS/MS-WIN32 systems.
+
+# ALT_GHOSTSCRIPT_PROGS
+# `ALT_GHOSTSCRIPT_PROGS' specifies a list alternative names,
+# which can be tried if `GHOSTSCRIPT' cannot be found at run time.
+
+# ALT_AWK_PROGS
+# Similarly, `ALT_AWK_PROGS' specifies a list of alternative names,
+# which can be tried at run time, to identify the awk program.
+
+# BROKEN_SPOOLER_FLAGS
+# 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.
+
+# `DEVICE' is the default device.
+DEVICE = ps
+
+# OTHERDEVDIRS
+# `OTHERDEVDIRS' is either `font/devlj4 font/devlbp' (for ASCII) or
+# empty (for EBCDIC).
+
+# PSPRINT
+# `PSPRINT' is the command to use for printing a PostScript file,
+# for example `lpr'.
+
+# DVIPRINT
+# `DVIPRINT' is the command to use for printing a TeX dvi file,
+# for example `lpr -d'.
+
+# g
+# 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.
+
+# prefix
+# exec_prefix
+# Common prefix for installation directories.
+# Used in definitions of exec_prefix, datasubdir, fontpath, manroot.
+# This must already exist when you do make install.
+
+# bindir
+# `bindir' says where to install executables.
+
+# libdir
+# `libdir' says where to install platform-dependent data.
+
+# libprogramdir
+# `libprogramdir' is $(libdir)/groff
+
+# `datasubdir' says where to install platform-independent data files.
+# datadir
+# datarootdir
+dataprogramdir = $(datadir)/groff
+datasubdir = $(dataprogramdir)/$(SHORT_VERSION)
+
+# `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
+
+# `oldfontdir' says where to install old font sets (as dev*/*).
+oldfontdir = $(datasubdir)/oldfont
+
+# `localfontdir' says where local fonts will be installed (as dev*/*).
+localfontdir = $(dataprogramdir)/site-font
+
+# `legacyfontdir' is for compatibility with AT&T/DWB 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
+
+# appdefdir
+# `appdefdir' says where to install the application defaults file for
+# gxditview.
+
+# glilypond_dir
+# gpinyin_dir
+
+# `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
+# `sys_tmac_prefix' is prefix (if any) for system macro packages.
+
+# pnmtops_nosetpage
+# `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.
+
+# tmac_wrap
+# `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.
+
+# compatibility_wrappers
+# (groff compatibility wrappers for vendor-provided non-GNU macro sets)
+#
+# `compatibility_wrappers' controls the creation and installation of
+# compatibility wrappers for the macro sets named in `tmac_wrap'.
+# Its value must be one of:
+# `yes' install compatibility wrappers as the original macro set name
+# (that is, the default implementation of that macro set), and
+# install the groff implementation with a prefix (usually g).
+# `no' do not install compatibility wrappers; only install the groff
+# implementation of each macro set.
+# `manual' install the compatibility wrappers as `<macro>-os' and install
+# the groff implementation of each macro set as the default
+# implementation of that macro set.
+
+# Don't make this empty.
+wrapper_suffix_default = "-os"
+wrapper_suffix = `if test $(compatibility_wrappers) = manual; then echo $(wrapper_suffix_default); fi`
+
+# When `compatibility_wrappers' is `yes', if there is a groff implementation
+# of a macro set listed in $(tmac_wrap), then the groff implementation will be
+# installed with a prefix of $(tmac_prefix) via the collision detection
+# variables $(tmac_m_prefix), $(tmac_s_prefix), and $(tmac_an_prefix).
+
+# Don't make this empty.
+tmac_prefix = g
+
+# The groff -mm macros will be available as -m$(tmac_m_prefix)m.
+tmac_m_prefix = \
+ `if test $(compatibility_wrappers) = yes; then \
+ for i in $(tmac_wrap) ""; do \
+ case "$$i" in m) echo $(tmac_prefix);; esac; \
+ done; \
+ fi`
+
+
+# The groff -ms macros will be available as -m$(tmac_s_prefix)s.
+tmac_s_prefix = \
+ `if test $(compatibility_wrappers) = yes; then \
+ for i in $(tmac_wrap) ""; do \
+ case "$$i" in s) echo $(tmac_prefix);; esac; \
+ done; \
+ fi`
+
+
+# The groff -man macros will be available as -m$(tmac_an_prefix)an.
+tmac_an_prefix = \
+ `if test $(compatibility_wrappers) = yes; then \
+ for i in $(tmac_wrap) ""; do \
+ case "$$i" in an) echo $(tmac_prefix);; esac; \
+ done; \
+ fi`
+
+
+# Extension to be used for refer index files. Index files are not
+# shareable 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
+
+# mandir
+# `manroot' is the root of the man page directory tree.
+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 can we build the HTML documentation.
+# make_htmldoc
+# make_install_htmldoc
+# make_uninstall_htmldoc
+
+# The configure script also checks whether all necessary utility programs
+# for pdfroff are available -- only then can we build PDF documentation.
+# make_pdfdoc
+# make_install_pdfdoc
+# make_uninstall_pdfdoc
+
+# Windows `.cmd' files
+# make_winscripts
+# make_install_winscripts
+# make_uninstall_winscripts
+
+# All the previous installation directories, when used, are prefixed with
+# $(DESTDIR) during install and uninstall, to support staged installations.
+
+# config.h might set the following defines:
+#
+# WORDS_BIGENDIAN if your target platform is big-endian
+# IS_EBCDIC_HOST if the host's encoding is EBCDIC
+#
+# HAVE_DIRECT_H if you have <direct.h>
+# HAVE_DIRENT_H if you have <dirent.h>
+# HAVE_CC_INTTYPES_H if you have a C++ <inttypes.h>
+# HAVE_PROCESS_H if you have <process.h>
+# HAVE_LIMITS_H if you have <limits.h>
+# HAVE_CC_LIMITS_H if you have a C++ <limits.h>
+# HAVE_MATH_H if you have <math.h>
+# HAVE_CC_OSFCN_H if you have a C++ <osfcn.h>
+# HAVE_STDDEF_H if you have <stddef.h>
+# HAVE_STDLIB_H if you have <stdlib.h>
+# HAVE_STRING_H if you have <string.h>
+# HAVE_STRINGS_H if you have <strings.h>
+# HAVE_SYS_DIR_H if you have <sys/dir.h>
+# HAVE_SYS_PARAM_H if you have <sys/param.h>
+# HAVE_SYS_STAT_H if you have <sys/stat.h>
+# HAVE_SYS_TIME_H if you have <sys/time.h>
+# HAVE_SYS_TYPES_H if you have <sys/types.h>
+# HAVE_UNISTD_H if you have <unistd.h>
+#
+# HAVE_FMOD if you have fmod()
+# HAVE_GETCWD if you have getcwd()
+# HAVE_GETTIMEOFDAY if you have gettimeofday()
+# HAVE_ICONV if you have iconv()
+# HAVE_ISATTY if you have isatty()
+# HAVE_KILL if you have kill()
+# HAVE_LANGINFO_CODESET if you have nl_langinfo()
+# HAVE_MKSTEMP if you have mkstemp()
+# HAVE_MMAP if you have mmap()
+# HAVE_PUTENV if you have putenv()
+# HAVE_RENAME if you have rename()
+# HAVE_SETLOCALE if you have setlocale()
+# HAVE_STRCASECMP if you have strcasecmp()
+# HAVE_STRNCASECMP if you have strncasecmp()
+# HAVE_STRERROR if you have strerror()
+# HAVE_STRSEP if you have strsep()
+# HAVE_STRTOL if you have strtol()
+# HAVE_SYMLINK if you have symlink()
+#
+# NEED_DECLARATION_GETTIMEOFTODAY
+# if your C++ <sys/time.h> doesn't declare
+# gettimeofday()
+# NEED_DECLARATION_HYPOT if your C++ <math.h> doesn't declare hypot()
+# NEED_DECLARATION_PCLOSE if your C++ <stdio.h> doesn't declare pclose()
+# NEED_DECLARATION_POPEN if your C++ <stdio.h> doesn't declare popen()
+# NEED_DECLARATION_PUTENV if your C++ <stdlib.h> doesn't declare
+# putenv()
+# NEED_DECLARATION_RAND if your C++ <stdlib.h> doesn't declare rand()
+# NEED_DECLARATION_SRAND if your C++ <stdlib.h> doesn't declare srand()
+# NEED_DECLARATION_STRCASECMP if your C++ <string.h> doesn't declare
+# strcasecmp()
+# NEED_DECLARATION_STRNCASECMP
+# if your C++ <string.h> doesn't declare
+# strncasecmp()
+# NEED_DECLARATION_VFPRINTF if your C++ <stdio.h> doesn't declare
+# vfprintf()
+#
+# HAVE_DECL_GETC_UNLOCKED if you have getc_unlocked()
+# HAVE_DECL_SYS_SIGLIST if you have sys_siglist[]
+#
+# HAVE_STRUCT_EXCEPTION if <math.h> defines struct exception
+# HAVE_SYS_NERR if you have sysnerr in <errno.h> or <stdio.h>
+# HAVE_SYS_ERRLIST if you have sys_errlist in <errno.h> or
+# <stdio.h>
+# ICONV_CONST=const if declaration of iconv() needs const
+# LONG_FOR_TIME_T if localtime() takes a long * not a time_t *
+# RETSIGTYPE=int if signal handlers return int not void
+# RET_TYPE_SRAND_IS_VOID if srand() returns void not int
+#
+# WCOREFLAG=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
+#
+# HAVE_WORKING_O_NOATIME define if <fcntl.h>'s O_NOATIME flag works
+# HAVE_WORKING_O_NOFOLLOW define if <fcntl.h>'s O_NOFOLLOW flag works
+#
+# uintmax_t=<value> define to `unsigned long' or `unsigned long
+# long' if <inttypes.h> does not exist
+#
+# PAGE=A4 if the printer's page size is A4
+# GHOSTSCRIPT=gs the name (and directory if required) of the
+# ghostscript program
+
+# Include
+#
+# {fmod,getcwd,mkstemp,putenv,strcasecmp,
+# strerror,strncasecmp,strtol}.$(OBJEXT)
+#
+# LIBOBJS
+# in LIBOBJS if your C library is missing the corresponding function.
+
+# `CCC' is the compiler for C++ (.cpp) files.
+CCC = @CXX@
+ETAGSFLAGS =
+# Flag that tells etags to assume C++.
+ETAGSCCFLAG = -C
+# Full path to perl.
+# PERL
+# PERLVERSION
+# Sed command with which to edit sh scripts.
+# SH_SCRIPT_SED_CMD
+# Sed script to deal with OS dependencies in sh scripts.
+SH_DEPS_SED_SCRIPT = $(top_builddir)/shdeps.sed
+
+# The program to create directory hierarchies.
+# mkinstalldirs is now in gnulib/build-aux
+PURIFY = purify
+PURIFYCCFLAGS =
+#PURIFYCCFLAGS=-g++=yes \
+# -collector=`dirname \`$(CCC) -print-libgcc-file-name\``/ld
+
+# Add groff and gnulib m4 macros
+ACLOCAL_AMFLAGS = -I m4 -I gnulib_m4
+
+# Common preprocessor flags: gnulib includes, common includes in
+# src/include, and config.h that is generated in the build tree
+AM_CPPFLAGS = \
+ -I$(top_srcdir)/src/include \
+ -I$(top_srcdir)/lib \
+ -I$(top_builddir)/src/include \
+ -I$(top_builddir)/lib
+
+
+# Define a custom string for rules that call groff in make's silence mode.
+GROFF_V = $(GROFF_V_@AM_V@)
+GROFF_V_ = $(GROFF_V_@AM_DEFAULT_V@)
+GROFF_V_0 = @echo " GROFF " $@;
+bin_SCRIPTS = $(am__append_11) eqn2graph gdiffmk glilypond gperl \
+ gpinyin grap2graph mmroff pdfroff pic2graph gropdf pdfmom \
+ afmtodit grog
+dist_bin_SCRIPTS =
+# stuff that should be in distribution archives but not in source repo
+MAINTAINERCLEANFILES = doc/groff.info doc/groff.txt doc/groff.html \
+ doc/groff.html.node src/preproc/eqn/eqn.hpp \
+ src/preproc/eqn/eqn.cpp src/preproc/eqn/eqn.output \
+ src/preproc/pic/pic.cpp src/preproc/pic/pic.hpp \
+ src/preproc/pic/pic.output src/preproc/refer/label.cpp \
+ src/preproc/refer/label.hpp src/preproc/refer/label.output
+
+# HTML documents to be produced by troff should depend on this stamp
+# file to ensure that (post-)grohtml's device and font description files
+# are available.
+
+# PDFs to be produced by troff should depend on this stamp file to
+# ensure that gropdf's device and font description files are available.
+
+# PostScript documents to be produced by troff should depend on this
+# stamp file to ensure that grops's device and font description files
+# are available.
+
+# (UTF-8-encoded) text documents to be produced by troff should depend
+# on this stamp file to ensure that grotty's device and font description
+# files are available.
+MOSTLYCLEANFILES = lib/core lib/*.stackdump lib/alloca.h \
+ lib/alloca.h-t lib/assert.h lib/assert.h-t lib/errno.h \
+ lib/errno.h-t lib/float.h lib/float.h-t lib/inttypes.h \
+ lib/inttypes.h-t lib/limits.h lib/limits.h-t lib/math.h \
+ lib/math.h-t lib/stdbool.h lib/stdbool.h-t lib/stddef.h \
+ lib/stddef.h-t lib/stdint.h lib/stdint.h-t lib/stdio.h \
+ lib/stdio.h-t lib/stdlib.h lib/stdlib.h-t lib/string.h \
+ lib/string.h-t lib/sys/types.h lib/sys/types.h-t lib/unistd.h \
+ lib/unistd.h-t lib/unitypes.h lib/unitypes.h-t lib/uniwidth.h \
+ lib/uniwidth.h-t lib/wchar.h lib/wchar.h-t lib/wctype.h \
+ lib/wctype.h-t shdeps.sed $(CHEM_GENEXAMPLES) \
+ $(nodist_chemexample122_DATA) contrib/chem/README \
+ $(HDTBLGENFILES) $(HDTBLPROCESSEDEXAMPLEFILES) $(hdtbl_TESTS) \
+ $(mom_TESTS) $(MOMPROCESSEDEXAMPLEFILES) penguin.ps \
+ penguin.pdf $(am__append_14) msboxes.ms \
+ $(nodist_sboxesotherdoc_DATA) $(nodist_sboxespdfdoc_DATA) \
+ $(GENERATEDDOCFILES) $(PROCESSEDDOCFILES) \
+ $(PROCESSEDEXAMPLEFILES) $(DEVASCIIFONTSFILES) \
+ font/devascii/DESC $(DEVCP1047FONTSFILES) font/devcp1047/DESC \
+ font/devdvi/DESC $(DEVHTMLFONTSFILES) font/devhtml/DESC \
+ font/devhtml/stamp $(DEVLATIN1FONTSFILES) font/devlatin1/DESC \
+ font/devlbp/DESC font/devlj4/DESC font/devpdf/download \
+ font/devpdf/DESC font/devpdf/Foundry \
+ font/devpdf/util/BuildFoundries \
+ font/devpdf/util/BuildFoundries font/devpdf/DESC \
+ font/devpdf/download font/devpdf/stamp $(font_devpdf_TESTS) \
+ $(DEVPSFONTFILES_GENERATED) font/devps/stamp \
+ $(DEVUTF8FONTSFILES) font/devutf8/DESC font/devutf8/stamp \
+ tmac/groff_man.7.man tmac/groff_man_style.7.man tmac/www.tmac \
+ tmac/*-stamp tmac/stamp-wrap tmac/*-wrap \
+ $(prefixexecbin_SCRIPTS) $(bin_SCRIPTS) $(man1_MANS) \
+ $(man5_MANS) $(man7_MANS) $(PREFIXMAN1)
+# No GNU Make output.
+noinst_LIBRARIES = lib/libgnu.a libbib.a libdriver.a libgroff.a \
+ $(am__append_17)
+
+# Case of out-of-source build: we must create the 'man' directory.
+
+# Non-recursive makefile system. See Automake manual '7.3 An
+# Alternative Approach to Subdirectories'. We use a single Makefile.am
+# that includes other .am files, rather than using SUBDIRS. Note that
+# relative paths in the following .am files are relative to the top
+# source directory.
+
+# Adding defs.h to BUILT_SOURCES will ensure that it will be built on
+# make all or make check before all other targets. However, if another
+# target is built from a clean build tree, (for example make groff)
+# the files in BUILT_SOURCES will not be built first. That is why
+# additional dependencies were added in the .am files that list
+# objects that use defs (for example in groff.am:
+# src/roff/groff/groff.$(OBJEXT): defs.h)
+BUILT_SOURCES = $(ALLOCA_H) $(ASSERT_H) $(ERRNO_H) $(FLOAT_H) \
+ lib/inttypes.h $(LIMITS_H) lib/math.h $(STDBOOL_H) $(STDDEF_H) \
+ $(STDINT_H) lib/stdio.h lib/stdlib.h lib/string.h \
+ lib/sys/types.h lib/unistd.h $(LIBUNISTRING_UNITYPES_H) \
+ $(LIBUNISTRING_UNIWIDTH_H) lib/wchar.h lib/wctype.h man defs.h \
+ $(top_srcdir)/.version
+CLEANFILES = defs.h src/libs/libgroff/version.cpp charset.alias \
+ ref-add.sed ref-del.sed $(am__append_20) \
+ src/roff/troff/majorminor.cpp
+# gnulib asks to include this file
+
+# pdf doc, written in mom and therefore using contrib/mom/mom.am
+# definitions
+
+# Distribute the manual in source form as well.
+
+# Generate HTML, both split into several files, and as a single file.
+# 'html' and its installation counterpart 'install-html' are standard
+# Automake targets.
+
+# An image of a gnu in enscapsulated PostScript is generated during the
+# build process if necessary. Our configure script assumes pnmdepth is
+# available if xpmtoppm is (see macro "GROFF_PROG_XPMTOPPM").
+
+# TODO: these .c files could be removed (use gnulib instead).
+
+# required test artifacts
+
+# Other files that should be present in the distribution tarball.
+
+# Version files - see script 'build-aux/git-version-gen'
+EXTRA_DIST = gnulib_m4/gnulib-cache.m4 lib/alloca.in.h lib/assert.in.h \
+ lib/verify.h lib/attribute.h lib/errno.in.h lib/float.in.h \
+ lib/fprintf.c lib/fpucw.h lib/frexp.c lib/frexp.c lib/frexpl.c \
+ lib/fseterr.h lib/stdio-impl.h \
+ $(top_srcdir)/build-aux/git-version-gen \
+ $(top_srcdir)/build-aux/config.rpath lib/inttypes.in.h \
+ lib/float+.h lib/isnan.c lib/isnand-nolibm.h lib/isnand.c \
+ lib/float+.h lib/isnan.c lib/isnanf-nolibm.h lib/isnanf.c \
+ lib/float+.h lib/isnan.c lib/isnanl-nolibm.h lib/isnanl.c \
+ lib/limits.in.h lib/localcharset.h lib/math.in.h \
+ lib/memchr.valgrind lib/printf-frexp.h lib/printf-frexp.c \
+ lib/printf-frexpl.h lib/float+.h lib/_Noreturn.h \
+ lib/arg-nonnull.h lib/c++defs.h lib/warn-on-use.h \
+ lib/snprintf.c lib/stdbool.in.h lib/stddef.in.h \
+ lib/stdint.in.h lib/stdio.in.h lib/stdlib.in.h lib/streq.h \
+ lib/string.in.h lib/sys_types.in.h lib/unistd.in.h \
+ lib/unitypes.in.h lib/localcharset.h lib/uniwidth.in.h \
+ lib/unictype/bitmap.h lib/uniwidth/cjk.h lib/uniwidth/width0.h \
+ lib/uniwidth/width2.h lib/asnprintf.c lib/float+.h \
+ lib/printf-args.c lib/printf-args.h lib/printf-parse.c \
+ lib/printf-parse.h lib/vasnprintf.c lib/vasnprintf.h \
+ lib/vsnprintf.c lib/wchar.in.h lib/wctype.in.h \
+ $(am__append_12) $(arch_shdeps_sh) contrib/chem/ChangeLog \
+ contrib/chem/chem.1.man contrib/chem/chem.pic \
+ contrib/chem/chem.pl contrib/chem/README.txt \
+ contrib/chem/examples/README.txt \
+ contrib/chem/examples/122/README.txt \
+ contrib/eqn2graph/eqn2graph.1.man \
+ contrib/eqn2graph/eqn2graph.sh contrib/gdiffmk/gdiffmk.1.man \
+ contrib/gdiffmk/ChangeLog contrib/gdiffmk/README \
+ contrib/gdiffmk/gdiffmk.sh contrib/gdiffmk/tests/runtests.sh \
+ contrib/gdiffmk/tests/baseline \
+ contrib/gdiffmk/tests/baseline.6 \
+ contrib/gdiffmk/tests/baseline.6a \
+ contrib/gdiffmk/tests/baseline.7 \
+ contrib/gdiffmk/tests/baseline.8 \
+ contrib/gdiffmk/tests/baseline.9 \
+ contrib/gdiffmk/tests/baseline.9a \
+ contrib/gdiffmk/tests/baseline.10 contrib/gdiffmk/tests/file1 \
+ contrib/gdiffmk/tests/file2 contrib/glilypond/ChangeLog \
+ contrib/glilypond/ChangeLog.0x \
+ contrib/glilypond/glilypond.1.man \
+ contrib/glilypond/glilypond.pl contrib/glilypond/README.txt \
+ contrib/glilypond/examples/example.groff \
+ contrib/gperl/ChangeLog contrib/gperl/gperl.1.man \
+ contrib/gperl/gperl.pl contrib/gpinyin/ChangeLog \
+ contrib/gpinyin/gpinyin.1.man contrib/gpinyin/gpinyin.pl \
+ $(grap2graph_srcdir)/grap2graph.sh \
+ $(grap2graph_srcdir)/grap2graph.1.man \
+ contrib/hdtbl/examples/fonts_n.in \
+ contrib/hdtbl/examples/fonts_x.in $(hdtbl_test_template) \
+ contrib/hdtbl/ChangeLog contrib/hdtbl/TODO \
+ contrib/hdtbl/groff_hdtbl.7.man contrib/mm/ChangeLog \
+ contrib/mm/examples contrib/mm/Makefile.sim contrib/mm/mm \
+ contrib/mm/NOTES contrib/mm/README contrib/mm/groff_mm.7.man \
+ contrib/mm/groff_mmse.7.man contrib/mm/mmroff.1.man \
+ contrib/mm/mmroff.pl $(mm_TESTS) \
+ contrib/mm/tests/artifacts/60657.ref $(mom_test_template) \
+ $(MOMHTMLDOCFILES) $(MOMEXAMPLEFILES) contrib/mom/BUGS \
+ contrib/mom/ChangeLog contrib/mom/NEWS contrib/mom/TODO \
+ contrib/mom/copyright contrib/mom/groff_mom.7.man \
+ $(am__append_15) contrib/pdfmark/cover.ms \
+ contrib/pdfmark/pdfmark.ms contrib/pdfmark/ChangeLog \
+ contrib/pdfmark/README contrib/pdfmark/PROBLEMS \
+ contrib/pdfmark/TODO contrib/pdfmark/pdfroff.1.man \
+ contrib/pdfmark/pdfroff.sh contrib/pic2graph/pic2graph.sh \
+ contrib/pic2graph/pic2graph.1.man $(rfc1345_TESTS) \
+ contrib/rfc1345/groff_rfc1345.7.man contrib/rfc1345/COPYRIGHT \
+ contrib/sboxes/ChangeLog contrib/sboxes/msboxes.ms.in \
+ contrib/sboxes/notquine.sed $(DOCFILES_NOINST) \
+ doc/automake.mom doc/txi-en.tex doc/groff.texi doc/fdl.texi \
+ doc/groff.info doc/groff.txt doc/groff.html \
+ doc/groff.html.node doc/groff.dvi doc/groff.pdf $(DOC_GNU_EPS) \
+ doc/gnu.xpm $(DEVX100FONTS) $(DEVX10012FONTS) $(DEVX75FONTS) \
+ $(DEVX7512FONTS) font/devascii/R.proto \
+ font/devascii/DESC.proto font/devcp1047/R.proto \
+ font/devcp1047/DESC.proto $(DEVDVIFONTFILES) $(DEVDVIGENFILES) \
+ font/devdvi/DESC.in font/devhtml/R.proto \
+ font/devhtml/DESC.proto font/devhtml/R.in \
+ font/devlatin1/R.proto font/devlatin1/DESC.proto \
+ $(DEVLBPFONTFILES) font/devlbp/DESC.in font/devlj4/DESC.in \
+ font/devpdf/DESC.in font/devpdf/Foundry.in \
+ font/devpdf/util/BuildFoundries.pl $(font_devpdf_default_test) \
+ $(font_devpdf_urw_test) font/devps/DESC.in \
+ font/devps/prologue.ps font/devps/psstrip.sed \
+ font/devps/freeeuro.ps font/devps/symbol.afm \
+ font/devps/symbolsl.afm font/devps/symbolsl.ps \
+ font/devps/zapfdr.afm font/devps/zapfdr.ps \
+ font/devps/generate/freeeuro.sfd \
+ font/devps/generate/make-zapfdr \
+ font/devps/generate/symbolsl.awk \
+ font/devps/generate/sfdtopfa.pe font/devps/generate/zapfdr.sed \
+ font/devutf8/R.proto font/devutf8/DESC.proto \
+ font/devutf8/NOTES font/devutf8/R.in $(GENFONTSSH) \
+ $(GENDESCSH) man/groff_font.5.man man/groff_out.5.man \
+ man/groff_tmac.5.man man/groff_char.7.man man/groff_diff.7.man \
+ man/groff.7.man man/roff.7.man src/libs/libgroff/mkstemp.cpp \
+ src/libs/libgroff/fmod.c src/libs/libgroff/getcwd.c \
+ src/libs/libgroff/putenv.c src/libs/libgroff/strcasecmp.c \
+ src/libs/libgroff/strerror.c src/libs/libgroff/strncasecmp.c \
+ src/libs/libgroff/strtol.c src/libs/libgroff/config.charset \
+ src/libs/libgroff/ref-add.sin src/libs/libgroff/ref-del.sin \
+ src/libs/libgroff/make-uniuni src/devices/grodvi/grodvi.1.man \
+ src/devices/grohtml/grohtml.1.man \
+ src/devices/grolbp/grolbp.1.man \
+ src/devices/grolj4/grolj4.1.man src/devices/gropdf/TODO \
+ src/devices/gropdf/gropdf.pl src/devices/gropdf/pdfmom.pl \
+ src/devices/gropdf/gropdf.1.man \
+ src/devices/gropdf/pdfmom.1.man src/devices/grops/grops.1.man \
+ src/devices/grops/psfig.diff src/devices/grops/TODO \
+ src/devices/grotty/grotty.1.man src/devices/grotty/TODO \
+ $(grotty_TESTS) $(am__append_18) src/devices/xditview/ad2c \
+ src/devices/xditview/ChangeLog src/devices/xditview/DESC.in \
+ src/devices/xditview/FontMap-X11 \
+ src/devices/xditview/GXditview-color.ad \
+ src/devices/xditview/GXditview.ad src/devices/xditview/README \
+ src/devices/xditview/TODO src/devices/xditview/gray1.bm \
+ src/devices/xditview/gray2.bm src/devices/xditview/gray3.bm \
+ src/devices/xditview/gray4.bm src/devices/xditview/gray5.bm \
+ src/devices/xditview/gray6.bm src/devices/xditview/gray7.bm \
+ src/devices/xditview/gray8.bm src/devices/xditview/xdit.bm \
+ src/devices/xditview/xdit_mask.bm \
+ src/devices/xditview/gxditview.1.man src/preproc/eqn/TODO \
+ src/preproc/eqn/eqn.1.man src/preproc/eqn/neqn.1.man \
+ src/preproc/eqn/neqn.sh $(eqn_TESTS) src/preproc/grn/README \
+ src/preproc/grn/grn.1.man src/preproc/pic/TODO \
+ src/preproc/pic/pic.1.man src/preproc/preconv/preconv.1.man \
+ $(preconv_TESTS) src/preproc/refer/TODO \
+ src/preproc/refer/refer.1.man $(refer_TESTS) \
+ src/preproc/refer/tests/artifacts/62124.bib \
+ src/preproc/soelim/TODO src/preproc/soelim/soelim.1.man \
+ src/preproc/tbl/tbl.1.man $(tbl_TESTS) \
+ src/roff/groff/groff.1.man $(groff_TESTS) \
+ src/roff/groff/tests/artifacts/HONEYPOT \
+ src/roff/groff/tests/artifacts/devascii/README \
+ src/roff/nroff/nroff.1.man src/roff/nroff/nroff.sh \
+ $(nroff_TESTS) src/roff/troff/column.cpp \
+ src/roff/troff/troff.1.man src/roff/troff/TODO \
+ src/utils/addftinfo/addftinfo.1.man \
+ src/utils/afmtodit/afmtodit.1.man \
+ src/utils/afmtodit/afmtodit.pl \
+ src/utils/afmtodit/afmtodit.tables \
+ src/utils/afmtodit/make-afmtodit-tables \
+ src/utils/grog/grog.1.man src/utils/grog/grog.pl \
+ src/utils/grog/tests/foo.man $(grog_TESTS) \
+ src/utils/hpftodit/hpftodit.1.man \
+ src/utils/indxbib/indxbib.1.man src/utils/indxbib/eign \
+ src/utils/lkbib/lkbib.1.man src/utils/lookbib/lookbib.1.man \
+ src/utils/pfbtops/pfbtops.1.man \
+ src/utils/tfmtodit/tfmtodit.1.man \
+ src/utils/xtotroff/xtotroff.1.man tmac/fixmacros.sed \
+ tmac/groff_ms.7.man tmac/groff_man.7.man.in \
+ tmac/groff_me.7.man tmac/groff_mdoc.7.man \
+ tmac/groff_trace.7.man tmac/groff_www.7.man tmac/hyphenex.pl \
+ tmac/LOCALIZATION tmac/man.ultrix tmac/psfig.tmac \
+ tmac/ptx.tmac tmac/TESTING-HINTS tmac/TODO tmac/www.tmac.in \
+ $(tmac_TESTS) BUG-REPORT ChangeLog.115 ChangeLog.116 \
+ ChangeLog.117 ChangeLog.118 ChangeLog.119 ChangeLog.120 \
+ ChangeLog.121 ChangeLog.122 FDL FOR-RELEASE gendef.sh HACKING \
+ INSTALL.REPO INSTALL.extra LICENSES MANIFEST mdate.pl \
+ MORE.STUFF PROBLEMS PROJECTS README.MinGW arch/djgpp \
+ font/util/make-Rproto makevarescape.sed $(top_srcdir)/.version
+FONTFILES =
+PREFIXMAN1 = src/preproc/eqn/eqn.1 src/preproc/eqn/neqn.1 \
+ src/preproc/grn/grn.1 src/preproc/pic/pic.1 \
+ src/preproc/refer/refer.1 src/preproc/soelim/soelim.1 \
+ src/preproc/tbl/tbl.1 src/roff/nroff/nroff.1 \
+ src/roff/troff/troff.1 src/utils/indxbib/indxbib.1 \
+ src/utils/lookbib/lookbib.1
+man1_MANS = contrib/chem/chem.1 contrib/eqn2graph/eqn2graph.1 \
+ contrib/gdiffmk/gdiffmk.1 contrib/glilypond/glilypond.1 \
+ contrib/gperl/gperl.1 contrib/gpinyin/gpinyin.1 \
+ contrib/grap2graph/grap2graph.1 contrib/mm/mmroff.1 \
+ contrib/pdfmark/pdfroff.1 contrib/pic2graph/pic2graph.1 \
+ src/devices/grodvi/grodvi.1 src/devices/grohtml/grohtml.1 \
+ src/devices/grolbp/grolbp.1 src/devices/grolj4/grolj4.1 \
+ src/devices/gropdf/gropdf.1 src/devices/gropdf/pdfmom.1 \
+ src/devices/grops/grops.1 src/devices/grotty/grotty.1 \
+ $(am__append_21) src/preproc/preconv/preconv.1 \
+ src/roff/groff/groff.1 src/utils/addftinfo/addftinfo.1 \
+ src/utils/afmtodit/afmtodit.1 src/utils/grog/grog.1 \
+ src/utils/hpftodit/hpftodit.1 src/utils/lkbib/lkbib.1 \
+ src/utils/pfbtops/pfbtops.1 src/utils/tfmtodit/tfmtodit.1 \
+ $(am__append_23) $(am__append_24)
+man5_MANS = man/groff_font.5 man/groff_out.5 man/groff_tmac.5
+man7_MANS = contrib/hdtbl/groff_hdtbl.7 contrib/mm/groff_mm.7 \
+ contrib/mm/groff_mmse.7 contrib/mom/groff_mom.7 \
+ contrib/rfc1345/groff_rfc1345.7 man/groff_char.7 \
+ man/groff_diff.7 man/groff.7 man/roff.7 tmac/groff_ms.7 \
+ tmac/groff_man.7 tmac/groff_man_style.7 tmac/groff_me.7 \
+ tmac/groff_mdoc.7 tmac/groff_trace.7 tmac/groff_www.7
+
+# for lex/yacc
+AM_YFLAGS = -d -v
+
+# Rule to generate ps and roff files
+
+# rule to generate .pdf files from .mom files
+SUFFIXES = .roff .in .ps .mom .pdf .me.in .me .man
+
+# tests launched by make check
+check_SCRIPTS =
+TESTS = contrib/gdiffmk/tests/runtests.sh $(hdtbl_TESTS) $(mm_TESTS) \
+ $(mom_TESTS) $(rfc1345_TESTS) $(font_devpdf_TESTS) \
+ $(grotty_TESTS) $(eqn_TESTS) $(preconv_TESTS) $(refer_TESTS) \
+ $(tbl_TESTS) $(groff_TESTS) $(nroff_TESTS) $(grog_TESTS) \
+ $(tmac_TESTS)
+XFAIL_TESTS = $(groff_XFAIL_TESTS) $(tmac_XFAIL_TESTS)
+AM_TESTS_ENVIRONMENT = \
+ abs_top_srcdir=$(abs_top_srcdir) \
+ abs_top_builddir=$(abs_top_builddir) \
+ export abs_top_srcdir abs_top_builddir;
+
+
+# We use Automake's Uniform Naming Scheme.
+#
+# prefixexecbin_PROGRAMS is the list of programs that may have a
+# NAMEPREFIX if an existing non-GNU troff system was detected.
+#
+# This is done by the m4 macro GROFF_G that checks for the presence of
+# GNU Troff built-in \n[.g] macro. If a Unix Troff binary was
+# detected, the following programs and scripts names will have a 'g'
+# prefix: chem, tbl, eqn, neqn, pic, soelim, grn, refer, lookbib,
+# troff, nroff. Also, PROG_PREFIX will be set to 'g' in the generated
+# header defs.h so that these programs could be called correctly.
+#
+# prefixexecbindir is used to temporary install these programs. They
+# are then moved to bindir during the install-exec-hook. Same thing
+# for the scripts.
+NAMEPREFIX = $(g)
+prefixexecbin_SCRIPTS = chem neqn nroff
+@USEPROGRAMPREFIX_FALSE@prefixexecbindir = $(bindir)
+# We use datadir because the uninstall rule for the PROGRAMS attempts
+# to cd into prefixexecbindir, and thus if prefixexecbindir is removed
+# two consecutive uninstalls would fail
+@USEPROGRAMPREFIX_TRUE@prefixexecbindir = $(datadir)
+
+# Path to binaries and flags used by contribs and doc to generated doc.
+# These may be overridden if cross-compiling.
+GROFFBIN = $(abs_top_builddir)/groff
+GROFF_BIN_PATH = $(abs_top_builddir)
+PDFMOMBIN = $(abs_top_builddir)/pdfmom
+# Search for macro files and device/font description directories in
+# source _and_ build trees; some of each are generated.
+FFLAG = -F$(abs_top_builddir)/font -F$(abs_top_srcdir)/font
+MFLAG = -M$(abs_top_builddir)/tmac -M$(abs_top_srcdir)/tmac
+@MAKE_DEFINES_RM_FALSE@RM = rm -f
+
+# 'VERSION' is generated by gnulib script git-version-gen, using the
+# command 'git describe':
+#
+# - From a git repository: if the current commit corresponds to a
+# tag, then 'VERSION' is simply the tag (e.g. 1.22.3). Otherwise
+# 'VERSION' has the following format:
+# <tag>-<nb_commits>-<commit>
+#
+# With:
+# . tag: the most recent tag reachable from the current commit
+# . nb_commits: number of commits between the most recent tag and
+# the current commit.
+# . current commit, abbreviated.
+# For example: 1.22.3.real.434-5aafd
+# The version is stored in .version.
+#
+# - From a tarball, the version is taken from .tarball-version
+#
+# REVISION is the full revision given by git-version-gen, which can
+# have non-alphanumeric symbols.
+#
+# Also see configure.ac for the related SHORT_VERSION macro.
+MAJOR_VERSION = `echo $(VERSION) | cut -d . -f 1`
+MINOR_VERSION = `echo $(VERSION) | cut -d . -f 2`
+REVISION = `echo $(VERSION) | cut -d . -f 3`
+lib_libgnu_a_SOURCES = $(am__append_1) $(am__append_2) $(am__append_3) \
+ $(am__append_4) lib/localcharset.c lib/math.c $(am__append_5) \
+ lib/printf-frexp.c lib/printf-frexpl.c $(am__append_6) \
+ lib/size_max.h $(am__append_7) $(am__append_8) lib/unistd.c \
+ $(am__append_9) lib/wctype-h.c $(am__append_10) lib/xsize.h \
+ lib/xsize.c
+lib_libgnu_a_CFLAGS = $(AM_CFLAGS) $(GL_CFLAG_GNULIB_WARNINGS)
+lib_libgnu_a_LIBADD = $(gl_LIBOBJS)
+lib_libgnu_a_DEPENDENCIES = $(gl_LIBOBJS)
+EXTRA_lib_libgnu_a_SOURCES = lib/fprintf.c lib/frexp.c lib/frexp.c \
+ lib/frexpl.c lib/isnan.c lib/isnand.c lib/isnan.c lib/isnanf.c \
+ lib/isnan.c lib/isnanl.c lib/printf-frexp.c lib/snprintf.c \
+ lib/asnprintf.c lib/printf-args.c lib/printf-parse.c \
+ lib/vasnprintf.c lib/vsnprintf.c
+
+# Use this preprocessor expression to decide whether #include_next works.
+# Do not rely on a 'configure'-time test for this, since the expression
+# might appear in an installed header, which is used by some other compiler.
+HAVE_INCLUDE_NEXT = (__GNUC__ || __clang__ || 60000000 <= __DECC_VER)
+
+# In 'sed', replace the pattern space with a "DO NOT EDIT" comment.
+SED_HEADER_NOEDIT = s,.*,/* DO NOT EDIT! GENERATED AUTOMATICALLY! */,
+
+# '$(SED_HEADER_STDOUT) -e "..."' runs 'sed' but first outputs "DO NOT EDIT".
+SED_HEADER_STDOUT = sed -e 1h -e '1$(SED_HEADER_NOEDIT)' -e 1G
+
+# '$(SED_HEADER_TO_AT_t) FILE' copies FILE to $@-t, prepending a leading
+# "DO_NOT_EDIT". Although this could be done more simply via:
+# SED_HEADER_TO_AT_t = $(SED_HEADER_STDOUT) > $@-t
+# the -n and 'w' avoid a fork+exec, at least when GNU Make is used.
+SED_HEADER_TO_AT_t = $(SED_HEADER_STDOUT) -n -e 'w $@-t'
+
+# Use $(gl_V_at) instead of $(AM_V_GEN) or $(AM_V_at) on a line that
+# is its recipe's first line if and only if lines are absent.
+gl_V_at = $(AM_V_at)
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+_NORETURN_H = $(top_srcdir)/lib/_Noreturn.h
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+ARG_NONNULL_H = $(top_srcdir)/lib/arg-nonnull.h
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+CXXDEFS_H = $(top_srcdir)/lib/c++defs.h
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+WARN_ON_USE_H = $(top_srcdir)/lib/warn-on-use.h
+
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# mingw.am
+#
+WINSCRIPTS = \
+ arch/mingw/afmtodit.cmd \
+ arch/mingw/chem.cmd \
+ arch/mingw/gperl.cmd \
+ arch/mingw/gpinyin.cmd \
+ arch/mingw/grap2graph.cmd \
+ arch/mingw/grog.cmd \
+ arch/mingw/gropdf.cmd \
+ arch/mingw/mmroff.cmd \
+ arch/mingw/neqn.cmd \
+ arch/mingw/pdfmom.cmd \
+ arch/mingw/roff2dvi.cmd \
+ arch/mingw/roff2html.cmd \
+ arch/mingw/roff2pdf.cmd \
+ arch/mingw/roff2ps.cmd \
+ arch/mingw/roff2text.cmd \
+ arch/mingw/roff2x.cmd
+
+arch_shdeps_sh = arch/misc/shdeps.sh
+chem_srcdir = $(top_srcdir)/contrib/chem
+
+# Files installed in $(datasubdir)/pic
+chempicdir = $(datasubdir)/pic
+dist_chempic_DATA = contrib/chem/chem.pic
+CHEM_GENEXAMPLES = contrib/chem/examples/README
+CHEM_EXAMPLES = \
+ contrib/chem/examples/atp.chem \
+ contrib/chem/examples/cholesterin.chem \
+ contrib/chem/examples/ethamivan.chem \
+ contrib/chem/examples/lsd.chem \
+ contrib/chem/examples/morphine.chem \
+ contrib/chem/examples/penicillin.chem \
+ contrib/chem/examples/reserpine.chem
+
+
+# Files installed in $(exampledir)/chem
+chemexampledir = $(exampledir)/chem
+nodist_chemexample_DATA = $(CHEM_GENEXAMPLES)
+dist_chemexample_DATA = $(CHEM_EXAMPLES)
+
+# Files installed in $(exampledir)/chem/122. All the .chem files in 122 are
+# lazily installed by the local install target
+chemexample122dir = $(chemexampledir)/122
+nodist_chemexample122_DATA = contrib/chem/examples/122/README
+eqn2graph_srcdir = $(top_srcdir)/contrib/eqn2graph
+
+########################################################################
+gdiffmk_srcdir = $(top_srcdir)/contrib/gdiffmk
+
+########################################################################
+glilypond_srcdir = $(top_srcdir)/contrib/glilypond
+
+# files going to lib directory '$(glilypond_dir)'
+# TODO glilypond_dir is subsitued by configure.ac, check if this could be removed
+glilyponddir = $(glilypond_dir)
+gpinyin_srcdir = $(top_srcdir)/contrib/gpinyin
+gpinyindir = $(gpinyin_dir)
+grap2graph_srcdir = $(top_srcdir)/contrib/grap2graph
+hdtbl_srcdir = $(top_srcdir)/contrib/hdtbl
+
+# Groff command used to generate .ps files
+HDTBLGROFF = \
+ GROFF_COMMAND_PREFIX= \
+ GROFF_BIN_PATH="$(GROFF_BIN_PATH)" \
+ $(GROFFBIN) $(FFLAG) $(MFLAG) -M$(hdtbl_srcdir) -t -p -e -U
+
+HDTBLTMACFILES = \
+ contrib/hdtbl/hdtbl.tmac \
+ contrib/hdtbl/hdmisc.tmac
+
+hdtbltmacdir = $(tmacdir)
+dist_hdtbltmac_DATA = $(HDTBLTMACFILES)
+hdtbl_test_template = contrib/hdtbl/examples/test-hdtbl.sh.in
+
+# Files installed in $(exampledir)/hdtbl. HDTBLEXAMPLEFILES are
+# located in the source tree, while HDTBLPROCESSEDEXAMPLEFILES are
+# generated in the build tree.
+
+# These files are handled by the '.in.roff' rule.
+HDTBLGENFILES = \
+ contrib/hdtbl/examples/fonts_n.roff \
+ contrib/hdtbl/examples/fonts_x.roff
+
+HDTBLEXAMPLEFILES = \
+ contrib/hdtbl/examples/common.roff \
+ contrib/hdtbl/examples/chess_board.roff \
+ contrib/hdtbl/examples/color_boxes.roff \
+ contrib/hdtbl/examples/color_nested_tables.roff \
+ contrib/hdtbl/examples/color_table_cells.roff \
+ contrib/hdtbl/examples/color_transitions.roff \
+ contrib/hdtbl/examples/col_rowspan_colors.roff \
+ contrib/hdtbl/examples/mixed_pickles.roff \
+ contrib/hdtbl/examples/rainbow.roff \
+ contrib/hdtbl/examples/short_reference.roff
+
+HDTBLPROCESSEDEXAMPLEFILES = \
+ contrib/hdtbl/examples/chess_board.ps \
+ contrib/hdtbl/examples/color_boxes.ps \
+ contrib/hdtbl/examples/color_nested_tables.ps \
+ contrib/hdtbl/examples/color_table_cells.ps \
+ contrib/hdtbl/examples/color_transitions.ps \
+ contrib/hdtbl/examples/col_rowspan_colors.ps \
+ contrib/hdtbl/examples/fonts_n.ps \
+ contrib/hdtbl/examples/fonts_x.ps \
+ contrib/hdtbl/examples/mixed_pickles.ps \
+ contrib/hdtbl/examples/rainbow.ps \
+ contrib/hdtbl/examples/short_reference.ps
+
+hdtblexampledir = $(exampledir)/hdtbl
+dist_hdtblexample_DATA = $(HDTBLEXAMPLEFILES)
+nodist_hdtblexample_DATA = \
+ $(HDTBLGENFILES) \
+ $(HDTBLPROCESSEDEXAMPLEFILES) \
+ $(DOC_GNU_EPS)
+
+hdtbl_TESTS = contrib/hdtbl/examples/test-hdtbl.sh
+mm_srcdir = $(top_srcdir)/contrib/mm
+mm_builddir = $(top_builddir)/contrib/mm
+
+# Files installed in $(tmacdir)/mm
+MMFILES = \
+ contrib/mm/mm/0.MT \
+ contrib/mm/mm/5.MT \
+ contrib/mm/mm/4.MT \
+ contrib/mm/mm/ms.cov \
+ contrib/mm/mm/se_ms.cov
+
+mmdir = $(tmacdir)/mm
+dist_mm_DATA = $(MMFILES)
+
+# Files installed in $(tmacdir)
+tmacmmdir = $(tmacdir)
+dist_tmacmm_DATA = contrib/mm/refer-mm.tmac
+MMEXAMPLEFILES = \
+ contrib/mm/examples/letter.mm
+
+mmexampledir = $(exampledir)/mm
+dist_mmexample_DATA = $(MMEXAMPLEFILES)
+mm_TESTS = \
+ contrib/mm/tests/LT_SP_AU_without_AT_works.sh \
+ contrib/mm/tests/LT_SP_multi-word_LO_SJ_works.sh \
+ contrib/mm/tests/MT-1-reports-all-TM-numbers.sh \
+ contrib/mm/tests/MT_5_includes_AT_in_SG.sh \
+ contrib/mm/tests/P-indentation-works.sh \
+ contrib/mm/tests/ms_cover_sheet_robust_to_missing_AF.sh \
+ contrib/mm/tests/mse_has-sufficient-footnote-space.sh \
+ contrib/mm/tests/place-equation-labels-correctly-in-displays.sh \
+ contrib/mm/tests/remove-stale-bib-entry-data.sh \
+ contrib/mm/tests/short-pages-do-not-overflow-stack.sh
+
+mom_srcdir = $(top_srcdir)/contrib/mom
+
+# pdfmom command used to generate .pdf
+#
+# Use '-K utf8', not '-k', in case 'configure' didn't find uchardet.
+MOMPDFMOM = \
+ GROFF_COMMAND_PREFIX= \
+ GROFF_BIN_PATH="$(GROFF_BIN_PATH)" \
+ PDFMOM_BIN_PATH="$(top_builddir)" \
+ $(PDFMOMBIN) $(FFLAG) $(MFLAG) -M$(mom_srcdir) -K utf8 -p -e -t
+
+
+# Files installed in $(tmacdir).
+# MOMNORMALFILES are located in the source tree.
+MOMNORMALFILES = \
+ contrib/mom/mom.tmac \
+ contrib/mom/om.tmac
+
+momtmacdir = $(tmacdir)
+dist_momtmac_DATA = $(MOMNORMALFILES)
+
+# Files installed in htmldocdir/mom
+MOMHTMLDOCFILES = \
+ contrib/mom/momdoc/stylesheet.css \
+ contrib/mom/momdoc/appendices.html \
+ contrib/mom/momdoc/color.html \
+ contrib/mom/momdoc/cover.html \
+ contrib/mom/momdoc/definitions.html \
+ contrib/mom/momdoc/docelement.html \
+ contrib/mom/momdoc/docprocessing.html \
+ contrib/mom/momdoc/goodies.html \
+ contrib/mom/momdoc/graphical.html \
+ contrib/mom/momdoc/headfootpage.html \
+ contrib/mom/momdoc/images.html \
+ contrib/mom/momdoc/inlines.html \
+ contrib/mom/momdoc/intro.html \
+ contrib/mom/momdoc/letters.html \
+ contrib/mom/momdoc/macrolist.html \
+ contrib/mom/momdoc/rectoverso.html \
+ contrib/mom/momdoc/refer.html \
+ contrib/mom/momdoc/reserved.html \
+ contrib/mom/momdoc/tables-of-contents.html \
+ contrib/mom/momdoc/toc.html \
+ contrib/mom/momdoc/typesetting.html \
+ contrib/mom/momdoc/using.html \
+ contrib/mom/momdoc/version-2.html
+
+momhtmldir = $(htmldocdir)/mom
+momhtml_DATA = $(MOMHTMLDOCFILES)
+
+# Files installed in $(examplesdir)/mom. MOMEXAMPLEFILES are located
+# in the source tree, while MOMPROCESSEDEXAMPLEFILES are generated in
+# the build tree.
+MOMEXAMPLEFILES = \
+ contrib/mom/examples/letter.mom \
+ contrib/mom/examples/mom-pdf.mom \
+ contrib/mom/examples/mon_premier_doc.mom \
+ contrib/mom/examples/sample_docs.mom \
+ contrib/mom/examples/typesetting.mom \
+ contrib/mom/examples/README.txt \
+ contrib/mom/examples/README-fr.txt \
+ contrib/mom/examples/elvis_syntax \
+ contrib/mom/examples/elvis_syntax.new \
+ contrib/mom/examples/penguin.ps \
+ contrib/mom/examples/penguin.pdf \
+ contrib/mom/examples/mom.vim \
+ contrib/mom/examples/slide-demo.mom \
+ contrib/mom/examples/copyright-default.mom \
+ contrib/mom/examples/copyright-chapter.mom
+
+momexampledir = $(exampledir)/mom
+dist_momexample_DATA = $(MOMEXAMPLEFILES)
+@USE_GROPDF_TRUE@MOMPROCESSEDEXAMPLEFILES = \
+@USE_GROPDF_TRUE@ contrib/mom/examples/letter.pdf \
+@USE_GROPDF_TRUE@ contrib/mom/examples/mom-pdf.pdf \
+@USE_GROPDF_TRUE@ contrib/mom/examples/mon_premier_doc.pdf \
+@USE_GROPDF_TRUE@ contrib/mom/examples/sample_docs.pdf \
+@USE_GROPDF_TRUE@ contrib/mom/examples/slide-demo.pdf \
+@USE_GROPDF_TRUE@ contrib/mom/examples/copyright-default.pdf \
+@USE_GROPDF_TRUE@ contrib/mom/examples/copyright-chapter.pdf \
+@USE_GROPDF_TRUE@ $(am__append_13)
+@USE_GROPDF_TRUE@momprocessedexampledir = $(exampledir)/mom
+@USE_GROPDF_TRUE@nodist_momprocessedexample_DATA = $(MOMPROCESSEDEXAMPLEFILES)
+mom_test_template = contrib/mom/examples/test-mom.sh.in
+
+# Small test suite on mom examples
+mom_TESTS = contrib/mom/examples/tests-mom.sh
+
+# For this list of files we add a symlink from $(exampledir)/mom to $(pdfdocdir)
+PDFDOCFILE = mom-pdf.pdf
+pdfmark_srcdir = $(top_srcdir)/contrib/pdfmark
+pdfmark_builddir = $(top_builddir)/contrib/pdfmark
+
+# Files installed in $(tmacdir)
+TMACFILES = \
+ contrib/pdfmark/pdfmark.tmac \
+ contrib/pdfmark/sanitize.tmac \
+ contrib/pdfmark/spdf.tmac
+
+pdfmarktmacdir = $(tmacdir)
+dist_pdfmarktmac_DATA = $(TMACFILES)
+
+# Files installed in $(pdfdocdir)
+PDFDOCFILES = \
+ contrib/pdfmark/pdfmark.pdf
+
+@USE_PDFROFF_TRUE@pdfmarkpdfdocdir = $(pdfdocdir)
+@USE_PDFROFF_TRUE@nodist_pdfmarkpdfdoc_DATA = $(PDFDOCFILES)
+PDFROFF = \
+ GROFF_TMPDIR=. \
+ GROFF_COMMAND_PREFIX= \
+ GROFF_BIN_DIR="$(GROFF_BIN_DIR)" \
+ GROFF_BIN_PATH="$(GROFF_BIN_PATH)" \
+ ./pdfroff \
+ $(FFLAG) $(MFLAG) -dpaper=$(PAGE) -P-p$(PAGE) -M$(pdfmark_srcdir)
+
+pic2graph_srcdir = $(top_srcdir)/contrib/pic2graph
+rfc1345_srcdir = $(top_srcdir)/contrib/rfc1345
+rfc1345_builddir = $(top_builddir)/contrib/rfc1345
+
+# files installed in $(tmacdir)
+rfc1345tmacdir = $(tmacdir)
+dist_rfc1345tmac_DATA = contrib/rfc1345/rfc1345.tmac
+rfc1345_TESTS = \
+ contrib/rfc1345/tests/rfc1345-smoke-test.sh
+
+sboxes_srcdir = $(top_srcdir)/contrib/sboxes
+sboxes_builddir = $(top_builddir)/contrib/sboxes
+sboxesnotquine = $(sboxes_srcdir)/notquine.sed
+sboxestmacdir = $(tmacdir)
+dist_sboxestmac_DATA = contrib/sboxes/sboxes.tmac
+SBOXES_EXAMPLEFILES = $(sboxes_srcdir)/msboxes.ms.in
+sboxesotherdocdir = $(docdir)
+nodist_sboxesotherdoc_DATA = $(sboxes_builddir)/msboxes.ms
+@USE_GROPDF_TRUE@sboxespdfdocdir = $(pdfdocdir)
+@USE_GROPDF_TRUE@nodist_sboxespdfdoc_DATA = $(sboxes_builddir)/msboxes.pdf
+doc_srcdir = $(abs_top_srcdir)/doc
+doc_builddir = $(abs_top_builddir)/doc
+
+# Some document sources are parameterized in configuration options like
+# the groff version number and the command prefix. Use this in target
+# rules to prepare formattable versions of them from .in files.
+DOC_SED = $(SED) \
+ -e "s;[@]VERSION[@];$(VERSION);" \
+ -e "s;[@]g[@];$(g);g;"
+
+
+# Use this in target rules to run the build tree's groff.
+#
+# It includes flags to locate its tmac and device/font description
+# directories and to produce verbose diagnostics in the event of syntax
+# or formatting problems.
+DOC_GROFF = \
+ GROFF_COMMAND_PREFIX= \
+ GROFF_BIN_PATH="$(GROFF_BIN_PATH)" \
+ $(GROFFBIN) -M $(doc_srcdir) $(MFLAG) $(FFLAG) -ww -b
+
+
+# This image file is used by several documents in the groff source tree.
+DOC_GNU_EPS = doc/gnu.eps
+
+# Other doc, installed in $(docdir)
+# Files located in the source tree
+DOCFILES_INST = \
+ doc/me-revisions \
+ doc/ms.ms \
+ doc/pic.ms
+
+DOCFILES_NOINST = \
+ doc/meintro.me.in \
+ doc/meintro_fr.me.in \
+ doc/meref.me.in
+
+# Files that undergo a transformation prior to groff processing
+GENERATEDDOCFILES = \
+ doc/meintro.me \
+ doc/meintro_fr.me \
+ doc/meref.me
+
+# Files generated in the build tree
+@USE_GROHTML_TRUE@PROCESSEDDOCFILES_HTML = \
+@USE_GROHTML_TRUE@ doc/pic.html
+
+@USE_GROPDF_TRUE@PROCESSEDDOCFILES_PDF = \
+@USE_GROPDF_TRUE@ doc/automake.pdf \
+@USE_GROPDF_TRUE@ doc/groff-man-pages.pdf
+
+PROCESSEDDOCFILES_PS = \
+ doc/meref.ps \
+ doc/meintro.ps \
+ doc/meintro_fr.ps \
+ doc/ms.ps \
+ doc/pic.ps
+
+PROCESSEDDOCFILES_TXT = \
+ doc/groff-man-pages.utf8.txt
+
+PROCESSEDDOCFILES = \
+ $(PROCESSEDDOCFILES_HTML) \
+ $(PROCESSEDDOCFILES_PS) \
+ $(PROCESSEDDOCFILES_PDF) \
+ $(PROCESSEDDOCFILES_TXT)
+
+
+# Declare minimal dependencies for documents by output driver.
+PROCESSEDFILES_DEPS_HTML = pre-grohtml groff troff post-grohtml \
+ font/devhtml/stamp font/devps/stamp
+
+PROCESSEDFILES_DEPS_PS = groff troff grops font/devps/stamp
+PROCESSEDFILES_DEPS_PDF = groff troff gropdf font/devpdf/stamp
+PROCESSEDFILES_DEPS_TXT = groff troff grotty font/devutf8/stamp
+otherdocdir = $(docdir)
+dist_otherdoc_DATA = $(DOCFILES_INST)
+nodist_otherdoc_DATA = $(PROCESSEDDOCFILES) $(GENERATEDDOCFILES)
+@USE_GROPDF_TRUE@docpdfdocdir = $(pdfdocdir)
+@USE_GROPDF_TRUE@nodist_docpdfdoc_DATA = doc/automake.pdf
+
+# GNU PIC html documentation, installed in $(htmldocdir)
+# Other pic*.html files are installed by the local rule
+@USE_GROHTML_TRUE@htmlpicdir = $(htmldocdir)
+@USE_GROHTML_TRUE@htmlpic_DATA = $(PROCESSEDDOCFILES_HTML)
+@USE_GROHTML_TRUE@HTMLDOCFILESALL = pic*.html
+@USE_GROHTML_TRUE@HTMLDOCIMAGEFILES = pic*
+
+# Examples files, installed in $(exampledir)
+
+# source tree files
+EXAMPLEFILES = \
+ doc/webpage.ms \
+ doc/groff.css \
+ doc/grnexmpl.g \
+ doc/grnexmpl.me
+
+@USE_GROHTML_FALSE@PROCESSEDEXAMPLEFILES_HTML =
+
+# Generated in the build tree
+@USE_GROHTML_TRUE@PROCESSEDEXAMPLEFILES_HTML = doc/webpage.html
+PROCESSEDEXAMPLEFILES_PS = \
+ doc/webpage.ps \
+ doc/grnexmpl.ps
+
+PROCESSEDEXAMPLEFILES = \
+ $(PROCESSEDEXAMPLEFILES_HTML) \
+ $(PROCESSEDEXAMPLEFILES_PS)
+
+docexamplesdir = $(exampledir)
+dist_docexamples_DATA = $(EXAMPLEFILES)
+nodist_docexamples_DATA = $(PROCESSEDEXAMPLEFILES)
+
+# webpage.html is generated; webpage*.html files are installed by the
+# local rule.
+@USE_GROHTML_TRUE@HTMLEXAMPLEFILESALL = webpage*.html
+@USE_GROHTML_TRUE@HTMLEXAMPLEIMAGEFILES = webpage*
+@USE_GROHTML_TRUE@htmlexamplesdir = $(exampledir)
+
+# Locate image subdirectory for HTML documents relative to an
+# installation directory such as `htmldocdir` or `exampledir`. Do _not_
+# use for locating files within the source or build trees.
+imagedir = img
+
+# Introduce variables to house the groff man pages. We break the list
+# of page sources into multiple chunks because we have to load Swedish
+# localization before formatting groff_mmse.7 and then reload English
+# localization afterward. This also serves as a test of groff locale
+# switching; being lazy and shunting groff_mmse.7 off to the end of the
+# document would not achieve this goal (and not loading Swedish
+# localization at all to format it would be gauche).
+GROFF_MAN_PAGES1 = \
+ src/utils/addftinfo/addftinfo.1 \
+ src/utils/afmtodit/afmtodit.1 \
+ contrib/chem/chem.1 \
+ src/preproc/eqn/eqn.1 \
+ contrib/eqn2graph/eqn2graph.1 \
+ contrib/gdiffmk/gdiffmk.1 \
+ contrib/glilypond/glilypond.1 \
+ contrib/gperl/gperl.1 \
+ contrib/gpinyin/gpinyin.1 \
+ contrib/grap2graph/grap2graph.1 \
+ src/preproc/grn/grn.1 \
+ src/devices/grodvi/grodvi.1 \
+ src/roff/groff/groff.1 \
+ src/utils/grog/grog.1 \
+ src/devices/grohtml/grohtml.1 \
+ src/devices/grolbp/grolbp.1 \
+ src/devices/grolj4/grolj4.1 \
+ src/devices/gropdf/gropdf.1 \
+ src/devices/grops/grops.1 \
+ src/devices/grotty/grotty.1 \
+ $(GXDITVIEW_MAN1) \
+ src/utils/hpftodit/hpftodit.1 \
+ src/utils/indxbib/indxbib.1 \
+ src/utils/lkbib/lkbib.1 \
+ src/utils/lookbib/lookbib.1 \
+ contrib/mm/mmroff.1 \
+ src/preproc/eqn/neqn.1 \
+ src/roff/nroff/nroff.1 \
+ src/devices/gropdf/pdfmom.1 \
+ contrib/pdfmark/pdfroff.1 \
+ src/utils/pfbtops/pfbtops.1 \
+ src/preproc/pic/pic.1 \
+ contrib/pic2graph/pic2graph.1 \
+ src/preproc/preconv/preconv.1 \
+ src/preproc/refer/refer.1 \
+ src/preproc/soelim/soelim.1 \
+ src/preproc/tbl/tbl.1 \
+ src/utils/tfmtodit/tfmtodit.1 \
+ src/roff/troff/troff.1 \
+ $(XTOTROFF_MAN1) \
+ man/groff_font.5 \
+ man/groff_out.5 \
+ man/groff_tmac.5 \
+ man/groff.7 \
+ man/groff_char.7 \
+ man/groff_diff.7 \
+ contrib/hdtbl/groff_hdtbl.7 \
+ tmac/groff_man.7 \
+ tmac/groff_man_style.7 \
+ tmac/groff_mdoc.7 \
+ tmac/groff_me.7 \
+ contrib/mm/groff_mm.7
+
+GROFF_MAN_PAGES2 = \
+ contrib/mm/groff_mmse.7
+
+GROFF_MAN_PAGES3 = \
+ contrib/mom/groff_mom.7 \
+ tmac/groff_ms.7 \
+ contrib/rfc1345/groff_rfc1345.7 \
+ tmac/groff_trace.7 \
+ tmac/groff_www.7 \
+ man/roff.7
+
+GROFF_MAN_PAGES_ALL = $(GROFF_MAN_PAGES1) $(GROFF_MAN_PAGES2) \
+ $(GROFF_MAN_PAGES3)
+
+
+# groff Texinfo manual
+#
+# We produce all possible formats by by default and ship them in the
+# distribution archive ('make dist') so that people don't need to have
+# 'makeinfo' or TeX available.
+#
+# The GNU info, plain text, and HTML formats require only 'makeinfo'.
+#
+# DVI and PDF require a working TeX installation. We can't use
+# Automake's facilities for PDF production because its 'dist' target
+# attempts to generate 'groff.pdf' by invoking 'texi2dvi' without the
+# '-E' option (use 'makeinfo' to expand macros), which is needed to
+# build this file. 'texi2dvi' honors the 'MAKEINFO' environment
+# variable.
+#
+# Were the foregoing not true, we would simply say this:
+#info_TEXINFOS = doc/groff.texi
+#doc_groff_TEXINFOS = doc/fdl.texi
+@USE_TEX_TRUE@GROFF_DVI = doc/groff.dvi
+@USE_TEX_TRUE@GROFF_PDF = doc/groff.pdf
+DEVX100FONTS = \
+ font/devX100/DESC \
+ font/devX100/TR \
+ font/devX100/TI \
+ font/devX100/TB \
+ font/devX100/TBI \
+ font/devX100/CR \
+ font/devX100/CI \
+ font/devX100/CB \
+ font/devX100/CBI \
+ font/devX100/HR \
+ font/devX100/HI \
+ font/devX100/HB \
+ font/devX100/HBI \
+ font/devX100/NR \
+ font/devX100/NI \
+ font/devX100/NB \
+ font/devX100/NBI \
+ font/devX100/S
+
+@WITHOUT_X11_FALSE@devX100_fontdir = $(fontdir)/devX100
+@WITHOUT_X11_FALSE@devX100_font_DATA = $(DEVX100FONTS)
+devX100_fontsrcdir = $(top_srcdir)/font/devX100
+DEVX10012FONTS = \
+ font/devX100-12/DESC \
+ font/devX100-12/TR \
+ font/devX100-12/TI \
+ font/devX100-12/TB \
+ font/devX100-12/TBI \
+ font/devX100-12/CR \
+ font/devX100-12/CI \
+ font/devX100-12/CB \
+ font/devX100-12/CBI \
+ font/devX100-12/HR \
+ font/devX100-12/HI \
+ font/devX100-12/HB \
+ font/devX100-12/HBI \
+ font/devX100-12/NR \
+ font/devX100-12/NI \
+ font/devX100-12/NB \
+ font/devX100-12/NBI \
+ font/devX100-12/S
+
+@WITHOUT_X11_FALSE@devX100_12_fontdir = $(fontdir)/devX100-12
+@WITHOUT_X11_FALSE@devX100_12_font_DATA = $(DEVX10012FONTS)
+devX100_12_fontsrcdir = $(top_srcdir)/font/devX100-12
+DEVX75FONTS = \
+ font/devX75/DESC \
+ font/devX75/TR \
+ font/devX75/TI \
+ font/devX75/TB \
+ font/devX75/TBI \
+ font/devX75/CR \
+ font/devX75/CI \
+ font/devX75/CB \
+ font/devX75/CBI \
+ font/devX75/HR \
+ font/devX75/HI \
+ font/devX75/HB \
+ font/devX75/HBI \
+ font/devX75/NR \
+ font/devX75/NI \
+ font/devX75/NB \
+ font/devX75/NBI \
+ font/devX75/S
+
+@WITHOUT_X11_FALSE@devX75_fontdir = $(fontdir)/devX75
+@WITHOUT_X11_FALSE@devX75_font_DATA = $(DEVX75FONTS)
+devX75_fontsrcdir = $(top_srcdir)/font/devX75
+DEVX7512FONTS = \
+ font/devX75-12/DESC \
+ font/devX75-12/TR \
+ font/devX75-12/TI \
+ font/devX75-12/TB \
+ font/devX75-12/TBI \
+ font/devX75-12/CR \
+ font/devX75-12/CI \
+ font/devX75-12/CB \
+ font/devX75-12/CBI \
+ font/devX75-12/HR \
+ font/devX75-12/HI \
+ font/devX75-12/HB \
+ font/devX75-12/HBI \
+ font/devX75-12/NR \
+ font/devX75-12/NI \
+ font/devX75-12/NB \
+ font/devX75-12/NBI \
+ font/devX75-12/S
+
+@WITHOUT_X11_FALSE@devX75_12_fontdir = $(fontdir)/devX75-12
+@WITHOUT_X11_FALSE@devX75_12_font_DATA = $(DEVX7512FONTS)
+devX75_12_fontsrcdir = $(top_srcdir)/font/devX75-12
+devascii_srcdir = $(top_srcdir)/font/devascii
+DEVASCIIFONTS = R I B BI
+DEVASCIIFONTSFILES = \
+ font/devascii/R font/devascii/I font/devascii/B font/devascii/BI
+
+DEVASCIIRES = 240
+DEVASCIICPI = 10
+DEVASCIILPI = 6
+devasciifontdir = $(fontdir)/devascii
+devasciifont_DATA = $(DEVASCIIFONTSFILES) font/devascii/DESC
+devcp1047_srcdir = $(top_srcdir)/font/devcp1047
+DEVCP1047FONTS = R I B BI
+DEVCP1047FONTSFILES = \
+ font/devcp1047/R font/devcp1047/I font/devcp1047/B font/devcp1047/BI
+
+DEVCP1047RES = 240
+DEVCP1047CPI = 10
+DEVCP1047LPI = 6
+devcp1047fontdir = $(fontdir)/devcp1047
+devcp1047font_DATA = $(DEVCP1047FONTSFILES) font/devcp1047/DESC
+devdvi_srcdir = $(top_srcdir)/font/devdvi
+DEVDVIFONTFILES = \
+ font/devdvi/TR \
+ font/devdvi/TI \
+ font/devdvi/TB \
+ font/devdvi/TBI \
+ font/devdvi/CW \
+ font/devdvi/CWI \
+ font/devdvi/HR \
+ font/devdvi/HI \
+ font/devdvi/HB \
+ font/devdvi/HBI \
+ font/devdvi/TREC \
+ font/devdvi/TIEC \
+ font/devdvi/TBEC \
+ font/devdvi/TBIEC \
+ font/devdvi/CWEC \
+ font/devdvi/CWIEC \
+ font/devdvi/HREC \
+ font/devdvi/HIEC \
+ font/devdvi/HBEC \
+ font/devdvi/HBIEC \
+ font/devdvi/TRTC \
+ font/devdvi/TITC \
+ font/devdvi/TBTC \
+ font/devdvi/TBITC \
+ font/devdvi/CWTC \
+ font/devdvi/CWITC \
+ font/devdvi/HRTC \
+ font/devdvi/HITC \
+ font/devdvi/HBTC \
+ font/devdvi/HBITC \
+ font/devdvi/MI \
+ font/devdvi/S \
+ font/devdvi/EX \
+ font/devdvi/SA \
+ font/devdvi/SB \
+ font/devdvi/SC
+
+devdvifontdir = $(fontdir)/devdvi
+devdvifont_DATA = $(DEVDVIFONTFILES) font/devdvi/DESC
+DEVDVIGENFILES = \
+ font/devdvi/generate/Makefile \
+ font/devdvi/generate/msam.map \
+ font/devdvi/generate/msbm.map \
+ font/devdvi/generate/texb.map \
+ font/devdvi/generate/texex.map \
+ font/devdvi/generate/texi.map \
+ font/devdvi/generate/texmi.map \
+ font/devdvi/generate/texr.map \
+ font/devdvi/generate/texsy.map \
+ font/devdvi/generate/textt.map \
+ font/devdvi/generate/textex.map \
+ font/devdvi/generate/ec.map \
+ font/devdvi/generate/tc.map \
+ font/devdvi/generate/CompileFonts
+
+devdvigendir = $(fontdir)/devdvi/generate
+devdvigen_DATA = $(DEVDVIGENFILES)
+devhtml_srcdir = $(top_srcdir)/font/devhtml
+DEVHTMLFONTS = R I B BI CR CI CB CBI S
+DEVHTMLFONTSFILES = \
+ font/devhtml/R \
+ font/devhtml/I \
+ font/devhtml/B \
+ font/devhtml/BI \
+ font/devhtml/CR \
+ font/devhtml/CI \
+ font/devhtml/CB \
+ font/devhtml/CBI \
+ font/devhtml/S
+
+DEVHTMLRES = 240
+DEVHTMLCPI = 10
+DEVHTMLLPI = 6
+devhtmlfontdir = $(fontdir)/devhtml
+devhtmlfont_DATA = $(DEVHTMLFONTSFILES) font/devhtml/DESC
+devlatin1_srcdir = $(top_srcdir)/font/devlatin1
+DEVLATIN1FONTS = R I B BI
+DEVLATIN1FONTSFILES = \
+ font/devlatin1/R font/devlatin1/I font/devlatin1/B font/devlatin1/BI
+
+DEVLATIN1RES = 240
+DEVLATIN1CPI = 10
+DEVLATIN1LPI = 6
+devlatin1fontdir = $(fontdir)/devlatin1
+devlatin1font_DATA = $(DEVLATIN1FONTSFILES) font/devlatin1/DESC
+LBPPRINT = $(PSPRINT)
+devlbp_srcdir = $(top_srcdir)/font/devlbp
+DEVLBPFONTFILES = \
+ font/devlbp/HB \
+ font/devlbp/HBI \
+ font/devlbp/HI \
+ font/devlbp/HR \
+ font/devlbp/HNB \
+ font/devlbp/HNBI \
+ font/devlbp/HNI \
+ font/devlbp/HNR \
+ font/devlbp/TB \
+ font/devlbp/TBI \
+ font/devlbp/TI \
+ font/devlbp/TR \
+ font/devlbp/CR \
+ font/devlbp/CB \
+ font/devlbp/CI \
+ font/devlbp/ER \
+ font/devlbp/EB \
+ font/devlbp/EI
+
+devlbpfontdir = $(fontdir)/devlbp
+devlbpfont_DATA = $(DEVLBPFONTFILES) font/devlbp/DESC
+devlj4_srcdir = $(top_srcdir)/font/devlj4
+LJ4RES = 1200
+LJ4PRINT = $(PSPRINT)
+DEVLJ4FONTFILES = \
+ font/devlj4/AB \
+ font/devlj4/ABI \
+ font/devlj4/AI \
+ font/devlj4/AR \
+ font/devlj4/ALBB \
+ font/devlj4/ALBR \
+ font/devlj4/AOB \
+ font/devlj4/AOI \
+ font/devlj4/AOR \
+ font/devlj4/CB \
+ font/devlj4/CBI \
+ font/devlj4/CI \
+ font/devlj4/CR \
+ font/devlj4/GB \
+ font/devlj4/GBI \
+ font/devlj4/GI \
+ font/devlj4/GR \
+ font/devlj4/LGB \
+ font/devlj4/LGI \
+ font/devlj4/LGR \
+ font/devlj4/OB \
+ font/devlj4/OBI \
+ font/devlj4/OI \
+ font/devlj4/OR \
+ font/devlj4/TB \
+ font/devlj4/TBI \
+ font/devlj4/TI \
+ font/devlj4/TR \
+ font/devlj4/TNRB \
+ font/devlj4/TNRBI \
+ font/devlj4/TNRI \
+ font/devlj4/TNRR \
+ font/devlj4/UB \
+ font/devlj4/UBI \
+ font/devlj4/UI \
+ font/devlj4/UR \
+ font/devlj4/UCB \
+ font/devlj4/UCBI \
+ font/devlj4/UCI \
+ font/devlj4/UCR \
+ font/devlj4/CLARENDON \
+ font/devlj4/CORONET \
+ font/devlj4/MARIGOLD \
+ font/devlj4/S \
+ font/devlj4/SYMBOL \
+ font/devlj4/WINGDINGS
+
+devlj4fontdir = $(fontdir)/devlj4
+dist_devlj4font_DATA = $(DEVLJ4FONTFILES)
+nodist_devlj4font_DATA = font/devlj4/DESC
+DEVLJ4GENFILES = \
+ font/devlj4/generate/Makefile \
+ font/devlj4/generate/special.map \
+ font/devlj4/generate/symbol.map \
+ font/devlj4/generate/text.map \
+ font/devlj4/generate/wingdings.map \
+ font/devlj4/generate/special.awk
+
+devlj4fontgendir = $(devlj4fontdir)/generate
+dist_devlj4fontgen_DATA = $(DEVLJ4GENFILES)
+devpdf_srcdir = $(top_srcdir)/font/devpdf
+GROFF_FONT_FILES = `cd $(top_builddir)/font/devpdf \
+ && grep -ls internalname [A-CEG-Z]*`
+
+ENC_FILES = `cd $(top_builddir)/font/devpdf; ls enc/*`
+MAP_FILES = `cd $(top_builddir)/font/devpdf; ls map/*`
+devpdffontdir = $(fontdir)/devpdf
+devpdffont_DATA = \
+ font/devpdf/DESC \
+ font/devpdf/Foundry
+
+devpdffontencdir = $(devpdffontdir)/enc
+devpdffontenc_DATA = font/devpdf/enc/text.enc
+devpdffontmapdir = $(devpdffontdir)/map
+devpdffontmapdata = \
+ font/devpdf/map/dingbats.map \
+ font/devpdf/map/symbol.map \
+ font/devpdf/map/symbolchars \
+ font/devpdf/map/text.map
+
+devpdffontmap_DATA = $(devpdffontmapdata)
+font_devpdf_default_test = \
+ $(devpdf_srcdir)/tests/check-default-foundry.sh.in
+
+font_devpdf_urw_test = $(devpdf_srcdir)/tests/check-urw-foundry.sh.in
+font_devpdf_TESTS = \
+ font/devpdf/tests/check-default-foundry.sh \
+ font/devpdf/tests/check-urw-foundry.sh
+
+devps_srcdir = $(top_srcdir)/font/devps
+devps_builddir = $(top_builddir)/font/devps
+DEVPSFONTFILES = \
+ font/devps/S \
+ font/devps/SS \
+ font/devps/ZD \
+ font/devps/ZDR \
+ font/devps/ZCMI \
+ font/devps/AB \
+ font/devps/ABI \
+ font/devps/AI \
+ font/devps/AR \
+ font/devps/BMB \
+ font/devps/BMBI \
+ font/devps/BMI \
+ font/devps/BMR \
+ font/devps/CB \
+ font/devps/CBI \
+ font/devps/CI \
+ font/devps/CR \
+ font/devps/HB \
+ font/devps/HBI \
+ font/devps/HI \
+ font/devps/HR \
+ font/devps/HNB \
+ font/devps/HNBI \
+ font/devps/HNI \
+ font/devps/HNR \
+ font/devps/NB \
+ font/devps/NBI \
+ font/devps/NI \
+ font/devps/NR \
+ font/devps/PB \
+ font/devps/PBI \
+ font/devps/PI \
+ font/devps/PR \
+ font/devps/TB \
+ font/devps/TBI \
+ font/devps/TI \
+ font/devps/TR \
+ font/devps/EURO \
+ font/devps/freeeuro.afm \
+ font/devps/symbolsl.afm \
+ font/devps/text.enc \
+ font/devps/zapfdr.afm \
+ font/devps/download
+
+DEVPSFONTFILES_GENERATED = \
+ font/devps/DESC \
+ font/devps/prologue \
+ font/devps/freeeuro.pfa \
+ font/devps/zapfdr.pfa \
+ font/devps/symbolsl.pfa
+
+devpsfontdir = $(fontdir)/devps
+dist_devpsfont_DATA = $(DEVPSFONTFILES)
+nodist_devpsfont_DATA = $(DEVPSFONTFILES_GENERATED)
+
+# these files will be installed in oldfontdir
+OLDDEVPSFONTFILES = \
+ font/devps/old/S \
+ font/devps/old/SS \
+ font/devps/old/CB \
+ font/devps/old/CBI \
+ font/devps/old/CI \
+ font/devps/old/CR \
+ font/devps/old/HB \
+ font/devps/old/HBI \
+ font/devps/old/HI \
+ font/devps/old/HR \
+ font/devps/old/HNB \
+ font/devps/old/HNBI \
+ font/devps/old/HNI \
+ font/devps/old/HNR \
+ font/devps/old/NB \
+ font/devps/old/NBI \
+ font/devps/old/NI \
+ font/devps/old/NR \
+ font/devps/old/PB \
+ font/devps/old/PBI \
+ font/devps/old/PI \
+ font/devps/old/PR \
+ font/devps/old/TB \
+ font/devps/old/TBI \
+ font/devps/old/TI \
+ font/devps/old/TR \
+ font/devps/old/symbol.afm \
+ font/devps/old/symbolsl.afm \
+ font/devps/old/zapfdr.afm \
+ font/devps/old/zapfdr.ps
+
+olddevpsfontdir = $(oldfontdir)/devps
+dist_olddevpsfont_DATA = $(OLDDEVPSFONTFILES)
+
+# Files installed in $(devfontdir)/generate
+DEVPSGENFILES = \
+ font/devps/generate/Makefile \
+ font/devps/generate/dingbats.map \
+ font/devps/generate/dingbats-reversed.map \
+ font/devps/generate/slanted-symbol.map \
+ font/devps/generate/symbol.map \
+ font/devps/generate/symbolchars \
+ font/devps/generate/text.map
+
+DEVPSGENSCRIPTS = \
+ font/devps/generate/afmname \
+ font/devps/generate/symbol.sed
+
+devpsgendir = $(devpsfontdir)/generate
+dist_devpsgen_DATA = $(DEVPSGENFILES) $(DEVPSGENSCRIPTS)
+devutf8_srcdir = $(top_srcdir)/font/devutf8
+DEVUTF8FONTS = R I B BI
+DEVUTF8FONTSFILES = \
+ font/devutf8/R font/devutf8/I font/devutf8/B font/devutf8/BI
+
+DEVUTF8RES = 240
+DEVUTF8CPI = 10
+DEVUTF8LPI = 6
+devutf8fontdir = $(fontdir)/devutf8
+devutf8font_DATA = $(DEVUTF8FONTSFILES) font/devutf8/DESC
+
+# Scripts for font files generation
+GENFONTSSH = $(top_srcdir)/font/scripts/genfonts.sh
+GENDESCSH = $(top_srcdir)/font/scripts/gendesc.sh
+nodist_noinst_HEADERS = defs.h
+libbib_a_SOURCES = \
+ src/libs/libbib/common.cpp \
+ src/libs/libbib/index.cpp \
+ src/libs/libbib/linear.cpp \
+ src/libs/libbib/search.cpp \
+ src/libs/libbib/map.c
+
+libdriver_a_SOURCES = \
+ src/libs/libdriver/input.cpp \
+ src/libs/libdriver/printer.cpp
+
+libgroff_srcdir = $(top_srcdir)/src/libs/libgroff
+libgroff_a_CPPFLAGS = \
+ $(AM_CPPFLAGS) \
+ -D__GETOPT_PREFIX=groff_ \
+ -DENABLE_RELOCATABLE=1 \
+ -DLIBDIR=\"$(libdir)\"
+
+
+# Build from OBJS
+libgroff_a_SOURCES = src/libs/libgroff/assert.cpp \
+ src/libs/libgroff/change_lf.cpp src/libs/libgroff/cmap.cpp \
+ src/libs/libgroff/color.cpp src/libs/libgroff/cset.cpp \
+ src/libs/libgroff/curtime.cpp src/libs/libgroff/device.cpp \
+ src/libs/libgroff/errarg.cpp src/libs/libgroff/error.cpp \
+ src/libs/libgroff/fatal.cpp src/libs/libgroff/filename.cpp \
+ src/libs/libgroff/font.cpp src/libs/libgroff/fontfile.cpp \
+ src/libs/libgroff/geometry.cpp src/libs/libgroff/getopt.c \
+ src/libs/libgroff/getopt1.c src/libs/libgroff/glyphuni.cpp \
+ src/libs/libgroff/htmlhint.cpp src/libs/libgroff/hypot.cpp \
+ src/libs/libgroff/iftoa.c src/libs/libgroff/invalid.cpp \
+ src/libs/libgroff/itoa.c src/libs/libgroff/lf.cpp \
+ src/libs/libgroff/lineno.cpp src/libs/libgroff/localcharset.c \
+ src/libs/libgroff/macropath.cpp src/libs/libgroff/matherr.c \
+ src/libs/libgroff/maxfilename.cpp \
+ src/libs/libgroff/maxpathname.cpp src/libs/libgroff/mksdir.cpp \
+ src/libs/libgroff/nametoindex.cpp src/libs/libgroff/paper.cpp \
+ src/libs/libgroff/prime.cpp src/libs/libgroff/progname.c \
+ src/libs/libgroff/ptable.cpp src/libs/libgroff/quotearg.c \
+ src/libs/libgroff/relocate.cpp \
+ src/libs/libgroff/searchpath.cpp src/libs/libgroff/spawnvp.c \
+ src/libs/libgroff/string.cpp src/libs/libgroff/strsave.cpp \
+ src/libs/libgroff/symbol.cpp src/libs/libgroff/tmpfile.cpp \
+ src/libs/libgroff/tmpname.cpp src/libs/libgroff/unicode.cpp \
+ src/libs/libgroff/uniglyph.cpp src/libs/libgroff/uniuni.cpp \
+ src/libs/libgroff/relocatable.h $(am__append_16)
+nodist_libgroff_a_SOURCES = src/libs/libgroff/version.cpp
+
+# Data for localcharset.c. Taken from libiconv/libcharset.
+LIBGROFF_PACKAGE = groff
+@WITHOUT_X11_FALSE@libxutil_a_CPPFLAGS = $(AM_CPPFLAGS) $(X_CFLAGS)
+@WITHOUT_X11_FALSE@libxutil_a_SOURCES = \
+@WITHOUT_X11_FALSE@ src/libs/libxutil/DviChar.c \
+@WITHOUT_X11_FALSE@ src/libs/libxutil/XFontName.c \
+@WITHOUT_X11_FALSE@ src/libs/libxutil/xmalloc.c
+
+grodvi_SOURCES = src/devices/grodvi/dvi.cpp
+grodvi_LDADD = \
+ libdriver.a \
+ libgroff.a \
+ lib/libgnu.a $(LIBM)
+
+post_grohtml_SOURCES = \
+ src/devices/grohtml/post-html.cpp \
+ src/devices/grohtml/html-table.cpp \
+ src/devices/grohtml/html-text.cpp \
+ src/devices/grohtml/output.cpp \
+ src/devices/grohtml/html.h \
+ src/devices/grohtml/html-text.h \
+ src/devices/grohtml/html-table.h
+
+post_grohtml_LDADD = $(LIBM) \
+ libdriver.a \
+ libgroff.a \
+ lib/libgnu.a
+
+grolbp_SOURCES = \
+ src/devices/grolbp/lbp.cpp \
+ src/devices/grolbp/lbp.h \
+ src/devices/grolbp/charset.h
+
+grolbp_LDADD = $(LIBM) \
+ libdriver.a \
+ libgroff.a \
+ lib/libgnu.a
+
+grolj4_SOURCES = src/devices/grolj4/lj4.cpp
+grolj4_LDADD = $(LIBM) \
+ libdriver.a \
+ libgroff.a \
+ lib/libgnu.a
+
+gropdf_dir = $(top_srcdir)/src/devices/gropdf
+grops_SOURCES = \
+ src/devices/grops/ps.cpp \
+ src/devices/grops/psrm.cpp \
+ src/devices/grops/ps.h
+
+grops_LDADD = $(LIBM) \
+ libdriver.a \
+ libgroff.a \
+ lib/libgnu.a
+
+grotty_SOURCES = src/devices/grotty/tty.cpp
+grotty_LDADD = $(LIBM) \
+ libdriver.a \
+ libgroff.a \
+ lib/libgnu.a
+
+grotty_TESTS = \
+ src/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh \
+ src/devices/grotty/tests/osc8_works.sh
+
+GXDITVIEWSOURCES = \
+ src/devices/xditview/device.c \
+ src/devices/xditview/draw.c \
+ src/devices/xditview/draw.h \
+ src/devices/xditview/Dvi.c \
+ src/devices/xditview/font.c \
+ src/devices/xditview/font.h \
+ src/devices/xditview/lex.c \
+ src/devices/xditview/lex.h \
+ src/devices/xditview/page.c \
+ src/devices/xditview/page.h \
+ src/devices/xditview/parse.c \
+ src/devices/xditview/parse.h \
+ src/devices/xditview/xditview.c \
+ src/devices/xditview/device.h \
+ src/devices/xditview/DviP.h \
+ src/devices/xditview/Menu.h \
+ src/devices/xditview/Dvi.h
+
+GXDITVIEW_GROFF_VERSION_H = src/devices/xditview/groff_version.h
+@WITHOUT_X11_FALSE@GXDITVIEW_MAN1 = src/devices/xditview/gxditview.1
+@WITHOUT_X11_TRUE@GXDITVIEW_MAN1 =
+@WITHOUT_X11_FALSE@xditview_srcdir = $(top_srcdir)/src/devices/xditview
+@WITHOUT_X11_FALSE@gxditview_CPPFLAGS = $(AM_CPPFLAGS) $(X_CFLAGS) -Dlint \
+@WITHOUT_X11_FALSE@ -I$(top_builddir)/src/devices/xditview
+
+@WITHOUT_X11_FALSE@gxditview_LDADD = $(X_LIBS) $(X_PRE_LIBS) -lXaw -lXmu -lXt -lX11 \
+@WITHOUT_X11_FALSE@ $(X_EXTRA_LIBS) $(LIBM) libxutil.a lib/libgnu.a
+
+@WITHOUT_X11_FALSE@XDITVIEW_GENHDRS = \
+@WITHOUT_X11_FALSE@ src/devices/xditview/GXditview-ad.h \
+@WITHOUT_X11_FALSE@ $(GXDITVIEW_GROFF_VERSION_H)
+
+@WITHOUT_X11_FALSE@gxditview_SOURCES = $(GXDITVIEWSOURCES)
+@WITHOUT_X11_FALSE@nodist_gxditview_SOURCES = $(XDITVIEW_GENHDRS)
+eqn_CPPFLAGS = \
+ $(AM_CPPFLAGS) \
+ -I $(top_srcdir)/src/preproc/eqn \
+ -I $(top_builddir)/src/preproc/eqn
+
+eqn_LDADD = $(LIBM) libgroff.a lib/libgnu.a
+eqn_SOURCES = \
+ src/preproc/eqn/main.cpp \
+ src/preproc/eqn/lex.cpp \
+ src/preproc/eqn/box.cpp \
+ src/preproc/eqn/limit.cpp \
+ src/preproc/eqn/list.cpp \
+ src/preproc/eqn/over.cpp \
+ src/preproc/eqn/text.cpp \
+ src/preproc/eqn/script.cpp \
+ src/preproc/eqn/mark.cpp \
+ src/preproc/eqn/other.cpp \
+ src/preproc/eqn/delim.cpp \
+ src/preproc/eqn/sqrt.cpp \
+ src/preproc/eqn/pile.cpp \
+ src/preproc/eqn/special.cpp \
+ src/preproc/eqn/eqn.ypp \
+ src/preproc/eqn/box.h \
+ src/preproc/eqn/pbox.h \
+ src/preproc/eqn/eqn.h
+
+eqn_TESTS = \
+ src/preproc/eqn/tests/diagnostics-report-correct-line-numbers.sh
+
+grn_SOURCES = \
+ src/preproc/grn/hdb.cpp \
+ src/preproc/grn/hpoint.cpp \
+ src/preproc/grn/hgraph.cpp \
+ src/preproc/grn/main.cpp \
+ src/preproc/grn/gprint.h
+
+grn_LDADD = libgroff.a lib/libgnu.a $(LIBM)
+pre_grohtml_LDADD = libgroff.a lib/libgnu.a $(LIBM)
+pre_grohtml_SOURCES = \
+ src/preproc/html/pre-html.cpp \
+ src/preproc/html/pushback.cpp \
+ src/preproc/html/pre-html.h \
+ src/preproc/html/pushback.h
+
+pic_CPPFLAGS = $(AM_CPPFLAGS) \
+ -I $(top_srcdir)/src/preproc/pic \
+ -I $(top_builddir)/src/preproc/pic
+
+pic_LDADD = libgroff.a $(LIBM) lib/libgnu.a
+pic_SOURCES = \
+ src/preproc/pic/pic.ypp \
+ src/preproc/pic/lex.cpp \
+ src/preproc/pic/main.cpp \
+ src/preproc/pic/object.cpp \
+ src/preproc/pic/common.cpp \
+ src/preproc/pic/troff.cpp \
+ src/preproc/pic/tex.cpp \
+ src/preproc/pic/pic.h \
+ src/preproc/pic/position.h \
+ src/preproc/pic/text.h \
+ src/preproc/pic/common.h \
+ src/preproc/pic/output.h \
+ src/preproc/pic/object.h
+
+preconv_LDADD = libgroff.a $(LIBM) $(LIBICONV) $(UCHARDET_LIBS) \
+ lib/libgnu.a
+
+preconv_SOURCES = src/preproc/preconv/preconv.cpp
+preconv_CPPFLAGS = $(AM_CPPFLAGS) $(UCHARDET_CFLAGS)
+preconv_TESTS = \
+ src/preproc/preconv/tests/do-not-seek-the-unseekable.sh \
+ src/preproc/preconv/tests/smoke-test.sh
+
+refer_CPPFLAGS = $(AM_CPPFLAGS) -I $(top_srcdir)/src/preproc/refer
+refer_LDADD = libbib.a libgroff.a $(LIBM) lib/libgnu.a
+refer_SOURCES = \
+ src/preproc/refer/command.cpp \
+ src/preproc/refer/ref.cpp \
+ src/preproc/refer/refer.cpp \
+ src/preproc/refer/token.cpp \
+ src/preproc/refer/label.ypp \
+ src/preproc/refer/refer.h \
+ src/preproc/refer/ref.h \
+ src/preproc/refer/token.h \
+ src/preproc/refer/command.h
+
+refer_TESTS = \
+ src/preproc/refer/tests/report-correct-line-numbers.sh
+
+soelim_LDADD = libgroff.a $(LIBM) lib/libgnu.a
+soelim_SOURCES = src/preproc/soelim/soelim.cpp
+tbl_LDADD = libgroff.a $(LIBM) lib/libgnu.a
+tbl_SOURCES = \
+ src/preproc/tbl/main.cpp \
+ src/preproc/tbl/table.cpp \
+ src/preproc/tbl/table.h
+
+tbl_TESTS = \
+ src/preproc/tbl/tests/boxes-and-vertical-rules.sh \
+ src/preproc/tbl/tests/check-horizontal-line-length.sh \
+ src/preproc/tbl/tests/check-line-intersections.sh \
+ src/preproc/tbl/tests/check-vertical-line-length.sh \
+ src/preproc/tbl/tests/cooperate-with-nm-request.sh \
+ src/preproc/tbl/tests/count-continued-input-lines.sh \
+ src/preproc/tbl/tests/do-not-overdraw-page-top-in-nroff-mode.sh \
+ src/preproc/tbl/tests/do-not-overlap-bottom-border-in-nroff.sh \
+ src/preproc/tbl/tests/do-not-segv-on-invalid-vertical-span-entry.sh \
+ src/preproc/tbl/tests/do-not-segv-when-backslash-R-in-text-block.sh \
+ src/preproc/tbl/tests/expand-region-option-works.sh \
+ src/preproc/tbl/tests/format-time-diagnostics-work.sh \
+ src/preproc/tbl/tests/save-and-restore-hyphenation-parameters.sh \
+ src/preproc/tbl/tests/save-and-restore-inter-sentence-space.sh \
+ src/preproc/tbl/tests/save-and-restore-line-numbering.sh \
+ src/preproc/tbl/tests/save-and-restore-tab-stops.sh \
+ src/preproc/tbl/tests/warn-on-long-boxed-unkept-table.sh \
+ src/preproc/tbl/tests/x-column-modifier-works.sh
+
+groff_LDADD = \
+ libgroff.a \
+ lib/libgnu.a \
+ $(LIBM)
+
+groff_SOURCES = \
+ src/roff/groff/groff.cpp \
+ src/roff/groff/pipeline.c \
+ src/roff/groff/pipeline.h
+
+groff_TESTS = \
+ src/roff/groff/tests/ab_works.sh \
+ src/roff/groff/tests/adjustment_works.sh \
+ src/roff/groff/tests/break_zero-length_output_line_sanely.sh \
+ src/roff/groff/tests/device_control_escapes_express_basic_latin.sh \
+ src/roff/groff/tests/do_not_loop_infinitely_when_breaking_cjk.sh \
+ src/roff/groff/tests/dot-cp_register_works.sh \
+ src/roff/groff/tests/dot-nm_register_works.sh \
+ src/roff/groff/tests/dot-nn_register_works.sh \
+ src/roff/groff/tests/evc_produces_no_output_if_invalid.sh \
+ src/roff/groff/tests/fp_should_not_traverse_directories.sh \
+ src/roff/groff/tests/handle_special_input_code_points.sh \
+ src/roff/groff/tests/html_works_with_grn_and_eqn.sh \
+ src/roff/groff/tests/initialization_is_quiet.sh \
+ src/roff/groff/tests/localization_works.sh \
+ src/roff/groff/tests/msoquiet_works.sh \
+ src/roff/groff/tests/on_latin1_device_oq_is_0x27.sh \
+ src/roff/groff/tests/output_driver_C_and_G_options_work.sh \
+ src/roff/groff/tests/recognize_end_of_sentence.sh \
+ src/roff/groff/tests/regression_savannah_56555.sh \
+ src/roff/groff/tests/regression_savannah_58153.sh \
+ src/roff/groff/tests/regression_savannah_58162.sh \
+ src/roff/groff/tests/regression_savannah_58337.sh \
+ src/roff/groff/tests/regression_savannah_59202.sh \
+ src/roff/groff/tests/smoke-test_html_device.sh \
+ src/roff/groff/tests/some_escapes_accept_newline_delimiters.sh \
+ src/roff/groff/tests/soquiet_works.sh \
+ src/roff/groff/tests/string_case_xform_errors.sh \
+ src/roff/groff/tests/string_case_xform_requests.sh \
+ src/roff/groff/tests/string_case_xform_unicode_escape.sh \
+ src/roff/groff/tests/substring_works.sh \
+ src/roff/groff/tests/use_point_size_escape_with_single_digit_arg.sh
+
+groff_XFAIL_TESTS = \
+ src/roff/groff/tests/string_case_xform_unicode_escape.sh
+
+nroff_srcdir = $(top_srcdir)/src/roff/nroff
+nroff_TESTS = \
+ src/roff/nroff/tests/verbose_option_works.sh
+
+troff_LDADD = libgroff.a lib/libgnu.a $(LIBM)
+troff_SOURCES = \
+ src/roff/troff/dictionary.cpp \
+ src/roff/troff/div.cpp \
+ src/roff/troff/env.cpp \
+ src/roff/troff/input.cpp \
+ src/roff/troff/mtsm.cpp \
+ src/roff/troff/node.cpp \
+ src/roff/troff/number.cpp \
+ src/roff/troff/reg.cpp \
+ src/roff/troff/env.h \
+ src/roff/troff/node.h \
+ src/roff/troff/troff.h \
+ src/roff/troff/div.h \
+ src/roff/troff/reg.h \
+ src/roff/troff/dictionary.h \
+ src/roff/troff/input.h \
+ src/roff/troff/mtsm.h \
+ src/roff/troff/token.h \
+ src/roff/troff/charinfo.h \
+ src/roff/troff/request.h \
+ src/roff/troff/hvunits.h
+
+nodist_troff_SOURCES = src/roff/troff/majorminor.cpp
+addftinfo_LDADD = libgroff.a lib/libgnu.a
+addftinfo_SOURCES = \
+ src/utils/addftinfo/addftinfo.cpp \
+ src/utils/addftinfo/guess.cpp \
+ src/utils/addftinfo/guess.h
+
+afmtodit_srcdir = $(top_srcdir)/src/utils/afmtodit
+grog_srcdir = $(top_srcdir)/src/utils/grog
+grog_TESTS = \
+ src/utils/grog/tests/PF-does-not-start-pic-region.sh \
+ src/utils/grog/tests/avoid-refer-fakeout.sh \
+ src/utils/grog/tests/preserve-groff-options.sh \
+ src/utils/grog/tests/recognize-perl-pod.sh \
+ src/utils/grog/tests/smoke-test.sh
+
+hpftodit_LDADD = libgroff.a $(LIBM) lib/libgnu.a
+hpftodit_SOURCES = \
+ src/utils/hpftodit/hpftodit.cpp \
+ src/utils/hpftodit/hpuni.cpp
+
+indxbib_srcdir = $(top_srcdir)/src/utils/indxbib
+indxbib_SOURCES = \
+ src/utils/indxbib/indxbib.cpp \
+ src/utils/indxbib/signal.c
+
+indxbib_LDADD = libbib.a libgroff.a $(LIBM) lib/libgnu.a
+lkbib_LDADD = libbib.a libgroff.a $(LIBM) lib/libgnu.a
+lkbib_SOURCES = src/utils/lkbib/lkbib.cpp
+lookbib_LDADD = libbib.a libgroff.a $(LIBM) lib/libgnu.a
+lookbib_SOURCES = src/utils/lookbib/lookbib.cpp
+pfbtops_SOURCES = src/utils/pfbtops/pfbtops.c
+pfbtops_LDADD = libgroff.a $(LIBM) lib/libgnu.a
+# We use the following trick to force the use of C++ compiler
+# See the Automake manual, "Libtool Convenience Libraries"
+nodist_EXTRA_pfbtops_SOURCES = src/utils/pfbtops/dummy.cpp
+tfmtodit_SOURCES = src/utils/tfmtodit/tfmtodit.cpp
+tfmtodit_LDADD = libgroff.a $(LIBM) lib/libgnu.a
+@WITHOUT_X11_FALSE@XTOTROFF_MAN1 = src/utils/xtotroff/xtotroff.1
+@WITHOUT_X11_TRUE@XTOTROFF_MAN1 =
+@WITHOUT_X11_FALSE@xtotroff_SOURCES = src/utils/xtotroff/xtotroff.c
+@WITHOUT_X11_FALSE@XLIBS = $(LIBXUTIL) $(LIBGROFF)
+@WITHOUT_X11_FALSE@xtotroff_LDADD = libxutil.a libgroff.a $(X_LIBS) $(X_PRE_LIBS) \
+@WITHOUT_X11_FALSE@ -lXaw -lXt -lX11 $(X_EXTRA_LIBS) $(LIBM) lib/libgnu.a
+
+@WITHOUT_X11_FALSE@xtotroff_CPPFLAGS = $(AM_CPPFLAGS) $(X_CFLAGS)
+
+# Define variable needed only for the targets that regenerate
+# descriptions of X11 core fonts (used in "maintainer mode").
+xtotroff = $(top_builddir)/xtotroff
+tmac_srcdir = $(top_srcdir)/tmac
+tmac_builddir = $(top_builddir)/tmac
+TMACNORMALFILES = \
+ tmac/man.tmac \
+ tmac/mandoc.tmac \
+ tmac/andoc.tmac \
+ tmac/an-ext.tmac \
+ tmac/ms.tmac \
+ tmac/e.tmac \
+ tmac/me.tmac \
+ tmac/doc-old.tmac \
+ tmac/doc.tmac \
+ tmac/mdoc.tmac \
+ tmac/pic.tmac \
+ tmac/papersize.tmac \
+ tmac/62bit.tmac \
+ tmac/ec.tmac \
+ tmac/trace.tmac \
+ tmac/ps.tmac \
+ tmac/psold.tmac \
+ tmac/pdfpic.tmac \
+ tmac/pspic.tmac \
+ tmac/psatk.tmac \
+ tmac/ptx.tmac \
+ tmac/pdf.tmac \
+ tmac/dvi.tmac \
+ tmac/tty.tmac \
+ tmac/tty-char.tmac \
+ tmac/latin1.tmac \
+ tmac/latin2.tmac \
+ tmac/latin5.tmac \
+ tmac/latin9.tmac \
+ tmac/cp1047.tmac \
+ tmac/X.tmac \
+ tmac/Xps.tmac \
+ tmac/lj4.tmac \
+ tmac/lbp.tmac \
+ tmac/html.tmac \
+ tmac/html-end.tmac \
+ tmac/devtag.tmac \
+ tmac/europs.tmac \
+ tmac/composite.tmac \
+ tmac/fallbacks.tmac \
+ tmac/eqnrc \
+ tmac/refer.tmac \
+ tmac/refer-me.tmac \
+ tmac/refer-ms.tmac \
+ tmac/troffrc \
+ tmac/troffrc-end \
+ tmac/trans.tmac \
+ tmac/en.tmac \
+ tmac/hyphen.en \
+ tmac/hyphenex.en \
+ tmac/fr.tmac \
+ tmac/hyphen.fr \
+ tmac/it.tmac \
+ tmac/hyphen.it \
+ tmac/sv.tmac \
+ tmac/hyphen.sv \
+ tmac/de.tmac \
+ tmac/den.tmac \
+ tmac/hyphen.det \
+ tmac/hyphen.den \
+ tmac/cs.tmac \
+ tmac/hyphen.cs \
+ tmac/hyphenex.cs \
+ tmac/ja.tmac \
+ tmac/zh.tmac
+
+
+# files installed in tmacdir
+#
+# "s" and "an" are not "NORMAL" because they may use compatibility
+# wrappers; see install_tmac_wrap_hook.
+dist_tmac_DATA = \
+ $(TMACNORMALFILES) \
+ tmac/an.tmac \
+ tmac/s.tmac
+
+nodist_tmac_DATA = tmac/www.tmac
+TMACMDOCFILES = \
+ tmac/mdoc/doc-common \
+ tmac/mdoc/doc-ditroff \
+ tmac/mdoc/doc-nroff \
+ tmac/mdoc/doc-syms
+
+mdocdir = $(tmacdir)/mdoc
+# Files installed in mdocdir
+dist_mdoc_DATA = $(TMACMDOCFILES)
+
+# Installed in localtmacdir
+dist_localtmac_DATA = tmac/man.local tmac/mdoc.local
+tmac_TESTS = \
+ tmac/tests/an-ext_MR-works.sh \
+ tmac/tests/an-ext_MT-works.sh \
+ tmac/tests/an-ext_UR-works.sh \
+ tmac/tests/an_AT-and-UC-footer-saved-and-restored.sh \
+ tmac/tests/an_CS-register-off.sh \
+ tmac/tests/an_CS-register-on.sh \
+ tmac/tests/an_CS-register-unspecified.sh \
+ tmac/tests/an_CT-register-off.sh \
+ tmac/tests/an_CT-register-on.sh \
+ tmac/tests/an_CT-register-unspecified.sh \
+ tmac/tests/an_FT-bad-value-should-not-trash-titles.sh \
+ tmac/tests/an_HY-register-works.sh \
+ tmac/tests/an_LL-init-sanely.sh \
+ tmac/tests/an_ME-punct-hyphenates.sh \
+ tmac/tests/an_MR-works.sh \
+ tmac/tests/an_MT-body-hyphenates.sh \
+ tmac/tests/an_MT-works.sh \
+ tmac/tests/an_P-register-works.sh \
+ tmac/tests/an_TH-repairs-ad-damage.sh \
+ tmac/tests/an_TH-repairs-hy-damage.sh \
+ tmac/tests/an_TS-adds-no-vertical-space.sh \
+ tmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh \
+ tmac/tests/an_UE-breaks-before-long-URIs.sh \
+ tmac/tests/an_UE-punct-hyphenates.sh \
+ tmac/tests/an_UR-body-hyphenates.sh \
+ tmac/tests/an_UR-works.sh \
+ tmac/tests/an_X-register-works.sh \
+ tmac/tests/an_adjust-link-text-correctly.sh \
+ tmac/tests/an_avoid-two-font-denial-of-service.sh \
+ tmac/tests/an_do-not-abbreviate-escape-using-TH-arguments.sh \
+ tmac/tests/an_font-remapping-does-not-affect-titles.sh \
+ tmac/tests/an_handle-degenerate-input-quietly.sh \
+ tmac/tests/an_inner-footer-abbreviation-works.sh \
+ tmac/tests/an_link-macros-work-in-paragraph-tags.sh \
+ tmac/tests/an_link-trailing-text-hugs-previous.sh \
+ tmac/tests/an_no-break-after-short-paragraph-tags.sh \
+ tmac/tests/an_output-footer-when-continuously-rendering.sh \
+ tmac/tests/an_page-footers-present.sh \
+ tmac/tests/an_page-header-has-current-data.sh \
+ tmac/tests/an_reset-hyphenation-correctly.sh \
+ tmac/tests/an_title-abbreviation-works.sh \
+ tmac/tests/an_use-input-traps-correctly.sh \
+ tmac/tests/an_works-with-ec.sh \
+ tmac/tests/andoc_P-register-works.sh \
+ tmac/tests/andoc_check-an-to-doc-transition.sh \
+ tmac/tests/andoc_clear-doc-traps.sh \
+ tmac/tests/andoc_flush-between-packages.sh \
+ tmac/tests/doc_CS-works.sh \
+ tmac/tests/doc_CT-works.sh \
+ tmac/tests/doc_D-places-page-numbers-correctly.sh \
+ tmac/tests/doc_Lk-respect-sentence-ending-punctuation.sh \
+ tmac/tests/doc_Mt-works.sh \
+ tmac/tests/doc_Nm-works.sh \
+ tmac/tests/doc_P-register-works.sh \
+ tmac/tests/doc_X-register-works.sh \
+ tmac/tests/doc_accept-mixed-case-section-headings.sh \
+ tmac/tests/doc_do-not-loop-infinitely-when-shortening-headers.sh \
+ tmac/tests/doc_heading-font-remapping-works.sh \
+ tmac/tests/doc_indents-correctly.sh \
+ tmac/tests/doc_output-footer-when-continuously-rendering.sh \
+ tmac/tests/doc_smoke-test.sh \
+ tmac/tests/e_chapter-titles-work.sh \
+ tmac/tests/e_columns-work-on-long-pages.sh \
+ tmac/tests/e_delayed-text-marks-work.sh \
+ tmac/tests/e_footnote-marks-work.sh \
+ tmac/tests/e_footnotes-work-with-columns.sh \
+ tmac/tests/e_ld-works.sh \
+ tmac/tests/e_line-numbering-works.sh \
+ tmac/tests/e_rejects-too-short-page-lengths.sh \
+ tmac/tests/ec_works.sh \
+ tmac/tests/latin2_works.sh \
+ tmac/tests/latin5_works.sh \
+ tmac/tests/latin9_works.sh \
+ tmac/tests/localization-works.sh \
+ tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh \
+ tmac/tests/pdfpic_falls-back-to-PSPIC.sh \
+ tmac/tests/s_IP-indents-using-paragraph-type-size.sh \
+ tmac/tests/s_IP-respects-inter-sentence-space-in-tags.sh \
+ tmac/tests/s_PN-works.sh \
+ tmac/tests/s_R-handles-its-arguments.sh \
+ tmac/tests/s_SH-resets-IP-indentation-amount.sh \
+ tmac/tests/s_TC-works-with-percent-in-custom-titles.sh \
+ tmac/tests/s_XA-literal-no-argument-suppresses-leader.sh \
+ tmac/tests/s_honor-MINGW-when-two-columns.sh \
+ tmac/tests/s_mark-column-start-correctly.sh \
+ tmac/tests/s_no-excess-space-around-displays.sh \
+ tmac/tests/s_rejects-too-short-page-lengths.sh
+
+tmac_XFAIL_TESTS = \
+ tmac/tests/an-ext_ME-punct-hyphenates.sh \
+ tmac/tests/an-ext_UE-punct-hyphenates.sh \
+ tmac/tests/an-ext_UE-breaks-before-long-URIs.sh \
+ tmac/tests/e_footnotes-work-with-columns.sh
+
+
+# Check input file for bare m4 keywords.
+M4WORDS = define|divert|include|index|shift|undefine|undivert
+M4CHECK = tmac/groff_man-passed-check-for-m4-keywords-stamp
+
+# Define convenience macros for in-tree documents to depend on. Don't
+# use these above.
+TMAC_PACKAGE_MAN = tmac/an.tmac tmac/an-ext.tmac
+TMAC_PACKAGE_MDOC = tmac/doc.tmac tmac/mdoc/doc-common \
+ tmac/mdoc/doc-ditroff tmac/mdoc/doc-nroff tmac/mdoc/doc-syms
+
+
+# Suffix rule to build .1, .5 and .7 files from .1.man, .5.man and
+# .7.man files. The brackets around the @ are used to prevent the
+# substitution of the variable by automake.
+#
+# The sed script transforms - to \-, ~ to \(ti, and so forth, (with an
+# extra layer of backslashes--see below) so that Makefile variables
+# containing ASCII characters that do not represent themselves literally
+# in *roff (see groff_char(7)) are correctly interpolated into man page
+# text.
+#
+# Note that while the script, combined with this target, will transform
+# ` to \(ga, including grave accents in Makefile variables is likely to
+# fail when the shell lexes the argument to echo within the old-style
+# command substitution `` below. Testing shows that grave accents
+# should work* if POSIX-style command substitution $() is done instead.
+# However, $() is less portable. (Triple-escaping grave accents \\\`
+# inside the interpolated Makefile variable will work, but is not
+# attempted here.)
+#
+# Note also that the amount of backslash-escaping in the sed script is
+# excessive (and incorrect) for normal purposes, but required here
+# because a command substitution is being nested inside yet another
+# invocation of sed.
+#
+# * For this target, no assurances about the good behavior of unusual
+# characters in Makefile variables in other aspects of the groff build
+# are offered.
+#
+# COMPATIBILITY_WRAPPERS is intended only for use in conditional
+# expressions in man pages (to see if the legacy macro package wrappers
+# feature is enabled) and not for expansion as formatted text.
+makevarescape = $(top_srcdir)/makevarescape.sed
+all: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .roff .in .ps .mom .pdf .me.in .me .man .c .cpp .dvi .html .log .o .obj .pfa .test .test$(EXEEXT) .texi .trs .txt .ypp
+am--refresh: Makefile
+ @:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/lib/gnulib.mk $(top_srcdir)/arch/mingw/mingw.am $(top_srcdir)/arch/misc/misc.am $(top_srcdir)/contrib/chem/chem.am $(top_srcdir)/contrib/eqn2graph/eqn2graph.am $(top_srcdir)/contrib/gdiffmk/gdiffmk.am $(top_srcdir)/contrib/glilypond/glilypond.am $(top_srcdir)/contrib/gperl/gperl.am $(top_srcdir)/contrib/gpinyin/gpinyin.am $(top_srcdir)/contrib/grap2graph/grap2graph.am $(top_srcdir)/contrib/hdtbl/hdtbl.am $(top_srcdir)/contrib/mm/mm.am $(top_srcdir)/contrib/mom/mom.am $(top_srcdir)/contrib/pdfmark/pdfmark.am $(top_srcdir)/contrib/pic2graph/pic2graph.am $(top_srcdir)/contrib/rfc1345/rfc1345.am $(top_srcdir)/contrib/sboxes/sboxes.am $(top_srcdir)/doc/doc.am $(top_srcdir)/font/devX100/devX100.am $(top_srcdir)/font/devX100-12/devX100-12.am $(top_srcdir)/font/devX75/devX75.am $(top_srcdir)/font/devX75-12/devX75-12.am $(top_srcdir)/font/devascii/devascii.am $(top_srcdir)/font/devcp1047/devcp1047.am $(top_srcdir)/font/devdvi/devdvi.am $(top_srcdir)/font/devhtml/devhtml.am $(top_srcdir)/font/devlatin1/devlatin1.am $(top_srcdir)/font/devlbp/devlbp.am $(top_srcdir)/font/devlj4/devlj4.am $(top_srcdir)/font/devpdf/devpdf.am $(top_srcdir)/font/devps/devps.am $(top_srcdir)/font/devutf8/devutf8.am $(top_srcdir)/font/scripts/scripts.am $(top_srcdir)/man/man.am $(top_srcdir)/src/include/include.am $(top_srcdir)/src/libs/libbib/libbib.am $(top_srcdir)/src/libs/libdriver/libdriver.am $(top_srcdir)/src/libs/libgroff/libgroff.am $(top_srcdir)/src/libs/libxutil/libxutil.am $(top_srcdir)/src/devices/grodvi/grodvi.am $(top_srcdir)/src/devices/grohtml/grohtml.am $(top_srcdir)/src/devices/grolbp/grolbp.am $(top_srcdir)/src/devices/grolj4/grolj4.am $(top_srcdir)/src/devices/gropdf/gropdf.am $(top_srcdir)/src/devices/grops/grops.am $(top_srcdir)/src/devices/grotty/grotty.am $(top_srcdir)/src/devices/xditview/xditview.am $(top_srcdir)/src/preproc/eqn/eqn.am $(top_srcdir)/src/preproc/grn/grn.am $(top_srcdir)/src/preproc/html/html.am $(top_srcdir)/src/preproc/pic/pic.am $(top_srcdir)/src/preproc/preconv/preconv.am $(top_srcdir)/src/preproc/refer/refer.am $(top_srcdir)/src/preproc/soelim/soelim.am $(top_srcdir)/src/preproc/tbl/tbl.am $(top_srcdir)/src/roff/groff/groff.am $(top_srcdir)/src/roff/nroff/nroff.am $(top_srcdir)/src/roff/troff/troff.am $(top_srcdir)/src/utils/addftinfo/addftinfo.am $(top_srcdir)/src/utils/afmtodit/afmtodit.am $(top_srcdir)/src/utils/grog/grog.am $(top_srcdir)/src/utils/hpftodit/hpftodit.am $(top_srcdir)/src/utils/indxbib/indxbib.am $(top_srcdir)/src/utils/lkbib/lkbib.am $(top_srcdir)/src/utils/lookbib/lookbib.am $(top_srcdir)/src/utils/pfbtops/pfbtops.am $(top_srcdir)/src/utils/tfmtodit/tfmtodit.am $(top_srcdir)/src/utils/xtotroff/xtotroff.am $(top_srcdir)/tmac/tmac.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \
+ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
+ esac;
+$(top_srcdir)/lib/gnulib.mk $(top_srcdir)/arch/mingw/mingw.am $(top_srcdir)/arch/misc/misc.am $(top_srcdir)/contrib/chem/chem.am $(top_srcdir)/contrib/eqn2graph/eqn2graph.am $(top_srcdir)/contrib/gdiffmk/gdiffmk.am $(top_srcdir)/contrib/glilypond/glilypond.am $(top_srcdir)/contrib/gperl/gperl.am $(top_srcdir)/contrib/gpinyin/gpinyin.am $(top_srcdir)/contrib/grap2graph/grap2graph.am $(top_srcdir)/contrib/hdtbl/hdtbl.am $(top_srcdir)/contrib/mm/mm.am $(top_srcdir)/contrib/mom/mom.am $(top_srcdir)/contrib/pdfmark/pdfmark.am $(top_srcdir)/contrib/pic2graph/pic2graph.am $(top_srcdir)/contrib/rfc1345/rfc1345.am $(top_srcdir)/contrib/sboxes/sboxes.am $(top_srcdir)/doc/doc.am $(top_srcdir)/font/devX100/devX100.am $(top_srcdir)/font/devX100-12/devX100-12.am $(top_srcdir)/font/devX75/devX75.am $(top_srcdir)/font/devX75-12/devX75-12.am $(top_srcdir)/font/devascii/devascii.am $(top_srcdir)/font/devcp1047/devcp1047.am $(top_srcdir)/font/devdvi/devdvi.am $(top_srcdir)/font/devhtml/devhtml.am $(top_srcdir)/font/devlatin1/devlatin1.am $(top_srcdir)/font/devlbp/devlbp.am $(top_srcdir)/font/devlj4/devlj4.am $(top_srcdir)/font/devpdf/devpdf.am $(top_srcdir)/font/devps/devps.am $(top_srcdir)/font/devutf8/devutf8.am $(top_srcdir)/font/scripts/scripts.am $(top_srcdir)/man/man.am $(top_srcdir)/src/include/include.am $(top_srcdir)/src/libs/libbib/libbib.am $(top_srcdir)/src/libs/libdriver/libdriver.am $(top_srcdir)/src/libs/libgroff/libgroff.am $(top_srcdir)/src/libs/libxutil/libxutil.am $(top_srcdir)/src/devices/grodvi/grodvi.am $(top_srcdir)/src/devices/grohtml/grohtml.am $(top_srcdir)/src/devices/grolbp/grolbp.am $(top_srcdir)/src/devices/grolj4/grolj4.am $(top_srcdir)/src/devices/gropdf/gropdf.am $(top_srcdir)/src/devices/grops/grops.am $(top_srcdir)/src/devices/grotty/grotty.am $(top_srcdir)/src/devices/xditview/xditview.am $(top_srcdir)/src/preproc/eqn/eqn.am $(top_srcdir)/src/preproc/grn/grn.am $(top_srcdir)/src/preproc/html/html.am $(top_srcdir)/src/preproc/pic/pic.am $(top_srcdir)/src/preproc/preconv/preconv.am $(top_srcdir)/src/preproc/refer/refer.am $(top_srcdir)/src/preproc/soelim/soelim.am $(top_srcdir)/src/preproc/tbl/tbl.am $(top_srcdir)/src/roff/groff/groff.am $(top_srcdir)/src/roff/nroff/nroff.am $(top_srcdir)/src/roff/troff/troff.am $(top_srcdir)/src/utils/addftinfo/addftinfo.am $(top_srcdir)/src/utils/afmtodit/afmtodit.am $(top_srcdir)/src/utils/grog/grog.am $(top_srcdir)/src/utils/hpftodit/hpftodit.am $(top_srcdir)/src/utils/indxbib/indxbib.am $(top_srcdir)/src/utils/lkbib/lkbib.am $(top_srcdir)/src/utils/lookbib/lookbib.am $(top_srcdir)/src/utils/pfbtops/pfbtops.am $(top_srcdir)/src/utils/tfmtodit/tfmtodit.am $(top_srcdir)/src/utils/xtotroff/xtotroff.am $(top_srcdir)/tmac/tmac.am $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ $(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+src/include/config.h: src/include/stamp-h1
+ @test -f $@ || rm -f src/include/stamp-h1
+ @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) src/include/stamp-h1
+
+src/include/stamp-h1: $(top_srcdir)/src/include/config.hin $(top_builddir)/config.status
+ @rm -f src/include/stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status src/include/config.h
+$(top_srcdir)/src/include/config.hin: $(am__configure_deps)
+ ($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+ rm -f src/include/stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f src/include/config.h src/include/stamp-h1
+test-groff: $(top_builddir)/config.status $(srcdir)/test-groff.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+clean-checkPROGRAMS:
+ -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS)
+install-nobase_binPROGRAMS: $(nobase_bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(nobase_bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|[^/]*$$||; s|^$$|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ case $$type in \
+ d) echo " $(MKDIR_P) '$(DESTDIR)$(bindir)/$$dir'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)/$$dir" || exit $$?;; \
+ f) \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ;; esac \
+ ; done
+
+uninstall-nobase_binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nobase_bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ -e 'x;s,[^/]*$$,,;G;s,\n,,' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-nobase_binPROGRAMS:
+ -test -z "$(nobase_bin_PROGRAMS)" || rm -f $(nobase_bin_PROGRAMS)
+install-prefixexecbinPROGRAMS: $(prefixexecbin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(prefixexecbin_PROGRAMS)'; test -n "$(prefixexecbindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(prefixexecbindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(prefixexecbindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(prefixexecbindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(prefixexecbindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-prefixexecbinPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(prefixexecbin_PROGRAMS)'; test -n "$(prefixexecbindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(prefixexecbindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(prefixexecbindir)" && rm -f $$files
+
+clean-prefixexecbinPROGRAMS:
+ -test -z "$(prefixexecbin_PROGRAMS)" || rm -f $(prefixexecbin_PROGRAMS)
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+lib/$(am__dirstamp):
+ @$(MKDIR_P) lib
+ @: > lib/$(am__dirstamp)
+lib/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) lib/$(DEPDIR)
+ @: > lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-float.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-itold.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-free.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-fseterr.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-localcharset.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-math.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-memchr.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-printf-frexp.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-printf-frexpl.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-signbitf.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-signbitd.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-signbitl.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-stdio-read.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-stdio-write.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-unistd.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/uniwidth/$(am__dirstamp):
+ @$(MKDIR_P) lib/uniwidth
+ @: > lib/uniwidth/$(am__dirstamp)
+lib/uniwidth/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) lib/uniwidth/$(DEPDIR)
+ @: > lib/uniwidth/$(DEPDIR)/$(am__dirstamp)
+lib/uniwidth/libgnu_a-width.$(OBJEXT): lib/uniwidth/$(am__dirstamp) \
+ lib/uniwidth/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-wctype-h.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-wcwidth.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-xsize.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-fprintf.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-frexp.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-frexpl.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-isnan.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-isnand.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-isnanf.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-isnanl.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-snprintf.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-asnprintf.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-printf-args.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-printf-parse.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-vasnprintf.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+lib/libgnu_a-vsnprintf.$(OBJEXT): lib/$(am__dirstamp) \
+ lib/$(DEPDIR)/$(am__dirstamp)
+
+lib/libgnu.a: $(lib_libgnu_a_OBJECTS) $(lib_libgnu_a_DEPENDENCIES) $(EXTRA_lib_libgnu_a_DEPENDENCIES) lib/$(am__dirstamp)
+ $(AM_V_at)-rm -f lib/libgnu.a
+ $(AM_V_AR)$(lib_libgnu_a_AR) lib/libgnu.a $(lib_libgnu_a_OBJECTS) $(lib_libgnu_a_LIBADD)
+ $(AM_V_at)$(RANLIB) lib/libgnu.a
+src/libs/libbib/$(am__dirstamp):
+ @$(MKDIR_P) src/libs/libbib
+ @: > src/libs/libbib/$(am__dirstamp)
+src/libs/libbib/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/libs/libbib/$(DEPDIR)
+ @: > src/libs/libbib/$(DEPDIR)/$(am__dirstamp)
+src/libs/libbib/common.$(OBJEXT): src/libs/libbib/$(am__dirstamp) \
+ src/libs/libbib/$(DEPDIR)/$(am__dirstamp)
+src/libs/libbib/index.$(OBJEXT): src/libs/libbib/$(am__dirstamp) \
+ src/libs/libbib/$(DEPDIR)/$(am__dirstamp)
+src/libs/libbib/linear.$(OBJEXT): src/libs/libbib/$(am__dirstamp) \
+ src/libs/libbib/$(DEPDIR)/$(am__dirstamp)
+src/libs/libbib/search.$(OBJEXT): src/libs/libbib/$(am__dirstamp) \
+ src/libs/libbib/$(DEPDIR)/$(am__dirstamp)
+src/libs/libbib/map.$(OBJEXT): src/libs/libbib/$(am__dirstamp) \
+ src/libs/libbib/$(DEPDIR)/$(am__dirstamp)
+
+libbib.a: $(libbib_a_OBJECTS) $(libbib_a_DEPENDENCIES) $(EXTRA_libbib_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f libbib.a
+ $(AM_V_AR)$(libbib_a_AR) libbib.a $(libbib_a_OBJECTS) $(libbib_a_LIBADD)
+ $(AM_V_at)$(RANLIB) libbib.a
+src/libs/libdriver/$(am__dirstamp):
+ @$(MKDIR_P) src/libs/libdriver
+ @: > src/libs/libdriver/$(am__dirstamp)
+src/libs/libdriver/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/libs/libdriver/$(DEPDIR)
+ @: > src/libs/libdriver/$(DEPDIR)/$(am__dirstamp)
+src/libs/libdriver/input.$(OBJEXT): \
+ src/libs/libdriver/$(am__dirstamp) \
+ src/libs/libdriver/$(DEPDIR)/$(am__dirstamp)
+src/libs/libdriver/printer.$(OBJEXT): \
+ src/libs/libdriver/$(am__dirstamp) \
+ src/libs/libdriver/$(DEPDIR)/$(am__dirstamp)
+
+libdriver.a: $(libdriver_a_OBJECTS) $(libdriver_a_DEPENDENCIES) $(EXTRA_libdriver_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f libdriver.a
+ $(AM_V_AR)$(libdriver_a_AR) libdriver.a $(libdriver_a_OBJECTS) $(libdriver_a_LIBADD)
+ $(AM_V_at)$(RANLIB) libdriver.a
+src/libs/libgroff/$(am__dirstamp):
+ @$(MKDIR_P) src/libs/libgroff
+ @: > src/libs/libgroff/$(am__dirstamp)
+src/libs/libgroff/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/libs/libgroff/$(DEPDIR)
+ @: > src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-assert.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-change_lf.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-cmap.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-color.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-cset.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-curtime.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-device.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-errarg.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-error.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-fatal.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-filename.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-font.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-fontfile.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-geometry.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-getopt.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-getopt1.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-glyphuni.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-htmlhint.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-hypot.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-iftoa.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-invalid.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-itoa.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-lf.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-lineno.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-localcharset.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-macropath.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-matherr.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-maxfilename.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-maxpathname.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-mksdir.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-nametoindex.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-paper.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-prime.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-progname.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-ptable.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-quotearg.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-relocate.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-searchpath.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-spawnvp.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-string.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-strsave.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-symbol.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-tmpfile.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-tmpname.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-unicode.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-uniglyph.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-uniuni.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-new.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+src/libs/libgroff/libgroff_a-version.$(OBJEXT): \
+ src/libs/libgroff/$(am__dirstamp) \
+ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+
+libgroff.a: $(libgroff_a_OBJECTS) $(libgroff_a_DEPENDENCIES) $(EXTRA_libgroff_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f libgroff.a
+ $(AM_V_AR)$(libgroff_a_AR) libgroff.a $(libgroff_a_OBJECTS) $(libgroff_a_LIBADD)
+ $(AM_V_at)$(RANLIB) libgroff.a
+src/libs/libxutil/$(am__dirstamp):
+ @$(MKDIR_P) src/libs/libxutil
+ @: > src/libs/libxutil/$(am__dirstamp)
+src/libs/libxutil/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/libs/libxutil/$(DEPDIR)
+ @: > src/libs/libxutil/$(DEPDIR)/$(am__dirstamp)
+src/libs/libxutil/libxutil_a-DviChar.$(OBJEXT): \
+ src/libs/libxutil/$(am__dirstamp) \
+ src/libs/libxutil/$(DEPDIR)/$(am__dirstamp)
+src/libs/libxutil/libxutil_a-XFontName.$(OBJEXT): \
+ src/libs/libxutil/$(am__dirstamp) \
+ src/libs/libxutil/$(DEPDIR)/$(am__dirstamp)
+src/libs/libxutil/libxutil_a-xmalloc.$(OBJEXT): \
+ src/libs/libxutil/$(am__dirstamp) \
+ src/libs/libxutil/$(DEPDIR)/$(am__dirstamp)
+
+libxutil.a: $(libxutil_a_OBJECTS) $(libxutil_a_DEPENDENCIES) $(EXTRA_libxutil_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f libxutil.a
+ $(AM_V_AR)$(libxutil_a_AR) libxutil.a $(libxutil_a_OBJECTS) $(libxutil_a_LIBADD)
+ $(AM_V_at)$(RANLIB) libxutil.a
+src/utils/addftinfo/$(am__dirstamp):
+ @$(MKDIR_P) src/utils/addftinfo
+ @: > src/utils/addftinfo/$(am__dirstamp)
+src/utils/addftinfo/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/utils/addftinfo/$(DEPDIR)
+ @: > src/utils/addftinfo/$(DEPDIR)/$(am__dirstamp)
+src/utils/addftinfo/addftinfo.$(OBJEXT): \
+ src/utils/addftinfo/$(am__dirstamp) \
+ src/utils/addftinfo/$(DEPDIR)/$(am__dirstamp)
+src/utils/addftinfo/guess.$(OBJEXT): \
+ src/utils/addftinfo/$(am__dirstamp) \
+ src/utils/addftinfo/$(DEPDIR)/$(am__dirstamp)
+
+addftinfo$(EXEEXT): $(addftinfo_OBJECTS) $(addftinfo_DEPENDENCIES) $(EXTRA_addftinfo_DEPENDENCIES)
+ @rm -f addftinfo$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addftinfo_OBJECTS) $(addftinfo_LDADD) $(LIBS)
+src/preproc/eqn/$(am__dirstamp):
+ @$(MKDIR_P) src/preproc/eqn
+ @: > src/preproc/eqn/$(am__dirstamp)
+src/preproc/eqn/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/preproc/eqn/$(DEPDIR)
+ @: > src/preproc/eqn/$(DEPDIR)/$(am__dirstamp)
+src/preproc/eqn/eqn-main.$(OBJEXT): src/preproc/eqn/$(am__dirstamp) \
+ src/preproc/eqn/$(DEPDIR)/$(am__dirstamp)
+src/preproc/eqn/eqn-lex.$(OBJEXT): src/preproc/eqn/$(am__dirstamp) \
+ src/preproc/eqn/$(DEPDIR)/$(am__dirstamp)
+src/preproc/eqn/eqn-box.$(OBJEXT): src/preproc/eqn/$(am__dirstamp) \
+ src/preproc/eqn/$(DEPDIR)/$(am__dirstamp)
+src/preproc/eqn/eqn-limit.$(OBJEXT): src/preproc/eqn/$(am__dirstamp) \
+ src/preproc/eqn/$(DEPDIR)/$(am__dirstamp)
+src/preproc/eqn/eqn-list.$(OBJEXT): src/preproc/eqn/$(am__dirstamp) \
+ src/preproc/eqn/$(DEPDIR)/$(am__dirstamp)
+src/preproc/eqn/eqn-over.$(OBJEXT): src/preproc/eqn/$(am__dirstamp) \
+ src/preproc/eqn/$(DEPDIR)/$(am__dirstamp)
+src/preproc/eqn/eqn-text.$(OBJEXT): src/preproc/eqn/$(am__dirstamp) \
+ src/preproc/eqn/$(DEPDIR)/$(am__dirstamp)
+src/preproc/eqn/eqn-script.$(OBJEXT): src/preproc/eqn/$(am__dirstamp) \
+ src/preproc/eqn/$(DEPDIR)/$(am__dirstamp)
+src/preproc/eqn/eqn-mark.$(OBJEXT): src/preproc/eqn/$(am__dirstamp) \
+ src/preproc/eqn/$(DEPDIR)/$(am__dirstamp)
+src/preproc/eqn/eqn-other.$(OBJEXT): src/preproc/eqn/$(am__dirstamp) \
+ src/preproc/eqn/$(DEPDIR)/$(am__dirstamp)
+src/preproc/eqn/eqn-delim.$(OBJEXT): src/preproc/eqn/$(am__dirstamp) \
+ src/preproc/eqn/$(DEPDIR)/$(am__dirstamp)
+src/preproc/eqn/eqn-sqrt.$(OBJEXT): src/preproc/eqn/$(am__dirstamp) \
+ src/preproc/eqn/$(DEPDIR)/$(am__dirstamp)
+src/preproc/eqn/eqn-pile.$(OBJEXT): src/preproc/eqn/$(am__dirstamp) \
+ src/preproc/eqn/$(DEPDIR)/$(am__dirstamp)
+src/preproc/eqn/eqn-special.$(OBJEXT): \
+ src/preproc/eqn/$(am__dirstamp) \
+ src/preproc/eqn/$(DEPDIR)/$(am__dirstamp)
+src/preproc/eqn/eqn.hpp: src/preproc/eqn/eqn.cpp
+ @if test ! -f $@; then rm -f src/preproc/eqn/eqn.cpp; else :; fi
+ @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) src/preproc/eqn/eqn.cpp; else :; fi
+src/preproc/eqn/eqn-eqn.$(OBJEXT): src/preproc/eqn/$(am__dirstamp) \
+ src/preproc/eqn/$(DEPDIR)/$(am__dirstamp)
+
+eqn$(EXEEXT): $(eqn_OBJECTS) $(eqn_DEPENDENCIES) $(EXTRA_eqn_DEPENDENCIES)
+ @rm -f eqn$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(eqn_OBJECTS) $(eqn_LDADD) $(LIBS)
+src/preproc/grn/$(am__dirstamp):
+ @$(MKDIR_P) src/preproc/grn
+ @: > src/preproc/grn/$(am__dirstamp)
+src/preproc/grn/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/preproc/grn/$(DEPDIR)
+ @: > src/preproc/grn/$(DEPDIR)/$(am__dirstamp)
+src/preproc/grn/hdb.$(OBJEXT): src/preproc/grn/$(am__dirstamp) \
+ src/preproc/grn/$(DEPDIR)/$(am__dirstamp)
+src/preproc/grn/hpoint.$(OBJEXT): src/preproc/grn/$(am__dirstamp) \
+ src/preproc/grn/$(DEPDIR)/$(am__dirstamp)
+src/preproc/grn/hgraph.$(OBJEXT): src/preproc/grn/$(am__dirstamp) \
+ src/preproc/grn/$(DEPDIR)/$(am__dirstamp)
+src/preproc/grn/main.$(OBJEXT): src/preproc/grn/$(am__dirstamp) \
+ src/preproc/grn/$(DEPDIR)/$(am__dirstamp)
+
+grn$(EXEEXT): $(grn_OBJECTS) $(grn_DEPENDENCIES) $(EXTRA_grn_DEPENDENCIES)
+ @rm -f grn$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(grn_OBJECTS) $(grn_LDADD) $(LIBS)
+src/devices/grodvi/$(am__dirstamp):
+ @$(MKDIR_P) src/devices/grodvi
+ @: > src/devices/grodvi/$(am__dirstamp)
+src/devices/grodvi/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/devices/grodvi/$(DEPDIR)
+ @: > src/devices/grodvi/$(DEPDIR)/$(am__dirstamp)
+src/devices/grodvi/dvi.$(OBJEXT): src/devices/grodvi/$(am__dirstamp) \
+ src/devices/grodvi/$(DEPDIR)/$(am__dirstamp)
+
+grodvi$(EXEEXT): $(grodvi_OBJECTS) $(grodvi_DEPENDENCIES) $(EXTRA_grodvi_DEPENDENCIES)
+ @rm -f grodvi$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(grodvi_OBJECTS) $(grodvi_LDADD) $(LIBS)
+src/roff/groff/$(am__dirstamp):
+ @$(MKDIR_P) src/roff/groff
+ @: > src/roff/groff/$(am__dirstamp)
+src/roff/groff/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/roff/groff/$(DEPDIR)
+ @: > src/roff/groff/$(DEPDIR)/$(am__dirstamp)
+src/roff/groff/groff.$(OBJEXT): src/roff/groff/$(am__dirstamp) \
+ src/roff/groff/$(DEPDIR)/$(am__dirstamp)
+src/roff/groff/pipeline.$(OBJEXT): src/roff/groff/$(am__dirstamp) \
+ src/roff/groff/$(DEPDIR)/$(am__dirstamp)
+
+groff$(EXEEXT): $(groff_OBJECTS) $(groff_DEPENDENCIES) $(EXTRA_groff_DEPENDENCIES)
+ @rm -f groff$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(groff_OBJECTS) $(groff_LDADD) $(LIBS)
+src/devices/grolbp/$(am__dirstamp):
+ @$(MKDIR_P) src/devices/grolbp
+ @: > src/devices/grolbp/$(am__dirstamp)
+src/devices/grolbp/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/devices/grolbp/$(DEPDIR)
+ @: > src/devices/grolbp/$(DEPDIR)/$(am__dirstamp)
+src/devices/grolbp/lbp.$(OBJEXT): src/devices/grolbp/$(am__dirstamp) \
+ src/devices/grolbp/$(DEPDIR)/$(am__dirstamp)
+
+grolbp$(EXEEXT): $(grolbp_OBJECTS) $(grolbp_DEPENDENCIES) $(EXTRA_grolbp_DEPENDENCIES)
+ @rm -f grolbp$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(grolbp_OBJECTS) $(grolbp_LDADD) $(LIBS)
+src/devices/grolj4/$(am__dirstamp):
+ @$(MKDIR_P) src/devices/grolj4
+ @: > src/devices/grolj4/$(am__dirstamp)
+src/devices/grolj4/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/devices/grolj4/$(DEPDIR)
+ @: > src/devices/grolj4/$(DEPDIR)/$(am__dirstamp)
+src/devices/grolj4/lj4.$(OBJEXT): src/devices/grolj4/$(am__dirstamp) \
+ src/devices/grolj4/$(DEPDIR)/$(am__dirstamp)
+
+grolj4$(EXEEXT): $(grolj4_OBJECTS) $(grolj4_DEPENDENCIES) $(EXTRA_grolj4_DEPENDENCIES)
+ @rm -f grolj4$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(grolj4_OBJECTS) $(grolj4_LDADD) $(LIBS)
+src/devices/grops/$(am__dirstamp):
+ @$(MKDIR_P) src/devices/grops
+ @: > src/devices/grops/$(am__dirstamp)
+src/devices/grops/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/devices/grops/$(DEPDIR)
+ @: > src/devices/grops/$(DEPDIR)/$(am__dirstamp)
+src/devices/grops/ps.$(OBJEXT): src/devices/grops/$(am__dirstamp) \
+ src/devices/grops/$(DEPDIR)/$(am__dirstamp)
+src/devices/grops/psrm.$(OBJEXT): src/devices/grops/$(am__dirstamp) \
+ src/devices/grops/$(DEPDIR)/$(am__dirstamp)
+
+grops$(EXEEXT): $(grops_OBJECTS) $(grops_DEPENDENCIES) $(EXTRA_grops_DEPENDENCIES)
+ @rm -f grops$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(grops_OBJECTS) $(grops_LDADD) $(LIBS)
+src/devices/grotty/$(am__dirstamp):
+ @$(MKDIR_P) src/devices/grotty
+ @: > src/devices/grotty/$(am__dirstamp)
+src/devices/grotty/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/devices/grotty/$(DEPDIR)
+ @: > src/devices/grotty/$(DEPDIR)/$(am__dirstamp)
+src/devices/grotty/tty.$(OBJEXT): src/devices/grotty/$(am__dirstamp) \
+ src/devices/grotty/$(DEPDIR)/$(am__dirstamp)
+
+grotty$(EXEEXT): $(grotty_OBJECTS) $(grotty_DEPENDENCIES) $(EXTRA_grotty_DEPENDENCIES)
+ @rm -f grotty$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(grotty_OBJECTS) $(grotty_LDADD) $(LIBS)
+src/devices/xditview/$(am__dirstamp):
+ @$(MKDIR_P) src/devices/xditview
+ @: > src/devices/xditview/$(am__dirstamp)
+src/devices/xditview/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/devices/xditview/$(DEPDIR)
+ @: > src/devices/xditview/$(DEPDIR)/$(am__dirstamp)
+src/devices/xditview/gxditview-device.$(OBJEXT): \
+ src/devices/xditview/$(am__dirstamp) \
+ src/devices/xditview/$(DEPDIR)/$(am__dirstamp)
+src/devices/xditview/gxditview-draw.$(OBJEXT): \
+ src/devices/xditview/$(am__dirstamp) \
+ src/devices/xditview/$(DEPDIR)/$(am__dirstamp)
+src/devices/xditview/gxditview-Dvi.$(OBJEXT): \
+ src/devices/xditview/$(am__dirstamp) \
+ src/devices/xditview/$(DEPDIR)/$(am__dirstamp)
+src/devices/xditview/gxditview-font.$(OBJEXT): \
+ src/devices/xditview/$(am__dirstamp) \
+ src/devices/xditview/$(DEPDIR)/$(am__dirstamp)
+src/devices/xditview/gxditview-lex.$(OBJEXT): \
+ src/devices/xditview/$(am__dirstamp) \
+ src/devices/xditview/$(DEPDIR)/$(am__dirstamp)
+src/devices/xditview/gxditview-page.$(OBJEXT): \
+ src/devices/xditview/$(am__dirstamp) \
+ src/devices/xditview/$(DEPDIR)/$(am__dirstamp)
+src/devices/xditview/gxditview-parse.$(OBJEXT): \
+ src/devices/xditview/$(am__dirstamp) \
+ src/devices/xditview/$(DEPDIR)/$(am__dirstamp)
+src/devices/xditview/gxditview-xditview.$(OBJEXT): \
+ src/devices/xditview/$(am__dirstamp) \
+ src/devices/xditview/$(DEPDIR)/$(am__dirstamp)
+
+gxditview$(EXEEXT): $(gxditview_OBJECTS) $(gxditview_DEPENDENCIES) $(EXTRA_gxditview_DEPENDENCIES)
+ @rm -f gxditview$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gxditview_OBJECTS) $(gxditview_LDADD) $(LIBS)
+src/utils/hpftodit/$(am__dirstamp):
+ @$(MKDIR_P) src/utils/hpftodit
+ @: > src/utils/hpftodit/$(am__dirstamp)
+src/utils/hpftodit/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/utils/hpftodit/$(DEPDIR)
+ @: > src/utils/hpftodit/$(DEPDIR)/$(am__dirstamp)
+src/utils/hpftodit/hpftodit.$(OBJEXT): \
+ src/utils/hpftodit/$(am__dirstamp) \
+ src/utils/hpftodit/$(DEPDIR)/$(am__dirstamp)
+src/utils/hpftodit/hpuni.$(OBJEXT): \
+ src/utils/hpftodit/$(am__dirstamp) \
+ src/utils/hpftodit/$(DEPDIR)/$(am__dirstamp)
+
+hpftodit$(EXEEXT): $(hpftodit_OBJECTS) $(hpftodit_DEPENDENCIES) $(EXTRA_hpftodit_DEPENDENCIES)
+ @rm -f hpftodit$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(hpftodit_OBJECTS) $(hpftodit_LDADD) $(LIBS)
+src/utils/indxbib/$(am__dirstamp):
+ @$(MKDIR_P) src/utils/indxbib
+ @: > src/utils/indxbib/$(am__dirstamp)
+src/utils/indxbib/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/utils/indxbib/$(DEPDIR)
+ @: > src/utils/indxbib/$(DEPDIR)/$(am__dirstamp)
+src/utils/indxbib/indxbib.$(OBJEXT): \
+ src/utils/indxbib/$(am__dirstamp) \
+ src/utils/indxbib/$(DEPDIR)/$(am__dirstamp)
+src/utils/indxbib/signal.$(OBJEXT): src/utils/indxbib/$(am__dirstamp) \
+ src/utils/indxbib/$(DEPDIR)/$(am__dirstamp)
+
+indxbib$(EXEEXT): $(indxbib_OBJECTS) $(indxbib_DEPENDENCIES) $(EXTRA_indxbib_DEPENDENCIES)
+ @rm -f indxbib$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(indxbib_OBJECTS) $(indxbib_LDADD) $(LIBS)
+src/utils/lkbib/$(am__dirstamp):
+ @$(MKDIR_P) src/utils/lkbib
+ @: > src/utils/lkbib/$(am__dirstamp)
+src/utils/lkbib/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/utils/lkbib/$(DEPDIR)
+ @: > src/utils/lkbib/$(DEPDIR)/$(am__dirstamp)
+src/utils/lkbib/lkbib.$(OBJEXT): src/utils/lkbib/$(am__dirstamp) \
+ src/utils/lkbib/$(DEPDIR)/$(am__dirstamp)
+
+lkbib$(EXEEXT): $(lkbib_OBJECTS) $(lkbib_DEPENDENCIES) $(EXTRA_lkbib_DEPENDENCIES)
+ @rm -f lkbib$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(lkbib_OBJECTS) $(lkbib_LDADD) $(LIBS)
+src/utils/lookbib/$(am__dirstamp):
+ @$(MKDIR_P) src/utils/lookbib
+ @: > src/utils/lookbib/$(am__dirstamp)
+src/utils/lookbib/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/utils/lookbib/$(DEPDIR)
+ @: > src/utils/lookbib/$(DEPDIR)/$(am__dirstamp)
+src/utils/lookbib/lookbib.$(OBJEXT): \
+ src/utils/lookbib/$(am__dirstamp) \
+ src/utils/lookbib/$(DEPDIR)/$(am__dirstamp)
+
+lookbib$(EXEEXT): $(lookbib_OBJECTS) $(lookbib_DEPENDENCIES) $(EXTRA_lookbib_DEPENDENCIES)
+ @rm -f lookbib$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(lookbib_OBJECTS) $(lookbib_LDADD) $(LIBS)
+src/utils/pfbtops/$(am__dirstamp):
+ @$(MKDIR_P) src/utils/pfbtops
+ @: > src/utils/pfbtops/$(am__dirstamp)
+src/utils/pfbtops/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/utils/pfbtops/$(DEPDIR)
+ @: > src/utils/pfbtops/$(DEPDIR)/$(am__dirstamp)
+src/utils/pfbtops/pfbtops.$(OBJEXT): \
+ src/utils/pfbtops/$(am__dirstamp) \
+ src/utils/pfbtops/$(DEPDIR)/$(am__dirstamp)
+src/utils/pfbtops/dummy.$(OBJEXT): src/utils/pfbtops/$(am__dirstamp) \
+ src/utils/pfbtops/$(DEPDIR)/$(am__dirstamp)
+
+pfbtops$(EXEEXT): $(pfbtops_OBJECTS) $(pfbtops_DEPENDENCIES) $(EXTRA_pfbtops_DEPENDENCIES)
+ @rm -f pfbtops$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(pfbtops_OBJECTS) $(pfbtops_LDADD) $(LIBS)
+src/preproc/pic/pic.hpp: src/preproc/pic/pic.cpp
+ @if test ! -f $@; then rm -f src/preproc/pic/pic.cpp; else :; fi
+ @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) src/preproc/pic/pic.cpp; else :; fi
+src/preproc/pic/$(am__dirstamp):
+ @$(MKDIR_P) src/preproc/pic
+ @: > src/preproc/pic/$(am__dirstamp)
+src/preproc/pic/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/preproc/pic/$(DEPDIR)
+ @: > src/preproc/pic/$(DEPDIR)/$(am__dirstamp)
+src/preproc/pic/pic-pic.$(OBJEXT): src/preproc/pic/$(am__dirstamp) \
+ src/preproc/pic/$(DEPDIR)/$(am__dirstamp)
+src/preproc/pic/pic-lex.$(OBJEXT): src/preproc/pic/$(am__dirstamp) \
+ src/preproc/pic/$(DEPDIR)/$(am__dirstamp)
+src/preproc/pic/pic-main.$(OBJEXT): src/preproc/pic/$(am__dirstamp) \
+ src/preproc/pic/$(DEPDIR)/$(am__dirstamp)
+src/preproc/pic/pic-object.$(OBJEXT): src/preproc/pic/$(am__dirstamp) \
+ src/preproc/pic/$(DEPDIR)/$(am__dirstamp)
+src/preproc/pic/pic-common.$(OBJEXT): src/preproc/pic/$(am__dirstamp) \
+ src/preproc/pic/$(DEPDIR)/$(am__dirstamp)
+src/preproc/pic/pic-troff.$(OBJEXT): src/preproc/pic/$(am__dirstamp) \
+ src/preproc/pic/$(DEPDIR)/$(am__dirstamp)
+src/preproc/pic/pic-tex.$(OBJEXT): src/preproc/pic/$(am__dirstamp) \
+ src/preproc/pic/$(DEPDIR)/$(am__dirstamp)
+
+pic$(EXEEXT): $(pic_OBJECTS) $(pic_DEPENDENCIES) $(EXTRA_pic_DEPENDENCIES)
+ @rm -f pic$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(pic_OBJECTS) $(pic_LDADD) $(LIBS)
+src/devices/grohtml/$(am__dirstamp):
+ @$(MKDIR_P) src/devices/grohtml
+ @: > src/devices/grohtml/$(am__dirstamp)
+src/devices/grohtml/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/devices/grohtml/$(DEPDIR)
+ @: > src/devices/grohtml/$(DEPDIR)/$(am__dirstamp)
+src/devices/grohtml/post-html.$(OBJEXT): \
+ src/devices/grohtml/$(am__dirstamp) \
+ src/devices/grohtml/$(DEPDIR)/$(am__dirstamp)
+src/devices/grohtml/html-table.$(OBJEXT): \
+ src/devices/grohtml/$(am__dirstamp) \
+ src/devices/grohtml/$(DEPDIR)/$(am__dirstamp)
+src/devices/grohtml/html-text.$(OBJEXT): \
+ src/devices/grohtml/$(am__dirstamp) \
+ src/devices/grohtml/$(DEPDIR)/$(am__dirstamp)
+src/devices/grohtml/output.$(OBJEXT): \
+ src/devices/grohtml/$(am__dirstamp) \
+ src/devices/grohtml/$(DEPDIR)/$(am__dirstamp)
+
+post-grohtml$(EXEEXT): $(post_grohtml_OBJECTS) $(post_grohtml_DEPENDENCIES) $(EXTRA_post_grohtml_DEPENDENCIES)
+ @rm -f post-grohtml$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(post_grohtml_OBJECTS) $(post_grohtml_LDADD) $(LIBS)
+src/preproc/html/$(am__dirstamp):
+ @$(MKDIR_P) src/preproc/html
+ @: > src/preproc/html/$(am__dirstamp)
+src/preproc/html/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/preproc/html/$(DEPDIR)
+ @: > src/preproc/html/$(DEPDIR)/$(am__dirstamp)
+src/preproc/html/pre-html.$(OBJEXT): src/preproc/html/$(am__dirstamp) \
+ src/preproc/html/$(DEPDIR)/$(am__dirstamp)
+src/preproc/html/pushback.$(OBJEXT): src/preproc/html/$(am__dirstamp) \
+ src/preproc/html/$(DEPDIR)/$(am__dirstamp)
+
+pre-grohtml$(EXEEXT): $(pre_grohtml_OBJECTS) $(pre_grohtml_DEPENDENCIES) $(EXTRA_pre_grohtml_DEPENDENCIES)
+ @rm -f pre-grohtml$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(pre_grohtml_OBJECTS) $(pre_grohtml_LDADD) $(LIBS)
+src/preproc/preconv/$(am__dirstamp):
+ @$(MKDIR_P) src/preproc/preconv
+ @: > src/preproc/preconv/$(am__dirstamp)
+src/preproc/preconv/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/preproc/preconv/$(DEPDIR)
+ @: > src/preproc/preconv/$(DEPDIR)/$(am__dirstamp)
+src/preproc/preconv/preconv-preconv.$(OBJEXT): \
+ src/preproc/preconv/$(am__dirstamp) \
+ src/preproc/preconv/$(DEPDIR)/$(am__dirstamp)
+
+preconv$(EXEEXT): $(preconv_OBJECTS) $(preconv_DEPENDENCIES) $(EXTRA_preconv_DEPENDENCIES)
+ @rm -f preconv$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(preconv_OBJECTS) $(preconv_LDADD) $(LIBS)
+src/preproc/refer/$(am__dirstamp):
+ @$(MKDIR_P) src/preproc/refer
+ @: > src/preproc/refer/$(am__dirstamp)
+src/preproc/refer/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/preproc/refer/$(DEPDIR)
+ @: > src/preproc/refer/$(DEPDIR)/$(am__dirstamp)
+src/preproc/refer/refer-command.$(OBJEXT): \
+ src/preproc/refer/$(am__dirstamp) \
+ src/preproc/refer/$(DEPDIR)/$(am__dirstamp)
+src/preproc/refer/refer-ref.$(OBJEXT): \
+ src/preproc/refer/$(am__dirstamp) \
+ src/preproc/refer/$(DEPDIR)/$(am__dirstamp)
+src/preproc/refer/refer-refer.$(OBJEXT): \
+ src/preproc/refer/$(am__dirstamp) \
+ src/preproc/refer/$(DEPDIR)/$(am__dirstamp)
+src/preproc/refer/refer-token.$(OBJEXT): \
+ src/preproc/refer/$(am__dirstamp) \
+ src/preproc/refer/$(DEPDIR)/$(am__dirstamp)
+src/preproc/refer/label.hpp: src/preproc/refer/label.cpp
+ @if test ! -f $@; then rm -f src/preproc/refer/label.cpp; else :; fi
+ @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) src/preproc/refer/label.cpp; else :; fi
+src/preproc/refer/refer-label.$(OBJEXT): \
+ src/preproc/refer/$(am__dirstamp) \
+ src/preproc/refer/$(DEPDIR)/$(am__dirstamp)
+
+refer$(EXEEXT): $(refer_OBJECTS) $(refer_DEPENDENCIES) $(EXTRA_refer_DEPENDENCIES)
+ @rm -f refer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(refer_OBJECTS) $(refer_LDADD) $(LIBS)
+src/preproc/soelim/$(am__dirstamp):
+ @$(MKDIR_P) src/preproc/soelim
+ @: > src/preproc/soelim/$(am__dirstamp)
+src/preproc/soelim/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/preproc/soelim/$(DEPDIR)
+ @: > src/preproc/soelim/$(DEPDIR)/$(am__dirstamp)
+src/preproc/soelim/soelim.$(OBJEXT): \
+ src/preproc/soelim/$(am__dirstamp) \
+ src/preproc/soelim/$(DEPDIR)/$(am__dirstamp)
+
+soelim$(EXEEXT): $(soelim_OBJECTS) $(soelim_DEPENDENCIES) $(EXTRA_soelim_DEPENDENCIES)
+ @rm -f soelim$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(soelim_OBJECTS) $(soelim_LDADD) $(LIBS)
+src/preproc/tbl/$(am__dirstamp):
+ @$(MKDIR_P) src/preproc/tbl
+ @: > src/preproc/tbl/$(am__dirstamp)
+src/preproc/tbl/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/preproc/tbl/$(DEPDIR)
+ @: > src/preproc/tbl/$(DEPDIR)/$(am__dirstamp)
+src/preproc/tbl/main.$(OBJEXT): src/preproc/tbl/$(am__dirstamp) \
+ src/preproc/tbl/$(DEPDIR)/$(am__dirstamp)
+src/preproc/tbl/table.$(OBJEXT): src/preproc/tbl/$(am__dirstamp) \
+ src/preproc/tbl/$(DEPDIR)/$(am__dirstamp)
+
+tbl$(EXEEXT): $(tbl_OBJECTS) $(tbl_DEPENDENCIES) $(EXTRA_tbl_DEPENDENCIES)
+ @rm -f tbl$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(tbl_OBJECTS) $(tbl_LDADD) $(LIBS)
+src/utils/tfmtodit/$(am__dirstamp):
+ @$(MKDIR_P) src/utils/tfmtodit
+ @: > src/utils/tfmtodit/$(am__dirstamp)
+src/utils/tfmtodit/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/utils/tfmtodit/$(DEPDIR)
+ @: > src/utils/tfmtodit/$(DEPDIR)/$(am__dirstamp)
+src/utils/tfmtodit/tfmtodit.$(OBJEXT): \
+ src/utils/tfmtodit/$(am__dirstamp) \
+ src/utils/tfmtodit/$(DEPDIR)/$(am__dirstamp)
+
+tfmtodit$(EXEEXT): $(tfmtodit_OBJECTS) $(tfmtodit_DEPENDENCIES) $(EXTRA_tfmtodit_DEPENDENCIES)
+ @rm -f tfmtodit$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(tfmtodit_OBJECTS) $(tfmtodit_LDADD) $(LIBS)
+src/roff/troff/$(am__dirstamp):
+ @$(MKDIR_P) src/roff/troff
+ @: > src/roff/troff/$(am__dirstamp)
+src/roff/troff/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/roff/troff/$(DEPDIR)
+ @: > src/roff/troff/$(DEPDIR)/$(am__dirstamp)
+src/roff/troff/dictionary.$(OBJEXT): src/roff/troff/$(am__dirstamp) \
+ src/roff/troff/$(DEPDIR)/$(am__dirstamp)
+src/roff/troff/div.$(OBJEXT): src/roff/troff/$(am__dirstamp) \
+ src/roff/troff/$(DEPDIR)/$(am__dirstamp)
+src/roff/troff/env.$(OBJEXT): src/roff/troff/$(am__dirstamp) \
+ src/roff/troff/$(DEPDIR)/$(am__dirstamp)
+src/roff/troff/input.$(OBJEXT): src/roff/troff/$(am__dirstamp) \
+ src/roff/troff/$(DEPDIR)/$(am__dirstamp)
+src/roff/troff/mtsm.$(OBJEXT): src/roff/troff/$(am__dirstamp) \
+ src/roff/troff/$(DEPDIR)/$(am__dirstamp)
+src/roff/troff/node.$(OBJEXT): src/roff/troff/$(am__dirstamp) \
+ src/roff/troff/$(DEPDIR)/$(am__dirstamp)
+src/roff/troff/number.$(OBJEXT): src/roff/troff/$(am__dirstamp) \
+ src/roff/troff/$(DEPDIR)/$(am__dirstamp)
+src/roff/troff/reg.$(OBJEXT): src/roff/troff/$(am__dirstamp) \
+ src/roff/troff/$(DEPDIR)/$(am__dirstamp)
+src/roff/troff/majorminor.$(OBJEXT): src/roff/troff/$(am__dirstamp) \
+ src/roff/troff/$(DEPDIR)/$(am__dirstamp)
+
+troff$(EXEEXT): $(troff_OBJECTS) $(troff_DEPENDENCIES) $(EXTRA_troff_DEPENDENCIES)
+ @rm -f troff$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(troff_OBJECTS) $(troff_LDADD) $(LIBS)
+src/utils/xtotroff/$(am__dirstamp):
+ @$(MKDIR_P) src/utils/xtotroff
+ @: > src/utils/xtotroff/$(am__dirstamp)
+src/utils/xtotroff/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/utils/xtotroff/$(DEPDIR)
+ @: > src/utils/xtotroff/$(DEPDIR)/$(am__dirstamp)
+src/utils/xtotroff/xtotroff-xtotroff.$(OBJEXT): \
+ src/utils/xtotroff/$(am__dirstamp) \
+ src/utils/xtotroff/$(DEPDIR)/$(am__dirstamp)
+
+xtotroff$(EXEEXT): $(xtotroff_OBJECTS) $(xtotroff_DEPENDENCIES) $(EXTRA_xtotroff_DEPENDENCIES)
+ @rm -f xtotroff$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(xtotroff_OBJECTS) $(xtotroff_LDADD) $(LIBS)
+install-binSCRIPTS: $(bin_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n' \
+ -e 'h;s|.*|.|' \
+ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+ if (++n[d] == $(am__install_max)) { \
+ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+ else { print "f", d "/" $$4, $$1 } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 's,.*/,,;$(transform)'`; \
+ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir)
+install-dist_binSCRIPTS: $(dist_bin_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n' \
+ -e 'h;s|.*|.|' \
+ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+ if (++n[d] == $(am__install_max)) { \
+ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+ else { print "f", d "/" $$4, $$1 } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-dist_binSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 's,.*/,,;$(transform)'`; \
+ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir)
+install-prefixexecbinSCRIPTS: $(prefixexecbin_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ @list='$(prefixexecbin_SCRIPTS)'; test -n "$(prefixexecbindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(prefixexecbindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(prefixexecbindir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n' \
+ -e 'h;s|.*|.|' \
+ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+ if (++n[d] == $(am__install_max)) { \
+ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+ else { print "f", d "/" $$4, $$1 } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(prefixexecbindir)$$dir'"; \
+ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(prefixexecbindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-prefixexecbinSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(prefixexecbin_SCRIPTS)'; test -n "$(prefixexecbindir)" || exit 0; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 's,.*/,,;$(transform)'`; \
+ dir='$(DESTDIR)$(prefixexecbindir)'; $(am__uninstall_files_from_dir)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+ -rm -f lib/*.$(OBJEXT)
+ -rm -f lib/uniwidth/*.$(OBJEXT)
+ -rm -f src/devices/grodvi/*.$(OBJEXT)
+ -rm -f src/devices/grohtml/*.$(OBJEXT)
+ -rm -f src/devices/grolbp/*.$(OBJEXT)
+ -rm -f src/devices/grolj4/*.$(OBJEXT)
+ -rm -f src/devices/grops/*.$(OBJEXT)
+ -rm -f src/devices/grotty/*.$(OBJEXT)
+ -rm -f src/devices/xditview/*.$(OBJEXT)
+ -rm -f src/libs/libbib/*.$(OBJEXT)
+ -rm -f src/libs/libdriver/*.$(OBJEXT)
+ -rm -f src/libs/libgroff/*.$(OBJEXT)
+ -rm -f src/libs/libxutil/*.$(OBJEXT)
+ -rm -f src/preproc/eqn/*.$(OBJEXT)
+ -rm -f src/preproc/grn/*.$(OBJEXT)
+ -rm -f src/preproc/html/*.$(OBJEXT)
+ -rm -f src/preproc/pic/*.$(OBJEXT)
+ -rm -f src/preproc/preconv/*.$(OBJEXT)
+ -rm -f src/preproc/refer/*.$(OBJEXT)
+ -rm -f src/preproc/soelim/*.$(OBJEXT)
+ -rm -f src/preproc/tbl/*.$(OBJEXT)
+ -rm -f src/roff/groff/*.$(OBJEXT)
+ -rm -f src/roff/troff/*.$(OBJEXT)
+ -rm -f src/utils/addftinfo/*.$(OBJEXT)
+ -rm -f src/utils/hpftodit/*.$(OBJEXT)
+ -rm -f src/utils/indxbib/*.$(OBJEXT)
+ -rm -f src/utils/lkbib/*.$(OBJEXT)
+ -rm -f src/utils/lookbib/*.$(OBJEXT)
+ -rm -f src/utils/pfbtops/*.$(OBJEXT)
+ -rm -f src/utils/tfmtodit/*.$(OBJEXT)
+ -rm -f src/utils/xtotroff/*.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-asnprintf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-float.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-fprintf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-frexp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-frexpl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-fseterr.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-isnan.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-isnand.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-isnanf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-isnanl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-itold.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-localcharset.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-math.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-memchr.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-printf-args.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-printf-frexp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-printf-frexpl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-printf-parse.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-signbitd.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-signbitf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-signbitl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-snprintf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-stdio-read.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-stdio-write.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-unistd.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-vasnprintf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-vsnprintf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-wctype-h.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-wcwidth.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-xsize.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/uniwidth/$(DEPDIR)/libgnu_a-width.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/devices/grodvi/$(DEPDIR)/dvi.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/devices/grohtml/$(DEPDIR)/html-table.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/devices/grohtml/$(DEPDIR)/html-text.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/devices/grohtml/$(DEPDIR)/output.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/devices/grohtml/$(DEPDIR)/post-html.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/devices/grolbp/$(DEPDIR)/lbp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/devices/grolj4/$(DEPDIR)/lj4.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/devices/grops/$(DEPDIR)/ps.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/devices/grops/$(DEPDIR)/psrm.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/devices/grotty/$(DEPDIR)/tty.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/devices/xditview/$(DEPDIR)/gxditview-Dvi.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/devices/xditview/$(DEPDIR)/gxditview-device.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/devices/xditview/$(DEPDIR)/gxditview-draw.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/devices/xditview/$(DEPDIR)/gxditview-font.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/devices/xditview/$(DEPDIR)/gxditview-lex.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/devices/xditview/$(DEPDIR)/gxditview-page.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/devices/xditview/$(DEPDIR)/gxditview-parse.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/devices/xditview/$(DEPDIR)/gxditview-xditview.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libbib/$(DEPDIR)/common.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libbib/$(DEPDIR)/index.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libbib/$(DEPDIR)/linear.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libbib/$(DEPDIR)/map.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libbib/$(DEPDIR)/search.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libdriver/$(DEPDIR)/input.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libdriver/$(DEPDIR)/printer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-assert.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-change_lf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-cmap.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-color.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-cset.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-curtime.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-device.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-errarg.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-error.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-fatal.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-filename.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-font.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-fontfile.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-geometry.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-glyphuni.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-htmlhint.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-hypot.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-iftoa.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-invalid.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-itoa.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-lf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-lineno.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-localcharset.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-macropath.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-matherr.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-maxfilename.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-maxpathname.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-mksdir.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-nametoindex.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-paper.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-prime.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-progname.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-ptable.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-quotearg.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-relocate.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-searchpath.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-spawnvp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-string.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-strsave.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-symbol.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-tmpfile.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-tmpname.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-unicode.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-uniglyph.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-uniuni.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libgroff/$(DEPDIR)/libgroff_a-version.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libxutil/$(DEPDIR)/libxutil_a-DviChar.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libxutil/$(DEPDIR)/libxutil_a-XFontName.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/libs/libxutil/$(DEPDIR)/libxutil_a-xmalloc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/eqn/$(DEPDIR)/eqn-box.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/eqn/$(DEPDIR)/eqn-delim.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/eqn/$(DEPDIR)/eqn-eqn.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/eqn/$(DEPDIR)/eqn-lex.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/eqn/$(DEPDIR)/eqn-limit.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/eqn/$(DEPDIR)/eqn-list.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/eqn/$(DEPDIR)/eqn-main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/eqn/$(DEPDIR)/eqn-mark.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/eqn/$(DEPDIR)/eqn-other.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/eqn/$(DEPDIR)/eqn-over.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/eqn/$(DEPDIR)/eqn-pile.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/eqn/$(DEPDIR)/eqn-script.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/eqn/$(DEPDIR)/eqn-special.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/eqn/$(DEPDIR)/eqn-sqrt.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/eqn/$(DEPDIR)/eqn-text.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/grn/$(DEPDIR)/hdb.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/grn/$(DEPDIR)/hgraph.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/grn/$(DEPDIR)/hpoint.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/grn/$(DEPDIR)/main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/html/$(DEPDIR)/pre-html.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/html/$(DEPDIR)/pushback.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/pic/$(DEPDIR)/pic-common.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/pic/$(DEPDIR)/pic-lex.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/pic/$(DEPDIR)/pic-main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/pic/$(DEPDIR)/pic-object.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/pic/$(DEPDIR)/pic-pic.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/pic/$(DEPDIR)/pic-tex.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/pic/$(DEPDIR)/pic-troff.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/preconv/$(DEPDIR)/preconv-preconv.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/refer/$(DEPDIR)/refer-command.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/refer/$(DEPDIR)/refer-label.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/refer/$(DEPDIR)/refer-ref.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/refer/$(DEPDIR)/refer-refer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/refer/$(DEPDIR)/refer-token.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/soelim/$(DEPDIR)/soelim.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/tbl/$(DEPDIR)/main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/preproc/tbl/$(DEPDIR)/table.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/roff/groff/$(DEPDIR)/groff.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/roff/groff/$(DEPDIR)/pipeline.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/roff/troff/$(DEPDIR)/dictionary.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/roff/troff/$(DEPDIR)/div.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/roff/troff/$(DEPDIR)/env.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/roff/troff/$(DEPDIR)/input.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/roff/troff/$(DEPDIR)/majorminor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/roff/troff/$(DEPDIR)/mtsm.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/roff/troff/$(DEPDIR)/node.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/roff/troff/$(DEPDIR)/number.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/roff/troff/$(DEPDIR)/reg.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/utils/addftinfo/$(DEPDIR)/addftinfo.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/utils/addftinfo/$(DEPDIR)/guess.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/utils/hpftodit/$(DEPDIR)/hpftodit.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/utils/hpftodit/$(DEPDIR)/hpuni.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/utils/indxbib/$(DEPDIR)/indxbib.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/utils/indxbib/$(DEPDIR)/signal.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/utils/lkbib/$(DEPDIR)/lkbib.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/utils/lookbib/$(DEPDIR)/lookbib.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/utils/pfbtops/$(DEPDIR)/dummy.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/utils/pfbtops/$(DEPDIR)/pfbtops.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/utils/tfmtodit/$(DEPDIR)/tfmtodit.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/utils/xtotroff/$(DEPDIR)/xtotroff-xtotroff.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+lib/libgnu_a-float.o: lib/float.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-float.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-float.Tpo -c -o lib/libgnu_a-float.o `test -f 'lib/float.c' || echo '$(srcdir)/'`lib/float.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-float.Tpo lib/$(DEPDIR)/libgnu_a-float.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/float.c' object='lib/libgnu_a-float.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-float.o `test -f 'lib/float.c' || echo '$(srcdir)/'`lib/float.c
+
+lib/libgnu_a-float.obj: lib/float.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-float.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-float.Tpo -c -o lib/libgnu_a-float.obj `if test -f 'lib/float.c'; then $(CYGPATH_W) 'lib/float.c'; else $(CYGPATH_W) '$(srcdir)/lib/float.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-float.Tpo lib/$(DEPDIR)/libgnu_a-float.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/float.c' object='lib/libgnu_a-float.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-float.obj `if test -f 'lib/float.c'; then $(CYGPATH_W) 'lib/float.c'; else $(CYGPATH_W) '$(srcdir)/lib/float.c'; fi`
+
+lib/libgnu_a-itold.o: lib/itold.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-itold.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-itold.Tpo -c -o lib/libgnu_a-itold.o `test -f 'lib/itold.c' || echo '$(srcdir)/'`lib/itold.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-itold.Tpo lib/$(DEPDIR)/libgnu_a-itold.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/itold.c' object='lib/libgnu_a-itold.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-itold.o `test -f 'lib/itold.c' || echo '$(srcdir)/'`lib/itold.c
+
+lib/libgnu_a-itold.obj: lib/itold.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-itold.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-itold.Tpo -c -o lib/libgnu_a-itold.obj `if test -f 'lib/itold.c'; then $(CYGPATH_W) 'lib/itold.c'; else $(CYGPATH_W) '$(srcdir)/lib/itold.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-itold.Tpo lib/$(DEPDIR)/libgnu_a-itold.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/itold.c' object='lib/libgnu_a-itold.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-itold.obj `if test -f 'lib/itold.c'; then $(CYGPATH_W) 'lib/itold.c'; else $(CYGPATH_W) '$(srcdir)/lib/itold.c'; fi`
+
+lib/libgnu_a-free.o: lib/free.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-free.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-free.Tpo -c -o lib/libgnu_a-free.o `test -f 'lib/free.c' || echo '$(srcdir)/'`lib/free.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-free.Tpo lib/$(DEPDIR)/libgnu_a-free.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/free.c' object='lib/libgnu_a-free.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-free.o `test -f 'lib/free.c' || echo '$(srcdir)/'`lib/free.c
+
+lib/libgnu_a-free.obj: lib/free.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-free.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-free.Tpo -c -o lib/libgnu_a-free.obj `if test -f 'lib/free.c'; then $(CYGPATH_W) 'lib/free.c'; else $(CYGPATH_W) '$(srcdir)/lib/free.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-free.Tpo lib/$(DEPDIR)/libgnu_a-free.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/free.c' object='lib/libgnu_a-free.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-free.obj `if test -f 'lib/free.c'; then $(CYGPATH_W) 'lib/free.c'; else $(CYGPATH_W) '$(srcdir)/lib/free.c'; fi`
+
+lib/libgnu_a-fseterr.o: lib/fseterr.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-fseterr.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-fseterr.Tpo -c -o lib/libgnu_a-fseterr.o `test -f 'lib/fseterr.c' || echo '$(srcdir)/'`lib/fseterr.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-fseterr.Tpo lib/$(DEPDIR)/libgnu_a-fseterr.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/fseterr.c' object='lib/libgnu_a-fseterr.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-fseterr.o `test -f 'lib/fseterr.c' || echo '$(srcdir)/'`lib/fseterr.c
+
+lib/libgnu_a-fseterr.obj: lib/fseterr.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-fseterr.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-fseterr.Tpo -c -o lib/libgnu_a-fseterr.obj `if test -f 'lib/fseterr.c'; then $(CYGPATH_W) 'lib/fseterr.c'; else $(CYGPATH_W) '$(srcdir)/lib/fseterr.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-fseterr.Tpo lib/$(DEPDIR)/libgnu_a-fseterr.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/fseterr.c' object='lib/libgnu_a-fseterr.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-fseterr.obj `if test -f 'lib/fseterr.c'; then $(CYGPATH_W) 'lib/fseterr.c'; else $(CYGPATH_W) '$(srcdir)/lib/fseterr.c'; fi`
+
+lib/libgnu_a-localcharset.o: lib/localcharset.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-localcharset.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-localcharset.Tpo -c -o lib/libgnu_a-localcharset.o `test -f 'lib/localcharset.c' || echo '$(srcdir)/'`lib/localcharset.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-localcharset.Tpo lib/$(DEPDIR)/libgnu_a-localcharset.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/localcharset.c' object='lib/libgnu_a-localcharset.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-localcharset.o `test -f 'lib/localcharset.c' || echo '$(srcdir)/'`lib/localcharset.c
+
+lib/libgnu_a-localcharset.obj: lib/localcharset.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-localcharset.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-localcharset.Tpo -c -o lib/libgnu_a-localcharset.obj `if test -f 'lib/localcharset.c'; then $(CYGPATH_W) 'lib/localcharset.c'; else $(CYGPATH_W) '$(srcdir)/lib/localcharset.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-localcharset.Tpo lib/$(DEPDIR)/libgnu_a-localcharset.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/localcharset.c' object='lib/libgnu_a-localcharset.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-localcharset.obj `if test -f 'lib/localcharset.c'; then $(CYGPATH_W) 'lib/localcharset.c'; else $(CYGPATH_W) '$(srcdir)/lib/localcharset.c'; fi`
+
+lib/libgnu_a-math.o: lib/math.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-math.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-math.Tpo -c -o lib/libgnu_a-math.o `test -f 'lib/math.c' || echo '$(srcdir)/'`lib/math.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-math.Tpo lib/$(DEPDIR)/libgnu_a-math.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/math.c' object='lib/libgnu_a-math.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-math.o `test -f 'lib/math.c' || echo '$(srcdir)/'`lib/math.c
+
+lib/libgnu_a-math.obj: lib/math.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-math.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-math.Tpo -c -o lib/libgnu_a-math.obj `if test -f 'lib/math.c'; then $(CYGPATH_W) 'lib/math.c'; else $(CYGPATH_W) '$(srcdir)/lib/math.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-math.Tpo lib/$(DEPDIR)/libgnu_a-math.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/math.c' object='lib/libgnu_a-math.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-math.obj `if test -f 'lib/math.c'; then $(CYGPATH_W) 'lib/math.c'; else $(CYGPATH_W) '$(srcdir)/lib/math.c'; fi`
+
+lib/libgnu_a-memchr.o: lib/memchr.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-memchr.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-memchr.Tpo -c -o lib/libgnu_a-memchr.o `test -f 'lib/memchr.c' || echo '$(srcdir)/'`lib/memchr.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-memchr.Tpo lib/$(DEPDIR)/libgnu_a-memchr.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/memchr.c' object='lib/libgnu_a-memchr.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-memchr.o `test -f 'lib/memchr.c' || echo '$(srcdir)/'`lib/memchr.c
+
+lib/libgnu_a-memchr.obj: lib/memchr.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-memchr.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-memchr.Tpo -c -o lib/libgnu_a-memchr.obj `if test -f 'lib/memchr.c'; then $(CYGPATH_W) 'lib/memchr.c'; else $(CYGPATH_W) '$(srcdir)/lib/memchr.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-memchr.Tpo lib/$(DEPDIR)/libgnu_a-memchr.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/memchr.c' object='lib/libgnu_a-memchr.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-memchr.obj `if test -f 'lib/memchr.c'; then $(CYGPATH_W) 'lib/memchr.c'; else $(CYGPATH_W) '$(srcdir)/lib/memchr.c'; fi`
+
+lib/libgnu_a-printf-frexp.o: lib/printf-frexp.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-printf-frexp.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-printf-frexp.Tpo -c -o lib/libgnu_a-printf-frexp.o `test -f 'lib/printf-frexp.c' || echo '$(srcdir)/'`lib/printf-frexp.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-printf-frexp.Tpo lib/$(DEPDIR)/libgnu_a-printf-frexp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/printf-frexp.c' object='lib/libgnu_a-printf-frexp.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-printf-frexp.o `test -f 'lib/printf-frexp.c' || echo '$(srcdir)/'`lib/printf-frexp.c
+
+lib/libgnu_a-printf-frexp.obj: lib/printf-frexp.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-printf-frexp.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-printf-frexp.Tpo -c -o lib/libgnu_a-printf-frexp.obj `if test -f 'lib/printf-frexp.c'; then $(CYGPATH_W) 'lib/printf-frexp.c'; else $(CYGPATH_W) '$(srcdir)/lib/printf-frexp.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-printf-frexp.Tpo lib/$(DEPDIR)/libgnu_a-printf-frexp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/printf-frexp.c' object='lib/libgnu_a-printf-frexp.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-printf-frexp.obj `if test -f 'lib/printf-frexp.c'; then $(CYGPATH_W) 'lib/printf-frexp.c'; else $(CYGPATH_W) '$(srcdir)/lib/printf-frexp.c'; fi`
+
+lib/libgnu_a-printf-frexpl.o: lib/printf-frexpl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-printf-frexpl.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-printf-frexpl.Tpo -c -o lib/libgnu_a-printf-frexpl.o `test -f 'lib/printf-frexpl.c' || echo '$(srcdir)/'`lib/printf-frexpl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-printf-frexpl.Tpo lib/$(DEPDIR)/libgnu_a-printf-frexpl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/printf-frexpl.c' object='lib/libgnu_a-printf-frexpl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-printf-frexpl.o `test -f 'lib/printf-frexpl.c' || echo '$(srcdir)/'`lib/printf-frexpl.c
+
+lib/libgnu_a-printf-frexpl.obj: lib/printf-frexpl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-printf-frexpl.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-printf-frexpl.Tpo -c -o lib/libgnu_a-printf-frexpl.obj `if test -f 'lib/printf-frexpl.c'; then $(CYGPATH_W) 'lib/printf-frexpl.c'; else $(CYGPATH_W) '$(srcdir)/lib/printf-frexpl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-printf-frexpl.Tpo lib/$(DEPDIR)/libgnu_a-printf-frexpl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/printf-frexpl.c' object='lib/libgnu_a-printf-frexpl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-printf-frexpl.obj `if test -f 'lib/printf-frexpl.c'; then $(CYGPATH_W) 'lib/printf-frexpl.c'; else $(CYGPATH_W) '$(srcdir)/lib/printf-frexpl.c'; fi`
+
+lib/libgnu_a-signbitf.o: lib/signbitf.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-signbitf.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-signbitf.Tpo -c -o lib/libgnu_a-signbitf.o `test -f 'lib/signbitf.c' || echo '$(srcdir)/'`lib/signbitf.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-signbitf.Tpo lib/$(DEPDIR)/libgnu_a-signbitf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/signbitf.c' object='lib/libgnu_a-signbitf.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-signbitf.o `test -f 'lib/signbitf.c' || echo '$(srcdir)/'`lib/signbitf.c
+
+lib/libgnu_a-signbitf.obj: lib/signbitf.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-signbitf.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-signbitf.Tpo -c -o lib/libgnu_a-signbitf.obj `if test -f 'lib/signbitf.c'; then $(CYGPATH_W) 'lib/signbitf.c'; else $(CYGPATH_W) '$(srcdir)/lib/signbitf.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-signbitf.Tpo lib/$(DEPDIR)/libgnu_a-signbitf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/signbitf.c' object='lib/libgnu_a-signbitf.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-signbitf.obj `if test -f 'lib/signbitf.c'; then $(CYGPATH_W) 'lib/signbitf.c'; else $(CYGPATH_W) '$(srcdir)/lib/signbitf.c'; fi`
+
+lib/libgnu_a-signbitd.o: lib/signbitd.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-signbitd.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-signbitd.Tpo -c -o lib/libgnu_a-signbitd.o `test -f 'lib/signbitd.c' || echo '$(srcdir)/'`lib/signbitd.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-signbitd.Tpo lib/$(DEPDIR)/libgnu_a-signbitd.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/signbitd.c' object='lib/libgnu_a-signbitd.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-signbitd.o `test -f 'lib/signbitd.c' || echo '$(srcdir)/'`lib/signbitd.c
+
+lib/libgnu_a-signbitd.obj: lib/signbitd.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-signbitd.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-signbitd.Tpo -c -o lib/libgnu_a-signbitd.obj `if test -f 'lib/signbitd.c'; then $(CYGPATH_W) 'lib/signbitd.c'; else $(CYGPATH_W) '$(srcdir)/lib/signbitd.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-signbitd.Tpo lib/$(DEPDIR)/libgnu_a-signbitd.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/signbitd.c' object='lib/libgnu_a-signbitd.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-signbitd.obj `if test -f 'lib/signbitd.c'; then $(CYGPATH_W) 'lib/signbitd.c'; else $(CYGPATH_W) '$(srcdir)/lib/signbitd.c'; fi`
+
+lib/libgnu_a-signbitl.o: lib/signbitl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-signbitl.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-signbitl.Tpo -c -o lib/libgnu_a-signbitl.o `test -f 'lib/signbitl.c' || echo '$(srcdir)/'`lib/signbitl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-signbitl.Tpo lib/$(DEPDIR)/libgnu_a-signbitl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/signbitl.c' object='lib/libgnu_a-signbitl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-signbitl.o `test -f 'lib/signbitl.c' || echo '$(srcdir)/'`lib/signbitl.c
+
+lib/libgnu_a-signbitl.obj: lib/signbitl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-signbitl.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-signbitl.Tpo -c -o lib/libgnu_a-signbitl.obj `if test -f 'lib/signbitl.c'; then $(CYGPATH_W) 'lib/signbitl.c'; else $(CYGPATH_W) '$(srcdir)/lib/signbitl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-signbitl.Tpo lib/$(DEPDIR)/libgnu_a-signbitl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/signbitl.c' object='lib/libgnu_a-signbitl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-signbitl.obj `if test -f 'lib/signbitl.c'; then $(CYGPATH_W) 'lib/signbitl.c'; else $(CYGPATH_W) '$(srcdir)/lib/signbitl.c'; fi`
+
+lib/libgnu_a-stdio-read.o: lib/stdio-read.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-stdio-read.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-stdio-read.Tpo -c -o lib/libgnu_a-stdio-read.o `test -f 'lib/stdio-read.c' || echo '$(srcdir)/'`lib/stdio-read.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-stdio-read.Tpo lib/$(DEPDIR)/libgnu_a-stdio-read.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/stdio-read.c' object='lib/libgnu_a-stdio-read.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-stdio-read.o `test -f 'lib/stdio-read.c' || echo '$(srcdir)/'`lib/stdio-read.c
+
+lib/libgnu_a-stdio-read.obj: lib/stdio-read.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-stdio-read.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-stdio-read.Tpo -c -o lib/libgnu_a-stdio-read.obj `if test -f 'lib/stdio-read.c'; then $(CYGPATH_W) 'lib/stdio-read.c'; else $(CYGPATH_W) '$(srcdir)/lib/stdio-read.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-stdio-read.Tpo lib/$(DEPDIR)/libgnu_a-stdio-read.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/stdio-read.c' object='lib/libgnu_a-stdio-read.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-stdio-read.obj `if test -f 'lib/stdio-read.c'; then $(CYGPATH_W) 'lib/stdio-read.c'; else $(CYGPATH_W) '$(srcdir)/lib/stdio-read.c'; fi`
+
+lib/libgnu_a-stdio-write.o: lib/stdio-write.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-stdio-write.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-stdio-write.Tpo -c -o lib/libgnu_a-stdio-write.o `test -f 'lib/stdio-write.c' || echo '$(srcdir)/'`lib/stdio-write.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-stdio-write.Tpo lib/$(DEPDIR)/libgnu_a-stdio-write.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/stdio-write.c' object='lib/libgnu_a-stdio-write.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-stdio-write.o `test -f 'lib/stdio-write.c' || echo '$(srcdir)/'`lib/stdio-write.c
+
+lib/libgnu_a-stdio-write.obj: lib/stdio-write.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-stdio-write.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-stdio-write.Tpo -c -o lib/libgnu_a-stdio-write.obj `if test -f 'lib/stdio-write.c'; then $(CYGPATH_W) 'lib/stdio-write.c'; else $(CYGPATH_W) '$(srcdir)/lib/stdio-write.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-stdio-write.Tpo lib/$(DEPDIR)/libgnu_a-stdio-write.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/stdio-write.c' object='lib/libgnu_a-stdio-write.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-stdio-write.obj `if test -f 'lib/stdio-write.c'; then $(CYGPATH_W) 'lib/stdio-write.c'; else $(CYGPATH_W) '$(srcdir)/lib/stdio-write.c'; fi`
+
+lib/libgnu_a-unistd.o: lib/unistd.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-unistd.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-unistd.Tpo -c -o lib/libgnu_a-unistd.o `test -f 'lib/unistd.c' || echo '$(srcdir)/'`lib/unistd.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-unistd.Tpo lib/$(DEPDIR)/libgnu_a-unistd.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/unistd.c' object='lib/libgnu_a-unistd.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-unistd.o `test -f 'lib/unistd.c' || echo '$(srcdir)/'`lib/unistd.c
+
+lib/libgnu_a-unistd.obj: lib/unistd.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-unistd.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-unistd.Tpo -c -o lib/libgnu_a-unistd.obj `if test -f 'lib/unistd.c'; then $(CYGPATH_W) 'lib/unistd.c'; else $(CYGPATH_W) '$(srcdir)/lib/unistd.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-unistd.Tpo lib/$(DEPDIR)/libgnu_a-unistd.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/unistd.c' object='lib/libgnu_a-unistd.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-unistd.obj `if test -f 'lib/unistd.c'; then $(CYGPATH_W) 'lib/unistd.c'; else $(CYGPATH_W) '$(srcdir)/lib/unistd.c'; fi`
+
+lib/uniwidth/libgnu_a-width.o: lib/uniwidth/width.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/uniwidth/libgnu_a-width.o -MD -MP -MF lib/uniwidth/$(DEPDIR)/libgnu_a-width.Tpo -c -o lib/uniwidth/libgnu_a-width.o `test -f 'lib/uniwidth/width.c' || echo '$(srcdir)/'`lib/uniwidth/width.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/uniwidth/$(DEPDIR)/libgnu_a-width.Tpo lib/uniwidth/$(DEPDIR)/libgnu_a-width.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/uniwidth/width.c' object='lib/uniwidth/libgnu_a-width.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/uniwidth/libgnu_a-width.o `test -f 'lib/uniwidth/width.c' || echo '$(srcdir)/'`lib/uniwidth/width.c
+
+lib/uniwidth/libgnu_a-width.obj: lib/uniwidth/width.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/uniwidth/libgnu_a-width.obj -MD -MP -MF lib/uniwidth/$(DEPDIR)/libgnu_a-width.Tpo -c -o lib/uniwidth/libgnu_a-width.obj `if test -f 'lib/uniwidth/width.c'; then $(CYGPATH_W) 'lib/uniwidth/width.c'; else $(CYGPATH_W) '$(srcdir)/lib/uniwidth/width.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/uniwidth/$(DEPDIR)/libgnu_a-width.Tpo lib/uniwidth/$(DEPDIR)/libgnu_a-width.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/uniwidth/width.c' object='lib/uniwidth/libgnu_a-width.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/uniwidth/libgnu_a-width.obj `if test -f 'lib/uniwidth/width.c'; then $(CYGPATH_W) 'lib/uniwidth/width.c'; else $(CYGPATH_W) '$(srcdir)/lib/uniwidth/width.c'; fi`
+
+lib/libgnu_a-wctype-h.o: lib/wctype-h.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-wctype-h.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-wctype-h.Tpo -c -o lib/libgnu_a-wctype-h.o `test -f 'lib/wctype-h.c' || echo '$(srcdir)/'`lib/wctype-h.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-wctype-h.Tpo lib/$(DEPDIR)/libgnu_a-wctype-h.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/wctype-h.c' object='lib/libgnu_a-wctype-h.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-wctype-h.o `test -f 'lib/wctype-h.c' || echo '$(srcdir)/'`lib/wctype-h.c
+
+lib/libgnu_a-wctype-h.obj: lib/wctype-h.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-wctype-h.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-wctype-h.Tpo -c -o lib/libgnu_a-wctype-h.obj `if test -f 'lib/wctype-h.c'; then $(CYGPATH_W) 'lib/wctype-h.c'; else $(CYGPATH_W) '$(srcdir)/lib/wctype-h.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-wctype-h.Tpo lib/$(DEPDIR)/libgnu_a-wctype-h.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/wctype-h.c' object='lib/libgnu_a-wctype-h.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-wctype-h.obj `if test -f 'lib/wctype-h.c'; then $(CYGPATH_W) 'lib/wctype-h.c'; else $(CYGPATH_W) '$(srcdir)/lib/wctype-h.c'; fi`
+
+lib/libgnu_a-wcwidth.o: lib/wcwidth.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-wcwidth.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-wcwidth.Tpo -c -o lib/libgnu_a-wcwidth.o `test -f 'lib/wcwidth.c' || echo '$(srcdir)/'`lib/wcwidth.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-wcwidth.Tpo lib/$(DEPDIR)/libgnu_a-wcwidth.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/wcwidth.c' object='lib/libgnu_a-wcwidth.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-wcwidth.o `test -f 'lib/wcwidth.c' || echo '$(srcdir)/'`lib/wcwidth.c
+
+lib/libgnu_a-wcwidth.obj: lib/wcwidth.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-wcwidth.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-wcwidth.Tpo -c -o lib/libgnu_a-wcwidth.obj `if test -f 'lib/wcwidth.c'; then $(CYGPATH_W) 'lib/wcwidth.c'; else $(CYGPATH_W) '$(srcdir)/lib/wcwidth.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-wcwidth.Tpo lib/$(DEPDIR)/libgnu_a-wcwidth.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/wcwidth.c' object='lib/libgnu_a-wcwidth.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-wcwidth.obj `if test -f 'lib/wcwidth.c'; then $(CYGPATH_W) 'lib/wcwidth.c'; else $(CYGPATH_W) '$(srcdir)/lib/wcwidth.c'; fi`
+
+lib/libgnu_a-xsize.o: lib/xsize.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-xsize.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-xsize.Tpo -c -o lib/libgnu_a-xsize.o `test -f 'lib/xsize.c' || echo '$(srcdir)/'`lib/xsize.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-xsize.Tpo lib/$(DEPDIR)/libgnu_a-xsize.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/xsize.c' object='lib/libgnu_a-xsize.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-xsize.o `test -f 'lib/xsize.c' || echo '$(srcdir)/'`lib/xsize.c
+
+lib/libgnu_a-xsize.obj: lib/xsize.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-xsize.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-xsize.Tpo -c -o lib/libgnu_a-xsize.obj `if test -f 'lib/xsize.c'; then $(CYGPATH_W) 'lib/xsize.c'; else $(CYGPATH_W) '$(srcdir)/lib/xsize.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-xsize.Tpo lib/$(DEPDIR)/libgnu_a-xsize.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/xsize.c' object='lib/libgnu_a-xsize.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-xsize.obj `if test -f 'lib/xsize.c'; then $(CYGPATH_W) 'lib/xsize.c'; else $(CYGPATH_W) '$(srcdir)/lib/xsize.c'; fi`
+
+lib/libgnu_a-fprintf.o: lib/fprintf.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-fprintf.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-fprintf.Tpo -c -o lib/libgnu_a-fprintf.o `test -f 'lib/fprintf.c' || echo '$(srcdir)/'`lib/fprintf.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-fprintf.Tpo lib/$(DEPDIR)/libgnu_a-fprintf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/fprintf.c' object='lib/libgnu_a-fprintf.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-fprintf.o `test -f 'lib/fprintf.c' || echo '$(srcdir)/'`lib/fprintf.c
+
+lib/libgnu_a-fprintf.obj: lib/fprintf.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-fprintf.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-fprintf.Tpo -c -o lib/libgnu_a-fprintf.obj `if test -f 'lib/fprintf.c'; then $(CYGPATH_W) 'lib/fprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/fprintf.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-fprintf.Tpo lib/$(DEPDIR)/libgnu_a-fprintf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/fprintf.c' object='lib/libgnu_a-fprintf.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-fprintf.obj `if test -f 'lib/fprintf.c'; then $(CYGPATH_W) 'lib/fprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/fprintf.c'; fi`
+
+lib/libgnu_a-frexp.o: lib/frexp.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-frexp.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-frexp.Tpo -c -o lib/libgnu_a-frexp.o `test -f 'lib/frexp.c' || echo '$(srcdir)/'`lib/frexp.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-frexp.Tpo lib/$(DEPDIR)/libgnu_a-frexp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/frexp.c' object='lib/libgnu_a-frexp.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-frexp.o `test -f 'lib/frexp.c' || echo '$(srcdir)/'`lib/frexp.c
+
+lib/libgnu_a-frexp.obj: lib/frexp.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-frexp.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-frexp.Tpo -c -o lib/libgnu_a-frexp.obj `if test -f 'lib/frexp.c'; then $(CYGPATH_W) 'lib/frexp.c'; else $(CYGPATH_W) '$(srcdir)/lib/frexp.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-frexp.Tpo lib/$(DEPDIR)/libgnu_a-frexp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/frexp.c' object='lib/libgnu_a-frexp.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-frexp.obj `if test -f 'lib/frexp.c'; then $(CYGPATH_W) 'lib/frexp.c'; else $(CYGPATH_W) '$(srcdir)/lib/frexp.c'; fi`
+
+lib/libgnu_a-frexpl.o: lib/frexpl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-frexpl.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-frexpl.Tpo -c -o lib/libgnu_a-frexpl.o `test -f 'lib/frexpl.c' || echo '$(srcdir)/'`lib/frexpl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-frexpl.Tpo lib/$(DEPDIR)/libgnu_a-frexpl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/frexpl.c' object='lib/libgnu_a-frexpl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-frexpl.o `test -f 'lib/frexpl.c' || echo '$(srcdir)/'`lib/frexpl.c
+
+lib/libgnu_a-frexpl.obj: lib/frexpl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-frexpl.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-frexpl.Tpo -c -o lib/libgnu_a-frexpl.obj `if test -f 'lib/frexpl.c'; then $(CYGPATH_W) 'lib/frexpl.c'; else $(CYGPATH_W) '$(srcdir)/lib/frexpl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-frexpl.Tpo lib/$(DEPDIR)/libgnu_a-frexpl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/frexpl.c' object='lib/libgnu_a-frexpl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-frexpl.obj `if test -f 'lib/frexpl.c'; then $(CYGPATH_W) 'lib/frexpl.c'; else $(CYGPATH_W) '$(srcdir)/lib/frexpl.c'; fi`
+
+lib/libgnu_a-isnan.o: lib/isnan.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-isnan.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-isnan.Tpo -c -o lib/libgnu_a-isnan.o `test -f 'lib/isnan.c' || echo '$(srcdir)/'`lib/isnan.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-isnan.Tpo lib/$(DEPDIR)/libgnu_a-isnan.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/isnan.c' object='lib/libgnu_a-isnan.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-isnan.o `test -f 'lib/isnan.c' || echo '$(srcdir)/'`lib/isnan.c
+
+lib/libgnu_a-isnan.obj: lib/isnan.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-isnan.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-isnan.Tpo -c -o lib/libgnu_a-isnan.obj `if test -f 'lib/isnan.c'; then $(CYGPATH_W) 'lib/isnan.c'; else $(CYGPATH_W) '$(srcdir)/lib/isnan.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-isnan.Tpo lib/$(DEPDIR)/libgnu_a-isnan.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/isnan.c' object='lib/libgnu_a-isnan.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-isnan.obj `if test -f 'lib/isnan.c'; then $(CYGPATH_W) 'lib/isnan.c'; else $(CYGPATH_W) '$(srcdir)/lib/isnan.c'; fi`
+
+lib/libgnu_a-isnand.o: lib/isnand.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-isnand.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-isnand.Tpo -c -o lib/libgnu_a-isnand.o `test -f 'lib/isnand.c' || echo '$(srcdir)/'`lib/isnand.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-isnand.Tpo lib/$(DEPDIR)/libgnu_a-isnand.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/isnand.c' object='lib/libgnu_a-isnand.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-isnand.o `test -f 'lib/isnand.c' || echo '$(srcdir)/'`lib/isnand.c
+
+lib/libgnu_a-isnand.obj: lib/isnand.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-isnand.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-isnand.Tpo -c -o lib/libgnu_a-isnand.obj `if test -f 'lib/isnand.c'; then $(CYGPATH_W) 'lib/isnand.c'; else $(CYGPATH_W) '$(srcdir)/lib/isnand.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-isnand.Tpo lib/$(DEPDIR)/libgnu_a-isnand.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/isnand.c' object='lib/libgnu_a-isnand.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-isnand.obj `if test -f 'lib/isnand.c'; then $(CYGPATH_W) 'lib/isnand.c'; else $(CYGPATH_W) '$(srcdir)/lib/isnand.c'; fi`
+
+lib/libgnu_a-isnanf.o: lib/isnanf.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-isnanf.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-isnanf.Tpo -c -o lib/libgnu_a-isnanf.o `test -f 'lib/isnanf.c' || echo '$(srcdir)/'`lib/isnanf.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-isnanf.Tpo lib/$(DEPDIR)/libgnu_a-isnanf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/isnanf.c' object='lib/libgnu_a-isnanf.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-isnanf.o `test -f 'lib/isnanf.c' || echo '$(srcdir)/'`lib/isnanf.c
+
+lib/libgnu_a-isnanf.obj: lib/isnanf.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-isnanf.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-isnanf.Tpo -c -o lib/libgnu_a-isnanf.obj `if test -f 'lib/isnanf.c'; then $(CYGPATH_W) 'lib/isnanf.c'; else $(CYGPATH_W) '$(srcdir)/lib/isnanf.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-isnanf.Tpo lib/$(DEPDIR)/libgnu_a-isnanf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/isnanf.c' object='lib/libgnu_a-isnanf.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-isnanf.obj `if test -f 'lib/isnanf.c'; then $(CYGPATH_W) 'lib/isnanf.c'; else $(CYGPATH_W) '$(srcdir)/lib/isnanf.c'; fi`
+
+lib/libgnu_a-isnanl.o: lib/isnanl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-isnanl.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-isnanl.Tpo -c -o lib/libgnu_a-isnanl.o `test -f 'lib/isnanl.c' || echo '$(srcdir)/'`lib/isnanl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-isnanl.Tpo lib/$(DEPDIR)/libgnu_a-isnanl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/isnanl.c' object='lib/libgnu_a-isnanl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-isnanl.o `test -f 'lib/isnanl.c' || echo '$(srcdir)/'`lib/isnanl.c
+
+lib/libgnu_a-isnanl.obj: lib/isnanl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-isnanl.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-isnanl.Tpo -c -o lib/libgnu_a-isnanl.obj `if test -f 'lib/isnanl.c'; then $(CYGPATH_W) 'lib/isnanl.c'; else $(CYGPATH_W) '$(srcdir)/lib/isnanl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-isnanl.Tpo lib/$(DEPDIR)/libgnu_a-isnanl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/isnanl.c' object='lib/libgnu_a-isnanl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-isnanl.obj `if test -f 'lib/isnanl.c'; then $(CYGPATH_W) 'lib/isnanl.c'; else $(CYGPATH_W) '$(srcdir)/lib/isnanl.c'; fi`
+
+lib/libgnu_a-snprintf.o: lib/snprintf.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-snprintf.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-snprintf.Tpo -c -o lib/libgnu_a-snprintf.o `test -f 'lib/snprintf.c' || echo '$(srcdir)/'`lib/snprintf.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-snprintf.Tpo lib/$(DEPDIR)/libgnu_a-snprintf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/snprintf.c' object='lib/libgnu_a-snprintf.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-snprintf.o `test -f 'lib/snprintf.c' || echo '$(srcdir)/'`lib/snprintf.c
+
+lib/libgnu_a-snprintf.obj: lib/snprintf.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-snprintf.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-snprintf.Tpo -c -o lib/libgnu_a-snprintf.obj `if test -f 'lib/snprintf.c'; then $(CYGPATH_W) 'lib/snprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/snprintf.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-snprintf.Tpo lib/$(DEPDIR)/libgnu_a-snprintf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/snprintf.c' object='lib/libgnu_a-snprintf.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-snprintf.obj `if test -f 'lib/snprintf.c'; then $(CYGPATH_W) 'lib/snprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/snprintf.c'; fi`
+
+lib/libgnu_a-asnprintf.o: lib/asnprintf.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-asnprintf.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-asnprintf.Tpo -c -o lib/libgnu_a-asnprintf.o `test -f 'lib/asnprintf.c' || echo '$(srcdir)/'`lib/asnprintf.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-asnprintf.Tpo lib/$(DEPDIR)/libgnu_a-asnprintf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/asnprintf.c' object='lib/libgnu_a-asnprintf.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-asnprintf.o `test -f 'lib/asnprintf.c' || echo '$(srcdir)/'`lib/asnprintf.c
+
+lib/libgnu_a-asnprintf.obj: lib/asnprintf.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-asnprintf.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-asnprintf.Tpo -c -o lib/libgnu_a-asnprintf.obj `if test -f 'lib/asnprintf.c'; then $(CYGPATH_W) 'lib/asnprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/asnprintf.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-asnprintf.Tpo lib/$(DEPDIR)/libgnu_a-asnprintf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/asnprintf.c' object='lib/libgnu_a-asnprintf.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-asnprintf.obj `if test -f 'lib/asnprintf.c'; then $(CYGPATH_W) 'lib/asnprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/asnprintf.c'; fi`
+
+lib/libgnu_a-printf-args.o: lib/printf-args.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-printf-args.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-printf-args.Tpo -c -o lib/libgnu_a-printf-args.o `test -f 'lib/printf-args.c' || echo '$(srcdir)/'`lib/printf-args.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-printf-args.Tpo lib/$(DEPDIR)/libgnu_a-printf-args.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/printf-args.c' object='lib/libgnu_a-printf-args.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-printf-args.o `test -f 'lib/printf-args.c' || echo '$(srcdir)/'`lib/printf-args.c
+
+lib/libgnu_a-printf-args.obj: lib/printf-args.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-printf-args.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-printf-args.Tpo -c -o lib/libgnu_a-printf-args.obj `if test -f 'lib/printf-args.c'; then $(CYGPATH_W) 'lib/printf-args.c'; else $(CYGPATH_W) '$(srcdir)/lib/printf-args.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-printf-args.Tpo lib/$(DEPDIR)/libgnu_a-printf-args.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/printf-args.c' object='lib/libgnu_a-printf-args.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-printf-args.obj `if test -f 'lib/printf-args.c'; then $(CYGPATH_W) 'lib/printf-args.c'; else $(CYGPATH_W) '$(srcdir)/lib/printf-args.c'; fi`
+
+lib/libgnu_a-printf-parse.o: lib/printf-parse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-printf-parse.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-printf-parse.Tpo -c -o lib/libgnu_a-printf-parse.o `test -f 'lib/printf-parse.c' || echo '$(srcdir)/'`lib/printf-parse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-printf-parse.Tpo lib/$(DEPDIR)/libgnu_a-printf-parse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/printf-parse.c' object='lib/libgnu_a-printf-parse.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-printf-parse.o `test -f 'lib/printf-parse.c' || echo '$(srcdir)/'`lib/printf-parse.c
+
+lib/libgnu_a-printf-parse.obj: lib/printf-parse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-printf-parse.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-printf-parse.Tpo -c -o lib/libgnu_a-printf-parse.obj `if test -f 'lib/printf-parse.c'; then $(CYGPATH_W) 'lib/printf-parse.c'; else $(CYGPATH_W) '$(srcdir)/lib/printf-parse.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-printf-parse.Tpo lib/$(DEPDIR)/libgnu_a-printf-parse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/printf-parse.c' object='lib/libgnu_a-printf-parse.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-printf-parse.obj `if test -f 'lib/printf-parse.c'; then $(CYGPATH_W) 'lib/printf-parse.c'; else $(CYGPATH_W) '$(srcdir)/lib/printf-parse.c'; fi`
+
+lib/libgnu_a-vasnprintf.o: lib/vasnprintf.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-vasnprintf.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-vasnprintf.Tpo -c -o lib/libgnu_a-vasnprintf.o `test -f 'lib/vasnprintf.c' || echo '$(srcdir)/'`lib/vasnprintf.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-vasnprintf.Tpo lib/$(DEPDIR)/libgnu_a-vasnprintf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/vasnprintf.c' object='lib/libgnu_a-vasnprintf.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-vasnprintf.o `test -f 'lib/vasnprintf.c' || echo '$(srcdir)/'`lib/vasnprintf.c
+
+lib/libgnu_a-vasnprintf.obj: lib/vasnprintf.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-vasnprintf.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-vasnprintf.Tpo -c -o lib/libgnu_a-vasnprintf.obj `if test -f 'lib/vasnprintf.c'; then $(CYGPATH_W) 'lib/vasnprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/vasnprintf.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-vasnprintf.Tpo lib/$(DEPDIR)/libgnu_a-vasnprintf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/vasnprintf.c' object='lib/libgnu_a-vasnprintf.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-vasnprintf.obj `if test -f 'lib/vasnprintf.c'; then $(CYGPATH_W) 'lib/vasnprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/vasnprintf.c'; fi`
+
+lib/libgnu_a-vsnprintf.o: lib/vsnprintf.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-vsnprintf.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-vsnprintf.Tpo -c -o lib/libgnu_a-vsnprintf.o `test -f 'lib/vsnprintf.c' || echo '$(srcdir)/'`lib/vsnprintf.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-vsnprintf.Tpo lib/$(DEPDIR)/libgnu_a-vsnprintf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/vsnprintf.c' object='lib/libgnu_a-vsnprintf.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-vsnprintf.o `test -f 'lib/vsnprintf.c' || echo '$(srcdir)/'`lib/vsnprintf.c
+
+lib/libgnu_a-vsnprintf.obj: lib/vsnprintf.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-vsnprintf.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-vsnprintf.Tpo -c -o lib/libgnu_a-vsnprintf.obj `if test -f 'lib/vsnprintf.c'; then $(CYGPATH_W) 'lib/vsnprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/vsnprintf.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-vsnprintf.Tpo lib/$(DEPDIR)/libgnu_a-vsnprintf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/vsnprintf.c' object='lib/libgnu_a-vsnprintf.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-vsnprintf.obj `if test -f 'lib/vsnprintf.c'; then $(CYGPATH_W) 'lib/vsnprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/vsnprintf.c'; fi`
+
+src/libs/libgroff/libgroff_a-getopt.o: src/libs/libgroff/getopt.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-getopt.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Tpo -c -o src/libs/libgroff/libgroff_a-getopt.o `test -f 'src/libs/libgroff/getopt.c' || echo '$(srcdir)/'`src/libs/libgroff/getopt.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/getopt.c' object='src/libs/libgroff/libgroff_a-getopt.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-getopt.o `test -f 'src/libs/libgroff/getopt.c' || echo '$(srcdir)/'`src/libs/libgroff/getopt.c
+
+src/libs/libgroff/libgroff_a-getopt.obj: src/libs/libgroff/getopt.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-getopt.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Tpo -c -o src/libs/libgroff/libgroff_a-getopt.obj `if test -f 'src/libs/libgroff/getopt.c'; then $(CYGPATH_W) 'src/libs/libgroff/getopt.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/getopt.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/getopt.c' object='src/libs/libgroff/libgroff_a-getopt.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-getopt.obj `if test -f 'src/libs/libgroff/getopt.c'; then $(CYGPATH_W) 'src/libs/libgroff/getopt.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/getopt.c'; fi`
+
+src/libs/libgroff/libgroff_a-getopt1.o: src/libs/libgroff/getopt1.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-getopt1.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt1.Tpo -c -o src/libs/libgroff/libgroff_a-getopt1.o `test -f 'src/libs/libgroff/getopt1.c' || echo '$(srcdir)/'`src/libs/libgroff/getopt1.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt1.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt1.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/getopt1.c' object='src/libs/libgroff/libgroff_a-getopt1.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-getopt1.o `test -f 'src/libs/libgroff/getopt1.c' || echo '$(srcdir)/'`src/libs/libgroff/getopt1.c
+
+src/libs/libgroff/libgroff_a-getopt1.obj: src/libs/libgroff/getopt1.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-getopt1.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt1.Tpo -c -o src/libs/libgroff/libgroff_a-getopt1.obj `if test -f 'src/libs/libgroff/getopt1.c'; then $(CYGPATH_W) 'src/libs/libgroff/getopt1.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/getopt1.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt1.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt1.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/getopt1.c' object='src/libs/libgroff/libgroff_a-getopt1.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-getopt1.obj `if test -f 'src/libs/libgroff/getopt1.c'; then $(CYGPATH_W) 'src/libs/libgroff/getopt1.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/getopt1.c'; fi`
+
+src/libs/libgroff/libgroff_a-iftoa.o: src/libs/libgroff/iftoa.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-iftoa.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-iftoa.Tpo -c -o src/libs/libgroff/libgroff_a-iftoa.o `test -f 'src/libs/libgroff/iftoa.c' || echo '$(srcdir)/'`src/libs/libgroff/iftoa.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-iftoa.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-iftoa.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/iftoa.c' object='src/libs/libgroff/libgroff_a-iftoa.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-iftoa.o `test -f 'src/libs/libgroff/iftoa.c' || echo '$(srcdir)/'`src/libs/libgroff/iftoa.c
+
+src/libs/libgroff/libgroff_a-iftoa.obj: src/libs/libgroff/iftoa.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-iftoa.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-iftoa.Tpo -c -o src/libs/libgroff/libgroff_a-iftoa.obj `if test -f 'src/libs/libgroff/iftoa.c'; then $(CYGPATH_W) 'src/libs/libgroff/iftoa.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/iftoa.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-iftoa.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-iftoa.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/iftoa.c' object='src/libs/libgroff/libgroff_a-iftoa.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-iftoa.obj `if test -f 'src/libs/libgroff/iftoa.c'; then $(CYGPATH_W) 'src/libs/libgroff/iftoa.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/iftoa.c'; fi`
+
+src/libs/libgroff/libgroff_a-itoa.o: src/libs/libgroff/itoa.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-itoa.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-itoa.Tpo -c -o src/libs/libgroff/libgroff_a-itoa.o `test -f 'src/libs/libgroff/itoa.c' || echo '$(srcdir)/'`src/libs/libgroff/itoa.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-itoa.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-itoa.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/itoa.c' object='src/libs/libgroff/libgroff_a-itoa.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-itoa.o `test -f 'src/libs/libgroff/itoa.c' || echo '$(srcdir)/'`src/libs/libgroff/itoa.c
+
+src/libs/libgroff/libgroff_a-itoa.obj: src/libs/libgroff/itoa.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-itoa.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-itoa.Tpo -c -o src/libs/libgroff/libgroff_a-itoa.obj `if test -f 'src/libs/libgroff/itoa.c'; then $(CYGPATH_W) 'src/libs/libgroff/itoa.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/itoa.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-itoa.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-itoa.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/itoa.c' object='src/libs/libgroff/libgroff_a-itoa.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-itoa.obj `if test -f 'src/libs/libgroff/itoa.c'; then $(CYGPATH_W) 'src/libs/libgroff/itoa.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/itoa.c'; fi`
+
+src/libs/libgroff/libgroff_a-localcharset.o: src/libs/libgroff/localcharset.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-localcharset.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-localcharset.Tpo -c -o src/libs/libgroff/libgroff_a-localcharset.o `test -f 'src/libs/libgroff/localcharset.c' || echo '$(srcdir)/'`src/libs/libgroff/localcharset.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-localcharset.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-localcharset.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/localcharset.c' object='src/libs/libgroff/libgroff_a-localcharset.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-localcharset.o `test -f 'src/libs/libgroff/localcharset.c' || echo '$(srcdir)/'`src/libs/libgroff/localcharset.c
+
+src/libs/libgroff/libgroff_a-localcharset.obj: src/libs/libgroff/localcharset.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-localcharset.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-localcharset.Tpo -c -o src/libs/libgroff/libgroff_a-localcharset.obj `if test -f 'src/libs/libgroff/localcharset.c'; then $(CYGPATH_W) 'src/libs/libgroff/localcharset.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/localcharset.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-localcharset.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-localcharset.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/localcharset.c' object='src/libs/libgroff/libgroff_a-localcharset.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-localcharset.obj `if test -f 'src/libs/libgroff/localcharset.c'; then $(CYGPATH_W) 'src/libs/libgroff/localcharset.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/localcharset.c'; fi`
+
+src/libs/libgroff/libgroff_a-matherr.o: src/libs/libgroff/matherr.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-matherr.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-matherr.Tpo -c -o src/libs/libgroff/libgroff_a-matherr.o `test -f 'src/libs/libgroff/matherr.c' || echo '$(srcdir)/'`src/libs/libgroff/matherr.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-matherr.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-matherr.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/matherr.c' object='src/libs/libgroff/libgroff_a-matherr.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-matherr.o `test -f 'src/libs/libgroff/matherr.c' || echo '$(srcdir)/'`src/libs/libgroff/matherr.c
+
+src/libs/libgroff/libgroff_a-matherr.obj: src/libs/libgroff/matherr.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-matherr.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-matherr.Tpo -c -o src/libs/libgroff/libgroff_a-matherr.obj `if test -f 'src/libs/libgroff/matherr.c'; then $(CYGPATH_W) 'src/libs/libgroff/matherr.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/matherr.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-matherr.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-matherr.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/matherr.c' object='src/libs/libgroff/libgroff_a-matherr.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-matherr.obj `if test -f 'src/libs/libgroff/matherr.c'; then $(CYGPATH_W) 'src/libs/libgroff/matherr.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/matherr.c'; fi`
+
+src/libs/libgroff/libgroff_a-progname.o: src/libs/libgroff/progname.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-progname.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-progname.Tpo -c -o src/libs/libgroff/libgroff_a-progname.o `test -f 'src/libs/libgroff/progname.c' || echo '$(srcdir)/'`src/libs/libgroff/progname.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-progname.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-progname.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/progname.c' object='src/libs/libgroff/libgroff_a-progname.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-progname.o `test -f 'src/libs/libgroff/progname.c' || echo '$(srcdir)/'`src/libs/libgroff/progname.c
+
+src/libs/libgroff/libgroff_a-progname.obj: src/libs/libgroff/progname.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-progname.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-progname.Tpo -c -o src/libs/libgroff/libgroff_a-progname.obj `if test -f 'src/libs/libgroff/progname.c'; then $(CYGPATH_W) 'src/libs/libgroff/progname.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/progname.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-progname.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-progname.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/progname.c' object='src/libs/libgroff/libgroff_a-progname.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-progname.obj `if test -f 'src/libs/libgroff/progname.c'; then $(CYGPATH_W) 'src/libs/libgroff/progname.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/progname.c'; fi`
+
+src/libs/libgroff/libgroff_a-quotearg.o: src/libs/libgroff/quotearg.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-quotearg.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-quotearg.Tpo -c -o src/libs/libgroff/libgroff_a-quotearg.o `test -f 'src/libs/libgroff/quotearg.c' || echo '$(srcdir)/'`src/libs/libgroff/quotearg.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-quotearg.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-quotearg.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/quotearg.c' object='src/libs/libgroff/libgroff_a-quotearg.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-quotearg.o `test -f 'src/libs/libgroff/quotearg.c' || echo '$(srcdir)/'`src/libs/libgroff/quotearg.c
+
+src/libs/libgroff/libgroff_a-quotearg.obj: src/libs/libgroff/quotearg.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-quotearg.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-quotearg.Tpo -c -o src/libs/libgroff/libgroff_a-quotearg.obj `if test -f 'src/libs/libgroff/quotearg.c'; then $(CYGPATH_W) 'src/libs/libgroff/quotearg.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/quotearg.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-quotearg.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-quotearg.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/quotearg.c' object='src/libs/libgroff/libgroff_a-quotearg.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-quotearg.obj `if test -f 'src/libs/libgroff/quotearg.c'; then $(CYGPATH_W) 'src/libs/libgroff/quotearg.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/quotearg.c'; fi`
+
+src/libs/libgroff/libgroff_a-spawnvp.o: src/libs/libgroff/spawnvp.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-spawnvp.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-spawnvp.Tpo -c -o src/libs/libgroff/libgroff_a-spawnvp.o `test -f 'src/libs/libgroff/spawnvp.c' || echo '$(srcdir)/'`src/libs/libgroff/spawnvp.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-spawnvp.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-spawnvp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/spawnvp.c' object='src/libs/libgroff/libgroff_a-spawnvp.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-spawnvp.o `test -f 'src/libs/libgroff/spawnvp.c' || echo '$(srcdir)/'`src/libs/libgroff/spawnvp.c
+
+src/libs/libgroff/libgroff_a-spawnvp.obj: src/libs/libgroff/spawnvp.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-spawnvp.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-spawnvp.Tpo -c -o src/libs/libgroff/libgroff_a-spawnvp.obj `if test -f 'src/libs/libgroff/spawnvp.c'; then $(CYGPATH_W) 'src/libs/libgroff/spawnvp.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/spawnvp.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-spawnvp.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-spawnvp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/spawnvp.c' object='src/libs/libgroff/libgroff_a-spawnvp.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-spawnvp.obj `if test -f 'src/libs/libgroff/spawnvp.c'; then $(CYGPATH_W) 'src/libs/libgroff/spawnvp.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/spawnvp.c'; fi`
+
+src/libs/libxutil/libxutil_a-DviChar.o: src/libs/libxutil/DviChar.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libxutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libxutil/libxutil_a-DviChar.o -MD -MP -MF src/libs/libxutil/$(DEPDIR)/libxutil_a-DviChar.Tpo -c -o src/libs/libxutil/libxutil_a-DviChar.o `test -f 'src/libs/libxutil/DviChar.c' || echo '$(srcdir)/'`src/libs/libxutil/DviChar.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libxutil/$(DEPDIR)/libxutil_a-DviChar.Tpo src/libs/libxutil/$(DEPDIR)/libxutil_a-DviChar.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libxutil/DviChar.c' object='src/libs/libxutil/libxutil_a-DviChar.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libxutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libxutil/libxutil_a-DviChar.o `test -f 'src/libs/libxutil/DviChar.c' || echo '$(srcdir)/'`src/libs/libxutil/DviChar.c
+
+src/libs/libxutil/libxutil_a-DviChar.obj: src/libs/libxutil/DviChar.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libxutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libxutil/libxutil_a-DviChar.obj -MD -MP -MF src/libs/libxutil/$(DEPDIR)/libxutil_a-DviChar.Tpo -c -o src/libs/libxutil/libxutil_a-DviChar.obj `if test -f 'src/libs/libxutil/DviChar.c'; then $(CYGPATH_W) 'src/libs/libxutil/DviChar.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libxutil/DviChar.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libxutil/$(DEPDIR)/libxutil_a-DviChar.Tpo src/libs/libxutil/$(DEPDIR)/libxutil_a-DviChar.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libxutil/DviChar.c' object='src/libs/libxutil/libxutil_a-DviChar.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libxutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libxutil/libxutil_a-DviChar.obj `if test -f 'src/libs/libxutil/DviChar.c'; then $(CYGPATH_W) 'src/libs/libxutil/DviChar.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libxutil/DviChar.c'; fi`
+
+src/libs/libxutil/libxutil_a-XFontName.o: src/libs/libxutil/XFontName.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libxutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libxutil/libxutil_a-XFontName.o -MD -MP -MF src/libs/libxutil/$(DEPDIR)/libxutil_a-XFontName.Tpo -c -o src/libs/libxutil/libxutil_a-XFontName.o `test -f 'src/libs/libxutil/XFontName.c' || echo '$(srcdir)/'`src/libs/libxutil/XFontName.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libxutil/$(DEPDIR)/libxutil_a-XFontName.Tpo src/libs/libxutil/$(DEPDIR)/libxutil_a-XFontName.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libxutil/XFontName.c' object='src/libs/libxutil/libxutil_a-XFontName.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libxutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libxutil/libxutil_a-XFontName.o `test -f 'src/libs/libxutil/XFontName.c' || echo '$(srcdir)/'`src/libs/libxutil/XFontName.c
+
+src/libs/libxutil/libxutil_a-XFontName.obj: src/libs/libxutil/XFontName.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libxutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libxutil/libxutil_a-XFontName.obj -MD -MP -MF src/libs/libxutil/$(DEPDIR)/libxutil_a-XFontName.Tpo -c -o src/libs/libxutil/libxutil_a-XFontName.obj `if test -f 'src/libs/libxutil/XFontName.c'; then $(CYGPATH_W) 'src/libs/libxutil/XFontName.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libxutil/XFontName.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libxutil/$(DEPDIR)/libxutil_a-XFontName.Tpo src/libs/libxutil/$(DEPDIR)/libxutil_a-XFontName.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libxutil/XFontName.c' object='src/libs/libxutil/libxutil_a-XFontName.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libxutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libxutil/libxutil_a-XFontName.obj `if test -f 'src/libs/libxutil/XFontName.c'; then $(CYGPATH_W) 'src/libs/libxutil/XFontName.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libxutil/XFontName.c'; fi`
+
+src/libs/libxutil/libxutil_a-xmalloc.o: src/libs/libxutil/xmalloc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libxutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libxutil/libxutil_a-xmalloc.o -MD -MP -MF src/libs/libxutil/$(DEPDIR)/libxutil_a-xmalloc.Tpo -c -o src/libs/libxutil/libxutil_a-xmalloc.o `test -f 'src/libs/libxutil/xmalloc.c' || echo '$(srcdir)/'`src/libs/libxutil/xmalloc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libxutil/$(DEPDIR)/libxutil_a-xmalloc.Tpo src/libs/libxutil/$(DEPDIR)/libxutil_a-xmalloc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libxutil/xmalloc.c' object='src/libs/libxutil/libxutil_a-xmalloc.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libxutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libxutil/libxutil_a-xmalloc.o `test -f 'src/libs/libxutil/xmalloc.c' || echo '$(srcdir)/'`src/libs/libxutil/xmalloc.c
+
+src/libs/libxutil/libxutil_a-xmalloc.obj: src/libs/libxutil/xmalloc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libxutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libxutil/libxutil_a-xmalloc.obj -MD -MP -MF src/libs/libxutil/$(DEPDIR)/libxutil_a-xmalloc.Tpo -c -o src/libs/libxutil/libxutil_a-xmalloc.obj `if test -f 'src/libs/libxutil/xmalloc.c'; then $(CYGPATH_W) 'src/libs/libxutil/xmalloc.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libxutil/xmalloc.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libxutil/$(DEPDIR)/libxutil_a-xmalloc.Tpo src/libs/libxutil/$(DEPDIR)/libxutil_a-xmalloc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libxutil/xmalloc.c' object='src/libs/libxutil/libxutil_a-xmalloc.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libxutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libxutil/libxutil_a-xmalloc.obj `if test -f 'src/libs/libxutil/xmalloc.c'; then $(CYGPATH_W) 'src/libs/libxutil/xmalloc.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libxutil/xmalloc.c'; fi`
+
+src/devices/xditview/gxditview-device.o: src/devices/xditview/device.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/devices/xditview/gxditview-device.o -MD -MP -MF src/devices/xditview/$(DEPDIR)/gxditview-device.Tpo -c -o src/devices/xditview/gxditview-device.o `test -f 'src/devices/xditview/device.c' || echo '$(srcdir)/'`src/devices/xditview/device.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/devices/xditview/$(DEPDIR)/gxditview-device.Tpo src/devices/xditview/$(DEPDIR)/gxditview-device.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/devices/xditview/device.c' object='src/devices/xditview/gxditview-device.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/devices/xditview/gxditview-device.o `test -f 'src/devices/xditview/device.c' || echo '$(srcdir)/'`src/devices/xditview/device.c
+
+src/devices/xditview/gxditview-device.obj: src/devices/xditview/device.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/devices/xditview/gxditview-device.obj -MD -MP -MF src/devices/xditview/$(DEPDIR)/gxditview-device.Tpo -c -o src/devices/xditview/gxditview-device.obj `if test -f 'src/devices/xditview/device.c'; then $(CYGPATH_W) 'src/devices/xditview/device.c'; else $(CYGPATH_W) '$(srcdir)/src/devices/xditview/device.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/devices/xditview/$(DEPDIR)/gxditview-device.Tpo src/devices/xditview/$(DEPDIR)/gxditview-device.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/devices/xditview/device.c' object='src/devices/xditview/gxditview-device.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/devices/xditview/gxditview-device.obj `if test -f 'src/devices/xditview/device.c'; then $(CYGPATH_W) 'src/devices/xditview/device.c'; else $(CYGPATH_W) '$(srcdir)/src/devices/xditview/device.c'; fi`
+
+src/devices/xditview/gxditview-draw.o: src/devices/xditview/draw.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/devices/xditview/gxditview-draw.o -MD -MP -MF src/devices/xditview/$(DEPDIR)/gxditview-draw.Tpo -c -o src/devices/xditview/gxditview-draw.o `test -f 'src/devices/xditview/draw.c' || echo '$(srcdir)/'`src/devices/xditview/draw.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/devices/xditview/$(DEPDIR)/gxditview-draw.Tpo src/devices/xditview/$(DEPDIR)/gxditview-draw.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/devices/xditview/draw.c' object='src/devices/xditview/gxditview-draw.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/devices/xditview/gxditview-draw.o `test -f 'src/devices/xditview/draw.c' || echo '$(srcdir)/'`src/devices/xditview/draw.c
+
+src/devices/xditview/gxditview-draw.obj: src/devices/xditview/draw.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/devices/xditview/gxditview-draw.obj -MD -MP -MF src/devices/xditview/$(DEPDIR)/gxditview-draw.Tpo -c -o src/devices/xditview/gxditview-draw.obj `if test -f 'src/devices/xditview/draw.c'; then $(CYGPATH_W) 'src/devices/xditview/draw.c'; else $(CYGPATH_W) '$(srcdir)/src/devices/xditview/draw.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/devices/xditview/$(DEPDIR)/gxditview-draw.Tpo src/devices/xditview/$(DEPDIR)/gxditview-draw.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/devices/xditview/draw.c' object='src/devices/xditview/gxditview-draw.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/devices/xditview/gxditview-draw.obj `if test -f 'src/devices/xditview/draw.c'; then $(CYGPATH_W) 'src/devices/xditview/draw.c'; else $(CYGPATH_W) '$(srcdir)/src/devices/xditview/draw.c'; fi`
+
+src/devices/xditview/gxditview-Dvi.o: src/devices/xditview/Dvi.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/devices/xditview/gxditview-Dvi.o -MD -MP -MF src/devices/xditview/$(DEPDIR)/gxditview-Dvi.Tpo -c -o src/devices/xditview/gxditview-Dvi.o `test -f 'src/devices/xditview/Dvi.c' || echo '$(srcdir)/'`src/devices/xditview/Dvi.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/devices/xditview/$(DEPDIR)/gxditview-Dvi.Tpo src/devices/xditview/$(DEPDIR)/gxditview-Dvi.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/devices/xditview/Dvi.c' object='src/devices/xditview/gxditview-Dvi.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/devices/xditview/gxditview-Dvi.o `test -f 'src/devices/xditview/Dvi.c' || echo '$(srcdir)/'`src/devices/xditview/Dvi.c
+
+src/devices/xditview/gxditview-Dvi.obj: src/devices/xditview/Dvi.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/devices/xditview/gxditview-Dvi.obj -MD -MP -MF src/devices/xditview/$(DEPDIR)/gxditview-Dvi.Tpo -c -o src/devices/xditview/gxditview-Dvi.obj `if test -f 'src/devices/xditview/Dvi.c'; then $(CYGPATH_W) 'src/devices/xditview/Dvi.c'; else $(CYGPATH_W) '$(srcdir)/src/devices/xditview/Dvi.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/devices/xditview/$(DEPDIR)/gxditview-Dvi.Tpo src/devices/xditview/$(DEPDIR)/gxditview-Dvi.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/devices/xditview/Dvi.c' object='src/devices/xditview/gxditview-Dvi.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/devices/xditview/gxditview-Dvi.obj `if test -f 'src/devices/xditview/Dvi.c'; then $(CYGPATH_W) 'src/devices/xditview/Dvi.c'; else $(CYGPATH_W) '$(srcdir)/src/devices/xditview/Dvi.c'; fi`
+
+src/devices/xditview/gxditview-font.o: src/devices/xditview/font.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/devices/xditview/gxditview-font.o -MD -MP -MF src/devices/xditview/$(DEPDIR)/gxditview-font.Tpo -c -o src/devices/xditview/gxditview-font.o `test -f 'src/devices/xditview/font.c' || echo '$(srcdir)/'`src/devices/xditview/font.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/devices/xditview/$(DEPDIR)/gxditview-font.Tpo src/devices/xditview/$(DEPDIR)/gxditview-font.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/devices/xditview/font.c' object='src/devices/xditview/gxditview-font.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/devices/xditview/gxditview-font.o `test -f 'src/devices/xditview/font.c' || echo '$(srcdir)/'`src/devices/xditview/font.c
+
+src/devices/xditview/gxditview-font.obj: src/devices/xditview/font.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/devices/xditview/gxditview-font.obj -MD -MP -MF src/devices/xditview/$(DEPDIR)/gxditview-font.Tpo -c -o src/devices/xditview/gxditview-font.obj `if test -f 'src/devices/xditview/font.c'; then $(CYGPATH_W) 'src/devices/xditview/font.c'; else $(CYGPATH_W) '$(srcdir)/src/devices/xditview/font.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/devices/xditview/$(DEPDIR)/gxditview-font.Tpo src/devices/xditview/$(DEPDIR)/gxditview-font.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/devices/xditview/font.c' object='src/devices/xditview/gxditview-font.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/devices/xditview/gxditview-font.obj `if test -f 'src/devices/xditview/font.c'; then $(CYGPATH_W) 'src/devices/xditview/font.c'; else $(CYGPATH_W) '$(srcdir)/src/devices/xditview/font.c'; fi`
+
+src/devices/xditview/gxditview-lex.o: src/devices/xditview/lex.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/devices/xditview/gxditview-lex.o -MD -MP -MF src/devices/xditview/$(DEPDIR)/gxditview-lex.Tpo -c -o src/devices/xditview/gxditview-lex.o `test -f 'src/devices/xditview/lex.c' || echo '$(srcdir)/'`src/devices/xditview/lex.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/devices/xditview/$(DEPDIR)/gxditview-lex.Tpo src/devices/xditview/$(DEPDIR)/gxditview-lex.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/devices/xditview/lex.c' object='src/devices/xditview/gxditview-lex.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/devices/xditview/gxditview-lex.o `test -f 'src/devices/xditview/lex.c' || echo '$(srcdir)/'`src/devices/xditview/lex.c
+
+src/devices/xditview/gxditview-lex.obj: src/devices/xditview/lex.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/devices/xditview/gxditview-lex.obj -MD -MP -MF src/devices/xditview/$(DEPDIR)/gxditview-lex.Tpo -c -o src/devices/xditview/gxditview-lex.obj `if test -f 'src/devices/xditview/lex.c'; then $(CYGPATH_W) 'src/devices/xditview/lex.c'; else $(CYGPATH_W) '$(srcdir)/src/devices/xditview/lex.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/devices/xditview/$(DEPDIR)/gxditview-lex.Tpo src/devices/xditview/$(DEPDIR)/gxditview-lex.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/devices/xditview/lex.c' object='src/devices/xditview/gxditview-lex.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/devices/xditview/gxditview-lex.obj `if test -f 'src/devices/xditview/lex.c'; then $(CYGPATH_W) 'src/devices/xditview/lex.c'; else $(CYGPATH_W) '$(srcdir)/src/devices/xditview/lex.c'; fi`
+
+src/devices/xditview/gxditview-page.o: src/devices/xditview/page.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/devices/xditview/gxditview-page.o -MD -MP -MF src/devices/xditview/$(DEPDIR)/gxditview-page.Tpo -c -o src/devices/xditview/gxditview-page.o `test -f 'src/devices/xditview/page.c' || echo '$(srcdir)/'`src/devices/xditview/page.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/devices/xditview/$(DEPDIR)/gxditview-page.Tpo src/devices/xditview/$(DEPDIR)/gxditview-page.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/devices/xditview/page.c' object='src/devices/xditview/gxditview-page.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/devices/xditview/gxditview-page.o `test -f 'src/devices/xditview/page.c' || echo '$(srcdir)/'`src/devices/xditview/page.c
+
+src/devices/xditview/gxditview-page.obj: src/devices/xditview/page.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/devices/xditview/gxditview-page.obj -MD -MP -MF src/devices/xditview/$(DEPDIR)/gxditview-page.Tpo -c -o src/devices/xditview/gxditview-page.obj `if test -f 'src/devices/xditview/page.c'; then $(CYGPATH_W) 'src/devices/xditview/page.c'; else $(CYGPATH_W) '$(srcdir)/src/devices/xditview/page.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/devices/xditview/$(DEPDIR)/gxditview-page.Tpo src/devices/xditview/$(DEPDIR)/gxditview-page.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/devices/xditview/page.c' object='src/devices/xditview/gxditview-page.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/devices/xditview/gxditview-page.obj `if test -f 'src/devices/xditview/page.c'; then $(CYGPATH_W) 'src/devices/xditview/page.c'; else $(CYGPATH_W) '$(srcdir)/src/devices/xditview/page.c'; fi`
+
+src/devices/xditview/gxditview-parse.o: src/devices/xditview/parse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/devices/xditview/gxditview-parse.o -MD -MP -MF src/devices/xditview/$(DEPDIR)/gxditview-parse.Tpo -c -o src/devices/xditview/gxditview-parse.o `test -f 'src/devices/xditview/parse.c' || echo '$(srcdir)/'`src/devices/xditview/parse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/devices/xditview/$(DEPDIR)/gxditview-parse.Tpo src/devices/xditview/$(DEPDIR)/gxditview-parse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/devices/xditview/parse.c' object='src/devices/xditview/gxditview-parse.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/devices/xditview/gxditview-parse.o `test -f 'src/devices/xditview/parse.c' || echo '$(srcdir)/'`src/devices/xditview/parse.c
+
+src/devices/xditview/gxditview-parse.obj: src/devices/xditview/parse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/devices/xditview/gxditview-parse.obj -MD -MP -MF src/devices/xditview/$(DEPDIR)/gxditview-parse.Tpo -c -o src/devices/xditview/gxditview-parse.obj `if test -f 'src/devices/xditview/parse.c'; then $(CYGPATH_W) 'src/devices/xditview/parse.c'; else $(CYGPATH_W) '$(srcdir)/src/devices/xditview/parse.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/devices/xditview/$(DEPDIR)/gxditview-parse.Tpo src/devices/xditview/$(DEPDIR)/gxditview-parse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/devices/xditview/parse.c' object='src/devices/xditview/gxditview-parse.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/devices/xditview/gxditview-parse.obj `if test -f 'src/devices/xditview/parse.c'; then $(CYGPATH_W) 'src/devices/xditview/parse.c'; else $(CYGPATH_W) '$(srcdir)/src/devices/xditview/parse.c'; fi`
+
+src/devices/xditview/gxditview-xditview.o: src/devices/xditview/xditview.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/devices/xditview/gxditview-xditview.o -MD -MP -MF src/devices/xditview/$(DEPDIR)/gxditview-xditview.Tpo -c -o src/devices/xditview/gxditview-xditview.o `test -f 'src/devices/xditview/xditview.c' || echo '$(srcdir)/'`src/devices/xditview/xditview.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/devices/xditview/$(DEPDIR)/gxditview-xditview.Tpo src/devices/xditview/$(DEPDIR)/gxditview-xditview.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/devices/xditview/xditview.c' object='src/devices/xditview/gxditview-xditview.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/devices/xditview/gxditview-xditview.o `test -f 'src/devices/xditview/xditview.c' || echo '$(srcdir)/'`src/devices/xditview/xditview.c
+
+src/devices/xditview/gxditview-xditview.obj: src/devices/xditview/xditview.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/devices/xditview/gxditview-xditview.obj -MD -MP -MF src/devices/xditview/$(DEPDIR)/gxditview-xditview.Tpo -c -o src/devices/xditview/gxditview-xditview.obj `if test -f 'src/devices/xditview/xditview.c'; then $(CYGPATH_W) 'src/devices/xditview/xditview.c'; else $(CYGPATH_W) '$(srcdir)/src/devices/xditview/xditview.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/devices/xditview/$(DEPDIR)/gxditview-xditview.Tpo src/devices/xditview/$(DEPDIR)/gxditview-xditview.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/devices/xditview/xditview.c' object='src/devices/xditview/gxditview-xditview.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gxditview_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/devices/xditview/gxditview-xditview.obj `if test -f 'src/devices/xditview/xditview.c'; then $(CYGPATH_W) 'src/devices/xditview/xditview.c'; else $(CYGPATH_W) '$(srcdir)/src/devices/xditview/xditview.c'; fi`
+
+src/utils/xtotroff/xtotroff-xtotroff.o: src/utils/xtotroff/xtotroff.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xtotroff_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/utils/xtotroff/xtotroff-xtotroff.o -MD -MP -MF src/utils/xtotroff/$(DEPDIR)/xtotroff-xtotroff.Tpo -c -o src/utils/xtotroff/xtotroff-xtotroff.o `test -f 'src/utils/xtotroff/xtotroff.c' || echo '$(srcdir)/'`src/utils/xtotroff/xtotroff.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/utils/xtotroff/$(DEPDIR)/xtotroff-xtotroff.Tpo src/utils/xtotroff/$(DEPDIR)/xtotroff-xtotroff.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/utils/xtotroff/xtotroff.c' object='src/utils/xtotroff/xtotroff-xtotroff.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xtotroff_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/utils/xtotroff/xtotroff-xtotroff.o `test -f 'src/utils/xtotroff/xtotroff.c' || echo '$(srcdir)/'`src/utils/xtotroff/xtotroff.c
+
+src/utils/xtotroff/xtotroff-xtotroff.obj: src/utils/xtotroff/xtotroff.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xtotroff_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/utils/xtotroff/xtotroff-xtotroff.obj -MD -MP -MF src/utils/xtotroff/$(DEPDIR)/xtotroff-xtotroff.Tpo -c -o src/utils/xtotroff/xtotroff-xtotroff.obj `if test -f 'src/utils/xtotroff/xtotroff.c'; then $(CYGPATH_W) 'src/utils/xtotroff/xtotroff.c'; else $(CYGPATH_W) '$(srcdir)/src/utils/xtotroff/xtotroff.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/utils/xtotroff/$(DEPDIR)/xtotroff-xtotroff.Tpo src/utils/xtotroff/$(DEPDIR)/xtotroff-xtotroff.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/utils/xtotroff/xtotroff.c' object='src/utils/xtotroff/xtotroff-xtotroff.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xtotroff_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/utils/xtotroff/xtotroff-xtotroff.obj `if test -f 'src/utils/xtotroff/xtotroff.c'; then $(CYGPATH_W) 'src/utils/xtotroff/xtotroff.c'; else $(CYGPATH_W) '$(srcdir)/src/utils/xtotroff/xtotroff.c'; fi`
+
+.cpp.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+src/libs/libgroff/libgroff_a-assert.o: src/libs/libgroff/assert.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-assert.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-assert.Tpo -c -o src/libs/libgroff/libgroff_a-assert.o `test -f 'src/libs/libgroff/assert.cpp' || echo '$(srcdir)/'`src/libs/libgroff/assert.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-assert.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-assert.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/assert.cpp' object='src/libs/libgroff/libgroff_a-assert.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-assert.o `test -f 'src/libs/libgroff/assert.cpp' || echo '$(srcdir)/'`src/libs/libgroff/assert.cpp
+
+src/libs/libgroff/libgroff_a-assert.obj: src/libs/libgroff/assert.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-assert.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-assert.Tpo -c -o src/libs/libgroff/libgroff_a-assert.obj `if test -f 'src/libs/libgroff/assert.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/assert.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/assert.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-assert.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-assert.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/assert.cpp' object='src/libs/libgroff/libgroff_a-assert.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-assert.obj `if test -f 'src/libs/libgroff/assert.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/assert.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/assert.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-change_lf.o: src/libs/libgroff/change_lf.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-change_lf.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-change_lf.Tpo -c -o src/libs/libgroff/libgroff_a-change_lf.o `test -f 'src/libs/libgroff/change_lf.cpp' || echo '$(srcdir)/'`src/libs/libgroff/change_lf.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-change_lf.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-change_lf.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/change_lf.cpp' object='src/libs/libgroff/libgroff_a-change_lf.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-change_lf.o `test -f 'src/libs/libgroff/change_lf.cpp' || echo '$(srcdir)/'`src/libs/libgroff/change_lf.cpp
+
+src/libs/libgroff/libgroff_a-change_lf.obj: src/libs/libgroff/change_lf.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-change_lf.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-change_lf.Tpo -c -o src/libs/libgroff/libgroff_a-change_lf.obj `if test -f 'src/libs/libgroff/change_lf.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/change_lf.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/change_lf.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-change_lf.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-change_lf.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/change_lf.cpp' object='src/libs/libgroff/libgroff_a-change_lf.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-change_lf.obj `if test -f 'src/libs/libgroff/change_lf.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/change_lf.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/change_lf.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-cmap.o: src/libs/libgroff/cmap.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-cmap.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-cmap.Tpo -c -o src/libs/libgroff/libgroff_a-cmap.o `test -f 'src/libs/libgroff/cmap.cpp' || echo '$(srcdir)/'`src/libs/libgroff/cmap.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-cmap.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-cmap.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/cmap.cpp' object='src/libs/libgroff/libgroff_a-cmap.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-cmap.o `test -f 'src/libs/libgroff/cmap.cpp' || echo '$(srcdir)/'`src/libs/libgroff/cmap.cpp
+
+src/libs/libgroff/libgroff_a-cmap.obj: src/libs/libgroff/cmap.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-cmap.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-cmap.Tpo -c -o src/libs/libgroff/libgroff_a-cmap.obj `if test -f 'src/libs/libgroff/cmap.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/cmap.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/cmap.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-cmap.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-cmap.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/cmap.cpp' object='src/libs/libgroff/libgroff_a-cmap.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-cmap.obj `if test -f 'src/libs/libgroff/cmap.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/cmap.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/cmap.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-color.o: src/libs/libgroff/color.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-color.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-color.Tpo -c -o src/libs/libgroff/libgroff_a-color.o `test -f 'src/libs/libgroff/color.cpp' || echo '$(srcdir)/'`src/libs/libgroff/color.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-color.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-color.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/color.cpp' object='src/libs/libgroff/libgroff_a-color.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-color.o `test -f 'src/libs/libgroff/color.cpp' || echo '$(srcdir)/'`src/libs/libgroff/color.cpp
+
+src/libs/libgroff/libgroff_a-color.obj: src/libs/libgroff/color.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-color.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-color.Tpo -c -o src/libs/libgroff/libgroff_a-color.obj `if test -f 'src/libs/libgroff/color.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/color.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/color.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-color.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-color.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/color.cpp' object='src/libs/libgroff/libgroff_a-color.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-color.obj `if test -f 'src/libs/libgroff/color.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/color.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/color.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-cset.o: src/libs/libgroff/cset.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-cset.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-cset.Tpo -c -o src/libs/libgroff/libgroff_a-cset.o `test -f 'src/libs/libgroff/cset.cpp' || echo '$(srcdir)/'`src/libs/libgroff/cset.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-cset.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-cset.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/cset.cpp' object='src/libs/libgroff/libgroff_a-cset.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-cset.o `test -f 'src/libs/libgroff/cset.cpp' || echo '$(srcdir)/'`src/libs/libgroff/cset.cpp
+
+src/libs/libgroff/libgroff_a-cset.obj: src/libs/libgroff/cset.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-cset.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-cset.Tpo -c -o src/libs/libgroff/libgroff_a-cset.obj `if test -f 'src/libs/libgroff/cset.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/cset.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/cset.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-cset.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-cset.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/cset.cpp' object='src/libs/libgroff/libgroff_a-cset.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-cset.obj `if test -f 'src/libs/libgroff/cset.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/cset.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/cset.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-curtime.o: src/libs/libgroff/curtime.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-curtime.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-curtime.Tpo -c -o src/libs/libgroff/libgroff_a-curtime.o `test -f 'src/libs/libgroff/curtime.cpp' || echo '$(srcdir)/'`src/libs/libgroff/curtime.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-curtime.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-curtime.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/curtime.cpp' object='src/libs/libgroff/libgroff_a-curtime.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-curtime.o `test -f 'src/libs/libgroff/curtime.cpp' || echo '$(srcdir)/'`src/libs/libgroff/curtime.cpp
+
+src/libs/libgroff/libgroff_a-curtime.obj: src/libs/libgroff/curtime.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-curtime.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-curtime.Tpo -c -o src/libs/libgroff/libgroff_a-curtime.obj `if test -f 'src/libs/libgroff/curtime.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/curtime.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/curtime.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-curtime.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-curtime.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/curtime.cpp' object='src/libs/libgroff/libgroff_a-curtime.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-curtime.obj `if test -f 'src/libs/libgroff/curtime.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/curtime.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/curtime.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-device.o: src/libs/libgroff/device.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-device.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-device.Tpo -c -o src/libs/libgroff/libgroff_a-device.o `test -f 'src/libs/libgroff/device.cpp' || echo '$(srcdir)/'`src/libs/libgroff/device.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-device.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-device.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/device.cpp' object='src/libs/libgroff/libgroff_a-device.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-device.o `test -f 'src/libs/libgroff/device.cpp' || echo '$(srcdir)/'`src/libs/libgroff/device.cpp
+
+src/libs/libgroff/libgroff_a-device.obj: src/libs/libgroff/device.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-device.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-device.Tpo -c -o src/libs/libgroff/libgroff_a-device.obj `if test -f 'src/libs/libgroff/device.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/device.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/device.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-device.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-device.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/device.cpp' object='src/libs/libgroff/libgroff_a-device.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-device.obj `if test -f 'src/libs/libgroff/device.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/device.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/device.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-errarg.o: src/libs/libgroff/errarg.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-errarg.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-errarg.Tpo -c -o src/libs/libgroff/libgroff_a-errarg.o `test -f 'src/libs/libgroff/errarg.cpp' || echo '$(srcdir)/'`src/libs/libgroff/errarg.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-errarg.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-errarg.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/errarg.cpp' object='src/libs/libgroff/libgroff_a-errarg.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-errarg.o `test -f 'src/libs/libgroff/errarg.cpp' || echo '$(srcdir)/'`src/libs/libgroff/errarg.cpp
+
+src/libs/libgroff/libgroff_a-errarg.obj: src/libs/libgroff/errarg.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-errarg.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-errarg.Tpo -c -o src/libs/libgroff/libgroff_a-errarg.obj `if test -f 'src/libs/libgroff/errarg.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/errarg.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/errarg.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-errarg.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-errarg.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/errarg.cpp' object='src/libs/libgroff/libgroff_a-errarg.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-errarg.obj `if test -f 'src/libs/libgroff/errarg.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/errarg.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/errarg.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-error.o: src/libs/libgroff/error.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-error.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-error.Tpo -c -o src/libs/libgroff/libgroff_a-error.o `test -f 'src/libs/libgroff/error.cpp' || echo '$(srcdir)/'`src/libs/libgroff/error.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-error.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-error.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/error.cpp' object='src/libs/libgroff/libgroff_a-error.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-error.o `test -f 'src/libs/libgroff/error.cpp' || echo '$(srcdir)/'`src/libs/libgroff/error.cpp
+
+src/libs/libgroff/libgroff_a-error.obj: src/libs/libgroff/error.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-error.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-error.Tpo -c -o src/libs/libgroff/libgroff_a-error.obj `if test -f 'src/libs/libgroff/error.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/error.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/error.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-error.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-error.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/error.cpp' object='src/libs/libgroff/libgroff_a-error.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-error.obj `if test -f 'src/libs/libgroff/error.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/error.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/error.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-fatal.o: src/libs/libgroff/fatal.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-fatal.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-fatal.Tpo -c -o src/libs/libgroff/libgroff_a-fatal.o `test -f 'src/libs/libgroff/fatal.cpp' || echo '$(srcdir)/'`src/libs/libgroff/fatal.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-fatal.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-fatal.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/fatal.cpp' object='src/libs/libgroff/libgroff_a-fatal.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-fatal.o `test -f 'src/libs/libgroff/fatal.cpp' || echo '$(srcdir)/'`src/libs/libgroff/fatal.cpp
+
+src/libs/libgroff/libgroff_a-fatal.obj: src/libs/libgroff/fatal.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-fatal.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-fatal.Tpo -c -o src/libs/libgroff/libgroff_a-fatal.obj `if test -f 'src/libs/libgroff/fatal.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/fatal.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/fatal.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-fatal.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-fatal.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/fatal.cpp' object='src/libs/libgroff/libgroff_a-fatal.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-fatal.obj `if test -f 'src/libs/libgroff/fatal.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/fatal.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/fatal.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-filename.o: src/libs/libgroff/filename.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-filename.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-filename.Tpo -c -o src/libs/libgroff/libgroff_a-filename.o `test -f 'src/libs/libgroff/filename.cpp' || echo '$(srcdir)/'`src/libs/libgroff/filename.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-filename.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-filename.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/filename.cpp' object='src/libs/libgroff/libgroff_a-filename.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-filename.o `test -f 'src/libs/libgroff/filename.cpp' || echo '$(srcdir)/'`src/libs/libgroff/filename.cpp
+
+src/libs/libgroff/libgroff_a-filename.obj: src/libs/libgroff/filename.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-filename.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-filename.Tpo -c -o src/libs/libgroff/libgroff_a-filename.obj `if test -f 'src/libs/libgroff/filename.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/filename.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/filename.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-filename.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-filename.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/filename.cpp' object='src/libs/libgroff/libgroff_a-filename.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-filename.obj `if test -f 'src/libs/libgroff/filename.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/filename.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/filename.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-font.o: src/libs/libgroff/font.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-font.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-font.Tpo -c -o src/libs/libgroff/libgroff_a-font.o `test -f 'src/libs/libgroff/font.cpp' || echo '$(srcdir)/'`src/libs/libgroff/font.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-font.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-font.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/font.cpp' object='src/libs/libgroff/libgroff_a-font.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-font.o `test -f 'src/libs/libgroff/font.cpp' || echo '$(srcdir)/'`src/libs/libgroff/font.cpp
+
+src/libs/libgroff/libgroff_a-font.obj: src/libs/libgroff/font.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-font.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-font.Tpo -c -o src/libs/libgroff/libgroff_a-font.obj `if test -f 'src/libs/libgroff/font.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/font.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/font.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-font.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-font.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/font.cpp' object='src/libs/libgroff/libgroff_a-font.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-font.obj `if test -f 'src/libs/libgroff/font.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/font.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/font.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-fontfile.o: src/libs/libgroff/fontfile.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-fontfile.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-fontfile.Tpo -c -o src/libs/libgroff/libgroff_a-fontfile.o `test -f 'src/libs/libgroff/fontfile.cpp' || echo '$(srcdir)/'`src/libs/libgroff/fontfile.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-fontfile.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-fontfile.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/fontfile.cpp' object='src/libs/libgroff/libgroff_a-fontfile.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-fontfile.o `test -f 'src/libs/libgroff/fontfile.cpp' || echo '$(srcdir)/'`src/libs/libgroff/fontfile.cpp
+
+src/libs/libgroff/libgroff_a-fontfile.obj: src/libs/libgroff/fontfile.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-fontfile.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-fontfile.Tpo -c -o src/libs/libgroff/libgroff_a-fontfile.obj `if test -f 'src/libs/libgroff/fontfile.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/fontfile.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/fontfile.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-fontfile.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-fontfile.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/fontfile.cpp' object='src/libs/libgroff/libgroff_a-fontfile.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-fontfile.obj `if test -f 'src/libs/libgroff/fontfile.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/fontfile.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/fontfile.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-geometry.o: src/libs/libgroff/geometry.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-geometry.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-geometry.Tpo -c -o src/libs/libgroff/libgroff_a-geometry.o `test -f 'src/libs/libgroff/geometry.cpp' || echo '$(srcdir)/'`src/libs/libgroff/geometry.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-geometry.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-geometry.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/geometry.cpp' object='src/libs/libgroff/libgroff_a-geometry.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-geometry.o `test -f 'src/libs/libgroff/geometry.cpp' || echo '$(srcdir)/'`src/libs/libgroff/geometry.cpp
+
+src/libs/libgroff/libgroff_a-geometry.obj: src/libs/libgroff/geometry.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-geometry.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-geometry.Tpo -c -o src/libs/libgroff/libgroff_a-geometry.obj `if test -f 'src/libs/libgroff/geometry.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/geometry.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/geometry.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-geometry.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-geometry.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/geometry.cpp' object='src/libs/libgroff/libgroff_a-geometry.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-geometry.obj `if test -f 'src/libs/libgroff/geometry.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/geometry.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/geometry.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-glyphuni.o: src/libs/libgroff/glyphuni.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-glyphuni.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-glyphuni.Tpo -c -o src/libs/libgroff/libgroff_a-glyphuni.o `test -f 'src/libs/libgroff/glyphuni.cpp' || echo '$(srcdir)/'`src/libs/libgroff/glyphuni.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-glyphuni.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-glyphuni.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/glyphuni.cpp' object='src/libs/libgroff/libgroff_a-glyphuni.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-glyphuni.o `test -f 'src/libs/libgroff/glyphuni.cpp' || echo '$(srcdir)/'`src/libs/libgroff/glyphuni.cpp
+
+src/libs/libgroff/libgroff_a-glyphuni.obj: src/libs/libgroff/glyphuni.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-glyphuni.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-glyphuni.Tpo -c -o src/libs/libgroff/libgroff_a-glyphuni.obj `if test -f 'src/libs/libgroff/glyphuni.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/glyphuni.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/glyphuni.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-glyphuni.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-glyphuni.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/glyphuni.cpp' object='src/libs/libgroff/libgroff_a-glyphuni.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-glyphuni.obj `if test -f 'src/libs/libgroff/glyphuni.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/glyphuni.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/glyphuni.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-htmlhint.o: src/libs/libgroff/htmlhint.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-htmlhint.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-htmlhint.Tpo -c -o src/libs/libgroff/libgroff_a-htmlhint.o `test -f 'src/libs/libgroff/htmlhint.cpp' || echo '$(srcdir)/'`src/libs/libgroff/htmlhint.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-htmlhint.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-htmlhint.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/htmlhint.cpp' object='src/libs/libgroff/libgroff_a-htmlhint.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-htmlhint.o `test -f 'src/libs/libgroff/htmlhint.cpp' || echo '$(srcdir)/'`src/libs/libgroff/htmlhint.cpp
+
+src/libs/libgroff/libgroff_a-htmlhint.obj: src/libs/libgroff/htmlhint.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-htmlhint.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-htmlhint.Tpo -c -o src/libs/libgroff/libgroff_a-htmlhint.obj `if test -f 'src/libs/libgroff/htmlhint.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/htmlhint.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/htmlhint.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-htmlhint.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-htmlhint.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/htmlhint.cpp' object='src/libs/libgroff/libgroff_a-htmlhint.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-htmlhint.obj `if test -f 'src/libs/libgroff/htmlhint.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/htmlhint.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/htmlhint.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-hypot.o: src/libs/libgroff/hypot.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-hypot.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-hypot.Tpo -c -o src/libs/libgroff/libgroff_a-hypot.o `test -f 'src/libs/libgroff/hypot.cpp' || echo '$(srcdir)/'`src/libs/libgroff/hypot.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-hypot.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-hypot.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/hypot.cpp' object='src/libs/libgroff/libgroff_a-hypot.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-hypot.o `test -f 'src/libs/libgroff/hypot.cpp' || echo '$(srcdir)/'`src/libs/libgroff/hypot.cpp
+
+src/libs/libgroff/libgroff_a-hypot.obj: src/libs/libgroff/hypot.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-hypot.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-hypot.Tpo -c -o src/libs/libgroff/libgroff_a-hypot.obj `if test -f 'src/libs/libgroff/hypot.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/hypot.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/hypot.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-hypot.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-hypot.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/hypot.cpp' object='src/libs/libgroff/libgroff_a-hypot.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-hypot.obj `if test -f 'src/libs/libgroff/hypot.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/hypot.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/hypot.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-invalid.o: src/libs/libgroff/invalid.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-invalid.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-invalid.Tpo -c -o src/libs/libgroff/libgroff_a-invalid.o `test -f 'src/libs/libgroff/invalid.cpp' || echo '$(srcdir)/'`src/libs/libgroff/invalid.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-invalid.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-invalid.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/invalid.cpp' object='src/libs/libgroff/libgroff_a-invalid.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-invalid.o `test -f 'src/libs/libgroff/invalid.cpp' || echo '$(srcdir)/'`src/libs/libgroff/invalid.cpp
+
+src/libs/libgroff/libgroff_a-invalid.obj: src/libs/libgroff/invalid.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-invalid.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-invalid.Tpo -c -o src/libs/libgroff/libgroff_a-invalid.obj `if test -f 'src/libs/libgroff/invalid.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/invalid.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/invalid.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-invalid.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-invalid.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/invalid.cpp' object='src/libs/libgroff/libgroff_a-invalid.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-invalid.obj `if test -f 'src/libs/libgroff/invalid.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/invalid.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/invalid.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-lf.o: src/libs/libgroff/lf.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-lf.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-lf.Tpo -c -o src/libs/libgroff/libgroff_a-lf.o `test -f 'src/libs/libgroff/lf.cpp' || echo '$(srcdir)/'`src/libs/libgroff/lf.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-lf.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-lf.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/lf.cpp' object='src/libs/libgroff/libgroff_a-lf.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-lf.o `test -f 'src/libs/libgroff/lf.cpp' || echo '$(srcdir)/'`src/libs/libgroff/lf.cpp
+
+src/libs/libgroff/libgroff_a-lf.obj: src/libs/libgroff/lf.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-lf.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-lf.Tpo -c -o src/libs/libgroff/libgroff_a-lf.obj `if test -f 'src/libs/libgroff/lf.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/lf.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/lf.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-lf.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-lf.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/lf.cpp' object='src/libs/libgroff/libgroff_a-lf.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-lf.obj `if test -f 'src/libs/libgroff/lf.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/lf.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/lf.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-lineno.o: src/libs/libgroff/lineno.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-lineno.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-lineno.Tpo -c -o src/libs/libgroff/libgroff_a-lineno.o `test -f 'src/libs/libgroff/lineno.cpp' || echo '$(srcdir)/'`src/libs/libgroff/lineno.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-lineno.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-lineno.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/lineno.cpp' object='src/libs/libgroff/libgroff_a-lineno.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-lineno.o `test -f 'src/libs/libgroff/lineno.cpp' || echo '$(srcdir)/'`src/libs/libgroff/lineno.cpp
+
+src/libs/libgroff/libgroff_a-lineno.obj: src/libs/libgroff/lineno.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-lineno.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-lineno.Tpo -c -o src/libs/libgroff/libgroff_a-lineno.obj `if test -f 'src/libs/libgroff/lineno.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/lineno.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/lineno.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-lineno.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-lineno.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/lineno.cpp' object='src/libs/libgroff/libgroff_a-lineno.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-lineno.obj `if test -f 'src/libs/libgroff/lineno.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/lineno.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/lineno.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-macropath.o: src/libs/libgroff/macropath.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-macropath.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-macropath.Tpo -c -o src/libs/libgroff/libgroff_a-macropath.o `test -f 'src/libs/libgroff/macropath.cpp' || echo '$(srcdir)/'`src/libs/libgroff/macropath.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-macropath.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-macropath.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/macropath.cpp' object='src/libs/libgroff/libgroff_a-macropath.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-macropath.o `test -f 'src/libs/libgroff/macropath.cpp' || echo '$(srcdir)/'`src/libs/libgroff/macropath.cpp
+
+src/libs/libgroff/libgroff_a-macropath.obj: src/libs/libgroff/macropath.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-macropath.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-macropath.Tpo -c -o src/libs/libgroff/libgroff_a-macropath.obj `if test -f 'src/libs/libgroff/macropath.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/macropath.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/macropath.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-macropath.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-macropath.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/macropath.cpp' object='src/libs/libgroff/libgroff_a-macropath.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-macropath.obj `if test -f 'src/libs/libgroff/macropath.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/macropath.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/macropath.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-maxfilename.o: src/libs/libgroff/maxfilename.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-maxfilename.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-maxfilename.Tpo -c -o src/libs/libgroff/libgroff_a-maxfilename.o `test -f 'src/libs/libgroff/maxfilename.cpp' || echo '$(srcdir)/'`src/libs/libgroff/maxfilename.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-maxfilename.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-maxfilename.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/maxfilename.cpp' object='src/libs/libgroff/libgroff_a-maxfilename.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-maxfilename.o `test -f 'src/libs/libgroff/maxfilename.cpp' || echo '$(srcdir)/'`src/libs/libgroff/maxfilename.cpp
+
+src/libs/libgroff/libgroff_a-maxfilename.obj: src/libs/libgroff/maxfilename.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-maxfilename.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-maxfilename.Tpo -c -o src/libs/libgroff/libgroff_a-maxfilename.obj `if test -f 'src/libs/libgroff/maxfilename.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/maxfilename.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/maxfilename.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-maxfilename.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-maxfilename.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/maxfilename.cpp' object='src/libs/libgroff/libgroff_a-maxfilename.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-maxfilename.obj `if test -f 'src/libs/libgroff/maxfilename.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/maxfilename.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/maxfilename.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-maxpathname.o: src/libs/libgroff/maxpathname.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-maxpathname.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-maxpathname.Tpo -c -o src/libs/libgroff/libgroff_a-maxpathname.o `test -f 'src/libs/libgroff/maxpathname.cpp' || echo '$(srcdir)/'`src/libs/libgroff/maxpathname.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-maxpathname.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-maxpathname.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/maxpathname.cpp' object='src/libs/libgroff/libgroff_a-maxpathname.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-maxpathname.o `test -f 'src/libs/libgroff/maxpathname.cpp' || echo '$(srcdir)/'`src/libs/libgroff/maxpathname.cpp
+
+src/libs/libgroff/libgroff_a-maxpathname.obj: src/libs/libgroff/maxpathname.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-maxpathname.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-maxpathname.Tpo -c -o src/libs/libgroff/libgroff_a-maxpathname.obj `if test -f 'src/libs/libgroff/maxpathname.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/maxpathname.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/maxpathname.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-maxpathname.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-maxpathname.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/maxpathname.cpp' object='src/libs/libgroff/libgroff_a-maxpathname.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-maxpathname.obj `if test -f 'src/libs/libgroff/maxpathname.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/maxpathname.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/maxpathname.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-mksdir.o: src/libs/libgroff/mksdir.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-mksdir.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-mksdir.Tpo -c -o src/libs/libgroff/libgroff_a-mksdir.o `test -f 'src/libs/libgroff/mksdir.cpp' || echo '$(srcdir)/'`src/libs/libgroff/mksdir.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-mksdir.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-mksdir.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/mksdir.cpp' object='src/libs/libgroff/libgroff_a-mksdir.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-mksdir.o `test -f 'src/libs/libgroff/mksdir.cpp' || echo '$(srcdir)/'`src/libs/libgroff/mksdir.cpp
+
+src/libs/libgroff/libgroff_a-mksdir.obj: src/libs/libgroff/mksdir.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-mksdir.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-mksdir.Tpo -c -o src/libs/libgroff/libgroff_a-mksdir.obj `if test -f 'src/libs/libgroff/mksdir.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/mksdir.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/mksdir.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-mksdir.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-mksdir.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/mksdir.cpp' object='src/libs/libgroff/libgroff_a-mksdir.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-mksdir.obj `if test -f 'src/libs/libgroff/mksdir.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/mksdir.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/mksdir.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-nametoindex.o: src/libs/libgroff/nametoindex.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-nametoindex.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-nametoindex.Tpo -c -o src/libs/libgroff/libgroff_a-nametoindex.o `test -f 'src/libs/libgroff/nametoindex.cpp' || echo '$(srcdir)/'`src/libs/libgroff/nametoindex.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-nametoindex.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-nametoindex.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/nametoindex.cpp' object='src/libs/libgroff/libgroff_a-nametoindex.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-nametoindex.o `test -f 'src/libs/libgroff/nametoindex.cpp' || echo '$(srcdir)/'`src/libs/libgroff/nametoindex.cpp
+
+src/libs/libgroff/libgroff_a-nametoindex.obj: src/libs/libgroff/nametoindex.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-nametoindex.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-nametoindex.Tpo -c -o src/libs/libgroff/libgroff_a-nametoindex.obj `if test -f 'src/libs/libgroff/nametoindex.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/nametoindex.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/nametoindex.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-nametoindex.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-nametoindex.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/nametoindex.cpp' object='src/libs/libgroff/libgroff_a-nametoindex.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-nametoindex.obj `if test -f 'src/libs/libgroff/nametoindex.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/nametoindex.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/nametoindex.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-paper.o: src/libs/libgroff/paper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-paper.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-paper.Tpo -c -o src/libs/libgroff/libgroff_a-paper.o `test -f 'src/libs/libgroff/paper.cpp' || echo '$(srcdir)/'`src/libs/libgroff/paper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-paper.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-paper.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/paper.cpp' object='src/libs/libgroff/libgroff_a-paper.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-paper.o `test -f 'src/libs/libgroff/paper.cpp' || echo '$(srcdir)/'`src/libs/libgroff/paper.cpp
+
+src/libs/libgroff/libgroff_a-paper.obj: src/libs/libgroff/paper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-paper.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-paper.Tpo -c -o src/libs/libgroff/libgroff_a-paper.obj `if test -f 'src/libs/libgroff/paper.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/paper.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/paper.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-paper.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-paper.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/paper.cpp' object='src/libs/libgroff/libgroff_a-paper.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-paper.obj `if test -f 'src/libs/libgroff/paper.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/paper.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/paper.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-prime.o: src/libs/libgroff/prime.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-prime.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-prime.Tpo -c -o src/libs/libgroff/libgroff_a-prime.o `test -f 'src/libs/libgroff/prime.cpp' || echo '$(srcdir)/'`src/libs/libgroff/prime.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-prime.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-prime.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/prime.cpp' object='src/libs/libgroff/libgroff_a-prime.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-prime.o `test -f 'src/libs/libgroff/prime.cpp' || echo '$(srcdir)/'`src/libs/libgroff/prime.cpp
+
+src/libs/libgroff/libgroff_a-prime.obj: src/libs/libgroff/prime.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-prime.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-prime.Tpo -c -o src/libs/libgroff/libgroff_a-prime.obj `if test -f 'src/libs/libgroff/prime.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/prime.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/prime.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-prime.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-prime.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/prime.cpp' object='src/libs/libgroff/libgroff_a-prime.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-prime.obj `if test -f 'src/libs/libgroff/prime.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/prime.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/prime.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-ptable.o: src/libs/libgroff/ptable.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-ptable.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-ptable.Tpo -c -o src/libs/libgroff/libgroff_a-ptable.o `test -f 'src/libs/libgroff/ptable.cpp' || echo '$(srcdir)/'`src/libs/libgroff/ptable.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-ptable.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-ptable.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/ptable.cpp' object='src/libs/libgroff/libgroff_a-ptable.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-ptable.o `test -f 'src/libs/libgroff/ptable.cpp' || echo '$(srcdir)/'`src/libs/libgroff/ptable.cpp
+
+src/libs/libgroff/libgroff_a-ptable.obj: src/libs/libgroff/ptable.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-ptable.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-ptable.Tpo -c -o src/libs/libgroff/libgroff_a-ptable.obj `if test -f 'src/libs/libgroff/ptable.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/ptable.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/ptable.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-ptable.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-ptable.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/ptable.cpp' object='src/libs/libgroff/libgroff_a-ptable.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-ptable.obj `if test -f 'src/libs/libgroff/ptable.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/ptable.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/ptable.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-relocate.o: src/libs/libgroff/relocate.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-relocate.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-relocate.Tpo -c -o src/libs/libgroff/libgroff_a-relocate.o `test -f 'src/libs/libgroff/relocate.cpp' || echo '$(srcdir)/'`src/libs/libgroff/relocate.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-relocate.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-relocate.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/relocate.cpp' object='src/libs/libgroff/libgroff_a-relocate.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-relocate.o `test -f 'src/libs/libgroff/relocate.cpp' || echo '$(srcdir)/'`src/libs/libgroff/relocate.cpp
+
+src/libs/libgroff/libgroff_a-relocate.obj: src/libs/libgroff/relocate.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-relocate.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-relocate.Tpo -c -o src/libs/libgroff/libgroff_a-relocate.obj `if test -f 'src/libs/libgroff/relocate.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/relocate.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/relocate.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-relocate.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-relocate.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/relocate.cpp' object='src/libs/libgroff/libgroff_a-relocate.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-relocate.obj `if test -f 'src/libs/libgroff/relocate.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/relocate.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/relocate.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-searchpath.o: src/libs/libgroff/searchpath.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-searchpath.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-searchpath.Tpo -c -o src/libs/libgroff/libgroff_a-searchpath.o `test -f 'src/libs/libgroff/searchpath.cpp' || echo '$(srcdir)/'`src/libs/libgroff/searchpath.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-searchpath.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-searchpath.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/searchpath.cpp' object='src/libs/libgroff/libgroff_a-searchpath.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-searchpath.o `test -f 'src/libs/libgroff/searchpath.cpp' || echo '$(srcdir)/'`src/libs/libgroff/searchpath.cpp
+
+src/libs/libgroff/libgroff_a-searchpath.obj: src/libs/libgroff/searchpath.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-searchpath.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-searchpath.Tpo -c -o src/libs/libgroff/libgroff_a-searchpath.obj `if test -f 'src/libs/libgroff/searchpath.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/searchpath.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/searchpath.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-searchpath.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-searchpath.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/searchpath.cpp' object='src/libs/libgroff/libgroff_a-searchpath.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-searchpath.obj `if test -f 'src/libs/libgroff/searchpath.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/searchpath.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/searchpath.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-string.o: src/libs/libgroff/string.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-string.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-string.Tpo -c -o src/libs/libgroff/libgroff_a-string.o `test -f 'src/libs/libgroff/string.cpp' || echo '$(srcdir)/'`src/libs/libgroff/string.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-string.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-string.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/string.cpp' object='src/libs/libgroff/libgroff_a-string.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-string.o `test -f 'src/libs/libgroff/string.cpp' || echo '$(srcdir)/'`src/libs/libgroff/string.cpp
+
+src/libs/libgroff/libgroff_a-string.obj: src/libs/libgroff/string.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-string.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-string.Tpo -c -o src/libs/libgroff/libgroff_a-string.obj `if test -f 'src/libs/libgroff/string.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/string.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/string.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-string.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-string.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/string.cpp' object='src/libs/libgroff/libgroff_a-string.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-string.obj `if test -f 'src/libs/libgroff/string.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/string.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/string.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-strsave.o: src/libs/libgroff/strsave.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-strsave.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-strsave.Tpo -c -o src/libs/libgroff/libgroff_a-strsave.o `test -f 'src/libs/libgroff/strsave.cpp' || echo '$(srcdir)/'`src/libs/libgroff/strsave.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-strsave.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-strsave.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/strsave.cpp' object='src/libs/libgroff/libgroff_a-strsave.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-strsave.o `test -f 'src/libs/libgroff/strsave.cpp' || echo '$(srcdir)/'`src/libs/libgroff/strsave.cpp
+
+src/libs/libgroff/libgroff_a-strsave.obj: src/libs/libgroff/strsave.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-strsave.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-strsave.Tpo -c -o src/libs/libgroff/libgroff_a-strsave.obj `if test -f 'src/libs/libgroff/strsave.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/strsave.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/strsave.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-strsave.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-strsave.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/strsave.cpp' object='src/libs/libgroff/libgroff_a-strsave.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-strsave.obj `if test -f 'src/libs/libgroff/strsave.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/strsave.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/strsave.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-symbol.o: src/libs/libgroff/symbol.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-symbol.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-symbol.Tpo -c -o src/libs/libgroff/libgroff_a-symbol.o `test -f 'src/libs/libgroff/symbol.cpp' || echo '$(srcdir)/'`src/libs/libgroff/symbol.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-symbol.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-symbol.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/symbol.cpp' object='src/libs/libgroff/libgroff_a-symbol.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-symbol.o `test -f 'src/libs/libgroff/symbol.cpp' || echo '$(srcdir)/'`src/libs/libgroff/symbol.cpp
+
+src/libs/libgroff/libgroff_a-symbol.obj: src/libs/libgroff/symbol.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-symbol.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-symbol.Tpo -c -o src/libs/libgroff/libgroff_a-symbol.obj `if test -f 'src/libs/libgroff/symbol.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/symbol.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/symbol.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-symbol.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-symbol.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/symbol.cpp' object='src/libs/libgroff/libgroff_a-symbol.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-symbol.obj `if test -f 'src/libs/libgroff/symbol.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/symbol.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/symbol.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-tmpfile.o: src/libs/libgroff/tmpfile.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-tmpfile.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-tmpfile.Tpo -c -o src/libs/libgroff/libgroff_a-tmpfile.o `test -f 'src/libs/libgroff/tmpfile.cpp' || echo '$(srcdir)/'`src/libs/libgroff/tmpfile.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-tmpfile.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-tmpfile.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/tmpfile.cpp' object='src/libs/libgroff/libgroff_a-tmpfile.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-tmpfile.o `test -f 'src/libs/libgroff/tmpfile.cpp' || echo '$(srcdir)/'`src/libs/libgroff/tmpfile.cpp
+
+src/libs/libgroff/libgroff_a-tmpfile.obj: src/libs/libgroff/tmpfile.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-tmpfile.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-tmpfile.Tpo -c -o src/libs/libgroff/libgroff_a-tmpfile.obj `if test -f 'src/libs/libgroff/tmpfile.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/tmpfile.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/tmpfile.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-tmpfile.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-tmpfile.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/tmpfile.cpp' object='src/libs/libgroff/libgroff_a-tmpfile.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-tmpfile.obj `if test -f 'src/libs/libgroff/tmpfile.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/tmpfile.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/tmpfile.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-tmpname.o: src/libs/libgroff/tmpname.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-tmpname.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-tmpname.Tpo -c -o src/libs/libgroff/libgroff_a-tmpname.o `test -f 'src/libs/libgroff/tmpname.cpp' || echo '$(srcdir)/'`src/libs/libgroff/tmpname.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-tmpname.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-tmpname.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/tmpname.cpp' object='src/libs/libgroff/libgroff_a-tmpname.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-tmpname.o `test -f 'src/libs/libgroff/tmpname.cpp' || echo '$(srcdir)/'`src/libs/libgroff/tmpname.cpp
+
+src/libs/libgroff/libgroff_a-tmpname.obj: src/libs/libgroff/tmpname.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-tmpname.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-tmpname.Tpo -c -o src/libs/libgroff/libgroff_a-tmpname.obj `if test -f 'src/libs/libgroff/tmpname.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/tmpname.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/tmpname.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-tmpname.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-tmpname.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/tmpname.cpp' object='src/libs/libgroff/libgroff_a-tmpname.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-tmpname.obj `if test -f 'src/libs/libgroff/tmpname.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/tmpname.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/tmpname.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-unicode.o: src/libs/libgroff/unicode.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-unicode.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-unicode.Tpo -c -o src/libs/libgroff/libgroff_a-unicode.o `test -f 'src/libs/libgroff/unicode.cpp' || echo '$(srcdir)/'`src/libs/libgroff/unicode.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-unicode.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-unicode.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/unicode.cpp' object='src/libs/libgroff/libgroff_a-unicode.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-unicode.o `test -f 'src/libs/libgroff/unicode.cpp' || echo '$(srcdir)/'`src/libs/libgroff/unicode.cpp
+
+src/libs/libgroff/libgroff_a-unicode.obj: src/libs/libgroff/unicode.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-unicode.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-unicode.Tpo -c -o src/libs/libgroff/libgroff_a-unicode.obj `if test -f 'src/libs/libgroff/unicode.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/unicode.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/unicode.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-unicode.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-unicode.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/unicode.cpp' object='src/libs/libgroff/libgroff_a-unicode.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-unicode.obj `if test -f 'src/libs/libgroff/unicode.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/unicode.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/unicode.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-uniglyph.o: src/libs/libgroff/uniglyph.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-uniglyph.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-uniglyph.Tpo -c -o src/libs/libgroff/libgroff_a-uniglyph.o `test -f 'src/libs/libgroff/uniglyph.cpp' || echo '$(srcdir)/'`src/libs/libgroff/uniglyph.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-uniglyph.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-uniglyph.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/uniglyph.cpp' object='src/libs/libgroff/libgroff_a-uniglyph.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-uniglyph.o `test -f 'src/libs/libgroff/uniglyph.cpp' || echo '$(srcdir)/'`src/libs/libgroff/uniglyph.cpp
+
+src/libs/libgroff/libgroff_a-uniglyph.obj: src/libs/libgroff/uniglyph.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-uniglyph.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-uniglyph.Tpo -c -o src/libs/libgroff/libgroff_a-uniglyph.obj `if test -f 'src/libs/libgroff/uniglyph.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/uniglyph.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/uniglyph.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-uniglyph.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-uniglyph.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/uniglyph.cpp' object='src/libs/libgroff/libgroff_a-uniglyph.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-uniglyph.obj `if test -f 'src/libs/libgroff/uniglyph.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/uniglyph.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/uniglyph.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-uniuni.o: src/libs/libgroff/uniuni.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-uniuni.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-uniuni.Tpo -c -o src/libs/libgroff/libgroff_a-uniuni.o `test -f 'src/libs/libgroff/uniuni.cpp' || echo '$(srcdir)/'`src/libs/libgroff/uniuni.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-uniuni.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-uniuni.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/uniuni.cpp' object='src/libs/libgroff/libgroff_a-uniuni.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-uniuni.o `test -f 'src/libs/libgroff/uniuni.cpp' || echo '$(srcdir)/'`src/libs/libgroff/uniuni.cpp
+
+src/libs/libgroff/libgroff_a-uniuni.obj: src/libs/libgroff/uniuni.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-uniuni.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-uniuni.Tpo -c -o src/libs/libgroff/libgroff_a-uniuni.obj `if test -f 'src/libs/libgroff/uniuni.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/uniuni.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/uniuni.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-uniuni.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-uniuni.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/uniuni.cpp' object='src/libs/libgroff/libgroff_a-uniuni.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-uniuni.obj `if test -f 'src/libs/libgroff/uniuni.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/uniuni.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/uniuni.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-new.o: src/libs/libgroff/new.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-new.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Tpo -c -o src/libs/libgroff/libgroff_a-new.o `test -f 'src/libs/libgroff/new.cpp' || echo '$(srcdir)/'`src/libs/libgroff/new.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/new.cpp' object='src/libs/libgroff/libgroff_a-new.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-new.o `test -f 'src/libs/libgroff/new.cpp' || echo '$(srcdir)/'`src/libs/libgroff/new.cpp
+
+src/libs/libgroff/libgroff_a-new.obj: src/libs/libgroff/new.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-new.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Tpo -c -o src/libs/libgroff/libgroff_a-new.obj `if test -f 'src/libs/libgroff/new.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/new.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/new.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/new.cpp' object='src/libs/libgroff/libgroff_a-new.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-new.obj `if test -f 'src/libs/libgroff/new.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/new.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/new.cpp'; fi`
+
+src/libs/libgroff/libgroff_a-version.o: src/libs/libgroff/version.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-version.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-version.Tpo -c -o src/libs/libgroff/libgroff_a-version.o `test -f 'src/libs/libgroff/version.cpp' || echo '$(srcdir)/'`src/libs/libgroff/version.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-version.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-version.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/version.cpp' object='src/libs/libgroff/libgroff_a-version.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-version.o `test -f 'src/libs/libgroff/version.cpp' || echo '$(srcdir)/'`src/libs/libgroff/version.cpp
+
+src/libs/libgroff/libgroff_a-version.obj: src/libs/libgroff/version.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-version.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-version.Tpo -c -o src/libs/libgroff/libgroff_a-version.obj `if test -f 'src/libs/libgroff/version.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/version.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/version.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-version.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-version.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/version.cpp' object='src/libs/libgroff/libgroff_a-version.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-version.obj `if test -f 'src/libs/libgroff/version.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/version.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/version.cpp'; fi`
+
+src/preproc/eqn/eqn-main.o: src/preproc/eqn/main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-main.o -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-main.Tpo -c -o src/preproc/eqn/eqn-main.o `test -f 'src/preproc/eqn/main.cpp' || echo '$(srcdir)/'`src/preproc/eqn/main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-main.Tpo src/preproc/eqn/$(DEPDIR)/eqn-main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/main.cpp' object='src/preproc/eqn/eqn-main.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-main.o `test -f 'src/preproc/eqn/main.cpp' || echo '$(srcdir)/'`src/preproc/eqn/main.cpp
+
+src/preproc/eqn/eqn-main.obj: src/preproc/eqn/main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-main.obj -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-main.Tpo -c -o src/preproc/eqn/eqn-main.obj `if test -f 'src/preproc/eqn/main.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/main.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/main.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-main.Tpo src/preproc/eqn/$(DEPDIR)/eqn-main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/main.cpp' object='src/preproc/eqn/eqn-main.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-main.obj `if test -f 'src/preproc/eqn/main.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/main.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/main.cpp'; fi`
+
+src/preproc/eqn/eqn-lex.o: src/preproc/eqn/lex.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-lex.o -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-lex.Tpo -c -o src/preproc/eqn/eqn-lex.o `test -f 'src/preproc/eqn/lex.cpp' || echo '$(srcdir)/'`src/preproc/eqn/lex.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-lex.Tpo src/preproc/eqn/$(DEPDIR)/eqn-lex.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/lex.cpp' object='src/preproc/eqn/eqn-lex.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-lex.o `test -f 'src/preproc/eqn/lex.cpp' || echo '$(srcdir)/'`src/preproc/eqn/lex.cpp
+
+src/preproc/eqn/eqn-lex.obj: src/preproc/eqn/lex.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-lex.obj -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-lex.Tpo -c -o src/preproc/eqn/eqn-lex.obj `if test -f 'src/preproc/eqn/lex.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/lex.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/lex.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-lex.Tpo src/preproc/eqn/$(DEPDIR)/eqn-lex.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/lex.cpp' object='src/preproc/eqn/eqn-lex.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-lex.obj `if test -f 'src/preproc/eqn/lex.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/lex.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/lex.cpp'; fi`
+
+src/preproc/eqn/eqn-box.o: src/preproc/eqn/box.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-box.o -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-box.Tpo -c -o src/preproc/eqn/eqn-box.o `test -f 'src/preproc/eqn/box.cpp' || echo '$(srcdir)/'`src/preproc/eqn/box.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-box.Tpo src/preproc/eqn/$(DEPDIR)/eqn-box.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/box.cpp' object='src/preproc/eqn/eqn-box.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-box.o `test -f 'src/preproc/eqn/box.cpp' || echo '$(srcdir)/'`src/preproc/eqn/box.cpp
+
+src/preproc/eqn/eqn-box.obj: src/preproc/eqn/box.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-box.obj -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-box.Tpo -c -o src/preproc/eqn/eqn-box.obj `if test -f 'src/preproc/eqn/box.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/box.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/box.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-box.Tpo src/preproc/eqn/$(DEPDIR)/eqn-box.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/box.cpp' object='src/preproc/eqn/eqn-box.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-box.obj `if test -f 'src/preproc/eqn/box.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/box.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/box.cpp'; fi`
+
+src/preproc/eqn/eqn-limit.o: src/preproc/eqn/limit.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-limit.o -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-limit.Tpo -c -o src/preproc/eqn/eqn-limit.o `test -f 'src/preproc/eqn/limit.cpp' || echo '$(srcdir)/'`src/preproc/eqn/limit.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-limit.Tpo src/preproc/eqn/$(DEPDIR)/eqn-limit.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/limit.cpp' object='src/preproc/eqn/eqn-limit.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-limit.o `test -f 'src/preproc/eqn/limit.cpp' || echo '$(srcdir)/'`src/preproc/eqn/limit.cpp
+
+src/preproc/eqn/eqn-limit.obj: src/preproc/eqn/limit.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-limit.obj -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-limit.Tpo -c -o src/preproc/eqn/eqn-limit.obj `if test -f 'src/preproc/eqn/limit.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/limit.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/limit.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-limit.Tpo src/preproc/eqn/$(DEPDIR)/eqn-limit.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/limit.cpp' object='src/preproc/eqn/eqn-limit.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-limit.obj `if test -f 'src/preproc/eqn/limit.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/limit.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/limit.cpp'; fi`
+
+src/preproc/eqn/eqn-list.o: src/preproc/eqn/list.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-list.o -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-list.Tpo -c -o src/preproc/eqn/eqn-list.o `test -f 'src/preproc/eqn/list.cpp' || echo '$(srcdir)/'`src/preproc/eqn/list.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-list.Tpo src/preproc/eqn/$(DEPDIR)/eqn-list.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/list.cpp' object='src/preproc/eqn/eqn-list.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-list.o `test -f 'src/preproc/eqn/list.cpp' || echo '$(srcdir)/'`src/preproc/eqn/list.cpp
+
+src/preproc/eqn/eqn-list.obj: src/preproc/eqn/list.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-list.obj -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-list.Tpo -c -o src/preproc/eqn/eqn-list.obj `if test -f 'src/preproc/eqn/list.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/list.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/list.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-list.Tpo src/preproc/eqn/$(DEPDIR)/eqn-list.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/list.cpp' object='src/preproc/eqn/eqn-list.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-list.obj `if test -f 'src/preproc/eqn/list.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/list.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/list.cpp'; fi`
+
+src/preproc/eqn/eqn-over.o: src/preproc/eqn/over.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-over.o -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-over.Tpo -c -o src/preproc/eqn/eqn-over.o `test -f 'src/preproc/eqn/over.cpp' || echo '$(srcdir)/'`src/preproc/eqn/over.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-over.Tpo src/preproc/eqn/$(DEPDIR)/eqn-over.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/over.cpp' object='src/preproc/eqn/eqn-over.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-over.o `test -f 'src/preproc/eqn/over.cpp' || echo '$(srcdir)/'`src/preproc/eqn/over.cpp
+
+src/preproc/eqn/eqn-over.obj: src/preproc/eqn/over.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-over.obj -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-over.Tpo -c -o src/preproc/eqn/eqn-over.obj `if test -f 'src/preproc/eqn/over.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/over.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/over.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-over.Tpo src/preproc/eqn/$(DEPDIR)/eqn-over.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/over.cpp' object='src/preproc/eqn/eqn-over.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-over.obj `if test -f 'src/preproc/eqn/over.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/over.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/over.cpp'; fi`
+
+src/preproc/eqn/eqn-text.o: src/preproc/eqn/text.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-text.o -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-text.Tpo -c -o src/preproc/eqn/eqn-text.o `test -f 'src/preproc/eqn/text.cpp' || echo '$(srcdir)/'`src/preproc/eqn/text.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-text.Tpo src/preproc/eqn/$(DEPDIR)/eqn-text.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/text.cpp' object='src/preproc/eqn/eqn-text.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-text.o `test -f 'src/preproc/eqn/text.cpp' || echo '$(srcdir)/'`src/preproc/eqn/text.cpp
+
+src/preproc/eqn/eqn-text.obj: src/preproc/eqn/text.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-text.obj -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-text.Tpo -c -o src/preproc/eqn/eqn-text.obj `if test -f 'src/preproc/eqn/text.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/text.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/text.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-text.Tpo src/preproc/eqn/$(DEPDIR)/eqn-text.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/text.cpp' object='src/preproc/eqn/eqn-text.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-text.obj `if test -f 'src/preproc/eqn/text.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/text.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/text.cpp'; fi`
+
+src/preproc/eqn/eqn-script.o: src/preproc/eqn/script.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-script.o -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-script.Tpo -c -o src/preproc/eqn/eqn-script.o `test -f 'src/preproc/eqn/script.cpp' || echo '$(srcdir)/'`src/preproc/eqn/script.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-script.Tpo src/preproc/eqn/$(DEPDIR)/eqn-script.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/script.cpp' object='src/preproc/eqn/eqn-script.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-script.o `test -f 'src/preproc/eqn/script.cpp' || echo '$(srcdir)/'`src/preproc/eqn/script.cpp
+
+src/preproc/eqn/eqn-script.obj: src/preproc/eqn/script.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-script.obj -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-script.Tpo -c -o src/preproc/eqn/eqn-script.obj `if test -f 'src/preproc/eqn/script.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/script.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/script.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-script.Tpo src/preproc/eqn/$(DEPDIR)/eqn-script.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/script.cpp' object='src/preproc/eqn/eqn-script.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-script.obj `if test -f 'src/preproc/eqn/script.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/script.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/script.cpp'; fi`
+
+src/preproc/eqn/eqn-mark.o: src/preproc/eqn/mark.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-mark.o -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-mark.Tpo -c -o src/preproc/eqn/eqn-mark.o `test -f 'src/preproc/eqn/mark.cpp' || echo '$(srcdir)/'`src/preproc/eqn/mark.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-mark.Tpo src/preproc/eqn/$(DEPDIR)/eqn-mark.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/mark.cpp' object='src/preproc/eqn/eqn-mark.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-mark.o `test -f 'src/preproc/eqn/mark.cpp' || echo '$(srcdir)/'`src/preproc/eqn/mark.cpp
+
+src/preproc/eqn/eqn-mark.obj: src/preproc/eqn/mark.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-mark.obj -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-mark.Tpo -c -o src/preproc/eqn/eqn-mark.obj `if test -f 'src/preproc/eqn/mark.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/mark.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/mark.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-mark.Tpo src/preproc/eqn/$(DEPDIR)/eqn-mark.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/mark.cpp' object='src/preproc/eqn/eqn-mark.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-mark.obj `if test -f 'src/preproc/eqn/mark.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/mark.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/mark.cpp'; fi`
+
+src/preproc/eqn/eqn-other.o: src/preproc/eqn/other.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-other.o -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-other.Tpo -c -o src/preproc/eqn/eqn-other.o `test -f 'src/preproc/eqn/other.cpp' || echo '$(srcdir)/'`src/preproc/eqn/other.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-other.Tpo src/preproc/eqn/$(DEPDIR)/eqn-other.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/other.cpp' object='src/preproc/eqn/eqn-other.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-other.o `test -f 'src/preproc/eqn/other.cpp' || echo '$(srcdir)/'`src/preproc/eqn/other.cpp
+
+src/preproc/eqn/eqn-other.obj: src/preproc/eqn/other.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-other.obj -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-other.Tpo -c -o src/preproc/eqn/eqn-other.obj `if test -f 'src/preproc/eqn/other.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/other.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/other.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-other.Tpo src/preproc/eqn/$(DEPDIR)/eqn-other.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/other.cpp' object='src/preproc/eqn/eqn-other.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-other.obj `if test -f 'src/preproc/eqn/other.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/other.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/other.cpp'; fi`
+
+src/preproc/eqn/eqn-delim.o: src/preproc/eqn/delim.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-delim.o -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-delim.Tpo -c -o src/preproc/eqn/eqn-delim.o `test -f 'src/preproc/eqn/delim.cpp' || echo '$(srcdir)/'`src/preproc/eqn/delim.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-delim.Tpo src/preproc/eqn/$(DEPDIR)/eqn-delim.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/delim.cpp' object='src/preproc/eqn/eqn-delim.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-delim.o `test -f 'src/preproc/eqn/delim.cpp' || echo '$(srcdir)/'`src/preproc/eqn/delim.cpp
+
+src/preproc/eqn/eqn-delim.obj: src/preproc/eqn/delim.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-delim.obj -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-delim.Tpo -c -o src/preproc/eqn/eqn-delim.obj `if test -f 'src/preproc/eqn/delim.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/delim.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/delim.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-delim.Tpo src/preproc/eqn/$(DEPDIR)/eqn-delim.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/delim.cpp' object='src/preproc/eqn/eqn-delim.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-delim.obj `if test -f 'src/preproc/eqn/delim.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/delim.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/delim.cpp'; fi`
+
+src/preproc/eqn/eqn-sqrt.o: src/preproc/eqn/sqrt.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-sqrt.o -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-sqrt.Tpo -c -o src/preproc/eqn/eqn-sqrt.o `test -f 'src/preproc/eqn/sqrt.cpp' || echo '$(srcdir)/'`src/preproc/eqn/sqrt.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-sqrt.Tpo src/preproc/eqn/$(DEPDIR)/eqn-sqrt.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/sqrt.cpp' object='src/preproc/eqn/eqn-sqrt.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-sqrt.o `test -f 'src/preproc/eqn/sqrt.cpp' || echo '$(srcdir)/'`src/preproc/eqn/sqrt.cpp
+
+src/preproc/eqn/eqn-sqrt.obj: src/preproc/eqn/sqrt.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-sqrt.obj -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-sqrt.Tpo -c -o src/preproc/eqn/eqn-sqrt.obj `if test -f 'src/preproc/eqn/sqrt.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/sqrt.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/sqrt.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-sqrt.Tpo src/preproc/eqn/$(DEPDIR)/eqn-sqrt.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/sqrt.cpp' object='src/preproc/eqn/eqn-sqrt.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-sqrt.obj `if test -f 'src/preproc/eqn/sqrt.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/sqrt.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/sqrt.cpp'; fi`
+
+src/preproc/eqn/eqn-pile.o: src/preproc/eqn/pile.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-pile.o -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-pile.Tpo -c -o src/preproc/eqn/eqn-pile.o `test -f 'src/preproc/eqn/pile.cpp' || echo '$(srcdir)/'`src/preproc/eqn/pile.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-pile.Tpo src/preproc/eqn/$(DEPDIR)/eqn-pile.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/pile.cpp' object='src/preproc/eqn/eqn-pile.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-pile.o `test -f 'src/preproc/eqn/pile.cpp' || echo '$(srcdir)/'`src/preproc/eqn/pile.cpp
+
+src/preproc/eqn/eqn-pile.obj: src/preproc/eqn/pile.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-pile.obj -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-pile.Tpo -c -o src/preproc/eqn/eqn-pile.obj `if test -f 'src/preproc/eqn/pile.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/pile.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/pile.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-pile.Tpo src/preproc/eqn/$(DEPDIR)/eqn-pile.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/pile.cpp' object='src/preproc/eqn/eqn-pile.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-pile.obj `if test -f 'src/preproc/eqn/pile.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/pile.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/pile.cpp'; fi`
+
+src/preproc/eqn/eqn-special.o: src/preproc/eqn/special.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-special.o -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-special.Tpo -c -o src/preproc/eqn/eqn-special.o `test -f 'src/preproc/eqn/special.cpp' || echo '$(srcdir)/'`src/preproc/eqn/special.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-special.Tpo src/preproc/eqn/$(DEPDIR)/eqn-special.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/special.cpp' object='src/preproc/eqn/eqn-special.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-special.o `test -f 'src/preproc/eqn/special.cpp' || echo '$(srcdir)/'`src/preproc/eqn/special.cpp
+
+src/preproc/eqn/eqn-special.obj: src/preproc/eqn/special.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-special.obj -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-special.Tpo -c -o src/preproc/eqn/eqn-special.obj `if test -f 'src/preproc/eqn/special.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/special.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/special.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-special.Tpo src/preproc/eqn/$(DEPDIR)/eqn-special.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/special.cpp' object='src/preproc/eqn/eqn-special.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-special.obj `if test -f 'src/preproc/eqn/special.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/special.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/special.cpp'; fi`
+
+src/preproc/eqn/eqn-eqn.o: src/preproc/eqn/eqn.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-eqn.o -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-eqn.Tpo -c -o src/preproc/eqn/eqn-eqn.o `test -f 'src/preproc/eqn/eqn.cpp' || echo '$(srcdir)/'`src/preproc/eqn/eqn.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-eqn.Tpo src/preproc/eqn/$(DEPDIR)/eqn-eqn.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/eqn.cpp' object='src/preproc/eqn/eqn-eqn.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-eqn.o `test -f 'src/preproc/eqn/eqn.cpp' || echo '$(srcdir)/'`src/preproc/eqn/eqn.cpp
+
+src/preproc/eqn/eqn-eqn.obj: src/preproc/eqn/eqn.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/eqn/eqn-eqn.obj -MD -MP -MF src/preproc/eqn/$(DEPDIR)/eqn-eqn.Tpo -c -o src/preproc/eqn/eqn-eqn.obj `if test -f 'src/preproc/eqn/eqn.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/eqn.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/eqn.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/eqn/$(DEPDIR)/eqn-eqn.Tpo src/preproc/eqn/$(DEPDIR)/eqn-eqn.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/eqn/eqn.cpp' object='src/preproc/eqn/eqn-eqn.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(eqn_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/eqn/eqn-eqn.obj `if test -f 'src/preproc/eqn/eqn.cpp'; then $(CYGPATH_W) 'src/preproc/eqn/eqn.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/eqn/eqn.cpp'; fi`
+
+src/preproc/pic/pic-pic.o: src/preproc/pic/pic.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/pic/pic-pic.o -MD -MP -MF src/preproc/pic/$(DEPDIR)/pic-pic.Tpo -c -o src/preproc/pic/pic-pic.o `test -f 'src/preproc/pic/pic.cpp' || echo '$(srcdir)/'`src/preproc/pic/pic.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/pic/$(DEPDIR)/pic-pic.Tpo src/preproc/pic/$(DEPDIR)/pic-pic.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/pic/pic.cpp' object='src/preproc/pic/pic-pic.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/pic/pic-pic.o `test -f 'src/preproc/pic/pic.cpp' || echo '$(srcdir)/'`src/preproc/pic/pic.cpp
+
+src/preproc/pic/pic-pic.obj: src/preproc/pic/pic.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/pic/pic-pic.obj -MD -MP -MF src/preproc/pic/$(DEPDIR)/pic-pic.Tpo -c -o src/preproc/pic/pic-pic.obj `if test -f 'src/preproc/pic/pic.cpp'; then $(CYGPATH_W) 'src/preproc/pic/pic.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/pic/pic.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/pic/$(DEPDIR)/pic-pic.Tpo src/preproc/pic/$(DEPDIR)/pic-pic.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/pic/pic.cpp' object='src/preproc/pic/pic-pic.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/pic/pic-pic.obj `if test -f 'src/preproc/pic/pic.cpp'; then $(CYGPATH_W) 'src/preproc/pic/pic.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/pic/pic.cpp'; fi`
+
+src/preproc/pic/pic-lex.o: src/preproc/pic/lex.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/pic/pic-lex.o -MD -MP -MF src/preproc/pic/$(DEPDIR)/pic-lex.Tpo -c -o src/preproc/pic/pic-lex.o `test -f 'src/preproc/pic/lex.cpp' || echo '$(srcdir)/'`src/preproc/pic/lex.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/pic/$(DEPDIR)/pic-lex.Tpo src/preproc/pic/$(DEPDIR)/pic-lex.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/pic/lex.cpp' object='src/preproc/pic/pic-lex.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/pic/pic-lex.o `test -f 'src/preproc/pic/lex.cpp' || echo '$(srcdir)/'`src/preproc/pic/lex.cpp
+
+src/preproc/pic/pic-lex.obj: src/preproc/pic/lex.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/pic/pic-lex.obj -MD -MP -MF src/preproc/pic/$(DEPDIR)/pic-lex.Tpo -c -o src/preproc/pic/pic-lex.obj `if test -f 'src/preproc/pic/lex.cpp'; then $(CYGPATH_W) 'src/preproc/pic/lex.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/pic/lex.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/pic/$(DEPDIR)/pic-lex.Tpo src/preproc/pic/$(DEPDIR)/pic-lex.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/pic/lex.cpp' object='src/preproc/pic/pic-lex.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/pic/pic-lex.obj `if test -f 'src/preproc/pic/lex.cpp'; then $(CYGPATH_W) 'src/preproc/pic/lex.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/pic/lex.cpp'; fi`
+
+src/preproc/pic/pic-main.o: src/preproc/pic/main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/pic/pic-main.o -MD -MP -MF src/preproc/pic/$(DEPDIR)/pic-main.Tpo -c -o src/preproc/pic/pic-main.o `test -f 'src/preproc/pic/main.cpp' || echo '$(srcdir)/'`src/preproc/pic/main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/pic/$(DEPDIR)/pic-main.Tpo src/preproc/pic/$(DEPDIR)/pic-main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/pic/main.cpp' object='src/preproc/pic/pic-main.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/pic/pic-main.o `test -f 'src/preproc/pic/main.cpp' || echo '$(srcdir)/'`src/preproc/pic/main.cpp
+
+src/preproc/pic/pic-main.obj: src/preproc/pic/main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/pic/pic-main.obj -MD -MP -MF src/preproc/pic/$(DEPDIR)/pic-main.Tpo -c -o src/preproc/pic/pic-main.obj `if test -f 'src/preproc/pic/main.cpp'; then $(CYGPATH_W) 'src/preproc/pic/main.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/pic/main.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/pic/$(DEPDIR)/pic-main.Tpo src/preproc/pic/$(DEPDIR)/pic-main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/pic/main.cpp' object='src/preproc/pic/pic-main.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/pic/pic-main.obj `if test -f 'src/preproc/pic/main.cpp'; then $(CYGPATH_W) 'src/preproc/pic/main.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/pic/main.cpp'; fi`
+
+src/preproc/pic/pic-object.o: src/preproc/pic/object.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/pic/pic-object.o -MD -MP -MF src/preproc/pic/$(DEPDIR)/pic-object.Tpo -c -o src/preproc/pic/pic-object.o `test -f 'src/preproc/pic/object.cpp' || echo '$(srcdir)/'`src/preproc/pic/object.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/pic/$(DEPDIR)/pic-object.Tpo src/preproc/pic/$(DEPDIR)/pic-object.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/pic/object.cpp' object='src/preproc/pic/pic-object.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/pic/pic-object.o `test -f 'src/preproc/pic/object.cpp' || echo '$(srcdir)/'`src/preproc/pic/object.cpp
+
+src/preproc/pic/pic-object.obj: src/preproc/pic/object.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/pic/pic-object.obj -MD -MP -MF src/preproc/pic/$(DEPDIR)/pic-object.Tpo -c -o src/preproc/pic/pic-object.obj `if test -f 'src/preproc/pic/object.cpp'; then $(CYGPATH_W) 'src/preproc/pic/object.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/pic/object.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/pic/$(DEPDIR)/pic-object.Tpo src/preproc/pic/$(DEPDIR)/pic-object.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/pic/object.cpp' object='src/preproc/pic/pic-object.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/pic/pic-object.obj `if test -f 'src/preproc/pic/object.cpp'; then $(CYGPATH_W) 'src/preproc/pic/object.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/pic/object.cpp'; fi`
+
+src/preproc/pic/pic-common.o: src/preproc/pic/common.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/pic/pic-common.o -MD -MP -MF src/preproc/pic/$(DEPDIR)/pic-common.Tpo -c -o src/preproc/pic/pic-common.o `test -f 'src/preproc/pic/common.cpp' || echo '$(srcdir)/'`src/preproc/pic/common.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/pic/$(DEPDIR)/pic-common.Tpo src/preproc/pic/$(DEPDIR)/pic-common.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/pic/common.cpp' object='src/preproc/pic/pic-common.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/pic/pic-common.o `test -f 'src/preproc/pic/common.cpp' || echo '$(srcdir)/'`src/preproc/pic/common.cpp
+
+src/preproc/pic/pic-common.obj: src/preproc/pic/common.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/pic/pic-common.obj -MD -MP -MF src/preproc/pic/$(DEPDIR)/pic-common.Tpo -c -o src/preproc/pic/pic-common.obj `if test -f 'src/preproc/pic/common.cpp'; then $(CYGPATH_W) 'src/preproc/pic/common.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/pic/common.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/pic/$(DEPDIR)/pic-common.Tpo src/preproc/pic/$(DEPDIR)/pic-common.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/pic/common.cpp' object='src/preproc/pic/pic-common.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/pic/pic-common.obj `if test -f 'src/preproc/pic/common.cpp'; then $(CYGPATH_W) 'src/preproc/pic/common.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/pic/common.cpp'; fi`
+
+src/preproc/pic/pic-troff.o: src/preproc/pic/troff.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/pic/pic-troff.o -MD -MP -MF src/preproc/pic/$(DEPDIR)/pic-troff.Tpo -c -o src/preproc/pic/pic-troff.o `test -f 'src/preproc/pic/troff.cpp' || echo '$(srcdir)/'`src/preproc/pic/troff.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/pic/$(DEPDIR)/pic-troff.Tpo src/preproc/pic/$(DEPDIR)/pic-troff.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/pic/troff.cpp' object='src/preproc/pic/pic-troff.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/pic/pic-troff.o `test -f 'src/preproc/pic/troff.cpp' || echo '$(srcdir)/'`src/preproc/pic/troff.cpp
+
+src/preproc/pic/pic-troff.obj: src/preproc/pic/troff.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/pic/pic-troff.obj -MD -MP -MF src/preproc/pic/$(DEPDIR)/pic-troff.Tpo -c -o src/preproc/pic/pic-troff.obj `if test -f 'src/preproc/pic/troff.cpp'; then $(CYGPATH_W) 'src/preproc/pic/troff.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/pic/troff.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/pic/$(DEPDIR)/pic-troff.Tpo src/preproc/pic/$(DEPDIR)/pic-troff.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/pic/troff.cpp' object='src/preproc/pic/pic-troff.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/pic/pic-troff.obj `if test -f 'src/preproc/pic/troff.cpp'; then $(CYGPATH_W) 'src/preproc/pic/troff.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/pic/troff.cpp'; fi`
+
+src/preproc/pic/pic-tex.o: src/preproc/pic/tex.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/pic/pic-tex.o -MD -MP -MF src/preproc/pic/$(DEPDIR)/pic-tex.Tpo -c -o src/preproc/pic/pic-tex.o `test -f 'src/preproc/pic/tex.cpp' || echo '$(srcdir)/'`src/preproc/pic/tex.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/pic/$(DEPDIR)/pic-tex.Tpo src/preproc/pic/$(DEPDIR)/pic-tex.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/pic/tex.cpp' object='src/preproc/pic/pic-tex.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/pic/pic-tex.o `test -f 'src/preproc/pic/tex.cpp' || echo '$(srcdir)/'`src/preproc/pic/tex.cpp
+
+src/preproc/pic/pic-tex.obj: src/preproc/pic/tex.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/pic/pic-tex.obj -MD -MP -MF src/preproc/pic/$(DEPDIR)/pic-tex.Tpo -c -o src/preproc/pic/pic-tex.obj `if test -f 'src/preproc/pic/tex.cpp'; then $(CYGPATH_W) 'src/preproc/pic/tex.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/pic/tex.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/pic/$(DEPDIR)/pic-tex.Tpo src/preproc/pic/$(DEPDIR)/pic-tex.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/pic/tex.cpp' object='src/preproc/pic/pic-tex.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pic_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/pic/pic-tex.obj `if test -f 'src/preproc/pic/tex.cpp'; then $(CYGPATH_W) 'src/preproc/pic/tex.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/pic/tex.cpp'; fi`
+
+src/preproc/preconv/preconv-preconv.o: src/preproc/preconv/preconv.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(preconv_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/preconv/preconv-preconv.o -MD -MP -MF src/preproc/preconv/$(DEPDIR)/preconv-preconv.Tpo -c -o src/preproc/preconv/preconv-preconv.o `test -f 'src/preproc/preconv/preconv.cpp' || echo '$(srcdir)/'`src/preproc/preconv/preconv.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/preconv/$(DEPDIR)/preconv-preconv.Tpo src/preproc/preconv/$(DEPDIR)/preconv-preconv.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/preconv/preconv.cpp' object='src/preproc/preconv/preconv-preconv.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(preconv_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/preconv/preconv-preconv.o `test -f 'src/preproc/preconv/preconv.cpp' || echo '$(srcdir)/'`src/preproc/preconv/preconv.cpp
+
+src/preproc/preconv/preconv-preconv.obj: src/preproc/preconv/preconv.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(preconv_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/preconv/preconv-preconv.obj -MD -MP -MF src/preproc/preconv/$(DEPDIR)/preconv-preconv.Tpo -c -o src/preproc/preconv/preconv-preconv.obj `if test -f 'src/preproc/preconv/preconv.cpp'; then $(CYGPATH_W) 'src/preproc/preconv/preconv.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/preconv/preconv.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/preconv/$(DEPDIR)/preconv-preconv.Tpo src/preproc/preconv/$(DEPDIR)/preconv-preconv.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/preconv/preconv.cpp' object='src/preproc/preconv/preconv-preconv.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(preconv_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/preconv/preconv-preconv.obj `if test -f 'src/preproc/preconv/preconv.cpp'; then $(CYGPATH_W) 'src/preproc/preconv/preconv.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/preconv/preconv.cpp'; fi`
+
+src/preproc/refer/refer-command.o: src/preproc/refer/command.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/refer/refer-command.o -MD -MP -MF src/preproc/refer/$(DEPDIR)/refer-command.Tpo -c -o src/preproc/refer/refer-command.o `test -f 'src/preproc/refer/command.cpp' || echo '$(srcdir)/'`src/preproc/refer/command.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/refer/$(DEPDIR)/refer-command.Tpo src/preproc/refer/$(DEPDIR)/refer-command.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/refer/command.cpp' object='src/preproc/refer/refer-command.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/refer/refer-command.o `test -f 'src/preproc/refer/command.cpp' || echo '$(srcdir)/'`src/preproc/refer/command.cpp
+
+src/preproc/refer/refer-command.obj: src/preproc/refer/command.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/refer/refer-command.obj -MD -MP -MF src/preproc/refer/$(DEPDIR)/refer-command.Tpo -c -o src/preproc/refer/refer-command.obj `if test -f 'src/preproc/refer/command.cpp'; then $(CYGPATH_W) 'src/preproc/refer/command.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/refer/command.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/refer/$(DEPDIR)/refer-command.Tpo src/preproc/refer/$(DEPDIR)/refer-command.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/refer/command.cpp' object='src/preproc/refer/refer-command.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/refer/refer-command.obj `if test -f 'src/preproc/refer/command.cpp'; then $(CYGPATH_W) 'src/preproc/refer/command.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/refer/command.cpp'; fi`
+
+src/preproc/refer/refer-ref.o: src/preproc/refer/ref.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/refer/refer-ref.o -MD -MP -MF src/preproc/refer/$(DEPDIR)/refer-ref.Tpo -c -o src/preproc/refer/refer-ref.o `test -f 'src/preproc/refer/ref.cpp' || echo '$(srcdir)/'`src/preproc/refer/ref.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/refer/$(DEPDIR)/refer-ref.Tpo src/preproc/refer/$(DEPDIR)/refer-ref.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/refer/ref.cpp' object='src/preproc/refer/refer-ref.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/refer/refer-ref.o `test -f 'src/preproc/refer/ref.cpp' || echo '$(srcdir)/'`src/preproc/refer/ref.cpp
+
+src/preproc/refer/refer-ref.obj: src/preproc/refer/ref.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/refer/refer-ref.obj -MD -MP -MF src/preproc/refer/$(DEPDIR)/refer-ref.Tpo -c -o src/preproc/refer/refer-ref.obj `if test -f 'src/preproc/refer/ref.cpp'; then $(CYGPATH_W) 'src/preproc/refer/ref.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/refer/ref.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/refer/$(DEPDIR)/refer-ref.Tpo src/preproc/refer/$(DEPDIR)/refer-ref.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/refer/ref.cpp' object='src/preproc/refer/refer-ref.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/refer/refer-ref.obj `if test -f 'src/preproc/refer/ref.cpp'; then $(CYGPATH_W) 'src/preproc/refer/ref.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/refer/ref.cpp'; fi`
+
+src/preproc/refer/refer-refer.o: src/preproc/refer/refer.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/refer/refer-refer.o -MD -MP -MF src/preproc/refer/$(DEPDIR)/refer-refer.Tpo -c -o src/preproc/refer/refer-refer.o `test -f 'src/preproc/refer/refer.cpp' || echo '$(srcdir)/'`src/preproc/refer/refer.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/refer/$(DEPDIR)/refer-refer.Tpo src/preproc/refer/$(DEPDIR)/refer-refer.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/refer/refer.cpp' object='src/preproc/refer/refer-refer.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/refer/refer-refer.o `test -f 'src/preproc/refer/refer.cpp' || echo '$(srcdir)/'`src/preproc/refer/refer.cpp
+
+src/preproc/refer/refer-refer.obj: src/preproc/refer/refer.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/refer/refer-refer.obj -MD -MP -MF src/preproc/refer/$(DEPDIR)/refer-refer.Tpo -c -o src/preproc/refer/refer-refer.obj `if test -f 'src/preproc/refer/refer.cpp'; then $(CYGPATH_W) 'src/preproc/refer/refer.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/refer/refer.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/refer/$(DEPDIR)/refer-refer.Tpo src/preproc/refer/$(DEPDIR)/refer-refer.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/refer/refer.cpp' object='src/preproc/refer/refer-refer.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/refer/refer-refer.obj `if test -f 'src/preproc/refer/refer.cpp'; then $(CYGPATH_W) 'src/preproc/refer/refer.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/refer/refer.cpp'; fi`
+
+src/preproc/refer/refer-token.o: src/preproc/refer/token.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/refer/refer-token.o -MD -MP -MF src/preproc/refer/$(DEPDIR)/refer-token.Tpo -c -o src/preproc/refer/refer-token.o `test -f 'src/preproc/refer/token.cpp' || echo '$(srcdir)/'`src/preproc/refer/token.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/refer/$(DEPDIR)/refer-token.Tpo src/preproc/refer/$(DEPDIR)/refer-token.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/refer/token.cpp' object='src/preproc/refer/refer-token.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/refer/refer-token.o `test -f 'src/preproc/refer/token.cpp' || echo '$(srcdir)/'`src/preproc/refer/token.cpp
+
+src/preproc/refer/refer-token.obj: src/preproc/refer/token.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/refer/refer-token.obj -MD -MP -MF src/preproc/refer/$(DEPDIR)/refer-token.Tpo -c -o src/preproc/refer/refer-token.obj `if test -f 'src/preproc/refer/token.cpp'; then $(CYGPATH_W) 'src/preproc/refer/token.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/refer/token.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/refer/$(DEPDIR)/refer-token.Tpo src/preproc/refer/$(DEPDIR)/refer-token.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/refer/token.cpp' object='src/preproc/refer/refer-token.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/refer/refer-token.obj `if test -f 'src/preproc/refer/token.cpp'; then $(CYGPATH_W) 'src/preproc/refer/token.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/refer/token.cpp'; fi`
+
+src/preproc/refer/refer-label.o: src/preproc/refer/label.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/refer/refer-label.o -MD -MP -MF src/preproc/refer/$(DEPDIR)/refer-label.Tpo -c -o src/preproc/refer/refer-label.o `test -f 'src/preproc/refer/label.cpp' || echo '$(srcdir)/'`src/preproc/refer/label.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/refer/$(DEPDIR)/refer-label.Tpo src/preproc/refer/$(DEPDIR)/refer-label.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/refer/label.cpp' object='src/preproc/refer/refer-label.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/refer/refer-label.o `test -f 'src/preproc/refer/label.cpp' || echo '$(srcdir)/'`src/preproc/refer/label.cpp
+
+src/preproc/refer/refer-label.obj: src/preproc/refer/label.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/preproc/refer/refer-label.obj -MD -MP -MF src/preproc/refer/$(DEPDIR)/refer-label.Tpo -c -o src/preproc/refer/refer-label.obj `if test -f 'src/preproc/refer/label.cpp'; then $(CYGPATH_W) 'src/preproc/refer/label.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/refer/label.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/preproc/refer/$(DEPDIR)/refer-label.Tpo src/preproc/refer/$(DEPDIR)/refer-label.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/preproc/refer/label.cpp' object='src/preproc/refer/refer-label.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/preproc/refer/refer-label.obj `if test -f 'src/preproc/refer/label.cpp'; then $(CYGPATH_W) 'src/preproc/refer/label.cpp'; else $(CYGPATH_W) '$(srcdir)/src/preproc/refer/label.cpp'; fi`
+
+.ypp.cpp:
+ $(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h `echo $@ | $(am__yacc_c2h)` y.output $*.output -- $(YACCCOMPILE)
+install-man1: $(man1_MANS)
+ @$(NORMAL_INSTALL)
+ @list1='$(man1_MANS)'; \
+ list2=''; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man1_MANS)'; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+install-man5: $(man5_MANS)
+ @$(NORMAL_INSTALL)
+ @list1='$(man5_MANS)'; \
+ list2=''; \
+ test -n "$(man5dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man5dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man5dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.5[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man5dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man5:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man5_MANS)'; test -n "$(man5dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man5dir)'; $(am__uninstall_files_from_dir)
+install-man7: $(man7_MANS)
+ @$(NORMAL_INSTALL)
+ @list1='$(man7_MANS)'; \
+ list2=''; \
+ test -n "$(man7dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man7dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man7dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.7[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^7][0-9a-z]*$$,7,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man7dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man7dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man7dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man7dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man7:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man7_MANS)'; test -n "$(man7dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^7][0-9a-z]*$$,7,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man7dir)'; $(am__uninstall_files_from_dir)
+install-devX100_12_fontDATA: $(devX100_12_font_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(devX100_12_font_DATA)'; test -n "$(devX100_12_fontdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(devX100_12_fontdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(devX100_12_fontdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devX100_12_fontdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(devX100_12_fontdir)" || exit $$?; \
+ done
+
+uninstall-devX100_12_fontDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(devX100_12_font_DATA)'; test -n "$(devX100_12_fontdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(devX100_12_fontdir)'; $(am__uninstall_files_from_dir)
+install-devX100_fontDATA: $(devX100_font_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(devX100_font_DATA)'; test -n "$(devX100_fontdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(devX100_fontdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(devX100_fontdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devX100_fontdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(devX100_fontdir)" || exit $$?; \
+ done
+
+uninstall-devX100_fontDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(devX100_font_DATA)'; test -n "$(devX100_fontdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(devX100_fontdir)'; $(am__uninstall_files_from_dir)
+install-devX75_12_fontDATA: $(devX75_12_font_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(devX75_12_font_DATA)'; test -n "$(devX75_12_fontdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(devX75_12_fontdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(devX75_12_fontdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devX75_12_fontdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(devX75_12_fontdir)" || exit $$?; \
+ done
+
+uninstall-devX75_12_fontDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(devX75_12_font_DATA)'; test -n "$(devX75_12_fontdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(devX75_12_fontdir)'; $(am__uninstall_files_from_dir)
+install-devX75_fontDATA: $(devX75_font_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(devX75_font_DATA)'; test -n "$(devX75_fontdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(devX75_fontdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(devX75_fontdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devX75_fontdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(devX75_fontdir)" || exit $$?; \
+ done
+
+uninstall-devX75_fontDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(devX75_font_DATA)'; test -n "$(devX75_fontdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(devX75_fontdir)'; $(am__uninstall_files_from_dir)
+install-devasciifontDATA: $(devasciifont_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(devasciifont_DATA)'; test -n "$(devasciifontdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(devasciifontdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(devasciifontdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devasciifontdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(devasciifontdir)" || exit $$?; \
+ done
+
+uninstall-devasciifontDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(devasciifont_DATA)'; test -n "$(devasciifontdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(devasciifontdir)'; $(am__uninstall_files_from_dir)
+install-devcp1047fontDATA: $(devcp1047font_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(devcp1047font_DATA)'; test -n "$(devcp1047fontdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(devcp1047fontdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(devcp1047fontdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devcp1047fontdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(devcp1047fontdir)" || exit $$?; \
+ done
+
+uninstall-devcp1047fontDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(devcp1047font_DATA)'; test -n "$(devcp1047fontdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(devcp1047fontdir)'; $(am__uninstall_files_from_dir)
+install-devdvifontDATA: $(devdvifont_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(devdvifont_DATA)'; test -n "$(devdvifontdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(devdvifontdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(devdvifontdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devdvifontdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(devdvifontdir)" || exit $$?; \
+ done
+
+uninstall-devdvifontDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(devdvifont_DATA)'; test -n "$(devdvifontdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(devdvifontdir)'; $(am__uninstall_files_from_dir)
+install-devdvigenDATA: $(devdvigen_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(devdvigen_DATA)'; test -n "$(devdvigendir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(devdvigendir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(devdvigendir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devdvigendir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(devdvigendir)" || exit $$?; \
+ done
+
+uninstall-devdvigenDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(devdvigen_DATA)'; test -n "$(devdvigendir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(devdvigendir)'; $(am__uninstall_files_from_dir)
+install-devhtmlfontDATA: $(devhtmlfont_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(devhtmlfont_DATA)'; test -n "$(devhtmlfontdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(devhtmlfontdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(devhtmlfontdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devhtmlfontdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(devhtmlfontdir)" || exit $$?; \
+ done
+
+uninstall-devhtmlfontDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(devhtmlfont_DATA)'; test -n "$(devhtmlfontdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(devhtmlfontdir)'; $(am__uninstall_files_from_dir)
+install-devlatin1fontDATA: $(devlatin1font_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(devlatin1font_DATA)'; test -n "$(devlatin1fontdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(devlatin1fontdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(devlatin1fontdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devlatin1fontdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(devlatin1fontdir)" || exit $$?; \
+ done
+
+uninstall-devlatin1fontDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(devlatin1font_DATA)'; test -n "$(devlatin1fontdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(devlatin1fontdir)'; $(am__uninstall_files_from_dir)
+install-devlbpfontDATA: $(devlbpfont_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(devlbpfont_DATA)'; test -n "$(devlbpfontdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(devlbpfontdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(devlbpfontdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devlbpfontdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(devlbpfontdir)" || exit $$?; \
+ done
+
+uninstall-devlbpfontDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(devlbpfont_DATA)'; test -n "$(devlbpfontdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(devlbpfontdir)'; $(am__uninstall_files_from_dir)
+install-devpdffontDATA: $(devpdffont_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(devpdffont_DATA)'; test -n "$(devpdffontdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(devpdffontdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(devpdffontdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devpdffontdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(devpdffontdir)" || exit $$?; \
+ done
+
+uninstall-devpdffontDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(devpdffont_DATA)'; test -n "$(devpdffontdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(devpdffontdir)'; $(am__uninstall_files_from_dir)
+install-devpdffontencDATA: $(devpdffontenc_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(devpdffontenc_DATA)'; test -n "$(devpdffontencdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(devpdffontencdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(devpdffontencdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devpdffontencdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(devpdffontencdir)" || exit $$?; \
+ done
+
+uninstall-devpdffontencDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(devpdffontenc_DATA)'; test -n "$(devpdffontencdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(devpdffontencdir)'; $(am__uninstall_files_from_dir)
+install-devpdffontmapDATA: $(devpdffontmap_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(devpdffontmap_DATA)'; test -n "$(devpdffontmapdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(devpdffontmapdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(devpdffontmapdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devpdffontmapdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(devpdffontmapdir)" || exit $$?; \
+ done
+
+uninstall-devpdffontmapDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(devpdffontmap_DATA)'; test -n "$(devpdffontmapdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(devpdffontmapdir)'; $(am__uninstall_files_from_dir)
+install-devutf8fontDATA: $(devutf8font_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(devutf8font_DATA)'; test -n "$(devutf8fontdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(devutf8fontdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(devutf8fontdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devutf8fontdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(devutf8fontdir)" || exit $$?; \
+ done
+
+uninstall-devutf8fontDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(devutf8font_DATA)'; test -n "$(devutf8fontdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(devutf8fontdir)'; $(am__uninstall_files_from_dir)
+install-dist_chemexampleDATA: $(dist_chemexample_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_chemexample_DATA)'; test -n "$(chemexampledir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(chemexampledir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(chemexampledir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(chemexampledir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(chemexampledir)" || exit $$?; \
+ done
+
+uninstall-dist_chemexampleDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_chemexample_DATA)'; test -n "$(chemexampledir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(chemexampledir)'; $(am__uninstall_files_from_dir)
+install-dist_chempicDATA: $(dist_chempic_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_chempic_DATA)'; test -n "$(chempicdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(chempicdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(chempicdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(chempicdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(chempicdir)" || exit $$?; \
+ done
+
+uninstall-dist_chempicDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_chempic_DATA)'; test -n "$(chempicdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(chempicdir)'; $(am__uninstall_files_from_dir)
+install-dist_devlj4fontDATA: $(dist_devlj4font_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_devlj4font_DATA)'; test -n "$(devlj4fontdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(devlj4fontdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(devlj4fontdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devlj4fontdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(devlj4fontdir)" || exit $$?; \
+ done
+
+uninstall-dist_devlj4fontDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_devlj4font_DATA)'; test -n "$(devlj4fontdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(devlj4fontdir)'; $(am__uninstall_files_from_dir)
+install-dist_devlj4fontgenDATA: $(dist_devlj4fontgen_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_devlj4fontgen_DATA)'; test -n "$(devlj4fontgendir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(devlj4fontgendir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(devlj4fontgendir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devlj4fontgendir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(devlj4fontgendir)" || exit $$?; \
+ done
+
+uninstall-dist_devlj4fontgenDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_devlj4fontgen_DATA)'; test -n "$(devlj4fontgendir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(devlj4fontgendir)'; $(am__uninstall_files_from_dir)
+install-dist_devpsfontDATA: $(dist_devpsfont_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_devpsfont_DATA)'; test -n "$(devpsfontdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(devpsfontdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(devpsfontdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devpsfontdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(devpsfontdir)" || exit $$?; \
+ done
+
+uninstall-dist_devpsfontDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_devpsfont_DATA)'; test -n "$(devpsfontdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(devpsfontdir)'; $(am__uninstall_files_from_dir)
+install-dist_devpsgenDATA: $(dist_devpsgen_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_devpsgen_DATA)'; test -n "$(devpsgendir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(devpsgendir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(devpsgendir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devpsgendir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(devpsgendir)" || exit $$?; \
+ done
+
+uninstall-dist_devpsgenDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_devpsgen_DATA)'; test -n "$(devpsgendir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(devpsgendir)'; $(am__uninstall_files_from_dir)
+install-dist_docexamplesDATA: $(dist_docexamples_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_docexamples_DATA)'; test -n "$(docexamplesdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(docexamplesdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(docexamplesdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docexamplesdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(docexamplesdir)" || exit $$?; \
+ done
+
+uninstall-dist_docexamplesDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_docexamples_DATA)'; test -n "$(docexamplesdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(docexamplesdir)'; $(am__uninstall_files_from_dir)
+install-dist_hdtblexampleDATA: $(dist_hdtblexample_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_hdtblexample_DATA)'; test -n "$(hdtblexampledir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(hdtblexampledir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(hdtblexampledir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(hdtblexampledir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(hdtblexampledir)" || exit $$?; \
+ done
+
+uninstall-dist_hdtblexampleDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_hdtblexample_DATA)'; test -n "$(hdtblexampledir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(hdtblexampledir)'; $(am__uninstall_files_from_dir)
+install-dist_hdtbltmacDATA: $(dist_hdtbltmac_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_hdtbltmac_DATA)'; test -n "$(hdtbltmacdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(hdtbltmacdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(hdtbltmacdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(hdtbltmacdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(hdtbltmacdir)" || exit $$?; \
+ done
+
+uninstall-dist_hdtbltmacDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_hdtbltmac_DATA)'; test -n "$(hdtbltmacdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(hdtbltmacdir)'; $(am__uninstall_files_from_dir)
+install-dist_localtmacDATA: $(dist_localtmac_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_localtmac_DATA)'; test -n "$(localtmacdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(localtmacdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(localtmacdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(localtmacdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(localtmacdir)" || exit $$?; \
+ done
+
+uninstall-dist_localtmacDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_localtmac_DATA)'; test -n "$(localtmacdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(localtmacdir)'; $(am__uninstall_files_from_dir)
+install-dist_mdocDATA: $(dist_mdoc_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_mdoc_DATA)'; test -n "$(mdocdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(mdocdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(mdocdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(mdocdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(mdocdir)" || exit $$?; \
+ done
+
+uninstall-dist_mdocDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_mdoc_DATA)'; test -n "$(mdocdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(mdocdir)'; $(am__uninstall_files_from_dir)
+install-dist_mmDATA: $(dist_mm_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_mm_DATA)'; test -n "$(mmdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(mmdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(mmdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(mmdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(mmdir)" || exit $$?; \
+ done
+
+uninstall-dist_mmDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_mm_DATA)'; test -n "$(mmdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(mmdir)'; $(am__uninstall_files_from_dir)
+install-dist_mmexampleDATA: $(dist_mmexample_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_mmexample_DATA)'; test -n "$(mmexampledir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(mmexampledir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(mmexampledir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(mmexampledir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(mmexampledir)" || exit $$?; \
+ done
+
+uninstall-dist_mmexampleDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_mmexample_DATA)'; test -n "$(mmexampledir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(mmexampledir)'; $(am__uninstall_files_from_dir)
+install-dist_momexampleDATA: $(dist_momexample_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_momexample_DATA)'; test -n "$(momexampledir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(momexampledir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(momexampledir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(momexampledir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(momexampledir)" || exit $$?; \
+ done
+
+uninstall-dist_momexampleDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_momexample_DATA)'; test -n "$(momexampledir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(momexampledir)'; $(am__uninstall_files_from_dir)
+install-dist_momtmacDATA: $(dist_momtmac_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_momtmac_DATA)'; test -n "$(momtmacdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(momtmacdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(momtmacdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(momtmacdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(momtmacdir)" || exit $$?; \
+ done
+
+uninstall-dist_momtmacDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_momtmac_DATA)'; test -n "$(momtmacdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(momtmacdir)'; $(am__uninstall_files_from_dir)
+install-dist_olddevpsfontDATA: $(dist_olddevpsfont_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_olddevpsfont_DATA)'; test -n "$(olddevpsfontdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(olddevpsfontdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(olddevpsfontdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(olddevpsfontdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(olddevpsfontdir)" || exit $$?; \
+ done
+
+uninstall-dist_olddevpsfontDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_olddevpsfont_DATA)'; test -n "$(olddevpsfontdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(olddevpsfontdir)'; $(am__uninstall_files_from_dir)
+install-dist_otherdocDATA: $(dist_otherdoc_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_otherdoc_DATA)'; test -n "$(otherdocdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(otherdocdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(otherdocdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(otherdocdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(otherdocdir)" || exit $$?; \
+ done
+
+uninstall-dist_otherdocDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_otherdoc_DATA)'; test -n "$(otherdocdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(otherdocdir)'; $(am__uninstall_files_from_dir)
+install-dist_pdfmarktmacDATA: $(dist_pdfmarktmac_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_pdfmarktmac_DATA)'; test -n "$(pdfmarktmacdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pdfmarktmacdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pdfmarktmacdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfmarktmacdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfmarktmacdir)" || exit $$?; \
+ done
+
+uninstall-dist_pdfmarktmacDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_pdfmarktmac_DATA)'; test -n "$(pdfmarktmacdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(pdfmarktmacdir)'; $(am__uninstall_files_from_dir)
+install-dist_rfc1345tmacDATA: $(dist_rfc1345tmac_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_rfc1345tmac_DATA)'; test -n "$(rfc1345tmacdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(rfc1345tmacdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(rfc1345tmacdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(rfc1345tmacdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(rfc1345tmacdir)" || exit $$?; \
+ done
+
+uninstall-dist_rfc1345tmacDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_rfc1345tmac_DATA)'; test -n "$(rfc1345tmacdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(rfc1345tmacdir)'; $(am__uninstall_files_from_dir)
+install-dist_sboxestmacDATA: $(dist_sboxestmac_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_sboxestmac_DATA)'; test -n "$(sboxestmacdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(sboxestmacdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(sboxestmacdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(sboxestmacdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(sboxestmacdir)" || exit $$?; \
+ done
+
+uninstall-dist_sboxestmacDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_sboxestmac_DATA)'; test -n "$(sboxestmacdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(sboxestmacdir)'; $(am__uninstall_files_from_dir)
+install-dist_tmacDATA: $(dist_tmac_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_tmac_DATA)'; test -n "$(tmacdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(tmacdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(tmacdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(tmacdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(tmacdir)" || exit $$?; \
+ done
+
+uninstall-dist_tmacDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_tmac_DATA)'; test -n "$(tmacdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(tmacdir)'; $(am__uninstall_files_from_dir)
+install-dist_tmacmmDATA: $(dist_tmacmm_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_tmacmm_DATA)'; test -n "$(tmacmmdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(tmacmmdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(tmacmmdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(tmacmmdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(tmacmmdir)" || exit $$?; \
+ done
+
+uninstall-dist_tmacmmDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_tmacmm_DATA)'; test -n "$(tmacmmdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(tmacmmdir)'; $(am__uninstall_files_from_dir)
+install-htmlpicDATA: $(htmlpic_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(htmlpic_DATA)'; test -n "$(htmlpicdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(htmlpicdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(htmlpicdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmlpicdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(htmlpicdir)" || exit $$?; \
+ done
+
+uninstall-htmlpicDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(htmlpic_DATA)'; test -n "$(htmlpicdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(htmlpicdir)'; $(am__uninstall_files_from_dir)
+install-momhtmlDATA: $(momhtml_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(momhtml_DATA)'; test -n "$(momhtmldir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(momhtmldir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(momhtmldir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(momhtmldir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(momhtmldir)" || exit $$?; \
+ done
+
+uninstall-momhtmlDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(momhtml_DATA)'; test -n "$(momhtmldir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(momhtmldir)'; $(am__uninstall_files_from_dir)
+install-nodist_chemexampleDATA: $(nodist_chemexample_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(nodist_chemexample_DATA)'; test -n "$(chemexampledir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(chemexampledir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(chemexampledir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(chemexampledir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(chemexampledir)" || exit $$?; \
+ done
+
+uninstall-nodist_chemexampleDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_chemexample_DATA)'; test -n "$(chemexampledir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(chemexampledir)'; $(am__uninstall_files_from_dir)
+install-nodist_chemexample122DATA: $(nodist_chemexample122_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(nodist_chemexample122_DATA)'; test -n "$(chemexample122dir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(chemexample122dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(chemexample122dir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(chemexample122dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(chemexample122dir)" || exit $$?; \
+ done
+
+uninstall-nodist_chemexample122DATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_chemexample122_DATA)'; test -n "$(chemexample122dir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(chemexample122dir)'; $(am__uninstall_files_from_dir)
+install-nodist_devlj4fontDATA: $(nodist_devlj4font_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(nodist_devlj4font_DATA)'; test -n "$(devlj4fontdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(devlj4fontdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(devlj4fontdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devlj4fontdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(devlj4fontdir)" || exit $$?; \
+ done
+
+uninstall-nodist_devlj4fontDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_devlj4font_DATA)'; test -n "$(devlj4fontdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(devlj4fontdir)'; $(am__uninstall_files_from_dir)
+install-nodist_devpsfontDATA: $(nodist_devpsfont_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(nodist_devpsfont_DATA)'; test -n "$(devpsfontdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(devpsfontdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(devpsfontdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devpsfontdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(devpsfontdir)" || exit $$?; \
+ done
+
+uninstall-nodist_devpsfontDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_devpsfont_DATA)'; test -n "$(devpsfontdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(devpsfontdir)'; $(am__uninstall_files_from_dir)
+install-nodist_docexamplesDATA: $(nodist_docexamples_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(nodist_docexamples_DATA)'; test -n "$(docexamplesdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(docexamplesdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(docexamplesdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docexamplesdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(docexamplesdir)" || exit $$?; \
+ done
+
+uninstall-nodist_docexamplesDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_docexamples_DATA)'; test -n "$(docexamplesdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(docexamplesdir)'; $(am__uninstall_files_from_dir)
+install-nodist_docpdfdocDATA: $(nodist_docpdfdoc_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(nodist_docpdfdoc_DATA)'; test -n "$(docpdfdocdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(docpdfdocdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(docpdfdocdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docpdfdocdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(docpdfdocdir)" || exit $$?; \
+ done
+
+uninstall-nodist_docpdfdocDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_docpdfdoc_DATA)'; test -n "$(docpdfdocdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(docpdfdocdir)'; $(am__uninstall_files_from_dir)
+install-nodist_hdtblexampleDATA: $(nodist_hdtblexample_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(nodist_hdtblexample_DATA)'; test -n "$(hdtblexampledir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(hdtblexampledir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(hdtblexampledir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(hdtblexampledir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(hdtblexampledir)" || exit $$?; \
+ done
+
+uninstall-nodist_hdtblexampleDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_hdtblexample_DATA)'; test -n "$(hdtblexampledir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(hdtblexampledir)'; $(am__uninstall_files_from_dir)
+install-nodist_momprocessedexampleDATA: $(nodist_momprocessedexample_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(nodist_momprocessedexample_DATA)'; test -n "$(momprocessedexampledir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(momprocessedexampledir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(momprocessedexampledir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(momprocessedexampledir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(momprocessedexampledir)" || exit $$?; \
+ done
+
+uninstall-nodist_momprocessedexampleDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_momprocessedexample_DATA)'; test -n "$(momprocessedexampledir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(momprocessedexampledir)'; $(am__uninstall_files_from_dir)
+install-nodist_otherdocDATA: $(nodist_otherdoc_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(nodist_otherdoc_DATA)'; test -n "$(otherdocdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(otherdocdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(otherdocdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(otherdocdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(otherdocdir)" || exit $$?; \
+ done
+
+uninstall-nodist_otherdocDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_otherdoc_DATA)'; test -n "$(otherdocdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(otherdocdir)'; $(am__uninstall_files_from_dir)
+install-nodist_pdfmarkpdfdocDATA: $(nodist_pdfmarkpdfdoc_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(nodist_pdfmarkpdfdoc_DATA)'; test -n "$(pdfmarkpdfdocdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pdfmarkpdfdocdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pdfmarkpdfdocdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfmarkpdfdocdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfmarkpdfdocdir)" || exit $$?; \
+ done
+
+uninstall-nodist_pdfmarkpdfdocDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_pdfmarkpdfdoc_DATA)'; test -n "$(pdfmarkpdfdocdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(pdfmarkpdfdocdir)'; $(am__uninstall_files_from_dir)
+install-nodist_sboxesotherdocDATA: $(nodist_sboxesotherdoc_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(nodist_sboxesotherdoc_DATA)'; test -n "$(sboxesotherdocdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(sboxesotherdocdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(sboxesotherdocdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(sboxesotherdocdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(sboxesotherdocdir)" || exit $$?; \
+ done
+
+uninstall-nodist_sboxesotherdocDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_sboxesotherdoc_DATA)'; test -n "$(sboxesotherdocdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(sboxesotherdocdir)'; $(am__uninstall_files_from_dir)
+install-nodist_sboxespdfdocDATA: $(nodist_sboxespdfdoc_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(nodist_sboxespdfdoc_DATA)'; test -n "$(sboxespdfdocdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(sboxespdfdocdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(sboxespdfdocdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(sboxespdfdocdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(sboxespdfdocdir)" || exit $$?; \
+ done
+
+uninstall-nodist_sboxespdfdocDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_sboxespdfdoc_DATA)'; test -n "$(sboxespdfdocdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(sboxespdfdocdir)'; $(am__uninstall_files_from_dir)
+install-nodist_tmacDATA: $(nodist_tmac_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(nodist_tmac_DATA)'; test -n "$(tmacdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(tmacdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(tmacdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(tmacdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(tmacdir)" || exit $$?; \
+ done
+
+uninstall-nodist_tmacDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_tmac_DATA)'; test -n "$(tmacdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(tmacdir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+ test ! -s cscope.files \
+ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+ -rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+ -rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS: $(check_PROGRAMS) $(check_SCRIPTS)
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all $(check_PROGRAMS) $(check_SCRIPTS)
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+contrib/gdiffmk/tests/runtests.sh.log: contrib/gdiffmk/tests/runtests.sh
+ @p='contrib/gdiffmk/tests/runtests.sh'; \
+ b='contrib/gdiffmk/tests/runtests.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+contrib/hdtbl/examples/test-hdtbl.sh.log: contrib/hdtbl/examples/test-hdtbl.sh
+ @p='contrib/hdtbl/examples/test-hdtbl.sh'; \
+ b='contrib/hdtbl/examples/test-hdtbl.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+contrib/mm/tests/LT_SP_AU_without_AT_works.sh.log: contrib/mm/tests/LT_SP_AU_without_AT_works.sh
+ @p='contrib/mm/tests/LT_SP_AU_without_AT_works.sh'; \
+ b='contrib/mm/tests/LT_SP_AU_without_AT_works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+contrib/mm/tests/LT_SP_multi-word_LO_SJ_works.sh.log: contrib/mm/tests/LT_SP_multi-word_LO_SJ_works.sh
+ @p='contrib/mm/tests/LT_SP_multi-word_LO_SJ_works.sh'; \
+ b='contrib/mm/tests/LT_SP_multi-word_LO_SJ_works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+contrib/mm/tests/MT-1-reports-all-TM-numbers.sh.log: contrib/mm/tests/MT-1-reports-all-TM-numbers.sh
+ @p='contrib/mm/tests/MT-1-reports-all-TM-numbers.sh'; \
+ b='contrib/mm/tests/MT-1-reports-all-TM-numbers.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+contrib/mm/tests/MT_5_includes_AT_in_SG.sh.log: contrib/mm/tests/MT_5_includes_AT_in_SG.sh
+ @p='contrib/mm/tests/MT_5_includes_AT_in_SG.sh'; \
+ b='contrib/mm/tests/MT_5_includes_AT_in_SG.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+contrib/mm/tests/P-indentation-works.sh.log: contrib/mm/tests/P-indentation-works.sh
+ @p='contrib/mm/tests/P-indentation-works.sh'; \
+ b='contrib/mm/tests/P-indentation-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+contrib/mm/tests/ms_cover_sheet_robust_to_missing_AF.sh.log: contrib/mm/tests/ms_cover_sheet_robust_to_missing_AF.sh
+ @p='contrib/mm/tests/ms_cover_sheet_robust_to_missing_AF.sh'; \
+ b='contrib/mm/tests/ms_cover_sheet_robust_to_missing_AF.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+contrib/mm/tests/mse_has-sufficient-footnote-space.sh.log: contrib/mm/tests/mse_has-sufficient-footnote-space.sh
+ @p='contrib/mm/tests/mse_has-sufficient-footnote-space.sh'; \
+ b='contrib/mm/tests/mse_has-sufficient-footnote-space.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+contrib/mm/tests/place-equation-labels-correctly-in-displays.sh.log: contrib/mm/tests/place-equation-labels-correctly-in-displays.sh
+ @p='contrib/mm/tests/place-equation-labels-correctly-in-displays.sh'; \
+ b='contrib/mm/tests/place-equation-labels-correctly-in-displays.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+contrib/mm/tests/remove-stale-bib-entry-data.sh.log: contrib/mm/tests/remove-stale-bib-entry-data.sh
+ @p='contrib/mm/tests/remove-stale-bib-entry-data.sh'; \
+ b='contrib/mm/tests/remove-stale-bib-entry-data.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+contrib/mm/tests/short-pages-do-not-overflow-stack.sh.log: contrib/mm/tests/short-pages-do-not-overflow-stack.sh
+ @p='contrib/mm/tests/short-pages-do-not-overflow-stack.sh'; \
+ b='contrib/mm/tests/short-pages-do-not-overflow-stack.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+contrib/mom/examples/tests-mom.sh.log: contrib/mom/examples/tests-mom.sh
+ @p='contrib/mom/examples/tests-mom.sh'; \
+ b='contrib/mom/examples/tests-mom.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+contrib/rfc1345/tests/rfc1345-smoke-test.sh.log: contrib/rfc1345/tests/rfc1345-smoke-test.sh
+ @p='contrib/rfc1345/tests/rfc1345-smoke-test.sh'; \
+ b='contrib/rfc1345/tests/rfc1345-smoke-test.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+font/devpdf/tests/check-default-foundry.sh.log: font/devpdf/tests/check-default-foundry.sh
+ @p='font/devpdf/tests/check-default-foundry.sh'; \
+ b='font/devpdf/tests/check-default-foundry.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+font/devpdf/tests/check-urw-foundry.sh.log: font/devpdf/tests/check-urw-foundry.sh
+ @p='font/devpdf/tests/check-urw-foundry.sh'; \
+ b='font/devpdf/tests/check-urw-foundry.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh.log: src/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh
+ @p='src/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh'; \
+ b='src/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/devices/grotty/tests/osc8_works.sh.log: src/devices/grotty/tests/osc8_works.sh
+ @p='src/devices/grotty/tests/osc8_works.sh'; \
+ b='src/devices/grotty/tests/osc8_works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/eqn/tests/diagnostics-report-correct-line-numbers.sh.log: src/preproc/eqn/tests/diagnostics-report-correct-line-numbers.sh
+ @p='src/preproc/eqn/tests/diagnostics-report-correct-line-numbers.sh'; \
+ b='src/preproc/eqn/tests/diagnostics-report-correct-line-numbers.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/preconv/tests/do-not-seek-the-unseekable.sh.log: src/preproc/preconv/tests/do-not-seek-the-unseekable.sh
+ @p='src/preproc/preconv/tests/do-not-seek-the-unseekable.sh'; \
+ b='src/preproc/preconv/tests/do-not-seek-the-unseekable.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/preconv/tests/smoke-test.sh.log: src/preproc/preconv/tests/smoke-test.sh
+ @p='src/preproc/preconv/tests/smoke-test.sh'; \
+ b='src/preproc/preconv/tests/smoke-test.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/refer/tests/report-correct-line-numbers.sh.log: src/preproc/refer/tests/report-correct-line-numbers.sh
+ @p='src/preproc/refer/tests/report-correct-line-numbers.sh'; \
+ b='src/preproc/refer/tests/report-correct-line-numbers.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/tbl/tests/boxes-and-vertical-rules.sh.log: src/preproc/tbl/tests/boxes-and-vertical-rules.sh
+ @p='src/preproc/tbl/tests/boxes-and-vertical-rules.sh'; \
+ b='src/preproc/tbl/tests/boxes-and-vertical-rules.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/tbl/tests/check-horizontal-line-length.sh.log: src/preproc/tbl/tests/check-horizontal-line-length.sh
+ @p='src/preproc/tbl/tests/check-horizontal-line-length.sh'; \
+ b='src/preproc/tbl/tests/check-horizontal-line-length.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/tbl/tests/check-line-intersections.sh.log: src/preproc/tbl/tests/check-line-intersections.sh
+ @p='src/preproc/tbl/tests/check-line-intersections.sh'; \
+ b='src/preproc/tbl/tests/check-line-intersections.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/tbl/tests/check-vertical-line-length.sh.log: src/preproc/tbl/tests/check-vertical-line-length.sh
+ @p='src/preproc/tbl/tests/check-vertical-line-length.sh'; \
+ b='src/preproc/tbl/tests/check-vertical-line-length.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/tbl/tests/cooperate-with-nm-request.sh.log: src/preproc/tbl/tests/cooperate-with-nm-request.sh
+ @p='src/preproc/tbl/tests/cooperate-with-nm-request.sh'; \
+ b='src/preproc/tbl/tests/cooperate-with-nm-request.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/tbl/tests/count-continued-input-lines.sh.log: src/preproc/tbl/tests/count-continued-input-lines.sh
+ @p='src/preproc/tbl/tests/count-continued-input-lines.sh'; \
+ b='src/preproc/tbl/tests/count-continued-input-lines.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/tbl/tests/do-not-overdraw-page-top-in-nroff-mode.sh.log: src/preproc/tbl/tests/do-not-overdraw-page-top-in-nroff-mode.sh
+ @p='src/preproc/tbl/tests/do-not-overdraw-page-top-in-nroff-mode.sh'; \
+ b='src/preproc/tbl/tests/do-not-overdraw-page-top-in-nroff-mode.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/tbl/tests/do-not-overlap-bottom-border-in-nroff.sh.log: src/preproc/tbl/tests/do-not-overlap-bottom-border-in-nroff.sh
+ @p='src/preproc/tbl/tests/do-not-overlap-bottom-border-in-nroff.sh'; \
+ b='src/preproc/tbl/tests/do-not-overlap-bottom-border-in-nroff.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/tbl/tests/do-not-segv-on-invalid-vertical-span-entry.sh.log: src/preproc/tbl/tests/do-not-segv-on-invalid-vertical-span-entry.sh
+ @p='src/preproc/tbl/tests/do-not-segv-on-invalid-vertical-span-entry.sh'; \
+ b='src/preproc/tbl/tests/do-not-segv-on-invalid-vertical-span-entry.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/tbl/tests/do-not-segv-when-backslash-R-in-text-block.sh.log: src/preproc/tbl/tests/do-not-segv-when-backslash-R-in-text-block.sh
+ @p='src/preproc/tbl/tests/do-not-segv-when-backslash-R-in-text-block.sh'; \
+ b='src/preproc/tbl/tests/do-not-segv-when-backslash-R-in-text-block.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/tbl/tests/expand-region-option-works.sh.log: src/preproc/tbl/tests/expand-region-option-works.sh
+ @p='src/preproc/tbl/tests/expand-region-option-works.sh'; \
+ b='src/preproc/tbl/tests/expand-region-option-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/tbl/tests/format-time-diagnostics-work.sh.log: src/preproc/tbl/tests/format-time-diagnostics-work.sh
+ @p='src/preproc/tbl/tests/format-time-diagnostics-work.sh'; \
+ b='src/preproc/tbl/tests/format-time-diagnostics-work.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/tbl/tests/save-and-restore-hyphenation-parameters.sh.log: src/preproc/tbl/tests/save-and-restore-hyphenation-parameters.sh
+ @p='src/preproc/tbl/tests/save-and-restore-hyphenation-parameters.sh'; \
+ b='src/preproc/tbl/tests/save-and-restore-hyphenation-parameters.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/tbl/tests/save-and-restore-inter-sentence-space.sh.log: src/preproc/tbl/tests/save-and-restore-inter-sentence-space.sh
+ @p='src/preproc/tbl/tests/save-and-restore-inter-sentence-space.sh'; \
+ b='src/preproc/tbl/tests/save-and-restore-inter-sentence-space.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/tbl/tests/save-and-restore-line-numbering.sh.log: src/preproc/tbl/tests/save-and-restore-line-numbering.sh
+ @p='src/preproc/tbl/tests/save-and-restore-line-numbering.sh'; \
+ b='src/preproc/tbl/tests/save-and-restore-line-numbering.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/tbl/tests/save-and-restore-tab-stops.sh.log: src/preproc/tbl/tests/save-and-restore-tab-stops.sh
+ @p='src/preproc/tbl/tests/save-and-restore-tab-stops.sh'; \
+ b='src/preproc/tbl/tests/save-and-restore-tab-stops.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/tbl/tests/warn-on-long-boxed-unkept-table.sh.log: src/preproc/tbl/tests/warn-on-long-boxed-unkept-table.sh
+ @p='src/preproc/tbl/tests/warn-on-long-boxed-unkept-table.sh'; \
+ b='src/preproc/tbl/tests/warn-on-long-boxed-unkept-table.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/preproc/tbl/tests/x-column-modifier-works.sh.log: src/preproc/tbl/tests/x-column-modifier-works.sh
+ @p='src/preproc/tbl/tests/x-column-modifier-works.sh'; \
+ b='src/preproc/tbl/tests/x-column-modifier-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/ab_works.sh.log: src/roff/groff/tests/ab_works.sh
+ @p='src/roff/groff/tests/ab_works.sh'; \
+ b='src/roff/groff/tests/ab_works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/adjustment_works.sh.log: src/roff/groff/tests/adjustment_works.sh
+ @p='src/roff/groff/tests/adjustment_works.sh'; \
+ b='src/roff/groff/tests/adjustment_works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/break_zero-length_output_line_sanely.sh.log: src/roff/groff/tests/break_zero-length_output_line_sanely.sh
+ @p='src/roff/groff/tests/break_zero-length_output_line_sanely.sh'; \
+ b='src/roff/groff/tests/break_zero-length_output_line_sanely.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/device_control_escapes_express_basic_latin.sh.log: src/roff/groff/tests/device_control_escapes_express_basic_latin.sh
+ @p='src/roff/groff/tests/device_control_escapes_express_basic_latin.sh'; \
+ b='src/roff/groff/tests/device_control_escapes_express_basic_latin.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/do_not_loop_infinitely_when_breaking_cjk.sh.log: src/roff/groff/tests/do_not_loop_infinitely_when_breaking_cjk.sh
+ @p='src/roff/groff/tests/do_not_loop_infinitely_when_breaking_cjk.sh'; \
+ b='src/roff/groff/tests/do_not_loop_infinitely_when_breaking_cjk.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/dot-cp_register_works.sh.log: src/roff/groff/tests/dot-cp_register_works.sh
+ @p='src/roff/groff/tests/dot-cp_register_works.sh'; \
+ b='src/roff/groff/tests/dot-cp_register_works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/dot-nm_register_works.sh.log: src/roff/groff/tests/dot-nm_register_works.sh
+ @p='src/roff/groff/tests/dot-nm_register_works.sh'; \
+ b='src/roff/groff/tests/dot-nm_register_works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/dot-nn_register_works.sh.log: src/roff/groff/tests/dot-nn_register_works.sh
+ @p='src/roff/groff/tests/dot-nn_register_works.sh'; \
+ b='src/roff/groff/tests/dot-nn_register_works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/evc_produces_no_output_if_invalid.sh.log: src/roff/groff/tests/evc_produces_no_output_if_invalid.sh
+ @p='src/roff/groff/tests/evc_produces_no_output_if_invalid.sh'; \
+ b='src/roff/groff/tests/evc_produces_no_output_if_invalid.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/fp_should_not_traverse_directories.sh.log: src/roff/groff/tests/fp_should_not_traverse_directories.sh
+ @p='src/roff/groff/tests/fp_should_not_traverse_directories.sh'; \
+ b='src/roff/groff/tests/fp_should_not_traverse_directories.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/handle_special_input_code_points.sh.log: src/roff/groff/tests/handle_special_input_code_points.sh
+ @p='src/roff/groff/tests/handle_special_input_code_points.sh'; \
+ b='src/roff/groff/tests/handle_special_input_code_points.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/html_works_with_grn_and_eqn.sh.log: src/roff/groff/tests/html_works_with_grn_and_eqn.sh
+ @p='src/roff/groff/tests/html_works_with_grn_and_eqn.sh'; \
+ b='src/roff/groff/tests/html_works_with_grn_and_eqn.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/initialization_is_quiet.sh.log: src/roff/groff/tests/initialization_is_quiet.sh
+ @p='src/roff/groff/tests/initialization_is_quiet.sh'; \
+ b='src/roff/groff/tests/initialization_is_quiet.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/localization_works.sh.log: src/roff/groff/tests/localization_works.sh
+ @p='src/roff/groff/tests/localization_works.sh'; \
+ b='src/roff/groff/tests/localization_works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/msoquiet_works.sh.log: src/roff/groff/tests/msoquiet_works.sh
+ @p='src/roff/groff/tests/msoquiet_works.sh'; \
+ b='src/roff/groff/tests/msoquiet_works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/on_latin1_device_oq_is_0x27.sh.log: src/roff/groff/tests/on_latin1_device_oq_is_0x27.sh
+ @p='src/roff/groff/tests/on_latin1_device_oq_is_0x27.sh'; \
+ b='src/roff/groff/tests/on_latin1_device_oq_is_0x27.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/output_driver_C_and_G_options_work.sh.log: src/roff/groff/tests/output_driver_C_and_G_options_work.sh
+ @p='src/roff/groff/tests/output_driver_C_and_G_options_work.sh'; \
+ b='src/roff/groff/tests/output_driver_C_and_G_options_work.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/recognize_end_of_sentence.sh.log: src/roff/groff/tests/recognize_end_of_sentence.sh
+ @p='src/roff/groff/tests/recognize_end_of_sentence.sh'; \
+ b='src/roff/groff/tests/recognize_end_of_sentence.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/regression_savannah_56555.sh.log: src/roff/groff/tests/regression_savannah_56555.sh
+ @p='src/roff/groff/tests/regression_savannah_56555.sh'; \
+ b='src/roff/groff/tests/regression_savannah_56555.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/regression_savannah_58153.sh.log: src/roff/groff/tests/regression_savannah_58153.sh
+ @p='src/roff/groff/tests/regression_savannah_58153.sh'; \
+ b='src/roff/groff/tests/regression_savannah_58153.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/regression_savannah_58162.sh.log: src/roff/groff/tests/regression_savannah_58162.sh
+ @p='src/roff/groff/tests/regression_savannah_58162.sh'; \
+ b='src/roff/groff/tests/regression_savannah_58162.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/regression_savannah_58337.sh.log: src/roff/groff/tests/regression_savannah_58337.sh
+ @p='src/roff/groff/tests/regression_savannah_58337.sh'; \
+ b='src/roff/groff/tests/regression_savannah_58337.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/regression_savannah_59202.sh.log: src/roff/groff/tests/regression_savannah_59202.sh
+ @p='src/roff/groff/tests/regression_savannah_59202.sh'; \
+ b='src/roff/groff/tests/regression_savannah_59202.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/smoke-test_html_device.sh.log: src/roff/groff/tests/smoke-test_html_device.sh
+ @p='src/roff/groff/tests/smoke-test_html_device.sh'; \
+ b='src/roff/groff/tests/smoke-test_html_device.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/some_escapes_accept_newline_delimiters.sh.log: src/roff/groff/tests/some_escapes_accept_newline_delimiters.sh
+ @p='src/roff/groff/tests/some_escapes_accept_newline_delimiters.sh'; \
+ b='src/roff/groff/tests/some_escapes_accept_newline_delimiters.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/soquiet_works.sh.log: src/roff/groff/tests/soquiet_works.sh
+ @p='src/roff/groff/tests/soquiet_works.sh'; \
+ b='src/roff/groff/tests/soquiet_works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/string_case_xform_errors.sh.log: src/roff/groff/tests/string_case_xform_errors.sh
+ @p='src/roff/groff/tests/string_case_xform_errors.sh'; \
+ b='src/roff/groff/tests/string_case_xform_errors.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/string_case_xform_requests.sh.log: src/roff/groff/tests/string_case_xform_requests.sh
+ @p='src/roff/groff/tests/string_case_xform_requests.sh'; \
+ b='src/roff/groff/tests/string_case_xform_requests.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/string_case_xform_unicode_escape.sh.log: src/roff/groff/tests/string_case_xform_unicode_escape.sh
+ @p='src/roff/groff/tests/string_case_xform_unicode_escape.sh'; \
+ b='src/roff/groff/tests/string_case_xform_unicode_escape.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/substring_works.sh.log: src/roff/groff/tests/substring_works.sh
+ @p='src/roff/groff/tests/substring_works.sh'; \
+ b='src/roff/groff/tests/substring_works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/groff/tests/use_point_size_escape_with_single_digit_arg.sh.log: src/roff/groff/tests/use_point_size_escape_with_single_digit_arg.sh
+ @p='src/roff/groff/tests/use_point_size_escape_with_single_digit_arg.sh'; \
+ b='src/roff/groff/tests/use_point_size_escape_with_single_digit_arg.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/roff/nroff/tests/verbose_option_works.sh.log: src/roff/nroff/tests/verbose_option_works.sh
+ @p='src/roff/nroff/tests/verbose_option_works.sh'; \
+ b='src/roff/nroff/tests/verbose_option_works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/utils/grog/tests/PF-does-not-start-pic-region.sh.log: src/utils/grog/tests/PF-does-not-start-pic-region.sh
+ @p='src/utils/grog/tests/PF-does-not-start-pic-region.sh'; \
+ b='src/utils/grog/tests/PF-does-not-start-pic-region.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/utils/grog/tests/avoid-refer-fakeout.sh.log: src/utils/grog/tests/avoid-refer-fakeout.sh
+ @p='src/utils/grog/tests/avoid-refer-fakeout.sh'; \
+ b='src/utils/grog/tests/avoid-refer-fakeout.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/utils/grog/tests/preserve-groff-options.sh.log: src/utils/grog/tests/preserve-groff-options.sh
+ @p='src/utils/grog/tests/preserve-groff-options.sh'; \
+ b='src/utils/grog/tests/preserve-groff-options.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/utils/grog/tests/recognize-perl-pod.sh.log: src/utils/grog/tests/recognize-perl-pod.sh
+ @p='src/utils/grog/tests/recognize-perl-pod.sh'; \
+ b='src/utils/grog/tests/recognize-perl-pod.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+src/utils/grog/tests/smoke-test.sh.log: src/utils/grog/tests/smoke-test.sh
+ @p='src/utils/grog/tests/smoke-test.sh'; \
+ b='src/utils/grog/tests/smoke-test.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an-ext_MR-works.sh.log: tmac/tests/an-ext_MR-works.sh
+ @p='tmac/tests/an-ext_MR-works.sh'; \
+ b='tmac/tests/an-ext_MR-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an-ext_MT-works.sh.log: tmac/tests/an-ext_MT-works.sh
+ @p='tmac/tests/an-ext_MT-works.sh'; \
+ b='tmac/tests/an-ext_MT-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an-ext_UR-works.sh.log: tmac/tests/an-ext_UR-works.sh
+ @p='tmac/tests/an-ext_UR-works.sh'; \
+ b='tmac/tests/an-ext_UR-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_AT-and-UC-footer-saved-and-restored.sh.log: tmac/tests/an_AT-and-UC-footer-saved-and-restored.sh
+ @p='tmac/tests/an_AT-and-UC-footer-saved-and-restored.sh'; \
+ b='tmac/tests/an_AT-and-UC-footer-saved-and-restored.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_CS-register-off.sh.log: tmac/tests/an_CS-register-off.sh
+ @p='tmac/tests/an_CS-register-off.sh'; \
+ b='tmac/tests/an_CS-register-off.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_CS-register-on.sh.log: tmac/tests/an_CS-register-on.sh
+ @p='tmac/tests/an_CS-register-on.sh'; \
+ b='tmac/tests/an_CS-register-on.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_CS-register-unspecified.sh.log: tmac/tests/an_CS-register-unspecified.sh
+ @p='tmac/tests/an_CS-register-unspecified.sh'; \
+ b='tmac/tests/an_CS-register-unspecified.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_CT-register-off.sh.log: tmac/tests/an_CT-register-off.sh
+ @p='tmac/tests/an_CT-register-off.sh'; \
+ b='tmac/tests/an_CT-register-off.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_CT-register-on.sh.log: tmac/tests/an_CT-register-on.sh
+ @p='tmac/tests/an_CT-register-on.sh'; \
+ b='tmac/tests/an_CT-register-on.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_CT-register-unspecified.sh.log: tmac/tests/an_CT-register-unspecified.sh
+ @p='tmac/tests/an_CT-register-unspecified.sh'; \
+ b='tmac/tests/an_CT-register-unspecified.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_FT-bad-value-should-not-trash-titles.sh.log: tmac/tests/an_FT-bad-value-should-not-trash-titles.sh
+ @p='tmac/tests/an_FT-bad-value-should-not-trash-titles.sh'; \
+ b='tmac/tests/an_FT-bad-value-should-not-trash-titles.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_HY-register-works.sh.log: tmac/tests/an_HY-register-works.sh
+ @p='tmac/tests/an_HY-register-works.sh'; \
+ b='tmac/tests/an_HY-register-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_LL-init-sanely.sh.log: tmac/tests/an_LL-init-sanely.sh
+ @p='tmac/tests/an_LL-init-sanely.sh'; \
+ b='tmac/tests/an_LL-init-sanely.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_ME-punct-hyphenates.sh.log: tmac/tests/an_ME-punct-hyphenates.sh
+ @p='tmac/tests/an_ME-punct-hyphenates.sh'; \
+ b='tmac/tests/an_ME-punct-hyphenates.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_MR-works.sh.log: tmac/tests/an_MR-works.sh
+ @p='tmac/tests/an_MR-works.sh'; \
+ b='tmac/tests/an_MR-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_MT-body-hyphenates.sh.log: tmac/tests/an_MT-body-hyphenates.sh
+ @p='tmac/tests/an_MT-body-hyphenates.sh'; \
+ b='tmac/tests/an_MT-body-hyphenates.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_MT-works.sh.log: tmac/tests/an_MT-works.sh
+ @p='tmac/tests/an_MT-works.sh'; \
+ b='tmac/tests/an_MT-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_P-register-works.sh.log: tmac/tests/an_P-register-works.sh
+ @p='tmac/tests/an_P-register-works.sh'; \
+ b='tmac/tests/an_P-register-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_TH-repairs-ad-damage.sh.log: tmac/tests/an_TH-repairs-ad-damage.sh
+ @p='tmac/tests/an_TH-repairs-ad-damage.sh'; \
+ b='tmac/tests/an_TH-repairs-ad-damage.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_TH-repairs-hy-damage.sh.log: tmac/tests/an_TH-repairs-hy-damage.sh
+ @p='tmac/tests/an_TH-repairs-hy-damage.sh'; \
+ b='tmac/tests/an_TH-repairs-hy-damage.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_TS-adds-no-vertical-space.sh.log: tmac/tests/an_TS-adds-no-vertical-space.sh
+ @p='tmac/tests/an_TS-adds-no-vertical-space.sh'; \
+ b='tmac/tests/an_TS-adds-no-vertical-space.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh.log: tmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh
+ @p='tmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh'; \
+ b='tmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_UE-breaks-before-long-URIs.sh.log: tmac/tests/an_UE-breaks-before-long-URIs.sh
+ @p='tmac/tests/an_UE-breaks-before-long-URIs.sh'; \
+ b='tmac/tests/an_UE-breaks-before-long-URIs.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_UE-punct-hyphenates.sh.log: tmac/tests/an_UE-punct-hyphenates.sh
+ @p='tmac/tests/an_UE-punct-hyphenates.sh'; \
+ b='tmac/tests/an_UE-punct-hyphenates.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_UR-body-hyphenates.sh.log: tmac/tests/an_UR-body-hyphenates.sh
+ @p='tmac/tests/an_UR-body-hyphenates.sh'; \
+ b='tmac/tests/an_UR-body-hyphenates.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_UR-works.sh.log: tmac/tests/an_UR-works.sh
+ @p='tmac/tests/an_UR-works.sh'; \
+ b='tmac/tests/an_UR-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_X-register-works.sh.log: tmac/tests/an_X-register-works.sh
+ @p='tmac/tests/an_X-register-works.sh'; \
+ b='tmac/tests/an_X-register-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_adjust-link-text-correctly.sh.log: tmac/tests/an_adjust-link-text-correctly.sh
+ @p='tmac/tests/an_adjust-link-text-correctly.sh'; \
+ b='tmac/tests/an_adjust-link-text-correctly.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_avoid-two-font-denial-of-service.sh.log: tmac/tests/an_avoid-two-font-denial-of-service.sh
+ @p='tmac/tests/an_avoid-two-font-denial-of-service.sh'; \
+ b='tmac/tests/an_avoid-two-font-denial-of-service.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_do-not-abbreviate-escape-using-TH-arguments.sh.log: tmac/tests/an_do-not-abbreviate-escape-using-TH-arguments.sh
+ @p='tmac/tests/an_do-not-abbreviate-escape-using-TH-arguments.sh'; \
+ b='tmac/tests/an_do-not-abbreviate-escape-using-TH-arguments.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_font-remapping-does-not-affect-titles.sh.log: tmac/tests/an_font-remapping-does-not-affect-titles.sh
+ @p='tmac/tests/an_font-remapping-does-not-affect-titles.sh'; \
+ b='tmac/tests/an_font-remapping-does-not-affect-titles.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_handle-degenerate-input-quietly.sh.log: tmac/tests/an_handle-degenerate-input-quietly.sh
+ @p='tmac/tests/an_handle-degenerate-input-quietly.sh'; \
+ b='tmac/tests/an_handle-degenerate-input-quietly.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_inner-footer-abbreviation-works.sh.log: tmac/tests/an_inner-footer-abbreviation-works.sh
+ @p='tmac/tests/an_inner-footer-abbreviation-works.sh'; \
+ b='tmac/tests/an_inner-footer-abbreviation-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_link-macros-work-in-paragraph-tags.sh.log: tmac/tests/an_link-macros-work-in-paragraph-tags.sh
+ @p='tmac/tests/an_link-macros-work-in-paragraph-tags.sh'; \
+ b='tmac/tests/an_link-macros-work-in-paragraph-tags.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_link-trailing-text-hugs-previous.sh.log: tmac/tests/an_link-trailing-text-hugs-previous.sh
+ @p='tmac/tests/an_link-trailing-text-hugs-previous.sh'; \
+ b='tmac/tests/an_link-trailing-text-hugs-previous.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_no-break-after-short-paragraph-tags.sh.log: tmac/tests/an_no-break-after-short-paragraph-tags.sh
+ @p='tmac/tests/an_no-break-after-short-paragraph-tags.sh'; \
+ b='tmac/tests/an_no-break-after-short-paragraph-tags.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_output-footer-when-continuously-rendering.sh.log: tmac/tests/an_output-footer-when-continuously-rendering.sh
+ @p='tmac/tests/an_output-footer-when-continuously-rendering.sh'; \
+ b='tmac/tests/an_output-footer-when-continuously-rendering.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_page-footers-present.sh.log: tmac/tests/an_page-footers-present.sh
+ @p='tmac/tests/an_page-footers-present.sh'; \
+ b='tmac/tests/an_page-footers-present.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_page-header-has-current-data.sh.log: tmac/tests/an_page-header-has-current-data.sh
+ @p='tmac/tests/an_page-header-has-current-data.sh'; \
+ b='tmac/tests/an_page-header-has-current-data.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_reset-hyphenation-correctly.sh.log: tmac/tests/an_reset-hyphenation-correctly.sh
+ @p='tmac/tests/an_reset-hyphenation-correctly.sh'; \
+ b='tmac/tests/an_reset-hyphenation-correctly.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_title-abbreviation-works.sh.log: tmac/tests/an_title-abbreviation-works.sh
+ @p='tmac/tests/an_title-abbreviation-works.sh'; \
+ b='tmac/tests/an_title-abbreviation-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_use-input-traps-correctly.sh.log: tmac/tests/an_use-input-traps-correctly.sh
+ @p='tmac/tests/an_use-input-traps-correctly.sh'; \
+ b='tmac/tests/an_use-input-traps-correctly.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/an_works-with-ec.sh.log: tmac/tests/an_works-with-ec.sh
+ @p='tmac/tests/an_works-with-ec.sh'; \
+ b='tmac/tests/an_works-with-ec.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/andoc_P-register-works.sh.log: tmac/tests/andoc_P-register-works.sh
+ @p='tmac/tests/andoc_P-register-works.sh'; \
+ b='tmac/tests/andoc_P-register-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/andoc_check-an-to-doc-transition.sh.log: tmac/tests/andoc_check-an-to-doc-transition.sh
+ @p='tmac/tests/andoc_check-an-to-doc-transition.sh'; \
+ b='tmac/tests/andoc_check-an-to-doc-transition.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/andoc_clear-doc-traps.sh.log: tmac/tests/andoc_clear-doc-traps.sh
+ @p='tmac/tests/andoc_clear-doc-traps.sh'; \
+ b='tmac/tests/andoc_clear-doc-traps.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/andoc_flush-between-packages.sh.log: tmac/tests/andoc_flush-between-packages.sh
+ @p='tmac/tests/andoc_flush-between-packages.sh'; \
+ b='tmac/tests/andoc_flush-between-packages.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/doc_CS-works.sh.log: tmac/tests/doc_CS-works.sh
+ @p='tmac/tests/doc_CS-works.sh'; \
+ b='tmac/tests/doc_CS-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/doc_CT-works.sh.log: tmac/tests/doc_CT-works.sh
+ @p='tmac/tests/doc_CT-works.sh'; \
+ b='tmac/tests/doc_CT-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/doc_D-places-page-numbers-correctly.sh.log: tmac/tests/doc_D-places-page-numbers-correctly.sh
+ @p='tmac/tests/doc_D-places-page-numbers-correctly.sh'; \
+ b='tmac/tests/doc_D-places-page-numbers-correctly.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/doc_Lk-respect-sentence-ending-punctuation.sh.log: tmac/tests/doc_Lk-respect-sentence-ending-punctuation.sh
+ @p='tmac/tests/doc_Lk-respect-sentence-ending-punctuation.sh'; \
+ b='tmac/tests/doc_Lk-respect-sentence-ending-punctuation.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/doc_Mt-works.sh.log: tmac/tests/doc_Mt-works.sh
+ @p='tmac/tests/doc_Mt-works.sh'; \
+ b='tmac/tests/doc_Mt-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/doc_Nm-works.sh.log: tmac/tests/doc_Nm-works.sh
+ @p='tmac/tests/doc_Nm-works.sh'; \
+ b='tmac/tests/doc_Nm-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/doc_P-register-works.sh.log: tmac/tests/doc_P-register-works.sh
+ @p='tmac/tests/doc_P-register-works.sh'; \
+ b='tmac/tests/doc_P-register-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/doc_X-register-works.sh.log: tmac/tests/doc_X-register-works.sh
+ @p='tmac/tests/doc_X-register-works.sh'; \
+ b='tmac/tests/doc_X-register-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/doc_accept-mixed-case-section-headings.sh.log: tmac/tests/doc_accept-mixed-case-section-headings.sh
+ @p='tmac/tests/doc_accept-mixed-case-section-headings.sh'; \
+ b='tmac/tests/doc_accept-mixed-case-section-headings.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/doc_do-not-loop-infinitely-when-shortening-headers.sh.log: tmac/tests/doc_do-not-loop-infinitely-when-shortening-headers.sh
+ @p='tmac/tests/doc_do-not-loop-infinitely-when-shortening-headers.sh'; \
+ b='tmac/tests/doc_do-not-loop-infinitely-when-shortening-headers.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/doc_heading-font-remapping-works.sh.log: tmac/tests/doc_heading-font-remapping-works.sh
+ @p='tmac/tests/doc_heading-font-remapping-works.sh'; \
+ b='tmac/tests/doc_heading-font-remapping-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/doc_indents-correctly.sh.log: tmac/tests/doc_indents-correctly.sh
+ @p='tmac/tests/doc_indents-correctly.sh'; \
+ b='tmac/tests/doc_indents-correctly.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/doc_output-footer-when-continuously-rendering.sh.log: tmac/tests/doc_output-footer-when-continuously-rendering.sh
+ @p='tmac/tests/doc_output-footer-when-continuously-rendering.sh'; \
+ b='tmac/tests/doc_output-footer-when-continuously-rendering.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/doc_smoke-test.sh.log: tmac/tests/doc_smoke-test.sh
+ @p='tmac/tests/doc_smoke-test.sh'; \
+ b='tmac/tests/doc_smoke-test.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/e_chapter-titles-work.sh.log: tmac/tests/e_chapter-titles-work.sh
+ @p='tmac/tests/e_chapter-titles-work.sh'; \
+ b='tmac/tests/e_chapter-titles-work.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/e_columns-work-on-long-pages.sh.log: tmac/tests/e_columns-work-on-long-pages.sh
+ @p='tmac/tests/e_columns-work-on-long-pages.sh'; \
+ b='tmac/tests/e_columns-work-on-long-pages.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/e_delayed-text-marks-work.sh.log: tmac/tests/e_delayed-text-marks-work.sh
+ @p='tmac/tests/e_delayed-text-marks-work.sh'; \
+ b='tmac/tests/e_delayed-text-marks-work.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/e_footnote-marks-work.sh.log: tmac/tests/e_footnote-marks-work.sh
+ @p='tmac/tests/e_footnote-marks-work.sh'; \
+ b='tmac/tests/e_footnote-marks-work.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/e_footnotes-work-with-columns.sh.log: tmac/tests/e_footnotes-work-with-columns.sh
+ @p='tmac/tests/e_footnotes-work-with-columns.sh'; \
+ b='tmac/tests/e_footnotes-work-with-columns.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/e_ld-works.sh.log: tmac/tests/e_ld-works.sh
+ @p='tmac/tests/e_ld-works.sh'; \
+ b='tmac/tests/e_ld-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/e_line-numbering-works.sh.log: tmac/tests/e_line-numbering-works.sh
+ @p='tmac/tests/e_line-numbering-works.sh'; \
+ b='tmac/tests/e_line-numbering-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/e_rejects-too-short-page-lengths.sh.log: tmac/tests/e_rejects-too-short-page-lengths.sh
+ @p='tmac/tests/e_rejects-too-short-page-lengths.sh'; \
+ b='tmac/tests/e_rejects-too-short-page-lengths.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/ec_works.sh.log: tmac/tests/ec_works.sh
+ @p='tmac/tests/ec_works.sh'; \
+ b='tmac/tests/ec_works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/latin2_works.sh.log: tmac/tests/latin2_works.sh
+ @p='tmac/tests/latin2_works.sh'; \
+ b='tmac/tests/latin2_works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/latin5_works.sh.log: tmac/tests/latin5_works.sh
+ @p='tmac/tests/latin5_works.sh'; \
+ b='tmac/tests/latin5_works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/latin9_works.sh.log: tmac/tests/latin9_works.sh
+ @p='tmac/tests/latin9_works.sh'; \
+ b='tmac/tests/latin9_works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/localization-works.sh.log: tmac/tests/localization-works.sh
+ @p='tmac/tests/localization-works.sh'; \
+ b='tmac/tests/localization-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh.log: tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh
+ @p='tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh'; \
+ b='tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/pdfpic_falls-back-to-PSPIC.sh.log: tmac/tests/pdfpic_falls-back-to-PSPIC.sh
+ @p='tmac/tests/pdfpic_falls-back-to-PSPIC.sh'; \
+ b='tmac/tests/pdfpic_falls-back-to-PSPIC.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/s_IP-indents-using-paragraph-type-size.sh.log: tmac/tests/s_IP-indents-using-paragraph-type-size.sh
+ @p='tmac/tests/s_IP-indents-using-paragraph-type-size.sh'; \
+ b='tmac/tests/s_IP-indents-using-paragraph-type-size.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/s_IP-respects-inter-sentence-space-in-tags.sh.log: tmac/tests/s_IP-respects-inter-sentence-space-in-tags.sh
+ @p='tmac/tests/s_IP-respects-inter-sentence-space-in-tags.sh'; \
+ b='tmac/tests/s_IP-respects-inter-sentence-space-in-tags.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/s_PN-works.sh.log: tmac/tests/s_PN-works.sh
+ @p='tmac/tests/s_PN-works.sh'; \
+ b='tmac/tests/s_PN-works.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/s_R-handles-its-arguments.sh.log: tmac/tests/s_R-handles-its-arguments.sh
+ @p='tmac/tests/s_R-handles-its-arguments.sh'; \
+ b='tmac/tests/s_R-handles-its-arguments.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/s_SH-resets-IP-indentation-amount.sh.log: tmac/tests/s_SH-resets-IP-indentation-amount.sh
+ @p='tmac/tests/s_SH-resets-IP-indentation-amount.sh'; \
+ b='tmac/tests/s_SH-resets-IP-indentation-amount.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/s_TC-works-with-percent-in-custom-titles.sh.log: tmac/tests/s_TC-works-with-percent-in-custom-titles.sh
+ @p='tmac/tests/s_TC-works-with-percent-in-custom-titles.sh'; \
+ b='tmac/tests/s_TC-works-with-percent-in-custom-titles.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/s_XA-literal-no-argument-suppresses-leader.sh.log: tmac/tests/s_XA-literal-no-argument-suppresses-leader.sh
+ @p='tmac/tests/s_XA-literal-no-argument-suppresses-leader.sh'; \
+ b='tmac/tests/s_XA-literal-no-argument-suppresses-leader.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/s_honor-MINGW-when-two-columns.sh.log: tmac/tests/s_honor-MINGW-when-two-columns.sh
+ @p='tmac/tests/s_honor-MINGW-when-two-columns.sh'; \
+ b='tmac/tests/s_honor-MINGW-when-two-columns.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/s_mark-column-start-correctly.sh.log: tmac/tests/s_mark-column-start-correctly.sh
+ @p='tmac/tests/s_mark-column-start-correctly.sh'; \
+ b='tmac/tests/s_mark-column-start-correctly.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/s_no-excess-space-around-displays.sh.log: tmac/tests/s_no-excess-space-around-displays.sh
+ @p='tmac/tests/s_no-excess-space-around-displays.sh'; \
+ b='tmac/tests/s_no-excess-space-around-displays.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tmac/tests/s_rejects-too-short-page-lengths.sh.log: tmac/tests/s_rejects-too-short-page-lengths.sh
+ @p='tmac/tests/s_rejects-too-short-page-lengths.sh'; \
+ b='tmac/tests/s_rejects-too-short-page-lengths.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ $(am__remove_distdir)
+ test -d "$(distdir)" || mkdir "$(distdir)"
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-hook
+ -test -n "$(am__skip_mode_fix)" \
+ || find "$(distdir)" -type d ! -perm -755 \
+ -exec chmod u+rwx,go+rx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
+ $(am__post_remove_distdir)
+
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+ $(am__post_remove_distdir)
+
+dist-lzip: distdir
+ tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+ $(am__post_remove_distdir)
+
+dist-xz: distdir
+ tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+ $(am__post_remove_distdir)
+
+dist-zstd: distdir
+ tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst
+ $(am__post_remove_distdir)
+
+dist-tarZ: distdir
+ @echo WARNING: "Support for distribution archives compressed with" \
+ "legacy program 'compress' is deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__post_remove_distdir)
+
+dist-shar: distdir
+ @echo WARNING: "Support for shar distribution archives is" \
+ "deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
+ $(am__post_remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__post_remove_distdir)
+
+dist dist-all:
+ $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+ $(am__post_remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.lz*) \
+ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+ *.tar.xz*) \
+ xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ *.tar.zst*) \
+ zstd -dc $(distdir).tar.zst | $(am__untar) ;;\
+ esac
+ chmod -R a-w $(distdir)
+ chmod u+w $(distdir)
+ mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
+ chmod a-w $(distdir)
+ test -d $(distdir)/_build || exit 0; \
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && am__cwd=`pwd` \
+ && $(am__cd) $(distdir)/_build/sub \
+ && ../../configure \
+ $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ --srcdir=../.. --prefix="$$dc_install_base" \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+ && cd "$$am__cwd" \
+ || exit 1
+ $(am__post_remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+ @test -n '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: trying to run $@ with an empty' \
+ '$$(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ $(am__cd) '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(check_SCRIPTS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(PROGRAMS) $(LIBRARIES) $(SCRIPTS) $(MANS) $(DATA) \
+ $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(prefixexecbindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(prefixexecbindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man7dir)" "$(DESTDIR)$(devX100_12_fontdir)" "$(DESTDIR)$(devX100_fontdir)" "$(DESTDIR)$(devX75_12_fontdir)" "$(DESTDIR)$(devX75_fontdir)" "$(DESTDIR)$(devasciifontdir)" "$(DESTDIR)$(devcp1047fontdir)" "$(DESTDIR)$(devdvifontdir)" "$(DESTDIR)$(devdvigendir)" "$(DESTDIR)$(devhtmlfontdir)" "$(DESTDIR)$(devlatin1fontdir)" "$(DESTDIR)$(devlbpfontdir)" "$(DESTDIR)$(devpdffontdir)" "$(DESTDIR)$(devpdffontencdir)" "$(DESTDIR)$(devpdffontmapdir)" "$(DESTDIR)$(devutf8fontdir)" "$(DESTDIR)$(chemexampledir)" "$(DESTDIR)$(chempicdir)" "$(DESTDIR)$(devlj4fontdir)" "$(DESTDIR)$(devlj4fontgendir)" "$(DESTDIR)$(devpsfontdir)" "$(DESTDIR)$(devpsgendir)" "$(DESTDIR)$(docexamplesdir)" "$(DESTDIR)$(hdtblexampledir)" "$(DESTDIR)$(hdtbltmacdir)" "$(DESTDIR)$(localtmacdir)" "$(DESTDIR)$(mdocdir)" "$(DESTDIR)$(mmdir)" "$(DESTDIR)$(mmexampledir)" "$(DESTDIR)$(momexampledir)" "$(DESTDIR)$(momtmacdir)" "$(DESTDIR)$(olddevpsfontdir)" "$(DESTDIR)$(otherdocdir)" "$(DESTDIR)$(pdfmarktmacdir)" "$(DESTDIR)$(rfc1345tmacdir)" "$(DESTDIR)$(sboxestmacdir)" "$(DESTDIR)$(tmacdir)" "$(DESTDIR)$(tmacmmdir)" "$(DESTDIR)$(htmlpicdir)" "$(DESTDIR)$(momhtmldir)" "$(DESTDIR)$(chemexampledir)" "$(DESTDIR)$(chemexample122dir)" "$(DESTDIR)$(devlj4fontdir)" "$(DESTDIR)$(devpsfontdir)" "$(DESTDIR)$(docexamplesdir)" "$(DESTDIR)$(docpdfdocdir)" "$(DESTDIR)$(hdtblexampledir)" "$(DESTDIR)$(momprocessedexampledir)" "$(DESTDIR)$(otherdocdir)" "$(DESTDIR)$(pdfmarkpdfdocdir)" "$(DESTDIR)$(sboxesotherdocdir)" "$(DESTDIR)$(sboxespdfdocdir)" "$(DESTDIR)$(tmacdir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+ -rm -f lib/$(DEPDIR)/$(am__dirstamp)
+ -rm -f lib/$(am__dirstamp)
+ -rm -f lib/uniwidth/$(DEPDIR)/$(am__dirstamp)
+ -rm -f lib/uniwidth/$(am__dirstamp)
+ -rm -f src/devices/grodvi/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/devices/grodvi/$(am__dirstamp)
+ -rm -f src/devices/grohtml/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/devices/grohtml/$(am__dirstamp)
+ -rm -f src/devices/grolbp/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/devices/grolbp/$(am__dirstamp)
+ -rm -f src/devices/grolj4/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/devices/grolj4/$(am__dirstamp)
+ -rm -f src/devices/grops/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/devices/grops/$(am__dirstamp)
+ -rm -f src/devices/grotty/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/devices/grotty/$(am__dirstamp)
+ -rm -f src/devices/xditview/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/devices/xditview/$(am__dirstamp)
+ -rm -f src/libs/libbib/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/libs/libbib/$(am__dirstamp)
+ -rm -f src/libs/libdriver/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/libs/libdriver/$(am__dirstamp)
+ -rm -f src/libs/libgroff/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/libs/libgroff/$(am__dirstamp)
+ -rm -f src/libs/libxutil/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/libs/libxutil/$(am__dirstamp)
+ -rm -f src/preproc/eqn/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/preproc/eqn/$(am__dirstamp)
+ -rm -f src/preproc/grn/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/preproc/grn/$(am__dirstamp)
+ -rm -f src/preproc/html/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/preproc/html/$(am__dirstamp)
+ -rm -f src/preproc/pic/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/preproc/pic/$(am__dirstamp)
+ -rm -f src/preproc/preconv/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/preproc/preconv/$(am__dirstamp)
+ -rm -f src/preproc/refer/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/preproc/refer/$(am__dirstamp)
+ -rm -f src/preproc/soelim/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/preproc/soelim/$(am__dirstamp)
+ -rm -f src/preproc/tbl/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/preproc/tbl/$(am__dirstamp)
+ -rm -f src/roff/groff/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/roff/groff/$(am__dirstamp)
+ -rm -f src/roff/troff/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/roff/troff/$(am__dirstamp)
+ -rm -f src/utils/addftinfo/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/utils/addftinfo/$(am__dirstamp)
+ -rm -f src/utils/hpftodit/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/utils/hpftodit/$(am__dirstamp)
+ -rm -f src/utils/indxbib/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/utils/indxbib/$(am__dirstamp)
+ -rm -f src/utils/lkbib/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/utils/lkbib/$(am__dirstamp)
+ -rm -f src/utils/lookbib/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/utils/lookbib/$(am__dirstamp)
+ -rm -f src/utils/pfbtops/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/utils/pfbtops/$(am__dirstamp)
+ -rm -f src/utils/tfmtodit/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/utils/tfmtodit/$(am__dirstamp)
+ -rm -f src/utils/xtotroff/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/utils/xtotroff/$(am__dirstamp)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -rm -f src/preproc/eqn/eqn.cpp
+ -rm -f src/preproc/eqn/eqn.hpp
+ -rm -f src/preproc/pic/pic.cpp
+ -rm -f src/preproc/pic/pic.hpp
+ -rm -f src/preproc/refer/label.cpp
+ -rm -f src/preproc/refer/label.hpp
+ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
+ clean-nobase_binPROGRAMS clean-noinstLIBRARIES \
+ clean-prefixexecbinPROGRAMS mostlyclean-am
+
+distclean: distclean-am
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f lib/$(DEPDIR)/libgnu_a-asnprintf.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-float.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-fprintf.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-free.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-frexp.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-frexpl.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-fseterr.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-isnan.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-isnand.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-isnanf.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-isnanl.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-itold.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-localcharset.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-math.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-memchr.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-printf-args.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-printf-frexp.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-printf-frexpl.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-printf-parse.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-signbitd.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-signbitf.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-signbitl.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-snprintf.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-stdio-read.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-stdio-write.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-unistd.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-vasnprintf.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-vsnprintf.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-wctype-h.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-wcwidth.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-xsize.Po
+ -rm -f lib/uniwidth/$(DEPDIR)/libgnu_a-width.Po
+ -rm -f src/devices/grodvi/$(DEPDIR)/dvi.Po
+ -rm -f src/devices/grohtml/$(DEPDIR)/html-table.Po
+ -rm -f src/devices/grohtml/$(DEPDIR)/html-text.Po
+ -rm -f src/devices/grohtml/$(DEPDIR)/output.Po
+ -rm -f src/devices/grohtml/$(DEPDIR)/post-html.Po
+ -rm -f src/devices/grolbp/$(DEPDIR)/lbp.Po
+ -rm -f src/devices/grolj4/$(DEPDIR)/lj4.Po
+ -rm -f src/devices/grops/$(DEPDIR)/ps.Po
+ -rm -f src/devices/grops/$(DEPDIR)/psrm.Po
+ -rm -f src/devices/grotty/$(DEPDIR)/tty.Po
+ -rm -f src/devices/xditview/$(DEPDIR)/gxditview-Dvi.Po
+ -rm -f src/devices/xditview/$(DEPDIR)/gxditview-device.Po
+ -rm -f src/devices/xditview/$(DEPDIR)/gxditview-draw.Po
+ -rm -f src/devices/xditview/$(DEPDIR)/gxditview-font.Po
+ -rm -f src/devices/xditview/$(DEPDIR)/gxditview-lex.Po
+ -rm -f src/devices/xditview/$(DEPDIR)/gxditview-page.Po
+ -rm -f src/devices/xditview/$(DEPDIR)/gxditview-parse.Po
+ -rm -f src/devices/xditview/$(DEPDIR)/gxditview-xditview.Po
+ -rm -f src/libs/libbib/$(DEPDIR)/common.Po
+ -rm -f src/libs/libbib/$(DEPDIR)/index.Po
+ -rm -f src/libs/libbib/$(DEPDIR)/linear.Po
+ -rm -f src/libs/libbib/$(DEPDIR)/map.Po
+ -rm -f src/libs/libbib/$(DEPDIR)/search.Po
+ -rm -f src/libs/libdriver/$(DEPDIR)/input.Po
+ -rm -f src/libs/libdriver/$(DEPDIR)/printer.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-assert.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-change_lf.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-cmap.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-color.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-cset.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-curtime.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-device.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-errarg.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-error.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-fatal.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-filename.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-font.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-fontfile.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-geometry.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt1.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-glyphuni.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-htmlhint.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-hypot.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-iftoa.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-invalid.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-itoa.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-lf.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-lineno.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-localcharset.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-macropath.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-matherr.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-maxfilename.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-maxpathname.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-mksdir.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-nametoindex.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-paper.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-prime.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-progname.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-ptable.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-quotearg.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-relocate.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-searchpath.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-spawnvp.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-string.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-strsave.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-symbol.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-tmpfile.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-tmpname.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-unicode.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-uniglyph.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-uniuni.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-version.Po
+ -rm -f src/libs/libxutil/$(DEPDIR)/libxutil_a-DviChar.Po
+ -rm -f src/libs/libxutil/$(DEPDIR)/libxutil_a-XFontName.Po
+ -rm -f src/libs/libxutil/$(DEPDIR)/libxutil_a-xmalloc.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-box.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-delim.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-eqn.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-lex.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-limit.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-list.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-main.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-mark.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-other.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-over.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-pile.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-script.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-special.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-sqrt.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-text.Po
+ -rm -f src/preproc/grn/$(DEPDIR)/hdb.Po
+ -rm -f src/preproc/grn/$(DEPDIR)/hgraph.Po
+ -rm -f src/preproc/grn/$(DEPDIR)/hpoint.Po
+ -rm -f src/preproc/grn/$(DEPDIR)/main.Po
+ -rm -f src/preproc/html/$(DEPDIR)/pre-html.Po
+ -rm -f src/preproc/html/$(DEPDIR)/pushback.Po
+ -rm -f src/preproc/pic/$(DEPDIR)/pic-common.Po
+ -rm -f src/preproc/pic/$(DEPDIR)/pic-lex.Po
+ -rm -f src/preproc/pic/$(DEPDIR)/pic-main.Po
+ -rm -f src/preproc/pic/$(DEPDIR)/pic-object.Po
+ -rm -f src/preproc/pic/$(DEPDIR)/pic-pic.Po
+ -rm -f src/preproc/pic/$(DEPDIR)/pic-tex.Po
+ -rm -f src/preproc/pic/$(DEPDIR)/pic-troff.Po
+ -rm -f src/preproc/preconv/$(DEPDIR)/preconv-preconv.Po
+ -rm -f src/preproc/refer/$(DEPDIR)/refer-command.Po
+ -rm -f src/preproc/refer/$(DEPDIR)/refer-label.Po
+ -rm -f src/preproc/refer/$(DEPDIR)/refer-ref.Po
+ -rm -f src/preproc/refer/$(DEPDIR)/refer-refer.Po
+ -rm -f src/preproc/refer/$(DEPDIR)/refer-token.Po
+ -rm -f src/preproc/soelim/$(DEPDIR)/soelim.Po
+ -rm -f src/preproc/tbl/$(DEPDIR)/main.Po
+ -rm -f src/preproc/tbl/$(DEPDIR)/table.Po
+ -rm -f src/roff/groff/$(DEPDIR)/groff.Po
+ -rm -f src/roff/groff/$(DEPDIR)/pipeline.Po
+ -rm -f src/roff/troff/$(DEPDIR)/dictionary.Po
+ -rm -f src/roff/troff/$(DEPDIR)/div.Po
+ -rm -f src/roff/troff/$(DEPDIR)/env.Po
+ -rm -f src/roff/troff/$(DEPDIR)/input.Po
+ -rm -f src/roff/troff/$(DEPDIR)/majorminor.Po
+ -rm -f src/roff/troff/$(DEPDIR)/mtsm.Po
+ -rm -f src/roff/troff/$(DEPDIR)/node.Po
+ -rm -f src/roff/troff/$(DEPDIR)/number.Po
+ -rm -f src/roff/troff/$(DEPDIR)/reg.Po
+ -rm -f src/utils/addftinfo/$(DEPDIR)/addftinfo.Po
+ -rm -f src/utils/addftinfo/$(DEPDIR)/guess.Po
+ -rm -f src/utils/hpftodit/$(DEPDIR)/hpftodit.Po
+ -rm -f src/utils/hpftodit/$(DEPDIR)/hpuni.Po
+ -rm -f src/utils/indxbib/$(DEPDIR)/indxbib.Po
+ -rm -f src/utils/indxbib/$(DEPDIR)/signal.Po
+ -rm -f src/utils/lkbib/$(DEPDIR)/lkbib.Po
+ -rm -f src/utils/lookbib/$(DEPDIR)/lookbib.Po
+ -rm -f src/utils/pfbtops/$(DEPDIR)/dummy.Po
+ -rm -f src/utils/pfbtops/$(DEPDIR)/pfbtops.Po
+ -rm -f src/utils/tfmtodit/$(DEPDIR)/tfmtodit.Po
+ -rm -f src/utils/xtotroff/$(DEPDIR)/xtotroff-xtotroff.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-hdr distclean-local distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-devX100_12_fontDATA \
+ install-devX100_fontDATA install-devX75_12_fontDATA \
+ install-devX75_fontDATA install-devasciifontDATA \
+ install-devcp1047fontDATA install-devdvifontDATA \
+ install-devdvigenDATA install-devhtmlfontDATA \
+ install-devlatin1fontDATA install-devlbpfontDATA \
+ install-devpdffontDATA install-devpdffontencDATA \
+ install-devpdffontmapDATA install-devutf8fontDATA \
+ install-dist_chemexampleDATA install-dist_chempicDATA \
+ install-dist_devlj4fontDATA install-dist_devlj4fontgenDATA \
+ install-dist_devpsfontDATA install-dist_devpsgenDATA \
+ install-dist_docexamplesDATA install-dist_hdtblexampleDATA \
+ install-dist_hdtbltmacDATA install-dist_localtmacDATA \
+ install-dist_mdocDATA install-dist_mmDATA \
+ install-dist_mmexampleDATA install-dist_momexampleDATA \
+ install-dist_momtmacDATA install-dist_olddevpsfontDATA \
+ install-dist_otherdocDATA install-dist_pdfmarktmacDATA \
+ install-dist_rfc1345tmacDATA install-dist_sboxestmacDATA \
+ install-dist_tmacDATA install-dist_tmacmmDATA \
+ install-htmlpicDATA install-man install-momhtmlDATA \
+ install-nodist_chemexample122DATA \
+ install-nodist_chemexampleDATA install-nodist_devlj4fontDATA \
+ install-nodist_devpsfontDATA install-nodist_docexamplesDATA \
+ install-nodist_docpdfdocDATA install-nodist_hdtblexampleDATA \
+ install-nodist_momprocessedexampleDATA \
+ install-nodist_otherdocDATA install-nodist_pdfmarkpdfdocDATA \
+ install-nodist_sboxesotherdocDATA \
+ install-nodist_sboxespdfdocDATA install-nodist_tmacDATA
+ @$(NORMAL_INSTALL)
+ $(MAKE) $(AM_MAKEFLAGS) install-data-hook
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS install-binSCRIPTS \
+ install-dist_binSCRIPTS install-nobase_binPROGRAMS \
+ install-prefixexecbinPROGRAMS install-prefixexecbinSCRIPTS
+ @$(NORMAL_INSTALL)
+ $(MAKE) $(AM_MAKEFLAGS) install-exec-hook
+install-html: install-html-am
+
+install-html-am: install-html-local
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1 install-man5 install-man7
+
+install-pdf: install-pdf-am
+
+install-pdf-am: install-pdf-local
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f lib/$(DEPDIR)/libgnu_a-asnprintf.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-float.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-fprintf.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-free.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-frexp.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-frexpl.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-fseterr.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-isnan.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-isnand.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-isnanf.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-isnanl.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-itold.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-localcharset.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-math.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-memchr.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-printf-args.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-printf-frexp.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-printf-frexpl.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-printf-parse.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-signbitd.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-signbitf.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-signbitl.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-snprintf.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-stdio-read.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-stdio-write.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-unistd.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-vasnprintf.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-vsnprintf.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-wctype-h.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-wcwidth.Po
+ -rm -f lib/$(DEPDIR)/libgnu_a-xsize.Po
+ -rm -f lib/uniwidth/$(DEPDIR)/libgnu_a-width.Po
+ -rm -f src/devices/grodvi/$(DEPDIR)/dvi.Po
+ -rm -f src/devices/grohtml/$(DEPDIR)/html-table.Po
+ -rm -f src/devices/grohtml/$(DEPDIR)/html-text.Po
+ -rm -f src/devices/grohtml/$(DEPDIR)/output.Po
+ -rm -f src/devices/grohtml/$(DEPDIR)/post-html.Po
+ -rm -f src/devices/grolbp/$(DEPDIR)/lbp.Po
+ -rm -f src/devices/grolj4/$(DEPDIR)/lj4.Po
+ -rm -f src/devices/grops/$(DEPDIR)/ps.Po
+ -rm -f src/devices/grops/$(DEPDIR)/psrm.Po
+ -rm -f src/devices/grotty/$(DEPDIR)/tty.Po
+ -rm -f src/devices/xditview/$(DEPDIR)/gxditview-Dvi.Po
+ -rm -f src/devices/xditview/$(DEPDIR)/gxditview-device.Po
+ -rm -f src/devices/xditview/$(DEPDIR)/gxditview-draw.Po
+ -rm -f src/devices/xditview/$(DEPDIR)/gxditview-font.Po
+ -rm -f src/devices/xditview/$(DEPDIR)/gxditview-lex.Po
+ -rm -f src/devices/xditview/$(DEPDIR)/gxditview-page.Po
+ -rm -f src/devices/xditview/$(DEPDIR)/gxditview-parse.Po
+ -rm -f src/devices/xditview/$(DEPDIR)/gxditview-xditview.Po
+ -rm -f src/libs/libbib/$(DEPDIR)/common.Po
+ -rm -f src/libs/libbib/$(DEPDIR)/index.Po
+ -rm -f src/libs/libbib/$(DEPDIR)/linear.Po
+ -rm -f src/libs/libbib/$(DEPDIR)/map.Po
+ -rm -f src/libs/libbib/$(DEPDIR)/search.Po
+ -rm -f src/libs/libdriver/$(DEPDIR)/input.Po
+ -rm -f src/libs/libdriver/$(DEPDIR)/printer.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-assert.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-change_lf.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-cmap.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-color.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-cset.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-curtime.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-device.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-errarg.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-error.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-fatal.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-filename.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-font.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-fontfile.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-geometry.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt1.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-glyphuni.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-htmlhint.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-hypot.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-iftoa.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-invalid.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-itoa.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-lf.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-lineno.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-localcharset.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-macropath.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-matherr.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-maxfilename.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-maxpathname.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-mksdir.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-nametoindex.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-paper.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-prime.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-progname.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-ptable.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-quotearg.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-relocate.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-searchpath.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-spawnvp.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-string.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-strsave.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-symbol.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-tmpfile.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-tmpname.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-unicode.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-uniglyph.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-uniuni.Po
+ -rm -f src/libs/libgroff/$(DEPDIR)/libgroff_a-version.Po
+ -rm -f src/libs/libxutil/$(DEPDIR)/libxutil_a-DviChar.Po
+ -rm -f src/libs/libxutil/$(DEPDIR)/libxutil_a-XFontName.Po
+ -rm -f src/libs/libxutil/$(DEPDIR)/libxutil_a-xmalloc.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-box.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-delim.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-eqn.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-lex.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-limit.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-list.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-main.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-mark.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-other.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-over.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-pile.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-script.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-special.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-sqrt.Po
+ -rm -f src/preproc/eqn/$(DEPDIR)/eqn-text.Po
+ -rm -f src/preproc/grn/$(DEPDIR)/hdb.Po
+ -rm -f src/preproc/grn/$(DEPDIR)/hgraph.Po
+ -rm -f src/preproc/grn/$(DEPDIR)/hpoint.Po
+ -rm -f src/preproc/grn/$(DEPDIR)/main.Po
+ -rm -f src/preproc/html/$(DEPDIR)/pre-html.Po
+ -rm -f src/preproc/html/$(DEPDIR)/pushback.Po
+ -rm -f src/preproc/pic/$(DEPDIR)/pic-common.Po
+ -rm -f src/preproc/pic/$(DEPDIR)/pic-lex.Po
+ -rm -f src/preproc/pic/$(DEPDIR)/pic-main.Po
+ -rm -f src/preproc/pic/$(DEPDIR)/pic-object.Po
+ -rm -f src/preproc/pic/$(DEPDIR)/pic-pic.Po
+ -rm -f src/preproc/pic/$(DEPDIR)/pic-tex.Po
+ -rm -f src/preproc/pic/$(DEPDIR)/pic-troff.Po
+ -rm -f src/preproc/preconv/$(DEPDIR)/preconv-preconv.Po
+ -rm -f src/preproc/refer/$(DEPDIR)/refer-command.Po
+ -rm -f src/preproc/refer/$(DEPDIR)/refer-label.Po
+ -rm -f src/preproc/refer/$(DEPDIR)/refer-ref.Po
+ -rm -f src/preproc/refer/$(DEPDIR)/refer-refer.Po
+ -rm -f src/preproc/refer/$(DEPDIR)/refer-token.Po
+ -rm -f src/preproc/soelim/$(DEPDIR)/soelim.Po
+ -rm -f src/preproc/tbl/$(DEPDIR)/main.Po
+ -rm -f src/preproc/tbl/$(DEPDIR)/table.Po
+ -rm -f src/roff/groff/$(DEPDIR)/groff.Po
+ -rm -f src/roff/groff/$(DEPDIR)/pipeline.Po
+ -rm -f src/roff/troff/$(DEPDIR)/dictionary.Po
+ -rm -f src/roff/troff/$(DEPDIR)/div.Po
+ -rm -f src/roff/troff/$(DEPDIR)/env.Po
+ -rm -f src/roff/troff/$(DEPDIR)/input.Po
+ -rm -f src/roff/troff/$(DEPDIR)/majorminor.Po
+ -rm -f src/roff/troff/$(DEPDIR)/mtsm.Po
+ -rm -f src/roff/troff/$(DEPDIR)/node.Po
+ -rm -f src/roff/troff/$(DEPDIR)/number.Po
+ -rm -f src/roff/troff/$(DEPDIR)/reg.Po
+ -rm -f src/utils/addftinfo/$(DEPDIR)/addftinfo.Po
+ -rm -f src/utils/addftinfo/$(DEPDIR)/guess.Po
+ -rm -f src/utils/hpftodit/$(DEPDIR)/hpftodit.Po
+ -rm -f src/utils/hpftodit/$(DEPDIR)/hpuni.Po
+ -rm -f src/utils/indxbib/$(DEPDIR)/indxbib.Po
+ -rm -f src/utils/indxbib/$(DEPDIR)/signal.Po
+ -rm -f src/utils/lkbib/$(DEPDIR)/lkbib.Po
+ -rm -f src/utils/lookbib/$(DEPDIR)/lookbib.Po
+ -rm -f src/utils/pfbtops/$(DEPDIR)/dummy.Po
+ -rm -f src/utils/pfbtops/$(DEPDIR)/pfbtops.Po
+ -rm -f src/utils/tfmtodit/$(DEPDIR)/tfmtodit.Po
+ -rm -f src/utils/xtotroff/$(DEPDIR)/xtotroff-xtotroff.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic \
+ maintainer-clean-local
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-local
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \
+ uninstall-devX100_12_fontDATA uninstall-devX100_fontDATA \
+ uninstall-devX75_12_fontDATA uninstall-devX75_fontDATA \
+ uninstall-devasciifontDATA uninstall-devcp1047fontDATA \
+ uninstall-devdvifontDATA uninstall-devdvigenDATA \
+ uninstall-devhtmlfontDATA uninstall-devlatin1fontDATA \
+ uninstall-devlbpfontDATA uninstall-devpdffontDATA \
+ uninstall-devpdffontencDATA uninstall-devpdffontmapDATA \
+ uninstall-devutf8fontDATA uninstall-dist_binSCRIPTS \
+ uninstall-dist_chemexampleDATA uninstall-dist_chempicDATA \
+ uninstall-dist_devlj4fontDATA uninstall-dist_devlj4fontgenDATA \
+ uninstall-dist_devpsfontDATA uninstall-dist_devpsgenDATA \
+ uninstall-dist_docexamplesDATA uninstall-dist_hdtblexampleDATA \
+ uninstall-dist_hdtbltmacDATA uninstall-dist_localtmacDATA \
+ uninstall-dist_mdocDATA uninstall-dist_mmDATA \
+ uninstall-dist_mmexampleDATA uninstall-dist_momexampleDATA \
+ uninstall-dist_momtmacDATA uninstall-dist_olddevpsfontDATA \
+ uninstall-dist_otherdocDATA uninstall-dist_pdfmarktmacDATA \
+ uninstall-dist_rfc1345tmacDATA uninstall-dist_sboxestmacDATA \
+ uninstall-dist_tmacDATA uninstall-dist_tmacmmDATA \
+ uninstall-htmlpicDATA uninstall-local uninstall-man \
+ uninstall-momhtmlDATA uninstall-nobase_binPROGRAMS \
+ uninstall-nodist_chemexample122DATA \
+ uninstall-nodist_chemexampleDATA \
+ uninstall-nodist_devlj4fontDATA uninstall-nodist_devpsfontDATA \
+ uninstall-nodist_docexamplesDATA \
+ uninstall-nodist_docpdfdocDATA \
+ uninstall-nodist_hdtblexampleDATA \
+ uninstall-nodist_momprocessedexampleDATA \
+ uninstall-nodist_otherdocDATA \
+ uninstall-nodist_pdfmarkpdfdocDATA \
+ uninstall-nodist_sboxesotherdocDATA \
+ uninstall-nodist_sboxespdfdocDATA uninstall-nodist_tmacDATA \
+ uninstall-prefixexecbinPROGRAMS uninstall-prefixexecbinSCRIPTS
+ @$(NORMAL_INSTALL)
+ $(MAKE) $(AM_MAKEFLAGS) uninstall-hook
+uninstall-man: uninstall-man1 uninstall-man5 uninstall-man7
+
+.MAKE: all check check-am install install-am install-data-am \
+ install-exec install-exec-am install-strip uninstall-am
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles am--refresh check \
+ check-TESTS check-am clean clean-binPROGRAMS \
+ clean-checkPROGRAMS clean-cscope clean-generic \
+ clean-nobase_binPROGRAMS clean-noinstLIBRARIES \
+ clean-prefixexecbinPROGRAMS cscope cscopelist-am ctags \
+ ctags-am dist dist-all dist-bzip2 dist-gzip dist-hook \
+ dist-lzip dist-shar dist-tarZ dist-xz dist-zip dist-zstd \
+ distcheck distclean distclean-compile distclean-generic \
+ distclean-hdr distclean-local distclean-tags distcleancheck \
+ distdir distuninstallcheck dvi dvi-am html html-am info \
+ info-am install install-am install-binPROGRAMS \
+ install-binSCRIPTS install-data install-data-am \
+ install-data-hook install-data-local \
+ install-devX100_12_fontDATA install-devX100_fontDATA \
+ install-devX75_12_fontDATA install-devX75_fontDATA \
+ install-devasciifontDATA install-devcp1047fontDATA \
+ install-devdvifontDATA install-devdvigenDATA \
+ install-devhtmlfontDATA install-devlatin1fontDATA \
+ install-devlbpfontDATA install-devpdffontDATA \
+ install-devpdffontencDATA install-devpdffontmapDATA \
+ install-devutf8fontDATA install-dist_binSCRIPTS \
+ install-dist_chemexampleDATA install-dist_chempicDATA \
+ install-dist_devlj4fontDATA install-dist_devlj4fontgenDATA \
+ install-dist_devpsfontDATA install-dist_devpsgenDATA \
+ install-dist_docexamplesDATA install-dist_hdtblexampleDATA \
+ install-dist_hdtbltmacDATA install-dist_localtmacDATA \
+ install-dist_mdocDATA install-dist_mmDATA \
+ install-dist_mmexampleDATA install-dist_momexampleDATA \
+ install-dist_momtmacDATA install-dist_olddevpsfontDATA \
+ install-dist_otherdocDATA install-dist_pdfmarktmacDATA \
+ install-dist_rfc1345tmacDATA install-dist_sboxestmacDATA \
+ install-dist_tmacDATA install-dist_tmacmmDATA install-dvi \
+ install-dvi-am install-exec install-exec-am install-exec-hook \
+ install-html install-html-am install-html-local \
+ install-htmlpicDATA install-info install-info-am install-man \
+ install-man1 install-man5 install-man7 install-momhtmlDATA \
+ install-nobase_binPROGRAMS install-nodist_chemexample122DATA \
+ install-nodist_chemexampleDATA install-nodist_devlj4fontDATA \
+ install-nodist_devpsfontDATA install-nodist_docexamplesDATA \
+ install-nodist_docpdfdocDATA install-nodist_hdtblexampleDATA \
+ install-nodist_momprocessedexampleDATA \
+ install-nodist_otherdocDATA install-nodist_pdfmarkpdfdocDATA \
+ install-nodist_sboxesotherdocDATA \
+ install-nodist_sboxespdfdocDATA install-nodist_tmacDATA \
+ install-pdf install-pdf-am install-pdf-local \
+ install-prefixexecbinPROGRAMS install-prefixexecbinSCRIPTS \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic maintainer-clean-local mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-local pdf \
+ pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-binSCRIPTS \
+ uninstall-devX100_12_fontDATA uninstall-devX100_fontDATA \
+ uninstall-devX75_12_fontDATA uninstall-devX75_fontDATA \
+ uninstall-devasciifontDATA uninstall-devcp1047fontDATA \
+ uninstall-devdvifontDATA uninstall-devdvigenDATA \
+ uninstall-devhtmlfontDATA uninstall-devlatin1fontDATA \
+ uninstall-devlbpfontDATA uninstall-devpdffontDATA \
+ uninstall-devpdffontencDATA uninstall-devpdffontmapDATA \
+ uninstall-devutf8fontDATA uninstall-dist_binSCRIPTS \
+ uninstall-dist_chemexampleDATA uninstall-dist_chempicDATA \
+ uninstall-dist_devlj4fontDATA uninstall-dist_devlj4fontgenDATA \
+ uninstall-dist_devpsfontDATA uninstall-dist_devpsgenDATA \
+ uninstall-dist_docexamplesDATA uninstall-dist_hdtblexampleDATA \
+ uninstall-dist_hdtbltmacDATA uninstall-dist_localtmacDATA \
+ uninstall-dist_mdocDATA uninstall-dist_mmDATA \
+ uninstall-dist_mmexampleDATA uninstall-dist_momexampleDATA \
+ uninstall-dist_momtmacDATA uninstall-dist_olddevpsfontDATA \
+ uninstall-dist_otherdocDATA uninstall-dist_pdfmarktmacDATA \
+ uninstall-dist_rfc1345tmacDATA uninstall-dist_sboxestmacDATA \
+ uninstall-dist_tmacDATA uninstall-dist_tmacmmDATA \
+ uninstall-hook uninstall-htmlpicDATA uninstall-local \
+ uninstall-man uninstall-man1 uninstall-man5 uninstall-man7 \
+ uninstall-momhtmlDATA uninstall-nobase_binPROGRAMS \
+ uninstall-nodist_chemexample122DATA \
+ uninstall-nodist_chemexampleDATA \
+ uninstall-nodist_devlj4fontDATA uninstall-nodist_devpsfontDATA \
+ uninstall-nodist_docexamplesDATA \
+ uninstall-nodist_docpdfdocDATA \
+ uninstall-nodist_hdtblexampleDATA \
+ uninstall-nodist_momprocessedexampleDATA \
+ uninstall-nodist_otherdocDATA \
+ uninstall-nodist_pdfmarkpdfdocDATA \
+ uninstall-nodist_sboxesotherdocDATA \
+ uninstall-nodist_sboxespdfdocDATA uninstall-nodist_tmacDATA \
+ uninstall-prefixexecbinPROGRAMS uninstall-prefixexecbinSCRIPTS
+
+.PRECIOUS: Makefile
+
+
+# We need the following in order to create <alloca.h> when the system
+# doesn't have one that works with the given compiler.
+@GL_GENERATE_ALLOCA_H_TRUE@lib/alloca.h: lib/alloca.in.h $(top_builddir)/config.status
+@GL_GENERATE_ALLOCA_H_TRUE@ $(AM_V_GEN)$(MKDIR_P) 'lib'
+@GL_GENERATE_ALLOCA_H_TRUE@ $(gl_V_at)$(SED_HEADER_STDOUT) \
+@GL_GENERATE_ALLOCA_H_TRUE@ -e 's|@''HAVE_ALLOCA_H''@|$(HAVE_ALLOCA_H)|g' \
+@GL_GENERATE_ALLOCA_H_TRUE@ $(top_srcdir)/lib/alloca.in.h > $@-t
+@GL_GENERATE_ALLOCA_H_TRUE@ $(AM_V_at)mv $@-t $@
+@GL_GENERATE_ALLOCA_H_FALSE@lib/alloca.h: $(top_builddir)/config.status
+@GL_GENERATE_ALLOCA_H_FALSE@ rm -f $@
+
+# We need the following in order to create <assert.h> when the system
+# doesn't have one that works with the given compiler.
+@GL_GENERATE_ASSERT_H_TRUE@lib/assert.h: lib/assert.in.h lib/verify.h $(top_builddir)/config.status
+@GL_GENERATE_ASSERT_H_TRUE@ $(AM_V_GEN)$(MKDIR_P) 'lib'
+@GL_GENERATE_ASSERT_H_TRUE@ $(gl_V_at){ $(SED_HEADER_STDOUT) \
+@GL_GENERATE_ASSERT_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@GL_GENERATE_ASSERT_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@GL_GENERATE_ASSERT_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@GL_GENERATE_ASSERT_H_TRUE@ -e 's|@''NEXT_ASSERT_H''@|$(NEXT_ASSERT_H)|g' \
+@GL_GENERATE_ASSERT_H_TRUE@ < $(top_srcdir)/lib/assert.in.h && \
+@GL_GENERATE_ASSERT_H_TRUE@ sed -e '/@assert.h omit start@/,/@assert.h omit end@/d' \
+@GL_GENERATE_ASSERT_H_TRUE@ -e 's|_gl_verify|_gl_static_assert|g' \
+@GL_GENERATE_ASSERT_H_TRUE@ -e 's|_GL_VERIFY|_GL_STATIC_ASSERT|g' \
+@GL_GENERATE_ASSERT_H_TRUE@ -e 's|_GL\(_STATIC_ASSERT_H\)|_GL\1|g' \
+@GL_GENERATE_ASSERT_H_TRUE@ < $(top_srcdir)/lib/verify.h; \
+@GL_GENERATE_ASSERT_H_TRUE@ } > $@-t
+@GL_GENERATE_ASSERT_H_TRUE@ $(AM_V_at)mv $@-t $@
+@GL_GENERATE_ASSERT_H_FALSE@lib/assert.h: $(top_builddir)/config.status
+@GL_GENERATE_ASSERT_H_FALSE@ rm -f $@
+
+# We need the following in order to create <errno.h> when the system
+# doesn't have one that is POSIX compliant.
+@GL_GENERATE_ERRNO_H_TRUE@lib/errno.h: lib/errno.in.h $(top_builddir)/config.status
+@GL_GENERATE_ERRNO_H_TRUE@ $(AM_V_GEN)$(MKDIR_P) 'lib'
+@GL_GENERATE_ERRNO_H_TRUE@ $(gl_V_at)$(SED_HEADER_STDOUT) \
+@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''GUARD_PREFIX''@|GL|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''NEXT_ERRNO_H''@|$(NEXT_ERRNO_H)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EMULTIHOP_HIDDEN''@|$(EMULTIHOP_HIDDEN)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EMULTIHOP_VALUE''@|$(EMULTIHOP_VALUE)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''ENOLINK_HIDDEN''@|$(ENOLINK_HIDDEN)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''ENOLINK_VALUE''@|$(ENOLINK_VALUE)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EOVERFLOW_HIDDEN''@|$(EOVERFLOW_HIDDEN)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EOVERFLOW_VALUE''@|$(EOVERFLOW_VALUE)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ $(top_srcdir)/lib/errno.in.h > $@-t
+@GL_GENERATE_ERRNO_H_TRUE@ $(AM_V_at)mv $@-t $@
+@GL_GENERATE_ERRNO_H_FALSE@lib/errno.h: $(top_builddir)/config.status
+@GL_GENERATE_ERRNO_H_FALSE@ rm -f $@
+
+# We need the following in order to create <float.h> when the system
+# doesn't have one that works with the given compiler.
+@GL_GENERATE_FLOAT_H_TRUE@lib/float.h: lib/float.in.h $(top_builddir)/config.status
+@GL_GENERATE_FLOAT_H_TRUE@ $(AM_V_GEN)$(MKDIR_P) 'lib'
+@GL_GENERATE_FLOAT_H_TRUE@ $(gl_V_at)$(SED_HEADER_STDOUT) \
+@GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''GUARD_PREFIX''@|GL|g' \
+@GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''NEXT_FLOAT_H''@|$(NEXT_FLOAT_H)|g' \
+@GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''REPLACE_ITOLD''@|$(REPLACE_ITOLD)|g' \
+@GL_GENERATE_FLOAT_H_TRUE@ $(top_srcdir)/lib/float.in.h > $@-t
+@GL_GENERATE_FLOAT_H_TRUE@ $(AM_V_at)mv $@-t $@
+@GL_GENERATE_FLOAT_H_FALSE@lib/float.h: $(top_builddir)/config.status
+@GL_GENERATE_FLOAT_H_FALSE@ rm -f $@
+
+# We need the following in order to create <inttypes.h> when the system
+# doesn't have one that works with the given compiler.
+lib/inttypes.h: lib/inttypes.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_GEN)$(MKDIR_P) 'lib'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_INTTYPES_H''@|$(NEXT_INTTYPES_H)|g' \
+ -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \
+ -e 's/@''PRIPTR_PREFIX''@/$(PRIPTR_PREFIX)/g' \
+ -e 's/@''GNULIB_IMAXABS''@/$(GL_GNULIB_IMAXABS)/g' \
+ -e 's/@''GNULIB_IMAXDIV''@/$(GL_GNULIB_IMAXDIV)/g' \
+ -e 's/@''GNULIB_STRTOIMAX''@/$(GL_GNULIB_STRTOIMAX)/g' \
+ -e 's/@''GNULIB_STRTOUMAX''@/$(GL_GNULIB_STRTOUMAX)/g' \
+ -e 's/@''HAVE_DECL_IMAXABS''@/$(HAVE_DECL_IMAXABS)/g' \
+ -e 's/@''HAVE_DECL_IMAXDIV''@/$(HAVE_DECL_IMAXDIV)/g' \
+ -e 's/@''HAVE_DECL_STRTOIMAX''@/$(HAVE_DECL_STRTOIMAX)/g' \
+ -e 's/@''HAVE_DECL_STRTOUMAX''@/$(HAVE_DECL_STRTOUMAX)/g' \
+ -e 's/@''HAVE_IMAXDIV_T''@/$(HAVE_IMAXDIV_T)/g' \
+ -e 's/@''REPLACE_IMAXABS''@/$(REPLACE_IMAXABS)/g' \
+ -e 's/@''REPLACE_IMAXDIV''@/$(REPLACE_IMAXDIV)/g' \
+ -e 's/@''REPLACE_STRTOIMAX''@/$(REPLACE_STRTOIMAX)/g' \
+ -e 's/@''REPLACE_STRTOUMAX''@/$(REPLACE_STRTOUMAX)/g' \
+ -e 's/@''INT32_MAX_LT_INTMAX_MAX''@/$(INT32_MAX_LT_INTMAX_MAX)/g' \
+ -e 's/@''INT64_MAX_EQ_LONG_MAX''@/$(INT64_MAX_EQ_LONG_MAX)/g' \
+ -e 's/@''UINT32_MAX_LT_UINTMAX_MAX''@/$(UINT32_MAX_LT_UINTMAX_MAX)/g' \
+ -e 's/@''UINT64_MAX_EQ_ULONG_MAX''@/$(UINT64_MAX_EQ_ULONG_MAX)/g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ $(top_srcdir)/lib/inttypes.in.h > $@-t
+ $(AM_V_at)mv $@-t $@
+
+# We need the following in order to create <limits.h> when the system
+# doesn't have one that is compatible with GNU.
+@GL_GENERATE_LIMITS_H_TRUE@lib/limits.h: lib/limits.in.h $(top_builddir)/config.status
+@GL_GENERATE_LIMITS_H_TRUE@ $(AM_V_GEN)$(MKDIR_P) 'lib'
+@GL_GENERATE_LIMITS_H_TRUE@ $(gl_V_at)$(SED_HEADER_STDOUT) \
+@GL_GENERATE_LIMITS_H_TRUE@ -e 's|@''GUARD_PREFIX''@|GL|g' \
+@GL_GENERATE_LIMITS_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@GL_GENERATE_LIMITS_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@GL_GENERATE_LIMITS_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@GL_GENERATE_LIMITS_H_TRUE@ -e 's|@''NEXT_LIMITS_H''@|$(NEXT_LIMITS_H)|g' \
+@GL_GENERATE_LIMITS_H_TRUE@ $(top_srcdir)/lib/limits.in.h > $@-t
+@GL_GENERATE_LIMITS_H_TRUE@ $(AM_V_at)mv $@-t $@
+@GL_GENERATE_LIMITS_H_FALSE@lib/limits.h: $(top_builddir)/config.status
+@GL_GENERATE_LIMITS_H_FALSE@ rm -f $@
+
+# We need the following in order to create <math.h> when the system
+# doesn't have one that works with the given compiler.
+lib/math.h: lib/math.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)$(MKDIR_P) 'lib'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT_AS_FIRST_DIRECTIVE''@|$(INCLUDE_NEXT_AS_FIRST_DIRECTIVE)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_AS_FIRST_DIRECTIVE_MATH_H''@|$(NEXT_AS_FIRST_DIRECTIVE_MATH_H)|g' \
+ -e 's/@''GNULIB_ACOSF''@/$(GL_GNULIB_ACOSF)/g' \
+ -e 's/@''GNULIB_ACOSL''@/$(GL_GNULIB_ACOSL)/g' \
+ -e 's/@''GNULIB_ASINF''@/$(GL_GNULIB_ASINF)/g' \
+ -e 's/@''GNULIB_ASINL''@/$(GL_GNULIB_ASINL)/g' \
+ -e 's/@''GNULIB_ATANF''@/$(GL_GNULIB_ATANF)/g' \
+ -e 's/@''GNULIB_ATANL''@/$(GL_GNULIB_ATANL)/g' \
+ -e 's/@''GNULIB_ATAN2F''@/$(GL_GNULIB_ATAN2F)/g' \
+ -e 's/@''GNULIB_CBRT''@/$(GL_GNULIB_CBRT)/g' \
+ -e 's/@''GNULIB_CBRTF''@/$(GL_GNULIB_CBRTF)/g' \
+ -e 's/@''GNULIB_CBRTL''@/$(GL_GNULIB_CBRTL)/g' \
+ -e 's/@''GNULIB_CEIL''@/$(GL_GNULIB_CEIL)/g' \
+ -e 's/@''GNULIB_CEILF''@/$(GL_GNULIB_CEILF)/g' \
+ -e 's/@''GNULIB_CEILL''@/$(GL_GNULIB_CEILL)/g' \
+ -e 's/@''GNULIB_COPYSIGN''@/$(GL_GNULIB_COPYSIGN)/g' \
+ -e 's/@''GNULIB_COPYSIGNF''@/$(GL_GNULIB_COPYSIGNF)/g' \
+ -e 's/@''GNULIB_COPYSIGNL''@/$(GL_GNULIB_COPYSIGNL)/g' \
+ -e 's/@''GNULIB_COSF''@/$(GL_GNULIB_COSF)/g' \
+ -e 's/@''GNULIB_COSL''@/$(GL_GNULIB_COSL)/g' \
+ -e 's/@''GNULIB_COSHF''@/$(GL_GNULIB_COSHF)/g' \
+ -e 's/@''GNULIB_EXPF''@/$(GL_GNULIB_EXPF)/g' \
+ -e 's/@''GNULIB_EXPL''@/$(GL_GNULIB_EXPL)/g' \
+ -e 's/@''GNULIB_EXP2''@/$(GL_GNULIB_EXP2)/g' \
+ -e 's/@''GNULIB_EXP2F''@/$(GL_GNULIB_EXP2F)/g' \
+ -e 's/@''GNULIB_EXP2L''@/$(GL_GNULIB_EXP2L)/g' \
+ -e 's/@''GNULIB_EXPM1''@/$(GL_GNULIB_EXPM1)/g' \
+ -e 's/@''GNULIB_EXPM1F''@/$(GL_GNULIB_EXPM1F)/g' \
+ -e 's/@''GNULIB_EXPM1L''@/$(GL_GNULIB_EXPM1L)/g' \
+ -e 's/@''GNULIB_FABSF''@/$(GL_GNULIB_FABSF)/g' \
+ -e 's/@''GNULIB_FABSL''@/$(GL_GNULIB_FABSL)/g' \
+ -e 's/@''GNULIB_FLOOR''@/$(GL_GNULIB_FLOOR)/g' \
+ -e 's/@''GNULIB_FLOORF''@/$(GL_GNULIB_FLOORF)/g' \
+ -e 's/@''GNULIB_FLOORL''@/$(GL_GNULIB_FLOORL)/g' \
+ -e 's/@''GNULIB_FMA''@/$(GL_GNULIB_FMA)/g' \
+ -e 's/@''GNULIB_FMAF''@/$(GL_GNULIB_FMAF)/g' \
+ -e 's/@''GNULIB_FMAL''@/$(GL_GNULIB_FMAL)/g' \
+ -e 's/@''GNULIB_FMOD''@/$(GL_GNULIB_FMOD)/g' \
+ -e 's/@''GNULIB_FMODF''@/$(GL_GNULIB_FMODF)/g' \
+ -e 's/@''GNULIB_FMODL''@/$(GL_GNULIB_FMODL)/g' \
+ -e 's/@''GNULIB_FREXPF''@/$(GL_GNULIB_FREXPF)/g' \
+ -e 's/@''GNULIB_FREXP''@/$(GL_GNULIB_FREXP)/g' \
+ -e 's/@''GNULIB_FREXPL''@/$(GL_GNULIB_FREXPL)/g' \
+ -e 's/@''GNULIB_HYPOT''@/$(GL_GNULIB_HYPOT)/g' \
+ -e 's/@''GNULIB_HYPOTF''@/$(GL_GNULIB_HYPOTF)/g' \
+ -e 's/@''GNULIB_HYPOTL''@/$(GL_GNULIB_HYPOTL)/g' \
+ < $(top_srcdir)/lib/math.in.h | \
+ sed -e 's/@''GNULIB_ILOGB''@/$(GL_GNULIB_ILOGB)/g' \
+ -e 's/@''GNULIB_ILOGBF''@/$(GL_GNULIB_ILOGBF)/g' \
+ -e 's/@''GNULIB_ILOGBL''@/$(GL_GNULIB_ILOGBL)/g' \
+ -e 's/@''GNULIB_ISFINITE''@/$(GL_GNULIB_ISFINITE)/g' \
+ -e 's/@''GNULIB_ISINF''@/$(GL_GNULIB_ISINF)/g' \
+ -e 's/@''GNULIB_ISNAN''@/$(GL_GNULIB_ISNAN)/g' \
+ -e 's/@''GNULIB_ISNANF''@/$(GL_GNULIB_ISNANF)/g' \
+ -e 's/@''GNULIB_ISNAND''@/$(GL_GNULIB_ISNAND)/g' \
+ -e 's/@''GNULIB_ISNANL''@/$(GL_GNULIB_ISNANL)/g' \
+ -e 's/@''GNULIB_LDEXPF''@/$(GL_GNULIB_LDEXPF)/g' \
+ -e 's/@''GNULIB_LDEXPL''@/$(GL_GNULIB_LDEXPL)/g' \
+ -e 's/@''GNULIB_LOG''@/$(GL_GNULIB_LOG)/g' \
+ -e 's/@''GNULIB_LOGF''@/$(GL_GNULIB_LOGF)/g' \
+ -e 's/@''GNULIB_LOGL''@/$(GL_GNULIB_LOGL)/g' \
+ -e 's/@''GNULIB_LOG10''@/$(GL_GNULIB_LOG10)/g' \
+ -e 's/@''GNULIB_LOG10F''@/$(GL_GNULIB_LOG10F)/g' \
+ -e 's/@''GNULIB_LOG10L''@/$(GL_GNULIB_LOG10L)/g' \
+ -e 's/@''GNULIB_LOG1P''@/$(GL_GNULIB_LOG1P)/g' \
+ -e 's/@''GNULIB_LOG1PF''@/$(GL_GNULIB_LOG1PF)/g' \
+ -e 's/@''GNULIB_LOG1PL''@/$(GL_GNULIB_LOG1PL)/g' \
+ -e 's/@''GNULIB_LOG2''@/$(GL_GNULIB_LOG2)/g' \
+ -e 's/@''GNULIB_LOG2F''@/$(GL_GNULIB_LOG2F)/g' \
+ -e 's/@''GNULIB_LOG2L''@/$(GL_GNULIB_LOG2L)/g' \
+ -e 's/@''GNULIB_LOGB''@/$(GL_GNULIB_LOGB)/g' \
+ -e 's/@''GNULIB_LOGBF''@/$(GL_GNULIB_LOGBF)/g' \
+ -e 's/@''GNULIB_LOGBL''@/$(GL_GNULIB_LOGBL)/g' \
+ -e 's/@''GNULIB_MODF''@/$(GL_GNULIB_MODF)/g' \
+ -e 's/@''GNULIB_MODFF''@/$(GL_GNULIB_MODFF)/g' \
+ -e 's/@''GNULIB_MODFL''@/$(GL_GNULIB_MODFL)/g' \
+ -e 's/@''GNULIB_POWF''@/$(GL_GNULIB_POWF)/g' \
+ -e 's/@''GNULIB_REMAINDER''@/$(GL_GNULIB_REMAINDER)/g' \
+ -e 's/@''GNULIB_REMAINDERF''@/$(GL_GNULIB_REMAINDERF)/g' \
+ -e 's/@''GNULIB_REMAINDERL''@/$(GL_GNULIB_REMAINDERL)/g' \
+ -e 's/@''GNULIB_RINT''@/$(GL_GNULIB_RINT)/g' \
+ -e 's/@''GNULIB_RINTF''@/$(GL_GNULIB_RINTF)/g' \
+ -e 's/@''GNULIB_RINTL''@/$(GL_GNULIB_RINTL)/g' \
+ -e 's/@''GNULIB_ROUND''@/$(GL_GNULIB_ROUND)/g' \
+ -e 's/@''GNULIB_ROUNDF''@/$(GL_GNULIB_ROUNDF)/g' \
+ -e 's/@''GNULIB_ROUNDL''@/$(GL_GNULIB_ROUNDL)/g' \
+ -e 's/@''GNULIB_SIGNBIT''@/$(GL_GNULIB_SIGNBIT)/g' \
+ -e 's/@''GNULIB_SINF''@/$(GL_GNULIB_SINF)/g' \
+ -e 's/@''GNULIB_SINL''@/$(GL_GNULIB_SINL)/g' \
+ -e 's/@''GNULIB_SINHF''@/$(GL_GNULIB_SINHF)/g' \
+ -e 's/@''GNULIB_SQRTF''@/$(GL_GNULIB_SQRTF)/g' \
+ -e 's/@''GNULIB_SQRTL''@/$(GL_GNULIB_SQRTL)/g' \
+ -e 's/@''GNULIB_TANF''@/$(GL_GNULIB_TANF)/g' \
+ -e 's/@''GNULIB_TANL''@/$(GL_GNULIB_TANL)/g' \
+ -e 's/@''GNULIB_TANHF''@/$(GL_GNULIB_TANHF)/g' \
+ -e 's/@''GNULIB_TRUNC''@/$(GL_GNULIB_TRUNC)/g' \
+ -e 's/@''GNULIB_TRUNCF''@/$(GL_GNULIB_TRUNCF)/g' \
+ -e 's/@''GNULIB_TRUNCL''@/$(GL_GNULIB_TRUNCL)/g' \
+ -e 's/@''GNULIB_MDA_J0''@/$(GL_GNULIB_MDA_J0)/g' \
+ -e 's/@''GNULIB_MDA_J1''@/$(GL_GNULIB_MDA_J1)/g' \
+ -e 's/@''GNULIB_MDA_JN''@/$(GL_GNULIB_MDA_JN)/g' \
+ -e 's/@''GNULIB_MDA_Y0''@/$(GL_GNULIB_MDA_Y0)/g' \
+ -e 's/@''GNULIB_MDA_Y1''@/$(GL_GNULIB_MDA_Y1)/g' \
+ -e 's/@''GNULIB_MDA_YN''@/$(GL_GNULIB_MDA_YN)/g' \
+ | \
+ sed -e 's|@''HAVE_ACOSF''@|$(HAVE_ACOSF)|g' \
+ -e 's|@''HAVE_ACOSL''@|$(HAVE_ACOSL)|g' \
+ -e 's|@''HAVE_ASINF''@|$(HAVE_ASINF)|g' \
+ -e 's|@''HAVE_ASINL''@|$(HAVE_ASINL)|g' \
+ -e 's|@''HAVE_ATANF''@|$(HAVE_ATANF)|g' \
+ -e 's|@''HAVE_ATANL''@|$(HAVE_ATANL)|g' \
+ -e 's|@''HAVE_ATAN2F''@|$(HAVE_ATAN2F)|g' \
+ -e 's|@''HAVE_CBRT''@|$(HAVE_CBRT)|g' \
+ -e 's|@''HAVE_CBRTF''@|$(HAVE_CBRTF)|g' \
+ -e 's|@''HAVE_CBRTL''@|$(HAVE_CBRTL)|g' \
+ -e 's|@''HAVE_COPYSIGN''@|$(HAVE_COPYSIGN)|g' \
+ -e 's|@''HAVE_COPYSIGNL''@|$(HAVE_COPYSIGNL)|g' \
+ -e 's|@''HAVE_COSF''@|$(HAVE_COSF)|g' \
+ -e 's|@''HAVE_COSL''@|$(HAVE_COSL)|g' \
+ -e 's|@''HAVE_COSHF''@|$(HAVE_COSHF)|g' \
+ -e 's|@''HAVE_EXPF''@|$(HAVE_EXPF)|g' \
+ -e 's|@''HAVE_EXPL''@|$(HAVE_EXPL)|g' \
+ -e 's|@''HAVE_EXPM1''@|$(HAVE_EXPM1)|g' \
+ -e 's|@''HAVE_EXPM1F''@|$(HAVE_EXPM1F)|g' \
+ -e 's|@''HAVE_FABSF''@|$(HAVE_FABSF)|g' \
+ -e 's|@''HAVE_FABSL''@|$(HAVE_FABSL)|g' \
+ -e 's|@''HAVE_FMA''@|$(HAVE_FMA)|g' \
+ -e 's|@''HAVE_FMAF''@|$(HAVE_FMAF)|g' \
+ -e 's|@''HAVE_FMAL''@|$(HAVE_FMAL)|g' \
+ -e 's|@''HAVE_FMODF''@|$(HAVE_FMODF)|g' \
+ -e 's|@''HAVE_FMODL''@|$(HAVE_FMODL)|g' \
+ -e 's|@''HAVE_FREXPF''@|$(HAVE_FREXPF)|g' \
+ -e 's|@''HAVE_HYPOTF''@|$(HAVE_HYPOTF)|g' \
+ -e 's|@''HAVE_HYPOTL''@|$(HAVE_HYPOTL)|g' \
+ -e 's|@''HAVE_ILOGB''@|$(HAVE_ILOGB)|g' \
+ -e 's|@''HAVE_ILOGBF''@|$(HAVE_ILOGBF)|g' \
+ -e 's|@''HAVE_ILOGBL''@|$(HAVE_ILOGBL)|g' \
+ -e 's|@''HAVE_ISNANF''@|$(HAVE_ISNANF)|g' \
+ -e 's|@''HAVE_ISNAND''@|$(HAVE_ISNAND)|g' \
+ -e 's|@''HAVE_ISNANL''@|$(HAVE_ISNANL)|g' \
+ -e 's|@''HAVE_LDEXPF''@|$(HAVE_LDEXPF)|g' \
+ -e 's|@''HAVE_LOGF''@|$(HAVE_LOGF)|g' \
+ -e 's|@''HAVE_LOGL''@|$(HAVE_LOGL)|g' \
+ -e 's|@''HAVE_LOG10F''@|$(HAVE_LOG10F)|g' \
+ -e 's|@''HAVE_LOG10L''@|$(HAVE_LOG10L)|g' \
+ -e 's|@''HAVE_LOG1P''@|$(HAVE_LOG1P)|g' \
+ -e 's|@''HAVE_LOG1PF''@|$(HAVE_LOG1PF)|g' \
+ -e 's|@''HAVE_LOG1PL''@|$(HAVE_LOG1PL)|g' \
+ -e 's|@''HAVE_LOGBF''@|$(HAVE_LOGBF)|g' \
+ -e 's|@''HAVE_LOGBL''@|$(HAVE_LOGBL)|g' \
+ -e 's|@''HAVE_MODFF''@|$(HAVE_MODFF)|g' \
+ -e 's|@''HAVE_MODFL''@|$(HAVE_MODFL)|g' \
+ -e 's|@''HAVE_POWF''@|$(HAVE_POWF)|g' \
+ -e 's|@''HAVE_REMAINDER''@|$(HAVE_REMAINDER)|g' \
+ -e 's|@''HAVE_REMAINDERF''@|$(HAVE_REMAINDERF)|g' \
+ -e 's|@''HAVE_RINT''@|$(HAVE_RINT)|g' \
+ -e 's|@''HAVE_RINTL''@|$(HAVE_RINTL)|g' \
+ -e 's|@''HAVE_SINF''@|$(HAVE_SINF)|g' \
+ -e 's|@''HAVE_SINL''@|$(HAVE_SINL)|g' \
+ -e 's|@''HAVE_SINHF''@|$(HAVE_SINHF)|g' \
+ -e 's|@''HAVE_SQRTF''@|$(HAVE_SQRTF)|g' \
+ -e 's|@''HAVE_SQRTL''@|$(HAVE_SQRTL)|g' \
+ -e 's|@''HAVE_TANF''@|$(HAVE_TANF)|g' \
+ -e 's|@''HAVE_TANL''@|$(HAVE_TANL)|g' \
+ -e 's|@''HAVE_TANHF''@|$(HAVE_TANHF)|g' \
+ -e 's|@''HAVE_DECL_ACOSL''@|$(HAVE_DECL_ACOSL)|g' \
+ -e 's|@''HAVE_DECL_ASINL''@|$(HAVE_DECL_ASINL)|g' \
+ -e 's|@''HAVE_DECL_ATANL''@|$(HAVE_DECL_ATANL)|g' \
+ -e 's|@''HAVE_DECL_CBRTF''@|$(HAVE_DECL_CBRTF)|g' \
+ -e 's|@''HAVE_DECL_CBRTL''@|$(HAVE_DECL_CBRTL)|g' \
+ -e 's|@''HAVE_DECL_CEILF''@|$(HAVE_DECL_CEILF)|g' \
+ -e 's|@''HAVE_DECL_CEILL''@|$(HAVE_DECL_CEILL)|g' \
+ -e 's|@''HAVE_DECL_COPYSIGNF''@|$(HAVE_DECL_COPYSIGNF)|g' \
+ -e 's|@''HAVE_DECL_COSL''@|$(HAVE_DECL_COSL)|g' \
+ -e 's|@''HAVE_DECL_EXPL''@|$(HAVE_DECL_EXPL)|g' \
+ -e 's|@''HAVE_DECL_EXP2''@|$(HAVE_DECL_EXP2)|g' \
+ -e 's|@''HAVE_DECL_EXP2F''@|$(HAVE_DECL_EXP2F)|g' \
+ -e 's|@''HAVE_DECL_EXP2L''@|$(HAVE_DECL_EXP2L)|g' \
+ -e 's|@''HAVE_DECL_EXPM1L''@|$(HAVE_DECL_EXPM1L)|g' \
+ -e 's|@''HAVE_DECL_FLOORF''@|$(HAVE_DECL_FLOORF)|g' \
+ -e 's|@''HAVE_DECL_FLOORL''@|$(HAVE_DECL_FLOORL)|g' \
+ -e 's|@''HAVE_DECL_FREXPL''@|$(HAVE_DECL_FREXPL)|g' \
+ -e 's|@''HAVE_DECL_LDEXPL''@|$(HAVE_DECL_LDEXPL)|g' \
+ -e 's|@''HAVE_DECL_LOGL''@|$(HAVE_DECL_LOGL)|g' \
+ -e 's|@''HAVE_DECL_LOG10L''@|$(HAVE_DECL_LOG10L)|g' \
+ -e 's|@''HAVE_DECL_LOG2''@|$(HAVE_DECL_LOG2)|g' \
+ -e 's|@''HAVE_DECL_LOG2F''@|$(HAVE_DECL_LOG2F)|g' \
+ -e 's|@''HAVE_DECL_LOG2L''@|$(HAVE_DECL_LOG2L)|g' \
+ -e 's|@''HAVE_DECL_LOGB''@|$(HAVE_DECL_LOGB)|g' \
+ -e 's|@''HAVE_DECL_REMAINDER''@|$(HAVE_DECL_REMAINDER)|g' \
+ -e 's|@''HAVE_DECL_REMAINDERL''@|$(HAVE_DECL_REMAINDERL)|g' \
+ -e 's|@''HAVE_DECL_RINTF''@|$(HAVE_DECL_RINTF)|g' \
+ -e 's|@''HAVE_DECL_ROUND''@|$(HAVE_DECL_ROUND)|g' \
+ -e 's|@''HAVE_DECL_ROUNDF''@|$(HAVE_DECL_ROUNDF)|g' \
+ -e 's|@''HAVE_DECL_ROUNDL''@|$(HAVE_DECL_ROUNDL)|g' \
+ -e 's|@''HAVE_DECL_SINL''@|$(HAVE_DECL_SINL)|g' \
+ -e 's|@''HAVE_DECL_SQRTL''@|$(HAVE_DECL_SQRTL)|g' \
+ -e 's|@''HAVE_DECL_TANL''@|$(HAVE_DECL_TANL)|g' \
+ -e 's|@''HAVE_DECL_TRUNC''@|$(HAVE_DECL_TRUNC)|g' \
+ -e 's|@''HAVE_DECL_TRUNCF''@|$(HAVE_DECL_TRUNCF)|g' \
+ -e 's|@''HAVE_DECL_TRUNCL''@|$(HAVE_DECL_TRUNCL)|g' \
+ | \
+ sed -e 's|@''REPLACE_ACOSF''@|$(REPLACE_ACOSF)|g' \
+ -e 's|@''REPLACE_ASINF''@|$(REPLACE_ASINF)|g' \
+ -e 's|@''REPLACE_ATANF''@|$(REPLACE_ATANF)|g' \
+ -e 's|@''REPLACE_ATAN2F''@|$(REPLACE_ATAN2F)|g' \
+ -e 's|@''REPLACE_CBRTF''@|$(REPLACE_CBRTF)|g' \
+ -e 's|@''REPLACE_CBRTL''@|$(REPLACE_CBRTL)|g' \
+ -e 's|@''REPLACE_CEIL''@|$(REPLACE_CEIL)|g' \
+ -e 's|@''REPLACE_CEILF''@|$(REPLACE_CEILF)|g' \
+ -e 's|@''REPLACE_CEILL''@|$(REPLACE_CEILL)|g' \
+ -e 's|@''REPLACE_COSF''@|$(REPLACE_COSF)|g' \
+ -e 's|@''REPLACE_COSHF''@|$(REPLACE_COSHF)|g' \
+ -e 's|@''REPLACE_EXPF''@|$(REPLACE_EXPF)|g' \
+ -e 's|@''REPLACE_EXPL''@|$(REPLACE_EXPL)|g' \
+ -e 's|@''REPLACE_EXPM1''@|$(REPLACE_EXPM1)|g' \
+ -e 's|@''REPLACE_EXPM1F''@|$(REPLACE_EXPM1F)|g' \
+ -e 's|@''REPLACE_EXPM1L''@|$(REPLACE_EXPM1L)|g' \
+ -e 's|@''REPLACE_EXP2''@|$(REPLACE_EXP2)|g' \
+ -e 's|@''REPLACE_EXP2L''@|$(REPLACE_EXP2L)|g' \
+ -e 's|@''REPLACE_FABSL''@|$(REPLACE_FABSL)|g' \
+ -e 's|@''REPLACE_FLOOR''@|$(REPLACE_FLOOR)|g' \
+ -e 's|@''REPLACE_FLOORF''@|$(REPLACE_FLOORF)|g' \
+ -e 's|@''REPLACE_FLOORL''@|$(REPLACE_FLOORL)|g' \
+ -e 's|@''REPLACE_FMA''@|$(REPLACE_FMA)|g' \
+ -e 's|@''REPLACE_FMAF''@|$(REPLACE_FMAF)|g' \
+ -e 's|@''REPLACE_FMAL''@|$(REPLACE_FMAL)|g' \
+ -e 's|@''REPLACE_FMOD''@|$(REPLACE_FMOD)|g' \
+ -e 's|@''REPLACE_FMODF''@|$(REPLACE_FMODF)|g' \
+ -e 's|@''REPLACE_FMODL''@|$(REPLACE_FMODL)|g' \
+ -e 's|@''REPLACE_FREXPF''@|$(REPLACE_FREXPF)|g' \
+ -e 's|@''REPLACE_FREXP''@|$(REPLACE_FREXP)|g' \
+ -e 's|@''REPLACE_FREXPL''@|$(REPLACE_FREXPL)|g' \
+ -e 's|@''REPLACE_HUGE_VAL''@|$(REPLACE_HUGE_VAL)|g' \
+ -e 's|@''REPLACE_HYPOT''@|$(REPLACE_HYPOT)|g' \
+ -e 's|@''REPLACE_HYPOTF''@|$(REPLACE_HYPOTF)|g' \
+ -e 's|@''REPLACE_HYPOTL''@|$(REPLACE_HYPOTL)|g' \
+ -e 's|@''REPLACE_ILOGB''@|$(REPLACE_ILOGB)|g' \
+ -e 's|@''REPLACE_ILOGBF''@|$(REPLACE_ILOGBF)|g' \
+ -e 's|@''REPLACE_ILOGBL''@|$(REPLACE_ILOGBL)|g' \
+ -e 's|@''REPLACE_ISFINITE''@|$(REPLACE_ISFINITE)|g' \
+ -e 's|@''REPLACE_ISINF''@|$(REPLACE_ISINF)|g' \
+ -e 's|@''REPLACE_ISNAN''@|$(REPLACE_ISNAN)|g' \
+ -e 's|@''REPLACE_ITOLD''@|$(REPLACE_ITOLD)|g' \
+ -e 's|@''REPLACE_LDEXPL''@|$(REPLACE_LDEXPL)|g' \
+ -e 's|@''REPLACE_LOG''@|$(REPLACE_LOG)|g' \
+ -e 's|@''REPLACE_LOGF''@|$(REPLACE_LOGF)|g' \
+ -e 's|@''REPLACE_LOGL''@|$(REPLACE_LOGL)|g' \
+ -e 's|@''REPLACE_LOG10''@|$(REPLACE_LOG10)|g' \
+ -e 's|@''REPLACE_LOG10F''@|$(REPLACE_LOG10F)|g' \
+ -e 's|@''REPLACE_LOG10L''@|$(REPLACE_LOG10L)|g' \
+ -e 's|@''REPLACE_LOG1P''@|$(REPLACE_LOG1P)|g' \
+ -e 's|@''REPLACE_LOG1PF''@|$(REPLACE_LOG1PF)|g' \
+ -e 's|@''REPLACE_LOG1PL''@|$(REPLACE_LOG1PL)|g' \
+ -e 's|@''REPLACE_LOG2''@|$(REPLACE_LOG2)|g' \
+ -e 's|@''REPLACE_LOG2F''@|$(REPLACE_LOG2F)|g' \
+ -e 's|@''REPLACE_LOG2L''@|$(REPLACE_LOG2L)|g' \
+ -e 's|@''REPLACE_LOGB''@|$(REPLACE_LOGB)|g' \
+ -e 's|@''REPLACE_LOGBF''@|$(REPLACE_LOGBF)|g' \
+ -e 's|@''REPLACE_LOGBL''@|$(REPLACE_LOGBL)|g' \
+ -e 's|@''REPLACE_MODF''@|$(REPLACE_MODF)|g' \
+ -e 's|@''REPLACE_MODFF''@|$(REPLACE_MODFF)|g' \
+ -e 's|@''REPLACE_MODFL''@|$(REPLACE_MODFL)|g' \
+ -e 's|@''REPLACE_NAN''@|$(REPLACE_NAN)|g' \
+ -e 's|@''REPLACE_REMAINDER''@|$(REPLACE_REMAINDER)|g' \
+ -e 's|@''REPLACE_REMAINDERF''@|$(REPLACE_REMAINDERF)|g' \
+ -e 's|@''REPLACE_REMAINDERL''@|$(REPLACE_REMAINDERL)|g' \
+ -e 's|@''REPLACE_RINTL''@|$(REPLACE_RINTL)|g' \
+ -e 's|@''REPLACE_ROUND''@|$(REPLACE_ROUND)|g' \
+ -e 's|@''REPLACE_ROUNDF''@|$(REPLACE_ROUNDF)|g' \
+ -e 's|@''REPLACE_ROUNDL''@|$(REPLACE_ROUNDL)|g' \
+ -e 's|@''REPLACE_SIGNBIT''@|$(REPLACE_SIGNBIT)|g' \
+ -e 's|@''REPLACE_SIGNBIT_USING_BUILTINS''@|$(REPLACE_SIGNBIT_USING_BUILTINS)|g' \
+ -e 's|@''REPLACE_SINF''@|$(REPLACE_SINF)|g' \
+ -e 's|@''REPLACE_SINHF''@|$(REPLACE_SINHF)|g' \
+ -e 's|@''REPLACE_SQRTF''@|$(REPLACE_SQRTF)|g' \
+ -e 's|@''REPLACE_SQRTL''@|$(REPLACE_SQRTL)|g' \
+ -e 's|@''REPLACE_TANF''@|$(REPLACE_TANF)|g' \
+ -e 's|@''REPLACE_TANHF''@|$(REPLACE_TANHF)|g' \
+ -e 's|@''REPLACE_TRUNC''@|$(REPLACE_TRUNC)|g' \
+ -e 's|@''REPLACE_TRUNCF''@|$(REPLACE_TRUNCF)|g' \
+ -e 's|@''REPLACE_TRUNCL''@|$(REPLACE_TRUNCL)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ > $@-t
+ $(AM_V_at)mv $@-t $@
+
+# We need the following in order to create <stdbool.h> when the system
+# doesn't have one that works.
+@GL_GENERATE_STDBOOL_H_TRUE@lib/stdbool.h: lib/stdbool.in.h $(top_builddir)/config.status
+@GL_GENERATE_STDBOOL_H_TRUE@ $(AM_V_GEN)$(MKDIR_P) 'lib'
+@GL_GENERATE_STDBOOL_H_TRUE@ $(gl_V_at)$(SED_HEADER_STDOUT) \
+@GL_GENERATE_STDBOOL_H_TRUE@ -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' \
+@GL_GENERATE_STDBOOL_H_TRUE@ $(top_srcdir)/lib/stdbool.in.h > $@-t
+@GL_GENERATE_STDBOOL_H_TRUE@ $(AM_V_at)mv $@-t $@
+@GL_GENERATE_STDBOOL_H_FALSE@lib/stdbool.h: $(top_builddir)/config.status
+@GL_GENERATE_STDBOOL_H_FALSE@ rm -f $@
+
+# We need the following in order to create <stddef.h> when the system
+# doesn't have one that works with the given compiler.
+@GL_GENERATE_STDDEF_H_TRUE@lib/stddef.h: lib/stddef.in.h $(top_builddir)/config.status
+@GL_GENERATE_STDDEF_H_TRUE@ $(AM_V_GEN)$(MKDIR_P) 'lib'
+@GL_GENERATE_STDDEF_H_TRUE@ $(gl_V_at)$(SED_HEADER_STDOUT) \
+@GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''GUARD_PREFIX''@|GL|g' \
+@GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''NEXT_STDDEF_H''@|$(NEXT_STDDEF_H)|g' \
+@GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''HAVE_MAX_ALIGN_T''@|$(HAVE_MAX_ALIGN_T)|g' \
+@GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''HAVE_WCHAR_T''@|$(HAVE_WCHAR_T)|g' \
+@GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''REPLACE_NULL''@|$(REPLACE_NULL)|g' \
+@GL_GENERATE_STDDEF_H_TRUE@ $(top_srcdir)/lib/stddef.in.h > $@-t
+@GL_GENERATE_STDDEF_H_TRUE@ $(AM_V_at)mv $@-t $@
+@GL_GENERATE_STDDEF_H_FALSE@lib/stddef.h: $(top_builddir)/config.status
+@GL_GENERATE_STDDEF_H_FALSE@ rm -f $@
+
+# We need the following in order to create <stdint.h> when the system
+# doesn't have one that works with the given compiler.
+@GL_GENERATE_STDINT_H_TRUE@lib/stdint.h: lib/stdint.in.h $(top_builddir)/config.status
+@GL_GENERATE_STDINT_H_TRUE@ $(AM_V_GEN)$(MKDIR_P) 'lib'
+@GL_GENERATE_STDINT_H_TRUE@ $(gl_V_at)$(SED_HEADER_STDOUT) \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's|@''GUARD_PREFIX''@|GL|g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_STDINT_H''@/$(HAVE_STDINT_H)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's|@''NEXT_STDINT_H''@|$(NEXT_STDINT_H)|g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_C99_STDINT_H''@/$(HAVE_C99_STDINT_H)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SYS_TYPES_H''@/$(HAVE_SYS_TYPES_H)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SYS_INTTYPES_H''@/$(HAVE_SYS_INTTYPES_H)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SYS_BITYPES_H''@/$(HAVE_SYS_BITYPES_H)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_WCHAR_H''@/$(HAVE_WCHAR_H)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_PTRDIFF_T''@/$(BITSIZEOF_PTRDIFF_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''PTRDIFF_T_SUFFIX''@/$(PTRDIFF_T_SUFFIX)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_SIG_ATOMIC_T''@/$(BITSIZEOF_SIG_ATOMIC_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SIGNED_SIG_ATOMIC_T''@/$(HAVE_SIGNED_SIG_ATOMIC_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''SIG_ATOMIC_T_SUFFIX''@/$(SIG_ATOMIC_T_SUFFIX)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_SIZE_T''@/$(BITSIZEOF_SIZE_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''SIZE_T_SUFFIX''@/$(SIZE_T_SUFFIX)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_WCHAR_T''@/$(BITSIZEOF_WCHAR_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SIGNED_WCHAR_T''@/$(HAVE_SIGNED_WCHAR_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''WCHAR_T_SUFFIX''@/$(WCHAR_T_SUFFIX)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_WINT_T''@/$(BITSIZEOF_WINT_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SIGNED_WINT_T''@/$(HAVE_SIGNED_WINT_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''WINT_T_SUFFIX''@/$(WINT_T_SUFFIX)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''GNULIBHEADERS_OVERRIDE_WINT_T''@/$(GNULIBHEADERS_OVERRIDE_WINT_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ $(top_srcdir)/lib/stdint.in.h > $@-t
+@GL_GENERATE_STDINT_H_TRUE@ $(AM_V_at)mv $@-t $@
+@GL_GENERATE_STDINT_H_FALSE@lib/stdint.h: $(top_builddir)/config.status
+@GL_GENERATE_STDINT_H_FALSE@ rm -f $@
+
+# We need the following in order to create <stdio.h> when the system
+# doesn't have one that works with the given compiler.
+lib/stdio.h: lib/stdio.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)$(MKDIR_P) 'lib'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_STDIO_H''@|$(NEXT_STDIO_H)|g' \
+ -e 's/@''GNULIB_DPRINTF''@/$(GL_GNULIB_DPRINTF)/g' \
+ -e 's/@''GNULIB_FCLOSE''@/$(GL_GNULIB_FCLOSE)/g' \
+ -e 's/@''GNULIB_FDOPEN''@/$(GL_GNULIB_FDOPEN)/g' \
+ -e 's/@''GNULIB_FFLUSH''@/$(GL_GNULIB_FFLUSH)/g' \
+ -e 's/@''GNULIB_FGETC''@/$(GL_GNULIB_FGETC)/g' \
+ -e 's/@''GNULIB_FGETS''@/$(GL_GNULIB_FGETS)/g' \
+ -e 's/@''GNULIB_FOPEN''@/$(GL_GNULIB_FOPEN)/g' \
+ -e 's/@''GNULIB_FOPEN_GNU''@/$(GL_GNULIB_FOPEN_GNU)/g' \
+ -e 's/@''GNULIB_FPRINTF''@/$(GL_GNULIB_FPRINTF)/g' \
+ -e 's/@''GNULIB_FPRINTF_POSIX''@/$(GL_GNULIB_FPRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_FPURGE''@/$(GL_GNULIB_FPURGE)/g' \
+ -e 's/@''GNULIB_FPUTC''@/$(GL_GNULIB_FPUTC)/g' \
+ -e 's/@''GNULIB_FPUTS''@/$(GL_GNULIB_FPUTS)/g' \
+ -e 's/@''GNULIB_FREAD''@/$(GL_GNULIB_FREAD)/g' \
+ -e 's/@''GNULIB_FREOPEN''@/$(GL_GNULIB_FREOPEN)/g' \
+ -e 's/@''GNULIB_FSCANF''@/$(GL_GNULIB_FSCANF)/g' \
+ -e 's/@''GNULIB_FSEEK''@/$(GL_GNULIB_FSEEK)/g' \
+ -e 's/@''GNULIB_FSEEKO''@/$(GL_GNULIB_FSEEKO)/g' \
+ -e 's/@''GNULIB_FTELL''@/$(GL_GNULIB_FTELL)/g' \
+ -e 's/@''GNULIB_FTELLO''@/$(GL_GNULIB_FTELLO)/g' \
+ -e 's/@''GNULIB_FWRITE''@/$(GL_GNULIB_FWRITE)/g' \
+ -e 's/@''GNULIB_GETC''@/$(GL_GNULIB_GETC)/g' \
+ -e 's/@''GNULIB_GETCHAR''@/$(GL_GNULIB_GETCHAR)/g' \
+ -e 's/@''GNULIB_GETDELIM''@/$(GL_GNULIB_GETDELIM)/g' \
+ -e 's/@''GNULIB_GETLINE''@/$(GL_GNULIB_GETLINE)/g' \
+ -e 's/@''GNULIB_OBSTACK_PRINTF''@/$(GL_GNULIB_OBSTACK_PRINTF)/g' \
+ -e 's/@''GNULIB_OBSTACK_PRINTF_POSIX''@/$(GL_GNULIB_OBSTACK_PRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_PCLOSE''@/$(GL_GNULIB_PCLOSE)/g' \
+ -e 's/@''GNULIB_PERROR''@/$(GL_GNULIB_PERROR)/g' \
+ -e 's/@''GNULIB_POPEN''@/$(GL_GNULIB_POPEN)/g' \
+ -e 's/@''GNULIB_PRINTF''@/$(GL_GNULIB_PRINTF)/g' \
+ -e 's/@''GNULIB_PRINTF_POSIX''@/$(GL_GNULIB_PRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_PUTC''@/$(GL_GNULIB_PUTC)/g' \
+ -e 's/@''GNULIB_PUTCHAR''@/$(GL_GNULIB_PUTCHAR)/g' \
+ -e 's/@''GNULIB_PUTS''@/$(GL_GNULIB_PUTS)/g' \
+ -e 's/@''GNULIB_REMOVE''@/$(GL_GNULIB_REMOVE)/g' \
+ -e 's/@''GNULIB_RENAME''@/$(GL_GNULIB_RENAME)/g' \
+ -e 's/@''GNULIB_RENAMEAT''@/$(GL_GNULIB_RENAMEAT)/g' \
+ -e 's/@''GNULIB_SCANF''@/$(GL_GNULIB_SCANF)/g' \
+ -e 's/@''GNULIB_SNPRINTF''@/$(GL_GNULIB_SNPRINTF)/g' \
+ -e 's/@''GNULIB_SPRINTF_POSIX''@/$(GL_GNULIB_SPRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_STDIO_H_NONBLOCKING''@/$(GL_GNULIB_STDIO_H_NONBLOCKING)/g' \
+ -e 's/@''GNULIB_STDIO_H_SIGPIPE''@/$(GL_GNULIB_STDIO_H_SIGPIPE)/g' \
+ -e 's/@''GNULIB_TMPFILE''@/$(GL_GNULIB_TMPFILE)/g' \
+ -e 's/@''GNULIB_VASPRINTF''@/$(GL_GNULIB_VASPRINTF)/g' \
+ -e 's/@''GNULIB_VDPRINTF''@/$(GL_GNULIB_VDPRINTF)/g' \
+ -e 's/@''GNULIB_VFPRINTF''@/$(GL_GNULIB_VFPRINTF)/g' \
+ -e 's/@''GNULIB_VFPRINTF_POSIX''@/$(GL_GNULIB_VFPRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_VFSCANF''@/$(GL_GNULIB_VFSCANF)/g' \
+ -e 's/@''GNULIB_VSCANF''@/$(GL_GNULIB_VSCANF)/g' \
+ -e 's/@''GNULIB_VPRINTF''@/$(GL_GNULIB_VPRINTF)/g' \
+ -e 's/@''GNULIB_VPRINTF_POSIX''@/$(GL_GNULIB_VPRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_VSNPRINTF''@/$(GL_GNULIB_VSNPRINTF)/g' \
+ -e 's/@''GNULIB_VSPRINTF_POSIX''@/$(GL_GNULIB_VSPRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_MDA_FCLOSEALL''@/$(GL_GNULIB_MDA_FCLOSEALL)/g' \
+ -e 's/@''GNULIB_MDA_FDOPEN''@/$(GL_GNULIB_MDA_FDOPEN)/g' \
+ -e 's/@''GNULIB_MDA_FILENO''@/$(GL_GNULIB_MDA_FILENO)/g' \
+ -e 's/@''GNULIB_MDA_GETW''@/$(GL_GNULIB_MDA_GETW)/g' \
+ -e 's/@''GNULIB_MDA_PUTW''@/$(GL_GNULIB_MDA_PUTW)/g' \
+ -e 's/@''GNULIB_MDA_TEMPNAM''@/$(GL_GNULIB_MDA_TEMPNAM)/g' \
+ < $(top_srcdir)/lib/stdio.in.h | \
+ sed -e 's|@''HAVE_DECL_FCLOSEALL''@|$(HAVE_DECL_FCLOSEALL)|g' \
+ -e 's|@''HAVE_DECL_FPURGE''@|$(HAVE_DECL_FPURGE)|g' \
+ -e 's|@''HAVE_DECL_FSEEKO''@|$(HAVE_DECL_FSEEKO)|g' \
+ -e 's|@''HAVE_DECL_FTELLO''@|$(HAVE_DECL_FTELLO)|g' \
+ -e 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \
+ -e 's|@''HAVE_DECL_GETLINE''@|$(HAVE_DECL_GETLINE)|g' \
+ -e 's|@''HAVE_DECL_GETW''@|$(HAVE_DECL_GETW)|g' \
+ -e 's|@''HAVE_DECL_OBSTACK_PRINTF''@|$(HAVE_DECL_OBSTACK_PRINTF)|g' \
+ -e 's|@''HAVE_DECL_PUTW''@|$(HAVE_DECL_PUTW)|g' \
+ -e 's|@''HAVE_DECL_SNPRINTF''@|$(HAVE_DECL_SNPRINTF)|g' \
+ -e 's|@''HAVE_DECL_VSNPRINTF''@|$(HAVE_DECL_VSNPRINTF)|g' \
+ -e 's|@''HAVE_DPRINTF''@|$(HAVE_DPRINTF)|g' \
+ -e 's|@''HAVE_FSEEKO''@|$(HAVE_FSEEKO)|g' \
+ -e 's|@''HAVE_FTELLO''@|$(HAVE_FTELLO)|g' \
+ -e 's|@''HAVE_PCLOSE''@|$(HAVE_PCLOSE)|g' \
+ -e 's|@''HAVE_POPEN''@|$(HAVE_POPEN)|g' \
+ -e 's|@''HAVE_RENAMEAT''@|$(HAVE_RENAMEAT)|g' \
+ -e 's|@''HAVE_VASPRINTF''@|$(HAVE_VASPRINTF)|g' \
+ -e 's|@''HAVE_VDPRINTF''@|$(HAVE_VDPRINTF)|g' \
+ -e 's|@''REPLACE_DPRINTF''@|$(REPLACE_DPRINTF)|g' \
+ -e 's|@''REPLACE_FCLOSE''@|$(REPLACE_FCLOSE)|g' \
+ -e 's|@''REPLACE_FDOPEN''@|$(REPLACE_FDOPEN)|g' \
+ -e 's|@''REPLACE_FFLUSH''@|$(REPLACE_FFLUSH)|g' \
+ -e 's|@''REPLACE_FOPEN''@|$(REPLACE_FOPEN)|g' \
+ -e 's|@''REPLACE_FOPEN_FOR_FOPEN_GNU''@|$(REPLACE_FOPEN_FOR_FOPEN_GNU)|g' \
+ -e 's|@''REPLACE_FPRINTF''@|$(REPLACE_FPRINTF)|g' \
+ -e 's|@''REPLACE_FPURGE''@|$(REPLACE_FPURGE)|g' \
+ -e 's|@''REPLACE_FREOPEN''@|$(REPLACE_FREOPEN)|g' \
+ -e 's|@''REPLACE_FSEEK''@|$(REPLACE_FSEEK)|g' \
+ -e 's|@''REPLACE_FSEEKO''@|$(REPLACE_FSEEKO)|g' \
+ -e 's|@''REPLACE_FTELL''@|$(REPLACE_FTELL)|g' \
+ -e 's|@''REPLACE_FTELLO''@|$(REPLACE_FTELLO)|g' \
+ -e 's|@''REPLACE_GETDELIM''@|$(REPLACE_GETDELIM)|g' \
+ -e 's|@''REPLACE_GETLINE''@|$(REPLACE_GETLINE)|g' \
+ -e 's|@''REPLACE_OBSTACK_PRINTF''@|$(REPLACE_OBSTACK_PRINTF)|g' \
+ -e 's|@''REPLACE_PERROR''@|$(REPLACE_PERROR)|g' \
+ -e 's|@''REPLACE_POPEN''@|$(REPLACE_POPEN)|g' \
+ -e 's|@''REPLACE_PRINTF''@|$(REPLACE_PRINTF)|g' \
+ -e 's|@''REPLACE_REMOVE''@|$(REPLACE_REMOVE)|g' \
+ -e 's|@''REPLACE_RENAME''@|$(REPLACE_RENAME)|g' \
+ -e 's|@''REPLACE_RENAMEAT''@|$(REPLACE_RENAMEAT)|g' \
+ -e 's|@''REPLACE_SNPRINTF''@|$(REPLACE_SNPRINTF)|g' \
+ -e 's|@''REPLACE_SPRINTF''@|$(REPLACE_SPRINTF)|g' \
+ -e 's|@''REPLACE_STDIO_READ_FUNCS''@|$(REPLACE_STDIO_READ_FUNCS)|g' \
+ -e 's|@''REPLACE_STDIO_WRITE_FUNCS''@|$(REPLACE_STDIO_WRITE_FUNCS)|g' \
+ -e 's|@''REPLACE_TMPFILE''@|$(REPLACE_TMPFILE)|g' \
+ -e 's|@''REPLACE_VASPRINTF''@|$(REPLACE_VASPRINTF)|g' \
+ -e 's|@''REPLACE_VDPRINTF''@|$(REPLACE_VDPRINTF)|g' \
+ -e 's|@''REPLACE_VFPRINTF''@|$(REPLACE_VFPRINTF)|g' \
+ -e 's|@''REPLACE_VPRINTF''@|$(REPLACE_VPRINTF)|g' \
+ -e 's|@''REPLACE_VSNPRINTF''@|$(REPLACE_VSNPRINTF)|g' \
+ -e 's|@''REPLACE_VSPRINTF''@|$(REPLACE_VSPRINTF)|g' \
+ -e 's|@''ASM_SYMBOL_PREFIX''@|$(ASM_SYMBOL_PREFIX)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ > $@-t
+ $(AM_V_at)mv $@-t $@
+
+# We need the following in order to create <stdlib.h> when the system
+# doesn't have one that works with the given compiler.
+lib/stdlib.h: lib/stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \
+ $(_NORETURN_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)$(MKDIR_P) 'lib'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \
+ -e 's/@''GNULIB__EXIT''@/$(GL_GNULIB__EXIT)/g' \
+ -e 's/@''GNULIB_ALIGNED_ALLOC''@/$(GL_GNULIB_ALIGNED_ALLOC)/g' \
+ -e 's/@''GNULIB_ATOLL''@/$(GL_GNULIB_ATOLL)/g' \
+ -e 's/@''GNULIB_CALLOC_GNU''@/$(GL_GNULIB_CALLOC_GNU)/g' \
+ -e 's/@''GNULIB_CALLOC_POSIX''@/$(GL_GNULIB_CALLOC_POSIX)/g' \
+ -e 's/@''GNULIB_CANONICALIZE_FILE_NAME''@/$(GL_GNULIB_CANONICALIZE_FILE_NAME)/g' \
+ -e 's/@''GNULIB_FREE_POSIX''@/$(GL_GNULIB_FREE_POSIX)/g' \
+ -e 's/@''GNULIB_GETLOADAVG''@/$(GL_GNULIB_GETLOADAVG)/g' \
+ -e 's/@''GNULIB_GETPROGNAME''@/$(GL_GNULIB_GETPROGNAME)/g' \
+ -e 's/@''GNULIB_GETSUBOPT''@/$(GL_GNULIB_GETSUBOPT)/g' \
+ -e 's/@''GNULIB_GRANTPT''@/$(GL_GNULIB_GRANTPT)/g' \
+ -e 's/@''GNULIB_MALLOC_GNU''@/$(GL_GNULIB_MALLOC_GNU)/g' \
+ -e 's/@''GNULIB_MALLOC_POSIX''@/$(GL_GNULIB_MALLOC_POSIX)/g' \
+ -e 's/@''GNULIB_MBTOWC''@/$(GL_GNULIB_MBTOWC)/g' \
+ -e 's/@''GNULIB_MKDTEMP''@/$(GL_GNULIB_MKDTEMP)/g' \
+ -e 's/@''GNULIB_MKOSTEMP''@/$(GL_GNULIB_MKOSTEMP)/g' \
+ -e 's/@''GNULIB_MKOSTEMPS''@/$(GL_GNULIB_MKOSTEMPS)/g' \
+ -e 's/@''GNULIB_MKSTEMP''@/$(GL_GNULIB_MKSTEMP)/g' \
+ -e 's/@''GNULIB_MKSTEMPS''@/$(GL_GNULIB_MKSTEMPS)/g' \
+ -e 's/@''GNULIB_POSIX_MEMALIGN''@/$(GL_GNULIB_POSIX_MEMALIGN)/g' \
+ -e 's/@''GNULIB_POSIX_OPENPT''@/$(GL_GNULIB_POSIX_OPENPT)/g' \
+ -e 's/@''GNULIB_PTSNAME''@/$(GL_GNULIB_PTSNAME)/g' \
+ -e 's/@''GNULIB_PTSNAME_R''@/$(GL_GNULIB_PTSNAME_R)/g' \
+ -e 's/@''GNULIB_PUTENV''@/$(GL_GNULIB_PUTENV)/g' \
+ -e 's/@''GNULIB_QSORT_R''@/$(GL_GNULIB_QSORT_R)/g' \
+ -e 's/@''GNULIB_RANDOM''@/$(GL_GNULIB_RANDOM)/g' \
+ -e 's/@''GNULIB_RANDOM_R''@/$(GL_GNULIB_RANDOM_R)/g' \
+ -e 's/@''GNULIB_REALLOC_GNU''@/$(GL_GNULIB_REALLOC_GNU)/g' \
+ -e 's/@''GNULIB_REALLOC_POSIX''@/$(GL_GNULIB_REALLOC_POSIX)/g' \
+ -e 's/@''GNULIB_REALLOCARRAY''@/$(GL_GNULIB_REALLOCARRAY)/g' \
+ -e 's/@''GNULIB_REALPATH''@/$(GL_GNULIB_REALPATH)/g' \
+ -e 's/@''GNULIB_RPMATCH''@/$(GL_GNULIB_RPMATCH)/g' \
+ -e 's/@''GNULIB_SECURE_GETENV''@/$(GL_GNULIB_SECURE_GETENV)/g' \
+ -e 's/@''GNULIB_SETENV''@/$(GL_GNULIB_SETENV)/g' \
+ -e 's/@''GNULIB_STRTOD''@/$(GL_GNULIB_STRTOD)/g' \
+ -e 's/@''GNULIB_STRTOL''@/$(GL_GNULIB_STRTOL)/g' \
+ -e 's/@''GNULIB_STRTOLD''@/$(GL_GNULIB_STRTOLD)/g' \
+ -e 's/@''GNULIB_STRTOLL''@/$(GL_GNULIB_STRTOLL)/g' \
+ -e 's/@''GNULIB_STRTOUL''@/$(GL_GNULIB_STRTOUL)/g' \
+ -e 's/@''GNULIB_STRTOULL''@/$(GL_GNULIB_STRTOULL)/g' \
+ -e 's/@''GNULIB_SYSTEM_POSIX''@/$(GL_GNULIB_SYSTEM_POSIX)/g' \
+ -e 's/@''GNULIB_UNLOCKPT''@/$(GL_GNULIB_UNLOCKPT)/g' \
+ -e 's/@''GNULIB_UNSETENV''@/$(GL_GNULIB_UNSETENV)/g' \
+ -e 's/@''GNULIB_WCTOMB''@/$(GL_GNULIB_WCTOMB)/g' \
+ -e 's/@''GNULIB_MDA_ECVT''@/$(GL_GNULIB_MDA_ECVT)/g' \
+ -e 's/@''GNULIB_MDA_FCVT''@/$(GL_GNULIB_MDA_FCVT)/g' \
+ -e 's/@''GNULIB_MDA_GCVT''@/$(GL_GNULIB_MDA_GCVT)/g' \
+ -e 's/@''GNULIB_MDA_MKTEMP''@/$(GL_GNULIB_MDA_MKTEMP)/g' \
+ -e 's/@''GNULIB_MDA_PUTENV''@/$(GL_GNULIB_MDA_PUTENV)/g' \
+ < $(top_srcdir)/lib/stdlib.in.h | \
+ sed -e 's|@''HAVE__EXIT''@|$(HAVE__EXIT)|g' \
+ -e 's|@''HAVE_ALIGNED_ALLOC''@|$(HAVE_ALIGNED_ALLOC)|g' \
+ -e 's|@''HAVE_ATOLL''@|$(HAVE_ATOLL)|g' \
+ -e 's|@''HAVE_CANONICALIZE_FILE_NAME''@|$(HAVE_CANONICALIZE_FILE_NAME)|g' \
+ -e 's|@''HAVE_DECL_ECVT''@|$(HAVE_DECL_ECVT)|g' \
+ -e 's|@''HAVE_DECL_FCVT''@|$(HAVE_DECL_FCVT)|g' \
+ -e 's|@''HAVE_DECL_GCVT''@|$(HAVE_DECL_GCVT)|g' \
+ -e 's|@''HAVE_DECL_GETLOADAVG''@|$(HAVE_DECL_GETLOADAVG)|g' \
+ -e 's|@''HAVE_GETPROGNAME''@|$(HAVE_GETPROGNAME)|g' \
+ -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \
+ -e 's|@''HAVE_GRANTPT''@|$(HAVE_GRANTPT)|g' \
+ -e 's|@''HAVE_INITSTATE''@|$(HAVE_INITSTATE)|g' \
+ -e 's|@''HAVE_DECL_INITSTATE''@|$(HAVE_DECL_INITSTATE)|g' \
+ -e 's|@''HAVE_MBTOWC''@|$(HAVE_MBTOWC)|g' \
+ -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \
+ -e 's|@''HAVE_MKOSTEMP''@|$(HAVE_MKOSTEMP)|g' \
+ -e 's|@''HAVE_MKOSTEMPS''@|$(HAVE_MKOSTEMPS)|g' \
+ -e 's|@''HAVE_MKSTEMP''@|$(HAVE_MKSTEMP)|g' \
+ -e 's|@''HAVE_MKSTEMPS''@|$(HAVE_MKSTEMPS)|g' \
+ -e 's|@''HAVE_POSIX_MEMALIGN''@|$(HAVE_POSIX_MEMALIGN)|g' \
+ -e 's|@''HAVE_POSIX_OPENPT''@|$(HAVE_POSIX_OPENPT)|g' \
+ -e 's|@''HAVE_PTSNAME''@|$(HAVE_PTSNAME)|g' \
+ -e 's|@''HAVE_PTSNAME_R''@|$(HAVE_PTSNAME_R)|g' \
+ -e 's|@''HAVE_QSORT_R''@|$(HAVE_QSORT_R)|g' \
+ -e 's|@''HAVE_RANDOM''@|$(HAVE_RANDOM)|g' \
+ -e 's|@''HAVE_RANDOM_H''@|$(HAVE_RANDOM_H)|g' \
+ -e 's|@''HAVE_RANDOM_R''@|$(HAVE_RANDOM_R)|g' \
+ -e 's|@''HAVE_REALLOCARRAY''@|$(HAVE_REALLOCARRAY)|g' \
+ -e 's|@''HAVE_REALPATH''@|$(HAVE_REALPATH)|g' \
+ -e 's|@''HAVE_RPMATCH''@|$(HAVE_RPMATCH)|g' \
+ -e 's|@''HAVE_SECURE_GETENV''@|$(HAVE_SECURE_GETENV)|g' \
+ -e 's|@''HAVE_DECL_SETENV''@|$(HAVE_DECL_SETENV)|g' \
+ -e 's|@''HAVE_SETSTATE''@|$(HAVE_SETSTATE)|g' \
+ -e 's|@''HAVE_DECL_SETSTATE''@|$(HAVE_DECL_SETSTATE)|g' \
+ -e 's|@''HAVE_STRTOD''@|$(HAVE_STRTOD)|g' \
+ -e 's|@''HAVE_STRTOL''@|$(HAVE_STRTOL)|g' \
+ -e 's|@''HAVE_STRTOLD''@|$(HAVE_STRTOLD)|g' \
+ -e 's|@''HAVE_STRTOLL''@|$(HAVE_STRTOLL)|g' \
+ -e 's|@''HAVE_STRTOUL''@|$(HAVE_STRTOUL)|g' \
+ -e 's|@''HAVE_STRTOULL''@|$(HAVE_STRTOULL)|g' \
+ -e 's|@''HAVE_STRUCT_RANDOM_DATA''@|$(HAVE_STRUCT_RANDOM_DATA)|g' \
+ -e 's|@''HAVE_SYS_LOADAVG_H''@|$(HAVE_SYS_LOADAVG_H)|g' \
+ -e 's|@''HAVE_UNLOCKPT''@|$(HAVE_UNLOCKPT)|g' \
+ -e 's|@''HAVE_DECL_UNSETENV''@|$(HAVE_DECL_UNSETENV)|g' \
+ -e 's|@''REPLACE__EXIT''@|$(REPLACE__EXIT)|g' \
+ -e 's|@''REPLACE_ALIGNED_ALLOC''@|$(REPLACE_ALIGNED_ALLOC)|g' \
+ -e 's|@''REPLACE_CALLOC_FOR_CALLOC_GNU''@|$(REPLACE_CALLOC_FOR_CALLOC_GNU)|g' \
+ -e 's|@''REPLACE_CALLOC_FOR_CALLOC_POSIX''@|$(REPLACE_CALLOC_FOR_CALLOC_POSIX)|g' \
+ -e 's|@''REPLACE_CANONICALIZE_FILE_NAME''@|$(REPLACE_CANONICALIZE_FILE_NAME)|g' \
+ -e 's|@''REPLACE_FREE''@|$(REPLACE_FREE)|g' \
+ -e 's|@''REPLACE_GETLOADAVG''@|$(REPLACE_GETLOADAVG)|g' \
+ -e 's|@''REPLACE_GETPROGNAME''@|$(REPLACE_GETPROGNAME)|g' \
+ -e 's|@''REPLACE_GETSUBOPT''@|$(REPLACE_GETSUBOPT)|g' \
+ -e 's|@''REPLACE_INITSTATE''@|$(REPLACE_INITSTATE)|g' \
+ -e 's|@''REPLACE_MALLOC_FOR_MALLOC_GNU''@|$(REPLACE_MALLOC_FOR_MALLOC_GNU)|g' \
+ -e 's|@''REPLACE_MALLOC_FOR_MALLOC_POSIX''@|$(REPLACE_MALLOC_FOR_MALLOC_POSIX)|g' \
+ -e 's|@''REPLACE_MBTOWC''@|$(REPLACE_MBTOWC)|g' \
+ -e 's|@''REPLACE_MKOSTEMP''@|$(REPLACE_MKOSTEMP)|g' \
+ -e 's|@''REPLACE_MKOSTEMPS''@|$(REPLACE_MKOSTEMPS)|g' \
+ -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \
+ -e 's|@''REPLACE_POSIX_MEMALIGN''@|$(REPLACE_POSIX_MEMALIGN)|g' \
+ -e 's|@''REPLACE_POSIX_OPENPT''@|$(REPLACE_POSIX_OPENPT)|g' \
+ -e 's|@''REPLACE_PTSNAME''@|$(REPLACE_PTSNAME)|g' \
+ -e 's|@''REPLACE_PTSNAME_R''@|$(REPLACE_PTSNAME_R)|g' \
+ -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \
+ -e 's|@''REPLACE_QSORT_R''@|$(REPLACE_QSORT_R)|g' \
+ -e 's|@''REPLACE_RANDOM''@|$(REPLACE_RANDOM)|g' \
+ -e 's|@''REPLACE_RANDOM_R''@|$(REPLACE_RANDOM_R)|g' \
+ -e 's|@''REPLACE_REALLOC_FOR_REALLOC_GNU''@|$(REPLACE_REALLOC_FOR_REALLOC_GNU)|g' \
+ -e 's|@''REPLACE_REALLOC_FOR_REALLOC_POSIX''@|$(REPLACE_REALLOC_FOR_REALLOC_POSIX)|g' \
+ -e 's|@''REPLACE_REALLOCARRAY''@|$(REPLACE_REALLOCARRAY)|g' \
+ -e 's|@''REPLACE_REALPATH''@|$(REPLACE_REALPATH)|g' \
+ -e 's|@''REPLACE_SETENV''@|$(REPLACE_SETENV)|g' \
+ -e 's|@''REPLACE_SETSTATE''@|$(REPLACE_SETSTATE)|g' \
+ -e 's|@''REPLACE_STRTOD''@|$(REPLACE_STRTOD)|g' \
+ -e 's|@''REPLACE_STRTOL''@|$(REPLACE_STRTOL)|g' \
+ -e 's|@''REPLACE_STRTOLD''@|$(REPLACE_STRTOLD)|g' \
+ -e 's|@''REPLACE_STRTOLL''@|$(REPLACE_STRTOLL)|g' \
+ -e 's|@''REPLACE_STRTOUL''@|$(REPLACE_STRTOUL)|g' \
+ -e 's|@''REPLACE_STRTOULL''@|$(REPLACE_STRTOULL)|g' \
+ -e 's|@''REPLACE_UNSETENV''@|$(REPLACE_UNSETENV)|g' \
+ -e 's|@''REPLACE_WCTOMB''@|$(REPLACE_WCTOMB)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _Noreturn/r $(_NORETURN_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ > $@-t
+ $(AM_V_at)mv $@-t $@
+
+# We need the following in order to create <string.h> when the system
+# doesn't have one that works with the given compiler.
+lib/string.h: lib/string.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)$(MKDIR_P) 'lib'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_STRING_H''@|$(NEXT_STRING_H)|g' \
+ -e 's/@''GNULIB_EXPLICIT_BZERO''@/$(GL_GNULIB_EXPLICIT_BZERO)/g' \
+ -e 's/@''GNULIB_FFSL''@/$(GL_GNULIB_FFSL)/g' \
+ -e 's/@''GNULIB_FFSLL''@/$(GL_GNULIB_FFSLL)/g' \
+ -e 's/@''GNULIB_MBSLEN''@/$(GL_GNULIB_MBSLEN)/g' \
+ -e 's/@''GNULIB_MBSNLEN''@/$(GL_GNULIB_MBSNLEN)/g' \
+ -e 's/@''GNULIB_MBSCHR''@/$(GL_GNULIB_MBSCHR)/g' \
+ -e 's/@''GNULIB_MBSRCHR''@/$(GL_GNULIB_MBSRCHR)/g' \
+ -e 's/@''GNULIB_MBSSTR''@/$(GL_GNULIB_MBSSTR)/g' \
+ -e 's/@''GNULIB_MBSCASECMP''@/$(GL_GNULIB_MBSCASECMP)/g' \
+ -e 's/@''GNULIB_MBSNCASECMP''@/$(GL_GNULIB_MBSNCASECMP)/g' \
+ -e 's/@''GNULIB_MBSPCASECMP''@/$(GL_GNULIB_MBSPCASECMP)/g' \
+ -e 's/@''GNULIB_MBSCASESTR''@/$(GL_GNULIB_MBSCASESTR)/g' \
+ -e 's/@''GNULIB_MBSCSPN''@/$(GL_GNULIB_MBSCSPN)/g' \
+ -e 's/@''GNULIB_MBSPBRK''@/$(GL_GNULIB_MBSPBRK)/g' \
+ -e 's/@''GNULIB_MBSSPN''@/$(GL_GNULIB_MBSSPN)/g' \
+ -e 's/@''GNULIB_MBSSEP''@/$(GL_GNULIB_MBSSEP)/g' \
+ -e 's/@''GNULIB_MBSTOK_R''@/$(GL_GNULIB_MBSTOK_R)/g' \
+ -e 's/@''GNULIB_MEMCHR''@/$(GL_GNULIB_MEMCHR)/g' \
+ -e 's/@''GNULIB_MEMMEM''@/$(GL_GNULIB_MEMMEM)/g' \
+ -e 's/@''GNULIB_MEMPCPY''@/$(GL_GNULIB_MEMPCPY)/g' \
+ -e 's/@''GNULIB_MEMRCHR''@/$(GL_GNULIB_MEMRCHR)/g' \
+ -e 's/@''GNULIB_MEMSET_EXPLICIT''@/$(GL_GNULIB_MEMSET_EXPLICIT)/g' \
+ -e 's/@''GNULIB_RAWMEMCHR''@/$(GL_GNULIB_RAWMEMCHR)/g' \
+ -e 's/@''GNULIB_STPCPY''@/$(GL_GNULIB_STPCPY)/g' \
+ -e 's/@''GNULIB_STPNCPY''@/$(GL_GNULIB_STPNCPY)/g' \
+ -e 's/@''GNULIB_STRCHRNUL''@/$(GL_GNULIB_STRCHRNUL)/g' \
+ -e 's/@''GNULIB_STRDUP''@/$(GL_GNULIB_STRDUP)/g' \
+ -e 's/@''GNULIB_STRNCAT''@/$(GL_GNULIB_STRNCAT)/g' \
+ -e 's/@''GNULIB_STRNDUP''@/$(GL_GNULIB_STRNDUP)/g' \
+ -e 's/@''GNULIB_STRNLEN''@/$(GL_GNULIB_STRNLEN)/g' \
+ -e 's/@''GNULIB_STRPBRK''@/$(GL_GNULIB_STRPBRK)/g' \
+ -e 's/@''GNULIB_STRSEP''@/$(GL_GNULIB_STRSEP)/g' \
+ -e 's/@''GNULIB_STRSTR''@/$(GL_GNULIB_STRSTR)/g' \
+ -e 's/@''GNULIB_STRCASESTR''@/$(GL_GNULIB_STRCASESTR)/g' \
+ -e 's/@''GNULIB_STRTOK_R''@/$(GL_GNULIB_STRTOK_R)/g' \
+ -e 's/@''GNULIB_STRERROR''@/$(GL_GNULIB_STRERROR)/g' \
+ -e 's/@''GNULIB_STRERROR_R''@/$(GL_GNULIB_STRERROR_R)/g' \
+ -e 's/@''GNULIB_STRERRORNAME_NP''@/$(GL_GNULIB_STRERRORNAME_NP)/g' \
+ -e 's/@''GNULIB_SIGABBREV_NP''@/$(GL_GNULIB_SIGABBREV_NP)/g' \
+ -e 's/@''GNULIB_SIGDESCR_NP''@/$(GL_GNULIB_SIGDESCR_NP)/g' \
+ -e 's/@''GNULIB_STRSIGNAL''@/$(GL_GNULIB_STRSIGNAL)/g' \
+ -e 's/@''GNULIB_STRVERSCMP''@/$(GL_GNULIB_STRVERSCMP)/g' \
+ -e 's/@''GNULIB_MDA_MEMCCPY''@/$(GL_GNULIB_MDA_MEMCCPY)/g' \
+ -e 's/@''GNULIB_MDA_STRDUP''@/$(GL_GNULIB_MDA_STRDUP)/g' \
+ -e 's/@''GNULIB_FREE_POSIX''@/$(GL_GNULIB_FREE_POSIX)/g' \
+ < $(top_srcdir)/lib/string.in.h | \
+ sed -e 's|@''HAVE_EXPLICIT_BZERO''@|$(HAVE_EXPLICIT_BZERO)|g' \
+ -e 's|@''HAVE_FFSL''@|$(HAVE_FFSL)|g' \
+ -e 's|@''HAVE_FFSLL''@|$(HAVE_FFSLL)|g' \
+ -e 's|@''HAVE_MBSLEN''@|$(HAVE_MBSLEN)|g' \
+ -e 's|@''HAVE_DECL_MEMMEM''@|$(HAVE_DECL_MEMMEM)|g' \
+ -e 's|@''HAVE_MEMPCPY''@|$(HAVE_MEMPCPY)|g' \
+ -e 's|@''HAVE_DECL_MEMRCHR''@|$(HAVE_DECL_MEMRCHR)|g' \
+ -e 's|@''HAVE_MEMSET_EXPLICIT''@|$(HAVE_MEMSET_EXPLICIT)|g' \
+ -e 's|@''HAVE_RAWMEMCHR''@|$(HAVE_RAWMEMCHR)|g' \
+ -e 's|@''HAVE_STPCPY''@|$(HAVE_STPCPY)|g' \
+ -e 's|@''HAVE_STPNCPY''@|$(HAVE_STPNCPY)|g' \
+ -e 's|@''HAVE_STRCHRNUL''@|$(HAVE_STRCHRNUL)|g' \
+ -e 's|@''HAVE_DECL_STRDUP''@|$(HAVE_DECL_STRDUP)|g' \
+ -e 's|@''HAVE_DECL_STRNDUP''@|$(HAVE_DECL_STRNDUP)|g' \
+ -e 's|@''HAVE_DECL_STRNLEN''@|$(HAVE_DECL_STRNLEN)|g' \
+ -e 's|@''HAVE_STRPBRK''@|$(HAVE_STRPBRK)|g' \
+ -e 's|@''HAVE_STRSEP''@|$(HAVE_STRSEP)|g' \
+ -e 's|@''HAVE_STRCASESTR''@|$(HAVE_STRCASESTR)|g' \
+ -e 's|@''HAVE_DECL_STRTOK_R''@|$(HAVE_DECL_STRTOK_R)|g' \
+ -e 's|@''HAVE_DECL_STRERROR_R''@|$(HAVE_DECL_STRERROR_R)|g' \
+ -e 's|@''HAVE_STRERRORNAME_NP''@|$(HAVE_STRERRORNAME_NP)|g' \
+ -e 's|@''HAVE_SIGABBREV_NP''@|$(HAVE_SIGABBREV_NP)|g' \
+ -e 's|@''HAVE_SIGDESCR_NP''@|$(HAVE_SIGDESCR_NP)|g' \
+ -e 's|@''HAVE_DECL_STRSIGNAL''@|$(HAVE_DECL_STRSIGNAL)|g' \
+ -e 's|@''HAVE_STRVERSCMP''@|$(HAVE_STRVERSCMP)|g' \
+ -e 's|@''REPLACE_FFSLL''@|$(REPLACE_FFSLL)|g' \
+ -e 's|@''REPLACE_MEMCHR''@|$(REPLACE_MEMCHR)|g' \
+ -e 's|@''REPLACE_MEMMEM''@|$(REPLACE_MEMMEM)|g' \
+ -e 's|@''REPLACE_MEMPCPY''@|$(REPLACE_MEMPCPY)|g' \
+ -e 's|@''REPLACE_FREE''@|$(REPLACE_FREE)|g' \
+ -e 's|@''REPLACE_STPCPY''@|$(REPLACE_STPCPY)|g' \
+ -e 's|@''REPLACE_STPNCPY''@|$(REPLACE_STPNCPY)|g' \
+ -e 's|@''REPLACE_STRCHRNUL''@|$(REPLACE_STRCHRNUL)|g' \
+ -e 's|@''REPLACE_STRDUP''@|$(REPLACE_STRDUP)|g' \
+ -e 's|@''REPLACE_STRNCAT''@|$(REPLACE_STRNCAT)|g' \
+ -e 's|@''REPLACE_STRNDUP''@|$(REPLACE_STRNDUP)|g' \
+ -e 's|@''REPLACE_STRNLEN''@|$(REPLACE_STRNLEN)|g' \
+ -e 's|@''REPLACE_STRSTR''@|$(REPLACE_STRSTR)|g' \
+ -e 's|@''REPLACE_STRCASESTR''@|$(REPLACE_STRCASESTR)|g' \
+ -e 's|@''REPLACE_STRTOK_R''@|$(REPLACE_STRTOK_R)|g' \
+ -e 's|@''REPLACE_STRERROR''@|$(REPLACE_STRERROR)|g' \
+ -e 's|@''REPLACE_STRERROR_R''@|$(REPLACE_STRERROR_R)|g' \
+ -e 's|@''REPLACE_STRERRORNAME_NP''@|$(REPLACE_STRERRORNAME_NP)|g' \
+ -e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \
+ -e 's|@''UNDEFINE_STRTOK_R''@|$(UNDEFINE_STRTOK_R)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ > $@-t
+ $(AM_V_at)mv $@-t $@
+
+# We need the following in order to create <sys/types.h> when the system
+# doesn't have one that works with the given compiler.
+lib/sys/types.h: lib/sys_types.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)$(MKDIR_P) 'lib/sys'
+ $(AM_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_TYPES_H''@|$(NEXT_SYS_TYPES_H)|g' \
+ -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \
+ -e 's|@''WINDOWS_STAT_INODES''@|$(WINDOWS_STAT_INODES)|g' \
+ $(top_srcdir)/lib/sys_types.in.h > $@-t
+ $(AM_V_at)mv $@-t $@
+
+# We need the following in order to create an empty placeholder for
+# <unistd.h> when the system doesn't have one.
+lib/unistd.h: lib/unistd.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)$(MKDIR_P) 'lib'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''HAVE_UNISTD_H''@|$(HAVE_UNISTD_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_UNISTD_H''@|$(NEXT_UNISTD_H)|g' \
+ -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \
+ -e 's/@''GNULIB_ACCESS''@/$(GL_GNULIB_ACCESS)/g' \
+ -e 's/@''GNULIB_CHDIR''@/$(GL_GNULIB_CHDIR)/g' \
+ -e 's/@''GNULIB_CHOWN''@/$(GL_GNULIB_CHOWN)/g' \
+ -e 's/@''GNULIB_CLOSE''@/$(GL_GNULIB_CLOSE)/g' \
+ -e 's/@''GNULIB_COPY_FILE_RANGE''@/$(GL_GNULIB_COPY_FILE_RANGE)/g' \
+ -e 's/@''GNULIB_DUP''@/$(GL_GNULIB_DUP)/g' \
+ -e 's/@''GNULIB_DUP2''@/$(GL_GNULIB_DUP2)/g' \
+ -e 's/@''GNULIB_DUP3''@/$(GL_GNULIB_DUP3)/g' \
+ -e 's/@''GNULIB_ENVIRON''@/$(GL_GNULIB_ENVIRON)/g' \
+ -e 's/@''GNULIB_EUIDACCESS''@/$(GL_GNULIB_EUIDACCESS)/g' \
+ -e 's/@''GNULIB_EXECL''@/$(GL_GNULIB_EXECL)/g' \
+ -e 's/@''GNULIB_EXECLE''@/$(GL_GNULIB_EXECLE)/g' \
+ -e 's/@''GNULIB_EXECLP''@/$(GL_GNULIB_EXECLP)/g' \
+ -e 's/@''GNULIB_EXECV''@/$(GL_GNULIB_EXECV)/g' \
+ -e 's/@''GNULIB_EXECVE''@/$(GL_GNULIB_EXECVE)/g' \
+ -e 's/@''GNULIB_EXECVP''@/$(GL_GNULIB_EXECVP)/g' \
+ -e 's/@''GNULIB_EXECVPE''@/$(GL_GNULIB_EXECVPE)/g' \
+ -e 's/@''GNULIB_FACCESSAT''@/$(GL_GNULIB_FACCESSAT)/g' \
+ -e 's/@''GNULIB_FCHDIR''@/$(GL_GNULIB_FCHDIR)/g' \
+ -e 's/@''GNULIB_FCHOWNAT''@/$(GL_GNULIB_FCHOWNAT)/g' \
+ -e 's/@''GNULIB_FDATASYNC''@/$(GL_GNULIB_FDATASYNC)/g' \
+ -e 's/@''GNULIB_FSYNC''@/$(GL_GNULIB_FSYNC)/g' \
+ -e 's/@''GNULIB_FTRUNCATE''@/$(GL_GNULIB_FTRUNCATE)/g' \
+ -e 's/@''GNULIB_GETCWD''@/$(GL_GNULIB_GETCWD)/g' \
+ -e 's/@''GNULIB_GETDOMAINNAME''@/$(GL_GNULIB_GETDOMAINNAME)/g' \
+ -e 's/@''GNULIB_GETDTABLESIZE''@/$(GL_GNULIB_GETDTABLESIZE)/g' \
+ -e 's/@''GNULIB_GETENTROPY''@/$(GL_GNULIB_GETENTROPY)/g' \
+ -e 's/@''GNULIB_GETGROUPS''@/$(GL_GNULIB_GETGROUPS)/g' \
+ -e 's/@''GNULIB_GETHOSTNAME''@/$(GL_GNULIB_GETHOSTNAME)/g' \
+ -e 's/@''GNULIB_GETLOGIN''@/$(GL_GNULIB_GETLOGIN)/g' \
+ -e 's/@''GNULIB_GETLOGIN_R''@/$(GL_GNULIB_GETLOGIN_R)/g' \
+ -e 's/@''GNULIB_GETOPT_POSIX''@/$(GL_GNULIB_GETOPT_POSIX)/g' \
+ -e 's/@''GNULIB_GETPAGESIZE''@/$(GL_GNULIB_GETPAGESIZE)/g' \
+ -e 's/@''GNULIB_GETPASS''@/$(GL_GNULIB_GETPASS)/g' \
+ -e 's/@''GNULIB_GETPASS_GNU''@/$(GL_GNULIB_GETPASS_GNU)/g' \
+ -e 's/@''GNULIB_GETUSERSHELL''@/$(GL_GNULIB_GETUSERSHELL)/g' \
+ -e 's/@''GNULIB_GROUP_MEMBER''@/$(GL_GNULIB_GROUP_MEMBER)/g' \
+ -e 's/@''GNULIB_ISATTY''@/$(GL_GNULIB_ISATTY)/g' \
+ -e 's/@''GNULIB_LCHOWN''@/$(GL_GNULIB_LCHOWN)/g' \
+ -e 's/@''GNULIB_LINK''@/$(GL_GNULIB_LINK)/g' \
+ -e 's/@''GNULIB_LINKAT''@/$(GL_GNULIB_LINKAT)/g' \
+ -e 's/@''GNULIB_LSEEK''@/$(GL_GNULIB_LSEEK)/g' \
+ -e 's/@''GNULIB_PIPE''@/$(GL_GNULIB_PIPE)/g' \
+ -e 's/@''GNULIB_PIPE2''@/$(GL_GNULIB_PIPE2)/g' \
+ -e 's/@''GNULIB_PREAD''@/$(GL_GNULIB_PREAD)/g' \
+ -e 's/@''GNULIB_PWRITE''@/$(GL_GNULIB_PWRITE)/g' \
+ -e 's/@''GNULIB_READ''@/$(GL_GNULIB_READ)/g' \
+ -e 's/@''GNULIB_READLINK''@/$(GL_GNULIB_READLINK)/g' \
+ -e 's/@''GNULIB_READLINKAT''@/$(GL_GNULIB_READLINKAT)/g' \
+ -e 's/@''GNULIB_RMDIR''@/$(GL_GNULIB_RMDIR)/g' \
+ -e 's/@''GNULIB_SETHOSTNAME''@/$(GL_GNULIB_SETHOSTNAME)/g' \
+ -e 's/@''GNULIB_SLEEP''@/$(GL_GNULIB_SLEEP)/g' \
+ -e 's/@''GNULIB_SYMLINK''@/$(GL_GNULIB_SYMLINK)/g' \
+ -e 's/@''GNULIB_SYMLINKAT''@/$(GL_GNULIB_SYMLINKAT)/g' \
+ -e 's/@''GNULIB_TRUNCATE''@/$(GL_GNULIB_TRUNCATE)/g' \
+ -e 's/@''GNULIB_TTYNAME_R''@/$(GL_GNULIB_TTYNAME_R)/g' \
+ -e 's/@''GNULIB_UNISTD_H_GETOPT''@/0$(GL_GNULIB_UNISTD_H_GETOPT)/g' \
+ -e 's/@''GNULIB_UNISTD_H_NONBLOCKING''@/$(GL_GNULIB_UNISTD_H_NONBLOCKING)/g' \
+ -e 's/@''GNULIB_UNISTD_H_SIGPIPE''@/$(GL_GNULIB_UNISTD_H_SIGPIPE)/g' \
+ -e 's/@''GNULIB_UNLINK''@/$(GL_GNULIB_UNLINK)/g' \
+ -e 's/@''GNULIB_UNLINKAT''@/$(GL_GNULIB_UNLINKAT)/g' \
+ -e 's/@''GNULIB_USLEEP''@/$(GL_GNULIB_USLEEP)/g' \
+ -e 's/@''GNULIB_WRITE''@/$(GL_GNULIB_WRITE)/g' \
+ -e 's/@''GNULIB_MDA_ACCESS''@/$(GL_GNULIB_MDA_ACCESS)/g' \
+ -e 's/@''GNULIB_MDA_CHDIR''@/$(GL_GNULIB_MDA_CHDIR)/g' \
+ -e 's/@''GNULIB_MDA_CLOSE''@/$(GL_GNULIB_MDA_CLOSE)/g' \
+ -e 's/@''GNULIB_MDA_DUP''@/$(GL_GNULIB_MDA_DUP)/g' \
+ -e 's/@''GNULIB_MDA_DUP2''@/$(GL_GNULIB_MDA_DUP2)/g' \
+ -e 's/@''GNULIB_MDA_EXECL''@/$(GL_GNULIB_MDA_EXECL)/g' \
+ -e 's/@''GNULIB_MDA_EXECLE''@/$(GL_GNULIB_MDA_EXECLE)/g' \
+ -e 's/@''GNULIB_MDA_EXECLP''@/$(GL_GNULIB_MDA_EXECLP)/g' \
+ -e 's/@''GNULIB_MDA_EXECV''@/$(GL_GNULIB_MDA_EXECV)/g' \
+ -e 's/@''GNULIB_MDA_EXECVE''@/$(GL_GNULIB_MDA_EXECVE)/g' \
+ -e 's/@''GNULIB_MDA_EXECVP''@/$(GL_GNULIB_MDA_EXECVP)/g' \
+ -e 's/@''GNULIB_MDA_EXECVPE''@/$(GL_GNULIB_MDA_EXECVPE)/g' \
+ -e 's/@''GNULIB_MDA_GETCWD''@/$(GL_GNULIB_MDA_GETCWD)/g' \
+ -e 's/@''GNULIB_MDA_GETPID''@/$(GL_GNULIB_MDA_GETPID)/g' \
+ -e 's/@''GNULIB_MDA_ISATTY''@/$(GL_GNULIB_MDA_ISATTY)/g' \
+ -e 's/@''GNULIB_MDA_LSEEK''@/$(GL_GNULIB_MDA_LSEEK)/g' \
+ -e 's/@''GNULIB_MDA_READ''@/$(GL_GNULIB_MDA_READ)/g' \
+ -e 's/@''GNULIB_MDA_RMDIR''@/$(GL_GNULIB_MDA_RMDIR)/g' \
+ -e 's/@''GNULIB_MDA_SWAB''@/$(GL_GNULIB_MDA_SWAB)/g' \
+ -e 's/@''GNULIB_MDA_UNLINK''@/$(GL_GNULIB_MDA_UNLINK)/g' \
+ -e 's/@''GNULIB_MDA_WRITE''@/$(GL_GNULIB_MDA_WRITE)/g' \
+ < $(top_srcdir)/lib/unistd.in.h | \
+ sed -e 's|@''HAVE_CHOWN''@|$(HAVE_CHOWN)|g' \
+ -e 's|@''HAVE_COPY_FILE_RANGE''@|$(HAVE_COPY_FILE_RANGE)|g' \
+ -e 's|@''HAVE_DUP3''@|$(HAVE_DUP3)|g' \
+ -e 's|@''HAVE_EUIDACCESS''@|$(HAVE_EUIDACCESS)|g' \
+ -e 's|@''HAVE_EXECVPE''@|$(HAVE_EXECVPE)|g' \
+ -e 's|@''HAVE_FACCESSAT''@|$(HAVE_FACCESSAT)|g' \
+ -e 's|@''HAVE_FCHDIR''@|$(HAVE_FCHDIR)|g' \
+ -e 's|@''HAVE_FCHOWNAT''@|$(HAVE_FCHOWNAT)|g' \
+ -e 's|@''HAVE_FDATASYNC''@|$(HAVE_FDATASYNC)|g' \
+ -e 's|@''HAVE_FSYNC''@|$(HAVE_FSYNC)|g' \
+ -e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \
+ -e 's|@''HAVE_GETDTABLESIZE''@|$(HAVE_GETDTABLESIZE)|g' \
+ -e 's|@''HAVE_GETENTROPY''@|$(HAVE_GETENTROPY)|g' \
+ -e 's|@''HAVE_GETGROUPS''@|$(HAVE_GETGROUPS)|g' \
+ -e 's|@''HAVE_GETHOSTNAME''@|$(HAVE_GETHOSTNAME)|g' \
+ -e 's|@''HAVE_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \
+ -e 's|@''HAVE_GETPASS''@|$(HAVE_GETPASS)|g' \
+ -e 's|@''HAVE_GROUP_MEMBER''@|$(HAVE_GROUP_MEMBER)|g' \
+ -e 's|@''HAVE_LCHOWN''@|$(HAVE_LCHOWN)|g' \
+ -e 's|@''HAVE_LINK''@|$(HAVE_LINK)|g' \
+ -e 's|@''HAVE_LINKAT''@|$(HAVE_LINKAT)|g' \
+ -e 's|@''HAVE_PIPE''@|$(HAVE_PIPE)|g' \
+ -e 's|@''HAVE_PIPE2''@|$(HAVE_PIPE2)|g' \
+ -e 's|@''HAVE_PREAD''@|$(HAVE_PREAD)|g' \
+ -e 's|@''HAVE_PWRITE''@|$(HAVE_PWRITE)|g' \
+ -e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \
+ -e 's|@''HAVE_READLINKAT''@|$(HAVE_READLINKAT)|g' \
+ -e 's|@''HAVE_SETHOSTNAME''@|$(HAVE_SETHOSTNAME)|g' \
+ -e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \
+ -e 's|@''HAVE_SYMLINK''@|$(HAVE_SYMLINK)|g' \
+ -e 's|@''HAVE_SYMLINKAT''@|$(HAVE_SYMLINKAT)|g' \
+ -e 's|@''HAVE_UNLINKAT''@|$(HAVE_UNLINKAT)|g' \
+ -e 's|@''HAVE_USLEEP''@|$(HAVE_USLEEP)|g' \
+ -e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \
+ -e 's|@''HAVE_DECL_EXECVPE''@|$(HAVE_DECL_EXECVPE)|g' \
+ -e 's|@''HAVE_DECL_FCHDIR''@|$(HAVE_DECL_FCHDIR)|g' \
+ -e 's|@''HAVE_DECL_FDATASYNC''@|$(HAVE_DECL_FDATASYNC)|g' \
+ -e 's|@''HAVE_DECL_GETDOMAINNAME''@|$(HAVE_DECL_GETDOMAINNAME)|g' \
+ -e 's|@''HAVE_DECL_GETLOGIN''@|$(HAVE_DECL_GETLOGIN)|g' \
+ -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \
+ -e 's|@''HAVE_DECL_GETPAGESIZE''@|$(HAVE_DECL_GETPAGESIZE)|g' \
+ -e 's|@''HAVE_DECL_GETUSERSHELL''@|$(HAVE_DECL_GETUSERSHELL)|g' \
+ -e 's|@''HAVE_DECL_SETHOSTNAME''@|$(HAVE_DECL_SETHOSTNAME)|g' \
+ -e 's|@''HAVE_DECL_TRUNCATE''@|$(HAVE_DECL_TRUNCATE)|g' \
+ -e 's|@''HAVE_DECL_TTYNAME_R''@|$(HAVE_DECL_TTYNAME_R)|g' \
+ -e 's|@''HAVE_OS_H''@|$(HAVE_OS_H)|g' \
+ -e 's|@''HAVE_SYS_PARAM_H''@|$(HAVE_SYS_PARAM_H)|g' \
+ | \
+ sed -e 's|@''REPLACE_ACCESS''@|$(REPLACE_ACCESS)|g' \
+ -e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \
+ -e 's|@''REPLACE_CLOSE''@|$(REPLACE_CLOSE)|g' \
+ -e 's|@''REPLACE_COPY_FILE_RANGE''@|$(REPLACE_COPY_FILE_RANGE)|g' \
+ -e 's|@''REPLACE_DUP''@|$(REPLACE_DUP)|g' \
+ -e 's|@''REPLACE_DUP2''@|$(REPLACE_DUP2)|g' \
+ -e 's|@''REPLACE_DUP3''@|$(REPLACE_DUP3)|g' \
+ -e 's|@''REPLACE_EXECL''@|$(REPLACE_EXECL)|g' \
+ -e 's|@''REPLACE_EXECLE''@|$(REPLACE_EXECLE)|g' \
+ -e 's|@''REPLACE_EXECLP''@|$(REPLACE_EXECLP)|g' \
+ -e 's|@''REPLACE_EXECV''@|$(REPLACE_EXECV)|g' \
+ -e 's|@''REPLACE_EXECVE''@|$(REPLACE_EXECVE)|g' \
+ -e 's|@''REPLACE_EXECVP''@|$(REPLACE_EXECVP)|g' \
+ -e 's|@''REPLACE_EXECVPE''@|$(REPLACE_EXECVPE)|g' \
+ -e 's|@''REPLACE_FACCESSAT''@|$(REPLACE_FACCESSAT)|g' \
+ -e 's|@''REPLACE_FCHOWNAT''@|$(REPLACE_FCHOWNAT)|g' \
+ -e 's|@''REPLACE_FDATASYNC''@|$(REPLACE_FDATASYNC)|g' \
+ -e 's|@''REPLACE_FTRUNCATE''@|$(REPLACE_FTRUNCATE)|g' \
+ -e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \
+ -e 's|@''REPLACE_GETDOMAINNAME''@|$(REPLACE_GETDOMAINNAME)|g' \
+ -e 's|@''REPLACE_GETDTABLESIZE''@|$(REPLACE_GETDTABLESIZE)|g' \
+ -e 's|@''REPLACE_GETENTROPY''@|$(REPLACE_GETENTROPY)|g' \
+ -e 's|@''REPLACE_GETLOGIN_R''@|$(REPLACE_GETLOGIN_R)|g' \
+ -e 's|@''REPLACE_GETGROUPS''@|$(REPLACE_GETGROUPS)|g' \
+ -e 's|@''REPLACE_GETPAGESIZE''@|$(REPLACE_GETPAGESIZE)|g' \
+ -e 's|@''REPLACE_GETPASS''@|$(REPLACE_GETPASS)|g' \
+ -e 's|@''REPLACE_GETPASS_FOR_GETPASS_GNU''@|$(REPLACE_GETPASS_FOR_GETPASS_GNU)|g' \
+ -e 's|@''REPLACE_ISATTY''@|$(REPLACE_ISATTY)|g' \
+ -e 's|@''REPLACE_LCHOWN''@|$(REPLACE_LCHOWN)|g' \
+ -e 's|@''REPLACE_LINK''@|$(REPLACE_LINK)|g' \
+ -e 's|@''REPLACE_LINKAT''@|$(REPLACE_LINKAT)|g' \
+ -e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \
+ -e 's|@''REPLACE_PIPE2''@|$(REPLACE_PIPE2)|g' \
+ -e 's|@''REPLACE_PREAD''@|$(REPLACE_PREAD)|g' \
+ -e 's|@''REPLACE_PWRITE''@|$(REPLACE_PWRITE)|g' \
+ -e 's|@''REPLACE_READ''@|$(REPLACE_READ)|g' \
+ -e 's|@''REPLACE_READLINK''@|$(REPLACE_READLINK)|g' \
+ -e 's|@''REPLACE_READLINKAT''@|$(REPLACE_READLINKAT)|g' \
+ -e 's|@''REPLACE_RMDIR''@|$(REPLACE_RMDIR)|g' \
+ -e 's|@''REPLACE_SETHOSTNAME''@|$(REPLACE_SETHOSTNAME)|g' \
+ -e 's|@''REPLACE_SLEEP''@|$(REPLACE_SLEEP)|g' \
+ -e 's|@''REPLACE_SYMLINK''@|$(REPLACE_SYMLINK)|g' \
+ -e 's|@''REPLACE_SYMLINKAT''@|$(REPLACE_SYMLINKAT)|g' \
+ -e 's|@''REPLACE_TRUNCATE''@|$(REPLACE_TRUNCATE)|g' \
+ -e 's|@''REPLACE_TTYNAME_R''@|$(REPLACE_TTYNAME_R)|g' \
+ -e 's|@''REPLACE_UNLINK''@|$(REPLACE_UNLINK)|g' \
+ -e 's|@''REPLACE_UNLINKAT''@|$(REPLACE_UNLINKAT)|g' \
+ -e 's|@''REPLACE_USLEEP''@|$(REPLACE_USLEEP)|g' \
+ -e 's|@''REPLACE_WRITE''@|$(REPLACE_WRITE)|g' \
+ -e 's|@''UNISTD_H_HAVE_SYS_RANDOM_H''@|$(UNISTD_H_HAVE_SYS_RANDOM_H)|g' \
+ -e 's|@''UNISTD_H_HAVE_WINSOCK2_H''@|$(UNISTD_H_HAVE_WINSOCK2_H)|g' \
+ -e 's|@''UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ > $@-t
+ $(AM_V_at)mv $@-t $@
+
+lib/unitypes.h: lib/unitypes.in.h
+ $(AM_V_GEN)$(MKDIR_P) 'lib'
+ $(gl_V_at)$(SED_HEADER_TO_AT_t) $(top_srcdir)/lib/unitypes.in.h
+ $(AM_V_at)mv $@-t $@
+
+lib/uniwidth.h: lib/uniwidth.in.h
+ $(AM_V_GEN)$(MKDIR_P) 'lib'
+ $(gl_V_at)$(SED_HEADER_TO_AT_t) $(top_srcdir)/lib/uniwidth.in.h
+ $(AM_V_at)mv $@-t $@
+
+# We need the following in order to create <wchar.h> when the system
+# version does not work standalone.
+lib/wchar.h: lib/wchar.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)$(MKDIR_P) 'lib'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''HAVE_FEATURES_H''@|$(HAVE_FEATURES_H)|g' \
+ -e 's|@''NEXT_WCHAR_H''@|$(NEXT_WCHAR_H)|g' \
+ -e 's|@''HAVE_WCHAR_H''@|$(HAVE_WCHAR_H)|g' \
+ -e 's/@''HAVE_CRTDEFS_H''@/$(HAVE_CRTDEFS_H)/g' \
+ -e 's/@''GNULIBHEADERS_OVERRIDE_WINT_T''@/$(GNULIBHEADERS_OVERRIDE_WINT_T)/g' \
+ -e 's/@''GNULIB_BTOWC''@/$(GL_GNULIB_BTOWC)/g' \
+ -e 's/@''GNULIB_WCTOB''@/$(GL_GNULIB_WCTOB)/g' \
+ -e 's/@''GNULIB_MBSINIT''@/$(GL_GNULIB_MBSINIT)/g' \
+ -e 's/@''GNULIB_MBRTOWC''@/$(GL_GNULIB_MBRTOWC)/g' \
+ -e 's/@''GNULIB_MBRLEN''@/$(GL_GNULIB_MBRLEN)/g' \
+ -e 's/@''GNULIB_MBSRTOWCS''@/$(GL_GNULIB_MBSRTOWCS)/g' \
+ -e 's/@''GNULIB_MBSNRTOWCS''@/$(GL_GNULIB_MBSNRTOWCS)/g' \
+ -e 's/@''GNULIB_WCRTOMB''@/$(GL_GNULIB_WCRTOMB)/g' \
+ -e 's/@''GNULIB_WCSRTOMBS''@/$(GL_GNULIB_WCSRTOMBS)/g' \
+ -e 's/@''GNULIB_WCSNRTOMBS''@/$(GL_GNULIB_WCSNRTOMBS)/g' \
+ -e 's/@''GNULIB_WCWIDTH''@/$(GL_GNULIB_WCWIDTH)/g' \
+ -e 's/@''GNULIB_WMEMCHR''@/$(GL_GNULIB_WMEMCHR)/g' \
+ -e 's/@''GNULIB_WMEMCMP''@/$(GL_GNULIB_WMEMCMP)/g' \
+ -e 's/@''GNULIB_WMEMCPY''@/$(GL_GNULIB_WMEMCPY)/g' \
+ -e 's/@''GNULIB_WMEMMOVE''@/$(GL_GNULIB_WMEMMOVE)/g' \
+ -e 's/@''GNULIB_WMEMPCPY''@/$(GL_GNULIB_WMEMPCPY)/g' \
+ -e 's/@''GNULIB_WMEMSET''@/$(GL_GNULIB_WMEMSET)/g' \
+ -e 's/@''GNULIB_WCSLEN''@/$(GL_GNULIB_WCSLEN)/g' \
+ -e 's/@''GNULIB_WCSNLEN''@/$(GL_GNULIB_WCSNLEN)/g' \
+ -e 's/@''GNULIB_WCSCPY''@/$(GL_GNULIB_WCSCPY)/g' \
+ -e 's/@''GNULIB_WCPCPY''@/$(GL_GNULIB_WCPCPY)/g' \
+ -e 's/@''GNULIB_WCSNCPY''@/$(GL_GNULIB_WCSNCPY)/g' \
+ -e 's/@''GNULIB_WCPNCPY''@/$(GL_GNULIB_WCPNCPY)/g' \
+ -e 's/@''GNULIB_WCSCAT''@/$(GL_GNULIB_WCSCAT)/g' \
+ -e 's/@''GNULIB_WCSNCAT''@/$(GL_GNULIB_WCSNCAT)/g' \
+ -e 's/@''GNULIB_WCSCMP''@/$(GL_GNULIB_WCSCMP)/g' \
+ -e 's/@''GNULIB_WCSNCMP''@/$(GL_GNULIB_WCSNCMP)/g' \
+ -e 's/@''GNULIB_WCSCASECMP''@/$(GL_GNULIB_WCSCASECMP)/g' \
+ -e 's/@''GNULIB_WCSNCASECMP''@/$(GL_GNULIB_WCSNCASECMP)/g' \
+ -e 's/@''GNULIB_WCSCOLL''@/$(GL_GNULIB_WCSCOLL)/g' \
+ -e 's/@''GNULIB_WCSXFRM''@/$(GL_GNULIB_WCSXFRM)/g' \
+ -e 's/@''GNULIB_WCSDUP''@/$(GL_GNULIB_WCSDUP)/g' \
+ -e 's/@''GNULIB_WCSCHR''@/$(GL_GNULIB_WCSCHR)/g' \
+ -e 's/@''GNULIB_WCSRCHR''@/$(GL_GNULIB_WCSRCHR)/g' \
+ -e 's/@''GNULIB_WCSCSPN''@/$(GL_GNULIB_WCSCSPN)/g' \
+ -e 's/@''GNULIB_WCSSPN''@/$(GL_GNULIB_WCSSPN)/g' \
+ -e 's/@''GNULIB_WCSPBRK''@/$(GL_GNULIB_WCSPBRK)/g' \
+ -e 's/@''GNULIB_WCSSTR''@/$(GL_GNULIB_WCSSTR)/g' \
+ -e 's/@''GNULIB_WCSTOK''@/$(GL_GNULIB_WCSTOK)/g' \
+ -e 's/@''GNULIB_WCSWIDTH''@/$(GL_GNULIB_WCSWIDTH)/g' \
+ -e 's/@''GNULIB_WCSFTIME''@/$(GL_GNULIB_WCSFTIME)/g' \
+ -e 's/@''GNULIB_MDA_WCSDUP''@/$(GL_GNULIB_MDA_WCSDUP)/g' \
+ -e 's/@''GNULIB_FREE_POSIX''@/$(GL_GNULIB_FREE_POSIX)/g' \
+ < $(top_srcdir)/lib/wchar.in.h | \
+ sed -e 's|@''HAVE_WINT_T''@|$(HAVE_WINT_T)|g' \
+ -e 's|@''HAVE_BTOWC''@|$(HAVE_BTOWC)|g' \
+ -e 's|@''HAVE_MBSINIT''@|$(HAVE_MBSINIT)|g' \
+ -e 's|@''HAVE_MBRTOWC''@|$(HAVE_MBRTOWC)|g' \
+ -e 's|@''HAVE_MBRLEN''@|$(HAVE_MBRLEN)|g' \
+ -e 's|@''HAVE_MBSRTOWCS''@|$(HAVE_MBSRTOWCS)|g' \
+ -e 's|@''HAVE_MBSNRTOWCS''@|$(HAVE_MBSNRTOWCS)|g' \
+ -e 's|@''HAVE_WCRTOMB''@|$(HAVE_WCRTOMB)|g' \
+ -e 's|@''HAVE_WCSRTOMBS''@|$(HAVE_WCSRTOMBS)|g' \
+ -e 's|@''HAVE_WCSNRTOMBS''@|$(HAVE_WCSNRTOMBS)|g' \
+ -e 's|@''HAVE_WMEMCHR''@|$(HAVE_WMEMCHR)|g' \
+ -e 's|@''HAVE_WMEMCMP''@|$(HAVE_WMEMCMP)|g' \
+ -e 's|@''HAVE_WMEMCPY''@|$(HAVE_WMEMCPY)|g' \
+ -e 's|@''HAVE_WMEMMOVE''@|$(HAVE_WMEMMOVE)|g' \
+ -e 's|@''HAVE_WMEMPCPY''@|$(HAVE_WMEMPCPY)|g' \
+ -e 's|@''HAVE_WMEMSET''@|$(HAVE_WMEMSET)|g' \
+ -e 's|@''HAVE_WCSLEN''@|$(HAVE_WCSLEN)|g' \
+ -e 's|@''HAVE_WCSNLEN''@|$(HAVE_WCSNLEN)|g' \
+ -e 's|@''HAVE_WCSCPY''@|$(HAVE_WCSCPY)|g' \
+ -e 's|@''HAVE_WCPCPY''@|$(HAVE_WCPCPY)|g' \
+ -e 's|@''HAVE_WCSNCPY''@|$(HAVE_WCSNCPY)|g' \
+ -e 's|@''HAVE_WCPNCPY''@|$(HAVE_WCPNCPY)|g' \
+ -e 's|@''HAVE_WCSCAT''@|$(HAVE_WCSCAT)|g' \
+ -e 's|@''HAVE_WCSNCAT''@|$(HAVE_WCSNCAT)|g' \
+ -e 's|@''HAVE_WCSCMP''@|$(HAVE_WCSCMP)|g' \
+ -e 's|@''HAVE_WCSNCMP''@|$(HAVE_WCSNCMP)|g' \
+ -e 's|@''HAVE_WCSCASECMP''@|$(HAVE_WCSCASECMP)|g' \
+ -e 's|@''HAVE_WCSNCASECMP''@|$(HAVE_WCSNCASECMP)|g' \
+ -e 's|@''HAVE_WCSCOLL''@|$(HAVE_WCSCOLL)|g' \
+ -e 's|@''HAVE_WCSXFRM''@|$(HAVE_WCSXFRM)|g' \
+ -e 's|@''HAVE_WCSDUP''@|$(HAVE_WCSDUP)|g' \
+ -e 's|@''HAVE_WCSCHR''@|$(HAVE_WCSCHR)|g' \
+ -e 's|@''HAVE_WCSRCHR''@|$(HAVE_WCSRCHR)|g' \
+ -e 's|@''HAVE_WCSCSPN''@|$(HAVE_WCSCSPN)|g' \
+ -e 's|@''HAVE_WCSSPN''@|$(HAVE_WCSSPN)|g' \
+ -e 's|@''HAVE_WCSPBRK''@|$(HAVE_WCSPBRK)|g' \
+ -e 's|@''HAVE_WCSSTR''@|$(HAVE_WCSSTR)|g' \
+ -e 's|@''HAVE_WCSTOK''@|$(HAVE_WCSTOK)|g' \
+ -e 's|@''HAVE_WCSWIDTH''@|$(HAVE_WCSWIDTH)|g' \
+ -e 's|@''HAVE_WCSFTIME''@|$(HAVE_WCSFTIME)|g' \
+ -e 's|@''HAVE_DECL_WCTOB''@|$(HAVE_DECL_WCTOB)|g' \
+ -e 's|@''HAVE_DECL_WCSDUP''@|$(HAVE_DECL_WCSDUP)|g' \
+ -e 's|@''HAVE_DECL_WCWIDTH''@|$(HAVE_DECL_WCWIDTH)|g' \
+ | \
+ sed -e 's|@''REPLACE_MBSTATE_T''@|$(REPLACE_MBSTATE_T)|g' \
+ -e 's|@''REPLACE_BTOWC''@|$(REPLACE_BTOWC)|g' \
+ -e 's|@''REPLACE_WCTOB''@|$(REPLACE_WCTOB)|g' \
+ -e 's|@''REPLACE_FREE''@|$(REPLACE_FREE)|g' \
+ -e 's|@''REPLACE_MBSINIT''@|$(REPLACE_MBSINIT)|g' \
+ -e 's|@''REPLACE_MBRTOWC''@|$(REPLACE_MBRTOWC)|g' \
+ -e 's|@''REPLACE_MBRLEN''@|$(REPLACE_MBRLEN)|g' \
+ -e 's|@''REPLACE_MBSRTOWCS''@|$(REPLACE_MBSRTOWCS)|g' \
+ -e 's|@''REPLACE_MBSNRTOWCS''@|$(REPLACE_MBSNRTOWCS)|g' \
+ -e 's|@''REPLACE_WCRTOMB''@|$(REPLACE_WCRTOMB)|g' \
+ -e 's|@''REPLACE_WCSRTOMBS''@|$(REPLACE_WCSRTOMBS)|g' \
+ -e 's|@''REPLACE_WCSNRTOMBS''@|$(REPLACE_WCSNRTOMBS)|g' \
+ -e 's|@''REPLACE_WCWIDTH''@|$(REPLACE_WCWIDTH)|g' \
+ -e 's|@''REPLACE_WCSWIDTH''@|$(REPLACE_WCSWIDTH)|g' \
+ -e 's|@''REPLACE_WCSFTIME''@|$(REPLACE_WCSFTIME)|g' \
+ -e 's|@''REPLACE_WCSTOK''@|$(REPLACE_WCSTOK)|g' \
+ -e 's|@''REPLACE_WMEMPCPY''@|$(REPLACE_WMEMPCPY)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ > $@-t
+ $(AM_V_at)mv $@-t $@
+
+# We need the following in order to create <wctype.h> when the system
+# doesn't have one that works with the given compiler.
+lib/wctype.h: lib/wctype.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)$(MKDIR_P) 'lib'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's/@''HAVE_WCTYPE_H''@/$(HAVE_WCTYPE_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_WCTYPE_H''@|$(NEXT_WCTYPE_H)|g' \
+ -e 's/@''HAVE_CRTDEFS_H''@/$(HAVE_CRTDEFS_H)/g' \
+ -e 's/@''GNULIBHEADERS_OVERRIDE_WINT_T''@/$(GNULIBHEADERS_OVERRIDE_WINT_T)/g' \
+ -e 's/@''GNULIB_ISWBLANK''@/$(GL_GNULIB_ISWBLANK)/g' \
+ -e 's/@''GNULIB_ISWDIGIT''@/$(GL_GNULIB_ISWDIGIT)/g' \
+ -e 's/@''GNULIB_ISWXDIGIT''@/$(GL_GNULIB_ISWXDIGIT)/g' \
+ -e 's/@''GNULIB_WCTYPE''@/$(GL_GNULIB_WCTYPE)/g' \
+ -e 's/@''GNULIB_ISWCTYPE''@/$(GL_GNULIB_ISWCTYPE)/g' \
+ -e 's/@''GNULIB_WCTRANS''@/$(GL_GNULIB_WCTRANS)/g' \
+ -e 's/@''GNULIB_TOWCTRANS''@/$(GL_GNULIB_TOWCTRANS)/g' \
+ -e 's/@''HAVE_ISWBLANK''@/$(HAVE_ISWBLANK)/g' \
+ -e 's/@''HAVE_ISWCNTRL''@/$(HAVE_ISWCNTRL)/g' \
+ -e 's/@''HAVE_WCTYPE_T''@/$(HAVE_WCTYPE_T)/g' \
+ -e 's/@''HAVE_WCTRANS_T''@/$(HAVE_WCTRANS_T)/g' \
+ -e 's/@''HAVE_WINT_T''@/$(HAVE_WINT_T)/g' \
+ -e 's/@''REPLACE_ISWBLANK''@/$(REPLACE_ISWBLANK)/g' \
+ -e 's/@''REPLACE_ISWDIGIT''@/$(REPLACE_ISWDIGIT)/g' \
+ -e 's/@''REPLACE_ISWXDIGIT''@/$(REPLACE_ISWXDIGIT)/g' \
+ -e 's/@''REPLACE_ISWCNTRL''@/$(REPLACE_ISWCNTRL)/g' \
+ -e 's/@''REPLACE_TOWLOWER''@/$(REPLACE_TOWLOWER)/g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ $(top_srcdir)/lib/wctype.in.h > $@-t
+ $(AM_V_at)mv $@-t $@
+
+mostlyclean-local: mostlyclean-generic
+ @for dir in '' $(MOSTLYCLEANDIRS); do \
+ if test -n "$$dir" && test -d $$dir; then \
+ echo "rmdir $$dir"; rmdir $$dir; \
+ fi; \
+ done; \
+ :
+distclean-local: distclean-gnulib-libobjs
+distclean-gnulib-libobjs:
+ -rm -f @gl_LIBOBJDEPS@
+maintainer-clean-local: distclean-gnulib-libobjs
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+$(SH_DEPS_SED_SCRIPT): $(top_srcdir)/$(arch_shdeps_sh)
+ $(AM_V_GEN)$(SHELL) $(top_srcdir)/$(arch_shdeps_sh) \
+ "$(RT_SEP)" "$(SH_SEP)" "$(bindir)" > $@
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# This is strangely built but not installed
+all: contrib/chem/README
+
+contrib/chem/README: $(chem_srcdir)/README.txt
+ $(AM_V_GEN)$(MKDIR_P) contrib/chem/ \
+ && sed -e "s|[@]g[@]|$(g)|g" $? >$@
+
+contrib/chem/examples/README: $(chem_srcdir)/examples/README.txt
+ $(AM_V_GEN)$(MKDIR_P) contrib/chem/examples \
+ && sed -e "s|[@]g[@]|$(g)|g" $? >$@
+
+contrib/chem/examples/122/README: $(chem_srcdir)/examples/122/README.txt
+ $(AM_V_GEN)$(MKDIR_P) contrib/chem/examples/122 \
+ && sed -e "s|[@]g[@]|$(g)|g" $? >$@
+
+chem: $(chem_srcdir)/chem.pl $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)$(RM) $@ \
+ && sed -f "$(SH_DEPS_SED_SCRIPT)" \
+ -e "s|[@]g[@]|$(g)|g" \
+ -e "s|[@]BINDIR[@]|$(DESTDIR)$(bindir)|g" \
+ -e "s|[@]MACRODIR[@]|$(DESTDIR)$(tmacdir)|g" \
+ -e "s|[@]PICDIR[@]|$(DESTDIR)$(datasubdir)/pic|g" \
+ -e "s|[@]VERSION[@]|$(VERSION)|g" \
+ -e "$(SH_SCRIPT_SED_CMD)" \
+ $(chem_srcdir)/chem.pl \
+ >$@ \
+ && chmod +x $@
+
+install-data-local: install_chem_extra
+install_chem_extra:
+ -test -d $(DESTDIR)$(chemexample122dir) \
+ || $(mkinstalldirs) $(DESTDIR)$(chemexample122dir);
+ for i in $(chem_srcdir)/examples/122/*.chem; do \
+ n=`echo $$i | sed 's|$(chem_srcdir)/examples/122/||g'`; \
+ $(INSTALL_DATA) $$i $(DESTDIR)$(chemexample122dir)/$$n; \
+ done
+
+uninstall-local: uninstall_chem_extra
+uninstall_chem_extra:
+ $(RM) $(DESTDIR)$(exampledir)/chem/122/*
+ -rmdir $(DESTDIR)$(exampledir)/chem/122
+ $(RM) $(DESTDIR)$(exampledir)/chem/*
+ -rmdir $(DESTDIR)$(exampledir)/chem
+ -rmdir $(DESTDIR)$(datasubdir)/pic
+
+dist-hook: dist_chem
+dist_chem:
+ chmod u+w $(distdir)/contrib/chem/examples/122
+ for i in $(chem_srcdir)/examples/122/*.chem; do \
+ cp -f $$i $(distdir)/contrib/chem/examples/122; \
+ done
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+eqn2graph: $(top_srcdir)/contrib/eqn2graph/eqn2graph.sh
+ $(AM_V_GEN)sed -e "s|[@]g[@]|$(g)|g" \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e $(SH_SCRIPT_SED_CMD) $(eqn2graph_srcdir)/eqn2graph.sh \
+ >$@ \
+ && chmod +x $@
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+gdiffmk: $(gdiffmk_srcdir)/gdiffmk.sh
+ $(AM_V_GEN)sed -e "s|[@]BINDIR[@]|$(bindir)|g" \
+ -e "s|[@]VERSION[@]|$(VERSION)|g" \
+ -e "s|[@]HAVE_TEST_EF_OPTION[@]|$(HAVE_TEST_EF_OPTION)|g" \
+ -e "s|[@]BASH_PROG[@]|$(BASH_PROG)|g" \
+ -e "s|[@]DIFF_PROG[@]|$(DIFF_PROG)|g" \
+ -e $(SH_SCRIPT_SED_CMD) $(gdiffmk_srcdir)/gdiffmk.sh \
+ >$@ \
+ && chmod +x $@
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# create perl executable 'glilypond', being stored into 'bindir'
+glilypond: $(glilypond_srcdir)/glilypond.pl $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)$(RM) $@ \
+ && sed -f "$(SH_DEPS_SED_SCRIPT)" \
+ -e "s|[@]g[@]|$(g)|g" \
+ -e "s|[@]BINDIR[@]|$(DESTDIR)$(bindir)|g" \
+ -e "s|[@]glilypond_dir[@]|$(DESTDIR)$(glilypond_dir)|g" \
+ -e "s|[@]VERSION[@]|$(VERSION)|g" \
+ $(glilypond_srcdir)/glilypond.pl \
+ >$@ \
+ && chmod +x $@
+
+uninstall_groffdirs: uninstall-glilypond-hook
+uninstall-glilypond-hook:
+ if test -d $(DESTDIR)$(glilyponddir); then \
+ rmdir $(DESTDIR)$(glilyponddir); \
+ fi
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+gperl: $(top_srcdir)/contrib/gperl/gperl.pl $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)$(RM) $@ \
+ && sed -f "$(SH_DEPS_SED_SCRIPT)" \
+ -e "s|[@]g[@]|$(g)|g" \
+ -e "s|[@]BINDIR[@]|$(DESTDIR)$(bindir)|g" \
+ -e "s|[@]VERSION[@]|$(VERSION)|g" \
+ -e "$(SH_SCRIPT_SED_CMD)" \
+ $(top_srcdir)/contrib/gperl/gperl.pl \
+ >$@ \
+ && chmod +x $@
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+gpinyin: contrib/gpinyin/gpinyin.pl $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)sed -f "$(SH_DEPS_SED_SCRIPT)" \
+ -e "s|[@]g[@]|$(g)|g" \
+ -e "s|[@]BINDIR[@]|$(DESTDIR)$(bindir)|g" \
+ -e "s|[@]gpinyin_dir[@]|$(DESTIR)$(gpinyin_dir)|" \
+ -e "s|[@]VERSION[@]|$(VERSION)|g" \
+ -e "$(SH_SCRIPT_SED_CMD)" \
+ $(gpinyin_srcdir)/gpinyin.pl \
+ >$@ \
+ && chmod +x $@
+
+uninstall_groffdirs: uninstall-gpinyin-hook
+uninstall-gpinyin-hook:
+ if test -d $(DESTDIR)$(gpinyindir); then \
+ rmdir $(DESTDIR)$(gpinyindir); \
+ fi
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+grap2graph: $(grap2graph_srcdir)/grap2graph.sh
+ $(AM_V_GEN)sed -e "s|[@]g[@]|$(g)|g" \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e $(SH_SCRIPT_SED_CMD) $(grap2graph_srcdir)/grap2graph.sh \
+ >$@ \
+ && chmod +x $@
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+$(hdtblexample_DATA): $(HDTBLTMACFILES)
+contrib/hdtbl/examples/test-hdtbl.sh: \
+ $(top_builddir)/config.status \
+ $(HDTBLPROCESSEDEXAMPLEFILES) \
+ $(top_srcdir)/$(hdtbl_test_template)
+ $(AM_V_GEN)sed \
+ -e "s|[@]abs_top_builddir[@]|$(abs_top_builddir)|g" \
+ -e "s|[@]GHOSTSCRIPT[@]|$(GHOSTSCRIPT)|g" \
+ $(top_srcdir)/$(hdtbl_test_template) > $@ \
+ && chmod +x $@
+
+.roff.ps:
+ $(GROFF_V)$(MKDIR_P) `dirname $@` \
+ && $(HDTBLGROFF) -I $(doc_builddir) -I $(doc_srcdir) -Tps \
+ -dfontpath=$(top_srcdir)/font \
+ -dsopath=$(hdtbl_srcdir)/ \
+ -mhdtbl $< >$@
+
+.in.roff:
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && sed -e "s|[@]fontdir[@]|$(fontdir)|" \
+ -e "s|[@]EGREP[@]|$(EGREP)|" $< >$@
+
+$(HDTBLPROCESSEDEXAMPLEFILES): $(DOC_GNU_EPS) groff troff eqn pic tbl \
+ grops font/devps/stamp contrib/hdtbl/examples/common.roff
+
+uninstall_groffdirs: uninstall-hdtbl-hook
+uninstall-hdtbl-hook:
+ if test -d $(DESTDIR)$(hdtblexampledir); then \
+ rmdir $(DESTDIR)$(hdtblexampledir); \
+ fi
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+mmroff: $(mm_srcdir)/mmroff.pl
+ $(AM_V_GEN)$(SED) \
+ -e 's;[@]PERL[@];$(PERL);' \
+ -e 's;[@]VERSION[@];$(VERSION);' \
+ $(mm_srcdir)/mmroff.pl \
+ >$@.tmp \
+ && chmod +x $@.tmp \
+ && mv $@.tmp $@
+
+# special installation rules for m.tmac, mse.tmac, mmse.tmac, mm.tmac
+install-data-local: install_mm
+install_mm:
+ -test -d $(DESTDIR)$(tmacdir) || $(mkinstalldirs) $(DESTDIR)$(tmacdir)
+ -test -d $(DESTDIR)$(mmdir) || $(mkinstalldirs) $(DESTDIR)$(mmdir)
+ $(RM) $(DESTDIR)$(tmacdir)/tmac.$(tmac_m_prefix)m
+ $(RM) $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)m.tmac
+ $(INSTALL_DATA) $(mm_srcdir)/m.tmac \
+ $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)m.tmac
+ $(SED) -e "s;^.mso m.tmac;.mso $(tmac_m_prefix)m.tmac;g" \
+ $(mm_srcdir)/mse.tmac > $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)mse.tmac
+ @$(SED) -e "s;^.mso mse.tmac;.mso $(tmac_m_prefix)mse.tmac;g" \
+ $(mm_srcdir)/mmse.tmac > $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)mmse.tmac
+ @$(SED) -e "s;^.mso m.tmac;.mso $(tmac_m_prefix)m.tmac;g" \
+ $(mm_srcdir)/mm.tmac > $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)mm.tmac
+uninstall-local: uninstall_mm
+uninstall_mm:
+ if test -d $(DESTDIR)$(mmexampledir); then \
+ rmdir $(DESTDIR)$(mmexampledir); \
+ fi
+ $(RM) $(DESTDIR)$(tmacdir)/tmac.$(tmac_m_prefix)m
+ $(RM) $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)m.tmac
+ $(RM) $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)mm.tmac
+ $(RM) $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)mse.tmac
+ $(RM) $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)mmse.tmac
+ -rmdir $(DESTDIR)$(tmacdir)/mm
+
+# Special distribution rule: we copy all .tmac files from contrib/mm
+dist-hook: dist_mm
+dist_mm:
+ chmod u+w $(distdir)/contrib/mm/
+ for i in $(mm_srcdir)/*.tmac; do \
+ cp -f $$i $(distdir)/contrib/mm/; \
+ done
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+contrib/mom/examples/tests-mom.sh: \
+ $(top_builddir)/config.status \
+ $(MOMPROCESSEDEXAMPLEFILES) \
+ $(top_srcdir)/$(mom_test_template)
+ $(AM_V_GEN)sed \
+ -e "s|[@]abs_top_builddir[@]|$(abs_top_builddir)|g" \
+ -e "s|[@]groff_have_urw_fonts[@]|$(groff_have_urw_fonts)|g" \
+ $(top_srcdir)/$(mom_test_template) > $@ \
+ && chmod +x $@
+.mom.pdf:
+ $(GROFF_V)$(MKDIR_P) `dirname $@` \
+ && LC_ALL=C $(MOMPDFMOM) $< >$@
+
+$(MOMPROCESSEDEXAMPLEFILES): $(MOMNORMALFILES) \
+ groff troff gropdf pdfmom penguin.ps penguin.pdf font/devpdf/stamp
+
+penguin.ps:
+ $(AM_V_at)cp $(mom_srcdir)/examples/penguin.ps $@
+penguin.pdf:
+ $(AM_V_at)cp $(mom_srcdir)/examples/penguin.pdf $@
+
+install-data-hook: install_mom
+install_mom:
+@USE_GROPDF_TRUE@ for f in $(PDFDOCFILE); do \
+@USE_GROPDF_TRUE@ $(RM) $(DESTDIR)$(pdfdocdir)/$$f; \
+@USE_GROPDF_TRUE@ ln -s $(exampledir)/mom/$$f $(DESTDIR)$(pdfdocdir)/$$f; \
+@USE_GROPDF_TRUE@ done
+
+uninstall_groffdirs: uninstall_mom
+uninstall_mom:
+ for f in $(PDFDOCFILE); do \
+ $(RM) $(DESTDIR)$(pdfdocdir)/$$f; \
+ done
+ -rmdir $(DESTDIR)$(pdfdocdir)
+ if test -d $(DESTDIR)$(exampledir)/mom; then \
+ rmdir $(DESTDIR)$(exampledir)/mom; \
+ fi
+ if test -d $(DESTDIR)$(htmldocdir)/mom; then \
+ rmdir $(DESTDIR)$(htmldocdir)/mom; \
+ fi
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+contrib/pdfmark/pdfmark.pdf: contrib/pdfmark/pdfmark.ms
+ $(GROFF_V)$(MKDIR_P) `dirname $@` \
+ && $(PDFROFF) -I $(doc_builddir) -I $(doc_srcdir) -mspdf \
+ --stylesheet=$(pdfmark_srcdir)/cover.ms \
+ $(top_srcdir)/contrib/pdfmark/pdfmark.ms >$@
+
+# The pdf files use the local script to generate.
+$(PDFDOCFILES): pdfroff groff troff gropdf
+$(PDFDOCFILES): $(dist_devpsfont_DATA) $(nodist_devpsfont_DATA) \
+ $(DOC_GNU_EPS)
+
+pdfroff: contrib/pdfmark/pdfroff.sh $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)sed -f $(SH_DEPS_SED_SCRIPT) \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e "s|[@]GROFF_AWK_INTERPRETERS[@]|$(ALT_AWK_PROGS)|" \
+ -e "s|[@]GROFF_GHOSTSCRIPT_INTERPRETERS[@]|$(ALT_GHOSTSCRIPT_PROGS)|" \
+ -e "s|[@]GROFF_BIN_DIR[@]|$(bindir)|" $(pdfmark_srcdir)/pdfroff.sh \
+ >$@ \
+ && chmod +x $@
+
+mostlyclean-local: mostlyclean_pdfmark
+mostlyclean_pdfmark:
+ rm -rf $(top_builddir)/pdfroff-*
+
+uninstall_groffdirs: uninstall-pdfmark-hook
+uninstall-pdfmark-hook:
+@USE_PDFROFF_TRUE@ -rmdir $(DESTDIR)$(pdfmarkpdfdocdir)
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+pic2graph: $(pic2graph_srcdir)/pic2graph.sh
+ $(AM_V_GEN)sed -e "s|[@]g[@]|$(g)|g" \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e $(SH_SCRIPT_SED_CMD) $(pic2graph_srcdir)/pic2graph.sh \
+ >$@ \
+ && chmod +x $@
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# The ordering of the sed -e expressions is important.
+$(sboxes_builddir)/msboxes.ms: $(SBOXES_EXAMPLEFILES) $(sboxesnotquine)
+ $(AM_V_at)mkdir -p $(sboxes_builddir)
+ $(AM_V_at)$(SED) -n -e '1,/REPLACEME/p' \
+ $(SBOXES_EXAMPLEFILES) > $@.tmp
+ $(AM_V_at)$(SED) -f $(sboxesnotquine) \
+ $(SBOXES_EXAMPLEFILES) >> $@.tmp
+ $(AM_V_at)$(SED) -n -e '/REPLACEME/,$$p' \
+ $(SBOXES_EXAMPLEFILES) >> $@.tmp
+ $(AM_V_GEN)mv $@.tmp $@
+
+$(sboxes_builddir)/msboxes.pdf: $(sboxes_builddir)/msboxes.ms \
+ $(dist_sboxestmac_DATA) groff troff gropdf font/devpdf/stamp
+ $(GROFF_V)$(DOC_GROFF) -M$(sboxes_srcdir) -ms -msboxes -Tpdf \
+ $(sboxes_builddir)/msboxes.ms > $@
+
+uninstall_groffdirs: uninstall_sboxes
+uninstall_sboxes:
+ if test -d $(DESTDIR)$(exampledir)/sboxes; then \
+ rmdir $(DESTDIR)$(exampledir)/sboxes; \
+ fi
+@USE_GROPDF_TRUE@ -rmdir $(DESTDIR)$(sboxespdfdocdir)
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+@USE_GROHTML_TRUE@$(PROCESSEDDOCFILES_HTML): $(PROCESSEDFILES_DEPS_HTML)
+$(PROCESSEDDOCFILES_PS): $(PROCESSEDFILES_DEPS_PS)
+@USE_GROPDF_TRUE@$(PROCESSEDDOCFILES_PDF): $(PROCESSEDFILES_DEPS_PDF)
+$(PROCESSEDDOCFILES_TXT): $(PROCESSEDFILES_DEPS_TXT)
+doc/automake.pdf: doc/automake.mom pdfmom contrib/mom/om.tmac
+
+$(PROCESSEDEXAMPLEFILES_HTML): $(PROCESSEDFILES_DEPS_HTML)
+$(PROCESSEDEXAMPLEFILES_PS): $(PROCESSEDFILES_DEPS_PS)
+
+# This is a convenience target for (re-)generating all the man pages.
+man-all: $(GROFF_MAN_PAGES_ALL)
+
+# ...and for cleaning them.
+man-clean:
+ $(RM) $(GROFF_MAN_PAGES_ALL)
+
+# Many pages use tbl, a few use eqn, and soelim(1) uses pic. We also
+# need groff's FreeEuro font so we can embed it.
+#
+# We embed the fonts (-P-e) to (1) honor the current PDF standard, (2)
+# ensure consistent rendering of the document, and (3) exercise this
+# feature of gropdf.
+doc/groff-man-pages.pdf: $(GROFF_MAN_PAGES_ALL) eqn pic tbl \
+ $(TMAC_PACKAGE_MAN) $(TMAC_PACKAGE_MDOC) font/devps/freeeuro.pfa
+ $(GROFF_V)$(DOC_GROFF) -pet -mandoc -dHF=HB -rC1 \
+ -rCHECKSTYLE=3 -Tpdf -P-e \
+ $(GROFF_MAN_PAGES1) \
+ $(tmac_srcdir)/sv.tmac $(GROFF_MAN_PAGES2) \
+ $(tmac_srcdir)/en.tmac $(GROFF_MAN_PAGES3) > $@
+
+doc/groff-man-pages.utf8.txt: $(GROFF_MAN_PAGES_ALL) eqn pic tbl \
+ $(TMAC_PACKAGE_MAN) $(TMAC_PACKAGE_MDOC)
+ $(GROFF_V)$(DOC_GROFF) -pet -Tutf8 -mandoc \
+ -rCHECKSTYLE=3 $(GROFF_MAN_PAGES1) \
+ $(tmac_srcdir)/sv.tmac $(GROFF_MAN_PAGES2) \
+ $(tmac_srcdir)/en.tmac $(GROFF_MAN_PAGES3) > $@
+
+doc/grnexmpl.ps: $(doc_srcdir)/grnexmpl.me $(doc_srcdir)/grnexmpl.g \
+ grn eqn
+ $(GROFF_V)$(MKDIR_P) `dirname $@` \
+ && $(DOC_GROFF) -Tps -ge -me $(doc_srcdir)/grnexmpl.me >$@
+
+# Generating *.me from *.me.in is, surprisingly, a challenge.
+# 1. A pattern rule ("%.me: %.me.in") is not portable to NetBSD or
+# OpenBSD make.
+# 2. A single-suffix rule works in an isolated Makefile, but _only_
+# with the .SUFFIXES special target, not with the
+# (Automake-specific) SUFFIXES macro.
+# .SUFFIXES: .in
+# .in:
+# $(DOC_SED) $< >$@
+# (One can validly complain that this approach is too general.)
+# 3. GNU Automake insists that we use the SUFFIXES macro and not the
+# special target.
+# error: use variable 'SUFFIXES', not target '.SUFFIXES'
+# 4. What about a target rule? We'd have to explicitly write the first
+# dependency name in the rule commands because NetBSD make (and
+# reportedly OpenBSD) refuses to honor the $< variable in target
+# rules.
+#
+# So what is left? A double-suffix rule--but you have to use it in a
+# special way that is explicitly not countenanced by POSIX.
+#
+# "The application shall ensure that the target portion is a valid
+# target name (see Target Rules) of the form .s2 or .s1.s2 (where .s1
+# and .s2 are suffixes that have been given as prerequisites of the
+# .SUFFIXES special target and s1 and s2 do not contain any <slash> or
+# <period> characters.) If there is only one <period> in the target,
+# it is a single-suffix inference rule. Targets with two periods are
+# double-suffix inference rules. Inference rules can have only one
+# target before the <colon>."
+# (POSIX Issue 8, make(1), "Inference Rules")
+#
+# A double-suffix rule won't work in an obvious way because its
+# semantics are that the suffix is replaced, not removed. You have to
+# add both suffixes to the .SUFFIXES special target, in order with the
+# dependency first.
+# .SUFFIXES: .me.in .me
+# .me.in.me:
+# $(DOC_SED) $< >$@
+# Thanks to Automake, we must say
+# SUFFIXES += .me.in .me
+# for reason 3 above. The GNU Automake manual does not explicitly state
+# that it preserves the ordering of the suffixes, but for now it does.
+#
+# It appears to be dumb luck that this works; the rigamarole by itself
+# justifies to me the worth of GNU Make's pattern rules (which require
+# neither '.SUFFIXES' nor 'SUFFIXES') and establishing semantics for $<
+# in target rules. But I won't hold my breath waiting on other make(1)
+# implementors to agree. -- GBR
+.PRECIOUS: $(GENERATEDDOCFILES)
+.me.in.me:
+ $(GROFF_V)$(MKDIR_P) `dirname $@` \
+ && $(DOC_SED) $< >$@
+
+.me.ps:
+ $(GROFF_V)$(MKDIR_P) `dirname $@` \
+ && $(DOC_GROFF) -Tps -me $< >$@
+
+# Use '-K utf8', not '-k', in case 'configure' didn't find uchardet.
+# The French translation uses tbl; its English counterpart does not.
+doc/meintro_fr.ps: doc/meintro_fr.me preconv
+ $(GROFF_V)$(MKDIR_P) `dirname $@` \
+ && $(DOC_GROFF) -K utf8 -t -Tps -me -mfr $< >$@
+
+doc/ms.ps: $(doc_srcdir)/ms.ms eqn tbl
+ $(GROFF_V)$(MKDIR_P) `dirname $@` \
+ && $(DOC_GROFF) -et -Tps -ms $(doc_srcdir)/ms.ms >$@
+
+doc/pic.ps: $(doc_srcdir)/pic.ms eqn pic tbl
+ $(GROFF_V)$(MKDIR_P) `dirname $@` \
+ && $(DOC_GROFF) -pet -Tps -ms $(doc_srcdir)/pic.ms >$@
+
+doc/webpage.ps: $(DOC_GNU_EPS) tmac/www.tmac tbl
+doc/webpage.ps: $(doc_srcdir)/webpage.ms
+ $(GROFF_V)$(MKDIR_P) `dirname $@` \
+ && $(DOC_GROFF) -I $(doc_srcdir) -I $(doc_builddir) -t -Tps \
+ -ms -mwww $(doc_srcdir)/webpage.ms >$@
+
+# We have no "generic" ms documents.
+#.ms.ps:
+# $(GROFF_V)$(MKDIR_P) `dirname $@` \
+# && $(DOC_GROFF) -Tps -ms $< >$@
+
+doc/pic.html: eqn pic tbl
+doc/pic.html: tmac/www.tmac
+doc/pic.html: $(doc_srcdir)/pic.ms
+ $(GROFF_V)$(MKDIR_P) $(doc_builddir) \
+ && cd $(doc_builddir) \
+ && $(DOC_GROFF) -pet -P-Ipic -P-Dimg -P-jpic -Thtml -ms \
+ $(doc_srcdir)/pic.ms > pic.html
+
+doc/webpage.html: tbl
+doc/webpage.html: tmac/www.tmac
+doc/webpage.html: $(DOC_GNU_EPS)
+doc/webpage.html: $(doc_srcdir)/groff.css
+doc/webpage.html: $(doc_srcdir)/webpage.ms
+ $(GROFF_V)$(MKDIR_P) $(doc_builddir) \
+ && cd $(doc_builddir) \
+ && $(DOC_GROFF) -t -I $(doc_srcdir) -P-jwebpage -P-nrb \
+ -P-Iwebpage -P-Dimg -Thtml -ms $(doc_srcdir)/webpage.ms \
+ > webpage.html
+
+# We remove groff.css only from an out-of-source build tree.
+mostlyclean-local: mostlyclean_doc
+mostlyclean_doc:
+@USE_GROHTML_TRUE@ if test -d $(doc_builddir); then \
+@USE_GROHTML_TRUE@ cd $(doc_builddir) \
+@USE_GROHTML_TRUE@ && for f in $(HTMLDOCFILESALL); do \
+@USE_GROHTML_TRUE@ $(RM) $$f; \
+@USE_GROHTML_TRUE@ done; \
+@USE_GROHTML_TRUE@ fi
+@USE_GROHTML_TRUE@ if test -d $(doc_builddir)/img; then \
+@USE_GROHTML_TRUE@ cd $(doc_builddir)/img \
+@USE_GROHTML_TRUE@ && for f in $(HTMLDOCIMAGEFILES); do \
+@USE_GROHTML_TRUE@ $(RM) $$f; \
+@USE_GROHTML_TRUE@ done; \
+@USE_GROHTML_TRUE@ rmdir $(doc_builddir)/img || :; \
+@USE_GROHTML_TRUE@ fi
+ if test $(top_builddir) != $(top_srcdir); then \
+ $(RM) $(top_builddir)/doc/groff.css; \
+ fi
+@USE_GROHTML_TRUE@ if test -d $(doc_builddir); then \
+@USE_GROHTML_TRUE@ cd $(doc_builddir) \
+@USE_GROHTML_TRUE@ && for f in $(HTMLEXAMPLEFILESALL); do \
+@USE_GROHTML_TRUE@ $(RM) $$f; \
+@USE_GROHTML_TRUE@ done; \
+@USE_GROHTML_TRUE@ fi
+@USE_GROHTML_TRUE@ if test -d $(doc_builddir)/img; then \
+@USE_GROHTML_TRUE@ cd $(doc_builddir)/img \
+@USE_GROHTML_TRUE@ && for f in $(HTMLEXAMPLEIMAGEFILES); do \
+@USE_GROHTML_TRUE@ $(RM) $$f; \
+@USE_GROHTML_TRUE@ done; \
+@USE_GROHTML_TRUE@ rmdir $(doc_builddir)/img || :; \
+@USE_GROHTML_TRUE@ fi
+
+install-data-hook: install_doc_htmldoc
+install_doc_htmldoc:
+@USE_GROHTML_TRUE@ cd $(doc_builddir) \
+@USE_GROHTML_TRUE@ && for f in `ls $(HTMLDOCFILESALL)`; do \
+@USE_GROHTML_TRUE@ $(RM) $(DESTDIR)$(htmldocdir)/$$f; \
+@USE_GROHTML_TRUE@ $(INSTALL_DATA) $$f $(DESTDIR)$(htmldocdir)/$$f; \
+@USE_GROHTML_TRUE@ done
+@USE_GROHTML_TRUE@ -test -d $(DESTDIR)$(htmldocdir)/$(imagedir) \
+@USE_GROHTML_TRUE@ || $(mkinstalldirs) $(DESTDIR)$(htmldocdir)/$(imagedir)
+@USE_GROHTML_TRUE@ $(RM) $(DESTDIR)$(htmldocdir)/$(imagedir)/$(HTMLDOCIMAGEFILES)
+@USE_GROHTML_TRUE@ $(INSTALL_DATA) $(doc_builddir)/img/$(HTMLDOCIMAGEFILES) \
+@USE_GROHTML_TRUE@ $(DESTDIR)$(htmldocdir)/$(imagedir)
+
+install-data-hook: install_doc_gnu_eps install_doc_examples
+
+install_doc_gnu_eps: $(DOC_GNU_EPS)
+ for d in $(doc_builddir) $(doc_srcdir); do \
+ if test -f "$$d/gnu.eps"; then \
+ $(RM) $(DESTDIR)$(exampledir)/gnu.eps; \
+ $(INSTALL_DATA) \
+ $$d/gnu.eps $(DESTDIR)$(exampledir)/gnu.eps; \
+ break; \
+ fi; \
+ done
+
+install_doc_examples: $(DOC_GNU_EPS)
+@USE_GROHTML_TRUE@ cd $(doc_builddir) \
+@USE_GROHTML_TRUE@ && for f in `ls $(HTMLEXAMPLEFILESALL)`; do \
+@USE_GROHTML_TRUE@ $(RM) $(DESTDIR)$(exampledir)/$$f; \
+@USE_GROHTML_TRUE@ $(INSTALL_DATA) $$f $(DESTDIR)$(exampledir)/$$f; \
+@USE_GROHTML_TRUE@ done
+@USE_GROHTML_TRUE@ -test -d $(DESTDIR)$(exampledir)/$(imagedir) \
+@USE_GROHTML_TRUE@ || $(mkinstalldirs) $(DESTDIR)$(exampledir)/$(imagedir)
+@USE_GROHTML_TRUE@ $(RM) \
+@USE_GROHTML_TRUE@ $(DESTDIR)$(exampledir)/$(imagedir)/$(HTMLEXAMPLEIMAGEFILES)
+@USE_GROHTML_TRUE@ $(INSTALL_DATA) $(doc_builddir)/img/$(HTMLEXAMPLEIMAGEFILES) \
+@USE_GROHTML_TRUE@ $(DESTDIR)$(exampledir)/$(imagedir)
+
+uninstall-hook: \
+ uninstall_doc_examples uninstall_doc_htmldoc
+uninstall_doc_examples:
+ $(RM) $(DESTDIR)$(exampledir)/gnu.eps
+@USE_GROHTML_TRUE@ -test -d $(DESTDIR)$(docexamplesdir) \
+@USE_GROHTML_TRUE@ && cd $(DESTDIR)$(docexamplesdir) \
+@USE_GROHTML_TRUE@ && for f in $(HTMLEXAMPLEFILESALL); do \
+@USE_GROHTML_TRUE@ $(RM) $$f; \
+@USE_GROHTML_TRUE@ done
+@USE_GROHTML_TRUE@ -test -d $(DESTDIR)$(docexamplesdir)/$(imagedir) \
+@USE_GROHTML_TRUE@ && cd $(DESTDIR)$(docexamplesdir)/$(imagedir) \
+@USE_GROHTML_TRUE@ && for f in $(HTMLEXAMPLEIMAGEFILES); do \
+@USE_GROHTML_TRUE@ $(RM) $$f; \
+@USE_GROHTML_TRUE@ done
+@USE_GROHTML_TRUE@ -rmdir $(DESTDIR)$(docexamplesdir)/$(imagedir)
+@USE_GROHTML_TRUE@ -rmdir $(DESTDIR)$(docexamplesdir)
+
+uninstall_doc_htmldoc:
+@USE_GROHTML_TRUE@ -test -d $(DESTDIR)$(htmldocdir) \
+@USE_GROHTML_TRUE@ && cd $(DESTDIR)$(htmldocdir) \
+@USE_GROHTML_TRUE@ && for f in $(HTMLDOCFILESALL); do \
+@USE_GROHTML_TRUE@ $(RM) $$f; \
+@USE_GROHTML_TRUE@ done
+@USE_GROHTML_TRUE@ -test -d $(DESTDIR)$(htmldocdir)/$(imagedir) \
+@USE_GROHTML_TRUE@ && cd $(DESTDIR)$(htmldocdir)/$(imagedir) \
+@USE_GROHTML_TRUE@ && for f in $(HTMLDOCIMAGEFILES); do \
+@USE_GROHTML_TRUE@ $(RM) $$f; \
+@USE_GROHTML_TRUE@ done
+@USE_GROHTML_TRUE@ -rmdir $(DESTDIR)$(htmldocdir)/$(imagedir)
+@USE_GROHTML_TRUE@ -rmdir $(DESTDIR)$(htmldocdir)
+
+all: doc/groff.info doc/groff.txt doc/groff.html $(GROFF_DVI) \
+ $(GROFF_PDF)
+doc/groff.info: $(doc_srcdir)/groff.texi
+ $(AM_V_at)$(MKDIR_P) $(doc_builddir)
+ $(AM_V_GEN)LANG=C \
+ LC_ALL=C \
+ $(MAKEINFO) -o doc/groff.info --enable-encoding \
+ -I $(doc_srcdir) $(doc_srcdir)/groff.texi
+
+# Distribute the Info files.
+dist-hook: dist-info-bits
+dist-info-bits:
+ chmod u+w $(distdir)/doc
+ for d in $(doc_builddir) $(doc_srcdir); do \
+ if [ -f "$$d"/groff.info ]; then \
+ cp -f "$$d"/groff.info-* $(distdir)/doc; \
+ break; \
+ fi; \
+ done
+.texi.txt:
+ $(AM_V_at)$(MKDIR_P) $(doc_builddir)
+ $(AM_V_GEN)LANG=C \
+ LC_ALL=C \
+ $(MAKEINFO) --enable-encoding -I $(doc_srcdir) --plaintext \
+ -o $@ $<
+.texi.html:
+ $(AM_V_at)$(MKDIR_P) $(doc_builddir)/
+ $(AM_V_GEN)LANG=C \
+ LC_ALL=C \
+ $(MAKEINFO) --html -I $(doc_srcdir) \
+ -o doc/`basename $@`.node $<
+ $(AM_V_at)LANG=C \
+ LC_ALL=C \
+ $(MAKEINFO) --html -I $(doc_srcdir) --no-split \
+ -o $@ $<
+
+# Define pattern rules to make our Texinfo manual in DVI and PDF
+# formats. 'pdf' and 'dvi' and their installation counterparts
+# 'install-pdf' and 'install-dvi' are standard Automake targets.
+.texi.dvi:
+@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ $(AM_V_at)$(MKDIR_P) $(doc_builddir)
+@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ $(AM_V_GEN)LANG=C \
+@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ LC_ALL=C \
+@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ TEXINPUTS="$(top_srcdir)/build-aux:$(TEXINPUTS)" \
+@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ MAKEINFO='$(MAKEINFO) -I $(doc_srcdir)' \
+@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ FORCE_SOURCE_DATE=1 \
+@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ $(PROG_TEXI2DVI) -e --batch --build-dir=doc/`basename $@`.t2d \
+@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ -o $@ $<
+@HAVE_TEXI2DVI_TRUE@@USE_TEX_FALSE@ @echo "program 'tex' is missing; cannot generate $@" >&2; \
+@HAVE_TEXI2DVI_TRUE@@USE_TEX_FALSE@ exit 1
+@HAVE_TEXI2DVI_FALSE@ @echo "program 'texi2dvi' is missing or too old;" \
+@HAVE_TEXI2DVI_FALSE@ "cannot generate $@" >&2; \
+@HAVE_TEXI2DVI_FALSE@ exit 1
+
+.texi.pdf:
+@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ $(AM_V_at)$(MKDIR_P) $(doc_builddir)
+@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ $(AM_V_GEN)LANG=C \
+@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ LC_ALL=C \
+@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ TEXINPUTS="$(top_srcdir)/build-aux:$(TEXINPUTS)" \
+@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ MAKEINFO='$(MAKEINFO) -I $(doc_srcdir)' \
+@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ $(PROG_TEXI2DVI) -e --batch --pdf \
+@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ --build-dir=doc/`basename $@`.t2p -o $@ $<
+@HAVE_TEXI2DVI_TRUE@@USE_TEX_FALSE@ @echo "program 'tex' is missing; cannot generate $@" >&2; \
+@HAVE_TEXI2DVI_TRUE@@USE_TEX_FALSE@ exit 1
+@HAVE_TEXI2DVI_FALSE@ @echo "program 'texi2dvi' is missing or too old;" \
+@HAVE_TEXI2DVI_FALSE@ "cannot generate $@" >&2; \
+@HAVE_TEXI2DVI_FALSE@ exit 1
+
+install-doc: install-dvi install-html install-pdf
+
+maintainer-clean-local:
+ $(RM) $(doc_builddir)/groff.info*
+ $(RM) $(doc_builddir)/groff.pdf
+ $(RM) $(doc_builddir)/groff.dvi
+ $(RM) $(doc_builddir)/groff.txt
+ $(RM) -r $(doc_builddir)/groff.html.*
+
+install-data-local: install-txt
+install-txt:
+ -test -d $(DESTDIR)$(docdir) \
+ || $(mkinstalldirs) $(DESTDIR)$(docdir)
+ cp $(top_srcdir)/doc/groff.txt $(DESTDIR)$(docdir)
+
+install-data-local: install_infodoc
+install_infodoc: doc/groff.info
+ -test -d $(DESTDIR)$(infodir) \
+ || $(mkinstalldirs) $(DESTDIR)$(infodir)
+ $(RM) $(DESTDIR)/doc/groff.info*
+ for d in $(doc_builddir) $(doc_srcdir); do \
+ if [ -f "$$d"/groff.info ]; then \
+ cp "$$d"/groff.info* $(DESTDIR)$(infodir); \
+ $(INSTALL_INFO) --info-file="$$d"/groff.info \
+ --info-dir=$(DESTDIR)$(infodir); \
+ break; \
+ fi; \
+ done
+install-pdf-local: doc/groff.pdf
+ -test -d $(DESTDIR)$(pdfdocdir) \
+ || $(mkinstalldirs) $(DESTDIR)$(pdfdocdir)
+ cp $(top_srcdir)/doc/groff.pdf $(DESTDIR)$(pdfdocdir)
+install-html-local: doc/groff.html
+ -test -d $(DESTDIR)$(htmldocdir)/groff.html.mono \
+ || $(mkinstalldirs) $(DESTDIR)$(htmldocdir)/groff.html.mono
+ cp -r $(top_srcdir)/doc/groff.html \
+ $(DESTDIR)$(htmldocdir)/groff.html.mono
+ cp -r $(top_srcdir)/doc/groff.html.node \
+ $(DESTDIR)$(htmldocdir)
+
+uninstall-local: uninstall_infodoc uninstall-pdf uninstall-html \
+ uninstall-txt
+uninstall_doc: uninstall-local
+uninstall-doc: uninstall-local
+uninstall_infodoc:
+ -$(INSTALL_INFO) --remove --info-dir=$(DESTDIR)$(infodir) \
+ $(DESTDIR)$(infodir)/groff.info
+ -for f in `ls $(DESTDIR)$(infodir)/groff.info*`; do \
+ $(RM) $$f; \
+ done
+uninstall-pdf:
+ $(RM) $(DESTDIR)$(pdfdocdir)/groff.pdf
+ -rmdir $(DESTDIR)$(pdfdocdir)
+uninstall-html:
+ $(RM) $(DESTDIR)$(htmldocdir)/groff.html.mono/*
+ $(RM) $(DESTDIR)$(htmldocdir)/groff.html.node/*
+uninstall-txt:
+ $(RM) $(DESTDIR)$(docdir)/groff.txt
+$(DOC_GNU_EPS): doc/gnu.xpm
+ $(AM_V_GEN)if test "$(XPMTOPPM)" != found; then \
+ echo "program 'xpmtoppm' is missing; can't generate $@" >&2; \
+ exit 1; \
+ fi; \
+ if test "$(pnmtops)" != found; then \
+ echo "program 'pnmtops' is missing; can't generate $@" >&2; \
+ exit 1; \
+ fi; \
+ if ! echo "$(pnmtops_nosetpage)" | grep -q nosetpage; then \
+ echo "program 'pnmtops' can't handle -nosetpage option;" \
+ "can't generate $@" >&2; \
+ exit 1; \
+ fi; \
+ xpmtoppm $(top_srcdir)/doc/gnu.xpm | pnmdepth 15 \
+ | $(pnmtops_nosetpage) -noturn -rle >$@
+
+# Provide a copy of the image in the distribution archive to accommodate
+# systems without a tool to generate it from an X pixmap.
+dist-hook: dist-gnueps
+dist-gnueps:
+ chmod u+w $(distdir)/doc
+ for d in $(doc_builddir) $(doc_srcdir); do \
+ if [ -f "$$d"/$(DOC_GNU_EPS) ]; then \
+ cp -f "$$d"/$(DOC_GNU_EPS) $(distdir)/doc; \
+ break; \
+ fi; \
+ done
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# This target generates font descriptions from core X11 font data
+# returned by a running X server; these are _not_ normally generated
+# during a build, but provided with the groff source distribution.
+#
+# This maintainer-mode target alters files in the source tree.
+maintainer-font-descriptions: devX100_font-descriptions
+devX100_font-descriptions: $(xtotroff) $(xditview_srcdir)/DESC.in \
+ $(xditview_srcdir)/FontMap-X11
+ $(AM_V_GEN)$(MKDIR_P) $(devX100_fontsrcdir) \
+ && sed -e 's/res .*/res 100/' $(xditview_srcdir)/DESC.in \
+ >$(devX100_fontsrcdir)/DESC \
+ && $(xtotroff) -d $(devX100_fontsrcdir) -r 100 -s 10 \
+ $(xditview_srcdir)/FontMap-X11
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# This target generates font descriptions from core X11 font data
+# returned by a running X server; these are _not_ normally generated
+# during a build, but provided with the groff source distribution.
+#
+# This maintainer-mode target alters files in the source tree.
+maintainer-font-descriptions: devX100-12_font-descriptions
+devX100-12_font-descriptions: $(xtotroff) $(xditview_srcdir)/DESC.in \
+ $(xditview_srcdir)/FontMap-X11
+ $(AM_V_GEN)$(MKDIR_P) $(devX100_12_fontsrcdir) \
+ && sed -e 's/res .*/res 100/;s/unitwidth .*/unitwidth 12/' \
+ $(xditview_srcdir)/DESC.in >$(devX100_12_fontsrcdir)/DESC \
+ && $(xtotroff) -d $(devX100_12_fontsrcdir) -r 100 -s 12 \
+ $(xditview_srcdir)/FontMap-X11
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# This target generates font descriptions from core X11 font data
+# returned by a running X server; these are _not_ normally generated
+# during a build, but provided with the groff source distribution.
+#
+# This maintainer-mode target alters files in the source tree.
+maintainer-font-descriptions: devX75_font-descriptions
+devX75_font-descriptions: $(xtotroff) $(xditview_srcdir)/DESC.in \
+ $(xditview_srcdir)/FontMap-X11
+ $(AM_V_GEN)$(MKDIR_P) $(devX75_fontsrcdir) \
+ && sed -e 's/res .*/res 75/' $(xditview_srcdir)/DESC.in \
+ >$(devX75_fontsrcdir)/DESC \
+ && $(xtotroff) -d $(devX75_fontsrcdir) -r 75 -s 10 \
+ $(xditview_srcdir)/FontMap-X11
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# This target generates font descriptions from core X11 font data
+# returned by a running X server; these are _not_ normally generated
+# during a build, but provided with the groff source distribution.
+#
+# This maintainer-mode target alters files in the source tree.
+maintainer-font-descriptions: devX75-12_font-descriptions
+devX75-12_font-descriptions: $(xtotroff) $(xditview_srcdir)/DESC.in \
+ $(xditview_srcdir)/FontMap-X11
+ $(AM_V_GEN)$(MKDIR_P) $(devX75_12_fontsrcdir) \
+ && sed -e 's/res .*/res 75/;s/unitwidth .*/unitwidth 12/' \
+ $(xditview_srcdir)/DESC.in >$(devX75_12_fontsrcdir)/DESC \
+ && $(xtotroff) -d $(devX75_12_fontsrcdir) -r 75 -s 12 \
+ $(xditview_srcdir)/FontMap-X11
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+$(DEVASCIIFONTSFILES): $(devascii_srcdir)/R.proto
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && $(RM) $@ \
+ && $(SHELL) $(GENFONTSSH) $(devascii_srcdir)/R.proto \
+ $(DEVASCIIRES) $(DEVASCIICPI) `basename $@` > $@
+
+font/devascii/DESC: $(devascii_srcdir)/DESC.proto
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && $(SHELL) $(GENDESCSH) $(devascii_srcdir)/DESC.proto \
+ $(DEVASCIIRES) $(DEVASCIICPI) $(DEVASCIILPI) \
+ $(DEVASCIIFONTS) > $@
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+$(DEVCP1047FONTSFILES): $(devcp1047_srcdir)/R.proto
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && $(RM) $@ \
+ && $(SHELL) $(GENFONTSSH) $(devcp1047_srcdir)/R.proto \
+ $(DEVCP1047RES) $(DEVCP1047CPI) `basename $@` > $@
+
+font/devcp1047/DESC: $(devcp1047_srcdir)/DESC.proto
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && $(SHELL) $(GENDESCSH) $(devcp1047_srcdir)/DESC.proto \
+ $(DEVCP1047RES) $(DEVCP1047CPI) $(DEVCP1047LPI) \
+ $(DEVCP1047FONTS) > $@
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+font/devdvi/DESC: $(devdvi_srcdir)/DESC.in
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && cat $(devdvi_srcdir)/DESC.in >$@ \
+ && if test "$(PAGE)" = A4; then \
+ echo "papersize a4" >>$@; \
+ else \
+ echo "papersize letter" >>$@; \
+ fi \
+ && (test -z '$(DVIPRINT)' \
+ || echo print '$(DVIPRINT)' >>$@)
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+$(DEVHTMLFONTSFILES): $(devhtml_srcdir)/R.proto
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && $(RM) $@ \
+ && $(SHELL) $(GENFONTSSH) $(devhtml_srcdir)/R.proto \
+ $(DEVHTMLRES) $(DEVHTMLCPI) `basename $@` >$@
+
+font/devhtml/DESC: $(devhtml_srcdir)/DESC.proto
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && $(SHELL) $(GENDESCSH) $(devhtml_srcdir)/DESC.proto \
+ $(DEVHTMLRES) $(DEVHTMLCPI) $(DEVHTMLLPI) $(DEVHTMLFONTS) \
+ > $@.tmp \
+ && echo "image_generator $(GHOSTSCRIPT)" >>$@.tmp \
+ && mv $@.tmp $@
+font/devhtml/stamp: font/devhtml/DESC $(DEVHTMLFONTSFILES)
+ $(AM_V_at)>$@
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+$(DEVLATIN1FONTSFILES): $(devlatin1_srcdir)/R.proto
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && $(RM) $@ \
+ && $(SHELL) $(GENFONTSSH) $(devlatin1_srcdir)/R.proto \
+ $(DEVLATIN1RES) $(DEVLATIN1CPI) `basename $@` > $@
+
+font/devlatin1/DESC: $(devlatin1_srcdir)/DESC.proto
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && $(SHELL) $(GENDESCSH) $(devlatin1_srcdir)/DESC.proto \
+ $(DEVLATIN1RES) $(DEVLATIN1CPI) $(DEVLATIN1LPI) \
+ $(DEVLATIN1FONTS) > $@
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+font/devlbp/DESC: $(devlbp_srcdir)/DESC.in
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && cat $(devlbp_srcdir)/DESC.in >$@ \
+ && if test "$(PAGE)" = A4; then \
+ echo "papersize a4" >>$@; \
+ else \
+ echo "papersize letter" >>$@; \
+ fi \
+ && (test -z '$(LBPPRINT)' \
+ || echo print '$(LBPPRINT)' >>$@)
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+font/devlj4/DESC: $(devlj4_srcdir)/DESC.in
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && echo "res $(LJ4RES)" >$@ \
+ && echo "unitwidth `expr 7620000 / $(LJ4RES)`" >>$@ \
+ && cat $(devlj4_srcdir)/DESC.in >>$@ \
+ && if test "$(PAGE)" = A4; then \
+ echo "papersize a4" >>$@; \
+ else \
+ echo "papersize letter" >>$@; \
+ fi \
+ && (test -z '$(LJ4PRINT)' \
+ || echo print '$(LJ4PRINT)' >>$@)
+
+fonts: devlj4_fonts
+devlj4_fonts: hpftodit font/devlj4/DESC
+ $(MAKE) -f $(devlj4_srcdir)/generate/Makefile \
+ srcdir=$(devlj4_srcdir)/generate \
+ HPFTODIT=$(top_builddir)/hpftodit
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+all: font/devpdf/stamp
+
+font/devpdf/enc/text.enc:
+ $(AM_V_at)$(MKDIR_P) $(top_builddir)/font/devpdf/enc
+ $(AM_V_at)cp -f $(top_srcdir)/font/devps/text.enc \
+ $(top_builddir)/font/devpdf/enc
+
+$(devpdffontmapdata):
+ $(AM_V_at)$(MKDIR_P) $(top_builddir)/font/devpdf/map
+ $(AM_V_at)cp -f \
+ $(top_srcdir)/font/devps/generate/`basename $@` \
+ $(top_builddir)/font/devpdf/map
+font/devpdf/util/BuildFoundries: \
+ $(devpdf_srcdir)/util/BuildFoundries.pl $(SH_DEPS_SED_SCRIPT) afmtodit
+ $(AM_V_GEN)$(MKDIR_P) $(top_builddir)/font/devpdf/util \
+ && if test -n "$(PERL)"; then \
+ sed -f $(SH_DEPS_SED_SCRIPT) \
+ -e "s|/usr/bin/perl|$(PERL)|" \
+ -e "s|[@]GHOSTSCRIPT[@]|$(GHOSTSCRIPT)|" \
+ -e "s|[@]PATH_SEPARATOR[@]|$(PATH_SEPARATOR)|" \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e "s|[@]GROFF_FONT_DIR[@]|$(fontdir)|" \
+ $(devpdf_srcdir)/util/BuildFoundries.pl \
+ >$(top_builddir)/font/devpdf/util/BuildFoundries; \
+ else \
+ sed -f $(SH_DEPS_SED_SCRIPT) \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e "s|[@]GROFF_FONT_DIR[@]|$(fontdir)|" \
+ $(devpdf_srcdir)/util/BuildFoundries.pl \
+ >$(top_builddir)/font/devpdf/util/BuildFoundries; \
+ fi \
+ && chmod +x $(top_builddir)/font/devpdf/util/BuildFoundries
+font/devpdf/DESC: $(devpdf_srcdir)/DESC.in
+ $(AM_V_GEN)$(MKDIR_P) $(top_builddir)/font/devpdf \
+ && cat $(devpdf_srcdir)/DESC.in \
+ >$(top_builddir)/font/devpdf/DESC \
+ && if test "$(PAGE)" = A4; then \
+ echo "papersize a4" >>$(top_builddir)/font/devpdf/DESC; \
+ else \
+ echo "papersize letter" \
+ >>$(top_builddir)/font/devpdf/DESC; \
+ fi
+
+font/devpdf/Foundry: $(devpdf_srcdir)/Foundry.in
+ $(AM_V_at)$(MKDIR_P) $(top_builddir)/font/devpdf/
+@HAVE_URW_FONTS_TRUE@ $(AM_V_GEN)sed "s|[@]urwfontsdir[@]|$(urwfontsdir)|" \
+@HAVE_URW_FONTS_TRUE@ $(devpdf_srcdir)/Foundry.in >$@
+@HAVE_URW_FONTS_FALSE@ $(AM_V_GEN)sed "/BEGIN URW/,/END URW/d" \
+@HAVE_URW_FONTS_FALSE@ $(devpdf_srcdir)/Foundry.in >$@
+
+# This is kind of a cheat, but works because BuildFoundries produces so
+# many artifacts.
+$(DEFAULT_BASE35_FONTS) $(URW_BASE35_FONTS): font/devpdf/download
+font/devpdf/download: $(devpdffontmapdata) font/devpdf/DESC \
+ font/devpdf/Foundry font/devpdf/enc/text.enc \
+ font/devpdf/util/BuildFoundries
+ $(AM_V_GEN)$(MKDIR_P) $(top_builddir)/font/devpdf \
+ && echo "# foundry ps-font-name ps-font-file" >$@.tmp \
+ && echo "# A blank foundry is the default." >>$@.tmp \
+ && PATH="$(abs_top_builddir)$(GROFF_PATH_SEPARATOR)$(abs_top_builddir)/build-aux$(GROFF_PATH_SEPARATOR)$(PATH)" \
+ $(abs_top_builddir)/font/devpdf/util/BuildFoundries \
+ --strict $(abs_top_builddir)/font/devpdf \
+ '$(abs_top_srcdir)/font/devps:$(abs_top_builddir)/font/devps' \
+ >>$@.tmp \
+ && mv $@.tmp $@
+font/devpdf/stamp: font/devpdf/DESC font/devpdf/download \
+ $(devpdffontenc_DATA) $(devpdffontmap_DATA) $(devpdffont_DATA)
+ $(AM_V_at)>$@
+
+mostlyclean-local: mostlyclean_devpdf_extra
+mostlyclean_devpdf_extra:
+ @echo Cleaning font/devpdf
+ rm -rf $(top_builddir)/font/devpdf/enc \
+ $(top_builddir)/font/devpdf/map;
+ if test -d $(top_builddir)/font/devpdf; then \
+ for f in $(GROFF_FONT_FILES); do \
+ rm -f $(top_builddir)/font/devpdf/$$f; \
+ done; \
+ fi
+
+install-data-local: install_devpdf
+install_devpdf:
+ @echo Installing devpdf files
+ -@test -d $(DESTDIR)$(devpdffontdir) \
+ || $(mkinstalldirs) $(DESTDIR)$(devpdffontdir)
+ @for f in $(GROFF_FONT_FILES); do \
+ $(RM) $(DESTDIR)$(devpdffontdir)/$$f; \
+ if test -f $$f; then \
+ $(INSTALL_DATA) $$f $(DESTDIR)$(devpdffontdir)/$$f; \
+ else \
+ $(INSTALL_DATA) $(top_builddir)/font/devpdf/$$f \
+ $(DESTDIR)$(devpdffontdir)/$$f; \
+ fi; \
+ done
+ $(INSTALL_DATA) $(top_builddir)/font/devpdf/download \
+ $(DESTDIR)$(devpdffontdir)/
+
+uninstall_groffdirs: uninstall_devpdf
+uninstall_devpdf:
+ @echo Uninstalling devpdf files
+ if test -d $(DESTDIR)$(devpdffontdir); then \
+ for f in $(GROFF_FONT_FILES); do \
+ rm -f $(DESTDIR)$(devpdffontdir)/$$f; \
+ done; \
+ if test -d $(DESTDIR)$(devpdffontencdir); then \
+ rmdir $(DESTDIR)$(devpdffontencdir); \
+ fi; \
+ if test -d $(DESTDIR)$(devpdffontmapdir); then \
+ rmdir $(DESTDIR)$(devpdffontmapdir); \
+ fi; \
+ rm -f $(DESTDIR)$(devpdffontdir)/download; \
+ rmdir $(DESTDIR)$(devpdffontdir); \
+ fi
+
+font/devpdf/tests/check-default-foundry.sh: $(font_devpdf_default_test)
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && sed -e "s|[@]GHOSTSCRIPT[@]|$(GHOSTSCRIPT)|g" \
+ $(font_devpdf_default_test) > $@ \
+ && chmod +x $@
+
+font/devpdf/tests/check-urw-foundry.sh: $(font_devpdf_urw_test)
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && sed -e "s|[@]urwfontsdir[@]|$(urwfontsdir)|g" \
+ $(font_devpdf_urw_test) > $@ \
+ && chmod +x $@
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+font/devps/DESC: $(devps_srcdir)/DESC.in
+ $(AM_V_GEN)$(MKDIR_P) font/devps \
+ && cat $(devps_srcdir)/DESC.in >$@.tmp \
+ && echo broken $(BROKEN_SPOOLER_FLAGS) >>$@.tmp \
+ && if test "$(PAGE)" = A4; then \
+ echo "papersize a4" >>$@.tmp; \
+ else \
+ echo "papersize letter" >>$@.tmp; \
+ fi \
+ && (test -z '$(PSPRINT)' \
+ || echo print '$(PSPRINT)' >>$@.tmp)
+ $(AM_V_at)mv $@.tmp $@
+font/devps/stamp: font/devps/DESC \
+ $(DEVPSFONTFILES) $(DEVPSFONTFILES_GENERATED)
+ $(AM_V_at)>$@
+
+maintainer-font-descriptions: devps_font-descriptions
+# This target generates font descriptions from installed Type 1 AFM
+# files; these are _not_ normally generated during a build, but provided
+# with the groff source distribution.
+#
+# We add top_builddir to the PATH in case the only afmtodit available is
+# the one in the current build.
+#
+# The AFM files from which these descriptions are produced must be
+# obtained elsewhere, so this target runs only in "maintainer mode".
+devps_font-descriptions: afmtodit font/devps/DESC
+ PATH=$(top_builddir)$(GROFF_PATH_SEPARATOR)$(PATH) \
+ $(MAKE) -f $(devps_srcdir)/generate/Makefile \
+ srcdir=$(devps_srcdir)/generate DESC=$(devps_srcdir)/DESC.in
+
+font/devps/prologue: $(devps_srcdir)/prologue.ps
+ $(AM_V_GEN)$(MKDIR_P) font/devps \
+ && $(RM) $@ \
+ && sed -f $(devps_srcdir)/psstrip.sed $? >$@
+
+.ps.pfa:
+ $(AM_V_GEN)$(MKDIR_P) font/devps \
+ && $(RM) $@ \
+ && sed -f $(devps_srcdir)/psstrip.sed $? >$@
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+$(DEVUTF8FONTSFILES): $(devutf8_srcdir)/R.proto
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && $(RM) $@ \
+ && $(SHELL) $(GENFONTSSH) $(devutf8_srcdir)/R.proto \
+ $(DEVUTF8RES) $(DEVUTF8CPI) `basename $@` >$@
+
+font/devutf8/DESC: $(devutf8_srcdir)/DESC.proto
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && $(SHELL) $(GENDESCSH) $(devutf8_srcdir)/DESC.proto \
+ $(DEVUTF8RES) $(DEVUTF8CPI) $(DEVUTF8LPI) $(DEVUTF8FONTS) >$@
+font/devutf8/stamp: font/devutf8/DESC $(DEVUTF8FONTSFILES)
+ $(AM_V_at)>$@
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+man:
+ $(MKDIR_P) $(top_builddir)/man
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+defs.h: config.status
+ @$(SHELL) $(top_srcdir)/gendef.sh defs.h \
+ "PROG_PREFIX=\"$(g)\"" \
+ "DEVICE=\"$(DEVICE)\"" \
+ "INSTALLPATH=\"$(prefix)\"" \
+ "BINPATH=\"$(bindir)\"" \
+ "FONTPATH=\"$(fontpath)\"" \
+ "MACROPATH=\"$(tmacpath)\"" \
+ "INDEX_SUFFIX=\"$(indexext)\"" \
+ "COMMON_WORDS_FILE=\"$(common_words_file)\"" \
+ "DEFAULT_INDEX_DIR=\"$(indexdir)\"" \
+ "DEFAULT_INDEX_NAME=\"$(indexname)\"" \
+ "DEFAULT_INDEX=\"$(indexdir)/$(indexname)\""
+
+dist-hook: dist_include
+dist_include:
+ chmod u+w $(distdir)/src/include
+ cp -f $(top_srcdir)/src/include/*.h $(distdir)/src/include
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+src/libs/libbib/index.$(OBJEXT): defs.h
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# .o files have a 'libgroff_a-' prefix because we set
+# libgroff_a_CPPFLAGS.
+src/libs/libgroff/libgroff_a-device.$(OBJEXT): defs.h
+src/libs/libgroff/libgroff_a-fontfile.$(OBJEXT): defs.h
+src/libs/libgroff/libgroff_a-macropath.$(OBJEXT): defs.h
+src/libs/libgroff/libgroff_a-relocate.$(OBJEXT): defs.h
+
+src/libs/libgroff/version.cpp: $(top_srcdir)/.version
+ $(AM_V_at)printf 'const char *version_string = "%s.%s";\n' \
+ $(MAJOR_VERSION) $(MINOR_VERSION) > $@.tmp
+ $(AM_V_at)printf 'const char *revision_string = "%s";\n' \
+ $(REVISION) >> $@.tmp
+ $(AM_V_at)printf \
+ 'extern "C" {\nconst char *Version_string = "%s";\n}\n' \
+ $(VERSION) >> $@.tmp
+ $(AM_V_GEN)mv $@.tmp $@
+
+all: charset.alias ref-add.sed ref-del.sed
+
+charset.alias: $(libgroff_srcdir)/config.charset
+ $(AM_V_GEN)$(SHELL) $(libgroff_srcdir)/config.charset \
+ '$(HOST)' > t-$@ \
+ && mv t-$@ $@
+
+ref-add.sed: $(libgroff_srcdir)/ref-add.sin
+ $(AM_V_GEN)sed -e '/^#/d' \
+ -e 's/@''PACKAGE''@/$(LIBGROFF_PACKAGE)/g' \
+ $(libgroff_srcdir)/ref-add.sin > t-$@ \
+ && mv t-$@ $@
+
+ref-del.sed: $(libgroff_srcdir)/ref-del.sin
+ $(AM_V_GEN)sed -e '/^#/d' \
+ -e 's/@''PACKAGE''@/$(LIBGROFF_PACKAGE)/g' \
+ $(libgroff_srcdir)/ref-del.sin > t-$@ \
+ && mv t-$@ $@
+
+install-data-local: install_charset_data
+install_charset_data:
+ -test $(GLIBC21) != no || $(mkinstalldirs) $(DESTDIR)$(libdir)
+ if test -f $(DESTDIR)$(libdir)/charset.alias; then \
+ sed -f ref-add.sed $(DESTDIR)$(libdir)/charset.alias \
+ > $(DESTDIR)$(libdir)/t-charset.alias; \
+ $(INSTALL_DATA) $(DESTDIR)$(libdir)/t-charset.alias \
+ $(DESTDIR)$(libdir)/charset.alias; \
+ rm -f $(DESTDIR)$(libdir)/t-charset.alias; \
+ else \
+ if test $(GLIBC21) = no; then \
+ sed -f ref-add.sed charset.alias \
+ > $(DESTDIR)$(libdir)/t-charset.alias; \
+ $(INSTALL_DATA) $(DESTDIR)$(libdir)/t-charset.alias \
+ $(DESTDIR)$(libdir)/charset.alias; \
+ rm -f $(DESTDIR)$(libdir)/t-charset.alias; \
+ fi; \
+ fi
+
+uninstall-local: uninstall_charset_data
+uninstall_charset_data:
+ -if test -f $(DESTDIR)$(libdir)/charset.alias; then \
+ sed -f ref-del.sed $(DESTDIR)$(libdir)/charset.alias \
+ > $(DESTDIR)$(libdir)/t-charset.alias; \
+ if grep '^# Packages using this file: $$' \
+ $(DESTDIR)$(libdir)/t-charset.alias > /dev/null; then \
+ rm -f $(DESTDIR)$(libdir)/charset.alias; \
+ else \
+ $(INSTALL_DATA) $(DESTDIR)$(libdir)/t-charset.alias \
+ $(DESTDIR)$(libdir)/charset.alias; \
+ fi; \
+ rm -f $(DESTDIR)$(libdir)/t-charset.alias; \
+ fi
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+gropdf: $(gropdf_dir)/gropdf.pl $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)$(RM) $@ \
+ && sed -f $(SH_DEPS_SED_SCRIPT) \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e "s|[@]PERL[@]|$(PERL)|" \
+ -e "s|[@]GROFF_FONT_DIR[@]|$(fontpath)|" \
+ -e "s|[@]RT_SEP[@]|$(RT_SEP)|" $(gropdf_dir)/gropdf.pl \
+ >$@ \
+ && chmod +x $@
+
+pdfmom: $(gropdf_dir)/pdfmom.pl $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)$(RM) $@ \
+ && sed -f $(SH_DEPS_SED_SCRIPT) \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e "s|[@]RT_SEP[@]|$(RT_SEP)|" \
+ -e "s|[@]PERL[@]|$(PERL)|" $(gropdf_dir)/pdfmom.pl \
+ >$@ \
+ && chmod +x $@
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+$(GXDITVIEW_GROFF_VERSION_H): $(top_srcdir)/.version
+ $(AM_V_at)$(MKDIR_P) `dirname $@`
+ $(AM_V_GEN)printf \
+ 'const char *Version_string = "%s";\n' '@VERSION@' > $@
+
+# Because we defined gxditview_CPPFLAGS, automake renames all of
+# xditview's objects, adding an "gxditview-" prefix.
+@WITHOUT_X11_FALSE@src/devices/xditview/gxditview-device.$(OBJEXT): defs.h
+@WITHOUT_X11_FALSE@src/devices/xditview/gxditview-xditview.$(OBJEXT): $(XDITVIEW_GENHDRS)
+
+@WITHOUT_X11_FALSE@src/devices/xditview/GXditview-ad.h: $(xditview_srcdir)/GXditview.ad
+@WITHOUT_X11_FALSE@ $(AM_V_GEN)$(SHELL) $(xditview_srcdir)/ad2c \
+@WITHOUT_X11_FALSE@ $(xditview_srcdir)/GXditview.ad > $@
+
+# Custom installation of GXditview.ad and GXditview-color.ad
+install-data-local: install_xditview
+uninstall-local: uninstall_xditview
+
+@WITHOUT_X11_TRUE@install_xditview:
+@WITHOUT_X11_TRUE@uninstall_xditview:
+@WITHOUT_X11_FALSE@install_xditview: \
+@WITHOUT_X11_FALSE@ $(xditview_srcdir)/FontMap-X11 \
+@WITHOUT_X11_FALSE@ $(xditview_srcdir)/GXditview.ad \
+@WITHOUT_X11_FALSE@ $(xditview_srcdir)/GXditview-color.ad
+@WITHOUT_X11_FALSE@ $(MKDIR_P) $(DESTDIR)$(fontdir)
+@WITHOUT_X11_FALSE@ $(INSTALL_DATA) $(xditview_srcdir)/FontMap-X11 \
+@WITHOUT_X11_FALSE@ $(DESTDIR)$(fontdir)/FontMap-X11
+@WITHOUT_X11_FALSE@ -test -d $(DESTDIR)$(appdefdir) \
+@WITHOUT_X11_FALSE@ || $(mkinstalldirs) $(DESTDIR)$(appdefdir)
+@WITHOUT_X11_FALSE@ $(INSTALL_DATA) $(xditview_srcdir)/GXditview.ad \
+@WITHOUT_X11_FALSE@ $(DESTDIR)$(appdefdir)/GXditview
+@WITHOUT_X11_FALSE@ $(INSTALL_DATA) $(xditview_srcdir)/GXditview-color.ad \
+@WITHOUT_X11_FALSE@ $(DESTDIR)$(appdefdir)/GXditview-color
+
+@WITHOUT_X11_FALSE@uninstall_xditview:
+@WITHOUT_X11_FALSE@ rm -f $(DESTDIR)$(appdefdir)/GXditview
+@WITHOUT_X11_FALSE@ rm -f $(DESTDIR)$(appdefdir)/GXditview-color
+@WITHOUT_X11_FALSE@ rm -f $(DESTDIR)$(fontdir)/FontMap-X11
+@WITHOUT_X11_FALSE@ -rmdir $(DESTDIR)$(fontdir) 2>/dev/null
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Since eqn_CPPFLAGS was set, all .o files have an 'eqn-' prefix.
+src/preproc/eqn/eqn-lex.$(OBJEXT): src/preproc/eqn/eqn.hpp
+
+neqn: $(top_srcdir)/src/preproc/eqn/neqn.sh $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)sed -e 's/[@]g[@]/$(g)/g' \
+ -f $(SH_DEPS_SED_SCRIPT) \
+ -e $(SH_SCRIPT_SED_CMD) \
+ $(top_srcdir)/src/preproc/eqn/neqn.sh \
+ >$@.tmp \
+ && chmod +x $@.tmp \
+ && mv $@.tmp $@
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+src/preproc/grn/main.$(OBJEXT): defs.h
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+src/preproc/html/pre-html.$(OBJEXT): defs.h
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Since pic_CPPFLAGS was set, all .o files have a 'pic-' prefix.
+src/preproc/pic/pic-lex.$(OBJEXT): src/preproc/pic/pic.hpp
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Since refer_CPPFLAGS was set, all .o files have a 'refer-' prefix.
+src/preproc/refer/refer-command.$(OBJEXT): defs.h
+src/preproc/refer/refer-ref.$(OBJEXT): defs.h
+src/preproc/refer/refer-refer.$(OBJEXT): defs.h
+src/preproc/refer/refer-token.$(OBJEXT): defs.h
+src/preproc/refer/refer-label.$(OBJEXT): defs.h
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+src/roff/groff/groff.$(OBJEXT): defs.h
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+nroff: $(nroff_srcdir)/nroff.sh $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)rm -f $@ \
+ && sed -f $(SH_DEPS_SED_SCRIPT) \
+ -e $(SH_SCRIPT_SED_CMD) \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ $(nroff_srcdir)/nroff.sh \
+ >$@ \
+ && chmod +x $@
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+src/roff/troff/input.$(OBJEXT): defs.h
+
+src/roff/troff/majorminor.cpp: $(top_srcdir)/.version
+ $(AM_V_at)printf 'const char *major_version = "%s";\n' \
+ $(MAJOR_VERSION) > $@.tmp
+ $(AM_V_at)printf 'const char *minor_version = "%s";\n' \
+ $(MINOR_VERSION) >> $@.tmp
+ $(AM_V_at)printf 'const char *revision = "%s";\n' \
+ $(REVISION) >> $@.tmp
+ $(AM_V_GEN)mv $@.tmp $@
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+afmtodit: $(afmtodit_srcdir)/afmtodit.pl $(afmtodit_srcdir)/afmtodit.tables
+ $(AM_V_GEN)if test -n "$(PERL)"; then \
+ sed -e "s|[@]PERL[@]|$(PERL)|" \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e "s|[@]FONTDIR[@]|$(fontdir)|" \
+ -e "/[@]afmtodit.tables[@]/ r $(afmtodit_srcdir)/afmtodit.tables" \
+ -e "/[@]afmtodit.tables[@]/ d" \
+ $(afmtodit_srcdir)/afmtodit.pl \
+ >afmtodit; \
+ else \
+ sed -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e "s|[@]FONTDIR[@]|$(fontdir)|" \
+ -e "/[@]afmtodit.tables[@]/ r $(afmtodit_srcdir)/afmtodit.tables" \
+ -e "/[@]afmtodit.tables[@]/ d" \
+ $(afmtodit_srcdir)/afmtodit.pl \
+ >afmtodit; \
+ fi \
+ && chmod +x afmtodit
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+grog: $(grog_srcdir)/grog.pl $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)$(RM) $@ \
+ && sed -f "$(SH_DEPS_SED_SCRIPT)" \
+ -e "s|[@]PERL[@]|$(PERL)|" \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e "$(SH_SCRIPT_SED_CMD)" \
+ $(grog_srcdir)/grog.pl \
+ >$@ \
+ && chmod +x $@
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+src/utils/indxbib/indxbib.$(OBJEXT): defs.h
+
+install-data-local: install_indxbib
+install_indxbib: $(indxbib_srcdir)/eign
+ -test -d $(DESTDIR)$(datadir) \
+ || $(mkinstalldirs) $(DESTDIR)$(datadir)
+ -test -d $(DESTDIR)$(dataprogramdir) \
+ || $(mkinstalldirs) $(DESTDIR)$(dataprogramdir)
+ -test -d $(DESTDIR)$(datasubdir) \
+ || $(mkinstalldirs) $(DESTDIR)$(datasubdir)
+ if test -f /usr/lib/eign; then \
+ rm -f $(DESTDIR)$(common_words_file); \
+ ln -s /usr/lib/eign $(DESTDIR)$(common_words_file) 2>/dev/null \
+ || ln /usr/lib/eign $(DESTDIR)$(common_words_file) 2>/dev/null \
+ || cp /usr/lib/eign $(DESTDIR)$(common_words_file); \
+ else \
+ rm -f $(DESTDIR)$(common_words_file); \
+ $(INSTALL_DATA) $(indxbib_srcdir)/eign $(DESTDIR)$(common_words_file); \
+ fi
+
+uninstall-local: uninstall_indxbib
+uninstall_indxbib:
+ rm -f $(DESTDIR)$(common_words_file)
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+src/utils/lkbib/lkbib.$(OBJEXT): defs.h
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+tmac/www.tmac: tmac/www.tmac.in
+ $(AM_V_at)$(MKDIR_P) $(top_builddir)/tmac
+ $(AM_V_GEN)sed -e \
+ "s;[@]PNMTOPS_NOSETPAGE[@];$(pnmtops_nosetpage);g" \
+ $(tmac_srcdir)/www.tmac.in > $(top_builddir)/tmac/www.tmac
+
+$(M4CHECK): tmac/groff_man.7.man.in
+ $(AM_V_at)! $(EGREP) \
+ '(^|[[:space:]])($(M4WORDS))($$|[[:space:]])' \
+ $(tmac_srcdir)/groff_man.7.man.in > $@
+
+tmac/groff_man.7.man: tmac/groff_man.7.man.in $(M4CHECK)
+ $(AM_V_GEN)$(M4) -D_groff_man_not_style \
+ $(tmac_srcdir)/groff_man.7.man.in > $@
+
+tmac/groff_man_style.7.man: tmac/groff_man.7.man.in $(M4CHECK)
+ $(AM_V_GEN)$(M4) -D_groff_man_style \
+ $(tmac_srcdir)/groff_man.7.man.in > $@
+
+# The installation of groff compatibility wrappers for vendor-provided
+# non-GNU macro sets is controlled by 'compatibility_wrappers' (see the
+# commentary surrounding m4/groff.m4's
+# GROFF_WITH_COMPATIBILITY_WRAPPERS). Collision detection variables of
+# the form 'tmac_<macro>_prefix' are defined in Makefile.am, to assist
+# in the installation of groff-provided macro sets.
+#
+# When 'compatibility_wrappers' is 'no', one step is performed:
+# - the groff-provided macro set implementations are installed in
+# <prefix>/share/groff/<version>/tmac/ with the original macro set
+# name
+#
+# When 'compatibility_wrappers' is 'yes', two steps are performed:
+# - the groff-provided macro set implementations are installed in
+# <prefix>/share/groff/<version>/tmac/ with a prefix of
+# $(tmac_prefix) (which is usually 'g', via the appropriate
+# collision detection variable)
+# - the generated compatibility wrappers are installed in
+# <prefix>/lib/groff/site-tmac, with the original macro set name
+#
+# When 'compatibility_wrappers' is 'manual', two steps are performed:
+# - the groff-provided macro set implementations are installed in
+# <prefix>/share/groff/<version>/tmac/ with the original macro set
+# name
+# - the generated compatibility wrappers are installed in
+# <prefix>/lib/groff/site-tmac, with a name of
+# <macro><wrapper_suffix>, (which is usually '-os', see
+# 'wrapper_suffix_default' in Makefile.am)
+
+all: tmac/stamp-wrap
+
+# Generate compatibility wrappers for non-GNU OS-provided macro packages
+# for which groff provides an alternative implementation.
+tmac/stamp-wrap:
+ $(AM_V_at)$(MKDIR_P) $(top_builddir)/tmac;
+ $(AM_V_at)if test -n "$(tmac_wrap)"; then \
+ for m in ""$(tmac_wrap); do \
+ $(RM) $(top_builddir)/tmac/$$m-wrap; \
+ if test "$$m" = an; then \
+ echo .do mso an.tmac >>$(top_builddir)/tmac/$$m-wrap; \
+ fi; \
+ echo .cp 1 >>$(top_builddir)/tmac/$$m-wrap; \
+ echo .so $(sys_tmac_prefix)$$m \
+ >>$(top_builddir)/tmac/$$m-wrap; \
+ done; \
+ fi
+ $(AM_V_at)touch $@
+
+# Install groff compatibility wrappers into
+# <prefix>/lib/groff/site-tmac.
+install-data-local: install_tmac_wrap
+install_tmac_wrap:
+ $(MKDIR_P) $(DESTDIR)$(systemtmacdir);
+ if test "$(compatibility_wrappers)" != "no"; then \
+ if test -n "$(tmac_wrap)"; then \
+ for m in ""$(tmac_wrap); do \
+ $(INSTALL_DATA) $(tmac_builddir)/$$m-wrap \
+ $(DESTDIR)$(systemtmacdir)/$$m$(wrapper_suffix).tmac; \
+ done; \
+ fi; \
+ fi
+
+# Rename the groff implementations of colliding macro sets to have a
+# prefix.
+install-data-hook: install_tmac_wrap_hook
+install_tmac_wrap_hook:
+ if test "$(compatibility_wrappers)" = "yes"; then \
+ if test -n "$(tmac_wrap)"; then \
+ if test -f $(DESTDIR)$(tmacdir)/s.tmac -a -n "$(tmac_s_prefix)"; \
+ then \
+ mv $(DESTDIR)$(tmacdir)/s.tmac \
+ $(DESTDIR)$(tmacdir)/$(tmac_s_prefix)s.tmac; \
+ fi; \
+ if test -f $(DESTDIR)$(tmacdir)/an.tmac -a -n "$(tmac_an_prefix)"; \
+ then \
+ mv $(DESTDIR)$(tmacdir)/an.tmac \
+ $(DESTDIR)$(tmacdir)/$(tmac_an_prefix)an.tmac; \
+ fi; \
+ fi; \
+ fi
+
+# Uninstall groff compatibility wrappers & renamed groff implementation
+# macro sets.
+uninstall_groffdirs: uninstall_tmac_hook
+uninstall_tmac_hook:
+ if test -n "$(tmac_wrap)"; then \
+ if test "$(compatibility_wrappers)" != "no"; then \
+ for m in ""$(tmac_wrap); do \
+ $(RM) $(DESTDIR)$(systemtmacdir)/$$m$(wrapper_suffix).tmac; \
+ done; \
+ fi; \
+ $(RM) -f $(DESTDIR)$(tmacdir)/$(tmac_an_prefix)an.tmac; \
+ $(RM) -f $(DESTDIR)$(tmacdir)/$(tmac_s_prefix)s.tmac; \
+ fi
+ if test -d $(DESTDIR)$(mdocdir); then \
+ rmdir $(DESTDIR)$(mdocdir); \
+ fi
+ if test -d $(DESTDIR)$(tmacdir); then \
+ rmdir $(DESTDIR)$(tmacdir); \
+ fi
+ if test -d $(DESTDIR)$(localtmacdir); then \
+ rmdir $(DESTDIR)$(localtmacdir); \
+ fi
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+.DELETE_ON_ERROR:
+.PRECIOUS: $(TEST_SUITE_LOG)
+
+# if there is a name prefix we install the man pages by hand
+all: generate_man_files
+install-data-hook: install-prefix-man
+uninstall-hook: uninstall-prefix-man
+@USEPROGRAMPREFIX_TRUE@generate_man_files: $(PREFIXMAN1)
+@USEPROGRAMPREFIX_TRUE@install-prefix-man:
+@USEPROGRAMPREFIX_TRUE@ for f in $(PREFIXMAN1); do \
+@USEPROGRAMPREFIX_TRUE@ cp -f $$f $(DESTDIR)$(man1dir)/$(NAMEPREFIX)`basename $$f`; \
+@USEPROGRAMPREFIX_TRUE@ done
+@USEPROGRAMPREFIX_TRUE@uninstall-prefix-man:
+@USEPROGRAMPREFIX_TRUE@ for f in $(PREFIXMAN1); do \
+@USEPROGRAMPREFIX_TRUE@ rm -f $(DESTDIR)$(man1dir)/$(NAMEPREFIX)`basename $$f`; \
+@USEPROGRAMPREFIX_TRUE@ done
+@USEPROGRAMPREFIX_FALSE@install-prefix-man:
+@USEPROGRAMPREFIX_FALSE@uninstall-prefix-man:
+@USEPROGRAMPREFIX_FALSE@generate_man_files:
+
+# Hook to create the 'current' symlink
+install-data-hook: create_current_symlink
+create_current_symlink:
+ cd $(DESTDIR)$(dataprogramdir); \
+ rm -f current; \
+ $(LN_S) $(SHORT_VERSION) current
+
+# Hook to move the binaries that potentially have a prefix from
+# prefixexecbindir to bindir.
+install-exec-hook: move_binaries_with_prefix
+move_binaries_with_prefix:
+@USEPROGRAMPREFIX_TRUE@ if test -n "$(NAMEPREFIX)"; then \
+@USEPROGRAMPREFIX_TRUE@ for f in $(prefixexecbin_PROGRAMS) $(prefixexecbin_SCRIPTS); do \
+@USEPROGRAMPREFIX_TRUE@ mv -f $(DESTDIR)$(prefixexecbindir)/$$f$(EXEEXT) \
+@USEPROGRAMPREFIX_TRUE@ $(DESTDIR)$(bindir)/$(NAMEPREFIX)$$f$(EXEEXT); \
+@USEPROGRAMPREFIX_TRUE@ done \
+@USEPROGRAMPREFIX_TRUE@ fi
+
+# Always create the site-font directory as a guide to the user.
+install-data-hook: install_site_font
+install_site_font:
+ -test -d $(DESTDIR)$(localfontdir) \
+ || $(mkinstalldirs) $(DESTDIR)$(localfontdir)
+
+# Create systemtmacdir if not present
+install-data-hook: install_tmacdir
+install_tmacdir:
+ -test -d $(DESTDIR)$(systemtmacdir) \
+ || $(mkinstalldirs) $(DESTDIR)$(systemtmacdir)
+
+# directories specific to groff
+uninstall-hook: uninstall_groffdirs
+uninstall_groffdirs:
+ if test -d $(DESTDIR)$(datasubdir); then \
+ rm -rf $(DESTDIR)$(fontdir); \
+ rm -rf $(DESTDIR)$(oldfontdir); \
+ rmdir $(DESTDIR)$(datasubdir); \
+ fi
+ if test -d $(DESTDIR)$(dataprogramdir); then \
+ if test -h $(DESTDIR)$(dataprogramdir)/current; then \
+ rm -f $(DESTDIR)$(dataprogramdir)/current; \
+ fi; \
+ if test -d $(DESTDIR)$(localfontdir); then \
+ rm -f $(DESTDIR)$(localfontdir)/*; \
+ rmdir $(DESTDIR)$(localfontdir); \
+ fi; \
+ rmdir $(DESTDIR)$(dataprogramdir); \
+ fi
+ if test -d $(DESTDIR)$(libprogramdir); then \
+ if test -d $(DESTDIR)$(systemtmacdir); then \
+ rm -f $(DESTDIR)$(systemtmacdir)/*; \
+ rmdir $(DESTDIR)$(systemtmacdir); \
+ fi; \
+ rmdir $(DESTDIR)$(libprogramdir); \
+ fi
+ if test -d $(DESTDIR)$(docdir); then \
+ if test -d $(DESTDIR)$(exampledir); then \
+ rmdir $(DESTDIR)$(exampledir); \
+ fi; \
+ if test -d $(DESTDIR)$(htmldocdir); then \
+ if test -d $(DESTDIR)$(htmldocdir)/groff.html.mono; then \
+ rmdir $(DESTDIR)$(htmldocdir)/groff.html.mono; \
+ fi; \
+ if test -d $(DESTDIR)$(htmldocdir)/groff.html.node; then \
+ rmdir $(DESTDIR)$(htmldocdir)/groff.html.node; \
+ fi; \
+ rmdir $(DESTDIR)$(htmldocdir); \
+ fi; \
+ rmdir $(DESTDIR)$(docdir); \
+ fi
+
+# Uninstall program that have a 'g' prefix
+uninstall-hook: uninstall_binaries_with_prefix
+uninstall_binaries_with_prefix:
+@USEPROGRAMPREFIX_TRUE@ if test -n "$(NAMEPREFIX)"; then \
+@USEPROGRAMPREFIX_TRUE@ for f in $(prefixexecbin_PROGRAMS) $(prefixexecbin_SCRIPTS); do \
+@USEPROGRAMPREFIX_TRUE@ rm -f $(DESTDIR)$(bindir)/$(NAMEPREFIX)$$f$(EXEEXT); \
+@USEPROGRAMPREFIX_TRUE@ done; \
+@USEPROGRAMPREFIX_TRUE@ fi
+.man:
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && LC_ALL=C \
+ sed -e "s|[@]APPDEFDIR[@]|`echo $(appdefdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]BINDIR[@]|`echo $(bindir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]COMMON_WORDS_FILE[@]|`echo $(common_words_file) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]COMPATIBILITY_WRAPPERS[@]|$(compatibility_wrappers)|g" \
+ -e "s|[@]DATASUBDIR[@]|`echo $(datasubdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]DEFAULT_INDEX[@]|`echo $(indexdir)/$(indexname) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]DEFAULT_INDEX_NAME[@]|`echo $(indexname) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]DEVICE[@]|\\\\%$(DEVICE)|g" \
+ -e "s|[@]DOCDIR[@]|`echo $(docdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]EXAMPLEDIR[@]|`echo $(exampledir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]FONTDIR[@]|`echo $(fontdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]g[@]|\\\\%$(g)|g" \
+ -e "s|[@]HTMLDOCDIR[@]|`echo $(htmldocdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]INDEX_SUFFIX[@]|\\\\%$(indexext)|g" \
+ -e "s|[@]LEGACYFONTDIR[@]|`echo $(legacyfontdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]LOCALFONTDIR[@]|`echo $(localfontdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]LOCALMACRODIR[@]|`echo $(localtmacdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]MACRODIR[@]|`echo $(tmacdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]MAN1EXT[@]|$(man1ext)|g" \
+ -e "s|[@]MAN5EXT[@]|$(man5ext)|g" \
+ -e "s|[@]MAN7EXT[@]|$(man7ext)|g" \
+ -e "s|[@]MDATE[@]|`$(PERL) $(top_srcdir)/mdate.pl $<`|g" \
+ -e "s|[@]OLDFONTDIR[@]|`echo $(oldfontdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]PAGE[@]|\\\\%$(PAGE)|g" \
+ -e "s|[@]PDFDOCDIR[@]|`echo $(pdfdocdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]PSPRINT[@]|`echo $(PSPRINT) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]SYSTEMMACRODIR[@]|`echo $(systemtmacdir) | sed -f $(makevarescape)`|g" \
+ -e "s|[@]TMAC_AN_PREFIX[@]|\\\\%$(tmac_an_prefix)|g" \
+ -e "s|[@]TMAC_M_PREFIX[@]|\\\\%$(tmac_m_prefix)|g" \
+ -e "s|[@]TMAC_MDIR[@]|`echo $(tmacdir) | sed -f $(makevarescape)`/mm|g" \
+ -e "s|[@]TMAC_S_PREFIX[@]|\\\\%$(tmac_s_prefix)|g" \
+ -e "s|[@]VERSION[@]|$(VERSION)|g" \
+ $< \
+ >$@
+$(top_srcdir)/.version:
+ echo $(VERSION) > $@-t && mv $@-t $@
+dist-hook:
+ echo $(VERSION) > $(distdir)/.tarball-version
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..85b034b
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,3594 @@
+ Copyright (C) 1992-2023 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+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.23.0
+==============
+
+troff
+-----
+
+o The `troffrc` file now loads an English localization file instead of
+ directly housing configuration parameters appropriate to the English
+ language. See "Macro Packages" below.
+
+o A new read-only register `.cp` is implemented. Within a `do` request,
+ "\n[.cp]" holds the saved value of compatibility mode. See
+ groff_diff(7) or the groff Texinfo manual for rationale, use case, and
+ example.
+
+o New read-only registers `.nm` and `.nn` are implemented. `.nm` is of
+ Boolean sense, reporting the enablement status of output line
+ numbering (caused by the `nm` request) irrespective of the temporary
+ suspension of numbering with the `nn` request. `.nn` holds the count
+ of numbered output lines still to have that numbering suppressed.
+ These registers were introduced because there was no way for the
+ formatter (and thus a document) to introspect their state, tbl(1)
+ needs to be able to do so, and the writable line number register `ln`
+ is not a reliable proxy for this information.
+
+o Type size escape sequences of the form "\sNN", where NN is in the
+ range 10-39, are now recognized only in compatibility mode ("groff
+ -C"); when encountered, an error diagnostic is emitted. Otherwise,
+ "\sN" is interpreted as setting the type size to the single-digit
+ value N (in scaled points), which ends the escape sequence. This
+ change eliminates a quirk in the language grammar that dates back to
+ the mid-1970s (AT&T troff by Ossanna) but was not documented in the
+ Troff User's Manual until 1992 when Kernighan updated CSTR #54 for
+ device-independent AT&T troff.
+
+ The form "\s(NN" is accepted for two-digit sizes in all known troffs.
+ The form "\s[NNN]" accepts a numeric expression of variable length; it
+ has been supported by groff since version 1.01 (March 1991) or
+ earlier, by Heirloom Doctools troff since its 2005-08-16 release, and
+ by neatroff, but not by Plan 9 troff. The form "\s'NNN'" is also
+ widely supported.
+
+ Summary: in your documents, rewrite escape sequences beginning with
+ "\s1", "\s2", or "\s3" in an unambiguous and portable form. For
+ instance, "\s36" can become any of:
+ \s(36
+ \s[36]
+ \s'36'
+ You can use
+ grep '\\s[123]'
+ to find instances in your documents.
+
+ Those who have changed the escape character with the `ec` request (an
+ advanced usage) are expected to be able to cope; ask the development
+ team for support if you need it.
+
+o New requests `soquiet` and `msoquiet` are available. They operate as
+ `so` and `mso`, respectively, except that they do not emit a warning
+ diagnostic if the file named in their argument does not exist.
+
+o New requests `stringdown` and `stringup` are available. These change
+ the string named in their argument by replacing each of its bytes with
+ its lowercase or uppercase version (if any), respectively. groff
+ special characters (see the groff_char(7) man page) in the string will
+ often transform in the expected way due to the regular naming
+ convention for accented letters. When they do not, use substrings
+ and/or catenation.
+
+o The `ab` request no longer writes "User Abort." to the standard error
+ stream if given no arguments.
+
+o The `fp` request no longer accepts file or font names with slashes in
+ them as arguments. All font description files are expected to be
+ accessible within the directory of the output device for which they
+ were prepared.
+
+nroff
+-----
+
+o The new option -P takes an argument to pass to the output driver
+ (always grotty(1)). "-P-i" directs the terminal device to display
+ real italic (oblique) characters instead of underlining: it is up to
+ your terminal (emulator) to support italics (xterm does since patch
+ #314 [2014-12-28]). "-P-h" can now be used instead of -h; the latter
+ may eventually be deprecated and repurposed.
+
+o The new option -V emits the constructed groff command that nroff would
+ run to standard output instead of executing it. Arguments to nroff
+ that contain shell metacharacters may not be sufficiently escaped for
+ the output of nroff -V to be copied and pasted to the shell prompt;
+ this is a historical deficiency of the Bourne shell family not yet
+ corrected by the POSIX standard.
+
+o nroff now recognizes the -b, -E, -k, -K, -R, and -z options and passes
+ them through to groff.
+
+o nroff now supports spaces and tabs between option flag letters and
+ arguments to options, like groff and troff themselves.
+
+groff
+-----
+
+o The -I option now implies -g (run the grn(1) preprocessor), and
+ supplies grn an -M option with the argument to -I.
+
+eqn
+---
+
+o The GNU extension
+
+ delim on
+
+ is now recognized even in AT&T compatibility mode (the -C option) in
+ order to reliably integrate with tbl. Few eqn documents are expected
+ to use 'o' and 'n' as left and right delimiters, respectively. If
+ yours does, consider swapping them, or select others.
+
+o The command-line option -D is no longer supported. It has been
+ undocumented, and issued a warning of its obsolescence upon use, for
+ 30 years, since groff 1.06 (September 1992).
+
+pic
+---
+
+o The token `.PY` is now recognized as a synonym of `.PF` to work around
+ a name space collision with the m (mm) macro package, which defines
+ `PF` as a page footer management macro. (This problem dates back at
+ least to Unix System V Release 2, 1983.) You should continue to use
+ `.PF` to end pictures with flyback unless a similar problem faces your
+ document.
+
+tbl
+---
+
+o GNU tbl now suspends output line numbering while formatting tables,
+ saving and restoring its status before and after each table region,
+ including the count of lines for which numbering is suppressed.
+ Historical tbl implementations did not, with bizarre consequences when
+ text blocks were used in tables.
+
+Macro packages
+--------------
+
+o mom version 2.5 is distributed with this release. New features
+ include shaded backgrounds, frames, and colored pages. Thanks to
+ Peter Schaffter.
+
+o English localization has been split into a dedicated macro file,
+ `en.tmac`, for better parallelism with other localization files and to
+ improve support for multilingual documents. Those who want a
+ different default input language should edit the troffrc file to
+ source the desired groff locale macro file (`cs.tmac`, `de.tmac`,
+ `den.tmac`, `fr.tmac`, `it.tmac`, `ja.tmac`, `sv.tmac`, or `zh.tmac`)
+ instead of `en.tmac`.
+
+ The default hyphenation mode (as given to the `hy` request) for users
+ of English has changed from "1", which was inappropriate for the
+ TeX-based hyphenation patterns groff has used since at least 1991, to
+ "4". However, invoking ".hy" without an argument remains synonymous
+ with ".hy 1".
+
+o The hyphenation patterns for English have been updated using the
+ `hyph-en-us.tex` patterns file from the TeX hyph-utf8 project. The
+ new patterns likely _will_ change the automatic hyphenation break
+ points of your English documents.
+
+o The `PDFPIC` macro (provided by the `pdfpic` package) no longer aborts
+ upon encountering trouble. Instead, it reports an error and abandons
+ processing of its argument(s). It is also more sensitive to other
+ kinds of problems and handles them the same way, by issuing a
+ diagnostic and returning. If you wish `PDFPIC` to abort document
+ processing immediately upon error, you can append an `ab` request to
+ the package's error-handling macro.
+
+ .am pdfpic@error
+ . ab
+ ..
+
+o The pspic package now also has an error hook macro, which you can use
+ to make failed image loads fatal (or attempt fallback or recovery).
+
+ .am pspic@error-hook
+ . ab
+ ..
+
+o The new rfc1345 macro package, contributed by Dorai Sitaram, defines
+ special character identifiers implementing RFC 1345 mnemonics (plus
+ some additions from Vim, which itself uses RFC 1345 for its digraphs).
+ It is documented in the groff_rfc1345(7) man page.
+
+o The new sboxes macro package, contributed by Deri James, offers a
+ simple interface to the new gropdf(1) "background" feature. Using it,
+ ms documents can draw colored rectangles beneath any groff output.
+ See "Using PDF boxes with groff and the ms macros", installed as
+ `msboxes.ms` and `msboxes.pdf` for instructions and a demonstration.
+
+o The an (man) and doc (mdoc) macro packages no longer remap the -, ',
+ and ` input characters to Basic Latin code points on UTF-8 devices,
+ but treat them as groff normally does (and AT&T troff before it did)
+ for typesetting devices, where they become the hyphen, apostrophe or
+ right single quotation mark, and left single quotation mark,
+ respectively. This change is expected to expose glyph usage errors in
+ man pages. See the "PROBLEMS" file for a recipe that will conceal
+ these errors. A better long-term approach is for man pages to adopt
+ correct input practices; the man pages groff_man_style(7),
+ groff_char(7), and man-pages(7) (subsection "Generating optimal
+ glyphs"; from the Linux man-pages project) contain such instructions.
+ Doing so also improves man page typography when formatting for PDF.
+
+ If you maintain a generator of man(7) or mdoc(7) documents (such as a
+ tool that converts other formats to them), and need assistance, please
+ contact the groff@gnu.org mailing list and describe your situation.
+
+o The an (man) macro package can now produce clickable hyperlinks within
+ terminal emulators, using the OSC 8 support added to grotty(1) (see
+ below). The groff man(7) extension macros `UR` and `MT`, present
+ since 2007, expose this feature. At present the feature is disabled
+ by default in `man.local` pending more widespread recognition of OSC 8
+ sequences in pager programs. The package now recognizes a `U`
+ register to enable hyperlinks in any output driver supporting them.
+
+ Use a command like
+ printf '\033]8;;man:grotty(1)\033\\grotty(1)\033]8;;\033\\\n' | more
+ to check your terminal and pager for OSC 8 support. If you see
+ "grotty(1)" and no additional garbage characters, then you may wish to
+ edit "man.local" to remove the lines that disable this feature.
+
+o The an (man) macro package supports a new macro, `MR`, intended for
+ use by man page cross references in preference to the font style
+ alternation macros historically used. Where before you would write
+ .BR ls (1).
+ or
+ .IR ls (1).
+ you should now write
+ .MR ls 1 .
+ (the third argument, typically used for trailing punctuation, is
+ optional). Because the macro semantically identifies a man page, it
+ can create a clickable hyperlink ("man:ls(1)" for the above example)
+ on supporting devices. Furthermore, a new string, `MF`, defines the
+ font to be used for setting the man page topic (the first argument to
+ `MR` and `TH`), permitting configuration by distributions, sites, and
+ users.
+
+ Inclusion of the `MR` macro was prompted by its introduction to
+ Plan 9 from User Space's troff in August 2020. Its purpose is to
+ ameliorate several long-standing problems with man page cross
+ references: (1) the package's lack of inherent hyperlink support for
+ them; (2) false-positive identification of strings resembling man page
+ cross references (as can happen with "exit(1)", "while(1)",
+ "sleep(5)", "time(0)" and others) by terminal emulators and other
+ programs; (3) the unwanted intrusion of hyphens into man page topics,
+ which frustrates copy-and-paste operations (this problem has always
+ been avoidable through use of the \% escape sequence, but cross
+ references are frequent in man pages and some page authors are
+ inexpert *roff users); and (4) deep divisions in man page maintenance
+ communities over which typeface should be used to set the man page
+ topic (italics, roman, or bold).
+
+o Part of the an (man) macro package has been renamed from "an-old.tmac"
+ to "an.tmac", replacing a file that sourced the "andoc.tmac" wrapper.
+ This means that the "-man" argument to groff (or nroff, or troff) will
+ no longer load the andoc wrapper, and not successfully format mdoc(7)
+ man pages. If you are not sure which macro package a given man page
+ uses, or you wish to batch-process a series of man pages written
+ variously in the man and mdoc formats, be sure to call the formatter
+ with the "-mandoc" option explicitly, as "-man" will no longer do
+ this. The man-db man(1) implementation has, since 2001, used
+ "-mandoc" preferentially if available when man-db is configured.
+
+o The an (man) and doc (mdoc) macro packages support a new `AD` string
+ to put the default adjustment mode under user control at rendering
+ time. The default is "b" (adjust lines to both margins) as has been
+ the Unix man(7) default since 1979.
+
+o The an (man) and doc (mdoc) macro packages support new `CS` and `CT`
+ registers to control rendering of man page section headings and topics
+ (seen in the page header), respectively, in full capitals. These
+ default off (with no visible effect on pages that already fully
+ capitalize such text in man page sources). The rationale is to
+ encourage man page authors to preserve case distinction information in
+ (or restore it to) their topics and section headings, while giving
+ users (including system administrators, distributors, integrators, and
+ maintainers of man(1) implementations) a way to view the rendered page
+ elements in full capitals if desired.
+
+o The an (man) macro package no longer honors an `ll` request to set the
+ line length on nroff devices prior to processing a man page. This was
+ deprecated in groff 1.18 (July 2002), and all known man program and
+ macro package implementations either have set an LL register since
+ 2002 (man-db man), 2005 (Brouwer/Lucifredi man), or don't let the user
+ vary the line length freely (DWB troff, Solaris troff, Plan 9 troff),
+ don't permit its configuation via the `ll` request (mandoc), or at all
+ (Heirloom Doctools troff).
+
+o The an (man) macro package now interprets the value of the `HY`
+ register as a Boolean; using it to set a specific hyphenation mode is
+ no longer supported. The groff command-line option `-rHY=0` continues
+ to disable automatic hyphenation of man page text as before.
+
+o The an (man) macro package's `TS` macro no longer inserts vertical
+ space. It was not documented to do so, but had since groff 1.18 (July
+ 2002). Man page authors may freely use paragraphing macros around
+ tables if vertical space is desired.
+
+o The an (man) macro package no longer attempts to detect misuse of the
+ `R` string as a macro. The `R` string itself is a legacy feature, not
+ required in modern man pages; see groff_man_style(7).
+
+o The groff_man(7) man page documenting the groff implementation of the
+ an (man) macro package has been split into two pages. The original
+ page remains as a terser reference for experienced users. A new page,
+ groff_man_style(7), is a tutorial and style guide containing the same
+ material supplemented with explanations, examples, and advice for the
+ reader who is not an expert in *roff systems or in writing man pages.
+
+o The doc (mdoc) macro package now honors the `C`, `FT`, `HY`, `IN`,
+ `P`, `SN`, and `X` registers and `HF` string as the an (man) package
+ does.
+
+o The doc (mdoc) macro package now renders man page (sub)section cross
+ references cited with the `Sx` macro by quoting them instead of
+ setting them in italics.
+
+o The e (me) macro package has changed its default line length on
+ typesetting devices from 6i to the output device's default (for
+ example, 6.5i on the 'ps' and 'pdf' devices). You can use
+ "papersize.tmac" to override this length, as in "groff -d paper=a4l"
+ to select A4 paper in landscape orientation, without needing to alter
+ the document.
+
+o The e (me) macro package has changed its support for output line
+ numbering with the `n1` and `n2` macros to resolve several bugs in the
+ previous implementation. The `n1` macro now accepts an optional `C`
+ argument to set the line number at the existing page offset instead of
+ reducing the page offset to make the line number appear in the left
+ margin. A second argument to the `n2` macro is no longer supported.
+ A new register `no` makes configurable the amount of horizontal space
+ to be used for the line number (the default is unchanged).
+
+o The e (me) macro package now uses strings `wa` and `wc` to store the
+ terms the package produces in chapter headings created by the `$c`
+ macro. The strings, which default to "Appendix" and "Chapter",
+ respectively, ease localization of the package and replacement of the
+ terms used without requiring the `$c` macro to be redefined.
+
+o The e (me) macro package has a new macro, `ld`, which "re-localizes
+ the date"; if you modify troff registers `dw`, `mo`, and `yr` (to
+ record a document's date of revision, for instance), call `ld`
+ afterward to update the package's `y2` and `y4` registers and the
+ localized strings `dw` and `mo` for the names of the weekday and
+ month. `ld` is also used internally to simplify the use of the
+ package with languages other than English; it thus updates the `wa`
+ and `wc` strings as well. If you want to customize these strings, do
+ so after any `ld` call you make.
+
+o The e (me) macro package now has a register `sx` that eases the
+ configuration of space added to the line height above/below when
+ super/subscripting is used. It defaults to 0.2m, the value used
+ literally in past definitions of the super/subscripting strings.
+ groff's own 'me' documents redefine it to zero.
+
+o The e (me) macro package's `$v` and `$V` registers have been renamed
+ to `tv` and `dv`--they control the vertical spacing used
+ for text and displays/annotations, respectively. The old names are
+ still supported as aliases. The new names reflect the fact that users
+ are expected to set them if desired, unlike other registers and
+ strings beginning with "$".
+
+o The e (me) and s (ms) macro packages now offer a `PF` macro,
+ supporting the pic(1) preprocessor's "flyback" feature. Thanks to
+ Dave Kemper.
+
+o The m (mm) and s (ms) macro packages no longer implement the `IX`
+ macro. This undocumented 4.2BSD ms extension was similarly
+ undocumented by groff mm and ms. No documents applying it are
+ attested. groff mm documents its own indexing feature, `INITI`. We
+ otherwise suggest makeindex(1), which supports troff and is available
+ with most TeX distributions, for your mm/ms document indexing needs.
+
+o The m (mm) macro package now adapts to the paper format selected when
+ the macro file "papersize.tmac" is used (by specifying the groff "-d
+ paper" command-line option). A consequence is that "groff -mm" and
+ "groff -d paper=letter -mm" are _not_ synonymous (when groff is
+ configured to use U.S. letter as the default paper format), because
+ groff mm(7) uses a page offset of 0.963 inches on typesetting devices
+ for compatibility with DWB mm. If the `W` or `O` registers are also
+ set on the command line, the line length and page offset,
+ respectively, are not overridden by "papersize.tmac".
+
+o The m (mm) macro package now recognizes a `V` register to set the
+ vertical spacing for the document. Like the existing `S`, it must be
+ set from the command line. Further, both registers are interpreted
+ correctly if suffixed with a scaling unit, instead of requiring an
+ unscaled value assumed to be points.
+
+o The m (mm) macro package now supports AT&T/DWB mm's `Sm` string.
+
+o The m (mm) macro package now requires a title to be declared when
+ memorandum type 5 is used (".MT 5"), just as type 4 has since groff
+ 1.10 (November 1995).
+
+o The m (mm) and s (ms) macro packages no longer manipulate the set of
+ enabled warning categories. If you want all warnings on, use the
+ `warn` request with no arguments in your document or pass "-w w" to
+ groff (see troff(1) or the groff Texinfo manual for more on warnings).
+
+o The m (mm) and s (ms) macro packages' `R` macros now work analogously
+ to their `B` and `I` macros instead of ignoring their arguments.
+
+o The m (mm) package now offers a `PY` macro, which serves the function
+ of `PF` (end pic(1) picture with flyback) from other macro packages.
+
+o The "ptx.tmac" macro file, a counterpart to the GNU coreutils ptx(1)
+ command for generating permuted indexes, is now installed. It has
+ long been part of the source distribution.
+
+o The s (ms) macro package now enables the formatter's "no-space mode"
+ after ending displays (`DE`), equations (`EN`), tables (`TS`), and
+ pictures without flyback (`PE`). This means that display distance
+ spacing (the `DD` register) overrides the spacing that may follow in a
+ subsequent paragraph, section heading, or display instead of
+ accumulating with that distance. This change is to make the behavior
+ of the package more predictable; you can fine-tune such spacing by
+ setting the `DD` register in desired places. It has also helped us to
+ improve groff ms's rendering of historical ms(7) documents such as
+ Kernighan & Cherry's "Typesetting Mathematics".
+
+o The s (ms) macro package supports a new string, `FR`, which defines
+ the ratio of the footnote line length to the current line length. The
+ default expression is "11/12", eleven twelfths of the normal line
+ length, adopted for better compatibility with ms documents prepared
+ with AT&T ms or its descendant implementations in Heirloom Doctools
+ and neatroff. This is a change from previous groff releases, which
+ used a ratio of five sixths.
+
+ You may wish to set the `FR` string to "1" to align with contemporary
+ typesetting practices. In Unix Version 7 ms, its descendants, and
+ groff prior to this release, an `FL` register was used for the line
+ length in footnotes; however, setting this register at document
+ initialization time had no effect on the footnote line length in
+ multi-column arrangements.
+
+ `FR` should be used in preference to the old `FL` register in
+ contemporary documents; see the groff Texinfo manual or the "Using
+ groff with the ms macros" document, also part of this release. Thanks
+ to T. Kurt Bond.
+
+o The s (ms) macro package has added strings, `<` and `>`, to perform
+ subscripting. They work analogously to the `{` and `}` superscripting
+ strings that have been present in groff ms since 1991 or earlier.
+
+o The s (ms) macro package has added a hook macro, `FS-MARK`, which is
+ called automatically by the `FS` macro (with the same arguments given
+ to `FS`) before any other footnote processing. It is empty by default
+ but can be defined by the user to, for example, place a hyperlink
+ anchor so that a link within a footnote can return to its referential
+ context. "Portable Document Format Publishing with GNU Troff",
+ distributed with groff as `pdfmark.ms`, uses this technique. Thanks
+ to Keith Marshall.
+
+o The s (ms) macro package's `RP` macro recognizes a new optional
+ argument, `no-renumber`, which suppresses the renumbering of the page
+ after the cover page as page 1. It furthermore recognizes the
+ optional argument `no-repeat-info`, which has the same effect as `no`;
+ the latter will continue to be supported for backward compatibility.
+ Optional arguments to `RP` can be given in any order.
+
+o The s (ms) macro package supports new macros `XN` and `XH` to ease the
+ input of numbered and unnumbered section headings, respectively. They
+ internally call the `XS` and `XE` macros to produce table of contents
+ entries, and lay a foundation for inclusion of PDF bookmarks, all
+ without requiring retyping of the heading text as the package
+ previously encouraged. Thanks to Keith Marshall.
+
+o The s (ms) macro package now uses a default line length of 6.5 inches
+ by default, resulting in 1-inch left and right margins. When the
+ "papersize.tmac" package is used by employing the "-d paper" groff(1)
+ option on typesetting devices, the default page offset and line length
+ are adjusted to maintain these margins.
+
+o The "a4.tmac" file has been dropped from the distribution. Its
+ successor, "papersize.tmac", has been present and documented for
+ nearly 20 years. See subsection "Paper format" of groff(1).
+
+o The "safer.tmac" file has been dropped from the distribution. It was
+ present only to support man(1) programs that unconditionally passed
+ the formatter the "-msafer" option, and had contained only comments
+ for over 20 years. If your man(1) program has this requirement, you
+ can create an empty file of this name in groff's macro file search
+ path (see troff(1)) or consider migrating to man-db man(1).
+
+Output drivers
+--------------
+
+o On output devices using the Latin-1 character encoding ("groff -T
+ latin1" and the X11 devices) the special character escape sequence
+ \[oq] (opening quote) is now rendered as code point 0x27 (apostrophe)
+ instead of 0x60 (grave accent). The ISO 8859/ECMA-94 Latin character
+ sets do not define any glyphs for directional ("typographer's")
+ quotation marks, but the apostrophe is depicted in the defining
+ standard as a neutral (vertical) glyph, whereas the grave accent 0x60
+ and acute accent 0xB4 are mirror-symmetric diacritical marks.
+
+ This change has no effect on _input_ conventions for roff source
+ documents. You can still get directional single quotes on UTF-8,
+ PostScript, PDF, and other output devices supporting them by typing
+ sequences like `this' in the input (character remapping with 'char'
+ requests and similar notwithstanding).
+
+gropdf
+------
+
+o A new device control command, "background", enables boxes to be drawn
+ underneath other page content. The boxes can be shaded with colors,
+ drawn with a colored border of configurable thickness, and interrupted
+ by page breaks with special support for breaking before footnotes and
+ similar material. For convenience, "pdf.tmac" exposes a new macro,
+ `pdfbackground`. Thanks to Deri James.
+
+grotty
+------
+
+o The "utf8" output device now maps the input characters '^' (caret,
+ circumflex accent, or "hat") and '~' (tilde) to U+02C6 (modifier
+ letter circumflex accent) and U+02DC (small tilde), respectively, for
+ consistency with groff's other output devices. This change is
+ expected to expose glyph usage errors in man pages. See the
+ "PROBLEMS" file for a recipe that will conceal these errors. A better
+ long-term approach is for man pages to adopt correct input practices;
+ the man pages groff_man_style(7), groff_char(7), and man-pages(7)
+ (subsection "Generating optimal glyphs"; from the Linux man-pages
+ project) contain such instructions. Doing so also improves man page
+ typography when formatting for PDF.
+
+ If you maintain a generator of man(7) or mdoc(7) documents (such as a
+ tool that converts other formats to them), and need assistance, please
+ contact the groff@gnu.org mailing list and describe your situation.
+
+o A new device control command, "link", generates OSC 8 hyperlinks.
+ This means that groff documents can produce clickable links in the
+ terminal window for emulators that support such escape sequences.
+
+o The "sgr" device control command, which dynamically configured support
+ for ISO 6429/ECMA-48 SGR escape sequences (and restored traditional
+ overstriking behavior if disabled), has been removed. It took effect
+ only at page boundaries. grotty's "-c" command-line option and the
+ GROFF_NO_SGR environment variable remain supported.
+
+Documentation
+-------------
+
+o groff's Texinfo manual is included in the distribution archive in
+ several formats, including GNU Info, HTML, TeX DVI, PDF, and plain
+ text. Many sections have been extensively revised and corrected, and
+ much material added to help the learner acquire the groff formatting
+ language (see, for instance, the section/node "Text").
+
+o A compilation of all of groff's man pages in PDF and UTF-8-encoded
+ text (with SGR escape sequences) is produced by the build. Many of
+ the documents in this 380+-page document have been heavily revised or
+ rewritten, including tbl(1), groff(1), groff_diff(7), groff_font(5),
+ groff(7), groff_char(7), and roff(7). The PDF version uses pdfmark
+ extensions to produce an internal bookmark for every man page
+ document, section heading, and subsection heading.
+
+o Larry Kollar's "Using groff with the ms Macro Package" has been
+ resurrected after 20+ years, revised, and updated.
+
+o Eric Allman's "me Reference Manual" has been revised in detail.
+
+Miscellaneous
+-------------
+
+o Because all generated forms of groff's Texinfo manual are now included
+ in the distribution archive, building from that archive no longer
+ depends on GNU Texinfo or a TeX installation (the latter was required
+ only for the "doc" target, which had to be explicitly named).
+
+o Building groff from its distribution archive no longer requires byacc
+ (or GNU Bison) to be installed.
+
+o m4 is now required to build. Any m4 that implements the features
+ documented in the Version 7 Unix m4(1) man page, and the `-D` option,
+ should suffice.
+
+o New 'configure' options '--{en,dis}able-groff-allocator' control
+ whether groff uses its own malloc/free-wrapping allocator to implement
+ all C++ new/delete operations. groff has used this allocator for over
+ 30 years; C++ implementations are more mature now. The default is now
+ to rely on C++ language runtime support for new/delete. When building
+ groff, use
+ configure --enable-groff-allocator
+ to re-enable groff's traditional allocator.
+
+o The 'configure' option '--with-appresdir' has been renamed to
+ '--with-appdefdir'.
+
+o Italian language input documents are now supported, including
+ hyphenation patterns from the hyph-utf8 project and localized strings
+ for the ms, me, mm, and mom packages. Thanks to Edmond Orignac.
+
+o Manual section titles for man pages (those that appear by default in
+ the page header, like "General Commands Manual") are now localized for
+ Czech, German, French, Italian, and Swedish.
+
+o The semantics of the environment variable SOURCE_DATE_EPOCH to groff,
+ support for which was added in 1.22.4, were not established at that
+ time with respect to time zone selection, prompting divergent
+ interpretations; Debian and distributions derived from it have for
+ several years patched groff to implicitly use UTC as the time zone
+ when interpreting the current time (or SOURCE_DATE_EPOCH) as a local
+ time. While a convenient and defensible choice for reproducible build
+ efforts, it runs against the grain of user expectations. Systems
+ programmers like time zone-invariant, monotonically increasing clocks;
+ the broader user base usually prefers a clock that follows an
+ applicable civil calendar. groff programs now reckon
+ SOURCE_DATE_EPOCH with respect to the local time zone. Users of
+ SOURCE_DATE_EPOCH may wish to also set the TZ environment variable.
+
+o xtotroff now supports a "-d" option to specify the directory in which
+ to generate font description files.
+
+o The 'configure' option '--with-doc' that was introduced in version
+ 1.22.3 has been deleted again. Its basic idea was misguided because
+ each of the documents is only available in a subset of the output
+ formats, so in contrast to the documentation, the option not only
+ affected which output formats were generated, but also restricted the
+ documentation content the user would get in erratic and surprising
+ ways. The option was also ill-designed insofar as the "examples"
+ keyword did not represent an output format. Some example files were
+ controlled by the "examples" keyword alone, some by the respective
+ format keywords alone, and some by a combination of both. The
+ implementation of the option was full of bugs, but few, if any, of
+ these bugs were ever reported by users, giving the impression that
+ few, if any, users ever attempted to use the option, and those who did
+ likely remained unaware that doing so deprived them of parts of the
+ content of the documentation. Experience has demonstrated that
+ properly maintaining and testing the option exceeds the amount of
+ effort the GNU troff team is able to invest. Finally, GNU standards
+ contain no recommendation to support this option, and indeed, few, if
+ any, GNU packages apart from groff support it.
+
+o The 'doc' Make target has been eliminated. 'all' (the default Make
+ target) assumes responsibility for generating the groff Texinfo manual
+ in all formats supported by the build host. This change is only
+ significant when building from a Git checkout or if our Texinfo
+ manual's sources are modified; the distribution archive now provides
+ copies of the manual in Info, plain text, HTML, DVI, and PDF.
+
+o afmtodit no longer writes file names with directory information in
+ them to the "name" directives of the font descriptions it generates.
+ (The `fp` request no longer accepts such names; see "troff" above.)
+
+o afmtodit now exits with status 2 (not 1) upon usage errors.
+
+o afmtodit now recognizes a '-w' option to specify the generated font
+ description's "spacewidth" parameter (see groff_font(5)). The
+ internal library "libgroff" now emits a diagnostic if a font
+ description file is missing such a directive. Adding this option
+ enables a well-formed font description to be produced by the tool
+ (without requiring editing by hand).
+
+o pfbtops now exits with status 2 upon usage errors and the standard C
+ library's `EXIT_FAILURE` status (usually 1) on operational failures
+ instead of vice versa.
+
+o groffer has been deleted from the distribution.
+
+o grog no longer supports the "--warnings" option; the one diagnostic
+ message that it enabled has been removed.
+
+o The ditroff(7) man page has been deleted. The "History" section of
+ roff(7) covers the same subject in greater depth.
+
+o The groff_filenames(5) man page has been deleted. It had inaccuracies
+ and spurious content. The "File name conventions" section of roff(7)
+ covers the same subject.
+
+o The lj4_font(5) man page has been deleted. Its content has moved into
+ the "Fonts" subsection of grolj4(1).
+
+
+VERSION 1.22.4
+==============
+
+Troff
+-----
+
+o The `hy' request has been extended. Value 16 enables hyphenation
+ before the last character, and value 32 enables hyphenation after the
+ first character.
+
+PDFPIC
+------
+
+o PDFPIC has been corrected so the behaviour is the same whether you use
+ the PostScript or PDF drivers. However, this means that any documents
+ which were written using the old behaviour will not be rendered
+ correctly if using the PDF driver with the new version.
+
+ The change would mean that documents which relied on the previous
+ behaviour are likely to have a gap underneath the image which was not
+ there before. If you see this effect there are three ways you can
+ restore the previous behaviour:
+
+ Add the line ".nr PDFPIC_NOSPACE 1" to the document before the first
+ call to .PDFPIC.
+
+ If it is just a single document which exhibits this behaviour you can
+ run groff adding "-rPDFPIC_NOSPACE=1" to the command line.
+
+ If you have many documents which rely on the previous behaviour you
+ can set an environment variable "export GROFF_PDFPIC_NOSPACE=1" which
+ will restore the previous behaviour for all runs.
+
+ This change has no effect if you were using .PDFPIC with the
+ PostScript driver--only if you used it with the PDF driver.
+
+Gropdf
+------
+
+o Type 1 font loading is fixed to handle newer Ghostscript versions.
+
+o Handling of glyphs above position 255 is improved to allow many more
+ glyphs to be used.
+
+o New macros .pdftransition and .pdfpause are introduced to allow
+ creation of presentation slides. Partially backward-compatible with
+ present.tmac, specifically the PAUSE, BLOCKS and BLOCKE commands.
+ Supports all the transition types introduced in PDF v1.5 (see the
+ gropdf man page).
+
+Miscellaneous
+-------------
+
+o A new 'configure' option --with-compatibility-wrappers controls how
+ groff compatibility wrappers for vendor-provided non-GNU macro sets
+ are installed (see ./configure --help).
+
+o eqn2graph, grap2graph, and pic2graph now attempt to adapt to very old
+ installed versions of the ImageMagick and GraphicsMagick programs
+ "convert". They search the output of convert's "-help" option, and
+ use "-trim" if that string is found; otherwise, the old "-crop 0x0"
+ method (which produces incompatible results on versions that _do_
+ support "-trim") is used. The programs emit a warning to standard
+ error if the search fails and the old method is used.
+
+o eqn2graph no longer supports the "-unsafe" option. It did nothing.
+
+o groffer now supports the output of XHTML. Use the "--xhtml" or
+ "--mode=xhtml" command-line options to generate it.
+
+o Much work has been done, and is ongoing, to make groff's man pages
+ better examples for man page writers to follow. groff_man(7) itself
+ has been expanded and largely rewritten to more precisely document the
+ macro package's behavior and to be more helpful and accessible to man
+ page writers who may never read any other groff documentation.
+
+
+VERSION 1.22.3
+==============
+
+Gxditview
+---------
+
+o X11 resources for `gxditview', which were previously installed in
+ /usr/X11/lib/X11/app-defaults no matter which `prefix' was set, are
+ now installed in appresdir=$prefix/lib/X11/app-defaults. If
+ `appresdir' is not a standard X11 resource directory, the environment
+ variable XFILESEARCHPATH should be set to this path. The standard
+ default directories depends on the system `libXt'. Common directories
+ include:
+
+ /usr/lib/X11/app-defaults
+ /usr/share/X11/app-defaults
+ /etc/X11/app-defaults
+
+ Note that if the option `--with-appresdir' is passed to `configure',
+ the `prefix' will not be added to `appresdir'.
+
+Glilypond
+---------
+
+o This new preprocessor (contributed by Bernd Warken) allows embedding
+ of code for GNU LilyPond (http://www.lilypond.org), a music
+ typesetter. The data gets automatically processed and embedded as EPS
+ images.
+
+Gperl
+-----
+
+o Bernd Warken contributed a new preprocessor to handle Perl code that
+ can be evaluated and then processed by groff.
+
+Gpinyin
+-------
+
+o Another preprocessor from Bernd Warken to pretty-print Pinyin
+ syllables like `guo2wang2' as `guówáng'.
+
+Pdfroff
+-------
+
+o The pdfroff utility script now activates its `--no-toc-relocation'
+ option by default, unless a request similar to:
+
+ .if !\n[PHASE] .tm pdfroff-option:set toc_relocation=enabled
+
+ is invoked during input file processing; (`.if !\n[PHASE] ...' ensures
+ that the effect of the `.tm' request is restricted to the document
+ setup phase of processing, as pdfroff sets it to 1 or 2 in the output
+ phase, but leaves it unset in the setup phase).
+
+ The bundled `spdf.tmac' macro package, which implicitly activates
+ `-mpdfmark' for `ms' macro users, ensures that TOC relocation is
+ appropriately enabled, when the `.TC' macro is invoked.
+
+Macro Packages
+--------------
+
+o New default values for hyphenation. The previous values were too
+ strict, suppressing some hyphenation points unnecessarily.
+
+o The -mom macro package now has full support for eqn, pic, and tbl, as
+ well as captioning and labelling of PDF images and preprocessor
+ output. Lists of Figures, Equations, and Tables can now be
+ autogenerated. PDF_IMAGE has a new FRAME option.
+
+o A French introduction to the -me macro package has been added (file
+ `meintro_fr.me').
+
+o In -mdoc, command %C is now available, providing a city or place
+ reference.
+
+
+VERSION 1.22.2
+==============
+
+Tbl
+---
+
+o The character `#' can now be used as an eqn delimiter within tables.
+
+Eqn
+---
+
+o A GNU extension
+
+ delim on
+
+ has been added to reactivate delimiters which have been disabled with
+ `delim off'.
+
+
+VERSION 1.22.1
+==============
+
+(There was no release 1.22.)
+
+Groff
+-----
+
+o A new option `-j' has been added to call the `chem' preprocessor.
+
+Tbl
+---
+
+o Improved line numbering support.
+
+Macro Packages
+--------------
+
+o Support for the `refer' preprocessor has been added to the -mm macro
+ package.
+
+o In -me, the `TH' macro was changed for compatibility with line number
+ support in tables.
+
+ `bl' now works inside of blocks.
+
+ The behaviour of centered blocks has been improved.
+
+ Line numbering support has been improved.
+
+o The -mom macro package has reached version 2.0, focusing on PDF output
+ with gropdf (using the new `pdfmom' wrapper script). See the file
+ `version-2.html' of the -mom documentation for a list of the many
+ changes.
+
+o Some generic Unicode fallback characters (mainly Roman numerals) have
+ been added.
+
+Gropdf
+------
+
+o A new driver for generating PDF output directly, contributed by Deri
+ James <deri@chuzzlewit.myzen.co.uk>. Note that this driver is written
+ in Perl, thus you need a working Perl installation to run this output
+ device.
+
+Pdfmom
+------
+
+o A new wrapper around groff that facilitates the production of PDF
+ documents from files formatted with the -mom macros.
+
+
+VERSION 1.21
+============
+
+Troff
+-----
+
+o The new `lsm' request specifies a macro to be invoked when leading
+ spaces in an input line are encountered (which are removed then).
+ Number registers `lsn' and `lss' hold the number of removed leading
+ spaces and the corresponding horizontal space, respectively.
+
+o There is a new warning category `file', enabled by default. The `mso'
+ request emits warnings in this category when the requested macro file
+ does not exist.
+
+o The new `class' request assigns a short name to a set of characters
+ which can be referred to in the `cflags' request. This is especially
+ useful to control line-breaking and hyphenation rules in CJK
+ languages.
+
+o Three new values for the `cflags' request have been added, which are
+ needed for proper CJK support.
+
+ 128 prohibit before but allow break after character
+ 256 prohibit after but allow break before character
+ 512 allow break before and after character
+
+Tbl
+---
+
+o A new global option `nowarn' suppresses warnings if tables are longer
+ than the current line width.
+
+Afmtodit
+--------
+
+o New option `-o' to specify the name of the output file.
+
+Macro Packages
+--------------
+
+o A new macro `%U' has been added to the mdoc package to indicate a URL
+ reference within an .Rs/.Re environment.
+
+o Rudimentary support for the Japanese script has been added, most
+ suitable for man page handling as output by grotty. The file
+ `ja.tmac' contains the necessary setup to allow line breaks before and
+ after CJK characters (with proper exceptions). Note, however, that no
+ inter-character spacing is implemented yet -- this usually causes many
+ warnings about bad line breaks.
+
+
+VERSION 1.20.1
+==============
+
+A packaging error made it necessary to publish this release. No
+user-visible changes.
+
+
+VERSION 1.20
+============
+
+Groff
+-----
+
+o XHTML support has been added to grohtml and can be specified by
+ -Txhtml. This option also utilizes the MathML capability of eqn and
+ combines the outputs of both in the final XHTML file. Users can also
+ specify the `-P-V' option together with `-Txhtml' in groff. This has
+ the effect of creating an XHTML validator button at the bottom of each
+ page.
+
+o Some options have been added to control a new preprocessor,
+ `preconv' (see below): `-k' activates it, `-K' sets the input
+ encoding, and `-D' sets the default encoding.
+
+o A new environment variable `GROFF_ENCODING' sets the encoding of input
+ files; it implies command option `-k'.
+
+Troff
+-----
+
+o Two new requests `device' and `devicem' have been added which are
+ equivalents to the \X and \Y escapes, respectively.
+
+o A new read-only number register `.br' is available which is set to 1
+ if a macro is called as .foo and to 0 if called as 'foo. This allows
+ to reliably modify requests.
+
+ .als bp@orig bp
+ .de bp
+ . tm before bp
+ . ie \\n[.br] .bp@orig
+ . el 'bp@orig
+ . tm after bp
+ ..
+
+o A new request `fzoom' has been added to adjust the optical size of a
+ font in relation to the others. The zoom factor is given in integer
+ multiples of 1/1000th. In the following example, the CR font is
+ magnified by 10% (the zoom factor is 1.1).
+
+ .fam P
+ .fzoom CR 1100
+ .ps 12
+ Palatino and \f[CR]Courier\f[]
+
+ The new number register `.zoom' holds the zoom value of the current
+ font, in multiples of 1/1000th.
+
+o The `cflags' request has been extended with a new flag value 64, to be
+ used in combination with values 2 (break before character) and 4
+ (break after character). If set, the hyphenation codes of the
+ surrounding characters are ignored.
+
+o A new debugging request, `pev', has been added to print all of the
+ current known environments to stderr. It first prints the state of
+ the current environment, then iterates through all of the known
+ environments, printing each except the one that is current.
+
+o A new escape `\$^' has been added. It represents the parameters of a
+ macro as if they were an argument to the `ds' request. This is used
+ by `trace.tmac'.
+
+o A new read-only number register `.O' is available which returns the
+ current suppression level as set by the `\O' escape.
+
+o The space width emitted by the `\|' and `\^' escape sequences can be
+ controlled on a per-font basis. If there is a glyph named `\|' or
+ `\^', respectively (note the leading backslash), defined in the
+ current font file, use this glyph's width instead of the default
+ value.
+
+ This behaviour is not new, but hasn't been documented before.
+
+Nroff
+-----
+
+o Two new command line options `-w' and `-W' are accepted and passed to
+ groff to enable and disable warning messages, respectively.
+
+Preconv
+-------
+
+o This is a new preprocessor to convert various input encodings to
+ something groff understands (this is, ASCII and \[uXXXX] entities,
+ with `XXXX' a hexadecimal number with 4 to 6 digits, representing a
+ Unicode input code). Normally, preconv should be invoked with options
+ `-k' and `-K' of groff. See the preconv man page for details.
+
+Pic
+---
+
+o int(x) now really behaves as documented: It truncates the non-integer
+ part of x, this is, it rounds towards zero and not towards the next
+ integer less than or equal to x.
+
+o Pic now supports up to 32 macro arguments (and up to 16 on EBCDIC
+ platforms).
+
+o Heinz-Jürgen Örtel contributed code for two new keywords, `xslanted'
+ and `yslanted', which can change the shape of boxes into arbitrary
+ parallelograms.
+
+Tbl
+---
+
+o Latest versions of DWB tbl introduced an `x' column specifier for a
+ single column expanded to the line width. GNU tbl has now been
+ extended to support even multiple `x' specifiers within a table.
+
+o To avoid collision with the new `x' specifier, a block formatting
+ macro must now be selected with specifier letter `m'.
+
+Eqn
+---
+
+o Eric S. Raymond has added a new device type to eqn, MathML. When
+ -TMathML is enabled, eqn now emits MathML formula markup rather than
+ groff commands. The new groff -Txhtml device uses this.
+
+Chem
+----
+
+o The preprocessor `chem' was added. `chem' is a roff language to
+ generate chemical structure diagrams. It generates `pic' output.
+
+Grops
+-----
+
+o The PS font definition files have been regenerated with newer AFM
+ versions from Adobe's 35 core fonts as present in most Level 2 PS
+ printers. The changes are minor (most notably, the addition of the
+ `Euro' glyph and an extended set of kerning values).
+
+ For backwards compatibility, the old set of font definition files is
+ still available; for details please read the man page of grops.
+
+Grotty
+------
+
+o \D'p...' is now supported if the polygon consists entirely of
+ horizontal and vertical lines.
+
+Grohtml
+-------
+
+o XHTML support has been added.
+
+o New command line option `-V' (to be used in XHTML mode) to produce an
+ XHTML validator button.
+
+o New command line option `-y' to produce a right-justified groff
+ signature at the end of the document (in combination with option
+ `-V').
+
+Gxditview
+---------
+
+o Support for keyboard navigation has been improved.
+
+o Similar to other X11 applications, there are now two resource files,
+ `GXditview' and `GXditview-color'.
+
+Groffer
+-------
+
+o `groffer' version 1.* exists now in a shell and a Perl version.
+
+Afmtodit
+--------
+
+o New option `-c' to output more font information as comments.
+
+o New option `-k' to suppress output of kerning data.
+
+o New option `-f NAME' to set the internal name of the groff font.
+
+Macro Packages
+--------------
+
+o Joachim Walsdorff contributed the `hdtbl' package for the generation
+ of tables, using a syntax very similar to the HTML table model. For
+ example, a table with two cells and two rows looks like this:
+
+ .TBL cols=2
+ . TR .TD 1*1 .TD 1*2
+ . TR .TD 2*1 .TD 2*2
+ .ETB
+
+ Here the same table using a more expanded syntax:
+
+ .TBL cols=2
+ . TR
+ . TD 1*1
+ . TD 1*2
+ . TR
+ . TD 2*1
+ . TD 2*2
+ .ETB
+
+ Tables can be nested; `hdtbl' works without a preprocessor so that the
+ full capability of groff's macro engine is available.
+
+ This package currently works with `-Tps' only.
+
+o -mandoc now supports multiple man pages (in either man or mdoc
+ format).
+
+o Fabrice Ménard contributed locales support. In particular, it is now
+ possible to get French localization of the main macro packages (-ms,
+ -mm, -me, and -mom, but not -man and -mdoc which are localized
+ differently) by appending `-mfr' to the list of macro packages.
+ Example:
+
+ groff -ms -mfr foo > foo.ps
+
+ Note that latin-9 input encoding is used for French (to support the
+ `oe' ligature).
+
+o Swedish macro localization (with `-msv') has been added.
+
+o German macro localization (with `-mde' and `-mden' for traditional and
+ new orthography, respectively) has been added.
+
+o Czech macro localization (with `-mcs') has been added.
+
+ Note that latin-2 input encoding is used for Czech.
+
+o A new macro `Dx' has been added to the mdoc package which identifies
+ the DragonFly OS.
+
+o If mdoc is used to print multiple man pages (together with the -rcR=0
+ command line option), each man page now starts a new page.
+
+o -mtrace has been considerably improved, now showing number and string
+ register assignments, among other things. See the groff_trace man
+ page for details.
+
+o The PSPIC macro now works with all devices (producing a hollow
+ rectangle on devices which don't support inclusion of PS images) and
+ is loaded in troffrc at start-up.
+
+o A new auxiliary macro package `62bit' has been added which provides
+ some macros for adding, multiplying, and dividing signed 62bit
+ integers (mainly to handle normal groff number operations without
+ risking overflow errors).
+
+o For -ms, Eric S. Raymond contributed support for ancient Bell Labs
+ localisms `.SC', `.UC', `.P1', and `.P2'. The latter three are
+ enabled only after .SC is called.
+
+o A new string, `SN-STYLE', has been added to the ms macros, controlling
+ the formatting of section numbers in headings defined by `.NH'.
+
+o The new macro package `ptx' provides a template definition for the
+ `.xx' macro as needed by GNU ptx (for creating permuted indices).
+
+
+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 <name>' and `S <name>' have been
+ added. `F' is true if a font <name> exists. `S' is true if a style
+ <name> 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 baseline)
+ 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 keeps 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'
+ produces 14pt headings, `.NH 2' produces 12pt, and all other
+ levels 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
+ <head>...</head> 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 are 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 unsafe mode, and 0
+ otherwise.
+
+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 specifier `x' to make tbl call a user-defined macro on a table
+ cell. Patch by Heinz-Jürgen Oertel <hj.oertel@surfeu.de>.
+
+Grap2graph
+----------
+
+o A new script contributed by Eric S. Raymond <esr@thyrsus.com>. 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 split 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/public/developer/opentype/index_glyph.html
+
+ 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
+
+ changes 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 motion
+ quantum 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 <egil@kvaleberg.no>.
+
+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 <kollar@alltel.net> 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=<size>'.
+
+ Possible values for `<size>' 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 that returns the resolved font
+ font name; a font family and abstract style are catenated.
+
+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 uses 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 <df191@ncf.ca> 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 automatically
+ converts 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 automatically converts 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 <esr@thyrsus.com>. 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 <esr@thyrsus.com>. 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 <bwarken@mayn.de>. 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 (or $MANPAGER, depending on
+ the used `man' program); 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 is installed now, 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 <punctuation>' now works as expected; `.Nm "" <punctuation>'
+ 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 <string>': interpret <string> 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. [2018 UPDATE: This address no longer accepts bug
+ reports; please use the GNU Savannah bug tracker at
+ http://savannah.gnu.org/bugs/?group=groff.]
+
+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 makes 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 uses 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/<version> 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 name of the 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 <haible@clisp.cons.org> 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 is 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
+<pandres@dragonet.es>.
+
+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
+<daniel@synchrods.com> and Werner Lemberg <wl@gnu.org>.
+
+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 is now 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
+<blake@florida-software.com>.
+
+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
+development 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
+<sgk@debian.org>.
+
+A (still incomplete) groff reference manual in texinfo format originally
+contributed by Trent A. Fisher <trent@gnurd.portland.or.us>.
+
+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
+<eggert@twinsun.com>).
+
+Following the GNU standards, groff now uses 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 <gaius@glam.ac.uk>. 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
+<jeff@opennt.com>.
+
+Soelim
+------
+
+Added -I option for defining include paths (patch contributed by Peter
+Miller <peterm@jna.com.au>).
+
+Gxditview
+---------
+
+Fallback resources added (patch contributed by Larry Jones
+<larry.jones@sdrc.com>).
+
+Will now support 8 gray levels.
+
+mm
+--
+
+New version 1.32 (contributed by Joergen Haegg <jh@axis.com>).
+
+
+VERSION 1.11
+============
+
+Complete documentation for pic is now in the file doc/pic.ms. It was
+contributed by Eric S. Raymond, <esr@thyrsus.com>, 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 now produces a character that has the traditional metrics, and form
+corners with \(ul and \(br. This means that it does 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] interpolates 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' (similarly 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 valid 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 causes 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 generates 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 the
+BSD -me macros and a low resolution device is not being used, then an
+appropriate value for the $v or $V register is 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, \*[ is only 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 ...' are 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 produces 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 uses 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
+interpolation depth 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 runs 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' scaling 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 is 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 now passes pic the -x flag; this enables 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 passes 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 is not 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 is not 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' is 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 valid 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 now arranges 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
+are 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.
+
+
+##### Editor settings
+Local Variables:
+coding: latin-1
+fill-column: 72
+mode: text
+version-control: never
+End:
+# vim: set autoindent textwidth=72:
diff --git a/PROBLEMS b/PROBLEMS
new file mode 100644
index 0000000..c40d499
--- /dev/null
+++ b/PROBLEMS
@@ -0,0 +1,1321 @@
+ Copyright 1989-2023 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+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.
+
+----------------------------------------------------------------------
+
+Problems are organized into categories underscored with equals signs.
+
+* General Problems
+* Printing and Display Problems
+* Platform-Dependent Macro Problems
+* Compilation Problems
+
+Within each category, items are organized in reverse chronological order
+(that is, with the most recent first). groff version numbers
+corresponding to their inclusion in this file are included as
+guideposts. Entries have been revised for clarity in the years since.
+
+In the following discussions, several references to "/usr/local" are
+made. You should read this directory name as the destination directory
+you set up with the "--prefix" option to groff's "configure" script.
+
+
+General Problems
+================
+
+
+[groff 1.23.0]
+
+* gdiffmk doesn't work / its automated test fails.
+
+Some portability issues are known to affect groff's gdiffmk utility.
+
+- A defect in GNU diffutils 3.9 (January 2023) causes gdiffmk to
+ malfunction and its automated test to fail. See
+ <https://debbugs.gnu.org/db/61/61193.html>.
+
+- gdiffmk does not work with BusyBox diff (which does not implement GNU
+ diff's "-D" option).
+
+- gdiffmk does not work on FreeBSD due to specifics of that platform's
+ expr(1) implementation.
+
+ gdiffmk uses the expr(1) command to parse its arguments. FreeBSD has
+ extended the syntax of its expr command in a non-backward compatible
+ way that it claims better conforms with POSIX's utility syntax
+ guidelines with respect to option processing: however, POSIX mandates
+ no options for expr. Other implementations of expr do not support
+ traditional Unix-style options ('-a', '-b', ...), and perhaps as a
+ consequence do not follow FreeBSD's interpretation of the guidelines.
+ You way want to set $EXPR_COMPAT in your shell environment. We hope
+ to have a workaround for this behavior in a future release.
+
+----------------------------------------------------------------------
+
+* The `PDFPIC` macro doesn't work / its automated test fails.
+
+ FAIL: tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh
+
+Due to a limitation (shared by AT&T troff) in the way the `sy` request
+constructs a C string argument to the C library's system(3) function,
+groff requires a GNU sed(1) extension that interprets "\n" as a newline
+in the replacement text of the 's' command. (We might enhance GNU
+troff's `sy` request to avoid this dependency in the future.) We have
+observed this problem on Solaris 10 and 11 and Mac OS X 10.11.6, but not
+macOS 12: the last's sed supports the extension in question.
+
+Install GNU sed in the default $PATH as "gsed" and edit
+tmac/pdfpic.tmac. On line 172, change "sed" to "gsed". Alternatively,
+you can use the absolute path to GNU sed's location. (`system()`
+sanitizes $PATH to avoid privilege escalation.) Then (re-)make the
+"check" target or format your PDFPIC-employing document again.
+
+----------------------------------------------------------------------
+
+[groff 1.19.2]
+
+* When viewing man pages, some characters on my UTF-8 terminal emulator
+ look funny or copy-and-paste wrong. Why?
+
+Some Unicode Basic Latin ("ASCII") input characters are mapped to
+non-Basic Latin code points in output for consistency with other output
+devices, like PDF. See groff_man_style(7) and groff_char(7) for correct
+input conventions and background. If you use the correct groff special
+character escape sequences to input them, you will get correct output no
+matter what device the input is formatted for.
+
+However, many man pages are written in ignorance of the correct special
+characters to obtain the desired glyphs. You can conceal these errors
+by adding the following to your site-local man(7) configuration. The
+file is called "man.local"; its installation directory depends on how
+groff was configured when it was built.
+
+--- start ---
+.if '\*[.T]'utf8' \{\
+. char ' \[aq]
+. char - \-
+. char ^ \[ha]
+. char ` \[ga]
+. char ~ \[ti]
+.\}
+--- end ---
+
+You may also wish to do the same for "mdoc.local".
+
+In man pages (only), groff maps the minus sign special character '\-' to
+the Basic Latin hyphen-minus (U+002D) because man pages require this
+glyph and there is no historically established *roff input character,
+ordinary or special, for obtaining it when a hyphen and minus sign are
+both separately available. To obtain a true minus sign, use the special
+character escape sequences '\(mi' or '\[mi]'.
+
+----------------------------------------------------------------------
+
+* Displaying a man page on a terminal with/without my favorite pager
+ shows garbage.
+
+groff's terminal output driver, grotty, by default uses ISO 6429/ECMA-48
+escape sequences understood by video terminals and their emulators,
+rather than the overstriking sequences implemented for typewriter-like
+terminals used in the 1960s and 1970s. These escape sequences control
+display attributes like bold and italic or oblique typefaces,
+underlining, foreground and background color selection, and hyperlink
+marking. Terminal emulators that claim compatibility with the DEC
+VT100, Linux console driver, or xterm should ignore well-formed escape
+sequences that they are not able to support, but some implementations
+are buggy.
+
+Furthermore, the popular "less" pager by default assumes that its input
+will use overstriking sequences. (This is a surprising choice, as users
+of paper terminals had no need for pager programs; to "scroll back", the
+operator would simply physically pull up the spool of ejected paper to
+read it.) less(1) must instead be given the '-R' option to interpret
+escape sequences used by video terminals. Be aware that the
+overstriking convention is inescapably ambiguous in some output
+sequences. See the grotty(1) man page.
+
+Hyperlink support in terminal emulators is a relatively new initiative
+(as of 2022) employing a sequence known as "OSC 8".
+ https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda
+
+Due to the feature's young age, the man and mdoc macro packages have a
+configuration switch for hyperlink support, and it may be disabled in
+your site's man.local and mdoc.local files. Use a command like
+ printf '\033]8;;man:grotty(1)\033\\grotty(1)\033]8;;\033\\\n' | more
+to check your terminal and pager for OSC 8 support. If you see
+"grotty(1)" and no additional garbage characters, then you may wish to
+edit those site files to remove any lines that disable this feature.
+
+There are a couple of workarounds if you prefer or require overstriking
+sequences rather than ISO 6429/ECMA-48 escape sequences.
+
+ 1. Set the GROFF_NO_SGR environment variable to any value.
+
+ 2. Pass option '-c' to grotty (that is, add '-P-c' to groff's
+ command-line options).
+
+The third and probably best option is to use terminal and pager programs
+that handle standardized video terminal escape sequences well.
+
+----------------------------------------------------------------------
+
+[groff 1.16]
+
+* 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, the Bell Labs document "Troff User's
+Manual" (Computing Science Technical Report #54) incorrectly claims that
+yr is the last two digits of the year. This claim has never been true
+AT&T troff nor 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 1.09]
+
+* Where can I get grap?
+
+Ted Faber <faber@lunabase.org> has written a freely available grap:
+
+ http://www.lunabase.org/~faber/Vault/software/grap/
+
+You need version 1.42 or newer.
+
+----------------------------------------------------------------------
+
+* 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 don't give the height and depth of the argument to \w,
+but the maximum vertical displacements of the text baseline above
+(\n(st) and below (\n(sb) its original position. Consider an example
+where no text is formatted, but small vertical motions are used.
+
+ \w"\v'-1u'\v'3u'"
+ .tm st=\n(st, sb=\n(sb
+ st=1, sb=-2
+
+Observe that the sign convention of these registers is opposite that of
+relative vertical motion. (This is how Documenter's Workbench troff
+and Heirloom Doctools troff work as well.)
+
+The height and depth of formatted text in the \w argument are available
+in the \n[rst] and \n[rsb] registers; these are groff extensions.
+
+----------------------------------------------------------------------
+
+[groff 1.08]
+
+* 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 .= <IN> if $line1 =~ /eval/;
+ $line1 .= <IN> if $line1 =~ /argv/;
+ $line2 = <IN>;
+! next if $line2 eq "'di';\n";
+
+ # Pull the old switcheroo.
+
+--- 35,41 ----
+ $line1 .= <IN> if $line1 =~ /eval/;
+ $line1 .= <IN> if $line1 =~ /argv/;
+ $line2 = <IN>;
+! next if $line2 eq "'di ';\n" || $line2 eq "'di';\n";
+
+ # Pull the old switcheroo.
+
+***************
+*** 49,56 ****
+
+ print OUT $line1;
+ print OUT <<EOF;
+! 'di';
+! 'ig00';
+ #
+ # $header
+ #
+--- 49,58 ----
+
+ print OUT $line1;
+ print OUT <<EOF;
+! 'di ';
+! 'ds 00 \\"';
+! 'eo ';
+! 'ig 00 ';
+ #
+ # $header
+ #
+***************
+*** 72,85 ****
+
+ # These next few lines are legal in both Perl and nroff.
+
+! $null.00; # finish .ig
+
+ 'di \\" finish diversion--previous line must be blank
+ .nr nl 0-1 \\" fake up transition to first page again
+ .nr % 0 \\" start at page 1
+! '; __END__ ##### From here on it's a standard manual page #####
+ .TH $PROG 1 "$month $mday, 19$year"
+- .AT 3
+ .SH NAME
+ $prog \\- whatever
+ .SH SYNOPSIS
+--- 74,87 ----
+
+ # These next few lines are legal in both Perl and nroff.
+
+! $null.00 ; # finish .ig
+! 'ec \\';
+
+ 'di \\" finish diversion--previous line must be blank
+ .nr nl 0-1 \\" fake up transition to first page again
+ .nr % 0 \\" start at page 1
+! .\\"'; __END__ ##### From here on it's a standard manual page #####
+ .TH $PROG 1 "$month $mday, 19$year"
+ .SH NAME
+ $prog \\- whatever
+ .SH SYNOPSIS
+
+----------------------------------------------------------------------
+
+[groff 1.07]
+
+* groff uses up an enormous amount of memory processing large files.
+ I'm using 386BSD 0.1.
+
+386BSD includes an old version of g++, 1.39, which has a bug that
+causes a major memory leak in gtroff. Apply the following fix to g++
+and recompile groff:
+
+*** cplus-decl.c.~1~ Mon Aug 6 05:28:59 1990
+--- cplus-decl.c Wed Jun 5 08:55:04 1991
+***************
+*** 7951,7961 ****
+
+ /* At the end, call delete if that's what's requested. */
+ if (TREE_GETS_DELETE (current_class_type))
+ exprstmt = build_method_call (build1 (NOP_EXPR, TYPE_POINTER_TO (current_class_type), error_mark_node),
+ get_identifier (OPERATOR_DELETE_FORMAT),
+! build_tree_list (NULL_TREE, integer_zero_node),
+ NULL_TREE, LOOKUP_NORMAL);
+ else if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
+ exprstmt = build_x_delete (ptr_type_node, current_class_decl, 0);
+ else
+ exprstmt = 0;
+--- 7951,7961 ----
+
+ /* At the end, call delete if that's what's requested. */
+ if (TREE_GETS_DELETE (current_class_type))
+ exprstmt = build_method_call (build1 (NOP_EXPR, TYPE_POINTER_TO (current_class_type), error_mark_node),
+ get_identifier (OPERATOR_DELETE_FORMAT),
+! build_tree_list (NULL_TREE, current_class_decl),
+ NULL_TREE, LOOKUP_NORMAL);
+ else if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
+ exprstmt = build_x_delete (ptr_type_node, current_class_decl, 0);
+ else
+ exprstmt = 0;
+
+----------------------------------------------------------------------
+
+[groff 1.06]
+
+* 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 attempts to edit a file of macros so that it can be used with
+groff without the -C flag.
+
+----------------------------------------------------------------------
+
+* 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 takes a *long* time on slow
+computers.)
+
+----------------------------------------------------------------------
+
+[groff 1.01]
+
+* gpic 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.
+
+----------------------------------------------------------------------
+
+* Groff doesn't use the font names I'm used to.
+
+Use the `ftr' request. See groff_diff(7).
+
+----------------------------------------------------------------------
+
+* I get errors using the Unix -ms macros with groff -e -C.
+
+Apply this change. Be careful of copying and pasting it; literal BEL
+characters (Control+G) appear in the source--this is an AT&T troff idiom
+in output comparisons that is never necessary in GNU troff.
+
+*** /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
+
+----------------------------------------------------------------------
+
+* 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 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.
+
+----------------------------------------------------------------------
+
+* 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) does NOT restore the previous point-size;
+instead it is 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 need to put
+modified macros from tmac/an.tmac into man.local. More information is
+available in groff_man(7).
+
+----------------------------------------------------------------------
+
+* While formatting a manual page, groff complains about not being able
+ to break lines. A line like the following seems to cause this.
+ .TP \w'label'+2
+
+The groff_man(7) man page says that the default scaling unit for the
+`TP` macro is 'n' (ens), and that is how the groff man macros are
+implemented. Consequently, the macro argument above is evaluated
+equivalently to this expression.
+
+ \w'label'n+2n
+
+AT&T troff's man macros don't implement this correctly (probably because
+it's hard to do in that troff); instead, they append 'n' to the entire
+argument, so that it is evaluated as if it were written as follows.
+
+ \w'label'u+2n
+
+The solution is to fix the manual page.
+
+ .TP \w'label'u+2
+
+It might be better still to avoid such computations in macro arguments,
+however; programs that are not *roff formatters that attempt to
+interpret man pages can lack the ability to interpret numeric
+expressions. See section "Portability" of groff_man_style(7).
+
+
+
+Printing and Display Problems
+=============================
+
+
+
+[groff 1.09]
+
+* 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.
+
+----------------------------------------------------------------------
+
+[groff 1.04]
+
+* 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 `--appdefdir=<DIR>' argument to groff's configure
+script.
+
+See the X(7) man page for information how and where application
+defaults files have to be located. Look for the XAPPLRESDIR and
+XUSERFILESEARCHPATH environment variables.
+
+----------------------------------------------------------------------
+
+[groff 1.01]
+
+* I'm having problems including PostScript illustrations (EPS) using
+ the PSPIC macro and/or \X'ps: import ...'.
+
+A PostScript document must meet three requirements in order to be
+included with the PSPIC macro: it must comply with the Adobe Document
+Structuring Conventions; it must contain a BoundingBox line; it must
+be `well-behaved'. The BoundingBox line should be of the form:
+
+ %%BoundingBox: llx lly urx ury
+
+where llx, lly, urx, ury are the coordinates of the lower left x,
+lower left y, upper right x, upper right y of the bounding box of
+marks on the page expressed as integers in the default PostScript
+coordinate system (72 units per inch, origin at bottom left corner).
+
+The most convenient program to get the bounding box of a document is
+the `ps2epsi' script coming with GhostScript.
+
+If you can't use this program, another useful tactic is to print out
+the illustration by itself (you may need to add a `showpage' at the
+end), and physically measure the bounding box. For more detail on
+these requirements, read the specification of Encapsulated PostScript
+format. (This is available from the Adobe file server; send a message
+with a body of `help' to ps-file-server@adobe.com.)
+
+If an EPS file to be included via \X'ps: import' does not start with
+`%!PS-Adobe-...', gtroff still includes the file, but grops does not
+add any fonts to the generated output file that are listed in the EPS
+file, even though the files are listed in the `download' file and are
+available in the devps directory.
+
+----------------------------------------------------------------------
+
+* I've configured groff for A4 paper, but gtroff still seems to think
+ that the length of a page (as returned by `\n(.p') is 11 inches.
+
+This is intentional. The PAGE option during configuration is used
+only by grops. For compatibility with AT&T troff, the default page
+length in GNU troff is always 11 inches. The page length can be changed
+with the `pl' request.
+
+A convenient way to set paper dimensions is to use the -dpaper option
+of groff, together with proper -P options for the postprocessor
+(overriding the default). For example, use the following command for
+PostScript output on A4 paper in landscape orientation.
+
+ groff -Tps -dpaper=a4l -P-pa4 -P-l -ms foo.ms > foo.ps
+
+See groff(1) and 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 format is "letter". See groff_tmac(5).
+
+----------------------------------------------------------------------
+
+* 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. You can also press <space> and <backspace> to advance and
+retreat the current page view, respectively.
+
+----------------------------------------------------------------------
+
+* 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.
+
+----------------------------------------------------------------------
+
+* 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'.
+
+
+
+Platform-Dependent Macro Problems
+=================================
+
+
+
+[groff 1.17]
+
+* 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' uses groff's `ms'
+macros.
+
+----------------------------------------------------------------------
+
+[groff 1.09]
+
+* On an SGI system, how can I make the man command use groff?
+
+From David Hinds <dhinds@allegro.stanford.edu> (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
+
+----------------------------------------------------------------------
+
+[groff 1.08]
+
+* 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.
+
+----------------------------------------------------------------------
+
+[groff 1.07]
+
+* 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. [To be fair, SunOS did too, albeit not as many; see
+groff_man(7). groff embraced SunOS's extensions early on, but not
+Ultrix's. --GBR in 2023] 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.
+
+----------------------------------------------------------------------
+
+[groff 1.01]
+
+* I get lots of errors when I use groff with the AT&T -mm macros.
+
+Use the groff -mm macros.
+
+
+
+Compilation Problems
+====================
+
+
+
+[groff 1.23.0]
+
+* The "initialization_is_quiet" test fails on my NetBSD box.
+
+This is a known problem. We haven't tracked down the cause yet, but
+have improved the reporting of the test output in hopes that we can
+isolate it in a future release.
+
+----------------------------------------------------------------------
+
+* I get a build failure on Cygwin / a system using newlib and GCC 11.
+
+"newlib" defines a function called "utoa" which conflicts with a static
+(file scope-local) function in src/libs/libxutil/XFontName.c.
+
+We expect to fix this in the near future; in the meantime, you can patch
+the file to rename the function (and update its call sites) or, if you
+don't require the "gxditview" output previewer or "xtotroff" utility,
+you can build groff without X11 support.
+
+ $ make distclean
+ $ ./configure --without-x
+
+----------------------------------------------------------------------
+
+* The "check-default-foundry" test fails when I run "make check".
+
+Your Ghostscript installation may have its fonts embedded in the
+executable; this can be discerned by searching for the pattern "%rom%"
+in its search path.
+
+ $ gs -h | grep '%rom%'
+
+The consequence is that gropdf(1) will be unable to embed fonts into PDF
+files it generates (apart from groff's "EURO" font) when the default
+foundry is used. This is the same outcome as if Ghostscript were not
+installed at all. If you install URW fonts (see "INSTALL.extra"), you
+will be able to embed them all by using the "U" foundry with gropdf to
+overcome this problem.
+
+----------------------------------------------------------------------
+
+* I get a lot of warnings about "sprintf" on macOS.
+
+Apple has decided to treat the sprintf() standard C library function as
+deprecated even though the C standard itself has not.
+
+https://developer.apple.com/forums/thread/714675
+
+----------------------------------------------------------------------
+
+* I get a make(1) failure involving grep and the groff_man.7.man.in file
+ on Solaris 11.
+
+Solaris make(1) has a bug easily exhibited by the following Makefile.
+
+all:
+ ! false
+
+Use GNU make instead; it may be available in /opt/csw/bin/gmake.
+
+----------------------------------------------------------------------
+
+* Tests fail when I run "make check" on Solaris 10 or 11.
+
+The test suite expects a POSIX-conforming shell and utilities. Solaris
+10 does not offer these in the default $PATH. We try to use features
+standardized no later than POSIX Issue 4 (1994). Unfortunately even
+that is too recent for some implementations. Solaris 11 has a (mostly)
+conforming shell. It may help to ensure that "/usr/xpg6/bin" and
+"/usr/xpg4/bin" precede "/usr/bin" in the $PATH when building groff.
+
+For Solaris 10, it is necessary to modify the shell-based test scripts
+in place to use a conforming shell. Here is an example.
+
+ $ gsed -i -e '1s@#!/bin/sh@#!/usr/xpg4/bin/sh@' \
+ `find . -name '*.sh' | grep /tests/`
+ $ PATH=/usr/xpg4/bin:$PATH gmake check
+
+Some test failures remain expected on Solaris 10 and/or 11.
+
+1. FAIL: contrib/hdtbl/examples/test-hdtbl.sh
+
+ /usr/bin/tr on Solaris 10 is non-conforming with the POSIX Issue 4
+ standard. It furthermore issues anonymous diagnostics, saying only
+ "Bad string".
+
+ Install tr from GNU coreutils in the $PATH. Edit line 57 of each of
+ contrib/hdtbl/examples/fonts_x.in and
+ contrib/hdtbl/examples/fonts_n.in. Change "tr" to "gtr".
+ Alternatively, you can use the absolute path to GNU tr's location.
+ Re-run "gmake check" as above. (Some files will be rebuilt.)
+
+ The tr commands in /usr/xpg4/bin and /usr/xpg6/bin also work, but
+ the documents constructed from the above inputs use groff's `pso`
+ request, which wraps the standard C library `popen()` function,
+ which sanitizes $PATH to avoid privilege escalation, thus making it
+ likely that the non-conforming tr in /usr/bin will be found first.
+
+2. FAIL: src/roff/groff/tests/initialization_is_quiet.sh
+ FAIL: src/roff/groff/tests/msoquiet_works.sh
+ FAIL: src/roff/groff/tests/soquiet_works.sh
+
+ (The first of these might be SKIPped instead.)
+
+ /usr/xpg4/bin/sh is non-conforming with the POSIX Issue 4 standard,
+ despite its name. Its "unset" builtin is buggy. (The /usr/bin/sh
+ in Solaris 11 does not have this problem.)
+
+ These tests use the "unset" shell builtin command to prevent
+ environment variables from confounding test results.
+
+ POSIX says "[u]nsetting a variable ... that was not previously set
+ is not considered an error and will not cause the shell to abort."
+
+ Nevertheless this builtin returns an error exit status in this
+ circumstance.
+
+ $ /usr/xpg4/bin/sh -c 'unset _NON_EXISTENT_XYZ; echo $?'
+ 1
+
+ You may disregard these failures, edit the test scripts to append
+ "|| true" to the "unset" commands, or change the scripts to use GNU
+ Bash or some other POSIX-conforming shell as illustrated above.
+
+----------------------------------------------------------------------
+
+* I get warnings from afmtodit about names already being mapped.
+
+afmtodit: AGL name 'Delta' already mapped to groff name '*D'; ignoring AGL name 'uni0394'
+
+You can ignore these if they're in the form shown above, where the
+ignored AGL name is 'uniXXXX' and 'XXXX' is four hexadecimal digits.
+The Adobe Glyph List (AGL) has its own names for glyphs; they are often
+different from groff's special character names. The afmtodit program is
+constructing a mapping from groff special character names to AGL names;
+this can be a one-to-one or many-to-one mapping, but one-to-many will
+not work, so afmtodit discards the excessive mappings. The example you
+see above is telling you that the groff font description that afmtodit
+is writing cannot map the groff special character '*D' to both 'Delta'
+and 'uni0394'.
+
+Which, if any, such warnings you see depends on the version of the URW
+fonts you are building groff against. See the '--with-urw-fonts-dir'
+option to the "configure" script, and the afmtodit(1) and groff_char(7)
+man pages for more background.
+
+----------------------------------------------------------------------
+
+* I am building from the Git repository, using 'autoreconf' from a GNU
+ Autoconf release earlier than 2.69, and I get this.
+
+ /usr/share/aclocal/gtkglextmm-1.2.m4:225:
+ warning: underquoted definition of AC_GTKGLEXTMM_SUPPORTS_MULTIHEAD
+ /usr/share/aclocal/gtkglextmm-1.2.m4:225:
+ run info '(automake)Extending aclocal'
+ /usr/share/aclocal/gtkglextmm-1.2.m4:225:
+ or see http://www.gnu.org/software/automake/manual/automake.html#Extending-aclocal
+
+Ignore this. It doesn't occur in more recent versions of 'autoreconf'.
+
+----------------------------------------------------------------------
+
+* I get warnings about special characters in the groff_char(7) man page.
+
+troff:man/groff_char.7:1033: warning: special character '.j' not defined
+
+ (...and similar for 'vA', 'bs', '-+', 'coproduct', and '+e'.)
+
+You can ignore these. groff defines a handful of special characters for
+which historical PostScript fonts usually did not possess glyphs.
+Except for 'bs' (the Bell System logo), we hope to provide fallbacks or
+a supplementary PostScript font in groff in the future (as was done for
+the Euro glyph).
+
+----------------------------------------------------------------------
+
+* I get warnings about the "vasnprintf" function.
+
+lib/vasnprintf.c: In function 'vasnprintf':
+lib/vasnprintf.c:5268:27: warning: format not a string literal, argument types not checked [-Wformat-nonliteral]
+(and similar)
+
+The groff source tree includes gnulib, the GNU portability library
+<https://www.gnu.org/software/gnulib/>. These warnings are about its
+source code and that project's responsibility to resolve. We expect a
+future release of gnulib to do so.
+
+----------------------------------------------------------------------
+
+[groff 1.22.4]
+
+* When compiling on NetBSD, make issues warnings like
+
+ Warning: line 28: Unable to locate font(s)
+ URWGothicL-Demi,a010015l.pfb on the given path(s)
+
+ and
+
+ Warning: line 77: Failed to create groff font 'U-AB' by running
+ afmtodit
+
+In this case install the package "urw-fonts":
+
+ pkgin install urw-fonts
+
+and make the font path known to ghostscript, e.g. with (ksh):
+
+ export GS_LIB=/usr/pkg/share/fonts/urw
+
+----------------------------------------------------------------------
+
+* Currently (December 2015) building groff fails on NetBSD and
+ FreeBSD with the message:
+
+ make[1]: don't know how to make contrib/chem/chem.1. Stop
+
+The reason is a bug in the make(1) tool used on those systems related
+to .SUFFIXES lines.
+
+A temporary workaround is to change the Makefile line
+
+ .SUFFIXES: .roff .in .ps .mom .pdf .me .ms .ps .html .txt .texi \
+ .dvi .pdf .xhtml .man .c .cpp .log .o .obj .sed .sin \
+ .test .test$(EXEEXT) .trs .ypp
+
+into
+
+ .SUFFIXES: .man .roff .in .ps .mom .pdf .me .ms .ps .html .txt \
+ .texi .dvi .pdf .xhtml .c .cpp .log .o .obj .sed .sin \
+ .test .test$(EXEEXT) .trs .ypp
+
+(put .man at begin of the list).
+
+The bug is reported to the maintainer of the make(1) tool of those
+systems.
+
+----------------------------------------------------------------------
+
+[groff 1.22.3]
+
+* Configuration on MacOS X 10.6 doesn't succeed.
+
+Use
+
+ ./configure CXX=g++-4.2
+
+----------------------------------------------------------------------
+
+[groff 1.21]
+
+* In MacOS X, I want to completely replace the groff that came with
+ the system.
+
+Use
+
+ ./configure --prefix=/usr --mandir=/usr/share/man
+
+then
+
+ make
+ make install
+
+Note that subsequent system updates may replace your groff.
+
+----------------------------------------------------------------------
+
+[groff 1.19.2]
+
+* 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).
+
+----------------------------------------------------------------------
+
+[groff 1.19]
+
+* When compiling on MacOS X 10.2, 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.
+
+----------------------------------------------------------------------
+
+[groff 1.18.0]
+
+* 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.
+
+----------------------------------------------------------------------
+
+[groff 1.17]
+
+* On HP-UX, the compiler complains about missing symbol `alloca'.
+
+Say
+
+ export LDFLAGS=-lPW
+
+before starting the configure script.
+
+----------------------------------------------------------------------
+
+[groff 1.16.1]
+
+* 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 <http://www.gnu.org/software/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.
+
+----------------------------------------------------------------------
+
+* There are many empty `Makefile.dep' files. Is this a bug?
+
+No. Real dependency files are created with a `make depend' call.
+
+----------------------------------------------------------------------
+
+[groff 1.16]
+
+* 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 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 effectively bypasses 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
+
+----------------------------------------------------------------------
+
+[groff 1.15]
+
+* 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.
+
+----------------------------------------------------------------------
+
+[groff 1.08]
+
+* 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.
+
+----------------------------------------------------------------------
+
+[groff 1.07]
+
+* I get errors when I try to compile groff with DEC C++.
+
+Fix the declaration of write() in <unistd.h> so that the second
+argument is a const char *. Fix the declaration of open() in
+<sys/file.h> so that the first argument is a const char *.
+
+----------------------------------------------------------------------
+
+* On Ultrix, the make program stops with the message
+
+ *** Error code 1
+
+ Stop.
+
+ for no apparent reason.
+
+Use GNU make.
+
+----------------------------------------------------------------------
+
+[groff 1.01]
+
+* 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:
+<string.h> must declare the mem* functions, (just add `#include
+<memory.h>' to <string.h>); 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 <alloca.h>, the declaration `extern "C" { void
+*__builtin_alloca(int); }' should be added; in <sys/signal.h> 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.
+
+
+
+##### Editor settings
+Local Variables:
+fill-column: 72
+mode: text
+End:
+vim: set autoindent textwidth=72:
diff --git a/PROJECTS b/PROJECTS
new file mode 100644
index 0000000..533759e
--- /dev/null
+++ b/PROJECTS
@@ -0,0 +1,52 @@
+# Copyright (C) 1999-2020 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 of the License, 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 this program. If not, see
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+Here are some things that would be useful additions to groff:
+
+ ideal preprocessor - Bernd Warken <groff-bernd.warken-72@web.de> I
+ started the programming of `ideal' language and `gideal'
+ preprocessor, which will eventually be added to the groff
+ distribution.
+
+ refer: `refer' database directory under /usr/local/share.
+ There maybe create a default database `Ind' or others for
+ storing books and documents for `groff' man pages.
+ Write the following `groff' programs from Heirloom and
+ `refer' history:
+ - addbib
+ - roffbib
+ - sortbib
+
+ -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 groff@gnu.org) to see if anyone else
+has gotten there first.
+
+
+##### Editor settings
+Local Variables:
+fill-column: 72
+mode: text
+End:
+vim: set filetype= textwidth=72:
diff --git a/README b/README
new file mode 100644
index 0000000..41036e2
--- /dev/null
+++ b/README
@@ -0,0 +1,130 @@
+ Copyright (C) 1989-2023 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without
+ modification, are permitted in any medium without royalty provided
+ the copyright notice and this notice are preserved.
+
+This is the 'groff' document formatting system, a reimplementation and
+extension of the AT&T Unix 'troff' system. The version number is given
+in the file '.tarball-version' if you are building from a distribution
+archive; otherwise, building from its Git repository will store it in
+the file '.version'.
+
+This release includes original implementations (not derived from AT&T
+Unix code) of the 'troff', 'nroff', 'pic', 'eqn', 'tbl', 'refer', and
+'soelim' programs; the 'man' and 'ms' macro packages; and output drivers
+for PostScript, PDF, and TeX DVI file formats, HP LaserJet 4- and Canon
+CaPSL-compatible printers, HTML and XHTML (in beta status), and
+typewriter/terminal devices.
+
+It also provides modified versions of BSD Unix additions to Unix troff:
+the 'grn' preprocessor, and the 'mdoc' and 'me' macro packages.
+'gxditview', an enhanced version of the X11 'xditview' previewer for
+'troff' device-independent output, originates from X11R5.
+
+Contributed components feature a reimplementation and extension of the
+DWB 'troff' 'mm' macro package by Joergen Haegg, Peter Schaffter's 'mom'
+macro package, and Bernd Warken's reimplementation of the 'chem'
+preprocessor in Perl.
+
+See the file 'INSTALL.extra' for instructions on how to install from a
+distribution archive, such as a release, beta, or release candidate.
+
+The file 'INSTALL.REPO' contains supplementary instructions for building
+directly from a clone of the Git repository.
+
+The file 'NEWS' contains a history of user-visible changes to 'groff'.
+
+'groff' is free software. See the file 'COPYING' for copying
+permissions, and 'LICENSES' for further detail.
+
+The file 'PROBLEMS' describes various issues that users have encountered
+in compiling, installing, and running 'groff'.
+
+The file 'MORE.STUFF' describes some third-party programming and
+documentary resources useful with 'groff'.
+
+Current and historical releases of 'groff' are available via HTTPS and
+anonymous FTP from the host 'ftp.gnu.org' in the directory 'gnu/groff'.
+
+'groff' has a home page at the GNU Project.
+
+https://www.gnu.org/software/groff/
+
+Administration of the project is done through GNU Savannah.
+
+ https://savannah.gnu.org/git/?group=groff
+
+'groff' is developed at its Git repository, which has a web interface.
+
+ https://git.savannah.gnu.org/cgit/groff.git
+
+You can view any commit in isolation, and browse the entire source tree
+corresponding to its state as of that commit. Click the summary line of
+the commit message to expose these options.
+
+Build requirements are discussed in the 'INSTALL.extra' and
+'INSTALL.REPO' files noted above. 'groff' also has runtime
+dependencies.
+
+Ghostscript is required for creation of PDF and (X)HTML output.
+Production of (X)HTML furthermore demands tools from the 'netpbm' and
+'psutils' packages.
+
+Perl is required for production of PDF output using the 'gropdf' output
+driver. (You can alternatively produce PostScript with 'grops' and
+convert that to PDF using Ghostscipt.) The 'chem', 'gperl', and
+'gpinyin' preprocessors and several utilities, such as 'grog', are also
+written in Perl.
+
+If 'groff' is configured with 'lp' or 'lpr' support, the corresponding
+program must remain available on the system for the 'groff' command's
+'-l' option to work. Similarly, build-time detection of development
+headers for the 'uchardet', 'Xaw', and 'Xmu' libraries (and their
+dependencies) assumes that their runtime counterparts will remain
+installed to support the 'groff' that is built.
+
+You can view or add to to groff's bug database via its issue tracker on
+the Savannah site (also linked from the groff home page).
+
+ http://savannah.gnu.org/bugs/?group=groff
+
+To report a problem, you may use the form in the file 'BUG-REPORT'; its
+purpose 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, please report it so we can determine
+whether it is a software defect, or an omission from our documentation.
+
+If you'd like to modify 'groff' or participate in its development, files
+'HACKING' and 'MANIFEST' will familiarize you with the structure of the
+code and the project's conventions for maintaining it.
+
+Three mailing lists are available.
+
+ bug-groff@gnu.org a read-only list for following bug reports
+ groff@gnu.org for general discussion of groff
+ groff-commit@gnu.org a read-only list for following commits
+ to the Git repository
+
+To subscribe, send a mail to <list>-request@<domain> (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, subscribe via our web pages by completing an HTML form.
+
+ https://lists.gnu.org/mailman/listinfo/bug-groff
+ https://lists.gnu.org/mailman/listinfo/groff
+ https://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.
+
+'groff' was primarily written by James Clark <jjc@jclark.com>.
+
+
+##### Editor settings
+Local Variables:
+fill-column: 72
+mode: text
+End:
+vim: set textwidth=72:
diff --git a/README.MinGW b/README.MinGW
new file mode 100644
index 0000000..412597a
--- /dev/null
+++ b/README.MinGW
@@ -0,0 +1,326 @@
+ Copyright (C) 2003-2020 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+ 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
+ (and XHTML) output capability, some additional tools are required as
+ described in the section PREREQUISITES FOR HTML OUTPUT later in this
+ file.
+
+
+ BUILDING GROFF WITH MINGW
+ -------------------------
+
+ *** WARNING ***
+
+ Before commencing this procedure, you should ensure that you are
+ running the MSYS shell in a *native* Win32 console window, and not in
+ any window managed by the rxvt emulator provided with MSYS; (this
+ emulator suffers from various known defects, which will prevent
+ successful completion of a groff build).
+
+ ******
+
+ 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 <download-path>/groff-<version>.tar.gz
+
+ This creates a new sub-directory, groff-<version>, containing an
+ image of the groff source tree. You should now change directory,
+ to make this ./groff-<version> your working directory.
+
+ 3. If you are intending to build groff with support for HTML (and
+ XHTML) 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=<win32-install-path> ...
+ 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=<win32-install-path> option must be
+ specified, where <win32-install-path> 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=<win32-install-path>, 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=<win32-install-path> is not specified when groff is
+ configured, `make install' causes groff to be installed in
+ <MSYS-install-path>/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=<win32-install-path> 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=<win32-install-path> 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 <MSYS-install-path>/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=<MSYS-install-path>/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 or XHTML 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 or XHTML 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-<version>-bin.zip package:
+
+ netpbm.dll
+ pnmcrop.exe
+ pnmcut.exe
+ pnmtopng.exe
+ pnmtops.exe
+
+ 2. from the libpng-<version>-bin.zip package:
+
+ libpng.dll
+
+ 3. from the zlib-<version>-bin.zip package:
+
+ zlib-1.dll, which must be renamed to zlib.dll
+
+ 4. from the psutils-<version>-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.
+
+ Further note that you are advised to avoid the netpbm-10.27 release
+ from the GnuWin32 download repository, as its pnmtopng.exe has been
+ reported to fail on even simple conversions, resulting in failure of
+ the groff build process; the earlier netpbm-10.18.4 has been found to
+ work successfully. Also, you may find it necessary to use
+ libpng-1.2.7, rather than libpng-1.2.8, in conjunction with this
+ earlier release of netpbm.
+
+
+ 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 or -Txhtml 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 <Ctrl-Z> followed by <RETURN>, 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 <Ctrl-D> 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.
+
+
+##### Editor settings
+Local Variables:
+fill-column: 72
+mode: text
+End:
+vim: set textwidth=72:
diff --git a/THANKS b/THANKS
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/THANKS
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..188054e
--- /dev/null
+++ b/TODO
@@ -0,0 +1,41 @@
+# Copyright (C) 2000-2020 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 of the License, 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 this program. If not, see
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+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 `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/acinclude.m4 b/acinclude.m4
new file mode 100644
index 0000000..e6eb680
--- /dev/null
+++ b/acinclude.m4
@@ -0,0 +1,25 @@
+# generated automatically by aclocal 1.14 -*- Autoconf -*-
+
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_include([m4/ax_compare_version.m4])
+m4_include([m4/ax_prog_perl_version.m4])
+m4_include([m4/codeset.m4])
+m4_include([m4/fcntl-o.m4])
+m4_include([m4/glibc21.m4])
+m4_include([m4/groff.m4])
+m4_include([m4/iconv.m4])
+m4_include([m4/lib-ld.m4])
+m4_include([m4/lib-link.m4])
+m4_include([m4/lib-prefix.m4])
+m4_include([m4/localcharset.m4])
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..af8878a
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,1593 @@
+# generated automatically by aclocal 1.16.5 -*- Autoconf -*-
+
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],,
+[m4_warning([this file was generated for autoconf 2.71.
+You have another version of autoconf. It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
+
+# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
+# serial 11 (pkg-config-0.29.1)
+
+dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
+dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
+dnl
+dnl This program is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful, but
+dnl WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+dnl General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+dnl 02111-1307, USA.
+dnl
+dnl As a special exception to the GNU General Public License, if you
+dnl distribute this file as part of a program that contains a
+dnl configuration script generated by Autoconf, you may include it under
+dnl the same distribution terms that you use for the rest of that
+dnl program.
+
+dnl PKG_PREREQ(MIN-VERSION)
+dnl -----------------------
+dnl Since: 0.29
+dnl
+dnl Verify that the version of the pkg-config macros are at least
+dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's
+dnl installed version of pkg-config, this checks the developer's version
+dnl of pkg.m4 when generating configure.
+dnl
+dnl To ensure that this macro is defined, also add:
+dnl m4_ifndef([PKG_PREREQ],
+dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])])
+dnl
+dnl See the "Since" comment for each macro you use to see what version
+dnl of the macros you require.
+m4_defun([PKG_PREREQ],
+[m4_define([PKG_MACROS_VERSION], [0.29.1])
+m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
+ [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
+])dnl PKG_PREREQ
+
+dnl PKG_PROG_PKG_CONFIG([MIN-VERSION])
+dnl ----------------------------------
+dnl Since: 0.16
+dnl
+dnl Search for the pkg-config tool and set the PKG_CONFIG variable to
+dnl first found in the path. Checks that the version of pkg-config found
+dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is
+dnl used since that's the first version where most current features of
+dnl pkg-config existed.
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
+m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])
+AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])
+AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+ AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+ _pkg_min_version=m4_default([$1], [0.9.0])
+ AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ PKG_CONFIG=""
+ fi
+fi[]dnl
+])dnl PKG_PROG_PKG_CONFIG
+
+dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+dnl -------------------------------------------------------------------
+dnl Since: 0.18
+dnl
+dnl Check to see whether a particular set of modules exists. Similar to
+dnl PKG_CHECK_MODULES(), but does not set variables or print errors.
+dnl
+dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+dnl only at the first occurence in configure.ac, so if the first place
+dnl it's called might be skipped (such as if it is within an "if", you
+dnl have to call PKG_CHECK_EXISTS manually
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+ m4_default([$2], [:])
+m4_ifvaln([$3], [else
+ $3])dnl
+fi])
+
+dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+dnl ---------------------------------------------
+dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting
+dnl pkg_failed based on the result.
+m4_define([_PKG_CONFIG],
+[if test -n "$$1"; then
+ pkg_cv_[]$1="$$1"
+ elif test -n "$PKG_CONFIG"; then
+ PKG_CHECK_EXISTS([$3],
+ [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes ],
+ [pkg_failed=yes])
+ else
+ pkg_failed=untried
+fi[]dnl
+])dnl _PKG_CONFIG
+
+dnl _PKG_SHORT_ERRORS_SUPPORTED
+dnl ---------------------------
+dnl Internal check to see if pkg-config supports short errors.
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi[]dnl
+])dnl _PKG_SHORT_ERRORS_SUPPORTED
+
+
+dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+dnl [ACTION-IF-NOT-FOUND])
+dnl --------------------------------------------------------------
+dnl Since: 0.4.0
+dnl
+dnl Note that if there is a possibility the first call to
+dnl PKG_CHECK_MODULES might not happen, you should be sure to include an
+dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+ AC_MSG_RESULT([no])
+ _PKG_SHORT_ERRORS_SUPPORTED
+ if test $_pkg_short_errors_supported = yes; then
+ $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
+ else
+ $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+ m4_default([$4], [AC_MSG_ERROR(
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT])[]dnl
+ ])
+elif test $pkg_failed = untried; then
+ AC_MSG_RESULT([no])
+ m4_default([$4], [AC_MSG_FAILURE(
+[The pkg-config script could not be found or is too old. Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl
+ ])
+else
+ $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+ $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+ AC_MSG_RESULT([yes])
+ $3
+fi[]dnl
+])dnl PKG_CHECK_MODULES
+
+
+dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+dnl [ACTION-IF-NOT-FOUND])
+dnl ---------------------------------------------------------------------
+dnl Since: 0.29
+dnl
+dnl Checks for existence of MODULES and gathers its build flags with
+dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags
+dnl and VARIABLE-PREFIX_LIBS from --libs.
+dnl
+dnl Note that if there is a possibility the first call to
+dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to
+dnl include an explicit call to PKG_PROG_PKG_CONFIG in your
+dnl configure.ac.
+AC_DEFUN([PKG_CHECK_MODULES_STATIC],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+_save_PKG_CONFIG=$PKG_CONFIG
+PKG_CONFIG="$PKG_CONFIG --static"
+PKG_CHECK_MODULES($@)
+PKG_CONFIG=$_save_PKG_CONFIG[]dnl
+])dnl PKG_CHECK_MODULES_STATIC
+
+
+dnl PKG_INSTALLDIR([DIRECTORY])
+dnl -------------------------
+dnl Since: 0.27
+dnl
+dnl Substitutes the variable pkgconfigdir as the location where a module
+dnl should install pkg-config .pc files. By default the directory is
+dnl $libdir/pkgconfig, but the default can be changed by passing
+dnl DIRECTORY. The user can override through the --with-pkgconfigdir
+dnl parameter.
+AC_DEFUN([PKG_INSTALLDIR],
+[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])
+m4_pushdef([pkg_description],
+ [pkg-config installation directory @<:@]pkg_default[@:>@])
+AC_ARG_WITH([pkgconfigdir],
+ [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],,
+ [with_pkgconfigdir=]pkg_default)
+AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
+m4_popdef([pkg_default])
+m4_popdef([pkg_description])
+])dnl PKG_INSTALLDIR
+
+
+dnl PKG_NOARCH_INSTALLDIR([DIRECTORY])
+dnl --------------------------------
+dnl Since: 0.27
+dnl
+dnl Substitutes the variable noarch_pkgconfigdir as the location where a
+dnl module should install arch-independent pkg-config .pc files. By
+dnl default the directory is $datadir/pkgconfig, but the default can be
+dnl changed by passing DIRECTORY. The user can override through the
+dnl --with-noarch-pkgconfigdir parameter.
+AC_DEFUN([PKG_NOARCH_INSTALLDIR],
+[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])
+m4_pushdef([pkg_description],
+ [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@])
+AC_ARG_WITH([noarch-pkgconfigdir],
+ [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],,
+ [with_noarch_pkgconfigdir=]pkg_default)
+AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])
+m4_popdef([pkg_default])
+m4_popdef([pkg_description])
+])dnl PKG_NOARCH_INSTALLDIR
+
+
+dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
+dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+dnl -------------------------------------------
+dnl Since: 0.28
+dnl
+dnl Retrieves the value of the pkg-config variable for the given module.
+AC_DEFUN([PKG_CHECK_VAR],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
+
+_PKG_CONFIG([$1], [variable="][$3]["], [$2])
+AS_VAR_COPY([$1], [pkg_cv_][$1])
+
+AS_VAR_IF([$1], [""], [$5], [$4])dnl
+])dnl PKG_CHECK_VAR
+
+dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES,
+dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND],
+dnl [DESCRIPTION], [DEFAULT])
+dnl ------------------------------------------
+dnl
+dnl Prepare a "--with-" configure option using the lowercase
+dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and
+dnl PKG_CHECK_MODULES in a single macro.
+AC_DEFUN([PKG_WITH_MODULES],
+[
+m4_pushdef([with_arg], m4_tolower([$1]))
+
+m4_pushdef([description],
+ [m4_default([$5], [build with ]with_arg[ support])])
+
+m4_pushdef([def_arg], [m4_default([$6], [auto])])
+m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes])
+m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no])
+
+m4_case(def_arg,
+ [yes],[m4_pushdef([with_without], [--without-]with_arg)],
+ [m4_pushdef([with_without],[--with-]with_arg)])
+
+AC_ARG_WITH(with_arg,
+ AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),,
+ [AS_TR_SH([with_]with_arg)=def_arg])
+
+AS_CASE([$AS_TR_SH([with_]with_arg)],
+ [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)],
+ [auto],[PKG_CHECK_MODULES([$1],[$2],
+ [m4_n([def_action_if_found]) $3],
+ [m4_n([def_action_if_not_found]) $4])])
+
+m4_popdef([with_arg])
+m4_popdef([description])
+m4_popdef([def_arg])
+
+])dnl PKG_WITH_MODULES
+
+dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES,
+dnl [DESCRIPTION], [DEFAULT])
+dnl -----------------------------------------------
+dnl
+dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES
+dnl check._[VARIABLE-PREFIX] is exported as make variable.
+AC_DEFUN([PKG_HAVE_WITH_MODULES],
+[
+PKG_WITH_MODULES([$1],[$2],,,[$3],[$4])
+
+AM_CONDITIONAL([HAVE_][$1],
+ [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"])
+])dnl PKG_HAVE_WITH_MODULES
+
+dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES,
+dnl [DESCRIPTION], [DEFAULT])
+dnl ------------------------------------------------------
+dnl
+dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after
+dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make
+dnl and preprocessor variable.
+AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES],
+[
+PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4])
+
+AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"],
+ [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])])
+])dnl PKG_HAVE_DEFINE_WITH_MODULES
+
+# Copyright (C) 2002-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.16'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version. Point them to the right macro.
+m4_if([$1], [1.16.5], [],
+ [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too. Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.16.5])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is '.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+])
+
+# AM_COND_IF -*- Autoconf -*-
+
+# Copyright (C) 2008-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_COND_IF
+# _AM_COND_ELSE
+# _AM_COND_ENDIF
+# --------------
+# These macros are only used for tracing.
+m4_define([_AM_COND_IF])
+m4_define([_AM_COND_ELSE])
+m4_define([_AM_COND_ENDIF])
+
+# AM_COND_IF(COND, [IF-TRUE], [IF-FALSE])
+# ---------------------------------------
+# If the shell condition COND is true, execute IF-TRUE, otherwise execute
+# IF-FALSE. Allow automake to learn about conditional instantiating macros
+# (the AC_CONFIG_FOOS).
+AC_DEFUN([AM_COND_IF],
+[m4_ifndef([_AM_COND_VALUE_$1],
+ [m4_fatal([$0: no such condition "$1"])])dnl
+_AM_COND_IF([$1])dnl
+if test -z "$$1_TRUE"; then :
+ m4_n([$2])[]dnl
+m4_ifval([$3],
+[_AM_COND_ELSE([$1])dnl
+else
+ $3
+])dnl
+_AM_COND_ENDIF([$1])dnl
+fi[]dnl
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+m4_if([$1], [CC], [depcc="$CC" am_compiler_list=],
+ [$1], [CXX], [depcc="$CXX" am_compiler_list=],
+ [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+ [$1], [UPC], [depcc="$UPC" am_compiler_list=],
+ [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ am__universal=false
+ m4_case([$1], [CC],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac],
+ [CXX],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac])
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+ [--enable-dependency-tracking],
+ [do not reject slow dependency extractors])
+AS_HELP_STRING(
+ [--disable-dependency-tracking],
+ [speeds up one-time build])])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ AS_CASE([$CONFIG_FILES],
+ [*\'*], [eval set x "$CONFIG_FILES"],
+ [*], [set x $CONFIG_FILES])
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`AS_DIRNAME(["$am_mf"])`
+ am_filepart=`AS_BASENAME(["$am_mf"])`
+ AM_RUN_LOG([cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles]) || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE="gmake" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).])
+ fi
+ AS_UNSET([am_dirpart])
+ AS_UNSET([am_filepart])
+ AS_UNSET([am_mf])
+ AS_UNSET([am_rc])
+ rm -f conftest-deps.mk
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking is enabled.
+# This creates each '.Po' and '.Plo' makefile fragment that we'll need in
+# order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This macro actually does too much. Some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.65])dnl
+m4_ifdef([_$0_ALREADY_INIT],
+ [m4_fatal([$0 expanded multiple times
+]m4_defn([_$0_ALREADY_INIT]))],
+ [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[AC_DIAGNOSE([obsolete],
+ [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(
+ m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]),
+ [ok:ok],,
+ [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES([CC])],
+ [m4_define([AC_PROG_CC],
+ m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES([CXX])],
+ [m4_define([AC_PROG_CXX],
+ m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+ [_AM_DEPENDENCIES([OBJC])],
+ [m4_define([AC_PROG_OBJC],
+ m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+ [_AM_DEPENDENCIES([OBJCXX])],
+ [m4_define([AC_PROG_OBJCXX],
+ m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+# Variables for tags utilities; see am/tags.am
+if test -z "$CTAGS"; then
+ CTAGS=ctags
+fi
+AC_SUBST([CTAGS])
+if test -z "$ETAGS"; then
+ ETAGS=etags
+fi
+AC_SUBST([ETAGS])
+if test -z "$CSCOPE"; then
+ CSCOPE=cscope
+fi
+AC_SUBST([CSCOPE])
+
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+ [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+ fi
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
+
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+AC_SUBST([install_sh])])
+
+# Copyright (C) 2003-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes. -*- Autoconf -*-
+
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check whether make has an 'include' directive that can support all
+# the idioms we need for our automatic dependency tracking code.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive])
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
+ AS_CASE([$?:`cat confinc.out 2>/dev/null`],
+ ['0:this is the am__doit target'],
+ [AS_CASE([$s],
+ [BSD], [am__include='.include' am__quote='"'],
+ [am__include='include' am__quote=''])])
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+AC_MSG_RESULT([${_am_result}])
+AC_SUBST([am__include])])
+AC_SUBST([am__quote])])
+
+# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
+
+# Copyright (C) 1997-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+ [whether $CC understands -c and -o together],
+ [am_cv_prog_cc_c_o],
+ [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+ ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[[\\\"\#\$\&\'\`$am_lf]]*)
+ AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+ *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*)
+ AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+ alias in your environment])
+ fi
+ if test "$[2]" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+ [AC_MSG_CHECKING([that generated files are newer than configure])
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+
+# Copyright (C) 2009-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# ("yes" being less verbose, "no" or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+ [--enable-silent-rules],
+ [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+ [--disable-silent-rules],
+ [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+ [am_cv_make_support_nested_variables],
+ [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+ dnl Using '$V' instead of '$(V)' breaks IRIX make.
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor 'install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in "make install-strip", and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+#
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+ [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+ [m4_case([$1],
+ [ustar],
+ [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+ # There is notably a 21 bits limit for the UID and the GID. In fact,
+ # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+ # and bug#13588).
+ am_max_uid=2097151 # 2^21 - 1
+ am_max_gid=$am_max_uid
+ # The $UID and $GID variables are not portable, so we need to resort
+ # to the POSIX-mandated id(1) utility. Errors in the 'id' calls
+ # below are definitely unexpected, so allow the users to see them
+ # (that is, avoid stderr redirection).
+ am_uid=`id -u || echo unknown`
+ am_gid=`id -g || echo unknown`
+ AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+ if test $am_uid -le $am_max_uid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi
+ AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+ if test $am_gid -le $am_max_gid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi],
+
+ [pax],
+ [],
+
+ [m4_fatal([Unknown tar format])])
+
+ AC_MSG_CHECKING([how to create a $1 tar archive])
+
+ # Go ahead even if we have the value already cached. We do so because we
+ # need to set the values for the 'am__tar' and 'am__untar' variables.
+ _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+ for _am_tool in $_am_tools; do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar; do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works.
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ AM_RUN_LOG([cat conftest.dir/file])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+ done
+ rm -rf conftest.dir
+
+ AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+ AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([gnulib_m4/00gnulib.m4])
+m4_include([gnulib_m4/absolute-header.m4])
+m4_include([gnulib_m4/alloca.m4])
+m4_include([gnulib_m4/assert_h.m4])
+m4_include([gnulib_m4/errno_h.m4])
+m4_include([gnulib_m4/exponentd.m4])
+m4_include([gnulib_m4/exponentf.m4])
+m4_include([gnulib_m4/exponentl.m4])
+m4_include([gnulib_m4/extensions.m4])
+m4_include([gnulib_m4/extern-inline.m4])
+m4_include([gnulib_m4/float_h.m4])
+m4_include([gnulib_m4/fpieee.m4])
+m4_include([gnulib_m4/fprintf-posix.m4])
+m4_include([gnulib_m4/free.m4])
+m4_include([gnulib_m4/frexp.m4])
+m4_include([gnulib_m4/frexpl.m4])
+m4_include([gnulib_m4/fseterr.m4])
+m4_include([gnulib_m4/gnulib-common.m4])
+m4_include([gnulib_m4/gnulib-comp.m4])
+m4_include([gnulib_m4/include_next.m4])
+m4_include([gnulib_m4/intmax_t.m4])
+m4_include([gnulib_m4/inttypes.m4])
+m4_include([gnulib_m4/inttypes_h.m4])
+m4_include([gnulib_m4/isnand.m4])
+m4_include([gnulib_m4/isnanf.m4])
+m4_include([gnulib_m4/isnanl.m4])
+m4_include([gnulib_m4/ldexpl.m4])
+m4_include([gnulib_m4/libunistring-base.m4])
+m4_include([gnulib_m4/limits-h.m4])
+m4_include([gnulib_m4/math_h.m4])
+m4_include([gnulib_m4/memchr.m4])
+m4_include([gnulib_m4/mmap-anon.m4])
+m4_include([gnulib_m4/multiarch.m4])
+m4_include([gnulib_m4/nocrash.m4])
+m4_include([gnulib_m4/off_t.m4])
+m4_include([gnulib_m4/printf-frexp.m4])
+m4_include([gnulib_m4/printf-frexpl.m4])
+m4_include([gnulib_m4/printf.m4])
+m4_include([gnulib_m4/signbit.m4])
+m4_include([gnulib_m4/size_max.m4])
+m4_include([gnulib_m4/snprintf.m4])
+m4_include([gnulib_m4/ssize_t.m4])
+m4_include([gnulib_m4/stdbool.m4])
+m4_include([gnulib_m4/stddef_h.m4])
+m4_include([gnulib_m4/stdint.m4])
+m4_include([gnulib_m4/stdint_h.m4])
+m4_include([gnulib_m4/stdio_h.m4])
+m4_include([gnulib_m4/stdlib_h.m4])
+m4_include([gnulib_m4/string_h.m4])
+m4_include([gnulib_m4/sys_types_h.m4])
+m4_include([gnulib_m4/unistd_h.m4])
+m4_include([gnulib_m4/vasnprintf.m4])
+m4_include([gnulib_m4/vsnprintf.m4])
+m4_include([gnulib_m4/warn-on-use.m4])
+m4_include([gnulib_m4/wchar_h.m4])
+m4_include([gnulib_m4/wchar_t.m4])
+m4_include([gnulib_m4/wctype_h.m4])
+m4_include([gnulib_m4/wcwidth.m4])
+m4_include([gnulib_m4/wint_t.m4])
+m4_include([gnulib_m4/xsize.m4])
+m4_include([gnulib_m4/zzgnulib.m4])
+m4_include([acinclude.m4])
diff --git a/arch/djgpp/README b/arch/djgpp/README
new file mode 100644
index 0000000..90a5a6d
--- /dev/null
+++ b/arch/djgpp/README
@@ -0,0 +1,361 @@
+ Copyright (C) 2000-2020 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without
+ modification, are permitted in any medium without royalty provided
+ the copyright notice and this notice are preserved.
+
+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, Windows 2000, or later, 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/<version>/tmac:%DJDIR%/share/groff/site-tmac
+ GROFF_TYPESETTER=ascii
+ GROFF_FONT_PATH=%DJDIR%/share/groff/<version>/font
+
+ <version> 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/<version>/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/<version>/font whose names begin with "devX": these
+ are needed on the X Window System 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, Windows 2000, or later,
+ 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
+ <sys/socket.h> 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/<version>/font whose names begin with "devX": these
+ are used by the X Window System client 'gxditview', which is
+ not supported by this port.
+
+
+##### Editor settings
+Local Variables:
+mode: text
+fill-column: 70
+End:
+vim: set autoindent textwidth=70:
diff --git a/arch/djgpp/config.bat b/arch/djgpp/config.bat
new file mode 100644
index 0000000..ba9d1c6
--- /dev/null
+++ b/arch/djgpp/config.bat
@@ -0,0 +1,100 @@
+Rem Copyright (C) 2000-2020 Free Software Foundation, Inc.
+Rem
+Rem This configure script is free software; the Free Software Foundation
+Rem gives unlimited permission to copy, distribute and modify it.
+
+@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..72c5fb1
--- /dev/null
+++ b/arch/djgpp/config.sed
@@ -0,0 +1,21 @@
+# Copyright (C) 2000-2020 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# 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..a463ad9
--- /dev/null
+++ b/arch/djgpp/config.site
@@ -0,0 +1,38 @@
+#! /bin/sh
+
+# Copyright (C) 2000-2020 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# 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'}
+PERL=${PERL='/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..8960b7a
--- /dev/null
+++ b/arch/djgpp/t-groff.bat
@@ -0,0 +1,83 @@
+Rem Copyright (C) 2000-2020 Free Software Foundation, Inc.
+Rem
+Rem This file is part of groff.
+Rem
+Rem groff is free software; you can redistribute it and/or modify it under
+Rem the terms of the GNU General Public License as published by the Free
+Rem Software Foundation; either version 3 of the License, or (at your option)
+Rem any later version.
+Rem
+Rem groff is distributed in the hope that it will be useful, but WITHOUT ANY
+Rem WARRANTY; without even the implied warranty of MERCHANTABILITY or
+Rem FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+Rem for more details.
+Rem
+Rem You should have received a copy of the GNU General Public License along
+Rem with this program. If not, see <http://www.gnu.org/licenses/>.
+Rem
+Rem This script runs groff without requiring that it be installed.
+
+@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/mingw/afmtodit.cmd b/arch/mingw/afmtodit.cmd
new file mode 100644
index 0000000..36012ed
--- /dev/null
+++ b/arch/mingw/afmtodit.cmd
@@ -0,0 +1,2 @@
+@echo off
+perl -w %~dpn0 %*
diff --git a/arch/mingw/chem.cmd b/arch/mingw/chem.cmd
new file mode 100644
index 0000000..3fb18d4
--- /dev/null
+++ b/arch/mingw/chem.cmd
@@ -0,0 +1,2 @@
+@echo off
+perl %~dpn0 %*
diff --git a/arch/mingw/gperl.cmd b/arch/mingw/gperl.cmd
new file mode 100644
index 0000000..3fb18d4
--- /dev/null
+++ b/arch/mingw/gperl.cmd
@@ -0,0 +1,2 @@
+@echo off
+perl %~dpn0 %*
diff --git a/arch/mingw/gpinyin.cmd b/arch/mingw/gpinyin.cmd
new file mode 100644
index 0000000..3fb18d4
--- /dev/null
+++ b/arch/mingw/gpinyin.cmd
@@ -0,0 +1,2 @@
+@echo off
+perl %~dpn0 %*
diff --git a/arch/mingw/grap2graph.cmd b/arch/mingw/grap2graph.cmd
new file mode 100644
index 0000000..5ee9e5a
--- /dev/null
+++ b/arch/mingw/grap2graph.cmd
@@ -0,0 +1,86 @@
+@echo off
+REM grap2graph -- compile graph description descriptions to bitmap images
+REM
+REM by Eli Zaretskii <eliz@gnu.org>, translation of a Unix shell
+REM script written by Eric S. Raymond <esr@thyrsus.com>, May 2003
+REM
+REM In Unixland, the magic is in knowing what to string together...
+REM
+REM Take grap description on stdin, emit cropped bitmap on stdout.
+REM The pic markup should *not* be wrapped in .G1/.G2, this script will do that.
+REM A -U option on the command line enables gpic/groff "unsafe" mode.
+REM A -format FOO option changes the image output format to any format
+REM supported by convert(1). All other options are passed to convert(1).
+REM The default format is PNG.
+REM
+REM
+REM Requires the groff suite and the ImageMagick tools. Both are open source.
+REM This code is released to the public domain.
+REM
+REM Here are the assumptions behind the option processing:
+REM
+REM 1. None of the options of grap(1) are relevant.
+REM
+REM 2. Only the -U option of groff(1) is relevant.
+REM
+REM 3. Many options of convert(1) are potentially relevant, (especially
+REM -density, -interlace, -transparency, -border, and -comment).
+REM
+REM Thus, we pass -U to groff(1), and everything else to convert(1).
+REM
+setlocal
+set groff_opts=
+set convert_opts=
+set format=png
+
+:loop
+if "%1" == "" goto body
+if "%1" == "-v" goto version
+if "%1" == "--version" goto version
+if "%1" == "--help" goto usage
+if not "%1%" == "-unsafe" goto format
+set groff_opts=-U
+shift
+goto loop
+:format
+if not "%1" == "-format" goto convert
+set format=%2
+shift
+shift
+goto loop
+:convert
+set convert_opts=%convert_opts% %1
+shift
+goto loop
+
+:body
+REM echo %groff_opts% %convert_opts% %format%
+
+set rnd1=%RANDOM%
+set rnd2=%RANDOM%
+if "%GROFF_TMPDIR%" == "" goto deftmp
+set tdir=%GROFF_TMPDIR%\grap2graph-%rnd1%
+goto runpipe
+:deftmp
+sei tdir=%TEMP%\grap2graph-%rnd1%
+
+:runpipe
+mkdir %tdir%
+echo .G1 > %tdir%\wrap
+cat >> %tdir%\wrap
+echo .G2 >> %tdir%\wrap
+grap %tdir%\wrap | groff -p %groff_opts% -Tps -P-pletter | convert -trim -crop 0x0 %convert_opts% - %tdir%/grap2graph.%format%
+cat %tdir%/grap2graph.%format%
+rm -rf %tdir%
+goto end
+
+:version
+echo GNU grap2graph (groff) version 1.23.0
+goto end
+
+:usage
+echo usage: grap2graph ^[ option ...^] ^< in ^> out
+echo.
+
+:end
+endlocal
diff --git a/arch/mingw/grog.cmd b/arch/mingw/grog.cmd
new file mode 100644
index 0000000..3fb18d4
--- /dev/null
+++ b/arch/mingw/grog.cmd
@@ -0,0 +1,2 @@
+@echo off
+perl %~dpn0 %*
diff --git a/arch/mingw/gropdf.cmd b/arch/mingw/gropdf.cmd
new file mode 100644
index 0000000..36012ed
--- /dev/null
+++ b/arch/mingw/gropdf.cmd
@@ -0,0 +1,2 @@
+@echo off
+perl -w %~dpn0 %*
diff --git a/arch/mingw/mingw.am b/arch/mingw/mingw.am
new file mode 100644
index 0000000..4badf5a
--- /dev/null
+++ b/arch/mingw/mingw.am
@@ -0,0 +1,49 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# mingw.am
+#
+WINSCRIPTS=\
+ arch/mingw/afmtodit.cmd \
+ arch/mingw/chem.cmd \
+ arch/mingw/gperl.cmd \
+ arch/mingw/gpinyin.cmd \
+ arch/mingw/grap2graph.cmd \
+ arch/mingw/grog.cmd \
+ arch/mingw/gropdf.cmd \
+ arch/mingw/mmroff.cmd \
+ arch/mingw/neqn.cmd \
+ arch/mingw/pdfmom.cmd \
+ arch/mingw/roff2dvi.cmd \
+ arch/mingw/roff2html.cmd \
+ arch/mingw/roff2pdf.cmd \
+ arch/mingw/roff2ps.cmd \
+ arch/mingw/roff2text.cmd \
+ arch/mingw/roff2x.cmd
+
+if BUILD_WINSCRIPTS
+bin_SCRIPTS += $(WINSCRIPTS)
+else
+EXTRA_DIST += $(WINSCRIPTS)
+endif
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/arch/mingw/mmroff.cmd b/arch/mingw/mmroff.cmd
new file mode 100644
index 0000000..3fb18d4
--- /dev/null
+++ b/arch/mingw/mmroff.cmd
@@ -0,0 +1,2 @@
+@echo off
+perl %~dpn0 %*
diff --git a/arch/mingw/neqn.cmd b/arch/mingw/neqn.cmd
new file mode 100644
index 0000000..d501692
--- /dev/null
+++ b/arch/mingw/neqn.cmd
@@ -0,0 +1,6 @@
+@echo off
+setlocal
+set Path=%~dp0;%Path%
+if not "%GROFF_BIN_PATH%" == "" set Path=%GROFF_BIN_PATH%;%Path%
+eqn -Tascii %*
+endlocal
diff --git a/arch/mingw/pdfmom.cmd b/arch/mingw/pdfmom.cmd
new file mode 100644
index 0000000..36012ed
--- /dev/null
+++ b/arch/mingw/pdfmom.cmd
@@ -0,0 +1,2 @@
+@echo off
+perl -w %~dpn0 %*
diff --git a/arch/mingw/roff2dvi.cmd b/arch/mingw/roff2dvi.cmd
new file mode 100644
index 0000000..3fb18d4
--- /dev/null
+++ b/arch/mingw/roff2dvi.cmd
@@ -0,0 +1,2 @@
+@echo off
+perl %~dpn0 %*
diff --git a/arch/mingw/roff2html.cmd b/arch/mingw/roff2html.cmd
new file mode 100644
index 0000000..3fb18d4
--- /dev/null
+++ b/arch/mingw/roff2html.cmd
@@ -0,0 +1,2 @@
+@echo off
+perl %~dpn0 %*
diff --git a/arch/mingw/roff2pdf.cmd b/arch/mingw/roff2pdf.cmd
new file mode 100644
index 0000000..3fb18d4
--- /dev/null
+++ b/arch/mingw/roff2pdf.cmd
@@ -0,0 +1,2 @@
+@echo off
+perl %~dpn0 %*
diff --git a/arch/mingw/roff2ps.cmd b/arch/mingw/roff2ps.cmd
new file mode 100644
index 0000000..3fb18d4
--- /dev/null
+++ b/arch/mingw/roff2ps.cmd
@@ -0,0 +1,2 @@
+@echo off
+perl %~dpn0 %*
diff --git a/arch/mingw/roff2text.cmd b/arch/mingw/roff2text.cmd
new file mode 100644
index 0000000..3fb18d4
--- /dev/null
+++ b/arch/mingw/roff2text.cmd
@@ -0,0 +1,2 @@
+@echo off
+perl %~dpn0 %*
diff --git a/arch/mingw/roff2x.cmd b/arch/mingw/roff2x.cmd
new file mode 100644
index 0000000..3fb18d4
--- /dev/null
+++ b/arch/mingw/roff2x.cmd
@@ -0,0 +1,2 @@
+@echo off
+perl %~dpn0 %*
diff --git a/arch/misc/misc.am b/arch/misc/misc.am
new file mode 100644
index 0000000..f8237cc
--- /dev/null
+++ b/arch/misc/misc.am
@@ -0,0 +1,35 @@
+# Copyright (C) 2004-2023 Free Software Foundation, Inc.
+# Original Makefile.sub written by Keith Marshall
+# <keith.d.marshall@ntlworld.com>.
+# Adapted to Automake by Bertrand Garrigues
+# <bertrand.garrigues@laposte.net>.
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+arch_shdeps_sh = arch/misc/shdeps.sh
+EXTRA_DIST += $(arch_shdeps_sh)
+MOSTLYCLEANFILES += shdeps.sed
+
+$(SH_DEPS_SED_SCRIPT): $(top_srcdir)/$(arch_shdeps_sh)
+ $(AM_V_GEN)$(SHELL) $(top_srcdir)/$(arch_shdeps_sh) \
+ "$(RT_SEP)" "$(SH_SEP)" "$(bindir)" > $@
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/arch/misc/shdeps.sh b/arch/misc/shdeps.sh
new file mode 100644
index 0000000..844b368
--- /dev/null
+++ b/arch/misc/shdeps.sh
@@ -0,0 +1,117 @@
+#! /bin/sh
+# shdeps.sh: Generate OS dependency fixups, for 'groff' shell scripts
+#
+# Copyright (C) 2004-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+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/build-aux/compile b/build-aux/compile
new file mode 100755
index 0000000..df363c8
--- /dev/null
+++ b/build-aux/compile
@@ -0,0 +1,348 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" "" $nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+ file=$1
+ case $file in
+ / | /[!/]*) # absolute file, and not a UNC file
+ if test -z "$file_conv"; then
+ # lazily determine how to convert abs files
+ case `uname -s` in
+ MINGW*)
+ file_conv=mingw
+ ;;
+ CYGWIN* | MSYS*)
+ file_conv=cygwin
+ ;;
+ *)
+ file_conv=wine
+ ;;
+ esac
+ fi
+ case $file_conv/,$2, in
+ *,$file_conv,*)
+ ;;
+ mingw/*)
+ file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+ ;;
+ cygwin/* | msys/*)
+ file=`cygpath -m "$file" || echo "$file"`
+ ;;
+ wine/*)
+ file=`winepath -w "$file" || echo "$file"`
+ ;;
+ esac
+ ;;
+ esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+ func_file_conv "$1"
+ if test -z "$lib_path"; then
+ lib_path=$file
+ else
+ lib_path="$lib_path;$file"
+ fi
+ linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+ lib=$1
+ found=no
+ save_IFS=$IFS
+ IFS=';'
+ for dir in $lib_path $LIB
+ do
+ IFS=$save_IFS
+ if $shared && test -f "$dir/$lib.dll.lib"; then
+ found=yes
+ lib=$dir/$lib.dll.lib
+ break
+ fi
+ if test -f "$dir/$lib.lib"; then
+ found=yes
+ lib=$dir/$lib.lib
+ break
+ fi
+ if test -f "$dir/lib$lib.a"; then
+ found=yes
+ lib=$dir/lib$lib.a
+ break
+ fi
+ done
+ IFS=$save_IFS
+
+ if test "$found" != yes; then
+ lib=$lib.lib
+ fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+ # Assume a capable shell
+ lib_path=
+ shared=:
+ linker_opts=
+ for arg
+ do
+ if test -n "$eat"; then
+ eat=
+ else
+ case $1 in
+ -o)
+ # configure might choose to run compile as 'compile cc -o foo foo.c'.
+ eat=1
+ case $2 in
+ *.o | *.[oO][bB][jJ])
+ func_file_conv "$2"
+ set x "$@" -Fo"$file"
+ shift
+ ;;
+ *)
+ func_file_conv "$2"
+ set x "$@" -Fe"$file"
+ shift
+ ;;
+ esac
+ ;;
+ -I)
+ eat=1
+ func_file_conv "$2" mingw
+ set x "$@" -I"$file"
+ shift
+ ;;
+ -I*)
+ func_file_conv "${1#-I}" mingw
+ set x "$@" -I"$file"
+ shift
+ ;;
+ -l)
+ eat=1
+ func_cl_dashl "$2"
+ set x "$@" "$lib"
+ shift
+ ;;
+ -l*)
+ func_cl_dashl "${1#-l}"
+ set x "$@" "$lib"
+ shift
+ ;;
+ -L)
+ eat=1
+ func_cl_dashL "$2"
+ ;;
+ -L*)
+ func_cl_dashL "${1#-L}"
+ ;;
+ -static)
+ shared=false
+ ;;
+ -Wl,*)
+ arg=${1#-Wl,}
+ save_ifs="$IFS"; IFS=','
+ for flag in $arg; do
+ IFS="$save_ifs"
+ linker_opts="$linker_opts $flag"
+ done
+ IFS="$save_ifs"
+ ;;
+ -Xlinker)
+ eat=1
+ linker_opts="$linker_opts $2"
+ ;;
+ -*)
+ set x "$@" "$1"
+ shift
+ ;;
+ *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+ func_file_conv "$1"
+ set x "$@" -Tp"$file"
+ shift
+ ;;
+ *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+ func_file_conv "$1" mingw
+ set x "$@" "$file"
+ shift
+ ;;
+ *)
+ set x "$@" "$1"
+ shift
+ ;;
+ esac
+ fi
+ shift
+ done
+ if test -n "$linker_opts"; then
+ linker_opts="-link$linker_opts"
+ fi
+ exec "$@" $linker_opts
+ exit 1
+}
+
+eat=
+
+case $1 in
+ '')
+ echo "$0: No command. Try '$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "compile $scriptversion"
+ exit $?
+ ;;
+ cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
+ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
+ func_cl_wrapper "$@" # Doesn't return...
+ ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+ if test -n "$eat"; then
+ eat=
+ else
+ case $1 in
+ -o)
+ # configure might choose to run compile as 'compile cc -o foo foo.c'.
+ # So we strip '-o arg' only if arg is an object.
+ eat=1
+ case $2 in
+ *.o | *.obj)
+ ofile=$2
+ ;;
+ *)
+ set x "$@" -o "$2"
+ shift
+ ;;
+ esac
+ ;;
+ *.c)
+ cfile=$1
+ set x "$@" "$1"
+ shift
+ ;;
+ *)
+ set x "$@" "$1"
+ shift
+ ;;
+ esac
+ fi
+ shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+ # If no '-o' option was seen then we might have been invoked from a
+ # pattern rule where we don't need one. That is ok -- this is a
+ # normal compilation that the losing compiler can handle. If no
+ # '.c' file was seen then we are probably linking. That is also
+ # ok.
+ exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file. Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+ if mkdir "$lockdir" >/dev/null 2>&1; then
+ break
+ fi
+ sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+ test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+ test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/config.guess b/build-aux/config.guess
new file mode 100755
index 0000000..69188da
--- /dev/null
+++ b/build-aux/config.guess
@@ -0,0 +1,1774 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright 1992-2023 Free Software Foundation, Inc.
+
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2023-01-01'
+
+# This file 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 3 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, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program. This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
+#
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
+#
+# Please send patches to <config-patches@gnu.org>.
+
+
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX. However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Options:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2023 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+# Just in case it came from the environment.
+GUESS=
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+tmp=
+# shellcheck disable=SC2172
+trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
+
+set_cc_for_build() {
+ # prevent multiple calls if $tmp is already set
+ test "$tmp" && return 0
+ : "${TMPDIR=/tmp}"
+ # shellcheck disable=SC2039,SC3028
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
+ dummy=$tmp/dummy
+ case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
+ ,,) echo "int x;" > "$dummy.c"
+ for driver in cc gcc c89 c99 ; do
+ if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
+ CC_FOR_BUILD=$driver
+ break
+ fi
+ done
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+ esac
+}
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if test -f /.attbin/uname ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+case $UNAME_SYSTEM in
+Linux|GNU|GNU/*)
+ LIBC=unknown
+
+ set_cc_for_build
+ cat <<-EOF > "$dummy.c"
+ #include <features.h>
+ #if defined(__UCLIBC__)
+ LIBC=uclibc
+ #elif defined(__dietlibc__)
+ LIBC=dietlibc
+ #elif defined(__GLIBC__)
+ LIBC=gnu
+ #else
+ #include <stdarg.h>
+ /* First heuristic to detect musl libc. */
+ #ifdef __DEFINED_va_list
+ LIBC=musl
+ #endif
+ #endif
+ EOF
+ cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+ eval "$cc_set_libc"
+
+ # Second heuristic to detect musl libc.
+ if [ "$LIBC" = unknown ] &&
+ command -v ldd >/dev/null &&
+ ldd --version 2>&1 | grep -q ^musl; then
+ LIBC=musl
+ fi
+
+ # If the system lacks a compiler, then just pick glibc.
+ # We could probably try harder.
+ if [ "$LIBC" = unknown ]; then
+ LIBC=gnu
+ fi
+ ;;
+esac
+
+# Note: order is significant - the case branches are not exclusive.
+
+case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+ /sbin/sysctl -n hw.machine_arch 2>/dev/null || \
+ /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \
+ echo unknown)`
+ case $UNAME_MACHINE_ARCH in
+ aarch64eb) machine=aarch64_be-unknown ;;
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ sh5el) machine=sh5le-unknown ;;
+ earmv*)
+ arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+ endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'`
+ machine=${arch}${endian}-unknown
+ ;;
+ *) machine=$UNAME_MACHINE_ARCH-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently (or will in the future) and ABI.
+ case $UNAME_MACHINE_ARCH in
+ earm*)
+ os=netbsdelf
+ ;;
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ELF__
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # Determine ABI tags.
+ case $UNAME_MACHINE_ARCH in
+ earm*)
+ expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+ abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"`
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case $UNAME_VERSION in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ GUESS=$machine-${os}${release}${abi-}
+ ;;
+ *:Bitrig:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE
+ ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE
+ ;;
+ *:SecBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE
+ ;;
+ *:LibertyBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE
+ ;;
+ *:MidnightBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE
+ ;;
+ *:ekkoBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE
+ ;;
+ *:SolidBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE
+ ;;
+ *:OS108:*:*)
+ GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE
+ ;;
+ macppc:MirBSD:*:*)
+ GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE
+ ;;
+ *:MirBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE
+ ;;
+ *:Sortix:*:*)
+ GUESS=$UNAME_MACHINE-unknown-sortix
+ ;;
+ *:Twizzler:*:*)
+ GUESS=$UNAME_MACHINE-unknown-twizzler
+ ;;
+ *:Redox:*:*)
+ GUESS=$UNAME_MACHINE-unknown-redox
+ ;;
+ mips:OSF1:*.*)
+ GUESS=mips-dec-osf1
+ ;;
+ alpha:OSF1:*:*)
+ # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+ trap '' 0
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case $ALPHA_CPU_TYPE in
+ "EV4 (21064)")
+ UNAME_MACHINE=alpha ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE=alpha ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE=alpha ;;
+ "EV5 (21164)")
+ UNAME_MACHINE=alphaev5 ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE=alphaev56 ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE=alphapca56 ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE=alphapca57 ;;
+ "EV6 (21264)")
+ UNAME_MACHINE=alphaev6 ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE=alphaev67 ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE=alphaev68 ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE=alphaev68 ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE=alphaev68 ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE=alphaev69 ;;
+ "EV7 (21364)")
+ UNAME_MACHINE=alphaev7 ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE=alphaev79 ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+ GUESS=$UNAME_MACHINE-dec-osf$OSF_REL
+ ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ GUESS=m68k-unknown-sysv4
+ ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ GUESS=$UNAME_MACHINE-unknown-amigaos
+ ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ GUESS=$UNAME_MACHINE-unknown-morphos
+ ;;
+ *:OS/390:*:*)
+ GUESS=i370-ibm-openedition
+ ;;
+ *:z/VM:*:*)
+ GUESS=s390-ibm-zvmoe
+ ;;
+ *:OS400:*:*)
+ GUESS=powerpc-ibm-os400
+ ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ GUESS=arm-acorn-riscix$UNAME_RELEASE
+ ;;
+ arm*:riscos:*:*|arm*:RISCOS:*:*)
+ GUESS=arm-unknown-riscos
+ ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ GUESS=hppa1.1-hitachi-hiuxmpp
+ ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ case `(/bin/universe) 2>/dev/null` in
+ att) GUESS=pyramid-pyramid-sysv3 ;;
+ *) GUESS=pyramid-pyramid-bsd ;;
+ esac
+ ;;
+ NILE*:*:*:dcosx)
+ GUESS=pyramid-pyramid-svr4
+ ;;
+ DRS?6000:unix:4.0:6*)
+ GUESS=sparc-icl-nx6
+ ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) GUESS=sparc-icl-nx7 ;;
+ esac
+ ;;
+ s390x:SunOS:*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL
+ ;;
+ sun4H:SunOS:5.*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=sparc-hal-solaris2$SUN_REL
+ ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=sparc-sun-solaris2$SUN_REL
+ ;;
+ i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+ GUESS=i386-pc-auroraux$UNAME_RELEASE
+ ;;
+ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+ set_cc_for_build
+ SUN_ARCH=i386
+ # If there is a compiler, see if it is configured for 64-bit objects.
+ # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+ # This test works for both compilers.
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ SUN_ARCH=x86_64
+ fi
+ fi
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=$SUN_ARCH-pc-solaris2$SUN_REL
+ ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=sparc-sun-solaris3$SUN_REL
+ ;;
+ sun4*:SunOS:*:*)
+ case `/usr/bin/arch -k` in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'`
+ GUESS=sparc-sun-sunos$SUN_REL
+ ;;
+ sun3*:SunOS:*:*)
+ GUESS=m68k-sun-sunos$UNAME_RELEASE
+ ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3
+ case `/bin/arch` in
+ sun3)
+ GUESS=m68k-sun-sunos$UNAME_RELEASE
+ ;;
+ sun4)
+ GUESS=sparc-sun-sunos$UNAME_RELEASE
+ ;;
+ esac
+ ;;
+ aushp:SunOS:*:*)
+ GUESS=sparc-auspex-sunos$UNAME_RELEASE
+ ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ GUESS=m68k-atari-mint$UNAME_RELEASE
+ ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ GUESS=m68k-atari-mint$UNAME_RELEASE
+ ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ GUESS=m68k-atari-mint$UNAME_RELEASE
+ ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ GUESS=m68k-milan-mint$UNAME_RELEASE
+ ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ GUESS=m68k-hades-mint$UNAME_RELEASE
+ ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ GUESS=m68k-unknown-mint$UNAME_RELEASE
+ ;;
+ m68k:machten:*:*)
+ GUESS=m68k-apple-machten$UNAME_RELEASE
+ ;;
+ powerpc:machten:*:*)
+ GUESS=powerpc-apple-machten$UNAME_RELEASE
+ ;;
+ RISC*:Mach:*:*)
+ GUESS=mips-dec-mach_bsd4.3
+ ;;
+ RISC*:ULTRIX:*:*)
+ GUESS=mips-dec-ultrix$UNAME_RELEASE
+ ;;
+ VAX*:ULTRIX*:*:*)
+ GUESS=vax-dec-ultrix$UNAME_RELEASE
+ ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ GUESS=clipper-intergraph-clix$UNAME_RELEASE
+ ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o "$dummy" "$dummy.c" &&
+ dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+ SYSTEM_NAME=`"$dummy" "$dummyarg"` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ GUESS=mips-mips-riscos$UNAME_RELEASE
+ ;;
+ Motorola:PowerMAX_OS:*:*)
+ GUESS=powerpc-motorola-powermax
+ ;;
+ Motorola:*:4.3:PL8-*)
+ GUESS=powerpc-harris-powermax
+ ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ GUESS=powerpc-harris-powermax
+ ;;
+ Night_Hawk:Power_UNIX:*:*)
+ GUESS=powerpc-harris-powerunix
+ ;;
+ m88k:CX/UX:7*:*)
+ GUESS=m88k-harris-cxux7
+ ;;
+ m88k:*:4*:R4*)
+ GUESS=m88k-motorola-sysv4
+ ;;
+ m88k:*:3*:R3*)
+ GUESS=m88k-motorola-sysv3
+ ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110
+ then
+ if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \
+ test "$TARGET_BINARY_INTERFACE"x = x
+ then
+ GUESS=m88k-dg-dgux$UNAME_RELEASE
+ else
+ GUESS=m88k-dg-dguxbcs$UNAME_RELEASE
+ fi
+ else
+ GUESS=i586-dg-dgux$UNAME_RELEASE
+ fi
+ ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ GUESS=m88k-dolphin-sysv3
+ ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ GUESS=m88k-motorola-sysv3
+ ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ GUESS=m88k-tektronix-sysv3
+ ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ GUESS=m68k-tektronix-bsd
+ ;;
+ *:IRIX*:*:*)
+ IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'`
+ GUESS=mips-sgi-irix$IRIX_REL
+ ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ GUESS=i386-ibm-aix
+ ;;
+ ia64:AIX:*:*)
+ if test -x /usr/bin/oslevel ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
+ fi
+ GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV
+ ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"`
+ then
+ GUESS=$SYSTEM_NAME
+ else
+ GUESS=rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ GUESS=rs6000-ibm-aix3.2.4
+ else
+ GUESS=rs6000-ibm-aix3.2
+ fi
+ ;;
+ *:AIX:*:[4567])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if test -x /usr/bin/lslpp ; then
+ IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \
+ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
+ else
+ IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
+ fi
+ GUESS=$IBM_ARCH-ibm-aix$IBM_REV
+ ;;
+ *:AIX:*:*)
+ GUESS=rs6000-ibm-aix
+ ;;
+ ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
+ GUESS=romp-ibm-bsd4.4
+ ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to
+ ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ GUESS=rs6000-bull-bosx
+ ;;
+ DPX/2?00:B.O.S.:*:*)
+ GUESS=m68k-bull-sysv3
+ ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ GUESS=m68k-hp-bsd
+ ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ GUESS=m68k-hp-bsd4.4
+ ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
+ case $UNAME_MACHINE in
+ 9000/31?) HP_ARCH=m68000 ;;
+ 9000/[34]??) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if test -x /usr/bin/getconf; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case $sc_cpu_version in
+ 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case $sc_kernel_bits in
+ 32) HP_ARCH=hppa2.0n ;;
+ 64) HP_ARCH=hppa2.0w ;;
+ '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if test "$HP_ARCH" = ""; then
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if test "$HP_ARCH" = hppa2.0w
+ then
+ set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep -q __LP64__
+ then
+ HP_ARCH=hppa2.0w
+ else
+ HP_ARCH=hppa64
+ fi
+ fi
+ GUESS=$HP_ARCH-hp-hpux$HPUX_REV
+ ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
+ GUESS=ia64-hp-hpux$HPUX_REV
+ ;;
+ 3050*:HI-UX:*:*)
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ GUESS=unknown-hitachi-hiuxwe2
+ ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
+ GUESS=hppa1.1-hp-bsd
+ ;;
+ 9000/8??:4.3bsd:*:*)
+ GUESS=hppa1.0-hp-bsd
+ ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ GUESS=hppa1.0-hp-mpeix
+ ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
+ GUESS=hppa1.1-hp-osf
+ ;;
+ hp8??:OSF1:*:*)
+ GUESS=hppa1.0-hp-osf
+ ;;
+ i*86:OSF1:*:*)
+ if test -x /usr/sbin/sysversion ; then
+ GUESS=$UNAME_MACHINE-unknown-osf1mk
+ else
+ GUESS=$UNAME_MACHINE-unknown-osf1
+ fi
+ ;;
+ parisc*:Lites*:*:*)
+ GUESS=hppa1.1-hp-lites
+ ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ GUESS=c1-convex-bsd
+ ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ GUESS=c34-convex-bsd
+ ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ GUESS=c38-convex-bsd
+ ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ GUESS=c4-convex-bsd
+ ;;
+ CRAY*Y-MP:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=ymp-cray-unicos$CRAY_REL
+ ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=t90-cray-unicos$CRAY_REL
+ ;;
+ CRAY*T3E:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=alphaev5-cray-unicosmk$CRAY_REL
+ ;;
+ CRAY*SV1:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=sv1-cray-unicos$CRAY_REL
+ ;;
+ *:UNICOS/mp:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=craynv-cray-unicosmp$CRAY_REL
+ ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+ FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+ FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'`
+ GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+ ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+ FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
+ GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+ ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE
+ ;;
+ sparc*:BSD/OS:*:*)
+ GUESS=sparc-unknown-bsdi$UNAME_RELEASE
+ ;;
+ *:BSD/OS:*:*)
+ GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE
+ ;;
+ arm:FreeBSD:*:*)
+ UNAME_PROCESSOR=`uname -p`
+ set_cc_for_build
+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_PCS_VFP
+ then
+ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi
+ else
+ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf
+ fi
+ ;;
+ *:FreeBSD:*:*)
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ case $UNAME_PROCESSOR in
+ amd64)
+ UNAME_PROCESSOR=x86_64 ;;
+ i386)
+ UNAME_PROCESSOR=i586 ;;
+ esac
+ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL
+ ;;
+ i*:CYGWIN*:*)
+ GUESS=$UNAME_MACHINE-pc-cygwin
+ ;;
+ *:MINGW64*:*)
+ GUESS=$UNAME_MACHINE-pc-mingw64
+ ;;
+ *:MINGW*:*)
+ GUESS=$UNAME_MACHINE-pc-mingw32
+ ;;
+ *:MSYS*:*)
+ GUESS=$UNAME_MACHINE-pc-msys
+ ;;
+ i*:PW*:*)
+ GUESS=$UNAME_MACHINE-pc-pw32
+ ;;
+ *:SerenityOS:*:*)
+ GUESS=$UNAME_MACHINE-pc-serenity
+ ;;
+ *:Interix*:*)
+ case $UNAME_MACHINE in
+ x86)
+ GUESS=i586-pc-interix$UNAME_RELEASE
+ ;;
+ authenticamd | genuineintel | EM64T)
+ GUESS=x86_64-unknown-interix$UNAME_RELEASE
+ ;;
+ IA64)
+ GUESS=ia64-unknown-interix$UNAME_RELEASE
+ ;;
+ esac ;;
+ i*:UWIN*:*)
+ GUESS=$UNAME_MACHINE-pc-uwin
+ ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ GUESS=x86_64-pc-cygwin
+ ;;
+ prep*:SunOS:5.*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=powerpcle-unknown-solaris2$SUN_REL
+ ;;
+ *:GNU:*:*)
+ # the GNU system
+ GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'`
+ GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'`
+ GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL
+ ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"`
+ GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC
+ ;;
+ x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*)
+ GUESS="$UNAME_MACHINE-pc-managarm-mlibc"
+ ;;
+ *:[Mm]anagarm:*:*)
+ GUESS="$UNAME_MACHINE-unknown-managarm-mlibc"
+ ;;
+ *:Minix:*:*)
+ GUESS=$UNAME_MACHINE-unknown-minix
+ ;;
+ aarch64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ aarch64_be:Linux:*:*)
+ UNAME_MACHINE=aarch64_be
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep -q ld.so.1
+ if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ arm*:Linux:*:*)
+ set_cc_for_build
+ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_EABI__
+ then
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ else
+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_PCS_VFP
+ then
+ GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi
+ else
+ GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf
+ fi
+ fi
+ ;;
+ avr32*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ cris:Linux:*:*)
+ GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+ ;;
+ crisv32:Linux:*:*)
+ GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+ ;;
+ e2k:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ frv:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ hexagon:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ i*86:Linux:*:*)
+ GUESS=$UNAME_MACHINE-pc-linux-$LIBC
+ ;;
+ ia64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ k1om:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ loongarch32:Linux:*:* | loongarch64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ m32r*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ m68*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ mips:Linux:*:* | mips64:Linux:*:*)
+ set_cc_for_build
+ IS_GLIBC=0
+ test x"${LIBC}" = xgnu && IS_GLIBC=1
+ sed 's/^ //' << EOF > "$dummy.c"
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #undef mips64
+ #undef mips64el
+ #if ${IS_GLIBC} && defined(_ABI64)
+ LIBCABI=gnuabi64
+ #else
+ #if ${IS_GLIBC} && defined(_ABIN32)
+ LIBCABI=gnuabin32
+ #else
+ LIBCABI=${LIBC}
+ #endif
+ #endif
+
+ #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+ CPU=mipsisa64r6
+ #else
+ #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+ CPU=mipsisa32r6
+ #else
+ #if defined(__mips64)
+ CPU=mips64
+ #else
+ CPU=mips
+ #endif
+ #endif
+ #endif
+
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ MIPS_ENDIAN=el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ MIPS_ENDIAN=
+ #else
+ MIPS_ENDIAN=
+ #endif
+ #endif
+EOF
+ cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`
+ eval "$cc_set_vars"
+ test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
+ ;;
+ mips64el:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ openrisc*:Linux:*:*)
+ GUESS=or1k-unknown-linux-$LIBC
+ ;;
+ or32:Linux:*:* | or1k*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ padre:Linux:*:*)
+ GUESS=sparc-unknown-linux-$LIBC
+ ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ GUESS=hppa64-unknown-linux-$LIBC
+ ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;;
+ PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;;
+ *) GUESS=hppa-unknown-linux-$LIBC ;;
+ esac
+ ;;
+ ppc64:Linux:*:*)
+ GUESS=powerpc64-unknown-linux-$LIBC
+ ;;
+ ppc:Linux:*:*)
+ GUESS=powerpc-unknown-linux-$LIBC
+ ;;
+ ppc64le:Linux:*:*)
+ GUESS=powerpc64le-unknown-linux-$LIBC
+ ;;
+ ppcle:Linux:*:*)
+ GUESS=powerpcle-unknown-linux-$LIBC
+ ;;
+ riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ GUESS=$UNAME_MACHINE-ibm-linux-$LIBC
+ ;;
+ sh64*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ sh*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ tile*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ vax:Linux:*:*)
+ GUESS=$UNAME_MACHINE-dec-linux-$LIBC
+ ;;
+ x86_64:Linux:*:*)
+ set_cc_for_build
+ CPU=$UNAME_MACHINE
+ LIBCABI=$LIBC
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ ABI=64
+ sed 's/^ //' << EOF > "$dummy.c"
+ #ifdef __i386__
+ ABI=x86
+ #else
+ #ifdef __ILP32__
+ ABI=x32
+ #endif
+ #endif
+EOF
+ cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'`
+ eval "$cc_set_abi"
+ case $ABI in
+ x86) CPU=i686 ;;
+ x32) LIBCABI=${LIBC}x32 ;;
+ esac
+ fi
+ GUESS=$CPU-pc-linux-$LIBCABI
+ ;;
+ xtensa*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ GUESS=i386-sequent-sysv4
+ ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION
+ ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ GUESS=$UNAME_MACHINE-pc-os2-emx
+ ;;
+ i*86:XTS-300:*:STOP)
+ GUESS=$UNAME_MACHINE-unknown-stop
+ ;;
+ i*86:atheos:*:*)
+ GUESS=$UNAME_MACHINE-unknown-atheos
+ ;;
+ i*86:syllable:*:*)
+ GUESS=$UNAME_MACHINE-pc-syllable
+ ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+ GUESS=i386-unknown-lynxos$UNAME_RELEASE
+ ;;
+ i*86:*DOS:*:*)
+ GUESS=$UNAME_MACHINE-pc-msdosdjgpp
+ ;;
+ i*86:*:4.*:*)
+ UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL
+ else
+ GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL
+ fi
+ ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ GUESS=$UNAME_MACHINE-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL
+ else
+ GUESS=$UNAME_MACHINE-pc-sysv32
+ fi
+ ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i586.
+ # Note: whatever this is, it MUST be the same as what config.sub
+ # prints for the "djgpp" host, or else GDB configure will decide that
+ # this is a cross-build.
+ GUESS=i586-pc-msdosdjgpp
+ ;;
+ Intel:Mach:3*:*)
+ GUESS=i386-pc-mach3
+ ;;
+ paragon:*:*:*)
+ GUESS=i860-intel-osf1
+ ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4
+ fi
+ ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ GUESS=m68010-convergent-sysv
+ ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ GUESS=m68k-convergent-sysv
+ ;;
+ M680?0:D-NIX:5.3:*)
+ GUESS=m68k-diab-dnix
+ ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
+ NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+ OS_REL='.3'
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ GUESS=m68k-unknown-lynxos$UNAME_RELEASE
+ ;;
+ mc68030:UNIX_System_V:4.*:*)
+ GUESS=m68k-atari-sysv4
+ ;;
+ TSUNAMI:LynxOS:2.*:*)
+ GUESS=sparc-unknown-lynxos$UNAME_RELEASE
+ ;;
+ rs6000:LynxOS:2.*:*)
+ GUESS=rs6000-unknown-lynxos$UNAME_RELEASE
+ ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+ GUESS=powerpc-unknown-lynxos$UNAME_RELEASE
+ ;;
+ SM[BE]S:UNIX_SV:*:*)
+ GUESS=mips-dde-sysv$UNAME_RELEASE
+ ;;
+ RM*:ReliantUNIX-*:*:*)
+ GUESS=mips-sni-sysv4
+ ;;
+ RM*:SINIX-*:*:*)
+ GUESS=mips-sni-sysv4
+ ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ GUESS=$UNAME_MACHINE-sni-sysv4
+ else
+ GUESS=ns32k-sni-sysv
+ fi
+ ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ GUESS=i586-unisys-sysv4
+ ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ GUESS=hppa1.1-stratus-sysv4
+ ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ GUESS=i860-stratus-sysv4
+ ;;
+ i*86:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ GUESS=$UNAME_MACHINE-stratus-vos
+ ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ GUESS=hppa1.1-stratus-vos
+ ;;
+ mc68*:A/UX:*:*)
+ GUESS=m68k-apple-aux$UNAME_RELEASE
+ ;;
+ news*:NEWS-OS:6*:*)
+ GUESS=mips-sony-newsos6
+ ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if test -d /usr/nec; then
+ GUESS=mips-nec-sysv$UNAME_RELEASE
+ else
+ GUESS=mips-unknown-sysv$UNAME_RELEASE
+ fi
+ ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ GUESS=powerpc-be-beos
+ ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ GUESS=powerpc-apple-beos
+ ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ GUESS=i586-pc-beos
+ ;;
+ BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
+ GUESS=i586-pc-haiku
+ ;;
+ ppc:Haiku:*:*) # Haiku running on Apple PowerPC
+ GUESS=powerpc-apple-haiku
+ ;;
+ *:Haiku:*:*) # Haiku modern gcc (not bound by BeOS compat)
+ GUESS=$UNAME_MACHINE-unknown-haiku
+ ;;
+ SX-4:SUPER-UX:*:*)
+ GUESS=sx4-nec-superux$UNAME_RELEASE
+ ;;
+ SX-5:SUPER-UX:*:*)
+ GUESS=sx5-nec-superux$UNAME_RELEASE
+ ;;
+ SX-6:SUPER-UX:*:*)
+ GUESS=sx6-nec-superux$UNAME_RELEASE
+ ;;
+ SX-7:SUPER-UX:*:*)
+ GUESS=sx7-nec-superux$UNAME_RELEASE
+ ;;
+ SX-8:SUPER-UX:*:*)
+ GUESS=sx8-nec-superux$UNAME_RELEASE
+ ;;
+ SX-8R:SUPER-UX:*:*)
+ GUESS=sx8r-nec-superux$UNAME_RELEASE
+ ;;
+ SX-ACE:SUPER-UX:*:*)
+ GUESS=sxace-nec-superux$UNAME_RELEASE
+ ;;
+ Power*:Rhapsody:*:*)
+ GUESS=powerpc-apple-rhapsody$UNAME_RELEASE
+ ;;
+ *:Rhapsody:*:*)
+ GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE
+ ;;
+ arm64:Darwin:*:*)
+ GUESS=aarch64-apple-darwin$UNAME_RELEASE
+ ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p`
+ case $UNAME_PROCESSOR in
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ if command -v xcode-select > /dev/null 2> /dev/null && \
+ ! xcode-select --print-path > /dev/null 2> /dev/null ; then
+ # Avoid executing cc if there is no toolchain installed as
+ # cc will be a stub that puts up a graphical alert
+ # prompting the user to install developer tools.
+ CC_FOR_BUILD=no_compiler_found
+ else
+ set_cc_for_build
+ fi
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ case $UNAME_PROCESSOR in
+ i386) UNAME_PROCESSOR=x86_64 ;;
+ powerpc) UNAME_PROCESSOR=powerpc64 ;;
+ esac
+ fi
+ # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
+ if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_PPC >/dev/null
+ then
+ UNAME_PROCESSOR=powerpc
+ fi
+ elif test "$UNAME_PROCESSOR" = i386 ; then
+ # uname -m returns i386 or x86_64
+ UNAME_PROCESSOR=$UNAME_MACHINE
+ fi
+ GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE
+ ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = x86; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE
+ ;;
+ *:QNX:*:4*)
+ GUESS=i386-pc-qnx
+ ;;
+ NEO-*:NONSTOP_KERNEL:*:*)
+ GUESS=neo-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSE-*:NONSTOP_KERNEL:*:*)
+ GUESS=nse-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSR-*:NONSTOP_KERNEL:*:*)
+ GUESS=nsr-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSV-*:NONSTOP_KERNEL:*:*)
+ GUESS=nsv-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSX-*:NONSTOP_KERNEL:*:*)
+ GUESS=nsx-tandem-nsk$UNAME_RELEASE
+ ;;
+ *:NonStop-UX:*:*)
+ GUESS=mips-compaq-nonstopux
+ ;;
+ BS2000:POSIX*:*:*)
+ GUESS=bs2000-siemens-sysv
+ ;;
+ DS/*:UNIX_System_V:*:*)
+ GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE
+ ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "${cputype-}" = 386; then
+ UNAME_MACHINE=i386
+ elif test "x${cputype-}" != x; then
+ UNAME_MACHINE=$cputype
+ fi
+ GUESS=$UNAME_MACHINE-unknown-plan9
+ ;;
+ *:TOPS-10:*:*)
+ GUESS=pdp10-unknown-tops10
+ ;;
+ *:TENEX:*:*)
+ GUESS=pdp10-unknown-tenex
+ ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ GUESS=pdp10-dec-tops20
+ ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ GUESS=pdp10-xkl-tops20
+ ;;
+ *:TOPS-20:*:*)
+ GUESS=pdp10-unknown-tops20
+ ;;
+ *:ITS:*:*)
+ GUESS=pdp10-unknown-its
+ ;;
+ SEI:*:*:SEIUX)
+ GUESS=mips-sei-seiux$UNAME_RELEASE
+ ;;
+ *:DragonFly:*:*)
+ DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL
+ ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case $UNAME_MACHINE in
+ A*) GUESS=alpha-dec-vms ;;
+ I*) GUESS=ia64-dec-vms ;;
+ V*) GUESS=vax-dec-vms ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ GUESS=i386-pc-xenix
+ ;;
+ i*86:skyos:*:*)
+ SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`
+ GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL
+ ;;
+ i*86:rdos:*:*)
+ GUESS=$UNAME_MACHINE-pc-rdos
+ ;;
+ i*86:Fiwix:*:*)
+ GUESS=$UNAME_MACHINE-pc-fiwix
+ ;;
+ *:AROS:*:*)
+ GUESS=$UNAME_MACHINE-unknown-aros
+ ;;
+ x86_64:VMkernel:*:*)
+ GUESS=$UNAME_MACHINE-unknown-esx
+ ;;
+ amd64:Isilon\ OneFS:*:*)
+ GUESS=x86_64-unknown-onefs
+ ;;
+ *:Unleashed:*:*)
+ GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE
+ ;;
+esac
+
+# Do we have a guess based on uname results?
+if test "x$GUESS" != x; then
+ echo "$GUESS"
+ exit
+fi
+
+# No uname command or uname output not recognized.
+set_cc_for_build
+cat > "$dummy.c" <<EOF
+#ifdef _SEQUENT_
+#include <sys/types.h>
+#include <sys/utsname.h>
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#include <signal.h>
+#if defined(_SIZE_T_) || defined(SIGLOST)
+#include <sys/utsname.h>
+#endif
+#endif
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+#include <sys/param.h>
+#if defined (BSD)
+#if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+#else
+#if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#else
+ printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#endif
+#else
+ printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#else
+#if defined(_SIZE_T_) || defined(SIGLOST)
+ struct utsname un;
+ uname (&un);
+ printf ("vax-dec-ultrix%s\n", un.release); exit (0);
+#else
+ printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#if defined(_SIZE_T_) || defined(SIGLOST)
+ struct utsname *un;
+ uname (&un);
+ printf ("mips-dec-ultrix%s\n", un.release); exit (0);
+#else
+ printf ("mips-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` &&
+ { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; }
+
+echo "$0: unable to guess system type" >&2
+
+case $UNAME_MACHINE:$UNAME_SYSTEM in
+ mips:Linux | mips64:Linux)
+ # If we got here on MIPS GNU/Linux, output extra information.
+ cat >&2 <<EOF
+
+NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize
+the system type. Please install a C compiler and try again.
+EOF
+ ;;
+esac
+
+cat >&2 <<EOF
+
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite *all*
+copies of config.guess and config.sub with the latest versions from:
+
+ https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
+and
+ https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+EOF
+
+our_year=`echo $timestamp | sed 's,-.*,,'`
+thisyear=`date +%Y`
+# shellcheck disable=SC2003
+script_age=`expr "$thisyear" - "$our_year"`
+if test "$script_age" -lt 3 ; then
+ cat >&2 <<EOF
+
+If $0 has already been updated, send the following data and any
+information you think might be pertinent to config-patches@gnu.org to
+provide the necessary information to handle your system.
+
+config.guess timestamp = $timestamp
+
+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`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = "$UNAME_MACHINE"
+UNAME_RELEASE = "$UNAME_RELEASE"
+UNAME_SYSTEM = "$UNAME_SYSTEM"
+UNAME_VERSION = "$UNAME_VERSION"
+EOF
+fi
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/build-aux/config.rpath b/build-aux/config.rpath
new file mode 100755
index 0000000..1e2595f
--- /dev/null
+++ b/build-aux/config.rpath
@@ -0,0 +1,684 @@
+#! /bin/sh
+# Output a system dependent set of variables, describing how to set the
+# run time search path of shared libraries in an executable.
+#
+# Copyright 1996-2023 Free Software Foundation, Inc.
+# Taken from GNU libtool, 2001
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# The first argument passed to this file is the canonical host specification,
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
+# should be set by the caller.
+#
+# The set of defined variables is at the end of this script.
+
+# Known limitations:
+# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
+# than 256 bytes, otherwise the compiler driver will dump core. The only
+# known workaround is to choose shorter directory names for the build
+# directory and/or the installation directory.
+
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+shrext=.so
+
+host="$1"
+host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+# Code taken from libtool.m4's _LT_CC_BASENAME.
+
+for cc_temp in $CC""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
+
+# Code taken from libtool.m4's _LT_COMPILER_PIC.
+
+wl=
+if test "$GCC" = yes; then
+ wl='-Wl,'
+else
+ case "$host_os" in
+ aix*)
+ wl='-Wl,'
+ ;;
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ wl='-Wl,'
+ ;;
+ irix5* | irix6* | nonstopux*)
+ wl='-Wl,'
+ ;;
+ linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ case $cc_basename in
+ ecc*)
+ wl='-Wl,'
+ ;;
+ icc* | ifort*)
+ wl='-Wl,'
+ ;;
+ lf95*)
+ wl='-Wl,'
+ ;;
+ nagfor*)
+ wl='-Wl,-Wl,,'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+ wl='-Wl,'
+ ;;
+ ccc*)
+ wl='-Wl,'
+ ;;
+ xl* | bgxl* | bgf* | mpixl*)
+ wl='-Wl,'
+ ;;
+ como)
+ wl='-lopt='
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ F* | *Sun*Fortran*)
+ wl=
+ ;;
+ *Sun\ C*)
+ wl='-Wl,'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ newsos6)
+ ;;
+ *nto* | *qnx*)
+ ;;
+ osf3* | osf4* | osf5*)
+ wl='-Wl,'
+ ;;
+ rdos*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+ wl='-Qoption ld '
+ ;;
+ *)
+ wl='-Wl,'
+ ;;
+ esac
+ ;;
+ sunos4*)
+ wl='-Qoption ld '
+ ;;
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ wl='-Wl,'
+ ;;
+ sysv4*MP*)
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ wl='-Wl,'
+ ;;
+ unicos*)
+ wl='-Wl,'
+ ;;
+ uts4*)
+ ;;
+ esac
+fi
+
+# Code taken from libtool.m4's _LT_LINKER_SHLIBS.
+
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+
+case "$host_os" in
+ cygwin* | mingw* | pw32* | cegcc*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ # Unlike libtool, we use -rpath here, not --rpath, since the documented
+ # option of GNU ld is called -rpath, not --rpath.
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ case "$host_os" in
+ aix[3-9]*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs=no
+ fi
+ ;;
+ amigaos*)
+ case "$host_cpu" in
+ powerpc)
+ ;;
+ m68k)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ cygwin* | mingw* | pw32* | cegcc*)
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ haiku*)
+ ;;
+ interix[3-9]*)
+ hardcode_direct=no
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ netbsd*)
+ ;;
+ solaris*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs=no
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ ;;
+ sunos4*)
+ hardcode_direct=yes
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ if test "$ld_shlibs" = no; then
+ hardcode_libdir_flag_spec=
+ fi
+else
+ case "$host_os" in
+ aix3*)
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test "$GCC" = yes; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+ aix[4-9]*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ else
+ aix_use_runtimelinking=no
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ ;;
+ esac
+ fi
+ hardcode_direct=yes
+ hardcode_libdir_separator=':'
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ ;;
+ esac
+ fi
+ # Begin _LT_AC_SYS_LIBPATH_AIX.
+ echo 'int main () { return 0; }' > conftest.c
+ ${CC} ${LDFLAGS} conftest.c -o conftest
+ aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+ if test -z "$aix_libpath"; then
+ aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+ fi
+ if test -z "$aix_libpath"; then
+ aix_libpath="/usr/lib:/lib"
+ fi
+ rm -f conftest.c conftest
+ # End _LT_AC_SYS_LIBPATH_AIX.
+ if test "$aix_use_runtimelinking" = yes; then
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+ else
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ fi
+ fi
+ ;;
+ amigaos*)
+ case "$host_cpu" in
+ powerpc)
+ ;;
+ m68k)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+ bsdi[45]*)
+ ;;
+ cygwin* | mingw* | pw32* | cegcc*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec=' '
+ libext=lib
+ ;;
+ darwin* | rhapsody*)
+ hardcode_direct=no
+ if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ dgux*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+ freebsd2.[01]*)
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ ;;
+ freebsd* | dragonfly* | midnightbsd*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ hpux9*)
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ hpux10*)
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ fi
+ ;;
+ hpux11*)
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct=no
+ ;;
+ *)
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+ irix5* | irix6* | nonstopux*)
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ netbsd*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ newsos6)
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ *nto* | *qnx*)
+ ;;
+ openbsd*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct=yes
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ else
+ case "$host_os" in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ *)
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ osf3*)
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ osf4* | osf5*)
+ if test "$GCC" = yes; then
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ else
+ # Both cc and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ hardcode_libdir_separator=:
+ ;;
+ solaris*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ sunos4*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ ;;
+ sysv4)
+ case $host_vendor in
+ sni)
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ hardcode_direct=no
+ ;;
+ motorola)
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ ;;
+ sysv4.3*)
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ ld_shlibs=yes
+ fi
+ ;;
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ ;;
+ sysv5* | sco3.2v5* | sco5v6*)
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ hardcode_libdir_separator=':'
+ ;;
+ uts4*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+fi
+
+# Check dynamic linker characteristics
+# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER.
+# Unlike libtool.m4, here we don't care about _all_ names of the library, but
+# only about the one the linker finds when passed -lNAME. This is the last
+# element of library_names_spec in libtool.m4, or possibly two of them if the
+# linker has special search rules.
+library_names_spec= # the last element of library_names_spec in libtool.m4
+libname_spec='lib$name'
+case "$host_os" in
+ aix3*)
+ library_names_spec='$libname.a'
+ ;;
+ aix[4-9]*)
+ library_names_spec='$libname$shrext'
+ ;;
+ amigaos*)
+ case "$host_cpu" in
+ powerpc*)
+ library_names_spec='$libname$shrext' ;;
+ m68k)
+ library_names_spec='$libname.a' ;;
+ esac
+ ;;
+ beos*)
+ library_names_spec='$libname$shrext'
+ ;;
+ bsdi[45]*)
+ library_names_spec='$libname$shrext'
+ ;;
+ cygwin* | mingw* | pw32* | cegcc*)
+ shrext=.dll
+ library_names_spec='$libname.dll.a $libname.lib'
+ ;;
+ darwin* | rhapsody*)
+ shrext=.dylib
+ library_names_spec='$libname$shrext'
+ ;;
+ dgux*)
+ library_names_spec='$libname$shrext'
+ ;;
+ freebsd[23].*)
+ library_names_spec='$libname$shrext$versuffix'
+ ;;
+ freebsd* | dragonfly* | midnightbsd*)
+ library_names_spec='$libname$shrext'
+ ;;
+ gnu*)
+ library_names_spec='$libname$shrext'
+ ;;
+ haiku*)
+ library_names_spec='$libname$shrext'
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $host_cpu in
+ ia64*)
+ shrext=.so
+ ;;
+ hppa*64*)
+ shrext=.sl
+ ;;
+ *)
+ shrext=.sl
+ ;;
+ esac
+ library_names_spec='$libname$shrext'
+ ;;
+ interix[3-9]*)
+ library_names_spec='$libname$shrext'
+ ;;
+ irix5* | irix6* | nonstopux*)
+ library_names_spec='$libname$shrext'
+ case "$host_os" in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
+ *) libsuff= shlibsuff= ;;
+ esac
+ ;;
+ esac
+ ;;
+ linux*oldld* | linux*aout* | linux*coff*)
+ ;;
+ linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ library_names_spec='$libname$shrext'
+ ;;
+ knetbsd*-gnu)
+ library_names_spec='$libname$shrext'
+ ;;
+ netbsd*)
+ library_names_spec='$libname$shrext'
+ ;;
+ newsos6)
+ library_names_spec='$libname$shrext'
+ ;;
+ *nto* | *qnx*)
+ library_names_spec='$libname$shrext'
+ ;;
+ openbsd*)
+ library_names_spec='$libname$shrext$versuffix'
+ ;;
+ os2*)
+ libname_spec='$name'
+ shrext=.dll
+ library_names_spec='$libname.a'
+ ;;
+ osf3* | osf4* | osf5*)
+ library_names_spec='$libname$shrext'
+ ;;
+ rdos*)
+ ;;
+ solaris*)
+ library_names_spec='$libname$shrext'
+ ;;
+ sunos4*)
+ library_names_spec='$libname$shrext$versuffix'
+ ;;
+ sysv4 | sysv4.3*)
+ library_names_spec='$libname$shrext'
+ ;;
+ sysv4*MP*)
+ library_names_spec='$libname$shrext'
+ ;;
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ library_names_spec='$libname$shrext'
+ ;;
+ tpf*)
+ library_names_spec='$libname$shrext'
+ ;;
+ uts4*)
+ library_names_spec='$libname$shrext'
+ ;;
+esac
+
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
+shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
+escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+
+LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
+
+# How to pass a linker flag through the compiler.
+wl="$escaped_wl"
+
+# Static library suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally "so").
+shlibext="$shlibext"
+
+# Format of library name prefix.
+libname_spec="$escaped_libname_spec"
+
+# Library names that the linker finds when passed -lNAME.
+library_names_spec="$escaped_library_names_spec"
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator="$hardcode_libdir_separator"
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct="$hardcode_direct"
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L="$hardcode_minus_L"
+
+EOF
diff --git a/build-aux/config.sub b/build-aux/config.sub
new file mode 100755
index 0000000..de4259e
--- /dev/null
+++ b/build-aux/config.sub
@@ -0,0 +1,1907 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright 1992-2023 Free Software Foundation, Inc.
+
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2023-01-21'
+
+# This file 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 3 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, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program. This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches to <config-patches@gnu.org>.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX. However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
+
+Canonicalize a configuration name.
+
+Options:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2023 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo "$1"
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Split fields of configuration type
+# shellcheck disable=SC2162
+saved_IFS=$IFS
+IFS="-" read field1 field2 field3 field4 <<EOF
+$1
+EOF
+IFS=$saved_IFS
+
+# Separate into logical components for further validation
+case $1 in
+ *-*-*-*-*)
+ echo Invalid configuration \`"$1"\': more than four components >&2
+ exit 1
+ ;;
+ *-*-*-*)
+ basic_machine=$field1-$field2
+ basic_os=$field3-$field4
+ ;;
+ *-*-*)
+ # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
+ # parts
+ maybe_os=$field2-$field3
+ case $maybe_os in
+ nto-qnx* | linux-* | uclinux-uclibc* \
+ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
+ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
+ | storm-chaos* | os2-emx* | rtmk-nova* | managarm-*)
+ basic_machine=$field1
+ basic_os=$maybe_os
+ ;;
+ android-linux)
+ basic_machine=$field1-unknown
+ basic_os=linux-android
+ ;;
+ *)
+ basic_machine=$field1-$field2
+ basic_os=$field3
+ ;;
+ esac
+ ;;
+ *-*)
+ # A lone config we happen to match not fitting any pattern
+ case $field1-$field2 in
+ decstation-3100)
+ basic_machine=mips-dec
+ basic_os=
+ ;;
+ *-*)
+ # Second component is usually, but not always the OS
+ case $field2 in
+ # Prevent following clause from handling this valid os
+ sun*os*)
+ basic_machine=$field1
+ basic_os=$field2
+ ;;
+ zephyr*)
+ basic_machine=$field1-unknown
+ basic_os=$field2
+ ;;
+ # Manufacturers
+ dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
+ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \
+ | unicom* | ibm* | next | hp | isi* | apollo | altos* \
+ | convergent* | ncr* | news | 32* | 3600* | 3100* \
+ | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \
+ | ultra | tti* | harris | dolphin | highlevel | gould \
+ | cbm | ns | masscomp | apple | axis | knuth | cray \
+ | microblaze* | sim | cisco \
+ | oki | wec | wrs | winbond)
+ basic_machine=$field1-$field2
+ basic_os=
+ ;;
+ *)
+ basic_machine=$field1
+ basic_os=$field2
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ *)
+ # Convert single-component short-hands not valid as part of
+ # multi-component configurations.
+ case $field1 in
+ 386bsd)
+ basic_machine=i386-pc
+ basic_os=bsd
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ basic_os=scout
+ ;;
+ alliant)
+ basic_machine=fx80-alliant
+ basic_os=
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ basic_os=
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ basic_os=bsd
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ basic_os=sysv
+ ;;
+ amiga)
+ basic_machine=m68k-unknown
+ basic_os=
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ basic_os=amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ basic_os=sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ basic_os=sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ basic_os=bsd
+ ;;
+ aros)
+ basic_machine=i386-pc
+ basic_os=aros
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ basic_os=aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ basic_os=dynix
+ ;;
+ blackfin)
+ basic_machine=bfin-unknown
+ basic_os=linux
+ ;;
+ cegcc)
+ basic_machine=arm-unknown
+ basic_os=cegcc
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ basic_os=bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ basic_os=bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ basic_os=bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ basic_os=bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ basic_os=bsd
+ ;;
+ cray)
+ basic_machine=j90-cray
+ basic_os=unicos
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ basic_os=
+ ;;
+ da30)
+ basic_machine=m68k-da30
+ basic_os=
+ ;;
+ decstation | pmax | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ basic_os=
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ basic_os=sysv3
+ ;;
+ dicos)
+ basic_machine=i686-pc
+ basic_os=dicos
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ basic_os=msdosdjgpp
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ basic_os=ebmon
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ basic_os=ose
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ basic_os=sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ basic_os=go32
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ basic_os=hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ basic_os=xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ basic_os=hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ basic_os=sysv3
+ ;;
+ hp300 | hp300hpux)
+ basic_machine=m68k-hp
+ basic_os=hpux
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ basic_os=bsd
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ basic_os=osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ basic_os=proelf
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ basic_os=mach
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ basic_os=sysv
+ ;;
+ m68knommu)
+ basic_machine=m68k-unknown
+ basic_os=linux
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ basic_os=sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ basic_os=sysv
+ ;;
+ mingw64)
+ basic_machine=x86_64-pc
+ basic_os=mingw64
+ ;;
+ mingw32)
+ basic_machine=i686-pc
+ basic_os=mingw32
+ ;;
+ mingw32ce)
+ basic_machine=arm-unknown
+ basic_os=mingw32ce
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ basic_os=coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ basic_os=morphos
+ ;;
+ moxiebox)
+ basic_machine=moxie-unknown
+ basic_os=moxiebox
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ basic_os=msdos
+ ;;
+ msys)
+ basic_machine=i686-pc
+ basic_os=msys
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ basic_os=mvs
+ ;;
+ nacl)
+ basic_machine=le32-unknown
+ basic_os=nacl
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ basic_os=sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-pc
+ basic_os=netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ basic_os=linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ basic_os=newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ basic_os=newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ basic_os=sysv
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ basic_os=cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ basic_os=cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ basic_os=nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ basic_os=mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ basic_os=nonstopux
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ basic_os=os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ basic_os=ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ basic_os=os68k
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ basic_os=osf
+ ;;
+ parisc)
+ basic_machine=hppa-unknown
+ basic_os=linux
+ ;;
+ psp)
+ basic_machine=mipsallegrexel-sony
+ basic_os=psp
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ basic_os=pw32
+ ;;
+ rdos | rdos64)
+ basic_machine=x86_64-pc
+ basic_os=rdos
+ ;;
+ rdos32)
+ basic_machine=i386-pc
+ basic_os=rdos
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ basic_os=coff
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ sei)
+ basic_machine=mips-sei
+ basic_os=seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ basic_os=
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ basic_os=sysv2
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ basic_os=
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ basic_os=sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ basic_os=
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ basic_os=sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ basic_os=sunos4
+ ;;
+ sun3)
+ basic_machine=m68k-sun
+ basic_os=
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ basic_os=sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ basic_os=sunos4
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ basic_os=
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ basic_os=sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ basic_os=sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ basic_os=solaris2
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ basic_os=
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ basic_os=unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ basic_os=dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ basic_os=unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ basic_os=unicos
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ basic_os=tops20
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ basic_os=tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ basic_os=sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ basic_os=none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ basic_os=sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ basic_os=vms
+ ;;
+ vsta)
+ basic_machine=i386-pc
+ basic_os=vsta
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ basic_os=vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ basic_os=vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ basic_os=vxworks
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ basic_os=mingw32
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ basic_os=unicos
+ ;;
+ *)
+ basic_machine=$1
+ basic_os=
+ ;;
+ esac
+ ;;
+esac
+
+# Decode 1-component or ad-hoc basic machines
+case $basic_machine in
+ # Here we handle the default manufacturer of certain CPU types. It is in
+ # some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ cpu=hppa1.1
+ vendor=winbond
+ ;;
+ op50n)
+ cpu=hppa1.1
+ vendor=oki
+ ;;
+ op60c)
+ cpu=hppa1.1
+ vendor=oki
+ ;;
+ ibm*)
+ cpu=i370
+ vendor=ibm
+ ;;
+ orion105)
+ cpu=clipper
+ vendor=highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ cpu=m68k
+ vendor=apple
+ ;;
+ pmac | pmac-mpw)
+ cpu=powerpc
+ vendor=apple
+ ;;
+
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ cpu=m68000
+ vendor=att
+ ;;
+ 3b*)
+ cpu=we32k
+ vendor=att
+ ;;
+ bluegene*)
+ cpu=powerpc
+ vendor=ibm
+ basic_os=cnk
+ ;;
+ decsystem10* | dec10*)
+ cpu=pdp10
+ vendor=dec
+ basic_os=tops10
+ ;;
+ decsystem20* | dec20*)
+ cpu=pdp10
+ vendor=dec
+ basic_os=tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ cpu=m68k
+ vendor=motorola
+ ;;
+ dpx2*)
+ cpu=m68k
+ vendor=bull
+ basic_os=sysv3
+ ;;
+ encore | umax | mmax)
+ cpu=ns32k
+ vendor=encore
+ ;;
+ elxsi)
+ cpu=elxsi
+ vendor=elxsi
+ basic_os=${basic_os:-bsd}
+ ;;
+ fx2800)
+ cpu=i860
+ vendor=alliant
+ ;;
+ genix)
+ cpu=ns32k
+ vendor=ns
+ ;;
+ h3050r* | hiux*)
+ cpu=hppa1.1
+ vendor=hitachi
+ basic_os=hiuxwe2
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ cpu=hppa1.0
+ vendor=hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ cpu=m68000
+ vendor=hp
+ ;;
+ hp9k3[2-9][0-9])
+ cpu=m68k
+ vendor=hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ cpu=hppa1.0
+ vendor=hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ cpu=hppa1.0
+ vendor=hp
+ ;;
+ i*86v32)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=sysv32
+ ;;
+ i*86v4*)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=sysv4
+ ;;
+ i*86v)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=sysv
+ ;;
+ i*86sol2)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=solaris2
+ ;;
+ j90 | j90-cray)
+ cpu=j90
+ vendor=cray
+ basic_os=${basic_os:-unicos}
+ ;;
+ iris | iris4d)
+ cpu=mips
+ vendor=sgi
+ case $basic_os in
+ irix*)
+ ;;
+ *)
+ basic_os=irix4
+ ;;
+ esac
+ ;;
+ miniframe)
+ cpu=m68000
+ vendor=convergent
+ ;;
+ *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ cpu=m68k
+ vendor=atari
+ basic_os=mint
+ ;;
+ news-3600 | risc-news)
+ cpu=mips
+ vendor=sony
+ basic_os=newsos
+ ;;
+ next | m*-next)
+ cpu=m68k
+ vendor=next
+ case $basic_os in
+ openstep*)
+ ;;
+ nextstep*)
+ ;;
+ ns2*)
+ basic_os=nextstep2
+ ;;
+ *)
+ basic_os=nextstep3
+ ;;
+ esac
+ ;;
+ np1)
+ cpu=np1
+ vendor=gould
+ ;;
+ op50n-* | op60c-*)
+ cpu=hppa1.1
+ vendor=oki
+ basic_os=proelf
+ ;;
+ pa-hitachi)
+ cpu=hppa1.1
+ vendor=hitachi
+ basic_os=hiuxwe2
+ ;;
+ pbd)
+ cpu=sparc
+ vendor=tti
+ ;;
+ pbb)
+ cpu=m68k
+ vendor=tti
+ ;;
+ pc532)
+ cpu=ns32k
+ vendor=pc532
+ ;;
+ pn)
+ cpu=pn
+ vendor=gould
+ ;;
+ power)
+ cpu=power
+ vendor=ibm
+ ;;
+ ps2)
+ cpu=i386
+ vendor=ibm
+ ;;
+ rm[46]00)
+ cpu=mips
+ vendor=siemens
+ ;;
+ rtpc | rtpc-*)
+ cpu=romp
+ vendor=ibm
+ ;;
+ sde)
+ cpu=mipsisa32
+ vendor=sde
+ basic_os=${basic_os:-elf}
+ ;;
+ simso-wrs)
+ cpu=sparclite
+ vendor=wrs
+ basic_os=vxworks
+ ;;
+ tower | tower-32)
+ cpu=m68k
+ vendor=ncr
+ ;;
+ vpp*|vx|vx-*)
+ cpu=f301
+ vendor=fujitsu
+ ;;
+ w65)
+ cpu=w65
+ vendor=wdc
+ ;;
+ w89k-*)
+ cpu=hppa1.1
+ vendor=winbond
+ basic_os=proelf
+ ;;
+ none)
+ cpu=none
+ vendor=none
+ ;;
+ leon|leon[3-9])
+ cpu=sparc
+ vendor=$basic_machine
+ ;;
+ leon-*|leon[3-9]-*)
+ cpu=sparc
+ vendor=`echo "$basic_machine" | sed 's/-.*//'`
+ ;;
+
+ *-*)
+ # shellcheck disable=SC2162
+ saved_IFS=$IFS
+ IFS="-" read cpu vendor <<EOF
+$basic_machine
+EOF
+ IFS=$saved_IFS
+ ;;
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ cpu=$basic_machine
+ vendor=pc
+ ;;
+ # These rules are duplicated from below for sake of the special case above;
+ # i.e. things that normalized to x86 arches should also default to "pc"
+ pc98)
+ cpu=i386
+ vendor=pc
+ ;;
+ x64 | amd64)
+ cpu=x86_64
+ vendor=pc
+ ;;
+ # Recognize the basic CPU types without company name.
+ *)
+ cpu=$basic_machine
+ vendor=unknown
+ ;;
+esac
+
+unset -v basic_machine
+
+# Decode basic machines in the full and proper CPU-Company form.
+case $cpu-$vendor in
+ # Here we handle the default manufacturer of certain CPU types in canonical form. It is in
+ # some cases the only manufacturer, in others, it is the most popular.
+ craynv-unknown)
+ vendor=cray
+ basic_os=${basic_os:-unicosmp}
+ ;;
+ c90-unknown | c90-cray)
+ vendor=cray
+ basic_os=${Basic_os:-unicos}
+ ;;
+ fx80-unknown)
+ vendor=alliant
+ ;;
+ romp-unknown)
+ vendor=ibm
+ ;;
+ mmix-unknown)
+ vendor=knuth
+ ;;
+ microblaze-unknown | microblazeel-unknown)
+ vendor=xilinx
+ ;;
+ rs6000-unknown)
+ vendor=ibm
+ ;;
+ vax-unknown)
+ vendor=dec
+ ;;
+ pdp11-unknown)
+ vendor=dec
+ ;;
+ we32k-unknown)
+ vendor=att
+ ;;
+ cydra-unknown)
+ vendor=cydrome
+ ;;
+ i370-ibm*)
+ vendor=ibm
+ ;;
+ orion-unknown)
+ vendor=highlevel
+ ;;
+ xps-unknown | xps100-unknown)
+ cpu=xps100
+ vendor=honeywell
+ ;;
+
+ # Here we normalize CPU types with a missing or matching vendor
+ armh-unknown | armh-alt)
+ cpu=armv7l
+ vendor=alt
+ basic_os=${basic_os:-linux-gnueabihf}
+ ;;
+ dpx20-unknown | dpx20-bull)
+ cpu=rs6000
+ vendor=bull
+ basic_os=${basic_os:-bosx}
+ ;;
+
+ # Here we normalize CPU types irrespective of the vendor
+ amd64-*)
+ cpu=x86_64
+ ;;
+ blackfin-*)
+ cpu=bfin
+ basic_os=linux
+ ;;
+ c54x-*)
+ cpu=tic54x
+ ;;
+ c55x-*)
+ cpu=tic55x
+ ;;
+ c6x-*)
+ cpu=tic6x
+ ;;
+ e500v[12]-*)
+ cpu=powerpc
+ basic_os=${basic_os}"spe"
+ ;;
+ mips3*-*)
+ cpu=mips64
+ ;;
+ ms1-*)
+ cpu=mt
+ ;;
+ m68knommu-*)
+ cpu=m68k
+ basic_os=linux
+ ;;
+ m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
+ cpu=s12z
+ ;;
+ openrisc-*)
+ cpu=or32
+ ;;
+ parisc-*)
+ cpu=hppa
+ basic_os=linux
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ cpu=i586
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-* | athlon_*-*)
+ cpu=i686
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ cpu=i686
+ ;;
+ pentium4-*)
+ cpu=i786
+ ;;
+ pc98-*)
+ cpu=i386
+ ;;
+ ppc-* | ppcbe-*)
+ cpu=powerpc
+ ;;
+ ppcle-* | powerpclittle-*)
+ cpu=powerpcle
+ ;;
+ ppc64-*)
+ cpu=powerpc64
+ ;;
+ ppc64le-* | powerpc64little-*)
+ cpu=powerpc64le
+ ;;
+ sb1-*)
+ cpu=mipsisa64sb1
+ ;;
+ sb1el-*)
+ cpu=mipsisa64sb1el
+ ;;
+ sh5e[lb]-*)
+ cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'`
+ ;;
+ spur-*)
+ cpu=spur
+ ;;
+ strongarm-* | thumb-*)
+ cpu=arm
+ ;;
+ tx39-*)
+ cpu=mipstx39
+ ;;
+ tx39el-*)
+ cpu=mipstx39el
+ ;;
+ x64-*)
+ cpu=x86_64
+ ;;
+ xscale-* | xscalee[bl]-*)
+ cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
+ ;;
+ arm64-* | aarch64le-*)
+ cpu=aarch64
+ ;;
+
+ # Recognize the canonical CPU Types that limit and/or modify the
+ # company names they are paired with.
+ cr16-*)
+ basic_os=${basic_os:-elf}
+ ;;
+ crisv32-* | etraxfs*-*)
+ cpu=crisv32
+ vendor=axis
+ ;;
+ cris-* | etrax*-*)
+ cpu=cris
+ vendor=axis
+ ;;
+ crx-*)
+ basic_os=${basic_os:-elf}
+ ;;
+ neo-tandem)
+ cpu=neo
+ vendor=tandem
+ ;;
+ nse-tandem)
+ cpu=nse
+ vendor=tandem
+ ;;
+ nsr-tandem)
+ cpu=nsr
+ vendor=tandem
+ ;;
+ nsv-tandem)
+ cpu=nsv
+ vendor=tandem
+ ;;
+ nsx-tandem)
+ cpu=nsx
+ vendor=tandem
+ ;;
+ mipsallegrexel-sony)
+ cpu=mipsallegrexel
+ vendor=sony
+ ;;
+ tile*-*)
+ basic_os=${basic_os:-linux-gnu}
+ ;;
+
+ *)
+ # Recognize the canonical CPU types that are allowed with any
+ # company name.
+ case $cpu in
+ 1750a | 580 \
+ | a29k \
+ | aarch64 | aarch64_be \
+ | abacus \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
+ | alphapca5[67] | alpha64pca5[67] \
+ | am33_2.0 \
+ | amdgcn \
+ | arc | arceb | arc32 | arc64 \
+ | arm | arm[lb]e | arme[lb] | armv* \
+ | avr | avr32 \
+ | asmjs \
+ | ba \
+ | be32 | be64 \
+ | bfin | bpf | bs2000 \
+ | c[123]* | c30 | [cjt]90 | c4x \
+ | c8051 | clipper | craynv | csky | cydra \
+ | d10v | d30v | dlx | dsp16xx \
+ | e2k | elxsi | epiphany \
+ | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
+ | h8300 | h8500 \
+ | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | hexagon \
+ | i370 | i*86 | i860 | i960 | ia16 | ia64 \
+ | ip2k | iq2000 \
+ | k1om \
+ | le32 | le64 \
+ | lm32 \
+ | loongarch32 | loongarch64 \
+ | m32c | m32r | m32rle \
+ | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
+ | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
+ | m88110 | m88k | maxq | mb | mcore | mep | metag \
+ | microblaze | microblazeel \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64eb | mips64el \
+ | mips64octeon | mips64octeonel \
+ | mips64orion | mips64orionel \
+ | mips64r5900 | mips64r5900el \
+ | mips64vr | mips64vrel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa32r3 | mipsisa32r3el \
+ | mipsisa32r5 | mipsisa32r5el \
+ | mipsisa32r6 | mipsisa32r6el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64r3 | mipsisa64r3el \
+ | mipsisa64r5 | mipsisa64r5el \
+ | mipsisa64r6 | mipsisa64r6el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipsr5900 | mipsr5900el \
+ | mipstx39 | mipstx39el \
+ | mmix \
+ | mn10200 | mn10300 \
+ | moxie \
+ | mt \
+ | msp430 \
+ | nds32 | nds32le | nds32be \
+ | nfp \
+ | nios | nios2 | nios2eb | nios2el \
+ | none | np1 | ns16k | ns32k | nvptx \
+ | open8 \
+ | or1k* \
+ | or32 \
+ | orion \
+ | picochip \
+ | pdp10 | pdp11 | pj | pjl | pn | power \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
+ | pru \
+ | pyramid \
+ | riscv | riscv32 | riscv32be | riscv64 | riscv64be \
+ | rl78 | romp | rs6000 | rx \
+ | s390 | s390x \
+ | score \
+ | sh | shl \
+ | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
+ | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \
+ | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
+ | spu \
+ | tahoe \
+ | thumbv7* \
+ | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
+ | tron \
+ | ubicom32 \
+ | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
+ | vax \
+ | visium \
+ | w65 \
+ | wasm32 | wasm64 \
+ | we32k \
+ | x86 | x86_64 | xc16x | xgate | xps100 \
+ | xstormy16 | xtensa* \
+ | ymp \
+ | z8k | z80)
+ ;;
+
+ *)
+ echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
+ exit 1
+ ;;
+ esac
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $vendor in
+ digital*)
+ vendor=dec
+ ;;
+ commodore*)
+ vendor=cbm
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if test x$basic_os != x
+then
+
+# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just
+# set os.
+case $basic_os in
+ gnu/linux*)
+ kernel=linux
+ os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'`
+ ;;
+ os2-emx)
+ kernel=os2
+ os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'`
+ ;;
+ nto-qnx*)
+ kernel=nto
+ os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'`
+ ;;
+ *-*)
+ # shellcheck disable=SC2162
+ saved_IFS=$IFS
+ IFS="-" read kernel os <<EOF
+$basic_os
+EOF
+ IFS=$saved_IFS
+ ;;
+ # Default OS when just kernel was specified
+ nto*)
+ kernel=nto
+ os=`echo "$basic_os" | sed -e 's|nto|qnx|'`
+ ;;
+ linux*)
+ kernel=linux
+ os=`echo "$basic_os" | sed -e 's|linux|gnu|'`
+ ;;
+ managarm*)
+ kernel=managarm
+ os=`echo "$basic_os" | sed -e 's|managarm|mlibc|'`
+ ;;
+ *)
+ kernel=
+ os=$basic_os
+ ;;
+esac
+
+# Now, normalize the OS (knowing we just have one component, it's not a kernel,
+# etc.)
+case $os in
+ # First match some system type aliases that might get confused
+ # with valid system types.
+ # solaris* is a basic system type, with this one exception.
+ auroraux)
+ os=auroraux
+ ;;
+ bluegene*)
+ os=cnk
+ ;;
+ solaris1 | solaris1.*)
+ os=`echo "$os" | sed -e 's|solaris1|sunos4|'`
+ ;;
+ solaris)
+ os=solaris2
+ ;;
+ unixware*)
+ os=sysv4.2uw
+ ;;
+ # es1800 is here to avoid being matched by es* (a different OS)
+ es1800*)
+ os=ose
+ ;;
+ # Some version numbers need modification
+ chorusos*)
+ os=chorusos
+ ;;
+ isc)
+ os=isc2.2
+ ;;
+ sco6)
+ os=sco5v6
+ ;;
+ sco5)
+ os=sco3.2v5
+ ;;
+ sco4)
+ os=sco3.2v4
+ ;;
+ sco3.2.[4-9]*)
+ os=`echo "$os" | sed -e 's/sco3.2./sco3.2v/'`
+ ;;
+ sco*v* | scout)
+ # Don't match below
+ ;;
+ sco*)
+ os=sco3.2v2
+ ;;
+ psos*)
+ os=psos
+ ;;
+ qnx*)
+ os=qnx
+ ;;
+ hiux*)
+ os=hiuxwe2
+ ;;
+ lynx*178)
+ os=lynxos178
+ ;;
+ lynx*5)
+ os=lynxos5
+ ;;
+ lynxos*)
+ # don't get caught up in next wildcard
+ ;;
+ lynx*)
+ os=lynxos
+ ;;
+ mac[0-9]*)
+ os=`echo "$os" | sed -e 's|mac|macos|'`
+ ;;
+ opened*)
+ os=openedition
+ ;;
+ os400*)
+ os=os400
+ ;;
+ sunos5*)
+ os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
+ ;;
+ sunos6*)
+ os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
+ ;;
+ wince*)
+ os=wince
+ ;;
+ utek*)
+ os=bsd
+ ;;
+ dynix*)
+ os=bsd
+ ;;
+ acis*)
+ os=aos
+ ;;
+ atheos*)
+ os=atheos
+ ;;
+ syllable*)
+ os=syllable
+ ;;
+ 386bsd)
+ os=bsd
+ ;;
+ ctix* | uts*)
+ os=sysv
+ ;;
+ nova*)
+ os=rtmk-nova
+ ;;
+ ns2)
+ os=nextstep2
+ ;;
+ # Preserve the version number of sinix5.
+ sinix5.*)
+ os=`echo "$os" | sed -e 's|sinix|sysv|'`
+ ;;
+ sinix*)
+ os=sysv4
+ ;;
+ tpf*)
+ os=tpf
+ ;;
+ triton*)
+ os=sysv3
+ ;;
+ oss*)
+ os=sysv3
+ ;;
+ svr4*)
+ os=sysv4
+ ;;
+ svr3)
+ os=sysv3
+ ;;
+ sysvr4)
+ os=sysv4
+ ;;
+ ose*)
+ os=ose
+ ;;
+ *mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+ os=mint
+ ;;
+ dicos*)
+ os=dicos
+ ;;
+ pikeos*)
+ # Until real need of OS specific support for
+ # particular features comes up, bare metal
+ # configurations are quite functional.
+ case $cpu in
+ arm*)
+ os=eabi
+ ;;
+ *)
+ os=elf
+ ;;
+ esac
+ ;;
+ *)
+ # No normalization, but not necessarily accepted, that comes below.
+ ;;
+esac
+
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+kernel=
+case $cpu-$vendor in
+ score-*)
+ os=elf
+ ;;
+ spu-*)
+ os=elf
+ ;;
+ *-acorn)
+ os=riscix1.2
+ ;;
+ arm*-rebel)
+ kernel=linux
+ os=gnu
+ ;;
+ arm*-semi)
+ os=aout
+ ;;
+ c4x-* | tic4x-*)
+ os=coff
+ ;;
+ c8051-*)
+ os=elf
+ ;;
+ clipper-intergraph)
+ os=clix
+ ;;
+ hexagon-*)
+ os=elf
+ ;;
+ tic54x-*)
+ os=coff
+ ;;
+ tic55x-*)
+ os=coff
+ ;;
+ tic6x-*)
+ os=coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=tops20
+ ;;
+ pdp11-*)
+ os=none
+ ;;
+ *-dec | vax-*)
+ os=ultrix4.2
+ ;;
+ m68*-apollo)
+ os=domain
+ ;;
+ i386-sun)
+ os=sunos4.0.2
+ ;;
+ m68000-sun)
+ os=sunos3
+ ;;
+ m68*-cisco)
+ os=aout
+ ;;
+ mep-*)
+ os=elf
+ ;;
+ mips*-cisco)
+ os=elf
+ ;;
+ mips*-*)
+ os=elf
+ ;;
+ or32-*)
+ os=coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=sysv3
+ ;;
+ sparc-* | *-sun)
+ os=sunos4.1.1
+ ;;
+ pru-*)
+ os=elf
+ ;;
+ *-be)
+ os=beos
+ ;;
+ *-ibm)
+ os=aix
+ ;;
+ *-knuth)
+ os=mmixware
+ ;;
+ *-wec)
+ os=proelf
+ ;;
+ *-winbond)
+ os=proelf
+ ;;
+ *-oki)
+ os=proelf
+ ;;
+ *-hp)
+ os=hpux
+ ;;
+ *-hitachi)
+ os=hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=sysv
+ ;;
+ *-cbm)
+ os=amigaos
+ ;;
+ *-dg)
+ os=dgux
+ ;;
+ *-dolphin)
+ os=sysv3
+ ;;
+ m68k-ccur)
+ os=rtu
+ ;;
+ m88k-omron*)
+ os=luna
+ ;;
+ *-next)
+ os=nextstep
+ ;;
+ *-sequent)
+ os=ptx
+ ;;
+ *-crds)
+ os=unos
+ ;;
+ *-ns)
+ os=genix
+ ;;
+ i370-*)
+ os=mvs
+ ;;
+ *-gould)
+ os=sysv
+ ;;
+ *-highlevel)
+ os=bsd
+ ;;
+ *-encore)
+ os=bsd
+ ;;
+ *-sgi)
+ os=irix
+ ;;
+ *-siemens)
+ os=sysv4
+ ;;
+ *-masscomp)
+ os=rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=uxpv
+ ;;
+ *-rom68k)
+ os=coff
+ ;;
+ *-*bug)
+ os=coff
+ ;;
+ *-apple)
+ os=macos
+ ;;
+ *-atari*)
+ os=mint
+ ;;
+ *-wrs)
+ os=vxworks
+ ;;
+ *)
+ os=none
+ ;;
+esac
+
+fi
+
+# Now, validate our (potentially fixed-up) OS.
+case $os in
+ # Sometimes we do "kernel-libc", so those need to count as OSes.
+ musl* | newlib* | relibc* | uclibc*)
+ ;;
+ # Likewise for "kernel-abi"
+ eabi* | gnueabi*)
+ ;;
+ # VxWorks passes extra cpu info in the 4th filed.
+ simlinux | simwindows | spe)
+ ;;
+ # Now accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST end in a * to match a version number.
+ gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
+ | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \
+ | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
+ | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \
+ | hiux* | abug | nacl* | netware* | windows* \
+ | os9* | macos* | osx* | ios* \
+ | mpw* | magic* | mmixware* | mon960* | lnews* \
+ | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
+ | aos* | aros* | cloudabi* | sortix* | twizzler* \
+ | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
+ | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
+ | mirbsd* | netbsd* | dicos* | openedition* | ose* \
+ | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \
+ | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
+ | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
+ | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
+ | udi* | lites* | ieee* | go32* | aux* | hcos* \
+ | chorusrdb* | cegcc* | glidix* | serenity* \
+ | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
+ | midipix* | mingw32* | mingw64* | mint* \
+ | uxpv* | beos* | mpeix* | udk* | moxiebox* \
+ | interix* | uwin* | mks* | rhapsody* | darwin* \
+ | openstep* | oskit* | conix* | pw32* | nonstopux* \
+ | storm-chaos* | tops10* | tenex* | tops20* | its* \
+ | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \
+ | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \
+ | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
+ | skyos* | haiku* | rdos* | toppers* | drops* | es* \
+ | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
+ | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
+ | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \
+ | fiwix* | mlibc* )
+ ;;
+ # This one is extra strict with allowed versions
+ sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ ;;
+ none)
+ ;;
+ kernel* )
+ # Restricted further below
+ ;;
+ *)
+ echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# As a final step for OS-related things, validate the OS-kernel combination
+# (given a valid OS), if there is a kernel.
+case $kernel-$os in
+ linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \
+ | linux-musl* | linux-relibc* | linux-uclibc* | linux-mlibc* )
+ ;;
+ uclinux-uclibc* )
+ ;;
+ managarm-mlibc* | managarm-kernel* )
+ ;;
+ -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* | -mlibc* )
+ # These are just libc implementations, not actual OSes, and thus
+ # require a kernel.
+ echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2
+ exit 1
+ ;;
+ -kernel* )
+ echo "Invalid configuration \`$1': \`$os' needs explicit kernel." 1>&2
+ exit 1
+ ;;
+ *-kernel* )
+ echo "Invalid configuration \`$1': \`$kernel' does not support \`$os'." 1>&2
+ exit 1
+ ;;
+ kfreebsd*-gnu* | kopensolaris*-gnu*)
+ ;;
+ vxworks-simlinux | vxworks-simwindows | vxworks-spe)
+ ;;
+ nto-qnx*)
+ ;;
+ os2-emx)
+ ;;
+ *-eabi* | *-gnueabi*)
+ ;;
+ -*)
+ # Blank kernel with real OS is always fine.
+ ;;
+ *-*)
+ echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+case $vendor in
+ unknown)
+ case $cpu-$os in
+ *-riscix*)
+ vendor=acorn
+ ;;
+ *-sunos*)
+ vendor=sun
+ ;;
+ *-cnk* | *-aix*)
+ vendor=ibm
+ ;;
+ *-beos*)
+ vendor=be
+ ;;
+ *-hpux*)
+ vendor=hp
+ ;;
+ *-mpeix*)
+ vendor=hp
+ ;;
+ *-hiux*)
+ vendor=hitachi
+ ;;
+ *-unos*)
+ vendor=crds
+ ;;
+ *-dgux*)
+ vendor=dg
+ ;;
+ *-luna*)
+ vendor=omron
+ ;;
+ *-genix*)
+ vendor=ns
+ ;;
+ *-clix*)
+ vendor=intergraph
+ ;;
+ *-mvs* | *-opened*)
+ vendor=ibm
+ ;;
+ *-os400*)
+ vendor=ibm
+ ;;
+ s390-* | s390x-*)
+ vendor=ibm
+ ;;
+ *-ptx*)
+ vendor=sequent
+ ;;
+ *-tpf*)
+ vendor=ibm
+ ;;
+ *-vxsim* | *-vxworks* | *-windiss*)
+ vendor=wrs
+ ;;
+ *-aux*)
+ vendor=apple
+ ;;
+ *-hms*)
+ vendor=hitachi
+ ;;
+ *-mpw* | *-macos*)
+ vendor=apple
+ ;;
+ *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*)
+ vendor=atari
+ ;;
+ *-vos*)
+ vendor=stratus
+ ;;
+ esac
+ ;;
+esac
+
+echo "$cpu-$vendor-${kernel:+$kernel-}$os"
+exit
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/build-aux/depcomp b/build-aux/depcomp
new file mode 100755
index 0000000..ce5c2f7
--- /dev/null
+++ b/build-aux/depcomp
@@ -0,0 +1,790 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2022-09-18.14; # UTC
+
+# Copyright (C) 1999-2023 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+ '')
+ echo "$0: No command. Try '$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+ depmode Dependency tracking mode.
+ source Source file read by 'PROGRAMS ARGS'.
+ object Object file output by 'PROGRAMS ARGS'.
+ DEPDIR directory where to store dependencies.
+ depfile Dependency file to output.
+ tmpdepfile Temporary file to use when outputting dependencies.
+ libtool Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "depcomp $scriptversion"
+ exit $?
+ ;;
+esac
+
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'. Note that this directory component will
+# be either empty or ending with a '/' character. This is deliberate.
+set_dir_from ()
+{
+ case $1 in
+ */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+ *) dir=;;
+ esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+ base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+ echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+ # If the compiler actually managed to produce a dependency file,
+ # post-process it.
+ if test -f "$tmpdepfile"; then
+ # Each line is of the form 'foo.o: dependency.h'.
+ # Do two passes, one to just change these to
+ # $object: dependency.h
+ # and one to simply output
+ # dependency.h:
+ # which is needed to avoid the deleted-header problem.
+ { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+ sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+ } > "$depfile"
+ rm -f "$tmpdepfile"
+ else
+ make_dummy_depfile
+ fi
+}
+
+# A tabulation character.
+tab=' '
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+alpha=${upper}${lower}
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+ echo "depcomp: Variables source, object and depmode must be set" 1>&2
+ exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+ sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
+# Some modes work just like other modes, but use different flags. We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write. Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+ # HP compiler uses -M and no extra arg.
+ gccflag=-M
+ depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+ # This is just like dashmstdout with a different argument.
+ dashmflag=-xM
+ depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+ # This is just like msvisualcpp but w/o cygpath translation.
+ # Just convert the backslash-escaped backslashes to single forward
+ # slashes to satisfy depend.m4
+ cygpath_u='sed s,\\\\,/,g'
+ depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+ # This is just like msvc7 but w/o cygpath translation.
+ # Just convert the backslash-escaped backslashes to single forward
+ # slashes to satisfy depend.m4
+ cygpath_u='sed s,\\\\,/,g'
+ depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+ # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
+ gccflag=-qmakedep=gcc,-MF
+ depmode=gcc
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want. Yay! Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff. Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am. Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+ for arg
+ do
+ case $arg in
+ -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+ *) set fnord "$@" "$arg" ;;
+ esac
+ shift # fnord
+ shift # $arg
+ done
+ "$@"
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## Note that this doesn't just cater to obsolete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
+## There are various ways to get dependency output from gcc. Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+## up in a subdir. Having to rename by hand is ugly.
+## (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+## -MM, not -M (despite what the docs say). Also, it might not be
+## supported by the other compilers which use the 'gcc' depmode.
+## - Using -M directly means running the compiler twice (even worse
+## than renaming).
+ if test -z "$gccflag"; then
+ gccflag=-MD,
+ fi
+ "$@" -Wp,"$gccflag$tmpdepfile"
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ # The second -e expression handles DOS-style file names with drive
+ # letters.
+ sed -e 's/^[^:]*: / /' \
+ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the "deleted header file" problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header). We avoid this by adding
+## dummy dependencies for each header file. Too bad gcc doesn't do
+## this for us directly.
+## Some versions of gcc put a space before the ':'. On the theory
+## that the space means something, we add a space to the output as
+## well. hp depmode also adds that space, but also prefixes the VPATH
+## to the object. Take care to not repeat it in the output.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+ | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+sgi)
+ if test "$libtool" = yes; then
+ "$@" "-Wp,-MDupdate,$tmpdepfile"
+ else
+ "$@" -MDupdate "$tmpdepfile"
+ fi
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+
+ if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
+ echo "$object : \\" > "$depfile"
+ # Clip off the initial element (the dependent). Don't try to be
+ # clever and replace this with sed code, as IRIX sed won't handle
+ # lines with more than a fixed number of characters (4096 in
+ # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
+ # the IRIX cc adds comments like '#:fec' to the end of the
+ # dependency line.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+ | tr "$nl" ' ' >> "$depfile"
+ echo >> "$depfile"
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> "$depfile"
+ else
+ make_dummy_depfile
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+xlc)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+aix)
+ # The C for AIX Compiler uses -M and outputs the dependencies
+ # in a .u file. In older versions, this file always lives in the
+ # current directory. Also, the AIX compiler puts '$object:' at the
+ # start of each line; $object doesn't have directory information.
+ # Version 6 uses the directory in both cases.
+ set_dir_from "$object"
+ set_base_from "$object"
+ if test "$libtool" = yes; then
+ tmpdepfile1=$dir$base.u
+ tmpdepfile2=$base.u
+ tmpdepfile3=$dir.libs/$base.u
+ "$@" -Wc,-M
+ else
+ tmpdepfile1=$dir$base.u
+ tmpdepfile2=$dir$base.u
+ tmpdepfile3=$dir$base.u
+ "$@" -M
+ fi
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ aix_post_process_depfile
+ ;;
+
+tcc)
+ # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+ # FIXME: That version still under development at the moment of writing.
+ # Make that this statement remains true also for stable, released
+ # versions.
+ # It will wrap lines (doesn't matter whether long or short) with a
+ # trailing '\', as in:
+ #
+ # foo.o : \
+ # foo.c \
+ # foo.h \
+ #
+ # It will put a trailing '\' even on the last line, and will use leading
+ # spaces rather than leading tabs (at least since its commit 0394caf7
+ # "Emit spaces for -MD").
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+ # We have to change lines of the first kind to '$object: \'.
+ sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+ # And for each line of the second kind, we have to emit a 'dep.h:'
+ # dummy dependency, to avoid the deleted-header problem.
+ sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file. A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+ # Portland's C compiler understands '-MD'.
+ # Will always output deps to 'file.d' where file is the root name of the
+ # source file under compilation, even if file resides in a subdirectory.
+ # The object file name does not affect the name of the '.d' file.
+ # pgcc 10.2 will output
+ # foo.o: sub/foo.c sub/foo.h
+ # and will wrap long lines using '\' :
+ # foo.o: sub/foo.c ... \
+ # sub/foo.h ... \
+ # ...
+ set_dir_from "$object"
+ # Use the source, not the object, to determine the base name, since
+ # that's sadly what pgcc will do too.
+ set_base_from "$source"
+ tmpdepfile=$base.d
+
+ # For projects that build the same source file twice into different object
+ # files, the pgcc approach of using the *source* file root name can cause
+ # problems in parallel builds. Use a locking strategy to avoid stomping on
+ # the same $tmpdepfile.
+ lockdir=$base.d-lock
+ trap "
+ echo '$0: caught signal, cleaning up...' >&2
+ rmdir '$lockdir'
+ exit 1
+ " 1 2 13 15
+ numtries=100
+ i=$numtries
+ while test $i -gt 0; do
+ # mkdir is a portable test-and-set.
+ if mkdir "$lockdir" 2>/dev/null; then
+ # This process acquired the lock.
+ "$@" -MD
+ stat=$?
+ # Release the lock.
+ rmdir "$lockdir"
+ break
+ else
+ # If the lock is being held by a different process, wait
+ # until the winning process is done or we timeout.
+ while test -d "$lockdir" && test $i -gt 0; do
+ sleep 1
+ i=`expr $i - 1`
+ done
+ fi
+ i=`expr $i - 1`
+ done
+ trap - 1 2 13 15
+ if test $i -le 0; then
+ echo "$0: failed to acquire lock after $numtries attempts" >&2
+ echo "$0: check lockdir '$lockdir'" >&2
+ exit 1
+ fi
+
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ # Each line is of the form `foo.o: dependent.h',
+ # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+ | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp2)
+ # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+ # compilers, which have integrated preprocessors. The correct option
+ # to use with these is +Maked; it writes dependencies to a file named
+ # 'foo.d', which lands next to the object file, wherever that
+ # happens to be.
+ # Much of this is similar to the tru64 case; see comments there.
+ set_dir_from "$object"
+ set_base_from "$object"
+ if test "$libtool" = yes; then
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir.libs/$base.d
+ "$@" -Wc,+Maked
+ else
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir$base.d
+ "$@" +Maked
+ fi
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile1" "$tmpdepfile2"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+ # Add 'dependent.h:' lines.
+ sed -ne '2,${
+ s/^ *//
+ s/ \\*$//
+ s/$/:/
+ p
+ }' "$tmpdepfile" >> "$depfile"
+ else
+ make_dummy_depfile
+ fi
+ rm -f "$tmpdepfile" "$tmpdepfile2"
+ ;;
+
+tru64)
+ # The Tru64 compiler uses -MD to generate dependencies as a side
+ # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+ # dependencies in 'foo.d' instead, so we check for that too.
+ # Subdirectories are respected.
+ set_dir_from "$object"
+ set_base_from "$object"
+
+ if test "$libtool" = yes; then
+ # Libtool generates 2 separate objects for the 2 libraries. These
+ # two compilations output dependencies in $dir.libs/$base.o.d and
+ # in $dir$base.o.d. We have to check for both files, because
+ # one of the two compilations can be disabled. We should prefer
+ # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+ # automatically cleaned when .libs/ is deleted, while ignoring
+ # the former would cause a distcleancheck panic.
+ tmpdepfile1=$dir$base.o.d # libtool 1.5
+ tmpdepfile2=$dir.libs/$base.o.d # Likewise.
+ tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir$base.d
+ tmpdepfile3=$dir$base.d
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ # Same post-processing that is required for AIX mode.
+ aix_post_process_depfile
+ ;;
+
+msvc7)
+ if test "$libtool" = yes; then
+ showIncludes=-Wc,-showIncludes
+ else
+ showIncludes=-showIncludes
+ fi
+ "$@" $showIncludes > "$tmpdepfile"
+ stat=$?
+ grep -v '^Note: including file: ' "$tmpdepfile"
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ # The first sed program below extracts the file names and escapes
+ # backslashes for cygpath. The second sed program outputs the file
+ # name when reading, but also accumulates all include files in the
+ # hold buffer in order to output them again at the end. This only
+ # works with sed implementations that can handle large buffers.
+ sed < "$tmpdepfile" -n '
+/^Note: including file: *\(.*\)/ {
+ s//\1/
+ s/\\/\\\\/g
+ p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/'"$tab"'\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+ s/.*/'"$tab"'/
+ G
+ p
+}' >> "$depfile"
+ echo >> "$depfile" # make sure the fragment doesn't end with a backslash
+ rm -f "$tmpdepfile"
+ ;;
+
+msvc7msys)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+#nosideeffect)
+ # This comment above is used by automake to tell side-effect
+ # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove '-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ test -z "$dashmflag" && dashmflag=-M
+ # Require at least two characters before searching for ':'
+ # in the target name. This is to cope with DOS-style filenames:
+ # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
+ "$@" $dashmflag |
+ sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this sed invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+ | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+dashXmstdout)
+ # This case only exists to satisfy depend.m4. It is never actually
+ # run, as this mode is specially recognized in the preamble.
+ exit 1
+ ;;
+
+makedepend)
+ "$@" || exit $?
+ # Remove any Libtool call
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+ # X makedepend
+ shift
+ cleared=no eat=no
+ for arg
+ do
+ case $cleared in
+ no)
+ set ""; shift
+ cleared=yes ;;
+ esac
+ if test $eat = yes; then
+ eat=no
+ continue
+ fi
+ case "$arg" in
+ -D*|-I*)
+ set fnord "$@" "$arg"; shift ;;
+ # Strip any option that makedepend may not understand. Remove
+ # the object too, otherwise makedepend will parse it as a source file.
+ -arch)
+ eat=yes ;;
+ -*|$object)
+ ;;
+ *)
+ set fnord "$@" "$arg"; shift ;;
+ esac
+ done
+ obj_suffix=`echo "$object" | sed 's/^.*\././'`
+ touch "$tmpdepfile"
+ ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+ rm -f "$depfile"
+ # makedepend may prepend the VPATH from the source file name to the object.
+ # No need to regex-escape $object, excess matching of '.' is harmless.
+ sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process the last invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed '1,2d' "$tmpdepfile" \
+ | tr ' ' "$nl" \
+ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+ | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile" "$tmpdepfile".bak
+ ;;
+
+cpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove '-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ "$@" -E \
+ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+ | sed '$ s: \\$::' > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ cat < "$tmpdepfile" >> "$depfile"
+ sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvisualcpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ IFS=" "
+ for arg
+ do
+ case "$arg" in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+ set fnord "$@"
+ shift
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
+ esac
+ done
+ "$@" -E 2>/dev/null |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+ echo "$tab" >> "$depfile"
+ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvcmsys)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+none)
+ exec "$@"
+ ;;
+
+*)
+ echo "Unknown depmode $depmode" 1>&2
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/git-version-gen b/build-aux/git-version-gen
new file mode 100755
index 0000000..a72057b
--- /dev/null
+++ b/build-aux/git-version-gen
@@ -0,0 +1,227 @@
+#!/bin/sh
+# Print a version string.
+scriptversion=2022-07-09.08; # UTC
+
+# Copyright (C) 2007-2023 Free Software Foundation, Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 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, see <https://www.gnu.org/licenses/>.
+
+# This script is derived from GIT-VERSION-GEN from GIT: https://git-scm.com/.
+# It may be run two ways:
+# - from a git repository in which the "git describe" command below
+# produces useful output (thus requiring at least one signed tag)
+# - from a non-git-repo directory containing a .tarball-version file, which
+# presumes this script is invoked like "./git-version-gen .tarball-version".
+
+# In order to use intra-version strings in your project, you will need two
+# separate generated version string files:
+#
+# .tarball-version - present only in a distribution tarball, and not in
+# a checked-out repository. Created with contents that were learned at
+# the last time autoconf was run, and used by git-version-gen. Must not
+# be present in either $(srcdir) or $(builddir) for git-version-gen to
+# give accurate answers during normal development with a checked out tree,
+# but must be present in a tarball when there is no version control system.
+# Therefore, it cannot be used in any dependencies. GNUmakefile has
+# hooks to force a reconfigure at distribution time to get the value
+# correct, without penalizing normal development with extra reconfigures.
+#
+# .version - present in a checked-out repository and in a distribution
+# tarball. Usable in dependencies, particularly for files that don't
+# want to depend on config.h but do want to track version changes.
+# Delete this file prior to any autoconf run where you want to rebuild
+# files to pick up a version string change; and leave it stale to
+# minimize rebuild time after unrelated changes to configure sources.
+#
+# As with any generated file in a VC'd directory, you should add
+# /.version to .gitignore, so that you don't accidentally commit it.
+# .tarball-version is never generated in a VC'd directory, so needn't
+# be listed there.
+#
+# Use the following line in your configure.ac, so that $(VERSION) will
+# automatically be up-to-date each time configure is run (and note that
+# since configure.ac no longer includes a version string, Makefile rules
+# should not depend on configure.ac for version updates).
+#
+# AC_INIT([GNU project],
+# m4_esyscmd([build-aux/git-version-gen .tarball-version]),
+# [bug-project@example])
+#
+# Then use the following lines in your Makefile.am, so that .version
+# will be present for dependencies, and so that .version and
+# .tarball-version will exist in distribution tarballs.
+#
+# EXTRA_DIST = $(top_srcdir)/.version
+# BUILT_SOURCES = $(top_srcdir)/.version
+# $(top_srcdir)/.version:
+# echo '$(VERSION)' > $@-t
+# mv $@-t $@
+# dist-hook:
+# echo '$(VERSION)' > $(distdir)/.tarball-version
+
+
+me=$0
+
+year=`expr "$scriptversion" : '\([^-]*\)'`
+version="git-version-gen $scriptversion
+
+Copyright (C) ${year} Free Software Foundation, Inc.
+License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law."
+
+usage="\
+Usage: $me [OPTION]... \$srcdir/.tarball-version [TAG-NORMALIZATION-SED-SCRIPT]
+Print a version string.
+
+Options:
+
+ --prefix PREFIX prefix of git tags (default 'v')
+ --fallback VERSION
+ fallback version to use if \"git --version\" fails
+
+ --help display this help and exit
+ --version output version information and exit
+
+Send patches and bug reports to <bug-gnulib@gnu.org>."
+
+prefix=v
+fallback=
+
+while test $# -gt 0; do
+ case $1 in
+ --help) echo "$usage"; exit 0;;
+ --version) echo "$version"; exit 0;;
+ --prefix) shift; prefix=${1?};;
+ --fallback) shift; fallback=${1?};;
+ -*)
+ echo "$0: Unknown option '$1'." >&2
+ echo "$0: Try '--help' for more information." >&2
+ exit 1;;
+ *)
+ if test "x$tarball_version_file" = x; then
+ tarball_version_file="$1"
+ elif test "x$tag_sed_script" = x; then
+ tag_sed_script="$1"
+ else
+ echo "$0: extra non-option argument '$1'." >&2
+ exit 1
+ fi;;
+ esac
+ shift
+done
+
+if test "x$tarball_version_file" = x; then
+ echo "$usage"
+ exit 1
+fi
+
+tag_sed_script="${tag_sed_script:-s/x/x/}"
+
+nl='
+'
+
+# Avoid meddling by environment variable of the same name.
+v=
+v_from_git=
+
+# First see if there is a tarball-only version file.
+# then try "git describe", then default.
+if test -f $tarball_version_file
+then
+ v=`cat $tarball_version_file` || v=
+ case $v in
+ *$nl*) v= ;; # reject multi-line output
+ esac
+ test "x$v" = x \
+ && echo "$0: WARNING: $tarball_version_file is damaged" 1>&2
+fi
+
+if test "x$v" != x
+then
+ : # use $v
+# Otherwise, if there is at least one git commit involving the working
+# directory, and "git describe" output looks sensible, use that to
+# derive a version string.
+elif test "`git log -1 --pretty=format:x . 2>&1`" = x \
+ && v=`git describe --abbrev=4 --match="$prefix*" HEAD 2>/dev/null \
+ || git describe --abbrev=4 HEAD 2>/dev/null` \
+ && v=`printf '%s\n' "$v" | sed "$tag_sed_script"` \
+ && case $v in
+ $prefix[0-9]*) ;;
+ *) (exit 1) ;;
+ esac
+then
+ # Is this a new git that lists number of commits since the last
+ # tag or the previous older version that did not?
+ # Newer: v6.10-77-g0f8faeb
+ # Older: v6.10-g0f8faeb
+ vprefix=`expr "X$v" : 'X\(.*\)-g[^-]*$'` || vprefix=$v
+ case $vprefix in
+ *-*) : git describe is probably okay three part flavor ;;
+ *)
+ : git describe is older two part flavor
+ # Recreate the number of commits and rewrite such that the
+ # result is the same as if we were using the newer version
+ # of git describe.
+ vtag=`echo "$v" | sed 's/-.*//'`
+ commit_list=`git rev-list "$vtag"..HEAD 2>/dev/null` \
+ || { commit_list=failed;
+ echo "$0: WARNING: git rev-list failed" 1>&2; }
+ numcommits=`echo "$commit_list" | wc -l`
+ v=`echo "$v" | sed "s/\(.*\)-\(.*\)/\1-$numcommits-\2/"`;
+ test "$commit_list" = failed && v=UNKNOWN
+ ;;
+ esac
+
+ # Change the penultimate "-" to ".", for version-comparing tools.
+ # Remove the "g" to save a byte.
+ v=`echo "$v" | sed 's/-\([^-]*\)-g\([^-]*\)$/.\1-\2/'`;
+ v_from_git=1
+elif test "x$fallback" = x || git --version >/dev/null 2>&1; then
+ v=UNKNOWN
+else
+ v=$fallback
+fi
+
+v=`echo "$v" |sed "s/^$prefix//"`
+
+# Test whether to append the "-dirty" suffix only if the version
+# string we're using came from git. I.e., skip the test if it's "UNKNOWN"
+# or if it came from .tarball-version.
+if test "x$v_from_git" != x; then
+ # Don't declare a version "dirty" merely because a timestamp has changed.
+ git update-index --refresh > /dev/null 2>&1
+
+ dirty=`exec 2>/dev/null;git diff-index --name-only HEAD` || dirty=
+ case "$dirty" in
+ '') ;;
+ *) # Append the suffix only if there isn't one already.
+ case $v in
+ *-dirty) ;;
+ *) v="$v-dirty" ;;
+ esac ;;
+ esac
+fi
+
+# Omit the trailing newline, so that m4_esyscmd can use the result directly.
+printf %s "$v"
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/install-sh b/build-aux/install-sh
new file mode 100755
index 0000000..ec298b5
--- /dev/null
+++ b/build-aux/install-sh
@@ -0,0 +1,541 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2020-11-14.01; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# 'make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+tab=' '
+nl='
+'
+IFS=" $tab$nl"
+
+# Set DOITPROG to "echo" to test this script.
+
+doit=${DOITPROG-}
+doit_exec=${doit:-exec}
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+# Create dirs (including intermediate dirs) using mode 755.
+# This is like GNU 'install' as of coreutils 8.32 (2020).
+mkdir_umask=22
+
+backupsuffix=
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+is_target_a_directory=possibly
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+ or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+ --help display this help and exit.
+ --version display version info and exit.
+
+ -c (ignored)
+ -C install only if different (preserve data modification time)
+ -d create directories instead of installing files.
+ -g GROUP $chgrpprog installed files to GROUP.
+ -m MODE $chmodprog installed files to MODE.
+ -o USER $chownprog installed files to USER.
+ -p pass -p to $cpprog.
+ -s $stripprog installed files.
+ -S SUFFIX attempt to back up existing files, with suffix SUFFIX.
+ -t DIRECTORY install into DIRECTORY.
+ -T report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+ RMPROG STRIPPROG
+
+By default, rm is invoked with -f; when overridden with RMPROG,
+it's up to you to specify -f if you want it.
+
+If -S is not specified, no backups are attempted.
+
+Email bug reports to bug-automake@gnu.org.
+Automake home page: https://www.gnu.org/software/automake/
+"
+
+while test $# -ne 0; do
+ case $1 in
+ -c) ;;
+
+ -C) copy_on_change=true;;
+
+ -d) dir_arg=true;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift;;
+
+ --help) echo "$usage"; exit $?;;
+
+ -m) mode=$2
+ case $mode in
+ *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+ echo "$0: invalid mode: $mode" >&2
+ exit 1;;
+ esac
+ shift;;
+
+ -o) chowncmd="$chownprog $2"
+ shift;;
+
+ -p) cpprog="$cpprog -p";;
+
+ -s) stripcmd=$stripprog;;
+
+ -S) backupsuffix="$2"
+ shift;;
+
+ -t)
+ is_target_a_directory=always
+ dst_arg=$2
+ # Protect names problematic for 'test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
+ shift;;
+
+ -T) is_target_a_directory=never;;
+
+ --version) echo "$0 $scriptversion"; exit $?;;
+
+ --) shift
+ break;;
+
+ -*) echo "$0: invalid option: $1" >&2
+ exit 1;;
+
+ *) break;;
+ esac
+ shift
+done
+
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+ if test -n "$dst_arg"; then
+ echo "$0: target directory not allowed when installing a directory." >&2
+ exit 1
+ fi
+fi
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+ # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dst_arg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dst_arg"
+ shift # fnord
+ fi
+ shift # arg
+ dst_arg=$arg
+ # Protect names problematic for 'test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
+ done
+fi
+
+if test $# -eq 0; then
+ if test -z "$dir_arg"; then
+ echo "$0: no input file specified." >&2
+ exit 1
+ fi
+ # It's OK to call 'install-sh -d' without argument.
+ # This can happen when creating conditional directories.
+ exit 0
+fi
+
+if test -z "$dir_arg"; then
+ if test $# -gt 1 || test "$is_target_a_directory" = always; then
+ if test ! -d "$dst_arg"; then
+ echo "$0: $dst_arg: Is not a directory." >&2
+ exit 1
+ fi
+ fi
+fi
+
+if test -z "$dir_arg"; then
+ do_exit='(exit $ret); exit $ret'
+ trap "ret=129; $do_exit" 1
+ trap "ret=130; $do_exit" 2
+ trap "ret=141; $do_exit" 13
+ trap "ret=143; $do_exit" 15
+
+ # Set umask so as not to create temps with too-generous modes.
+ # However, 'strip' requires both read and write access to temps.
+ case $mode in
+ # Optimize common cases.
+ *644) cp_umask=133;;
+ *755) cp_umask=22;;
+
+ *[0-7])
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw='% 200'
+ fi
+ cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+ *)
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw=,u+rw
+ fi
+ cp_umask=$mode$u_plus_rw;;
+ esac
+fi
+
+for src
+do
+ # Protect names problematic for 'test' and other utilities.
+ case $src in
+ -* | [=\(\)!]) src=./$src;;
+ esac
+
+ if test -n "$dir_arg"; then
+ dst=$src
+ dstdir=$dst
+ test -d "$dstdir"
+ dstdir_status=$?
+ # Don't chown directories that already exist.
+ if test $dstdir_status = 0; then
+ chowncmd=""
+ fi
+ else
+
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dst_arg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+ dst=$dst_arg
+
+ # If destination is a directory, append the input filename.
+ if test -d "$dst"; then
+ if test "$is_target_a_directory" = never; then
+ echo "$0: $dst_arg: Is a directory" >&2
+ exit 1
+ fi
+ dstdir=$dst
+ dstbase=`basename "$src"`
+ case $dst in
+ */) dst=$dst$dstbase;;
+ *) dst=$dst/$dstbase;;
+ esac
+ dstdir_status=0
+ else
+ dstdir=`dirname "$dst"`
+ test -d "$dstdir"
+ dstdir_status=$?
+ fi
+ fi
+
+ case $dstdir in
+ */) dstdirslash=$dstdir;;
+ *) dstdirslash=$dstdir/;;
+ esac
+
+ obsolete_mkdir_used=false
+
+ if test $dstdir_status != 0; then
+ case $posix_mkdir in
+ '')
+ # With -d, create the new directory with the user-specified mode.
+ # Otherwise, rely on $mkdir_umask.
+ if test -n "$dir_arg"; then
+ mkdir_mode=-m$mode
+ else
+ mkdir_mode=
+ fi
+
+ posix_mkdir=false
+ # The $RANDOM variable is not portable (e.g., dash). Use it
+ # here however when possible just to lower collision chance.
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+
+ trap '
+ ret=$?
+ rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
+ exit $ret
+ ' 0
+
+ # Because "mkdir -p" follows existing symlinks and we likely work
+ # directly in world-writeable /tmp, make sure that the '$tmpdir'
+ # directory is successfully created first before we actually test
+ # 'mkdir -p'.
+ if (umask $mkdir_umask &&
+ $mkdirprog $mkdir_mode "$tmpdir" &&
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+ then
+ if test -z "$dir_arg" || {
+ # Check for POSIX incompatibilities with -m.
+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+ # other-writable bit of parent directory when it shouldn't.
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+ test_tmpdir="$tmpdir/a"
+ ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+ case $ls_ld_tmpdir in
+ d????-?r-*) different_mode=700;;
+ d????-?--*) different_mode=755;;
+ *) false;;
+ esac &&
+ $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+ ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+ }
+ }
+ then posix_mkdir=:
+ fi
+ rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+ else
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+ fi
+ trap '' 0;;
+ esac
+
+ if
+ $posix_mkdir && (
+ umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+ )
+ then :
+ else
+
+ # mkdir does not conform to POSIX,
+ # or it failed possibly due to a race condition. Create the
+ # directory the slow way, step by step, checking for races as we go.
+
+ case $dstdir in
+ /*) prefix='/';;
+ [-=\(\)!]*) prefix='./';;
+ *) prefix='';;
+ esac
+
+ oIFS=$IFS
+ IFS=/
+ set -f
+ set fnord $dstdir
+ shift
+ set +f
+ IFS=$oIFS
+
+ prefixes=
+
+ for d
+ do
+ test X"$d" = X && continue
+
+ prefix=$prefix$d
+ if test -d "$prefix"; then
+ prefixes=
+ else
+ if $posix_mkdir; then
+ (umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+ # Don't fail if two instances are running concurrently.
+ test -d "$prefix" || exit 1
+ else
+ case $prefix in
+ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) qprefix=$prefix;;
+ esac
+ prefixes="$prefixes '$qprefix'"
+ fi
+ fi
+ prefix=$prefix/
+ done
+
+ if test -n "$prefixes"; then
+ # Don't fail if two instances are running concurrently.
+ (umask $mkdir_umask &&
+ eval "\$doit_exec \$mkdirprog $prefixes") ||
+ test -d "$dstdir" || exit 1
+ obsolete_mkdir_used=true
+ fi
+ fi
+ fi
+
+ if test -n "$dir_arg"; then
+ { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+ { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+ else
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=${dstdirslash}_inst.$$_
+ rmtmp=${dstdirslash}_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+ # Copy the file name to the temp name.
+ (umask $cp_umask &&
+ { test -z "$stripcmd" || {
+ # Create $dsttmp read-write so that cp doesn't create it read-only,
+ # which would cause strip to fail.
+ if test -z "$doit"; then
+ : >"$dsttmp" # No need to fork-exec 'touch'.
+ else
+ $doit touch "$dsttmp"
+ fi
+ }
+ } &&
+ $doit_exec $cpprog "$src" "$dsttmp") &&
+
+ # and set any options; do chmod last to preserve setuid bits.
+ #
+ # If any of these fail, we abort the whole thing. If we want to
+ # ignore errors from any of these, just make sure not to ignore
+ # errors from the above "$doit $cpprog $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+ { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+ { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+ # If -C, don't bother to copy if it wouldn't change the file.
+ if $copy_on_change &&
+ old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
+ new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+ set -f &&
+ set X $old && old=:$2:$4:$5:$6 &&
+ set X $new && new=:$2:$4:$5:$6 &&
+ set +f &&
+ test "$old" = "$new" &&
+ $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+ then
+ rm -f "$dsttmp"
+ else
+ # If $backupsuffix is set, and the file being installed
+ # already exists, attempt a backup. Don't worry if it fails,
+ # e.g., if mv doesn't support -f.
+ if test -n "$backupsuffix" && test -f "$dst"; then
+ $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
+ fi
+
+ # Rename the file to the real destination.
+ $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+ {
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ test ! -f "$dst" ||
+ $doit $rmcmd "$dst" 2>/dev/null ||
+ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+ { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
+ } ||
+ { echo "$0: cannot unlink or rename $dst" >&2
+ (exit 1); exit 1
+ }
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dst"
+ }
+ fi || exit 1
+
+ trap '' 0
+ fi
+done
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/missing b/build-aux/missing
new file mode 100755
index 0000000..1fe1611
--- /dev/null
+++ b/build-aux/missing
@@ -0,0 +1,215 @@
+#! /bin/sh
+# Common wrapper for a few potentially missing GNU programs.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try '$0 --help' for more information"
+ exit 1
+fi
+
+case $1 in
+
+ --is-lightweight)
+ # Used by our autoconf macros to check whether the available missing
+ # script is modern enough.
+ exit 0
+ ;;
+
+ --run)
+ # Back-compat with the calling convention used by older automake.
+ shift
+ ;;
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
+to PROGRAM being missing or too old.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+
+Supported PROGRAM values:
+ aclocal autoconf autoheader autom4te automake makeinfo
+ bison yacc flex lex help2man
+
+Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
+'g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+ exit $?
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing $scriptversion (GNU Automake)"
+ exit $?
+ ;;
+
+ -*)
+ echo 1>&2 "$0: unknown '$1' option"
+ echo 1>&2 "Try '$0 --help' for more information"
+ exit 1
+ ;;
+
+esac
+
+# Run the given program, remember its exit status.
+"$@"; st=$?
+
+# If it succeeded, we are done.
+test $st -eq 0 && exit 0
+
+# Also exit now if we it failed (or wasn't found), and '--version' was
+# passed; such an option is passed most likely to detect whether the
+# program is present and works.
+case $2 in --version|--help) exit $st;; esac
+
+# Exit code 63 means version mismatch. This often happens when the user
+# tries to use an ancient version of a tool on a file that requires a
+# minimum version.
+if test $st -eq 63; then
+ msg="probably too old"
+elif test $st -eq 127; then
+ # Program was missing.
+ msg="missing on your system"
+else
+ # Program was found and executed, but failed. Give up.
+ exit $st
+fi
+
+perl_URL=https://www.perl.org/
+flex_URL=https://github.com/westes/flex
+gnu_software_URL=https://www.gnu.org/software
+
+program_details ()
+{
+ case $1 in
+ aclocal|automake)
+ echo "The '$1' program is part of the GNU Automake package:"
+ echo "<$gnu_software_URL/automake>"
+ echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
+ echo "<$gnu_software_URL/autoconf>"
+ echo "<$gnu_software_URL/m4/>"
+ echo "<$perl_URL>"
+ ;;
+ autoconf|autom4te|autoheader)
+ echo "The '$1' program is part of the GNU Autoconf package:"
+ echo "<$gnu_software_URL/autoconf/>"
+ echo "It also requires GNU m4 and Perl in order to run:"
+ echo "<$gnu_software_URL/m4/>"
+ echo "<$perl_URL>"
+ ;;
+ esac
+}
+
+give_advice ()
+{
+ # Normalize program name to check for.
+ normalized_program=`echo "$1" | sed '
+ s/^gnu-//; t
+ s/^gnu//; t
+ s/^g//; t'`
+
+ printf '%s\n' "'$1' is $msg."
+
+ configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
+ case $normalized_program in
+ autoconf*)
+ echo "You should only need it if you modified 'configure.ac',"
+ echo "or m4 files included by it."
+ program_details 'autoconf'
+ ;;
+ autoheader*)
+ echo "You should only need it if you modified 'acconfig.h' or"
+ echo "$configure_deps."
+ program_details 'autoheader'
+ ;;
+ automake*)
+ echo "You should only need it if you modified 'Makefile.am' or"
+ echo "$configure_deps."
+ program_details 'automake'
+ ;;
+ aclocal*)
+ echo "You should only need it if you modified 'acinclude.m4' or"
+ echo "$configure_deps."
+ program_details 'aclocal'
+ ;;
+ autom4te*)
+ echo "You might have modified some maintainer files that require"
+ echo "the 'autom4te' program to be rebuilt."
+ program_details 'autom4te'
+ ;;
+ bison*|yacc*)
+ echo "You should only need it if you modified a '.y' file."
+ echo "You may want to install the GNU Bison package:"
+ echo "<$gnu_software_URL/bison/>"
+ ;;
+ lex*|flex*)
+ echo "You should only need it if you modified a '.l' file."
+ echo "You may want to install the Fast Lexical Analyzer package:"
+ echo "<$flex_URL>"
+ ;;
+ help2man*)
+ echo "You should only need it if you modified a dependency" \
+ "of a man page."
+ echo "You may want to install the GNU Help2man package:"
+ echo "<$gnu_software_URL/help2man/>"
+ ;;
+ makeinfo*)
+ echo "You should only need it if you modified a '.texi' file, or"
+ echo "any other file indirectly affecting the aspect of the manual."
+ echo "You might want to install the Texinfo package:"
+ echo "<$gnu_software_URL/texinfo/>"
+ echo "The spurious makeinfo call might also be the consequence of"
+ echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
+ echo "want to install GNU make:"
+ echo "<$gnu_software_URL/make/>"
+ ;;
+ *)
+ echo "You might have modified some files without having the proper"
+ echo "tools for further handling them. Check the 'README' file, it"
+ echo "often tells you about the needed prerequisites for installing"
+ echo "this package. You may also peek at any GNU archive site, in"
+ echo "case some other package contains this missing '$1' program."
+ ;;
+ esac
+}
+
+give_advice "$1" | sed -e '1s/^/WARNING: /' \
+ -e '2,$s/^/ /' >&2
+
+# Propagate the correct exit status (expected to be 127 for a program
+# not found, 63 for a program that failed due to version mismatch).
+exit $st
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/test-driver b/build-aux/test-driver
new file mode 100755
index 0000000..be73b80
--- /dev/null
+++ b/build-aux/test-driver
@@ -0,0 +1,153 @@
+#! /bin/sh
+# test-driver - basic testsuite driver script.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 2011-2021 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+# Make unconditional expansion of undefined variables an error. This
+# helps a lot in preventing typo-related bugs.
+set -u
+
+usage_error ()
+{
+ echo "$0: $*" >&2
+ print_usage >&2
+ exit 2
+}
+
+print_usage ()
+{
+ cat <<END
+Usage:
+ test-driver --test-name NAME --log-file PATH --trs-file PATH
+ [--expect-failure {yes|no}] [--color-tests {yes|no}]
+ [--enable-hard-errors {yes|no}] [--]
+ TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
+
+The '--test-name', '--log-file' and '--trs-file' options are mandatory.
+See the GNU Automake documentation for information.
+END
+}
+
+test_name= # Used for reporting.
+log_file= # Where to save the output of the test script.
+trs_file= # Where to save the metadata of the test run.
+expect_failure=no
+color_tests=no
+enable_hard_errors=yes
+while test $# -gt 0; do
+ case $1 in
+ --help) print_usage; exit $?;;
+ --version) echo "test-driver $scriptversion"; exit $?;;
+ --test-name) test_name=$2; shift;;
+ --log-file) log_file=$2; shift;;
+ --trs-file) trs_file=$2; shift;;
+ --color-tests) color_tests=$2; shift;;
+ --expect-failure) expect_failure=$2; shift;;
+ --enable-hard-errors) enable_hard_errors=$2; shift;;
+ --) shift; break;;
+ -*) usage_error "invalid option: '$1'";;
+ *) break;;
+ esac
+ shift
+done
+
+missing_opts=
+test x"$test_name" = x && missing_opts="$missing_opts --test-name"
+test x"$log_file" = x && missing_opts="$missing_opts --log-file"
+test x"$trs_file" = x && missing_opts="$missing_opts --trs-file"
+if test x"$missing_opts" != x; then
+ usage_error "the following mandatory options are missing:$missing_opts"
+fi
+
+if test $# -eq 0; then
+ usage_error "missing argument"
+fi
+
+if test $color_tests = yes; then
+ # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
+ red='' # Red.
+ grn='' # Green.
+ lgn='' # Light green.
+ blu='' # Blue.
+ mgn='' # Magenta.
+ std='' # No color.
+else
+ red= grn= lgn= blu= mgn= std=
+fi
+
+do_exit='rm -f $log_file $trs_file; (exit $st); exit $st'
+trap "st=129; $do_exit" 1
+trap "st=130; $do_exit" 2
+trap "st=141; $do_exit" 13
+trap "st=143; $do_exit" 15
+
+# Test script is run here. We create the file first, then append to it,
+# to ameliorate tests themselves also writing to the log file. Our tests
+# don't, but others can (automake bug#35762).
+: >"$log_file"
+"$@" >>"$log_file" 2>&1
+estatus=$?
+
+if test $enable_hard_errors = no && test $estatus -eq 99; then
+ tweaked_estatus=1
+else
+ tweaked_estatus=$estatus
+fi
+
+case $tweaked_estatus:$expect_failure in
+ 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
+ 0:*) col=$grn res=PASS recheck=no gcopy=no;;
+ 77:*) col=$blu res=SKIP recheck=no gcopy=yes;;
+ 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;;
+ *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;;
+ *:*) col=$red res=FAIL recheck=yes gcopy=yes;;
+esac
+
+# Report the test outcome and exit status in the logs, so that one can
+# know whether the test passed or failed simply by looking at the '.log'
+# file, without the need of also peaking into the corresponding '.trs'
+# file (automake bug#11814).
+echo "$res $test_name (exit status: $estatus)" >>"$log_file"
+
+# Report outcome to console.
+echo "${col}${res}${std}: $test_name"
+
+# Register the test result, and other relevant metadata.
+echo ":test-result: $res" > $trs_file
+echo ":global-test-result: $res" >> $trs_file
+echo ":recheck: $recheck" >> $trs_file
+echo ":copy-in-global-log: $gcopy" >> $trs_file
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/ylwrap b/build-aux/ylwrap
new file mode 100755
index 0000000..e8ec109
--- /dev/null
+++ b/build-aux/ylwrap
@@ -0,0 +1,247 @@
+#! /bin/sh
+# ylwrap - wrapper for lex/yacc invocations.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+#
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+get_dirname ()
+{
+ case $1 in
+ */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';;
+ # Otherwise, we want the empty string (not ".").
+ esac
+}
+
+# guard FILE
+# ----------
+# The CPP macro used to guard inclusion of FILE.
+guard ()
+{
+ printf '%s\n' "$1" \
+ | sed \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \
+ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g' \
+ -e 's/__*/_/g'
+}
+
+# quote_for_sed [STRING]
+# ----------------------
+# Return STRING (or stdin) quoted to be used as a sed pattern.
+quote_for_sed ()
+{
+ case $# in
+ 0) cat;;
+ 1) printf '%s\n' "$1";;
+ esac \
+ | sed -e 's|[][\\.*]|\\&|g'
+}
+
+case "$1" in
+ '')
+ echo "$0: No files given. Try '$0 --help' for more information." 1>&2
+ exit 1
+ ;;
+ --basedir)
+ basedir=$2
+ shift 2
+ ;;
+ -h|--h*)
+ cat <<\EOF
+Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]...
+
+Wrapper for lex/yacc invocations, renaming files as desired.
+
+ INPUT is the input file
+ OUTPUT is one file PROG generates
+ DESIRED is the file we actually want instead of OUTPUT
+ PROGRAM is program to run
+ ARGS are passed to PROG
+
+Any number of OUTPUT,DESIRED pairs may be used.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v|--v*)
+ echo "ylwrap $scriptversion"
+ exit $?
+ ;;
+esac
+
+
+# The input.
+input=$1
+shift
+# We'll later need for a correct munging of "#line" directives.
+input_sub_rx=`get_dirname "$input" | quote_for_sed`
+case $input in
+ [\\/]* | ?:[\\/]*)
+ # Absolute path; do nothing.
+ ;;
+ *)
+ # Relative path. Make it absolute.
+ input=`pwd`/$input
+ ;;
+esac
+input_rx=`get_dirname "$input" | quote_for_sed`
+
+# Since DOS filename conventions don't allow two dots,
+# the DOS version of Bison writes out y_tab.c instead of y.tab.c
+# and y_tab.h instead of y.tab.h. Test to see if this is the case.
+y_tab_nodot=false
+if test -f y_tab.c || test -f y_tab.h; then
+ y_tab_nodot=true
+fi
+
+# The parser itself, the first file, is the destination of the .y.c
+# rule in the Makefile.
+parser=$1
+
+# A sed program to s/FROM/TO/g for all the FROM/TO so that, for
+# instance, we rename #include "y.tab.h" into #include "parse.h"
+# during the conversion from y.tab.c to parse.c.
+sed_fix_filenames=
+
+# Also rename header guards, as Bison 2.7 for instance uses its header
+# guard in its implementation file.
+sed_fix_header_guards=
+
+while test $# -ne 0; do
+ if test x"$1" = x"--"; then
+ shift
+ break
+ fi
+ from=$1
+ # Handle y_tab.c and y_tab.h output by DOS
+ if $y_tab_nodot; then
+ case $from in
+ "y.tab.c") from=y_tab.c;;
+ "y.tab.h") from=y_tab.h;;
+ esac
+ fi
+ shift
+ to=$1
+ shift
+ sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;"
+ sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;"
+done
+
+# The program to run.
+prog=$1
+shift
+# Make any relative path in $prog absolute.
+case $prog in
+ [\\/]* | ?:[\\/]*) ;;
+ *[\\/]*) prog=`pwd`/$prog ;;
+esac
+
+dirname=ylwrap$$
+do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret'
+trap "ret=129; $do_exit" 1
+trap "ret=130; $do_exit" 2
+trap "ret=141; $do_exit" 13
+trap "ret=143; $do_exit" 15
+mkdir $dirname || exit 1
+
+cd $dirname
+
+case $# in
+ 0) "$prog" "$input" ;;
+ *) "$prog" "$@" "$input" ;;
+esac
+ret=$?
+
+if test $ret -eq 0; then
+ for from in *
+ do
+ to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"`
+ if test -f "$from"; then
+ # If $2 is an absolute path name, then just use that,
+ # otherwise prepend '../'.
+ case $to in
+ [\\/]* | ?:[\\/]*) target=$to;;
+ *) target=../$to;;
+ esac
+
+ # Do not overwrite unchanged header files to avoid useless
+ # recompilations. Always update the parser itself: it is the
+ # destination of the .y.c rule in the Makefile. Divert the
+ # output of all other files to a temporary file so we can
+ # compare them to existing versions.
+ if test $from != $parser; then
+ realtarget=$target
+ target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'`
+ fi
+
+ # Munge "#line" or "#" directives. Don't let the resulting
+ # debug information point at an absolute srcdir. Use the real
+ # output file name, not yy.lex.c for instance. Adjust the
+ # include guards too.
+ sed -e "/^#/!b" \
+ -e "s|$input_rx|$input_sub_rx|" \
+ -e "$sed_fix_filenames" \
+ -e "$sed_fix_header_guards" \
+ "$from" >"$target" || ret=$?
+
+ # Check whether files must be updated.
+ if test "$from" != "$parser"; then
+ if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then
+ echo "$to is unchanged"
+ rm -f "$target"
+ else
+ echo "updating $to"
+ mv -f "$target" "$realtarget"
+ fi
+ fi
+ else
+ # A missing file is only an error for the parser. This is a
+ # blatant hack to let us support using "yacc -d". If -d is not
+ # specified, don't fail when the header file is "missing".
+ if test "$from" = "$parser"; then
+ ret=1
+ fi
+ fi
+ done
+fi
+
+# Remove the directory.
+cd ..
+rm -rf $dirname
+
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/configure b/configure
new file mode 100755
index 0000000..f55665a
--- /dev/null
+++ b/configure
@@ -0,0 +1,31918 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.71 for GNU roff 1.23.0.
+#
+# Report bugs to <http://savannah.gnu.org/bugs/?group=groff>.
+#
+#
+# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
+# Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else $as_nop
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
+as_nl='
+'
+export as_nl
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
+
+# The user is always right.
+if ${PATH_SEPARATOR+false} :; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="as_nop=:
+if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else \$as_nop
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" )
+then :
+
+else \$as_nop
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+ if (eval "$as_required") 2>/dev/null
+then :
+ as_have_required=yes
+else $as_nop
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
+
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+ case $as_dir in #(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi
+fi
+
+
+ if test "x$CONFIG_SHELL" != x
+then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno
+then :
+ printf "%s\n" "$0: This script requires a shell more modern than all"
+ printf "%s\n" "$0: the shells that I found on your system."
+ if test ${ZSH_VERSION+y} ; then
+ printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and
+$0: http://savannah.gnu.org/bugs/?group=groff about your
+$0: system, including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else $as_nop
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else $as_nop
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ printf "%s\n" "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='GNU roff'
+PACKAGE_TARNAME='groff'
+PACKAGE_VERSION='1.23.0'
+PACKAGE_STRING='GNU roff 1.23.0'
+PACKAGE_BUGREPORT='http://savannah.gnu.org/bugs/?group=groff'
+PACKAGE_URL='https://www.gnu.org/software/groff/'
+
+ac_unique_file="src/roff/groff/groff.cpp"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stddef.h>
+#ifdef HAVE_STDIO_H
+# include <stdio.h>
+#endif
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+#ifdef HAVE_STRING_H
+# include <string.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_header_c_list=
+ac_func_c_list=
+ac_subst_vars='gltests_LIBOBJDEPS
+gltests_LTLIBOBJS
+gltests_LIBOBJS
+gl_LIBOBJDEPS
+gl_LTLIBOBJS
+gl_LIBOBJS
+am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+USE_TEX_FALSE
+USE_TEX_TRUE
+HAVE_TEXI2DVI_FALSE
+HAVE_TEXI2DVI_TRUE
+HAVE_URW_FONTS_FALSE
+HAVE_URW_FONTS_TRUE
+HAVE_GHOSTSCRIPT_FALSE
+HAVE_GHOSTSCRIPT_TRUE
+USE_GROFF_ALLOCATOR_FALSE
+USE_GROFF_ALLOCATOR_TRUE
+USE_GROPDF_FALSE
+USE_GROPDF_TRUE
+USE_PDFROFF_FALSE
+USE_PDFROFF_TRUE
+USE_GROHTML_FALSE
+USE_GROHTML_TRUE
+USEPROGRAMPREFIX_FALSE
+USEPROGRAMPREFIX_TRUE
+MAKE_DEFINES_RM_FALSE
+MAKE_DEFINES_RM_TRUE
+WITHOUT_X11_FALSE
+WITHOUT_X11_TRUE
+BUILD_WINSCRIPTS_FALSE
+BUILD_WINSCRIPTS_TRUE
+BASH_PROG
+HAVE_TEST_EF_OPTION
+DIFF_PROG
+GDIFF
+pnmtops_nosetpage
+pnmtools_quiet
+use_gropdf
+urwfontsdir
+groff_have_urw_fonts
+use_pdfroff
+ac_ct_AWK
+ALT_AWK_PROGS
+make_htmldoc
+psselect
+pnmtops
+pnmtopng
+pnmcut
+pnmcrop
+ac_ct_GHOSTSCRIPT
+GHOSTSCRIPT
+ALT_GHOSTSCRIPT_PROGS
+GROFF_PATH_SEPARATOR
+compatibility_wrappers
+tmac_wrap
+sys_tmac_prefix
+g
+PAGE
+BROKEN_SPOOLER_FLAGS
+LIBOBJS
+LIBEXT
+LTLIBICONV
+LIBICONV
+CXXCPP
+LIBM
+LIBC
+SH_SCRIPT_SED_CMD
+UCHARDET_LIBS
+UCHARDET_CFLAGS
+PKG_CONFIG_LIBDIR
+PKG_CONFIG_PATH
+PKG_CONFIG
+XPMTOPPM
+LN_S
+INSTALL_INFO
+PROG_TEX
+PROG_TEXI2DVI
+M4
+YACC
+DVIPRINT
+PSPRINT
+LPQ
+LP
+LPR
+PERL_VERSION
+SED
+PERL
+appdefdir
+XLIBDIRS
+XPROGDIRS
+XDEVDIRS
+X_EXTRA_LIBS
+X_LIBS
+X_PRE_LIBS
+X_CFLAGS
+XMKMF
+make_winscripts
+OTHERDEVDIRS
+TTYDEVDIRS
+LIBGNU_LTLIBDEPS
+LIBGNU_LIBDEPS
+GL_CFLAG_GNULIB_WARNINGS
+GL_CFLAG_ALLOW_WARNINGS
+gltests_WITNESS
+GL_COND_OBJ_WCWIDTH_FALSE
+GL_COND_OBJ_WCWIDTH_TRUE
+GL_GNULIB_TOWCTRANS
+GL_GNULIB_WCTRANS
+GL_GNULIB_ISWCTYPE
+GL_GNULIB_WCTYPE
+GL_GNULIB_ISWXDIGIT
+GL_GNULIB_ISWDIGIT
+GL_GNULIB_ISWBLANK
+REPLACE_TOWLOWER
+REPLACE_ISWCNTRL
+HAVE_WCTYPE_H
+NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H
+NEXT_WCTYPE_H
+HAVE_ISWCNTRL
+REPLACE_ISWXDIGIT
+REPLACE_ISWDIGIT
+REPLACE_ISWBLANK
+HAVE_WCTRANS_T
+HAVE_WCTYPE_T
+HAVE_ISWBLANK
+GL_GNULIB_MDA_WCSDUP
+GL_GNULIB_WCSFTIME
+GL_GNULIB_WCSWIDTH
+GL_GNULIB_WCSTOK
+GL_GNULIB_WCSSTR
+GL_GNULIB_WCSPBRK
+GL_GNULIB_WCSSPN
+GL_GNULIB_WCSCSPN
+GL_GNULIB_WCSRCHR
+GL_GNULIB_WCSCHR
+GL_GNULIB_WCSDUP
+GL_GNULIB_WCSXFRM
+GL_GNULIB_WCSCOLL
+GL_GNULIB_WCSNCASECMP
+GL_GNULIB_WCSCASECMP
+GL_GNULIB_WCSNCMP
+GL_GNULIB_WCSCMP
+GL_GNULIB_WCSNCAT
+GL_GNULIB_WCSCAT
+GL_GNULIB_WCPNCPY
+GL_GNULIB_WCSNCPY
+GL_GNULIB_WCPCPY
+GL_GNULIB_WCSCPY
+GL_GNULIB_WCSNLEN
+GL_GNULIB_WCSLEN
+GL_GNULIB_WMEMSET
+GL_GNULIB_WMEMPCPY
+GL_GNULIB_WMEMMOVE
+GL_GNULIB_WMEMCPY
+GL_GNULIB_WMEMCMP
+GL_GNULIB_WMEMCHR
+GL_GNULIB_WCWIDTH
+GL_GNULIB_WCSNRTOMBS
+GL_GNULIB_WCSRTOMBS
+GL_GNULIB_WCRTOMB
+GL_GNULIB_MBSNRTOWCS
+GL_GNULIB_MBSRTOWCS
+GL_GNULIB_MBRLEN
+GL_GNULIB_MBRTOWC
+GL_GNULIB_MBSINIT
+GL_GNULIB_WCTOB
+GL_GNULIB_BTOWC
+HAVE_CRTDEFS_H
+HAVE_WINT_T
+NEXT_AS_FIRST_DIRECTIVE_WCHAR_H
+NEXT_WCHAR_H
+REPLACE_WMEMPCPY
+REPLACE_WCSTOK
+REPLACE_WCSFTIME
+REPLACE_WCSWIDTH
+REPLACE_WCWIDTH
+REPLACE_WCSNRTOMBS
+REPLACE_WCSRTOMBS
+REPLACE_WCRTOMB
+REPLACE_MBSNRTOWCS
+REPLACE_MBSRTOWCS
+REPLACE_MBRLEN
+REPLACE_MBRTOWC
+REPLACE_MBSINIT
+REPLACE_WCTOB
+REPLACE_BTOWC
+REPLACE_MBSTATE_T
+HAVE_DECL_WCWIDTH
+HAVE_DECL_WCSDUP
+HAVE_DECL_WCTOB
+HAVE_WCSFTIME
+HAVE_WCSWIDTH
+HAVE_WCSTOK
+HAVE_WCSSTR
+HAVE_WCSPBRK
+HAVE_WCSSPN
+HAVE_WCSCSPN
+HAVE_WCSRCHR
+HAVE_WCSCHR
+HAVE_WCSDUP
+HAVE_WCSXFRM
+HAVE_WCSCOLL
+HAVE_WCSNCASECMP
+HAVE_WCSCASECMP
+HAVE_WCSNCMP
+HAVE_WCSCMP
+HAVE_WCSNCAT
+HAVE_WCSCAT
+HAVE_WCPNCPY
+HAVE_WCSNCPY
+HAVE_WCPCPY
+HAVE_WCSCPY
+HAVE_WCSNLEN
+HAVE_WCSLEN
+HAVE_WMEMSET
+HAVE_WMEMPCPY
+HAVE_WMEMMOVE
+HAVE_WMEMCPY
+HAVE_WMEMCMP
+HAVE_WMEMCHR
+HAVE_WCSNRTOMBS
+HAVE_WCSRTOMBS
+HAVE_WCRTOMB
+HAVE_MBSNRTOWCS
+HAVE_MBSRTOWCS
+HAVE_MBRLEN
+HAVE_MBRTOWC
+HAVE_MBSINIT
+HAVE_BTOWC
+LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE
+LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE
+LIBUNISTRING_UNIWIDTH_H
+LIBUNISTRING_UNITYPES_H
+GL_GNULIB_MDA_WRITE
+GL_GNULIB_MDA_UNLINK
+GL_GNULIB_MDA_SWAB
+GL_GNULIB_MDA_RMDIR
+GL_GNULIB_MDA_READ
+GL_GNULIB_MDA_LSEEK
+GL_GNULIB_MDA_ISATTY
+GL_GNULIB_MDA_GETPID
+GL_GNULIB_MDA_GETCWD
+GL_GNULIB_MDA_EXECVPE
+GL_GNULIB_MDA_EXECVP
+GL_GNULIB_MDA_EXECVE
+GL_GNULIB_MDA_EXECV
+GL_GNULIB_MDA_EXECLP
+GL_GNULIB_MDA_EXECLE
+GL_GNULIB_MDA_EXECL
+GL_GNULIB_MDA_DUP2
+GL_GNULIB_MDA_DUP
+GL_GNULIB_MDA_CLOSE
+GL_GNULIB_MDA_CHDIR
+GL_GNULIB_MDA_ACCESS
+GL_GNULIB_WRITE
+GL_GNULIB_USLEEP
+GL_GNULIB_UNLINKAT
+GL_GNULIB_UNLINK
+GL_GNULIB_UNISTD_H_SIGPIPE
+GL_GNULIB_UNISTD_H_NONBLOCKING
+GL_GNULIB_UNISTD_H_GETOPT
+GL_GNULIB_TTYNAME_R
+GL_GNULIB_TRUNCATE
+GL_GNULIB_SYMLINKAT
+GL_GNULIB_SYMLINK
+GL_GNULIB_SLEEP
+GL_GNULIB_SETHOSTNAME
+GL_GNULIB_RMDIR
+GL_GNULIB_READLINKAT
+GL_GNULIB_READLINK
+GL_GNULIB_READ
+GL_GNULIB_PWRITE
+GL_GNULIB_PREAD
+GL_GNULIB_PIPE2
+GL_GNULIB_PIPE
+GL_GNULIB_LSEEK
+GL_GNULIB_LINKAT
+GL_GNULIB_LINK
+GL_GNULIB_LCHOWN
+GL_GNULIB_ISATTY
+GL_GNULIB_GROUP_MEMBER
+GL_GNULIB_GETUSERSHELL
+GL_GNULIB_GETPASS_GNU
+GL_GNULIB_GETPASS
+GL_GNULIB_GETPAGESIZE
+GL_GNULIB_GETOPT_POSIX
+GL_GNULIB_GETLOGIN_R
+GL_GNULIB_GETLOGIN
+GL_GNULIB_GETHOSTNAME
+GL_GNULIB_GETGROUPS
+GL_GNULIB_GETENTROPY
+GL_GNULIB_GETDTABLESIZE
+GL_GNULIB_GETDOMAINNAME
+GL_GNULIB_GETCWD
+GL_GNULIB_FTRUNCATE
+GL_GNULIB_FSYNC
+GL_GNULIB_FDATASYNC
+GL_GNULIB_FCHOWNAT
+GL_GNULIB_FCHDIR
+GL_GNULIB_FACCESSAT
+GL_GNULIB_EXECVPE
+GL_GNULIB_EXECVP
+GL_GNULIB_EXECVE
+GL_GNULIB_EXECV
+GL_GNULIB_EXECLP
+GL_GNULIB_EXECLE
+GL_GNULIB_EXECL
+GL_GNULIB_EUIDACCESS
+GL_GNULIB_ENVIRON
+GL_GNULIB_DUP3
+GL_GNULIB_DUP2
+GL_GNULIB_DUP
+GL_GNULIB_COPY_FILE_RANGE
+GL_GNULIB_CLOSE
+GL_GNULIB_CHOWN
+GL_GNULIB_CHDIR
+GL_GNULIB_ACCESS
+HAVE_UNISTD_H
+NEXT_AS_FIRST_DIRECTIVE_UNISTD_H
+NEXT_UNISTD_H
+UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS
+UNISTD_H_HAVE_WINSOCK2_H
+UNISTD_H_HAVE_SYS_RANDOM_H
+REPLACE_WRITE
+REPLACE_USLEEP
+REPLACE_UNLINKAT
+REPLACE_UNLINK
+REPLACE_TTYNAME_R
+REPLACE_TRUNCATE
+REPLACE_SYMLINKAT
+REPLACE_SYMLINK
+REPLACE_SLEEP
+REPLACE_SETHOSTNAME
+REPLACE_RMDIR
+REPLACE_READLINKAT
+REPLACE_READLINK
+REPLACE_READ
+REPLACE_PWRITE
+REPLACE_PREAD
+REPLACE_PIPE2
+REPLACE_LSEEK
+REPLACE_LINKAT
+REPLACE_LINK
+REPLACE_LCHOWN
+REPLACE_ISATTY
+REPLACE_GETPASS_FOR_GETPASS_GNU
+REPLACE_GETPASS
+REPLACE_GETPAGESIZE
+REPLACE_GETGROUPS
+REPLACE_GETLOGIN_R
+REPLACE_GETENTROPY
+REPLACE_GETDTABLESIZE
+REPLACE_GETDOMAINNAME
+REPLACE_GETCWD
+REPLACE_FTRUNCATE
+REPLACE_FDATASYNC
+REPLACE_FCHOWNAT
+REPLACE_FACCESSAT
+REPLACE_EXECVPE
+REPLACE_EXECVP
+REPLACE_EXECVE
+REPLACE_EXECV
+REPLACE_EXECLP
+REPLACE_EXECLE
+REPLACE_EXECL
+REPLACE_DUP3
+REPLACE_DUP2
+REPLACE_DUP
+REPLACE_COPY_FILE_RANGE
+REPLACE_CLOSE
+REPLACE_CHOWN
+REPLACE_ACCESS
+HAVE_SYS_PARAM_H
+HAVE_OS_H
+HAVE_DECL_TTYNAME_R
+HAVE_DECL_TRUNCATE
+HAVE_DECL_SETHOSTNAME
+HAVE_DECL_GETUSERSHELL
+HAVE_DECL_GETPAGESIZE
+HAVE_DECL_GETLOGIN_R
+HAVE_DECL_GETLOGIN
+HAVE_DECL_GETDOMAINNAME
+HAVE_DECL_FDATASYNC
+HAVE_DECL_FCHDIR
+HAVE_DECL_EXECVPE
+HAVE_DECL_ENVIRON
+HAVE_USLEEP
+HAVE_UNLINKAT
+HAVE_SYMLINKAT
+HAVE_SYMLINK
+HAVE_SLEEP
+HAVE_SETHOSTNAME
+HAVE_READLINKAT
+HAVE_READLINK
+HAVE_PWRITE
+HAVE_PREAD
+HAVE_PIPE2
+HAVE_PIPE
+HAVE_LINKAT
+HAVE_LINK
+HAVE_LCHOWN
+HAVE_GROUP_MEMBER
+HAVE_GETPASS
+HAVE_GETPAGESIZE
+HAVE_GETLOGIN
+HAVE_GETHOSTNAME
+HAVE_GETGROUPS
+HAVE_GETENTROPY
+HAVE_GETDTABLESIZE
+HAVE_FTRUNCATE
+HAVE_FSYNC
+HAVE_FDATASYNC
+HAVE_FCHOWNAT
+HAVE_FCHDIR
+HAVE_FACCESSAT
+HAVE_EXECVPE
+HAVE_EUIDACCESS
+HAVE_DUP3
+HAVE_COPY_FILE_RANGE
+HAVE_CHOWN
+WINDOWS_STAT_INODES
+WINDOWS_64_BIT_OFF_T
+NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H
+NEXT_SYS_TYPES_H
+NEXT_AS_FIRST_DIRECTIVE_STRING_H
+NEXT_STRING_H
+NEXT_AS_FIRST_DIRECTIVE_STDLIB_H
+NEXT_STDLIB_H
+GL_COND_OBJ_STDIO_WRITE_FALSE
+GL_COND_OBJ_STDIO_WRITE_TRUE
+GL_COND_OBJ_STDIO_READ_FALSE
+GL_COND_OBJ_STDIO_READ_TRUE
+NEXT_AS_FIRST_DIRECTIVE_STDIO_H
+NEXT_STDIO_H
+GL_GENERATE_STDINT_H_FALSE
+GL_GENERATE_STDINT_H_TRUE
+STDINT_H
+GL_GENERATE_STDDEF_H_FALSE
+GL_GENERATE_STDDEF_H_TRUE
+STDDEF_H
+NEXT_AS_FIRST_DIRECTIVE_STDDEF_H
+NEXT_STDDEF_H
+HAVE_WCHAR_T
+HAVE_MAX_ALIGN_T
+REPLACE_NULL
+GL_GENERATE_STDBOOL_H_FALSE
+GL_GENERATE_STDBOOL_H_TRUE
+STDBOOL_H
+HAVE__BOOL
+GL_COND_OBJ_SIGNBIT3_FALSE
+GL_COND_OBJ_SIGNBIT3_TRUE
+GL_GNULIB_MDA_STRDUP
+GL_GNULIB_MDA_MEMCCPY
+GL_GNULIB_STRVERSCMP
+GL_GNULIB_STRSIGNAL
+GL_GNULIB_SIGDESCR_NP
+GL_GNULIB_SIGABBREV_NP
+GL_GNULIB_STRERRORNAME_NP
+GL_GNULIB_STRERROR_R
+GL_GNULIB_STRERROR
+GL_GNULIB_MBSTOK_R
+GL_GNULIB_MBSSEP
+GL_GNULIB_MBSSPN
+GL_GNULIB_MBSPBRK
+GL_GNULIB_MBSCSPN
+GL_GNULIB_MBSCASESTR
+GL_GNULIB_MBSPCASECMP
+GL_GNULIB_MBSNCASECMP
+GL_GNULIB_MBSCASECMP
+GL_GNULIB_MBSSTR
+GL_GNULIB_MBSRCHR
+GL_GNULIB_MBSCHR
+GL_GNULIB_MBSNLEN
+GL_GNULIB_MBSLEN
+GL_GNULIB_STRTOK_R
+GL_GNULIB_STRCASESTR
+GL_GNULIB_STRSTR
+GL_GNULIB_STRSEP
+GL_GNULIB_STRPBRK
+GL_GNULIB_STRNLEN
+GL_GNULIB_STRNDUP
+GL_GNULIB_STRNCAT
+GL_GNULIB_STRDUP
+GL_GNULIB_STRCHRNUL
+GL_GNULIB_STPNCPY
+GL_GNULIB_STPCPY
+GL_GNULIB_RAWMEMCHR
+GL_GNULIB_MEMSET_EXPLICIT
+GL_GNULIB_MEMRCHR
+GL_GNULIB_MEMPCPY
+GL_GNULIB_MEMMEM
+GL_GNULIB_MEMCHR
+GL_GNULIB_FFSLL
+GL_GNULIB_FFSL
+GL_GNULIB_EXPLICIT_BZERO
+GL_COND_OBJ_MEMCHR_FALSE
+GL_COND_OBJ_MEMCHR_TRUE
+UNDEFINE_STRTOK_R
+REPLACE_STRSIGNAL
+REPLACE_STRERRORNAME_NP
+REPLACE_STRERROR_R
+REPLACE_STRERROR
+REPLACE_STRTOK_R
+REPLACE_STRCASESTR
+REPLACE_STRSTR
+REPLACE_STRNLEN
+REPLACE_STRNDUP
+REPLACE_STRNCAT
+REPLACE_STRDUP
+REPLACE_STRCHRNUL
+REPLACE_STPNCPY
+REPLACE_STPCPY
+REPLACE_MEMPCPY
+REPLACE_MEMMEM
+REPLACE_MEMCHR
+REPLACE_FFSLL
+HAVE_STRVERSCMP
+HAVE_DECL_STRSIGNAL
+HAVE_SIGDESCR_NP
+HAVE_SIGABBREV_NP
+HAVE_STRERRORNAME_NP
+HAVE_DECL_STRERROR_R
+HAVE_DECL_STRTOK_R
+HAVE_STRCASESTR
+HAVE_STRSEP
+HAVE_STRPBRK
+HAVE_DECL_STRNLEN
+HAVE_DECL_STRNDUP
+HAVE_DECL_STRDUP
+HAVE_STRCHRNUL
+HAVE_STPNCPY
+HAVE_STPCPY
+HAVE_RAWMEMCHR
+HAVE_DECL_MEMRCHR
+HAVE_MEMSET_EXPLICIT
+HAVE_MEMPCPY
+HAVE_DECL_MEMMEM
+HAVE_FFSLL
+HAVE_FFSL
+HAVE_EXPLICIT_BZERO
+HAVE_MBSLEN
+NEXT_AS_FIRST_DIRECTIVE_MATH_H
+NEXT_MATH_H
+LOCALCHARSET_TESTS_ENVIRONMENT
+GLIBC21
+GL_GENERATE_LIMITS_H_FALSE
+GL_GENERATE_LIMITS_H_TRUE
+LIMITS_H
+GL_GNULIB_STRTOUMAX
+GL_GNULIB_STRTOIMAX
+GL_GNULIB_IMAXDIV
+GL_GNULIB_IMAXABS
+NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H
+NEXT_INTTYPES_H
+UINT64_MAX_EQ_ULONG_MAX
+UINT32_MAX_LT_UINTMAX_MAX
+PRIPTR_PREFIX
+INT64_MAX_EQ_LONG_MAX
+INT32_MAX_LT_INTMAX_MAX
+REPLACE_STRTOUMAX
+REPLACE_STRTOIMAX
+REPLACE_IMAXDIV
+REPLACE_IMAXABS
+HAVE_IMAXDIV
+HAVE_IMAXABS
+HAVE_IMAXDIV_T
+HAVE_DECL_STRTOUMAX
+HAVE_DECL_STRTOIMAX
+HAVE_DECL_IMAXDIV
+HAVE_DECL_IMAXABS
+HAVE_SYS_INTTYPES_H
+HAVE_SYS_BITYPES_H
+HAVE_C99_STDINT_H
+WINT_T_SUFFIX
+WCHAR_T_SUFFIX
+SIG_ATOMIC_T_SUFFIX
+SIZE_T_SUFFIX
+PTRDIFF_T_SUFFIX
+HAVE_SIGNED_WINT_T
+HAVE_SIGNED_WCHAR_T
+HAVE_SIGNED_SIG_ATOMIC_T
+BITSIZEOF_WINT_T
+BITSIZEOF_WCHAR_T
+BITSIZEOF_SIG_ATOMIC_T
+BITSIZEOF_SIZE_T
+BITSIZEOF_PTRDIFF_T
+HAVE_STDINT_H
+NEXT_AS_FIRST_DIRECTIVE_STDINT_H
+NEXT_STDINT_H
+HAVE_SYS_TYPES_H
+HAVE_INTTYPES_H
+HAVE_WCHAR_H
+NEXT_AS_FIRST_DIRECTIVE_LIMITS_H
+NEXT_LIMITS_H
+GL_COND_OBJ_FSETERR_FALSE
+GL_COND_OBJ_FSETERR_TRUE
+GL_GNULIB_MDA_YN
+GL_GNULIB_MDA_Y1
+GL_GNULIB_MDA_Y0
+GL_GNULIB_MDA_JN
+GL_GNULIB_MDA_J1
+GL_GNULIB_MDA_J0
+GL_GNULIB_TRUNCL
+GL_GNULIB_TRUNCF
+GL_GNULIB_TRUNC
+GL_GNULIB_TANHF
+GL_GNULIB_TANL
+GL_GNULIB_TANF
+GL_GNULIB_SQRTL
+GL_GNULIB_SQRTF
+GL_GNULIB_SINHF
+GL_GNULIB_SINL
+GL_GNULIB_SINF
+GL_GNULIB_SIGNBIT
+GL_GNULIB_ROUNDL
+GL_GNULIB_ROUNDF
+GL_GNULIB_ROUND
+GL_GNULIB_RINTL
+GL_GNULIB_RINTF
+GL_GNULIB_RINT
+GL_GNULIB_REMAINDERL
+GL_GNULIB_REMAINDERF
+GL_GNULIB_REMAINDER
+GL_GNULIB_POWF
+GL_GNULIB_MODFL
+GL_GNULIB_MODFF
+GL_GNULIB_MODF
+GL_GNULIB_LOGBL
+GL_GNULIB_LOGBF
+GL_GNULIB_LOGB
+GL_GNULIB_LOG2L
+GL_GNULIB_LOG2F
+GL_GNULIB_LOG2
+GL_GNULIB_LOG1PL
+GL_GNULIB_LOG1PF
+GL_GNULIB_LOG1P
+GL_GNULIB_LOG10L
+GL_GNULIB_LOG10F
+GL_GNULIB_LOG10
+GL_GNULIB_LOGL
+GL_GNULIB_LOGF
+GL_GNULIB_LOG
+GL_GNULIB_LDEXPL
+GL_GNULIB_LDEXPF
+GL_GNULIB_ISNANL
+GL_GNULIB_ISNAND
+GL_GNULIB_ISNANF
+GL_GNULIB_ISNAN
+GL_GNULIB_ISINF
+GL_GNULIB_ISFINITE
+GL_GNULIB_ILOGBL
+GL_GNULIB_ILOGBF
+GL_GNULIB_ILOGB
+GL_GNULIB_HYPOTL
+GL_GNULIB_HYPOTF
+GL_GNULIB_HYPOT
+GL_GNULIB_FREXPL
+GL_GNULIB_FREXP
+GL_GNULIB_FREXPF
+GL_GNULIB_FMODL
+GL_GNULIB_FMODF
+GL_GNULIB_FMOD
+GL_GNULIB_FMAL
+GL_GNULIB_FMAF
+GL_GNULIB_FMA
+GL_GNULIB_FLOORL
+GL_GNULIB_FLOORF
+GL_GNULIB_FLOOR
+GL_GNULIB_FABSL
+GL_GNULIB_FABSF
+GL_GNULIB_EXPM1L
+GL_GNULIB_EXPM1F
+GL_GNULIB_EXPM1
+GL_GNULIB_EXP2L
+GL_GNULIB_EXP2F
+GL_GNULIB_EXP2
+GL_GNULIB_EXPL
+GL_GNULIB_EXPF
+GL_GNULIB_COSHF
+GL_GNULIB_COSL
+GL_GNULIB_COSF
+GL_GNULIB_COPYSIGNL
+GL_GNULIB_COPYSIGNF
+GL_GNULIB_COPYSIGN
+GL_GNULIB_CEILL
+GL_GNULIB_CEILF
+GL_GNULIB_CEIL
+GL_GNULIB_CBRTL
+GL_GNULIB_CBRTF
+GL_GNULIB_CBRT
+GL_GNULIB_ATAN2F
+GL_GNULIB_ATANL
+GL_GNULIB_ATANF
+GL_GNULIB_ASINL
+GL_GNULIB_ASINF
+GL_GNULIB_ACOSL
+GL_GNULIB_ACOSF
+REPLACE_TRUNCL
+REPLACE_TRUNCF
+REPLACE_TRUNC
+REPLACE_TANHF
+REPLACE_TANF
+REPLACE_SQRTL
+REPLACE_SQRTF
+REPLACE_SINHF
+REPLACE_SINF
+REPLACE_SIGNBIT_USING_BUILTINS
+REPLACE_SIGNBIT
+REPLACE_ROUNDL
+REPLACE_ROUNDF
+REPLACE_ROUND
+REPLACE_RINTL
+REPLACE_REMAINDERL
+REPLACE_REMAINDERF
+REPLACE_REMAINDER
+REPLACE_NAN
+REPLACE_MODFL
+REPLACE_MODFF
+REPLACE_MODF
+REPLACE_LOGBL
+REPLACE_LOGBF
+REPLACE_LOGB
+REPLACE_LOG2L
+REPLACE_LOG2F
+REPLACE_LOG2
+REPLACE_LOG1PL
+REPLACE_LOG1PF
+REPLACE_LOG1P
+REPLACE_LOG10L
+REPLACE_LOG10F
+REPLACE_LOG10
+REPLACE_LOGL
+REPLACE_LOGF
+REPLACE_LOG
+REPLACE_LDEXPL
+REPLACE_ISNAN
+REPLACE_ISINF
+REPLACE_ISFINITE
+REPLACE_ILOGBL
+REPLACE_ILOGBF
+REPLACE_ILOGB
+REPLACE_HYPOTL
+REPLACE_HYPOTF
+REPLACE_HYPOT
+REPLACE_HUGE_VAL
+REPLACE_FREXPL
+REPLACE_FREXP
+REPLACE_FREXPF
+REPLACE_FMODL
+REPLACE_FMODF
+REPLACE_FMOD
+REPLACE_FMAL
+REPLACE_FMAF
+REPLACE_FMA
+REPLACE_FLOORL
+REPLACE_FLOORF
+REPLACE_FLOOR
+REPLACE_FABSL
+REPLACE_EXP2L
+REPLACE_EXP2
+REPLACE_EXPM1L
+REPLACE_EXPM1F
+REPLACE_EXPM1
+REPLACE_EXPL
+REPLACE_EXPF
+REPLACE_COSHF
+REPLACE_COSF
+REPLACE_CEILL
+REPLACE_CEILF
+REPLACE_CEIL
+REPLACE_CBRTL
+REPLACE_CBRTF
+REPLACE_ATAN2F
+REPLACE_ATANF
+REPLACE_ASINF
+REPLACE_ACOSF
+HAVE_DECL_TRUNCL
+HAVE_DECL_TRUNCF
+HAVE_DECL_TRUNC
+HAVE_DECL_TANL
+HAVE_DECL_SQRTL
+HAVE_DECL_SINL
+HAVE_DECL_ROUNDL
+HAVE_DECL_ROUNDF
+HAVE_DECL_ROUND
+HAVE_DECL_RINTF
+HAVE_DECL_REMAINDERL
+HAVE_DECL_REMAINDER
+HAVE_DECL_LOGB
+HAVE_DECL_LOG2L
+HAVE_DECL_LOG2F
+HAVE_DECL_LOG2
+HAVE_DECL_LOG10L
+HAVE_DECL_LOGL
+HAVE_DECL_LDEXPL
+HAVE_DECL_FREXPL
+HAVE_DECL_FLOORL
+HAVE_DECL_FLOORF
+HAVE_DECL_EXPM1L
+HAVE_DECL_EXP2L
+HAVE_DECL_EXP2F
+HAVE_DECL_EXP2
+HAVE_DECL_EXPL
+HAVE_DECL_COSL
+HAVE_DECL_COPYSIGNF
+HAVE_DECL_CEILL
+HAVE_DECL_CEILF
+HAVE_DECL_CBRTL
+HAVE_DECL_CBRTF
+HAVE_DECL_ATANL
+HAVE_DECL_ASINL
+HAVE_DECL_ACOSL
+HAVE_TANHF
+HAVE_TANL
+HAVE_TANF
+HAVE_SQRTL
+HAVE_SQRTF
+HAVE_SINHF
+HAVE_SINL
+HAVE_SINF
+HAVE_RINTL
+HAVE_RINT
+HAVE_REMAINDERF
+HAVE_REMAINDER
+HAVE_POWF
+HAVE_MODFL
+HAVE_MODFF
+HAVE_LOGBL
+HAVE_LOGBF
+HAVE_LOG1PL
+HAVE_LOG1PF
+HAVE_LOG1P
+HAVE_LOG10L
+HAVE_LOG10F
+HAVE_LOGL
+HAVE_LOGF
+HAVE_LDEXPF
+HAVE_ISNANL
+HAVE_ISNAND
+HAVE_ISNANF
+HAVE_ILOGBL
+HAVE_ILOGBF
+HAVE_ILOGB
+HAVE_HYPOTL
+HAVE_HYPOTF
+HAVE_FREXPF
+HAVE_FMODL
+HAVE_FMODF
+HAVE_FMAL
+HAVE_FMAF
+HAVE_FMA
+HAVE_FABSL
+HAVE_FABSF
+HAVE_EXPM1F
+HAVE_EXPM1
+HAVE_EXPL
+HAVE_EXPF
+HAVE_COSHF
+HAVE_COSL
+HAVE_COSF
+HAVE_COPYSIGNL
+HAVE_COPYSIGN
+HAVE_CBRTL
+HAVE_CBRTF
+HAVE_CBRT
+HAVE_ATAN2F
+HAVE_ATANL
+HAVE_ATANF
+HAVE_ASINL
+HAVE_ASINF
+HAVE_ACOSL
+HAVE_ACOSF
+GL_GNULIB_MDA_PUTENV
+GL_GNULIB_MDA_MKTEMP
+GL_GNULIB_MDA_GCVT
+GL_GNULIB_MDA_FCVT
+GL_GNULIB_MDA_ECVT
+GL_GNULIB_WCTOMB
+GL_GNULIB_UNSETENV
+GL_GNULIB_UNLOCKPT
+GL_GNULIB_SYSTEM_POSIX
+GL_GNULIB_STRTOULL
+GL_GNULIB_STRTOUL
+GL_GNULIB_STRTOLL
+GL_GNULIB_STRTOLD
+GL_GNULIB_STRTOL
+GL_GNULIB_STRTOD
+GL_GNULIB_SETENV
+GL_GNULIB_SECURE_GETENV
+GL_GNULIB_RPMATCH
+GL_GNULIB_REALPATH
+GL_GNULIB_REALLOC_POSIX
+GL_GNULIB_REALLOC_GNU
+GL_GNULIB_REALLOCARRAY
+GL_GNULIB_RANDOM_R
+GL_GNULIB_RANDOM
+GL_GNULIB_QSORT_R
+GL_GNULIB_PUTENV
+GL_GNULIB_PTSNAME_R
+GL_GNULIB_PTSNAME
+GL_GNULIB_POSIX_OPENPT
+GL_GNULIB_POSIX_MEMALIGN
+GL_GNULIB_MKSTEMPS
+GL_GNULIB_MKSTEMP
+GL_GNULIB_MKOSTEMPS
+GL_GNULIB_MKOSTEMP
+GL_GNULIB_MKDTEMP
+GL_GNULIB_MBTOWC
+GL_GNULIB_MALLOC_POSIX
+GL_GNULIB_MALLOC_GNU
+GL_GNULIB_GRANTPT
+GL_GNULIB_GETSUBOPT
+GL_GNULIB_GETPROGNAME
+GL_GNULIB_GETLOADAVG
+GL_GNULIB_FREE_POSIX
+GL_GNULIB_CANONICALIZE_FILE_NAME
+GL_GNULIB_CALLOC_POSIX
+GL_GNULIB_CALLOC_GNU
+GL_GNULIB_ATOLL
+GL_GNULIB_ALIGNED_ALLOC
+GL_GNULIB__EXIT
+GL_COND_OBJ_FREE_FALSE
+GL_COND_OBJ_FREE_TRUE
+REPLACE_WCTOMB
+REPLACE_UNSETENV
+REPLACE_STRTOULL
+REPLACE_STRTOUL
+REPLACE_STRTOLL
+REPLACE_STRTOLD
+REPLACE_STRTOL
+REPLACE_STRTOD
+REPLACE_SETSTATE
+REPLACE_SETENV
+REPLACE_REALPATH
+REPLACE_REALLOCARRAY
+REPLACE_REALLOC_FOR_REALLOC_POSIX
+REPLACE_REALLOC_FOR_REALLOC_GNU
+REPLACE_RANDOM_R
+REPLACE_RANDOM
+REPLACE_QSORT_R
+REPLACE_PUTENV
+REPLACE_PTSNAME_R
+REPLACE_PTSNAME
+REPLACE_POSIX_OPENPT
+REPLACE_POSIX_MEMALIGN
+REPLACE_MKSTEMP
+REPLACE_MKOSTEMPS
+REPLACE_MKOSTEMP
+REPLACE_MBTOWC
+REPLACE_MALLOC_FOR_MALLOC_POSIX
+REPLACE_MALLOC_FOR_MALLOC_GNU
+REPLACE_INITSTATE
+REPLACE_GETSUBOPT
+REPLACE_GETPROGNAME
+REPLACE_GETLOADAVG
+REPLACE_FREE
+REPLACE_CANONICALIZE_FILE_NAME
+REPLACE_CALLOC_FOR_CALLOC_POSIX
+REPLACE_CALLOC_FOR_CALLOC_GNU
+REPLACE_ALIGNED_ALLOC
+REPLACE__EXIT
+HAVE_DECL_UNSETENV
+HAVE_UNLOCKPT
+HAVE_SYS_LOADAVG_H
+HAVE_STRUCT_RANDOM_DATA
+HAVE_STRTOULL
+HAVE_STRTOUL
+HAVE_STRTOLL
+HAVE_STRTOLD
+HAVE_STRTOL
+HAVE_STRTOD
+HAVE_DECL_SETSTATE
+HAVE_SETSTATE
+HAVE_DECL_SETENV
+HAVE_SETENV
+HAVE_SECURE_GETENV
+HAVE_RPMATCH
+HAVE_REALPATH
+HAVE_REALLOCARRAY
+HAVE_RANDOM_R
+HAVE_RANDOM_H
+HAVE_RANDOM
+HAVE_QSORT_R
+HAVE_PTSNAME_R
+HAVE_PTSNAME
+HAVE_POSIX_OPENPT
+HAVE_POSIX_MEMALIGN
+HAVE_MKSTEMPS
+HAVE_MKSTEMP
+HAVE_MKOSTEMPS
+HAVE_MKOSTEMP
+HAVE_MKDTEMP
+HAVE_MBTOWC
+HAVE_DECL_INITSTATE
+HAVE_INITSTATE
+HAVE_GRANTPT
+HAVE_GETSUBOPT
+HAVE_GETPROGNAME
+HAVE_DECL_GETLOADAVG
+HAVE_DECL_GCVT
+HAVE_DECL_FCVT
+HAVE_DECL_ECVT
+HAVE_CANONICALIZE_FILE_NAME
+HAVE_ATOLL
+HAVE_ALIGNED_ALLOC
+HAVE__EXIT
+GL_GNULIB_MDA_TEMPNAM
+GL_GNULIB_MDA_PUTW
+GL_GNULIB_MDA_GETW
+GL_GNULIB_MDA_FILENO
+GL_GNULIB_MDA_FDOPEN
+GL_GNULIB_MDA_FCLOSEALL
+GL_GNULIB_VSPRINTF_POSIX
+GL_GNULIB_VSNPRINTF
+GL_GNULIB_VPRINTF_POSIX
+GL_GNULIB_VPRINTF
+GL_GNULIB_VFPRINTF_POSIX
+GL_GNULIB_VFPRINTF
+GL_GNULIB_VDPRINTF
+GL_GNULIB_VSCANF
+GL_GNULIB_VFSCANF
+GL_GNULIB_VASPRINTF
+GL_GNULIB_TMPFILE
+GL_GNULIB_STDIO_H_SIGPIPE
+GL_GNULIB_STDIO_H_NONBLOCKING
+GL_GNULIB_SPRINTF_POSIX
+GL_GNULIB_SNPRINTF
+GL_GNULIB_SCANF
+GL_GNULIB_RENAMEAT
+GL_GNULIB_RENAME
+GL_GNULIB_REMOVE
+GL_GNULIB_PUTS
+GL_GNULIB_PUTCHAR
+GL_GNULIB_PUTC
+GL_GNULIB_PRINTF_POSIX
+GL_GNULIB_PRINTF
+GL_GNULIB_POPEN
+GL_GNULIB_PERROR
+GL_GNULIB_PCLOSE
+GL_GNULIB_OBSTACK_PRINTF_POSIX
+GL_GNULIB_OBSTACK_PRINTF
+GL_GNULIB_GETLINE
+GL_GNULIB_GETDELIM
+GL_GNULIB_GETCHAR
+GL_GNULIB_GETC
+GL_GNULIB_FWRITE
+GL_GNULIB_FTELLO
+GL_GNULIB_FTELL
+GL_GNULIB_FSEEKO
+GL_GNULIB_FSEEK
+GL_GNULIB_FSCANF
+GL_GNULIB_FREOPEN
+GL_GNULIB_FREAD
+GL_GNULIB_FPUTS
+GL_GNULIB_FPUTC
+GL_GNULIB_FPURGE
+GL_GNULIB_FPRINTF_POSIX
+GL_GNULIB_FPRINTF
+GL_GNULIB_FOPEN_GNU
+GL_GNULIB_FOPEN
+GL_GNULIB_FGETS
+GL_GNULIB_FGETC
+GL_GNULIB_FFLUSH
+GL_GNULIB_FDOPEN
+GL_GNULIB_FCLOSE
+GL_GNULIB_DPRINTF
+REPLACE_VSPRINTF
+REPLACE_VSNPRINTF
+REPLACE_VPRINTF
+REPLACE_VFPRINTF
+REPLACE_VDPRINTF
+REPLACE_VASPRINTF
+REPLACE_TMPFILE
+REPLACE_STDIO_WRITE_FUNCS
+REPLACE_STDIO_READ_FUNCS
+REPLACE_SPRINTF
+REPLACE_SNPRINTF
+REPLACE_RENAMEAT
+REPLACE_RENAME
+REPLACE_REMOVE
+REPLACE_PRINTF
+REPLACE_POPEN
+REPLACE_PERROR
+REPLACE_OBSTACK_PRINTF
+REPLACE_GETLINE
+REPLACE_GETDELIM
+REPLACE_FTELLO
+REPLACE_FTELL
+REPLACE_FSEEKO
+REPLACE_FSEEK
+REPLACE_FREOPEN
+REPLACE_FPURGE
+REPLACE_FPRINTF
+REPLACE_FOPEN_FOR_FOPEN_GNU
+REPLACE_FOPEN
+REPLACE_FFLUSH
+REPLACE_FDOPEN
+REPLACE_FCLOSE
+REPLACE_DPRINTF
+HAVE_VDPRINTF
+HAVE_VASPRINTF
+HAVE_RENAMEAT
+HAVE_POPEN
+HAVE_PCLOSE
+HAVE_FTELLO
+HAVE_FSEEKO
+HAVE_DPRINTF
+HAVE_DECL_VSNPRINTF
+HAVE_DECL_SNPRINTF
+HAVE_DECL_PUTW
+HAVE_DECL_OBSTACK_PRINTF
+HAVE_DECL_GETW
+HAVE_DECL_GETLINE
+HAVE_DECL_GETDELIM
+HAVE_DECL_FTELLO
+HAVE_DECL_FSEEKO
+HAVE_DECL_FPURGE
+HAVE_DECL_FCLOSEALL
+HAVE_FEATURES_H
+GNULIBHEADERS_OVERRIDE_WINT_T
+APPLE_UNIVERSAL_BUILD
+HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+GL_COND_OBJ_ITOLD_FALSE
+GL_COND_OBJ_ITOLD_TRUE
+GL_COND_OBJ_FLOAT_FALSE
+GL_COND_OBJ_FLOAT_TRUE
+GL_GENERATE_FLOAT_H_FALSE
+GL_GENERATE_FLOAT_H_TRUE
+FLOAT_H
+REPLACE_ITOLD
+NEXT_AS_FIRST_DIRECTIVE_FLOAT_H
+NEXT_FLOAT_H
+GL_GENERATE_ERRNO_H_FALSE
+GL_GENERATE_ERRNO_H_TRUE
+ERRNO_H
+EOVERFLOW_VALUE
+EOVERFLOW_HIDDEN
+ENOLINK_VALUE
+ENOLINK_HIDDEN
+EMULTIHOP_VALUE
+EMULTIHOP_HIDDEN
+NEXT_AS_FIRST_DIRECTIVE_ERRNO_H
+NEXT_ERRNO_H
+GL_GENERATE_ASSERT_H_FALSE
+GL_GENERATE_ASSERT_H_TRUE
+ASSERT_H
+NEXT_AS_FIRST_DIRECTIVE_ASSERT_H
+NEXT_ASSERT_H
+PRAGMA_COLUMNS
+PRAGMA_SYSTEM_HEADER
+INCLUDE_NEXT_AS_FIRST_DIRECTIVE
+INCLUDE_NEXT
+GL_GENERATE_ALLOCA_H_FALSE
+GL_GENERATE_ALLOCA_H_TRUE
+ALLOCA_H
+HAVE_ALLOCA_H
+ALLOCA
+GL_COND_LIBTOOL_FALSE
+GL_COND_LIBTOOL_TRUE
+RANLIB
+ARFLAGS
+AR
+EGREP
+GREP
+CPP
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+ac_ct_CXX
+CXXFLAGS
+CXX
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+CSCOPE
+ETAGS
+CTAGS
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__include
+DEPDIR
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+SHORT_VERSION
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+runstatedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL
+referdir
+gpinyin_dir
+glilypond_dir
+libprogramdir
+am__quote'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_dependency_tracking
+enable_silent_rules
+enable_cross_guesses
+with_x
+with_appdefdir
+with_uchardet
+with_gnu_ld
+enable_rpath
+with_libiconv_prefix
+with_urw_fonts_dir
+enable_groff_allocator
+with_compatibility_wrappers
+with_alt_gs
+with_gs
+with_alt_awk
+with_awk
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CXX
+CXXFLAGS
+CCC
+CPP
+XMKMF
+PKG_CONFIG
+PKG_CONFIG_PATH
+PKG_CONFIG_LIBDIR
+UCHARDET_CFLAGS
+UCHARDET_LIBS
+CXXCPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -runstatedir | --runstatedir | --runstatedi | --runstated \
+ | --runstate | --runstat | --runsta | --runst | --runs \
+ | --run | --ru | --r)
+ ac_prev=runstatedir ;;
+ -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+ | --run=* | --ru=* | --r=*)
+ runstatedir=$ac_optarg ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir runstatedir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures GNU roff 1.23.0 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/groff]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+X features:
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of GNU roff 1.23.0:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-dependency-tracking
+ do not reject slow dependency extractors
+ --disable-dependency-tracking
+ speeds up one-time build
+ --enable-silent-rules less verbose build output (undo: "make V=1")
+ --disable-silent-rules verbose build output (undo: "make V=0")
+ --enable-cross-guesses={conservative|risky}
+ specify policy for cross-compilation guesses
+ --disable-rpath do not hardcode runtime library paths
+ --enable-groff-allocator
+ enable libgroff's allocator for C++ new/delete
+
+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-appdefdir=DIR place X11 application defaults files in DIR
+ --with-uchardet={auto|no|yes}
+ build 'preconv' against uchardet library to
+ automatically detect input file encoding
+ --with-gnu-ld assume the C compiler uses GNU ld [default=no]
+ --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib
+ --without-libiconv-prefix don't search for libiconv in includedir and libdir
+ --with-urw-fonts-dir=DIR
+ search for URW PostScript Type 1 fonts in DIR
+ --with-compatibility-wrappers={check|manual|no|yes}
+ choose whether and how groff compatibility wrappers
+ for vendor-provided non-GNU macro packages are
+ installed. 'check' searches for such packages, and
+ behaves as if 'yes' or 'no' were given, accordingly.
+ 'yes' generates compatibility wrappers for the
+ vendor-provided packages to allow their use with
+ groff and related tools. The compatibility wrappers
+ are installed using the vendor-provided names, while
+ their groff implementations are installed with a 'g'
+ prefix. Use of the latter thus requires options of
+ the form '-mg<package>' (example: -mgan). 'no'
+ installs only the groff implementations. 'manual'
+ generates compatibility wrappers for the
+ vendor-provided packages as '<macro>-os'. Use of the
+ latter thus requires options of the form
+ '-m<macro>-os' option (example: -man-os).
+ --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<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CXX C++ compiler command
+ CXXFLAGS C++ compiler flags
+ CPP C preprocessor
+ XMKMF Path to xmkmf, Makefile generator for X Window System
+ PKG_CONFIG path to pkg-config utility
+ PKG_CONFIG_PATH
+ directories to add to pkg-config's search path
+ PKG_CONFIG_LIBDIR
+ path overriding pkg-config's built-in search path
+ UCHARDET_CFLAGS
+ C compiler flags for UCHARDET, overriding pkg-config
+ UCHARDET_LIBS
+ linker flags for UCHARDET, overriding pkg-config
+ CXXCPP C++ preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <http://savannah.gnu.org/bugs/?group=groff>.
+GNU roff home page: <https://www.gnu.org/software/groff/>.
+General help using GNU software: <https://www.gnu.org/gethelp/>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+GNU roff configure 1.23.0
+generated by GNU Autoconf 2.71
+
+Copyright (C) 2021 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ eval "$3=no"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+if (sizeof ($2))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+if (sizeof (($2)))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that
+# executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: program exited with status $ac_status" >&5
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
+# --------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_c_compute_int ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_hi=$ac_mid; break
+else $as_nop
+ as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ done
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_lo=$ac_mid; break
+else $as_nop
+ as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ done
+else $as_nop
+ ac_lo= ac_hi=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_hi=$ac_mid
+else $as_nop
+ as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+static long int longval (void) { return $2; }
+static unsigned long int ulongval (void) { return $2; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main (void)
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ return 1;
+ if (($2) < 0)
+ {
+ long int i = longval ();
+ if (i != ($2))
+ return 1;
+ fprintf (f, "%ld", i);
+ }
+ else
+ {
+ unsigned long int i = ulongval ();
+ if (i != ($2))
+ return 1;
+ fprintf (f, "%lu", i);
+ }
+ /* Do not output a trailing newline, as this causes \r\n confusion
+ on some platforms. */
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ echo >>conftest.val; read $3 <conftest.val; ac_retval=0
+else $as_nop
+ ac_retval=1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f conftest.val
+
+ fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_compute_int
+
+# ac_fn_check_decl LINENO SYMBOL VAR INCLUDES EXTRA-OPTIONS FLAG-VAR
+# ------------------------------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly. Pass EXTRA-OPTIONS to the compiler, using FLAG-VAR.
+ac_fn_check_decl ()
+{
+ ac_save_ac_compile="$ac_compile"
+ if test -n "$ac_compile_for_check_decl"; then
+ ac_compile="$ac_compile_for_check_decl"
+ fi
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ as_decl_name=`echo $2|sed 's/ *(.*//'`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+printf %s "checking whether $as_decl_name is declared... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+ eval ac_save_FLAGS=\$$6
+ as_fn_append $6 " $5"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+ (void) $as_decl_use;
+#else
+ (void) $as_decl_name;
+#endif
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ eval $6=\$ac_save_FLAGS
+
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ ac_compile="$ac_save_ac_compile"
+
+} # ac_fn_check_decl
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below. */
+
+#include <limits.h>
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main (void)
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_cxx_try_run LINENO
+# ------------------------
+# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that
+# executables *can* be run.
+ac_fn_cxx_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: program exited with status $ac_status" >&5
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_run
+
+# ac_fn_cxx_try_link LINENO
+# -------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_link
+
+# ac_fn_cxx_try_cpp LINENO
+# ------------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_cpp
+ac_configure_args_raw=
+for ac_arg
+do
+ case $ac_arg in
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+ *$as_nl*)
+ ac_safe_unquote= ;;
+ *)
+ ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab.
+ ac_unsafe_a="$ac_unsafe_z#~"
+ ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+ ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
+
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by GNU roff $as_me 1.23.0, which was
+generated by GNU Autoconf 2.71. Invocation command line was
+
+ $ $0$ac_configure_args_raw
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ printf "%s\n" "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Sanitize IFS.
+ IFS=" "" $as_nl"
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ printf "%s\n" "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ printf "%s\n" "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ printf "%s\n" "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ printf "%s\n" "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ printf "%s\n" "$as_me: caught signal $ac_signal"
+ printf "%s\n" "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+printf "%s\n" "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+ ac_site_files="$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+ ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
+else
+ ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+fi
+
+for ac_site_file in $ac_site_files
+do
+ case $ac_site_file in #(
+ */*) :
+ ;; #(
+ *) :
+ ac_site_file=./$ac_site_file ;;
+esac
+ if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H"
+# Test code for whether the C compiler supports C89 (global declarations)
+ac_c_conftest_c89_globals='
+/* Does the compiler advertise C89 conformance?
+ Do not test the value of __STDC__, because some compilers set it to 0
+ while being otherwise adequately conformant. */
+#if !defined __STDC__
+# error "Compiler does not advertise C89 conformance"
+#endif
+
+#include <stddef.h>
+#include <stdarg.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */
+struct buf { int x; };
+struct buf * (*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 do not provoke an error unfortunately, instead are silently treated
+ as an "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 is necessary to write \x00 == 0 to get something
+ that is true only with -std. */
+int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) '\''x'\''
+int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),
+ int, int);'
+
+# Test code for whether the C compiler supports C89 (body of main).
+ac_c_conftest_c89_main='
+ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
+'
+
+# Test code for whether the C compiler supports C99 (global declarations)
+ac_c_conftest_c99_globals='
+// Does the compiler advertise C99 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
+# error "Compiler does not advertise C99 conformance"
+#endif
+
+#include <stdbool.h>
+extern int puts (const char *);
+extern int printf (const char *, ...);
+extern int dprintf (int, const char *, ...);
+extern void *malloc (size_t);
+
+// Check varargs macros. These examples are taken from C99 6.10.3.5.
+// dprintf is used instead of fprintf to avoid needing to declare
+// FILE and stderr.
+#define debug(...) dprintf (2, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+ int x = 1234;
+ int y = 5678;
+ debug ("Flag");
+ debug ("X = %d\n", x);
+ showlist (The first, second, and third items.);
+ report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+ #error "your preprocessor is broken"
+#endif
+#if BIG_OK
+#else
+ #error "your preprocessor is broken"
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+ int datasize;
+ double data[];
+};
+
+struct named_init {
+ int number;
+ const wchar_t *name;
+ double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+ // See if C++-style comments work.
+ // Iterate through items via the restricted pointer.
+ // Also check for declarations in for loops.
+ for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
+ continue;
+ return 0;
+}
+
+// Check varargs and va_copy.
+static bool
+test_varargs (const char *format, ...)
+{
+ va_list args;
+ va_start (args, format);
+ va_list args_copy;
+ va_copy (args_copy, args);
+
+ const char *str = "";
+ int number = 0;
+ float fnumber = 0;
+
+ while (*format)
+ {
+ switch (*format++)
+ {
+ case '\''s'\'': // string
+ str = va_arg (args_copy, const char *);
+ break;
+ case '\''d'\'': // int
+ number = va_arg (args_copy, int);
+ break;
+ case '\''f'\'': // float
+ fnumber = va_arg (args_copy, double);
+ break;
+ default:
+ break;
+ }
+ }
+ va_end (args_copy);
+ va_end (args);
+
+ return *str && number && fnumber;
+}
+'
+
+# Test code for whether the C compiler supports C99 (body of main).
+ac_c_conftest_c99_main='
+ // Check bool.
+ _Bool success = false;
+ success |= (argc != 0);
+
+ // Check restrict.
+ if (test_restrict ("String literal") == 0)
+ success = true;
+ char *restrict newvar = "Another string";
+
+ // Check varargs.
+ success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);
+ test_varargs_macros ();
+
+ // Check flexible array members.
+ struct incomplete_array *ia =
+ malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+ ia->datasize = 10;
+ for (int i = 0; i < ia->datasize; ++i)
+ ia->data[i] = i * 1.234;
+
+ // Check named initializers.
+ struct named_init ni = {
+ .number = 34,
+ .name = L"Test wide string",
+ .average = 543.34343,
+ };
+
+ ni.number = 58;
+
+ int dynamic_array[ni.number];
+ dynamic_array[0] = argv[0][0];
+ dynamic_array[ni.number - 1] = 543;
+
+ // work around unused variable warnings
+ ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''
+ || dynamic_array[ni.number - 1] != 543);
+'
+
+# Test code for whether the C compiler supports C11 (global declarations)
+ac_c_conftest_c11_globals='
+// Does the compiler advertise C11 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
+# error "Compiler does not advertise C11 conformance"
+#endif
+
+// Check _Alignas.
+char _Alignas (double) aligned_as_double;
+char _Alignas (0) no_special_alignment;
+extern char aligned_as_int;
+char _Alignas (0) _Alignas (int) aligned_as_int;
+
+// Check _Alignof.
+enum
+{
+ int_alignment = _Alignof (int),
+ int_array_alignment = _Alignof (int[100]),
+ char_alignment = _Alignof (char)
+};
+_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
+
+// Check _Noreturn.
+int _Noreturn does_not_return (void) { for (;;) continue; }
+
+// Check _Static_assert.
+struct test_static_assert
+{
+ int x;
+ _Static_assert (sizeof (int) <= sizeof (long int),
+ "_Static_assert does not work in struct");
+ long int y;
+};
+
+// Check UTF-8 literals.
+#define u8 syntax error!
+char const utf8_literal[] = u8"happens to be ASCII" "another string";
+
+// Check duplicate typedefs.
+typedef long *long_ptr;
+typedef long int *long_ptr;
+typedef long_ptr long_ptr;
+
+// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
+struct anonymous
+{
+ union {
+ struct { int i; int j; };
+ struct { int k; long int l; } w;
+ };
+ int m;
+} v1;
+'
+
+# Test code for whether the C compiler supports C11 (body of main).
+ac_c_conftest_c11_main='
+ _Static_assert ((offsetof (struct anonymous, i)
+ == offsetof (struct anonymous, w.k)),
+ "Anonymous union alignment botch");
+ v1.i = 2;
+ v1.w.k = 5;
+ ok |= v1.i != 5;
+'
+
+# Test code for whether the C compiler supports C11 (complete).
+ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+${ac_c_conftest_c11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ ${ac_c_conftest_c11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C99 (complete).
+ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C89 (complete).
+ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ return ok;
+}
+"
+
+as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H"
+as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H"
+as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H"
+as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H"
+as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H"
+as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
+as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
+as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"
+as_fn_append ac_header_c_list " wchar.h wchar_h HAVE_WCHAR_H"
+as_fn_append ac_header_c_list " minix/config.h minix_config_h HAVE_MINIX_CONFIG_H"
+# Test code for whether the C++ compiler supports C++98 (global declarations)
+ac_cxx_conftest_cxx98_globals='
+// Does the compiler advertise C++98 conformance?
+#if !defined __cplusplus || __cplusplus < 199711L
+# error "Compiler does not advertise C++98 conformance"
+#endif
+
+// These inclusions are to reject old compilers that
+// lack the unsuffixed header files.
+#include <cstdlib>
+#include <exception>
+
+// <cassert> and <cstring> are *not* freestanding headers in C++98.
+extern void assert (int);
+namespace std {
+ extern int strcmp (const char *, const char *);
+}
+
+// Namespaces, exceptions, and templates were all added after "C++ 2.0".
+using std::exception;
+using std::strcmp;
+
+namespace {
+
+void test_exception_syntax()
+{
+ try {
+ throw "test";
+ } catch (const char *s) {
+ // Extra parentheses suppress a warning when building autoconf itself,
+ // due to lint rules shared with more typical C programs.
+ assert (!(strcmp) (s, "test"));
+ }
+}
+
+template <typename T> struct test_template
+{
+ T const val;
+ explicit test_template(T t) : val(t) {}
+ template <typename U> T add(U u) { return static_cast<T>(u) + val; }
+};
+
+} // anonymous namespace
+'
+
+# Test code for whether the C++ compiler supports C++98 (body of main)
+ac_cxx_conftest_cxx98_main='
+ assert (argc);
+ assert (! argv[0]);
+{
+ test_exception_syntax ();
+ test_template<double> tt (2.0);
+ assert (tt.add (4) == 6.0);
+ assert (true && !false);
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (global declarations)
+ac_cxx_conftest_cxx11_globals='
+// Does the compiler advertise C++ 2011 conformance?
+#if !defined __cplusplus || __cplusplus < 201103L
+# error "Compiler does not advertise C++11 conformance"
+#endif
+
+namespace cxx11test
+{
+ constexpr int get_val() { return 20; }
+
+ struct testinit
+ {
+ int i;
+ double d;
+ };
+
+ class delegate
+ {
+ public:
+ delegate(int n) : n(n) {}
+ delegate(): delegate(2354) {}
+
+ virtual int getval() { return this->n; };
+ protected:
+ int n;
+ };
+
+ class overridden : public delegate
+ {
+ public:
+ overridden(int n): delegate(n) {}
+ virtual int getval() override final { return this->n * 2; }
+ };
+
+ class nocopy
+ {
+ public:
+ nocopy(int i): i(i) {}
+ nocopy() = default;
+ nocopy(const nocopy&) = delete;
+ nocopy & operator=(const nocopy&) = delete;
+ private:
+ int i;
+ };
+
+ // for testing lambda expressions
+ template <typename Ret, typename Fn> Ret eval(Fn f, Ret v)
+ {
+ return f(v);
+ }
+
+ // for testing variadic templates and trailing return types
+ template <typename V> auto sum(V first) -> V
+ {
+ return first;
+ }
+ template <typename V, typename... Args> auto sum(V first, Args... rest) -> V
+ {
+ return first + sum(rest...);
+ }
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (body of main)
+ac_cxx_conftest_cxx11_main='
+{
+ // Test auto and decltype
+ auto a1 = 6538;
+ auto a2 = 48573953.4;
+ auto a3 = "String literal";
+
+ int total = 0;
+ for (auto i = a3; *i; ++i) { total += *i; }
+
+ decltype(a2) a4 = 34895.034;
+}
+{
+ // Test constexpr
+ short sa[cxx11test::get_val()] = { 0 };
+}
+{
+ // Test initializer lists
+ cxx11test::testinit il = { 4323, 435234.23544 };
+}
+{
+ // Test range-based for
+ int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3,
+ 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
+ for (auto &x : array) { x += 23; }
+}
+{
+ // Test lambda expressions
+ using cxx11test::eval;
+ assert (eval ([](int x) { return x*2; }, 21) == 42);
+ double d = 2.0;
+ assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0);
+ assert (d == 5.0);
+ assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0);
+ assert (d == 5.0);
+}
+{
+ // Test use of variadic templates
+ using cxx11test::sum;
+ auto a = sum(1);
+ auto b = sum(1, 2);
+ auto c = sum(1.0, 2.0, 3.0);
+}
+{
+ // Test constructor delegation
+ cxx11test::delegate d1;
+ cxx11test::delegate d2();
+ cxx11test::delegate d3(45);
+}
+{
+ // Test override and final
+ cxx11test::overridden o1(55464);
+}
+{
+ // Test nullptr
+ char *c = nullptr;
+}
+{
+ // Test template brackets
+ test_template<::test_template<int>> v(test_template<int>(12));
+}
+{
+ // Unicode literals
+ char const *utf8 = u8"UTF-8 string \u2500";
+ char16_t const *utf16 = u"UTF-8 string \u2500";
+ char32_t const *utf32 = U"UTF-32 string \u2500";
+}
+'
+
+# Test code for whether the C compiler supports C++11 (complete).
+ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals}
+${ac_cxx_conftest_cxx11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_cxx_conftest_cxx98_main}
+ ${ac_cxx_conftest_cxx11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C++98 (complete).
+ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals}
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_cxx_conftest_cxx98_main}
+ return ok;
+}
+"
+
+as_fn_append ac_func_c_list " vasnprintf HAVE_VASNPRINTF"
+as_fn_append ac_header_c_list " features.h features_h HAVE_FEATURES_H"
+as_fn_append ac_func_c_list " snprintf HAVE_SNPRINTF"
+as_fn_append ac_header_c_list " limits.h limits_h HAVE_LIMITS_H"
+as_fn_append ac_func_c_list " symlink HAVE_SYMLINK"
+as_fn_append ac_header_c_list " math.h math_h HAVE_MATH_H"
+as_fn_append ac_header_c_list " sys/mman.h sys_mman_h HAVE_SYS_MMAN_H"
+as_fn_append ac_func_c_list " mprotect HAVE_MPROTECT"
+gl_printf_safe=yes
+as_fn_append ac_header_c_list " crtdefs.h crtdefs_h HAVE_CRTDEFS_H"
+as_fn_append ac_func_c_list " iswcntrl HAVE_ISWCNTRL"
+as_fn_append ac_header_c_list " wctype.h wctype_h HAVE_WCTYPE_H"
+as_fn_append ac_func_c_list " wcwidth HAVE_WCWIDTH"
+as_fn_append ac_header_c_list " sys/param.h sys_param_h HAVE_SYS_PARAM_H"
+as_fn_append ac_func_c_list " getpagesize HAVE_GETPAGESIZE"
+
+# Auxiliary files required by this configure script.
+ac_aux_files="config.rpath config.guess config.sub missing install-sh compile"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${srcdir}/build-aux"
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5
+ ac_aux_dir_found=yes
+ ac_install_sh=
+ for ac_aux in $ac_aux_files
+ do
+ # As a special case, if "install-sh" is required, that requirement
+ # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+ # and $ac_install_sh is set appropriately for whichever one is found.
+ if test x"$ac_aux" = x"install-sh"
+ then
+ if test -f "${as_dir}install-sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5
+ ac_install_sh="${as_dir}install-sh -c"
+ elif test -f "${as_dir}install.sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5
+ ac_install_sh="${as_dir}install.sh -c"
+ elif test -f "${as_dir}shtool"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5
+ ac_install_sh="${as_dir}shtool install -c"
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+ else
+ break
+ fi
+ fi
+ else
+ if test -f "${as_dir}${ac_aux}"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+ else
+ break
+ fi
+ fi
+ fi
+ done
+ if test "$ac_aux_dir_found" = yes; then
+ ac_aux_dir="$as_dir"
+ break
+ fi
+ ac_first_candidate=false
+
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5
+fi
+
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+if test -f "${ac_aux_dir}config.guess"; then
+ ac_config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+ ac_config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+ ac_configure="$SHELL ${ac_aux_dir}configure"
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file'
+ and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+# SHORT_VERSION contains only the number of REVISION before the first
+# '.'; e.g., if REVISION is '3.real.434-5aafd' then SHORT_VERSION is
+# 'x.yy.3', where x and yy are MAJOR_VERSION and MINOR_VERSION,
+# respectively.
+SHORT_VERSION=1.23.0
+
+
+# Directories where the helper scripts should be found. This must be
+# consistent with the variable build_aux in bootstrap.conf.
+
+
+ac_config_headers="$ac_config_headers src/include/config.h:src/include/config.hin"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+
+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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+
+
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion -version; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+printf %s "checking whether the C compiler works... " >&6; }
+ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else $as_nop
+ ac_file=''
+fi
+if test -z "$ac_file"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+printf %s "checking for C compiler default output file name... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+printf "%s\n" "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+printf %s "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+printf "%s\n" "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main (void)
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+printf %s "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+printf "%s\n" "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+printf %s "checking for suffix of object files... " >&6; }
+if test ${ac_cv_objext+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+printf "%s\n" "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_compiler_gnu=yes
+else $as_nop
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+y}
+ac_save_CFLAGS=$CFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+else $as_nop
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; 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
+ac_prog_cc_stdc=no
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c11=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
+ CC="$CC $ac_cv_prog_cc_c11"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+ ac_prog_cc_stdc=c11
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c99_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c99" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c99" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
+ CC="$CC $ac_cv_prog_cc_c99"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+ ac_prog_cc_stdc=c99
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c89" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c89" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
+ CC="$CC $ac_cv_prog_cc_c89"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+ ac_prog_cc_stdc=c89
+fi
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+printf %s "checking whether $CC understands -c and -o together... " >&6; }
+if test ${am_cv_prog_cc_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+ ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+printf "%s\n" "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler is clang" >&5
+printf %s "checking whether the compiler is clang... " >&6; }
+if test ${gl_cv_compiler_clang+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #ifdef __clang__
+ barfbarf
+ #endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_compiler_clang=no
+else $as_nop
+ gl_cv_compiler_clang=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compiler_clang" >&5
+printf "%s\n" "$gl_cv_compiler_clang" >&6; }
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compiler option needed when checking for declarations" >&5
+printf %s "checking for compiler option needed when checking for declarations... " >&6; }
+if test ${gl_cv_compiler_check_decl_option+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test $gl_cv_compiler_clang = yes; then
+ save_ac_compile="$ac_compile"
+ ac_compile="$ac_compile -Werror=implicit-function-declaration"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_compiler_check_decl_option='-Werror=implicit-function-declaration'
+else $as_nop
+ gl_cv_compiler_check_decl_option=none
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_compile="$save_ac_compile"
+ else
+ gl_cv_compiler_check_decl_option=none
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compiler_check_decl_option" >&5
+printf "%s\n" "$gl_cv_compiler_check_decl_option" >&6; }
+ if test "x$gl_cv_compiler_check_decl_option" != xnone; then
+ ac_compile_for_check_decl="$ac_compile $gl_cv_compiler_check_decl_option"
+ else
+ ac_compile_for_check_decl="$ac_compile"
+ fi
+
+
+
+ac_header= ac_cache=
+for ac_item in $ac_header_c_list
+do
+ if test $ac_cache; then
+ ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default"
+ if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then
+ printf "%s\n" "#define $ac_item 1" >> confdefs.h
+ fi
+ ac_header= ac_cache=
+ elif test $ac_header; then
+ ac_cache=$ac_item
+ else
+ ac_header=$ac_item
+ fi
+done
+
+
+
+
+
+
+
+
+if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes
+then :
+
+printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5
+printf %s "checking whether it is safe to define __EXTENSIONS__... " >&6; }
+if test ${ac_cv_safe_to_define___extensions__+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# define __EXTENSIONS__ 1
+ $ac_includes_default
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_safe_to_define___extensions__=yes
+else $as_nop
+ ac_cv_safe_to_define___extensions__=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5
+printf "%s\n" "$ac_cv_safe_to_define___extensions__" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5
+printf %s "checking whether _XOPEN_SOURCE should be defined... " >&6; }
+if test ${ac_cv_should_define__xopen_source+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_should_define__xopen_source=no
+ if test $ac_cv_header_wchar_h = yes
+then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <wchar.h>
+ mbstate_t x;
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #define _XOPEN_SOURCE 500
+ #include <wchar.h>
+ mbstate_t x;
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_should_define__xopen_source=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5
+printf "%s\n" "$ac_cv_should_define__xopen_source" >&6; }
+
+ printf "%s\n" "#define _ALL_SOURCE 1" >>confdefs.h
+
+ printf "%s\n" "#define _DARWIN_C_SOURCE 1" >>confdefs.h
+
+ printf "%s\n" "#define _GNU_SOURCE 1" >>confdefs.h
+
+ printf "%s\n" "#define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h
+
+ printf "%s\n" "#define _NETBSD_SOURCE 1" >>confdefs.h
+
+ printf "%s\n" "#define _OPENBSD_SOURCE 1" >>confdefs.h
+
+ printf "%s\n" "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_IEC_60559_EXT__ 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h
+
+ printf "%s\n" "#define _TANDEM_SOURCE 1" >>confdefs.h
+
+ if test $ac_cv_header_minix_config_h = yes
+then :
+ MINIX=yes
+ printf "%s\n" "#define _MINIX 1" >>confdefs.h
+
+ printf "%s\n" "#define _POSIX_SOURCE 1" >>confdefs.h
+
+ printf "%s\n" "#define _POSIX_1_SOURCE 2" >>confdefs.h
+
+else $as_nop
+ MINIX=
+fi
+ if test $ac_cv_safe_to_define___extensions__ = yes
+then :
+ printf "%s\n" "#define __EXTENSIONS__ 1" >>confdefs.h
+
+fi
+ if test $ac_cv_should_define__xopen_source = yes
+then :
+ printf "%s\n" "#define _XOPEN_SOURCE 500" >>confdefs.h
+
+fi
+
+
+am__api_version='1.16'
+
+
+ # Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+printf %s "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if test ${ac_cv_path_install+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ # Account for fact that we put trailing slashes in our PATH walk.
+case $as_dir in #((
+ ./ | /[cC]/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+ done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test ${ac_cv_path_install+y}; 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+printf "%s\n" "$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'
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+printf %s "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[\\\"\#\$\&\'\`$am_lf]*)
+ as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+ *[\\\"\#\$\&\'\`$am_lf\ \ ]*)
+ as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
+ alias in your environment" "$LINENO" 5
+ fi
+ if test "$2" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+ program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"`
+
+
+ if test x"${MISSING+set}" != xset; then
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+printf "%s\n" "$STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+printf "%s\n" "$ac_ct_STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5
+printf %s "checking for a race-free mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+ if test ${ac_cv_path_mkdir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue
+ case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir ('*'coreutils) '* | \
+ 'BusyBox '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+ done
+IFS=$as_save_IFS
+
+fi
+
+ test -d ./--version && rmdir ./--version
+ if test ${ac_cv_path_mkdir+y}; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for MKDIR_P within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+printf "%s\n" "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AWK+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+printf "%s\n" "$AWK" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$AWK" && break
+done
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval test \${ac_cv_prog_make_${ac_make}_set+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+ @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+ *@@@%%%=?*=@@@%%%*)
+ eval ac_cv_prog_make_${ac_make}_set=yes;;
+ *)
+ eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ SET_MAKE=
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
+printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; }
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
+ (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ case $?:`cat confinc.out 2>/dev/null` in #(
+ '0:this is the am__doit target') :
+ case $s in #(
+ BSD) :
+ am__include='.include' am__quote='"' ;; #(
+ *) :
+ am__include='include' am__quote='' ;;
+esac ;; #(
+ *) :
+ ;;
+esac
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
+printf "%s\n" "${_am_result}" >&6; }
+
+# Check whether --enable-dependency-tracking was given.
+if test ${enable_dependency_tracking+y}
+then :
+ enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+# Check whether --enable-silent-rules was given.
+if test ${enable_silent_rules+y}
+then :
+ enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+printf %s "checking whether $am_make supports nested variables... " >&6; }
+if test ${am_cv_make_support_nested_variables+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if printf "%s\n" 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+printf "%s\n" "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ am__isrc=' -I$(srcdir)'
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='groff'
+ VERSION='1.23.0'
+
+
+printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
+
+
+printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar pax cpio none'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+depcc="$CC" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CC_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+# Variables for tags utilities; see am/tags.am
+if test -z "$CTAGS"; then
+ CTAGS=ctags
+fi
+
+if test -z "$ETAGS"; then
+ ETAGS=etags
+fi
+
+if test -z "$CSCOPE"; then
+ CSCOPE=cscope
+fi
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+ fi
+fi
+
+
+# Check whether --enable-silent-rules was given.
+if test ${enable_silent_rules+y}
+then :
+ enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=0;;
+esac
+am_make=${MAKE-make}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+printf %s "checking whether $am_make supports nested variables... " >&6; }
+if test ${am_cv_make_support_nested_variables+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if printf "%s\n" 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+printf "%s\n" "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+
+# 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+
+
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion -version; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_compiler_gnu=yes
+else $as_nop
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+y}
+ac_save_CFLAGS=$CFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+else $as_nop
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; 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
+ac_prog_cc_stdc=no
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c11=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
+ CC="$CC $ac_cv_prog_cc_c11"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+ ac_prog_cc_stdc=c11
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c99_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c99" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c99" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
+ CC="$CC $ac_cv_prog_cc_c99"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+ ac_prog_cc_stdc=c99
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c89" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c89" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
+ CC="$CC $ac_cv_prog_cc_c89"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+ ac_prog_cc_stdc=c89
+fi
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+printf %s "checking whether $CC understands -c and -o together... " >&6; }
+if test ${am_cv_prog_cc_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+ ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+printf "%s\n" "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler is clang" >&5
+printf %s "checking whether the compiler is clang... " >&6; }
+if test ${gl_cv_compiler_clang+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #ifdef __clang__
+ barfbarf
+ #endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_compiler_clang=no
+else $as_nop
+ gl_cv_compiler_clang=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compiler_clang" >&5
+printf "%s\n" "$gl_cv_compiler_clang" >&6; }
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compiler option needed when checking for declarations" >&5
+printf %s "checking for compiler option needed when checking for declarations... " >&6; }
+if test ${gl_cv_compiler_check_decl_option+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test $gl_cv_compiler_clang = yes; then
+ save_ac_compile="$ac_compile"
+ ac_compile="$ac_compile -Werror=implicit-function-declaration"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_compiler_check_decl_option='-Werror=implicit-function-declaration'
+else $as_nop
+ gl_cv_compiler_check_decl_option=none
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_compile="$save_ac_compile"
+ else
+ gl_cv_compiler_check_decl_option=none
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compiler_check_decl_option" >&5
+printf "%s\n" "$gl_cv_compiler_check_decl_option" >&6; }
+ if test "x$gl_cv_compiler_check_decl_option" != xnone; then
+ ac_compile_for_check_decl="$ac_compile $gl_cv_compiler_check_decl_option"
+ else
+ ac_compile_for_check_decl="$ac_compile"
+ fi
+
+
+
+
+
+
+
+
+ac_ext=cpp
+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 -z "$CXX"; then
+ if test -n "$CCC"; then
+ CXX=$CCC
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+printf "%s\n" "$CXX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$CXX" && break
+ done
+fi
+if test -z "$CXX"; then
+ ac_ct_CXX=$CXX
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+printf "%s\n" "$ac_ct_CXX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CXX" && break
+done
+
+ if test "x$ac_ct_CXX" = x; then
+ CXX="g++"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CXX=$ac_ct_CXX
+ fi
+fi
+
+ fi
+fi
+# Provide some information about the compiler.
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5
+printf %s "checking whether the compiler supports GNU C++... " >&6; }
+if test ${ac_cv_cxx_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_compiler_gnu=yes
+else $as_nop
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+ GXX=yes
+else
+ GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+y}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+printf %s "checking whether $CXX accepts -g... " >&6; }
+if test ${ac_cv_prog_cxx_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+ ac_cxx_werror_flag=yes
+ ac_cv_prog_cxx_g=no
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_g=yes
+else $as_nop
+ CXXFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+
+else $as_nop
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+printf "%s\n" "$ac_cv_prog_cxx_g" >&6; }
+if test $ac_test_CXXFLAGS; 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
+ac_prog_cxx_stdcxx=no
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5
+printf %s "checking for $CXX option to enable C++11 features... " >&6; }
+if test ${ac_cv_prog_cxx_11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_11=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx11_program
+_ACEOF
+for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx11"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11
+ ac_prog_cxx_stdcxx=cxx11
+fi
+fi
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5
+printf %s "checking for $CXX option to enable C++98 features... " >&6; }
+if test ${ac_cv_prog_cxx_98+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_98=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx98_program
+_ACEOF
+for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx98=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx98" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx98" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx98" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx98"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98
+ ac_prog_cxx_stdcxx=cxx98
+fi
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CXX_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CXX_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CXX_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+ am__fastdepCXX_TRUE=
+ am__fastdepCXX_FALSE='#'
+else
+ am__fastdepCXX_TRUE='#'
+ am__fastdepCXX_FALSE=
+fi
+
+
+
+
+ # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
+test "x$ac_build_alias" = x &&
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+
+
+
+ case "$host_os" in
+ openbsd*)
+
+printf "%s\n" "#define _ISOC11_SOURCE 1" >>confdefs.h
+
+ ;;
+ esac
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+printf %s "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test ${ac_cv_prog_CPP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # Double quotes because $CC needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" 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.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else $as_nop
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+printf "%s\n" "$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.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else $as_nop
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+printf %s "checking for grep that handles long lines and -e... " >&6; }
+if test ${ac_cv_path_GREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in grep ggrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+printf "%s\n" "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+printf %s "checking for egrep... " >&6; }
+if test ${ac_cv_path_EGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in egrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+printf "%s\n" "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Minix Amsterdam compiler" >&5
+printf %s "checking for Minix Amsterdam compiler... " >&6; }
+if test ${gl_cv_c_amsterdam_compiler+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef __ACK__
+Amsterdam
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Amsterdam" >/dev/null 2>&1
+then :
+ gl_cv_c_amsterdam_compiler=yes
+else $as_nop
+ gl_cv_c_amsterdam_compiler=no
+fi
+rm -rf conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_amsterdam_compiler" >&5
+printf "%s\n" "$gl_cv_c_amsterdam_compiler" >&6; }
+
+ if test $gl_cv_c_amsterdam_compiler = yes; then
+ if test -z "$AR"; then
+ AR='cc -c.a'
+ fi
+ if test -z "$ARFLAGS"; then
+ ARFLAGS='-o'
+ fi
+ else
+ :
+ fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AR="${ac_tool_prefix}ar"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+printf "%s\n" "$AR" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+ ac_ct_AR=$AR
+ # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_AR"; then
+ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AR="ar"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+printf "%s\n" "$ac_ct_AR" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_AR" = x; then
+ AR="ar"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ AR=$ac_ct_AR
+ fi
+else
+ AR="$ac_cv_prog_AR"
+fi
+
+ if test -z "$ARFLAGS"; then
+ ARFLAGS='cr'
+ fi
+
+
+
+ if test -z "$RANLIB"; then
+ if test $gl_cv_c_amsterdam_compiler = yes; then
+ RANLIB=':'
+ else
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+printf "%s\n" "$RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+printf "%s\n" "$ac_ct_RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+ fi
+ fi
+
+
+
+
+
+ # IEEE behaviour is the default on all CPUs except Alpha and SH
+ # (according to the test results of Bruno Haible's ieeefp/fenv_default.m4
+ # and the GCC 4.1.2 manual).
+ case "$host_cpu" in
+ alpha*)
+ # On Alpha systems, a compiler option provides the behaviour.
+ # See the ieee(3) manual page, also available at
+ # <https://backdrift.org/man/tru64/man3/ieee.3.html>
+ if test -n "$GCC"; then
+ # GCC has the option -mieee.
+ # For full IEEE compliance (rarely needed), use option -mieee-with-inexact.
+ CPPFLAGS="$CPPFLAGS -mieee"
+ else
+ # Compaq (ex-DEC) C has the option -ieee, equivalent to -ieee_with_no_inexact.
+ # For full IEEE compliance (rarely needed), use option -ieee_with_inexact.
+ CPPFLAGS="$CPPFLAGS -ieee"
+ fi
+ ;;
+ sh*)
+ if test -n "$GCC"; then
+ # GCC has the option -mieee.
+ CPPFLAGS="$CPPFLAGS -mieee"
+ fi
+ ;;
+ esac
+
+
+
+ # Pre-early section.
+
+
+
+ # Code from module absolute-header:
+ # Code from module alloca-opt:
+ # Code from module assert-h:
+ # Code from module attribute:
+ # Code from module errno:
+ # Code from module extensions:
+ # Code from module extern-inline:
+ # Code from module float:
+ # Code from module fpieee:
+
+ # Code from module fprintf-posix:
+ # Code from module fpucw:
+ # Code from module free-posix:
+ # Code from module frexp-nolibm:
+ # Code from module frexpl-nolibm:
+ # Code from module fseterr:
+ # Code from module gen-header:
+ # Code from module git-version-gen:
+ # Code from module havelib:
+ # Code from module include_next:
+ # Code from module inttypes-incomplete:
+ # Code from module isnand-nolibm:
+ # Code from module isnanf-nolibm:
+ # Code from module isnanl-nolibm:
+ # Code from module limits-h:
+ # Code from module localcharset:
+ # Code from module math:
+ # Code from module memchr:
+ # Code from module multiarch:
+ # Code from module nocrash:
+ # Code from module printf-frexp:
+ # Code from module printf-frexpl:
+ # Code from module printf-safe:
+ # Code from module signbit:
+ # Code from module size_max:
+ # Code from module snippet/_Noreturn:
+ # Code from module snippet/arg-nonnull:
+ # Code from module snippet/c++defs:
+ # Code from module snippet/warn-on-use:
+ # Code from module snprintf:
+ # Code from module ssize_t:
+ # Code from module stdbool-c99:
+ # Code from module stddef:
+ # Code from module stdint:
+ # Code from module stdio:
+ # Code from module stdlib:
+ # Code from module streq:
+ # Code from module string:
+ # Code from module sys_types:
+ # Code from module unistd:
+ # Code from module unitypes:
+ # Code from module uniwidth/base:
+ # Code from module uniwidth/width:
+ # Code from module vasnprintf:
+ # Code from module vsnprintf:
+ # Code from module wchar:
+ # Code from module wctype-h:
+ # Code from module wcwidth:
+ # Code from module xsize:
+
+
+
+
+
+
+
+
+
+ # Check whether --enable-cross-guesses was given.
+if test ${enable_cross_guesses+y}
+then :
+ enableval=$enable_cross_guesses; if test "x$enableval" != xconservative && test "x$enableval" != xrisky; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: invalid argument supplied to --enable-cross-guesses" >&5
+printf "%s\n" "$as_me: WARNING: invalid argument supplied to --enable-cross-guesses" >&2;}
+ enableval=conservative
+ fi
+ gl_cross_guesses="$enableval"
+else $as_nop
+ gl_cross_guesses=conservative
+fi
+
+ if test $gl_cross_guesses = risky; then
+ gl_cross_guess_normal="guessing yes"
+ gl_cross_guess_inverted="guessing no"
+ else
+ gl_cross_guess_normal="guessing no"
+ gl_cross_guess_inverted="guessing yes"
+ fi
+ LIBC_FATAL_STDERR_=1
+ export LIBC_FATAL_STDERR_
+
+
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define size_t unsigned int" >>confdefs.h
+
+fi
+
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments. Useless!
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5
+printf %s "checking for working alloca.h... " >&6; }
+if test ${ac_cv_working_alloca_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <alloca.h>
+int
+main (void)
+{
+char *p = (char *) alloca (2 * sizeof (int));
+ if (p) return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_working_alloca_h=yes
+else $as_nop
+ ac_cv_working_alloca_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5
+printf "%s\n" "$ac_cv_working_alloca_h" >&6; }
+if test $ac_cv_working_alloca_h = yes; then
+
+printf "%s\n" "#define HAVE_ALLOCA_H 1" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
+printf %s "checking for alloca... " >&6; }
+if test ${ac_cv_func_alloca_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test $ac_cv_working_alloca_h = yes; then
+ ac_cv_func_alloca_works=yes
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stddef.h>
+#ifndef alloca
+# ifdef __GNUC__
+# define alloca __builtin_alloca
+# elif defined _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# else
+# ifdef __cplusplus
+extern "C"
+# endif
+void *alloca (size_t);
+# endif
+#endif
+
+int
+main (void)
+{
+char *p = (char *) alloca (1);
+ if (p) return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_func_alloca_works=yes
+else $as_nop
+ ac_cv_func_alloca_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5
+printf "%s\n" "$ac_cv_func_alloca_works" >&6; }
+fi
+
+if test $ac_cv_func_alloca_works = yes; then
+
+printf "%s\n" "#define HAVE_ALLOCA 1" >>confdefs.h
+
+else
+ # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+# that cause trouble. Some versions do not even contain alloca or
+# contain a buggy version. If you still want to use their alloca,
+# use ar to extract alloca.o from them instead of compiling alloca.c.
+
+
+
+
+
+ALLOCA=\${LIBOBJDIR}alloca.$ac_objext
+
+printf "%s\n" "#define C_ALLOCA 1" >>confdefs.h
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5
+printf %s "checking stack direction for C alloca... " >&6; }
+if test ${ac_cv_c_stack_direction+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ ac_cv_c_stack_direction=0
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+find_stack_direction (int *addr, int depth)
+{
+ int dir, dummy = 0;
+ if (! addr)
+ addr = &dummy;
+ *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
+ dir = depth ? find_stack_direction (addr, depth - 1) : 0;
+ return dir + dummy;
+}
+
+int
+main (int argc, char **argv)
+{
+ return find_stack_direction (0, argc + !argv + 20) < 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ ac_cv_c_stack_direction=1
+else $as_nop
+ ac_cv_c_stack_direction=-1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5
+printf "%s\n" "$ac_cv_c_stack_direction" >&6; }
+printf "%s\n" "#define STACK_DIRECTION $ac_cv_c_stack_direction" >>confdefs.h
+
+
+fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the preprocessor supports include_next" >&5
+printf %s "checking whether the preprocessor supports include_next... " >&6; }
+if test ${gl_cv_have_include_next+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ rm -rf conftestd1a conftestd1b conftestd2
+ mkdir conftestd1a conftestd1b conftestd2
+ cat <<EOF > conftestd1a/conftest.h
+#define DEFINED_IN_CONFTESTD1
+#include_next <conftest.h>
+#ifdef DEFINED_IN_CONFTESTD2
+int foo;
+#else
+#error "include_next doesn't work"
+#endif
+EOF
+ cat <<EOF > conftestd1b/conftest.h
+#define DEFINED_IN_CONFTESTD1
+#include <stdio.h>
+#include_next <conftest.h>
+#ifdef DEFINED_IN_CONFTESTD2
+int foo;
+#else
+#error "include_next doesn't work"
+#endif
+EOF
+ cat <<EOF > conftestd2/conftest.h
+#ifndef DEFINED_IN_CONFTESTD1
+#error "include_next test doesn't work"
+#endif
+#define DEFINED_IN_CONFTESTD2
+EOF
+ gl_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <conftest.h>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_have_include_next=yes
+else $as_nop
+ CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <conftest.h>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_have_include_next=buggy
+else $as_nop
+ gl_cv_have_include_next=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CPPFLAGS="$gl_save_CPPFLAGS"
+ rm -rf conftestd1a conftestd1b conftestd2
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_include_next" >&5
+printf "%s\n" "$gl_cv_have_include_next" >&6; }
+ PRAGMA_SYSTEM_HEADER=
+ if test $gl_cv_have_include_next = yes; then
+ INCLUDE_NEXT=include_next
+ INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
+ if test -n "$GCC"; then
+ PRAGMA_SYSTEM_HEADER='#pragma GCC system_header'
+ fi
+ else
+ if test $gl_cv_have_include_next = buggy; then
+ INCLUDE_NEXT=include
+ INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
+ else
+ INCLUDE_NEXT=include
+ INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include
+ fi
+ fi
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether source code line length is unlimited" >&5
+printf %s "checking whether source code line length is unlimited... " >&6; }
+if test ${gl_cv_source_line_length_unlimited+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef __TANDEM
+choke me
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "choke me" >/dev/null 2>&1
+then :
+ gl_cv_source_line_length_unlimited=no
+else $as_nop
+ gl_cv_source_line_length_unlimited=yes
+fi
+rm -rf conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_source_line_length_unlimited" >&5
+printf "%s\n" "$gl_cv_source_line_length_unlimited" >&6; }
+ if test $gl_cv_source_line_length_unlimited = no; then
+ PRAGMA_COLUMNS="#pragma COLUMNS 10000"
+ else
+ PRAGMA_COLUMNS=
+ fi
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for complete errno.h" >&5
+printf %s "checking for complete errno.h... " >&6; }
+if test ${gl_cv_header_errno_h_complete+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <errno.h>
+#if !defined ETXTBSY
+booboo
+#endif
+#if !defined ENOMSG
+booboo
+#endif
+#if !defined EIDRM
+booboo
+#endif
+#if !defined ENOLINK
+booboo
+#endif
+#if !defined EPROTO
+booboo
+#endif
+#if !defined EMULTIHOP
+booboo
+#endif
+#if !defined EBADMSG
+booboo
+#endif
+#if !defined EOVERFLOW
+booboo
+#endif
+#if !defined ENOTSUP
+booboo
+#endif
+#if !defined ENETRESET
+booboo
+#endif
+#if !defined ECONNABORTED
+booboo
+#endif
+#if !defined ESTALE
+booboo
+#endif
+#if !defined EDQUOT
+booboo
+#endif
+#if !defined ECANCELED
+booboo
+#endif
+#if !defined EOWNERDEAD
+booboo
+#endif
+#if !defined ENOTRECOVERABLE
+booboo
+#endif
+#if !defined EILSEQ
+booboo
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "booboo" >/dev/null 2>&1
+then :
+ gl_cv_header_errno_h_complete=no
+else $as_nop
+ gl_cv_header_errno_h_complete=yes
+fi
+rm -rf conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_complete" >&5
+printf "%s\n" "$gl_cv_header_errno_h_complete" >&6; }
+ if test $gl_cv_header_errno_h_complete = yes; then
+ GL_GENERATE_ERRNO_H=false
+ else
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_errno_h='<'errno.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <errno.h>" >&5
+printf %s "checking absolute name of <errno.h>... " >&6; }
+if test ${gl_cv_next_errno_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <errno.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'errno.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_errno_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_errno_h
+ gl_cv_next_errno_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_errno_h" >&5
+printf "%s\n" "$gl_cv_next_errno_h" >&6; }
+ fi
+ NEXT_ERRNO_H=$gl_cv_next_errno_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'errno.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_errno_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H=$gl_next_as_first_directive
+
+
+
+
+ GL_GENERATE_ERRNO_H=true
+ fi
+
+ if $GL_GENERATE_ERRNO_H; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for EMULTIHOP value" >&5
+printf %s "checking for EMULTIHOP value... " >&6; }
+if test ${gl_cv_header_errno_h_EMULTIHOP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <errno.h>
+#ifdef EMULTIHOP
+yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1
+then :
+ gl_cv_header_errno_h_EMULTIHOP=yes
+else $as_nop
+ gl_cv_header_errno_h_EMULTIHOP=no
+fi
+rm -rf conftest*
+
+ if test $gl_cv_header_errno_h_EMULTIHOP = no; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+#ifdef EMULTIHOP
+yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1
+then :
+ gl_cv_header_errno_h_EMULTIHOP=hidden
+fi
+rm -rf conftest*
+
+ if test $gl_cv_header_errno_h_EMULTIHOP = hidden; then
+ if ac_fn_c_compute_int "$LINENO" "EMULTIHOP" "gl_cv_header_errno_h_EMULTIHOP" "
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+/* The following two lines are a workaround against an autoconf-2.52 bug. */
+#include <stdio.h>
+#include <stdlib.h>
+"
+then :
+
+fi
+
+ fi
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EMULTIHOP" >&5
+printf "%s\n" "$gl_cv_header_errno_h_EMULTIHOP" >&6; }
+ case $gl_cv_header_errno_h_EMULTIHOP in
+ yes | no)
+ EMULTIHOP_HIDDEN=0; EMULTIHOP_VALUE=
+ ;;
+ *)
+ EMULTIHOP_HIDDEN=1; EMULTIHOP_VALUE="$gl_cv_header_errno_h_EMULTIHOP"
+ ;;
+ esac
+
+
+ fi
+
+
+ if $GL_GENERATE_ERRNO_H; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ENOLINK value" >&5
+printf %s "checking for ENOLINK value... " >&6; }
+if test ${gl_cv_header_errno_h_ENOLINK+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <errno.h>
+#ifdef ENOLINK
+yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1
+then :
+ gl_cv_header_errno_h_ENOLINK=yes
+else $as_nop
+ gl_cv_header_errno_h_ENOLINK=no
+fi
+rm -rf conftest*
+
+ if test $gl_cv_header_errno_h_ENOLINK = no; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+#ifdef ENOLINK
+yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1
+then :
+ gl_cv_header_errno_h_ENOLINK=hidden
+fi
+rm -rf conftest*
+
+ if test $gl_cv_header_errno_h_ENOLINK = hidden; then
+ if ac_fn_c_compute_int "$LINENO" "ENOLINK" "gl_cv_header_errno_h_ENOLINK" "
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+/* The following two lines are a workaround against an autoconf-2.52 bug. */
+#include <stdio.h>
+#include <stdlib.h>
+"
+then :
+
+fi
+
+ fi
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_ENOLINK" >&5
+printf "%s\n" "$gl_cv_header_errno_h_ENOLINK" >&6; }
+ case $gl_cv_header_errno_h_ENOLINK in
+ yes | no)
+ ENOLINK_HIDDEN=0; ENOLINK_VALUE=
+ ;;
+ *)
+ ENOLINK_HIDDEN=1; ENOLINK_VALUE="$gl_cv_header_errno_h_ENOLINK"
+ ;;
+ esac
+
+
+ fi
+
+
+ if $GL_GENERATE_ERRNO_H; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for EOVERFLOW value" >&5
+printf %s "checking for EOVERFLOW value... " >&6; }
+if test ${gl_cv_header_errno_h_EOVERFLOW+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <errno.h>
+#ifdef EOVERFLOW
+yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1
+then :
+ gl_cv_header_errno_h_EOVERFLOW=yes
+else $as_nop
+ gl_cv_header_errno_h_EOVERFLOW=no
+fi
+rm -rf conftest*
+
+ if test $gl_cv_header_errno_h_EOVERFLOW = no; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+#ifdef EOVERFLOW
+yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1
+then :
+ gl_cv_header_errno_h_EOVERFLOW=hidden
+fi
+rm -rf conftest*
+
+ if test $gl_cv_header_errno_h_EOVERFLOW = hidden; then
+ if ac_fn_c_compute_int "$LINENO" "EOVERFLOW" "gl_cv_header_errno_h_EOVERFLOW" "
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+/* The following two lines are a workaround against an autoconf-2.52 bug. */
+#include <stdio.h>
+#include <stdlib.h>
+"
+then :
+
+fi
+
+ fi
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EOVERFLOW" >&5
+printf "%s\n" "$gl_cv_header_errno_h_EOVERFLOW" >&6; }
+ case $gl_cv_header_errno_h_EOVERFLOW in
+ yes | no)
+ EOVERFLOW_HIDDEN=0; EOVERFLOW_VALUE=
+ ;;
+ *)
+ EOVERFLOW_HIDDEN=1; EOVERFLOW_VALUE="$gl_cv_header_errno_h_EOVERFLOW"
+ ;;
+ esac
+
+
+ fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ctype.h defines __header_inline" >&5
+printf %s "checking whether ctype.h defines __header_inline... " >&6; }
+if test ${gl_cv_have___header_inline+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+ #ifndef __header_inline
+ #error "<ctype.h> does not define __header_inline"
+ #endif
+
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+ gl_cv_have___header_inline=yes
+else $as_nop
+ gl_cv_have___header_inline=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have___header_inline" >&5
+printf "%s\n" "$gl_cv_have___header_inline" >&6; }
+ if test "$gl_cv_have___header_inline" = yes; then
+
+printf "%s\n" "#define HAVE___HEADER_INLINE 1" >>confdefs.h
+
+ fi
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdint.h" >&5
+printf %s "checking for stdint.h... " >&6; }
+if test ${gl_cv_header_stdint_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <stdint.h>
+int
+main (void)
+{
+uintmax_t i = (uintmax_t) -1; return !i;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_stdint_h=yes
+else $as_nop
+ gl_cv_header_stdint_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_h" >&5
+printf "%s\n" "$gl_cv_header_stdint_h" >&6; }
+ if test $gl_cv_header_stdint_h = yes; then
+
+printf "%s\n" "#define HAVE_STDINT_H_WITH_UINTMAX 1" >>confdefs.h
+
+ fi
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inttypes.h" >&5
+printf %s "checking for inttypes.h... " >&6; }
+if test ${gl_cv_header_inttypes_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <inttypes.h>
+
+int
+main (void)
+{
+uintmax_t i = (uintmax_t) -1; return !i;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_inttypes_h=yes
+else $as_nop
+ gl_cv_header_inttypes_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_inttypes_h" >&5
+printf "%s\n" "$gl_cv_header_inttypes_h" >&6; }
+ if test $gl_cv_header_inttypes_h = yes; then
+
+printf "%s\n" "#define HAVE_INTTYPES_H_WITH_UINTMAX 1" >>confdefs.h
+
+ fi
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports size specifiers as in C99" >&5
+printf %s "checking whether printf supports size specifiers as in C99... " >&6; }
+if test ${gl_cv_func_printf_sizes_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on FreeBSD >= 5.
+ freebsd[1-4].*) gl_cv_func_printf_sizes_c99="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ midnightbsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on Mac OS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_printf_sizes_c99="guessing no";;
+ darwin*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on OpenBSD >= 3.9.
+ openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
+ gl_cv_func_printf_sizes_c99="guessing no";;
+ openbsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on Solaris >= 2.10.
+ solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ solaris*) gl_cv_func_printf_sizes_c99="guessing no";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_printf_sizes_c99="guessing no";;
+ netbsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on MSVC, no on mingw.
+ mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef _MSC_VER
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Known" >/dev/null 2>&1
+then :
+ gl_cv_func_printf_sizes_c99="guessing yes"
+else $as_nop
+ gl_cv_func_printf_sizes_c99="guessing no"
+fi
+rm -rf conftest*
+
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_printf_sizes_c99="$gl_cross_guess_normal";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+# include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+# include <inttypes.h>
+#endif
+static char buf[100];
+int main ()
+{
+ int result = 0;
+#if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX
+ buf[0] = '\0';
+ if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0
+ || strcmp (buf, "12345671 33") != 0)
+ result |= 1;
+#else
+ result |= 1;
+#endif
+ buf[0] = '\0';
+ if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0
+ || strcmp (buf, "12345672 33") != 0)
+ result |= 2;
+ buf[0] = '\0';
+ if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0
+ || strcmp (buf, "12345673 33") != 0)
+ result |= 4;
+ buf[0] = '\0';
+ if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0
+ || strcmp (buf, "1.5 33") != 0)
+ result |= 8;
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_printf_sizes_c99=yes
+else $as_nop
+ gl_cv_func_printf_sizes_c99=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_sizes_c99" >&5
+printf "%s\n" "$gl_cv_func_printf_sizes_c99" >&6; }
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports 'long double' arguments" >&5
+printf %s "checking whether printf supports 'long double' arguments... " >&6; }
+if test ${gl_cv_func_printf_long_double+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess no on BeOS.
+ beos*) gl_cv_func_printf_long_double="guessing no";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_printf_long_double="guessing yes";;
+ # Guess yes on MSVC, no on mingw.
+ mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef _MSC_VER
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Known" >/dev/null 2>&1
+then :
+ gl_cv_func_printf_long_double="guessing yes"
+else $as_nop
+ gl_cv_func_printf_long_double="guessing no"
+fi
+rm -rf conftest*
+
+ ;;
+ *) gl_cv_func_printf_long_double="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <string.h>
+static char buf[10000];
+int main ()
+{
+ int result = 0;
+ buf[0] = '\0';
+ if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0
+ || strcmp (buf, "1.750000 33") != 0)
+ result |= 1;
+ buf[0] = '\0';
+ if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0
+ || strcmp (buf, "1.750000e+00 33") != 0)
+ result |= 2;
+ buf[0] = '\0';
+ if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0
+ || strcmp (buf, "1.75 33") != 0)
+ result |= 4;
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_printf_long_double=yes
+else $as_nop
+ gl_cv_func_printf_long_double=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_long_double" >&5
+printf "%s\n" "$gl_cv_func_printf_long_double" >&6; }
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports infinite 'double' arguments" >&5
+printf %s "checking whether printf supports infinite 'double' arguments... " >&6; }
+if test ${gl_cv_func_printf_infinite+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on FreeBSD >= 6.
+ freebsd[1-5].*) gl_cv_func_printf_infinite="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_printf_infinite="guessing yes";;
+ midnightbsd*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on Mac OS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_printf_infinite="guessing no";;
+ darwin*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on HP-UX >= 11.
+ hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite="guessing no";;
+ hpux*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_printf_infinite="guessing no";;
+ netbsd*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on OpenBSD >= 6.0.
+ openbsd[1-5].*) gl_cv_func_printf_infinite="guessing no";;
+ openbsd*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_infinite="guessing no";;
+ # Guess yes on MSVC, no on mingw.
+ mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef _MSC_VER
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Known" >/dev/null 2>&1
+then :
+ gl_cv_func_printf_infinite="guessing yes"
+else $as_nop
+ gl_cv_func_printf_infinite="guessing no"
+fi
+rm -rf conftest*
+
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_printf_infinite="$gl_cross_guess_normal";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <string.h>
+static int
+strisnan (const char *string, size_t start_index, size_t end_index)
+{
+ if (start_index < end_index)
+ {
+ if (string[start_index] == '-')
+ start_index++;
+ if (start_index + 3 <= end_index
+ && memcmp (string + start_index, "nan", 3) == 0)
+ {
+ start_index += 3;
+ if (start_index == end_index
+ || (string[start_index] == '(' && string[end_index - 1] == ')'))
+ return 1;
+ }
+ }
+ return 0;
+}
+static int
+have_minus_zero ()
+{
+ static double plus_zero = 0.0;
+ double minus_zero = - plus_zero;
+ return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
+}
+static char buf[10000];
+static double zero = 0.0;
+int main ()
+{
+ int result = 0;
+ if (sprintf (buf, "%f", 1.0 / zero) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%f", -1.0 / zero) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%f", zero / zero) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 2;
+ if (sprintf (buf, "%e", 1.0 / zero) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ result |= 4;
+ if (sprintf (buf, "%e", -1.0 / zero) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ result |= 4;
+ if (sprintf (buf, "%e", zero / zero) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 8;
+ if (sprintf (buf, "%g", 1.0 / zero) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ result |= 16;
+ if (sprintf (buf, "%g", -1.0 / zero) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ result |= 16;
+ if (sprintf (buf, "%g", zero / zero) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 32;
+ /* This test fails on HP-UX 10.20. */
+ if (have_minus_zero ())
+ if (sprintf (buf, "%g", - zero) < 0
+ || strcmp (buf, "-0") != 0)
+ result |= 64;
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_printf_infinite=yes
+else $as_nop
+ gl_cv_func_printf_infinite=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_infinite" >&5
+printf "%s\n" "$gl_cv_func_printf_infinite" >&6; }
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
+printf %s "checking whether byte ordering is bigendian... " >&6; }
+if test ${ac_cv_c_bigendian+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_c_bigendian=unknown
+ # See if we're dealing with a universal compiler.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __APPLE_CC__
+ not a universal capable compiler
+ #endif
+ typedef int dummy;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+ # Check for potential -arch flags. It is not universal unless
+ # there are at least two -arch flags with different values.
+ ac_arch=
+ ac_prev=
+ for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
+ if test -n "$ac_prev"; then
+ case $ac_word in
+ i?86 | x86_64 | ppc | ppc64)
+ if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
+ ac_arch=$ac_word
+ else
+ ac_cv_c_bigendian=universal
+ break
+ fi
+ ;;
+ esac
+ ac_prev=
+ elif test "x$ac_word" = "x-arch"; then
+ ac_prev=arch
+ fi
+ done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ if test $ac_cv_c_bigendian = unknown; then
+ # See if sys/param.h defines the BYTE_ORDER macro.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/param.h>
+
+int
+main (void)
+{
+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+ && LITTLE_ENDIAN)
+ bogus endian macros
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ # It does; now see whether it defined to BIG_ENDIAN or not.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/param.h>
+
+int
+main (void)
+{
+#if BYTE_ORDER != BIG_ENDIAN
+ not big endian
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_bigendian=yes
+else $as_nop
+ ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ fi
+ if test $ac_cv_c_bigendian = unknown; then
+ # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+
+int
+main (void)
+{
+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+ bogus endian macros
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ # It does; now see whether it defined to _BIG_ENDIAN or not.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+
+int
+main (void)
+{
+#ifndef _BIG_ENDIAN
+ not big endian
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_bigendian=yes
+else $as_nop
+ ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ fi
+ if test $ac_cv_c_bigendian = unknown; then
+ # Compile a test program.
+ if test "$cross_compiling" = yes
+then :
+ # Try to guess by grepping values from an object file.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+unsigned short int ascii_mm[] =
+ { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+ unsigned short int ascii_ii[] =
+ { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+ int use_ascii (int i) {
+ return ascii_mm[i] + ascii_ii[i];
+ }
+ unsigned short int ebcdic_ii[] =
+ { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+ unsigned short int ebcdic_mm[] =
+ { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+ int use_ebcdic (int i) {
+ return ebcdic_mm[i] + ebcdic_ii[i];
+ }
+ extern int foo;
+
+int
+main (void)
+{
+return use_ascii (foo) == use_ebcdic (foo);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+ ac_cv_c_bigendian=yes
+ fi
+ if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+ if test "$ac_cv_c_bigendian" = unknown; then
+ ac_cv_c_bigendian=no
+ else
+ # finding both strings is unlikely to happen, but who knows?
+ ac_cv_c_bigendian=unknown
+ fi
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main (void)
+{
+
+ /* Are we little or big endian? From Harbison&Steele. */
+ union
+ {
+ long int l;
+ char c[sizeof (long int)];
+ } u;
+ u.l = 1;
+ return u.c[sizeof (long int) - 1] == 1;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ ac_cv_c_bigendian=no
+else $as_nop
+ ac_cv_c_bigendian=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
+printf "%s\n" "$ac_cv_c_bigendian" >&6; }
+ case $ac_cv_c_bigendian in #(
+ yes)
+ printf "%s\n" "#define WORDS_BIGENDIAN 1" >>confdefs.h
+;; #(
+ no)
+ ;; #(
+ universal)
+
+printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+
+ ;; #(
+ *)
+ as_fn_error $? "unknown endianness
+ presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
+ esac
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether long double and double are the same" >&5
+printf %s "checking whether long double and double are the same... " >&6; }
+if test ${gl_cv_long_double_equals_double+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <float.h>
+int
+main (void)
+{
+typedef int check[sizeof (long double) == sizeof (double)
+ && LDBL_MANT_DIG == DBL_MANT_DIG
+ && LDBL_MAX_EXP == DBL_MAX_EXP
+ && LDBL_MIN_EXP == DBL_MIN_EXP
+ ? 1 : -1];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_long_double_equals_double=yes
+else $as_nop
+ gl_cv_long_double_equals_double=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_long_double_equals_double" >&5
+printf "%s\n" "$gl_cv_long_double_equals_double" >&6; }
+ if test $gl_cv_long_double_equals_double = yes; then
+
+printf "%s\n" "#define HAVE_SAME_LONG_DOUBLE_AS_DOUBLE 1" >>confdefs.h
+
+ HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=1
+ else
+ HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=0
+ fi
+
+
+
+
+
+
+
+ if test -n "$gl_printf_safe"; then
+
+printf "%s\n" "#define CHECK_PRINTF_SAFE 1" >>confdefs.h
+
+ fi
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports infinite 'long double' arguments" >&5
+printf %s "checking whether printf supports infinite 'long double' arguments... " >&6; }
+if test ${gl_cv_func_printf_infinite_long_double+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ case "$host_cpu" in
+ # Guess no on ia64, x86_64, i386.
+ ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";;
+ *)
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ # Guess yes on FreeBSD >= 6.
+ freebsd[1-5].*) gl_cv_func_printf_infinite_long_double="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ midnightbsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ # Guess yes on HP-UX >= 11.
+ hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";;
+ hpux*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ # Guess yes on OpenBSD >= 6.0.
+ openbsd[1-5].*) gl_cv_func_printf_infinite_long_double="guessing no";;
+ openbsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_infinite_long_double="guessing no";;
+ # Guess yes on MSVC, no on mingw.
+ mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef _MSC_VER
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Known" >/dev/null 2>&1
+then :
+ gl_cv_func_printf_infinite_long_double="guessing yes"
+else $as_nop
+ gl_cv_func_printf_infinite_long_double="guessing no"
+fi
+rm -rf conftest*
+
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_printf_infinite_long_double="$gl_cross_guess_normal";;
+ esac
+ ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#include <stdlib.h>
+#if defined __MACH__ && defined __APPLE__
+/* Avoid a crash on Mac OS X. */
+#include <mach/mach.h>
+#include <mach/mach_error.h>
+#include <mach/thread_status.h>
+#include <mach/exception.h>
+#include <mach/task.h>
+#include <pthread.h>
+/* The exception port on which our thread listens. */
+static mach_port_t our_exception_port;
+/* The main function of the thread listening for exceptions of type
+ EXC_BAD_ACCESS. */
+static void *
+mach_exception_thread (void *arg)
+{
+ /* Buffer for a message to be received. */
+ struct {
+ mach_msg_header_t head;
+ mach_msg_body_t msgh_body;
+ char data[1024];
+ } msg;
+ mach_msg_return_t retval;
+ /* Wait for a message on the exception port. */
+ retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg),
+ our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
+ if (retval != MACH_MSG_SUCCESS)
+ abort ();
+ exit (1);
+}
+static void
+nocrash_init (void)
+{
+ mach_port_t self = mach_task_self ();
+ /* Allocate a port on which the thread shall listen for exceptions. */
+ if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port)
+ == KERN_SUCCESS) {
+ /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */
+ if (mach_port_insert_right (self, our_exception_port, our_exception_port,
+ MACH_MSG_TYPE_MAKE_SEND)
+ == KERN_SUCCESS) {
+ /* The exceptions we want to catch. Only EXC_BAD_ACCESS is interesting
+ for us. */
+ exception_mask_t mask = EXC_MASK_BAD_ACCESS;
+ /* Create the thread listening on the exception port. */
+ pthread_attr_t attr;
+ pthread_t thread;
+ if (pthread_attr_init (&attr) == 0
+ && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0
+ && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) {
+ pthread_attr_destroy (&attr);
+ /* Replace the exception port info for these exceptions with our own.
+ Note that we replace the exception port for the entire task, not only
+ for a particular thread. This has the effect that when our exception
+ port gets the message, the thread specific exception port has already
+ been asked, and we don't need to bother about it.
+ See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html. */
+ task_set_exception_ports (self, mask, our_exception_port,
+ EXCEPTION_DEFAULT, MACHINE_THREAD_STATE);
+ }
+ }
+ }
+}
+#elif defined _WIN32 && ! defined __CYGWIN__
+/* Avoid a crash on native Windows. */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <winerror.h>
+static LONG WINAPI
+exception_filter (EXCEPTION_POINTERS *ExceptionInfo)
+{
+ switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
+ {
+ case EXCEPTION_ACCESS_VIOLATION:
+ case EXCEPTION_IN_PAGE_ERROR:
+ case EXCEPTION_STACK_OVERFLOW:
+ case EXCEPTION_GUARD_PAGE:
+ case EXCEPTION_PRIV_INSTRUCTION:
+ case EXCEPTION_ILLEGAL_INSTRUCTION:
+ case EXCEPTION_DATATYPE_MISALIGNMENT:
+ case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
+ case EXCEPTION_NONCONTINUABLE_EXCEPTION:
+ exit (1);
+ }
+ return EXCEPTION_CONTINUE_SEARCH;
+}
+static void
+nocrash_init (void)
+{
+ SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter);
+}
+#else
+/* Avoid a crash on POSIX systems. */
+#include <signal.h>
+#include <unistd.h>
+/* A POSIX signal handler. */
+static void
+exception_handler (int sig)
+{
+ _exit (1);
+}
+static void
+nocrash_init (void)
+{
+#ifdef SIGSEGV
+ signal (SIGSEGV, exception_handler);
+#endif
+#ifdef SIGBUS
+ signal (SIGBUS, exception_handler);
+#endif
+}
+#endif
+
+#include <float.h>
+#include <stdio.h>
+#include <string.h>
+static int
+strisnan (const char *string, size_t start_index, size_t end_index)
+{
+ if (start_index < end_index)
+ {
+ if (string[start_index] == '-')
+ start_index++;
+ if (start_index + 3 <= end_index
+ && memcmp (string + start_index, "nan", 3) == 0)
+ {
+ start_index += 3;
+ if (start_index == end_index
+ || (string[start_index] == '(' && string[end_index - 1] == ')'))
+ return 1;
+ }
+ }
+ return 0;
+}
+static char buf[10000];
+static long double zeroL = 0.0L;
+int main ()
+{
+ int result = 0;
+ nocrash_init();
+ if (sprintf (buf, "%Lf", 1.0L / zeroL) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%Lf", -1.0L / zeroL) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%Lf", zeroL / zeroL) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 1;
+ if (sprintf (buf, "%Le", 1.0L / zeroL) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%Le", -1.0L / zeroL) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%Le", zeroL / zeroL) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 1;
+ if (sprintf (buf, "%Lg", 1.0L / zeroL) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%Lg", -1.0L / zeroL) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%Lg", zeroL / zeroL) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 1;
+#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+/* Representation of an 80-bit 'long double' as an initializer for a sequence
+ of 'unsigned int' words. */
+# ifdef WORDS_BIGENDIAN
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+ ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \
+ (unsigned int) (mantlo) << 16 \
+ }
+# else
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { mantlo, manthi, exponent }
+# endif
+ { /* Quiet NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 2;
+ if (sprintf (buf, "%Le", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 2;
+ if (sprintf (buf, "%Lg", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 2;
+ }
+ {
+ /* Signalling NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 2;
+ if (sprintf (buf, "%Le", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 2;
+ if (sprintf (buf, "%Lg", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 2;
+ }
+ { /* Pseudo-NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) <= 0)
+ result |= 4;
+ if (sprintf (buf, "%Le", x.value) <= 0)
+ result |= 4;
+ if (sprintf (buf, "%Lg", x.value) <= 0)
+ result |= 4;
+ }
+ { /* Pseudo-Infinity. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) <= 0)
+ result |= 8;
+ if (sprintf (buf, "%Le", x.value) <= 0)
+ result |= 8;
+ if (sprintf (buf, "%Lg", x.value) <= 0)
+ result |= 8;
+ }
+ { /* Pseudo-Zero. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) <= 0)
+ result |= 16;
+ if (sprintf (buf, "%Le", x.value) <= 0)
+ result |= 16;
+ if (sprintf (buf, "%Lg", x.value) <= 0)
+ result |= 16;
+ }
+ { /* Unnormalized number. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) <= 0)
+ result |= 32;
+ if (sprintf (buf, "%Le", x.value) <= 0)
+ result |= 32;
+ if (sprintf (buf, "%Lg", x.value) <= 0)
+ result |= 32;
+ }
+ { /* Pseudo-Denormal. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) <= 0)
+ result |= 64;
+ if (sprintf (buf, "%Le", x.value) <= 0)
+ result |= 64;
+ if (sprintf (buf, "%Lg", x.value) <= 0)
+ result |= 64;
+ }
+#endif
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_printf_infinite_long_double=yes
+else $as_nop
+ gl_cv_func_printf_infinite_long_double=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_infinite_long_double" >&5
+printf "%s\n" "$gl_cv_func_printf_infinite_long_double" >&6; }
+ ;;
+ *)
+ gl_cv_func_printf_infinite_long_double="irrelevant"
+ ;;
+ esac
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'a' and 'A' directives" >&5
+printf %s "checking whether printf supports the 'a' and 'A' directives... " >&6; }
+if test ${gl_cv_func_printf_directive_a+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ # Guess yes on glibc >= 2.5 systems.
+ *-gnu* | gnu*)
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <features.h>
+ #ifdef __GNU_LIBRARY__
+ #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)) && !defined __UCLIBC__
+ BZ2908
+ #endif
+ #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "BZ2908" >/dev/null 2>&1
+then :
+ gl_cv_func_printf_directive_a="guessing yes"
+else $as_nop
+ gl_cv_func_printf_directive_a="guessing no"
+fi
+rm -rf conftest*
+
+ ;;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_printf_directive_a="guessing yes";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_directive_a="guessing no";;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_printf_directive_a="guessing no";;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_printf_directive_a="$gl_cross_guess_normal";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+static double zero = 0.0;
+int main ()
+{
+ int result = 0;
+ if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0
+ || (strcmp (buf, "0x1.922p+1 33") != 0
+ && strcmp (buf, "0x3.244p+0 33") != 0
+ && strcmp (buf, "0x6.488p-1 33") != 0
+ && strcmp (buf, "0xc.91p-2 33") != 0))
+ result |= 1;
+ if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0
+ || (strcmp (buf, "-0X1.922P+1 33") != 0
+ && strcmp (buf, "-0X3.244P+0 33") != 0
+ && strcmp (buf, "-0X6.488P-1 33") != 0
+ && strcmp (buf, "-0XC.91P-2 33") != 0))
+ result |= 2;
+ /* This catches a FreeBSD 13.0 bug: it doesn't round. */
+ if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0
+ || (strcmp (buf, "0x1.83p+0 33") != 0
+ && strcmp (buf, "0x3.05p-1 33") != 0
+ && strcmp (buf, "0x6.0ap-2 33") != 0
+ && strcmp (buf, "0xc.14p-3 33") != 0))
+ result |= 4;
+ /* This catches a Mac OS X 10.12.4 (Darwin 16.5) bug: it doesn't round. */
+ if (sprintf (buf, "%.0a %d", 1.51, 33, 44, 55) < 0
+ || (strcmp (buf, "0x2p+0 33") != 0
+ && strcmp (buf, "0x3p-1 33") != 0
+ && strcmp (buf, "0x6p-2 33") != 0
+ && strcmp (buf, "0xcp-3 33") != 0))
+ result |= 4;
+ /* This catches a FreeBSD 6.1 bug. See
+ <https://lists.gnu.org/r/bug-gnulib/2007-04/msg00107.html> */
+ if (sprintf (buf, "%010a %d", 1.0 / zero, 33, 44, 55) < 0
+ || buf[0] == '0')
+ result |= 8;
+ /* This catches a Mac OS X 10.3.9 (Darwin 7.9) bug. */
+ if (sprintf (buf, "%.1a", 1.999) < 0
+ || (strcmp (buf, "0x1.0p+1") != 0
+ && strcmp (buf, "0x2.0p+0") != 0
+ && strcmp (buf, "0x4.0p-1") != 0
+ && strcmp (buf, "0x8.0p-2") != 0))
+ result |= 16;
+ /* This catches the same Mac OS X 10.3.9 (Darwin 7.9) bug and also a
+ glibc 2.4 bug <https://sourceware.org/bugzilla/show_bug.cgi?id=2908>. */
+ if (sprintf (buf, "%.1La", 1.999L) < 0
+ || (strcmp (buf, "0x1.0p+1") != 0
+ && strcmp (buf, "0x2.0p+0") != 0
+ && strcmp (buf, "0x4.0p-1") != 0
+ && strcmp (buf, "0x8.0p-2") != 0))
+ result |= 32;
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_printf_directive_a=yes
+else $as_nop
+ gl_cv_func_printf_directive_a=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_a" >&5
+printf "%s\n" "$gl_cv_func_printf_directive_a" >&6; }
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'F' directive" >&5
+printf %s "checking whether printf supports the 'F' directive... " >&6; }
+if test ${gl_cv_func_printf_directive_f+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_printf_directive_f="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_printf_directive_f="guessing yes";;
+ # Guess yes on FreeBSD >= 6.
+ freebsd[1-5].*) gl_cv_func_printf_directive_f="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";;
+ midnightbsd*) gl_cv_func_printf_directive_f="guessing yes";;
+ # Guess yes on Mac OS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_printf_directive_f="guessing no";;
+ darwin*) gl_cv_func_printf_directive_f="guessing yes";;
+ # Guess yes on OpenBSD >= 6.0.
+ openbsd[1-5].*) gl_cv_func_printf_directive_f="guessing no";;
+ openbsd*) gl_cv_func_printf_directive_f="guessing yes";;
+ # Guess yes on Solaris >= 2.10.
+ solaris2.[1-9][0-9]*) gl_cv_func_printf_directive_f="guessing yes";;
+ solaris*) gl_cv_func_printf_directive_f="guessing no";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_directive_f="guessing no";;
+ # Guess yes on MSVC, no on mingw.
+ mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef _MSC_VER
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Known" >/dev/null 2>&1
+then :
+ gl_cv_func_printf_directive_f="guessing yes"
+else $as_nop
+ gl_cv_func_printf_directive_f="guessing no"
+fi
+rm -rf conftest*
+
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_printf_directive_f="$gl_cross_guess_normal";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+static double zero = 0.0;
+int main ()
+{
+ int result = 0;
+ if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0
+ || strcmp (buf, "1234567.000000 33") != 0)
+ result |= 1;
+ if (sprintf (buf, "%F", 1.0 / zero) < 0
+ || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0))
+ result |= 2;
+ /* This catches a Cygwin 1.5.x bug. */
+ if (sprintf (buf, "%.F", 1234.0) < 0
+ || strcmp (buf, "1234") != 0)
+ result |= 4;
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_printf_directive_f=yes
+else $as_nop
+ gl_cv_func_printf_directive_f=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_f" >&5
+printf "%s\n" "$gl_cv_func_printf_directive_f" >&6; }
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'n' directive" >&5
+printf %s "checking whether printf supports the 'n' directive... " >&6; }
+if test ${gl_cv_func_printf_directive_n+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess no on glibc when _FORTIFY_SOURCE >= 2.
+ *-gnu* | gnu*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if _FORTIFY_SOURCE >= 2
+ error fail
+ #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_func_printf_directive_n="guessing yes"
+else $as_nop
+ gl_cv_func_printf_directive_n="guessing no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ;;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_directive_n="guessing no";;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_printf_directive_n="guessing no";;
+ *) gl_cv_func_printf_directive_n="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef _MSC_VER
+#include <inttypes.h>
+/* See page about "Parameter Validation" on msdn.microsoft.com.
+ <https://docs.microsoft.com/en-us/cpp/c-runtime-library/parameter-validation>
+ <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/set-invalid-parameter-handler-set-thread-local-invalid-parameter-handler> */
+static void cdecl
+invalid_parameter_handler (const wchar_t *expression,
+ const wchar_t *function,
+ const wchar_t *file, unsigned int line,
+ uintptr_t dummy)
+{
+ exit (1);
+}
+#endif
+static char fmtstring[10];
+static char buf[100];
+int main ()
+{
+ int count = -1;
+#ifdef _MSC_VER
+ _set_invalid_parameter_handler (invalid_parameter_handler);
+#endif
+ /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2)
+ support %n in format strings in read-only memory but not in writable
+ memory. */
+ strcpy (fmtstring, "%d %n");
+ if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0
+ || strcmp (buf, "123 ") != 0
+ || count != 4)
+ return 1;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_printf_directive_n=yes
+else $as_nop
+ gl_cv_func_printf_directive_n=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_n" >&5
+printf "%s\n" "$gl_cv_func_printf_directive_n" >&6; }
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'ls' directive" >&5
+printf %s "checking whether printf supports the 'ls' directive... " >&6; }
+if test ${gl_cv_func_printf_directive_ls+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ # Guess yes on OpenBSD >= 6.0.
+ openbsd[1-5].*) gl_cv_func_printf_directive_ls="guessing no";;
+ openbsd*) gl_cv_func_printf_directive_ls="guessing yes";;
+ irix*) gl_cv_func_printf_directive_ls="guessing no";;
+ solaris*) gl_cv_func_printf_directive_ls="guessing no";;
+ cygwin*) gl_cv_func_printf_directive_ls="guessing no";;
+ beos* | haiku*) gl_cv_func_printf_directive_ls="guessing no";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_directive_ls="guessing no";;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_printf_directive_ls="guessing yes";;
+ *) gl_cv_func_printf_directive_ls="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <wchar.h>
+#include <string.h>
+int main ()
+{
+ int result = 0;
+ char buf[100];
+ /* Test whether %ls works at all.
+ This test fails on OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku, but not on
+ Cygwin 1.5. */
+ {
+ static const wchar_t wstring[] = { 'a', 'b', 'c', 0 };
+ buf[0] = '\0';
+ if (sprintf (buf, "%ls", wstring) < 0
+ || strcmp (buf, "abc") != 0)
+ result |= 1;
+ }
+ /* This test fails on IRIX 6.5, Solaris 2.6, Cygwin 1.5, Haiku (with an
+ assertion failure inside libc), but not on OpenBSD 4.0. */
+ {
+ static const wchar_t wstring[] = { 'a', 0 };
+ buf[0] = '\0';
+ if (sprintf (buf, "%ls", wstring) < 0
+ || strcmp (buf, "a") != 0)
+ result |= 2;
+ }
+ /* Test whether precisions in %ls are supported as specified in ISO C 99
+ section 7.19.6.1:
+ "If a precision is specified, no more than that many bytes are written
+ (including shift sequences, if any), and the array shall contain a
+ null wide character if, to equal the multibyte character sequence
+ length given by the precision, the function would need to access a
+ wide character one past the end of the array."
+ This test fails on Solaris 10. */
+ {
+ static const wchar_t wstring[] = { 'a', 'b', (wchar_t) 0xfdfdfdfd, 0 };
+ buf[0] = '\0';
+ if (sprintf (buf, "%.2ls", wstring) < 0
+ || strcmp (buf, "ab") != 0)
+ result |= 8;
+ }
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_printf_directive_ls=yes
+else $as_nop
+ gl_cv_func_printf_directive_ls=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_ls" >&5
+printf "%s\n" "$gl_cv_func_printf_directive_ls" >&6; }
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5
+printf %s "checking whether printf supports POSIX/XSI format strings with positions... " >&6; }
+if test ${gl_cv_func_printf_positions+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
+ gl_cv_func_printf_positions="guessing no";;
+ beos*) gl_cv_func_printf_positions="guessing no";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_printf_positions="guessing yes";;
+ # Guess no on native Windows.
+ mingw* | pw*) gl_cv_func_printf_positions="guessing no";;
+ *) gl_cv_func_printf_positions="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <string.h>
+/* The string "%2$d %1$d", with dollar characters protected from the shell's
+ dollar expansion (possibly an autoconf bug). */
+static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
+static char buf[100];
+int main ()
+{
+ sprintf (buf, format, 33, 55);
+ return (strcmp (buf, "55 33") != 0);
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_printf_positions=yes
+else $as_nop
+ gl_cv_func_printf_positions=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5
+printf "%s\n" "$gl_cv_func_printf_positions" >&6; }
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports the grouping flag" >&5
+printf %s "checking whether printf supports the grouping flag... " >&6; }
+if test ${gl_cv_func_printf_flag_grouping+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ cygwin*) gl_cv_func_printf_flag_grouping="guessing no";;
+ netbsd*) gl_cv_func_printf_flag_grouping="guessing no";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_flag_grouping="guessing no";;
+ # Guess no on native Windows.
+ mingw* | pw*) gl_cv_func_printf_flag_grouping="guessing no";;
+ *) gl_cv_func_printf_flag_grouping="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+int main ()
+{
+ if (sprintf (buf, "%'d %d", 1234567, 99) < 0
+ || buf[strlen (buf) - 1] != '9')
+ return 1;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_printf_flag_grouping=yes
+else $as_nop
+ gl_cv_func_printf_flag_grouping=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_flag_grouping" >&5
+printf "%s\n" "$gl_cv_func_printf_flag_grouping" >&6; }
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports the left-adjust flag correctly" >&5
+printf %s "checking whether printf supports the left-adjust flag correctly... " >&6; }
+if test ${gl_cv_func_printf_flag_leftadjust+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ # Guess yes on HP-UX 11.
+ hpux11*) gl_cv_func_printf_flag_leftadjust="guessing yes";;
+ # Guess no on HP-UX 10 and older.
+ hpux*) gl_cv_func_printf_flag_leftadjust="guessing no";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_printf_flag_leftadjust="guessing yes";;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_printf_flag_leftadjust="guessing yes";;
+ # Guess yes otherwise.
+ *) gl_cv_func_printf_flag_leftadjust="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+int main ()
+{
+ /* Check that a '-' flag is not annihilated by a negative width. */
+ if (sprintf (buf, "a%-*sc", -3, "b") < 0
+ || strcmp (buf, "ab c") != 0)
+ return 1;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_printf_flag_leftadjust=yes
+else $as_nop
+ gl_cv_func_printf_flag_leftadjust=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_flag_leftadjust" >&5
+printf "%s\n" "$gl_cv_func_printf_flag_leftadjust" >&6; }
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports the zero flag correctly" >&5
+printf %s "checking whether printf supports the zero flag correctly... " >&6; }
+if test ${gl_cv_func_printf_flag_zero+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_printf_flag_zero="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_printf_flag_zero="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_printf_flag_zero="guessing yes";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_flag_zero="guessing no";;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_printf_flag_zero="guessing no";;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_printf_flag_zero="$gl_cross_guess_normal";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+static double zero = 0.0;
+int main ()
+{
+ if (sprintf (buf, "%010f", 1.0 / zero, 33, 44, 55) < 0
+ || (strcmp (buf, " inf") != 0
+ && strcmp (buf, " infinity") != 0))
+ return 1;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_printf_flag_zero=yes
+else $as_nop
+ gl_cv_func_printf_flag_zero=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_flag_zero" >&5
+printf "%s\n" "$gl_cv_func_printf_flag_zero" >&6; }
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports large precisions" >&5
+printf %s "checking whether printf supports large precisions... " >&6; }
+if test ${gl_cv_func_printf_precision+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ # Guess no only on Solaris, native Windows, and BeOS systems.
+ solaris*) gl_cv_func_printf_precision="guessing no" ;;
+ mingw* | pw*) gl_cv_func_printf_precision="guessing no" ;;
+ beos*) gl_cv_func_printf_precision="guessing no" ;;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_printf_precision="guessing yes" ;;
+ *) gl_cv_func_printf_precision="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <string.h>
+static char buf[5000];
+int main ()
+{
+ int result = 0;
+#ifdef __BEOS__
+ /* On BeOS, this would crash and show a dialog box. Avoid the crash. */
+ return 1;
+#endif
+ if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3)
+ result |= 1;
+ if (sprintf (buf, "%.4000f %d", 1.0, 33, 44) < 4000 + 5)
+ result |= 2;
+ if (sprintf (buf, "%.511f %d", 1.0, 33, 44) < 511 + 5
+ || buf[0] != '1')
+ result |= 4;
+ if (sprintf (buf, "%.999f %d", 1.0, 33, 44) < 999 + 5
+ || buf[0] != '1')
+ result |= 4;
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_printf_precision=yes
+else $as_nop
+ gl_cv_func_printf_precision=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_precision" >&5
+printf "%s\n" "$gl_cv_func_printf_precision" >&6; }
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler produces multi-arch binaries" >&5
+printf %s "checking whether the compiler produces multi-arch binaries... " >&6; }
+if test ${gl_cv_c_multiarch+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_cv_c_multiarch=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __APPLE_CC__
+ not a universal capable compiler
+ #endif
+ typedef int dummy;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+ arch=
+ prev=
+ for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do
+ if test -n "$prev"; then
+ case $word in
+ i?86 | x86_64 | ppc | ppc64 | arm | arm64)
+ if test -z "$arch" || test "$arch" = "$word"; then
+ arch="$word"
+ else
+ gl_cv_c_multiarch=yes
+ fi
+ ;;
+ esac
+ prev=
+ else
+ if test "x$word" = "x-arch"; then
+ prev=arch
+ fi
+ fi
+ done
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_multiarch" >&5
+printf "%s\n" "$gl_cv_c_multiarch" >&6; }
+ if test $gl_cv_c_multiarch = yes; then
+ APPLE_UNIVERSAL_BUILD=1
+ else
+ APPLE_UNIVERSAL_BUILD=0
+ fi
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf survives out-of-memory conditions" >&5
+printf %s "checking whether printf survives out-of-memory conditions... " >&6; }
+if test ${gl_cv_func_printf_enomem+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_cv_func_printf_enomem="guessing no"
+ if test "$cross_compiling" = no; then
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#include <stdlib.h>
+#if defined __MACH__ && defined __APPLE__
+/* Avoid a crash on Mac OS X. */
+#include <mach/mach.h>
+#include <mach/mach_error.h>
+#include <mach/thread_status.h>
+#include <mach/exception.h>
+#include <mach/task.h>
+#include <pthread.h>
+/* The exception port on which our thread listens. */
+static mach_port_t our_exception_port;
+/* The main function of the thread listening for exceptions of type
+ EXC_BAD_ACCESS. */
+static void *
+mach_exception_thread (void *arg)
+{
+ /* Buffer for a message to be received. */
+ struct {
+ mach_msg_header_t head;
+ mach_msg_body_t msgh_body;
+ char data[1024];
+ } msg;
+ mach_msg_return_t retval;
+ /* Wait for a message on the exception port. */
+ retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg),
+ our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
+ if (retval != MACH_MSG_SUCCESS)
+ abort ();
+ exit (1);
+}
+static void
+nocrash_init (void)
+{
+ mach_port_t self = mach_task_self ();
+ /* Allocate a port on which the thread shall listen for exceptions. */
+ if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port)
+ == KERN_SUCCESS) {
+ /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */
+ if (mach_port_insert_right (self, our_exception_port, our_exception_port,
+ MACH_MSG_TYPE_MAKE_SEND)
+ == KERN_SUCCESS) {
+ /* The exceptions we want to catch. Only EXC_BAD_ACCESS is interesting
+ for us. */
+ exception_mask_t mask = EXC_MASK_BAD_ACCESS;
+ /* Create the thread listening on the exception port. */
+ pthread_attr_t attr;
+ pthread_t thread;
+ if (pthread_attr_init (&attr) == 0
+ && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0
+ && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) {
+ pthread_attr_destroy (&attr);
+ /* Replace the exception port info for these exceptions with our own.
+ Note that we replace the exception port for the entire task, not only
+ for a particular thread. This has the effect that when our exception
+ port gets the message, the thread specific exception port has already
+ been asked, and we don't need to bother about it.
+ See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html. */
+ task_set_exception_ports (self, mask, our_exception_port,
+ EXCEPTION_DEFAULT, MACHINE_THREAD_STATE);
+ }
+ }
+ }
+}
+#elif defined _WIN32 && ! defined __CYGWIN__
+/* Avoid a crash on native Windows. */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <winerror.h>
+static LONG WINAPI
+exception_filter (EXCEPTION_POINTERS *ExceptionInfo)
+{
+ switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
+ {
+ case EXCEPTION_ACCESS_VIOLATION:
+ case EXCEPTION_IN_PAGE_ERROR:
+ case EXCEPTION_STACK_OVERFLOW:
+ case EXCEPTION_GUARD_PAGE:
+ case EXCEPTION_PRIV_INSTRUCTION:
+ case EXCEPTION_ILLEGAL_INSTRUCTION:
+ case EXCEPTION_DATATYPE_MISALIGNMENT:
+ case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
+ case EXCEPTION_NONCONTINUABLE_EXCEPTION:
+ exit (1);
+ }
+ return EXCEPTION_CONTINUE_SEARCH;
+}
+static void
+nocrash_init (void)
+{
+ SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter);
+}
+#else
+/* Avoid a crash on POSIX systems. */
+#include <signal.h>
+#include <unistd.h>
+/* A POSIX signal handler. */
+static void
+exception_handler (int sig)
+{
+ _exit (1);
+}
+static void
+nocrash_init (void)
+{
+#ifdef SIGSEGV
+ signal (SIGSEGV, exception_handler);
+#endif
+#ifdef SIGBUS
+ signal (SIGBUS, exception_handler);
+#endif
+}
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <errno.h>
+int main()
+{
+ struct rlimit limit;
+ int ret;
+ nocrash_init ();
+ /* Some printf implementations allocate temporary space with malloc. */
+ /* On BSD systems, malloc() is limited by RLIMIT_DATA. */
+#ifdef RLIMIT_DATA
+ if (getrlimit (RLIMIT_DATA, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
+ limit.rlim_max = 5000000;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_DATA, &limit) < 0)
+ return 77;
+#endif
+ /* On Linux systems, malloc() is limited by RLIMIT_AS. */
+#ifdef RLIMIT_AS
+ if (getrlimit (RLIMIT_AS, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
+ limit.rlim_max = 5000000;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_AS, &limit) < 0)
+ return 77;
+#endif
+ /* Some printf implementations allocate temporary space on the stack. */
+#ifdef RLIMIT_STACK
+ if (getrlimit (RLIMIT_STACK, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
+ limit.rlim_max = 5000000;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_STACK, &limit) < 0)
+ return 77;
+#endif
+ ret = printf ("%.5000000f", 1.0);
+ return !(ret == 5000002 || (ret < 0 && errno == ENOMEM));
+}
+
+_ACEOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s conftest$ac_exeext; then
+ (./conftest 2>&5
+ result=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $result" >&5
+ if test $result != 0 && test $result != 77; then result=1; fi
+ exit $result
+ ) >/dev/null 2>/dev/null
+ case $? in
+ 0) gl_cv_func_printf_enomem="yes" ;;
+ 77) gl_cv_func_printf_enomem="guessing no" ;;
+ *) gl_cv_func_printf_enomem="no" ;;
+ esac
+ else
+ gl_cv_func_printf_enomem="guessing no"
+ fi
+ rm -fr conftest*
+ else
+ gl_cv_func_printf_enomem="guessing no"
+ fi
+ fi
+ if test "$gl_cv_func_printf_enomem" = "guessing no"; then
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on Solaris.
+ solaris*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on AIX.
+ aix*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on HP-UX/hppa.
+ hpux*) case "$host_cpu" in
+ hppa*) gl_cv_func_printf_enomem="guessing yes";;
+ *) gl_cv_func_printf_enomem="guessing no";;
+ esac
+ ;;
+ # Guess yes on IRIX.
+ irix*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on OSF/1.
+ osf*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on Haiku.
+ haiku*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_enomem="guessing no";;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_printf_enomem="$gl_cross_guess_normal";;
+ esac
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_enomem" >&5
+printf "%s\n" "$gl_cv_func_printf_enomem" >&6; }
+
+
+
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ ;;
+ *)
+
+printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
+
+ ;;
+ esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5
+printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; }
+if test ${ac_cv_c_undeclared_builtin_options+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_CFLAGS=$CFLAGS
+ ac_cv_c_undeclared_builtin_options='cannot detect'
+ for ac_arg in '' -fno-builtin; do
+ CFLAGS="$ac_save_CFLAGS $ac_arg"
+ # This test program should *not* compile successfully.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+(void) strchr;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ # This test program should compile successfully.
+ # No library function is consistently available on
+ # freestanding implementations, so test against a dummy
+ # declaration. Include always-available headers on the
+ # off chance that they somehow elicit warnings.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <float.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stddef.h>
+extern void ac_decl (int, char *);
+
+int
+main (void)
+{
+(void) ac_decl (0, (char *) 0);
+ (void) ac_decl;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ if test x"$ac_arg" = x
+then :
+ ac_cv_c_undeclared_builtin_options='none needed'
+else $as_nop
+ ac_cv_c_undeclared_builtin_options=$ac_arg
+fi
+ break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ done
+ CFLAGS=$ac_save_CFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5
+printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; }
+ case $ac_cv_c_undeclared_builtin_options in #(
+ 'cannot detect') :
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot make $CC report undeclared builtins
+See \`config.log' for more details" "$LINENO" 5; } ;; #(
+ 'none needed') :
+ ac_c_undeclared_builtin_options='' ;; #(
+ *) :
+ ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;;
+esac
+
+ac_func=
+for ac_item in $ac_func_c_list
+do
+ if test $ac_func; then
+ ac_fn_c_check_func "$LINENO" $ac_func ac_cv_func_$ac_func
+ if eval test \"x\$ac_cv_func_$ac_func\" = xyes; then
+ echo "#define $ac_item 1" >> confdefs.h
+ fi
+ ac_func=
+ else
+ ac_func=$ac_item
+ fi
+done
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wchar_t" >&5
+printf %s "checking for wchar_t... " >&6; }
+if test ${gt_cv_c_wchar_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stddef.h>
+ wchar_t foo = (wchar_t)'\0';
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gt_cv_c_wchar_t=yes
+else $as_nop
+ gt_cv_c_wchar_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wchar_t" >&5
+printf "%s\n" "$gt_cv_c_wchar_t" >&6; }
+ if test $gt_cv_c_wchar_t = yes; then
+
+printf "%s\n" "#define HAVE_WCHAR_T 1" >>confdefs.h
+
+ fi
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wint_t" >&5
+printf %s "checking for wint_t... " >&6; }
+if test ${gt_cv_c_wint_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <wchar.h>
+ wint_t foo = (wchar_t)'\0';
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gt_cv_c_wint_t=yes
+else $as_nop
+ gt_cv_c_wint_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wint_t" >&5
+printf "%s\n" "$gt_cv_c_wint_t" >&6; }
+ if test $gt_cv_c_wint_t = yes; then
+
+printf "%s\n" "#define HAVE_WINT_T 1" >>confdefs.h
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether wint_t is large enough" >&5
+printf %s "checking whether wint_t is large enough... " >&6; }
+if test ${gl_cv_type_wint_t_large_enough+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <wchar.h>
+ int verify[sizeof (wint_t) < sizeof (int) ? -1 : 1];
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_type_wint_t_large_enough=yes
+else $as_nop
+ gl_cv_type_wint_t_large_enough=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wint_t_large_enough" >&5
+printf "%s\n" "$gl_cv_type_wint_t_large_enough" >&6; }
+ if test $gl_cv_type_wint_t_large_enough = no; then
+ GNULIBHEADERS_OVERRIDE_WINT_T=1
+ else
+ GNULIBHEADERS_OVERRIDE_WINT_T=0
+ fi
+ else
+ GNULIBHEADERS_OVERRIDE_WINT_T=0
+ fi
+
+
+
+
+
+ if test $ac_cv_header_features_h = yes; then
+ HAVE_FEATURES_H=1
+ else
+ HAVE_FEATURES_H=0
+ fi
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for intmax_t" >&5
+printf %s "checking for intmax_t... " >&6; }
+if test ${gt_cv_c_intmax_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stddef.h>
+#include <stdlib.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+#include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+#include <inttypes.h>
+#endif
+
+int
+main (void)
+{
+intmax_t x = -1; return !x;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gt_cv_c_intmax_t=yes
+else $as_nop
+ gt_cv_c_intmax_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_intmax_t" >&5
+printf "%s\n" "$gt_cv_c_intmax_t" >&6; }
+ if test $gt_cv_c_intmax_t = yes; then
+
+printf "%s\n" "#define HAVE_INTMAX_T 1" >>confdefs.h
+
+ else
+
+printf "%s\n" "#define intmax_t long long" >>confdefs.h
+
+ fi
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'double'" >&5
+printf %s "checking where to find the exponent in a 'double'... " >&6; }
+if test ${gl_cv_cc_double_expbit0+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#if defined arm || defined __arm || defined __arm__
+ mixed_endianness
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "mixed_endianness" >/dev/null 2>&1
+then :
+ gl_cv_cc_double_expbit0="unknown"
+else $as_nop
+
+ :
+if test ${ac_cv_c_bigendian+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_c_bigendian=unknown
+ # See if we're dealing with a universal compiler.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __APPLE_CC__
+ not a universal capable compiler
+ #endif
+ typedef int dummy;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+ # Check for potential -arch flags. It is not universal unless
+ # there are at least two -arch flags with different values.
+ ac_arch=
+ ac_prev=
+ for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
+ if test -n "$ac_prev"; then
+ case $ac_word in
+ i?86 | x86_64 | ppc | ppc64)
+ if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
+ ac_arch=$ac_word
+ else
+ ac_cv_c_bigendian=universal
+ break
+ fi
+ ;;
+ esac
+ ac_prev=
+ elif test "x$ac_word" = "x-arch"; then
+ ac_prev=arch
+ fi
+ done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ if test $ac_cv_c_bigendian = unknown; then
+ # See if sys/param.h defines the BYTE_ORDER macro.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/param.h>
+
+int
+main (void)
+{
+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+ && LITTLE_ENDIAN)
+ bogus endian macros
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ # It does; now see whether it defined to BIG_ENDIAN or not.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/param.h>
+
+int
+main (void)
+{
+#if BYTE_ORDER != BIG_ENDIAN
+ not big endian
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_bigendian=yes
+else $as_nop
+ ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ fi
+ if test $ac_cv_c_bigendian = unknown; then
+ # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+
+int
+main (void)
+{
+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+ bogus endian macros
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ # It does; now see whether it defined to _BIG_ENDIAN or not.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+
+int
+main (void)
+{
+#ifndef _BIG_ENDIAN
+ not big endian
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_bigendian=yes
+else $as_nop
+ ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ fi
+ if test $ac_cv_c_bigendian = unknown; then
+ # Compile a test program.
+ if test "$cross_compiling" = yes
+then :
+ # Try to guess by grepping values from an object file.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+unsigned short int ascii_mm[] =
+ { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+ unsigned short int ascii_ii[] =
+ { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+ int use_ascii (int i) {
+ return ascii_mm[i] + ascii_ii[i];
+ }
+ unsigned short int ebcdic_ii[] =
+ { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+ unsigned short int ebcdic_mm[] =
+ { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+ int use_ebcdic (int i) {
+ return ebcdic_mm[i] + ebcdic_ii[i];
+ }
+ extern int foo;
+
+int
+main (void)
+{
+return use_ascii (foo) == use_ebcdic (foo);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+ ac_cv_c_bigendian=yes
+ fi
+ if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+ if test "$ac_cv_c_bigendian" = unknown; then
+ ac_cv_c_bigendian=no
+ else
+ # finding both strings is unlikely to happen, but who knows?
+ ac_cv_c_bigendian=unknown
+ fi
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main (void)
+{
+
+ /* Are we little or big endian? From Harbison&Steele. */
+ union
+ {
+ long int l;
+ char c[sizeof (long int)];
+ } u;
+ u.l = 1;
+ return u.c[sizeof (long int) - 1] == 1;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ ac_cv_c_bigendian=no
+else $as_nop
+ ac_cv_c_bigendian=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ fi
+fi
+:
+ case $ac_cv_c_bigendian in #(
+ yes)
+ gl_cv_cc_double_expbit0="word 0 bit 20";; #(
+ no)
+ gl_cv_cc_double_expbit0="word 1 bit 20" ;; #(
+ universal)
+
+printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+
+ ;; #(
+ *)
+ gl_cv_cc_double_expbit0="unknown" ;;
+ esac
+
+
+fi
+rm -rf conftest*
+
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <float.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#define NWORDS \
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { double value; unsigned int word[NWORDS]; } memory_double;
+static unsigned int ored_words[NWORDS];
+static unsigned int anded_words[NWORDS];
+static void add_to_ored_words (double x)
+{
+ memory_double m;
+ size_t i;
+ /* Clear it first, in case sizeof (double) < sizeof (memory_double). */
+ memset (&m, 0, sizeof (memory_double));
+ m.value = x;
+ for (i = 0; i < NWORDS; i++)
+ {
+ ored_words[i] |= m.word[i];
+ anded_words[i] &= m.word[i];
+ }
+}
+int main ()
+{
+ size_t j;
+ FILE *fp = fopen ("conftest.out", "w");
+ if (fp == NULL)
+ return 1;
+ for (j = 0; j < NWORDS; j++)
+ anded_words[j] = ~ (unsigned int) 0;
+ add_to_ored_words (0.25);
+ add_to_ored_words (0.5);
+ add_to_ored_words (1.0);
+ add_to_ored_words (2.0);
+ add_to_ored_words (4.0);
+ /* Remove bits that are common (e.g. if representation of the first mantissa
+ bit is explicit). */
+ for (j = 0; j < NWORDS; j++)
+ ored_words[j] &= ~anded_words[j];
+ /* Now find the nonzero word. */
+ for (j = 0; j < NWORDS; j++)
+ if (ored_words[j] != 0)
+ break;
+ if (j < NWORDS)
+ {
+ size_t i;
+ for (i = j + 1; i < NWORDS; i++)
+ if (ored_words[i] != 0)
+ {
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+ }
+ for (i = 0; ; i++)
+ if ((ored_words[j] >> i) & 1)
+ {
+ fprintf (fp, "word %d bit %d", (int) j, (int) i);
+ return (fclose (fp) != 0);
+ }
+ }
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_cc_double_expbit0=`cat conftest.out`
+else $as_nop
+ gl_cv_cc_double_expbit0="unknown"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.out
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_double_expbit0" >&5
+printf "%s\n" "$gl_cv_cc_double_expbit0" >&6; }
+ case "$gl_cv_cc_double_expbit0" in
+ word*bit*)
+ word=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
+ bit=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word.*bit //'`
+
+printf "%s\n" "#define DBL_EXPBIT0_WORD $word" >>confdefs.h
+
+
+printf "%s\n" "#define DBL_EXPBIT0_BIT $bit" >>confdefs.h
+
+ ;;
+ esac
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf returns a byte count as in C99" >&5
+printf %s "checking whether snprintf returns a byte count as in C99... " >&6; }
+if test ${gl_cv_func_snprintf_retval_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on FreeBSD >= 5.
+ freebsd[1-4].*) gl_cv_func_snprintf_retval_c99="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ midnightbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on Mac OS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_snprintf_retval_c99="guessing no";;
+ darwin*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on OpenBSD >= 3.9.
+ openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
+ gl_cv_func_snprintf_retval_c99="guessing no";;
+ openbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on Solaris >= 2.10.
+ solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ solaris*) gl_cv_func_printf_sizes_c99="guessing no";;
+ # Guess yes on AIX >= 4.
+ aix[1-3]*) gl_cv_func_snprintf_retval_c99="guessing no";;
+ aix*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_snprintf_retval_c99="guessing no";;
+ netbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on MSVC, no on mingw.
+ mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef _MSC_VER
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Known" >/dev/null 2>&1
+then :
+ gl_cv_func_snprintf_retval_c99="guessing yes"
+else $as_nop
+ gl_cv_func_snprintf_retval_c99="guessing no"
+fi
+rm -rf conftest*
+
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_snprintf_retval_c99="$gl_cross_guess_normal";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <string.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+ va_list args;
+ int ret;
+ va_start (args, format);
+ ret = vsnprintf (buf, size, format, args);
+ va_end (args);
+ return ret;
+}
+#endif
+static char buf[100];
+int main ()
+{
+ strcpy (buf, "ABCDEF");
+ if (my_snprintf (buf, 3, "%d %d", 4567, 89) != 7)
+ return 1;
+ if (my_snprintf (buf, 0, "%d %d", 4567, 89) != 7)
+ return 2;
+ if (my_snprintf (NULL, 0, "%d %d", 4567, 89) != 7)
+ return 3;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_snprintf_retval_c99=yes
+else $as_nop
+ gl_cv_func_snprintf_retval_c99=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_retval_c99" >&5
+printf "%s\n" "$gl_cv_func_snprintf_retval_c99" >&6; }
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf truncates the result as in C99" >&5
+printf %s "checking whether snprintf truncates the result as in C99... " >&6; }
+if test ${gl_cv_func_snprintf_truncation_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on FreeBSD >= 5.
+ freebsd[1-4].*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ midnightbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on Mac OS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ darwin*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on OpenBSD >= 3.9.
+ openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
+ gl_cv_func_snprintf_truncation_c99="guessing no";;
+ openbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on Solaris >= 2.6.
+ solaris2.[0-5] | solaris2.[0-5].*)
+ gl_cv_func_snprintf_truncation_c99="guessing no";;
+ solaris*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on AIX >= 4.
+ aix[1-3]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ aix*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on HP-UX >= 11.
+ hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ hpux*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on IRIX >= 6.5.
+ irix6.5) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on OSF/1 >= 5.
+ osf[3-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ osf*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_snprintf_truncation_c99="guessing no";;
+ netbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_snprintf_truncation_c99="$gl_cross_guess_normal";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <string.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+ va_list args;
+ int ret;
+ va_start (args, format);
+ ret = vsnprintf (buf, size, format, args);
+ va_end (args);
+ return ret;
+}
+#endif
+static char buf[100];
+int main ()
+{
+ strcpy (buf, "ABCDEF");
+ my_snprintf (buf, 3, "%d %d", 4567, 89);
+ if (memcmp (buf, "45\0DEF", 6) != 0)
+ return 1;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_snprintf_truncation_c99=yes
+else $as_nop
+ gl_cv_func_snprintf_truncation_c99=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_truncation_c99" >&5
+printf "%s\n" "$gl_cv_func_snprintf_truncation_c99" >&6; }
+
+
+
+
+
+ ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf"
+if test "x$ac_cv_func_snprintf" = xyes
+then :
+ printf "%s\n" "#define HAVE_SNPRINTF 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "strnlen" "ac_cv_func_strnlen"
+if test "x$ac_cv_func_strnlen" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRNLEN 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "wcslen" "ac_cv_func_wcslen"
+if test "x$ac_cv_func_wcslen" = xyes
+then :
+ printf "%s\n" "#define HAVE_WCSLEN 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "wcsnlen" "ac_cv_func_wcsnlen"
+if test "x$ac_cv_func_wcsnlen" = xyes
+then :
+ printf "%s\n" "#define HAVE_WCSNLEN 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "mbrtowc" "ac_cv_func_mbrtowc"
+if test "x$ac_cv_func_mbrtowc" = xyes
+then :
+ printf "%s\n" "#define HAVE_MBRTOWC 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "wcrtomb" "ac_cv_func_wcrtomb"
+if test "x$ac_cv_func_wcrtomb" = xyes
+then :
+ printf "%s\n" "#define HAVE_WCRTOMB 1" >>confdefs.h
+
+fi
+
+ ac_fn_check_decl "$LINENO" "_snprintf" "ac_cv_have_decl__snprintf" "#include <stdio.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl__snprintf" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL__SNPRINTF $ac_have_decl" >>confdefs.h
+
+
+
+ case "$gl_cv_func_snprintf_retval_c99" in
+ *yes)
+
+printf "%s\n" "#define HAVE_SNPRINTF_RETVAL_C99 1" >>confdefs.h
+
+ ;;
+ esac
+
+ case "$gl_cv_func_snprintf_truncation_c99" in
+ *yes)
+
+printf "%s\n" "#define HAVE_SNPRINTF_TRUNCATION_C99 1" >>confdefs.h
+
+ ;;
+ esac
+
+
+ HAVE_DECL_FCLOSEALL=1;
+ HAVE_DECL_FPURGE=1;
+ HAVE_DECL_FSEEKO=1;
+ HAVE_DECL_FTELLO=1;
+ HAVE_DECL_GETDELIM=1;
+ HAVE_DECL_GETLINE=1;
+ HAVE_DECL_GETW=1;
+ HAVE_DECL_OBSTACK_PRINTF=1;
+ HAVE_DECL_PUTW=1;
+ HAVE_DECL_SNPRINTF=1;
+ HAVE_DECL_VSNPRINTF=1;
+ HAVE_DPRINTF=1;
+ HAVE_FSEEKO=1;
+ HAVE_FTELLO=1;
+ HAVE_PCLOSE=1;
+ HAVE_POPEN=1;
+ HAVE_RENAMEAT=1;
+ HAVE_VASPRINTF=1;
+ HAVE_VDPRINTF=1;
+ REPLACE_DPRINTF=0;
+ REPLACE_FCLOSE=0;
+ REPLACE_FDOPEN=0;
+ REPLACE_FFLUSH=0;
+ REPLACE_FOPEN=0;
+ REPLACE_FOPEN_FOR_FOPEN_GNU=0;
+ REPLACE_FPRINTF=0;
+ REPLACE_FPURGE=0;
+ REPLACE_FREOPEN=0;
+ REPLACE_FSEEK=0;
+ REPLACE_FSEEKO=0;
+ REPLACE_FTELL=0;
+ REPLACE_FTELLO=0;
+ REPLACE_GETDELIM=0;
+ REPLACE_GETLINE=0;
+ REPLACE_OBSTACK_PRINTF=0;
+ REPLACE_PERROR=0;
+ REPLACE_POPEN=0;
+ REPLACE_PRINTF=0;
+ REPLACE_REMOVE=0;
+ REPLACE_RENAME=0;
+ REPLACE_RENAMEAT=0;
+ REPLACE_SNPRINTF=0;
+ REPLACE_SPRINTF=0;
+ REPLACE_STDIO_READ_FUNCS=0;
+ REPLACE_STDIO_WRITE_FUNCS=0;
+ REPLACE_TMPFILE=0;
+ REPLACE_VASPRINTF=0;
+ REPLACE_VDPRINTF=0;
+ REPLACE_VFPRINTF=0;
+ REPLACE_VPRINTF=0;
+ REPLACE_VSNPRINTF=0;
+ REPLACE_VSPRINTF=0;
+
+
+
+ GL_GNULIB_DPRINTF=0
+
+
+
+ GL_GNULIB_FCLOSE=0
+
+
+
+ GL_GNULIB_FDOPEN=0
+
+
+
+ GL_GNULIB_FFLUSH=0
+
+
+
+ GL_GNULIB_FGETC=0
+
+
+
+ GL_GNULIB_FGETS=0
+
+
+
+ GL_GNULIB_FOPEN=0
+
+
+
+ GL_GNULIB_FOPEN_GNU=0
+
+
+
+ GL_GNULIB_FPRINTF=0
+
+
+
+ GL_GNULIB_FPRINTF_POSIX=0
+
+
+
+ GL_GNULIB_FPURGE=0
+
+
+
+ GL_GNULIB_FPUTC=0
+
+
+
+ GL_GNULIB_FPUTS=0
+
+
+
+ GL_GNULIB_FREAD=0
+
+
+
+ GL_GNULIB_FREOPEN=0
+
+
+
+ GL_GNULIB_FSCANF=0
+
+
+
+ GL_GNULIB_FSEEK=0
+
+
+
+ GL_GNULIB_FSEEKO=0
+
+
+
+ GL_GNULIB_FTELL=0
+
+
+
+ GL_GNULIB_FTELLO=0
+
+
+
+ GL_GNULIB_FWRITE=0
+
+
+
+ GL_GNULIB_GETC=0
+
+
+
+ GL_GNULIB_GETCHAR=0
+
+
+
+ GL_GNULIB_GETDELIM=0
+
+
+
+ GL_GNULIB_GETLINE=0
+
+
+
+ GL_GNULIB_OBSTACK_PRINTF=0
+
+
+
+ GL_GNULIB_OBSTACK_PRINTF_POSIX=0
+
+
+
+ GL_GNULIB_PCLOSE=0
+
+
+
+ GL_GNULIB_PERROR=0
+
+
+
+ GL_GNULIB_POPEN=0
+
+
+
+ GL_GNULIB_PRINTF=0
+
+
+
+ GL_GNULIB_PRINTF_POSIX=0
+
+
+
+ GL_GNULIB_PUTC=0
+
+
+
+ GL_GNULIB_PUTCHAR=0
+
+
+
+ GL_GNULIB_PUTS=0
+
+
+
+ GL_GNULIB_REMOVE=0
+
+
+
+ GL_GNULIB_RENAME=0
+
+
+
+ GL_GNULIB_RENAMEAT=0
+
+
+
+ GL_GNULIB_SCANF=0
+
+
+
+ GL_GNULIB_SNPRINTF=0
+
+
+
+ GL_GNULIB_SPRINTF_POSIX=0
+
+
+
+ GL_GNULIB_STDIO_H_NONBLOCKING=0
+
+
+
+ GL_GNULIB_STDIO_H_SIGPIPE=0
+
+
+
+ GL_GNULIB_TMPFILE=0
+
+
+
+ GL_GNULIB_VASPRINTF=0
+
+
+
+ GL_GNULIB_VFSCANF=0
+
+
+
+ GL_GNULIB_VSCANF=0
+
+
+
+ GL_GNULIB_VDPRINTF=0
+
+
+
+ GL_GNULIB_VFPRINTF=0
+
+
+
+ GL_GNULIB_VFPRINTF_POSIX=0
+
+
+
+ GL_GNULIB_VPRINTF=0
+
+
+
+ GL_GNULIB_VPRINTF_POSIX=0
+
+
+
+ GL_GNULIB_VSNPRINTF=0
+
+
+
+ GL_GNULIB_VSPRINTF_POSIX=0
+
+
+
+ GL_GNULIB_MDA_FCLOSEALL=1
+
+
+
+ GL_GNULIB_MDA_FDOPEN=1
+
+
+
+ GL_GNULIB_MDA_FILENO=1
+
+
+
+ GL_GNULIB_MDA_GETW=1
+
+
+
+ GL_GNULIB_MDA_PUTW=1
+
+
+
+ GL_GNULIB_MDA_TEMPNAM=1
+
+
+
+
+ HAVE__EXIT=1;
+ HAVE_ALIGNED_ALLOC=1;
+ HAVE_ATOLL=1;
+ HAVE_CANONICALIZE_FILE_NAME=1;
+ HAVE_DECL_ECVT=1;
+ HAVE_DECL_FCVT=1;
+ HAVE_DECL_GCVT=1;
+ HAVE_DECL_GETLOADAVG=1;
+ HAVE_GETPROGNAME=1;
+ HAVE_GETSUBOPT=1;
+ HAVE_GRANTPT=1;
+ HAVE_INITSTATE=1;
+ HAVE_DECL_INITSTATE=1;
+ HAVE_MBTOWC=1;
+ HAVE_MKDTEMP=1;
+ HAVE_MKOSTEMP=1;
+ HAVE_MKOSTEMPS=1;
+ HAVE_MKSTEMP=1;
+ HAVE_MKSTEMPS=1;
+ HAVE_POSIX_MEMALIGN=1;
+ HAVE_POSIX_OPENPT=1;
+ HAVE_PTSNAME=1;
+ HAVE_PTSNAME_R=1;
+ HAVE_QSORT_R=1;
+ HAVE_RANDOM=1;
+ HAVE_RANDOM_H=1;
+ HAVE_RANDOM_R=1;
+ HAVE_REALLOCARRAY=1;
+ HAVE_REALPATH=1;
+ HAVE_RPMATCH=1;
+ HAVE_SECURE_GETENV=1;
+ HAVE_SETENV=1;
+ HAVE_DECL_SETENV=1;
+ HAVE_SETSTATE=1;
+ HAVE_DECL_SETSTATE=1;
+ HAVE_STRTOD=1;
+ HAVE_STRTOL=1;
+ HAVE_STRTOLD=1;
+ HAVE_STRTOLL=1;
+ HAVE_STRTOUL=1;
+ HAVE_STRTOULL=1;
+ HAVE_STRUCT_RANDOM_DATA=1;
+ HAVE_SYS_LOADAVG_H=0;
+ HAVE_UNLOCKPT=1;
+ HAVE_DECL_UNSETENV=1;
+ REPLACE__EXIT=0;
+ REPLACE_ALIGNED_ALLOC=0;
+ REPLACE_CALLOC_FOR_CALLOC_GNU=0;
+ REPLACE_CALLOC_FOR_CALLOC_POSIX=0;
+ REPLACE_CANONICALIZE_FILE_NAME=0;
+ REPLACE_FREE=0;
+ REPLACE_GETLOADAVG=0;
+ REPLACE_GETPROGNAME=0;
+ REPLACE_GETSUBOPT=0;
+ REPLACE_INITSTATE=0;
+ REPLACE_MALLOC_FOR_MALLOC_GNU=0;
+ REPLACE_MALLOC_FOR_MALLOC_POSIX=0;
+ REPLACE_MBTOWC=0;
+ REPLACE_MKOSTEMP=0;
+ REPLACE_MKOSTEMPS=0;
+ REPLACE_MKSTEMP=0;
+ REPLACE_POSIX_MEMALIGN=0;
+ REPLACE_POSIX_OPENPT=0;
+ REPLACE_PTSNAME=0;
+ REPLACE_PTSNAME_R=0;
+ REPLACE_PUTENV=0;
+ REPLACE_QSORT_R=0;
+ REPLACE_RANDOM=0;
+ REPLACE_RANDOM_R=0;
+ REPLACE_REALLOC_FOR_REALLOC_GNU=0;
+ REPLACE_REALLOC_FOR_REALLOC_POSIX=0;
+ REPLACE_REALLOCARRAY=0;
+ REPLACE_REALPATH=0;
+ REPLACE_SETENV=0;
+ REPLACE_SETSTATE=0;
+ REPLACE_STRTOD=0;
+ REPLACE_STRTOL=0;
+ REPLACE_STRTOLD=0;
+ REPLACE_STRTOLL=0;
+ REPLACE_STRTOUL=0;
+ REPLACE_STRTOULL=0;
+ REPLACE_UNSETENV=0;
+ REPLACE_WCTOMB=0;
+
+
+
+ GL_GNULIB__EXIT=0
+
+
+
+ GL_GNULIB_ALIGNED_ALLOC=0
+
+
+
+ GL_GNULIB_ATOLL=0
+
+
+
+ GL_GNULIB_CALLOC_GNU=0
+
+
+
+ GL_GNULIB_CALLOC_POSIX=0
+
+
+
+ GL_GNULIB_CANONICALIZE_FILE_NAME=0
+
+
+
+ GL_GNULIB_FREE_POSIX=0
+
+
+
+ GL_GNULIB_GETLOADAVG=0
+
+
+
+ GL_GNULIB_GETPROGNAME=0
+
+
+
+ GL_GNULIB_GETSUBOPT=0
+
+
+
+ GL_GNULIB_GRANTPT=0
+
+
+
+ GL_GNULIB_MALLOC_GNU=0
+
+
+
+ GL_GNULIB_MALLOC_POSIX=0
+
+
+
+ GL_GNULIB_MBTOWC=0
+
+
+
+ GL_GNULIB_MKDTEMP=0
+
+
+
+ GL_GNULIB_MKOSTEMP=0
+
+
+
+ GL_GNULIB_MKOSTEMPS=0
+
+
+
+ GL_GNULIB_MKSTEMP=0
+
+
+
+ GL_GNULIB_MKSTEMPS=0
+
+
+
+ GL_GNULIB_POSIX_MEMALIGN=0
+
+
+
+ GL_GNULIB_POSIX_OPENPT=0
+
+
+
+ GL_GNULIB_PTSNAME=0
+
+
+
+ GL_GNULIB_PTSNAME_R=0
+
+
+
+ GL_GNULIB_PUTENV=0
+
+
+
+ GL_GNULIB_QSORT_R=0
+
+
+
+ GL_GNULIB_RANDOM=0
+
+
+
+ GL_GNULIB_RANDOM_R=0
+
+
+
+ GL_GNULIB_REALLOCARRAY=0
+
+
+
+ GL_GNULIB_REALLOC_GNU=0
+
+
+
+ GL_GNULIB_REALLOC_POSIX=0
+
+
+
+ GL_GNULIB_REALPATH=0
+
+
+
+ GL_GNULIB_RPMATCH=0
+
+
+
+ GL_GNULIB_SECURE_GETENV=0
+
+
+
+ GL_GNULIB_SETENV=0
+
+
+
+ GL_GNULIB_STRTOD=0
+
+
+
+ GL_GNULIB_STRTOL=0
+
+
+
+ GL_GNULIB_STRTOLD=0
+
+
+
+ GL_GNULIB_STRTOLL=0
+
+
+
+ GL_GNULIB_STRTOUL=0
+
+
+
+ GL_GNULIB_STRTOULL=0
+
+
+
+ GL_GNULIB_SYSTEM_POSIX=0
+
+
+
+ GL_GNULIB_UNLOCKPT=0
+
+
+
+ GL_GNULIB_UNSETENV=0
+
+
+
+ GL_GNULIB_WCTOMB=0
+
+
+
+ GL_GNULIB_MDA_ECVT=1
+
+
+
+ GL_GNULIB_MDA_FCVT=1
+
+
+
+ GL_GNULIB_MDA_GCVT=1
+
+
+
+ GL_GNULIB_MDA_MKTEMP=1
+
+
+
+ GL_GNULIB_MDA_PUTENV=1
+
+
+
+
+ HAVE_ACOSF=1;
+ HAVE_ACOSL=1;
+ HAVE_ASINF=1;
+ HAVE_ASINL=1;
+ HAVE_ATANF=1;
+ HAVE_ATANL=1;
+ HAVE_ATAN2F=1;
+ HAVE_CBRT=1;
+ HAVE_CBRTF=1;
+ HAVE_CBRTL=1;
+ HAVE_COPYSIGN=1;
+ HAVE_COPYSIGNL=1;
+ HAVE_COSF=1;
+ HAVE_COSL=1;
+ HAVE_COSHF=1;
+ HAVE_EXPF=1;
+ HAVE_EXPL=1;
+ HAVE_EXPM1=1;
+ HAVE_EXPM1F=1;
+ HAVE_FABSF=1;
+ HAVE_FABSL=1;
+ HAVE_FMA=1;
+ HAVE_FMAF=1;
+ HAVE_FMAL=1;
+ HAVE_FMODF=1;
+ HAVE_FMODL=1;
+ HAVE_FREXPF=1;
+ HAVE_HYPOTF=1;
+ HAVE_HYPOTL=1;
+ HAVE_ILOGB=1;
+ HAVE_ILOGBF=1;
+ HAVE_ILOGBL=1;
+ HAVE_ISNANF=1;
+ HAVE_ISNAND=1;
+ HAVE_ISNANL=1;
+ HAVE_LDEXPF=1;
+ HAVE_LOGF=1;
+ HAVE_LOGL=1;
+ HAVE_LOG10F=1;
+ HAVE_LOG10L=1;
+ HAVE_LOG1P=1;
+ HAVE_LOG1PF=1;
+ HAVE_LOG1PL=1;
+ HAVE_LOGBF=1;
+ HAVE_LOGBL=1;
+ HAVE_MODFF=1;
+ HAVE_MODFL=1;
+ HAVE_POWF=1;
+ HAVE_REMAINDER=1;
+ HAVE_REMAINDERF=1;
+ HAVE_RINT=1;
+ HAVE_RINTL=1;
+ HAVE_SINF=1;
+ HAVE_SINL=1;
+ HAVE_SINHF=1;
+ HAVE_SQRTF=1;
+ HAVE_SQRTL=1;
+ HAVE_TANF=1;
+ HAVE_TANL=1;
+ HAVE_TANHF=1;
+ HAVE_DECL_ACOSL=1;
+ HAVE_DECL_ASINL=1;
+ HAVE_DECL_ATANL=1;
+ HAVE_DECL_CBRTF=1;
+ HAVE_DECL_CBRTL=1;
+ HAVE_DECL_CEILF=1;
+ HAVE_DECL_CEILL=1;
+ HAVE_DECL_COPYSIGNF=1;
+ HAVE_DECL_COSL=1;
+ HAVE_DECL_EXPL=1;
+ HAVE_DECL_EXP2=1;
+ HAVE_DECL_EXP2F=1;
+ HAVE_DECL_EXP2L=1;
+ HAVE_DECL_EXPM1L=1;
+ HAVE_DECL_FLOORF=1;
+ HAVE_DECL_FLOORL=1;
+ HAVE_DECL_FREXPL=1;
+ HAVE_DECL_LDEXPL=1;
+ HAVE_DECL_LOGL=1;
+ HAVE_DECL_LOG10L=1;
+ HAVE_DECL_LOG2=1;
+ HAVE_DECL_LOG2F=1;
+ HAVE_DECL_LOG2L=1;
+ HAVE_DECL_LOGB=1;
+ HAVE_DECL_REMAINDER=1;
+ HAVE_DECL_REMAINDERL=1;
+ HAVE_DECL_RINTF=1;
+ HAVE_DECL_ROUND=1;
+ HAVE_DECL_ROUNDF=1;
+ HAVE_DECL_ROUNDL=1;
+ HAVE_DECL_SINL=1;
+ HAVE_DECL_SQRTL=1;
+ HAVE_DECL_TANL=1;
+ HAVE_DECL_TRUNC=1;
+ HAVE_DECL_TRUNCF=1;
+ HAVE_DECL_TRUNCL=1;
+ REPLACE_ACOSF=0;
+ REPLACE_ASINF=0;
+ REPLACE_ATANF=0;
+ REPLACE_ATAN2F=0;
+ REPLACE_CBRTF=0;
+ REPLACE_CBRTL=0;
+ REPLACE_CEIL=0;
+ REPLACE_CEILF=0;
+ REPLACE_CEILL=0;
+ REPLACE_COSF=0;
+ REPLACE_COSHF=0;
+ REPLACE_EXPF=0;
+ REPLACE_EXPL=0;
+ REPLACE_EXPM1=0;
+ REPLACE_EXPM1F=0;
+ REPLACE_EXPM1L=0;
+ REPLACE_EXP2=0;
+ REPLACE_EXP2L=0;
+ REPLACE_FABSL=0;
+ REPLACE_FLOOR=0;
+ REPLACE_FLOORF=0;
+ REPLACE_FLOORL=0;
+ REPLACE_FMA=0;
+ REPLACE_FMAF=0;
+ REPLACE_FMAL=0;
+ REPLACE_FMOD=0;
+ REPLACE_FMODF=0;
+ REPLACE_FMODL=0;
+ REPLACE_FREXPF=0;
+ REPLACE_FREXP=0;
+ REPLACE_FREXPL=0;
+ REPLACE_HUGE_VAL=0;
+ REPLACE_HYPOT=0;
+ REPLACE_HYPOTF=0;
+ REPLACE_HYPOTL=0;
+ REPLACE_ILOGB=0;
+ REPLACE_ILOGBF=0;
+ REPLACE_ILOGBL=0;
+ REPLACE_ISFINITE=0;
+ REPLACE_ISINF=0;
+ REPLACE_ISNAN=0;
+ REPLACE_LDEXPL=0;
+ REPLACE_LOG=0;
+ REPLACE_LOGF=0;
+ REPLACE_LOGL=0;
+ REPLACE_LOG10=0;
+ REPLACE_LOG10F=0;
+ REPLACE_LOG10L=0;
+ REPLACE_LOG1P=0;
+ REPLACE_LOG1PF=0;
+ REPLACE_LOG1PL=0;
+ REPLACE_LOG2=0;
+ REPLACE_LOG2F=0;
+ REPLACE_LOG2L=0;
+ REPLACE_LOGB=0;
+ REPLACE_LOGBF=0;
+ REPLACE_LOGBL=0;
+ REPLACE_MODF=0;
+ REPLACE_MODFF=0;
+ REPLACE_MODFL=0;
+ REPLACE_NAN=0;
+ REPLACE_REMAINDER=0;
+ REPLACE_REMAINDERF=0;
+ REPLACE_REMAINDERL=0;
+ REPLACE_RINTL=0;
+ REPLACE_ROUND=0;
+ REPLACE_ROUNDF=0;
+ REPLACE_ROUNDL=0;
+ REPLACE_SIGNBIT=0;
+ REPLACE_SIGNBIT_USING_BUILTINS=0;
+ REPLACE_SINF=0;
+ REPLACE_SINHF=0;
+ REPLACE_SQRTF=0;
+ REPLACE_SQRTL=0;
+ REPLACE_TANF=0;
+ REPLACE_TANHF=0;
+ REPLACE_TRUNC=0;
+ REPLACE_TRUNCF=0;
+ REPLACE_TRUNCL=0;
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether frexp() can be used without linking with libm" >&5
+printf %s "checking whether frexp() can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_frexp_no_libm+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <math.h>
+ double x;
+int
+main (void)
+{
+int e; return frexp (x, &e) > 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_frexp_no_libm=yes
+else $as_nop
+ gl_cv_func_frexp_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexp_no_libm" >&5
+printf "%s\n" "$gl_cv_func_frexp_no_libm" >&6; }
+
+ac_fn_check_decl "$LINENO" "alarm" "ac_cv_have_decl_alarm" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_alarm" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_ALARM $ac_have_decl" >>confdefs.h
+
+
+
+ GL_GNULIB_ACOSF=0
+
+
+
+ GL_GNULIB_ACOSL=0
+
+
+
+ GL_GNULIB_ASINF=0
+
+
+
+ GL_GNULIB_ASINL=0
+
+
+
+ GL_GNULIB_ATANF=0
+
+
+
+ GL_GNULIB_ATANL=0
+
+
+
+ GL_GNULIB_ATAN2F=0
+
+
+
+ GL_GNULIB_CBRT=0
+
+
+
+ GL_GNULIB_CBRTF=0
+
+
+
+ GL_GNULIB_CBRTL=0
+
+
+
+ GL_GNULIB_CEIL=0
+
+
+
+ GL_GNULIB_CEILF=0
+
+
+
+ GL_GNULIB_CEILL=0
+
+
+
+ GL_GNULIB_COPYSIGN=0
+
+
+
+ GL_GNULIB_COPYSIGNF=0
+
+
+
+ GL_GNULIB_COPYSIGNL=0
+
+
+
+ GL_GNULIB_COSF=0
+
+
+
+ GL_GNULIB_COSL=0
+
+
+
+ GL_GNULIB_COSHF=0
+
+
+
+ GL_GNULIB_EXPF=0
+
+
+
+ GL_GNULIB_EXPL=0
+
+
+
+ GL_GNULIB_EXP2=0
+
+
+
+ GL_GNULIB_EXP2F=0
+
+
+
+ GL_GNULIB_EXP2L=0
+
+
+
+ GL_GNULIB_EXPM1=0
+
+
+
+ GL_GNULIB_EXPM1F=0
+
+
+
+ GL_GNULIB_EXPM1L=0
+
+
+
+ GL_GNULIB_FABSF=0
+
+
+
+ GL_GNULIB_FABSL=0
+
+
+
+ GL_GNULIB_FLOOR=0
+
+
+
+ GL_GNULIB_FLOORF=0
+
+
+
+ GL_GNULIB_FLOORL=0
+
+
+
+ GL_GNULIB_FMA=0
+
+
+
+ GL_GNULIB_FMAF=0
+
+
+
+ GL_GNULIB_FMAL=0
+
+
+
+ GL_GNULIB_FMOD=0
+
+
+
+ GL_GNULIB_FMODF=0
+
+
+
+ GL_GNULIB_FMODL=0
+
+
+
+ GL_GNULIB_FREXPF=0
+
+
+
+ GL_GNULIB_FREXP=0
+
+
+
+ GL_GNULIB_FREXPL=0
+
+
+
+ GL_GNULIB_HYPOT=0
+
+
+
+ GL_GNULIB_HYPOTF=0
+
+
+
+ GL_GNULIB_HYPOTL=0
+
+
+
+ GL_GNULIB_ILOGB=0
+
+
+
+ GL_GNULIB_ILOGBF=0
+
+
+
+ GL_GNULIB_ILOGBL=0
+
+
+
+ GL_GNULIB_ISFINITE=0
+
+
+
+ GL_GNULIB_ISINF=0
+
+
+
+ GL_GNULIB_ISNAN=0
+
+
+
+ GL_GNULIB_ISNANF=0
+
+
+
+ GL_GNULIB_ISNAND=0
+
+
+
+ GL_GNULIB_ISNANL=0
+
+
+
+ GL_GNULIB_LDEXPF=0
+
+
+
+ GL_GNULIB_LDEXPL=0
+
+
+
+ GL_GNULIB_LOG=0
+
+
+
+ GL_GNULIB_LOGF=0
+
+
+
+ GL_GNULIB_LOGL=0
+
+
+
+ GL_GNULIB_LOG10=0
+
+
+
+ GL_GNULIB_LOG10F=0
+
+
+
+ GL_GNULIB_LOG10L=0
+
+
+
+ GL_GNULIB_LOG1P=0
+
+
+
+ GL_GNULIB_LOG1PF=0
+
+
+
+ GL_GNULIB_LOG1PL=0
+
+
+
+ GL_GNULIB_LOG2=0
+
+
+
+ GL_GNULIB_LOG2F=0
+
+
+
+ GL_GNULIB_LOG2L=0
+
+
+
+ GL_GNULIB_LOGB=0
+
+
+
+ GL_GNULIB_LOGBF=0
+
+
+
+ GL_GNULIB_LOGBL=0
+
+
+
+ GL_GNULIB_MODF=0
+
+
+
+ GL_GNULIB_MODFF=0
+
+
+
+ GL_GNULIB_MODFL=0
+
+
+
+ GL_GNULIB_POWF=0
+
+
+
+ GL_GNULIB_REMAINDER=0
+
+
+
+ GL_GNULIB_REMAINDERF=0
+
+
+
+ GL_GNULIB_REMAINDERL=0
+
+
+
+ GL_GNULIB_RINT=0
+
+
+
+ GL_GNULIB_RINTF=0
+
+
+
+ GL_GNULIB_RINTL=0
+
+
+
+ GL_GNULIB_ROUND=0
+
+
+
+ GL_GNULIB_ROUNDF=0
+
+
+
+ GL_GNULIB_ROUNDL=0
+
+
+
+ GL_GNULIB_SIGNBIT=0
+
+
+
+ GL_GNULIB_SINF=0
+
+
+
+ GL_GNULIB_SINL=0
+
+
+
+ GL_GNULIB_SINHF=0
+
+
+
+ GL_GNULIB_SQRTF=0
+
+
+
+ GL_GNULIB_SQRTL=0
+
+
+
+ GL_GNULIB_TANF=0
+
+
+
+ GL_GNULIB_TANL=0
+
+
+
+ GL_GNULIB_TANHF=0
+
+
+
+ GL_GNULIB_TRUNC=0
+
+
+
+ GL_GNULIB_TRUNCF=0
+
+
+
+ GL_GNULIB_TRUNCL=0
+
+
+
+ GL_GNULIB_MDA_J0=1
+
+
+
+ GL_GNULIB_MDA_J1=1
+
+
+
+ GL_GNULIB_MDA_JN=1
+
+
+
+ GL_GNULIB_MDA_Y0=1
+
+
+
+ GL_GNULIB_MDA_Y1=1
+
+
+
+ GL_GNULIB_MDA_YN=1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_limits_h='<'limits.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <limits.h>" >&5
+printf %s "checking absolute name of <limits.h>... " >&6; }
+if test ${gl_cv_next_limits_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_limits_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'limits.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_limits_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_limits_h
+ gl_cv_next_limits_h='"'$gl_header'"'
+ else
+ gl_cv_next_limits_h='<'limits.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_limits_h" >&5
+printf "%s\n" "$gl_cv_next_limits_h" >&6; }
+ fi
+ NEXT_LIMITS_H=$gl_cv_next_limits_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'limits.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_limits_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_LIMITS_H=$gl_next_as_first_directive
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether limits.h has WORD_BIT, BOOL_WIDTH etc." >&5
+printf %s "checking whether limits.h has WORD_BIT, BOOL_WIDTH etc.... " >&6; }
+if test ${gl_cv_header_limits_width+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+ #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
+ #endif
+ #include <limits.h>
+ long long llm = LLONG_MAX;
+ int wb = WORD_BIT;
+ int ullw = ULLONG_WIDTH;
+ int bw = BOOL_WIDTH;
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_limits_width=yes
+else $as_nop
+ gl_cv_header_limits_width=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_limits_width" >&5
+printf "%s\n" "$gl_cv_header_limits_width" >&6; }
+ if test "$gl_cv_header_limits_width" = yes; then
+ GL_GENERATE_LIMITS_H=false
+ else
+ GL_GENERATE_LIMITS_H=true
+ fi
+
+
+
+
+
+
+
+printf "%s\n" "#define HAVE_LONG_LONG_INT 1" >>confdefs.h
+
+
+printf "%s\n" "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h
+
+
+
+ if test $ac_cv_header_wchar_h = yes; then
+ HAVE_WCHAR_H=1
+ else
+ HAVE_WCHAR_H=0
+ fi
+
+
+
+ if test $ac_cv_header_inttypes_h = yes; then
+ HAVE_INTTYPES_H=1
+ else
+ HAVE_INTTYPES_H=0
+ fi
+
+
+
+ if test $ac_cv_header_sys_types_h = yes; then
+ HAVE_SYS_TYPES_H=1
+ else
+ HAVE_SYS_TYPES_H=0
+ fi
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_stdint_h='<'stdint.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <stdint.h>" >&5
+printf %s "checking absolute name of <stdint.h>... " >&6; }
+if test ${gl_cv_next_stdint_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_stdint_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdint.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'stdint.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_stdint_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_stdint_h
+ gl_cv_next_stdint_h='"'$gl_header'"'
+ else
+ gl_cv_next_stdint_h='<'stdint.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdint_h" >&5
+printf "%s\n" "$gl_cv_next_stdint_h" >&6; }
+ fi
+ NEXT_STDINT_H=$gl_cv_next_stdint_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'stdint.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_stdint_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_STDINT_H=$gl_next_as_first_directive
+
+
+
+
+ if test $ac_cv_header_stdint_h = yes; then
+ HAVE_STDINT_H=1
+ else
+ HAVE_STDINT_H=0
+ fi
+
+
+ if test $ac_cv_header_stdint_h = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stdint.h conforms to C99" >&5
+printf %s "checking whether stdint.h conforms to C99... " >&6; }
+if test ${gl_cv_header_working_stdint_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_cv_header_working_stdint_h=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#define __STDC_CONSTANT_MACROS 1
+#define __STDC_LIMIT_MACROS 1
+#include <stdint.h>
+/* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in <wchar.h>. */
+#if !(defined WCHAR_MIN && defined WCHAR_MAX)
+#error "WCHAR_MIN, WCHAR_MAX not defined in <stdint.h>"
+#endif
+
+
+ #include <stddef.h>
+ #include <signal.h>
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+
+
+#ifdef INT8_MAX
+int8_t a1 = INT8_MAX;
+int8_t a1min = INT8_MIN;
+#endif
+#ifdef INT16_MAX
+int16_t a2 = INT16_MAX;
+int16_t a2min = INT16_MIN;
+#endif
+#ifdef INT32_MAX
+int32_t a3 = INT32_MAX;
+int32_t a3min = INT32_MIN;
+#endif
+#ifdef INT64_MAX
+int64_t a4 = INT64_MAX;
+int64_t a4min = INT64_MIN;
+#endif
+#ifdef UINT8_MAX
+uint8_t b1 = UINT8_MAX;
+#else
+typedef int b1[(unsigned char) -1 != 255 ? 1 : -1];
+#endif
+#ifdef UINT16_MAX
+uint16_t b2 = UINT16_MAX;
+#endif
+#ifdef UINT32_MAX
+uint32_t b3 = UINT32_MAX;
+#endif
+#ifdef UINT64_MAX
+uint64_t b4 = UINT64_MAX;
+#endif
+int_least8_t c1 = INT8_C (0x7f);
+int_least8_t c1max = INT_LEAST8_MAX;
+int_least8_t c1min = INT_LEAST8_MIN;
+int_least16_t c2 = INT16_C (0x7fff);
+int_least16_t c2max = INT_LEAST16_MAX;
+int_least16_t c2min = INT_LEAST16_MIN;
+int_least32_t c3 = INT32_C (0x7fffffff);
+int_least32_t c3max = INT_LEAST32_MAX;
+int_least32_t c3min = INT_LEAST32_MIN;
+int_least64_t c4 = INT64_C (0x7fffffffffffffff);
+int_least64_t c4max = INT_LEAST64_MAX;
+int_least64_t c4min = INT_LEAST64_MIN;
+uint_least8_t d1 = UINT8_C (0xff);
+uint_least8_t d1max = UINT_LEAST8_MAX;
+uint_least16_t d2 = UINT16_C (0xffff);
+uint_least16_t d2max = UINT_LEAST16_MAX;
+uint_least32_t d3 = UINT32_C (0xffffffff);
+uint_least32_t d3max = UINT_LEAST32_MAX;
+uint_least64_t d4 = UINT64_C (0xffffffffffffffff);
+uint_least64_t d4max = UINT_LEAST64_MAX;
+int_fast8_t e1 = INT_FAST8_MAX;
+int_fast8_t e1min = INT_FAST8_MIN;
+int_fast16_t e2 = INT_FAST16_MAX;
+int_fast16_t e2min = INT_FAST16_MIN;
+int_fast32_t e3 = INT_FAST32_MAX;
+int_fast32_t e3min = INT_FAST32_MIN;
+int_fast64_t e4 = INT_FAST64_MAX;
+int_fast64_t e4min = INT_FAST64_MIN;
+uint_fast8_t f1 = UINT_FAST8_MAX;
+uint_fast16_t f2 = UINT_FAST16_MAX;
+uint_fast32_t f3 = UINT_FAST32_MAX;
+uint_fast64_t f4 = UINT_FAST64_MAX;
+#ifdef INTPTR_MAX
+intptr_t g = INTPTR_MAX;
+intptr_t gmin = INTPTR_MIN;
+#endif
+#ifdef UINTPTR_MAX
+uintptr_t h = UINTPTR_MAX;
+#endif
+intmax_t i = INTMAX_MAX;
+uintmax_t j = UINTMAX_MAX;
+
+/* Check that SIZE_MAX has the correct type, if possible. */
+#if 201112 <= __STDC_VERSION__
+int k = _Generic (SIZE_MAX, size_t: 0);
+#elif (2 <= __GNUC__ || 4 <= __clang_major__ || defined __IBM__TYPEOF__ \
+ || (0x5110 <= __SUNPRO_C && !__STDC__))
+extern size_t k;
+extern __typeof__ (SIZE_MAX) k;
+#endif
+
+#include <limits.h> /* for CHAR_BIT */
+#define TYPE_MINIMUM(t) \
+ ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t)))
+#define TYPE_MAXIMUM(t) \
+ ((t) ((t) 0 < (t) -1 \
+ ? (t) -1 \
+ : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
+struct s {
+ int check_PTRDIFF:
+ PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t)
+ && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t)
+ ? 1 : -1;
+ /* Detect bug in FreeBSD 6.0/ia64 and FreeBSD 13.0/arm64. */
+ int check_SIG_ATOMIC:
+ SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t)
+ && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t)
+ ? 1 : -1;
+ int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1;
+ int check_WCHAR:
+ WCHAR_MIN == TYPE_MINIMUM (wchar_t)
+ && WCHAR_MAX == TYPE_MAXIMUM (wchar_t)
+ ? 1 : -1;
+ /* Detect bug in mingw. */
+ int check_WINT:
+ WINT_MIN == TYPE_MINIMUM (wint_t)
+ && WINT_MAX == TYPE_MAXIMUM (wint_t)
+ ? 1 : -1;
+
+ /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others. */
+ int check_UINT8_C:
+ (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1;
+ int check_UINT16_C:
+ (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1;
+
+ /* Detect bugs in OpenBSD 3.9 stdint.h. */
+#ifdef UINT8_MAX
+ int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1;
+#endif
+#ifdef UINT16_MAX
+ int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1;
+#endif
+#ifdef UINT32_MAX
+ int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1;
+#endif
+#ifdef UINT64_MAX
+ int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1;
+#endif
+ int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1;
+ int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1;
+ int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1;
+ int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1;
+ int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1;
+ int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1;
+ int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1;
+ int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1;
+ int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1;
+ int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1;
+ int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1;
+};
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on native Windows.
+ mingw*) gl_cv_header_working_stdint_h="guessing yes" ;;
+ # In general, assume it works.
+ *) gl_cv_header_working_stdint_h="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#define __STDC_CONSTANT_MACROS 1
+#define __STDC_LIMIT_MACROS 1
+#include <stdint.h>
+
+
+ #include <stddef.h>
+ #include <signal.h>
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+
+
+#include <stdio.h>
+#include <string.h>
+#define MVAL(macro) MVAL1(macro)
+#define MVAL1(expression) #expression
+static const char *macro_values[] =
+ {
+#ifdef INT8_MAX
+ MVAL (INT8_MAX),
+#endif
+#ifdef INT16_MAX
+ MVAL (INT16_MAX),
+#endif
+#ifdef INT32_MAX
+ MVAL (INT32_MAX),
+#endif
+#ifdef INT64_MAX
+ MVAL (INT64_MAX),
+#endif
+#ifdef UINT8_MAX
+ MVAL (UINT8_MAX),
+#endif
+#ifdef UINT16_MAX
+ MVAL (UINT16_MAX),
+#endif
+#ifdef UINT32_MAX
+ MVAL (UINT32_MAX),
+#endif
+#ifdef UINT64_MAX
+ MVAL (UINT64_MAX),
+#endif
+ NULL
+ };
+
+int
+main (void)
+{
+
+ const char **mv;
+ for (mv = macro_values; *mv != NULL; mv++)
+ {
+ const char *value = *mv;
+ /* Test whether it looks like a cast expression. */
+ if (strncmp (value, "((unsigned int)"/*)*/, 15) == 0
+ || strncmp (value, "((unsigned short)"/*)*/, 17) == 0
+ || strncmp (value, "((unsigned char)"/*)*/, 16) == 0
+ || strncmp (value, "((int)"/*)*/, 6) == 0
+ || strncmp (value, "((signed short)"/*)*/, 15) == 0
+ || strncmp (value, "((signed char)"/*)*/, 14) == 0)
+ return mv - macro_values + 1;
+ }
+ return 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_header_working_stdint_h=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_stdint_h" >&5
+printf "%s\n" "$gl_cv_header_working_stdint_h" >&6; }
+ fi
+
+ HAVE_C99_STDINT_H=0
+ HAVE_SYS_BITYPES_H=0
+ HAVE_SYS_INTTYPES_H=0
+ GL_GENERATE_STDINT_H=true
+ case "$gl_cv_header_working_stdint_h" in
+ *yes)
+ HAVE_C99_STDINT_H=1
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stdint.h works without ISO C predefines" >&5
+printf %s "checking whether stdint.h works without ISO C predefines... " >&6; }
+if test ${gl_cv_header_stdint_without_STDC_macros+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_cv_header_stdint_without_STDC_macros=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#include <stdint.h>
+
+
+ #include <stddef.h>
+ #include <signal.h>
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+
+
+intmax_t im = INTMAX_MAX;
+int32_t i32 = INT32_C (0x7fffffff);
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_stdint_without_STDC_macros=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_without_STDC_macros" >&5
+printf "%s\n" "$gl_cv_header_stdint_without_STDC_macros" >&6; }
+
+ if test $gl_cv_header_stdint_without_STDC_macros = no; then
+
+printf "%s\n" "#define __STDC_CONSTANT_MACROS 1" >>confdefs.h
+
+
+printf "%s\n" "#define __STDC_LIMIT_MACROS 1" >>confdefs.h
+
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stdint.h has UINTMAX_WIDTH etc." >&5
+printf %s "checking whether stdint.h has UINTMAX_WIDTH etc.... " >&6; }
+if test ${gl_cv_header_stdint_width+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_cv_header_stdint_width=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ /* Work if build is not clean. */
+ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1
+ #ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+ #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
+ #endif
+ #include <stdint.h>
+
+ #include <stddef.h>
+ #include <signal.h>
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+
+ int iw = UINTMAX_WIDTH;
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_stdint_width=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_width" >&5
+printf "%s\n" "$gl_cv_header_stdint_width" >&6; }
+ if test "$gl_cv_header_stdint_width" = yes; then
+ GL_GENERATE_STDINT_H=false
+ fi
+ ;;
+ *)
+ ac_fn_c_check_header_compile "$LINENO" "sys/inttypes.h" "ac_cv_header_sys_inttypes_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_inttypes_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_INTTYPES_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "sys/bitypes.h" "ac_cv_header_sys_bitypes_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_bitypes_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_BITYPES_H 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_header_sys_inttypes_h = yes; then
+ HAVE_SYS_INTTYPES_H=1
+ fi
+ if test $ac_cv_header_sys_bitypes_h = yes; then
+ HAVE_SYS_BITYPES_H=1
+ fi
+
+
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+
+
+ for gltype in ptrdiff_t size_t ; do
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5
+printf %s "checking for bit size of $gltype... " >&6; }
+if eval test \${gl_cv_bitsizeof_${gltype}+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result" "
+ #include <stddef.h>
+ #include <signal.h>
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+
+#include <limits.h>"
+then :
+
+else $as_nop
+ result=unknown
+fi
+
+ eval gl_cv_bitsizeof_${gltype}=\$result
+
+fi
+eval ac_res=\$gl_cv_bitsizeof_${gltype}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval result=\$gl_cv_bitsizeof_${gltype}
+ if test $result = unknown; then
+ result=0
+ fi
+ GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ printf "%s\n" "#define BITSIZEOF_${GLTYPE} $result" >>confdefs.h
+
+ eval BITSIZEOF_${GLTYPE}=\$result
+ done
+
+
+ fi
+
+
+ for gltype in sig_atomic_t wchar_t wint_t ; do
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5
+printf %s "checking for bit size of $gltype... " >&6; }
+if eval test \${gl_cv_bitsizeof_${gltype}+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result" "
+ #include <stddef.h>
+ #include <signal.h>
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+
+#include <limits.h>"
+then :
+
+else $as_nop
+ result=unknown
+fi
+
+ eval gl_cv_bitsizeof_${gltype}=\$result
+
+fi
+eval ac_res=\$gl_cv_bitsizeof_${gltype}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval result=\$gl_cv_bitsizeof_${gltype}
+ if test $result = unknown; then
+ result=0
+ fi
+ GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ printf "%s\n" "#define BITSIZEOF_${GLTYPE} $result" >>confdefs.h
+
+ eval BITSIZEOF_${GLTYPE}=\$result
+ done
+
+
+
+
+ for gltype in sig_atomic_t wchar_t wint_t ; do
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $gltype is signed" >&5
+printf %s "checking whether $gltype is signed... " >&6; }
+if eval test \${gl_cv_type_${gltype}_signed+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <stddef.h>
+ #include <signal.h>
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+
+ int verify[2 * (($gltype) -1 < ($gltype) 0) - 1];
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ result=yes
+else $as_nop
+ result=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ eval gl_cv_type_${gltype}_signed=\$result
+
+fi
+eval ac_res=\$gl_cv_type_${gltype}_signed
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval result=\$gl_cv_type_${gltype}_signed
+ GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ if test "$result" = yes; then
+ printf "%s\n" "#define HAVE_SIGNED_${GLTYPE} 1" >>confdefs.h
+
+ eval HAVE_SIGNED_${GLTYPE}=1
+ else
+ eval HAVE_SIGNED_${GLTYPE}=0
+ fi
+ done
+
+
+ gl_cv_type_ptrdiff_t_signed=yes
+ gl_cv_type_size_t_signed=no
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+
+
+ for gltype in ptrdiff_t size_t ; do
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5
+printf %s "checking for $gltype integer literal suffix... " >&6; }
+if eval test \${gl_cv_type_${gltype}_suffix+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ eval gl_cv_type_${gltype}_suffix=no
+ eval result=\$gl_cv_type_${gltype}_signed
+ if test "$result" = yes; then
+ glsufu=
+ else
+ glsufu=u
+ fi
+ for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do
+ case $glsuf in
+ '') gltype1='int';;
+ l) gltype1='long int';;
+ ll) gltype1='long long int';;
+ i64) gltype1='__int64';;
+ u) gltype1='unsigned int';;
+ ul) gltype1='unsigned long int';;
+ ull) gltype1='unsigned long long int';;
+ ui64)gltype1='unsigned __int64';;
+ esac
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <stddef.h>
+ #include <signal.h>
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+
+ extern $gltype foo;
+ extern $gltype1 foo;
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval gl_cv_type_${gltype}_suffix=\$glsuf
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ eval result=\$gl_cv_type_${gltype}_suffix
+ test "$result" != no && break
+ done
+fi
+eval ac_res=\$gl_cv_type_${gltype}_suffix
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ eval result=\$gl_cv_type_${gltype}_suffix
+ test "$result" = no && result=
+ eval ${GLTYPE}_SUFFIX=\$result
+ printf "%s\n" "#define ${GLTYPE}_SUFFIX $result" >>confdefs.h
+
+ done
+
+
+ fi
+
+
+ for gltype in sig_atomic_t wchar_t wint_t ; do
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5
+printf %s "checking for $gltype integer literal suffix... " >&6; }
+if eval test \${gl_cv_type_${gltype}_suffix+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ eval gl_cv_type_${gltype}_suffix=no
+ eval result=\$gl_cv_type_${gltype}_signed
+ if test "$result" = yes; then
+ glsufu=
+ else
+ glsufu=u
+ fi
+ for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do
+ case $glsuf in
+ '') gltype1='int';;
+ l) gltype1='long int';;
+ ll) gltype1='long long int';;
+ i64) gltype1='__int64';;
+ u) gltype1='unsigned int';;
+ ul) gltype1='unsigned long int';;
+ ull) gltype1='unsigned long long int';;
+ ui64)gltype1='unsigned __int64';;
+ esac
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <stddef.h>
+ #include <signal.h>
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+
+ extern $gltype foo;
+ extern $gltype1 foo;
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval gl_cv_type_${gltype}_suffix=\$glsuf
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ eval result=\$gl_cv_type_${gltype}_suffix
+ test "$result" != no && break
+ done
+fi
+eval ac_res=\$gl_cv_type_${gltype}_suffix
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ eval result=\$gl_cv_type_${gltype}_suffix
+ test "$result" = no && result=
+ eval ${GLTYPE}_SUFFIX=\$result
+ printf "%s\n" "#define ${GLTYPE}_SUFFIX $result" >>confdefs.h
+
+ done
+
+
+
+ if test $GNULIBHEADERS_OVERRIDE_WINT_T = 1; then
+ BITSIZEOF_WINT_T=32
+ fi
+
+ ;;
+ esac
+
+
+
+ GL_GENERATE_LIMITS_H=true
+
+
+
+
+
+
+
+ HAVE_DECL_IMAXABS=1;
+ HAVE_DECL_IMAXDIV=1;
+ HAVE_DECL_STRTOIMAX=1;
+ HAVE_DECL_STRTOUMAX=1;
+ HAVE_IMAXDIV_T=1;
+ HAVE_IMAXABS=1;
+ HAVE_IMAXDIV=1;
+ REPLACE_IMAXABS=0;
+ REPLACE_IMAXDIV=0;
+ REPLACE_STRTOIMAX=0;
+ REPLACE_STRTOUMAX=0;
+ INT32_MAX_LT_INTMAX_MAX=1;
+ INT64_MAX_EQ_LONG_MAX='defined _LP64';
+ PRIPTR_PREFIX=__PRIPTR_PREFIX;
+ UINT32_MAX_LT_UINTMAX_MAX=1;
+ UINT64_MAX_EQ_ULONG_MAX='defined _LP64';
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5
+printf %s "checking for C/C++ restrict keyword... " >&6; }
+if test ${ac_cv_c_restrict+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_c_restrict=no
+ # Put '__restrict__' first, to avoid problems with glibc and non-GCC; see:
+ # https://lists.gnu.org/archive/html/bug-autoconf/2016-02/msg00006.html
+ # Put 'restrict' last, because C++ lacks it.
+ for ac_kw in __restrict__ __restrict _Restrict restrict; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+typedef int *int_ptr;
+ int foo (int_ptr $ac_kw ip) { return ip[0]; }
+ int bar (int [$ac_kw]); /* Catch GCC bug 14050. */
+ int bar (int ip[$ac_kw]) { return ip[0]; }
+
+int
+main (void)
+{
+int s[1];
+ int *$ac_kw t = s;
+ t[0] = 0;
+ return foo (t) + bar (t);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_restrict=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ test "$ac_cv_c_restrict" != no && break
+ done
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5
+printf "%s\n" "$ac_cv_c_restrict" >&6; }
+
+ case $ac_cv_c_restrict in
+ restrict) ;;
+ no) printf "%s\n" "#define restrict /**/" >>confdefs.h
+ ;;
+ *) printf "%s\n" "#define restrict $ac_cv_c_restrict" >>confdefs.h
+ ;;
+ esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_inttypes_h='<'inttypes.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <inttypes.h>" >&5
+printf %s "checking absolute name of <inttypes.h>... " >&6; }
+if test ${gl_cv_next_inttypes_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_inttypes_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <inttypes.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'inttypes.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_inttypes_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_inttypes_h
+ gl_cv_next_inttypes_h='"'$gl_header'"'
+ else
+ gl_cv_next_inttypes_h='<'inttypes.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_inttypes_h" >&5
+printf "%s\n" "$gl_cv_next_inttypes_h" >&6; }
+ fi
+ NEXT_INTTYPES_H=$gl_cv_next_inttypes_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'inttypes.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_inttypes_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_IMAXABS=0
+
+
+
+ GL_GNULIB_IMAXDIV=0
+
+
+
+ GL_GNULIB_STRTOIMAX=0
+
+
+
+ GL_GNULIB_STRTOUMAX=0
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'float'" >&5
+printf %s "checking where to find the exponent in a 'float'... " >&6; }
+if test ${gl_cv_cc_float_expbit0+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ gl_cv_cc_float_expbit0="word 0 bit 23"
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <float.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#define NWORDS \
+ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { float value; unsigned int word[NWORDS]; } memory_float;
+static unsigned int ored_words[NWORDS];
+static unsigned int anded_words[NWORDS];
+static void add_to_ored_words (float x)
+{
+ memory_float m;
+ size_t i;
+ /* Clear it first, in case
+ sizeof (float) < sizeof (memory_float). */
+ memset (&m, 0, sizeof (memory_float));
+ m.value = x;
+ for (i = 0; i < NWORDS; i++)
+ {
+ ored_words[i] |= m.word[i];
+ anded_words[i] &= m.word[i];
+ }
+}
+int main ()
+{
+ size_t j;
+ FILE *fp = fopen ("conftest.out", "w");
+ if (fp == NULL)
+ return 1;
+ for (j = 0; j < NWORDS; j++)
+ anded_words[j] = ~ (unsigned int) 0;
+ add_to_ored_words (0.25f);
+ add_to_ored_words (0.5f);
+ add_to_ored_words (1.0f);
+ add_to_ored_words (2.0f);
+ add_to_ored_words (4.0f);
+ /* Remove bits that are common (e.g. if representation of the first mantissa
+ bit is explicit). */
+ for (j = 0; j < NWORDS; j++)
+ ored_words[j] &= ~anded_words[j];
+ /* Now find the nonzero word. */
+ for (j = 0; j < NWORDS; j++)
+ if (ored_words[j] != 0)
+ break;
+ if (j < NWORDS)
+ {
+ size_t i;
+ for (i = j + 1; i < NWORDS; i++)
+ if (ored_words[i] != 0)
+ {
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+ }
+ for (i = 0; ; i++)
+ if ((ored_words[j] >> i) & 1)
+ {
+ fprintf (fp, "word %d bit %d", (int) j, (int) i);
+ return (fclose (fp) != 0);
+ }
+ }
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_cc_float_expbit0=`cat conftest.out`
+else $as_nop
+ gl_cv_cc_float_expbit0="unknown"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.out
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_expbit0" >&5
+printf "%s\n" "$gl_cv_cc_float_expbit0" >&6; }
+ case "$gl_cv_cc_float_expbit0" in
+ word*bit*)
+ word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
+ bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'`
+
+printf "%s\n" "#define FLT_EXPBIT0_WORD $word" >>confdefs.h
+
+
+printf "%s\n" "#define FLT_EXPBIT0_BIT $bit" >>confdefs.h
+
+ ;;
+ esac
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5
+printf %s "checking for nl_langinfo and CODESET... " >&6; }
+if test ${am_cv_langinfo_codeset+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <langinfo.h>
+int
+main (void)
+{
+char* cs = nl_langinfo(CODESET); return !cs;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ am_cv_langinfo_codeset=yes
+else $as_nop
+ am_cv_langinfo_codeset=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5
+printf "%s\n" "$am_cv_langinfo_codeset" >&6; }
+ if test $am_cv_langinfo_codeset = yes; then
+
+printf "%s\n" "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h
+
+ fi
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working fcntl.h" >&5
+printf %s "checking for working fcntl.h... " >&6; }
+if test ${gl_cv_header_working_fcntl_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ gl_cv_header_working_fcntl_h=cross-compiling
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/stat.h>
+ #if HAVE_UNISTD_H
+ # include <unistd.h>
+ #else /* on Windows with MSVC */
+ # include <io.h>
+ # include <stdlib.h>
+ # defined sleep(n) _sleep ((n) * 1000)
+ #endif
+ #include <fcntl.h>
+ #ifndef O_NOATIME
+ #define O_NOATIME 0
+ #endif
+ #ifndef O_NOFOLLOW
+ #define O_NOFOLLOW 0
+ #endif
+ static int const constants[] =
+ {
+ O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND,
+ O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY
+ };
+
+int
+main (void)
+{
+
+ int result = !constants;
+ #if HAVE_SYMLINK
+ {
+ static char const sym[] = "conftest.sym";
+ if (symlink ("/dev/null", sym) != 0)
+ result |= 2;
+ else
+ {
+ int fd = open (sym, O_WRONLY | O_NOFOLLOW | O_CREAT, 0);
+ if (fd >= 0)
+ {
+ close (fd);
+ result |= 4;
+ }
+ }
+ if (unlink (sym) != 0 || symlink (".", sym) != 0)
+ result |= 2;
+ else
+ {
+ int fd = open (sym, O_RDONLY | O_NOFOLLOW);
+ if (fd >= 0)
+ {
+ close (fd);
+ result |= 4;
+ }
+ }
+ unlink (sym);
+ }
+ #endif
+ {
+ static char const file[] = "confdefs.h";
+ int fd = open (file, O_RDONLY | O_NOATIME);
+ if (fd < 0)
+ result |= 8;
+ else
+ {
+ struct stat st0;
+ if (fstat (fd, &st0) != 0)
+ result |= 16;
+ else
+ {
+ char c;
+ sleep (1);
+ if (read (fd, &c, 1) != 1)
+ result |= 24;
+ else
+ {
+ if (close (fd) != 0)
+ result |= 32;
+ else
+ {
+ struct stat st1;
+ if (stat (file, &st1) != 0)
+ result |= 40;
+ else
+ if (st0.st_atime != st1.st_atime)
+ result |= 64;
+ }
+ }
+ }
+ }
+ }
+ return result;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_header_working_fcntl_h=yes
+else $as_nop
+ case $? in #(
+ 4) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #(
+ 64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #(
+ 68) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #(
+ *) gl_cv_header_working_fcntl_h='no';;
+ esac
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_fcntl_h" >&5
+printf "%s\n" "$gl_cv_header_working_fcntl_h" >&6; }
+
+ case $gl_cv_header_working_fcntl_h in #(
+ *O_NOATIME* | no | cross-compiling) ac_val=0;; #(
+ *) ac_val=1;;
+ esac
+
+printf "%s\n" "#define HAVE_WORKING_O_NOATIME $ac_val" >>confdefs.h
+
+
+ case $gl_cv_header_working_fcntl_h in #(
+ *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #(
+ *) ac_val=1;;
+ esac
+
+printf "%s\n" "#define HAVE_WORKING_O_NOFOLLOW $ac_val" >>confdefs.h
+
+
+ac_fn_check_decl "$LINENO" "getc_unlocked" "ac_cv_have_decl_getc_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_getc_unlocked" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_GETC_UNLOCKED $ac_have_decl" >>confdefs.h
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C Library >= 2.1 or uClibc" >&5
+printf %s "checking whether we are using the GNU C Library >= 2.1 or uClibc... " >&6; }
+if test ${ac_cv_gnu_library_2_1+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+ Lucky GNU user
+ #endif
+#endif
+#ifdef __UCLIBC__
+ Lucky user
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Lucky" >/dev/null 2>&1
+then :
+ ac_cv_gnu_library_2_1=yes
+else $as_nop
+ ac_cv_gnu_library_2_1=no
+fi
+rm -rf conftest*
+
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gnu_library_2_1" >&5
+printf "%s\n" "$ac_cv_gnu_library_2_1" >&6; }
+
+ GLIBC21="$ac_cv_gnu_library_2_1"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_math_h='<'math.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <math.h>" >&5
+printf %s "checking absolute name of <math.h>... " >&6; }
+if test ${gl_cv_next_math_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_math_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <math.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'math.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_math_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_math_h
+ gl_cv_next_math_h='"'$gl_header'"'
+ else
+ gl_cv_next_math_h='<'math.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_math_h" >&5
+printf "%s\n" "$gl_cv_next_math_h" >&6; }
+ fi
+ NEXT_MATH_H=$gl_cv_next_math_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'math.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_math_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_MATH_H=$gl_next_as_first_directive
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether NAN macro works" >&5
+printf %s "checking whether NAN macro works... " >&6; }
+if test ${gl_cv_header_math_nan_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <math.h>
+int
+main (void)
+{
+/* Solaris 10 has a broken definition of NAN. Other platforms
+ fail to provide NAN, or provide it only in C99 mode; this
+ test only needs to fail when NAN is provided but wrong. */
+ float f = 1.0f;
+#ifdef NAN
+ f = NAN;
+#endif
+ return f == 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_math_nan_works=yes
+else $as_nop
+ gl_cv_header_math_nan_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_math_nan_works" >&5
+printf "%s\n" "$gl_cv_header_math_nan_works" >&6; }
+ if test $gl_cv_header_math_nan_works = no; then
+ REPLACE_NAN=1
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether HUGE_VAL works" >&5
+printf %s "checking whether HUGE_VAL works... " >&6; }
+if test ${gl_cv_header_math_huge_val_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <math.h>
+int
+main (void)
+{
+/* Solaris 10 has a broken definition of HUGE_VAL. */
+ double d = HUGE_VAL;
+ return d == 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_math_huge_val_works=yes
+else $as_nop
+ gl_cv_header_math_huge_val_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_math_huge_val_works" >&5
+printf "%s\n" "$gl_cv_header_math_huge_val_works" >&6; }
+ if test $gl_cv_header_math_huge_val_works = no; then
+ REPLACE_HUGE_VAL=1
+ fi
+
+
+
+
+
+
+
+
+ # Check for mmap(). Don't use AC_FUNC_MMAP, because it checks too much: it
+ # fails on HP-UX 11, because MAP_FIXED mappings do not work. But this is
+ # irrelevant for anonymous mappings.
+ ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap"
+if test "x$ac_cv_func_mmap" = xyes
+then :
+ gl_have_mmap=yes
+else $as_nop
+ gl_have_mmap=no
+fi
+
+
+ # Try to allow MAP_ANONYMOUS.
+ gl_have_mmap_anonymous=no
+ if test $gl_have_mmap = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for MAP_ANONYMOUS" >&5
+printf %s "checking for MAP_ANONYMOUS... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/mman.h>
+#ifdef MAP_ANONYMOUS
+ I cannot identify this map
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "I cannot identify this map" >/dev/null 2>&1
+then :
+ gl_have_mmap_anonymous=yes
+fi
+rm -rf conftest*
+
+ if test $gl_have_mmap_anonymous != yes; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/mman.h>
+#ifdef MAP_ANON
+ I cannot identify this map
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "I cannot identify this map" >/dev/null 2>&1
+then :
+
+printf "%s\n" "#define MAP_ANONYMOUS MAP_ANON" >>confdefs.h
+
+ gl_have_mmap_anonymous=yes
+fi
+rm -rf conftest*
+
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_have_mmap_anonymous" >&5
+printf "%s\n" "$gl_have_mmap_anonymous" >&6; }
+ if test $gl_have_mmap_anonymous = yes; then
+
+printf "%s\n" "#define HAVE_MAP_ANONYMOUS 1" >>confdefs.h
+
+ fi
+ fi
+
+
+
+
+ HAVE_MBSLEN=0;
+ HAVE_EXPLICIT_BZERO=1;
+ HAVE_FFSL=1;
+ HAVE_FFSLL=1;
+ HAVE_DECL_MEMMEM=1;
+ HAVE_MEMPCPY=1;
+ HAVE_MEMSET_EXPLICIT=1;
+ HAVE_DECL_MEMRCHR=1;
+ HAVE_RAWMEMCHR=1;
+ HAVE_STPCPY=1;
+ HAVE_STPNCPY=1;
+ HAVE_STRCHRNUL=1;
+ HAVE_DECL_STRDUP=1;
+ HAVE_DECL_STRNDUP=1;
+ HAVE_DECL_STRNLEN=1;
+ HAVE_STRPBRK=1;
+ HAVE_STRSEP=1;
+ HAVE_STRCASESTR=1;
+ HAVE_DECL_STRTOK_R=1;
+ HAVE_DECL_STRERROR_R=1;
+ HAVE_STRERRORNAME_NP=1;
+ HAVE_SIGABBREV_NP=1;
+ HAVE_SIGDESCR_NP=1;
+ HAVE_DECL_STRSIGNAL=1;
+ HAVE_STRVERSCMP=1;
+ REPLACE_FFSLL=0;
+ REPLACE_MEMCHR=0;
+ REPLACE_MEMMEM=0;
+ REPLACE_MEMPCPY=0;
+ REPLACE_STPCPY=0;
+ REPLACE_STPNCPY=0;
+ REPLACE_STRCHRNUL=0;
+ REPLACE_STRDUP=0;
+ REPLACE_STRNCAT=0;
+ REPLACE_STRNDUP=0;
+ REPLACE_STRNLEN=0;
+ REPLACE_STRSTR=0;
+ REPLACE_STRCASESTR=0;
+ REPLACE_STRTOK_R=0;
+ REPLACE_STRERROR=0;
+ REPLACE_STRERROR_R=0;
+ REPLACE_STRERRORNAME_NP=0;
+ REPLACE_STRSIGNAL=0;
+ UNDEFINE_STRTOK_R=0;
+
+
+
+
+
+
+
+
+ # Detect platform-specific bugs in some versions of glibc:
+ # memchr should not dereference anything with length 0
+ # https://bugzilla.redhat.com/show_bug.cgi?id=499689
+ # memchr should not dereference overestimated length after a match
+ # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737
+ # https://sourceware.org/bugzilla/show_bug.cgi?id=10162
+ # memchr should cast the second argument to 'unsigned char'.
+ # This bug exists in Android 4.3.
+ # Assume that memchr works on platforms that lack mprotect.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether memchr works" >&5
+printf %s "checking whether memchr works... " >&6; }
+if test ${gl_cv_func_memchr_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_memchr_works="guessing no" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_memchr_works="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_memchr_works="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <string.h>
+#if HAVE_SYS_MMAN_H
+# include <fcntl.h>
+# include <unistd.h>
+# include <sys/types.h>
+# include <sys/mman.h>
+# ifndef MAP_FILE
+# define MAP_FILE 0
+# endif
+#endif
+
+int
+main (void)
+{
+
+ int result = 0;
+ char *fence = NULL;
+#if HAVE_SYS_MMAN_H && HAVE_MPROTECT
+# if HAVE_MAP_ANONYMOUS
+ const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
+ const int fd = -1;
+# else /* !HAVE_MAP_ANONYMOUS */
+ const int flags = MAP_FILE | MAP_PRIVATE;
+ int fd = open ("/dev/zero", O_RDONLY, 0666);
+ if (fd >= 0)
+# endif
+ {
+ int pagesize = getpagesize ();
+ char *two_pages =
+ (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE,
+ flags, fd, 0);
+ if (two_pages != (char *)(-1)
+ && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0)
+ fence = two_pages + pagesize;
+ }
+#endif
+ if (fence)
+ {
+ /* Test against bugs on glibc systems. */
+ if (memchr (fence, 0, 0))
+ result |= 1;
+ strcpy (fence - 9, "12345678");
+ if (memchr (fence - 9, 0, 79) != fence - 1)
+ result |= 2;
+ if (memchr (fence - 1, 0, 3) != fence - 1)
+ result |= 4;
+ /* Test against bug on AIX 7.2. */
+ if (memchr (fence - 4, '6', 16) != fence - 4)
+ result |= 8;
+ }
+ /* Test against bug on Android 4.3. */
+ {
+ char input[3];
+ input[0] = 'a';
+ input[1] = 'b';
+ input[2] = 'c';
+ if (memchr (input, 0x789abc00 | 'b', 3) != input + 1)
+ result |= 16;
+ }
+ return result;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_memchr_works=yes
+else $as_nop
+ gl_cv_func_memchr_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_memchr_works" >&5
+printf "%s\n" "$gl_cv_func_memchr_works" >&6; }
+ case "$gl_cv_func_memchr_works" in
+ *yes) ;;
+ *) REPLACE_MEMCHR=1 ;;
+ esac
+
+
+
+ GL_GNULIB_EXPLICIT_BZERO=0
+
+
+
+ GL_GNULIB_FFSL=0
+
+
+
+ GL_GNULIB_FFSLL=0
+
+
+
+ GL_GNULIB_MEMCHR=0
+
+
+
+ GL_GNULIB_MEMMEM=0
+
+
+
+ GL_GNULIB_MEMPCPY=0
+
+
+
+ GL_GNULIB_MEMRCHR=0
+
+
+
+ GL_GNULIB_MEMSET_EXPLICIT=0
+
+
+
+ GL_GNULIB_RAWMEMCHR=0
+
+
+
+ GL_GNULIB_STPCPY=0
+
+
+
+ GL_GNULIB_STPNCPY=0
+
+
+
+ GL_GNULIB_STRCHRNUL=0
+
+
+
+ GL_GNULIB_STRDUP=0
+
+
+
+ GL_GNULIB_STRNCAT=0
+
+
+
+ GL_GNULIB_STRNDUP=0
+
+
+
+ GL_GNULIB_STRNLEN=0
+
+
+
+ GL_GNULIB_STRPBRK=0
+
+
+
+ GL_GNULIB_STRSEP=0
+
+
+
+ GL_GNULIB_STRSTR=0
+
+
+
+ GL_GNULIB_STRCASESTR=0
+
+
+
+ GL_GNULIB_STRTOK_R=0
+
+
+
+ GL_GNULIB_MBSLEN=0
+
+
+
+ GL_GNULIB_MBSNLEN=0
+
+
+
+ GL_GNULIB_MBSCHR=0
+
+
+
+ GL_GNULIB_MBSRCHR=0
+
+
+
+ GL_GNULIB_MBSSTR=0
+
+
+
+ GL_GNULIB_MBSCASECMP=0
+
+
+
+ GL_GNULIB_MBSNCASECMP=0
+
+
+
+ GL_GNULIB_MBSPCASECMP=0
+
+
+
+ GL_GNULIB_MBSCASESTR=0
+
+
+
+ GL_GNULIB_MBSCSPN=0
+
+
+
+ GL_GNULIB_MBSPBRK=0
+
+
+
+ GL_GNULIB_MBSSPN=0
+
+
+
+ GL_GNULIB_MBSSEP=0
+
+
+
+ GL_GNULIB_MBSTOK_R=0
+
+
+
+ GL_GNULIB_STRERROR=0
+
+
+
+ GL_GNULIB_STRERROR_R=0
+
+
+
+ GL_GNULIB_STRERRORNAME_NP=0
+
+
+
+ GL_GNULIB_SIGABBREV_NP=0
+
+
+
+ GL_GNULIB_SIGDESCR_NP=0
+
+
+
+ GL_GNULIB_STRSIGNAL=0
+
+
+
+ GL_GNULIB_STRVERSCMP=0
+
+
+
+ GL_GNULIB_MDA_MEMCCPY=1
+
+
+
+ GL_GNULIB_MDA_STRDUP=1
+
+
+
+ac_fn_check_decl "$LINENO" "snprintf" "ac_cv_have_decl_snprintf" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_snprintf" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_SNPRINTF $ac_have_decl" >>confdefs.h
+
+ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default"
+if test "x$ac_cv_type__Bool" = xyes
+then :
+
+printf "%s\n" "#define HAVE__BOOL 1" >>confdefs.h
+
+
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99 or later" >&5
+printf %s "checking for stdbool.h that conforms to C99 or later... " >&6; }
+if test ${ac_cv_header_stdbool_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdbool.h>
+
+ /* "true" and "false" should be usable in #if expressions and
+ integer constant expressions, and "bool" should be a valid
+ type name.
+
+ Although C99 requires bool, true, and false to be macros,
+ C23 and C++11 overrule that, so do not test for that.
+ Although C99 requires __bool_true_false_are_defined and
+ _Bool, C23 says they are obsolescent, so do not require
+ them. */
+
+ #if !true
+ #error "'true' is not true"
+ #endif
+ #if true != 1
+ #error "'true' is not equal to 1"
+ #endif
+ char b[true == 1 ? 1 : -1];
+ char c[true];
+
+ #if false
+ #error "'false' is not false"
+ #endif
+ #if false != 0
+ #error "'false' is not equal to 0"
+ #endif
+ char d[false == 0 ? 1 : -1];
+
+ enum { e = false, f = true, g = false * true, h = true * 256 };
+
+ char i[(bool) 0.5 == true ? 1 : -1];
+ char j[(bool) 0.0 == false ? 1 : -1];
+ char k[sizeof (bool) > 0 ? 1 : -1];
+
+ struct sb { bool s: 1; bool t; } s;
+ char l[sizeof s.t > 0 ? 1 : -1];
+
+ /* The following fails for
+ HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */
+ bool m[h];
+ char n[sizeof m == h * sizeof m[0] ? 1 : -1];
+ char o[-1 - (bool) 0 < 0 ? 1 : -1];
+ /* Catch a bug in an HP-UX C compiler. See
+ https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+ https://lists.gnu.org/r/bug-coreutils/2005-11/msg00161.html
+ */
+ bool p = true;
+ bool *pp = &p;
+
+int
+main (void)
+{
+
+ bool ps = &s;
+ *pp |= p;
+ *pp |= ! p;
+
+ /* Refer to every declared value, so they cannot be
+ discarded as unused. */
+ return (!b + !c + !d + !e + !f + !g + !h + !i + !j + !k
+ + !l + !m + !n + !o + !p + !pp + !ps);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_header_stdbool_h=yes
+else $as_nop
+ ac_cv_header_stdbool_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5
+printf "%s\n" "$ac_cv_header_stdbool_h" >&6; }
+
+
+ REPLACE_NULL=0;
+ HAVE_MAX_ALIGN_T=1;
+ HAVE_WCHAR_T=1;
+
+
+
+
+
+
+
+ GL_GENERATE_STDDEF_H=false
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for good max_align_t" >&5
+printf %s "checking for good max_align_t... " >&6; }
+if test ${gl_cv_type_max_align_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* On FreeBSD 12.0/x86, max_align_t defined by <stddef.h> has
+ the correct alignment with the default (wrong) definition of
+ _Alignof, but a wrong alignment as soon as we activate an
+ ISO C compliant _Alignof definition. */
+ #if ((defined __GNUC__ && 4 <= __GNUC__) || defined __clang__) && !defined __cplusplus
+ #define _Alignof(type) __builtin_offsetof (struct { char __a; type __b; }, __b)
+ #endif
+ #include <stddef.h>
+ unsigned int s = sizeof (max_align_t);
+ #if defined __GNUC__ || defined __clang__ || defined __IBM__ALIGNOF__
+ int check1[2 * (__alignof__ (double) <= __alignof__ (max_align_t)) - 1];
+ int check2[2 * (__alignof__ (long double) <= __alignof__ (max_align_t)) - 1];
+ #endif
+ typedef struct { char a; max_align_t b; } max_helper;
+ typedef struct { char a; long b; } long_helper;
+ typedef struct { char a; double b; } double_helper;
+ typedef struct { char a; long double b; } long_double_helper;
+ int check3[2 * (offsetof (long_helper, b) <= offsetof (max_helper, b)) - 1];
+ int check4[2 * (offsetof (double_helper, b) <= offsetof (max_helper, b)) - 1];
+ int check5[2 * (offsetof (long_double_helper, b) <= offsetof (max_helper, b)) - 1];
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_type_max_align_t=yes
+else $as_nop
+ gl_cv_type_max_align_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_max_align_t" >&5
+printf "%s\n" "$gl_cv_type_max_align_t" >&6; }
+ if test $gl_cv_type_max_align_t = no; then
+ HAVE_MAX_ALIGN_T=0
+ GL_GENERATE_STDDEF_H=true
+ fi
+
+ if test $gt_cv_c_wchar_t = no; then
+ HAVE_WCHAR_T=0
+ GL_GENERATE_STDDEF_H=true
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether NULL can be used in arbitrary expressions" >&5
+printf %s "checking whether NULL can be used in arbitrary expressions... " >&6; }
+if test ${gl_cv_decl_null_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stddef.h>
+ int test[2 * (sizeof NULL == sizeof (void *)) -1];
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_decl_null_works=yes
+else $as_nop
+ gl_cv_decl_null_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_null_works" >&5
+printf "%s\n" "$gl_cv_decl_null_works" >&6; }
+ if test $gl_cv_decl_null_works = no; then
+ REPLACE_NULL=1
+ GL_GENERATE_STDDEF_H=true
+ fi
+
+ if $GL_GENERATE_STDDEF_H; then
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_stddef_h='<'stddef.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <stddef.h>" >&5
+printf %s "checking absolute name of <stddef.h>... " >&6; }
+if test ${gl_cv_next_stddef_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stddef.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'stddef.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_stddef_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_stddef_h
+ gl_cv_next_stddef_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stddef_h" >&5
+printf "%s\n" "$gl_cv_next_stddef_h" >&6; }
+ fi
+ NEXT_STDDEF_H=$gl_cv_next_stddef_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'stddef.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_stddef_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H=$gl_next_as_first_directive
+
+
+
+
+ fi
+
+
+
+ac_fn_check_decl "$LINENO" "fcloseall" "ac_cv_have_decl_fcloseall" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_fcloseall" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_FCLOSEALL $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "getw" "ac_cv_have_decl_getw" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_getw" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_GETW $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "putw" "ac_cv_have_decl_putw" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_putw" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_PUTW $ac_have_decl" >>confdefs.h
+
+
+
+
+ printf "%s\n" "#define __USE_MINGW_ANSI_STDIO 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_stdio_h='<'stdio.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <stdio.h>" >&5
+printf %s "checking absolute name of <stdio.h>... " >&6; }
+if test ${gl_cv_next_stdio_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'stdio.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_stdio_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_stdio_h
+ gl_cv_next_stdio_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdio_h" >&5
+printf "%s\n" "$gl_cv_next_stdio_h" >&6; }
+ fi
+ NEXT_STDIO_H=$gl_cv_next_stdio_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'stdio.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_stdio_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_STDIO_H=$gl_next_as_first_directive
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which flavor of printf attribute matches inttypes macros" >&5
+printf %s "checking which flavor of printf attribute matches inttypes macros... " >&6; }
+if test ${gl_cv_func_printf_attribute_flavor+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #define __STDC_FORMAT_MACROS 1
+ #include <stdio.h>
+ #include <inttypes.h>
+ /* For non-mingw systems, compilation will trivially succeed.
+ For mingw, compilation will succeed for older mingw (system
+ printf, "I64d") and fail for newer mingw (gnu printf, "lld"). */
+ #if (defined _WIN32 && ! defined __CYGWIN__) && \
+ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+ extern char PRIdMAX_probe[sizeof PRIdMAX == sizeof "I64d" ? 1 : -1];
+ #endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_func_printf_attribute_flavor=system
+else $as_nop
+ gl_cv_func_printf_attribute_flavor=gnu
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_attribute_flavor" >&5
+printf "%s\n" "$gl_cv_func_printf_attribute_flavor" >&6; }
+ if test "$gl_cv_func_printf_attribute_flavor" = gnu; then
+
+printf "%s\n" "#define GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU 1" >>confdefs.h
+
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_have_decl_fcloseall = no; then
+ HAVE_DECL_FCLOSEALL=0
+ fi
+
+
+ if test $ac_cv_have_decl_getw = no; then
+ HAVE_DECL_GETW=0
+ fi
+
+
+ if test $ac_cv_have_decl_putw = no; then
+ HAVE_DECL_PUTW=0
+ fi
+
+ac_fn_check_decl "$LINENO" "ecvt" "ac_cv_have_decl_ecvt" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_ecvt" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_ECVT $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "fcvt" "ac_cv_have_decl_fcvt" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_fcvt" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_FCVT $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "gcvt" "ac_cv_have_decl_gcvt" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_gcvt" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_GCVT $ac_have_decl" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_stdlib_h='<'stdlib.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <stdlib.h>" >&5
+printf %s "checking absolute name of <stdlib.h>... " >&6; }
+if test ${gl_cv_next_stdlib_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'stdlib.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_stdlib_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_stdlib_h
+ gl_cv_next_stdlib_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdlib_h" >&5
+printf "%s\n" "$gl_cv_next_stdlib_h" >&6; }
+ fi
+ NEXT_STDLIB_H=$gl_cv_next_stdlib_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'stdlib.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_stdlib_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_have_decl_ecvt = no; then
+ HAVE_DECL_ECVT=0
+ fi
+
+ if test $ac_cv_have_decl_fcvt = no; then
+ HAVE_DECL_FCVT=0
+ fi
+
+ if test $ac_cv_have_decl_gcvt = no; then
+ HAVE_DECL_GCVT=0
+ fi
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_string_h='<'string.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <string.h>" >&5
+printf %s "checking absolute name of <string.h>... " >&6; }
+if test ${gl_cv_next_string_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'string.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_string_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_string_h
+ gl_cv_next_string_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_string_h" >&5
+printf "%s\n" "$gl_cv_next_string_h" >&6; }
+ fi
+ NEXT_STRING_H=$gl_cv_next_string_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'string.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_string_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_STRING_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default
+"
+if test "x$ac_cv_type_pid_t" = xyes
+then :
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #if defined _WIN64 && !defined __CYGWIN__
+ LLP64
+ #endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_pid_type='int'
+else $as_nop
+ ac_pid_type='__int64'
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+printf "%s\n" "#define pid_t $ac_pid_type" >>confdefs.h
+
+
+fi
+
+
+ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default"
+if test "x$ac_cv_type_mode_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define mode_t int" >>confdefs.h
+
+fi
+
+
+
+ WINDOWS_64_BIT_OFF_T=0
+
+
+
+
+
+
+
+printf "%s\n" "#define _USE_STD_STAT 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_sys_types_h='<'sys/types.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/types.h>" >&5
+printf %s "checking absolute name of <sys/types.h>... " >&6; }
+if test ${gl_cv_next_sys_types_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'sys/types.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_sys_types_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_sys_types_h
+ gl_cv_next_sys_types_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_types_h" >&5
+printf "%s\n" "$gl_cv_next_sys_types_h" >&6; }
+ fi
+ NEXT_SYS_TYPES_H=$gl_cv_next_sys_types_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'sys/types.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_sys_types_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+ WINDOWS_STAT_INODES=0
+
+
+
+
+
+
+ HAVE_CHOWN=1;
+ HAVE_COPY_FILE_RANGE=1;
+ HAVE_DUP3=1;
+ HAVE_EUIDACCESS=1;
+ HAVE_EXECVPE=1;
+ HAVE_FACCESSAT=1;
+ HAVE_FCHDIR=1;
+ HAVE_FCHOWNAT=1;
+ HAVE_FDATASYNC=1;
+ HAVE_FSYNC=1;
+ HAVE_FTRUNCATE=1;
+ HAVE_GETDTABLESIZE=1;
+ HAVE_GETENTROPY=1;
+ HAVE_GETGROUPS=1;
+ HAVE_GETHOSTNAME=1;
+ HAVE_GETLOGIN=1;
+ HAVE_GETPAGESIZE=1;
+ HAVE_GETPASS=1;
+ HAVE_GROUP_MEMBER=1;
+ HAVE_LCHOWN=1;
+ HAVE_LINK=1;
+ HAVE_LINKAT=1;
+ HAVE_PIPE=1;
+ HAVE_PIPE2=1;
+ HAVE_PREAD=1;
+ HAVE_PWRITE=1;
+ HAVE_READLINK=1;
+ HAVE_READLINKAT=1;
+ HAVE_SETHOSTNAME=1;
+ HAVE_SLEEP=1;
+ HAVE_SYMLINK=1;
+ HAVE_SYMLINKAT=1;
+ HAVE_UNLINKAT=1;
+ HAVE_USLEEP=1;
+ HAVE_DECL_ENVIRON=1;
+ HAVE_DECL_EXECVPE=1;
+ HAVE_DECL_FCHDIR=1;
+ HAVE_DECL_FDATASYNC=1;
+ HAVE_DECL_GETDOMAINNAME=1;
+ HAVE_DECL_GETLOGIN=1;
+ HAVE_DECL_GETLOGIN_R=1;
+ HAVE_DECL_GETPAGESIZE=1;
+ HAVE_DECL_GETUSERSHELL=1;
+ HAVE_DECL_SETHOSTNAME=1;
+ HAVE_DECL_TRUNCATE=1;
+ HAVE_DECL_TTYNAME_R=1;
+ HAVE_OS_H=0;
+ HAVE_SYS_PARAM_H=0;
+ REPLACE_ACCESS=0;
+ REPLACE_CHOWN=0;
+ REPLACE_CLOSE=0;
+ REPLACE_COPY_FILE_RANGE=0;
+ REPLACE_DUP=0;
+ REPLACE_DUP2=0;
+ REPLACE_DUP3=0;
+ REPLACE_EXECL=0;
+ REPLACE_EXECLE=0;
+ REPLACE_EXECLP=0;
+ REPLACE_EXECV=0;
+ REPLACE_EXECVE=0;
+ REPLACE_EXECVP=0;
+ REPLACE_EXECVPE=0;
+ REPLACE_FACCESSAT=0;
+ REPLACE_FCHOWNAT=0;
+ REPLACE_FDATASYNC=0;
+ REPLACE_FTRUNCATE=0;
+ REPLACE_GETCWD=0;
+ REPLACE_GETDOMAINNAME=0;
+ REPLACE_GETDTABLESIZE=0;
+ REPLACE_GETENTROPY=0;
+ REPLACE_GETLOGIN_R=0;
+ REPLACE_GETGROUPS=0;
+ REPLACE_GETPAGESIZE=0;
+ REPLACE_GETPASS=0;
+ REPLACE_GETPASS_FOR_GETPASS_GNU=0;
+ REPLACE_ISATTY=0;
+ REPLACE_LCHOWN=0;
+ REPLACE_LINK=0;
+ REPLACE_LINKAT=0;
+ REPLACE_LSEEK=0;
+ REPLACE_PIPE2=0;
+ REPLACE_PREAD=0;
+ REPLACE_PWRITE=0;
+ REPLACE_READ=0;
+ REPLACE_READLINK=0;
+ REPLACE_READLINKAT=0;
+ REPLACE_RMDIR=0;
+ REPLACE_SETHOSTNAME=0;
+ REPLACE_SLEEP=0;
+ REPLACE_SYMLINK=0;
+ REPLACE_SYMLINKAT=0;
+ REPLACE_TRUNCATE=0;
+ REPLACE_TTYNAME_R=0;
+ REPLACE_UNLINK=0;
+ REPLACE_UNLINKAT=0;
+ REPLACE_USLEEP=0;
+ REPLACE_WRITE=0;
+ UNISTD_H_HAVE_SYS_RANDOM_H=0;
+ UNISTD_H_HAVE_WINSOCK2_H=0;
+ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0;
+
+
+ac_fn_check_decl "$LINENO" "execvpe" "ac_cv_have_decl_execvpe" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_execvpe" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_EXECVPE $ac_have_decl" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_unistd_h='<'unistd.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <unistd.h>" >&5
+printf %s "checking absolute name of <unistd.h>... " >&6; }
+if test ${gl_cv_next_unistd_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_unistd_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <unistd.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'unistd.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_unistd_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_unistd_h
+ gl_cv_next_unistd_h='"'$gl_header'"'
+ else
+ gl_cv_next_unistd_h='<'unistd.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_unistd_h" >&5
+printf "%s\n" "$gl_cv_next_unistd_h" >&6; }
+ fi
+ NEXT_UNISTD_H=$gl_cv_next_unistd_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'unistd.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_unistd_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H=$gl_next_as_first_directive
+
+
+
+
+ if test $ac_cv_header_unistd_h = yes; then
+ HAVE_UNISTD_H=1
+ else
+ HAVE_UNISTD_H=0
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_have_decl_execvpe = no; then
+ HAVE_DECL_EXECVPE=0
+ fi
+
+
+
+ GL_GNULIB_ACCESS=0
+
+
+
+ GL_GNULIB_CHDIR=0
+
+
+
+ GL_GNULIB_CHOWN=0
+
+
+
+ GL_GNULIB_CLOSE=0
+
+
+
+ GL_GNULIB_COPY_FILE_RANGE=0
+
+
+
+ GL_GNULIB_DUP=0
+
+
+
+ GL_GNULIB_DUP2=0
+
+
+
+ GL_GNULIB_DUP3=0
+
+
+
+ GL_GNULIB_ENVIRON=0
+
+
+
+ GL_GNULIB_EUIDACCESS=0
+
+
+
+ GL_GNULIB_EXECL=0
+
+
+
+ GL_GNULIB_EXECLE=0
+
+
+
+ GL_GNULIB_EXECLP=0
+
+
+
+ GL_GNULIB_EXECV=0
+
+
+
+ GL_GNULIB_EXECVE=0
+
+
+
+ GL_GNULIB_EXECVP=0
+
+
+
+ GL_GNULIB_EXECVPE=0
+
+
+
+ GL_GNULIB_FACCESSAT=0
+
+
+
+ GL_GNULIB_FCHDIR=0
+
+
+
+ GL_GNULIB_FCHOWNAT=0
+
+
+
+ GL_GNULIB_FDATASYNC=0
+
+
+
+ GL_GNULIB_FSYNC=0
+
+
+
+ GL_GNULIB_FTRUNCATE=0
+
+
+
+ GL_GNULIB_GETCWD=0
+
+
+
+ GL_GNULIB_GETDOMAINNAME=0
+
+
+
+ GL_GNULIB_GETDTABLESIZE=0
+
+
+
+ GL_GNULIB_GETENTROPY=0
+
+
+
+ GL_GNULIB_GETGROUPS=0
+
+
+
+ GL_GNULIB_GETHOSTNAME=0
+
+
+
+ GL_GNULIB_GETLOGIN=0
+
+
+
+ GL_GNULIB_GETLOGIN_R=0
+
+
+
+ GL_GNULIB_GETOPT_POSIX=0
+
+
+
+ GL_GNULIB_GETPAGESIZE=0
+
+
+
+ GL_GNULIB_GETPASS=0
+
+
+
+ GL_GNULIB_GETPASS_GNU=0
+
+
+
+ GL_GNULIB_GETUSERSHELL=0
+
+
+
+ GL_GNULIB_GROUP_MEMBER=0
+
+
+
+ GL_GNULIB_ISATTY=0
+
+
+
+ GL_GNULIB_LCHOWN=0
+
+
+
+ GL_GNULIB_LINK=0
+
+
+
+ GL_GNULIB_LINKAT=0
+
+
+
+ GL_GNULIB_LSEEK=0
+
+
+
+ GL_GNULIB_PIPE=0
+
+
+
+ GL_GNULIB_PIPE2=0
+
+
+
+ GL_GNULIB_PREAD=0
+
+
+
+ GL_GNULIB_PWRITE=0
+
+
+
+ GL_GNULIB_READ=0
+
+
+
+ GL_GNULIB_READLINK=0
+
+
+
+ GL_GNULIB_READLINKAT=0
+
+
+
+ GL_GNULIB_RMDIR=0
+
+
+
+ GL_GNULIB_SETHOSTNAME=0
+
+
+
+ GL_GNULIB_SLEEP=0
+
+
+
+ GL_GNULIB_SYMLINK=0
+
+
+
+ GL_GNULIB_SYMLINKAT=0
+
+
+
+ GL_GNULIB_TRUNCATE=0
+
+
+
+ GL_GNULIB_TTYNAME_R=0
+
+
+
+ GL_GNULIB_UNISTD_H_GETOPT=0
+
+
+
+ GL_GNULIB_UNISTD_H_NONBLOCKING=0
+
+
+
+ GL_GNULIB_UNISTD_H_SIGPIPE=0
+
+
+
+ GL_GNULIB_UNLINK=0
+
+
+
+ GL_GNULIB_UNLINKAT=0
+
+
+
+ GL_GNULIB_USLEEP=0
+
+
+
+ GL_GNULIB_WRITE=0
+
+
+
+ GL_GNULIB_MDA_ACCESS=1
+
+
+
+ GL_GNULIB_MDA_CHDIR=1
+
+
+
+ GL_GNULIB_MDA_CLOSE=1
+
+
+
+ GL_GNULIB_MDA_DUP=1
+
+
+
+ GL_GNULIB_MDA_DUP2=1
+
+
+
+ GL_GNULIB_MDA_EXECL=1
+
+
+
+ GL_GNULIB_MDA_EXECLE=1
+
+
+
+ GL_GNULIB_MDA_EXECLP=1
+
+
+
+ GL_GNULIB_MDA_EXECV=1
+
+
+
+ GL_GNULIB_MDA_EXECVE=1
+
+
+
+ GL_GNULIB_MDA_EXECVP=1
+
+
+
+ GL_GNULIB_MDA_EXECVPE=1
+
+
+
+ GL_GNULIB_MDA_GETCWD=1
+
+
+
+ GL_GNULIB_MDA_GETPID=1
+
+
+
+ GL_GNULIB_MDA_ISATTY=1
+
+
+
+ GL_GNULIB_MDA_LSEEK=1
+
+
+
+ GL_GNULIB_MDA_READ=1
+
+
+
+ GL_GNULIB_MDA_RMDIR=1
+
+
+
+ GL_GNULIB_MDA_SWAB=1
+
+
+
+ GL_GNULIB_MDA_UNLINK=1
+
+
+
+ GL_GNULIB_MDA_WRITE=1
+
+
+
+
+
+
+
+
+
+gl_libunistring_sed_extract_major='/^[0-9]/{s/^\([0-9]*\).*/\1/p;q;}
+i\
+0
+q
+'
+gl_libunistring_sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{s/^[0-9]*[.]\([0-9]*\).*/\1/p;q;}
+i\
+0
+q
+'
+gl_libunistring_sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{s/^[0-9]*[.][0-9]*[.]\([0-9]*\).*/\1/p;q;}
+i\
+0
+q
+'
+
+
+ if test "$HAVE_LIBUNISTRING" = yes; then
+ LIBUNISTRING_VERSION_MAJOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_major"`
+ LIBUNISTRING_VERSION_MINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_minor"`
+ LIBUNISTRING_VERSION_SUBMINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_subminor"`
+ fi
+
+ac_fn_check_decl "$LINENO" "vsnprintf" "ac_cv_have_decl_vsnprintf" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_vsnprintf" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_VSNPRINTF $ac_have_decl" >>confdefs.h
+
+
+ HAVE_BTOWC=1;
+ HAVE_MBSINIT=1;
+ HAVE_MBRTOWC=1;
+ HAVE_MBRLEN=1;
+ HAVE_MBSRTOWCS=1;
+ HAVE_MBSNRTOWCS=1;
+ HAVE_WCRTOMB=1;
+ HAVE_WCSRTOMBS=1;
+ HAVE_WCSNRTOMBS=1;
+ HAVE_WMEMCHR=1;
+ HAVE_WMEMCMP=1;
+ HAVE_WMEMCPY=1;
+ HAVE_WMEMMOVE=1;
+ HAVE_WMEMPCPY=1;
+ HAVE_WMEMSET=1;
+ HAVE_WCSLEN=1;
+ HAVE_WCSNLEN=1;
+ HAVE_WCSCPY=1;
+ HAVE_WCPCPY=1;
+ HAVE_WCSNCPY=1;
+ HAVE_WCPNCPY=1;
+ HAVE_WCSCAT=1;
+ HAVE_WCSNCAT=1;
+ HAVE_WCSCMP=1;
+ HAVE_WCSNCMP=1;
+ HAVE_WCSCASECMP=1;
+ HAVE_WCSNCASECMP=1;
+ HAVE_WCSCOLL=1;
+ HAVE_WCSXFRM=1;
+ HAVE_WCSDUP=1;
+ HAVE_WCSCHR=1;
+ HAVE_WCSRCHR=1;
+ HAVE_WCSCSPN=1;
+ HAVE_WCSSPN=1;
+ HAVE_WCSPBRK=1;
+ HAVE_WCSSTR=1;
+ HAVE_WCSTOK=1;
+ HAVE_WCSWIDTH=1;
+ HAVE_WCSFTIME=1;
+ HAVE_DECL_WCTOB=1;
+ HAVE_DECL_WCSDUP=1;
+ HAVE_DECL_WCWIDTH=1;
+ REPLACE_MBSTATE_T=0;
+ REPLACE_BTOWC=0;
+ REPLACE_WCTOB=0;
+ REPLACE_MBSINIT=0;
+ REPLACE_MBRTOWC=0;
+ REPLACE_MBRLEN=0;
+ REPLACE_MBSRTOWCS=0;
+ REPLACE_MBSNRTOWCS=0;
+ REPLACE_WCRTOMB=0;
+ REPLACE_WCSRTOMBS=0;
+ REPLACE_WCSNRTOMBS=0;
+ REPLACE_WCWIDTH=0;
+ REPLACE_WCSWIDTH=0;
+ REPLACE_WCSFTIME=0;
+ REPLACE_WCSTOK=0;
+ REPLACE_WMEMPCPY=0;
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether <wchar.h> uses 'inline' correctly" >&5
+printf %s "checking whether <wchar.h> uses 'inline' correctly... " >&6; }
+if test ${gl_cv_header_wchar_h_correct_inline+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_cv_header_wchar_h_correct_inline=yes
+ case "$host_os" in
+ *-gnu* | gnu*)
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+ #define wcstod renamed_wcstod
+ #include <wchar.h>
+ extern int zero (void);
+ int main () { return zero(); }
+
+_ACEOF
+ save_ac_compile="$ac_compile"
+ ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/`
+ if echo '#include "conftest.c"' >conftest1.c \
+ && { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+ #define wcstod renamed_wcstod
+ #include <wchar.h>
+ int zero (void) { return 0; }
+
+_ACEOF
+ ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/`
+ if echo '#include "conftest.c"' >conftest2.c \
+ && { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&5 2>&1; then
+ :
+ else
+ gl_cv_header_wchar_h_correct_inline=no
+ fi
+ fi
+ fi
+ ac_compile="$save_ac_compile"
+ rm -f conftest12.c conftest12.$ac_objext conftest$ac_exeext
+ ;;
+ esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_wchar_h_correct_inline" >&5
+printf "%s\n" "$gl_cv_header_wchar_h_correct_inline" >&6; }
+ if test $gl_cv_header_wchar_h_correct_inline = no; then
+ as_fn_error $? "<wchar.h> cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS).
+This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in
+C99 mode. You have four options:
+ - Add the flag -fgnu89-inline to CC and reconfigure, or
+ - Fix your include files, using parts of
+ <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b037a293a48718af30d706c2e18c929d0e69a621>, or
+ - Use a gcc version older than 4.3, or
+ - Don't use the flags -std=c99 or -std=gnu99.
+Configuration aborted." "$LINENO" 5
+ fi
+
+
+
+
+ if test $ac_cv_header_crtdefs_h = yes; then
+ HAVE_CRTDEFS_H=1
+ else
+ HAVE_CRTDEFS_H=0
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_wchar_h='<'wchar.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <wchar.h>" >&5
+printf %s "checking absolute name of <wchar.h>... " >&6; }
+if test ${gl_cv_next_wchar_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_wchar_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <wchar.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'wchar.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_wchar_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_wchar_h
+ gl_cv_next_wchar_h='"'$gl_header'"'
+ else
+ gl_cv_next_wchar_h='<'wchar.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wchar_h" >&5
+printf "%s\n" "$gl_cv_next_wchar_h" >&6; }
+ fi
+ NEXT_WCHAR_H=$gl_cv_next_wchar_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'wchar.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_wchar_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H=$gl_next_as_first_directive
+
+
+
+
+ if test $ac_cv_header_wchar_h = yes; then
+ HAVE_WCHAR_H=1
+ else
+ HAVE_WCHAR_H=0
+ fi
+
+
+
+
+
+ if test $gt_cv_c_wint_t = yes; then
+ HAVE_WINT_T=1
+ else
+ HAVE_WINT_T=0
+ fi
+
+
+
+
+
+
+
+
+
+
+ ac_fn_check_decl "$LINENO" "wcsdup" "ac_cv_have_decl_wcsdup" "
+ #include <wchar.h>
+
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_wcsdup" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_WCSDUP $ac_have_decl" >>confdefs.h
+
+ if test $ac_cv_have_decl_wcsdup = no; then
+ HAVE_DECL_WCSDUP=0
+ fi
+
+
+
+ GL_GNULIB_BTOWC=0
+
+
+
+ GL_GNULIB_WCTOB=0
+
+
+
+ GL_GNULIB_MBSINIT=0
+
+
+
+ GL_GNULIB_MBRTOWC=0
+
+
+
+ GL_GNULIB_MBRLEN=0
+
+
+
+ GL_GNULIB_MBSRTOWCS=0
+
+
+
+ GL_GNULIB_MBSNRTOWCS=0
+
+
+
+ GL_GNULIB_WCRTOMB=0
+
+
+
+ GL_GNULIB_WCSRTOMBS=0
+
+
+
+ GL_GNULIB_WCSNRTOMBS=0
+
+
+
+ GL_GNULIB_WCWIDTH=0
+
+
+
+ GL_GNULIB_WMEMCHR=0
+
+
+
+ GL_GNULIB_WMEMCMP=0
+
+
+
+ GL_GNULIB_WMEMCPY=0
+
+
+
+ GL_GNULIB_WMEMMOVE=0
+
+
+
+ GL_GNULIB_WMEMPCPY=0
+
+
+
+ GL_GNULIB_WMEMSET=0
+
+
+
+ GL_GNULIB_WCSLEN=0
+
+
+
+ GL_GNULIB_WCSNLEN=0
+
+
+
+ GL_GNULIB_WCSCPY=0
+
+
+
+ GL_GNULIB_WCPCPY=0
+
+
+
+ GL_GNULIB_WCSNCPY=0
+
+
+
+ GL_GNULIB_WCPNCPY=0
+
+
+
+ GL_GNULIB_WCSCAT=0
+
+
+
+ GL_GNULIB_WCSNCAT=0
+
+
+
+ GL_GNULIB_WCSCMP=0
+
+
+
+ GL_GNULIB_WCSNCMP=0
+
+
+
+ GL_GNULIB_WCSCASECMP=0
+
+
+
+ GL_GNULIB_WCSNCASECMP=0
+
+
+
+ GL_GNULIB_WCSCOLL=0
+
+
+
+ GL_GNULIB_WCSXFRM=0
+
+
+
+ GL_GNULIB_WCSDUP=0
+
+
+
+ GL_GNULIB_WCSCHR=0
+
+
+
+ GL_GNULIB_WCSRCHR=0
+
+
+
+ GL_GNULIB_WCSCSPN=0
+
+
+
+ GL_GNULIB_WCSSPN=0
+
+
+
+ GL_GNULIB_WCSPBRK=0
+
+
+
+ GL_GNULIB_WCSSTR=0
+
+
+
+ GL_GNULIB_WCSTOK=0
+
+
+
+ GL_GNULIB_WCSWIDTH=0
+
+
+
+ GL_GNULIB_WCSFTIME=0
+
+
+
+ GL_GNULIB_MDA_WCSDUP=1
+
+
+
+
+ HAVE_ISWBLANK=1;
+ HAVE_WCTYPE_T=1;
+ HAVE_WCTRANS_T=1;
+ REPLACE_ISWBLANK=0;
+ REPLACE_ISWDIGIT=0;
+ REPLACE_ISWXDIGIT=0;
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_iswcntrl = yes; then
+ HAVE_ISWCNTRL=1
+ else
+ HAVE_ISWCNTRL=0
+ fi
+
+
+
+ if test $gt_cv_c_wint_t = yes; then
+ HAVE_WINT_T=1
+ else
+ HAVE_WINT_T=0
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_wctype_h='<'wctype.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <wctype.h>" >&5
+printf %s "checking absolute name of <wctype.h>... " >&6; }
+if test ${gl_cv_next_wctype_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_wctype_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <wctype.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'wctype.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_wctype_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_wctype_h
+ gl_cv_next_wctype_h='"'$gl_header'"'
+ else
+ gl_cv_next_wctype_h='<'wctype.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wctype_h" >&5
+printf "%s\n" "$gl_cv_next_wctype_h" >&6; }
+ fi
+ NEXT_WCTYPE_H=$gl_cv_next_wctype_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'wctype.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_wctype_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H=$gl_next_as_first_directive
+
+
+
+
+ if test $ac_cv_header_wctype_h = yes; then
+ if test $ac_cv_func_iswcntrl = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether iswcntrl works" >&5
+printf %s "checking whether iswcntrl works... " >&6; }
+if test ${gl_cv_func_iswcntrl_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+ #if __GNU_LIBRARY__ == 1
+ Linux libc5 i18n is broken.
+ #endif
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_func_iswcntrl_works="guessing yes"
+else $as_nop
+ gl_cv_func_iswcntrl_works="guessing no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <wchar.h>
+ #include <wctype.h>
+ int main () { return iswprint ('x') == 0; }
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_iswcntrl_works=yes
+else $as_nop
+ gl_cv_func_iswcntrl_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_iswcntrl_works" >&5
+printf "%s\n" "$gl_cv_func_iswcntrl_works" >&6; }
+ fi
+ HAVE_WCTYPE_H=1
+ else
+ HAVE_WCTYPE_H=0
+ fi
+
+
+ if test $GNULIBHEADERS_OVERRIDE_WINT_T = 1; then
+ REPLACE_ISWCNTRL=1
+ else
+ case "$gl_cv_func_iswcntrl_works" in
+ *yes) REPLACE_ISWCNTRL=0 ;;
+ *) REPLACE_ISWCNTRL=1 ;;
+ esac
+ fi
+
+
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+ :
+ fi
+
+ if test $REPLACE_ISWCNTRL = 1; then
+ REPLACE_TOWLOWER=1
+ else
+ ac_fn_c_check_func "$LINENO" "towlower" "ac_cv_func_towlower"
+if test "x$ac_cv_func_towlower" = xyes
+then :
+ printf "%s\n" "#define HAVE_TOWLOWER 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_towlower = yes; then
+ REPLACE_TOWLOWER=0
+ else
+ ac_fn_check_decl "$LINENO" "towlower" "ac_cv_have_decl_towlower" "#include <wchar.h>
+ #if HAVE_WCTYPE_H
+ # include <wctype.h>
+ #endif
+
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_towlower" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_TOWLOWER $ac_have_decl" >>confdefs.h
+
+ if test $ac_cv_have_decl_towlower = yes; then
+ REPLACE_TOWLOWER=1
+ else
+ REPLACE_TOWLOWER=0
+ fi
+ fi
+ fi
+
+
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_TOWLOWER = 1; then
+ :
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wctype_t" >&5
+printf %s "checking for wctype_t... " >&6; }
+if test ${gl_cv_type_wctype_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <wchar.h>
+ #if HAVE_WCTYPE_H
+ # include <wctype.h>
+ #endif
+ wctype_t a;
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_type_wctype_t=yes
+else $as_nop
+ gl_cv_type_wctype_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctype_t" >&5
+printf "%s\n" "$gl_cv_type_wctype_t" >&6; }
+ if test $gl_cv_type_wctype_t = no; then
+ HAVE_WCTYPE_T=0
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wctrans_t" >&5
+printf %s "checking for wctrans_t... " >&6; }
+if test ${gl_cv_type_wctrans_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <wchar.h>
+ #include <wctype.h>
+ wctrans_t a;
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_type_wctrans_t=yes
+else $as_nop
+ gl_cv_type_wctrans_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctrans_t" >&5
+printf "%s\n" "$gl_cv_type_wctrans_t" >&6; }
+ if test $gl_cv_type_wctrans_t = no; then
+ HAVE_WCTRANS_T=0
+ fi
+
+
+
+
+
+
+
+ GL_GNULIB_ISWBLANK=0
+
+
+
+ GL_GNULIB_ISWDIGIT=0
+
+
+
+ GL_GNULIB_ISWXDIGIT=0
+
+
+
+ GL_GNULIB_WCTYPE=0
+
+
+
+ GL_GNULIB_ISWCTYPE=0
+
+
+
+ GL_GNULIB_WCTRANS=0
+
+
+
+ GL_GNULIB_TOWCTRANS=0
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+printf %s "checking for inline... " >&6; }
+if test ${ac_cv_c_inline+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo (void) {return 0; }
+$ac_kw foo_t foo (void) {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+printf "%s\n" "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+ inline | yes) ;;
+ *)
+ case $ac_cv_c_inline in
+ no) ac_val=;;
+ *) ac_val=$ac_cv_c_inline;;
+ esac
+ cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+ ;;
+esac
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler option to allow warnings" >&5
+printf %s "checking for C compiler option to allow warnings... " >&6; }
+if test ${gl_cv_cc_wallow+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ rm -f conftest*
+ echo 'int dummy;' > conftest.c
+ { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -c conftest.c 2>conftest1.err'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; } >/dev/null
+ { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -Wno-error -c conftest.c 2>conftest2.err'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; } >/dev/null
+ if test $? = 0 && test `wc -l < conftest1.err` = `wc -l < conftest2.err`; then
+ gl_cv_cc_wallow='-Wno-error'
+ else
+ gl_cv_cc_wallow=none
+ fi
+ rm -f conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_wallow" >&5
+printf "%s\n" "$gl_cv_cc_wallow" >&6; }
+ case "$gl_cv_cc_wallow" in
+ none) GL_CFLAG_ALLOW_WARNINGS='' ;;
+ *) GL_CFLAG_ALLOW_WARNINGS="$gl_cv_cc_wallow" ;;
+ esac
+
+
+
+
+ GL_CFLAG_GNULIB_WARNINGS=''
+ if test -n "$GL_CFLAG_ALLOW_WARNINGS"; then
+ cat > conftest.c <<\EOF
+ #if __GNUC__ >= 3 || (__clang_major__ + (__clang_minor__ >= 9) > 3)
+ -Wno-cast-qual
+ -Wno-conversion
+ -Wno-float-equal
+ -Wno-sign-compare
+ -Wno-undef
+ -Wno-unused-function
+ -Wno-unused-parameter
+ #endif
+ #if __GNUC__ + (__GNUC_MINOR__ >= 9) > 4 || (__clang_major__ + (__clang_minor__ >= 9) > 3)
+ -Wno-float-conversion
+ #endif
+ #if __GNUC__ >= 7 || (__clang_major__ + (__clang_minor__ >= 9) > 3)
+ -Wimplicit-fallthrough
+ #endif
+ #if __GNUC__ + (__GNUC_MINOR__ >= 8) > 4 || (__clang_major__ + (__clang_minor__ >= 9) > 3)
+ -Wno-pedantic
+ #endif
+ #if __GNUC__ + (__GNUC_MINOR__ >= 3) > 4 || (__clang_major__ + (__clang_minor__ >= 9) > 3)
+ -Wno-sign-conversion
+ -Wno-type-limits
+ #endif
+ #if __GNUC__ + (__GNUC_MINOR__ >= 5) > 4
+ -Wno-unsuffixed-float-constants
+ #endif
+EOF
+ gl_command="$CC $CFLAGS $CPPFLAGS -E conftest.c > conftest.out"
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gl_command\""; } >&5
+ (eval $gl_command) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ gl_options=`grep -v '#' conftest.out`
+ for word in $gl_options; do
+ GL_CFLAG_GNULIB_WARNINGS="$GL_CFLAG_GNULIB_WARNINGS $word"
+ done
+ fi
+ rm -f conftest.c conftest.out
+ fi
+
+
+
+ if false; then
+ GL_COND_LIBTOOL_TRUE=
+ GL_COND_LIBTOOL_FALSE='#'
+else
+ GL_COND_LIBTOOL_TRUE='#'
+ GL_COND_LIBTOOL_FALSE=
+fi
+
+ gl_cond_libtool=false
+ gl_libdeps=
+ gl_ltlibdeps=
+ gl_m4_base='gnulib_m4'
+
+
+
+
+
+
+
+
+
+
+
+
+ gl_source_base='lib'
+ gl_source_base_prefix='$(top_build_prefix)lib/'
+
+
+ if test $ac_cv_func_alloca_works = no; then
+ :
+ fi
+
+ # Define an additional variable used in the Makefile substitution.
+ if test $ac_cv_working_alloca_h = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for alloca as a compiler built-in" >&5
+printf %s "checking for alloca as a compiler built-in... " >&6; }
+if test ${gl_cv_rpl_alloca+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#if defined __GNUC__ || defined _AIX || defined _MSC_VER
+ Need own alloca
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Need own alloca" >/dev/null 2>&1
+then :
+ gl_cv_rpl_alloca=yes
+else $as_nop
+ gl_cv_rpl_alloca=no
+fi
+rm -rf conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_rpl_alloca" >&5
+printf "%s\n" "$gl_cv_rpl_alloca" >&6; }
+ if test $gl_cv_rpl_alloca = yes; then
+
+printf "%s\n" "#define HAVE_ALLOCA 1" >>confdefs.h
+
+ GL_GENERATE_ALLOCA_H=true
+ else
+ GL_GENERATE_ALLOCA_H=false
+ fi
+ else
+ GL_GENERATE_ALLOCA_H=true
+ fi
+
+ if test $ac_cv_working_alloca_h = yes; then
+ HAVE_ALLOCA_H=1
+ else
+ HAVE_ALLOCA_H=0
+ fi
+
+
+
+
+
+
+ case "$GL_GENERATE_ALLOCA_H" in
+ false) ALLOCA_H='' ;;
+ true)
+ if test -z "$ALLOCA_H"; then
+ ALLOCA_H="${gl_source_base_prefix}alloca.h"
+ fi
+ ;;
+ *) echo "*** GL_GENERATE_ALLOCA_H is not set correctly" 1>&2; exit 1 ;;
+ esac
+
+
+ if $GL_GENERATE_ALLOCA_H; then
+ GL_GENERATE_ALLOCA_H_TRUE=
+ GL_GENERATE_ALLOCA_H_FALSE='#'
+else
+ GL_GENERATE_ALLOCA_H_TRUE='#'
+ GL_GENERATE_ALLOCA_H_FALSE=
+fi
+:
+ if test -z "${GL_GENERATE_ALLOCA_H_TRUE}" && test -z "${GL_GENERATE_ALLOCA_H_FALSE}"; then
+ GL_GENERATE_ALLOCA_H_TRUE='#'
+ GL_GENERATE_ALLOCA_H_FALSE='#'
+ fi
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for static_assert" >&5
+printf %s "checking for static_assert... " >&6; }
+if test ${gl_cv_static_assert+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_save_CFLAGS=$CFLAGS
+ for gl_working in "yes, a keyword" "yes, an <assert.h> macro"; do
+ case $gl_working in #(
+ *assert.h*) :
+ CFLAGS="$gl_save_CFLAGS -DINCLUDE_ASSERT_H" ;; #(
+ *) :
+ ;;
+esac
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if defined __clang__ && __STDC_VERSION__ < 202311
+ #pragma clang diagnostic error "-Wc2x-extensions"
+ #pragma clang diagnostic error "-Wc++1z-extensions"
+ #endif
+ #ifdef INCLUDE_ASSERT_H
+ #include <assert.h>
+ #endif
+ static_assert (2 + 2 == 4, "arithmetic does not work");
+ static_assert (2 + 2 == 4);
+
+int
+main (void)
+{
+
+ static_assert (sizeof (char) == 1, "sizeof does not work");
+ static_assert (sizeof (char) == 1);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_static_assert=$gl_working
+else $as_nop
+ gl_cv_static_assert=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS=$gl_save_CFLAGS
+ test "$gl_cv_static_assert" != no && break
+ done
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_static_assert" >&5
+printf "%s\n" "$gl_cv_static_assert" >&6; }
+
+ GL_GENERATE_ASSERT_H=false
+ case $gl_cv_static_assert in #(
+ yes*keyword*) :
+
+printf "%s\n" "#define HAVE_C_STATIC_ASSERT 1" >>confdefs.h
+ ;; #(
+ no) :
+ GL_GENERATE_ASSERT_H=true
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_assert_h='<'assert.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <assert.h>" >&5
+printf %s "checking absolute name of <assert.h>... " >&6; }
+if test ${gl_cv_next_assert_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <assert.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'assert.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_assert_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_assert_h
+ gl_cv_next_assert_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_assert_h" >&5
+printf "%s\n" "$gl_cv_next_assert_h" >&6; }
+ fi
+ NEXT_ASSERT_H=$gl_cv_next_assert_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'assert.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_assert_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_ASSERT_H=$gl_next_as_first_directive
+
+
+
+ ;; #(
+ *) :
+ ;;
+esac
+
+
+
+
+
+
+
+ case "$GL_GENERATE_ASSERT_H" in
+ false) ASSERT_H='' ;;
+ true)
+ if test -z "$ASSERT_H"; then
+ ASSERT_H="${gl_source_base_prefix}assert.h"
+ fi
+ ;;
+ *) echo "*** GL_GENERATE_ASSERT_H is not set correctly" 1>&2; exit 1 ;;
+ esac
+
+
+ if $GL_GENERATE_ASSERT_H; then
+ GL_GENERATE_ASSERT_H_TRUE=
+ GL_GENERATE_ASSERT_H_FALSE='#'
+else
+ GL_GENERATE_ASSERT_H_TRUE='#'
+ GL_GENERATE_ASSERT_H_FALSE=
+fi
+:
+ if test -z "${GL_GENERATE_ASSERT_H_TRUE}" && test -z "${GL_GENERATE_ASSERT_H_FALSE}"; then
+ GL_GENERATE_ASSERT_H_TRUE='#'
+ GL_GENERATE_ASSERT_H_FALSE='#'
+ fi
+
+
+
+
+
+
+
+
+
+
+
+ case "$GL_GENERATE_ERRNO_H" in
+ false) ERRNO_H='' ;;
+ true)
+ if test -z "$ERRNO_H"; then
+ ERRNO_H="${gl_source_base_prefix}errno.h"
+ fi
+ ;;
+ *) echo "*** GL_GENERATE_ERRNO_H is not set correctly" 1>&2; exit 1 ;;
+ esac
+
+
+ if $GL_GENERATE_ERRNO_H; then
+ GL_GENERATE_ERRNO_H_TRUE=
+ GL_GENERATE_ERRNO_H_FALSE='#'
+else
+ GL_GENERATE_ERRNO_H_TRUE='#'
+ GL_GENERATE_ERRNO_H_FALSE=
+fi
+:
+ if test -z "${GL_GENERATE_ERRNO_H_TRUE}" && test -z "${GL_GENERATE_ERRNO_H_FALSE}"; then
+ GL_GENERATE_ERRNO_H_TRUE='#'
+ GL_GENERATE_ERRNO_H_FALSE='#'
+ fi
+
+
+
+
+
+
+
+
+
+
+ GL_GENERATE_FLOAT_H=false
+ REPLACE_FLOAT_LDBL=0
+ case "$host_os" in
+ aix* | beos* | openbsd* | mirbsd* | irix*)
+ GL_GENERATE_FLOAT_H=true
+ ;;
+ freebsd* | dragonfly*)
+ case "$host_cpu" in
+ i[34567]86 )
+ GL_GENERATE_FLOAT_H=true
+ ;;
+ x86_64 )
+ # On x86_64 systems, the C compiler may still be generating
+ # 32-bit code.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if defined __LP64__ || defined __x86_64__ || defined __amd64__
+ int ok;
+ #else
+ error fail
+ #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ GL_GENERATE_FLOAT_H=true
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ;;
+ esac
+ ;;
+ linux*)
+ case "$host_cpu" in
+ powerpc*)
+ GL_GENERATE_FLOAT_H=true
+ ;;
+ esac
+ ;;
+ esac
+ case "$host_os" in
+ aix* | freebsd* | dragonfly* | linux*)
+ if $GL_GENERATE_FLOAT_H; then
+ REPLACE_FLOAT_LDBL=1
+ fi
+ ;;
+ esac
+
+ REPLACE_ITOLD=0
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether conversion from 'int' to 'long double' works" >&5
+printf %s "checking whether conversion from 'int' to 'long double' works... " >&6; }
+if test ${gl_cv_func_itold_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ case "$host" in
+ sparc*-*-linux*)
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if defined __LP64__ || defined __arch64__
+ int ok;
+ #else
+ error fail
+ #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_func_itold_works="guessing no"
+else $as_nop
+ gl_cv_func_itold_works="guessing yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_itold_works="guessing yes" ;;
+ *) gl_cv_func_itold_works="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int i = -1;
+volatile long double ld;
+int main ()
+{
+ ld += i * 1.0L;
+ if (ld > 0)
+ return 1;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_itold_works=yes
+else $as_nop
+ gl_cv_func_itold_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_itold_works" >&5
+printf "%s\n" "$gl_cv_func_itold_works" >&6; }
+ case "$gl_cv_func_itold_works" in
+ *no)
+ REPLACE_ITOLD=1
+ GL_GENERATE_FLOAT_H=true
+ ;;
+ esac
+
+ if $GL_GENERATE_FLOAT_H; then
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_float_h='<'float.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <float.h>" >&5
+printf %s "checking absolute name of <float.h>... " >&6; }
+if test ${gl_cv_next_float_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <float.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'float.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_float_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_float_h
+ gl_cv_next_float_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_float_h" >&5
+printf "%s\n" "$gl_cv_next_float_h" >&6; }
+ fi
+ NEXT_FLOAT_H=$gl_cv_next_float_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'float.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_float_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H=$gl_next_as_first_directive
+
+
+
+
+ fi
+
+
+
+
+
+
+ case "$GL_GENERATE_FLOAT_H" in
+ false) FLOAT_H='' ;;
+ true)
+ if test -z "$FLOAT_H"; then
+ FLOAT_H="${gl_source_base_prefix}float.h"
+ fi
+ ;;
+ *) echo "*** GL_GENERATE_FLOAT_H is not set correctly" 1>&2; exit 1 ;;
+ esac
+
+
+ if $GL_GENERATE_FLOAT_H; then
+ GL_GENERATE_FLOAT_H_TRUE=
+ GL_GENERATE_FLOAT_H_FALSE='#'
+else
+ GL_GENERATE_FLOAT_H_TRUE='#'
+ GL_GENERATE_FLOAT_H_FALSE=
+fi
+:
+ if test -z "${GL_GENERATE_FLOAT_H_TRUE}" && test -z "${GL_GENERATE_FLOAT_H_FALSE}"; then
+ GL_GENERATE_FLOAT_H_TRUE='#'
+ GL_GENERATE_FLOAT_H_FALSE='#'
+ fi
+
+
+
+
+
+
+
+ if test $REPLACE_FLOAT_LDBL = 1; then
+ GL_COND_OBJ_FLOAT_TRUE=
+ GL_COND_OBJ_FLOAT_FALSE='#'
+else
+ GL_COND_OBJ_FLOAT_TRUE='#'
+ GL_COND_OBJ_FLOAT_FALSE=
+fi
+:
+ if test -z "${GL_COND_OBJ_FLOAT_TRUE}" && test -z "${GL_COND_OBJ_FLOAT_FALSE}"; then
+ GL_COND_OBJ_FLOAT_TRUE='#'
+ GL_COND_OBJ_FLOAT_FALSE='#'
+ fi
+
+
+ if test $REPLACE_ITOLD = 1; then
+ GL_COND_OBJ_ITOLD_TRUE=
+ GL_COND_OBJ_ITOLD_FALSE='#'
+else
+ GL_COND_OBJ_ITOLD_TRUE='#'
+ GL_COND_OBJ_ITOLD_FALSE=
+fi
+:
+ if test -z "${GL_COND_OBJ_ITOLD_TRUE}" && test -z "${GL_COND_OBJ_ITOLD_FALSE}"; then
+ GL_COND_OBJ_ITOLD_TRUE='#'
+ GL_COND_OBJ_ITOLD_FALSE='#'
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ gl_cv_func_fprintf_posix=no
+ case "$gl_cv_func_printf_sizes_c99" in
+ *yes)
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_infinite" in
+ *yes)
+ case "$gl_cv_func_printf_infinite_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_directive_a" in
+ *yes)
+ case "$gl_cv_func_printf_directive_f" in
+ *yes)
+ case "$gl_cv_func_printf_directive_n" in
+ *yes)
+ case "$gl_cv_func_printf_directive_ls" in
+ *yes)
+ case "$gl_cv_func_printf_positions" in
+ *yes)
+ case "$gl_cv_func_printf_flag_grouping" in
+ *yes)
+ case "$gl_cv_func_printf_flag_leftadjust" in
+ *yes)
+ case "$gl_cv_func_printf_flag_zero" in
+ *yes)
+ case "$gl_cv_func_printf_precision" in
+ *yes)
+ case "$gl_cv_func_printf_enomem" in
+ *yes)
+ # fprintf exists and is
+ # already POSIX compliant.
+ gl_cv_func_fprintf_posix=yes
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ if test $gl_cv_func_fprintf_posix = no; then
+
+
+
+ case "$gl_cv_func_printf_infinite" in
+ *yes)
+ ;;
+ *)
+
+printf "%s\n" "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h
+
+ ;;
+ esac
+
+
+
+
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_infinite_long_double" in
+ *yes)
+ ;;
+ *)
+
+printf "%s\n" "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h
+
+ ;;
+ esac
+ ;;
+ esac
+
+
+
+ case "$gl_cv_func_printf_directive_a" in
+ *yes)
+ ;;
+ *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo" >&5
+printf %s "checking for nl_langinfo... " >&6; }
+if test ${gl_cv_onwards_func_nl_langinfo+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ exec 9>&6 6>/dev/null
+
+ case "$host_os" in
+ linux*-android*)
+ ac_fn_check_decl "$LINENO" "nl_langinfo" "ac_cv_have_decl_nl_langinfo" "#include <langinfo.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_nl_langinfo" = xyes
+then :
+
+fi
+ if test $ac_cv_have_decl_nl_langinfo = yes; then
+ ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
+if test "x$ac_cv_func_nl_langinfo" = xyes
+then :
+
+fi
+
+ if test $ac_cv_func_nl_langinfo = yes; then
+ gl_cv_onwards_func_nl_langinfo=yes
+ else
+ gl_cv_onwards_func_nl_langinfo='future OS version'
+ fi
+ else
+ gl_cv_onwards_func_nl_langinfo='future OS version'
+ fi
+ ;;
+ *)
+ ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
+if test "x$ac_cv_func_nl_langinfo" = xyes
+then :
+
+fi
+
+ gl_cv_onwards_func_nl_langinfo=$ac_cv_func_nl_langinfo
+ ;;
+ esac
+
+ exec 6>&9 9>&-
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_onwards_func_nl_langinfo" >&5
+printf "%s\n" "$gl_cv_onwards_func_nl_langinfo" >&6; }
+ case "$gl_cv_onwards_func_nl_langinfo" in
+ future*) ac_cv_func_nl_langinfo=no ;;
+ *) ac_cv_func_nl_langinfo=$gl_cv_onwards_func_nl_langinfo ;;
+ esac
+ if test $ac_cv_func_nl_langinfo = yes; then
+
+printf "%s\n" "#define HAVE_NL_LANGINFO 1" >>confdefs.h
+
+ fi
+
+ ;;
+ esac
+
+
+
+ case "$gl_cv_func_printf_directive_f" in
+ *yes)
+ ;;
+ *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h
+
+ ;;
+ esac
+
+
+
+ case "$gl_cv_func_printf_directive_ls" in
+ *yes)
+ ;;
+ *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h
+
+ ;;
+ esac
+
+
+
+ case "$gl_cv_func_printf_flag_grouping" in
+ *yes)
+ ;;
+ *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h
+
+ ;;
+ esac
+
+
+
+ case "$gl_cv_func_printf_flag_leftadjust" in
+ *yes)
+ ;;
+ *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h
+
+ ;;
+ esac
+
+
+
+ case "$gl_cv_func_printf_flag_zero" in
+ *yes)
+ ;;
+ *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h
+
+ ;;
+ esac
+
+
+
+ case "$gl_cv_func_printf_precision" in
+ *yes)
+ ;;
+ *)
+
+printf "%s\n" "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
+
+ ;;
+ esac
+
+
+
+ case "$gl_cv_func_printf_enomem" in
+ *yes)
+ ;;
+ *)
+
+printf "%s\n" "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
+
+ ;;
+ esac
+
+
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"
+
+ if test $ac_cv_func_vasnprintf = yes; then
+
+printf "%s\n" "#define REPLACE_VASNPRINTF 1" >>confdefs.h
+
+ fi
+
+
+
+
+
+
+
+
+
+ ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
+if test "x$ac_cv_type_ptrdiff_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define ptrdiff_t long" >>confdefs.h
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS fprintf.$ac_objext"
+
+ REPLACE_FPRINTF=1
+
+printf "%s\n" "#define REPLACE_FPRINTF_POSIX 1" >>confdefs.h
+
+ :
+
+ fi
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_FPRINTF_POSIX=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FPRINTF_POSIX 1" >>confdefs.h
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether free is known to preserve errno" >&5
+printf %s "checking whether free is known to preserve errno... " >&6; }
+if test ${gl_cv_func_free_preserves_errno+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+int
+main (void)
+{
+#if 2 < __GLIBC__ + (33 <= __GLIBC_MINOR__)
+ #elif defined __OpenBSD__
+ #elif defined __sun
+ #else
+ #error "'free' is not known to preserve errno"
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_func_free_preserves_errno=yes
+else $as_nop
+ gl_cv_func_free_preserves_errno=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_free_preserves_errno" >&5
+printf "%s\n" "$gl_cv_func_free_preserves_errno" >&6; }
+
+ case $gl_cv_func_free_preserves_errno in
+ *yes)
+
+printf "%s\n" "#define HAVE_FREE_POSIX 1" >>confdefs.h
+
+ ;;
+ *) REPLACE_FREE=1 ;;
+ esac
+
+
+ if test $REPLACE_FREE = 1; then
+ GL_COND_OBJ_FREE_TRUE=
+ GL_COND_OBJ_FREE_FALSE='#'
+else
+ GL_COND_OBJ_FREE_TRUE='#'
+ GL_COND_OBJ_FREE_FALSE=
+fi
+:
+ if test -z "${GL_COND_OBJ_FREE_TRUE}" && test -z "${GL_COND_OBJ_FREE_FALSE}"; then
+ GL_COND_OBJ_FREE_TRUE='#'
+ GL_COND_OBJ_FREE_FALSE='#'
+ fi
+
+ if test -z "$GL_COND_OBJ_FREE_TRUE"; then :
+
+ :
+
+fi
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_FREE_POSIX=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FREE_POSIX 1" >>confdefs.h
+
+
+
+
+
+
+ if test $gl_cv_func_frexp_no_libm = yes; then
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether frexp works" >&5
+printf %s "checking whether frexp works... " >&6; }
+if test ${gl_cv_func_frexp_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ netbsd* | irix*) gl_cv_func_frexp_works="guessing no" ;;
+ mingw*) # Guess yes with MSVC, no with mingw.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef _MSC_VER
+ Good
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Good" >/dev/null 2>&1
+then :
+ gl_cv_func_frexp_works="guessing yes"
+else $as_nop
+ gl_cv_func_frexp_works="guessing no"
+fi
+rm -rf conftest*
+
+ ;;
+ *) gl_cv_func_frexp_works="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <float.h>
+#include <math.h>
+#include <string.h>
+#if HAVE_DECL_ALARM
+# include <signal.h>
+# include <unistd.h>
+#endif
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+ ICC 10.0 has a bug when optimizing the expression -zero.
+ The expression -DBL_MIN * DBL_MIN does not work when cross-compiling
+ to PowerPC on Mac OS X 10.5. */
+#if defined __hpux || defined __sgi || defined __ICC
+static double
+compute_minus_zero (void)
+{
+ return -DBL_MIN * DBL_MIN;
+}
+# define minus_zero compute_minus_zero ()
+#else
+double minus_zero = -0.0;
+#endif
+int main()
+{
+ int result = 0;
+ int i;
+ volatile double x;
+ double zero = 0.0;
+#if HAVE_DECL_ALARM
+ /* NeXTstep 3.3 frexp() runs into an endless loop when called on an infinite
+ number. Let the test fail in this case. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (5);
+#endif
+ /* Test on denormalized numbers. */
+ for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5)
+ ;
+ if (x > 0.0)
+ {
+ int exp;
+ double y = frexp (x, &exp);
+ /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022.
+ On NetBSD: y = 0.75. Correct: y = 0.5. */
+ if (y != 0.5)
+ result |= 1;
+ }
+ /* Test on infinite numbers. */
+ x = 1.0 / zero;
+ {
+ int exp;
+ double y = frexp (x, &exp);
+ if (y != x)
+ result |= 2;
+ }
+ /* Test on negative zero. */
+ x = minus_zero;
+ {
+ int exp;
+ double y = frexp (x, &exp);
+ if (memcmp (&y, &x, sizeof x))
+ result |= 4;
+ }
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_frexp_works=yes
+else $as_nop
+ gl_cv_func_frexp_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexp_works" >&5
+printf "%s\n" "$gl_cv_func_frexp_works" >&6; }
+
+ case "$gl_cv_func_frexp_works" in
+ *yes) gl_func_frexp_no_libm=yes ;;
+ *) gl_func_frexp_no_libm=no; REPLACE_FREXP=1 ;;
+ esac
+ else
+ gl_func_frexp_no_libm=no
+ REPLACE_FREXP=1
+ fi
+ if test $gl_func_frexp_no_libm = yes; then
+
+printf "%s\n" "#define HAVE_FREXP_IN_LIBC 1" >>confdefs.h
+
+ fi
+
+ if test $gl_func_frexp_no_libm != yes; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS frexp.$ac_objext"
+
+ fi
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_FREXP=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FREXP 1" >>confdefs.h
+
+
+
+
+
+
+ ac_fn_check_decl "$LINENO" "frexpl" "ac_cv_have_decl_frexpl" "#include <math.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_frexpl" = xyes
+then :
+
+else $as_nop
+ HAVE_DECL_FREXPL=0
+fi
+ if test $HAVE_DECL_FREXPL = 1; then
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether frexpl() can be used without linking with libm" >&5
+printf %s "checking whether frexpl() can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_frexpl_no_libm+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <math.h>
+ long double x;
+int
+main (void)
+{
+int e; return frexpl (x, &e) > 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_frexpl_no_libm=yes
+else $as_nop
+ gl_cv_func_frexpl_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_no_libm" >&5
+printf "%s\n" "$gl_cv_func_frexpl_no_libm" >&6; }
+
+ if test $gl_cv_func_frexpl_no_libm = yes; then
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether frexpl works" >&5
+printf %s "checking whether frexpl works... " >&6; }
+if test ${gl_cv_func_frexpl_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ aix | aix[3-6]* | beos* | darwin* | irix* | mingw* | pw*)
+ gl_cv_func_frexpl_works="guessing no";;
+ *) gl_cv_func_frexpl_works="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <float.h>
+#include <math.h>
+/* Override the values of <float.h>, like done in float.in.h. */
+#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP (-16381)
+#endif
+#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__)
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP (-16381)
+#endif
+#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP DBL_MIN_EXP
+#endif
+#if defined __sgi && (LDBL_MANT_DIG >= 106)
+# if defined __GNUC__
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP DBL_MIN_EXP
+# endif
+#endif
+extern
+#ifdef __cplusplus
+"C"
+#endif
+long double frexpl (long double, int *);
+long double zero = 0.0L;
+int main()
+{
+ int result = 0;
+ volatile long double x;
+ /* Test on finite numbers that fails on AIX 5.1. */
+ x = 16.0L;
+ {
+ int exp = -9999;
+ frexpl (x, &exp);
+ if (exp != 5)
+ result |= 1;
+ }
+ /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl
+ function returns an invalid (incorrectly normalized) value: it returns
+ y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 }
+ but the correct result is
+ 0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 } */
+ x = 1.01L;
+ {
+ int exp = -9999;
+ long double y = frexpl (x, &exp);
+ if (!(exp == 1 && y == 0.505L))
+ result |= 2;
+ }
+ /* Test on large finite numbers. This fails on BeOS at i = 16322, while
+ LDBL_MAX_EXP = 16384.
+ In the loop end test, we test x against Infinity, rather than comparing
+ i with LDBL_MAX_EXP, because BeOS <float.h> has a wrong LDBL_MAX_EXP. */
+ {
+ int i;
+ for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L)
+ {
+ int exp = -9999;
+ frexpl (x, &exp);
+ if (exp != i)
+ {
+ result |= 4;
+ break;
+ }
+ }
+ }
+ /* Test on denormalized numbers. */
+ {
+ int i;
+ for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L)
+ ;
+ if (x > 0.0L)
+ {
+ int exp;
+ long double y = frexpl (x, &exp);
+ /* On machines with IEEE854 arithmetic: x = 1.68105e-4932,
+ exp = -16382, y = 0.5. On Mac OS X 10.5: exp = -16384, y = 0.5. */
+ if (exp != LDBL_MIN_EXP - 1)
+ result |= 8;
+ }
+ }
+ /* Test on infinite numbers. */
+ /* The Microsoft MSVC 14 compiler chokes on the expression 1.0 / 0.0. */
+ x = 1.0L / zero;
+ {
+ int exp;
+ long double y = frexpl (x, &exp);
+ if (y != x)
+ result |= 16;
+ }
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_frexpl_works=yes
+else $as_nop
+ gl_cv_func_frexpl_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_works" >&5
+printf "%s\n" "$gl_cv_func_frexpl_works" >&6; }
+
+ case "$gl_cv_func_frexpl_works" in
+ *yes) gl_func_frexpl_no_libm=yes ;;
+ *) gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;;
+ esac
+ else
+ gl_func_frexpl_no_libm=no
+ REPLACE_FREXPL=1
+ fi
+ if test $gl_func_frexpl_no_libm = yes; then
+
+printf "%s\n" "#define HAVE_FREXPL_IN_LIBC 1" >>confdefs.h
+
+ fi
+ fi
+
+ if test $HAVE_DECL_FREXPL = 0 || test $gl_func_frexpl_no_libm = no; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS frexpl.$ac_objext"
+
+ fi
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_FREXPL=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FREXPL 1" >>confdefs.h
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __fseterr" >&5
+printf %s "checking for __fseterr... " >&6; }
+if test ${gl_cv_onwards_func___fseterr+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ exec 9>&6 6>/dev/null
+
+ case "$host_os" in
+ linux*-android*)
+ ac_fn_check_decl "$LINENO" "__fseterr" "ac_cv_have_decl___fseterr" "#include <stdio.h>
+ #include <stdio_ext.h>
+
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl___fseterr" = xyes
+then :
+
+fi
+ if test $ac_cv_have_decl___fseterr = yes; then
+ ac_fn_c_check_func "$LINENO" "__fseterr" "ac_cv_func___fseterr"
+if test "x$ac_cv_func___fseterr" = xyes
+then :
+
+fi
+
+ if test $ac_cv_func___fseterr = yes; then
+ gl_cv_onwards_func___fseterr=yes
+ else
+ gl_cv_onwards_func___fseterr='future OS version'
+ fi
+ else
+ gl_cv_onwards_func___fseterr='future OS version'
+ fi
+ ;;
+ *)
+ ac_fn_c_check_func "$LINENO" "__fseterr" "ac_cv_func___fseterr"
+if test "x$ac_cv_func___fseterr" = xyes
+then :
+
+fi
+
+ gl_cv_onwards_func___fseterr=$ac_cv_func___fseterr
+ ;;
+ esac
+
+ exec 6>&9 9>&-
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_onwards_func___fseterr" >&5
+printf "%s\n" "$gl_cv_onwards_func___fseterr" >&6; }
+ case "$gl_cv_onwards_func___fseterr" in
+ future*) ac_cv_func___fseterr=no ;;
+ *) ac_cv_func___fseterr=$gl_cv_onwards_func___fseterr ;;
+ esac
+ if test $ac_cv_func___fseterr = yes; then
+
+printf "%s\n" "#define HAVE___FSETERR 1" >>confdefs.h
+
+ fi
+
+
+
+ if test $ac_cv_func___fseterr = no; then
+ GL_COND_OBJ_FSETERR_TRUE=
+ GL_COND_OBJ_FSETERR_FALSE='#'
+else
+ GL_COND_OBJ_FSETERR_TRUE='#'
+ GL_COND_OBJ_FSETERR_FALSE=
+fi
+:
+ if test -z "${GL_COND_OBJ_FSETERR_TRUE}" && test -z "${GL_COND_OBJ_FSETERR_FALSE}"; then
+ GL_COND_OBJ_FSETERR_TRUE='#'
+ GL_COND_OBJ_FSETERR_FALSE='#'
+ fi
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used without linking with libm" >&5
+printf %s "checking whether isnan(double) can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_isnand_no_libm+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <math.h>
+ #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+ # undef isnand
+ # define isnand(x) __builtin_isnan ((double)(x))
+ #else
+ # undef isnand
+ # define isnand(x) isnan ((double)(x))
+ #endif
+ double x;
+int
+main (void)
+{
+return isnand (x);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_isnand_no_libm=yes
+else $as_nop
+ gl_cv_func_isnand_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_no_libm" >&5
+printf "%s\n" "$gl_cv_func_isnand_no_libm" >&6; }
+
+ gl_func_isnand_no_libm=$gl_cv_func_isnand_no_libm
+ if test $gl_cv_func_isnand_no_libm = yes; then
+
+printf "%s\n" "#define HAVE_ISNAND_IN_LIBC 1" >>confdefs.h
+
+ fi
+
+ if test $gl_func_isnand_no_libm != yes; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS isnand.$ac_objext"
+
+
+
+
+ fi
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used without linking with libm" >&5
+printf %s "checking whether isnan(float) can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_isnanf_no_libm+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <math.h>
+ #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+ # undef isnanf
+ # define isnanf(x) __builtin_isnan ((float)(x))
+ #elif defined isnan
+ # undef isnanf
+ # define isnanf(x) isnan ((float)(x))
+ #endif
+ float x;
+int
+main (void)
+{
+return isnanf (x);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_isnanf_no_libm=yes
+else $as_nop
+ gl_cv_func_isnanf_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_no_libm" >&5
+printf "%s\n" "$gl_cv_func_isnanf_no_libm" >&6; }
+
+ if test $gl_cv_func_isnanf_no_libm = yes; then
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) works" >&5
+printf %s "checking whether isnan(float) works... " >&6; }
+if test ${gl_cv_func_isnanf_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ irix* | solaris*) gl_cv_func_isnanf_works="guessing no" ;;
+ mingw*) # Guess yes on mingw, no on MSVC.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef __MINGW32__
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Known" >/dev/null 2>&1
+then :
+ gl_cv_func_isnanf_works="guessing yes"
+else $as_nop
+ gl_cv_func_isnanf_works="guessing no"
+fi
+rm -rf conftest*
+
+ ;;
+ *) gl_cv_func_isnanf_works="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <math.h>
+#if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+# undef isnanf
+# define isnanf(x) __builtin_isnan ((float)(x))
+#elif defined isnan
+# undef isnanf
+# define isnanf(x) isnan ((float)(x))
+#endif
+/* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0. */
+#ifdef __DECC
+static float
+NaN ()
+{
+ static float zero = 0.0f;
+ return zero / zero;
+}
+#else
+# define NaN() (0.0f / 0.0f)
+#endif
+#define NWORDS \
+ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { unsigned int word[NWORDS]; float value; } memory_float;
+int main()
+{
+ int result = 0;
+
+ if (isnanf (1.0f / 0.0f))
+ result |= 1;
+
+ if (!isnanf (NaN ()))
+ result |= 2;
+
+#if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
+ /* The isnanf function should be immune against changes in the sign bit and
+ in the mantissa bits. The xor operation twiddles a bit that can only be
+ a sign bit or a mantissa bit. */
+ if (FLT_EXPBIT0_WORD == 0 && FLT_EXPBIT0_BIT > 0)
+ {
+ memory_float m;
+
+ m.value = NaN ();
+ /* Set the bits below the exponent to 01111...111. */
+ m.word[0] &= -1U << FLT_EXPBIT0_BIT;
+ m.word[0] |= (1U << (FLT_EXPBIT0_BIT - 1)) - 1;
+ if (!isnanf (m.value))
+ result |= 4;
+ }
+#endif
+
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_isnanf_works=yes
+else $as_nop
+ gl_cv_func_isnanf_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_works" >&5
+printf "%s\n" "$gl_cv_func_isnanf_works" >&6; }
+
+ fi
+ if test $gl_cv_func_isnanf_no_libm = yes \
+ && { case "$gl_cv_func_isnanf_works" in
+ *yes) true;;
+ *) false;;
+ esac
+ }; then
+ gl_func_isnanf_no_libm=yes
+
+printf "%s\n" "#define HAVE_ISNANF_IN_LIBC 1" >>confdefs.h
+
+ else
+ gl_func_isnanf_no_libm=no
+ fi
+
+ if test $gl_func_isnanf_no_libm != yes; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS isnanf.$ac_objext"
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'float'" >&5
+printf %s "checking where to find the exponent in a 'float'... " >&6; }
+if test ${gl_cv_cc_float_expbit0+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ gl_cv_cc_float_expbit0="word 0 bit 23"
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <float.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#define NWORDS \
+ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { float value; unsigned int word[NWORDS]; } memory_float;
+static unsigned int ored_words[NWORDS];
+static unsigned int anded_words[NWORDS];
+static void add_to_ored_words (float x)
+{
+ memory_float m;
+ size_t i;
+ /* Clear it first, in case
+ sizeof (float) < sizeof (memory_float). */
+ memset (&m, 0, sizeof (memory_float));
+ m.value = x;
+ for (i = 0; i < NWORDS; i++)
+ {
+ ored_words[i] |= m.word[i];
+ anded_words[i] &= m.word[i];
+ }
+}
+int main ()
+{
+ size_t j;
+ FILE *fp = fopen ("conftest.out", "w");
+ if (fp == NULL)
+ return 1;
+ for (j = 0; j < NWORDS; j++)
+ anded_words[j] = ~ (unsigned int) 0;
+ add_to_ored_words (0.25f);
+ add_to_ored_words (0.5f);
+ add_to_ored_words (1.0f);
+ add_to_ored_words (2.0f);
+ add_to_ored_words (4.0f);
+ /* Remove bits that are common (e.g. if representation of the first mantissa
+ bit is explicit). */
+ for (j = 0; j < NWORDS; j++)
+ ored_words[j] &= ~anded_words[j];
+ /* Now find the nonzero word. */
+ for (j = 0; j < NWORDS; j++)
+ if (ored_words[j] != 0)
+ break;
+ if (j < NWORDS)
+ {
+ size_t i;
+ for (i = j + 1; i < NWORDS; i++)
+ if (ored_words[i] != 0)
+ {
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+ }
+ for (i = 0; ; i++)
+ if ((ored_words[j] >> i) & 1)
+ {
+ fprintf (fp, "word %d bit %d", (int) j, (int) i);
+ return (fclose (fp) != 0);
+ }
+ }
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_cc_float_expbit0=`cat conftest.out`
+else $as_nop
+ gl_cv_cc_float_expbit0="unknown"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.out
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_expbit0" >&5
+printf "%s\n" "$gl_cv_cc_float_expbit0" >&6; }
+ case "$gl_cv_cc_float_expbit0" in
+ word*bit*)
+ word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
+ bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'`
+
+printf "%s\n" "#define FLT_EXPBIT0_WORD $word" >>confdefs.h
+
+
+printf "%s\n" "#define FLT_EXPBIT0_BIT $bit" >>confdefs.h
+
+ ;;
+ esac
+
+
+ fi
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used without linking with libm" >&5
+printf %s "checking whether isnan(long double) can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_isnanl_no_libm+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <math.h>
+ #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+ # undef isnanl
+ # define isnanl(x) __builtin_isnan ((long double)(x))
+ #elif defined isnan
+ # undef isnanl
+ # define isnanl(x) isnan ((long double)(x))
+ #endif
+ long double x;
+int
+main (void)
+{
+return isnanl (x);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_isnanl_no_libm=yes
+else $as_nop
+ gl_cv_func_isnanl_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_no_libm" >&5
+printf "%s\n" "$gl_cv_func_isnanl_no_libm" >&6; }
+
+ gl_func_isnanl_no_libm=$gl_cv_func_isnanl_no_libm
+ if test $gl_func_isnanl_no_libm = yes; then
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnanl works" >&5
+printf %s "checking whether isnanl works... " >&6; }
+if test ${gl_cv_func_isnanl_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ mingw*) # Guess yes on mingw, no on MSVC.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef __MINGW32__
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Known" >/dev/null 2>&1
+then :
+ gl_cv_func_isnanl_works="guessing yes"
+else $as_nop
+ gl_cv_func_isnanl_works="guessing no"
+fi
+rm -rf conftest*
+
+ ;;
+ *) gl_cv_func_isnanl_works="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+#if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+# undef isnanl
+# define isnanl(x) __builtin_isnan ((long double)(x))
+#elif defined isnan
+# undef isnanl
+# define isnanl(x) isnan ((long double)(x))
+#endif
+#define NWORDS \
+ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { unsigned int word[NWORDS]; long double value; }
+ memory_long_double;
+/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the
+ runtime type conversion. */
+#ifdef __sgi
+static long double NaNl ()
+{
+ double zero = 0.0;
+ return zero / zero;
+}
+#else
+# define NaNl() (0.0L / 0.0L)
+#endif
+int main ()
+{
+ int result = 0;
+
+ if (!isnanl (NaNl ()))
+ result |= 1;
+
+ {
+ memory_long_double m;
+ unsigned int i;
+
+ /* The isnanl function should be immune against changes in the sign bit and
+ in the mantissa bits. The xor operation twiddles a bit that can only be
+ a sign bit or a mantissa bit (since the exponent never extends to
+ bit 31). */
+ m.value = NaNl ();
+ m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+ for (i = 0; i < NWORDS; i++)
+ m.word[i] |= 1;
+ if (!isnanl (m.value))
+ result |= 1;
+ }
+
+#if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+/* Representation of an 80-bit 'long double' as an initializer for a sequence
+ of 'unsigned int' words. */
+# ifdef WORDS_BIGENDIAN
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+ ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \
+ (unsigned int) (mantlo) << 16 \
+ }
+# else
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { mantlo, manthi, exponent }
+# endif
+ { /* Quiet NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ if (!isnanl (x.value))
+ result |= 2;
+ }
+ {
+ /* Signalling NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ if (!isnanl (x.value))
+ result |= 2;
+ }
+ /* isnanl should return something even for noncanonical values. */
+ { /* Pseudo-NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ if (isnanl (x.value) && !isnanl (x.value))
+ result |= 4;
+ }
+ { /* Pseudo-Infinity. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ if (isnanl (x.value) && !isnanl (x.value))
+ result |= 8;
+ }
+ { /* Pseudo-Zero. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ if (isnanl (x.value) && !isnanl (x.value))
+ result |= 16;
+ }
+ { /* Unnormalized number. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ if (isnanl (x.value) && !isnanl (x.value))
+ result |= 32;
+ }
+ { /* Pseudo-Denormal. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ if (isnanl (x.value) && !isnanl (x.value))
+ result |= 64;
+ }
+#endif
+
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_isnanl_works=yes
+else $as_nop
+ gl_cv_func_isnanl_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_works" >&5
+printf "%s\n" "$gl_cv_func_isnanl_works" >&6; }
+
+ case "$gl_cv_func_isnanl_works" in
+ *yes) ;;
+ *) gl_func_isnanl_no_libm=no ;;
+ esac
+ fi
+ if test $gl_func_isnanl_no_libm = yes; then
+
+printf "%s\n" "#define HAVE_ISNANL_IN_LIBC 1" >>confdefs.h
+
+ fi
+
+ if test $gl_func_isnanl_no_libm != yes; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS isnanl.$ac_objext"
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'long double'" >&5
+printf %s "checking where to find the exponent in a 'long double'... " >&6; }
+if test ${gl_cv_cc_long_double_expbit0+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ gl_cv_cc_long_double_expbit0="unknown"
+ case "$host_os" in
+ mingw*) # On native Windows (little-endian), we know the result
+ # in two cases: mingw, MSVC.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef __MINGW32__
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Known" >/dev/null 2>&1
+then :
+ gl_cv_cc_long_double_expbit0="word 2 bit 0"
+fi
+rm -rf conftest*
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef _MSC_VER
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Known" >/dev/null 2>&1
+then :
+ gl_cv_cc_long_double_expbit0="word 1 bit 20"
+fi
+rm -rf conftest*
+
+ ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <float.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#define NWORDS \
+ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { long double value; unsigned int word[NWORDS]; }
+ memory_long_double;
+static unsigned int ored_words[NWORDS];
+static unsigned int anded_words[NWORDS];
+static void add_to_ored_words (long double *x)
+{
+ memory_long_double m;
+ size_t i;
+ /* Clear it first, in case
+ sizeof (long double) < sizeof (memory_long_double). */
+ memset (&m, 0, sizeof (memory_long_double));
+ m.value = *x;
+ for (i = 0; i < NWORDS; i++)
+ {
+ ored_words[i] |= m.word[i];
+ anded_words[i] &= m.word[i];
+ }
+}
+int main ()
+{
+ static long double samples[5] = { 0.25L, 0.5L, 1.0L, 2.0L, 4.0L };
+ size_t j;
+ FILE *fp = fopen ("conftest.out", "w");
+ if (fp == NULL)
+ return 1;
+ for (j = 0; j < NWORDS; j++)
+ anded_words[j] = ~ (unsigned int) 0;
+ for (j = 0; j < 5; j++)
+ add_to_ored_words (&samples[j]);
+ /* Remove bits that are common (e.g. if representation of the first mantissa
+ bit is explicit). */
+ for (j = 0; j < NWORDS; j++)
+ ored_words[j] &= ~anded_words[j];
+ /* Now find the nonzero word. */
+ for (j = 0; j < NWORDS; j++)
+ if (ored_words[j] != 0)
+ break;
+ if (j < NWORDS)
+ {
+ size_t i;
+ for (i = j + 1; i < NWORDS; i++)
+ if (ored_words[i] != 0)
+ {
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+ }
+ for (i = 0; ; i++)
+ if ((ored_words[j] >> i) & 1)
+ {
+ fprintf (fp, "word %d bit %d", (int) j, (int) i);
+ return (fclose (fp) != 0);
+ }
+ }
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_cc_long_double_expbit0=`cat conftest.out`
+else $as_nop
+ gl_cv_cc_long_double_expbit0="unknown"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.out
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_long_double_expbit0" >&5
+printf "%s\n" "$gl_cv_cc_long_double_expbit0" >&6; }
+ case "$gl_cv_cc_long_double_expbit0" in
+ word*bit*)
+ word=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
+ bit=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word.*bit //'`
+
+printf "%s\n" "#define LDBL_EXPBIT0_WORD $word" >>confdefs.h
+
+
+printf "%s\n" "#define LDBL_EXPBIT0_BIT $bit" >>confdefs.h
+
+ ;;
+ esac
+
+
+
+ fi
+
+
+
+
+
+ case "$GL_GENERATE_LIMITS_H" in
+ false) LIMITS_H='' ;;
+ true)
+ if test -z "$LIMITS_H"; then
+ LIMITS_H="${gl_source_base_prefix}limits.h"
+ fi
+ ;;
+ *) echo "*** GL_GENERATE_LIMITS_H is not set correctly" 1>&2; exit 1 ;;
+ esac
+
+
+ if $GL_GENERATE_LIMITS_H; then
+ GL_GENERATE_LIMITS_H_TRUE=
+ GL_GENERATE_LIMITS_H_FALSE='#'
+else
+ GL_GENERATE_LIMITS_H_TRUE='#'
+ GL_GENERATE_LIMITS_H_FALSE=
+fi
+:
+ if test -z "${GL_GENERATE_LIMITS_H_TRUE}" && test -z "${GL_GENERATE_LIMITS_H_FALSE}"; then
+ GL_GENERATE_LIMITS_H_TRUE='#'
+ GL_GENERATE_LIMITS_H_FALSE='#'
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ LOCALCHARSET_TESTS_ENVIRONMENT=
+
+
+
+
+
+
+
+
+
+
+ if test $REPLACE_MEMCHR = 1; then
+ GL_COND_OBJ_MEMCHR_TRUE=
+ GL_COND_OBJ_MEMCHR_FALSE='#'
+else
+ GL_COND_OBJ_MEMCHR_TRUE='#'
+ GL_COND_OBJ_MEMCHR_FALSE=
+fi
+:
+ if test -z "${GL_COND_OBJ_MEMCHR_TRUE}" && test -z "${GL_COND_OBJ_MEMCHR_FALSE}"; then
+ GL_COND_OBJ_MEMCHR_TRUE='#'
+ GL_COND_OBJ_MEMCHR_FALSE='#'
+ fi
+
+ if test -z "$GL_COND_OBJ_MEMCHR_TRUE"; then :
+
+
+ ac_fn_c_check_header_compile "$LINENO" "bp-sym.h" "ac_cv_header_bp_sym_h" "$ac_includes_default"
+if test "x$ac_cv_header_bp_sym_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_BP_SYM_H 1" >>confdefs.h
+
+fi
+
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_MEMCHR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_MEMCHR 1" >>confdefs.h
+
+
+
+
+
+
+ if test $gl_cv_func_frexp_no_libm = yes; then
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether frexp works" >&5
+printf %s "checking whether frexp works... " >&6; }
+if test ${gl_cv_func_frexp_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ netbsd* | irix*) gl_cv_func_frexp_works="guessing no" ;;
+ mingw*) # Guess yes with MSVC, no with mingw.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef _MSC_VER
+ Good
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Good" >/dev/null 2>&1
+then :
+ gl_cv_func_frexp_works="guessing yes"
+else $as_nop
+ gl_cv_func_frexp_works="guessing no"
+fi
+rm -rf conftest*
+
+ ;;
+ *) gl_cv_func_frexp_works="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <float.h>
+#include <math.h>
+#include <string.h>
+#if HAVE_DECL_ALARM
+# include <signal.h>
+# include <unistd.h>
+#endif
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+ ICC 10.0 has a bug when optimizing the expression -zero.
+ The expression -DBL_MIN * DBL_MIN does not work when cross-compiling
+ to PowerPC on Mac OS X 10.5. */
+#if defined __hpux || defined __sgi || defined __ICC
+static double
+compute_minus_zero (void)
+{
+ return -DBL_MIN * DBL_MIN;
+}
+# define minus_zero compute_minus_zero ()
+#else
+double minus_zero = -0.0;
+#endif
+int main()
+{
+ int result = 0;
+ int i;
+ volatile double x;
+ double zero = 0.0;
+#if HAVE_DECL_ALARM
+ /* NeXTstep 3.3 frexp() runs into an endless loop when called on an infinite
+ number. Let the test fail in this case. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (5);
+#endif
+ /* Test on denormalized numbers. */
+ for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5)
+ ;
+ if (x > 0.0)
+ {
+ int exp;
+ double y = frexp (x, &exp);
+ /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022.
+ On NetBSD: y = 0.75. Correct: y = 0.5. */
+ if (y != 0.5)
+ result |= 1;
+ }
+ /* Test on infinite numbers. */
+ x = 1.0 / zero;
+ {
+ int exp;
+ double y = frexp (x, &exp);
+ if (y != x)
+ result |= 2;
+ }
+ /* Test on negative zero. */
+ x = minus_zero;
+ {
+ int exp;
+ double y = frexp (x, &exp);
+ if (memcmp (&y, &x, sizeof x))
+ result |= 4;
+ }
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_frexp_works=yes
+else $as_nop
+ gl_cv_func_frexp_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexp_works" >&5
+printf "%s\n" "$gl_cv_func_frexp_works" >&6; }
+
+ case "$gl_cv_func_frexp_works" in
+ *yes)
+
+printf "%s\n" "#define HAVE_FREXP_IN_LIBC 1" >>confdefs.h
+
+ ;;
+ esac
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ldexp can be used without linking with libm" >&5
+printf %s "checking whether ldexp can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_ldexp_no_libm+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <math.h>
+ double x;
+ int y;
+int
+main (void)
+{
+return ldexp (x, y) < 1;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_ldexp_no_libm=yes
+else $as_nop
+ gl_cv_func_ldexp_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexp_no_libm" >&5
+printf "%s\n" "$gl_cv_func_ldexp_no_libm" >&6; }
+ if test $gl_cv_func_ldexp_no_libm = yes; then
+
+printf "%s\n" "#define HAVE_LDEXP_IN_LIBC 1" >>confdefs.h
+
+ fi
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether frexpl() can be used without linking with libm" >&5
+printf %s "checking whether frexpl() can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_frexpl_no_libm+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <math.h>
+ long double x;
+int
+main (void)
+{
+int e; return frexpl (x, &e) > 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_frexpl_no_libm=yes
+else $as_nop
+ gl_cv_func_frexpl_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_no_libm" >&5
+printf "%s\n" "$gl_cv_func_frexpl_no_libm" >&6; }
+
+ if test $gl_cv_func_frexpl_no_libm = yes; then
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether frexpl works" >&5
+printf %s "checking whether frexpl works... " >&6; }
+if test ${gl_cv_func_frexpl_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ aix | aix[3-6]* | beos* | darwin* | irix* | mingw* | pw*)
+ gl_cv_func_frexpl_works="guessing no";;
+ *) gl_cv_func_frexpl_works="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <float.h>
+#include <math.h>
+/* Override the values of <float.h>, like done in float.in.h. */
+#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP (-16381)
+#endif
+#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__)
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP (-16381)
+#endif
+#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP DBL_MIN_EXP
+#endif
+#if defined __sgi && (LDBL_MANT_DIG >= 106)
+# if defined __GNUC__
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP DBL_MIN_EXP
+# endif
+#endif
+extern
+#ifdef __cplusplus
+"C"
+#endif
+long double frexpl (long double, int *);
+long double zero = 0.0L;
+int main()
+{
+ int result = 0;
+ volatile long double x;
+ /* Test on finite numbers that fails on AIX 5.1. */
+ x = 16.0L;
+ {
+ int exp = -9999;
+ frexpl (x, &exp);
+ if (exp != 5)
+ result |= 1;
+ }
+ /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl
+ function returns an invalid (incorrectly normalized) value: it returns
+ y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 }
+ but the correct result is
+ 0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 } */
+ x = 1.01L;
+ {
+ int exp = -9999;
+ long double y = frexpl (x, &exp);
+ if (!(exp == 1 && y == 0.505L))
+ result |= 2;
+ }
+ /* Test on large finite numbers. This fails on BeOS at i = 16322, while
+ LDBL_MAX_EXP = 16384.
+ In the loop end test, we test x against Infinity, rather than comparing
+ i with LDBL_MAX_EXP, because BeOS <float.h> has a wrong LDBL_MAX_EXP. */
+ {
+ int i;
+ for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L)
+ {
+ int exp = -9999;
+ frexpl (x, &exp);
+ if (exp != i)
+ {
+ result |= 4;
+ break;
+ }
+ }
+ }
+ /* Test on denormalized numbers. */
+ {
+ int i;
+ for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L)
+ ;
+ if (x > 0.0L)
+ {
+ int exp;
+ long double y = frexpl (x, &exp);
+ /* On machines with IEEE854 arithmetic: x = 1.68105e-4932,
+ exp = -16382, y = 0.5. On Mac OS X 10.5: exp = -16384, y = 0.5. */
+ if (exp != LDBL_MIN_EXP - 1)
+ result |= 8;
+ }
+ }
+ /* Test on infinite numbers. */
+ /* The Microsoft MSVC 14 compiler chokes on the expression 1.0 / 0.0. */
+ x = 1.0L / zero;
+ {
+ int exp;
+ long double y = frexpl (x, &exp);
+ if (y != x)
+ result |= 16;
+ }
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_frexpl_works=yes
+else $as_nop
+ gl_cv_func_frexpl_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_works" >&5
+printf "%s\n" "$gl_cv_func_frexpl_works" >&6; }
+
+ case "$gl_cv_func_frexpl_works" in
+ *yes) gl_func_frexpl_no_libm=yes ;;
+ *) gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;;
+ esac
+ else
+ gl_func_frexpl_no_libm=no
+ REPLACE_FREXPL=1
+ fi
+ if test $gl_func_frexpl_no_libm = yes; then
+
+printf "%s\n" "#define HAVE_FREXPL_IN_LIBC 1" >>confdefs.h
+
+ ac_fn_check_decl "$LINENO" "frexpl" "ac_cv_have_decl_frexpl" "#include <math.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_frexpl" = xyes
+then :
+
+else $as_nop
+ HAVE_DECL_FREXPL=0
+fi
+ fi
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ldexpl() can be used without linking with libm" >&5
+printf %s "checking whether ldexpl() can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_ldexpl_no_libm+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <math.h>
+ long double x;
+int
+main (void)
+{
+return ldexpl (x, -1) > 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_ldexpl_no_libm=yes
+else $as_nop
+ gl_cv_func_ldexpl_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_no_libm" >&5
+printf "%s\n" "$gl_cv_func_ldexpl_no_libm" >&6; }
+
+ if test $gl_cv_func_ldexpl_no_libm = yes; then
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ldexpl works" >&5
+printf %s "checking whether ldexpl works... " >&6; }
+if test ${gl_cv_func_ldexpl_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ aix | aix[3-6]*) gl_cv_func_ldexpl_works="guessing no" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_ldexpl_works="guessing yes" ;;
+ *) gl_cv_func_ldexpl_works="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <math.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+long double ldexpl (long double, int);
+int main()
+{
+ int result = 0;
+ {
+ volatile long double x = 1.0;
+ volatile long double y = ldexpl (x, -1);
+ if (y != 0.5L)
+ result |= 1;
+ }
+ {
+ volatile long double x = 1.73205L;
+ volatile long double y = ldexpl (x, 0);
+ if (y != x)
+ result |= 2;
+ }
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_ldexpl_works=yes
+else $as_nop
+ gl_cv_func_ldexpl_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_works" >&5
+printf "%s\n" "$gl_cv_func_ldexpl_works" >&6; }
+
+ case "$gl_cv_func_ldexpl_works" in
+ *yes)
+
+printf "%s\n" "#define HAVE_LDEXPL_IN_LIBC 1" >>confdefs.h
+
+ ac_fn_check_decl "$LINENO" "ldexpl" "ac_cv_have_decl_ldexpl" "#include <math.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_ldexpl" = xyes
+then :
+
+else $as_nop
+ HAVE_DECL_LDEXPL=0
+fi
+ ;;
+ esac
+ fi
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for signbit macro" >&5
+printf %s "checking for signbit macro... " >&6; }
+if test ${gl_cv_func_signbit+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_signbit="guessing yes" ;;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_signbit="guessing yes" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_signbit="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_signbit="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <math.h>
+/* If signbit is defined as a function, don't use it, since calling it for
+ 'float' or 'long double' arguments would involve conversions.
+ If signbit is not declared at all but exists as a library function, don't
+ use it, since the prototype may not match.
+ If signbit is not declared at all but exists as a compiler built-in, don't
+ use it, since it's preferable to use __builtin_signbit* (no warnings,
+ no conversions). */
+#ifndef signbit
+# error "signbit should be a macro"
+#endif
+#include <string.h>
+
+/* Global variables.
+ Needed because GCC 4 constant-folds __builtin_signbitl (literal)
+ but cannot constant-fold __builtin_signbitl (variable). */
+float vf;
+double vd;
+long double vl;
+int main ()
+{
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+ So we use -p0f and -p0d instead. */
+float p0f = 0.0f;
+float m0f = -p0f;
+double p0d = 0.0;
+double m0d = -p0d;
+/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
+ So we use another constant expression instead.
+ But that expression does not work on other platforms, such as when
+ cross-compiling to PowerPC on Mac OS X 10.5. */
+long double p0l = 0.0L;
+#if defined __hpux || defined __sgi
+long double m0l = -LDBL_MIN * LDBL_MIN;
+#else
+long double m0l = -p0l;
+#endif
+ int result = 0;
+ if (signbit (vf)) /* link check */
+ vf++;
+ {
+ float plus_inf = 1.0f / p0f;
+ float minus_inf = -1.0f / p0f;
+ if (!(!signbit (255.0f)
+ && signbit (-255.0f)
+ && !signbit (p0f)
+ && (memcmp (&m0f, &p0f, sizeof (float)) == 0 || signbit (m0f))
+ && !signbit (plus_inf)
+ && signbit (minus_inf)))
+ result |= 1;
+ }
+ if (signbit (vd)) /* link check */
+ vd++;
+ {
+ double plus_inf = 1.0 / p0d;
+ double minus_inf = -1.0 / p0d;
+ if (!(!signbit (255.0)
+ && signbit (-255.0)
+ && !signbit (p0d)
+ && (memcmp (&m0d, &p0d, sizeof (double)) == 0 || signbit (m0d))
+ && !signbit (plus_inf)
+ && signbit (minus_inf)))
+ result |= 2;
+ }
+ if (signbit (vl)) /* link check */
+ vl++;
+ {
+ long double plus_inf = 1.0L / p0l;
+ long double minus_inf = -1.0L / p0l;
+ if (signbit (255.0L))
+ result |= 4;
+ if (!signbit (-255.0L))
+ result |= 4;
+ if (signbit (p0l))
+ result |= 8;
+ if (!(memcmp (&m0l, &p0l, sizeof (long double)) == 0 || signbit (m0l)))
+ result |= 16;
+ if (signbit (plus_inf))
+ result |= 32;
+ if (!signbit (minus_inf))
+ result |= 64;
+ }
+ return result;
+}
+
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_signbit=yes
+else $as_nop
+ gl_cv_func_signbit=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_signbit" >&5
+printf "%s\n" "$gl_cv_func_signbit" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for signbit compiler built-ins" >&5
+printf %s "checking for signbit compiler built-ins... " >&6; }
+if test ${gl_cv_func_signbit_builtins+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_signbit_builtins="guessing yes" ;;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_signbit_builtins="guessing yes" ;;
+ # Guess yes on mingw, no on MSVC.
+ mingw*) if test -n "$GCC"; then
+ gl_cv_func_signbit_builtins="guessing yes"
+ else
+ gl_cv_func_signbit_builtins="guessing no"
+ fi
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_signbit_builtins="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+# define signbit(x) \
+ (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \
+ sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \
+ __builtin_signbitf (x))
+#else
+# error "signbit should be three compiler built-ins"
+#endif
+#include <string.h>
+
+/* Global variables.
+ Needed because GCC 4 constant-folds __builtin_signbitl (literal)
+ but cannot constant-fold __builtin_signbitl (variable). */
+float vf;
+double vd;
+long double vl;
+int main ()
+{
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+ So we use -p0f and -p0d instead. */
+float p0f = 0.0f;
+float m0f = -p0f;
+double p0d = 0.0;
+double m0d = -p0d;
+/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
+ So we use another constant expression instead.
+ But that expression does not work on other platforms, such as when
+ cross-compiling to PowerPC on Mac OS X 10.5. */
+long double p0l = 0.0L;
+#if defined __hpux || defined __sgi
+long double m0l = -LDBL_MIN * LDBL_MIN;
+#else
+long double m0l = -p0l;
+#endif
+ int result = 0;
+ if (signbit (vf)) /* link check */
+ vf++;
+ {
+ float plus_inf = 1.0f / p0f;
+ float minus_inf = -1.0f / p0f;
+ if (!(!signbit (255.0f)
+ && signbit (-255.0f)
+ && !signbit (p0f)
+ && (memcmp (&m0f, &p0f, sizeof (float)) == 0 || signbit (m0f))
+ && !signbit (plus_inf)
+ && signbit (minus_inf)))
+ result |= 1;
+ }
+ if (signbit (vd)) /* link check */
+ vd++;
+ {
+ double plus_inf = 1.0 / p0d;
+ double minus_inf = -1.0 / p0d;
+ if (!(!signbit (255.0)
+ && signbit (-255.0)
+ && !signbit (p0d)
+ && (memcmp (&m0d, &p0d, sizeof (double)) == 0 || signbit (m0d))
+ && !signbit (plus_inf)
+ && signbit (minus_inf)))
+ result |= 2;
+ }
+ if (signbit (vl)) /* link check */
+ vl++;
+ {
+ long double plus_inf = 1.0L / p0l;
+ long double minus_inf = -1.0L / p0l;
+ if (signbit (255.0L))
+ result |= 4;
+ if (!signbit (-255.0L))
+ result |= 4;
+ if (signbit (p0l))
+ result |= 8;
+ if (!(memcmp (&m0l, &p0l, sizeof (long double)) == 0 || signbit (m0l)))
+ result |= 16;
+ if (signbit (plus_inf))
+ result |= 32;
+ if (!signbit (minus_inf))
+ result |= 64;
+ }
+ return result;
+}
+
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_signbit_builtins=yes
+else $as_nop
+ gl_cv_func_signbit_builtins=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_signbit_builtins" >&5
+printf "%s\n" "$gl_cv_func_signbit_builtins" >&6; }
+ case "$gl_cv_func_signbit_builtins" in
+ *yes)
+ REPLACE_SIGNBIT_USING_BUILTINS=1
+ ;;
+ *)
+ case "$gl_cv_func_signbit" in
+ *yes) ;;
+ *)
+ REPLACE_SIGNBIT=1
+ ;;
+ esac
+ ;;
+ esac
+ case "$host_os" in
+ solaris*)
+ REPLACE_SIGNBIT=1
+ ;;
+ esac
+ if test $REPLACE_SIGNBIT = 1; then
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the sign bit in a 'float'" >&5
+printf %s "checking where to find the sign bit in a 'float'... " >&6; }
+if test ${gl_cv_cc_float_signbit+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ gl_cv_cc_float_signbit="unknown"
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stddef.h>
+#include <stdio.h>
+#define NWORDS \
+ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { float value; unsigned int word[NWORDS]; }
+ memory_float;
+static memory_float plus = { 1.0f };
+static memory_float minus = { -1.0f };
+int main ()
+{
+ size_t j, k, i;
+ unsigned int m;
+ FILE *fp = fopen ("conftest.out", "w");
+ if (fp == NULL)
+ return 1;
+ /* Find the different bit. */
+ k = 0; m = 0;
+ for (j = 0; j < NWORDS; j++)
+ {
+ unsigned int x = plus.word[j] ^ minus.word[j];
+ if ((x & (x - 1)) || (x && m))
+ {
+ /* More than one bit difference. */
+ fprintf (fp, "unknown");
+ fclose (fp);
+ return 2;
+ }
+ if (x)
+ {
+ k = j;
+ m = x;
+ }
+ }
+ if (m == 0)
+ {
+ /* No difference. */
+ fprintf (fp, "unknown");
+ fclose (fp);
+ return 3;
+ }
+ /* Now m = plus.word[k] ^ ~minus.word[k]. */
+ if (plus.word[k] & ~minus.word[k])
+ {
+ /* Oh? The sign bit is set in the positive and cleared in the negative
+ numbers? */
+ fprintf (fp, "unknown");
+ fclose (fp);
+ return 4;
+ }
+ for (i = 0; ; i++)
+ if ((m >> i) & 1)
+ break;
+ fprintf (fp, "word %d bit %d", (int) k, (int) i);
+ if (fclose (fp) != 0)
+ return 5;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_cc_float_signbit=`cat conftest.out`
+else $as_nop
+ gl_cv_cc_float_signbit="unknown"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.out
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_signbit" >&5
+printf "%s\n" "$gl_cv_cc_float_signbit" >&6; }
+ case "$gl_cv_cc_float_signbit" in
+ word*bit*)
+ word=`echo "$gl_cv_cc_float_signbit" | sed -e 's/word //' -e 's/ bit.*//'`
+ bit=`echo "$gl_cv_cc_float_signbit" | sed -e 's/word.*bit //'`
+
+printf "%s\n" "#define FLT_SIGNBIT_WORD $word" >>confdefs.h
+
+
+printf "%s\n" "#define FLT_SIGNBIT_BIT $bit" >>confdefs.h
+
+ ;;
+ esac
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the sign bit in a 'double'" >&5
+printf %s "checking where to find the sign bit in a 'double'... " >&6; }
+if test ${gl_cv_cc_double_signbit+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ gl_cv_cc_double_signbit="unknown"
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stddef.h>
+#include <stdio.h>
+#define NWORDS \
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { double value; unsigned int word[NWORDS]; }
+ memory_float;
+static memory_float plus = { 1.0 };
+static memory_float minus = { -1.0 };
+int main ()
+{
+ size_t j, k, i;
+ unsigned int m;
+ FILE *fp = fopen ("conftest.out", "w");
+ if (fp == NULL)
+ return 1;
+ /* Find the different bit. */
+ k = 0; m = 0;
+ for (j = 0; j < NWORDS; j++)
+ {
+ unsigned int x = plus.word[j] ^ minus.word[j];
+ if ((x & (x - 1)) || (x && m))
+ {
+ /* More than one bit difference. */
+ fprintf (fp, "unknown");
+ fclose (fp);
+ return 2;
+ }
+ if (x)
+ {
+ k = j;
+ m = x;
+ }
+ }
+ if (m == 0)
+ {
+ /* No difference. */
+ fprintf (fp, "unknown");
+ fclose (fp);
+ return 3;
+ }
+ /* Now m = plus.word[k] ^ ~minus.word[k]. */
+ if (plus.word[k] & ~minus.word[k])
+ {
+ /* Oh? The sign bit is set in the positive and cleared in the negative
+ numbers? */
+ fprintf (fp, "unknown");
+ fclose (fp);
+ return 4;
+ }
+ for (i = 0; ; i++)
+ if ((m >> i) & 1)
+ break;
+ fprintf (fp, "word %d bit %d", (int) k, (int) i);
+ if (fclose (fp) != 0)
+ return 5;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_cc_double_signbit=`cat conftest.out`
+else $as_nop
+ gl_cv_cc_double_signbit="unknown"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.out
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_double_signbit" >&5
+printf "%s\n" "$gl_cv_cc_double_signbit" >&6; }
+ case "$gl_cv_cc_double_signbit" in
+ word*bit*)
+ word=`echo "$gl_cv_cc_double_signbit" | sed -e 's/word //' -e 's/ bit.*//'`
+ bit=`echo "$gl_cv_cc_double_signbit" | sed -e 's/word.*bit //'`
+
+printf "%s\n" "#define DBL_SIGNBIT_WORD $word" >>confdefs.h
+
+
+printf "%s\n" "#define DBL_SIGNBIT_BIT $bit" >>confdefs.h
+
+ ;;
+ esac
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the sign bit in a 'long double'" >&5
+printf %s "checking where to find the sign bit in a 'long double'... " >&6; }
+if test ${gl_cv_cc_long_double_signbit+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ gl_cv_cc_long_double_signbit="unknown"
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stddef.h>
+#include <stdio.h>
+#define NWORDS \
+ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { long double value; unsigned int word[NWORDS]; }
+ memory_float;
+static memory_float plus = { 1.0L };
+static memory_float minus = { -1.0L };
+int main ()
+{
+ size_t j, k, i;
+ unsigned int m;
+ FILE *fp = fopen ("conftest.out", "w");
+ if (fp == NULL)
+ return 1;
+ /* Find the different bit. */
+ k = 0; m = 0;
+ for (j = 0; j < NWORDS; j++)
+ {
+ unsigned int x = plus.word[j] ^ minus.word[j];
+ if ((x & (x - 1)) || (x && m))
+ {
+ /* More than one bit difference. */
+ fprintf (fp, "unknown");
+ fclose (fp);
+ return 2;
+ }
+ if (x)
+ {
+ k = j;
+ m = x;
+ }
+ }
+ if (m == 0)
+ {
+ /* No difference. */
+ fprintf (fp, "unknown");
+ fclose (fp);
+ return 3;
+ }
+ /* Now m = plus.word[k] ^ ~minus.word[k]. */
+ if (plus.word[k] & ~minus.word[k])
+ {
+ /* Oh? The sign bit is set in the positive and cleared in the negative
+ numbers? */
+ fprintf (fp, "unknown");
+ fclose (fp);
+ return 4;
+ }
+ for (i = 0; ; i++)
+ if ((m >> i) & 1)
+ break;
+ fprintf (fp, "word %d bit %d", (int) k, (int) i);
+ if (fclose (fp) != 0)
+ return 5;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_cc_long_double_signbit=`cat conftest.out`
+else $as_nop
+ gl_cv_cc_long_double_signbit="unknown"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.out
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_long_double_signbit" >&5
+printf "%s\n" "$gl_cv_cc_long_double_signbit" >&6; }
+ case "$gl_cv_cc_long_double_signbit" in
+ word*bit*)
+ word=`echo "$gl_cv_cc_long_double_signbit" | sed -e 's/word //' -e 's/ bit.*//'`
+ bit=`echo "$gl_cv_cc_long_double_signbit" | sed -e 's/word.*bit //'`
+
+printf "%s\n" "#define LDBL_SIGNBIT_WORD $word" >>confdefs.h
+
+
+printf "%s\n" "#define LDBL_SIGNBIT_BIT $bit" >>confdefs.h
+
+ ;;
+ esac
+
+
+ if test "$gl_cv_cc_float_signbit" = unknown; then
+ ac_fn_check_decl "$LINENO" "copysignf" "ac_cv_have_decl_copysignf" "#include <math.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_copysignf" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_COPYSIGNF $ac_have_decl" >>confdefs.h
+
+ if test "$ac_cv_have_decl_copysignf" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether copysignf can be used without linking with libm" >&5
+printf %s "checking whether copysignf can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_copysignf_no_libm+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <math.h>
+ float x, y;
+int
+main (void)
+{
+return copysignf (x, y) < 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_copysignf_no_libm=yes
+else $as_nop
+ gl_cv_func_copysignf_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_copysignf_no_libm" >&5
+printf "%s\n" "$gl_cv_func_copysignf_no_libm" >&6; }
+ if test $gl_cv_func_copysignf_no_libm = yes; then
+
+printf "%s\n" "#define HAVE_COPYSIGNF_IN_LIBC 1" >>confdefs.h
+
+ fi
+ fi
+ fi
+ if test "$gl_cv_cc_double_signbit" = unknown; then
+ ac_fn_check_decl "$LINENO" "copysign" "ac_cv_have_decl_copysign" "#include <math.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_copysign" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_COPYSIGN $ac_have_decl" >>confdefs.h
+
+ if test "$ac_cv_have_decl_copysign" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether copysign can be used without linking with libm" >&5
+printf %s "checking whether copysign can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_copysign_no_libm+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <math.h>
+ double x, y;
+int
+main (void)
+{
+return copysign (x, y) < 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_copysign_no_libm=yes
+else $as_nop
+ gl_cv_func_copysign_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_copysign_no_libm" >&5
+printf "%s\n" "$gl_cv_func_copysign_no_libm" >&6; }
+ if test $gl_cv_func_copysign_no_libm = yes; then
+
+printf "%s\n" "#define HAVE_COPYSIGN_IN_LIBC 1" >>confdefs.h
+
+ fi
+ fi
+ fi
+ if test "$gl_cv_cc_long_double_signbit" = unknown; then
+ ac_fn_check_decl "$LINENO" "copysignl" "ac_cv_have_decl_copysignl" "#include <math.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_copysignl" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_COPYSIGNL $ac_have_decl" >>confdefs.h
+
+ if test "$ac_cv_have_decl_copysignl" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether copysignl can be used without linking with libm" >&5
+printf %s "checking whether copysignl can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_copysignl_no_libm+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <math.h>
+ long double x, y;
+int
+main (void)
+{
+return copysignl (x, y) < 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_copysignl_no_libm=yes
+else $as_nop
+ gl_cv_func_copysignl_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_copysignl_no_libm" >&5
+printf "%s\n" "$gl_cv_func_copysignl_no_libm" >&6; }
+ if test $gl_cv_func_copysignl_no_libm = yes; then
+
+printf "%s\n" "#define HAVE_COPYSIGNL_IN_LIBC 1" >>confdefs.h
+
+ fi
+ fi
+ fi
+ fi
+
+
+ if test $REPLACE_SIGNBIT = 1; then
+ GL_COND_OBJ_SIGNBIT3_TRUE=
+ GL_COND_OBJ_SIGNBIT3_FALSE='#'
+else
+ GL_COND_OBJ_SIGNBIT3_TRUE='#'
+ GL_COND_OBJ_SIGNBIT3_FALSE=
+fi
+:
+ if test -z "${GL_COND_OBJ_SIGNBIT3_TRUE}" && test -z "${GL_COND_OBJ_SIGNBIT3_FALSE}"; then
+ GL_COND_OBJ_SIGNBIT3_TRUE='#'
+ GL_COND_OBJ_SIGNBIT3_FALSE='#'
+ fi
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_SIGNBIT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_SIGNBIT 1" >>confdefs.h
+
+
+
+
+ ac_fn_c_check_header_compile "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdint_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_STDINT_H 1" >>confdefs.h
+
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SIZE_MAX" >&5
+printf %s "checking for SIZE_MAX... " >&6; }
+if test ${gl_cv_size_max+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_cv_size_max=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <limits.h>
+#if HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef SIZE_MAX
+Found it
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Found it" >/dev/null 2>&1
+then :
+ gl_cv_size_max=yes
+fi
+rm -rf conftest*
+
+ if test $gl_cv_size_max != yes; then
+ if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) * CHAR_BIT - 1" "size_t_bits_minus_1" "#include <stddef.h>
+#include <limits.h>"
+then :
+
+else $as_nop
+ size_t_bits_minus_1=
+fi
+
+ if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) <= sizeof (unsigned int)" "fits_in_uint" "#include <stddef.h>"
+then :
+
+else $as_nop
+ fits_in_uint=
+fi
+
+ if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then
+ if test $fits_in_uint = 1; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stddef.h>
+ extern size_t foo;
+ extern unsigned long foo;
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ fits_in_uint=0
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ fi
+ if test $fits_in_uint = 1; then
+ gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)"
+ else
+ gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)"
+ fi
+ else
+ gl_cv_size_max='((size_t)~(size_t)0)'
+ fi
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_size_max" >&5
+printf "%s\n" "$gl_cv_size_max" >&6; }
+ if test "$gl_cv_size_max" != yes; then
+
+printf "%s\n" "#define SIZE_MAX $gl_cv_size_max" >>confdefs.h
+
+ fi
+
+
+
+
+ gl_cv_func_snprintf_usable=no
+ ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf"
+if test "x$ac_cv_func_snprintf" = xyes
+then :
+ printf "%s\n" "#define HAVE_SNPRINTF 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_snprintf = yes; then
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5
+printf %s "checking whether snprintf respects a size of 1... " >&6; }
+if test ${gl_cv_func_snprintf_size1+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_snprintf_size1="guessing yes" ;;
+ *) gl_cv_func_snprintf_size1="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+ va_list args;
+ int ret;
+ va_start (args, format);
+ ret = vsnprintf (buf, size, format, args);
+ va_end (args);
+ return ret;
+}
+#endif
+int main()
+{
+ static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+ my_snprintf (buf, 1, "%d", 12345);
+ return buf[1] != 'E';
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_snprintf_size1=yes
+else $as_nop
+ gl_cv_func_snprintf_size1=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5
+printf "%s\n" "$gl_cv_func_snprintf_size1" >&6; }
+
+ case "$gl_cv_func_snprintf_size1" in
+ *yes)
+
+ case "$gl_cv_func_snprintf_retval_c99" in
+ *yes)
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5
+printf %s "checking whether printf supports POSIX/XSI format strings with positions... " >&6; }
+if test ${gl_cv_func_printf_positions+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
+ gl_cv_func_printf_positions="guessing no";;
+ beos*) gl_cv_func_printf_positions="guessing no";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_printf_positions="guessing yes";;
+ # Guess no on native Windows.
+ mingw* | pw*) gl_cv_func_printf_positions="guessing no";;
+ *) gl_cv_func_printf_positions="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <string.h>
+/* The string "%2$d %1$d", with dollar characters protected from the shell's
+ dollar expansion (possibly an autoconf bug). */
+static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
+static char buf[100];
+int main ()
+{
+ sprintf (buf, format, 33, 55);
+ return (strcmp (buf, "55 33") != 0);
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_printf_positions=yes
+else $as_nop
+ gl_cv_func_printf_positions=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5
+printf "%s\n" "$gl_cv_func_printf_positions" >&6; }
+
+ case "$gl_cv_func_printf_positions" in
+ *yes)
+ gl_cv_func_snprintf_usable=yes
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ if test $gl_cv_func_snprintf_usable = no; then
+
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS snprintf.$ac_objext"
+
+ if test $ac_cv_func_snprintf = yes; then
+ REPLACE_SNPRINTF=1
+ else
+
+ if test $ac_cv_have_decl_snprintf = yes; then
+ REPLACE_SNPRINTF=1
+ fi
+ fi
+ :
+
+ fi
+
+ if test $ac_cv_have_decl_snprintf = no; then
+ HAVE_DECL_SNPRINTF=0
+ fi
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_SNPRINTF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_SNPRINTF 1" >>confdefs.h
+
+
+
+
+
+printf "%s\n" "#define GNULIB_SNPRINTF 1" >>confdefs.h
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ssize_t" >&5
+printf %s "checking for ssize_t... " >&6; }
+if test ${gt_cv_ssize_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+int
+main (void)
+{
+int x = sizeof (ssize_t *) + sizeof (ssize_t);
+ return !x;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gt_cv_ssize_t=yes
+else $as_nop
+ gt_cv_ssize_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_ssize_t" >&5
+printf "%s\n" "$gt_cv_ssize_t" >&6; }
+ if test $gt_cv_ssize_t = no; then
+
+printf "%s\n" "#define ssize_t int" >>confdefs.h
+
+ fi
+
+
+
+
+
+ if test "$ac_cv_header_stdbool_h" = yes; then
+ case "$host_os" in
+ solaris*)
+ if test -z "$GCC"; then
+ GL_GENERATE_STDBOOL_H=true
+ else
+ GL_GENERATE_STDBOOL_H=false
+ fi
+ ;;
+ *)
+ GL_GENERATE_STDBOOL_H=false
+ ;;
+ esac
+ else
+ GL_GENERATE_STDBOOL_H=true
+ fi
+
+ if test "$ac_cv_type__Bool" = yes; then
+ HAVE__BOOL=1
+ else
+ HAVE__BOOL=0
+ fi
+
+
+
+
+
+
+ case "$GL_GENERATE_STDBOOL_H" in
+ false) STDBOOL_H='' ;;
+ true)
+ if test -z "$STDBOOL_H"; then
+ STDBOOL_H="${gl_source_base_prefix}stdbool.h"
+ fi
+ ;;
+ *) echo "*** GL_GENERATE_STDBOOL_H is not set correctly" 1>&2; exit 1 ;;
+ esac
+
+
+ if $GL_GENERATE_STDBOOL_H; then
+ GL_GENERATE_STDBOOL_H_TRUE=
+ GL_GENERATE_STDBOOL_H_FALSE='#'
+else
+ GL_GENERATE_STDBOOL_H_TRUE='#'
+ GL_GENERATE_STDBOOL_H_FALSE=
+fi
+:
+ if test -z "${GL_GENERATE_STDBOOL_H_TRUE}" && test -z "${GL_GENERATE_STDBOOL_H_FALSE}"; then
+ GL_GENERATE_STDBOOL_H_TRUE='#'
+ GL_GENERATE_STDBOOL_H_FALSE='#'
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ case "$GL_GENERATE_STDDEF_H" in
+ false) STDDEF_H='' ;;
+ true)
+ if test -z "$STDDEF_H"; then
+ STDDEF_H="${gl_source_base_prefix}stddef.h"
+ fi
+ ;;
+ *) echo "*** GL_GENERATE_STDDEF_H is not set correctly" 1>&2; exit 1 ;;
+ esac
+
+
+ if $GL_GENERATE_STDDEF_H; then
+ GL_GENERATE_STDDEF_H_TRUE=
+ GL_GENERATE_STDDEF_H_FALSE='#'
+else
+ GL_GENERATE_STDDEF_H_TRUE='#'
+ GL_GENERATE_STDDEF_H_FALSE=
+fi
+:
+ if test -z "${GL_GENERATE_STDDEF_H_TRUE}" && test -z "${GL_GENERATE_STDDEF_H_FALSE}"; then
+ GL_GENERATE_STDDEF_H_TRUE='#'
+ GL_GENERATE_STDDEF_H_FALSE='#'
+ fi
+
+
+
+
+
+
+
+
+
+
+
+ case "$GL_GENERATE_STDINT_H" in
+ false) STDINT_H='' ;;
+ true)
+ if test -z "$STDINT_H"; then
+ STDINT_H="${gl_source_base_prefix}stdint.h"
+ fi
+ ;;
+ *) echo "*** GL_GENERATE_STDINT_H is not set correctly" 1>&2; exit 1 ;;
+ esac
+
+
+ if $GL_GENERATE_STDINT_H; then
+ GL_GENERATE_STDINT_H_TRUE=
+ GL_GENERATE_STDINT_H_FALSE='#'
+else
+ GL_GENERATE_STDINT_H_TRUE='#'
+ GL_GENERATE_STDINT_H_FALSE=
+fi
+:
+ if test -z "${GL_GENERATE_STDINT_H_TRUE}" && test -z "${GL_GENERATE_STDINT_H_FALSE}"; then
+ GL_GENERATE_STDINT_H_TRUE='#'
+ GL_GENERATE_STDINT_H_FALSE='#'
+ fi
+
+
+
+
+
+
+
+
+
+ case "$GL_GENERATE_LIMITS_H" in
+ false) LIMITS_H='' ;;
+ true)
+ if test -z "$LIMITS_H"; then
+ LIMITS_H="${gl_source_base_prefix}limits.h"
+ fi
+ ;;
+ *) echo "*** GL_GENERATE_LIMITS_H is not set correctly" 1>&2; exit 1 ;;
+ esac
+
+
+ if $GL_GENERATE_LIMITS_H; then
+ GL_GENERATE_LIMITS_H_TRUE=
+ GL_GENERATE_LIMITS_H_FALSE='#'
+else
+ GL_GENERATE_LIMITS_H_TRUE='#'
+ GL_GENERATE_LIMITS_H_FALSE=
+fi
+:
+ if test -z "${GL_GENERATE_LIMITS_H_TRUE}" && test -z "${GL_GENERATE_LIMITS_H_FALSE}"; then
+ GL_GENERATE_LIMITS_H_TRUE='#'
+ GL_GENERATE_LIMITS_H_FALSE='#'
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $REPLACE_STDIO_READ_FUNCS = 1; then
+ GL_COND_OBJ_STDIO_READ_TRUE=
+ GL_COND_OBJ_STDIO_READ_FALSE='#'
+else
+ GL_COND_OBJ_STDIO_READ_TRUE='#'
+ GL_COND_OBJ_STDIO_READ_FALSE=
+fi
+:
+ if test -z "${GL_COND_OBJ_STDIO_READ_TRUE}" && test -z "${GL_COND_OBJ_STDIO_READ_FALSE}"; then
+ GL_COND_OBJ_STDIO_READ_TRUE='#'
+ GL_COND_OBJ_STDIO_READ_FALSE='#'
+ fi
+
+
+ if test $REPLACE_STDIO_WRITE_FUNCS = 1; then
+ GL_COND_OBJ_STDIO_WRITE_TRUE=
+ GL_COND_OBJ_STDIO_WRITE_FALSE='#'
+else
+ GL_COND_OBJ_STDIO_WRITE_TRUE='#'
+ GL_COND_OBJ_STDIO_WRITE_FALSE=
+fi
+:
+ if test -z "${GL_COND_OBJ_STDIO_WRITE_TRUE}" && test -z "${GL_COND_OBJ_STDIO_WRITE_FALSE}"; then
+ GL_COND_OBJ_STDIO_WRITE_TRUE='#'
+ GL_COND_OBJ_STDIO_WRITE_FALSE='#'
+ fi
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_FSCANF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FSCANF 1" >>confdefs.h
+
+
+
+
+
+printf "%s\n" "#define GNULIB_FSCANF 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_SCANF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_SCANF 1" >>confdefs.h
+
+
+
+
+
+printf "%s\n" "#define GNULIB_SCANF 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_FGETC=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FGETC 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_GETC=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETC 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_GETCHAR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETCHAR 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_FGETS=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FGETS 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_FREAD=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FREAD 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_FPRINTF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FPRINTF 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_PRINTF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_PRINTF 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_VFPRINTF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_VFPRINTF 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_VPRINTF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_VPRINTF 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_FPUTC=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FPUTC 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_PUTC=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_PUTC 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_PUTCHAR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_PUTCHAR 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_FPUTS=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FPUTS 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_PUTS=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_PUTS 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_FWRITE=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FWRITE 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+
+
+
+ test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 11
+ }
+ }
+ }
+
+
+
+
+ }
+ }; then
+ if test -z "$LIBUNISTRING_UNITYPES_H"; then
+ LIBUNISTRING_UNITYPES_H="${gl_source_base_prefix}unitypes.h"
+ fi
+ else
+ LIBUNISTRING_UNITYPES_H=
+ fi
+
+
+
+
+
+
+ if { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+
+
+
+ test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 11
+ }
+ }
+ }
+
+
+
+
+ }
+ }; then
+ if test -z "$LIBUNISTRING_UNIWIDTH_H"; then
+ LIBUNISTRING_UNIWIDTH_H="${gl_source_base_prefix}uniwidth.h"
+ fi
+ else
+ LIBUNISTRING_UNIWIDTH_H=
+ fi
+
+
+
+
+
+
+ if { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+
+
+
+ test $LIBUNISTRING_VERSION_MAJOR -lt 1 \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq 1 \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt 1 \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq 1 \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 0
+ }
+ }
+ }
+
+
+
+
+ }
+ }; then
+ LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE=
+ LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE='#'
+else
+ LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE='#'
+ LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE=
+fi
+:
+ if test -z "${LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE}"; then
+ LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE='#'
+ LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE='#'
+ fi
+
+
+
+
+
+ if test $ac_cv_func_vasnprintf = no; then
+
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"
+
+ if test $ac_cv_func_vasnprintf = yes; then
+
+printf "%s\n" "#define REPLACE_VASNPRINTF 1" >>confdefs.h
+
+ fi
+
+
+
+
+
+
+
+
+
+ ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
+if test "x$ac_cv_type_ptrdiff_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define ptrdiff_t long" >>confdefs.h
+
+
+fi
+
+
+
+
+
+
+
+ fi
+
+
+
+ gl_cv_func_vsnprintf_usable=no
+ ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf"
+if test "x$ac_cv_func_vsnprintf" = xyes
+then :
+ printf "%s\n" "#define HAVE_VSNPRINTF 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_vsnprintf = yes; then
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5
+printf %s "checking whether snprintf respects a size of 1... " >&6; }
+if test ${gl_cv_func_snprintf_size1+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_snprintf_size1="guessing yes" ;;
+ *) gl_cv_func_snprintf_size1="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+ va_list args;
+ int ret;
+ va_start (args, format);
+ ret = vsnprintf (buf, size, format, args);
+ va_end (args);
+ return ret;
+}
+#endif
+int main()
+{
+ static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+ my_snprintf (buf, 1, "%d", 12345);
+ return buf[1] != 'E';
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_snprintf_size1=yes
+else $as_nop
+ gl_cv_func_snprintf_size1=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5
+printf "%s\n" "$gl_cv_func_snprintf_size1" >&6; }
+
+ case "$gl_cv_func_snprintf_size1" in
+ *yes)
+
+ case "$gl_cv_func_snprintf_retval_c99" in
+ *yes)
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5
+printf %s "checking whether printf supports POSIX/XSI format strings with positions... " >&6; }
+if test ${gl_cv_func_printf_positions+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
+ gl_cv_func_printf_positions="guessing no";;
+ beos*) gl_cv_func_printf_positions="guessing no";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_printf_positions="guessing yes";;
+ # Guess no on native Windows.
+ mingw* | pw*) gl_cv_func_printf_positions="guessing no";;
+ *) gl_cv_func_printf_positions="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <string.h>
+/* The string "%2$d %1$d", with dollar characters protected from the shell's
+ dollar expansion (possibly an autoconf bug). */
+static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
+static char buf[100];
+int main ()
+{
+ sprintf (buf, format, 33, 55);
+ return (strcmp (buf, "55 33") != 0);
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_printf_positions=yes
+else $as_nop
+ gl_cv_func_printf_positions=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5
+printf "%s\n" "$gl_cv_func_printf_positions" >&6; }
+
+ case "$gl_cv_func_printf_positions" in
+ *yes)
+ gl_cv_func_vsnprintf_usable=yes
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ if test $gl_cv_func_vsnprintf_usable = no; then
+
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS vsnprintf.$ac_objext"
+
+ if test $ac_cv_func_vsnprintf = yes; then
+ REPLACE_VSNPRINTF=1
+ else
+
+ if test $ac_cv_have_decl_vsnprintf = yes; then
+ REPLACE_VSNPRINTF=1
+ fi
+ fi
+ :
+
+ fi
+
+ if test $ac_cv_have_decl_vsnprintf = no; then
+ HAVE_DECL_VSNPRINTF=0
+ fi
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_VSNPRINTF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_VSNPRINTF 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ac_fn_check_decl "$LINENO" "wcwidth" "ac_cv_have_decl_wcwidth" "
+ #include <wchar.h>
+
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_wcwidth" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_WCWIDTH $ac_have_decl" >>confdefs.h
+
+ if test $ac_cv_have_decl_wcwidth != yes; then
+ HAVE_DECL_WCWIDTH=0
+ fi
+
+ if test $ac_cv_func_wcwidth != yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether wcwidth is a macro" >&5
+printf %s "checking whether wcwidth is a macro... " >&6; }
+if test ${gl_cv_func_wcwidth_macro+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <wchar.h>
+#ifdef wcwidth
+ wchar_header_defines_wcwidth
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "wchar_header_defines_wcwidth" >/dev/null 2>&1
+then :
+ gl_cv_func_wcwidth_macro=yes
+else $as_nop
+ gl_cv_func_wcwidth_macro=no
+fi
+rm -rf conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcwidth_macro" >&5
+printf "%s\n" "$gl_cv_func_wcwidth_macro" >&6; }
+ fi
+
+ if test $ac_cv_func_wcwidth = yes || test $gl_cv_func_wcwidth_macro = yes; then
+ HAVE_WCWIDTH=1
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether wcwidth works reasonably in UTF-8 locales" >&5
+printf %s "checking whether wcwidth works reasonably in UTF-8 locales... " >&6; }
+if test ${gl_cv_func_wcwidth_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_wcwidth_works="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_wcwidth_works="guessing yes";;
+ # Guess yes on AIX 7 systems.
+ aix[7-9]*) gl_cv_func_wcwidth_works="guessing yes";;
+ *) gl_cv_func_wcwidth_works="$gl_cross_guess_normal";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <wchar.h>
+#if !HAVE_DECL_WCWIDTH
+extern
+# ifdef __cplusplus
+"C"
+# endif
+int wcwidth (int);
+#endif
+int main ()
+{
+ int result = 0;
+ if (setlocale (LC_ALL, "en_US.UTF-8") != NULL)
+ {
+ if (wcwidth (0x0301) > 0)
+ result |= 1;
+ if (wcwidth (0x05B0) > 0)
+ result |= 2;
+ if (wcwidth (0x200B) > 0)
+ result |= 4;
+ if (wcwidth (0xFF1A) == 0)
+ result |= 8;
+ if (wcwidth (0x2202) > 1)
+ result |= 16;
+ }
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_wcwidth_works=yes
+else $as_nop
+ gl_cv_func_wcwidth_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcwidth_works" >&5
+printf "%s\n" "$gl_cv_func_wcwidth_works" >&6; }
+ case "$gl_cv_func_wcwidth_works" in
+ *yes) ;;
+ *no) REPLACE_WCWIDTH=1 ;;
+ esac
+ else
+ HAVE_WCWIDTH=0
+ fi
+
+
+ if test $HAVE_WCWIDTH = 0 || test $REPLACE_WCWIDTH = 1; then
+ GL_COND_OBJ_WCWIDTH_TRUE=
+ GL_COND_OBJ_WCWIDTH_FALSE='#'
+else
+ GL_COND_OBJ_WCWIDTH_TRUE='#'
+ GL_COND_OBJ_WCWIDTH_FALSE=
+fi
+:
+ if test -z "${GL_COND_OBJ_WCWIDTH_TRUE}" && test -z "${GL_COND_OBJ_WCWIDTH_FALSE}"; then
+ GL_COND_OBJ_WCWIDTH_TRUE='#'
+ GL_COND_OBJ_WCWIDTH_FALSE='#'
+ fi
+
+ if test -z "$GL_COND_OBJ_WCWIDTH_TRUE"; then :
+
+
+
+ :
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ GL_GNULIB_WCWIDTH=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_WCWIDTH 1" >>confdefs.h
+
+
+
+
+
+ ac_fn_c_check_header_compile "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdint_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_STDINT_H 1" >>confdefs.h
+
+fi
+
+
+ # End of code from modules
+
+
+
+
+
+
+
+
+
+
+
+ gltests_libdeps=
+ gltests_ltlibdeps=
+
+
+
+
+
+
+
+
+
+
+
+
+ gl_source_base='tests'
+ gl_source_base_prefix=
+ gltests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS
+
+ gl_module_indicator_condition=$gltests_WITNESS
+
+
+
+
+
+
+
+
+
+
+
+
+ LIBGNU_LIBDEPS="$gl_libdeps"
+
+ LIBGNU_LTLIBDEPS="$gl_ltlibdeps"
+
+
+
+
+ ac_ext=cpp
+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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that C++ compiler can compile simple program" >&5
+printf %s "checking that C++ compiler can compile simple program... " >&6; }
+ fi
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+int main() {
+ return 0;
+}
+
+
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ as_fn_error $? "a working C++ compiler is required" "$LINENO" 5
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+ if test "$cross_compiling" = no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that C++ static constructors and destructors are called" >&5
+printf %s "checking that C++ static constructors and destructors are called... " >&6; }
+ fi
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* 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
+if ac_fn_cxx_try_run "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ as_fn_error $? "a working C++ compiler is required" "$LINENO" 5
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that header files support C++" >&5
+printf %s "checking that header files support C++... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <stdio.h>
+
+
+int
+main (void)
+{
+
+
+fopen(0, 0);
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ as_fn_error $? "header files do not support C++
+ (if you are using a version of gcc/g++ earlier than 2.5,
+ you should install libg++)" "$LINENO" 5
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ 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
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether character set is EBCDIC" >&5
+printf %s "checking whether character set is EBCDIC... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* 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 (void)
+{
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ groff_cv_ebcdic="yes"
+ TTYDEVDIRS="font/devcp1047"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+printf "%s\n" "#define IS_EBCDIC_HOST 1" >>confdefs.h
+
+else $as_nop
+ groff_cv_ebcdic="no"
+ TTYDEVDIRS="font/devascii font/devlatin1"
+ OTHERDEVDIRS="font/devlj4 font/devlbp"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+
+if test "$groff_cv_ebcdic" = "yes"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OS/390 Unix" >&5
+printf %s "checking for OS/390 Unix... " >&6; }
+ case `uname` in
+ OS/390)
+ CFLAGS="$CFLAGS -D_ALL_SOURCE"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; } ;;
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; } ;;
+ esac
+ fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to install .cmd wrapper scripts for Windows" >&5
+printf %s "checking whether to install .cmd wrapper scripts for Windows... " >&6; }
+ case "$host_os" in
+ *mingw*)
+ make_winscripts=winscripts
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; } ;;
+ *)
+ make_winscripts=
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; } ;;
+ esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for X" >&5
+printf %s "checking for X... " >&6; }
+
+
+# Check whether --with-x was given.
+if test ${with_x+y}
+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
+ case $x_includes,$x_libraries in #(
+ *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #(
+ *,NONE | NONE,*) if test ${ac_cv_have_x+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # One or both of the vars are not set, and there is no cached value.
+ac_x_includes=no
+ac_x_libraries=no
+# Do we need to do anything special at all?
+ac_save_LIBS=$LIBS
+LIBS="-lX11 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <X11/Xlib.h>
+int
+main (void)
+{
+XrmInitialize ()
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ # We can compile and link X programs with no special options.
+ ac_x_includes=
+ ac_x_libraries=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS="$ac_save_LIBS"
+# If that didn't work, only try xmkmf and file system searches
+# for native compilation.
+if test x"$ac_x_includes" = xno && test "$cross_compiling" = no
+then :
+ rm -f -r conftest.dir
+if mkdir conftest.dir; then
+ cd conftest.dir
+ cat >Imakefile <<'_ACEOF'
+incroot:
+ @echo incroot='${INCROOT}'
+usrlibdir:
+ @echo usrlibdir='${USRLIBDIR}'
+libdir:
+ @echo libdir='${LIBDIR}'
+_ACEOF
+ if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then
+ # GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+ for ac_var in incroot usrlibdir libdir; do
+ eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`"
+ done
+ # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
+ for ac_extension in a so sl dylib la dll; 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) ac_x_includes= ;;
+ *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;;
+ esac
+ case $ac_im_usrlibdir in
+ /usr/lib | /usr/lib64 | /lib | /lib64) ;;
+ *) 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/X11R7/include
+/usr/X11R6/include
+/usr/X11R5/include
+/usr/X11R4/include
+
+/usr/include/X11
+/usr/include/X11R7
+/usr/include/X11R6
+/usr/include/X11R5
+/usr/include/X11R4
+
+/usr/local/X11/include
+/usr/local/X11R7/include
+/usr/local/X11R6/include
+/usr/local/X11R5/include
+/usr/local/X11R4/include
+
+/usr/local/include/X11
+/usr/local/include/X11R7
+/usr/local/include/X11R6
+/usr/local/include/X11R5
+/usr/local/include/X11R4
+
+/opt/X11/include
+
+/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 Xlib.h.
+ # First, try using that file with no special directory specified.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <X11/Xlib.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+ # We can compile using X headers with no special include directory.
+ac_x_includes=
+else $as_nop
+ for ac_dir in $ac_x_header_dirs; do
+ if test -r "$ac_dir/X11/Xlib.h"; then
+ ac_x_includes=$ac_dir
+ break
+ fi
+done
+fi
+rm -f conftest.err conftest.i 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="-lX11 $LIBS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <X11/Xlib.h>
+int
+main (void)
+{
+XrmInitialize ()
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ LIBS=$ac_save_LIBS
+# We can link X programs with no special library path.
+ac_x_libraries=
+else $as_nop
+ LIBS=$ac_save_LIBS
+for ac_dir in `printf "%s\n" "$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 dylib la dll; do
+ if test -r "$ac_dir/libX11.$ac_extension"; then
+ ac_x_libraries=$ac_dir
+ break 2
+ fi
+ done
+done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi # $ac_x_libraries = no
+
+fi
+# Record the results.
+case $ac_x_includes,$ac_x_libraries in #(
+ no,* | *,no | *\'*) :
+ # Didn't find X, or a directory has "'" in its name.
+ ac_cv_have_x="have_x=no" ;; #(
+ *) :
+ # 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'" ;;
+esac
+fi
+;; #(
+ *) have_x=yes;;
+ esac
+ eval "$ac_cv_have_x"
+fi # $with_x != no
+
+if test "$have_x" != yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5
+printf "%s\n" "$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'"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5
+printf "%s\n" "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.
+
+printf "%s\n" "#define X_DISPLAY_MISSING 1" >>confdefs.h
+
+ 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 . . . .
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5
+printf %s "checking whether -R must be followed by a space... " >&6; }
+ ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries"
+ ac_xsave_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ X_LIBS="$X_LIBS -R$x_libraries"
+else $as_nop
+ LIBS="$ac_xsave_LIBS -R $x_libraries"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ X_LIBS="$X_LIBS -R $x_libraries"
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: neither works" >&5
+printf "%s\n" "neither works" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_c_werror_flag=$ac_xsave_c_werror_flag
+ LIBS=$ac_xsave_LIBS
+ 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 confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char XOpenDisplay ();
+int
+main (void)
+{
+return XOpenDisplay ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5
+printf %s "checking for dnet_ntoa in -ldnet... " >&6; }
+if test ${ac_cv_lib_dnet_dnet_ntoa+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldnet $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dnet_ntoa ();
+int
+main (void)
+{
+return dnet_ntoa ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dnet_dnet_ntoa=yes
+else $as_nop
+ ac_cv_lib_dnet_dnet_ntoa=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5
+printf "%s\n" "$ac_cv_lib_dnet_dnet_ntoa" >&6; }
+if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes
+then :
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
+fi
+
+ if test $ac_cv_lib_dnet_dnet_ntoa = no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5
+printf %s "checking for dnet_ntoa in -ldnet_stub... " >&6; }
+if test ${ac_cv_lib_dnet_stub_dnet_ntoa+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldnet_stub $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dnet_ntoa ();
+int
+main (void)
+{
+return dnet_ntoa ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dnet_stub_dnet_ntoa=yes
+else $as_nop
+ ac_cv_lib_dnet_stub_dnet_ntoa=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5
+printf "%s\n" "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; }
+if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes
+then :
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
+fi
+
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ 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.
+ ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname"
+if test "x$ac_cv_func_gethostbyname" = xyes
+then :
+
+fi
+
+ if test $ac_cv_func_gethostbyname = no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5
+printf %s "checking for gethostbyname in -lnsl... " >&6; }
+if test ${ac_cv_lib_nsl_gethostbyname+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char gethostbyname ();
+int
+main (void)
+{
+return gethostbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_nsl_gethostbyname=yes
+else $as_nop
+ ac_cv_lib_nsl_gethostbyname=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5
+printf "%s\n" "$ac_cv_lib_nsl_gethostbyname" >&6; }
+if test "x$ac_cv_lib_nsl_gethostbyname" = xyes
+then :
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
+fi
+
+ if test $ac_cv_lib_nsl_gethostbyname = no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5
+printf %s "checking for gethostbyname in -lbsd... " >&6; }
+if test ${ac_cv_lib_bsd_gethostbyname+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbsd $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char gethostbyname ();
+int
+main (void)
+{
+return gethostbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_bsd_gethostbyname=yes
+else $as_nop
+ ac_cv_lib_bsd_gethostbyname=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5
+printf "%s\n" "$ac_cv_lib_bsd_gethostbyname" >&6; }
+if test "x$ac_cv_lib_bsd_gethostbyname" = xyes
+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.
+ ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect"
+if test "x$ac_cv_func_connect" = xyes
+then :
+
+fi
+
+ if test $ac_cv_func_connect = no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5
+printf %s "checking for connect in -lsocket... " >&6; }
+if test ${ac_cv_lib_socket_connect+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char connect ();
+int
+main (void)
+{
+return connect ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_socket_connect=yes
+else $as_nop
+ ac_cv_lib_socket_connect=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5
+printf "%s\n" "$ac_cv_lib_socket_connect" >&6; }
+if test "x$ac_cv_lib_socket_connect" = xyes
+then :
+ X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
+fi
+
+ fi
+
+ # Guillermo Gomez says -lposix is necessary on A/UX.
+ ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove"
+if test "x$ac_cv_func_remove" = xyes
+then :
+
+fi
+
+ if test $ac_cv_func_remove = no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5
+printf %s "checking for remove in -lposix... " >&6; }
+if test ${ac_cv_lib_posix_remove+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lposix $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char remove ();
+int
+main (void)
+{
+return remove ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_posix_remove=yes
+else $as_nop
+ ac_cv_lib_posix_remove=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5
+printf "%s\n" "$ac_cv_lib_posix_remove" >&6; }
+if test "x$ac_cv_lib_posix_remove" = xyes
+then :
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
+fi
+
+ fi
+
+ # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
+ ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat"
+if test "x$ac_cv_func_shmat" = xyes
+then :
+
+fi
+
+ if test $ac_cv_func_shmat = no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5
+printf %s "checking for shmat in -lipc... " >&6; }
+if test ${ac_cv_lib_ipc_shmat+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lipc $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char shmat ();
+int
+main (void)
+{
+return shmat ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_ipc_shmat=yes
+else $as_nop
+ ac_cv_lib_ipc_shmat=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5
+printf "%s\n" "$ac_cv_lib_ipc_shmat" >&6; }
+if test "x$ac_cv_lib_ipc_shmat" = xyes
+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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5
+printf %s "checking for IceConnectionNumber in -lICE... " >&6; }
+if test ${ac_cv_lib_ICE_IceConnectionNumber+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lICE $X_EXTRA_LIBS $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char IceConnectionNumber ();
+int
+main (void)
+{
+return IceConnectionNumber ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_ICE_IceConnectionNumber=yes
+else $as_nop
+ ac_cv_lib_ICE_IceConnectionNumber=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5
+printf "%s\n" "$ac_cv_lib_ICE_IceConnectionNumber" >&6; }
+if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes
+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"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Xaw library and header files" >&5
+printf %s "checking for Xaw library and header files... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <X11/Intrinsic.h>
+#include <X11/Xaw/Simple.h>
+
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ groff_no_x=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+ LIBS="$LIBS -lXmu"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Xmu library and header files" >&5
+printf %s "checking for Xmu library and header files... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <X11/Intrinsic.h>
+#include <X11/Xmu/Converters.h>
+
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ groff_no_x=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+ CFLAGS=$OLDCFLAGS
+ LDFLAGS=$OLDLDFLAGS
+ LIBS=$OLDLIBS
+ fi
+
+ if ! test "$groff_no_x" = yes
+ then
+ 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-appdefdir was given.
+if test ${with_appdefdir+y}
+then :
+ withval=$with_appdefdir;
+fi
+
+
+if test -z "$groff_no_x"; then
+ if test -z "$with_appdefdir"; then
+ if test "$prefix" = NONE; then
+ appdefdir=$ac_default_prefix/lib/X11/app-defaults
+ else
+ appdefdir=$prefix/lib/X11/app-defaults
+ fi
+ else
+ appdefdir=$with_appdefdir
+ fi
+ fi
+
+libprogramdir=$libdir/groff
+
+glilypond_dir=$libprogramdir/glilypond
+
+gpinyin_dir=$libprogramdir/gpinyin
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+printf %s "checking for a sed that does not truncate output... " >&6; }
+if test ${ac_cv_path_SED+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+ for ac_i in 1 2 3 4 5 6 7; do
+ ac_script="$ac_script$as_nl$ac_script"
+ done
+ echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+ { ac_script=; unset ac_script;}
+ if test -z "$SED"; then
+ ac_path_SED_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in sed gsed
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_SED="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+ # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+ ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" '' >> "conftest.nl"
+ "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_SED_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_SED="$ac_path_SED"
+ ac_path_SED_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_SED_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_SED"; then
+ as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+ fi
+else
+ ac_cv_path_SED=$SED
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+printf "%s\n" "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+ rm -f conftest.sed
+
+
+ PERLVERSION=v5.6.1
+ # Extract the first word of "perl", so it can be a program name with args.
+set dummy perl; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_PERL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $PERL in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PERL="$PERL" # 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_PERL="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="no"
+ ;;
+esac
+fi
+PERL=$ac_cv_path_PERL
+if test -n "$PERL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
+printf "%s\n" "$PERL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ if test "$PERL" = no
+ then
+ as_fn_error 1 "perl binary not found" "$LINENO" 5
+ fi
+
+
+
+
+ if test -n "$PERL"
+then :
+
+ ax_perl_version="$PERLVERSION"
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for perl version" >&5
+printf %s "checking for perl version... " >&6; }
+
+ perl_version=`$PERL --version 2>&1 \
+ | $SED -n -e '/This is perl/b inspect
+b
+: inspect
+s/.* (\{0,1\}v\([0-9]*\.[0-9]*\.[0-9]*\))\{0,1\} .*/\1/;p'`
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $perl_version" >&5
+printf "%s\n" "$perl_version" >&6; }
+
+ PERL_VERSION=$perl_version
+
+
+
+
+
+ # Used to indicate true or false condition
+ ax_compare_version=false
+
+ # Convert the two version strings to be compared into a format that
+ # allows a simple string comparison. The end result is that a version
+ # string of the form 1.12.5-r617 will be converted to the form
+ # 0001001200050617. In other words, each number is zero padded to four
+ # digits, and non digits are removed.
+
+ ax_compare_version_A=`echo "$ax_perl_version" | sed -e 's/\([0-9]*\)/Z\1Z/g' \
+ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \
+ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \
+ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \
+ -e 's/[^0-9]//g'`
+
+
+ ax_compare_version_B=`echo "$perl_version" | sed -e 's/\([0-9]*\)/Z\1Z/g' \
+ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \
+ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \
+ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \
+ -e 's/[^0-9]//g'`
+
+
+ ax_compare_version=`echo "x$ax_compare_version_A
+x$ax_compare_version_B" | sed 's/^ *//' | sort | sed "s/x${ax_compare_version_A}/true/;s/x${ax_compare_version_B}/false/;1q"`
+
+
+
+ if test "$ax_compare_version" = "true" ; then
+
+ :
+ true
+
+ else
+ :
+ as_fn_error 1 "perl version is too old" "$LINENO" 5
+
+ fi
+
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: could not find the perl interpreter" >&5
+printf "%s\n" "$as_me: WARNING: could not find the perl interpreter" >&2;}
+ as_fn_error 1 "perl version is too old" "$LINENO" 5
+
+fi
+
+
+
+ groff_have_spooler=no
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_LPR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_LPR="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+LPR=$ac_cv_prog_LPR
+if test -n "$LPR"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LPR" >&5
+printf "%s\n" "$LPR" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_LP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_LP="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+LP=$ac_cv_prog_LP
+if test -n "$LP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LP" >&5
+printf "%s\n" "$LP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_LPQ+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_LPQ="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+LPQ=$ac_cv_prog_LPQ
+if test -n "$LPQ"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LPQ" >&5
+printf "%s\n" "$LPQ" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+
+ if test -n "$PSPRINT"
+ then
+ groff_have_spooler="$PSPRINT"
+
+ # Figure out DVIPRINT from PSPRINT.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking option to use when spooling DVI files" >&5
+printf %s "checking option to use when spooling DVI files... " >&6; }
+ spooler_option=none
+ if test -n "$PSPRINT" && test -z "$DVIPRINT"
+ then
+ if test "$PSPRINT" = lpr
+ then
+ spooler_option=-d
+ DVIPRINT="$PSPRINT $spooler_option"
+ else
+ DVIPRINT="$PSPRINT"
+ fi
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $spooler_option" >&5
+printf "%s\n" "$spooler_option" >&6; }
+ fi
+
+# GROFF_REFER
+referdir=$libprogramdir/refer
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+printf %s "checking for egrep... " >&6; }
+if test ${ac_cv_path_EGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in egrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+printf "%s\n" "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+
+ for ac_prog in byacc 'bison -y' yacc
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_YACC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_YACC="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+YACC=$ac_cv_prog_YACC
+if test -n "$YACC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5
+printf "%s\n" "$YACC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$YACC" && break
+done
+test -n "$YACC" || YACC="missing"
+
+ if ! test -f "$srcdir"/.tarball-version
+ then
+ if test "$YACC" = missing
+ then
+ as_fn_error 1 "could not find 'byacc', 'bison', or 'yacc'" "$LINENO" 5
+ fi
+ fi
+
+
+ for ac_prog in m4
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_M4+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$M4"; then
+ ac_cv_prog_M4="$M4" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_M4="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+M4=$ac_cv_prog_M4
+if test -n "$M4"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $M4" >&5
+printf "%s\n" "$M4" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$M4" && break
+done
+test -n "$M4" || M4="missing"
+
+ if test "$M4" = missing
+ then
+ as_fn_error 1 "could not find 'm4'" "$LINENO" 5
+ fi
+
+
+ # By default automake will set MAKEINFO to MAKEINFO = ${SHELL} <top
+ # src dir>/build-aux/missing makeinfo. As we need a more precise
+ # check of makeinfo version, we don't use it.
+ MAKEINFO=
+ missing=
+ # Extract the first word of "makeinfo", so it can be a program name with args.
+set dummy makeinfo; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_MAKEINFO+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$MAKEINFO"; then
+ ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_MAKEINFO="makeinfo"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+MAKEINFO=$ac_cv_prog_MAKEINFO
+if test -n "$MAKEINFO"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAKEINFO" >&5
+printf "%s\n" "$MAKEINFO" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ if test -z "$MAKEINFO"
+ then
+ missing="missing 'makeinfo'"
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for makeinfo version" >&5
+printf %s "checking for makeinfo version... " >&6; }
+ # We need an additional level of quoting to make sed's regexps
+ # work.
+ makeinfo_version=`$MAKEINFO --version 2>&1 \
+ | sed -e 's/^.* \([^ ][^ ]*\)$/\1/' -e '1q'`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $makeinfo_version" >&5
+printf "%s\n" "$makeinfo_version" >&6; }
+ # Consider only the first two numbers in version number string.
+ makeinfo_version_major=`IFS=.; set x $makeinfo_version; echo ${2}`
+ makeinfo_version_minor=`IFS=.; set x $makeinfo_version; echo ${3}`
+ makeinfo_version_numeric=`
+ expr ${makeinfo_version_major}000 + $makeinfo_version_minor`
+ if test $makeinfo_version_numeric -lt 5000
+ then
+ missing="'makeinfo' is too old."
+ MAKEINFO=
+ fi
+ fi
+
+ if test -n "$missing"
+ then
+ infofile=doc/groff.info
+ test -f $infofile || infofile="$srcdir"/$infofile
+ if test ! -f $infofile \
+ || test "$srcdir"/doc/groff.texi -nt $infofile
+ then
+ as_fn_error $? "$missing
+Get the 'texinfo' package version 5.0 or newer." "$LINENO" 5
+ fi
+ fi
+
+
+
+
+ # Extract the first word of "texi2dvi", so it can be a program name with args.
+set dummy texi2dvi; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_PROG_TEXI2DVI+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$PROG_TEXI2DVI"; then
+ ac_cv_prog_PROG_TEXI2DVI="$PROG_TEXI2DVI" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_PROG_TEXI2DVI="texi2dvi"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_PROG_TEXI2DVI" && ac_cv_prog_PROG_TEXI2DVI="missing"
+fi
+fi
+PROG_TEXI2DVI=$ac_cv_prog_PROG_TEXI2DVI
+if test -n "$PROG_TEXI2DVI"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PROG_TEXI2DVI" >&5
+printf "%s\n" "$PROG_TEXI2DVI" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ groff_have_texi2dvi=no
+ if test "$PROG_TEXI2DVI" != missing && test -n "$MAKEINFO"
+ then
+ groff_have_texi2dvi=yes
+ fi
+
+
+
+ # Extract the first word of "tex", so it can be a program name with args.
+set dummy tex; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_PROG_TEX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$PROG_TEX"; then
+ ac_cv_prog_PROG_TEX="$PROG_TEX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_PROG_TEX="found"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_PROG_TEX" && ac_cv_prog_PROG_TEX="missing"
+fi
+fi
+PROG_TEX=$ac_cv_prog_PROG_TEX
+if test -n "$PROG_TEX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PROG_TEX" >&5
+printf "%s\n" "$PROG_TEX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ groff_use_tex=no
+ test "$PROG_TEX" = found && groff_use_tex=yes
+
+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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+printf "%s\n" "$RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+printf "%s\n" "$ac_ct_RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_INSTALL_INFO+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_INSTALL_INFO="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+INSTALL_INFO=$ac_cv_prog_INSTALL_INFO
+if test -n "$INSTALL_INFO"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL_INFO" >&5
+printf "%s\n" "$INSTALL_INFO" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$INSTALL_INFO" && break
+done
+test -n "$INSTALL_INFO" || INSTALL_INFO=":"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+printf %s "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+printf "%s\n" "no, using $LN_S" >&6; }
+fi
+
+
+# Extract the first word of "xpmtoppm", so it can be a program name with args.
+set dummy xpmtoppm; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_XPMTOPPM+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$XPMTOPPM"; then
+ ac_cv_prog_XPMTOPPM="$XPMTOPPM" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_XPMTOPPM="found"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_XPMTOPPM" && ac_cv_prog_XPMTOPPM="missing"
+fi
+fi
+XPMTOPPM=$ac_cv_prog_XPMTOPPM
+if test -n "$XPMTOPPM"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $XPMTOPPM" >&5
+printf "%s\n" "$XPMTOPPM" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+
+
+
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_PKG_CONFIG+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+printf "%s\n" "$PKG_CONFIG" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+ ac_pt_PKG_CONFIG=$PKG_CONFIG
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_ac_pt_PKG_CONFIG+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $ac_pt_PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_ac_pt_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+printf "%s\n" "$ac_pt_PKG_CONFIG" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_pt_PKG_CONFIG" = x; then
+ PKG_CONFIG=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ PKG_CONFIG=$ac_pt_PKG_CONFIG
+ fi
+else
+ PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+ _pkg_min_version=0.9.0
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+printf %s "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ PKG_CONFIG=""
+ fi
+fi
+
+
+# Check whether --with-uchardet was given.
+if test ${with_uchardet+y}
+then :
+ withval=$with_uchardet;
+fi
+
+ if test "$with_uchardet" != no
+then :
+
+pkg_failed=no
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for UCHARDET" >&5
+printf %s "checking for UCHARDET... " >&6; }
+
+if test -n "$UCHARDET_CFLAGS"; then
+ pkg_cv_UCHARDET_CFLAGS="$UCHARDET_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"uchardet >= 0.0.1\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "uchardet >= 0.0.1") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_UCHARDET_CFLAGS=`$PKG_CONFIG --cflags "uchardet >= 0.0.1" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$UCHARDET_LIBS"; then
+ pkg_cv_UCHARDET_LIBS="$UCHARDET_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"uchardet >= 0.0.1\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "uchardet >= 0.0.1") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_UCHARDET_LIBS=`$PKG_CONFIG --libs "uchardet >= 0.0.1" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ UCHARDET_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "uchardet >= 0.0.1" 2>&1`
+ else
+ UCHARDET_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "uchardet >= 0.0.1" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$UCHARDET_PKG_ERRORS" >&5
+
+
+ if test "$with_uchardet" = yes
+ then
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "could not find uchardet library
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ groff_have_uchardet=no
+elif test $pkg_failed = untried; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+ if test "$with_uchardet" = yes
+ then
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "could not find uchardet library
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ groff_have_uchardet=no
+else
+ UCHARDET_CFLAGS=$pkg_cv_UCHARDET_CFLAGS
+ UCHARDET_LIBS=$pkg_cv_UCHARDET_LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+printf "%s\n" "#define HAVE_UCHARDET 1" >>confdefs.h
+
+ groff_have_uchardet=yes
+fi
+else $as_nop
+ groff_have_uchardet=no
+fi
+
+
+# use a dummy substitution if no csh hack is necessary to avoid errors
+# with non-GNU sed programs
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for csh hash hack" >&5
+printf %s "checking for csh hash hack... " >&6; }
+
+cat <<EOF >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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ SH_SCRIPT_SED_CMD='1s/.*/:/'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ SH_SCRIPT_SED_CMD='1s/a/a/'
+ fi
+ rm -f conftest.sh
+
+
+# checks for headers
+ac_fn_c_check_header_compile "$LINENO" "stdbool.h" "ac_cv_header_stdbool_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdbool_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_STDBOOL_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "stddef.h" "ac_cv_header_stddef_h" "$ac_includes_default"
+if test "x$ac_cv_header_stddef_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_STDDEF_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdlib_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_STDLIB_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default"
+if test "x$ac_cv_header_unistd_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "dirent.h" "ac_cv_header_dirent_h" "$ac_includes_default"
+if test "x$ac_cv_header_dirent_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_DIRENT_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default"
+if test "x$ac_cv_header_limits_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_LIMITS_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "sys/dir.h" "ac_cv_header_sys_dir_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_dir_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_DIR_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default"
+if test "x$ac_cv_header_string_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRING_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "strings.h" "ac_cv_header_strings_h" "$ac_includes_default"
+if test "x$ac_cv_header_strings_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRINGS_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "math.h" "ac_cv_header_math_h" "$ac_includes_default"
+if test "x$ac_cv_header_math_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_MATH_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_time_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_TIME_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "direct.h" "ac_cv_header_direct_h" "$ac_includes_default"
+if test "x$ac_cv_header_direct_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_DIRECT_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "process.h" "ac_cv_header_process_h" "$ac_includes_default"
+if test "x$ac_cv_header_process_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_PROCESS_H 1" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ISC 3.x or 4.x" >&5
+printf %s "checking for ISC 3.x or 4.x... " >&6; }
+ if grep '[34]\.' /usr/options/cb.name >/dev/null 2>&1
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+printf "%s\n" "#define _SYSV3 1" >>confdefs.h
+
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -D_POSIX_SOURCE is necessary" >&5
+printf %s "checking whether -D_POSIX_SOURCE is necessary... " >&6; }
+ ac_ext=cpp
+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 confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <stdio.h>
+extern "C" { void fileno(int); }
+
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+printf "%s\n" "#define _POSIX_SOURCE 1" >>confdefs.h
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam 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=cpp
+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
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for return type of srand" >&5
+printf %s "checking for return type of srand... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <stdlib.h>
+extern "C" { void srand(unsigned int); }
+
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: void" >&5
+printf "%s\n" "void" >&6; }
+
+printf "%s\n" "#define RET_TYPE_SRAND_IS_VOID 1" >>confdefs.h
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: int" >&5
+printf "%s\n" "int" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam 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
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gettimeofday must be declared" >&5
+printf %s "checking whether gettimeofday must be declared... " >&6; }
+ ac_ext=cpp
+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+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <stdio.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_MATH_H
+#include <math.h>
+#endif
+
+
+int
+main (void)
+{
+
+
+#ifndef gettimeofday
+ char *p = (char *) gettimeofday;
+#endif
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ groff_cv_decl_needed_gettimeofday=no
+else $as_nop
+ groff_cv_decl_needed_gettimeofday=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_gettimeofday" >&5
+printf "%s\n" "$groff_cv_decl_needed_gettimeofday" >&6; }
+ if test $groff_cv_decl_needed_gettimeofday = yes; then
+
+printf "%s\n" "#define NEED_DECLARATION_GETTIMEOFDAY 1" >>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
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether popen must be declared" >&5
+printf %s "checking whether popen must be declared... " >&6; }
+ ac_ext=cpp
+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+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <stdio.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_MATH_H
+#include <math.h>
+#endif
+
+
+int
+main (void)
+{
+
+
+#ifndef popen
+ char *p = (char *) popen;
+#endif
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ groff_cv_decl_needed_popen=no
+else $as_nop
+ groff_cv_decl_needed_popen=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_popen" >&5
+printf "%s\n" "$groff_cv_decl_needed_popen" >&6; }
+ if test $groff_cv_decl_needed_popen = yes; then
+
+printf "%s\n" "#define NEED_DECLARATION_POPEN 1" >>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
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pclose must be declared" >&5
+printf %s "checking whether pclose must be declared... " >&6; }
+ ac_ext=cpp
+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+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <stdio.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_MATH_H
+#include <math.h>
+#endif
+
+
+int
+main (void)
+{
+
+
+#ifndef pclose
+ char *p = (char *) pclose;
+#endif
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ groff_cv_decl_needed_pclose=no
+else $as_nop
+ groff_cv_decl_needed_pclose=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_pclose" >&5
+printf "%s\n" "$groff_cv_decl_needed_pclose" >&6; }
+ if test $groff_cv_decl_needed_pclose = yes; then
+
+printf "%s\n" "#define NEED_DECLARATION_PCLOSE 1" >>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
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether putenv must be declared" >&5
+printf %s "checking whether putenv must be declared... " >&6; }
+ ac_ext=cpp
+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+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <stdio.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_MATH_H
+#include <math.h>
+#endif
+
+
+int
+main (void)
+{
+
+
+#ifndef putenv
+ char *p = (char *) putenv;
+#endif
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ groff_cv_decl_needed_putenv=no
+else $as_nop
+ groff_cv_decl_needed_putenv=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_putenv" >&5
+printf "%s\n" "$groff_cv_decl_needed_putenv" >&6; }
+ if test $groff_cv_decl_needed_putenv = yes; then
+
+printf "%s\n" "#define NEED_DECLARATION_PUTENV 1" >>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
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether rand must be declared" >&5
+printf %s "checking whether rand must be declared... " >&6; }
+ ac_ext=cpp
+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+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <stdio.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_MATH_H
+#include <math.h>
+#endif
+
+
+int
+main (void)
+{
+
+
+#ifndef rand
+ char *p = (char *) rand;
+#endif
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ groff_cv_decl_needed_rand=no
+else $as_nop
+ groff_cv_decl_needed_rand=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_rand" >&5
+printf "%s\n" "$groff_cv_decl_needed_rand" >&6; }
+ if test $groff_cv_decl_needed_rand = yes; then
+
+printf "%s\n" "#define NEED_DECLARATION_RAND 1" >>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
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether srand must be declared" >&5
+printf %s "checking whether srand must be declared... " >&6; }
+ ac_ext=cpp
+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+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <stdio.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_MATH_H
+#include <math.h>
+#endif
+
+
+int
+main (void)
+{
+
+
+#ifndef srand
+ char *p = (char *) srand;
+#endif
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ groff_cv_decl_needed_srand=no
+else $as_nop
+ groff_cv_decl_needed_srand=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_srand" >&5
+printf "%s\n" "$groff_cv_decl_needed_srand" >&6; }
+ if test $groff_cv_decl_needed_srand = yes; then
+
+printf "%s\n" "#define NEED_DECLARATION_SRAND 1" >>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
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether strcasecmp must be declared" >&5
+printf %s "checking whether strcasecmp must be declared... " >&6; }
+ ac_ext=cpp
+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+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <stdio.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_MATH_H
+#include <math.h>
+#endif
+
+
+int
+main (void)
+{
+
+
+#ifndef strcasecmp
+ char *p = (char *) strcasecmp;
+#endif
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ groff_cv_decl_needed_strcasecmp=no
+else $as_nop
+ groff_cv_decl_needed_strcasecmp=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_strcasecmp" >&5
+printf "%s\n" "$groff_cv_decl_needed_strcasecmp" >&6; }
+ if test $groff_cv_decl_needed_strcasecmp = yes; then
+
+printf "%s\n" "#define NEED_DECLARATION_STRCASECMP 1" >>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
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether strncasecmp must be declared" >&5
+printf %s "checking whether strncasecmp must be declared... " >&6; }
+ ac_ext=cpp
+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+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <stdio.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_MATH_H
+#include <math.h>
+#endif
+
+
+int
+main (void)
+{
+
+
+#ifndef strncasecmp
+ char *p = (char *) strncasecmp;
+#endif
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ groff_cv_decl_needed_strncasecmp=no
+else $as_nop
+ groff_cv_decl_needed_strncasecmp=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_strncasecmp" >&5
+printf "%s\n" "$groff_cv_decl_needed_strncasecmp" >&6; }
+ if test $groff_cv_decl_needed_strncasecmp = yes; then
+
+printf "%s\n" "#define NEED_DECLARATION_STRNCASECMP 1" >>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
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether vfprintf must be declared" >&5
+printf %s "checking whether vfprintf must be declared... " >&6; }
+ ac_ext=cpp
+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+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <stdio.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_MATH_H
+#include <math.h>
+#endif
+
+
+int
+main (void)
+{
+
+
+#ifndef vfprintf
+ char *p = (char *) vfprintf;
+#endif
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ groff_cv_decl_needed_vfprintf=no
+else $as_nop
+ groff_cv_decl_needed_vfprintf=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_vfprintf" >&5
+printf "%s\n" "$groff_cv_decl_needed_vfprintf" >&6; }
+ if test $groff_cv_decl_needed_vfprintf = yes; then
+
+printf "%s\n" "#define NEED_DECLARATION_VFPRINTF 1" >>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=cpp
+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
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sys_nerr in <errno.h>, <stdio.h>, or <stdlib.h>" >&5
+printf %s "checking for sys_nerr in <errno.h>, <stdio.h>, or <stdlib.h>... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+
+int
+main (void)
+{
+
+
+int k;
+k = sys_nerr;
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+printf "%s\n" "#define HAVE_SYS_NERR 1" >>confdefs.h
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam 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
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sys_errlist in <errno.h>, <stdio.h>, or <stdlib.h>" >&5
+printf %s "checking for sys_errlist in <errno.h>, <stdio.h>, or <stdlib.h>... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+
+int
+main (void)
+{
+
+
+int k;
+k = (int)sys_errlist[0];
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+printf "%s\n" "#define HAVE_SYS_ERRLIST 1" >>confdefs.h
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_ext=cpp
+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
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking C++ <osfcn.h>" >&5
+printf %s "checking C++ <osfcn.h>... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <osfcn.h>
+
+
+int
+main (void)
+{
+
+
+read(0, 0, 0);
+open(0, 0);
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+printf "%s\n" "#define HAVE_CC_OSFCN_H 1" >>confdefs.h
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam 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=cpp
+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
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking C++ <limits.h>" >&5
+printf %s "checking C++ <limits.h>... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <limits.h>
+
+
+int
+main (void)
+{
+
+
+int x = INT_MIN;
+int y = INT_MAX;
+int z = UCHAR_MAX;
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+printf "%s\n" "#define HAVE_CC_LIMITS_H 1" >>confdefs.h
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam 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=cpp
+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
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking C++ <inttypes.h>" >&5
+printf %s "checking C++ <inttypes.h>... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <sys/types.h>
+#include <inttypes.h>
+
+
+int
+main (void)
+{
+
+
+uintmax_t i = (uintmax_t)-1;
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ groff_cv_header_inttypes_h=yes
+
+printf "%s\n" "#define HAVE_CC_INTTYPES_H 1" >>confdefs.h
+
+else $as_nop
+ groff_cv_header_inttypes_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_header_inttypes_h" >&5
+printf "%s\n" "$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=cpp
+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
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for unsigned long long" >&5
+printf %s "checking for unsigned long long... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+unsigned long long ull = 1;
+int i = 63;
+unsigned long long ullmax = (unsigned long long)-1;
+
+
+int
+main (void)
+{
+
+
+return ull << i | ull >> i | ullmax / ull | ullmax % ull;
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+ groff_cv_type_unsigned_long_long=yes
+else $as_nop
+ groff_cv_type_unsigned_long_long=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_type_unsigned_long_long" >&5
+printf "%s\n" "$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'
+
+printf "%s\n" "#define uintmax_t $ac_type" >>confdefs.h
+
+ fi
+ac_ext=cpp
+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
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for declaration of time_t" >&5
+printf %s "checking for declaration of time_t... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <time.h>
+
+
+int
+main (void)
+{
+
+
+time_t t = time(0);
+struct tm *p = localtime(&t);
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+printf "%s\n" "#define LONG_FOR_TIME_T 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam 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
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for return type of signal handlers" >&5
+printf %s "checking for return type of signal handlers... " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+# undef signal
+#endif
+$groff_declaration
+
+
+int
+main (void)
+{
+
+
+int i;
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ break
+else $as_nop
+ continue
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ done
+
+ if test -n "$groff_declaration"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: void" >&5
+printf "%s\n" "void" >&6; }
+
+printf "%s\n" "#define RETSIGTYPE void" >>confdefs.h
+
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: int" >&5
+printf "%s\n" "int" >&6; }
+
+printf "%s\n" "#define RETSIGTYPE int" >>confdefs.h
+
+ fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking struct exception" >&5
+printf %s "checking struct exception... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <math.h>
+
+
+int
+main (void)
+{
+
+
+struct exception e;
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+printf "%s\n" "#define HAVE_STRUCT_EXCEPTION 1" >>confdefs.h
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+# check endianness
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
+printf %s "checking whether byte ordering is bigendian... " >&6; }
+if test ${ac_cv_c_bigendian+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_c_bigendian=unknown
+ # See if we're dealing with a universal compiler.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __APPLE_CC__
+ not a universal capable compiler
+ #endif
+ typedef int dummy;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+ # Check for potential -arch flags. It is not universal unless
+ # there are at least two -arch flags with different values.
+ ac_arch=
+ ac_prev=
+ for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
+ if test -n "$ac_prev"; then
+ case $ac_word in
+ i?86 | x86_64 | ppc | ppc64)
+ if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
+ ac_arch=$ac_word
+ else
+ ac_cv_c_bigendian=universal
+ break
+ fi
+ ;;
+ esac
+ ac_prev=
+ elif test "x$ac_word" = "x-arch"; then
+ ac_prev=arch
+ fi
+ done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ if test $ac_cv_c_bigendian = unknown; then
+ # See if sys/param.h defines the BYTE_ORDER macro.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/param.h>
+
+int
+main (void)
+{
+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+ && LITTLE_ENDIAN)
+ bogus endian macros
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ # It does; now see whether it defined to BIG_ENDIAN or not.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/param.h>
+
+int
+main (void)
+{
+#if BYTE_ORDER != BIG_ENDIAN
+ not big endian
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_bigendian=yes
+else $as_nop
+ ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ fi
+ if test $ac_cv_c_bigendian = unknown; then
+ # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+
+int
+main (void)
+{
+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+ bogus endian macros
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ # It does; now see whether it defined to _BIG_ENDIAN or not.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+
+int
+main (void)
+{
+#ifndef _BIG_ENDIAN
+ not big endian
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_bigendian=yes
+else $as_nop
+ ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ fi
+ if test $ac_cv_c_bigendian = unknown; then
+ # Compile a test program.
+ if test "$cross_compiling" = yes
+then :
+ # Try to guess by grepping values from an object file.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+unsigned short int ascii_mm[] =
+ { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+ unsigned short int ascii_ii[] =
+ { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+ int use_ascii (int i) {
+ return ascii_mm[i] + ascii_ii[i];
+ }
+ unsigned short int ebcdic_ii[] =
+ { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+ unsigned short int ebcdic_mm[] =
+ { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+ int use_ebcdic (int i) {
+ return ebcdic_mm[i] + ebcdic_ii[i];
+ }
+ extern int foo;
+
+int
+main (void)
+{
+return use_ascii (foo) == use_ebcdic (foo);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+ ac_cv_c_bigendian=yes
+ fi
+ if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+ if test "$ac_cv_c_bigendian" = unknown; then
+ ac_cv_c_bigendian=no
+ else
+ # finding both strings is unlikely to happen, but who knows?
+ ac_cv_c_bigendian=unknown
+ fi
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main (void)
+{
+
+ /* Are we little or big endian? From Harbison&Steele. */
+ union
+ {
+ long int l;
+ char c[sizeof (long int)];
+ } u;
+ u.l = 1;
+ return u.c[sizeof (long int) - 1] == 1;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ ac_cv_c_bigendian=no
+else $as_nop
+ ac_cv_c_bigendian=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
+printf "%s\n" "$ac_cv_c_bigendian" >&6; }
+ case $ac_cv_c_bigendian in #(
+ yes)
+ printf "%s\n" "#define WORDS_BIGENDIAN 1" >>confdefs.h
+;; #(
+ no)
+ ;; #(
+ universal)
+
+printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+
+ ;; #(
+ *)
+ as_fn_error $? "unknown endianness
+ presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
+ esac
+
+
+# checks for libraries
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for main in -lc" >&5
+printf %s "checking for main in -lc... " >&6; }
+if test ${ac_cv_lib_c_main+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+int
+main (void)
+{
+return main ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_c_main=yes
+else $as_nop
+ ac_cv_lib_c_main=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_main" >&5
+printf "%s\n" "$ac_cv_lib_c_main" >&6; }
+if test "x$ac_cv_lib_c_main" = xyes
+then :
+ LIBC=-lc
+fi
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5
+printf %s "checking for sin in -lm... " >&6; }
+if test ${ac_cv_lib_m_sin+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char sin ();
+int
+main (void)
+{
+return sin ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_m_sin=yes
+else $as_nop
+ ac_cv_lib_m_sin=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5
+printf "%s\n" "$ac_cv_lib_m_sin" >&6; }
+if test "x$ac_cv_lib_m_sin" = xyes
+then :
+ LIBM=-lm
+fi
+
+
+
+ac_ext=cpp
+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 "X$prefix" = "XNONE"; then
+ acl_final_prefix="$ac_default_prefix"
+ else
+ acl_final_prefix="$prefix"
+ fi
+ if test "X$exec_prefix" = "XNONE"; then
+ acl_final_exec_prefix='${prefix}'
+ else
+ acl_final_exec_prefix="$exec_prefix"
+ fi
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+ prefix="$acl_save_prefix"
+
+
+
+# Check whether --with-gnu-ld was given.
+if test ${with_gnu_ld+y}
+then :
+ withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else $as_nop
+ with_gnu_ld=no
+fi
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+ # contains only /bin. Note that ksh looks also at the FPATH variable,
+ # so we have to set that as well for the test.
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ || PATH_SEPARATOR=';'
+ }
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+printf %s "checking for ld used by $CC... " >&6; }
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'`
+ while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+printf %s "checking for GNU ld... " >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+printf %s "checking for non-GNU ld... " >&6; }
+fi
+if test ${acl_cv_path_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$LD"; then
+ acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$acl_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ acl_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$acl_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$acl_save_ifs"
+else
+ acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+printf %s "checking if the linker ($LD) is GNU ld... " >&6; }
+if test ${acl_cv_prog_gnu_ld+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ acl_cv_prog_gnu_ld=yes
+ ;;
+*)
+ acl_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&5
+printf "%s\n" "$acl_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$acl_cv_prog_gnu_ld
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5
+printf %s "checking for shared library run path origin... " >&6; }
+if test ${acl_cv_rpath+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+ . ./conftest.sh
+ rm -f ./conftest.sh
+ acl_cv_rpath=done
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5
+printf "%s\n" "$acl_cv_rpath" >&6; }
+ wl="$acl_cv_wl"
+ acl_libext="$acl_cv_libext"
+ acl_shlibext="$acl_cv_shlibext"
+ acl_libname_spec="$acl_cv_libname_spec"
+ acl_library_names_spec="$acl_cv_library_names_spec"
+ acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+ acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+ acl_hardcode_direct="$acl_cv_hardcode_direct"
+ acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
+ # Check whether --enable-rpath was given.
+if test ${enable_rpath+y}
+then :
+ enableval=$enable_rpath; :
+else $as_nop
+ enable_rpath=yes
+fi
+
+
+ac_ext=cpp
+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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+printf %s "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+ if test ${ac_cv_prog_CXXCPP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # Double quotes because $CXX needs to be expanded
+ for CXXCPP in "$CXX -E" cpp /lib/cpp
+ do
+ ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else $as_nop
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+ break
+fi
+
+ done
+ ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+ CXXCPP=$ac_cv_prog_CXXCPP
+else
+ ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+printf "%s\n" "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else $as_nop
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=cpp
+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
+
+
+
+
+ acl_libdirstem=lib
+ acl_libdirstem2=
+ case "$host_os" in
+ solaris*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5
+printf %s "checking for 64-bit host... " >&6; }
+if test ${gl_cv_solaris_64bit+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef _LP64
+sixtyfour bits
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "sixtyfour bits" >/dev/null 2>&1
+then :
+ gl_cv_solaris_64bit=yes
+else $as_nop
+ gl_cv_solaris_64bit=no
+fi
+rm -rf conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5
+printf "%s\n" "$gl_cv_solaris_64bit" >&6; }
+ if test $gl_cv_solaris_64bit = yes; then
+ acl_libdirstem=lib/64
+ case "$host_cpu" in
+ sparc*) acl_libdirstem2=lib/sparcv9 ;;
+ i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
+ esac
+ fi
+ ;;
+ *)
+ searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+ if test -n "$searchpath"; then
+ acl_save_IFS="${IFS= }"; IFS=":"
+ for searchdir in $searchpath; do
+ if test -d "$searchdir"; then
+ case "$searchdir" in
+ */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
+ */../ | */.. )
+ # Better ignore directories of this form. They are misleading.
+ ;;
+ *) searchdir=`cd "$searchdir" && pwd`
+ case "$searchdir" in
+ */lib64 ) acl_libdirstem=lib64 ;;
+ esac ;;
+ esac
+ fi
+ done
+ IFS="$acl_save_IFS"
+ fi
+ ;;
+ esac
+ test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
+
+
+
+
+
+
+
+
+
+
+
+
+ use_additional=yes
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+
+# Check whether --with-libiconv-prefix was given.
+if test ${with_libiconv_prefix+y}
+then :
+ withval=$with_libiconv_prefix;
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ if test "$acl_libdirstem2" != "$acl_libdirstem" \
+ && ! test -d "$withval/$acl_libdirstem"; then
+ additional_libdir="$withval/$acl_libdirstem2"
+ fi
+ fi
+ fi
+
+fi
+
+ LIBICONV=
+ LTLIBICONV=
+ INCICONV=
+ LIBICONV_PREFIX=
+ HAVE_LIBICONV=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='iconv '
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value"
+ else
+ :
+ fi
+ else
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ eval libname=\"$acl_libname_spec\" # typically: libname=lib$name
+ if test -n "$acl_shlibext"; then
+ shrext=".$acl_shlibext" # typically: shrext=.so
+ else
+ shrext=
+ fi
+ if test $use_additional = yes; then
+ dir="$additional_libdir"
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext"; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIBICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext"; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name"
+ if test "X$found_so" != "X"; then
+ if test "$enable_rpath" = no \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ else
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ if test "$acl_hardcode_direct" = yes; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ else
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ haveit=
+ for x in $LDFLAGS $LIBICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir"
+ fi
+ if test "$acl_hardcode_minus_L" != no; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ else
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a"
+ else
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name"
+ fi
+ fi
+ additional_includedir=
+ case "$found_dir" in
+ */$acl_libdirstem | */$acl_libdirstem/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+ if test "$name" = 'iconv'; then
+ LIBICONV_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ */$acl_libdirstem2 | */$acl_libdirstem2/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+ if test "$name" = 'iconv'; then
+ LIBICONV_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INCICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -n "$found_la"; then
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
+ haveit=
+ if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIBICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIBICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+ ;;
+ *.la)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$dep"
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$acl_hardcode_libdir_separator"; then
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+ done
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+ else
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ for found_dir in $ltrpathdirs; do
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir"
+ done
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+ am_save_CPPFLAGS="$CPPFLAGS"
+
+ for element in $INCICONV; do
+ haveit=
+ for x in $CPPFLAGS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+ fi
+ done
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
+printf %s "checking for iconv... " >&6; }
+if test ${am_cv_func_iconv+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ am_cv_func_iconv="no, consider installing GNU libiconv"
+ am_cv_lib_iconv=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main (void)
+{
+iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+ am_cv_func_iconv=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test "$am_cv_func_iconv" != yes; then
+ am_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBICONV"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main (void)
+{
+iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+ am_cv_lib_iconv=yes
+ am_cv_func_iconv=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$am_save_LIBS"
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5
+printf "%s\n" "$am_cv_func_iconv" >&6; }
+ if test "$am_cv_func_iconv" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5
+printf %s "checking for working iconv... " >&6; }
+if test ${am_cv_func_iconv_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ am_save_LIBS="$LIBS"
+ if test $am_cv_lib_iconv = yes; then
+ LIBS="$LIBS $LIBICONV"
+ fi
+ am_cv_func_iconv_works=no
+ for ac_iconv_const in '' 'const'; do
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+ *) am_cv_func_iconv_works="guessing yes" ;;
+ esac
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <iconv.h>
+#include <string.h>
+
+#ifndef ICONV_CONST
+# define ICONV_CONST $ac_iconv_const
+#endif
+
+int
+main (void)
+{
+int result = 0;
+ /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
+ returns. */
+ {
+ iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+ if (cd_utf8_to_88591 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
+ char buf[10];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_utf8_to_88591,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ result |= 1;
+ iconv_close (cd_utf8_to_88591);
+ }
+ }
+ /* Test against Solaris 10 bug: Failures are not distinguishable from
+ successful returns. */
+ {
+ iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
+ if (cd_ascii_to_88591 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\263";
+ char buf[10];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_ascii_to_88591,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ result |= 2;
+ iconv_close (cd_ascii_to_88591);
+ }
+ }
+ /* Test against AIX 6.1..7.1 bug: Buffer overrun. */
+ {
+ iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
+ if (cd_88591_to_utf8 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\304";
+ static char buf[2] = { (char)0xDE, (char)0xAD };
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = 1;
+ char *outptr = buf;
+ size_t outbytesleft = 1;
+ size_t res = iconv (cd_88591_to_utf8,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
+ result |= 4;
+ iconv_close (cd_88591_to_utf8);
+ }
+ }
+#if 0 /* This bug could be worked around by the caller. */
+ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */
+ {
+ iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+ if (cd_88591_to_utf8 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char buf[50];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_88591_to_utf8,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if ((int)res > 0)
+ result |= 8;
+ iconv_close (cd_88591_to_utf8);
+ }
+ }
+#endif
+ /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+ provided. */
+ if (/* Try standardized names. */
+ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
+ /* Try IRIX, OSF/1 names. */
+ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
+ /* Try AIX names. */
+ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
+ /* Try HP-UX names. */
+ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
+ result |= 16;
+ return result;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"
+then :
+ am_cv_func_iconv_works=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ test "$am_cv_func_iconv_works" = no || break
+ done
+ LIBS="$am_save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5
+printf "%s\n" "$am_cv_func_iconv_works" >&6; }
+ case "$am_cv_func_iconv_works" in
+ *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+ *) am_func_iconv=yes ;;
+ esac
+ else
+ am_func_iconv=no am_cv_lib_iconv=no
+ fi
+ if test "$am_func_iconv" = yes; then
+
+printf "%s\n" "#define HAVE_ICONV 1" >>confdefs.h
+
+ fi
+ if test "$am_cv_lib_iconv" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5
+printf %s "checking how to link with libiconv... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5
+printf "%s\n" "$LIBICONV" >&6; }
+ else
+ CPPFLAGS="$am_save_CPPFLAGS"
+ LIBICONV=
+ LTLIBICONV=
+ fi
+
+
+
+ if test "$am_cv_func_iconv" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5
+printf %s "checking for iconv declaration... " >&6; }
+ if test ${am_cv_proto_iconv+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ am_cv_proto_iconv_arg1=""
+else $as_nop
+ am_cv_proto_iconv_arg1="const"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"
+fi
+
+ am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result:
+ $am_cv_proto_iconv" >&5
+printf "%s\n" "
+ $am_cv_proto_iconv" >&6; }
+
+printf "%s\n" "#define ICONV_CONST $am_cv_proto_iconv_arg1" >>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
+
+
+# we need LIBEXT
+LIBEXT=$acl_libext
+
+
+# checks for functions
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5
+printf %s "checking for working mmap... " >&6; }
+if test ${ac_cv_func_mmap_fixed_mapped+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in # ((
+ # Guess yes on platforms where we know the result.
+ linux*) ac_cv_func_mmap_fixed_mapped=yes ;;
+ # If we don't know, assume the worst.
+ *) ac_cv_func_mmap_fixed_mapped=no ;;
+ esac
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* 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 <fcntl.h>
+#include <sys/mman.h>
+
+/* This mess was copied from the GNU getpagesize.h. */
+#ifndef HAVE_GETPAGESIZE
+# ifdef _SC_PAGESIZE
+# define getpagesize() sysconf(_SC_PAGESIZE)
+# else /* no _SC_PAGESIZE */
+# ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+# 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 (void)
+{
+ char *data, *data2, *data3;
+ const char *cdata2;
+ int i, pagesize;
+ int fd, fd2;
+
+ pagesize = getpagesize ();
+
+ /* First, make a file with some known garbage in it. */
+ data = (char *) malloc (pagesize);
+ if (!data)
+ return 1;
+ for (i = 0; i < pagesize; ++i)
+ *(data + i) = rand ();
+ umask (0);
+ fd = creat ("conftest.mmap", 0600);
+ if (fd < 0)
+ return 2;
+ if (write (fd, data, pagesize) != pagesize)
+ return 3;
+ close (fd);
+
+ /* Next, check that the tail of a page is zero-filled. File must have
+ non-zero length, otherwise we risk SIGBUS for entire page. */
+ fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600);
+ if (fd2 < 0)
+ return 4;
+ cdata2 = "";
+ if (write (fd2, cdata2, 1) != 1)
+ return 5;
+ data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L);
+ if (data2 == MAP_FAILED)
+ return 6;
+ for (i = 0; i < pagesize; ++i)
+ if (*(data2 + i))
+ return 7;
+ close (fd2);
+ if (munmap (data2, pagesize))
+ return 8;
+
+ /* 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)
+ return 9;
+ if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_FIXED, fd, 0L))
+ return 10;
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data2 + i))
+ return 11;
+
+ /* 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)
+ return 12;
+ if (read (fd, data3, pagesize) != pagesize)
+ return 13;
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data3 + i))
+ return 14;
+ close (fd);
+ free (data);
+ free (data3);
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ ac_cv_func_mmap_fixed_mapped=yes
+else $as_nop
+ ac_cv_func_mmap_fixed_mapped=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5
+printf "%s\n" "$ac_cv_func_mmap_fixed_mapped" >&6; }
+if test $ac_cv_func_mmap_fixed_mapped = yes; then
+
+printf "%s\n" "#define HAVE_MMAP 1" >>confdefs.h
+
+fi
+rm -f conftest.mmap conftest.txt
+
+saved_libs="$LIBS"
+LIBS="$LIBS $LIBC $LIBM"
+ac_fn_c_check_func "$LINENO" "fmod" "ac_cv_func_fmod"
+if test "x$ac_cv_func_fmod" = xyes
+then :
+ printf "%s\n" "#define HAVE_FMOD 1" >>confdefs.h
+
+else $as_nop
+ case " $LIBOBJS " in
+ *" fmod.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS fmod.$ac_objext"
+ ;;
+esac
+
+fi
+ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd"
+if test "x$ac_cv_func_getcwd" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETCWD 1" >>confdefs.h
+
+else $as_nop
+ case " $LIBOBJS " in
+ *" getcwd.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS getcwd.$ac_objext"
+ ;;
+esac
+
+fi
+ac_fn_c_check_func "$LINENO" "putenv" "ac_cv_func_putenv"
+if test "x$ac_cv_func_putenv" = xyes
+then :
+ printf "%s\n" "#define HAVE_PUTENV 1" >>confdefs.h
+
+else $as_nop
+ case " $LIBOBJS " in
+ *" putenv.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS putenv.$ac_objext"
+ ;;
+esac
+
+fi
+ac_fn_c_check_func "$LINENO" "strcasecmp" "ac_cv_func_strcasecmp"
+if test "x$ac_cv_func_strcasecmp" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRCASECMP 1" >>confdefs.h
+
+else $as_nop
+ case " $LIBOBJS " in
+ *" strcasecmp.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS strcasecmp.$ac_objext"
+ ;;
+esac
+
+fi
+ac_fn_c_check_func "$LINENO" "strerror" "ac_cv_func_strerror"
+if test "x$ac_cv_func_strerror" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRERROR 1" >>confdefs.h
+
+else $as_nop
+ case " $LIBOBJS " in
+ *" strerror.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS strerror.$ac_objext"
+ ;;
+esac
+
+fi
+ac_fn_c_check_func "$LINENO" "strncasecmp" "ac_cv_func_strncasecmp"
+if test "x$ac_cv_func_strncasecmp" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRNCASECMP 1" >>confdefs.h
+
+else $as_nop
+ case " $LIBOBJS " in
+ *" strncasecmp.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS strncasecmp.$ac_objext"
+ ;;
+esac
+
+fi
+ac_fn_c_check_func "$LINENO" "strtol" "ac_cv_func_strtol"
+if test "x$ac_cv_func_strtol" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRTOL 1" >>confdefs.h
+
+else $as_nop
+ case " $LIBOBJS " in
+ *" strtol.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS strtol.$ac_objext"
+ ;;
+esac
+
+fi
+
+LIBS="$saved_libs"
+ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday"
+if test "x$ac_cv_func_gettimeofday" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "isatty" "ac_cv_func_isatty"
+if test "x$ac_cv_func_isatty" = xyes
+then :
+ printf "%s\n" "#define HAVE_ISATTY 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "kill" "ac_cv_func_kill"
+if test "x$ac_cv_func_kill" = xyes
+then :
+ printf "%s\n" "#define HAVE_KILL 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "rename" "ac_cv_func_rename"
+if test "x$ac_cv_func_rename" = xyes
+then :
+ printf "%s\n" "#define HAVE_RENAME 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale"
+if test "x$ac_cv_func_setlocale" = xyes
+then :
+ printf "%s\n" "#define HAVE_SETLOCALE 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "strdup" "ac_cv_func_strdup"
+if test "x$ac_cv_func_strdup" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRDUP 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "strsep" "ac_cv_func_strsep"
+if test "x$ac_cv_func_strsep" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRSEP 1" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mkstemp" >&5
+printf %s "checking for mkstemp... " >&6; }
+ ac_ext=cpp
+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 confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <stdlib.h>
+#include <unistd.h>
+int (*f) (char *);
+
+
+int
+main (void)
+{
+
+
+f = mkstemp;
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+printf "%s\n" "#define HAVE_MKSTEMP 1" >>confdefs.h
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ case " $LIBOBJS " in
+ *" mkstemp.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS mkstemp.$ac_objext"
+ ;;
+esac
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ 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
+
+ac_fn_check_decl "$LINENO" "strsignal" "ac_cv_have_decl_strsignal" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_strsignal" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_STRSIGNAL $ac_have_decl" >>confdefs.h
+ac_fn_check_decl "$LINENO" "getc_unlocked" "ac_cv_have_decl_getc_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_getc_unlocked" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_GETC_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "sys_siglist" "ac_cv_have_decl_sys_siglist" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_sys_siglist" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_SYS_SIGLIST $ac_have_decl" >>confdefs.h
+ac_fn_check_decl "$LINENO" "getc_unlocked" "ac_cv_have_decl_getc_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_getc_unlocked" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_GETC_UNLOCKED $ac_have_decl" >>confdefs.h
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5
+printf %s "checking for nl_langinfo and CODESET... " >&6; }
+if test ${am_cv_langinfo_codeset+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <langinfo.h>
+int
+main (void)
+{
+char* cs = nl_langinfo(CODESET); return !cs;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ am_cv_langinfo_codeset=yes
+else $as_nop
+ am_cv_langinfo_codeset=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5
+printf "%s\n" "$am_cv_langinfo_codeset" >&6; }
+ if test $am_cv_langinfo_codeset = yes; then
+
+printf "%s\n" "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h
+
+ fi
+
+
+# checks for compiler characteristics
+ac_ext=cpp
+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
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ISO C++98 array deletion syntax is supported" >&5
+printf %s "checking whether ISO C++98 array deletion syntax is supported... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+int
+main (void)
+{
+
+
+char *p = new char[5];
+delete [] p;
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ as_fn_error $? "an ISO C++98-conformant compiler is required" "$LINENO" 5
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam 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=cpp
+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
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C preprocessor uses pre-ISO C90 syntax" >&5
+printf %s "checking whether C preprocessor uses pre-ISO C90 syntax... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#define name2(a, b) a/**/b
+
+
+int
+main (void)
+{
+
+
+int name2(foo, bar);
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ as_fn_error $? "an ISO C90-conformant C preprocessor is required" "$LINENO" 5
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking w_coredump" >&5
+printf %s "checking w_coredump... " >&6; }
+ if test "$cross_compiling" = yes
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <sys/types.h>
+#include <sys/wait.h>
+
+
+int
+main (void)
+{
+
+
+main()
+{
+#ifdef WCOREFLAG
+ exit(1);
+#else
+ int i = 0;
+ ((union wait *)&i)->w_coredump = 1;
+ exit(i != 0200);
+#endif
+}
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+printf "%s\n" "#define WCOREFLAG 0200" >>confdefs.h
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+# URW fonts extra dir
+
+
+# Check whether --with-urw-fonts-dir was given.
+if test ${with_urw_fonts_dir+y}
+then :
+ withval=$with_urw_fonts_dir; urwfontsdir="$withval"
+fi
+
+
+
+# use groff's own malloc-based allocator for C++ new/delete operators
+
+ # Check whether --enable-groff-allocator was given.
+if test ${enable_groff_allocator+y}
+then :
+ enableval=$enable_groff_allocator; test "$enableval" = yes && groff_use_own_allocator=yes
+else $as_nop
+ groff_use_own_allocator=no
+fi
+
+
+
+# other random stuff
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking default value for grops -b option" >&5
+printf %s "checking default value for grops -b option... " >&6; }
+ test -n "$BROKEN_SPOOLER_FLAGS" || BROKEN_SPOOLER_FLAGS=0
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $BROKEN_SPOOLER_FLAGS" >&5
+printf "%s\n" "$BROKEN_SPOOLER_FLAGS" >&6; }
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking default paper format" >&5
+printf %s "checking default paper format... " >&6; }
+ groff_prefix=$prefix
+ test "$prefix" = NONE && groff_prefix=$ac_default_prefix
+ if test -z "$PAGE" && test -r /etc/papersize
+ then
+ sedexpr='s/#.*//;s/[ \t]\+/ /;s/ \+$//;s/^ \+//;/^$/d;p'
+ PAGE=`sed -n "$sedexpr" /etc/papersize`
+ fi
+ 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 -q '^paperlength[ ]\+841890' "$descfile"
+ then
+ PAGE=A4
+ elif grep -q '^papersize[ ]\+[aA]4' "$descfile"
+ then
+ PAGE=A4
+ fi
+ fi
+ fi
+
+ if test -z "$PAGE"
+ then
+ domains=
+ if test -r /etc/resolv.conf
+ then
+ sedexpr='s/#.*//;s/[ \t]\+/ /;s/ \+$//;s/^ \+//;/^$/d;
+/^\(domain\|search\)/!d;s/\(domain\|search\) //;p'
+ domains=`sed -n "$sedexpr" /etc/resolv.conf`
+ fi
+ if test -z "$domains"
+ then
+ domains=`(domainname) 2>/dev/null | tr -d '+'`
+ if test -z "$domains" || test "$domains" = '(none)'
+ then
+ domains=`(hostname) 2>/dev/null | grep '\.'`
+ fi
+ fi
+ # resolv.conf's "search" directive might return multiple domains.
+ # If any top-level domain is two letters and it's not 'us' or 'ca',
+ # assume the system uses A4 paper.
+ for d in $domains
+ do
+ case "$d" in
+ *.[Uu][Ss]|*.[Cc][Aa])
+ ;;
+ *.[A-Za-z][A-Za-z])
+ PAGE=A4 ;;
+ esac
+ done
+ fi
+
+ test -n "$PAGE" || PAGE=letter
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PAGE" >&5
+printf "%s\n" "$PAGE" >&6; }
+
+
+
+ g=
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for existing troff installation" >&5
+printf %s "checking for existing troff installation... " >&6; }
+ if test "`(echo .tm '|n(.g' | tr '|' '\\\\' | troff -z -i 2>&1) \
+ 2>/dev/null`" = 0
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ g=g
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ fi
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for prefix of system macro packages" >&5
+printf %s "checking for prefix of system macro packages... " >&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
+ sys_tmac_prefix_result=none
+ test -z "$sys_tmac_prefix" \
+ || sys_tmac_prefix_result="$sys_tmac_prefix"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $sys_tmac_prefix_result" >&5
+printf "%s\n" "$sys_tmac_prefix_result" >&6; }
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which system macro packages should be made available" >&5
+printf %s "checking which system macro packages should be made available... " >&6; }
+ tmac_wrap=
+ if test "$sys_tmac_file_prefix" = tmac.; 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
+ tmac_wrap_result="none found"
+ test -z "$tmac_wrap" || tmac_wrap_result="$tmac_wrap"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $tmac_wrap_result" >&5
+printf "%s\n" "$tmac_wrap_result" >&6; }
+
+
+# Check whether --with-compatibility-wrappers was given.
+if test ${with_compatibility_wrappers+y}
+then :
+ withval=$with_compatibility_wrappers; compatibility_wrappers="$withval"
+else $as_nop
+ compatibility_wrappers="check"
+fi
+
+
+ if test "$compatibility_wrappers" != check \
+ && test "$compatibility_wrappers" != yes \
+ && test "$compatibility_wrappers" != no \
+ && test "$compatibility_wrappers" != manual
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Invalid '--with-compatibility-wrappers' argument: '$compatibility_wrappers' - assuming 'check' requested." >&5
+printf "%s\n" "$as_me: WARNING: Invalid '--with-compatibility-wrappers' argument: '$compatibility_wrappers' - assuming 'check' requested." >&2;}
+ compatibility_wrappers="check"
+ fi
+
+ if test -z "$tmac_wrap"
+ then
+ # No Operating System Macro Sets Present
+ if test "$compatibility_wrappers" = check
+ then
+ compatibility_wrappers="no"
+ elif test "$compatibility_wrappers" = yes
+ then
+ as_fn_error $? "No non-GNU macro sets found - cannot create and install compatibility wrappers" "$LINENO" 5
+ elif test "$compatibility_wrappers" = no
+ then
+ : # No action required
+ elif test "$compatibility_wrappers" = manual
+ then
+ # 'manual' allows quiet conversion to 'no' to support
+ # cross-platform build instructions
+ compatibility_wrappers="no"
+ fi
+ else
+ # One or more Operating System Macro Sets Present
+ if test "$compatibility_wrappers" = check
+ then
+ compatibility_wrappers="yes"
+ fi
+ fi
+
+ # Now compatibility_wrappers can only be yes, no or manual
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking separator character to use in groff search paths" >&5
+printf %s "checking separator character to use in groff search paths... " >&6; }
+ cp "$srcdir"/src/include/nonposix.h conftest.h
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <ctype.h>
+#include "conftest.h"
+
+
+int
+main (void)
+{
+
+
+#if PATH_SEP_CHAR == ';'
+make an error "Path separator is ';'"
+#endif
+
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ GROFF_PATH_SEPARATOR=":"
+else $as_nop
+ GROFF_PATH_SEPARATOR=";"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GROFF_PATH_SEPARATOR" >&5
+printf "%s\n" "$GROFF_PATH_SEPARATOR" >&6; }
+
+
+# Check whether --with-alt-gs was given.
+if test ${with_alt_gs+y}
+then :
+ withval=$with_alt_gs; ALT_GHOSTSCRIPT_PROGS="$withval"
+else $as_nop
+ ALT_GHOSTSCRIPT_PROGS="gs gswin32c gsos2"
+fi
+
+
+
+
+# Check whether --with-gs was given.
+if test ${with_gs+y}
+then :
+ withval=$with_gs; GHOSTSCRIPT=$withval
+else $as_nop
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_GHOSTSCRIPT+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_GHOSTSCRIPT="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+GHOSTSCRIPT=$ac_cv_prog_GHOSTSCRIPT
+if test -n "$GHOSTSCRIPT"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GHOSTSCRIPT" >&5
+printf "%s\n" "$GHOSTSCRIPT" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_GHOSTSCRIPT+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_GHOSTSCRIPT="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_GHOSTSCRIPT=$ac_cv_prog_ac_ct_GHOSTSCRIPT
+if test -n "$ac_ct_GHOSTSCRIPT"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_GHOSTSCRIPT" >&5
+printf "%s\n" "$ac_ct_GHOSTSCRIPT" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_GHOSTSCRIPT" && break
+done
+
+ if test "x$ac_ct_GHOSTSCRIPT" = x; then
+ GHOSTSCRIPT="missing"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ GHOSTSCRIPT=$ac_ct_GHOSTSCRIPT
+ fi
+fi
+
+fi
+
+ test "$GHOSTSCRIPT" = no && GHOSTSCRIPT=missing
+
+
+
+ make_htmldoc=no
+ missing=
+
+ # Extract the first word of "pnmcrop", so it can be a program name with args.
+set dummy pnmcrop; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_pnmcrop+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_pnmcrop="found"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_pnmcrop" && ac_cv_prog_pnmcrop="missing"
+fi
+fi
+pnmcrop=$ac_cv_prog_pnmcrop
+if test -n "$pnmcrop"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $pnmcrop" >&5
+printf "%s\n" "$pnmcrop" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ if test $pnmcrop = missing
+ then
+ missing="$missing 'pnmcrop'"
+ fi
+
+ # Extract the first word of "pnmcut", so it can be a program name with args.
+set dummy pnmcut; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_pnmcut+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_pnmcut="found"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_pnmcut" && ac_cv_prog_pnmcut="missing"
+fi
+fi
+pnmcut=$ac_cv_prog_pnmcut
+if test -n "$pnmcut"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $pnmcut" >&5
+printf "%s\n" "$pnmcut" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ if test $pnmcut = missing
+ then
+ missing="$missing 'pnmcut'"
+ fi
+
+ # Extract the first word of "pnmtopng", so it can be a program name with args.
+set dummy pnmtopng; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_pnmtopng+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_pnmtopng="found"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_pnmtopng" && ac_cv_prog_pnmtopng="missing"
+fi
+fi
+pnmtopng=$ac_cv_prog_pnmtopng
+if test -n "$pnmtopng"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $pnmtopng" >&5
+printf "%s\n" "$pnmtopng" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ if test $pnmtopng = missing
+ then
+ missing="$missing 'pnmtopng'"
+ fi
+
+ # Extract the first word of "pnmtops", so it can be a program name with args.
+set dummy pnmtops; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_pnmtops+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_pnmtops="found"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_pnmtops" && ac_cv_prog_pnmtops="missing"
+fi
+fi
+pnmtops=$ac_cv_prog_pnmtops
+if test -n "$pnmtops"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $pnmtops" >&5
+printf "%s\n" "$pnmtops" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ if test $pnmtops = missing
+ then
+ missing="$missing 'pnmtops'"
+ fi
+
+ # Extract the first word of "psselect", so it can be a program name with args.
+set dummy psselect; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_psselect+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_psselect="found"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_psselect" && ac_cv_prog_psselect="missing"
+fi
+fi
+psselect=$ac_cv_prog_psselect
+if test -n "$psselect"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $psselect" >&5
+printf "%s\n" "$psselect" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ if test $psselect = missing
+ then
+ missing="$missing 'psselect'"
+ fi
+
+
+ test "$GHOSTSCRIPT" = "missing" && missing="'gs' $missing"
+
+ if test -z "$missing"
+ then
+ make_htmldoc=yes
+ else
+ plural=`set $missing; test $# -gt 1 && echo s`
+ oxford=`set $missing; test $# -gt 2 && echo ,`
+ missing=`set $missing
+ missing=
+ while test $# -gt 0
+ do
+ case $# in
+ 1) missing="$missing$1" ;;
+ 2) missing="$missing$1$oxford and " ;;
+ *) missing="$missing$1, " ;;
+ esac
+ shift
+ done
+ echo $missing`
+ verb=`set $missing
+ if test $# -gt 1
+ then
+ echo were
+ else
+ echo was
+ fi`
+
+ grohtml_notice="The program$plural $missing $verb not found in \
+\$PATH.
+
+ Consequently, groff's HTML output driver, 'grohtml', will not work
+ properly. It will not be possible to prepare or install
+ groff-generated documentation in HTML format.
+"
+ fi
+
+
+
+# Check whether --with-alt-awk was given.
+if test ${with_alt_awk+y}
+then :
+ withval=$with_alt_awk; ALT_AWK_PROGS="$withval"
+else $as_nop
+ ALT_AWK_PROGS="gawk mawk nawk awk"
+fi
+
+
+
+
+# Check whether --with-awk was given.
+if test ${with_awk+y}
+then :
+ withval=$with_awk; AWK=$withval
+else $as_nop
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AWK+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+printf "%s\n" "$AWK" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_AWK+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AWK="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AWK=$ac_cv_prog_ac_ct_AWK
+if test -n "$ac_ct_AWK"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AWK" >&5
+printf "%s\n" "$ac_ct_AWK" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_AWK" && break
+done
+
+ if test "x$ac_ct_AWK" = x; then
+ AWK="missing"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ AWK=$ac_ct_AWK
+ fi
+fi
+
+fi
+
+ test "$AWK" = no && AWK=missing
+
+
+
+
+ use_pdfroff=no
+ pdfroff_missing_deps=
+
+ test "$AWK" = missing && pdfroff_missing_deps="awk"
+
+ if test "$GHOSTSCRIPT" = missing
+ then
+ verb=is
+
+ if test -n "$pdfroff_missing_deps"
+ then
+ pdfroff_missing_deps="$pdfroff_missing_deps and "
+ verb=are
+ fi
+ pdfroff_missing_deps="${pdfroff_missing_deps}Ghostscript $verb"
+ fi
+
+ if test -z "$pdfroff_missing_deps"
+ then
+ use_pdfroff=yes
+ fi
+
+
+
+
+
+
+ groff_have_urw_fonts=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for URW fonts in Type 1/PFB format" >&5
+printf %s "checking for URW fonts in Type 1/PFB format... " >&6; }
+
+ _list_paths="\
+ /usr/share/fonts/type1/gsfonts/ \
+ /usr/share/fonts/default/Type1/ \
+ /usr/share/fonts/default/Type1/adobestd35/ \
+ /usr/share/fonts/type1/urw-base35/ \
+ /opt/local/share/fonts/urw-fonts/ \
+ /usr/local/share/fonts/ghostscript/"
+
+ if test -n "$urwfontsdir"
+ then
+ _list_paths="$urwfontsdir"
+ fi
+
+ for k in $_list_paths
+ do
+ for _font_file in \
+ URWGothic-Book \
+ URWGothic-Book.t1 \
+ URWGothic-Book.pfb \
+ URWGothicL-Book.pfb \
+ a010013l.pfb
+ do
+ if test -f $k/$_font_file
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: found in $k" >&5
+printf "%s\n" "found in $k" >&6; }
+ groff_have_urw_fonts=yes
+ urwfontsdir=$k
+ break 2
+ fi
+ done
+ done
+
+ if test $groff_have_urw_fonts = no
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none found" >&5
+printf "%s\n" "none found" >&6; }
+ urwfontsdir=
+ fi
+
+
+
+
+
+
+
+
+ use_gropdf=no
+ gropdf_missing_deps=
+
+ if test "$GHOSTSCRIPT" != missing \
+ || test "$groff_have_urw_fonts" = yes
+ then
+ use_gropdf=yes
+ fi
+
+
+
+
+
+
+ pnmtools_quiet=
+
+ if test "$make_htmldoc" = yes
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether PNM tools accept the '-quiet' option" >&5
+printf %s "checking whether PNM tools accept the '-quiet' option... " >&6; }
+ if echo P2 2 2 255 0 1 2 0 | pnmtops -quiet > /dev/null 2>&1
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ pnmtools_quiet=-quiet
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ fi
+ fi
+
+
+
+
+
+ pnmtops_nosetpage="pnmtops $pnmtools_quiet"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pnmtops accepts the '-nosetpage' option" >&5
+printf %s "checking whether pnmtops accepts the '-nosetpage' option... " >&6; }
+ if echo P2 2 2 255 0 1 2 0 | pnmtops -nosetpage > /dev/null 2>&1
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ pnmtops_nosetpage="pnmtops $pnmtools_quiet -nosetpage"
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether make defines 'RM'" >&5
+printf %s "checking whether make defines 'RM'... " >&6; }
+ make=make
+ if test -n "$MAKE"
+ then
+ make=$MAKE
+ fi
+ cat <<EOF > test_make_rm.mk
+all:
+ @if test -n "\$(RM)"; \
+ then \
+ echo yes; \
+ else \
+ echo no; \
+ fi
+EOF
+ groff_make_defines_rm=`"$make" -sf test_make_rm.mk`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_make_defines_rm" >&5
+printf "%s\n" "$groff_make_defines_rm" >&6; }
+ rm -f test_make_rm.mk
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a diff program that supports option -D" >&5
+printf %s "checking for a diff program that supports option -D... " >&6; }
+ groff_has_diff_d_option=no
+ DIFF_PROG=diff
+ diff -Dx /dev/null /dev/null >/dev/null 2>&1 && groff_has_diff_d_option=yes
+ if test "$groff_has_diff_d_option" = no; then
+ for ac_prog in gdiff
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_GDIFF+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$GDIFF"; then
+ ac_cv_prog_GDIFF="$GDIFF" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_GDIFF="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+GDIFF=$ac_cv_prog_GDIFF
+if test -n "$GDIFF"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GDIFF" >&5
+printf "%s\n" "$GDIFF" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$GDIFF" && break
+done
+
+ if test -n "$GDIFF"; then
+ "$GDIFF" -Dx /dev/null /dev/null >/dev/null 2>&1 && groff_has_diff_d_option=yes
+ if test "$groff_has_diff_d_option" = yes; then
+ DIFF_PROG="$GDIFF"
+ fi
+ fi
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_has_diff_d_option" >&5
+printf "%s\n" "$groff_has_diff_d_option" >&6; }
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether test supports option -ef" >&5
+printf %s "checking whether test supports option -ef... " >&6; }
+ HAVE_TEST_EF_OPTION=no
+ test /dev/null -ef /dev/null > /dev/null 2>&1 && HAVE_TEST_EF_OPTION=yes
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $HAVE_TEST_EF_OPTION" >&5
+printf "%s\n" "$HAVE_TEST_EF_OPTION" >&6; }
+
+for ac_prog in bash
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_BASH_PROG+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $BASH_PROG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_BASH_PROG="$BASH_PROG" # 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_BASH_PROG="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+BASH_PROG=$ac_cv_path_BASH_PROG
+if test -n "$BASH_PROG"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $BASH_PROG" >&5
+printf "%s\n" "$BASH_PROG" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$BASH_PROG" && break
+done
+test -n "$BASH_PROG" || BASH_PROG="no"
+
+ if test "$BASH_PROG" = no; then
+ BASH_PROG=/bin/sh
+ fi
+
+
+
+
+ if test "$GHOSTSCRIPT" != missing
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gs version with good left sidebearing handling" >&5
+printf %s "checking for gs version with good left sidebearing handling... " >&6; }
+ ghostscript_notice=
+ ghostscript_version_good=
+ ghostscript_v_string=`"$GHOSTSCRIPT" -v | sed 1q`
+ # Get first word.
+ ghostscript_words=`echo "$ghostscript_v_string" | cut -d\ -f1-`
+
+ # If the first word is "GPL", discard it.
+ if expr "$ghostscript_words" : "GPL" > /dev/null
+ then
+ ghostscript_words=`echo "$ghostscript_words" | cut -d\ -f2-`
+ fi
+
+ # Only do a version check if the program calls itself Ghostscript.
+ if expr "$ghostscript_words" : "Ghostscript" > /dev/null
+ then
+ ghostscript_version_good=no
+ ghostscript_version=`echo "$ghostscript_words" | cut -d\ -f2`
+ ghostscript_major=`echo "$ghostscript_version" | cut -d. -f1`
+ ghostscript_minor=`echo "$ghostscript_version" | cut -d. -f2`
+
+ if test "$ghostscript_major" -lt 9
+ then
+ ghostscript_version_good=yes
+ elif test "$ghostscript_major" -ge 10
+ then
+ ghostscript_version_good=yes
+ elif test "$ghostscript_minor" -ge 54
+ then
+ ghostscript_version_good=yes
+ fi
+ fi
+
+ if test "$ghostscript_version_good" = yes
+ then
+ ghostscript_version="$ghostscript_version (good)"
+ elif test "$ghostscript_version_good" = no
+ then
+ ghostscript_version="$ghostscript_version (buggy)"
+ ghostscript_notice="Buggy version of Ghostscript detected."
+ else
+ ghostscript_notice="Unable to determine version of Ghostscript."
+ fi
+
+ if test -n "$ghostscript_version"
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: got $ghostscript_version" >&5
+printf "%s\n" "got $ghostscript_version" >&6; }
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unable to determine" >&5
+printf "%s\n" "unable to determine" >&6; }
+ fi
+ fi
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C Library >= 2.1 or uClibc" >&5
+printf %s "checking whether we are using the GNU C Library >= 2.1 or uClibc... " >&6; }
+if test ${ac_cv_gnu_library_2_1+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+ Lucky GNU user
+ #endif
+#endif
+#ifdef __UCLIBC__
+ Lucky user
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Lucky" >/dev/null 2>&1
+then :
+ ac_cv_gnu_library_2_1=yes
+else $as_nop
+ ac_cv_gnu_library_2_1=no
+fi
+rm -rf conftest*
+
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gnu_library_2_1" >&5
+printf "%s\n" "$ac_cv_gnu_library_2_1" >&6; }
+
+ GLIBC21="$ac_cv_gnu_library_2_1"
+
+
+
+
+
+
+
+
+
+
+
+ if test -n "$make_winscripts"; then
+ BUILD_WINSCRIPTS_TRUE=
+ BUILD_WINSCRIPTS_FALSE='#'
+else
+ BUILD_WINSCRIPTS_TRUE='#'
+ BUILD_WINSCRIPTS_FALSE=
+fi
+
+
+# If X11 is not available, don't build:
+# font/devX75
+# font/devX75-12
+# font/devX100
+# font/devX100-12
+# src/devices/xditview
+# src/utils/xtotroff
+# src/libs/libxutil
+ if test "$groff_no_x" = yes; then
+ WITHOUT_X11_TRUE=
+ WITHOUT_X11_FALSE='#'
+else
+ WITHOUT_X11_TRUE='#'
+ WITHOUT_X11_FALSE=
+fi
+
+
+ if test "$groff_make_defines_rm" = yes; then
+ MAKE_DEFINES_RM_TRUE=
+ MAKE_DEFINES_RM_FALSE='#'
+else
+ MAKE_DEFINES_RM_TRUE='#'
+ MAKE_DEFINES_RM_FALSE=
+fi
+
+
+# Some programs have a "g" prefix if an existing troff installation is
+# detected.
+ if test "$g" = g; then
+ USEPROGRAMPREFIX_TRUE=
+ USEPROGRAMPREFIX_FALSE='#'
+else
+ USEPROGRAMPREFIX_TRUE='#'
+ USEPROGRAMPREFIX_FALSE=
+fi
+
+
+ if test "$use_grohtml" = yes; then
+ USE_GROHTML_TRUE=
+ USE_GROHTML_FALSE='#'
+else
+ USE_GROHTML_TRUE='#'
+ USE_GROHTML_FALSE=
+fi
+
+ if test "$use_pdfroff" = yes; then
+ USE_PDFROFF_TRUE=
+ USE_PDFROFF_FALSE='#'
+else
+ USE_PDFROFF_TRUE='#'
+ USE_PDFROFF_FALSE=
+fi
+
+ if test "$use_gropdf" = yes; then
+ USE_GROPDF_TRUE=
+ USE_GROPDF_FALSE='#'
+else
+ USE_GROPDF_TRUE='#'
+ USE_GROPDF_FALSE=
+fi
+
+ if test "$groff_use_own_allocator" = yes; then
+ USE_GROFF_ALLOCATOR_TRUE=
+ USE_GROFF_ALLOCATOR_FALSE='#'
+else
+ USE_GROFF_ALLOCATOR_TRUE='#'
+ USE_GROFF_ALLOCATOR_FALSE=
+fi
+
+ if test "$GHOSTSCRIPT" != no \
+ && test "$GHOSTSCRIPT" != missing; then
+ HAVE_GHOSTSCRIPT_TRUE=
+ HAVE_GHOSTSCRIPT_FALSE='#'
+else
+ HAVE_GHOSTSCRIPT_TRUE='#'
+ HAVE_GHOSTSCRIPT_FALSE=
+fi
+
+ if test "$groff_have_urw_fonts" = yes ; then
+ HAVE_URW_FONTS_TRUE=
+ HAVE_URW_FONTS_FALSE='#'
+else
+ HAVE_URW_FONTS_TRUE='#'
+ HAVE_URW_FONTS_FALSE=
+fi
+
+ if test "$groff_have_texi2dvi" = yes ; then
+ HAVE_TEXI2DVI_TRUE=
+ HAVE_TEXI2DVI_FALSE='#'
+else
+ HAVE_TEXI2DVI_TRUE='#'
+ HAVE_TEXI2DVI_FALSE=
+fi
+
+ if test "$groff_use_tex" = yes ; then
+ USE_TEX_TRUE=
+ USE_TEX_FALSE='#'
+else
+ USE_TEX_TRUE='#'
+ USE_TEX_FALSE=
+fi
+
+
+ac_config_files="$ac_config_files Makefile"
+
+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, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+printf %s "checking that generated files are newer than configure... " >&6; }
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5
+printf "%s\n" "done" >&6; }
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+ if test -n "$EXEEXT"; then
+ am__EXEEXT_TRUE=
+ am__EXEEXT_FALSE='#'
+else
+ am__EXEEXT_TRUE='#'
+ am__EXEEXT_FALSE=
+fi
+
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_COND_LIBTOOL_TRUE}" && test -z "${GL_COND_LIBTOOL_FALSE}"; then
+ as_fn_error $? "conditional \"GL_COND_LIBTOOL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+
+
+ gl_libobjs=
+ gl_ltlibobjs=
+ gl_libobjdeps=
+ if test -n "$gl_LIBOBJS"; then
+ # Remove the extension.
+ sed_drop_objext='s/\.o$//;s/\.obj$//'
+ sed_dirname1='s,//*,/,g'
+ sed_dirname2='s,\(.\)/$,\1,'
+ sed_dirname3='s,^[^/]*$,.,'
+ sed_dirname4='s,\(.\)/[^/]*$,\1,'
+ sed_basename1='s,.*/,,'
+ for i in `for i in $gl_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do
+ gl_libobjs="$gl_libobjs lib/$i.$ac_objext"
+ gl_ltlibobjs="$gl_ltlibobjs lib/$i.lo"
+ i_dir=`echo "$i" | sed -e "$sed_dirname1" -e "$sed_dirname2" -e "$sed_dirname3" -e "$sed_dirname4"`
+ i_base=`echo "$i" | sed -e "$sed_basename1"`
+ gl_libobjdeps="$gl_libobjdeps lib/$i_dir/\$(DEPDIR)/$i_base.Po"
+ done
+ fi
+ gl_LIBOBJS=$gl_libobjs
+
+ gl_LTLIBOBJS=$gl_ltlibobjs
+
+ gl_LIBOBJDEPS=$gl_libobjdeps
+
+
+
+ gltests_libobjs=
+ gltests_ltlibobjs=
+ gltests_libobjdeps=
+ if test -n "$gltests_LIBOBJS"; then
+ # Remove the extension.
+ sed_drop_objext='s/\.o$//;s/\.obj$//'
+ sed_dirname1='s,//*,/,g'
+ sed_dirname2='s,\(.\)/$,\1,'
+ sed_dirname3='s,^[^/]*$,.,'
+ sed_dirname4='s,\(.\)/[^/]*$,\1,'
+ sed_basename1='s,.*/,,'
+ for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do
+ gltests_libobjs="$gltests_libobjs lib/$i.$ac_objext"
+ gltests_ltlibobjs="$gltests_ltlibobjs lib/$i.lo"
+ i_dir=`echo "$i" | sed -e "$sed_dirname1" -e "$sed_dirname2" -e "$sed_dirname3" -e "$sed_dirname4"`
+ i_base=`echo "$i" | sed -e "$sed_basename1"`
+ gltests_libobjdeps="$gltests_libobjdeps lib/$i_dir/\$(DEPDIR)/$i_base.Po"
+ done
+ fi
+ gltests_LIBOBJS=$gltests_libobjs
+
+ gltests_LTLIBOBJS=$gltests_ltlibobjs
+
+ gltests_LIBOBJDEPS=$gltests_libobjdeps
+
+
+
+if test -z "${BUILD_WINSCRIPTS_TRUE}" && test -z "${BUILD_WINSCRIPTS_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_WINSCRIPTS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITHOUT_X11_TRUE}" && test -z "${WITHOUT_X11_FALSE}"; then
+ as_fn_error $? "conditional \"WITHOUT_X11\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${MAKE_DEFINES_RM_TRUE}" && test -z "${MAKE_DEFINES_RM_FALSE}"; then
+ as_fn_error $? "conditional \"MAKE_DEFINES_RM\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USEPROGRAMPREFIX_TRUE}" && test -z "${USEPROGRAMPREFIX_FALSE}"; then
+ as_fn_error $? "conditional \"USEPROGRAMPREFIX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_GROHTML_TRUE}" && test -z "${USE_GROHTML_FALSE}"; then
+ as_fn_error $? "conditional \"USE_GROHTML\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PDFROFF_TRUE}" && test -z "${USE_PDFROFF_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PDFROFF\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_GROPDF_TRUE}" && test -z "${USE_GROPDF_FALSE}"; then
+ as_fn_error $? "conditional \"USE_GROPDF\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_GROFF_ALLOCATOR_TRUE}" && test -z "${USE_GROFF_ALLOCATOR_FALSE}"; then
+ as_fn_error $? "conditional \"USE_GROFF_ALLOCATOR\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_GHOSTSCRIPT_TRUE}" && test -z "${HAVE_GHOSTSCRIPT_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_GHOSTSCRIPT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_URW_FONTS_TRUE}" && test -z "${HAVE_URW_FONTS_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_URW_FONTS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_TEXI2DVI_TRUE}" && test -z "${HAVE_TEXI2DVI_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_TEXI2DVI\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_TEX_TRUE}" && test -z "${USE_TEX_FALSE}"; then
+ as_fn_error $? "conditional \"USE_TEX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else $as_nop
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
+as_nl='
+'
+export as_nl
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
+
+# The user is always right.
+if ${PATH_SEPARATOR+false} :; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ printf "%s\n" "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else $as_nop
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else $as_nop
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by GNU roff $as_me 1.23.0, which was
+generated by GNU Autoconf 2.71. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <http://savannah.gnu.org/bugs/?group=groff>.
+GNU roff home page: <https://www.gnu.org/software/groff/>.
+General help using GNU software: <https://www.gnu.org/gethelp/>."
+
+_ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config='$ac_cs_config_escaped'
+ac_cs_version="\\
+GNU roff config.status 1.23.0
+configured by $0, generated by GNU Autoconf 2.71,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2021 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ printf "%s\n" "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ printf "%s\n" "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ printf "%s\n" "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ printf "%s\n" "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "src/include/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/include/config.h:src/include/config.hin" ;;
+ "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "test-groff") CONFIG_FILES="$CONFIG_FILES test-groff" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
+ test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers
+ test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any. Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[ ]*#[ ]*define[ ][ ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ for (key in D) D_is_set[key] = 1
+ FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+ line = \$ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`printf "%s\n" "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+ ac_MKDIR_P=$MKDIR_P
+ case $MKDIR_P in
+ [\\/$]* | ?:[\\/]* ) ;;
+ */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+ if test x"$ac_file" != x-; then
+ {
+ printf "%s\n" "/* $configure_input */" >&1 \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+printf "%s\n" "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ printf "%s\n" "/* $configure_input */" >&1 \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
+ fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$_am_arg" : 'X\(//\)[^/]' \| \
+ X"$_am_arg" : 'X\(//\)$' \| \
+ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$_am_arg" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+ :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+printf "%s\n" "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ case $CONFIG_FILES in #(
+ *\'*) :
+ eval set x "$CONFIG_FILES" ;; #(
+ *) :
+ set x $CONFIG_FILES ;; #(
+ *) :
+ ;;
+esac
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`$as_dirname -- "$am_mf" ||
+$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$am_mf" : 'X\(//\)[^/]' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$am_mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ am_filepart=`$as_basename -- "$am_mf" ||
+$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$am_mf" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ { echo "$as_me:$LINENO: cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles" >&5
+ (cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE=\"gmake\" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ { am_dirpart=; unset am_dirpart;}
+ { am_filepart=; unset am_filepart;}
+ { am_mf=; unset am_mf;}
+ { am_rc=; unset am_rc;}
+ rm -f conftest-deps.mk
+}
+ ;;
+ "test-groff":F) chmod +x test-groff ;;
+
+ esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
+echo "
+$PACKAGE_NAME version $PACKAGE_VERSION
+----------------------------------------------------------------------
+ installation directory prefix : $prefix"
+if test -n "$g"
+then
+ echo "\
+ command name prefix : $g"
+ if test -n "$tmac_wrap"
+ then
+ echo "\
+ prefix used for macro packages : $tmac_wrap"
+ fi
+fi
+echo "\
+ C++ compiler and options : $CXX $CXXFLAGS $CPPFLAGS
+ use libgroff's memory allocator : $groff_use_own_allocator
+ C compiler and options : $CC $CFLAGS $CPPFLAGS
+ Perl interpreter version : $perl_version"
+if test "$groff_no_x" = yes
+then
+ echo "\
+ X11 support : disabled"
+else
+ echo "\
+ X11 support : enabled
+ X11 app defaults directory : $appdefdir"
+fi
+echo "\
+ 'groff -l' uses print spooler : $groff_have_spooler
+ use URW fonts for PDF output : $groff_have_urw_fonts"
+if test "$groff_have_urw_fonts" = yes
+then
+ echo "\
+ URW fonts directory : $urwfontsdir"
+fi
+echo "\
+ preconv can use uchardet library : $groff_have_uchardet
+ can build groff.dvi, groff.pdf : $groff_use_tex
+----------------------------------------------------------------------"
+
+if test -z "$groff_no_x"; then
+ if test -z "$with_appdefdir"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Default X11 application defaults directory \
+assumed.
+
+ The application defaults files for gxditview (GXditview and
+ GXditview-color) will be installed in the following directory.
+
+ $appdefdir
+
+ To install elsewhere, say, '/etc/X11/app-defaults', add
+ '--with-appdefdir=/etc/X11/app-defaults' to the configure script
+ command-line options and rerun it (the 'prefix' value has no effect on
+ a --with-appdefdir option).
+
+ If the gxditview app-defaults are installed in a directory that is not
+ one of the default X11 directories for this purpose (common defaults
+ are /usr/lib/X11/app-defaults, /usr/share/X11/app-defaults, and
+ /etc/X11/app-defaults), you will have to set the environment variable
+ XFILESEARCHPATH to this path. More details can be found in the X(7)
+ manual page, or in the document \"X Toolkit Intrinsics - C Language
+ Interface manual\".
+ " >&5
+printf "%s\n" "$as_me: Default X11 application defaults directory \
+assumed.
+
+ The application defaults files for gxditview (GXditview and
+ GXditview-color) will be installed in the following directory.
+
+ $appdefdir
+
+ To install elsewhere, say, '/etc/X11/app-defaults', add
+ '--with-appdefdir=/etc/X11/app-defaults' to the configure script
+ command-line options and rerun it (the 'prefix' value has no effect on
+ a --with-appdefdir option).
+
+ If the gxditview app-defaults are installed in a directory that is not
+ one of the default X11 directories for this purpose (common defaults
+ are /usr/lib/X11/app-defaults, /usr/share/X11/app-defaults, and
+ /etc/X11/app-defaults), you will have to set the environment variable
+ XFILESEARCHPATH to this path. More details can be found in the X(7)
+ manual page, or in the document \"X Toolkit Intrinsics - C Language
+ Interface manual\".
+ " >&6;}
+ fi
+ fi
+
+
+
+ awk_names=awk
+ if test -n "$ALT_AWK_PROGS"
+ then
+ awk_names="$ALT_AWK_PROGS"
+ fi
+
+ if test "$AWK" = missing
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: No awk program was found in \$PATH.
+
+ It was sought under the name(s) \"$awk_names\".
+ " >&5
+printf "%s\n" "$as_me: No awk program was found in \$PATH.
+
+ It was sought under the name(s) \"$awk_names\".
+ " >&6;}
+ fi
+
+
+
+
+ gs_names=gs
+ if test -n "$ALT_GHOSTSCRIPT_PROGS"
+ then
+ gs_names="$ALT_GHOSTSCRIPT_PROGS"
+ fi
+
+ if test "$GHOSTSCRIPT" = missing
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: No Ghostscript program was found in \$PATH.
+
+ It was sought under the name(s) \"$gs_names\".
+
+ groff documentation will not be available in HTML.
+
+ 'grohtml' will have reduced function, being unable to produce
+ documents using the 'tbl' preprocessor.
+ " >&5
+printf "%s\n" "$as_me: No Ghostscript program was found in \$PATH.
+
+ It was sought under the name(s) \"$gs_names\".
+
+ groff documentation will not be available in HTML.
+
+ 'grohtml' will have reduced function, being unable to produce
+ documents using the 'tbl' preprocessor.
+ " >&6;}
+ fi
+
+
+ if test -n "$ghostscript_notice"
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ghostscript_notice
+
+ Ghostscript versions 9.00 <= x < 9.54 suffer from a rendering glitch
+ that affects the AT&T troff (and groff) special character '\(lh'; see
+ <https://bugs.ghostscript.com/show_bug.cgi?id=703187>. If your
+ version of Ghostscript has not been patched to fix this problem, you
+ may need to work around it in groff documents you render for the
+ PostScript (and, for tbl(1) tables, HTML) output devices.
+ " >&5
+printf "%s\n" "$as_me: $ghostscript_notice
+
+ Ghostscript versions 9.00 <= x < 9.54 suffer from a rendering glitch
+ that affects the AT&T troff (and groff) special character '\(lh'; see
+ <https://bugs.ghostscript.com/show_bug.cgi?id=703187>. If your
+ version of Ghostscript has not been patched to fix this problem, you
+ may need to work around it in groff documents you render for the
+ PostScript (and, for tbl(1) tables, HTML) output devices.
+ " >&6;}
+ fi
+
+
+ if test "$groff_have_urw_fonts" = no
+ then
+ gs_verbiage=
+ if test "$GHOSTSCRIPT" != missing
+ then
+ gs_verbiage=' as well as the search path shown by the
+ "'"$GHOSTSCRIPT"' -h" command (if available)'
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: URW fonts in Type 1/PFB format were not found.
+
+ groff font description files for the URW fonts, used by the 'gropdf'
+ output driver, will not be available. Use and embedding of fonts from
+ the 'U' foundry in PDF documents generated by groff will not be
+ possible.
+
+ You can obtain the URW base 35 fonts from their GitHub project. As of
+ this writing (2023-02-15), you can find them in the 'fonts' directory
+ of the following archives (choose one).
+
+ https://github.com/ArtifexSoftware/urw-base35-fonts/archive/refs/
+ tags/20200910.zip
+ https://github.com/ArtifexSoftware/urw-base35-fonts/archive/refs/
+ tags/20200910.tar.gz
+
+ You may wish to check for a newer release.
+
+ https://github.com/ArtifexSoftware/urw-base35-fonts/releases
+
+ 'gropdf' looks for these fonts in several directories specified in
+ font/devpdf/Foundry.in$gs_verbiage.
+
+ You will need to \"make distclean\" and re-run the 'configure' script
+ after installing the URW fonts.
+
+ Alternatively, you can pass the option '--with-urw-fonts-dir=DIR'
+ to 'configure' to look for them in the directory DIR you specify.
+ If found, the 'U' foundry will be available via the '-y' option to
+ 'gropdf' (accessed via the 'groff' command with the option '-P -y').
+ " >&5
+printf "%s\n" "$as_me: URW fonts in Type 1/PFB format were not found.
+
+ groff font description files for the URW fonts, used by the 'gropdf'
+ output driver, will not be available. Use and embedding of fonts from
+ the 'U' foundry in PDF documents generated by groff will not be
+ possible.
+
+ You can obtain the URW base 35 fonts from their GitHub project. As of
+ this writing (2023-02-15), you can find them in the 'fonts' directory
+ of the following archives (choose one).
+
+ https://github.com/ArtifexSoftware/urw-base35-fonts/archive/refs/
+ tags/20200910.zip
+ https://github.com/ArtifexSoftware/urw-base35-fonts/archive/refs/
+ tags/20200910.tar.gz
+
+ You may wish to check for a newer release.
+
+ https://github.com/ArtifexSoftware/urw-base35-fonts/releases
+
+ 'gropdf' looks for these fonts in several directories specified in
+ font/devpdf/Foundry.in$gs_verbiage.
+
+ You will need to \"make distclean\" and re-run the 'configure' script
+ after installing the URW fonts.
+
+ Alternatively, you can pass the option '--with-urw-fonts-dir=DIR'
+ to 'configure' to look for them in the directory DIR you specify.
+ If found, the 'U' foundry will be available via the '-y' option to
+ 'gropdf' (accessed via the 'groff' command with the option '-P -y').
+ " >&6;}
+ fi
+
+
+ if test "$groff_have_uchardet" = no && test "$with_uchardet" != no
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: The uchardet library was not found.
+
+ The 'preconv' preprocessor program will be unable to attempt automatic
+ inference of an input file's character encoding. See the preconv(1)
+ man page.
+ " >&5
+printf "%s\n" "$as_me: The uchardet library was not found.
+
+ The 'preconv' preprocessor program will be unable to attempt automatic
+ inference of an input file's character encoding. See the preconv(1)
+ man page.
+ " >&6;}
+ fi
+
+
+
+
+ if test "$make_htmldoc" = no
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $grohtml_notice" >&5
+printf "%s\n" "$as_me: $grohtml_notice" >&6;}
+ fi
+
+
+
+
+ if test "$use_pdfroff" = no
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: 'pdfroff' will not be functional.
+
+ Because $pdfroff_missing_deps missing, 'pdfroff' will not operate
+ and the 'pdfmark.pdf' document will not be available.
+" >&5
+printf "%s\n" "$as_me: 'pdfroff' will not be functional.
+
+ Because $pdfroff_missing_deps missing, 'pdfroff' will not operate
+ and the 'pdfmark.pdf' document will not be available.
+" >&6;}
+ fi
+
+
+
+
+ if test "$use_gropdf" = no
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: 'gropdf' will have reduced function.
+
+ Neither Ghostscript nor URW fonts are available; groff documentation
+ thus will not be available in PDF.
+
+ 'gropdf' will be able to handle only documents using the standard PDF
+ base 14 fonts, plus the 'EURO' font groff supplies, and font embedding
+ with its '-e' option (accessed via the 'groff' command with the option
+ '-P -e') will not be possible.
+" >&5
+printf "%s\n" "$as_me: 'gropdf' will have reduced function.
+
+ Neither Ghostscript nor URW fonts are available; groff documentation
+ thus will not be available in PDF.
+
+ 'gropdf' will be able to handle only documents using the standard PDF
+ base 14 fonts, plus the 'EURO' font groff supplies, and font embedding
+ with its '-e' option (accessed via the 'groff' command with the option
+ '-P -e') will not be possible.
+" >&6;}
+ fi
+
+
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..4b1e92f
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,263 @@
+# Autoconf configuration file for groff.
+# Copyright (C) 1989-2023 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# Process this file with autoconf to produce a configure script.
+
+AC_INIT([GNU roff],
+ m4_esyscmd([build-aux/git-version-gen --prefix "" .tarball-version]),
+ http://savannah.gnu.org/bugs/?group=groff,
+ [groff])
+
+AC_PREREQ([2.64])
+
+# SHORT_VERSION contains only the number of REVISION before the first
+# '.'; e.g., if REVISION is '3.real.434-5aafd' then SHORT_VERSION is
+# 'x.yy.3', where x and yy are MAJOR_VERSION and MINOR_VERSION,
+# respectively.
+AC_SUBST([SHORT_VERSION],
+ m4_bregexp(AC_PACKAGE_VERSION,[^\(\w+\.\w+\.\w+\).*$],[\1]))
+
+# Directories where the helper scripts should be found. This must be
+# consistent with the variable build_aux in bootstrap.conf.
+AC_CONFIG_AUX_DIR([build-aux])
+
+AC_CONFIG_HEADERS([src/include/config.h:src/include/config.hin])
+AC_CONFIG_SRCDIR([src/roff/groff/groff.cpp])
+
+AC_USE_SYSTEM_EXTENSIONS
+
+AM_INIT_AUTOMAKE([subdir-objects])
+
+AM_SILENT_RULES([yes])
+
+# checks for programs
+AC_PROG_CC
+AC_PROG_CXX
+gl_EARLY
+gl_INIT
+GROFF_CXX_CHECK
+GROFF_EBCDIC
+GROFF_OS390
+GROFF_CMD_FILES
+GROFF_X11
+GROFF_APPDEFDIR_OPTION
+GROFF_APPDEFDIR_DEFAULT
+GROFF_LIBPROGRAMDIR_DEFAULT
+GROFF_GLILYPONDDIR_DEFAULT
+GROFF_GPINYINDIR_DEFAULT
+GROFF_PERL
+GROFF_PRINT
+# GROFF_REFER
+GROFF_REFERDIR_DEFAULT
+AC_PROG_EGREP
+GROFF_PROG_YACC
+GROFF_PROG_M4
+GROFF_PROG_MAKEINFO
+GROFF_PROG_TEXI2DVI
+GROFF_USE_TEX_CHECK
+AC_PROG_RANLIB
+GROFF_INSTALL_SH
+GROFF_INSTALL_INFO
+AC_PROG_INSTALL
+AC_PROG_LN_S
+AC_PROG_MKDIR_P
+GROFF_PROG_XPMTOPPM
+PKG_PROG_PKG_CONFIG
+GROFF_UCHARDET
+
+# 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([stdbool.h stddef.h 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([popen])
+GROFF_NEED_DECLARATION([pclose])
+GROFF_NEED_DECLARATION([putenv])
+GROFF_NEED_DECLARATION([rand])
+GROFF_NEED_DECLARATION([srand])
+GROFF_NEED_DECLARATION([strcasecmp])
+GROFF_NEED_DECLARATION([strncasecmp])
+GROFF_NEED_DECLARATION([vfprintf])
+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
+
+# check endianness
+AC_C_BIGENDIAN
+
+# checks for libraries
+GROFF_LIBC
+GROFF_LIBM
+
+AC_LANG_PUSH([C++])
+AM_ICONV
+AC_LANG_POP([C++])
+
+# we need LIBEXT
+AC_SUBST([LIBEXT],[$acl_libext])
+
+# checks for functions
+AC_FUNC_MMAP
+saved_libs="$LIBS"
+LIBS="$LIBS $LIBC $LIBM"
+AC_REPLACE_FUNCS([fmod getcwd putenv strcasecmp \
+ strerror strncasecmp strtol])
+LIBS="$saved_libs"
+AC_CHECK_FUNCS([gettimeofday isatty kill rename setlocale strdup \
+ strsep])
+GROFF_MKSTEMP
+AC_CHECK_DECLS([strsignal, getc_unlocked])
+AC_CHECK_DECLS([sys_siglist, getc_unlocked])
+AM_LANGINFO_CODESET
+
+# checks for compiler characteristics
+GROFF_ARRAY_DELETE
+GROFF_TRADITIONAL_CPP
+
+# checks for operating system services
+GROFF_WCOREFLAG
+
+# URW fonts extra dir
+GROFF_URW_FONTS_PATH
+
+# use groff's own malloc-based allocator for C++ new/delete operators
+GROFF_USE_GROFF_ALLOCATOR
+
+# other random stuff
+GROFF_BROKEN_SPOOLER_FLAGS
+GROFF_PAGE
+GROFF_G
+GROFF_TMAC
+GROFF_WITH_COMPATIBILITY_WRAPPERS
+GROFF_TARGET_PATH_SEPARATOR
+GROFF_CHECK_GROHTML_PROGRAMS
+GROFF_PDFROFF_DEPENDENCIES_CHECK
+GROFF_GROPDF_DEPENDENCIES_CHECK
+GROFF_PNMTOOLS_CAN_BE_QUIET
+GROFF_PNMTOPS_NOSETPAGE
+GROFF_MAKE_DEFINES_RM
+GROFF_DIFF_D
+GROFF_HAVE_TEST_EF_OPTION
+GROFF_BASH
+GROFF_GHOSTSCRIPT_VERSION_CHECK
+gl_GLIBC21
+gl_LOCALCHARSET
+
+AM_CONDITIONAL([BUILD_WINSCRIPTS], [test -n "$make_winscripts"])
+
+# If X11 is not available, don't build:
+# font/devX75
+# font/devX75-12
+# font/devX100
+# font/devX100-12
+# src/devices/xditview
+# src/utils/xtotroff
+# src/libs/libxutil
+AM_CONDITIONAL([WITHOUT_X11], [test "$groff_no_x" = yes])
+
+AM_CONDITIONAL([MAKE_DEFINES_RM], [test "$groff_make_defines_rm" = yes])
+
+# Some programs have a "g" prefix if an existing troff installation is
+# detected.
+AM_CONDITIONAL([USEPROGRAMPREFIX], [test "$g" = g])
+
+AM_CONDITIONAL([USE_GROHTML], [test "$use_grohtml" = yes])
+AM_CONDITIONAL([USE_PDFROFF], [test "$use_pdfroff" = yes])
+AM_CONDITIONAL([USE_GROPDF], [test "$use_gropdf" = yes])
+AM_CONDITIONAL([USE_GROFF_ALLOCATOR],
+ [test "$groff_use_own_allocator" = yes])
+AM_CONDITIONAL([HAVE_GHOSTSCRIPT], [test "$GHOSTSCRIPT" != no \
+ && test "$GHOSTSCRIPT" != missing])
+AM_CONDITIONAL([HAVE_URW_FONTS], [test "$groff_have_urw_fonts" = yes ])
+AM_CONDITIONAL([HAVE_TEXI2DVI], [test "$groff_have_texi2dvi" = yes ])
+AM_CONDITIONAL([USE_TEX], [test "$groff_use_tex" = yes ])
+
+AC_CONFIG_FILES([Makefile])
+AC_CONFIG_FILES([test-groff], [chmod +x test-groff])
+AC_OUTPUT
+
+echo "
+$PACKAGE_NAME version $PACKAGE_VERSION
+----------------------------------------------------------------------
+ installation directory prefix : $prefix"
+if test -n "$g"
+then
+ echo "\
+ command name prefix : $g"
+ if test -n "$tmac_wrap"
+ then
+ echo "\
+ prefix used for macro packages : $tmac_wrap"
+ fi
+fi
+echo "\
+ C++ compiler and options : $CXX $CXXFLAGS $CPPFLAGS
+ use libgroff's memory allocator : $groff_use_own_allocator
+ C compiler and options : $CC $CFLAGS $CPPFLAGS
+ Perl interpreter version : $perl_version"
+if test "$groff_no_x" = yes
+then
+ echo "\
+ X11 support : disabled"
+else
+ echo "\
+ X11 support : enabled
+ X11 app defaults directory : $appdefdir"
+fi
+echo "\
+ 'groff -l' uses print spooler : $groff_have_spooler
+ use URW fonts for PDF output : $groff_have_urw_fonts"
+if test "$groff_have_urw_fonts" = yes
+then
+ echo "\
+ URW fonts directory : $urwfontsdir"
+fi
+echo "\
+ preconv can use uchardet library : $groff_have_uchardet
+ can build groff.dvi, groff.pdf : $groff_use_tex
+----------------------------------------------------------------------"
+
+GROFF_APPDEFDIR_NOTICE
+GROFF_AWK_NOTICE
+GROFF_GHOSTSCRIPT_AVAILABILITY_NOTICE
+GROFF_GHOSTSCRIPT_VERSION_NOTICE
+GROFF_URW_FONTS_NOTICE
+GROFF_UCHARDET_NOTICE
+GROFF_GROHTML_PROGRAM_NOTICE
+GROFF_PDFROFF_PROGRAM_NOTICE
+GROFF_GROPDF_PROGRAM_NOTICE
diff --git a/contrib/chem/ChangeLog b/contrib/chem/ChangeLog
new file mode 100644
index 0000000..ad40944
--- /dev/null
+++ b/contrib/chem/ChangeLog
@@ -0,0 +1,373 @@
+2022-08-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * chem.pl: Refactor.
+ - Rename scalars.
+ Copyright -> copyright
+ Program_Version -> chem_version
+ Groff_Version -> groff_version
+ Chem_Name -> chem
+ before_make -> is_in_source_tree
+ - Rename hash.
+ at_at -> makevar
+ - Drop unused hash member `$makevar{'BINDIR'}`.
+ - Drop scalar `Groff_Version_Preset`, which apparently hadn't
+ been updated since groff 1.20. Instead, follow grog(1) and
+ set the `groff_version` scalar to "DEVELOPMENT" if this is
+ the version from the groff source tree. Overwrite its value
+ with that determined by make(1) if available.
+ - Tighten usage and version messages; make the latter more
+ conformant with the format recommended in the GNU Coding
+ Standards. Explicitly identify license as GNU GPLv2.
+ (usage): Refer to "pic" with its command prefix if it is known
+ to have one. (If running "unbuilt", we have no way to know.)
+
+2022-08-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * chem.pl: Stop copying "pic.tmac" (fallback troff macro
+ definitions) into the output. It might not be necessary and it
+ is inappropriate to do so if a macro package offers its own
+ definitions or the user has made other arrangements on the
+ command line. (The same thing can be achieved with the "-mpic"
+ argument to the formatter or a front end.) Bump version number.
+
+2022-06-15 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * chem.1.man: Fix markup nits. Use idiomatic input style,
+ placing newlines after sentences and commas. Also put an empty
+ request between sentences.
+
+ Fixes <https://savannah.gnu.org/bugs/?51328>.
+
+2022-04-12 Ingo Schwarze <schwarze@openbsd.org>
+
+ Delete the harmful, ill-designed, buggy, and essentially
+ unmaintained and untested --with-doc option of the configure
+ script. See the NEWS file for more details on the rationale.
+
+ * chem.am: Delete three BUILD_EXAMPLES conditionals.
+
+2020-04-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * chem.1.man:
+ * examples/122/README.txt:
+ * examples/README.txt: Delete references to groffer.
+
+2018-02-28 Werner LEMBERG <wl@gnu.org>
+
+ * chem.am (chem, README): Use $(AM_V_GEN) to silence file generation.
+
+2015-08-22 Bernd Warken <bernd.warken@web.de>
+
+ * chem.1.man: Rename `chem.man'.
+
+ * chem.am: Include renaming.
+
+2015-08-05 Bernd Warken <bernd.warken@web.de>
+
+ * chem.am: Add `Last update'. Setup Emacs makefile-automake-mode.
+
+2015-04-03 Werner LEMBERG <wl@gnu.org>
+
+ * chem.man: Make it work in compatibility mode.
+ (EL): Fix typo.
+
+2014-09-25 Bernd Warken <bernd.warken@web.de>
+
+ * chem.pl: New chem version 1.0.5.
+
+ * Makefile.sub: Add .PHONY. Restructure install and uninstall.
+
+2014-09-03 Bernd Warken <bernd.warken@web.de>
+
+ * chem.pl: New chem version 1.0.4. Change version().
+
+ * all `chem' source files: Add and improve the copying
+ information. Remove last update. Add Emacs setting if necessary.
+
+2014-07-05 Bernd Warken <bernd.warken@web.de>
+ ________________________________________________________________
+ * chem.pl: New chem version 1.0.3
+
+ * chem.man: Make file doclifter compatible.
+
+2014-07-04 Bernd Warken <bernd.warken@web.de>
+ ________________________________________________________________
+ * release of chem 1.0.2
+
+ * chem.man: Remove definition of `.FONT'.
+
+2014-07-04 Bernd Warken <bernd.warken@web.de>
+
+ * chem.man: Transform into classical man-page style.
+
+2014-07-04 Bernd Warken <bernd.warken@web.de>
+
+ * chem.man: Remove definition of .Env-var.
+
+2014-07-03 Bernd Warken <bernd.warken@web.de>
+ ________________________________________________________________
+ * release of chem 1.0.1
+
+ * chem.man: Add `.mso' for `groffer.man'.
+
+2014-06-17 Bernd Warken <bernd.warken@web.de>
+ ________________________________________________________________
+ * release of chem 1.0.0
+
+ * Makefile.sub: Add Emacs final part.
+
+ * ChangeLog: Correct the space characters in this file as Emacs
+ style.
+
+2014-03-29 Steffen Nurpmeso <sdaoden@yandex.com>
+
+ * Makefile.sub (uninstall_examples): Remove superfluous `rmdir'.
+
+2014-03-29 Steffen Nurpmeso <sdaoden@yandex.com>
+
+ * Makefile.sub (install_examples): Use `find', not shell globs.
+
+ Instead of using rm(1) two times with shell globs the expansion of
+ which will include subdirectories (thus resulting in error
+ messages), use find(1) and its `-exec' operand.
+
+2014-03-29 Steffen Nurpmeso <sdaoden@yandex.com>
+
+ * Makefile.sub: Handle examples separately, controlled by
+ $(make{_,_install_,_uninstall_}examples).
+
+2013-01-29 Bernd Warken <bernd.warken@web.de>
+
+ * all: Change license into GPL2.
+
+2013-01-29 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile.sub (MOSTLYCLEANADD): Fix typo.
+
+2010-12-13 Werner LEMBERG <wl@gnu.org>
+
+ Really fix handling of examples/122.
+
+ * examples/122/README: Renamed to...
+ * examples/122/README.txt: This.
+
+ * Makefile.sub (all, MOSTLYCLEANADD): Add `examples/122/README'.
+ (examples/122/README): New target.
+ (install_data): Fix typo.
+
+2010-06-02 Larry Jones <lawrence.jones@siemens.com>
+
+ * Makefile.sub (install): Fix handling of examples/122.
+ It tried to process the CVS subdirectory as a file.
+
+2009-01-03 Werner LEMBERG <wl@gnu.org>
+
+ * chem.pl: Prepare for groff version 1.20.
+
+2008-01-04 Werner LEMBERG <wl@gnu.org>
+
+ * chem.man: Insert `\:' in URLs where appropriate.
+
+2007-02-06 Eric S. Raymond <esr@snark.thyrsus.com>
+
+ * chem.man: Change .UR/.UE and .MT/.ME so the start macro no
+ longer takes a second argument that is pasted to the end of the
+ generated text. Instead, the end macro takes an argument that
+ does the same thing.
+
+2007-02-02 Werner LEMBERG <wl@gnu.org>
+
+ * chem.man: Further refinements and normalizations.
+
+2007-02-02 Eric S. Raymond <esr@snark.thyrsus.com>
+
+ * chem.man: Converted to use .SY/.OP/.YS and for cross-viewer
+ portability. Conversion checked using the protocol described in
+ tmac/TESTING-HINTS.
+
+2006-11-10 Bernd Warken <groff-bernd.warken-72@web.de>
+ ________________________________________________________________
+ * release of chem 0.3.1
+
+ * chem.man: Add information about example files.
+
+2006-11-10 Werner LEMBERG <wl@gnu.org>
+
+ * chem.man1: Rename back to...
+ * chem.man: This.
+ Use @G@, @MACRODIR@, and @DATASUBDIR@.
+
+ * Makefile.sub (CLEANADD, all): Don't handle chem.man.
+ (chem.man): Remove rule.
+ (chem): s/tmacdir/MACRODIR/, s/picdir/PICDIR/.
+
+ * chem.pl: s/tmacdir/MACRODIR/, s/picdir/PICDIR/.
+
+2006-11-10 Bernd Warken <groff-bernd.warken-72@web.de>
+ ________________________________________________________________
+ * release of chem 0.3.0
+
+ * chem.man1: Rename `chem.man' to translate some `@...@'
+ constructs. Some minor corrections. Remove some unused macros.
+
+ * examples/README.txt, examples/122/README: Add information on
+ `roff2*' programs.
+
+ * chem.pic: Rename `macros.pic'.
+
+ * Makefile.sub, chem.pl: Replace `macros.pic' by `chem.pic'.
+
+2006-11-09 Werner LEMBERG <wl@gnu.org>
+
+ * chem.man: Revised.
+
+2006-11-08 Bernd Warken <groff-bernd.warken-72@web.de>
+ ________________________________________________________________
+ * release of chem 0.2.0
+
+ * pic.tmac: Remove this file. Use instead the installed pic.tmac
+ in $(tmacdir).
+
+ * Makefile.sub, chem.pl:
+ - Install macros.pic to $(tmacdir)/pic/chem.pic.
+ - Remove parts with `libdir'.
+
+2006-11-07 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile.sub: Add and fix $(srcdir) where necessary to make it
+ compile with srcdir != builddir. Other minor fixes improvements.
+
+2006-11-07 Bernd Warken <groff-bernd.warken-72@web.de>
+ ________________________________________________________________
+ * release of chem 0.1.2
+
+ ### `chem' works now with all example files (examples/*.chem and
+ examples/122/*.chem).
+
+ * examples/122/README: Add some information on the example files.
+
+ * examples/122/chAi_poly_vinyl_chloride.chem: Use .ps with
+ argument `-2' and recall `.ps +2' at the end of the file. This
+ stops the size shift in the following files.
+
+ * examples/122/ch6b_dna.chem: Make the file runnable, it works
+ now.
+
+ * examples/reserpine.chem: Change access to `begin chem'.
+
+ * chem.man:
+ - Fix the BUGS section.
+ - Correct the name of the macro file to `macros.pic'.
+ - Extent section DESCRIPTION and LANGUAGE.
+ - Moieties and Strings: Rewritten section about moieties and
+ double quoted strings.
+
+ * chem.pl:
+ - parameter check: Add filespecs only when non-empty file.
+ - Set $Last_Type to $OTHER for the `pic' command.
+ - joinring(), label(), labsave(), reduce(): Remove these functions.
+ - `[', `]', `{', `}', `define': Make these and the defined
+ functions commands for `chem' without using the `pic' word.
+ - @Words: Fix it such that all double quoted strings are
+ completely in an element.
+ - `Last: ': Remove this prefix from all commands that are related
+ to `pic'.
+
+ ### global variables
+
+ * chem.pl:
+ - $Line: Add this variable to store the unchanged input line.
+ - %Params: Add the variables from setparams() to this hash.
+ - %Types: Add BOND, MOL, RING, OTHER from init() to this hash.
+ - %Put: Move %put to this.
+ - %Dbl: Move %dbl to this.
+ - %Labtype: Move %labtype to this.
+ - %Aromatic: Move $aromatic to this.
+ - %Dc: Move %dc to this.
+ - %Nput: Move $nput to this.
+ - %Define: New hash for storing the names of the `define'
+ constructs during `chem'. Use the elements in `%Define' as `chem'
+ commands.
+
+2006-10-27 Bernd Warken <groff-bernd.warken-72@web.de>
+ ________________________________________________________________
+ * release of chem 0.1.1
+
+ * chem.pl:
+ - Add handling of `[' and `]' (extension of chem awk).
+ - Restrict line break after labels.
+
+ * ChangeLog: Correct the former entry.
+
+2006-10-26 Bernd Warken <groff-bernd.warken-72@web.de>
+ ________________________________________________________________
+ * release of chem 0.1.0
+
+ ### Extensions to the chem awk version.
+
+ * chem.pl:
+ - parameters: -h, --help, -v, --version, -- are added as options.
+ The minus character - is added as filespec for standard input, it
+ may be used several times.
+ - remove the functions `inline', `shiftfields', and `set'.
+ - Fix the handling of the initialization commands .PS, .cstart,
+ `begin chem', and `end'.
+ - Add error massages.
+ - error(): Add file name.
+ - Add concatenation of lines with final backslash `\'.
+ - Add pic.tmac to guarantee that each pic display is centered.
+ - Warnings and strict are active.
+
+ ### Source files of the chem Perl version
+
+ * chem.pl: Source file for the Perl version of chem.
+
+ * macros.pic: Pic macro file that is loaded by each run of chem.
+
+ * pic.tmac: Macro file for .PS and .PE; taken over from the groff
+ source file <groff-top-source>/tmac/pic.tmac.
+
+ * Makefile.sub: Make file for the groff system.
+
+ * ChangeLog: This file.
+
+ * chem.man: Manual page for the Perl version of chem.
+
+ * README.txt: File for information on this chem version.
+
+ * examples/*.chem: Self-constructed example files for chem.
+
+ * examples/README.txt: Information on the example files.
+
+ * examples/122/*.chem: Example files from the classical chem book
+ 122.ps at <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+ * examples/122/README: Information on the example files in this
+ directory.
+
+2006-10-16 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * awk version of chem
+ chem is a roff preprocessor that generates chemical structure
+ diagrams suitable for the pic preprocessor. The original version
+ of chem is an awk script written by Brian Kernighan. This project
+ is a rewrite of chem in Perl.
+
+2006-10-15 Bernd Warken <groff-bernd.warken-72@web.de>
+________________________________________________________________
+License
+
+Copyright (C) 2006-2020 Free Software Foundation, Inc.
+Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+
+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 `chem', which is part of the `groff' project.
+
+
+##### Editor settings
+Local Variables:
+mode: change-log
+End:
diff --git a/contrib/chem/README.txt b/contrib/chem/README.txt
new file mode 100644
index 0000000..06baed2
--- /dev/null
+++ b/contrib/chem/README.txt
@@ -0,0 +1,50 @@
+'chem' is a 'roff' language to generate chemical structure diagrams.
+'@g@chem' is a 'groff' preprocessor that produces output suitable for
+the '@g@pic' preprocessor.
+
+The original version of 'chem' is an 'awk' script written by Brian
+Kernighan <http://cm.bell-labs.com/cm/cs/who/bwk/index.html>. The
+source files of the 'awk' version of 'chem' are available at
+<http://cm.bell-labs.com/netlib/typesetting/chem.gz>.
+
+This project is a rewrite of 'chem' in Perl for the GNU 'roff' project
+'groff'. It was written under Perl v5.8.8, but at least Perl v5.6 is
+needed to run the Perl version of 'chem'.
+
+In comparison to the original 'awk' version of 'chem', the Perl
+version does the following changements:
+- the options -h, --help, -v, --version to output usage and version
+information are added.
+- remove some functions 'inline', 'shiftfields', and 'set' and some
+variables that are used only once.
+
+The subdirectory 'examples/' contains example files for chem. They
+are written in the 'chem' language. The file names end with .chem.
+
+
+####### License
+
+Copyright (C) 2006-2020 Free Software Foundation, Inc.
+Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+
+This file is part of 'chem', 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 (GPL) version 2 as
+published by the Free Software Foundation.
+
+'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.
+
+The GPL2 license text is available in the internet at
+<http://www.gnu.org/licenses/gpl-2.0.html>.
+
+
+##### Editor settings
+Local Variables:
+fill-column: 72
+mode: text
+End:
+vim: set textwidth=72:
diff --git a/contrib/chem/chem.1.man b/contrib/chem/chem.1.man
new file mode 100644
index 0000000..a02242f
--- /dev/null
+++ b/contrib/chem/chem.1.man
@@ -0,0 +1,925 @@
+.TH @g@chem @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+@g@chem \- embed chemical structure diagrams in
+.I groff
+documents
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2006-2020 Free Software Foundation, Inc.
+.\"
+.\" This file is part of chem, which is part of groff, a free software
+.\" project.
+.\"
+.\" You can redistribute it and/or modify it under the terms of the GNU
+.\" General Public License version 2 (GPL2) as published by the Free
+.\" Software Foundation.
+.\"
+.\" The license text for GPL2 is available in the internet at
+.\" <http://www.gnu.org/licenses/gpl-2.0.html>.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_chem_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY @g@chem
+.RB [ \-\- ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY @g@chem
+.B \-h
+.
+.SY @g@chem
+.B \-\-help
+.YS
+.
+.
+.SY @g@chem
+.B \-v
+.
+.SY @g@chem
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I chem
+produces chemical structure diagrams.
+.
+Today's version is best suited for organic chemistry (bonds, rings).
+.
+The
+.I @g@chem
+program is a
+.I groff
+preprocessor like
+.IR @g@eqn ,
+.IR @g@pic ,
+.IR @g@tbl ,
+etc.
+.
+It generates
+.I pic
+output such that all
+.I chem
+parts are translated into diagrams of the
+.I pic
+language.
+.
+.
+.P
+If no operands are given,
+or if
+.I file
+is
+.RB \[lq] \- \[rq],
+.I @g@chem
+reads the standard input stream.
+.
+.B \-h
+and
+.B \-\-help
+display a usage message,
+whereas
+.B \-v
+and
+.B \-\-version
+display version information;
+all exit.
+.
+.
+.P
+The program
+.I @g@chem
+originates from the Perl source file
+.IR chem.pl .
+.
+It tells
+.I @g@pic
+to include a copy of the macro file
+.IR chem.pic .
+.
+Moreover the
+.I groff
+source file
+.I pic.tmac
+is loaded.
+.
+.
+.P
+In a style reminiscent of
+.I eqn
+and
+.IR pic ,
+the
+.I chem
+diagrams are written in a special language.
+.
+.
+.P
+A set of
+.I chem
+lines looks like this
+.
+.
+.IP
+.EX
+\&.cstart
+.I chem data
+\&.cend
+.EE
+.
+.
+.P
+Lines containing the keywords
+.B .cstart
+and
+.B .cend
+start and end the input for
+.IR @g@chem ,
+respectively.
+.
+In
+.I pic
+context, i.e., after the call of
+.BR .PS ,
+.I chem
+input can optionally be started by the line
+.B \%begin\~chem
+and ended by the line with the single word
+.B end
+instead.
+.
+.
+.P
+Anything outside these initialization lines is copied through
+without modification;
+all data between the initialization lines is converted into
+.I pic
+commands to draw the diagram.
+.
+.
+.P
+As an example,
+.
+.IP
+.EX
+\&.cstart
+CH3
+bond
+CH3
+\&.cend
+.EE
+.
+.
+.P
+prints two
+.B CH3
+groups with a bond between them.
+.
+.
+.P
+If you want to create just
+.I groff
+output, you must run
+.I @g@chem
+followed by
+.I groff
+with the option
+.B \-p
+for the activation of
+.IR @g@pic :
+.IP
+.I @g@chem
+.RI [ file\~ .\|.\|.\&]
+.BR "| groff \-p\~" .\|.\|.
+.
+.
+.\" ====================================================================
+.SH Language
+.\" ====================================================================
+.
+The
+.I chem
+input language is rather small.
+.
+It provides rings of several styles and a way to glue them together as
+desired,
+bonds of several styles,
+moieties
+(e.g.,
+.BR C ,
+.BR NH3 ,
+\&.\|.\|.,
+and strings.
+.
+.
+.\" ====================================================================
+.SS "Setting variables"
+.\" ====================================================================
+.
+There are some variables that can be set by commands.
+.
+Such commands have two possible forms, either
+.
+.RS
+.P
+.I "variable value"
+.RE
+.
+.P
+or
+.
+.RS
+.P
+.IB "variable " = " value"
+.RE
+.
+.P
+This sets the given
+.I variable
+to the argument
+.IR value .
+If more arguments are given only the last argument is taken, all other
+arguments are ignored.
+.
+.
+.P
+There are only a few variables to be set by these commands:
+.
+.TP
+.BI textht " arg"
+Set the height of the text to
+.IR arg ;
+default is 0.16.
+.
+.TP
+.BI cwid " arg"
+Set the character width to
+.IR arg ;
+default is 0.12.
+.
+.TP
+.BI db " arg"
+Set the bond length to
+.IR arg ;
+default is 0.2.
+.
+.TP
+.BI size " arg"
+Scale the diagram to make it look plausible at point size
+.IR arg ;
+default is 10 point.
+.
+.
+.\" ====================================================================
+.SS Bonds
+.\" ====================================================================
+.
+This
+.
+.RS
+.SY bond
+.RI [ direction ]
+.RI [ length\ n ]
+.RB [ from\ \c
+.IR Name | picstuff ]
+.YS
+.RE
+.
+.P
+draws a single bond in direction from nearest corner of
+.IR Name .
+.B bond
+can also be
+.BR "double bond" ,
+.BR "front bond" ,
+.BR "back bond" ,
+etc.
+.
+(We will get back to
+.I Name
+soon.)
+.
+.
+.P
+.I direction
+is the angle in degrees (0\~up, positive clockwise)
+or a direction word like
+.BR up ,
+.BR down ,
+.B sw
+(=\~southwest), etc.
+.
+If no direction is specified, the bond goes in the current direction
+(usually that of the last bond).
+.
+.
+.P
+Normally the bond begins at the last object placed; this
+can be changed by naming a
+.B from
+place.
+.
+For instance, to make a simple alkyl chain:
+.
+.RS
+.TS
+tab (@);
+lb l.
+CH3
+bond@(this one goes right from the CH3)
+C@(at the right end of the bond)
+double bond up@(from the C)
+O@(at the end of the double bond)
+bond right from C
+CH3
+.TE
+.RE
+.
+.
+.P
+A length in inches may be specified to override the default length.
+.
+Other
+.I pic
+commands can be tacked on to the end of a bond command, to created
+dotted or dashed bonds or to specify a
+.B to
+place.
+.
+.
+.\" ====================================================================
+.SS Rings
+.\" ====================================================================
+.
+There are lots of rings,
+but only five- and six-sided rings get much support.
+.
+.B ring
+by itself is a six-sided ring;
+.B benzene
+is the benzene ring with a circle inside.
+.B aromatic
+puts a circle into any kind of ring.
+.
+.RS
+.SY ring
+.RB [ \%pointing\ ( up | right | left | down )]
+.RB [ \%aromatic ]
+.RB [ put\ Mol\ at\ \fIn\/\fP ]
+.RB [ \%double\ \c
+.IR i , j\ \/\c
+.IR k , l\ \/\c
+\&.\|.\|.\&
+.RI [ picstuff ]
+.YS
+.RE
+.
+.
+.P
+The vertices of a ring are numbered 1, 2, \&.\|.\|.\& from the
+vertex that points in the natural compass direction.
+.
+So for a hexagonal ring with the point at the top, the top vertex
+is\~1, while if the ring has a point at the east side, that is
+vertex\~1.
+.
+This is expressed as
+.
+.IP
+.EX
+R1: ring pointing up
+R2: ring pointing right
+.EE
+.
+.
+.P
+The ring vertices are named
+.BR .V1 ,
+\&.\|.\|.,
+.BI .V n\fR,\fP
+with
+.B .V1
+in the pointing direction.
+.
+So the corners of
+.B R1
+are
+.B R1.V1
+(the
+.IR top ),
+.BR R1.V2 ,
+.BR R1.V3 ,
+.B R1.V4
+(the
+.IR bottom ),
+etc., whereas for
+.BR R2 ,
+.B R2.V1
+is the rightmost vertex and
+.B R2.V4
+the leftmost.
+.
+These vertex names are used for connecting bonds or other rings.
+.
+For example,
+.
+.IP
+.EX
+R1: benzene pointing right
+R2: benzene pointing right with .V6 at R1.V2
+.EE
+.
+.
+.P
+creates two benzene rings connected along a side.
+.
+.
+.P
+Interior double bonds are specified as
+.B \%double
+.IB n1 , "n2 n3" , n4
+.RB .\|.\|. ;
+each number pair adds an interior bond.
+.
+So the alternate form of a benzene ring is
+.
+.IP
+.B "ring double 1,2 3,4 5,6"
+.
+.
+.P
+Heterocycles (rings with something other than carbon at a vertex) are
+written as
+.BI put\ X\ at\ V\fR,\fP
+as in
+.
+.IP
+.B "R: ring put N at 1 put O at 2"
+.
+.
+.P
+In this heterocycle,
+.B R.N
+and
+.B R.O
+become synonyms for
+.B R.V1
+and
+.BR R.V2 .
+.
+.
+.P
+There are two five-sided rings.
+.
+.B ring5
+is pentagonal with a side that matches the six-sided ring;
+it has four natural directions.
+.
+A
+.B \%flatring
+is a five-sided ring created by chopping one corner of a six-sided ring
+so that it exactly matches the six-sided rings.
+.
+.
+.P
+The description of a ring has to fit on a single line.
+.
+.
+.\" ====================================================================
+.SS "Moieties and strings"
+.\" ====================================================================
+.
+A moiety is a string of characters beginning with a capital letter,
+such as N(C2H5)2.
+.
+Numbers are converted to subscripts (unless they appear to be
+fractional values, as in N2.5H).
+.
+The name of a moiety is determined from the moiety after special
+characters have been stripped out: e.g., N(C2H5)2) has the name NC2H52.
+.
+.
+.P
+Moieties can be specified in two kinds.
+.
+Normally a moiety is placed right after the last thing mentioned,
+separated by a semicolon surrounded by spaces, e.g.,
+.
+.IP
+.B "B1: bond ; OH"
+.
+.P
+Here the moiety is
+.BR OH ;
+it is set after a bond.
+.
+.
+.P
+As the second kind a moiety can be positioned as the first word in a
+.IR pic -like
+command, e.g.,
+.
+.IP
+.B "CH3 at C + (0.5,0.5)"
+.
+.P
+Here the moiety is
+.BR CH3 .
+It is placed at a position relative to
+.BR C ,
+a moiety used earlier in the chemical structure.
+.
+.
+.P
+So moiety names can be specified as
+.I chem
+positions everywhere in the
+.I chem
+code.
+.
+Beneath their printing moieties are names for places.
+.
+.
+.P
+The moiety
+.B BP
+is special.
+.
+It is not printed but just serves as a mark to be referred to in later
+.I chem
+commands.
+.
+For example,
+.
+.IP
+.B "bond ; BP"
+.
+.P
+sets a mark at the end of the bond.
+.
+This can be used then for specifying a place.
+.
+The name
+.B BP
+is derived from
+.I branch point
+(i.e., line crossing).
+.
+.
+.P
+A string within double quotes
+.B \(dq
+is interpreted as a part of a
+.I chem
+command.
+.
+It represents a string that should be printed (without the quotes).
+.
+Text within quotes
+.BR \(dq .\|.\|.\& \(dq
+is treated more or less like a moiety except that no changes are made to
+the quoted part.
+.
+.
+.\" ====================================================================
+.SS Names
+.\" ====================================================================
+.
+In the alkyl chain above, notice that the carbon atom
+.B C
+was used both to draw something and as the name for a place.
+.
+A moiety always defines a name for a place; you can use
+your own names for places instead, and indeed, for rings
+you will have to.
+.
+A name is just
+.
+.IP
+.IB Name :
+\&.\|.\|.
+.
+.
+.P
+.I Name
+is often the name of a moiety like
+.BR CH3 ,
+but it need not to be.
+.
+Any name that begins with a capital letter and which contains
+only letters and numbers is valid:
+.
+.RS
+.TP
+.B First:
+.B bond
+.TQ
+\&
+.B "bond 30 from First"
+.RE
+.
+.
+.\" ====================================================================
+.SS Miscellaneous
+.\" ====================================================================
+.
+The specific construction
+.RS
+.TP
+.BR bond \~.\|.\|.\&\~ "; moiety"
+.RE
+.P
+is equivalent to
+.IP
+.EX
+bond
+moiety
+.EE
+.
+.
+.P
+Otherwise, each item has to be on a separate line (and only one line).
+Note that there must be whitespace after the semicolon which separates
+the commands.
+.
+.
+.P
+A period character
+.B .\&
+or a single quote
+.B \[aq]
+in the first column of a line signals a
+.I troff
+command, which is copied through as-is.
+.
+.
+.P
+A line whose first non-blank character is a hash character
+.RB ( # )
+is treated as a comment and thus ignored.
+.
+However, hash characters within a word are kept.
+.
+.
+.P
+A line whose first word is
+.B pic
+is copied through as-is after the word
+.B pic
+has been removed.
+.
+.
+.P
+The command
+.IP
+.B size
+.I n
+.P
+scales the diagram to make it look plausible at point size\~\c
+.I n
+(default is 10\~point).
+.
+.
+.P
+Anything else is assumed to be
+.I pic
+code, which is copied through with a label.
+.
+.
+.P
+Since
+.I @g@chem
+is a
+.I @g@pic
+preprocessor, it is possible to include
+.I pic
+statements in the middle of a diagram to draw things not provided for
+by
+.I chem
+itself.
+.
+Such
+.I pic
+statements should be included in
+.I chem
+code by adding
+.B pic
+as the first word of this line for clarity.
+.
+.
+.P
+The following
+.I pic
+commands are accepted as
+.I chem
+commands, so no
+.B pic
+command word is needed:
+.
+.IP
+.B define
+Start the definition of
+.I pic
+macro within
+.IR chem .
+.
+.RS
+.TP
+.B [
+Start a block composite.
+.
+.TP
+.B ]
+End a block composite.
+.
+.TP
+.B {
+Start a macro definition block.
+.
+.TP
+.B }
+End a macro definition block.
+.RE
+.
+.P
+The macro names from
+.B define
+statements are stored and their call is accepted as a
+.I chem
+command as well.
+.
+.
+.\" ====================================================================
+.SS "Wish list"
+.\" ====================================================================
+.
+.P
+This TODO list was collected by Brian Kernighan.
+.
+.
+.P
+Error checking is minimal; errors are usually detected and reported in
+an oblique fashion by
+.IR pic .
+.
+.
+.P
+There is no library or file inclusion mechanism, and there is no
+shorthand for repetitive structures.
+.
+.
+.P
+The extension mechanism is to create
+.I pic
+macros, but these are tricky to get right and don't have all the
+properties of built-in objects.
+.
+.
+.P
+There is no in-line chemistry yet
+(e.g.,
+analogous to the
+.BR $ .\|.\|. $
+construct of
+.IR eqn ).
+.
+.
+.P
+There is no way to control entry point for bonds on groups.
+.
+Normally a bond connects to the carbon atom if entering from
+the top or bottom and otherwise to the nearest corner.
+.
+.
+.P
+Bonds from substituted atoms on heterocycles do not join at the proper
+place without adding a bit of
+.IR pic .
+.
+.
+.P
+There is no decent primitive for brackets.
+.
+.
+.P
+Text (quoted strings) doesn't work very well.
+.
+.
+.P
+A squiggle bond is needed.
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @DATASUBDIR@/\:pic/\:chem\:.pic
+A collection of
+.I pic
+macros needed by
+.IR @g@chem .
+.
+.TP
+.I @MACRODIR@/\:pic\:.tmac
+A macro file which redefines
+.BR .PS ,
+.BR .PE ,
+and
+.B .PF
+to center
+.I pic
+diagrams.
+.
+.TP
+.IR @DOCDIR@/\:\%examples/\:chem/\: * .chem
+Example files for
+.IR chem .
+.
+.TP
+.IR @DOCDIR@/\:\%examples/\:chem/\:122/\: * .chem
+Example files from the
+.I chem
+article by its authors,
+\[lq]CHEM\[em]A Program for Typesetting Chemical Structure Diagrams:
+User Manual\[rq]
+(CSTR\~#122).
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+The GNU version of
+.I chem
+was written by
+.MT groff\-bernd\:.warken\-72@\:web\:.de
+Bernd Warken
+.ME .
+.
+It is based on the documentation of Brian Kernighan's original
+.I awk
+version of
+.IR chem .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+\[lq]CHEM\[em]A Program for Typesetting Chemical Diagrams: User
+Manual\[rq]
+by Jon L.\& Bentley,
+Lynn W.\& Jelinski,
+and
+Brian W.\& Kernighan,
+1992,
+AT&T Bell Laboratories Computing Science Technical Report No.\& 122
+.
+.
+.P
+.MR groff @MAN1EXT@ ,
+.MR @g@pic @MAN1EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_chem_1_man_C]
+.do rr *groff_chem_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/chem/chem.am b/contrib/chem/chem.am
new file mode 100644
index 0000000..abee480
--- /dev/null
+++ b/contrib/chem/chem.am
@@ -0,0 +1,120 @@
+# Automake rules for 'chem'
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+# Moved to automake by Bertrand Garrigues
+#
+# This file is part of 'chem' 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+#
+# '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.
+#
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+chem_srcdir = $(top_srcdir)/contrib/chem
+prefixexecbin_SCRIPTS += chem
+
+# Files installed in $(datasubdir)/pic
+chempicdir = $(datasubdir)/pic
+dist_chempic_DATA = contrib/chem/chem.pic
+
+
+CHEM_GENEXAMPLES = contrib/chem/examples/README
+CHEM_EXAMPLES = \
+ contrib/chem/examples/atp.chem \
+ contrib/chem/examples/cholesterin.chem \
+ contrib/chem/examples/ethamivan.chem \
+ contrib/chem/examples/lsd.chem \
+ contrib/chem/examples/morphine.chem \
+ contrib/chem/examples/penicillin.chem \
+ contrib/chem/examples/reserpine.chem
+
+# Files installed in $(exampledir)/chem
+chemexampledir = $(exampledir)/chem
+nodist_chemexample_DATA = $(CHEM_GENEXAMPLES)
+dist_chemexample_DATA = $(CHEM_EXAMPLES)
+
+# Files installed in $(exampledir)/chem/122. All the .chem files in 122 are
+# lazily installed by the local install target
+chemexample122dir = $(chemexampledir)/122
+nodist_chemexample122_DATA = contrib/chem/examples/122/README
+EXTRA_DIST += \
+ contrib/chem/ChangeLog \
+ contrib/chem/chem.1.man \
+ contrib/chem/chem.pic \
+ contrib/chem/chem.pl \
+ contrib/chem/README.txt \
+ contrib/chem/examples/README.txt \
+ contrib/chem/examples/122/README.txt
+
+man1_MANS += contrib/chem/chem.1
+MOSTLYCLEANFILES += $(CHEM_GENEXAMPLES) $(nodist_chemexample122_DATA) \
+ contrib/chem/README
+
+# This is strangely built but not installed
+all: contrib/chem/README
+
+contrib/chem/README: $(chem_srcdir)/README.txt
+ $(AM_V_GEN)$(MKDIR_P) contrib/chem/ \
+ && sed -e "s|[@]g[@]|$(g)|g" $? >$@
+
+contrib/chem/examples/README: $(chem_srcdir)/examples/README.txt
+ $(AM_V_GEN)$(MKDIR_P) contrib/chem/examples \
+ && sed -e "s|[@]g[@]|$(g)|g" $? >$@
+
+contrib/chem/examples/122/README: $(chem_srcdir)/examples/122/README.txt
+ $(AM_V_GEN)$(MKDIR_P) contrib/chem/examples/122 \
+ && sed -e "s|[@]g[@]|$(g)|g" $? >$@
+
+chem: $(chem_srcdir)/chem.pl $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)$(RM) $@ \
+ && sed -f "$(SH_DEPS_SED_SCRIPT)" \
+ -e "s|[@]g[@]|$(g)|g" \
+ -e "s|[@]BINDIR[@]|$(DESTDIR)$(bindir)|g" \
+ -e "s|[@]MACRODIR[@]|$(DESTDIR)$(tmacdir)|g" \
+ -e "s|[@]PICDIR[@]|$(DESTDIR)$(datasubdir)/pic|g" \
+ -e "s|[@]VERSION[@]|$(VERSION)|g" \
+ -e "$(SH_SCRIPT_SED_CMD)" \
+ $(chem_srcdir)/chem.pl \
+ >$@ \
+ && chmod +x $@
+
+install-data-local: install_chem_extra
+install_chem_extra:
+ -test -d $(DESTDIR)$(chemexample122dir) \
+ || $(mkinstalldirs) $(DESTDIR)$(chemexample122dir);
+ for i in $(chem_srcdir)/examples/122/*.chem; do \
+ n=`echo $$i | sed 's|$(chem_srcdir)/examples/122/||g'`; \
+ $(INSTALL_DATA) $$i $(DESTDIR)$(chemexample122dir)/$$n; \
+ done
+
+uninstall-local: uninstall_chem_extra
+uninstall_chem_extra:
+ $(RM) $(DESTDIR)$(exampledir)/chem/122/*
+ -rmdir $(DESTDIR)$(exampledir)/chem/122
+ $(RM) $(DESTDIR)$(exampledir)/chem/*
+ -rmdir $(DESTDIR)$(exampledir)/chem
+ -rmdir $(DESTDIR)$(datasubdir)/pic
+
+dist-hook: dist_chem
+dist_chem:
+ chmod u+w $(distdir)/contrib/chem/examples/122
+ for i in $(chem_srcdir)/examples/122/*.chem; do \
+ cp -f $$i $(distdir)/contrib/chem/examples/122; \
+ done
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/contrib/chem/chem.pic b/contrib/chem/chem.pic
new file mode 100644
index 0000000..33e932c
--- /dev/null
+++ b/contrib/chem/chem.pic
@@ -0,0 +1,89 @@
+# macros for chem
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+# Written by Brian Kernighan <http://cm.bell-labs.com/cm/cs/who/bwk>,
+# modified by Bernd Warken <groff-bernd.warken-72@web.de>.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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.
+
+# The license text for GPL2 is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+pi = 3.141592654
+deg = 57.29578
+# cr = 0.08 # radius of invis circle at ring vertices (see cr[vh])
+# crh = 0.16; crw = 0.12 # ht & wid of invis ellipse around atoms at ring vertices
+# dav = 0.015 # vertical shift up for atoms in atom macro
+
+# atom(text, wid, ht, carbon position, crh, crw, dav)
+define atom { [
+ T: $1 wid $2 ht $3-2*$7
+ C: ellipse invis ht $5 wid $6 at T.w + ($4,$7)
+ L: ellipse invis ht $5 wid $6 at T.w + (cwid/2,$7)
+ R: ellipse invis ht $5 wid $6 at T.e + (-cwid/2,$7)
+] }
+
+# bond(length, angle in degrees, whatever)
+define bond {
+ line $3 by ($1) * sin(($2)/deg), ($1) * cos(($2)/deg)
+}
+
+# fancy bonds: r, theta, from/at
+define doublebond {
+ line $3 invis by ($1) * sin(($2)/deg), ($1) * cos(($2)/deg)
+ V1: last line.start; V2: last line.end; dx = V2.x-V1.x; dy = V2.y-V1.y
+ norm = sqrt(dx*dx + dy*dy)
+ ny = dx * .02 / norm
+ nx = -dy * .02 / norm
+ line from V1 + (nx,ny) to V2 + (nx,ny)
+ line from V1 - (nx,ny) to V2 - (nx,ny)
+ move to V2
+}
+define triplebond {
+ line $3 invis by ($1) * sin(($2)/deg), ($1) * cos(($2)/deg)
+ V1: last line.start; V2: last line.end; dx = V2.x-V1.x; dy = V2.y-V1.y
+ norm = sqrt(dx*dx + dy*dy)
+ ny = dx * .025 / norm
+ nx = -dy * .025 / norm
+ line from V1 + (nx,ny) to V2 + (nx,ny)
+ line from V1 - (nx,ny) to V2 - (nx,ny)
+ line from V1 to V2
+ move to V2
+}
+define backbond {
+ line $3 invis by ($1) * sin(($2)/deg), ($1) * cos(($2)/deg)
+ V1: last line.start; V2: last line.end; dx = V2.x-V1.x; dy = V2.y-V1.y
+ norm = sqrt(dx*dx + dy*dy)
+ n = norm / .025
+ ny = dx * .02 / norm
+ nx = -dy * .02 / norm
+ for i = 1 to n-1 do {
+ XZ: i/n <V1,V2>
+ line from XZ + (nx,ny) to XZ - (nx,ny)
+ }
+ move to V2
+}
+define frontbond {
+ line $3 invis by ($1) * sin(($2)/deg), ($1) * cos(($2)/deg)
+ V1: last line.start; V2: last line.end; dx = V2.x-V1.x; dy = V2.y-V1.y
+ ah = arrowht; aw = arrowwid; ahead = arrowhead
+ arrowht = sqrt(dx*dx + dy*dy)
+ arrowwid = 0.05
+ arrowhead = 7
+ line <- from V1 to V2
+ arrowht = ah; arrowwid = aw; arrowhead = ahead
+}
+# Local Variables:
+# mode: Nroff
+# End:
diff --git a/contrib/chem/chem.pl b/contrib/chem/chem.pl
new file mode 100755
index 0000000..5ca3fa2
--- /dev/null
+++ b/contrib/chem/chem.pl
@@ -0,0 +1,1231 @@
+#! /usr/bin/env perl
+
+# chem - a groff preprocessor for producing chemical structure diagrams
+
+my $copyright = 'Copyright (C) 2006-2014, 2022'
+ . ' Free Software Foundation, Inc.';
+# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+# settings
+########################################################################
+
+my $chem_version = '1.0.6';
+my $groff_version = 'DEVELOPMENT';
+
+require v5.6;
+
+
+########################################################################
+# begin
+########################################################################
+
+use warnings;
+use strict;
+use Math::Trig;
+
+# for catfile()
+use File::Spec;
+
+# $Bin is the directory where this script is located
+use FindBin;
+
+my $chem;
+my $File_chem_pic;
+
+my $is_in_source_tree;
+{
+ $is_in_source_tree = 1 if '@VERSION@' eq '@' . 'VERSION' . '@';
+}
+
+my %makevar;
+
+if ($is_in_source_tree) {
+ my $chem_dir = $FindBin::Bin;
+ $makevar{'G'} = '';
+ $File_chem_pic = File::Spec->catfile($chem_dir, 'chem.pic');
+ $chem = 'chem';
+} else {
+ $groff_version = '@VERSION@';
+ $makevar{'G'} = '@g@';
+ $makevar{'PICDIR'} = '@PICDIR@';
+ $File_chem_pic = File::Spec->catfile($makevar{'PICDIR'}, 'chem.pic');
+ $chem = $makevar{'G'} . 'chem';
+}
+
+
+########################################################################
+# check the parameters
+########################################################################
+
+if (@ARGV) {
+ # process any FOO=bar switches
+ # eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
+ my @filespec = ();
+ my $dbl_minus;
+ my $wrong;
+ foreach (@ARGV) {
+ next unless $_;
+ if (/=/) {
+ # ignore FOO=bar switches
+ push @filespec, $_ if -f;
+ next;
+ }
+ if ($dbl_minus) {
+ if (-f $_) {
+ push @filespec, $_ if -s $_;
+ } else {
+ warn "chem: argument $_ is not an existing file.\n";
+ $wrong = 1;
+ }
+ next;
+ }
+ if (/^--$/) {
+ $dbl_minus = 1;
+ next;
+ }
+ if (/^-$/) {
+ push @filespec, $_;
+ next;
+ }
+ if (/^-h$/ or '--help' =~ /^$_/) {
+ &usage();
+ exit 0;
+ }
+ if (/^-v$/ or '--version' =~ /^$_/) {
+ &version();
+ exit 0;
+ }
+ if (-f $_) {
+ push @filespec, $_ if -s $_;
+ } else {
+ $wrong = 1;
+ if (/^-/) {
+ warn "chem: wrong option ${_}.\n";
+ } else {
+ warn "chem: argument $_ is not an existing file.\n";
+ }
+ }
+ }
+ if (@filespec) {
+ @ARGV = @filespec;
+ } else {
+ exit 0 if $wrong;
+ @ARGV = ('-');
+ }
+} else { # @ARGV is empty
+ @ARGV = ('-') unless @ARGV;
+}
+
+
+########################################################################
+# main process
+########################################################################
+
+my %Dc = ( 'up' => 0, 'right' => 90, 'down' => 180, 'left' => 270,
+ 'ne' => 45, 'se' => 135, 'sw' => 225, 'nw' => 315,
+ 0 => 'n', 90 => 'e', 180 => 's', 270 => 'w',
+ 30 => 'ne', 45 => 'ne', 60 => 'ne',
+ 120 => 'se', 135 => 'se', 150 => 'se',
+ 210 => 'sw', 225 => 'sw', 240 => 'sw',
+ 300 => 'nw', 315 => 'nw', 330 => 'nw',
+ );
+
+my $Word_Count;
+my @Words;
+
+my $Line_No;
+my $Last_Name = '';
+
+# from init()
+my $First_Time = 1;
+my $Last_Type;
+my $Dir; # direction
+my %Types = (
+ 'RING' => 'R',
+ 'MOL' => 'M',
+ 'BOND' => 'B',
+ 'OTHER' => 'O' # manifests
+ );
+
+# from setparams()
+my %Params;
+
+# from ring()
+my $Nput;
+my $Aromatic;
+my %Put;
+my %Dbl;
+
+my %Labtype;
+my %Define = ();
+
+my $File_Name = '';
+my $Line = '';
+
+&main();
+
+{
+ my $is_pic = '';
+ my $is_chem = '';
+ my $former_line = '';
+
+ ##########
+ # main()
+ #
+ sub main {
+ my $count_minus = 0;
+ my @stdin = ();
+ my $stdin = 0;
+
+ foreach (@ARGV) {
+ $count_minus++ if /^-$/;
+ }
+
+ foreach my $arg (@ARGV) {
+ &setparams(1.0);
+ next unless $arg;
+ $Line_No = 0;
+ $is_pic = '';
+ $is_chem = '';
+ if ($arg eq '-') {
+ $File_Name = 'standard input';
+ if ($stdin) {
+ &main_line($_) foreach @stdin;
+ } else {
+ $stdin = 1;
+ if ($count_minus <= 1) {
+ while (<STDIN>) {
+ &main_line($_);
+ }
+ } else {
+ @stdin = ();
+ while (<STDIN>) {
+ push @stdin, $_;
+ &main_line($_);
+ }
+ }
+ }
+### main()
+ } else { # $arg is not -
+ $File_Name = $arg;
+ open FILE, "<$arg";
+ &main_line($_) while <FILE>;
+ close FILE;
+ } # if $arg
+ if ($is_pic) {
+ printf ".PE\n";
+ }
+ }
+ } # main()
+
+
+ ##########
+ # main_line()
+ #
+ sub main_line {
+ my $line = $_[0];
+# $Last_Type = $Types{'OTHER'};
+# $Last_Type = '';
+ my $stack;
+ $Line_No++;
+ chomp $line;
+
+ $line = $former_line . $line if $former_line;
+ if ($line =~ /^(.*)\\$/) {
+ $former_line = $1;
+ return 1;
+ } else {
+ $former_line = '';
+ }
+ $Line = $line;
+
+ {
+ @Words = ();
+ my $s = $line;
+ $s =~ s/^\s*//;
+ $s =~ s/\s+$//;
+ return 1 unless $s;
+ $s = " $s";
+ $s =~ s/\s+#.*$// if $is_pic;
+ return 1 unless $s;
+ $line = $s;
+ $line =~ s/^\s*|\s*$//g;
+ my $bool = 1;
+ while ($bool) {
+ $s =~ /^([^"]*)\s("[^"]*"?\S*)(.*)$/;
+ if (defined $1) {
+ my $s1 = $1;
+ my $s2 = $2;
+ $s = $3;
+ $s1 =~ s/^\s*|\s*$//g;
+ push @Words, split(/\s+/, $s1) if $s1;
+ push @Words, $s2;
+ }
+ if ($s !~ /\s"/) {
+ $s =~ s/^\s*|\s*$//g;
+ push @Words, split(/\s+/, $s) if $s;
+ $bool = 0;
+ }
+ }
+
+# @Words = split(/\s+/, $s);
+ return 1 unless @Words;
+# foreach my $i (0..$#Words) {
+# if ($Words[$i] =~ /^\s*#/) {
+# $#Words = $i - 1;
+# last;
+# }
+# }
+# return 1 unless @Words;
+ }
+
+ if ($line =~ /^([\.']\s*PS\s*)|([\.']\s*PS\s.+)$/) {
+ # .PS
+ unless ($is_pic) {
+ $is_pic = 'running';
+ print "$line\n";
+ }
+ return 1;
+ }
+### main_line()
+ if ( $line =~ /^([\.']\s*PE\s*)|([\.']\s*PE\s.+)$/ ) {
+ # .PE
+ $is_chem = '';
+ if ($is_pic) {
+ $is_pic = '';
+ print "$line\n";
+ }
+ return 1;
+ }
+ if ($line =~ /^[\.']\s*cstart\s*$/) {
+ # line: '.cstart'
+ if ($is_chem) {
+ &error("additional '.cstart'; chem is already active.");
+ return 1;
+ }
+ unless ($is_pic) {
+ &print_ps();
+ $is_pic = 'by chem';
+ }
+ $is_chem = '.cstart';
+ &init();
+ return 1;
+ }
+### main_line()
+ if ($line =~ /^\s*begin\s+chem\s*$/) {
+ # line: 'begin chem'
+ if ($is_pic) {
+ if ($is_chem) {
+ &error("additional 'begin chem'; chem is already active.");
+ return 1;
+ }
+ $is_chem = 'begin chem';
+ &init();
+ } else {
+ print "$line\n";
+ }
+ return 1;
+ }
+ if ($line =~ /^[\.']\s*cend\s*/) {
+ # line '.cend'
+ if ($is_chem) {
+ &error("you end chem with '.cend', but started it with 'begin chem'.")
+ if $is_chem eq 'begin chem';
+ if ($is_pic eq 'by chem') {
+ &print_pe();
+ $is_pic = '';
+ }
+ $is_chem = '';
+ } else {
+ print "$line\n";
+ }
+ return 1;
+ }
+ if ($line =~ /^\s*end\s*$/) {
+ # line: 'end'
+ if ($is_chem) {
+ &error("you end chem with 'end', but started it with '.cstart'.")
+ if $is_chem eq '.cstart';
+ if ($is_pic eq 'by chem') {
+ &print_pe();
+ $is_pic = '';
+ }
+ $is_chem = '';
+ } else {
+ print "$line\n";
+ }
+ return 1;
+ }
+
+### main_line()
+ if (! $is_chem) {
+ print "$line\n";
+ return 1;
+ }
+ if ($line =~ /^[.']/) {
+ # groff request line
+ print "$line\n";
+ return 1;
+ }
+
+ if ($Words[0] eq 'pic') {
+ # pic pass-through
+ return 1 if $#Words == 0;
+ my $s = $line;
+ $s =~ /^\s*pic\s*(.*)$/;
+ $s = $1;
+ print "$s\n" if $s;
+ $Last_Type = $Types{'OTHER'};
+ $Define{ $Words[2] } = 1 if $#Words >= 2 && $Words[1] eq 'define';
+ return 1;
+ }
+
+ if ($Words[0] eq 'textht') {
+ if ($#Words == 0) {
+ &error("'textht' needs a single argument.");
+ return 0;
+ }
+ &error("only the last argument is taken for 'textht', " .
+ "all others are ignored.")
+ unless $#Words <= 1 or ($#Words == 2 && $Words[1] =~ /^=/);
+ $Params{'textht'} = $Words[$#Words];
+ return 1;
+ }
+### main_line()
+ if ($Words[0] eq 'cwid') { # character width
+ if ($#Words == 0) {
+ &error("'cwid' needs a single argument.");
+ return 0;
+ }
+ &error("only the last argument is taken for 'cwid', " .
+ "all others are ignored.")
+ unless $#Words <= 1 or ($#Words == 2 && $Words[1] =~ /^=/);
+ $Params{'cwid'} = $Words[$#Words];
+ return 1;
+ }
+ if ($Words[0] eq 'db') { # bond length
+ if ($#Words == 0) {
+ &error("'db' needs a single argument.");
+ return 0;
+ }
+ &error("only the last argument is taken for 'db', " .
+ "all others are ignored.")
+ unless $#Words <= 1 or ($#Words == 2 && $Words[1] =~ /^=/);
+ $Params{'db'} = $Words[$#Words];
+ return 1;
+ }
+ if ($Words[0] eq 'size') { # size for all parts of the whole diagram
+ my $size;
+ if ($#Words == 0) {
+ &error("'size' needs a single argument.");
+ return 0;
+ }
+ &error("only the last argument is taken for 'size', " .
+ "all others are ignored.")
+ unless $#Words <= 1 or ($#Words == 2 && $Words[1] =~ /^=/);
+ if ($Words[$#Words] <= 4) {
+ $size = $Words[$#Words];
+ } else {
+ $size = $Words[$#Words] / 10;
+ }
+ &setparams($size);
+ return 1;
+ }
+
+### main_line()
+ print "\n#", $Line, "\n"; # debugging, etc.
+ $Last_Name = '';
+# $Last_Type = $Types{'OTHER'};
+# $Last_Type = '';
+
+ if ($Words[0] =~ /^[A-Z].*:$/) {
+ # label; falls thru after shifting left
+ my $w = $Words[0];
+ $Last_Name = $w;
+ $Last_Name =~ s/:$//;
+ print "$w";
+ shift @Words;
+ if (@Words) {
+ print " ";
+ $line =~ s/^\s*$w\s*//;
+ } else {
+ print "\n";
+ return 1;
+ }
+ }
+
+ if ($Words[0] eq 'define') {
+ print "$line\n";
+ $Define{ $Words[1] } = 1 if $#Words >= 1;
+ $Last_Type = $Types{'OTHER'};
+ return 1;
+ }
+ if ($Words[0] =~ /^[\[\]{}]/) {
+ print "$line\n";
+ $Last_Type = $Types{'OTHER'};
+ return 1;
+ }
+
+ if ($Words[0] =~ /^"/) {
+ print 'Last: ', $line, "\n";
+ $Last_Type = $Types{'OTHER'};
+ return 1;
+ }
+
+ if ($Words[0] =~ /bond/) {
+ &bond($Words[0]);
+ return 1;
+ }
+
+ if ($#Words >= 1) {
+ if ($Words[0] =~ /^(double|triple|front|back)$/ &&
+ $Words[1] eq 'bond') {
+ my $w = shift @Words;
+ $Words[0] = $w . $Words[0];
+ &bond($Words[0]);
+ return 1;
+ }
+ if ($Words[0] eq 'aromatic') {
+ my $temp = $Words[0];
+ $Words[0] = $Words[1] ? $Words[1] : '';
+ $Words[1] = $temp;
+ }
+ }
+
+ if ($Words[0] =~ /ring|benz/) {
+ &ring($Words[0]);
+ return 1;
+ }
+ if ($Words[0] eq 'methyl') {
+ # left here as an example
+ $Words[0] = 'CH3';
+ }
+### main_line()
+ if ($Words[0] =~ /^[A-Z]/) {
+ &molecule();
+ return 1;
+ }
+ if ($Words[0] eq 'left') {
+ my %left; # not used
+ $left{++$stack} = &fields(1, $#Words);
+ printf (("Last: [\n"));
+ return 1;
+ }
+ if ($Words[0] eq 'right') {
+ &bracket();
+ $stack--;
+ return 1;
+ }
+ if ($Words[0] eq 'label') { # prints the vertex numbers in a ring
+ if ( exists $Labtype{$Words[1]} and
+ $Labtype{$Words[1]} =~ /^$Types{'RING'}/ ) {
+ my $v = substr($Labtype{$Words[1]}, 1, 1);
+ $Words[1] = '' unless $Words[1];
+ foreach my $i ( 1..$v ) {
+ printf "\"\\s-3%d\\s0\" at 0.%d<%s.C,%s.V%d>\n", $i, $v + 2,
+ $Words[1], $Words[1], $i;
+ }
+ } else {
+ &error("$Words[1] is not a ring.");
+ }
+ return 1;
+ }
+
+ if ( exists $Define{ $Words[0] } ) {
+ print $line, "\n";
+ $Last_Type = $Types{'OTHER'};
+ return 1;
+ }
+ return 1 unless $line;
+# print STDERR "# $Line\n";
+# &error('This is not a chem command. To include a command for pic, ' .
+# "add 'pic' as the first word to the command.");
+ print $line, "\n";
+ $Last_Type = $Types{'OTHER'};
+ 1;
+ } # main_line()
+
+}
+
+########################################################################
+# functions
+########################################################################
+
+##########
+# atom(<string>)
+#
+sub atom {
+ # convert CH3 to atom(...)
+ my ($s) = @_;
+ my ($i, $n, $nsub, $cloc, $nsubc, @s);
+ if ($s eq "\"\"") {
+ return $s;
+ }
+ $n = length($s);
+ $nsub = $nsubc = 0;
+ $cloc = index($s, 'C');
+ if (! defined($cloc) || $cloc < 0) {
+ $cloc = 0;
+ }
+ @s = split('', $s);
+ $i = 0;
+ foreach (@s) {
+ unless (/[A-Z]/) {
+ $nsub++;
+ $nsubc++ if $i < $cloc;
+ $i++;
+ }
+ }
+ $s =~ s/([0-9]+\.[0-9]+)|([0-9]+)/\\s-3\\d$&\\u\\s+3/g;
+ if ($s =~ /([^0-9]\.)|(\.[^0-9])/) { # centered dot
+ $s =~ s/\./\\v#-.3m#.\\v#.3m#/g;
+ }
+ sprintf( "atom(\"%s\", %g, %g, %g, %g, %g, %g)",
+ $s, ($n - $nsub / 2) * $Params{'cwid'}, $Params{'textht'},
+ ($cloc - $nsubc / 2 + 0.5) * $Params{'cwid'}, $Params{'crh'},
+ $Params{'crw'}, $Params{'dav'}
+ );
+} # atom()
+
+
+##########
+# bond(<type>)
+#
+sub bond {
+ my ($type) = @_;
+ my ($i, $moiety, $from, $leng);
+ $moiety = '';
+ for ($i = 1; $i <= $#Words; $i++) {
+ if ($Words[$i] eq ';') {
+ &error("a colon ';' must be followed by a space and a single word.")
+ if $i != $#Words - 1;
+ $moiety = $Words[$i + 1] if $#Words > $i;
+ $#Words = $i - 1;
+ last;
+ }
+ }
+ $leng = $Params{'db'}; # bond length
+ $from = '';
+ for ($Word_Count = 1; $Word_Count <= $#Words; ) {
+ if ($Words[$Word_Count] =~
+ /(\+|-)?\d+|up|down|right|left|ne|se|nw|sw/) {
+ $Dir = &cvtdir($Dir);
+ } elsif ($Words[$Word_Count] =~ /^leng/) {
+ $leng = $Words[$Word_Count + 1] if $#Words > $Word_Count;
+ $Word_Count += 2;
+ } elsif ($Words[$Word_Count] eq 'to') {
+ $leng = 0;
+ $from = &fields($Word_Count, $#Words);
+ last;
+ } elsif ($Words[$Word_Count] eq 'from') {
+ $from = &dofrom();
+ last;
+ } elsif ($Words[$Word_Count] =~ /^#/) {
+ $Word_Count = $#Words + 1;
+ last;
+ } else {
+ $from = &fields($Word_Count, $#Words);
+ last;
+ }
+ }
+### bond()
+ if ($from =~ /( to )|^to/) { # said "from ... to ...", so zap length
+ $leng = 0;
+ } elsif (! $from) { # no from given at all
+ $from = 'from Last.' . &leave($Last_Type, $Dir) . ' ' .
+ &fields($Word_Count, $#Words);
+ }
+ printf "Last: %s(%g, %g, %s)\n", $type, $leng, $Dir, $from;
+ $Last_Type = $Types{'BOND'};
+ $Labtype{$Last_Name} = $Last_Type if $Last_Name;
+ if ($moiety) {
+ @Words = ($moiety);
+ &molecule();
+ }
+} # bond()
+
+
+##########
+# bracket()
+#
+sub bracket {
+ my $t;
+ printf (("]\n"));
+ if ($Words[1] && $Words[1] eq ')') {
+ $t = 'spline';
+ } else {
+ $t = 'line';
+ }
+ printf "%s from last [].sw+(%g,0) to last [].sw to last [].nw to last " .
+ "[].nw+(%g,0)\n", $t, $Params{'dbrack'}, $Params{'dbrack'};
+ printf "%s from last [].se-(%g,0) to last [].se to last [].ne to last " .
+ "[].ne-(%g,0)\n", $t, $Params{'dbrack'}, $Params{'dbrack'};
+ if ($Words[2] && $Words[2] eq 'sub') {
+ printf "\" %s\" ljust at last [].se\n", &fields(3, $#Words);
+ }
+} # bracket()
+
+
+##########
+# corner(<dir>)
+#
+# Return the corner name next to the given angle.
+#
+sub corner {
+ my ($d) = @_;
+ $Dc{ (45 * int(($d + 22.5) / 45)) % 360 };
+} # corner()
+
+
+##########
+# cvtdir(<dir>)
+#
+# Maps "[pointing] somewhere" to degrees.
+#
+sub cvtdir {
+ my ($d) = @_;
+ if ($Words[$Word_Count] eq 'pointing') {
+ $Word_Count++;
+ }
+ if ($Words[$Word_Count] =~ /^[+\\-]?\d+/) {
+ return ( $Words[$Word_Count++] % 360 );
+ } elsif ($Words[$Word_Count] =~ /left|right|up|down|ne|nw|se|sw/) {
+ return ( $Dc{$Words[$Word_Count++]} % 360 );
+ } else {
+ $Word_Count++;
+ return $d;
+ }
+} # cvtdir()
+
+
+##########
+# dblring(<v>)
+#
+sub dblring {
+ my ($v) = @_;
+ my ($d, $v1, $v2);
+ # should canonicalize to i,i+1 mod v
+ $d = $Words[$Word_Count];
+ for ($Word_Count++; $Word_Count <= $#Words &&
+ $Words[$Word_Count] =~ /^[1-9]/; $Word_Count++) {
+ $v1 = substr($Words[$Word_Count], 0, 1);
+ $v2 = substr($Words[$Word_Count], 2, 1);
+ if ($v2 == $v1 + 1 || $v1 == $v && $v2 == 1) { # e.g., 2,3 or 5,1
+ $Dbl{$v1} = $d;
+ } elsif ($v1 == $v2 + 1 || $v2 == $v && $v1 == 1) { # e.g., 3,2 or 1,5
+ $Dbl{$v2} = $d;
+ } else {
+ &error(sprintf("weird %s bond in\n\t%s", $d, $_));
+ }
+ }
+} # dblring()
+
+
+##########
+# dofrom()
+#
+sub dofrom {
+ my $n;
+ $Word_Count++; # skip "from"
+ $n = $Words[$Word_Count];
+ if (defined $Labtype{$n}) { # "from Thing" => "from Thing.V.s"
+ return 'from ' . $n . '.' . &leave($Labtype{$n}, $Dir);
+ }
+ if ($n =~ /^\.[A-Z]/) { # "from .V" => "from Last.V.s"
+ return 'from Last' . $n . '.' . &corner($Dir);
+ }
+ if ($n =~ /^[A-Z][^.]*\.[A-Z][^.]*$/) { # "from X.V" => "from X.V.s"
+ return 'from ' . $n . '.' . &corner($Dir);
+ }
+ &fields($Word_Count - 1, $#Words);
+} # dofrom()
+
+
+##########
+# error(<string>)
+#
+sub error {
+ my ($s) = @_;
+ printf STDERR "chem: error in %s on line %d: %s\n",
+ $File_Name, $Line_No, $s;
+} # error()
+
+
+##########
+# fields(<n1>, <n2>)
+#
+sub fields {
+ my ($n1, $n2) = @_;
+ if ($n1 > $n2) {
+ return '';
+ }
+ my $s = '';
+ foreach my $i ($n1..$n2) {
+ if ($Words[$i] =~ /^#/) {
+ last;
+ }
+ $s = $s . $Words[$i] . ' ';
+ }
+ $s;
+} # fields()
+
+
+##########
+# init()
+#
+sub init {
+ if ($First_Time) {
+ printf "copy \"%s\"\n", $File_chem_pic;
+ printf "\ttextht = %g; textwid = .1; cwid = %g\n",
+ $Params{'textht'}, $Params{'cwid'};
+ printf "\tlineht = %g; linewid = %g\n",
+ $Params{'lineht'}, $Params{'linewid'};
+ $First_Time = 0;
+ }
+ printf "Last: 0,0\n";
+ $Last_Type = $Types{'OTHER'};
+ $Dir = 90;
+} # init()
+
+
+##########
+# leave(<last>, <d>)
+#
+sub leave {
+ my ($last, $d) = @_;
+ my ($c, $c1);
+ # return vertex of $last in direction $d
+ if ( $last eq $Types{'BOND'} ) {
+ return 'end';
+ }
+ $d %= 360;
+ if ( $last =~ /^$Types{'RING'}/ ) {
+ return &ringleave($last, $d);
+ }
+ if ( $last eq $Types{'MOL'} ) {
+ if ($d == 0 || $d == 180) {
+ $c = 'C';
+ } elsif ($d > 0 && $d < 180) {
+ $c = 'R';
+ } else {
+ $c = 'L';
+ }
+ if (defined $Dc{$d}) {
+ $c1 = $Dc{$d};
+ } else {
+ $c1 = &corner($d);
+ }
+ return sprintf('%s.%s', $c, $c1);
+ }
+ if ( $last eq $Types{'OTHER'} ) {
+ return &corner($d);
+ }
+ 'c';
+} # leave()
+
+
+##########
+# makering(<type>, <pt>, <v>)
+#
+sub makering {
+ my ($type, $pt, $v) = @_;
+ my ($i, $j, $a, $r, $rat, $fix, $c1, $c2);
+ if ($type =~ /flat/) {
+ $v = 6;
+ # vertices
+ ;
+ }
+ $r = $Params{'ringside'} / (2 * sin(pi / $v));
+ printf "\tC: 0,0\n";
+ for ($i = 0; $i <= $v + 1; $i++) {
+ $a = (($i - 1) / $v * 360 + $pt) / 57.29578; # 57. is $deg
+ printf "\tV%d: (%g,%g)\n", $i, $r * sin($a), $r * cos($a);
+ }
+ if ($type =~ /flat/) {
+ printf "\tV4: V5; V5: V6\n";
+ $v = 5;
+ }
+ # sides
+ if ($Nput > 0) {
+ # hetero ...
+ for ($i = 1; $i <= $v; $i++) {
+ $c1 = $c2 = 0;
+ if ($Put{$i} ne '') {
+ printf "\tV%d: ellipse invis ht %g wid %g at V%d\n",
+ $i, $Params{'crh'}, $Params{'crw'}, $i;
+ printf "\t%s at V%d\n", $Put{$i}, $i;
+ $c1 = $Params{'cr'};
+ }
+ $j = $i + 1;
+ if ($j > $v) {
+ $j = 1;
+ }
+### makering()
+ if ($Put{$j} ne '') {
+ $c2 = $Params{'cr'};
+ }
+ printf "\tline from V%d to V%d chop %g chop %g\n", $i, $j, $c1, $c2;
+ if ($Dbl{$i} ne '') {
+ # should check i<j
+ if ($type =~ /flat/ && $i == 3) {
+ $rat = 0.75;
+ $fix = 5;
+ } else {
+ $rat = 0.85;
+ $fix = 1.5;
+ }
+ if ($Put{$i} eq '') {
+ $c1 = 0;
+ } else {
+ $c1 = $Params{'cr'} / $fix;
+ }
+ if ($Put{$j} eq '') {
+ $c2 = 0;
+ } else {
+ $c2 = $Params{'cr'} / $fix;
+ }
+ printf "\tline from %g<C,V%d> to %g<C,V%d> chop %g chop %g\n",
+ $rat, $i, $rat, $j, $c1, $c2;
+ if ($Dbl{$i} eq 'triple') {
+ printf "\tline from %g<C,V%d> to %g<C,V%d> chop %g chop %g\n",
+ 2 - $rat, $i, 2 - $rat, $j, $c1, $c2;
+ }
+ }
+ }
+### makering()
+ } else {
+ # regular
+ for ($i = 1; $i <= $v; $i++) {
+ $j = $i + 1;
+ if ($j > $v) {
+ $j = 1;
+ }
+ printf "\tline from V%d to V%d\n", $i, $j;
+ if ($Dbl{$i} ne '') {
+ # should check i<j
+ if ($type =~ /flat/ && $i == 3) {
+ $rat = 0.75;
+ } else {
+ $rat = 0.85;
+ }
+ printf "\tline from %g<C,V%d> to %g<C,V%d>\n",
+ $rat, $i, $rat, $j;
+ if ($Dbl{$i} eq 'triple') {
+ printf "\tline from %g<C,V%d> to %g<C,V%d>\n",
+ 2 - $rat, $i, 2 - $rat, $j;
+ }
+ }
+ }
+ }
+### makering()
+ # punt on triple temporarily
+ # circle
+ if ($type =~ /benz/ || $Aromatic > 0) {
+ if ($type =~ /flat/) {
+ $r *= .4;
+ } else {
+ $r *= .5;
+ }
+ printf "\tcircle rad %g at 0,0\n", $r;
+ }
+} # makering()
+
+
+##########
+# molecule()
+#
+sub molecule {
+ my ($n, $type);
+ if ($#Words >= 0) {
+ $n = $Words[0];
+ if ($n eq 'BP') {
+ $Words[0] = "\"\" ht 0 wid 0";
+ $type = $Types{'OTHER'};
+ } else {
+ $Words[0] = &atom($n);
+ $type = $Types{'MOL'};
+ }
+ }
+ $n =~ s/[^A-Za-z0-9]//g; # for stuff like C(OH3): zap non-alnum
+ if ($#Words < 1) {
+ printf "Last: %s: %s with .%s at Last.%s\n",
+ $n, join(' ', @Words), &leave($type, $Dir + 180),
+ &leave($Last_Type, $Dir);
+### molecule()
+ } else {
+ if (! $Words[1]) {
+ printf "Last: %s: %s with .%s at Last.%s\n",
+ $n, join(' ', @Words), &leave($type, $Dir + 180),
+ &leave($Last_Type, $Dir);
+ } elsif ($#Words >= 1 and $Words[1] eq 'below') {
+ $Words[2] = '' if ! $Words[2];
+ printf "Last: %s: %s with .n at %s.s\n", $n, $Words[0], $Words[2];
+ } elsif ($#Words >= 1 and $Words[1] eq 'above') {
+ $Words[2] = '' if ! $Words[2];
+ printf "Last: %s: %s with .s at %s.n\n", $n, $Words[0], $Words[2];
+ } elsif ($#Words >= 2 and $Words[1] eq 'left' && $Words[2] eq 'of') {
+ $Words[3] = '' if ! $Words[3];
+ printf "Last: %s: %s with .e at %s.w+(%g,0)\n",
+ $n, $Words[0], $Words[3], $Params{'dew'};
+ } elsif ($#Words >= 2 and $Words[1] eq 'right' && $Words[2] eq 'of') {
+ $Words[3] = '' if ! $Words[3];
+ printf "Last: %s: %s with .w at %s.e-(%g,0)\n",
+ $n, $Words[0], $Words[3], $Params{'dew'};
+ } else {
+ printf "Last: %s: %s\n", $n, join(' ', @Words);
+ }
+ }
+
+ $Last_Type = $type;
+ if ($Last_Name) {
+ # $Last_Type = '';
+ $Labtype{$Last_Name} = $Last_Type;
+ }
+ $Labtype{$n} = $Last_Type;
+} # molecule()
+
+
+##########
+# print_hash(<hash_or_ref>)
+#
+# print the elements of a hash or hash reference
+#
+sub print_hash {
+ my $hr;
+ my $n = scalar @_;
+ if ($n == 0) {
+ print STDERR "empty hash\n;";
+ return 1;
+ } elsif ($n == 1) {
+ if (ref($_[0]) eq 'HASH') {
+ $hr = $_[0];
+ } else {
+ warn 'print_hash(): the argument is not a hash or hash reference;';
+ return 0;
+ }
+ } else {
+ if ($n % 2) {
+ warn 'print_hash(): the arguments are not a hash;';
+ return 0;
+ } else {
+ my %h = @_;
+ $hr = \%h;
+ }
+ }
+
+### print_hash()
+ unless (%$hr) {
+ print STDERR "empty hash\n";
+ return 1;
+ }
+ print STDERR "hash (ignore the ^ characters):\n";
+ for my $k (sort keys %$hr) {
+ my $hk = $hr->{$k};
+ print STDERR " $k => ";
+ if (defined $hk) {
+ print STDERR "^$hk^";
+ } else {
+ print STDERR "undef";
+ }
+ print STDERR "\n";
+ }
+
+ 1;
+} # print_hash()
+
+
+##########
+# print_pe()
+#
+sub print_pe {
+ print ".PE\n";
+} # print_pe()
+
+
+##########
+# print_ps()
+#
+sub print_ps {
+ print ".PS\n";
+} # print_ps()
+
+##########
+# putring(<v>)
+#
+sub putring {
+ # collect "put Mol at n"
+ my ($v) = @_;
+ my ($m, $mol, $n);
+ $Word_Count++;
+ $mol = $Words[$Word_Count++];
+ if ($Words[$Word_Count] eq 'at') {
+ $Word_Count++;
+ }
+ $n = $Words[$Word_Count];
+ if ($n !~ /^\d+$/) {
+ $n =~ s/(\d)+$/$1/;
+ $n = 0 if $n !~ /^\d+$/;
+ error('use single digit as argument for "put at"');
+ }
+ if ($n >= 1 && $n <= $v) {
+ $m = $mol;
+ $m =~ s/[^A-Za-z0-9]//g;
+ $Put{$n} = $m . ':' . &atom($mol);
+ } elsif ($n == 0) {
+ error('argument of "put at" must be a single digit');
+ } else {
+ error('argument of "put at" is too large');
+ }
+ $Word_Count++;
+} # putring()
+
+
+##########
+# ring(<type>)
+#
+sub ring {
+ my ($type) = @_;
+ my ($typeint, $pt, $verts, $i, $other, $fused, $withat);
+ $pt = 0; # points up by default
+ if ($type =~ /([1-8])$/) {
+ $verts = $1;
+ } elsif ($type =~ /flat/) {
+ $verts = 5;
+ } else {
+ $verts = 6;
+ }
+ $fused = $other = '';
+ for ($i = 1; $i <= $verts; $i++) {
+ $Put{$i} = $Dbl{$i} = '';
+ }
+ $Nput = $Aromatic = $withat = 0;
+ for ($Word_Count = 1; $Word_Count <= $#Words; ) {
+ if ($Words[$Word_Count] eq 'pointing') {
+ $pt = &cvtdir(0);
+ } elsif ($Words[$Word_Count] eq 'double' ||
+ $Words[$Word_Count] eq 'triple') {
+ &dblring($verts);
+ } elsif ($Words[$Word_Count] =~ /arom/) {
+ $Aromatic++;
+ $Word_Count++; # handled later
+### ring()
+ } elsif ($Words[$Word_Count] eq 'put') {
+ &putring($verts);
+ $Nput++;
+ } elsif ($Words[$Word_Count] =~ /^#/) {
+ $Word_Count = $#Words + 1;
+ last;
+ } else {
+ if ($Words[$Word_Count] eq 'with' || $Words[$Word_Count] eq 'at') {
+ $withat = 1;
+ }
+ $other = $other . ' ' . $Words[$Word_Count];
+ $Word_Count++;
+ }
+ }
+ $typeint = $Types{'RING'} . $verts . $pt; # RING | verts | dir
+ if ($withat == 0) {
+ # join a ring to something
+ if ( $Last_Type =~ /^$Types{'RING'}/ ) {
+ # ring to ring
+ if (substr($typeint, 2) eq substr($Last_Type, 2)) {
+ # fails if not 6-sided
+ $fused = 'with .V6 at Last.V2';
+ }
+ }
+ # if all else fails
+ $fused = sprintf('with .%s at Last.%s',
+ &leave($typeint, $Dir + 180), &leave($Last_Type, $Dir));
+ }
+ printf "Last: [\n";
+ &makering($type, $pt, $verts);
+ printf "] %s %s\n", $fused, $other;
+ $Last_Type = $typeint;
+ $Labtype{$Last_Name} = $Last_Type if $Last_Name;
+} # ring()
+
+
+##########
+# ringleave(<last>, <d>)
+#
+sub ringleave {
+ my ($last, $d) = @_;
+ my ($rd, $verts);
+ # return vertex of ring in direction d
+ $verts = substr($last, 1, 1);
+ $rd = substr($last, 2);
+ sprintf('V%d.%s', int( (($d - $rd) % 360) / (360 / $verts)) + 1,
+ &corner($d));
+} # ringleave()
+
+
+##########
+# setparams(<scale>)
+#
+sub setparams {
+ my ($scale) = @_;
+ $Params{'lineht'} = $scale * 0.2;
+ $Params{'linewid'} = $scale * 0.2;
+ $Params{'textht'} = $scale * 0.16;
+ $Params{'db'} = $scale * 0.2; # bond length
+ $Params{'cwid'} = $scale * 0.12; # character width
+ $Params{'cr'} = $scale * 0.08; # rad of invis circles at ring vertices
+ $Params{'crh'} = $scale * 0.16; # ht of invis ellipse at ring vertices
+ $Params{'crw'} = $scale * 0.12; # wid
+ $Params{'dav'} = $scale * 0.015; # vertical shift up for atoms in atom macro
+ $Params{'dew'} = $scale * 0.02; # east-west shift for left of/right of
+ $Params{'ringside'} = $scale * 0.3; # side of all rings
+ $Params{'dbrack'} = $scale * 0.1; # length of bottom of bracket
+} # setparams()
+
+
+sub usage {
+ print <<EOF;
+usage: $chem [file ...]
+usage: $chem { -h | --help | -v | --version }
+
+$chem is a groff preprocessor for producing chemical structure
+diagrams. It produces input for the $makevar{'G'}pic preprocessor. If
+no file operands are given, or if file is "-", the standard input stream
+is read.
+
+Options:
+ -h, --help Display this message and exit.
+ -v, --version Display version information and exit.
+EOF
+}
+
+
+sub version {
+ print <<EOF;
+$chem (groff $groff_version) $chem_version
+$copyright
+License GPLv2: GNU GPL version 2
+<https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html>
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+EOF
+}
+
+1;
+
+# Local Variables:
+# fill-column: 72
+# mode: CPerl
+# End:
+# vim: set cindent noexpandtab shiftwidth=2 softtabstop=2 textwidth=72:
diff --git a/contrib/chem/examples/122/README.txt b/contrib/chem/examples/122/README.txt
new file mode 100644
index 0000000..6f3809b
--- /dev/null
+++ b/contrib/chem/examples/122/README.txt
@@ -0,0 +1,57 @@
+This directory contains the examples for the 'chem' language written
+in the book:
+
+ Computing Science Technical Report No. 122
+ CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+ by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+
+The book is available in the internet at
+<http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+Many of the examples had to be fixed. Unfortunately, the 'chem' akw
+version does not run on many of these programs. But the Perl version
+of 'chem' works on all examples.
+
+Most examples do not use the modern chemical display. They have C
+atoms added, whereas the modern method omits all C atoms and their
+directly appended H atoms.
+
+The examples are named and sorted by the chapter where they are found
+in the book. For example, the file 'ch4c_colon.chem' means a 'chem'
+example in chapter 4; according to 'c', it is the third example in
+this chapter; the name 'colon' is used to describe the context of the
+example.
+
+You can view the graphical display of the examples by calling
+
+ @g@chem <file> | groff -p ...
+
+
+####### License
+
+Copyright (C) 2006-2020 Free Software Foundation, Inc.
+Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+
+This file is part of 'chem', 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 (GPL) version 2 as
+published by the Free Software Foundation.
+
+'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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+The GPL2 license text is available in the internet at
+<http://www.gnu.org/licenses/gpl-2.0.html>.
+
+
+##### Editor settings
+
+Local Variables:
+mode: text
+End:
diff --git a/contrib/chem/examples/122/ch2a_ethyl.chem b/contrib/chem/examples/122/ch2a_ethyl.chem
new file mode 100644
index 0000000..089de73
--- /dev/null
+++ b/contrib/chem/examples/122/ch2a_ethyl.chem
@@ -0,0 +1,43 @@
+ch2a_ethyl.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+ CH3
+ bond
+ CH2
+ bond
+
+# Local Variables:
+# fill-column: 72
+# mode: Nroff
+# End:
+# vim: set textwidth=72:
+.cend
diff --git a/contrib/chem/examples/122/ch2b_benzene.chem b/contrib/chem/examples/122/ch2b_benzene.chem
new file mode 100644
index 0000000..0af1c9f
--- /dev/null
+++ b/contrib/chem/examples/122/ch2b_benzene.chem
@@ -0,0 +1,38 @@
+ch2b_benzene.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+ benzene
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch2c_benzene_right.chem b/contrib/chem/examples/122/ch2c_benzene_right.chem
new file mode 100644
index 0000000..d9f29b5
--- /dev/null
+++ b/contrib/chem/examples/122/ch2c_benzene_right.chem
@@ -0,0 +1,36 @@
+ch2c_benzene_right.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# 'groff' is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+ benzene pointing right # a rotated benzene ring
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4a_stick.chem b/contrib/chem/examples/122/ch4a_stick.chem
new file mode 100644
index 0000000..f4caef3
--- /dev/null
+++ b/contrib/chem/examples/122/ch4a_stick.chem
@@ -0,0 +1,45 @@
+ch4a_stick.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+ bond right
+ bond 60
+ bond 120
+ bond 60
+ bond 120
+ bond down
+
+# Local Variables:
+# fill-column: 72
+# mode: Nroff
+# End:
+# vim: set textwidth=72:
+.cend
diff --git a/contrib/chem/examples/122/ch4b_methyl_acetate.chem b/contrib/chem/examples/122/ch4b_methyl_acetate.chem
new file mode 100644
index 0000000..31625a3
--- /dev/null
+++ b/contrib/chem/examples/122/ch4b_methyl_acetate.chem
@@ -0,0 +1,47 @@
+ch4b_methyl_acetate.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+CH3 # the 3 is automatically turned into a subscript
+bond # the implicit direction is right
+ # implicit connection is to right side of CH3
+C
+double bond 30 # by default, from the substituent C
+O
+bond 120 from C # must be "from C"; otherwise would leave from O
+O
+bond right
+CH3
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4c_colon.chem b/contrib/chem/examples/122/ch4c_colon.chem
new file mode 100644
index 0000000..5e42f6b
--- /dev/null
+++ b/contrib/chem/examples/122/ch4c_colon.chem
@@ -0,0 +1,42 @@
+ch4c_colon.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+ CH3
+ bond ; C
+ double bond 30 ; O
+ bond 120 from C ; O
+ bond right ; CH3
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4d_HCl.H2O.chem b/contrib/chem/examples/122/ch4d_HCl.H2O.chem
new file mode 100644
index 0000000..b6ac99d
--- /dev/null
+++ b/contrib/chem/examples/122/ch4d_HCl.H2O.chem
@@ -0,0 +1,38 @@
+ch4d_HCl.H2O.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+ HCl.H2O
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4e_CaSO4.2H2O.chem b/contrib/chem/examples/122/ch4e_CaSO4.2H2O.chem
new file mode 100644
index 0000000..b2f8bc0
--- /dev/null
+++ b/contrib/chem/examples/122/ch4e_CaSO4.2H2O.chem
@@ -0,0 +1,38 @@
+ch4e_CaSO4.2H2O.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+ CaSO4.2H2O
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4f_C.chem b/contrib/chem/examples/122/ch4f_C.chem
new file mode 100644
index 0000000..d54461f
--- /dev/null
+++ b/contrib/chem/examples/122/ch4f_C.chem
@@ -0,0 +1,48 @@
+ch4f_C.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+ bond ; C # 1st definition of C
+ bond up from C
+ bond down from C
+ bond right from C ; C # 2nd definition of C
+ bond up from C
+ bond down from C
+ bond right from C ; C # 3rd definition of C
+ bond up from C
+ bond down from C
+ bond right from C
+
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4g_BP.chem b/contrib/chem/examples/122/ch4g_BP.chem
new file mode 100644
index 0000000..9c6af4b
--- /dev/null
+++ b/contrib/chem/examples/122/ch4g_BP.chem
@@ -0,0 +1,48 @@
+ch4g_BP.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+# this is the isopropyl group
+ bond 120 ; BP # BP is right end of this bond
+ bond -120 from BP
+ bond right from BP ; C
+ front bond up ; CH3
+ back bond down from C ; D
+ bond right from C ; BP
+# redefine BP to mean the center carbon of this t-butyl group
+ bond up from BP
+ bond right from BP
+ bond down from BP
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4h_methacrylate.chem b/contrib/chem/examples/122/ch4h_methacrylate.chem
new file mode 100644
index 0000000..8300d25
--- /dev/null
+++ b/contrib/chem/examples/122/ch4h_methacrylate.chem
@@ -0,0 +1,65 @@
+ch4h_methacrylate.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+ bond dotted
+ bond right ; BP
+ bond up from BP ; C
+ double bond -60 from C ; O
+ bond 60 length .1 from C ; OCH3
+ bond down from BP ; CH3
+# begin second segment of polymer
+ bond right length .5 from BP ; BP
+ bond up length .1 from BP ; H
+ bond down length .1 from BP ; H
+# begin third segment of polymer
+ bond right length .5 from BP ; BP
+ bond up from BP ; C
+ double bond -60 from C ; O
+ bond 60 length .1 from C ; OCH3
+ bond down from BP ; CH3
+# begin fourth segment of polymer
+ bond right length .5 from BP ; BP
+ bond up length .1 from BP ; H
+ bond down length .1 from BP ; H
+# begin fifth segment of polymer
+ bond right length .5 from BP ; BP
+ bond up from BP ; C
+ double bond -60 from C ; O
+ bond 60 length .1 from C ; OCH3
+ bond down from BP ; CH3
+ bond right from BP
+ bond dotted
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4i_cyclo.chem b/contrib/chem/examples/122/ch4i_cyclo.chem
new file mode 100644
index 0000000..866e6f7
--- /dev/null
+++ b/contrib/chem/examples/122/ch4i_cyclo.chem
@@ -0,0 +1,45 @@
+ch4i_cyclo.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+R3: ring3
+R4: ring4 at R3 + (.75,0)
+R5: ring5 at R4 + (.75,0)
+R6: ring6 at R5 + (.75,0)
+B: benzene at R6 + (.75,0)
+R7: ring7 at B + (.75,0)
+R8: ring8 at R7 + (.75,0)
+
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4j_ring4.chem b/contrib/chem/examples/122/ch4j_ring4.chem
new file mode 100644
index 0000000..9caf718
--- /dev/null
+++ b/contrib/chem/examples/122/ch4j_ring4.chem
@@ -0,0 +1,40 @@
+ch4j_ring4.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+ ring4 pointing 45
+
+# Local Variables:
+# fill-column: 72
+# mode: Nroff
+# End:
+# vim: set textwidth=72:
+.cend
diff --git a/contrib/chem/examples/122/ch4k_ring3.chem b/contrib/chem/examples/122/ch4k_ring3.chem
new file mode 100644
index 0000000..2a2d856
--- /dev/null
+++ b/contrib/chem/examples/122/ch4k_ring3.chem
@@ -0,0 +1,40 @@
+ch4k_ring3.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+R: ring3
+ back bond 120 from R.V2 ; C2H5
+ front bond -120 from R.V3 ; HO
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4l_vertex.chem b/contrib/chem/examples/122/ch4l_vertex.chem
new file mode 100644
index 0000000..d9fcb07
--- /dev/null
+++ b/contrib/chem/examples/122/ch4l_vertex.chem
@@ -0,0 +1,45 @@
+ch4l_vertex.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+R: benzene pointing right
+ bond left from R.V4 ; HO
+ bond -150 from R.V3 ; CH3O
+ bond right from R.V1 ; C
+ double bond up from C ; O
+ bond right from C ; N
+ bond 45 ; C2H5
+ bond 135 from N ; C2H5
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4m_double.chem b/contrib/chem/examples/122/ch4m_double.chem
new file mode 100644
index 0000000..c5b1373
--- /dev/null
+++ b/contrib/chem/examples/122/ch4m_double.chem
@@ -0,0 +1,38 @@
+ch4m_double.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+ ring double 1,2 3,4 5,6
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4n_triple.chem b/contrib/chem/examples/122/ch4n_triple.chem
new file mode 100644
index 0000000..5766f85
--- /dev/null
+++ b/contrib/chem/examples/122/ch4n_triple.chem
@@ -0,0 +1,38 @@
+ch4n_triple.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+ ring8 triple 3,4
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4o_aromatic.chem b/contrib/chem/examples/122/ch4o_aromatic.chem
new file mode 100644
index 0000000..aa303c7
--- /dev/null
+++ b/contrib/chem/examples/122/ch4o_aromatic.chem
@@ -0,0 +1,37 @@
+ch4o_aromatic.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# 'groff' is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+R: aromatic ring7
+ "+" at R
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4p_cholestanol.chem b/contrib/chem/examples/122/ch4p_cholestanol.chem
new file mode 100644
index 0000000..e292bea
--- /dev/null
+++ b/contrib/chem/examples/122/ch4p_cholestanol.chem
@@ -0,0 +1,60 @@
+ch4p_cholestanol.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+R1: ring6
+ "R1" at R1 # this puts a label at R1
+ front bond -120 from R1.V5 ; HO
+ # the following line says "fuse the next six-
+ # membered ring with its 6th vertex joining
+ # the second vertex of R1"
+R2: ring6 with .V6 at R1.V2
+ front bond up from R2.V6 ; CH3
+ back bond down from R2.V4 ; H
+ back bond down from R2.V1 ; H
+ front bond up from R2.V2 ; H
+R3: ring6 with .V4 at R2.V2
+R4: flatring with .V5 at R3.V2
+ front bond up from R4.V5 ; CH3
+ back bond down from R4.V4 ; H # this is the alkyl chain
+ bond up from R4.V1 ; BP
+ bond -60 from BP
+ bond 60 from BP
+ bond 120
+ bond 60
+ bond 120 ; BP
+ bond down from BP
+ bond 60 from BP
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4q_rings.chem b/contrib/chem/examples/122/ch4q_rings.chem
new file mode 100644
index 0000000..bafdd92
--- /dev/null
+++ b/contrib/chem/examples/122/ch4q_rings.chem
@@ -0,0 +1,46 @@
+ch4q_rings.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+R3: ring3
+R4: ring4 pointing 45 with .V1 at R3.V2
+R5: ring5 pointing down with .V4 at R4.V2
+R6: ring6 pointing 54 with .V6 at R5.V5
+ # the following lines specify the labels inside the rings
+ "3" at R3
+ "4" at R4
+ "5" at R5
+ "6" at R6
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4r_spiro.chem b/contrib/chem/examples/122/ch4r_spiro.chem
new file mode 100644
index 0000000..24ec050
--- /dev/null
+++ b/contrib/chem/examples/122/ch4r_spiro.chem
@@ -0,0 +1,42 @@
+ch4r_spiro.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+R1: ring6
+R2: ring6 with .V1 at R1.V4
+R3: ring5 with .V5 at R2.V3
+ back bond 60 from R3.V2 ; OH
+ front bond 150 from R3.V3 ; OH
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4s_heteroatoms.chem b/contrib/chem/examples/122/ch4s_heteroatoms.chem
new file mode 100644
index 0000000..7dc8ba7
--- /dev/null
+++ b/contrib/chem/examples/122/ch4s_heteroatoms.chem
@@ -0,0 +1,38 @@
+ch4s_heteroatoms.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+ ring put N at 2 put S at 4 double 2,3 4,5 6,1
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4t_polycyclic.chem b/contrib/chem/examples/122/ch4t_polycyclic.chem
new file mode 100644
index 0000000..fc6b580
--- /dev/null
+++ b/contrib/chem/examples/122/ch4t_polycyclic.chem
@@ -0,0 +1,49 @@
+ch4t_polycyclic.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+R1: benzene pointing right
+ bond 30 from R1.V6 ; Br
+R2: benzene pointing right with .V5 at R1.V1
+R3: benzene pointing right with .V1 at R2.V3
+ bond 150 from R3.V2 ; CO2H
+R4: benzene pointing right with .V1 at R1.V3
+# next line names bond B1 so we can refer to its end
+B1: bond left from R4.V4
+ ring6 put N at 4 double 2,3 4,5 6,1 with .V3 at B1.end
+B2: bond right from R2.V1
+R5: benzene with .V5 at B2.end
+ ring6 put N at 4 double 1,2 3,4 with .V5 at R5.V3
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4u_nicotine.chem b/contrib/chem/examples/122/ch4u_nicotine.chem
new file mode 100644
index 0000000..d38a7c8
--- /dev/null
+++ b/contrib/chem/examples/122/ch4u_nicotine.chem
@@ -0,0 +1,42 @@
+ch4u_nicotine.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+ benzene put N at 4
+ bond right
+ ring5 pointing down put N at 1
+ bond down from .N ; CH3 # or .V1
+
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4v_histidine.chem b/contrib/chem/examples/122/ch4v_histidine.chem
new file mode 100644
index 0000000..33a4e9d
--- /dev/null
+++ b/contrib/chem/examples/122/ch4v_histidine.chem
@@ -0,0 +1,44 @@
+ch4v_histidine.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+R1: flatring pointing down put N at 2 put N at 5 double 1,2 3,4
+ H right of R1.V5
+ bond right from R1.V4 ; CH2
+ bond right ; C
+ bond up from C ; H
+ bond down from C ; NH2
+ bond right from C ; CO2H
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4w_lsd.chem b/contrib/chem/examples/122/ch4w_lsd.chem
new file mode 100644
index 0000000..aa68b00
--- /dev/null
+++ b/contrib/chem/examples/122/ch4w_lsd.chem
@@ -0,0 +1,50 @@
+ch4w_lsd.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+B: benzene pointing right
+F: flatring pointing left put N at 5 double 3,4 with .V1 at B.V2
+ H below F.N
+R: ring pointing right with .V4 at B.V6
+ front bond right from R.V6 ; H
+W: ring pointing right with .V2 at R.V6 put N at 1 double 3,4
+ bond right from W.N ; CH3
+ back bond -60 from W.V5 ; H
+ bond up from W.V5 ; C
+ double bond up from C ; O
+ bond right from C ; N
+ bond 45 from N ; C2H5
+ bond 135 from N ; C2H5
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4x_anisole.chem b/contrib/chem/examples/122/ch4x_anisole.chem
new file mode 100644
index 0000000..ec78417
--- /dev/null
+++ b/contrib/chem/examples/122/ch4x_anisole.chem
@@ -0,0 +1,42 @@
+ch4x_anisole.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+R1: benzene
+ bond down from R1.V4 ; OCH3
+R2: benzene at R1 + (1.5,0)
+ bond down from R2.V4 ; O
+ CH3 right of O
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4y_reserpine.chem b/contrib/chem/examples/122/ch4y_reserpine.chem
new file mode 100644
index 0000000..fb5d1ca
--- /dev/null
+++ b/contrib/chem/examples/122/ch4y_reserpine.chem
@@ -0,0 +1,62 @@
+ch4y_reserpine.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+# Some corrections were added.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+ CH3O
+ bond 60
+R1: benzene
+R2: aromatic flatring5 pointing down put N at 1 with .V3 at R1.V2
+ H below R2.V1
+R3: ring put N at 3 with .V5 at R2.V5
+R4: ring put N at 1 with .V1 at R3.V3
+ back bond -120 from R4.V4 ; H
+ back bond 60 from R4.V3 ; H
+R5: ring with .V1 at R4.V3
+ bond -120 ; C
+ double bond down from C ; O
+ CH3O left of C
+ back bond 60 from R5.V3 ; H
+ back bond down from R5.V4 ; O
+ CH3 right of O
+ bond 120 from R5.V3 ; O
+ bond right length .1 from O ; C
+ double bond down ; O
+ bond right length .1 from C
+B: benzene pointing right
+ bond 30 from B.V6 ; OCH3
+ bond right from B.V1 ; OCH3
+ bond 150 from B.V2 ; OCH3
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch4z1_eqn_glutamic.chem b/contrib/chem/examples/122/ch4z1_eqn_glutamic.chem
new file mode 100644
index 0000000..6cecd7c
--- /dev/null
+++ b/contrib/chem/examples/122/ch4z1_eqn_glutamic.chem
@@ -0,0 +1,78 @@
+ch4z1_eqn_glutamic.chem:
+.br
+.EQ
+delim $$
+.EN
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+# Some corrections were added.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+# a left bracket
+ bond right length .1 ; BP
+ bond up length .3
+ bond right length .1
+ bond down length .3 from BP
+ bond right length .1
+# this is the mainchain amide structure
+ bond right length .1 from BP ; NH
+ bond right ; CH
+# label the CH with an alpha, intended for eqn.
+# this line says "put the north edge of the alpha at the
+# south edge of the CH"
+ "$alpha$" with .n at CH.s
+ bond right from CH ; C
+ double bond up from C ; O
+ bond right length .1 from C ; BP
+# a right bracket
+ bond up length .3
+ bond left length .1
+ bond right length .1 from BP
+ bond down length .3 from BP ; BP
+ bond left length .1
+# label the degree of polymerization
+ "$n$" with .w at BP.se
+# this is the sidechain
+ bond up from CH ; CH2
+ "$beta$" with .e at CH2.w
+ bond up from CH2 ; CH2
+ "$gamma$" with .e at CH2.w
+ bond up from CH2 ; C
+# this is the benzyl ester part
+ double bond -60 from C ; O
+ bond 60 from C ; O
+ bond right ; CH2C6H5
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
+.EQ
+delim off
+.EN
diff --git a/contrib/chem/examples/122/ch4z2_text.chem b/contrib/chem/examples/122/ch4z2_text.chem
new file mode 100644
index 0000000..2000636
--- /dev/null
+++ b/contrib/chem/examples/122/ch4z2_text.chem
@@ -0,0 +1,53 @@
+ch4z2_text.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+ bond 120 dotted
+ bond 120 length .3 ; BP
+ back bond -120 length .25 from BP ; H
+ front bond 120 length .25 from BP ; CH3
+ bond 60 length .5 from BP ; BP
+ bond -60 length .25 from BP ; H
+# note the pic move command to position the text
+ move left .35 ; "(ANTI)"
+ front bond 60 length .25 from BP ; H
+# another positioning of text
+ move right .35 ; "(SYN)"
+ bond 120 length .4 from BP ; BP
+ back bond -120 length .25 from BP ; H
+ front bond 120 length .25 from BP ; CH3
+ bond 60 length .5 from BP
+ bond 60 dotted
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch5a_size.chem b/contrib/chem/examples/122/ch5a_size.chem
new file mode 100644
index 0000000..d4eb33f
--- /dev/null
+++ b/contrib/chem/examples/122/ch5a_size.chem
@@ -0,0 +1,45 @@
+ch5a_size.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+.ps 14
+size 16
+R: ring6 put O at 1 put C at 2 put O at 3 put C at 4 put O at 5 put C at 6
+ double bond 60 from R.V2 ; NH
+ double bond down from R.V4 ; NH
+ double bond -60 from R.V6 ; HN
+size 10 # if you are doing more than one
+.ps 10
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch6a_pic.chem b/contrib/chem/examples/122/ch6a_pic.chem
new file mode 100644
index 0000000..ad6dea6
--- /dev/null
+++ b/contrib/chem/examples/122/ch6a_pic.chem
@@ -0,0 +1,43 @@
+ch6a_pic.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+R: ring double 2,3
+ line from R.V6 to R.C
+ line from R.C to R.V4
+ X1: 1/2 <R.V5,R.C>
+ X2: 1/2 <R.C,R.V2>
+ bond from X1 to X2
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/ch6b_dna.chem b/contrib/chem/examples/122/ch6b_dna.chem
new file mode 100644
index 0000000..00abbba
--- /dev/null
+++ b/contrib/chem/examples/122/ch6b_dna.chem
@@ -0,0 +1,59 @@
+ch6b_dna.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+P: [
+R1: flatring pointing up put N at 1 put N at 4 double 5,1
+ bond -135 from R1.V4 ; BP
+ "deoxyribose" rjust with .e at BP.w
+R2: ring6 put N at 2 put N at 4 double 1,2 3,4 5,6 with .V6 at R1.V2
+ pic Conn: R2.V2.ne #because naming is too restricted in pic
+ bond up from R2.V1 ; N
+ bond -60 from N ; H
+ bond 60 from N ; H
+]
+ # thymine
+Q: [
+R3: ring6 put N at 3 put N at 5 double 1,2
+ bond up from R3.V1 ; CH3
+ bond 120 from R3.V3 ; BP
+ "deoxyribose" ljust with .w at BP.e
+ double bond down from R3.V4 ; O
+ double bond -60 from R3.V6 ; O
+ bond -120 from R3.V5 ; H
+] with .O at P.H + (.3,.3)
+ bond from Q.O.sw to P.H.ne dotted
+ bond from Q.H.sw to P.Conn dotted
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/chAa_polymer.chem b/contrib/chem/examples/122/chAa_polymer.chem
new file mode 100644
index 0000000..3293454
--- /dev/null
+++ b/contrib/chem/examples/122/chAa_polymer.chem
@@ -0,0 +1,72 @@
+chAa_polymer.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+# epoxy based on the m-phenyldiamine cured bisphenol-A
+ size 8
+ bond dotted
+ bond ; N
+ bond ; CH2
+ bond down from N
+R1: benzene
+ bond 120 length .1 from R1.V3 ; N
+ bond right length .1 from N
+ bond down length .1 from N
+# back to the CH2
+ bond right from CH2 ; CH
+ bond down from CH ; OH
+ bond right from CH ; CH2
+ bond right ; O
+ bond right
+ benzene pointing right
+ bond right ; C
+ bond up from C ; CH3
+ bond down from C ; CH3
+ bond right from C
+ benzene pointing right
+ bond right ; O
+ bond right from O ; CH2
+ bond right ; CH
+ bond down from CH ; OH
+ bond right from CH ; CH2
+ bond right ; N
+ bond right from N
+ bond dotted
+ bond down from N
+R2: benzene
+ bond 120 length .1 from R2.V3 ; N
+ bond right length .1 from N
+ bond down length .1 from N
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/chAb_vinyl_chloro.chem b/contrib/chem/examples/122/chAb_vinyl_chloro.chem
new file mode 100644
index 0000000..dff97fc
--- /dev/null
+++ b/contrib/chem/examples/122/chAb_vinyl_chloro.chem
@@ -0,0 +1,62 @@
+chAb_vinyl_chloro.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+ Cl
+ bond 120 length .25 ; BP
+ bond 60 length .25 from BP ; Cl
+B1: double bond down length .3 from BP
+ bond 120 length .35 ; BP
+# now comes the ring
+R1: ring6 double 1,2 3,4 5,6 with .V6 at BP
+ bond up length .1 from R1.V1 ; H
+ bond 60 length .1 from R1.V2 ; H
+ bond 120 from R1.V3 ; O
+ bond 60 from O ; C
+ double bond up from C ; O
+ bond 120 from C
+# continue decorating the ring
+ bond down length .1 from R1.V4 ; H
+ bond -120 length .1 from R1.V5 ; H
+# now go back and do the left hand ring
+ bond -120 length .35 from B1.end ; BP
+R2: ring6 double 1,2 3,4 5,6 with .V2 at BP
+ bond up length .1 from R2.V1 ; H
+ bond -60 length .1 from R2.V6 ; H
+ bond -120 from R2.V5 ; O
+ bond -60 from O
+ bond down length .1 from R2.V4 ; H
+ bond 120 length .1 from R2.V3 ; H
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/chAc_morphine.chem b/contrib/chem/examples/122/chAc_morphine.chem
new file mode 100644
index 0000000..c9fbf10
--- /dev/null
+++ b/contrib/chem/examples/122/chAc_morphine.chem
@@ -0,0 +1,52 @@
+chAc_morphine.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+R1: ring6 double 1,2
+ bond -60 from R1.V6 ; HO
+R2: ring6 with .V1 at R1.V3
+ bond 60 from R2.V2 ; N
+ bond right from N ; CH3
+R3: benzene with .V1 at R2.V5
+ bond -120 from R3.V5 ; HO
+# this is the furan ring
+ bond -135 length .33 from R1.V5 ; O
+ bond -45 length .33 from R3.V6
+# this is the odd ring
+ bond up length .1 from N ; BP
+B1: bond up length .33 from R1.V4
+ bond to BP
+
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/chAd_chlorophyll.chem b/contrib/chem/examples/122/chAd_chlorophyll.chem
new file mode 100644
index 0000000..e2acb22
--- /dev/null
+++ b/contrib/chem/examples/122/chAd_chlorophyll.chem
@@ -0,0 +1,69 @@
+chAd_chlorophyll.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+ Mg
+ bond 45 ; N
+R1: ring5 pointing up put N at 4 double 1,2 4,5 with .V4 at N
+ bond up from R1.V1 ; CH3
+ bond right from R1.V2 ; CH2CH3
+ bond 135 from Mg ; N
+R2: ring5 pointing down put N at 3 double 1,2 4,5 with .V3 at N
+ bond right from R2.V5 ; CH3
+ bond 225 from Mg ; N
+R3: ring5 pointing down put N at 4 double 3,4 with .V4 at N
+ bond -45 from Mg ; N
+R4: ring5 pointing up put N at 3 double 1,5 with .V3 at N
+ bond left from R4.V5 ; H3C
+ bond up from R4.V1 ; CH
+ double bond right length .1 from CH ; CH2
+ double bond 150 length .3 from R1.V3
+ bond to R2.V4
+R5: ring5 pointing 72 with .V5 at R2.V2
+ double bond 135 from R5.V2 ; O
+ bond down from R5.V3 ; C
+ double bond left length .1 from C ; O
+ bond down from C ; O
+ CH3 left of O
+ double bond -25 from R5.V4
+ bond down from R3.V1 ; CH2
+ CH2 left of CH2
+ bond left ; C
+ double bond -45 ; O
+ bond -135 from C ; C20H39O
+ bond left from R3.V2 ; H3C
+ double bond -150 length .3 from R4.V4
+ bond to R3.V3
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/chAe_chair.chem b/contrib/chem/examples/122/chAe_chair.chem
new file mode 100644
index 0000000..27b046a
--- /dev/null
+++ b/contrib/chem/examples/122/chAe_chair.chem
@@ -0,0 +1,49 @@
+chAe_chair.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+pic define chair { [
+ V1: bond 120 length .25
+ V2: bond right length .35
+ V3: bond 150 length .35
+ V4: bond -60 length .25
+ V5: bond left length .35
+ V6: bond to V1.start
+pic ] }
+R1: chair
+R2: chair with .V1 at R1.V4.start
+bond 60 from R2.V4.start ; CH3
+bond down from R2.V4.start ; OH
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/chAf_arrow.chem b/contrib/chem/examples/122/chAf_arrow.chem
new file mode 100644
index 0000000..f135ecb
--- /dev/null
+++ b/contrib/chem/examples/122/chAf_arrow.chem
@@ -0,0 +1,68 @@
+chAf_arrow.chem:
+.br
+.EQ
+delim $$
+.EN
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+ bond length .1 ; BP
+ bond up length .5
+ bond right
+ bond down length .5 from BP
+ bond right
+ bond right from BP ; C
+ double bond up ; O
+ bond right from C
+ benzene pointing right
+ bond right ; C
+ double bond up from C ; O
+ bond right from C ; O
+ bond right ; CH2
+# this is the statement to make the arrow
+ line <- from CH2.s down
+ move down .1 ; "0.085"
+ CH2CH2CH2 right of CH2
+ bond right ; O
+ bond right length .1 ; BP
+ bond up length .5 from BP
+ bond left
+ bond right length .1 from BP
+ bond down length .5 from BP ; BP
+ bond left
+ "$n$" with .w at BP.se
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
+.EQ
+delim off
+.EN
diff --git a/contrib/chem/examples/122/chAg_circle.chem b/contrib/chem/examples/122/chAg_circle.chem
new file mode 100644
index 0000000..576c926
--- /dev/null
+++ b/contrib/chem/examples/122/chAg_circle.chem
@@ -0,0 +1,54 @@
+chAg_circle.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+bond 120 ; C
+bond 60 ; C
+bond up ; Cl
+double bond 120 from C ; C
+bond 60 ; C
+bond 120 ; C
+bond 60 ; C
+bond up ; Cl
+double bond 120 from C ; C
+circle at C rad .08
+bond 60 from C ; C
+bond 120 ; C
+bond 60 ; C
+double bond 120 ; C
+bond down ; Cl
+bond 60 from C ; C
+bond 120
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/chAh_brackets.chem b/contrib/chem/examples/122/chAh_brackets.chem
new file mode 100644
index 0000000..7605a38
--- /dev/null
+++ b/contrib/chem/examples/122/chAh_brackets.chem
@@ -0,0 +1,60 @@
+chAh_brackets.chem:
+.br
+.EQ
+delim $$
+.EN
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+[
+ bond right ; CH2
+ bond 120 ; (CH2)
+ "$nothing sub n$"
+ bond 60 ; .CH2
+]
+# now put the arrow in
+ move right .3
+ arrow .5
+ move right .3
+# begin second structure
+[
+ bond right ; CH.
+ bond 120 ; (CH2)
+ "$nothing sub n$"
+ bond 60 ; CH3
+]
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
+.EQ
+delim $$
+.EN
diff --git a/contrib/chem/examples/122/chAi_poly_vinyl_chloride.chem b/contrib/chem/examples/122/chAi_poly_vinyl_chloride.chem
new file mode 100644
index 0000000..e4539bb
--- /dev/null
+++ b/contrib/chem/examples/122/chAi_poly_vinyl_chloride.chem
@@ -0,0 +1,141 @@
+chAi_poly_vinyl_chloride.chem:
+.br
+.ps -2
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+db = .12
+cwid = .095
+A: [
+ bond dotted
+ bond right ; CH
+ bond down ; Cl
+ bond right from CH ; CH2
+ bond ; CH
+ bond down ; Cl
+ bond right from CH ; CH2
+ bond ; C.
+ bond down ; Cl
+ bond right from C ; CH2
+ bond ; CH2
+ bond down ; Cl
+]
+" (6.13a)" ljust at A.e
+arrow down .5 from A.s
+[
+ CH2
+ double bond right ; CHCl
+] with .w at last arrow.c
+B: [
+ bond dotted
+ bond right ; CH
+ bond down ; Cl
+ bond right from CH ; CH2
+ bond ; CH
+ bond down ; Cl
+ bond right from CH ; CH2
+ bond ; C
+ bond up ; Cl
+ bond down from C ; CH2
+ bond ; CH2Cl
+ bond right from C ; CH2
+ bond ; CH
+ bond down ; Cl
+ bond right from CH
+ bond dotted
+] with .n at end of last arrow
+" (6.13b)" ljust at B.e
+C: [
+ bond dotted
+ bond right ; CH
+ bond down ; Cl
+ bond right from CH ; CH2
+ bond ; C.
+ bond down ; Cl
+ bond right from C ; CH2
+ bond ; CH
+ bond down ; Cl
+ bond right from CH ; CH2
+ bond ; CH2
+ bond down ; Cl
+] with .n at B.s - (0,.5)
+" (6.14a)" ljust at C.e
+arrow down .3 from C.s
+[
+ CH2
+ double bond right
+ CHCl
+] with .w at last arrow.s
+arrow down .3 from last arrow.s
+
+D: [
+ bond dotted
+ bond right ; CH
+ bond down ; Cl
+ bond right from CH ; CH2
+ bond ; C
+ bond up ; Cl
+ bond down from C ; CH2
+ bond ; CHCl
+ bond ; CH2
+ bond ; CH2Cl
+ bond right from C ; CH2
+ bond ; CH
+ bond down ; Cl
+ bond right from CH ; CH2
+ bond ; CH
+ bond down ; Cl
+ bond right from CH
+ bond dotted
+] with .n at last arrow.s
+" (6.14b)" ljust at D.e
+E: [
+ bond dotted
+ bond ; CH
+ bond down ; Cl
+ bond right from CH ; CH2
+ bond ; CH
+ bond down ; Cl
+ bond right from CH ; CH2
+ bond ; CH
+ bond down ; Cl
+ bond right from CH ; CH2
+ bond ; CH
+ bond down ; Cl
+] with .e at B.w - (.5,0)
+
+arrow from E.ne to A.sw
+arrow from E.se to C.nw
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
+.ps +2
diff --git a/contrib/chem/examples/122/chBa_jump.chem b/contrib/chem/examples/122/chBa_jump.chem
new file mode 100644
index 0000000..cd40a3a
--- /dev/null
+++ b/contrib/chem/examples/122/chBa_jump.chem
@@ -0,0 +1,41 @@
+chBa_jump.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+SiO2 # name = SiO2
+move right 1
+CH3CH2NH2.HCl # name = CH3CH2NH2HCl
+
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/chBb_bonds.chem b/contrib/chem/examples/122/chBb_bonds.chem
new file mode 100644
index 0000000..bc29895
--- /dev/null
+++ b/contrib/chem/examples/122/chBb_bonds.chem
@@ -0,0 +1,42 @@
+chBb_bonds.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+C
+frontbond -170 from C ; H
+backbond 10 from C ; CO2H
+bond left length .15 from C ; H2N
+bond right from C ; CH3
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/122/chBc_rings.chem b/contrib/chem/examples/122/chBc_rings.chem
new file mode 100644
index 0000000..950cd0b
--- /dev/null
+++ b/contrib/chem/examples/122/chBc_rings.chem
@@ -0,0 +1,43 @@
+chBc_rings.chem:
+.br
+.cstart
+
+# Example file for 'chem':
+
+# This originates from Computing Science Technical Report No. 122
+# CHEM - A Program for Typesetting Chemical Diagrams: User Manual
+# by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan
+# <http://cm.bell-labs.com/cm/cs/cstr/122.ps.gz>.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+R1: benzene
+ bond -120 from R1.V5 ; CH3O
+R2: ring4 pointing 45 with .V4 at R1.V2
+R3: aromatic ring6 put N at 4 put S at 2 at R2 + (.75,0)
+R4: ring5 pointing left at R3 + (.75,0)
+ label R4
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/README.txt b/contrib/chem/examples/README.txt
new file mode 100644
index 0000000..6786705
--- /dev/null
+++ b/contrib/chem/examples/README.txt
@@ -0,0 +1,47 @@
+This directory contains examples for the 'chem' language.
+
+You can view the graphical display of the examples by calling
+
+ @g@chem <file> | groff -p ...
+
+On the displays, you can see rings consisting of several lines and
+bonds (lines). All points on rings and bonds that do not have a
+notation mean a C atom (carbon) filled with H atoms (hydrogen) such
+that the valence of 4 is satisfied.
+
+For example, suppose you have just a single line without any
+characters. That means a bond. It has two points, one at each end of
+the line. So each of these points stands for a C atom, the bond
+itself connects these 2 C atoms. To fulfill the valence of 4, each
+points has to carry additionally 3 H atoms. So the single empty bond
+stands for CH3-CH3, though this combination doesn't make much sense
+chemically.
+
+
+####### License
+
+Copyright (C) 2006-2020 Free Software Foundation, Inc.
+Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+
+This file is part of 'chem', 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 3 of the License, 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.
+
+The GPL2 license text is available in the internet at
+<http://www.gnu.org/licenses/gpl-2.0.html>.
+
+
+##### Editor settings
+Local Variables:
+fill-column: 72
+mode: text
+End:
+vim: set textwidth=72:
diff --git a/contrib/chem/examples/atp.chem b/contrib/chem/examples/atp.chem
new file mode 100644
index 0000000..738c4da
--- /dev/null
+++ b/contrib/chem/examples/atp.chem
@@ -0,0 +1,58 @@
+atp.chem:
+.cstart
+
+# Example file for 'chem':
+# ATP or C10_H16_N5_O13_P3 or
+# [[[5-(6-aminopurin-9-yl)-3,4-dihydroxy-oxolan-2-yl]methoxy-hydroxy-
+# phosphoryl]oxy-hydroxy-phosphoryl]oxyphosphonic acid
+
+# Found at http://www.chemindustry.com/apps/chemicals.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+R1: ring5 pointing left double 1,2 3,4 put N at 2 put N at 5
+B: benzene put N at 2 with .V6 at R1.V3 with .V5 at R1.V4
+ bond up ; NH2
+ backbond 170 length .7 from R1.V5
+R2: ring5 pointing down with .V2 put O at 1
+ bond down at R2.V2 ; H
+ bond down length .1 at R2.V3 ; H
+ bond up length .1 at R2.V3 ; OH
+ bond down length .1 at R2.V4 ; H
+ bond up length .1 at R2.V4 ; OH
+ frontbond 70 at R2.V5
+ bond 110 ; O
+ bond right ; P
+ doublebond up ; O
+ bond down from P ; OH
+ bond right from P ; O
+ bond right ; P
+ doublebond up ; O
+ bond down from P ; OH
+ bond right from P ; O
+ bond right ; P
+ doublebond up ; O
+ bond down from P ; OH
+ bond right from P ; OH
+
+# Local Variables:
+# fill-column: 72
+# mode: Nroff
+# End:
+# vim: set textwidth=72:
+.cend
diff --git a/contrib/chem/examples/cholesterin.chem b/contrib/chem/examples/cholesterin.chem
new file mode 100644
index 0000000..12ac076
--- /dev/null
+++ b/contrib/chem/examples/cholesterin.chem
@@ -0,0 +1,47 @@
+cholesterin.chem:
+.cstart
+
+# Example file for 'chem':
+# Cholesterin or C27_H46O or
+# 10,13-dimethyl-17-(6-methylheptan-2-yl)-2,3,4,5,6,9,11,12,14,15,16,17-
+# dodecahydro-1H-cyclopenta[a]phenanthren-3-ol
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+R1: ring6
+ bond -120 ; HO
+R2: ring6 with .V5 at R1.V3 with .V6 at R1.V2 double 4,5
+ bond up at R2.V6
+R3: ring6 with .V5 at R2.V1 with .V4 at R2.V2
+R4: flatring5 pointing up with .V4 at R3.V3 with .V5 at R3.V2
+ bond up at R4.V5
+ bond up at R4.V1
+B1: bond -60
+ bond 60 at B1.start
+ bond 120
+ bond 60
+ bond 120
+B2: bond 60
+ bond down at B2.start
+
+# Local Variables:
+# fill-column: 72
+# mode: Nroff
+# End:
+# vim: set textwidth=72:
+.cend
diff --git a/contrib/chem/examples/ethamivan.chem b/contrib/chem/examples/ethamivan.chem
new file mode 100644
index 0000000..a0a8aa2
--- /dev/null
+++ b/contrib/chem/examples/ethamivan.chem
@@ -0,0 +1,43 @@
+ethamivan.chem:
+.cstart
+
+# Example file for 'chem':
+# Ethamivan or Analepticon or C12_H17_N_O3 or
+# N,N-diethyl-4-hydroxy-3-methoxy-benzamide
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+R: ring pointing left double 2,3 4,5 6,1
+ bond left from R.V1 ; O
+ bond left ; H
+ bond -150 from R.V6 ; O
+ bond left
+ bond 60 from R.V4
+B1: double bond up ; O
+ bond 120 from B1.start ; N
+ bond 45
+ bond right
+ bond 135 from N
+ bond right
+
+# Local Variables:
+# fill-column: 72
+# mode: Nroff
+# End:
+# vim: set textwidth=72:
+.cend
diff --git a/contrib/chem/examples/lsd.chem b/contrib/chem/examples/lsd.chem
new file mode 100644
index 0000000..4879ea8
--- /dev/null
+++ b/contrib/chem/examples/lsd.chem
@@ -0,0 +1,46 @@
+lsd.chem:
+.cstart
+
+# Example file for 'chem':
+# LSD or Lysergic acid dethylamide or C20_H25_N3O or
+# 9,10-Didehydro-N,N-diethyl-6-methyl-ergoline-8-beta-carboxamide
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+F: flatring5 pointing left put N at 5 double 3,4
+ H below F.N
+B: benzene pointing right with .V1 at F.V2
+R1: ring pointing right with .V4 at B.V6
+ front bond right from R1.V6 ; H
+R2: ring pointing right with .V2 at R1.V6 put N at 1 double 3,4
+ bond right from R2.N
+ back bond -60 from R2.V5 ; H
+ bond up from R2.V5
+B1: double bond up ; O
+ bond right from B1.start ; N
+ bond 45
+ bond right
+ bond 135 from N
+ bond right
+
+# Local Variables:
+# fill-column: 72
+# mode: Nroff
+# End:
+# vim: set textwidth=72:
+.cend
diff --git a/contrib/chem/examples/morphine.chem b/contrib/chem/examples/morphine.chem
new file mode 100644
index 0000000..5c236ca
--- /dev/null
+++ b/contrib/chem/examples/morphine.chem
@@ -0,0 +1,51 @@
+morphine.chem:
+.cstart
+
+# Example file for 'chem':
+# Morphine or C23_H31_N3O or
+# N,N-diethyl-N'-(2-methoxyacridin-9-yl)-pentane-1,4-diamine
+
+# Found at http://www.chemindustry.com/apps/chemicals.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+R1: benzene
+R2: benzene with .V6 at R1.V2 with .V5 at R1.V3 put N at 4
+R3: benzene with .V6 at R2.V2 with .V5 at R2.V3
+ bond 60 at R3.V2 ; O
+ bond 120
+ bond up at R2.V1 ; N
+ bond 60 ; H
+ bond -60 at N
+B1: backbond -120
+ bond up at B1.start
+ bond -60
+ bond up
+ bond -60 ; N
+ bond up
+ bond -60
+ bond -120 at N
+ bond -60
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/penicillin.chem b/contrib/chem/examples/penicillin.chem
new file mode 100644
index 0000000..ef522bc
--- /dev/null
+++ b/contrib/chem/examples/penicillin.chem
@@ -0,0 +1,52 @@
+penicillin.chem:
+.cstart
+
+# Example file for 'chem':
+# Penicillin or C16_H18_N2_O4_S or
+# 3,3-dimethyl-6-oxo-7-(2-phenylacetyl)amino-2-thia-5-
+# azabicyclo[3.2.0]heptane-4-carboxylic acid
+
+# Found at http://www.chemindustry.com/apps/chemicals.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+R1: flatring5 pointing up put S at 1 put N at 4
+ bond 45 at R1.V2
+ bond 135 at R1.V2
+ bond 120 at R1.V3
+D1: doublebond 45 ; O
+ bond 135 at D1.start ; OH
+ bond left at R1.N
+ doublebond -135 ; O
+ bond left at R1.V5
+B1: bond down length .3
+ bond -60 at B1.start ; N
+ bond up ; H
+ bond -120 at N
+D2: doublebond down ; O
+ bond -60 at D2.start
+ bond -120
+ benzene
+
+# Local Variables:
+# mode: Nroff
+# End:
+.cend
diff --git a/contrib/chem/examples/reserpine.chem b/contrib/chem/examples/reserpine.chem
new file mode 100644
index 0000000..d1b4046
--- /dev/null
+++ b/contrib/chem/examples/reserpine.chem
@@ -0,0 +1,63 @@
+reserpine.chem:
+.PS
+begin chem
+
+# Example file for 'chem':
+# Reserpine or C33H40N2O9
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+
+# This file is part of 'chem', 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 (GPL) version 2 as
+# published by the Free Software Foundation.
+
+# '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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+R1: benzene pointing up
+ bond -120 from R1.V5 ; O
+ bond left
+R2: flatring5 pointing down double 4,5 with .V2 at R1.V3 with .V3 at R1.V2 put N at 1
+ H below R2.V1
+R3: ring put N at 3 with .V5 at R2.V5
+R4: ring put N at 1 with .V1 at R3.V3
+ back bond -120 from R4.V4 ; H
+ back bond 60 from R4.V3 ; H
+R5: ring with .V1 at R4.V3
+ bond -120
+D1: double bond down ; O
+ bond left from D1.start ; O
+ bond left
+ back bond 60 from R5.V3 ; H
+ back bond down from R5.V4 ; O
+ bond down from O
+ bond 120 from R5.V3 ; O
+ bond 50 from O
+D2: double bond up ; O
+ bond right length .1 from D2.start
+B: benzene pointing right
+ bond 45 from B.V6 ; O
+ bond right
+ bond right from B.V1 ; O
+ bond right
+ bond 135 from B.V2 ; O
+ bond right
+
+# Local Variables:
+# fill-column: 72
+# mode: Nroff
+# End:
+# vim: set textwidth=72:
+end
+.PE
diff --git a/contrib/eqn2graph/eqn2graph.1.man b/contrib/eqn2graph/eqn2graph.1.man
new file mode 100644
index 0000000..c059190
--- /dev/null
+++ b/contrib/eqn2graph/eqn2graph.1.man
@@ -0,0 +1,188 @@
+.TH eqn2graph @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+eqn2graph \- convert an
+.I eqn \" generic
+equation into a cropped image
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" This documentation is released to the public domain.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_eqn2graph_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY eqn2graph
+.RB [ \-format\~\c
+.IR output-format ]
+.RI [ convert-argument \~.\|.\|.]
+.YS
+.
+.
+.SY eqn2graph
+.B \-\-help
+.YS
+.
+.
+.SY eqn2graph
+.B \-v
+.
+.SY eqn2graph
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I eqn2graph
+reads a one-line
+.MR @g@eqn @MAN1EXT@
+equation from the standard input and writes an image file,
+by default in Portable Network Graphics (PNG) format,
+to the standard output.
+.
+.
+.PP
+The input EQN code should
+.I not
+be preceded by the
+.B .EQ
+macro that normally precedes it within
+.MR groff @MAN1EXT@
+macros;
+nor do you need to have dollar-sign or other delimiters around the
+equation.
+.
+.
+.\" FIXME: How old? This text hasn't been touched since 2008 at latest.
+.\" Older versions of
+.\" .I \%convert
+.\" will produce a black-on-white graphic; newer ones may produce a
+.\" black-on-transparent graphic.
+.
+.PP
+Arguments not recognized by
+.I eqn2graph
+are passed to the ImageMagick or GraphicsMagick program
+.MR convert 1 .
+.
+.
+By specifying these, you can give your image a border,
+.\" Transparent backgrounds are the default in 2018.
+.\" force the background transparent,
+set the image's pixel density,
+or perform other useful transformations.
+.
+.
+.PP
+The output image is clipped using
+.IR \%convert 's
+.B \-trim
+option to the smallest possible bounding box that contains all the black
+pixels.
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.BI \-format\~ output-format
+Write the image in
+.IR output-format ,
+which must be understood by
+.IR \%convert ;
+the default is PNG.
+.
+.
+.\" ====================================================================
+.SH Environment
+.\" ====================================================================
+.
+.TP
+.I \%GROFF_TMPDIR
+.TQ
+.I \%TMPDIR
+.TQ
+.I TMP
+.TQ
+.I TEMP
+These environment variables are searched in the given order to determine
+the directory where temporary files will be created.
+.
+If none are set,
+.I /tmp
+is used.
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+.I eqn2graph
+was written by
+.MT esr@\:thyrsus\:.com
+Eric S.\& Raymond
+.ME ,
+based on a recipe for
+.MR pic2graph @MAN1EXT@ ,
+by W.\& Richard Stevens.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.MR pic2graph @MAN1EXT@ ,
+.MR grap2graph @MAN1EXT@ ,
+.MR @g@eqn @MAN1EXT@ ,
+.MR groff @MAN1EXT@ ,
+.MR convert 1
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_eqn2graph_1_man_C]
+.do rr *groff_eqn2graph_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/eqn2graph/eqn2graph.am b/contrib/eqn2graph/eqn2graph.am
new file mode 100644
index 0000000..2870d13
--- /dev/null
+++ b/contrib/eqn2graph/eqn2graph.am
@@ -0,0 +1,40 @@
+# Copyright (C) 2002-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# eqn2graph.am
+#
+
+eqn2graph_srcdir = $(top_srcdir)/contrib/eqn2graph
+bin_SCRIPTS += eqn2graph
+man1_MANS += contrib/eqn2graph/eqn2graph.1
+EXTRA_DIST += \
+ contrib/eqn2graph/eqn2graph.1.man \
+ contrib/eqn2graph/eqn2graph.sh
+
+eqn2graph: $(top_srcdir)/contrib/eqn2graph/eqn2graph.sh
+ $(AM_V_GEN)sed -e "s|[@]g[@]|$(g)|g" \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e $(SH_SCRIPT_SED_CMD) $(eqn2graph_srcdir)/eqn2graph.sh \
+ >$@ \
+ && chmod +x $@
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/contrib/eqn2graph/eqn2graph.sh b/contrib/eqn2graph/eqn2graph.sh
new file mode 100644
index 0000000..3e9c374
--- /dev/null
+++ b/contrib/eqn2graph/eqn2graph.sh
@@ -0,0 +1,108 @@
+#! /bin/sh
+#
+# eqn2graph -- compile EQN equation descriptions to bitmap images
+#
+# by Eric S. Raymond <esr@thyrsus.com>, 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 eqn markup should *not* be wrapped in .EQ/.EN, this script will do that.
+# 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. Many options of convert(1) are potentially relevant, (especially
+# -density, -interlace, -transparency, -border, and -comment).
+#
+# Thus, we pass everything except -format to convert(1).
+#
+convert_opts=""
+convert_trim_arg="-trim"
+format="png"
+
+while [ "$1" ]
+do
+ case $1 in
+ -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 -n "$d" && break
+done
+
+if ! test -d "$d"
+then
+ echo "$0: error: temporary directory \"$d\" does not exist or is" \
+ "not a directory" >&2
+ exit 1
+fi
+
+if ! tmp=`(umask 077 && mktemp -d -q "$d/eqn2graph-XXXXXX") 2> /dev/null`
+then
+ # mktemp failed--not installed or is a version that doesn't support those
+ # flags? Fall back to older method which uses more predictable naming.
+ #
+ # $RANDOM is a Bashism. The fallback of $PPID is not good pseudorandomness,
+ # but is supported by the stripped-down dash shell, for instance.
+ tmp="$d/eqn2graph$$-${RANDOM:-$PPID}"
+ (umask 077 && mkdir "$tmp") 2> /dev/null
+fi
+
+if ! test -d "$tmp"
+then
+ echo "$0: error: cannot create temporary directory \"$tmp\"" >&2
+ exit 1
+fi
+
+# See if the installed version of convert(1) is new enough to support the -trim
+# option. Versions that didn't were described as "old" as early as 2008.
+is_convert_recent=`convert -help | grep -e -trim`
+if test -z "$is_convert_recent"
+then
+ echo "$0: warning: falling back to old '-crop 0x0' trim method" >&2
+ convert_trim_arg="-crop 0x0"
+fi
+
+trap 'exit_status=$?; rm -rf "$tmp" && exit $exit_status' EXIT INT TERM
+
+# 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 -Tps -P-pletter > "$tmp"/eqn2graph.ps \
+ && convert $convert_trim_arg $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..bc968bb
--- /dev/null
+++ b/contrib/gdiffmk/ChangeLog
@@ -0,0 +1,212 @@
+2023-02-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Revise test regime. Reduce amount of indirection required to
+ run a test, and directly use the same script for standalone and
+ Automake-integrated testing.
+
+ * tests/gdiffmk_tests.sh: Delete.
+ * tests/runtests.sh: Revise to search for test artifact input
+ and output directories (source vs. build). Drop argument
+ processing, converting two modes ("run" and "clean") into one
+ {run, with cleaning afterward}. Also ensure we use the build
+ directory to construct "tmp_file.7". Update authorship credit
+ so that Mike Bianchi isn't asked to support it.
+
+ * tests/baseline.7: Update expected test output.
+
+ * gdiffmk.am (TESTS): Run "runtests.sh" instead of
+ "gdiffmk_tests.sh".
+ (clean-local, clean_gdiffmk_check): Drop targets now that the
+ test script cleans up after itself.
+
+2023-02-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * tests/runtests.sh: Refactor file handling. Use narrower globs
+ to match the file names actually used; they are suffixed with a
+ dot and a number, not a number alone. Honor $TMPDIR when
+ creating the even-more-temporary file. Revise trap setup so
+ that the trap handler cannot be interrupted if it is already
+ running. Call the handler, then commit suicide with SIGINT.
+ Use symbolic names for signals, not numbers. Call new CleanUp
+ function before exiting normally.
+ (CleanUp): Pull temporary file clean-up logic into new function.
+ Also delete the even-more-temporary file used in test 1.
+
+2022-10-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * gdiffmk.sh: Drop "GNU" from version information, since this
+ program resides in groff's "contrib" directory.
+
+2018-02-28 Werner LEMBERG <wl@gnu.org>
+
+ * gdiffmk.am (gdiffmk): Use $(AM_V_GEN) to silence file generation.
+
+2015-08-22 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gdiffmk.1.man: Rename `gdiffmk.man'.
+
+ * gdiffmk.am: Include renaming.
+
+2015-08-05 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gdiffmk.am: Add `Last update'. Setup Emacs mode.
+
+2015-04-13 Mike Bianchi <MBianchi@Foveal.com>
+ More fixes to Savannah bug #44768.
+
+ * gdiffmk.sh:
+ replace
+ for OPTION with while [ $# -gt 0 ]
+
+ test -e ... with test -f
+
+ use ${DIFFCMD} for the last diff
+ add
+ -s SEDCMD option
+ OPTION="$1"
+
+ many other cosmetic changes documented in the bug Discussion.
+ especially:
+ capitalize variables e.g. CMD=`basename $0`
+
+ fix make check tests within gdiffmk
+ * tests/gdiffmk_tests.sh
+ add set -e
+ fails if ${abs_top_builddir} not set or incorrect
+
+ * tests/runtests.sh
+ add test 6a
+ # Different values for addmark, changemark, deletemark
+ # Alternate format of -a -c and -d flag arguments
+
+ add test 9a
+ # Test -D and -M options
+ # Alternate format of -M argument.
+
+ add printout of failure count
+ add exit with failure exit_code if any test fails
+
+2015-04-10 Werner LEMBERG <wl@gnu.org>
+
+ Fix Savannah bug #44768.
+
+ * gdiffmk.sh: Remove bash's $(...) with classic `...`.
+ Patch by Peter Bray.
+
+2015-04-03 Werner LEMBERG <wl@gnu.org
+
+ * gdiffmk.man: Make it work in compatibility mode.
+
+2014-09-03 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * all `gdiffmk' source files: Add and improve the copying
+ information. Remove last update. Add Emacs setting if necessary.
+
+2014-03-30 Steffen Nurpmeso <sdaoden@yandex.com>
+
+ * Makefile.sub: Put straight error-prevention prefixes for `rm'.
+
+2009-09-22 Colin Watson <cjwatson@debian.org>
+
+ * gdiffmk.sh: Don't use bash specific syntax.
+
+2008-01-04 Werner LEMBERG <wl@gnu.org>
+
+ * gdiffmk.man: Replace .URL with .UR/.UE.
+ Replace .MTO with .MT/.ME.
+ Don't include www.tmac.
+
+2006-09-13 Werner LEMBERG <wl@gnu.org>
+
+ * tests/test_baseline*: Renamed to...
+ * tests/baseline.*: This.
+
+ * tests/runtests.in: Updated.
+
+2006-02-26 Claudio Fontana <claudio@gnu.org>
+
+ * Makefile.sub: Add DESTDIR to install and uninstall targets
+ to support staged installations.
+
+2005-05-16 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * gdiffmk.sh: Add space in shebang, conforming
+ to portability recommendation in autoconf docs.
+ * tests/runtests.in: Likewise.
+
+2005-01-16 Mike Bianchi <MBianchi@Foveal.com>
+
+ * gdiffmk.sh (Usage): Fix typos.
+ <top>: Allow `-M<arg1> <arg2>' also.
+
+ * gdiffmk.man: Updated.
+
+2005-01-13 Mike Bianchi <MBianchi@Foveal.com>
+
+ * 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 <MBianchi@Foveal.com>
+
+ * tests/runtests.in: Fix typo (s/$(srcdir)/${srcdir}/).
+
+2004-12-15 Werner LEMBERG <wl@gnu.org>
+
+ 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 <wl@gnu.org>
+
+ * 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 <MBianchi@Foveal.com>
+
+ * tests/*: New files for testing gdiffmk.
+
+ * README, gdiffmk.man, gdiffmk.sh: Updated.
+ Minor fixes.
+
+2004-12-13 Mike Bianchi <MBianchi@Foveal.com>
+
+ 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 <MBianchi@Foveal.com>
+
+ * README: New file.
+
+2004-12-11 Mike Bianchi <MBianchi@Foveal.com>
+
+ First import of gdiffmk files.
+
+Copyright 2004-2020 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+Local Variables:
+fill-column: 72
+mode: change-log
+version-control: never
+End:
+vim:set autoindent textwidth=72:
diff --git a/contrib/gdiffmk/README b/contrib/gdiffmk/README
new file mode 100644
index 0000000..d2214dd
--- /dev/null
+++ b/contrib/gdiffmk/README
@@ -0,0 +1,53 @@
+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-2020 Free Software Foundation, Inc.
+Written by Mike Bianchi <MBianchi@Foveal.com <mailto:MBianchi@Foveal.com>>
+
+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 3 of the License, 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.
+
+##### Editor settings
+Local Variables:
+fill-column: 72
+mode: text
+End:
+vim: set textwidth=72:
diff --git a/contrib/gdiffmk/gdiffmk.1.man b/contrib/gdiffmk/gdiffmk.1.man
new file mode 100644
index 0000000..36f30b7
--- /dev/null
+++ b/contrib/gdiffmk/gdiffmk.1.man
@@ -0,0 +1,304 @@
+.TH gdiffmk @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+gdiffmk \- mark differences between
+.IR groff / nroff / troff
+files
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2004-2020 Free Software Foundation, Inc.
+.\"
+.\" This file is part of gdiffmk, which is part of groff, the GNU roff
+.\" type-setting system.
+.\"
+.\" 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 3 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, see
+.\" <http://www.gnu.org/licenses/>.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_gdiffmk_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY gdiffmk
+.RB [ \-a\~\c
+.IR add-mark ]
+.RB [ \-c\~\c
+.IR change-mark ]
+.RB [ \-d\~\c
+.IR delete-mark ]
+.RB [ \-x\~\c
+.IR diff-command ]
+.RB [ \-D
+.RB [ \-B ]
+.RB [ \-M
+.IR "mark1 mark2" ]]
+.RB [ \-\- ]
+.I file1
+.I file2
+.RI [ output ]
+.YS
+.
+.
+.SY gdiffmk
+.B \-\-help
+.YS
+.
+.
+.SY gdiffmk
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I gdiffmk
+compares two
+.MR roff @MAN7EXT@
+documents,
+.I file1
+and
+.IR file2 ,
+and creates a
+.I roff
+document consisting of
+.I file2
+with added margin character
+.RB ( .mc )
+requests indicating output lines that differ from
+.I file1.
+.
+If the
+.I file1
+or
+.I file2
+argument is
+.RB \[lq] \- \[rq],
+.I gdiffmk
+reads the standard input stream for that input.
+.
+If the
+.I output
+operand is present,
+.I gdiffmk
+writes output to a file of that name.
+.
+If it is
+.RB \[lq] \- \[rq]
+or absent,
+.I gdiffmk
+writes output to the standard output stream.
+.
+.RB \[lq] \- \[rq]
+cannot be both an input and output operand.
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message
+and
+.B \-\-version
+shows version information;
+both exit afterward.
+.
+.
+.TP
+.BI \-a\~ add-mark
+Use
+.I add-mark
+for source lines not in
+.I file1
+but present in
+.IR file2 .
+.
+Default:
+.RB \[lq] + \[rq].
+.
+.
+.TP
+.B \-B
+By default,
+the deleted texts marked by the
+.B \-D
+option end with an added
+.I roff
+break request,
+.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\~ change-mark
+Use
+.I change-mark
+for changed source lines.
+.
+Default:
+.RB \[lq] | \[rq].
+.
+.
+.TP
+.BI \-d\~ delete-mark
+Use the
+.I delete-mark
+for deleted source lines.
+.
+Default:
+.RB \[lq] * \[rq].
+.
+.TP
+.B \-D
+Show the deleted portions from changed and deleted text.
+.
+.
+.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 .
+.
+Default delimiting marks:
+.RB \[lq] [[ "\[rq] .\|.\|.\& \[lq]" ]] \[rq].
+.
+.
+.TP
+.BI \-x\~ diff-command
+Use the
+.I diff-command
+command to perform the comparison of
+.I file1
+and
+.IR file2 .
+.
+In particular,
+.I diff-command
+should accept the GNU
+.MR diff 1
+.B \-D
+option.
+.
+Default:
+.BR diff .
+.
+.
+.TP
+.B \-\-
+Treat all subsequent arguments as file names,
+even if they begin with
+.RB \[lq] \- \[rq].
+.
+.
+.\" ====================================================================
+.SH Bugs
+.\" ====================================================================
+.
+The output is not necessarily compatible with all macro packages
+and all preprocessors.
+.
+A workaround that often overcomes preprocessor problems is to run
+.I gdiffmk
+on the output of all the preprocessors instead of the input source.
+.
+.
+.LP
+.I gdiffmk
+relies on the
+.B \-D
+option of GNU
+.I diff
+to make a merged \[lq]#ifdef\[rq] output format.
+.
+Busybox
+.I diff
+is known to not support it.
+.
+Also see the
+.BI \-x\~ diff-command
+option.
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+.I gdiffmk
+was written by
+.MT MBianchi@\:Foveal\:.com
+Mike Bianchi
+.ME ,
+now retired.
+.
+It is maintained by the
+.I groff
+developers.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.MR groff @MAN1EXT@ ,
+.MR nroff @MAN1EXT@ ,
+.MR gtroff @MAN1EXT@ ,
+.MR roff @MAN7EXT@ ,
+.MR diff @MAN1EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_gdiffmk_1_man_C]
+.do rr *groff_gdiffmk_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/gdiffmk/gdiffmk.am b/contrib/gdiffmk/gdiffmk.am
new file mode 100644
index 0000000..46f224b
--- /dev/null
+++ b/contrib/gdiffmk/gdiffmk.am
@@ -0,0 +1,59 @@
+# Automake rules for 'gdiffmk' (integration into the groff source tree)
+#
+# Copyright (C) 2004-2020 Free Software Foundation, Inc.
+# Written by Mike Bianchi <MBianchi@Foveal.com <mailto:MBianchi@Foveal.com>>
+# Automake migration by Bertrand Garrigues
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+########################################################################
+gdiffmk_srcdir = $(top_srcdir)/contrib/gdiffmk
+bin_SCRIPTS += gdiffmk
+TESTS += contrib/gdiffmk/tests/runtests.sh
+man1_MANS += contrib/gdiffmk/gdiffmk.1
+EXTRA_DIST += \
+ contrib/gdiffmk/gdiffmk.1.man \
+ contrib/gdiffmk/ChangeLog \
+ contrib/gdiffmk/README \
+ contrib/gdiffmk/gdiffmk.sh \
+ contrib/gdiffmk/tests/runtests.sh \
+ contrib/gdiffmk/tests/baseline \
+ contrib/gdiffmk/tests/baseline.6 \
+ contrib/gdiffmk/tests/baseline.6a \
+ contrib/gdiffmk/tests/baseline.7 \
+ contrib/gdiffmk/tests/baseline.8 \
+ contrib/gdiffmk/tests/baseline.9 \
+ contrib/gdiffmk/tests/baseline.9a \
+ contrib/gdiffmk/tests/baseline.10 \
+ contrib/gdiffmk/tests/file1 \
+ contrib/gdiffmk/tests/file2
+
+gdiffmk: $(gdiffmk_srcdir)/gdiffmk.sh
+ $(AM_V_GEN)sed -e "s|[@]BINDIR[@]|$(bindir)|g" \
+ -e "s|[@]VERSION[@]|$(VERSION)|g" \
+ -e "s|[@]HAVE_TEST_EF_OPTION[@]|$(HAVE_TEST_EF_OPTION)|g" \
+ -e "s|[@]BASH_PROG[@]|$(BASH_PROG)|g" \
+ -e "s|[@]DIFF_PROG[@]|$(DIFF_PROG)|g" \
+ -e $(SH_SCRIPT_SED_CMD) $(gdiffmk_srcdir)/gdiffmk.sh \
+ >$@ \
+ && chmod +x $@
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/contrib/gdiffmk/gdiffmk.sh b/contrib/gdiffmk/gdiffmk.sh
new file mode 100644
index 0000000..2473fb1
--- /dev/null
+++ b/contrib/gdiffmk/gdiffmk.sh
@@ -0,0 +1,367 @@
+#!@BASH_PROG@
+# Copyright (C) 2004-2020 Free Software Foundation, Inc.
+# Written by Mike Bianchi <MBianchi@Foveal.com <mailto:MBianchi@Foveal.com>>
+# Thanks to Peter Bray for debugging.
+
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+# This file is part of GNU gdiffmk.
+
+
+CMD=`basename $0`
+
+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).
+ If the shell's 'test' does not support option -ef, OUTPUT
+ can only be the standard output.
+
+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.
+ -s SEDCMD Use a different sed(1) command;
+ such as GNU sed.
+ --version Print version information on the standard output and exit.
+ --help Print this message on the standard error.
+"
+ exit 255
+}
+
+
+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.
+FileRead () {
+ case "$2" in
+ -)
+ return
+ ;;
+ esac
+
+ if test ! -f "$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.
+FileCreate () {
+ case "$2" in
+ -)
+ return
+ ;;
+ esac
+
+ touch "$2" 2>/dev/null
+ if test $? -ne 0
+ then
+ if test ! -f "$2"
+ then
+ Exit $1 "File '$2' not created; " \
+ "Cannot write directory '`dirname "$2"`'."
+ fi
+ Exit $1 "File '$2' not writeable."
+ fi
+}
+
+WouldClobber () {
+ case "$2" in
+ -)
+ return
+ ;;
+ esac
+
+ # BASH_PROG is set to /bin/sh if bash was not found
+ if test "$HAVE_TEST_EF_OPTION" = "no" -a "$BASH_PROG" = "/bin/sh"
+ then
+ Exit 3 \
+ "Your shell does support test -ef, [OUTPUT] can only be the" \
+ "standard output."
+ else
+ 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
+ fi
+}
+
+ADDMARK='+'
+CHANGEMARK='|'
+DELETEMARK='*'
+MARK1='[['
+MARK2=']]'
+
+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
+}
+
+HAVE_TEST_EF_OPTION=@HAVE_TEST_EF_OPTION@
+BASH_PROG=@BASH_PROG@
+BADOPTION=
+DIFFCMD=@DIFF_PROG@
+SEDCMD=sed
+D_option=
+br=.br
+while [ $# -gt 0 ]
+do
+ OPTION="$1"
+ 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=.
+ ;;
+ -s* )
+ SEDCMD=`RequiresArgument "${OPTION}" "$2"` &&
+ shift
+ ;;
+ -x* )
+ DIFFCMD=`RequiresArgument "${OPTION}" "$2"` &&
+ shift
+ ;;
+ --version)
+ echo "${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. You can also
+install GNU diff as gdiff on your system"
+
+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
+
+${DIFFCMD} -D"${LABEL}" -- "${FILE1}" "${FILE2}" |
+ ${SEDCMD} -n "${SED_SCRIPT}"
+
+# EOF
diff --git a/contrib/gdiffmk/tests/baseline b/contrib/gdiffmk/tests/baseline
new file mode 100644
index 0000000..6b32992
--- /dev/null
+++ b/contrib/gdiffmk/tests/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/baseline.10 b/contrib/gdiffmk/tests/baseline.10
new file mode 100644
index 0000000..b523f45
--- /dev/null
+++ b/contrib/gdiffmk/tests/baseline.10
@@ -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/baseline.6 b/contrib/gdiffmk/tests/baseline.6
new file mode 100644
index 0000000..3156961
--- /dev/null
+++ b/contrib/gdiffmk/tests/baseline.6
@@ -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/baseline.6a b/contrib/gdiffmk/tests/baseline.6a
new file mode 100644
index 0000000..3156961
--- /dev/null
+++ b/contrib/gdiffmk/tests/baseline.6a
@@ -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/baseline.7 b/contrib/gdiffmk/tests/baseline.7
new file mode 100644
index 0000000..4a83af6
--- /dev/null
+++ b/contrib/gdiffmk/tests/baseline.7
@@ -0,0 +1,2 @@
+gdiffmk: The FILE2 and OUTPUT arguments both point to the same file,
+gdiffmk: './contrib/gdiffmk/tests/tmp_file.7', and it would be overwritten.
diff --git a/contrib/gdiffmk/tests/baseline.8 b/contrib/gdiffmk/tests/baseline.8
new file mode 100644
index 0000000..9846dd5
--- /dev/null
+++ b/contrib/gdiffmk/tests/baseline.8
@@ -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/baseline.9 b/contrib/gdiffmk/tests/baseline.9
new file mode 100644
index 0000000..50fe57d
--- /dev/null
+++ b/contrib/gdiffmk/tests/baseline.9
@@ -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/baseline.9a b/contrib/gdiffmk/tests/baseline.9a
new file mode 100644
index 0000000..50fe57d
--- /dev/null
+++ b/contrib/gdiffmk/tests/baseline.9a
@@ -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/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.sh b/contrib/gdiffmk/tests/runtests.sh
new file mode 100755
index 0000000..51cf855
--- /dev/null
+++ b/contrib/gdiffmk/tests/runtests.sh
@@ -0,0 +1,187 @@
+#! /bin/sh
+#
+# A very simple function test for gdiffmk.sh.
+#
+# Copyright (C) 2004-2020, 2023 Free Software Foundation, Inc.
+# Written by Mike Bianchi <MBianchi@Foveal.com>.
+# Subsequent modifications by G. Branden Robinson.
+
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+# This file is part of GNU gdiffmk.
+
+# abs_top_out_dir is set by AM_TESTS_ENVIRONMENT (defined in
+# Makefile.am) when running "make check".
+
+gdiffmk=${abs_top_out_dir:-.}/gdiffmk
+
+# Locate directory containing our test artifacts.
+in_dir=
+
+for srcroot in . .. ../..
+do
+ # Look for a source file characteristic of the groff source tree.
+ if ! [ -f "$srcroot"/ChangeLog.115 ]
+ then
+ continue
+ fi
+
+ d=$srcroot/contrib/gdiffmk/tests
+ if [ -d "$d" ]
+ then
+ in_dir=$d
+ break
+ fi
+done
+
+# If we can't find it, we can't test.
+if [ -z "$in_dir" ]
+then
+ echo "$0: cannot locate test artifact input directory" >&2
+ exit 77 # skip
+fi
+
+# Locate directory where we'll put the test output.
+out_dir=
+
+for buildroot in . .. ../..
+do
+ d=$buildroot/contrib/gdiffmk/tests
+ if [ -d "$d" ]
+ then
+ out_dir=$d
+ break
+ fi
+done
+
+# If we can't find it, we can't test.
+if [ -z "$out_dir" ]
+then
+ echo "$0: cannot locate test artifact output directory" >&2
+ exit 77 # skip
+fi
+
+exit_code=0 # Success
+failure_count=0
+
+TestResult () {
+ if cmp -s $1 $2
+ then
+ echo $2 PASSED
+ else
+ echo ''
+ echo $2 TEST FAILED
+ diff $1 $2
+ echo ''
+ exit_code=1 # Failure
+ failure_count=`expr ${failure_count} + 1`
+ fi
+}
+
+CleanUp () {
+ rm -f ${out_dir}/result.* ${out_dir}/tmp_file.* ${tmpfile}
+}
+
+tmpfile=${TMPDIR:-/tmp}/$$
+trap 'trap "" HUP INT QUIT TERM; CleanUp; kill -s INT $$' \
+ HUP INT QUIT TERM
+
+# Run tests.
+
+# 3 file arguments
+ResultFile=${out_dir}/result.1
+${gdiffmk} ${in_dir}/file1 ${in_dir}/file2 ${ResultFile} 2>${tmpfile}
+cat ${tmpfile} >>${ResultFile}
+TestResult ${in_dir}/baseline ${ResultFile}
+
+# OUTPUT to stdout by default
+ResultFile=${out_dir}/result.2
+${gdiffmk} ${in_dir}/file1 ${in_dir}/file2 >${ResultFile} 2>&1
+TestResult ${in_dir}/baseline ${ResultFile}
+
+# OUTPUT to stdout via - argument
+ResultFile=${out_dir}/result.3
+${gdiffmk} ${in_dir}/file1 ${in_dir}/file2 - >${ResultFile} 2>&1
+TestResult ${in_dir}/baseline ${ResultFile}
+
+# FILE1 from standard input via - argument
+ResultFile=${out_dir}/result.4
+${gdiffmk} - ${in_dir}/file2 <${in_dir}/file1 >${ResultFile} 2>&1
+TestResult ${in_dir}/baseline ${ResultFile}
+
+
+# FILE2 from standard input via - argument
+ResultFile=${out_dir}/result.5
+${gdiffmk} ${in_dir}/file1 - <${in_dir}/file2 >${ResultFile} 2>&1
+TestResult ${in_dir}/baseline ${ResultFile}
+
+
+# Different values for addmark, changemark, deletemark
+ResultFile=${out_dir}/result.6
+${gdiffmk} -aA -cC -dD ${in_dir}/file1 ${in_dir}/file2 >${ResultFile} 2>&1
+TestResult ${in_dir}/baseline.6 ${ResultFile}
+
+
+# Different values for addmark, changemark, deletemark
+# Alternate format of -a -c and -d flag arguments
+ResultFile=${out_dir}/result.6a
+${gdiffmk} -a A -c C -d D ${in_dir}/file1 ${in_dir}/file2 >${ResultFile} 2>&1
+TestResult ${in_dir}/baseline.6a ${ResultFile}
+
+
+# Test for accidental file overwrite.
+ResultFile=${out_dir}/result.7
+TempFile=${out_dir}/tmp_file.7
+cp ${in_dir}/file2 "$TempFile"
+${gdiffmk} -aA -dD -cC ${in_dir}/file1 "$TempFile" "$TempFile" \
+ >${ResultFile} 2>&1
+TestResult ${in_dir}/baseline.7 ${ResultFile}
+
+
+# Test -D option
+ResultFile=${out_dir}/result.8
+${gdiffmk} -D ${in_dir}/file1 ${in_dir}/file2 >${ResultFile} 2>&1
+TestResult ${in_dir}/baseline.8 ${ResultFile}
+
+
+# Test -D and -M options
+ResultFile=${out_dir}/result.9
+${gdiffmk} -D -M '<<<<' '>>>>' \
+ ${in_dir}/file1 ${in_dir}/file2 >${ResultFile} 2>&1
+TestResult ${in_dir}/baseline.9 ${ResultFile}
+
+
+# Test -D and -M options
+# Alternate format of -M argument.
+ResultFile=${out_dir}/result.9a
+${gdiffmk} -D -M'<<<<' '>>>>' \
+ ${in_dir}/file1 ${in_dir}/file2 >${ResultFile} 2>&1
+TestResult ${in_dir}/baseline.9a ${ResultFile}
+
+
+# Test -D and -B options
+ResultFile=${out_dir}/result.10
+${gdiffmk} -D -B ${in_dir}/file1 ${in_dir}/file2 >${ResultFile} 2>&1
+TestResult ${in_dir}/baseline.10 ${ResultFile}
+
+
+echo failure_count ${failure_count}
+
+# You can comment out the following line to examine failing cases.
+CleanUp
+
+exit ${exit_code}
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/contrib/glilypond/ChangeLog b/contrib/glilypond/ChangeLog
new file mode 100644
index 0000000..c218610
--- /dev/null
+++ b/contrib/glilypond/ChangeLog
@@ -0,0 +1,290 @@
+2022-10-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * glilypond.pl (version): Report version information in format
+ recommended by GNU coding standards. Bump micro version number
+ to reflect this and the restructuring immediately previous.
+
+2022-10-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Make glilypond script stand alone.
+
+ * args.pl:
+ * oop_fh.pl
+ * subs.pl: Delete, moving their content into...
+ * glilypond.pl: ...here. Also bump overall license to GPLv3
+ from GPLv2 because all of the deleted files were GPLv3.
+ * glilypond.am (dist_glilypond_DATA): Delete.
+
+2022-05-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * glilypond.am (glilypond): Spell dependency on
+ `$(SH_DEPS_SED_SCRIPT)` using that macro expansion instead of a
+ literal file name. See groff's doc/automake.mom.
+
+2021-01-06 Colin Watson <cjwatson@debian.org>
+
+ * glilypond.pl: Avoid Perl's unsafe "<>" operator.
+
+ The "<>" operator is implemented using the two-argument form of
+ "open", which interprets magic such as pipe characters, allowing
+ execution of arbitrary commands which is unlikely to be
+ expected. Perl >= 5.22 has a "<<>>" operator which avoids this,
+ but also forbids the use of "-" to mean the standard input,
+ which is a facility that the affected groff programs document.
+
+ ARGV::readonly would probably also fix this, but I fundamentally
+ dislike the approach of escaping data in preparation for a
+ language facility to unescape it, especially when the required
+ escaping is as non-obvious as it is here. (For the same reason,
+ I prefer to use subprocess invocation facilities that allow
+ passing the argument list as a list rather than as a string to
+ be interpreted by the shell.) So I've abandoned this dubious
+ convenience and changed the affected programs to iterate over
+ command-line arguments manually using the three-argument form of
+ open.
+
+ glilypond doesn't need the initial unshift since that's already
+ handled in args.pl.
+
+ Fixes <https://savannah.gnu.org/bugs/?55557>.
+
+2020-04-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * glilypond.1.man: Delete references to groffer.
+
+2018-02-28 Werner LEMBERG <wl@gnu.org>
+
+ * glilypond.am (glilypond): Use $(AM_V_GEN) to silence file generation.
+
+2017-10-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * args.pl: Fix grammar in usage message.
+
+ When used attributively, e.g. as an adjectival phrase,
+ "command-line" should be hyphenated.
+
+2015-09-10 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * glilypond.pl, args.pl, subs.pl: New default `eps_func' as `pdf'.
+
+2015-09-10 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * glilypond.1.man: New default `pdf2eps'. Several fixes.
+
+ * subs.pl: Replace `.PSPIC' by `$P_PIC'. Set new default sub on
+ top.
+
+2015-08-22 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * glilypond.1.man: Rename `glilypond.man'.
+
+ * glilypond.am: Include renaming.
+
+2015-08-05 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * glilypond.am: Add `Last update'. Setup Emacs mode.
+
+2015-04-03 Werner LEMBERG <wl@gnu.org>
+
+ * glilypond.man: Make it work in compatibility mode.
+ (EL): Fix typo.
+
+2015-03-20 Ralph Corderoy <ralph@inputplus.co.uk>
+
+ * glilypond.pl: Minor syntax fixes.
+
+2015-03-20 Werner LEMBERG <wl@gnu.org>
+
+ * glilypond.pl <read files or stdin>: Fix typo.
+
+ Problem reported by Grégoire Babey <gibux@gmx.ch>.
+
+2014-09-03 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * glilypond.pl: New version 1.3.1
+
+ * all `glilypond' files: Copying and Emacs setting.
+
+2014-07-06 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * glilypond.pl: New version 1.3
+
+ * glilypond.man: Make man-page compatible with doclifter.
+
+2014-07-04 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * glilypond.man: Transform to classical man-page style.
+
+2014-07-03 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * glilypond.man: Improve definitions.
+
+2014-03-30 Steffen Nurpmeso <sdaoden@yandex.com>
+
+ * Makefile.sub: Put straight error-prevention prefixes for `rm'.
+
+2014-03-30 Steffen Nurpmeso <sdaoden@yandex.com>
+
+ * Makefile.sub (uninstall_sub): Typo.
+
+2014-03-11 Ingo Schwarze <schwarze@openbsd.org> (tiny change)
+
+ * Makefile.sub (install_data): POSIX conformance.
+
+ Do not use $< outside inference rules, and even less when there
+ are multiple targets.
+
+2014-02-14 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * examples/example.groff: Add this directory and this file.
+
+2014-01-06 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ Remove archive git@github.com:RUNOFF/groff_lilypond.git
+
+2013-10-30 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * glilypond.man: Correct writing.
+
+2013-05-10 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * glilypond.pl: Correct position information. Add debug code.
+
+ * args.pl, oop_fh.pl, subs.pl: Correct position information.
+
+2013-04-25 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * Makefile.sub: minor corrections.
+
+2013-04-24 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ Public `glilypond' version `v1.1'.
+
+ * args.pl, sub.pl, glilypond.man: Change option `-v' to mean
+ `--verbose' instead of former `--version' such as many GNU
+ programs do. Correct sub `&usage()' and man-page.
+
+ * args.pl, glilypond.pl, oop_fh.pl, subs.pl: Remove spaces in
+ ` -> ', some `( ... )', and some `{ ... }' places for better
+ readability of the Perl source code.
+
+2013-04-24 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * args.pl, oop_fh.pl: Remove 1st line calling `perl'.
+
+ * subs.pl: Remove 1st line calling `perl'. Remove sub
+ `&perl_version()'. Adjust sub `&usage()'.
+
+ * glilypond.pl: Keep 1st line, which will be reset by running
+ `make'. Remove all parts of Perl testing.
+
+ * perl_test.pl: Remove this file.
+
+ * README.txt: Add information about needed Perl version.
+
+ * Makefile.sub: Corrections for removing Perl test. Use `$<'.
+
+2013-04-24 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * Makefile.sub: Remove Perl test.
+
+2013-04-12 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * glilypond.pl: Fix END for early exit of `--version'.
+
+2013-04-12 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * subs.pl: Replace `state' by global variable. So the Perl
+ version can be older.
+
+ * perl_test.pl: Replace the Perl version by `v5.6', analogously to
+ `groffer'.
+
+2013-04-11 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * Makefile.sub: Corrections for Emacs.
+
+2013-04-11 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * old groff_lilypond: There is now a free `git' package containing
+ all old versions of the former name `groff_lilypond v0.*'. They
+ work with `lilypond' parts in `roff' files, but were not
+ installed. This package can be got at:
+
+ $ git clone git@github.com:RUNOFF/groff_lilypond.git
+
+ The new versions `glilypond 1.*' are not included there.
+
+2013-03-29 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ Published version is `v1.0'.
+
+ Run `autoconf' again.
+
+2013-03-29 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * <groff_src_dir>/m4/groff.m4, <groff_src_dir>/configure.ac: Add
+ libdir information for `glilypond'.
+
+ * <groff_src_dir>/Makefile.in: Add
+ `<groff_src_dir>/contrib/glilypond'.
+
+ Run `autoconf'.
+
+ `glilypond' can now be installed to the system.
+
+2013-03-29 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ Rename `groff_lilypond' to `glilypond'. So remove the former
+ source directory `<groff_src_dir>/contrib/lilypond' and newly
+ install `<groff_src_dir>/contrib/glilypond', which now has many
+ files. The new version starts at `v1.0'.
+
+ Version will now be v1.*. All former files of versions v0.*
+ vanished or were renamed. This is not yet an information about
+ publishing.
+
+ * ChangeLog.0x: old `ChangeLog' file for the old `groff_lilypond'
+ versions v0.*. In the future, this file won't be changed any
+ more.
+
+ * ChangeLog: New file. It is this file. It displays the history
+ of `glilypond' versions v1.* or later.
+
+ * glilypond.pl: New main Perl file written from
+ `groff_lilypond.pl' in a totally different way. It is split now
+ into 4 Perl files.
+
+ * args.pl: New Perl file. It handles the command line options for
+ a run of `glilypond.pl'.
+
+ * oop_fh.pl: New Perl file. OOP handling of file handles.
+
+ * perl_test.pl: Test whether the actual Perl program has a
+ suitable versions. For `Makefile.sub' and `glilypond.pl'.
+
+ * subs.pl: New Perl file. Defines the global subs for
+ `glilypond.pl'.
+
+ * Makefile.sub: Newly written `Makefile' for this subdirectory of
+ `groff'. `glilypond' should be able to be installed by `make'
+ with this file.
+
+ * glilypond.man: Newly written man-page for `glilypond'.
+
+ * README.txt: New file about the installation.
+
+########################################################################
+
+Copyright 2013-2020 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+Local Variables:
+fill-column: 72
+mode: change-log
+version-control: never
+End:
+vim:set autoindent textwidth=72:
diff --git a/contrib/glilypond/ChangeLog.0x b/contrib/glilypond/ChangeLog.0x
new file mode 100644
index 0000000..b1dc833
--- /dev/null
+++ b/contrib/glilypond/ChangeLog.0x
@@ -0,0 +1,104 @@
+2013-04-11 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * old groff_lilypond: There is now a free `git' package containing
+ all old versions of the former name `groff_lilypond v0.*'. They
+ work with `lilypond' parts in `roff' files, but were not
+ installed. This package can be got at:
+
+ $ git clone git@github.com:RUNOFF/groff_lilypond.git
+
+ The new versions `glilypond 1.*' are not included there.
+
+2013-03-28 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ Rename `groff_lilypond' to `glilypond' for *.pl and *.man files.
+ Split the single Perl script into several minor *.pl files.
+ Construct `Makefile.sub' in order to have installed `glilypond'.
+ Public versions will be v1.x.
+ Rename `ChangeLog' to `ChangeLog.0x' for the old versions of
+ `groff_lilypond' v0.*. New `ChangeLog' for the new versions
+ `glilypond' 1.*.
+
+ * groff_lilypond.pl: Vanished. Renamed to `glilypond.pl'.
+ * groff_lilypond.man: Vanished. Renamed to `glilypond.man'.
+ * ChangeLog.0x: Moved from `ChangeLog'. It is this file. It
+ describes only the old `groff_lilypond' versions v0.*. See file
+ `ChangeLog' for the files of the new `glilypond' v1.*.
+
+2013-03-11 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * groff_lilypond.pl: Publishing groff_lilypond version v0.6.
+ New options: -e|--eps_dir, -l|--license, -k|--keep_files,
+ -p|--prefix=..., -t|--temp_dir=...
+ Install --eps_dir as directory for the useful EPS files.
+ * groff_lilypond.man: Include the new options. Add section
+ SEE ALSO.
+
+2013-03-03 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * groff_lilypond.pl: New code with Perl references.
+ Publishing groff_lilypond version v0.5.
+ New options: --usage, -V|--Verbose|--verbose, --file_prefix=...,
+ -o|--output=..., --temp_dir=...
+ Perl >=5.10.0 needed.
+ * groff_lilypond.man: Include the new options.
+
+2013-02-23 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * groff_lilypond_pl: Remove `.lilypond include' for lilypond
+ regions. Within `groff' mode. it is still allowed.
+ * groff_lilypond.man: Update `.lilypond include'.
+
+2013-02-23 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ New version v0.4 of groff_lilypond.
+ * groff_lilypond_pl: Major rewrite.
+ New options: --file_prefix, --temp_dir, and --license.
+ * groff_lilypond.man: documents the new features.
+
+2013-02-16 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * groff_lilypond.man: Minor corrections.
+
+2013-02-12 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * groff_lilypond.pl: Add deletion of unused temporary files.
+
+2013-02-12 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * contrib/lilypond: Version v0.3 for groff_lilypond
+ * groff_lilypond.pl: A new request was added for importing
+ lilypond files:
+ .lilypond include ...
+ The argument handling was improved.
+
+2013-02-11 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * contrib/lilypond: Version v0.2 for groff_lilypond
+ * groff_lilypond.pl: Now there are 2 modes for generationg the EPS
+ files: --ly2eps (the default) and --pdf2eps (that's the old mode
+ from version v0.1 with pdf to ps to eps). With ly2eps mode,
+ lilypond generates the EPS files itself, for each page one EPS
+ file.
+ * groff_lilypond.man: Corresponding updated man-page
+
+2013-02-10 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * contrib/lilypond: New files for adding lilypond parts into groff
+ files. These files will not yet be installed.
+ * groff_lilypond.pl: Program written in Perl, version v0.1
+ * groff_lilypond.man: Corresponding man-page
+
+Copyright 2013-2020 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+Local Variables:
+coding: utf-8
+fill-column: 72
+mode: change-log
+version-control: never
+End:
+vim:set autoindent textwidth=72:
diff --git a/contrib/glilypond/README.txt b/contrib/glilypond/README.txt
new file mode 100644
index 0000000..f47e824
--- /dev/null
+++ b/contrib/glilypond/README.txt
@@ -0,0 +1,43 @@
+ Copyright (C) 2013-2020 Free Software Foundation, Inc.
+
+ Written by Bernd Warken <groff-bernd.warken-72@web.de>
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+ This file is part of 'glilypond', which is part of 'groff'.
+
+
+########################################################################
+
+In order to run 'glilypond', your system must have installed Perl of at
+least version 'v5.6'.
+
+
+########################################################################
+
+In order to have this program installed by 'make', the creation of a
+libdir (library directory) must be programmed in some system files.
+The following actions must be taken:
+
+1) <groff_src_dir>/m4/groff.m4:
+Add 'AC_DEFUN([GROFF_GROFFERDIR_DEFAULT])'.
+
+2) <groff_src_dir>/configure.ac:
+Add 'GROFF_GROFFERDIR_DEFAULT'.
+
+3) <groff_src_dir>/Makefile.in:
+Add several information of 'glilypond_dir'
+
+With that, the program 'autoconf' can be run in order to update the
+configure files and Makefile's.
+
+Now '$glilypond_dir' can be used as libdir.
+
+##### Editor settings
+Local Variables:
+fill-column: 72
+mode: text
+End:
+vim: set textwidth=72:
diff --git a/contrib/glilypond/examples/example.groff b/contrib/glilypond/examples/example.groff
new file mode 100644
index 0000000..856474e
--- /dev/null
+++ b/contrib/glilypond/examples/example.groff
@@ -0,0 +1,46 @@
+.\" --------------------------------------------------------------------
+.\" Legalese
+.\" --------------------------------------------------------------------
+.
+.ig
+glilypond - integrate 'lilypond' parts into 'groff' files
+
+This file was written by Bernd Warken <groff\-bernd.warken\-72@web.de>.
+.
+Copyright (C) 2013-2020 Free Software Foundation, Inc.
+
+This file is part of glilypond, which is part of GNU groff, a free
+software project.
+
+You can redistribute it and/or modify it under the terms of the GNU
+General Public License version 2 as published by the Free Software
+Foundation.
+
+The license text is available in the internet at
+.UR http://\%www.gnu.org/\%licenses/\%gpl-2.0.html
+.UE .
+..
+.
+.\" --------------------------------------------------------------------
+.\" Groff Part
+.\" --------------------------------------------------------------------
+.
+before
+.lilypond start
+\version "2.14.2"
+\relative c' {
+ \key c \minor
+ c d e f
+ g(
+ <ees c'>)
+ <d f gis b>-.
+ <ees g bes>-.
+}
+\paper {
+ oddHeaderMarkup = #f
+ evenHeaderMarkup = #f
+ oddFooterMarkup = #f
+ evenFooterMarkup = #f
+}
+.lilypond end
+after
diff --git a/contrib/glilypond/glilypond.1.man b/contrib/glilypond/glilypond.1.man
new file mode 100644
index 0000000..a81174e
--- /dev/null
+++ b/contrib/glilypond/glilypond.1.man
@@ -0,0 +1,881 @@
+.TH glilypond @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+glilypond \- embed LilyPond musical notation in
+.I groff
+documents
+.
+.
+.\" TODO: This page needs a thorough edit by a fluent English speaker.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2013-2020 Free Software Foundation, Inc.
+.\"
+.\" This file is part of glilypond, which is part of GNU groff, a free
+.\" software project.
+.\"
+.\" You can redistribute it and/or modify it under the terms of the GNU
+.\" General Public License version 2 (GPL2) as published by the Free
+.\" Software Foundation.
+.\"
+.\" The license text is available in the internet at
+.\" <http://www.gnu.org/licenses/gpl-2.0.html>.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_glilypond_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY glilypond
+.RB [ \-k ]
+.RB [{ \-\-ly2eps | \-\-pdf2eps }]
+.RB [ \-e
+.IR directory ]
+.RB [ \-o
+.IR output-file ]
+.RB [ \-p
+.IR filename-prefix ]
+.RB [ \-t
+.IR tdir ]
+.RB [{ \-v | \-V }]
+.RB [ \-\- ]
+.RI [ file\~ .\|.\|.]
+.
+.
+.SY glilypond
+.RB [{ \-\-ly2eps | \-\-pdf2eps }]
+.RB [ \-\-eps_dir
+.IR directory ]
+.RB [ \-\-keep_all ]
+.RB [ \-\-output
+.IR output-file ]
+.RB [ \-\-prefix
+.IR filename-prefix ]
+.RB [ \-\-temp_dir
+.IR tdir ]
+.RB [ \-\-verbose ]
+.RB [ \-\- ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY glilypond
+.B \-?
+.SY glilypond
+.B \-h
+.SY glilypond
+.B \-\-help
+.SY glilypond
+.B \-\-usage
+.YS
+.
+.
+.SY glilypond
+.B \-l
+.SY glilypond
+.B \-\-license
+.YS
+.
+.
+.SY glilypond
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I glilypond
+is a
+.MR groff @MAN7EXT@
+preprocessor that enables the embedding of LilyPond music scores in
+.I groff
+documents.
+.\".
+.\".B .PDFPIC
+.\"is available, but does not yet work with lilypond.
+.
+If no operands are given,
+or if
+.I file
+is
+.RB \[lq] \- \[rq],
+.I glilypond
+reads the standard input stream.
+.
+A double-dash argument
+.RB (\[lq] \-\- \[rq])
+causes all subsequent arguments to be interpreted as
+.I file
+operands,
+even if their names start with a dash.
+.
+.
+.\" ====================================================================
+.SH Usage
+.\" ====================================================================
+.
+At present,
+.I glilypond
+works with the
+.I groff
+.BR ps ,
+.BR dvi ,
+.BR html ,
+and
+.B xhtml
+devices.
+.
+The
+.B lbp
+and
+.B lj4
+devices are untested.
+.
+Unfortunately,
+the
+.B pdf
+device does not yet work.
+.
+.
+.\" ====================================================================
+.SH "Option overview"
+.\" ====================================================================
+.
+.
+.TP
+.BR \-? | \-h | \-\-help | \-\-usage
+Display usage information and exit.
+.
+.TP
+.B \-\-version
+Display version information and exit.
+.
+.TP
+.BR \-l | \-\-license
+Display copyright license information and exit.
+.
+.
+.\" ====================================================================
+.SS "Options for building EPS files"
+.\" ====================================================================
+.
+.TP
+.B \-\-ly2eps
+Direct
+.MR lilypond 1
+to create Encapsulated PostScript (EPS) files.
+.
+This is the default.
+.
+.
+.TP
+.B \-\-pdf2eps
+The program
+.I glilypond
+generates a PDF file using
+.IR lilypond .
+.
+Then the EPS file is generated by
+.I pdf2ps
+and
+.IR ps2eps .
+.
+.
+.\" ====================================================================
+.SS "Directories and files"
+.\" ====================================================================
+.
+.TP
+.BR \-e | \-\-eps_dir "\fI directory_name\fP"
+Normally all
+.I EPS
+files are sent to the temporary directory.
+.
+With this option,
+you can generate your own directory,
+in which all useful
+.I EPS
+files are send.
+.
+So at last, the temporary directory can be removed.
+.
+.
+.TP
+.BR \-p | \-\-prefix "\fI begin_of_name\fP"
+Normally all temporary files get names that start with the
+.BI ly .\|.\|.\&
+prefix.
+.
+With this option, you can freely change this prefix.
+.
+.
+.TP
+.BR \-k | \-\-keep_all
+Normally all temporary files without the
+.I eps
+files are deleted.
+.
+With this option, all generated files either by the
+.I lilypond
+program or other format transposers are kept.
+.
+.
+.TP
+.BR \-t | \-\-temp_dir "\fI dir\fP"
+With this option, you call a directory that is the base for the
+temporary directory.
+.
+This directory name is used as is without any extensions.
+.
+If this directory does not exist it is be created.
+.
+The temporary directory is created by Perl's security operations
+directly under this directory.
+.
+In this temporary directory, the temporary files are stored.
+.
+.
+.\" ====================================================================
+.SS Output
+.\" ====================================================================
+.
+.TP
+.BR \-o | \-\-output "\fI file_name\fP"
+Normally all
+.I groff
+output of this program is sent to
+.BR STDOUT .
+.
+With this option, that can be changed, such that the output is stored
+into a file named in the option argument
+.IR file_name .
+.
+.
+.TP
+.BR \-v | \-V | \-\-verbose
+A lot more of information is sent to STDERR.
+.
+.
+.\" ====================================================================
+.SS "Short option collections"
+.\" ====================================================================
+.
+The argument handling of options
+.
+.
+.P
+.I "Short options"
+are arguments that start with a single dash
+.BR \- .
+.
+Such an argument can consist of arbitrary many options without option
+argument, composed as a collection of option characters following the
+single dash.
+.
+.
+.P
+Such a collection can be terminated by an option character that
+expects an option argument.
+.
+If this option character is not the last character of the argument,
+the following final part of the argument is the option argument.
+.
+If it is the last character of the argument, the next argument is
+taken as the option argument.
+.
+.
+.P
+This is the standard for
+.I POSIX
+and
+.I GNU
+option management.
+.
+.
+.P
+For example,
+.
+.TP
+.BI \-kVe " some_dir"
+is a collection of the short options
+.B \-k
+and
+.B \-V
+without option argument, followed by the short option
+.B \-e
+with option argument that is the following part of the argument
+.IR some_dir .
+.
+So this argument could also be written as several arguments
+.B \-k \-V \-e
+.IR some_dir .
+.
+.
+.\" ====================================================================
+.SS "Handling of long options"
+.\" ====================================================================
+.
+Arguments that start with a double dash
+.B \-\-
+are so-called
+.I "long options" R .
+.
+Each double dash argument can only have a single long option.
+.
+.
+.P
+.I "Long options"
+have or have not an option argument.
+.
+An option argument can be the next argument or can be appended with an
+equal sign
+.B =
+to the same argument as the long option.
+.
+.
+.TP
+.B \-\-help
+is a long option without an option argument.
+.
+.TP
+.BI \-\-eps_dir " some_dir"
+.TQ
+.BI \-\-eps_dir= some_dir
+is the long option
+.B \-\-eps_dir
+with the option argument
+.IR some_dir .
+.
+.
+.P
+Moreover the program allows abbreviations of long options, as much as
+possible.
+.
+.
+.P
+The
+.I "long option"
+.B \-\-keep_all
+can be abbreviated from
+.B \-\-keep_al
+up to
+.B \-\-k
+because the program does not have another
+.I "long option"
+whose name starts with the character
+.BR k .
+.
+.
+.P
+On the other hand, the option
+.B \-\-version
+cannot be abbreviated further than
+.B \-\-vers
+because there is also the
+.I long option
+.B \-\-verbose
+that can be abbreviated up to
+.BR \-\-verb .
+.
+.
+.P
+An option argument can also be appended to an abbreviation.
+.
+So is
+.BI \-\-e= some_dir
+the same as
+.B \-\-eps_dir
+.IR some_dir .
+.
+.
+.P
+Moreover the program allows an arbitrary usage of upper and lower case
+in the option name.
+.
+This is
+.I Perl
+style.
+.
+.
+.P
+For example, the
+.I "long option"
+.B \-\-keep_all
+can as well be written as
+.B \-\-Keep_All
+or even as an abbreviation like
+.BR \-\-KeE .
+.
+.
+.br
+.ne 6v
+.\" ====================================================================
+.SH "LilyPond regions in \f[I]roff\f[] input"
+.\" ====================================================================
+.
+.\" ====================================================================
+.SS "Integrated LilyPond code"
+.\" ====================================================================
+.
+A
+.I lilypond
+part within a structure written in the
+.I groff
+language is the whole part between the marks
+.RS
+.EX
+.B ".lilypond start"
+.EE
+.RE
+and
+.RS
+.EX
+.B ".lilypond end"
+.EE
+.RE
+.
+A
+.I groff
+input can have several of these
+.I lilypond
+parts.
+.
+.
+.P
+When processing such a
+.I lilypond
+part between
+.B ".lilypond start"
+and
+.B ".lilypond end"
+we say that the
+.B glilypond
+program is in
+.IR "lilypond mode" .
+.
+.
+.P
+These
+.I lilypond
+parts are sent into temporary
+.I lilypond
+files with the file name extension
+.BR .ly .
+.
+These files are transformed later on into
+.I EPS
+files.
+.
+.
+.\" ====================================================================
+.SS "Inclusion of \f[I].ly\f[] files"
+.\" ====================================================================
+.
+An additional command line for file inclusion of
+.I lilypond
+files is given by
+.EX
+.BI ".lilypond include" " file_name"
+.EE
+in
+.I groff
+input.
+.
+For each such
+.I include
+command, one file of
+.I lilypond
+code can be included into the
+.I groff
+code.
+.
+Arbitrarily many of these commands can be included in the
+.I groff
+input.
+.
+.
+.P
+These include commands can only be used outside the
+.I lilypond
+parts.
+.
+Within the
+.IR "lilypond mode" ,
+this inclusion is not possible.
+.
+So
+.B ".lilypond include"
+may not be used in
+.IR "lilypond mode" ,
+i.e.\& between
+.B ".lilypond start"
+and
+.BR ".lilypond end" .
+.
+.
+These included
+.IR ly -files
+are also transformed into
+.I EPS
+files.
+.
+.
+.\" ====================================================================
+.SH "Generated files"
+.\" ====================================================================
+.
+By the transformation process of
+.I lilypond
+parts into
+.I EPS
+files, there are many files generated.
+.
+By default, these files are regarded as temporary files and as such
+stored in a temporary directory.
+.
+.
+.P
+This process can be changed by command-line options.
+.
+.
+.\" ====================================================================
+.SS "Command-line options for directories"
+.\" ====================================================================
+.
+The temporary directory for this program is either created
+automatically or can be named by the option
+.BR \-t | \-\-temp_dir
+.IR dir .
+.
+.
+.P
+Moreover, the
+.I EPS
+files that are later on referred by
+.B .PSPIC
+command in the final
+.I groff
+output can be stored in a different directory that can be set by the
+command-line option
+.BR \-e | \-\-eps_dir
+.IR directory_name .
+.
+With this option, the temporary directory can be removed completely at
+the end of the program.
+.
+.
+.P
+The beginning of the names of the temporary files can be set by the
+command-line options
+.B \-p
+or
+.BR \-\-prefix .
+.
+.
+.P
+All of the temporary files except the
+.I EPS
+files are deleted finally.
+.
+This can be changed by setting the command-line options
+.B \-k
+or
+.BR \-\-keep_files .
+.
+With this, all temporary files and directories are kept, not deleted.
+.
+.
+.P
+These
+.I EPS
+files are stored in a temporary or
+.I EPS
+directory.
+.
+But they cannot be deleted by the transformation process because they
+are needed for the display which can take a long time.
+.
+.
+.\" ====================================================================
+.SH "Transformation processes for generating EPS files"
+.\" ====================================================================
+.
+.\" ====================================================================
+.SS "Mode pdf2eps"
+.\" ====================================================================
+.
+This mode is the actual default and can also be chosen by the option
+.BR \-\-pdf2eps .
+.
+.
+.P
+In this mode, the
+.B .ly
+files are transformed by the
+.MR lilypond 1
+program into
+.I PDF
+files, using
+.RS
+.EX
+.BI "lilypond \-\-pdf \-\-output=" file-name
+.EE
+.RE
+for each
+.B .ly
+file.
+.
+The
+.I file-name
+must be provided without the extension
+.BR .pdf .
+.
+By this process, a file
+.IB file-name .pdf
+is generated.
+.
+.
+.P
+The next step is to transform these
+.I PDF
+files into a
+.I PS
+file.
+.
+This is done by the
+.MR pdf2ps 1
+program using
+.RS
+.EX
+$\~\c
+.B pdf2ps\~\c
+.IB file-name .pdf\~\c
+.IB file-name .pds
+.EE
+.RE
+.
+.
+The next step creates an
+.I EPS
+file from the
+.I PS
+file.
+.
+This is done by the
+.MR ps2eps 1
+program using
+.RS
+.EX
+.RB "$ " "ps2eps " \fIfile-name\fP ".ps"
+.EE
+.RE
+.
+.
+.P
+By that, a file
+.IB file-name .eps
+is created for each
+.I lilypond
+part in the
+.I groff
+file or standard input.
+.
+.
+.P
+The last step to be done is replacing all
+.I lilypond
+parts by the
+.I groff
+command
+.RS
+.EX
+.BI ".PSPIC " file-name .eps
+.EE
+.RE
+.
+.
+.\" ====================================================================
+.SS "Mode ly2eps"
+.\" ====================================================================
+.
+In earlier time, this mode was the default.
+.
+But now it does not work any more, so accept the new default
+.IR pdf2eps .
+.
+For testing, this mode can also be chosen by the
+.I glilypond
+option
+.BR \-\-ly2eps .
+.
+.
+.P
+In this mode, the
+.B .ly
+files are transformed by the
+.I lilypond
+program into many files of different formats, including
+.I eps
+files, using
+.RS
+.EX
+$\~\c
+.B lilypond \-\-ps \-dbackend=eps \-dgs\-load\-fonts \-\-output=\c
+.I file-name
+.EE
+.RE
+for each
+.B .ly
+file.
+.
+The output
+.I file\-name
+must be provided without an extension, its directory is temporary.
+.
+.
+.P
+There are many
+.I EPS
+files created.
+.
+One having the complete transformed
+.B ly
+file, named
+.IB file\-name .eps \fR.\fP
+.
+.
+.P
+Moreover there are
+.I EPS
+files for each page, named
+.IB file\-name \- digit .eps \fR.\fP
+.
+.
+.P
+The last step to be done is replacing all
+.I lilypond
+parts by the collection of the corresponding
+.I EPS
+page files.
+.
+This is done by
+.I groff
+commands
+.EX
+.BI ".PSPIC " file-name \- digit .eps
+.EE
+.
+.
+.\" ====================================================================
+.SH "Generated \f[I]groff\f[] output"
+.\" ====================================================================
+.
+The new
+.MR groff @MAN7EXT@
+structure generated by
+.I glilypond
+is either
+.
+.TP
+1)
+sent to standard output and can there be saved into a file or piped into
+.MR groff @MAN1EXT@
+or
+.
+.TP
+2)
+stored into a file by given the option
+.BR \-o\ \~| \~\-\-output
+.I file_name
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+.I glilypond
+was written by
+.MT groff\-bernd\:.warken\-72@\:web\:.de
+Bernd Warken
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.TP
+.MR groff @MAN1EXT@
+describes the usage of the
+.I groff
+command and contains pointers to further documentation of the
+.I groff
+system.
+.
+.
+.TP
+.MR groff_tmac @MAN5EXT@
+describes the
+.B .PSPIC
+request.
+.
+.
+.TP
+.MR lilypond 1
+briefly describes the
+.I lilypond
+command and contains pointers to further documentation.
+.
+.
+.TP
+.MR pdf2ps 1
+transforms a
+.I PDF
+file into a
+.I PostScript
+format.
+.
+.
+.TP
+.MR ps2eps 1
+transforms a
+.I PS
+file into an
+.I EPS
+format.
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_glilypond_1_man_C]
+.do rr *groff_glilypond_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/glilypond/glilypond.am b/contrib/glilypond/glilypond.am
new file mode 100644
index 0000000..d18049f
--- /dev/null
+++ b/contrib/glilypond/glilypond.am
@@ -0,0 +1,64 @@
+# Automake rules for 'glilypond'
+
+# Copyright (C) 2013-2020 Free Software Foundation, Inc.
+# Written by Werner Lemberg <wl@gnu.org> and
+# Bernd Warken <groff-bernd.warken-72@web.de>.
+# Automake migration by Bertrand Garrigues
+
+# This file is part of 'glilypond' 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+########################################################################
+glilypond_srcdir = $(top_srcdir)/contrib/glilypond
+bin_SCRIPTS += glilypond
+man1_MANS += contrib/glilypond/glilypond.1
+
+# files going to lib directory '$(glilypond_dir)'
+# TODO glilypond_dir is subsitued by configure.ac, check if this could be removed
+glilyponddir = $(glilypond_dir)
+
+EXTRA_DIST += \
+ contrib/glilypond/ChangeLog \
+ contrib/glilypond/ChangeLog.0x \
+ contrib/glilypond/glilypond.1.man \
+ contrib/glilypond/glilypond.pl \
+ contrib/glilypond/README.txt \
+ contrib/glilypond/examples/example.groff
+
+
+# create perl executable 'glilypond', being stored into 'bindir'
+glilypond: $(glilypond_srcdir)/glilypond.pl $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)$(RM) $@ \
+ && sed -f "$(SH_DEPS_SED_SCRIPT)" \
+ -e "s|[@]g[@]|$(g)|g" \
+ -e "s|[@]BINDIR[@]|$(DESTDIR)$(bindir)|g" \
+ -e "s|[@]glilypond_dir[@]|$(DESTDIR)$(glilypond_dir)|g" \
+ -e "s|[@]VERSION[@]|$(VERSION)|g" \
+ $(glilypond_srcdir)/glilypond.pl \
+ >$@ \
+ && chmod +x $@
+
+uninstall_groffdirs: uninstall-glilypond-hook
+uninstall-glilypond-hook:
+ if test -d $(DESTDIR)$(glilyponddir); then \
+ rmdir $(DESTDIR)$(glilyponddir); \
+ fi
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/contrib/glilypond/glilypond.pl b/contrib/glilypond/glilypond.pl
new file mode 100755
index 0000000..e97ed24
--- /dev/null
+++ b/contrib/glilypond/glilypond.pl
@@ -0,0 +1,1907 @@
+#! /usr/bin/env perl
+
+package main;
+
+########################################################################
+# debugging
+########################################################################
+
+# See 'Mastering Perl', chapter 4.
+
+# use strict;
+# use warnings;
+# use diagnostics;
+
+use Carp;
+$SIG{__DIE__} = sub { &Carp::croak; };
+
+use Data::Dumper;
+
+########################################################################
+# Legalese
+########################################################################
+
+our $Legalese;
+
+{
+ use constant VERSION => '1.3.2'; # version of glilypond
+
+### This constant 'LICENSE' is the license for this file 'GPL' >= 3
+ use constant LICENSE => q*
+glilypond - integrate 'lilypond' into 'groff' files
+
+Copyright (C) 2013-2020 Free Software Foundation, Inc.
+ Written by Bernd Warken <groff-bernd.warken-72@web.de>
+
+This file is part of 'GNU groff'.
+
+ 'GNU 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 3 of the License, or (at your
+option) any later version.
+
+ 'GNU 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 package. If not, see
+<http://www.gnu.org/licenses/>.
+*;
+
+
+ $Legalese =
+ {
+ 'version' => VERSION,
+ 'license' => LICENSE,
+ }
+
+}
+
+##### end legalese
+
+
+########################################################################
+# global variables and BEGIN
+########################################################################
+
+use integer;
+use utf8;
+
+use Cwd qw[];
+use File::Basename qw[];
+use File::Copy qw[];
+use File::HomeDir qw[];
+use File::Spec qw[];
+use File::Path qw[];
+use File::Temp qw[];
+use FindBin qw[];
+use POSIX qw[];
+
+
+BEGIN {
+
+ use constant FALSE => 0;
+ use constant TRUE => 1;
+ use constant EMPTYSTRING => '';
+ use constant EMPTYARRAY => ();
+ use constant EMPTYHASH => ();
+
+ our $Globals =
+ {
+ 'before_make' => FALSE,
+ 'groff_version' => EMPTYSTRING,
+ 'prog' => EMPTYSTRING,
+ };
+
+ {
+ ( my $volume, my $directory, $Globals->{'prog'} ) =
+ File::Spec->splitpath($0);
+ # $Globals->{'prog'} is 'glilypond' when installed,
+ # 'glilypond.pl' when not
+ }
+
+
+ $\ = "\n"; # adds newline at each print
+ $/ = "\n"; # newline separates input
+ $| = 1; # flush after each print or write command
+
+
+ {
+ {
+ # script before run of 'make'
+ my $at = '@';
+ $Globals->{'before_make'} = TRUE if '@VERSION@' eq "${at}VERSION${at}";
+ }
+
+ my $file_test_pl;
+ my $glilypond_libdir;
+
+ if ( $Globals->{'before_make'} ) { # in source, not yet installed
+ my $glilypond_dir = $FindBin::Bin;
+ $glilypond_dir = Cwd::realpath($glilypond_dir);
+ $glilypond_libdir = $glilypond_dir;
+
+ } else { # already installed
+ $Globals->{'groff_version'} = '@VERSION@';
+ $glilypond_libdir = '@glilypond_dir@';
+ }
+
+ unshift(@INC, $glilypond_libdir);
+
+ umask 0077; # octal output: 'printf "%03o", umask;'
+ }
+
+ use integer;
+ use utf8;
+ use feature 'state';
+
+ my $P_PIC;
+ # $P_PIC = '.PDFPIC';
+ $P_PIC = '.PSPIC';
+
+ ######################################################################
+ # subs for using several times
+ ######################################################################
+
+ sub create_ly2eps { # '--ly2eps' default
+ our ( $out, $Read, $Temp );
+
+ my $prefix = $Read->{'file_numbered'}; # w/ dir change to temp dir
+
+ # '$ lilypond --ps -dbackend=eps -dgs-load-fonts \
+ # output=file_without_extension file.ly'
+ # extensions are added automatically
+ my $opts = '--ps -dbackend=eps -dinclude-eps-fonts -dgs-load-fonts'
+ . " --output=$prefix $prefix";
+ &run_lilypond("$opts");
+
+ Cwd::chdir $Temp->{'cwd'} or
+ die "Could not change to former directory '" .
+ $Temp->{'cwd'} . "': $!";
+
+ my $eps_dir = $Temp->{'eps_dir'};
+ my $dir = $Temp->{'temp_dir'};
+ opendir( my $dh, $dir ) or
+ die "could not open temporary directory '$dir': $!";
+
+ my $re = qr<
+ ^
+ $prefix
+ -
+ .*
+ \.eps
+ $
+ >x;
+ my $file;
+ while ( readdir( $dh ) ) {
+ chomp;
+ $file = $_;
+ if ( /$re/ ) {
+ my $file_path = File::Spec->catfile($dir, $file);
+ if ( $eps_dir ) {
+ my $could_copy = FALSE;
+ File::Copy::copy($file_path, $eps_dir)
+ and $could_copy = TRUE;
+ if ( $could_copy ) {
+ unlink $file_path;
+ $file_path = File::Spec->catfile($eps_dir, $_);
+ }
+ }
+ $out->print( $P_PIC . ' ' . $file_path );
+ }
+ } # end while readdir
+ closedir( $dh );
+ } # end sub create_ly2eps()
+
+
+ sub create_pdf2eps { # '--pdf2eps'
+ our ( $v, $stdout, $stderr, $out, $Read, $Temp );
+
+ my $prefix = $Read->{'file_numbered'}; # w/ dir change to temp dir
+
+ &run_lilypond("--pdf --output=$prefix $prefix");
+
+ my $file_pdf = $prefix . '.pdf';
+ my $file_ps = $prefix . '.ps';
+
+ # pdf2ps in temp dir
+ my $temp_file = &next_temp_file;
+ $v->print( "\n##### run of 'pdf2ps'" );
+ # '$ pdf2ps file.pdf file.ps'
+ my $output = `pdf2ps $file_pdf $file_ps 2> $temp_file`;
+ die 'Program pdf2ps does not work.' if ( $? );
+ &shell_handling($output, $temp_file);
+ $v->print( "##### end run of 'pdf2ps'\n" );
+
+ # ps2eps in temp dir
+ $temp_file = &next_temp_file;
+ $v->print( "\n##### run of 'ps2eps'" );
+ # '$ ps2eps file.ps'
+ $output = `ps2eps $file_ps 2> $temp_file`;
+ die 'Program ps2eps does not work.' if ( $? );
+ &shell_handling($output, $temp_file);
+ $v->print( "##### end run of 'ps2eps'\n" );
+
+ # change back to former dir
+ Cwd::chdir $Temp->{'cwd'} or
+ die "Could not change to former directory '" .
+ $Temp->{'cwd'} . "': $!";
+
+ # handling of .eps file
+ my $file_eps = $prefix . '.eps';
+ my $eps_path = File::Spec->catfile($Temp->{'temp_dir'}, $file_eps);
+ if ( $Temp->{'eps_dir'} ) {
+ my $has_copied = FALSE;
+ File::Copy::copy( $eps_path, $Temp->{'eps_dir'} )
+ and $has_copied = TRUE;
+ if ( $has_copied ) {
+ unlink $eps_path;
+ $eps_path = File::Spec->catfile( $Temp->{'eps_dir'}, $file_eps );
+ } else {
+ $stderr->print( "Could not use EPS-directory." );
+ } # end Temp->{'eps_dir'}
+ }
+ # print into groff output
+ $out->print( $P_PIC . ' ' . $eps_path );
+ } # end sub create_pdf2eps()
+
+
+ sub is_subdir { # arg1 is subdir of arg2 (is longer)
+ my ( $dir1, $dir2 ) = @_;
+ $dir1 = &path2abs( $dir1 );;
+ $dir2 = &path2abs( $dir2 );;
+ my @split1 = File::Spec->splitdir($dir1);
+ my @split2 = File::Spec->splitdir($dir2);
+ for ( @split2 ) {
+ next if ( $_ eq shift @split1 );
+ return FALSE;
+ }
+ return TRUE;
+ }
+
+
+ sub license {
+ our ( $Legalese, $stdout );
+ &version;
+ $stdout->print( $Legalese->{'license'} );
+ } # end sub license()
+
+
+ sub make_dir { # make directory or check if it exists
+ our ( $v, $Args );
+
+ my $dir_arg = shift;
+ chomp $dir_arg;
+ $dir_arg =~ s/^\s*(.*)\s*$/$1/;
+
+ unless ( $dir_arg ) {
+ $v->print( "make_dir(): empty argument" );
+ return FALSE;
+ }
+
+ unless ( File::Spec->file_name_is_absolute($dir_arg) ) {
+ my $res = Cwd::realpath($dir_arg);
+ $res = File::Spec->canonpath($dir_arg) unless ( $res );
+ $dir_arg = $res if ( $res );
+ }
+
+ return $dir_arg if ( -d $dir_arg && -w $dir_arg );
+
+
+ # search thru the dir parts
+ my @dir_parts = File::Spec->splitdir($dir_arg);
+ my @dir_grow;
+ my $dir_grow;
+ my $can_create = FALSE; # dir could be created if TRUE
+
+ DIRPARTS: for ( @dir_parts ) {
+ push @dir_grow, $_;
+ next DIRPARTS unless ( $_ ); # empty string for root directory
+
+ # from array to path dir string
+ $dir_grow = File::Spec->catdir(@dir_grow);
+
+ next DIRPARTS if ( -d $dir_grow );
+
+ if ( -e $dir_grow ) { # exists, but not a dir, so must be removed
+ die "Couldn't create dir '$dir_arg', it is blocked by "
+ . "'$dir_grow'." unless ( -w $dir_grow );
+
+ # now it's writable, but not a dir, so it can be removed
+ unlink ( $dir_grow ) or
+ die "Couldn't remove '$dir_grow', " .
+ "so I cannot create dir '$dir_arg': $!";
+ }
+
+ # $dir_grow no longer exists, so the former dir must be writable
+ # in order to create the directory
+ pop @dir_grow;
+ $dir_grow = File::Spec->catdir(@dir_grow);
+
+ die "'$dir_grow' is not writable, " .
+ "so directory '$dir_arg' can't be created."
+ unless ( -w $dir_grow );
+
+ # former directory is writable, so '$dir_arg' can be created
+
+ File::Path::make_path( $dir_arg,
+ {
+ mask => oct('0700'),
+ verbose => $Args->{'verbose'},
+ }
+ ) # 'mkdir -P'
+ or die "Could not create directory '$dir_arg': $!";
+
+ last DIRPARTS;
+ }
+
+ die "'$dir_arg' is not a writable directory"
+ unless ( -d $dir_arg && -w $dir_arg );
+
+ return $dir_arg;
+
+ } # end sub make_dir()
+
+
+ my $number = 0;
+ sub next_temp_file {
+ our ( $Temp, $v, $Args );
+ ++$number;
+ my $temp_basename = $Args->{'prefix'} . '_temp_' . $number;
+ my $temp_file = File::Spec->catfile( $Temp->{'temp_dir'} ,
+ $temp_basename );
+ $v->print( "next temporary file: '$temp_file'" );
+ return $temp_file;
+ } # end sub next_temp_file()
+
+
+ sub path2abs {
+ our ( $Temp, $Args );
+
+ my $path = shift;
+ $path =~ s/
+ ^
+ \s*
+ (
+ .*
+ )
+ \s*
+ $
+ /$1/x;
+
+ die "path2abs(): argument is empty." unless ( $path );
+
+ # Perl does not support shell '~' for home dir
+ if ( $path =~ /
+ ^
+ ~
+ /x ) {
+ if ( $path eq '~' ) { # only own home
+ $path = File::HomeDir->my_home;
+ } elsif ( $path =~ m<
+ ^
+ ~ /
+ (
+ .*
+ )
+ $
+ >x ) { # subdir of own home
+ $path = File::Spec->catdir( $Temp->{'cwd'}, $1 );
+ } elsif ( $path =~ m<
+ ^
+ ~
+ (
+ [^/]+
+ )
+ $
+ >x ) { # home of other user
+ $path = File::HomeDir->users_home($1);
+ } elsif ( $path =~ m<
+ ^
+ ~
+ (
+ [^/]+
+ )
+ /+
+ (
+ .*
+ )
+ $
+ >x ) { # subdir of other home
+ $path = File::Spec->
+ catdir( File::HomeDir->users_home($1), $2 );
+ }
+ }
+
+ $path = File::Spec->rel2abs($path);
+
+ # now $path is absolute
+ return $path;
+ } # end sub path2abs()
+
+
+ sub run_lilypond {
+ # arg is the options collection for 'lilypond' to run
+ # either from ly or pdf
+
+ our ( $Temp, $v );
+
+ my $opts = shift;
+ chomp $opts;
+
+ my $temp_file = &next_temp_file;
+ my $output = EMPTYSTRING;
+
+ # change to temp dir
+ Cwd::chdir $Temp->{'temp_dir'} or
+ die "Could not change to temporary directory '" .
+ $Temp->{'temp_dir'} . "': $!";
+
+ $v->print( "\n##### run of 'lilypond " . $opts . "'" );
+ $output = `lilypond $opts 2>$temp_file`;
+ die "Program lilypond does not work, see '$temp_file': $?"
+ if ( $? );
+ chomp $output;
+ &shell_handling($output, $temp_file);
+ $v->print( "##### end run of 'lilypond'\n" );
+
+ # stay in temp dir
+ } # end sub run_lilypond()
+
+
+ sub shell_handling {
+ # Handle ``-shell-command output in a string (arg1).
+ # stderr goes to temporary file $TempFile.
+
+ our ( $out, $v, $Args );
+
+ my $out_string = shift;
+ my $temp_file = shift;
+
+ my $a = &string2array($out_string); # array ref
+ for ( @$a ) {
+ $out->print( $_ );
+ }
+
+ $temp_file && -f $temp_file && -r $temp_file ||
+ die "shell_handling(): $temp_file is not a readable file.";
+ my $temp = new FH_READ_FILE($temp_file);
+ my $res = $temp->read_all();
+ for ( @$res ) {
+ chomp;
+ $v->print($_);
+ }
+
+ unlink $temp_file unless ( $Args->{'keep_all'} );
+ } # end sub shell_handling()
+
+
+ sub string2array {
+ my $s = shift;
+ my @a = ();
+ for ( split "\n", $s ) {
+ chomp;
+ push @a, $_;
+ }
+ return \@a;
+ } # end string2array()
+
+
+ sub usage { # for '--help'
+ our ( $Globals, $Args );
+
+ my $p = $Globals->{'prog'};
+ my $usage = EMPTYSTRING;
+ $usage = '###### usage:' . "\n" if ( $Args->{'verbose'} );
+ $usage .= qq*Options for $p:
+Read a 'roff' file or standard input and transform 'lilypond' parts
+(everything between '.lilypond start' and '.lilypond end') into
+'EPS'-files that can be read by groff using '.PSPIC'.
+
+There is also a command '.lilypond include <file_name>' that can
+include a complete 'lilypond' file into the 'groff' document.
+
+
+# Breaking options:
+$p -?|-h|--help|--usage # usage
+$p --version # version information
+$p --license # the license is GPL >= 3
+
+
+# Normal options:
+$p [options] [--] [filename ...]
+
+There are 2 options for influencing the way how the 'EPS' files for the
+'roff' display are generated:
+--ly2eps 'lilypond' generates 'EPS' files directly (default)
+--pdf2eps 'lilypond' generates a 'PDF' file that is transformed
+
+-k|--keep_all do not delete any temporary files
+-v|--verbose print much information to STDERR
+
+Options with an argument:
+-e|--eps_dir=... use a directory for the EPS files
+-o|--output=... sent output in the groff language into file ...
+-p|--prefix=... start for the names of temporary files
+-t|--temp_dir=... provide the directory for temporary files.
+
+The directories set are created when they do not exist.
+*;
+
+ # old options:
+ # --keep_files -k: do not delete any temporary files
+ # --file_prefix=... -p: start for the names of temporary files
+
+ $main::stdout->print( $usage );
+ } # end sub usage()
+
+
+ sub version { # for '--version'
+ our ( $Globals, $Legalese, $stdout, $Args );
+ my $groff_version = '';
+ if ( $Globals->{'groff_version'} ) {
+ $groff_version = "(groff $Globals->{'groff_version'}) ";
+ }
+
+ my $output = EMPTYSTRING;
+ $output = "$Globals->{'prog'} ${groff_version}version "
+ . $Legalese->{'version'};
+
+ $stdout->print($output);
+ } # end sub version()
+}
+
+#die "test: ";
+########################################################################
+# OOP declarations for some file handles
+########################################################################
+
+use integer;
+
+########################################################################
+# OOP for writing file handles that are open by default, like STD*
+########################################################################
+
+# -------------------------- _FH_WRITE_OPENED --------------------------
+
+{ # FH_OPENED: base class for all opened file handles, like $TD*
+
+ package _FH_WRITE_OPENED;
+ use strict;
+
+ sub new {
+ my ( $pkg, $std ) = @_;
+ bless {
+ 'fh' => $std,
+ }
+ }
+
+ sub open {
+ }
+
+ sub close {
+ }
+
+ sub print {
+ my $self = shift;
+ for ( @_ ) {
+ print { $self->{'fh'} } $_;
+ }
+ }
+
+}
+
+
+# ------------------------------ FH_STDOUT ----------------------------
+
+{ # FH_STDOUT: print to normal output STDOUT
+
+ package FH_STDOUT;
+ use strict;
+ @FH_STDOUT::ISA = qw( _FH_WRITE_OPENED );
+
+ sub new {
+ &_FH_WRITE_OPENED::new( '_FH_WRITE_OPENED', *STDOUT );
+ }
+
+} # end FH_STDOUT
+
+
+# ------------------------------ FH_STDERR -----------------------------
+
+{ # FH_STDERR: print to STDERR
+
+ package FH_STDERR;
+ use strict;
+ @FH_STDERR::ISA = qw( _FH_WRITE_OPENED );
+
+ sub new {
+ &_FH_WRITE_OPENED::new( 'FH_OPENED', *STDERR );
+ }
+
+} # end FH_STDERR
+
+
+########################################################################
+# OOP for file handles that write into a file or string
+########################################################################
+
+# ------------------------------- FH_FILE ------------------------------
+
+{ # FH_FILE: base class for writing into a file or string
+
+ package FH_FILE;
+ use strict;
+
+ sub new {
+ my ( $pkg, $file ) = @_;
+ bless {
+ 'fh' => undef,
+ 'file' => $file,
+ 'opened' => main::FALSE,
+ }
+ }
+
+ sub DESTROY {
+ my $self = shift;
+ $self->close();
+ }
+
+ sub open {
+ my $self = shift;
+ my $file = $self->{'file'};
+ if ( $file && -e $file ) {
+ die "file $file is not writable" unless ( -w $file );
+ die "$file is a directory" if ( -d $file );
+ }
+ open $self->{'fh'}, ">", $self->{'file'}
+ or die "could not open file '$file' for writing: $!";
+ $self->{'opened'} = main::TRUE;
+ }
+
+ sub close {
+ my $self = shift;
+ close $self->{'fh'} if ( $self->{'opened'} );
+ $self->{'opened'} = main::FALSE;
+ }
+
+ sub print {
+ my $self = shift;
+ $self->open() unless ( $self->{'opened'} );
+ for ( @_ ) {
+ print { $self->{'fh'} } $_;
+ }
+ }
+
+} # end FH_FILE
+
+
+# ------------------------------ FH_STRING -----------------------------
+
+{ # FH_STRING: write into a string
+
+ package FH_STRING; # write to \string
+ use strict;
+ @FH_STRING::ISA = qw( FH_FILE );
+
+ sub new {
+ my $pkg = shift; # string is a reference to scalar
+ bless
+ {
+ 'fh' => undef,
+ 'string' => '',
+ 'opened' => main::FALSE,
+ }
+ }
+
+ sub open {
+ my $self = shift;
+ open $self->{'fh'}, ">", \ $self->{'string'}
+ or die "could not open string for writing: $!";
+ $self->{'opened'} = main::TRUE;
+ }
+
+ sub get { # get string, move to array ref, close, and return array ref
+ my $self = shift;
+ return '' unless ( $self->{'opened'} );
+ my $a = &string2array( $self->{'string'} );
+ $self->close();
+ return $a;
+ }
+
+} # end FH_STRING
+
+
+# -------------------------------- FH_NULL -----------------------------
+
+{ # FH_NULL: write to null device
+
+ package FH_NULL;
+ use strict;
+ @FH_NULL::ISA = qw( FH_FILE FH_STRING );
+
+ use File::Spec;
+
+ my $devnull = File::Spec->devnull();
+ $devnull = '' unless ( -e $devnull && -w $devnull );
+
+ sub new {
+ my $pkg = shift;
+ if ( $devnull ) {
+ &FH_FILE::new( $pkg, $devnull );
+ } else {
+ &FH_STRING::new( $pkg );
+ }
+ } # end new()
+
+} # end FH_NULL
+
+
+########################################################################
+# OOP for reading file handles
+########################################################################
+
+# ---------------------------- FH_READ_FILE ----------------------------
+
+{ # FH_READ_FILE: read a file
+
+ package FH_READ_FILE;
+ use strict;
+
+ sub new {
+ my ( $pkg, $file ) = @_;
+ die "File '$file' cannot be read." unless ( -f $file && -r $file );
+ bless {
+ 'fh' => undef,
+ 'file' => $file,
+ 'opened' => main::FALSE,
+ }
+ }
+
+ sub DESTROY {
+ my $self = shift;
+ $self->close();
+ }
+
+ sub open {
+ my $self = shift;
+ my $file = $self->{'file'};
+ if ( $file && -e $file ) {
+ die "file $file is not writable" unless ( -r $file );
+ die "$file is a directory" if ( -d $file );
+ }
+ open $self->{'fh'}, "<", $self->{'file'}
+ or die "could not read file '$file': $!";
+ $self->{'opened'} = main::TRUE;
+ }
+
+ sub close {
+ my $self = shift;
+ close $self->{'fh'} if ( $self->{'opened'} );
+ $self->{'opened'} = main::FALSE;
+ }
+
+ sub read_line {
+ # Read 1 line of the file into a chomped string.
+ # Do not close the read handle at the end.
+ my $self = shift;
+ $self->open() unless ( $self->{'opened'} );
+
+ my $res;
+ if ( defined($res = CORE::readline($self->{'fh'}) ) ) {
+ chomp $res;
+ return $res;
+ } else {
+ $self->close();
+ return undef;
+ }
+ }
+
+ sub read_all {
+ # Read the complete file into an array reference.
+ # Close the read handle at the end.
+ # Return array reference.
+ my $self = shift;
+ $self->open() unless ( $self->{'opened'} );
+
+ my $res = [];
+ my $line;
+ while ( defined ( $line = CORE::readline $self->{'fh'} ) ) {
+ chomp $line;
+ push @$res, $line;
+ }
+ $self->close();
+ $self->{'opened'} = main::FALSE;
+ return $res;
+ }
+
+}
+
+# end of OOP definitions
+
+
+our $stdout = new FH_STDOUT();
+our $stderr = new FH_STDERR();
+
+# verbose printing, not clear whether this will be set by '--verbose',
+# so store this now into a string, which can be gotten later on, when
+# it will become either STDERR or /dev/null
+our $v = new FH_STRING();
+
+# for standard output, either STDOUT or output file
+our $out;
+
+# end of FH
+
+
+########################################################################
+# Args: command-line arguments
+########################################################################
+
+# command-line arguments are handled in 2 runs:
+# 1) split short option collections, '=' optargs, and transfer abbrevs
+# 2) handle the transferred options with subs
+
+our $Args =
+ {
+ 'eps_dir' => EMPTYSTRING, # can be overwritten by '--eps_dir'
+
+ # 'eps-func' has 2 possible values:
+ # 1) 'pdf' '--pdf2eps' (default)
+ # 2) 'ly' from '--ly2eps'
+ 'eps_func' => 'pdf',
+
+ # files names of temporary files start with this string,
+ # can be overwritten by '--prefix'
+ 'prefix' => 'ly',
+
+ # delete or do not delete temporary files
+ 'keep_all' => FALSE,
+
+ # the roff output goes normally to STDOUT, can be a file with '--output'
+ 'output' => EMPTYSTRING,
+
+ # temporary directory, can be overwritten by '--temp_dir',
+ # empty for default of the program
+ 'temp_dir' => EMPTYSTRING,
+
+ # regulates verbose output (on STDERR), overwritten by '--verbose'
+ 'verbose' => FALSE,
+ };
+
+{ # 'Args'
+ use integer;
+
+ our ( $Globals, $Args, $stderr, $v, $out );
+
+ # ----------
+ # subs for second run, for remaining long options after splitting and
+ # transfer
+ # ----------
+
+ my %opts_with_arg =
+ (
+
+ '--eps_dir' => sub {
+ $Args->{'eps_dir'} = shift;
+ },
+
+ '--output' => sub {
+ $Args->{'output'} = shift;
+ },
+
+ '--prefix' => sub {
+ $Args->{'prefix'} = shift;
+ },
+
+ '--temp_dir' => sub {
+ $Args->{'temp_dir'} = shift;
+ },
+
+ ); # end of %opts_with_arg
+
+
+ my %opts_noarg =
+ (
+
+ '--help' => sub {
+ &usage;
+ exit;
+ },
+
+ '--keep_all' => sub {
+ $Args->{'keep_all'} = TRUE;
+ },
+
+ '--license' => sub {
+ &license;
+ exit;
+ },
+
+ '--ly2eps' => sub {
+ $Args->{'eps_func'} = 'ly';
+ },
+
+ '--pdf2eps' => sub {
+ $Args->{'eps_func'} = 'pdf';
+ },
+
+ '--verbose' => sub {
+ $Args->{'verbose'} = TRUE;
+ },
+
+ '--version' => sub {
+ &version;
+ exit;
+ },
+
+ ); # end of %opts_noarg
+
+
+ # used variables in both runs
+
+ my @files = EMPTYARRAY;
+
+
+ #----------
+ # first run for command-line arguments
+ #----------
+
+ # global variables for first run
+
+ my @splitted_args;
+ my $double_minus = FALSE;
+ my $arg = EMPTYSTRING;
+ my $has_arg = FALSE;
+
+
+ # Split short option collections and transfer these to suitable long
+ # options from above. Note that '-v' now means '--verbose' in version
+ # 'v1.1', earlier versions had '--version' for '-v'.
+
+ my %short_opts =
+ (
+ '?' => '--help',
+ 'e' => '--eps_dir',
+ 'h' => '--help',
+ 'l' => '--license',
+ 'k' => '--keep_all',
+ 'o' => '--output',
+ 'p' => '--prefix',
+ 't' => '--temp_dir',
+ 'v' => '--verbose',
+ 'V' => '--verbose',
+ );
+
+
+ # transfer long option abbreviations to the long options from above
+
+ my @long_opts;
+
+ $long_opts[3] =
+ { # option abbreviations of 3 characters
+ '--e' => '--eps_dir',
+ '--f' => '--prefix', # --f for --file_prefix
+ '--h' => '--help',
+ '--k' => '--keep_all', # and --keep_files
+ '--o' => '--output',
+ '--p' => '--prefix', # and --file_prefix
+ '--t' => '--temp_dir',
+ '--u' => '--help', # '--usage' is mapped to '--help'
+ };
+
+ $long_opts[4] =
+ { # option abbreviations of 4 characters
+ '--li' => '--license',
+ '--ly' => '--ly2eps',
+ '--pd' => '--pdf2eps',
+ '--pr' => '--prefix',
+ };
+
+ $long_opts[6] =
+ { # option abbreviations of 6 characters
+ '--verb' => '--verbose',
+ '--vers' => '--version',
+ };
+
+
+ # subs for short splitting and replacing long abbreviations
+
+ my $split_short = sub {
+
+ my @chars = split //, $1; # omit leading dash
+
+ # if result is TRUE: run 'next SPLIT' afterwards
+
+ CHARS: while ( @chars ) {
+ my $c = shift @chars;
+
+ unless ( exists $short_opts{$c} ) {
+ $stderr->print( "Unknown short option '-$c'." );
+ next CHARS;
+ }
+
+ # short option exists
+
+ # map or transfer to special long option from above
+ my $transopt = $short_opts{$c};
+
+ if ( exists $opts_noarg{$transopt} ) {
+ push @splitted_args, $transopt;
+ $Args->{'verbose'} = TRUE if ( $transopt eq '--verbose' );
+ next CHARS;
+ }
+
+ if ( exists $opts_with_arg{$transopt} ) {
+ push @splitted_args, $transopt;
+
+ if ( @chars ) {
+ # if @chars is not empty, option $transopt has argument
+ # in this arg, the rest of characters in @chars
+ push @splitted_args, join "", @chars;
+ @chars = EMPTYARRAY;
+ return TRUE; # use 'next SPLIT' afterwards
+ }
+
+ # optarg is the next argument
+ $has_arg = $transopt;
+ return TRUE; # use 'next SPLIT' afterwards
+ } # end of if %opts_with_arg
+ } # end of while CHARS
+ return FALSE; # do not do anything
+ }; # end of sub for short_opt_collection
+
+
+ my $split_long = sub {
+ my $from_arg = shift;
+ $from_arg =~ /^([^=]+)/;
+ my $opt_part = lc($1);
+ my $optarg = undef;
+ if ( $from_arg =~ /=(.*)$/ ) {
+ $optarg = $1;
+ }
+
+ N: for my $n ( qw/6 4 3/ ) {
+ $opt_part =~ / # match $n characters
+ ^
+ (
+ .{$n}
+ )
+ /x;
+ my $argn = $1; # get the first $n characters
+
+ # no match, so luck for fewer number of chars
+ next N unless ( $argn );
+
+ next N unless ( exists $long_opts[$n]->{$argn} );
+ # not in $n hash, so go on to next loop for $n
+
+ # now $n-hash has arg
+
+ # map or transfer to special long opt from above
+ my $transopt = $long_opts[$n]->{$argn};
+
+ # test on option without arg
+ if ( exists $opts_noarg{$transopt} ) { # opt has no arg
+ $stderr->print( 'Option ' . $transopt . 'has no argument: ' .
+ $from_arg . '.' ) if ( defined($optarg) );
+ push @splitted_args, $transopt;
+ $Args->{'verbose'} = TRUE if ( $transopt eq '--verbose' );
+ return TRUE; # use 'next SPLIT' afterwards
+ } # end of if %opts_noarg
+
+ # test on option with arg
+ if ( exists $opts_with_arg{$transopt} ) { # opt has arg
+ push @splitted_args, $transopt;
+
+ # test on optarg in arg
+ if ( defined($optarg) ) {
+ push @splitted_args, $1;
+ return TRUE; # use 'next SPLIT' afterwards
+ } # end of if optarg in arg
+
+ # has optarg in next arg
+ $has_arg = $transopt;
+ return TRUE; # use 'next SPLIT' afterwards
+ } # end of if %opts_with_arg
+
+ # not with and without option, so is not permitted
+ $stderr->print( "'" . $transopt .
+ "' is unknown long option from '" . $from_arg . "'" );
+ return TRUE; # use 'next SPLIT' afterwards
+ } # end of for N
+ return FALSE; # do nothing
+ }; # end of split_long()
+
+
+ #----------
+ # do split and transfer arguments
+ #----------
+ sub run_first {
+
+ SPLIT: foreach (@ARGV) {
+ # Transform long and short options into some given long options.
+ # Split long opts with arg into 2 args (no '=').
+ # Transform short option collections into given long options.
+ chomp;
+
+ if ( $has_arg ) {
+ push @splitted_args, $_;
+ $has_arg = EMPTYSTRING;
+ next SPLIT;
+ }
+
+ if ( $double_minus ) {
+ push @files, $_;
+ next SPLIT;
+ }
+
+ if ( $_ eq '-' ) { # file arg '-'
+ push @files, $_;
+ next SPLIT;
+ }
+
+ if ( $_ eq '--' ) { # POSIX arg '--'
+ push @splitted_args, $_;
+ $double_minus = TRUE;
+ next SPLIT;
+ }
+
+ if ( / # short option or collection of short options
+ ^
+ -
+ (
+ [^-]
+ .*
+ )
+ $
+ /x ) {
+ $split_short->($1);
+ next SPLIT;
+ } # end of short option
+
+ if ( /^--/ ) { # starts with 2 dashes, a long option
+ $split_long->($_);
+ next SPLIT;
+ } # end of long option
+
+ # unknown option without leading dash is a file name
+ push @files, $_;
+ next SPLIT;
+ } # end of foreach SPLIT
+
+ # all args are considered
+ $stderr->print( "Option '$has_arg' needs an argument." )
+ if ( $has_arg );
+
+
+ push @files, '-' unless ( @files );
+ @ARGV = @splitted_args;
+
+ }; # end of first run, splitting with map or transfer
+
+
+ #----------
+ # open or ignore verbose output
+ #----------
+ sub install_verbose {
+ if ( $Args->{'verbose'} ) { # '--verbose' was used
+ # make verbose output into $v
+ # get content of string so far as array ref, close
+ my $s = $v->get();
+
+ $v = new FH_STDERR(); # make verbose output into STDERR
+ if ( $s ) {
+ for ( @$s ) {
+ # print the file content into new verbose output
+ $v->print($_);
+ }
+ }
+ # verbose output is now active (into STDERR)
+ $v->print( "Option '-v' means '--verbose'." );
+ $v->print( "Version information is printed by option"
+ . " '--version'."
+ );
+ $v->print( "#" x 72 );
+
+ } else { # '--verbose' was not used
+ # do not be verbose, make verbose invisible
+
+ $v->close(); # close and ignore the string content
+
+ $v = new FH_NULL();
+ # this is either into /dev/null or in an ignored string
+
+ } # end if-else about verbose
+ # '$v->print' works now in any case
+
+ $v->print( "Verbose output was chosen." );
+
+ my $s = $Globals->{'prog_is_installed'} ? '' : ' not';
+ $v->print( $Globals->{'prog'} . " is" . $s .
+ " installed." );
+
+ $v->print( 'The command-line options are:' );
+
+ $s = " options:";
+ $s .= " '" . $_ . "'" for ( @ARGV );
+ $v->print( $s );
+
+ $s = " file names:";
+ $s .= " '" . $_ . "'\n" for ( @files );
+ $v->print( $s );
+ } # end install_verbose()
+
+
+ #----------
+ # second run of command-line arguments
+ #----------
+ sub run_second {
+ # Second run of args with new @ARGV from the former splitting.
+ # Arguments are now split and transformed into special long
+ # options.
+
+ my $double_minus = FALSE;
+ my $has_arg = FALSE;
+
+ ARGS: for my $arg ( @ARGV ) {
+
+ # ignore '--', file names are handled later on
+ last ARGS if ( $arg eq '--' );
+
+ if ( $has_arg ) {
+ unless ( exists $opts_with_arg{$has_arg} ) {
+ $stderr->print( "'\%opts_with_args' does not have key '" .
+ $has_arg . "'." );
+ next ARGS;
+ }
+
+ $opts_with_arg{$has_arg}->($arg);
+ $has_arg = FALSE;
+ next ARGS;
+ } # end of $has_arg
+
+ if ( exists $opts_with_arg{$arg} ) {
+ $has_arg = $arg;
+ next ARGS;
+ }
+
+ if ( exists $opts_noarg{$arg} ) {
+ $opts_noarg{$arg}->();
+ next ARGS;
+ }
+
+ # not a suitable option
+ $stderr->print( "Wrong option '" . $arg . "'." );
+ next ARGS;
+
+ } # end of for ARGS:
+
+
+ if ( $has_arg ) { # after last argument
+ die "Option '$has_arg' needs an argument.";
+ }
+
+ }; # end of second run
+
+
+ sub handle_args {
+ # handling the output of args
+
+ if ( $Args->{'output'} ) { # '--output' was set in the arguments
+ my $out_path = &path2abs($Args->{'output'});
+ die "Output file name $Args->{'output'} cannot be used."
+ unless ( $out_path );
+
+ my ( $file, $dir );
+ ( $file, $dir ) = File::Basename::fileparse($out_path)
+ or die "Could not handle output file path '" . $out_path
+ . "': directory name '" . $dir . "' and file name '" . $file
+ . "'.";
+
+ die "Could not find output directory for '" . $Args->{'output'}
+ . "'" unless ( $dir );
+ die "Could not find output file: '" . $Args->{'output'} .
+ "'" unless ( $file );
+
+ if ( -d $dir ) {
+ die "Could not write to output directory '" . $dir . "'."
+ unless ( -w $dir );
+ } else {
+ $dir = &make_dir($dir);
+ die "Could not create output directory in: '" . $out_path . "'."
+ unless ( $dir );
+ }
+
+ # now $dir is a writable directory
+
+ if ( -e $out_path ) {
+ die "Could not write to output file '" . $out_path . "'."
+ unless ( -w $out_path );
+ }
+
+ $out = new FH_FILE( $out_path );
+ $v->print( "Output goes to file '" . $out_path . "'." );
+ } else { # '--output' was not set
+ $out = new FH_STDOUT();
+ }
+ # no $out is the right behavior for standard output
+
+ # $Args->{'prefix'} .= '_' . $Args->{'eps_func'} . '2eps';
+
+ @ARGV = @files;
+ }
+
+ &run_first();
+ &install_verbose();
+ &run_second();
+ &handle_args();
+}
+
+# end 'Args'
+
+
+########################################################################
+# temporary directory .../tmp/groff/USER/lilypond/TIME
+########################################################################
+
+our $Temp =
+ {
+ # store the current directory
+ 'cwd' => Cwd::getcwd(),
+
+ # directory for EPS files
+ 'eps_dir' => EMPTYSTRING,
+
+ # temporary directory
+ 'temp_dir' => EMPTYSTRING,
+ };
+
+{ # 'Temp'
+
+ if ( $Args->{'temp_dir'} ) {
+
+ #----------
+ # temporary directory was set by '--temp_dir'
+ #----------
+
+ my $dir = $Args->{'temp_dir'};
+
+ $dir = &path2abs($dir);
+ $dir = &make_dir($dir) or
+ die "The directory '$dir' cannot be used temporarily: $!";
+
+
+ # now '$dir' is a writable directory
+
+ opendir( my $dh, $dir ) or
+ die "Could not open temporary directory '$dir': $!";
+ my $file_name;
+ my $found = FALSE;
+ my $prefix = $Args->{'prefix'};
+ my $re = qr<
+ ^
+ $prefix
+ _
+ >x;
+
+ READDIR: while ( defined($file_name = readdir($dh)) ) {
+ chomp $file_name;
+ if ( $file_name =~ /$re/ ) { # file name starts with $prefix_
+ $found = TRUE;
+ last READDIR;
+ }
+ next;
+ }
+
+ $Temp->{'temp_dir'} = $dir;
+ my $n = 0;
+ while ( $found ) {
+ $dir = File::Spec->catdir( $Temp->{'temp_dir'}, ++$n );
+ next if ( -e $dir );
+
+ $dir = &make_dir($dir) or next;
+
+ $found = FALSE;
+ last;
+ }
+
+ $Temp->{'temp_dir'} = $dir;
+
+
+ } else { # $Args->{'temp_dir'} not given by '--temp_dir'
+
+ #----------
+ # temporary directory was not set
+ #----------
+
+ { # search for or create a temporary directory
+
+ my @tempdirs = EMPTYARRAY;
+ {
+ my $tmpdir = File::Spec->tmpdir();
+ push @tempdirs, $tmpdir
+ if ( $tmpdir && -d $tmpdir && -w $tmpdir );
+
+ my $root_dir = File::Spec->rootdir(); # '/' in Unix
+ my $root_tmp = File::Spec->catdir($root_dir, 'tmp');
+ push @tempdirs, $root_tmp
+ if ( $root_tmp ne $tmpdir && -d $root_tmp && -w $root_tmp );
+
+ # home directory of the actual user
+ my $home = File::HomeDir->my_home;
+ my $home_tmp = File::Spec->catdir($home, 'tmp');
+ push @tempdirs, $home_tmp if ( -d $home_tmp && -w $home_tmp );
+
+ # '/var/tmp' in Unix
+ my $var_tmp = File::Spec->catdir('', 'var', 'tmp');
+ push @tempdirs, $var_tmp if ( -d $var_tmp && -w $var_tmp );
+ }
+
+
+ my @path_extension = qw( groff ); # TEMPDIR/groff/USER/lilypond/N
+ {
+ # '$<' is UID of actual user,
+ # 'getpwuid' gets user name in scalar context
+ my $user = getpwuid($<);
+ push @path_extension, $user if ( $user );
+
+ push @path_extension, qw( lilypond );
+ }
+
+
+ TEMPS: foreach ( @tempdirs ) {
+
+ my $dir; # final directory name in 'while' loop
+ $dir = &path2abs($_);
+ next TEMPS unless ( $dir );
+
+ # beginning of directory name
+ my @dir_begin =
+ ( File::Spec->splitdir($dir), @path_extension );
+
+
+ my $n = 0;
+ my $dir_blocked = TRUE;
+ BLOCK: while ( $dir_blocked ) {
+ # should become the final dir name
+ $dir = File::Spec->catdir(@dir_begin, ++$n);
+ next BLOCK if ( -d $dir );
+
+ # dir name is now free, create it, and end the blocking
+ my $res = &make_dir( $dir );
+ die "Could not create directory: $dir" unless ( $res );
+
+ $dir = $res;
+ $dir_blocked = FALSE;
+ }
+
+ next TEMPS unless ( -d $dir && -w $dir );
+
+ # $dir is now a writable directory
+ $Temp->{'temp_dir'} = $dir; # tmp/groff/USER/lilypond/TIME
+ last TEMPS;
+ } # end foreach tmp directories
+ } # end to create a temporary directory
+
+ die "Could not find a temporary directory" unless
+ ( $Temp->{'temp_dir'} && -d $Temp->{'temp_dir'} &&
+ -w $Temp->{'temp_dir'} );
+
+ } # end temporary directory
+
+ $v->print( "Temporary directory: '" . $Temp->{'temp_dir'} . "'\n" );
+ $v->print( "file_prefix: '" . $Args->{'prefix'} . "'" );
+
+
+ #----------
+ # EPS directory
+ #----------
+
+ my $make_dir = FALSE;
+ if ( $Args->{'eps_dir'} ) { # set by '--eps_dir'
+ my $dir = $Args->{'eps_dir'};
+
+ $dir = &path2abs($dir);
+
+ if ( -e $dir ) {
+ goto EMPTY unless ( -w $dir );
+
+ # '$dir' is writable
+ if ( -d $dir ) {
+ my $upper_dir = $dir;
+
+ my $found = FALSE;
+ opendir( my $dh, $upper_dir ) or $found = TRUE;
+ my $prefix = $Args->{'prefix'};
+ my $re = qr<
+ ^
+ $prefix
+ _
+ >x;
+ while ( not $found ) {
+ my $file_name = readdir($dh);
+ if ( $file_name =~ /$re/ ) { # file name starts with $prefix_
+ $found = TRUE;
+ last;
+ }
+ next;
+ }
+
+ my $n = 0;
+ while ( $found ) {
+ $dir = File::Spec->catdir($upper_dir, ++$n);
+ next if ( -d $dir );
+ $found = FALSE;
+ }
+ $make_dir = TRUE;
+ $Temp->{'eps_dir'} = $dir;
+ } else { # '$dir' is not a dir, so unlink it to create it as dir
+ if ( unlink $dir ) { # could remove '$dir'
+ $Temp->{'eps_dir'} = $dir;
+ $make_dir = TRUE;
+ } else { # could not remove
+ $stderr->print( "Could not use EPS dir '" . $dir .
+ "', use temp dir." );
+ } # end of unlink
+ } # end test of -d $dir
+ } else {
+ $make_dir = TRUE;
+ } # end of if -e $dir
+
+
+ if ( $make_dir ) { # make directory '$dir'
+ my $made = FALSE;
+ $dir = &make_dir($dir) and $made = TRUE;
+
+ if ( $made ) {
+ $Temp->{'eps_dir'} = $dir;
+ $v->print( "Directory for useful EPS files is '" . $dir . "'." );
+ } else {
+ $v->print( "The EPS directory '" . $dir . "' cannot be used: $!" );
+ }
+ } else { # '--eps_dir' was not set, so take the temporary directory
+ $Temp->{'eps_dir'} = $Args->{'temp_dir'};
+ } # end of make dir
+ }
+
+ EMPTY: unless ( $Temp->{'eps_dir'} ) {
+ # EPS-dir not set or available, use temp dir,
+ # but leave $Temp->{'}eps_dir'} empty
+ $v->print( "Directory for useful EPS files is the " .
+ "temporary directory '" . $Temp->{'temp_dir'} . "'." );
+ }
+
+} # end 'Temp'
+
+
+########################################################################
+# Read: read files or stdin
+########################################################################
+
+our $Read =
+ {
+ 'file_numbered' => EMPTYSTRING,
+ 'file_ly' => EMPTYSTRING, # '$file_numbered.ly'
+ };
+
+{ # read files or stdin
+
+ my $ly_number = 0; # number of lilypond file
+
+ # '$Args->{'prefix'}_[0-9]'
+
+ my $lilypond_mode = FALSE;
+
+ my $arg1; # first argument for '.lilypond'
+ my $arg2; # argument for '.lilypond include'
+
+ my $path_ly; # path of ly-file
+
+
+ my $check_file = sub { # for argument of '.lilypond include'
+ my $file = shift; # argument is a file name
+ $file = &path2abs($file);
+ unless ( $file ) {
+ die "Line '.lilypond include' without argument";
+ return '';
+ }
+ unless ( -f $file && -r $file ) {
+ die "Argument '$file' in '.lilypond include' is not a readable file";
+ }
+
+ return $file;
+ }; # end sub &$check_file()
+
+
+ my $increase_ly_number = sub {
+ ++$ly_number;
+ $Read->{'file_numbered'} = $Args->{'prefix'} . '_' . $ly_number;
+ $Read->{'file_ly'} = $Read->{'file_numbered'} . '.ly';
+ $path_ly = File::Spec->catdir($Temp->{'temp_dir'}, $Read->{'file_ly'} );
+ };
+
+
+ my %eps_subs =
+ (
+ 'ly' => \&create_ly2eps, # lilypond creates EPS files
+ 'pdf' => \&create_pdf2eps, # lilypond creates PDF file
+ );
+
+ # about lines starting with '.lilypond'
+
+ my $ly;
+ my $fh_include_file;
+ my %lilypond_args =
+ (
+
+ 'start' => sub {
+ $v->print( "\nline: '.lilypond start'" );
+ die "Line '.lilypond stop' expected." if ( $lilypond_mode );
+
+ $lilypond_mode = TRUE;
+ &$increase_ly_number;
+
+ $v->print( "ly-file: '" . $path_ly . "'" );
+
+ $ly = new FH_FILE($path_ly);
+ },
+
+
+ 'end' => sub {
+ $v->print( "line: '.lilypond end'\n" );
+ die "Expected line '.lilypond start'." unless ( $lilypond_mode );
+
+ $lilypond_mode = FALSE;
+ $ly->close();
+
+ if ( exists $eps_subs{ $Args->{'eps_func'} } ) {
+ $eps_subs{ $Args->{'eps_func'} }->();
+ } else {
+ die "Wrong argument for \%eps_subs: " . $Args->{'eps_func'} . "'";
+ }
+ },
+
+
+ 'include' => sub { # '.lilypond include file...'
+
+ # this may not be used within lilypond mode
+ next LILYPOND if ( $lilypond_mode );
+
+ my $file_arg = shift;
+
+ my $file = &$check_file($file_arg);
+ next LILYPOND unless ( $file );
+ # file can be read now
+
+
+ # '$fh_write_ly' must be opened
+ &$increase_ly_number;
+
+ $ly = new FH_FILE($path_ly);
+
+ my $include = new FH_READ_FILE($file);
+ my $res = $include->read_all(); # is a reference to an array
+ foreach ( @$res ) {
+ chomp;
+ $ly->print($_);
+ }
+ $ly->close();
+
+ if ( exists $eps_subs{ $Args->{'eps_func'} } ) {
+ $eps_subs{ $Args->{'eps_func'} }->();
+ } else {
+ die "Wrong argument for \$eps_subs: '" . $Args->{'eps_func'} . "'";
+ }
+ }, # end '.lilypond include'
+
+ ); # end definition %lilypond_args
+
+
+ LILYPOND: foreach my $filename (@ARGV) {
+ my $input;
+ if ($filename eq '-') {
+ $input = \*STDIN;
+ } elsif (not open $input, '<', $filename) {
+ warn $!;
+ next;
+ }
+ while (<$input>) {
+ chomp;
+ my $line = $_;
+
+
+ # now the lines with '.lilypond ...'
+
+ if ( /
+ ^
+ [.']
+ \s*
+ lilypond
+ (
+ .*
+ )
+ $
+ /x ) { # .lilypond ...
+ my $args = $1;
+ $args =~ s/
+ ^
+ \s*
+ //x;
+ $args =~ s/
+ \s*
+ $
+ //x;
+ $args =~ s/
+ ^
+ (
+ \S*
+ )
+ \s*
+ //x;
+ my $arg1 = $1; # 'start', 'end' or 'include'
+ $args =~ s/["'`]//g;
+ my $arg2 = $args; # file argument for '.lilypond include'
+
+ if ( exists $lilypond_args{$arg1} ) {
+ $lilypond_args{$arg1}->($arg2);
+ next;
+ } else {
+ # not a suitable argument of '.lilypond'
+ $stderr->print( "Unknown command: '$arg1' '$arg2': '$line'" );
+ }
+
+ next LILYPOND;
+ } # end if for .lilypond
+
+
+ if ( $lilypond_mode ) { # do lilypond-mode
+ # see '.lilypond start'
+ $ly->print( $line );
+ next LILYPOND;
+ } # do lilypond-mode
+
+ # unknown line without lilypond
+ unless ( /
+ ^
+ [.']
+ \s*
+ lilypond
+ /x ) { # not a '.lilypond' line
+ $out->print($line);
+ next LILYPOND;
+ }
+ } # end while <$input>
+ } # end foreach $filename
+} # end Read
+
+
+########################################################################
+# clean up
+########################################################################
+
+END {
+
+ exit unless ( defined($Temp->{'temp_dir'}) );
+
+ if ( $Args->{'keep_all'} ) {
+ # With --keep_all, no temporary files are removed.
+ $v->print( "keep_all: 'TRUE'" );
+ $v->print( "No temporary files will be deleted:" );
+
+ opendir my $dh_temp, $Temp->{'temp_dir'} or
+ die "Cannot open " . $Temp->{'temp_dir'} . ": $!";
+ for ( sort readdir $dh_temp ) {
+ next if ( / # omit files starting with a dot
+ ^
+ \.
+ /x );
+ if ( /
+ ^
+ $Args->{'prefix'}
+ _
+ /x ) {
+ my $file = File::Spec->catfile( $Temp->{'temp_dir'}, $_ );
+ $v->print( "- " . $file );
+ next;
+ }
+ next;
+ } # end for sort readdir
+ closedir $dh_temp;
+
+ } else { # keep_all is not set
+ # Remove all temporary files except the eps files.
+
+ $v->print( "keep_all: 'FALSE'" );
+ $v->print( "All temporary files except *.eps will be deleted" );
+
+
+ if ( $Temp->{'eps_dir'} ) {
+ # EPS files are in another dir, remove temp dir
+
+ if ( &is_subdir( $Temp->{'eps_dir'}, $Temp->{'temp_dir'} ) ) {
+ $v->print( "EPS dir is subdir of temp dir, so keep both." );
+ } else { # remove temp dir
+ $v->print( "Try to remove temporary directory '" .
+ $Temp->{'temp_dir'} ."':" );
+ if ( File::Path::remove_tree($Temp->{'temp_dir'}) ) {
+ # remove succeeds
+ $v->print( "...done." );
+ } else { # did not remove
+ $v->print( "Failure to remove temporary directory." );
+ } # end test on remove
+ } # end is subdir
+
+ } else { # no EPS dir, so keep EPS files
+
+ opendir my $dh_temp, $Temp->{'temp_dir'} or
+ die "Cannot open " . $Temp->{'temp_dir'} . ": $!";
+ for ( sort readdir $dh_temp ) {
+ next if ( / # omit files starting with a dot
+ ^
+ \.
+ /x );
+ next if ( / # omit EPS-files
+ \.eps
+ $
+ /x );
+ if ( /
+ ^
+ $Args->{'prefix'}
+ _
+ /x ) { # this includes 'PREFIX_temp*'
+ my $file = File::Spec->catfile( $Temp->{'temp_dir'}, $_ );
+ $v->print( "Remove '" . $file . "'" );
+ unlink $file or $stderr->print( "Could not remove '$file': $!" );
+ next;
+ } # end if prefix
+ next;
+ } # end for readdir temp dir
+ closedir $dh_temp;
+ } # end if-else EPS files
+ } # end if-else keep files
+
+
+ if ( $Temp->{'eps_dir'} ) {
+ # EPS files in $Temp->{'eps_dir'} are always kept
+ $v->print( "As EPS directory is set as '" .
+ $Temp->{'eps_dir'} . "', no EPS files there will be deleted." );
+
+ opendir my $dh_temp, $Temp->{'eps_dir'} or
+ die "Cannot open '" . $Temp->{'eps_dir'} . ": $!";
+ for ( sort readdir $dh_temp ) {
+ next if ( / # omit files starting with a dot
+ ^
+ \.
+ /x );
+ if ( /
+ ^
+ $Args->{'prefix'}
+ _
+ .*
+ \.eps
+ $
+ /x ) {
+ my $file = File::Spec->catfile( $Temp->{'eps_dir'}, $_ );
+ $v->print( "- " . $file );
+ next;
+ } # end if *.eps
+ next;
+ } # end for sort readdir
+ closedir $dh_temp;
+
+ }
+
+ 1;
+} # end package Clean
+
+
+1;
+# Local Variables:
+# fill-column: 72
+# mode: CPerl
+# End:
+# vim: set autoindent textwidth=72:
diff --git a/contrib/gperl/ChangeLog b/contrib/gperl/ChangeLog
new file mode 100644
index 0000000..813c320
--- /dev/null
+++ b/contrib/gperl/ChangeLog
@@ -0,0 +1,142 @@
+2022-10-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * gperl.pl: Include groff version information when reporting our
+ own (as recommended by GNU coding standards). Also drop
+ gratuitous quotation of program's own name.
+
+2022-05-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * gperl.am (gperl): Spell dependency on `$(SH_DEPS_SED_SCRIPT)`
+ using that macro expansion instead of a literal file name. See
+ groff's doc/automake.mom.
+
+2021-01-06 Colin Watson <cjwatson@debian.org>
+
+ * gperl.pl: Avoid Perl's unsafe "<>" operator.
+
+ The "<>" operator is implemented using the two-argument form of
+ "open", which interprets magic such as pipe characters, allowing
+ execution of arbitrary commands which is unlikely to be
+ expected. Perl >= 5.22 has a "<<>>" operator which avoids this,
+ but also forbids the use of "-" to mean the standard input,
+ which is a facility that the affected groff programs document.
+
+ ARGV::readonly would probably also fix this, but I fundamentally
+ dislike the approach of escaping data in preparation for a
+ language facility to unescape it, especially when the required
+ escaping is as non-obvious as it is here. (For the same reason,
+ I prefer to use subprocess invocation facilities that allow
+ passing the argument list as a list rather than as a string to
+ be interpreted by the shell.) So I've abandoned this dubious
+ convenience and changed the affected programs to iterate over
+ command-line arguments manually using the three-argument form of
+ open.
+
+ Fixes <https://savannah.gnu.org/bugs/?55557>.
+
+2020-04-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * gperl.1.man: Delete references to groffer.
+
+2018-02-28 Werner LEMBERG <wl@gnu.org>
+
+ * gperl.am (gperl): Use $(AM_V_GEN) to silence file generation.
+
+2015-08-22 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gperl.1.man: Rename `gperl.man'.
+
+ * gperl.am: Include renaming.
+
+2015-08-05 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gperl.am: Add `Last update'. Setup Emacs mode.
+
+2015-04-03 Werner LEMBERG <wl@gnu.org>
+
+ * gperl.man: Make it work in compatibility mode.
+ (EL): Fix typo.
+
+2014-10-11 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gperl.pl: Version 1.2.6
+ Replace `capturex' with backtics, so `use IPC::System::Simple'
+ can be removed.
+
+2014-09-03 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gperl.pl: Version 1.2.5
+
+ * all files in `gperl': Copying and Emacs setting.
+
+2014-07-06 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gperl.pl: Version 1.2.4
+ Improve handling of `.Perl' lines.
+
+2014-07-06 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gperl.pl: Version 1.2.3
+
+ * gperl.man: Compatioble to `doclifter'.
+
+2014-07-04 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gperl.pl: Version 1.2.2
+
+ * gperl.man: Transform to classical man-page style.
+
+2014-07-03 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gperl.pl: Improve definitions.
+
+2014-06-15 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gperl.pl: Version 1.2.1.
+
+ * gperl.man: Correct the Legalese and documentation of options.
+
+2014-06-15 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gperl.pl: Version 1.2. Getting several storage variables from
+ printing in `Perl' with several lines. Accept string and number
+ register variable names for `.ds' and `.nr'.
+
+ * gperl.man: Rewrite with the actual additions.
+
+2014-06-14 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gperl.pl: Version 1.1. New structure without subs. Restrict
+ storage to only strings by creating only `.ds'.
+
+ * gperl.man: Major rewrite. Omit `.nr'.
+
+2014-02-27 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gperl.pl: Admit file name arguments. Handle correct temporary
+ file.
+
+2014-02-25 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gperl.pl, gperl.man, ChangeLog, Makefile.sub:
+ first version 1.0
+
+2014-02-25 Bernd Warken <groff-bernd.warken-72@web.de>
+________________________________________________________________________
+License
+
+Copyright (C) 2014-2020 Free Software Foundation, Inc.
+Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+
+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 `gperl', which is part of the `groff'
+project.
+
+##### Editor settings
+
+Local Variables:
+mode: change-log
+End:
diff --git a/contrib/gperl/gperl.1.man b/contrib/gperl/gperl.1.man
new file mode 100644
index 0000000..14afdcf
--- /dev/null
+++ b/contrib/gperl/gperl.1.man
@@ -0,0 +1,491 @@
+.TH gperl @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+gperl \- execute Perl commands in
+.I groff
+documents
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2014-2020 Free Software Foundation, Inc.
+.\"
+.\" This file is part of gperl, which is part of groff, a free software
+.\" project.
+.\"
+.\" You can redistribute it and/or modify it under the terms of the GNU
+.\" General Public License as published by the Free Software Foundation,
+.\" version 2.
+.\"
+.\" The license text is available in the internet at
+.\" <http://www.gnu.org/licenses/gpl-2.0.html>.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_gperl_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY gperl
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY gperl
+.B \-h
+.
+.SY gperl
+.B \-\-help
+.YS
+.
+.SY gperl
+.B \-v
+.
+.SY gperl
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+This is a preprocessor for
+.MR groff @MAN1EXT@ .
+.
+It allows the use of
+.MR perl 7
+code in
+.MR groff @MAN7EXT@
+files.
+.
+The result of a
+.I Perl part
+can be stored in groff
+.I strings
+or
+.I numerical registers
+based on the arguments at a final line of a
+.IR "Perl part" .
+.
+.
+.P
+If no operands are given,
+or if
+.I file
+is
+.RB \[lq] \- \[rq],
+.I gperl
+reads the standard input stream.
+.
+A double-dash argument
+.RB (\[lq] \-\- \[rq])
+causes all subsequent arguments to be interpreted as
+.I file
+operands,
+even if their names start with a dash.
+.
+.B \-h
+and
+.B \-\-help
+display a usage message,
+whereas
+.B \-v
+and
+.B \-\-version
+display version information;
+all exit afterward.
+.
+.
+.\" ====================================================================
+.SH "Perl regions"
+.\" ====================================================================
+.
+.I Perl
+parts in
+.I groff files
+are enclosed by two
+.B .Perl
+requests with different arguments, a
+.I starting
+and an
+.I ending
+command.
+.
+.
+.\" ====================================================================
+.SS "Starting Perl mode"
+.\" ====================================================================
+.
+The starting
+.I Perl request
+can either be without arguments, or by a request that has the term
+.B start
+as its only argument.
+.RS
+.IP \(bu
+.B .Perl
+.IP \(bu
+.B .Perl start
+.RE
+.
+.
+.\" ====================================================================
+.SS "Ending Perl mode without storage"
+.\" ====================================================================
+.
+A
+.B .Perl
+command line with an argument different from
+.B start
+finishes a running
+.IR "Perl part" .
+.
+Of course, it would be reasonable to add the argument
+.BR stop ;
+that's possible, but not necessary.
+.
+.RS
+.IP \(bu
+.B .Perl stop
+.IP \(bu
+.BI .Perl " other_than_start"
+.RE
+.
+The argument
+.I other_than_start
+can additionally be used as a
+.I groff
+string variable name for storage \(em see next section.
+.
+.
+.\" ====================================================================
+.SS "Ending Perl mode with storage"
+.\" ====================================================================
+.
+A useful feature of
+.I gperl
+is to store one or more results from the
+.IR "Perl mode" .
+.
+.
+.P
+The output of a
+.I Perl part
+can be got with backticks
+.BR \[ga]...\[ga] .
+.
+.
+.P
+This program collects all printing to STDOUT (normal standard output)
+by the Perl
+.B print
+program.
+.
+This pseudo-printing output can have several lines, due to printed
+line breaks with
+.BR \(rsn .
+.
+By that, the output of a Perl run should be stored into a Perl array,
+with a single line for each array member.
+.
+.
+.P
+This Perl array output can be stored by
+.I gperl
+in either
+.TP
+.I groff strings
+by creating a groff command
+.B .ds
+.
+.TP
+.I groff register
+by creating a groff command
+.B .rn
+.
+.
+.P
+The storage modes can be determined by arguments of a final stopping
+.B .Perl
+command.
+.
+Each argument
+.B .ds
+changes the mode into
+.I groff string
+and
+.B .nr
+changes the mode into
+.I groff register
+for all following output parts.
+.
+.
+.br
+.ne 2v
+.P
+By default, all output is saved as strings, so
+.B .ds
+is not really needed before the first
+.B .nr
+command.
+.
+That suits to
+.MR groff @MAN7EXT@ ,
+because every output can be saved as
+.I groff
+string, but the registers can be very restrictive.
+.
+.
+.P
+In
+.IR "string mode" ,
+.I gperl
+generates a
+.I groff string
+storage line
+.RS
+.EX
+.BI .ds " var_name content"
+.EE
+.RE
+.
+In
+.I register mode
+the following groff command is generated
+.RS
+.EX
+.BI .nr " var_name content"
+.EE
+.RE
+.
+.
+.P
+We present argument collections in the following.
+.
+You can add as first argument for all
+.BR stop .
+.
+We omit this additional element.
+.
+.
+.P
+.TP
+.BI ".Perl .ds " var_name
+This will store 1 output line into the groff string named
+.I var_name
+by the automatically created command
+.RS
+.RS
+.EX
+.BI .ds " var_name output"
+.EE
+.RE
+.RE
+.
+.
+.TP
+.BI .Perl " var_name"
+If
+.I var_name
+is different from
+.B start
+this is equivalent to the former command, because the string mode is
+string with
+.B .ds
+command.
+default.
+.
+.
+.TP
+.BI .Perl " var_name1 var_name2"
+This will store 2 output lines into groff string names
+.I var_name1
+and
+.IR var_name2 ,
+because the default mode
+.B .ds
+is active, such that no
+.B .ds
+argument is needed.
+.
+Of course, this is equivalent to
+.RS
+.RS
+.EX
+.BI ".Perl .ds " "var_name1 var_name2"
+.EE
+.RE
+and
+.RS
+.EX
+.BI ".Perl .ds " "var_name1 " ".ds" " var_name2"
+.EE
+.RE
+.RE
+.
+.
+.TP
+.BI ".Perl .nr" " var_name1 varname2"
+stores both variables as register variables.
+.
+.I gperl
+generates
+.RS
+.EX
+.BI .nr " var_name1 output_line1"
+.BI .nr " var_name2 output_line2"
+.EE
+.RE
+.
+.
+.TP
+.BI ".Perl .nr " var_name1 " .ds " var_name2
+stores the 1st argument as
+.I register
+and the second as
+.I string
+by
+.RS
+.EX
+.BI .nr " var_name1 output_line1"
+.BI .ds " var_name2 output_line2"
+.EE
+.RE
+.
+.
+.\" ====================================================================
+.SH Example
+.\" ====================================================================
+.
+A possible
+.I Perl part
+in a
+.I roff file
+could look like that:
+.RS
+.EX
+before
+\&.Perl start
+my $result = \[aq]some data\[aq];
+print $result;
+\&.Perl stop .ds string_var
+after
+.EE
+.RE
+.
+.
+.P
+This stores the result
+.B \(rqsome data\(rq
+into the
+.I roff string
+called
+.BR string_var ,
+such that the following line is printed:
+.RS
+.EX
+\&.ds string_var some data
+.EE
+.RE
+by
+.I gperl
+as food for the coming
+.I groff
+run.
+.
+.
+.P
+A
+.I Perl part
+with several outputs is:
+.RS
+.EX
+\&.Perl start
+print \(rqfirst\(rsn\(rq;
+print \(rqsecond line\(rsn\(rq;
+print \(rq3\(rsn\(rq;
+\&.Perl var1 var2 .nr var3
+.EE
+.RE
+.
+This stores 3 printed lines into 3
+.I groff
+strings.
+.BR var1 , var2 , var3 .
+.
+So the following
+.I groff
+command lines are created:
+.RS
+.EX
+\&.ds var1 first
+\&.ds var2 second line
+\&.nr var3 3
+.EE
+.RE
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+.I gperl
+was written by
+.MT groff\-bernd\:.warken\-72@\:web\:.de
+Bernd Warken
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.P
+Man pages related to
+.I groff
+are
+.MR groff @MAN1EXT@ ,
+.MR groff @MAN7EXT@ ,
+and
+.MR grog @MAN1EXT@ .
+.
+.
+.P
+Documents related to
+.I Perl
+are
+.MR perl 1 ,
+.MR perl 7 .
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_gperl_1_man_C]
+.do rr *groff_gperl_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/gperl/gperl.am b/contrib/gperl/gperl.am
new file mode 100644
index 0000000..4d275c2
--- /dev/null
+++ b/contrib/gperl/gperl.am
@@ -0,0 +1,48 @@
+# Automake rules for 'gperl' (preprocessor for added Perl parts)
+
+# Copyright (C) 2014-2020 Free Software Foundation, Inc.
+# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+# Automake migration by Bertrand Garrigues
+
+# This file is part of 'gperl' 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 of the License, 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 this program. If not, see
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+bin_SCRIPTS += gperl
+man1_MANS += contrib/gperl/gperl.1
+EXTRA_DIST += \
+ contrib/gperl/ChangeLog \
+ contrib/gperl/gperl.1.man \
+ contrib/gperl/gperl.pl
+
+gperl: $(top_srcdir)/contrib/gperl/gperl.pl $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)$(RM) $@ \
+ && sed -f "$(SH_DEPS_SED_SCRIPT)" \
+ -e "s|[@]g[@]|$(g)|g" \
+ -e "s|[@]BINDIR[@]|$(DESTDIR)$(bindir)|g" \
+ -e "s|[@]VERSION[@]|$(VERSION)|g" \
+ -e "$(SH_SCRIPT_SED_CMD)" \
+ $(top_srcdir)/contrib/gperl/gperl.pl \
+ >$@ \
+ && chmod +x $@
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/contrib/gperl/gperl.pl b/contrib/gperl/gperl.pl
new file mode 100755
index 0000000..2f9f7d1
--- /dev/null
+++ b/contrib/gperl/gperl.pl
@@ -0,0 +1,257 @@
+#! /usr/bin/env perl
+
+# gperl - add Perl part to groff files, this is the preprocessor for that
+
+# Copyright (C) 2014-2020 Free Software Foundation, Inc.
+
+# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+
+my $version = '1.2.6';
+
+# This file is part of 'gperl', 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 of the License, 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 can find a copy of the GNU General Public License in the internet
+# at <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+use strict;
+use warnings;
+#use diagnostics;
+
+# temporary dir and files
+use File::Temp qw/ tempfile tempdir /;
+
+# needed for temporary dir
+use File::Spec;
+
+# for 'copy' and 'move'
+use File::Copy;
+
+# for fileparse, dirname and basename
+use File::Basename;
+
+# current working directory
+use Cwd;
+
+# $Bin is the directory where this script is located
+use FindBin;
+
+
+########################################################################
+# system variables and exported variables
+########################################################################
+
+$\ = "\n"; # final part for print command
+
+########################################################################
+# read-only variables with double-@ construct
+########################################################################
+
+our $File_split_env_sh;
+our $File_version_sh;
+our $Groff_Version;
+
+my $before_make; # script before run of 'make'
+{
+ my $at = '@';
+ $before_make = 1 if '@VERSION@' eq "${at}VERSION${at}";
+}
+
+my %at_at;
+my $file_perl_test_pl;
+my $groffer_libdir;
+
+if ($before_make) {
+ my $gperl_source_dir = $FindBin::Bin;
+ $at_at{'BINDIR'} = $gperl_source_dir;
+ $at_at{'G'} = '';
+} else {
+ $at_at{'BINDIR'} = '@BINDIR@';
+ $at_at{'G'} = '@g@';
+}
+
+
+########################################################################
+# options
+########################################################################
+
+foreach (@ARGV) {
+ if ( /^(-h|--h|--he|--hel|--help)$/ ) {
+ print q(Usage for the 'gperl' program:);
+ print 'gperl [-] [--] [filespec...] normal file name arguments';
+ print 'gperl [-h|--help] gives usage information';
+ print 'gperl [-v|--version] displays the version number';
+ print q(This program is a 'groff' preprocessor that handles Perl ) .
+ q(parts in 'roff' files.);
+ exit;
+ } elsif ( /^(-v|--v|--ve|--ver|--vers|--versi|--versio|--version)$/ ) {
+ print "gperl (groff @VERSION@) version $version";
+ exit;
+ }
+}
+
+
+#######################################################################
+# temporary file
+#######################################################################
+
+my $out_file;
+{
+ my $template = 'gperl_' . "$$" . '_XXXX';
+ my $tmpdir;
+ foreach ($ENV{'GROFF_TMPDIR'}, $ENV{'TMPDIR'}, $ENV{'TMP'}, $ENV{'TEMP'},
+ $ENV{'TEMPDIR'}, 'tmp', $ENV{'HOME'},
+ File::Spec->catfile($ENV{'HOME'}, 'tmp')) {
+ if ($_ && -d $_ && -w $_) {
+ eval { $tmpdir = tempdir( $template,
+ CLEANUP => 1, DIR => "$_" ); };
+ last if $tmpdir;
+ }
+ }
+ $out_file = File::Spec->catfile($tmpdir, $template);
+}
+
+
+########################################################################
+# input
+########################################################################
+
+my $perl_mode = 0;
+
+unshift @ARGV, '-' unless @ARGV;
+foreach my $filename (@ARGV) {
+ my $input;
+ if ($filename eq '-') {
+ $input = \*STDIN;
+ } elsif (not open $input, '<', $filename) {
+ warn $!;
+ next;
+ }
+ while (<$input>) {
+ chomp;
+ s/\s+$//;
+ my $line = $_;
+ my $is_dot_Perl = $line =~ /^[.']\s*Perl(|\s+.*)$/;
+
+ unless ( $is_dot_Perl ) { # not a '.Perl' line
+ if ( $perl_mode ) { # is running in Perl mode
+ print OUT $line;
+ } else { # normal line, not Perl-related
+ print $line;
+ }
+ next;
+ }
+
+
+ ##########
+ # now the line is a '.Perl' line
+
+ my $args = $line;
+ $args =~ s/\s+$//; # remove final spaces
+ $args =~ s/^[.']\s*Perl\s*//; # omit .Perl part, leave the arguments
+
+ my @args = split /\s+/, $args;
+
+ ##########
+ # start Perl mode
+ if ( @args == 0 || @args == 1 && $args[0] eq 'start' ) {
+ # For '.Perl' no args or first arg 'start' means opening 'Perl' mode.
+ # Everything else means an ending command.
+ if ( $perl_mode ) {
+ # '.Perl' was started twice, ignore
+ print STDERR q('.Perl' starter was run several times);
+ next;
+ } else { # new Perl start
+ $perl_mode = 1;
+ open OUT, '>', $out_file;
+ next;
+ }
+ }
+
+ ##########
+ # now the line must be a Perl ending line (stop)
+
+ unless ( $perl_mode ) {
+ print STDERR 'gperl: there was a Perl ending without being in ' .
+ 'Perl mode:';
+ print STDERR ' ' . $line;
+ next;
+ }
+
+ $perl_mode = 0; # 'Perl' stop calling is correct
+ close OUT; # close the storing of 'Perl' commands
+
+ ##########
+ # run this 'Perl' part, later on about storage of the result
+ # array stores prints with \n
+ my @print_res = `perl $out_file`;
+
+ # remove 'stop' arg if exists
+ shift @args if ( $args[0] eq 'stop' );
+
+ if ( @args == 0 ) {
+ # no args for saving, so @print_res doesn't matter
+ next;
+ }
+
+ my @var_names = ();
+ my @mode_names = ();
+
+ my $mode = '.ds';
+ for ( @args ) {
+ if ( /^\.?ds$/ ) {
+ $mode = '.ds';
+ next;
+ }
+ if ( /^\.?nr$/ ) {
+ $mode = '.nr';
+ next;
+ }
+ push @mode_names, $mode;
+ push @var_names, $_;
+ }
+
+ my $n_res = @print_res;
+ my $n_vars = @var_names;
+
+ if ( $n_vars < $n_res ) {
+ print STDERR 'gperl: not enough variables for Perl part: ' .
+ $n_vars . ' variables for ' . $n_res . ' output lines.';
+ } elsif ( $n_vars > $n_res ) {
+ print STDERR 'gperl: too many variablenames for Perl part: ' .
+ $n_vars . ' variables for ' . $n_res . ' output lines.';
+ }
+ if ( $n_vars < $n_res ) {
+ print STDERR 'gperl: not enough variables for Perl part: ' .
+ $n_vars . ' variables for ' . $n_res . ' output lines.';
+ }
+
+ my $n_min = $n_res;
+ $n_min = $n_vars if ( $n_vars < $n_res );
+ exit unless ( $n_min );
+ $n_min -= 1; # for starting with 0
+
+ for my $i ( 0..$n_min ) {
+ my $value = $print_res[$i];
+ chomp $value;
+ print $mode_names[$i] . ' ' . $var_names[$i] . ' ' . $value;
+ }
+ }
+}
+
+
+1;
+# Local Variables:
+# mode: CPerl
+# End:
diff --git a/contrib/gpinyin/ChangeLog b/contrib/gpinyin/ChangeLog
new file mode 100644
index 0000000..53cc228
--- /dev/null
+++ b/contrib/gpinyin/ChangeLog
@@ -0,0 +1,200 @@
+2022-10-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * gpinyin.pl: Report groff version number along with this
+ program's own when not run from source tree. Drop dead code.
+ Bump micro version number to reflect recent restructuring.
+
+2022-10-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Make gpinyin script stand alone.
+
+ * subs.pl: Delete, moving its content into...
+ * gpinyin.pl: ...here.
+ (vowel_t): Use explicit list with `my`.
+ (vowel_n, vowel_t): Declare local scalar `$vowel_with_tone`
+ using `my`.
+ * gpinyin.am (dist_gpinyin_DATA): Delete.
+
+2022-05-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * gpinyin.am (gpinyin): Fix missing dependency on
+ `$(SH_DEPS_SED_SCRIPT)`.
+
+2021-05-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * gpinyin.1.man: Render the tone mark table only if the output
+ device might be capable.
+
+ Fixes <https://savannah.gnu.org/bugs/index.php?55215>.
+
+2021-05-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * gpinyin.1.man: Work around inability of grops and gropdf to
+ construct some Unicode composite characters. Use groff
+ composite special characters for "a" with acute and grave
+ accents, and define strings for "a" with macron (overline) and
+ with háÄek/caron accents. Use different string definitions for
+ nroff and troff modes so we don't regress UTF-8 terminal output.
+
+2021-05-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * subs.pl (vowel_t): Fix incorrect rendering of base glyph 'U',
+ which was being forced to lowercase when a dieresis and tone
+ mark were both being applied. This caused the tone mark to
+ overlap the dieresis, so decrease the font size of the base
+ glyph even more to compensate. The result is ugly but
+ comprehensible.
+
+ See <https://savannah.gnu.org/bugs/?57524>, partially mitigated
+ but not completely resolved.
+
+2021-05-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * subs.pl (%tones1_Unicode): Fix copy and paste error. Emit
+ U+01D5 (Latin capital letter u with dieresis and macron) for Ü
+ with tone 1, instead of U+016A (Latin capital letter u with
+ macron).
+
+ Fixes <https://savannah.gnu.org/bugs/?60562>.
+
+2021-05-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * subs.pl (handle_word): Emit \[cq] instead of \[aq] when
+ interpolating an apostrophe before a vowel.
+
+ Fixes <https://savannah.gnu.org/bugs/?60561>.
+
+2021-05-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * subs.pl (%tones_glyphs, %tones4_glyphs): Fix hash keys to use
+ the groff dotless i special character into which a lowercase "i"
+ has already been transformed instead of 'i' itself.
+ (vowel_n, vowel_t): Rename variable so that tone-transformed
+ vowel is stored separately. Add "or warn" to test the result
+ and cheaply assert that we got a string back from our hash
+ lookup on the vowel.
+
+ Fixes <https://savannah.gnu.org/bugs/?60560>.
+
+2021-01-06 Colin Watson <cjwatson@debian.org>
+
+ * gpinyin.pl: Avoid Perl's unsafe "<>" operator.
+
+ The "<>" operator is implemented using the two-argument form of
+ "open", which interprets magic such as pipe characters, allowing
+ execution of arbitrary commands which is unlikely to be
+ expected. Perl >= 5.22 has a "<<>>" operator which avoids this,
+ but also forbids the use of "-" to mean the standard input,
+ which is a facility that the affected groff programs document.
+
+ ARGV::readonly would probably also fix this, but I fundamentally
+ dislike the approach of escaping data in preparation for a
+ language facility to unescape it, especially when the required
+ escaping is as non-obvious as it is here. (For the same reason,
+ I prefer to use subprocess invocation facilities that allow
+ passing the argument list as a list rather than as a string to
+ be interpreted by the shell.) So I've abandoned this dubious
+ convenience and changed the affected programs to iterate over
+ command-line arguments manually using the three-argument form of
+ open.
+
+ Fixes <https://savannah.gnu.org/bugs/?55557>.
+
+2020-04-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * gpinyin.1.man: Delete references to groffer.
+
+2018-02-28 Werner LEMBERG <wl@gnu.org>
+
+ * gpinyin.am (gpinyin): Use $(AM_V_GEN) to silence file generation.
+
+2015-08-22 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gpinyin.1.man: Rename `gpinyin.man'.
+
+ * gpinyin.am: include renaming.
+
+2015-08-05 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gpinyin.am: Add `Last update'. Setup Emacs mode.
+
+2015-04-03 Werner LEMBERG <wl@gnu.org>
+
+ * gpinyin.man: Make it work in compatibility mode.
+ (EL): Fix typo.
+
+2014-10-11 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile.sub (gpinyin): Handle `gpinyin_dir'.
+
+2014-10-11 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gpinyin.pl: Version 1.0.4
+ Remove `use IPC::System::Simple'.
+
+2014-10-10 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gpinyin.pl: Version 1.0.3
+ Remove beginning empty line for `pinyin' parts.
+
+2014-09-25 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gpinyin.pl: Version 1.0.2
+
+ * Makefile.sub: Add .PHONY. Restructure install and uninstall.
+
+2014-09-03 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ Version 1.0.1
+
+ * all `gpinyin' files: Copying and Emacs settings.
+
+2014-08-27 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ Version 1.0.0
+
+ * gpinyin.pl, subs.pl, gpinyin.man: Make `gpinyin' runnable.
+
+2014-08-08 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gpinyin.pl: Version 0.9.2
+
+ * subs.pl: Rename `sub.pl'.
+
+ * Makefile.sub: Change `sub.pl' to `subs.pl'.
+
+2014-08-08 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gpinyin.pl: Version 0.9.1
+
+ * sub.pl: New file for storing subs later on.
+
+ * Makefile.sub: Add new gpinyin path for sub.pl.
+
+2014-08-01 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * gpinyin.pl, gpinyin.man, ChangeLog, Makefile.sub:
+ First version 0.9.0 of gpinyin
+
+2014-08-01 Bernd Warken <groff-bernd.warken-72@web.de>
+________________________________________________________________________
+License
+
+Copyright (C) 2014-2020 Free Software Foundation, Inc.
+Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+
+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 `gpinyin', which is part of the `groff'
+project.
+
+##### Editor settings
+
+Local Variables:
+fill-column: 72
+mode: change-log
+version-control: never
+End:
+vim:set autoindent textwidth=72:
diff --git a/contrib/gpinyin/gpinyin.1.man b/contrib/gpinyin/gpinyin.1.man
new file mode 100644
index 0000000..3c3884e
--- /dev/null
+++ b/contrib/gpinyin/gpinyin.1.man
@@ -0,0 +1,378 @@
+'\" t
+.TH gpinyin @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+gpinyin \- use Hanyu Pinyin Chinese in
+.I groff
+documents
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2014-2020 Free Software Foundation, Inc.
+.\"
+.\" This file is part of gpinyin, which is part of groff, a free
+.\" software project.
+.\"
+.\" You can redistribute it and/or modify it under the terms of the GNU
+.\" General Public License version 2 as published by the Free Software
+.\" Foundation.
+.\"
+.\" The license text is available in the internet at
+.\" <http://www.gnu.org/licenses/gpl-2.0.html>.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_gpinyin_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.\" Local definitions
+.\" ====================================================================
+.
+.\" Define a string for the TeX logo.
+.ie t .ds TeX T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X
+.el .ds TeX TeX
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY gpinyin
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY gpinyin
+.B \-h
+.
+.SY gpinyin
+.B \-\-help
+.YS
+.
+.SY gpinyin
+.B \-v
+.
+.SY gpinyin
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I gpinyin
+is a preprocessor for
+.MR groff @MAN1EXT@
+that facilitates use of Hanyu Pinyin in
+.MR groff @MAN7EXT@
+files.
+.
+Pinyin is a method for writing the Mandarin Chinese language with the
+Latin alphabet.
+.
+Mandarin consists of more than four hundred base syllables,
+each spoken with one of five different tones.
+.
+Changing the tone applied to the syllable generally alters the meaning
+of the word it forms.
+.
+In Pinyin,
+a syllable is written in the Latin alphabet and a numeric tone indicator
+can be appended to each syllable.
+.
+.
+.P
+Each
+.I input-file
+is a file name or the character
+.RB \[lq] \- \[rq]
+to indicate that the standard input stream should be read.
+.
+As usual,
+the argument
+.RB \[lq] \-\- \[rq]
+can be used in order to force interpretation of all remaining arguments
+as file names,
+even if an
+.I input-file
+argument begins with a
+.RB \[lq] \- \[rq].
+.
+.B \-h
+and
+.B \-\-help
+display a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.\" ====================================================================
+.SS "Pinyin sections"
+.\" ====================================================================
+.
+Pinyin sections in
+.I groff
+files are enclosed by two
+.B .pinyin
+requests with different arguments.
+.
+The starting request is
+.RS
+.EX
+\&.pinyin start
+.EE
+.RE
+or
+.RS
+.EX
+\&.pinyin begin
+.EE
+.RE
+and the ending request is
+.RS
+.EX
+\&.pinyin stop
+.EE
+.RE
+or
+.RS
+.EX
+\&.pinyin end
+.EE
+.RE
+\&.
+.
+.
+.\" ====================================================================
+.SS Syllables
+.\" ====================================================================
+.
+In Pinyin,
+each syllable is represented by one to six letters drawn from the
+fifty-two upper- and lowercase letters of the Unicode basic Latin
+character set,
+plus the letter \[lq]U\[rq] with dieresis (umlaut) in both cases\[em]in
+other words,
+the members of the set \[lq][a\[en]zA\[en]Z\[:u]\[:U]]\[rq].
+.
+.
+.P
+In
+.I groff
+input,
+all basic Latin letters are written as themselves.
+.
+The \[lq]u with dieresis\[rq] can be written as
+\[lq]\e[:u]\[rq]
+in lowercase or
+\[lq]\e[:U]\[rq]
+in uppercase.
+.
+Within
+.B .pinyin
+sections,
+.I gpinyin
+supports the form
+\[lq]ue\[rq]
+for lowercase and the forms
+\[lq]Ue\[rq]
+and
+\[lq]UE\[rq]
+for uppercase.
+.
+.
+.\" ====================================================================
+.SS Tones
+.\" ====================================================================
+.
+Each syllable has exactly one of five
+.IR tones .
+.
+The fifth tone is not explicitly written at all,
+but each of the first through fourth tones is indicated with a diacritic
+above a specific vowel within the syllable.
+.
+.
+.P
+In a
+.I gpinyin
+source file,
+these tones are written by adding a numeral in the range 0 to 5 after
+the syllable.
+.
+The tone numbers 1 to 4 are transformed into accents above vowels in the
+output.
+.
+The tone numbers 0 and 5 are synonymous.
+.
+.
+.P
+.nr gpinyin*do-table 0
+.if t .nr gpinyin*do-table 1
+.if n .if '\*[.T]'utf8' .nr gpinyin*do-table 1
+.\" XXX: One hack necessitates another; since our table is conditional,
+.\" we need to save the input line counter.
+.nr gpinyin*.c \n[.c]
+.ie \n[gpinyin*do-table] \{\
+The tones are written as follows.
+.
+.
+.P
+.\" XXX: This is so gross. Why can't grops and gropdf figure this out?
+.if t .ds a- \za\[a-]
+.if n .ds a- \[a a-]
+.if t .ds a< \za\[ah]
+.if n .ds a< \[a ah]
+.if t .ne 8 \" Try to keep the table on one page for printed output.
+.TS
+l l l l l.
+Tone Description Diacritic Example Input Example Output
+_
+first flat \[a-] ma1 m\*[a-]
+second rising \[aa] ma2 m\[a aa]
+third falling-rising \[ah] ma3 m\*[a<]
+fourth falling \[ga] ma4 m\[a ga]
+fifth neutral (none) ma0 ma
+\^ \^ \^ ma5 \^
+.TE
+.\}
+.lf (\n[gpinyin*.c] + 25) \" XXX part 2: Restore input line counter.
+.el \{\
+[The tone mark table is omitted from this rendering of the man page
+because the selected output device \[lq]\*[.T]\[rq] lacks the character
+repertoire to display it.
+.
+Try another output device.]
+.\}
+.rm a-
+.rm a<
+.rr gpinyin*do-table
+.
+.
+.P
+The neutral tone number can be omitted from a word-final syllable,
+but not otherwise.
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+.I gpinyin
+was written by
+.MT groff\-bernd\:.warken\-72@\:web\:.de
+Bernd Warken
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+Useful documents on the World Wide Web related to Pinyin include
+.RS 4n
+.UR http://\:www\:.foolsworkshop\:.com/\:ptou/\:index\:.html
+.I Pinyin to Unicode
+.UE ,
+.
+.br
+.UR http://\:www\:.mandarintools\:.com/
+.I On-line Chinese Tools \" sic: On-line
+.UE ,
+.
+.br
+.\" XXX: Turning off adjustment like this is ugly; thanks to meter-long
+.\" URLs we need an escape sequence that selectively disables adjustment
+.\" at the end of a word.
+.na
+.UR http://\:www\:.pinyin\:.info/\:index\:.html
+.I Pinyin.info: a guide to the writing of Mandarin Chinese in \
+romanization
+.UE ,
+.ad \*[AD]
+.
+.br
+.UR http://\:www\:.pinyin\:.info/\:rules/\:where.html
+\[lq]Where do the tone marks go?\[rq]
+.UE ,
+.
+.br
+.UR http://\:git\:.savannah\:.gnu\:.org/\:gitweb/\:\
+?p=cjk\:.git\:;a=blob_plain\:;f=doc/\:pinyin\:.txt\:;hb=HEAD
+.I pinyin.txt
+from the CJK macro package for \*[TeX]
+.UE ,
+.br
+.RS -4n
+and
+.RE
+.
+.br
+.\" XXX: Same ugliness as before.
+.na
+.UR http://\:git\:.savannah\:.gnu\:.org/\:gitweb/\:\
+?p=cjk\:.git\:;a=blob_plain\:;f=texinput/\:pinyin\:.sty\:;hb=HEAD
+.I pinyin.sty
+from the CJK macro package for \*[TeX]
+.UE .
+.ad \*[AD]
+.
+.RE
+.
+.
+.P
+.MR groff @MAN1EXT@
+and
+.MR grog @MAN1EXT@
+explain how to view
+.I roff
+documents.
+.
+.
+.P
+.MR groff @MAN7EXT@
+and
+.MR groff_char @MAN7EXT@
+are comprehensive references covering the language elements of GNU
+.I troff \" GNU
+and the available glyph repertoire,
+respectively.
+.
+.
+.\" Clean up.
+.rm TeX
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_gpinyin_1_man_C]
+.do rr *groff_gpinyin_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/gpinyin/gpinyin.am b/contrib/gpinyin/gpinyin.am
new file mode 100644
index 0000000..78cc35a
--- /dev/null
+++ b/contrib/gpinyin/gpinyin.am
@@ -0,0 +1,56 @@
+# Automake rules for 'gpinyin' (preprocessor for added Perl parts)
+
+# Copyright (C) 2014-2020 Free Software Foundation, Inc.
+# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+# Moved to automake by Bertrand Garrigues
+
+# This file is part of 'gpinyin' 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 of the License, 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 this program. If not, see
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+gpinyin_srcdir = $(top_srcdir)/contrib/gpinyin
+bin_SCRIPTS += gpinyin
+gpinyindir = $(gpinyin_dir)
+man1_MANS += contrib/gpinyin/gpinyin.1
+EXTRA_DIST += \
+ contrib/gpinyin/ChangeLog \
+ contrib/gpinyin/gpinyin.1.man \
+ contrib/gpinyin/gpinyin.pl
+
+gpinyin: contrib/gpinyin/gpinyin.pl $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)sed -f "$(SH_DEPS_SED_SCRIPT)" \
+ -e "s|[@]g[@]|$(g)|g" \
+ -e "s|[@]BINDIR[@]|$(DESTDIR)$(bindir)|g" \
+ -e "s|[@]gpinyin_dir[@]|$(DESTIR)$(gpinyin_dir)|" \
+ -e "s|[@]VERSION[@]|$(VERSION)|g" \
+ -e "$(SH_SCRIPT_SED_CMD)" \
+ $(gpinyin_srcdir)/gpinyin.pl \
+ >$@ \
+ && chmod +x $@
+
+uninstall_groffdirs: uninstall-gpinyin-hook
+uninstall-gpinyin-hook:
+ if test -d $(DESTDIR)$(gpinyindir); then \
+ rmdir $(DESTDIR)$(gpinyindir); \
+ fi
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/contrib/gpinyin/gpinyin.pl b/contrib/gpinyin/gpinyin.pl
new file mode 100755
index 0000000..73b3034
--- /dev/null
+++ b/contrib/gpinyin/gpinyin.pl
@@ -0,0 +1,725 @@
+#! /usr/bin/env perl
+
+# gpinyin - European-like Chinese writing 'pinyin' into 'groff'
+
+# Copyright (C) 2014-2020 Free Software Foundation, Inc.
+
+# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
+
+my $version = '1.0.5';
+my $groff_version = '(groff @VERSION@) '; # with trailing space
+
+# This file is part of 'gpinyin', 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 of the License, 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 can find a copy of the GNU General Public License in the internet
+# at <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+use strict;
+use warnings;
+#use diagnostics;
+
+# temporary dir and files
+use File::Temp qw/ tempfile tempdir /;
+
+# needed for temporary dir
+use File::Spec;
+
+# for 'copy' and 'move'
+use File::Copy;
+
+# for fileparse, dirname and basename
+use File::Basename;
+
+# current working directory
+use Cwd;
+
+# $Bin is the directory where this script is located
+use FindBin;
+
+
+########################################################################
+# system variables and exported variables
+########################################################################
+
+$\ = "\n"; # final part for print command
+
+{
+ my $at = '@';
+ $groff_version = '' if '@VERSION@' eq "${at}VERSION${at}";
+}
+
+########################################################################
+# All Pinyin syllables from wikipedia
+########################################################################
+
+my %syllables =
+ (
+ 'a' => 1, 'ai' => 1, 'an' => 1, 'ang' => 1, 'ao' => 1,
+ 'ba' => 1, 'bai' => 1, 'ban' => 1, 'bang' => 1, 'bao' => 1,
+ 'bei' => 1, 'ben' => 1, 'beng' => 1,
+ 'bi' => 1, 'bian' => 1, 'biao' => 1, 'bie' => 1, 'bin' => 1,
+ 'bing' => 1, 'bo' => 1, 'bu' => 1,
+ 'ca' => 1, 'cai' => 1, 'can' => 1, 'cang' => 1, 'cao' => 1,
+ 'ce' => 1, 'cen' => 1, 'ceng' => 1,
+ 'cha' => 1, 'chai' => 1, 'chan' => 1, 'chang' => 1, 'chao' => 1,
+ 'che' => 1, 'chen' => 1, 'cheng' => 1, 'chi' => 1,
+ 'chong' => 1, 'chou' => 1, 'chu' => 1,
+ 'chua' => 1, 'chuai' => 1, 'chuan' => 1, 'chuang' => 1,
+ 'chui' => 1, 'chun' => 1, 'chuo' => 1,
+ 'ci' => 1, 'cong' => 1, 'cou' => 1,
+ 'cu' => 1, 'cuan' => 1, 'cui' => 1, 'cun' => 1, 'cuo' => 1,
+ 'da' => 1, 'dai' => 1, 'dan' => 1, 'dang' => 1, 'dao' => 1,
+ 'de' => 1, 'dei' => 1, 'den' => 1, 'deng' => 1,
+ 'di' => 1, 'dian' => 1, 'diao' => 1, 'die' => 1,
+ 'ding' => 1, 'diu' => 1, 'dong' => 1, 'dou' => 1,
+ 'du' => 1, 'duan' => 1, 'dui' => 1, 'dun' => 1, 'duo' => 1,
+ 'e' => 1, 'ei' => 1, 'en' => 1, 'eng' => 1, 'er' => 1,
+ 'fa' => 1, 'fan' => 1, 'fang' => 1,
+ 'fei' => 1, 'fen' => 1, 'feng' => 1, 'fiao' => 1,
+ 'fo' => 1, 'fou' => 1, 'fu' => 1,
+ 'ga' => 1, 'gai' => 1, 'gan' => 1, 'gang' => 1, 'gao' => 1,
+ 'ge' => 1, 'gei' => 1, 'gen' => 1, 'geng' => 1,
+ 'gong' => 1, 'gou' => 1, 'gu' => 1,
+ 'gua' => 1, 'guai' => 1, 'guan' => 1, 'guang' => 1, 'gui' => 1,
+ 'gun' => 1, 'guo' => 1,
+ 'ha' => 1, 'hai' => 1, 'han' => 1, 'hang' => 1, 'hao' => 1,
+ 'he' => 1, 'hei' => 1, 'hen' => 1, 'heng' => 1,
+ 'hong' => 1, 'hou' => 1,
+ 'hu' => 1, 'hua' => 1, 'huai' => 1, 'huan' => 1, 'huang' => 1,
+ 'hui' => 1, 'hun' => 1, 'huo' => 1,
+ 'ji' => 1, 'jia' => 1, 'jian' => 1, 'jiang' => 1, 'jiao' => 1,
+ 'jie' => 1, 'jin' => 1, 'jing' => 1, 'jiong' => 1, 'jiu' => 1,
+ 'ju' => 1, 'juan' => 1, 'jue' => 1, 'jun' => 1,
+ 'ka' => 1, 'kai' => 1, 'kan' => 1, 'kang' => 1, 'kao' => 1,
+ 'ke' => 1, 'kei' => 1, 'ken' => 1, 'keng' => 1,
+ 'kong' => 1, 'kou' => 1, 'ku' => 1, 'kua' => 1, 'kuai' => 1,
+ 'kuan' => 1, 'kuang' => 1, 'kui' => 1, 'kun' => 1, 'kuo' => 1,
+ 'la' => 1, 'lai' => 1, 'lan' => 1, 'lang' => 1, 'lao' => 1,
+ 'le' => 1, 'lei' => 1, 'leng' => 1,
+ 'li' => 1, 'lia' => 1, 'lian' => 1, 'liang' => 1, 'liao' => 1,
+ 'lie' => 1, 'lin' => 1, 'ling' => 1, 'liu' => 1,
+ 'lo' => 1, 'long' => 1, 'lou' => 1,
+ 'lu' => 1, 'luan' => 1, 'lun' => 1, 'luo' => 1,
+ 'lü' => 1, 'lüe' => 1,
+ 'ma' => 1, 'mai' => 1, 'man' => 1, 'mang' => 1, 'mao' => 1,
+ 'me' => 1, 'mei' => 1, 'men' => 1, 'meng' => 1,
+ 'mi' => 1, 'mian' => 1, 'miao' => 1, 'mie' => 1,
+ 'min' => 1, 'ming' => 1, 'miu' => 1,
+ 'mo' => 1, 'mou' => 1, 'mu' => 1,
+ 'na' => 1, 'nai' => 1, 'nan' => 1, 'nang' => 1, 'nao' => 1,
+ 'ne' => 1, 'nei' => 1, 'nen' => 1, 'neng' => 1,
+ 'ni' => 1, 'nian' => 1, 'niang' => 1, 'niao' => 1, 'nie' => 1,
+ 'nin' => 1, 'ning' => 1, 'niu' => 1, 'nong' => 1, 'nou' => 1,
+ 'nu' => 1, 'nuan' => 1, 'nun' => 1, 'nuo' => 1,
+ 'nü' => 1, 'nüe' => 1,
+ 'o' => 1, 'ong' => 1, 'ou' => 1,
+ 'pa' => 1, 'pai' => 1, 'pan' => 1, 'pang' => 1, 'pao' => 1,
+ 'pei' => 1, 'pen' => 1, 'peng' => 1,
+ 'pi' => 1, 'pian' => 1, 'piao' => 1, 'pie' => 1, 'pin' => 1,
+ 'ping' => 1, 'po' => 1, 'pou' => 1, 'pu' => 1,
+ 'qi' => 1, 'qia' => 1, 'qian' => 1, 'qiang' => 1, 'qiao' => 1, 'qie' => 1,
+ 'qin' => 1, 'qing' => 1, 'qiong' => 1, 'qiu' => 1,
+ 'qu' => 1, 'quan' => 1, 'que' => 1, 'qun' => 1,
+ 'ran' => 1, 'rang' => 1, 'rao' => 1, 're' => 1, 'ren' => 1,
+ 'ri' => 1, 'rong' => 1, 'rou' => 1,
+ 'ru' => 1, 'ruan' => 1, 'rui' => 1, 'run' => 1, 'ruo' => 1,
+ 'sa' => 1, 'sai' => 1, 'san' => 1, 'sang' => 1, 'sao' => 1,
+ 'se' => 1, 'sen' => 1, 'seng' => 1,
+ 'sha' => 1, 'shai' => 1, 'shan' => 1, 'shang' => 1, 'shao' => 1,
+ 'she' => 1, 'shei' => 1, 'shen' => 1, 'sheng' => 1, 'shi' => 1,
+ 'shou' => 1, 'shu' => 1, 'shua' => 1, 'shuai' => 1, 'shuan' => 1,
+ 'shuang' => 1, 'shui' => 1, 'shun' => 1, 'shuo' => 1,
+ 'si' => 1, 'song' => 1, 'sou' => 1, 'su' => 1, 'suan' => 1, 'sui' => 1,
+ 'sun' => 1, 'suo' => 1,
+ 'ta' => 1, 'tai' => 1, 'tan' => 1, 'tang' => 1, 'tao' => 1,
+ 'te' => 1, 'teng' => 1,
+ 'ti' => 1, 'tian' => 1, 'tiao' => 1, 'tie' => 1, 'ting' => 1,
+ 'tong' => 1, 'tou' => 1,
+ 'tu' => 1, 'tuan' => 1, 'tui' => 1, 'tun' => 1, 'tuo' => 1,
+ 'wa' => 1, 'wai' => 1, 'wan' => 1, 'wang' => 1,
+ 'wei' => 1, 'wen' => 1, 'weng' => 1, 'wo' => 1, 'wu' => 1,
+ 'xi' => 1, 'xia' => 1, 'xian' => 1, 'xiang' => 1, 'xiao' => 1,
+ 'xie' => 1, 'xin' => 1, 'xing' => 1, 'xiong' => 1, 'xiu' => 1,
+ 'xu' => 1, 'xuan' => 1, 'xue' => 1, 'xun' => 1,
+ 'ya' => 1, 'yai' => 1, 'yan' => 1, 'yang' => 1, 'yao' => 1,
+ 'ye' => 1, 'yi' => 1, 'yin' => 1, 'ying' => 1,
+ 'yo' => 1, 'yong' => 1, 'you' => 1,
+ 'yu' => 1, 'yuan' => 1, 'yue' => 1, 'yun' => 1,
+ 'za' => 1, 'zai' => 1, 'zan' => 1, 'zang' => 1, 'zao' => 1,
+ 'ze' => 1, 'zei' => 1, 'zen' => 1, 'zeng' => 1,
+ 'zha' => 1, 'zhai' => 1, 'zhan' => 1, 'zhang' => 1, 'zhao' => 1,
+ 'zhe' => 1, 'zhei' => 1, 'zhen' => 1, 'zheng' => 1, 'zhi' => 1,
+ 'zhong' => 1, 'zhou' => 1, 'zhu' => 1, 'zhua' => 1, 'zhuai' => 1,
+ 'zhuan' => 1, 'zhuang' => 1, 'zhui' => 1, 'zhun' => 1, 'zhuo' => 1,
+ 'zi' => 1, 'zong' => 1, 'zou' => 1, 'zu' => 1, 'zuan' => 1,
+ 'zui' => 1, 'zun' => 1, 'zuo' => 1,
+ );
+
+########################################################################
+# Unicode variables for utf8 tty (nroff)
+########################################################################
+
+my %tones1_Unicode =
+ (
+ 'A' => q(\\[u0100]),
+ 'E' => q(\\[u0112]),
+ 'I' => q(\\[u012A]),
+ 'O' => q(\\[u014C]),
+ 'U' => q(\\[u016A]),
+ 'Ü' => q(\\[u01D5]),
+ 'a' => q(\\[u0101]),
+ 'e' => q(\\[u0113]),
+ 'i' => q(\\[u012B]),
+ 'o' => q(\\[u014D]),
+ 'u' => q(\\[u016B]),
+ 'ü' => q(\\[u01D6]),
+ );
+
+my %tones2_Unicode =
+ (
+ 'A' => q(\\[u00C1]),
+ 'E' => q(\\[u00C9]),
+ 'I' => q(\\[u00CD]),
+ 'O' => q(\\[u00D3]),
+ 'U' => q(\\[u00DA]),
+ 'Ü' => q(\\[u01D7]),
+ 'a' => q(\\[u00E1]),
+ 'e' => q(\\[u00E9]),
+ 'i' => q(\\[u00ED]),
+ 'o' => q(\\[u00F3]),
+ 'u' => q(\\[u00FA]),
+ 'ü' => q(\\[u01D8]),
+ );
+
+my %tones3_Unicode =
+ (
+ 'A' => q(\\[u01CD]),
+ 'E' => q(\\[u011A]),
+ 'I' => q(\\[u01CF]),
+ 'O' => q(\\[u01D1]),
+ 'U' => q(\\[u01D3]),
+ 'Ü' => q(\\[u01D9]),
+ 'a' => q(\\[u01CE]),
+ 'e' => q(\\[u011B]),
+ 'i' => q(\\[u01D0]),
+ 'o' => q(\\[u01D2]),
+ 'u' => q(\\[u01D4]),
+ 'ü' => q(\\[u01DA]),
+ );
+
+my %tones4_Unicode =
+ (
+ 'A' => q(\\[u00C0]),
+ 'E' => q(\\[u00C8]),
+ 'I' => q(\\[u00CC]),
+ 'O' => q(\\[u00D2]),
+ 'U' => q(\\[u00D9]),
+ 'Ü' => q(\\[u01DB]),
+ 'a' => q(\\[u00E0]),
+ 'e' => q(\\[u00E8]),
+ 'i' => q(\\[u00EC]),
+ 'o' => q(\\[u00F2]),
+ 'u' => q(\\[u00F9]),
+ 'ü' => q(\\[u01DC]),
+ );
+
+
+########################################################################
+# glyph variables for troff
+########################################################################
+
+#my $tone1_macron = '\\[a-]';
+#my $tone2_acute = '\\[aa]';
+#my $tone3_caron = '\\[ah]';
+#my $tone4_grave = '\\[ga]';
+my @accents = ( '', '\\[a-]', '\\[aa]', '\\[ah]', '\\[ga]', );
+
+my %tones2_glyphs =
+ (
+ 'A' => q(\\['A]),
+ 'E' => q(\\['E]),
+ 'I' => q(\\['I]),
+ 'O' => q(\\['O]),
+ 'U' => q(\\['U]),
+ 'a' => q(\\['a]),
+ 'e' => q(\\['e]),
+ '\\[.i]' => q(\\['i]),
+ 'o' => q(\\['o]),
+ 'u' => q(\\['u]),
+ );
+
+my %tones4_glyphs =
+ (
+ 'A' => q(\\[`A]),
+ 'E' => q(\\[`E]),
+ 'I' => q(\\[`I]),
+ 'O' => q(\\[`O]),
+ 'U' => q(\\[`U]),
+ 'a' => q(\\[`a]),
+ 'e' => q(\\[`e]),
+ '\\[.i]' => q(\\[`i]),
+ 'o' => q(\\[`o]),
+ 'u' => q(\\[`u]),
+ );
+
+
+
+########################################################################
+# subs
+########################################################################
+
+# Pinyin consists of syllables with a final number to be translated
+# into an accent. Such numbered syllables are combined into words.
+# Such words can have a final punctuation. A line is a collection of
+# such words.
+
+my @roffs = ( 'n',
+ 't',
+ );
+
+########################################################################
+sub err {
+ my $s = shift;
+ print STDERR $s;
+ 1;
+} # err()
+
+
+########################################################################
+sub handle_line {
+ my $starting_blanks = shift;
+ my $line = shift;
+
+#&err('handle_line start: ' . $line);
+
+ my %outline = ( 'n' => $starting_blanks, 't' => $starting_blanks, );
+
+ # transform to Ü only for inside of Perl
+ $line =~ s/\\
+ \(:U
+ /Ü/gx;
+ $line =~ s/\\
+ \[:U\]
+ /Ü/gx;
+
+# handle_line()
+
+ # transform to ü only for inside of Perl
+ $line =~ s/\\
+ \(:u
+ /ü/gx;
+ $line =~ s/\\
+ \[:u\]
+ /ü/gx;
+
+ $line =~ s/U[eE]/Ü/g;
+ $line =~ s/u[eE]/ü/g;
+
+ $line =~ s/\\\(aq/'/g; # \(aq is an apostrophe
+ $line =~ s/\\\[aq\]/'/g; # \[aq] is an apostrophe
+ $line =~ s/^[']//; # remove leading apostrophe
+ $line =~ s/[']$//; # remove final apostrophe
+ $line =~ s/['][']+/'/g; # combine apostrophe groups
+ $line =~ s/([0-4])'/$1/;
+ $line =~ s/([^0-4])'/${1}0/;
+
+ my @words = split /\s+/, $line;
+
+
+# handle_line()
+ for my $word ( @words ) {
+#&err('handle_line word: ' . $word);
+
+ next unless ( $word );
+
+ # this is a word, maybe composed of several syllables
+ my $punctuation = $1 if ( $word =~ s/([,.?!:;]*)$// );
+ # '$word' is now without punctuation
+
+ my %outword = &handle_word($word);
+ next unless ( %outword );
+
+ for my $roff ( @roffs ) {
+#&err('handle_line roff ' . $roff . ': ' . $outword{$roff});
+
+ # combine words to line
+ next unless ( $outword{$roff} );
+
+ # non-initial space
+ $outline{$roff} .= ' ' if ( $outline{$roff} );
+
+ $outline{$roff} .= $outword{$roff};
+ $outline{$roff} .= $punctuation;
+ }
+ }
+#for my $roff ( @roffs ) {
+#&err('handle_line end ' . $roff . ': ' . $outline{$roff});
+#}
+ return %outline;
+} # handle_line()
+
+
+########################################################################
+sub handle_word {
+ my $word = shift;
+#&err('handle_word start: ' . $word);
+
+ $word =~ s/5/0/g; # transform 5 to 0
+ $word =~ s/([^0-4])$/${1}0/; # add lacking final no-tone
+
+ # remove apostrophes with tone
+ $word =~ s/
+ ([0-4])
+ [']
+ /$1/gx;
+ # replace apostrophes without tone by 0
+ $word =~ s/
+ ([^0-4])
+ [']
+ /${1}0/gx;
+
+# handle_word()
+ # detect wrong tone numbers
+ if ( $word =~ s/[5-9]/0/g ) {
+ &err('word ' . $word . ': wrong tone number ' . $1);
+ return {};
+ }
+
+ $word =~ s/[']//g; # remove apostrophes
+
+ # remove starting apostrophe or number
+ $word =~ s/^(['0-4])+//;
+
+ # add 0 for final no-tone
+ $word .= '0' if ( $word =~ /[^0-4]$/ );
+
+ if ( $word =~ /^[0-9]/ ) { # word starts with number
+ print 'word: ' . $word . ' starts with tone number';
+ $word =~ s/^[0-9]+//;
+ }
+#&err('handle_word 0: ' . $word);
+
+# handle_word()
+
+ my %outword = ( 'n' => '', 't' => '', );
+
+ # split word into syllables
+ while ( $word =~ /^[a-zA-ZüÜ']/ ) {
+ $word =~ s/^([a-zA-ZüÜ']+)([0-4])//;
+ my $syll = $1;
+ my $tone = $2;
+#err('handle_word split: ' . $syll . ' ' . $tone);
+ my %outsyll = &handle_syll( $syll, $tone );
+ next unless ( %outsyll );
+ for my $roff ( @roffs ) {
+ my $out = $outsyll{$roff};
+ $out = '\\[cq]' . $out if ( $out && $out =~ /^[aeo]/ );
+ $outword{$roff} .= $out;
+#&err('handle_word ' . $roff . ': ' . $outword{$roff});
+ }
+ }
+ return %outword;
+} # handle_word()
+
+
+########################################################################
+sub handle_syll {
+ my $syll = shift;
+ my $tone = shift;
+#&err( 'handle_syll start: ' . $syll . ' ' . $tone);
+
+ my $lower_case = lc($syll);
+ $lower_case =~ s/Ü/ü/g;
+ unless ( exists($syllables{$lower_case}) ) {
+ err('The syllable ' . $syll . ' is not a Chinese syllable.');
+ return {};
+ }
+
+ my %outsyll = ( 'n' => '', 't' => '', );
+
+ if ( $tone == 0 ) { # no accent
+ # use u umlaut without accent
+ $syll =~ s/Ü/\\[:U]/g;
+ $syll =~ s/ü/\\[:u]/g;
+
+ for my $roff ( @roffs ) {
+ $outsyll{$roff} = $syll;
+#&err('handle_syll 0 outsyll ' . $roff . ': ' . $outsyll{$roff});
+ }
+ return %outsyll;
+ } # end of tone 0
+
+# handle_syll()
+
+ # split syllable
+ $syll =~
+ /^
+ ([a-zA-Z]*)
+ ([aeiouAEIOUüÜ]+)
+ ([a-zA-Z]*)
+ $/x;
+ my $initial = $1;
+ my $vowels = $2;
+ my $final = $3;
+ unless ( $vowels ) {
+ &err( 'Syllable ' . $syll . ' does not have vowels' );
+ return {};
+ }
+
+ # split vowels
+ my $vowels_before = '';
+ my $vowel = '';
+ my $vowels_after = '';
+
+# handle_syll()
+
+ # find vowel for accent
+ if ( $vowels =~ /^[aeiouAEIOU]$/ ) { # only 1 vowel
+#&err('handle_syll single vowel ' . $vowels);
+ $vowel = $vowels;
+ } elsif ( $vowels eq 'ü' ) {
+ $vowel = $vowels;
+ } elsif ( $vowels eq 'Ü' ) {
+ $vowel = $vowels;
+ } elsif ( $vowels =~ /^([^aeAE]*)([aeAE])(.*)$/ ) { # a, A, e or E
+ $vowels_before = $1;
+ $vowel = $2;
+ $vowels_after = $3;
+ } elsif ( $vowels =~ /^([^oO]*)(oO)(.*)$/ ) { # o or O
+ $vowels_before = $1;
+ $vowel = $2;
+ $vowels_after = $3;
+ } elsif ( $vowels =~ /^(\w)(\w)(.*)$/ ) { # take 2nd vowel
+ $vowels_before = $1;
+ $vowel = $2;
+ $vowels_after = $3;
+ } else {
+ &err( 'Unknown vowels: ' . $vowels . ' in syllable: ' . $syll );
+ return {};
+ }
+
+# unless ( $vowel =~ /^[aeiouAEIOU]$/ ) {
+# print STDERR q(The argument ') . $vowel . q(' is not a vowel!);
+# return {};
+# }
+
+# handle_syll()
+
+ $outsyll{'n'} = &vowel_n($vowel, $tone);
+ $outsyll{'t'} = &vowel_t($vowel, $tone);
+
+ for my $roff ( @roffs ) {
+ $outsyll{$roff} = $initial . $vowels_before .
+ $outsyll{$roff} . $vowels_after . $final;
+#&err('handle_syll out ' . $roff . ': ' . $outsyll{$roff});
+ }
+
+ return %outsyll;
+} # handle_syll()
+
+
+########################################################################
+sub vowel_n { # Unicode for nroff
+ my $vowel = shift;
+ my $tone = shift;
+#&err('vowel_n: ' . $vowel . ' ' . $tone);
+
+ return '' unless ( $vowel );
+
+ my $vowel_with_tone;
+ if ( $tone == 1 ) { # macron
+ $vowel_with_tone = $tones1_Unicode{$vowel};
+ } elsif ( $tone == 2 ) { # acute
+ $vowel_with_tone = $tones2_Unicode{$vowel};
+ } elsif ( $tone == 3 ) { # caron
+ $vowel_with_tone = $tones3_Unicode{$vowel};
+ } elsif ( $tone == 4 ) { # grave
+ $vowel_with_tone = $tones4_Unicode{$vowel};
+ }
+ $vowel_with_tone or warn "failed to apply tone $tone to vowel $vowel";
+ return $vowel_with_tone;
+} # vowel_nr()
+
+
+########################################################################
+sub vowel_t { # named glyphs for troff
+ my $vowel = shift;
+ my $tone = shift;
+#&err( 'vowel_t: ' . $vowel . ' ' . $tone);
+
+ return '' unless ( $vowel );
+
+ # \o'\s-2\[:u]\s0\[a-]'
+ if ( $vowel =~ /[üÜ]/ ) {
+ my ($ue, $smaller);
+ if ($vowel eq 'ü') {
+ $ue = q(\\[:u]);
+ $smaller = 2;
+ } else {
+ $ue = q(\\[:U]);
+ $smaller = 4;
+ }
+ $vowel = q(\\o'\\s-) . $smaller . $ue . q(\\s0) .
+ $accents[$tone] . q(');
+ return $vowel;
+ }
+
+ $vowel = q(\\[.i]) if ( $vowel eq 'i' );
+
+ my $vowel_with_tone;
+ if ( $tone == 1 ) { # macron
+ $vowel_with_tone = q(\\o') . $vowel . $accents[$tone] . q(');
+ } elsif ( $tone == 2 ) { # acute
+ $vowel_with_tone = $tones2_glyphs{$vowel};
+ } elsif ( $tone == 3 ) { # caron
+ $vowel_with_tone = q(\\o') . $vowel . $accents[$tone] . q(');
+ } elsif ( $tone == 4 ) { # grave
+ $vowel_with_tone = $tones4_glyphs{$vowel};
+ }
+ $vowel_with_tone or warn "failed to apply tone $tone to vowel $vowel";
+ return $vowel_with_tone;
+} # vowel_t()
+
+
+########################################################################
+sub finish_pinyin_mode {
+#&err( 'finish' );
+ my $n = shift;
+ my $t = shift;
+ push @$n, '\\}';
+ push @$t, '\\}';
+
+ for ( @$n ) { # Unicode for nroff
+ print;
+ }
+
+ for ( @$t ) { # glyphs for troff
+ print;
+ }
+
+ 1;
+} # finish_pinyin_mode()
+
+
+########################################################################
+# options
+########################################################################
+
+foreach (@ARGV) {
+ if ( /^(-h|--h|--he|--hel|--help)$/ ) {
+ print q(Usage for the 'gpinyin' program:);
+ print 'gpinyin [-] [--] [filespec...] normal file name arguments';
+ print 'gpinyin [-h|--help] gives usage information';
+ print 'gpinyin [-v|--version] displays the version number';
+ print q(This program is a 'groff' preprocessor that handles ) .
+ q(pinyin parts in 'roff' files.);
+ exit;
+ } elsif (/^(-v|--v|--ve|--ver|--vers|--versi|--versio|--version)$/) {
+ print "gpinyin ${groff_version}version $version";
+ exit;
+ }
+}
+
+
+########################################################################
+# input
+########################################################################
+
+my $pinyin_mode = 0; # not in Pinyin mode
+
+my @output_n = # nroff
+ (
+ '.ie n \\{\\',
+ );
+
+my @output_t = # troff
+ (
+ '.el \\{\\',
+ );
+
+unshift @ARGV, '-' unless @ARGV;
+foreach my $filename (@ARGV) {
+ my $input;
+ if ($filename eq '-') {
+ $input = \*STDIN;
+ } elsif (not open $input, '<', $filename) {
+ warn $!;
+ next;
+ }
+ while (<$input>) {
+ chomp;
+ s/\s+$//; # remove final spaces
+# &err('gpinyin: ' . $_);
+
+ my $line = $_; # with starting blanks
+
+ # .pinyin start or begin line
+ if ( $line =~ /^[.']\s*pinyin\s+(start|begin)$/ ) {
+ if ( $pinyin_mode ) {
+ # '.pinyin' was started twice, ignore
+ &err( q['.pinyin' starter was run several times] );
+ } else { # new pinyin start
+ $pinyin_mode = 1;
+ }
+ next;
+ }
+
+ # .pinyin stop or end line
+ if ( $line =~ /^[.']\s*pinyin\s+(stop|end)$/ ) {
+ if ( $pinyin_mode ) { # normal stop
+ $pinyin_mode = 0;
+ &finish_pinyin_mode( \@output_n, \@output_t );
+ } else { # ignore
+ &err( 'gpinyin: there was a .pinyin stop without ' .
+ 'being in pinyin mode' );
+ }
+ next;
+ }
+
+ # now not a .pinyin line
+
+
+ if ( $pinyin_mode ) { # within Pinyin
+ my $starting_blanks = '';
+ $starting_blanks = $1 if ( s/^(s+)// ); # handle starting spaces
+
+ my %outline = &handle_line($starting_blanks, $line);
+# &err('gpinyin outline n: ' . $outline{'n'} );
+# &err('gpinyin outline t: ' . $outline{'t'} );
+ push @output_n, $outline{'n'};
+ push @output_t, $outline{'t'};
+ } else { # normal roff line, not within Pinyin
+ print $line;
+ }
+ next;
+ } # end of input line
+}
+
+
+########################################################################
+# end of file without stopping 'pinyin' mode
+if ( $pinyin_mode ) {
+ &finish_pinyin_mode( \@output_n, \@output_t );
+}
+
+########################################################################
+
+
+1;
+# Local Variables:
+# fill-column: 72
+# mode: CPerl
+# End:
+# vim: set autoindent textwidth=72:
diff --git a/contrib/grap2graph/grap2graph.1.man b/contrib/grap2graph/grap2graph.1.man
new file mode 100644
index 0000000..e7e87f3
--- /dev/null
+++ b/contrib/grap2graph/grap2graph.1.man
@@ -0,0 +1,205 @@
+.TH grap2graph @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+grap2graph \- convert a
+.I grap
+diagram into a cropped image
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" This documentation is released to the public domain.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_grap2graph_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY grap2graph
+.RB [ \-unsafe ]
+.RB [ \-format\~\c
+.IR output-format ]
+.RI [ convert-argument \~.\|.\|.]
+.YS
+.
+.
+.SY grap2graph
+.B \-\-help
+.YS
+.
+.
+.SY grap2graph
+.B \-v
+.
+.SY grap2graph
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I grap2graph
+reads a
+.MR grap 1
+program from the standard input and writes an image file,
+by default in Portable Network Graphics (PNG) format,
+to the standard output.
+.
+.
+.PP
+The input GRAP code should
+.I not
+be wrapped with the
+.B .G1
+and
+.B .G2
+macros that normally guard it within
+.MR groff @MAN1EXT@
+documents.
+.
+.
+.\" FIXME: How old? This text hasn't been touched since 2008 at latest.
+.\" Older versions of
+.\" .I \%convert
+.\" will produce a black-on-white graphic; newer ones may produce a
+.\" black-on-transparent graphic.
+.
+.PP
+Arguments not recognized by
+.I grap2graph
+are passed to the ImageMagick or GraphicsMagick program
+.MR convert 1 .
+.
+.
+By specifying these, you can give your image a border,
+.\" Transparent backgrounds are the default in 2018.
+.\" force the background transparent,
+set the image's pixel density,
+or perform other useful transformations.
+.
+.
+.PP
+The output image is clipped using
+.IR \%convert 's
+.B \-trim
+option to the smallest possible bounding box that contains all the black
+pixels.
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.BI \-format\~ output-format
+Write the image in
+.IR output-format ,
+which must be understood by
+.IR \%convert ;
+the default is PNG.
+.
+.
+.TP
+.B \-unsafe
+Run
+.I groff
+in
+.I unsafe
+mode, enabling the PIC command
+.B sh
+to execute arbitrary Unix shell commands.
+.
+The
+.I groff
+default is to forbid this.
+.
+.
+.\" ====================================================================
+.SH Environment
+.\" ====================================================================
+.
+.TP
+.I \%GROFF_TMPDIR
+.TQ
+.I \%TMPDIR
+.TQ
+.I TMP
+.TQ
+.I TEMP
+These environment variables are searched in the given order to determine
+the directory where temporary files will be created.
+.
+If none are set,
+.I /tmp
+is used.
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+.I grap2graph
+was written by
+.MT esr@\:thyrsus\:.com
+Eric S.\& Raymond
+.ME ,
+based on a recipe for
+.MR pic2graph @MAN1EXT@ ,
+by W.\& Richard Stevens.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.MR pic2graph @MAN1EXT@ ,
+.MR eqn2graph @MAN1EXT@ ,
+.MR grap 1 ,
+.MR @g@pic @MAN1EXT@ ,
+.MR groff @MAN1EXT@ ,
+.MR convert 1
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_grap2graph_1_man_C]
+.do rr *groff_grap2graph_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/grap2graph/grap2graph.am b/contrib/grap2graph/grap2graph.am
new file mode 100644
index 0000000..6025aa2
--- /dev/null
+++ b/contrib/grap2graph/grap2graph.am
@@ -0,0 +1,40 @@
+# Copyright (C) 2003-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# grap2graph.am
+#
+
+grap2graph_srcdir = $(top_srcdir)/contrib/grap2graph
+bin_SCRIPTS += grap2graph
+man1_MANS += contrib/grap2graph/grap2graph.1
+EXTRA_DIST += \
+ $(grap2graph_srcdir)/grap2graph.sh \
+ $(grap2graph_srcdir)/grap2graph.1.man
+
+grap2graph: $(grap2graph_srcdir)/grap2graph.sh
+ $(AM_V_GEN)sed -e "s|[@]g[@]|$(g)|g" \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e $(SH_SCRIPT_SED_CMD) $(grap2graph_srcdir)/grap2graph.sh \
+ >$@ \
+ && chmod +x $@
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/contrib/grap2graph/grap2graph.sh b/contrib/grap2graph/grap2graph.sh
new file mode 100644
index 0000000..29df25b
--- /dev/null
+++ b/contrib/grap2graph/grap2graph.sh
@@ -0,0 +1,107 @@
+#! /bin/sh
+#
+# grap2graph -- compile graph description descriptions to bitmap images
+#
+# by Eric S. Raymond <esr@thyrsus.com>, May 2003
+#
+# In Unixland, the magic is in knowing what to string together...
+#
+# Take grap description on stdin, emit cropped bitmap on stdout.
+# The grap 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).
+#
+groff_opts=""
+convert_opts=""
+convert_trim_arg="-trim"
+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 -n "$d" && break
+done
+
+if ! test -d "$d"
+then
+ echo "$0: error: temporary directory \"$d\" does not exist or is" \
+ "not a directory" >&2
+ exit 1
+fi
+
+if ! tmp=`(umask 077 && mktemp -d -q "$d/grap2graph-XXXXXX") 2> /dev/null`
+then
+ # mktemp failed--not installed or is a version that doesn't support those
+ # flags? Fall back to older method which uses more predictable naming.
+ #
+ # $RANDOM is a Bashism. The fallback of $PPID is not good pseudorandomness,
+ # but is supported by the stripped-down dash shell, for instance.
+ tmp="$d/grap2graph$$-${RANDOM:-$PPID}"
+ (umask 077 && mkdir "$tmp") 2> /dev/null
+fi
+
+if ! test -d "$tmp"
+then
+ echo "$0: error: cannot create temporary directory \"$tmp\"" >&2
+ exit 1
+fi
+
+# See if the installed version of convert(1) is new enough to support the -trim
+# option. Versions that didn't were described as "old" as early as 2008.
+is_convert_recent=`convert -help | grep -e -trim`
+if test -z "$is_convert_recent"
+then
+ echo "$0: warning: falling back to old '-crop 0x0' trim method" >&2
+ convert_trim_arg="-crop 0x0"
+fi
+
+trap 'exit_status=$?; rm -rf "$tmp" && exit $exit_status' EXIT INT TERM
+
+# 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 $convert_opts - "$tmp"/grap2graph.$format \
+ && cat "$tmp"/grap2graph.$format
+
+# End
diff --git a/contrib/hdtbl/ChangeLog b/contrib/hdtbl/ChangeLog
new file mode 100644
index 0000000..a0a1e8d
--- /dev/null
+++ b/contrib/hdtbl/ChangeLog
@@ -0,0 +1,548 @@
+2022-06-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * hdtbl.am (HDTBLPROCESSEDEXAMPLEFILES): Add dependency on
+ grops.
+
+2022-05-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * hdtbl.am (HDTBLPROCESSEDEXAMPLEFILES): Add dependency on devps
+ stamp file since the files' target rule generates PostScript
+ with groff.
+
+2022-04-12 Ingo Schwarze <schwarze@openbsd.org>
+
+ Delete the harmful, ill-designed, buggy, and essentially
+ unmaintained and untested --with-doc option of the configure
+ script. See the NEWS file for more details on the rationale.
+
+ * hdtbl.am: Delete two BUILD_EXAMPLES conditionals.
+
+2022-03-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * hdtbl.am: Eliminate `HDTBL_TFLAG` and `HDTBL_PFLAG` Make
+ macros; they were expanded in only one place.
+ (HDTBLGROFF): Track rename of Make macro `TFLAG` to `MFLAG`.
+
+2022-03-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * examples/mixed_pickles.ms: Die horribly if `PSPIC` call fails.
+
+2022-03-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * hdtbl.am (nodist_hdtblexample_DATA,
+ HDTBLPROCESSEDEXAMPLEFILES): Replace hard-coded "gnu.eps" file
+ name with expansion of `DOC_GNU_EPS`.
+ (HDTBLPROCESSEDEXAMPLEFILES): Pass `-I` option to `HDTBLGROFF`
+ to enable location of "gnu.eps" file (for "mixedpickles.roff"
+ document).
+
+2021-10-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * hdtbl.am:
+ (hdtbl_test_template): Pull file name into a new variable.
+ (EXTRA_DIST, contrib/hdtbl/examples/test-hdtbl.sh): Use it.
+ (contrib/hdtbl/examples/test-hdtbl.sh): Build more quietly;
+ prefix rule with `$(AM_V_GEN)`. Also run `chmod` conditionally.
+
+2021-07-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * hdtbl.am: Remove unnecessary Make variable.
+ (hdtbl_builddir): Delete.
+ (HDTBL_TFLAG): Remove `-M$(hdtbl_builddir)` option; it's no
+ longer needed for hdtbl example document generation needed now
+ that hdtbl is no longer stripped.
+
+2021-07-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Skip the stripper, part 2/3 ("hdtbl").
+
+ * hdmisc.tmac-u: Rename to...
+ * hdmisc.tmac: ...this.
+
+ * hdtbl.tmac-u: Rename to...
+ * hdtbl.tmac: ...this.
+
+ * hdtbl.am (HDSTRIPFILES): Rename to...
+ (HDTBLTMACFILES): ...this.
+ (hdtbltmac_DATA): Rename to...
+ (dist_hdtbltmac_DATA): ...this.
+ (MOSTLYCLEANFILES): Drop $(HDTBLSTRIPFILES).
+ ($(HDTBLSTRIPFILES)): Drop target.
+
+2018-12-26 Ingo Schwarze <schwarze@openbsd.org>
+
+ A missing prerequisite could cause parallel builds to fail.
+
+ * hdtbl.am (HDTBLPROCESSEDEXAMPLEFILES): requires eqn
+ because the .roff.ps target runs HDTBLGROFF =
+ GROFFBIN ... HDTBL_PFLAG = groff ... -t -p -e -U
+ which includes -e.
+
+2018-12-06 Ingo Schwarze <schwarze@openbsd.org>
+
+ * examples/fonts_n.in, examples/fonts_x.in:
+ Make the shell script in the .pso request more portable:
+ 1. POSIX requires "echo -n" to print "-n" followed by
+ a newline character, so use printf(1) instead.
+ 2. According to POSIX, behaviour of tr(1) is undefined
+ if string2 contains fewer characters than string1,
+ and on Oracle Solaris, the excess characters in string1
+ are not translated. So make sure string2 contains
+ a sufficient number of characters.
+
+2018-12-05 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Skip tests if needed config is missing.
+
+ * examples/test-hdtbl.sh.in: exit 77 (indicates automake
+ to skip the result) if 'gs' is missing.
+
+ * hdtbl.am: flag correctly test program generation.
+
+2018-11-25 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Clean hdtbl.am
+
+ * hdtbl.am (MOSTLYCLEANFILES): Remove 'hdmisc.tmac-s'
+ and 'hdtbl.tmac-s' (these files are no longer present).
+
+ Fixes https://savannah.gnu.org/bugs/index.php?55083, reported by
+ Bjarni Ingi Gislason <bjarniig@rhi.hi.is>.
+
+2018-11-13 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Don't clean other people's unit tests.
+
+ * hdtbl.am: test-hdtbl.sh is generated from an .in file,
+ so while we can add it to $(TESTS), we shouldn't then add
+ $(TESTS) to $(MOSTLYCLEANFILES) or we will clobber all tests
+ that ever get defined. This clobbered gdiffmk's test script on
+ in-tree builds. Give it its own variable, $(hdtbl_TESTS).
+ Now it clobbers no more.
+
+ Fixes <https://savannah.gnu.org/bugs/index.php?55020>.
+
+2018-11-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * hdtbl.am: Remove examples/test-hdtbl.sh on 'make distclean'.
+
+2018-11-07 Bertrand Garrigues <bertrand.garrigues@laposte.net>
+
+ Add a sanity check on 2 examples.
+
+ * examples/test-hdtbl.sh.in: new test script that uses 'gs'
+ to check the number of pages of 'fonts_x.ps' and 'fonts_n.ps'.
+
+ * hdtbl.am: connect 'test-hdtbl.sh' to 'make check'
+
+2018-08-09 Ingo Schwarze <schwarze@openbsd.org>
+
+ * examples/common.roff: Remove more dead code
+ since the date and time are no longer used.
+
+ Reported by Bjarni Ingi Gislason in Savannah bug #54461.
+
+2018-08-09 Ingo Schwarze <schwarze@openbsd.org>
+
+ * examples/common.roff, examples/col_rowspan_colors.roff,
+ examples/short_reference.roff: do forgotten renamings .pv -> .t*pv
+
+ Fixing it improves the formatting of all hdtbl examples.
+ Reported by Bjarni Ingi Gislason in Savannah bug #54470.
+
+2018-08-04 Ingo Schwarze <schwarze@openbsd.org>
+
+ * examples/*: delete the date and time macros
+ * examples/hdtbl.am: run groff without -U option
+
+2018-03-11 Colin Watson <cjwatson@debian.org>
+
+ Remove unnecessary randomness from example output.
+
+ The examples don't need good randomness, as they're only
+ example output; removing the process ID from consideration
+ allows better integration with reproducible builds.
+
+ * examples/common.roff (random-s1): Remove process ID.
+
+2018-02-28 Werner LEMBERG <wl@gnu.org>
+
+ * hdtbl.am (.roff.ps, .in.roff): Use $(GROFF_V) and $(AM_V_GEN).
+
+2017-11-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * examples/common.roff:
+ * examples/fonts_n.in:
+ * examples/fonts_x.in:
+ Make writers to stderr identify themselves.
+
+2017-11-19 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * examples/*.roff: Seed RNG.
+
+ * examples/col_rowspan_colors.roff:
+ * examples/color_boxes.roff:
+ * examples/color_nested_tables.roff:
+ * examples/color_table_cells.roff:
+ Support reproducible builds by seeding hdtbl's random
+ number generator (in examples/common.roff).
+
+ Fix issue https://savannah.gnu.org/bugs/?52462.
+
+2017-11-01 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ hdtbl.tmac-u: Fix ignored escape sequence.
+
+ The escape '\c' ignores everything after it, except "\R...".
+
+ Fix bug https://savannah.gnu.org/bugs/?51609.
+
+2015-08-22 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * groff_hdtbl.7.man: Rename `groff_hdtbl.man'.
+
+ * hdtbl.am: Include renaming.
+
+2015-08-05 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * hdtbl.am: Add `Last update'. Setup Emacs mode.
+
+2015-04-03 Werner LEMBERG <wl@gnu.org>
+
+ Fix Savannah bug #44798.
+
+ * examples/fonts_n.in, examples/fonts_x.in: Use @EGREP@.
+
+ * hdtbl.am (.in.roff): Handle @EGREP@.
+
+2015-04-03 Werner LEMBERG <wl@gnu.org>
+
+ * groff_hdtbl.man: Make it work in compatibility mode.
+
+2013-09-03 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * all files in groff_hdtbl: Copying and Emacs setup.
+
+2014-03-29 Steffen Nurpmeso <sdaoden@yandex.com>
+
+ * Makefile.sub: Handle examples separately, controlled by
+ $(make{_,_install_,_uninstall_}examples).
+
+2013-02-06 Werner LEMBERG <wl@gnu.org>
+
+ * groff_hdtbl.man: Correct details on loading hdtbl.tmac.
+
+2013-02-04 Werner LEMBERG <wl@gnu.org>
+
+ * groff_hdtbl.man: Revised.
+
+2013-02-03 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * groff_hdtbl.man: Correct and extend this man-page.
+
+2012-09-20 Werner LEMBERG <wl@gnu.org>
+
+ Simplify environment handling.
+
+ Suggested by Ivan Shmakov <oneingray@gmail.com>.
+
+ * Makefile.sub (GROFF): Don't use export.
+
+2011-01-17 Werner LEMBERG <wl@gnu.org>
+
+ * examples/color_nested_tables.roff: Fix output.
+
+ Problem reported by Ulrich Spörlein <uqs@spoerlein.net>.
+
+2011-01-17 Ulrich Spörlein <uqs@spoerlein.net>
+
+ Don't make examples depend on bash.
+
+ * examples/common.roff, examples/fonts_n.in, examples/fonts_x.in:
+ s/bash/sh/.
+
+2010-02-09 Werner LEMBERG <wl@gnu.org>
+
+ Make example compilation work again if srcdir != builddir.
+
+ * Makefile.sub (.roff.ps): Define `sopath' groff string.
+
+ * examples/*.roff, examples/*.in: Use it so that .so finds its input
+ file.
+
+2010-02-08 Werner LEMBEARG <wl@gnu.org>
+
+ Fix handling of `common.roff'.
+
+ * Makefile.sub (MOSTLYCLEANADD): Don't handle `common.roff'.
+ (EXAMPLEFILES): Handle `common.roff'.
+
+2010-02-08 Larry Kollar <kollar@alltel.net>
+
+ Fix last patch and use `t*' prefix for all non-public stuff.
+ Other minor fixes.
+
+ * hdmisc.tmac (getarg, index, SP, P1, \n[s], \n[v], \n[hy], pv, DI):
+ Rename to...
+ (t*getarg, t*index, t*SP, t*P1, \n[t*s], \n[t*v], \n[t*hy], t*pv,
+ t*DI): This.
+ Update all callers.
+ (t*EM): New auxiliary macro (using stuff from
+ `examples/common.roff'.
+
+ * hdtbl.tmac (\n[t*v], \n[t*s], \n[t*hy], \n[t*l]): Initialize.
+ (\n[t*FN], \n[t*LN]): New number registers.
+
+ * examples/*.roff: Updated.
+ * examples/common.roff: Load `hdtbl.tmac' earlier.
+ Reinstall `HM' and `BM' traps.
+ Provide `SP' macros if not defined by other macro package.
+ (\n[p], \n[o]): Initialize.
+ (\*[t*HM], \*[t*BM]): Initialize.
+ (EM): Use `t*EM'.
+ Updated.
+
+ * examples/fonts_n.in, examples/fonts_x.in: Load
+ `examples/common.roff'.
+ Updated.
+
+ * groff_hdtbl.man: Document setup of default values.
+ Document `t*EM'.
+
+2010-01-23 Larry Kollar <kollar@alltel.net>
+
+ Break out example formatting to a separate file.
+
+ * hdmisc.tmac: Move example formatting stuff to...
+ * examples/common.roff: This new file.
+
+ * hdtbl.tmac (HM, t*HM, BM, t*BM): Remove.
+
+ * examples/*.roff: Include `common.roff'.
+
+ * groff_hdtbl.man: Remove references to `HM' and `BM'.
+
+ * Makefile.sub: Handle `examples/common.roff'.
+
+2009-04-05 Joachim Walsdorff <Joachim.Walsdorff@urz.uni-heidelberg.de>
+
+ * hdtbl.tmac (ETB, t*free): Correct two typos, fixing register
+ incrementation.
+
+2009-01-04 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile.sub (CLEANADD): Add hdmisc.tmac-s and hdtbl.tmac-s.
+
+2009-01-03 Werner LEMBERG <wl@gnu.org>
+
+ * README: Renamed to...
+ * TODO: This, removing most of its contents.
+
+ * groff_hdtbl.man: Add customization info which was in file README.
+
+2008-01-04 Werner LEMBERG <wl@gnu.org>
+
+ * groff_hdtbl.man: Replace .MTO with .MT/.ME.
+ Don't include www.tmac.
+
+2006-11-17 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile.sub (install_data): Depend on gnu.eps also.
+ (uninstall_sub): Remove gnu.eps also.
+
+2006-11-17 Werner LEMBERG <wl@gnu.org>
+
+ * hdmisc.tmac: Avoid loading itself more than once.
+ Load hdtbl.tmac unconditionally.
+ (\n[?], \n[*miscs]): Remove.
+ (random-s1): Use only 9 digits.
+
+ * hdtbl.tmac: Avoid loading itself more than once.
+ Load hdmisc.tmac unconditionally.
+ Load 62bit.tmac
+ (\n[*hdtbl]): Removed.
+ (t*cl): Prevent scaling overflow by using routines from 62bit.tmac.
+
+2006-11-15 Werner LEMBERG <wl@gnu.org>
+
+ * hdmisc.tmac (d2x): Use string array instead of `dzx' macro.
+ Improve error handling.
+ (dzx): Removed.
+ (random#): Rewrite to generate random numbers by itself instead of
+ using an external command.
+
+2006-11-06 Joachim Walsdorff <JWalsdorff@compuserve.de>
+
+ * hdmisc.tmac (\*[g]): Move definition back to...
+ * hdtbl.tmac: This file.
+ (TD, t*divs): Fix a bug with consecutive groups of spanned rows by
+ introducing string *rsp*\\*[#trc]. Reported by Barry Nisly.
+ (TH): Add arguments `hal', `val', and `fst'.
+
+2006-11-01 Werner LEMBERG <wl@gnu.org>
+
+ * hdtbl.tmac (t*divs): Fix a bug which causes incorrect table cell
+ heights if the `rowspan' keyword is used. This problem has been
+ introduced during the beautification process by introducing
+ incorrect parentheses.
+ Other minor modifications.
+ (\n[rsp...]): Array renamed to...
+ (\n[rspan...]): This.
+ (\n[csp...]): Array renamed to...
+ (\n[cspan...]): This.
+ (\n[vl...]): Array renamed to...
+ (\n[vline...]): This.
+
+2006-10-27 Werner LEMBERG <wl@gnu.org>
+
+ * hdmisc.tmac (EM): Improve warning messages.
+
+ * hdtbl.tmac (TD): Move constant comparison out of while loop.
+
+2006-10-26 Werner LEMBERG <wl@gnu.org>
+
+ * hdmisc.tmac: Add `\"' at various places to protect against
+ trailing spaces.
+ (getarg): Don't use a different escape character but
+ `\?' escapes to protect against incomplete input.
+ Improve documentation.
+
+ * hdtbl.tmac: Improve various warning messages.
+ (TR): Add validity check for `height' keyword.
+ (TD): Don't use `\\\\' but `\E'.
+ (\*[*#trc*]): Initialize.
+ (t*dntr): Avoid undefined register warning.
+
+2006-10-23 Werner LEMBERG <wl@gnu.org>
+
+ * hdtbl.tmac (\n[t*#]): Initialize.
+ (TBL): Don't initialize `\*[width]'.
+ Add validity checks for all keywords.
+ (TD): Add validity checks for `rowspan' and `colspan' keywords.
+ (t*cl): Add validity checks for cell widths.
+
+2006-09-13 Werner LEMBERG <wl@gnu.org>
+
+ * examples/fontdumps_n.in, examples/fontdumps_x.in: Renamed to...
+ * examples/fonts_n.in, examples/fonts_x.in: This.
+
+ * examples/colored_boxes.roff, examples/colored_nested_tables.roff,
+ examples/colored_table_cells.roff: Renamed to...
+ * examples/color_boxes.roff, examples/color_nested_tables.roff,
+ examples/color_table_cells.roff: This.
+
+ * Makefile.sub: Updated.
+
+2006-06-21 Werner LEMBERG <wl@gnu.org>
+
+ * examples/fontdumps_n.roff, examples/fontdumps_x.roff: Renamed
+ to...
+ * example/fontdumps_n.in, example/fontdumps_x_in: This.
+ Rename `*fontpath' to `fontpath' and define it conditionally (using
+ `@fontdir@') so that it can be overridden on the command line.
+
+ * Makefile.sub (GENFILES, GENFILES_): New variables for
+ fontdumps*.roff.
+ (EXAMPLEFILES): Remove fontdumps.roff.
+ (CLEANADD): Add GENFILES.
+ (.in.roff): New rule.
+ (.SUFFIXES): Add `.in'.
+ (install_data, uninstall_sub): Updated.
+
+2006-06-14 Werner LEMBERG <wl@gnu.org>
+
+ * hdmisc.tmac: Fix test for \n[?] to avoid warning message.
+ s/\n[.s]p/\n[.ps]/.
+ (pv): Use `z' scaling indicator.
+
+ * hdtbl.tmac: Fix test for \n[?] and \n[*miscs] to avoid warning
+ messages.
+
+2006-06-11 Werner LEMBERG <wl@gnu.org>
+
+ * groff_hdtbl.man: Use `.ig' block after NAME section to make mandb
+ happy.
+
+2006-06-05 Werner LEMBERG <wl@gnu.org>
+
+ * hdmisc.tmac (index): Use `\?' to emulate string comparison.
+
+2006-06-04 Werner LEMBERG <wl@gnu.org>
+
+ * hdtbl.tmac: Improve error messages. In particular, handle
+ singular and plural correctly by using a pseudo array `nth-{1,2,3}'.
+
+ * examples/rainbow.roff: Add copyright notice. Formatting.
+
+2006-05-31 Werner LEMBERG <wl@gnu.org>
+
+ * examples/fontdumps_x.roff, examples/fontdumps_n.roff: Protect
+ argument of `tr' command in `.pso' call.
+
+2006-05-30 Werner LEMBERG <wl@gnu.org>
+
+ * examples/fontdumps_x.roff: Remove warnings about
+ non-existent glyphs.
+ Add copyright notice.
+ Formatting.
+
+ * hdtbl.tmac: Replace character >= 0x80.
+
+2006-05-29 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile.sub: New file.
+ * examples/*: Replace characters >= 0x80.
+ Add final newlines.
+ Use UNIX line end convention only.
+ * examples/mixed-pickles.roff: Use gnu.eps.
+ Add copyright notice.
+ Adjust pic image.
+ Other minor fixes.
+ Formatting.
+ * examples/fontdumps_n.roff: Remove warnings about
+ non-existent glyphs.
+ Add copyright notice.
+ Formatting.
+
+2006-05-25 Werner LEMBERG <wl@gnu.org>
+
+ * examples/*: Rename to...
+ * examples/*.roff: This.
+
+2006-05-24 Werner LEMBERG <wl@gnu.org>
+
+ * groff_hdtbl.man: Simplify macros for switching from and to the `C'
+ font family, as suggested by Tadziu Hoffmann.
+
+2006-05-22 Werner LEMBERG <wl@gnu.org>
+
+ * groff_hdtbl.man: Completely revised again.
+ `Normalize' font usage: Add macros similar to `.B' and `.BI' for
+ switching from and to the `C' font family, instead of using \f.
+ Fix appearance of macro syntax descriptions.
+ Add more quotation characters.
+
+2006-05-21 Werner LEMBERG <wl@gnu.org>
+
+ * groff_hdtbl.man: Completely revised.
+
+2006-05-20 Werner LEMBERG <wl@gnu.org>
+
+ * Import of hdtbl 0.91 (with some further modifications). Still
+ many rough edges.
+
+________________________________________________________________________
+
+Copyright 2006-2020 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+Local Variables:
+coding: latin-1
+fill-column: 72
+mode: change-log
+version-control: never
+End:
+vim:set autoindent textwidth=72:
diff --git a/contrib/hdtbl/TODO b/contrib/hdtbl/TODO
new file mode 100644
index 0000000..a3684e5
--- /dev/null
+++ b/contrib/hdtbl/TODO
@@ -0,0 +1,21 @@
+TODO
+----
+
+* Macro TOTC (Table Of Table Captions).
+
+* Automatic recognition of the number of columns.
+
+* Optional automatic calculation of the cell widths from the widths of the
+ first line of the cell content instead of the explicit specification with
+ the width argument. This seems to be non-trivial without a preprocessor
+ or additional external calls via .sy or .pso.
+
+* Handling of pagebreaks in tables.
+
+* Floating text left and/or right from tables.
+
+* Converter hdtbl2html (awk, elisp, perl?); should be easy to write.
+
+* Support for nroff.
+
+* Support for -Thtml.
diff --git a/contrib/hdtbl/examples/chess_board.roff b/contrib/hdtbl/examples/chess_board.roff
new file mode 100644
index 0000000..171d95e
--- /dev/null
+++ b/contrib/hdtbl/examples/chess_board.roff
@@ -0,0 +1,64 @@
+.ig
+chess_board.roff
+
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2005-2020 Free Software Foundation, Inc.
+written by Joachim Walsdorff <Joachim.Walsdorff@urz.uni-heidelberg.de>.
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+..
+.
+.if !d sopath \
+. ds sopath
+.
+.so \*[sopath]examples/common.roff
+.
+.
+.nr *x 8
+.de r1
+.TR height=1.6c
+.TD hl= val=m hal=r \\\\n(*x
+.PN 4 ".TD bgc=wheat" ".TD bgc=tan3"
+.TD hl= val=m hal=l \\\\n(*x
+.nr *x -1
+..
+.de r2
+.TR height=1.6c
+.TD hl= val=m hal=r \\\\n(*x
+.PN 4 ".TD bgc=tan3" ".TD bgc=wheat"
+.TD hl= val=m hal=l \\\\n(*x
+.nr *x -1
+..
+.af *y a
+.H Chessboard
+.TBL border=0 csp=.05n bgc= cols=10 width=1.6c tal=c
+.TR vl= hal=c\" height=1c
+.TD hl=
+.nr *y 0
+.PN 8 .TD ".nr *y +1" \\\\n(*y
+.TD hl=
+.PN 4 .r1 .r2
+.TR vl= hal=c
+.TD
+.nr *y 0
+.PN 8 .TD ".nr *y +1" \\\\n(*y
+.TD
+.ETB
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/hdtbl/examples/col_rowspan_colors.roff b/contrib/hdtbl/examples/col_rowspan_colors.roff
new file mode 100644
index 0000000..90f2e7a
--- /dev/null
+++ b/contrib/hdtbl/examples/col_rowspan_colors.roff
@@ -0,0 +1,82 @@
+.ig
+col_rowspan_colors.roff
+
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2005-2020 Free Software Foundation, Inc.
+written by Joachim Walsdorff <Joachim.Walsdorff@urz.uni-heidelberg.de>.
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+..
+.
+.if !d sopath \
+. ds sopath
+.
+.so \*[sopath]examples/common.roff
+.
+.\" Seed the random number generator for reproducible builds.
+.random-seed 131545532 19201711
+.de color#
+.nr # +1
+.random#
+.defcolor c\\n# rgb \\*[#random]
+..
+.
+.de brt
+.nr # 0
+.color#
+.if \\n[t*cols\\n[t*#]]/2*2=\\n[t*cols\\n[t*#]] \{ .
+. tmc \\n(.F:\\n(.c: cols was even (\\n[t*cols\\n[t*#]]),
+. nr t*cols\\n[t*#] +1
+. tm1 " increased by one col to \\n[t*cols\\n[t*#]].
+. t*cl \\*[width]
+. ie "\\*[tal]"r" .nr in\\n[t*#] -\\*[width]\" recalculate cell widths etc.
+. el .if "\\*[tal]"c" .nr in\\n[t*#] -\\*[width]/2
+.\}
+.nr N \\n[t*cols\\n[t*#]]-1 \" N must be even
+.nr W 1c\"\\*[width]
+.ds html "".TR height=\\nW" ".TD bgc=c\\n#"
+.nr I 0 2
+.while \\nN>=\\n+I \{ .
+. ds help "\\*[html]
+. pops * help
+. color#
+. ds html "".TR height=\\nW" ".TD colspan=\\nI bgc=c\\n#"
+. color#
+. as html " ".TD rowspan=\\nI bgc=c\\n#"
+. color#
+. as html " ".TR height=\\nW" ".TD rowspan=\\nI bgc=c\\n#"
+. color#
+. as html " \\*[help] ".TR height=\\nW" ".TD colspan=\\nI bgc=c\\n#"
+.\}
+.t*P1 \\*[html]
+..
+.
+.t*pv 1.2 1.2 "" x
+.PN 10 Text before table.
+.in 1c
+.PN 8 Indented text before table.
+*** *** ***
+.TBL width=90% border=1n csp=1n cpd=1n bgc=wheat tal=c .TR .TD
+.TBL border= cols=11 width=1c tal=c csp=0 cpd=0 \"cols must be odd
+.CPTN val=b Randomly Colored Table Cells with Colspan/\%Rowspan
+.brt
+.ETB .ETB
+.PN 15 Text after table.
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/hdtbl/examples/color_boxes.roff b/contrib/hdtbl/examples/color_boxes.roff
new file mode 100644
index 0000000..65538a7
--- /dev/null
+++ b/contrib/hdtbl/examples/color_boxes.roff
@@ -0,0 +1,52 @@
+.ig
+color_boxes.roff
+
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2005-2020 Free Software Foundation, Inc.
+written by Joachim Walsdorff <Joachim.Walsdorff@urz.uni-heidelberg.de>.
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+..
+.
+.if !d sopath \
+. ds sopath
+.
+.so \*[sopath]examples/common.roff
+.
+.\" Seed the random number generator for reproducible builds.
+.random-seed 131545532 19201711
+.
+.H Horizontal Rules and Boxes .br with Randomly Colored Border and Background
+.PN 25 Text before horizontal rule.
+.TBL border=.5n bc=green bgc=red width=7c tal=c csp=.2n cpd=.3n .TR .TD .ETB
+.PN 10 Text after horizontal rule and before table.
+.de ctab
+.nr ? 0 1
+.PN 5 .random# ".defcolor color\En+? rgb \E*[#random]"
+.TD ".TBL border=1c bc=color1 csp=0 cpd=0 height=3c bgc=color2" .TR .TD .ETB
+..
+.
+.TBL tal=c border= csp=0 cpd=0 cols=5 width=3c
+.PN 2 .TR ".PN 5 .ctab"
+.ETB
+.PN 15 Text after table.
+.TBL border=.5n bc=color1 bgc=color2 width=15c tal=c csp=.2n cpd=.3n .TR .TD .ETB
+.PN 25 Text after horizontal rule.
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/hdtbl/examples/color_nested_tables.roff b/contrib/hdtbl/examples/color_nested_tables.roff
new file mode 100644
index 0000000..946d297
--- /dev/null
+++ b/contrib/hdtbl/examples/color_nested_tables.roff
@@ -0,0 +1,60 @@
+.ig
+
+color_nested_tables.roff
+
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2005-2020 Free Software Foundation, Inc.
+written by Joachim Walsdorff <Joachim.Walsdorff@urz.uni-heidelberg.de>.
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+..
+.
+.if !d sopath \
+. ds sopath
+.
+.so \*[sopath]examples/common.roff
+.
+.
+.\" Seed the random number generator for reproducible builds.
+.random-seed 131545532 19201711
+.
+.PN 15 Text before first table.
+.nr # 0 1
+*****
+.PN 39 .random# ".defcolor c\\n[#] rgb \\\\*[#random] " \
+ ".TBL csp=0 cpd=0 border=1n bc=c\\n[#]" \
+ ".if \\\\n+#=1 .CPTN val=b Nested Tables with Randomly Colored Border" \
+ .TR .TD
+.PN 39 .ETB
+.PN 15 Text after first table.
+.
+.bp
+.
+.PN 15 Text before second table.
+*****
+.nr # 0 1
+.PN 39 .random# ".defcolor c\\n[#] rgb \\\\*[#random] " \
+ ".TBL csp=0 cpd=1n border= bgc=c\\n[#]" \
+ ".if \\\\n+#=1 .CPTN val=b Nested Tables with Randomly Colored Background" \
+ .TR .TD
+.PN 39 .ETB
+.PN 25 Text after second table.
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/hdtbl/examples/color_table_cells.roff b/contrib/hdtbl/examples/color_table_cells.roff
new file mode 100644
index 0000000..65489cb
--- /dev/null
+++ b/contrib/hdtbl/examples/color_table_cells.roff
@@ -0,0 +1,54 @@
+.ig
+
+color_table_cells.roff
+
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2005-2020 Free Software Foundation, Inc.
+written by Joachim Walsdorff <Joachim.Walsdorff@urz.uni-heidelberg.de>.
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+..
+.
+.if !d sopath \
+. ds sopath
+.
+.so \*[sopath]examples/common.roff
+.
+.\" Seed the random number generator for reproducible builds.
+.random-seed 131545532 19201711
+.
+.H Horizontal Rules and Randomly Colored Table Cells
+.PN 15 Text before HR.
+.TBL border=.5n bc=green bgc=red width=7c tal=c csp=.2n cpd=.3n .TR .TD .ETB
+.PN 10 Text after HR and before Table.
+.
+.nr ? 0 1
+.de ctab
+.TR height=\nl/10
+.PN 8 .random# ".defcolor c\\\\n+? rgb \E*[#random]" ".TD bgc=c\\\\n?"
+..
+.TBL tal=c border= csp=0 cpd=0 cols=8 width=\nl/10
+.PN 8 .ctab
+.ETB
+.PN 10 Text after table.
+.TBL border=.5n bc=c1 bgc=c2 width=15c tal=c csp=.2n cpd=.3n .TR .TD .ETB
+.PN 15 Text after HR.
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/hdtbl/examples/color_transitions.roff b/contrib/hdtbl/examples/color_transitions.roff
new file mode 100644
index 0000000..be69b7c
--- /dev/null
+++ b/contrib/hdtbl/examples/color_transitions.roff
@@ -0,0 +1,58 @@
+.ig
+
+color_transitions.roff
+
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2005-2020 Free Software Foundation, Inc.
+written by Joachim Walsdorff <Joachim.Walsdorff@urz.uni-heidelberg.de>.
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+..
+.
+.if !d sopath \
+. ds sopath
+.
+.so \*[sopath]examples/common.roff
+.
+.de ctab
+.nr #cc 0
+.PN 21 ".nr #cc +.05f" ".defcolor \En[t*#] rgb \\$1 \\$2 \\$3" ".TBL border= csp=0 cpd=.5n bgc=\\\\n[t*#] bc=" .TR .TD
+.PN 21 .ETB
+..
+.PN 30 Before table.
+.TBL cols=3 width=33% border= csp=0 cpd=0 bgc=
+.CPTN val=b Color Transitions
+.TR
+.TD ".ctab 0+\En[#cc]u \En[#cc]u \En[#cc]u" \" black -> white
+.TD ".ctab 1f-\En[#cc]u 1f-\En[#cc]u 1f-\En[#cc]u"\" white -> black
+.TD ".ctab 1f \En[#cc]u \En[#cc]u" \" red -> white
+.TR
+.TD ".ctab 0 1f-\En[#cc]u \En[#cc]u" \" green -> blue
+.TD ".ctab 1f 1f-\En[#cc]u 1f" \" white -> magenta
+.TD ".ctab 1f \En[#cc]u 1f" \" magenta -> white
+.TR
+.TD ".ctab 0+\En[#cc]u \En[#cc]u 1f-\En[#cc]u" \" blue -> yellow
+.TD ".ctab 1f-\En[#cc]u 1f-\En[#cc]u \En[#cc]u" \" yellow -> blue
+.TD ".ctab 1f 0+\En[#cc]u 0" \" red -> yellow
+.xTD ".ctab 0+\En[#cc]u 1f-\En[#cc]u 1f-\En[#cc]u"\" cyan -> red
+.ETB
+.PN 30 After table.
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/hdtbl/examples/common.roff b/contrib/hdtbl/examples/common.roff
new file mode 100644
index 0000000..a9c02a0
--- /dev/null
+++ b/contrib/hdtbl/examples/common.roff
@@ -0,0 +1,295 @@
+.ig
+
+common.roff
+
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2010-2020 Free Software Foundation, Inc.
+written by Joachim Walsdorff <Joachim.Walsdorff@urz.uni-heidelberg.de>.
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+..
+.
+.
+.ds common common.roff\" name for diagnostic messages
+.mso hdtbl.tmac\" load table macros
+.
+.\" ******************************************************************
+.\" ** Some macros and the page setup used by the examples **
+.\" ******************************************************************
+.
+.\" ******************************************************************
+.\" ** Header macro for the examples **
+.\" ******************************************************************
+.de H
+. nr *w* (17 * \w\\$* / 10 + 4n)
+. TBL border=1n \
+ bc=yellow \
+ bgc=red4 \
+ fgc=yellow \
+ csp=0 \
+ fst=TB \
+ "fsz=1.7 1.5" \
+ hal=c \
+ tal=c \
+ "width=(\\n[*w*]+4n)<?\n[.l]"
+. TR .TD
+. t*P1 \\$*
+. ETB
+. SP
+..
+.
+.
+.\" ******************************************************************
+.\" ** Perform n-times all the arbitrary arguments **
+.\" ** .PN n a2 a3 ... **
+.\" ** PN is nestable **
+.\" ******************************************************************
+.de PN
+. nr *pn +1
+. nr PN\\n[*pn] (\\$1 + 1) 1
+. shift
+.
+. while \\n-[PN\\n[*pn]] \
+. t*P1 \\$@
+.
+. nr *pn -1
+..
+.
+.
+.\" Utility macro: .d2x decimal_number [base [string_name]]
+.\"
+.\" Convert 'decimal_number' to another base 'base' (in the
+.\" range 1..16) and store the result in string 'string_name'.
+.\" If 'base' is missing or empty, convert to a hexadecimal
+.\" number. If 'string_name' is missing or empty, return value
+.\" in string 'hex#', otherwise return the value in both
+.\" 'string_name' and 'hex#'.
+.\"
+.\" The base value 1 is handled specially: The returned
+.\" string contains the character '|' 'decimal_number' times
+.\" (for example, input value 4 yields '||||').
+.ds d2x-0 0\"
+.ds d2x-1 1\"
+.ds d2x-2 2\"
+.ds d2x-3 3\"
+.ds d2x-4 4\"
+.ds d2x-5 5\"
+.ds d2x-6 6\"
+.ds d2x-7 7\"
+.ds d2x-8 8\"
+.ds d2x-9 9\"
+.ds d2x-10 A\"
+.ds d2x-11 B\"
+.ds d2x-12 C\"
+.ds d2x-13 D\"
+.ds d2x-14 E\"
+.ds d2x-15 F\"
+.
+.
+.de d2x
+. if !\B\\$1 \{\
+. tmc \\*[common]: \\n[.F]:\\n[.c]: d2x: invalid or missing first
+. tm argument
+. tm \\*[common]: usage: '.d2x decimal_number [base [string_name]]'
+. return
+. \}
+.
+. nr i# (-1) 1
+. nr j# 1
+. ds hex#
+. nr dec# (\\$1) 1
+.
+. if !\\$1 \
+. nr dec# (-\\n[dec#])
+.
+. ie !"\\$2"" \{\
+. ie !\B\\$2 \
+. tm \\*[common]: \\n[.F]:\\n[.c]: d2x: invalid base '\\$2'
+. el \
+. ie ((\\$2 < 1) : (\\$2 > 16)) \
+. tm \\*[common]: \\n[.F]:\\n[.c]: d2x: invalid base '\\$2'
+. el \
+. nr b# \\$2
+. \}\}
+. el \
+. nr b# 16
+.
+. nr xb# 1
+.
+. ie (\\n[b#] == 1) \{\
+. nr dec# +1
+. while \\n-[dec#] \
+. as hex# |\"
+. \}
+. el \{\
+. while (\\n[dec#] - \\n[xb#]) \{\
+. nr xb# (\\n[xb#] * \\n[b#])
+. nr j# +1
+. \}
+.
+. while (\\n+[i#] < \\n[j#]) \{\
+. nr ** (\\n[dec#] / \\n[xb#])
+. as hex# \\*[d2x-\\n[**]]\"
+. nr dec# (\\n[dec#] - (\\n[xb#] * \\n[**]))
+. nr xb# (\\n[xb#] / \\n[b#])
+. \}
+. \}
+.
+. \" strip leading zero, if any
+. ds * \\*[hex#]\"
+. substring * 0 0
+. if "\\*[*]"0" \
+. substring hex# 1 -1
+.
+. if (\\$1 < 0) \
+. ds hex# -\\*[hex#]\"
+.
+. if !"\\$3"" \{\
+. ie !\A\\$3 \
+. tm \\*[common]: \\n[.F]:\\n[.c]: d2x: invalid string name '\\$3'
+. el \
+. ds \\$3 \\*[hex#]\"
+. \}
+..
+.
+.
+.\" Utility macro: .random#
+.\" .random-seed seed1 seed2
+.\"
+.\" Return pseudo-random numbers in the range 0..0xFFFFFF,
+.\" represented as the concatenation of '#' and six
+.\" hexadecimal digits, in the string '#random'. The
+.\" macro 'random-seed' can be used to set seed values,
+.\" which should be integers in the range 1..2147483562 and
+.\" 1..2147483398 for 'seed1' and 'seed2', respectively
+.\" (the macro applies a modulo operation to assure this
+.\" range). If 'random-seed' isn't called the registers
+.\" start at some constant, arbitrary values.
+.\"
+.\" The used generator is presented in L'Ecuyer's 1988 paper
+.\" 'Efficient and Portable Combined Random Number
+.\" Generators', which combines two Multiplicative Linear
+.\" Congruential Generators (MLCGs) to achieve a period of
+.\" 2.3*10^18.
+.\"
+.\" Since this just generates example output,
+.\" we don't need good randomness.
+.
+.de random-seed
+. if !(\\n[.$] == 2) \{\
+. tm \\*[common]: random-seed: Invalid number of arguments.
+. tm \\*[common]: usage: '.random-seed seed1 seed2'
+. return
+. \}
+.
+. nr random-s1 (\\$1 % 2147483562)
+. nr random-s2 (\\$2 % 2147483398)
+..
+.random-seed 131545532 19201711
+.
+.
+.de random#
+. nr * (\\n[random-s1] / 53668)
+. nr random-s1 (40014 * (\\n[random-s1] - (\\n[*] * 53668)) \
+ - (\\n[*] * 12211))
+. if !\\n[random-s1] \
+. nr random-s1 +2147483563
+.
+. nr * (\\n[random-s2] / 52774)
+. nr random-s2 (40692 * (\\n[random-s2] - (\\n[*] * 52774)) \
+ - (\\n[*] * 3791))
+. if !\\n[random-s2] \
+. nr random-s2 +2147483399
+.
+. nr * (\\n[random-s1] - \\n[random-s2])
+. if (\\n[*] < 1) \
+. nr * +2147483562
+.
+. \" reduce the result to the leftmost 24 bits
+. nr * (\\n[*] / 128)
+.
+. d2x \\n[*]
+. ds hex# 000000\\*[hex#]\"
+. substring hex# -6
+. ds #random #\\*[hex#]\"
+..
+.
+.
+.\" ******************************************************************
+.\" ** minimal Page setup **
+.\" ******************************************************************
+.
+.nr s \n[.ps]
+.nr v \n[.v]
+.nr p \n[.p]
+.nr o \n[.o]
+.nr l 6.6i \" set text width
+.ll \n[t*l]u
+.nr o 2c \" set offset
+.po \n[o]u
+.nr p 29.7c \" set paper length (A4)
+.pl \n[p]u
+.nr tH 1i \" set top margin
+.sp |\n[tH]u
+.
+.ds t*HM //arbitrary text for page header, except on the first page//\"
+.ds t*BM //arbitrary text for page footer, except on the last page/\\n[%]/\"
+.
+.ev 99
+.lt \n[t*l]u
+.ev
+.
+.
+.de HM
+. sp |.5i \" print header in top margin
+. tl \\*[t*HM]
+. sp |\\n[tH]u
+. ev
+..
+.
+.
+.de BM
+. ev 99
+. sp |(\\n[p]u - .5i) \" print footer in bottom margin
+. tl \\*[t*BM]
+. bp
+..
+.
+.
+.de EM
+. rm BM \" no page number at bottom of last page
+. t*EM
+..
+.
+.
+.wh 0 HM
+.wh 0-1.5i BM
+.em EM
+.
+.\" Some packages (-mm) define their own .SP macro.
+.\" Use ours if another one isn't already available.
+.if !d SP .als SP t*SP
+.
+.if "\n[.m]"" \
+. gcolor black
+.if "\n[.M]"" \
+. fcolor white
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/hdtbl/examples/fonts_n.in b/contrib/hdtbl/examples/fonts_n.in
new file mode 100644
index 0000000..c953fa4
--- /dev/null
+++ b/contrib/hdtbl/examples/fonts_n.in
@@ -0,0 +1,149 @@
+.ig
+
+font_n.roff
+
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2005-2020 Free Software Foundation, Inc.
+written by Joachim Walsdorff <Joachim.Walsdorff@urz.uni-heidelberg.de>.
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+..
+.
+.
+.\" ******************************************************************
+.\" ** groff glyphs vs. character codes: **
+.\" ** .fontdump [font1 font2 ...] **
+.\" ** Print glyphs of font1, font2, ..., versus **
+.\" ** character code. **
+.\" ** 'all' as fontname prints all fonts in the **
+.\" ** specified string 'fontpath'. **
+.\" ** without arg: glyphs and codes of active font. **
+.\" ******************************************************************
+.
+.ds fonts_n fonts_n.roff\" name for diagnostic messages
+.
+.if !d sopath \
+. ds sopath
+.
+.so \*[sopath]examples/common.roff
+.
+.if !d fontpath \
+. ds fontpath @fontdir@
+.
+.tm \*[fonts_n]: listing fonts in \*[fontpath]/dev\*[.T]
+.
+.de fontdump
+. ie \\n[.$] \
+. ds *args \\$*
+. el \
+. ds *args \\n[.fn]
+.
+. pso sh -c \
+ "printf '%s' '.ds *f ' ; \
+ ls \\*[fontpath]/dev\*[.T] \
+ | tr '[:cntrl:]' '[ *]'"
+. \" This dummy line is necessary; the preceding line eats it.
+.
+. while !"\\*[*args]"" \{\
+. pops *$1 *args
+.
+. if "\\*[*$1]"all" \{\
+. ds *args \\*[*f] \\*[*args]
+. pops *$1 *args
+. nr *all 1
+. \}
+.
+. if \\n[*all] \{\
+. if "\\*[*$1]"." \
+. nr *all 0
+. if !F \\*[*$1] \
+. continue
+. \}
+.
+. t*index "\\*[*f]" \\*[*$1]
+.
+. ie (\\n[.y] > 18) \
+. if !F \\*[*$1] \{\
+. tm \\*[fonts_n]: \\n[.F]:\\n[.c]: Font \\*[*$1] not found.
+. continue
+. \}
+. el \{\
+. if !\\n[t*index] \{\
+. tm \\*[fonts_n]: \\n[.F]:\\n[.c]: Font \\*[*$1] not found.
+. continue
+. \}
+.
+. nr * \\n[.f]
+. ft \\*[*$1]
+. nr ** \\n[.f]
+. ft
+.
+. if (\\n[**] == \\n[*]) \
+. continue
+. \}
+.
+. if \\n[t*cptn] \
+. bp
+.
+. tm \\*[fonts_n]: listing font '\\*[*$1]'...
+.
+. TBL border=.1n bc=red cpd=0 csp=.1n bgc=
+. CPTN groff font \\*[*$1] \
+ .br \
+ val=b ".pso @EGREP@ internalname \\*[fontpath]/dev\*[.T]/\\*[*$1]"
+. TR
+. TD
+. TBL cols=12 border=.1n bc=red csp=.1n cpd=.2n fgc=red4 bgc=beige \
+ hal=c fsz='1.2 1.2' fst=\\*[*$1]
+. nr c# 0-1 1
+. nr y# 0-1 1
+. TR fst=HB fgc=blue
+. TD
+. nr x# 0-1 1
+. \" following 4 'PN's instead of 4 while-loops as in
+. \" font_x.roff; short and easy to write, but a little
+. \" bit slower.
+. PN 10 .TD \
+ \&..\\\\n+[x#]
+. TD
+.
+. PN 27 .TR \
+ ".TD fgc=blue fst=HB" \
+ \\\\n+[y#]. \
+ ".PN 10 .TD \
+ "".if c \N'\En+[c#]' \
+ \N'\En[c#]'""" \
+ ".TD fgc=blue fst=HB" \
+ \\\\n[y#].
+.
+. TR fst=HB fgc=blue
+. TD
+. nr x# 0-1 1
+. PN 10 .TD \
+ \&..\\\\n+[x#]
+. TD
+. ETB
+. ETB
+. \}
+..
+.
+.fontdump all
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/hdtbl/examples/fonts_x.in b/contrib/hdtbl/examples/fonts_x.in
new file mode 100644
index 0000000..c183c7c
--- /dev/null
+++ b/contrib/hdtbl/examples/fonts_x.in
@@ -0,0 +1,160 @@
+.ig
+
+font_x.roff
+
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2005-2020 Free Software Foundation, Inc.
+written by Joachim Walsdorff <Joachim.Walsdorff@urz.uni-heidelberg.de>.
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+..
+.
+.
+.\" ******************************************************************
+.\" ** groff glyphs vs. character codes: **
+.\" ** .fontdump [font1 font2 ...] **
+.\" ** Print glyphs of font1, font2, ..., versus **
+.\" ** character code. **
+.\" ** 'all' as fontname prints all fonts in the **
+.\" ** specified string 'fontpath'. **
+.\" ** without arg: glyphs and codes of active font. **
+.\" ******************************************************************
+.
+.ds fonts_x fonts_x.roff\" name for diagnostic messages
+.
+.if !d sopath \
+. ds sopath
+.
+.so \*[sopath]examples/common.roff
+.
+.if !d fontpath \
+. ds fontpath @fontdir@
+.
+.tm \*[fonts_x]: listing fonts in \*[fontpath]/dev\*[.T]
+.
+.de fontdump
+. ie \\n[.$] \
+. ds *args \\$*
+. el \
+. ds *args \\n[.fn]
+.
+. pso sh -c \
+ "printf '%s' '.ds *f ' ; \
+ ls \\*[fontpath]/dev\*[.T] \
+ | tr '[:cntrl:]' '[ *]'"
+. \" This dummy line is necessary; the preceding line eats it.
+.
+. while !"\\*[*args]"" \{\
+. pops *$1 *args
+.
+. if "\\*[*$1]"all" \{\
+. ds *args \\*[*f] \\*[*args]
+. pops *$1 *args
+. nr *all 1
+. \}
+.
+. if \\n[*all] \{\
+. if "\\*[*$1]"." \
+. nr *all 0
+. if !F \\*[*$1] \
+. continue
+. \}
+.
+. t*index "\\*[*f]" \\*[*$1]
+.
+. ie (\\n[.y] > 18) \
+. if !F \\*[*$1] \{\
+. tm \\*[fonts_x]: \\n[.F]:\\n[.c]: Font \\*[*$1] not found.
+. continue
+. \}
+. el \{\
+. if !\\n[t*index] \{\
+. tm \\*[fonts_x]: \\n[.F]:\\n[.c]: Font \\*[*$1] not found.
+. continue
+. \}
+.
+. nr * \\n[.f]
+. ft \\*[*$1]
+. nr ** \\n[.f]
+. ft
+.
+. if (\\n[**] == \\n[*]) \
+. continue
+. \}
+.
+. if \\n[t*cptn] \
+. bp
+.
+. tm \\*[fonts_x]: listing font '\\*[*$1]'...
+.
+. TBL border=.1n bc=red cpd=0 csp=.1n bgc=
+. CPTN groff font \\*[*$1] \
+ .br \
+ val=b ".pso @EGREP@ internalname \\*[fontpath]/dev\*[.T]/\\*[*$1]"
+. TR
+. TD
+. TBL cols=18 border=.1n bc=red csp=.1n cpd=.2n fgc=red4 bgc=beige \
+ hal=c fsz='1.2 1.7' fst=\\*[*$1]
+. nr c# 0-1 1
+. nr y# 0 1
+. TR fst=HB fgc=blue
+. TD
+. nr x# 0-1 1
+. while (\\n+[x#] < 16) \{\
+. d2x \\n[x#]
+. TD
+. nop \&.\\*[hex#]
+. \}
+. TD
+.
+. nr y# -1
+. while (\\n+[y#] < 17) \{\
+. TR
+. TD fgc=blue fst=HB
+. d2x \\n[y#]
+. nop \\*[hex#].
+. nr x# 0-1 1
+. while (\\n+[x#] < 16) \{\
+. TD
+. if c \N'\\n+[c#]' \
+. nop \N'\\n[c#]'
+. \}
+. TD fgc=blue fst=HB
+. d2x \\n[y#]
+. nop \\*[hex#].
+. \}
+.
+. TR fst=HB fgc=blue
+. TD
+. nr x# 0-1 1
+. while (\\n+[x#] < 16) \{\
+. d2x \\n[x#]
+. TD
+. nop \&..\\*[hex#]
+. \}
+. TD
+. ETB
+. ETB
+. \}
+..
+.
+.fontdump all
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/hdtbl/examples/mixed_pickles.roff b/contrib/hdtbl/examples/mixed_pickles.roff
new file mode 100644
index 0000000..1c909e9
--- /dev/null
+++ b/contrib/hdtbl/examples/mixed_pickles.roff
@@ -0,0 +1,104 @@
+.ig
+
+mixed_pickles.roff
+
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2005-2020 Free Software Foundation, Inc.
+written by Joachim Walsdorff <Joachim.Walsdorff@urz.uni-heidelberg.de>.
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+..
+.
+.am pspic*error-hook
+. ab \\n[.F]:\\n[.c]: fatal error: PSPIC failed to include '\\$1'
+..
+.
+.if !d sopath \
+. ds sopath
+.
+.so \*[sopath]examples/common.roff
+.
+.H Table with Mixed Content: \
+ .br \
+ EPS Image, eqn Equation, tbl Table, and pic Picture
+.
+Call groff with options \-t, \-e, and \-p!
+.
+.TBL width=90% tal=c csp=.2n cpd=0
+. TR
+. TD
+. TBL width='25% 75%' csp=.5n cpd=.5n hal=c
+. TR
+. TD hl=d vl=d rowspan=2 bgc=red4 fgc=linen fsz=1.2 fst=HB val=m
+. PSPIC -I -\\n[.l]u gnu.eps
+. sp .5
+. nop eps image with \fI.PSPIC\fP
+. TD bgc=linen
+.
+.EQ
+int from 0 to 1 {( ln x ) sup 2} over {sqrt {1 - x sup 2}} dx approx 0.245
+.EN
+.
+. nop \0\0\0\0\0equation with \fIeqn\fP
+.
+. TR
+. TD hl=d
+.
+.TS
+tab(@), center, doublebox, nospaces;
+c c c | c c c
+r rI lB | r rI lB.
+Bit @ Code @ Warning @ Bit @ Code @ Warning
+=
+0 @ 1 @ char @ 10 @ 1024 @ reg
+1 @ 2 @ number @ 11 @ 2048 @ tab
+2 @ 4 @ break @ 12 @ 4096 @ right-brace
+3 @ 8 @ delim @ 13 @ 8192 @ missing
+4 @ 16 @ el @ 14 @ 16384 @ input
+5 @ 32 @ scale @ 15 @ 32768 @ escape
+6 @ 64 @ range @ 16 @ 65536 @ space
+7 @ 128 @ syntax @ 17 @ 131072 @ font
+8 @ 256 @ di @ 18 @ 262144 @ ig
+9 @ 512 @ mac @ 19 @ 524288 @ color
+.TE
+.
+. sp .5
+. nop table with \fItbl\fP
+. TR
+. TD colspan=2 bgc=azure2 fgc=blue4
+.
+.PS
+ellipse "document";
+arrow 0.42;
+box width 0.6 "\fIgpic\/\fP(1)"
+arrow 0.42;
+box width 1.25 "\fIgtbl\/\fP(1) or \fIgeqn\/\fP(1)" "(optional)" dashed;
+arrow 0.42;
+box width 0.65 "\fIgtroff\/\fP(1)";
+arrow 0.42;
+ellipse "PostScript"
+.PE
+.
+. sp .5
+. nop picture with \fIpic\fP
+. ETB
+.ETB
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/hdtbl/examples/rainbow.roff b/contrib/hdtbl/examples/rainbow.roff
new file mode 100644
index 0000000..ecd59f5
--- /dev/null
+++ b/contrib/hdtbl/examples/rainbow.roff
@@ -0,0 +1,86 @@
+.ig
+
+rainbow.roff
+
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2005-2020 Free Software Foundation, Inc.
+written by Joachim Walsdorff <Joachim.Walsdorff@urz.uni-heidelberg.de>.
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+..
+.
+.if !d sopath \
+. ds sopath
+.
+.so \*[sopath]examples/common.roff
+.
+.nr *n 25
+.nr *# 0 1
+.
+.de ctab
+. nr #cc 0
+. PN \\$1 \
+ ".nr #cc +(1f / \\$1)" \
+ ".defcolor \En[t*#] rgb \\$2 \\$3 \\$4" \
+ ".TBL csp=\n[t*l]/(12*\\$1+2) border= cpd=0 bgc=\\\\n[t*#] bc=" \
+ ".if (\\\\n+[*#] == 1) \
+ .CPTN Rainbow Colors \[em] Nested Tables with Colored Backgrounds \
+ val=b" \
+ .TR \
+ .TD
+..
+.
+.ctab \n[*n] 1 0 \En[#cc]u \" rot -> magenta
+.ctab \n[*n] 1-\En[#cc]u 0 1 \" magenta -> blue
+.ctab \n[*n] 0 \En[#cc]u 1 \" blue -> cyan
+.ctab \n[*n] 0 1 1-\En[#cc]u \" cyan -> green
+.ctab \n[*n] \En[#cc]u 1 0 \" green -> yellow
+.ctab \n[*n] 1 1-\En[#cc]u 0 \" yellow -> red
+.
+.PN 6*\n[*n] .ETB
+.
+.bp
+.
+.nr *n 25
+.nr *# 0 1
+.
+.de ctab
+. nr #cc 0
+. PN \\$1 \
+ ".nr #cc +(1f / \\$1)" \
+ ".defcolor \En[t*#] rgb \\$2 \\$3 \\$4" \
+ ".TBL border=\n[t*l]/(12*\\$1+2) csp=0 cpd=0 bc=\\\\n[t*#] bgc=" \
+ ".if (\\\\n+[*#] == 1) \
+ .CPTN Rainbow Colors \[em] Nested Tables with Colored Borders \
+ val=b" \
+ .TR \
+ .TD
+..
+.
+.ctab \n[*n] 1 \En[#cc]u 0 \" red -> yellow
+.ctab \n[*n] 1-\En[#cc]u 1 0 \" yellow -> green
+.ctab \n[*n] 0 1 \En[#cc]u \" green -> cyan
+.ctab \n[*n] 0 1-\En[#cc]u 1 \" cyan -> blue
+.ctab \n[*n] \En[#cc]u 0 1 \" blue -> magenta
+.ctab \n[*n] 1 0 1-\En[#cc]u \" magenta -> red
+.
+.PN 6*\n[*n] .ETB
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/hdtbl/examples/short_reference.roff b/contrib/hdtbl/examples/short_reference.roff
new file mode 100644
index 0000000..62b3bcd
--- /dev/null
+++ b/contrib/hdtbl/examples/short_reference.roff
@@ -0,0 +1,86 @@
+.ig
+
+short_reference.roff
+
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2005-2020 Free Software Foundation, Inc.
+written by Joachim Walsdorff <Joachim.Walsdorff@urz.uni-heidelberg.de>.
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+..
+.
+.if !d sopath \
+. ds sopath
+.
+.so \*[sopath]examples/common.roff
+.
+.t*pv 1.2 1.2 "" x
+.H Short Reference for the HDtbl-Macros
+This Short Reference describes the Heidelberger Table Macros
+using the macros themselves.
+.br
+.nr t*csp .3n
+.nr t*cpd .3n
+.ds t*ff HN
+.ds t*val m
+.ds t*hal l
+.xig
+.TBL "width=10% 40% 25% 25%" border= "fsz=1 .8"
+.CPTN Base- Optional- and Utility-Macros val=b
+.TR
+.TH Macro .TH Description .TH Predecessors .TH Successors
+.TR
+.TD \&.TBL .TD Begin a new table .TD \&.TD \&.TH \%.ETB cell content
+.TD \&.CPTN \&.TR
+.TR
+.TD \&.CPTN .TD Optional numbered or unnumbered table caption
+.TD \&.TBL .TD \&.TR
+.TR
+.TD \&.TR .TD Begin a new table row .TD \&.TBL \&.CPTN cell content
+.TD \&.TD \&.TR
+.TR
+.TD \&.TH .TD Optional begin table header cell
+.TD \&.TR \&.TD \&.TH \%.ETB cell content
+.TD \&.TD \&.TH \&.TR \%.ETB cell content
+.TR
+.TD \&.TD .TD Begin table data cell .TD \&.TR \&.TD \&.TH \%.ETB cell content
+.TD \&.TD \&.TH \&.TR \%.ETB cell content
+.TR
+.TD \&.ETB .TD Finish and print table .TD \&.TD \&.TH \%.ETB cell content
+.TD \&.TBL \&.TR \&.TD \&.TH \%.ETB cell content
+.TR
+.TD \&.t*free
+.TD colspan=3 val=t Utility macro to free held tables. Use it outside any table.
+.ETB
+.bp
+.x.
+.TBL "fsz=1 .8" "width=20% 32% 8% 8% 8% 8% 8% 8%" border=
+.TR
+.TH Argument .TH Value .TH \&.TBL .TH \&.CPT .TH \&.TR .TH \&.TH .TH \&.TD .TH \&.ETB
+.TR
+.TD border=\fI[n]\fP
+.TD border thickness .TD .ce X .TD .TD .TD .TD .TD
+.TR
+.TD bc=\fI[c]\fP
+.TD color of border and cellseperatorlines .TD .ce X .TD .TD .ce X .TD .ce X .TD .ce X .TD
+.ETB
+.H ------ incomplete -------
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/hdtbl/examples/test-hdtbl.sh.in b/contrib/hdtbl/examples/test-hdtbl.sh.in
new file mode 100644
index 0000000..5e81bf7
--- /dev/null
+++ b/contrib/hdtbl/examples/test-hdtbl.sh.in
@@ -0,0 +1,47 @@
+#!/bin/sh
+#
+# Copyright (C) 2018- 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+# Test generated files 'font_n.ps' and 'font_x.ps'. Both should have
+# 38 pages.
+
+builddir="@abs_top_builddir@"
+gs_program="@GHOSTSCRIPT@"
+ret=0
+
+if test "$gs_program" = "missing"; then
+ echo "ghostscript program missing, can't check hdtbl examples"
+ exit 77
+fi
+
+# $1 file, $2 expected number of pages
+check_number_pages()
+{
+ echo "Checking $1"
+ res=`$gs_program -o /dev/null/ -sDEVICE=bbox "$1" 2>&1 | grep HiResBoundingBox | wc -l`
+ if test $res != $2; then
+ echo " Error: expected $2 pages, found $res pages"
+ ret=255
+ fi
+}
+
+check_number_pages $builddir/contrib/hdtbl/examples/fonts_n.ps 38
+check_number_pages $builddir/contrib/hdtbl/examples/fonts_x.ps 38
+
+exit $ret
diff --git a/contrib/hdtbl/groff_hdtbl.7.man b/contrib/hdtbl/groff_hdtbl.7.man
new file mode 100644
index 0000000..af5ab87
--- /dev/null
+++ b/contrib/hdtbl/groff_hdtbl.7.man
@@ -0,0 +1,1346 @@
+.TH groff_hdtbl @MAN7EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+groff_hdtbl \- Heidelberger table macros for GNU
+.I roff
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2005-2020 Free Software Foundation, Inc.
+.\"
+.\" This file is part of groff, the GNU roff type-setting system.
+.\"
+.\" Permission is granted to copy, distribute and/or modify this
+.\" document under the terms of the GNU Free Documentation License,
+.\" Version 1.3 or any later version published by the Free Software
+.\" Foundation; with no Invariant Sections, 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_hdtbl_7_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.ig
+ Some simple formatting macros. Note that we use '.ig' here and not a
+ comment to make 'mandb' 2.4.1 (and probably more recent versions also)
+ happy; otherwise the '.char' lines and the stuff which follows is
+ included in the 'whatis' database.
+..
+.
+.
+.char \[lB] \F[\n[.fam]]\f[R][
+.char \[rB] \F[\n[.fam]]\f[R]]
+.
+.char \[or] \F[\n[.fam]]\f[R]\||\|
+.char \[ell] \F[\n[.fam]]\f[R].\|.\|.
+.
+.char \[oq] \F[\n[.fam]]\f[R]\[oq]
+.char \[cq] \F[\n[.fam]]\f[R]\[cq]
+.
+.
+.ie F CR \{\
+.
+. \" We have to solve the following problem. In this code
+. \"
+. \" foo
+. \" .CR bar
+. \" foo
+. \"
+. \" the space immediately after 'bar' should not be taken from the 'C'
+. \" family. At the same time, this
+. \"
+. \" foo
+. \" .CR bar\c
+. \" foo
+. \"
+. \" should work also. To fulfill both constraints we emit the
+. \" family changing commands both as escapes and macro calls.
+.
+. de make-C-macro
+. de C\\$1
+. ds old-fam \\\\n[.fam]
+. fam C
+. \\$2 \&\\\\$*\F[]\F[\\\\*[old-fam]]
+. fam
+. rm old-fam
+\\..
+. .
+.
+. make-C-macro R nop
+. make-C-macro B B
+. make-C-macro I I
+.
+. de make-C-macro
+. de C\\$1
+. ds old-fam \\\\n[.fam]
+. fam C
+. \\$1 \\\\$@ \F[]\F[\\\\*[old-fam]]
+. fam
+. rm old-fam
+\\..
+. .
+.
+. make-C-macro BI
+. make-C-macro IB
+. make-C-macro RI
+. make-C-macro IR
+. make-C-macro BR
+. make-C-macro RB
+.\}
+.el \{\
+. ftr CR R
+. ftr CI I
+. ftr CB B
+. ftr CBI BI
+.
+. de CR
+. nop \&\\$*
+. .
+. als CB B
+. als CI I
+.
+. als CBI BI
+. als CIB IB
+. als CRI RI
+. als CIR IR
+. als CBR BR
+. als CRB RB
+.\}
+.
+.
+.
+.de XB
+. B "\\$1"
+. shift
+. CR "\\$1\c"
+. shift
+. while \\n[.$] \{\
+. nop ,
+. CR "\\$1\c"
+. shift
+. \}
+. br
+..
+.
+.
+.de XAA
+. TQ
+. ie (\\n[.$] < 2) \
+. CR \\$@
+. el \
+. CRI \\$@
+..
+.
+.
+.de XDEF
+. br
+. B Default:
+. if !\\n[.$] \
+. return
+. CRI "\\$1" "\\$2"
+..
+.
+.
+.de XDEFR
+. br
+. B Default:
+. CR "\[oq]\\$1\[cq]"
+. nop (register
+. CR "\[oq]\\$2\[cq]\c"
+. nop ).
+..
+.
+.
+.de XDEFS
+. br
+. B Default:
+. CR "\[oq]\\$1\[cq]"
+. nop (string
+. CR "\[oq]\\$2\[cq]\c"
+. nop ).
+..
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The
+.I hdtbl
+macros consist of four base and three optional macros,
+controlled by about twenty arguments.
+.
+The syntax is simple and similar to the HTML table model and nearly as
+flexible:
+you can write sequences of tokens
+(macro calls with their arguments and content data),
+separated by blanks and beginning with a macro call,
+into the same line to get compact and cleanly arrranged input.
+.
+An advantage of
+.I hdtbl
+is that the tables are constructed without calling a preprocessor;
+this means that
+.MR groff @MAN7EXT@ 's
+full macro capabilities are available.
+.
+On the other hand,
+table processing with
+.I hdtbl
+is much slower than using the
+.MR @g@tbl @MAN1EXT@
+preprocessor.
+.
+A further advantage is that the HTML-like syntax of
+.I hdtbl
+will be easily converted to HTML;
+this is not implemented yet.
+.
+.
+.\" ====================================================================
+.SH Usage
+.\" ====================================================================
+.
+In this and the next section, we present examples to help users
+understand the basic workflow of
+.IR hdtbl .
+.
+First of all, you must load the
+.I hdtbl.tmac
+file.
+.
+As with nearly all other
+.I groff
+macro packages,
+there are two possibilities to do so:
+.
+Either add the line
+.
+.
+.PP
+.RS
+.EX
+\&.mso hdtbl.tmac
+.EE
+.RE
+.
+.
+.PP
+to your
+.I roff
+file before using any macros of the
+.I hdtbl
+package, or add the option
+.
+.PP
+.RS
+.EX
+\-m hdtbl
+.EE
+.RE
+.
+.
+.PP
+to the command line of groff (before the document file which contains
+.I hdtbl
+macros).
+.
+Then you can include on or more tables in your document, where each one
+must be started and ended with the
+.CR .TBL
+and
+.CR .ETB
+macros, respectively.
+.
+.
+.PP
+In this man page,
+we approximate the result of each example as terminal output to be as
+generic as possible since
+.I hdtbl
+currently only supports the
+.B ps
+and
+.B pdf
+output drivers.
+.
+.
+.PP
+The simplest well-formed table consists of just single calls to the
+four base table macros in the right order.
+.
+Here we construct a table with only one cell.
+.
+.
+.PP
+.RS
+.EX
+\&.TBL
+\&.TR
+\&.TD
+.I contents of the table cell
+\&.ETB
+.EE
+.RE
+.
+.
+.PP
+A terminal representation is
+.
+.
+.PP
+.if t .ne 3v
+.RS
+.EX
+.tr -\-
++------------------------------------------------------+
+.\" That's 27 spaces below.
+.RI "| " contents-of-the-table-cell " |"
++------------------------------------------------------+
+.tr --
+.EE
+.RE
+.
+.
+.PP
+Equivalent to the above is the following notation.
+.
+.
+.PP
+.RS
+.EX
+.RI ".TBL .TR .TD \[dq]" "contents of the table cell" "\[dq] .ETB"
+.EE
+.RE
+.
+.
+.PP
+By default, the formatted table is inserted into the surrounding text
+at the place of its definition.
+.
+If the vertical space isn't sufficient, it is placed at the top of
+the next page.
+.
+Tables can also be stored for later insertion.
+.
+.
+.PP
+Using
+.CIR \[oq]row-number * column-number\[cq]
+as the data for the table cells, a table with two rows and two columns
+can be written as
+.
+.
+.PP
+.RS
+.EX
+\&.TBL cols=2
+\&.\& TR .TD 1*1 .TD 1*2
+\&.\& TR .TD 2*1 .TD 2*2
+\&.ETB
+.EE
+.RE
+.
+.
+.PP
+A terminal representation is
+.
+.
+.PP
+.if t .ne 5v
+.RS
+.EX
+.tr -\-
++--------------------------+---------------------------+
+| 1*1 | 1*2 |
++--------------------------+---------------------------+
+| 2*1 | 2*2 |
++--------------------------+---------------------------+
+.tr --
+.EE
+.RE
+.
+.
+.PP
+Here we see a difference from HTML tables: The number of columns must be
+explicitly specified using the
+.CRI \[oq]cols= m\[cq]
+argument (or indirectly via the
+.CR \[oq]width\[cq]
+argument, see below).
+.
+.
+.PP
+The contents of a table cell is arbitrary;
+for example,
+it can be another table,
+without restriction to the nesting depth.
+.
+A given table layout can be either constructed with suitably nested
+tables or with proper arguments to
+.CR .TD
+and
+.CR .TH\c
+, controlling column and row spanning.
+.
+Note, however, that this table
+.
+.
+.PP
+.RS
+.EX
+\&.TBL
+\&.\& TR
+\&.\& TD
+\&.\& nop 1*1 1*2
+\&.\& TR
+\&.\& TD
+\&.\& TBL cols=2 border=
+\&.\& TR
+\&.\& TD
+\&.\& nop 2*1
+\&.\& TD
+\&.\& nop 2*2
+\&.\& ETB
+\&.ETB
+.EE
+.RE
+.
+.
+.PP
+and this table
+.
+.
+.PP
+.RS
+.EX
+\&.TBL cols=2
+\&.\& TR
+\&.\& TD colspan=2
+\&.\& nop 1*1 1*2
+\&.\& TR
+\&.\& TD
+\&.\& nop 2*1
+\&.\& TD
+\&.\& nop 2*2
+\&.ETB
+.EE
+.RE
+.
+.
+.PP
+are similar but not identical (the use of
+.CR .nop
+is purely cosmetic to get proper indentation).
+.
+.
+.PP
+The first table looks like
+.
+.PP
+.if t .ne 7v
+.RS
+.EX
+.tr -\-
++------------------------------------------------------+
+| 1*1 1*2 |
++------------------------------------------------------+
+| |
+| 2*1 2*2 |
+| |
++------------------------------------------------------+
+.tr --
+.EE
+.RE
+.
+.
+.PP
+and the second one like
+.
+.
+.PP
+.if t .ne 5v
+.RS
+.EX
+.tr -\-
++------------------------------------------------------+
+| 1*1 1*2 |
++---------------------------+--------------------------+
+| 2*1 | 2*2 |
++---------------------------+--------------------------+
+.tr --
+.EE
+.RE
+.
+.
+.PP
+Here is the latter table in a more compact form.
+.
+.PP
+.RS
+.EX
+\&.TBL cols=2 .TR \[dq].TD colspan=2\[dq] 1*1 1*2
+\&.\& TR .TD 2*1 .TD 2*2 .ETB
+.EE
+.RE
+.
+.
+.PP
+If a macro has one or more arguments
+(see below),
+and it is not starting a line,
+everything belonging to this macro including the macro itself must be
+enclosed in double quotes.
+.
+.
+.\" ====================================================================
+.SH "Macros and arguments"
+.\" ====================================================================
+.
+The order of macro calls and other tokens follows the HTML model.
+.
+In the following list, valid predecessors and successors of all
+.I hdtbl
+macros are given, together with the possible arguments.
+.
+.PP
+Macro arguments are separated by blanks.
+.
+The order of arguments is arbitrary; they are of the form
+.
+.PP
+.RS
+.CRI key= value
+.RE
+.
+.PP
+or
+.
+.PP
+.RS
+.CRI key=\[aq] "value1 \[lB]value2 \[lB]\[ell]\[rB]\[rB]" \[aq]
+.RE
+.
+.PP
+with the only exception of the optional argument of the macro
+.CR .ETB\c
+, which is the string
+.CR \[oq]hold\[cq]\c
+\&.
+.
+Another possible form is
+.
+.PP
+.RS
+.CRI \[dq]key= "value1 \[lB]value2 \[lB]\[ell]\[rB]\[rB]" \[dq]
+.RE
+.
+.
+.PP
+However,
+this is limited to the case where the macro is the first one in the line
+and not already enclosed in double quotes.
+.
+.
+.PP
+Argument values specified below as\~\c
+.CI c
+are colors predefined by
+.I groff
+or colors defined by the user with the
+.CR .defcolor
+request.
+.
+Argument values\~\c
+.CI d
+are decimal numbers with or without decimal point.
+.
+Argument values\~\c
+.CI m
+are natural numbers.
+.
+Argument values\~\c
+.CI n
+are numerical values with the usual
+.I groff
+scaling indicators.
+.
+Some of the arguments are specific to one or two macros, but most of
+them can be specified with
+.CR .TBL\c
+,
+.CR .TR\c
+,
+.CR .TD\c
+, and
+.CR .TH\
+\&.
+.
+These common arguments are explained in the next subsection.
+.
+.
+.PP
+Most of the argument default values can be changed by the user by
+setting corresponding default registers or strings, as listed below.
+.
+.\"==================================================================
+.
+.TP
+.CBI ".TBL " \[lB]args\[rB]
+Begin a new table.
+.
+.IP
+.RS
+.XB predecessor: .TD .TH .ETB "cell contents"
+.XB successor: .CPTN .TR
+.XB arguments:
+.
+.RS
+.XAA border= \[lB]n\[rB]
+Thickness of the surrounding box border.
+.
+.CR \%\[oq]border=\[cq]
+(no value) means neither a surrounding box border nor any horizontal or
+vertical separator lines between the table rows and cells.
+.
+.CR \%\[oq]border=0\[cq]
+suppresses the surrounding box border, but still allows separator lines
+between cells and rows.
+.
+.XDEFR border=.1n t*b
+.
+.XAA bc= c
+Border color.
+.
+.XDEFS bc=red4 t*bc
+.
+.XAA cols= m
+Number of table columns.
+.
+This argument is necessary if more than one column is in the table and
+no
+.CR \[oq]width\[cq]
+arguments are present.
+.
+.XDEFR cols=1 t*cols
+.
+.XAA cpd= n
+Cell padding, i.e., the extra space between the cell space border and
+the cell contents.
+.
+.XDEFR cpd=.5n t*cpd
+.
+.XAA csp= n
+Cell spacing, i.e., the extra space between the table border or
+vertical or horizontal lines between cells and the cellspace.
+.
+.XDEFR csp=.5n t*csp
+.
+.XAA tal=l\[or]c\[or]r
+Horizontal alignment of the table, if it is smaller than the line width.
+.
+.CR \[oq]tal=l\[cq]\c
+: left alignment.
+.
+.CR \[oq]tal=c\[cq]\c
+: centered alignment.
+.
+.CR \[oq]tal=r\[cq]\c
+: right alignment.
+.
+.XDEFR tal=l t*tal
+.
+.XAA "width=\[aq]" "w1 \[lB]w2 \[lB]\[ell]\[rB]\[rB]" \[aq]
+Widths of table cells.
+.
+.CI w1\c
+.RI , ""
+.CI w2\c
+.RI , ""
+\[ell] are either numbers of type\~\c
+.CI n
+or natural numbers with the pseudo-scaling indicator
+.CR \[oq]%\[cq]\c
+, with the meaning \[lq]percent of the actual line length
+(or column length for inner tables,
+respectively)\[rq].
+.
+If there are less width values than table columns,
+the last width value is used for the remaining cells.
+.
+The argument
+.
+.RS
+.IP
+.CR width=\[aq]1.5i 10%\[aq]
+.RE
+.
+.IP
+for example indicates that the first column is 1.5\~inches wide; the
+remaining columns take 1/10 of the column length each.
+.
+.XDEF
+The table width equals the outer line length or column length;
+the columns have equal widths.
+.
+.XAA height= n
+Height of the table.
+.
+If the table with its contents is lower than\~\c
+.CI n\c
+.RI , ""
+the last row is stretched to this value.
+.RE
+.RE
+.
+.\"==================================================================
+.
+.TP
+.CBI ".CPTN " \[lB]args\[rB]
+Text of caption.
+.
+.IP
+The (optionally numbered) table caption.
+.
+.CR .CPTN
+is optional.
+.
+.IP
+.RS
+.XB predecessor: .TBL
+.XB successor: .TR
+.XB arguments:
+.
+.RS
+.XAA val=t\[or]b
+Vertical alignment of the table caption.
+.
+.CR \[oq]val=t\[cq]\c
+: The caption is placed above the table.
+.
+.CR \[oq]val=b\[cq]\c
+: The caption is placed below the table.
+.
+.XDEFS val=t t*cptn
+.RE
+.RE
+.
+.\"==================================================================
+.
+.TP
+.CBI ".TR " \[lB]args\[rB]
+Begin a new table row.
+.
+.IP
+.RS
+.XB predecessor: .TBL .CPTN .TD .TH .ETB "cell contents"
+.XB successor: .TD .TH
+.XB arguments:
+.
+.RS
+.XAA height= n
+The height of the row.
+.
+If a cell in the row is higher than\~\c
+.CI n\c
+.RI , ""
+this value is ignored;
+otherwise the row height is stretched to\~\c
+.CI n\c
+.RI . ""
+.RE
+.RE
+.
+.\"==================================================================
+.
+.TP
+.CBI ".TD " "\[lB]args \[lB]cell contents\[rB]\[rB]"
+Begin a table data cell.
+.TQ
+.CBI ".TH " "\[lB]args \[lB]cell contents\[rB]\[rB]"
+Begin a table header cell.
+.
+.IP
+Arguments and cell contents can be mixed.
+.
+The macro
+.CR .TH
+is not really necessary and differs from
+.CR .TD
+only in three default settings, similar to the
+.CR <TH>
+and
+.CR <TD>
+HTML tags: The contents of
+.CR .TH
+is horizontally and vertically centered and typeset in boldface.
+.
+.IP
+.RS
+.XB predecessor: .TR .TD .TH .ETB "cell contents"
+.XB successor: .TD .TH .TR .ETB "cell contents"
+.XB arguments:
+.
+.RS
+.XAA colspan= m
+The width of this cell is the sum of the widths of the\~\c
+.CI m
+cells above and below this row.
+.
+.XAA rowspan= m
+The height of this cell is the sum of the heights of the
+.CI m
+cells left and right of this column.
+.
+.IP
+.B Remark:
+Overlapping of column and row spanning,
+as in the following table fragment
+(the overlapping happens in the second cell in the second row),
+is invalid and causes incorrect results.
+.
+.
+.RS
+.IP
+.EX
+\&.TR .TD 1*1 \[dq].TD 1*2 rowspan=2\[dq] .TD 1*3
+\&.TR \[dq].TD 2*1 colspan=2\[dq] .TD 2*3
+.EE
+.RE
+.
+.
+.PP
+A working example for headers and cells with
+.B colspan
+is
+.
+.
+.PP
+.RS
+.EX
+\&.TBL cols=3
+\&.\& TR \[dq].TH colspan=2\[dq] header1+2 .TH header3
+\&.\& TR .TD 1*1 .TD 1*2 .TD 1*3
+\&.\& TR .TD 2*1 \[dq].TD colspan=2\[dq] 2*2+3
+\&.ETB
+.EE
+.RE
+.
+.
+.PP
+This looks like
+.
+.
+.PP
+.if t .ne 7v
+.RS
+.EX
+.tr -\-
++------------------------------+---------------+
+| header1+2 | header3 |
++--------------+---------------+---------------+
+| 1*1 | 1*2 | 1*3 |
++--------------+---------------+---------------+
+| 2*1 | 2*2+3 |
++--------------+-------------------------------+
+.tr --
+.EE
+.RE
+.
+.
+.PP
+A working example with
+.B rowspan
+is
+.
+.
+.PP
+.RS
+.EX
+\&.TBL cols=3
+\&.\& TR
+\&.\& TD 1*1
+\&.\& TD rowspan=2 1+2*2
+\&.\& TD 1*3
+\&.\&
+\&.\& TR
+\&.\& TD 2*1
+\&.\& TD 2*3
+\&.ETB
+.EE
+.RE
+.
+.
+.PP
+which looks like
+.
+.
+.PP
+.if t .ne 5v
+.RS
+.EX
+.tr -\-
++--------------+---------------+---------------+
+| 1*1 | 1+2*2 | 1*3 |
++--------------+ +---------------+
+| 2*1 | | 2*3 |
++--------------+---------------+---------------+
+.tr --
+.EE
+.RE
+.RE
+.RE
+.
+.\"==================================================================
+.
+.
+.TP
+.CB ".ETB \[lB]hold\[rB]"
+End of the table.
+.
+.IP
+This macro finishes a table.
+.
+It causes one of the following actions.
+.
+.RS
+.IP \[bu] 3
+If the argument
+.CR \[oq]hold\[cq]
+is given, the table is held until it is freed by calling the macro
+.CR .t*free\c
+, which in turn prints the table immediately,
+either at the current position or at the top of the next page if its
+height is larger than the remaining space on the page.
+.
+.IP \[bu] 3
+Otherwise, if the table is higher than the remaining space on the page,
+it is printed at the top of the next page.
+.
+.IP \[bu] 3
+If neither of the two above constraints hold, the table is printed
+immediately at the place of its definition.
+.RE
+.
+.IP
+.RS
+.XB predecessor: .TD .TH .ETB "cell contents"
+.XB successor: .TBL .TR .TD .TH .ETB "cell contents"
+.XB arguments:
+.
+.RS
+.XAA hold
+Prevent the table from being printed until it is freed by calling the
+macro
+.CR .t*free\c
+\&.
+.
+This argument is ignored for inner (nested) tables.
+.RE
+.RE
+.
+.\"==================================================================
+.
+.TP
+.CBI ".t*free " \[lB]n\[rB]
+Free the next held table or
+.CI n\~\c
+.RI held ""
+tables.
+.
+Call this utility macro to print tables which are held by using the
+.CR \[oq]hold\[cq]
+argument of the
+.CR .ETB
+macro.
+.
+.
+.\" ====================================================================
+.SS "Arguments common to \f[CB].TBL\f[], \f[CB].TR\f[], \f[CB].TD\f[], \
+and \f[CB].TH\f[]"
+.\" ====================================================================
+.
+The arguments described in this section can be specified with the
+.CR .TBL
+and
+.CR .TR
+macros, but they are eventually passed on to the table cells.
+.
+If omitted,
+the defaults take place,
+which the user can change by setting the corresponding default registers
+or strings,
+as documented below.
+.
+Setting an argument with the
+.CR .TBL
+macro has the same effect as setting it for all rows in the table.
+.
+Setting an argument with a
+.CR .TR
+macro has the same effect as setting it for all the
+.CR .TH
+or
+.CR .TD
+macro in this row.
+.
+.IP
+.XAA bgc= \[lB]c\[rB]
+The background color of the table cells.
+.
+This includes the area specified with the
+.CR \[oq]csp\[cq]
+argument.
+.
+The argument
+.CR \[oq]bgc=\[cq]
+(no value) suppresses a background color; this makes the background
+transparent.
+.
+.XDEFS bgc=bisque t*bgc
+.
+.XAA fgc= c
+The foreground color of the cell contents.
+.
+.XDEFS fgc=red4 t*fgc
+.
+.XAA ff= name
+The font family for the table.
+.
+.CI name
+is a
+.I groff
+font family identifier,
+such as
+.CR A
+for Avant Garde or
+.CR HN
+for Helvetica Narrow.
+.
+.XDEF
+The font family found before the table (string
+.CR \[oq]t*ff\[cq]\c
+).
+.
+.XAA fst= style
+The font style for the table.
+.
+One of
+.CR R\c
+,
+.CR B\c
+,
+.CR I\c
+, or
+.CR BI
+for roman,
+.BR bold ,
+.IR italic ,
+or \f[BI]bold italic\f[], \" \f[BI] is not portable man(7)
+respectively.
+.
+As with
+.IR roff 's
+.B .ft
+request,
+the
+.CR \[oq]fst\[cq]
+argument can be used to specify the font family and font style together,
+for example
+.CR \[oq]fst=HNBI\[cq]
+instead of
+.CR \[oq]ff=HN\[cq]
+and
+.CR \[oq]fst=BI\[cq]\c
+\&.
+.
+.XDEF
+The font style in use right before the table (string
+.CR \[oq]t*fst\[cq]\c
+).
+.
+.XAA "fsz=\[aq]" "d1 \[lB]d2\[rB]" \[aq]
+A decimal or fractional factor
+.CI d1\c
+.RI , ""
+by which the point size for the table is changed, and
+.CI d2\c
+.RI , ""
+by which the vertical line spacing is changed.
+.
+If
+.CI d2
+is omitted, value
+.CI d1
+is taken for both.
+.
+.XDEFS "fsz=\[aq]1.0 1.0\[aq]" t*fsz
+.
+.XAA hal=l\[or]c\[or]b\[or]r
+Horizontal alignment of the cell contents in the table.
+.
+.CR \[oq]hal=l\[cq]\c
+: left alignment.
+.
+.CR \[oq]hal=c\[cq]\c
+: centered alignment.
+.
+.CR \[oq]hal=b\[cq]\c
+: both (left and right) alignment.
+.
+.CR \[oq]hal=r\[cq]\c
+: right alignment.
+.
+.XDEFS hal=b t*hal
+.
+.XAA val=t\[or]m\[or]b
+Vertical alignment of the cell contents in the table for cells lower
+than the current row.
+.
+.CR \[oq]val=t\[cq]\c
+: alignment below the top of the cell.
+.
+.CR \[oq]val=m\[cq]\c
+: alignment in the middle of the cell.
+.
+.CR \[oq]val=b\[cq]\c
+: alignment above the cell bottom.
+.
+.XDEFS val=t t*val
+.
+.XAA hl=\[lB]s\[or]d\[rB]
+Horizontal line between the rows.
+.
+If specified with
+.CR .TD
+or
+.CR .TH
+this is a separator line to the cell below.
+.
+.CR \[oq]hl=\[cq]
+(no value): no separator line.
+.
+.CR \[oq]hl=s\[cq]\c
+: a single separator line between the rows.
+.
+.CR \[oq]hl=d\[cq]\c
+: a double separator line.
+.
+.IP
+The thickness of the separator lines is the half of the border
+thickness,
+but at least 0.1\~inches.
+.
+The distance between the double lines is equal to the line thickness.
+.
+.IP
+.B Remark:
+Together with
+.CR \[oq]border=0\[cq]
+for proper formatting the value of
+.CR \[oq]csp\[cq]
+must be at least \&.05\~inches for single separator lines and
+\&.15\~inches for double separator lines.
+.
+.XDEFS hl=s t*hl
+.
+.XAA vl=\[lB]s\[or]d\[rB]
+Vertical separator line between the cells.
+.
+If specified with
+.CR .TD
+or
+.CR .TH
+this is a separator line to the cell on the right.
+.
+.CR \[oq]vl=s\[cq]\c
+: a single separator line between the cells.
+.
+.CR \[oq]vl=d\[cq]\c
+: a double separator line.
+.
+.CR \[oq]vl=\[cq]
+(no value): no vertical cell separator lines.
+.
+For more information see the documentation of the
+.CR \[oq]hl\[cq]
+argument above.
+.
+.XDEFS vl=s t*vl
+.
+.
+.\" ====================================================================
+.SH "\f[I]hdtbl\f[] customization"
+.\" ====================================================================
+.
+.PP
+Before creating the first table, you should configure default values
+to minimize the markup needed in each table.
+.
+The following example sets up defaults suitable for typical papers:
+.
+.
+.PP
+.RS
+.EX
+\&.ds t*bgc white\[rs]\[dq] background color
+\&.ds t*fgc black\[rs]\[dq] foreground color
+\&.ds t*bc black\[rs]\[dq] border color
+\&.nr t*cpd 0.1n\[rs]\[dq] cell padding
+.EE
+.RE
+.
+.
+.PP
+The file
+.I @EXAMPLEDIR@/\:hdtbl/\:\%common\:.roff
+provides another example setup
+in the \[lq]minimal Page setup\[rq] section.
+.
+.
+.PP
+A table which does not fit on a partially filled page is printed
+automatically on the top of the next page if you append the little
+utility macro
+.CR t*hm
+to the page header macro of your document's main macro package.
+.
+For example, say
+.
+.
+.PP
+.RS
+.EX
+\&.am pg@top
+\&.\& t*hm
+\&..
+.EE
+.RE
+.
+.
+.PP
+if you use the
+.I ms
+macro package.
+.
+.
+.PP
+The macro
+.CR t*EM
+checks for held or kept tables,
+and for missing
+.CR ETB
+macros (table not closed).
+.
+You can call this macro by appending it the to end-of-input macro of
+the main,
+or \[lq]full-service\[rq],
+macro package your document uses.
+.
+For example,
+try
+.
+.
+.RS
+.EX
+\&.am pg@end\-text
+\&.\& t*EM
+\&..
+.EE
+.RE
+.
+if you use the
+.I ms
+package.
+.
+.
+.\" ====================================================================
+.SH "Bugs and suggestions"
+.\" ====================================================================
+.
+Please send your comments to the
+.MT groff@\:gnu\:.org
+.I groff
+mailing list
+.ME
+or directly to the author.
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+The
+.I hdtbl
+macro package was written by
+.MT Joachim\:.Walsdorff@\:urz\:.uni\-heidelberg\:.de
+Joachim Walsdorff
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.TP
+.MR groff @MAN1EXT@
+provides an overview of GNU
+.I roff
+and details how to invoke
+.I groff
+at the command line.
+.
+.
+.TP
+.MR groff @MAN7EXT@
+summarizes the
+.I roff
+language and GNU extensions to it.
+.
+.
+.TP
+.MR @g@tbl @MAN1EXT@
+describes the traditional
+.I roff
+preprocessor for tables.
+.
+.
+.\" Unwind (some of) the stuff we've done.
+.rchar \[lB]
+.rchar \[rB]
+.rchar \[or]
+.rchar \[ell]
+.rchar \[oq]
+.rchar \[cq]
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_hdtbl_7_man_C]
+.do rr *groff_groff_hdtbl_7_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/hdtbl/hdmisc.tmac b/contrib/hdtbl/hdmisc.tmac
new file mode 100644
index 0000000..9709bd8
--- /dev/null
+++ b/contrib/hdtbl/hdmisc.tmac
@@ -0,0 +1,327 @@
+.ig
+
+hdmisc.tmac
+
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2005-2020 Free Software Foundation, Inc.
+written by Joachim Walsdorff <Joachim.Walsdorff@urz.uni-heidelberg.de>.
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+..
+.
+.
+.if d t*getarg \
+. nx
+.
+.
+.\" ******************************************************************
+.\" ** Some macros and default settings needed by hdtbl **
+.\" ******************************************************************
+.
+.
+.\" Utility macro: .getarg <key> ...
+.\"
+.\" Get macro argument. This macro searches <key> in the
+.\" remaining arguments and assigns its value to a string
+.\" register named <key>. The following syntax forms are
+.\" recognized.
+.\"
+.\" <key>=<val> Assign <val> to string <key>.
+.\" <val> must not contain spaces.
+.\" <key>='<val>' Assign <val> to string <key>.
+.\" <val> can contain spaces.
+.\" <key>= Assign '=' to string <key>.
+.\" <key> Assign 'key' to string <key>.
+.\"
+.\" After return, the string 'args' contains the remaining
+.\" arguments.
+.\"
+.\" Example: With the definition of string 'foo' as
+.\"
+.\" .ds foo aaa=xxx bbb ccc='yyy zzz' ddd= eee
+.\"
+.\" a call to 'getarg' with
+.\"
+.\" .getarg ccc \*[foo]
+.\"
+.\" sets string 'ccc' to value 'yyy zzz'. The string 'args'
+.\" now contains 'aaa=xxx bbb ddd= eee'. An additional call
+.\" like
+.\"
+.\" .getarg ddd \*[args]
+.\"
+.\" sets string 'ddd' to value '=', and 'args' contains
+.\" 'aaa=xxx bbb eee'.
+.de t*getarg
+. ds \\$1
+. ds args
+.
+. if (\\n[.$] < 2) \
+. return
+.
+. ds $1 \\$1\"
+. shift
+.
+. length * \\*[$1]
+. while \\n[.$] \{\
+. ds * "\\$1\"
+. ds ** "\\$1\"
+. length ** \\*[**]
+. shift
+. if (\\n[*] > \\n[**]) \{\
+. as args " "\\*[**]"\" value too short, repeat
+. continue
+. \}
+. substring * 0 (\\n[*] - 1)
+. \" The surrounding \? escapes emulate string comparison.
+. ie !"\?\\*[$1]\?"\?\\*[*]\?" \{\
+. as args " "\\*[**]"\" key not found, repeat
+. continue
+. \}
+. el \{\
+. ie "\?\\*[**]\?"\?\\*[$1]\?" \
+. ds \\*[$1] \\*[$1]\" return key as string
+. el \{\
+. ie "\?\\*[**]\?"\?\\*[$1]=\?" \
+. ds \\*[$1] =\" return '='
+. el \{\
+. substring ** (\\n[*] + 1) -1
+. ds * \\*[**]\"
+. substring * 0 0
+.
+. \" check whether value starts with quote
+. if "\?\\*[*]\?"\?'\?" \{\
+. substring ** 1 -1
+. ds * \\*[**]\"
+. substring * -1 -1
+.
+. \" search final quote
+. ie "\?\\*[*]\?"\?'\?" \
+. substring ** 0 -2
+. el \{\
+. as \\*[$1] \\*[**] \" not found, append argument
+.
+. while 1 \{\
+. ds ** \\$1\" get next argument
+. ds * \\$1\"
+. shift
+. substring * -1 -1
+.
+. if "\?\\*[*]\?"\?'\?" \{\
+. substring ** 0 -2
+. break \" break if no final quote
+. \}
+.
+. as \\*[$1] \\*[**] \" otherwise append and repeat
+. \}
+. \}\}
+.
+. as \\*[$1] \\*[**]\"
+. \}
+.
+. as args " \\$@\"
+. \}\}
+.
+. return
+. \}
+..
+.
+.
+.\" Utility macro: .index <string1> <string2>
+.\"
+.\" Check whether <string2> is a substring of <string1> and
+.\" return its position in number register 't*index', starting
+.\" with 1. If not found, return 0. If <string2> is empty,
+.\" set 't*index' to -999.
+.de t*index
+. if "\\$2"" \{\
+. nr t*index -999
+. return
+. \}
+.
+. length ** \\$1
+. length $2 \\$2
+. nr * 0-1 1
+.
+. while (\\n+[*] < \\n[**]) \{\
+. ds * \\$1\"
+. substring * \\n[*] (\\n[*] + \\n[$2] - 1)
+. \" The surrounding \? escapes emulate string comparison.
+. if "\?\\*[*]\?"\?\\$2\?" \
+. break
+. \}
+.
+. ie (\\n[*] == \\n[**]) \
+. nr t*index 0
+. el \
+. nr t*index (\\n[*] + 1)
+..
+.
+.
+.\" ******************************************************************
+.\" ******** non-accumulating space .t*SP [v] **********
+.\" ** **
+.\" ** nl vor erster Seite -1, oben auf Seite 0 resp. tH **
+.\" ** .k nach .sp oder .br 0, **
+.\" ** sonst Laenge der angefangenen Zeile **
+.\" ** Der Merker M# fuer vorangegangenes .t*SP wird in .HM am **
+.\" ** Seitenanfang zurueckgesetzt. **
+.\" ** ganz richtig ist .sp + .br = .br + .sp = .sp **
+.\" ******************************************************************
+.de t*SP
+. if (\\n[nl] < 0) \
+. br \" start very first page
+. nr * \\n[.p] \" save current page length
+.
+. ie "\\$1"" \
+. pl +1 \" without arg increase page length by 1v
+. el \
+. pl +\\$1 \" otherwise use \\$1
+.
+. nr ** (\\n[.p] - \\n[*]) \" ** now holds arg for .t*SP in base units
+. pl \\n[*]u \" restore page length
+.
+. \" we do nothing at start of new page or column
+. if ((\\n[nl] - \\n[tH]) & (\\n[nl] - \\n[<<]) : \\n[.k]) \{\
+. ie ((\\n[.d] - \\n[M#]) : \\n[.k]) \{\
+. sp \\n[**]u \" execute .sp
+. nr S# \\n[**] \" store ** in S#
+. \}
+. el \{\
+. if (\\n[**] - \\n[S#]) \{\
+. sp (\\n[**]u - \\n[S#]u)\" emit difference to previous .t*SP
+. nr S# \\n[**] \" store ** in S#
+. \}\}
+.
+. nr M# \\n[.d] \" store vertical position .d in M#
+. \}
+..
+.
+.
+.\" ******************************************************************
+.\" ** Perform all arguments once **
+.\" ** P1 is nestable **
+.\" ******************************************************************
+.de t*P1
+. \" 'while' command is about five times faster than recursion!
+. while \\n[.$] \{\
+. nop \\$1
+. shift
+. \}
+..
+.
+.
+.\" ******************************************************************
+.\" ** Hilfsmakro zum Einstellen von Schriftgroesse und **
+.\" ** Zeilenabstand, bezogen auf Anfangswerte \n[t*s] **
+.\" ** und \n[t*v] sowie fuer Hyphenation: **
+.\" ** .t*pv s v hy# hart; macht .br **
+.\" ** Bei 4. Argument setzen der Register s und v und hy. **
+.\" ** Fuer angefangene Zeile die vorgefundenen Einstellungen **
+.\" ** **
+.\" ** Auxiliary macro to set internal registers for font size **
+.\" ** and line spacing, relative to initial values \n[t*s] and **
+.\" ** \n[t*v]. Optionally sets hyphenation. A fourth argument **
+.\" ** initializes internal registers to global default values. **
+.\" ******************************************************************
+.de t*pv
+. br
+.
+. if \\n[.$] \
+. ps (\\n[t*s]u * \\$1z / 1z)
+.
+. ie (\\n[.$] - 1) \
+. vs (\\n[t*v]u * \\$2p / 1p)
+. el \{\
+. vs (\\n[t*v]u * \\$1p / 1p)
+. return
+. \}
+.
+. if !""\\$3" \
+. hy \\$3
+.
+. if !""\\$4" \{\
+. nr t*v \\n[.v]
+. nr t*s \\n[.ps]
+. nr t*hy \\n[.hy]
+. \}
+..
+.
+.
+.\" ******************************************************************
+.\" ** Hilfsmakros pop/pops/popr (pop stackelement): **
+.\" ** pop or popr: pop register **
+.\" ** pops: pop string **
+.\" ** .pop[s|r] reg|string stackname **
+.\" ** reg|string: name of reg/string to get the **
+.\" ** popped element **
+.\" ** stack: name of stack **
+.\" ******************************************************************
+.de *pop
+. ie "\\$1"pops" \
+. ds \\$2 \\$4\" pop first stackelement
+. el \
+. nr \\$2 \\$4
+.
+. ds $3 \\$3\" remember stackname
+. shift 4 \" shift four args
+.
+. ds \\*[$3] "\\$@\" fill stack with remaining elements
+..
+.
+.de pop
+. *pop \\$0 \\$1 \\$2 \\*[\\$2]
+..
+.
+.als popr pop
+.als pops pop
+.
+.
+.\" ******************************************************************
+.\" ** process diversion **
+.\" ******************************************************************
+.de t*DI
+. nr * \\n[.u]
+. nf \" diversion is already formatted - output it unchanged
+. \\$1 \" output the diversion ...
+. rm \\$1 \" ... and remove it
+. if \\n[*] \
+. fi \" reactivate formatting
+..
+.
+.\" ******************************************************************
+.\" ** error checking at end **
+.\" ******************************************************************
+.de t*EM
+.
+. if !"\\*[t*kept]"" \{\
+. tm1 "hdtbl: Not all tables have been printed.
+. tm1 " Add '.bp' at the end of your document.
+. \}
+. if !"\\*[t*held]"" \{\
+. tm1 "hdtbl: There are held tables which haven't been printed.
+. tm1 " Add '.t*free' at the end of your document.
+. \}
+. if \\n[t*#] \
+. tm hdtbl: Missing '.ETB' macro; last .TBL in \\*[t*FN] at line \\*[t*LN].
+..
+.
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/hdtbl/hdtbl.am b/contrib/hdtbl/hdtbl.am
new file mode 100644
index 0000000..3dd60cf
--- /dev/null
+++ b/contrib/hdtbl/hdtbl.am
@@ -0,0 +1,136 @@
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+# Written by Werner Lemberg <wl@gnu.org>
+# Automake migration by Bertrand Garrigues
+# <bertrand.garrigues@laposte.net>
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+hdtbl_srcdir = $(top_srcdir)/contrib/hdtbl
+
+man7_MANS += contrib/hdtbl/groff_hdtbl.7
+
+# Groff command used to generate .ps files
+HDTBLGROFF = \
+ GROFF_COMMAND_PREFIX= \
+ GROFF_BIN_PATH="$(GROFF_BIN_PATH)" \
+ $(GROFFBIN) $(FFLAG) $(MFLAG) -M$(hdtbl_srcdir) -t -p -e -U
+
+HDTBLTMACFILES = \
+ contrib/hdtbl/hdtbl.tmac \
+ contrib/hdtbl/hdmisc.tmac
+hdtbltmacdir = $(tmacdir)
+dist_hdtbltmac_DATA = $(HDTBLTMACFILES)
+
+hdtbl_test_template = contrib/hdtbl/examples/test-hdtbl.sh.in
+
+# Files installed in $(exampledir)/hdtbl. HDTBLEXAMPLEFILES are
+# located in the source tree, while HDTBLPROCESSEDEXAMPLEFILES are
+# generated in the build tree.
+
+# These files are handled by the '.in.roff' rule.
+HDTBLGENFILES = \
+ contrib/hdtbl/examples/fonts_n.roff \
+ contrib/hdtbl/examples/fonts_x.roff
+EXTRA_DIST += \
+ contrib/hdtbl/examples/fonts_n.in \
+ contrib/hdtbl/examples/fonts_x.in \
+ $(hdtbl_test_template)
+
+HDTBLEXAMPLEFILES = \
+ contrib/hdtbl/examples/common.roff \
+ contrib/hdtbl/examples/chess_board.roff \
+ contrib/hdtbl/examples/color_boxes.roff \
+ contrib/hdtbl/examples/color_nested_tables.roff \
+ contrib/hdtbl/examples/color_table_cells.roff \
+ contrib/hdtbl/examples/color_transitions.roff \
+ contrib/hdtbl/examples/col_rowspan_colors.roff \
+ contrib/hdtbl/examples/mixed_pickles.roff \
+ contrib/hdtbl/examples/rainbow.roff \
+ contrib/hdtbl/examples/short_reference.roff
+
+HDTBLPROCESSEDEXAMPLEFILES = \
+ contrib/hdtbl/examples/chess_board.ps \
+ contrib/hdtbl/examples/color_boxes.ps \
+ contrib/hdtbl/examples/color_nested_tables.ps \
+ contrib/hdtbl/examples/color_table_cells.ps \
+ contrib/hdtbl/examples/color_transitions.ps \
+ contrib/hdtbl/examples/col_rowspan_colors.ps \
+ contrib/hdtbl/examples/fonts_n.ps \
+ contrib/hdtbl/examples/fonts_x.ps \
+ contrib/hdtbl/examples/mixed_pickles.ps \
+ contrib/hdtbl/examples/rainbow.ps \
+ contrib/hdtbl/examples/short_reference.ps
+
+hdtblexampledir = $(exampledir)/hdtbl
+dist_hdtblexample_DATA = $(HDTBLEXAMPLEFILES)
+nodist_hdtblexample_DATA = \
+ $(HDTBLGENFILES) \
+ $(HDTBLPROCESSEDEXAMPLEFILES) \
+ $(DOC_GNU_EPS)
+
+$(hdtblexample_DATA): $(HDTBLTMACFILES)
+
+MOSTLYCLEANFILES += $(HDTBLGENFILES) $(HDTBLPROCESSEDEXAMPLEFILES)
+
+EXTRA_DIST += \
+ contrib/hdtbl/ChangeLog \
+ contrib/hdtbl/TODO \
+ contrib/hdtbl/groff_hdtbl.7.man
+
+hdtbl_TESTS = contrib/hdtbl/examples/test-hdtbl.sh
+TESTS += $(hdtbl_TESTS)
+contrib/hdtbl/examples/test-hdtbl.sh: \
+ $(top_builddir)/config.status \
+ $(HDTBLPROCESSEDEXAMPLEFILES) \
+ $(top_srcdir)/$(hdtbl_test_template)
+ $(AM_V_GEN)sed \
+ -e "s|[@]abs_top_builddir[@]|$(abs_top_builddir)|g" \
+ -e "s|[@]GHOSTSCRIPT[@]|$(GHOSTSCRIPT)|g" \
+ $(top_srcdir)/$(hdtbl_test_template) > $@ \
+ && chmod +x $@
+MOSTLYCLEANFILES += $(hdtbl_TESTS)
+
+# Rule to generate ps and roff files
+SUFFIXES += .roff .in .ps
+
+.roff.ps:
+ $(GROFF_V)$(MKDIR_P) `dirname $@` \
+ && $(HDTBLGROFF) -I $(doc_builddir) -I $(doc_srcdir) -Tps \
+ -dfontpath=$(top_srcdir)/font \
+ -dsopath=$(hdtbl_srcdir)/ \
+ -mhdtbl $< >$@
+
+.in.roff:
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && sed -e "s|[@]fontdir[@]|$(fontdir)|" \
+ -e "s|[@]EGREP[@]|$(EGREP)|" $< >$@
+
+
+$(HDTBLPROCESSEDEXAMPLEFILES): $(DOC_GNU_EPS) groff troff eqn pic tbl \
+ grops font/devps/stamp contrib/hdtbl/examples/common.roff
+
+uninstall_groffdirs: uninstall-hdtbl-hook
+uninstall-hdtbl-hook:
+ if test -d $(DESTDIR)$(hdtblexampledir); then \
+ rmdir $(DESTDIR)$(hdtblexampledir); \
+ fi
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/contrib/hdtbl/hdtbl.tmac b/contrib/hdtbl/hdtbl.tmac
new file mode 100644
index 0000000..422ede7
--- /dev/null
+++ b/contrib/hdtbl/hdtbl.tmac
@@ -0,0 +1,1003 @@
+.ig
+
+hdtbl.tmac
+
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2005-2020 Free Software Foundation, Inc.
+written by Joachim Walsdorff <Joachim.Walsdorff@urz.uni-heidelberg.de>.
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+..
+.
+.
+.\" *****************************************************************
+.\" * hdtbl - Heidelberger table macros *
+.\" * Vers. 0.91 December 2005 *
+.\" *****************************************************************
+.
+.if d TBL \
+. nx
+.
+.mso hdmisc.tmac
+.mso 62bit.tmac
+.
+.
+.\" *****************************************************************
+.\" * default values for some arguments *
+.\" *****************************************************************
+.
+.ds t*hl s\"
+.ds t*vl s\"
+.ds t*tal l\"
+.ds t*hal b\"
+.ds t*val t\"
+.ds t*ff \\n[.fam]\"
+.ds t*fst \\n[.f]\"
+.ds t*fsz 1 1\"
+.ds t*fgc red4\"
+.ds t*bgc bisque\"
+.ds t*bc red4\"
+.nr t*cpd .5n
+.nr t*csp .5n
+.nr t*b .1n
+.nr t*cols 1
+.nr t*v \n[.v]
+.nr t*s \n[.ps]
+.nr t*hy \n[.hy]
+.nr t*l \n[.ll]
+.
+.
+.\" defaults for table captions
+.nr t*cptn 0 1
+.ds t*cptn "".sp .4" \
+ ".t*pv 1.0 1.0" \
+ ".ad l" \
+ "\m[\\*[t*fgc]]Table \\n+[t*cptn]:\0\k*\c"\"
+.
+.
+.\" for better error messages
+.ds nth-1 st\"
+.ds nth-2 nd\"
+.ds nth-3 rd\"
+.
+.\" initialization of various registers
+.nr t*# 0 \" table nesting level
+.nr t*numb 0 1 \" held table diversion #
+.
+.ds *#trc*
+.
+.
+.\" *****************************************************************
+.\" * The four base macros and the two optional macros *
+.\" *****************************************************************
+.
+.ie n \
+. ds g tty:\"
+.el \
+. ds g ps: exec\"
+.
+.\" TBL: table start
+.\" predecessor: text, TD or ETB
+.\" successor: CPTN or TR
+.de TBL
+. ds t*m\\n[t*#] \\n[.m]\"
+. ie \\n[t*#] \
+. br
+. el \{\
+. ds * \\n[.ev]\"
+. ev t*tbl
+. evc \\*[*]
+. di t*tbl0
+. sp .4 \" XXX: hard-coded value
+. nr t*i \\n[.i]
+. ll -\\n[.i]u
+. in 0
+. \}
+. nr t*# +1
+.
+. \" Save current location for error checking at end
+. ds t*FN \\[.F]\"
+. ds t*LN \\[.c]\"
+.
+. t*getarg cols \\$@\" from here string 'args' contains the rest of \\$@
+. ie "\\*[cols]"" \
+. nr t*cols\\n[t*#] \\n[t*cols]
+. el \{\
+. ie \B\\*[cols] \
+. nr t*cols\\n[t*#] \\*[cols]
+. el \
+. tm \\n[.F]:\\n[.c]: Invalid number of columns value '\\*[cols]'.
+. \}
+.
+. t*getarg cpd \\*[args] \" cell padding
+. ie "\\*[cpd]"" \
+. nr t*cpd\\n[t*#] \\n[t*cpd]
+. el \{\
+. ie \B\\*[cpd] \
+. nr t*cpd\\n[t*#] \\*[cpd]
+. el \
+. tm \\n[.F]:\\n[.c]: Invalid cell padding value '\\*[cpd]'.
+. \}
+.
+. t*getarg csp \\*[args] \" cell spacing
+. ie "\\*[csp]"" \
+. nr t*csp\\n[t*#] \\n[t*csp]
+. el \{\
+. ie \B\\*[csp] \
+. nr t*csp\\n[t*#] \\*[csp]
+. el \
+. tm \\n[.F]:\\n[.c]: Invalid cell spacing value '\\*[csp]'.
+. \}
+.
+. t*getarg border \\*[args] \" border thickness
+. ie "\\*[border]"=" \
+. nr t*b\\n[t*#] 0-1
+. el \{\
+. ie "\\*[border]"" \
+. nr t*b\\n[t*#] \\n[t*b]
+. el \{\
+. ie \B\\*[border] \
+. nr t*b\\n[t*#] \\*[border]
+. el \
+. tm \\n[.F]:\\n[.c]: Invalid border thickness value '\\*[border]'.
+. \}\}
+.
+. t*getarg bc \\*[args] \" border color
+. ds t*bc\\n[t*#] \\*[t*bc]\"
+. if !"\\*[bc]"" \{\
+. ie m\\*[bc] \
+. ds t*bc\\n[t*#] \\*[bc]\"
+. el \{\
+. ie "\\*[bc]"=" \
+. ds t*bc\\n[t*#] =\"
+. el \
+. tm \\n[.F]:\\n[.c]: Invalid border color '\\*[bc]'.
+. \}\}
+. ie "\\*[bc]"=" \
+. ds t*bc\\n[t*#]
+. el \{\
+. ie "\\*[bc]"" \
+. ds t*bc\\n[t*#] \\*[t*bc]\"
+. el \
+. ds t*bc\\n[t*#] \\*[bc]\"
+. \}
+.
+. t*getarg width \\*[args] \" table/col widths
+. if "\\*[width]"=" \
+. ds width
+.
+. nr b/2\\n[t*#] (\\n[t*b\\n[t*#]] / 2)\" shortcut
+. nr cscp\\n[t*#] (\\n[t*csp\\n[t*#]] + \\n[t*cpd\\n[t*#]])\" aux. register
+.
+. t*getarg height \\*[args] \" table outline height
+. ie "\\*[height]"" \
+. nr t*height\\n[t*#] 0
+. el \{\
+. ie \B\\*[height] \
+. nr t*height\\n[t*#] (\\*[height] \
+ - ((2 * \\n[cscp\\n[t*#]]) \
+ + (3 * \\n[b/2\\n[t*#]])))
+. el \
+. tm \\n[.F]:\\n[.c]: Invalid height value '\\*[height]'.
+. \}
+.
+. t*cl \\*[width] \" get cell widths and offsets
+. t*args \\n[t*#] \" look for common arguments
+.
+. t*getarg tal \\*[args] \" table horizontal alignment
+. if "\\*[tal]"" \
+. ds tal \\*[t*tal]\"
+. ie "\\*[tal]"l" \
+. nr in\\n[t*#] \\n[.i]
+. el \{\
+. ie "\\*[tal]"c" \
+. nr in\\n[t*#] (\\n[.l] - \\n[ll\\n[t*#]]/2 + \\n[.i])
+. el \{\
+. ie "\\*[tal]"r" \
+. nr in\\n[t*#] (\\n[.l] - \\n[ll\\n[t*#]] + \\n[.i])
+. el \{\
+. tmc \\n[.F]:\\n[.c]: Invalid horizontal table alignment '\\*[tal]':
+. tm1 " must be 'l', 'c' or 'r'.
+. \}\}\}
+.
+. nr t*r#\\n[t*#] 0 \" initialize row index
+. mk toptbl\\n[t*#]
+.
+. t*P1 \\*[args]
+..
+.
+.
+.\" CPTN: optional table caption
+.\" predecessor: TBL
+.\" successor: TR
+.de CPTN
+. ft 1
+.
+. if "\\$0"CPTN" \
+. if \\n[t*r#\\n[t*#]] \{\
+. tmc \\n[.F]:\\n[.c]: Invalid placement of '.CPTN';
+. tm1 " must be called immediately after '.TBL'.
+. return
+. \}
+.
+. t*getarg val \\$@
+. ds args\\n[t*#] "\\*[args]\"
+.
+. t*index "\\*[args]" .TR
+. ie \\n[t*index] \{\
+. ds *a\\n[t*#] "\\*[args]\"
+. substring args\\n[t*#] 0 \\n[t*index]
+. substring *a\\n[t*#] \\n[t*index]-2 -1
+. \}
+. el \
+. ds *a\\n[t*#]
+.
+. ie "\\*[val]"b" \{\
+. de t*cptn\\n[t*#]
+. *CPTN \\*[args\\n[t*#]]
+. rm t*cptn\\n[t*#]
+\\..
+. \}
+. el \{\
+. ll (\\n[ll\\n[t*#]]u + \\n[in\\n[t*#]]u)
+. in \\n[in\\n[t*#]]u
+. t*P1 \\*[t*cptn]
+' in +\\n[*]u
+. t*P1 \\*[args\\n[t*#]]
+. t*pv 1 1
+. in
+. mk toptbl\\n[t*#]
+. \}
+.
+. t*P1 \\*[*a\\n[t*#]]
+..
+.
+.als *CPTN CPTN
+.
+.
+.\" TR: table row
+.\" predecessor: TBL, CPTN, text, TD or ETB
+.\" successor: TD
+.de TR
+. ft 1
+. if !\\n[t*#] \{\
+. tm \\n[.F]:\\n[.c]: Table row (.TR) without preceding table start (.TBL).
+. return
+. \}
+.
+. \" finish previous data cell, if any
+. if \\n[t*r#\\n[t*#]] \
+. t*dntr 1 \\n[c#\\*[#t#r]] \\n[t*cols\\n[t*#]] \\*[*#trc*]
+.
+. nr t*r#\\n[t*#] +1 \" row number in this table
+. ds #t#r \\n[t*#]*\\n[t*r#\\n[t*#]]\" table row identifier
+. \" (<level>*<row>)
+. nr c#\\*[#t#r] 0 1 \" clear cell counter
+. nr dntr\\*[#t#r] 0 1 \" clear accumulated row height
+.
+. t*getarg height \\$@
+. ie "\\*[height]"" \
+. nr t*height\\*[#t#r] 0
+. el \{\
+. ie \B\\*[height] \
+. nr t*height\\*[#t#r] \\*[height]
+. el \
+. tm \\n[.F]:\\n[.c]: Invalid table row height '\\*[height]'.
+. \}
+.
+. \" If there is a TR with height 'height', the total height of the table
+. \" is too high by 3/2 b, independent of the number of TR with 'height'.
+. t*args \\*[#t#r] \\n[t*#] \" look for common arguments
+.
+. t*P1 \\*[args]
+..
+.
+.
+.\" TH: optional table header cell
+.\" predecessor: text, TD or TR
+.\" successor: text, TD, TR, TBL or ETB
+.\"
+.\" cell content bolded and horizontally and vertically centered,
+.\" else like .TD
+.de TH
+. ft 1
+. t*getarg hal \\$@
+. if "\\*[hal]"" \
+. ds hal c\"
+.
+. t*getarg val \\*[args]
+. if "\\*[val]"" \
+. ds val m\"
+.
+. t*getarg fst \\*[args]
+. if "\\*[fst]"" \
+. ds fst B\"
+.
+. TD hal=\\*[hal] val=\\*[val] fst=\\*[fst] \\*[args]
+..
+.
+.
+.\" TD: table data cell
+.\" predecessor: text, TD or TR
+.\" successor: text, TD, TR, TBL or ETB
+.de TD
+. ft 1
+. \" finish previous data cell -- note the use of \E
+. t*dntr 0 \\n[c#\\*[#t#r]]-1 \En[c#\\*[#t#r]] \\*[*#trc*]
+.
+. ds *#trc* \\*[#t#r]*\\n[c#\\*[#t#r]]\" table cell identifier
+. \" (<level>*<row>*<column>)
+.
+. t*getarg rowspan \\$@
+. nr rowspan 1
+. if !"\\*[rowspan]"" \{\
+. ie \B\\*[rowspan] \{\
+. nr rowspan (\\*[rowspan] >? 1)
+. nr *rsp*\\*[*#trc*] (\\n[rowspan] - 1)
+. \}
+. el \
+. tm \\n[.F]:\\n[.c]: Invalid value of 'rowspan' keyword.
+. \}
+.
+. t*getarg colspan \\*[args]
+. nr colspan 1
+. if !"\\*[colspan]"" \{\
+. ie \B\\*[colspan] \
+. nr colspan (\\*[colspan] >? 1)
+. el \
+. tm \\n[.F]:\\n[.c]: Invalid value of 'colspan' keyword.
+. \}
+.
+. t*args \\*[#trc] \\*[#t#r] \" look for common arguments
+.
+. nr in\\*[#trc] \\n[in\\n[t*#]*\\n[c#\\*[#t#r]]]
+. nr *cl \\n[cll\\n[t*#]*\\n[c#\\*[#t#r]]]
+. nr * 0 1
+. nr *r \\n[t*r#\\n[t*#]]
+.
+. if (\\n[rowspan] - 1) \
+. while (\\n+[*] <= \\n[rowspan]) \{\
+. nr rspan\\n[t*#]*\\n[*r]*\\n[c#\\*[#t#r]] \\n[colspan]
+. if (\\n[*] > 1) \
+. nr cspan\\n[t*#]*\\n[*r]*\\n[c#\\*[#t#r]] \\n[colspan]
+. nr *r +1
+. \}
+.
+. nr * 1 1
+. nr *c \\n[c#\\*[#t#r]]
+.
+. if (\\n[colspan] - 1) \{\
+. nr vline\\*[*#trc*] 0-1 \" set 'no vl' flag
+.
+. while (\\n+[*] <= \\n[colspan]) \{\
+. nr *c +1
+. nr *cl +(2 * \\n[cscp\\n[t*#]] \
+ + \\n[b/2\\n[t*#]] \
+ + \\n[cll\\n[t*#]*\\n[*c]])
+. nr c#\\*[#t#r] +1
+. \}
+. \}
+.
+. if (\\n[c#\\n[t*#]*\\n[t*r#\\n[t*#]]] > \\n[t*cols\\n[t*#]]) \{\
+. ds * are\"
+. ds ** columns\"
+. if (\\n[c#\\*[#t#r]] == 1) \{\
+. ds * is\"
+. ds ** column\"
+. \}
+. tmc \\n[.F]:\\n[.c]: There \\*[*] \\n[c#\\*[#t#r]] table \\*[**] (.TD)
+.
+. ds * are\"
+. if (\\n[t*cols\\n[t*#]] == 1) \
+. ds * is\"
+. tm1 " but only \\n[t*cols\\n[t*#]] \\*[*] expected.
+.
+. ds *
+. length * \\n[.F]:\\n[.c]:
+.
+. while \\n-[*] \
+. ds * " \\*[*]\"
+.
+. tm1 "\\*[*] Remaining .TDs and its contents are ignored.
+.
+. di *t*dummy* \" bypass superfluous input
+. return
+. \}
+.
+. di t*\\*[#trc] \" open cell diversion and set locals
+. in 0
+. nr cll\\*[#trc] \\n[*cl]
+. ll \\n[*cl]u
+. nr *cl\\n[t*#] \\n[.l]
+. gcolor \\*[t*fgc\\*[#trc]]
+. ad \\*[t*hal\\*[#trc]]
+. fam \\*[t*ff\\*[#trc]]
+. ft \\*[t*fst\\*[#trc]]
+. t*pv \\*[t*fsz\\*[#trc]]
+.
+. t*P1 \\*[args]
+..
+.
+.
+.\" ETB: end of table
+.\" predecessor: text, TD or ETB
+.\" successor: text, TD, TR or TBL
+.de ETB
+. ie \\n[t*#] \
+. if !\\n[t*r#\\n[t*#]] \{\
+. tmc \\n[.F]:\\n[.c]: Each table (.TBL)
+. tm1 " should contain at least one table row (.TR)!
+. \}
+. el \{\
+. tmc \\n[.F]:\\n[.c]: Table end (.ETB)
+. tm1 " without corresponding table start (.TBL)!
+. \}
+.
+. ds #t#r \\n[t*#]*\\n[t*r#\\n[t*#]]\" refresh table row identifier
+. t*dntr 2 \\n[c#\\*[#t#r]] \\n[t*cols\\n[t*#]] \\*[*#trc*]
+.
+. t*divs \" print this table
+.
+. sp \\n[b/2\\n[t*#]]u
+. t*cptn\\n[t*#]
+. nr t*# -1
+.
+. ll \\n[*cl\\n[t*#]]u \" restore ll outside this table
+. in 0 \" reset indent
+. gcolor \\*[t*m\\n[t*#]] \" reset previous fgc
+.
+. t*getarg hold \\$@
+. if !\\n[t*#] \{\
+. sp .5
+. di
+. in \\n[t*i]u
+. ie "\\*[hold]"" \{\
+. ie (\\n[.t] - \\n[dn]) \
+. t*DI t*tbl0
+. el \{\
+. rn t*tbl0 t*tbl\\n+[t*numb]
+. ds t*kept \\*[t*kept] t*tbl\\n[t*numb] \\n[dn]\"
+. \}
+. \}
+. el \{\
+. rn t*tbl0 t*hold\\n+[t*numb]
+. tm \\n[.F]:\\n[.c]: Table t*hold\\n[t*numb] held.
+. ds t*held \\*[t*held] t*hold\\n[t*numb] \\n[dn]\"
+. \}
+.
+. ev \" restore previous environment
+. \}
+.
+. t*P1 \\*[args]
+..
+.
+.
+.\" *****************************************************************
+.\" * Following the definition of five utility macros *
+.\" * special to hdtbl. *
+.\" * Other utility macros common to hdtbl and hdgroff *
+.\" * are defined in the file hdmisc.tmac. *
+.\" *****************************************************************
+.
+.
+.\" .t*free [n]
+.\" print the next [n] held table[s].
+.\" Don't call it within a table!
+.\" If the table is higher than the remaining space
+.\" on the page, the table is printed on the next page.
+.de t*free
+. if "\\$0"CPTN" \
+. if \\n[t*r#\\n[t*#]] \{\
+. tmc \\n[.F]:\\n[.c]: Invalid placement of '.t*free' within a table;
+. tm1 " it must be called outside of any table.
+. return
+. \}
+.
+. if "\\*[t*held]"" \{\
+. tm \\n[.F]:\\n[.c]: No held tables.
+. return
+. \}
+.
+. nr ** (\\$1 >? 1) 1
+. while !""\\*[t*held]" \{\
+. pops * t*held
+. popr * t*held
+.
+. ie (\\n[.t] - \\n[*]) \{\
+. ev t*tbl
+. t*DI \\*[*]
+. ev
+. \}
+. el \{\
+. rn \\*[*] t*tbl\\n+[t*numb]
+. ds t*kept \\*[t*kept] t*tbl\\n[t*numb] \\n[*]\"
+. \}
+.
+. if !(\\n-[**] - 1) \
+. return
+. \}
+..
+.
+.
+.\" The main utility macro for tables:
+.\" If a table is closed by ETB, this macro is called. It
+.\" processes one complete table, i.e., all the table cell
+.\" diversions, paints the cell backgrounds, draws
+.\" horizontal and vertical table lines and the table border.
+.\"
+.\" Nested tables are processed from inside to outside.
+.
+.de t*divs
+. ll (\\n[t*l]u + 1c) \" avoid warning 'can't break line'
+. nf
+.
+. nr b/2 \\n[b/2\\n[t*#]] \" some abbreviations
+. nr cscp \\n[cscp\\n[t*#]]
+. nr cscpb (\\n[b/2] + \\n[cscp])
+.
+. nr topdiv (\\n[.d] + \\n[b/2] - \\n[cscp])\" top of cell diversion
+. nr cscpb2 (\\n[b/2] / 2 + \\n[cscp])
+.
+. nr #r 0 1
+. \" outer loop for rows
+. while (\\n+[#r] <= \\n[t*r#\\n[t*#]]) \{\
+. \" TODO: insert code here for multipage tables
+. nr * (\\n[#r] - 1)
+. nr topdiv +(\\n[dntr\\n[t*#]*\\n[*]] + \\n[cscp] + \\n[cscpb])
+.
+. \" if table still smaller than specified table height, increase it
+. if ((\\n[#r] == \\n[t*r#\\n[t*#]]) & \\n[t*height\\n[t*#]]) \
+. nr dntr\\n[t*#]*\\n[#r] (\\n[cscpb] \
+ + \\n[toptbl\\n[t*#]] \
+ + \\n[t*height\\n[t*#]] \
+ - (\\n[topdiv] >? \\n[dntr\\n[t*#]*\\n[#r]]))
+.
+. nr #c 0 1
+. \" inner loop for cells
+. while (\\n+[#c] <= \\n[t*cols\\n[t*#]]) \{\
+. ds #trc \\n[t*#]*\\n[#r]*\\n[#c]\"
+. \" continue if the diversion is empty
+. if !d t*\\*[#trc] \
+. continue
+.
+. sp |\\n[topdiv]u
+. in (\\n[in\\n[t*#]]u + \\n[in\\*[#trc]]u)\" cell offset
+. nr $1 \\n[dntr\\n[t*#]*\\n[#r]] \" cell height
+.
+. \" if we have spanned rows, calculate resulting row height
+. \" and position of lower horizontal line
+. if \\n[*rsp*\\*[#trc]] \{\
+. nr * \\n[#r] 1
+. nr rspan\\*[#trc] 0-1 \" set 'no hl' flag
+. nr corr (\\n[dn\\*[#trc]] - \\n[dntr\\n[t*#]*\\n[#r]])
+.
+. \" clear row span flags in following rows and update row height
+. while \\n[*rsp*\\*[#trc]] \{\
+. nr *rsp*\\*[#trc] -1
+. nr rspan\\n[t*#]*\\n+[*]*\\n[#c] 0
+. nr ** (\\n[dntr\\n[t*#]*\\n[*]] + \\n[cscp] + \\n[cscpb])
+. nr corr -\\n[**]
+. nr $1 +\\n[**]
+. \}
+.
+. if (\\n-[*] == \\n[t*r#\\n[t*#]]) \
+. nr $1 ((\\n[t*height\\n[t*#]] \
+ - \\n[.d] \
+ + \\n[toptbl\\n[t*#]] \
+ + \\n[cscpb]) \
+ >? \\n[$1])
+. nr dntr\\n[t*#]*\\n[*] +(\\n[corr] >? 0)
+. \}
+.
+. \" paint cell background
+. nr * (2 * \\n[t*cpd\\n[t*#]] + \\n[cll\\*[#trc]])\" background width
+. nr $1 (\\n[$1] >? \\n[dn\\*[#trc]])\" cell height
+.
+. if !"\\*[t*bgc\\*[#trc]]"=" \{\
+. nop \h'\\n[t*csp\\n[t*#]]u'\
+\M[\\*[t*bgc\\*[#trc]]]\
+\v'(-.67v - \\n[t*cpd\\n[t*#]]u)'\
+\D'P \\n[*]u 0 \
+ 0 (2u * \\n[t*cpd\\n[t*#]]u + \\n[$1]u) \
+ -\\n[*]u 0'\
+\M[]
+. sp -1
+. \}
+.
+. \" *** horizontal and vertical single or double lines ***
+. \" double and single lines have the same thickness;
+. \" the double lines' distance is the line thickness.
+. \"
+. \" 'border=x': horizontal/vertical lines x/2 thick, minimum .1n
+. \" 'border=0': no border; horizontal/vertical lines .1n thick
+. \" 'border=': neither border nor horizontal/vertical lines
+.
+. nr *t (.1n >? \\n[b/2]) \" thickness of hl/vl; min. .1n
+. in +\\n[cscp]u
+.
+. \" check for vertical and horizontal lines
+. if (1 + \\n[t*b\\n[t*#]]) \{\
+. if !"\\*[t*bc\\n[t*#]]"=" \{\
+. \" draw horizontal line between this cell and the one below
+. if (\\n[t*r#\\n[t*#]] - \\n[#r] + \\n[rspan\\*[#trc]]) \{\
+. if !"\\*[t*hl\\*[#trc]]"=" \{\
+. sp \\n[$1]u
+. nr * (\\n[cscp] + \\n[cscpb] + \\n[cll\\*[#trc]])
+. nop \X'\*[g] 1 setlinecap'\
+\h'(-\\n[cscpb2]u - \\n[*t]u)'\
+\v'(\\n[cscpb2]u - .67v)'\
+\m[\\*[t*bc\\n[t*#]]]\
+\D't \\n[*t]u'\c
+.
+. ie "\\*[t*hl\\*[#trc]]"d" \
+. nop \v'-\\n[*t]u'\
+\D'l \\n[*]u 0'\
+\v'(2u * \\n[*t]u)'\
+\D'l -\\n[*]u 0'\
+\D't 0'
+. el \
+. nop \D'l \\n[*]u 0'\
+\D't 0'
+.
+. sp (-\\n[$1]u - 1v)
+. \}\}
+.
+. nr rspan\\*[#trc] 0
+.
+. \" draw vertical line between this cell and the one to the right
+. if (\\n[t*cols\\n[t*#]] - \\n[#c] + \\n[vline\\*[#trc]]) \{\
+. if !"\\*[t*vl\\*[#trc]]"=" \{\
+. nop \X'\*[g] 1 setlinecap'\
+\v'(-\\n[cscpb2]u - .67v)'\
+\m[\\*[t*bc\\n[t*#]]]\
+\h'(\\n[cscpb2]u - \\n[*t]u + \\n[cll\\*[#trc]]u)'\c
+.
+. ie "\\*[t*vl\\*[#trc]]"d" \
+. nop \h'-\\n[*t]u'\
+\D't \\n[*t]u'\
+\D'l 0 (2u * \\n[cscp]u + \\n[$1]u + (\\n[*t]u / 2u))'\
+\h'(2u * \\n[*t]u)'\
+\D'l 0 -(2u * \\n[cscp]u + \\n[$1]u + (\\n[*t]u / 2u))'\
+\D't 0'
+. el \
+. nop \D't \\n[*t]u'\
+\D'l 0 (2u * \\n[cscp]u + \\n[$1]u + (\\n[*t]u / 2u))'\
+\D't 0'
+. sp -1
+. \}\}\}\}
+.
+. nr vline\\*[#trc] 0
+.
+. \" vert. cell content alignment
+. nr ** 0
+.
+. ie "\\*[t*val\\*[#trc]]"m" \
+. nr ** ((\\n[$1] - \\n[dn\\*[#trc]]) / 2)\" val=m
+. el \
+. if "\\*[t*val\\*[#trc]]"b" \
+. nr ** (\\n[$1] - \\n[dn\\*[#trc]])\" val=b
+.
+. sp \\n[**]u \" vertical content position
+.
+. \" finally output the diversion
+. t*\\*[#trc]
+. rm t*\\*[#trc]
+. \}
+. \}
+.
+. \" draw the box border
+. in \\n[in\\n[t*#]]u
+. nr ** (\\n[topdiv] + \\n[dntr\\n[t*#]*\\n-[#r]])
+.
+. if \\n[t*b\\n[t*#]] \{\
+. sp |(\\n[toptbl\\n[t*#]]u + \\n[b/2]u)
+. nr $1 (\\n[toptbl\\n[t*#]] - \\n[**] - \\n[cscp])
+. nr * (\\n[ll\\n[t*#]] - \\n[t*b\\n[t*#]])
+.
+. if !"\\*[t*bc\\n[t*#]]"=" \
+. nop \X'\*[g] 0 setlinejoin 2 setlinecap'\
+\v'-.67v'\
+\h'-\\n[b/2]u'\
+\m[\\*[t*bc\\n[t*#]]]\
+\D't \\n[t*b\\n[t*#]]u'\
+\D'l \\n[*]u 0'\
+\D'l 0 -\\n[$1]u'\
+\D'l -\\n[*]u 0'\
+\D'l 0 \\n[$1]u'\
+\D't 0'
+. \}
+.
+. sp |(\\n[**]u + \\n[cscpb]u)
+. fi
+..
+.
+.
+.\" Utility macro: .t*cl [width1 [width2 [...]]]
+.\"
+.\" Calculate cell widths, table width, and cell offsets.
+.de t*cl
+. nr t*cols\\n[t*#] (\\n[.$] >? \\n[t*cols\\n[t*#]])
+. nr ll\\n[t*#] 0 \" accumulated cell widths
+. nr ** (\\n[.l] / \\n[t*cols\\n[t*#]])\" width for remaining cells
+. nr * 0 1 \" counter
+.
+. \" while-loop: Parse user arguments to get each cell's width.
+. while (\\n[t*cols\\n[t*#]] >= \\n+[*]) \{\
+. nr $\\n[*] \\n[**]
+. if !"\\$[\\n[*]]"" \{\
+. \" check for '%' pseudo scaling indicator
+. ds * \\$\\n[*]\"
+. substring * -1 -1
+. ie "\\*[*]"%" \{\
+. ds ** \\$[\\n[*]]\"
+. substring ** 0 -2
+. ie \B\\*[**] \
+. nr $\\n[*] (\\*[**] * \\n[.l] / 100)
+. el \
+. tm \\n[.F]:\\n[.c]: Invalid relative cell width '\\*[**]%'.
+. \}
+. el \{\
+. ie \B\\$[\\n[*]] \
+. nr $\\n[*] \\$[\\n[*]]
+. el \
+. tm \\n[.F]:\\n[.c]: Invalid cell width '\\$[\\n[*]]'.
+. \}\}
+.
+. nr ll\\n[t*#] +\\n[$\\n[*]]
+. nr ** \\n[$\\n[*]]
+. \}
+.
+. if (\\n[ll\\n[t*#]] > \\n[.l]) \
+. tm \\n[.F]:\\n[.c]: Table width larger than column width.
+.
+. nr ** (0 >? \\n[t*b\\n[t*#]])
+. nr * 0 1
+.
+. \" second while loop: Compute final cell widths.
+. while (\\n[t*cols\\n[t*#]] >= \\n+[*]) \{\
+. \" Remove border width, if any.
+. if \\n[t*b\\n[t*#]] \{\
+. \" cell_width := cell_width * (length - 1.5*border) / length
+. nr #* (\\n[ll\\n[t*#]] - (3 * \\n[t*b\\n[t*#]] / 2))
+. nr *** (\\n[ll\\n[t*#]] / 2)
+. \" avoid multiplication overflow
+. mult31by31 $\\n[*] #* ****
+. add31to62 *** **** ****
+. div62by31 **** ll\\n[t*#] $\\n[*]
+. \}
+.
+. \" Get cell widths without padding, spacing, and separator line.
+. nr cll\\n[t*#]*\\n[*] (\\n[$\\n[*]] \
+ - (2 * \\n[cscp\\n[t*#]]) \
+ - \\n[b/2\\n[t*#]])
+.
+. \" Check whether value is non-positive.
+. if !\\n[cll\\n[t*#]*\\n[*]] \{\
+. nr #* (\\n[ll\\n[t*#]] - (3 * \\n[t*b\\n[t*#]] / 2))
+. nr *** (\\n[#*] / 2)
+. nr *h (2 * \\n[cscp\\n[t*#]] + \\n[b/2\\n[t*#]])
+. mult31by31 *h ll\\n[t*#] ****
+. add31to62 *** **** ****
+. div62by31 **** #* *h
+. ds * \\n[*]th\"
+. nr *** (\\n[*] % 10)
+. if d nth-\\n[***] \
+. ds * \\n[*]\\*[nth-\\n[***]]\"
+. tmc \\n[.F]:\\n[.c]: The \\*[*] width value (\\$\\n[*]) is too small.
+. tm1 " It should be greater than \\n[*h].
+. \}
+.
+. nr in\\n[t*#]*\\n[*] \\n[**] \" cell offset
+. nr ** +\\n[$\\n[*]]
+. \}
+..
+.
+.
+.\" Utility macro: .t*dntr <origin> <cell position> ? <cell ID>
+.\"
+.\" Close TD diversion, make some calculations, and set
+.\" some help strings and registers. <origin> is 0, 1,
+.\" or 2 if the call of .t*dntr occurs in .TD, .TR, or
+.\" .ETB, respectively.
+.de t*dntr
+. nr dn 0 \" reset diversion height
+. br \" finish cell data
+.
+. if "\\n[.z]"*t*dummy*" \
+. return
+.
+. ds #t#r \\n[t*#]*\\n[t*r#\\n[t*#]]\" refresh table row identifier
+.
+. if \\n[c#\\*[#t#r]] \{\
+. di \" close diversion
+. nr dn\\$4 \\n[dn] \" save height of this cell
+. if !\\n[rspan\\*[#trc]] \{\
+. \" update row height if not in a row span
+. nr dntr\\*[#t#r] (\\n[dntr\\*[#t#r]] >? \\n[dn])
+. if \\$2 \
+. nr dntr\\*[#t#r] ((\\n[t*height\\*[#t#r]] \
+ - (2 * \\n[cscp\\n[t*#]] + \\n[b/2\\n[t*#]])) \
+ >? \\n[dntr\\*[#t#r]])
+. \}\}
+.
+. nr c#\\*[#t#r] +1
+. nr * \\$2
+.
+. \" update column span registers
+. while (\\n+[*] <= \\$3) \{\
+. if r cspan\\*[#t#r]*\\n[*] \
+. nr c#\\*[#t#r] +\\n[cspan\\*[#t#r]*\\n[*]]
+. nr cspan\\*[#t#r]*\\n[*] 0
+. \}
+.
+. ds #trc \\*[#t#r]*\\n[c#\\*[#t#r]]\"
+.
+. \" only check for cell underflow if called by .TR or .ETB
+. if (\\$1 & (\\n[c#\\*[#t#r]] <= \\n[t*cols\\n[t*#]])) \{\
+. ds * are\"
+. ds ** columns\"
+. if (\\n-[c#\\*[#t#r]] == 1) \{\
+. ds * is\"
+. ds ** column\"
+. \}
+. tmc \\n[.F]:\\n[.c]: There \\*[*] only \\n[c#\\*[#t#r]] \\*[**]
+.
+. nr * \\n[t*r#\\n[t*#]]
+. ds * \\n[*]th\"
+. nr *** (\\n[*] % 10)
+. if d nth-\\n[***] \
+. ds * \\n[*]\\*[nth-\\n[***]]\"
+. tmc " in the \\*[*] row
+.
+. ds * are\"
+. if (\\n[t*cols\\n[t*#]] == 1) \
+. ds * is\"
+. tm1 " but \\n[t*cols\\n[t*#]] \\*[*] expected.
+. \}
+..
+.
+.
+.\" Utility-macro: .t*args level_1 [level_2]
+.\"
+.\" Get the arguments common to TBL, TR, and TD for the level
+.\" in argument 1, using default values from the level in
+.\" argument 2. If argument 2 is missing, use the global
+.\" default values.
+.\"
+.de t*args
+. ds t*bgc\\$1 \\*[t*bgc\\$2]\"
+. ds t*fgc\\$1 \\*[t*fgc\\$2]\"
+. ds t*hl\\$1 \\*[t*hl\\$2]\"
+. ds t*vl\\$1 \\*[t*vl\\$2]\"
+. ds t*hal\\$1 \\*[t*hal\\$2]\"
+. ds t*val\\$1 \\*[t*val\\$2]\"
+. ds t*ff\\$1 \\*[t*ff\\$2]\"
+. ds t*fst\\$1 \\*[t*fst\\$2]\"
+. ds t*fsz\\$1 \\*[t*fsz\\$2]\"
+.
+. if "\\*[args]"" \
+. return
+.
+. t*getarg bgc \\*[args] \" background color
+. if !"\\*[bgc]"" \{\
+. ie m\\*[bgc] \
+. ds t*bgc\\$1 \\*[bgc]\"
+. el \{\
+. ie "\\*[bgc]"=" \
+. ds t*bgc\\$1 =\"
+. el \
+. tm \\n[.F]:\\n[.c]: Invalid background color '\\*[bgc]'.
+. \}\}
+. if "\\*[args]"" \
+. return
+.
+. t*getarg fgc \\*[args] \" foreground color
+. if !"\\*[fgc]"" \{\
+. ie m\\*[fgc] \
+. ds t*fgc\\$1 \\*[fgc]\"
+. el \{\
+. ie "\\*[fgc]"=" \
+. ds t*fgc\\$1 =\"
+. el \
+. tm \\n[.F]:\\n[.c]: Invalid foreground color '\\*[fgc]'.
+. \}\}
+. if "\\*[args]"" \
+. return
+.
+. t*getarg hl \\*[args] \" horizontal line between cells
+. if !"\\*[hl]"" \
+. ds t*hl\\$1 \\*[hl]\"
+. if "\\*[args]"" \
+. return
+.
+. t*getarg vl \\*[args] \" vertical line between cells
+. if !"\\*[vl]"" \
+. ds t*vl\\$1 \\*[vl]\"
+. if "\\*[args]"" \
+. return
+.
+. t*getarg hal \\*[args] \" horizontal table cell alignment
+. if !"\\*[hal]"" \{\
+. t*index bcrl \\*[hal]
+. ie \\n[t*index] \
+. ds t*hal\\$1 \\*[hal]\"
+. el \{\
+. tmc \\n[.F]:\\n[.c]: Invalid horizontal alignment '\\*[hal]':
+. tm1 " must be 'b', 'c', 'l' or 'r'.
+. \}\}
+. if "\\*[args]"" \
+. return
+.
+. t*getarg val \\*[args] \" vertical table cell alignment
+. if !"\\*[val]"" \{\
+. t*index tmb \\*[val]
+. ie \\n[t*index] \
+. ds t*val\\$1 \\*[val]\"
+. el \{\
+. tmc \\n[.F]:\\n[.c]: Invalid vertical alignment '\\*[val]':
+. tm1 " must be 't', 'm' or 'b'.
+. \}\}
+. if "\\*[args]"" \
+. return
+.
+. t*getarg ff \\*[args] \" font family
+. if !"\\*[ff]"" \
+. ds t*ff\\$1 \\*[ff]\"
+. if "\\*[args]"" \
+. return
+.
+. t*getarg fst \\*[args] \" font style
+. if !"\\*[fst]"" \
+. ds t*fst\\$1 \\*[fst]\"
+. if "\\*[args]"" \
+. return
+.
+. t*getarg fsz \\*[args] \" font size and spacing factor
+. if !"\\*[fsz]"" \
+. ds t*fsz\\$1 \\*[fsz]\"
+..
+.
+.
+.\" Append to your page header macro ('pg@top' for MS)
+.\" to enable tables to span pages.
+.de t*hm
+. ev t*tbl
+. nr ** \\n[.t]
+. while !""\\*[t*kept]" \{\
+. pops * t*kept
+. popr * t*kept
+. if (\\n[*] - \\n[**]) \{\
+. tm \\n[.F]:\\n[.c]: Table \\*[*] higher than page -- ignored!
+. break
+. \}
+.
+. if (\\n[*] - \\n[.t]) \{\
+. ds t*kept \\n[*] \\*[t*kept]\"
+. ds t*kept \\*[*] \\*[t*kept]\"
+. tmc \\n[.F]:\\n[.c]: Remaining table(s),
+. tm1 " because not all fit onto this page.
+. break
+. \}
+.
+. t*DI \\*[*]
+. \}
+. ev
+..
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" End:
+.\" vim: filetype=groff:
diff --git a/contrib/mm/ChangeLog b/contrib/mm/ChangeLog
new file mode 100644
index 0000000..6c17811
--- /dev/null
+++ b/contrib/mm/ChangeLog
@@ -0,0 +1,1672 @@
+2023-05-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * groff_mm.7.man (Macros) <INDP>: Clarify operation.
+
+ Fixes <https://savannah.gnu.org/bugs/?64206>.
+
+2023-02-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mm]: Add `--help` option support to mmroff.
+
+ * mmroff.pl: Recognize `--help` option.
+ * mmroff.1.man (Synopsis, Options): Document.
+
+2023-02-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (H, SETR): Trivially refactor. Rename register to
+ conform to convention: `hd-mark-trimmed` -> `hd@mark-trimmed`.
+ This register is used outside of its "module", "hd".
+
+2023-02-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (H, LI): Trivially refactor. Annotate and test
+ threshold registers consistently.
+
+2023-02-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac: Fix code style nit. Except for initial register
+ tests for GNU troff formatter and compatibility mode, migrate
+ special character, register, and string interpolation escape
+ sequences from `(xx` form to `[xx]`. Also rewrite an instance
+ of `\nP` to `\n[P]`.
+
+2023-01-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ When register `Pt` was 2, paragraphs immediately following
+ displays and lists were being indented, contrary to DWB mm
+ behavior.
+
+ * m.tmac: Replace `par@ind-flag` register with two separate
+ state bits, `par*indentation-eligible` and
+ `par@suppress-indentation`.
+ (P, nP): Remove complex test for deciding whether the current
+ paragraph is being set immediately after a heading.
+ (P): Set `par*indentation-eligible` to the logical complement of
+ `par@suppress-indentation`. Call `par@doit` (which underlies
+ both `P` and `nP`) unconditionally.
+ (nP): Force `par*indentation-eligible` off, since numbered
+ paragraphs are not influenced by a `Pt` value of "2" in DWB mm.
+ {The paragraph number occupies the indentation space.}
+ (par@doit): Introduce local register `par*do-indent`,
+ manipulate it, and use it to control `ti` request instead of
+ scattering the request across multiple locations. Remove this
+ register when done. Clear `par@suppress-indentation` at end,
+ since after indentation is suppressed once, it should not happen
+ again until a special circumstance (the setting of a heading,
+ display, or list) arises.
+ (H): Convert test of `hd*htype` register, which tells us if
+ we're setting a run-in heading or not, from `if` to `ie`. (The
+ first paragraphing macro call after a run-in heading should
+ _not_ have its indentation suppressed, because the material
+ after the heading title constitutes a first pagraph.) In the
+ true arm, set `par@suppress-indentation`; in the new else arm,
+ clear it. This replaces the "complex test" above, and seems
+ much more straightforward and reliable. Stop manipulating
+ `par@ind-flag`.
+ (df@end, ds@end, LC): Set `par@suppress-indentation` instead of
+ clearing `par@ind-flag`.
+ (LE): Set `par@suppress-indentation`.
+
+ Fixes <https://savannah.gnu.org/bugs/?54909>. Thanks to Jeff
+ Conrad for the report.
+
+2023-01-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Regression-test Savannah #54909.
+
+ * tests/P-indentation-works.sh: Do it.
+ * mm.am (mm_TESTS): Run test.
+
+2023-01-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (df@print-float): Eliminate spew at high debug levels.
+ This macro gets called even when there aren't any floating
+ displays pending, so we cannot assume that related registers are
+ defined.
+
+2023-01-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (P): Fix missing backslash after brace escape sequence.
+ Problem introduced by me in 3b1afbdb8e, 6 January.
+
+2023-01-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac: Help user navigate the document type macros. Stop
+ setting up the formatter to throw "unrecognized macro"
+ diagnostics for macros that are plainly documented in
+ groff_mm(7).
+ (@disable): New macro takes a list of macros whose definitions
+ are replaced with a warning diagnostic about how they're no
+ longer unavailable due to use of another document type macro
+ already called, identified by new string `@cover`.
+ (TL, MT, COVER, LT, LO): Define `@cover` and call `@disable`.
+ Drop existing diagnostics that did a similar thing as above,
+ more verbosely.
+
+2023-01-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac: Revise diagnostic messages. Use a consistent message
+ format, including a space after a colon and the name of the
+ complaining macro.
+ (pg@header): Drop unnecessary empty comment at end of macro
+ call. Macro call syntax differs from `ds` request syntax.
+ (2C, MC, FD, FS, FE, DF, LB, LI, LE, LC, AL, ML, VL, BL, DL, RL)
+ (BVL, TH, TE, PS, B1, B2, APPSK, AS, SETR, GETST, GETHN, GETPN)
+ (INITI, IND, LT, LO): Refer to self with `\$0` escape sequence
+ instead of a literal.
+ (2C, MC, PS): Throw fatal error immediately instead of doing
+ other processing first.
+ (2C, MC, FD, FS, FE, DF, ds@set-format, ds@end, LB, LI, LE, LC)
+ (AL, ML, VL, BL, DL, RL, BVL, TH, TE, B1, B2, APPSK, AS, SETR)
+ (GETST, GETHN, GETPN, INITI, IND, let*lt-sign, LT, LO): Stop
+ unnecessarily quoting arguments to @error macro.
+ (FD, LB, VL, BVL, APPSK, SETR, GETST, GETHN, GETPN, INITI):
+ State quantities of expected and actual arguments.
+ (FS, FE, LC, B1, INITI): Clarify message.
+ (DF, DS): Store macro name in `ds@macro` for use in later
+ diagnostics thrown by internal macros.
+ (DS): Drop dead store to register `XXX`; debugging detritus?
+ (ds@set-format): Use `ds@macro`.
+ (ds@set-format, let*lt-sign, LT, LO): Bracket unrecognized
+ argument in single quotes.
+ (ds@set-format): Characterize argument as "unrecognized", not
+ "wrong". Similarly with the fill style.
+ (LI, LE, IND): Offer advice.
+ (LE): Describe problem in same terms as `LI` ("no list active").
+ (LC): Validate argument as numeric expression and die with
+ diagnostic if it isn't one.
+ (AL, ML, VL, BL, DL, RL, BVL): Weaken fatal diagnostic to
+ warning; excess arguments are not a serious problem.
+ (PS): Simplify control flow; since @error does not return,
+ convert `ie` request to `if` and make `el` branch unconditional.
+ (RP): Weaken fatal diagnostic to warning and return early;
+ calling this macro without any references defined does no
+ structural damage to a document.
+ (INITI): Remove redundant conditional.
+
+2023-01-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (IX): Delete.
+
+2023-01-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (MC): Throw internal error if we don't leave
+ `pg*cols-per-page` in a valid state after invalidating it to
+ count columns. Also simplify expression.
+
+2023-01-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (1C): Warn and return early instead of bombing out if
+ called when multiple columnation is inactive. A no-op should
+ not be a fatal error.
+
+2023-01-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (@abort): Introduce macro for internal errors,
+ unconditionally reporting a backtrace...
+ (misc@pop-set, hd@split, MULN, df@print-float, IND): ..and use
+ it instead of `@error` for problems with internal state.
+ (IND): Also fix botch in reported error.
+
+2023-01-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (SA): Reject an argument value > 1 as invalid.
+
+2023-01-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (P): Quote unrecognized argument in warning diagnostic.
+ (OK, PM): Refactor to use `\$0`.
+ (1C): Clarify that formatting can go wrong if you suppress a
+ page break when returning from multi- to single-column mode with
+ a footnote pending.
+
+2023-01-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (Tm): Align with definition of `Sm`, with analogous
+ fallback definitions.
+
+2023-01-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (Sm): Implement string for service mark, for DWB mm
+ compatibility.
+ * groff_mm.7.man: Document it.
+
+2023-01-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (CS): Define to throw diagnostic when used without ".MT
+ 4". (Later, if the "4.MT" file is sourced, this definition is
+ replaced.)
+ * groff_mm.7.man (Description): Clarify `CS` support status.
+
+2023-01-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (MOVE, SM, AT, LO): Weaken diagnostics when given no
+ arguments from (fatal) errors to warnings, then return.
+
+2023-01-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (PIC): Bomb out (with diagnostic) if either of the
+ width or height arguments are not numeric expressions.
+
+2023-01-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (EPIC): Handle and shift off a leading "-L" argument
+ before checking argument count. Then, if fewer than two
+ arguments remain, throw warning diagnostic and return early
+ instead of bombing out. Do bomb out (with diagnostic) if either
+ of the width or height arguments are not numeric expressions.
+ Fix bug which prevented third argument from being interpreted.
+ Annotate potential future development.
+
+2023-01-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (AU): Partially revert commit 4fd984adc9, 2021-07-17.
+ `AU` can be called for the sole purpose of "closing" a document
+ title "opened" with `TL`.
+ * groff_mm.7.man (Macros) <AU>: Update description.
+
+2023-01-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (TM): Warn if called without arguments.
+
+2023-01-16 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (AST): Preserve any user-specified leading spaces in
+ argument.
+
+2023-01-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (P): Warn if argument is non-numeric, and discard it.
+ Also warn if argument is out of range; people accustomed to
+ setting the `Pt` register to 2 might mistakenly believe it to be
+ meaningful here.
+
+2023-01-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * mm/0.MT:
+ * mm/5.MT: Drop never-read register `cov*mt0-ind`.
+
+2023-01-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Improve cover sheet diagnostics.
+
+ * m.tmac (MT): Warn and ignore if `COVER` or self already
+ called.
+ (COVER): Warn and ignore if `MT` already called.
+ * mm/0.MT (cov@print-title): Abort if title not defined; tell
+ user how to use the macros.
+ (cov@print-authors): Add similar paranoid diagnostic that I
+ don't think is reachable (since you _have_ to call `AU` to
+ "close" `TL`).
+ * mm/4.MT (cov@print-title, cov@print-authors):
+ * mm/5.MT (cov@print-title): As "0.MT".
+
+ * mm/4.MT: Get rid of spurious blank line in file.
+
+2023-01-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Fix Savannah #63613.
+
+ * mm/0.MT (cov*print-authors): Iterate through _all_ technical
+ memorandum numbers instead of stopping one shy of the last.
+ Problem appears to date back to introduction of TM support for
+ memorandum type 1 in commit a48ab7b6d (groff 1.05, 1992-03-18).
+
+ Fixes <https://savannah.gnu.org/bugs/?63613>.
+
+2023-01-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Regression-test Savannah #63613.
+
+ * tests/MT-1-reports-all-TM-numbers.sh: Do it.
+ * mm.am (mm_TESTS): Run test.
+
+2022-12-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (let*mt-sign): Check strings populated by optional
+ arguments to `AU` macro for existence before interpolating them.
+
+ Fixes <https://savannah.gnu.org/bugs/?24049>. Thanks to Werner
+ Lemberg for the report.
+
+2022-11-22 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * mse.tmac: Set `pg*footer-size` to four vees, not four basic
+ units; the latter is too small by orders of magnitude on
+ typesetting output devices.
+
+ Fixes <https://savannah.gnu.org/bugs/?63398>. Thanks to Hans
+ Bezemer for the report.
+
+2022-11-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Regression-test Savannah #63398.
+
+ * tests/mse_has-sufficient-footnote-space.sh: Do it.
+ * mm.am (mm_TESTS): Run test.
+
+2022-10-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mm]: Add `--version` option support to mmroff.
+
+ * mm.am (mmroff): Replace `@VERSION@` token in script.
+ * mmroff.pl: Recognize `--version` option.
+ * mmroff.1.man (Synopsis, Options): Document.
+
+2022-10-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * mmroff.pl: Add proper diagnostic subroutine. Add "progname"
+ scalar to store the name of the program.
+ (Die): New subroutine.
+ (print_index, top level): Call Die() when encountering
+ prohibitive problems instead of flinging a string into a void
+ context.
+
+2022-10-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * mmroff.pl: Enable Perl warnings.
+
+2022-10-09 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mm]: Refactor generation of "mmroff" script.
+
+ * mmroff.pl: Replace absolute filespec with `@PERL@` replacement
+ token. This is documentary; the filespec was getting replaced
+ anyway.
+ * mm.am (mmroff): Use more idiomatic token replacement strategy.
+ Also create target as a .tmp-suffixed file at first since it is
+ not initially executable, so that we don't race against anything
+ needing to run it in a parallelized build. (This is a
+ hypothetical concern; at present, nothing runs mmroff during the
+ build.)
+
+2022-10-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (pg@header): Add page length sufficiency check.
+
+ Fixes <https://savannah.gnu.org/bugs/?24048>. Thanks to Werner
+ Lemberg for the report.
+
+2022-10-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Regression-test Savannah #24048.
+
+ * tests/short-pages-do-not-overflow-stack.sh: Test it.
+ * mm.am (mm_TESTS): Run test.
+
+2022-09-17 Nikita Ivanov <nikita.vyach.ivanov@gmail.com>
+
+ * mm/ms.cov (cov@print-title, cov@print-authors): Escape
+ newlines when beginning conditional blocks.
+
+ Fixes <https://savannah.gnu.org/bugs/?63075>. [Problems
+ introduced by me in commits 59d1fd7a5e and 4fd984adc9, both
+ 2021-07-17. --GBR]
+
+2022-09-16 Nikita Ivanov <nikita.vyach.ivanov@gmail.com>
+
+ * m.tmac (misc@ev-keep): Select configured default font family,
+ as with `.fam H` at the top of the document, for example, when
+ switching to new environment.
+
+ Fixes <https://savannah.gnu.org/bugs/?63067>.
+
+2022-08-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (PY): Add new macro.
+ (PE): Replace `init@reset` call with `PY` (and then space by
+ half a vee as before).
+
+ * groff_mm.7.man (PY): Document it.
+
+ Fixes <https://savannah.gnu.org/bugs/?62900>.
+
+2022-08-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (@warning, @error): Stop pointlessly using no-break
+ control character when invoking the `tm` request, which never
+ causes a break in formatted output. (Management of the standard
+ output and standard error streams is the user's responsibility.)
+ (@error): Drop old-fashioned asterisk banners around error
+ diagnostics. Stop invoking `ab` with redundant and sometimes
+ misleading arguments. In groff 1.23, `ab` exits silently if
+ given none. We've already issued a diagnostic and moreover not
+ all problems are with "syntax"; some are semantic.
+
+2022-08-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (PS): Validate better; check for 2 arguments exactly.
+
+2022-08-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (PS): Refactor; drop dead code. The `pic*in` register
+ was used only for dead stores; it was never read or tested.
+
+2022-08-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (initialization): In nroff mode, surround automatically
+ numbered footnote markers in body text with square brackets, as
+ groff me(7) and ms(7) do.
+
+2022-08-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (initialization): Recognize new register `V` for
+ setting the vertical spacing from the command line, instead of
+ blindly setting the vertical spacing two points larger than the
+ type size. Handle setting of `V` and type size `S` in case they
+ are given with an appended scaling unit, using the same
+ technique as groff ms(7)--if the values are over 1,000, assume
+ that conversion to basic units by the formatter has already
+ taken place.
+ * groff_mm.7.man (Registers) <S, V>: Document it.
+
+2022-08-03 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (:p): Define register as an alias of `ft*nr`; the
+ former name is a documented DWB mm feature.
+
+2022-08-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * groff_mm.7.man: Document more features.
+ (Macros) <)E, VM>: Document these DWB mm internals as exposed by
+ groff mm.
+ (Macros) <B1, B2, MC>: Document as GNU extensions.
+ (Strings) <BU, Ci, F>: Document.
+ (Registers) <:R, Au, Ex, Fg, H8...H14, Oc, S>: Document.
+
+2022-07-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * groff_mm.7.man: Document further differences between DWB mm
+ and groff mm, including several unimplemented features.
+
+2022-07-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac: Remove pointless conditionals in initialization.
+ Simplify if-else request pairs that did the same thing in both
+ branches.
+
+2022-07-28 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * groff_mm.7.man: Document `NE` macro.
+
+2022-03-15 Damian McGuckin <damianm@esi.com.au>
+
+ * m.tmac (eq@check): Compensate for display indentation when
+ setting equation label.
+
+ Fixes <https://savannah.gnu.org/bugs/?62190>.
+
+2022-04-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Regression-test Savannah #62190.
+
+ * tests/place-equation-labels-correctly-in-displays.sh: Test it.
+ * mm.am (mm_TESTS): Run test.
+
+2021-08-12 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac (R): Alter to work analogously to `B` and `I` macros;
+ accept multiple arguments if given, and alternate roman with
+ previous font. Stop explicitly turning off underlining.
+
+2021-07-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Refactor author title handling.
+
+ * m.tmac (AU): Initialize `cov*at!` array element to zero for
+ current author number (`AT` already updates it).
+
+ * mm/ms.cov (cov@print-authors): Enforce requirement documented
+ in groff_mm(7) that .AU is mandatory if .COVER is used. Emit
+ diagnostic if `cov*au` is not defined, and skip remainder of
+ macro definition. Test for existence of authors' titles
+ differently; now that `cov*at!` (a count of titles for the
+ current author) is guaranteed to be initialized, we can use it
+ as part of a while loop condition, instead of the hard-coded "9"
+ as an arbitrary limit on the allowed quantity of author titles
+ {though surely even that is obnoxiously high in practice}, and
+ more importantly avoid using a \w escape to measure the width of
+ the interpolation of a potentially undefined string. Use `nop`
+ to indent text output. Delete apparent typo causing `mac`
+ warning with respect to undefined `.` macro. Introduce
+ temporary strings for the author and author title "loop indices"
+ to shorten and clarify logic. Remove them when done.
+
+ Fixes <https://savannah.gnu.org/bugs/?60926>.
+
+2021-07-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * mm/ms.cov (cov@print-title): Enforce requirement documented in
+ groff_mm(7) that .TL is mandatory if .COVER is used. Emit
+ diagnostic if `cov*title` is not defined, and skip remainder of
+ macro definition.
+
+2021-07-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * mm/ms.cov (COVEND): Fix thinko; test for existence of
+ `cov*abs-arg` register with `r` conditional operator, not `d`.
+
+2021-07-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac: Stop emitting debugging diagnostic using undefined
+ string. Problem exposed by commit
+ d6d98d2b3e0ad070037073bb288bbaee3fc04cf0, 8 December 2013.
+
+ Fixes <https://savannah.gnu.org/bugs/?60397>.
+
+2021-07-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Stop installing empty macro files.
+
+ * mm.am: Delete variable `MMLOCALE`.
+ (install_mm): Delete `for` loop that touches the files.
+ (uninstall_mm): Delete `for` loop that deletes the files.
+ * m.tmac: Update initializtion.
+ - Load the `\*[@country]_locale` file with `msoquiet` instead
+ of `mso`.
+ - Add version check to require groff 1.23 or later, since
+ the `msoquiet` request is now being used.
+ - Move "include guard" to follow the compatibility mode and
+ groff version checks. Remove its `do` prefix.
+ * groff_mm.7.man (Localization): Migrate topic into its own
+ subsection and update discussion.
+
+ Fixes <https://savannah.gnu.org/bugs/?60700>.
+
+2021-07-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * mm/ms.cov (cov@print-firm): Do nothing if the `cov*firm`
+ string is not defined. Silences a `mac` warning and prevents
+ the document date from being incorrectly aligned.
+
+ * tests/ms_cover_sheet_robust_to_missing_AF.sh: Test it.
+ * mm.am (mm_TESTS): Run test.
+
+ Fixes <https://savannah.gnu.org/bugs/?60915>.
+
+2021-07-14 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac: Rename `cov*mt-addresse` to `cov*mt-addressee`.
+ * NOTES: Update the only place the foregoing is documented.
+
+2021-05-31 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * groff_mm.7.man (Description/Macros) <LT>: Document the "SP"
+ {simplified} letter style more completely. Salutations and
+ formal closings are omitted.
+
+ Solves the remaining part of bug #60373, "the formal closing is
+ omitted completely". And, regarding the salutation, #60390.
+
+ Fixes <https://savannah.gnu.org/bugs/?60373> and
+ <https://savannah.gnu.org/bugs/index.php?60390>.
+
+2021-05-30 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ * m.tmac (let@sg_SP): Stop placing a comma after the first
+ argument (an author name set by AU) if the second argument is
+ empty (an author title set by AT).
+
+ Solves another part of bug #60373, "the writer's name at the
+ bottom is followed by a trailing comma".
+
+ Fixes <https://savannah.gnu.org/bugs/?60389>.
+
+2021-05-30 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ * m.tmac (let@print-head): Quote the interpolation of the string
+ `let*lo-SJ`.
+
+ Solves part of bug #60373, "[t]he subject line shows only the
+ first word".
+
+ Fixes <https://savannah.gnu.org/bugs/?60388>.
+
+2021-05-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Add regression tests for Savannah #60373.
+
+ * tests/LT_SP_AU_without_AT_works.sh:
+ * tests/LT_SP_multi-word_LO_SJ_works.sh: Add tests.
+ * mm.am (mm_TESTS): Run tests.
+
+2021-05-30 Tadziu Hoffman <hoffmann@usm.uni-muenchen.de>
+
+ Fix Savannah #57034.
+
+ * m.tmac (AT): Count author title declarations.
+ (let*mt-sign): Use correct index when iterating author names.
+ Prevent page break between author names and titles. Iterate
+ author titles and write them.
+
+ Fixes <https://savannah.gnu.org/bugs/?57034>.
+
+2021-05-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Add regression test for Savannah #57034.
+
+ * tests/MT_5_includes_AT_in_SG.sh: Test it. Thanks to Ken
+ Mandelberg for the reproducer.
+ * mm.am (mm_TESTS): Add variable storing script name.
+ (TESTS): Append `mm_TESTS` to run it.
+ (EXTRA_DIST): Append `mm_TESTS` to ship it.
+
+2021-05-30 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ * mm/5.MT (cov@print-title): Fix missing diagnostic. Memorandum
+ type 5 now requires a title to be declared with .TL.
+
+ Fixes <https://savannah.gnu.org/bugs/?59563>.
+
+2021-05-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mm]: Cease warning level manipulation.
+
+ Stop mm macro package from manipulating warnings.
+
+ * m.tmac: Remove code that attempted to enable all warnings if
+ none were given on the command line. It did this by simply
+ comparing the value of the warning register (\n[.warn]) against
+ the default value; but of course, a user could specify -w
+ options that exactly matched the default and the test would not
+ be able to tell, causing puzzling and undesired behavior.
+ Furthermore, the hard-coded default was out of date and did not
+ correspond to recent releases of groff. If you want all
+ warnings on, use the ".warn" request with no arguments in your
+ mm document or pass "-w w" to groff (see troff(1) or the Texinfo
+ manual for more on warnings).
+
+ See commit 5aa934e7, 20 February 2020.
+
+2021-05-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * examples/letter.mm: Revise to be a better example: use macro
+ package more effectively, follow *roff input conventions more
+ carefully, and incorporate more accurate comments.
+
+2021-05-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * m.tmac: Update diagnostics. When aborting, explicitly tell
+ the user we are doing so (see
+ a334cc97abbdfb9c41e28fcd7c187b81a0a3ceac, 25 September 2020).
+ (@mm): Define new string to hold prefix for diagnostic messages.
+ (@warning, @error): Use @mm. Reorder diagnostic messages to
+ conform with GNU Coding Standards.
+ (OK, PM): Use @warning instead of `tm` request directly.
+
+2019-09-10 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * Makefile.sim: Delete sed transformation of @G@. It is no
+ longer needed.
+
+2018-03-01 Werner LEMBERG <wl@gnu.org>
+
+ * m.tmac: Fix `.hy' value.
+
+ * groff_mm.7.man: Updated.
+
+2018-02-28 Werner LEMBERG <wl@gnu.org>
+
+ * mm.am (mmroff): Use $(AM_V_GEN) to silence file generation.
+
+2017-11-02 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * examples/letter.mm: New; simple example of mm usage.
+ * mm.am: Ship the file.
+
+2015-08-22 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * mmroff.1.man: Rename `mmroff.man'.
+
+ * groff_mm.7.man: Rename `groff_mm.man'.
+
+ * groff_mmse.7.man: Rename `groff_mmse.man'.
+
+ * mm.am: Include renamings.
+
+2015-08-05 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * mm.am, Makefile.sim: Add `Last update'. Setup Emacs mode.
+
+Thu Jul 16 11:52:03 2015 Carsten Kunze <carsten.kunze@arcor.de>
+
+ Fix line length of `.DS' with indentation (#45452).
+
+ If `.DS' with first argument `1' or `I' is used the output should
+ use an indentation of `\n[Si]n'. To make this work, the line length
+ within the `.DS' diversion must be set to zero, otherwise the
+ effective line length is too large.
+
+ * m.tmac (DS): Call `ds@set-new-ev' with correct indentation value.
+
+Fri Apr 3 16:33:22 2015 Werner LEMBERG <wl@gnu.org>
+
+ Make man pages work in compatibility mode.
+
+ * groff_mm.man, groff_mmse.man, mmroff.man: Do it.
+
+Wed Sep 3 21:29:00 2014 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * all files in contrib/mm: Copying and Emacs setting.
+
+Thu Aug 28 07:20:00 2014 Werner LEMBERG <wl@gnu.org>
+
+ * m.tmac (misc@tag): Fix horizontal position.
+ Problem reported by Blake McBride <blake@mcbride.name>.
+
+Sun Mar 30 21:45:00 2014 Steffen Nurpmeso <sdaoden@yandex.com>
+
+ * Makefile.sim, Makefile.sub: Put straight error-prevention prefixes
+ for `rm'.
+
+Wed Mar 6 22:18:00 2013 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ * groff_mm.man: Document .PIC flag -B (box). Default position of
+ picture is left (-L)
+
+Fri Mar 1 08:41:18 2013 Jim Avera <james_avera@yahoo.com>
+
+ * m.tmac (ds@set-format, LI): s/.ie/.if/ if no else clause.
+
+Sat Nov 17 18:36:56 2012 Anton Shepelev <anton.txt@gmail.com>
+
+ Fixed the format of header numbers in references.
+
+ * m.tmac (hd-mark-trimmed): New string to hold `hd-mark' without
+ spaces.
+ (SETR): Use it.
+
+Sun Aug 14 07:36:29 2011 Anton Shepelev <anton.txt@gmail.com>
+
+ Fix indents in nested static displays.
+
+ * m.tmac (DS, ds@end): Save indent with a stack.
+ See http://lists.gnu.org/archive/html/groff/2011-07/msg00068.html
+ for an example.
+
+Sun Mar 27 09:25:01 2011 Anton Shepelev <anton.txt@gmail.com>
+
+ * m.tmac (misc@tag): Fix last patch.
+
+Sat Mar 19 13:46:50 2011 James Avera <jimav>
+
+ * m.tmac (RD): Don't use `.ie' but `.if'.
+
+Fri Mar 18 09:10:19 2011 Anton Shepelev <anton.txt@gmail.com>
+
+ * m.tmac (misc@tag): Retain temporary indentation.
+
+Sat Feb 5 08:06:39 2011 Anton Shepelev <anton.txt@gmail.com>
+
+ Fix vertical space around displays.
+
+ * m.tmac (ds@end): Use `.SP', not `.sp'.
+
+Fri Jan 28 11:15:29 2011 Werner LEMBERG <wl@gnu.org>
+
+ Handle `refer-mm.tmac' file.
+
+ * refer-mm.tmac: New file.
+ * Makefile.sub (install_data, uninstall_sub): Handle it.
+
+Fri Jan 28 10:56:29 2011 Werner LEMBERG <wl@gnu.org>
+
+ Add `refer' support.
+
+ * m.tmac: Include `refer-mm.tmac'.
+
+Fri Jan 28 10:26:29 2011 Werner LEMBERG <wl@gnu.org>
+
+ Prepare `refer' support.
+
+ * m.tmac (\n[Rpe]): New register to control page eject status of the
+ `RP' macro.
+ (RP): Updated.
+ (ref@start-print): Move the trailing full stop in reference number
+ to...
+ (RS): This macro.
+
+ * groff_mm.man: Document `Rpe' register.
+
+Fri Jan 28 10:05:29 2011 Werner LEMBERG <wl@gnu.org>
+
+ * mmroff.man, groff_mm.man: s/reference/cross reference/ where
+ appropriate.
+
+Wed Jan 5 15:05:47 2011 Werner LEMBERG <wl@gnu.org>
+
+ Fix use of .DEVTAG-* macros.
+ Reported by Anton Shepelev <anton.txt@gmail.com>.
+
+ * m.tmac (misc@tag): Wrapper around .DEVTAG-* to compensate unwanted
+ vertical space.
+ (H): Use it.
+
+Mon Dec 27 09:39:20 2010 Werner LEMBERG <wl@gnu.org>
+
+ * groff_mm.man: Fix indentation.
+
+Thu Jun 24 12:43:27 2010 Tadziu Hoffmann <hoffmann@usm.uni-muenchen.de>
+
+ * m.tmac (misc@pop-nr): Fix assignment.
+ Reported as
+ http://lists.gnu.org/archive/html/groff/2010-06/msg00096.html
+
+Sat Jun 5 08:06:21 2010 Larry Jones <lawrence.jones@siemens.com>
+
+ * m.tmac (\*[BU]): Always define.
+
+Sat Jun 5 08:00:10 2010 Larry Jones <lawrence.jones@siemens.com>
+
+ Improve compatibility.
+
+ * m.tmac (}b, }f, }p): Define aliases for orthogonality with the
+ already available }t, }e, and }o for page headers.
+
+Wed Jun 2 16:03:39 2010 Larry Jones <lawrence.jones@siemens.com>
+
+ Fix .EOP handling and non-numeric format of \n[P].
+
+ * m.tmac (pg@header): Set `.af' temporarily to numeric format.
+ (pg@print-footer): Disable vertical traps for call to .EOP also.
+
+Wed Jun 2 16:03:39 2010 Larry Jones <lawrence.jones@siemens.com>
+
+ * m.tmac (toc@entry): Use MM page number (\nP).
+
+Sun May 30 07:14:15 2010 Larry Jones <lawrence.jones@siemens.com>
+
+ * m.tmac (P, nP): Fix handling of short paragraphs.
+ Otherwise,
+
+ .H 1 Bug
+ .P
+ one
+ .P
+ two
+ .P
+ three
+
+ results in:
+
+ 1. Bug
+
+ one two three
+
+ whereas it should, of course, produce:
+
+ 1. Bug
+
+ one
+
+ two
+
+ three
+
+Sat Jan 3 08:55:15 2009 Werner LEMBERG <wl@gnu.org>
+
+ * groff_mm.man: Use new `x' table modifier for all tables which use
+ T{...T}. This greatly improves formatting.
+
+Tue Feb 6 00:00:00 2007 Eric S. Raymond <esr@snark.thyrsus.com>
+
+ * groff_mm.man: Typo fix.
+
+Sat Feb 3 00:00:00 2007 Eric S. Raymond <esr@snark.thyrsus.com>
+
+ * groff_mm.man: Eliminate nonportable macro hackery in the
+ definition of T2 in favor or TBL tables.
+
+Fri Jan 5 14:35:35 2007 Werner LEMBERG <wl@gnu.org>
+
+ Fix installation. Reported by Jennifer Sayers.
+
+ * Makefile.sub (install, install_mm): Remove.
+ (install_bin, install_data): New targets.
+
+Sat Aug 12 23:33:45 2006 Nick Stoughton <nick@msbit.com>
+
+ * m.tmac (P): Ignore P after H, as documented.
+
+Tue Apr 4 07:19:57 2006 Werner LEMBERG <wl@gnu.org>
+
+ * groff_mm.man: Document strings TPh, TPeh, and TPoh.
+
+Wed Mar 29 06:58:24 2006 Werner LEMBERG <wl@gnu.org>
+
+ * m.tmac (pg@print-footer): Disable vertical traps while emitting
+ the footer. This fixes an endless loop caused by
+
+ .S 27 59
+ foo
+ .SK
+
+ Problem reported by Bill Brelsford <k2di2@att.net>.
+
+ (LI): Remove superfluous line which sets number register `x' without
+ reason. Problem reported by Morris Stern <mstern@mail.utexas.edu>.
+
+ (eq@check): Correctly flush labels to the right.
+ Problem reported by Morris Stern <mstern@mail.utexas.edu>.
+ Fix vertical positions of labels.
+
+ (ds@end): Emit pre-display space earlier.
+
+ * groff_mm.man: Document that only the last equation label of
+ .EQ/.EN blocks within .DS/.DE is printed.
+
+Tue Mar 28 14:00:06 2006 Werner LEMBERG <wl@gnu.org>
+
+ . Hardwire first four font positions with R, I, B, and BI -- the
+ documentation explicitly refers to this feature (cf. the `HF'
+ string register).
+
+ . Don't use `%' register in numeric calculations because it is
+ affected by `.af'.
+
+ Patches for both problems have been contributed by Nick Stoughton
+ <nick@usenix.org>.
+
+ * m.tmac: s/@language/@country/.
+ s/\n[%]/\n[P]/ where appropriate.
+ s/\fR/\f1/.
+ s/.ft R/.ft 1/.
+ s/\fI/\f2/.
+ s/.ft I/.ft 2/.
+ s/\fB/\f3/.
+ s/.ft B/.ft 3/.
+
+ * mse.tmac: s/@language/@country/.
+
+ * groff_mm.man (Fonts): New subsection.
+
+ * groff_mmse.man: Load `sv.tmac'.
+ Reformatted.
+
+ examples/README: Cleanups and updates.
+
+Mon Mar 27 15:44:24 2006 Werner LEMBERG <wl@gnu.org>
+
+ * groff_mm.man: Completely revised and reformatted to use as many
+ man macros as possible.
+
+Thu Mar 2 09:12:06 2006 Werner LEMBERG <wl@gnu.org>
+
+ * mse.tmac: Remove common Swedish strings and load sv.tmac instead.
+
+Sun Feb 26 13:57:13 2006 Claudio Fontana <claudio@gnu.org>
+
+ * Makefile.sub: Add DESTDIR to install and uninstall targets
+ to support staged installations.
+
+Fri Nov 25 14:31:02 2005 Werner LEMBERG <wl@gnu.org>
+
+ * mm/ms.cov (COVEND): Protect argument for `cov@print-abstract'
+ with doublequotes. Reported by Fabrice Ménard
+ <menard.fabrice@wanadoo.fr>.
+
+Tue Oct 25 21:59:04 2005 Bob Diertens <bobd@science.uva.nl>
+
+ * m.tmac (lix@print-line): Add parentheses to if-else clause to
+ fix logic.
+
+Thu May 26 08:23:40 2005 Werner LEMBERG <wl@gnu.org>
+
+ * m.tmac: Load devtag.tmac.
+
+Mon May 16 00:00:00 CEST 2005 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * mmroff.pl: Add space in shebang prototype for generated
+ conftest.sh script, conforming to portability recommendation in
+ autoconf docs.
+
+Wed Mar 16 06:56:02 2005 Larry Kollar <kollar@alltel.net>
+
+ 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 <jeff_conrad@msn.com>
+
+ * m.tmac (S): Improve debug message.
+
+Wed Mar 05:38:57 2004 Joergen Haegg <jh@axis.com>
+
+ * Changed default value for Hy in manual to 0
+ * Check Hy at each new page
+
+Mon Mar 1 22:16:38 2004 Jeff Conrad <jeff_conrad@msn.com>
+
+ * m.tmac (S): Fix scaling indicator for vertical spacing.
+
+Tue Nov 05:14:45 2003 Joergen Haegg <jh@axis.com>
+
+ * another patch from ulrich lauther to fix the
+ TOC up to 14 heading levels.
+
+Mon Oct 13:48:25 2003 Joergen Haegg <jh@axis.com>
+
+ * problem with more than 7 levels of headings fixed with
+ patch from ulrich lauther.
+
+Wed Apr 06:42:35 2003 Joergen Haegg <jh@axis.com>
+
+ * 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 <jh@axis.com>
+
+ * space adjustments in 4.MT to make it more like
+ the original
+
+Sun Mar 21:45:10 2003 Joergen Haegg <jh@axis.com>
+
+ * removed error check i 4.MT, .AF is not mandatory anymore
+
+Sat Mar 21:56:57 2003 Joergen Haegg <jh@axis.com>
+
+ * 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 <jh@axis.com>
+
+ * added .ll in pg@set-env to initialize the
+ header environment properly
+
+Wed Mar 19 23:02:16 2003 Werner LEMBERG <wl@gnu.org>
+
+ * groff_mm.man: Some fixes from Robert D. Goulding
+ <goulding@Princeton.EDU>.
+
+Wed Sep 09:53:06 2002 Joergen Haegg <jh@axis.com>
+
+ * 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 <bobd@science.uva.nl>
+
+ * m.tmac (VM): Add missing backslash.
+
+Fri Jun 10:37:58 2002 Joergen Haegg <jh@axis.com>
+
+ * added init@reset for LT-macros so .S works for letters
+
+Thu May 06:30:06 2002 Joergen Haegg <jh@axis.com>
+
+ * 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 <jh@axis.com>
+
+ * 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 <jh@axis.com>
+
+ * 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 <jh@axis.com>
+
+ * 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 <jh@axis.com>
+
+ * 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 no one 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 spurious .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 error 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 which 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 and 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, which 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
+
+________________________________________________________________________
+
+Copyright 1991-2020 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+Local Variables:
+fill-column: 72
+mode: change-log
+version-control: never
+End:
+vim:set autoindent textwidth=72:
diff --git a/contrib/mm/Makefile.sim b/contrib/mm/Makefile.sim
new file mode 100644
index 0000000..2d2d6b6
--- /dev/null
+++ b/contrib/mm/Makefile.sim
@@ -0,0 +1,84 @@
+# Copyright 1991-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# Makefile.sim
+#
+# To install mm 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" \
+ $< >$@
+
+# Local Variables:
+# mode: makefile
+# fill-column: 72
+# End:
+# vim: set filetype=make textwidth=72:
diff --git a/contrib/mm/NOTES b/contrib/mm/NOTES
new file mode 100644
index 0000000..1c35133
--- /dev/null
+++ b/contrib/mm/NOTES
@@ -0,0 +1,116 @@
+ Copyright (C) 1989-2020 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+######################################################################
+
+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 date (today if .ND not used)
+
+cov*mt-type S memorandum type set by .MT
+cov*mt-addressee S memorandum addressee set by .MT
+
+
+##########################
+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
+
+
+##### Editor settings
+Local Variables:
+mode: text
+End:
diff --git a/contrib/mm/README b/contrib/mm/README
new file mode 100644
index 0000000..6c6ca5b
--- /dev/null
+++ b/contrib/mm/README
@@ -0,0 +1,27 @@
+ Copyright (C) 1989-2020 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+This is mm, a macro package for groff.
+
+It is supposed to be compatible with the Documenter's Workbench (DWB) mm
+macros, and has several extensions.
+
+Please submit bug reports using groff's 'BUG-REPORT' file to
+http://savannah.gnu.org/bugs/?group=groff.
+
+Any new ideas or improvements are welcome.
+
+This README should be bigger :-)
+
+/Jörgen Hägg
+
+Thanks to everyone who have sent me bug reports and fixes.
+
+
+##### Editor settings
+Local Variables:
+mode: text
+End:
diff --git a/contrib/mm/examples/APP b/contrib/mm/examples/APP
new file mode 100644
index 0000000..e2c017f
--- /dev/null
+++ b/contrib/mm/examples/APP
@@ -0,0 +1,359 @@
+.\" -*- nroff -*-
+.\" Copyright (C) 1989-2014 Free Software Foundation, Inc.
+.\"
+.\" Copying and distribution of this file, with or without modification,
+.\" are permitted in any medium without royalty provided the copyright
+.\" notice and this notice are preserved.
+.
+.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..5847d67
--- /dev/null
+++ b/contrib/mm/examples/B1B2
@@ -0,0 +1,98 @@
+.\" -*- nroff -*-
+.\" Copyright (C) 1989-2014 Free Software Foundation, Inc.
+.\"
+.\" Copying and distribution of this file, with or without modification,
+.\" are permitted in any medium without royalty provided the copyright
+.\" notice and this notice are preserved.
+.
+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..affdd2d
--- /dev/null
+++ b/contrib/mm/examples/COVER
@@ -0,0 +1,242 @@
+.\" -*- nroff -*-
+.\" Copyright (C) 1989-2014 Free Software Foundation, Inc.
+.\"
+.\" Copying and distribution of this file, with or without modification,
+.\" are permitted in any medium without royalty provided the copyright
+.\" notice and this notice are preserved.
+.
+.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..ad4ee5a
--- /dev/null
+++ b/contrib/mm/examples/IND
@@ -0,0 +1,4198 @@
+.\" -*- nroff -*-
+.\" Copyright (C) 1989-2014 Free Software Foundation, Inc.
+.\"
+.\" Copying and distribution of this file, with or without modification,
+.\" are permitted in any medium without royalty provided the copyright
+.\" notice and this notice are preserved.
+.
+.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..2dbf189
--- /dev/null
+++ b/contrib/mm/examples/LT
@@ -0,0 +1,1065 @@
+.\" -*- nroff -*-
+.\" Copyright (C) 1989-2014 Free Software Foundation, Inc.
+.\"
+.\" Copying and distribution of this file, with or without modification,
+.\" are permitted in any medium without royalty provided the copyright
+.\" notice and this notice are preserved.
+.
+.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..6635c70
--- /dev/null
+++ b/contrib/mm/examples/LT.se
@@ -0,0 +1,1069 @@
+.\" -*- nroff -*-
+.\" Copyright (C) 1989-2014 Free Software Foundation, Inc.
+.\"
+.\" Copying and distribution of this file, with or without modification,
+.\" are permitted in any medium without royalty provided the copyright
+.\" notice and this notice are preserved.
+.
+.\" 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..3ca16ad
--- /dev/null
+++ b/contrib/mm/examples/ML
@@ -0,0 +1,176 @@
+.\" -*- nroff -*-
+.\" Copyright (C) 1989-2014 Free Software Foundation, Inc.
+.\"
+.\" Copying and distribution of this file, with or without modification,
+.\" are permitted in any medium without royalty provided the copyright
+.\" notice and this notice are preserved.
+.
+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..d2a31e5
--- /dev/null
+++ b/contrib/mm/examples/MOVE
@@ -0,0 +1,182 @@
+.\" -*- nroff -*-
+.\" Copyright (C) 1989-2014 Free Software Foundation, Inc.
+.\"
+.\" Copying and distribution of this file, with or without modification,
+.\" are permitted in any medium without royalty provided the copyright
+.\" notice and this notice are preserved.
+.
+.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..bd8cf22
--- /dev/null
+++ b/contrib/mm/examples/MUL
@@ -0,0 +1,542 @@
+.\" -*- nroff -*-
+.\" Copyright (C) 1989-2014 Free Software Foundation, Inc.
+.\"
+.\" Copying and distribution of this file, with or without modification,
+.\" are permitted in any medium without royalty provided the copyright
+.\" notice and this notice are preserved.
+.
+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..8a5e001
--- /dev/null
+++ b/contrib/mm/examples/NCOL
@@ -0,0 +1,203 @@
+.\" -*- nroff -*-
+.\" Copyright (C) 1989-2014 Free Software Foundation, Inc.
+.\"
+.\" Copying and distribution of this file, with or without modification,
+.\" are permitted in any medium without royalty provided the copyright
+.\" notice and this notice are preserved.
+.
+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..fdbc55d
--- /dev/null
+++ b/contrib/mm/examples/ND
@@ -0,0 +1,24 @@
+.\" -*- nroff -*-
+.\" Copyright (C) 1989-2014 Free Software Foundation, Inc.
+.\"
+.\" Copying and distribution of this file, with or without modification,
+.\" are permitted in any medium without royalty provided the copyright
+.\" notice and this notice are preserved.
+.
+.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..cb0956a
--- /dev/null
+++ b/contrib/mm/examples/README
@@ -0,0 +1,40 @@
+ -*- text -*-
+ Copyright (C) 1989-2020 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+
+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 extra Swedish macros for
+ composing a letter conforming to Swedish standard style,
+ adjusted to left and right margins.
+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 sure that mm is useful in several languages;
+all English output can be redefined.
+
+For Swedish localization, check the manual for groff_mse and the
+macro files 'mse.tmac' and 'sv.tmac'.
diff --git a/contrib/mm/examples/References b/contrib/mm/examples/References
new file mode 100644
index 0000000..7b54471
--- /dev/null
+++ b/contrib/mm/examples/References
@@ -0,0 +1,982 @@
+.\" -*- nroff -*-
+.\" Copyright (C) 1989-2014 Free Software Foundation, Inc.
+.\"
+.\" Copying and distribution of this file, with or without modification,
+.\" are permitted in any medium without royalty provided the copyright
+.\" notice and this notice are preserved.
+.
+.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..e2fcbd5
--- /dev/null
+++ b/contrib/mm/examples/SETR
@@ -0,0 +1,116 @@
+.\" -*- nroff -*-
+.\" Copyright (C) 1989-2014 Free Software Foundation, Inc.
+.\"
+.\" Copying and distribution of this file, with or without modification,
+.\" are permitted in any medium without royalty provided the copyright
+.\" notice and this notice are preserved.
+.
+.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/examples/letter.mm b/contrib/mm/examples/letter.mm
new file mode 100644
index 0000000..3683849
--- /dev/null
+++ b/contrib/mm/examples/letter.mm
@@ -0,0 +1,51 @@
+.\" Set a blank page header; our letter is a single page and does not
+.\" require the default numbering.
+.PH '''
+.\" Set point size to 14.
+.S 14
+.\" Set paragraph type to "indented".
+.nr Pt 1
+.\" Put the date in a right-aligned display.
+.DS R
+30 May 2021
+.DE
+.\" Start display (left-aligned).
+.DS
+Mr. Ty Coon
+President of Vice, Intellectual Property and Licensing
+Very Big Corporation of America
+Silly Valley, CA 94043
+.\" End display.
+.DE
+Dear Mr. Coon,
+.
+.
+.\" Start new paragraph.
+.P
+I would like to request that your wholly-owned subsidiary,
+Yoyodyne, Inc.,
+disclaim all copyright interest in the program `Gnomovision'
+(which makes passes at compilers)
+written by Juliet Hacker prior to her employment with Yoyodyne.
+.
+.
+.P
+Our colleagues at the Software Freedom Conservancy have determined and
+informed us that Ms.\& Hacker's employment agreement is a contract of
+adhesion.
+.
+.
+.P
+Thank you for your prompt attention to this matter.
+.
+.
+.\" Put the closing and signature in a right-aligned display as well.
+.DS R
+Sincerely yours,
+.\" Leave three "vees" (3 text line heights) of room for signature.
+.SP 3v
+.
+.
+Tracy T.\& Jordan
+.DE
+.\" vim: set noexpandtab textwidth=72:
diff --git a/contrib/mm/groff_mm.7.man b/contrib/mm/groff_mm.7.man
new file mode 100644
index 0000000..4f94191
--- /dev/null
+++ b/contrib/mm/groff_mm.7.man
@@ -0,0 +1,5428 @@
+'\" t
+.TH groff_mm @MAN7EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+groff_mm \- memorandum macros for GNU
+.I roff
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2023 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_mm_7_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY "groff \-m@TMAC_M_PREFIX@m"
+.RI [ option\~ .\|.\|.\&]
+.RI [ file\~ .\|.\|.]
+.
+.SY "groff \-m m@TMAC_M_PREFIX@m"
+.RI [ option\~ .\|.\|.\&]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The GNU implementation of the
+.I mm
+macro package is part of the
+.I groff
+document formatting system.
+.
+The
+.I mm
+package is suitable for the composition of
+letters,
+memoranda,
+reports,
+and books.
+.
+.
+.P
+Call an
+.I mm
+macro at the beginning of a document to initialize the package.
+.
+A simple
+.I mm
+document might use only
+.B P
+for paragraphing.
+.
+Set numbered and unnumbered section headings with
+.B H
+and
+.BR HU ,
+respectively.
+.
+Change the style of the typeface with
+.BR B ,
+.BR I ,
+and
+.BR R ;
+you can alternate styles with
+.BR BI ,
+.BR BR ,
+.BR IB ,
+.BR IR ,
+.BR RB ,
+and
+.BR RI .
+.
+Several nestable list types are available via
+.BR AL ,
+.BR BL ,
+.BR BVL ,
+.BR DL ,
+.BR ML ,
+.BR RL ,
+and
+.BR VL ;
+each of these begins a list,
+to which
+.B LI
+adds an item and
+.B LE
+ends the (nested) list.
+.
+Customized list arrangements are supported by
+.BR LB .
+.
+.B DS
+and
+.B DF
+start static and floating displays,
+respectively;
+either is terminated with
+.BR DE .
+.
+.
+.P
+.I groff mm
+is intended to be compatible with the
+.I mm
+implementation found in the AT&T Documenter's Workbench (DWB),
+with the following limitations.
+.
+.
+.IP \[bu] 2n
+Omitted features include
+the logo and company name strings,
+.B }Z
+and
+.BR ]S ,
+respectively;
+the encoded company site location addresses recognized as the third
+argument to the
+.B AU
+macro;
+the
+.B Pv
+(\[lq]private\[rq] heading)
+register;
+and the
+.B OK
+(other keywords),
+and
+.B PM
+(proprietary markings)
+macros.
+.
+.
+.IP \[bu] 2n
+The
+.B CS
+(output cover sheet)
+macro is implemented only for memorandum type 4.
+.
+.
+.IP \[bu]
+The
+.I grap
+preprocessor is not explicitly supported;
+no
+.B G1
+and
+.B G2
+macros
+are defined.
+.
+.
+.IP \[bu]
+The registers
+.BR A ,
+.BR C ,
+.BR E ,
+.BR T ,
+and
+.BR U ,
+typically set from the
+.I troff \" generic
+or
+.I nroff \" generic
+command lines with DWB
+.IR mm ,
+are not recognized.
+.
+.
+.IP \[bu]
+When setting the registers
+.B L
+or
+.B W
+from the command line,
+use an explicit scaling unit to avoid surprises.
+.
+.
+.IP \[bu]
+DWB
+.IR mm 's
+.B nP
+macro indented the second line of a paragraph to align it with the start
+of the text of the first
+(after the paragraph number);
+.IR "groff mm" 's
+does not.
+.
+.
+.IP \[bu]
+Cut marks are not supported.
+.
+.
+.P
+DWB
+.I mm
+supported only seven levels of heading.
+.
+As a compatible extension,
+.I groff mm
+supports fourteen,
+introducing new registers
+.B H8
+through
+.BR H14 ,
+and affecting the interpretation of the
+.B HF
+and
+.B HP
+strings.
+.
+.
+.P
+Macro,
+register,
+and string descriptions in this page frequently mention each other;
+most cross references are to macros.
+.
+Where a register or string is referenced,
+its type is explicitly identified.
+.
+.IR mm 's
+macro names are usually in full capitals;
+registers and strings tend to have mixed-case names.
+.
+.
+.\" ====================================================================
+.SS "Document styles"
+.\" ====================================================================
+.
+.I groff mm
+offers three different frameworks for document organization.
+.
+.BR \%COVER /\: \%COVEND
+is a flexible means of preparing any document requiring a cover page.
+.
+.BR LT / LO
+aids preparation of typical Anglophone correspondence
+(business letters,
+for example).
+.
+The
+.B MT
+memorandum type mechanism implements a group of formal styles
+historically used by AT&T Bell Laboratories.
+.
+Your document can select at most one of these approaches;
+when used,
+each disables the others.
+.
+.
+.\" ====================================================================
+.SS Localization
+.\" ====================================================================
+.
+.I groff mm
+is designed to be easily localized.
+.
+For languages other than English,
+strings that can appear in output are collected in the file
+.IR @MACRODIR@/\: xx \:.tmac ,
+where
+.I xx
+is an ISO\~639 two-letter language identifier.
+.
+Localization packages should be loaded after
+.IR mm ;
+for example,
+you might format a Swedish
+.I mm
+document with the command
+.RB \[lq] "groff \-mm \-msv" \[rq].
+.
+.
+.P
+This package can also be localized by site or territory;
+for example,
+.I @MACRODIR@/\:@TMAC_M_PREFIX@mse\:.tmac
+illustrates how to adapt the output to a national standard using its ISO
+3166 territory code.
+.
+Such a package can define a string that causes a macro file
+.IR @MACRODIR@/\:mm/\:\% territory _locale
+to be loaded at package initialization.
+.
+If this mechanism is not used,
+.I @MACRODIR@/\:mm/\:\%locale
+is loaded instead.
+.
+No diagnostic is produced if these files do not exist.
+.
+.
+.\" ====================================================================
+.SS "Registers and strings"
+.\" ====================================================================
+.
+Much
+.I mm
+behavior can be configured by registers and strings.
+.
+A register is assigned with the
+.B nr
+request.
+.
+.
+.RS
+.P
+.B .nr
+.I ident
+.RB [ \[+-] ]\c
+.I n
+.RI [ i ]
+.RE
+.
+.
+.P
+.I ident
+is the name of the register,
+and
+.IR n \~is
+the value to be assigned.
+.
+.IR n \~can
+be prefixed with a plus or minus sign if incrementation or
+decrementation (respectively) of the register's existing value
+.RI by\~ n
+is desired.
+.
+If assignment of a (possibly) negative
+.IR n \~is
+required,
+further prefix it with a zero or enclose it in parentheses.
+.
+If
+.IR i \~is
+specified,
+the register is automatically modified
+.RI by \~i
+prior to interpolation if a plus or minus sign is included in the escape
+sequence as follows.
+.
+.
+.RS
+.P
+.B \[rs]n\c
+.RB [ \[+-] ]\c
+.BI [ ident ]
+.RE
+.
+.
+.P
+.IR i \~can
+be negative;
+it combines algebraically with the sign in the interpolation escape
+sequence.
+.
+.
+.P
+Strings are defined with the
+.B ds
+request.
+.
+.
+.RS
+.P
+.B .ds
+.I ident contents
+.RE
+.
+.
+.P
+.I contents
+consumes everything up to the end of the line,
+including trailing spaces.
+.
+It is a good practice to end
+.I contents
+with a comment escape sequence
+.RB ( \[rs]\[dq] )
+so that extraneous spaces do not intrude during document maintenance.
+.
+To include leading spaces in
+.IR contents ,
+prefix it with a double quote.
+.
+Strings are interpolated with the
+.B \[rs]*
+escape sequence.
+.
+.
+.RS
+.P
+.B \[rs]*\c
+.BI [ ident ]
+.RE
+.
+.
+.P
+Register and string name spaces are distinct,
+but strings and macros share a name space.
+.
+Defining a string with the same name as an
+.I mm
+macro is not supported and may cause incorrect rendering,
+the emission of diagnostic messages,
+and an error exit status from
+.IR @g@troff .
+.
+.
+.\" ====================================================================
+.SS "Register format"
+.\" ====================================================================
+.
+A register is interpolated using Arabic numerals if no other format has
+been assigned to it.
+.
+Assign a format to a register with the
+.B af
+request.
+.
+.
+.RS
+.LP
+.BI .af\~ "R c"
+.RE
+.
+.
+.LP
+.IR R \~is
+the name of the register,
+and
+.IR c \~is
+the format.
+.
+If
+.IR c \~is
+a sequence of Arabic numerals,
+their quantity defines a zero-padded minimum width for the interpolated
+register value.
+.
+.
+.RS
+.LP
+.TS
+tab(@);
+lb lb
+l l.
+Form@Sequence
+1@0, 1, 2, 3, .\|.\|., 10, .\|.\|.
+001@000, 001, 002, 003, .\|.\|., 1000, .\|.\|.
+i@0, i, ii, iii, iv, .\|.\|.
+I@0, I, II, III, IV, .\|.\|.
+a@0, a, b, c, .\|.\|., z, aa, ab, .\|.\|.
+A@0, A, B, C, .\|.\|., Z, AA, AB, .\|.\|.
+.TE
+.RE
+.
+.
+.\" ====================================================================
+.SS Fonts
+.\" ====================================================================
+.
+In
+.IR "groff mm" ,
+the fonts
+(or rather,
+font styles)
+.BR R \~(roman),
+.BR I \~(italic),
+and
+.BR B \~(bold)
+are mounted at font positions
+.BR 1 ,
+.BR 2 ,
+.RB and\~ 3 ,
+respectively.
+.
+Internally,
+font positions are used for backward compatibility.
+.
+From a practical point of view,
+it doesn't make a big difference\[em]a different font family can still
+be selected by invoking
+.IR groff 's
+.B fam
+request or using its
+.B \-f
+command-line option.
+.
+On the other hand,
+if you want to replace just,
+for example,
+.RB font\~ I
+with Zapf Chancery Medium italic
+(available on
+.IR groff 's
+.B pdf
+and
+.B ps
+output devices),
+you have to use the
+.B fp
+request,
+replacing the font at position\~2 with
+.RB \[lq] .fp\~2\~ZCMI \[rq]).
+.
+Because the cover sheet,
+memorandum type,
+and
+.MR @g@refer @MAN1EXT@
+integration macros explicitly request fonts named
+.BR B ,
+.BR I ,
+and
+.BR R ,
+you will also need to remap these font names with the
+.B ftr
+request,
+for instance with
+.RB \[lq] .ftr\~I\~ZCMI \[rq].
+.
+.
+.\" ====================================================================
+.SH Macros
+.\" ====================================================================
+.
+An explicitly empty argument may be specified with a pair of double
+quotes;
+to call a macro
+.B XX
+with an empty second argument but non-empty first and third ones,
+you could input the following.
+.
+.
+.P
+.RS
+.EX
+\&.XX foo \[dq]\[dq] baz
+.EE
+.RE
+.
+.
+.P
+Macro names longer than two characters are GNU extensions;
+some shorter names were not part of DWB
+.IR mm 's
+published interface but are documented aspects of
+.I groff mm.
+.
+.
+.TP
+.BI )E\ "level text"
+Add heading text
+.I text
+to the table of contents with
+.IR level ,
+which is either\~0 or in the range 1 to\~7.
+.
+See also
+.BR H .
+.
+This undocumented DWB
+.I mm
+macro is exposed by
+.I groff mm
+to enable customized tables of contents.
+.
+.
+.TP
+.BR 1C\~ [ 1 ]
+Format page text in one column.
+.
+The page is broken.
+.
+.RB A\~ 1
+argument suppresses this break;
+its use may cause body text and a pending footnote to overprint.
+.
+See
+.BR 2C ,
+.BR MC ,
+and
+.BR NCOL .
+.
+.
+.TP
+.B 2C
+Begin two-column formatting.
+.
+This is a special case of
+.BR MC .
+.
+See
+.B 1C
+and
+.BR NCOL .
+.
+.
+.TP
+.B AE
+Abstract end;
+stop collecting abstract text.
+.
+See
+.BR AS .
+.
+.
+.\" In DWB mm, the mnemonic for `AF` was "alternate first-page format",
+.\" and was described in the context of the `A` and `E` registers and
+.\" `}Z` and `]S` strings, none of which we support.
+.TP
+.BR AF \~[\c
+.IR firm-name ]
+Specify firm associated with the document.
+.
+At most one can be declared;
+the firm name is used by memorandum types and available to cover sheets.
+.
+.B AF
+terminates a document title started with
+.BR TL ,
+and can be called without an argument for that purpose.
+.
+See
+.B MT
+and
+.BR COVER .
+.
+.
+.TP
+.BR AL \~[\c
+.IR type \~[ text-indent \~[\c
+.BR 1 ]]]
+Begin an auto-incrementing numbered list.
+.
+Item numbers start at one.
+.
+The
+.I type
+argument assigns the register format
+(see above)
+of the list item enumerators.
+.
+The default
+.RB is\~ 1 .
+.
+An explicitly empty
+.I type
+also indicates the default.
+.
+A
+.I text-indent
+argument overrides register
+.BR Li .
+.
+A third argument suppresses the blank line that normally precedes each
+list item.
+.
+Use
+.B LI
+to declare list items,
+and
+.B LE
+to end the list.
+.
+.
+.TP
+.BR APP \~\c
+.RI [ id\~ [ title ]]
+Begin an appendix.
+.
+If the identifier
+.I id
+is omitted,
+it is incremented
+(or initialized,
+if necessary).
+.
+The register format used for
+.I id
+is \[lq]A\[rq].
+.
+The page is broken.
+.
+The register
+.B Aph
+determines whether an appendix heading is then formatted.
+.
+This heading uses the string
+.B App
+followed by
+.IR id .
+.
+Appendices appear in any table of contents
+(see
+.BR TC ).
+.
+The string
+.B Apptxt
+is set to
+.I title
+if the latter is present,
+and made empty otherwise.
+.
+.
+.TP
+.BI APPSK\~ "id n" \~\c
+.RI [ title ]
+As
+.BR APP ,
+but increment the page number by
+.IR n .
+.
+Use this macro to \[lq]skip pages\[rq] when diagrams or other materials
+not formatted by
+.I @g@troff
+are included in appendices.
+.
+.
+.TP
+.BR AS\~ [\c
+.IR placement \~[ indentation ]]
+Abstract start;
+begin collecting abstract.
+.
+Input up to the next
+.B AE
+call is included in the abstract.
+.
+.I placement
+influences the location of the abstract on the cover sheet of a
+memorandum
+(see
+.BR MT ).
+.
+.BR \%COVER ,
+by contrast,
+ignores
+.I placement
+by default,
+but can be customized to interpret it.
+.
+.
+.IP
+.TS
+tab(@);
+lf(BI) lb
+l lx.
+placement@Effect
+0@T{
+The abstract appears on page\~1 and cover sheet if the document is a
+\[lq]released paper\[rq] memorandum
+.RB (\[lq] ".MT 4" \[rq]);
+otherwise,
+it appears on page\~1 without a cover sheet.
+T}
+1@T{
+The abstract appears only on the cover sheet
+.RB (\[lq] ".MT 4" \[rq]
+only).
+T}
+.\" XXX: This does not appear to be implemented.
+.\"2@T{
+.\"The abstract is printed only on the cover sheet (if not
+.\".BR ".MT 4" )
+.\".
+.\"The cover sheet is printed without a need for \fBCS\fP.
+.\"T}
+.TE
+.
+.
+.IP
+An abstract does not appear at all in external letters
+.RB (\[lq] ".MT 5" \[rq]).
+.
+.RI A\~ placement
+of
+.B 2
+was supported by DWB
+.I mm
+but is not by
+.IR "groff mm" .
+.
+.
+.IP
+A second argument increases the indentation by
+.I indentation
+and reduces the line length by twice this amount.
+.
+A scaling unit of ens is assumed.
+.
+The default is\~0.
+.
+.
+.\" XXX: Do we need a macro for this? Why is it not a string like App
+.\" or Licon? It is usefully localizable.
+.TP
+.BR AST \~\c
+.RI [ caption ]
+Set the caption above the abstract to
+.IR caption ,
+or clear it if there is no argument.
+.
+The default is \[lq]ABSTRACT\[rq].
+.
+.
+.TP
+.BI AT\~ title\c
+\~.\|.\|.
+Specify author's title(s).
+.
+If present,
+.B AT
+must appear just after the corresponding author's
+.BR AU .
+.
+Each
+.I title
+occupies an output line beneath the author's name in the signature block
+used by
+.B LT
+letters
+(see
+.BR SG )
+and in
+.B MT
+memoranda.
+.
+The
+.B ms
+cover sheet style also uses it.
+.
+.
+.br
+.ne 7v
+.TP
+.BR AU \~\c
+.RI [ name\~\c
+.RI [ initials\~\c
+.RI [ loc\~\c
+.RI [ dept\~\c
+.RI [ ext\~\c
+.RI [ room\~\c
+.RI [ arg1\~\c
+.RI [ arg2\~\c
+.RI [ arg3 ]]]]]]]]]
+Specify author.
+.
+.B AU
+terminates a document title started with
+.BR TL ,
+and can be called without arguments for that purpose.
+.
+Author information is used by cover sheets,
+.B MT
+memoranda,
+and
+.BR SG .
+.
+Further arguments comprise
+initials,
+location,
+department,
+telephone extension,
+room number or name,
+and up to three additional items.
+.
+Repeat
+.B AU
+to identify multiple authors.
+.
+.
+.IP
+Use
+.BR WA / WE
+instead to identify the author for documents employing
+.BR LT .
+.
+.
+.TP
+.BR AV \~[\c
+.IR name \~[\c
+.BR 1 ]]
+Format approval lines for a handwritten signature and date.
+.
+Two horizontal rules are drawn,
+with the specified
+.I name
+and the text of the string
+.B Letdate
+beneath them.
+.
+Above these rules,
+the text in the string
+.B Letapp
+is formatted;
+a second argument replaces this text with a blank line.
+.
+See
+.BR LT .
+.
+.
+.\" XXX: AVL is misnamed; it should have been called SGL or similar.
+.TP
+.BR AVL \~[\c
+.IR name ]
+As
+.BR AV ,
+but the date,
+date rule,
+and approval notation
+.B Letapp
+are omitted.
+.
+.
+.TP
+.BR B \~\c \" space in roman; we must use 2-font macro with \c
+.RI [ bold-text\~\c
+.RI [ previous-font-text ]]\~.\|.\|.
+Join
+.I bold-text
+in boldface with
+.I previous-font-text
+in the previous font,
+without space between the arguments.
+.
+If no arguments,
+switch font to bold style.
+.
+.
+.TP
+.B B1
+Begin boxed,
+kept display.
+.
+The text is indented one character,
+and the right margin is one character shorter.
+.
+This is a GNU extension.
+.
+.
+.TP
+.B B2
+End boxed,
+kept display.
+.
+This is a GNU extension.
+.
+.
+.TP
+.B BE
+End bottom block; see
+.BR BS .
+.
+.
+.TP
+.BR BI \~\c \" space in roman; we must use 2-font macro with \c
+.RI [ bold-text\~\c
+.RI [ italic-text ]]\~.\|.\|.
+Join
+.I bold-text
+in boldface with
+.I italic-text
+in italics,
+without space between the arguments.
+.
+.
+.TP
+.BR BL \~[\c
+.IR text-indent \~[\c
+.BR 1 ]]
+Begin bulleted list.
+.
+Items are prefixed with a bullet and a space.
+.
+A
+.I text-indent
+argument overrides register
+.BR Pi .
+.
+A second argument suppresses blank lines between items.
+.
+Use
+.B LI
+to declare list items,
+and
+.B LE
+to end the list.
+.
+.
+.TP
+.BR BR \~\c \" space in roman; we must use 2-font macro with \c
+.RI [ bold-text\~\c
+.RI [ roman-text ]]\~.\|.\|.
+Join
+.I bold-text
+in boldface with
+.I roman-text
+in roman style,
+without space between the arguments.
+.
+.
+.TP
+.B BS
+Begin bottom block.
+.
+Input is collected until
+.B BE
+is called,
+and output between the footnote area and footer of each page.
+.
+.
+.\" XXX: Couldn't this have been done with an extra parameter to `VL`?
+.\" Or a register influencing VL behavior?
+.TP
+.BR BVL \~[\c
+.IR text-indent \~[ mark-indent \~[\c
+.BR 1 ]]]
+Begin broken variable-item
+(or \[lq]tagged\[rq])
+list.
+.
+Each item is expected to supply its own mark.
+.
+The line is always broken after the mark;
+contrast
+.BR VL .
+.
+.I text-indent
+sets the indentation of the text,
+and
+.I mark-indent
+the distance from the current list indentation to the mark.
+.
+A third argument suppresses the blank line that normally precedes each
+list item.
+.
+Use
+.B LI
+to declare list items,
+and
+.B LE
+to end the list.
+.
+.
+.TP
+.BR \%COVER \~\c \" space in roman; we must use 2-font macro with \c
+.RI [ style ]
+Begin a cover page description.
+.
+.B \%COVER
+must appear before the body text
+(or main matter)
+of a document.
+.
+The argument
+.I style
+is used to construct the file name
+.IR @TMAC_MDIR@/\: style \:.cov
+and load it with the
+.B mso
+request.
+.
+The default
+.I style
+is
+.BR ms ;
+the
+.I ms.cov
+file prepares a cover page resembling those of the
+.I ms
+package.
+.
+A
+.I .cov
+file must define a
+.B \%COVEND
+macro,
+which a document must call at the end of the cover description.
+.
+Use cover description macros in the following order;
+only
+.B TL
+and
+.B AU
+are required.
+.
+.
+.IP
+.EX
+\&.COVER
+\&.TL
+\&.AF
+\&.AU
+\&.AT
+\&.AS
+.ne 2v
+\&.AE
+\&.COVEND
+.EE
+.
+.
+.TP
+.B COVEND
+End the cover description.
+.
+.
+.TP
+.B DE
+End static or floating display begun with
+.B DS
+or
+.BR DF .
+.
+.
+.TP
+.BR DF\~ [\c
+.IR format \~[ fill \~[ right-indentation ]]]
+Begin floating display.
+.
+A floating display is saved in a queue and output in the order entered.
+.
+Arguments are handled as in
+.BR DS .
+.
+Floating displays cannot be nested.
+.
+Placement of floating displays is controlled by the registers
+.B De
+and
+.BR Df .
+.
+.
+.TP
+.BR DL \~[\c
+.IR text-indent \~[\c
+.BR 1 ]]
+Begin dashed list.
+.
+Items are prefixed with an em dash and a space.
+.
+A
+.I text-indent
+argument overrides register
+.BR Pi .
+.
+A second argument suppresses blank lines between items.
+.
+Use
+.B LI
+to declare list items,
+and
+.B LE
+to end the list.
+.
+.
+.TP
+.BR DS \~[\c
+.IR format \~[\c
+.IR fill \~[\c
+.IR right-indentation ]]]
+Begin static display.
+.
+Input until
+.B DE
+is called is collected into a display.
+.
+The display is output on a single page unless it is taller than the
+height of the page.
+.
+.B DS
+can be nested
+(contrast with
+.BR DF ).
+.
+.
+.IP
+.TS
+tab(@);
+Lf(BI) Lb
+L Lx.
+format@Effect
+\f[I]none\f[]@Do not indent the display.
+L@Do not indent the display.
+I@T{
+Indent text by
+.BR \[rs]n[Si] .
+T}
+C@Center each line.
+CB@Center the whole display as a block.
+R@Right-adjust the lines.
+RB@Right-adjust the whole display as a block.
+.TE
+.
+.
+.IP
+The values \[lq]L\[rq],
+\[lq]I\[rq],
+\[lq]C\[rq],
+and \[lq]CB\[rq] can also be specified as \[lq]0\[rq],
+\[lq]1\[rq],
+\[lq]2\[rq],
+and
+\[lq]3\[rq],
+respectively,
+for compatibility with
+.RI DWB\~ mm.
+.
+.
+.IP
+.TS
+tab(@);
+Lf(BI) Lb
+L Lx.
+fill@Effect
+\f[I]none\f[]@Disable filling.
+N@Disable filling.
+F@Enable filling.
+.TE
+.
+.
+.IP
+\[lq]N\[rq] and \[lq]F\[rq] can also be specified as \[lq]0\[rq] and
+\[lq]1\[rq],
+respectively,
+for compatibility with
+.RI DWB\~ mm.
+.
+.
+.IP
+A third argument
+reduces the line length by
+.I right-indentation.
+.
+.
+.IP
+.I mm
+normally
+places blank lines before and after the display.
+.
+Set register
+.B Ds
+to\~0 to suppress these.
+.
+.
+.TP
+.BR EC \~\c
+.RI [ title \~[ override \~[ flag \~[ refname ]]]]
+Caption an equation.
+.
+The caption consists of the string
+.B Liec
+followed by an automatically incrementing counter stored in the register
+.BR Ec ,
+punctuation configured by the register
+.BR Of ,
+then
+.I title
+(if any).
+.
+Use the
+.B af
+request to configure
+.BR Ec 's
+number format.
+.
+.I override
+and
+.I flag
+alter the equation number as follows.
+.
+Omitting
+.I flag
+and specifying
+.B 0
+in its place are equivalent.
+.
+.
+.IP
+.TS
+tab(@);
+Lf(BI) Lb
+L Lx.
+flag@Effect
+0@T{
+Prefix number with
+.IR override .
+T}
+1@T{
+Suffix number with
+.IR override .
+T}
+2@T{
+Replace number with
+.IR override .
+T}
+.TE
+.
+.
+.IP
+Equation captions are centered irrespective of the alignment of any
+enclosing display.
+.
+.
+.IP
+.I refname
+stores the equation number using
+.BR SETR ;
+it can be retreived with
+.RB \[lq] .GETST
+.IR refname \[rq].
+.
+This argument is a GNU extension.
+.
+.
+.IP
+Captioned equations are listed in a table of contents
+(see
+.BR TC )
+if the Boolean register
+.B Le
+is true.
+.
+Such a list uses the string
+.B Le
+as a heading.
+.
+.
+.TP
+.BR EF\~ [ \[dq]\|\[aq]\c
+.IB left \[aq] center \[aq] right \[aq]\|\[dq]\c
+]
+Define the even-page footer,
+which is formatted just above the normal page footer on even-numbered
+pages.
+.
+See
+.BR PF .
+.
+.B EF
+defines the string
+.BR EOPef .
+.
+.
+.TP
+.BR EH\~ [ \[dq]\|\[aq]\c
+.IB left \[aq] center \[aq] right \[aq]\|\[dq]\c
+]
+Define the even-page header,
+which is formatted just below the normal page header on even-numbered
+pages.
+.
+See
+.BR PH .
+.
+.B EH
+defines the string
+.BR TPeh .
+.
+.
+.TP
+.B EN
+End equation input preprocessed by
+.MR @g@eqn @MAN1EXT@ ;
+see
+.BR EQ .
+.
+.
+.TP
+.B EOP
+If defined,
+this macro is called in lieu of normal page footer layout.
+.
+Headers and footers are formatted in a separate environment.
+.
+See
+.BR TP .
+.
+.
+.IP
+.TS
+tab(@);
+Cb S
+Lb L.
+Strings available to EOP
+_
+EOPf@argument to \fBPF\fP
+EOPef@argument to \fBEF\fP
+EOPof@argument to \fBOF\fP
+.TE
+.
+.
+.TP
+.BI EPIC\ "\fR[\fP\fB\-L\fP\fR]\fP width height \fR[\fPname\fR]\fP"
+Draw a box with the given
+.I width
+and
+.IR height .
+.
+It also prints the text
+.I name
+or a default string if
+.I name
+is not specified.
+.
+This is used to include external pictures;
+just give the size of the picture.
+.
+.B \-L
+left-aligns the picture;
+the default is to center.
+.
+See
+.BR PIC .
+.
+.
+.TP
+.BR EQ \~[\c
+.IR label ]
+Start equation input preprocessed by
+.MR @g@eqn @MAN1EXT@ .
+.
+.B EQ
+and
+.B EN
+macro calls bracket an equation region.
+.
+Such regions must be contained in displays
+.RB ( DS / DE ),
+except when the region is used only to configure
+.I @g@eqn
+and not to produce output.
+.
+If present,
+.I label
+appears aligned to the right and
+centered vertically within the display;
+see register
+.BR Eq .
+.
+.
+If multiple
+.I eqn \" generic
+regions occur within a display,
+only the last
+.I label
+(if any)
+is used.
+.
+.
+.TP
+.BR EX \~\c
+.RI [ title \~[ override \~[ flag \~[ refname ]]]]
+Caption an exhibit.
+.
+Arguments are handled analogously to
+.BR EC .
+.
+The register
+.B Ex
+is the exhibit counter.
+.
+The string
+.B Liex
+precedes the exhibit number and any
+.I title.
+.
+Exhibit captions are centered irrespective of the alignment of any
+enclosing display.
+.
+.
+.IP
+Captioned exhibits are listed in a table of contents
+(see
+.BR TC )
+if the Boolean register
+.B Lx
+is true.
+.
+Such a list uses the string
+.B Lx
+as a heading.
+.
+.
+.TP
+.BR FC \~[\c
+.IR closing-text ]
+Output the string
+.BR Letfc ,
+or the specified
+.I closing-text,
+as the formal closing of a letter.
+.
+.
+.TP
+.BR FD \~[\c
+.IR arg \~[\c
+.BR 1 ]]
+Configure display of footnotes.
+.
+The first argument encodes enablement of
+automatic hyphenation,
+adjustment to the right margin,
+indentation of footnote text,
+and left- vs.\& right-alignment of the footnote label within the space
+allocated for it.
+.
+.
+.br
+.ne 5v
+.IP
+.\" XXX: We can fit one more row using "nokeep" vs. not using it.
+.TS
+tab(@) nokeep;
+Lf(BI) Lb Lb Lb Lb
+L L L L L.
+arg@Hyphenate?@Adjust?@Indent?@Label alignment
+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
+.TE
+.
+.
+.IP
+An
+.I arg
+greater than 11 is treated
+.RB as\~ 0 .
+.
+.IR mm 's
+default
+.RB is\~ 0 .
+.
+.
+.IP
+If a second argument,
+conventionally
+.BR 1 ,
+is given,
+footnote numbering is reset when a first-level heading is encountered.
+.
+See
+.BR FS .
+.
+.
+.TP
+.B FE
+End footnote;
+see
+.BR FS .
+.
+.
+.TP
+.BR FG \~\c
+.RI [ title \~[ override \~[ flag \~[ refname ]]]]
+Caption a figure.
+.
+Arguments are handled analogously to
+.BR EC .
+.
+The register
+.B Fg
+is the figure counter.
+.
+The string
+.B Lifg
+precedes the figure number and any
+.I title.
+.
+Figure captions are centered irrespective of the alignment of any
+enclosing display.
+.
+.
+.IP
+Captioned figures are listed in a table of contents
+(see
+.BR TC )
+if the Boolean register
+.B Lf
+is true.
+.
+Such a list uses the string
+.B Lf
+as a heading.
+.
+.
+.TP
+.BR FS \~[\c
+.IR label ]
+Start footnote.
+.
+Input until
+.B FE
+is called is collected into a footnote.
+.
+By default,
+footnotes are automatically numbered starting at 1;
+the number is available in register
+.B :p
+and,
+with a trailing period,
+in
+.RB string\~ F .
+.
+This string precedes the footnote text at the bottom of the column or
+page.
+.
+Footnotes are vertically separated by the product of
+.RB registers\~ Fs
+and
+.BR Lsp .
+.
+In
+.IR "groff mm" ,
+footnotes may be used in displays.
+.
+.
+.IP
+A
+.I label
+argument replaces the contents of the string
+.BR F ;
+it need not be numeric.
+.
+In this event,
+the footnote marker in the body text must be explicitly written.
+.
+.
+.TP
+.BI GETHN\ "refname \fR[\fPvarname\fR]\fP"
+Include the heading number where the corresponding
+.RB \[lq] .SETR
+.IR refname \[rq]
+was placed.
+.
+This is displayed as \[lq]X.X.X.\[rq] in pass\~1.
+.
+See
+.BR INITR .
+.
+If
+.I varname
+is used,
+.B GETHN
+sets the string
+.I varname
+to the heading number.
+.
+.TP
+.BI GETPN\ "refname \fR[\fPvarname\fR]\fP"
+Include the page number where the corresponding
+.RB \[lq] .SETR
+.IR refname \[rq]
+was placed.
+.
+This is displayed as \[lq]9999\[rq] in pass\~1.
+.
+See
+.BR INITR .
+.
+If
+.I varname
+is used,
+.B GETPN
+sets the string
+.I varname
+to the page number.
+.
+.TP
+.BI GETR\ refname
+Combine
+.B GETHN
+and
+.B GETPN
+with the text \[lq]chapter\[rq] and \[lq],\~page\[rq].
+.
+The string
+.B Qrf
+contains the text for the cross reference:
+.
+.RS
+.IP
+\&.ds Qrf See chapter \[rs]\[rs]*[Qrfh], page \[rs]\[rs]*[Qrfp].
+.RE
+.
+.IP
+.B Qrf
+may be changed to support other languages.
+.
+Strings
+.B Qrfh
+and
+.B Qrfp
+are set by
+.B GETR
+and contain the page and heading number,
+respectively.
+.
+.TP
+.BI GETST\ "refname \fR[\fPvarname\fR]\fP"
+Include the string saved with the second argument to
+.BR .SETR .
+.
+This is a dummy string in pass\~1.
+.
+If
+.I varname
+is used,
+.B GETST
+sets it to the saved string.
+.
+See
+.BR INITR .
+.
+.
+.TP
+.BI H\~ level\~\c
+.RI [ title \~[ suffix ]]
+Set a numbered section heading at
+.IR level .
+.
+.I mm
+produces numbered
+.I "heading marks"
+of the form
+.IR a . b . c .\|.\|.,
+with up to fourteen levels of nesting.
+.
+Each level's number increases automatically with each
+.B H
+call and is reset to zero when a more significant
+.I level
+is specified.
+.
+.RB \[lq] 1 \[rq]\~is
+the most significant or coarsest division of the document.
+.
+Text after an
+.B H
+call is formatted as a paragraph;
+calling
+.B P
+is unnecessary.
+.
+.
+.IP
+.I title
+specifies an optional title;
+it must be double-quoted if it contains spaces.
+.
+.I mm
+appends
+.I suffix
+to
+.I title
+in the body of the document,
+but omits it from any table of contents
+(see
+.BR TC ).
+.
+This facility can be used to annotate the heading title with a footnote.
+.
+.I suffix
+should not interpolate
+.RB the\~ F
+string;
+specify a footnote mark explicitly.
+.
+See
+.BR FS .
+.
+.
+.IP
+Heading behavior is highly configurable.
+.
+Several registers set a
+.I threshold,
+where heading levels at or below the threshold value are handled in one
+way,
+and those above it another.
+.
+For example,
+a heading level within the threshold of register
+.B Cl
+is included in the table of contents
+(see
+.BR TC ).
+.
+.
+.IP
+.I Heading layout.
+.
+Register
+.B Ej
+sets a threshold for page breaking (ejection) prior to a heading.
+.
+If not preceded by a page break,
+a heading level below the threshold in register
+.B Hps
+is preceded by the amount of vertical space in register
+.BR Hps1 ,
+and by the amount in
+.B Hps2
+otherwise.
+.
+The
+.B Hb
+register sets a threshold below which a break occurs after the heading,
+and register
+.B Hs
+sets a threshold below which vertical space follows it.
+.
+If the heading level is not less than both of these,
+a
+.I run-in heading
+is produced;
+paragraph text follows on the same output line.
+.
+Otherwise,
+register
+.B Hi
+configures the indentation of text after headings.
+.
+Threshold register
+.B Hc
+enables the centering of headings;
+a heading level below both of the
+.B Hb
+and
+.B Hc
+thresholds is centered.
+.
+.
+.IP
+.I Heading typeface and size.
+.
+The fonts used for heading numbers and titles at each level are
+configured by the
+.B HF
+string.
+.
+The string
+.B HP
+likewise assigns a type size to each heading level.
+.
+.\" XXX: Why not an "Hvs" string?
+The vertical spacing used by headings may be controlled by
+the user-definable macros
+.B HX
+and/or
+.BR HZ .
+.
+.
+.IP
+.I Heading number format.
+.
+Registers named
+.B H1
+through
+.B H14
+store counters for each heading level.
+.
+Their values are printed using Arabic numerals by default;
+see
+.BR HM .
+.
+The heading levels are catenated with dots for formatting;
+to typeset only the deepest,
+set the
+.B Ht
+register.
+.
+Heading numbers are not suffixed with a trailing dot except when only
+the first level is output;
+to omit a dot in this case as well,
+clear the
+.B H1dot
+register.
+.
+.
+.IP
+.I Customizing heading behavior.
+.
+.I mm
+calls
+.I hook
+macros to enable further customization of headings.
+.
+(DWB
+.I mm
+called these \[lq]exits\[rq].)
+.
+They can be used to change the heading's
+.I mark
+(the numbered portion before any heading title),
+its vertical spacing,
+and its vertical space requirements
+(for instance,
+to require a minimum quantity of subsequent output lines).
+.
+Define hook macros in expectation of the following parameters.
+.
+The argument
+.I declared-level
+is the
+.I level
+argument to
+.BR H ,
+.RB or\~ 0
+for unnumbered headings (see
+.BR HU ).
+.
+.I actual-level
+is the same as
+.I declared-level
+for numbered headings,
+and the value of
+.RB register\~ Hu
+for unnumbered headings.
+.
+.I title
+is the corresponding argument to
+.B H
+or
+.BR HU .
+.
+.
+.RS
+.TP
+.BI HX\~ "declared-level actual-level title"
+.I mm
+calls
+.B HX
+before setting the heading.
+.
+Your definition may alter
+.BR }0 ,
+.BR }2 ,
+and
+.BR ;3 .
+.
+.
+.\" XXX: These names are ugly and of no obvious meaning. Make
+.\" documented aliases for them.
+.RS
+.TP
+.BR }0\~ (string)
+contains the heading mark plus two spaces if
+.I declared-level
+is non-zero,
+and otherwise is empty.
+.
+.
+.TP
+.BR ;0\~ (register)
+encodes a position for the text after the heading.
+.
+0\~means that the heading is to be run in,
+1\~means that a break is to occur before the text,
+and 2\~means that vertical space is to separate heading and text.
+.
+.
+.TP
+.BR }2\~ (string)
+is the suffix that separates a run-in heading from the text.
+.
+It contains two spaces if register
+.B ;0
+is\~0,
+and otherwise is empty.
+.
+.
+.TP
+.BR ;3\~ (register)
+contains the vertical space required for the heading to be typeset.
+.
+If that amount is not available,
+the page is broken prior to the heading.
+.
+The default is
+.BR 2v .
+.RE
+.
+.
+.TP
+.BI HY\~ "declared-level actual-level title"
+.I mm
+calls
+.B HY
+after determing the heading typeface and size.
+.
+It could be used to change indentation.
+.
+.
+.TP
+.BI HZ\~ "declared-level actual-level title"
+.I mm
+calls
+.B HZ
+after formatting the heading,
+just before
+.B H
+or
+.B HU
+returns.
+.
+It could be used to change the page header to include a section heading.
+.\" XXX: ...but only for the _next_ page, not the current one. See
+.\" Savannah #62825.
+.RE
+.
+.
+.TP
+.BI HC\ \fR[\fPhyphenation-character\fR]\fP
+Set hyphenation character.
+.
+Default value is \[lq]\[rs]%\[rq].
+.
+Resets to the default if called without argument.
+.
+Hyphenation can be turned off by setting register
+.B Hy
+to\~0 at the beginning of the file.
+.
+.
+.TP
+.BI HM\ "\fR[\fParg1 \fR[\fParg2 \fR[.\|.\|.\& [\fParg14\fR]]]]\fP"
+Set the heading mark style.
+.
+Each argument assigns the specified register format
+(see above)
+to the corresponding heading level.
+.
+The default
+.RB is\~ 1
+for all levels.
+.
+An explicitly empty argument also indicates the default.
+.
+.
+.TP
+.BI HU\~ heading-text
+Set an unnumbered section heading.
+.
+Except for a heading number,
+it is treated as a numbered heading of the level stored in
+.RB register\~ Hu ;
+.RB see\~ H .
+.
+.
+.TP
+.BR I \~\c \" space in roman; we must use 2-font macro with \c
+.RI [ italic-text\~\c
+.RI [ previous-font-text ]]\~.\|.\|.
+Join
+.I italic-text
+in italics with
+.I previous-font-text
+in the previous font,
+without space between the arguments.
+.
+If no arguments,
+switch font to italic style.
+.
+.
+.TP
+.BR IA \~[\c
+.IR recipient-name \~[\c
+.IR title ]]
+Specify the inside address in a letter.
+.
+Input is collected into the inside address until
+.B IE
+is called,
+and then output.
+.
+You can specify multiple recipients with empty
+.BR IA / IE
+pairs;
+only the last address is used.
+.
+The arguments give each recipient a name and title.
+.
+See
+.BR LT .
+.
+.
+.TP
+.BR IB \~\c \" space in roman; we must use 2-font macro with \c
+.RI [ italic-text\~\c
+.RI [ bold-text ]]\~.\|.\|.
+Join
+.I italic-text
+in italics with
+.I bold-text
+in boldface,
+without space between the arguments.
+.
+.
+.TP
+.B IE
+End the inside address begun with
+.BR IA .
+.
+.
+.TP
+.BI IND\~ argument\~\c
+\&.\|.\|.
+If the Boolean register
+.B Ref
+is true,
+write an index entry as a specially prepared
+.I roff
+comment to the standard error stream,
+with each
+.I argument
+separated from its predecessor by a tab character.
+.
+The entry's location information is arranged as configured by the most
+recent
+.B INITI
+call.
+.
+.
+.TP
+.B INDP
+Output the index set up by
+.B INITI
+and populated by
+.B IND
+calls.
+.
+By default,
+.B INDP
+calls
+.B SK
+and writes a centered caption interpolating the string
+.BR Index .
+.
+It then disables filling and calls
+.BR 2C ;
+afterward,
+it restores filling and calls
+.BR 1C .
+.
+.
+.IP
+Define macros to customize this behavior.
+.
+.B INDP
+calls
+.B TXIND
+before the caption,
+.B TYIND
+.I instead
+of writing the caption,
+and
+.B TZIND
+after formatting the index.
+.
+.
+.TP
+.BI INITI\~ "location-type file-name\~"\c
+.RI [ macro ]
+Initialize
+.IR "groff mm" 's
+indexing system.
+.
+Argument
+.I location-type
+selects how the location of each index entry is reported.
+.
+.I file-name
+populates an internal string used later by
+.BR INDP .
+.
+.
+.IP
+.TS
+tab(@);
+Lf(BI) Lb
+L Lx.
+location-type@Entry format
+N@page number
+H@heading mark
+B@page number, tab character, heading mark
+.TE
+.
+.
+.IP
+If
+.I macro
+is specified,
+it is called for each index entry
+with the arguments given to
+.BR IND .
+.
+.
+.TP
+.BI INITR\~ id
+Initialize the cross reference macros.
+.
+Cross references are written to the standard error stream,
+which should be redirected into a file named
+.RI id .qrf .
+.
+.MR mmroff @MAN1EXT@
+handles this and the two formatting passes it requires.
+.\".
+.\"This program exists because
+.\".MR groff @MAN1EXT@
+.\"by default deactivates the unsafe operations that are required by
+.\".BR INITR .
+.
+The first pass identifies cross references,
+and the second one includes them.
+.\"
+.\".B INITR
+.\"can be used several times,
+.\"but it is only the first occurrence of
+.\".B INITR
+.\"that is active.
+.
+.
+.IP
+See
+.BR SETR ,
+.BR GETPN ,
+and
+.BR GETHN .
+.
+.
+.TP
+.BR IR \~\c \" space in roman; we must use 2-font macro with \c
+.RI [ italic-text\~\c
+.RI [ roman-text ]]\~.\|.\|.
+Join
+.I italic-text
+in italics with
+.I roman-text
+in roman style,
+without space between the arguments.
+.
+.
+.TP
+.BR ISODATE\~ [ 0 ]
+Use ISO\~8601 format for the date string
+.B DT
+used by some cover sheet and memorandum types;
+that is,
+.IR YYYY - MM - DD .
+.
+Must be called before
+.B ND
+to be effective.
+.
+If given an argument
+.RB of\~ 0,
+the traditional date format for the
+.I groff
+locale is used;
+this is also the default.
+.
+.
+.TP
+.BI LB\~ "text-indent mark-indent pad type"\~\c
+.RI [ mark \~[ pre-item-space \~[ pre-list-space ]]]
+Begin list.
+.
+The macros
+.BR AL ,
+.BR BL ,
+.BR BVL ,
+.BR DL ,
+.BR ML ,
+.BR RL ,
+and
+.B VL
+call
+.B LB
+in various ways;
+they are simpler to use and may be preferred if they suit the desired
+purpose.
+.
+.
+.br
+.ne 5v
+.IP
+The nesting level of lists is tracked by
+.I mm;
+the outermost level is\~0.
+.
+The text of each list item is indented by
+.I text-indent;
+the default is taken from the
+.B Li
+register
+(in ens).
+.
+Each item's mark is indented by
+.I mark-indent;
+the default is
+.BR 0n .
+.
+The mark is normally left-aligned.
+.
+If
+.I pad
+is greater than zero,
+.I mark-indent
+is overridden such that
+.I pad
+ens of space follow the mark.
+.
+.I type
+selects one of six possible ways to display the mark.
+.
+.
+.IP
+.TS
+tab(@);
+Lf(BI) Lb
+L L.
+type@Output for a mark \[lq]x\[rq]
+1@x.
+2@x)
+3@(x)
+4@[x]
+5@<x>
+6@{x}
+.TE
+.
+.
+.IP
+If
+.I type
+is\~0 and
+.I mark
+is unspecified,
+the items are set with a hanging indent.
+.
+Otherwise,
+.I mark
+is interpreted as a string defining the mark.
+.
+If
+.I type
+is greater than zero,
+items are automatically numbered;
+.I mark
+is interpreted as a register format.
+.
+The default
+.I type
+.RB is\~ 0 .
+.
+.
+.IP
+The last two arguments manage vertical space.
+.
+Unless a list's nesting level is greater than the value of register
+.BR Ls ,
+its items are preceded by
+.I pre-item-space
+multiplied by the register
+.BR Lsp ;
+the default
+.RB is\~ 1 .
+.
+.B LB
+precedes the list by
+.I pre-list-space
+multiplied by the register
+.BR Lsp ;
+the default
+.RB is\~ 0 .
+.
+.
+.TP
+.BR LC \~[\c
+.IR list-level ]
+Clear list state.
+.
+Active lists are terminated as if with
+.BR LE ,
+either all
+(the default)
+or only those from the current level down to
+.I list-level
+if specified.
+.
+.B H
+calls
+.B LC
+automatically.
+.
+.
+.TP
+.BR LE \~[ 1 ]
+End list.
+.
+The current list is terminated.
+.
+An argument
+.RB of\~ 1
+causes
+vertical space in the amount of register
+.B Lsp
+to follow the list.
+.
+.
+.TP
+.BR LI \~[\c
+.IR mark \~[ item-mark-mode ]]
+Begin a list item.
+.
+Input is collected into a list item until the current list is terminated
+or
+.B LI
+is called again.
+.
+By default,
+the item's text is preceded by any mark configured by the current list.
+.
+If only
+.I mark
+is specified,
+it replaces the configured mark.
+.
+A second argument
+prefixes
+.I mark
+to the configured mark;
+an
+.I item-mark-mode
+value of\~1 places an unbreakable space after
+.I mark,
+while
+a value of\~2 does not
+(rendering the two adjacent).
+.
+Also see register
+.BR Limsp .
+.
+.
+.TP
+.BI LO\~ option\~\c
+.RI [ value ]
+Specify letter options;
+see
+.BR LT .
+.
+Standard options are as follows.
+.
+See
+.B IA
+regarding the inside address and string
+.B DT
+regarding the date.
+.
+.
+.IP
+.TS
+tab(@);
+Lf(BI) Lb
+L Lx.
+option@Effect
+AT@T{
+Attention;
+put contents of string
+.B LetAT
+and
+.I value
+left-aligned after the inside address.
+T}
+CN@T{
+Confidential;
+put
+.I value,
+or contents of string
+.BR LetCN ,
+left-aligned after the date.
+T}
+RN@T{
+Reference;
+put contents of string
+.B LetRN
+and
+.I value
+after the confidental notation
+(if any)
+and the date,
+aligned with the latter.
+T}
+SA@T{
+Salutation;
+put
+.I value,
+or contents of string
+.BR LetSA ,
+left-aligned after the inside address
+and the confidental notation
+(if any).
+T}
+SJ@T{
+Subject;
+put contents of string
+.B LetSJ
+and
+.I value
+left-aligned after the inside address
+and the attention and salutation notations
+(if any).
+.
+In letter type \[lq]SP\[rq],
+.B LetSJ
+is ignored and
+.I value
+is set in full capitals.
+T}
+.TE
+.
+.
+.br
+.ne 5v
+.TP
+.BR LT \~[\c
+.IR style ]
+Format a letter in the designated
+.I style,
+defaulting to
+.B BL
+(see below).
+.
+A letter begins with the writer's address
+.RB ( WA / WE ),
+followed by the date
+.RB ( ND ),
+the inside address
+.RB ( IA / IE ),
+the body of the letter
+.RB ( P
+and other general-purpose
+.I mm
+macros),
+the formal closing
+.RB ( FC ),
+the signature
+.RB ( SG ),
+and notations
+.RB ( NS / NE ).
+.
+Any of these may be omitted.
+.
+Letter options specified with
+.B LO
+add further annotations,
+which are extensible;
+see section \[lq]Internals\[rq] below.
+.
+.
+.br
+.ne 6v
+.IP
+.TS
+tab(@);
+Lf(BI) Lb
+Lb Lx.
+style@Description
+BL@T{
+Blocked:
+the writer's address,
+date,
+formal closing,
+and signature are indented to the center of the line.
+.
+Everything else is left-aligned.
+T}
+SB@T{
+Semi-blocked:
+as
+.BR BL ,
+but the first line of each paragraph is indented by
+.BR 5m .
+.\" XXX: https://savannah.gnu.org/bugs/?64315
+T}
+FB@T{
+Fully blocked:
+everything begins at the left margin.
+T}
+SP@T{
+Simplified:
+as
+.BR FB ,
+but a formal closing is omitted,
+and the signature is set in full capitals.
+T}
+.TE
+.
+.
+.TP
+.BI MC\~ column-width\~\c
+.RI [ gutter-width ]
+Begin multi-column layout.
+.
+.I groff mm
+creates as many columns of
+.I column-width
+as the line length will permit.
+.
+.I gutter-width
+is the interior spacing between columns.
+.
+It defaults to
+.IR column-width /15.
+.
+.B 1C
+returns to single-column layout.
+.
+.B MC
+is a GNU extension.
+.
+See
+.B MULB
+for an alternative.
+.
+.
+.TP
+.BI ML\~ "mark \fR[\fPtext-indent\~" \fR[\fP1\fR]]\fP
+Start a list with the
+.I mark
+argument preceding each list item.
+.
+.I text-indent
+overrides the default indentation of the list items set by register
+.BR Li .
+.
+If a third argument,
+conventionally
+.BR 1 ,
+is given,
+the blank line that normally precedes each list item is suppressed.
+.
+Use
+.B LI
+to declare list items,
+and
+.B LE
+to end the list.
+.
+.
+.TP
+.BR MT \~\c \" space in roman; we must use 2-font macro with \c
+.RI [ type \~[ addressee ]]
+Select memorandum type.
+.
+These correspond to formats used by AT&T Bell Laboratories,
+where the
+.I mm
+package was initially developed,
+affecting the document layout.
+.
+Some of these included a cover page with a caption categorizing the
+document.
+.
+.I groff mm
+uses
+.I type
+to construct the file name
+.IR @TMAC_MDIR@/\:\% type \:.MT
+and load it with the
+.B mso
+request.
+.
+Memorandum types 0 to\~5 are supported;
+any other value of
+.I type
+is mapped to type\~6.
+.
+If
+.I type
+is omitted,
+.B 0
+is implied.
+.
+.I addressee
+sets a string analogous to one used by AT&T cover sheet macros that are
+not implemented in
+.IR "groff mm" .
+.
+.
+.IP
+.TS
+tab(@);
+Lf(BI) Lb
+L L.
+type@Description
+0@normal memorandum; no caption
+1@captioned \[lq]MEMORANDUM FOR FILE\[rq]
+2@captioned \[lq]PROGRAMMER'S NOTES\[rq]
+3@captioned \[lq]ENGINEER'S NOTES\[rq]
+4@released paper
+5@external letter
+.TE
+.
+.
+.IP
+See
+.B \%COVER
+for a more flexible cover sheet mechanism.
+.
+.
+.TP
+.BI MOVE\ "y-pos \fR[\fPx-pos \fR[\fPline-length\fR]]\fP"
+Move to a position, setting page offset to
+.IR x-pos .
+.
+If
+.I line-length
+is not given, the difference between current and new page offset is
+used.
+.
+Use
+.B PGFORM
+without arguments to return to normal.
+.
+.
+.TP
+.BR MULB \~\c \" space in roman; we must use 2-font macro with \c
+.IR "cw1 space1\~" [ "cw2 space2" "] .\|.\|.\~" cwn
+Begin alternative multi-column mode.
+.
+All column widths must be specified,
+as must the amount of space between each column pair.
+.
+The arguments' default scaling unit is
+.BR n .
+.
+.B MULB
+uses a diversion and operates in a separate environment.
+.
+.
+.TP
+.B MULN
+Begin next column in alternative column mode.
+.
+.
+.TP
+.B MULE
+End alternative multi-column mode and emit the columns.
+.
+.
+.TP
+.B NCOL
+Move to the start of the next column
+(only when using
+.B 2C
+or
+.BR MC ).
+.
+Contrast with
+.BR MULN .
+.
+.
+.TP
+.BR ND \~[\c
+.IR arg ]
+Set the document's date.
+.
+.I mm
+does not interpret
+.IR arg ;
+it can be a revision identifier
+(or empty).
+.
+.
+.TP
+.B NE
+End notation begun with
+.BR NS ;
+filling is enabled.
+.
+.
+.TP
+.BI nP\ \fR[\fPtype\fR]\fP
+Begin a numbered paragraph at heading level two.
+.
+See
+.BR P .
+.
+.
+.br
+.ne 6v
+.TP
+.BR NS \~[\c
+.IR code \~[\c
+.BR 1 ]]
+Declare notations,
+typically for letters or memoranda,
+of the type specified by
+.IR code .
+.
+The text corresponding to
+.I code
+is output,
+and filling is disabled
+until
+.B NE
+is called.
+.
+Typically,
+a list of names or attachments lies within
+.BR NS / NE .
+.
+If
+.I code
+is absent or does not match one of the values listed under the
+.B Letns
+string description below,
+each line of notations is formatted as
+.RI "\[lq]Copy (" line ") to\[rq]."
+.
+If a second argument,
+conventionally
+.BR 1 ,
+is given,
+.I code
+becomes the entire notation and
+.B NE
+is not necessary.
+.
+In
+.IR "groff mm" ,
+you can set up further notations to be recognized by
+.BR NS ;
+see the strings
+.B Letns
+and
+.B Letnsdef
+below.
+.
+.
+.TP
+.BR OF\~ [ \[dq]\|\[aq]\c
+.IB left \[aq] center \[aq] right \[aq]\|\[dq]\c
+]
+Define the odd-page footer,
+which is formatted just above the normal page footer on odd-numbered
+pages.
+.
+See
+.BR PF .
+.
+.B OF
+defines the string
+.BR EOPof .
+.
+.
+.TP
+.BR OH\~ [ \[dq]\|\[aq]\c
+.IB left \[aq] center \[aq] right \[aq]\|\[dq]\c
+]
+Define the odd-page header,
+which is formatted just below the normal page header on odd-numbered
+pages.
+.
+See
+.BR PH .
+.
+.B OH
+defines the string
+.BR TPoh .
+.
+.
+.TP
+.B OP
+Make sure that the following text is printed at the top of an
+odd-numbered page.
+.
+Does not output an empty page if currently at the top of an odd page.
+.
+.
+.br
+.ne 4v
+.TP
+.BR P \~[\c
+.IR type ]
+Begin new paragraph.
+.
+If
+.I type
+is missing or\~ 0,
+.BR P \~sets
+the paragraph fully left\-aligned.
+.
+A
+.I type
+of\~1
+idents the first line by
+.B \[rs][Pi]
+ens.
+.
+Set the register
+.B Pt
+to select a default paragraph indentation style.
+.
+The register
+.B Ps
+controls the vertical spacing between paragraphs.
+.
+.
+.TP
+.B PE
+Picture end;
+see
+.MR @g@pic @MAN1EXT@ .
+.
+.
+.TP
+.BR PF\~ [ \[dq]\|\[aq]\c
+.IB left \[aq] center \[aq] right \[aq]\|\[dq]\c
+]
+Define the page footer.
+.
+The footer is formatted at the bottom of each page;
+the argument is otherwise as described in
+.BR PH .
+.
+.B PF
+defines the string
+.BR EOPf .
+.
+See
+.BR EF ,
+.BR OF ,
+and
+.BR EOP .
+.
+.TP
+.BI PGFORM\ "\fR[\fPlinelength \fR[\fPpagelength \fR[\fPpageoffset\ " \fR[\fP1\fR]]]]\fP
+Set line length, page length, and/or page offset.
+.
+This macro can be used for letterheads and similar.
+.
+It is normally the first macro call in a file,
+though it is not necessary.
+.
+.B PGFORM
+can be used without arguments to reset everything after a
+.B MOVE
+call.
+.
+A line break is done unless the fourth argument is given.
+.
+This can be used to avoid the page number 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
+line length, page length, and page offset instead.)
+.
+.TP
+.B PGNH
+Suppress header on the next page.
+.
+This macro must be called before any macros that produce output to
+affect the layout of the first page.
+.
+.
+.TP
+.BR PH\~ [ \[dq]\|\[aq]\c
+.IB left \[aq] center \[aq] right \[aq]\|\[dq]\c
+]
+.RS
+Define the page header,
+formatted at the top of each page,
+as the argument,
+where
+.IR left ,
+.IR center ,
+and
+.I right
+are aligned to the respective locations on the line.
+.
+A
+.RB \[lq] % \[rq]
+character in
+.I arg
+is replaced by the page number.
+.
+If the argument is absent,
+no page header is set.
+.
+The default page header is
+.
+.RS
+.EX
+\[dq]\[aq]\[aq]\- % \-\[aq]\[aq]\[dq]
+.EE
+.RE
+.
+which centers the page number between hyphens and formats nothing at the
+upper left and right.
+.
+Header macros call
+.B PX
+(if defined)
+after formatting the header.
+.
+.B PH
+defines the string
+.BR TPh .
+.
+See
+.BR EH ,
+.BR OH ,
+and
+.BR TP .
+.RE
+.
+.
+.TP
+.BR PIC \~\c
+.RB [ \-B ]\~\c
+.RB [ \-C |\c
+.BI \-I\~ n\c
+.RB | \-L \c
+.RB | \-R ]\~\c
+.IR file \~[ width \~[ height ]]
+Include PostScript document
+.IR file .
+.
+The optional
+.B \-B
+argument draws a box around the picture.
+.
+The optional
+.BR \-L ,
+.BR \-C ,
+.BR \-R ,
+and
+.BI \-I\~ n
+arguments align the picture or indent it by
+.I n
+(assuming a scaling unit of
+.BR m ).
+.
+By default,
+the picture is left-aligned.
+.
+Optional
+.I width
+and
+.I height
+arguments resize the picture.
+.
+Use of this macro requires two-pass processing;
+see
+.B INITR
+and
+.MR mmroff @MAN1EXT@ .
+.
+.
+.TP
+.B PS
+Picture start; see
+.MR @g@pic @MAN1EXT@ .
+.
+.
+.TP
+.B PY
+Picture end with flyback.
+.
+Ends a
+.MR @g@pic @MAN1EXT@
+picture,
+returning the vertical position to where it was prior to the picture.
+.
+This is a GNU extension.
+.
+.
+.TP
+.BR R \~\c \" space in roman; we must use 2-font macro with \c
+.RI [ roman-text\~\c
+.RI [ previous-font-text ]]\~.\|.\|.
+Join
+.I roman-text
+in roman style with
+.I previous-font-text
+in the previous font,
+without space between the arguments.
+.
+If no arguments,
+switch font to roman style.
+.
+.
+.TP
+.BR RB \~\c \" space in roman; we must use 2-font macro with \c
+.RI [ roman-text\~\c
+.RI [ bold-text ]]\~.\|.\|.
+Join
+.I roman-text
+in roman style with
+.I bold-text
+in boldface,
+without space between the arguments.
+.
+.
+.TP
+.BI RD\ "\fR[\fPprompt \fR[\fPdiversion \fR[\fPstring\fR]]]\fP"
+Read from standard input to diversion and/or string.
+.
+The text is saved in a diversion named
+.IR diversion .
+.
+Recall the text by writing the name of the diversion after a dot
+on an empty line.
+.
+A string is also defined if
+.I string
+is given.
+.
+.I Diversion
+and/or
+.I prompt
+can be empty (\[dq]\[dq]).
+.
+.TP
+.B RF
+Reference end.
+.
+Ends a reference definition and returns to normal processing.
+.
+See
+.BR RS .
+.
+.
+.TP
+.BR RI \~\c \" space in roman; we must use 2-font macro with \c
+.RI [ roman-text\~\c
+.RI [ italic-text ]]\~.\|.\|.
+Join
+.I roman-text
+in roman style with
+.I italic-text
+in italics,
+without space between the arguments.
+.
+.
+.TP
+.BR RL \~[\c
+.IR text-indent \~[\c
+.BR 1 ]]
+Begin reference list.
+.
+Each item is preceded by an automatically incremented number between
+square brackets;
+compare
+.BR AL .
+.
+.I text-indent
+changes the default indentation.
+.
+Use
+.B LI
+to declare list items,
+and
+.B LE
+to end the list.
+.
+A second argument,
+conventionally
+.BR 1 ,
+suppresses the blank line that normally precedes each list item.
+.
+.
+.TP
+.BR RP \~\c \" space in roman; we must use 2-font macro with \c
+.RI [ suppress-counter-reset \~[ page-ejection-policy ]]
+Format a reference page,
+listing items accumulated within
+.BR RS / RF
+pairs.
+.
+The reference counter is reset unless the first argument
+.RB is\~ 1 .
+.
+Normally,
+page breaks occur before and after the references are output;
+the register
+.B Rpe
+configures this behavior,
+and a second argument overrides its value.
+.
+.B TC
+calls
+.B RP
+automatically if references have accumulated.
+.
+.
+.IP
+References are list items,
+and thus are vertically separated
+(see
+.BR LB ).
+.
+Setting register
+.B Ls
+.RB to\~ 0
+suppresses this spacing.
+.
+The string
+.B Rp
+contains the reference page caption.
+.
+.
+.br
+.ne 5v
+.TP
+.BR RS \~[\c
+.IR reference-string ]
+Begin an automatically numbered reference definition.
+.
+By default,
+references are numbered starting at 1;
+the number is available in register
+.BR :R .
+.
+Interpolate the string
+.B Rf
+where the reference mark should be and write the reference between
+.BR RS / RF
+on an input line after the reference mark.
+.
+If
+.I reference-string
+is specified,
+.I "groff ms"
+also stores the reference mark in a string of that name,
+which can be interpolated as
+.BI \[rs]*[ reference-string ]
+subsequently.
+.
+.
+.TP
+.BR S \~[\c
+.IR type-size \~[ vertical-spacing ]]
+Set type size and vertical spacing.
+.
+Each argument is a
+.I groff
+measurement,
+using an appropriate scaling unit and an optional
+.B +
+or
+.B \-
+prefix to increment or decrement the current value.
+.
+An argument of
+.B P
+restores the previous value,
+.B C
+indicates the current value,
+and
+.B D
+requests the default.
+.
+An empty or omitted argument is treated as
+.BR P .
+.
+.
+.TP
+.BR SA \~\c
+.RI [ mode ]
+Set or restore the default enablement of adjustment.
+.
+Specify
+.B 0
+or
+.B 1
+as
+.I mode
+to set a document's default explicitly;
+.B 1
+is assumed by
+.IR mm .
+.
+Adjustment can be temporarily suspended with the
+.B na
+request.
+.
+When the
+.B H
+or
+.B HU
+macros are used to format a heading,
+or when
+.B SA
+is called without a
+.I mode
+argument,
+the default adjustment is restored.
+.
+.
+.TP
+.BI SETR\ "refname \fR[\fPstring\fR]\fP"
+Remember the current heading and page numbers as
+.IR refname .
+.
+Saves
+.I string
+if
+.I string
+is defined.
+.
+.I string
+is retrieved with
+.BR GETST .
+.
+See
+.BR INITR .
+.
+.TP
+.BI SG\ \fR[\fParg\ \fR[\fP1\fR]]\fP
+Signature line.
+.
+Prints the authors name(s) after the formal closing.
+.
+The argument is appended to the reference data, printed at either the
+first or last author.
+.
+The reference data is the location, department, and initials specified
+with
+.BR AU .
+.
+It is printed at the first author if the second argument is given,
+otherwise at the last.
+.
+No reference data is printed if the author(s) is specified through
+.BR WA / WE .
+.
+See section \[lq]Internals\[rq] below.
+.
+.
+.TP
+.BR SK \~\c
+.RI [ n ]
+Skip
+.I n
+pages.
+.
+If
+.I n
+is\~0 or omitted,
+the page is broken unless the drawing position is already at the top of
+a page.
+.
+Otherwise,
+.I n
+pages,
+blank except for any headers and footers,
+are printed.
+.
+.
+.br
+.ne 4v \" XXX: 3v should suffice
+.TP
+.BI SM\~ text\~\c
+.RI [ post ]
+.TQ
+.BI SM\~ "pre text post"
+Format
+.I text
+at a smaller type size,
+joined with any specified
+.I pre
+and
+.I post
+at normal size.
+.
+.
+.TP
+.BI SP\ \fR[\fPlines\fR]\fP
+Space vertically.
+.
+.I lines
+can have any scaling factor,
+like \[lq]3i\[rq] or \[lq]8v\[rq].
+.
+Several
+.B SP
+calls in a line only produces the maximum number of lines, not the sum.
+.
+.B SP
+is ignored also until the first text line in a page.
+.
+Add
+.B \[rs]&
+before a call to
+.B SP
+to avoid this.
+.
+.
+.TP
+.B TAB
+Reset tab stops to every 5\~ens.
+.
+.
+.br
+.ne 4v
+.TP
+.BR TB \~\c
+.RI [ title \~[ override \~[ flag \~[ refname ]]]]
+Caption a table.
+.
+Arguments are handled analogously to
+.BR EC .
+.
+The register
+.B Tb
+is the table counter.
+.
+The string
+.B Litb
+precedes the table number and any
+.I title.
+.
+Table captions are centered irrespective of the alignment of any
+enclosing display.
+.
+.
+.IP
+Captioned tables are listed in a table of contents
+(see
+.BR TC )
+if the Boolean register
+.B Lt
+is true.
+.
+Such a list uses the string
+.B Lt
+as a heading.
+.
+.
+.TP
+.BR TC \~\c
+.RI [ slevel\~\c
+.RI [ spacing\~\c
+.RI [ tlevel\~\c
+.RI [ tab\~\c
+.RI [ h1\~\c
+.RI [ h2\~\c
+.RI [ h3\~\c
+.RI [ h4\~\c
+.RI [ h5 ]]]]]]]]]
+Output table of contents.
+.
+This macro is normally the last called in the document.
+.
+It flushes any pending displays and,
+if any references are pending
+(see
+.BR RS ),
+calls
+.BR RP .
+.
+It then begins a new page with the contents caption,
+stored in the string
+.BR Licon ,
+centered at the top.
+.
+The entries follow after three vees of space.
+.
+Each entry is a
+saved section
+(number and)
+heading title
+(see the
+.B Cl
+register),
+along with its associated page number.
+.
+By default,
+an entry is indented by an amount corresponding to its heading level
+and the maximum heading length encountered at that heading level;
+if defined,
+the string
+.B Ci
+overrides these indentations.
+.
+Entries at heading levels up to and including
+.I slevel
+are preceded by
+.I spacing
+vees of space.
+.
+Entries at heading levels up to and including
+.I tlevel
+are followed by a leader and a right-aligned page number.
+.
+If the Boolean-valued
+.I tab
+argument is true,
+the leader is replaced with horizontal motion in the same amount.
+.
+For entries above heading level
+.IR tlevel ,
+the page number follows the heading text after a word space.
+.
+Each argument
+.IR h1 .\|.\|. h5
+appears in order on its own line,
+centered,
+above the contents caption.
+.
+Page numbering restarts at 1,
+in register format \[lq]i\[rq].
+.
+If the
+.B Oc
+register is true,
+numbering of these pages is suppressed.
+.
+.
+.IP
+If
+.B TC
+is called with at most four arguments,
+it calls the user-defined macro
+.B TX
+(if defined)
+prior to formatting the contents caption,
+and
+.B TY
+(if defined)
+.I instead
+of formatting the contents caption.
+.
+.
+.IP
+Analogous handling of lists of figures,
+tables,
+equations,
+and exhibits is achieved by defining
+.BI TX xx
+and
+.BI TY xx
+macros,
+where
+.I xx
+is \[lq]FG\[rq],
+\[lq]TB\[rq],
+\[lq]EC\[rq],
+or \[lq]EX\[rq],
+respectively.
+.
+Similarly,
+the strings
+.BR Lifg ,
+.BR Litb ,
+.BR Liex ,
+and
+.B Liec
+determine captions for their respective lists.
+.
+.
+.TP
+.B TE
+Table end.
+.
+See
+.BR TS .
+.
+.TP
+.B TH
+End table heading.
+.
+It is repeated after page breaks within a table.
+.
+See
+.BR TS .
+.
+The
+.B N
+argument supported by DWB
+.I mm
+is not implemented by
+.I "groff mm."
+.
+.
+.TP
+.BR TL \~[\c
+.IR charging-case-number \~[\c
+.IR filing-case-number ]]
+Begin document title.
+.
+Input is collected into the title until
+.B AF
+or
+.B AU
+is called,
+and output as directed by the cover page.
+.
+.I charging-case-number
+and
+.I filing-case-number
+are saved for use in memorandum types 0 and 5.
+.
+See
+.BR MT .
+.
+.
+.TP
+.BI TM\~ number\c
+\~.\|.\|.
+Declare technical memorandum number(s) used by
+.BR MT .
+.
+.
+.br
+.ne 6v
+.TP
+.B TP
+If defined,
+this macro is called in lieu of normal page header layout.
+.
+Headers and footers are formatted in a separate environment.
+.
+See
+.BR EOP .
+.
+.
+.IP
+.TS
+tab(@);
+Cb S
+Lb L.
+Strings available to TP
+_
+TPh@argument to \fBPH\fP
+TPeh@argument to \fBEH\fP
+TPoh@argument to \fBOH\fP
+.TE
+.
+.
+.TP
+.B TS \fR[\fPH\fR]\fP
+Table start.
+.
+Argument \[lq]H\[rq] tells
+.I mm
+that the table has a heading.
+.
+See
+.BR TE ,
+.BR TH ,
+and
+.MR @g@tbl @MAN1EXT@ .
+.
+.
+.TP
+.BR VERBON \~\c \" space in roman; we must use 2-font macro with \c
+.RI [ format \~[ type-size \~[ font ]]]
+Begin verbatim display,
+where characters have equal width.
+.
+.I format
+controls several parameters.
+.
+Add up the values of desired features;
+the default
+.RB is\~ 0 .
+.
+On typesetting devices,
+further arguments configure the
+.I type-size
+in scaled points,
+and the face
+.RI ( font );
+the default is
+.B CR
+(Courier roman).
+.
+.
+.IP
+.TS
+tab(@);
+lb lb
+l lx.
+Value@Effect
+1@Disable the formatter's escape character (\[rs]).
+2@Vertically space before the display.
+4@Vertically space after the display.
+8@T{
+Number output lines; call formatter's
+.B nm
+request with arguments in string
+.BR Verbnm .
+T}
+16@T{
+Indent by the amount stored in register
+.BR Verbin .
+T}
+.TE
+.
+.
+.TP
+.B VERBOFF
+End verbatim display.
+.
+.
+.TP
+.BR VL \~[\c
+.IR text-indent \~[ mark-indent \~[\c
+.BR 1 ]]]
+Begin variable-item
+(or \[lq]tagged\[rq])
+list.
+.
+Each item should supply its own mark,
+or tag.
+.
+If the mark is wider than
+.I mark-indent,
+one space separates it from subsequent text;
+contrast
+.BR BVL .
+.
+.I text-indent
+sets the indentation of the text,
+and
+.I mark-indent
+the distance from the current list indentation to the mark.
+.
+A third argument suppresses the blank line that normally precedes each
+list item.
+.
+Use
+.B LI
+to declare list items,
+and
+.B LE
+to end the list.
+.
+.
+.TP
+.BI "VM \fR[\fP\-T\fR] [\fP" "top \fR[\fPbottom\fR]]\fP"
+Vertical margin.
+.
+Increase the top and bottom margin by
+.I top
+and
+.IR bottom ,
+respectively.
+.
+If option
+.B \-T
+is specified, set those margins to
+.I top
+and
+.IR bottom .
+.
+If no argument is given, reset the margin to zero, or to the default
+(\[lq]7v 5v\[rq])
+if
+.B \-T
+is used.
+.
+It is highly recommended that macros
+.B TP
+and/or
+.B EOP
+are defined if using
+.B \-T
+and setting top and/or bottom margin to less than the default.
+.
+This undocumented DWB
+.I mm
+macro is exposed by
+.I groff mm
+to increase user control of page layout.
+.
+.
+.TP
+.BR WA \~[\c
+.IR writer's-name \~[\c
+.IR title ]]
+Specify the writer(s) of an
+.B LT
+letter.
+.
+Input is collected into the writer's address until
+.B WA
+is called,
+and then output.
+.
+You can specify multiple writers with empty
+.BR WA / WE
+pairs;
+only the last address is used.
+.
+The arguments give each writer a name and title.
+.
+.
+.TP
+.BR WC \~[\c
+.IR format \~.\|.\|.]
+Control width of footnotes and displays.
+.
+.
+.IP
+.RS
+.TS
+tab(@);
+Lf(BI) Lb
+Lb Lx.
+format@Effect
+N@T{
+equivalent to
+.RB \[lq] "\-WF \-FF \-WD" \[rq]
+.\" FB \" XXX: see Savannah ticket reference below
+(default)
+T}
+WF@T{
+set footnotes at full line length,
+even in two-column mode
+.\" XXX: what about multi-column modes more generally?
+T}
+\-WF@T{
+set footnotes using column line length
+T}
+FF@T{
+apply width of first footnote to encountered to subsequent ones
+T}
+\-FF@T{
+footnote width determined by
+.B WF
+and
+.B \-WF
+T}
+WD@T{
+set displays at full line length,
+even in two-column mode
+.\" XXX: what about multi-column modes more generally?
+T}
+\-WD@T{
+set displays using column line length
+T}
+.TE
+.RE
+.\" XXX: See <https://savannah.gnu.org/bugs/?64316>.
+.\"FB@T{
+.\"Break when outputting floating displays.
+.\"T}
+.\"\-FB@T{
+.\"Do not break when outputting floating displays.
+.\"T}
+.
+.
+.TP
+.B WE
+End the writer's address begun with
+.BR WA .
+.
+.
+.br
+.ne 4v
+.\" ====================================================================
+.SH Strings
+.\" ====================================================================
+.
+Many
+.I mm
+strings interpolate predefined,
+localizable text.
+.
+These are presented in quotation marks.
+.
+.
+.TP
+.B App
+\[lq]APPENDIX\[rq]
+.
+.
+.TP
+.B Apptxt
+stores the
+.I title
+argument to the last
+.B APP
+call.
+.
+.
+.TP
+.B BU
+interpolates a bullet
+(see
+.BR BL ).
+.
+.
+.TP
+.B Ci
+is a list of indentation amounts to use for table of contents heading
+levels,
+overriding their automatic computation.
+.
+Each word must be a horizontal measurement
+(like
+.RB \[lq] 1i \[rq])
+and is mapped one-to-one to heading levels 1,
+2,
+and so on.
+.
+.
+.TP
+.B DT
+The date;
+set by the
+.B ND
+macro
+(defaults to the date the document is formatted).
+.
+The format is the conventional one for the
+.I groff
+locale,
+but see the
+.B ISODATE
+macro and
+.B Iso
+register.
+.
+.
+.TP
+.B EM
+interpolates an em dash.
+.
+.
+.TP
+.B F
+interpolates an automatically numbered footnote marker;
+the number is used by the next
+.B FS
+call without an argument.
+.
+In
+.I troff
+mode,
+the marker is superscripted;
+in
+.I nroff
+mode,
+it is surrounded by square brackets.
+.
+.
+.TP
+.B H1txt
+Updated by
+.B .H
+and
+.B .HU
+to the current heading text.
+.
+Also updated in table of contents & friends.
+.
+.
+.TP
+.B HF
+assigns font identifiers,
+separated by spaces,
+to heading levels in one-to-one correspondence.
+.
+Each identifier may be a font mounting position,
+font name,
+or style name.
+.
+Omitted values are assumed to be\~1.
+.
+The default is
+.RB \[lq] "2 2 2 2 2 2 2 2 2 2 2 2 2 2" \[rq],
+which places all headings in italics.
+.
+DWB
+.IR mm 's
+default was
+.RB \[lq] "3 3 2 2 2 2 2" \[rq].
+.
+.
+.TP
+.B HP
+assigns type sizes,
+separated by spaces,
+to heading levels in one-to-one correspondence.
+.
+Each size is interpreted in scaled points;
+zero values are translated to
+.BR 10 .
+.
+Omitted values are assumed to be\~0
+(and are translated accordingly).
+.
+The default is
+.RB \[lq] "0 0 0 0 0 0 0 0 0 0 0 0 0 0" \[rq].
+.
+.
+.TP
+.B Index
+\[lq]INDEX\[rq]
+.
+.
+.TP
+.B Le
+\[lq]LIST OF EQUATIONS\[rq]
+.
+.
+.TP
+.B Letfc
+\[lq]Yours very truly,\[rq]
+(see
+.BR FC )
+.
+.
+.TP
+.B Letapp
+\[lq]APPROVED:\[rq]
+(see
+.BR AV )
+.
+.
+.TP
+.B LetAT
+\[lq]ATTENTION:\[rq]
+(see
+.BR LO )
+.
+.
+.TP
+.B LetCN
+\[lq]CONFIDENTIAL\[rq]
+(see
+.BR LO )
+.
+.
+.TP
+.B Letdate
+\[lq]Date\[rq]
+(see
+.BR AV )
+.
+.
+.TP
+.B Letns
+is a group of strings structuring the notations produced by
+.BR NS .
+.
+If the
+.I code
+argument to
+.B NS
+has no corresponding string,
+the notation is included between parentheses,
+prefixed with
+.BR Letns!copy ,
+and suffixed with
+.BR Letns!to .
+.
+Observe the spaces after \[lq]Copy\[rq] and before \[lq]to\[rq].
+.
+.
+.RS
+.P
+.TS
+tab(@);
+Lb Lb Lb
+L L L.
+NS code@String@Contents
+0@Letns!0@Copy to
+1@Letns!1@Copy (with att.\&) to
+2@Letns!2@Copy (without att.\&) to
+3@Letns!3@Att.
+4@Letns!4@Atts.
+5@Letns!5@Enc.
+6@Letns!6@Encs.
+7@Letns!7@Under separate cover
+8@Letns!8@Letter to
+9@Letns!9@Memorandum to
+10@Letns!10@Copy (with atts.\&) to
+11@Letns!11@Copy (without atts.\&) to
+12@Letns!12@Abstract Only to
+13@Letns!13@Complete Memorandum to
+14@Letns!14@CC
+\[em]@Letns!copy@Copy \fI(with trailing space)\fP
+\[em]@Letns!to@ to \fI(note leading space)\fP
+.TE
+.RE
+.
+.
+.TP
+.B Letnsdef
+Select the notation format used by
+.B NS
+when it is given no argument.
+.
+The default is
+.RB \[lq] 0 \[rq].
+.
+.
+.TP
+.B LetRN
+\[lq]In reference to:\[rq]
+(see
+.BR LO )
+.
+.
+.TP
+.B LetSA
+\[lq]To Whom It May Concern:\[rq]
+(see
+.BR LO )
+.
+.
+.TP
+.B LetSJ
+\[lq]SUBJECT:\[rq]
+(see
+.BR LO )
+.
+.
+.TP
+.B Lf
+\[lq]LIST OF FIGURES\[rq]
+.
+.
+.TP
+.B Licon
+\[lq]CONTENTS\[rq]
+.
+.
+.TP
+.B Liec
+\[lq]Equation\[rq]
+.
+.
+.TP
+.B Liex
+\[lq]Exhibit\[rq]
+.
+.
+.TP
+.B Lifg
+\[lq]Figure\[rq]
+.
+.
+.TP
+.B Litb
+\[lq]TABLE\[rq]
+.
+.
+.TP
+.B Lt
+\[lq]LIST OF TABLES\[rq]
+.
+.
+.TP
+.B Lx
+\[lq]LIST OF EXHIBITS\[rq]
+.
+.
+.TP
+.BR MO1 \|.\|.\|.\| MO12
+\[lq]January\[rq] through \[lq]December\[rq]
+.
+.
+.TP
+.B Qrf
+\[lq]See chapter \[rs]\[rs]*[Qrfh],
+page \[rs]\[rs]n[Qrfp].\[rq]
+.
+.
+.TP
+.B Rf
+interpolates an automatically numbered reference mark;
+the number is used by the next
+.B RS
+call.
+.
+In
+.I troff
+mode,
+the marker is superscripted;
+in
+.I nroff
+mode,
+it is surrounded by square brackets.
+.
+.
+.TP
+.B Rp
+\[lq]REFERENCES\[rq]
+.
+.
+.
+.TP
+.B Sm
+interpolates
+.if c \[u2120] \[u2120],
+the service mark sign.
+.
+.
+.TP
+.B Tcst
+interpolates an indicator of the
+.B TC
+macro's processing status.
+.
+If
+.B TC
+is not operating,
+it is empty.
+.
+User-defined
+.B TP
+or
+.B EOP
+macros might condition page headers or footers on its contents.
+.
+.
+.IP
+.TS
+tab(@);
+lb lb
+l l.
+Value@Meaning
+co@Table of contents
+fg@List of figures
+tb@List of tables
+ec@List of equations
+ex@List of exhibits
+ap@Appendix
+.TE
+.
+.
+.TP
+.B Tm
+interpolates
+.if c \[tm] \[tm],
+the trade mark sign.
+.
+.
+.TP
+.B Verbnm
+supplies argument(s) to the
+.B nm
+request employed by the
+.B VERBON
+macro.
+.
+The default is\~\[lq]1\[rq].
+.
+.
+.br
+.ne 4v
+.\" ====================================================================
+.SH Registers
+.\" ====================================================================
+.
+Default register values,
+where meaningful,
+are shown in parentheses.
+.
+Many are also marked as Boolean-valued,
+meaning that they are considered \[lq]true\[rq]
+(on,
+enabled)
+when they have a positive value,
+and \[lq]false\[rq]
+(off,
+disabled)
+otherwise.
+.
+.
+.TP
+.B .mgm
+indicates that
+.I groff mm
+is in use
+(Boolean-valued;
+.BR 1 ).
+.
+.
+.TP
+.B :p
+is an auto-incrementing footnote counter;
+see
+.BR FS .
+.
+.
+.TP
+.B :R
+is an auto-incrementing reference counter;
+see
+.BR RS .
+.
+.
+.TP
+.B Aph
+formats an appendix heading
+(and title,
+if supplied);
+see
+.B APP
+(Boolean-valued;
+.BR 1 ).
+.
+.
+.TP
+.B Au
+includes supplemental author information
+(the third and subsequent arguments to
+.BR AU )
+in memorandum \[lq]from\[rq] information;
+see
+.B COVER
+and
+.B MT
+(Boolean-valued;
+.BR 1 ).
+.
+.
+.TP
+.B Cl
+sets the threshold for inclusion of headings in a table of contents.
+.
+Headings at levels above this value are excluded;
+see
+.B H
+and
+.B TC
+.RB ( 2 ).
+.
+The
+.B Cl
+register controls whether a heading is
+.I saved
+for output in the table of contents at the time
+.B H
+or
+.B HU
+is called;
+if you change
+.BR Cl 's
+value immediately prior to calling
+.BR TC ,
+you are unlikely to get the result you want.
+.
+.
+.TP
+.B Cp
+suppresses page breaks before lists of captioned
+equations,
+exhibits,
+figures,
+and tables,
+and before an index;
+see
+.BR EC ,
+.BR EX ,
+.BR FG ,
+.BR TB ,
+and
+.B INDP
+(Boolean-valued;
+.\" DWB 3.3's manual said this was 1, but the code said 0.
+.BR 0 ).
+.
+.
+.TP
+.B D
+produces debugging information for the
+.I mm
+package on the standard error stream.
+.
+A value of\~0 outputs nothing;
+1\~reports formatting progress.
+.
+Higher values communicate internal state information of increasing
+verbosity
+.RB ( 0 ).
+.
+.
+.TP
+.B De
+causes a page break after a floating display is output;
+see
+.B DF
+(Boolean-valued;
+.BR 0 ).
+.
+.
+.TP
+.B Df
+configures the behavior of
+.BR DF .
+.
+The following values are recognized;
+4 and 5 do not override the
+.B De
+register
+.RB ( 5 ).
+.
+.
+.IP
+.TS
+tab(@);
+Lb Lb
+L Lx.
+Value@Effect
+0@T{
+Flush pending displays
+at the end of each section
+when section-page numbering is active,
+otherwise at the end of the document.
+T}
+1@T{
+Flush a pending display
+on the current page or column
+if there is enough space,
+otherwise at the end of the document.
+T}
+2@T{
+Flush one pending display
+at the top of each page or column.
+T}
+3@T{
+Flush a pending display
+on the current page or column
+if there is enough space,
+otherwise at the top of the next.
+T}
+4@T{
+Flush as many pending displays
+as possible in a new page or column.
+T}
+5@T{
+Fill columns or pages with flushed displays
+until none remain.
+T}
+.TE
+.
+.
+.TP
+.B Ds
+puts vertical space in the amount of register
+.B Dsp
+(if defined) or
+.B Lsp
+before and after each static display;
+see
+.B DS
+(Boolean-valued;
+.BR 1 ).
+.
+.
+.TP
+.B Dsp
+configures the amount of vertical space placed
+before and after static displays;
+see
+.B DS
+and register
+.B Ds
+.RI ( undefined ).
+.
+.
+.TP
+.B Ec
+is an auto-incrementing equation counter;
+see
+.BR EC .
+.
+.
+.TP
+.B Ej
+sets the threshold for page breaks (ejection) prior to the format of
+headings.
+.
+Headings at levels above this value are set on the same page and column
+if possible;
+see
+.B H
+.RB ( 0 ).
+.
+.
+.TP
+.B Eq
+aligns an equation label to the left of a display instead of the right
+(Boolean-valued;
+.BR 0 ).
+.
+.
+.TP
+.B Ex
+is an auto-incrementing exhibit counter;
+see
+.BR EX .
+.
+.
+.TP
+.B Fg
+is an auto-incrementing figure counter;
+see
+.BR FG .
+.
+.
+.TP
+.B Fs
+is multiplied by register
+.B Lsp
+to vertically separate footnotes;
+see
+.B FS
+.RB ( 1 ).
+.
+.
+.TP
+.BR H1 \|.\|.\|.\| H14
+are auto-incrementing counters corresponding to each heading level;
+see
+.BR H .
+.
+.
+.\" XXX: This could be generalized to an "Hdot" threshold register with
+.\" a default of 2.
+.TP
+.B H1dot
+appends a period to the number of a level one heading;
+see
+.B H
+(Boolean-valued;
+.BR 1 ).
+.
+.
+.\" XXX: This may be insufficiently general; see Savannah #62825.
+.TP
+.B H1h
+is a copy of
+A copy of register
+.RB register\~ H1 ,
+but it is incremented just before a page break.
+.
+This can be useful in user-defined macros;
+see
+.B H
+and
+.BR HX .
+.
+.
+.TP
+.B Hb
+sets the threshold for breaking the line after formatting a heading.
+.
+Text after headings at levels above this value are set on the same
+output line if possible;
+see
+.B H
+.RB ( 2 ).
+.
+.
+.TP
+.B Hc
+sets the threshold for centering a heading.
+.
+Headings at levels above this value use the prevailing alignment
+(that is,
+they are not centered);
+see
+.B H
+.RB ( 0 ).
+.
+.
+.TP
+.B Hi
+configures the indentation of text after headings.
+.
+It does not affect \[lq]run-in\[rq] headings.
+.
+The following values are recognized;
+see
+.B H
+and
+.B P
+.RB ( 1 ).
+.
+.
+.IP
+.TS
+tab(@);
+Lb Lb
+L Lx.
+Value@Effect
+0@no indentation
+1@indent per the paragraph type
+2@indent to align with heading title
+.TE
+.
+.
+.TP
+.B Hps
+sets the heading level threshold for application of preceding vertical
+space;
+see
+.BR H .
+.
+Headings at levels above the value in register
+.B Hps
+use the amount of space in register
+.BR Hps1 ;
+otherwise that in
+.BR Hps2 .
+.
+The value of
+.B Hps
+should be strictly greater than that of
+.B Ej
+.RB ( 1 ).
+.
+.
+.TP
+.B Hps1
+configures the amount of vertical space preceding a heading above the
+.B Hps
+threshold;
+see
+.B H
+.RI ( troff
+devices:
+.BR 0.5v ;
+.I nroff
+devices:
+.BR 1v ).
+.
+.
+.TP
+.B Hps2
+configures the amount of vertical space preceding a heading at or below
+the
+.B Hps
+threshold;
+see
+.B H
+.RI ( troff
+devices:
+.BR 1v ;
+.I nroff
+devices:
+.BR 2v ).
+.
+.
+.TP
+.B Hs
+sets the heading level threshold for application of succeeding vertical
+space.
+.
+If the heading level is greater than
+.BR Hs ,
+the heading is followed by vertical space in the amount of
+.RB register\~ Hss ;
+see
+.B H
+.RB ( 2 ).
+.
+.
+.TP
+.B Hss
+is multiplied by register
+.B Lsp
+to produce vertical space after headings above the
+threshold in
+.RB register\~ Hs ;
+see
+.B H
+.RB ( 1 ).
+.
+.
+.TP
+.B Ht
+suppresses output of heading level counters above the lowest when the
+heading is formatted;
+see
+.B H
+(Boolean-valued;
+.BR 0 ).
+.
+.
+.
+.TP
+.B Hu
+sets the heading level used by unnumbered headings;
+see
+.B HU
+.RB ( 2 ).
+.
+.
+.TP
+.B Hy
+enables automatic hyphenation of words
+(Boolean-valued;
+.BR 0 ).
+.
+.
+.TP
+.B Iso
+configures the use of ISO\~8601 date format
+if specified
+(with any value)
+on the command line;
+see
+.BR ISODATE .
+.
+The default is determined by localization files.
+.
+.
+.TP
+.B L
+defines the page length for the document,
+and must be set from the command line.
+.
+A scaling unit should be appended.
+.
+The default is that of the selected
+.I groff
+output device.
+.
+.
+.TP
+.B Le
+.TQ
+.B Lf
+.TQ
+.B Lt
+.TQ
+.B Lx
+configure the report of lists of equation,
+figure,
+table,
+and exhibit captions,
+respectively,
+after a table of contents;
+see
+.B TC
+(Boolean-valued;
+.BR Le :\~ 0 ;
+.BR Lf ,
+.BR Lt ,
+.BR Lx :\~ 1 ).
+.
+.
+.\" XXX: What is the rationale for this feature?
+.TP
+.B Letwam
+sets the maximum number of input lines permitted in a writer's address;
+see
+.B WA
+and
+.B WE
+.RB ( 14 ).
+.
+.
+.TP
+.B Li
+configures the amount of indentation in ens applied to list items;
+see
+.B LI
+.RB ( 6 ).
+.
+.
+.TP
+.B Limsp
+inserts a space between the prefix and the mark
+in automatically numbered lists;
+see
+.B AL
+(Boolean-valued;
+.BR 1 ).
+.
+.
+.TP
+.B Ls
+sets a threshold for placement of vertical space before list items.
+.
+If the list nesting level is greater than this value,
+no such spacing occurs;
+see
+.B LI
+.RB ( 99 ).
+.
+.
+.TP
+.B Lsp
+configures the base amount of vertical space used for separation
+in the document.
+.
+.I mm
+applies this spacing to many contexts,
+sometimes with multipliers;
+see
+.BR DS ,
+.BR FS ,
+.BR H ,
+.BR LI ,
+and
+.B P
+.RI ( troff
+devices:
+.BR 0.5v ;
+.I nroff
+devices:
+.BR 1v ).
+.
+.
+.TP
+.B N
+configures the header and footer placements used by
+.BR PH .
+.
+The default footer is empty.
+.
+If \[lq]section-page\[rq] numbering is selected,
+the default header becomes empty
+and the default footer becomes
+.RI \[lq] x - y \[rq],
+where
+.IR x \~is
+is the section number
+(the number of the current first-level heading)
+.RI and\~ y
+the page number within the section.
+.\" XXX: section-figure numbering needs more documentation.
+.
+The following values are recognized;
+for finer control,
+see
+.BR PH ,
+.BR PF ,
+.BR EH ,
+.BR EF ,
+.BR OH ,
+and
+.BR OF ,
+and registers
+.B Sectf
+and
+.BR Sectp .
+.
+Value 5 is a GNU extension
+.RB ( 0 ).
+.
+.
+.IP
+.TS
+tab(@);
+Lb Lb
+L Lx.
+Value@Effect
+0@Set header on all pages.
+1@Move header to footer on page 1.
+2@Omit header on page 1.
+3@Use \[lq]section-page\[rq] numbering style on all pages.
+4@Omit header on all pages.
+5@T{
+Use \[lq]section-page\[rq] and \[lq]section-figure\[rq] \
+numbering style on all pages.
+T}
+.TE
+.
+.
+.TP
+.B Np
+causes paragraphs after first-level headings (only) to be numbered
+in the format
+.IR s . p ,
+where
+.IR s \~is
+is the section number
+(the number of the current first-level heading)
+and
+.IR p \~is
+the paragraph number,
+starting at 1;
+see
+.B H
+and
+.B P
+(Boolean-valued;
+.BR 0 ).
+.
+.
+.TP
+.B O
+defines the page offset of the document,
+and must be set from the command line.
+.
+A scaling unit should be appended.
+.
+The default
+.RB is\~ \&.75i
+on terminal devices.
+.
+On typesetters,
+it is
+.B \&.963i
+or set to
+.B 1i
+by the
+.I papersize.tmac
+package;
+see
+.MR groff_tmac @MAN5EXT@ .
+.
+.
+.TP
+.B Oc
+suppresses the appearance of page numbers in the table of contents;
+see
+.B TC
+(Boolean-valued;
+.BR 0 ).
+.
+.
+.\" XXX: This really should just be a string, shouldn't it?
+.TP
+.B Of
+selects a separator format within equation,
+exhibit,
+figure,
+and table captions;
+see
+.BR EC ,
+.BR EX ,
+.BR FG ,
+and
+.BR TB .
+.
+The following values are recognized;
+the spaces shown are unpaddable
+.RB ( 0 ).
+.
+.
+.IP
+.TS
+tab(@);
+Lb Lb
+L Lx.
+Value@Effect
+0@\[dq]. \[dq]
+1@\[dq] \[em] \[dq]
+.TE
+.
+.
+.TP
+.B P
+interpolates the current page number;
+it is the same as
+.RB register\~ %
+except when
+\[lq]section-page\[rq] numbering is enabled.
+.
+.
+.TP
+.B Pi
+configures the amount of indentation in ens applied to the first line of
+a paragraph;
+see
+.B P
+.RB ( 5 ).
+.
+.
+.TP
+.B Pgps
+causes the type size and vertical spacing set by
+.B S
+to apply to headers and footers,
+overriding the
+.B HP
+string.
+.
+If not set,
+.B S
+calls affect headers and footers only when followed by
+.BR PH ,
+.BR PF ,
+.BR OH ,
+.BR EH ,
+.BR OF ,
+or
+.B OE
+calls
+(Boolean-valued;
+.BR 1 ).
+.
+.
+.TP
+.B Ps
+is multiplied by register
+.B Lsp
+to vertically separate paragraphs;
+see
+.B P
+.RB ( 1 ).
+.
+.
+.TP
+.B Pt
+determines when a first-line indentation is applied to a paragraph;
+see
+.B P
+.RB ( 0 ).
+.
+.
+.IP
+.TS
+tab(@);
+Lb Lb
+L Lx.
+Value@Effect
+0@never
+1@always
+2@T{
+always,
+except immediately after
+.BR H ,
+.BR DE ,
+or
+.B LE
+T}
+.TE
+.
+.
+.TP
+.B Ref
+is used internally to control
+.MR mmroff 1 's
+two-pass approach to index and reference management;
+see
+.B INITI
+and
+.B RS
+(Boolean-valued;
+.BR 0 ).
+.
+.
+.\" XXX: Why is this not named `Rpej`?
+.TP
+.B Rpe
+configures the default page ejection policy for reference pages;
+see
+.B RP
+.RB ( 0 ).
+.
+.
+.IP
+.TS
+tab(@);
+Lb Lb
+L Lx.
+Value@Effect
+0@Break the page before and after the list of references.
+1@Suppress page break after the list.
+2@Suppress page break before the list.
+3@Suppress page breaks before and after the list.
+.TE
+.
+.
+.TP
+.B S
+defines the type size for the document,
+and must be set from the command line.
+.
+A scaling unit should be appended;
+.B p
+is typical
+.RB ( 10p ).
+.
+.
+.TP
+.B Sectf
+selects the \[lq]section-figure\[rq] numbering style.
+.
+Its default
+.RB is\~ 0
+unless
+.RB register\~ N
+is set
+.RB to\~ 5
+at the command line
+(Boolean-valued).
+.
+.
+.TP
+.B Sectp
+selects the \[lq]section-page\[rq] numbering style.
+.
+Its default
+.RB is\~ 0
+unless
+.RB register\~ N
+is set
+.RB to\~ 3
+.RB or\~ 5
+at the command line
+(Boolean-valued).
+.
+.
+.TP
+.B Si
+configures the amount of display indentation in ens;
+see
+.B DS
+.RB ( 5 ).
+.
+.
+.TP
+.B Tb
+is an auto-incrementing table counter;
+see
+.BR TB .
+.
+.
+.TP
+.B V
+defines the vertical spacing for the document,
+and must be set from the command line.
+.
+A scaling unit should be appended;
+.B p
+is typical.
+.
+The default vertical spacing is 120% of the type size.
+.
+.
+.TP
+.B Verbin
+configures the amount of indentation for verbatim displays
+when indentation is selected;
+see
+.B \%VERBON
+.RB ( 5n ).
+.
+.
+.TP
+.B W
+defines the \[lq]width\[rq]
+of the document
+(that is,
+the length of an output line with no indentation);
+it must be set from the command line.
+.
+A scaling unit should be appended.
+.
+The default
+.RB is\~ 6i
+or assigned by the
+.I papersize.tmac
+package;
+see
+.MR groff_tmac @MAN5EXT@ .
+.
+.
+.
+.\" ====================================================================
+.SH Internals
+.\" ====================================================================
+.
+The
+.B LT
+letter macros call further macros depending on the letter type,
+with which they are suffixed.
+.
+It is therefore possible to define additional letter types,
+either in the territory-specific macro file,
+or as local additions.
+.
+.B LT
+sets the registers
+.B Pt
+and
+.B Pi
+to 0 and\~5, \" XXX: ...but doesn't use Pi for indentation...
+respectively.
+.\" XXX: and why aren't both of these actions the responsibility of
+.\" let@init_type as described below?
+.
+The following macros must be defined to support a new letter type.
+.
+.
+.TP
+.BI let@init_ type
+.B LT
+calls this macro to initialize any registers and other data needed by
+the letter type.
+.
+.
+.TP
+.BI let@head_ type
+formats the letterhead;
+it is called instead of the usual page header macro.
+.
+Its definition should remove the alias
+.B let@header
+unless the letterhead is desired on subsequent pages.
+.
+.
+.TP
+.BI let@sg_ type\~\c
+.IR "name title n is-final\~" [ SG-arg\~ .\|.\|.]
+.B SG
+calls this macro only for letters;
+.B MT
+memoranda have their own signature processing.
+.
+.I name
+and
+.I title
+are specified through
+.BR WA / WE .
+.
+.IR n \~is
+the index of the
+.IR n th
+writer,
+and
+.I is-final
+is true for the last writer to be listed.
+.
+Further
+.B SG
+arguments are appended to the signature line.
+.
+.
+.TP
+.BI let@fc_ "type closing"
+This macro is called by
+.BR FC ,
+and has the formal closing as the argument.
+.
+.
+.P
+.B LO
+implements letter options.
+.
+It requires that a string named
+.BI Let type
+be defined,
+where
+.I type
+is the letter type.
+.
+.B LO
+then assigns its second argument
+.RI ( value )
+to the string
+.BI let*lo\- type\c
+\&.
+.
+.
+.\" ====================================================================
+.\".SH BUGS
+.\" ====================================================================
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @MACRODIR@/@TMAC_M_PREFIX@m.tmac
+is the
+.I groff
+implementation of the memorandum macros.
+.
+.
+.TP
+.I @MACRODIR@/mm.tmac
+is wrapper to load
+.IR m.tmac .
+.
+.
+.TP
+.I @MACRODIR@/refer\-mm.tmac
+implements
+.MR @g@refer @MAN1EXT@
+support for
+.IR mm .
+.
+.
+.TP
+.I @TMAC_MDIR@/ms.cov
+implements an
+.IR ms -like
+cover sheet.
+.
+.
+.TP
+.I @TMAC_MDIR@/0.MT
+implements memorandum types 0\[en]3 and 6.
+.
+.
+.TP
+.I @TMAC_MDIR@/4.MT
+implements memorandum type 4.
+.
+.
+.TP
+.I @TMAC_MDIR@/5.MT
+implements memorandum type 5.
+.
+.
+.TP
+.I @TMAC_MDIR@/locale
+performs any (further) desired necessary localization;
+empty by default.
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+The GNU version of the
+.I mm
+macro package was written by
+.MT jh@\:axis\:.se
+J\[:o]rgen H\[:a]gg
+.ME
+of Lund, Sweden.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.UR https://tkurtbond\:.github\:.io/\:troff/\:mm\-all\:.pdf
+.I MM \- A Macro Package for Generating Documents
+.UE ,
+the DWB\~3.3
+.I mm
+manual,
+introduces the package but does not document GNU extensions.
+.
+.
+.P
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is the primary
+.I groff
+manual.
+.
+You can browse it interactively with \[lq]info groff\[rq].
+.
+.
+.P
+.MR groff @MAN1EXT@ ,
+.MR @g@troff @MAN1EXT@ ,
+.MR @g@tbl @MAN1EXT@ ,
+.MR @g@pic @MAN1EXT@ ,
+.MR @g@eqn @MAN1EXT@ ,
+.MR @g@refer @MAN1EXT@ ,
+.MR groff_mmse @MAN7EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_mm_7_man_C]
+.do rr *groff_groff_mm_7_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/mm/groff_mmse.7.man b/contrib/mm/groff_mmse.7.man
new file mode 100644
index 0000000..6ba94eb
--- /dev/null
+++ b/contrib/mm/groff_mmse.7.man
@@ -0,0 +1,183 @@
+.TH groff_mmse @MAN7EXT@ "@MDATE@" "groff @VERSION@"
+.SH Namn
+groff_mmse \- svenska \(rqmemorandum\(rq makro f\(:or GNU
+.I roff
+.
+.
+.\" Skrivet av Jörgen Hägg, Lund, Sverige
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2020 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_mmse_7_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Syntax
+.\" ====================================================================
+.
+.SY "groff \-m@TMAC_M_PREFIX@mse"
+.RI [ flaggor\~ .\|.\|.\&]
+.RI [ filer\~ .\|.\|.]
+.
+.SY "groff \-m m@TMAC_M_PREFIX@mse"
+.RI [ flaggor\~ .\|.\|.\&]
+.RI [ filer\~ .\|.\|.]
+.YS
+.
+.
+.\" ====================================================================
+.SH Beskrivning
+.\" ====================================================================
+.
+.I m@TMAC_M_PREFIX@mse
+är en svensk variant av
+.IR m@TMAC_M_PREFIX@m .
+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
+.B COVER
+kan använda
+.I se_ms
+som argument.
+Detta ger ett svenskt försättsblad.
+Se
+.MR groff_mm @MAN7EXT@
+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
+.BI ".LO DNAMN\ " namn
+Anger dokumentets namn.
+.
+.TP
+.BI ".LO MDAT\ " datum
+Mottagarens datum, anges under
+.B Ert datum:
+.RB ( LetMDAT ).
+.
+.TP
+.BI ".LO BIL\ " sträng
+Anger bilaga, nummer eller sträng med
+.B Bilaga
+.RB ( LetBIL )
+som prefix.
+.
+.TP
+.BI ".LO KOMP\ " text
+Anger kompletteringsuppgift.
+.
+.TP
+.BI ".LO DBET\ " beteckning
+Anger dokumentbeteckning eller dokumentnummer.
+.
+.TP
+.BI ".LO BET\ " beteckning
+Anger beteckning
+(ärendebeteckning i form av diarienummer eller liknande).
+.
+.TP
+.BI ".LO SIDOR\ " antal
+Anger totala antalet sidor och skrivs ut efter sidnumret inom
+parenteser.
+.
+.LP
+Om makrot
+.B .TP
+ä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 <Jorgen.Hagg@axis.se>
+.
+.
+.\" ====================================================================
+.SH Filer
+.\" ====================================================================
+.
+.TP
+.I @MACRODIR@/@TMAC_M_PREFIX@mse.tmac
+.TP
+.IR @TMAC_MDIR@/se_ * .cov
+.
+.
+.\" ====================================================================
+.SH "Se också"
+.\" ====================================================================
+.
+.MR groff_mm @MAN7EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_mmse_7_man_C]
+.do rr *groff_groff_mmse_7_man_C
+.
+.
+.\" Local Variables:
+.\" coding: latin-1
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/mm/m.tmac b/contrib/mm/m.tmac
new file mode 100644
index 0000000..c679a70
--- /dev/null
+++ b/contrib/mm/m.tmac
@@ -0,0 +1,3734 @@
+.ig
+
+Copyright (C) 1991-2023 Free Software Foundation, Inc.
+mm is written by Jörgen Hägg <jh@axis.com>
+
+mm 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 3 of the License, or
+(at your option) any later version.
+
+mm is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Please submit bug reports using groff's 'BUG-REPORT' file to
+http://savannah.gnu.org/bugs/?group=groff.
+
+Naming convention adapted from groff ms.
+Local names module*name
+Extern names module@name
+Env.var environ:name
+Index array!index
+..
+.if !\n(.g \
+. ab groff mm macros require groff extensions; aborting
+.
+.if \n(.C \
+. ab groff mm macros do not work in compatibility mode; aborting
+.
+.ds @mm m.tmac\"
+.
+.if (\n[.x]\n[.y] < 123) \{\
+. ds mm-msg \*[@mm]: groff mm macros require groff 1.23 or later,\"
+. as mm-msg " but found groff \n[.x].\n[.y]; aborting\"
+. ab \*[mm-msg]
+.\}
+.
+.if d PH .nx
+.
+.mso devtag.tmac
+.\" ######## init #######
+.\" create table of contents entry for headings of 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 before headings of level <= Ej
+.nr Ej 0
+.\" Equation label adjust 0=left, 1=right
+.nr Eq 0
+.\" Bullet string (for .BL)
+.ie n .ds BU \[bu]
+.el .ds BU \s-2\[bu]\s0
+.\" 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
+.\" break after headings of level <= Hb
+.nr Hb 2
+.\" center headings of level <= Hc
+.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
+.\" put vertical space of \n[Hss] after headings of level <= Hs
+.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 indentation in ens, used by .AL
+.nr Li 6
+.\" put vertical space before list items of nesting level <= Ls
+.nr Ls 99 \" TODO: use \n[.R]; see Savannah #63587
+.\" 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 indentation in ens
+.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
+.\" Reference page eject status
+.nr Rpe 0
+.\" display indentation in ens
+.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
+.\"
+.ie t .ds Sm \v'-.4m'\s-3SM\s0\v'.4m'\"
+.el \{\
+. ie c \[u2120] .ds Sm \[u2120]\"
+. el .ds Sm (SM)\"
+.\}
+.
+.ie t .ds Tm \v'-.4m'\s-3TM\s0\v'.4m'\"
+.el \{\
+. ie c \[tm] .ds Tm \[tm]\"
+. el .ds Tm (TM)\"
+.\}
+.\"
+.\"---------------------------------------------
+.\" Internal global variables
+.\"
+.\" This is for cover macro .MT
+.\" .ds @country
+.\"
+.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
+.\}
+.\"
+.\" Set the type size and vertical spacing. If given on the command
+.\" line, these have already been converted to basic units.
+.if !r S .nr S 10
+.ie (\n[S] >= 1000) .ps \n[S]z/1000u
+.el .ps \n[S]
+.nr *vs-default \n[.ps]*120/100
+.if !r V .nr V \n[*vs-default]
+.ie (\n[V] >= 1000) .vs \n[V]p/1000u
+.el .vs \n[V]
+.rm *vs-default
+.\"
+.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 \{\
+. pl \n[L]u
+.\}
+.nr @pl \n[.p]
+.\"
+.\" line length
+.ie r W \{\
+. 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
+.\"
+.\" put vertical space of \n[Hps2] before headings of level <= Hps
+.nr Hps 1
+.\"
+.\" amount of vertical space before headings when level > Hps
+.nr Hps1 0.5v
+.if n .nr Hps1 1v
+.\"
+.\" amount of vertical space before headings 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 @country .msoquiet mm/\*[@country]_locale
+.el .msoquiet mm/locale
+.\"---------------------------------------------
+.\" ####### module init ######
+.\" reset all things
+.\" XXX: Resets .cu and .ul but _not_ .ce or .rj.
+.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 \\*[@mm]:\\n[.F]:\\n[.c]: warning: \\$*
+.if \\n[D] .backtrace
+..
+.\" All errors are fatal.
+.de @error
+.tm \\*[@mm]:\\n[.F]:\\n[.c]: error: \\$*
+.if \\n[D] .backtrace
+.ab
+..
+.
+.de @abort
+.tm \\*[@mm]:\\n[.F]:\\n[.c]: internal error: \\$*
+.backtrace
+.ab
+..
+.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*indentation-eligible 1 \" indent following P if Pt=2
+.nr par@suppress-indentation 0
+.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
+.if \\n[.$] \{\
+. ie !\B'\\$1' \{\
+. @warning \\$0: expected numeric argument, got '\\$1'
+. shift
+. \}
+. el .if (\\$1 > 1) \
+. @warning \\$0: ignoring unsupported paragraph type \
+'\\$1'
+.\}
+.\" 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]
+.\}
+.nr par*indentation-eligible 1-\\n[par@suppress-indentation]
+.par@doit \\$*
+.if \\n[Np] \\n[H1].\\n+[par*number]\ \ \c
+..
+.\"------------
+.de nP
+.if \\n[D]>2 \{\
+. tm Paragraph nl=\\n[nl], last=\\n[hd*last-pos]
+. tm Paragraph .k=\\n[.k], hsize=\\n[hd*last-hsize]
+.\}
+.\" A first-line indentation is meaningless for a numbered paragraph.
+.nr par*indentation-eligible 0
+.par@doit
+\\n[H2].\\n+[par*number2]\ \ \c
+..
+.\"------------
+.de par@doit
+.SP (u;\\n[Ps]*\\n[Lsp])
+.nr par*do-indent 0
+.ie \\n[.$] \{\
+. if \\$1=1 .nr par*do-indent 1
+.\}
+.el \{\
+. if \\n[Pt]=1 .nr par*do-indent 1
+. if (\\n[Pt]=2)&\\n[par*indentation-eligible] \
+. nr par*do-indent 1
+.\}
+.if \\n[par*do-indent] .ti +\\n[Pi]n
+.rr par*do-indent
+.nr par@suppress-indentation 0
+..
+.\" ####### 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 ###############
+.\" XXX: This register value is meaningless.
+.\" .ad b
+.\" .nr misc@adjust \n[.j]
+.\" might be better...
+.nr misc@adjust 14
+.de SA
+.if \\n[.$] \{\
+. if ((\\$1 < 0) : (\\$1 > 1)) .@error \\$0: invalid argument \
+'\\$1'
+.\" XXX: ...then...
+.\" .ad l
+.\" .nr misc@adjust \\n[.j]
+. nr misc@adjust 0\\$1
+.\}
+.\" XXX: ...and finally an unconditional.
+.\" .ad \\n[.j]
+.ie \\n[misc@adjust] 'ad
+.el 'na
+..
+.\"-------------
+.\" switch environment, keep all important settings.
+.de misc@ev-keep
+.nr misc*ll \\n[.l]
+.ds misc*fam \\n[.fam]
+.ev \\$1
+.ll \\n[misc*ll]u
+.lt \\n[misc*ll]u
+.fam \\*[misc*fam]
+..
+.\"-------------
+.\" .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 .@abort 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 0\\*[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[.$] \{\
+. @warning \\$0: ignoring; no arguments specified
+. return
+.\}
+.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[.$] \{\
+. @warning \\$0: ignoring; no arguments specified
+. return
+.\}
+.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
+.if !''\\$3' \{\
+. di misc*rd2
+. ds \\$3 "\\*[misc*rd]
+. br
+. di
+.\}
+.if !''\\$2' .rn misc*rd \\$2
+.rm misc*rd misc*rd2
+..
+.\"------------
+.\" VERBON [flag [type-size [font]]]
+.\" flag
+.\" bit function
+.\" 0 escape character disablement
+.\" 1 add an empty line before verbose text
+.\" 2 add an empty line after verbose text
+.\" 3 number output lines using Verbnm string for .nm args
+.\" 4 indent text by amount in register 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
+..
+.\" Wrapper to cancel the side effect of .tag + .br generating
+.\" unwanted vertical space.
+.de misc@tag
+.\" This macro is currently used solely to give information to the
+.\" HTML postprocessor. If for PostScript or PDF output macro .H
+.\" had been followed by .DS both .H post-space and .DS pre-space
+.\" had been output because of this macro. So it is now enabled
+.\" only when postprocessor tags are required.
+.if '\*[.T]'html' \{\
+.\" retain temporary indentation and horizontal position
+.if !(\\n[.in]-\\n[.i]=0) .nr misc*ti \\n[.in]
+.nr misc*.k \\n[.k]
+.vpt 0
+.DEVTAG-\\$1 \\$2
+.br
+.if r misc*ti \{\
+. ti \\n[misc*ti]u
+. rr misc*ti
+. sp -1
+.\}
+.sp -1
+\h'\\n[misc*.k]u'\c
+.rr misc*.k
+.vpt 1
+.\}
+..
+.\" ######## 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 \{\
+. if !\B'\\$1' .@error \\$0: width parameter is not \
+numeric; got '\\$1'
+. nr pict*width (i;\\$1)
+. shift
+. \}
+. if \\n[.$]>0 \{\
+. if !\B'\\$1' .@error \\$0: height parameter is not \
+numeric; got '\\$1'
+. 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 pspic.tmac.
+. \" 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 align
+.de EPIC
+.nr pict*adj 0 \" centered
+.if '\\$1'-L' \{\
+. shift
+. nr pict*adj 1
+.\}
+.if \\n[.$]<2 \{\
+. @warning \\$0: ignoring; expected width and height arguments
+. return
+.\}
+.\" Permit a document to start with EPIC.
+.if \\n[nl]<0 \&
+.ie \B'\\$1' .nr pict*w \\$1
+.el .@error \\$0: width parameter is not numeric; got '\\$1'
+.ie \B'\\$2' .nr pict*h \\$2
+.el .@error \\$0: height parameter is not numeric; got '\\$2'
+.\" XXX: This is kind of lame. It's also not localized.
+.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 @disable
+.ds @end \" empty
+.while \\n[.$] \{\
+. rm \\$1 \" in case it's aliased
+. de \\$1 @end
+. @warning \\$1: ignoring; unavailable after \\*[@cover]
+. @end
+. shift
+.\}
+..
+.rm @end
+.
+.de CS
+.@warning \\$0: not implemented except with ".MT 4"
+..
+.de OK
+.@warning \\$0: not implemented
+..
+.de PM
+.@warning \\$0: 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 variable index name val1 val2 ...
+.de hd@split
+.\" TODO: Verify that this isn't reachable due to ordinary user error;
+.\" if it is, make it an @error.
+.if \\$2>(\\n[.$]-3) .@abort \\$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
+.\"
+.\" Break page before headings of level <= Ej.
+.if ((\\n[hd*level]<=\\n[Ej])&(\\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]
+.\"
+.ds hd@mark-trimmed \\*[hd*mark]\" mark without spaces, for references
+.as hd*mark \ \ \" add spaces between heading mark and title
+.if !\\n[hd*arg1] .ds hd*mark \" empty; no mark for unnumbered heading
+.\"
+.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 \" empty
+.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 \" do not adjust heading if not 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 \" space needed for a heading
+.\"
+.\" 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"
+.\" HTML: mark beginning of heading
+.misc@tag NH \\n[hd*level]
+.\"--------------------------------------
+.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])
+.ie \\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@suppress-indentation 1
+.\}
+.\" We're setting a run-in heading; the next paragraph is normal.
+.el .nr par@suppress-indentation 0
+.\"
+.\" 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]
+.\" HTML: end of heading
+.misc@tag EO-H
+..
+.\"--------
+.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 ''- \\n[P] -''
+.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 }b pg*footer
+.als }f pg*even-footer
+.als }p pg*odd-footer
+.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.])
+. if (u;(\\n[pg*header-size] + \\n[pg*extra-header-size] \
+ + \\n[pg*footer-size] + \\n[pg*extra-footer-size] \
+ + \\n[.V]) >= \\n[.p]) \{\
+. pl \\n[nl]u
+. @error insufficient page length; aborting
+. \}
+.\}
+.\" check if Hy has been changed
+.ie \\n[Hy] 'hy 14
+.el 'nh
+.if \\n[Idxf] \{\
+.tl '<pagenr\ \\n[%]>'''
+.\}
+.\" 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
+. ds hd*format \\g[P]
+. af P 0
+. ie ((\\n[P]=1)&((\\n[N]=1):(\\n[N]=2))) .sp
+. el .tl \\*[pg*header]
+. af P \\*[hd*format]
+. 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 occurred
+.\}
+..
+.\"---------------------------------------------------------
+.\" 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
+.vpt 0
+.\" user defined end-of-page macro
+.ie d EOP .EOP
+.el \{\
+. ie o .tl \\*[pg*odd-footer]
+. el .tl \\*[pg*even-footer]
+. ds hd*format \\g[P]
+. af P 0
+. ie (\\n[P]=1)&(\\n[N]=1) .tl \\*[pg*header]
+. el .tl \\*[pg*footer]
+. af P \\*[hd*format]
+. tl ''\\*[Pg_type!\\n[@copy_type]]''
+.\}
+.vpt 1
+.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
+.if \\n[pg*cols-per-page]<=1 \{\
+. @warning \\$0: multicolumn mode not active
+. return
+.\}
+.br
+.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 \\$0: returning to single-column \
+layout with suppressed page break and footnote pending; output may be \
+messy
+. \}
+. \}
+. if \\n[pg*last-ncol]>0 \{\
+. sp |\\n[pg*last-ncol]u
+. nr pg*last-ncol 0
+. \}
+.\}
+..
+.de 2C
+.if \\n[pg*cols-per-page]>1 .@error \\$0: multicolumn mode already \
+active
+.br
+.nr pg*head-mark \\n[nl]u
+.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
+.if \\n[pg*cols-per-page]>1 .@error \\$0: multicolumn mode already \
+active
+.br
+.nr pg*head-mark \\n[nl]u
+.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 \" temporarily invalid!
+.nr pg*i \\n[pg*column-size]
+.while \\n[pg*i]<=\\n[.l] \{\
+. nr pg*cols-per-page +1
+. nr pg*i \\n[pg*i]+\\n[pg*column-sep]+\\n[pg*column-size]
+.\}
+.if \\n[pg*cols-per-page]<0 .@abort \\n[pg*cols-per-page] columns in \
+page
+.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 6
+.di pg*mul-div
+.MULN
+..
+.\"-----------
+.de MULN
+.if \\n[pg*mul-x]>=\\n[pg*mul-max-col] .@abort undefined column width \
+(pg*mul-x=\\n[pg*mul-x >= pg*mul-max-col=\\n[pg*mul-max])
+.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
+.aln :p ft*nr
+.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.
+.\"
+.ie t .ds F \v'-.4m'\s-3\\n+[ft*nr]\s0\v'.4m'
+.el .ds F [\\n+[ft*nr]]
+.\"
+.\"-----------------
+.\" 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 6
+.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 \\$0: expected 1 or 2 arguments, got \\n[.$]
+.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)*6
+. 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 \\$0: cannot nest; 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 \\$0: footnote bigger than page area
+.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 \\$0: cannot nest floating keeps; use DS \
+within DF/DE
+.ds ds@macro \\$0
+.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@suppress-indentation 1 \" no indentation after displays
+.\" 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 .@abort invalid float type: 5 < Df (\\n[Df])
+.if !\\n[ds*float-busy] \{\
+. nr ds*float-busy 1
+.\" at .DE
+. if \\n[D]>3 \{\
+. tmc print-float: .t=\\n[.t]
+. if r df*height!\\n[df*o-fnr] \
+. tmc , h=\\n[df*height!\\n[df*o-fnr]]
+. tm
+. \}
+. \" 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@macro]: unrecognized 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
+.if \\n[.$]>1 \{\
+. ie r ds*fill!\\$2 .nr ds*fill \\n[ds*fill!\\$2]
+. el .@error \\*[ds@macro]: unrecognized fill style '\\$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
+.ds ds@macro \\$0
+.br
+.nr ds*lvl +1
+.ds@set-format \\$@
+.\"
+.nr ds*old-ll \\n[.l]
+.nr ds*old-in \\n[.i]
+.misc@push ds-in \\n[ds*old-in] \" Saving indent and line length of
+.misc@push ds-ll \\n[ds*old-ll] \" the text outside the display.
+.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]
+.\"
+.nr ds*div-ll \\n[ds*old-ll]
+.if \\n[ds*format]=1 .nr ds*div-ll -\\n[Si]n
+.ds@set-new-ev \\n[ds*div-ll]
+.nr df*float 0
+..
+.\"--------------------------------------------
+.de ds@end
+.\" We hard-code the DE macro name here since this macro is internal but
+.\" only DE calls it. We also know we're closing a static keep because
+.\" df@end is called otherwise. See `DE`.
+.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 \" Restore indent and
+.misc@pop-nr ds-in ds*old-in \" line length
+.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
+.\"
+.\" Print static display
+.nr ds*i \\n[Lsp]
+.if r Dsp .nr ds*i \\n[Dsp]
+.\"
+.if \\n[Ds] .SP \\n[ds*i]u \" Space before display
+.\" 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])
+.\" **********
+.\"
+.ds*div!\\n[ds*snr]
+.if \\n[Ds] .SP \\n[ds*i]u \" Space after display
+.\"
+.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@suppress-indentation 1 \" no indentation after displays
+.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 \\$0: expected at least 4 arguments, got \\n[.$]
+.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 \\$0: no list active; call AL, BL, BVL, ... \
+first
+.if \\n[li*li-spc]&(\\n[li*lvl]<=\\n[Ls]) \
+. 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
+.if \\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]\ @
+.\"
+.\" 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 \\$0: no list active; call AL, BL, BVL, ... \
+and LI first
+.li@pop
+.if '\\$1'1' .SP \\n[Lsp]u
+.nr par@suppress-indentation 1 \" no indentation after lists
+..
+.\"-------------
+.\" list status clear.
+.\" terminate all lists to level i
+.de LC
+.nr li*i 0
+.if \\n[.$] \{\
+. ie \B'\\$1' .nr li*i \\$1
+. el .@error \\$0: argument not numeric: '\\n[li*i]'
+.\}
+.if \\n[li*i]>\\n[li*lvl] .@error \\$0 invalid argument: \\n[li*i] \
+exceeds depth of nested lists (\\n[li*lvl])
+.while \\n[li*lvl]>\\n[li*i] .li@pop
+.nr par@suppress-indentation 1 \" no indentation after lists
+..
+.\"-------------
+.de AL
+.if \\n[.$]>3 .@warning \\$0: ignoring excess 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 .@warning \\$0: ignoring excess 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 .@warning \\$0: ignoring excess arguments
+.if \\n[.$]<1 .@error \\$0: expected 1 to 3 arguments, got \\n[.$]
+.ie \\n[.$]<3 .LB 0\\$1 0\\$2 0 0
+.el .LB 0\\$1 0\\$2 0 0 \& 0 1
+..
+.de BL
+.if \\n[D]>2 .tm BL $*
+.if \\n[.$]>2 .@warning \\$0: ignoring excess 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 .@warning \\$0: ignoring excess 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 .@warning \\$0: ignoring excess 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 .@warning \\$0: ignoring excess arguments
+.if \\n[.$]<1 .@error \\$0: expected 1 to 3 arguments, got \\n[.$]
+.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 mm.
+.\" 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 \\$0: .TH without .TS H"
+..
+.de TE
+.ie '\\n[.z]'tbl*header-div' .@error \\$0: .TS H but no .TH before .TE
+.el \{\
+. nr tbl*have-header 0
+.\}
+.\" reset tabs
+.TAB
+..
+.de T&
+..
+.\" ####### module pic #######################################
+.de PS
+.if !\\n[.$]=2 \{\
+. ds pic*msg \\$0: expected 2 arguments, got \\n[.$]\"
+. as pic*msg ; not preprocessed with pic?\"
+. @error \\*[pic*msg]
+.\}
+.br
+.SP .5
+.if r ds*format .if !\\n[ds*lvl] .ne (u;\\$1)+1v
+..
+.de PY
+.init@reset
+..
+.de PE
+.PY
+.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-1v)/2)
+. ie (\\n[Eq]%2) \{\
+. \" label to the left
+\h'|0'\\*[eq*label]
+. \}
+. el \{\
+. \" label to the right, possibly compensating for
+. \" indented display
+. ie \\n[ds*format]=1 \
+\h'|\\n[.l]u-\w'\\*[eq*label]'u+\\n[Si]n'\\*[eq*label]
+. el \h'|\\n[.l]u-\w'\\*[eq*label]'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[P]
+..
+.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 pagenumber
+.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 headernumber 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
+\f3\\$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
+\!\f3\\$1\fP\\$2
+\!.\}
+\!.el \{\
+. ce 1
+\!\f3\\$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 headernumber
+.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 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 \f3 \f[\\n[.f]] \\$@
+.el .ft 3
+..
+.de I
+.ie \\n[.$] .fnt@switch \f2 \f[\\n[.f]] \\$@
+.el .ft 2
+..
+.de R
+.ie \\n[.$] .fnt@switch \f1 \f[\\n[.f]] \\$@
+.el .ft 1
+..
+.de IB
+.if \\n[.$] .fnt@switch \f2 \f3 \\$@
+..
+.de BI
+.if \\n[.$] .fnt@switch \f3 \f2 \\$@
+..
+.de IR
+.if \\n[.$] .fnt@switch \f2 \f1 \\$@
+..
+.de RI
+.if \\n[.$] .fnt@switch \f1 \f2 \\$@
+..
+.de RB
+.if \\n[.$] .fnt@switch \f1 \f3 \\$@
+..
+.de BR
+.if \\n[.$] .fnt@switch \f3 \f1 \\$@
+..
+.\"########################### 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 \\$0: cannot nest; 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 \\$0: no corresponding 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 ############################
+.mso refer-mm.tmac
+.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 \{\
+. @warning \\$0: ignoring; no references defined
+. return
+.\}
+.ie !''\\$2' .nr ref*i 0\\$2
+.el .nr ref*i \\n[Rpe]
+.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
+\f2\\*[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 \\$0: expected 2 or 3 arguments, got \\n[.$]
+.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@header name text
+.de app@header
+.bp
+.SP (u;\\n[Lsp]*4)
+.ce 1
+\s+4\f3\\*[App]\ \\$1\fP\s0
+.SP (u;\\n[Lsp]*2)
+.if \w@\\$2@<\\n[.l] .ce 1
+\f3\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
+.\" number of authors' titles stored in cov*at!x
+.\" title(s) of author(s) 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
+.ds @cover \\$0
+.@disable IA IE WA WE LO LT \" can't use with LT and friends
+.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
+.if !\\n[.$] .return \" AU is being used only to end a TL.
+.pg@disable-top-trap
+.nr cov*au +1
+.nr cov*at!\\n[cov*au] 0 \" no titles for this author yet
+.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 title [...]
+.\" Any quantity of titles may be declared.
+.\" Must be called directly after the corresponding .AU.
+.de AT
+.if !\\n[.$] \{\
+. @warning \\$0: ignoring; no arguments specified
+. return
+.\}
+.nr cov*at!\\n[cov*au] \\n[.$]
+.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 \\$0: only one abstract allowed
+.if !''\\n[.z]' .@error \\$0: 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 memorandum numbers.
+.de TM
+.if !\\n[.$] \{\
+. @warning \\$0: ignoring; no arguments specified
+. return
+.\}
+.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
+.ds @cover \\$0
+.@disable COVER IA IE WA WE LO LT
+.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-addressee "\\$2
+.ds cov*mt-type-text "\\$1
+.ie d @country .ds cov*str mm/\\*[@country]_
+.el .ds cov*str mm/
+.mso \\*[cov*str]\\*[cov*mt-file!\\*[cov*mt-type]]
+..
+.de COVER
+.ds @cover \\$0
+.@disable IA IE WA WE LO LT MT
+.ie !\\n[.$] .ds cov*cov-type ms
+.el .ds cov*cov-type \\$1
+.pg@disable-top-trap
+.ie d @country .ds cov*str mm/\\*[@country]_\\*[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 \\$0: expected 1 or 2 arguments, got \\n[.$]
+.if !r qrf*pass .tm \\$0: no .INITR in this file \" XXX: .@error?
+.if \\n[Ref] \{\
+. ds qrf*name qrf*ref-\\$1
+. if \\n[D]>2 .tm SETR: ref \\*[qrf*name]=\\*[hd@mark-trimmed],\\n[%]
+. \" heading-number
+. ds \\*[qrf*name]-hn \\*[hd@mark-trimmed]
+. \" page-number
+. ds \\*[qrf*name]-pn \\n[%]
+. \"
+. if \\n[Ref] \{\
+. tm .ds \\*[qrf*name]-hn \\*[hd@mark-trimmed]
+. 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 \\$0: expected 1 or 2 arguments, got \\n[.$]
+.if !r qrf*pass .tm \\$0: no .INITR in this file \" XXX: .@error?
+.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 \\$0: expected 1 or 2 arguments, got \\n[.$]
+.if !r qrf*pass .tm \\$0: no .INITR in this file \" XXX: .@error?
+.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 \\$0: expected 1 or 2 arguments, got \\n[.$]
+.if !r qrf*pass .tm \\$0: no .INITR in this file \" XXX: .@error?
+.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 \\$0: expected an argument
+.ie !r qrf*pass .tm \\$0: no .INITR in this file" \" XXX: .@error?
+.el \{\
+. GETHN \\$1 Qrfh
+. GETPN \\$1 Qrfp
+\\*[Qrf]
+.\}
+..
+.\"########################### module ind ############################
+.\"--------------------
+.\" Another type of index system
+.\" INITI type filename [macro]
+.de INITI
+.if \\n[.$]<2 .@error \\$0: expected 2 or 3 arguments, got \\n[.$]
+.\" ignore if INITI has already been used
+.if d ind*file .@error \\$0: index file name already set
+.ds ind*file \\$2.ind
+.if \\n[D]>1 .tm INITI: source \\*[ind*file]
+.if !d ind*file .@error \\$0: index file name not specified
+.ds ind*type \\$1
+.if \\n[Ref] \{\
+. if \\n[.$]>2 .tm .\\\\" Imacro: \\$3
+.\}
+..
+.\"---------------
+.de IND
+.if !d ind*file .@error \\$0: no active index; call INITI"
+.if \\n[D]>1 .tm IND: type=\\*[ind*type]
+.ds ind*ref \" empty
+.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]'' .@abort invalid index type '\\*[ind*type]'
+.\"
+.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
+.\" We hard-code the SG macro name here since this macro is internal but
+.\" only SG calls it.
+.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 \" empty
+.if d cov*au!\\n[let*k]!3 \{\
+. as let*tmp \\*[cov*au!\\n[let*k]!3]\"
+. if d cov*au!\\n[let*k]!4 \
+. as let*tmp -\\*[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 /\"
+. if d cov*au!\\n[let*i]!2 .as let*tmp \\*[cov*au!\\n[let*i]!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] \{\
+. ne 3v+\\n[cov*at!\\n[let*i]]v
+. SP 3v
+. if \\n[let*i]=\\n[let*k] \{\
+\Z'\h'-(u;\\n[.l]/2)'\\*[let*tmp]'\c
+. \}
+\\*[cov*au!\\n[let*i]!1]
+. nr let*j 0 1
+. while \\n+[let*j]<=\\n[cov*at!\\n[let*i]] \{\
+\\*[cov*at!\\n[let*i]!\\n[let*j]]
+. \}
+.\}
+.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
+.ds @cover LT
+.@disable AF AS AE AT AU COVER CS OK TL MT \" same list as LO
+.ds let*type BL
+.nr Pi 5
+.nr Pt 0
+.if !''\\$1' .ds let*type \\$1
+.if !d let@head_\\*[let*type] .@error \\$0: 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
+.ie '\\$2'' .misc@toupper "\\$1"
+.el .misc@toupper "\\$1, \\$2"
+.if \\$4 .sp
+.if \w'\\$5'&\\$4 \\$5
+.fi
+..
+.de let@fc_SP
+.\" Simplified letters have no formal closing, just space before SG.
+.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
+.ds @cover \\$0
+.@disable AF AS AE AT AU COVER CS OK TL MT \" same list as LT
+.if !\\n[.$] \{\
+. @warning \\$0: ignoring; no arguments specified
+. return
+.\}
+.if !d Let\\$1 .@error \\$0: unrecognized option '\\$1'
+.ds let*lo-\\$1 \\$2
+.if \n[D]>1 .tm Letter option \\$1 \\$2
+..
+.\"--------------------
+.\" Start with a clean slate
+.init@reset
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/mm/mm.am b/contrib/mm/mm.am
new file mode 100644
index 0000000..191dbce
--- /dev/null
+++ b/contrib/mm/mm.am
@@ -0,0 +1,128 @@
+# Copyright 1991-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# mm.am
+#
+
+mm_srcdir = $(top_srcdir)/contrib/mm
+mm_builddir = $(top_builddir)/contrib/mm
+
+bin_SCRIPTS += mmroff
+
+man1_MANS += contrib/mm/mmroff.1
+man7_MANS += \
+ contrib/mm/groff_mm.7 \
+ contrib/mm/groff_mmse.7
+
+# Files installed in $(tmacdir)/mm
+MMFILES = \
+ contrib/mm/mm/0.MT \
+ contrib/mm/mm/5.MT \
+ contrib/mm/mm/4.MT \
+ contrib/mm/mm/ms.cov \
+ contrib/mm/mm/se_ms.cov
+mmdir = $(tmacdir)/mm
+dist_mm_DATA = $(MMFILES)
+
+# Files installed in $(tmacdir)
+tmacmmdir = $(tmacdir)
+dist_tmacmm_DATA = contrib/mm/refer-mm.tmac
+
+MMEXAMPLEFILES=\
+ contrib/mm/examples/letter.mm
+
+mmexampledir=$(exampledir)/mm
+dist_mmexample_DATA = $(MMEXAMPLEFILES)
+
+EXTRA_DIST += \
+ contrib/mm/ChangeLog \
+ contrib/mm/examples \
+ contrib/mm/Makefile.sim \
+ contrib/mm/mm \
+ contrib/mm/NOTES \
+ contrib/mm/README \
+ contrib/mm/groff_mm.7.man \
+ contrib/mm/groff_mmse.7.man \
+ contrib/mm/mmroff.1.man \
+ contrib/mm/mmroff.pl
+
+mm_TESTS = \
+ contrib/mm/tests/LT_SP_AU_without_AT_works.sh \
+ contrib/mm/tests/LT_SP_multi-word_LO_SJ_works.sh \
+ contrib/mm/tests/MT-1-reports-all-TM-numbers.sh \
+ contrib/mm/tests/MT_5_includes_AT_in_SG.sh \
+ contrib/mm/tests/P-indentation-works.sh \
+ contrib/mm/tests/ms_cover_sheet_robust_to_missing_AF.sh \
+ contrib/mm/tests/mse_has-sufficient-footnote-space.sh \
+ contrib/mm/tests/place-equation-labels-correctly-in-displays.sh \
+ contrib/mm/tests/remove-stale-bib-entry-data.sh \
+ contrib/mm/tests/short-pages-do-not-overflow-stack.sh
+TESTS += $(mm_TESTS)
+EXTRA_DIST += \
+ $(mm_TESTS) \
+ contrib/mm/tests/artifacts/60657.ref
+
+mmroff: $(mm_srcdir)/mmroff.pl
+ $(AM_V_GEN)$(SED) \
+ -e 's;[@]PERL[@];$(PERL);' \
+ -e 's;[@]VERSION[@];$(VERSION);' \
+ $(mm_srcdir)/mmroff.pl \
+ >$@.tmp \
+ && chmod +x $@.tmp \
+ && mv $@.tmp $@
+
+# special installation rules for m.tmac, mse.tmac, mmse.tmac, mm.tmac
+install-data-local: install_mm
+install_mm:
+ -test -d $(DESTDIR)$(tmacdir) || $(mkinstalldirs) $(DESTDIR)$(tmacdir)
+ -test -d $(DESTDIR)$(mmdir) || $(mkinstalldirs) $(DESTDIR)$(mmdir)
+ $(RM) $(DESTDIR)$(tmacdir)/tmac.$(tmac_m_prefix)m
+ $(RM) $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)m.tmac
+ $(INSTALL_DATA) $(mm_srcdir)/m.tmac \
+ $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)m.tmac
+ $(SED) -e "s;^.mso m.tmac;.mso $(tmac_m_prefix)m.tmac;g" \
+ $(mm_srcdir)/mse.tmac > $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)mse.tmac
+ @$(SED) -e "s;^.mso mse.tmac;.mso $(tmac_m_prefix)mse.tmac;g" \
+ $(mm_srcdir)/mmse.tmac > $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)mmse.tmac
+ @$(SED) -e "s;^.mso m.tmac;.mso $(tmac_m_prefix)m.tmac;g" \
+ $(mm_srcdir)/mm.tmac > $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)mm.tmac
+uninstall-local: uninstall_mm
+uninstall_mm:
+ if test -d $(DESTDIR)$(mmexampledir); then \
+ rmdir $(DESTDIR)$(mmexampledir); \
+ fi
+ $(RM) $(DESTDIR)$(tmacdir)/tmac.$(tmac_m_prefix)m
+ $(RM) $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)m.tmac
+ $(RM) $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)mm.tmac
+ $(RM) $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)mse.tmac
+ $(RM) $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)mmse.tmac
+ -rmdir $(DESTDIR)$(tmacdir)/mm
+
+# Special distribution rule: we copy all .tmac files from contrib/mm
+dist-hook: dist_mm
+dist_mm:
+ chmod u+w $(distdir)/contrib/mm/
+ for i in $(mm_srcdir)/*.tmac; do \
+ cp -f $$i $(distdir)/contrib/mm/; \
+ done
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/contrib/mm/mm.tmac b/contrib/mm/mm.tmac
new file mode 100644
index 0000000..98e311d
--- /dev/null
+++ b/contrib/mm/mm.tmac
@@ -0,0 +1,4 @@
+.\" -*- nroff -*-
+.\" 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..b06a4b8
--- /dev/null
+++ b/contrib/mm/mm/0.MT
@@ -0,0 +1,175 @@
+.ig
+
+Copyright (C) 1991-2020 Free Software Foundation, Inc.
+mm is written by Jörgen Hägg <jh@axis.com>
+
+mm 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 3 of the License, or
+(at your option) any later version.
+
+mm is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Please submit bug reports using groff's 'BUG-REPORT' file to
+http://savannah.gnu.org/bugs/?group=groff.
+..
+.
+.\"------------
+.\" Cover sheet. Memorandum type 0-3 and "string".
+.\"------------
+.if !r Au .nr Au 1
+.de cov@print-title
+.if !d cov*title .@error title not defined; call TL and AU before MT
+.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
+.\" The following diagnostic might be unreachable.
+.if !r cov*au .@error no authors defined; call AU before MT
+.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
+.\}
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/mm/mm/4.MT b/contrib/mm/mm/4.MT
new file mode 100644
index 0000000..1fd31df
--- /dev/null
+++ b/contrib/mm/mm/4.MT
@@ -0,0 +1,110 @@
+.ig
+
+Copyright (C) 1991-2020 Free Software Foundation, Inc.
+mm is written by Jörgen Hägg <jh@axis.com>
+
+mm 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 3 of the License, or
+(at your option) any later version.
+
+mm is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Please submit bug reports using groff's 'BUG-REPORT' file to
+http://savannah.gnu.org/bugs/?group=groff.
+..
+.
+.\"------------
+.\" Cover sheet. Memorandum type 4
+.\"------------
+.de cov@print-title
+.if !d cov*title .@error title not defined; call TL and AU before MT
+.MOVE 2.8c
+.S +2
+.ad c
+.fi
+.B
+.cov*title
+.br
+.S
+.R
+.ad b
+..
+.\"------------
+.de cov@print-authors
+.\" The following diagnostic might be unreachable.
+.if !r cov*au .@error no authors defined; call AU before MT
+.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
+..
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/mm/mm/5.MT b/contrib/mm/mm/5.MT
new file mode 100644
index 0000000..10bf410
--- /dev/null
+++ b/contrib/mm/mm/5.MT
@@ -0,0 +1,61 @@
+.ig
+
+Copyright (C) 1991-2020 Free Software Foundation, Inc.
+mm is written by Jörgen Hägg <jh@axis.com>
+
+mm 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 3 of the License, or
+(at your option) any later version.
+
+mm is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Please submit bug reports using groff's 'BUG-REPORT' file to
+http://savannah.gnu.org/bugs/?group=groff.
+..
+.
+.\"------------
+.\" Cover sheet. Memorandum type 5
+.\"------------
+.de cov@print-title
+.if !d cov*title .@error title not defined; call TL and AU before MT
+.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
+.\}
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/mm/mm/ms.cov b/contrib/mm/mm/ms.cov
new file mode 100644
index 0000000..cea6073
--- /dev/null
+++ b/contrib/mm/mm/ms.cov
@@ -0,0 +1,121 @@
+.\" -*- nroff -*-
+.ig
+
+Copyright (C) 1991-2020 Free Software Foundation, Inc.
+mm is written by Jörgen Hägg <jh@axis.com>
+
+mm 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 3 of the License, or
+(at your option) any later version.
+
+mm is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Please submit bug reports using groff's 'BUG-REPORT' file to
+http://savannah.gnu.org/bugs/?group=groff.
+..
+.
+.\"------------
+.\" Cover sheet. Mostly like ms cover.
+.\"------------
+.de cov@print-title
+.ie !d cov*title .@error COVEND: no title (TL) defined
+.el \{\
+. 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
+.ie !\\n[cov*au] .@error COVEND: no authors (AU) defined
+.el \{\
+. SP
+. nr cov*i 0 1
+. while \\n+[cov*i]<=\\n[cov*au] \{\
+. ds cov*aname \\*[cov*au!\\n[cov*i]!1]
+. ce
+. nop \fI\\*[cov*aname]\fP
+. nr cov*j 0 1
+. while \\n+[cov*j]<=\\n[cov*at!\\n[cov*i]] \{\
+. ds cov*atitle \\*[cov*at!\\n[cov*i]!\\n[cov*j]]
+. ce
+. nop \s-1\\*[cov*atitle]\s0
+. \}
+. rm cov*atitle
+. \}
+. rm cov*aname
+.\}
+..
+.\"------------
+.de cov@print-firm
+.if d cov*firm \{\
+. SP .5
+. ce
+. nop \\*[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 r cov*abs-arg .if \\n[cov*abs-arg] \{\
+. cov@print-abstract ABSTRACT
+. SP 2
+.\}
+..
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/mm/mm/se_ms.cov b/contrib/mm/mm/se_ms.cov
new file mode 100644
index 0000000..7ee7ec3
--- /dev/null
+++ b/contrib/mm/mm/se_ms.cov
@@ -0,0 +1,3 @@
+.\" -*- nroff -*-
+.mso mm/ms.cov
+.nr cur*abstract-ll 11c
diff --git a/contrib/mm/mmroff.1.man b/contrib/mm/mmroff.1.man
new file mode 100644
index 0000000..7920c70
--- /dev/null
+++ b/contrib/mm/mmroff.1.man
@@ -0,0 +1,171 @@
+.TH mmroff @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+mmroff \- cross-referencing front end for GNU
+.I roff mm
+macro package
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2023 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_mmroff_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY mmroff
+.RB [ \-x ]
+.IR groff-argument \~.\|.\|.
+.YS
+.
+.
+.SY mmroff
+.B \-\-help
+.YS
+.
+.
+.SY mmroff
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I mmroff
+is a simple wrapper for
+.IR groff ,
+used to expand cross references in
+.IR m@TMAC_M_PREFIX@m ;
+see
+.MR groff_mm @MAN7EXT@ .
+.
+It runs
+.I groff
+with the
+.B \-mm
+option twice,
+first with
+.B \-z
+and
+.B \-rRef=1
+to populate cross-reference and index files with their corresponding
+entries,
+and then again to produce the document.
+.
+It also handles the inclusion of PostScript images with the
+.B PIC
+macro.
+.
+Documents that do not use these features of
+.I "groff mm"
+(the
+.BR INITI ,
+.BR IND ,
+.BR INDP ,
+.BR INITR ,
+.BR SETR ,
+.BR GETHN ,
+.BR GETPN ,
+.BR GETR ,
+.BR GETST ,
+and
+.B PIC
+macros)
+do not require
+.IR \%mmroff .
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays
+a usage message,
+while
+.B \-\-version
+shows version information;
+both exit afterward.
+.
+.
+.TP
+.B \-x
+Create or update the cross-reference file and exit.
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+.I mmroff
+was written by
+.MT jh@\:axis\:.se
+J\[o ad]rgen H\[a ad]gg
+.ME
+of Lund,
+Sweden.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.MR groff_mm @MAN7EXT@ ,
+.MR groff_mmse @MAN7EXT@ ,
+.MR groff @MAN1EXT@ ,
+.MR @g@troff @MAN1EXT@ ,
+.MR @g@tbl @MAN1EXT@ ,
+.MR @g@pic @MAN1EXT@ ,
+.MR @g@eqn @MAN1EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_mmroff_1_man_C]
+.do rr *groff_mmroff_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/mm/mmroff.pl b/contrib/mm/mmroff.pl
new file mode 100644
index 0000000..af8bf90
--- /dev/null
+++ b/contrib/mm/mmroff.pl
@@ -0,0 +1,179 @@
+#!@PERL@
+# Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+(my $progname = $0) =~s @.*/@@;
+
+# 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;
+
+if (grep(/^--help$/, @ARGV)) {
+ print "usage: mmroff [-x] [groff-option ...] [file ...]\n";
+ exit;
+}
+
+if (grep(/^--version$/, @ARGV)) {
+ print "mmroff (groff) @VERSION@\n";
+ exit;
+}
+
+# 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(<MACRO>) {
+ 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);
+
+sub Die {
+ print STDERR "$progname: fatal error: @_\n";
+ exit 1;
+}
+
+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")
+ or &Die("unable to 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") or &Die("unable to 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(<IN>) {
+ if (/^%%BoundingBox:\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/) {
+ $cur{'llx'} = $1;
+ $cur{'lly'} = $2;
+ $cur{'urx'} = $3;
+ $cur{'ury'} = $4;
+ }
+ }
+ close(IN);
+}
+
+
+1;
+# Local Variables:
+# mode: CPerl
+# End:
diff --git a/contrib/mm/mmse.tmac b/contrib/mm/mmse.tmac
new file mode 100644
index 0000000..3239aa2
--- /dev/null
+++ b/contrib/mm/mmse.tmac
@@ -0,0 +1,4 @@
+.\" -*- nroff -*-
+.\" mmse.tmac
+.\"
+.do mso mse.tmac
diff --git a/contrib/mm/mse.tmac b/contrib/mm/mse.tmac
new file mode 100644
index 0000000..8184b14
--- /dev/null
+++ b/contrib/mm/mse.tmac
@@ -0,0 +1,166 @@
+.ig
+
+Copyright (C) 1991-2020 Free Software Foundation, Inc.
+mm is written by Jörgen Hägg <jh@axis.com>
+
+mm 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 3 of the License, or
+(at your option) any later version.
+
+mm is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Please submit bug reports using groff's 'BUG-REPORT' file to
+http://savannah.gnu.org/bugs/?group=groff.
+..
+.
+.\"
+.\" Swedish version of mm
+.\"
+.\" See m.tmac for version-information.
+.ds @country se
+.
+.mso m.tmac
+.\" The two-letter code for Swedish is 'sv', not 'se' (this is Northern Sami)
+.mso sv.tmac
+.
+.ISODATE
+.
+.\" 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
+.
+.nr pg*footer-size 4v\" 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
+..
+.\" -----------------------------------
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/mm/refer-mm.tmac b/contrib/mm/refer-mm.tmac
new file mode 100644
index 0000000..800568a
--- /dev/null
+++ b/contrib/mm/refer-mm.tmac
@@ -0,0 +1,109 @@
+.\" refer-mm.tmac
+.\"
+.\" Refer support for mm macros.
+.\"
+.\" Copyright (C) 2011-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+.\"
+.\" Please send comments to groff@gnu.org.
+.
+.
+.als ref*error @warning
+.
+.de ref*text-label-start
+. FS "\\$1"
+..
+.de ref*text-label-end
+. FE
+..
+.
+.de ref*biblio-item-start
+. ref@start-print "\\$1"
+..
+.de ref*biblio-item-start-nolabel
+. ref@start-print \&
+..
+.de ref*biblio-item-end
+. ref@stop-print
+..
+.
+.ds ref*refnum-start \" empty
+.ds ref*refnum-end .\"
+.
+.ds [. \v'-.4m'\s-3[\"
+.ds .] ]\s0\v'.4m'\"
+.
+.ds ref*spec!0 Q A T S V N P I C D O
+.ds ref*spec!1 Q A T J S V N P I C D O
+.ds ref*spec!2 Q A T S V P I C D O
+.ds ref*spec!3 Q A T B E S V P I C D O
+.ds ref*spec!4 Q A T R G P I C D O
+.
+.ds ref*spec!A ", " "
+.ds ref*spec!B """ " " "in \fI" "" "\fP"
+.ds ref*spec!D """ " " "(" ")"
+.ds ref*spec!E ", " " "ed.\& "
+.ds ref*spec!G """ " " "(" ")"
+.ds ref*spec!J ", " " "\fI" "" "\fP"
+.ds ref*spec!N """ "(" "" ")"
+.ds ref*spec!O ". " "
+.ds ref*spec!P ", " " "p.\~"
+.ds ref*spec!PP ", " " "pp.\~"
+.ds ref*spec!T ", " " "\(lq" "" "\(rq"
+.ds ref*spec!T:0 ", " " "\fI" "" "\fP"
+.ds ref*spec!T:2 ", " " "\fI" "" "\fP"
+.ds ref*spec!V """ " " "\fB" "\fR"
+.ds ref*spec!dflt ", " "
+.
+.\" For the bibliography section, we emulate the .RS/.RF mechanism of mm by
+.\" collecting references (enclosed with .]- and .][) in macro 'ref*mac'.
+.\" This macro gets expanded while calling the .RP macro.
+.
+.de ref*][-first-pass
+. ec
+. am ref*mac
+. ds [F "\\*([F\"
+. ][ "\\$1" "\\$2"
+. ref*reset
+\\..
+..
+.
+.de ref*biblio-start-hook
+. als ref*][-second-pass ][
+. als ][ ref*][-first-pass
+. de ref*item-start-hook
+. eo
+. am ref*mac ][
+\\..
+..
+.
+.de ref*biblio-end-hook
+. als ][ ref*][-second-pass
+. rm ref*item-start-hook
+. als ref*print ref*end-print
+. RP
+. als ref*print ref*normal-print
+..
+.
+.mso refer.tmac
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/mm/tests/LT_SP_AU_without_AT_works.sh b/contrib/mm/tests/LT_SP_AU_without_AT_works.sh
new file mode 100755
index 0000000..7589966
--- /dev/null
+++ b/contrib/mm/tests/LT_SP_AU_without_AT_works.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #60373 (3/3).
+#
+# Ensure that an author name (AU) with no title (AT) isn't rendered with
+# a trailing comma.
+#
+# Thanks to Robert Goulding for the reproducer.
+
+EXAMPLE='.LT SP
+.WA "John Doe"
+Nowhere,
+USA.
+.WE
+.IA "Jane Smith"
+Somewhere,
+UK.
+.IE
+.LO SJ "Letter of Introduction"
+.LO SA "Dear Ms.\& Smith"
+.P
+This is the text of the letter.
+.FC "Yours sincerely,"
+.SG'
+
+echo "$EXAMPLE" \
+ | "$groff" -Tascii -P-cbou -mm \
+ | grep -Eqx '[[:space:]]+JOHN DOE[[:space:]]*'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/contrib/mm/tests/LT_SP_multi-word_LO_SJ_works.sh b/contrib/mm/tests/LT_SP_multi-word_LO_SJ_works.sh
new file mode 100755
index 0000000..98c3fda
--- /dev/null
+++ b/contrib/mm/tests/LT_SP_multi-word_LO_SJ_works.sh
@@ -0,0 +1,49 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #60373 (1/3).
+#
+# Ensure that a multi-word subject line (LO SJ) gets rendered.
+#
+# Thanks to Robert Goulding for the reproducer.
+
+EXAMPLE='.LT SP
+.WA "John Doe"
+Nowhere,
+USA.
+.WE
+.IA "Jane Smith"
+Somewhere,
+UK.
+.IE
+.LO SJ "Letter of Introduction"
+.LO SA "Dear Ms.\& Smith"
+.P
+This is the text of the letter.
+.FC "Yours sincerely,"
+.SG'
+
+echo "$EXAMPLE" \
+ | "$groff" -Tascii -P-cbou -mm \
+ | grep -Eqx '[[:space:]]+LETTER OF INTRODUCTION[[:space:]]*'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/contrib/mm/tests/MT-1-reports-all-TM-numbers.sh b/contrib/mm/tests/MT-1-reports-all-TM-numbers.sh
new file mode 100755
index 0000000..3224e7c
--- /dev/null
+++ b/contrib/mm/tests/MT-1-reports-all-TM-numbers.sh
@@ -0,0 +1,53 @@
+#!/bin/sh
+#
+# Copyright (C) 2023 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo ...FAILED >&2
+ fail=YES
+}
+
+# Regression-test Savannah #63613. The identifiers of all technical
+# memoranda should be formatted.
+
+input='.TL
+My Memo
+.AU "Random Hacker"
+.TM 23-SKIDOO 24-URTHRU
+.MT 1
+This is my memo.
+.
+There are many like it but this one is mine.'
+
+output=$(printf "%s\n" "$input" | "$groff" -mm -Tascii -P-cbou)
+echo "$output"
+
+echo "checking that first TM number is present" >&2
+echo "$output" | grep -q "23-SKIDOO" || wail
+
+echo "checking that second TM number is present" >&2
+echo "$output" | grep -q "24-URTHRU" || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/contrib/mm/tests/MT_5_includes_AT_in_SG.sh b/contrib/mm/tests/MT_5_includes_AT_in_SG.sh
new file mode 100755
index 0000000..4f23d53
--- /dev/null
+++ b/contrib/mm/tests/MT_5_includes_AT_in_SG.sh
@@ -0,0 +1,43 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #57034.
+#
+# Ensure that an author's title (if any) is written in the signature.
+#
+# Thanks to Ken Mandelberg for the reproducer.
+
+EXAMPLE='.TL
+Inquiry
+.AU "John SMITH"
+.AT "Director"
+.MT 5
+.P
+sentence
+.FC Sincerely,
+.SG'
+
+echo "$EXAMPLE" \
+ | "$groff" -Tascii -P-cbou -mm \
+ | grep -Eqx '[[:space:]]+Director[[:space:]]*'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/contrib/mm/tests/P-indentation-works.sh b/contrib/mm/tests/P-indentation-works.sh
new file mode 100755
index 0000000..5be7efd
--- /dev/null
+++ b/contrib/mm/tests/P-indentation-works.sh
@@ -0,0 +1,135 @@
+#!/bin/sh
+#
+# Copyright (C) 2023 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo ...FAILED >&2
+ fail=YES
+}
+
+# Regression-test Savannah #54909. Check other cases as well.
+
+input='.P
+P1 not indented.
+.P 0
+P2 not indented.
+.P 1
+P3 indented.
+.nr Pt 2
+.P
+P4 indented.
+.H 1 Heading
+.P
+P5 not indented.
+.P
+P6 indented.
+.H 3 "Run-in heading."
+Some text.
+.P
+P7 indented.
+.DS
+display
+.DE
+.P
+P8 not indented.
+.P
+P9 indented.
+.BL
+.LI
+list item
+.LE
+.P
+P10 not indented.
+.P
+P11 indented.'
+
+output=$(printf "%s\n" "$input" | "$groff" -mm -Tascii -P-cbou)
+echo "$output"
+
+# P1 not indented.
+#
+# P2 not indented.
+#
+# P3 indented.
+#
+# P4 indented.
+#
+#
+# 1. Heading
+#
+# P5 not indented.
+#
+# P6 indented.
+#
+# 1.0.1 Run-in heading. Some text.
+#
+# P7 indented.
+#
+# display
+#
+# P8 not indented.
+#
+# P9 indented.
+#
+# o list item
+#
+# P10 not indented.
+#
+# P11 indented.
+
+echo "checking that initial untyped paragraph not indented" >&2
+echo "$output" | grep -Eqx ' {7}P1 not indented\.' || wail
+
+echo "checking that initial type 0 paragraph not indented" >&2
+echo "$output" | grep -Eqx ' {7}P2 not indented\.' || wail
+
+echo "checking that first paragraph after Pt=2 indented" >&2
+echo "$output" | grep -Eqx ' {12}P3 indented\.' || wail
+
+echo "checking that second paragraph after Pt=2 indented" >&2
+echo "$output" | grep -Eqx ' {12}P4 indented\.' || wail
+
+echo "checking that first paragraph after heading not indented" >&2
+echo "$output" | grep -Eqx ' {7}P5 not indented\.' || wail
+
+echo "checking that second paragraph after heading indented" >&2
+echo "$output" | grep -Eqx ' {12}P6 indented\.' || wail
+
+echo "checking that paragraph after run-in heading indented" >&2
+echo "$output" | grep -Eqx ' {12}P7 indented\.' || wail
+
+echo "checking that first paragraph after display not indented" >&2
+echo "$output" | grep -Eqx ' {7}P8 not indented\.' || wail
+
+echo "checking that second paragraph after display indented" >&2
+echo "$output" | grep -Eqx ' {12}P9 indented\.' || wail
+
+echo "checking that first paragraph after list not indented" >&2
+echo "$output" | grep -Eqx ' {7}P10 not indented\.' || wail
+
+echo "checking that second paragraph after list indented" >&2
+echo "$output" | grep -Eqx ' {12}P11 indented\.' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/contrib/mm/tests/artifacts/60657.ref b/contrib/mm/tests/artifacts/60657.ref
new file mode 100644
index 0000000..ed7f6f3
--- /dev/null
+++ b/contrib/mm/tests/artifacts/60657.ref
@@ -0,0 +1,11 @@
+%K 1
+%A First Author
+%B First Book
+%O Test one
+
+%K 2
+%A Second Author
+%B Second Book
+
+%K 3
+%A Third Author
diff --git a/contrib/mm/tests/ms_cover_sheet_robust_to_missing_AF.sh b/contrib/mm/tests/ms_cover_sheet_robust_to_missing_AF.sh
new file mode 100755
index 0000000..66086f8
--- /dev/null
+++ b/contrib/mm/tests/ms_cover_sheet_robust_to_missing_AF.sh
@@ -0,0 +1,39 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #60915.
+#
+# Ensure that a missing firm definition doesn't disrupt cover sheet
+# layout.
+
+EXAMPLE='.COVER
+.ND 2020-07-17
+.TL
+The Great American Novel
+.AU "Eileen M. Plausible"
+.COVEND'
+
+echo "$EXAMPLE" \
+ | "$groff" -Tascii -P-cbou -mm \
+ | grep -Fqx ' 2020-07-17' # 7 spaces
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/contrib/mm/tests/mse_has-sufficient-footnote-space.sh b/contrib/mm/tests/mse_has-sufficient-footnote-space.sh
new file mode 100755
index 0000000..936d9e5
--- /dev/null
+++ b/contrib/mm/tests/mse_has-sufficient-footnote-space.sh
@@ -0,0 +1,77 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savnnah #63398.
+
+input='.de M
+. nr N \\\\$1-1
+. if \\\\$1 .M \\\\nN
+Sed ut perspiciatis, unde omnis iste natus error sit voluptatem
+accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab
+illo inventore veritatis et quasi architecto beatae vitae dicta sunt,
+explicabo.\\\\*F
+. FS
+footnote text
+. FE
+..
+.P
+.M 16'
+
+# .de M
+# . nr N \\$1-1
+# . if \\$1 .M \\nN
+# Sed ut perspiciatis, unde omnis iste natus error sit voluptatem
+# accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab
+# illo inventore veritatis et quasi architecto beatae vitae dicta sunt,
+# explicabo.\\*F
+# .FS
+# blather
+# .FE
+# Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur
+# aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione
+# voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum,
+# quia dolor sit amet consectetur adipiscivelit, sed quia non-numquam eius
+# modi tempora incidunt, ut labore et dolore magnam aliquam quaerat
+# voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam
+# corporis suscipitlaboriosam, nisi ut aliquid ex ea commodi consequatur?
+# Quis autem vel eum iure reprehenderit, qui inea voluptate velit esse,
+# quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo
+# voluptas nulla pariatur? At vero eos et accusamus et iusto odio
+# dignissimos ducimus, qui blanditiis praesentium voluptatum deleniti
+# atque corrupti, quos dolores et quas molestias excepturi sint, obcaecati
+# cupiditate non-provident, similique sunt in culpa, qui officia deserunt
+# mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum
+# facilis est et expedita distinctio. Nam libero tempore, cum soluta
+# nobis est eligendi optio, cumque nihil impedit, quo minus id, quod
+# maxime placeat, facere possimus, omnis voluptas assumenda est, omnis
+# dolor repellendus. Temporibus autem quibusdam et aut officiis debitis
+# aut rerum necessitatibus saepe eveniet, ut et voluptates repudiandae
+# sint et molestiae non-recusandae. Itaque earum rerum hic tenetur a
+# sapiente delectus, ut aut reiciendis voluptatibus maiores alias
+# consequatur aut perferendis doloribus asperiores repellat.
+# ..
+# .P
+# .M 4
+
+output=$(echo "$input" | "$groff" -mm -mmse -Tps)
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/contrib/mm/tests/place-equation-labels-correctly-in-displays.sh b/contrib/mm/tests/place-equation-labels-correctly-in-displays.sh
new file mode 100755
index 0000000..1970397
--- /dev/null
+++ b/contrib/mm/tests/place-equation-labels-correctly-in-displays.sh
@@ -0,0 +1,62 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo FAILED >&2
+ fail=YES
+}
+
+# Regression-test Savannah #62190. Check left- and center-aligned
+# displayed equations as well.
+
+input='.DS L
+.EQ (1)
+p = q
+.EN
+.DE
+.DS I
+.EQ (2)
+w = z
+.EN
+.DE
+.DS C
+.EQ (3)
+x = y
+.EN
+.DE'
+
+output=$(printf "%s\n" "$input" | "$groff" -e -mm -Tascii -P-cbou)
+
+echo "checking left-aligned displayed equation" >&2
+echo "$output" | grep -Eq 'p=q {54}\(1\)' || wail
+
+echo "checking indented displayed equation" >&2
+echo "$output" | grep -Eq 'w=z {49}\(2\)' || wail
+
+echo "checking centered displayed equation" >&2
+echo "$output" | grep -Eq 'x=y {26}\(3\)' || wail
+
+test -z "$fail" || exit 1
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/contrib/mm/tests/remove-stale-bib-entry-data.sh b/contrib/mm/tests/remove-stale-bib-entry-data.sh
new file mode 100755
index 0000000..5fb68e6
--- /dev/null
+++ b/contrib/mm/tests/remove-stale-bib-entry-data.sh
@@ -0,0 +1,72 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo FAILED >&2
+ fail=YES
+}
+
+# Regression-test Savannah #60657. Ensure data from a bibliographic
+# entry don't carry over to the next.
+
+# Locate directory containing our test artifacts.
+artifact_dir=
+
+for buildroot in . .. ../..
+do
+ d=$buildroot/contrib/mm/tests/artifacts
+ if [ -d "$d" ]
+ then
+ artifact_dir=$d
+ break
+ fi
+done
+
+# If we can't find it, we can't test.
+test -z "$artifact_dir" && exit 77 # skip
+
+input=".R1
+bibliography $artifact_dir/60657.ref
+.R2"
+
+output=$(echo "$input" | "$groff" -R -mm -Tascii -P-cbou)
+
+echo "checking first entry"
+echo "$output" \
+ | grep -q "1\. First Author in First Book\. Test one\.$" \
+ || wail
+
+echo "checking second entry"
+echo "$output" \
+ | grep -q "2\. Second Author in Second Book\.$" \
+ || wail
+
+echo "checking third entry"
+echo "$output" \
+ | grep -q "3\. Third Author\.$" \
+ || wail
+
+test -z "$fail" || exit 1
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/contrib/mm/tests/short-pages-do-not-overflow-stack.sh b/contrib/mm/tests/short-pages-do-not-overflow-stack.sh
new file mode 100755
index 0000000..4be0e13
--- /dev/null
+++ b/contrib/mm/tests/short-pages-do-not-overflow-stack.sh
@@ -0,0 +1,59 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo FAILED >&2
+ fail=YES
+}
+
+# Regression-test Savannah #24048. Pages that are too short to
+# accommodate minimal header and footer requirements should not cause
+# infinite trap recursion.
+
+input='.COVER
+.TL
+Title
+.AU "R. Thurston Howell"
+.AT "Professor of Agnotology" "Publisher, Posterior Analytics Weekly"
+.COVEND
+.P
+Main matter goes here.'
+
+echo "checking that sample document fits using default length" >&2
+output=$(printf "%s\n" "$input" \
+ | "$groff" -b -mm -Tascii -P-cbou) || wail
+
+echo "checking that sample document fits using -rL5v" >&2
+output=$(printf "%s\n" "$input" \
+ | "$groff" -b -rL5v -mm -Tascii -P-cbou) || wail
+
+echo "checking that sample document fails gracefully using -rL4v" >&2
+error=$(printf "%s\n" "$input" \
+ | "$groff" -b -rL4v -mm -Tascii -P-cbou -z 2>&1)
+# Assume that >= 10 lines of stderr must be due to a giant backtrace.
+test $(echo "$error" | wc -l) -lt 10 || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/contrib/mom/BUGS b/contrib/mom/BUGS
new file mode 100644
index 0000000..6e7a828
--- /dev/null
+++ b/contrib/mom/BUGS
@@ -0,0 +1,985 @@
+ -*- text -*-
+ Copyright 2004-2020 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+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@schaffter.ca
+
+If writing me directly, please include the word "groff" or "mom" in
+the Subject line or you risk my spam filters nuking your message.
+
+--Peter Schaffter
+
+====================================================================
+
+Version 2.5_c
+=============
+
+#R_MARGIN not being respected in PAGEWIDTH.
+---Fixed---
+
+Version 2.5_b
+=============
+PAGINATE not restoring page numbers after being disabled.
+---Fixed---
+
+Sentence space not being restored after a terminating REF.
+---Fixed---
+
+CODE <OFF> not always correctly restoring point size of text
+afterwards.
+---Fixed---
+
+BLANKPAGE broken when columns are enabled.
+---Fixed---
+
+Registers #FROM_COVERTITLE and #FROM_DOC_COVERTITLE not being
+cleared in macro COLLATE.
+---Fixed---
+
+DROPCAP not calculating distance to FOOTER trap correctly.
+---Fixed---
+
+Version 2.5
+===========
+
+Page offset not being restored correctly after CENTRE_BLOCK.
+---Fixed---
+
+LEFT_HANG intermittently causing type to be raised out of position.
+---Fixed---
+
+$CHAPTER_STRING default not being set in COPYSTYLE.
+---Fixed---
+
+When using mom bare metal, NEWPAGE depositing a superfluous blank
+page unless B_MARGIN has been set explicitly.
+---Fixed---
+
+Version 2.4-4_e
+===============
+
+LANDSCAPE arg to PAPER not being appended to $PAPER so PAPER
+isn't picking it up when PAPER is called at the top of DEFAULTS.
+---Fixed---
+
+BLANKPAGE with NULL arg printing incorrect page number when page
+numbering is restored.
+---Fixed---
+
+BLANKPAGE with DIVIDER arg spitting out one too many pages.
+---Fixed---
+
+Hyphens appearing mid-line in runon footnotes.
+---Fixed---
+
+Version 2.4-4_b
+===============
+SMALLCAPS introducing a small indent equal to a wordspace when
+called after PP.
+---Fixed---
+
+Version 2.4-4_a
+===============
+BIBLIOGRAPHY_SPACING not being respected.
+---Fixed---
+
+Version 2.4-4
+=============
+Default PAPER settings overwriting user-entered PAGEWIDTH,
+PAGELENGTH, and PAGE.
+---Fixed---
+
+QUOTE and BLOCKQUOTE indents shifting after page breaks.
+---Fixed---
+
+Version 2.4-3
+=============
+TYPEWRITE: Inline \*[PREV] calling \*[ULX] without explicitly
+returning to TYPEWRITER font.
+---Fixed---
+
+%u field in refer databases not triggering ref*type 0 (Internet
+reference).
+---Fixed---
+
+Idem field of refer databases overwriting first occurrence of author
+name.
+---Fixed---
+
+Captions not fully respecting TYPEWRITE.
+---Fixed---
+
+COVERTEXT not fully respecting TYPEWRITE.
+---Fixed---
+
+Changes to font family inside a COVERTEXT block not being reset to
+default document family when the block is terminated.
+---Fixed---
+
+Unwanted linespace before labels above tables.
+---Fixed---
+
+Label number of AUTOLABEL_TABLES incrementing by 2 instead of 1.
+---Fixed---
+
+Page number of the page before a bibliography not printing.
+---Fixed---
+
+Version 2.4-1
+=============
+tbl not respecting pre-tbl fill mode.
+---Fixed---
+
+COVER and DOC_COVER not always capturing pertinent title and
+copyright.
+---Fixed---
+
+Version 2.4
+===========
+BIBLIOGRAPHY output broken.
+---Fixed---
+
+Version 2.3
+===========
+.PS/.PE not working at start of documents without a preceding .PP.
+---Fixed---
+
+Output of .PS/.PE not centered correctly (the default).
+---Fixed---
+
+Version 2.2-a
+=============
+Omitting postfixed digit from ROMAN/roman args to LIST not
+generating warning.
+---Fixed---
+
+FOOTERS causing infinite loop.
+---Fixed---
+
+Version 2.2
+===========
+COVERTITLE not picking up style params.
+---Fixed---
+
+FORCE_RECTO and BLANKPAGES not co-operating.
+---Fixed---
+
+TOC and LISTS_OF leading not being picked up and/or adjusted
+properly.
+---Fixed---
+
+PDF outline putting first doc ahead of TOC in PDF outline when
+TOC is auto-relocated and COVER has the BLANKPAGE arg.
+---Fixed---
+
+Version 2.1-b
+=============
+Toggling of pagination broken.
+---Fixed---
+
+HEADERS_AND_FOOTERS printing footer at top of second page instead of
+printing header unless FOOTER_ON_FIRST_PAGE is called.
+---Fixed---
+
+Version 2.1-a
+=============
+
+Some part-by-part formatting changes to headers not being recognized
+when global header options have been invoked.
+---Fixed---
+
+Version 2.1
+===========
+
+UNDERSCORE adding an extra space after underlined text.
+---Fixed---
+
+bug #44903: 2 column output misplaced
+---Fixed---
+
+PDF_IMAGE and FLOAT environments conflicting.
+---Fixed---
+
+DROPCAP picking up color from last call to .gcolor.
+---Fixed---
+
+PAD not working properly with mom's indent macros.
+---Fixed---
+
+Margin notes not respecting differing recto-verso margins.
+---Fixed---
+
+Graphical object macros not clearing fill/no-fill registers and
+modes.
+---Fixed---
+
+LIST ALPHA emitting a number register to output.
+---Fixed---
+
+HEADER_PLAIN and FOOTER_PLAIN broken.
+---Fixed---
+
+Version 2.0-c_1
+===============
+
+.TS with no H causing FN_OVERFLOW warning when there are footnotes
+on same page.
+---Fixed---
+
+PDF_TARGET "descriptive text" not printing.
+---Fixed---
+
+Version 2.0-c
+=============
+
+Endnotes page offset wrong if (BLOCK)QUOTE last macro before
+ENDNOTES.
+---Fixed---
+
+Character translation of diacritics from lowercase to caps broken.
+---Fixed---
+
+Spacing not being restored (.ns/.rs) after a HEADING that falls at
+the top of the page.
+---Fixed---
+
+Version 2.0-b
+=============
+
+When line numbering is enabled, line numbers after QUOTE being reset
+to '0'.
+---Fixed---
+
+When line numbering is enabled for QUOTE and BLOCKQUOTE, style
+params for line numbers not being applied.
+---Fixed---
+
+TOC overprinting footer when it comes immediately after
+BIBLIOGRAPHY.
+---Fixed---
+
+TOC page numbers not printing when positioned at top of page.
+---Fixed---
+
+TOC page numbers not always incrementing properly.
+---Fixed---
+
+Version 2.0-a_1
+===============
+
+QUOTE_INDENT not being respected in FLOAT.
+---Fixed---
+
+SMARTQUOTES OFF broken.
+---Fixed---
+
+DOCHEADER_LEAD being reset to default after first chapter.
+---Fixed---
+
+Forced floats that fit on the page causing floats on the next page
+to be treated as forced.
+---Fixed---
+
+Forced floats not advancing on the page after output if the float is
+forced to the next page, causing running text to overprint.
+---Fixed---
+
+Text after deferred floats not being shimmed properly.
+---Fixed---
+
+Tables that span pages overprinting first two lines of table on new
+pages.
+---Fixed---
+
+PDF_IMAGE not respecting .IL, .IR, or .IB.
+---Fixed---
+
+AUTOLEAD not sticking after .START.
+---Fixed---
+
+Version 2.0-a
+=============
+
+Footer not printing on first page when HEADERS_AND_FOOTERS enabled.
+---Fixed---
+
+$AUTHOR string missing.
+---Fixed---
+
+Version 2.0
+===========
+
+tbl macros .TS/.TE not working unless inside a float.
+---Fixed---
+
+Terminal period after page number(s) in refer items not always
+printing.
+---Fixed---
+
+====================================================================
+
+Version 1.6-a
+===========
+
+Footnotes on last page of columnar docs before a TOC getting printed
+at bottom of last column, not current column.
+--Fixed---
+
+HEADER_RULE OFF turning off headers completely.
+---Fixed---
+
+FINIS depositing a blank final page when invoked too close to the
+bottom margin.
+---Fixed---
+
+Version 1-6
+===========
+
+ENDNOTE_STRING_CAPS not disabling caps when arg given.
+---Fixed---
+
+Superfluous blank line before paragraphs with paraheads.
+---Fixed---
+
+Paraheads causing line numbering to overprint two line numbers.
+---Fixed---
+
+Endless loop when DOC_LEAD_ADJUST is disabled.
+---Fixed---
+
+In the case where the list doesn't fit the page, -mom inserts
+an extra page with one word and a warning about "environment stack
+underflow" and then continues on the following page.
+--Fixed--
+
+PRINTSTYLE TYPEWRITE not respecting TYPEWRITER_FAMILY when DOCTYPE
+is LETTER.
+---Fixed---
+
+Version 1.5-d
+=============
+
+ILX not quitting left indents set within ITEM.
+---Fixed----
+
+Version 1.5-c
+=============
+
+COVER_COUNTS_PAGES incrementing pagenum by 1 too many.
+---Fixed---
+
+HEADER/FOOTER_RECTO strings vanishing when the default CAPS option
+is turned off.
+---Fixed---
+
+TQ not removing QUAD arg from cleared tabs.
+---Fixed---
+
+DROPCAP_OFF trap remaining in effect after dropcap has been
+processed.
+---Fixed---
+
+PARAHEAD_SIZE 0 resulting in 0-sized type!
+---Fixed---
+
+When DOC_LEAD is called to change document leading in collated docs,
+document leading steadily increases by small amounts at each
+subsequent call to COLLATE.
+---Fixed---
+
+(DOC_)COVER requests annihilating families used in various document
+elements if those families differ from the document's overall
+family.
+---Fixed---
+
+Covers and doccovers not always respecting null pagenumbering.
+--Fixed---
+
+Version 1.5-b
+=============
+Use of \E*[UC] and \E*[LC] inside strings for HDRFTR_RECTO and
+HDRFTR_VERSO breaking headers.
+---Not fixable. CAPS option added to HDRFTR_RECTO/VERSO to
+ accommodate situations where capitalized reserved
+ strings(\*[$TITLE], \*[$AUTHOR], etc) are desired.---
+
+COLLATE depositing a blank page if last output line before it falls
+at the bottom of running text.
+---Fixed---
+
+PRINTSTYLE TYPEWRITE not setting $FAMILY or $FONT or $PP_FT, with
+consequences for COLLATE.
+---Fixed---
+
+FOOTNOTE_MARKERS OFF not disabling footnote markers if used before
+START.
+---Fixed---
+
+1st footnotes with overflow vanishing altogether with an
+"automatically ending diversion 'FN_OVERFLOW' on exit" warning.
+---Fixed---
+
+Right hand margin notes vanishing when an RH margin note overflows
+to the next output page.
+---Fixed (I think)---
+
+Doc bug; \*[S<size>] escape incorrectly typed as \*S[<size>] in the
+section on mom's inlines.
+---Fixed---
+
+Paragraphs inside blockquotes not being spaced when .PARA_SPACE is
+active.
+---Fixed---
+
+Version 1.5-a
+=============
+Indenting of references (collected with .REF) on endnotes pages when
+endnote numbers are right-aligned appears to be backwards; the
+first line of the reference is indented more than the second.
+---Fixed---
+
+Version 1.5
+===========
+DROPCAP not printing the dropcap letter at all in PRINTSTYLE
+TYPEWRITE, nor when DROPCAP is used (accidentally?) after a valid
+"first" paragraph.
+---FIXED---
+
+DROPCAP going into an infinite loop when groff called with the
+-Tascii switch.
+---FIXED---
+
+SHIFT_LIST, when used anywhere but with a top-level list, is killing
+list indents for every list level *returned to* afterward.
+---Fixed---
+
+TOC page number for heads and subheads that get bumped to next page
+(because of .ne) off by 1.
+---Fixed---
+
+Moving backwards in nested lists not setting the proper indent.
+---Fixed---
+
+Default linebreak color missing in om.tmac.
+---Fixed---
+
+Some links in macrolist.html not pointing to html "name" owing to
+missing # in link names.
+---Fixed---
+
+Version 1.4-b
+=============
+Line lengths and indents not always being respected in LIST.
+---Fixed---
+
+CAPS OFF, called inline with \*[CAPS OFF] not working.
+(Added two new inlines, \*[UC] and \*[LC], to do the job.)
+---Fixed---
+
+When type is set after START but no docelement tag given, the
+expected family ($DOC_FAMILY) and font (R) are not in effect.
+---Fixed---
+
+When DOCTYPE is CHAPTER and .TITLE is omitted after .COLLATE, the
+title vanishes from page headers/footers.
+---Fixed---
+
+Version 1.4-a
+=============
+In collated documents, when using a different HEADER_FAMILY,
+if BLANKPAGE <n> is given after COLLATE (but before START) all
+subsequent text is set in the HEADER_FAMILY face rather than the
+standard text face.
+---Fixed---
+
+Document title identification string missing on endnotes pages when
+the endnote marker style is LINE.
+---Fixed---
+
+Space between endnote items on endnotes output pages not being
+inserted.
+---Fixed---
+
+Version 1.4
+===========
+Invoking .FOOTERS isn't automatically putting pagination in the top
+margin.
+---Fixed---
+
+.PP_FONT after .COLLATE not being respected.
+---Fixed---
+
+$SAVED_PP_FT not being fed to .FT in .PP after .COLLATE
+---Fixed---
+
+.CODE OFF not always restoring previous family and font.
+---Fixed---
+
+.ITEM, when not in a list, should do nothing.
+---Fixed---
+
+Version 1.3-e_3
+===============
+ENDNOTES is not, by default, printing headers on endnotes pages.
+---Fixed---
+
+Processing of the "Endnotes" title for the TOC is putting the
+page number 1 line too high and not inserting leader.
+---Fixed---
+
+Collated docs not respecting $PP_FT (it's picking up the font from
+the pagenumber font)
+---Fixed---
+
+Docheader spacing sometimes depositing too much space between
+various docheader elements in TYPEWRITE when DOCTYPE is DEFAULT or
+NAMED.
+---Fixed---
+
+When COLUMNS are on, subheads that are deferred to the next
+column/page because there isn't enough room for the s/h and one
+line of text are causing columns to overprint.
+---Fixed---
+
+HDRFTR_LEFT printing one line too high when .HEADER_COLOR is used.
+---Fixed---
+
+DOCTITLE link broken in the docs.
+---Fixed---
+
+Version 1.3-e_2
+===============
+TOC formatting incorrect when the pound/number sign (#) is used in
+head elements.
+---Fixed---
+
+[Documentation]: The docs erroneously state that TOC control macros
+can be entered anywhere in a file prior to invoking TOC (they should
+be entered before START).
+---Fixed---
+
+Page numbers in the bottom margin being printed too low on output
+pages preceding an invocation of COLLATE or macros that call it.
+---Fixed---
+
+A superfluous blank, numbered page is being generated by COLLATE
+(and macros that call it, namely TOC and ENDNOTES) when the last
+line of output text before it falls on the last valid baseline of
+an output page. Same thing happening occasionally with normal
+document termination.
+---Fixed---
+
+SHIFT_LIST not being observed when moving *back* to a shifted list;
+the list is reverting to the left margin.
+---Fixed---
+
+NUMBER_SUBHEADS not working with TYPESET when PARA_SPACE is on.
+---Fixed---
+
+Version 1.3-e_1
+===============
+Missing #COLLATE register (accidentally wiped out) creating various
+problems with .COLLATE (missing headers, leading increasing
+slightly each time .COLLATE invoked, etc).
+---Fixed---
+
+Version 1.3-e
+=============
+mom failing during groff build while processing
+examples/typesetting.mom
+---Fixed---
+
+Windows user reports COLLATE fails with a bottom margin error
+(generated by mom).
+---Fixed---
+
+Version 1.3-d
+=============
+Small error in the examples of output in the "Footnotes and
+Punctuation" documentation section.
+---Fixed----
+
+PAD_LIST_DIGITS/SHIFT_LIST broken when the enumerator type is
+roman or ROMAN.
+---Fixed---
+
+COLLATE wiping out <doc element>_FAMILY settings.
+---Fixed---
+
+DOC_LEAD_ADJUST OFF not being observed when COLLATE is invoked.
+---Fixed---
+
+DROPCAP setting the dropcap too high in initial paragraph after a
+COLLATE.
+---Fixed---
+
+Version 1.3-c
+=============
+Owing to a superfluous "if" in the FONT macro, the "missing font"
+routine is being silently ignored.
+---Fixed---
+
+FOOTNOTE, used in nofill mode, adds a linebreak between the
+marker and the text of the footnote.
+---Fixed---
+
+Version 1.3-b
+=============
+
+ITALIC_MEANS_ITALIC not being respected when DOCTYPE LETTER.
+---Fixed---
+
+Underlining of italic passages in PRINTSTYLE TYEPWRITE not spanning
+pages.
+---Fixed---
+
+PRINTSTYLE TYPEWRITE depositing extra space on new pages above quotes
+that span pages.
+---Fixed---
+
+MN doesn't accept OFF, QUIT, END, X, etc.
+---Fixed---
+
+Margin notes that begin flush with the last line of text on a page
+are running down the same page, instead of the remainder being
+collected and output on the next.
+---Fixed---
+
+MN sometimes erroneously dropping margin notes near the bottom of
+a page, even when they'd fit. (MN-shifted not being removed by
+MN-top.)
+---Fixed---
+
+MN_INIT not accepting "" args for default values.
+---Fixed---
+
+Documentation for margin notes erroneously states that the first
+(optional) argument can be either "ragged" or "symmetric". S/b
+"RAGGED" or "SYMMETRIC".
+---Fixed---
+
+Use of "" to tell MN_INIT to use the default for any specific
+argument in the arg list broken.
+---Fixed---
+
+Paragraphs that begin with a "smart" double quote when the
+preceding paragraph has no corresponding close quote (i.e. dialogue
+passages containing multiple paragraphs) are starting off with a
+close quote.
+---Fixed---
+
+Version 1.3-a
+=============
+
+First baseline of type isn't going where it's supposed to when the
+docheader is turned off.
+---Fixed---
+
+Version 1.3
+===========
+
+Persistent error in html coding of docs (<nobr> 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 occurred 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 <distance> is given, if <distance> falls short
+of the top margin of running text, <distance> 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 SMARQUOTES 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..82e5dbb
--- /dev/null
+++ b/contrib/mom/ChangeLog
@@ -0,0 +1,1788 @@
+2023-06-15
+
+ * om.tmac: Enclose all calls to \D't n' in \Z
+
+2023-03-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ [mom]: Generate test script even if we'll skip it.
+
+ * examples/test-mom.sh.in: Check availability of required
+ pdfinfo(1) and pdfimages(1) commands at test time; skip if they
+ aren't present.
+ * mom.am [!HAVE_PDFTOOLS]: Generate the test script even if
+ these tools aren't available.
+
+2023-02-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * mom.am (uninstall_mom): Clean more fastidiously; try to remove
+ the configured `pdfdocdir` in the event it is empty, but do not
+ fail if it isn't. (It can be a directory shared with other
+ groff components; we don't know in what order the uninstall
+ targets will serialize, but the last one run should succeed.)
+
+2023-02-02
+ * om.tmac (UNDERSCORE, UNDERSCORE2): Add PREFIX and SUFFIX
+ arguments so surrounding punctuation can be protected from
+ underscoring.
+
+2023-01-16
+ * om.tmac (PRINTSTYLE): Abort with message if nroff is called on
+ a document using PRINTSTYLE TYPESET.
+
+ Fixes <https://savannah.gnu.org/bugs/?63581>. Thanks to Gene
+ for the report.
+
+2022-11-16
+
+ * om.tmac (PAPER): Adjust #R_MARGIN to work with papersize.tmac.
+
+2022-10-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * om.tmac (FORCE_RECTO): Use backslash before newline when
+ starting multi-line conditional block.
+
+2022-09-02
+
+ * examples/mom-pdf.mom: Fixes missing parameter to \*[SIZE] at
+ line 457.
+
+ * om.tmac: Fixes CODE <anything> not restoring point size
+ correctly. The point size was being stored in a number register
+ instead of a string.
+
+ * BUGS: Updated.
+
+ Fixes <https://savannah.gnu.org/bugs/?62996>.
+
+2022-08-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * mom.am (MOMPDFMOM): Pass `PDFMOMBIN` '-K utf8', not '-k', in
+ case 'configure' didn't find uchardet.
+
+ Fixes <https://savannah.gnu.org/bugs/?62975>. Thanks to Bjarni
+ Ingi Gislason for the report.
+
+2022-05-31
+
+ * Make mom emit a warning and abort when tbl(1) data present
+ without a corresponding -t on the command line.
+
+2022-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * momdoc/appendices.html: Reflect file rename in groff
+ distribution: the name of the file mapping Adobe Glyph List
+ names to groff special character identifiers for text (as
+ opposed to "special") fonts has changed from "textmap" to
+ "text.map".
+
+2022-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * mom.am (MOMPROCESSEDEXAMPLEFILES): Include "typesetting.pdf"
+ only if `HAVE_URW_FONTS`, since the document demands them.
+
+2022-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * mom.am: Rename `BUILD_PDFDOC` to `USE_GROPDF`.
+
+2022-05-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * mom.am ($(MOMPROCESSEDEXAMPLEFILES)): Depend on new name for
+ devpdf stamp file.
+
+2022-04-12 Ingo Schwarze <schwarze@openbsd.org>
+
+ Delete the harmful, ill-designed, buggy, and essentially
+ unmaintained and untested --with-doc option of the configure
+ script. See the NEWS file for more details on the rationale.
+
+ * mom.am: Delete one INSTALL_SHIPPED_HTML and one BUILD_EXAMPLES
+ conditional and use BUILD_PDFDOC instead of BUILD_PDFEXAMPLES.
+
+2021-03-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * mom.am: Eliminate `MOM_TFLAG` and `MOM_PFLAG` Make macros;
+ they were expanded in only one place.
+ (MOMPDFMOM): Track rename of Make macro `TFLAG` to `MFLAG`.
+
+2022-03-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * mom.am (MOMPROCESSEDEXAMPLEFILES): Drop dependency on gnu.eps.
+ No mom document appears to require this file; it came in with
+ the initial Automake file for mom in commit 4d84d0f1d, 27
+ January 2015, and may have been a copy-and-paste error.
+
+2021-10-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * mom.am (mom_test_template): Pull file name into a new
+ variable.
+ (EXTRA_DIST, contrib/mom/examples/tests-mom.sh): Use it.
+ (contrib/mom/examples/tests-mom.sh): Build more quietly;
+ prefix rule with `$(AM_V_GEN)`. Also run `chmod` conditionally.
+
+2021-10-04
+
+ * version 2.5 release (see NEWS)
+
+ * removed orphaned stubs for abandoned cutaround feature from
+ om.tmac
+
+2019-12-26
+
+ * added PREFIX_CHAPTER argument to HEADING_STYLE
+
+ * added TOC_HEADING; single line, non-pagenumbered insertions into
+ the TOC
+
+2019-11-03
+
+ * templates added for setting up copyright pages
+
+ * updated mom.am to include the templates when building
+ pdfs in mom/examples
+
+2018-11-24
+
+ * version 2.4 release (see NEWS)
+
+2018-09-05
+
+ * improved grap support
+
+2018-03-04
+
+ * version 2.3 release (see NEWS)
+
+2018-02-28 Werner LEMBERG <wl@gnu.org>
+
+ * mom.am (.mom.pdf): Use $(GROFF_V).
+
+2017-11-04 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * mom.am: Drop unnecessary -M flag; build tree has what it needs.
+
+2017-10-29 Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+ * om.tmac-u: Fix typo in register reference.
+
+ Fix bug https://savannah.gnu.org/bugs/?51608.
+
+2015-08-22 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * groff_mom.7.man: Rename `groff_mom.man'.
+
+ * mom.am: Include renaming.
+
+2015-08-05 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * mom.am: Add `Last update'. Setup Emacs mode.
+
+* Sun Jul 26 2015
+
+ o Fix to header part-by-part changes.
+
+* Mon Apr 27 2015
+
+ o version 2.1-a release (see NEWS)
+
+* Fri Apr 4 2015
+
+ o groff_mom.man: Make it work in compatibility mode.
+
+* Sat Feb 28 2015
+
+ o Added an ADJUST argument to QUOTE and BLOCKQUOTE to facilitate
+ optical centering tweaks
+
+* Sat Feb 21 2015
+
+ o Expanded scope of _STYLE macros to headers/footers and
+ page numbers
+
+* Thu Feb 5 2015
+
+ o Version 2.1 release (see NEWS)
+
+ o overhaul of control macro handling
+
+ o overhaul of cover and docheader management
+
+ o general code cleanup to remove redundancies and reduce size of
+ om.tmac
+
+ o changes to example files to demonstrate new features
+
+ o copyrights updated in all files
+
+* Tue Jan 14 2015
+
+ o Added a new example in French, mon_premier_doc.mom
+
+ o Added README-fr.txt, a translation in French of the README.txt file
+
+ o Makefile.sub: generation of mon_premier_doc.mom, installation of
+ README-fr.txt
+
+* Sun Nov 30 2014
+
+ o Added auto underscoring, caps, and color to TOC header
+ (first-page titles)
+
+ o Added vertical page positioning control macros for TOC and
+ ENDNOTES headers (first-page titles)
+
+* Tue Nov 25 2014
+
+ o Tweak so collated, non-chapter docs with the same author
+ don't require .AUTHOR "" to skip printing author in docheader
+
+* Wed Oct 29 2014
+
+ o Makefile.sub: KFLAG to run pdfmom with -k
+
+ o Set utf-8 preconv coding tag in examples/typesetting.mom and
+ examples/letter.mom
+
+* Mon Oct 20 2014
+
+ o Changes to caption/label/source quadding strategy.
+
+* Wed Sep 03 2014 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ o all files in contrib/mom source: Copying and Emacs setting.
+
+ o contrib/mom source/ChangeLog: Repair file. The file runs now in
+ Emacs change-log mode.
+
+* Tue Aug 12 2014
+
+ o Makefile.sub (stamp-strip): Set LANG=C LC_ALL=C when calling
+ `sed'.
+
+ This prevents a build error on OS X.
+
+* Thu Apr 3 2014
+
+ o Makefile.sub: Set LC_ALL=C when calling $(PDFMOM).
+
+ Doing so in an UTF-8 locale with $PERL5OPT=-C set avoids warnings
+ like
+
+ utf8 "\xF5" does not map to Unicode at\
+ [.]src/devices/gropdf/gropdf line 1359, <PD> line 63.
+ Malformed UTF-8 character (unexpected end of string)\
+ in substitution (s///) at\
+ [.]src/devices/gropdf/gropdf line 1315, <PD> line 63.
+
+* Sat Mar 29 2014
+
+ o Makefile.sub: Handle examples separately, controlled by
+ $(make{_,_install_,_uninstall_}examples).
+
+* Wed Mar 26 2014
+
+ o Added user settable space to PARA_SPACE.
+
+* Tue Mar 11 2014
+
+ o Makefile.sub (MAN7): Do not install empty `mom.7' (tiny change).
+
+ A mom(7) manual got briefly added, then promptly removed again in
+ 9f38f05e58d31eda1affce01d1144760b5f48096 for integration into
+ groff_mom(7), but it was forgotten to remove it from the list of
+ manual pages to install.
+
+* Fri Feb 28 2014
+
+ o Reworked handling of pdf-images. Preprocessor support expanded
+ to include eqn and pic. Spacing and placement of tbl output
+ improved. Fixed floats in columns. Added facilities for captions
+ and labels for pdf-image, eqn, pic, and tbl. Added auto-generated
+ "Lists of".
+
+* Wed Oct 30 2013
+
+ o Expanded and improved float/tbl handling.
+
+* Sat Sep 14 2013
+
+ o .TS/.TE extended to support multi-page tables with headers.
+
+* Sat Aug 24 2013
+
+ o Restored reserved.html to toc.html in docs.
+
+* Tue Aug 20 2013
+
+ o Integrate mom.7 into the man-page groff_mom.7
+
+* Tue Aug 20 2013
+
+ o New man page mom.7
+
+* Sun Aug 11 2013
+
+ o Updated documentation concerning refer usage
+
+ o Replaced REF_STYLE and REF<bracket-style> macros with warnings.
+
+* Wed Jun 19 2013
+
+ o groff_mom.man: Fix inappropriate use of .UR/.UE.
+
+* Fri Jan 4 2012
+
+ o Makefile.sub (install_data): Create directory for PDF
+ documentation. This is necesssary in case GhostScript is not
+ available, and no other PDF files have been created yet.
+
+* Sun Dec 30 2012
+
+ o Makefile.sub (install_data): Fix symlink.
+ Patch from Elias Pipping <pipping@lavabit.com>.
+
+* Thu Sep 20 2012
+
+ o Simplify environment handling.
+
+* Fri Aug 31 2012
+
+ o Version 2.0 release. Changes documented in version-2.html in
+ the html documentation.
+
+ o Added new documentation, Producing PDFs with groff and mom.
+
+* Sat Feb 18 2012
+
+ o Added choice to have DOCTYPE NAMED <name> underscored or not
+ when PRINTSTYLE TYPEWRITE
+
+ o Doc fix to DOCTYPE NAMED underlining entry
+
+* Thu Sep 8 2011
+
+ o Added register #SUBHEAD, analogous to #HEAD, to fix excessive
+ spacing between SUBHEADs and SUBSUBHEADs.
+
+* Sun Feb 20 2011
+
+ o Added support for sub-subheads from patch supplied by Petr Man.
+
+* Fri Feb 11 2011
+
+ o Moved register #UNADJUSTED_DOC_LEAD to top of TRAPS macro.
+
+* Fri Nov 19 2010
+
+ o Added utility macro, SINGE_SPACE, for PRINTSTYLE TYPEWRITE
+
+* Sat Jan 22 2011
+
+ o groff_mom.man (FILES): Fix directory locations.
+
+* Sun Oct 3 2010
+
+ o Complete overhaul of refer macros and documentation
+
+ o Inclusion of Tadziu Hoffman's postscript code for underlining
+
+* Wed Aug 18 2010
+
+ o Complete overhaul of documentation
+
+* Thu Aug 5 2010
+
+ o Changes to COVER and DOCCOVER for greater flexibility in
+ placement of elements
+
+ o Improved handling of MISC info on cover pages for greater style
+ flexibility
+
+ o Added _FAMILY, _FONT, _SIZE and _COLOR control macros for CODE
+
+* Mon July 6 2009
+
+ o Added CLOSING_INDENT and SIGNATURE_SPACE to DOCTYPE LETTER
+ macros.
+
+* Sun Jun 14 2009
+
+ o DROPCAP handling changed; uses local vertical motions now
+ instead of .mk/.rt.
+
+ o Added macro SUPERSCRIPT_RAISE_AMOUNT
+
+ o Added registers and strings to keep track of .RW and .EW and the
+ amounts passed to them.
+
+* Sat May 2 2009
+
+ o Fixed error in docs: COVERS_COUNT_PAGES changed to
+ COVER_COUNTS_PAGES. Ditto DOC_COVERS_COUNT_PAGES.
+
+* Fri May 1 2009
+
+ o Fixed PARAHEAD size so it properly adds the value of
+ \*[$PH_SIZE_CHANGE] to \n[#DOC_LEAD].
+
+* Sat Jan 17 2009
+
+ o Changed FAMILY, FT and PT_SIZE requests in DO_COVER to groff
+ primitives (fam, ft and ps respectively). Fixes (DOC_)COVER bug
+ where (DOC_)COVER was resetting families and fonts of various
+ document elements (QUOTE, BLOCKQUOTE, etc) to document default.
+
+ o Removed (excessive) cleanup of (doc)cover and docheader strings
+ and registers from macro CLEANUP. Changes to mom's default style
+ for these document elements now survive COLLATE.
+
+* Fri Jan 2 2009
+
+ o Added possibility of quadding docheader left or right, as well
+ as center, which remains the default.
+
+* Wed Dec 31 2008
+
+ o Default definition of $QUOTE0 and $QUOTE1 in om.tmac changed
+ from \[dq] to \[lq] and \[rq], respectively.
+
+* Sun Jan 4 2009
+
+ o Makefile.sub (CLEANADD): Add om.tmac-s.
+
+* Tue Dec 30 2008
+
+ o Doc fixes in toc.html
+
+ o Control of null pagenumbering of covers passed to \n%; formerly
+ handled by \n[#PAGE_NUM_ADJ]
+
+* Tue Dec 23 2008
+
+ o Added a CAPS option to HDRFTR_RECTO and HDRFTR_VERSO to allow
+ capitalization of reserved strings when designing recto and/or
+ verso headers. Fixed docs accordingly.
+
+* Sun Nov 30 2008
+
+ o Added .nr #DIVER_DEPTH 0 to end of PRINT_PAGE_NUMBER to ensure
+ that #DIVER_DEPTH=0
+
+ o Moved string definition of $FONT in macro FT to top of macro.
+
+ o Moved string definition of $FAMILY in macro FAMILY to top of
+ macro.
+
+ o Changed condition generating #NO_BREAK at top of macro COLLATE
+ from .if ( \\n[.t] < \\n[.v] ) \{ .nr #NO_BREAK 1 \} to .if (
+ (\\n[.t]-1) <= \\n[.v] ) \{ .nr #NO_BREAK 1 \}
+
+ (Bottom-of-page trap is tripped 1 unit below last valid baseline)
+ (not on it.)
+
+* Tue Nov 25 2008
+
+ o Commented out what appears to be a superfluous and destructive
+ resetting of #VARIABLE_FOOTER_POSITION at line 13347 in FOOTNOTE
+ macro. For now, fixes the "vanishing first footnote with some
+ overflow" bug.
+
+* Mon Oct 6 2008
+
+ o Added a bit to .PP to accommodate .PP_FONT I when PRINTSTYLE is
+ TYPEWRITE and ITALIC_MEANS_ITALIC
+
+* Mon Jun 30 2008
+
+ o Removed spurious 'sp |\\n[MN-curr-pos]u from MNbottom-right,
+ prior to re-invoking traps. Hopefully, fixes vanishing RH margin
+ notes bug.
+
+* Sun Mar 16 2008
+
+ o Added missing spaced paras bit in blockquotes.
+
+* Tue Jan 22 2008
+
+ o Fixed indent handling of refer items in endnotes.
+
+ o Amendations to refer.html.
+
+ o Removed dead email address from groff_mom.man.
+
+* Fri Jan 04 2008
+
+ o groff_mom.man: Replace .URL with .UR/.UE. Replace .MTO with
+ .MT/.ME. Insert `\:' in URLs where appropriate. Don't include
+ www.tmac.
+
+* Wed Sep 12 2007
+
+ o Fixed an oversight in DROPCAP that meant when DROPCAP needed to
+ be ignored, the dropcap letter itself was dropped from running
+ text altogether, instead of printing as a normal part of text.
+
+ o Added an .if n clause to DROPCAP to prevent mom from going into
+ an infinite loop when groff invoked with the -Tascii switch.
+
+* Wed Jul 25 2007
+
+ o Did a couple of doc fixes.
+
+ o Added vpt checks at the top of all the graphical object macros.
+ Basically, only turn vpt's off and on again if they're already
+ enabled.
+
+* Wed Feb 14 2007
+
+ o Moved .ne requests in HEAD and SUBHEAD to top of respective
+ macros, fixing bug that was gathering the wrong page number for
+ head and subhead toc entries.
+
+* Fri Nov 24 2006
+
+ o Added a default linebreak color (black)
+
+* Thu Sep 28 2006
+
+ o Fixed missing #'s in linknames in macrolist.html.
+
+* Mon Jul 31 2006
+
+ o Changed all .LLs in LIST to .ll requests.
+
+ o Added new macro, FINIS_STRING_CAPS, to control capitalization of
+ the finis string.
+
+ o Amended doc section on page set up to include directions for
+ telling groff about the physical dimensions of printer sheets.
+
+ o Added new arg to BLANKPAGE: NULL. If given, BLANKPAGE does not
+ increment the page number when outputting a blank page.
+
+ o Added new control macros, COVERS_COUNT_PAGES and
+ DOC_COVERS_COUNT_PAGES in case user wants covers counted in the
+ pagination scheme.
+
+ o Added new final arg to COVER and DOC_COVER: BLANKPAGE.
+ Instructs COVER or DOC_COVER to print a blank page after the
+ cover.
+
+ o Added new optional args to CODE: BR, BREAK, SPREAD. CODE can
+ now be called inline; if called as a macro and the user wants a
+ break or spread, s/he has to supply one of the args.
+
+ o Added new macro, CODE_FAMILY, to set fixed-width family used by
+ .CODE
+
+ o Made EDITOR an alias of AUTHOR
+
+ o Added optional arguments, COVER or DOC_COVER, to reference
+ macros that may be used on covers and doc covers, allowing users
+ greater flexibility in determining exactly what goes on covers and
+ doc covers without screwing up the doc header or the default page
+ headers/footers
+
+ o Added macros to control the weight and placement of all
+ underscore/underline rules used in typesetting and document
+ processing
+
+ o Added macros for drawing of rules, boxes and circles (ellipses)
+
+ o Added macro, RULE_WEIGHT, to control weight of rules drawn with
+ \*[RULE]
+
+ o General doc updates, additions, amendations and corrections
+
+ o Reformatted entirety of documentation to be xhtml clean
+
+ o Added inlines \*[UC] and \*[LC] to handle inline caps; corrected
+ doc entry stating that you can use \*[CAPS] and \*[CAPS OFF];
+ chief reason is to allow inline capitalization in strings passed
+ to header/footer definitions.
+
+* Fri Jul 7 2006
+
+ o Changed inline, \*[RULE], so that it always draws the rule one
+ linespace beneath the last output line. Formerly, \*[RULE] drew
+ the rule on the baseline of the current output line.
+
+* Sun Jul 2 2006
+
+ o Changed UNDERSCORE and UNDERSCORE2 to use groff's \D'l <n> <n>'
+ line drawing function.
+
+ o Changed RULE to use groff's \D'l <n> <n>' line drawing function.
+
+ o Added RULE_WEIGHT macro, to allow controlling weight of
+ \*[RULE], expressed in points (including fractional points).
+
+ o Added two new inlines, \*[UC] (all caps) and \*[LC]
+ (caps/lowercase). These can be used in user-defined header/footer
+ strings (if \E is used instead of just the backslash by itself) as
+ well as in normal copy.
+
+* Sat Jul 1 2006
+
+ o Added .FAMILY \\*[$DOC_FAMILY] and .FT R to the end of
+ .DEFAULT_DOCHEADER, .CHAPTER_DOCHEADER and .NAMED_DOCHEADER.
+ Fixes bug that was causing type which was set after .START when no
+ docelement tag given to be set in the last family and font used in
+ the docheader, instead of the expected $DOC_FAMILY and roman font
+ (R).
+
+* Fri Jun 30 2006
+
+ o Updated copyright file
+
+ o Massive documentation cleanup to make docs well-formed xhtml
+
+* Thu Jun 22 2006
+
+ o Rewrote portions of TITLE, COVERTITLE, DOCCOVERTITLE,
+ CHAPTER_TITLE, SUBTITLE and MISC so that when they're called from
+ .COLLATE, they properly clean out all associated strings and
+ registers. Fixes the "vanishing $TITLE" bug.
+
+ o Added missing .rm $AUTHORS to .AUTHOR. .as $AUTHORS now always
+ starts with a clean slate.
+
+* Wed Jun 14 2006
+
+ o Added a missing </nobr> tag to docelement.html.
+
+* Sat Jun 10 2006
+
+ o In header and footer routines, changed all .FAMILY calls when
+ .PRINTSTYLE TYPESET to .fam
+
+ o Fixed DOC_FAMILY so that PARAHEAD_FAMILY and LINENUMBER_FAMILY
+ are properly set to the new value.
+
+* Fri Jun 9 2006
+
+ o Re-worked .QUOTE_INDENT so that users can pass it an absolute
+ value (by adding a scaling indicator to the arg) instead of just a
+ value relative to the paragraph indent. Fixes bug (oversight?)
+ that meant QUOTES and BLOCKQUOTES got no indent at all if the
+ PP_INDENT was 0. Fixed EPIGRAPH_INDENT similarly.
+
+ o Added missing default ENDNOTE_LINENUMBER_FAMILY and _FONT to
+ DEFAULTS.
+
+* Thu Jun 8 2006
+
+ o Changed distance of the underscores used in docheaders when
+ PRINTSTYLE is TYPEWRITE from the default 2p to 4p. This is to
+ leave room for the descenders if the strings are caps/lowercase.
+
+* Wed Jun 7 2006
+
+ o Added strings $AUTHOR and $AUTHORS. $AUTHOR = $AUTHOR_1 (i.e.
+ the first arg passed to .AUTHOR); $AUTHORS = a comma-separated
+ concatenated string of all the args passed to .AUTHOR.
+
+* Tue Jun 6 2006
+
+ o Updated docs.
+
+ o Converted all .ig blocks in om.tmac to comment lines beginning
+ with \#. This so that the comments will be stripped from om.tmac
+ during make. The groff sources still contain the commented
+ version of om.tmac, as do the tarballs posted on mom's homepage.
+
+ o Added new macro, HEADERS_AND_FOOTERS, to allow having both
+ headers and footers on a page.
+
+ o Fixed whitespace around epigraphs after .DOCTYPE CHAPTER
+ docheaders.
+
+ o Added test in .PP_FONT for existence of $SAVED_PP_FT; if it's
+ there, remove it (fixes bug that was causing .PP to ignore
+ .PP_FONT after .COLLATE). Also fixed .PP so that it properly
+ passes $PP_FT to .FT if $PP_FT has been re-defined to
+ $SAVED_PP_FT.
+
+* Sun Jun 4 2006
+
+ o Added a note about colorizing underscored text in the docs.
+
+* Wed May 24 2006
+
+ o Adjusted the .ne value for heads and subheads (again)
+
+* Sun May 21 2006
+
+ o In the documentation, removed the section stating that setting
+ the family, font, pointsize and colour of line numbers wasn't
+ possible.
+
+ o Updated documentation entry for TOCs to include instructions for
+ using psselect.
+
+* Sat May 20 2006
+
+ o Added string $PRE_CODE_FAM to CODE; fixes bug that kept CODE OFF
+ from restoring the previous family_font combo
+
+ o Added a test for existence of register #DEPTH to .ITEM; if it
+ doesn't exist, ignore ITEM
+
+* Fri May 19 2006
+
+ o Updated docs
+
+ o Added macro, CODE
+
+ o DOCTITLE, TITLE, CHAPTER_TITLE, SUBTITLE, COVERTITLE and
+ DOC_COVERTITLE now accept multiple arguments; each is printed on a
+ separate line in docheaders and on cover pages. Where the macros
+ also supply reference information to page headers, endnotes and
+ tables of contents, the args are concatenated.
+
+* Thu May 18 2006
+
+ o Changed default DOCHEADER_LEAD to +0 when there's both the
+ chapter number and a chapter title in DOCTYPE CHAPTER.
+ Compensated by adding 1/4 of the leading in effect for docheaders
+ between them. Applies equally similar situations on covers and
+ doc covers.
+
+* Mon May 15 2006
+
+ o Added missing default ENDNOTES_ALLOWS_HEADERS to DEFAULTS.
+
+ o Added missing temporary change of the pad marker from # to ^ to
+ the toc title collection routine of .ENDNOTES.
+
+ o Added string $SAVED_PP_FT to start of .COLLATE; string is tested
+ for in .PP
+
+ o Improved testing for $FONT and $PP_FT in DEFAULTS
+
+ o Trivial changes to docheader spacing for doctypes DEFAULT and
+ NAMED when PRINTSTYLE is TYPEWRITE.
+
+* Sun May 14 2006
+
+ o Call to .ne in HEAD moved higher in macro, and .ne's reduced
+ each by 1.
+
+ o Handling of "how much space is needed for subheads + 1 line of
+ text" in SUBHEAD changed to a simple .ne. Fixes bug that was
+ causing overprinting of columns when s/h was deferred to next
+ page/column.
+
+ o In macro, PRINT_HDRFTR, removed .EOL from clause .if
+ \\n[#HDRFTR_COLOR]=1
+
+* Sat May 13 2006
+
+ o Fixed broken link to DOCTITLE in docs.
+
+* Wed Apr 26 2006
+
+ o Corrected doc entry that stated TOC control macros can be
+ entered anywhere in a file prior to invoking TOC (TOC control
+ macros must come before START).
+
+ o Removed spurious .nop from .ie \\n[#PRE_COLLATE]=1 clause in
+ FAMILY (fixes bug that was causing page numbers on pages before
+ COLLATE or TOC to be printed too low).
+
+ o Added a test at top of COLLATE to set register #NO_BREAK to 1 if
+ the distance to the next trap is less than one linespace; used in
+ NEWPAGE to determine whether to do a 'br or .br. (fixes BUG that
+ was causing COLLATE, NEWPAGE, and TOC to spit out a blank page
+ when the last line of text before them happened to fall on the
+ last valid baseline of the page).
+
+ o Changed pad marker used to format TOC entries to permit use of
+ the pound/number sign (#) in head elements.
+
+ o New macro, PREFIX_CHAPTER_NUMBER, to allow users to prepend
+ chapter numbers to the numbering scheme used in head element
+ numbering.
+
+ o Added missing periods at the ends of head, subhead, parahead
+ numbers.
+
+ o CHAPTER, with a numeric argument, can now be used to identify
+ any document as a "chapter" for the purposes of prefixing the
+ argument to CHAPTER to the numbering scheme of head elements.
+
+ o Fixed alignment of TOC entries.
+
+ o Removed .rr #DOC_HEADER and replaced with
+
+ .if \\n[#DOC_HEADER]=1 \{ .nr #DOC_HEADER 2 \}
+
+ near the end of START. I.e., #DOC_HEADER becomes "2" if
+ docheaders were on in the previous document. COLLATE tests for 2
+ in order to reset #DOC_HEADER to 1 for use in the user-invoked
+ START that comes after a COLLATE.
+
+ o Added register, #CHAPTER_CALLED, to CHAPTER; tested for in
+ PREFIX_CHAPTER_NUMBER to determine whether the argument to CHAPTER
+ can be used to establish a chapter number for chapter number
+ prefixes in head element numbering.
+
+* Mon Apr 17 2006
+
+ o Fixed bug that was causing shifted lists, when returned to, to
+ revert to the left margin instead of observing the correct
+ indent+shift for the list.
+
+ o Added a check in LIST so that if user invokes LIST with RETURN,
+ mom doesn't get confused by the initial `R' (which she was using
+ to check if the arg to LIST was ROMAN or roman).
+
+ o Replaced an incorrectly copied code block in SUBHEAD that was
+ preventing SUBHEAD from processing subheads properly when
+ PARA_SPACE was on.
+
+* Wed Mar 15 2006
+
+ o Added a .SHIM after .sp \\n[#DC_LINES]v in .DROPCAP. Fixes
+ problem of dropcaps in initial paragraphs after COLLATE being set
+ slightly too high.
+
+ o Added .rr #DOC_LEAD_ADJUST_OFF to .ie clause of DOC_LEAD_ADJUST
+ and removed .rr #DOC_LEAD_ADJUST_OFF from DEFAULTS (after TRAPS)
+ so that document leading adjustment (or lack thereof) is
+ maintained from doc to doc when COLLATE is being used.
+
+ o Added new register, #PRE_COLLATE. The .FAMILY macro is called
+ several times during initial COLLATE processing, and contained a
+ stanza that allowed FAMILY, after a collate, to invoke DOC_FAMILY
+ if #COLLATE=1. This allowed users to use FAMILY after a COLLATE
+ but before START in a way consistent with the behaviour described
+ in the docs (namely, FAMILY before START sets the DOC_FAMILY).
+ Since that functionality is still needed, #PRE_COLLATE instructs
+ FAMILY not to reset DOC_FAMILY until COLLATE is complete (i.e.
+ after the break to a new page). #PRE_COLLATE, if set to 1, is
+ removed at the end of HEADER.
+
+* Thu, Mar 2 2006
+
+ o Added control macros for linenumbering family, font, point size
+ and color
+
+ o Added a NO_SHIM macro
+
+* Sun Feb 26 2006
+
+ o Changed .PRINT "\h'\\n[#LIST_INDENT\\n[#DEPTH]]u' in the "ROMAN
+ I, padded" and "roman i, padded" clauses of ITEM to .PRINT
+ "\h'\\n[#HL_INDENT\\n[#DEPTH]]u' to fix bug associated with using
+ both PAD_LIST_DIGITS LEFT and SHIFT_LIST.
+
+* Fri Feb 24 2006
+
+ o Removed superfluous "if" from FONT, line 492
+
+ o Removed #ADD_BREAK register from FOOTNOTE and ENDNOTE, along
+ with the routines it invoked
+
+ o Added an optional argument, BREAK, to FOOTNOTE OFF and ENDNOTE
+ OFF, for correct and flexible handling of punctuation and
+ continued lines when FOOTNOTE or ENDNOTE are called while nofill
+ mode is active.
+
+ o Created an alias for .so, INCLUDE.
+
+* Thu Feb 2 2006
+
+ o Small fix to handling of underlining of italic text spanning
+ pages in PRINTSTYLE TYPEWRITE.
+
+* Thu Jan 12 2006
+
+ o Reworked changing and setting of traps associated with
+ outputting left and right margin notes. See BUGS.
+
+* Sat Jan 7 2006
+
+ o Bracketed outputting of margin notes diversions with .nf/.fi.
+
+* Fri Jan 6 2006
+
+ o Corrected docs MN_INIT so that the optional first arg is
+ properly given as RAGGED | SYMMETRIC
+
+ o Fixed MN_INIT macro routine that reads MN_INIT args into strings
+ so that the strings are first "initialized" with the @ character
+ if the corresponding arg is blank. Since MN-init tests for \A and
+ \B (correctly, I hope) for each of its args, the @ character
+ should be safe.
+
+* Tue May 16 2005
+
+ o momdoc/appendices.html: Add space in shebang, conforming to
+ portability recommendation in autoconf docs.
+
+* 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 Addition 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 invalid 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 unusual
+ 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
+
+* 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.
+
+* Mar 05 2004
+
+ o Makefile.sub (GROFF_BIN_PATH): Use SH_SEP.
+
+* 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 <distance> when <distance> 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<n>], \*[ST<n>X], \*[FU<n>]
+ and \*[BU<n>] 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 <n>].
+ 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.
+
+* Mon Dec 29 2003
+
+ o Makefile.sub (GROFF_BIN_PATH): Use $(SEP).
+
+* 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.
+
+* Mon Oct 13 2003
+
+ o Finally fix change 2003-08-26, based on ideas from Chuck Silvers
+ <chuq@chuq.com>.
+
+ o Makefile.sub: Use a stamp file in the `examples' directory.
+
+* Sun Aug 31 2003
+
+ o Makefile.sub: Fix last change to make it really work.
+
+* Tue Aug 26 2003-08-26
+
+ o Makefile.sub (prepare_make_examples): Make it work with parallel
+ runs of `make'. Patch from Chuck Silvers <chuq@chuq.com>.
+
+* 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
+ $DOCHEADER_LEAD_ADJ. This means that .DOCHEADER_LEAD no longer
+ requires a unit of measure; points is assumed.
+
+* Tue Jun 3 2003
+
+ o Added SHIM macro, which, when invoked, calculates and moves to
+ the next "valid" baseline in document processing.
+
+ o Corrected handling of DOCHEADER OFF <distance> so that the first
+ line of running text falls on a "valid" baseline when <distance>
+ is given.
+
+* 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 Apr 05 2003
+
+ o Makefile.sub (GROFFBIN): New variable for groff binary path.
+ (groff_bin_path): Rename to GROFF_BIN_PATH.
+ (GROFF): Use GROFFBIN and GROFF_BIN_PATH.
+
+ Patch from Maciej W. Rozycki <macro@ds2.pg.gda.pl>.
+
+-----------------------------------------------------------------------
+
+* 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
+ deferred 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 #<unit>] and \*[FWD
+ #<unit>]; verticals with \*[UP #<unit>] and \*[DOWN #<unit>]. 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.
+
+* hu 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.
+
+ 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 "<string>" 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 properly 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 | <anything>. 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.
+
+________________________________________________________________________
+
+##### License
+
+Copyright 2004-2020 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+##### Editor settings
+Local Variables:
+coding: latin-1
+fill-column: 72
+mode: change-log
+version-control: never
+End:
+vim:set autoindent textwidth=72:
diff --git a/contrib/mom/NEWS b/contrib/mom/NEWS
new file mode 100644
index 0000000..d7cf82a
--- /dev/null
+++ b/contrib/mom/NEWS
@@ -0,0 +1,710 @@
+ -*- text -*-
+ Copyright (C) 2004-2020 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+Release 2.5
+-----------
+Addition of shaded backgrounds, frames, and page colour.
+
+Releases 2.4 — 2.4-4_e
+----------------------
+General bug fix releases, with an overhaul of float, image, and
+pre-processor handling to correct inconsistencies in spacing,
+indents, labels, and captions. Corrects page numbering issue in
+"Lists of..." when pre-processor material is floated and deferred.
+
+Release 2.3
+-----------
+Addition of DOCTYPE SLIDES and associated macros
+ NEWSLIDE
+ PAUSE
+ TRANSITION for slide presentations processed with gropdf.
+Fixes and improvements to nested lists (ITEM now takes a spacing
+arg), indents (IB), NEWPAGE (aliased as NEWSLIDE). Addition
+of CENTER_BLOCK (center blocks of type over whole line length
+regardless of indents). Tighten up graphical object macros.
+Addition of macros to handle hanging punctuation. .COLOR preferred
+to .gcolor in om.tmac. Changes to HEADER to handle printing of both
+headers and footers when DOCTYPE SLIDES.
+
+Release 2.2
+-----------
+Addition of flex-spacing (flexible vertical whitespace). Fixes and
+improvements to positioning of floats, images, and pre-processor
+material. Addition of TARGET (PDF target) argument to floats,
+images, and pre-processor material. Improvements to autolabelling.
+
+Release 2.1-b
+-------------
+Fix to handling of kern units. Updated copyright info.
+
+Release 2.1-a
+-------------
+Expanded labelling facilities to include floats and
+quotes/blockquotes. Improvements to TOC handling.
+
+Release 2.1
+-----------
+Expanded support for doc-covers, covers, and docheaders:
+ - control macros for formatting every element separately (title,
+ subtitle, author, etc.); formatting options include family,
+ font, size, color, quad, caps, smallcaps and underscoring
+ - (DOC_)COVERTEXT for setting blocks of type on cover pages
+ - (DOC_)COVER_IMAGE for putting full page or small images on cover
+ pages
+
+New <ELEMENT>_STYLE macros that allow grouping of style parameters
+for most document elements into a single macro using keyword/value
+pairs.
+
+Smallcaps, with the ability to control size, weight, and width.
+
+Release 2.0-c
+-------------
+Mom now has full support for eqn, pic, and tbl, as well as
+captioning and labelling of pdf images and preprocessor output.
+Lists of Figures, Equations, and Tables can now be autogenerated.
+PDF_IMAGE has a new FRAME option.
+
+Release 2.0-b
+-------------
+Improved and expanded float and tbl support.
+
+Release 2.0-a
+-------------
+FORCE argument added to FLOAT; immediately breaks to a new page
+to output the float if it does not fit on current the page.
+
+Release 2.0
+-----------
+Full integration with gropdf. Mom's focus now is on the generation
+of PDF output. PDF outlines and PDF links (internal and external)
+fully supported.
+
+New management of nested heading levels via HEADING <level>,
+replacing HEAD, SUBHEAD, SUBSUBHEAD and PARAHEAD.
+
+"NAMED <id>" argument to HEADING <level> creates PDF target at the
+heading.
+
+Use of "oldstyle" headings preserved, allowing the continued use of HEAD,
+SUBHEAD, etc.
+
+PARAHEAD removed; replaced by HEADING <level> PARAHEAD.
+
+New management of head styling.
+
+New management of TOC, mostly transparent to user.
+
+New management of TOC title and entry styling.
+
+Overhaul of TOC default style; greater flexibility in numbering
+entries, improved indenting, improved spacing.
+
+FLOAT macro added.
+
+MN_INIT wrapper re-written such that each argument must be preceded
+by a flag.
+
+New perl script, pdfmom, to facilitate generation of PDF output.
+
+Additional documentation in the form of a PDF manual, which covers
+mom/PDF/groff usage.
+
+====================================================================
+
+Release 1.6-a
+-------------
+Support for sub-subheads added.
+
+Release 1.6
+-----------
+Complete overhaul of refer handling. If you've been using mom and
+refer, the changes may affect documents you've already created.
+Please read refer.html.
+
+Improved underlining thanks to Tadziu Hoffman.
+
+Increased flexibility of PRINTSTYLE TYPEWRITE, which now allows
+user to choose the monospace family and point size.
+
+Release 1.5-e
+-------------
+Complete overhaul of documentation
+
+Release 1.5-d
+-------------
+Control macros added to various miscellaneous docprocessing
+functions
+
+Release 1.5-c
+-------------
+Bugfix release (see BUGS, Version 1.5-b).
+
+Release 1.5-b
+-------------
+Bugfix release (see BUGS, Version 1.5-a).
+
+Release 1.5-a
+-------------
+Bugfix release (see BUGS, Version 1.5).
+
+Release 1.5
+-----------
+Macros have been added to facilitate the drawing of common
+graphical objects: rules (horizontal and vertical), boxes (solid or
+filled) and circles (ellipses; also solid or filled). The
+behaviour of \*[RULE] has changed so that it always deposits a
+break when it's called, bringing it (somewhat) into line with the
+new macro for drawing rules precisely, DRH. Additionally, a new
+macro, RULE_WEIGHT, can be used to control the weight of rules
+drawn with \*[RULE].
+
+Overall, the handling of underscoring and underlining--wherever it
+occurs--has been overhauled so that users can control both the
+weight and the placement of underscore/underline rules. New
+macros have been created to control, for example,
+the weight and placement of the rule under a HEAD, or the weight of
+a FOOTNOTE separator rule, etc. Anything that can be underscored
+or underlined (except the pseudo-underlining of italic passages in
+PRINTSTYLE TYPEWRITE) has a "rule" control macro. See the document
+sections pertinent to the macro in question.
+
+The creation and management of covers and doc covers has been
+overhauled for greater flexibility, including the ability to
+generate differing titles, subtitles, attribution strings, authors,
+doctypes, miscellaneous lines and copyright information for the
+same document's doc cover and cover (title) pages, without
+affecting the default docheader that appears on page one.
+Additionally, you can now get mom to output a blank page after a
+cover or doc cover, as well as tell her whether to include covers
+and doc covers in the pagination scheme.
+
+The convenience macro, CODE, has been made more convenient. A new
+control macro allows setting users' preferred fixed-width fonts.
+Additionally, CODE can now be called inline.
+
+New inline escapes, \*[UC] and \*[LC], have been added to allow
+inline capitalization. This is particularly useful when users
+want to pass a header/footer left-center-right part one of mom's
+"reserved" strings and want the string capitalized (or not) in the
+header/footer.
+
+For more details, see ChangeLog as well as the documentation.
+
+Release 1.4-b
+-------------
+It is now possible to pass an absolute value to QUOTE_INDENT,
+BLOCKQUOTE_INDENT and EPIGRAPH_INDENT. If an absolute value
+is desired, the user simply appends a unit of measure (scaling
+indicator) to the argument. If no unit of measure is appended,
+the old behaviour is still observed (i.e. the numeric argument
+represents the amount by which to multiply the paragraph indent to
+arrive at the desired indent value).
+
+The main macro file, om.tmac, is now stripped of comments when
+groff is built from sources. om.tmac in the sources themselves
+still contains the comments, as do the tarballs posted on the mom
+homepage.
+
+Release 1.4-a
+-------------
+Added a new macro, HEADERS_AND_FOOTERS, to allow having both
+headers and footers on a page.
+
+Release 1.4
+-----------
+DOCTITLE, TITLE, CHAPTER_TITLE, SUBTITLE, COVERTITLE and
+DOC_COVERTITLE now accept multiple arguments; each is printed
+on a separate line.
+
+New macro, CODE, to facilitate setting programming code snippets.
+
+Release 1.3-e_<#>
+-----------------
+New macro, PREFIX_CHAPTER_NUMBER, to allow users to prepend chapter
+numbers to the numbering scheme used in head element numbering.
+
+Indented TOC entries now line up better.
+
+Line numbering now has control macros for family, font, point size
+and color.
+
+A new macro, NO_SHIM, to disable the automatic shimming of
+(possibly irregularly linespaced) quotes and blockquotes.
+
+Release 1.3-d
+-------------
+Bug fix release (FONT--removed superfluous "if" that was breaking
+fallback font logic; FOOTNOTE--no longer adding a linebreak after
+footnote marker in footnote text in nofill modes).
+
+Fixed indent problem with LIST when both PAD_LIST_DIGITS LEFT and
+SHIFT_LIST used concurrently.
+
+Release 1.3-c
+-------------
+Bug fix release (margin notes, TYPEWRITE--spacing, underlining and
+italicizing
+
+Release 1.3-b
+-------------
+Bug fix release. SMARTQUOTES has been smartened; miscellaneous
+glitches in PRINTSTYLE TYPEWRITE fixed (see BUGS). Primarily
+corrects inconsistencies and bugs with the margin notes routines.
+
+Release 1.3-a
+-------------
+Bug fixes: First baseline of type wasn't going where it was supposed
+to when the docheader was turned off; fixes to errors in html
+formatting of docs.
+
+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
+\*[<colorname>], or with the macro .COLOR. In document processing,
+the docelement tag control macros have been expanded to include
+_COLOR, e.g. .HEAD_COLOR <predefined colorname> will colorize
+heads, PAGENUM_COLOR <predefined colorname) will colorize page
+numbering, etc.
+
+Adjusted vertical placement of hyphens around page numbering when
+PAGENUM_STYLE is DIGIT, ROMAN or ALPHA so that the hyphens appear
+properly centered on the page numbering character.
+
+Changed tab handling in document processing so that tab structures
+are preserved from page to page and column to column.
+
+Release 1.1.7-a
+---------------
+
+Increased the flexibility of SMARTQUOTES so that they handle quoting
+styles by language, entered as a 2-digit language code argument to
+SMARTQUOTES. See docs.
+
+Re-wrote the DOCTYPE LETTER macros so that DATE, TO and FROM can be
+entered in any order the user wishes, with output that matches
+input. (Should have done this in the first place.)
+
+Release 1.1.7
+-------------
+
+Finally got around to writing "list" macros. See the docs.
+
+Added German-style lowered double quotes and two styles of
+guillemets to SMARTQUOTES.
+
+Added macro SIZE, intended to be called inline as \*[SIZE <n>].
+This brings mom's inline size change syntax into line with her other
+inlines. \*S[<n>] 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 "valid"
+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 <distance> so that the first line of
+running text falls on a "valid" baseline when <distance> 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..d9bb257
--- /dev/null
+++ b/contrib/mom/TODO
@@ -0,0 +1,10 @@
+ -*- txt -*-
+ Copyright 2004-2020 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+- cutarounds
+- clickable footnote and endnote markers
+- indexing
diff --git a/contrib/mom/copyright b/contrib/mom/copyright
new file mode 100644
index 0000000..04c09d9
--- /dev/null
+++ b/contrib/mom/copyright
@@ -0,0 +1,24 @@
+-*- text -*-
+AUTHOR
+------
+Peter Schaffter (peter@schaffter.ca)
+6-331 Mona Ave
+Vanier (ON) CANADA
+K1L 7A3
+
+========================================================================
+
+The groff macro file om.tmac and the html documentation pertaining to
+it are Copyright (C) 2004-2021 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-fr.txt b/contrib/mom/examples/README-fr.txt
new file mode 100644
index 0000000..5b1b434
--- /dev/null
+++ b/contrib/mom/examples/README-fr.txt
@@ -0,0 +1,126 @@
+-*- mode: text; coding: utf-8; -*-
+Copyright (C) 2014-2020 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+========================================================================
+
+Les fichiers dans ce répertoire vous permettent de voir mom en pleine
+action.
+
+Si vous avez téléchargé et décompressé une version de mom depuis sa
+page d'accueil, vous verrez qu'aucun exemple n'est accompagné du
+fichier PDF (.pdf) correspondant, comme c'est le cas sur les versions
+pré-compilées de groff, ou groff compilé à partir des sources.
+
+Je n'ai pas inclu les PDF parce que je voulais conserver l'archive mom
+aussi petite que possible. Pour générer les PDF, traitez les fichiers
+avec pdfmom(1).
+
+ pdfmom mom-pdf.mom > mom-pdf.pdf
+ pdfmom sample_docs.mom > sample_docs.pdf
+ pdfmom slide-demo.mom > slide-demo.pdf
+ pdfmom -k letter.mom > letter.pdf
+ pdfmom -k mon_premier_doc.mom > mon_premier_doc.pdf
+ pdfmom -k typesetting.mom > typesetting.pdf
+
+Les fichiers
+------------
+
+Tous les fichiers sont configurés pour le format lettre US, exceptés
+mom-pdf.mom et mon_premier_doc.mom, qui utilisent le format A4.
+
+***typesetting.mom**
+
+Le fichier typesetting.mom montre l'utilisation d'éléments de
+composition typographique: tabulations, tabulations intégrées dans des
+chaînes de caractères, remplissage de lignes, texte sur plusieurs
+colonnes et différents styles d'indentation; ainsi que certaines
+subtilités et réglages précis disponibles via des macros et des
+échappements en ligne ("inline escape", des commandes insérées
+directement dans le texte, par opposition aux macros).
+
+Comme ce fichier montre également l'utilisation d'une petite image au
+milieu d'un texte et que cette image est la mascotte favorite de tout
+le monde -- Tux, le fichier PDF de cette image, penguin.pdf, a été
+ajouté dans ce répertoire.
+
+***sample_docs.mom***
+
+Le fichier sample_docs.mom montre en exemple les trois styles de
+documents apportés par les macros de formattage de document de mom,
+ansi que l'utilisation de COLLATE. Il montre également certaines
+fonctionnalités PDF de mom dont l'écriture d'une ébauche de nouvelle
+ou des liens cliquables dans une table des matières.
+
+Le dernier exemple démontre, par un texte séparé en deux colonnes, la
+souplesse de mom pour la conception de document.
+
+Le PRINTSTYLE de ce fichier est TYPESET et vous donne une idée du
+comportement par défaut de mom pour la composition typographique de
+document.
+
+Si vous souhaitez voir comment mom traite le même fichier quand
+PRINTSTYLE est TYPEWRITE (c'est-à-dire dactylographié, avec espace
+double) remplacez .PRINTSTYLE TYPESET par .PRINTSTYLE TYPEWRITE au
+début du fichier.
+
+***letter.mom***
+
+Ceci est simplement l'exemple du tutorial de momdocs, prêt à être vu.
+
+***slide-demo.mom***
+
+Le fichier slide-demo.mom montre une présentation de diapositives
+avec des effets PAUSE et TRANSITION. Le fichier .pdf généré avec
+pdfmom devrait être ouvert en mode Présentation d'un lecteur PDF
+(Okular, Evince, Acroread). Notez que pas tous les effets de
+transition sont disponibles pour tous les lecteurs PDF.
+
+***mon_premier_doc.mom***
+
+Le fichier mon_premier_doc.mom est un exemple simple en français
+montrant l'utilisation d'éléments de formattage courants: titres de
+section, paragraphes, listes, table des matières et liens PDF
+cliquables. Il doit être généré avec l'option -k du fait de la
+présence de caractères accentués.
+
+Un certain nombre de réglages ont également été changés pour ce
+document en français: ATTRIBUTE_STRING est utilisé pour remplacer
+"by" par "par" en tête de document (là où le titre et l'auteur sont
+affichés). TOC_HEADER_STRING sert à modifier le titre de la table des
+matières en "Table des matières" plutôt que "Table of Content". Enfin,
+le paramètre de configuration INDENT_FIRST_PARAS est activé afin
+d'indenter le premier paragraphe de chaque section -- ceci est l'usage
+en typographie française.
+
+***copyright-default.mom/copyright-chapter.mom***
+
+Deux fichiers qui montrent la bonne façon d'insérer une page des
+droits d'auteur dans les documents créés avec mom. "Default" est
+pour DOCTYPE DEFAULT; "chapter" est pour DOCTYPE CHAPTER.
+
+***mom-pdf.mom***
+
+Le manuel "Producing PDFs with mom and groff".
+
+***mom.vim***
+
+Les règles de coloration syntaxique vim sont baséés sur celles
+fournies par Christian V. J. Brüssow (cvjb@cvjb.de). Copiez le fichier
+mom.vim dans votre répertoire ~/.vim/syntax directory; ensuite,
+autorisez la coloration syntaxique si ce n'est pas encore le cas:
+
+ :syntax enable
+ou
+ :syntax on
+
+***elvis_syntax.new***
+
+Ceux qui utilisent elvis, le clone de vi, peuvent directement
+copier-coller le contenu de ce fichier dans leur elvis.syn. Tous les
+fichiers ayant l'extension .mom auront la coloration syntaxique. Les
+règles dans elvis_syntax ne sont pas exhaustive, mais aideront
+beaucoup à rendre les fichiers mom plus lisibles.
diff --git a/contrib/mom/examples/README.txt b/contrib/mom/examples/README.txt
new file mode 100644
index 0000000..851a9a2
--- /dev/null
+++ b/contrib/mom/examples/README.txt
@@ -0,0 +1,119 @@
+-*- mode: text; coding: utf-8; -*-
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+========================================================================
+
+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 PDF (.pdf) files, as they do with pre-compiled
+versions of groff, or groff built from source.
+
+I haven't included the PDF output because I want to keep the mom
+archive as lean as possible. To view the PDF output, process the
+files with pdfmom(1).
+
+ pdfmom mom-pdf.mom > mom-pdf.pdf
+ pdfmom sample_docs.mom > sample_docs.pdf
+ pdfmom slide-demo.mom > slide-demo.pdf
+ pdfmom -k letter.mom > letter.pdf
+ pdfmom -k mon_premier_doc.mom > mon_premier_doc.pdf
+ pdfmom -k typesetting.mom > typesetting.pdf
+
+The files themselves
+--------------------
+
+All are set up for US letter papersize except mom-pdf.mom and
+mon_premier_doc.mom, which uses A4.
+
+***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 PDF file, penguin.pdf 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. It also shows off some of
+mom's PDF features, including a PDF outline and clickable links in
+the printable Table of Contents.
+
+The last sample, set in 2 columns, demonstrates mom's flexibility
+when it comes to designing documents.
+
+The PRINTSTYLE of this file is TYPESET, to give you an idea of mom's
+default behaviour when typesetting a document.
+
+If you'd like to see how mom handles exactly the same file when the
+PRINTSTYLE is TYPEWRITE (ie 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.
+
+***slide-demo.mom***
+
+The file, slide-demo.mom, demonstrates a slide presentation with
+PAUSE and TRANSITION effects. The .pdf created by pdfmom should be
+opened in Presentation Mode in a PDF reader (e.g. Okular, Evince,
+Acroread). Note that not all transition effects are available in
+all PDF readers.
+
+***mon_premier_doc.mom***
+
+The file, mon_premier_doc.mom, is a simple example in French showing
+the use of common elements: section headings, paragraphs, lists, table
+of contents and clickable links. It should be generated with option -k
+as there are some accented letters.
+
+A few settings were also changed for this French document:
+ATTRIBUTE_STRING is used to replace "by" by "par" in the document
+header (where the title and the author are displayed).
+TOC_HEADER_STRING is used to modity the Table of Content title to
+"Table des matières". And finally, INDENT_FIRST_PARAS is used to
+indent the first paragraph of a section -- this is the usual
+convention in French typesetting.
+
+***copyright-default.mom/copyright-chapter.mom***
+
+These two files demonstrate the correct way to insert a copyright
+page into mom documents. "Default" is for DOCTYPE DEFAULT;
+"chapter" is for DOCTYPE CHAPTER.
+
+***mom-pdf.mom***
+
+The manual, Producing PDFs with mom and groff.
+
+***mom.vim***
+
+The vim syntax highlighting rules are based on those provided by
+Christian V. J. Brüssow (cvjb@cvjb.de). Copy mom.vim 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
+
+***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.
diff --git a/contrib/mom/examples/copyright-chapter.mom b/contrib/mom/examples/copyright-chapter.mom
new file mode 100644
index 0000000..261c712
--- /dev/null
+++ b/contrib/mom/examples/copyright-chapter.mom
@@ -0,0 +1,160 @@
+.\" -*- mode: text; coding: utf-8; -*-
+\#
+\# Copyright (C) 2019-2020 Free Software Foundation, Inc.
+\#
+\# Copying and distribution of this file, with or without modification,
+\# are permitted in any medium without royalty provided the copyright
+\# notice and this notice are preserved.
+\#
+.ig
+***Template for creating a copyright page, DOCTYPE CHAPTER***
+.
+Mom documents comprised of chapters using DOCTYPE CHAPTER require
+the START macro to begin each chapter, and the COLLATE macro to join
+it to the subsequent chapter.
+.
+A copyright page (also called an edition page), which is not a
+chapter, should be treated as a DOCTYPE DEFAULT. The text of
+the copyright page is entered after START and joined to the first
+chapter (DOCTYPE CHAPTER) with COLLATE.
+.
+Copyright pages are not identified by a title or heading, however
+they require a TITLE in order to be included in PDF viewer outlines
+and the Table of Contents. Supplying '.TITLE "Copyright"'
+but disabling the DOCHEADER achieves both these requirements.
+.
+Pagination should also be disabled for the copyright page. Both
+docheader and pagination should be re-enabled before the START of
+the first chapter.
+..
+.
+.\" Cover setup
+.
+.\" By default, mom uses the last TITLE macro before START for the
+.\" title that appears on the cover. Since the TITLE is "Copyright,"
+.\" mom needs to be told explicitly to use a different title.
+.
+.\" Cover and PDF viewer setup
+.
+.DOCTITLE "Book Title"
+.TITLE DOC_COVER \
+ "\*[$DOCTITLE]" \" Title for the cover page
+.AUTHOR \
+ "Book Author"
+.DOC_COVER \
+ TITLE AUTHOR
+.PDF_TITLE \
+ "DOCTYPE CHAPTER with copyright page" \" For PDF viewer titlebar
+.
+.\" Copyright page setup
+.
+.PRINTSTYLE TYPESET
+.DOCTYPE DEFAULT \" Copyright page is not a chapter.
+.
+.DOCHEADER off 1i \" Turn off docheader for copyright page.
+. \" Begin text 1 inch from page top.
+.PAGINATION off \" Disable pagination for copyright page.
+.
+.TITLE "Copyright" \" Required for the PDF viewer outline; does not
+. \" get printed because docheader is disabled.
+.NO_TOC_ENTRY \" So copyright page is not included in the TOC
+.
+.START \" Begin example copyright page
+All rights reserved. No part of this publication may be reproduced,
+distributed, or transmitted in any form or by any means, including
+photocopying, recording, or other electronic or mechanical methods,
+without the prior written permission of the publisher, except
+in the case of brief quotations embodied in critical reviews
+and certain other noncommercial uses permitted by copyright
+law. For permission requests, write to the publisher, addressed
+“Attention: Permissions Coordinator,†at the address below.
+.SP
+.LEFT
+Copyright \[co]2019 Copyright Holder
+.SP
+Additional information...
+.TOC_AFTER_HERE \" Place TOC after copyright page.
+.
+.COLLATE
+.
+.\" Chapter setup
+.
+.DOCTYPE CHAPTER \" Begin using DOCTYPE CHAPTER.
+.TITLE \
+ "\*[$DOCTITLE]" \" Needed for page headers.
+. \" Only required before first chapter.
+.CHAPTER 1
+.CHAPTER_TITLE \
+ "Sample Chapter"
+.DOCHEADER \" Re-enable docheader.
+.PAGINATE \" Re-enable pagination.
+.PAGENUMBER 1
+.
+.START \" Begin first chapter.
+.PP
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed at
+ante. Mauris eleifend, quam a vulputate dictum, massa quam dapibus
+leo, eget vulputate orci purus ut lorem. In fringilla mi in ligula.
+Pellentesque aliquam quam vel dolor. Nunc adipiscing. Sed quam odio,
+tempus ac, aliquam molestie, varius ac, tellus. Vestibulum ut nulla
+aliquam risus rutrum interdum. Pellentesque lorem. Curabitur sit
+amet erat quis risus feugiat viverra. Pellentesque augue justo,
+sagittis et, lacinia at, venenatis non, arcu. Nunc nec libero. In
+cursus dictum risus. Etiam tristique nisl a nulla. Ut a orci.
+Curabitur dolor nunc, egestas at, accumsan at, malesuada nec, magna.
+.PP
+Nulla facilisi. Nunc volutpat. Vestibulum ante ipsum primis in
+faucibus orci luctus et ultrices posuere cubilia Curae; Ut sit
+amet orci vel mauris blandit vehicula. Nullam quis enim. Integer
+dignissim viverra velit. Curabitur in odio. In hac habitasse platea
+dictumst. Ut consequat, tellus eu volutpat varius, justo orci
+elementum dolor, sed imperdiet nulla tellus ut diam. Vestibulum
+ipsum ante, malesuada quis, tempus ac, placerat sit amet, elit.
+.PP
+Sed eget turpis a pede tempor malesuada. Vivamus quis mi at leo
+pulvinar hendrerit. Cum sociis natoque penatibus et magnis dis
+parturient montes, nascetur ridiculus mus. Pellentesque aliquet
+lacus vitae pede. Nullam mollis dolor ac nisi. Phasellus sit amet
+urna. Praesent pellentesque sapien sed lacus. Donec lacinia odio
+in odio. In sit amet elit. Maecenas gravida interdum urna. Integer
+pretium, arcu vitae imperdiet facilisis, elit tellus tempor nisi,
+vel feugiat ante velit sit amet mauris. Vivamus arcu. Integer
+pharetra magna ac lacus. Aliquam vitae sapien in nibh vehicula
+auctor. Suspendisse leo mauris, pulvinar sed, tempor et, consequat
+ac, lacus. Proin velit. Nulla semper lobortis mauris. Duis urna
+erat, ornare et, imperdiet eu, suscipit sit amet, massa. Nulla nulla
+nisi, pellentesque at, egestas quis, fringilla eu, diam.
+.PP
+Donec semper, sem nec tristique tempus, justo neque commodo nisl,
+ut gravida sem tellus suscipit nunc. Aliquam erat volutpat. Ut
+tincidunt pretium elit. Aliquam pulvinar. Nulla cursus. Suspendisse
+potenti. Etiam condimentum hendrerit felis. Duis iaculis aliquam
+enim. Donec dignissim augue vitae orci. Curabitur luctus felis a
+metus. Cum sociis natoque penatibus et magnis dis parturient montes,
+nascetur ridiculus mus. In varius neque at enim. Suspendisse massa
+nulla, viverra in, bibendum vitae, tempor quis, lorem.
+.PP
+Donec dapibus orci sit amet elit. Maecenas rutrum ultrices lectus.
+Aliquam suscipit, lacus a iaculis adipiscing, eros orci pellentesque
+nisl, non pharetra dolor urna nec dolor. Integer cursus dolor vel
+magna. Integer ultrices feugiat sem. Proin nec nibh. Duis eu dui
+quis nunc sagittis lobortis. Fusce pharetra, enim ut sodales luctus,
+lectus arcu rhoncus purus, in fringilla augue elit vel lacus. In
+hac habitasse platea dictumst. Aliquam erat volutpat. Fusce iaculis
+elit id tellus. Ut accumsan malesuada turpis. Suspendisse potenti.
+Vestibulum lacus augue, lobortis mattis, laoreet in, varius at,
+nisi. Nunc gravida. Phasellus faucibus. In hac habitasse platea
+dictumst. Integer tempor lacus eget lectus. Praesent fringilla augue
+fringilla.
+.PP
+Pellentesque aliquam quam vel dolor. Nunc adipiscing. Sed quam odio,
+tempus ac, aliquam molestie, varius ac, tellus. Vestibulum ut nulla
+aliquam risus rutrum interdum. Pellentesque lorem. Curabitur sit
+amet erat quis risus feugiat viverra. Pellentesque augue justo,
+sagittis et, lacinia at, venenatis non, arcu. Nunc nec libero. In
+cursus dictum risus. Etiam tristique nisl a nulla. Ut a orci.
+.TOC
+.\" Local Variables:
+.\" mode: nroff
+.\" End:
+.\" vim: filetype=groff:
diff --git a/contrib/mom/examples/copyright-default.mom b/contrib/mom/examples/copyright-default.mom
new file mode 100644
index 0000000..25a428f
--- /dev/null
+++ b/contrib/mom/examples/copyright-default.mom
@@ -0,0 +1,149 @@
+.\" -*- mode: text; coding: utf-8; -*-
+\#
+\# Copyright (C) 2019-2020 Free Software Foundation, Inc.
+\#
+\# Copying and distribution of this file, with or without modification,
+\# are permitted in any medium without royalty provided the copyright
+\# notice and this notice are preserved.
+\#
+.ig
+***Template for created a copyright page, DOCTYPE DEFAULT***
+
+Mom documents comprised of titled sections using DOCTYPE DEFAULT
+(e.g. a collection of articles or a book of short stories by
+different authors) require the START macro to begin each new
+section, and the COLLATE macro to join it to the subsequent section.
+.
+A copyright page (also called an edition page) should be treated
+as a titled section. The text of the copyright page is entered
+after START and joined to the next major section (i.e. the beginning
+of a document's content) with COLLATE.
+.
+Copyright pages are not identified by a title or heading, however
+they require a TITLE in order to be included in PDF viewer outlines
+and, if desired, the Table of Contents. Supplying '.TITLE "Copyright"'
+but disabling the DOCHEADER achieves both these requirements.
+.
+Pagination should also be disabled for the copyright page. Both
+docheader and pagination should be re-enabled before the START of
+the first (titled) section of the document.
+..
+.
+.\" Cover and PDF viewer setup
+.
+.\" By default, mom uses the last TITLE macro before START for the
+.\" title that appears on the cover. Since the TITLE is "Copyright,"
+.\" mom needs to be told explicitly to use a different title.
+.
+.TITLE DOC_COVER \
+ "Document Title"
+.EDITOR DOC_COVER \
+ "Document Editor"
+.ATTRIBUTE_STRING DOC_COVER \
+ "Edited by"
+.DOC_COVER \
+ TITLE EDITOR
+.PDF_TITLE \
+ "DOCTYPE DEFAULT with copyright page" \" For PDF viewer titlebar
+.
+.\" Copyright page setup
+.
+.PRINTSTYLE TYPESET
+.DOCHEADER off 1i \" Turn off docheader for copyright page.
+. \" Begin text 1 inch from page top.
+.PAGINATION off \" Disable pagination for copyright page.
+.
+.TITLE "Copyright" \" Required for PDF viewer outline; does not
+. \" get printed because docheader is disabled.
+.
+.NO_TOC_ENTRY \" So copyright page is not included in the TOC
+.
+.START \" Begin copyright page
+All rights reserved. No part of this publication may be reproduced,
+distributed, or transmitted in any form or by any means, including
+photocopying, recording, or other electronic or mechanical methods,
+without the prior written permission of the publisher, except
+in the case of brief quotations embodied in critical reviews
+and certain other noncommercial uses permitted by copyright
+law. For permission requests, write to the publisher, addressed
+“Attention: Permissions Coordinator,†at the address below.
+.SP
+.LEFT
+Copyright \[co]2019 Copyright Holder
+.SP
+Additional information...
+.TOC_AFTER_HERE \" Place TOC after copyright page.
+.
+.COLLATE
+.
+.\" Sample article setup
+.
+.TITLE \
+ "Sample article" \" Title of first article
+.AUTHOR \
+ "Article Author"
+.DOCHEADER \" Re-enable docheader.
+.PAGINATE \" Re-enable pagination.
+.PAGENUMBER 1
+.
+.START
+.PP
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed at
+ante. Mauris eleifend, quam a vulputate dictum, massa quam dapibus
+leo, eget vulputate orci purus ut lorem. In fringilla mi in ligula.
+Pellentesque aliquam quam vel dolor. Nunc adipiscing. Sed quam odio,
+tempus ac, aliquam molestie, varius ac, tellus. Vestibulum ut nulla
+aliquam risus rutrum interdum. Pellentesque lorem. Curabitur sit
+amet erat quis risus feugiat viverra. Pellentesque augue justo,
+sagittis et, lacinia at, venenatis non, arcu. Nunc nec libero. In
+cursus dictum risus. Etiam tristique nisl a nulla. Ut a orci.
+Curabitur dolor nunc, egestas at, accumsan at, malesuada nec, magna.
+.PP
+Nulla facilisi. Nunc volutpat. Vestibulum ante ipsum primis in
+faucibus orci luctus et ultrices posuere cubilia Curae; Ut sit
+amet orci vel mauris blandit vehicula. Nullam quis enim. Integer
+dignissim viverra velit. Curabitur in odio. In hac habitasse platea
+dictumst. Ut consequat, tellus eu volutpat varius, justo orci
+elementum dolor, sed imperdiet nulla tellus ut diam. Vestibulum
+ipsum ante, malesuada quis, tempus ac, placerat sit amet, elit.
+.PP
+Sed eget turpis a pede tempor malesuada. Vivamus quis mi at leo
+pulvinar hendrerit. Cum sociis natoque penatibus et magnis dis
+parturient montes, nascetur ridiculus mus. Pellentesque aliquet
+lacus vitae pede. Nullam mollis dolor ac nisi. Phasellus sit amet
+urna. Praesent pellentesque sapien sed lacus. Donec lacinia odio
+in odio. In sit amet elit. Maecenas gravida interdum urna. Integer
+pretium, arcu vitae imperdiet facilisis, elit tellus tempor nisi,
+vel feugiat ante velit sit amet mauris. Vivamus arcu. Integer
+pharetra magna ac lacus. Aliquam vitae sapien in nibh vehicula
+auctor. Suspendisse leo mauris, pulvinar sed, tempor et, consequat
+ac, lacus. Proin velit. Nulla semper lobortis mauris. Duis urna
+erat, ornare et, imperdiet eu, suscipit sit amet, massa. Nulla nulla
+nisi, pellentesque at, egestas quis, fringilla eu, diam.
+.PP
+Donec semper, sem nec tristique tempus, justo neque commodo nisl,
+ut gravida sem tellus suscipit nunc. Aliquam erat volutpat. Ut
+tincidunt pretium elit. Aliquam pulvinar. Nulla cursus. Suspendisse
+potenti. Etiam condimentum hendrerit felis. Duis iaculis aliquam
+enim. Donec dignissim augue vitae orci. Curabitur luctus felis a
+metus. Cum sociis natoque penatibus et magnis dis parturient montes,
+nascetur ridiculus mus. In varius neque at enim. Suspendisse massa
+nulla, viverra in, bibendum vitae, tempor quis, lorem.
+.PP
+Donec dapibus orci sit amet elit. Maecenas rutrum ultrices lectus.
+Aliquam suscipit, lacus a iaculis adipiscing, eros orci pellentesque
+nisl, non pharetra dolor urna nec dolor. Integer cursus dolor vel
+magna. Integer ultrices feugiat sem. Proin nec nibh. Duis eu dui
+quis nunc sagittis lobortis. Fusce pharetra, enim ut sodales luctus,
+lectus arcu rhoncus purus, in fringilla augue elit vel lacus. In
+hac habitasse platea dictumst. Aliquam erat volutpat. Fusce iaculis
+elit id tellus. Ut accumsan malesuada turpis. Suspendisse potenti.
+Vestibulum lacus augue, lobortis mattis, laoreet in, varius at,
+nisi. Nunc gravida. Phasellus faucibus. In hac habitasse platea
+dictumst. Integer tempor lacus eget lectus. Praesent fringilla augue
+fringilla dui.
+.TOC
+.\" Local Variables:
+.\" mode: nroff
+.\" End:
+.\" vim: filetype=groff:
diff --git a/contrib/mom/examples/elvis_syntax b/contrib/mom/examples/elvis_syntax
new file mode 100644
index 0000000..b5735bf
--- /dev/null
+++ b/contrib/mom/examples/elvis_syntax
@@ -0,0 +1,96 @@
+" Copyright (C) 2004-2020 Free Software Foundation, Inc.
+"
+" Copying and distribution of this file, with or without modification,
+" are permitted in any medium without royalty provided the copyright
+" notice and this notice are preserved.
+
+#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..5dadecc
--- /dev/null
+++ b/contrib/mom/examples/elvis_syntax.new
@@ -0,0 +1,116 @@
+" Copyright (C) 2004-2020 Free Software Foundation, Inc.
+"
+" Copying and distribution of this file, with or without modification,
+" are permitted in any medium without royalty provided the copyright
+" notice and this notice are preserved.
+
+" 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
+font args COVER DOC_COVER
+font args COVERTITLE DOCTITLE TITLE CHAPTER CHAPTER_TITLE CHAPTER+TITLE SUBTITLE
+font args AUTHOR DOCTYPE COPYRIGHT MISC
+font args NULL BLANKPAGE NOBREAK
+
+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..6e1a0c0
--- /dev/null
+++ b/contrib/mom/examples/letter.mom
@@ -0,0 +1,46 @@
+.\" -*- mode: text; coding: utf-8; -*-
+\#
+\# Copyright (C) 2004-2020 Free Software Foundation, Inc.
+\#
+\# Copying and distribution of this file, with or without modification,
+\# are permitted in any medium without royalty provided the copyright
+\# notice and this notice are preserved.
+\#
+.AUTHOR "Yannick P. Guique"
+.DOCTYPE LETTER
+.PRINTSTYLE TYPESET
+.START
+.DATE
+August 25, 2013
+.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,
+.\" Local Variables:
+.\" mode: nroff
+.\" End:
+.\" vim: filetype=groff:
diff --git a/contrib/mom/examples/mom-pdf.mom b/contrib/mom/examples/mom-pdf.mom
new file mode 100644
index 0000000..15cf6df
--- /dev/null
+++ b/contrib/mom/examples/mom-pdf.mom
@@ -0,0 +1,620 @@
+.\" -*- mode: text; coding: utf-8; -*-
+.\"
+.\" Copyright (C) 2012-2020 Free Software Foundation, Inc.
+.\"
+.\" This file is part of mom, which is part of groff, a free software
+.\" project.
+.\"
+.\" You can redistribute it and/or modify it under the terms of the
+.\" GNU General Public License as published by the "Free Software
+ \" Foundation", version\~2.
+.\"
+.\" The license text is available on the internet at
+.\" <http://www.gnu.org/licenses/gpl-2.0.html>
+.\"
+.PAPER A4
+.\" Reference macros (metadata)
+.TITLE "Producing PDFs" "with groff and mom"
+.PDF_TITLE "\*[$TITLE]
+.COPYRIGHT "20\*[BU3]1\*[BU2]5, 20\*[BU3]1\*[BU2]7 Free Software Foundation
+.AUTHOR "Deri James" "\*[UP .5p]and" "Peter Schaffter"
+.\" Cover author style
+.COVER_AUTHOR_STYLE \
+ LEAD 15 \
+ SPACE -.5v
+.\" Docheader author style
+.AUTHOR_STYLE \
+ LEAD 14 \
+ SPACE -.75
+.ATTRIBUTE_STRING "" \" Don't print 'by'
+.\"
+.PDF_BOOKMARKS_OPEN 2
+.\" Formatting style, margins
+.PRINTSTYLE TYPESET
+.L_MARGIN 2.5c
+.R_MARGIN 2.5c
+.B_MARGIN 2.5c
+.\" General defaults
+.FAM H
+.FT R
+.PT_SIZE 10.5
+.AUTOLEAD 3
+.PARA_INDENT 0 \" No indent because we're spacing paragraphs.
+.COVERTEXT
+.SP .5v
+.QUAD CENTER
+.HY off
+.IB 8P
+.\" Copyright notice
+This file is part of groff.
+.SP .5v
+Groff is free software. You can redistribute it
+and\*[FU3]/or modify it under the terms of the GNU
+General Public License as published by the
+Free Software Foundation, either version 3
+of the License, or (at your option) any later
+version.
+.SP .5v
+You should have received a copy of the GNU
+General Public License along with this program.
+If not, see:
+.SP .25v
+.PDF_LINK_COLOR 0.0 0.3 0.9
+.PDF_WWW_LINK http://www.gnu.org/licenses/
+.IQ CLEAR
+.HY
+.COVERTEXT end
+.\" Cover and page header
+.COVER TITLE AUTHOR COPYRIGHT COVERTEXT
+.HEADER_LEFT "James, Schaffter"
+.\"
+.COVER_LEAD +3.5
+.DOCHEADER_LEAD +3.5
+.\" Color for code snippets
+.NEWCOLOUR dark-grey RGB #343434
+.\" Make QUOTE look like CODE
+.QUOTE_STYLE \
+ FAMILY C \
+ FONT B \
+ SIZE +1.5 \
+ COLOR dark-grey \
+ INDENT 9p
+.\"
+.CODE_STYLE \
+ FONT B \
+ SIZE 115 \
+ COLOR dark-grey
+.CONDENSE 87 \" Condense percentage used in COD
+.\"
+.HEADING_STYLE 1 \
+ NUMBER \
+ FONT B \
+ SIZE +1 \
+ BASELINE_ADJUST \n[.v]/5
+.HEADING_STYLE 2 \
+ NUMBER \
+ FONT I \
+ SIZE +.25 \
+ BASELINE_ADJUST \n[.v]/5
+.\"
+.FOOTNOTE_SIZE -1
+.\" Character definitions for program names, opts, etc.
+.char \[ghostscript] \*[BD]ghostscript\*[PREV]
+.char \[groff] \*[BD]groff\*[PREV]
+.char \[gropdf] \*[BD]gropdf\*[PREV]
+.char \[grops] \*[BD]grops\*[PREV]
+.char \[man] \*[BD]man\*[PREV]
+.char \[-mom] \*[BD]\-mom\*[PREV]
+.char \[mom] \*[BD]mom\*[PREV]
+.char \[-mpdfmark] \*[BD]\-mpdfmark\*[PREV]
+.char \[ms] \*[BD]ms\*[PREV]
+.char \[pdfmom] \*[BD]pdfmom\*[PREV]
+.char \[pdfroff] \*[BD]pdfroff\*[PREV]
+.char \[-P-e] \*[BD]\-P\-e\*[PREV]
+.char \[-P-p<papersize>] \*[BD]\-P\-p<papersize>\*[PREV]
+.char \[ps2pdf] \*[BD]ps2pdf\*[PREV]
+.char \[psselect] \*[BD]psselect\*[PREV]
+.char \[-T] \*[BD]\-T\*[PREV]
+.char \[-Tpdf] \*[BD]\-Tpdf\*[PREV]
+.char \[-Tps] \*[BD]\-Tps\*[PREV]
+.\" Strings for inline code
+.ds cod \E*[CODE]\&\E*[COND]
+.ds codx \E*[CONDX]\E*[CODE off]\&
+.\" Paragraph spacing
+.PARA_SPACE .3v
+.\" Wrapper around QUOTE
+.de COD
+. QUOTE
+. nop \*[COND]\\$*\*[CONDX]
+. QUOTE OFF
+..
+.\" Table of contents
+.TOC_PADDING 2
+.SPACE_TOC_ITEMS
+.AUTO_RELOCATE_TOC
+.TOC_ENTRY_STYLE 2 FONT I
+.TOC_LEAD 14.5 ADJUST
+.TOC_PADDING 1
+.\"
+.DOCHEADER_ADVANCE 5c \" Begin docheader this distance down from top of page
+.\"
+.NO_SHIM \" Use flex spacing
+.START
+.\"
+.SP .5c
+.HEADING 1 NAMED intro "Introduction"
+.PP
+.RW .12
+PDF documents are intended to be "electronic paper,\*[BU6]" and, as
+such, take advantage of the digital medium in ways that PostScript
+documents do not. Chief amongst these are clickable links that
+point to named destinations, either within the documents themselves
+.PDF_LINK internal PREFIX ( SUFFIX ) "internal links"
+or to remote web pages
+.PDF_LINK external PREFIX ( SUFFIX ), "external links"
+and the generation of a clickable document outline that appears in
+the Contents panel of most PDF viewers.
+.PP
+.RW .01
+Using \[groff] and \[mom] to produce PDF documents results in the
+automatic generation of clickable document outlines (discussed
+below,
+.PDF_LINK outline SUFFIX ), +
+and, if the \*[cod]TOC\*[codx] macro is included in the source file,
+entries in the printable table of contents can be clicked on as well
+when the document is viewed at the screen (see
+.PDF_LINK toc SUFFIX ). +
+.RW 0
+.HEADING 1 NAMED generating "Using groff to generate PDF files"
+.PP
+Groff provides more than one way to generate PDF documents from
+files formatted with the \[mom] macros. One is to call \[groff]
+directly, either with
+.COD "groff [\-Tps] \-mom \-m pdfmark doc.mom | ps2pdf \- doc.pdf
+which pipes output from the \[grops] PostScript driver through
+\[ps2pdf], or
+.COD "groff \-Tpdf \-mom doc.mom > doc.pdf
+which uses the native PDF driver, \[gropdf]. Alternatively, one may
+call the wrapper
+.COD "pdfroff \-mom \-mpdfmark \-\-no-toc doc.mom > doc.pdf
+A fourth, preferred method is to use
+.PDF_LINK pdfmom SUFFIX , "\[pdfmom]"
+which is strongly recommended since it implements the full range
+of PDF features available in \[mom].
+.COD "pdfmom doc.mom > doc.pdf
+One reason to prefer using the native PDF driver (via \[pdfmom] or
+\[-Tpdf]) is that papersizes set within mom source files (see
+.PDF_WWW_LINK https://www.schaffter.ca/mom/momdoc/typesetting.html#page-setup-intro SUFFIX ) \
+ "paper and page setup macros"
+do not require a corresponding \[-P-p<papersize>] flag on the
+command line.
+.PP
+There are other minor differences between the methods, discussed
+.PDF_LINK pdf-diff SUFFIX . "here"
+.RW 0
+.HEADING 1 NAMED links "Creating PDF links with mom"
+.PP
+Often, but not always, links in the body of a PDF document point
+to headings elsewhere in the same document. Creating these links
+is a simple process. First, identify the places to link to
+("destinations"), then link to them from any place in the document.
+.HEADING 2 NAMED naming "Creating destination points at headings"
+.PP
+The first step in creating links to a heading is to give the
+heading a unique destination name. With mom, this is done by
+adding \*[cod]NAMED\|<id>\*[codx] to the HEADING macro, where
+\*[cod]<id>\*[codx] is a unique identifier for the heading. For
+example,
+.PDF_TARGET intro-ex
+.COD "\&.HEADING 1 NAMED intro \[dq]Introduction\[dq]"
+would, in addition to printing the head in the body of the document,
+identify the introduction by the unique id, "intro"\*[BU6]. This
+id, or name, can then be used to create links to the introduction
+from any part of the document.
+.PP
+Furthermore, \*[cod]NAMED\|<id>\*[codx] stores the text of the
+heading for use later on when linking to it (see
+.PDF_LINK internal SUFFIX ). +
+If headings are being numbered, the heading number is prepended.
+.HEADING 2 NAMED target "Creating destination points at arbitrary locations"
+.PP
+Any part of a document can be a link destination, not just headings.
+For example, say you create a table that needs to be referred to
+from other parts of the document. You'd identify the location of
+the table by placing
+.COD "\&.PDF_TARGET <id> \[dq]<text>\[dq]"
+just above the table in the source file. As with
+\*[cod]HEADING\*[codx], \*[cod]<id>\*[codx] is any unique name.
+\*[cod]<text>\*[codx] is optional. \*[cod]<id>\*[codx] can now be linked
+to from anywhere in the document.
+.SP 2.5p
+.HEADING 2 NAMED internal "Creating internal links"
+.PP
+Internal links are clickable text areas that allow you to jump to
+named destinations within a document. (See
+.PDF_LINK external "here"
+for a description of external links.)
+.PP
+Internal links are created with the macro \*[cod]PDF_LINK\*[codx],
+which takes the form
+.COD "\&.PDF_LINK <id> [PREFIX <text>] [SUFFIX <text>] \
+\[dq]<hotlink text>\[dq]"
+where \*[cod]<id>\*[codx] is a named destination point elsewhere in
+the document (see
+.PDF_LINK naming +
+and
+.PDF_LINK target SUFFIX ). +
+.PP
+\*[cod]PREFIX\|<text>\*[codx] and \*[cod]SUFFIX\|<text>\*[codx], both or
+either of which are optional, are printed around the clickable area
+but do not form part of the link itself.
+.PP
+\*[cod]<hotlink text>\*[codx] is the text that should be clickable,
+identifiable in the PDF document by the colour assigned to links
+(see
+.PDF_LINK colour SUFFIX ). +
+.PDF_TARGET expando
+.PP
+If the hotlink text ends in \*[cod]\[dq]*\[dq]\*[codx]\*[BU9],
+the asterisk is replaced by the text of the destination
+point, assuming it's a heading. If the hotlink text ends in
+\*[cod]\[dq]+\[dq]\*[codx]\*[BU9], the replacement text is surrounded
+by quotes.
+.PP
+Using our
+.PDF_LINK intro-ex SUFFIX , "HEADING example"
+.RW .1
+above, the following invocation of \*[cod]PDF_LINK\*[codx] would
+produce a click\%able link to the introduction:
+.COD "\&.PDF_LINK intro PREFIX ( SUFFIX ). \[dq]see: +\[dq]"
+.RW 0
+In the text, the link would look like this:
+.PDF_LINK intro PREFIX ( SUFFIX ). "see: +"
+.HEADING 2 NAMED external "Creating external links"
+.PP
+External links are clickable text areas whose destination is a
+URL. Clicking on them causes a browser window to pop up with the
+destination address.
+.PP
+The format of the macro to create external links is similar to the
+one for creating internal links:
+.COD "\&.PDF_WWW_LINK <url> [PREFIX <text>] [SUFFIX <text>] [\[dq]<hotlink text>\[dq]]"
+\*[cod]<url>\*[codx] is any valid URL, usually a web address;
+\*[cod]PREFIX\|<text>\*[codx] and \*[cod]SUFFIX\|<text>\*[codx] have
+exactly the same meaning, as does \*[cod]<hotlink text>\*[codx],
+which furthermore accepts the same expandos, \*[cod]\[dq]+\[dq]\*[codx] and
+\*[cod]\[dq]*\[dq]\*[codx].
+.PP
+.RW .1
+If no hotlink text is given, then \*[cod]<url>\*[codx] is
+used as the text. If hotlink text is given and ends in
+\*[cod]\[dq]*\[dq]\*[codx]\*[BU9], the asterisk is replaced by the
+URL. If it ends in \*[cod]\[dq]+\[dq]\*[codx]\*[BU9], the URL is
+surrounded by quotes. As an example,
+.RW 0
+.COD "\&.PDF_WWW_LINK https://www.schaffter.ca/mom/momdoc/toc.html
+would open mom's online documentation at
+.PDF_WWW_LINK https://www.schaffter.ca/mom/momdoc/toc.html SUFFIX "."
+The same, with \*[cod]\[dq]here\[dq]\*[codx] supplied as
+hotlink text, lets you click
+.PDF_WWW_LINK https://www.schaffter.ca/mom/momdoc/toc.html "here"
+instead.
+.HEADING 2 NAMED colour "Assigning a colour to links"
+.PP
+The colour of links is set with
+.COD "\&.PDF_LINK_COLOR <xcolor> | <newcolor> | <r g b> | <#rrggbb>
+where \*[cod]<xcolor>\*[codx] or \*[cod]<newcolor>\*[codx] are the names
+of colours already initialized with
+.PDF_WWW_LINK https://www.schaffter.ca/mom/momdoc/color.html#xcolor "XCOLOR"
+or
+.PDF_WWW_LINK https://www.schaffter.ca/mom/momdoc/color.html#newcolor SUFFIX . "NEWCOLOR"
+If you prefer to define a new colour (using the RGB colour scheme),
+enter it either as 3 numbers between
+0.0 \*[UP 1p]\[->]\*[DOWN 1p] 1\*[BU4].0
+or as a 6 character hex string. Thus
+.SP .5v
+\*[FWD 6p]\*[cod].PDF_LINK_COLOR #ff0000\*[codx]
+\ \*[SIZE -.5]and\*[SIZE]\ \"
+\*[cod].PDF_LINK_COLOR 1.0 0 0\*[codx]
+.SP .5v
+both lead to mom using
+.PDF_LINK_COLOR 1 0 0
+.PDF_LINK colour red
+.PDF_LINK_COLOR
+links.
+.PP
+The default colour can be restored by calling
+\*[cod]PDF_LINK_COLOR\*[codx] with no parameter.
+.FLOAT
+.JUSTIFY
+.BOX-NOTE 3P
+\*[BD]Note:\*[PREV]
+The decimal scheme for creating colours must be used if a file is to
+be processed with
+\[oq]\[groff]\~\[-Tps]\~\[-mpdfmark]\[cq],
+\[oq]\[pdfroff]\[cq], or
+\[oq]\[pdfmom]\~\[-Tps]\[cq].
+.IBQ
+.FLOAT off
+.SP .5v
+.HEADING 1 NAMED outline "The PDF Outline"
+.PP
+Most PDF viewers provide a panel that displays a document's outline,
+similar to a table of contents. Clicking on an entry navigates
+directly to the appropriate place in the document.
+.PP
+Mom generates PDF outlines the same way she populates
+her own table of contents: by intercepting calls to the
+\*[cod]HEADING\*[codx] macro, as well as to the various title
+and chapter macros used in namimg documents, and allocating each a
+hierarchic level.
+.PP
+Covers, titles/chapters, and the table of contents are all
+assigned to level 1\*[BU5]. Subsequent headings are assigned to
+n\*[UP 1p]+\*[DOWN 1p]\*[BU4]1, where n is the level given to
+\*[cod]HEADING\*[codx].
+.PP
+.RW .22
+The PDF outline can sensibly recover from skipped or omitted heading
+levels; the printed table of contents cannot. Users are therefore
+advised to use headings in logical order, not for typographic
+effects.
+.RW 0
+.HEADING 2 NAMED open-close "Opening and closing levels
+.PP
+A level is said to be open if one or more levels beneath it is
+visible in the PDF outline. Closed \%levels have at least one level
+beneath them that is not visible unless the closed link is clicked.
+It is common for only the first two levels to be open so the outline
+doesn't look cluttered.
+.PP
+To establish which levels should be open by default when a document
+loads, use
+.COD "\&.PDF_BOOKMARKS_OPEN n
+where \*[cod]n\*[codx] is a number specifying at which level all
+subsequent ones should be closed.
+.PP
+If, at any point in the document, you specify
+.COD "\&.PDF_BOOKMARKS_OPEN NO \e\[dq] or any other text argument
+then all subsequent bookmarks will be closed until
+\*[cod]PDF_BOOKMARKS_OPEN\*[codx] opens them again.
+.HEADING 2 NAMED disabling "Suspending/disabling collection of outline entries
+.PP
+Suspending the collection of entries for the PDF outline is
+accomplished with
+.COD "\&.PDF_BOOKMARKS OFF
+Mom's default is to collect entries, so if the command is placed at
+the start of a document, it \%disables entry collection completely.
+Elsewhere, it suspends collection until you re-enable it with
+.COD "\&.PDF_BOOKMARKS \e\[dq] i.e. with no parameter
+.SP -1
+.HEADING 2 NAMED pdf:title "The PDF window title"
+.PP
+While not strictly part of the PDF outline, the title of a document
+can be displayed as the document viewer's window title. The macro
+to accomplish this is
+.COD "\&.PDF_TITLE\ \[dq]<window title>\[dq]
+It can take any text, so the viewer window title need not be the
+same as the document's title.
+.FLOAT
+.JUSTIFY
+.BOX-NOTE 4P+8p
+\*[BD]Note:\*[PREV] The macro, \*[cod]DOC_TITLE\*[codx], always
+invokes \*[cod]PDF_TITLE\*[codx]. If this is not what you want, you
+can remove the window title by issuing
+.COD ".PDF_TITLE \[dq]\[dq] \e\[dq] ie. with a blank argument
+.IBQ
+.FLOAT off
+\#.SP .5v
+.HEADING 1 NAMED toc "Tables of Contents"
+.RLD .5v
+.HEADING 2 NAMED toc:gen "Generating a Table of Contents
+.PP
+.RW .1
+To generate a printable Table of Contents for any document, simply
+insert the macro, \*[cod]TOC\*[codx], as the last line of the source
+file. (Formatting of the printable Table of Contents is discussed in
+detail in the
+.PDF_WWW_LINK \
+https://www.schaffter.ca/mom/momdoc/tables-of-contents.html#top \
+SUFFIX ). "mom documentation"
+When the file is processed and loaded in a viewer, entries in the
+Table of Contents will be clickable links.
+.RW 0
+.PP
+Whichever link colour is active at the end of the document, prior to
+\*[cod]TOC\*[codx], will be used for the \%Table of Contents
+links.
+.HEADING 2 NAMED toc:pos "Positioning the Table of Contents"
+.PP
+If \[groff]'s PostScript device (\[-Tps]) is used to process a mom
+file, the Table of Contents is printed at the end of the document.
+When this is not desirable, the PostScript output from \[groff]
+must be processed with \[psselect] in order to place the TOC in the
+preferred location.
+.PP
+When using mom and \[groff]'s native pdf device (via \[pdfmom] or
+\[groff] \[-Tpdf]), positioning of the Table of Contents can be done
+within the source file.
+.PP
+The command to control the placement of the TOC is
+.COD "\&.AUTO_RELOCATE_TOC [<position>]
+where the optional \*[cod]<position>\*[codx] can be one of these
+keywords:
+.LEFT
+.IL 2P
+.SP .25v
+\*[SIZE -.7]TOP\*[FU2]\*[UP .5p]\c
+.FOOTNOTE
+\*[BD]Note:\*[PREV] Documents without a COVER or DOC_COVER require
+the \*[cod]TOP\*[codx] argument.
+.FOOTNOTE off
+\*[IT]\*[SIZE +.2]\
+(ie. at the very start of the document)\*[SIZE -.2]\*[PREV]
+BEFORE_DOCCOVER
+AFTER_DOCCOVER
+BEFORE_COVER
+AFTER_COVER\*[SIZE +.7]
+.SP .25v
+.ILQ
+.JUSTIFY
+It is normally not necessary to supply a keyword, since
+\*[cod]AUTO_RELOCATE_TOC\*[codx] places the TOC after the DOC_COVER,
+if there is one, or the first COVER when no DOC_COVER is present.
+In rare instances where it is desirable to place the TOC somewhere
+else in the document, there are two low-level commands,
+\*[cod].TOC_BEFORE_HERE\*[codx]
+\ \*[SIZE -.5]and\*[SIZE]\ \"
+\*[cod].TOC_AFTER_HERE\*[codx]
+which place the TOC either before or after the current page.
+.PP
+These last two commands have a small catch: although the TOC will
+appear where specified, the \%"Contents" entry in the PDF outline,
+which observes a hierarchy of levels, will assign the TOC to
+level\~\*[BU4]1\*[BU4], possibly disrupting the visual ordering of
+levels in the outline.
+.HEADING 1 NAMED simplify "pdfmom: Simplifying PDF output"
+.PP
+As explained in the section
+.PDF_LINK generating SUFFIX , *
+.RW .15
+there are two established methods
+.RW 0
+for creating PDF files with \[groff]: the original method, ie.
+passing the \[-Tps] and \[-mpdfmark] options to \[groff] (or using
+\[pdfroff], which does this for you); or the newer \[-Tpdf], which
+produces PDF files natively.
+.HEADING 2 NAMED fwd:ref "The problem of forward references"
+.PP
+.EW .2
+Both methods encounter difficulties when dealing with forward
+references; that is, when a link \*[IT]\%earlier\/\*[PREV] in a
+document refers to a destination \*[IT]later\/\*[PREV] in the
+document and the link text terminates
+.EW 0
+with one of the expandos,
+\*[cod]\[dq]*\[dq]\*[codx] or \*[cod]\[dq]+\[dq]\*[codx]
+(explained
+.PDF_LINK expando SUFFIX ). "here"
+Mom doesn't know what text to put in the expando because it has not
+yet been defined. This means that \[groff] must be run multiple
+times to find the unknown text.
+.PP
+.EW .2
+The program \[pdfroff] exists to handle these multiple runs, but it
+imposes some limitations on the PDF features available with \[mom].
+.EW 0
+.HEADING 2 NAMED pdfmom "pdfmom"
+.PP
+\[pdfmom] performs the same function as \[pdfroff], and is the
+preferred, trouble-free way to generate PDF documents from a mom
+source file. Like \[pdfroff], it is a frontend to \[groff] and
+accepts all the same options (see \[man]\~\[groff]).
+.PP
+.EW .2
+Called as-is, \[pdfmom] accepts all the same options as \[groff],
+and requires no additional flags. PDF generation is performed by
+\[gropdf], \[groff]'s native PDF driver:
+.EW 0
+.COD "pdfmom doc.mom [groff opts] > doc.pdf
+If a \[-Tps] option is supplied, \[pdfmom] hands control over to
+\[pdfroff], and both \[groff] and \[pdfroff] options may given.
+The resulting PDF is produced from PostScript output fed into
+\[ghostscript].
+.COD "pdfmom \-Tps [pdfroff opts [groff opts]] doc.mom > doc.pdf
+For either invocation, it is not necessary to add \[-mom] or
+\[-mpdfmark], as these are implied.
+.PP
+.RW .04
+If Encapsulated PostScript or plain PostScript images have been
+embedded in a document with
+.PDF_WWW_LINK https://www.schaffter.ca/mom/momdoc/images.html#pspic SUFFIX , \
+ "PSPIC"
+the \[-Tps] option must be used. In most other cases, \[pdfmom]
+with no \[-T] flag is preferable.
+.RW 0
+.HEADING 2 NAMED papersize "Setting papersize within a source file"
+.PP
+A significant convenience afforded by using \[pdfmom] (or \[groff]
+with the \[-Tpdf] flag) is that papersizes or page dimensions set
+within mom source files (see
+.PDF_WWW_LINK https://www.schaffter.ca/mom/momdoc/typesetting.html#page-setup-intro \
+ SUFFIX ) "paper and page setup macros"
+do not require a corresponding \[-P-p<papersize>] option on the
+command line. It is even possible to create documents with
+unequal-sized pages.
+.HEADING 2 NAMED pdf-diff \
+"Differences between pdfmom and pdfroff"
+.PP
+Several features described in this manual are not available when
+the \[-Tps] option is given to \[pdfmom], nor when using \[pdfroff]
+or \[groff]\~\[-Tps]\~\[-mpdfmark]:
+.SP .25v
+.QUAD LEFT
+.HYPHENATION off
+.IB 16p
+.LIST
+.ITEM
+.PDF_LINK toc:pos "Relocation of the Table of Contents"
+is not supported. The TOC appears at the end of the document;
+\[psselect] must be used to re-order pages.
+.ITEM
+If a link crosses a page boundary, it will stop being a clickable
+hotspot on subsequent pages.
+.ITEM
+When establishing whether PDF outline levels are
+.PDF_LINK open-close SUFFIX , "open or closed"
+only the numerical parameter to \*[cod]PDF_BOOKMARKS_OPEN\*[codx] has
+any effect.
+.ITEM
+.PDF_LINK colour "PDF_LINK_COLOR"
+only accepts colour definitions in decimal notation.
+.LIST OFF
+.IQ
+.HEADING 1 \
+"Comparison of \-Tps\*[FU4]/\*[FU2]\-mpdfmark with \-Tpdf\*[FU4]/\*[FU2]\-mom
+.SP .25v
+.IB
+\[-Tps]\*[FU4]/\*[FU2]\[-mpdfmark]
+.LIST
+.SHIFT_LIST 1P+6p
+.ITEM
+does not support all the features described here
+.ITEM
+accepts images and graphics embedded with PSPIC
+.LIST OFF
+.IQ
+.ALD .4v
+.IB
+\[-Tpdf]\*[FU4]/\*[FU2]\[-mom]
+.LIST
+.SHIFT_LIST 1P+6p
+.ITEM
+facilitates embedding fonts directly in the PDF file (if the
+\[-P-e] flag is given on the command line)
+.ITEM
+sets papersize from within the source file, circumventing the need
+for the papersize flag (\[-P-p<papersize>]) on the command line
+.ITEM
+is not compatible with
+.PDF_WWW_LINK \
+ https://www.schaffter.ca/mom/momdoc/docprocessing.html#printstyle \
+ "PRINTSTYLE TYPEWRITE"
+underlining (e.g., of italics)
+.ITEM
+generally produces larger files; these can be reduced by piping
+the output through \[ps2pdf]\*[B]
+.sp -1.25v
+.BOX OUTLINED black SHADED grey90 WEIGHT 1p INSET 6p
+.JUSTIFY
+\*[BD]Note:\*[PREV] Owing to a known bug, PDF files piped through
+\[ps2pdf] lose some of their metadata, notably the window title set
+with \*[cod]PDF_TITLE\*[codx].
+.BOX STOP
+.SP -.25v
+.LIST OFF
+.TOC
+.\" Local Variables:
+.\" mode: nroff
+.\" End:
+.\" vim: filetype=groff:
diff --git a/contrib/mom/examples/mom.vim b/contrib/mom/examples/mom.vim
new file mode 100644
index 0000000..fe8debf
--- /dev/null
+++ b/contrib/mom/examples/mom.vim
@@ -0,0 +1,140 @@
+" Copyright (C) 2012-2020 Free Software Foundation, Inc.
+"
+" Copying and distribution of this file, with or without modification,
+" are permitted in any medium without royalty provided the copyright
+" notice and this notice are preserved.
+
+" Vim syntax file
+" Language: mom
+" Maintainer: Peter Schaffter (peter@schaffter.ca)
+" Last Change: So 06 Mär 2005 17:28:13 CET
+" Filenames: *.mom
+" URL: http://www.cvjb.de/comp/vim/mom.vim
+" Note: Remove or overwrite troff syntax for *.mom-files with filetype/filedetect.
+" Version: 0.1
+"
+" Mom: Macro set for easy typesetting with troff/nroff/groff.
+
+" For version 5.x: Clear all syntax items
+" For version 6.x: Quit when a syntax file was already loaded
+if version < 600
+ syntax clear
+elseif exists("b:current_syntax")
+ finish
+endif
+
+" Mom is case sensitive
+syn case match
+
+" Synchronization, I know it is a huge number, but normal texts can be
+" _very_ long ;-)
+syn sync lines=1000
+
+" Characters allowed in keywords
+if version >= 600
+ setlocal iskeyword=@,#,$,%,48-57,.,@-@,_,\\,{,},192-255
+else
+ set iskeyword=@,#,$,%,48-57,.,@-@,_,\\,{,},192-255
+endif
+
+" mom/groff macros and requests (the initial dot or single-quote)
+"
+" Highlighting carries through to EOL; macro names, requests and
+" arguments are contained
+syn match startRequest /^\s*\(\.\|'\)\s*.*$/ contains=momMacro,groffCommentLine,groffRequest,momRegister,groffNoLineBreak,momInteger,groffUnit,momString,momSpecialParam,groffDelimiter,groffRegister,groffPreprocessor,groffBraces
+
+" mom macros
+syn region momMacro start=/^\s*\(\.\|'\)\s*\zs[A-Z0-9_(){}\[\]]\+/ end=/\s\+\|$/
+
+" mom registers and strings
+syn match momRegister /\(\$\|#\)[A-Za-z][_0-9A-Za-z]*/ contains=momRegisterStart
+
+syn match momRegisterStart /#\|\$/ contained
+
+" mom comment region
+syn region momCommentRegion matchgroup=startRequest start='\<\.\(COMMENT\)\|\(SILENT\)\>' end='\<\.\(COMMENT\s\+OFF\)\|\(SILENT\s\+OFF\)\>' skip='$'
+
+" groff requests
+syn match groffRequest /^\s*\(\.\|'\)\s*\zs[a-z0-9]\+/
+
+" groff comment region
+syn region groffCommentLine start='\(\\!\)\|\(\\"\)\|\(\\#\)' end='$' contains=momTodo
+syn region groffCommentRegion start="^\s*\.\s*ig" matchgroup=startRequest end="^\.\.$" contains=startRequest
+
+" Preprocessor requests
+syn match groffPreprocessor /[^A-Z]\zs\(EQ\s*$\|EN\s*$\|GS\s*$\|GE\s*$\|GF\s*$\|PS\s*$\|PE\s*$\|R1\s*$\|R2\s*$\|TS\s*$\|TE\s*$\|TH\s*$\)/ contained
+syn match groffPreprocessor /[^A-Z]\zs\(G1\s*$\|G2\s*$\|IS\s*$\|IE\s*$\|cstart\s*$\|cend\s*$\)/ contained
+
+" Preprocessor requests for refer
+syn match groffPreprocessor /\(\[\s*$\|\]\s*$\)/ contained
+
+" Quoted strings
+syn region momString matchgroup=startRequest start='"\zs' end='"\|$' contains=groffNoLineBreak,groffGreek,groffSpecialChar,momInteger,momFloatEN,momFloatDE,momBracketRegion,momBracketError,momSpecialMove contained
+
+" Special characters
+syn match groffSpecialChar '\\\((\|\[\)[-+A-Za-z0-9*<>=~!\/]\+\]*'
+
+" Greek symbols
+syn match groffGreek '\\(\*[A-Za-z]\+'
+
+" Hyphenation marks
+syn match groffHyphenation '\\%'
+
+" Masking of line breaks
+syn match groffNoLineBreak /\\\s*$/ contains=groffBraces
+
+" groff number and string register delimiters
+syn region groffDelimiter start=/\\*\\\(n+*\|\*\)\((\|\[\)\</ end=/\(\s\|\]\|$\)/ contains=momRegister,groffRegister,groffOperators
+
+" groff registers
+syn match groffRegister /\\\((\|\[\)\zs\.*[a-z]\+/
+
+" groff operators
+syn match groffOperators /\(+\|-\|\/\|\*[^[]\)/ contained
+
+" Units (of measure)
+syn match groffUnit '[-+]\=\([0-9]\|]\)\+\zs[icPpvusfz]\=' contained
+
+" Braces
+syn match groffBraces /\(\\{\|\\}\)/ contained
+
+" Error
+syn match groffError '\\\[ \+[[:print:]]\+ \+[[:print:]]\+\]'
+
+" For version 5.7 and earlier: only when not done already
+" For version 5.8 and later: only when an item doesn't have highlighting yet
+if version >= 508 || !exists("did_mom_syn_inits")
+ if version < 508
+ let did_mom_syn_inits = 1
+ command -nargs=+ HiLink hi link <args>
+ else
+ command -nargs=+ HiLink hi def link <args>
+ endif
+
+HiLink groffError Error
+HiLink groffBraces darkmagenta
+HiLink groffCommentLine darkcyan
+HiLink groffCommentRegion cyan
+HiLink groffDelimiter cyan
+HiLink groffGreek cyan
+HiLink groffHyphenation cyan
+HiLink groffNoLineBreak cyan
+HiLink groffOperators white
+HiLink groffPreprocessor brown
+HiLink groffRegister darkgreen
+HiLink groffRequest magenta
+HiLink groffSpecialChar darkcyan
+HiLink groffUnit brown
+HiLink momCommentRegion darkcyan
+HiLink momMacro red
+HiLink momRegister green
+HiLink momRegisterStart magenta
+HiLink momSpecialParam red
+HiLink momString white
+HiLink startRequest yellow
+ delcommand HiLink
+endif
+
+let b:current_syntax = "mom"
+
+" vim:ts=8:sw=4:nocindent:smartindent:
diff --git a/contrib/mom/examples/mon_premier_doc.mom b/contrib/mom/examples/mon_premier_doc.mom
new file mode 100644
index 0000000..3497c06
--- /dev/null
+++ b/contrib/mom/examples/mon_premier_doc.mom
@@ -0,0 +1,140 @@
+.\" -*- mode: text; coding: utf-8; -*-
+\#
+\# Copyright (C) 2015-2020 Free Software Foundation, Inc.
+\#
+\# Copying and distribution of this file, with or without modification,
+\# are permitted in any medium without royalty provided the copyright
+\# notice and this notice are preserved.
+\#
+\# A very simple document with basic elements: headings, paragraphs,
+\# lists, table of contents and clickable links.
+\#
+.TITLE "Mon Premier Document"
+.AUTHOR "Cicéron"
+.
+.DOCTYPE DEFAULT
+.PRINTSTYLE TYPESET
+.
+.PAPER A4
+.DOC_COVERTITLE "Mon Premier Document"
+.DOC_COVER DOC_COVERTITLE AUTHOR
+.COVER TITLE
+.ATTRIBUTE_STRING "par"
+.TOC_HEADER_STRING "Table des matières"
+.AUTO_RELOCATE_TOC
+.HEADING_STYLE 1 NUMBER
+.HEADING_STYLE 2 NUMBER
+.NO_SHIM
+.START
+\#
+.HEADING 1 "Les différentes versions"
+.PP
+Voir également le chapitre sur
+.PDF_LINK evolution "les évolutions"
+possibles.
+.HEADING 2 "La version originale"
+.PP
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non
+risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec,
+ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula
+massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci
+nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl
+sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae,
+consequat in, pretium a, enim. Pellentesque congue. Ut in risus
+volutpat libero pharetra tempor. Cras vestibulum bibendum augue.
+Praesent egestas leo in pede. Praesent blandit odio eu enim.
+Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum
+primis in faucibus orci luctus et ultrices posuere cubilia Curae;
+Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum.
+Maecenas adipiscing ante non diam sodales hendrerit.
+.PP
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non
+risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec,
+ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula
+massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci
+nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl
+sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae,
+consequat in, pretium a, enim. Pellentesque congue. Ut in risus
+volutpat libero pharetra tempor. Cras vestibulum bibendum augue.
+Praesent egestas leo in pede. Praesent blandit odio eu enim.
+Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum
+primis in faucibus orci luctus et ultrices posuere cubilia Curae;
+Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum.
+Maecenas adipiscing ante non diam sodales hendrerit.
+.PP
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non
+risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec,
+ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula
+massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci
+nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl
+sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae,
+consequat in, pretium a, enim. Pellentesque congue. Ut in risus
+volutpat libero pharetra tempor. Cras vestibulum bibendum augue.
+Praesent egestas leo in pede. Praesent blandit odio eu enim.
+Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum
+primis in faucibus orci luctus et ultrices posuere cubilia Curae;
+Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum.
+\#
+.HEADING 2 "La version moderne"
+.PP
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non
+risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec,
+ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula
+massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci
+nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl
+sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae,
+consequat in, pretium a, enim. Pellentesque congue. Ut in risus
+volutpat libero pharetra tempor. Cras vestibulum bibendum augue.
+Praesent egestas leo in pede. Praesent blandit odio eu enim.
+Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum
+primis in faucibus orci luctus et ultrices posuere cubilia Curae;
+Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum.
+Maecenas adipiscing ante non diam sodales hendrerit.
+.PP
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non
+risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec,
+ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula
+massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci
+nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl
+sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae,
+consequat in, pretium a, enim. Pellentesque congue. Ut in risus
+volutpat libero pharetra tempor. Cras vestibulum bibendum augue.
+Praesent egestas leo in pede. Praesent blandit odio eu enim.
+Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum
+primis in faucibus orci luctus et ultrices posuere cubilia Curae;
+Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum.
+Maecenas adipiscing ante non diam sodales hendrerit.
+\#
+.HEADING 1 NAMED evolution "Les évolutions du Lorem"
+.PP
+Trois axes de progressions sont envisageables:
+.LIST
+.SHIFT_LIST 3m
+.ITEM
+Lorem ipsum dolor sit amet.
+.ITEM
+Consectetur adipiscing elit.
+.ITEM
+.PDF_TARGET sed_non_risus
+Sed non risus.
+.LIST OFF
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non
+risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec,
+ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula
+massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci
+nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl
+sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae,
+consequat in, pretium a, enim. Pellentesque congue. Ut in risus
+volutpat libero pharetra tempor. Cras vestibulum bibendum augue.
+Praesent egestas leo in pede. Praesent blandit odio eu enim.
+Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum
+primis in faucibus orci luctus et ultrices posuere cubilia Curae;
+Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum.
+Maecenas adipiscing ante non diam sodales hendrerit.
+\#
+.TOC_RV_SWITCH
+.TOC
+.\" Local Variables:
+.\" mode: nroff
+.\" End:
+.\" vim: filetype=groff:
diff --git a/contrib/mom/examples/penguin.pdf b/contrib/mom/examples/penguin.pdf
new file mode 100644
index 0000000..5e969ea
--- /dev/null
+++ b/contrib/mom/examples/penguin.pdf
@@ -0,0 +1,148 @@
+%PDF-1.4
+1 0 obj
+<<
+/Pages 2 0 R
+/Type /Catalog
+>>
+endobj
+2 0 obj
+<<
+/Type /Pages
+/Kids [ 3 0 R ]
+/Count 1
+>>
+endobj
+3 0 obj
+<<
+/Type /Page
+/Parent 2 0 R
+/Resources <<
+/XObject << /Im0 8 0 R >>
+/ProcSet 6 0 R >>
+/MediaBox [0 0 81 96]
+/CropBox [0 0 81 96]
+/Contents 4 0 R
+/Thumb 11 0 R
+>>
+endobj
+4 0 obj
+<<
+/Length 5 0 R
+>>
+stream
+q
+81 0 0 96 0 0 cm
+/Im0 Do
+Q
+endstream
+endobj
+5 0 obj
+29
+endobj
+6 0 obj
+[ /PDF /Text /ImageC ]
+endobj
+7 0 obj
+<<
+>>
+endobj
+8 0 obj
+<<
+/Type /XObject
+/Subtype /Image
+/Name /Im0
+/Filter [ /RunLengthDecode ]
+/Width 81
+/Height 96
+/ColorSpace 10 0 R
+/BitsPerComponent 8
+/SMask 15 0 R
+/Length 9 0 R
+>>
+stream
+õ…ì„þ…Ú„û…ø„û…û†þ‚þzþkûeþXûfþmþzþ~û†›…þ„þ…þ„þ…ì„þ…Ñ„õ…þ€þpþ\þQøIþGûJþMþPþXþfþv›…ø„þ…ì„þ…Ñ„þ†þ‡þ„þwþ]þPûJþIûJþIøKþHþIþKþNþwþƒ•…ì„þ…ø„þ…à„þ…þ†þ…þnþKþNþKþJïIþHøIþHþJþPþgþ€þ„þ‡¤…þ„þ…ì„þ…Ô„þ…þ„þ†þOþNþHþJûIþJòHûIþQþiþ_þHþIþXþ{¡…þ„þ…ì„þ…ׄû…þþQþGàJþIþOþqþ”þ¦þ…þgþJþHþRþ}þ…þ†°…û„þ…ì„þ…Ú„þ…þ„þ†þmþNþKàJþHþMþrþ™þ¨þþxþ[þJþMþcþƒþ†³…ø„þ…ì„þ…Ú„þ…þ†þþXþHþKÝJþTþvþ–þ›þ€þwþbþJþKþOþsþ…þ‡³…û„þ…ì„þ…Ú„þ…þ†þsþJþHþIãJþKþIþSþoþ‚þ{þYþWþQþKþMþHþZþƒþ‡³…þ„û…ì„þ…Ú„û…þ_þGûIãJþIþJþNþ[þ`þOþMþKþIþMþJþIþKþt³…¶„û…þRþIþHþIþMæJþIþKûJþNþKþNþIþMþKþIþKþJþ]þ†þ„­…ì„þ…Ú„þ…þƒþJþKûIþKþIãJþKûJþIþJøKþIþJþIþOþ€ª…ì„þ…ׄþvþMûJþHþNþRþMæJþKþOþRþSûMûKøIþMþsþƒ­…ì„þ…ׄþuþKþGþKþQþYþpþmþPûKûJøKþGþHþIþZþ~þNþIûKþJþHþIþKþoþ„­…ì„û…ø„þ…é„þ…þuþMûHþœþ®þ‘þ[þsþ`þMøJþjþ™þ®þ¸þ¾þÃþŸþnþXøKþJþKþNþ\ª…ø„þ…ø„û…û„þ…ø„þ…ò„þ…þtþMþGþ_þÃþÔþÇþŸþZþXþKûJþeþ¢þºþÃþÌþÒþÚþÊþPþYûKþJþHþIþJþXª…õ„þ…û„þ…Ú„þ…þsþMþGþƒþÚþéþæþÖþ–þJþKûJþ—þÌþìþ÷ûùþõþáþlþJûKþIþHûIþPª…ì„þ…Ú„þ…þsûMþªþâþÐþòþþââáþWþIûJþÅþùþýââáþ•þ˜þÚûüûþþGûKþJþIûHþOª…ì„þ…é„þ…õ„þ…þtþIþXþÒþ`þ„þšþïþûþsþVþMþOþÒþüþîþfþXþœ‘’‘þ×þÒþTûKþJþHþIþHþMª…ì„þ…Ú„þ…þsþJþ]þÝþHþ„þ–þ´þüþˆþfþvþxþÓþüþ¬þNþJþoþ¡‘’‘þìþgûKþJûIþHþMþ„¹…³„þzþKþ\þÝþOþ\‘’‘þˆþúþ‚þZþ]þjÀÁÀþøþŽþFþMþVþnþ{þñþhøJøIþKþ„­…ì„þ…ì„û…ï„þSþWþÖþMþNþiþzþØþyþþ‚þþ”þîþþKûJþKþnþïþkþIþJþIþJþIþMþHþ†­…ì„þ…Ô„þRþOþÄþWþKþRþ‚þµþÎþÓþÑþÍþ¿þÍþ­þJþMþKþOþžþãþ^øIþJøIª…ì„þ…õ„þ…ã„þSþHþnþëþ¨þ¸þÍþ×øØþÜþßþãþáþÝþÐþ·þÐþêþvûHþIþJûIþJþFª…ì„þ…Ô„þSþFþOþ³þ·þÆþÔøØþÛþàþæþèþæþåââáþÞþ×þÎþ|þPòIþJþGª…õ„þ…û„þ…ï„þ…é„þRþGþfþ³þÁþÍþÕûØþÚþÝââáþèþçþæøåþæþãþÂþhûJûIþJþMþHª…ì„þ…õ„þ…ã„þ]þTþ•þºþÉþÒûØþÙþÜþßââáþèþæõåþÚþ¿þÌþqþMþKþIþJþMþIþMþ„­…ì„û…Ú„þ…þeþ^þ¥þÀþÍþÕûØþÚþÝþáþåþæøåââáþÊþ·þ¼þ»þbþKþMþJþIûJþNþ~þ…þ†³…ø„þ…ø„û…ï„þ…û„þ…ø„þ…þgþYþŸþÆþÎþØþÙþÚþÜþÞþâþæþåþäþãþØþºþ¹þÄþÇþ¹þ]þMþKþIþJþGþIþPþlþ„þ‡³…õ„þ…û„þ…Ô„þcþKþoþ¼þÓþÙûÚþÞþáþäþãþáþÚþ¾þ°þ¿þÅûÇþ™þQþJþKþþ‡þXþBþIþYþ„þ†³…ì„þ…Ô„þbþNþWþ˜þ²þÐþÚþÞþàþáþàþÚþ¶þ¦þ²þÁþÄþÇþÄþ»þ˜þSûHþvþ¨þŸþ‚þRþMþ|þ†³…ì„þ…þ„þ…ï„þ…õ„þ…þ†þgþMþ[þËþ²þ¡þ¨þÁþÌþÆþÂÀÁÀþ¾þ½þ»þ´þ¹þÊþÒþØþÎþ‰þJþKþMþq©ª©þªþ™þIþNþx³…ì„û…û„þ…ì„û…û„þZþHþiþÍþËþ±þŸþ®þ¿þÁþÀþ½þ²þ°þ³ÀÁÀûÍþÐþÜþÝþºþRþJþKþQþŒþ›þmDEDþIþZþƒþ‡¶…ï„û…æ„þ…þ†û…þvþPþMþ`þÐþÍþÌþ¶þ¡þ¢þ§þ©þ¦þ¤þ¶þÇûÍþÓþçþ÷þüþåþþKþMþJþIþSþMþJþIþOþtþ‡þ†¼…ì„þ…é„þ…þ„þ…þ„þ…þƒþWþKþIþ_þáþÒûÍþÈþ¶û«þ­þÇþÌûÍþ×þéþúûþûüûþËþWòKþJþIþNþ^þƒþ„¼…ï„û…ã„þ…þƒþ„þnþNþKþIþ þìþØûÎþÍþÎòÍþÒþÝþê÷ø÷õþþûþ…þPòKþJþIþTþmû‡¿…ì„þ…à„þ…þzþcþXþFþkþæþùþêþÑþÍûÎþÍþÎþÍþÏþØþäþñþùøþþýþþþýþÕþ\þKþNþHþKøJþOþ\þ~û…þ„Å…ì„þ…à„þ€þ]þgþTþQþ¿þùþþþùþÝïÍþÝþì÷ø÷þýòþþýþüþùþ•ûNûKþIþKþIþJþKþ`þ„¿…õ„þ…þ„û…æ„þ…þ„þZûJþFþ†þ÷þþþüþýþðþØþÐøÍþ×þöûüûøþþýøþþýþþþýþÕþQþIþJþKûIþJþIþKþMþsþ…þ„Å…õ„þ…û„þ…ã„þmþOþPþMþWþÙþýþþþýþþþý÷ø÷þëþáþãþëþôøýûþþýïþþøþ|þGþIþKõIûJþZþ}Î…Ë„ø…þzûKþIþ^þÛûüûþýòþþüûüûþýûþòýìþþüþÒûKûJþIøJþIþMþOþeõ…þ„ø…õ„þ…þ„þ…þ„þ…þ„û…ì„þ…ø„û…þ„þˆþ†þ€þSþJþHþMþþìþûûÿõþþýþüþýûþþýûþþýìþþýþúþèþ_þMþKõJûKþIþJþKþ„þ†Ë…ì„þ…ø„û…þ„þ…þþ_þKþJþFþXþ°þèþúþþþÿûýûþþýûúþýïþþýûþþýþüþ÷ûóþïþxþPìKþIþHþIþjÑ…þ„û…ì„þ…õ„þ…û„þfþPþKþJþFþ\þ´þØþóþûþüþþþýþû÷ø÷þôþðþïþöþúûüûüûþýûüûþúþù÷ø÷þóþïþéþâþæþëþ™þYþKþJþKþJþIûJþKþIþJþPþoË…ì„û…ø„þ…þ„þuûNøJþnþ¸þÅþÙþìþñûû÷ø÷þñþéþçþëþìþõýûüûûüûþùþòþèââáþÜûØþÖþÒþÓþàþÐþdûJþGþMþIþNþKþJûIþNþOþvÎ…ì„þ…ø„û…þþ\þNþHûJþWþ‚þ»þÂþÕþäþïþüþýþþþýþñþê÷ø÷þüõþþýþùþñþéþÝþÔûÒûÑþÒþåþÅþVþOþwþ`þJþIþKûJþIþHþMþ]þ‚Ñ…õ„ò…û„û…þsþOþJûKþJþ]þþÇþÜþïþùþþþýþüþþþýþòþôøýûüþþûýþþþüþúþíþåþÜþÕþÒþÑþØþò©ª©þCþhþ‚þrþXþMþNþIþKûJþOþuÝ…ø„þ…ø„þ…ø„þ…ø„þ†þƒþ]þKþNþIþYþMþrþ¾þãþôþüûýþþøý÷ø÷÷ø÷þüþýþüòýûüþþþýþü÷ø÷þîþáþ×þÒþàþïþKûNþkþ…þ]þKþNþKûJþMþdû†×…õ„þ…û„þ…ø„þ†þþTþOþHþqþsþQþ¡þæ÷ø÷þýþþõýþüþýûüûûüûýþüþýþþõýþþûýþüþýþøþëþÜþÓþéþQþJþNþIþ_þ†þSDEDþOþKþJþIþRþ~þ…þ†à…þ„þ…ì„þ…ø„þ†þjûMþsþ_þKþ þüþþþüþýþþòýûüþþþüþþþýþüøýþüûýûþõýþþþýþñþÜþÏþNþHþ`þnþcþwþkþJþKþJþFþMþQþ‚Ý…þ„þ…ì„þ…ø„þƒþZþPþYþ‚þGþHþîøþþüòýþüþýþþøýþüþýûüûýþþþýþþòýþþþýþþûôþkþPþqþŠþƒþgþ€þSþKþJþKþJþNþv×…û„þ…õ„þ…þ„þ†þ…þwþPþMþ}þeþGþNþüõýþüûýþþûýûüþýþüþýþüþýþþìýþüûýþþþýþþþüþýþþþ¦þWþxþþ†þeþlþtþMþIþJþIþKþ`þ„Ú…ì„þ…þ„þ‡þ„þdþJþWþ}þIþJþmûüûþýþüþýþüþýþüøýþüþúûüûþüøýþþþüþýþþûýþþûýþüþþþýþüõýþþþÑþbþqþwþiþTþQþ‹þKþNþIþKþNþTþÚ…þ„þ…ò„ø…þþYþHþoþfþBþOþ©þüæýþûþïòüþýþüþþûýþüõýþüþþûýûþûýþìþYþNþPûKþGþqþIþNþHûIþKþtþ„Ý…ì„þ…þ„þ…þvþMþKþƒþPþCþdââáþýûüûýþüûýþþþüþ÷þíûüûþýþþûýþüþýþüõýþüìýûüþýûüûþuþMûJþKþGþ]þGþNøIþKþcÚ…ì„û…þ„þ`þKþeþtþKþHþœþúþüþýþüìýþõþñþýþþøýþþþýþüïýûþõýþþøýþ–þHûKþIþJþPþRûHþIþHþJþRþ‚ã…þ„þ…ì„û…þyûMþ{þWþKþQþÐûüûþûýþþþüøýûñþüéýûüõýûüûõýþüûýþþþ²þMõKþNþGþHþKþJþIþKþPþ{é…ø„þ…ø„þ…ø„þ…þ„þOþNþ\þsþGþKþ”þüþýþþþüþþõýþüþýþüþëþïþüþýþþõýþüþþøýþþøýþþøýþüûýþþþÉþJûKþJþHþTþHþFþIþJþHþJþMþgÚ…õ„û…þ†þ€þJþGþfþoþHþIþ¹ûýûþøýþüþýþþûüþëþïþûûüþýûüûýþüþþûýþüøýþþõýþüûýþØþMûKþIþMþ`þIþGþHûIþHþMþbé…û„û…ï„þ†þ„þlþKþIþeþsþIþYþ×þýþüõýûþûýþþûüûþèþîûüûûüþýþþæýûüþýþüþþûýþþûýþÝþSøKþJþmþIþJþIþHûJþIþQÝ…õ„þ…þ„þ…þþRþMþFþiþ{þKþYþÞþþþüòýþüþýþþþýûüûþçþîûüþýþþûýþüõýþüþýþüøýûüþþþýþüþýþþââáþRûKþMþKþyþIûJþIþHþKþJþPã…þ„þ…ì„þhþMþKþQþrþ€þIþ^þçòýþüþþõýþûþçþðþüõýûüþýþþûýþþþüøýþüþýûüþþøýþäþSøKþIþwþIþJøIûJþOÚ…ò„þ…þbþOþNþbþ‰þ‘þKþnþîþýûþøüûýþüûüûþýþúþèþòûüÝýþüþþþýþüþýþþûýþüþþþåþTøKþWþrûKûJøIþOÝ…ï„þþXþIþHþXþ~þ˜þOþ|þñþýþþøýþüòýþùþèþòþýþüûýûþþýþüþþþýøþøýþþþüûýþüþýþüþþþãþVûKþHþmþXûKþJþHøIþQÝ…û„þ…ø„þ‚þRûJþIþWþ…þZþ|þóøýþüûýþüøýþüþúþèþôõýþüæýþüïýþüþþþýþÖþPþHþJþRþ{þKþNþJþKøJþKþSÝ…ï„þþVûIûMþ[þuþþòþýþüæýþúþèþôþýþüþýþþþýûþòýûüãýþÅþKþPþmþ{þpþWþsþgþXþPþJþMþJþdã…þ„þ…û„û…þ„þ…þ„þ‡þ²þÝþÞþÒþŽþKþcþ¾þûþýþþøýþüþþøýþúþèþöþüûýþþïýõüþýþüòýûüþøþ|þiþQþKûJþIþKûJþsþŸþxþWþzþ…þ†ã…û„þ…þ„þ†þ„þ†þ«þÍøÝþÖ‘’‘þPþhþ¸÷ø÷þüþýþüþþûüþýþüþýþúþçþöþýþüõýþüûýûþéýþüþøþÝþÜþÛþ¬þlþIþJþIøKþJþMþpþ‰þtþZþ~Ý…þ„þ…û„þ†þ…þšþ¿þÒõÝþÖþ’þPþ`þ±þüøýþüõýþøþéþ÷þýþþûüéýþþøýþüøýþãþØþäþãþ×þnþOþJþIøKþJþOþxþqþdþ¬þ›û†ï…ø„û…ø„þ…þ‰þ²þÅþÒòÝþÑþ€þJþZþîþýþüþýþþþýûüþýþúþçþóþüþýþüøýþüûýþüþýþüøýþüõýþÝþÒþßââáþÇþcþHþMþIøKþJþRþbþQþ‰þØââáþ†þ‡ï…þ„þ…þ„þ†û…þ„þƒþ‘þ­ÀÁÀþÌþ×ïÝþÃþgþKþ†þÞûüûýûþþüûüûþïþñþýþüþþûýûþòýþüþýþüþýþþøýþßþÐþÝþÚþ¸þdþJþIþJøKûJþFþfþÇþÝþßþ†þ„ï…þ„þƒþŠþžþ¹þ·þ´þ²þ¶þÁþÉþÓþÚïÝþÛþ°þVþQþnþÍþùûýþþþüþýþþþüþûþýþþþýþüûýþüõýþüûýþþûýûüþúþàþÏþÛþÓþ·þoþJþKþHøKûJþRþ§þØþÚþÝþ†þƒï…þ†þŠþ¯þÀþÍþËûÇþÉþÏþÔþÚéÝþÕþþGþMþXþ®þöþüûýþþòýþüÝýþüþýþüþíþÜþÒþÏþØþÎþ¼þ‹þXþMþFûHþGþKþYþþËþÖþØþÚþ‰þ„ï…þ†þœþ¾þÊþ×þÖþÓþÒþÖþÚþÛãÝþÄþHþKþJþTþ™þëþþûýþüøýûþþüõýþüûýþþþýûüþþþýþòþ×þÒþÎþÍþÕþÍþ¼©ª©þ„þXþQþOþIþSþtþ›þÀþÎþÖþØþÛþˆé…þ®þÅþÒÔÝûÜþÝþxþHþKþHþCþPþjþËþüûýþüòýþüþýþþõýûüûýþüþæþÓþÒþÉþÆþÔþÑþÇþ¾þ·þ´þ±þ°þ±þ¶þ¿þËþÖþÚøÝþ½þŠþ„þ†õ…þ„þ£þÄþÑÑÝþÜþÝþµþXþIþHþMþJþHþeûýøþòýûþûýþþþýþþþüûýþüþæûÒþÅþÁûÔþÍþÆþÂþ¿þ¾û½þÄþÌþÕòÝþØþ¬ì…þžþÂþÎËÝþÓþþKþFþJûGþIþóõýþþãýþþþýþüþýþþþìþÕþÓÀÁÀþ¼þÓþÕþÒþÍþÈþÇøÆþÎþÓþÚòÝþÚþÒþ ò…þ„þþÀþÌþÜËÝþÃþjþJøIþGþàòýþüþýþüûýþþõýþüûýþþþüþòþÙþÒþ»þ¹þÓþÙþØþÕþÐþÎûÍþÎþÒþØþÛïÝþÚþÍþ¡þ„þ…þ†û…‘’‘þ½þÉþÜËÝþØþ¨þQþHþIþKþIþÚøýþüþýþüþýþþþýþüòýþüþýþüûýþöþÜþÂþšþ¹þÓþÙþÛþÚþ×þÕþÓþÒþÔþØþÚìÝþÜþÙþÕ©ª©þ‰þ†û…þþ»þÈþÜÎÝþÜþÝþÐþûJþHþJþðþþøýþüòýþüþýþüûýþüûýþüþýþõþÏþzþ—þ¹þÓþÚûÜûÛþÙûÚþÛþÜàÝþÅþšû…þŽþºþÇþÜËÝþÜþÝþ¿þgþRþXþŽøýþüûýûþûýþüøýûþøýþüþýþ×þpþVþ–þºþÔþÚþÛÅÝþØþ´þ…þþ¼þÇþÜËÝûÜþØ©ª©þ¶þãþúòýûüõýþþõýþüûýþúþÍþeþJþYþ›þ¹þÔþÚþÜÅÝþÛþÑþƒþ–þ¼þÇþÛþÜÎÝþÜûÚþËþ³þ÷ûüûþüûýþüøýûüéýþüþøþ³þWþHþFþ`þœþ¹þÕþÛÅÝþÜþØþÍþ†þ­þ¼þÌÂÝþØþÙþÈþ¦þÚûüéýþüòýþóþ^þKþHþMþIþHþqþšþ¶þÖþÛËÝþÚþÑþÈþµþ‰þ“þµþÃþÕþÜÅÝþØþÔþËþ¯þ’ûüûþüøýþüøýþüõýþóþÁþnþJþKþJþGþHþIþwþšþµþÖþÜÔÝþÜþÚþÖþÍþÂþ¥þ‹þ„þ¥þ¼þËþ×þÜÅÝþÙþÑþÉþµþ•þœþÚþóþùþüþýþüûýûüûþöþìþÐþ¤þmþPþGòKþNþ~þþ¶þÕþÛÔÝþÒþÌþÂþ²þ’þ…û†þ³þ½þÉþÒûÛþÜþÝþÜÑÝþÚþÒþÈþ¸þŸþKþNþoþ‘þ¤þ¶þ¼þ°þ©þþqþ]þNþKþJûHõKþJþTþƒþŸþ¶þÔþÛãÝþÛþÚþÛþÚþÒþ¾þª‘’‘þ†õ…þ²þºþÄþËþÕþ×ûØþÙþÛþÝþÜÚÝþÙþÒþÈþ¶þ þYþHþIþHûNþJþIþGþFDEDþJþHþKûGþKþJþIûJþHþYþˆþ¡þµþÓþÛæÝþÙþÖþÔþÑþÉþ¿þŒþ„ø…þ†û…þªþ´þ¹þ½þÈþËþÌþÎþÐþÑþÔþÖþØþÚþÛûÜìÝþÜþØþÎþÃþ²þþhøIþJÚIûJûIþYþ‰þ þ²þÎþØïÝþÛþÚþÕþÐþËþÇþ¿þ«þ’þ„ì…þþ¢þ©þ­þ²þ¶þºþ½þÀþÃþÄþÈþÌþÑþÓþ×þÙþÛïÝþÚþÒþÇþ¸þ©þœþlòJþIãJþHþIøJþ\þ‰þœþ­þÉþÓþÙþÛûÜûÛþÙþÒþËþÅþÀþµþœþ†ø„ï…þ„þ…þˆþþžþ¢þ¨þ¬þ¯û³þµþ¸þ¿þÃþÇþÍþÒþ×þØþÚþÛûÚþÕþËþ¾þ®þ þ—þkþHþJþHþIïKþMòKþHþGþHþJþIþ^þ†þ—þ§þÂþËþÓþØþÙþÚþÙþ×þÒþÇþ½þ³þªþŽþ…þ„à…þ†û…þ‡þþ—þþ¡û¥þ§þ«þ¯þ³þºÀÁÀþÆþÊþÎþÒþÔþÏþÇþ½þ²þ¤þ˜þþ`þMþQûRþ]þhækþjþ_ûWþTþQþ_þƒþ”þ¡þ¹þÃþÌþÐûÒþÑþÊþÅþ·þ«þœþˆþ„Ú…ï„û…û„þ…þ‰þŽþþ”þ›þŸþ¢þ¦þ©þ«þ©þ£þœþ•þ‘þŒþ…þwþƒþ…þ„ø…ï„ì…û„þƒþ€þ‰þ”þ¨þ«þ­þ°û±þ¯þ«þ§þþ†û…û„×…ì„þ…þ„þƒû„þ…þ‰þþ“þ˜û™þ˜þ•þ’þþŠþ‚þþ…Ý„æ…þ„þƒþ‚þŒþžþ¢þ£ø¦þ¤þŸþ–ø„Î…ì„þ…ø„û†û…þ†þˆþ‰þþþŽþŒþ‡þþ€û…Ý„æ…þ„þ…þþ‚þþ”þ—þšþ™þ˜þ•þŒþ‡þ„þ…þ„Î…ì„þ…ø„ï…þƒþ†þƒû‚þ„þƒø…ï„þ…ò„Ý…þ„û‚þ…þˆþ†û…þ„þ…þ„Ô…€
+endstream
+endobj
+9 0 obj
+7826
+endobj
+10 0 obj
+/DeviceRGB
+endobj
+11 0 obj
+<<
+/Filter [ /RunLengthDecode ]
+/Width 81
+/Height 96
+/ColorSpace 10 0 R
+/BitsPerComponent 8
+/Length 12 0 R
+>>
+stream
+õ…ì„þ…Ú„û…ø„û…û†þ‚þzþkûeþXûfþmþzþ~û†›…þ„þ…þ„þ…ì„þ…Ñ„õ…þ€þpþ\þQøIþGûJþMþPþXþfþv›…ø„þ…ì„þ…Ñ„þ†þ‡þ„þwþ]þPûJþIûJþIøKþHþIþKþNþwþƒ•…ì„þ…ø„þ…à„þ…þ†þ…þnþKþNþKþJïIþHøIþHþJþPþgþ€þ„þ‡¤…þ„þ…ì„þ…Ô„þ…þ„þ†þOþNþHþJûIþJòHûIþQþiþ_þHþIþXþ{¡…þ„þ…ì„þ…ׄû…þþQþGàJþIþOþqþ”þ¦þ…þgþJþHþRþ}þ…þ†°…û„þ…ì„þ…Ú„þ…þ„þ†þmþNþKàJþHþMþrþ™þ¨þþxþ[þJþMþcþƒþ†³…ø„þ…ì„þ…Ú„þ…þ†þþXþHþKÝJþTþvþ–þ›þ€þwþbþJþKþOþsþ…þ‡³…û„þ…ì„þ…Ú„þ…þ†þsþJþHþIãJþKþIþSþoþ‚þ{þYþWþQþKþMþHþZþƒþ‡³…þ„û…ì„þ…Ú„û…þ_þGûIãJþIþJþNþ[þ`þOþMþKþIþMþJþIþKþt³…¶„û…þRþIþHþIþMæJþIþKûJþNþKþNþIþMþKþIþKþJþ]þ†þ„­…ì„þ…Ú„þ…þƒþJþKûIþKþIãJþKûJþIþJøKþIþJþIþOþ€ª…ì„þ…ׄþvþMûJþHþNþRþMæJþKþOþRþSûMûKøIþMþsþƒ­…ì„þ…ׄþuþKþGþKþQþYþpþmþPûKûJøKþGþHþIþZþ~þNþIûKþJþHþIþKþoþ„­…ì„û…ø„þ…é„þ…þuþMûHþœþ®þ‘þ[þsþ`þMøJþjþ™þ®þ¸þ¾þÃþŸþnþXøKþJþKþNþ\ª…ø„þ…ø„û…û„þ…ø„þ…ò„þ…þtþMþGþ_þÃþÔþÇþŸþZþXþKûJþeþ¢þºþÃþÌþÒþÚþÊþPþYûKþJþHþIþJþXª…õ„þ…û„þ…Ú„þ…þsþMþGþƒþÚþéþæþÖþ–þJþKûJþ—þÌþìþ÷ûùþõþáþlþJûKþIþHûIþPª…ì„þ…Ú„þ…þsûMþªþâþÐþòþþââáþWþIûJþÅþùþýââáþ•þ˜þÚûüûþþGûKþJþIûHþOª…ì„þ…é„þ…õ„þ…þtþIþXþÒþ`þ„þšþïþûþsþVþMþOþÒþüþîþfþXþœ‘’‘þ×þÒþTûKþJþHþIþHþMª…ì„þ…Ú„þ…þsþJþ]þÝþHþ„þ–þ´þüþˆþfþvþxþÓþüþ¬þNþJþoþ¡‘’‘þìþgûKþJûIþHþMþ„¹…³„þzþKþ\þÝþOþ\‘’‘þˆþúþ‚þZþ]þjÀÁÀþøþŽþFþMþVþnþ{þñþhøJøIþKþ„­…ì„þ…ì„û…ï„þSþWþÖþMþNþiþzþØþyþþ‚þþ”þîþþKûJþKþnþïþkþIþJþIþJþIþMþHþ†­…ì„þ…Ô„þRþOþÄþWþKþRþ‚þµþÎþÓþÑþÍþ¿þÍþ­þJþMþKþOþžþãþ^øIþJøIª…ì„þ…õ„þ…ã„þSþHþnþëþ¨þ¸þÍþ×øØþÜþßþãþáþÝþÐþ·þÐþêþvûHþIþJûIþJþFª…ì„þ…Ô„þSþFþOþ³þ·þÆþÔøØþÛþàþæþèþæþåââáþÞþ×þÎþ|þPòIþJþGª…õ„þ…û„þ…ï„þ…é„þRþGþfþ³þÁþÍþÕûØþÚþÝââáþèþçþæøåþæþãþÂþhûJûIþJþMþHª…ì„þ…õ„þ…ã„þ]þTþ•þºþÉþÒûØþÙþÜþßââáþèþæõåþÚþ¿þÌþqþMþKþIþJþMþIþMþ„­…ì„û…Ú„þ…þeþ^þ¥þÀþÍþÕûØþÚþÝþáþåþæøåââáþÊþ·þ¼þ»þbþKþMþJþIûJþNþ~þ…þ†³…ø„þ…ø„û…ï„þ…û„þ…ø„þ…þgþYþŸþÆþÎþØþÙþÚþÜþÞþâþæþåþäþãþØþºþ¹þÄþÇþ¹þ]þMþKþIþJþGþIþPþlþ„þ‡³…õ„þ…û„þ…Ô„þcþKþoþ¼þÓþÙûÚþÞþáþäþãþáþÚþ¾þ°þ¿þÅûÇþ™þQþJþKþþ‡þXþBþIþYþ„þ†³…ì„þ…Ô„þbþNþWþ˜þ²þÐþÚþÞþàþáþàþÚþ¶þ¦þ²þÁþÄþÇþÄþ»þ˜þSûHþvþ¨þŸþ‚þRþMþ|þ†³…ì„þ…þ„þ…ï„þ…õ„þ…þ†þgþMþ[þËþ²þ¡þ¨þÁþÌþÆþÂÀÁÀþ¾þ½þ»þ´þ¹þÊþÒþØþÎþ‰þJþKþMþq©ª©þªþ™þIþNþx³…ì„û…û„þ…ì„û…û„þZþHþiþÍþËþ±þŸþ®þ¿þÁþÀþ½þ²þ°þ³ÀÁÀûÍþÐþÜþÝþºþRþJþKþQþŒþ›þmDEDþIþZþƒþ‡¶…ï„û…æ„þ…þ†û…þvþPþMþ`þÐþÍþÌþ¶þ¡þ¢þ§þ©þ¦þ¤þ¶þÇûÍþÓþçþ÷þüþåþþKþMþJþIþSþMþJþIþOþtþ‡þ†¼…ì„þ…é„þ…þ„þ…þ„þ…þƒþWþKþIþ_þáþÒûÍþÈþ¶û«þ­þÇþÌûÍþ×þéþúûþûüûþËþWòKþJþIþNþ^þƒþ„¼…ï„û…ã„þ…þƒþ„þnþNþKþIþ þìþØûÎþÍþÎòÍþÒþÝþê÷ø÷õþþûþ…þPòKþJþIþTþmû‡¿…ì„þ…à„þ…þzþcþXþFþkþæþùþêþÑþÍûÎþÍþÎþÍþÏþØþäþñþùøþþýþþþýþÕþ\þKþNþHþKøJþOþ\þ~û…þ„Å…ì„þ…à„þ€þ]þgþTþQþ¿þùþþþùþÝïÍþÝþì÷ø÷þýòþþýþüþùþ•ûNûKþIþKþIþJþKþ`þ„¿…õ„þ…þ„û…æ„þ…þ„þZûJþFþ†þ÷þþþüþýþðþØþÐøÍþ×þöûüûøþþýøþþýþþþýþÕþQþIþJþKûIþJþIþKþMþsþ…þ„Å…õ„þ…û„þ…ã„þmþOþPþMþWþÙþýþþþýþþþý÷ø÷þëþáþãþëþôøýûþþýïþþøþ|þGþIþKõIûJþZþ}Î…Ë„ø…þzûKþIþ^þÛûüûþýòþþüûüûþýûþòýìþþüþÒûKûJþIøJþIþMþOþeõ…þ„ø…õ„þ…þ„þ…þ„þ…þ„û…ì„þ…ø„û…þ„þˆþ†þ€þSþJþHþMþþìþûûÿõþþýþüþýûþþýûþþýìþþýþúþèþ_þMþKõJûKþIþJþKþ„þ†Ë…ì„þ…ø„û…þ„þ…þþ_þKþJþFþXþ°þèþúþþþÿûýûþþýûúþýïþþýûþþýþüþ÷ûóþïþxþPìKþIþHþIþjÑ…þ„û…ì„þ…õ„þ…û„þfþPþKþJþFþ\þ´þØþóþûþüþþþýþû÷ø÷þôþðþïþöþúûüûüûþýûüûþúþù÷ø÷þóþïþéþâþæþëþ™þYþKþJþKþJþIûJþKþIþJþPþoË…ì„û…ø„þ…þ„þuûNøJþnþ¸þÅþÙþìþñûû÷ø÷þñþéþçþëþìþõýûüûûüûþùþòþèââáþÜûØþÖþÒþÓþàþÐþdûJþGþMþIþNþKþJûIþNþOþvÎ…ì„þ…ø„û…þþ\þNþHûJþWþ‚þ»þÂþÕþäþïþüþýþþþýþñþê÷ø÷þüõþþýþùþñþéþÝþÔûÒûÑþÒþåþÅþVþOþwþ`þJþIþKûJþIþHþMþ]þ‚Ñ…õ„ò…û„û…þsþOþJûKþJþ]þþÇþÜþïþùþþþýþüþþþýþòþôøýûüþþûýþþþüþúþíþåþÜþÕþÒþÑþØþò©ª©þCþhþ‚þrþXþMþNþIþKûJþOþuÝ…ø„þ…ø„þ…ø„þ…ø„þ†þƒþ]þKþNþIþYþMþrþ¾þãþôþüûýþþøý÷ø÷÷ø÷þüþýþüòýûüþþþýþü÷ø÷þîþáþ×þÒþàþïþKûNþkþ…þ]þKþNþKûJþMþdû†×…õ„þ…û„þ…ø„þ†þþTþOþHþqþsþQþ¡þæ÷ø÷þýþþõýþüþýûüûûüûýþüþýþþõýþþûýþüþýþøþëþÜþÓþéþQþJþNþIþ_þ†þSDEDþOþKþJþIþRþ~þ…þ†à…þ„þ…ì„þ…ø„þ†þjûMþsþ_þKþ þüþþþüþýþþòýûüþþþüþþþýþüøýþüûýûþõýþþþýþñþÜþÏþNþHþ`þnþcþwþkþJþKþJþFþMþQþ‚Ý…þ„þ…ì„þ…ø„þƒþZþPþYþ‚þGþHþîøþþüòýþüþýþþøýþüþýûüûýþþþýþþòýþþþýþþûôþkþPþqþŠþƒþgþ€þSþKþJþKþJþNþv×…û„þ…õ„þ…þ„þ†þ…þwþPþMþ}þeþGþNþüõýþüûýþþûýûüþýþüþýþüþýþþìýþüûýþþþýþþþüþýþþþ¦þWþxþþ†þeþlþtþMþIþJþIþKþ`þ„Ú…ì„þ…þ„þ‡þ„þdþJþWþ}þIþJþmûüûþýþüþýþüþýþüøýþüþúûüûþüøýþþþüþýþþûýþþûýþüþþþýþüõýþþþÑþbþqþwþiþTþQþ‹þKþNþIþKþNþTþÚ…þ„þ…ò„ø…þþYþHþoþfþBþOþ©þüæýþûþïòüþýþüþþûýþüõýþüþþûýûþûýþìþYþNþPûKþGþqþIþNþHûIþKþtþ„Ý…ì„þ…þ„þ…þvþMþKþƒþPþCþdââáþýûüûýþüûýþþþüþ÷þíûüûþýþþûýþüþýþüõýþüìýûüþýûüûþuþMûJþKþGþ]þGþNøIþKþcÚ…ì„û…þ„þ`þKþeþtþKþHþœþúþüþýþüìýþõþñþýþþøýþþþýþüïýûþõýþþøýþ–þHûKþIþJþPþRûHþIþHþJþRþ‚ã…þ„þ…ì„û…þyûMþ{þWþKþQþÐûüûþûýþþþüøýûñþüéýûüõýûüûõýþüûýþþþ²þMõKþNþGþHþKþJþIþKþPþ{é…ø„þ…ø„þ…ø„þ…þ„þOþNþ\þsþGþKþ”þüþýþþþüþþõýþüþýþüþëþïþüþýþþõýþüþþøýþþøýþþøýþüûýþþþÉþJûKþJþHþTþHþFþIþJþHþJþMþgÚ…õ„û…þ†þ€þJþGþfþoþHþIþ¹ûýûþøýþüþýþþûüþëþïþûûüþýûüûýþüþþûýþüøýþþõýþüûýþØþMûKþIþMþ`þIþGþHûIþHþMþbé…û„û…ï„þ†þ„þlþKþIþeþsþIþYþ×þýþüõýûþûýþþûüûþèþîûüûûüþýþþæýûüþýþüþþûýþþûýþÝþSøKþJþmþIþJþIþHûJþIþQÝ…õ„þ…þ„þ…þþRþMþFþiþ{þKþYþÞþþþüòýþüþýþþþýûüûþçþîûüþýþþûýþüõýþüþýþüøýûüþþþýþüþýþþââáþRûKþMþKþyþIûJþIþHþKþJþPã…þ„þ…ì„þhþMþKþQþrþ€þIþ^þçòýþüþþõýþûþçþðþüõýûüþýþþûýþþþüøýþüþýûüþþøýþäþSøKþIþwþIþJøIûJþOÚ…ò„þ…þbþOþNþbþ‰þ‘þKþnþîþýûþøüûýþüûüûþýþúþèþòûüÝýþüþþþýþüþýþþûýþüþþþåþTøKþWþrûKûJøIþOÝ…ï„þþXþIþHþXþ~þ˜þOþ|þñþýþþøýþüòýþùþèþòþýþüûýûþþýþüþþþýøþøýþþþüûýþüþýþüþþþãþVûKþHþmþXûKþJþHøIþQÝ…û„þ…ø„þ‚þRûJþIþWþ…þZþ|þóøýþüûýþüøýþüþúþèþôõýþüæýþüïýþüþþþýþÖþPþHþJþRþ{þKþNþJþKøJþKþSÝ…ï„þþVûIûMþ[þuþþòþýþüæýþúþèþôþýþüþýþþþýûþòýûüãýþÅþKþPþmþ{þpþWþsþgþXþPþJþMþJþdã…þ„þ…û„û…þ„þ…þ„þ‡þ²þÝþÞþÒþŽþKþcþ¾þûþýþþøýþüþþøýþúþèþöþüûýþþïýõüþýþüòýûüþøþ|þiþQþKûJþIþKûJþsþŸþxþWþzþ…þ†ã…û„þ…þ„þ†þ„þ†þ«þÍøÝþÖ‘’‘þPþhþ¸÷ø÷þüþýþüþþûüþýþüþýþúþçþöþýþüõýþüûýûþéýþüþøþÝþÜþÛþ¬þlþIþJþIøKþJþMþpþ‰þtþZþ~Ý…þ„þ…û„þ†þ…þšþ¿þÒõÝþÖþ’þPþ`þ±þüøýþüõýþøþéþ÷þýþþûüéýþþøýþüøýþãþØþäþãþ×þnþOþJþIøKþJþOþxþqþdþ¬þ›û†ï…ø„û…ø„þ…þ‰þ²þÅþÒòÝþÑþ€þJþZþîþýþüþýþþþýûüþýþúþçþóþüþýþüøýþüûýþüþýþüøýþüõýþÝþÒþßââáþÇþcþHþMþIøKþJþRþbþQþ‰þØââáþ†þ‡ï…þ„þ…þ„þ†û…þ„þƒþ‘þ­ÀÁÀþÌþ×ïÝþÃþgþKþ†þÞûüûýûþþüûüûþïþñþýþüþþûýûþòýþüþýþüþýþþøýþßþÐþÝþÚþ¸þdþJþIþJøKûJþFþfþÇþÝþßþ†þ„ï…þ„þƒþŠþžþ¹þ·þ´þ²þ¶þÁþÉþÓþÚïÝþÛþ°þVþQþnþÍþùûýþþþüþýþþþüþûþýþþþýþüûýþüõýþüûýþþûýûüþúþàþÏþÛþÓþ·þoþJþKþHøKûJþRþ§þØþÚþÝþ†þƒï…þ†þŠþ¯þÀþÍþËûÇþÉþÏþÔþÚéÝþÕþþGþMþXþ®þöþüûýþþòýþüÝýþüþýþüþíþÜþÒþÏþØþÎþ¼þ‹þXþMþFûHþGþKþYþþËþÖþØþÚþ‰þ„ï…þ†þœþ¾þÊþ×þÖþÓþÒþÖþÚþÛãÝþÄþHþKþJþTþ™þëþþûýþüøýûþþüõýþüûýþþþýûüþþþýþòþ×þÒþÎþÍþÕþÍþ¼©ª©þ„þXþQþOþIþSþtþ›þÀþÎþÖþØþÛþˆé…þ®þÅþÒÔÝûÜþÝþxþHþKþHþCþPþjþËþüûýþüòýþüþýþþõýûüûýþüþæþÓþÒþÉþÆþÔþÑþÇþ¾þ·þ´þ±þ°þ±þ¶þ¿þËþÖþÚøÝþ½þŠþ„þ†õ…þ„þ£þÄþÑÑÝþÜþÝþµþXþIþHþMþJþHþeûýøþòýûþûýþþþýþþþüûýþüþæûÒþÅþÁûÔþÍþÆþÂþ¿þ¾û½þÄþÌþÕòÝþØþ¬ì…þžþÂþÎËÝþÓþþKþFþJûGþIþóõýþþãýþþþýþüþýþþþìþÕþÓÀÁÀþ¼þÓþÕþÒþÍþÈþÇøÆþÎþÓþÚòÝþÚþÒþ ò…þ„þþÀþÌþÜËÝþÃþjþJøIþGþàòýþüþýþüûýþþõýþüûýþþþüþòþÙþÒþ»þ¹þÓþÙþØþÕþÐþÎûÍþÎþÒþØþÛïÝþÚþÍþ¡þ„þ…þ†û…‘’‘þ½þÉþÜËÝþØþ¨þQþHþIþKþIþÚøýþüþýþüþýþþþýþüòýþüþýþüûýþöþÜþÂþšþ¹þÓþÙþÛþÚþ×þÕþÓþÒþÔþØþÚìÝþÜþÙþÕ©ª©þ‰þ†û…þþ»þÈþÜÎÝþÜþÝþÐþûJþHþJþðþþøýþüòýþüþýþüûýþüûýþüþýþõþÏþzþ—þ¹þÓþÚûÜûÛþÙûÚþÛþÜàÝþÅþšû…þŽþºþÇþÜËÝþÜþÝþ¿þgþRþXþŽøýþüûýûþûýþüøýûþøýþüþýþ×þpþVþ–þºþÔþÚþÛÅÝþØþ´þ…þþ¼þÇþÜËÝûÜþØ©ª©þ¶þãþúòýûüõýþþõýþüûýþúþÍþeþJþYþ›þ¹þÔþÚþÜÅÝþÛþÑþƒþ–þ¼þÇþÛþÜÎÝþÜûÚþËþ³þ÷ûüûþüûýþüøýûüéýþüþøþ³þWþHþFþ`þœþ¹þÕþÛÅÝþÜþØþÍþ†þ­þ¼þÌÂÝþØþÙþÈþ¦þÚûüéýþüòýþóþ^þKþHþMþIþHþqþšþ¶þÖþÛËÝþÚþÑþÈþµþ‰þ“þµþÃþÕþÜÅÝþØþÔþËþ¯þ’ûüûþüøýþüøýþüõýþóþÁþnþJþKþJþGþHþIþwþšþµþÖþÜÔÝþÜþÚþÖþÍþÂþ¥þ‹þ„þ¥þ¼þËþ×þÜÅÝþÙþÑþÉþµþ•þœþÚþóþùþüþýþüûýûüûþöþìþÐþ¤þmþPþGòKþNþ~þþ¶þÕþÛÔÝþÒþÌþÂþ²þ’þ…û†þ³þ½þÉþÒûÛþÜþÝþÜÑÝþÚþÒþÈþ¸þŸþKþNþoþ‘þ¤þ¶þ¼þ°þ©þþqþ]þNþKþJûHõKþJþTþƒþŸþ¶þÔþÛãÝþÛþÚþÛþÚþÒþ¾þª‘’‘þ†õ…þ²þºþÄþËþÕþ×ûØþÙþÛþÝþÜÚÝþÙþÒþÈþ¶þ þYþHþIþHûNþJþIþGþFDEDþJþHþKûGþKþJþIûJþHþYþˆþ¡þµþÓþÛæÝþÙþÖþÔþÑþÉþ¿þŒþ„ø…þ†û…þªþ´þ¹þ½þÈþËþÌþÎþÐþÑþÔþÖþØþÚþÛûÜìÝþÜþØþÎþÃþ²þþhøIþJÚIûJûIþYþ‰þ þ²þÎþØïÝþÛþÚþÕþÐþËþÇþ¿þ«þ’þ„ì…þþ¢þ©þ­þ²þ¶þºþ½þÀþÃþÄþÈþÌþÑþÓþ×þÙþÛïÝþÚþÒþÇþ¸þ©þœþlòJþIãJþHþIøJþ\þ‰þœþ­þÉþÓþÙþÛûÜûÛþÙþÒþËþÅþÀþµþœþ†ø„ï…þ„þ…þˆþþžþ¢þ¨þ¬þ¯û³þµþ¸þ¿þÃþÇþÍþÒþ×þØþÚþÛûÚþÕþËþ¾þ®þ þ—þkþHþJþHþIïKþMòKþHþGþHþJþIþ^þ†þ—þ§þÂþËþÓþØþÙþÚþÙþ×þÒþÇþ½þ³þªþŽþ…þ„à…þ†û…þ‡þþ—þþ¡û¥þ§þ«þ¯þ³þºÀÁÀþÆþÊþÎþÒþÔþÏþÇþ½þ²þ¤þ˜þþ`þMþQûRþ]þhækþjþ_ûWþTþQþ_þƒþ”þ¡þ¹þÃþÌþÐûÒþÑþÊþÅþ·þ«þœþˆþ„Ú…ï„û…û„þ…þ‰þŽþþ”þ›þŸþ¢þ¦þ©þ«þ©þ£þœþ•þ‘þŒþ…þwþƒþ…þ„ø…ï„ì…û„þƒþ€þ‰þ”þ¨þ«þ­þ°û±þ¯þ«þ§þþ†û…û„×…ì„þ…þ„þƒû„þ…þ‰þþ“þ˜û™þ˜þ•þ’þþŠþ‚þþ…Ý„æ…þ„þƒþ‚þŒþžþ¢þ£ø¦þ¤þŸþ–ø„Î…ì„þ…ø„û†û…þ†þˆþ‰þþþŽþŒþ‡þþ€û…Ý„æ…þ„þ…þþ‚þþ”þ—þšþ™þ˜þ•þŒþ‡þ„þ…þ„Î…ì„þ…ø„ï…þƒþ†þƒû‚þ„þƒø…ï„þ…ò„Ý…þ„û‚þ…þˆþ†û…þ„þ…þ„Ô…€
+endstream
+endobj
+12 0 obj
+7826
+endobj
+13 0 obj
+endobj
+14 0 obj
+7826
+endobj
+15 0 obj
+<<
+/Type /XObject
+/Subtype /Image
+/Name /Ma0
+/Filter [ /RunLengthDecode ]
+/Width 81
+/Height 96
+/ColorSpace /DeviceGray
+/BitsPerComponent 8
+/Length 16 0 R
+>>
+stream
+‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿäÿ€
+endstream
+endobj
+16 0 obj
+125
+endobj
+17 0 obj
+<<
+/Title (penguin.pdf)
+/CreationDate (D:20120619194903)
+/ModDate (D:20120619194903)
+/Producer (ImageMagick 6.6.0-4 2012-04-30 Q16 http://www.imagemagick.org)
+>>
+endobj
+xref
+0 18
+0000000000 65535 f
+0000000010 00000 n
+0000000059 00000 n
+0000000118 00000 n
+0000000296 00000 n
+0000000377 00000 n
+0000000395 00000 n
+0000000433 00000 n
+0000000454 00000 n
+0000008478 00000 n
+0000008498 00000 n
+0000008525 00000 n
+0000016495 00000 n
+0000016516 00000 n
+0000016532 00000 n
+0000016553 00000 n
+0000016869 00000 n
+0000016889 00000 n
+trailer
+<<
+/Size 18
+/Info 17 0 R
+/Root 1 0 R
+>>
+startxref
+17067
+%%EOF
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..f9b2933
--- /dev/null
+++ b/contrib/mom/examples/sample_docs.mom
@@ -0,0 +1,713 @@
+.\" -*- mode: text; coding: utf-8; -*-
+\#
+\# Copyright (C) 2004-2020
+\#
+\# Copying and distribution of this file, with or without modification,
+\# are permitted in any medium without royalty provided the copyright
+\# notice and this notice are preserved.
+\#
+\# 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 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 and re-run with
+\#
+\# pdfmom -Tps sample_docs.mom > sample_docs.pdf
+\#
+\# ===================================================================
+\#
+\# First, a sample NAMED document--in this case, an outline.
+\# A novelist wouldn't normally write an outline with numbered
+\# subheads and paraheads. I've turned the feature on merely to
+\# demonstrate it.
+\#
+\# Information for the cover pages
+\#
+\# Title, subtitle and copyright for the document cover.
+\#
+.TITLE DOC_COVER \
+ "Sample mom documents"
+.SUBTITLE DOC_COVER \
+ "Three types of mom documents" \
+ "assembled and collated" \
+ "by mom's author"
+.COPYRIGHT DOC_COVER \
+ "2015 Peter Schaffter"
+\#
+\# What appears in the pdf viewer's window title
+\#
+.PDF_TITLE "Sample mom documents"
+\#
+\# Reference macros (metadata) for the first section of the collated
+\# document.
+\#
+.TITLE "Lake Attica's Shores"
+.SUBTITLE "A Romance Novel"
+.AUTHOR "Rosemary Winspeare"
+.COPYRIGHT "2015 Alma Podborski"
+\#
+\# What to put on the cover for the whole document (in mom-speak,
+\# the "doc cover"). The title, subtitle, and author are what were
+\# given to TITLE DOC_COVER, SUBTITLE DOC_COVER, and COPYRIGHT
+\# DOC_COVER.
+\#
+.DOC_COVER TITLE SUBTITLE COPYRIGHT
+\#
+\# What to put on the first document's title page (in mom-speak, the
+\# "cover"). In this case, we're using the metadata from TITLE,
+\# SUBTITLE, AUTHOR and COPYRIGHT, which will also be used to
+\# generate the docheader (minus the copyright).
+\#
+.COVER TITLE AUTHOR DOCTYPE COPYRIGHT
+\#
+\# Docstyle macros (templates)
+\#
+.DOCTYPE NAMED "Outline"
+.PRINTSTYLE TYPESET
+.PAPER LETTER
+\#
+\# Here we style the covers a bit.
+\#
+.DOC_COVER_TITLE_STYLE \
+ SIZE +8 \
+ SMALLCAPS \
+ UNDERLINE 1 3p
+.DOC_COVER_SUBTITLE_STYLE \
+ FONT I \
+ SIZE +2 \
+ LEAD 18 \
+ SPACE .75v
+.DOC_COVER_COPYRIGHT_SIZE -.5
+\#
+.COVER_TITLE_SIZE +5
+.COVER_ATTRIBUTE_STYLE \
+ SIZE +2 \
+ SPACE .25v
+.COVER_AUTHOR_STYLE \
+ SIZE +2 \
+ LEAD 18
+.COVER_DOCTYPE_STYLE \
+ SIZE +4 \
+ UNDERLINE DOUBLE 1
+.COVER_COPYRIGHT_SIZE -.5
+\#
+\# Here we style the docheader a bit.
+\#
+.SUBTITLE_SPACE .25v
+.DOCTYPE_UNDERLINE 1 2p
+\#
+\# Styles for nested heading levels
+\#
+\# The first two instances of level-1 headings will be paragraph heads
+\# so we set the paragraph head style here, then change it when
+\# level-1 headings become main heads.
+\#
+.HEADING_STYLE 1 \
+ FONT BI \
+ SIZE +.75
+.HEADING_STYLE 2 \
+ FONT B \
+ SIZE +.5 \
+ BASELINE_ADJUST \n[.v]/8 \" ie 1/8 the leading
+\#
+.AUTO_RELOCATE_TOC \" Move table of contents to the top of the doc
+.SPACE_TOC_ITEMS \" Prettify TOC spacing
+\#
+\# Begin the document
+\#
+.START
+\#
+.PP
+.HEADING 1 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
+.HEADING 1 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.
+\#
+\# Change level-1 style and add numbering to levels 1 and 2
+\#
+.HEADING_STYLE 1 \
+ FONT B \
+ SIZE +1.5 \
+ CAPS \
+ UNDERSCORE .5 2p \
+ QUAD C \
+ NO_SPACE_AFTER \
+ BASELINE_ADJUST +0 \
+ NUMBER
+.HEADING_STYLE 2 NUMBER
+\#
+.HEADING 1 "Part One"
+.HEADING 2 "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.
+.HEADING 2 "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.
+.HEADING 2 "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.
+.HEADING 1 "Part Two"
+.HEADING 2 "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.
+.HEADING 2 "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. Diam
+nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna.
+.RIGHT
+\*[BD]\&...end of sample outline\c
+.EL
+.COLLATE
+\#
+\# The '\c /.EL' keeps mom from depositing a line break which,
+\# because "...end of sample outline" falls exactly on the last
+\# baseline of the page, would spring the page trap that sets a
+\# header at the top of the next page. Since the next page is a
+\# title page, we don't want that. Normally, this isn't required,
+\# although using it routinely before COLLATE is a good habit.
+\#
+\# 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 beforehand.
+\#
+\# =====================================================================
+\#
+\# Next, a document composed of 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.
+\#
+.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"
+\#
+.DOCTYPE CHAPTER
+.COPYSTYLE DRAFT
+\#
+.EPIGRAPH_FONT I \" Epigraphs are normally set in roman
+.DRAFT_WITH_PAGENUMBER \" Draft/revision info usually goes in the header
+\#
+\# Style the title page
+\#
+.COVER_CHAPTER_SIZE +6
+.COVER_CHAPTER_TITLE_STYLE \
+ SIZE +5 \
+ SPACE .25v
+.COVER_MISC_SIZE -.25
+\#
+\# What goes on the title page
+\#
+.COVER CHAPTER+TITLE MISC
+\#
+\# Begin the document
+\#
+.CHAPTER_SIZE +3.5
+.CHAPTER_TITLE_SIZE +5
+.CHAPTER_TITLE_SPACE +3p
+.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
+\#
+\# If running PRINTSTYLE TYPEWRITE, this adds space before
+\# attribution ("Joseph E. Blough")
+\#
+.if \n[#PRINT_STYLE]=1 .sp
+\#
+\*[ROM]\[em]Joseph 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\c
+.EL
+.COLLATE
+\#
+\# =====================================================================
+\#
+\# Finally, a sample journal 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).
+\#
+\# The primary purpose of this sample is to demonstrate how to
+\# create a stylesheet, along with some of the control macros that
+\# can be used.
+\#
+\# Style the title page
+\#
+.COVER_TITLE_CAPS
+.COVER_ATTRIBUTE_SPACE .5v
+.COVER_AUTHOR_STYLE \
+ SIZE +1.5 \
+ LEAD 14 \
+ SPACE .25v
+.COVER_MISC_STYLE \
+ QUAD L \
+ SIZE +0
+.COVER_COPYRIGHT_SIZE +0
+\#
+\# What goes on the title page
+\#
+.COVER TITLE AUTHOR COPYRIGHT MISC
+\#
+.DOCTYPE DEFAULT
+.COPYSTYLE FINAL
+\#
+.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 "2015 J. Chang, B.H. Connors
+.MISC "Submitted June 3, 2015" "\*[IT]Piano Quarterly\*[PREV]"
+\#
+\# Style the docheader
+\#
+.TITLE_CAPS
+.ATTRIBUTE_SPACE .33
+.AUTHOR_SIZE +1
+.SUBTITLE_SIZE +2
+\#
+.L_MARGIN 6P
+.R_MARGIN 4P+6p
+.PT_SIZE 10
+.AUTOLEAD 1.5
+\#
+.RECTO_VERSO
+.PAGENUM 1
+\#
+.HEADER_LEFT "Chang, Connors" \" Because we have two authors
+.HEADER_SIZE +1
+\#
+.DOCHEADER_ADVANCE 1.75i
+.DOCHEADER_LEAD +2p
+\#
+\# When PRINTSTYLE is TYPESET, these indents need to be smaller than
+\# the default
+\#
+.if \n[#PRINT_STYLE]=2 \{\
+. PARA_INDENT 1P
+. QUOTE_INDENT 2
+. BLOCKQUOTE_INDENT 2
+.\}
+\#
+\# Style heading 1
+\#
+.HEADING_STYLE 1 \
+ QUAD L \
+ SIZE +0 \
+ NO_NUMBER \
+ NO_CAPS \
+ NO_UNDERSCORE \
+ NO_SPACE_AFTER \
+ BASELINE_ADJUST \n[.v]/8 \" ie 1/8 of the leading
+\#
+\# Style the blockquotes
+\#
+.BLOCKQUOTE_STYLE \
+ FAMILY H \
+ SIZE -2 \
+ AUTOLEAD 2
+\#
+.COLUMNS 2 1P+6p \" Set in two columns
+\#
+\# Being the document
+\#
+.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.
+\#
+.HEADING 1 "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 sed diam voluptua.
+.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 qua certiore.
+\#
+.HEADING 1 "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 rebum.
+.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.
+\#
+.HEADING 1 "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
+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.
+\#
+.HEADING 1 "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
+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
+.TOC_RV_SWITCH
+.TOC
+.\" Local Variables:
+.\" mode: nroff
+.\" End:
+.\" vim: filetype=groff:
diff --git a/contrib/mom/examples/slide-demo.mom b/contrib/mom/examples/slide-demo.mom
new file mode 100644
index 0000000..989ce5a
--- /dev/null
+++ b/contrib/mom/examples/slide-demo.mom
@@ -0,0 +1,438 @@
+.\" -*- mode: text; coding: utf-8; -*-
+\#
+\# Copyright (C) 2004-2020 Free Software Foundation, Inc.
+\# Revised for version 2.5 2021-08.
+\#
+\# Copying and distribution of this file, with or without modification,
+\# are permitted in any medium without royalty provided the copyright
+\# notice and this notice are preserved.
+\#
+.\" Macro for code blocks
+.de CODE_BLOCK
+. ie \\n[.$] \{\
+. CODE off
+. QUOTE off
+. CENTER_BLOCK off
+. \}
+. el \{\
+. CENTER_BLOCK
+. QUOTE
+. CODE
+. \}
+..
+.\"----------------------------------------------------------------
+.
+.TITLE "Creating slide presentations with gropdf/mom"
+.PDF_TITLE "\*[$TITLE]"
+.
+.DOCTYPE SLIDES \
+ ASPECT 16:9 \
+ HEADER "Header left" "\*[$TITLE]" "Header right" \
+ FOOTER "" "" "\*S[+2]\*[SLIDE#]\*S[-2]" \
+ TRANSITION "Box 1 . O" \
+ PAUSE "Wipe 1"
+.
+.PARA_SPACE .75v
+.SS +3
+.HYPHENATION off
+.
+.NEWCOLOR darkred #aa0000
+.NEWCOLOR darkred1 #900000
+.NEWCOLOR blue1 #00007b
+.NEWCOLOR blue2 #00006f
+.NEWCOLOR code-grey GRAY 0.3
+.XCOLOR cyan4
+.XCOLOR green4
+.
+.HEADER_COLOR darkred1
+.HEADER_RULE_COLOR blue1
+.FOOTER_RULE off
+.
+.COVER_STYLE \
+ LEAD +8 \
+ COLOR white
+.HEADING_STYLE 1 \
+ COLOR blue2
+.CODE_STYLE \
+ FONT B \
+ SIZE 115 \
+ COLOR code-grey
+.QUOTE_STYLE \
+ QUAD LEFT
+.CONDENSE 90
+.
+.PDF_IMAGE_FRAME "" 1 blue1
+.
+.COVERTITLE \
+ "Creating slide presentations" \
+ "with" \
+ "gropdf and mom"
+.
+.COVER_START_POS 15P
+.COVER COVERTITLE
+.
+.STRING hand \*[darkred]\[rh]\*[black]
+.
+.\" Make first slide black.
+.\" If printing, remove to save ink.
+.SLIDE_COLOR black
+.
+.START
+.SLIDE_COLOR off
+.
+.ADD_SPACE 9p
+.IB 8P
+.
+.HEADING 1 "PDF slides"
+.SP .5v
+.
+.PP
+PDF slides are a subset of mom's document processing macros
+formatted for presentation mode when viewed in a PDF reader. In
+most respects, they behave identically to the default document type
+described in mom's html documentation\*[HANG .]
+.BR
+Differences in the formatting include\*[HANG :]
+.
+.PAUSE
+.LEFT
+.LIST
+.ITEM .2v
+the choice between two aspect ratios, 4:3 or 16:9
+.LIST USER \*[hand]
+.ITEM
+both fit on A4 or US letter paper sizes when printed
+.
+.PAUSE
+.LIST BACK
+.ITEM .2v
+type is set centered by default
+.LIST USER \*[hand]
+.ITEM
+this may be changed to left, right, or justified
+.
+.PAUSE
+.LIST BACK
+.ITEM .2v
+headers and/or footers must be explicitly instantiated
+.LIST USER \*[hand]
+.ITEM
+the left, centre, and right parts must be supplied
+by the user
+.
+.PAUSE
+.LIST BACK
+.ITEM .2v
+slide numbering (pagination) is disabled
+.LIST USER \*[hand]
+.ITEM
+if slide numbering is desired, it must be put in the left,
+centre, or right part of a header or footer definition
+.QUIT_LISTS
+.
+.NEWSLIDE
+.
+.ADD_SPACE 9p
+.IB 2P
+.
+.DOC_QUAD CENTER
+.
+.HEADING 1 "Pauses and transitions"
+.SP .5v
+.
+.PP
+Slides made with mom take advantage of the pause and slide
+transition features provided in presentation mode by most
+contemporary PDF readers.
+.PAUSE
+.PP
+Pauses and transitions are dynamic and engaging, holding the
+viewer's attention while increasing the impact of the content.
+.PAUSE
+.PP
+With pauses, material on a slide can be revealed progressively
+with
+.BR
+a mouse click or by hitting
+.
+.LIST
+.ITEM .5v
+Next
+.ITEM 2p
+PgDown
+.ITEM 2p
+Spacebar
+.LIST off
+.
+.PAUSE
+.PP
+The manner in which new material is revealed and new slides
+are displayed can be tailored separately for effects like Fade,
+Dissolve, Wipe and others, and can be changed on the fly.
+.
+.NEWSLIDE
+.
+.PP
+Mom slides begin with the macro DOCTYPE SLIDES, where you choose
+the aspect ratio and transition effects, and set up headers and
+footers\*[HANG .]
+.PAUSE
+.PP
+You may find it convenient to provide a title for the slide
+presentation, as the top of the .mom file for these slides
+demonstrates\*[HANG :]
+.
+.SP -1v
+.CODE_BLOCK
+\*[COND]\&.TITLE "Creating slide presentations with gropdf/mom"
+\&.PDF_TITLE "\\*[$TITLE]"
+\&.\\"
+\&.DOCTYPE SLIDES \\
+ ASPECT 16:9 \\
+ HEADER "Header left" "\\*[$TITLE]" "Header right" \\
+ FOOTER "" "" "\\*S[+2]\\*[SLIDE#]\\*S[-2]" \\
+ TRANSITION "Box 1 . O" \\
+ PAUSE "Wipe 1"\*[CONDX]
+.CODE_BLOCK off
+.SP -.5v
+.
+.PAUSE
+.PP
+Afterwards, you may make any changes you like to the layout and
+style, then enter START. Unlike other mom documents, PRINTSTYLE is
+not required\*[HANG .]
+.
+.NEWSLIDE
+.
+.ADD_SPACE 9p
+.IB -1P+6p
+.
+.HEADING 1 \
+ "The \s[-2]PAUSE\s[0] and \s[-2]NEWSLIDE\s[0] macros"
+.SP .5v
+.
+.PP
+Whenever you want a pause before revealing the next material on a
+slide, enter the macro PAUSE on a line by itself. If you want a
+reveal effect that's different from the current one, you may pass
+PAUSE the parameters of the new effect\*[HANG :]
+.
+.SP -1v
+.PAUSE
+.
+.CODE_BLOCK
+\&.PAUSE "Dissolve .4"
+.CODE_BLOCK off
+.
+.PAUSE "Dissolve .4"
+Notice that this material dissolves in, whereas before, new material
+appeared from left to right. \*[BU6]The new effect stays in force
+until you change it again\*[HANG .]
+.PAUSE "Wipe 1"
+.PP
+New slides are introduced with NEWSLIDE. \*[bu6]Transition effects
+and parameters may be given to NEWSLIDE\*[HANG :]
+.SP -1v
+.
+.CODE_BLOCK
+\&.NEWSLIDE "Blinds .5"
+.CODE_BLOCK off
+.
+.PAUSE
+The next slide in this presentation will appear with the Blinds
+effect\*[HANG .]
+.BR
+Consult man gropdf\c
+\*[FU2]\*[UP 1p](\*[DOWN 1p]\*[BU2]1\*[UP 1p]\*[BU1])\*[DOWN 1p]
+for all the pause/transition effects and their
+parameters.\*[BU6]\*[UP 2p]\s[-2]*\s[0]
+.SP 4p
+.FT I
+.PT_SIZE -2
+*Note that not all PDF \*[BU6]viewers support every effect\*[HANG .]
+.FT R
+.PT_SIZE +2
+.
+.NEWSLIDE "Blinds .5"
+.SLIDE_COLOR antiquewhite
+.
+.ADD_SPACE 9p
+.
+.HEADING 1 "Highlighting items
+.SP .5v
+.PP
+The BOX macro lets you highlight items as they are revealed with
+frames and shaded backgrounds\*[HANG .]
+.PAUSE "Fade .5"
+.BOX SHADED pink INSET 3p
+.PP
+This item is highlighted with a shaded background\*[HANG .]
+.PAUSE
+.PP
+The highlight moves to each new item as it's revealed\*[HANG .]
+.PAUSE
+.PP
+Highlighting can continue for as many slides as you want\*[HANG .]
+.PAUSE
+.PP
+If there are no pauses on a slide, BOX can be used
+.BR
+to provide a background for all the items\*[HANG .]
+.PAUSE
+.PP
+The SLIDE_COLOR macro lets you colour
+.BR
+the whole slide (q.v.)\*[HANG .]
+.BOX off
+.
+.NEWSLIDE "Box 1 . O"
+.SLIDE_COLOR off
+.
+.ADD_SPACE 9p
+.
+.HEADING 1 "Macros and preprocessors"
+.SP .5v
+.PP
+Slides can make full use of all mom's document processing and
+typesetting macros, including preprocessors and image insertion\*[HANG .]
+.
+.IBX CLEAR
+.LS -4
+.
+.PAD "\
+\*[FWD 4P+6p]\*[ST1]#\*[ST1X]\
+\*[FWD 2P+6p]\*[ST2]\*[FWD 12P]\\*[ST2X]\
+\*[FWD 3P+9p]\*[ST3]#\*[ST3X]\
+\*[FWD 3P]\*[ST4]#\*[ST4X]\*[FWD 2P]"
+.
+.ST 1 L
+.ST 2 C
+.ST 3 C
+.ST 4 C
+.
+.PAUSE "Fade .5"
+.
+.TAB 1
+.PT_SIZE -1.5
+.CENTER
+\*[BD]\*[blue2]\*[DOWN 6p]tbl
+.LEFT
+.mk
+.PT_SIZE -1
+.COLOR blue2
+.TS H BOXED
+tab(^) allbox;
+c c
+n n.
+\*[darkred]\s[-.5]\*[DOWN .5p]Year^Mean Temp.\s[0]\*[blue2]
+_
+.TH
+\*[cyan4]\fB2015^28.3\*[blue2]
+\*[cyan4]1998^28.3\*[blue2]
+\*[cyan4]1997^28.3\*[blue2]
+\*[cyan4]2010^28.1\*[blue2]
+\*[cyan4]2002^28.1\*[blue2]
+\*[cyan4]2005^28.0\*[blue2]
+\*[cyan4]2014^27.9\*[blue2]
+\*[cyan4]2009^27.9\*[blue2]
+.TE
+.
+.rt
+.PAUSE
+.
+.TN
+.PT_SIZE +1
+\*[FWD 10p]\*[DOWN 6p]pic
+.COLOR green4
+.SP 3p
+.PS 2 LEFT
+A: ellipse wid 0.5 ht 0.5
+ arrow color "green4" up 0.2 from A.n
+ arrow color "green4" up 0.2 right 0.2 from A.ne
+ arrow color "green4" right 0.2 from A.e
+ arrow color "green4" down 0.2 right 0.2 from A.se
+ arrow color "green4" down 0.2 from A.s
+ arrow color "green4" down 0.2 left 0.2 from A.sw
+ arrow color "green4" left 0.2 from A.w
+ arrow color "green4" up 0.2 left 0.2 from A.nw
+.PE
+.
+.rt
+.PAUSE
+.
+.TN
+.COLOR blue2
+\*[FWD 1p]\*[DOWN 6p]eqn
+.FAMILY T
+.PT_SIZE +3
+.LS
+.COLOR code-grey
+.SP 4P
+.EQ
+f sub X (x) ^=^ left {
+ rpile { 0 above 2x above 0 }
+ ~~lpile { x < 0 above 0 <= x <= 1 above x > 1 }
+.EN
+.
+.rt
+.PAUSE
+.
+.TN
+.FAMILY H
+.PT_SIZE -3
+.COLOR blue2
+\*[DOWN 6p]pdf image\*[black]\*[PREV]
+.SP 2P+6p
+.PDF_IMAGE -C penguin.pdf 81p 96p FRAME
+.TQ
+.
+.NEWSLIDE "Box 1 . O"
+.ADD_SPACE 5p
+.IB 10P
+.PT_SIZE +1.5
+.
+.HEADING 1 "Printing handouts"
+.SP .5v
+.
+.CODE_STYLE \
+ COLOR BLACK \
+ SIZE 120
+.PP
+Because slides contain pauses, they need a little help on their
+way to the printer or they stop printing at the first pause\*[HANG .]
+.PAUSE "Wipe 1"
+.PP
+Setting GROPDF_NOSLIDE=1 before invoking
+\[oq]\*[FU4]\*[CODE]\*[COND]pdfmom\*[CONDX]\*[CODE off]\*[FU4]\[cq]
+or
+\[oq]\*[FU2]\*[CODE]\*[COND]groff\~-Tpdf\*[CONDX]\*[CODE off]\*[FU6]\[cq]
+disables the pauses\*[HANG :]
+.
+.SP -1v
+.
+.CODE_STYLE \
+ COLOR code-grey \
+ SIZE 110
+.CODE_BLOCK
+\*[COND]GROPDF_NOSLIDE=1 pdfmom <options> slide-file.mom\*[CONDX]
+.CODE_BLOCK off
+.
+.PAUSE
+The output may be piped directly to a printer or saved to a file\*[HANG .]
+.PAUSE
+.PP
+See mom's html documentation and the gropdf\c
+\*[FU2]\*[UP 1p](\*[DOWN 1p]\*[BU2]1\*[UP 1p]\*[BU1])\*[DOWN 1p]
+manpage for complete information concerning slide usage\*[HANG .]
+.
+.SP 9p
+.CENTER_BLOCK
+.nr dcl-ind -1 1
+.while \n[dcl-ind]<4 \{\
+. DCL SOLID \n+[dcl-ind]P 9p 9p blue2
+.\}
+.CENTER_BLOCK off
+.\" Local Variables:
+.\" mode: nroff
+.\" End:
+.\" vim: filetype=groff:
diff --git a/contrib/mom/examples/test-mom.sh.in b/contrib/mom/examples/test-mom.sh.in
new file mode 100644
index 0000000..ebaba20
--- /dev/null
+++ b/contrib/mom/examples/test-mom.sh.in
@@ -0,0 +1,92 @@
+#!/bin/sh
+#
+# Copyright (C) 2018-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+builddir="@abs_top_builddir@"
+have_urw_fonts="@groff_have_urw_fonts@"
+examplesdir="$builddir/contrib/mom/examples"
+ret=0
+list="
+ letter.pdf
+ mom-pdf.pdf
+ mon_premier_doc.pdf
+ sample_docs.pdf
+ slide-demo.pdf
+ typesetting.pdf
+ copyright-chapter.pdf
+ copyright-default.pdf
+ "
+
+if test "$have_urw_fonts" != "yes"; then
+ echo "No URW fonts, mom examples cannot be correctly generated"
+ exit 77
+fi
+
+for cmd in pdfinfo pdfimages
+do
+ if ! command -v $cmd >/dev/null
+ then
+ echo "cannot locate '$cmd' command; skipping" >&2
+ exit 77 # skip
+ fi
+done
+
+# $1: pdf file
+# $2: expected number of pages
+check_number_pages()
+{
+ echo "Checking number of pages of $1"
+ n_pages=`pdfinfo $1 | grep Pages | awk '{ print $2}'`
+ if test "$n_pages" != "$2"; then
+ echo " Error: expected $2 pages, found $n_pages pages"
+ ret=255
+ fi
+}
+
+# $1 pdf file
+check_has_images()
+{
+ echo "Checking if $1 has images"
+ n_lines=`pdfimages -list $1 | wc -l `
+ if test $n_lines -le 2; then
+ echo " no images found"
+ ret=255
+ fi
+}
+
+for k in $list; do
+ if ! test -f $examplesdir/$k; then
+ echo "File $k not found"
+ exit 255
+ fi
+done
+
+check_number_pages "$examplesdir/letter.pdf" 1
+check_number_pages "$examplesdir/mom-pdf.pdf" 8
+check_number_pages "$examplesdir/mon_premier_doc.pdf" 5
+check_number_pages "$examplesdir/sample_docs.pdf" 12
+check_number_pages "$examplesdir/slide-demo.pdf" 33
+check_number_pages "$examplesdir/typesetting.pdf" 3
+check_number_pages "$examplesdir/copyright-chapter.pdf" 5
+check_number_pages "$examplesdir/copyright-default.pdf" 5
+
+check_has_images "$examplesdir/typesetting.pdf"
+check_has_images "$examplesdir/slide-demo.pdf"
+
+exit $ret
diff --git a/contrib/mom/examples/typesetting.mom b/contrib/mom/examples/typesetting.mom
new file mode 100644
index 0000000..e273611
--- /dev/null
+++ b/contrib/mom/examples/typesetting.mom
@@ -0,0 +1,707 @@
+.\" -*- mode: text; coding: utf-8; -*-
+\#
+\# Copyright 2004-2020 Free Software Foundation, Inc.
+\#
+\# Copying and distribution of this file, with or without modification,
+\# are permitted in any medium without royalty provided the copyright
+\# notice and this notice are preserved.
+\#
+\# 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 demonstrates is geared towards
+\# 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 1i 1i 1i \" Page size, margins
+\#
+\# 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
+\#
+.SP |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.5p "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 (line-for-line) mode
+.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<n>] 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.
+\#
+.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 \" Tighten the 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
+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
+\#
+.UNDERSCORE 3.5p "\[lq]Massaging\[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\[em]but 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 <n>] inline escape.
+\#
+.RIGHT
+\*[SIZE -.5]\[em]Edgar 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, \*[BU4]"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) at each .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 \*[BU2]vowed revenge.
+\*[BU4]Y\*[BU6]ou, \*[BU4]who so \*[BU2]well know the nature
+.EW .2
+of my soul, \*[BU2]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\[em]but the
+.EW .2
+v\*[BU1]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.5p "A \*[BU2]recipe for enumerated lists using indents"
+.SP .5v \" Add an extra half line space
+.ie '\*[.T]'ps' \
+.FAM N \" New Century Schoolbook family
+.el .if '\*[.T]'pdf' \
+.FAM U-N
+.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.
+.DBX .5 0 \n[.l]u 2P+9p \" Draw box; \n[.l]u means "the current line length"
+.IB 6p \" Indent from both left and right margins
+.ALD 14p
+\*[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.
+\#
+.ALD 9p
+.JUSTIFY \" Justify text
+.IL \w'\0.\0' \" Establish a left indent equal to 2 figure spaces plus a period.
+.HI \w'\0.\0' \" Establish a hanging indent equal to the left indent.
+.ALD 6p
+\#
+\#
+1.\0This is the first item in the list. N\*[BU2]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 set
+.ALD 6p
+2.\0This is the second item in the list. As with the above item,
+notice the use of the \*[BU8]\\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\*[BU2]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. \*[BU4]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.
+.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.5p "A \*[BU 2]recipe for nested lists using string tabs"
+.SP .5v
+.ie '\*[.T]'ps' \
+.FAM N
+.el .if '\*[.T]'pdf' \
+.FAM U-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.\c
+.TN \" Use .TN so text stays on the same baseline
+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.\c
+.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.
+\#
+.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 forward
+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]\c
+.TN
+This is the first line of a sublist with bullets. N\*[BU2]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]\c
+.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 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]\c
+.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]\c
+.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.\c
+.TN
+And here we are, back at the top-level numbered list with a minimum
+of muss and fuss,
+.ALD 6p
+.TB 1
+4.\c
+.TN
+Generally speaking, once you get the hang of string tabs and the
+\*[BD]PAD\*[PREV] macro, you'll find setting up complex indenting
+structures easier than with the indent macros.
+.TQ
+\#
+.NEWPAGE
+.FAM T
+.FT B
+.PT_SIZE 12
+.LS 14
+.RLD 2p
+.LEFT
+\#
+Example 5:
+.ALD .25v
+.UNDERSCORE 3.5p "Word spacing"
+.ALD 8p
+.ie '\*[.T]'ps' \
+.FAM P \" Palatino family
+.el .if '\*[.T]'pdf' \
+.FAM U-P
+.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 <n>]
+\#
+\f[HB]\*S[-1]Normal word spacing\*S[+1]\*[PREV]
+.FT R
+N\*[BU1]o\*[BU1]w \*[BU1]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]\*[BU3]+\*[DOWN 1p]\*[BU1]2\*S[+1]\*[PREV]
+.FT R
+.WS +2
+N\*[BU1]o\*[BU1]w \*[BU1]is the time for all good men to come to the aid of the party.
+.WS DEFAULT
+.ALD 4p
+\f[HB]\*S[-1]Word spacing adjusted by \*[UP 1p]\*[BU3]+\*[DOWN 1p]4\*S[+1]\*[PREV]
+.FT R
+.WS +4
+N\*[BU1]o\*[BU1]w \*[BU1]is the time for all good men to come to the aid of the party.
+.WS DEFAULT
+.ALD 4p
+\f[HB]\*S[-1]Word spacing adjusted by \*[UP 1p]\*[BU3]+\*[DOWN 1p]6\*S[+1]\*[PREV]
+.FT R
+.WS +6
+N\*[BU1]o\*[BU1]w \*[BU1]is the time for all good men to come to the aid of the party.
+.WS DEFAULT
+.SP 1.5v
+\#
+.FAM T
+.FT B
+.PT_SIZE 12
+.LS 14
+\#
+.LEFT
+Example 6:
+.ALD .25v
+.UNDERSCORE 3.5p "Line kerning"
+.ALD 8p
+.ie '\*[.T]'ps' \
+.FAM P \" Palatino family
+.el .if '\*[.T]'pdf' \
+.FAM U-P
+.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
+.EW 0
+\#
+.FAM T
+.FT B
+.PT_SIZE 12
+.LS 14
+.LEFT
+\#
+Example 7:
+.ALD .25v
+.UNDERSCORE 3.5p "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.
+\#
+.if '\*[.T]'pdf' .PDF_IMAGE penguin.pdf 81p 96p
+.if '\*[.T]'ps' .PSPIC penguin.ps 81p 96p
+.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.
+.\" Local Variables:
+.\" mode: nroff
+.\" End:
+.\" vim: filetype=groff:
diff --git a/contrib/mom/groff_mom.7.man b/contrib/mom/groff_mom.7.man
new file mode 100644
index 0000000..3872b8f
--- /dev/null
+++ b/contrib/mom/groff_mom.7.man
@@ -0,0 +1,3427 @@
+.TH groff_mom @MAN7EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+groff_mom \- modern macros for document composition with GNU
+.I roff
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2002-2020 Free Software Foundation, Inc.
+.\"
+.\" This file is part of mom, which is part of groff, the GNU roff
+.\" type-setting system.
+.\"
+.\" 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 3 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, see
+.\" <http://www.gnu.org/licenses/>.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_mom_7_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.\" Setup
+.\" ====================================================================
+.
+.hw line-space
+.
+.
+.\" ====================================================================
+.\" .FONT (<font name> <text> [<font name> <text> ...])
+.\"
+.\" Print in different fonts: R, I, B, CR, CI, CB
+.\"
+.de FONT
+. if (\\n[.$] = 0) \{\
+. nop \&\f[P]\&
+. return
+. \}
+. ds result \&
+. while (\\n[.$] >= 2) \{\
+. as result \,\f[\\$1]\\$2
+. if !"\\$1"P" .as result \f[P]\""
+. shift 2
+. \}
+. if (\\n[.$] = 1) .as result \,\f[\\$1]
+. nh
+. nop \\*[result]\&
+. rm result
+. hy \\n[HY]
+..
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY groff
+.B \-mom
+.RI [ option\~ .\|.\|.\&]
+.RI [ file\~ .\|.\|.]
+.
+.SY groff
+.B "\-m mom"
+.RI [ option\~ .\|.\|.\&]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I mom
+is a macro set for
+.IR groff ,
+designed primarily to prepare documents for PDF and PostScript output.
+.
+.
+.I mom
+provides macros in two categories: typesetting
+and document processing.
+.
+The former provide access to
+.IR groff 's
+typesetting capabilities in ways that are simpler to master than
+.IR groff 's
+requests and escape sequences.
+.
+The latter provide highly customizable markup tags that allow the user
+to design and output professional-looking documents with a minimum of
+typesetting intervention.
+.
+.
+.P
+Files processed with
+.MR pdfmom @MAN1EXT@
+produce PDF documents.
+.
+The documents include a PDF outline that appears in the navigation pane
+panel of document viewers,
+and may contain clickable internal and external links.
+.
+.P
+Normally.
+.IR groff 's
+native PDF driver,
+.MR gropdf @MAN1EXT@ ,
+is used to generate the output.
+.
+When
+.I pdfmom
+is given the
+.RB \[lq] "\-T ps" \[rq]
+option,
+it still produces PDF,
+but processing is delegated to
+.IR pdfroff ,
+which uses
+.IR groff 's
+PostScript driver,
+.MR grops @MAN1EXT@ .
+.
+Not all PDF features are available when
+.B \-T ps
+is given;
+its primary use is to allow processing of files with embedded PostScript
+images.
+.\" XXX: but we have PDFPIC now...so -Tps is necessary only for people
+.\" who want to avoid use of unsafe mode?
+.
+.
+.P
+Files processed with
+.B groff \-mom
+(or
+.BR "\-m mom" )
+format for the device specified with the
+.B \-T
+option.
+.
+(In this installation,
+.B @DEVICE@
+is the default output device.)
+.
+.
+.P
+.I mom
+comes with her own comprehensive documentation in HTML.
+.
+A PDF manual,
+\[lq]Producing PDFs with
+.I groff
+and
+.IR mom \[rq],
+discusses preparation of PDF documents with
+.I mom
+in detail.
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @MACRODIR@/\:mom.tmac
+is a wrapper enabling the package to be loaded with
+.RB \[lq] "groff \-m mom" \[rq].
+.
+.
+.TP
+.I @MACRODIR@/\:om.tmac
+implements the package.
+.
+.
+.TP
+.I @HTMLDOCDIR@/\:mom/\:toc.html
+is the entry point to the HTML documentation.
+.
+.
+.TP
+.I @PDFDOCDIR@/\:mom\-pdf.pdf
+is \[lq]Producing PDFs with
+.I groff
+and
+.IR mom \[rq],
+by Deri James and Peter Schaffter.
+.
+.
+.TP
+.IR @EXAMPLEDIR@/\:mom/\: * .mom
+are examples of
+.I mom
+usage.
+.
+.
+.\" ====================================================================
+.SH Reference
+.\" ====================================================================
+.
+.\" ====================================================================
+.SS "Escape sequences"
+.\" ====================================================================
+.
+.TP
+.FONT B \[rs]*[ I <colorname> B ]
+begin using an initialized colour inline
+.
+.
+.TP
+.FONT B \[rs]*[BCK I " n" B ]
+move backward in a line
+.
+.
+.TP
+.B \[rs]*[BOLDER]
+invoke pseudo bold inline (related to macro
+.BR .SETBOLDER )
+.
+.
+.TP
+.B \[rs]*[BOLDERX]
+off pseudo bold inline (related to macro
+.BR .SETBOLDER )
+.
+.
+.TP
+.FONT B \[rs]*[BU I " n" B ]
+move characters pairs closer together inline (related to macro
+.BR \%.KERN )
+.
+.
+.TP
+.B \[rs]*[COND]
+invoke pseudo condensing inline (related to macro
+.BR \%.CONDENSE )
+.
+.
+.TP
+.B \[rs]*[CONDX]
+off pseudo condensing inline (related to macro
+.BR \%.CONDENSE )
+.
+.
+.TP
+.FONT B \[rs]*[CONDSUP] R .\|.\|. B \[rs]*[CONDSUPX]
+pseudo-condensed superscript
+.
+.
+.TP
+.FONT B \[rs]*[DOWN I " n" B ]
+temporarily move downward in a line
+.
+.
+.TP
+.B \[rs]*[EN\-MARK]
+mark initial line of a range of line numbers (for use with line
+numbered endnotes)
+.
+.
+.TP
+.B \[rs]*[EXT]
+invoke pseudo extending inline (related to macro
+.BR \%.EXTEND )
+.
+.
+.TP
+.B \[rs]*[EXTX]
+off pseudo condensing inline (related to macro
+.BR \%.EXTEND )
+.
+.
+.TP
+.FONT B \[rs]*[EXTSUP] R .\|.\|. B \[rs]*[EXTSUPX]
+pseudo extended superscript
+.
+.
+.TP
+.FONT B \[rs]*[FU I " n" B ]
+move characters pairs further apart inline (related to macro
+.BR \%.KERN )
+.
+.
+.TP
+.FONT B \[rs]*[FWD I " n" B ]
+move forward in a line
+.
+.
+.TP
+.B \[rs]*[LEADER]
+insert leaders at the end of a line
+.
+.
+.TP
+.B \[rs]*[RULE]
+draw a full measure rule
+.
+.
+.TP
+.FONT B \[rs]*[SIZE I " n" B ]
+change the point size inline (related to macro
+.BR \%.PT_SIZE )
+.
+.
+.TP
+.B \[rs]*[SLANT]
+invoke pseudo italic inline (related to macro
+.BR \%.SETSLANT )
+.
+.
+.TP
+.B \[rs]*[SLANTX]
+off pseudo italic inline (related to macro
+.BR \%.SETSLANT )
+.
+.
+.TP
+.FONT B \[rs]*[ST I <n> B ] R .\|.\|. B \[rs]*[ST I <n> B X]
+string tabs (mark tab positions inline)
+.
+.
+.TP
+.FONT B \[rs]*[SUP] R .\|.\|. B \[rs]*[SUPX]
+superscript
+.
+.
+.TP
+.B \[rs]*[TB+]
+inline escape for
+.B .TN
+.RI ( "Tab Next" )
+.
+.
+.TP
+.FONT B \[rs]*[UL] R .\|.\|. B \[rs]*[ULX]
+invoke underlining inline (fixed width fonts only)
+.
+.
+.TP
+.FONT B \[rs]*[UP I " n" B ]
+temporarily move upward in a line
+.
+.
+.\" ====================================================================
+.SS Macros
+.\" ====================================================================
+.
+.TP
+.B .AUTOLEAD
+set the linespacing relative to the point size
+.
+.
+.TP
+.B .B_MARGIN
+set a bottom margin
+.
+.
+.TP
+.B .BR
+break a justified line
+.
+.
+.TP
+.B .CENTER
+set line-by-line quad centre
+.
+.
+.TP
+.B .CONDENSE
+set the amount to pseudo condense
+.
+.
+.TP
+.B .EL
+break a line without advancing on the page
+.
+.
+.TP
+.B .EXTEND
+set the amount to pseudo extend
+.
+.
+.TP
+.B .FALLBACK_FONT
+establish a fallback font (for missing fonts)
+.
+.
+.TP
+.B .FAM
+alias to
+.B .FAMILY
+.
+.
+.TP
+.BI ".FAMILY " <family>
+set the
+.I family type
+.
+.
+.TP
+.B .FT
+set the font style (roman, italic, etc.)
+.
+.
+.TP
+.BI ".HI [" " <measure> " ]
+hanging indent
+.
+.
+.TP
+.B .HY
+automatic hyphenation on/off
+.
+.
+.TP
+.B .HY_SET
+set automatic hyphenation parameters
+.
+.
+.TP
+.BI ".IB [" " <left measure> <right measure> " ]
+indent both
+.
+.
+.TP
+.B .IBX [ CLEAR ]
+exit indent both
+.
+.
+.TP
+.BI ".IL [" " <measure> " ]
+indent left
+.
+.
+.TP
+.B .ILX [ CLEAR ]
+exit indent left
+.
+.
+.TP
+.B .IQ [ CLEAR ]
+quit any/all indents
+.
+.
+.TP
+.BI ".IR [" " <measure> " ]
+indent right
+.
+.
+.TP
+.B .IRX [ CLEAR ]
+exit indent right
+.
+.
+.TP
+.B .JUSTIFY
+justify text to both margins
+.
+.
+.TP
+.B .KERN
+automatic character pair kerning on/off
+.
+.
+.TP
+.B .L_MARGIN
+set a left margin (page offset)
+.
+.
+.TP
+.B .LEFT
+set line-by-line quad left
+.
+.
+.TP
+.B .LL
+set a line length
+.
+.
+.TP
+.B .LS
+set a linespacing (leading)
+.
+.
+.TP
+.B .PAGE
+set explicit page dimensions and margins
+.
+.
+.TP
+.B .PAGEWIDTH
+set a custom page width
+.
+.
+.TP
+.B .PAGELENGTH
+set a custom page length
+.
+.
+.TP
+.BI .PAPER " <paper_type>"
+set common paper sizes (letter, A4, etc)
+.
+.
+.TP
+.B .PT_SIZE
+set the point size
+.
+.
+.TP
+.B .QUAD
+"justify" text left, centre, or right
+.
+.
+.TP
+.B .R_MARGIN
+set a right margin
+.
+.
+.TP
+.B .RIGHT
+set line-by-line quad right
+.
+.
+.TP
+.B .SETBOLDER
+set the amount of emboldening
+.
+.
+.TP
+.B .SETSLANT
+set the degree of slant
+.
+.
+.TP
+.B .SPREAD
+force justify a line
+.
+.
+.TP
+.B .SS
+set the sentence space size
+.
+.
+.TP
+.B .T_MARGIN
+set a top margin
+.
+.
+.TP
+.BI ".TI [" " <measure> " ]
+temporary left indent
+.
+.
+.TP
+.B .WS
+set the minimum word space size
+.
+.
+.\" ====================================================================
+.SH "Documentation of details"
+.\" ====================================================================
+.
+.\" ====================================================================
+.SS "Details of inline escape sequences in alphabetical order"
+.\" ====================================================================
+.
+.TP
+.FONT B \[rs]*[ I <colorname> B ]
+begin using an initialized colour inline
+.
+.
+.TP
+.FONT B \[rs]*[BCK I " n" B ]
+move backward in a line
+.
+.
+.\" ====================================================================
+.\" BOLDER
+.\" ====================================================================
+.TP
+.B \[rs]*[BOLDER]
+.TQ
+.B \[rs]*[BOLDERX]
+Emboldening on/off
+.
+.RS
+.
+.P
+.B \[rs]*[BOLDER]
+begins emboldening type.
+.
+.B \[rs]*[BOLDERX]
+turns the feature off.
+.
+Both are inline escape sequences;
+therefore,
+they should not appear as separate lines,
+but rather be embedded in text lines, like this:
+.RS
+.EX
+.FONT R "Not " B \[rs]*[BOLDER] R everything B \[rs]*[BOLDERX] \
+R " is as it seems."
+.EE
+.RE
+.
+.P
+Alternatively, if you wanted the whole line emboldened, you should do
+.RS
+.EX
+.FONT B \[rs]*[BOLDER] R "Not everything is as it seems." \
+B \[rs]*[BOLDERX]
+.EE
+.RE
+.
+Once
+.B \[rs]*[BOLDER]
+is invoked, it remains in effect until turned off.
+.
+.P
+Note: If you're using the document processing macros with
+.BR "\%.PRINTSTYLE \%TYPEWRITE" ,
+.I mom
+ignores
+.B \[rs]*[BOLDER]
+requests.
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" BU
+.\" ====================================================================
+.TP
+.FONT B \[rs]*[BU I " n" B ]
+move characters pairs closer together inline (related to macro
+.BR \%.KERN )
+.
+.
+.\" ====================================================================
+.\" COND
+.\" ====================================================================
+.TP
+.B \[rs]*[COND]
+.TQ
+.B \[rs]*[CONDX]
+Pseudo-condensing on/off
+.
+.RS
+.
+.P
+.B \[rs]*[COND]
+begins pseudo-condensing type.
+.
+.B \[rs]*[CONDX]
+turns the feature off.
+.
+Both are inline escape sequences;
+therefore,
+they should not appear as separate lines,
+but rather be embedded in text lines, like this:
+.RS
+.EX
+.FONT B \[rs]*[COND] I "Not everything is as it seems." B \[rs]*[CONDX]
+.EE
+.RE
+.B \%\[rs]*[COND]
+remains in effect until you turn it off with
+.BR \%\[rs]*[CONDX] .
+.
+.P
+IMPORTANT: You must turn
+.B \%\[rs]*[COND]
+off before making any changes to the point size of your type, either
+via the
+.B \%.PT_SIZE
+macro or with the
+.B \[rs]s
+inline escape sequence.
+.
+If you wish the new point size to be pseudo-condensed, simply reinvoke
+.B \%\[rs]*[COND]
+afterward.
+.
+Equally,
+.B \%\[rs]*[COND]
+must be turned off before changing the condense percentage with
+.BR \%.CONDENSE .
+.
+.P
+Note: If you're using the document processing macros with
+.BR "\%.PRINTSTYLE \%TYPEWRITE" ,
+.I mom
+ignores
+.B \%\[rs]*[COND]
+requests.
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" CONDSUP
+.\" ====================================================================
+.TP
+.FONT B \[rs]*[CONDSUP] R .\|.\|. B \[rs]*[CONDSUPX]
+pseudo-condensed superscript
+.
+.
+.\" ====================================================================
+.\" DOWN
+.\" ====================================================================
+.TP
+.FONT B \[rs]*[DOWN I " n" B ]
+temporarily move downward in a line
+.
+.
+.\" ====================================================================
+.\" EN-MARK
+.\" ====================================================================
+.TP
+.B \[rs]*[EN\-MARK]
+mark initial line of a range of line numbers (for use with line
+numbered endnotes)
+.
+.
+.\" ====================================================================
+.\" EXT
+.\" ====================================================================
+.TP
+.B \[rs]*[EXT]
+.TQ
+.B \[rs]*[EXTX]
+Pseudo-extending on/off
+.
+.RS
+.
+.P
+.B \[rs]*[EXT]
+begins pseudo-extending type.
+.
+.B \[rs]*[EXTX]
+turns the feature off.
+.
+Both are inline escape sequences;
+therefore,
+they should not appear as separate lines,
+but rather be embedded in text lines, like this:
+.RS
+.EX
+.FONT B \[rs]*[EXT] I "Not everything is as it seems." B \[rs]*[EXTX]
+.EE
+.RE
+.B \[rs]*[EXT]
+remains in effect until you turn it off with
+.BR \[rs]*[EXTX] .
+.
+.P
+IMPORTANT: You must turn
+.B \%\[rs]*[EXT]
+off before making any changes to the point size of your type, either
+via the
+.B \%.PT_SIZE
+macro or with the
+.B \[rs]s
+inline escape sequence.
+.
+If you wish the new point size to be
+.IR \%pseudo-extended ,
+simply reinvoke
+.B \%\[rs]*[EXT]
+afterward.
+.
+Equally,
+.B \%\[rs]*[EXT]
+must be turned off before changing the extend percentage with
+.BR \%.EXTEND .
+.
+.P
+Note: If you are using the document processing macros with
+.BR "\%.PRINTSTYLE \%TYPEWRITE" ,
+.I mom
+ignores
+.B \%\[rs]*[EXT]
+requests.
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" EXTSUP
+.\" ====================================================================
+.TP
+.FONT B \[rs]*[EXTSUP] R .\|.\|. B \[rs]*[EXTSUPX]
+pseudo extended superscript
+.
+.
+.\" ====================================================================
+.\" FU
+.\" ====================================================================
+.TP
+.FONT B \[rs]*[FU I " n" B ]
+move characters pairs further apart inline (related to macro
+.BR .KERN )
+.
+.
+.\" ====================================================================
+.\" FWD
+.\" ====================================================================
+.TP
+.FONT B \[rs]*[FWD I " n" B ]
+move forward in a line
+.
+.
+.\" ====================================================================
+.\" LEADER
+.\" ====================================================================
+.TP
+.B \[rs]*[LEADER]
+insert leaders at the end of a line
+.
+.
+.\" ====================================================================
+.\" RULE
+.\" ====================================================================
+.TP
+.B \[rs]*[RULE]
+draw a full measure rule
+.
+.
+.\" ====================================================================
+.\" PT_SIZE
+.\" ====================================================================
+.TP
+.FONT B \[rs]*[SIZE I " n" B ]
+change the point size inline (related to macro
+.BR \%.PT_SIZE )
+.
+.
+.\" ====================================================================
+.\" SLANT
+.\" ====================================================================
+.TP
+.B \[rs]*[SLANT]
+.TQ
+.B \[rs]*[SLANTX]
+Pseudo italic on/off
+.
+.RS
+.
+.P
+.B \%\[rs]*[SLANT]
+begins
+.I pseudo-italicizing
+.IR type .
+.
+.B \%\[rs]*[SLANTX]
+turns the feature off.
+.
+Both are inline escape sequences;
+therefore,
+they should not appear as separate lines,
+but rather be embedded in text lines, like this:
+.RS
+.EX
+.FONT R "Not " B \[rs]*[SLANT] R everything B \[rs]*[SLANTX] \
+R " is as it seems."
+.EE
+.RE
+.
+.P
+Alternatively, if you wanted the whole line
+.IR pseudo-italicized ,
+you'd do
+.RS
+.EX
+.FONT B \[rs]*[SLANT] R "Not everything is as it seems." \
+B \[rs]*[SLANTX]
+.EE
+.RE
+.
+.P
+Once
+.B \[rs]*[SLANT]
+is invoked, it remains in effect until turned off.
+.
+.P
+Note: If you're using the document processing macros with
+.BR "\%.PRINTSTYLE \%TYPEWRITE" ,
+.I mom
+underlines pseudo-italics by default.
+.
+To change this behaviour, use the special macro
+.BR .SLANT_MEANS_SLANT .
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" ST
+.\" ====================================================================
+.TP
+.FONT B \[rs]*[ST I <number> B ] R .\|.\|. B \[rs]*[ST I <number> B X]
+Mark positions of string tabs
+.
+.RS
+.P
+The
+.I quad
+direction must be
+.B LEFT
+or
+.B \%JUSTIFY
+(see
+.B \%.QUAD
+and
+.BR \%.JUSTIFY )
+or the
+.I no-fill mode
+set to
+.B LEFT
+in order for these inlines to function properly.
+.
+Please see
+.IR \%IMPORTANT ,
+below.
+.
+.P
+String tabs need to be marked off with inline escape sequences before
+being set up with the
+.B .ST
+macro.
+.
+Any input line may contain string tab markers.
+.
+.IR <number> ,
+above, means the numeric identifier of the tab.
+.
+.P
+The following shows a sample input line with string tab markers.
+.RS
+.EX
+.BR \[rs]*[ST1] "De minimus" \[rs]*[ST1X] \c
+.RB "non curat" \[rs]*[ST2] lex \[rs]*[ST2X] .
+.EE
+.RE
+.
+.P
+String
+.I tab 1
+begins at the start of the line and ends after the word
+.IR \%time .
+.
+String
+.I tab 2
+starts at
+.I good
+and ends after
+.IR men .
+.
+.I Inline escape sequences
+(e.g.,
+.I font
+or
+.I point size
+.IR changes ,
+or horizontal movements, including padding) are taken into account
+when
+.I mom
+determines the
+.I position
+and
+.I length
+of
+.I string
+.IR tabs .
+.
+.P
+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.
+.
+.P
+Once string tabs have been marked in input lines, they have to be
+.I set
+with
+.BR .ST ,
+after which they may be called, by number, with
+.BR .TAB .
+.
+.P
+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
+.B \%.SILENT
+macro.
+.
+.P
+.I IMPORTANT:
+Owing to the way
+.I groff
+processes input lines and turns them into output lines, it is not
+possible for
+.I mom
+to
+.I guess
+the correct starting position of string tabs marked off in lines that
+are centered or set flush right.
+.
+.P
+Equally, she cannot guess the starting position if a line is fully
+justified and broken with
+.BR \%.SPREAD .
+.
+.P
+In other words, in order to use string tabs,
+.B LEFT
+must be active, or, if
+.B .QUAD LEFT
+or
+.B \%JUSTIFY
+are active, the line on which the
+.I string tabs
+are marked must be broken
+.I manually
+with
+.B .BR
+(but not
+.BR \%.SPREAD ).
+.
+.P
+To circumvent this behaviour, I recommend using the
+.B PAD
+to set up string tabs in centered or flush right lines.
+.
+Say, for example, you want to use a
+.I string tab
+to
+.I underscore
+the text of a centered line with a rule.
+.
+Rather than this,
+.RS
+.EX
+.B .CENTER
+.B \[rs]*[ST1]A line of text\[rs]*[ST1X]\[rs]c
+.B .EL
+.B .ST 1
+.B .TAB 1
+.B .PT_SIZE 24
+.B .ALD 3p
+.B \[rs]*[RULE]
+.B .RLD 3p
+.B .TQ
+.EE
+.RE
+you should do:
+.RS
+.EX
+\&.QUAD CENTER
+\&.PAD "#\[rs]*[ST1]A line of text\[rs]*[ST1X]#"
+\&.EL
+\&.ST 1
+\&.TAB 1
+\&.PT_SIZE 24
+\&.ALD 3p
+\&\[rs]" You can\[aq]t use \[rs]*[UP] or \[rs]*[DOWN] with \[rs]*[RULE].
+\&.RLD 3p
+\&.TQ
+.EE
+.RE
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" SUP
+.\" ====================================================================
+.TP
+.FONT B \[rs]*[SUP] R .\|.\|. B \[rs]*[SUPX]
+superscript
+.
+.
+.\" ====================================================================
+.\" TB+
+.\" ====================================================================
+.TP
+.B \[rs]*[TB+]
+Inline escape for
+.B .TN
+.RI ( "Tab Next" )
+.
+.
+.\" ====================================================================
+.\" UL
+.\" ====================================================================
+.TP
+.FONT B \[rs]*[UL] R .\|.\|. B \[rs]*[ULX]
+invoke underlining inline (fixed width fonts only)
+.
+.
+.\" ====================================================================
+.\" UP
+.\" ====================================================================
+.TP
+.FONT B \[rs]*[UP I " n" B ]
+temporarily move upward in a line
+.
+.
+.\" ====================================================================
+.SS "Details of macros in alphabetical order"
+.\" ====================================================================
+.
+.\" ====================================================================
+.\" AUTOLEAD
+.\" ====================================================================
+.TP
+.B .AUTOLEAD
+set the linespacing relative to the point size
+.
+.
+.\" ====================================================================
+.\" Bottom Margin
+.\" ====================================================================
+.TP
+.BI .B_MARGIN " <bottom margin>"
+Bottom Margin
+.
+.RS
+.
+.P
+Requires a unit of measure
+.
+.P
+.B .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,
+.I mom
+starts a new page.
+.
+.B .B_MARGIN requires a unit of measure.
+.
+Decimal fractions are allowed.
+.
+To set a nominal bottom margin of 3/4 inch, enter
+.RS
+.EX
+.B .B_MARGIN .75i
+.EE
+.RE
+.
+.P
+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.
+.
+.P
+Occasionally, owing to a peculiarity in
+.IR 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.
+.
+.P
+Note: The meaning of
+.B .B_MARGIN
+is slightly different when you're using the document processing
+macros.
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" Fallback Font
+.\" ====================================================================
+.TP
+.BI \%.FALLBACK_FONT " <fallback font> " "[ ABORT | WARN ]"
+Fallback Font
+.
+.RS
+.
+.P
+In the event that you pass an invalid argument to
+.B \%.FAMILY
+(i.e.\& a non-existent
+.IR family ),
+.IR mom ,
+by default, uses the
+.IR "fallback font" ,
+.B Courier Medium Roman
+.RB ( CR ),
+in order to continue processing your file.
+.
+.P
+If you'd prefer another
+.IR "fallback font" ,
+pass
+.B \%.FALLBACK_FONT
+the full
+.I family+font name
+of the
+.I font
+you'd like.
+.
+For example, if you'd rather the
+.I fallback font
+were
+.BR "Times Roman Medium Roman" ,
+.RS
+.EX
+.B .FALLBACK_FONT TR
+.EE
+.RE
+would do the trick.
+.
+.P
+.B Mom
+issues a warning whenever a
+.I font style set
+with
+.B .FT
+does not exist, either because you haven't registered the style
+or because the
+.I font style
+does not exist in the current
+.I family set
+with
+.BR .FAMILY .
+.
+By default,
+.B \%mom
+then aborts, which allows you to correct the problem.
+.
+.P
+If you'd prefer that
+.B \%mom
+not abort on non-existent
+.IR fonts ,
+but rather continue processing using a
+.IR "fallback font" ,
+you can pass
+.B \%.FALLBACK_FONT
+the argument
+.BR WARN ,
+either by itself, or in conjunction with your chosen
+.IB "fallback font" .
+.
+.P
+Some examples of invoking
+.BR \%.FALLBACK_FONT :
+.
+.TP
+.B .FALLBACK_FONT WARN
+.I mom
+will issue a warning whenever you try to access a non-existent
+.I font
+but will continue processing your file with the default
+.IR "fallback font" ,
+.BR "Courier Medium Roman" .
+.
+.
+.TP
+.B .FALLBACK_FONT TR WARN
+.B \%mom
+will issue a warning whenever you try to access a non-existent
+.I font
+but will continue processing your file with a
+.I fallback font
+of
+.BR "Times Roman Medium Roman" ;
+additionally,
+.B TR
+will be the
+.I fallback font
+whenever you try to access a
+.I family
+that does not exist.
+.
+.TP
+.B .FALLBACK_FONT TR ABORT
+.B \%mom
+will abort whenever you try to access a non-existent
+.BR font ,
+and will use the
+.I fallback font
+.B TR
+whenever you try to access a
+.I family
+that does not exist.
+.
+If, for some reason, you want to revert to
+.BR ABORT ,
+just enter
+.B \%".FALLBACK_FONT ABORT"
+and
+.I mom
+will once again abort on
+.IR "font errors" .
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" FAM
+.\" ====================================================================
+.TP
+.BI .FAM " <family>"
+Type Family,
+alias of
+.B .FAMILY
+.
+.
+.\" ====================================================================
+.\" FAMILY
+.\" ====================================================================
+.TP
+.BI .FAMILY " <family>"
+Type Family,
+alias of
+.B .FAM
+.
+.RS
+.
+.P
+.B .FAMILY
+takes one argument: the name of the
+.I family
+you want.
+.
+.I Groff
+comes with a small set of basic families, each identified by a 1-,
+2- or 3-letter mnemonic.
+.
+The standard families are:
+.RS
+.EX
+.B "A = Avant Garde"
+.B "BM = Bookman"
+.B "H = Helvetica"
+.B "HN = Helvetica Narrow"
+.B "N = New Century Schoolbook"
+.B "P = Palatino"
+.B "T = Times Roman"
+.B "ZCM = Zapf Chancery"
+.EE
+.RE
+.
+.P
+The argument you pass to
+.B .FAMILY
+is the identifier at left, above.
+.
+For example, if you want
+.BR Helvetica ,
+enter
+.RS
+.EX
+.B .FAMILY H
+.EE
+.RE
+.
+.P
+Note: The font macro
+.RB ( .FT )
+lets you specify both the type
+.I family
+and the desired font with a single macro.
+.
+While this saves a few
+keystrokes, I recommend using
+.B .FAMILY for
+.IR family ,
+and
+.B .FT for
+.IR font ,
+except where doing so is genuinely inconvenient.
+.
+.BR ZCM ,
+for example,
+only exists in one style:
+.B Italic
+.RB ( I ).
+.
+.P
+Therefore,
+.RS
+.EX
+.B .FT ZCMI
+.EE
+.RE
+makes more sense than setting the
+.I family
+to
+.BR ZCM ,
+then setting the
+.I font
+to
+.IR I .
+.
+.P
+Additional note: If you are running a
+.I groff
+version prior to
+1.19.2,
+you must follow all
+.B .FAMILY
+requests with a
+.B .FT
+request,
+otherwise
+.I mom
+will set all type up to the next
+.B .FT
+request in the fallback font.
+.
+.P
+If you are running
+.I groff
+1.19.2 or later,
+when you invoke the
+.B .FAMILY
+macro,
+.I mom
+.I remembers
+the font style
+.BR ( Roman ,
+.BR Italic ,
+etc) currently in use (if the font style exists in the new
+.IR family )
+and will continue to use the same font style in the new family.
+For example:
+.RS
+.EX
+.BI ".FAMILY BM " "\[rs]"" Bookman family"
+.BI ".FT I " "\[rs]"" Medium Italic"
+.I <some text> \[rs]" Bookman Medium Italic
+.BI ".FAMILY H " "\[rs]"" Helvetica family"
+.I <more text> \[rs]" Helvetica Medium Italic
+.EE
+.RE
+.
+.P
+However, if the font style does not exist in the new family,
+.I mom
+will set all subsequent type in the fallback font (by default,
+.B Courier Medium
+.BR Roman )
+until she encounters a
+.B .FT
+request that's valid for the
+.IR family .
+.
+.P
+For example, assuming you don't have the font
+.B Medium Condensed Roman
+.RI ( mom
+extension
+.IR CD )
+in the
+.I Helvetica
+.IR family :
+.RS
+.EX
+.BI ".FAMILY UN " "\[rs]"" Univers family"
+.BI ".FT CD " "\[rs]"" Medium Condensed"
+.I <some text> \[rs]" Univers Medium Condensed
+.BI ".FAMILY H " "\[rs]"" Helvetica family"
+.I <more text> \[rs]" Courier Medium Roman!
+.EE
+.RE
+.
+.P
+In the above example, you must follow
+.B .FAMILY H
+with a
+.B .FT
+request that's valid for
+.BR Helvetica .
+.
+.P
+Please see the Appendices,
+.I Adding fonts to
+.IR groff ,
+for information on adding fonts and families to
+.IR groff , as well as to
+see a list of the extensions
+.I mom
+provides to
+.IR groff 's
+basic
+.BR R ,
+.BR I ,
+.BR B ,
+.B BI
+styles.
+.
+.P
+Suggestion: When adding
+.I families to
+.IR groff ,
+I recommend following the established standard for the naming families
+and fonts.
+.
+For example, if you add the
+.B Garamond
+family, name the font files
+.RS
+.EX
+.B GARAMONDR
+.B GARAMONDI
+.B GARAMONDB
+.B GARAMONDBI
+.EE
+.RE
+.
+.B GARAMOND then becomes a valid
+.I family name
+you can pass to
+.BR .FAMILY .
+.
+(You could, of course, shorten
+.B GARAMOND
+to just
+.BR G ,
+or
+.BR GD .)
+.BR R ,
+.BR I ,
+.BR B ,
+and
+.B BI
+after
+.B GARAMOND
+are the
+.IR roman ,
+.IR italic ,
+.I bold
+and
+.I bold-italic
+fonts respectively.
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" FONT
+.\" ====================================================================
+.TP
+.BI ".FONT R | B | BI | " "<any other valid font style>"
+Alias to
+.B .FT
+.
+.
+.\" ====================================================================
+.\" FT
+.\" ====================================================================
+.TP
+.BI ".FT R | B | BI | " "<any other valid font style>"
+Set font
+.
+.RS
+.
+.P
+By default,
+.I groff
+permits
+.B .FT
+to take one of four possible arguments specifying the desired font:
+.RS
+.EX
+.B R = (Medium) Roman
+.B I = (Medium) Italic
+.B B = Bold (Roman)
+.B BI = Bold Italic
+.EE
+.RE
+.
+.P
+For example, if your
+.I family
+is
+.BR Helvetica ,
+entering
+.RS
+.EX
+.B .FT B
+.EE
+.RE
+will give you the
+.I Helvetica bold
+.IR font .
+.
+If your
+.I family
+were
+.BR \%Palatino ,
+you'd get the
+.I \%Palatino bold
+.IR font .
+.
+.P
+.B Mom
+considerably extends the range of arguments you can pass to
+.BR .FT ,
+making it more convenient to add and access fonts of differing weights
+and shapes within the same family.
+.
+.P
+Have a look here for a list of the weight/style arguments
+.I mom
+allows.
+.
+Be aware, though, that you must have the fonts, correctly installed
+and named, in order to use the arguments.
+.
+(See
+.I Adding fonts to groff
+for instructions and information.)
+.
+Please also read the
+.I ADDITIONAL NOTE
+found in the description of the
+.B \%.FAMILY
+macro.
+.
+.
+.P
+How
+.I mom
+reacts to an invalid argument to
+.B .FT
+depends on which version of
+.I groff
+you're using.
+.
+If your
+.I groff
+version is 1.19.2 or later,
+.I 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).
+.
+In earlier versions,
+.I mom
+will silently continue processing,
+using either the fallback font or the font that was in effect prior to
+the invalid
+.B .FT
+call.
+.
+.
+.P
+.B .FT
+will also accept, as an argument, a full
+.I family
+and
+.I font
+.IR name .
+.
+.P
+For example,
+.RS
+.EX
+.B .FT HB
+.EE
+.RE
+will set subsequent type in
+.I Helvetica
+.IR Bold .
+.
+.P
+However, I strongly recommend keeping
+.I family
+and
+.I font
+separate except where doing so is genuinely inconvenient.
+.
+.P
+For inline control of
+.IR fonts ,
+see
+.I Inline
+.IR Escapes ,
+font control.
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" Hanging Indent
+.\" ====================================================================
+.TP
+.BI "\%.HI [" " <measure> " ]
+Hanging indent \[em] the optional argument requires a unit of measure.
+.
+.RS
+.
+.P
+A hanging indent looks like this:
+.RS
+.EX
+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.\|.\|.
+.EE
+.RE
+.
+The first line of text
+.I hangs
+outside the
+.IR "left margin" .
+.
+.P
+In order to use
+.IR "hanging indents" ,
+you must first have a
+.I left indent
+active (set with either
+.B .IL
+or
+.BR .IB ).
+.
+.B Mom
+will not hang text outside the
+.I left margin set
+with
+.B \%.L_MARGIN
+or outside the
+.I left margin
+of a
+.IR \%tab .
+.
+.P
+The first time you invoke
+.BR .HI ,
+you must give it a
+.BR measure .
+.
+If you want the first line of a paragraph to
+.IR "hang by" ,
+say,
+.IR "1 pica" ,
+do
+.RS
+.EX
+.B ".IL 1P"
+.B ".HI 1P"
+.EE
+.RE
+.
+Subsequent invocations of
+.B \%.HI
+do not require you to supply a
+.IR measure ;
+.I mom
+keeps track of the last measure you gave it.
+.
+.P
+Generally speaking, you should invoke
+.B .HI
+immediately prior to the line you want hung (i.e.\& without any
+intervening control lines).
+.
+And because
+.I hanging indents
+affect only one line, there's no need to turn them off.
+.
+.P
+.I IMPORTANT:
+Unlike
+.BR IL ,
+.B IR
+and
+.BR IB ,
+measures given to
+.B .HI
+are NOT additive.
+.
+Each time you pass a measure to
+.BR .HI ,
+the measure is treated literally.
+.
+.B
+.I Recipe:
+A numbered list using
+.I hanging indents
+.
+.P
+.I Note:
+.I mom
+has macros for setting lists.
+.
+This recipe exists to demonstrate the use of
+.I hanging indents
+only.
+.RS
+.EX
+\&.PAGE 8.5i 11i 1i 1i 1i 1i
+\&.FAMILY T
+\&.FT R
+\&.PT_SIZE 12
+\&.LS 14
+\&.JUSTIFY
+\&.KERN
+\&.SS 0
+\&.IL \[rs]w\[aq]\[rs]0\[rs]0.\[aq]
+\&.HI \[rs]w\[aq]\[rs]0\[rs]0.\[aq]
+1.\[rs]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\[aq]s word on the
+subject except Mr.\& Adams\[aq]s.
+\&.HI
+2.\[rs]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\[aq]t
+deserve equal rights and equal access in the universe?
+\&.HI
+3.\[rs]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?
+.EE
+.RE
+.
+.P
+First, we invoke a left indent with a measure equal to the width of 2
+figures spaces plus a period (using the \[rs]w inline escape).
+.
+At this point, the left indent is active; text afterward 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 \[lq]out to the left
+margin\[rq]).
+.
+Because we begin the first line with a number, a period, and a figure
+space, the actual text
+.RI ( "The most important point.\|.\|.\&" )
+starts at exactly the same spot as the indented lines that follow.
+.
+.P
+Notice that subsequent invocations of
+.B .HI
+don't require a
+.I measure
+to be given.
+.
+.P
+Paste the example above into a file and preview it with
+.RS
+.EX
+.B pdfmom filename.mom | ps2pdf \- filename.pdf
+.EE
+.RE
+to see hanging indents in action.
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" IB - INDENT BOTH
+.\" ====================================================================
+.TP
+.BI "\%.IB [" " <left measure> <right measure> " ]
+Indent both \[em] the optional argument requires a unit of measure
+.
+.RS
+.
+.P
+.B .IB
+allows you to set or invoke a left and a right indent at the same time.
+.
+.P
+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
+.B .IL
+and
+.BR .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.
+.
+.P
+.I A word of advice:
+If you need to manipulate left and right indents separately, use a
+combination of
+.B .IL
+and
+.B .IR
+instead of
+.BR .IB .
+.
+You'll save yourself a lot of grief.
+.
+.P
+A
+.I minus sign
+may be prepended to the arguments to subtract from their current
+values.
+.
+The \[rs]w inline escape may be used to specify text-dependent
+measures, in which case no unit of measure is required.
+.
+For example,
+.RS
+.EX
+.B .IB \[rs]w\[aq]margarine\[aq] \[rs]w\[aq]jello\[aq]
+.EE
+.RE
+left indents text by the width of the word
+.I margarine
+and right indents by the width of
+.IR jello .
+.
+.P
+Like
+.B .IL
+and
+.BR .IR ,
+.B .IB
+with no argument indents by its last active values.
+.
+See the brief explanation of how mom handles indents for more details.
+.
+.P
+.I Note:
+Calling a
+.I tab
+(with
+.BR ".TAB <n>" )
+automatically cancels any active indents.
+.
+.P
+.I Additional note:
+Invoking
+.B .IB
+automatically turns off
+.B .IL
+and
+.BR .IR .
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" IL - INDENT LEFT
+.\" ====================================================================
+.TP
+.BI "\%.IL [" " <measure> " ]
+Indent left \[em] the optional argument requires a unit of measure
+.
+.RS
+.
+.P
+.B .IL
+indents text from the left margin of the page, or if you're in a
+.IR tab ,
+from the left edge of the
+.IR tab .
+.
+Once
+.I IL
+is on, the
+.I left indent
+is applied uniformly to every subsequent line of text, even if you
+change the line length.
+.
+.P
+The first time you invoke
+.BR .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
+.B \[rs]w
+inline escape may be used to specify a text-dependent measure, in
+which case no unit of measure is required.
+.
+For example,
+.RS
+.EX
+.B .IL \[rs]w\[aq]margarine\[aq]
+.EE
+.RE
+indents text by the width of the word
+.IR margarine .
+.
+.P
+With no argument,
+.B .IL
+indents by its last active value.
+.
+See the brief explanation of how
+.I mom
+handles indents for more details.
+.
+.P
+.I Note:
+Calling a
+.I tab
+(with
+.BR ".TAB <n>" )
+automatically cancels any active indents.
+.
+.P
+.I Additional note:
+Invoking
+.B .IL
+automatically turns off
+.BR IB .
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" IQ - quit any/all indents
+.\" ====================================================================
+.TP
+.BI "\%.IQ [" " <measure> " ]
+IQ \[em] quit any/all indents
+.
+.RS
+.
+.P
+.I IMPORTANT NOTE:
+The original macro for quitting all indents was
+.BR .IX .
+.
+This usage has been deprecated in favour of
+.BR IQ .
+.
+.B .IX
+will continue to behave as before, but
+.I mom
+will issue a warning to
+.I stderr
+indicating that you should update your documents.
+.
+.P
+As a consequence of this change,
+.BR .ILX ,
+.B .IRX
+and
+.B .IBX
+may now also be invoked as
+.BR .ILQ ,
+.B .IRQ
+and
+.BR .IBQ .
+.
+Both forms are acceptable.
+.
+.P
+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.
+.
+.P
+If you pass these macros the optional argument
+.BR 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.
+.
+.P
+.BR ".IQ CLEAR" ,
+as you'd suspect, quits and clears the values for all indent
+styles at once.
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" IR - INDENT RIGHT
+.\" ====================================================================
+.TP
+.BI "\%.IR [" " <measure> " ]
+Indent right \[em] the optional argument requires a unit of measure
+.
+.RS
+.
+.P
+.B .IR
+indents text from the
+.I right margin
+of the page, or if you're in a
+.IR tab ,
+from the end of the
+.IR tab .
+.
+.P
+The first time you invoke
+.BR .IR ,
+you must give it a measure.
+.
+Subsequent invocations with a measure add to the previous indent
+measure.
+.
+A
+.I minus sign
+may be prepended to the argument to subtract from the current indent
+measure.
+.
+The \[rs]w inline escape may be used to specify a text-dependent
+measure, in which case no
+.I unit of measure
+is required.
+.
+For example,
+.RS
+.EX
+.B .IR \[rs]w\[aq]jello\[aq]
+.EE
+.RE
+indents text by the width of the word
+.IR jello .
+.
+.P
+With no argument,
+.B .IR
+indents by its last active value.
+.
+See the brief explanation of how
+.I mom
+handles indents for more details.
+.
+.P
+.I Note:
+Calling a
+.I tab
+(with
+.BR "\%.TAB <n>" )
+automatically cancels any active indents.
+.
+.P
+.I Additional note:
+Invoking
+.B .IR
+automatically turns off
+.BR IB .
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" Left Margin
+.\" ====================================================================
+.TP
+.BI .L_MARGIN " <left margin>"
+Left Margin
+.
+.RS
+.
+.P
+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.
+.
+.P
+Left indents and tabs are calculated from the value you pass to
+.BR .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
+.RS
+.EX
+.B .L_MARGIN 3P
+.EE
+.RE
+or
+.RS
+.EX
+.B .L_MARGIN .5i
+.EE
+.RE
+.
+.P
+If you use the macros
+.BR .PAGE ,
+.B .PAGEWIDTH
+or
+.B .PAPER
+without invoking
+.B .L_MARGIN
+(either before or afterward),
+.I mom
+automatically sets
+.B .L_MARGIN
+to
+.IR "1 inch" .
+.
+.P
+Note:
+.B .L_MARGIN
+behaves in a special way when you're using the document processing
+macros.
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" MCO - BEGIN MULTI-COLUMN SETTING
+.\" ====================================================================
+.TP
+.B .MCO
+Begin multi-column setting.
+.
+.RS
+.P
+.B .MCO
+.RI ( "Multi-Column On" )
+is the
+.I macro
+you use to begin
+.IR "multi-column setting" .
+.
+It marks the current baseline as the top of your columns, for use
+later with
+.BR .MCR .
+.
+See the introduction to columns for an explanation of
+.I multi-columns
+and some sample input.
+.
+.P
+.I Note:
+Do not confuse
+.B .MCO
+with the
+.B .COLUMNS
+macro in the document processing macros.
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" MCR - RETURN TO TOP OF COLUMN
+.\" ====================================================================
+.TP
+.B \%.MCR
+Once you've turned
+.I multi-columns
+on (with
+.BR \%.MCO ),
+.BR .MCR ,
+at any time,
+returns you to the
+.IR "top of your columns" . \" XXX: Are italics truly required here?
+.
+.
+.\" ====================================================================
+.\" MCX - EXIT MULTI-COLUMNS
+.\" ====================================================================
+.TP
+.BI "\%.MCX [ " "<distance to advance below longest column>" " ]"
+Optional argument requires a unit of measure.
+.
+.RS
+.
+.P
+Exit multi-columns.
+.
+.P
+.B .MCX
+takes you out of any
+.I tab
+you were in (by silently invoking
+.BR .TQ )
+and advances to the bottom of the longest column.
+.
+.P
+Without an argument,
+.B .MCX
+advances
+.I 1 linespace
+below the longest column.
+.
+.P
+Linespace, in this instance, is the leading in effect at the moment
+.B .MCX
+is invoked.
+.
+.P
+If you pass the
+.I <distance>
+argument to
+.BR .MCX ,
+it advances
+.I 1 linespace
+below the longest column (see above)
+.I PLUS
+the distance specified by the argument.
+.
+The argument requires a unit of measure; therefore, to advance an
+extra 6 points below where
+.B \%.MCX
+would normally place you, you'd enter
+.RS
+.EX
+.B .MCX 6p
+.EE
+.RE
+.
+.P
+.I Note:
+If you wish to advance a precise distance below the baseline of the
+longest column, use
+.B .MCX
+with an argument of
+.B 0
+(zero; no
+.I unit of measure
+required) in conjunction with the
+.B \%.ALD
+macro, like this:
+.RS
+.EX
+.B .MCX 0
+.B .ALD 24p
+.EE
+.RE
+.
+The above advances to precisely
+.I 24 points
+below the baseline of the longest column.
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" Start a new Page
+.\" ====================================================================
+.TP
+.B .NEWPAGE
+.
+.RS
+.
+.P
+Whenever you want to start a new page, use
+.BR .NEWPAGE ,
+by itself with no argument.
+.
+.B 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
+.BR .T_MARGIN ).
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" Page
+.\" ====================================================================
+.TP
+.BI ".PAGE " <width> " [ " <length> " [ " <lm> " [ " <rm> " [ " \
+ <tm> " [ " <bm> " ] ] ] ] ]"
+.
+.RS
+.
+.P
+All arguments require a unit of measure
+.
+.P
+.I IMPORTANT:
+If you're using the document processing macros,
+.B .PAGE
+must come after
+.BR .START .
+.
+Otherwise, it should go at the top of a document, prior to 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).
+.
+.P
+.B .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.
+.
+.IR <lm> ,
+.IR <rm> ,
+.I <tm>
+and
+.I <bm>
+refer to the left, right, top and bottom margins respectively.
+.
+.P
+Assuming your page dimensions are 11 inches by 17 inches, and that's
+all you want to set, enter
+.RS
+.EX
+.B .PAGE 11i 17i
+.EE
+.RE
+.
+If you want to set the left margin as well, say, at 1 inch,
+.B PAGE
+would look like this:
+.RS
+.EX
+.B .PAGE 11i 17i 1i
+.EE
+.RE
+.
+.P
+Now suppose you also want to set the top margin,
+say,
+at 1\(en1/2 inches.
+.
+.I <tm>
+comes after
+.I <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
+.B .PAGE
+macro would look like this:
+.RS
+.EX
+.tr -\-
+\&.PAGE 11i 17i 1i 1i 1.5i
+ | |
+required right---+ +---top margin
+ margin
+.tr --
+.EE
+.RE
+.
+.P
+Clearly,
+.B .PAGE
+is best used when you want a convenient way to tell
+.I 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
+.RS
+.EX
+.B .PAGE 8.5i 11i 45p 45p 45p 45p
+.EE
+.RE
+.
+This sets up an 8\(12 by 11 inch page with margins of 45 points
+(5/8-inch) all around.
+.
+.P
+Additionally, if you invoke
+.B .PAGE
+with a top margin argument, any macros you invoke after
+.B .PAGE
+will almost certainly move the baseline of the first line of text down
+by one linespace.
+.
+To compensate, do
+.RS
+.EX
+.B .RLD 1v
+.EE
+.RE
+immediately before entering any text, or, if it's feasible, make
+.B .PAGE
+the last macro you invoke prior to entering text.
+.
+.P
+Please read the
+.I Important note
+on page dimensions and papersize for information on ensuring
+.I groff
+respects your
+.B .PAGE
+dimensions and margins.
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" Page Length
+.\" ====================================================================
+.TP
+.BI .PAGELENGTH " <length of printer sheet>"
+tells
+.I mom
+how long your printer sheet is.
+.
+It works just like
+.BR .PAGEWIDTH .
+.
+.RS
+.
+.P
+Therefore, to tell
+.I mom
+your printer sheet is 11 inches long, you enter
+.RS
+.EX
+.B .PAGELENGTH 11i
+.EE
+.RE
+.
+Please read the important note on page dimensions and papersize for
+information on ensuring
+.I groff
+respects your
+.IR PAGELENGTH .
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" Page Width
+.\" ====================================================================
+.TP
+.BI .PAGEWIDTH " <width of printer sheet>"
+.
+.RS
+.
+.P
+The argument to
+.B .PAGEWIDTH
+is the width of your printer sheet.
+.
+.P
+.B .PAGEWIDTH
+requires a unit of measure.
+.
+Decimal fractions are allowed.
+.
+Hence, to tell
+.I mom
+that the width of your printer sheet is 8\(12 inches, you enter
+.RS
+.EX
+\&.PAGEWIDTH 8.5i
+.EE
+.RE
+.
+.P
+Please read the Important note on page dimensions and papersize for
+information on ensuring
+.I groff
+respects your
+.IR PAGEWIDTH .
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" Paper
+.\" ====================================================================
+.TP
+.BI .PAPER " <paper type>"
+provides a convenient way to set the page dimensions for some common
+printer sheet sizes.
+.
+The argument
+.I <paper type>
+can be one of:
+.BR LETTER ,
+.BR LEGAL ,
+.BR STATEMENT ,
+.BR TABLOID ,
+.BR LEDGER ,
+.BR FOLIO ,
+.BR QUARTO ,
+.BR EXECUTIVE ,
+.BR 10x14 ,
+.BR A3 ,
+.BR A4 ,
+.BR A5 ,
+.BR B4 ,
+.BR B5 .
+.
+.
+.TP
+.B .PRINTSTYLE
+.
+.
+.\" ====================================================================
+.\" PT_SIZE - POINT SIZE OF TYPE
+.\" ====================================================================
+.TP
+.BI .PT_SIZE " <size of type in points>"
+Point size of type, does not require a
+.IR "unit of measure" .
+.
+.RS
+.
+.P
+.B \%.PT_SIZE
+.RI ( "Point Size" )
+takes one argument: the
+.I size of type
+in
+.IR points .
+.
+Unlike most other macros that establish the
+.I size
+or
+.I measure
+of something,
+.B \%.PT_SIZE
+does not require that you supply a
+.I unit of measure
+since it's a near universal convention that
+.I type size
+is measured in
+.IR points .
+.
+Therefore, to change the
+.I type size
+to, say,
+.IR "11 points" ,
+enter
+.RS
+.EX
+.B .PT_SIZE 11
+.EE
+.RE
+.
+.I Point sizes
+may be
+.I fractional
+(e.g.,
+.I 10.25
+or
+.IR 12.5 ).
+.
+.P
+You can prepend a
+.I plus
+or a
+.I minus sign
+to the argument to
+.BR \%.PT_SIZE ,
+in which case the
+.I point size
+will be changed by
+.I +
+or
+.I \-
+the original value.
+.
+For example,
+if the
+.I point size
+is
+.IR 12 ,
+and you want
+.IR 14 ,
+you can do
+.RS
+.EX
+.B .PT_SIZE +2
+.EE
+.RE
+then later reset it to
+.I 12
+with
+.RS
+.EX
+.B .PT_SIZE \-2
+.EE
+.RE
+.
+The
+.I size of type
+can also be changed inline.
+.
+.P
+.I Note:
+It is unfortunate that the
+.B \%pic
+preprocessor has already taken the name, PS, and thus
+.IR mom 's
+macro for setting
+.I point sizes
+can't use it.
+.
+However, if you aren't using
+.BR pic ,
+you might want to alias
+.B \%.PT_SIZE
+as
+.BR .PS ,
+since there'd be no conflict.
+.
+For example
+.RS
+.EX
+.B .ALIAS PS PT_SIZE
+.EE
+.RE
+would allow you to set
+.I point sizes
+with
+.BR .PS .
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" Right Margin
+.\" ====================================================================
+.TP
+.BI .R_MARGIN " <right margin>"
+Right Margin
+.
+.RS
+.
+.P
+Requires a unit of measure.
+.
+.P
+IMPORTANT:
+.BR .R_MARGIN ,
+if used, must come after
+.BR .PAPER ,
+.BR .PAGEWIDTH ,
+.BR .L_MARGIN ,
+and/or
+.B .PAGE
+(if a right margin isn't given to PAGE).
+.
+The reason is that
+.B .R_MARGIN
+calculates line length from the overall page dimensions and the left
+margin.
+.
+.P
+Obviously, it can't make the calculation if it doesn't know the page
+width and the left margin.
+.
+.P
+.B .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.
+.B .R_MARGIN
+requires a unit of measure.
+.
+Decimal fractions are allowed.
+.
+.P
+The line length macro (LL) can be used in place of
+.BR .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.
+.
+.P
+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:
+.RS
+.EX
+.B .L_MARGIN 6P
+.B .R_MARGIN 6P
+.EE
+.RE
+.
+.P
+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, e.g.,
+.RS
+.EX
+.B .LL 17P+3p
+.EE
+.RE
+.
+.P
+If you use the macros
+.BR .PAGE ,
+.B .PAGEWIDTH
+or
+.B PAPER
+without invoking
+.B .R_MARGIN
+afterward,
+.I mom
+automatically sets
+.B .R_MARGIN
+to
+.IR "1 inch" .
+.
+If you set a line length after these macros (with
+.BR .LL ),
+the line length calculated by
+.B .R_MARGIN
+is, of course, overridden.
+.
+.P
+Note:
+.B .R_MARGIN
+behaves in a special way when you're using the document processing
+macros.
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" ST - Set String Tabs
+.\" ====================================================================
+.TP
+.FONT B .ST I " <tab number> " B "L | R | C | J [ QUAD ]"
+.
+.RS
+.P
+After
+.I string tabs
+have been marked off on an input line (see
+.BR \[rs]*[ST].\|.\|.\&\[rs]*[STX] ),
+you need to
+.I set
+them by giving them a direction and, optionally, the
+.B \%QUAD
+argument.
+.
+.P
+In this respect,
+.B .ST
+is like
+.B \%.TAB_SET
+except that you don't have to give
+.B .ST
+an indent or a line length (that's already taken care of, inline,
+by
+.BR \[rs]*[ST].\|.\|.\&\[rs]*[STX] ).
+.
+.P
+If you want string
+.I tab 1
+to be
+.BR \%left ,
+enter
+.RS
+.EX
+.B .ST 1 L
+.EE
+.RE
+.
+If you want it to be
+.I \%left
+and
+.IR \%filled ,
+enter
+.RS
+.EX
+.B .ST 1 L \%QUAD
+.EE
+.RE
+.
+If you want it to be justified, enter
+.RS
+.EX
+.B .ST 1 J
+.EE
+.RE
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" TAB - Call Tabs
+.\" ====================================================================
+.TP
+.BI \%.TAB " <tab number>"
+After
+.I tabs
+have been defined (either with
+.B \%.TAB_SET
+or
+.BR .ST ),
+.B \%.TAB
+moves to whatever
+.I tab number
+you pass it as an argument.
+.
+.RS
+.
+.P
+For example,
+.RS
+.EX
+.B \%.TAB 3
+.EE
+.RE
+moves you to
+.IR "\%tab 3" .
+.
+.P
+Note:
+.B \%.TAB
+breaks the line preceding it and advances 1 linespace.
+.
+Hence,
+.RS
+.EX
+.B .TAB 1
+.B A line of text in tab 1.
+.B .TAB 2
+.B A line of text in tab 2.
+.EE
+.RE
+produces, on output
+.RS
+.EX
+.B "A line of text in tab 1."
+.B " A line of text in tab 2."
+.EE
+.RE
+.
+.
+.P
+If you want the tabs to line up,
+use
+.B .TN
+(\[lq]Tab Next\[rq])
+or,
+more conveniently,
+the inline escape sequence
+.BR \[rs]*[TB+] :
+.RS
+.EX
+.BR .TAB \~1
+A line of text in tab 1.\[rs]*[TB+]
+A line of text in tab 2.
+.EE
+.RE
+which produces
+.RS
+.EX
+.B "A line of text in tab 1.\& A line of text in tab 2."
+.EE
+.RE
+.
+.
+.P
+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.
+.
+.P
+.I Additional note:
+Any indents in effect prior to calling a tab are automatically turned
+off by
+.BR TAB .
+.
+If you were happily zipping down the page with a left indent of
+.I 2 picas
+turned on, and you call a
+.I tab
+whose indent from the left margin is
+.IR "6 picas" ,
+your new distance from the
+.I left margin
+will be
+.IR "6 picas" ,
+not
+I 6 picas plus the 2 pica
+indent.
+.
+.P
+.I \%Tabs
+are not by nature columnar, which is to say that if the text inside a
+.I tab
+runs to several lines, calling another
+.I tab
+does not automatically move to the baseline of the first line in the
+.IR "previous tab" .
+.
+To demonstrate:
+.RS
+.EX
+TAB 1
+Carrots
+Potatoes
+Broccoli
+\&.TAB 2
+$1.99/5 lbs
+$0.25/lb
+$0.99/bunch
+.EE
+.RE
+produces, on output
+.RS
+.EX
+Carrots
+Potatoes
+Broccoli
+ $1.99/5 lbs
+ $0.25/lb
+ $0.99/bunch
+.EE
+.RE
+.
+.RE
+.
+.\" ====================================================================
+.\" TB - Call Tabs Alias
+.\" ====================================================================
+.TP
+.BI .TB " <tab number>"
+Alias to
+.B .TAB
+.
+.
+.\" ====================================================================
+.\" TI - TEMPORARY (LEFT) INDENT
+.\" ====================================================================
+.TP
+.BI "\%.TI [" " <measure> " ]
+Temporary left indent \[em] the optional argument requires a
+.I unit of measure
+.
+.RS
+.
+.P
+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.
+.RB ( Mom's
+.B .PP
+macro, for example, uses a
+.IR "temporary indent" .)
+.
+.P
+The first time you invoke
+.BR .TI ,
+you must give it a measure.
+.
+If you want to
+.I indent
+the first line of a paragraph by, say, 2 ems, do
+.RS
+.EX
+.B .TI 2m
+.EE
+.RE
+.
+.P
+Subsequent invocations of
+.B .TI
+do not require you to supply a measure;
+.I mom
+keeps track of the last measure you gave it.
+.
+.P
+Because
+.I temporary indents
+are temporary, there's no need to turn them off.
+.
+.P
+.I IMPORTANT:
+Unlike
+.BR .IL ,
+.B .IR
+and
+.BR IB ,
+measures given to
+.B .TI
+are NOT additive.
+.
+In the following example, the second
+.B \%".TI 2P"
+is exactly
+.IR "2 picas" .
+.RS
+.EX
+.B .TI 1P
+.B The beginning of a paragraph.\|.\|.\&
+.B .TI 2P
+.B The beginning of another paragraph.\|.\|.\&
+.EE
+.RE
+.
+.RE
+.
+.
+.
+.\" ====================================================================
+.\" TN - Tab Next
+.\" ====================================================================
+.TP
+.B .TN
+Tab Next
+.
+.RS
+.P
+Inline escape
+.B \[rs]*[TB+]
+.
+.P
+.B TN
+moves over to the
+.I next tab
+in numeric sequence
+.RI ( "tab n+1" )
+without advancing on the page.
+.
+See the
+.I NOTE
+in the description of the
+.B \%.TAB
+macro for an example of how
+.B TN
+works.
+.
+.P
+In
+.I \%tabs
+that aren't given the
+.B QUAD
+argument when they're set up with
+.B \%.TAB_SET
+or
+.BR ST ,
+you must terminate the line preceding
+.B .TN
+with the
+.B \[rs]c
+inline escape sequence.
+.
+Conversely, if you did give a
+.B QUAD
+argument to
+.B \%.TAB_SET
+or
+.BR ST ,
+the
+.B \[rs]c must not be used.
+.
+.P
+If you find remembering whether to put in the
+.B \[rs]c
+bothersome, you may prefer to use the inline escape alternative
+to
+.BR .TN ,
+.BR \[rs]*[TB+] ,
+which works consistently regardless of the fill mode.
+.
+.P
+.I Note:
+You must put text in the input line immediately after
+.BR .TN .
+.
+Stacking of
+.BR .TN 's
+is not allowed.
+.
+In other words, you cannot do
+.RS
+.EX
+\&.TAB 1
+Some text\[rs]c
+\&.TN
+Some more text\[rs]c
+\&.TN
+\&.TN
+Yet more text
+.EE
+.RE
+.
+The above example, assuming
+.I tabs
+numbered from
+.I 1
+to
+.IR 4 ,
+should be entered
+.RS
+.EX
+\&.TAB 1
+Some text\[rs]c
+\&.TN
+Some more text\[rs]c
+\&.TN
+\[rs]&\[rs]c
+\&.TN
+Yet more text
+.EE
+.RE
+.
+\[rs]& is a zero-width, non-printing character that
+.I groff
+recognizes as valid input, hence meets the requirement for input text
+following
+.BR .TN .
+.
+.RE
+.
+.
+.\" ====================================================================
+.\" Tab Quit
+.\" ====================================================================
+.TP
+.B .TQ
+.B TQ
+takes you out of whatever
+.I tab
+you were in, advances
+.IR "1 linespace" ,
+and restores the
+.IR "left margin" ,
+.IR "line length" ,
+.I quad direction
+and
+.I fill mode
+that were in effect prior to invoking any
+.IR tabs .
+.
+.
+.\" ====================================================================
+.\" Top Margin
+.\" ====================================================================
+.TP
+.BI .T_MARGIN " <top margin>"
+Top margin
+.
+.RS
+.
+.P
+Requires a unit of measure
+.
+.P
+.B .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\(12 centimetres, you'd enter
+.RS
+.EX
+.B .T_MARGIN 2.5c
+.EE
+.RE
+.
+.B .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,
+.RS
+.EX
+.B .T_MARGIN 1.5i
+.EE
+.RE
+puts the baseline of the first line of type 1\(12 inches beneath the
+top of the page.
+.
+.P
+Note:
+.B .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.
+.
+.P
+IMPORTANT:
+.B .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,
+.B .T_MARGIN
+should only be used at the top of a file (prior to entering text) or
+after NEWPAGE, like this:
+.RS
+.EX
+.B .NEWPAGE
+.B .T_MARGIN 6P
+.I <text>
+.EE
+.RE
+.
+.RE
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+.I mom
+was written by
+.MT peter@\:schaffter\:.ca
+Peter Schaffter
+.ME .
+.
+PDF support was provided by
+.MT deri@\:chuzzlewit\:.myzen\:.co\:.uk
+Deri James
+.ME .
+.
+This manual page was written by Bernd Warken.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.TP
+.I @HTMLDOCDIR@/\:mom/\:toc\:.html
+entry point to the HTML documentation
+.
+.
+.TP
+.UR http://\:www\:.schaffter\:.ca/\:mom/\:momdoc/\:toc\:.html
+.UE
+HTML documentation online
+.
+.
+.TP
+.UR http://\:www\:.schaffter\:.ca/\:mom/
+.UE
+the
+.I mom
+macros homepage
+.
+.
+.P
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is the primary
+.I groff
+manual.
+.
+You can browse it interactively with \[lq]info groff\[rq].
+.
+.
+.P
+.MR pdfmom @MAN1EXT@ ,
+.MR groff @MAN1EXT@ ,
+.MR @g@troff @MAN1EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_mom_7_man_C]
+.do rr *groff_groff_mom_7_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/mom/mom.am b/contrib/mom/mom.am
new file mode 100644
index 0000000..3bbbc9a
--- /dev/null
+++ b/contrib/mom/mom.am
@@ -0,0 +1,182 @@
+# Copyright (C) 2002-2020 Free Software Foundation, Inc.
+# Written by Werner Lemberg <wl@gnu.org>
+# Automake migration by Bertrand Garrigues
+# <bertrand.garrigues@laposte.net>
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+mom_srcdir = $(top_srcdir)/contrib/mom
+
+# pdfmom command used to generate .pdf
+#
+# Use '-K utf8', not '-k', in case 'configure' didn't find uchardet.
+MOMPDFMOM = \
+ GROFF_COMMAND_PREFIX= \
+ GROFF_BIN_PATH="$(GROFF_BIN_PATH)" \
+ PDFMOM_BIN_PATH="$(top_builddir)" \
+ $(PDFMOMBIN) $(FFLAG) $(MFLAG) -M$(mom_srcdir) -K utf8 -p -e -t
+
+man7_MANS += contrib/mom/groff_mom.7
+
+# Files installed in $(tmacdir).
+# MOMNORMALFILES are located in the source tree.
+MOMNORMALFILES = \
+ contrib/mom/mom.tmac \
+ contrib/mom/om.tmac
+momtmacdir = $(tmacdir)
+dist_momtmac_DATA = $(MOMNORMALFILES)
+
+# Files installed in htmldocdir/mom
+MOMHTMLDOCFILES=\
+ contrib/mom/momdoc/stylesheet.css \
+ contrib/mom/momdoc/appendices.html \
+ contrib/mom/momdoc/color.html \
+ contrib/mom/momdoc/cover.html \
+ contrib/mom/momdoc/definitions.html \
+ contrib/mom/momdoc/docelement.html \
+ contrib/mom/momdoc/docprocessing.html \
+ contrib/mom/momdoc/goodies.html \
+ contrib/mom/momdoc/graphical.html \
+ contrib/mom/momdoc/headfootpage.html \
+ contrib/mom/momdoc/images.html \
+ contrib/mom/momdoc/inlines.html \
+ contrib/mom/momdoc/intro.html \
+ contrib/mom/momdoc/letters.html \
+ contrib/mom/momdoc/macrolist.html \
+ contrib/mom/momdoc/rectoverso.html \
+ contrib/mom/momdoc/refer.html \
+ contrib/mom/momdoc/reserved.html \
+ contrib/mom/momdoc/tables-of-contents.html \
+ contrib/mom/momdoc/toc.html \
+ contrib/mom/momdoc/typesetting.html \
+ contrib/mom/momdoc/using.html \
+ contrib/mom/momdoc/version-2.html
+momhtmldir = $(htmldocdir)/mom
+momhtml_DATA = $(MOMHTMLDOCFILES)
+
+# Files installed in $(examplesdir)/mom. MOMEXAMPLEFILES are located
+# in the source tree, while MOMPROCESSEDEXAMPLEFILES are generated in
+# the build tree.
+MOMEXAMPLEFILES=\
+ contrib/mom/examples/letter.mom \
+ contrib/mom/examples/mom-pdf.mom \
+ contrib/mom/examples/mon_premier_doc.mom \
+ contrib/mom/examples/sample_docs.mom \
+ contrib/mom/examples/typesetting.mom \
+ contrib/mom/examples/README.txt \
+ contrib/mom/examples/README-fr.txt \
+ contrib/mom/examples/elvis_syntax \
+ contrib/mom/examples/elvis_syntax.new \
+ contrib/mom/examples/penguin.ps \
+ contrib/mom/examples/penguin.pdf \
+ contrib/mom/examples/mom.vim \
+ contrib/mom/examples/slide-demo.mom \
+ contrib/mom/examples/copyright-default.mom \
+ contrib/mom/examples/copyright-chapter.mom
+momexampledir = $(exampledir)/mom
+dist_momexample_DATA = $(MOMEXAMPLEFILES)
+
+if USE_GROPDF
+MOMPROCESSEDEXAMPLEFILES = \
+ contrib/mom/examples/letter.pdf \
+ contrib/mom/examples/mom-pdf.pdf \
+ contrib/mom/examples/mon_premier_doc.pdf \
+ contrib/mom/examples/sample_docs.pdf \
+ contrib/mom/examples/slide-demo.pdf \
+ contrib/mom/examples/copyright-default.pdf \
+ contrib/mom/examples/copyright-chapter.pdf
+if HAVE_URW_FONTS
+MOMPROCESSEDEXAMPLEFILES += contrib/mom/examples/typesetting.pdf
+endif
+momprocessedexampledir = $(exampledir)/mom
+nodist_momprocessedexample_DATA = $(MOMPROCESSEDEXAMPLEFILES)
+endif
+
+mom_test_template = contrib/mom/examples/test-mom.sh.in
+
+# Small test suite on mom examples
+mom_TESTS = contrib/mom/examples/tests-mom.sh
+TESTS += $(mom_TESTS)
+contrib/mom/examples/tests-mom.sh: \
+ $(top_builddir)/config.status \
+ $(MOMPROCESSEDEXAMPLEFILES) \
+ $(top_srcdir)/$(mom_test_template)
+ $(AM_V_GEN)sed \
+ -e "s|[@]abs_top_builddir[@]|$(abs_top_builddir)|g" \
+ -e "s|[@]groff_have_urw_fonts[@]|$(groff_have_urw_fonts)|g" \
+ $(top_srcdir)/$(mom_test_template) > $@ \
+ && chmod +x $@
+MOSTLYCLEANFILES += $(mom_TESTS)
+EXTRA_DIST += $(mom_test_template)
+
+# For this list of files we add a symlink from $(exampledir)/mom to $(pdfdocdir)
+PDFDOCFILE = mom-pdf.pdf
+
+EXTRA_DIST += $(MOMHTMLDOCFILES) $(MOMEXAMPLEFILES) \
+ contrib/mom/BUGS \
+ contrib/mom/ChangeLog \
+ contrib/mom/NEWS \
+ contrib/mom/TODO \
+ contrib/mom/copyright \
+ contrib/mom/groff_mom.7.man
+
+MOSTLYCLEANFILES += \
+ $(MOMPROCESSEDEXAMPLEFILES) \
+ penguin.ps \
+ penguin.pdf
+
+# rule to generate .pdf files from .mom files
+SUFFIXES += .mom .pdf
+.mom.pdf:
+ $(GROFF_V)$(MKDIR_P) `dirname $@` \
+ && LC_ALL=C $(MOMPDFMOM) $< >$@
+
+$(MOMPROCESSEDEXAMPLEFILES): $(MOMNORMALFILES) \
+ groff troff gropdf pdfmom penguin.ps penguin.pdf font/devpdf/stamp
+
+penguin.ps:
+ $(AM_V_at)cp $(mom_srcdir)/examples/penguin.ps $@
+penguin.pdf:
+ $(AM_V_at)cp $(mom_srcdir)/examples/penguin.pdf $@
+
+install-data-hook: install_mom
+install_mom:
+if USE_GROPDF
+ for f in $(PDFDOCFILE); do \
+ $(RM) $(DESTDIR)$(pdfdocdir)/$$f; \
+ ln -s $(exampledir)/mom/$$f $(DESTDIR)$(pdfdocdir)/$$f; \
+ done
+endif
+
+uninstall_groffdirs: uninstall_mom
+uninstall_mom:
+ for f in $(PDFDOCFILE); do \
+ $(RM) $(DESTDIR)$(pdfdocdir)/$$f; \
+ done
+ -rmdir $(DESTDIR)$(pdfdocdir)
+ if test -d $(DESTDIR)$(exampledir)/mom; then \
+ rmdir $(DESTDIR)$(exampledir)/mom; \
+ fi
+ if test -d $(DESTDIR)$(htmldocdir)/mom; then \
+ rmdir $(DESTDIR)$(htmldocdir)/mom; \
+ fi
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/contrib/mom/mom.tmac b/contrib/mom/mom.tmac
new file mode 100644
index 0000000..7a6494b
--- /dev/null
+++ b/contrib/mom/mom.tmac
@@ -0,0 +1,3 @@
+.\" -*- nroff -*- 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..964a2ab
--- /dev/null
+++ b/contrib/mom/momdoc/appendices.html
@@ -0,0 +1,901 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>Mom -- Appendices</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div id="top" class="page">
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+<tr>
+ <td><a href="toc.html">Back to Table of Contents</a></td>
+</tr>
+</table>
+
+<h1 id="appendices" class="docs">Appendices</h1>
+
+<div style="width: 68%; margin: auto;">
+<ul class="no-enumerator">
+ <li><a href="#fonts">Adding fonts to groff</a>
+ <ul style="margin-left: -.5em; list-style-type: disc">
+ <li><a href="#extending">Extending groff families / adding new families and fonts</a>
+ <ul style="margin-left: -.5em; list-style-type: circle">
+ <li><a href="#traditional">The traditional approach</a></li>
+ <li><a href="#simpler">The simpler way with mom</a></li>
+ </ul></li>
+ <li><a href="#steps">Step-by-step instructions</a></li>
+ <li><a href="#install-font">Automate the whole process &ndash; the install-font script</a></li>
+ </ul></li>
+ <li><a href="#codenotes">Some reflections on mom</a></li>
+ <li><a href="#contact">Contact the author</a></li>
+</ul>
+</div>
+
+<div class="rule-medium"><hr/></div>
+
+<h2 id="fonts" class="docs">Adding fonts to groff</h2>
+
+<div id="small-note" class="box-tip">
+<p class="tip-top">
+<kbd>&lt;prefix&gt;</kbd>, in this section, refers
+to the directory in which groff is installed, typically
+<br/>
+<span class="pre-in-pp">
+ /usr/share/groff/
+</span>
+(for distro-specific, pre-compiled groff packages) or
+<br/>
+<span class="pre-in-pp">
+ /usr/local/share/groff/
+</span>
+(if you&#8217;ve built groff from source).
+</p>
+
+<p class="tip-bottom">
+<kbd>&lt;version&gt;</kbd> refers to the groff version number, which
+can be found, if necessary, by typing
+<br/>
+<span class="pre-in-pp">
+ groff -v
+</span>
+at the command line.
+</p>
+</div>
+
+<p>
+Groff comes with a small library of
+<a href="definitions.html#family">families</a>
+(see the
+<a href="typesetting.html#family">FAMILY</a>
+macro for a list). The families have four
+<a href="definitions.html#font">fonts</a>
+associated with them. These fonts are a combination of
+<a href="definitions.html#weight">weight</a>
+and
+<a href="definitions.html#shape">shape</a>:
+<br/>
+<span class="pre-in-pp">
+ R (Roman, usually Medium weight),
+ I (Italic, usually Medium weight),
+ B (Bold, usually Roman shape) and
+ BI (Bold Italic)
+</span>
+If you work with mom a lot, sooner or later you&#8217;ll find that these
+families and their associated fonts aren&#8217;t sufficient. You&#8217;ll
+want to supplement them, either with more fonts for the families
+already provided&mdash;<i>Damn! I need Helvetica Bold Condensed
+Italic</i>&mdash;or with entire new families.
+</p>
+
+<h3 id="extending" class="docs">Extending groff families / adding new families and fonts</h3>
+
+<h4 id="traditional" class="docs">The traditional approach</h4>
+
+<p>
+The traditional approach to extending groff families has been
+to create new families for non-default weights and shapes (e.g.
+<b>Light</b>, which is a
+<a href="definitions.html#weight">weight</a>,
+or <b>Condensed</b>, which is a
+<a href="definitions.html#shape">shape</a>),
+then to associate them with groff&#8217;s predefined <b>R,
+I, B</b> and <b>BI</b> font styles. An example of this
+can be seen in the groff PostScript font library itself, which is
+found in
+<br/>
+<span class="pre-in-pp">
+ &lt;prefix&gt;/&lt;version&gt;/font/devps/
+</span>
+There&#8217;s one &#8220;family&#8221; for Helvetica (<b>HR</b>,
+<b>HI</b>, <b>HB</b>, <b>HBI</b>) and another for Helvetica Narrow
+(<b>HNR</b>, <b>HNI</b>, <b>HNB</b>, <b>HNBI</b>).
+</p>
+
+<p>
+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 family name. For example, when
+a typesetter says &#8220;the Helvetica family&#8221;, s/he is
+including the weights Helvetica Thin, Helvetica Light, Helvetica
+Regular, Helvetica Bold, Helvetica Heavy, etc, and all their
+associated shapes (Roman, Italic, Condensed, Narrow, Extended,
+Outline, etc).
+</p>
+
+<p>
+Thus, intuitively, when a typesetter gives mom a
+<kbd>.FAMILY&nbsp;H</kbd> directive, s/he reasonably expects that
+any subsequent <kbd>.FT</kbd> directive will access the desired font
+from the Helvetica family&mdash;without the need to state explicitly
+both family and font to <kbd>.FT</kbd>, as it is explained one can
+do in the
+<a href="typesetting.html#family">FAMILY</a>
+and
+<a href="typesetting.html#font">FT</a>
+sections of these documents.
+</p>
+
+<p>
+If one had, say, Helvetica Light Roman and Helvetica Light Italic
+as well as Helvetica Light Condensed Roman and Helvetica Light
+Condensed Italic, the established groff approach would require two
+&#8220;partial&#8221; families, <b>HL</b> (for Helvetica Light)
+and <b>HLCD</b> (for Helvetica Light Condensed), with <b>R</b> and
+<b>I</b> fonts for both:
+<br/>
+<span class="pre-in-pp">
+ HLR
+ HLI
+ HLCDR
+ HLCDI
+</span>
+Accessing these family/font combos routinely
+throughout a document would then require changing the family
+(with <kbd>.FAMILY</kbd>) and selecting the desired font
+(with <kbd>.FT&nbsp;R</kbd> or <kbd>.FT&nbsp;I</kbd>), or
+passing <kbd>.FT</kbd> the lengthy family+fontname (.e.g.
+<kbd>.FT&nbsp;HLCDI</kbd>).
+</p>
+
+<h4 id="simpler" class="docs">The simpler way with mom</h4>
+
+<p>
+Fortunately, groff provides a mechanism whereby it&#8217;s possible
+to extend the basic <b>R</b>, <b>I</b>, <b>B</b>, and <b>BI</b> fonts
+(&#8220;styles&#8221; in groff-speak) so that one can, in fact,
+create extensive type families, and access all the fonts in them
+with <kbd>.ft</kbd> (groff) or <kbd>.FT</kbd> (mom).
+</p>
+
+<p>
+Mom uses this mechanism to offer, in addition to groff&#8217;s
+default font styles, the following:
+</p>
+
+<div class="examples-container" style="padding-bottom: 1em;">
+<div id="style-extensions" style="width: 50%; float: left;">
+<span class="pre" style="font-size: 85%">
+UL = Ultra Light
+ULI = Ultra Light Italic
+ULCD = Ultra Light Condensed
+ULCDI = Ultra Light Condensed Italic
+ULEX = Ultra Light Extended
+ULEXI = Ultra Light Extended Italic
+
+XL = Extra Light
+XLI = Extra Light Italic
+XLCD = Extra Light Condensed
+XLCDI = Extra Light Condensed Italic
+XLEX = Extra Light Extended
+XLEXI = Extra Light Extended Italic
+
+TH = Thin
+THI = Thin Italic
+THCD = Thin Condensed
+THCDI = Thin Condensed Italic
+THEX = Thin Extended
+THEXI = Thin Extended Italic
+
+L = Light Roman
+LI = Light Italic
+LCD = Light Condensed
+LCDI = Light Condensed Italic
+LEX = Light Extended
+LEXI = Light Extended Italic
+
+BK = Book Roman
+BKI = Book Italic
+BKCD = Book Condensed
+BKCDI = Book Condensed Italic
+BKEX = Book Extended
+BKEXI = Book Extended Italic
+
+CD = Medium Condensed
+CDI = Medium Condensed Italic
+EX = Medium Extended
+EXI = Medium Extended Italic
+
+DB = DemiBold Roman
+DBI = DemiBold Italic
+DBCD = DemiBold Condensed
+DBCDI = DemiBold Condensed Italic
+DBEX = DemiBold Extended
+DBEXI = DemiBold Extended Italic
+
+SB = SemiBold Roman
+SBI = SemiBold Italic
+SBCD = SemiBold Condensed
+SBCDI = SemiBold Condensed Italic
+SBEX = SemiBold Extended
+SBEXI = SemiBold Extended Italic
+</span>
+</div>
+<span class="pre" style="font-size: 85%">
+BCD = Bold Condensed
+BCDI = Bold Condensed Italic
+BEX = Bold Extended
+BEXI = Bold Extended Italic
+BO = Bold Outline
+
+XB = Extra Bold
+XBI = Extra Bold Italic
+XBCD = Extra Bold Condensed
+XBCDI = Extra Bold Condensed Italic
+XBEX = Extra Bold Extended
+XBEXI = Extra Bold Extended Italic
+
+UB = Ultra Bold
+UBI = Ultra Bold Italic
+UBCD = Ultra Bold Condensed
+UBCDI = Ultra Bold Condensed Italic
+UBEX = Ultra Bold Extended
+UBEXI = Ultra Bold Extended Italic
+
+HV = Heavy
+HVI = Heavy Italic
+HVCD = Heavy Condensed
+HVCDI = Heavy Condensed Italic
+HVEX = Heavy Extended
+HVEXI = Heavy Extended Italic
+
+BL = Black
+BLI = Black Italic
+BLCD = Black Condensed
+BLCDI = Black Condensed Italic
+BLEX = Black Extended
+BLEXI = Black Extended Italic
+BLO = Black Outline
+
+XBL = Extra Black
+XBLI = Extra Black Italic
+XBLCD = Extra Black
+XBLCDI = Extra Black
+XBLEX = Extra Black Italic
+XBLEXI = Extra Black Italic
+
+UBL = Ultra Black
+UBLI = Ultra Black Italic
+UBLCD = Ultra Black Condensed
+UBLCDI = Ultra Black Condensed Italic
+UBLEX = Ultra Black Extended
+UBLEXI = Ultra Black Extended Italic
+
+SC = Small Caps Roman
+SCI = Small Caps Italic
+SCDB = Small Caps Demibold
+SCDBI = Small Caps Demibold Italic
+SCSB = Small Caps Semibold
+SCSBI = Small Caps Semibold Italic
+</span>
+</div>
+
+<p style="clear: both;">
+Thus, with mom, if you&#8217;ve installed some extra
+Helvetica fonts and named them according to the convention
+<kbd>&lt;F&gt;&lt;S&gt;</kbd> (where <kbd>&lt;F&gt;</kbd> means
+family and <kbd>&lt;S&gt;</kbd> means font style), once having
+entered
+<br/>
+<span class="pre-in-pp" style="margin-bottom: -1em;">
+ .FAMILY H
+</span>
+you can access any of the extra Helvetica fonts simply by passing
+the correct argument to
+<a href="typesetting.html#font">FT</a>
+from the list, above. For example, if you were working in Medium
+Roman (<kbd>.FT&nbsp;R</kbd>) and you needed Medium Condensed Italic
+for a while (assuming it&#8217;s installed), you&#8217;d just type
+<br/>
+<span class="pre-in-pp" style="margin-bottom: -1em;">
+ .FT CDI
+</span>
+to access the Medium Condensed Italic font from the Helvetica
+family.
+</p>
+
+<p>
+Mom&#8217;s list of font styles doesn&#8217;t pretend to be
+exhaustive. The extension names are arbitrary and can be used in a
+flexible manner. For example, if you create a family that has a
+Demibold font (<b>DB</b>) but no Bold font (<b>B</b>), you might
+find it more convenient to give the Demibold font the extension
+&#8220;<b>B</b>&#8221;.
+</p>
+
+<p id="register-style">
+You may, at needs, want to add to mom&#8217;s list of font styles.
+You can do this by editing the file, om.tmac (typical location:
+<kbd>&lt;prefix&gt;/&lt;version&gt;/tmac/om.tmac</kbd>). Near the
+top, you&#8217;ll see lines of the form
+<br/>
+<span class="pre-in-pp">
+ .sty \n[.fp] XL \" Extra Light
+ .sty \n[.fp] L \" Light Roman
+ .sty \n[.fp] LI \" Light Italic
+ .sty \n[.fp] LCD \" Light Condensed Roman
+</span>
+Simply add your new font style by imitating what you see, above,
+and plugging in your new font style (having, of course,
+added the font to groff, correctly named); see
+<a href="#steps">Step-by-step instructions</a>).
+</p>
+
+<p>
+For example, if you already have some fonts from the Univers family
+installed and have called the family <b>Univers</b>, you might decide at
+some point to add the Bold Outline font (<b>UniversBO</b>). In which
+case, you&#8217;d add
+<br/>
+<span class="pre-in-pp">
+ .sty \n[.fp] BO \" Bold Outline
+</span>
+to the <kbd>.sty&nbsp;\n[.fp]&nbsp; &lt;font style&gt;</kbd> list
+in om.tmac.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Mom&#8217;s font extensions are not &#8220;user-space&#8221;
+controllable via a macro. If you&#8217;ve been using groff for
+a long time, and have already rolled your own solution to adding
+families and fonts to groff, you may find that mom&#8217;s font
+extensions conflict with your own scheme. Should that be the case,
+comment out the <kbd>.sty&nbsp;\n[.fp] &lt;font style&gt;</kbd>
+lines found near the top of the <kbd>om.tmac</kbd> file.
+</p>
+</div>
+
+<div class="box-important">
+<p class="tip">
+<span class="important">Important:</span>
+Be careful that any styles you add do not conflict with
+<i>family</i> names that already exist. &#8220;<b>C</b>&#8221;,
+for example, conflicts with the Courier family (<b>CR</b>,
+<b>CI</b>, <b>CB</b>, <b>CI</b>). Were you to create a font
+style &#8220;<b>C</b>&#8221;, thinking that <kbd>.FT&nbsp;C</kbd>
+would give you access to font style once you&#8217;d given a
+<kbd>.FAMILY</kbd> directive, you&#8217;d get a nasty surprise:
+your type would come out in Courier Roman!
+</p>
+</div>
+
+<div class="rule-medium"><hr/></div>
+
+<h2 id="steps" class="docs">Step-by-step instructions</h2>
+
+<div>
+<ul class="no-enumerator" style="margin-left: -1.5em;">
+ <li><a href="#need">What you need before you start</a></li>
+ <li><a href="#preparation">Initial preparation</a></li>
+ <li><a href="#step-1">1. Acquire the font</a></li>
+ <li><a href="#step-2">2. Prepare to convert the font to the correct format</a>
+ <ul style="margin-left: -.5em">
+ <li><a href="#ttf">TTF fonts</a></li>
+ <li><a href="#type1">Type 1 fonts</a></li>
+ </ul></li>
+ <li><a href="#step-3">3. Convert the font and put it in the right place</a></li>
+ <li><a href="#step-4">4. Update the download file</a>
+ <ul style="margin-left: -.5em">
+ <li><a href="#internal">Get the internal font name</a></li>
+ <li><a href="#add">Add the font to the download file</a></li>
+ <li><a href="#gropdf-download">Updating the gropdf download file</a></li>
+ </ul></li>
+ <li><a href="#groff-font-names">Naming groff fonts</a></li>
+ <li><a href="#install-font">Automate the whole process &ndash; the install-font script</a>
+ </li>
+</ul>
+</div>
+
+
+<p>
+There are a number of ways to approach making fonts available
+to groff. These instructions aren&#8217;t meant to cover all
+possibilities, merely one.
+</p>
+
+<p>
+GNU/Linux distributions being what they are, directory locations
+may differ and the presence of some executable can&#8217;t be
+guaranteed. I run a Debian-based system. The instructions reflect
+that. Users of other distros may have to interpret them according
+to the way their distro operates.
+</p>
+
+<h3 id="need" class="docs appendices">What you need before you start</h3>
+
+<ul style="margin-top: 1em; margin-left: -.5em;">
+ <li>groff, version 1.18 or higher<br/>
+ (Debian package: groff)
+ </li>
+ <li>ghostscript<br/>
+ (Debian package: ghostscript or ghostscript-x)
+ </li>
+ <li>fontforge<br/>
+ (Debian package: fontforge)
+ </li>
+</ul>
+
+<h3 id="preparation" class="docs appendices">Initial preparation (you only need do this once)</h3>
+
+<ol id="site-font" style="margin-left: -1em;">
+ <li>
+ Locate the groff directory,
+ <kbd class="nobr">site-font</kbd>. The exact location is
+ difficult to predict, owing to differences between distros and
+ whether you&#8217;re using a pre-packaged groff or have built
+ it from source. Some typical locations are:
+ <br/>
+ <span class="pre-in-pp" style="margin-bottom: -2em;">
+ /usr/share/groff/
+ /usr/local/share/groff/
+ /etc/groff/
+ </span>
+ If you can&#8217;t find the site-font directory, locate
+ groff&#8217;s <kbd class="nobr">site-tmac</kbd> directory, and, as root,
+ create site-font in the same directory. Eg, if you find
+ site-tmac in <kbd class="nobr">/usr/share/groff/</kbd>, create site-font in
+ <kbd class="nobr">/usr/share/groff/</kbd>
+ <br/>
+ <span class="pre-in-pp" style="margin-bottom: -2em;">
+ sudo mkdir site-font
+ </span>
+ </li>
+ <li>
+ Create two files, generate-t42.pe and generate-pfa.pe,
+ as you see them below. Place them in a convenient and
+ easily-remembered location, like your home directory.
+ <br/>
+ <span class="examples" style="font-size: 95%; display: block; margin-top: .5em;">generate-t42.pe</span>
+
+ <div class="examples-container" style="margin-top: 0; margin-bottom: -1em; padding-bottom: 1em;">
+<span class="pre">
+# generate-t42.pe
+
+Open($1);
+Generate($fontname + ".pfa");
+Generate($fontname + ".t42");
+</span>
+ </div>
+ <br/>
+ <span class="examples" style="font-size: 95%; display: block; margin-top: .5em;">generate-pfa.pe</span>
+ <div class="examples-container" style="margin-top: 0; padding-bottom: 1em;">
+<span class="pre">
+# generate-pfa.pe
+
+Open($1);
+Generate($fontname + ".pfa");
+</span>
+ </div>
+ </li>
+</ol>
+
+<h3 id="step-1" class="docs appendices">Step 1: Acquire the font</h3>
+
+<p class="top">
+The two most commonly available types of fonts are PostScript Type1
+(extension .pfb) and TrueType (extension .ttf). Either can be made
+available to groff. There are many websites holding collections of
+both.
+</p>
+
+<h3 id="step-2" class="docs appendices">Step 2: Prepare to convert the font to the correct format</h3>
+
+<p class="top">
+Change into the directory holding the new font.
+</p>
+
+<p>
+For convenience in the next step, make a symbolic link to
+the file 'textmap':
+<br/>
+<span class="pre-in-pp">
+ ln -s &lt;prefix&gt;/&lt;version&gt;/font/devps/generate/textmap .
+</span>
+See
+<a href="#small-note">here</a>
+for an explanation of <kbd>&lt;prefix&gt;</kbd>
+and <kbd>&lt;version&gt;</kbd>.
+</p>
+
+<p>
+In addition, unless you&#8217;re installing fonts from your home
+directory, make links to the files 'generate-t42.pe' and
+'generate-pfa.pe'.
+<br/>
+<span class="pre-in-pp">
+ ln -s $HOME/generate-t42.pe .
+ ln -s $HOME/generate-pfa.pe .
+</span>
+</p>
+
+<h3 id="step-3" class="docs appendices">Step 3: Convert the font and put it in the right place</h3>
+
+<p class="top">
+TrueType fonts (.ttf) need to be converted to .t42. Type 1 fonts
+(.pfa, .pfb) need to be converted to .pfa.
+</p>
+
+<h4 id="ttf" class="docs" style="font-size: 90%; text-transform: uppercase;">&nbsp;&bull;&nbsp;Converting TTF Fonts</h4>
+
+<p class="top" style="margin-top: .5em;">
+For .ttf fonts, run
+<br/>
+<span class="pre-in-pp">
+ fontforge -script generate-t42.pe &lt;file&gt;.ttf
+</span>
+This will create three new files with the extensions .t42, .pfa, and
+.afm. Next, run
+<br/>
+<span class="pre-in-pp">
+ afmtodit &lt;afm file&gt; textmap &lt;groff font&gt;
+</span>
+This will create a groff font with the name you give. (See
+<a href="#groff-font-names">here</a>
+for advice on naming groff fonts.)
+</p>
+
+<p>
+Move the .t42 and groff font files to
+<kbd class="nobr">&lt;prefix&gt;/site-font/devps/</kbd>.
+</p>
+
+<p>
+If you&#8217;re running a recent version of groff that includes
+the native pdf device (gropdf), move the .pfa file to <kbd
+class="nobr">&lt;prefix&gt;/site-font/devpdf/</kbd>. If not, you
+may safely remove it. You may also safely remove the .afm file.
+</p>
+
+<h4 id="type1" class="docs" style="font-size: 90%; text-transform: uppercase;">&nbsp;&bull;&nbsp;Converting Type1 Fonts</h4>
+
+<p class="top" style="margin-top: .5em;">
+For .pfb fonts, run
+<br/>
+<span class="pre-in-pp">
+ fontforge -script generate-pfa.pe &lt;file&gt;.pfb
+</span>
+This will create two new files with the extensions .pfa, and .afm.
+Next, run
+<br/>
+<span class="pre-in-pp">
+ afmtodit &lt;afm file&gt; textmap &lt;groff font&gt;
+</span>
+Move the .pfa and groff font files to
+<kbd class="nobr">&lt;prefix&gt;/&lt;site-font&gt;/devps/</kbd>.
+(See
+<a href="#groff-font-names">here</a>
+for advice on naming groff fonts.)
+</p>
+
+<p>
+If you&#8217;re running a recent version of groff that includes the
+native pdf device (gropdf), link the .pfa and groff font files, now
+in <kbd class="nobr">&lt;prefix&gt;/&lt;site-font&gt;/devps/</kbd>,
+to the <kbd class="nobr">&lt;prefix&gt;/site-font/devpdf</kbd>
+directory.
+</p>
+
+<p>
+Start by changing into the
+<kbd class="nobr">&lt;prefix&gt;/site-font/devpdf/</kbd>
+directory, then:
+<br/>
+<span class="pre-in-pp">
+ ln -s &lt;prefix&gt;/&lt;site-font&gt;/devps/&lt;file&gt;.pfa .
+ ln -s &lt;prefix&gt;/&lt;site-font&gt;/devps/&lt;groff font&gt; .
+</span>
+You may safely remove the .afm file.
+</p>
+
+<h3 id="step-4" class="docs appendices">Step 4: Update the download file</h3>
+
+<h4 id="internal" class="docs" style="font-size: 90%; text-transform: uppercase;">&nbsp;&bull;&nbsp;Get the internal font name</h4>
+
+<p class="top" style="margin-top: .5em;">
+Inspect your new groff font file. Near the top, you will see a line
+of the form
+<br/>
+<span class="pre-in-pp">
+ internalname &lt;name&gt;
+</span>
+Usually, the internal name is helpfully descriptive, e.g.
+<br/>
+<span class="pre-in-pp">
+ internalname Optima-Bold
+</span>
+Make a note of the internal name.
+</p>
+
+<h4 id="add" class="docs" style="font-size: 90%; text-transform: uppercase;">&nbsp;&bull;&nbsp;Add the font to the download file</h4>
+
+<p class="top" style="margin-top: .5em;">
+If a file called &#8216;download&#8217; is not already present in
+<kbd class="nobr">&lt;prefix&gt;/site-font/devps/</kbd>,
+copy over the one found in
+<kbd class="nobr">&lt;prefix&gt;/&lt;version&gt;/font/devps/</kbd>.
+</p>
+
+<p>
+The download file maps the internal names used by groff to the
+actual fonts. To add your new font to the download file, append a
+line containing the internal name, followed by a tab (make sure your
+text editor is inserting the tab character, not spaces), followed by
+the .t42 or .pfa font to which the internal name refers.
+</p>
+
+<p>
+For example, if the internal name is Optima-Bold and the font is a
+.pfa file called Optima-Bold.pfa, your updated download file will
+contain
+<br/>
+<span class="pre-in-pp">
+ Optima-Bold&lt;tab&gt;Optima-Bold.pfa
+</span>
+</p>
+
+<h4 id="gropdf-download" class="docs" style="font-size: 90%; text-transform: uppercase;">&nbsp;&bull;&nbsp;Updating the gropdf download file</h4>
+
+<p class="top" style="margin-top: .5em;">
+If you&#8217;re running a recent version of groff that includes
+the native pdf device (gropdf), you must update the
+<kbd class="nobr">&lt;prefix&gt;/site-font/devpdf/download</kbd>
+file as well. If it does not exist, create it.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Start with a blank &#8216;download&#8217; file. Do not copy
+over the &#8216;download&#8217; file from
+<kbd class="nobr">&lt;prefix&gt;/&lt;version&gt;/font/devpdf/</kbd>.
+</p>
+</div>
+
+<p>
+The instructions for registering fonts in the
+<kbd class="nobr">&lt;prefix&gt;/site-font/devpdf/</kbd> download
+file are identical to those for PostScript fonts (see above), but
+with one important difference: the lines must all begin with a tab
+character. Thus, using our Optima example, your
+<kbd class="nobr">&lt;prefix&gt;/site-font/devpdf/download</kbd>
+file download line for the same font is
+<br/>
+<span class="pre-in-pp">
+ &lt;tab&gt;Optima-Bold&lt;tab&gt;Optima-Bold.pfa
+</span>
+</p>
+
+<h3 id="groff-font-names" class="docs appendices">Naming groff fonts</h3>
+
+<p class="top">
+For convenience when using mom, and to keep your font collection
+organized, choose meaningful groff font names following the scheme
+&lt;Family&gt;&lt;FONT&gt;, where Family is something
+like Optima or Univers or Clarendon, and FONT is either
+<br/>
+<span style="display: block; margin-left: 2em;">
+<kbd>R&nbsp;&nbsp;</kbd>(roman/regular)
+<br/>
+<kbd>I&nbsp;&nbsp;</kbd>(italic)
+<br/>
+<kbd>B&nbsp;&nbsp;</kbd>(bold)
+<br/>
+<kbd>BI&nbsp;</kbd>(bold italic)
+</span>
+or one of the 1&ndash;5 character fontstyles listed
+<a href="#style-extensions">here</a>.
+Thus, for the fonts Optima Light Italic and Optima Extra Black, your font names would be
+<br/>
+<span class="pre-in-pp">
+ OptimaLI
+ OptimaXBL
+</span>
+This scheme allows you to enter <kbd>.FAMILY&nbsp;Optima</kbd> to make
+Optima the current family, and <kbd>.FT&nbsp;LI</kbd> or <kbd>.FT&nbsp;XBL</kbd>
+when you need the fonts Light Italic or Extra Black.
+</p>
+
+<p>
+Groff font names are, in fact, arbitrary; you can call your fonts
+anything you like, provided the
+<a href="#internal">internal name</a>
+in the
+<a href="#add">download file</a>
+matches the internal name found in the groff font file. When
+calling a font that does not follow the recommended naming convention,
+you must pass the full font name to <kbd>.FT</kbd> whenever you wish
+to use it.
+</p>
+
+<p>
+For example, the font, Goudy Stout, isn&#8217;t really part of the
+Goudy family, and while "stout" describes it, Stout is not a
+recognized font style. Therefore, its groff name could simply be
+GoudyStout, and whenever you needed it, you could call it with
+<kbd>.FT&nbsp;GoudyStout</kbd>.
+</p>
+
+<h3 id="install-font" class="docs appendices">Automate the whole process &ndash; the install-font script</h3>
+
+<p>
+A bash script to make the entire process of installing fonts a
+painless no-brainer has been posted online at
+<a href="https://www.schaffter.ca/mom/bin/install-font.sh">https://www.schaffter.ca/mom/bin/install-font.sh</a>.
+Be sure to make the script executable
+(<kbd class="nobr">chmod 755 install-font</kbd>)
+after you download it, then type <kbd>./install-font.sh -H</kbd> for
+usage.
+</p>
+
+<div class="rule-medium" style="margin-top: 2em;"><hr/></div>
+
+<!-- ===================================================================== -->
+
+<h2 id="codenotes" class="docs">Some reflections on mom</h2>
+
+<p>
+If, as Eric Raymond asserts, open source begins with a programmer
+scratching a personal itch, then mom can truly be called open
+source.
+</p>
+
+<p>
+Mom 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&#8217;t adequately covered by ms, me, mm, and
+friends. Typically, I&#8217;d use the library to cobble together
+macro sets for new challenges as they came my way.
+</p>
+
+<p>
+As a writer living in a perpetual state of penury, all the computers
+I&#8217;ve ever owned have been hand-me-downs&mdash;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 rather than the offering from Redmond
+is that it has helped enormously to get the most out of my poor
+little boxes.
+</p>
+
+<p>
+In Linux-land (all Unix variants, in fact), the choice of
+typesetting systems basically comes down to groff or TeX. Both are
+wonderful&mdash;monumental achievements if you ask me&mdash;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. Back in the
+Jurassic Period, I ran it successfully on a 386 with 8 megs of RAM
+and a 250 meg hard disk.
+</p>
+
+<p>
+However, groff has always had a liability: it&#8217;s incredibly geeky.
+Owing to its very long history, it&mdash;and its power users
+&mdash;seem to have remained stuck in a time warp. The canonical macro packages
+still look as they did back in those decades when memory was exorbitantly
+expensive and every byte mattered.
+</p>
+
+<p>
+For some time now, groff users and macro writers have had the option
+to use &#8220;long&#8221; names for macros (i.e. longer than two
+letters, the original limit), yet have mostly chosen not to. With
+long names, it&#8217;s possible to create macro sets that are
+humanly readable and easy to interpret, encouraging development and
+evolution. What&#8217;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.
+</p>
+
+<p>
+Mom&#8217;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. The function of nearly every macro, number register and
+string can be inferred simply from 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&#8217;s macros should be able to do so with a
+minimum of head scratching.
+</p>
+
+<div class="rule-medium"><hr/></div>
+
+<!-- ===================================================================== -->
+
+<h2 id="contact" class="docs">Contact the author</h2>
+
+<p>
+If you have any questions or comments about mom, suggestions to
+make, criticisms to offer, or bugs to report, use the groff mailing
+list (subscription information available
+<a href="http://www.gnu.org/software/groff/groff.html">here</a>)
+or contact me, Peter Schaffter, directly at the following
+address:
+<br/>
+<span class="pre-in-pp">
+ &#112;&#101;&#116;&#101;&#114;&#64;&#115;&#99;&#104;&#97;&#102;&#102;&#116;&#101;&#114;&#46;&#99;&#97;
+</span>
+Please include the word &#8220;mom&#8221; or &#8220;groff&#8221; in
+the Subject line of any message sent to my personal address or you
+risk the wrath of my implacable spam filters.
+</p>
+
+<p>
+If you want to visit mom&#8217;s website, you&#8217;ll find a link
+to it at
+<br/>
+<span class="pre-in-pp">
+ https://www.schaffter.ca
+</span>
+The site contains links to some of my fiction, all of which was
+typeset with mom and groff.
+</p>
+
+<div class="rule-long"><hr/></div>
+
+<!-- Navigation links -->
+<table style="width: 100%; margin-top: 12px;">
+<tr>
+ <td style="width: 33%;"><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="width: 100%; text-align: right;"><a href="#top">Top</a></td>
+</tr>
+</table>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/momdoc/color.html b/contrib/mom/momdoc/color.html
new file mode 100644
index 0000000..f53b5c0
--- /dev/null
+++ b/contrib/mom/momdoc/color.html
@@ -0,0 +1,505 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>Mom -- Colour</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div id="top" class="page">
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+<tr>
+ <td><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="text-align: right;"><a href="graphical.html#top">Next: Graphical objects</a></td>
+</tr>
+</table>
+
+<h1 class="docs">Coloured text</h1>
+
+<div style="text-align: center;">
+<a href="#index-color">List of color macros</a>
+</div>
+
+<div class="rule-medium"><hr/></div>
+
+<h2 class="docs">Introduction</h2>
+
+<p>
+Mom&#8217;s support for coloured text is straightforward. You begin
+by telling mom about the colours you want with
+<a href="#newcolor">NEWCOLOR</a>
+or
+<a href="#xcolor">XCOLOR</a>.
+Afterwards, any time you want text to be coloured, you either colour
+it with an
+<a href="definitions.html#inlines">inline escape</a>
+that contains the colour name (e.g. <kbd><span class="nobr">\*[red]</span></kbd>
+or <kbd><span class="nobr">\*[blue]</span></kbd>) or invoke the macro
+<a href="#color">COLOR</a>
+with the name of the colour you want.
+</p>
+
+<p id="color-example">
+For example, say you want to have the name &#8220;Jack&#8221; in the
+sentence &#8220;All work and no play makes Jack a dull boy&#8221;
+appear in yellow. You&#8217;d begin by telling mom about the colour,
+yellow. There are two ways of doing this; see
+<a href="#newcolor">NEWCOLOR</a>
+and
+<a href="#xcolor">XCOLOR</a>
+for a full explanation of the difference between the two.
+</p>
+
+<p>
+If you use XCOLOR, you&#8217;d enter this:
+<br/>
+<span class="pre-in-pp">
+ .XCOLOR yellow
+</span>
+If you use NEWCOLOR, you might enter:
+<br/>
+<span class="pre-in-pp">
+ .NEWCOLOR yellow RGB #FFFF00
+</span>
+</p>
+
+<p id="color-example2" style="margin-top: -1em;">
+After defining or initializing the colour yellow you&#8217;d
+colourise the name, Jack, either with an inline escape
+<br/>
+<span class="pre-in-pp">
+ All work and no play makes \*[yellow]Jack\*[black] a dull boy.
+</span>
+or with the
+<a href="#color">COLOR</a>
+macro
+<br/>
+<span class="pre-in-pp">
+ All work and no play makes
+ .COLOR yellow
+ Jack
+ .COLOR black
+ a dull boy.
+</span>
+Notice, in both examples, that a) you have to set the colour back
+to black after &#8220;Jack,&#8221; and b) you don&#8217;t have to
+define or initialize the colour, black. Mom predefines it for you.
+</p>
+
+<p>
+For information on using colour during
+<a href="docprocessing.html#intro-macros-docprocessing">document processing</a>,
+see
+<a href="docprocessing.html#color">Colour support in document processing</a>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Mom&#8217;s colour support is for text only. She doesn&#8217;t
+support &#8220;fill&#8221; (or &#8220;background&#8221;) colour for
+solid, enclosed graphical objects (polygons, ellipses) drawn with
+groff&#8217;s <kbd>\D</kbd>
+<a href="definitions.html#inlines">inline escapes</a>,
+although you may give a colour as one of the arguments to
+mom&#8217;s &#8220;box&#8221; and &#8220;circle&#8221; macros,
+<a href="graphical.html#dbx">DBX</a>
+and
+<a href="graphical.html#dcl">DCL</a>
+when the first argument to these macros is <kbd>SOLID</kbd>.
+</p>
+</div>
+
+<div class="box-tip">
+<p class="tip">
+<span class="experts">Experts:</span>
+If you&#8217;re accustomed to using groff&#8217;s
+<kbd>.defcolor</kbd> to define colours, and groff&#8217;s inline
+<kbd>\m[&lt;colorname&gt;]</kbd> to call them, you may continue to
+do so without confusing mom.
+</p>
+</div>
+
+<div class="macro-list-container">
+<h3 id="index-color" class="macro-list">Coloured text macros</h3>
+
+<ul class="macro-list">
+ <li><a href="#newcolor">NEWCOLOR</a></li>
+ <li><a href="#xcolor">XCOLOR</a></li>
+ <li><a href="#color">COLOR</a></li>
+ <li><a href="#color-inline">\*[&lt;colourname&gt;]</a> (inline escape)</li>
+</ul>
+</div>
+
+<div class="rule-medium" style="margin-bottom: 1.5em;"><hr/></div>
+
+<!-- -NEWCOLOR- -->
+
+<div class="macro-id-overline">
+<h3 id="newcolor" class="macro-id">Creating (initializing) a colour with NEWCOLOR</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>NEWCOLOR</b> <kbd class="macro-args">&lt;colour name&gt; [&lt;colour scheme&gt;] &lt;colour components&gt;</kbd>
+</div>
+
+<p>
+NEWCOLOR lets you create a colour, rather like an artist mixing
+paint on a palette. The colour isn&#8217;t used immediately;
+NEWCOLOR merely tells mom how to mix the colour when you need it.
+If you haven&#8217;t invoked <kbd>.NEWCOLOR</kbd> (or
+<kbd><a href="#xcolor">.XCOLOR</a></kbd>),
+mom doesn&#8217;t have a clue what you mean when you reference a
+colour (with
+<a href="#color">COLOR</a>
+or
+<a href="#color-inline"><kbd><span class="nobr">\*[&lt;colour name&gt;]</span></kbd></a>).
+</p>
+
+<p>
+The first argument to NEWCOLOR is a name for your colour. It
+can be anything you like&mdash;provided it&#8217;s just one word
+long&mdash;and can be caps, lower case, or any combination of the
+two.
+</p>
+
+<p>
+The second argument, which is entirely optional, is the
+&#8220;colour scheme&#8221; you want mom to use when mixing the
+colour. Valid arguments are
+<br/>
+<span class="pre-in-pp">
+ RGB (3 components: red green blue)
+ CYM (3 components: cyan yellow magenta)
+ CMYK (4 components: cyan magenta yellow black)
+ GRAY (1 component)
+</span>
+If you omit the second argument, mom assumes you
+want RGB.
+</p>
+
+<p>
+The final argument is the components of your colour. This can be
+hexadecimal string starting with a pound sign (<kbd>#</kbd>) (for
+colour values in the 0-255 range) or two pound signs (<kbd>##</kbd>)
+(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
+<a href="#color-tip">Tips for newbies</a>.)
+</p>
+
+<p>
+Thus, to tell mom about a colour named &#8220;YELLOW&#8221;, you
+could enter one of the following:
+<br/>
+<span class="pre-in-pp">
+ .NEWCOLOR YELLOW #FFFF00 \"or ##FFFFFFFF0000 or "1 1 0"
+ .NEWCOLOR YELLOW RGB #FFFF00 \"or ##FFFFFFFF0000 or "1 1 0"
+ .NEWCOLOR YELLOW CMY #0000FF \"or ##0000FFFF0000 or "0 0 1"
+ .NEWCOLOR YELLOW CMYK #0000FF00 \"or ##00000000FFFF0000 or "0 0 1 0"
+</span>
+After you&#8217;ve told mom about a colour, you can then get her to
+set text in that colour either with the
+<a href="definitions.html#inlines">inline escape</a>,
+<a href="#color-inline"><kbd><span class="nobr">\*[&lt;colourname&gt;]</span></kbd></a>,
+or the macro
+<a href="#color">COLOR</a>.
+(See the
+<a href="#color-example">example</a>,
+above.)
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span>
+The colourname you give to NEWCOLOR may be used with groff&#8217;s
+<kbd>\m[&lt;colourname&gt;]</kbd> inline escape (the <kbd>\m</kbd>
+escape is used to set text and rule colours). Thus, assuming
+a colourname &#8220;blueblack&#8221; set with NEWCOLOR,
+<kbd><span class="nobr">\*[blueblack]</span></kbd> and <kbd>\m[blueblack]</kbd>
+are equivalent. Furthermore, the colourname can be given as an
+argument to <b>groff</b>&#8217;s
+<a href="definitions.html#primitives">primitive</a>
+request, <kbd>.gcolor</kbd> (which does the same thing as
+<kbd>\m[&lt;colourname&gt;]</kbd>).
+</p>
+
+<p class="tip-bottom">
+Equally, the colourname may be used with
+<kbd>\M[&lt;colourname&gt;]</kbd> and <kbd>.fcolor</kbd>, which set
+the &#8220;fill&#8221; colour for solid graphical objects.
+</p>
+</div>
+
+<div class="box-tip">
+<p id="color-tip" class="tip-top">
+<span class="tip">Tips for newbies:</span>
+Colour manipulation can be tremendously confusing if you don&#8217;t
+have a background in graphic arts or computing. My advice, if colour
+intimidates you, is to stick to using mom&#8217;s default RGB colour
+scheme, and to fire up a colour 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&#8217;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&#8217;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 &#8220;Display format&#8221; and select
+&#8220;8 bit truncated rgb&#8221;.
+</p>
+
+<p class="tip-bottom">
+Alternatively, you can use mom&#8217;s simpler
+<kbd><a href="#xcolor">XCOLOR</a></kbd>
+macro to initialize one of the 256 pre-defined X colours by
+supplying the name of the colour as an argument.
+</p>
+</div>
+
+<!-- -XCOLOR- -->
+
+<div class="macro-id-overline">
+<h3 id="xcolor" class="macro-id">Initializing a colour with XCOLOR</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>XCOLOR</b> <kbd class="macro-args">&lt;X colourname&gt; [&lt;alias&gt;]</kbd>
+</div>
+
+<p class="requires">
+<kbd style="font-style: normal">&lt;X colourname&gt;</kbd> <i>must be all one word, all lower case.</i>
+<br/>
+(See
+<a href="#xcolor-names" style="font-style: normal;">Finding X colour names</a>
+for how to get a list of valid colour names.)
+</p>
+
+<p>
+XCOLOR is similar to NEWCOLOR in that it tells mom to initialize a
+colour, but it&#8217;s easier to use. All you have to do is pass
+it, as an argument, the valid 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.
+</p>
+
+<p>
+For example, if you want to initialize the X colour, coral, all you
+have to do is enter
+<br/>
+<span class="pre-in-pp">
+ .XCOLOR coral
+</span>
+Afterwards
+<br/>
+<span class="pre-in-pp">
+ .COLOR coral
+</span>
+
+will colourise subsequent text coral until you instruct mom to
+return to black, or some other pre-defined, initialized colour.
+(The
+<a href="definitions.html#inlines">inline escape</a>
+<kbd><span class="nobr">\*[coral]</span></kbd> will equally colourise text coral
+after you&#8217;ve initialized the colour with XCOLOR.)
+</p>
+
+<p>
+The downside of XCOLOR is that you can&#8217;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.
+</p>
+
+<p>
+While some X colours have fanciful names (peachpuff, papayawhip,
+thistle, snow), many are self-explanatory and self-descriptive
+in ordinary colour terms. &#8220;blue&#8221; is pure (rgb)
+blue, &#8220;green&#8221; is pure (rgb) green, and so on.
+Furthermore, for many X colours, there exist four variants, each
+representing increasingly darker shades of the same colour.
+For example, &#8220;blue1&#8221; is a relatively bright blue;
+&#8220;blue2&#8221;, &#8220;blue3&#8221; and &#8220;blue4&#8221; are
+increasingly darker shades. For that reason, you may find XCOLOR is
+a better choice than NEWCOLOR when it comes to initializing common
+colours.
+</p>
+
+<p>
+The whimsical nature of X colour names sometimes makes for names
+that are long to type in, e.g. &#8220;mediumspringgreen&#8221;. 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
+<br/>
+<span class="pre-in-pp">
+ .XCOLOR mediumspringgreen mygreen
+</span>
+or
+<span class="pre-in-pp">
+ .XCOLOR mediumspringgreen MYGREEN
+</span>
+so that whenever you want text mediumspringgreen-ed, you can use
+either <kbd>.COLOR&nbsp;mygreen</kbd> (or <kbd>.COLOR&nbsp;MYGREEN</kbd>)
+or the inline escape
+<kbd>\*[mygreen]</kbd> (or <kbd>\*[MYGREEN]</kbd>.)
+</p>
+
+<h3 id="xcolor-names" class="docs">Finding X colour names</h3>
+
+<p>
+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&#8217;t show you what the
+colours actually look like.
+</p>
+
+<p>
+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.
+</p>
+
+<p>
+Whichever method you use to find X colour names, remember that the
+names, passed as arguments to XCOLOR, must be all one word, all in
+lower case.
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span>
+Both the colourname and the alias you give to XCOLOR may be
+used with groff&#8217;s <kbd>\m[&lt;colourname&gt;]</kbd>
+inline escape (the <kbd>\m</kbd> escape is used to set
+text and rule colours). Thus, assuming an X-colourname
+&#8220;mediumspringgreen&#8221; set with
+XCOLOR, and an alias, &#8220;mygreen&#8221;,
+<kbd><span class="nobr">\*[mediumspringgreen]</span></kbd>,
+<kbd><span class="nobr">\m[mediumspringgreen]</span></kbd>,
+<kbd><span class="nobr">\*[mygreen]</span></kbd> and
+<kbd><span class="nobr">\m[mygreen]</span></kbd> are all equivalent.
+Furthermore, both the colourname and the alias can be given as an
+argument to groff&#8217;s
+<a href="definitions.html#primitives">primitive</a>
+request, <kbd>.gcolor</kbd> (which does the same thing as
+<kbd><span class="nobr">\m[&lt;colourname&gt;]</span></kbd>).
+</p>
+
+<p class="tip-bottom">
+The colourname initialized with XCOLOR <i>but not the
+alias</i> may also be used with groff&#8217;s inline escape,
+<kbd>\M[&lt;colorname&gt;]</kbd>, and the corresponding primitive,
+<kbd>.fcolor</kbd>, both of which set the &#8220;fill&#8221; colour
+for solid graphical objects. If you need a colour initialized with
+XCOLOR for <kbd>\M</kbd> or <kbd>.fcolor</kbd>, you MUST give the
+full colourname; the alias won&#8217;t work.
+</p>
+</div>
+
+<!-- -COLOR- -->
+
+<div class="macro-id-overline">
+<h3 id="color" class="macro-id">Invoking a colour</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>COLOR</b> <kbd class="macro-args">&lt;colourname&gt;</kbd>
+</div>
+
+<p id="color-inline" class="requires" style="font-style: normal;">
+Inline: <kbd>\*[&lt;colourname&gt;]</kbd>
+</p>
+
+<p>
+Once you&#8217;ve told mom about a colour (via
+<a href="#newcolor">NEWCOLOR</a>
+or
+<a href="#xcolor">XCOLOR</a>,
+you use either the macro COLOR or the
+<a href="definitions.html#inlines">inline escape</a>,
+<kbd><span class="nobr">\*[&lt;colourname&gt;]</span></kbd>, to cause mom to set
+subsequent text in that colour. See the
+<a href="#color-example2">example</a>,
+above, which shows both in action.
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span>
+You can use the <kbd><span class="nobr">\*[&lt;colourname&gt;]</span></kbd>
+inline escape in any
+<a href="docprocessing.html#top">document processing</a>
+macro that takes a
+<a href="definitions.html#stringargument">string argument</a>.
+However, you must remember to reset the colour at the end of the
+argument (typically with <kbd><span class="nobr">\*[black]</span></kbd>) unless
+you want all subsequent invocations of that particular macro to be
+colourised.
+</p>
+
+<p>
+Furthermore, if you use
+<kbd><span class="nobr">\*[&lt;colourname&gt;]</span></kbd> in the string
+argument passed to
+<a href="docelement.html#heading">HEADING&nbsp;&lt;n&gt;</a>
+and you&#8217;ve requested that the heading level be numbered, the
+numbers themselves will not be colourised, only the text you pass to
+the macro. If you wish the numbers to be colourised along with the
+text, you must explicitly tell mom with
+<a href="docelement.html#heading-style">HEADING_STYLE&nbsp;&lt;n&gt;</a>.
+</p>
+
+<p class="tip-bottom">
+For colourising underscored text, see
+<a href="goodies.html#underscore-color">Colourising underscored text</a>
+in the notes at the end of
+<a href="goodies.html#underscore">UNDERSCORE</a>.
+</p>
+</div>
+
+<div class="rule-long"><hr/></div>
+
+<!-- Navigation links -->
+<table style="width: 100%; margin-top: 12px;">
+<tr>
+ <td style="width: 33%;"><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="width: 33%; text-align: center;"><a href="#top">Top</a></td>
+ <td style="width: 33%; text-align: right;"><a href="graphical.html#top">Next: Graphical objects</a></td>
+</tr>
+</table>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/momdoc/cover.html b/contrib/mom/momdoc/cover.html
new file mode 100644
index 0000000..7efee1f
--- /dev/null
+++ b/contrib/mom/momdoc/cover.html
@@ -0,0 +1,851 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>Mom -- Document processing, creating cover pages</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div id="top" class="page">
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+<tr>
+ <td><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="text-align: right;"><a href="tables-of-contents.html#top">Next: Tables of contents</a></td>
+</tr>
+</table>
+
+<h1 class="docs">Creating cover pages</h1>
+
+<div style="width: 66%; margin: auto;">
+<ul class="no-enumerator">
+ <li><a href="#cover-intro">Introduction to cover pages</a>
+ <ul style="margin-left: -.5em; list-style-type: disc;">
+ <li><a href="#important-note">Important note</a></li>
+ <li><a href="#desc">Description of cover pages</a></li>
+ <li><a href="#pagination">Headers/footers/pagination</a>
+ <ul style="margin-left: -1.25em; list-style-type: circle;">
+ <li><a href="#pagination">DOC_COVERS_COUNT_PAGES</a></li>
+ <li><a href="#pagination">COVERS_COUNT_PAGES</a></li>
+ </ul>
+ </li>
+ <li><a href="#design">Designing your own cover pages</a></li>
+ <li><a href="#persistence">Persistence of data and formatting</a></li>
+ </ul></li>
+ <li><a href="#index-covers">Doc-cover and cover macros</a>
+ <ul style="margin-left: -.5em; list-style-type: disc;">
+ <li><a href="#cover">DOC_COVER / COVER</a>
+ <ul style="margin-left: -1.25em; list-style-type: circle;">
+ <li><a href="#cover-args">The argument list: saying what goes on doc cover and cover pages</a></li>
+ <li><a href="#meanings">What the arguments mean</a></li>
+ <li><a href="#chapter">How the CHAPTER argument and friends work</a></li>
+ </ul></li>
+ <li><a href="#covertext">DOC_COVERTEXT / COVERTEXT</a>
+ <ul style="margin-left: -1.25em; list-style-type: circle;">
+ <li><a href="#placement">Placement</a></li>
+ </ul>
+ </li>
+ <li><a href="#coverimages">DOC_COVER_IMAGE / COVER_IMAGE</a>
+ <ul style="margin-left: -1.25em; list-style-type: circle;">
+ <li><a href="#positioning">Positioning of doc cover and cover images</a></li>
+ </ul>
+ </li>
+ </ul></li>
+ <li><a href="#on-off">Enabling/disabling automatic generation of cover pages</a></li>
+ <li><a href="#cover-control">Control macros for covers and doc covers</a></li>
+</ul>
+</div>
+
+<div class="rule-medium"><hr/></div>
+
+<h2 id="cover-intro" class="docs">Introduction to cover pages</h2>
+
+<p>
+Though identical in treatment, mom provides two kinds of cover
+pages: document cover pages (&#8221;doc covers&#8221;) and section
+cover pages (&#8220;covers&#8221;). Section cover pages are
+analogous to title pages.
+</p>
+
+<p>
+A doc cover is what you&#8217;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.
+</p>
+
+<p>
+A cover is what you&#8217;d use for pages that separate sections
+of a collated document, i.e. title pages. A cover page (but not a
+doc cover) in a collated document could, for example, simply read:
+&#8221;PART 1&#8221;.
+</p>
+
+<p>
+In non-collated documents (say, an essay) you can use either a cover
+or doc cover to generate the cover sheet.
+</p>
+
+<p>
+In addition, nothing prevents you from generating both a doc cover
+and a cover for every document in a collated document. Or you can
+selectively disable the automatic generation of either doc covers or
+covers in a collated document on-the-fly.
+</p>
+
+<div id="important-note" class="box-important">
+<p class="tip">
+<span class="important">Important note:</span>
+Automatic generation of covers or doc covers after the first one(s)
+only takes place if you are working with collated documents. Mom
+provides no mechanism for saying &#8221;print a section cover
+here even though I&#8217;m still working on the same (non-collated)
+document.&#8221;
+</p>
+</div>
+
+<h3 id="desc" class="docs">Description of cover pages</h3>
+
+<p>
+By default, mom typesets covers and doc covers identically to
+<a href="definitions.html#docheader">docheaders</a>
+(see
+<a href="docprocessing.html#docheader-control">How to change the look of docheaders</a>
+for a description of what a docheader looks like). The only
+differences are
+</p>
+<ul style="margin-top: -.5em; margin-bottom: -.5em;">
+ <li>the position on the page where the information is output</li>
+ <li>the (optional) addition of copyright and miscellaneous information</li>
+ <li>there&#8217;s no running text underneath, although you can add text
+ to a cover or doc cover (for example, an Abstract) with
+ <a href="#covertext">COVERTEXT</a>
+ </li>
+</ul>
+
+<p>
+You tell mom what you want to appear on cover pages through the
+arguments you pass to
+<a href="#cover">DOC_COVER</a>
+and/or
+<a href="#cover">COVER</a>.
+Provided you have already given mom the appropriate reference macros
+(e.g.
+<a href="docprocessing.html#title">TITLE</a>
+or
+<a href="docprocessing.html#author">AUTHOR</a>),
+she will output covers and doc covers identically to how she
+would output docheaders containing the same information.
+</p>
+
+<p>
+By default, mom starts covers and doc covers one-third of the way
+down the page. This can be changed through the use of the control
+macros DOC_COVER_START_POS / COVER_START_POS (or DOC_COVER_ADVANCE /
+COVER_ADVANCE).
+</p>
+
+<p>
+If you request copyright information (and have already given mom the
+reference macro
+<a href="docprocessing.html#copyright">COPYRIGHT</a>)
+she sets it, by default, in a smaller
+<a href="definitions.html#ps">point size</a>
+in the bottom right hand corner of the cover or doc cover. The
+position, as well as all of the standard typesetting parameters, can be
+altered via control macros.
+</p>
+
+<p>
+Similarly, if you request miscellaneous information (and have
+already given mom the reference macro
+<a href="docprocessing.html#misc">MISC</a>)
+she sets it, by default, in a smaller point size in the bottom left
+hand corner of the cover or doc cover. As with the copyright, the
+position and type specs can be altered via control macros.
+</p>
+
+<h3 id="pagination" class="docs">Headers/footers/pagination</h3>
+
+<p>
+Mom does not set any
+<a href="definitions.html#header">headers</a>
+or
+<a href="definitions.html#footer">footers</a>
+on cover pages. Neither does she set any page numbers. From
+the point of view of pagination, covers and doc covers are by
+default considered &#8221;null&#8221; pages. If you wish them to
+be included in the pagination scheme (even though no page numbers
+appear), you must tell mom that&#8217;s what you want by invoking
+<br/>
+<span class="pre-in-pp">
+ .DOC_COVER_COUNTS_PAGES
+</span>
+or
+<br/>
+<span class="pre-in-pp">
+ .COVER_COUNTS_PAGES
+</span>
+</p>
+
+<h3 id="design" class="docs">Designing your own cover pages</h3>
+
+<p>
+Finally, if you want to design your own cover page(s), you can
+typeset them by hand inside a
+<a href="#covertext">COVERTEXT</a>
+block using mom&#8217;s typesetting macros to format the text.
+</p>
+
+<h3 id="persistence" class="docs">Persistence of data and formatting</h3>
+
+<p>
+Doc-cover and cover data&mdash;that is to say, the strings passed to
+reference macros that appear on doc cover and cover
+pages&mdash;does not persist after
+<a href="docprocessing.html#start">START</a>,
+however the formatting of the various parts (TITLE, AUTHOR,
+COPYRIGHT, etc.) does.
+</p>
+
+<div class="macro-list-container">
+<h3 id="index-covers" class="macro-list">Cover and document cover macros</h3>
+<ul class="macro-list">
+ <li><a href="#cover">DOC_COVER and COVER</a>
+ <ul style="margin-left: -.5em; list-style-type: disc;">
+ <li><a href="#cover-args">The arguments: saying what goes on doc cover and cover pages</a></li>
+ </ul></li>
+ <li><a href="#covertext">DOC_COVERTEXT / COVERTEXT</a></li>
+ <li><a href="#doc-coverimage">DOC_COVER_IMAGE / COVER_IMAGE</a></li>
+ <li><a href="#on-off">Enabling/disabling automatic generation of cover pages</a>
+ <ul style="margin-left: -.5em; list-style-type: disc;">
+ <li><a href="#doc-covers">DOC_COVERS</a></li>
+ <li><a href="#covers">COVERS</a></li>
+ </ul></li>
+ <li><a href="#cover-control">Control macros for doc covers and covers</a></li>
+</ul>
+</div>
+
+<!-- -COVER- -->
+
+<div class="macro-id-overline">
+<h3 id="cover" class="macro-id">DOC_COVER and COVER</h3>
+</div>
+
+<div id="doc-cover" class="box-macro-args">
+Macro: <b>DOC_COVER</b> <kbd class="macro-args">(see argument list, below)</kbd>
+</div>
+
+<div class="box-macro-args" style="margin-top: 1em;">
+Macro: <b>COVER</b> <kbd class="macro-args">(see argument list, below)</kbd>
+</div>
+
+<p>
+DOC_COVER and COVER behave identically. The reason mom provides
+two macros for cover page generation is so that you can have two
+different kinds of covers with different information on each.
+</p>
+
+<p>
+Imagine, for a moment, you&#8217;ve written a document comprised of
+three sections. When you
+<a href="rectoverso.html#collate">COLLATE</a>
+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&#8217;s) name, and perhaps the copyright date. Subsequently,
+you could use COVER, after each <kbd>.COLLATE</kbd> but before each
+<kbd><a href="docprocessing.html#start">.START</a></kbd>,
+to generate a cover page (title page, cover sheet) containing
+just the name of the section, for example, &#8220;Part 1&#8221;.
+</p>
+
+<p>
+The arguments to <kbd>DOC_COVER</kbd> and <kbd>COVER</kbd> tell mom
+what you&#8217;d like on cover pages. You may give as many or as
+few arguments as you need, in any order. A very common setup would
+be:
+<br/>
+<span class="pre-in-pp">
+ .COVER TITLE AUTHOR COPYRIGHT
+</span>
+</p>
+
+<h4 id="cover-args" class="docs" style="margin-top: -1em;">The argument list</h4>
+
+<p style="margin-top: 1em">
+The arguments to <kbd>COVER</kbd> and <kbd>DOC_COVER</kbd> tell mom
+what you want on the cover page:
+<br/>
+<span class="pre-in-pp">
+ TITLE | DOCTITLE | DOC_COVERTITLE | COVERTITLE
+ CHAPTER | CHAPTER_TITLE | CHAPTER+TITLE
+ SUBTITLE
+ AUTHOR
+ DOCTYPE
+ DOC_COVERTEXT | COVERTEXT
+ DOC_COVER_IMAGE | COVER_IMAGE
+ COPYRIGHT
+ MISC
+ PDF_OUTLINE_LABEL "&lt;label&gt;"
+ BLANKPAGE
+</span>
+</p>
+
+<h4 id="meanings" class="docs" style="margin-top: -1em;">What the arguments mean</h4>
+
+<dl>
+ <dt class="params">TITLE</dt>
+ <dd class="cover-args">&ndash; the string(s) you gave to
+ <a href="docprocessing.html#title">TITLE</a>
+ </dd>
+ <dt class="params">DOCTITLE</dt>
+ <dd class="cover-args">&ndash; the string(s) you gave to
+ <a href="docprocessing.html#doc-title">DOCTITLE</a>
+ </dd>
+ <dt class="params">DOC_COVERTITLE / COVERTITLE</dt>
+ <dd class="cover-args">&ndash; the string(s) you gave to
+ <a href="docprocessing.html#doc-covertitle">DOC_COVERTITLE</a>
+ or
+ <a href="docprocessing.html#covertitle">COVERTITLE</a>
+ </dd>
+ <dt class="params">CHAPTER, CHAPTER_TITLE, CHAPTER+TITLE</dt>
+ <dd class="cover-args">&ndash; see below,
+ <a href="#chapter">How the CHAPTER argument and friends work</a>
+ </dd>
+ <dt class="params">SUBTITLE</dt>
+ <dd class="cover-args">&ndash; the string(s) you gave to
+ <a href="docprocessing.html#subtitle">SUBTITLE</a>
+ </dd>
+ <dt class="params">AUTHOR</dt>
+ <dd class="cover-args">&ndash; the string(s) you gave to
+ <a href="docprocessing.html#author">AUTHOR</a>
+ </dd>
+ <dt class="params">DOCTYPE</dt>
+ <dd class="cover-args">&ndash; the string you gave to
+ <a href="docprocessing.html#doctype">DOCTYPE NAMED</a>
+ </dd>
+ <dt class="params">DOC_COVERTEXT / COVERTEXT</dt>
+ <dd class="cover-args">&ndash; the block of type you entered for
+ <a href="#covertext">DOC_COVERTEXT</a>
+ or
+ <a href="#covertext">COVERTEXT</a>
+ </dd>
+ <dt class="params">DOC_COVER_IMAGE / COVER_IMAGE</dt>
+ <dd class="cover-args">&ndash; the image file you gave to
+ <a href="#covertext">DOC_COVER_IMAGE</a>
+ or
+ <a href="#covertext">COVER_IMAGE</a>
+ </dd>
+ <dt class="params">COPYRIGHT</dt>
+ <dd class="cover-args">&ndash; the string you gave to
+ <a href="docprocessing.html#copyright">COPYRIGHT</a>
+ </dd>
+ <dt class="params">MISC</dt>
+ <dd class="cover-args">&ndash; the string(s) you gave to
+ <a href="docprocessing.html#misc">MISC</a>
+ </dd>
+ <dt class="params">PDF_OUTLINE_LABEL &lt;label&gt;</dt>
+ <dd class="cover-args">
+ <span style="display:block; margin-left: 1em">
+ By default, mom identifies doc covers in the outline panel of PDF
+ viewers with the prepended label, &#8220;Cover:&#8221;, and covers
+ with the label &#8220;Title Page:&#8221;. If you would like
+ to change the label, give the <kbd>PDF_OUTLINE_LABEL</kbd>
+ argument to DOC_COVER or COVER along with the new label, in
+ quotation marks, as in this example:
+ <br/>
+ <kbd>&nbsp;&nbsp;.COVER TITLE AUTHOR COPYRIGHT PDF_LABEL "Cover Sheet: "</kbd>
+ </span>
+ </dd>
+ <dt class="params">BLANKPAGE</dt>
+ <dd class="cover-args">
+ <span style="display:block; margin-left: 1em">
+ If the final argument to DOC_COVER or COVER is <kbd>BLANKPAGE</kbd>,
+ mom will insert a blank page after the doc cover or cover. This is
+ particularly useful if you intend to print your document two-sided,
+ since, in two-sided printing, there may be instances where you do
+ not want text on the reverse side of cover or title pages
+ </span>
+ <span style="display:block; margin-left: 1em; margin-top: .5em">
+ If you enable
+ <a href="#pagination">DOC_COVERS_COUNT_PAGES</a>
+ and/or
+ <a href="#pagination">COVERS_COUNT_PAGES</a>,
+ the blank page will be taken into account in the pagination
+ scheme, though no page number appears on it. Otherwise, blank
+ pages are invisible to mom&#8217;s pagination.
+ </span>
+ </dd>
+</dl>
+
+<p>
+Please note that in all cases, if you have passed
+a reference macro one of the optional arguments
+<kbd>DOC_COVER</kbd> or <kbd>COVER</kbd> (e.g.
+<kbd>.TITLE&nbsp;DOC_COVER&nbsp;"Title"</kbd>), mom will print the
+appropriate string on the appropriate cover page. Thus,
+<br/>
+<span class="pre-in-pp">
+ .TITLE DOC_COVER "Collected Essays"
+ .TITLE COVER "1985-2015"
+ .TITLE "Neo-liberalism: Who Did They Think They Were Fooling?"
+ .DOC_COVER TITLE
+ .COVER TITLE
+</span>
+will print &#8220;Collected Essays&#8221; on the doc cover page,
+&#8220;1985-2015&#8221; on the cover page, and, assuming the
+docheader hasn&#8217;t been disabled, &#8220;Neo-liberalism: Who
+Did They Think They Were Fooling?&#8221; as the title in the
+docheader.
+</p>
+
+<p>
+Note that
+<br/>
+<span class="pre-in-pp">
+ .DOC_COVERTITLE "Collected Essays"
+ .COVERTITLE "1985-2015"
+ .TITLE "Neo-liberalism: Who Did They Think They Were Fooling?"
+ .DOC_COVER DOC_COVERTITLE
+ .COVER COVERTITLE
+</span>
+could be used to accomplish the same thing.
+</p>
+
+<h5 id="chapter" class="docs" style="margin-top: 0; text-transform: none;">How the CHAPTER argument and friends work</h5>
+
+<p style="margin-top: .75em">
+<span style="display: block; margin-bottom: -1.25em; font-weight: bold;">&bull;&nbsp;CHAPTER</span>
+<br/>
+The <kbd>CHAPTER</kbd> argument will print the
+<a href="docprocessing.html#chapter-string">CHAPTER_STRING</a>
+concatenated with the chapter number you gave to
+<a href="docprocessing.html#chapter">CHAPTER</a>.
+For example, assuming a vanilla setup for your chapter:
+<br/>
+<span class="pre-in-pp" style="color: #64614a;">
+ .CHAPTER 1
+ .CHAPTER_TITLE "The Bonny Blue Yonder"
+ <span style="color: #941614;">.COVER CHAPTER</span> \" (or <span style="color: #941614;">.DOC_COVER CHAPTER</span>)
+</span>
+will print (and only print)
+<br/>
+<span class="pre-in-pp">
+ Chapter 1
+</span>
+</p>
+
+<p style="margin-top: -1em;">
+<span style="display: block; margin-bottom: -1.25em; font-weight: bold;">&bull;&nbsp;CHAPTER_TITLE</span>
+<br/>
+The <kbd>CHAPTER_TITLE</kbd> argument will print the chapter title
+you gave to
+<a href="docprocessing.html#chapter-title">CHAPTER_TITLE</a>.
+For example, assuming a vanilla setup for your chapter:
+<br/>
+<span class="pre-in-pp" style="color: #64614a;">
+ .CHAPTER 1
+ .CHAPTER_TITLE "The Bonny Blue Yonder"
+ <span style="color: #941614;">.COVER CHAPTER_TITLE</span> \"(or <span style="color: #941614;">.DOC_COVER CHAPTER_TITLE</span>)
+</span>
+will print (and only print)
+<br/>
+<span class="pre-in-pp">
+ The Bonny Blue Yonder
+</span>
+</p>
+
+<p style="margin-top: -1em;">
+<span style="display: block; margin-bottom: -1.25em; font-weight: bold;">&bull;&nbsp;CHAPTER+TITLE</span>
+<br/>
+The <kbd>CHAPTER+TITLE</kbd> argument will print both the
+concatenated chapter string+number and the chapter title. For
+example, assuming a vanilla setup for your chapter:
+<br/>
+<span class="pre-in-pp" style="color: #64614a;">
+ .CHAPTER 1
+ .CHAPTER_TITLE "The Bonny Blue Yonder"
+ <span style="color: #941614;">.COVER CHAPTER+TITLE</span> \"(or <span style="color: #941614;">.DOC_COVER CHAPTER+TITLE</span>)
+</span>
+will print
+<br/>
+<span class="pre-in-pp">
+ Chapter 1
+ The Bonny Blue Yonder
+</span>
+</p>
+
+<div class="macro-id-overline">
+<h3 id="covertext" class="macro-id">DOC_COVERTEXT and COVERTEXT</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>DOC_COVERTEXT</b> <kbd class="macro-args">[START &lt;starting position&gt;] &lt;toggle&gt;</kbd>
+</div>
+<div class="box-macro-args" style="margin-top: 1em;">
+Macro: <b>COVERTEXT</b> <kbd class="macro-args">[START &lt;starting position&gt;] &lt;toggle&gt;</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Must come after
+<a href="#printstyle"><span class="normal">PRINTSTYLE</span></a>
+</p>
+
+<p>
+<kbd>DOC_COVERTEXT</kbd> and <kbd>COVERTEXT</kbd> allow you to add
+text to doc covers and covers in addition to, or instead of, what is
+generated by mom from the arguments you give to
+<a href="#doccover">DOC_COVER</a>
+and
+<a href="#doccover">COVER</a>.
+</p>
+
+<p>
+Invoke <kbd>.DOC_COVERTEXT</kbd> or <kbd>.COVERTEXT</kbd> on a line
+by itself, follow it with the text and formatting you desire, and
+terminate the text block with <kbd>.DOC_COVERTEXT&nbsp;OFF</kbd> or
+<kbd>COVERTEXT&nbsp;OFF</kbd> (or <kbd>QUIT, END, DONE</kbd>, etc.).
+</p>
+
+<p>
+By default, cover text is set over the full line length of the
+document, using the style parameters of
+<a href="definitions.html#running">running text</a>.
+Therefore, as noted, these macros must come after PRINTSTYLE
+and any global style changes (margins, family, size, leading,
+etc.). Formatting within a cover text block must be done
+&#8220;manually&#8221; with mom&#8217;s typesetting macros;
+<a href="docelement.html#pp">PP</a>
+is the only allowed document element tag.
+</p>
+
+<h4 id="placement" class="docs">Placement</h4>
+
+<p>
+If you do not instruct mom to put anything on doc cover or cover
+pages except <kbd>DOC_COVERTEXT</kbd> or <kbd>COVERTEXT</kbd>, the
+cover text will begin at the document&#8217;s top margin.
+Equally, if only <kbd>COPYRIGHT</kbd> and/or <kbd>MISC</kbd> are
+to go on the pages, cover text begins at the top margin. In all
+other cases, cover text begins below the last element on the page
+(excluding COPYRIGHT or MISC), separated by a blank line.
+</p>
+
+<p>
+If you wish to change the starting position of the text, you must
+use
+<a href="typesetting.html#space">SP</a>
+or
+<a href="typesetting.html#ald">ALD</a>
+to move it further down the page. Alternatively, you may use the
+optional START argument to give a precise location for the text to
+begin.
+</p>
+
+<p>
+<kbd>DOC_COVERTEXT</kbd> and <kbd>COVERTEXT</kbd> are particularly
+useful for putting abstracts on cover pages, as technical reports
+often require.
+</p>
+
+<p>
+Here&#8217;s a simple recipe for setting an abstract:
+<br/>
+<span class="pre-in-pp">
+ .COVERTEXT
+ .FT BI
+ .PT_SIZE 14
+ .LS 14
+ .CENTER
+ Abstract
+ .SP .5v
+ .FT R
+ .PT_SIZE 12
+ .IB 6P
+ .JUSTIFY
+ Text of Abstract...
+ .COVERTEXT OFF
+</span>
+Assuming you have told mom to put the title and author on the
+cover page, the abstract will appear beneath the author with a
+14-point bold-italic title, centered, with the text of the abstract
+medium-roman and justified, indented 6 picas from both margins.
+</p>
+
+<div class="macro-id-overline">
+<h3 id="coverimages" class="macro-id">DOC_COVER_IMAGE and COVER_IMAGE</h3>
+</div>
+
+<div id="doc-coverimage" class="box-macro-args">
+Macro: <b>DOC_COVER_IMAGE</b> <kbd class="macro-args">&lt;image&gt; &lt;width&gt; &lt;height&gt; [ -L | -C | -R | -I &lt;indent&gt; &lt;Y-pos&gt; [ &lt;X-pos&gt; ] ]</kbd>
+</div>
+
+<div id="coverimage" class="box-macro-args" style="margin-top: 1em;">
+Macro: <b>COVER_IMAGE</b> <kbd class="macro-args">&lt;image&gt; &lt;width&gt; &lt;height&gt; [ -L | -C | -R | -I &lt;indent&gt; &lt;Y-pos&gt; [ &lt;X-pos&gt; ] ]</kbd>
+</div>
+
+<p>
+There are times you need a full page image on a cover, for example
+the jacket of a book. Equally, there are times when you need a small
+image on the cover, perhaps a company logo.
+</p>
+
+<p>
+DOC_COVER_IMAGE and COVER_IMAGE take the same arguments
+as PDF_IMAGE, and in the same order. Consult
+<a href="images.html#pdf-image">PDF_IMAGE</a>
+for a description.
+</p>
+
+<p>
+Two additional arguments allow you to place images using x-y
+coordinates. Please note that if you use x-y coordinates for
+positioning, <b>Y-pos</b> comes before <b>X-pos</b> in the order of
+arguments.
+</p>
+
+<p>
+Like PDF_IMAGE, the image file must be in PDF format. Mom
+apologizes, but PostScript images are not supported for inclusion on
+covers. See
+<a href="images.html#pdf">Image conversion and file processing</a>
+for instructions on converting various image types to PDF, and
+<a href="images.html#bounding-box">here</a>
+for instructions on obtaining image dimensions.
+</p>
+
+<h4 id="positioning" class="docs">Positioning of doc cover and cover images</h4>
+
+<p>
+With no arguments other than <kbd>&lt;file name&gt;</kbd>,
+<kbd>&lt;width&gt;</kbd>, and <kbd>&lt;height&gt;</kbd>,
+DOC_COVER_IMAGE and COVER_IMAGE place images flush with the top
+left corner of the printer sheet. This allows placing full-page
+background images on covers. For example, assuming a US-letter page
+size,
+<br/>
+<span class="pre-in-pp">
+ .DOC_COVER_IMAGE image.pdf 612p 792p
+ .DOC_COVER TITLE AUTHOR DOC_COVER_IMAGE
+</span>
+will fill the doc cover page with &#8220;image.pdf&#8221; and set
+the title and author in their usual locations.
+</p>
+
+<p>
+For smaller images, the horizontal position is established
+with one of the <kbd>-L</kbd>, <kbd>-C</kbd>, <kbd>-R</kbd>, or
+<kbd>-I&nbsp;&lt;indent&gt;</kbd> arguments, just like
+<a href="images.html#pdf-image">PDF_IMAGE</a>.
+You may instead use the <kbd>X-pos</kbd> argument, provided that it
+is preceded by a <kbd>Y-pos</kbd> argument. The values given to
+<kbd>-I</kbd>, <kbd>Y-pos</kbd> and <kbd>X-pos</kbd> must have a
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+appended to them.
+</p>
+
+<p>
+Vertical positioning of smaller images requires the <kbd>Y-pos</kbd>
+argument (which is why it precedes <kbd>X-pos</kbd> in the order of
+arguments) otherwise the image will be flush with the top edge of
+the printer sheet
+</p>
+
+<p>
+The positioning of images does not effect the placement of type on
+doc cover and cover pages.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Tip:</span>
+The combination of
+<a href="#covertext">COVERTEXT</a>
+and COVER_IMAGE make it possible to design covers entirely to your
+own specifications.
+</p>
+</div>
+
+<div class="macro-id-overline" style="margin-top: .5em">
+<h3 id="on-off" class="macro-id">Enabling/disabling automatic generation of cover pages</h3>
+</div>
+
+<div id="covers" class="box-macro-args" style="margin-top: .5em">
+Macro: <b>COVERS</b> <kbd class="macro-args">&lt;toggle&gt;</kbd>
+</div>
+
+<div id="doc-covers" class="box-macro-args" style="margin-top: 1em;">
+Macro: <b>DOC_COVERS</b> <kbd class="macro-args">&lt;toggle&gt;</kbd>
+</div>
+
+<p>
+By default, if you give mom a
+<a href="#cover">COVER</a>
+or
+<a href="#doc-cover">DOC_COVER</a>
+directive, she will print the cover or doc cover. In a document
+that contains sections, articles or chapters formerly treated as
+&#8221;one-off&#8217;s&#8221; but now being
+<a href="rectoverso.html#collate-intro">collated</a>,
+such behaviour may not be desirable.
+</p>
+
+<p>
+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&#8217;re toggle macros, simply invoking them by
+themselves enables automatic cover or doc cover generation, while
+invoking them with any argument at all (<kbd>OFF, QUIT, X</kbd>,
+etc) disables cover or doc cover generation. </p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+You must place these macros prior to any instance of
+<a href="docprocessing.html#start">START</a>.
+Since they&#8217;re &#8221;on&#8221; by default, there&#8217;s no
+need to use them if you want covers. However, if you don&#8217;t,
+especially in the kind of scenario described above, the best place
+to put them (most likely with an <kbd>OFF, NO, X</kbd>, etc. argument),
+is immediately after the first invocation of START. By doing so,
+you ensure they meet the requirement of preceding all subsequent
+instances of START.
+</p>
+</div>
+
+<div class="rule-short"><hr/></div>
+
+<h2 id="cover-control" class="macro-group">Control macros for doc covers and covers</h2>
+
+<p>
+The default typographic appearance of the items on a doc cover or
+cover is identical to that of the items in a
+<a href="definitions.html#docheader">docheader</a>.
+(See
+<a href="docprocessing.html#docheader-desc">Docheader description</a>
+for a description of the defaults.)
+</p>
+
+<p>
+<a href="docprocessing.html#copyright">COPYRIGHT</a>
+and
+<a href="docprocessing.html#misc">MISC</a>,
+which do not appear in docheaders, have the following default
+characteristics:
+</p>
+<ul style="margin-top: -.5em; margin-bottom: -.5em;">
+ <li>the COPYRIGHT line is set flush with the document&#8217;s right
+ and bottom margins, 2
+ <a href="definitions.html#ps">point sizes</a>
+ smaller than the size of
+ <a href="definitions.html#running">running text</a>
+ </li>
+ <li>MISC lines are set flush with the document&#8217;s left and bottom
+ margins, in the same family, font and point size as the
+ copyright line.
+ </li>
+</ul>
+
+<p>
+The defaults for the entirety of doc covers and covers, and all the
+elements thereon, can be changed with control macros whose defaults
+and arguments are identical to the corresponding
+<a href="docprocessing.html#index-docheader-control">Control macros for docheaders</a>
+(q.v.) The only difference is the name by which you invoke them. Wherever
+<kbd>DOCHEADER</kbd> is used for overall changes, replace it
+with <kbd>DOC_COVER</kbd> or <kbd>COVER</kbd>. For part-by-part
+changes, prepend <kbd>DOC_COVER_</kbd> or <kbd>COVER_</kbd> to the
+part/parameter.
+</p>
+
+<p>
+Thus, to change the overall family, color, leading, quad, and
+starting position of a doc cover, you&#8217;d do
+<br/>
+<span class="pre-in-pp">
+ .DOC_COVER_FAMILY H
+ .DOC_COVER_COLOR blue
+ .DOC_COVER_LEAD +2
+ .DOC_COVER_QUAD L
+ .DOC_COVER_ADVANCE 3i \" or .DOC_COVER_START_POS 3i
+</span>
+To change the style parameters for selected parts of a cover, you
+might do something like this:
+<br/>
+<span class="pre-in-pp">
+ .COVER_TITLE_FONT B
+ .COVER_TITLE_SIZE +4
+ .COVER_SUBTITLE_FONT I
+ .COVER_AUTHOR_FONT R
+ .COVER_AUTHOR_SPACE_BEFORE 6p
+ .COVER_DOCTYPE_COLOR red
+ .COVER_MISC_SIZE -1
+ .COVER_MISC_LEAD 12
+ .COVER_COPYRIGHT_SIZE -2
+ .COVER_COPYRIGHT_QUAD L
+ .COVER_MISC_QUAD R
+</span>
+Note in the above example that _COPYRIGHT_QUAD and _MISC_QUAD set
+both the horizontal position on the page and the quad direction,
+either L (or LEFT) or R (or RIGHT), and have no corresponding
+docheader control macro.
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Tip:</span>
+As with the docheader control macros, <kbd>DOC_COVER_</kbd> and
+<kbd>COVER_</kbd> part/parameter style changes may be
+<a href="docprocessing.html#grouping">grouped</a>,
+for example
+<br/>
+<span class="pre-in-pp">
+ .DOC_COVER_TITLE_STYLE \
+ FAMILY A \
+ FONT B \
+ SIZE +4 \
+ CAPS
+</span>
+</p>
+</div>
+
+<!-- Navigation links -->
+<table style="width: 100%; margin-top: 12px;">
+<tr>
+ <td style="width: 33%;"><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="width: 33%; text-align: center;"><a href="#top">Top</a></td>
+ <td style="width: 33%; text-align: right;"><a href="tables-of-contents.html">Next: Tables of contents</a></td>
+</tr>
+</table>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/momdoc/definitions.html b/contrib/mom/momdoc/definitions.html
new file mode 100644
index 0000000..b85a089
--- /dev/null
+++ b/contrib/mom/momdoc/definitions.html
@@ -0,0 +1,995 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>Mom -- Definitions and Terms</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div id="top" class="page">
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+ <tr>
+ <td><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="text-align: right;"><a href="using.html#top">Next: Using mom</a></td>
+ </tr>
+</table>
+
+<h1 id="terms" class="docs">Definitions of terms used in this manual</h1>
+
+<p>
+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&#8217;ll explain
+them here. Refer back to this section should you encounter a word
+or concept you&#8217;re not familiar with.
+</p>
+
+<div class="rule-short" style="margin-top: 18px; margin-bottom: 28px;"><hr/></div>
+
+<div class="col-1-definitions">
+ <table class="definitions">
+ <tr><th class="definitions">Typesetting terms</th></tr>
+ <tr>
+ <td>
+ <a href="#ascender">Ascender</a><br/>
+ <a href="#baseline">Baseline</a><br/>
+ <a href="#ballotbox">Ballot box</a><br/>
+ <a href="#bullet">Bullet</a><br/>
+ <a href="#capheight">Cap-height</a><br/>
+ <a href="#descender">Descender</a><br/>
+ <a href="#discretionaryhyphen">Discretionary hyphen</a><br/>
+ <a href="#dropcap">Drop cap</a><br/>
+ <a href="#em">Em/en</a><br/>
+ <a href="#family">Family</a><br/>
+ <a href="#figurespace">Figure space/Digit space</a><br/>
+ <a href="#fixedwidthfont">Fixed width font</a><br/>
+ <a href="#fixedwidthspace">Fixed width space</a><br/>
+ <a href="#font">Font</a><br/>
+ <a href="#force">Force justify</a><br/>
+ <a href="#just">Justify/justification</a><br/>
+ <a href="#gutter">Gutter</a><br/>
+ <a href="#kern">Kerning</a><br/>
+ <a href="#kernunit">Kern Units</a><br/>
+ <a href="#leading">Lead/leading</a><br/>
+ <a href="#leader">Leaders</a><br/>
+ <a href="#ligatures">Ligature</a><br/>
+ <a href="#picaspoints">Picas/Points</a><br/>
+ <a href="#ps">Point Size</a><br/>
+ <a href="#quad">Quad</a><br/>
+ <a href="#rag">Rag</a><br/>
+ <a href="#shape">Shape</a><br/>
+ <a href="#solid">Solid/set solid</a><br/>
+ <a href="#trackkerning">Track kerning/Line kerning</a><br/>
+ <a href="#unbreakablespace">Unbreakable space</a><br/>
+ <a href="#weight">Weight</a><br/>
+ <a href="#wordspace">Word space</a><br/>
+ <a href="#xheight">x-height</a><br/>
+ </td>
+ </tr>
+ </table>
+</div>
+
+<div class="col-2-definitions">
+ <table class="definitions">
+ <tr><th class="definitions">Groff terms</th></tr>
+ <tr>
+ <td>
+ <a href="#alias">Alias</a><br/>
+ <a href="#arguments">Arguments</a><br/>
+ <a href="#commentlines">Comment lines</a><br/>
+ <a href="#controllines">Control Lines</a><br/>
+ <a href="#filled">Filled lines</a><br/>
+ <a href="#inlines">Inline escapes</a><br/>
+ <a href="#inputline">Input line</a><br/>
+ <a href="#macros">Macros</a><br/>
+ <a href="#units">Machine units</a><br/>
+ <a href="#numericargument">Numeric argument</a><br/>
+ <a href="#outputline">Output line</a><br/>
+ <a href="#primitives">Primitives</a><br/>
+ <a href="#preprocessor">Pre-processor</a><br/>
+ <a href="#stringargument">String Argument</a><br/>
+ <a href="#unitofmeasure">Unit of measure</a><br/>
+ <a href="#zerowidthcharacter">Zero-width character</a><br/>
+ </td>
+ </tr>
+ </table>
+</div>
+
+<div class="col-3-definitions">
+ <table class="definitions">
+ <tr><th class="definitions">Mom terms</th></tr>
+ <tr>
+ <td>
+ <a href="#baseline-grid">Baseline grid</a><br/>
+ <a href="#blockquote">Blockquote</a><br/>
+ <a href="#controlmacro">Control macro</a><br/>
+ <a href="#docheader">Docheader</a><br/>
+ <a href="#epigraph">Epigraph</a><br/>
+ <a href="#float">Float</a><br/>
+ <a href="#footer">Footer</a><br/>
+ <a href="#head">Head</a><br/>
+ <a href="#header">Header</a><br/>
+ <a href="#linebreak">Linebreak</a><br/>
+ <a href="#parahead">Paragraph head</a><br/>
+ <a href="#pdflink">PDF link</a><br/>
+ <a href="#pdfoutline">PDF outline</a><br/>
+ <a href="#quote">Quote</a><br/>
+ <a href="#running">Running text</a><br/>
+ <a href="#toggle">Toggle</a><br/>
+ </td>
+ </tr>
+ </table>
+</div>
+
+<h3 id="typesetting-terms" class="docs">Typesetting terms</h3>
+<dl>
+ <dt id="ascender">Ascender</dt>
+ <dd>
+ 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.
+ </dd>
+
+ <dt id="baseline">Baseline</dt>
+ <dd>
+ The imaginary line on which the bottoms of capital letters and
+ the bowls of lower case letters rest.
+ </dd>
+
+ <dt id="ballotbox">Ballot box</dt>
+ <dd>
+ An unfilled square, usually
+ <a href="#capheight">cap-height</a>
+ in size, typically placed beside items in a checklist.
+ </dd>
+
+ <dt id="bullet">Bullet</dt>
+ <dd>
+ A small, filled circle typically found beside items or points in
+ a list.
+ </dd>
+
+ <dt id="capheight">Cap-height</dt>
+ <dd>
+ The height of the tallest capital letter in a given
+ <a href="#font">font</a>
+ at the current
+ <a href="#ps">point size</a>.
+ </dd>
+
+ <dt id="descender">Descender</dt>
+ <dd>
+ The portion of a letter that extends beneath the
+ <a href="#baseline">baseline</a>
+ (j, q, y are letters with descenders).
+ </dd>
+
+ <dt id="discretionaryhyphen">Discretionary hyphen</dt>
+ <dd>
+ A symbol inserted between two syllables of a word that indicates
+ to a typesetting program the valid 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&#8217;t always get it right.
+ Discretionary hyphens make sure it does. In the event that the
+ word doesn&#8217;t need to be hyphenated at all, groff leaves them
+ alone. In groff, the discretionary hyphen is entered with
+ <kbd>\%</kbd> (i.e. a backslash followed by the percent sign).
+ </dd>
+
+ <dt id="dropcap">Drop cap</dt>
+ <dd>
+ 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 &#8220;drops&#8221; 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.
+ </dd>
+
+ <dt id="em">Em/en</dt>
+ <dd>
+ An em is a relative measurement equal to the width of the
+ letter M at a given
+ <a href="#ps">point size</a>
+ in a given
+ <a href="#font">font</a>.
+ 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).
+ </dd>
+
+ <dt id="family">Family</dt>
+ <dd>
+ The collective name by which a collection of
+ <a href="#font">fonts</a>
+ are known, e.g. Helvetica, Times Roman, Garamond.
+ </dd>
+
+ <dt id="figurespace">Figure space/Digit space</dt>
+ <dd>
+ A
+ <a href="#fixedwidthspace">fixed width space</a>
+ 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 <kbd>\0</kbd> (i.e. a backslash followed by a zero)
+ </dd>
+
+ <dt id="fixedwidthfont">Fixed-width font</dt>
+ <dd>
+ A family or font in which every character occupies exactly the
+ same amount of horizontal space on the line. Courier is the
+ best-known, if not the most elegant, fixed-width font.
+ </dd>
+
+ <dt id="fixedwidthspace">Fixed width space</dt>
+ <dd>
+ Equal to
+ <a href="#wordspace">word space</a>,
+ but does not expand or contract when text is
+ <a href="#just">justified</a>.
+ In groff, fixed width space is entered with
+ <kbd>\&lt;space&gt;</kbd> (i.e. a backslash followed by a space)
+ </dd>
+
+ <dt id="font">Font</dt>
+ <dd>
+ The specific
+ <a href="#weight">weight</a>
+ and
+ <a href="#shape">shape</a>
+ of type within a
+ <a href="#family">family</a>,
+ 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).
+ Mom considerably extends this very basic list.
+ </dd>
+
+ <dt id="force">Force justify</dt>
+ <dd>
+ Sometimes, in
+ <a href="#just">justified</a>
+ 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&#8217;s word spacing stretched to force the line flush with the
+ right margin.
+ </dd>
+
+ <dt id="gutter">Gutter</dt>
+ <dd>
+ The vertical whitespace separating columns of type.
+ </dd>
+
+ <dt id="just">Justify/justification</dt>
+ <dd>
+ Lines of type are justified when they&#8217;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&#8217;t. See
+ <a href="#quad">quad</a>.
+ </dd>
+
+ <dt id="kern">Kerning</dt>
+ <dd>
+ 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&#8217;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&#8217;re far from perfect. Professional typesetters still
+ devote a lot of time to fitting letters and punctuation together
+ properly.
+ </dd>
+
+ <dt id="kernunit">Kern Units</dt>
+ <dd>
+ A relative distance, which, by default, is equal to 1/36 of the
+ current
+ <a href="#ps">point size</a>.
+ Used between individual letters for
+ <a href="#kern">kerning</a>.
+ Different typesetting systems use different values (1/54 is
+ popular), and sometimes call kern units by a different name.
+ It is possible to change the default size of the kern unit with the
+ <a href="inlines.html#kernunit">KERN_UNIT</a>
+ macro.
+ </dd>
+
+ <dt id="leading">Lead/leading</dt>
+ <dd>
+ The distance from the
+ <a href="#baseline">baseline</a>
+ of one line of type to the line of type immediately beneath
+ it. Pronounced "ledding." Also called line spacing. Usually
+ measured in
+ <a href="#picaspoints">points</a>.
+
+ <p>
+ <em>In case you&#8217;re interested...</em> In previous centuries,
+ lines of type were separated by thin strips of&mdash;you guessed
+ it&mdash;lead. Lines of type that had no lead between them were said
+ to be &#8220;set solid.&#8221; Once you began separating them with
+ strips of lead, they were said to be &#8220;leaded&#8221;, and the
+ spacing was expressed in terms of the number of
+ <a href="#picaspoints">points</a>
+ of lead. For this reason, &#8220;leading&#8221; and &#8220;line
+ spacing&#8221; aren&#8217;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.
+ </p>
+
+ </dd>
+
+ <dt id="leader">Leaders</dt>
+ <dd>
+ Single characters used to fill lines, usually to their end. So
+ called because they &#8220;lead&#8221; the eye from one element
+ of the page to another. For example, in the following (brief)
+ Table of Contents, the periods (dots) are leaders.
+
+ <span class="pre" style="margin-bottom: -2em;">
+ Foreword............... 2
+ Chapter 1.............. 5
+ Chapter 2.............. 38
+ Chapter 3.............. 60
+ </span>
+ </dd>
+
+ <dt id="ligatures">Ligature</dt>
+ <dd>
+ 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.
+ </dd>
+
+ <dt id="picaspoints">Picas/Points</dt>
+ <dd>
+ 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.
+ </dd>
+
+ <dt id="ps">Point Size</dt>
+ <dd>
+ The nominal size of type, measured in
+ <a href="#picaspoints">points</a>
+ from the bottom of the longest
+ <a href="#descender">descender</a>
+ to the top of the highest
+ <a href="#ascender">ascender</a>.
+ In reality, type is always fractionally smaller than its point
+ size.
+ </dd>
+
+ <dt id="quad">Quad</dt>
+ <dd>
+ 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&#8217;t. Quad right
+ means the right margin is flush, the left isn&#8217;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.
+ </dd>
+
+ <dt id="rag">Rag</dt>
+ <dd>
+ Describes a margin that isn&#8217;t flush. Rag right means the right
+ margin isn&#8217;t flush. Rag left means the left margin isn&#8217;t flush.
+ The expression "flush left/rag right" is sometimes used to
+ describe type that is
+ <a href="#quad">quadded</a>
+ left.
+ </dd>
+
+ <dt id="shape">Shape</dt>
+ <dd>
+ 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.)
+
+ <p>
+ Some typical shapes are:
+ </p>
+
+ <ul style="margin-top: -.5em; margin-bottom: -.5em">
+ <li>Roman, which has no slant, and has letterforms of
+ average width</li>
+ <li>Italic, which is slanted, and has letterforms
+ of average width</li>
+ <li>Condensed, which has no slant, but has
+ letterforms narrower than the average represented by Roman</li>
+ <li>Condensed Italic, which is slanted, with letterforms narrower
+ than average</li>
+ </ul>
+
+ <p>
+ The term
+ <a href="#font">font</a>,
+ as it is used in these documents, refers to a combination of
+ <a href="#weight">weight</a>
+ and shape.
+ </p>
+
+ </dd>
+
+ <dt id="solid">Solid/set solid</dt>
+ <dd>
+ When no
+ <a href="#leading">lead</a>
+ is added between lines of type (i.e., the
+ <a href="#ps">point size</a>
+ and linespacing are the same), the lines are said to be &#8220;set
+ solid.&#8221;
+ </dd>
+
+ <dt id="trackkerning">Track kerning/Line kerning</dt>
+ <dd>
+ Sometimes, it&#8217;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.
+ </dd>
+
+ <dt id="unbreakablespace">Unbreakable space</dt>
+ <dd>
+ Equal to
+ <a href="#wordspace">word space</a>,
+ 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 <kbd>\~</kbd> (i.e. a backslash followed by a
+ tilde)
+ </dd>
+
+ <dt id="weight">Weight</dt>
+ <dd>
+ 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
+ headings and the like.
+ </dd>
+
+ <dt id="wordspace">Word space</dt>
+ <dd>
+ The amount of whitespace between words. When text is
+ <a href="#just">justified</a>,
+ word space expands or contracts to make the margins flush.
+ </dd>
+
+ <dt id="xheight">x-height</dt>
+ <dd>
+ 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.
+ </dd>
+</dl>
+
+<h3 id="groff-terms" class="docs">Groff terms</h3>
+
+<dl>
+ <dt id="alias">Alias</dt>
+ <dd>
+ A
+ <a href="#macros">macro</a>
+ invoked by a name different from its &#8220;official&#8221;
+ name. For example, the official name of the macro to change
+ <a href="#family">family</a>
+ is <kbd>FAMILY</kbd>. Its alias is <kbd>FAM</kbd>.
+ Aliases may be created for any macro (via the
+ <a href="goodies.html#alias"><kbd>ALIAS</kbd></a>
+ macro) provided the alias uses a name not already taken by the
+ mom macros or one of the groff
+ <a href="#primitives">primitives</a>.
+ For a complete list of words or names you must not use, see the
+ <a href="reserved.html#reserved">list of reserved words</a>.
+ </dd>
+
+ <dt id="arguments">Arguments</dt>
+ <dd>
+ Parameters or information needed by a
+ <a href="#macros">macro</a>
+ to do its job. For example, in the macro
+
+ <span class="pre" style="margin-bottom: -2em;">
+ .PT_SIZE 12
+ </span>
+
+ <kbd>12</kbd> is the argument. In the macro
+
+ <span class="pre" style="margin-bottom: -2em;">
+ .QUAD LEFT
+ </span>
+
+ <kbd>LEFT</kbd> is the argument. Arguments are separated from
+ macros by spaces. Some macros require several arguments; each
+ is separated by a space.
+ </dd>
+
+ <dt id="commentlines">Comment Lines</dt>
+ <dd>
+ <a href="#inputline">Input lines</a>
+ introduced with the comment character <kbd>\#</kbd> (i.e. a
+ backslash followed by the pound sign). When processing output,
+ groff silently ignores everything on a line that begins with the
+ comment character.
+ </dd>
+
+ <dt id="controllines">Control Lines</dt>
+ <dd>
+ Instructions to groff that appear on a line by themselves, which
+ means that &#8220;control lines&#8221; are either
+ <a href="#macros">macros</a>
+ or groff
+ <a href="#primitives">primitives</a>.
+ Control lines begin with a period or, occasionally, an apostrophe.
+ </dd>
+
+ <dt id="filled">Filled lines/fill mode</dt>
+ <dd>
+ Automatic
+ <a href="#just">justification</a>
+ or
+ <a href="#quad">quadding</a>.
+ In fill mode, the ends of lines as they appear in your text
+ editor are ignored. Instead, words from adjoining
+ <a href="#inputline">input lines</a>
+ are added one at a time to the output line until no more words
+ fit. Then, depending whether text is to be
+ <a href="#just">justified</a>
+ or
+ <a href="#quad">quadded</a>
+ (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).
+
+ <p id="no-fill">
+ Nofill mode (non-filled text) means that groff respects the ends
+ of lines exactly as they appear in your text editor.
+ </p>
+
+ </dd>
+
+ <dt id="inlines">Inline escapes</dt>
+ <dd>
+ Instructions issued to groff that appear as part of an
+ <a href="#inputline">input line</a>
+ (as opposed to
+ <a href="#macros">macros</a>,
+ which must appear on a line by themselves). Inline escapes are
+ always introduced by the backslash character. For example,
+
+ <span class="pre" style="margin-bottom: -2em;">
+ A line of text with the word T\*[BU 2]oronto in it
+ </span>
+
+ contains the inline escape <kbd>\*[BU 2]</kbd> (which means
+ &#8220;move the letter &#8216;o&#8217; 2
+ <a href="#kernunit">kern units</a>
+ closer to the letter &#8216;T&#8217;&#8221;).
+
+ <p style="margin-bottom: -2em;">
+ Mom&#8217;s inline escapes always take the form
+ <kbd>\*[&lt;ESCAPE&gt;]</kbd>, where <kbd>ESCAPE</kbd> is
+ composed of capital letters, sometimes followed immediately by a
+ digit, sometimes followed by a space and a
+ <a href="#numericargument">numeric argument</a>.
+ Groff&#8217;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
+
+ <span class="pre" style="margin-bottom: -2em;">
+ \*[FP6]&nbsp;&nbsp;or&nbsp;&nbsp;\*[FWD 6p]
+ </span>
+
+ while the groff escape for the same thing is
+
+ <span class="pre" style="margin-bottom: -2em;">
+ \h&#8217;6p&#8217;
+ </span>
+ </p>
+
+ </dd>
+
+ <dt id="inputline" style="margin-top: -1em;">Input line</dt>
+ <dd>
+ A line of text as it appears in your text editor.
+ </dd>
+
+ <dt id="macros">Macros</dt>
+ <dd>
+ Instructions embedded in a document that determine how groff
+ processes the text for output. mom&#8217;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&mdash;behind the scenes&mdash;via
+ groff
+ <a href="#primitives">primitives</a>.
+ </dd>
+
+ <dt id="units">Machine units</dt>
+ <dd>
+ A machine unit is 1/1000 of a
+ <a href="#picaspoints">point</a>
+ when the groff device is ps. (&#8220;ps&#8221; means
+ &#8220;PostScript&#8221;&mdash;the default device for
+ which groff prepares output, and the device for which
+ mom was originally designed.)
+ </dd>
+
+ <dt id="numericargument">Numeric argument</dt>
+ <dd>
+ An
+ <a href="#arguments">argument</a>
+ 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
+ <a href="#unitofmeasure">unit of measure</a>,
+ a unit of measure must be appended to <em>every</em> digit in
+ the argument. For example:
+
+ <span class="pre" style="margin-bottom: -2em;">
+ .ALD 1i-1v
+ </span>
+
+ <div class="box-important" style="margin-right: 2.5em;">
+ <p class="tip">
+ <span class="important">IMPORTANT:</span> 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&#8217;s macros is slim.
+ </p>
+ </div>
+ </dd>
+
+ <dt id="outputline">Output line</dt>
+ <dd>
+ A line of text as it appears in output copy.
+ </dd>
+
+ <dt id="preprocessor">Pre-processor</dt>
+ <dd>
+ Pre-processors are used by groff to generate tables
+ (<strong>tbl</strong>), diagrams (<strong>pic</strong>), graphs
+ (<strong>grap</strong>), and equations (<strong>eqn</strong>).
+ These pre-processors are fully supported by mom. In addition,
+ the &#8220;refer&#8221; pre-processor is used to generate
+ bibliographies and lists of cited works. The PDF_IMAGE macro,
+ which allows insertion of graphics into a document, is not
+ strictly a pre-processor but behaves similarly to tbl, pic, and
+ eqn.
+ </dd>
+
+ <dt id="primitives">Primitives</dt>
+ <dd>
+ The lowercase instructions, introduced with a period, that groff
+ uses as its native command language, and out of which macros
+ are built. The majority of groff&#8217;s primitive requests are two
+ letters long.
+ </dd>
+
+ <dt id="stringargument">String Argument</dt>
+ <dd>
+ Technically, any
+ <a href="#arguments">argument</a>
+ that is not numeric. In this documentation, string argument
+ means an argument that requires the user to input text. For
+ example, in the
+ <a href="#macros">macro</a>
+
+ <span class="pre" style="margin-bottom: -2em;">
+ .TITLE "My Pulitzer Novel"
+ </span>
+
+ <kbd>"My Pulitzer Novel"</kbd> is a string argument.
+
+ <p>
+ Because string arguments must be enclosed by double-quotes, you
+ can&#8217;t use double-quotes as part of the string argument. If you
+ need double-quotes to be part of a string argument, use the
+ <a href="#inlines">inline escapes</a>
+ <kbd>\(lq</kbd> and <kbd>\(rq</kbd> (leftquote and
+ rightquote respectively) in place of the double-quote character
+ (<kbd>"</kbd>).
+ </p>
+
+ </dd>
+
+ <dt id="unitofmeasure">Unit of measure</dt>
+ <dd>
+ The single letter after a
+ <a href="#numericargument">numeric argument</a>
+ that tells mom what measurement scale the
+ argument should use. Common valid units are:
+
+ <span class="pre" style="margin-bottom: -2em;">
+ i (inches)
+ p (points)
+ P (Picas)
+ c (centimetres)
+ m (ems)
+ n (ens)
+ u (machine units)
+ v (the current leading [line space])
+ </span>
+
+ <p style="margin-top: -1em;">
+ 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:
+
+ <span class="pre" style="margin-bottom: -2em;">
+ .ALD 2v
+ .LL 39P
+ .IL 1i
+ </span>
+
+ The above example advances 2 line spaces and sets the line
+ length to 39 picas with a left indent of 1 inch.
+ </p>
+
+ <div class="box-important" style="margin-right: 2.5em;">
+ <p class="tip">
+ <span class="important">IMPORTANT:</span>
+ Most mom macros that set the size or measure of something must
+ be given a unit of measure since most of the macros do not have
+ default units of measure. There are a couple of exceptions,
+ the most notable of which are <kbd>PT_SIZE</kbd> and
+ <kbd class="bold">LS</kbd>. Both use
+ <a href="#picaspoints">points</a>
+ as the default unit of measure, which means you don&#8217;t have to
+ append &#8220;p&#8221; to their argument.
+ </p>
+ </div>
+
+ <p>
+ 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).
+ </p>
+
+ <div class="box-tip" style="margin-right: 2.5em;">
+ <p class="tip">
+ <span class="note">Note:</span>
+ 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.
+ </p>
+ </div>
+
+ </dd>
+
+ <dt id="zerowidthcharacter">Zero-width character</dt>
+ <dd>
+ The
+ <a href="#inlines">inline escape</a>
+ that allows you to print a literal period, apostrophe and, if
+ <a href="#outputline">output lines</a>
+ are
+ <a href="#filled">filled</a>,
+ a space that falls at the beginning of an
+ <a href="#inputline">input line</a>.
+ It looks like this:
+
+ <span class="pre" style="margin-bottom: -2em;">
+ \&amp; <span style="font-family: arial, sans-serif; font-weight: normal">(i.e. a backslash followed by an ampersand)</span>
+ </span>
+
+ Normally, groff interprets a period (or an apostrophe) at the
+ beginning of an input line as meaning that what follows is a
+ <a href="#controllines">control line</a>.
+ In fill modes, groff treats a space at the beginning of an input
+ line as meaning &#8220;start a new line and put a space at the
+ beginning of it.&#8221; If you want groff to interpret periods
+ and apostrophes at the beginning of input lines literally (i.e.
+ to 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.
+ </dd>
+</dl>
+
+<h3 id="mom-terms" class="docs">Mom terms</h3>
+<dl>
+ <dt id="baseline-grid">Baseline grid</dt>
+ <dd>
+ Virtual guide lines spaced according to the
+ <a href="#leading">leading</a>
+ established for running text. Adherence to the grid ensures that
+ text fills the page completely to the bottom margin. Uncorrected
+ deviations from the grid result in bottom margins that fall short.
+ </dd>
+
+ <dt id="controlmacro">Control macro</dt>
+ <dd>
+ Macros used in
+ <a href="docprocessing.html#docprocessing">document processing</a>
+ to control/alter the appearance of document elements (e.g.
+ headings, quotes, footnotes,
+ <a href="#header">headers</a>,
+ etc.).
+ </dd>
+
+ <dt id="docheader">Document header/docheader</dt>
+ <dd>
+ Document information (title, subtitle, author, etc) output at
+ the top of page one.
+ </dd>
+
+ <dt id="epigraph">Epigraph</dt>
+ <dd>
+ A short, usually cited passage that appears at the beginning of
+ a chapter, story, or other document.
+ </dd>
+
+ <dt id="float">Float</dt>
+ <dd>
+ A float is material intended to be kept together as a block.
+ Floated material that fits on a page in position is output on that
+ page. Floats that do not fit in position are deferred to the top
+ of the next page.
+ </dd>
+
+ <dt id="footer">Footer/page footer</dt>
+ <dd>
+ 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
+ <a href="#running">running text</a>.
+ </dd>
+
+ <dt id="head">Heading</dt>
+ <dd>
+ The title used to identify a section of a document. Headings
+ are hierarchic, corresponding to the notion of head, subhead,
+ subsubhead, etc.
+ </dd>
+
+ <dt id="header">Header/page header</dt>
+ <dd>
+ Document information (frequently author and title) output in the
+ top margin of pages after page one.
+
+ <div class="box-tip" style="margin-right: 2.5em;">
+ <p class="tip">
+ <span class="note">Note:</span> In terms of content and style,
+ headers and
+ <a href="#footer">footers</a>
+ 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.
+ </p>
+ </div>
+
+ </dd>
+
+ <dt id="linebreak">Linebreak/author linebreak</dt>
+ <dd>
+ A gap in the vertical flow of
+ <a href="#running">running text</a>,
+ 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.
+ </dd>
+
+ <dt id="parahead">Paragraph head</dt>
+ <dd>
+ A heading joined to the body of a paragraph.
+ </dd>
+
+ <dt id="pdflink">PDF link</dt>
+ <dd>
+ A portion of text that, when clicked on in a PDF viewer,
+ navigates to a bookmarked location in a document, generally but not
+ exclusively a heading. PDF links are usually coloured to make
+ them stand out from the surrounding text.
+ </dd>
+
+ <dt id="pdfoutline">PDF outline</dt>
+ <dd>
+ The hierarchically-arranged navigation outline provided by most PDF
+ viewers (e.g. Okular, Evince), typically in a panel to the left of
+ the document window, and usually labelled &#8220;Contents&#8221;.
+ </dd>
+
+ <dt id="quote">Quote</dt>
+ <dd>
+ 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&#8217;t have to use
+ <a href="typesetting.html#br"><kbd>BR</kbd></a>
+ with quotes.
+ </dd>
+
+ <dt id="running">Running text</dt>
+ <dd>
+ In a document formatted with mom, running
+ text means text that forms the body of the document, including
+ elements such as headings.
+ <a href="#docheader">Docheaders</a>,
+ <a href="#header">headers</a>,
+ <a href="#footer">footers</a>
+ and page numbers are not part of running text.
+ </dd>
+
+ <dt id="toggle">Toggle</dt>
+ <dd>
+ 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
+ <a href="intro.html#toggle-example">Example 3</a>
+ of the section
+ <a href="intro.html#macro-args">How to read macro arguments</a>.
+ </dd>
+</dl>
+
+<div class="rule-long"><hr/></div>
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+ <tr>
+ <td style="width: 33%;"><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="width: 33%; text-align: center;"><a href="#top">Top</a></td>
+ <td style="width: 33%; text-align: right;"><a href="using.html#top">Next: Using mom</a></td>
+</tr>
+</table>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/momdoc/docelement.html b/contrib/mom/momdoc/docelement.html
new file mode 100644
index 0000000..43f79d4
--- /dev/null
+++ b/contrib/mom/momdoc/docelement.html
@@ -0,0 +1,6639 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>Mom -- Document processing, element tags</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div id="top" class="page">
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+<tr>
+ <td><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="text-align: right;"><a href="images.html#top">Next: Graphics, floats, preprocessor support</a></td>
+</tr>
+</table>
+
+<h1 class="docs">The document element tags</h1>
+
+<div style="width: 460px; margin: auto;">
+<ul class="no-enumerator">
+ <li><a href="#docelement-intro">Introduction to the document element tags</a></li>
+ <li><a href="#docelement-control">Control macros &ndash; changing the tag defaults</a>
+ <ul style="margin-left: -.5em; list-style-type: disc;">
+ <li><a href="#control-macro-args">Arguments to the control macros</a>
+ <ul style="margin-left: -.5em; list-style-type: circle;">
+ <li><a href="#family-and-font">family and font</a></li>
+ <li><a href="#point-size">point size</a></li>
+ <li><a href="#color">colour</a></li>
+ <li><a href="#quad">quad/justification</a></li>
+ <li><a href="#underline">underline style, rule weight</a></li>
+ </ul></li>
+ <li><a href="#grouping">Grouping control macros</a></li>
+ </ul></li>
+</ul>
+</div>
+
+<div class="rule-medium"><hr/></div>
+
+<h2 id="toc-doc-element" class="docs" style="text-align: center;">Document element tags table of contents</h2>
+
+<div id="docelement-mini-toc" style="font-size: 100%; line-height: 150%; margin-top: .5em;">
+<div class="mini-toc-col-1" style="margin-left: 0;">
+<h3 class="toc toc-docproc-header" style="margin-top: 1em;"><a class="header-link" href="#epigraph-intro">Epigraphs</a></h3>
+<ul class="toc-docproc" style="margin-top: .5em;">
+ <li><a href="#epigraph">EPIGRAPH</a></li>
+ <li><a href="#epigraph-control">Epigraph control</a></li>
+</ul>
+<h3 class="toc toc-docproc-header"><a class="header-link" href="#pp-intro">Paragraphs</a></h3>
+<ul class="toc-docproc" style="margin-top: .5em;">
+ <li><a href="#pp">PP</a></li>
+ <li><a href="#pp-control">Paragraph control</a></li>
+</ul>
+<h3 class="toc toc-docproc-header"><a class="header-link" href="#heading-intro">Headings</a></h3>
+<ul class="toc-docproc" style="margin-top: .5em;">
+ <li><a href="#heading">HEADING</a></li>
+ <li><a href="#heading-control">Heading control</a></li>
+ <li><a href="#oldstyle-headings-intro">Oldstyle headings</a></li>
+</ul>
+<h3 class="toc toc-docproc-header"><a class="header-link" href="#linebreak-intro">Linebreaks (section breaks)</a></h3>
+<ul class="toc-docproc" style="margin-top: .5em;">
+ <li><a href="#linebreak">LINEBREAK</a></li>
+ <li><a href="#linebreak-control">Linebreak control</a></li>
+</ul>
+<h3 class="toc toc-docproc-header"><a class="header-link" href="#quote-intro">Quotes (line for line; poetry or code)</a></h3>
+<ul class="toc-docproc" style="margin-top: .5em;">
+ <li><a href="#quote">QUOTE</a></li>
+ <li><a href="#quote-control">Quote control</a></li>
+</ul>
+<h3 class="toc toc-docproc-header"><a class="header-link" href="#blockquote-intro">Blockquotes (cited material)</a></h3>
+<ul class="toc-docproc" style="margin-top: .5em;">
+ <li><a href="#blockquote">BLOCKQUOTE</a></li>
+ <li><a href="#blockquote-control">Blockquote control</a></li>
+</ul>
+<h3 class="toc toc-docproc-header"><a class="header-link" href="#code-intro">Inserting code snippets</a></h3>
+<ul class="toc-docproc" style="margin-top: .5em;">
+ <li><a href="#code">CODE</a></li>
+ <li><a href="#code-control">Code control</a></li>
+</ul>
+</div>
+<div class="mini-toc-col-2" style="margin-top: 1.5em;">
+<h3 class="toc toc-docproc-header"><a class="header-link" href="#list-intro">Nested lists</a></h3>
+<ul class="toc-docproc" style="margin-top: .5em;">
+ <li><a href="#list">LIST</a></li>
+ <li><a href="#item">ITEM</a></li>
+ <li><a href="#list-control">List control</a></li>
+</ul>
+<h3 class="toc toc-docproc-header"><a class="header-link" href="#number-lines-intro">Line numbering</a></h3>
+<ul class="toc-docproc" style="margin-top: .5em;">
+ <li><a href="#number-lines">NUMBER_LINES</a></li>
+ <li><a href="#number-lines-control">Line numbering control</a></li>
+</ul>
+<h3 class="toc toc-docproc-header"><a class="header-link" href="#footnote-intro">Footnotes</a></h3>
+<ul class="toc-docproc" style="margin-top: .5em;">
+ <li><a href="#footnote">FOOTNOTE</a></li>
+ <li><a href="#footnote-control">Footnote control</a></li>
+</ul>
+<h3 class="toc toc-docproc-header"><a class="header-link" href="#endnote-intro">Endnotes</a></h3>
+<ul class="toc-docproc" style="margin-top: .5em;">
+ <li><a href="#endnote">ENDNOTE</a></li>
+ <li><a href="#endnote-control">Endnote control</a></li>
+</ul>
+<h3 class="toc toc-docproc-header"><a class="header-link" href="#margin-notes-intro">Margin notes</a></h3>
+<ul class="toc-docproc" style="margin-top: .5em;">
+ <li><a href="#mn-init">MN_INIT (set margin notes parameters)</a></li>
+ <li><a href="#mn">MN</a></li>
+</ul>
+<h3 class="toc toc-docproc-header"><a class="header-link" href="#finis-intro">Document termination string</a></h3>
+<ul class="toc-docproc" style="margin-top: .5em;">
+ <li><a href="#finis">FINIS</a></li>
+ <li><a href="#finis-control">Finis control</a></li>
+</ul>
+</div>
+</div>
+
+<div class="rule-medium" style="clear: both;"><hr/></div>
+
+<h2 id="docelement-intro" class="docs">Introduction to the document element tags</h2>
+
+<p>
+Once you&#8217;ve completed the setup for a document (see
+<a href="docprocessing.html#docprocessing-tut">Setting up a mom document</a>),
+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: &#8220;This is a paragraph; this is a heading; this is a
+footnote,&#8221; and so on.
+</p>
+
+<p>
+Generally, for each tag, there are
+<a href="definitions.html#controlmacro">control macros</a>
+for the tag&#8217;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
+<a href="docprocessing.html#start">START</a>,
+but can, in fact, be done at any time in the course of a document.
+Any change to a tag&#8217;s style affects all subsequent invocations
+of the tag.
+</p>
+
+<h2 id="docelement-control" class="docs">Control macros &ndash; changing the tag defaults</h2>
+
+<p>
+The control macros for document processing tags let you design the
+look of all the parts of your documents&mdash;should you wish. At
+a bare minimum, all tags have macros to change mom&#8217;s defaults
+for family, font, point size and colour. Where appropriate, there
+are macros to control leading, indents and quad as well.
+</p>
+
+<p>
+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&#8217;s defaults for the tag are.
+</p>
+
+<p>
+The control macros may be used at any time during the course of a
+document (i.e. before or after
+<a href="docprocessing.html#start">START</a>).
+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&#8217;s control macro, or toggling a particular
+feature of the tag on or off.
+</p>
+
+<p>
+And don&#8217;t forget: the
+<a href="typesetting.html#macros-typesetting">typesetting macros</a>
+can be used at any time, including inside
+<a href="definitions.html#toggle">toggle</a>
+tags (affecting only that particular invocation of the tag).
+Equally,
+<a href="definitions.html#inlines">inline escapes</a>
+can be used in tags that take
+<a href="definitions.html#stringargument">string arguments.</a>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="tip">Tip:</span>
+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&#8217;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.
+</p>
+</div>
+
+<div class="box-important">
+<p class="tip-top">
+<span class="important">Important:</span>
+The family, font, point size, colour and leading control macros have
+no effect in
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPEWRITE</kbd></a>,
+except where noted throughout this documentation.
+</p>
+
+<p class="tip-bottom">
+Please also note that the defaults listed with the control macros
+apply only to
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPESET</kbd></a>
+unless a default for <kbd>TYPEWRITE</kbd> is also given.
+</p>
+</div>
+
+<h3 id="control-macro-args" class="docs">Arguments to the control macros</h3>
+
+<h4 id="family-and-font" class="docs" style="margin-top: 1em; margin-bottom: -.75em;">Family and font</h4>
+
+<p>
+The arguments to the control macros that end in _FAMILY or _FONT are
+the same as for
+<a href="typesetting.html#family">FAMILY</a>
+and
+<a href="typesetting.html#font">FT</a>.
+</p>
+
+<h4 id="point-size" class="docs" style="margin-top: -.5em; margin-bottom: -.75em;">Point size</h4>
+
+<p>
+Control macros that end in _SIZE always take
+the form <kbd>+&lt;n&gt;</kbd> or <kbd>-&lt;n&gt;</kbd> where
+&lt;n&gt; is the number of
+<a href="definitions.html#picaspoints">points</a>
+larger (+) or smaller (-) than the point size of paragraphs
+you want the document element to be. For example, to set
+blockquotes 2 points smaller than the type in paragraphs, do
+<br/>
+<span class="pre-in-pp">
+ .BLOCKQUOTE_SIZE -2
+</span>
+There&#8217;s no need for a
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+with the _SIZE control macros; points is assumed.
+</p>
+
+<h4 id="color" class="docs" style="margin-top: -.5em; margin-bottom: -.75em;">Colour</h4>
+
+<p>
+Control macros that end in _COLOR take as their argument a colour
+name pre-defined (or &#8220;initialized&#8221;) with
+<a href="color.html#newcolor">NEWCOLOR</a>
+or
+<a href="color.html#xcolor">XCOLOR</a>.
+For example, if you want your
+<a href="#linebreak">author linebreaks</a>
+to be red, once you&#8217;ve defined or initialized the colour, red,
+<br/>
+<span class="pre-in-pp">
+ .LINEBREAK_COLOR red
+</span>
+will turn them red.
+</p>
+
+<h4 id="lead" class="docs" style="margin-top: -.5em; margin-bottom: -.75em;">Lead / linespacing</h4>
+
+<p>
+Control macros that end in _AUTOLEAD take the same argument as
+<a href="typesetting.html#autolead">AUTOLEAD</a>,
+<i>viz.</i> a digit that represents the number of points to add to
+the tag&#8217;s point size to arrive at its
+<a href="definitions.html#leading">leading</a>.
+For example, to set footnotes
+<a href="definitions.html#solid">solid</a>, do
+<br/>
+<span class="pre-in-pp">
+ .FOOTNOTE_AUTOLEAD 0
+</span>
+To set footnotes with a 1-point lead (i.e. with the line spacing
+one point greater than the footnote&#8217;s point size), do
+<br/>
+<span class="pre-in-pp">
+ .FOOTNOTE_AUTOLEAD 1
+</span>
+</p>
+
+<div class="box-tip" style="margin-top: -1.25em;">
+<p class="tip">
+<span class="note">Note:</span>
+_AUTOLEAD control macros do not have a <kbd>FACTOR</kbd> argument.
+</p>
+</div>
+
+
+<h4 id="control-indents" class="docs" style="margin-top: -.75em; margin-bottom: -.75em;">Indents</h4>
+
+<p>
+Except for
+<a href="#para-indent">PARA_INDENT</a>,
+the argument to control macros that end in _INDENT can take
+either a single numeral (whole numbers only, no decimal fractions)
+<i>without</i> a
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+appended to it, or a digit (including decimal fractions) <i>with</i>
+a unit of measure appended.
+</p>
+
+<p>
+A digit <i>without</i> a unit of measure appended represents by
+how much you want your paragraph first-line indents (set with
+PARA_INDENT) multiplied to achieve the correct indent for a
+particular tag. For example,
+<br/>
+<span class="pre-in-pp">
+ .PARA_INDENT 2m
+ .BLOCKQUOTE_INDENT 2
+</span>
+means that blockquotes will be indented from the left and right
+margins by twice the size of the paragraph indent, or 4
+<a href="definitions.html#em">ems</a>.
+</p>
+
+<p>
+A digit <i>with</i> a unit of measure appended defines an absolute
+indent, relative to nothing. In the following, blockquotes will be
+indented by 3
+<a href="definitions.html#picaspoints">picas</a>
+and 6
+<a href="definitions.html#picaspoints">points</a>,
+regardless of the paragraph indent.
+<br/>
+<span class="pre-in-pp">
+ .PARA_INDENT 2m
+ .BLOCKQUOTE_INDENT 3P+6p
+</span>
+</p>
+
+<h4 id="quad" class="docs" style="margin-top: -1em; margin-bottom: -.75em;">Quad / justification style</h4>
+
+<p>
+Control macros that end in _QUAD take the same arguments as
+<a href="typesetting.html#quad">QUAD</a>.
+</p>
+
+<h4 id="underscore" class="docs" style="margin-bottom: -.75em;">Underscore style, rule weight</h4>
+
+<p>
+If mom gives the option to underscore a document element, the weight
+of the underline and its distance from the
+<a href="definitions.html#baseline">baseline</a>
+are controlled by macros that end in _UNDERSCORE or _UNDERLINE, the
+two being synonymous. These macros take the following arguments:
+<br/>
+<span class="pre-in-pp">
+ DOUBLE - double underscore
+ &lt;weight&gt; - the underscore weight (in points, no unit of measure required
+ &lt;distance&gt; - distance from baseline (unit of measure required)
+ &lt;rule gap&gt; - distance between double underscore rules (unit of measure required)
+</span>
+<kbd>DOUBLE</kbd> by itself will double-underscore the element. The
+remaining arguments must be entered in the order given. You may not
+skip over any of them, which means that if you only wish to change
+<kbd>&lt;rule gap&gt;</kbd>, you must still enter a
+<kbd>&lt;weight&gt;</kbd> and <kbd>&lt;distance&gt;</kbd> argument.
+</p>
+
+<p>
+Page elements that are separated from
+<a href="definitions.html#running">running text</a>
+by a rule (i.e. page headers, page footers, and footnotes) are
+controlled by macros that end in _RULE_WEIGHT.
+</p>
+
+<p>
+The weight argument to _UNDERSCORE macros is the same as the
+argument to
+<a href="inlines.html#rule-weight">RULE_WEIGHT</a>,
+as is the argument to _RULE_WEIGHT macros.
+</p>
+
+<h3 id="grouping" class="docs">Grouping control macros</h3>
+
+<p>
+As of version 2.1, it is possible to group control macros for a
+particular tag into a single <kbd>&lt;element&gt;_STYLE</kbd> macro.
+For example, rather than setting the family, size, and indent of
+<a href="#blockquote-intro">BLOCKQUOTES</a>
+with
+<br/>
+<span class="pre-in-pp">
+ .BLOCKQUOTE_FAMILY H
+ .BLOCKQUOTE_SIZE -2
+ .BLOCKQUOTE_INDENT 4P
+</span>
+you can enter the same style parameter changes with
+<br/>
+<span class="pre-in-pp">
+ .BLOCKQUOTE_STYLE \
+ FAMILY H \
+ SIZE -2 \
+ INDENT 4P
+</span>
+<kbd>&lt;element&gt;_STYLE</kbd> macros use
+&#8220;keyword/value&#8221; pairs (<kbd>FAMILY</kbd> is a keyword,
+<kbd>H</kbd> is a value), and may be entered entirely on one line,
+or, as the example shows, broken into several readable lines using
+the backslash. The macro itself and all but the last keyword/value
+pair require the backslash when this style is used.
+</p>
+
+<p>
+Not all the control macros for a particular tag may be available
+with an <kbd>&lt;element&gt;_STYLE</kbd> macro. Generally speaking,
+though, if a tag has control macros for
+</p>
+<table style="font-family: monospace; font-weight: bold; margin-left: 5em; margin-top: -1em">
+ <tr>
+ <td style="padding-right: 1em">FAMILY</td>
+ <td style="padding-right: 1em">LEAD</td>
+ <td style="padding-right: 1em">INDENT</td>
+ <td style="padding-right: 1em">SMALLCAPS</td>
+ </tr>
+ <tr>
+ <td style="padding-right: 1em">FONT</td>
+ <td style="padding-right: 1em">AUTOLEAD</td>
+ <td style="padding-right: 1em">COLOR</td>
+ <td style="padding-right: 1em">UNDERSCORE or UNDERLINE</td>
+ </tr>
+ <tr>
+ <td style="padding-right: 1em">SIZE</td>
+ <td style="padding-right: 1em">QUAD</td>
+ <td style="padding-right: 1em">CAPS</td>
+ </tr>
+</table>
+<p style="margin-top: .5em">
+those parameters may be used within an
+<kbd>&lt;element&gt;_STYLE</kbd> macro.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If you need to reverse the sense of <kbd>CAPS</kbd>,
+<kbd>SMALLCAPS</kbd> or <kbd>UNDERSCORE/UNDERLINE</kbd>, which
+do not take a value after the keyword, use <kbd>NO_CAPS</kbd>,
+<kbd>NO_SMALLCAPS</kbd>, and <kbd>NO_UNDERSCORE/NO_UNDERLINE</kbd>.
+</p>
+</div>
+
+<div class="rule-short"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="epigraph-intro" class="macro-group">Epigraphs</h2>
+
+<ul style="margin-left: -.5em;">
+ <li><a href="#epigraph">Tag: EPIGRAPH</a></li>
+ <li><a href="#epigraph-control">Epigraph control macros and defaults</a></li>
+</ul>
+
+<p>
+<a href="definitions.html#epigraph">Epigraphs</a>
+colour, flavour, or comment on the document they precede.
+Typically, they are centred at the top of a document&#8217;s first page
+(underneath the title) and set in a smaller point size than that of
+paragraph text.
+</p>
+
+<p>
+By default, mom sets epigraphs centred and
+<a href="definitions.html#filled">unfilled</a>;
+this lets you input them on a line for line basis. This behaviour
+can be changed to accommodate
+<a href="definitions.html#filled">filled</a>
+epigraph &#8220;blocks.&#8221;
+</p>
+
+<!-- -EPIGRAPH- -->
+
+<div class="macro-id-overline">
+<h3 id="epigraph" class="macro-id">EPIGRAPH</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>EPIGRAPH</b> <kbd class="macro-args">&lt;toggle&gt; | [ BLOCK ]</kbd>
+</div>
+
+<p>
+EPIGRAPH is a toggle, used like this:
+<br/>
+<span class="pre-in-pp">
+ .EPIGRAPH
+ &lt;text of epigraph&gt;
+ .EPIGRAPH OFF
+</span>
+<kbd>OFF</kbd>, above, could be anything&mdash;say, <kbd>Q</kbd> or
+<kbd>X</kbd>&mdash;since any argument other than <kbd>BLOCK</kbd>
+turns it off.
+</p>
+
+<p>
+If given the argument, <kbd>BLOCK</kbd>, EPIGRAPH sets epigraphs
+<a href="definitions.html#filled">filled</a>,
+justified or quadded in the same direction as paragraphs, indented
+equally from both the left and right margins.
+</p>
+
+<p>
+If a block-style epigraph runs to more than one paragraph (unlikely,
+but conceivable), you must introduce every paragraph&mdash;including
+the first&mdash;with the
+<a href="#pp">PP</a>
+tag.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+EPIGRAPH should only be used at the top of a document (i.e. just
+after
+<a href="docprocessing.html#start">START</a>)
+or after headings. The latter is not especially recommended, but it
+does work. In all other places where you want quotes or cited text,
+use
+<a href="#quote">QUOTE</a>
+or
+<a href="#blockquote">BLOCKQUOTE</a>.
+</p>
+</div>
+
+<div class="box-tip">
+<p class="tip">
+<span class="tip">Tips on vertical spacing around epigraphs:</span>
+If you wish to change the vertical position of an epigraph with
+<a href="typesetting.html#space">SPACE</a>,
+<a href="typesetting.html#ald">ALD</a>, or
+<a href="typesetting.html#rld">RLD</a>,
+do so before invoking <kbd>.EPIGRAPH</kbd>, like this:
+<br/>
+<span class="pre-in-pp">
+ .SP -6p
+ .EPIGRAPH
+ A notable quote.
+ .EPIGRAPH OFF
+</span>
+If you&#8217;re setting a document in
+<a href="docprocessing.html#columns">columns</a>
+and you&#8217;d like to add or subtract space <i>after</i> the
+epigraph, which is centred over the top of both columns, the place
+to do it is inside the epigraph, like this:
+<br/>
+<span class="pre-in-pp">
+ .EPIGRAPH
+ A notable quote.
+ .SP 1v
+ .EPIGRAPH OFF
+</span>
+If you were to add the <kbd>.SP 1v</kbd> outside the epigraph, the
+space would be added to the top of the leftmost column only,
+resulting in unbalanced columns.
+</p>
+</div>
+
+<div class="defaults-container" style="padding-bottom: 8px;">
+<h3 id="epigraph-control" class="docs defaults" style="margin-top: -.25em;">EPIGRAPH control macros and defaults</h3>
+
+<p class="defaults">
+See
+<a href="#control-macro-args">Arguments to the control macros</a>.
+<br/>
+The following EPIGRAPH control macros may also be
+<a href="#grouping">grouped</a>
+using EPIGRAPH_STYLE.
+</p>
+
+<span class="pre defaults">
+.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 &#8220;block&#8221; style epigraphs only)
+.EPIGRAPH_INDENT* (see Note on EPIGRAPH_INDENT, below)
+
+*Indent here refers to the indent from both the left and right margins
+ that centres block style epigraphs on the page.
+</span>
+</div>
+
+<div class="box-notes">
+<h3 id="epigraph-indent" class="docs notes" style="margin-bottom: -.75em;">Note on EPIGRAPH_INDENT</h3>
+
+<p style="margin-top: .5em;">
+If you pass EPIGRAPH_INDENT an integer with no unit of measure
+appended, the integer represents the amount by which to multiply
+PARA_INDENT to arrive at an indent for block style epigraphs. If
+you append a unit of measure to the argument, the indent will be
+precisely the amount specified.
+</p>
+
+<p>
+Please also note that if your PARA_INDENT is <kbd>0</kbd> (i.e.
+no indenting of the first line of paragraphs), you must set an
+EPIGRAPH_INDENT yourself, with a unit of measure appended to the
+argument. Mom has no default for EPIGRAPH_INDENT if paragraph first
+lines are not being indented.
+</p>
+
+<p class="tip-bottom">
+The default value for EPIGRAPH_INDENT is <kbd>3</kbd> (for
+<a href="docprocessing.html#printstyle">PRINTSTYLE TYPESET</a>)
+and <kbd>2</kbd> (for
+<a href="docprocessing.html#printstyle">PRINTSTYLE TYPEWRITE</a>).
+</p>
+</div>
+
+<div class="rule-short"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="pp-intro" class="macro-group">Paragraphs</h2>
+
+<ul style="margin-left: -.5em;">
+ <li><a href="#pp">Tag: PP</a></li>
+ <li><a href="#pp-control">Paragraph control macros and defaults</a></li>
+</ul>
+
+<p>
+The paragraph macro is the one you use most often. Consequently,
+it&#8217;s one of most powerful, yet simplest to use&mdash;just the
+letters PP. No arguments, nothing. Just <kbd>.PP</kbd> 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.
+</p>
+
+<p>
+By default, mom does not indent the first paragraph of a document,
+nor paragraphs that fall immediately after headings. The first
+paragraphs of blockquotes and block-style epigraphs are also not
+indented. This behaviour can be changed with the control macro
+<kbd><a href="#para-indent-first">INDENT_FIRST_PARAS</a></kbd>.
+</p>
+
+<p>
+Mom does not deposit a blank line between paragraphs. If you want
+her to do so, use the control macro
+<a href="#pp-space">PARA_SPACE</a>.
+(I don&#8217;t recommend using this macro with
+<a href="typesetting.html#printstyle">PRINTSTYLE TYPEWRITE</a>.)
+</p>
+
+<p>
+Note that mom does not provide widow or 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&#8217;s simplistic orphan control will
+break these one-liners&mdash;if they fall at the bottom of the
+page&mdash;to a new page, which is not what you want.
+</p>
+
+<!-- -PP- -->
+
+<div class="macro-id-overline">
+<h3 id="pp" class="macro-id">PP</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>PP</b>
+</div>
+<p>
+<kbd>.PP</kbd> (on a line by itself, of course) tells mom to start a
+new paragraph. See
+<a href="#pp-intro">above</a>
+for more details. In addition to regular text paragraphs, you can
+use PP in
+<a href="#epigraph-intro">epigraphs</a>,
+<a href="#blockquote-intro">blockquotes</a>,
+<a href="#endnote-intro">endnotes</a>
+and
+<a href="#footnote-intro">footnotes</a>.
+</p>
+
+<div class="defaults-container" style="background-color: #ded4bd; border: none;">
+<h3 id="pp-control" class="docs defaults">PP control macros and defaults</h3>
+
+<p class="defaults">
+The PP macro 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. As a result, the control macros for PP may not be
+<a href="#grouping">grouped</a>
+within a <kbd>_STYLE</kbd> macro.
+</p>
+
+<ol style="margin-top: .5em; padding-bottom: .5em;">
+ <li><a href="#pp-family">Family control</a></li>
+ <li><a href="#pp-font">Font control</a></li>
+ <li><a href="#pp-color">Paragraph colour</a></li>
+ <li><a href="#pp-leading">Leading/linespacing control</a></li>
+ <li><a href="#pp-just-quad">Justification/quad control</a></li>
+ <li><a href="#para-indent">First-line indent control</a></li>
+ <li><a href="#para-indent-first">Initial paragraphs indent control</a></li>
+ <li><a href="#pp-space">Inter-paragraph spacing</a></li>
+</ol>
+</div>
+
+<h4 id="pp-family" class="docs" style="margin-top: -1.5em;">1. Family control</h4>
+
+<p>
+The paragraph
+<a href="definitions.html#family">family</a>
+is set with
+<a href="typesetting.html#family">FAMILY</a>
+prior to
+<a href="docprocessing.html#start">START</a>,
+or
+<a href="docprocessing.html#doc-family">DOC_FAMILY</a>
+afterwards. Please note that both globally affect the family of
+every element in the document.
+</p>
+
+<p>
+If you wish to change the family for regular text paragraphs only,
+invoke <kbd>.FAMILY</kbd> immediately after <kbd>.PP</kbd> in every
+paragraph whose family you wish to differ from the prevailing
+document family. Alternatively, set the family and font for
+paragraphs with PP_FONT, giving it a complete family+font name, e.g.
+<br/>
+<span class="pre-in-pp">
+ PP_FONT TI
+</span>
+which would make the font used in paragraphs Times Roman Italic.
+</p>
+
+<p>
+Mom&#8217;s default paragraph (and document) family is Times Roman.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Neither FAMILY nor DOC_FAMILY has any effect when the PRINTSTYLE is
+<kbd>TYPEWRITE</kbd>.
+</p>
+</div>
+
+<h4 id="pp-font" class="docs" style="margin-top: -.25em;">2. Font control</h4>
+
+<p>
+To change the
+<a href="definitions.html#font">font</a>
+used in regular text paragraphs, use PP_FONT, which takes the same
+argument as
+<a href="typesetting.html#font">FT</a>.
+PP_FONT may be used before or after
+<a href="docprocessing.html#start">START</a>.
+Only regular text paragraphs are affected; paragraphs in
+<a href="#epigraph-intro">epigraphs</a>,
+<a href="#blockquote-intro">blockquotes</a>,
+<a href="#endnote-intro">endnotes</a>,
+and
+<a href="#footnote-intro">footnotes</a>
+remain at their default setting (medium roman) unless you change
+them with the appropriate control macros.
+</p>
+
+<p>
+Mom&#8217;s default paragraph font is medium roman.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+PP_FONT has no effect when the PRINTSTYLE is <kbd>TYPEWRITE</kbd>.
+If you wish to set whole typewritten paragraphs in italic, invoke
+<kbd>.FT I</kbd> immediately after <kbd>.PP</kbd>. Depending
+on which of
+<a href="docprocessing.html#printstyle-italics">UNDERLINE_ITALIC</a>
+or
+<a href="docprocessing.html#printstyle-italics">ITALIC_MEANS_ITALIC</a>
+is currently enabled, the paragraph will be set underlined or in
+italic. Neither persists past the end of the paragraph.
+</p>
+</div>
+
+<h4 id="pp-color" class="docs" style="margin-top: -.25em;">3. Paragraph colour</h4>
+
+<p>
+Mom has no special control macro for colourising paragraphs. If you
+wish a colourised paragraph, you must use the macro
+<a href="color.html#color">COLOR</a>
+or the
+<a href="definitions.html#inline">inline escape</a>,
+<a href="color.html#color-inline"><kbd><span class="nobr">\*[&lt;colourname&gt;]</span></kbd></a>,
+<i>after</i> <kbd>.PP</kbd>. The colour must be one pre-defined (or
+&#8220;initialized&#8221;) with
+<a href="color.html#newcolor">NEWCOLOR</a>
+or
+<a href="color.html#xcolor">XCOLOR</a>.
+</p>
+
+<p>
+Please note that unless you change the colour back to it&#8217;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).
+</p>
+
+<p>
+For example, assuming you have defined the colour, blue,
+<br/>
+<span class="pre-in-pp">
+ .PP
+ .COLOR blue
+ &lt;first paragraph&gt;
+ .HEADING 1 "Monty Python"
+ .HEADING 2 "The Origins of Spam"
+ .PP
+ &lt;second paragraph&gt;
+</span>
+the first paragraph will be blue, the head and subhead will be in
+the document&#8217;s default colour (usually black), and the second
+paragraph will be in blue.
+</p>
+
+<h4 id="pp-leading" class="docs" style="margin-top: -.25em;">4. Leading</h4>
+
+<p>
+The paragraph
+<a href="definitions.html#leading">leading</a>
+is set with
+<a href="typesetting.html#leading">LS</a>
+prior to
+<a href="docprocessing.html#start">START</a>,
+or
+<a href="docprocessing.html#doc-lead">DOC_LEAD</a>
+afterwards. Please note that either method globally affects the
+leading and spacing of every document element (except
+<a href="definitions.html#header">headers</a>
+and
+<a href="definitions.html#footer">footers</a>).
+</p>
+
+<p>
+If you wish to change the leading of regular text paragraphs only,
+invoke <kbd>.LS</kbd> immediately after <kbd>.PP</kbd> in any
+paragraph whose leading you wish to change.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Warning:</span>
+Changing a paragraph&#8217;s leading will almost certainly screw up
+mom&#8217;s ability to balance the bottom margin of pages. Should
+you absolutely require a change to a paragraph&#8217;s leading and
+need to get mom back on track leading-wise afterwards, use the
+<a href="docprocessing.html#shim">SHIM</a>
+or
+<a href="docprocessing.html#shim">FLEX</a>
+macro, depending on which
+<a href="docprocessing.html#vertical-whitespace-management">vertical whitespace management</a>
+strategy you are using.
+</p>
+</div>
+
+<p>
+Mom&#8217;s default paragraph leading (document leading)
+is 16 points, adjusted to fill the page.
+</p>
+
+<h4 id="pp-just-quad" class="docs" style="margin-top: -.25em;">5. Justification / quad</h4>
+
+<p>
+The justification/quad-direction of regular text paragraphs (i.e.
+<a href="definitions.html#just">justified</a>,
+or
+<a href="definitions.html#filled">filled</a>
+and
+<a href="definitions.html#quad">quadded</a>
+left/right/centre) is set with
+<a href="typesetting.html#justify">JUSTIFY</a>
+or
+<a href="typesetting.html#quad">QUAD</a>
+prior to
+<a href="docprocessing.html#start">START</a>,
+and with
+<a href="docprocessing.html#doc-quad">DOC_QUAD</a>
+afterwards.
+</p>
+
+<p>
+Please note that either method of setting the paragraph
+justification/quad-direction also affects
+<a href="#epigraph-intro">epigraphs</a>,
+<a href="#footnote-intro">footnotes</a>,
+and
+<a href="#endnote-intro">endnotes</a>,
+but not
+<a href="#blockquote-intro">blockquotes</a>
+(whose default is quad left unless you change it with
+<a href="#blockquote">BLOCKQUOTE_QUAD</a>).
+The justification/quad-direction of epigraphs and footnotes may be
+changed with their own control macros.
+</p>
+
+<p>
+If you wish to change the justification/quad-direction of individual
+paragraphs, invoke
+<a href="typesetting.html#justify"><kbd>.JUSTIFY</kbd></a>
+or
+<a href="typesetting.html#quad"><kbd>.QUAD</kbd></a>
+on the line immediately after <kbd>.PP</kbd>. Only the paragraph
+in question gets justified or quadded differently; subsequent
+paragraphs remain unaffected.
+</p>
+
+<p>
+Mom&#8217;s default justification/quad-direction for paragraphs
+when the
+<a href="docprocessing.html#printstyle">PRINTSTYLE</a>
+is <kbd>TYPESET</kbd> is justified; for PRINTSTYLE
+<kbd>TYPEWRITE</kbd>, the default is quad left.
+</p>
+
+<h4 id="para-indent" class="docs" style="margin-top: -.25em;">6. First-line indent</h4>
+
+<p>
+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
+<a href="docprocessing.html#start">START</a>.
+A
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+is required; fractional sizes are allowed. Thus, to set the
+paragraph indent to 4-1/2
+<a href="definitions.html#em">ems</a>, do
+<br/>
+<span class="pre-in-pp">
+ .PARA_INDENT 4.5m
+</span>
+In addition to establishing the basic first line-indent of
+paragraphs, PARA_INDENT also affects
+<a href="#epigraph-intro">epigraphs</a>,
+<a href="#quote-intro">quotes</a>
+and
+<a href="#blockquote-intro">blockquotes</a>,
+whose overall indenting from the left and (where applicable)
+right margins is relative to PARA_INDENT if
+the _INDENT control macro for these tags has
+no
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+appended to it. 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.
+</p>
+
+<p>
+Mom&#8217;s default PARA_INDENT is 2 ems for
+<a href="docprocessing.html#printstyle">PRINTSTYLE</a>
+<kbd>TYPESET</kbd> and 3 picas (1/2 inch) for
+<a href="docprocessing.html#printstyle">PRINTSTYLE</a>
+<kbd>TYPEWRITE</kbd>.
+</p>
+
+<h4 id="para-indent-first" class="docs" style="margin-top: -.25em;">7. Indenting initial paragraphs</h4>
+
+<p>
+By default, mom does not indent the first paragraph of a document,
+nor the first paragraph after a heading or
+<a href="#linebreak-intro">linebreak</a>,
+nor the first paragraphs of
+<a href="#epigraph-intro">epigraphs</a>,
+<a href="#blockquote-intro">blockquotes</a>,
+<a href="#endnote-intro">endnotes</a>
+or
+<a href="#footnote-intro">footnotes</a>
+that run to more than one paragraph.
+</p>
+
+<p>
+If you wish to have first paragraphs indented, invoke the macro
+INDENT_FIRST_PARAS without an argument, either before or after
+<a href="docprocessing.html#start">START</a>.
+INDENT_FIRST_PARAS is a toggle macro, therefore passing it any
+argument (<kbd>OFF</kbd>, <kbd>QUIT</kbd>, <kbd>Q</kbd>,
+<kbd>X</kbd>...) cancels its effect, meaning that first paragraphs
+will once again not be indented.
+</p>
+
+<h4 id="pp-space" class="docs">8. Inter-paragraph spacing</h4>
+
+<p>
+By default, mom does not insert a blank line between
+paragraphs. If you would like her to do so, invoke the macro
+PARA_SPACE without an argument, either before or after
+<a href="docprocessing.html#start">START</a>.
+PARA_SPACE is a toggle macro, therefore passing it any argument
+(<kbd>OFF</kbd>, <kbd>QUIT</kbd>, <kbd>Q</kbd>, <kbd>X</kbd>...)
+cancels its effect, meaning that paragraphs will once again not be
+separated by a blank line.
+</p>
+
+<p>
+If you would like to space paragraphs by less than a full linespace,
+invoke PARA_SPACE with the amount of space you want as a numeric
+argument. A
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+is required. For example, to space paragraphs by one-quarter
+linespace
+<span class="pre-in-pp">
+ .PARA_SPACE .25v
+</span>
+is how you&#8217;d do it, or, if you want six points between
+paragraphs
+<span class="pre-in-pp">
+ .PARA_SPACE 6p
+</span>
+</p>
+
+<p style="margin-top: -1em" >
+If
+<a href="docprocessing.html#flex-vs-shim">flex-spacing</a>
+is enabled, additional flexible vertical whitespace can be inserted
+between spaced paragraphs with the
+<a href="docprocessing.html#flex">FLEX</a>
+macro.
+</p>
+
+<p>
+PARA_SPACE is not recommended for use with PRINTSTYLE TYPEWRITE
+unless you give PRINTSTYLE the <kbd>SINGLESPACE</kbd> option.
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span>
+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
+<a href="definitions.html#docheader">docheader</a>
+(i.e. the start of a document),
+<a href="#epigraph-intro">epigraphs</a>,
+<a href="#heading-intro">headings</a>,
+and
+<a href="#linebreak-intro">linebreaks</a>.
+(The first paragraph after these document elements requires no
+blank line to separate it from other paragraphs.)
+</p>
+
+<p class="tip-bottom">
+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&#8217;t space it with a blank
+line, even though you expect her to. The simple workaround for this
+is to invoke <kbd>.PP</kbd> twice (in succession) at the point you
+expect the blank line to appear.
+</p>
+</div>
+
+<div class="rule-short"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="heading-intro" class="macro-group">Headings</h2>
+
+<ul style="margin-left: -.5em;">
+ <li><a href="#heading">Tag: HEADING</a></li>
+ <li><a href="#head-spacing-notes">Spacing of headings</a></li>
+ <li><a href="#heading-control">Heading control macros and defaults</a></li>
+ <li><a href="#prefix-chapter-number">Prefixing chapter numbers</a></li>
+ <li><a href="#oldstyle-headings">Oldstyle headings</a>
+ <ul style="list-style-type: circle; margin-left: -1.25em">
+ <li><a href="#parahead">Important information about PARAHEAD</a>
+ <ul style="list-style-type: square; margin-left: -1.25em">
+ <li><a href="#parahead-usage">Correct usage of paraheads</a></li>
+ </ul></li>
+ </ul></li>
+</ul>
+
+<p>
+Heads, subheads, and deeper levels of section headings are
+handled by a single macro, HEADING, to which you pass an argument
+stating the desired level.
+<kbd><span class="nobr">.HEADING 1 &quot;&lt;text&gt;&quot;</span></kbd>,
+for example, would be a main head;
+<kbd><span class="nobr">.HEADING 2 &quot;&lt;text&gt;&quot;</span></kbd>
+would be a subhead; etc.
+</p>
+
+<p>
+In addition to printing headings in the body of your document,
+HEADING collects the heading as an entry for the Table of Contents,
+if the document is to have one, and the
+<a href="definitions.html#pdfoutline">PDF outline</a>.
+With the <kbd>NAMED</kbd> argument, it furthermore acts as a
+bookmark for
+<a href="definitions.html#pdflink">PDF links</a>.
+</p>
+
+<p>
+Headings can also be numbered on a per-heading-level basis,
+hierarchically and concatenatively, e.g.
+<br/>
+<span class="pre-in-pp">
+ 1.
+ 1.1
+ 1.2
+ 1.2.1
+ 2.
+ 2.1
+ 2.2
+ 2.2.1
+</span>
+By default, a blank line precedes headings, regardless of the level.
+Mom initially sets up a very basic style for nine levels of heading,
+of which you can have an infinite number, although as has been said,
+if you need more than four levels of heading, you should consider
+re-organising your material. The pared-down style of mom&#8217;s
+defaults is intentional; it is expected that you will design
+headings to your own specifications with the
+<a href="definitions.html#controlmacro">control macro</a>,
+<a href="#heading-style">HEADING_STYLE</a>.
+</p>
+
+<p>
+It is very good practice, and strongly recommended, that you respect
+the hierarchy of headings, using level-1 for main heads, level-2 for
+subheads, level-3 for subsubheads, etc. The ease of designing and
+re-designing the style for each level, plus mom&#8217;s very basic
+defaults, are meant, in part, to prevent the whimsical misuse of
+a particular heading level just because its style appeals to you.
+</p>
+
+<!-- -HEAD- -->
+
+<div class="macro-id-overline">
+<h3 id="heading" class="macro-id">HEADING</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>HEADING</b> <kbd class="macro-args">&lt;level&gt; [
+PARAHEAD ] [ NAMED &lt;pdf-id&gt; ] &quot;&lt;heading text&gt;&quot;</kbd>
+</div>
+
+<p>
+The first argument to HEADING is the <kbd>level</kbd>. Level 1 is
+analogous to a main head; level 2 is analogous to a subhead; level 3
+is analogous to a subsubhead; etc.
+</p>
+
+<p>
+The second (optional) argument, <kbd>PARAHEAD</kbd>, instructs mom
+that the heading should be treated as a
+<a href="definitions.html#parahead">paragraph head</a>.
+If HEADING is being used to create a parahead, it must come after
+<a href="#pp">PP</a>,
+not before.
+</p>
+
+<p>
+The indent applied to a parahead is the same as what would be
+expected from a paragraph without the parahead (see
+<a href="#para-indent-first">Indenting initial paragraphs</a>).
+If you wish that a paragraph introduced by a parahead not be
+indented, use
+<a href="#para-indent">PARA_INDENT</a>
+to set the paragraph indent to zero, then reset the indent for
+subsequent paragraphs.
+</p>
+
+<p>
+The optional third argument, <kbd>NAMED &lt;id&gt;</kbd>, gives
+the heading a unique, non-printing identifier that allows it to be
+referenced from anywhere in the final PDF document with the PDF_LINK
+macro, provided the mom file is processed with
+<a href="using.html#pdfmom" style="font-weight: bold">pdfmom</a>.
+PDF_LINK usage is explained in the manual,
+<a href="http://www.schaffter.ca/mom/pdf/mom-pdf.pdf"><span class="book-title">Producing PDFs with groff and mom</span></a>.
+</p>
+
+<p>
+The final argument is the text of the heading, surrounded by double
+quotes. Long headings that are likely to exceed the current
+line length should be broken into chunks, each surrounded by
+double-quotes, like this:
+<br/>
+<span class="pre-in-pp">
+ .HEADING 1 "A needlessly long but instructive" "first level heading"
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If a heading falls near the bottom of an output page and mom is
+unable to fit the heading plus at least one line of text underneath
+it, she will set the head at the top of the next page.
+</p>
+</div>
+
+<div class="box-tip">
+<h3 id="head-spacing-notes" class="docs" style="padding-top: 9px; font-size: 100%; text-transform: none">Spacing of headings</h3>
+
+<p>
+As described above, mom inserts a blank line before each heading.
+If the leading of your document never changes, and you introduce no
+additional space into the text&mdash;as, for example, between
+paragraphs&mdash;this will result in perfectly equal whitespace before
+each heading.
+</p>
+
+<p>
+If, however, you disrupt the regular placement of text on
+mom&#8217;s
+<a href="definitions.html#baseline-grid">baseline grid</a>,
+HEADING adds extra whitespace to the blank line according to the
+<a href="docprocessing.html#vertical-whitespace-management">vertical whitespace management</a>
+strategy in effect. This, along with a similar strategy for
+whitespace around quotes, blockquotes, and
+<a href="definitions.html#float">floated</a>
+and
+<a href="definitions.html#preprocessor">pre-processor material</a>
+is what allows mom to balance the bottom
+margins of pages effectively.
+</p>
+
+<p>
+It occasionally happens that the extra whitespace becomes
+noticeable. This typically occurs when the amount of whitespace
+adjustment approaches the value of the current leading. The result
+looks like two blank lines instead of one. When this happens, a
+simple but effective fix is to reduce the space before the heading
+by backing up one line, either with
+<br/>
+<span class="pre-in-pp">
+ .SPACE -1v
+</span>
+or
+<br/>
+<span class="pre-in-pp">
+ .RLD -1v
+</span>
+This results in slightly less whitespace than normal, but the
+difference is usually not apparent. Alternatively, you may pass the
+<kbd>NO_SHIM</kbd> or <kbd>NO_FLEX</kbd> argument to
+<a href="#heading-style">HEADING_STYLE</a>
+to prevent shimming or flex-spacing of any particular heading level
+either globally or selectively. If shimming/flex-spacing is
+disabled selectively with
+<br/>
+<span class="pre-in-pp">
+ .HEADING_STYLE &lt;n&gt; NO_SHIM | NO_FLEX
+</span>
+it can be re-enabled for the heading level with
+<br/>
+<span class="pre-in-pp">
+ .HEADING_STYLE &lt;n&gt; SHIM | FLEX
+</span>
+</p>
+</div>
+
+<div class="defaults-container" style="background-color: #ded4bd; border: none;">
+<h3 id="heading-control" class="defaults" style="margin-left: 6px; margin-bottom: -1em">HEADING control and defaults</h3>
+
+<div style="padding-left: 15px; padding-right: 15px">
+<p style="margin-bottom: 1em">
+By default, mom pre-initializes nine levels of headings to use
+the bold font of the prevailing document family, with a baseline
+adjustment of 1/10 of the current
+<a href="definitions.html#leading">leading</a>.
+In addition, level-1 headings are 3 points larger than running text,
+level-2 headings 2 points larger, and level 3-headings 1 point
+larger. The remaining 6 levels are the same size as running text.
+A single blank line precedes all levels of heading.
+</p>
+
+<h4 id="heading-style" class="docs" style="margin-bottom: -.5em">The HEADING_STYLE macro</h4>
+
+<p>
+Styling heads is accomplished with a single macro
+<br/>
+<span class="pre-in-pp">
+ .HEADING_STYLE&nbsp;&lt;level&gt;
+</span>
+where <kbd>&lt;level&gt;</kbd> is the numeric heading level to which
+the style applies.
+</p>
+
+<p>
+HEADING_STYLE takes any or all of the following arguments,
+which may be given in any order:
+<br/>
+<span class="pre defaults">
+ FAMILY &lt;family&gt; \
+ FONT &lt;font&gt; \
+ SIZE &lt;+|-size&gt; \
+ QUAD &lt;direction&gt; \
+ COLOR &lt;colour&gt; \
+ UNDERSCORE &lt;weight&gt; &lt;gap&gt; | NO_UNDERSCORE \
+ UNDERSCORE2 &lt;weight&gt; &lt;gap1&gt; &lt;gap2&gt; | NO_UNDERSCORE2 \
+ CAPS | NO_CAPS \
+ SMALLCAPS | NO_SMALLCAPS \
+ BASELINE_ADJUST &lt;amount to raise heading from the baseline&gt; \
+ NEEDS &lt;lines of text required beneath the heading&gt; \
+ PREFIX_CHAPTER [&lt;n&gt;] \
+ SPACE_AFTER | NO_SPACE_AFTER \
+ NUMBER | NO_NUMBER \
+ NO_SHIM | SHIM \
+ NO_FLEX | FLEX
+</span>
+</p>
+
+<p>
+You may enter your entire argument list on a single line, or, if it
+is very long, break it into shorter lines with the
+&#8220;line-continued&#8221; backslash (<kbd>\</kbd>), as shown
+above.
+</p>
+
+<p class="defaults" style="margin-bottom: 1em">
+The arguments to <kbd>FAMILY</kbd>, <kbd>FONT</kbd>,
+<kbd>SIZE</kbd>, <kbd>QUAD</kbd>, and
+<kbd>COLOR</kbd> are the same as
+those you&#8217;d give to the
+<a href="#docelement-control">control macros</a>
+ending in _FAMILY, _FONT, _SIZE, _QUAD, or _COLOR. See
+<a href="#control-macro-args">Arguments to the control macros</a>.
+</p>
+
+<p class="defaults" style="margin-bottom: 1em">
+<kbd>UNDERSCORE</kbd> and <kbd>UNDERSCORE2</kbd> require that a
+weight for the underscore be given, in points (decimal fractions
+allowed), but without the unit of measure <kbd>p</kbd> appended.
+They also require that the underscore&#8217;s distance from the
+baseline be supplied; in the case of UNDERSCORE2, an additional gap
+argument representing the distance between the two underscores must
+be provided.
+</p>
+
+<p class="defaults" style="margin-bottom: 1em">
+The <kbd>CAPS</kbd> argument capitalizes the text of a heading
+level in the body of a document but not in the Table of
+Contents, where capitalization of entries is controlled by
+<a href="tables-of-contents.html#toc-entry-style">TOC_ENTRY_STYLE&nbsp;&lt;n&gt;</a>.
+</p>
+
+<p class="defaults" style="margin-bottom: 1em">
+<kbd>BASELINE_ADJUST</kbd> allows you to raise a heading slightly
+above the baseline on which it would otherwise sit. For aesthetic
+reasons, it is often desirable to introduce a small amount of space
+between a heading and the text following it. Since headings are
+preceded by a blank line, it is preferable to move the heading
+upward than to lower the text following it. The argument to
+BASELINE_ADJUST is the amount by which to raise the heading. It
+requires no <kbd>+</kbd> or <kbd>-</kbd> sign, and must have a
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+appended to it.
+</p>
+
+<p class="defaults" style="margin-bottom: 1em">
+<kbd>NEEDS</kbd> lets you reserve the number of lines of text
+required beneath a heading, including fractions thereof (e.g.
+&#8220;1.5&#8221; for one line of text plus half a linespace).
+If a heading falls near the bottom margin and there isn&#8217;t
+sufficient room for both the heading and the reserved space, mom
+will break to a new page for the heading. A
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+should not be appended to the argument.
+<span class="note"><i>Note:</i></span> If you have
+<a href="goodies.html#dropcap">DROPCAP</a>s
+after headings, you must increase the value of <kbd>NEEDS</kbd>
+to match the number of dropcap lines.
+</p>
+
+<p class="defaults" style="margin-bottom: 1em">
+<kbd>PREFIX_CHAPTER</kbd> instructs mom to prefix the current
+chapter number to numbered headings. If mom is unable to determine
+a chapter number, she will ask for one.
+</p>
+
+<p class="defaults" style="margin-bottom: 1em">
+Note that using <kbd>PREFIX_CHAPTER</kbd> with an explicit chapter
+number will also set the chapter number for subsequent
+<a href="images.html#autolabel">automatically-generated image and pre-processor labels</a>
+as well.
+</p>
+
+<p class="defaults" style="margin-bottom: 1em">
+<kbd>SPACE_AFTER</kbd> inserts a blank line equal to the current
+<a href="definitions.html#leading">leading</a> after a HEADING.
+If you&#8217;d like a full linespace after a heading level, use
+<kbd>SPACE_AFTER</kbd>. If you&#8217;d like additional space before
+a heading level, you must introduce it yourself with
+<a href="typesetting.html#space">SPACE</a>
+or
+<a href="typesetting.html#ald">ALD</a>.
+</p>
+
+<p class="defaults" style="margin-bottom: 1em">
+<kbd>NUMBER</kbd> and <kbd>NO_NUMBER</kbd> allow you to determine
+whether mom prepends a hierarchic numbering scheme to a heading
+level in the body of a document. Numbering of Table of Contents
+entries is controlled separately with
+<a href="tables-of-contents.html#toc-entry-numbers">TOC_ENTRY_NUMBERS</a>.
+Mom also has a special macro to toggle whether to prefix a chapter
+number to numbered headings and Table of Contents entries,
+<a href="#prefix-chapter-number">PREFIX_CHAPTER_NUMBER</a>.
+</p>
+
+<p class="defaults" style="margin-bottom: 1em">
+<kbd>SHIM</kbd> is not necessary if shimming is enabled
+globally, which it is by default; it exists to re-enable
+shimming for the heading level if you have previously passed
+HEADING_STYLE&nbsp;<kbd>&lt;n&gt;</kbd> a <kbd>NO_SHIM</kbd>
+argument. The <kbd>FLEX</kbd> and <kbd>NO_FLEX</kbd> arguments work
+the same way if flex-spacing is enabled.
+</p>
+
+<p class="defaults" style="padding-bottom: .5em">
+The argument list is long, so you may want to break it into
+several lines by using the backslash character (<kbd>\</kbd>).
+Here&#8217;s an example of how you might style a level 1 heading:
+<br/>
+<span class="pre defaults">
+ .HEADING_STYLE 1 \
+ FONT B \
+ QUAD C \
+ UNDERSCORE .5 2p \
+ BASELINE_ADJUST 3p \
+ NUMBER
+</span>
+This creates a level-1 heading style that&#8217;s bold, centred,
+underscored and numbered, raised by 3 points from the baseline.
+</p>
+</div>
+</div>
+
+<!-- -PREFIX_CHAPTER_NUMBER- -->
+
+<div id="prefix-chapter-number" class="macro-id-overline" style="margin-top: -1em;">
+<h3 class="macro-id" style="text-transform: none; font-size: 105%;">Prefixing chapter numbers</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>PREFIX_CHAPTER_NUMBER</b> <kbd class="macro-args">&lt;none&gt; | &lt;chapter number as digit&gt; | &lt;anything&gt;</kbd>
+</div>
+
+<p>
+If, in addition to numbering heads, you want mom to prepend the
+chapter number, invoke <kbd>.PREFIX_CHAPTER_NUMBER</kbd>.
+</p>
+
+<p>
+When you invoke <kbd>.PREFIX_CHAPTER_NUMBER</kbd> without an
+argument, mom checks to see whether the argument you passed to <a
+href="docprocessing.html#chapter">CHAPTER</a> (if it&#8217;s been
+called) is a digit. If it isn&#8217;t (say you&#8217;ve numbered your
+chapter &#8220;One&#8221; instead of &#8220;1&#8221;), mom will
+abort with a request that you pass PREFIX_CHAPTER_NUMBER a digit
+representing the chapter number.
+</p>
+
+<p>
+After you invoke <kbd>.PREFIX_CHAPTER_NUMBER</kbd>, mom will prepend
+the chapter number to all headings you have requested be numbered
+with
+<a href="#heading-style"><kbd>.HEADING_STYLE &lt;n&gt; NUMBER</kbd></a>.
+Thus, assuming chapter number twelve (12):
+<br/>
+<span class="pre-in-pp">
+ 1. LEVEL 1 HEADING
+ 1.1. Level 2 heading
+</span>
+would become
+<br/>
+<span class="pre-in-pp">
+ 12.1. LEVEL 1 HEADING
+ 12.1.1. Level 2 heading
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If a chapter number is given to PREFIX_CHAPTER_NUMBER, automatically
+generated labels with a prepended chapter number are also affected.
+</p>
+</div>
+
+<p>
+In collated documents, mom automatically increments the digit used
+by PREFIX_CHAPTER_NUMBER by one (current chapter digit + 1) every
+time you invoke
+<a href="rectoverso.html#collate"><kbd>.COLLATE</kbd></a>,
+even if you&#8217;ve (temporarily) turned off the prefixing
+of chapter numbers. Thus, even if you number your chapters
+&#8220;One&#8221;, &#8220;Two&#8221;, &#8220;Three&#8221; instead of
+&#8220;1&#8221;, &#8220;2&#8221;, &#8220;3&#8221;, mom will Do The
+Right Thing with respect to numbering head (and label) elements
+in all collated chapters following the first invocation of
+PREFIX_CHAPTER_NUMBER (assuming, of course, that the collated
+chapters are in incrementing order; if not, you must put
+<br/>
+<span class="pre-in-pp">
+ .PREFIX_CHAPTER_NUMBER &lt;chapter number&gt;
+</span>
+somewhere after the invocation of COLLATE and before the first
+numbered head element of each collated document).
+</p>
+
+<p>
+PREFIX_CHAPTER_NUMBER can be disabled by passing it any argument
+other than a digit (e.g. (<kbd>OFF</kbd>, <kbd>QUIT</kbd>, <kbd>Q</kbd>,
+<kbd>X</kbd>...), although, as noted above, mom will keep,
+and&mdash;in the case of collated documents&mdash;increment the
+chapter number, allowing you to turn prefixing of chapter numbers to
+numbered head elements off and on according to your needs or whims.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Because PREFIX_CHAPTER_NUMBER takes an (optional) digit representing
+the chapter number, it&#8217;s use need not be restricted to
+<a href="docprocessing.html#doctype">DOCTYPE <kbd>CHAPTER</kbd></a>.
+You can use it with any document type. Furthermore, even if
+your doctype isn&#8217;t <kbd>CHAPTER</kbd>, you can identify
+the document as a chapter for the purposes of numbering head
+elements by invoking the macro
+<a href="docprocessing.html#chapter"><kbd>.CHAPTER</kbd></a>
+with a
+<a href="definitions.html#numericargument">numeric argument</a>
+in your document setup.
+</p>
+</div>
+<div class="rule-short"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="oldstyle-headings-intro" class="macro-group">Oldstyle headings</h2>
+
+<ul style="margin-left: -.5em;">
+ <li><a href="#oldstyle-headings">Macro: OLDSTYLE_HEADINGS</a></li>
+ <li><a href="#head">Macro: HEAD</a></li>
+ <li><a href="#subhead">Macro: SUBHEAD</a></li>
+ <li><a href="#subsubhead">Macro: SUBSUBHEAD</a></li>
+</ul>
+
+<p>
+In versions of mom prior to 2.0, headings were entered by their
+commonly used names, <i>viz.</i> HEAD, SUBHEAD, and SUBSUBHEAD. The
+new
+<a href="#heading-intro">HEADING</a>
+scheme allows for greater flexibility, and permits seamless
+integration with PDF output.
+</p>
+
+<p>
+Documents created with pre-2.0 versions may still use the oldstyle
+heading names, as may new documents, however there are some
+differences in their behaviour.
+</p>
+
+<p>
+Whenever mom encounters an oldstyle heading, she loads the default
+style formerly associated with the oldstyle name. See below for a
+description of the default styles in the sections
+<a href="#head">HEAD</a> (now HEADING 1),
+<a href="#subhead">SUBHEAD</a> (now HEADING 2),
+and
+<a href="#subsubhead">SUBSUBHEAD</a> (now HEADING 3).
+Mom also emits a message to stderr alerting you to what she&#8217;s
+doing.
+</p>
+
+<p>
+The control macros formerly associated with oldstyle headings are no
+longer present in mom&#8217;s macro file, which means that if you
+made changes to mom&#8217;s default for those headings, you must
+recreate the changes with the
+<a href="#heading-style">HEADING_STYLE</a>
+macro. The entire style need not be recreated, only those
+parameters that differed from mom&#8217;s defaults. Thus, if your
+HEADs were set flush left, instead of the oldstyle default, centred,
+but otherwise kept mom&#8217;s settings, you need only do
+<br/>
+<span class="pre-in-pp">
+ .HEADING_STYLE 1 QUAD L
+</span>
+</p>
+
+<div id="parahead" class="box-important">
+<p class="tip-top">
+<span class="important">Important:</span>
+The macro PARAHEAD is no longer available. You must create paragraph
+heads using the
+<a href="#heading">HEADING</a>
+macro. Mom will abort with an informational message whenever she
+encounters PARAHEAD. Assuming a heading level of 3 for your
+paraheads, the former defaults for PARAHEAD can be set up like this:
+<br/>
+<span class="pre-in-pp">
+ .HEADING STYLE 3 FONT BI SIZE -.25 \" For PRINTSTYLE TYPESET
+ .HEADING STYLE 3 FONT I SIZE +0 \" For PRINTSTYLE TYPEWRITE
+</span>
+Equally, the macro NUMBER_PARAHEADS is no longer available. You
+must enable numbering of the correct level for paraheads with
+HEADING_STYLE. Again assuming a heading level of 3 for paraheads,
+it&#8217;s simply done:
+<br/>
+<span class="pre-in-pp">
+ .HEADING_STYLE 3 NUMBER
+</span>
+</p>
+
+<h3 id="parahead-usage" class="docs" style="text-transform: none; margin-top: -1em">Correct usage of paraheads</h3>
+
+<p style="margin-top: .5em">
+It is tempting to choose an arbitrary heading level for paraheads,
+since they are sometimes needed out-of-sequence; for example,
+immediately after a main head (level-1) in a document that
+subsequently requires subheads (level-2). In such a circumstance,
+choosing level-3 for all your paraheads might seem to make sense,
+but in fact doesn&#8217;t, since it disrupts the hierarchy of
+both the Table of Contents (if your document has one) and the PDF
+outline.
+</p>
+
+<p>
+Correct use of the <kbd>PARAHEAD</kbd> option to HEADING under such
+circumstances requires always assigning <kbd>PARAHEAD</kbd> to
+the next logical level in the heading hierarchy. For example, if
+there are no headings before the parahead, it should be assigned to
+level-1. If subsequently there is a main head to be followed by
+more paraheads, the main head should be level-1, and the paraheads
+level-2. This will almost certainly require assigning new style
+parameters to level-1 (with
+<a href="#heading-style">HEADING_STYLE</a>)
+and to the level now being used for paraheads. The following
+example demonstrates.
+<br/>
+<span class="pre-in-pp">
+ .HEADING_STYLE 1 FONT BI SIZE +.25 \" parahead style, level-1
+ .PP
+ .HEADING 1 PARAHEAD &lt;parahead&gt;
+ &lt;paragraph text&gt;
+ .PP
+ .HEADING 1 PARAHEAD &lt;parahead&gt;
+ &lt;paragraph text&gt;
+ \# main head style, level-1
+ .HEADING_STYLE 1 FONT B SIZE +3 QUAD CENTER UNDERSCORE .5 2p
+ .HEADING_STYLE 2 FONT BI SIZE +.25 \" parahead style, level-2
+ .HEADING 1 &lt;main head&gt;
+ .PP
+ &lt;paragraph text&gt;
+ .PP
+ .HEADING 2 PARAHEAD &lt;parahead&gt;
+ &lt;paragraph text&gt;
+</span>
+</p>
+</div>
+
+<!-- -OLDSTYLE_HEADINGS - -->
+
+<div class="macro-id-overline">
+<h3 id="oldstyle-headings" class="macro-id">OLDSTYLE HEADINGS</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>OLDSTYLE_HEADINGS</b>
+</div>
+
+<p>
+OLDSTYLE_HEADINGS requires no argument. It instructs mom to set the
+first three levels of heading to the parameters of her old defaults
+for HEAD, SUBHEAD, and SUBSUBHEAD. Use of OLDSTYLE_HEADINGS will
+also prevent mom from generating the message she issues the first
+time she encounters HEAD, SUBHEAD, and SUBSUBHEAD.
+</p>
+
+<!-- -HEAD- -->
+
+<div id="head" class="box-macro-args">
+Macro: <b>HEAD</b> <kbd class="macro-args">[ NAMED &lt;id&gt; ] &quot;&lt;text of head&gt;&quot; &quot;&lt;another line&gt;&quot;...</kbd>
+</div>
+
+<p>
+When invoked for the first time, with or without
+<a href="oldstyle-headings">OLDSTYLE_HEADINGS</a>,
+HEAD sets the parameters for level-1 headings to mom&#8217;s old
+HEAD defaults, then prints the head as a level-1 heading.
+The <kbd>NAMED &lt;id&gt;</kbd> optional argument is explained in
+the description of
+<a href="#heading">HEADING</a>.
+</p>
+
+<p>
+If, prior to invoking HEAD, you have given any parameters to level-1
+heads with
+<a href="#heading-style">HEADING STYLE</a>,
+they will be preserved; any you give afterwards will be respected.
+</p>
+
+<p>
+The former style defaults for HEAD were:
+<br/>
+<span class="pre-in-pp">
+ FAMILY = prevailing document family
+ FONT = bold (TYPESET); roman (TYPEWRITE)
+ SIZE = +1 (TYPESET); +0 (TYPEWRITE)
+ QUAD = C
+ UNDERSCORE .5 2p
+ CAPS
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+The macro NUMBER_HEADS from pre-2.0 versions of mom, can still be
+used, though it is now a wrapper for
+<br/>
+<span class="pre-in-pp">
+ .HEADING_STYLE 1 NUMBER
+</span>
+Mom will alert you to this on stderr.
+</p>
+</div>
+
+<!-- -SUBHEAD- -->
+
+<div id="subhead" class="box-macro-args">
+Macro: <b>SUBHEAD</b> <kbd class="macro-args">[ NAMED &lt;id&gt; ] &quot;&lt;text of head&gt;&quot; &quot;&lt;another line&gt;&quot;...</kbd>
+</div>
+
+<p>
+When invoked for the first time, with or without
+<a href="oldstyle-headings">OLDSTYLE_HEADINGS</a>,
+SUBHEAD sets the parameters for level-2 headings to mom&#8217;s old
+SUBHEAD defaults, then prints the subhead as a level-2 heading.
+The <kbd>NAMED &lt;id&gt;</kbd> optional argument is explained in
+the description of
+<a href="#heading">HEADING</a>.
+</p>
+
+<p>
+The former style defaults for SUBHEAD were:
+<br/>
+<span class="pre-in-pp">
+ FAMILY = prevailing document family
+ FONT = bold (TYPESET); italic, i.e. underlined (TYPEWRITE)
+ SIZE = +.5 (TYPESET); +0 (TYPEWRITE)
+ QUAD = L
+ BASELINE_ADJUST = 1/8 the current leading
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+The macro NUMBER_SUBHEADS from pre-2.0 versions of mom, can still be
+used, though it is now a wrapper for
+<br/>
+<span class="pre-in-pp">
+ .HEADING_STYLE 2 NUMBER
+</span>
+Mom will alert you to this on stderr.
+</p>
+</div>
+
+<!-- -SUBSUBHEAD- -->
+
+<div id="subsubhead" class="box-macro-args">
+Macro: <b>SUBSUBHEAD</b> <kbd class="macro-args">[ NAMED &lt;id&gt; ] &quot;&lt;text of head&gt;&quot; &quot;&lt;another line&gt;&quot;...</kbd>
+
+</div>
+
+<p>
+When invoked for the first time, with or without
+<a href="oldstyle-headings">OLDSTYLE_HEADINGS</a>,
+SUBSUBHEAD sets the parameters for level-3 headings to mom&#8217;s old
+SUBSUBHEAD defaults, then prints the subsubhead as a level-3 heading.
+The <kbd>NAMED &lt;id&gt;</kbd> optional argument is explained in
+the description of
+<a href="#heading">HEADING</a>.
+</p>
+
+<p>
+The former style defaults for SUBSUBHEAD were:
+<br/>
+<span class="pre-in-pp">
+ FAMILY = prevailing document family
+ FONT = italic (TYPESET); roman (TYPEWRITE)
+ SIZE = +.5 (TYPESET); +0 (TYPEWRITE)
+ QUAD = L
+ BASELINE_ADJUST = 1/8 the current leading
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+The macro NUMBER_SUBSUBHEADS from pre-2.0 versions of mom, can still be
+used, though it is now a wrapper for
+<br/>
+<span class="pre-in-pp">
+ .HEADING_STYLE 3 NUMBER
+</span>
+Mom will alert you to this on stderr.
+</p>
+</div>
+
+<div class="rule-short"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="linebreak-intro" class="macro-group">Linebreaks (section breaks)</h2>
+
+<ul style="margin-left: -.5em;">
+ <li><a href="#linebreak">Tag: LINEBREAK</a></li>
+ <li><a href="#linebreak-control">Linebreak control macros and defaults</a></li>
+</ul>
+
+<p>
+Linebreaks (&#8220;author linebreaks&#8221;, &#8220;section
+breaks&#8221;) are gaps in the vertical flow of running text that
+indicate a shift in content (e.g. a scene change in story). They
+are frequently set off by typographic symbols, sometimes whimsical
+in nature.
+</p>
+
+<!-- -LINEBREAK- -->
+
+<div class="macro-id-overline">
+<h3 id="linebreak" class="macro-id">LINEBREAK</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>LINEBREAK</b>
+</div>
+<p class="alias" style="margin-bottom: 0;">
+<i>Alias:</i> <b>SECTION</b>
+</p>
+
+<p>
+LINEBREAK takes no arguments. Simply invoke it (on a line by
+itself, of course) whenever you want to insert an author linebreak.
+</p>
+
+<div class="defaults-container" style="background-color: #ded4bd; border: none;">
+<h3 id="linebreak-control" class="docs defaults">LINEBREAK control macros and defaults</h3>
+
+<p class="defaults">
+By default, mom marks
+<a href="definitions.html#linebreak">author linebreaks</a>
+with three centred asterisks (stars) in the prevailing colour of the
+document (by default, black). You can alter this with the control
+macros
+</p>
+<ol style="margin-top: .5em; padding-bottom: .5em;">
+ <li><a href="#linebreak-char">LINEBREAK_CHAR</a></li>
+ <li><a href="#linebreak-color">LINEBREAK_COLOR</a></li>
+</ol>
+</div>
+
+<h4 id="linebreak-char" class="docs" style="margin-top: -1.5em; margin-bottom: .5em;">1. Linebreak character</h4>
+<div class="box-macro-args">
+Macro: <b>LINEBREAK_CHAR</b> <kbd class="macro-args">[ &lt;character&gt; ] [ &lt;iterations&gt; [ &lt;vertical adjustment&gt; ] ]</kbd>
+</div>
+
+<p class="alias" style="margin-bottom: 0;">
+<i>Alias:</i> <b>SECTION_CHAR</b>
+</p>
+<p class="requires">
+&bull;&nbsp;The third optional argument requires a
+<a href="definitions.html#unitofmeasure">unit of measure</a>.
+</p>
+
+<p>
+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.
+</p>
+
+<p>
+The first argument is any valid groff character (e.g. <kbd>*</kbd>
+[an asterisk], <kbd>\[dg]</kbd> [a dagger], <kbd>\f[ZD]\N'141'\fP</kbd>
+[an arbitrary character from Zapf Dingbats], <kbd>\l'4P'</kbd> [a
+4-pica long rule]). Mom sets the character centred on the current
+line length. (See <kbd>man groff_char</kbd> for a list of all
+valid groff characters.)
+</p>
+
+<p>
+The second argument is the number of times to repeat the character.
+</p>
+
+<p>
+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&#8217;t sit on the
+<a href="definitions.html#baseline">baseline</a>
+(such as asterisks). The argument must be preceded by a plus or
+minus sign, and must include a unit of measure.
+</p>
+
+<p>
+If you enter LINEBREAK_CHAR with no arguments, sections of
+text will be separated by two blank lines when you invoke
+<kbd>.LINEBREAK</kbd>.
+</p>
+
+<p>
+Mom&#8217;s default for LINEBREAK_CHAR is
+<br/>
+<span class="pre-in-pp">
+ .LINEBREAK_CHAR * 3 -3p
+</span>
+i.e. three asterisks, raised 3 points from their normal vertical
+position (for
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPESET</kbd></a>;
+the vertical adjustment is -2 points for
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPEWRITE</kbd></a>).
+</p>
+
+<h4 id="linebreak-color" class="docs" style="margin-top: -.25em; margin-bottom: .5em;">2. Linebreak colour</h4>
+
+<div class="box-macro-args">
+Macro: <b>LINEBREAK_COLOR</b> <kbd class="macro-args">&lt;colourname&gt;</kbd>
+</div>
+<p class="alias" style="margin-bottom: 0;">
+<i>Alias:</i> <b>SECTION_COLOR</b>
+</p>
+
+<p>
+To change the colour of the linebreak character(s), simply invoke
+<kbd>.LINEBREAK_COLOR</kbd> with the name of a colour pre-defined
+(or &#8220;initialized&#8221;) with
+<a href="color.html#newcolor">NEWCOLOR</a>
+or
+<a href="color.html#xcolor">XCOLOR</a>.
+
+</p>
+
+<div class="rule-short"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="quote-intro" class="macro-group">Quotes (line for line, poetry or code)</h2>
+
+<ul style="margin-left: -.5em;">
+ <li><a href="#quote-description">Introduction</a>
+ <ul style="margin-left: -1.25em">
+ <li><a href="#quote-spacing">Quote spacing</a>
+ <ul style="margin-left: -1.25em">
+ <li><a href="#quote-spacing-notes">Notes on quote spacing</a></li>
+ </ul></li>
+ <li><a href="#no-shim">Disable shimming of quotes and blockquotes</a></li>
+ <li><a href="#float-quote">Keeping quotes and blockquotes together as a block</a></li>
+ <li><a href="#label-caption">Labelling/captioning quotes and blockquotes</a></li>
+ </ul></li>
+ <li><a href="#quote">Tag: QUOTE</a></li>
+ <li><a href="#quote-control">Quote control macros and defaults</a></li>
+</ul>
+
+<p id="quote-decription">
+<a href="definitions.html#quote">Quotes</a>
+are always set in
+<a href="definitions.html#filled">nofill mode</a>,
+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
+<a href="#blockquote-intro">Blockquotes</a>
+for how quotes, in the present sense, differ from longer passages of
+cited text.)
+</p>
+
+<p>
+Since mom originally came into being to serve the needs of creative
+writers (i.e. novelists, short story writers, etc.&mdash;not
+to cast aspersions on the creativity of mathematicians and
+programmers), she sets quotes in italics
+<a href="docprocessing.html#printstyle">(PRINTSTYLE <kbd>TYPESET</kbd>)</a>
+or underlined
+<a href="docprocessing.html#printstyle">(PRINTSTYLE <kbd>TYPEWRITE</kbd>)</a>,
+indented from the left margin. Obviously, she&#8217;s thinking
+&#8220;quotes from poetry or song lyrics&#8221;, but with the
+<a href="#quote-control">QUOTE control macros</a>
+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
+<a href="#code">CODE</a>
+for a convenience macro to assist in including code snippets in
+documents.)
+</p>
+
+<h3 id="quote-spacing" class="docs">QUOTE spacing</h3>
+
+<p>
+Besides indenting quotes, mom further sets them off from
+<a href="definitions.html#running">running text</a>
+with a small amount of vertical whitespace top and bottom. In
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPEWRITE</kbd></a>,
+this is always one full linespace. In
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPESET</kbd></a>,
+it&#8217;s 1/2 of the prevailing
+<a href="definitions.html#leading">leading</a>
+if the quote fits fully on the page (i.e. with running text above
+and below it), otherwise it&#8217;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
+<a href="#always-fullspace-quotes">ALWAYS_FULLSPACE_QUOTES</a>.
+</p>
+
+<div class="box-tip">
+<h3 id="quote-spacing-notes" class="docs" style="padding-top: 9px; font-size: 95%;">Notes on quote spacing</h3>
+
+<p style="margin-top: .5em">
+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
+(<a href="docprocessing.html#shim-vs-flex">shim or flex-spacing</a>)
+around the quotes to make sure the whitespace is equal, top and
+bottom. When shimming is enabled, this may result in multiple
+quotes or blockquotes on the same page being spaced slightly
+differently.
+</p>
+
+<h4 id="no-shim" class="docs">Disable shimming/flex-spacing of quotes and blockquotes</h4>
+
+<p class="tip-bottom">
+If you don&#8217;t want the behaviour
+described above (i.e., you don&#8217;t want mom putting additional shim
+or flex-spacing around quotes and
+blockquotes), put <kbd>.NO_SHIM</kbd> or/and <kbd>.NO_FLEX</kbd>
+in the style sheet section of your document (i.e. after PRINTSTYLE
+but before START), which will disable shimming or/and flex-spacing
+globally for all tags, or disable shimming/flex-spacing
+on a per-instance basis prior to <kbd>.QUOTE</kbd> or
+<kbd>.BLOCKQUOTE</kbd>, re-enabling it after the terminating
+<kbd>.QUOTE&nbsp;OFF</kbd> or <kbd>.BLOCKQUOTE&nbsp;OFF</kbd> with
+<kbd>.NO_SHIM&nbsp;OFF</kbd> or <kbd>.NO_FLEX&nbsp;OFF</kbd>.
+</p>
+
+</div>
+
+<h3 id="float-quote" class="docs">Keeping QUOTEs and BLOCKQUOTEs together as a block</h3>
+
+<p>
+The text of quotes and blockquotes is output immediately, and may therefore
+start on one page and finish on the next. If you wish to keep the
+text together as a block, deferred to the following page if the
+block doesn&#8217;t all fit on one page, wrap
+<kbd><span class="nobr">(BLOCK)QUOTE...(BLOCK)QUOTE&nbsp;OFF</span></kbd>
+inside a
+<a href="images.html#floats-intro">float</a>.
+If you further wish to force a page break before the floated quote
+or blockquote (leaving whitespace at the bottom of the page, pass
+<a href="images.html#float">FLOAT</a>
+the <kbd>FORCE</kbd> argument.
+<span class="pre-in-pp">
+ .FLOAT FORCE
+ .QUOTE
+ Fly me to the moon
+ And let me play among the stars
+ Let me see what life is like
+ On Jupiter and Mars
+ .QUOTE END
+ .FLOAT OFF
+</span>
+</p>
+
+<h3 id="label-caption" class="docs">Labelling/captioning quotes and blockquotes</h3>
+
+<p>
+Quotes and blockquotes may be labelled and/or captioned identically to
+<a href="images.html#floats-intro">floats</a>
+with the macros
+<a href="images.html#label">LABEL</a>
+and
+<a href="images.html#caption">CAPTION</a>
+(see
+<a href="images.html#float-label-caption">Labelling and captioning floats</a>).
+</p>
+
+<!-- -QUOTE- -->
+
+<div class="macro-id-overline">
+<h3 id="quote" class="macro-id">QUOTE</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>QUOTE</b> <kbd class="macro-args">[ ADJUST +|-&lt;space&gt; ] | &lt;anything&gt;</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;The argument to <kbd style="font-style: normal">ADJUST</kbd> requires a
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+QUOTE is a toggle macro. To begin a section of quoted text, invoke
+it with no argument, then type in your quote. When you&#8217;re
+finished, invoke <kbd>.QUOTE</kbd> with any argument (e.g. <kbd>OFF,
+END, X, Q</kbd>...) to turn it off. Example:
+<br/>
+<span class="pre-in-pp">
+ .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
+</span>
+Mom does her best to equalize whitespace around quotes and make
+sure the line following it falls on a valid baseline. On occasion,
+you may need to tweak the quote placement slightly, which is done
+by passing <kbd>ADJUST</kbd> to QUOTE with a plus or minus value.
+The quote will be lowered (<kbd>+</kbd>) or raised (<kbd>-</kbd>)
+<i>within the space allotted for it</i> by the given amount. For
+example, to lower a quote slightly within the space allotted for it,
+you&#8217;d do
+<br/>
+<span class="pre-in-pp">
+ .QUOTE ADJUST +3p
+ There was a soprano named Golda
+ Whose lovers grew colda and colda
+ For during love-making
+ She'd sing the earth-shaking
+ Love theme from Tristan und Isolde.
+ .QUOTE off
+</span>
+</p>
+
+<div class="defaults-container" style="background-color: #ded4bd; border: none;">
+
+<h3 id="quote-control" class="docs defaults">QUOTE control macros and defaults</h3>
+
+<ol style="margin-top: .5em; padding-bottom: .5em;">
+ <li><a href="#quote-general">Family/font/size/leading/colour/indent</a></li>
+ <li><a href="#always-fullspace-quotes">Spacing above and below quotes (typeset only)</a></li>
+ <li><a href="#underline-quotes">Underlining quotes (typewrite only)</a></li>
+</ol>
+</div>
+
+<h4 id="quote-general" class="docs" style="margin-top: -1.5em; margin-bottom: .5em;">1. Family/font/size/colour/indent</h4>
+
+<div class="defaults-container" style="padding-bottom: 8px;">
+<p class="defaults" style="padding-top: 6px;">
+See
+<a href="#control-macro-args">Arguments to the control macros</a>.
+<br/>
+The following QUOTE control macros may also be
+<a href="#grouping">grouped</a>
+using QUOTE_STYLE. If you do so, <kbd>QUOTE_LEFT</kbd>, <kbd>QUOTE_CENTER</kbd>,
+and <kbd>QUOTE_RIGHT</kbd> must be entered as:
+<br/>
+<kbd>&nbsp;&nbsp;&nbsp;QUAD LEFT</kbd><br/>
+<kbd>&nbsp;&nbsp;&nbsp;QUAD CENTER</kbd><br/>
+<kbd>&nbsp;&nbsp;&nbsp;QUAD RIGHT</kbd>
+</p>
+
+<span class="pre defaults">
+.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)
+<a id="quote-autolead">.QUOTE_AUTOLEAD default = none; leading of quotes is the same as paragraphs </a>
+.QUOTE_COLOR default = black
+.QUOTE_INDENT (see below, "Quote indent")
+.QUOTE_LEFT -+ Quad direction of quote.
+.QUOTE_CENTER | LEFT observes QUOTE_INDENT;
+.QUOTE_RIGHT -+ CENTER and RIGHT do not
+</span>
+</div>
+
+<h4 id="quote-indent" class="docs" style="margin-top: -1.5em;">Quote indent</h4>
+
+<p>
+<kbd>QUOTE_INDENT</kbd> takes one of two kinds of argument: an integer
+representing the amount by which to multiply the argument passed to
+<a href="#para-indent"><kbd>.PARA_INDENT</kbd></a>
+(by default, 2
+<a href="definitions.html#em">ems</a>
+for TYPESET, 3
+<a href="definitions.html#picaspoints">picas</a>
+for TYPEWRITE) to arrive at the quote indent, or a distance with a
+<a href="definitions.html#unitofmesaure">unit of measure</a>
+appended.
+</p>
+
+<p>
+Be careful when using QUOTE. If a quote is set flush left (the
+default), the QUOTE_INDENT applies only to the left margin. Because
+quote lines are output as-is (see
+<a href="definitions.html#no-fill">no-fill mode</a>),
+they do not respect line length and may extend beyond a document's
+right margin. Similarly, if a quote is being set flush right, the
+indent applies only to the right margin; long lines may extend into
+the left margin. Centered quotes are never indented, so long lines
+may extend beyond both the left and right margins.
+</p>
+
+<p>
+The default value for QUOTE_INDENT is 3 (for
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPESET</kbd></a>)
+and 1 (for
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPEWRITE</kbd></a>).
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If your PARA_INDENT is 0 (i.e. no indenting of the first line of
+paragraphs), you <i>must</i> set a QUOTE_INDENT yourself, with a
+unit of measure appended to the argument. Mom has no default for
+QUOTE_INDENT if paragraph first lines are not being indented.
+</p>
+</div>
+
+<h4 id="always-fullspace-quotes" class="docs" style="margin-top: -.25em;">2. Spacing above and below quotes (typeset only)</h4>
+
+<p>
+If you&#8217;d like mom always to put a full linespace above and
+below quotes, invoke
+<br/>
+<span class="pre-in-pp">
+ .ALWAYS_FULLSPACE_QUOTES
+</span>
+with no argument. If you wish to restore mom&#8217;s
+default behaviour regarding the spacing of quotes (see
+<a href="#quote-spacing">Quote spacing</a>),
+invoke the macro with any argument (<kbd>OFF</kbd>, <kbd>QUIT</kbd>,
+<kbd>END</kbd>, <kbd>X</kbd>...)
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+This macro also sets mom&#8217;s spacing policy for
+<a href="#blockquote-intro">blockquotes</a>.
+</p>
+</div>
+
+<h4 id="underline-quotes" class="docs" style="margin-top: -.25em;">3. Underlining quotes (typewrite only)</h4>
+
+<p>
+By default in
+<a href="docprocessing.html#printstyle">PRINTSTYLE TYPEWRITE</a>,
+mom underlines quotes. If you&#8217;d rather she didn&#8217;t,
+invoke <kbd>.UNDERLINE_QUOTES</kbd> with any argument
+(<kbd>OFF</kbd>, <kbd>QUIT</kbd>, <kbd>END</kbd>, <kbd>X</kbd>...)
+to disable the feature. Invoke it without an argument to restore
+mom&#8217;s default underlining of quotes.
+</p>
+
+<p>
+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
+<a href="typesetting.html#font">FT I</a>.
+Furthermore, since mom underlines all instances of italics by
+default in PRINTSTYLE&nbsp;TYPEWRITE, you must also make sure that
+ITALIC_MEANS_ITALIC is enabled (see
+<a href="docprocessing.html#typewrite-control">PRINTSTYLE TYPEWRITE control macros</a>).
+</p>
+
+<div class="rule-short"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="blockquote-intro" class="macro-group">Blockquotes (cited material)</h2>
+
+<ul style="margin-left: -.5em;">
+ <li><a href="#blockquote-description">Introduction</a></li>
+ <li><a href="#blockquote">Tag: BLOCKQUOTE</a></li>
+ <li><a href="#blockquote-control">BLOCKQUOTE control macros</a></li>
+</ul>
+
+<p id="blockquote-description">
+<a href="definitions.html#blockquote">Blockquotes</a>
+are used to cite passages from another author&#8217;s work. So that
+they stand out well from
+<a href="definitions.html#running">running text</a>,
+mom indents them from both the left and right margins and sets them
+in a different point size
+(<a href="docprocessing.html#printstyle">PRINTSTYLE TYPESET</a>
+only).
+<a href="definitions.html#outputline">Output lines</a>
+are
+<a href="definitions.html#filled">filled</a>,
+and, by default,
+<a href="definitions.html#quad">quadded</a>
+left.
+</p>
+
+<p>
+Besides indenting blockquotes, mom further sets them off from
+running text with a small amount of vertical whitespace top and
+bottom. (See
+<a href="#quote-spacing">Quote spacing</a>
+for a complete explanation of how this is managed, and how
+to control it.)
+</p>
+
+<p>
+Additional information concerning blockquotes, floats, and labelling
+blockquotes can be found in the sections
+<a href="#float-quote">Keeping quotes and blockquotes together as a block</a>,
+and
+<a href="#label-caption">Labelling/captioning quotes and blockquotes</a>.
+</p>
+
+<!-- -BLOCKQUOTE- -->
+
+<div class="macro-id-overline">
+<h3 id="blockquote" class="macro-id">BLOCKQUOTE</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>BLOCKQUOTE</b> <kbd class="macro-args">[ ADJUST +|-&lt;space&gt; ] | &lt;anything&gt;</kbd>
+</div>
+
+<p class="alias" style="margin-bottom: 0;">
+<i>Aliases: </i> <b>CITE, CITATION</b>
+</p>
+
+<p class="requires">
+&bull;&nbsp;The argument to <kbd style="font-style: normal">ADJUST</kbd> requires a
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+BLOCKQUOTE is a toggle macro. To begin a cited passage, invoke
+the tag with no argument, then type in your blockquote. When
+you&#8217;re finished, invoke <kbd>.BLOCKQUOTE</kbd> with any
+argument (e.g. <kbd>OFF, END, X, Q</kbd>...) to turn it off.
+Example:
+<br/>
+<span class="pre-in-pp">
+ .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
+ \[em]George W. Bush
+ .BLOCKQUOTE END
+</span>
+If the cited passage runs to more than one paragraph, you must
+introduce each paragraph&mdash;including the first&mdash;with
+<kbd><a href="#pp">.PP</a></kbd>.
+</p>
+
+<p>
+Mom does her best to equalize whitespace around blockquotes and make
+sure the line following it falls on a valid baseline. On occasion,
+you may need to tweak the blockquote placement slightly, which is
+done by passing <kbd>ADJUST</kbd> to BLOCKQUOTE with a plus or minus
+value. The blockquote will be lowered (<kbd>+</kbd>) or raised
+(<kbd>-</kbd>) <i>within the space allotted for it</i> by the given
+amount. For example, to raise a blockquote slightly within the
+space allotted for it, you&#8217;d do
+<br/>
+<span class="pre-in-pp">
+ .BLOCKQUOTE ADJUST -3p
+ True! - nervous - very, very dreadfully nervous I had been and
+ am; but why will you say that I am mad? The disease had sharpened
+ my senses - not destroyed - not dulled them.
+ .RIGHT
+ \[em]Edgar Allen Poe, The Tell-Tale Heart
+ .QUOTE off
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+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 or end with
+BLOCKQUOTE_.
+</p>
+</div>
+
+<div class="defaults-container" style="background-color: #ded4bd; border: none;">
+<h3 id="blockquote-control" class="docs defaults">BLOCKQUOTE control macros and defaults</h3>
+
+<ol style="margin-top: .5em; padding-bottom: .5em;">
+ <li><a href="#blockquote-general">Family/font/size/leading/colour/quad/indent</a></li>
+ <li><a href="#bq-always-fullspace-quotes">Spacing above and below (typeset only)</a></li>
+</ol>
+</div>
+
+<h4 id="blockquote-general" class="docs" style="margin-top: -1.5em; margin-bottom: .5em;">1. Family/font/size/colour/quad/indent</h4>
+
+<div class="defaults-container" style="padding-bottom: 8px;">
+<p class="defaults" style="padding-top: 6px;">
+See
+<a href="#control-macro-args">Arguments to the control macros</a>.
+<br/>
+The following BLOCKQUOTE control macros may also be
+<a href="#grouping">grouped</a>
+using BLOCKQUOTE_STYLE.
+</p>
+<span class="pre defaults">
+.BLOCKQUOTE_FAMILY default = prevailing document family; default is Times Roman
+.BLOCKQUOTE_FONT default = roman
+.BLOCKQUOTE_SIZE default = -1 (point)
+<a id="blockquote-autolead">.BLOCKQUOTE_AUTOLEAD default = none; leading of blockquotes is the same as paragraphs</a>
+.BLOCKQUOTE_COLOR default = black
+.BLOCKQUOTE_QUAD default = left
+.BLOCKQUOTE_INDENT (see below)
+</span>
+</div>
+
+<h4 id="blockquote-indent" class="docs" style="margin-top: -1.5em;">Blockquote indent</h4>
+
+<p>
+<kbd>BLOCKQUOTE_INDENT</kbd> takes one of two kinds of argument: an
+integer representing the amount by which to multiply the argument
+passed to
+<a href="#para-indent">PARA_INDENT</a>
+(by default, 2
+<a href="definitions.html#em">ems</a>
+for TYPESET, 3
+<a href="definitions.html#picaspoints">picas</a>
+for TYPEWRITE) to arrive at the blockquote indent, or a distance with a
+<a href="definitions.html#unitofmesaure">unit of measure</a>
+appended. Both result in blockquotes being indented equally from
+the left and right margins.
+</p>
+
+<p>
+The default value for BLOCKQUOTE_INDENT is 3 (for
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPESET</kbd></a>)
+and 1 (for
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPEWRITE</kbd></a>).
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If your PARA_INDENT is 0 (i.e. no indenting of the first line of
+paragraphs), you must set a BLOCKQUOTE_INDENT yourself, with
+a unit of measure appended to the argument. Mom has no default for
+BLOCKQUOTE_INDENT if paragraph first lines are not being indented.
+</p>
+</div>
+
+
+
+<h4 id="bq-always-fullspace-quotes" class="docs">2. Spacing above and below blockquotes (typeset only)</h4>
+
+<p>
+If you&#8217;d like mom always to put a full linespace above and
+below blockquotes, invoke
+<br/>
+<span class="pre-in-pp">
+ .ALWAYS_FULLSPACE_QUOTES
+</span>
+with no argument. If you wish to restore mom&#8217;s default
+behaviour regarding the spacing of blockquotes (see
+<a href="#quote-spacing">Quote spacing</a>),
+invoke the macro with any argument (<kbd>OFF</kbd>, <kbd>QUIT</kbd>,
+<kbd>END</kbd>, <kbd>X</kbd>...).
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+This macro also sets mom&#8217;s spacing policy for
+<a href="#quote-intro">quotes</a>.
+</p>
+</div>
+
+<div class="rule-short"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="code-intro" class="macro-group">Inserting code into a document</h2>
+
+<ul style="margin-left: -.5em;">
+ <li><a href="#code">Tag: CODE</a></li>
+ <li><a href="#code-control">CODE control macros and defaults</a></li>
+</ul>
+
+<p>
+CODE is a convenience macro that facilitates entering code blocks
+into documents. Its use is not restricted to documents created
+using mom&#8217;s document processing macros; it can be used for
+&#8220;manually&#8221; typeset documents as well.
+</p>
+
+<div class="macro-id-overline">
+<h3 id="code" class="macro-id">CODE</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>CODE</b> <kbd class="macro-args">[BR | BREAK | SPREAD] &lt;anything&gt;</kbd>
+</div>
+
+<p class="requires" style="font-style: normal">
+Inline escape: <b><kbd>\*[CODE]</kbd></b>
+</p>
+
+<p>
+When you invoke the macro CODE or insert
+<kbd><span class="nobr">\*[CODE]</span></kbd> into running text, mom switches to
+a
+<a href="definitions.html#fixedwidthfont">fixed-width font</a>
+(Courier, by default) and turns
+<a href="goodies.html#smartquotes">SMARTQUOTES</a>
+off.
+</p>
+
+<p>
+If your code includes the backslash character, which is
+groff&#8217;s escape character, you will have to change the
+escape character temporarily to something else with the macro
+<a href="goodies.html#esc-char">ESC_CHAR</a>.
+Mom has no way of knowing what special characters you&#8217;re going
+to use in code snippets, therefore she cannot automatically replace
+the escape character with something else.
+</p>
+
+<p>
+The correct order for changing the escape character inside
+<kbd>CODE</kbd> is
+<span class="pre-in-pp">
+ .CODE
+ .ESC_CHAR character
+ &lt;code&gt;
+ .ESC_CHAR \
+ .CODE OFF
+</span>
+Be aware that changing the escape character prevents subsequent
+macros, which require that the backslash be the escape character,
+from functioning correctly. Therefore, do not introduce any macros
+into your CODE block without first restoring the escape character to
+its default.
+</p>
+
+<p>
+Alternatively, you can enter the backslash character as
+<kbd>\e</kbd> or <kbd>\\</kbd> (two backslashes), which tells groff
+to print a literal backslash.
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="tip">Note:</span>
+<kbd>.CODE</kbd> does not cause a line break when
+you&#8217;re in a
+<a href="definitions.html#filled">fill mode</a>
+(i.e.
+<a href="typesetting.html#justify">JUSTIFY</a>
+or
+<a href="typesetting.html#quad">QUAD</a>
+<kbd>LEFT, CENTER,</kbd> or <kbd>RIGHT</kbd>).
+If you want CODE to deposit a break, invoke <kbd>.CODE</kbd> with
+the argument <kbd>BR</kbd> (or <kbd>BREAK</kbd>). If, in addition
+to having mom break the line before <kbd>.CODE</kbd>, you want her
+to
+<a href="definitions.html#force">force justify</a>
+it as well, invoke <kbd>.CODE</kbd> with the argument,
+<kbd>SPREAD</kbd>. If, in addition to breaking the line before CODE
+you want a break afterwards, you must supply it manually with
+<a href="typesetting.html#br">BR</a>
+unless what follows immediately is a macro that automatically causes
+a break (e.g.
+<a href="#pp">PP</a>).
+</p>
+
+<p id="quote-code" class="tip-bottom">
+In all likelihood, if you want the situation described above (i.e. a
+break before and after CODE), what you probably want is to use
+<a href="quote">QUOTE</a>
+in conjunction with CODE, like this:
+<br/>
+<span class="pre-in-pp">
+ .QUOTE
+ .CODE
+ $ echo "Hello, world" | sed -e 's/Hello,/Goodbye, cruel/'
+ .QUOTE OFF
+</span>
+QUOTE takes care of breaking both the text and the code, as well as
+indenting the code and offsetting it from
+<a href="definitions.html#running">running text</a>
+with vertical whitespace. Notice that <kbd>.CODE</kbd>, above, has
+no corresponding <kbd>.CODE OFF</kbd>. <kbd>.CODE</kbd> inside a QUOTE
+does not require a terminating <kbd>.CODE&nbsp;OFF</kbd>, which risks
+introducing unwanted vertical whitespace.
+</p>
+</div>
+
+<p>
+Passing any argument other than <kbd>BR</kbd>, <kbd>BREAK</kbd> or
+<kbd>SPREAD</kbd> to CODE (e.g. <kbd>OFF</kbd>, <kbd>QUIT</kbd>,
+<kbd>END</kbd>, <kbd>X</kbd>, etc) turns CODE off and returns the
+family, font, and smartquotes back to their former state.
+</p>
+
+<h4 class="docs" style="font-size: 102%">Using <kbd>\*[CODE]</kbd> inline</h4>
+
+<p>
+<kbd><span class="nobr">\*[CODE]</span></kbd> invokes <kbd>.CODE</kbd>, allowing you to
+bracket code snippets inline. It does not accept the <kbd>BR</kbd>,
+<kbd>BREAK</kbd>, or <kbd>SPREAD</kbd> arguments. It is most useful
+for short snippets, as in the following example.
+<br/>
+<span class="pre-in-pp">
+ \*[CODE]apropos\*[CODE X] and \*[CODE]man&nbsp;-k\*[CODE X] are identical.
+</span>
+</p>
+
+<p>
+<kbd><span class="nobr">\*[CODE]</span></kbd> does not permit changing the escape
+character, so <kbd>\e</kbd> or a doubled backslash must be used.
+Furthermore, if your code starts with a period, you must enter it as
+&#8220;<kbd>\&amp;.</kbd>&#8221;.
+<br/>
+<span class="pre-in-pp">
+ Registers are created with the \*[CODE]\&amp;.nr\*[CODE X] request.
+</span>
+</p>
+
+<h4 class="docs" style="font-size: 102%; margin-top: -1em">CODE and punctuation</h4>
+
+<p>
+<kbd>.CODE&nbsp;OFF</kbd> automatically inserts a word space into
+running text. If your CODE block is to be followed by punctuation
+with the parameters of
+<a href="definitions.html#running">running text</a>,
+you must terminate the block with &#8220;<kbd>\c</kbd>&#8221; and
+enter the punctuation at the beginning of the next input line. If
+the punctuation mark is a period or an apostrophe, you must precede
+it with
+&#8220;<kbd>\&amp;</kbd>&#8221;.
+<br/>
+<span class="pre-in-pp">
+ ...for example,
+ .CODE
+ echo "Hello, world" | sed -e 's/Hello,/Goodbye, cruel/'\c
+ .CODE OFF
+ \&amp;. As this demonstrates...
+</span>
+Use of <kbd><span class="nobr">\*[CODE]</span></kbd> inline does not require
+the <kbd>\c</kbd>, however periods and apostrophes after
+<kbd><span class="nobr">\*[CODE&nbsp;X]</span></kbd> still need to be introduced
+with <kbd>\&amp;</kbd>, as in this example:
+<br/>
+<span class="pre-in-pp">
+ ...append the unit of measure \*[CODE]p\*[CODE&nbsp;OFF]\&amp;. New sentence...
+</span>
+</p>
+
+
+<div class="defaults-container" style="background-color: #ded4bd; border: none;">
+<h3 id="code-control" class="docs defaults">CODE control macros and defaults</h3>
+
+<ol style="margin-top: .5em; padding-bottom: .5em;">
+ <li><a href="#code-general">Family/Font/Colour</a></li>
+ <li><a href="#code-size">Size</a></li>
+</ol>
+</div>
+
+<h4 id="code-general" class="docs" style="margin-top: -1.5em; margin-bottom: .5em;">1. Family/font/colour</h4>
+
+<div class="defaults-container" style="padding-bottom: 8px;">
+<p class="defaults" style="padding-top: 6px;">
+See
+<a href="#control-macro-args">Arguments to the control macros</a>.
+<br/>
+The following CODE control macros may also be
+<a href="#grouping">grouped</a>
+using CODE_STYLE.
+</p>
+<span class="pre defaults">
+.CODE_FAMILY default = Courier
+.CODE_FONT default = roman; see Note
+.CODE_COLOR default = black
+
+Note: Unlike other control macros, CODE_FONT sets the code font for both
+PRINTSTYLE TYPESET and PRINTSTYLE TYPEWRITE.
+</span>
+</div>
+
+<h4 id="code-size" class="docs" style="margin-top: -1.25em;">2. Size</h4>
+
+<p>
+CODE_SIZE works a little differently from the other _SIZE macros
+(see <a href="#control-macro-args">Arguments to the control
+macros</a>). The argument you pass it is a percentage of the
+prevailing document point size. It does not require a prepended
+plus (<kbd>+</kbd>) or minus (<kbd>-</kbd>) sign, nor an appended
+percent sign (<kbd>%</kbd>). Thus, if you want the point size of your CODE font to be
+90% of the prevailing document point size, you enter:
+<br/>
+<span class="pre-in-pp">
+ .CODE_SIZE 90
+</span>
+Fixed-width fonts have notoriously whimsical
+<a href="definitions.html#xheight">x-heights</a>,
+meaning that they frequently look bigger (or, in some cases,
+smaller) than the type surrounding them, even if they&#8217;re
+technically the same point size. CODE_SIZE lets you choose a
+percentage of the prevailing point size for your fixed-width
+CODE font so it doesn&#8217;t look gangly or minuscule in relation
+to the type around it. All invocations of <kbd>.CODE</kbd> or
+<kbd><span class="nobr">\*[CODE]</span></kbd> will use this size, so that if you
+decide to change the prevailing point size of your document, the
+CODE font will be scaled proportionally.
+</p>
+
+<div class="rule-short"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="list-intro" class="macro-group">Nested lists</h2>
+
+<ul style="margin-left: -.5em;">
+ <li><a href="#list">Tag: LIST</a></li>
+ <li><a href="#item">Tag: ITEM</a></li>
+ <li><a href="#list-control">LIST control macros and defaults</a></li>
+</ul>
+
+<p>
+Lists are points or items of interest or importance that are
+separated from
+<a href="definitions.html#running">running text</a>
+by enumerators. Some typical enumerators are
+<a href="definitions.html#em">en-dashes</a>,
+<a href="definitions.html#bullet">bullets</a>,
+digits and letters.
+</p>
+
+<p>
+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 <kbd>.ITEM</kbd> followed by the text of the item.
+When a list is finished, you exit the list with
+<kbd>.LIST&nbsp;OFF</kbd> (or <kbd>QUIT</kbd>, <kbd>END</kbd>,
+<kbd>BACK</kbd>, etc.)
+</p>
+
+<p>
+By default mom starts each list with the enumerator flush with the
+left margin of running text that comes before it, like this:
+<br/>
+<span class="pre-in-pp">
+ My daily schedule needs organising. I can&#8217;t
+ seem to get everything done I want.
+ o an hour&#8217;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
+</span>
+In other words, mom does not, by default, indent entire lists.
+Indenting a list is controlled by the macro
+<a href="#shift-list">SHIFT_LIST</a>.
+(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.
+</p>
+
+<p>
+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 <kbd>.LIST&nbsp;OFF</kbd> (you may prefer to use
+<kbd>.LIST&nbsp;BACK</kbd>) takes you back to the previous depth
+(or level) of list, with that list&#8217;s enumerator and indent
+intact. The final <kbd>.LIST&nbsp;OFF</kbd> exits lists completely
+and returns you to the left margin of running text.
+</p>
+
+<p>
+If
+<kbd><a href="typesetting.html#quad">QUAD CENTER</a></kbd>
+is in effect when LIST is invoked, the list is set quad left but
+centred on the page as a block, based on the longest line of list
+text. Equally, if <kbd>QUAD RIGHT</kbd> in in effect, the list is
+set flush left but quadded right as a block. If you want a centred
+or right-quadded list in an otherwise left-quadded or justified
+document, simply invoke <kbd>.QUAD&nbsp;&lt;direction&gt;</kbd>
+before the list and reset the quad afterwards. Do not use
+<kbd><a href="typesetting.html#lrc">CENTER</a></kbd>
+or
+<kbd><a href="typesetting.html#lrc">RIGHT</a></kbd>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Mom centres lists over the entire line length, disregarding
+<a href="typesetting.html#ib">IB</a>
+if it is in effect. If there are lines in the list that exceed
+the margins of IB, they must be broken manually with
+<kbd>.BR</kbd> if you wish to keep them within the indented margins.
+</p>
+</div>
+
+<p>
+Finally, lists can be used in documents created with either the
+<a href="docprocessing.html#top">document processing macros</a>
+or just the
+<a href="typesetting.html#top">typesetting macros</a>.
+</p>
+
+<!-- -LIST- -->
+
+<div class="macro-id-overline">
+<h3 id="list" class="macro-id">LIST</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>LIST</b> <kbd class="macro-args">[ BULLET | DASH | DIGIT | ALPHA | alpha | ROMAN&lt;n&gt; | roman&lt;n&gt; | USER &lt;user-defined enumerator&gt; | PLAIN | VARIABLE &lt;character&gt;] [ &lt;separator&gt; ] [ &lt;prefix&gt; ] [ &lt;anything&gt; ]</kbd>
+</div>
+
+<p>
+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
+<kbd><a href="#item">.ITEM</a></kbd>,
+on a line by itself, is treated as a list item.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Every time you invoke <kbd>.LIST</kbd> to start a list (as opposed to
+<a href="#list-exit">exiting one</a>),
+you must supply an enumerator (and optionally, a separator) for the
+list, unless you want mom&#8217;s default enumerator, which is a
+bullet. Within nested lists, mom stores the enumerator, separator
+and indent for any list you return <i>backwards</i> to (i.e. with
+<kbd>.LIST OFF</kbd>), but does not store any information for lists
+you move <i>forward</i> to.
+</p>
+</div>
+
+<p>
+There are a lot of arguments (be sure to side-scroll through them
+all, above), so I&#8217;ll discuss them one at a time here.
+</p>
+<h3 class="docs">The first argument &ndash; enumerator style</h3>
+
+<p>
+The optional arguments <kbd>BULLET</kbd>, <kbd>DASH</kbd>,
+<kbd>DIGIT</kbd> (for Arabic numerals), <kbd>ALPHA</kbd> (for
+uppercase letters), <kbd>alpha</kbd> (for lowercase letters),
+<kbd>ROMAN&lt;n&gt;</kbd> (for uppercase roman numerals),
+<kbd>roman&lt;n&gt;</kbd> (for lowercase roman numerals) tell
+mom what kind of enumerator to use for a given list.
+</p>
+
+<p>
+The arguments, <kbd>ROMAN&lt;n&gt;</kbd> and
+<kbd>roman&lt;n&gt;</kbd>, are special. You must append to them
+a digit (arabic, e.g. "1" or "9" or "17") saying how many items a
+particular roman-numeraled LIST is going to have. Mom requires this
+information in order to align roman numerals sensibly, and will
+abort&mdash;with a message &mdash; if you don&#8217;t provide it.
+(For setting roman numeral and digit lists with the enumerators
+aligned flush right&mdash;the default is flush left&mdash;see
+<a href="#pad-list-digits">PAD_LIST_DIGITS</a>.)
+</p>
+
+<p>
+A roman-numeraled list containing, say, five items, would be set
+up like this:
+<br/>
+<span class="pre-in-pp">
+ .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
+</span>
+</p>
+
+<p>
+The argument <kbd>VARIABLE&nbsp;&lt;character&gt;</kbd> lets
+you choose different enumerators for the items in a list.
+<kbd>&lt;character&gt;</kbd> is the widest enumerator to
+be used. Thus, if you have a list enumerated by both bullets
+and em-dashes, you&#8217;d set it up with
+<br/>
+<span class="pre-in-pp">
+ .LIST VARIABLE \[em]
+</span>
+and select the enumerator you want with
+<br/>
+<span class="pre-in-pp">
+ .ITEM \[em]
+</span>
+or
+<br/>
+<span class="pre-in-pp">
+ .ITEM \[bu]
+</span>
+If your enumerator contains spaces, you must enclose the
+<kbd>&lt;character&gt;</kbd> argument in both LIST and ITEM in
+double-quotes, e.g.
+<br/>
+<span class="pre-in-pp">
+ .LIST VARIABLE "\*[UP 1p]\[bu]\*[DOWN 1p]"
+ .ITEM "\*[UP 1p]\[bu]\*[DOWN 1p]"
+</span>
+</p>
+
+<p>
+The argument <kbd>USER</kbd> lets you make up your own enumerator,
+and must be followed by a second argument: what you&#8217;d like the
+enumerator to look like. For example, if you want a list enumerated
+with <kbd>=&gt;</kbd>,
+<br/>
+<span class="pre-in-pp">
+ .LIST USER =&gt;
+ .ITEM
+ A list item
+</span>
+
+will produce
+<br/>
+<span class="pre-in-pp">
+ =&gt; A list item
+</span>
+Some useful special groff characters you might want to pass to
+<kbd>USER</kbd> are:
+<span class="pre-in-pp">
+ \[sq] - square box
+ \[rh] - pointing hand
+ \[-&gt;] - right arrow
+ \[rA] - right double arrow
+ \[OK] - checkmark
+</span>
+The size and vertical positioning of special characters may be
+adjusted with
+<a href="definitions.html#inlines">inline escapes</a>
+in the argument passed to USER. For example, to raise the position
+of <kbd><span class="nobr">\[sq]</span></kbd> slightly, you might do
+<span class="pre-in-pp">
+ .LIST USER "\*[UP .25p]\[sq]\*[DOWN .25p]"
+ or
+ .LIST USER \v'-.25p'\[sq]\v'.25p'
+</span>
+</p>
+
+<p>
+The argument <kbd>PLAIN</kbd> initializes a list with no enumerator.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If the argument to <kbd>USER</kbd> contains spaces, you must enclose
+the argument in double quotes.
+</p>
+</div>
+
+<h3 class="docs">The second argument &ndash; separator style</h3>
+
+<p>
+If you choose <kbd>DIGIT</kbd>, <kbd>ALPHA</kbd>, <kbd>alpha</kbd>,
+<kbd>ROMAN&lt;n&gt;</kbd>, or <kbd>roman&lt;n&gt;</kbd>, you may
+enter the optional argument, <kbd>separator</kbd>, to say what kind
+of separator you want after the enumerator. The separator can be
+anything you like. The default for <kbd>DIGIT</kbd> is a period
+(dot), like this:
+<br/>
+<span class="pre-in-pp">
+ 1. A list item
+</span>
+The default separator for <kbd>ALPHA</kbd>, <kbd>alpha</kbd>,
+<kbd>ROMAN&lt;n&gt;</kbd> and <kbd>roman&lt;n&gt;</kbd> is a right
+parenthesis, like this:
+<br/>
+<span class="pre-in-pp">
+ a) An alpha-ed list item
+ b) A second alpha-ed list item
+</span>
+If you&#8217;d prefer, say, digits with right-parenthesis separators
+instead of the default period, you&#8217;d do
+<br/>
+<span class="pre-in-pp">
+ .LIST DIGIT )
+ .ITEM
+ A numbered list item
+</span>
+which would produce
+<br/>
+<span class="pre-in-pp">
+ 1) A numbered list item
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+<kbd>BULLET</kbd>, <kbd>DASH</kbd> and <kbd>USER</kbd> do not take a
+separator.
+</p>
+</div>
+
+<h3 class="docs">The third argument &ndash; prefix style</h3>
+
+<p>
+Additionally, you may give a prefix (i.e. a character
+that comes <i>before</i> the enumerator) when your
+enumerator style for a particular list is <kbd>DIGIT</kbd>,
+<kbd>ALPHA</kbd>, <kbd>alpha</kbd>, <kbd>ROMAN&lt;n&gt;</kbd> or
+<kbd>roman&lt;n&gt;</kbd>. In the arguments to LIST, the prefix
+comes <i>after</i> the separator, which is counter-intuitive,
+so please be careful.
+</p>
+
+<p>
+A prefix can be anything you like. Most likely, you&#8217;ll want
+some kind of open-bracket, such as a left parenthesis. If, for
+example, you want a <kbd>DIGIT</kbd> list with the numbers enclosed
+in parentheses, you&#8217;d enter
+<br/>
+<span class="pre-in-pp">
+ .LIST DIGIT ) (
+ .ITEM
+ The first item on the list.
+ .ITEM
+ The second item on the list.
+</span>
+which would produce
+<br/>
+<span class="pre-in-pp">
+ (1) The first item on the list.
+ (2) The second item on the list.
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+<kbd>BULLET</kbd>, <kbd>DASH</kbd> and
+<kbd>USER</kbd> do not take a prefix.
+</p>
+</div>
+
+<h3 class="docs">Exiting lists &ndash; LIST OFF / BACK or QUIT_LISTS</h3>
+
+<p>
+Any single argument to <kbd>LIST</kbd> other than
+<kbd>BULLET</kbd>, <kbd>DASH</kbd>, <kbd>DIGIT</kbd>,
+<kbd>ALPHA</kbd>, <kbd>alpha</kbd>, <kbd>ROMAN&lt;n&gt;</kbd>,
+<kbd>roman&lt;n&gt;</kbd> or <kbd>USER</kbd> (e.g.
+<kbd>LIST&nbsp;OFF</kbd> or <kbd>LIST&nbsp;BACK</kbd>) takes you out
+of the current list.
+</p>
+
+<p>
+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.
+</p>
+
+<p>
+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.
+</p>
+
+<p>
+Each invocation of <kbd>.LIST</kbd> should thus be matched by
+a corresponding <kbd>.LIST&nbsp;OFF</kbd> in order to fully exit
+lists. For example,
+<br/>
+<span class="pre-in-pp">
+ 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.
+</span>
+is created like this:
+<br/>
+<span class="pre-in-pp">
+ 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.
+</span>
+Alternatively, you may use the single-purpose macro
+<kbd>.QUIT_LISTS</kbd>, to get yourself out of a list structure. In
+the example above, the two <kbd>.LIST&nbsp;OFF</kbd> lines could be
+replaced with a single <kbd>.QUIT_LISTS</kbd>.
+</p>
+
+<div class="macro-id-overline">
+<h3 id="item" class="macro-id">ITEM</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>ITEM</b> <kbd class="macro-args">[&lt;enumerator&gt;] [&lt;space&gt;]</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;The argument to <kbd style="font-style: normal">&lt;space&gt;</kbd> requires a
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+After you&#8217;ve initialized a list with
+<a href="#list">LIST</a>,
+precede each item you want in the list with <kbd>.ITEM</kbd>. Mom
+takes care of everything else with respect to setting the item
+appropriate to the list you&#8217;re in.
+</p>
+
+<p>
+If you&#8217;ve chosen the <kbd>VARIABLE</kbd> argument when
+invoking LIST, ITEM must be followed by an enumerator character.
+</p>
+
+<p>
+If you give ITEM a space argument, either by itself or after a
+variable enumerator character, the item will be spaced by the amount
+of the argument.
+</p>
+
+<p>
+In document processing, it is valid to have list items that contain
+multiple paragraphs. Simply issue a
+<kbd><a href="#pp">.PP</a></kbd>
+request for each paragraph <i>following</i> the first item.
+I.e., don&#8217;t do this:
+<br/>
+<span class="pre-in-pp">
+ .ITEM
+ .PP
+ Some text...
+ .PP
+ A second paragraph of text
+</span>
+but rather
+<br/>
+<span class="pre-in-pp">
+ .ITEM
+ Some text...
+ .PP
+ A second paragraph of text
+</span>
+</p>
+
+<div class="defaults-container" style="background-color: #ded4bd; border: none;">
+<h3 id="list-control" class="docs defaults">LIST control macros and defaults</h3>
+
+<p style="margin-top: 0; margin-left: .5em">
+LIST control macros may not be
+<a href="#grouping">grouped</a>.
+</p>
+
+<ol style="margin-top: -.5em; padding-left: 1.5em; padding-bottom: .5em;">
+ <li><a href="#shift-list">Indenting lists (SHIFT_LIST)</a></li>
+ <li><a href="#reset-list">Resetting an initialized list&#8217;s enumerator (RESET_LIST)</a></li>
+ <li><a href="#pad-list-digits">Padding digit enumerators (PAD_LIST_DIGITS)</a></li>
+</ol>
+</div>
+
+<h4 id="shift-list" class="docs" style="margin-top: -1.5em;">1. Indenting lists &ndash; SHIFT_LIST</h4>
+
+<p>
+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
+<a href="#list">LIST</a>.
+SHIFT_LIST takes just one argument: the amount by which you want the
+list shifted to the right. The argument requires a
+<a href="definitions.html#unitofmeasure">unit of measure</a>.
+</p>
+
+<p>
+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.
+</p>
+
+<p>
+For example, if you want a 2-level list, with each list indented to
+the right by 18
+<a href="definitions.html#picaspoints">points</a>,
+<br/>
+<span class="pre-in-pp">
+ 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.
+</span>
+produces (approximately)
+<br/>
+<span class="pre-in-pp">
+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
+ sed diam nonumy eirmod tempor invidunt ut labore.
+ &bull; List 1 item
+ &bull; List 1 item
+ - List 2 item
+ - List 2 item
+ &bull; List 1 item
+ &bull; List 1 item
+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
+ sed diam nonumy eirmod tempor invidunt ut labore.
+</span>
+</p>
+
+<h4 id="reset-list" class="docs" style="margin-top: -.25em;">2. Resetting an initialized list&#8217;s enumerator &ndash; RESET_LIST</h4>
+
+<p>
+In nested lists, if your choice of enumerator for a given level
+of list is <kbd>DIGIT</kbd>, <kbd>ALPHA</kbd>, <kbd>alpha</kbd>,
+<kbd>ROMAN</kbd> or <kbd>roman</kbd>, you may sometimes want to
+reset the list&#8217;s enumerator when you return to that list.
+Consider the following:
+<br/>
+<span class="pre-in-pp">
+ Things to do religiously each and every day:
+ &bull; take care of the dog
+ a) walk every day
+ b) brush once a week
+ - trim around the eyes every fourth brushing
+ - don&#8217;t forget to check nails
+ &bull; feed the cat
+ d) soft food on Mon., Wed. and Fri.
+ e) dry food on Tues., Thurs. and Sat.
+ f) canned tuna on Sunday
+</span>
+</p>
+
+<p>
+The alpha-enumerated items under &#8220;Feed the cat&#8221;
+would be normally a), b), c), but we want d), e), f). The
+solution is to reset the second <kbd>.LIST alpha</kbd>&#8217;s
+enumerator&mdash;before the first <kbd>.ITEM</kbd>&mdash;with
+the macro RESET_LIST.
+</p>
+
+<p>
+With no argument, <kbd>.RESET_LIST</kbd> resets an incrementing
+enumerator to 1, A, a, I or i depending on the style of enumerator.
+If you pass <kbd>.RESET_LIST</kbd> a
+<a href="definitions.html#numericargument">numeric argument</a>,
+it represents the starting position for an incrementing enumerator. In
+the example above, <kbd>.RESET_LIST 4</kbd>&nbsp;starts the second
+alpha-ed list at d).
+</p>
+
+<h4 id="pad-list-digits" class="docs" style="margin-top: -.25em;">3. Padding digit enumerators &ndash; PAD_LIST_DIGITS</h4>
+
+<h5 class="docs" style="margin-top: 1em;">Arabic digits</h5>
+
+<p style="margin-top: .5em;">
+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?
+</p>
+
+<p>
+If you want the extra space to the right, invoke the macro
+<kbd>.PAD_LIST_DIGITS</kbd> (with no argument), after
+<kbd>.LIST</kbd> and before <kbd>.ITEM</kbd>. This will produce
+something like
+<br/>
+<span class="pre-in-pp">
+ 8. List item
+ 9. List item
+ 10. List item
+</span>
+If you want the extra space to the left, invoke
+<kbd>.PAD_LIST_DIGITS</kbd> with the single argument,
+<kbd>LEFT</kbd>, which will produce
+<br/>
+<span class="pre-in-pp">
+ 8. List item
+ 9. List item
+ 10. List item
+</span>
+</p>
+
+<p>
+Of course, if the number of items in the list is less than ten
+(10), there&#8217;s no need for PAD_LIST_DIGITS.
+</p>
+
+<h5 class="docs" style="margin-top: -.5em;">Roman numerals</h5>
+
+<p style="margin-top: .5em;">
+By default, mom sets roman numerals in lists flush left. The
+<kbd>&lt;n&gt;</kbd> argument appended to <kbd>ROMAN&lt;n&gt;</kbd>
+or <kbd>roman&lt;n&gt;</kbd> allows her to calculate how much space
+to put after each numeral in order to ensure that the text of items
+lines up properly.
+</p>
+
+<p>
+If you&#8217;d like the roman numerals to line
+up flush right (i.e. be padded "left"), simply
+invoke <kbd>.PAD_LIST_DIGITS&nbsp;LEFT</kbd> after
+<kbd>.LIST&nbsp;ROMAN&lt;n&gt;</kbd> or
+<kbd>.LIST&nbsp;roman&lt;n&gt;</kbd> and before <kbd>.ITEM</kbd>.
+</p>
+
+<div class="rule-short"><hr/></div>
+
+<!-- -LINE NUMBERING- -->
+
+<h2 id="number-lines-intro" class="macro-group">Line numbering &ndash; prepend numbers to output lines</h2>
+
+<ul style="margin-left: -.5em;">
+ <li><a href="#number-lines">Macro: <b>NUMBER_LINES</b></a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#ln-control">Line numbering control (off/suspend, resume)</a></li>
+ </ul></li>
+ <li><a href="#number-lines-control">Control macros and defaults</a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#number-quote-lines">Line numbering control macros for quotes and blockquotes</a></li>
+ </ul></li>
+</ul>
+
+<p style="margin-top: -.5em;">
+When you turn line-numbering on, mom, by default
+</p>
+<ul style="margin-top: -.5em;">
+ <li>numbers every line of paragraph text; line-numbering is
+ suspended for all other document processing tags (like
+ docheaders, epigraphs, headings, quotes, etc.) and special
+ pages (covers, endotes, bibliographies, etc.); be aware,
+ though, that if you turn
+ <a href="definitions.html#docheader">docheaders</a>
+ off (with
+ <a href="docprocessing.html#docheader">DOCHEADER</a> OFF)
+ and create your own docheader, mom
+ <i>will</i> line-number your custom docheader, so turn
+ line numbering on afterwards
+ </li>
+ <li>doesn&#8217;t touch your line length; line numbers are hung
+ outside your current left margin (as set with
+ <a href="typesetting.html#l-margin">L_MARGIN</a>,
+ <a href="typesetting.html#page">PAGE</a>
+ or
+ <a href="docprocessing.html#doc-left-margin">DOC_LEFT_MARGIN</a>),
+ regardless of any indents that may be active
+ </li>
+ <li>separates line numbers from running text by two
+ <a href="definitions.html#figurespace">figure spaces</a>.
+ </li>
+</ul>
+
+<p>
+Mom expects that
+<a href="#quote">QUOTE</a>s
+and
+<a href="#blockquote">BLOCKQUOTE</a>s
+will not be line-numbered, however control macros are provided to
+enable line numbering for either.
+See
+<a href="#number-quote-lines">Line numbering control macros for quotes and blockquotes</a>.
+</p>
+
+<!-- -NUMBER_LINES- -->
+
+<div class="macro-id-overline">
+<h3 id="number-lines" class="macro-id">NUMBER_LINES</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>NUMBER_LINES</b> <kbd class="macro-args">&lt;start number&gt; [ &lt;which lines to number&gt; [ &lt;gutter&gt; ] ]</kbd>
+</div>
+
+<div class="box-macro-args" style="margin-top: 1em;">
+Macro: <b>NUMBER_LINES</b> <kbd class="macro-args">&lt;anything&gt; | RESUME</kbd>
+</div>
+
+<p>
+NUMBER_LINES does what it says: prints line numbers, to the left of
+<a href="definitions.html#outputline">output lines</a>
+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
+<a href="#footnotes-by-linenumber">Footnotes by linenumber</a>
+for instructions on line-numbered footnotes, and
+<a href="#endnote-marker-style">ENDNOTE_MARKER_STYLE LINE</a>
+for instructions on line-numbered endnotes.)
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Do not use NUMBER_LINES inside
+<a href="#quote">QUOTE</a>
+or
+<a href="#blockquote">BLOCKQUOTE</a>.
+By default, mom expects that quotes and blockquotes will not be
+line numbered. If you wish to enable line numbering for them, you
+must invoke
+<a href="#number-quote-lines">NUMBER_QUOTE_LINES</a>
+or
+<a href="#number-quote-lines">NUMBER_BLOCKQUOTE_LINES</a>.
+</p>
+</div>
+
+
+<p>
+The first time you invoke
+<a href="#number-lines">NUMBER_LINES</a>
+you must, at a minimum, tell it what line number you want the
+<i>next</i>
+<a href="definitions.html#outputline">output line</a>
+to have. The optional arguments <kbd>&lt;which lines to number&gt;</kbd>
+and <kbd>&lt;gutter&gt;</kbd> 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
+<a href="definitions.html#running">running text</a>.
+</p>
+
+<p>
+For example, if you want mom to number output lines using her defaults,
+<span class="pre-in-pp">
+ .NUMBER_LINES 1
+</span>
+will prepend the number, 1, to the next output line and number all
+subsequent output lines sequentially.
+</p>
+
+<p>
+If you want only every five lines numbered, pass mom the optional
+<kbd>&lt;which lines to number&gt;</kbd> argument, like this:
+<span class="pre-in-pp">
+ .NUMBER_LINES 1 5
+</span>
+</p>
+
+<div class="box-important">
+<p class="tip-top">
+<span class="important">GOTCHA!</span>
+The argument to <kbd>&lt;which lines to number&gt;</kbd> instructs
+mom to number only those lines that are multiples of the argument.
+Hence, in the above example, line number <kbd>1</kbd> will
+<i>not</i> be numbered, since <kbd>1</kbd> is not a multiple of
+<kbd>5</kbd>.
+</p>
+
+<p>
+If you want line number <kbd>1</kbd> to be numbered, you have
+to invoke <kbd><span class="nobr">.NUMBER_LINES 1 1</span></kbd> before the
+first output line you want numbered, then study your <i>output</i>
+copy and determine where best to insert the following in your
+<i>input</i> text:
+<br/>
+<span class="pre-in-pp">
+ .NUMBER_LINES \n[ln] 5
+</span>
+(The escape <kbd>\n[ln]</kbd> ensures that NUMBER_LINES
+automatically supplies the correct value for the first argument,
+<kbd>&lt;start number&gt;</kbd>.)
+</p>
+
+<p class="tip-bottom">
+Following this recipe, line number <kbd>1</kbd> 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 in your input text.
+</p>
+</div>
+
+<p>
+The optional argument, <kbd>&lt;gutter&gt;</kbd>, tells mom how much
+space to put between the line numbers and the running text.
+<kbd>&lt;gutter&gt;</kbd> does not require (or even accept) a
+<a href="definitions.html#unitofmeasure">unit of measure</a>.
+The argument you pass to it is the number of
+<a href="definitions.html#figurespace">figure spaces</a>
+you want between line numbers and running text.
+Mom&#8217;s default gutter is two figure spaces. If
+you&#8217;d like a wider gutter, say, four figures spaces, you&#8217;d do
+<br/>
+<span class="pre-in-pp">
+ .NUMBER_LINES 1 1 4
+ |
+ +-- Notice you *must* supply a value
+ for the 2nd argument in order to supply
+ a value for the 3rd.
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+When giving a value for <kbd>&lt;gutter&gt;</kbd>, you cannot skip
+the <kbd>&lt;which lines to number&gt;</kbd> argument. Either fill
+in the desired value, or use two double-quotes ( <kbd>""</kbd> ) to
+have mom use the value formerly in effect.
+</p>
+</div>
+
+<h3 id="ln-control" class="docs" style="margin-top: -.5em;">Off/suspend, resume</h3>
+
+<p style="margin-top: .5em;">
+After initializing line numbering, you can suspend it, with the
+option to resume, using
+<br/>
+<span class="pre-in-pp">
+ .NUMBER_LINES&nbsp;OFF
+</span>
+(or <kbd>END</kbd>, <kbd>QUIT</kbd>, <kbd>X</kbd>, etc).
+</p>
+
+<p>To resume line numbering:
+<br/>
+<span class="pre-in-pp">
+ .NUMBER_LINES RESUME
+</span>
+When you resume, the line number will be the next in sequence
+from where you left off. If that is not what you want&mdash;say
+you want to reset the line number to <kbd>1</kbd>&mdash;re-invoke
+<kbd>.NUMBER_LINES</kbd> with whatever arguments are needed for the
+desired result.
+</p>
+
+<div class="box-tip" style="margin-left: 6px;">
+<p class="tip">
+<span class="note">Additional notes:</span>
+</p>
+<ol style="margin-top: -1.25em; margin-left: -1.25em; padding-bottom: .5em;">
+ <li>In document processing, you may invoke
+ <kbd>.NUMBER_LINES</kbd> either before or after
+ <kbd>.START</kbd>. Mom doesn&#8217;t care.
+ </li>
+ <li style="margin-top: .25em;">If you&#8217;re collating documents with
+ <a href="rectoverso.html#collate">COLLATE</a>,
+ you should re-invoke, at a minimum,
+ <kbd>.NUMBER_LINES&nbsp;1</kbd> for each collated
+ document, in order to ensure that each begins with the
+ number <kbd>1</kbd> prepended to the first line.
+ </li>
+ <li style="margin-top: .25em;">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
+ <kbd>\n[ln]</kbd>.
+ <br/>
+ <span style="display: block; margin-top: .5em;">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),
+ <br/>
+ <span class="pre-in-pp" style="margin-bottom: -2em;">
+ .NUMBER_LINES \n[ln] 5 4
+ </span>
+ would do the trick.
+ </span>
+ </li>
+ <li style="margin-top: .25em;">If you&#8217;re using
+ <a href="#mn-intro">margin notes</a>
+ in a document, be sure to set the gutter for margin notes wide
+ enough to allow room for the line numbers.
+ </li>
+ <li style="margin-top: .25em;">Mom (groff, actually), only numbers
+ lines <i>to the left</i> of running 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
+ <a href="definitions.html#gutter">gutter(s)</a>
+ between columns is wide enough to leave room for the numbers.
+ </li>
+</ol>
+</div>
+
+<div class="defaults-container" style="background-color: #ded4bd; border: none;">
+<h3 id="number-lines-control" class="docs defaults">NUMBER_LINES control macros and defaults</h3>
+
+<ol style="margin-top: .5em; padding-bottom: .5em;">
+ <li><a href="#number-lines-general">Family/font/size/colour</a></li>
+ <li><a href="#number-lines-per-section">Reset line numbering after COLLATE</a></li>
+ <li><a href="#number-quote-lines">Line numbering control for quotes and blockquotes</a>
+ <ul style="padding-left: 1em">
+ <li><a href="#number-quote-lines-global">Including QUOTEs and BLOCKQUOTEs in the line numbering scheme</a></li>
+ <li><a href="#number-quote-lines-selective">Selectively enabling line numbering for QUOTEs and BLOCKQUOTEs</a></li>
+ <li><a href="#number-quote-lines-gutter">Changing the line number gutter for QUOTEs and BLOCKQUOTEs</a></li>
+ <li><a href="#number-quote-lines-silent">Silently increment line numbers during QUOTE and BLOCKQUOTE</a></li>
+ </ul></li>
+</ol>
+</div>
+
+<h4 id="number-lines-general" class="docs" style="margin-top: -1.5em; margin-bottom: .5em;">1. Family/font/size/colour</h4>
+
+<div class="defaults-container" style="padding-bottom: 8px;">
+<p class="defaults" style="padding-top: 6px;">
+See
+<a href="#control-macro-args">Arguments to the control macros</a>.
+<br/>
+The following NUMBER_LINES control macros may also be
+<a href="#grouping">grouped</a>
+using LINENUMBER_STYLE.
+</p>
+<span class="pre defaults">
+.LINENUMBER_FAMILY default = prevailing family or document family; default is Times Roman
+.LINENUMBER_FONT default = prevailing font
+.LINENUMBER_SIZE default = +0
+.LINENUMBER_COLOR default = black
+</span>
+</div>
+
+<h4 id="number-lines-per-section" class="docs" style="margin-top: -1.75em;">2. Reset line numbering after COLLATE</h4>
+
+<p>
+After
+<a href="rectoverso.html#collate">COLLATE</a>,
+line numbering continues from where it left off. If you would like
+each chapter or major document section to begin its line numbering
+at &#8220;1&#8221;, invoke
+<span class="pre-in-pp">
+ .NUMBER_LINES_PER_SECTION
+</span>
+after
+<a href="#number-lines"><kbd>.NUMBER_LINES</kbd></a>.
+</p>
+
+<h4 id="number-quote-lines" class="docs" style="margin-top: 0em;">3. Line numbering control macros for QUOTE and BLOCKQUOTE</h4>
+
+<h5 id="number-quote-lines-global" class="docs" style="font-size: 87%">&bull;&nbsp;Including QUOTEs and BLOCKQUOTEs in the line numbering scheme</h5>
+
+<p>
+If you&#8217;d like mom to number lines in a
+<a href="#quote">QUOTE</a>
+or
+<a href="#blockquote">BLOCKQUOTE</a>
+as part of the same order and sequence as paragraph text,
+invoke
+<span class="pre-in-pp">
+ .NUMBER_QUOTE_LINES
+</span>
+or
+<span class="pre-in-pp">
+ .NUMBER_BLOCKQUOTE_LINES
+</span>
+either before or after NUMBER_LINES. Both behave identically with
+respect to the affected macro (i.e. QUOTE or BLOCKQUOTE).
+</p>
+
+<h5 id="number-quote-lines-selective" class="docs" style="font-size: 87%">&bull;&nbsp;Selectively enabling line numbering for QUOTEs and BLOCKQUOTEs</h5>
+
+<p>
+If you&#8217;d like to enable line numbering selectively for quotes
+and blockquotes <i>only</i>, invoke <kbd>.NUMBER_QUOTE_LINES</kbd>
+or <kbd>.NUMBER_BLOCKQUOTE_LINES</kbd> first, followed by
+<kbd>.NUMBER_LINES&nbsp;&lt;n&gt;</kbd>, where <kbd>&lt;n&gt;</kbd>
+is the first line number of the quote or blockquote. Afterwards,
+enter your QUOTE or BLOCKQUOTE. When the quote or blockquote
+is finished (i.e. after <kbd>.QUOTE&nbsp;OFF</kbd> or
+<kbd>.BLOCKQUOTE&nbsp;OFF</kbd>), turn line numbering off. Each
+subsequent quote or blockquote you want line numbered requires
+only <kbd>.NUMBER_LINES &lt;n&gt;</kbd> (with a corresponding
+<kbd>.NUMBER_LINES OFF</kbd>) until you turn NUMBER_QUOTE_LINES or
+NUMBER_BLOCKQUOTE_LINES off.
+</p>
+
+<p>
+Here&#8217;s a recipe where the first line number of quotes starts
+repeatedly at &#8220;1&#8221;.
+<span class="pre-in-pp">
+ &lt;running text&gt;
+ .NUMBER_QUOTE_LINES
+ .NUMBER_LINES 1
+ .QUOTE
+ &lt;text of quote&gt;
+ .QUOTE OFF
+ .NUMBER_LINES OFF
+ &lt;further running text&gt;
+ .NUMBER_LINES 1
+ .QUOTE
+ &lt;text of quote&gt;
+ .QUOTE OFF
+ .NUMBER_LINES OFF
+ &lt;further running text&gt;
+</span>
+</p>
+
+<h5 id="number-quote-lines-gutter" class="docs" style="font-size: 87%">&bull;&nbsp;Changing the line number gutter for QUOTEs and BLOCKQUOTEs</h5>
+
+<p>
+Owing to groff&#8217;s restriction on accepting only the figure
+space as the line number
+<a href="definitions.html#gutter">gutter</a>&#8217;s
+unit of measure, it is not possible for line numbers in quotes
+or blockquotes to hang outside a document&#8217;s overall left
+margin and be reliably flush with the line numbers of paragraph
+text. Consequently, line numbers in quotes or blockquotes hang
+to the left of the quote, separated by the currently active
+gutter for NUMBER_LINES.
+</p>
+
+<p>
+If you&#8217;d like to change the line number gutter for quotes
+or blockquotes, invoke <kbd>.NUMBER_QUOTE_LINES</kbd> or
+<kbd>.NUMBER_BLOCKQUOTE_LINES</kbd> with a digit representing the
+number of
+<a href="definitions.html#figurespace">figure spaces</a>
+you&#8217;d like between the line numbers and the quoted text, like this:
+<br/>
+<span class="pre-in-pp">
+ .NUMBER_QUOTE_LINES 3
+</span>
+With the above, line numbers in quotes (and only quotes) will have
+a gutter of 3 figure spaces.
+</p>
+
+<h5 id="number-quote-lines-silent" class="docs" style="font-size: 87%">&bull;&nbsp;Silently increment line numbers during QUOTE and BLOCKQUOTE</h5>
+
+<p>
+If you&#8217;ve asked mom not to line number quotes or blockquotes,
+but would like line numbering to continue while they&#8217;re
+being output (as opposed to mom&#8217;s default behaviour of
+<i>suspending</i> incrementing of line numbers during the output of
+quotes and blockquotes), invoke
+<span class="pre-in-pp">
+ .NUMBER_QUOTE_LINES&nbsp;SILENT
+</span>
+or
+<span class="pre-in-pp">
+ .NUMBER_BLOCKQUOTE_LINES&nbsp;SILENT
+</span>
+With these, mom continues to increment line numbers while quotes
+or blockquotes are being output, but the line numbers won&#8217;t
+appear in the output copy.
+</p>
+
+<p>
+Once having turned NUMBER_QUOTE_LINES or NUMBER_BLOCKQUOTE_LINES on,
+you may disable them with
+<span class="pre-in-pp">
+ .NUMBER_QUOTE_LINES OFF
+</span>
+or
+<span class="pre-in-pp">
+ .NUMBER_BLOCKQUOTE_LINES OFF
+</span>
+</p>
+
+<div class="rule-short"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="footnote-intro" class="macro-group">Footnotes</h2>
+
+<ul>
+ <li><a href="#footnote-behaviour">Footnote behaviour</a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#fn-and-punct">Footnote markers and punctuation in the running text</a></li>
+ </ul></li>
+ <li><a href="#footnote">Tag: FOOTNOTE</a></li>
+ <li><a href="#footnote-control">Footnote control macros and defaults</a></li>
+</ul>
+
+<p>
+For something so complex behind the scenes, footnotes are easy to use.
+You just type, for example,
+<br/>
+<span id="footnote-example" class="pre-in-pp">
+ ...the doctrines of Identity as urged by Schelling\c
+ .FOOTNOTE
+ &lt;footnote about who the hell is Schelling&gt;
+ .FOOTNOTE OFF
+ were generally the points of discussion presenting the most
+ of beauty to the imaginative Morella.
+</span>
+and be done with it.
+(Note the obligatory use of the <kbd>\c</kbd>
+<a href="definitions.html#inlines">inline escape</a>,
+required whenever your
+<a href="#footnote-marker-style">FOOTNOTE_MARKER_STYLE</a>
+is either <kbd>STAR</kbd> [star/dagger footnotes] or
+<kbd>NUMBER</kbd> [superscript numbers].)
+</p>
+
+<p>
+After you invoke <kbd>.FOOTNOTE</kbd>, 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&#8217;t fit on the page...
+Even if you&#8217;re using
+<a href="docprocessing.html#columns">COLUMNS</a>,
+mom knows what to do, and Does The Right Thing.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+See
+<a href="refer.html">refer.html</a>
+for information on using footnotes with the <kbd>refer</kbd>
+bibliographic database.
+</p>
+</div>
+
+<h3 id="footnote-behaviour" class="docs">Footnote behaviour</h3>
+
+<p>
+Footnotes can be sly little beasts. If you&#8217;re writing a
+document that&#8217;s footnote-heavy, you might want to read the
+following.
+</p>
+
+<p>
+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.
+</p>
+
+<p>
+A small amount of vertical whitespace and a short horizontal rule
+separate footnotes from the document body. When
+<a href="docprocessing.html#flex-vs-shim">shimming</a>
+is enabled, the amount of whitespace
+may vary 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&#8217;ll
+usually opt for ample over cramped. The last lines of footnotes are
+always flush with the document&#8217;s bottom margin.
+</p>
+
+<p>
+When
+<a href="docprocessing.html#flex-vs-shim">flex-spacing</a>
+is enabled, the distance between the last line of text and the
+first footnote is always the same.
+</p>
+
+<p>
+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&#8217;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.
+</p>
+
+<p>
+When footnotes occur within cited text, for example a
+<a href="#quote">QUOTE</a>
+or a
+<a href="#blockquote">BLOCKQUOTE</a>,
+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.
+</p>
+
+<p>
+In the unfortunate happenstance that a deferred footnote is the
+only footnote on its page (i.e., it&#8217;s marked in the document
+body with a star) and the page it&#8217;s deferred to has its own
+footnotes, mom separates the deferred footnote from the page&#8217;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&#8217;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.
+</p>
+
+<p>
+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&#8217;s no confusion and mom doesn&#8217;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&#8217;ll know the entry belongs to the previous page).
+</p>
+
+<p>
+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&#8217;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
+<a href="typesetting.html#space"><kbd>.SPACE</kbd></a>
+command at the end of the footnote text, before
+<kbd>.FOOTNOTE&nbsp;OFF</kbd> (or <kbd>OFF</kbd>, <kbd>QUIT</kbd>,
+<kbd>END</kbd>, <kbd>X</kbd>, etc).
+</p>
+
+<p>
+Obviously, deferred footnotes aren&#8217;t an issue if you request
+numbered footnotes that increase incrementally throughout the whole
+document&mdash;yet another convenience mom has thought of.
+</p>
+
+<p>
+While mom&#8217;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
+<a href="#head">HEAD</a>
+near the bottom of a page and the 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&#8217;ll have a gaping hole at the bottom
+of the page. It&#8217;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.
+</p>
+
+<h3 id="fn-and-punct" class="docs">Footnote markers and punctuation in the running text</h3>
+
+<ol style="margin-left: -1.25em;">
+ <li><a href="#fn-and-punct-fill">&#8220;Fill&#8221; modes &ndash; JUSTIFY, or QUAD LEFT | CENTER | RIGHT</a></li>
+ <li><a href="#fn-and-punct-nofill">&#8220;No-fill&#8221; modes &ndash; LEFT, CENTER, RIGHT</a></li>
+</ol>
+
+<h4 id="fn-and-punct-fill" class="docs">1. &#8220;Fill&#8221; modes &ndash; JUSTIFY, or QUAD LEFT | CENTER | RIGHT</h4>
+
+<p>
+In
+<a href="definitions.html#filled">fill</a>
+modes, the correct way to enter the line after
+<kbd>.FOOTNOTE&nbsp;OFF</kbd> is to input it as if it&#8217;s
+literally a continuation of the input line you were entering before
+you invoked <kbd>.FOOTNOTE</kbd>. Therefore, if necessary, the
+input line may have to begin with space(s) or a punctuation mark, as
+in the two following examples.
+</p>
+
+<div id="examples-footnotes-1" class="examples-container" style="padding-bottom: 1em;">
+<div class="examples" style="margin-top: 0; margin-bottom: -.25em;">Example 1</div>
+<span class="pre">
+A line of text,\c
+.FOOTNOTE
+A footnote line.
+.FOOTNOTE OFF
+ broken up with a comma.
+^
+(last line begins with a literal space)
+</span>
+</div>
+
+<div id="examples-footnotes-2" class="examples-container" style="margin-top: 1em; padding-bottom: 1em;">
+<div class="examples" style="margin-top: 0; margin-bottom: -.25em;">Example 2</div>
+<span class="pre">
+A line of text\c
+.FOOTNOTE
+A footnote line.
+.FOOTNOTE OFF
+, broken up with a comma.
+^
+(last line begins with a comma and a space)
+</span>
+</div>
+
+<p>
+Example 1 produces, on output
+<br/>
+<span class="pre-in-pp">
+ A line of text,* broken up with a comma.
+</span>
+Example 2 produces
+<br/>
+<span class="pre-in-pp">
+ A line of text*, broken up with a comma.
+</span>
+Care must be taken, though, if the punctuation mark that begins the
+line after <kbd>.FOOTNOTE&nbsp;OFF</kbd> is a period (dot). You
+<b><i>must</i></b> begin such lines with <kbd>\&amp;.</kbd>, like
+this:
+<br/>
+<span class="pre-in-pp">
+ ...end of sentence\c
+ .FOOTNOTE
+ A footnote line.
+ .FOOTNOTE OFF
+ \&amp;. A new sentence...
+</span>
+If you omit the <kbd>\&amp;.</kbd>, the line will vanish!
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+The document element tags,
+<a href="#epigraph">EPIGRAPH</a>
+and
+<a href="#blockquote">BLOCKQUOTE</a>,
+imply a fill mode, therefore these instructions also apply when you
+insert a footnote into epigraphs or blockquotes.
+</p>
+</div>
+
+<h4 id="fn-and-punct-nofill" class="docs">2. &#8220;No-fill&#8221; modes &ndash; LEFT, CENTER, RIGHT</h4>
+
+<p>
+In
+<a href="definitions.html#filled">no-fill</a>
+modes, you must decide a) whether text on the <i>input</i> line
+after <kbd>.FOOTNOTE&nbsp;OFF</kbd> is to be joined to the
+<i>output</i> line before <kbd>.FOOTNOTE</kbd> was invoked, or b)
+whether you want the <i>output</i> text to begin on a new line.
+</p>
+
+<p>
+In the first instance, simply follow the instructions,
+<a href="#fn-and-punct-fill">above</a>,
+for fill modes.
+</p>
+
+<p>
+In the second instance, you must explicitly tell mom that
+you want input text after <kbd>.FOOTNOTE&nbsp;OFF</kbd> to
+begin on a new output line. This is accomplished by passing
+<kbd>.FOOTNOTE&nbsp;OFF</kbd> (or <kbd>OFF</kbd>, <kbd>QUIT</kbd>,
+<kbd>END</kbd>, <kbd>X</kbd>, etc) an additional argument:
+<kbd>BREAK</kbd> or <kbd>BR</kbd>.
+</p>
+
+<p>
+Study the two examples below to understand the difference.
+</p>
+
+<div id="examples-footnotes-3" class="examples-container" style="padding-bottom: 1em;">
+<div class="examples" style="margin-top: 0; margin-bottom: -.25em;">Example 1</div>
+<span class="pre">
+.LEFT
+A line of text\c
+.FOOTNOTE
+A footnote line
+.FOOTNOTE OFF
+that carries on after the footnote.
+</span>
+</div>
+
+<div id="examples-footnotes-4" class="examples-container" style="margin-top: 1em; padding-bottom: 1em;">
+<div class="examples" style="margin-top: 0; margin-bottom: -.25em;">Example 2</div>
+<span class="pre">
+.LEFT
+A line of text\c
+.FOOTNOTE
+A footnote line
+.FOOTNOTE OFF BREAK
+that doesn&#8217;t carry on after the footnote.
+</span>
+</div>
+
+<p>
+Example 1, on output, produces
+<br/>
+<span class="pre-in-pp">
+ A line of text* that carries on after the footnote.
+</span>
+whereas Example 2 produces
+<span class="pre-in-pp">
+ A line of text*
+ that doesn&#8217;t carry on after the footnote.
+</span>
+The distinction becomes particularly important if you like to see
+punctuation marks come <i>after</i> footnote markers. In no-fill
+modes, that&#8217;s accomplished like this:
+<br/>
+<span class="pre-in-pp">
+ .LEFT
+ A line of text\c
+ .FOOTNOTE
+ A footnote line
+ .FOOTNOTE OFF
+ ,
+ broken up with a comma.
+</span>
+The output of the above looks like this:
+<br/>
+<span class="pre-in-pp">
+ A line of text*,
+ broken up with a comma.
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+The document element tag,
+<a href="#quote">QUOTE</a>,
+implies a no-fill mode, therefore these instructions also apply when
+you insert footnotes into quotes.
+</p>
+</div>
+
+<!-- -FOOTNOTE- -->
+
+<div class="macro-id-overline">
+<h3 id="footnote" class="macro-id">FOOTNOTE</h3>
+</div>
+
+<div class="box-macro-args">
+Tag: FOOTNOTE <kbd class="macro-args">&lt;toggle&gt; [ BREAK | BR ] [ INDENT LEFT | RIGHT | BOTH &lt;indent value&gt; ]</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;<kbd><span style="font-style: normal">&lt;indent value&gt;</span></kbd> requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+<br/>
+See <span style="font-style: normal"><a href="#footnote-note">HYPER-IMPORTANT NOTE</a></span>.
+</p>
+
+<p>
+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 <kbd>INDENT</kbd> (i.e.
+<kbd>OFF</kbd>, <kbd>QUIT</kbd>, <kbd>END</kbd>, <kbd>X</kbd>...)
+tells mom you&#8217;re finished.
+</p>
+
+<p>
+Footnotes are the only element of
+<a href="definitions.html#running">running text</a>
+that are not affected by the typesetting
+<a href="typesetting.html#indents">indent macros</a>.
+In the unlikely event that you want a page&#8217;s footnotes to
+line up with a running indent, invoke <kbd>.FOOTNOTE</kbd> with
+the <kbd>INDENT</kbd> argument and pass it an indent direction and
+indent value. <kbd>L, R,</kbd> and <kbd>B</kbd> may be used in place
+of <kbd>LEFT, RIGHT,</kbd> and <kbd>BOTH</kbd>. FOOTNOTE must be
+invoked with <kbd>INDENT</kbd> for every footnote you want indented;
+mom does not save any footnote indent information from invocation to
+invocation.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If a footnote runs to more than one paragraph, do <i>not</i> begin
+the footnote with the
+<a href="#pp">PP</a>
+tag. Use <kbd>.PP</kbd> only to introduce subsequent paragraphs.
+</p>
+</div>
+
+<div id="footnote-note" class="box-tip">
+<p class="tip-top">
+<span class="note">HYPER-IMPORTANT NOTE:</span>
+The final word on the
+<a href="definitions.html#inputline">input line</a>
+that comes immediately before FOOTNOTE <i>must</i> terminate with a
+<kbd><a href="typesetting.html#join">\c</a></kbd>
+inline escape if your
+<a href="#footnote-marker-style">FOOTNOTE_MARKER_STYLE</a>
+is either <kbd>STAR</kbd> or <kbd>NUMBER</kbd>. See the
+<a href="#footnote-example">footnote example</a>
+above.
+</p>
+
+<p>
+Additionally, in
+<a href="definitions.html#filled">fill</a>
+modes
+(<a href="typesetting.html#justify">JUSTIFY</a>
+or
+<a href="typesetting.html#quad">QUAD</a>),
+the line <i>after</i> a <kbd>.FOOTNOTE&nbsp;OFF</kbd> 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
+explanation and examples
+<a href="#fn-and-punct">here</a>).
+</p>
+
+<p>
+In
+<a href="definitions.html#filled">no-fill</a>
+modes, the optional argument <kbd>BREAK</kbd> or <kbd>BR</kbd> may
+be used after the <kbd>OFF</kbd> (or <kbd>OFF</kbd>,
+<kbd>QUIT</kbd>, <kbd>END</kbd>, <kbd>X</kbd>, etc) argument to
+instruct mom not to join the next input line to the previous output.
+See
+<a href="#fn-and-punct-nofill">here</a>
+for a more complete explanation, with examples.
+</p>
+
+<p class="tip-bottom">
+Do not use the <kbd>\c</kbd> inline escape if your
+FOOTNOTE_MARKER_STYLE is <kbd>LINE</kbd>, or if you have disabled
+footnote markers with
+<kbd><a href="#footnote-markers">.FOOTNOTE_MARKERS OFF</a></kbd>.
+In these instances, the line after <kbd>.FOOTNOTE&nbsp;OFF</kbd>
+should be entered normally.
+</p>
+</div>
+
+<div class="defaults-container" style="background-color: #ded4bd; border: none;">
+<h3 id="footnote-control" class="docs defaults">FOOTNOTE control macros and defaults</h3>
+
+<ol style="margin-top: .5em; padding-bottom: .5em;">
+ <li><a href="#footnote-general">Family/font/size/colour/lead/quad</a></li>
+ <li><a href="#footnote-markers">Footnote markers</a> &ndash; on or off</li>
+ <li><a href="#footnote-marker-style">Footnote marker style</a> &ndash; star+dagger or numbered
+ <ul style="margin-left: -.5em; list-style-type: disc;">
+ <li><a href="#footnote-number-placeholders">Left padding of footnote numbers</a></li>
+ </ul></li>
+ <li><a href="#footnotes-by-linenumber">Footnotes by line number</a>
+ <ul style="margin-left: -.5em; list-style-type: disc;">
+ <li><a href="#footnote-linenumber-brackets">FOOTNOTE_LINENUMBER_BRACKETS</a></li>
+ <li><a href="#footnote-linenumber-separator">FOOTNOTE_LINENUMBER_SEPARATOR</a></li>
+ <li><a href="#footnotes-run-on">FOOTNOTES_RUN_ON</a> &ndash; line-numbered footnotes only</li>
+ </ul></li>
+ <li><a href="#reset-footnote-number">Reset footnote number</a> &ndash; set footnote marker number to 1</li>
+ <li><a href="#footnote-space">Inter-footnote spacing</a></li>
+ <li><a href="#footnote-rule">Footnote rule</a> &ndash; on or off</li>
+ <li><a href="#footnote-rule-length">Footnote rule length</a> &ndash; length of footnote separator rule</li>
+ <li><a href="#footnote-rule-weight">Footnote rule weight</a> &ndash; weight of footnote separator rule</li>
+ <li><a href="#footnote-rule-adj">Adjust vertical position of footnote separator rule</a></li>
+</ol>
+</div>
+
+<h4 id="footnote-general" class="docs" style="margin-top: -1.5em; margin-bottom: .5em;">1. Family/font/size/colour/lead/quad</h4>
+
+<div class="defaults-container" style="padding-bottom: 8px;">
+<p class="defaults" style="padding-top: 6px;">
+See
+<a href="#control-macro-args">Arguments to the control macros</a>.
+<br/>
+The following FOOTNOTE control macros may also be
+<a href="#grouping">grouped</a>
+using FOOTNOTE_STYLE.
+</p>
+<span class="pre defaults">
+.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
+</span>
+</div>
+
+<h4 id="footnote-markers" class="docs" style="margin-top: -1.25em;">2. Footnote markers &ndash; FOOTNOTE_MARKERS</h4>
+
+<p>
+If you don&#8217;t want footnote markers in either the body of
+the document or beside footnote entries themselves, toggle them
+off with <kbd>.FOOTNOTE_MARKERS&nbsp;OFF</kbd> (or <kbd>OFF</kbd>,
+<kbd>QUIT</kbd>, <kbd>END</kbd>, <kbd>X</kbd>...). This means,
+of course, that you&#8217;ll have to roll your own. If you want
+them back on, invoke <kbd>.FOOTNOTE_MARKERS</kbd> with no argument.
+Footnote markers are on by default.
+</p>
+
+<p>
+If FOOTNOTE_MARKERS are disabled, do not use the <kbd>\c</kbd>
+inline escape to terminate the line before <kbd>.FOOTNOTE</kbd>.
+</p>
+
+<h4 id="footnote-marker-style" class="docs" style="margin-top: -.25em;">3. Footnote marker style &ndash; FOOTNOTE_MARKER_STYLE</h4>
+
+<p>
+Mom gives you two choices of footnote marker style: star+dagger (see
+<a href="#footnote-behaviour">footnote behaviour</a>
+above), or numbered.
+</p>
+
+<p>
+<kbd>.FOOTNOTE_MARKER_STYLE STAR</kbd> gives you star+dagger (the
+default). There is a limit of 10 footnotes per page with this
+style.
+</p>
+
+<p>
+<kbd>.FOOTNOTE_MARKER_STYLE NUMBER</kbd> 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&#8217;s footnote numbers at 1 with
+<kbd>.RESET_FOOTNOTE_NUMBER</kbd>
+(<a href="#reset-footnote-number">see below</a>.)
+</p>
+
+<p>
+If your
+<a href="docprocessing.html#printstyle">PRINTSTYLE</a>
+is <kbd>TYPEWRITE</kbd> and you would prefer that the footnotes
+themselves not use superscript numbers, you may pass
+<kbd>.FOOTNOTE_MARKER_STYLE NUMBER</kbd> an additional argument:
+<kbd>NO_SUPERSCRIPT</kbd>. While the marker in the text will still
+be superscript, the footnotes themselves will be identified with
+normal-sized, base aligned numbers, surrounded by parentheses.
+</p>
+
+<h5 id="footnote-number-placeholders" class="docs">Left padding of footnote numbers</h5>
+
+<p>
+When footnote numbering is enabled, in order to ensure that the
+left margin of footnote text aligns regardless of the footnote
+number, you sometimes have to pad the footnote numbers. This will
+be the case any time the footnote numbers change from 9 to 10 on
+the same page, or from 99 to 100. Consider this scenario:
+<br/>
+<span class="pre-in-pp">
+ <sup>9</sup>&nbsp;Footnote text
+ <sup>10</sup>&nbsp;Footnote text
+ <sup>11</sup>&nbsp;Footnote text
+</span>
+As you can see, the left margins of the footnotes are not aligned.
+</p>
+
+<p>
+In order to correct this, use the macro
+<kbd>.FOOTNOTE_NUMBER_PLACEHOLDERS</kbd>, which takes a single
+argument: the number of placeholders in the longer digit. For
+example, placed at an appropriate point in your input file,
+<kbd>.FOOTNOTE_NUMBER_PLACEHOLDERS&nbsp;2</kbd> causes the above
+example to come out like this:
+<br/>
+<span class="pre-in-pp">
+ <sup> 9</sup> Footnote text
+ <sup>10</sup> Footnote text
+ <sup>11</sup> Footnote text
+</span>
+Given the impossibility of knowing in advance when the number of
+placeholders required for footnote numbers will change, you must
+study your <i>output</i> file to determine where to insert this
+macro into your <i>input</i> file.
+</p>
+
+<p>
+Obviously, mom does not provide a default for
+<kbd>.FOOTNOTE_NUMBER_PLACEHOLDERS</kbd>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+<kbd>.FOOTNOTE_NUMBER_PLACEHOLDERS</kbd> affects both superscript
+footnote numbers, and, in
+<a href="docprocessing.html#printstyle">PRINTSTYLE TYPEWRITE</a>,
+the normal, base-aligned numbers surrounded by parentheses that you
+get with
+<kbd>.FOOTNOTE_MARKER_STYLE&nbsp;NUMBER&nbsp;NO_SUPERSCRIPT</kbd>.
+</p>
+</div>
+
+<h4 id="footnotes-by-linenumber" class="docs" style="margin-top: -.25em;">4. Footnotes by line number &ndash; FOOTNOTE_MARKER_STYLE LINE</h4>
+
+<p>
+FOOTNOTE_MARKER_STYLE with the argument, <kbd>LINE</kbd> lets you
+have footnotes which are identified by line number, rather than by a
+marker in the text. (Note that
+<a href="#number-lines">NUMBER_LINES</a>
+must be enabled in order to use this marker style.)
+</p>
+
+<p>
+With FOOTNOTE_MARKER_STYLE <kbd>LINE</kbd>, 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
+<kbd>.FOOTNOTE</kbd>, <i>without the terminating</i> <kbd>\c</kbd>,
+at the appropriate place in running text. Input lines after the
+footnote has been terminated (e.g. with
+<kbd>.FOOTNOTE&nbsp;OFF</kbd>) are entered normally.
+</p>
+
+<p>
+If you want a range of line numbers (e.g.&nbsp;[5-11]&nbsp;),
+insert, directly into the first line of the range you want, the
+<a href="definitions.html#inlines">inline escape</a>,
+<kbd><span class="nobr">\*[FN_MARK]</span></kbd>. For the terminating line
+number of the range, you need only invoke <kbd>.FOOTNOTE</kbd>
+(again, without the terminating <kbd>\c</kbd>); mom is smart enough
+to figure out that where <kbd>.FOOTNOTE</kbd> was invoked represents
+the terminating line number.
+</p>
+
+<p>
+Range-numbered footnotes are always output on the page
+where <kbd>.FOOTNOTE</kbd> was invoked, not the page where
+<kbd><span class="nobr">\*[FN_MARK]</span></kbd> appears (subject, of course, to
+the rules for footnotes that fall too close to the bottom of a page,
+as outlined
+<a href="#footnote-rules">here</a>).
+</p>
+
+<p>
+The behaviour of line-numbered footnotes can be controlled with the
+macros:
+<br/>
+<span style="display: inline-block; margin-left: 2em; margin-top: .5em;"><a href="#footnote-linenumber-brackets">FOOTNOTE_LINENUMBER_BRACKETS</a></span>
+<br/>
+<span style="margin-left: 2em;"><a href="#footnote-linenumber-separator">FOOTNOTE_LINENUMBER_SEPARATOR</a></span>
+<br/>
+<span style="margin-left: 2em;"><a href="#footnotes-run-on">FOOTNOTES_RUN_ON</a></span>
+</p>
+
+<div style="margin-left: 1.25em;">
+<h5 id="footnote-linenumber-brackets" class="docs" style="margin-top: -.25em;">&bull;&nbsp;FOOTNOTE_LINENUMBER_BRACKETS</h5>
+
+<p style="margin-left: .5em;">
+Mom, by default, surrounds footnote line numbers with square
+brackets. The style of the brackets may be changed with the macro
+<br/>
+<span class="pre-in-pp">
+ .FOOTNOTE_LINENUMBER_BRACKETS
+</span>
+which takes one of three possible arguments: <kbd>PARENS</kbd>
+(round brackets), <kbd>SQUARE</kbd> (the default) or
+<kbd>BRACES</kbd> (curly braces). If you prefer a shortform, the
+arguments, <kbd>(</kbd>, <kbd>[</kbd> or <kbd>{</kbd> may be used
+instead.
+</p>
+
+<p style="margin-left: .5em;">Thus, for example, either
+<br/>
+<span class="pre-in-pp">
+ .FOOTNOTE_LINENUMBER_BRACKETS PARENS
+</span>
+or
+<br/>
+<span class="pre-in-pp">
+ .FOOTNOTE_LINENUMBER_BRACKETS (
+</span>
+will surround footnote line numbers with round brackets.
+</p>
+
+<h5 id="footnote-linenumber-separator" class="docs" style="margin-top: -.25em;">&bull;&nbsp;FOOTNOTE_LINENUMBER_SEPARATOR</h5>
+
+<p style="margin-left: .5em;">
+If you don&#8217;t want the numbers enclosed in brackets, you
+may tell mom to use a &#8220;separator&#8221; instead. A common
+separator would be the colon, but it can be anything you like.
+The macro to do this is
+<br/>
+<span class="pre-in-pp">
+ .FOOTNOTE_LINENUMBER_SEPARATOR
+</span>
+which takes, as its single argument, the separator you want. For
+safety and consistency&#8217;s sake, always enclose the argument in
+double-quotes. The separator can be composed of any valid groff
+character, or any combination of characters.
+</p>
+
+<p style="margin-left: .5em;">
+<b>A word of caution:</b> when using a separator, mom doesn&#8217;t
+insert any space after the separator. Hence, if you want 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&#8217;d do
+<br/>
+<span class="pre-in-pp">
+ .FOOTNOTE_LINENUMBER_SEPARATOR ": "
+</span>
+</p>
+
+<h5 id="footnotes-run-on" class="docs" style="margin-top: -1em;">&bull;&nbsp;FOOTNOTES_RUN_ON</h5>
+
+<p style="margin-left: .5em;">
+Finally, if your footnote marker style is <kbd>LINE</kbd>, you may
+instruct mom to do &#8220;run-on style&#8221; footnotes. Run-on
+footnotes do not treat footnotes as discrete entities, i.e. each
+beginning on a new line. Rather, each footnote is separated from
+the footnote before it by horizontal space in the running line, so
+that the footnotes on any given page form a continuous block, like
+lines in a paragraph.
+</p>
+
+<p style="margin-left: .5em;">
+The macro to get mom to run footnotes on is
+<br/>
+<span class="pre-in-pp">
+ .FOOTNOTES_RUN_ON
+</span>
+Invoked by itself, it turns the feature on. Invoked with any other
+argument (<kbd>OFF, NO</kbd>, 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&#8217;s going to be a problem. However, it is
+always perfectly safe to enable/disable the feature after
+<a href="rectoverso.html#collate">COLLATE</a>.
+</p>
+</div>
+
+<h4 id="reset-footnote-number" class="docs" style="margin-top: -.25em;">5. Reset footnote number &ndash; RESET_FOOTNOTE_NUMBER</h4>
+
+<p>
+<kbd>.RESET_FOOTNOTE_NUMBER</kbd>, by itself, resets footnote
+numbering so that the next footnote you enter is numbered 1.
+</p>
+
+<p>
+<kbd>.RESET_FOOTNOTE_NUMBER&nbsp;PAGE</kbd> tells mom to start every
+page&#8217;s footnote numbering at 1.
+</p>
+
+<h4 id="footnote-space" class="docs" style="margin-top: -.25em;">6. Inter-footnote spacing &ndash; FOOTNOTE_SPACING</h4>
+
+<p>
+If you&#8217;d like some space between footnotes, you can
+have mom put it in for you by invoking <kbd>.FOOTNOTE_SPACING</kbd>
+with an argument representing the amount of extra space you&#8217;d
+like. The argument to FOOTNOTE_SPACING requires a
+<a href="definitions.html#unitofmeasure">unit of measure</a>.
+</p>
+
+<p>
+In the following example, footnotes will be separated from each
+other by 3
+<a href="definitions.html#picaspoints">points</a>.
+<br/>
+<span class="pre-in-pp">
+ .FOOTNOTE_SPACING 3p
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If you&#8217;re using footnotes for references generated from the
+refer database (see
+<a href="refer.html">refer.html</a>),
+correct MLA style requires a full linespace between footnotes, which
+you can accomplish with <kbd>.FOOTNOTE_SPACING&nbsp;1v</kbd>.
+</p>
+</div>
+
+<h4 id="footnote-rule" class="docs" style="margin-top: -.25em;">7. Footnote rule &ndash; FOOTNOTE_RULE</h4>
+
+<p>
+If you don&#8217;t want a footnote separator rule, toggle it
+off with <kbd>.FOOTNOTE_RULE&nbsp;OFF</kbd> (or <kbd>END</kbd>,
+<kbd>QUIT</kbd>, <kbd>X</kbd>...). Toggle it back on by invoking
+<kbd>.FOOTNOTE_RULE</kbd> with no argument. The default is to print
+the rule.
+</p>
+
+<h4 id="footnote-rule-length" class="docs" style="margin-top: -.25em;">8. Footnote rule length &ndash; FOOTNOTE_RULE_LENGTH</h4>
+
+<p>
+If you want to change the length of the footnote separator rule,
+invoke <kbd>.FOOTNOTE_RULE_LENGTH</kbd> with a length, like this,
+<br/>
+<span class="pre-in-pp">
+ .FOOTNOTE_RULE_LENGTH 1i
+</span>
+
+which sets the length to 1 inch. Note that a
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+is required. The default is 4
+<a href="definitions.html#picaspoints">picas</a>
+for both
+<a href="docprocessing.html#printstyle">PRINTSTYLE</a>s.
+</p>
+
+<h4 id="footnote-rule-weight" class="docs" style="margin-top: -.25em;">9. Footnote rule weight &ndash; FOOTNOTE_RULE_WEIGHT</h4>
+
+<p>
+If you want to change the weight (&#8220;thickness&#8221;) of the
+footnote separator rule, invoke <kbd>.FOOTNOTE_RULE_WEIGHT</kbd>
+with the desired weight. The weight is measured in
+<a href="definitions.html#picaspoints">points</a>;
+however, do not append the
+<a href="definitions.html#unitofmeasure">unit of measure</a>,
+<kbd>p</kbd>, to the argument.
+</p>
+
+<p>
+Mom&#8217;s default footnote rule weight is 1/2 point. If
+you&#8217;d like a 1-point rule instead,<br/>
+<span class="pre-in-pp">
+ .FOOTNOTE_RULE_WEIGHT 1
+</span>
+is how you&#8217;d get it.
+</p>
+
+<h4 id="footnote-rule-adj" class="docs" style="margin-top: -.25em;">10. Adjust vertical position of footnote separator rule &ndash; FOOTNOTE_RULE_ADJ</h4>
+
+<p>
+The footnote separator rule is a rule whose bottom edge falls
+on the
+<a href="definitions.html#baseline">baseline</a>
+(at the footnote
+<a href="definitions.html#leading">leading</a>)
+one line above the first line of a page&#8217;s footnotes. By default,
+mom raises the rule 3
+<a href="definitions.html#picaspoints">points</a>
+from the baseline so that the separator and the footnotes don&#8217;t
+look jammed together. If you&#8217;d prefer a different vertical
+adjustment, invoke <kbd>.FOOTNOTE_RULE_ADJ</kbd> with the
+amount you&#8217;d like. For example
+<br/>
+<span class="pre-in-pp">
+ .FOOTNOTE_RULE_ADJ 4.25p
+</span>
+raises the rule by 4-1/4 points. Note that you can only raise
+the rule, not lower it. A
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+is required.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If your document
+<a href="definitions.html#leading">leading</a>
+is 2
+<a href="definitions.html#picaspoints">points</a>
+or less (e.g your
+<a href="definitions.html#ps">point size</a>
+is 10 and your linespacing is 10, 11, or 12), lowering mom&#8217;s
+default footnote rule adjustment will almost certainly give you
+nicer looking results than leaving the adjustment at the default.
+Furthermore, you can invoke <kbd>.FOOTNOTE_RULE_ADJ</kbd> 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.
+</p>
+</div>
+
+<div class="rule-short"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="endnote-intro" class="macro-group">Endnotes</h2>
+
+<ul style="margin-left: -.5em;">
+ <li><a href="#endnote-behaviour">Endnotes behaviour</a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#endnote-columns">Endnotes and columnar documents</a></li>
+ </ul></li>
+ <li><a href="#endnote">Tag: ENDNOTE</a></li>
+ <li><a href="#endnotes">Macro: <b>ENDNOTES</b></a>&mdash;tell mom to output endnotes</li>
+ <li><a href="#endnote-control">ENDNOTES control macros and defaults</a></li>
+</ul>
+
+<p>
+Embedding endnotes into mom documents is accomplished the same way
+as embedding
+<a href="#footnote-intro">footnotes</a>.
+The example below is identical to the one shown in the
+<a href="#footnote-example">introduction to footnotes</a>,
+except that <kbd>.FOOTNOTE</kbd> has been replaced with
+<kbd>.ENDNOTE</kbd>.
+</p>
+
+<div id="examples" class="examples-container" style="padding-bottom: 1em;">
+<div class="examples" style="margin-top: 0; margin-bottom: -.25em;">Example</div>
+<span id="endnote-example" class="pre">
+ ...the doctrines of Identity as urged by Schelling\c
+ .ENDNOTE
+ &lt;endnote about who the hell is Schelling&gt;
+ .ENDNOTE OFF
+ were generally the points of discussion presenting the most
+ of beauty to the imaginative Morella.
+</span>
+</div>
+
+<p>
+As with footnotes, note the obligatory use of the <kbd>\c</kbd>
+<a href="definitions.html#inlines">inline escape</a>
+when your
+<a href="#endnote-marker-style">ENDNOTE_MARKER_STYLE</a>
+is <kbd>NUMBER</kbd> or <kbd>SUPERSCRIPT</kbd> (both of which mark
+endnotes references in
+<a href="definitions.html#running">running text</a>
+with superscript numbers). When the marker style is
+<kbd>LINE</kbd>, you must <i>not</i> use the <kbd>\c</kbd>
+escape.
+</p>
+
+<p>
+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):
+</p>
+
+<ol style="margin-top: -.5em;">
+ <li>When your ENDNOTE_MARKER_STYLE is <kbd>NUMBER</kbd> or
+ <kbd>SUPERSCRIPT</kbd>, endnotes are always numbered
+ incrementally, starting at &#8220;1&#8221;.
+ </li>
+ <li>Endnotes must be output explicitly; mom does not output
+ them for you. In
+ <a href="rectoverso.html#collate">collated</a>
+ 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.
+ </li>
+</ol>
+
+<p>
+Within endnotes, you may use the document element tags
+<a href="#pp">PP</a>,
+<a href="#quote">QUOTE</a>
+and
+<a href="#blockquote">BLOCKQUOTE</a>.
+This provides the flexibility to create endnotes that run to several
+paragraphs, as well as to embed cited text within endnotes.
+</p>
+
+<p>
+Should you wish to change the appearance of quotes or blockquotes
+that appear within endnotes, you may do so with the
+<a href="#quote-control">quote control macros</a>
+or
+<a href="#blockquote-control">blockquote control macros</a>.
+However, you must make the changes <i>within</i> each endnote,
+prior to invoking <kbd>.QUOTE</kbd> or <kbd>.BLOCKQUOTE</kbd>,
+and undo them prior to terminating the endnote (i.e. before
+<kbd>.ENDNOTE&nbsp;OFF</kbd>), otherwise the changes will affect
+subsequent quotes and blockquotes that appear in the document body
+as well.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+See
+<a href="refer.html">refer.html</a>
+for information on using endnotes with the <kbd>refer</kbd>
+bibliographic database.
+</p>
+</div>
+
+<h3 id="endnote-behaviour" class="docs">Endnotes behaviour</h3>
+
+<p>
+When you output endnotes (with
+<kbd><a href="#endnotes">.ENDNOTES</a></kbd>),
+mom finishes processing the last page of your document, then breaks
+to a new page for printing the endnotes. If the document type is
+<kbd><a href="docprocessing.html#doctype">CHAPTER</a></kbd>,
+the centre part of the
+<a href="definitions.html#header">header</a>
+(or footer), which, by default, contains a chapter number or title,
+is removed.
+</p>
+
+<p>
+By default, mom starts the endnotes page with a bold, centred head,
+&#8220;ENDNOTES&#8221;. Subsequently, for each section in a
+<a href="rectoverso.html#collate-intro">collated</a>
+document (e.g. chapters in a book), she identifies the section in bold
+type, flush left and underscored, followed by one-half linespace.
+Endnotes pertaining to the section are output underneath, identified
+by superscript numbers. The text of the endnotes themselves is
+indented to the right of the numbers.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+The one-half linespace between section identifiers and the endnotes
+themselves, plus the need to group identifiers and endnotes sensibly,
+means that mom cannot guarantee perfectly aligned bottom margins.
+This is an unavoidable consequence of the structure of endnotes.
+</p>
+</div>
+
+<p>
+Of course, all the defaults, as well as the overall style of the
+endnotes pages, can be changed with the
+<a href="#endnote-control">endnote control macros</a>.
+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.
+</p>
+
+<h3 id="endnote-columns" class="docs">Endnotes and columnar documents</h3>
+
+<p>
+If your document is set in columns (see
+<a href="docprocessing.html#columns">COLUMNS</a>),
+mom gives you the option to have endnotes appear in either
+the column format or set to the full page width. See
+<a href="#endnotes-no-columns">ENDNOTES_NO_COLUMNS</a>.
+</p>
+
+<!-- -ENDNOTE- -->
+
+<div class="macro-id-overline">
+<h3 id="endnote" class="macro-id">ENDNOTE</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTE</b> <kbd class="macro-args">&lt;toggle&gt; [ BREAK | BR ]</kbd>
+</div>
+<p class="requires">
+See <span style="font-style: normal"><a href="#endnote-note">HYPER-IMPORTANT NOTE</a></span>
+</p>
+
+<p>
+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. <kbd>OFF</kbd>, <kbd>QUIT</kbd>,
+<kbd>END</kbd>, <kbd>X</kbd>...) tells mom that you&#8217;ve
+finished the endnote.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If an endnote runs to more than one paragraph, do <i>not</i> begin
+the endnote with the
+<a href="#pp">PP</a>
+tag. Use PP only to introduce subsequent paragraphs.
+</p>
+</div>
+
+<div id="endnote-note" class="box-tip">
+<p class="tip-top">
+<span class="note">HYPER-IMPORTANT NOTE:</span>
+If your
+<a href="#endnote-marker-style">ENDNOTE_MARKER_STYLE</a>
+is <kbd>NUMBER</kbd> or <kbd>SUPERSCRIPT</kbd> (mom&#8217;s
+default is <kbd>NUMBER</kbd> unless you have
+<a href="refer.html#endnote-refs">ENDNOTE_REFS</a>
+enabled, in which case it&#8217;s <kbd>SUPERSCRIPT</kbd>), the final word on the
+<a href="definitions.html#inputline">input line</a>
+that comes immediately before <kbd>.ENDNOTE</kbd> must terminate
+with a
+<a href="typesetting.html#join"><kbd>\c</kbd></a>
+inline escape. See the
+<a href="#endnote-example">endnote example</a>
+above.
+</p>
+
+<p>
+Additionally, in
+<a href="definitions.html#filled">fill</a>
+modes
+(<a href="typesetting.html#justify">JUSTIFY</a>
+or
+<a href="typesetting.html#quad">QUAD</a>,
+the line after <kbd>.ENDNOTE&nbsp;OFF</kbd> 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
+explanation and examples for footnotes, which apply equally to
+endnotes,
+<a href="#fn-and-punct">here</a>).
+</p>
+
+<p>
+In
+<a href="definitions.html#filled">no-fill</a>
+modes, the optional argument <kbd>BREAK</kbd> or <kbd>BR</kbd> may
+be used after the <kbd>OFF</kbd> (or <kbd>OFF</kbd>,
+<kbd>QUIT</kbd>, <kbd>END</kbd>, <kbd>X</kbd>, etc) argument to
+instruct mom not to join the next input line to the previous output.
+See
+<a href="#fn-and-punct-nofill">here</a>
+for a more complete explanation. The examples are for
+<kbd>.FOOTNOTE</kbd>, but apply equally to <kbd>.ENDNOTE</kbd>.
+</p>
+
+<p class="tip-bottom">
+If your ENDNOTE_MARKER_STYLE is LINE, do not use the <kbd>\c</kbd>
+escape, and enter the line after <kbd>.ENDNOTE OFF</kbd> normally,
+ie at your text editor&#8217;s left margin.
+</p>
+</div>
+
+<!-- -ENDNOTES- -->
+
+<div class="macro-id-overline">
+<h3 id="endnotes" class="macro-id">ENDNOTES</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTES</b>
+</div>
+
+<p>
+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.
+</p>
+
+<p>
+Typically, you&#8217;ll use ENDNOTES at the end of a document. If
+it&#8217;s a single (i.e. not collated) document, mom will print
+the endnotes pertaining to it. If it&#8217;s a collated document,
+mom will print all the endnotes contained within all sections of
+the document (typically chapters), appropriately identified and
+numbered.
+</p>
+
+<p>
+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 <kbd>.ENDNOTES</kbd>
+immediately prior to
+<a href="rectoverso.html#collate">COLLATE</a>.
+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 <kbd>.ENDNOTES</kbd>
+outputs only those endnotes that mom collected after the previous
+invocation.
+</p>
+
+<div class="defaults-container" style="background-color: #ded4bd; border: none;">
+<h3 id="endnote-control" class="docs defaults">ENDNOTES control macros and defaults</h3>
+
+<div class="box-important" style="width: 700px; margin: auto; background-color: #ded4bd;">
+<p class="tip-top" style="color: #000056;">
+<span class="important">Important:</span>
+Endnotes control macros must always be invoked prior to the first
+instance of
+<a href="#endnote"><kbd>.ENDNOTE</kbd></a>.
+</p>
+
+<p style="color: #000056; margin-top: -.5em;">
+When you embed endnotes in the body of a document, mom collects
+<i>and processes</i> them for later outputting (when you invoke
+<a href="#endnotes"><kbd>.ENDNOTES</kbd></a>).
+By the time you do invoke <kbd
+style="color: #000056;">.ENDNOTES</kbd>, it&#8217;s much too late to
+change your mind about how you want them to look.
+</p>
+
+<p class="tip-bottom" style="color: #000056; margin-top: -.5em;">
+My advice? If you&#8217;re planning to change the default
+appearance of endnotes pages, set them up prior to
+<a href="docprocessing.html#start">START</a>.
+</p>
+</div>
+
+<ol style="margin-top: .5em; padding-bottom: .5em;">
+ <li><a href="#endnotes-general"><b>General endnotes style control</b></a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#endnote-style">Base family/font/quad</a></li>
+ <li><a href="#endnote-pt-size">Base point size</a></li>
+ <li><a href="#endnote-lead">Leading</a></li>
+ <li><a href="#endnote-spacing">Spacing between endnotes</a></li>
+ <li><a href="#singlespace-endnotes">Singlespace endnotes (TYPEWRITE only)</a></li>
+ <li><a href="#endnote-para-indent">Paragraph indenting</a></li>
+ <li><a href="#endnote-para-space">Inter-paragraph spacing</a></li>
+ <li><a href="#endnotes-no-columns">Turning off column mode during endnotes output</a></li>
+ </ul></li>
+ <li><a href="#endnotes-pagination"><b>Pagination of endnotes</b></a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#endnotes-pagenum-style">Page numbering style</a></li>
+ <li><a href="#endnotes-first-pagenumber">Setting the first page number of endnotes</a></li>
+ <li><a href="#endnotes-no-first-pagenum">Omitting a page number on the first page of endnotes</a></li>
+ <li><a href="#suspend-pagination">Suspending pagination during endnotes output</a></li>
+ </ul></li>
+ <li><a href="#endnotes-header-control"><b>Header/footer control</b></a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#endnotes-modify-hdrftr">Modifying what goes in the endnotes header/footer</a></li>
+ <li><a href="#endnotes-hdrftr-center">Header/footer centre string when doctype is CHAPTER</a></li>
+ <li><a href="#endnotes-allows-headers">Allow headers on endnotes pages</a></li>
+ </ul></li>
+ <li><a href="#endnotes-header"><b>Endnotes header (first-page title) control</b></a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#endnotes-header-string">Header string</a></li>
+ <li><a href="#endnotes-header-string-control">Header string control macros and defaults</a></li>
+ <li><a href="#endnotes-header-placement">Header string placement</a></li>
+ <li><a href="#endnotes-header-underscore">Header string underscoring</a></li>
+ <li><a href="#endnotes-header-caps">Header string capitalization</a></li>
+ </ul></li>
+ <li><a href="#endnotes-doc-title"><b>Endnotes document-identification string control</b></a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#endnote-title">Document-identification string(s)</a></li>
+ <li><a href="#endnote-title-control">Document-identification string control macros and defaults</a></li>
+ </ul></li>
+ <li><a href="#endnotes-numbering"><b>Endnotes referencing style</b></a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#endnote-marker-style">Endnote marker style</a> &ndash; by numbers in the text, or by line number
+ <ul style="margin-left: -.5em;">
+ <li><a href="#endnote-linenumber-gap">Spacing between line-numbered endnotes and the endnote text</a></li>
+ <li><a href="#endnote-linenumber-brackets">Brackets around endnote line numbers</a></li>
+ <li><a href="#endnote-linenumber-separator">Separator after endnote line numbers instead of brackets</a></li>
+ </ul></li>
+ <li><a href="#endnote-number-control">Endnote numbering control macros and defaults</a></li>
+ <li><a href="#endnote-number-alignment">Endnote numbering alignment</a></li>
+ </ul></li>
+</ol>
+</div>
+
+<h4 id="endnotes-general" class="docs" style="margin-top: -1.5em; margin-bottom: .5em;">1. General endnotes page style control</h4>
+
+<h5 id="endnote-style" class="docs" style="margin-top: 0; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Base family/font/quad</h5>
+
+<div class="defaults-container" style="padding-bottom: 8px;">
+<p class="defaults" style="padding-top: 6px;">
+See
+<a href="#control-macro-args">Arguments to the control macros</a>.
+<br/>
+The following ENDNOTE control macros may also be
+<a href="#grouping">grouped</a>
+using ENDNOTE_STYLE.
+</p>
+<span class="pre defaults">
+.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 (LEFT) or J (JUSTIFIED);
+ R (RIGHT) and C (CENTER) will not work.
+</span>
+</div>
+
+<!-- -ENDNOTE_PT_SIZE- -->
+
+<h5 id="endnote-pt-size" class="docs" style="margin-top: -1.5em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Base point size</h5>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTE_PT_SIZE</b> <kbd class="macro-args">&lt;base type size of endnotes&gt;</kbd>
+</div>
+
+<p>
+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
+<a href="definitions.html#picaspoints">points</a>,
+unless you append an alternative
+<a href="definitions.html#unitofmeasure">unit of measure</a>.
+For example,
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTE_PT_SIZE 12
+</span>
+sets the base point size of type on the endnotes page to 12
+points, whereas
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTE_PT_SIZE .6i
+</span>
+sets the base point size of type on the endnotes page to 1/6 of an
+inch.
+</p>
+
+<p>
+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.
+</p>
+
+<p>
+The default for
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPESET</kbd></a>
+is 12.5 points (the same default size used in the body of the
+document).
+</p>
+
+<!-- -ENDNOTE_LEAD- -->
+
+<h5 id="endnote-lead" class="docs" style="margin-top: -.5em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Leading</h5>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTE_LEAD</b> <kbd class="macro-args">&lt;base leading of endnotes&gt; [ ADJUST ] </kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Does not require a <a href="definitions.html#unitofmeasure">unit of measure</a>; points is assumed
+</p>
+
+<p>
+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
+<a href="definitions.html#leading">leading</a>
+of endnotes in
+<a href="definitions.html#picaspoints">points</a>
+unless you append an alternative
+<a href="definitions.html#unitofmeasure">unit of measure</a>.
+For example,
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTE_LEAD 14
+</span>
+sets the base leading of type on the endnotes page to 14
+points, whereas
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTE_LEAD .5i
+</span>
+sets the base leading of type on the endnotes page to 1/2 inch.
+</p>
+
+<p>
+If you want the leading of endnotes adjusted to fill the page, pass
+ENDNOTE_LEAD the optional argument
+<kbd>ADJUST</kbd>. (See
+<a href="docprocessing.html#doc-lead-adjust">DOC_LEAD_ADJUST</a>
+for an explanation of leading adjustment.)
+</p>
+
+<p>
+The default for
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPESET</kbd></a>
+is the prevailing document leading (16 by default), adjusted.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Even if you give mom a <kbd>.DOC_LEAD_ADJUST&nbsp;OFF</kbd> command, she
+will still, by default, adjust endnote leading. You <i>must</i>
+enter <kbd>.ENDNOTE_LEAD&nbsp;&lt;lead&gt;</kbd> with no
+<kbd>ADJUST</kbd> argument to disable this default behaviour.
+</p>
+</div>
+
+<!-- -ENDNOTE_SPACING- -->
+
+<h5 id="endnote-spacing" class="docs" style="margin-top: -.5em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Spacing between endnotes</h5>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTE_SPACING</b> <kbd class="macro-args">&lt;space to insert between endnotes&gt;</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+If you&#8217;d like some whitespace between endnotes, just invoke
+ENDNOTE_SPACING with the amount of space you want, e.g.
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTE_SPACING 6p
+</span>
+which inserts 6 points of lead between endnotes. Be aware, though,
+that inserting space between endnotes means that the bottoms of
+endnotes pages will most likely not align.
+</p>
+
+<p>
+Mom&#8217;s default is not to insert any whitespace between endnotes.
+</p>
+
+<!-- -SINGLESPACE_ENDNOTES- -->
+
+<h5 id="singlespace-endnotes" class="docs" style="margin-top: 0; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Singlespace endnotes (TYPEWRITE only)</h5>
+
+<div class="box-macro-args">
+Macro: <b>SINGLESPACE_ENDNOTES</b> <kbd class="macro-args">&lt;toggle&gt;</kbd>
+</div>
+
+<p>
+If your
+<a href="docprocessing.html#printstyle">PRINTSTYLE</a>
+is <kbd>TYPEWRITE</kbd> and you use TYPEWRITE&#8217;s default
+double-spacing, endnotes are double-spaced. If your document is
+single-spaced, endnotes are single-spaced.
+</p>
+
+<p>
+If, for some reason, you&#8217;d prefer that endnotes be
+single-spaced in an otherwise double-spaced document (including
+double-spaced
+<a href="rectoverso.html#collate">collated</a>
+documents), invoke
+<br/>
+<span class="pre-in-pp">
+ .SINGLESPACE_ENDNOTES
+</span>
+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 <kbd>.SINGLESPACE_ENDNOTES</kbd> with any argument
+(<kbd>OFF</kbd>, <kbd>QUIT</kbd>, <kbd>END</kbd>, <kbd>X</kbd>...).
+</p>
+
+<!-- -ENDNOTE_PARA_INDENT- -->
+
+<h5 id="endnote-para-indent" class="docs" style="margin-top: 0; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Paragraph indenting</h5>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTE_PARA_INDENT</b> <kbd class="macro-args">&lt;amount to indent first line of paragraphs in endnotes&gt;</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+ENDNOTE_PARA_INDENT works exactly the same way as
+<a href="#para-indent">PARA_INDENT</a>,
+except that the indent given is the amount by which to indent the
+first lines of endnote paragraphs, not document body paragraphs.
+</p>
+
+<p>
+The default is 1.5
+<a href="definitions.html#em">ems</a>
+for
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPESET</kbd></a>;
+1/2 inch for
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPEWRITE</kbd></a>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+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.
+</p>
+</div>
+
+<!-- -ENDNOTE_PARA_SPACE- -->
+
+<h5 id="endnote-para-space" class="docs" style="margin-top: -.5em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Inter-paragraph spacing</h5>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTE_PARA_SPACE</b> <kbd class="macro-args">&lt;toggle&gt;</kbd>
+</div>
+
+<p>
+ENDNOTE_PARA_SPACE works exactly the same way as
+<a href="#pp-space">PARA_SPACE</a>,
+except that it inserts a blank line between endnote paragraphs, not
+document body paragraphs.
+</p>
+
+<p>
+The default is not to insert a blank line between paragraphs in
+endnotes.
+</p>
+
+<!-- -ENDNOTES_NO_COLUMNS- -->
+
+<h5 id="endnotes-no-columns" class="docs" style="margin-top: 0; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Turning off column mode during endnotes output</h5>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTES_NO_COLUMNS</b> <kbd class="macro-args">&lt;toggle&gt;</kbd>
+</div>
+
+<p>
+By default, if your document is set in
+<a href="docprocessing.html#columns">columns</a>,
+mom sets the endnotes in columns, too. However, if your document
+is set in columns and you&#8217;d like the endnotes not to be,
+just invoke <kbd>.ENDNOTES_NO_COLUMNS</kbd> with no argument.
+The endnotes pages will be set to the full page measure of your
+document.
+</p>
+
+<p>
+If you output endnotes at the end of each document in a
+<a href="rectoverso.html#collate">collated</a>
+document set in columns, column mode will automatically be
+reinstated for each document, even with ENDNOTES_NO_COLUMNS turned
+on. In such circumstances, you must re-enable ENDNOTES_NO_COLUMNS
+for each separate collated document.
+</p>
+
+<h4 id="endnotes-pagination" class="docs" style="margin-bottom: .5em;">2. Pagination of endnotes</h4>
+
+<!-- -ENDNOTES_PAGENUM_STYLE- -->
+
+<h5 id="endnotes-pagenum-style" class="docs" style="margin-top: 0; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Page numbering style</h5>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTES_PAGENUM_STYLE</b> <kbd class="macro-args">DIGIT | ROMAN | roman | ALPHA | alpha</kbd>
+</div>
+
+<p>
+Use this macro to set the page numbering style of endnotes pages.
+The arguments are identical to those for
+<a href="headfootpage.html#pagenum-style">PAGENUM_STYLE</a>.
+The default is <kbd>digit</kbd>. You may want to change it to, say,
+<kbd>alpha</kbd>, which you would do with
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTES_PAGENUM_STYLE alpha
+</span>
+</p>
+
+<!-- -ENDNOTES_FIRST_PAGENUMBER- -->
+
+<h5 id="endnotes-first-pagenumber" class="docs" style="margin-top: -.5em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Setting the first page number of endnotes</h5>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTES_FIRST_PAGENUMBER</b> <kbd class="macro-args">&lt;page # that appears on page 1 of endnotes&gt;</kbd>
+</div>
+
+<p>
+Use this macro with caution. If all endnotes for several
+<a href="rectoverso.html#collate">collated</a>
+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.
+</p>
+
+<p>
+However, if you set ENDNOTES_FIRST_PAGENUMBER in collated documents
+in which the endnotes are output after each section (chapter,
+article, etc), you have to reset every section&#8217;s first page
+number after
+<a href="rectoverso.html#collate">COLLATE</a>
+and before
+<a href="docprocessing.html#start">START</a>
+with
+<a href="headfootpage.html#pagenumber">PAGENUMBER</a>.
+</p>
+
+<!-- -ENDNOTES_NO_FIRST_PAGENUN- -->
+
+<h5 id="endnotes-no-first-pagenum" class="docs" style="margin-top: -.25em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Omitting a page number on the first page of endnotes</h5>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTES_NO_FIRST_PAGENUM</b> <kbd class="macro-args">&lt;toggle&gt;</kbd>
+</div>
+
+<p>
+This macro is for use only if
+<a href="headfootpage.html#footers">FOOTERS</a>
+are on. It tells
+<a href="#endnotes">ENDNOTES</a>
+not to print a page number on the first endnotes page. Mom&#8217;s
+default is to print the page number.
+</p>
+
+<!-- -SUSPEND_PAGINATION- -->
+
+<h5 id="suspend-pagination" class="docs" style="margin-top: -.5em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Suspending pagination during endnotes output</h5>
+
+<div class="box-macro-args" style="margin-bottom: 1em;">
+Macro: <b>SUSPEND_PAGINATION</b>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>RESTORE_PAGINATION</b>
+</div>
+
+<p>
+SUSPEND_PAGINATION doesn&#8217;t take an argument. Invoked
+immediately prior to
+<a href="#endnotes">ENDNOTES</a>,
+it turns off endnotes pages pagination. Mom continues, however to
+increment page numbers silently.
+</p>
+
+<p>
+To restore normal document pagination after endnotes, invoke
+<kbd>.RESTORE_PAGINATION</kbd> (again, with no argument) immediately
+after <kbd>.ENDNOTES</kbd>.
+</p>
+
+<h4 id="endnotes-header-control" class="docs" style="margin-bottom: .5em;">3. Header/footer control</h4>
+
+<h5 id="endnotes-modify-hdrftr" class="docs" style="margin-top: 0; margin-bottom: -.75em; margin-left: .5em;">&bull;&nbsp;Modifying what goes in the endnotes header/footer</h5>
+
+<p>
+If you wish to modify what appears in the header/footer that appears
+on endnotes page(s), make the changes before you invoke
+<a href="#endnotes"><kbd>.ENDNOTES</kbd></a>,
+not afterwards.
+</p>
+
+<p>
+Except in the case of
+<a href="docprocessing.html#doctype">DOCTYPE <kbd>CHAPTER</kbd></a>,
+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
+<kbd><a href="#endnotes-hdrftr-center">.ENDNOTES_HEADER_CENTER</a></kbd>
+with no argument.
+</p>
+
+<p>
+An important change you may want to make is to put the word
+&#8220;Endnotes&#8221; in the header/footer centre position. To do
+so, invoke
+<br/>
+<span class="pre-in-pp" style="margin-bottom: -1em;">
+ .HEADER_CENTER "Endnotes"
+</span>
+or
+<span class="pre-in-pp" style="margin-top: -.5em;">
+ .FOOTER_CENTER "Endnotes"
+</span>
+prior to invoking <kbd>.ENDNOTES</kbd>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If your
+<a href="docprocessing.html#doctype">DOCTYPE</a>
+is <kbd>CHAPTER</kbd>, you must also invoke
+<a href="#endnotes-hdrftr-center">ENDNOTES_HEADER_CENTER</a>
+for the ENDNOTES_HEADER_CENTER to appear.
+</p>
+</div>
+
+<h5 id="endnotes-hdrftr-center" class="docs" style="margin-top: 0; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Header/footer centre string when doctype is CHAPTER</h5>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTES_HEADER_CENTER</b> <kbd class="macro-args">toggle</kbd>
+</div>
+
+<p>
+If your
+<a href="docprocessing.html#doctype">DOCTYPE</a>
+is <kbd>CHAPTER</kbd> and you want mom to include a centre
+string in the headers/footers that appear on endnotes
+pages, invoke <kbd>.ENDNOTES_HEADER_CENTER</kbd> (or
+<kbd>.ENDNOTES_FOOTER_CENTER</kbd>) with no argument. Mom&#8217;s
+default is not to print the centre string.
+</p>
+
+<p>
+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 (<kbd>OFF</kbd>, <kbd>QUIT</kbd>, <kbd>END</kbd>,
+<kbd>X</kbd>...). </p>
+
+<h5 id="endnotes-allows-headers" class="docs" style="margin-top: -.5em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Allow headers on endnotes pages</h5>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTES_ALLOWS_HEADERS</b> <kbd class="macro-args">&lt;none&gt; | ALL</kbd>
+</div>
+
+<p>
+By default, if HEADERS are on, mom prints page headers on all
+endnotes pages except the first. If you don&#8217;t want her to
+print headers on endnotes pages, do
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTES_ALLOWS_HEADERS OFF
+</span>
+If you want headers on every page including the first, do
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTES_ALLOWS_HEADERS ALL
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+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.
+</p>
+</div>
+
+<h4 id="endnotes-header" class="docs">4. Endnotes header (first-page title) control</h4>
+
+<!-- -ENDNOTES_HEADER_STRING- -->
+
+<h5 id="endnotes-header-string" class="docs" style="margin-top: 1em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Header (first-page title) string</h5>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTES_HEADER_STRING</b> <kbd class="macro-args">&quot;&lt;title to print at the top of endnotes&gt;&quot;</kbd>
+</div>
+
+<p class="alias" style="margin-bottom: 0;">
+<i>Alias:</i> <b>ENDNOTE_STRING</b> (for compatibility with older documents)
+</p>
+
+<p>
+By default, mom prints the word &#8220;ENDNOTES&#8221; as a head
+at the top of the first page of endnotes. If you want her to
+print something else, invoke <kbd>.ENDNOTES_HEADER_STRING</kbd>
+with the endnotes-page head you want, surrounded by double-quotes.
+If you don&#8217;t want a head at the top of the first
+endnotes-page, invoke <kbd>.ENDNOTES_HEADER_STRING</kbd>
+with a blank argument (either two double-quotes side by
+side&mdash;<kbd>&quot;&quot;</kbd>&mdash;or no argument at all).
+</p>
+
+<!-- -ENDNOTES_HEADER_CONTROL- -->
+
+<h5 id="endnotes-header-string-control" class="docs" style="margin-top: -.5em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Header (first-page title) control macros and defaults</h5>
+
+<div class="defaults-container" style="padding-bottom: 8px;">
+<p class="defaults" style="padding-top: 6px;">
+See
+<a href="#control-macro-args">Arguments to the control macros</a>.
+<br/>
+The following ENDNOTES_HEADER control macros may also be
+<a href="#grouping">grouped</a>
+using ENDNOTES_HEADER_STYLE.
+</p>
+
+<p style="margin-top: .5em; margin-bottom: 0; margin-left: .5em">
+Please note that &#8220;_HEADER_&#8221;, here, refers to the title
+that appears at the top of the first endnotes page, not to the page
+headers of subsequent endnotes pages.
+<span class="pre defaults">
+.ENDNOTES_HEADER_FAMILY default = prevailing document family
+.ENDNOTES_HEADER_FONT default = bold
+.ENDNOTES_HEADER_SIZE* default = +1
+.ENDNOTES_HEADER_QUAD default = centred
+.ENDNOTES_HEADER_COLOR default = black
+
+*Relative to the size of the endnotes text (set with ENDNOTE_PT_SIZE)
+</span>
+</p>
+</div>
+
+<p style="margin-top: -2em">
+<b>Note:</b> <i>For compatibility with older documents, these macros are aliased
+as</i> <kbd>.ENDNOTE_STRING_&lt;SPEC&gt;</kbd>, e.g. <kbd>.ENDNOTE_STRING_FAMILY</kbd>.
+</p>
+
+<!-- -ENDNOTES_HEADER_V_POS- -->
+
+<h5 id="endnotes-header-placement" class="docs" style="margin-top: -.25em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Header (first-page title) placement</h5>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTES_HEADER_V_POS</b> <kbd class="macro-args">&lt;distance from top of page&gt;</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Argument requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p class="alias" style="margin-top: -1em; margin-bottom: 0;">
+<i>Alias:</i> <b>ENDNOTE_STRING_ADVANCE</b> (for compatibility with older documents)
+</p>
+
+<p>
+By default, mom places the title (the docheader, as it were) of
+endnotes pages (typically "ENDNOTES") on the same
+<a href="definitions.html#baseline">baseline</a>
+that is used for the start of
+<a href="definitions.html#running">running text</a>.
+If you&#8217;d prefer another location, higher or lower on the page
+(thereby also raising or lowering the starting position of the
+endnotes themselves), invoke <kbd>.ENDNOTES_HEADER_V_POS</kbd> with
+an argument stating the distance from the top edge of the page at
+which you&#8217;d like the title placed.
+</p>
+
+<p>
+The argument requires a unit of measure, so if you&#8217;d like the title
+to appear 1-1/2 inches from the top edge of the page, you&#8217;d tell
+mom about it like this:
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTES_HEADER_V_POS 1.5i
+</span>
+</p>
+
+<!-- -ENDNOTES_HEADER_UNDERSCORE- -->
+
+<h5 id="endnotes-header-underscore" class="docs" style="margin-top: -1em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Header (first-page title) underscoring</h5>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTES_HEADER_UNDERSCORE</b> <kbd class="macro-args">[DOUBLE] [&lt;underscore weight&gt; [&lt;underscore gap&gt; [&lt;distance between double rules]]] | &lt;none&gt; | &lt;anything&gt;</kbd>
+</div>
+
+<p class="alias" style="margin-bottom: 0;">
+<i>Alias:</i> <b>ENDNOTES_HEADER_UNDERLINE</b>.
+<i>(For compatibility with older documents, also
+aliased as</i> <b>ENDNOTE_STRING_UNDERSCORE</b> <i>and</i>
+<b>ENDNOTE_STRING_UNDERLINE</b>.)
+</p>
+
+<p class="requires">
+&bull;&nbsp;The argument
+<span style="font-style: normal"><kbd>&lt;underscore weight&gt;</kbd></span>
+must not have the
+<a href="definitions.html#unitofmeasure">unit of measure</a>,
+<span style="font-style: normal;"><kbd>p</kbd></span>,
+appended to it; all other arguments require a unit of measure
+</p>
+
+<p>
+Invoked without an argument, <kbd>.ENDNOTES_HEADER_UNDERSCORE</kbd>
+will place a single rule underneath the endnotes page title. Invoked
+with the argument, <kbd>DOUBLE</kbd>, ENDNOTES_HEADER_UNDERSCORE will
+double-underscore the title. Invoked with any other non-numeric
+argument, (e.g. <kbd>OFF, NO, X</kbd>, etc.) the macro disables
+underscoring of the title.
+</p>
+
+<p>
+In addition, you can use ENDNOTES_HEADER_UNDERSCORE to control the
+weight of the underscore rule(s), the gap between the title and the
+underscore, and, in the case of double-underscores, the distance
+between the two rules.
+</p>
+
+<p>
+Some examples:
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTES_HEADER_UNDERSCORE 1
+ - turn underscoring on; set the rule weight to 1 point
+
+ .ENDNOTES_HEADER_UNDERSCORE 1 3p
+ - turn underscoring on; set the rule weight to 1 point; set
+ the gap between the title and the underscore to 3 points
+
+ .ENDNOTES_HEADER_UNDERSCORE DOUBLE .75 3p
+ - turn double-underscoring on; set the rule weight to 3/4 of
+ a point; set the gap between the title and the upper
+ underscore to 3 points; leave the gap between the upper
+ and the lower underscore at the default
+
+ .ENDNOTES_HEADER_UNDERSCORE DOUBLE 1.5 1.5p 1.5p
+ - turn double-underscoring on; set the rule weight to 1-1/2
+ points; set the gap between the title and the upper
+ underscore to 1-1/2 points; set the gap between the upper
+ and the lower underscore to 1-1/2 points
+</span>
+Note, from the above, that in all instances, underscoring (single
+or double) is enabled whenever ENDNOTES_HEADER_UNDERSCORE is used in
+this way.
+</p>
+
+<p>
+By default, mom double-underscores the title if your
+<a href="docprocessing.html#printstyle">PRINTSTYLE</a>
+is <kbd>TYPEWRITE</kbd>.
+</p>
+
+<!-- -ENDNOTES_HEADER_CAPS- -->
+
+<h5 id="endnotes-header-caps" class="docs" style="margin-top: -.5em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Header (first-page title) capitalization</h5>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTES_HEADER_CAPS</b> <kbd class="macro-args">toggle</kbd>
+</div>
+
+<p class="alias" style="margin-bottom: 0;">
+<i>Alias:</i> <b>ENDNOTE_STRING_CAPS</b> (for compatibility with older documents)
+</p>
+
+<p>
+Invoked by itself, <kbd>.ENDNOTES_HEADER_CAPS</kbd> will
+automatically capitalize the endnotes-page title. Invoked with any
+other argument, the macro disables automatic capitalization of the
+title.
+</p>
+
+<p>
+If you&#8217;re generating a table of contents, you may want the
+endnotes pages title to be in caps, but the toc entry in caps/lower
+case. If the argument to
+<a href="#endnotes-header-string">ENDNOTES_HEADER_STRING</a>
+is in caps/lower case and ENDNOTES_HEADER_CAPS is on, this is exactly
+what will happen.
+</p>
+
+<p>
+Mom&#8217;s default is to capitalize the endnotes pages title string.
+</p>
+
+<!-- -ENDNOTE_TITLE- -->
+
+<h4 id="endnotes-doc-title" class="docs" style="margin-top: -.25em;">5. Endnotes document-identification title control</h4>
+
+<h5 id="endnote-title" class="docs" style="margin-top: 1em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Document-identification title string(s)</h5>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTE_TITLE</b> <kbd class="macro-args">&quot;&lt;title to identify a document in endnotes&gt;&quot;</kbd>
+</div>
+
+<p>
+By default, mom identifies the document(s) to which endnotes belong
+by the document title(s) given to the
+<a href="docprocessing.html#title">TITLE</a>
+macro. If you&#8217;d like her to identify the document(s) another
+way, simply invoke <kbd>.ENDNOTE_TITLE</kbd> prior to
+<a href="docprocessing.html#start">START</a>
+with the identifying title you want, surrounded by double-quotes.
+</p>
+
+<p>
+If you don&#8217;t want any identifying title, invoke
+<kbd>.ENDNOTE_TITLE</kbd> with a blank argument, either two
+double-quotes side by side (<kbd>&quot;&quot;</kbd>) or no argument
+at all. This is particularly useful if you have a single (i.e.
+non-collated) document and find having the document&#8217;s title
+included in the endnotes redundant.
+</p>
+
+<!-- -ENDNOTE_TITLE_CONTROL- -->
+
+<h5 id="endnote-title-control" class="docs" style="margin-top: .75em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Document-identification string control macros and defaults</h5>
+
+<div class="defaults-container" style="padding-bottom: 8px;">
+<p class="defaults" style="padding-top: 6px;">
+See
+<a href="#control-macro-args">Arguments to the control macros</a>.
+<br/>
+The following ENDNOTE_TITLE_STYLE control macros may also be
+<a href="#grouping">grouped</a>
+using ENDNOTE_TITLE_STYLE_STYLE.
+</p>
+<span class="pre defaults">
+.ENDNOTE_TITLE_FAMILY default = prevailing document family; default is Times Roman
+.ENDNOTE_TITLE_FONT default = bold
+.ENDNOTE_TITLE_SIZE* default = 0
+.ENDNOTE_TITLE_COLOR default = black
+.ENDNOTE_TITLE_QUAD default = left
+.ENDNOTE_TITLE_CAPS
+.ENDNOTE_TITLE_SMALLCAPS
+.ENDNOTE_TITLE_UNDERSCORE default = single underscore
+
+*Relative to the size of the endnotes text (set with ENDNOTE_PT_SIZE)
+</span>
+</div>
+
+<!-- -ENDNOTE_NUMBERING- -->
+
+<h4 id="endnotes-numbering" class="docs" style="margin-top: -.25em;">6. Endnotes referencing style</h4>
+
+<h5 id="endnote-marker-style" class="docs" style="margin-top: 1em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Endnote marker style</h5>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTE_MARKER_STYLE</b> <kbd class="macro-args"><a href="#line">LINE</a> | <a href="#number">NUMBER</a> | <a href="#superscript">SUPERSCRIPT</a></kbd>
+</div>
+
+<p id="line">
+<span style="display: block; margin-bottom: .25em;">&bull;&nbsp;<i>Argument:</i> <kbd>LINE</kbd></span>
+By default, mom places superscript numbers in
+<a href="definitions.html#running">running text</a>
+to identify endnotes. However, if you have
+<a href="#number-lines">linenumbering</a>
+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
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTE_MARKER_STYLE LINE
+</span>
+With ENDNOTE_MARKER_STYLE <kbd>LINE</kbd>, mom will identify
+endnotes either by single line numbers or by line ranges. If
+what you want is a single line number, you need only invoke
+<kbd>.ENDNOTE</kbd> at the appropriate place in running
+text <i>without the terminating</i> <kbd>\c</kbd>. Input lines
+after the endnote has been terminated (e.g. with <kbd>.ENDNOTE
+OFF</kbd>) must begin at the left margin.
+</p>
+
+<p>
+(Should you wish to revert to mom&#8217;s default behaviour of
+placing a superscript number in the text to identify an endnote,
+you can invoke <kbd>.ENDNOTE_MARKER_STYLE</kbd> with the argument,
+<kbd>NUMBER</kbd>. 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.)
+</p>
+
+<p id="en-mark">
+If you want a range of line numbers (e.g.&nbsp;[5-11]&nbsp;),
+insert, directly into the first line of the range you want, the
+<a href="definitions.html#inlines">inline escape</a>,
+<kbd><span class="nobr">\*[EN-MARK]</span></kbd>. For the terminating line
+number of the range, you need only invoke <kbd>.ENDNOTE</kbd>
+(again, without the terminating <kbd>\c</kbd>). Mom is smart enough
+to figure out that where <kbd>.ENDNOTE</kbd> is invoked represents
+the terminating line number.
+</p>
+
+<div id="endnote-linenumbers-note" class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span>
+By default, mom reserves a fixed amount of space, equal to 8
+placeholders, for the linenumbers of linenumbered endnotes. Within
+that space, the numbers are flush right with each other. The
+reserved space is enough to print a range of linenumbers of the form
+<kbd>[nnnn-nnnn]</kbd>, but may be more than you need.
+</p>
+
+<p>
+The goal with linenumbered endnotes is to ensure that the longest
+linenumber or range of lines is flush with the left margin of the
+page. Adjusting the reserved space is done with the macro
+<a href="docelement.html#endnote-numbers-align">ENDNOTE_NUMBERS_ALIGN</a>,
+and the rules for getting it right are simple.
+</p>
+
+<p class="tip-bottom">
+If your document runs to less than 100 lines, invoke
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTE_NUMBERS_ALIGN RIGHT 0
+</span>
+If your document has between 100 and 999 lines
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTE_NUMBERS_ALIGN RIGHT 1
+</span>
+If your document has between 1000 and 9999 lines
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTE_NUMBERS_ALIGN RIGHT 2
+</span>
+etc.
+</p>
+</div>
+
+<p id="number" style="margin-top: -.5em;">
+<span style="display: block; margin-bottom: .25em;">&bull;&nbsp;<i>Argument:</i> <kbd>NUMBER</kbd></span>
+With the argument <kbd>NUMBER</kbd>, mom places superscript numbers
+in running text, but identifies endnotes in the endnotes section
+of your document with normal-sized, base-aligned numbers.
+</p>
+
+<p id="superscript" style="margin-top: -.5em;">
+<span style="display: block; margin-bottom: .25em;">&bull;&nbsp;<i>Argument:</i> <kbd>SUPERSCRIPT</kbd></span>
+With the argument <kbd>SUPERSCRIPT</kbd>, mom places superscript
+numbers in running text, and identifies endnotes in the endnotes
+section of your document with superscript numbers as well. This is
+mom&#8217;s default.
+</p>
+
+<div id="endnote-superscript-note" class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span>
+By default, mom reserves a fixed amount of space, equal to 2
+placeholders, for the superscript numbers identifying endnotes in
+the endnotes section of your document. Within that space, the
+numbers are flush right with each other.
+</p>
+
+<p class="tip-bottom">
+If you need less space (the total number of endnotes is less than 10) or
+more (the total number of endnotes is greater than 99), use the
+macro
+<a href="docelement.html#endnote-numbers-align">ENDNOTE_NUMBERS_ALIGN</a>,
+to set the desired amount of reserved space, e.g.
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTE_NUMBERS_ALIGN RIGHT 1
+</span>
+or
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTE_NUMBERS_ALIGN RIGHT 3
+</span>
+</p>
+</div>
+
+<h5 id="endnote-linenumber-gap" class="docs" style="margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Spacing between line-numbered endnotes and the endnote text</h5>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTE_LINENUMBER_GAP</b> <kbd class="macro-args">&lt;size of gap&gt;</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+When your
+<a href="#endnote-marker-style">ENDNOTE_MARKER_STYLE</a>
+is <kbd>LINE</kbd>, mom, by default, inserts a space equal to
+1/2-<a href="definitions.html#em">en</a>
+between the linenumber and the text of an endnote. For aesthetic
+reasons, you may want to change the size of the gap, which is done
+with the macro ENDNOTE_LINENUMBER_GAP.
+</p>
+
+<p>
+ENDNOTE_LINENUMBER_GAP takes as its single argument the size
+of the gap. The argument requires a
+<a href="definitions.html#unitofmeasure">unit of measure</a>,
+so, for example, to change the gap to 2
+<a href="definitions.html#picaspoints">picas</a>,
+you&#8217;d do
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTE_LINENUMBER_GAP 2P
+</span>
+</p>
+
+<h5 id="endnote-linenumber-brackets" class="docs" style="margin-top: -.5em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Brackets around endnote line numbers</h5>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTE_LINENUMBER_BRACKETS</b> <kbd class="macro-args">PARENS | SQUARE | BRACES | ( | [ | {</kbd>
+</div>
+
+<p>
+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: <kbd>PARENS</kbd> (&#8220;round&#8221; brackets),
+<kbd>SQUARE</kbd> (the default) or <kbd>BRACES</kbd> (curly braces).
+If you prefer a shortform, the arguments, <kbd>(</kbd>, <kbd>[</kbd>
+or <kbd>{</kbd> may be used instead.
+</p>
+
+<h5 id="endnote-linenumber-separator" class="docs" style="margin-top: -.5em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Separator after endnote line numbers instead of brackets</h5>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTE_LINENUMBER_SEPARATOR</b> <kbd class="macro-args">&lt;character&gt;</kbd>
+</div>
+
+<p>
+If you don&#8217;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.
+</p>
+
+<p>
+ENDNOTE_LINENUMBER_SEPARATOR takes as its single argument the
+separator you want. (If the argument contains spaces, don&#8217;t
+forget to enclose the argument in double-quotes.) The separator
+can be composed of any valid groff character, or any combination of
+characters. For example, to get a colon separator after the line
+number in line-numbered endnotes, you&#8217;d do
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTE_LINENUMBER_SEPARATOR :
+</span>
+</p>
+
+<h5 id="endnote-number-control" class="docs" style="margin-top: -1em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Endnote numbering style control</h5>
+
+<div class="defaults-container" style="padding-bottom: 8px;">
+<p class="defaults" style="padding-top: 6px;">
+See
+<a href="#control-macro-args">Arguments to the control macros</a>.
+</p>
+
+<p class="defaults">
+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 a document.
+</p>
+<span class="pre defaults">
+Numbered endnotes
+.ENDNOTE_NUMBER_FAMILY default = prevailing document family; default Times Roman
+.ENDNOTE_NUMBER_FONT default = bold
+.ENDNOTE_NUMBER_SIZE* default = 0
+Linenumbered endnotes
+.ENDNOTE_LINENUMBER_FAMILY default = prevailing document family; default Times Roman
+.ENDNOTE_LINENUMBER_FONT default = bold
+.ENDNOTE_LINENUMBER_SIZE* default = 0
+
+*Relative to the size of the endnotes text (set with ENDNOTE_PT_SIZE)
+</span>
+</div>
+
+<h5 id="endnote-number-alignment" class="docs" style="margin-top: -1.25em; margin-bottom: -.5em; margin-left: .5em;">&bull;&nbsp;Endnote numbering alignment</h5>
+
+<p style="margin-top: .75em;">
+By default, when your
+<a href="#endnote-marker-style">ENDNOTE_MARKER_STYLE</a>
+is <kbd>NUMBER</kbd>, mom hangs the numbers on endnotes pages,
+aligned right to two placeholders, producing this:
+<br/>
+<span id="endnote-numbering-alignment-example" class="pre-in-pp">
+ 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.
+</span>
+If you wish to change either the alignment or the number of
+placeholders, the macro to use is ENDNOTE_NUMBERS_ALIGN.
+</p>
+
+<!-- -ENDNOTE_NUMBERS_ALIGN- -->
+
+<div id="endnote-numbers-align" class="box-macro-args">
+Macro: <b>ENDNOTE_NUMBERS_ALIGN</b> <kbd class="macro-args">LEFT | RIGHT &lt;number of placeholders&gt;</kbd>
+</div>
+
+<p>
+ENDNOTE_NUMBERS_ALIGN determines how endnote numbers are aligned. If you invoke
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTE_NUMBERS_ALIGN RIGHT 2
+</span>
+the periods (dots) after the numbers will align, like this
+<span class="pre-in-pp">
+ 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.
+</span>
+If you invoke
+<span class="pre-in-pp">
+ .ENDNOTE_NUMBERS_ALIGN LEFT 2
+</span>
+the first digits of the numbers will line up flush left, like this
+<span class="pre-in-pp">
+ 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.
+</span>
+The argument <kbd>&lt;number of placeholders&gt;</kbd> represents
+the maximum size of the numbers, expressed as the number of
+digits in the largest number. Numbers in the range 0-9 require
+1 placeholder; in the range 10-99, 2 placeholders; in the range
+100-999 3 placeholders, and so on.
+</p>
+
+<p>
+Therefore, if you have fewer than ten endnotes,
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTE_NUMBERS_ALIGN RIGHT 1
+</span>
+would ensure proper right alignment of endnote numbers.
+</p>
+
+<p>
+Mom&#8217;s default for endnote number alignment is to align the
+numbers right to two placeholders.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+ENDNOTE_NUMBERS_ALIGN can also be used to establish the alignment
+and number of placeholders when your
+<a href="#endnote-marker-style">ENDNOTE_MARKER_STYLE</a>
+is <kbd>SUPERSCRIPT</kbd>. Furthermore, it can be used to establish
+the number of placeholders to reserve when your ENDNOTE_MARKER_STYLE
+is <kbd>LINE</kbd>, even though, in such an instance, the numbers
+themselves are always aligned right. See
+<a href="#endnote-linenumbers-note">here</a>
+for examples.
+</p>
+</div>
+
+<div class="rule-short"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="margin-notes-intro" class="macro-group">Margin notes</h2>
+
+<ul style="margin-left: -.5em;">
+ <li><a href="#margin-notes-behaviour">Margin notes behaviour</a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#margin-notes-vertical">Adjusting the vertical position of margin notes</a></li>
+ </ul></li>
+ <li><a href="#mn-init">Macro: <b>MN_INIT</b></a> &ndash; set margin notes parameters</li>
+ <li><a href="#mn">Tag: MN</a></li>
+</ul>
+
+<p>
+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 &#8220;flow&#8221; of a
+document by summarizing the subject of a portion of text. Sometimes
+they&#8217;re comments to yourself in a draft copy.
+</p>
+
+<p>
+The margin notes macros and routines in om.tmac (mom) are
+&#8220;mommified&#8221; versions of the margin notes macros and
+routines written by Werner Lemberg and patched by Gaius Mulley.
+</p>
+
+<h3 id="margin-notes-behaviour" class="docs">Margin notes behaviour</h3>
+
+<p>
+First things first: before you enter your first margin note, you
+must &#8220;initialize&#8221; margin notes with
+<a href="#mn-init">MN_INIT</a>.
+MN_INIT sets up the style parameters for margin notes, including
+things like
+<a href="definitions.html#font">font</a>,
+<a href="definitions.html#family">family</a>
+and
+<a href="definitions.html#leading">leading</a>.
+MN_INIT may be called before or after
+<a href="docprocessing.html#start">START</a>.
+</p>
+
+<p>
+After initializing margin notes, you create margin notes with the
+<a href="#mn">MN</a>
+macro. Based on the argument you pass MN, your margin note will go
+in either the left or the right margin.
+</p>
+
+<p>
+Margin notes are tricky from a typographic standpoint with respect
+to vertical placement. Since the leading of margin notes may differ
+from that of
+<a href="definitions.html#running">running text</a>,
+it&#8217;s impossible for mom to guess whether to align
+the first lines of margin notes with a document
+<a href="definitions.html#baseline">baseline</a>,
+whether to align the last lines of margin notes with a document
+baseline, or whether to centre them, vertically, so that neither
+first nor last line aligns with anything!
+</p>
+
+<p>
+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
+<a href="#margin-notes-vertical">Adjusting the vertical position of margin notes</a>.)
+</p>
+
+<p>
+Generally speaking, mom tries to place margin notes at the point
+where you invoke
+<a href="#mn">MN</a>.
+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 &#8220;shift&#8221; 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.
+</p>
+
+<p>
+Sometimes, if a margin note has to be shifted down, there simply
+isn&#8217;t enough room to start the margin note on the page on
+which <kbd>.MN</kbd> is invoked. In that case, mom ignores the
+margin note entirely and issues a warning, letting you know what
+she&#8217;s done, and where. </p>
+
+<p>
+In the event that a margin note, successfully begun on a page, runs
+past your bottom margin (or the last line before footnotes begin),
+the margin note will &#8220;flow&#8221; onto the next page. If
+it is a &#8220;left&#8221; margin note, it will continue in the
+left margin. If it is a &#8220;right&#8221; margin note, it will
+continue in the right margin.
+</p>
+
+<p>
+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 &#8220;direction&#8221;
+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
+a warning for each.
+</p>
+
+<h3 id="margin-notes-vertical" class="docs">Adjusting the vertical position of margin notes</h3>
+
+<p>
+When the
+<a href="definitions.html#term-leading">leading</a>
+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.
+</p>
+
+<p>
+Adjustments to the vertical position of margin notes must be done
+inside the margin note (i.e. after <kbd>.MN</kbd>), at the top,
+before entering text. The commands to use are
+<kbd>\!<a href="typesetting.html#ald">.ALD</a></kbd>
+(to lower the margin note) and
+<kbd>\!<a href="typesetting.html#rld">.RLD</a></kbd>
+(to raise it).
+
+The <kbd>\!</kbd> must precede the macros, or they
+won&#8217;t have any effect.
+</p>
+
+<!-- -MN_INIT- -->
+
+<div class="macro-id-overline">
+<h3 id="mn-init" class="macro-id">MN_INIT</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>MN_INIT</b> <kbd class="macro-args">&lt;arguments&gt; (see list)</kbd>
+</div>
+
+<h4 style="margin-top: .75em; margin-left: .5em; font-style: normal; font-weight: bold: font-size: 105%; color: #6f614a;">Argument list:</h4>
+
+<span class="pre" style="margin-top: -1.5em; margin-left: .5em;">
+RAGGED | SYMMETRIC
+&lt;L_WIDTH&gt; &lt;value&gt;
+&lt;R_WIDTH&gt; &lt;value&gt;
+&lt;GUTTER&gt; &lt;value&gt;
+&lt;FONTSTYLE&gt; &lt;value&gt;
+&lt;SIZE&gt; &lt;value&gt;
+&lt;LEAD&gt; &lt;value&gt;
+&lt;COLOR&gt; &lt;value&gt;
+&lt;HY&gt; &lt;value&gt;
+</span>
+
+<p style="margin-top: 1.25em;">
+Before you enter your first margin note, you must initialize
+the style parameters associated with margin notes using MN_INIT.
+If you forget to do so, mom will issue a warning and abort.
+</p>
+
+<p>
+The arguments may be entered in any order, and since the list is
+long, use of the backslash character ( <kbd>\</kbd> ) to put each on
+a separate line is recommended, e.g.
+<br/>
+<span class="pre-in-pp">
+ .MN_INIT \
+ SYMMETRIC \
+ L_WIDTH 4P \
+ SIZE 8 \
+ LEAD 9 \
+ HY 14
+</span>
+All arguments are optional, but since mom requires you to run
+MN_INIT before entering margin notes, you should, at a minimum, set
+the <kbd>RAGGED</kbd> or <kbd>SYMMETRIC</kbd> parameter.
+You will almost certainly want to set <kbd>L_WIDTH</kbd>, <kbd>R_WIDTH</kbd>,
+<kbd>SIZE</kbd> and <kbd>LEAD</kbd> as well.
+</p>
+
+<h4 class="docs arg-list"><kbd>RAGGED | SYMMETRIC</kbd></h4>
+
+<p>
+If the argument <kbd>RAGGED</kbd> is given, both left and
+right margin notes will be flush left. If the argument
+<kbd>SYMMETRIC</kbd> is given, left margin notes will be set flush
+<i>right</i>, and right margin notes flush <i>left</i>. The effect
+is something like this:
+<br/>
+<span class="pre-in-pp">
+ 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.
+</span>
+</p>
+
+<p>
+If the argument is omitted, 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.)
+</p>
+
+<h4 class="docs arg-list"><kbd>L_WIDTH &lt;value&gt;</kbd></h4>
+
+<p>
+The width of left margin notes. A
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+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.
+</p>
+
+<h4 class="docs arg-list"><kbd>R_WIDTH &lt;value&gt;</kbd></h4>
+
+<p>
+The width of right margin notes. A
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+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.
+</p>
+
+<h4 class="docs arg-list"><kbd>GUTTER &lt;value&gt;</kbd></h4>
+
+<p>
+The
+<a href="definitions.html#gutter">gutter</a>
+between margin notes and
+<a href="definitions.html#running">running text</a>.
+A
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+must be appended directly onto the argument. The gutter applies to
+both left and right margin notes. The default is 1
+<a href="definitions.html#em">em</a>.
+</p>
+
+<h4 class="docs arg-list"><kbd>FONTSTYLE &lt;value&gt;</kbd></h4>
+
+<p>
+The family+font for margin notes. Yes, that&#8217;s right: the
+family <i>plus</i> font combo. For example, if you want Times
+Roman Medium, the argument must be <kbd>TR</kbd>. If you want Palatino
+Medium Italic, the argument must be <kbd>PI</kbd>. The default is the same
+family+font combo used for a document&#8217;s paragraph text.
+</p>
+
+<h4 class="docs arg-list"><kbd>SIZE &lt;value&gt;</kbd></h4>
+
+<p>
+The point size of type for margin notes. There is no need to append a
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+to the argument;
+<a href="definitions.html#picaspoints">points</a>
+is assumed (although there&#8217;s nothing preventing you from
+appending an alternative unit of measure directly to the argument).
+The default is for margin notes to use the same point size of type
+as is used in document paragraphs.
+</p>
+
+<h4 class="docs arg-list"><kbd>LEAD &lt;value&gt;</kbd></h4>
+
+<p>
+The
+<a href="definitions.html#leading">leading</a>
+of margin notes. <kbd>&lt;LEAD&gt;</kbd> takes
+<a href="definitions.html#picaspoints">points</a>
+as its unit of measure, so don&#8217;t tack a unit of measure onto
+the end of the argument. The default lead is the same as paragraph
+text (i.e. the document&#8217;s base leading).
+</p>
+
+<h4 class="docs arg-list"><kbd>COLOR &lt;value&gt;</kbd></h4>
+
+<p>
+The colour of margin notes. The colour must be pre-initialized
+with
+<a href="color.html#newcolor">NEWCOLOR</a>
+or
+<a href="color.html#xcolor">XCOLOR</a>.
+The default is black.
+</p>
+
+<h4 class="docs arg-list"><kbd>HY &lt;value&gt;</kbd></h4>
+
+<p>
+<kbd>&lt;value&gt;</kbd> is a digit telling groff how you want margin
+notes hyphenated.
+<br/>
+<span class="pre-in-pp">
+ 0 = do not hyphenate
+ 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
+</span>
+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).
+</p>
+
+<!-- -MN- -->
+
+<div class="macro-id-overline">
+<h3 id="mn" class="macro-id">MN</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>MN</b> <kbd class="macro-args">LEFT | RIGHT</kbd>
+</div>
+
+<p>
+Once you&#8217;ve initialized margin notes with
+<kbd><a href="#mn-init">.MN_INIT</a></kbd>,
+you can enter margin notes any time you like with <kbd>.MN</kbd>.
+An argument of <kbd>LEFT</kbd> will set a left margin note. An
+argument of <kbd>RIGHT</kbd> will set a right margin note.
+</p>
+
+<p>
+Any argument, such as <kbd>OFF</kbd> (or <kbd>OFF</kbd>,
+<kbd>QUIT</kbd>, <kbd>END</kbd>, <kbd>X</kbd>, etc) exits the
+current margin note.
+</p>
+
+<div class="rule-short"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<!-- -FINIS- -->
+
+<h2 id="finis-intro" class="macro-group">Document termination string</h2>
+
+<ul style="margin-left: -.5em;">
+ <li><a href="#finis">Tag: FINIS</a></li>
+ <li><a href="#finis-control">FINIS control macros</a>
+ <ul style="margin-left: -1.25em;">
+ <li><a href="#finis-string">Changing the FINIS string</a></li>
+ <li><a href="#finis-string-caps">Automatic capitalization of the FINIS string</a></li>
+ <li><a href="#finis-color">Changing the FINIS colour</a></li>
+ <li><a href="#finis-no-dashes">Removing the dashes around FINIS</a></li>
+ </ul></li>
+</ul>
+
+<p>
+The use of FINIS is optional. If you invoke it at the end of a
+document (before
+<kbd><a href="#endnotes">.ENDNOTES</a></kbd>,
+<kbd><a href="refer.html#bibliography">.BIBLIOGRAPHY</a></kbd>
+or
+<kbd><a href="tables-of-contents.html#toc">.TOC</a></kbd>)
+mom deposits the word, <b>END</b>, centred after a blank line,
+beneath the last line of the document. <b>END</b> is enclosed
+between
+<a href="definitions.html#em">em-dashes</a>,
+like this:
+<br/>
+<span class="pre-in-pp">
+ ...and they all lived happily ever after.
+
+ &mdash; END &mdash;
+</span>
+If there is insufficient room for FINIS on the last page of a
+document, mom will alert you on stderr.
+</p>
+
+<p>
+If you&#8217;re writing in a language other than English, you can
+change what mom prints for END with the control macro
+<a href="#finis-string">FINIS_STRING</a>.
+</p>
+
+<div class="macro-id-overline">
+<h3 id="finis" class="macro-id">FINIS</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>FINIS</b>
+</div>
+
+<p>
+The use of FINIS is optional, but if you use it, it should be the
+last macro you invoke in a document before
+<kbd><a href="#endnotes">.ENDNOTES</a></kbd>,
+<kbd><a href="refer.html#bibliography">.BIBLIOGRAPHY</a></kbd>
+or
+<kbd><a href="tables-of-contents.html#toc">.TOC</a></kbd>.
+See
+<a href="#finis-intro">above</a>
+for a description of how FINIS behaves.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If you don&#8217;t use FINIS, and you don&#8217;t want
+<a href="definitions.html#footer">footers</a>
+(if they&#8217;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:
+<br/>
+<span class="pre-in-pp">
+ .FOOTERS OFF
+ .PAGINATE OFF
+</span>
+</p>
+</div>
+
+<!-- -FINIS STRING- -->
+
+<h3 id="finis-control" class="docs" style="margin-bottom: -1em">Finis control macros</h3>
+
+<p>
+Since FINIS is only used once in a document, it has few control
+macros. It is expected that you will make changes to style
+parameters such as family, font, and size with
+<a href="definitions.html#inlines">inline escapes</a>
+in the FINIS string itself (see below).
+</p>
+
+<h4 id="finis-string" class="docs" style="margin-top: -.5em">Changing the FINIS string</h4>
+
+<p>
+By default, FINIS prints the word, END, between
+<a href="definitions.html#em">em-dashes</a>.
+If you&#8217;d like mom to print something else between the dashes,
+use the FINIS_STRING macro (anywhere in the document prior to
+FINIS).
+</p>
+
+<p>
+For example, if your document&#8217;s in French, you&#8217;d do
+<br/>
+<span class="pre-in-pp">
+ .FINIS_STRING "FIN"
+</span>
+Double-quotes must enclose the macro&#8217;s argument.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If you pass FINIS_STRING a blank string,
+<br/>
+<span class="pre-in-pp">
+ .FINIS_STRING ""
+</span>
+mom will still print the em-dashes when you invoke
+<kbd>.FINIS</kbd>. This, in effect, produces a short, centred
+horizontal rule that terminates the document. (In
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPEWRITE</kbd></a>,
+it&#8217;s a short, dashed line composed of four hyphens.)
+</p>
+</div>
+
+<!-- -FINIS STRING CAPS- -->
+
+<h4 id="finis-string-caps" class="docs">Automatic capitalization of the FINIS string</h4>
+
+<p>
+By default, mom sets the string you pass to FINIS all-caps.
+If you&#8217;d prefer that she not do so, but rather respect
+the FINIS string exactly as you enter it, invoke the macro
+<kbd>.FINIS_STRING_CAPS</kbd> with the <kbd>OFF</kbd> argument, like
+this:
+<br/>
+<span class="pre-in-pp">
+ .FINIS_STRING_CAPS OFF
+</span>
+<kbd>OFF</kbd>, above, could be anything, e.g. <kbd>NO</kbd> or
+<kbd>X</kbd>.
+</p>
+
+<!-- -FINIS COLOR- -->
+
+<h4 id="finis-color" class="docs">Changing the FINIS colour</h4>
+
+<p>
+Invoking the control macro <kbd>.FINIS_COLOR</kbd> with a
+pre-defined (or &#8220;initialized&#8221;) colour changes the colour
+of both the FINIS string and the em-dashes that surround it. If you
+use the
+<a href="definitions.html#inline">inline escape</a>,
+<a href="color.html#color-inline"><kbd><span class="nobr">\*[&lt;colourname&gt;]</span></kbd></a>,
+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).
+</p>
+
+<!-- -FINIS DASHES- -->
+
+<h4 id="finis-no-dashes" class="docs">Removing the dashes around FINIS</h4>
+
+<p>
+If you don&#8217;t want the dashes around the FINIS string, you can
+remove them with
+<br/>
+<span class="pre-in-pp">
+ .FINIS_NO_DASHES
+</span>
+</p>
+
+<div class="rule-long"><hr/></div>
+
+<!-- Navigation links -->
+<table style="width: 100%; margin-top: 12px;">
+<tr>
+ <td style="width: 33%;"><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="width: 33%; text-align: center;"><a href="#top">Top</a></td>
+ <td style="width: 33%; text-align: right;"><a href="images.html#top">Next: Graphics, floats, and preprocessor support</a></td>
+</tr>
+</table>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/momdoc/docprocessing.html b/contrib/mom/momdoc/docprocessing.html
new file mode 100644
index 0000000..4d09553
--- /dev/null
+++ b/contrib/mom/momdoc/docprocessing.html
@@ -0,0 +1,4420 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>Mom -- Document Processing, Introduction and Setup</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div id="top" class="page">
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+<tr>
+ <td><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="text-align: right;"><a href="docelement.html#top">Next: The document element tags</a></td>
+</tr>
+</table>
+
+<h1 class="docs">Document processing with mom</h1>
+
+<h2 id="toc-doc-processing" class="docs" style="text-align: center;">Table of contents</h2>
+
+<div id="docprocessing-mini-toc" style="font-size: 90%; line-height: 150%; margin-top: .5em;">
+<div class="mini-toc-col-1" style="margin-left: 0;">
+<h3 class="toc toc-docproc-header" style="margin-top: 1em;"><a class="header-link" href="#docprocessing-intro">Introduction to document processing</a></h3>
+<h3 class="toc toc-docproc-header" style="margin-top: .5em;"><a class="header-link" href="#defaults">Document defaults</a></h3>
+<h3 class="toc toc-docproc-header" style="margin-top: .5em;"><a class="header-link" href="#vertical-whitespace-management">Vertical whitespace management</a></h3>
+<h3 class="toc toc-docproc-header" style="margin-top: .5em;"><a class="header-link" href="#setup">Preliminary document setup</a></h3>
+<ul class="toc-docproc" style="margin-top: .5em;">
+ <li><a href="#docprocessing-tut"><b>Tutorial &ndash; Setting up a mom document</b></a></li>
+ <li><a href="#reference-macros"><b>The reference macros (metadata)</b></a>
+ <ul class="toc-docproc">
+ <li><a href="#title">TITLE</a></li>
+ <li><a href="#doc-title">DOCTITLE</a></li>
+ <li><a href="#subtitle">SUBTITLE</a></li>
+ <li><a href="#author">AUTHOR</a></li>
+ <li><a href="#chapter">CHAPTER</a></li>
+ <li><a href="#chapter-title">CHAPTER_TITLE</a></li>
+ <li><a href="#draft">DRAFT</a></li>
+ <li><a href="#revision">REVISION</a></li>
+ <li><a href="#copyright">COPYRIGHT</a></li>
+ <li><a href="#misc">MISC</a></li>
+ <li><a href="#covertitle">COVERTITLE</a></li>
+ <li><a href="#doc-covertitle">DOC_COVERTITLE</a></li>
+ <li><a href="#pdftitle">PDF_TITLE</a></li>
+ <li><a href="#toc-heading">TOC_HEADING</a></li>
+ </ul></li>
+ <li><a href="#docstyle-macros"><b>The docstyle macros (templates)</b></a>
+ <ul class="toc-docproc">
+ <li><a href="#doctype">DOCTYPE (default, chapter, letter, named, slides)</a></li>
+ <li><a href="#slides">DOCTYPE SLIDES</a>
+ <ul class="toc-docproc">
+ <li><a href="#newslide">NEWSLIDE</a></li>
+ <li><a href="#pause">PAUSE</a></li>
+ <li><a href="#transition">TRANSITION</a></li>
+ </ul></li>
+ <li><a href="#printstyle">PRINTSTYLE</a></li>
+ <li><a href="#copystyle">COPYSTYLE</a></li>
+ </ul></li>
+ <li><a href="cover.html"><b>Cover pages</b></a></li>
+ <li><a href="#docheader"><b>Managing the document header</b></a>
+ <ul class="toc-docproc">
+ <li><a href="#docheader">DOCHEADER</a></li>
+ <li><a href="#docheader-control">Docheader control</a>
+ <ul class="toc-docproc">
+ <li><a href="#docheader-desc">Docheader description</a></li>
+ <li><a href="#index-docheader-control">Macro list</a></li>
+ </ul></li>
+ </ul></li>
+</ul>
+</div>
+<div class="mini-toc-col-2">
+<br/>
+<h3 class="toc toc-docproc-header"><a class="header-link" href="#start-macro">Initiate document processing</a></h3>
+<ul class="toc-docproc" style="margin-top: .5em;">
+ <li><a href="#start"><b>The START macro</b></a></li>
+</ul>
+<h3 class="toc toc-docproc-header"><a class="header-link" href="#style-before-start">Establishing type and formatting<br/><span style="display: block; margin-top: -.3em;">parameters before START</span></a></h3>
+<ul class="toc-docproc">
+ <li><a href="#type-before-start"><b>Behaviour of the typesetting macros before START</b></a>
+ <ul class="toc-docproc">
+ <li><a href="docprocessing.html#include">Including (sourcing) style sheets and files</a></li>
+ <li><a href="#color">Initializing colours</a></li>
+ </ul></li>
+</ul>
+<ul class="toc-docproc" style="margin-top: -1em">
+ <li><a href="#doc-lead-adjust"><b>Adjust linespacing to fill pages</b></a>
+ <ul class="toc-docproc">
+ <li><a href="#doc-lead-adjust">DOC_LEAD_ADJUST</a></li>
+ <li><a href="#shim">SHIM</a> &ndash; get document leading back on track
+ <ul class="toc-docproc">
+ <li><a href="#automatic-shimming">Automatic shimming (headings, etc)</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a href="#columns-intro"><b>Setting documents in columns</b></a>
+ <ul class="toc-docproc">
+ <li><a href="#columns">COLUMNS</a></li>
+ <li><a href="#marking-col-start">Marking the first page column start position</a>
+ <ul class="toc-docproc">
+ <li><a href="#col-mark">COL_MARK</a></li>
+ </ul></li>
+ <li><a href="#breaking-columns">Breaking columns manually</a>
+ <ul class="toc-docproc">
+ <li><a href="#col-next">COL_NEXT</a> and <a href="#col-break">COL_BREAK</a></li>
+ </ul></li>
+ </ul></li>
+</ul>
+<h3 class="toc toc-docproc-header"><a class="header-link" href="#style-after-start">Changing basic type and formatting<br/><span style="display: block; margin-top: -.3em;">parameters after START</span></a></h3>
+<ul class="toc-docproc" style="margin-top: .5em;">
+ <li><a href="#behaviour"><b>Behaviour of the typesetting macros during document processing</b></a></li>
+ <li><a href="docprocessing.html#intro-doc-param"><b>Changing document-wide typesetting parameters after START</b></a>
+ <ul class="toc-docproc">
+ <li><a href="docprocessing.html#index-doc-param">Post-START global style change macros</a>
+ <ul class="toc-docproc">
+ <li><a href="#doc-left-margin">DOC_LEFT_MARGIN</a></li>
+ <li><a href="#doc-right-margin">DOC_RIGHT_MARGIN</a></li>
+ <li><a href="#doc-line-length">DOC_LINE_LENGTH</a></li>
+ <li><a href="#doc-family">DOC_FAMILY</a></li>
+ <li><a href="#doc-pt-size">DOC_PT_SIZE</a></li>
+ <li><a href="#doc-lead">DOC_LEAD</a></li>
+ <li><a href="#doc-lead-adjust">DOC_LEAD_ADJUST</a></li>
+ <li><a href="#doc-quad">DOC_QUAD</a></li>
+ </ul></li>
+ </ul></li>
+</ul>
+<h3 class="toc toc-docproc-header"><a class="header-link" href="#terminating">Terminating a document</a></h3>
+</div>
+</div>
+
+<div class="rule-short" style="margin-top: -1.75em"><br/><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="docprocessing-intro" class="docs" style="margin-top: 1em">Introduction to document processing</h2>
+
+<p>
+Document processing with mom uses markup tags to identify document elements
+such as headings, paragraphs, blockquotes, 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&#8217;t forget: if you
+don&#8217;t like the &#8220;official&#8221; name of a tag &mdash;
+too long, cumbersome to type in, not &#8220;intuitive&#8221; enough
+&mdash; you can change it with the
+<a href="goodies.html#alias">ALIAS</a>
+macro.)
+</p>
+
+<p>
+In addition to the tags themselves, mom has an extensive array of
+macros that control how they look and behave.
+</p>
+
+<p>
+Setting up a mom doc is a simple, four-part procedure. You
+begin by entering metadata about the document itself (title,
+subtitle, author, etc.). Next, you tell mom what kind of document
+you&#8217;re creating (e.g. a chapter, letter, abstract, etc...) and
+what kind of output you want (typeset, typewritten, draft-style,
+etc) &mdash; essentially, templates. Thirdly, you make as many
+or as few changes to the templates as you wish; in other words,
+create a style sheet. Lastly, you invoke the
+<kbd><a href="#start">START</a></kbd>
+macro. Voilà! You&#8217;re ready to write.
+</p>
+
+<!-- ==================================================================== -->
+
+<h2 id="defaults" class="docs">Document defaults</h2>
+
+<p>
+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.
+</p>
+
+<p>
+I fear the following may not be adequately covered elsewhere in the
+documentation, so just in case:
+</p>
+<ul style="margin-top: -.5em; margin-bottom: .5em;">
+ <li>the paper size is 8.5x11 inches</li>
+ <li>the left and right margins are 1-inch</li>
+ <li>the top and bottom margins for document text are plus/minus
+ visually 1-inch
+ </li>
+ <li>pages are numbered; the number appears centred, at the
+ bottom, surrounded by hyphens (e.g. -6- )
+ </li>
+ <li>the first page of a document begins with a
+ <a href="definitions.html#docheader">document header</a>
+ </li>
+ <li>subsequent pages have
+ <a href="definitions.html#header">page headers</a>
+ with a rule underneath
+ </li>
+</ul>
+
+<!-- ==================================================================== -->
+
+<h2 id="vertical-whitespace-management" class="macro-group">Vertical whitespace management</h2>
+
+<ul style="margin-left: -.5em;">
+ <li><a href="#shim">Macro: SHIM</a></li>
+ <li><a href="#no-shim">Macro: NO_SHIM</a></li>
+ <li><a href="#flex">Macro: FLEX</a></li>
+ <li><a href="#no-flex">Macro: NO_FLEX</a></li>
+</ul>
+
+
+<p>
+Mom takes evenly-aligned bottom margins in
+<a href="definitions.html#running">running text</a>
+very seriously. Only under a very few, exceptional circumstances
+will she allow a bottom margin to &#8220;hang&#8221; (i.e. to fall
+short).
+</p>
+
+<p>
+Mom offers two modes of operation for ensuring flush bottom margins:
+shimming and flex-spacing. Shimming means that mom nudges the
+next line after a significant break in running text back onto the
+<a href="definitions.html#baseline-grid">baseline grid</a>
+(e.g. after the insertion of a graphic). Flex-spacing means that any
+vertical whitespace remaining between the end of running text and
+the bottom margin is distributed equally at logical points on the
+page.
+</p>
+
+<p>
+Mom uses the
+<a href="definitions.html#leading">leading</a>
+of running text (the &#8220;document leading&#8221;) that&#8217;s in effect
+<i>at the start of running text on each page</i>
+to establish the grid and space document elements such as heads or
+blockquotes so that they adhere to it. (Prior to invoking
+<a href="#start">START</a>,
+the document leading is set with the
+<a href="typesetting.html#macros-typesetting">typesetting macro</a>
+<a href="typesetting.html#leading">LS</a>,
+afterwards with the
+<a href="definitions.html#controlmacro">document control macro</a>
+<a href="#doc-lead">DOC_LEAD</a>.)
+</p>
+
+<p>
+What this means is that documents whose paragraphs are not separated
+by whitespace and which do not contain graphics or
+<a href="definitions.html#pre-processor">pre-processor material</a>
+will fill the page completely to the bottom margin.
+However, if your paragraphs are spaced, or if there are any leading
+changes on a page, or if graphics or pre-processor material are
+inserted, it&#8217;s very likely the bottom margins will hang
+unless shimming or flex-spacing is enabled.
+</p>
+
+<h3 id="shim-vs-flex" class="docs">Shimming <span style="text-transform: none">vs.</span> flex-spacing</h3>
+
+<p>
+<b>Shimming</b> is mom&#8217;s default mode of operation. She applies it
+automatically before headings, around quotes and blockquotes, and
+beneath
+<a href="definitions.html#float">floats</a>
+and
+<a href="definitions.html#preprocessor">pre-processor material</a>.
+In addition, the
+<a href="#shim">SHIM</a>
+macro can be inserted into a document at any point to make sure
+the text following falls on the baseline grid.
+</p>
+
+<p>
+This mode of operation works well in documents whose paragraphs are
+not spaced. Deviations from the baseline grid, usually
+caused by floats or pre-processor material, are corrected
+immediately. If the shimming results in slightly unbalanced
+whitespace around them, it can easily be remedied by passing the
+<kbd>ADJUST</kbd> argument to the appropriate macro.
+</p>
+
+<p>
+If you do not want mom shimming automatically,
+<a href="#no-shim">NO_SHIM</a>
+turns shimming off globally and suppresses the SHIM macro. If you
+want to disable shimming only for a particular float or
+pre-processor, the <kbd>NO_SHIM</kbd> argument may be given to the
+appropriate macro.
+</p>
+
+<p>
+<b>Flex-spacing</b> kicks in automatically whenever you turn shimming
+off. In other words, if you want a document flex-spaced,
+<kbd>.NO_SHIM</kbd> is how you achieve it. If, in addition to not
+shimming, you don&#8217;t want mom flex-spacing either,
+<a href="#no-flex">NO_FLEX</a>
+lets you disable it, too.
+</p>
+
+<p>
+Flex-spacing differs from shimming in that mom doesn&#8217;t
+correct deviations from the baseline grid. Rather, she distributes
+whitespace left at the bottom of the page equally in appropriate
+places. Like shimming, flex-spacing is automatically applied
+before heads, after floats and pre-processor material, and around
+quotes and blockquotes. Like shimming, flex-spacing can be
+disabled for individual floats or pre-processor material with the
+<kbd>NO_FLEX</kbd> flag.
+</p>
+
+<p>
+In addition, you can use the
+<a href="#flex">FLEX</a>
+macro to insert flex-spacing yourself into the document, which you
+will almost certainly want to do if your paragraphs are spaced.
+This is because paragraphs are not flex-spaced. Typographically,
+the ideal for spaced paragraphs is that the space between them
+remain constant. Paradoxically, the only way to achieve flush
+bottom margins, or to correct excessive flex-spacing before a
+heading, is by adding flex-space between the paragraphs. This
+requires human judgment, and mom does not presume to decide for you.
+</p>
+
+<p>
+Shimming and flex-spacing are mutually exclusive. If the one is
+active, the other isn&#8217;t unless you have disabled both. This means
+that you cannot use the FLEX macro when shimming is enabled, or the
+SHIM macro when flex-spacing is enabled. Mom will issue a warning
+if you do.
+</p>
+
+<p>
+The choice of whether to use shimming or flex-spacing depends on
+whether or not your paragraphs are spaced. In a document with
+indented, non-spaced paragraphs, shimming and flex-spacing produce
+nearly the same result, with shimming winning by an aesthetic hair.
+In documents with spaced paragraphs, flex-spacing is the only way to
+achieve flush bottom margins.
+</p>
+
+<!-- -SHIM- -->
+
+<div class="macro-id-overline">
+<h3 id="shim" class="macro-id">SHIM</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>SHIM</b>
+</div>
+
+<p>
+When shimming is enabled, which it is by default, the SHIM macro
+allows you to nudge the line following it back onto the baseline
+grid. In documents with non-spaced paragraphs, this prevents
+the bottom margins from hanging.
+</p>
+
+<p style="margin-bottom: -1em">
+Mom herself automatically applies shimming
+</p>
+<ul>
+ <li><i>before</i> headings</li>
+ <li><i>around</i> quotes and blockquotes</li>
+ <li><i>after</i> PDF images, tables, pic diagrams, equations, and floats</li>
+</ul>
+
+<p>
+You may sometimes find the amount of space generated by
+<kbd>SHIM</kbd> looks too big, whether inserted manually into a
+document or as a result of automatic shimming.
+The situation occurs when the amount of shimming applied
+comes close to the leading currently in effect, making it seem as if
+there&#8217;s one linespace too much whitespace.
+</p>
+
+<p>
+The solution is simply to add <kbd>.SPACE&nbsp;-1v</kbd> or
+<kbd>.RLD&nbsp;1v</kbd> to the document immediately after
+<kbd>.SHIM</kbd>. (Both <kbd>.SPACE&nbsp;-1v</kbd> and
+<kbd>.RLD&nbsp;1v</kbd> back up by one linespace.)
+</p>
+
+<div class="macro-id-overline">
+<h3 id="no-shim" class="macro-id">NO_SHIM</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>NO_SHIM</b> <kbd class="macro-args">&lt;none&gt; | &lt;anything&gt;</kbd>
+</div>
+
+<p>
+NO_SHIM, without an argument, disables automatic shimming,
+suppresses the SHIM macro, and enables flex-spacing.
+</p>
+
+<p>
+NO_SHIM with any argument (e.g. <kbd>OFF</kbd>, <kbd>QUIT</kbd>,
+<kbd>END</kbd>, <kbd>X</kbd>, etc) re-enables shimming if it has
+been disabled and disables flex-spacing.
+</p>
+
+<!-- -FLEX- -->
+
+<div class="macro-id-overline">
+<h3 id="flex" class="macro-id">FLEX</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>FLEX</b> <kbd class="macro-args">[ FORCE ]</kbd>
+</div>
+
+<p>
+When flex-spacing is enabled, the FLEX macro inserts flexible
+vertical whitespace into a document. The amount of flex-space is
+determined from any extra whitespace at the bottom of a page divided
+by the number of flex points on the same page.
+</p>
+
+<p style="margin-bottom: -1em">
+If flex-spacing is enabled, mom herself automatically applies
+flex-spacing
+</p>
+<ul style="margin-bottom: -.5em">
+ <li><i>before</i> headings</li>
+ <li><i>around</i> quotes and blockquotes</li>
+ <li><i>after</i> PDF images, tables, pic diagrams, equations, and floats</li>
+</ul>
+
+<p>
+Near the bottom of some pages, you may find that
+<a href="definitions.html#float">floated</a>
+or
+<a href="definitions.html#preprocessor">pre-processor material</a>,
+including images, or a single line of text afterwards, is not flush
+with the bottom margin. This is a result of mom flex-spacing
+<i>after</i> such material but not before. The solution to is
+insert <kbd>.FLEX</kbd> immediately beforehand.
+</p>
+
+<p>
+There are some instances where mom inhibits flex-spacing, notably
+after outputting floated material deferred from one page to the
+next. Introducing FLEX by itself in these instances&mdash;say,
+before a head or paragraph&mdash;will not have any effect; you must
+pass FLEX the <kbd>FORCE</kbd> argument.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="important">Important note on flex-spacing policy:</span><br/>
+Mom disables flex-spacing on
+</p>
+<ul style="margin-top: -1em; margin-bottom: -.5em">
+ <li>the last page or column of a document, before the Table of Contents,
+ Endnotes, Bibliography, and/or any &#8220;Lists of...&#8221;
+ </li>
+ <li>the page preceding a
+ <a href="rectoverso.html#collate">COLLATE</a>
+ </li>
+ <li>the page preceding a
+ <a href="typesetting.html#NEWPAGE">NEWPAGE</a>
+ or
+ <a href="headfootpage.html#blankpage">BLANKPAGE</a>
+ </li>
+ <li>the column preceding a
+ <a href="#col-next">COL_NEXT</a>
+ or
+ <a href="#col-break">COL_BREAK</a>
+ </li>
+</ul>
+
+<p>
+If this is not what you want, insert
+<a href="#no-flex"><kbd>.NO_FLEX&nbsp;OFF</kbd></a>
+before the first flex-space point on the affected page or in the
+affected column.
+</p>
+
+<p>
+Flex-spacing is also disabled for any page or column where
+insufficient room at or near the bottom causes a
+<a href="docelement.html#heading">HEADING</a>
+or
+<a href="images.html#tbl">table</a>
+to be moved to the top of the next page. These situations cannot
+be harmonized with flex-spacing except by adjusting your layout
+to prevent them. You may try re-enabling flex-spacing for the
+page (<kbd>.NO_FLEX&nbsp;OFF</kbd>) and manually inserting
+flex-spaces at appropriate points, but the original whitespace is
+usually large enough that re-distributing it merely changes
+one layout gaffe into another.
+</p>
+
+<p>
+Very occasionally you may notice that a document element (spaced
+paragraph, floated material, pre-processor material, or a PDF image)
+near the bottom of page has also caused mom to disable flex-spacing
+for that page. This occurs when the document element following it
+is a
+<a href="docelement.html#pp-space">spaced paragraph</a>.
+</p>
+
+<p>
+It is typographically acceptable for there to be space between
+insertions in running text (e.g. an image) and the bottom margin when
+the next page begins with a paragraph. If you&#8217;d like to
+nudge the insertion a little closer to the bottom margin&mdash;not
+all the way; that isn&#8217;t possible without pushing it to the
+next page and disrupting subsequent flex-spacing&mdash;insert a
+small amount of space beforehand with
+<a href="typesetting.html#sp">SP</a>.
+Do not, in these cases, use the <kbd>ADJUST</kbd>
+argument (for example to
+<a href="images.html#pdf-image">PDF_IMAGE</a>.)
+</p>
+
+<p class="tip-bottom">
+In the case of a spaced paragraph itself near the bottom of the page
+causing a break, re-enabling flex-spacing
+(<kbd>.NO_FLEX&nbsp;OFF</kbd>) at an appropriate place in your input
+file will resolve the issue, provided there is at least one
+flex-point on the page. If not, add one or more.
+</p>
+</div>
+
+<div class="macro-id-overline">
+<h3 id="no-flex" class="macro-id">NO_FLEX</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>NO_FLEX</b> <kbd class="macro-args">&lt;none&gt; | &lt;anything&gt;</kbd>
+</div>
+
+<p>
+NO_FLEX, without an argument, disables automatic flex-spacing
+and suppresses the FLEX macro. If, in addition to NO_FLEX, NO_SHIM
+has also been given, your document will be neither flex-spaced nor
+shimmed.
+</p>
+
+<p>
+NO_FLEX with any argument (e.g. <kbd>OFF</kbd>, <kbd>QUIT</kbd>,
+<kbd>END</kbd>, <kbd>X</kbd>, etc) re-enables flex-spacing if it has
+been disabled.
+</p>
+
+<div class="rule-short"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="setup" class="docs" style="margin-bottom: .5em;">Preliminary document setup</h2>
+
+<div class="examples-container" style="margin-bottom: 1.5em;">
+<h3 id="docprocessing-tut" class="docs">Tutorial &ndash; Setting up a mom document</h3>
+
+<p style="margin-top: 1em;">
+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
+<br/>
+<span class="pre-in-pp">
+ .TITLE "By the Shores of Lake Attica"
+ .AUTHOR "Rosemary Winspeare"
+ .PRINTSTYLE TYPESET
+ .START
+</span>
+produces a beautifully typeset 8.5x11 document, with a
+<a href="definitions.html#docheader">docheader</a>
+at the top of page 1,
+<a href="definitions.html#header">page headers</a>
+with the title and author on subsequent pages, and page numbers at
+the bottom of each page. In the course of the document, headings,
+citations, quotes, epigraphs, and so on, all come out looking neat,
+trim, and professional.
+</p>
+
+<p>
+For the purposes of this tutorial, we&#8217;re going to set up
+a short story&mdash;<i>My Pulitzer Winner</i>&mdash;by Joe Blow.
+Thankfully, we don&#8217;t have to look at story itself, just the
+setup. Joe wants the document
+</p>
+<ul style="margin-top: -.5em; margin-bottom: -.5em;">
+ <li>to be draft 7, revision 39;</li>
+ <li>to use the DEFAULT template;</li>
+ <li>to print as draft-style output (instead of final-copy output);</li>
+ <li>to be typeset, in Helvetica, 12 on 14,
+ <a href="definitions.html#rag">rag-right</a>;
+ </li>
+ <li>to have <a href="definitions.html#footer">footers</a>
+ instead of
+ <a href="definitions.html#header">headers</a>;
+ </li>
+ <li>to use a single asterisk for
+ <a href="definitions.html#linebreak">author linebreaks</a>.
+ </li>
+</ul>
+
+<p>
+Joe Blow has no taste in typography. His draft won&#8217;t look
+pretty, but this is, after all, a tutorial; we&#8217;re after
+examples, not beauty.
+</p>
+
+<h4 class="docs" style="margin-top: -.5em;">Step 1</h4>
+
+<p style="margin-bottom: -.5em;">
+The first step in setting up any document is giving mom some
+reference information (metadata). The reference macros are:
+</p>
+<div style="width: 50%; float: left;">
+<ul>
+ <li>TITLE</li>
+ <li>SUBTITLE</li>
+ <li>AUTHOR</li>
+ <li>CHAPTER &ndash; chapter number</li>
+ <li>CHAPTER_TITLE</li>
+ <li>DRAFT &ndash; draft number</li>
+ <li>REVISION &ndash; revision number</li>
+</ul>
+</div>
+<div>
+<ul>
+ <li>COPYRIGHT &ndash; only used on cover pages</li>
+ <li>MISC &ndash; only used on cover pages</li>
+ <li>DOCTITLE</li>
+ <li>COVERTITLE</li>
+ <li>DOC_COVERTITLE</li>
+ <li>PDF_TITLE</li>
+</ul>
+</div>
+
+<p style="margin-top: -.5em; clear: both;">
+You can use as many or as few as you wish, although at a minimum,
+you&#8217;ll probably fill in TITLE (unless the document&#8217;s a
+letter) and AUTHOR. Order doesn&#8217;t matter. You can separate
+the
+<a href="definitions.html#arguments">arguments</a>
+from the macros by any number of spaces. The following are what
+you&#8217;d need to start Joe Blow&#8217;s story.
+<br/>
+<span class="pre-in-pp">
+ .TITLE "My Pulitzer Winner"
+ .AUTHOR "Joe Blow"
+ .DRAFT 7
+ .REVISION 39
+</span>
+</p>
+
+<h4 class="docs" style="margin-top: -1.5em;">Step 2</h4>
+
+<p>
+Once you&#8217;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 &#8220;the docstyle
+macros&#8221;, and they&#8217;re essentially templates.
+</p>
+<ul style="margin-top: -.5em; margin-bottom: -.5em;">
+ <li>PRINTSTYLE&mdash;typeset or typewritten</li>
+ <li>DOCTYPE&mdash;the type of document (default, chapter, user-defined, letter, slide)</li>
+ <li>COPYSTYLE&mdash;draft or final copy</li>
+</ul>
+
+<p>
+Mom has defaults for DOCTYPE and COPYSTYLE; if they&#8217;re what
+you want, you don&#8217;t need to include them. However,
+PRINTSTYLE has no default and must be present in every formatted
+document. If you omit it, mom won&#8217;t process the document
+AND she&#8217;ll complain (both to stderr and as a single printed
+sheet with a warning). Moms&mdash;they can be so annoying
+sometimes. &lt;sigh&gt;
+</p>
+
+<p>
+Adding to what we already have, the next bit of setup for Joe
+Blow&#8217;s story looks like this:
+<br/>
+<span class="pre-in-pp">
+ .TITLE "My Pulitzer Winner"
+ .AUTHOR "Joe Blow"
+ .DRAFT 7
+ .REVISION 39
+ \#
+ .DOCTYPE DEFAULT \"Superfluous; mom uses DOCTYPE DEFAULT by default
+ .PRINTSTYLE TYPESET
+ .COPYSTYLE DRAFT
+</span>
+Notice the use of the
+<a href="definitions.html#commentlines">comment line</a>
+( <kbd>\#</kbd> ), a handy way to keep groups of macros visually
+separated for easy reading in a text editor.
+</p>
+
+<h4 class="docs" style="margin-top: -.5em; margin-bottom: -.5em;">Step 3</h4>
+
+<p>
+This step&mdash;completely optional&mdash;is where you, the user,
+take charge. Mom has reasonable defaults for every document element
+and tag, but who&#8217;s ever satisfied with defaults? Use any of
+the
+<a href="typesetting.html#macros-typesetting">typesetting macros</a>
+here to change mom&#8217;s document defaults (paper size, margins,
+family, point size, line space, rag, etc), or any of the document
+processing
+<a href="definitions.html#controlmacro">control macros</a>.
+This is the stylesheet section of a document, and
+must come after the
+<a href="#printstyle">PRINTSTYLE</a>
+directive. Failure to observe this condition will result in
+PRINTSTYLE overriding your changes.
+</p>
+
+<p>
+Joe Blow wants his story printed in Helvetica, 12 on 14, rag right,
+with
+<a href="definitions.html#footer">page footers</a>
+instead of
+<a href="definitions.html#header">page headers</a>
+and a single asterisk for the
+<a href="definitions.html#linebreak">linebreak</a>
+character. None of these requirements conforms to mom&#8217;s
+defaults for the chosen PRINTSTYLE (TYPESET), so we change them
+here. The setup for Joe Blow&#8217;s story now looks like this:
+<br/>
+<span class="pre-in-pp">
+ .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 \"ie rag right
+ .FOOTERS
+ .LINEBREAK_CHAR *
+</span>
+</p>
+
+<h4 class="docs" style="margin-top: -1.5em; margin-bottom: -.5em;">Step 4</h4>
+
+<p>
+The final step in setting up a document is telling mom to start
+document processing. It&#8217;s a no-brainer, just the single
+macro START. Other than PRINTSTYLE, it&#8217;s the only macro
+required for document processing.
+</p>
+
+<p>
+Here&#8217;s the complete setup for <i>My Pulitzer Winner</i>:
+<br/>
+<span class="pre-in-pp">
+ .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 \"ie rag right
+ .FOOTERS
+ .LINEBREAK_CHAR *
+ \#
+ .START
+</span>
+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:
+<br/>
+<span class="pre-in-pp">
+ .TITLE "My Pulitzer Winner"
+ .AUTHOR "Joe Blow"
+ .DRAFT 7
+ .REVISION 39
+ \#
+ .PRINTSTYLE TYPEWRITE
+ .COPYSTYLE DRAFT
+ \#
+ .START
+</span>
+<kbd>.PRINTSTYLE&nbsp;TYPEWRITE</kbd>, above, means that Joe&#8217;s
+work will come out &#8220;typewritten, double-spaced&#8221;,
+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).
+</p>
+
+<p>
+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:
+<br/>
+<span class="pre-in-pp">
+ .TITLE "My Pulitzer Winner"
+ .AUTHOR "Joe Blow"
+ .DRAFT 7
+ .REVISION 39
+ \#
+ .PRINTSTYLE TYPESET \"first change
+ .COPYSTYLE FINAL \"second change
+ \#
+ .START
+</span>
+In the above, <kbd>.DRAFT&nbsp;7,&nbsp;.REVISION 39,</kbd> and
+<kbd>.COPYSTYLE FINAL</kbd> are actually superfluous. The draft
+and revision numbers aren&#8217;t used when COPYSTYLE is FINAL,
+and <b>COPYSTYLE FINAL</b> is mom&#8217;s default unless you tell
+her otherwise.
+</p>
+
+<p>
+But... to judge from the number of drafts already,
+J. Blow may very well decide his &#8220;final&#8221; version still
+isn&#8217;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&#8217;ll be ready to tackle his Pulitzer winner again.
+</p>
+</div>
+
+<div class="rule-short"><hr/></div>
+
+<!-- ======================================================================== -->
+
+<h2 id="reference-macros" class="macro-group">The reference macros (metadata)</h2>
+
+<p>
+The reference macros give mom the metadata she needs to generate
+<a href="definitions.html#docheader">docheaders</a>,
+<a href="definitions.html#header">page headers</a>,
+and
+<a href="cover.html#cover-top">covers</a>.
+They must go at the top of any file that uses mom&#8217;s document
+processing macros.
+</p>
+
+<div class="macro-list-container">
+<h3 id="index-reference" class="macro-list">Reference macros</h3>
+
+<ul class="macro-list">
+ <li><a href="#title">TITLE</a> &ndash; title of a story, article, etc</li>
+ <li><a href="#doc-title">DOCTITLE</a> &ndash; title of a book, or any collated document</li>
+ <li><a href="#subtitle">SUBTITLE</a></li>
+ <li><a href="#author">AUTHOR</a></li>
+ <li><a href="#chapter">CHAPTER</a> &ndash; the chapter number
+ <ul>
+ <li class="sublist"><a href="#chapter-string">CHAPTER_STRING</a> &ndash; &#8220;Chapter&#8221;, &#8220;CHAPTER&#8221;, &#8220;Chapître&#8221;, etc</li>
+ </ul></li>
+ <li><a href="#chapter-title">CHAPTER_TITLE</a></li>
+ <li><a href="#draft">DRAFT</a>
+ <ul>
+ <li class="sublist"><a href="#draft-string">DRAFT_STRING</a> &ndash; &#8220;Draft&#8221;, &#8220;DRAFT&#8221;, &#8220;Jet&#8221;, etc</li>
+ </ul></li>
+ <li><a href="#revision">REVISION</a>
+ <ul>
+ <li class="sublist"><a href="#revision-string">REVISION_STRING</a> &ndash; &#8220;Revision&#8221;, &#8220;Rev.&#8221;, &#8220;Révision&#8221;, etc</li>
+ </ul></li>
+ <li><a href="#copyright">COPYRIGHT</a></li>
+ <li><a href="#misc">MISC</a></li>
+ <li><a href="#covertitle">COVERTITLE</a> &ndash; frontispiece, title page, etc</li>
+ <li><a href="#doc-covertitle">DOC_COVERTITLE</a> &ndash; book cover, collated document cover, etc</li>
+ <li><a href="#pdftitle">PDF_TITLE</a> &ndash; window title for PDF viewers</li>
+ <li><a href="#toc-heading">TOC_HEADING</a> &ndash; single, non-pagenumbered line of text in table of contents</li>
+</ul>
+</div>
+
+<!-- -TITLE- -->
+
+<div class="macro-id-overline">
+<h3 id="title" class="macro-id">TITLE</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>TITLE</b> <kbd class="macro-args">[COVER | DOC_COVER] &quot;&lt;title string&gt;&quot; [&quot;&lt;2nd line&gt;&quot; [&quot;&lt;3rd line&gt;&quot; ... ] ]</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Arguments must be enclosed in double-quotes
+</p>
+
+<p>
+The title string can be caps or caps/lower-case; it&#8217;s up to you. In
+<a href="#printstyle">PRINTSTYLE TYPESET</a>,
+the title will appear in the
+<a href="definitions.html#docheader">docheader</a>
+exactly as you typed it. However, mom converts the title to all
+caps in
+<a href="definitions.html#header">page headers</a>
+unless you turn that feature off (see
+<a href="headfootpage.html#_caps">HEADER_&lt;POSITION&gt;_CAPS</a>).
+In
+<a href="#printstyle">PRINTSTYLE TYPEWRITE</a>,
+the title always gets converted to caps.
+</p>
+
+<p>
+TITLE accepts multiple arguments, each surrounded by double-quotes.
+Each argument is printed on a separate line, permitting you to
+create multi-line titles in your docheaders.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If your <kbd><a href="#doctype">DOCTYPE</a></kbd> is CHAPTER, TITLE
+should be the title of the opus, not &#8220;CHAPTER whatever&#8221;.
+</p>
+</div>
+
+<p>
+If the optional argument, <kbd>COVER</kbd> or <kbd>DOC_COVER</kbd>,
+is given to TITLE, the remaining string arguments represent the
+title that will appear on cover or document cover pages (see the
+<a href="cover.html#cover-intro">Introduction to cover pages</a>
+for a description of the difference between &#8220;document
+covers&#8221; and &#8220;covers&#8221;). Thus, it is possible
+to have differing titles appear on the document cover, the cover
+(&#8220;title&#8221;) page, and in the document header. For
+example,
+<br/>
+<span class="pre-in-pp">
+ .TITLE DOC_COVER "Collected Essays"
+ .TITLE COVER "The Meming of Meaning"
+ .TITLE "LOL Cat Corruption"
+ .AUTHOR "D. Rawkins"
+ .DOC_COVER TITLE AUTHOR
+ .COVER TITLE
+ .START
+</span>
+creates a document cover with &#8220;Collected Essays&#8221; and the
+author, a cover page with &#8220;The Meming of Meaning&#8221;,
+and a docheader title, &#8220;LOL Cat Corruption&#8221; at the top
+of the essay.
+</p>
+
+<p>
+Alternatively, you can use the macros
+<a href="#doc-covertitle">DOC_COVERTITLE</a>
+and
+<a href="#covertitle">COVERTITLE</a>
+to accomplish the same thing.
+</p>
+
+<h4 id="no-toc-entry" class="docs">Table of Contents exceptions</h4>
+<p>
+Except for standalone documents (i.e. non-collated documents such
+as essays), the TITLE string appears as an entry in the Table of
+Contents. If you would like a document section not to appear in the
+Table of Contents (e.g. the copyright page), invoke the macro
+<kbd>.NO_TOC_ENTRY</kbd> after <kbd>.TITLE</kbd>.
+</p>
+
+
+<!-- -DOCTITLE- -->
+
+<div class="macro-id-overline">
+<h3 id="doc-title" class="macro-id">DOCUMENT TITLE</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>DOCTITLE</b> <kbd class="macro-args">&quot;&lt;overall document title&gt;&quot; [&quot;&lt;2nd line&gt;&quot; [&quot;&lt;3rd line&gt;&quot; ... ] ]</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Arguments must be enclosed in double-quotes
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+This macro should be used only if your <a
+href="#doctype">DOCTYPE</a> is <kbd>DEFAULT</kbd> (which is
+mom&#8217;s default). If your DOCTYPE is CHAPTER, use
+<a href="#title">TITLE</a>
+to set the overall document title for cover pages, document cover
+pages, and page headers or footers.
+</p>
+</div>
+
+<p style="margin-top: -.5em;">
+When you&#8217;re creating a single document, say, an essay or a
+short story, you have no need of this macro.
+<a href="#title">TITLE</a>
+takes care of all your title needs.
+</p>
+
+<p>
+However if you&#8217;re
+<a href="rectoverso.html#collate">collating</a>
+a bunch of documents together, say, to print out a report containing
+many articles with different titles, or a book of short stories with
+different authors, you need DOCTITLE.
+</p>
+
+<p>
+DOCTITLE tells mom the title of the complete document (as opposed to
+the title of each article or entitled section), and appears
+</p>
+
+<ol style="list-style-type: lower-alpha">
+ <li>as the window title in PDF viewers (e.g. Okular or Evince)</li>
+ <li>in the initial rightmost position of page headers in the document</li>
+</ol>
+
+<p>
+Moreover, DOCTITLE does not appear in the
+<a href="definitions.html#pdfoutline">PDF outline</a>,
+as its presence in window title would make it redundant.
+</p>
+
+<p>
+The doctitle string can be caps or caps/lower-case; it&#8217;s up to
+you. In
+<a href="#printstyle">PRINTSTYLE TYPESET</a>,
+by default, the doctitle in
+<a href="definitions.html#header">page headers</a>
+is all in caps, unless you turn that feature off (see
+<a href="headfootpage.html#_caps">HEADER_&lt;POSITION&gt;_CAPS</a>).
+In
+<a href="#printstyle">PRINTSTYLE TYPEWRITE</a>,
+the doctitle always gets converted to caps.
+</p>
+
+<p>
+DOCTITLE accepts multiple arguments, each surrounded
+by double-quotes. Each argument is printed on a separate line,
+permitting you to create multi-line document titles for use on
+<a href="cover.html#cover">Covers</a>
+and/or
+<a href="cover.html#doc-cover">Doc covers</a>.
+</p>
+
+<!-- -SUBTITLE- -->
+
+<div class="macro-id-overline">
+<h3 id="subtitle" class="macro-id">SUBTITLE</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>SUBTITLE</b> <kbd class="macro-args">[COVER | DOC_COVER] &quot;&lt;subtitle&gt;&quot; [&quot;&lt;2nd line&gt;&quot; [&quot;&lt;3rd line&gt;&quot; ... ] ]</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;String arguments must be enclosed in double-quotes
+</p>
+
+<p>
+The subtitle string can be caps or caps/lower-case. I recommend
+caps/lower case.
+</p>
+
+<p>
+SUBTITLE accepts multiple arguments, each surrounded
+by double-quotes. Each argument is printed on a separate line,
+permitting you to create multi-line subtitles.
+</p>
+
+<p>
+If the optional argument, <kbd>COVER</kbd> or <kbd>DOC_COVER</kbd>,
+is given to SUBTITLE, the remaining string
+arguments represent the subtitle that will appear on cover or
+document cover pages (see the
+<a href="cover.html#cover-intro">Introduction to cover pages</a>
+for a description of the difference between &#8220;document
+covers&#8221; and &#8220;covers&#8221;). Thus, it is possible to have
+differing subtitles appear on the document cover, the cover
+(&#8220;title&#8221;) page, and in the document header. An extreme
+example would be:
+<br/>
+<span class="pre-in-pp">
+ .SUBTITLE "The Docheader Subtitle"
+ .SUBTITLE DOC_COVER "The Document Cover Subtitle"
+ .SUBTITLE COVER "The Cover Subtitle"
+</span>
+The first invocation of <kbd>.SUBTITLE</kbd> establishes the
+subtitle that appears in the docheader at the top of the first page
+of a document. The second invocation establishes the subtitle that
+appears on the document cover; the third establishes the subtitle
+that appears on the cover (&#8220;title&#8221;) page.
+</p>
+
+<p>
+If you don&#8217;t require differing subtitles for doc cover and cover
+pages, <kbd>.SUBTITLE</kbd>, without the optional first argument, is
+sufficient, provided you give the word, <kbd>SUBTITLE</kbd>, as an
+argument to the macro
+<a href="cover.html#doc-cover">DOC_COVER</a>
+or
+<a href="cover.html#cover">COVER</a>
+</p>
+
+<!-- -AUTHOR- -->
+
+<div class="macro-id-overline">
+<h3 id="author" class="macro-id">AUTHOR</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>AUTHOR</b> <kbd class="macro-args">[COVER | DOC_COVER] &quot;&lt;author&gt;&quot; [ &quot;&lt;author2&gt;&quot; [&quot;&lt;author3&gt;&quot; ... ] ]</kbd>
+</div>
+
+<p class="alias" style="margin-bottom: 0;">
+<i>Alias:</i> <b>EDITOR</b>
+</p>
+<p class="requires">
+&bull;&nbsp;String arguments must be enclosed in double-quotes
+</p>
+
+<p>
+Each author string can hold as many names as you like, e.g.
+<br/>
+<span class="pre-in-pp" style="margin-bottom: -1em;">
+ .AUTHOR "Joe Blow"
+</span>
+or
+<br/>
+<span class="pre-in-pp" style="margin-top: -.5em;">
+ .AUTHOR "Joe Blow, Jane Doe" "John Hancock"
+</span>
+Mom prints each string that&#8217;s enclosed in double-quotes on a
+separate line in the
+<a href="definitions.html#docheader">docheader</a>,
+however only the first string appears in
+<a href="definitions.html#header">page headers</a>.
+If you want mom to put something else in the author part of page
+headers (say, just the last names of a document&#8217;s two
+authors), redefine the appropriate part of the header (see
+<a href="headfootpage.html#header-control">header/footer control</a>).
+</p>
+
+<p>
+The strings can be caps or caps/lower-case. I recommend caps/lower
+case.
+</p>
+
+<p>
+If the optional argument, <kbd>COVER</kbd> or <kbd>DOC_COVER</kbd>,
+is given to AUTHOR, the remaining string arguments represent the
+author(s) that will appear on cover or document cover pages (see the
+<a href="cover.html#cover-intro">Introduction to cover pages</a>
+for a description of the difference between &#8220;document
+covers&#8221; and &#8220;covers&#8221;). Thus, it is possible
+to have differing authors on the document cover, the cover
+(&#8220;title&#8221;) page, in the document first-page header and
+subsequent page headers/footers. An example might be:
+<br/>
+<span class="pre-in-pp">
+ .AUTHOR "Joe Blow"
+ .EDITOR DOC_COVER "John Smith" "and" "Jane Doe" \" EDITOR is an alias for AUTHOR
+ .AUTHOR COVER "Joe Blow" "(assisted by Jane Doe)"
+</span>
+The first invocation of <kbd>.AUTHOR</kbd> establishes the author
+that appears in the docheader at the top of the first page of
+a document and in subsequent page headers/footers. The second
+invocation establishes the authors (editors, in this instance) that
+appear on the document cover; the third establishes the author(s)
+that appear(s) on the cover (&#8220;title&#8221;) page.
+</p>
+
+<p>
+If you don&#8217;t require differing authors for doc cover and cover
+pages, <kbd>.AUTHOR</kbd>, without the optional first argument, is
+sufficient, provided you give the word, <kbd>AUTHOR</kbd> as an
+argument to the macro
+<a href="cover.html#doc-cover">DOC_COVER</a>
+or
+<a href="cover.html#cover">COVER</a>
+</p>
+
+<!-- -CHAPTER- -->
+
+<div class="macro-id-overline">
+<h3 id="chapter" class="macro-id">CHAPTER</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>CHAPTER</b> <kbd class="macro-args">&lt;chapter number&gt;</kbd>
+</div>
+
+<p>
+The chapter number can be in any form you like&mdash;a digit, a roman
+numeral, a word. If you choose
+<a href="#doctype">DOCTYPE CHAPTER</a>,
+mom prints whatever argument you pass CHAPTER beside the word,
+&#8220;Chapter&#8221;, as a single line
+<a href="definitions.html#docheader">docheader</a>.
+She also puts the same thing in the middle of
+<a href="definitions.html#header">page headers</a>.
+</p>
+
+<p>
+Please note that if your argument to CHAPTER runs to more than one
+word, you must enclose the argument in double-quotes.
+</p>
+
+<p>
+If you&#8217;re not using DOCTYPE CHAPTER, the macro can
+be used to identify any document as a chapter <i>for the purpose of
+prepending a chapter number to numbered head elements</i>, provided
+you pass it a
+<a href="definitions.html#numericargument">numeric argument</a>.
+See
+<a href="docelement.html#prefix-chapter-number">PREFIX_CHAPTER_NUMBER</a>.
+</p>
+
+<!-- -CHAPTER_STRING- -->
+
+<h3 id="chapter-string" class="docs">Chapter string</h3>
+
+<p>
+If you&#8217;re not writing in English, you can ask mom to use the
+word for &#8220;chapter&#8221; in your own language by telling her
+what it is with the CHAPTER_STRING macro, like this:
+<br/>
+<span class="pre">
+ .CHAPTER_STRING "Chapître"
+</span>
+</p>
+
+<p>
+If you would like a blank chapter string, i.e., you&#8217;d like the
+chapter number to appear without &#8220;Chapter&#8221; beforehand,
+enter <kbd>.CHAPTER_STRING "\&amp;"</kbd>.
+</p>
+
+<!-- -CHAPTER_TITLE- -->
+
+<div class="macro-id-overline">
+<h3 id="chapter-title" class="macro-id">CHAPTER_TITLE</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>CHAPTER_TITLE</b> <kbd class="macro-args">&quot;&lt;chapter title&gt;&quot; [&quot;&lt;2nd line&gt;&quot; [&quot;&lt;3rd line&gt;&quot; ... ] ]</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Arguments must be enclosed in double-quotes
+</p>
+
+<p>
+If, either in addition to or instead of &#8220;Chapter
+&lt;n&gt;&#8221; 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:
+<br/>
+<span class="pre">
+ .CHAPTER_TITLE "The DMCA Nazis"
+</span>
+</p>
+
+<p>
+CHAPTER_TITLE accepts multiple arguments, each surrounded by
+double-quotes. Each argument is printed on a separate line,
+permitting you to create multi-line chapter titles in your
+docheaders.
+</p>
+
+<p>
+If you&#8217;ve used
+<a href="#chapter">CHAPTER</a>
+to give the chapter a number, both &#8220;Chapter &lt;n&gt;&#8221;
+and the chapter title will appear at the top of the chapter, like
+this:
+<br/>
+<span class="pre-in-pp">
+ Chapter 1
+ The DMCA Nazis
+</span>
+In such a case, by default, only the chapter&#8217;s title will appear in
+the
+<a href="definitions.html#header">page headers</a>,
+not &#8220;Chapter &lt;n&gt;&#8221;.
+</p>
+
+<p>
+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.
+</p>
+
+<p>
+The style of the chapter title can be altered by
+<a href="docelement.html#docelement-control">control macros</a>,
+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
+<a href="definitions.html#running">running text</a>.
+</p>
+
+<!-- -DRAFT- -->
+
+<div class="macro-id-overline">
+<h3 id="draft" class="macro-id">DRAFT</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>DRAFT</b> <kbd class="macro-args">&lt;draft number&gt;</kbd>
+</div>
+
+<p>
+DRAFT only gets used with
+<a href="#copystyle">COPYSTYLE&nbsp;DRAFT</a>.
+If the COPYSTYLE is FINAL (the default), mom ignores DRAFT. DRAFT
+accepts both alphabetic and numeric arguments, hence it&#8217;s
+possible to do either
+<br/>
+<span class="pre">
+ .DRAFT 2
+ or
+ .DRAFT Two
+</span>
+</p>
+
+<p>
+Mom prints the argument to <kbd>.DRAFT</kbd> (i.e. the draft number)
+beside the word &#8220;Draft&#8221; in the middle part of
+<a href="definitions.html#header">page headers</a>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">A small word of caution:</span>
+If your argument to <kbd>.DRAFT</kbd> is more than one word long,
+you must enclose the argument in double-quotes.
+</p>
+</div>
+
+<p>
+You may, if you wish, invoke <kbd>.DRAFT</kbd> without an
+argument, in which case, no draft number will be printed beside
+&#8220;Draft&#8221; in headers or footers.
+</p>
+
+<!-- -DRAFT_STRING- -->
+
+<h3 id="draft-string" class="docs">The draft string</h3>
+
+<p>
+If you&#8217;re not writing in English, you can ask mom
+to use the word for &#8220;draft&#8221; in your own language by
+telling her what it is with the DRAFT_STRING macro,
+like this:
+<br/>
+<span class="pre">
+ .DRAFT_STRING "Jet"
+</span>
+</p>
+
+<p>
+Equally, DRAFT_STRING can be used to roll your own solution to
+something other than the word &#8220;Draft.&#8221; For example, you
+might want &#8220;Trial run alpha-three&#8221; to appear in the
+headers of a draft version. You&#8217;d accomplish this by doing
+<br/>
+<span class="pre">
+ .DRAFT alpha-three
+ .DRAFT_STRING "Trial run"
+</span>
+</p>
+
+<p>
+If you wanted only &#8220;Trial run&#8221; to appear, entering
+<kbd>.DRAFT</kbd> without an argument as well as
+<kbd>.DRAFT_STRING&nbsp;"Trial&nbsp;run"</kbd> is how you&#8217;d do it.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If you define both a blank <kbd>.DRAFT</kbd> and a blank
+<kbd>.DRAFT_STRING</kbd>, mom skips the draft field in headers
+entirely. If this is what you want, this is also the only way
+to do it. Simply omitting invocations of <kbd>.DRAFT</kbd> and
+<kbd>.DRAFT_STRING</kbd> will result in mom using her default, which
+is to print &#8220;Draft &lt;number&gt;&#8221;.
+</p>
+</div>
+
+<!-- -REVISION- -->
+
+<div class="macro-id-overline">
+<h3 id="revision" class="macro-id">REVISION</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>REVISION</b> <kbd class="macro-args">&lt;revision number&gt;</kbd>
+</div>
+
+<p>
+REVISION only gets used with
+<a href="#copystyle">COPYSTYLE DRAFT</a>.
+If the COPYSTYLE is FINAL (the default), mom ignores the REVISION
+macro. REVISION accepts both alphabetic and numeric arguments, hence
+it&#8217;s possible to do either
+<br/>
+<span class="pre" style="margin-bottom: -1em;">
+ .REVISION 2
+</span>
+or
+<span class="pre" style="margin-top: -.5em;">
+ .REVISION Two
+</span>
+</p>
+
+<p>
+Mom prints the revision number beside the shortform
+&#8220;Rev.&#8221; in the middle part of
+<a href="definitions.html#header">page headers</a>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">A small word of caution:</span>
+If your argument to <kbd>.REVISION</kbd> is more than one word long,
+you must enclose the argument in double-quotes.
+</p>
+</div>
+
+<p>
+You may, if you wish, invoke <kbd>.REVISION</kbd> without an
+argument, in which case, no revision number will be printed beside
+&#8220;Rev.&#8221; in headers or footers.
+</p>
+
+<!-- -REVISION_STRING- -->
+
+<h3 id="revision-string" class="docs">The revision string</h3>
+
+<p>
+If you&#8217;re not writing in English, you can ask mom
+to use the word for &#8220;revision,&#8221; or a shortform
+thereof, in your own language by telling her what it is with the
+REVISION_STRING macro, like this:
+<br/>
+<span class="pre">
+ .REVISION_STRING "Rév."
+</span>
+</p>
+
+<p>
+Additionally, you may sometimes want to make use of mom&#8217;s
+<a href="#copystyle">COPYSTYLE DRAFT</a>
+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
+<kbd>.DRAFT</kbd> and <kbd>.DRAFT_STRING</kbd> in addition to
+<kbd>.REVISION</kbd>, like this:
+<br/>
+<span class="pre">
+ .DRAFT
+ .DRAFT_STRING
+ .REVISION 2
+</span>
+</p>
+
+<p>
+Equally, if you want to roll your own solution to what revision
+information appears in headers, you could do something like this:
+<br/>
+<span class="pre">
+ .DRAFT
+ .DRAFT_STRING
+ .REVISION "two-twenty-two"
+ .REVISION_STRING "Revision"
+</span>
+</p>
+
+<p>
+The above, naturally, has no draft information. If you want to roll
+your own <kbd>.DRAFT</kbd> and/or <kbd>.DRAFT_STRING</kbd> as well,
+simply supply arguments to either or both.
+</p>
+
+<!-- -COPYRIGHT- -->
+
+<div class="macro-id-overline">
+<h3 id="copyright" class="macro-id">COPYRIGHT</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>COPYRIGHT</b> <kbd class="macro-args">[COVER | DOC_COVER] &quot;&lt;copyright info&gt;&quot;</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Argument must be enclosed in double-quotes
+</p>
+
+<p>
+The required argument to COPYRIGHT is only used on cover or doc cover
+pages, and then only if the argument COPYRIGHT is passed to
+<a href="cover.html#cover">COVER</a>
+or
+<a href="cover.html#doc-cover">DOC_COVER</a>.
+Do not include the copyright symbol in the argument passed to
+COPYRIGHT; mom puts it in for you.
+</p>
+
+<p>
+The optional argument, <kbd>COVER</kbd> or <kbd>DOC_COVER</kbd>,
+should only be used if you have both a doc cover and a cover and want
+differing copyright information on each (see the
+<a href="cover.html#cover-intro">Introduction to cover pages</a>
+for a description of the difference between &#8220;document
+covers&#8221; and &#8220;covers&#8221;). Thus, it is possible to
+have differing copyright information on the document cover and on
+the cover (&#8220;title&#8221;) page. An example might be:
+<br/>
+<span class="pre-in-pp">
+ .COPYRIGHT DOC_COVER "2010 John Smith and Jane Doe"
+ .COPYRIGHT COVER "2008 Joe Blow"
+</span>
+The first invocation of <kbd>.COPYRIGHT</kbd> establishes the
+copyright information that appears on the document cover; the second
+establishes the copyright information that appears on the cover
+(&#8220;title&#8221;) page.
+</p>
+
+<p>
+If you don&#8217;t require differing copyright information for
+doc cover and cover pages, <kbd>.COPYRIGHT</kbd>, without the
+optional first argument, is sufficient, provided you give the word,
+<kbd>COPYRIGHT</kbd>, as an argument to the macro
+<a href="cover.html#doc-cover">DOC_COVER</a>
+or
+<a href="cover.html#cover">COVER</a>
+</p>
+
+<p>
+Style parameters for the copyright line may be
+entered as individual macros or
+<a href="docelement.html#grouping">grouped</a>,
+e.g.
+<br/>
+<span class="pre-in-pp">
+ .COPYRIGHT_FAMILY H
+ .COPYRIGHT_FONT R
+ .COPYRIGHT_SIZE -2
+</span>
+or
+<br/>
+<span class="pre-in-pp">
+ .COPYRIGHT_STYLE \
+ FAMILY H \
+ FONT R \
+ SIZE -2
+</span>
+The vertical position of the copyright line may be raised (-) or
+lowered (+) with the macro COPYRIGHT_V_ADJUST. For example, to
+raise the copyright line by 3
+<a href="definitions.html#picaspoints">points</a>, you&#8217;d do
+<br/>
+<span class="pre-in-pp">
+ .COPYRIGHT_V_ADJUST -3p
+</span>
+Alternatively, the COPYRIGHT_STYLE macro may be used with the
+argument <kbd>V_ADJUST</kbd>:
+<span class="pre-in-pp">
+ .COPYRIGHT_STYLE \
+ FAMILY H \
+ FONT R \
+ SIZE -2 \
+ V_ADJUST -3p
+</span>
+</p>
+
+<!-- -MISC- -->
+
+<div class="macro-id-overline">
+<h3 id="misc" class="macro-id">MISC</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>MISC</b> <kbd class="macro-args">[COVER | DOC_COVER] &quot;&lt;argument 1&gt;&quot; [&quot;&lt;argument 2&gt;&quot; &quot;&lt;argument 3&gt;&quot; ...]</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;String arguments must be enclosed in double-quotes
+</p>
+
+<p>
+The argument(s) passed to MISC are only used on cover or doc cover
+pages, and then only if the argument <kbd>MISC</kbd> is passed to
+<a href="cover.html#cover">COVER</a>
+or
+<a href="cover.html#doc-cover">DOC_COVER</a>.
+MISC can contain any information you like. Each argument appears on
+a separate line at the bottom of the cover or doc cover page.
+</p>
+
+<p>
+For example, if you&#8217;re submitting an essay where the prof has
+requested that you include the course number, his name and the date,
+you could do
+<br/>
+<span class="pre-in-pp">
+ .MISC "Music History 101" "Professor Hasbeen" "Dec. 24, 2010"
+</span>
+and the information would appear on the essay&#8217;s cover page.
+</p>
+
+<p>
+If the optional argument, <kbd>COVER</kbd> or <kbd>DOC_COVER</kbd>,
+is given to MISC, the string arguments represent the miscellaneous
+information that will appear on cover or document cover pages (see
+the
+<a href="cover.html#cover-intro">Introduction to cover pages</a>
+for a description of the difference between &#8220;document
+covers&#8221; and &#8220;covers&#8221;). Thus, it is possible to
+have differing miscellaneous information on the document cover and
+on the cover (&#8220;title&#8221;) page. An example might be:
+<br/>
+<span class="pre">
+ .MISC DOC_COVER "Music History 101" "Professor Hasbeen"
+ .MISC COVER "Spring Term Paper"
+</span>
+</p>
+
+<p>
+The first invocation of <kbd>.MISC</kbd> establishes the
+miscellaneous information that appears on the document cover; the
+second establishes the miscellaneous information that appears on the
+cover (&#8220;title&#8221;) page.
+</p>
+
+<p>
+If you don&#8217;t require differing miscellaneous information
+for doc cover and cover pages, <kbd>.MISC</kbd>, without the
+optional first argument, is sufficient, provided you give the word
+&#8220;MISC&#8221; as an argument to the macro
+<a href="cover.html#doc-cover">DOC_COVER</a>
+or
+<a href="cover.html#cover">COVER</a>
+</p>
+
+<!-- -COVER_TITLE- -->
+
+<div class="macro-id-overline">
+<h3 class="macro-id">COVERTITLE &amp; DOC_COVERTITLE</h3>
+</div>
+
+<div id="covertitle" class="box-macro-args">
+Macro: <b>COVERTITLE</b> <kbd class="macro-args">&quot;&lt;user defined cover page title&gt;&quot; [&quot;&lt;2nd line&gt;&quot; [&quot;&lt;3rd line&gt;&quot; ... ] ]</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Arguments must be enclosed in double-quotes
+</p>
+
+<div id="doc-covertitle" class="box-macro-args">
+Macro: <b>DOC_COVERTITLE</b> <kbd class="macro-args">&quot;&lt;user defined document cover page title&gt;&quot; [&quot;&lt;2nd line&gt;&quot; [&quot;&lt;3rd line&gt;&quot; ... ] ]</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Arguments must be enclosed in double-quotes
+</p>
+
+<p>
+The arguments passed to COVERTITLE or DOC_COVERTITLE are only
+used on cover or doc cover pages, and then only if the argument
+<kbd>COVERTITLE</kbd> or <kbd>DOC_COVERTITLE</kbd> is explicitly
+passed to
+<a href="cover.html#cover">COVER</a>
+or
+<a href="cover.html#doc-cover">DOC_COVER</a>.
+</p>
+
+<p>
+COVERTITLE and DOC_COVERTITLE accept multiple arguments, each
+surrounded by double-quotes. Each argument is printed on a separate
+line, permitting you to create multi-line titles on your cover
+and/or doc cover pages.
+</p>
+
+<p>
+You only require COVERTITLE or DOC_COVERTITLE if they differ from
+TITLE. Note that
+<a href="#title">TITLE</a>
+itself has two optional arguments that accomplish the same thing.
+</p>
+
+<div class="macro-id-overline">
+<h3 class="macro-id">PDF Title</h3>
+</div>
+
+<div id="pdftitle" class="box-macro-args">
+Macro: <b>PDF_TITLE</b> <kbd class="macro-args">&quot;&lt;pdf viewer window title&gt;&quot;</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Argument must be enclosed in double-quotes
+</p>
+
+<p>
+Except for
+<a href="#doc-title">DOCTITLE</a>,
+mom does not, by default, provide PDF viewers with a document title.
+You may set one, if you like, with PDF_TITLE.
+</p>
+
+<div class="macro-id-overline">
+<h3 class="macro-id">TOC heading</h3>
+</div>
+
+<div id="toc-heading" class="box-macro-args">
+Macro: <b>TOC_HEADING</b> <kbd class="macro-args">&quot;&lt;single line TOC heading&gt;&quot;</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Argument must be enclosed in double-quotes
+</p>
+
+<p>
+Mom generates tables of contents automatically (see
+<a href="tables-of-contents.html#toc">TOC</a>).
+You may sometimes want to insert a line of text into the table of
+contents without it referring to a page number, for example to
+identify a &#8220;Part I&#8221; and a &#8220;Part II.&#8221;
+</p>
+
+<p>
+Placed before any instance of
+<a href="#start">START,</a>
+TOC_HEADING inserts its text into the table of contents with a
+modest amount of whitespace around it to distinguish it easily
+from table of contents entries.
+</p>
+
+<p>
+The appearance of the heading may be controlled with
+the macro
+<a href="#toc-heading-style">TOC_HEADING_STYLE</a>.
+</p>
+
+<div id="toc-heading-style" class="box-macro-args">
+Macro: <b>TOC_HEADING_STYLE</b> <kbd class="macro-args">&quot;&lt;arguments&gt;&quot;</kbd>
+</div>
+
+<p>
+TOC_HEADING_STYLE controls the look of TOC headings. It is a
+<a href="docelement.html#grouping">&#8220;grouping&#8221;</a>
+style macro with multiple arguments. It is recommended that
+you use the backslash character to separate them into individual
+lines rather than entering a single, very long line.
+</p>
+
+<p>
+TOC_HEADING_STYLE accepts as many or as few arguments as you need:
+<span class="pre-in-pp">
+ FAMILY &lt;family&gt; \
+ FONT &lt;font&gt; \
+ SIZE &lt;+|-n&gt; \
+ COLOR &lt;colorname&gt;* \
+ QUAD L | C | R \
+ SPACE_ABOVE &lt;n&gt;** \
+ SPACE_BENEATH &lt;n&gt;**
+</span>
+&nbsp;&nbsp;* <kbd>COLOR</kbd> must be pre-initialized with
+<a href="color.html#newcolor">NEWCOLOR</a>
+or
+<a href="color.html#xcolor">XCOLOR</a>.
+<br/>
+** <kbd>SPACE_ABOVE</kbd> and <kbd>SPACE_BENEATH</kbd> require a
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+to be appended to their numeric argument.
+</p>
+
+<p>
+For example, if you want your TOC headings to be bold, slightly
+larger than the rest of the table of contents, centred, and with
+one linespace beforehand,
+<span class="pre-in-pp">
+ FONT B \
+ SIZE +.5 \
+ QUAD C \
+ SPACE_ABOVE 1v
+</span>
+</p>
+
+<p>
+ See
+<a href="docelement.html#control-macro-args">Arguments to the control macros</a>
+for further information about the arguments. Note that
+<kbd>SPACE_ABOVE</kbd> and <kbd>SPACE_BENEATH</kbd> are unique to
+TOC_HEADING_STYLE.
+
+</p>
+
+<div class="rule-short"><hr/></div>
+
+<!-- ======================================================================== -->
+
+<h2 id="docstyle-macros" class="macro-group">The docstyle macros</h2>
+
+<p>
+The docstyle macros tell mom what type of document you&#8217;re
+writing, whether you want the output typeset or &#8220;typewritten,
+double-spaced&#8221;, and whether you want a draft copy (with draft
+and revision information in the headers) or a final copy.
+</p>
+
+<div class="macro-list-container">
+<h3 id="index-docstyle" class="macro-list">Docstyle macros</h3>
+<ul class="macro-list">
+ <li><a href="#doctype">DOCTYPE</a></li>
+ <li><a href="#printstyle">PRINTSTYLE</a> &ndash; non-optional macro required for document processing
+ <ul style="margin-left: -.5em; list-style-type: disc;">
+ <li><a href="#typeset-defaults">Defaults for PRINTSTYLE TYPESET</a></li>
+ <li><a href="#typewrite-defaults">Defaults for PRINTSTYLE TYPEWRITE</a>
+ <ul style="margin-left: -.5em; list-style-type: circle;">
+ <li><a href="#typewrite-control">PRINTSTYLE TYPEWRITE control macros</a>
+ <ul style="margin-left: -1.5em; list-style-type: square;">
+ <li><a href="#typewriter-family">Family</a></li>
+ <li><a href="#typewriter-size">Point size</a></li>
+ <li><a href="#typewriter-underlining">Underlining of italics</a></li>
+ </ul></li>
+ </ul></li>
+ </ul></li>
+ <li><a href="#copystyle">COPYSTYLE</a></li>
+</ul>
+</div>
+
+<!-- -DOCTYPE- -->
+
+<div class="macro-id-overline">
+<h3 id="doctype" class="macro-id">DOCTYPE</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>DOCTYPE</b> <kbd class="macro-args">DEFAULT | CHAPTER | NAMED &quot;&lt;name&gt;&quot; | LETTER | SLIDES</kbd>
+</div>
+
+<p>
+The arguments <kbd>DEFAULT,</kbd> <kbd>CHAPTER</kbd> and
+<kbd>NAMED</kbd> tell mom what to put in the
+<a href="definitions.html#docheader">docheader</a>
+and
+<a href="definitions.html#header">page headers</a>.
+<kbd>LETTER</kbd> and <kbd>SLIDES</kbd> tells her you want to write
+a letter or create slides.
+</p>
+
+<p>
+Mom&#8217;s default DOCTYPE is <kbd>DEFAULT</kbd>. If that&#8217;s
+what you want, you don&#8217;t have to give a DOCTYPE command.
+</p>
+
+<p id="default-doctype">
+<kbd>DEFAULT</kbd> prints a
+<a href="definitions.html#docheader">docheader</a>
+containing the title, subtitle and author information given to the
+<a href="#reference-macros">reference macros</a>,
+and page headers with the author and title. (See
+<a href="headfootpage.html#header-style">Default specs for headers</a>
+for how mom outputs each part of the page header.)
+</p>
+
+<p>
+<kbd>CHAPTER</kbd> prints &#8220;Chapter &lt;n&gt;&#8221; in place
+of a
+<a href="definitions.html#docheader">docheader</a>
+(&lt;n&gt; is what you gave to the
+<a href="#reference-macros">reference macro</a>,
+<kbd><a href="#chapter">CHAPTER</a></kbd>).
+If you give the chapter a title with
+<a href="#chapter-title">CHAPTER_TITLE</a>,
+mom prints &#8220;Chapter &lt;n&gt;&#8221; and the
+title underneath. If you omit the
+<a href="#chapter">CHAPTER</a>
+reference macro but supply a
+<a href="#chapter-title">CHAPTER_TITLE</a>,
+mom prints only the chapter title.
+</p>
+
+<p>
+The page headers in DOCTYPE <kbd>CHAPTER</kbd> contain the author,
+the title of the book (which you gave with
+<a href="#title">TITLE</a>),
+and &#8220;Chapter &lt;n&gt;&#8221; (or the chapter title). See
+<a href="headfootpage.html#header-style">Default Specs for Headers</a>
+for mom&#8217;s default type parameters for each part of
+the page header.
+</p>
+
+<p>
+<kbd>NAMED</kbd> takes an additional argument: a name for this
+particular kind of document (e.g. outline, synopsis, abstract,
+memorandum), enclosed in double-quotes. <kbd>NAMED</kbd> is
+identical to <kbd>DEFAULT</kbd> except that mom prints the argument
+to <kbd>NAMED</kbd> beneath the
+<a href="definitions.html#docheader">docheader</a>,
+as well as in page headers.
+(See
+<a href="headfootpage.html#header-style">Default specs for headers</a>
+for how mom outputs each part of the page header.)
+</p>
+
+<div class="box-tip">
+<p id="doctype-note" class="tip">
+<span class="note">Note: version 2.1 change</span>
+<br/>
+<kbd>DOCTYPE NAMED "string"</kbd> no longer accepts a colour
+argument after <kbd>"string"</kbd>. Setting the colour
+of the string is now done with <kbd><span class="nobr">DOCTYPE_COLOR
+&lt;color&gt;</span></kbd>. Default underscoring of
+<kbd>"string"</kbd> in the docheader and on covers
+has been removed. Use <kbd>DOCTYPE_UNDERSCORE</kbd>,
+<kbd>DOC_COVER_DOCTYPE_UNDERSCORE</kbd> and/or
+<kbd>COVER_DOCTYPE_UNDERSCORE</kbd> to re-enable it. All three take
+the same arguments listed in the
+<a href="docelement.html#underscore">Underscore style, rule weight</a>
+section of
+<a href="docelement.html#control-macro-args">Arguments to the control macros</a>.
+</p>
+</div>
+
+<p>
+<kbd>LETTER</kbd> tells mom you&#8217;re writing a letter. See the
+section
+<a href="letters.html#letters">Writing Letters</a>
+for instructions on using mom to format letters.
+</p>
+
+<h4 id="slides" class="docs" style="font-size: 100%; text-transform: uppercase">Slides</h4>
+
+<p>
+PDF slides are a special kind of mom document, formatted for viewing
+in a PDF reader&#8217;s presentation mode. In most respects, they
+behave identically to the other document types. Key differences
+are:
+</p>
+<ul style="margin-top: -.5em">
+<li>headers, footers, and pagination are disabled by default</li>
+<li>type is set
+<a href="typesetting.html#quad">QUAD CENTER</a>
+by default</li>
+<li>
+<a href="#flex">flex-spacing</a>
+and
+<a href="#shim">shimming</a>
+are disabled by default; shimming may
+be re-enabled (with <kbd>NO_SHIM OFF</kbd>), but not flex-spacing</li>
+<li>there&#8217;s no need for
+<a href="#printstyle">PRINTSTYLE</a></li>
+</ul>
+
+<p>
+DOCTYPE SLIDES takes up to five optional arguments, which come
+immediately after SLIDES. They may be entered in any order.
+<br/>
+<span class="pre-in-pp">
+ DOCTYPE SLIDES \
+ ASPECT 4:3 | 16:9 \
+ HEADER "left" "centre" "right" \
+ FOOTER "left" "centre" "right" \
+ TRANSITION "&lt;slide transition effect&gt;" (mode + parameters) \
+ PAUSE "&lt;text reveal effect&gt;" (mode + parameters)
+</span>
+For convenience, you many want to enter each argument on a single
+line as shown above; all but the last must be terminated by a
+backslash.
+</p>
+
+<h5 class="docs" style="margin-top: .5em">Aspect</h5>
+
+<p>
+Slides can be formatted for one of two aspect ratios common to
+monitors and screens: 4:3 and 16:9. The default is 16:9.
+<span class="pre-in-pp">
+ 4:3 16:9
+ media size: 11" x 8.25" media size: 11" x 8.1875"
+ left/right margins: 36 points left/right margins: 36 points
+ top margin: 90 points top margin: 80 points
+ bottom margin: 84 points bottom margin: 72 points
+ base text size: 16 points base text size: 14 points
+ autoleading: 6 points, adjusted autoleading: 4 points, adjusted
+ (header/footer size: -3 points) (header/footer size: -2 points)
+</span>
+Note that both media sizes fit on either A4 or US LETTER papersizes.
+</p>
+
+<h5 class="docs" style="margin-top: .5em">Headers, footers, and pagination</h5>
+
+<p>
+If you want a header, footer, or both for your slides, pass SLIDES
+the <kbd>HEADER</kbd> and/or <kbd>FOOTER</kbd> argument(s). Both
+take three additional
+<a href="definitions.html#stringargument">string arguments</a>,
+which must be enclosed in double-quotes, defining the left, centre,
+and right parts of the header/footer. Any parts you want left blank
+should be entered as two double-quotes. For example,
+<span class="pre-in-pp">
+ HEADER "" "My slide presentation" ""
+</span>
+will result in a header with only the centre part.
+</p>
+
+<p>
+Normal pagination is disabled for slides. If you want your slides
+numbered, the slide number must be given to one of the header/footer
+parts with the
+<a href="definitions.html#inlines">inline escape</a>
+<br/>
+<kbd><span class="nobr">\*[SLIDE#]</span></kbd>. For example:
+<span class="pre-in-pp">
+ HEADER "" "My slide presentation" "" \
+ FOOTER "" "" "\*[SLIDE#]"
+</span>
+will give you a centred header with numbering at the bottom right of
+the slide.
+</p>
+
+<p>
+The overall family, size, and colour of headers may be set with
+HEADER_FAMILY, HEADER_SIZE, and HEADER_COLOR. If you request
+FOOTERS, you may use the FOOTER_ equivalent of these macros.
+If you request both headers and footers, use one or the other but
+not both. For example, in a header/footer situation, HEADER_FAMILY
+would determine the family for both headers and footers, but if you
+attempted to do this
+<span class="pre-in-pp">
+ .HEADER_FAMILY T
+ .FOOTER_FAMILY H
+</span>
+FOOTER_FAMILY would take precedence, and your header family would be
+&#8220;<kbd>H</kbd>&#8221;.
+</p>
+
+<p>
+All other formatting of individual header/footer parts must be
+entered as inline escapes inside the double-quotes. If you want,
+say, your headers to be red but your footer page numbering to be
+black and two points larger, this is how you&#8217;d do it:
+<span class="pre-in-pp">
+ .HEADER_COLOR red
+ .DOCTYPE SLIDES \
+ HEADER "" "My slide presentation" "" \
+ FOOTER "" "" "\*[black]\*S[+2]\*[SLIDE#]\*S[-2]"
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Do not use mom&#8217;s
+<a href="inlines.html#inline-size-mom"><kbd><span class="nobr">\*[SIZE&nbsp;&plusmn;n]</span></kbd></a>
+inline escape to change point size in the strings
+passed to HEADER or FOOTER. Prefer either mom&#8217;s
+<kbd><span class="nobr">\*S[&plusmn;n]</span></kbd> or groff&#8217;s
+<kbd><span class="nobr">\s[&plusmn;n]</span></kbd>.
+</p>
+</div>
+
+<h5 class="docs" style="margin-top: .5em">Transition</h5>
+
+<p>
+&#8220;Transition&#8221; refers to how new slides appear during a
+presentation. The official PDF specification lists a number of modes,
+each with a choice of configurable parameters. Modes include Box,
+Blinds, Wipe, Fade, and several others. Parameters include things
+like duration, dimension, and direction. There are a total of
+twelve modes; for each one there are from one to six configurable
+parameters. Consult <kbd>man&nbsp;gropdf(1)</kbd> for a complete listing
+of modes and parameters.
+</p>
+
+<p>
+If you pass SLIDES the <kbd>TRANSITION</kbd> argument, you must
+at a minimum follow it with a mode. Afterwards, you may give as
+many or as few parameters as you wish. Parameters are, in order,
+<span class="pre-in-pp">
+ 1. duration
+ 2. dimension
+ 3. motion
+ 4. direction
+ 5. scale
+ 6. bool
+</span>
+You don&#8217;t have to fill them all out. If you only need the
+first three, that&#8217;s all you need to input. If you need the
+first and third, enter the second as a period (dot), which is used
+any time you want to leave a parameter at its current default or
+when it isn&#8217;t applicable. For example, if you want a Box
+transition that lasts 1 second, filling the screen from the centre
+outwards, you&#8217;d enter
+<span class="pre-in-pp">
+ TRANSITION "Box 1 . O"
+</span>
+because Box does not take a &#8220;dimension&#8221; parameter but it
+does take a motion parameter.
+</p>
+
+<p>
+Notice that the entire string (mode+parameters) must be enclosed in
+double-quotes.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Not all PDF viewers support all modes. Any that are not supported
+are replaced by the &#8220;R&#8221; mode, which simply replaces one
+slide with the next unless the PDF viewer has a different default
+transition mode.
+</p>
+</div>
+
+<h5 class="docs" style="margin-top: .5em">Pause</h5>
+
+<p>
+A &#8220;pause&#8221; occurs when material on a slide is halted (see
+<a href="#pause">PAUSE</a>),
+awaiting a mouse click, PgDown, Next, or the spacebar to reveal
+subsequent material. All the same modes and parameters as
+<kbd>TRANSITION</kbd> may be used. The manner of entering them is
+is identical, including that the entire mode+parameter string must
+be enclosed in double-quotes.
+</p>
+
+<div class="macro-id-overline">
+<h3 id="slide-macros" class="macro-id">SLIDE MACROS</h3>
+</div>
+
+<div id="newslide" class="box-macro-args">
+Macro: <b>NEWSLIDE</b> <kbd class="macro-args">["&lt;transition mode and parameters&gt;"]</kbd>
+</div>
+
+<p>
+Unless you want material from one slide to flow onto the next, you
+need to tell mom when to start a new slide with the macro NEWSLIDE.
+Without any arguments, the new slide will appear with the default
+TRANSITION you gave to DOCTYPE SLIDES.
+</p>
+
+<p>
+If you would like a different transition, you may pass NEWSLIDE a
+new mode and associated parameters, following the same rules as the
+TRANSITION argument to DOCTYPE. Note that the new effect becomes
+the default. If you wish to return to the original transition, you
+must give it explicitly to the appropriate NEWSLIDE.
+</p>
+
+<div id="pause" class="box-macro-args">
+Macro: <b>PAUSE</b> <kbd class="macro-args">["&lt;pause mode and parameters&gt;"]</kbd>
+</div>
+
+<p>
+Pauses in slides are accomplished by entering the macro PAUSE at
+desired locations in your input file. Subsequent material will be
+revealed using the pause mode given to DOCTYPE SLIDES.
+</p>
+
+<p>
+If you would like a different mode, you may pass PAUSE a
+new mode and associated parameters, following the same rules as the
+PAUSE argument to DOCTYPE.
+</p>
+
+<div id="transition" class="box-macro-args">
+Macro: <b>TRANSITION</b> <kbd class="macro-args">["&lt;transition mode and parameters&gt;"]</kbd>
+</div>
+
+<p>
+If for some reason you have material that flows from one slide to
+the next <i>and</i> you want the next slide to have a transition
+different from the current one, you can tell mom about the new
+transition with the macro TRANSITION anywhere prior to the break to
+the next slide.
+</p>
+
+<h4 id="slide-printing" class="docs" style="font-size: 100%; text-transform: uppercase">Printing slides</h4>
+
+<p>
+If you want to print slides as handouts, you have to tell
+<kbd>pdfmom</kbd> or <kbd>gropdf</kbd>, otherwise printing will
+stop at the first pause. Simply precede <kbd>pdfmom</kbd> or
+<kbd>gropdf</kbd> with GROPDF_NOSLIDE=1, like this:
+<br/>
+<span class="pre-in-pp">
+ GROPDF_NOSLIDE=1 pdfmom &lt;options&gt; slidefile.mom &gt; slidefile.pdf
+</span>
+
+</p>
+
+<!-- -PRINTSTYLE- -->
+
+<div class="macro-id-overline">
+<h3 id="printstyle" class="macro-id">PRINTSTYLE</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>PRINTSTYLE</b> <kbd class="macro-args">TYPESET | TYPEWRITE [ SINGLESPACE ]</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Required for document processing, except in the case of
+slides
+<br/>
+Must come before any changes to default document style
+</p>
+
+<p>
+PRINTSTYLE tells mom whether to typeset a document, or to print it
+out &#8220;typewritten, doubled-spaced&#8221;.
+</p>
+
+<div class="box-important">
+<p class="tip-top">
+<span class="important">Important:</span>
+<b>This macro may not be omitted.</b> In order for document
+processing to take place, mom requires a PRINTSTYLE. If you
+don&#8217;t give one, mom will warn you on stderr and print a single
+page with a nasty message.
+</p>
+
+<p class="tip-bottom">
+<span class="important">Just as important:</span>
+<b>PRINTSTYLE must precede any and all page and style
+parameters associated with a document</b> with the exception of
+<kbd>PAPER</kbd>, which should be placed at the top of your file.
+PRINTSTYLE sets up complete templates that include default margins,
+family, fonts, point sizes, and so on. Therefore, changes to any
+aspect of document style must come afterwards. For example,
+<br/>
+<span class="pre-in-pp">
+ .PAPER A4
+ .LS 14
+ .QUAD LEFT
+ .PRINTSTYLE TYPESET
+</span>
+will not change mom&#8217;s default document leading to 14 points,
+nor the default justification style (fully justified) to left
+justified, whereas
+<br/>
+<span class="pre-in-pp">
+ .PAPER A4
+ .PRINTSTYLE TYPESET
+ .LS 14
+ .QUAD LEFT
+</span>
+will.
+</p>
+
+</div>
+
+<p>
+<kbd>TYPESET</kbd>, as the argument implies, typesets
+documents (by default in Times Roman; see
+<a href="#typeset-defaults">TYPESET defaults</a>).
+You have full access to all the
+<a href="typesetting.html#macros-typesetting">typesetting macros</a>
+as well as the
+<a href="definitions.html#style-control">style control macros</a>
+of document processing.
+</p>
+
+<p>
+With <kbd>TYPEWRITE</kbd>, mom does her best to reproduce the look
+and feel of typewritten, double-spaced copy (see
+<a href="#typewrite-defaults">TYPEWRITE defaults</a>).
+<a href="docelement.html#docelement-control">Control macros</a>
+and
+<a href="typesetting.html#intro-macros-typesetting">typesetting macros</a>
+that alter family, font, point size, and
+<a href="definitions.html#leading">leading</a>
+are (mostly) ignored. An important exception is
+<a href="headfootpage.html#hdrftr-global-size">HEADER_SIZE</a>
+(and, by extension, FOOTER_SIZE), which allows you to reduce the
+point size of headers/footers should they become too crowded. Most
+of mom&#8217;s inlines affecting the appearance of type are also
+ignored
+(<a href="inlines.html#inline-size-mom"><kbd><span class="nobr">\*S[&lt;size&gt;]</span></kbd></a>
+is an exception; there may be a few others).
+</p>
+
+<p>
+In short, <kbd>TYPEWRITE</kbd> never produces effects
+other than those available on a typewriter. Don&#8217;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 <kbd>TYPEWRITE</kbd>.
+</p>
+
+<p>
+The primary uses of <kbd>TYPEWRITE</kbd> 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&#8217;s in the submission phase of its life (say, to show
+fellow writers for critiquing), simply change <kbd>TYPEWRITE</kbd>
+to <kbd>TYPESET</kbd> and print out a copy.
+</p>
+
+<p>
+If, for some reason, you would prefer the output of
+<kbd>TYPEWRITE</kbd> single-spaced, pass PRINTSTYLE
+<kbd>TYPEWRITE</kbd> the optional argument, <kbd>SINGLESPACE</kbd>.
+</p>
+
+<div class="defaults-container">
+<h3 id="typeset-defaults" class="docs defaults" style="margin-top: 0;">PRINTSTYLE TYPESET defaults</h3>
+<span class="pre 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
+</span>
+</div>
+
+<div class="defaults-container">
+<h3 id="typewrite-defaults" class="docs defaults" style="margin-top: 0;">PRINTSTYLE TYPEWRITE defaults</h3>
+<span class="pre 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
+</span>
+</div>
+
+<div class="box-tip" style="margin-top: 1.5em;">
+<h3 id="typewrite-control" class="docs control">PRINTSTYLE TYPEWRITE control macros</h3>
+
+<h4 id="typewriter-family" class="docs">Family</h4>
+
+<p style="margin-top: .5em;">
+If you&#8217;d prefer a monospace
+<a href="definitions.html#family">family</a>
+for PRINTSTYLE <kbd>TYPEWRITE</kbd> other than mom&#8217;s
+default, Courier, you can change it with
+<kbd>.TYPEWRITER_FAMILY&nbsp;&lt;family&gt;</kbd> (or
+<kbd>.TYPEWRITER_FAM</kbd>). Since groff ships with only the
+Courier family, you will have to install any other monospace family
+yourself. See
+<a href="appendices.html#fonts">Adding fonts to
+groff</a>.
+</p>
+
+<h4 id="typewriter-size" class="docs">Point size</h4>
+
+<p style="margin-top: .5em;">
+If you&#8217;d like a smaller or larger point size for
+PRINTSTYLE <kbd>TYPEWRITE</kbd> (mom&#8217;s default is 12-point),
+you can change it with
+<kbd>.TYPEWRITER_SIZE&nbsp;&lt;size&gt;</kbd>. There&#8217;s no need to
+add a
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+to the <kbd>&lt;size&gt;</kbd> argument; points is assumed. Be
+aware, however, that regardless of point size, mom&#8217;s
+leading/linespacing for <kbd>TYPEWRITE</kbd> is fixed at 24-point
+for double-spaced, and 12-point for single-spaced.
+</p>
+
+<h4 id="typewriter-underlining" class="docs">Underlining of italics</h4>
+
+<p>
+In PRINTSTYLE <kbd>TYPEWRITE</kbd>, mom, by default, underlines
+anything that looks like italics. This includes the
+<a href="typesetting.html#slant-inline"><kbd><span class="nobr">\*[SLANT]</span></kbd></a>
+<a href="definitions.html#inlines">inline escape</a>
+for pseudo-italics. (See
+<a href="goodies.html#underline">UNDERLINE</a>
+for a note on how to process TYPEWRITE files that underline
+italics.)
+</p>
+
+<p id="printstyle-italics">
+If you&#8217;d prefer that mom were less bloody-minded
+about pretending to be a typewriter (i.e., you&#8217;d like italics and
+pseudo-italics to come out as italics), use the control macros
+<br/>
+<span class="pre-in-pp">
+ .ITALIC_MEANS_ITALIC
+</span>
+and
+<span class="pre-in-pp">
+ .SLANT_MEANS_SLANT
+</span>
+Neither requires an argument.
+</p>
+
+<p>
+Although it&#8217;s unlikely, should you wish to reverse
+the sense of these macros in the midst of a document,
+<kbd>.UNDERLINE_ITALIC</kbd> and <kbd>.UNDERLINE_SLANT</kbd> restore
+underlining of italics and pseudo-italics.
+</p>
+
+<p id="underline-quotes">
+Additionally, by default, mom underlines
+<a href="definitions.html#quotes">quotes</a>
+(but not
+<a href="definitions.html#blockquotes">blockquotes</a>)
+in PRINTSTYLE <kbd>TYPEWRITE</kbd>. If you don&#8217;t like this
+behaviour, turn it off with
+<br/>
+<span class="pre">
+ .UNDERLINE_QUOTES OFF
+</span>
+</p>
+
+<p>
+To turn underlining of quotes back on, use UNDERLINE_QUOTES without
+an argument.
+</p>
+
+<p>
+While most of the
+<a href="docelement.html#docelement-control">control macros</a>
+have no effect on PRINTSTYLE <kbd>TYPEWRITE</kbd>, there
+is an important exception:
+<a href="headfootpage.html#hdrftr-global-size">HEADER_SIZE</a>
+(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
+<a href="#copystyle">COPYSTYLE</a>
+is <kbd>DRAFT</kbd>).
+</p>
+
+<p class="tip-bottom">
+Finally, note that colour is disabled for <kbd>TYPEWRITE</kbd>. If
+you would like it enabled, for example so PDF links are colourised,
+invoke the groff
+<a href="definitions.html#primitives">primitive</a>
+'<kbd>.color</kbd>' after PRINTSTYLE.
+</p>
+
+</div>
+
+<!-- -COPYSTYLE- -->
+
+<div class="macro-id-overline">
+<h3 id="copystyle" class="macro-id">COPYSTYLE</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>COPYSTYLE</b> <kbd class="macro-args">DRAFT | FINAL</kbd>
+</div>
+
+<p>
+Mom&#8217;s default COPYSTYLE is <kbd>FINAL</kbd>, so you
+don&#8217;t have to use this macro unless you want to.
+</p>
+
+<p>
+COPYSTYLE <kbd>DRAFT</kbd> exhibits the following behaviour:
+</p>
+<ol style="margin-top: -.5em;">
+ <li>Documents start on page 1, whether or not you
+ request a different starting page number with
+ <a href="headfootpage.html#pagenumber">PAGENUMBER</a>.
+ </li>
+ <li>Page numbers are set in lower case roman numerals.</li>
+ <li>The draft number supplied by
+ <a href="#draft">DRAFT</a>
+ and a revision number, if supplied with
+ <a href="#revision">REVISION</a>
+ (see
+ <a href="#reference-macros">reference macros</a>),
+ appear in the centre part of
+ <a href="definitions.html#header">page headers</a>
+ (or footers, depending on which you&#8217;ve selected) along with
+ any other information that normally appears there.
+ </li>
+</ol>
+
+<div class="box-important">
+<p class="tip">
+<span class="important">Important:</span>
+If you define your own centre part for page headers with
+<a href="headfootpage.html#hdrftr-center">HEADER_CENTER</a>,
+no draft and/or revision number will appear there. If you want
+draft and revision information in this circumstance, use
+<a href="headfootpage.html#draft-with-pagenumber">DRAFT_WITH_PAGENUMBER</a>.
+</p>
+</div>
+
+<p>
+COPYSTYLE <kbd>FINAL</kbd> differs from <kbd>DRAFT</kbd> in that:
+</p>
+<ol style="margin-top: -.5em;">
+ <li>It respects the starting page number you give the document.</li>
+ <li>Page numbers are set in normal (Arabic) digits.</li>
+ <li>No draft or revision number appears in the page headers.</li>
+</ol>
+
+<div class="box-tip">
+<p id="copystyle-note" class="tip">
+<span class="note">Note:</span>
+The centre part of page headers can get crowded, especially with
+<a href="docprocessing.html#doctype">DOCTYPE <kbd>CHAPTER</kbd></a>
+and
+<a href="docprocessing.html#doctype">DOCTYPE <kbd>NAMED</kbd></a>,
+when the COPYSTYLE is <kbd>DRAFT</kbd>. Three mechanisms are
+available to overcome this problem. One is to reduce the overall
+size of headers (with
+<a href="headfootpage.html#hdrftr-global-size">HEADER_SIZE</a>).
+Another, which only works with
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPESET</kbd></a>,
+is to reduce the size of the header&#8217;s centre part only (with
+<a href="headfootpage.html#_size">HEADER_CENTER_SIZE</a>).
+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
+<a href="headfootpage.html#draft-with-pagenumber">DRAFT_WITH_PAGENUMBER</a>).
+</p>
+</div>
+
+<div class="rule-short"><hr/></div>
+
+<!-- ======================================================================== -->
+
+<h2 id="start-macro" class="macro-group">Initiate document processing</h2>
+
+<p>
+In order to use mom&#8217;s document element macros (tags), you have
+to tell her you want them. The macro to do this is
+<a href="#start">START</a>.
+</p>
+
+<p>
+START collects the information you gave mom in the setup section at
+the top of your file (see
+<a href="#docprocessing-tut">Tutorial &ndash; Setting up a mom document</a>),
+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
+<kbd>.START</kbd>.
+</p>
+
+<!-- -START- -->
+
+<div class="macro-id-overline">
+<h3 id="start" class="macro-id">START</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>START</b>
+</div>
+<p class="requires">
+&bull;&nbsp;Required for document processing
+</p>
+
+<p>
+START takes no arguments. It simply instructs mom to begin document
+processing. If you don&#8217;t want document processing (i.e., you
+only want the
+<a href="typesetting.html#macros-typesetting">typesetting macros</a>),
+don&#8217;t use START.
+</p>
+
+<p>
+At a barest minimum before START, you must enter a
+<a href="#printstyle">PRINTSTYLE</a>
+command.
+</p>
+
+<div class="rule-short"><hr/></div>
+
+<!-- ======================================================================== -->
+
+<h2 id="style-before-start" class="macro-group">Establishing typestyle and formatting parameters before START</h2>
+
+<p>
+In the third (optional) part of setting up a document (the
+stylesheet; see
+<a href="#docprocessing-tut">Tutorial &ndash; Setting up a mom document</a>),
+you can use the
+<a href="typesetting.html">typesetting macros</a>
+to change mom&#8217;s document-wide defaults for margins,
+line length, family, base point size,
+<a href="definitions.html#leading">leading</a>,
+and justification style.
+</p>
+
+<p>
+Two additional style concerns have to be addressed here (i.e. in
+macros before
+<a href="#start">START</a>):
+changes to the
+<a href="definitions.html#docheader">docheader</a>,
+and whether you want you want the document&#8217;s nominal leading
+adjusted to fill pages fully to the bottom margin.
+</p>
+
+<div class="macro-list-container" style="margin-top: 2em;">
+<h3 id="index-style-before-start" class="macro-list">Type &amp; formatting parameters before START</h3>
+<ul class="macro-list">
+ <li><a href="#type-before-start">Behaviour of the typesetting macros before START</a>
+ <ul class="sublist" style="font-size: 100%; line-height: 120%; margin-bottom: .25em;">
+ <li><a href="#meanings">List of meanings</a></li>
+ <li><a href="#lrc-note">Special note on LEFT, RIGHT and CENTER</a></li>
+ <li><a href="#color">Initializing colours</a></li>
+ </ul></li>
+ <li><a href="#include">Including (sourcing) style sheets and files</a></li>
+ <li><a href="#doc-lead-adjust">DOC_LEAD_ADJUST</a> &ndash; adjust linespacing to fill pages and align bottom margins</li>
+ <li><a href="#docheader">DOCHEADER</a>
+ <ul class="sublist" style="font-size: 100%; line-height: 120%;">
+ <li><a href="#docheader-control">Docheader control</a></li>
+ </ul></li>
+ <li><a href="#columns">COLUMNS</a>
+ <ul class="sublist" style="font-size: 100%; line-height: 120%;">
+ <li><a href="#col-next">COL_NEXT</a></li>
+ <li><a href="#col-break">COL_BREAK</a></li>
+ </ul></li>
+</ul>
+</div>
+
+<h3 id="type-before-start" class="docs">Behaviour of the typesetting macros before START</h3>
+
+<p>
+From time to time (or maybe frequently), you&#8217;ll want the
+overall look of a document to differ from mom&#8217;s defaults.
+Perhaps you&#8217;d like her to use a different
+<a href="definitions.html#family">family</a>,
+or a different overall
+<a href="definitions.html#leading">leading</a>,
+or have different left and/or right page margins.
+</p>
+
+<p>
+To accomplish such alterations, use the appropriate
+<a href="typesetting.html#macros-typesetting">typesetting macros</a>
+(listed below) after
+<a href="#printstyle">PRINTSTYLE</a>
+and before
+<a href="#start">START</a>.
+</p>
+
+<p>
+More than one user has, quite understandably, not fully grasped the
+significance of the preceding sentence. The part they&#8217;ve missed is
+<i>after</i> PRINTSTYLE.
+</p>
+
+<p>
+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
+<br/>
+<span class="pre-in-pp">
+ .L_MARGIN 1i
+ .R_MARGIN 1.5i
+</span>
+However, when you invoke <kbd>.PRINTSTYLE</kbd>, those margins
+will be overridden. The correct place to set margins&mdash;and
+all other changes to the look of a document&mdash;is <i>after</i>
+PRINTSTYLE.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="important">Important:</span>
+Do not use the macros listed in
+<a href="#intro-doc-param">Changing document-wide typesetting parameters after START</a>
+prior to START; they are exclusively for use afterwards.
+</p>
+</div>
+
+<div id="meanings" class="defaults-container">
+<h3 class="docs defaults" style="margin-top: 0;">Meanings</h3>
+<p style="margin-left: 9px; margin-top: -.25em;">
+When used before START, the
+<a href="typesetting.html#macros-typesetting">typesetting macros</a>,
+below have the following meanings:
+<br/>
+<span class="pre">
+ 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 <a href="headfootpage.html#footer-margin">FOOTER MARGIN AND BOTTOM MARGIN</a> for an important warning
+ **See <kbd><a href="#doc-lead-adjust">DOC_LEAD_ADJUST</a></kbd>
+***See <a href="#lrc-note">Special note</a>
+</span>
+</p>
+</div>
+
+<p style="margin-top: -.75em;">
+Other macros that deal with type style, or refinements thereof
+(<a href="typesetting.html#kern">KERN</a>,
+<a href="typesetting.html#ligatures">LIGATURES</a>,
+<a href="typesetting.html#hy">HY</a>,
+<a href="typesetting.html#ws">WS</a>,
+<a href="typesetting.html#ss">SS</a>,
+etc.), behave normally. It is not recommended that you set up tabs
+or indents prior to START.
+</p>
+
+<p>
+If you want to change any of the basic parameters (above)
+<i>after</i> START and have them affect a document globally (as if
+you&#8217;d entered them <i>before</i> START), you must use the macros
+listed in
+<a href="#intro-doc-param">Changing document-wide typesetting parameters after START</a>.
+</p>
+
+<h4 id="lrc-note" class="docs">Special note on LEFT, RIGHT and CENTER prior to START</h4>
+
+<p>
+In a word, these three macros have no effect on document processing
+when invoked prior to START.
+</p>
+
+<p>
+All mom&#8217;s document element tags
+(<a href="docelement.html#pp">PP</a>,
+<a href="docelement.html#heading">HEADING</a>,
+<a href="docelement.html#blockquote">BLOCKQUOTE</a>,
+<a href="docelement.html#footnote">FOOTNOTE</a>,
+etc.) except
+<a href="docelement.html#quote">QUOTE</a>
+set a
+<a href="definitions.html#filled">fill mode</a>
+as soon as they&#8217;re invoked. If you wish to turn fill mode off
+for the duration of any tag (with
+<a href="typesetting.html#lrc">LEFT, RIGHT or CENTER</a>)
+you must do so immediately after invoking the tag. Furthermore,
+the change affects <i>only</i> the current invocation of the tag.
+Subsequent invocations of the same tag for which you want the same
+change require that you invoke <kbd>.LEFT</kbd>, <kbd>.RIGHT</kbd>
+or <kbd>.CENTER</kbd> immediately after every invocation of the tag.
+</p>
+
+<!-- -INCLUDE- -->
+
+<h4 id="include" class="docs">Including (sourcing) style sheets and files</h4>
+
+<p>
+If you routinely make the same changes to mom&#8217;s defaults in
+order to create similar documents in a similar style&mdash;in other
+words, you need a template&mdash; you can create stylesheet files
+and include, or &#8220;source&#8221;, them into your mom documents
+with the macro <kbd>.INCLUDE</kbd>. The right place for such style
+sheets is after
+<a href="#printstyle">PRINTSTYLE</a>
+and before
+<a href="#start">START</a>.
+</p>
+
+<p>
+Say, for example, in a particular kind of document, you always
+want main heads set in Helvetica Bold Italic, flush left, with
+no underscore. You&#8217;d create a file, let&#8217;s call it
+<kbd>head-template</kbd>, in which you&#8217;d place the pertinent
+HEADIING control macros.
+<br/>
+<span class="pre-in-pp">
+ .HEADING_STYLE 1 \
+ FAMILY H \
+ FONT BI \
+ QUAD L \
+ NO_UNDERSCORE
+</span>
+Then, in the preliminary document set-up section of your main file,
+you&#8217;d include the style sheet, or template, like this:
+<br/>
+<span class="pre-in-pp">
+ .TITLE "Sample Document
+ .AUTHOR "Joe Blow
+ .PRINTSTYLE TYPESET
+ \#
+ .INCLUDE head-template
+ \#
+ .START
+</span>
+
+The blank comment lines ( <kbd>\#</kbd> ) aren&#8217;t required, but
+they do make your file(s) easier to read.
+</p>
+
+<p>
+If the file to be included is in the same directory as the file
+you&#8217;re working, you simply enter the filename after
+<kbd>.INCLUDE</kbd>. If the file&#8217;s in another directory, you must
+provide a full path name to it. For example, if you&#8217;re working in
+a directory called <kbd>/home/joe/stories</kbd> and your
+stylesheet is in <kbd>/home/joe/stylesheets</kbd>, the above
+example would have to look like this:
+<br/>
+<span class="pre-in-pp">
+ .TITLE "Sample Document
+ .AUTHOR "Joe Blow
+ .PRINTSTYLE TYPESET
+ \#
+ .INCLUDE /home/joe/stylesheets/head-template
+ \#
+ .START
+</span>
+</p>
+
+<p>
+INCLUDE is not restricted to style sheets or templates. You can
+include any file at any point into a document, provided the file
+contains only text and valid groff or mom formatting commands.
+Neither is INCLUDE restricted to use with mom&#8217;s document
+processing macros. You can use it in plain typeset documents as
+well.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+INCLUDE is an alias for the groff request <kbd>.so</kbd>. If the
+sourced file contains material that requires pre-processing (e.g.
+a table made with <b>tbl(1)</b> or non-English characters), use
+<kbd>.so</kbd> rather than INCLUDE and invoke pdfmom thus:
+<br/>
+<span class="pre-in-pp">
+ soelim file.mom | pdfmom [flags] &gt; file.pdf
+</span>
+<b>soelim</b> only looks for lines that begin with <kbd>.so</kbd>,
+which furthermore must not have any space between the period and
+the &#8220;s&#8221;.
+</p>
+</div>
+
+<!-- -COLOUR- -->
+
+<h4 id="color" class="docs">Initializing colours</h4>
+
+<p>
+Although it doesn&#8217;t really matter where you define/initialize
+colours for use in document processing (see
+<a href="color.html#newcolor">NEWCOLOR</a>
+and
+<a href="color.html#xcolor">XCOLOR</a>
+in the section
+<a href="color.html#color-intro">Coloured text</a>),
+I recommend doing so before you begin document processing with
+<kbd><a href="#start">START</a></kbd>.
+</p>
+
+<p>
+The macro
+<a href="color.html#color">COLOR</a>
+and the
+<a href="definitions.html#inlines">inline escape</a>,
+<a href="color.html#color-inline"><kbd><span class="nobr">\*[&lt;colorname&gt;]</span></kbd></a>
+can be used at any time during document processing for occasional
+colour effects. However, consistent and reliable colourising of
+various document elements (the docheader, heads, linebreaks,
+footnotes, pagenumbers, and so on) must be managed through the use
+of the
+<a href="docelement.html#docelement-control">document element control macros</a>.
+</p>
+
+<p>
+Please note that colour is disabled if your
+<a href="#printstyle">PRINTSTYLE</a>
+is <kbd>TYPEWRITE</kbd>. If you would like it enabled, for example
+so PDF links are colourised, invoke the groff
+<a href="definitions.html#primitives">primitive</a>
+'<kbd>.color</kbd>' after PRINTSTYLE.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If you plan to have mom generate a
+<a href="docelement.html#toc">table of contents</a>,
+do not embed colour
+<a href="definitions.html#inlines">inline escapes</a>
+(<a href="color.html#color-inline"><kbd><span class="nobr">\*[&lt;colourname&gt;]</span></kbd></a>)
+in the
+<a href="definitions.html#stringargument">string arguments</a>
+given to any of the
+<a href="docprocessing.html#reference-macros">reference macros</a>,
+nor in the string arguments given to
+<a href="docelement.html#heading">HEADING</a>.
+Use, rather, the
+<a href="definitions.html#controlmacro">control macros</a>
+mom provides to automatically colourise these elements.
+</p>
+</div>
+
+<!-- -DOC LEAD ADJUST- -->
+
+<div class="macro-id-overline">
+<h3 id="doc-lead-adjust" class="macro-id">Adjust linespacing to fill pages and align bottom margins</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>DOC_LEAD_ADJUST</b> <kbd class="macro-args">toggle</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Must come after
+<a href="typesetting.html#ls"><span class="normal">LS</span></a>
+or
+<a href="typesetting.html.#autoloead"><span class="normal">AUTOLEAD</span></a>
+and before
+<a href="#start"><span class="normal">START</span></a>
+</p>
+
+<p>
+DOC_LEAD_ADJUST is a special macro to adjust document
+<a href="definitions.html#leading">leading</a>
+so that bottom margins fall precisely where you expect.
+</p>
+
+<p>
+When you invoke <kbd>.DOC_LEAD_ADJUST</kbd>, mom takes the number
+of lines that fit on the page at your requested leading, then
+incrementally adds
+<a href="definitions.html#units">machine units</a>
+to the leading until the maximum number of lines at the new leading
+that fit on the page coincides perfectly with the bottom margin of
+<a href="definitions.html#running">running text</a>.
+</p>
+
+<p>
+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&#8217;s mom&#8217;s default
+and you don&#8217;t have to invoke it explicitly.
+</p>
+
+<p>
+However, should you not want adjusted document leading, you must
+turn it off manually, like this:
+<br/>
+<span class="pre">
+ .DOC_LEAD_ADJUST OFF
+</span>
+</p>
+
+<p>
+If you set the document leading prior to START with
+<a href="typesetting.html#leading">LS</a>
+or
+<a href="typesetting.html#autolead">AUTOLEAD</a>,
+<kbd>.DOC_LEAD_ADJUST&nbsp;OFF</kbd> must come afterwards, like
+this:
+<br/>
+<span class="pre-in-pp">
+ .LS 12
+ .DOC_LEAD_ADJUST OFF
+</span>
+In this scenario, the maximum number of lines that fit on a page at
+a
+<a href="definitions.html#leading">leading</a>
+of 12
+<a href="definitions.html#picaspoints">points</a>
+determine where mom ends a page. The effect will be that last lines
+usually fall (slightly) short of the &#8220;official&#8221; bottom
+margin.
+</p>
+
+<p>
+In
+<a href="docprocessing.html#printstyle">PRINTSTYLE</a>&nbsp;<kbd>TYPEWRITE</kbd>,
+the leading is always adjusted and can&#8217;t be turned off.
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span>
+DOC_LEAD_ADJUST, if used, must be invoked after
+<a href="typesetting.html#leading">LS</a>
+or
+<a href="typesetting.html#autolead">AUTOLEAD</a>
+and before
+<a href="#start">START</a>.
+</p>
+
+<p class="tip-bottom">
+<span class="additional-note">Additional note:</span>
+Even if you disable DOC_LEAD_ADJUST, mom will still adjust the
+leading of endnotes pages and toc pages. See
+<a href="docelement.html#endnote-lead">ENDNOTE_LEAD</a>
+and
+<a href="docelement.html#toc-lead">TOC_LEAD</a>
+for an explanation of how to disable this default behaviour.
+</p>
+</div>
+
+<!-- -DOCHEADER- -->
+
+<div class="macro-id-overline">
+<h3 id="docheader" class="macro-id">Managing the docheader</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>DOCHEADER</b> <kbd class="macro-args">&lt;toggle&gt; [ distance to advance from top of page ] [ NO_SHIM ]</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Must come before
+<a href="#start"><span class="normal">START</span></a>; <kbd><span class="normal">distance</span></kbd> requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+By default, mom prints a
+<a href="definitions.html#docheader">docheader</a>
+on the first page of any document (see
+<a href="#docheader-desc">below</a>
+for a description of the docheader). If you don&#8217;t want a docheader,
+turn it off with
+<br/>
+<span class="pre-in-pp">
+ .DOCHEADER OFF
+</span>
+DOCHEADER is a toggle macro, so the argument doesn&#8217;t
+have to be OFF; it can be anything you like.
+</p>
+
+<p>
+If you turn the docheader off, mom, by default, starts
+the running text of your document on the same top
+<a href="definitions.html#baseline">baseline</a>
+as all subsequent pages. If you&#8217;d like her to start at a different
+vertical position, give her the distance you&#8217;d like as a second
+argument.
+<br/>
+<span class="pre-in-pp">
+ .DOCHEADER OFF 1.5i
+</span>
+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 &#8220;valid&#8221;
+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
+<a href="definitions.html#baseline">baseline</a>
+of the first line of type.
+</p>
+
+<p>
+With <kbd>.DOCHEADER OFF</kbd>, it is possible to create your own
+custom docheaders (after
+<a href="#start">START</a>)
+using mom&#8217;s typesetting macros. It is recommended that if you
+do create a custom docheader, you make
+<a href="docprocessing.html#shim"><kbd>.SHIM</kbd></a>
+the last macro before the first item of your document (for
+example, <kbd>.PP</kbd> or <kbd>.HEADING&nbsp;1</kbd>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+You may have tried <kbd>DOCHEAHER&nbsp;OFF</kbd> with a distance argument
+and discovered that mom will not budge the starting position of the document
+from her chosen default location. This is byproduct of
+<a href="#shim">shimming</a>,
+which mom always applies before the first line of running text after
+the docheader, regardless of which
+<a href="#vertical-whitespace-management">vertical whitespace management</a>
+strategy is in effect. If you encounter the problem, pass
+<kbd>DOCHEADER&nbsp;OFF&nbsp;&lt;distance&gt;</kbd>
+the additional final argument, <kbd>NO_SHIM</kbd>.
+</p>
+</div>
+
+<!-- DOCHEADER CONTROL -->
+
+<h3 id="docheader-control" class="docs">Docheader control: How to change the look of docheaders</h3>
+
+<p>
+In
+<a href="#printstyle">PRINTSTYLE <kbd>TYPEWRITE</kbd></a>,
+the look of docheaders is carved in stone. In
+<a href="#printstyle">PRINTSTYLE <kbd>TYPESET</kbd></a>,
+however, you can make a lot of changes. Macros that alter
+docheaders must come before
+<a href="#start">START</a>.
+</p>
+
+<h4 id="docheader-desc" class="docs">Docheader description</h4>
+
+<p>
+A typeset docheader has the following characteristics:
+</p>
+<div class="box-code" style="margin-left: 24px;">
+<span class="pre" style="color: #302419;">
+ 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, 3 points larger than running text
+</span>
+</div>
+
+<p>
+Or, if the
+<a href="#doctype">DOCTYPE</a>
+is <kbd>CHAPTER</kbd>,
+</p>
+<div class="box-code" style="margin-left: 24px;">
+<span class="pre" style="color: #302419;">
+ Chapter &lt;n&gt; bold, 4 points larger than running text
+Chapter Title bold italic, 4 points larger than running text
+</span>
+</div>
+
+<p>
+The
+<a href="definitions.html#family">family</a>
+is the prevailing family of the whole document. Title, subtitle,
+author, and document type are what you supply with the
+<a href="#reference-macros">reference macros</a>.
+Any you leave out will not appear; mom will compensate:
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If your DOCTYPE is <kbd>CHAPTER</kbd> and you have both &#8220;Chapter
+&lt;n&gt;&#8221; and a &#8220;Chapter Title&#8221; (as above), mom
+inserts a small amount of whitespace between them, equal to
+one-quarter of the
+<a href="definitions.html#leading">leading</a>
+in effect. If this doesn&#8217;t suit you, you can remove or alter
+the space with
+<a href="#space-before">CHAPTER_TITLE_SPACE_BEFORE</a>.
+</p>
+</div>
+
+<div class="macro-list-container">
+<h3 id="index-docheader-control" class="macro-list">Docheader control</h3>
+
+<p style="margin-top: -1.5em; margin-left: .5em; margin-right: .5em">
+With the docheader control macros, you can change the family,
+colour, leading, and quad direction of the entire docheader. You can
+also set the style parameters for each part individually. Style
+parameters include family, font, size, colour, lead, space before,
+caps, smallcaps, and underscoring.
+</p>
+
+<ul class="macro-list" style="margin-top: -.5em">
+ <li><a href="#change-whole-docheader">1. Changes to the whole docheader</a>
+ <ul style="list-style-type: disc">
+ <li><a href="#change-start">Change the starting position of the docheader</a></li>
+ <li><a href="#docheader-family">Change the family of the whole docheader</a></li>
+ <li><a href="#docheader-color">Change the colour of the whole docheader</a></li>
+ <li><a href="#docheader-lead">Change the leading of the whole docheader</a></li>
+ <li><a href="#docheader-quad">Change the quad direction of the docheader</a></li>
+ </ul>
+ </li>
+ <li><a href="#part-by-part">2. Part by part changes</a>
+ <ul style="list-style-type: disc">
+ <li><a href="#list-of-params">List of parameters and arguments</a></li>
+ <li><a href="#grouping">Grouping part/parameter changes</a> &ndash; very handy</li>
+ </ul>
+ </li>
+ <li><a href="#change-attribute">3. Changing or removing the attribution string (&#8220;by&#8221;)</a></li>
+</ul>
+</div>
+
+<h4 id="change-whole-docheader" class="docs" style="font-size: 100%">1. Changes to the whole docheader</h4>
+
+<h5 id="change-start" class="docs">Change the starting position of the docheader</h5>
+
+<p>
+By default, a docheader starts on the same
+<a href="definitions.html#baseline">baseline</a>
+as
+<a href="definitions.html#running">running text</a>.
+If you&#8217;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:
+<br/>
+<span class="pre-in-pp">
+ .DOCHEADER_ADVANCE 4P
+</span>
+A
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+is required.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If
+<a href="headfootpage.html#headers">HEADERS</a>
+are <kbd>OFF</kbd>, mom&#8217;s normal top margin for
+<a href="definitions.html#running">running text</a>
+(7.5
+<a href="definitions.html#picaspoints">picas</a>)
+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.
+</p>
+</div>
+
+<h5 id="docheader-quad" class="docs">Change the quad direction of the docheader</h5>
+
+<p>
+By default, mom centres the docheader. If you&#8217;d prefer to
+have your docheaders set flush left or right, or need to restore
+the default centering, invoke <kbd>.DOCHEADER_QUAD</kbd> with the
+quad direction you want, either <kbd>LEFT</kbd> (or <kbd>L</kbd>),
+<kbd>RIGHT</kbd> (or <kbd>R</kbd>) or <kbd>CENTER</kbd> (or
+<kbd>C</kbd>).
+</p>
+
+<h5 id="docheader-family" class="docs">Change the family of the entire docheader</h5>
+
+<p>
+By default, mom sets the docheader in the same
+family used for
+<a href="definitions.html#running">running text</a>.
+If you&#8217;d prefer to have your docheaders set in a different
+family, invoke <kbd>.DOCHEADER_FAMILY</kbd> with the family you
+want. The argument to DOCHEADER_FAMILY is the same as for
+<a href="typesetting.html#family">FAMILY</a>.
+</p>
+
+<p>
+For example, mom&#8217;s default family for running text is Times
+Roman. If you&#8217;d like to keep that default, but have the
+docheaders set entirely in Helvetica,
+<br/>
+<span class="pre-in-pp">
+ .DOCHEADER_FAMILY H
+</span>
+is how you&#8217;d do it.
+</p>
+
+<p>
+Please note that if you use DOCHEADER_FAMILY, you can still alter
+the family of individual parts of the docheader.
+</p>
+
+<h5 id="docheader-color" class="docs">Change the colour of the entire docheader</h5>
+
+<p>
+The default colour for docheaders is black, as you&#8217;d expect.
+If you wish to change it, use
+<kbd>.DOCHEADER_COLOR&nbsp;&lt;colour&gt;</kbd>, where
+<kbd>&nbsp;&lt;colour&gt;</kbd> is a colour pre-initialized with
+<a href="color.html#xcolor">XCOLOR</a>
+or
+<a href="color.html#newcolor">NEWCOLOR</a>.
+</p>
+
+<h5 id="docheader-lead" class="docs">Change the leading of the entire docheader</h5>
+
+<p>
+By default, mom uses the leading in effect for
+<a href="definitions.html#running">running text</a>
+for docheaders. If you want to increase or
+decrease the overall docheader leading, use
+<kbd>.DOCHEADER_LEAD&nbsp;+|-&lt;amount&gt;</kbd>, where
+<kbd>&lt;amount&gt;</kbd> is the number of
+<a href="definitions.html#picaspoints">points</a>
+by which to make the adjustment.
+</p>
+
+<h4 id="part-by-part" class="docs" style="font-size: 100%">2. Part by part changes</h4>
+
+<p>
+Whenever you want to change the style parameters for any part of
+the docheader, simply join the name of the part to the parameter
+you wish to change using an underscore, then supply any necessary
+arguments. The subtitle double-underlined? No problem.
+<br/>
+<span class="pre-in-pp">
+ .SUBTITLE_UNDERSCORE DOUBLE
+</span>
+Author in red?
+<br/>
+<span class="pre-in-pp">
+ .AUTHOR_COLOR red
+</span>
+Title in smallcaps?
+<span class="pre-in-pp">
+ .TITLE_SMALLCAPS
+</span>
+</p>
+
+<div class="box-tip" style="margin-top: -1em;">
+<p class="tip">
+<span class="note">Note:</span>
+Use <kbd>ATTRIBUTE</kbd> as the part name for the attribution string
+(&#8220;by&#8221;) that precedes the author, and <kbd>DOCTYPE</kbd>
+as the name for the string passed to <kbd>DOCTYPE NAMED&nbsp;"string"</kbd>.
+</p>
+</div>
+
+<h5 id="list-of-params" class="docs">List of parameters with arguments</h5>
+
+<dl>
+ <dt class="params">_FAMILY</dt>
+ <dd>
+ Takes the same argument as <a href="typesetting.html#family">FAMILY</a>.
+ </dd>
+ <dt class="params">_FONT</dt>
+ <dd>
+ Takes the same argument as <a href="typesetting.html#font">FT</a>.
+ </dd>
+ <dt class="params">_SIZE</dt>
+ <dd>
+ Takes a <kbd>+</kbd> or <kbd>-</kbd> value relative to the size of
+ <a href="definitions.html#running">running text</a>.
+ </dd>
+ <dt class="params">_COLOR</dt>
+ <dd>
+ Takes the same argument as <a href="color.html#color">COLOR</a>.
+ Colours should be pre-initialized with
+ <a href="color.html#xcolor">XCOLOR</a>
+ or
+ <a href="color.html#newcolor">NEWCOLOR</a>.
+ </dd>
+ <dt class="params">_LEAD</dt>
+ <dd>
+ Takes an absolute leading value, i.e. not relative to the
+ overall leading of the docheader. The leading applies to
+ multiple lines of type within the same docheader part, e.g.
+ several authors or a long title that must be split over two
+ lines. No
+ <a href="definitions.html#unitofmeasure">unit of measure</a>
+ is required;
+ <a href="definitions.html#picaspoints">points</a>
+ is assumed.
+ </dd>
+ <dt id="space-before" class="params">_SPACE</dt>
+ <dd>
+ Takes a numeric value with a
+ <a href="definitions.html#unitofmeasure">unit of measure</a>
+ appended to it. The value may be negative. This allows you
+ to adjust the whitespace before a docheader part, for example
+ if you want more whitespace between the title and the author.
+ <span style="display: block; margin-top: .5em">
+ Note that <kbd>TITLE</kbd> does not have a <kbd>_SPACE</kbd>
+ parameter; use
+ <a href="#change-start">DOCHEADER_ADVANCE</a>
+ to move the title further down on the page.
+ </span>
+ </dd>
+ <dt class="params">_CAPS</dt>
+ <dd>
+ Capitalizes the entire docheader part. No argument is
+ required.
+ </dd>
+ <dt class="params">_NO_CAPS</dt>
+ <dd>
+ Only used if you need to reverse the sense of <kbd>_CAPS</kbd>, as
+ can sometimes happen when
+ <a href="rectoverso.html#collate">collating</a>
+ documents that have differing docheader style requirements.
+ </dd>
+ <dt class="params">_SMALLCAPS</dt>
+ <dd>
+ Set the entire docheader part in smallcaps. No argument is
+ required.
+ </dd>
+ <dt class="params">_NO_SMALLCAPS</dt>
+ <dd>
+ Only used if you need to reverse the sense of
+ <kbd>_SMALLCAPS</kbd>, as can sometimes happen when
+ <a href="rectoverso.html#collate">collating</a>
+ documents that have differing docheader style requirements.
+ </dd>
+ <dt class="params">_UNDERSCORE</dt>
+ <dd>
+ With no argument, underscores the docheader part. With a
+ single, possibly decimal numeric argument, sets the weight of
+ the underscore. A second numeric argument to which a
+ <a href="definitions.html#unitofmeasure">unit of measure</a>
+ is appended (most likely <kbd>p</kbd>) sets the distance
+ between the baseline and the underscore.
+ <span style="display: block; margin-top: .5em">
+ If the argument <kbd>DOUBLE</kbd> is given, double underscores
+ the docheader part. With a single, possibly decimal numeric
+ argument afterwards, sets the weight of the underscore rules.
+ A third numeric argument to which a
+ <a href="definitions.html#unitofmeasure">unit of measure</a>
+ is appended (most likely <kbd>p</kbd>) sets the distance
+ between the baseline and the first underscore rule. A fourth
+ numeric argument to which a unit of measure is appended sets
+ the distance between the two underscore rules.
+ </span>
+ <span style="display: block; margin-top: .5em">
+ You may give <kbd>_UNDERLINE</kbd> as the parameter instead of
+ <kbd>_UNDERSCORE</kbd> if you prefer.
+ </span>
+ </dd>
+ <dt class="params">NO_UNDERSCORE</dt>
+ <dd>
+ Only used if you need to reverse the sense of
+ <kbd>_UNDERSCORE</kbd>, as can sometimes happen when
+ <a href="rectoverso.html#collate">collating</a>
+ documents that have differing docheader style requirements.
+ </dd>
+</dl>
+
+<h5 id="grouping" class="docs">Grouping part/parameter changes</h5>
+
+<p>
+If you want to change several parameters for a particular docheader
+part, you may group the changes together in a single macro by
+joining the name of the part to <kbd>STYLE</kbd> with an underscore,
+for example <kbd>TITLE_STYLE</kbd> or <kbd>AUTHOR_STYLE</kbd>.
+The following demonstrates:
+<span class="pre-in-pp">
+ .CHAPTER_TITLE_STYLE \
+ FAMILY T \
+ SIZE +4 \
+ UNDERSCORE 2 \
+ SMALLCAPS
+</span>
+Notice the use of the backslash character, which is required after
+the macro name and all parameters except the last. Grouping reduces
+clutter and the finger fatigue caused by entering
+<span class="pre-in-pp">
+ .CHAPTER_TITLE_FAMILY T
+ .CHAPTER_TITLE_SIZE +4
+ .CHAPTER_TITLE_UNDERSCORE 2
+ .CHAPTER_TITLE_SMALLCAPS
+</span>
+</p>
+
+<h4 id="change-attribute" class="docs" style="font-size: 100%">3. Changing or removing the attribution string (&#8220;by&#8221;)</h4>
+
+<p>
+If you&#8217;re not writing in English, you can change what mom
+prints where &#8220;by&#8221; appears in docheaders. For example,
+<br/>
+<span class="pre-in-pp">
+ .ATTRIBUTE_STRING "par"
+</span>
+changes &#8220;by&#8221; to &#8220;par&#8221;. ATTRIBUTE_STRING
+can also be used, for example, to make the attribution read
+&#8220;Edited by&#8221;.
+</p>
+
+<p>
+If you don&#8217;t want an attribution string at all, simply pass
+ATTRIBUTE_STRING an empty argument, like this:
+<br/>
+<span class="pre-in-pp">
+ .ATTRIBUTE_STRING ""
+</span>
+Mom will deposit a blank line where the attribution string normally
+appears.
+</p>
+
+<p>
+If the optional argument <kbd>COVER</kbd> or <kbd>DOC_COVER</kbd>
+is given to ATTRIBUTE_STRING, the string argument represents the
+attribution string that will appear on cover or document cover pages
+(see the
+<a href="cover.html#cover-intro">Introduction to cover pages</a>
+for a description of the difference between &#8220;document
+covers&#8221; and &#8220;covers&#8221;). Thus, it is possible to
+have different attribution strings on the document cover page, the
+cover (&#8220;title&#8221;) page, and in the first-page docheader.
+An extreme example would be:
+<br/>
+<span class="pre-in-pp">
+ .ATTRIBUTE_STRING ""
+ .ATTRIBUTE_STRING DOC_COVER "Edited by"
+ .ATTRIBUTE_STRING COVER "by"
+</span>
+The first invocation of <kbd>.ATTRIBUTE_STRING</kbd> establishes a
+blank attribution string that will be incorporated in the first-page
+docheader. The second will print &#8220;Edited by&#8221; on the
+document cover; the third will print &#8220;by&#8221; on the cover
+(&#8220;title&#8221;) page.
+</p>
+
+<p>
+If you don&#8217;t require differing attribute strings for
+doc cover pages, cover pages, or the first-page docheader,
+<kbd>.ATTRIBUTE_STRING</kbd>, without either of the optional first
+arguments, is sufficient.
+</p>
+
+<div class="rule-short"><hr/></div>
+
+<!-- -COLUMNS- -->
+
+<h2 id="columns-intro" class="docs">Setting documents in columns</h2>
+
+<p>
+Setting documents in columns is easy with mom. All you have to do
+is say how many columns you want and how much space you want
+between them (the
+<a href="definitions.html#gutter">gutters</a>).
+That&#8217;s it. Mom takes care of everything else, from soup to
+nuts.
+</p>
+
+<h3 class="docs">Some words of advice</h3>
+
+<p>
+If you want your type to achieve a pleasing
+<a href="definitions.html#just">justification</a>
+or
+<a href="definitions.html#rag">rag</a>
+in columns, reduce the point size of type (and probably the
+<a href="definitions.html#leading">leading</a>
+as well). Mom&#8217;s default document point size is 12.5, which
+works well across her default 39
+<a href="definitions.html#picaspoints">pica</a>
+full page line length, but with even just two columns on a page, the
+default point size is awkward to work with.
+</p>
+
+<p>
+Furthermore, you&#8217;ll absolutely need to reduce the indents for
+<a href="docelement.html#epigraph-control">epigraphs</a>,
+<a href="docelement.html#quote-general">quotes</a>,
+and
+<a href="docelement.html#blockquote-general">blockquotes</a>
+(and probably the
+<a href="docelement.html#para-indent">paragraph first-line indent</a>
+as well).
+</p>
+
+<!-- -COLUMN- -->
+
+<div class="macro-id-overline">
+<h3 id="columns" class="macro-id">COLUMNS</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>COLUMNS</b> <kbd class="macro-args">&lt;number of columns&gt; &lt;width of gutters&gt;</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Should be the last macro before START
+<br/>
+
+<i>The second argument requires a <a href="definitions.html#unitofmeasure">unit of measure</a></i>
+</p>
+
+<p>
+COLUMNS takes two arguments: the number of columns you want on
+document pages, and the width of the
+<a href="definitions.html#gutter">gutter</a>
+between them. For example, to set up a page with two columns
+separated by an 18 point gutter, you&#8217;d do
+<br/>
+<span class="pre-in-pp">
+ .COLUMNS 2 18p
+</span>
+Nothing to it, really. However, as noted above, COLUMNS should
+always be the last document setup macro prior to
+<a href="#start">START</a>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Mom ignores columns completely when the
+<a href="#printstyle">PRINTSTYLE</a>
+is <kbd>TYPEWRITE</kbd>. The notion of typewriter-style
+output in columns is just too ghastly for her to bear.
+</p>
+</div>
+
+<h3 class="docs" id="marking-col-start">Marking the first page column start position</h3>
+
+<p>
+If you insert or remove space after the docheader, i.e. immediately after
+<a href="#start">START</a>
+in your input file, mom needs to know where your first column begins
+in order to align subsequent columns on the first page.
+</p>
+
+<div id="col-mark" class="box-macro-args">
+Macro: <b>COL_MARK</b>
+</div>
+
+<p>
+<kbd>COL_MARK</kbd> tells mom where the first column after the
+docheader begins, in order for the top of subsequent columns on the
+first page to be aligned. Note that if you do not manually add
+or remove space after the docheader, there is no need to invoke
+<kbd>COL_MARK</kbd>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If you do add or subtract space after the docheader, e.g. with
+<a href="typesetting.html#ald">ALD</a>
+or
+<a href="typesetting.html#SP">SP</a>,
+and your
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+is something other than a multiple of &#8220;<kbd>v</kbd>&#8221;, be
+sure to follow the spacing command with
+<a href="docprocessing.html#shim">SHIM</a>
+before entering <kbd>.COL_MARK</kbd> unless shimming has been
+disabled with
+<a href="#no-shim">NO_SHIM</a>.
+If your document is being flex-spaced, do not use
+<a href="docprocessing.html#flex">FLEX</a>.
+Rather, disable flex-spacing temporarily with
+<br/>
+<span class="pre-in-pp">
+ .NO_FLEX
+ .NO_SHIM off
+ .SHIM
+ .COL_MARK
+</span>
+and re-enable it afterwards with
+<span class="pre-in-pp">
+ .NO_SHIM
+ .NO_FLEX off
+</span>
+</p>
+</div>
+
+<h3 class="docs">Using tabs when COLUMNS are enabled</h3>
+
+<p>
+Mom&#8217;s tabs (both
+<a href="typesetting.html#typesetting-tabs">typesetting tabs</a>
+and
+<a href="typesetting.html#string-tabs">string tabs</a>)
+behave as you&#8217;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.
+</p>
+
+<!-- -BREAKING COLUMNS- -->
+
+<h3 id="breaking-columns" class="docs">Breaking columns manually</h3>
+
+<p>
+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.
+</p>
+
+<div id="col-next" class="box-macro-args">
+Macro: <b>COL_NEXT</b>
+</div>
+
+<p>
+<kbd>.COL_NEXT</kbd> breaks the line just before it,
+<a href="definitions.html#quad">quads</a>
+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 &#8220;column 1&#8221; position. This is the macro to use when
+you want to start a new column after the end of a paragraph.
+</p>
+
+<div id="col-break" class="box-macro-args">
+Macro: <b>COL_BREAK</b>
+</div>
+
+<p>
+<kbd>.COL_BREAK</kbd> is almost the same as <kbd>.COL_NEXT</kbd>,
+except that instead of breaking and quadding the line preceding it,
+mom breaks and spreads it (see
+<a href="typesetting.html#spread">SPREAD</a>).
+Use this macro whenever you need to start a new column in the middle
+of a paragraph.
+</p>
+
+<div class="box-important">
+<p class="tip">
+<span class="important">Warning:</span>
+If you need COL_BREAK in the middle of a blockquote or (god help
+you) an epigraph, you must do the following in order for COL_BREAK
+to work:
+<br/>
+<span class="pre-in-pp">
+ .SPREAD
+ \!.COL_BREAK
+</span>
+</p>
+</div>
+
+<div class="rule-short"><hr/></div>
+
+<!-- ======================================================================== -->
+
+<!-- *** -->
+
+
+<h2 id="style-after-start" class="macro-group">Changing basic type and formatting parameters after START</h2>
+
+<ul id="changing-basic-type">
+ <li><a href="#behaviour">Behaviour of the typesetting macros during document processing</a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#behaviour-specific">Effect of specific typesetting macros</a></li>
+ </ul></li>
+ <li><a href="#tb-margins">Top and bottom margins in document processing</a></li>
+ <li><a href="#space">Inserting space at the top of a new page</a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#add-space">ADD_SPACE</a></li>
+ </ul></li>
+</ul>
+
+<div class="rule-medium"><hr/></div>
+
+<h3 id="behaviour" class="docs">Behaviour of the typesetting macros during document processing</h3>
+
+<p>
+During document processing, most of the
+<a href="typesetting.html#macros-typesetting">typesetting macros</a>
+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.
+</p>
+
+<p>
+Typesetting macros that alter margins and line lengths affect
+<a href="definitions.html#running">running text</a>
+globally (or at least try to), but leave headers/footers and
+footnotes alone. (To indent footnotes, see the full explanation of
+the
+<a href="docelement.html#footnote">FOOTNOTE</a>
+macro.)
+</p>
+
+<p>
+Mom&#8217;s tabs (both
+<a href="typesetting.html#typesetting-tabs">typesetting tabs</a>
+and
+<a href="typesetting.html#string-tabs">string tabs</a>)
+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
+<a href="docprocessing.html#columns">COLUMNS</a>
+are enabled, from column to column.
+</p>
+
+<p>
+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,
+<a href="definitions.html#family">family</a>,
+<a href="definitions.html#font">font</a>,
+<a href="definitions.html#ps">point size</a>,
+<a href="definitions.html#leading">leading</a>,
+and
+<a href="definitions.html#quad">quad</a>.
+</p>
+
+<p>
+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&#8217;s
+<a href="docelement.html#index-docelement">document element tags</a>.
+In other words, you need to do a bit of creative typesetting in the
+middle of a document.
+</p>
+
+<p>
+The following lists those typesetting macros whose behaviour during
+document processing requires some explanation.
+(Please refer to
+<a href="#tb-margins">Top and bottom margins in document processing</a>
+for information on how mom interprets
+<a href="typesetting.html#t-margin">T_MARGIN</a>
+and
+<a href="typesetting.html#b-margin">B_MARGIN</a>
+in document processing. Additionally, see
+<a href="#add-space">ADD_SPACE</a>
+if you encounter the problem of trying to get mom to put space at
+the tops of pages after the first.)
+</p>
+
+<div id="behaviour-specific" class="box-code" style="margin-left: 3.5%">
+<span class="pre" style="color: #302419;">
+ MACRO EFFECT DURING DOCUMENT PROCESSING
+ ----- ---------------------------------
+
+ L_MARGIN &bull;The left margin of all running text
+ assumes the new value.
+
+ &bull;The line length remains unaltered.
+
+ &bull;The header and footer left margin
+ remain at the current document default.
+
+ (You won&#8217;t use this often by itself. Most
+ likely, you&#8217;ll use it in combination with
+ R_MARGIN or LL.)
+
+ R_MARGIN &bull;The right margin of all running text
+ assumes the new value. In other words,
+ the line length is altered.
+
+ &bull;The header and footer right margin
+ remain at the current document default.
+
+ LL &bull;The line length of all running text
+ is set to the new value.
+
+ &bull;The header and footer line length remain
+ at the current document default.
+
+ FAMILY &bull;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 &bull;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. &mdash; \*[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 &bull;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 &bull;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&#8217;t align with the
+ bottom margin of subsequent pages. You&#8217;ll
+ need to use the SHIM or FLEX macro to get mom back
+ on track when you&#8217;re ready to return to the
+ document&#8217;s default leading.
+
+ <a id="autolead" style="margin-top: -1em">AUTOLEAD</a> &bull;Invoked before START, sets the overall document
+ leading as a function of the overall document
+ point size (i.e. the point size used in paragraphs);
+ subsequently disabled after START, except for calls
+ to DOC_PT_SIZE
+
+ &bull;DOC_LEAD before DOC_PT_SIZE cancels the AUTOLEAD
+ set before START
+
+ &bull;Invoked after START, remains in effect for all
+ subsequent point size changes made with PT_SIZE,
+ but does not affect the leading of the document
+ element tags (e.g. HEADING, PP, QUOTE...), or calls
+ to DOC_PT_SIZE
+
+ QUAD &bull;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. &mdash; Line-for-line quadding macros
+ (LEFT, CENTER, RIGHT) are also temporary,
+ overridden by the QUAD value of any subsequent
+ document element tag.
+</span>
+</div>
+
+<h3 id="tb-margins" class="docs" style="margin-top: 1.5em;">Top and bottom margins in document processing</h3>
+
+<p>
+Normally, mom establishes the top and bottom
+margins of
+<a href="definitions.html#running">running text</a>
+in documents from the values of <b>HEADER_MARGIN +
+HEADER_GAP</b> and <b>FOOTER_MARGIN + FOOTER_GAP</b>
+respectively. However, if you invoke
+<a href="typesetting.html#t-margin">T_MARGIN</a>
+or
+<a href="typesetting.html#b-margin">B_MARGIN</a>
+either before or after
+<a href="docelement.html#start">START</a>,
+they set the top and bottom margins of running text irrespective of
+HEADER_GAP and FOOTER_GAP.
+</p>
+
+<p>
+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
+<a href="definitions.html#header">headers</a>,
+<a href="definitions.html#footer">footers</a>,
+or page numbers.
+</p>
+
+<!-- ==================================================================== -->
+
+<h3 id="space" class="docs">Inserting space at the top of a new page</h3>
+
+<p>
+Occasionally, you may want to insert space before the start of
+<a href="definitions.html#running">running text</a>
+on pages after the first.
+</p>
+
+<p>
+You might have tried using
+<a href="typesetting.html#ald">ALD</a>
+or
+<a href="typesetting.html#space">SPACE</a>
+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.
+</p>
+
+<p>
+If you need the space, you must use the macro ADD_SPACE in
+conjunction with
+<a href="typesetting.html#newpage">NEWPAGE</a>.
+</p>
+
+<!-- -ADD_SPACE- -->
+
+<div class="macro-id-overline">
+<h3 id="add-space" class= "macro-id">ADD_SPACE/RESTORE_SPACE</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>ADD_SPACE</b> <kbd class="macro-args">&lt;amount of space&gt;</kbd>
+<br/>
+Macro: <b>RESTORE_SPACE</b>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+If your
+<a href="#doctype">DOCTYPE</a>
+is DEFAULT, CHAPTER, NAMED, or LETTER, ADD_SPACE takes as its
+single argument the distance you want mom to advance from the normal
+baseline position at the top of any page <i>after the first</i> (i.e.
+the one on which the docheader is normally printed). A
+<a href="definitions.html#unitofmeasure">unit of measure</a> is
+required.
+</p>
+
+<p>
+For example, say you wanted to insert 2 inches of space before the
+start of
+<a href="definitions.html#running">running text</a>
+on a page other than the first. You&#8217;d accomplish it with
+<br/>
+<span class="pre-in-pp">
+ .NEWPAGE
+ .ADD_SPACE 2i
+</span>
+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.
+</p>
+
+<p>
+Since adding space in this way is almost sure to disrupt mom&#8217;s
+ability to guarantee perfectly flush bottom margins, I highly
+recommend using the
+<a href="docprocessing.html#shim">SHIM</a>
+or
+<a href="docprocessing.html#flex">FLEX</a>
+macro immediately after ADD_SPACE, which will add the space plus
+whatever correction is required by the
+<a href="docprocessing.html#vertical-whitespace-management">vertical whitespace management</a>
+strategy in effect.
+</p>
+
+<p>
+If your
+<a href="#doctype">DOCTYPE</a>
+is SLIDES, ADD_SPACE may be used on any slide <i>including the
+first</i> to introduce additional white space at the top.
+</p>
+
+<h4 class="docs doc-param-macros" style="margin-top: .5em">RESTORE_SPACE</h4>
+
+<p style="margin-top: .5em">
+You may sometimes find that mom refuses to respect
+<a href="typesetting.html#space">SP</a>,
+<a href="typesetting.html#index-aldrld">ALD/RLD</a>,
+<a href="docprocessing.html#shim">SHIM</a>,
+or
+<a href="docprocessing.html#flex">FLEX</a>
+after the first element (line of text, floated material) output
+at the top of a page. Should this happen, insert the macro
+RESTORE_SPACE before issuing the spacing command.
+</p>
+
+<!-- *** -->
+
+<h2 id="intro-doc-param" class="macro-group">Changing document-wide typesetting parameters after START</h2>
+
+<p>
+In the normal course of things, you establish the basic type style
+parameters of a document prior to invoking
+<a href="#start">START</a>,
+using the
+<a href="typesetting.html#macros-typesetting">typesetting macros</a>
+(<b>L_MARGIN, FAMILY, PT_SIZE, LS,</b> etc). After START, you must
+use the following macros if you wish to make global changes to the
+basic type style parameters, for example changing the overall leading or
+the justification style.
+</p>
+
+<div class="box-important">
+<p class="tip">
+<span class="important">Important:</span>
+Because these macros globally update the chosen parameter, they
+should only be used immediately prior to
+<a href="rectoverso.html#collate">COLLATE</a>
+or, if an occasional effect is desired,
+<a href="typesetting.html#newpage">NEWPAGE</a>.
+<a href="#doc-pt-size">DOC_PT_SIZE</a>,
+for example, updates the point size of every page element, including
+headers, footers, page numbers, and so on, which is almost certainly
+not what you want in the middle of a page.
+</p>
+</div>
+
+<div class="macro-list-container">
+<h3 id="index-doc-param" class="macro-list">Post-START global style change macros</h3>
+<ul class="macro-list">
+ <li><a href="#doc-left-margin">DOC_LEFT_MARGIN</a></li>
+ <li><a href="#doc-right-margin">DOC_RIGHT_MARGIN</a></li>
+ <li><a href="#doc-line-length">DOC_LINE_LENGTH</a></li>
+ <li><a href="#doc-family">DOC_FAMILY</a></li>
+ <li><a href="#doc-pt-size">DOC_PT_SIZE</a></li>
+ <li><a href="#doc-lead">DOC_LEAD</a></li>
+ <li><a href="#doc-lead-adjust">DOC_LEAD_ADJUST</a></li>
+ <li><a href="#doc-quad">DOC_QUAD</a></li>
+</ul>
+</div>
+
+<!-- -DOC_LEFT_MARGIN -->
+
+<div class="macro-id-overline">
+<h3 id="doc-left-margin" class="macro-id">DOC_LEFT_MARGIN</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>DOC_LEFT_MARGIN</b> <kbd class="macro-args">&lt;left margin&gt;</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<h4 class="docs doc-param-macros">Arguments and behaviour</h4>
+
+<ul class="doc-param-macros">
+ <li>the argument is the same as for
+ <a href="typesetting.html#l-margin">L_MARGIN</a>
+ </li>
+ <li>changes all left margins, including headers, footers, and page
+ numbers to the new value
+ </li>
+ <li>any document elements that use a left indent calculate
+ the indent from the new value
+ </li>
+ <li>the line length remains the same (i.e., the right margin
+ shifts when you change the left margin)
+ </li>
+</ul>
+
+<!-- -DOC_RIGHT_MARGIN -->
+
+<div class="macro-id-overline">
+<h3 id="doc-right-margin" class="macro-id">DOC_RIGHT_MARGIN</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>DOC_RIGHT_MARGIN</b> <kbd class="macro-args">&lt;right margin&gt;</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<h4 class="docs doc-param-macros">Arguments and behaviour</h4>
+
+<ul class="doc-param-macros">
+ <li>the argument is the same as for
+ <a href="typesetting.html#r-margin">R_MARGIN</a>
+ </li>
+ <li>changes all right margins, including headers, footers, and
+ page numbers to the new value;
+ </li>
+ <li>any document elements that use a right indent calculate
+ the indent from the new value
+ </li>
+</ul>
+
+<!-- -DOC_RIGHT_MARGIN -->
+
+<div class="macro-id-overline">
+<h3 id="doc-line-length" class="macro-id">DOC_LINE_LENGTH</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>DOC_LINE_LENGTH</b> <kbd class="macro-args">&lt;length&gt;</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<h4 class="docs doc-param-macros">Arguments and behaviour</h4>
+
+<ul class="doc-param-macros">
+ <li>the argument is the same as for
+ <a href="typesetting.html#linelength">LL</a>
+ </li>
+ <li>exactly equivalent to changing the right margin with
+ DOC_RIGHT_MARGIN (see
+ <a href="#doc-right-margin">above</a>);
+ </li>
+</ul>
+
+<!-- -DOC_FAMILY- -->
+
+<div class="macro-id-overline">
+<h3 id="doc-family" class="macro-id">DOC_FAMILY</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>DOC_FAMILY</b> <kbd class="macro-args">&lt;family&gt;</kbd>
+</div>
+
+<h4 class="docs doc-param-macros" style="margin-top: 1em;">Arguments and behaviour</h4>
+
+<ul class="doc-param-macros">
+ <li>the argument is the same as for
+ <a href="typesetting.html#family">FAMILY</a>
+ </li>
+ <li>globally changes the type family for
+ <ul>
+ <li style="margin-left: -.5em;">the <a href="definitions.html#docheader">docheader</a></li>
+ <li style="margin-left: -.5em;">all <a href="docelement.html#index-docelement">document element tags</a>, including footnotes</li>
+ <li style="margin-left: -.5em;"><a href="definitions.html#header">headers and/or footers</a></li>
+ <li style="margin-left: -.5em;"><a href="docelement.html#number-lines-intro">line numbering</a></li>
+ <li style="margin-left: -.5em;"><a href="headfootpage.html#pagination">page numbering</a></li>
+ </ul></li>
+ <li>does <i>not</i> change the family of
+ <ul>
+ <li><a href="cover.html#doc-cover">document cover pages</a></li>
+ <li><a href="cover.html#cover">cover pages</a></li>
+ <li><a href="docelement.html#endnote-intro">endnotes pages</a></li>
+ <li><a href="docelement.html#toc-intro">table of contents</a></li>
+ </ul></li>
+ <li>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
+ <a href="docelement.html#docelement-control">control macros</a>
+ </li>
+</ul>
+
+<!-- -DOC_PT_SIZE- -->
+
+<div class="macro-id-overline">
+<h3 id="doc-pt-size" class="macro-id">DOC_PT_SIZE</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>DOC_PT_SIZE</b> <kbd class="macro-args">&lt;point size&gt;</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Does not require a <a href="definitions.html#unitofmeasure">unit of measure</a>; points is assumed
+</p>
+
+<h4 class="docs doc-param-macros">Arguments and behaviour</h4>
+
+<ul class="doc-param-macros">
+ <li>the argument is the same as for
+ <a href="typesetting.html#ps">PT_SIZE</a>,
+ and refers to the point size of type in paragraphs
+ </li>
+ <li>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)
+ </li>
+ <li>if
+ <a href="typesetting.html#autolead">AUTOLEAD</a>
+ was invoked before START; the value of AUTOLEAD will be used
+ to update the leading of all document element tags except
+ FOOTNOTE and EPIGRAPH
+ </li>
+</ul>
+
+<!-- -DOC_LEAD- -->
+
+<div class="macro-id-overline">
+<h3 id="doc-lead" class="macro-id">DOC_LEAD</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>DOC_LEAD</b> <kbd class="macro-args">&lt;points&gt; [ ADJUST ]</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Does not require a <a href="definitions.html#unitofmeasure">unit of measure</a>; points is assumed
+</p>
+
+<h4 class="docs doc-param-macros">Arguments and behaviour</h4>
+
+<ul class="doc-param-macros">
+ <li>the argument is the same as for
+ <a href="typesetting.html#leading">LS</a>,
+ and refers to the
+ <a href="definitions.html#lead">leading</a>
+ of paragraphs
+ </li>
+ <li>because paragraphs will have a new leading, the leading and
+ spacing of most running text is influenced by the new value
+ </li>
+ <li>epigraphs and footnotes remain unaffected;
+ if you wish to change their leading, use
+ <a href="docelement.html#epigraph-autolead">EPIGRAPH_AUTOLEAD</a>
+ and
+ <a href="docelement.html#footnote-autolead">FOOTNOTE_AUTOLEAD</a>.
+ </li>
+ <li>the optional argument <kbd>ADJUST</kbd> performs
+ leading adjustment as explained in
+ <a href="#doc-lead-adjust">DOC_LEAD_ADJUST</a>
+ </li>
+ <li>if
+ <a href="typesetting.html#autolead">AUTOLEAD</a>
+ was invoked before START; the value of that AUTOLEAD will be
+ cancelled
+ </li>
+</ul>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Even if you don&#8217;t pass DOC_LEAD the optional argument
+<kbd>ADJUST</kbd>, mom will still adjust the leading of endnotes
+pages and toc pages. See
+<a href="docelement.html#endnote-lead">ENDNOTE_LEAD</a>
+and
+<a href="docelement.html#toc-lead">TOC_LEAD</a>
+for an explanation of how to disable this default behaviour.
+</p>
+</div>
+
+<!-- -DOC_QUAD- -->
+
+<div class="macro-id-overline">
+<h3 id="doc-quad" class="macro-id">DOC_QUAD</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>DOC_QUAD</b> <kbd class="macro-args">L | R | C | J</kbd>
+</div>
+
+<h4 class="docs doc-param-macros" style="margin-top: 1em;">Arguments and behaviour</h4>
+
+<ul class="doc-param-macros">
+ <li>the arguments are the same as for
+ <a href="typesetting.html#quad">QUAD</a>
+ </li>
+ <li>affects paragraphs, epigraphs and footnotes; does not
+ affect blockquotes
+ </li>
+</ul>
+
+<h2 id="terminating" class="macro-group">Terminating a document</h2>
+
+<p>
+You need do nothing special to terminate a document. When groff
+finishes processing the last
+<a href="definitions.html#inputline">input line</a>
+of a file, the page is ejected, subject to whatever routines are
+needed to complete it (e.g. printing footnotes or adding the page
+number).
+</p>
+
+<p>
+It happens sometimes, however, that a last line of
+<a href="definitions.html#running">running text</a>,
+falling on or very near the bottom of the page, tricks groff into
+breaking to a new page before terminating. The result is a blank
+page at the end of the formatted document.
+</p>
+
+<p>
+The situation is rare, generally occurring only when some additional
+macro is required after the input text, e.g. to exit a
+<a href="docelement.html#list-intro">list</a>
+or terminate a
+<a href="docelement.html#quote">quote</a>.
+To prevent it from ever happening, I recommend getting into the habit
+of following the final input line of all your mom files with
+<a href="typesetting.html#el"><kbd>.EL</kbd></a>.
+Depending on the
+<a href="definitions.html#filled">fill mode</a>
+in effect, you may also have to append the &#8220;join line&#8221;
+<a href="definitions.html#inlines">escape</a>,
+<kbd>\c</kbd>, to the final line.</p>
+
+<p>
+Thus, for normal text at the end of a paragraph, which is in fill
+mode,
+<br/>
+<span class="pre-in-pp">
+ and they all lived happily ever after.
+ .EL
+</span>
+or for ending a
+<a href="docelement.html#list-intro">LIST</a>
+(also in fill mode)
+<span class="pre-in-pp">
+ .ITEM
+ peaches, pears, plums
+ .EL
+ .LIST OFF
+</span>
+whereas, at the end of a
+<a href="docelement.html#quote-intro">QUOTE</a>
+(which is in nofill mode),
+<span class="pre-in-pp">
+ Shall be lifted\[em]nevermore!\c
+ .EL
+ .QUOTE OFF
+</span>
+Notice that the <kbd>.EL</kbd> comes after the last line of input
+text, not any macros following.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+<a href="inlines.html#b"><kbd><span class="nobr">\*[B]</span></kbd></a>
+cannot be used as a replacement for <kbd>.EL</kbd> when terminating
+a document.
+</p>
+</div>
+
+<!-- Navigation links -->
+<table style="width: 100%; margin-top: 12px;">
+<tr>
+ <td style="width: 33%;"><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="width: 24%; text-align: center;"><a href="#top">Top</a></td>
+ <td style="width: 43%; text-align: right;"><a href="docelement.html#top">Next: The document element tags</a></td>
+</tr>
+</table>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/momdoc/goodies.html b/contrib/mom/momdoc/goodies.html
new file mode 100644
index 0000000..7c39e14
--- /dev/null
+++ b/contrib/mom/momdoc/goodies.html
@@ -0,0 +1,1785 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>Mom -- Goodies</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div id="top" class="page">
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+<tr>
+ <td><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="text-align: right;"><a href="inlines.html#top">Next: Inline escapes</a></td>
+</tr>
+</table>
+
+<h1 id="goodies" class="docs">Goodies</h1>
+
+<p>
+The macros in this section are a collection of useful (and sometimes
+nearly indispensable) routines to simplify typesetting.
+</p>
+
+<div id="goodies-macros-mini-toc" style="margin-top: -1em; font-size: 95%;">
+<div class="mini-toc-col-1">
+<ul class="no-enumerator">
+<li class="list-head-goodies"><a href="#alias">ALIAS</a> <span class="normal-smaller">&ndash; rename macros</span></li>
+<li class="list-head-goodies"><a href="#caps">CAPS</a> <span class="normal-smaller">&ndash; convert to upper case</span></li>
+<li class="list-head-goodies"><a href="#center-block">CENTER_BLOCK</a> <span class="normal-smaller">&ndash; centre blocks of type with quad intact</span></li>
+<li class="list-head-goodies"><a href="#esc-char">ESC_CHAR</a> <span class="normal-smaller">&ndash; change the escape character to something other than a backslash</span></li>
+<li class="list-head-goodies"><a href="#hang">HANG</a> <span class="normal-smaller">&ndash; hang character(s) outside right margin (inline escape)</span></li>
+<li class="list-head-goodies"><a href="#left-hang">LEFT_HANG</a> <span class="normal-smaller">&ndash; hang character(s) outside left margin</span></li>
+<li class="list-head-goodies"><a href="#silent">SILENT</a> <span class="normal-smaller">&ndash; hide input lines from output</span></li>
+<li class="list-head-goodies"><a href="#sizespecs">SIZESPECS</a> <span class="normal-smaller">&ndash; get cap-height, x-height and descender depth of a font</span></li>
+<li class="list-head-goodies"><a href="#smartquotes">SMARTQUOTES</a> <span class="normal-smaller">&ndash; convert typewriter doublequotes to proper doublequotes</span></li>
+<li class="list-head-goodies"><a href="#string">STRING</a> <span class="normal-smaller">&ndash; user-definable strings</span></li>
+<li class="list-head-goodies"><a href="#trap">TRAP</a> <span class="normal-smaller">&ndash; suspend/re-invoke traps</span></li>
+<li class="list-head-goodies no-anchor"><span style="font-size: 90%;">Underscoring/underlining</span>
+<ul class="sublist">
+ <li class="list-head-goodies text-color"><a href="#underscore">UNDERSCORE</a> <span class="normal-smaller">&ndash; single underscore</span>
+ <ul class="sublist sub">
+ <li class="list-head-goodies text-color"><a href="#underscore-weight">Controlling the weight of underscores</a></li>
+ <li class="list-head-goodies text-color"><a href="#underscore-color">Colourising underscores</a></li>
+ </ul></li>
+ <li class="list-head-goodies text-color"><a href="#underscore2">UNDERSCORE2</a> <span class="normal-smaller">&ndash; double underscore</span></li>
+ <li class="list-head-goodies text-color"><a href="#underline">UNDERLINE</a>
+ <ul class="sublist sub">
+ <li class="list-head-goodies text-color"><a href="#ul">\*[UL]</a> <span class="normal-sub-sub">&ndash; inline escape to underline</span></li>
+ </ul></li>
+</ul></li>
+<li class="list-head-goodies no-anchor"><span style="font-size: 90%;">Padding</span>
+<ul class="sublist">
+ <li class="list-head-goodies text-color"><a href="#pad">PAD</a> <span class="normal-smaller">&ndash; insert equalized whitespace into lines</span>
+ <ul class="sublist sub">
+ <li class="list-head-goodies text-color"><a href="#pad-marker">PAD_MARKER</a> <span class="normal-sub-sub">&ndash; change/set the marker used with PAD</span></li>
+ </ul></li>
+</ul></li>
+</ul>
+</div>
+<div class="mini-toc-col-2">
+<ul class="no-enumerator">
+<li class="list-head-goodies no-anchor"><span style="font-size: 90%;">Leaders</span>
+<ul class="sublist">
+ <li class="list-head-goodies text-color"><a href="#leader">\*[LEADER]</a> <span class="normal-smaller">&ndash; inline escape to add leaders to a line</span></li>
+ <li class="list-head-goodies text-color"><a href="#leader-character">LEADER_CHARACTER</a> <span class="normal-smaller">&ndash; change/set the leader character</span></li>
+</ul></li>
+<li class="list-head-goodies no-anchor"><span style="font-size: 90%;">Drop caps</span>
+<ul class="sublist">
+ <li class="list-head-goodies text-color"><a href="#dropcap">DROPCAP</a> <span class="normal-smaller">&ndash; set a drop cap</span></li>
+ <li class="list-head-goodies text-color" style="list-style-type: none;"><a href="#dropcap-support"><span class="normal-smaller" style="font-weight: bold;">Support macros for DROPCAP</span></a>
+ <ul class="sublist sub">
+ <li class="list-head-goodies text-color"><a href="#dropcap-family">DROPCAP_FAMILY</a> <span class="normal-sub-sub">&ndash; change drop cap family</span></li>
+ <li class="list-head-goodies text-color"><a href="#dropcap-font">DROPCAP_FONT</a> <span class="normal-sub-sub">&ndash; change drop cap font</span></li>
+ <li class="list-head-goodies text-color"><a href="#dropcap-adjust">DROPCAP_ADJUST</a> <span class="normal-sub-sub">&ndash; alter size of drop cap</span></li>
+ <li class="list-head-goodies text-color"><a href="#dropcap-color">DROPCAP_COLOR</a> <span class="normal-sub-sub">&ndash; change colour of drop cap</span></li>
+ <li class="list-head-goodies text-color"><a href="#dropcap-gutter">DROPCAP_GUTTER</a> <span class="normal-sub-sub">&ndash; change space between drop cap and running text</span></li>
+ </ul></li>
+</ul></li>
+<li class="list-head-goodies text-color no-anchor"><span style="font-size: 90%;">Superscripts</span>
+<ul class="sublist">
+ <li class="list-head-goodies text-color"><a href="#sup">\*[SUP]</a> <span class="normal-smaller">&ndash; inline escape to set superscripts</span>
+ <ul class="sublist sub">
+ <li class="list-head-goodies text-color"><a href="#sup-raise">SUPERSCRIPT_RAISE_AMOUNT</a> <span class="normal-sub-sub">(control superscript raise amount</span></li>
+ <li class="list-head-goodies text-color"><a href="#cond-or-ext-sup">\*[CONDSUP]</a> <span class="normal-sub-sub">&ndash; condensed superscripts</span></li>
+ <li class="list-head-goodies text-color"><a href="#cond-or-ext-sup">\*[EXTSUP]</a> <span class="normal-sub-sub">&ndash; extended superscripts</span></li>
+ </ul></li>
+</ul></li>
+</ul>
+</div>
+</div>
+
+<div class="rule-medium" style="padding-bottom: 1em;"><hr/></div>
+
+<!-- -ALIAS- -->
+
+<div class="macro-id-overline">
+<h3 id="alias" class="macro-id">Rename macros</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>ALIAS</b> <kbd class="macro-args">&lt;new name&gt; &lt;old name&gt;</kbd>
+</div>
+
+<p>
+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).
+</p>
+
+<p>
+Groff has always been a bit intimidating for new users because
+its standard macro packages use very terse macro names. Mom
+doesn&#8217;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&#8217;t what you automatically think of when you want to
+do a particular thing, or might conflict with habits you&#8217;ve
+developed over the years.
+</p>
+
+<p>
+If you don&#8217;t like one of mom&#8217;s macro names, say,
+PAGEWIDTH, change it, like this:
+<br/>
+<span class="pre-in-pp">
+ .ALIAS PW PAGEWIDTH
+ | |
+ new--+ +--official
+ name name
+</span>
+The first argument to ALIAS is the new name you want for a macro.
+The second is the &#8220;official&#8221; name by which the macro is
+normally invoked. After ALIAS, either can be used.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="tip">Tip:</span>
+A particularly good candidate for ALIAS is the macro
+<a href="typesetting.html#ps">PT_SIZE</a>.
+A more natural name for it would simply be PS, but PS conflicts
+with the <b>eqn</b> equation preprocessor and thus mom uses the
+longer form. However, if you&#8217;re not using <b>eqn</b>, you can
+happily rename PT_SIZE to
+PS:
+<br/>
+<span class="pre-in-pp">
+ .ALIAS PS PT_SIZE
+</span>
+</p>
+</div>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If you use ALIAS a lot, and always for the same things, consider
+creating an aliases file of the form
+<br/>
+<span class="pre-in-pp">
+ .ALIAS &lt;new name&gt; &lt;old name&gt;
+ .ALIAS &lt;new name&gt; &lt;old name&gt;
+ .ALIAS &lt;new name&gt; &lt;old name&gt;
+ ...etc
+</span>
+Put the file someplace convenient and source it (include it) at the
+beginning of your documents with the
+<a href="docprocessing.html#include">INCLUDE</a>
+macro. Assuming that you&#8217;ve created an aliases file called
+<b>mom-aliases</b> in your home directory under a directory called
+<b>Mom</b>, you&#8217;d source it by placing
+<br/>
+<span class="pre-in-pp">
+ .INCLUDE /home/&lt;username&gt;/Mom/mom-aliases
+</span>
+at the top of your documents.
+</p>
+
+<p class="tip-bottom">
+If you share documents that make use of an alias file, remember that
+other people don&#8217;t have the file. Paste the whole thing at
+the top of your documents, please.
+</p>
+</div>
+
+<div class="box-tip">
+<p class="tip">
+<span class="experts">Experts:</span>
+ALIAS is an alias of <kbd>.als</kbd>. You can use either, or mix
+&#8217;n&#8217; match with impunity.
+</p>
+</div>
+
+<!-- -SILENT- -->
+<div class="macro-id-overline">
+<h3 id="silent" class="macro-id">Hide input lines from output</h3>
+</div>
+
+<div class="box-macro-args">
+ Macro: <b>SILENT</b> <kbd class="macro-args">toggle</kbd>
+</div>
+
+<p class="alias" style="margin-bottom: 0;">
+<i>Alias:</i> <b>COMMENT</b>
+</p>
+
+<p>
+Sometimes, you want to &#8220;hide&#8221;
+<a href="definitions.html#inputline">input lines</a>
+from final output. This is most likely to be the case when setting
+up string tabs (see the
+<a href="typesetting.html#string-tabs-tut">quickie tutorial on string tabs</a>
+for an example), but there are other places where you might want
+input lines to be invisible as well. Any place you don&#8217;t want
+input lines to appear in the output, use the SILENT macro.
+</p>
+
+<p>
+SILENT is a toggle. Invoking it without an argument turns it on;
+any argument turns it off. E.g.,
+<br/>
+<span class="pre-in-pp">
+ .SILENT
+ A line of text
+ .SILENT OFF
+</span>
+The line &#8220;A line of text&#8221; will not appear in the
+output copy.
+</p>
+
+<p>
+SILENT is aliased as COMMENT. If you want to insert non-printing
+comments into your documents, you may prefer this.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="tip">Tip:</span>
+SILENT does not automatically break an
+<a href="definitions.html#inputline">input line</a>
+(see
+<a href="typesetting.html#br">BR</a>)
+when you&#8217;re in one of the
+<a href="definitions.html#filled">fill modes</a>
+(<a href="typesetting.html#justify">JUSTIFY</a>
+or
+<a href="typesetting.html#quad">QUAD&nbsp;L&nbsp;|&nbsp;R&nbsp;|&nbsp;C&nbsp;|&nbsp;J</a>).
+The same applies to tabs
+(<a href="typesetting.html#tab-set">typesetting</a>
+or
+<a href="typesetting.html#st">string</a>)
+to which you&#8217;ve passed the J or QUAD argument. You must
+insert <kbd>.BR</kbd> yourself, or risk a portion of your text
+disappearing into a black hole.
+</p>
+</div>
+
+<!-- -TRAP- -->
+
+<div class="macro-id-overline">
+<h3 id="trap" class="macro-id">Suspend / re-invoke traps</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>TRAP</b> <kbd class="macro-args">toggle</kbd>
+</div>
+
+<p>
+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
+behind-the-scenes processing is needed in order for one page to
+finish and another to start.
+</p>
+
+<p>
+Sometimes, traps get sprung when you don&#8217;t want them. If this
+happens, surround just the offending macros and input lines with
+<br/>
+<span class="pre-in-pp">
+ .TRAP OFF
+ ...
+ .TRAP
+</span>
+TRAP is a toggle, therefore any argument turns it off (i.e., suspends
+the trap), and no argument turns it (back) on.
+</p>
+
+<!-- -SMARTQUOTES- -->
+
+<div class="macro-id-overline">
+<h3 id="smartquotes" class="macro-id">Convert typewriter doublequotes to proper doublequotes</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>SMARTQUOTES</b> <kbd class="macro-args">[&lt;off&gt;] [ ,, | &gt;&gt; | &lt;&lt; ]</kbd>
+</div>
+
+<span style="margin-left: .5em">or</span>
+
+<div class="box-macro-args">
+Macro: <b>SMARTQUOTES</b> <kbd class="macro-args">DA | DE | ES | FR | IT | NL | NO | PT | SV</kbd>
+</div>
+
+<p>
+If you invoke SMARTQUOTES without an argument, mom converts all
+instances of the inch-mark, (<kbd>"</kbd>), also called
+a doublequote, into the appropriate instances of true Anglo-American
+open-and close-doublequotes. (See
+<a href="#sq-international">Internationalization</a>
+for how to get SMARTQUOTES to behave correctly for non-English
+quoting styles.)
+</p>
+
+<p>
+Typographically, there is a difference between the inch-mark and
+quotation marks&mdash;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&#8217;t want to look like an amateur, do you?
+</p>
+
+<h3 id="sq-international" class="docs">Internationalization</h3>
+<p>
+If you invoke SMARTQUOTES with one of the optional arguments
+(<kbd>,,</kbd> or <kbd>&gt;&gt;</kbd>
+or <kbd>&lt;&lt;</kbd>) you can use
+<kbd>&quot;</kbd> (i.e. the inch-mark/doublequotes key)
+as &#8220;cheap&#8221; 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.
+</p>
+
+<p>
+<kbd>,,</kbd> opens quotes with &#8220;lowered
+doublequotes&#8221; and closes them with &#8220;raised
+doublequotes&#8221;, as in this ascii approximation:
+<br/>
+<span class="pre-in-pp">
+ ,,Hilfe !``
+</span>
+
+<kbd>&gt;&gt;</kbd> opens quotes with guillemets
+pointing to the right, and closes them with guillemets pointing to
+the left, as in this ascii approximation:
+<br/>
+<span class="pre-in-pp">
+ &gt;&gt;Zurück !&lt;&lt;
+</span>
+<kbd>&lt;&lt;</kbd> opens quotes with guillemets
+pointing to the left, and closes them with guillemets pointing to
+the right, as in this ascii approximation:
+<br/>
+<span class="pre-in-pp">
+ &lt;&lt;Mais monsieur! Je ne suis pas ce genre de fille!&gt;&gt;
+</span>
+Please note: the above arguments to SMARTQUOTES are literal
+ASCII characters. <kbd>,,</kbd> is two commas;
+<kbd>&lt;&lt;</kbd> is two less-than signs;
+<kbd>&gt;&gt;</kbd> is two greater-than signs.
+</p>
+
+<p>
+Alternatively, you can pass SMARTQUOTES the two-letter, ISO 639
+abbreviation for the language you&#8217;re writing in, and mom will
+output the correct quotes.
+<br/>
+<span class="pre-in-pp">
+ .SMARTQUOTES DA = Danish &gt;&gt;text&lt;&lt;
+ .SMARTQUOTES DE = German ,,text``
+ .SMARTQUOTES ES = Spanish ``text´´
+ .SMARTQUOTES FR = French &lt;&lt; text &gt;&gt;
+ .SMARTQUOTES IT = Italian &lt;&lt; text &gt;&gt;
+ .SMARTQUOTES NL = Dutch ´´text´´
+ .SMARTQUOTES NO = Norwegian &lt;&lt;text&gt;&gt;
+ .SMARTQUOTES PT = Portuguese &lt;&lt;text&gt;&gt;
+ .SMARTQUOTES SV = Swedish &gt;&gt;text&gt;&gt;
+</span>
+</p>
+
+<p>
+Turn SMARTQUOTES off by passing it any argument not in the argument
+list (e.g. <kbd>OFF</kbd>, <kbd>QUIT</kbd>, <kbd>X</kbd>, etc)
+</p>
+
+<p>
+If you&#8217;re using the
+<a href="docprocessing.html#docprocessing">document processing macros</a>
+with
+<a href="docprocessing.html#printstyle">PRINTSTYLE&nbsp;TYPESET</a>,
+smartquotes are on by default (in the Anglo-American style); with
+<a href="docprocessing.html#printstyle">PRINTSTYLE&nbsp;TYPEWRITE</a>,
+it&#8217;s off by default (and should probably stay that way).
+</p>
+
+<p>
+Finally, if you&#8217;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&#8217;s native
+<a href="definitions.html#inlines">inline escapes</a>
+for special characters (see <kbd>man&nbsp;groff-char</kbd>
+for a complete list of special characters). Entering quote marks
+this way allows you to use mom&#8217;s
+<a href="inlines.html#inline-kerning-mom">inline kerning escapes</a>
+to fine-tune the look of quotes.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+SMARTQUOTES does not work on single quotes, which most people
+input with the apostrophe (found at the right-hand end of the
+&#8220;home row&#8221; 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. Here&#8217;s an example of correct input copy with
+single quotes:
+<br/>
+<span class="pre-in-pp">
+ "But she said, `I don&#8217;t want to!'"
+</span>
+</p>
+
+<p class="tip-bottom" style="margin-top: -1em;">
+<span class="additional-note">Additional note:</span>
+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
+<a href="definitions.html#inlines">inline escapes</a>
+<kbd><span class="nobr">\*[FOOT]</span></kbd> and
+<kbd><span class="nobr">\*[INCH]</span></kbd>, instead of
+<kbd>'</kbd> and <kbd>"</kbd>.
+</p>
+</div>
+
+<!-- -CAPS- -->
+
+<div class="macro-id-overline">
+<h3 id="caps" class="macro-id">Convert to upper case</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>CAPS</b> <kbd class="macro-args">toggle</kbd>
+</div>
+
+<p>
+CAPS converts all lower case letters to upper case.
+Primarily, it&#8217;s a support macro used by the
+<a href="docprocessing.html#docprocessing">document processing macros</a>,
+but you may find it helpful on occasion. CAPS is a toggle, therefore
+no argument turns it on, any argument (<kbd>OFF</kbd>,
+<kbd>QUIT</kbd>, <kbd>X</kbd>, etc) turns it off.
+<br/>
+<span class="pre-in-pp">
+ .CAPS
+ All work and no play makes Jack a dull boy.
+ .CAPS OFF
+</span>
+
+produces, on output
+<br/>
+<span class="pre-in-pp">
+ ALL WORK AND NO PLAY MAKES JACK A DULL BOY.
+</span>
+If you wish to capitalise a section of type inline, use the
+<a href="definitions.html#inlines">inline escapes</a>,
+<a href="inlines.html#uc-lc"><kbd><span class="nobr">\*[UC]...\*[LC]</span></kbd></a>
+like this:
+<br/>
+<span class="pre-in-pp">
+ All work \*[UC]and\*[LC] no play makes Jack a dull boy.
+</span>
+
+The above produces, on output
+<br/>
+<span class="pre-in-pp">
+ All work AND no play makes Jack a dull boy.
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+<kbd>\*[LC]</kbd> must come after a terminating period.
+<br/>
+<span class="pre-in-pp">
+ \*[UC]All work and no play makes Jack a dull boy.\*[LC]
+</span>
+not
+<span class="pre-in-pp">
+ \*[UC]All work and no play makes Jack a dull boy\*[LC].
+</span>
+Conversely, an initial period must come <em>before</em>
+<kbd>\*[UC]</kbd>, or be preceded by <kbd>\&amp;</kbd>, like this:
+<br/>
+<span class="pre-in-pp">
+ .\*[UC]start\*[LC] is used to begin document processing.
+</span>
+or
+<span class="pre-in-pp">
+ \*[UC]\&amp;.start\*[LC] is used to begin document processing.
+</span>
+Upon output, either will produce
+<br/>
+<span class="pre-in-pp">
+ START is used to begin document processing.
+</span>
+</p>
+</div>
+
+<!-- -STRING- -->
+
+<div class="macro-id-overline">
+<h3 id="string" class="macro-id">User-defined strings</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>STRING</b> <kbd class="macro-args">&lt;name&gt; &lt;what you want in the string&gt;</kbd>
+</div>
+
+<p>
+You may find sometimes that you have to type out portions of text
+repeatedly. If you&#8217;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.
+</p>
+
+<p>
+For example, say you&#8217;re creating a document that repeatedly uses
+the phrase &#8220;the Montreal/Windsor corridor&#8221;. Instead
+of typing all that out every time, you could define a string, like
+this:
+<br/>
+<span class="pre-in-pp">
+ .STRING mw the Montreal/Windsor corridor
+</span>
+Once a string is defined, you can call it any time with the
+<a href="definitions.html#inlines">inline escape</a>
+<kbd><span class="nobr">\*[&lt;name&gt;]</span></kbd>. Using the example
+string above
+<br/>
+<span class="pre-in-pp">
+ The schedule for trains along \*[mw]:
+</span>
+produces, on output
+<br/>
+<span class="pre-in-pp">
+ The schedule for trains along the Montreal/Windsor corridor:
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Be very careful not to put any spaces at the ends of strings
+you&#8217;re defining, unless you want them. Everything after
+the name argument you pass to STRING goes into the string,
+including trailing spaces. It&#8217;s a good idea to get into the
+habit of using groff&#8217;s native commenting mechanism, <kbd
+class="bold">\"</kbd>, immediately following any string definition
+in order to avoid spaces you can&#8217;t see, like this
+<br/>
+<span class="pre-in-pp">
+ .STRING mw the Montreal/Windsor corridor\"
+</span>
+</p>
+</div>
+
+<div class="box-tip">
+<p class="tip">
+<span class="experts">Experts:</span>
+STRING is an alias for <b>ds</b>. You can use either, or mix
+&#8217;n&#8217; match with impunity.
+</p>
+</div>
+
+<!-- -ESC_CHAR- -->
+
+<div class="macro-id-overline">
+<h3 id="esc-char" class="macro-id">Change the escape character</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>ESC_CHAR</b> <kbd class="macro-args">&lt;new character&gt; | &lt;anything&gt;</kbd>
+</div>
+
+<p>
+Groff&#8217;s and mom&#8217;s default escape character is
+the backslash. Sometimes, you may want to include a literal
+backslash in your document. There are two ways to accomplish
+this. One is simply to double the backslash character (<kbd
+class="bold">\\</kbd>), which is convenient if you don&#8217;t have
+a lot of backslashes to input. If you need to input a whole batch
+of backslashes (say, when including code snippets in your document),
+you can use ESC_CHAR to make the change permanent (until you decide
+to restore the escape character to its default, the backslash).
+</p>
+
+<p>
+ESC_CHAR with a single character argument changes the escape
+character to whatever the argument is. ESC_CHAR with no argument
+restores the escape character to the backslash.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="important">Important:</span>
+Changing the escape character prevents macros, which require that
+the backslash be the escape character, from functioning correctly.
+Do not introduce any subsequent macros without first restoring the
+escape character to its default.
+</p>
+</div>
+
+<div class="box-tip">
+<p class="tip">
+<span class="experts">Experts:</span>
+ESC_CHAR is an alias of <kbd>.ec</kbd>. Mix &#8217;n&#8217; match
+the two with impunity.
+</p>
+</div>
+
+<!-- -SIZESPECS- -->
+
+<div class="macro-id-overline">
+<h3 id="sizespecs" class="macro-id">Get cap-height, x-height and descender depth of a font</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>SIZESPECS</b>
+</div>
+
+<p>
+Whenever you need to get the
+<a href="definitions.html#capheight">cap-height</a>,
+<a href="definitions.html#xheight">x-height</a>
+or
+<a href="definitions.html#descender">descender</a>
+depth of type at the current point size, invoke <kbd
+class="bold">.SIZESPECS</kbd>, which takes no argument.
+The dimensions are stored in the string registers
+<b><span class="nobr">\*[$CAP_HEIGHT]</span></b>,
+<b><span class="nobr">\*[$X_HEIGHT]</span></b>,
+and
+<b><span class="nobr">\*[$DESCENDER]</span></b>, respectively, in
+<a href="definitions.html#units">machine units</a>
+to which the
+<a href="definitions.html#unitofmeasure">unit of measure</a>,
+<b>u</b>, is already appended.
+</p>
+
+<p>
+Thus, if you wanted to advance 2 inches from your current position
+on the page plus the cap-height of the current point size of type
+<br/>
+<span class="pre-in-pp">
+ .PT_SIZE &lt;n&gt;
+ .SIZESPECS
+ .ALD 2i+\*[$CAP_HEIGHT]
+</span>
+would do the trick.
+</p>
+
+<!-- -UNDERSCORE- -->
+
+<div class="macro-id-overline">
+<h3 id="underscore" class="macro-id">Single underscore</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>UNDERSCORE</b> <kbd class="macro-args">[ &lt;distance below baseline&gt; ] [ PREFIX &lt;prefix&gt; ] [ SUFFIX &lt;suffix&gt; ] &quot;&lt;string&gt;&quot;</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;&lt;distance below baseline&gt; requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+By default, UNDERSCORE places an underscore 2 points beneath the
+required
+<a href="definitions.html#stringargument">string argument</a>.
+The string must be enclosed in double-quotes, like this:
+<br/>
+<span class="pre-in-pp">
+ .UNDERSCORE "Unmonitored monopolies breed high prices and poor products"
+</span>
+If you wish to change the distance of the rule from the baseline,
+use the optional argument
+<kbd>&lt;distance&nbsp;below&nbsp;baseline&gt;</kbd>
+(with a unit of measure).
+<br/>
+<span class="pre-in-pp">
+ .UNDERSCORE 3p "Unmonitored monopolies breed high prices and poor products"
+</span>
+The above places the upper edge of the underscore 3 points below the
+<a href="definitions.html#baseline">baseline</a>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Tip:</span>
+UNDERSCORE can also be used for strikethrough effects by supplying a
+negative value to the distance argument.
+</p>
+</div>
+
+<p>
+<kbd>PREFIX</kbd> and <kbd>SUFFIX</kbd> allow you to add
+non-underscored punctuation (or other glyphs) to the beginning
+and/or end of the underscored string. If the argument to either
+<kbd>PREFIX</kbd> or <kbd>SUFFIX</kbd> contains spaces, surround the
+argument with double-quotes. For example, the following underscores
+the text string but not the surrounding punctuation.
+<br/>
+<span class="pre-in-pp">
+ .UNDERSCORE PREFIX ( SUFFIX .) "Unmonitored monopolies breed high prices and poor products"
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+UNDERSCORE does not work across line breaks in output copy, which is
+to say that you can&#8217;t underscore a multi-line passage simply
+by putting the text of the whole thing in the string you pass to
+UNDERSCORE. If you need to underscore several lines of type, use
+<a href="#underline">UNDERLINE</a>.
+</p>
+</div>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Additional note:</span>
+In
+<a href="definitions.html#filled">nofill modes</a>,
+UNDERSCORE causes a break before and after, meaning the underscored
+word or phrase will appear as a separate line in your output. If
+you wish to embed an underscored word or phrase into non-filled
+text, temporarily change to the corresponding fill mode with
+<a href="typesetting.html#quad">QUAD</a>
+and insert breaks manually with
+<a href="typesetting.html#br">BR</a>
+as appropriate, reverting to the original nofill mode afterwards.
+</p>
+</div>
+
+<h3 id="underscore-weight" class="docs">Controlling the weight of underscores</h3>
+<p>
+The weight (thickness) of underscores may be controlled with the
+macro UNDERSCORE_WEIGHT. Thus, if you want underscores with a
+weight of 1-1/2 points, you&#8217;d invoke:
+<br/>
+<span class="pre-in-pp">
+ .UNDERSCORE_WEIGHT 1.5
+</span>
+prior to invoking <kbd>.UNDERSCORE</kbd>. Every
+subsequent instance of <kbd>.UNDERSCORE</kbd> will use
+this weight.
+</p>
+
+<p>
+Mom&#8217;s default underscore weight is 1/2 point.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+UNDERSCORE_WEIGHT also sets the weight of
+<a href="#UNDERSCORE2">double underscores.</a>
+</p>
+</div>
+
+<h3 id="underscore-color" class="docs">Colourising underscored text</h3>
+<p>
+If you want underscored text to be in a different colour from the
+text around it, use the
+<a href="color.html#color">COLOR</a>
+macro rather than the
+<a href="color.html#color-inline">inline escape for changing colour</a>.
+In other words, assuming your prevailing text colour is black and
+you want underscored text in red
+<br/>
+<span class="pre-in-pp">
+ .COLOR red
+ .UNDERSCORE "text to underscore"
+ .COLOR black
+</span>
+rather than
+<br/>
+<span class="pre-in-pp">
+ .UNDERSCORE "\*[red]text to underscore\*[black]"
+</span>
+The latter will render the text in red but the underscore in black.
+You can, of course, use this to create rainbow effects if that's
+what you want, e.g. text in red, underscore in blue, and prevailing
+type in black:
+<br/>
+<span class="pre-in-pp">
+ .UNDERSCORE "\*[red]text to underscore\*[blue]"
+ .COLOR black
+</span>
+</p>
+
+<!-- -UNDERSCORE2- -->
+
+<div class="macro-id-overline">
+<h3 id="underscore2" class="macro-id">Double underscore</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>UNDERSCORE2</b> <kbd class="macro-args">[ &lt;distance below baseline&gt; [ &lt;distance between rules&gt; ] [ PREFIX &lt;prefix&gt; ] [ SUFFIX &lt;suffix&gt; ] &quot;&lt;string&gt;&quot;</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;&lt;distance below baseline&gt;
+and
+&lt;distance between rules&gt;
+require a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+By default, UNDERSCORE2 places a double underscore 2 points beneath
+the required
+<a href="definitions.html#stringargument">string argument</a>.
+The string must be enclosed in double-quotes, like this:
+<br/>
+<span class="pre-in-pp">
+ .UNDERSCORE2 "Unmonitored monopolies breed high prices and poor products"
+</span>
+The default distance between the two rules is 2 points, measured
+from the bottom edge of the upper rule to the top edge of the lower
+one.
+</p>
+
+<p>
+If you wish to change the distance of the double underscore from the
+<a href="definitions.html#baseline">baseline</a>,
+use the optional argument
+<kbd>&lt;distance&nbsp;below&nbsp;baseline&gt;</kbd>
+(with a unit of measure), e.g.
+<br/>
+<span class="pre-in-pp">
+ .UNDERSCORE2 3p "Unmonitored monopolies breed high prices and poor products"
+</span>
+which places the upper edge of the first rule of the double
+underscore 3 points below the baseline.
+</p>
+
+<p>
+If you wish to change the distance between the two rules as well,
+use the second optional argument
+<kbd>&lt;distance&nbsp;between&nbsp;rules&gt;</kbd>
+(with a unit of measure). The distance between the two rules
+is measured from the bottom edge of the upper rule to the top
+edge of the lower one. Be aware that you must give a value for
+<kbd>&lt;distance&nbsp;below&nbsp;baseline&gt;</kbd> if you want to
+use <kbd>&lt;distance&nbsp;between&nbsp;rules&gt;</kbd>.
+</p>
+
+<p>
+<kbd>PREFIX</kbd> and <kbd>SUFFIX</kbd> allow you to add
+non-underscored punctuation (or other glyphs) to the beginning
+and/or end of the double-underscored string. If the argument to
+either <kbd>PREFIX</kbd> or <kbd>SUFFIX</kbd> contains spaces,
+surround the argument with double-quotes. For example, the
+following double-underscores the text string but not the surrounding
+punctuation.
+<br/>
+<span class="pre-in-pp">
+ .UNDERSCORE2 PREFIX ( SUFFIX .) "Unmonitored monopolies breed high prices and poor products"
+</span>
+The weight (thickness) of double underscores may be controlled with
+the macro
+<a href="#underscore-weight">UNDERSCORE_WEIGHT</a>
+(q.v).
+</p>
+
+<p>
+See
+<a href="#underscore-color">here</a>
+for advice on colourising double-underscored text.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+In
+<a href="definitions.html#filled">nofill modes</a>,
+UNDERSCORE2 causes a break before and after, meaning the double-underscored
+word or phrase will appear as a separate line in your output. If
+you wish to embed a double-underscored word or phrase into non-filled
+text, temporarily change to the corresponding fill mode with
+<a href="typesetting.html#quad">QUAD</a>
+and insert breaks manually with
+<a href="typesetting.html#br">BR</a>
+as appropriate, reverting to the original nofill mode afterwards.
+</p>
+</div>
+
+<!-- -UNDERLINE- -->
+<div class="macro-id-overline">
+<h3 id="underline" class="macro-id">Underline</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>UNDERLINE</b> <kbd class="macro-args">toggle</kbd>
+</div>
+
+<p>
+The distinction between underscoring and underlining is that
+underscoring is suitable for occasional effects (a word here,
+a phrase there), whereas underlining underlines whole passages
+of type. Furthermore, you cannot colourise underlining.
+There&#8217;s a special macro,
+<a href="#underline-specs">UNDERLINE_SPECS</a>,
+to control the weight and distance from the baseline of the
+underline.
+</p>
+
+<p>
+Lastly, files that use UNDERLINE must be processed with
+<br/>
+<span class="pre-in-pp">
+ pdfmom -Tps filename.mom | ps2pdf - filename.pdf
+</span>
+since groff&#8217;s pdf driver does not recognize UNDERLINE.
+</p>
+
+<p>
+Note that
+<a href="docprocessing.html#printstyle">PRINTSTYLE&nbsp;TYPEWRITE</a>
+uses UNDERLINE to underline italics
+and pseudo-italics (<a href="typesetting.html#slant-inline">SLANT</a>)
+by default. The default may be changed (see
+<a href="docprocessing.html#printstyle-italics">Underlining of italics</a>)
+but if it's what you want, you must process your document as shown
+above.
+</p>
+
+<p>
+UNDERLINE is a toggle macro, therefore you invoke it by itself (i.e.
+with no argument) to initiate underlining, and with any argument
+(<kbd>OFF</kbd>, <kbd>QUIT</kbd>, <kbd>END</kbd>, <kbd>X</kbd>, etc)
+to turn it off.
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span>
+Underlining may also be turned on and off
+<a href="definitions.html#inlines">inline</a>
+with the escapes
+<a href="#ul"><kbd><span class="nobr">\*[UL]...\*[ULX]</span></kbd></a>.
+</p>
+
+<p class="tip-bottom">
+<span class="additional-note">Additional note:</span>
+In document processing, neither <kbd>.UNDERLINE</kbd> nor
+<kbd><span class="nobr">\*[UL]</span></kbd> persist past the current document element tag.
+For example, if you turn underlining on in a paragraph
+(<kbd><a href="docelement.html#pp">.PP</a></kbd>),
+your next paragraph will not be underlined.
+</p>
+</div>
+
+<h4 id="underline-specs" class="docs">UNDERLINE_SPECS</h4>
+
+<p>
+The weight of underlining and the distance from the baseline is
+set with
+<br/>
+<span class="pre-in-pp">
+ .UNDERLINE_SPECS &lt;weight&gt; &lt;distance&gt;
+</span>
+The <kbd>&lt;weight&gt;</kbd> argument can be expressed in any
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+you like, but points is the most usual. Mom&#8217;s default is 1/2 point
+(.5p). The same holds for the <kbd>&lt;distance&gt;</kbd> argument;
+mom&#8217;s default is 1-1/4 points (1.25p).
+</p>
+
+<!-- -UL- -->
+
+<h4 id="ul" class="docs">INLINE ESCAPE FOR UNDERLINING</h4>
+
+<p>
+The macro pair,
+<kbd><a href="#underline">.UNDERLINE</a></kbd> /
+<kbd>.UNDERLINE&nbsp;OFF</kbd>, and the inline escapes,
+<span class="nobr"><kbd>\*[UL]</kbd> / <kbd>\*[ULX]</kbd></span>, are
+functionally identical, hence, in
+<a href="definitions.html#filled">fill</a>
+modes
+<br/>
+<span class="pre-in-pp">
+ Which should I heed?
+ .UNDERLINE
+ Just do it
+ .UNDERLINE OFF
+ or
+ .UNDERLINE
+ just say no?
+ .UNDERLINE OFF
+</span>
+produces the same result as
+<br/>
+<span class="pre-in-pp">
+ Which should I heed? \*[UL]Just do it\*[ULX] or \*[UL]just say no?\*[ULX]
+</span>
+In either case, this is a misuse of UNDERLINE.
+<a href="#underscore">UNDERSCORE</a>
+is preferable.
+</p>
+
+<!-- -PAD- -->
+
+<div class="macro-id-overline">
+<h3 id="pad" class="macro-id">Insert equalized whitespace into lines</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>PAD</b> <kbd class="macro-args">&quot;&lt;string with pad markers inserted&gt;&quot; [ NOBREAK ]</kbd>
+</div>
+
+<p>
+With PAD, you can insert proportional amounts of whitespace into a
+line. The optional <kbd id="nobreak" class="bold">NOBREAK</kbd>
+argument tells mom not to advance on the page after the PAD macro
+has been invoked.
+</p>
+
+<p>
+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.
+</p>
+
+<p>
+Take, for example, the following relatively common typesetting
+situation, found at the bottom of legal agreements:
+<br/>
+<span class="pre">
+ Date Signature |
+</span>
+</p>
+
+<p>
+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, <kbd>|</kbd> represents the
+end of the line at the prevailing line length.)
+</p>
+
+<p>
+The
+<a href="goodies.html#pad-marker">pad marker</a>
+(see below) is <kbd>#</kbd> (the pound or number sign
+on your keyboard) and can be used multiple times in a line. With
+that in mind, here&#8217;s how you&#8217;d input the Date/Signature line
+(assuming a length of 30 picas):
+<br/>
+<span class="pre">
+ .LL 30P
+ .PAD "Date#Signature###"
+</span>
+</p>
+
+<p>
+When the line is output, the space remaining on the line, after
+&quot;Date&quot; and &quot;Signature&quot; 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.
+</p>
+
+<div class="examples-container">
+<h3 id="pad-example" class="docs notes">Example of PAD usage</h3>
+<p style="margin-top: .5em;">
+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
+<a href="typesetting.html#string-tabs">string tabs</a>.
+The following uses the Date/Signature example, above, but adds
+rules into the whitespace through the use of string tabs and
+mom&#8217;s
+<a href="definitions.html#inlines">inline escape</a>
+<a href="inlines.html#inline-rule-mom"><kbd><span class="nobr">\*[RULE]</span></kbd></a>.
+<br/>
+<span class="pre-in-pp">
+ .LL 30P
+ .PAD "Date \*[ST1]#\*[ST1X] Signature \*[ST2]###\*[ST2X]" NOBREAK
+ .ST 1 J
+ .ST 2 J
+ .TAB 1
+ \*[RULE]
+ .TN
+ \*[RULE]
+ .TQ
+</span>
+</p>
+
+<p>
+Here&#8217;s what the example does:
+</p>
+<ol style="margin-top: -.5em; margin-bottom: -.5em;">
+ <li>Pads the Date/Signature line with a shorter space for Date
+ (<kbd>#</kbd>) and a longer space for Signature
+ (<kbd>###</kbd>), encloses the padded space with string tabs
+ markers, and outputs the line without advancing on the page.
+ </li>
+ <li>Sets the quad for the two string tabs (in this instance, justified).
+ </li>
+ <li>Calls the first string tab and draws a rule to its full
+ length.
+ </li>
+ <li>Calls the second tab with
+ <a href="typesetting.html#tn">TN</a>
+ (which moves to tab 2 and stays on the same baseline)
+ then draws a rule to the full length of string tab 2.
+ </li>
+</ol>
+
+<p>
+Often, when setting up string tabs this way, you don&#8217;t want the
+padded line to print immediately. To accomplish this, use
+<kbd><a href="#silent">SILENT</a></kbd>.
+See the
+<a href="typesetting.html#string-tabs-tut">quickie tutorial on string tabs</a>
+for an example.
+</p>
+</div>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span>
+Because the pound sign
+(<kbd>#</kbd>) is used as the pad marker, you
+can&#8217;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
+<kbd><a href="#pad-marker">PAD_MARKER</a></kbd>.
+Also, be aware that <kbd>#</kbd> as a pad marker
+only applies within the PAD macro; at all other times it prints
+literally, just as you&#8217;d expect.
+</p>
+
+<p class="tip-bottom">
+Another important consideration when using PAD is that because the
+string must be enclosed in double-quotes, you can&#8217;t use the
+double-quote (<kbd>"</kbd>) as part of the string. The
+way to circumvent this is to use the groff
+<a href="definitions.html#inlines">inline escapes</a>
+<kbd>\(lq</kbd> and <kbd>\(rq</kbd>
+(leftquote and rightquote respectively) whenever double-quotes are
+required in the string passed to PAD.
+</p>
+</div>
+
+<!-- -PAD_MARKER- -->
+
+<div class="macro-id-overline">
+<h3 id="pad-marker" class="macro-id">Change/set the marker used with PAD</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>PAD_MARKER</b> <kbd class="macro-args">"&lt;character to use as the pad marker&gt;</kbd>
+</div>
+
+<p>
+If you need to change mom&#8217;s default pad marker (<kbd
+class="bold">#</kbd>), 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.
+<br/>
+<span class="pre-in-pp">
+ .PAD_MARKER @
+</span>
+changes the pad marker to <kbd>@</kbd>.
+</p>
+
+<p>
+Once you&#8217;ve changed the pad marker, the new marker remains in effect
+for every instance of
+<a href="#pad">PAD</a>
+until you change it again (say, back to the pound sign).
+</p>
+
+<!-- -\*[LEADER]- -->
+
+<div class="macro-id-overline">
+<h3 id="leader" class="macro-id">Inline escape to add leaders to a line</h3>
+</div>
+
+<div class="box-macro-args">
+Inline: <b>\*[LEADER]</b>
+</div>
+
+<p>
+Whenever you want to fill a line or tab with
+<a href="definitions.html#leader">leaders</a>,
+use the
+<a href="definitions.html#inlines">inline escape</a>
+<kbd><span class="nobr">\*[LEADER]</span></kbd>. The remainder of the line or
+tab will be filled with the leader character. Mom&#8217;s default
+leader character is a period (dot), but you can change it to any
+character you like with
+<kbd><a href="#leader-character">LEADER_CHARACTER</a></kbd>.
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span>
+<kbd>\*[LEADER]</kbd> 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.
+<a href="typesetting.html#string-tabs">String tabs</a>
+are perfect for this. An example follows.
+<br/>
+<span class="pre">
+ .LL 30P
+ .PAD "Date\*[ST1]#\*[ST1X] Signature\*[ST2]###\*[ST2X]" NOBREAK
+ .EL
+ .ST 1 J
+ .ST 2 J
+ .TAB 1
+ \*[LEADER]
+ .TN
+ \*[LEADER]
+ .TQ
+</span>
+</p>
+
+<p class="tip-bottom">
+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 &quot;set&quot;, called, and filled with leaders. The result
+looks like this:
+<br/>
+<span class="pre" style="margin-bottom: -1em;">
+ Date.............Signature.....................................
+</span>
+</p>
+</div>
+
+<!-- -LEADER_CHARACTER- -->
+
+<div class="macro-id-overline">
+<h3 id="leader-character" class="macro-id">Change/set the leader character</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>LEADER_CHARACTER</b> <kbd class="macro-args">&lt;character&gt;</kbd>
+</div>
+
+<p>
+LEADER_CHARACTER takes one argument: a single character you would
+like to be used for
+<a href="definitions.html#leader">leaders</a>.
+(See
+<a href="#leader"><kbd><span class="nobr">\*[LEADER]</span></kbd></a>
+for an explanation of how to fill lines with leaders.)
+</p>
+
+<p>
+For example, to change the leader character from mom&#8217;s
+default (a period) to the underscore character, enter
+<br/>
+<span class="pre-in-pp">
+ .LEADER_CHARACTER _
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="tip">Tip:</span>
+A particularly useful function of LEADER_CHARACTER is that it can be
+used to increase the spacing of mom&#8217;s default leaders. This is
+done by assigning to LEADER_CHARACTER both the period (dot) and a
+space. The technique requires a little low-level groffing:
+<br/>
+<span class="pre-in-pp">
+ .char \[leader] . \"
+ .LEADER_CHARACTER \[leader]
+</span>
+The <kbd>.char</kbd>
+<a href="definitions.html#primitives">primitive</a>
+allows you to define a character called <kbd>leader</kbd>, to which
+you assign a period and a space. The <kbd>\"</kbd>, which, in
+groff, is used to add non-printing comments to a line, is not
+strictly necessary. Its presence here lets you see that
+there&#8217;s a space after the period.
+</p>
+</div>
+
+<!-- -DROPCAP- -->
+
+<div class="macro-id-overline">
+<h3 id="dropcap" class="macro-id">Drop caps</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>DROPCAP</b> <kbd class="macro-args">&lt;dropcap letter&gt; &lt;number of lines to drop&gt; [ COND &lt;percentage&gt; | EXT &lt;percentage&gt; ]</kbd>
+</div>
+
+<p>
+The first two arguments to DROPCAP are the letter you want to be the
+<a href="definitions.html#dropcap">drop cap</a>
+and the number of lines you want it to drop. By default, mom uses
+the current family and font for the drop cap.
+</p>
+
+<p>
+The optional argument (<kbd>COND</kbd> or <kbd>EXT</kbd>) indicates
+that you want the drop cap condensed (narrower) or extended (wider).
+If you use <kbd class="bold">COND</kbd> or <kbd>EXT</kbd>, you must
+follow the argument with the percentage of the letter&#8217;s normal
+width you want it condensed or extended. No percent sign
+(<kbd>%</kbd>) is required.
+</p>
+
+<p>
+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.
+</p>
+
+<p>
+Beginning a paragraph with a drop cap &#8220;T&#8221; looks like this:
+<br/>
+<span class="pre">
+ .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...
+</span>
+</p>
+
+<p>
+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&#8217;s text will revert to the left margin.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+When using the
+<a href="docprocessing.html#docprocessing">document processing macro</a>
+<a href="docelement.html#pp">PP</a>,
+DROPCAP only works
+</p>
+<ul style="margin-top: -1em; margin-bottom: -.5em;">
+ <li>with initial paragraphs (i.e. at the start of the document,
+ or after
+ <a href="docelement.html#heading">HEADING</a>),</li>
+ <li>when <kbd>.DROPCAP</kbd> comes immediately after <kbd>.PP</kbd>,</li>
+ <li>the
+ <a href="docprocessing.html#printstyle">PRINTSTYLE</a>
+ is TYPESET.</li>
+</ul>
+<p>
+If these conditions aren&#8217;t met, DROPCAP is silently ignored.
+</p>
+
+<p class="tip-bottom" style="margin-top: -1em;">
+<span class="additional-note">Additional note:</span>
+If you have dropcaps after
+<a href="docelement.html#heading">HEADING</a>s,
+you must increase the <kbd>NEEDS</kbd> argument to
+<a href="docelement.html#heading-style">HEADING_STYLE</a>
+to match the number of dropcap lines. For example, assuming
+dropcaps that are three lines tall:
+<br/>
+<span class="pre-in-pp">
+ .HEADING_STYLE 1 NEEDS 3
+</span>
+</p>
+</div>
+
+<div class="box-important">
+<p class="tip">
+<span class="important">Warning:</span>
+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.
+</p>
+</div>
+
+<h3 id="dropcap-support" class="docs control-macros-header">Support macros for DROPCAP</h3>
+<p>
+Drop caps are the bane of most typesetters&#8217; existence.
+It&#8217;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&#8217;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.
+</p>
+
+<p>
+Mom solves the last of these problems with the <kbd>COND</kbd> and
+<kbd>EXT</kbd> arguments. The rest she solves with macros that
+change the default behaviour of DROPCAP, namely
+</p>
+<ul class="no-enumerator" style="margin-top: -.5em; margin-left: -.5em;">
+ <li><a href="#dropcap-family">DROPCAP_FAMILY</a></li>
+ <li><a href="#dropcap-font">DROPCAP_FONT</a></li>
+ <li><a href="#dropcap-color">DROPCAP_COLOR</a></li>
+ <li><a href="#dropcap-adjust">DROPCAP_ADJUST</a></li>
+ <li><a href="#dropcap-gutter">DROPCAP_GUTTER</a></li>
+</ul>
+
+<p style="margin-top: -.5em;">
+These macros must, of course, come before you invoke DROPCAP.
+</p>
+
+<h3 id="dropcap-family" class="control-macro">&bull;&nbsp;DROPCAP_FAMILY</h3>
+<p style="margin-left: .66em;">
+Set the drop cap family by giving DROPCAP_FAMILY the name of the
+family you want, e.g.
+<br/>
+<span class="pre-in-pp">
+ .DROPCAP_FAMILY H
+</span>
+which will set the family to Helvetica for the drop cap only.
+</p>
+
+<h3 id="dropcap-font" class="control-macro">&bull;&nbsp;DROPCAP_FONT</h3>
+<p style="margin-left: .66em;">
+Set the drop cap font by giving DROPCAP_FONT the name of the font
+you want, e.g.
+<br/>
+<span class="pre-in-pp">
+ .DROPCAP_FONT I
+</span>
+which will set the font to italic for the drop cap only.
+</p>
+
+<h3 id="dropcap-adjust" class="control-macro">&bull;&nbsp;DROPCAP_ADJUST</h3>
+<p style="margin-left: .66em;">
+If the size mom calculates for the drop cap isn&#8217;t precisely
+what you want, you can increase or decrease it with DROPCAP_ADJUST,
+like this: e.g.
+<br/>
+<span class="pre-in-pp">
+ .DROPCAP_ADJUST +1
+</span>
+or
+<br/>
+<span class="pre">
+ .DROPCAP_ADJUST -.75
+</span>
+</p>
+
+<p style="margin-left: .66em;">
+DROPCAP_ADJUST only understands
+<a href="definitions.html#picaspoints">points</a>,
+therefore do not append any
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+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.
+</p>
+
+<h3 id="dropcap-color" class="control-macro">&bull;&nbsp;DROPCAP_COLOR</h3>
+<p style="margin-left: .66em;">
+If you&#8217;d like your drop cap colourized, simply invoke
+<kbd>.DROPCAP_COLOR&nbsp;&lt;color&gt;</kbd> with the name of a
+colour you&#8217;ve already created (&#8220;initialized&#8221;) with
+<a href="color.html#newcolor">NEWCOLOR</a>
+or
+<a href="color.html#xcolor">XCOLOR</a>.
+Only the drop cap will be colourized; all other text will remain at
+the current colour default (usually black).
+</p>
+
+<h3 id="dropcap-gutter" class="control-macro">&bull;&nbsp;DROPCAP_GUTTER</h3>
+<p style="margin-left: .66em;">
+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:
+<br/>
+<span class="pre-in-pp">
+ .DROPCAP_GUTTER 6p
+</span>
+</p>
+
+<!-- -\*[SUP]- -->
+
+<div class="macro-id-overline">
+<h3 id="sup" class="macro-id">Superscript</h3>
+</div>
+
+<div class="box-macro-args">
+Inlines: <kbd>\*[SUP]...\*[SUPX]</kbd>
+</div>
+
+<p>
+Superscripts are accomplished
+<a href="definitions.html#inlines">inline</a>.
+Whenever you need one, typically for numerals, all you need
+to do is surround the superscript with the inlines above.
+<kbd><span class="nobr">\*[SUP]</span></kbd> begins superscripting;
+<kbd><span class="nobr">\*[SUPX]</span></kbd> turns it off.
+</p>
+
+<p id="cond-or-ext-sup">
+If your running type is
+<a href="typesetting.html#cond-inline">pseudo-condensed</a>
+or
+<a href="typesetting.html#ext-inline">pseudo-extended</a>
+and you want your superscripts to be equivalently pseudo-condensed
+or -extended, use
+<br/>
+<kbd><span class="nobr">\*[CONDSUP]...\*[CONDSUPX]</span></kbd> or
+<kbd><span class="nobr">\*[EXTSUP]...\*[EXTSUPX]</span></kbd>.
+</p>
+
+<p>
+The superscript inlines are primarily used by the
+<a href="docprocessing.html#docprocessing">document processing macros</a>
+for automatic generation of numbered footnotes. However, you may
+find them useful for other purposes.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Mom does a pretty fine job of making superscripts look good in any
+font and at any size. If you&#8217;re fussy, though (and I am),
+about precise vertical placement, kerning, weight, size, and so on,
+you may want to roll your own solution.
+</p>
+</div>
+
+<h3 id="sup-raise" class="docs">SUPERSCRIPT RAISE AMOUNT</h3>
+<p>
+By default, mom raises superscripts 1/3 of an
+<a href="definitions.html#em">em</a>
+above the baseline. If you&#8217;re not happy with this default,
+you can change it by invoking SUPERSCRIPT_RAISE_AMOUNT with the
+amount you want them raised. A
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+must be appended directly to the amount. Thus, if you want
+superscripts raised by 3
+<a href="definitions.html#picaspoints">points</a>
+instead of 1/3 em, you&#8217;d do
+<br/>
+<span class="pre-in-pp">
+ .SUPERSCRIPT_RAISE_AMOUNT 3p
+</span>
+and all subsequent superscripts would be raised by 3 points.
+</p>
+
+<!-- -CENTER BLOCK- -->
+
+<div class="macro-id-overline">
+<h3 id="center-block" class="macro-id">Centre blocks of type</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>CENTER_BLOCK</b> <kbd class="macro-args">&lt;toggle&gt;</kbd>
+</div>
+
+<p>
+Blocks of type sometimes need to be centred on the page with their quad
+direction (left, centre, right) left intact. The
+document processing macros
+<a href="docelement.html#quote">QUOTE</a>
+and
+<a href="docelement.html#blockquote">BLOCKQUOTE</a>
+take care of this automatically, but there are other situations
+where you may want to centre blocks of type. An example might be
+left-quadded
+<a href="docelement.html#list-intro">nested lists</a>.
+</p>
+
+<p>
+Whenever you want to centre a block of type on the page, surround it
+with <kbd>.CENTER_BLOCK/.CENTER_BLOCK OFF</kbd> (or <kbd>QUIT</kbd>,
+<kbd>X</kbd>, etc).
+</p>
+
+<div class="macro-id-overline">
+<h3 id="left-hang" class="macro-id">Hanging characters</h3>
+</div>
+<br/>
+<div class="box-macro-args">
+Macro: <b>LEFT_HANG</b> <kbd class="macro-args">&lt;character&gt; [ &lt;gutter&gt;</kbd> ]
+</div>
+<p class="requires">
+&bull;&nbsp;left-hung characters
+</p>
+
+<div class="box-macro-args" style="margin-top: 1em">
+Inline: <b>\*[HANG <kbd class="macro-args">&lt;character&gt;</kbd>]</b>
+</div>
+<p class="requires">
+&bull;&nbsp;right-hung characters
+</p>
+
+<p>
+Hung characters, frequently punctuation, fall outside the left or
+right margin. Their purpose is usually to fine-tune justification.
+Consider the following:
+</p>
+
+<table style="margin-left: 3%; margin-right: 6%; text-align: justify">
+<tr>
+<td style="padding-right: 1em">
+&#8220;Play the man, Master Ridley; we
+shall this day light such a candle,
+by God's grace, in England, as I
+trust shall never be put out.&#8221;
+</td>
+<td>
+&nbsp;&nbsp;
+</td>
+<td style="margin-right: 0; padding-right: 0">
+&#8220;
+<br/>
+<br/>
+<br/>
+<br/>
+</td>
+<td style="margin-left: 0; padding-left: 0">
+Play the man, Master Ridley; we
+shall this day light such a candle,
+by God's grace, in England, as I
+trust shall never be put out.&#8221;</td>
+</tr>
+</table>
+
+<p>
+In the right hand example, the opening double-quote hangs outside
+the left margin, creating a uniform left margin for the text.
+</p>
+
+<h4 class="docs">Left hung characters</h4>
+
+<p>
+LEFT_HANG hangs its first argument, the character to be hung, to
+the left of the left margin. The optional second argument lets you
+specify an amount of space to insert between the hung character and
+the text.
+</p>
+
+<p>
+Input text after LEFT_HANG must begin with the character to be hung
+PLUS a
+<a href="inlines.html#inline-horizontal-mom">horizontal motion</a>
+corresponding to <kbd>&lt;gutter&gt;</kbd> if one was given.
+If the hung character is a left double-quote, <kbd>\[lq]</kbd>
+must be used as the argument to LEFT_HANG and the usual keyboard
+double-quote (<kbd>"</kbd>) entered as the input text so as not to
+confuse
+<a href="goodies.html#smartquotes">SMARTQUOTES</a>
+The following example demonstrates:
+<br/>
+<span class="pre-in-pp">
+ .LEFT_HANG \[lq] 1p
+ "\*[FWD 1p]This line will have its opening double-quote
+ plus one point of space hung outside the left margin."
+</span>
+</p>
+
+<p style="margin-top: -1em">
+Note that what follows LEFT_HANG must be an input line and therefore
+it cannot be used to left-hang a
+<a href="docelement.html#heading">HEADING</a>
+character.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="important">Important:</span>
+Versions of mom lower than 2.5_a that included LEFT_HANG required
+that the character and its gutter be entered as a single,
+concatenated argument, using horizontal motions to establish the
+gutter
+(e.g.
+<a href="inlines.html#inline-horizontal-mom">FWD</a>,
+<a href="inlines.html#inline-horizontal-mom">BCK</a>).
+Documents created with versions prior to 2.5_a may have to be
+updated.
+</p>
+</div>
+
+<h4 class="docs">Right hung characters</h4>
+
+<p>
+The <kbd>\*[HANG&nbsp;c]</kbd> inline escape hangs its argument outside
+the right margin of justified or quad right copy. The argument may
+be a single character, or a single character preceded by a
+horizontal motion, effectively establishing a gutter between the
+right margin and the hung character:
+<br/>
+<span class="pre-in-pp" style="margin-bottom: .25em">
+ This line will have its closing period hung outside
+ the right margin with a one point gutter\*[HANG \*[FWD 1p].]
+</span>
+If the hung character is a right double-quote, <kbd>"\[rq]"</kbd>
+must be used as the argument (that is, the <kbd>\[rq]</kbd>
+character surrounded by double-quotes). The double-quotes are
+required for all special characters of the form
+<kbd style="whitespace: nowrap">\[name]</kbd>.
+Horizontal motion, if any, must fall inside the double-quotes:
+<br/>
+<span class="pre-in-pp">
+ ...and they all lived happily ever after.\*[HANG "\*[FWD 1p]\[rq]"]
+</span>
+</p>
+
+<p>
+If the hung character is a hyphen,
+<kbd style="whitespace: nowrap"><span class="nobr">\*[HANG&nbsp;-]</span></kbd>
+must come at the end of an
+<a href="definitions.html#inputline">input line</a>.
+This restriction does not apply to other characters, which may come
+anywhere in an input line provided that, on output, the line breaks
+at the point you introduced the hung character.
+</p>
+
+<p>
+For the exceptionally fussy, <kbd>\*[HANG]</kbd> may also be used to
+improve visual centring; when text is centred, <kbd
+style="whitespace: nowrap">\*[HANG&nbsp;c]</kbd>
+hangs the character to the right of the centred line instead of the
+margin.
+</p>
+
+<div class="rule-long"><hr/></div>
+
+<!-- Navigation links -->
+<table style="width: 100%; margin-top: 12px;">
+<tr>
+ <td style="width: 33%;"><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="width: 33%; text-align: center;"><a href="#top">Top</a></td>
+ <td style="width: 33%; text-align: right;"><a href="inlines.html#top">Next: Inline escapes</a></td>
+</tr>
+</table>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/momdoc/graphical.html b/contrib/mom/momdoc/graphical.html
new file mode 100644
index 0000000..0f373b7
--- /dev/null
+++ b/contrib/mom/momdoc/graphical.html
@@ -0,0 +1,689 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>Mom -- Graphical Objects</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div id="top" class="page">
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+<tr>
+ <td><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="text-align: right;"><a href="docprocessing.html#top">Next: Document processing</a></td>
+</tr>
+</table>
+
+<h1 class="docs">Graphical objects</h1>
+
+<div style="text-align: center;">
+<ul class="no-enumerator" style="margin-left: -2.5em;">
+ <li><a href="#intro-graphical">Introduction to graphical objects</a></li>
+ <li><a href="#behaviour">Graphical objects behaviour</a></li>
+ <li><a href="#order">Order of arguments</a></li>
+ <li><a href="#index-graphical">Index of graphical objects macros</a></li>
+</ul>
+</div>
+
+<div class="rule-medium"><hr/></div>
+
+<h2 id="intro-graphical" class="docs">Introduction to graphical objects</h2>
+
+<p>
+Groff has a number of
+<a href="definitions.html#inlines">inline escapes</a>
+for drawing rules, polygons, ellipses and splines. All begin with
+<kbd>\D</kbd> (presumably for &#8220;Draw&#8221;) and are documented
+in the groff info manual:
+<br/>
+<span class="pre-in-pp">
+ info groff \D
+</span>
+The escapes allow you to draw just about any simple graphical object
+you can think of, but owing to their syntax they&#8217;re not always easy
+to read, which can make tweaking them difficult. Additionally,
+while they perform in a <i>consistent</i> manner, they don&#8217;t
+always perform in an <i>expected</i> manner.
+</p>
+
+<p>
+Experience shows that the most common graphical elements typesetters
+need are rules (horizontal and vertical), boxes, and circles (or
+ellipses). For this reason, mom provides macros
+to draw these objects in an easy-to-understand way; the results are
+predictable, and mom&#8217;s syntax makes fixes or tweaks
+painless.
+</p>
+
+<p id="graphical-example">
+For example, if you want to draw a 2-inch square outline box at the left
+margin using groff&#8217;s <kbd>\D</kbd> escapes, it looks like this:
+<br/>
+<span class="pre-in-pp">
+ back up
+ by
+ weight
+ +-------+
+ | |
+ \D't 500'\h'-500u'\D'p 2i 0 0 2i -2i 0 0 -2i'
+ | | | |
+ +-------+ +------------------------+
+ set rule draw box, 1 line at a time
+ weight
+</span>
+
+Obviously, this isn&#8217;t very efficient for something as simple as a
+box.
+</p>
+
+<p>
+Here&#8217;s the same box, drawn with mom&#8217;s box drawing
+macro
+<kbd><a href="#dbx">DBX</a></kbd>:
+<br/>
+<span class="pre-in-pp">
+ left margin indent--+ +--box width
+ | |
+ .DBX .5 0 2i 2i
+ | |
+ rule weight--+ +--box depth
+ (in points)
+</span>
+</p>
+
+<p>
+Mom&#8217;s graphical object macros allow&mdash;in fact,
+require&mdash;giving the rule weight (&#8220;thickness&#8221;) for
+the object (or saying that you want it filled), an indent from the
+left margin where the object begins, the dimensions of the object,
+and optionally a colour for the object.
+</p>
+
+<p>
+There are no defaults for the arguments to mom&#8217;s graphical
+object macros, which means you must supply the arguments every time
+you invoke them.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+As stated above, mom only provides macros for commonly-used
+graphical objects (rules, boxes, circles). More complex objects
+(polygons, non-straight lines, splines) must be drawn using
+groff&#8217;s <kbd>\D</kbd> escapes.
+</p>
+</div>
+
+<h3 id="behaviour" class="docs">Graphical object behaviour</h3>
+
+<p>
+Mom&#8217;s graphical object macros all behave in the following,
+carved-in-stone ways:
+</p>
+<ol style="margin-top: -.5em; margin-bottom: -.5em;">
+ <li>Objects are drawn from the
+ <a href="definitions.html#baseline">baseline</a>
+ down, including horizontal rules.</li>
+ <li>Objects begin precisely at the left indent supplied as
+ an argument to the macro.</li>
+ <li>Objects are drawn from left to right.</li>
+ <li>Enclosed objects (boxes, circles) are drawn from the
+ perimeter <i>inward</i>.</li>
+ <li>Objects return to their horizontal/vertical point of origin.</li>
+</ol>
+
+<p>
+The consistency means that once you&#8217;ve mastered the very
+simple order of arguments that applies to invoking graphical
+object macros, you can draw objects with full confidence that you
+know exactly where they&#8217;re placed and how much room they
+occupy. Furthermore, because all return to their point of origin,
+you&#8217;ll know exactly where you are on the page.
+</p>
+
+<h3 id="order" class="docs">Order of arguments</h3>
+
+<p>
+The order of arguments to the graphical object macros is the same
+for every macro:
+</p>
+<ul style="margin-top: -.5em; margin-bottom: -.5em;">
+ <li>the rule weight
+ <ul style="margin-left: -.75em;">
+ <li>the single word <kbd>SOLID</kbd> may be used in place
+ of <kbd>weight</kbd> if you want boxes or circles filled</li>
+ </ul></li>
+ <li>the indent from the current left margin at which to begin
+ the object
+ </li>
+ <li>the width of the object if applicable</li>
+ <li>the depth of the object if applicable</li>
+ <li>the colour of the object (optional)</li>
+</ul>
+
+<div class="macro-list-container">
+<h3 id="index-graphical" class="macro-list">Graphical objects macros</h3>
+
+<ul class="macro-list">
+ <li><a href="#drh">DRH</a>
+ &ndash; horizontal rules</li>
+ <li><a href="#drv">DRV</a>
+ &ndash; vertical rules</li>
+ <li><a href="#dbx">DBX</a>
+ &ndash; box</li>
+ <li><a href="#dcl">DCL</a>
+ &ndash; circles or ellipses</li>
+</ul>
+</div>
+
+<!-- -DRH- -->
+
+<div class="macro-id-overline">
+<h3 id="drh" class="macro-id">Drawing horizontal rules</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>DRH</b> <kbd class="macro-args">&lt;none&gt; | &lt;weight&gt; &lt;indent&gt; &lt;width&gt; [&lt;colour&gt;]</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;
+the argument to <kbd class="normal">&lt;weight&gt;</kbd> is in
+<a href="definitions.html#picaspoints" class="normal">points</a>,
+but do <span class="normal">not</span> append the
+<a href="definitions.html#unitsofmeasure">unit of measure</a>,
+<kbd class="normal">p</kbd>
+<br/>
+&bull;&nbsp;
+<kbd class="normal">&lt;indent&gt;</kbd>
+and
+<kbd class="normal">&lt;width&gt;</kbd>
+require a unit of measure
+<br/>
+&bull;&nbsp;
+arithmetic expressions to
+<kbd class="normal">&lt;indent&gt;</kbd>
+and
+<kbd class="normal">&lt;width&gt;</kbd>
+must be surrounded by parentheses
+</p>
+
+<p>
+If all you want is to draw a rule from your current left
+margin to your current right margin (in other words, a &quot;full
+measure&quot; rule), you may invoke <kbd>.DRH</kbd> without any
+arguments.
+</p>
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+DRH is the only graphical object macro that may be invoked
+without arguments. The weight (&#8220;thickness&#8221;) of
+the rule is determined by the argument you last gave the
+macro
+<a href="inlines.html#rule-weight">RULE_WEIGHT</a>.
+DRH, used this way, is exactly equivalent to entering the
+<a href="definitions.html#inlines">inline escape</a>
+<a href="inlines.html#inline-rule-mom"><kbd><span class="nobr">\*[RULE]</span></kbd></a>.
+</p>
+</div>
+
+<p style="margin-top: -.5em;">
+To draw horizontal rules of a specified width, you must, at
+a minimum, supply DRH with the arguments <kbd>weight,</kbd>
+<kbd>indent</kbd> (measured from the current left margin) and
+<kbd>width</kbd>.
+</p>
+
+<p>
+Optionally, you may give a <kbd>color</kbd> argument. The colour
+may be either one defined with
+<a href="color.html#newcolor">NEWCOLOR</a>,
+or a named X-color initialized with
+<a href="color.html#xcolor">XCOLOR</a>,
+or an X-color alias (again, initialized with XCOLOR).
+</p>
+
+<p>
+Say, for example, you want to draw a 1-1/4 point horizontal rule
+that starts 2 picas from the current left margin and runs for 3
+inches. To do so, you&#8217;d invoke <kbd>.DRH</kbd> like this:
+<br/>
+<span class="pre-in-pp">
+ weight width
+ | |
+ .DRH 1.25 2P 3i
+ |
+ indent
+</span>
+(Note that the rule weight argument, which is expressed in points,
+must not have the unit of measure <kbd>p</kbd> appended to it.)
+</p>
+
+<p>
+If, in addition, you want the rule blue:
+<br/>
+<span class="pre-in-pp">
+ .DRH 1.25 2P 3i blue
+</span>
+</p>
+
+<h3 class="docs">How mom handles the positioning of horizontal rules</h3>
+
+<p>
+Horizontal rules are drawn from left to right, and from the baseline
+down. &#8220;From the baseline down&#8221; means that if you request
+a rule with a weight of four points, the four points of rule fall
+entirely below the baseline.
+</p>
+
+<p>
+Furthermore, after the rule is drawn, mom returns you to the current
+left margin, at the same vertical position on the page as when DRH
+was invoked. In other words, DRH causes no movement on the page,
+either horizontal or vertical.
+</p>
+
+<!-- -DRV- -->
+
+<div class="macro-id-overline">
+<h3 id="drv" class="macro-id">Drawing vertical rules</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>DRV</b> <kbd class="macro-args">&lt;weight&gt; &lt;indent&gt; &lt;depth&gt; [&lt;colour&gt;]</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;
+the argument to <kbd class="normal">&lt;weight&gt;</kbd> is in
+<a href="definitions.html#picaspoints" class="normal">points</a>,
+but do <span class="normal">not</span> append the
+<a href="definitions.html#unitsofmeasure">unit of measure</a>,
+<kbd class="normal">p</kbd>
+<br/>
+&bull;&nbsp;
+<kbd class="normal">&lt;indent&gt;</kbd>
+and
+<kbd class="normal">&lt;depth&gt;</kbd>
+require a unit of measure
+<br/>
+&bull;&nbsp;
+arithmetic expressions to
+<kbd class="normal">&lt;indent&gt;</kbd>
+and
+<kbd class="normal">&lt;depth&gt;</kbd>
+must be surrounded by parentheses
+</p>
+
+<p>
+To draw vertical rules of a specified depth, you must, at
+a minimum, supply DRV with the arguments <kbd>weight,</kbd>
+<kbd>indent</kbd> (measured from the current left margin) and
+<kbd>depth</kbd>.
+</p>
+
+<p>
+Optionally, you may give a <kbd>color</kbd> argument. The colour
+may be either one defined with
+<a href="color.html#newcolor">NEWCOLOR</a>,
+or a named X-color initialized with
+<a href="color.html#xcolor">XCOLOR</a>,
+or an X-color alias (again, initialized with XCOLOR).
+</p>
+
+<p>
+Say, for example, you want to draw a 3/4-point vertical rule that
+starts 19-1/2 picas from the current left margin and has a depth of
+6 centimetres. To do so, you&#8217;d invoke <kbd>.DRV</kbd> like
+this:
+<br/>
+<span class="pre-in-pp">
+ weight depth
+ | |
+ .DRV .75 19P+6p 6c
+ |
+ indent
+</span>
+(Note that the rule weight argument, which is expressed in points,
+must not have the unit of measure <kbd>p</kbd> appended to it.)
+</p>
+
+<p>
+If, in addition, you want the rule red:
+<br/>
+<span class="pre-in-pp">
+ .DRV .75 19P+6p 6c red
+</span>
+</p>
+
+<h3 class="docs">How mom handles the positioning of vertical rules</h3>
+
+<p>
+Vertical rules are drawn from the baseline down, and from left to
+right. &quot;Left to right&quot; means that if you request a rule
+with a weight of four points, the four points of rule fall entirely
+to the right of the indent given to DRV.
+</p>
+
+<p>
+Furthermore, after the rule is drawn, mom returns you to the current
+left margin, at the same vertical position on the page as when DRV
+was invoked. In other words, DRV causes no movement on the page,
+either horizontal or vertical.
+</p>
+
+<!-- -DBX- -->
+
+<div class="macro-id-overline">
+<h3 id="dbx" class="macro-id">Drawing boxes</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>DBX</b> <kbd class="macro-args">&lt;weight&gt;|SOLID &lt;indent&gt; &lt;width&gt;|FULL_MEASURE &lt;depth&gt; [&lt;color&gt;]</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;
+the argument to <kbd class="normal">&lt;weight&gt;</kbd> is in
+<a href="definitions.html#picaspoints" class="normal">points</a>,
+but do <span class="normal">not</span> append the
+<a href="definitions.html#unitsofmeasure">unit of measure</a>
+<kbd class="normal">p</kbd>
+<br/>
+&bull;&nbsp;<kbd class="normal">&lt;indent&gt;</kbd>,
+<kbd class="normal">&lt;width&gt;</kbd>,
+and
+<kbd class="normal">&lt;depth&gt;</kbd>
+require a unit of measure
+<br/>
+&bull;&nbsp;
+arithmetic expressions to
+<kbd class="normal">&lt;indent&gt;</kbd>,
+<kbd class="normal">&lt;width&gt;</kbd>,
+and
+<kbd class="normal">&lt;depth&gt;</kbd>
+must be enclosed in parentheses.
+</p>
+
+<p>
+To draw boxes you must, at a minimum, supply DBX with the arguments
+<kbd>weight</kbd> or <kbd>SOLID</kbd>, <kbd>indent</kbd>,
+<kbd>width</kbd> or <kbd>FULL_MEASURE</kbd>, and <kbd>depth</kbd>.
+</p>
+
+<p>
+<kbd>weight</kbd> is the rule weight of outlined boxes, given in
+points but without the
+<a href="definitions.html#unitsofmeasure">unit of measure</a>
+<kbd>p</kbd> appended.
+</p>
+
+<p>
+If <kbd>SOLID</kbd> is given as the first argument, the box is
+filled rather than outlined and no <kbd>weight</kbd> argument should
+be supplied.
+</p>
+
+<p>
+<kbd>indent</kbd> is measured from the current left margin. If
+<kbd>FULL_MEASURE</kbd> is given, <kbd>indent</kbd> should be set to
+&#8220;0&#8221;.
+</p>
+
+<p>
+<kbd>width</kbd> is the width of the box with a
+<a href="definitions.html#unitsofmeasure">unit of measure</a>
+appended, caclculated from <kbd>indent</kbd> argument.
+</p>
+
+<p>
+If <kbd>FULL_MEASURE</kbd> is given instead of <kbd>width</kbd>,
+it circumvents having to calculate the width when left and/or right
+indents are in effect; mom draws the box from the current left
+margin to the current right margin. When no indents are in effect,
+<kbd>FULL_MEASURE</kbd> or <kbd>\n[.l]u</kbd>&#8212;the groff
+way of saying &#8220;the current line length&#8221;&#8212;have the
+same effect.
+</p>
+
+<p>
+Optionally, you may give a <kbd>color</kbd> argument. The colour
+may be either one defined with
+<a href="color.html#newcolor">NEWCOLOR</a>,
+or a named X-color initialized with
+<a href="color.html#xcolor">XCOLOR</a>,
+or an X-color alias (again, initialized with XCOLOR).
+</p>
+
+<p>
+Say, for example, you want to draw a 1/2 point outline box that
+starts one inch from the current left margin and has the dimensions
+12 picas x 6 picas. To do so, you&#8217;d invoke <kbd>.DBX</kbd>
+like this:
+<br/>
+<span class="pre-in-pp">
+ indent depth
+ | |
+ .DBX .5 1i 12P 6P
+ | |
+ weight width
+</span>
+(Note that the box weight argument, which is expressed in points,
+must not have the unit of measure <kbd>p</kbd> appended to it.)
+</p>
+
+<p>
+If you want the same box, but solid (&#8220;filled&#8221;) rather
+than drawn as an outline:
+<br/>
+<span class="pre-in-pp">
+ .DBX SOLID 1i 12P 6P
+</span>
+Additionally, if you want the box green:
+<br/>
+<span class="pre-in-pp">
+ .DBX .5 1i 12P 6P green
+</span>
+or
+<span class="pre-in-pp">
+ .DBX SOLID 1i 12P 6P green
+</span>
+</p>
+
+<h3 class="docs">How mom handles the positioning of boxes</h3>
+
+<p>
+Boxes are drawn from the baseline down, from left to right, and
+from the perimeter <i>inward</i>. &#8220;From the perimeter
+inward&#8221; means that if you request a box weight of six points,
+the 6-point rules used to draw the outline of the box fall entirely
+<i>within</i> the dimensions of the box.
+</p>
+
+<p>
+Furthermore, after the box is drawn, mom returns you to the current
+left margin, at the same vertical position on the page as when DBX
+was invoked. In other words, DBX causes no movement on the page,
+either horizontal or vertical.
+</p>
+
+<!-- -DCL- -->
+
+<div class="macro-id-overline">
+<h3 id="dcl" class="macro-id">Drawing circles (ellipses)</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>DCL</b> <kbd class="macro-args">&lt;weight&gt;|SOLID &lt;indent&gt; &lt;width&gt;|FULL_MEASURE &lt;depth&gt; [&lt;color&gt;]</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;
+the argument to <kbd class="normal">&lt;weight&gt;</kbd> is in
+<a href="definitions.html#picaspoints" class="normal">points</a>,
+but do <span class="normal">not</span> append the
+<a href="definitions.html#unitsofmeasure">unit of measure</a>
+<kbd class="normal">p</kbd>
+<br/>
+&bull;&nbsp;<kbd class="normal">&lt;indent&gt;</kbd>,
+<kbd class="normal">&lt;width&gt;</kbd>,
+and
+<kbd class="normal">&lt;depth&gt;</kbd>
+require a unit of measure
+<br/>
+&bull;&nbsp;
+arithmetic expressions to
+<kbd class="normal">&lt;indent&gt;</kbd>,
+<kbd class="normal">&lt;width&gt;</kbd>,
+and
+<kbd class="normal">&lt;depth&gt;</kbd>
+must be enclosed in parentheses.
+</p>
+
+<p>
+To draw circles you must, at a minimum, supply DCL with the arguments
+<kbd>weight</kbd> or <kbd>SOLID</kbd>, <kbd>indent</kbd>,
+<kbd>width</kbd> or <kbd>FULL_MEASURE</kbd>, and <kbd>depth</kbd>.
+</p>
+
+<p>
+<kbd>weight</kbd> is the rule weight of outlined circles, given in
+points but without the unit of measure
+<a href="definitions.html#unitsofmeasure">unit of measure</a>
+<kbd>p</kbd> appended.
+</p>
+
+<p>
+If <kbd>SOLID</kbd> is given as the first argument, the circle is
+filled rather than outlined and no <kbd>weight</kbd> argument should
+be supplied.
+</p>
+
+<p>
+<kbd>indent</kbd> is measured from the current left margin. If
+<kbd>FULL_MEASURE</kbd> is given, <kbd>indent</kbd> should be set to
+&#8220;0&#8221;.
+</p>
+
+<p>
+<kbd>width</kbd> is the width of the circle with a
+<a href="definitions.html#unitsofmeasure">unit of measure</a>
+appended, caclculated from <kbd>indent</kbd> argument.
+</p>
+
+<p>
+If <kbd>FULL_MEASURE</kbd> is given instead of <kbd>width</kbd>,
+it circumvents having to calculate the width when left and/or right
+indents are in effect; mom draws the circle from the current left
+margin to the current right margin. When no indents are in effect,
+<kbd>FULL_MEASURE</kbd> or <kbd>\n[.l]u</kbd>&#8212;the groff
+way of saying &#8220;the current line length&#8221;&#8212;have the
+same effect.
+</p>
+
+<p>
+Optionally, you may give a <kbd>color</kbd> argument. The colour
+may be either one defined with
+<a href="color.html#newcolor">NEWCOLOR</a>,
+or a named X-color initialized with
+<a href="color.html#xcolor">XCOLOR</a>,
+or an X-color alias (again, initialized with XCOLOR).
+</p>
+
+<p>
+Say, for example, you want to draw a 1/2 point outline circle that
+starts one inch from the current left margin and has the dimensions
+12 picas x 6 picas. To do so, you&#8217;d invoke <kbd>.DCL</kbd>
+like this:
+<br/>
+<span class="pre-in-pp">
+ indent depth
+ | |
+ .DCL .5 1i 12P 6P
+ | |
+ weight width
+</span>
+(Note that the circle weight argument, which is expressed in points,
+must not have the unit of measure <kbd>p</kbd> appended to it.)
+</p>
+
+<p>
+If you want the same circle, but solid (&#8220;filled&#8221;) rather
+than drawn as an outline:
+<br/>
+<span class="pre-in-pp">
+ .DCL SOLID 1i 12P 6P
+</span>
+Additionally, if you want the circle green:
+<br/>
+<span class="pre-in-pp">
+ .DCL .5 1i 12P 6P green
+</span>
+or
+<span class="pre-in-pp">
+ .DCL SOLID 1i 12P 6P green
+</span>
+</p>
+
+
+<h3 class="docs">How mom handles the positioning of circles (ellipses)</h3>
+
+<p>
+Circles (ellipses) are drawn from the baseline down, from left
+to right, and from the perimeter <i>inward</i>. &#8220;From the
+perimeter inward&#8221; means that if you request a circle weight of
+six points, the 6-point rule used to draw the outline of the circle
+or ellipse falls entirely <i>within</i> the dimensions of the
+circle or ellipse.
+</p>
+
+<p>
+Furthermore, after the circle is drawn, mom returns you to the
+current left margin, at the same vertical position on the page as
+when DCL was invoked. In other words, DCL causes no movement on the
+page, either horizontal or vertical.
+</p>
+
+<div class="rule-long"><hr/></div>
+
+<!-- Navigation links -->
+<table style="width: 100%; margin-top: 12px;">
+<tr>
+ <td style="width: 33%;"><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="width: 33%; text-align: center;"><a href="#top">Top</a></td>
+ <td style="width: 33%; text-align: right;"><a href="docprocessing.html#top">Next: Document processing</a></td>
+</tr>
+</table>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/momdoc/headfootpage.html b/contrib/mom/momdoc/headfootpage.html
new file mode 100644
index 0000000..1c11ab1
--- /dev/null
+++ b/contrib/mom/momdoc/headfootpage.html
@@ -0,0 +1,2341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>Mom -- Document processing, page headers/footers and pagination</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div id="top" class="page">
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+<tr>
+ <td><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="text-align: right;"><a href="rectoverso.html#top">Next: Recto/verso printing, collating</a></td>
+</tr>
+</table>
+
+<h1 class="docs">Page headers/footers, pagination</h1>
+
+<div style="text-align: center;">
+<ul class="no-enumerator" style="margin-left: -2.5em;">
+ <li><a href="#headfootpage-intro">Introduction &ndash; VERY IMPORTANT; read me!</a></li>
+ <li> <a href="#pagination-note">An important note on pagination</a></li>
+ <li><a href="#description-general">General description of headers/footers</a></li>
+ <li><a href="#header-style">Default specs for headers/footers</a></li>
+ <li><a href="#vertical-spacing">Vertical placement and spacing of headers/footers</a></li>
+</ul>
+</div>
+
+<div class="rule-medium"><hr/></div>
+
+<h2 id="toc-doc-head-foot-page" class="docs" style="text-align: center;">Table of contents</h2>
+
+<h3 class="toc toc-docproc-header" style="margin-top: 1em;"><a class="header-link" href="#headfoot-management">Managing page headers and footers</a></h3>
+<ul class="toc-docproc" style="margin-top: .5em;">
+ <li><a href="#headers">HEADERS</a> &ndash; on or off</li>
+ <li><a href="#footers">FOOTERS</a> &ndash; on or off</li>
+ <li><a href="#footer-on-first-page">FOOTER_ON_FIRST_PAGE</a></li>
+</ul>
+<h3 class="toc toc-docproc-header"><a class="header-link" href="#headfoot-control">Control macros for headers/footers</a></h3>
+ <ul class="toc-docproc" style="margin-top: .5em;">
+ <li><a href="#index-headfoot-control">Header/footer control macros and defaults</a>
+ <ul class="toc-docproc">
+ <li><a href="#hdrftr-strings">Header/footer strings</a>
+ <ul class="toc-docproc">
+ <li><a href="#reserved-strings">Using mom&#8217;s reserved strings in header/footer definitions</a> (TITLE, AUTHOR, etc.)</li>
+ </ul></li>
+ <li><a href="#hdrftr-style">Header/footer style</a>
+ <ul class="toc-docproc">
+ <li><a href="#hdrftr-style-global">Global changes</a></li>
+ <li><a href="#hdrftr-style-part">Part-by-part changes</a></li>
+ </ul></li>
+ <li><a href="#hdrftr-vertical">Vertical placement and spacing of headers/footers</a>
+ <ul class="toc-docproc">
+ <li><a href="#hdrftr-margin">HEADER_MARGIN&nbsp;/&nbsp;FOOTER_MARGIN</a>
+ <ul class="toc-docproc no-enumerator" style="margin-left: -2em;">
+ <li>&ndash;&nbsp;<a href="#footer-margin">Important: FOOTER_MARGIN and bottom margins</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a href="#hdrftr-separator">The header/footer separator rule</a>
+ <ul class="toc-docproc">
+ <li><a href="#hdrftr-rule">HEADER_RULE</a> &ndash; on or off</li>
+ <li><a href="#hdrftr-rule-weight">HEADER_RULE_WEIGHT</a> &ndash; weight of the rule</li>
+ <li><a href="#hdrftr-rule-gap">HEADER_RULE_GAP</a> &ndash; distance of rule from header/footer</li>
+ <li><a href="#hdrftr-rule-color">HEADER_RULE_COLOR</a> &ndash; colour of the header/footer rule</li>
+ </ul></li>
+ </ul></li>
+</ul>
+<h3 class="toc toc-docproc-header"><a class="header-link" href="#userdef-hdrftr-rv">User-defined, single string recto/verso headers/footers</a></h3>
+<ul class="toc-docproc" style="margin-top: .5em;">
+ <li><a href="#hdrftr-recto">HEADER_RECTO, HEADER_VERSO</a>
+ <ul style="margin-left: -.5em">
+ <li><a href="#userdef-hdrftr">User-defined, single string headers/footers (no recto/verso)</a></li>
+ <li><a href="#padding-hdrftr">Padding the header-recto/header-verso string</a></li>
+ </ul></li>
+</ul>
+<h3 class="toc toc-docproc-header"><a class="header-link" href="#headers-and-footers-intro">Headers and footers on the same page</a></h3>
+<h3 class="toc toc-docproc-header" style="margin-top: .75em;"><a class="header-link" href="#pagination-intro">Pagination</a></h3>
+<ul class="toc-docproc" style="margin-top: .5em;">
+ <li><a href="#index-pagination">Pagination macros</a></li>
+ <li><a href="#index-paginate-control">Pagination control macros and defaults</a></li>
+</ul>
+<h3 class="toc toc-docproc-header"><a class="header-link" href="#blank-pages">Inserting blank pages into a document</a></h3>
+
+<div class="rule-medium" style="margin-top: 1.5em;"><hr/></div>
+
+<h2 id="headfootpage-intro" class="macro-group">Managing page headers and footers</h2>
+
+<div id="headerfooter" class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span>
+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.
+</p>
+
+<p class="tip-bottom">
+Furthermore, any
+<a href="definitions.html#controlmacro">control macro</a>
+that begins with HEADER_ may be used to control footers, simply by
+replacing HEADER_ with FOOTER_.
+</p>
+</div>
+
+<p style="margin-top: -.75em;">
+<a href="definitions.html#header">Headers</a>
+and
+<a href="definitions.html#footer">footers</a>,
+as defined in the section
+<a href="definitions.html#mom">Mom&#8217;s Document Processing Terms</a>,
+are those parts of a document that contain information about the document
+itself which appear in the margins either above or below
+<a href="definitions.html#running">running text</a>.
+They are, in all respects but two, identical. The differences are:
+</p>
+<ol style="margin-top: -.5em; margin-bottom: -.5em;">
+ <li>headers appear in the margin <i>above</i> running text while
+ footers appear in the margin <i>beneath</i> running text;
+ </li>
+ <li>the (optional) rule that separates headers from running
+ text appears <i>below</i> the header while
+ the (optional) rule that separates footers from running
+ text appears <i>above</i> the footer.
+ </li>
+</ol>
+
+<div id="pagination-note" class="box-tip" style="margin-top: 1.5em;">
+<p class="tip">
+<span class="note">Note:</span>
+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.
+</p>
+</div>
+
+<div id="author-note" class="box-tip">
+<p class="tip">
+<span class="note">Author&#8217;s note:</span>
+Left to their own devices (i.e. if you&#8217;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.
+</p>
+</div>
+
+<h3 id="description-general" class="docs">General description of headers/footers</h3>
+
+<p>
+Headers comprise three distinct parts: a left part, a centre part,
+and a right part. Each part contains text (a &#8220;string&#8221;)
+that identifies some aspect of the document as a whole.
+</p>
+
+<p>
+The left part (&#8220;header-left&#8221;) lines up with the
+document&#8217;s left margin. The centre part (&#8220;header
+centre&#8221;) is centred on the document&#8217;s line length.
+The right part (&#8220;header-right&#8221;) lines up with the
+document&#8217;s right margin. Not all parts need contain a string,
+and if you don&#8217;t want headers at all, you can turn them off
+completely.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note to groff experts:</span>
+Although mom&#8217;s headers resemble the three-part titles
+generated by <kbd>.tl</kbd>, they&#8217;re in no way related to it,
+nor based upon it. <kbd>.tl</kbd> is not used at all in mom.
+</p>
+</div>
+
+<p>
+Normally, mom fills headers with strings appropriate to the document
+type selected by
+<a href="docprocessing.html#doctype">DOCTYPE</a>,
+with the author left, the document title right, and chapter or
+document type information in the centre. You can, however, supply
+whatever strings you like&mdash;including page numbers&mdash;to go
+in any part of headers. What&#8217;s more, you can set the family,
+font, size, colour and capitalization style (caps, caps/lower-case,
+or smallcaps) for each header part individually.
+</p>
+
+<p>
+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. You can increase or decrease the space between the header
+and the rule if you like (with
+<kbd><a href="#hdrftr-rule-gap">HEADER_RULE_GAP</a></kbd>),
+or remove it completely.
+</p>
+
+<h3 id="header-style" class="docs">Default specs for headers/footers</h3>
+
+<p>
+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
+<a href="docprocessing.html#doctype">DOCTYPE</a>.)
+</p>
+
+<div class="defaults-container" style="padding-bottom: 8px;">
+<p class="defaults" style="padding-top: 6px; padding-bottom: 6px; text-align: center;">
+<i>Note:</i> Except for capitalization (all caps or caps/lower-case),
+these defaults apply only to
+<a href="docprocessing.html#printstyle">PRINTSTYLE&nbsp;<kbd>TYPESET</kbd></a>.
+</p>
+<span class="pre defaults">
+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 <a href="definitions.html#running">running text</a>
+</span>
+</div>
+
+<p style="margin-top: -1.5em;">
+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
+<a href="#hdrftr-plain">HEADER_PLAIN</a>
+that removes all type adjustments to headers. The
+type specs for running text 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.
+</p>
+
+<h3 id="vertical-spacing" class="docs">Vertical placement and spacing of headers/footers</h3>
+
+<p>
+As explained in the section,
+<a href="docprocessing.html#behaviour">Typesetting macros during document processing</a>,
+the top and bottom margins of a mom document are the vertical start
+and end positions of
+<a href="definitions.html#running">running text</a>,
+not the vertical positions of headers or footers, which, by definition,
+appear in the margins above (or below) running text.
+</p>
+
+<p>
+The vertical placement of headers is controlled by the macro
+<a href="#hdrftr-margin">HEADER_MARGIN</a>,
+which establishes the
+<a href="definitions.html">baseline</a>
+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.
+</p>
+
+<p>
+FOOTER_MARGIN is the counterpart to HEADER_MARGIN, and establishes
+the baseline position of footers relative to the bottom edge of the
+page.
+</p>
+
+<p>
+The distance between headers and the start
+of running text can be controlled with the macro
+<a href="#hdrftr-gap">HEADER_GAP</a>,
+effectively making HEADER_MARGIN + HEADER_GAP the top margin of
+running text unless you give mom a literal top margin (with
+<a href="typesetting.html#t-margin">T_MARGIN</a>)
+or
+<a href="typesetting.html#page">PAGE</a>,
+in which case she ignores HEADER_GAP and begins the running text at
+whatever top margin you give.
+</p>
+
+<p>
+FOOTER_GAP and
+<a href="typesetting.html#b-margin">B_MARGIN</a>
+work similarly, except they determine where running text <i>ends</i>
+on the page. (See
+<a href="#footer-margin">Important &ndash; footer margin and bottom margins</a>
+for a warning about possible conflicts between the footer margin and
+the bottom margin.)
+</p>
+
+<p>
+Confused? Mom apologizes. It&#8217;s really quite simple. By
+default, mom sets headers <span class="nobr">4-1/2</span>
+<a href="definitions.html#picaspoints">picas</a>
+down from the top of the page and begins the running text 3 picas
+(the HEADER_GAP) beneath that, which means the effective top margin
+of the running text is <span class="nobr">7-1/2</span> picas (visually approx. 1
+inch). However, if you give mom a literal top margin (with
+<a href="typesetting.html#t-margin">T_MARGIN</a>),
+she ignores the HEADER_GAP and starts the running text at whatever
+top margin you give.
+</p>
+
+<p>
+Footers are treated similarly. 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).
+However, if you give mom a literal bottom margin (with
+<a href="typesetting.html#b-margin">B_MARGIN</a>),
+she ignores the FOOTER_GAP and interrupts the processing of running
+text at whatever bottom margin you give.
+</p>
+
+<p>
+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
+<a href="#index-paginate-control">Pagination control</a>.
+</p>
+
+<div class="rule-short"><hr/></div>
+
+<!-- ======================================================================== -->
+
+<h2 id="headfoot-management" class="macro-group">Managing headers/footers</h2>
+
+<p>
+The following are the basic macros for turning
+<a href="definitions.html#header">headers</a>
+or
+<a href="definitions.html#footer">footers</a>
+on or off. They should be invoked prior to
+<a href="docprocessing.html#start">START</a>.
+</p>
+
+<p>
+By default, mom prints page headers. If you turn
+them off, she will begin the
+<a href="definitions.html#running">running text</a>
+on each page with a default top margin of 6
+<a href="definitions.html#picaspoints">picas</a>
+unless you have requested a different top margin (with
+<a href="typesetting.html#t-margin">T_MARGIN</a>)
+prior to
+<a href="docprocessing.html#start">START</a>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+<a href="#headers">HEADERS</a>
+and
+<a href="#footers">FOOTERS</a>
+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&#8217;d prefer footers in a
+document, you need only invoke
+<kbd><a href="#footers">.FOOTERS</a></kbd>;
+there&#8217;s no need to turn headers off first.
+</p>
+</div>
+
+<p style="margin-top: -.5em">
+If you need both headers and footers, there&#8217;s a special macro
+<a href="#headers-and-footers">HEADERS_AND_FOOTERS</a>
+that allows you to set it up.
+</p>
+
+<div class="macro-list-container">
+<h3 id="index-hdrftr" class="macro-list">Header/footer macros</h3>
+<ul class="macro-list">
+ <li><a href="#headers">HEADERS</a> &ndash; on or off</li>
+ <li><a href="#footers">FOOTERS</a> &ndash; on or off</li>
+ <li><a href="#footer-on-first-page">FOOTER_ON_FIRST_PAGE</a></li>
+ <li><a href="#userdef-hdrftr-rv">User-defined, single string recto/verso headers/footers</a>
+ <ul>
+ <li><a href="#hdrftr-rectoverso">HEADER_RECTO, HEADER_VERSO</a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#userdef-hdrftr">User-defined, single string headers/footers (no recto/verso)</a></li>
+ </ul></li>
+ <li><a href="#reserved-strings">Using mom&#8217;s reserved strings in header/footer definitions</a>
+ (title, author, etc.)
+ </li>
+ </ul></li>
+ <li><a href="#headers-and-footers-intro">HEADERS_AND_FOOTERS</a> &ndash;
+ putting both headers and footers on document pages
+ </li>
+ <li><a href="#headfoot-control">Header and footer control macros</a></li>
+</ul>
+</div>
+
+<!-- -HEADERS- -->
+
+<div class="macro-id-overline">
+<h3 class="macro-id">Headers</h3>
+</div>
+
+<div id="headers" class="box-macro-args">
+Macro: <b>HEADERS</b> <kbd class="macro-args">toggle</kbd>
+</div>
+
+<p>
+<a href="definitions.html#header">Page headers</a>
+are on by default. If you don&#8217;t want them, turn them off by
+invoking <kbd>.HEADERS</kbd> with any argument (<kbd>OFF</kbd>,
+<kbd>QUIT</kbd>, <kbd>END</kbd>, <kbd>X</kbd>...), e.g.
+<br/>
+<span class="pre-in-pp">
+ .HEADERS OFF
+</span>
+</p>
+
+<p>
+<b>NOTE:</b> HEADERS automatically
+disables
+<a href="definitions.html#footer">footers</a>
+but not the page numbers that normally appear at the bottom of the
+page. If you want both headers and footers, you must use the macro
+<a href="#headers-and-footers">HEADERS_AND_FOOTERS</a>.
+</p>
+
+<p>
+<b>ADDITIONAL NOTE:</b> If HEADERS are OFF, mom&#8217;s normal top
+margin for
+<a href="definitions.html#running">running text</a>
+(7.5
+<a href="definitions.html#picaspoints">picas</a>)
+changes to 6 picas (visually approx. 1 inch). This does NOT apply
+to the situation where footers have been explicitly turned on
+(with
+<kbd><a href="#footers">FOOTERS</a></kbd>).
+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.)
+</p>
+
+<!-- -FOOTERS- -->
+
+<div class="macro-id-overline">
+<h3 id="footers" class="macro-id">Footers</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>FOOTERS</b> <kbd class="macro-args">toggle</kbd>
+</div>
+
+<p>
+<a href="definitions.html#footer">Page footers</a>
+are off by default. If you want them instead of
+<a href="definitions.html#header">headers</a>,
+turn them on by invoking
+<kbd>.FOOTERS</kbd> without an argument, e.g.
+<br/>
+<span class="pre-in-pp">
+ .FOOTERS
+</span>
+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.
+</p>
+
+<p>
+<b>NOTE:</b> If you want both headers and footers, you must use the
+macro
+<a href="#headers-and-footers">HEADERS_AND_FOOTERS</a>.
+</p>
+
+<p>
+<b>NOTE:</b> 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
+<a href="rectoverso.html#collate">COLLATE</a>.
+If you don&#8217;t want this behaviour, you can change it with
+<kbd><a href="#pagenum-on-first-page">PAGENUM_ON_FIRST_PAGE</a></kbd>.
+</p>
+
+<!-- -FOOTER_ON_FIRST_PAGE- -->
+
+<div class="macro-id-overline">
+<h3 id="footer-on-first-page" class="macro-id">Footer on first page</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>FOOTER_ON_FIRST_PAGE</b> <kbd class="macro-args">toggle</kbd>
+</div>
+
+<p>
+If you invoke
+<a href="#footers"><kbd>.FOOTERS</kbd></a>,
+mom, by default, does not print a footer on the
+first page of the document. (The
+<a href="definitions.html">docheader</a>
+on page 1 makes it redundant.) However, should you wish a footer on
+page 1, invoke <kbd>.FOOTER_ON_FIRST_PAGE</kbd> without any argument.
+</p>
+
+<div class="rule-short"><hr/></div>
+
+<h2 id="headfoot-control" class="macro-group">Control macros for headers/footers</h2>
+
+<p>
+Virtually every part of headers (and footers; see the note on how
+<a href="#headerfooter">&#8220;headers&#8221; means &#8220;footers&#8221;</a>
+in the
+<a href="#headfootpage-intro">Introduction</a>
+to headers/footers) can be designed to your own specifications.
+</p>
+
+<div class="macro-list-container">
+<h3 id="index-headfoot-control" class="macro-list">Header/footer control macros and defaults</h3>
+
+<ol style="margin-top: -1.5em; padding-bottom: 6px;">
+ <li><a href="#hdrftr-strings">Header/footer strings</a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#hdrftr-left">HEADER_LEFT</a></li>
+ <li><a href="#hdrftr-centre">HEADER_CENTER</a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#hdrftr-centre-pad">Padding the header-centre string</a></li>
+ </ul></li>
+ <li><a href="#hdrftr-right">HEADER_RIGHT</a></li>
+ <li><a href="#reserved-strings">Using mom&#8217;s reserved strings in header/footer definitions</a>
+ (e.g. <kbd>\E*[$TITLE]</kbd> when you want
+ the title, <kbd>\E*[$AUTHOR]</kbd> when you want the author, etc.)
+ </li>
+ <li><a href="#page-number-symbol">Replacing header-left, centre or right with the page number</a></li>
+ <li><a href="#page-number-incl">Including the page number in header-left, centre or right</a></li>
+ </ul></li>
+ <li><a href="#hdrftr-style">Header/footer style</a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#hdrftr-style-global">Global changes</a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#hdrftr-plain">HEADER_PLAIN</a> &ndash; disable default adjustments to header parts</li>
+ <li><a href="#hdrftr-global-family">HEADER_FAMILY</a> &ndash; family for entire header</li>
+ <li><a href="#hdrftr-global-size">HEADER_SIZE</a> &ndash; size for entire header</li>
+ <li><a href="#hdrftr-color">HEADER_COLOR</a> &ndash; colourize the header</li>
+ </ul></li>
+ <li><a href="#hdrftr-style-part">Part-by-part changes</a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#_family">_FAMILY</a> &ndash; left, centre or right family</li>
+ <li><a href="#_font">_FONT</a> &ndash; left, centre or right font</li>
+ <li><a href="#_size">_SIZE</a> &ndash; left, centre or right size</li>
+ <li><a href="#_caps">_CAPS</a> &ndash; left, centre or right all caps</li>
+ <li><a href="#_smallcaps">_SMALLCAPS</a> &ndash; left, centre or right smallcaps</li>
+ <li><a href="#_color">_COLOR</a> &ndash; left, centre or right colour</li>
+ </ul></li>
+ </ul></li>
+ <li><a href="#hdrftr-vertical">Header/footer vertical placement and spacing</a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#hdrftr-margin">HEADER_MARGIN</a></li>
+ <li><a href="#hdrftr-gap">HEADER_GAP</a></li>
+ </ul></li>
+ <li><a href="#hdrftr-separator">Header/footer separator rule</a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#hdrftr-rule">HEADER_RULE</a></li>
+ <li><a href="#hdrftr-rule-weight">HEADER_RULE_WEIGHT</a></li>
+ <li><a href="#hdrftr-rule-gap">HEADER_RULE_GAP</a></li>
+ <li><a href="#hdrftr-rule-color">HEADER_RULE_COLOR</a></li>
+ </ul></li>
+</ol>
+</div>
+
+<!-- -HDRFTR_STRINGS- -->
+
+<h4 id="hdrftr-strings" class="docs">1. Header/footer strings</h4>
+
+<div id="hdrftr-left" class="box-macro-args" style="margin-top: 1em;">
+&#8221;Macro: <b>HEADER_LEFT</b> <kbd class="macro-args">&#8220;&lt;text of header-left&gt; | #</kbd>
+</div>
+
+<div id="hdrftr-centre" class="box-macro-args" style="margin-top: 1em;">
+&#8221;Macro: <b>HEADER_CENTER</b> <kbd class="macro-args">&#8220;&lt;text of header-centre&gt; | #</kbd>
+</div>
+
+<div id="hdrftr-right" class="box-macro-args" style="margin-top: 1em;">
+&#8221;Macro: <b>HEADER_RIGHT</b> <kbd class="macro-args">&#8220;&lt;text of header-right&gt; | #</kbd>
+</div>
+
+<p>
+To change the text (the &#8220;string&#8221;) 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&#8217;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:
+<br/>
+<span class="pre-in-pp">
+ .HEADER_LEFT "R. Stallman, E. Raymond"
+</span>
+</p>
+
+<p>
+Because the arguments to HEADER_LEFT, _CENTER,
+and _RIGHT are
+<a href="definitions.html#stringargument">string arguments</a>,
+they must be enclosed in double-quotes.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Replace HEADER_, above, with FOOTER_ to change the strings in
+footers.
+</p>
+</div>
+
+<h3 id="hdrftr-centre-pad" class="docs">Padding the header/footer centre string</h3>
+
+<div class="box-macro-args" style="margin-top: 1em;">
+Macro: <b>HEADER_CENTER_PAD</b> <kbd class="macro-args">LEFT | RIGHT &lt;amount of space by which to pad centre string left or right&gt;</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+By default, mom centres the header-centre string on the line length
+in effect for page headers.
+</p>
+
+<p>
+In some cases, notably when the header-left or header-right
+strings are particularly long, the effect isn&#8217;t pretty. The
+offendingly long header-left or right crowds, or even overprints,
+the header-centre. That&#8217;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.
+</p>
+
+<p>
+For example, say your document is an outline for a novel called
+<i>By the Shores of Lake Attica</i>. You&#8217;ve told mom you want
+<br/>
+<span class="pre-in-pp">
+ .DOCTYPE NAMED "Outline"
+</span>
+but when you preview your work, you see that &#8220;Outline&#8221;,
+in the centre of the page header, is uncomfortably close to the
+title, which is to the right. By invoking
+<br/>
+<span class="pre-in-pp">
+ .HEADER_CENTER_PAD RIGHT 3P
+</span>
+you can scoot the word "Outline" over three
+<a href="definitions.html#picaspoints">picas</a>
+<i>to the left</i> (because the padding is added onto the right of the
+string) so that your head looks nicely spaced out. Invoking
+<kbd>.HEADER_CENTER_PAD</kbd> with the <kbd>LEFT</kbd> argument puts
+the padding on the left side of the string so that it scoots
+right.
+</p>
+
+<p>
+Most reassuring of all is that if you use HEADER_CENTER_PAD
+conjunction with
+<a href="rectoverso.html#recto-verso">RECTO_VERSO</a>,
+mom will pad the centre string appropriately left OR right,
+depending on which page you&#8217;re on, without you having to tell
+her to do so.
+</p>
+
+<h3 id="reserved-strings" class="docs">Using mom&#8217;s reserved strings in header/footer definitions</h3>
+
+<p>
+As pointed out in the
+<a href="#author-note">Author&#8217;s note</a>
+in the introduction to headers/footers, headers and footers are
+something you don&#8217;t normally have to worry much about. Mom
+usually knows what to do.
+</p>
+
+<p>
+However, situations do arise where you need to manipulate what goes
+in the header/footer strings, setting and resetting them as you go
+along.
+</p>
+
+<p>
+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
+<a href="rectoverso.html#collate">collated</a>
+documents, and you want the word "Endnotes" to go in the header
+centre position of the endnotes, but want, say, the
+<a href="docprocessing.html#title">TITLE</a>
+to go back into the centre position for the next output document.
+</p>
+
+<p>
+In scenarios like the above, mom has a number of reserved strings
+you can plug into the HEADER_LEFT, _CENTER and _RIGHT macros. They
+are:
+<br/>
+<span class="pre-in-pp">
+ \E*[$TITLE] &mdash;the current argument passed to .TITLE
+ \E*[$DOCTITLE] &mdash;the current argument passed to .DOCTITLE
+ \E*[$DOC_TYPE] &mdash;the NAMED argument passed to .DOCTYPE
+ \E*[$AUTHOR] &mdash;the current first argument passed to .AUTHOR
+ \E*[$AUTHOR_1...9] &mdash;the current arguments passed to .AUTHOR
+ \E*[$AUTHORS] &mdash;a comma-separated concatenated string
+ of all the current arguments passed to .AUTHOR
+ (i.e. a list of authors)
+ \E*[$CHAPTER_STRING] &mdash;the current argument passed to .CHAPTER_STRING,
+ if invoked, otherwise, "Chapter"
+ \E*[$CHAPTER] &mdash;the current argument (typically a number) passed
+ to .CHAPTER
+ \E*[$CHAPTER_TITLE] &mdash;the current argument passed to .CHAPTER_TITLE
+</span>
+Returning to the scenario above, first, you&#8217;d define a centre
+string for the endnotes page:
+<br/>
+<span class="pre-in-pp">
+ .HEADER_CENTER "Endnotes"
+</span>
+Then, you&#8217;d output the endnotes:
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTES
+</span>
+Then, you&#8217;d prepare mom for the next document:
+<br/>
+<span class="pre-in-pp">
+ .COLLATE
+ .TITLE "New Doc Title"
+ .AUTHOR "Josephine Blough"
+</span>
+Then, you&#8217;d redefine the header-centre string using the
+reserved string <kbd><span class="nobr">\*[$TITLE]</span></kbd>, like this:
+<br/>
+<span class="pre-in-pp">
+ .HEADER_CENTER "\E*[$TITLE]"
+</span>
+And last, you&#8217;d do:
+<br/>
+<span class="pre-in-pp">
+ .START
+</span>
+Voilà! Any argument you pass to
+<a href="docprocessing.html#title">TITLE</a>
+from here on in (say, for subsequent documents) is back in the
+header-centre position. Here&#8217;s the whole routine again:
+<br/>
+<span class="pre-in-pp">
+ .HEADER_CENTER "Endnotes"
+ .ENDNOTES
+ .COLLATE
+ .TITLE "New Doc Title"
+ .AUTHOR "Josephine Blough"
+ .HEADER_CENTER "\E*[$TITLE]"
+ .START
+</span>
+</p>
+
+<p>
+If need be, you can concatenate the strings, as in the following
+example.
+<br/>
+<span class="pre-in-pp">
+ .HEADER_CENTER "\E*[$CHAPTER_STRING] \E*[$CHAPTER]"
+</span>
+which, assuming a <kbd>.CHAPTER_STRING</kbd> of
+<kbd>"Chapter"</kbd> and a <kbd>.CHAPTER</kbd> of
+<kbd>"2"</kbd>, would put &#8220;Chapter 2&#8221; in the
+header-centre position.
+</p>
+
+<h3 id="page-number-symbol" class="docs">Replacing header-left, -centre or -right with the page number</h3>
+
+<p>
+If you would like to have the current page number appear in the
+header-left, -centre, or -right position instead of a text string,
+invoke the appropriate macro, above, with the single argument
+<kbd>#</kbd> (the &#8220;number&#8221; or &#8220;pound&#8221; sign).
+Do not surround the pound size with double-quotes, as you would
+normally do if the argument to <kbd>.HEADER_CENTER</kbd> were a
+string. For example,
+<br/>
+<span class="pre-in-pp">
+ .HEADER_CENTER #
+</span>
+(notice, no double-quotes) will print the current page number in the
+centre part of headers.
+</p>
+
+<h3 id="page-number-incl" class="docs">Including the page number in header-left, -CENTER or -right</h3>
+
+<p>
+If you would like to <i>include</i> the current page number in the
+string you pass to HEADER_LEFT, _CENTER, or _RIGHT, (as
+opposed to replacing the string with the page number), use the
+special
+<a href="definitions.html#inlines">inline escape</a>
+<kbd><span class="nobr">\*[PAGE#]</span></kbd> in the string argument.
+</p>
+
+<p>
+For example, say you have a document that&#8217;s ten pages long,
+and you want header-right to say &#8220;page &lt;whichever&gt; of
+10&#8221;, invoke <kbd>.HEADER_RIGHT</kbd> as follows:
+<br/>
+<span class="pre-in-pp">
+ .HEADER_RIGHT "page \*[PAGE#] of 10"
+</span>
+The header-right of page two will read &#8220;page 2 of 10&#8221;,
+the header-right of page three will read &#8220;page 3 of 10&#8221;,
+and so on.
+</p>
+
+<!-- -HDRFTR_STYLE- -->
+
+<h4 id="hdrftr-style" class="docs">2. Header/footer style</h4>
+
+<h5 id="hdrftr-style-global" class="docs" style="margin-top: 1em;">Global changes</h5>
+
+<p style="margin-top: .5em;">
+The following macros allow you to make changes that affect all parts
+of the header at once.
+</p>
+
+<div class="macro-list-container">
+<ul style="padding-top: 6px; padding-bottom: 6px; margin-left: -.5em;">
+ <li><a href="#hdrftr-plain">HEADER_PLAIN</a></li>
+ <li><a href="#hdrftr-global-family">HEADER_FAMILY</a></li>
+ <li><a href="#hdrftr-global-size">HEADER_SIZE</a></li>
+ <li><a href="#hdrftr-color">HEADER_COLOR</a></li>
+</ul>
+</div>
+
+<div id="hdrftr-plain" class="box-macro-args">
+Macro: <b>HEADER_PLAIN</b>
+</div>
+
+<p>
+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&#8217;s defaults,
+invoke <kbd>.HEADER_PLAIN</kbd> 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, point size and
+colour as she uses in paragraphs.
+</p>
+
+<p>
+Replace HEADER_, above, with FOOTER_ to disable mom&#8217;s default
+behaviour for the various elements of footer style.
+</p>
+
+<div id="hdrftr-global-family" class="box-macro-args">
+Macro: <b>HEADER_FAMILY</b> <kbd class="macro-args">&lt;family&gt;</kbd>
+</div>
+
+<p>
+By default, mom uses the default document family for headers. If
+you would like her to use another
+<a href="definitions.html#family">family</a>
+in headers, invoke <kbd>.HEADER_FAMILY</kbd> with the identifier
+for the family you want. The argument is the same as for the
+typesetting macro
+<a href="typesetting.html#family">FAMILY</a>.
+</p>
+
+<p>
+Replace HEADER_, above, with FOOTER_ to change the footer family.
+</p>
+
+<div id="hdrftr-global-size" class="box-macro-args">
+Macro: <b>HEADER_SIZE</b> <kbd class="macro-args">&lt;+|-number of points&gt;</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Argument is relative to the point size of type in paragraphs.
+See
+<span style="font-style: normal;"><a href="docelement.html#control-macro-args">Arguments to the control macros</a></span>
+for an explanation of how control macros ending in
+_SIZE work.
+</p>
+
+<p>
+By default, mom makes small adjustments to the size of each part
+of a header to achieve an aesthetically pleasing result. If
+you&#8217;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 <kbd>.HEADER_SIZE</kbd> with + or - the number of <a
+href="definitions.html#picaspoints">points</a> (fractions allowed)
+by which you want her to in/decrease the size of headers. For
+example,
+<br/>
+<span class="pre-in-pp">
+ .HEADER_SIZE +.75
+</span>
+increases the size of every part of a header by 3/4 of a point while
+respecting mom&#8217;s own little size changes.
+</p>
+
+<p>
+Replace HEADER_, above, with FOOTER_ to change the footer size.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Normally, macros that control headers have no effect on
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPEWRITE</kbd></a>.
+HEADER_SIZE is an exception. While all parts of a header in
+PRINTSTYLE&nbsp;<kbd>TYPEWRITE</kbd> are always the same size, you
+can use HEADER_SIZE with PRINTSTYLE&nbsp;<kbd>TYPEWRITE</kbd> to
+reduce the header&#8217;s overall point size. You&#8217;ll most
+likely require this when the
+<a href="docprocessing.html#copystyle">COPYSTYLE</a>
+is <kbd>DRAFT</kbd>, since portions of the header may overprint if,
+say, the title of your document is very long.
+</p>
+</div>
+
+<div id="hdrftr-color" class="box-macro-args">
+Macro: <b>HEADER_COLOR</b> <kbd class="macro-args">&lt;colorname&gt;</kbd>
+</div>
+
+<p>
+If you want your headers in a colour different from the document
+default (usually black), invoke <kbd>.HEADER_COLOR</kbd> with the
+name of a colour pre-defined (or &#8220;initialized&#8221;) with
+<a href="color.html#newcolor">NEWCOLOR</a>
+or
+<a href="color.html#xcolor">XCOLOR</a>.
+</p>
+
+<p>
+HEADER_COLOR will set all the parts of the header
+plus the header rule in the colour you give it as an argument. If
+you wish finer control over colour in headers, you can use
+<a href="#_color">HEADER_&lt;POSITION&gt;_COLOR</a>
+to colourize each part of the header separately, as well as
+<a href="#hdrftr-rule-color">HEADER_RULE_COLOR</a>
+to change the colour of the header rule.
+</p>
+
+<p>
+Replace HEADER_, above, with FOOTER_ to colourize footers.
+</p>
+
+<h4 id="hdrftr-style-part" class="docs">3. Part by part changes</h4>
+
+<p>
+When using the following control &#8221;macros, replace
+&#8220;&lt;POSITION&gt; by <b>LEFT, CENTER,</b> or RIGHT as
+appropriate.
+</p>
+
+<div class="macro-list-container">
+<ul style="padding-top: 6px; padding-bottom: 6px; margin-left: -.5em;">
+ <li><a href="#_family">HEADER_&lt;POSITION&gt;_FAMILY</a></li>
+ <li><a href="#_font">HEADER_&lt;POSITION&gt;_FONT</a></li>
+ <li><a href="#_size">HEADER_&lt;POSITION&gt;_SIZE</a></li>
+ <li><a href="#_caps">HEADER_&lt;POSITION&gt;_CAPS</a></li>
+ <li><a href="#_smallcaps">HEADER_&lt;POSITION&gt;_SMALLCAPS</a></li>
+ <li><a href="#_color">HEADER_&lt;POSITION&gt;_COLOR</a></li>
+ <li><a href="#grouping">Grouping style parameters for the individual header/footer parts</a></li>
+</ul>
+</div>
+
+<div id="_family" class="box-macro-args">
+Macro: <b>HEADER_&lt;POSITION&gt;_FAMILY</b> <kbd class="macro-args">&lt;family&gt;</kbd>
+</div>
+
+<p>
+Use HEADER_&lt;POSITION&gt;_FAMILY to change the
+<a href="definitions.html#family">family</a>
+of any part of headers. See
+<a href="docelement.html#control-macro-args">Arguments to the control macros</a>
+for an explanation of how control macros ending in _FAMILY work.
+</p>
+
+<p>
+Replace HEADER_, above, with FOOTER_ to change a footer part&#8217;s family.
+</p>
+
+<div id="_font" class="box-macro-args">
+Macro: <b>HEADER_&lt;POSITION&gt;_FONT</b> <kbd class="macro-args">&lt;font&gt;</kbd>
+</div>
+
+<p>
+Use HEADER_&lt;POSITION&gt;_FONT to change the
+<a href="definitions.html#font">font</a>
+of any part of headers. See
+<a href="docelement.html#control-macro-args">Arguments to the control macros</a>
+for an explanation of how control macros ending in _FONT work.
+</p>
+
+<p>
+Replace HEADER_, above, with FOOTER_ to change a footer part&#8217;s font.
+</p>
+
+<div id="_size" class="box-macro-args">
+Macro: <b>HEADER_&lt;POSITION&gt;_SIZE</b> <kbd class="macro-args">&lt;+|-number of points&gt;</kbd>
+</div>
+
+<p>
+Use HEADER_&lt;POSITION&gt;_SIZE to change the size of any part of
+headers (relative to the point size of type in paragraphs). See
+<a href="docelement.html#control-macro-args">Arguments to the control macros</a>
+for an explanation of how control macros ending in _SIZE work.
+</p>
+
+<p>
+Replace HEADER_, above, with FOOTER_ to change a footer part&#8217;s size.
+</p>
+
+<div id="_caps" class="box-macro-args">
+Macro: <b>HEADER_&lt;POSITION&gt;_CAPS</b> <kbd class="macro-args">toggle</kbd>
+</div>
+
+<p>
+HEADER_&lt;POSITION&gt;_CAPS is a
+<a href="definitions.html#toggle">toggle macro</a>.
+If you want any part of headers to be set in all caps, regardless of
+the capitalization of that part&#8217;s string as given to the
+<a href="docprocessing.html#reference-macros">reference macros</a>
+or as defined by you with the
+<a href="#hdrftr-strings">header string control macros</a>,
+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
+macro with any argument (e.g. <kbd>OFF</kbd>, <kbd>QUIT</kbd>,
+<kbd>END</kbd>, <kbd>X</kbd>...).
+</p>
+
+<p>
+Replace HEADER_, above, with FOOTER_ to change a footer part&#8217;s
+capitalization style.
+</p>
+
+<div id="_smallcaps" class="box-macro-args">
+Macro: <b>HEADER_&lt;POSITION&gt;_SMALLCAPS</b> <kbd class="macro-args">toggle</kbd>
+</div>
+
+<p>
+HEADER_&lt;POSITION&gt;_SMALLCAPS is a
+<a href="definitions.html#toggle">toggle macro</a>.
+If you want any part of headers to be set in smallcaps, simply
+invoke this macro (using the appropriate position) with no argument.
+If you wish to turn the smallcaps off, invoke the macro with any
+argument (e.g. <kbd>OFF</kbd>, <kbd>QUIT</kbd>, <kbd>END</kbd>,
+<kbd>X</kbd>...).
+</p>
+
+<p>
+Replace HEADER,_ above, with FOOTER_ to invoke smallcaps for footer
+parts.
+</p>
+
+<div id="_color" class="box-macro-args">
+Macro: <b>HEADER_&lt;POSITION&gt;_COLOR</b> <kbd class="macro-args">&lt;colorname&gt;</kbd>
+</div>
+
+<p>
+HEADER_&lt;POSITION&gt;_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&#8217;d get it:
+<br/>
+<span class="pre-in-pp">
+ .HEADER_RIGHT_COLOR red
+</span>
+The other parts of the header will be in the default header colour
+(usually black, but that can be changed with
+<a href="#hdrftr-color">HEADER_COLOR</a>).
+</p>
+
+<p>
+Remember that you have to define (or &#8220;initialize&#8221;) a
+colour with
+<a href="color.html#newcolor">NEWCOLOR</a>
+or
+<a href="color.html#xcolor">XCOLOR</a>
+before you can use the colour.
+</p>
+
+<p>
+If you create a
+<a href="#userdef-hdrftr-rv">user-defined header</a>
+with
+<a href="#hdrftr-rectoverso">HEADER_RECTO</a>
+or
+<a href="#hdrftr-rectoverso">HEADER_VERSO</a>,
+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
+<a href="color.html#color-inline"><kbd><span class="nobr">\*[&lt;colorname&gt;]</span></kbd></a>
+<a href="definitions.html#inlines">inline escape</a>.
+</p>
+
+<p>
+Replace HEADER_, above, with FOOTER_ to set the colours for the
+various elements of footers.
+</p>
+
+<h5 id="grouping" class="docs">Grouping style parameters for the individual header parts</h5>
+
+<p>
+Instead of using control macros for the style parameters
+of an individual header part, the parameters may be
+<a href="docelement.html#grouping">grouped</a>
+by invoking <kbd>HEADER_&lt;POSITION&gt;_STYLE</kbd> with a list of
+keyword/value pairs. Acceptable keywords are
+<kbd>FAMILY FONT SIZE COLOR CAPS</kbd> and <kbd>SMALLCAPS</kbd>.
+Keyword/value pairs may appear on the same line as the macro, or
+separated into several lines using the backslash character
+(<kbd>\</kbd>). If you use the latter style, all but the final
+parameter must be terminated with the backslash.
+</p>
+
+<p>
+Thus, to set the header-left part in Helvetica bold, red, 1 point larger
+than
+<a href="definitions.html#running">running text</a>
+and all caps, you could do either
+<br/>
+<span class="pre-in-pp">
+ .HEADER_LEFT_STYLE FAMILY H FONT B SIZE +1 COLOR red CAPS
+</span>
+or
+<br/>
+<span class="pre-in-pp">
+ .HEADER_LEFT_STYLE \
+ FAMILY H \
+ FONT B \
+ SIZE +1 \
+ COLOR red \
+ CAPS
+</span>
+If you need to reverse the sense of <kbd>CAPS</kbd>
+or <kbd>SMALLCAPS</kbd>, use <kbd>NO_CAPS</kbd> or
+<kbd>NO_SMALLCAPS</kbd>.
+</p>
+
+<!-- -HDRFTR_VERTICAL- -->
+
+<h4 id="hdrftr-vertical" class="docs">3. Header/footer vertical placement and spacing</h4>
+
+<p>
+See
+<a href="#vertical-spacing">Vertical placement and spacing of headers/footers</a>
+for an explanation of how mom deals with
+headers, footers, and top/bottom page margins.
+</p>
+
+<div class="macro-list-container">
+<ul style="padding-top: 6px; padding-bottom: 6px; margin-left: -.5em;">
+ <li><a href="#hdftr_margin">HEADER_MARGIN</a></li>
+ <li><a href="#hdftr_gap">HEADER_GAP</a></li>
+</ul>
+</div>
+
+<!-- -HDRFTR_MARGIN- -->
+
+<div id="hdrftr-margin" class="box-macro-args">
+Macro: <b>HEADER_MARGIN</b> <kbd class="macro-args">&lt;distance to baseline of header&gt;</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+Use HEADER_MARGIN to set the distance from the top edge of the page to the
+<a href="definitions.html#baseline">baseline</a>
+of type in headers. A unit of measure is required, and decimal
+fractions are allowed.
+</p>
+
+<p>
+Mom&#8217;s default header margin is 4-1/2
+<a href="definitions.html#picaspoints">picas</a>,
+but if you want a different margin, say, 1/2-inch, do
+<br/>
+<span class="pre-in-pp">
+ .HEADER_MARGIN .5i
+</span>
+If your document uses
+<a href="definitions.html#footer">footers</a>,
+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&#8217;s default footer margin is 3
+<a href="definitions.html#picaspoints">picas</a>.
+</p>
+
+<h3 class="docs">Header/footer margins and page numbering</h3>
+
+<p>
+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 proper.
+</p>
+
+<p>
+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
+<a href="#footers">FOOTERS</a>
+on or because you instructed mom to put them there with
+<a href="#pagenum-pos">PAGENUM_POS</a>,
+you&#8217;d use HEADER_MARGIN to change their baseline placement.
+</p>
+
+<div id="footer-margin" class="box-important" style="padding-bottom: 15px;">
+<p class="tip-top">
+<span class="important" style="display: block; margin-bottom: -1em;">Important &ndash; FOOTER_MARGIN and bottom margins</span>
+<br/>
+Mom requires a footer margin (i.e. the distance from the bottom of
+the page at which to place footers) for proper operation, hence she
+sets one, even if you don&#8217;t. As stated above, her default
+footer margin is 3-picas.
+</p>
+
+<p>
+If you use
+<a href="typesetting.html#b-margin">B_MARGIN</a>
+or
+<a href="typesetting.html#page">PAGE</a>
+to set a bottom margin for your document (prior to
+<a href="docprocessing.html#start">START</a>),
+and the margin&#8217;s too close to mom&#8217;s default
+footer margin (or a footer margin you set yourself with
+FOOTER_MARGIN), mom will not print your footers; additionally,
+she&#8217;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&#8217;s an adequate amount of space for mom to print the
+bottom line of running text and the footer.
+</p>
+
+<p>
+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
+<a href="docprocessing.html#start">START</a>,
+as in these examples.
+</p>
+
+<div id="examples-footnotes-1" class="examples-container" style="padding-bottom: 1em;">
+<div class="examples" style="margin-top: 0; margin-bottom: -.25em;">Example 1</div>
+<span class="pre">
+ &lt;reference macros, etc&gt;
+ .PAGINATION OFF
+ .B_MARGIN .25i
+ .FOOTER_MARGIN O
+ .START
+</span>
+</div>
+
+<div id="examples-footnotes-2" class="examples-container" style="margin-top: 1em; padding-bottom: 1em;">
+<div class="examples" style="margin-top: 0;">Example 2</div>
+<span class="pre">
+ &lt;reference macros, etc&gt;
+ .HEADERS OFF
+ .PAGENUM_POS TOP RIGHT
+ .B_MARGIN .25i
+ .FOOTER_MARGIN O
+ .START
+</span>
+</div>
+</div>
+
+<!-- -HDRFTR_GAP- -->
+
+<div id="hdrftr-gap" class="box-macro-args">
+Macro: <b>HEADER_GAP</b> <kbd class="macro-args">&lt;distance from header to start of running text&gt;</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+Use HEADER_GAP to set the distance from the
+<a href="definitions.html#baseline">baseline</a>
+of type in headers to the start of
+<a href="definitions.html#running">running text</a>.
+A unit of measure is required, and decimal fractions are allowed.
+</p>
+
+<p>
+As explained in
+<a href="#vertical-spacing">Vertical placement and spacing of headers/footers</a>,
+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
+<a href="typesetting.html#t-margin">T_MARGIN</a>).
+If you give a top margin, mom ignores HEADER_GAP; running text
+starts at your stated top margin.
+</p>
+
+<p>
+Mom&#8217;s default header gap is 3
+<a href="definitions.html#picaspoints">picas</a>,
+but if you want a different gap, say, 2 centimetres, do
+<br/>
+<span class="pre-in-pp">
+ .HEADER_GAP 2c
+</span>
+If your document uses
+<a href="definitions.html#footer">footers</a>,
+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.
+</p>
+
+<p>
+As explained in
+<a href="#vertical-spacing">Vertical placement and spacing of headers/footers</a>,
+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
+<a href="typesetting.html#b-margin">B_MARGIN</a>).
+If you give a bottom margin, mom ignores FOOTER_GAP; running text
+ends at your stated bottom margin, subject to the restriction outlined
+<a href="#footer-margin">here</a>.
+</p>
+
+<p>
+Mom&#8217;s default footer gap is 3
+<a href="definitions.html#picaspoints">picas</a>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+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.
+</p>
+</div>
+
+<div id="gap-note" class="box-tip">
+<p class="tip-top">
+<span class="note">Additional note:</span>
+HEADER_GAP and FOOTER_GAP may only be used once, at the start of a
+document. In
+<a href="rectoverso.html#collate">collated documents</a>,
+this means that HEADER_GAP or FOOTER_GAP cannot be used to change
+the gaps once they have been set. The same applies to the Table of
+Contents, Endnotes, Bibliographies, and Lists of...&nbsp;.
+</p>
+
+<p class="tip-bottom">
+In the event that you need to change the header or footer gap after
+the start of a document, you must do so with
+<a href="typesetting.html#t-margin">T_MARGIN</a>
+or
+<a href="typesetting.html#b-margin">B_MARGIN</a>,
+which raise or lower the top and bottom margins of
+<a href="definitions.html#running">running text</a>
+but do not affect the placement headers and footers.
+(See
+<a href="tables-of-contents.html#toc-page-settings-example">here</a>
+for a demonstration.)
+</p>
+</div>
+
+<!-- -HDRFTR_SEPARATOR- -->
+
+<h4 id="hdrftr-separator" class="docs">4. Header/footer separator rule</h4>
+
+<p>
+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
+<a href="definitions.html#header">header</a>
+and helps separate it visually from
+<a href="definitions.html#running">running text</a>. If
+you don&#8217;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.
+</p>
+
+<div class="macro-list-container">
+<ul style="padding-top: 6px; padding-bottom: 6px; margin-left: -.5em;">
+ <li><a href="#hdrftr-rule">HEADER_RULE</a> &ndash; on or off</li>
+ <li><a href="#hdrftr-rule-weight">HEADER_RULE_WEIGHT</a> &ndash; weight of the rule</li>
+ <li><a href="#hdrftr-rule-gap">HEADER_RULE_GAP</a> &ndash; distance of rule from header</li>
+ <li><a href="#hdrftr-rule-color">HEADER_RULE_COLOR</a> &ndash; color of rule header</li>
+</ul>
+</div>
+
+<!-- -HDRFTR_RULE- -->
+
+<div id="hdrftr-rule" class="box-macro-args">
+Macro: <b>HEADER_RULE</b> <kbd class="macro-args">toggle</kbd>
+</div>
+
+<p>
+By default, mom prints a header separator rule underneath headers
+(or above footers). If you don&#8217;t want the rule, turn it off by
+invoking <kbd>.HEADER_RULE</kbd> with any argument (<kbd>OFF</kbd>,
+<kbd>QUIT</kbd>, <kbd>END</kbd>, <kbd>X</kbd>...), e.g.
+<br/>
+<span class="pre-in-pp">
+ .HEADER_RULE OFF
+</span>
+To turn the rule (back) on, invoke <kbd>.HEADER_RULE</kbd>
+without any argument.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Replace HEADER_, above, with FOOTER_ to enable/disable the printing
+of the footer separator rule. (Most likely, if you&#8217;re using
+<kbd><a href="#footers">FOOTERS</a></kbd>,
+you&#8217;ll want it off.)
+</p>
+</div>
+
+<!-- -HDRFTR_RULE_WEIGHT- -->
+
+<div id="hdrftr-rule-weight" class="box-macro-args">
+Macro: <b>HEADER_RULE_WEIGHT</b> <kbd class="macro-args">&lt;weight in points&gt;</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Argument must <span class="normal">NOT</span> have a <a href="definitions.html#unitofmeasure">unit of measure</a> appended
+</p>
+
+<p>
+HEADER_RULE_WEIGHT controls the weight (&#8220;thickness&#8221;) of
+the header rule. Like
+<a href="inlines.html#rule-weight">RULE_WEIGHT</a>,
+it takes a single argument: the weight of the header rule expressed
+in
+<a href="definitions.html#picaspoints">points</a>
+but without the unit of measure, <kbd>p</kbd>, appended. The
+argument to HEADER_RULE_WEIGHT must be greater than 0 and less than
+100; decimal fractions are allowed.
+</p>
+
+<p>
+Say, for example, you want a really strong header separator rule.
+<br/>
+<span class="pre-in-pp">
+ .HEADER_RULE_WEIGHT 4
+</span>
+which sets the separator rule weight to 4 points, is how you&#8217;d do
+it.
+</p>
+
+<p>
+Mom&#8217;s default header rule weight is 1/2 point.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Replace HEADER_, above, with FOOTER_ to set the weight of the footer
+separator rule.
+</p>
+</div>
+
+<!-- -HDRFTR_RULE_GAP- -->
+
+<div id="hdrftr-rule-gap" class="box-macro-args">
+Macro: <b>HEADER_RULE_GAP</b> <kbd class="macro-args">&lt;distance of rule beneath header&gt;</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+HEADER_RULE_GAP is the distance from the
+<a href="definitions.html#baseline">baseline</a>
+of type in headers to the top edge of the rule underneath. (If
+FOOTER_RULE_GAP, the gap is the distance from the top of the highest
+<a href="definitions.html#ascender">ascender</a>
+to the bottom edge of the rule.) A unit of measure is required, and
+decimal fractions are allowed. Please note that HEADER_RULE_GAP has
+no effect on
+<a href="#hdrftr-gap">HEADER_GAP</a>
+(i.e., HEADER_RULE_GAP is NOT added to HEADER_GAP when mom calculates
+the space between headers and the start of
+<a href="definitions.html#running">running text</a>).
+</p>
+
+<p>
+By default, the header rule gap is 4
+<a href="definitions.html#picaspoints">points</a>.
+If you&#8217;d like to change it to, say, 1/4
+<a href="definitions.html#em">em</a>, do
+<br/>
+<span class="pre-in-pp">
+ .HEADER_RULE_GAP .25m
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Replace HEADER_, above, with FOOTER_ if you&#8217;re using
+<a href="definitions.html#footer">footers</a>
+and want to change the separator rule gap. In footers, the gap is
+measured from the top of the tallest
+<a href="definitions.html#ascender">ascender</a>
+in the footer.
+</p>
+
+<p class="tip-bottom">
+<span class="additional-note">Additional note:</span>
+When using
+<a href="#hdrftr-recto">FOOTER_RECTO</a>
+and
+<a href="#hdrftr-verso">FOOTER_VERSO</a>,
+make sure that the default size for footers
+(<a href="#footer-global-size">FOOTER_SIZE</a>)
+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.
+</p>
+</div>
+
+<!-- -HDRFTR_RULE_COLOR- -->
+
+<div id="hdrftr-rule-color" class="box-macro-args">
+Macro: <b>HEADER_RULE_COLOR</b> <kbd class="macro-args">&lt;colorname&gt;</kbd>
+</div>
+
+<p>
+If you wish to change the colour of the header rule, invoke
+<kbd>.HEADER_RULE_COLOR</kbd> with the name of a colour pre-defined
+(or &#8220;initialized&#8221;) with
+<a href="color.html#newcolor">NEWCOLOR</a>
+or
+<a href="color.html#xcolor">XCOLOR</a>.
+</p>
+
+<p>
+HEADER_RULE_COLOR overrides the colour set with
+<a href="#hdrftr-color">HDRFTR_COLOR</a>,
+so it&#8217;s possible to have the heads entirely in, say, blue (set
+with HEADER_COLOR), and the header rule in, say, red.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Replace HEADER_, above, with FOOTER_ to change the colour of the
+footer rule.
+</p>
+</div>
+
+<div class="rule-short"><hr/></div>
+
+<!-- -USERDEF_HDRFTR- -->
+
+<h2 id="userdef-hdrftr-rv" class="macro-group">User-defined, single string recto/verso headers/footers</h2>
+
+<p>
+Sometimes, you&#8217;ll find you can&#8217;t get mom&#8217;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.
+</p>
+
+<p>
+Say, for example, you want recto page headers to contain a
+document&#8217;s author, centred, and verso page headers to contain
+the document&#8217;s title, also centred, like this:
+<br/>
+<span class="pre-in-pp">
+ +------------------------+ +------------------------+
+ | Author | | Title |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ +------------------------+ +------------------------+
+</span>
+With mom&#8217;s standard 3-part headers, this isn&#8217;t possible,
+even when
+<a href="rectoverso.html#recto-verso">RECTO_VERSO</a>
+is enabled. RECTO_VERSO switches the left and right parts of
+headers on alternate pages, but the centre part remains unchanged.
+</p>
+
+<p>
+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
+<a href="#hdrftr-recto">HEADER_RECTO</a>
+and
+<a href="#hdrftr-verso">HEADER_VERSO</a>.
+Both allow you to state whether the header is flush left, centred,
+or flush right, and both take a single
+<a href="definitions.html#stringargument">string argument</a>
+with which, by combining text and
+<a href="definitions.html#inlines">inline escapes</a>,
+you can make the headers come out just about any way you want. Use
+of the <kbd><span class="nobr">\*[PAGE#]</span></kbd> escape is permitted in the
+string argument (see
+<a href="#page-number-incl">Including the page number in header-left, -centre or -right</a>),
+and, as an added bonus, mom provides a special mechanism whereby
+it&#8217;s possible to
+<a href="#padding-hdrftr">pad</a>
+the string as well. The padding mechanism lets you create headers
+that contain left, centre and right parts like mom&#8217;s defaults
+but entirely of your own design.
+</p>
+
+<div class="macro-list-container">
+<ul style="padding-top: 6px; padding-bottom: 6px; margin-left: -.5em;">
+ <li><a href="#hdrftr-recto">HEADER_RECTO</a></li>
+ <li><a href="#hdrftr-verso">HEADER_VERSO</a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#userdef-hdrftr">User-defined single string headers/footers (no recto/verso)</a></li>
+ <li><a href="#padding-hdrftr">Padding the header-recto/header-verso string</a></li>
+ </ul></li>
+</ul>
+</div>
+
+<!-- -HDRFTR_RECTOVERSO- -->
+
+<div id="hdrftr-recto" class="box-macro-args">
+Macro: <b>HEADER_RECTO</b> <kbd class="macro-args">LEFT | CENTER | RIGHT [ CAPS ] "&lt;header recto string&gt;"</kbd>
+</div>
+
+<div id="hdrftr-verso" class="box-macro-args" style="margin-top: 1em;">
+Macro: <b>HEADER_VERSO</b> <kbd class="macro-args">LEFT | CENTER | RIGHT [ CAPS ] "&lt;header verso string&gt;"</kbd>
+</div>
+
+<div id="userdef-hdrftr" class="box-important">
+
+<p class="tip">
+<span class="tip" style="display: block; margin-bottom: -1.25em; color: #000056; font-size: 100%;">User-defined single string headers/footers (no recto/verso)</span>
+<br/>
+HEADER_RECTO may be used to create user-defined, single string
+headers (or footers, with FOOTER_RECTO), even when recto/verso is
+not enabled (with
+<a href="rectoverso.html#recto-verso">RECTO_VERSO</a>).
+In such cases, the header/footer you create is the one used on
+every page, making HEADER_RECTO your &#8220;I need to design my own
+headers from scratch&#8221; solution.
+</p>
+</div>
+
+<p>
+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.
+</p>
+
+<p>
+The first argument to HEADER_RECTO is the direction in which you
+want the header
+<a href="definitions.html#quad">quadded</a>.
+<kbd>L</kbd>, <kbd>C</kbd>, and <kbd>R</kbd> may be used in place of
+<kbd>LEFT</kbd>, <kbd>CENTER</kbd>, and <kbd>RIGHT</kbd>.
+</p>
+
+<p>
+The second argument (optional) tells mom to capitalize the text of
+the header. <b>Please note:</b> Do not use
+<a href="inlines.html#uc-lc"><kbd><span class="nobr">\*[UC]...\*[LC]</span></kbd></a>
+inside the string passed to HEADER_RECTO.
+</p>
+
+<p>
+The final argument is a string, surrounded by double-quotes,
+containing what you want in the header. HEADER_RECTO disables
+mom&#8217;s normal 3-part headers, therefore anything you want in
+the headers must be entered by hand in the string, including colours
+(via the
+<a href="definitions.html#inlines">inline escape</a>
+<a href="color.html#color-inline"><kbd><span class="nobr">\*[&lt;colorname&gt;]</span></kbd></a>).
+</p>
+
+<p>
+By default, HEADER_RECTO is set at the same size, and in the same
+family and font, as paragraph text. The control macros
+<a href="#hdrftr-global-family">HEADER_FAMILY</a>
+and
+<a href="#hdrftr-global-size">HEADER_SIZE</a>
+may be used to change the default family and size. Changes to the
+font(s) within the string must be accomplished with the
+<a href="definitions.html#inlines">inline escapes</a>
+<kbd><span class="nobr">\*[ROM]</span></kbd>,
+<kbd><span class="nobr">\*[IT]</span></kbd>,
+<kbd><span class="nobr">\*[BD]</span></kbd>,
+<kbd><span class="nobr">\*[BDI]</span></kbd>,
+and <kbd><span class="nobr">\*[PREV]</span></kbd> (see
+<a href="inlines.html#inline-fonts-mom">Changing fonts</a>).
+Additional refinements to the style of the header-recto string,
+including horizontal spacing and/or positioning, can also be made
+with inline escapes.
+</p>
+
+<p>
+To include the current page number in the string, use the
+<kbd><span class="nobr">\*[PAGE#]</span></kbd>
+<a href="definitions.html#inlines">inline escape</a>.
+</p>
+
+<h3 id="padding-hdrftr" class="docs">Padding the header-recto/header-verso string</h3>
+
+<p>
+You can &#8220;pad&#8221; the header-recto string, a convenience
+you&#8217;ll appreciate in circumstances such as the following.
+<br/>
+<span class="pre-in-pp">
+ VERSO RECTO
+ +------------------------+ +------------------------+
+ | Author Page# | | Page# Title |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ +------------------------+ +------------------------+
+</span>
+</p>
+
+<p>
+There are two steps to padding the string argument passed to HEADER_RECTO
+(if you&#8217;re unsure what padding is, see
+<a href="goodies.html#pad">Insert space into lines</a>).
+</p>
+<ol style="margin-top: -.5em; margin-left: -.5em; margin-bottom: -.5em;">
+ <li>Begin and end the string (inside the double-quotes) with the caret character (<kbd>^</kbd>).</li>
+ <li>Enter the pound sign (<kbd>#</kbd>) at any point in the string where you want an equalized amount of whitespace inserted.</li>
+</ol>
+
+<p>
+The situation depicted above is accomplished like this:
+<br/>
+<span class="pre-in-pp">
+ .HEADER_RECTO LEFT "^\*[PAGE#]#\E*[$TITLE]^"
+ .HEADER_VERSO LEFT "^\E*[$AUTHOR]#\*[PAGE#]^"
+</span>
+Notice that the quad argument, <kbd>LEFT</kbd>, is used in both
+cases. When padding a header, it doesn&#8217;t matter which
+quad argument you use, although you must be sure to supply
+one. Also note that mom does not interpret the <kbd>#</kbd> in
+<kbd><span class="nobr">\*[PAGE#]</span></kbd> as a padding marker (i.e. as a
+place to insert whitespace).
+</p>
+
+<div class="box-important">
+<p class="tip">
+<span class="important">Important:</span>
+The
+<a href="goodies.html#pad-marker">PAD_MARKER</a>
+macro, which changes the default pad marker (<kbd>#</kbd>) used by
+<a href="goodies.html#pad">PAD</a>,
+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
+(&nbsp;<kbd>\[sh]</kbd>&nbsp;) where you want the pound sign to go.
+</p>
+</div>
+
+<!-- -HDRFTR_RECTOVERSO- -->
+
+<h2 id="headers-and-footers-intro" class="macro-group">Headers and footers on the same page</h2>
+
+<p>
+Normally, mom prints either a header or a footer, but not both, depending on whether
+<a href="#headers">HEADERS</a>
+or
+<a href="#footers">FOOTERS</a>
+is enabled. (Page numbering, whether in the top margin
+or the bottom, is not considered a header or a footer.)
+Should you need both headers and footers on the same page, the
+single macro HEADERS_AND_FOOTERS is the way to set it up.
+</p>
+
+<div id="headers-and-footers" class="box-macro-args">
+Macro: <b>HEADERS_AND_FOOTERS</b> <kbd class="macro-args">(see Invocation)</kbd>
+</div>
+
+<p>
+Invocation:
+<br/>
+<span class="pre-in-pp" style="margin-bottom: -1em;">
+ .HEADERS_AND_FOOTERS \
+ &lt;L | C | R&gt; "&lt;header-recto string&gt;" \
+ &lt;L | C | R&gt; "&lt;footer-recto string&gt;" \
+ &lt;L | C | R&gt; "&lt;header-verso string&gt;" \
+ &lt;L | C | R&gt; "&lt;footer-verso string&gt;"
+</span>
+or
+<span class="pre-in-pp" style="margin-top: -.5em;">
+ .HEADERS_AND_FOOTERS &lt;anything&gt;
+</span>
+</p>
+
+<p>
+Unlike the macros,
+<a href="#headers">HEADERS</a>
+and
+<a href="#footers">FOOTERS</a>,
+which are
+<a href="definitions.html#toggle">toggle</a>
+macros, HEADERS_AND_FOOTERS requires that you supply the information
+you want in the headers and footers yourself. Mom does no automatic
+generation of things like the title and the author in headers and
+footers when you&#8217;re using HEADERS_AND_FOOTERS. Furthermore,
+style changes&mdash;family, font, pointsize, colour, capitalization,
+etc &mdash;are entirely your responsibility and must be made with
+<a href="definitions.html#inlines">inline escapes</a>
+in the arguments passed to <kbd>&#8220;&lt;recto
+&#8221;header string&gt;&#8220;</kbd>, <kbd>&lt;recto footer
+string&gt;&#8220;</kbd>, etc. By default, mom sets the headers and
+footers created with HEADERS_AND_FOOTERS in the same family, font,
+point size, capitalization style and colour as
+<a href="definitions.html#running">running text</a>.
+</p>
+
+<p>
+The manner of entering what you want is identical to the way you
+input
+<a href="#userdef-hdrftr-rv">single string headers and footers</a>.
+I suggest reading up on them, as well as looking at the entries,
+<a href="#hdrftr-rectoverso">HEADER_RECTO</a>
+and
+<a href="#reserved-strings">Using mom&#8217;s reserved strings in header/footer definitions</a>.
+</p>
+
+<p>
+The same
+<a href="#padding-hdrftr">padding mechanism</a>
+used in HEADER_RECTO and HEADER_VERSO is available in the
+<a href="definitions.html#stringargument">string arguments</a>
+passed to HEADERS_AND_FOOTERS, allowing you to simulate two- and
+three-part headers and footers.
+</p>
+
+<p>
+<kbd>L | C | R</kbd> in the arguments to HEADERS_AND_FOOTERS refers
+to whether you want the specific header or footer part on the left,
+in the middle, or on the right. (You can also use the longer forms,
+<kbd>LEFT</kbd>, <kbd>CENTER</kbd> and <kbd>RIGHT</kbd>.) The
+string you give afterwards is whatever text you want, including
+mom&#8217;s
+<a href="#reserved-strings">reserved strings</a>,
+and whatever
+<a href="definitions.html#inlines">inline escapes</a>
+you need to change things like family and font, pointsize, colour,
+etc. as you go along.
+</p>
+
+<p>
+Note the backslashes in the invocation, above. Every set of
+arguments given this way to HEADERS_AND_FOOTERS <i>except the
+last</i> requires a backslash after it. The use of backslashes
+isn&#8217;t required if you want to put the entire argument list on
+the same (very long!) line as the macro itself; I recommend sticking
+to the style shown above to keep things manageable.
+</p>
+
+<p>
+If you want to disable having both headers and footers on the same
+page, invoke <kbd>.HEADERS_AND_FOOTERS</kbd> with any argument
+you want (e.g. <kbd>OFF</kbd>, <kbd>QUIT</kbd>, <kbd>END</kbd>,
+<kbd>X</kbd>...). Mom will restore her default behaviour of setting
+automatically generated page headers, with the page number,
+centered, at the bottom of the page. If you would prefer footers
+instead of headers after turning HEADERS_AND_FOOTERS off, invoke
+<a href="#footers"><kbd>.FOOTERS</kbd></a>
+afterwards.
+</p>
+
+<h4 class="docs" style="margin-bottom: 1em;">Examples of HEADERS_AND_FOOTERS usage</h4>
+
+<div id="examples-userdef-hdrftr-1" class="examples-container" style="padding-bottom: 0;">
+<div class="examples" style="margin-top: 12px; margin-bottom: 0;">Example 1: Header and footer the same on every page</div>
+<span class="pre">
+.HEADERS_AND_FOOTERS \ +-----------------------+
+C "\E*[$TITLE]" \ | Title |
+L "^\E*[$AUTHOR]#\*[PAGE#]^" | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | Author Pg. # |
+ +-----------------------+
+</span>
+
+<p>
+<kbd><span class="nobr">\E*[$TITLE]</span></kbd> and
+<kbd><span class="nobr">\E*[$AUTHOR]</span></kbd> will print the strings you pass
+to
+<a href="docprocessing.html#title">TITLE</a>
+and
+<a href="docprocessing.html#author">AUTHOR</a>;
+<kbd><span class="nobr">\*[PAGE#]</span></kbd> is how you include the page number
+in a header or footer string. (For a list of special strings you
+can use in headers and footers, see
+<a href="#reserved-strings">here</a>.)
+</p>
+
+<p>
+You don&#8217;t have to use these special strings. You can type
+in anything you like. I&#8217;ve only used them here to show that
+they&#8217;re available.
+</p>
+</div>
+
+<div id="examples-userdef-hdrftr-2" class="examples-container" style="margin-top: 1em; padding-bottom: 18px;">
+<div class="examples" style="margin-top: 12px; margin-bottom: 0;">Example 2: Different headers and footers on recto/verso pages</div>
+<span class="pre">
+.HEADERS_AND_FOOTERS \
+C "BOOK TITLE" \
+L "^\*[PAGE#]#\E*[$AUTHOR]^" \
+C "Story Title" \
+L "^\E*[$AUTHOR]#\*[PAGE#]^"
+
+ +-----------------------+ +------------------------+
+ | BOOK TITLE | | Story Title |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | Pg. # Author | | Author Pg.# |
+ +-----------------------+ +------------------------+
+</span>
+</div>
+
+<div class="rule-short" style="margin-top: 1.25em;"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="pagination-intro" class="macro-group">Pagination</h2>
+
+<p>
+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&#8217;s document processing,
+most aspects of pagination style can be altered to suit your taste
+with control macros.
+</p>
+
+
+<div class="macro-list-container">
+<h3 id="index-pagination" class="macro-list">Pagination macros</h3>
+<ul class="macro-list">
+ <li><a href="#paginate">PAGINATE</a> &ndash; pagination on or off</li>
+ <li><a href="#pagenumber">PAGENUMBER</a> &ndash; user-defined (starting) page number</li>
+ <li><a href="#pagenum-style">PAGENUM_STYLE</a> &ndash; digits, roman numerals, etc</li>
+ <li><a href="#pagenum-on-first-page">PAGENUM_ON_FIRST_PAGE</a> &ndash; put page number on first page when numbering is at the top of the page</li>
+ <li><a href="#draft-with-pagenumber">DRAFT_WITH_PAGENUMBER</a> &ndash; attach draft/revision information to page numbers</li>
+ <li><a href="#pagenumber-string">PAGENUMBER_STRING</a> &ndash; user-defined page number string</li>
+ <li><a href="#index-paginate-control">Pagination control macros and defaults</a></li>
+</ul>
+</div>
+
+<!-- -PAGINATE- -->
+
+<div id="paginate" class="box-macro-args">
+Macro: <b>PAGINATE</b> <kbd class="macro-args">toggle</kbd>
+</div>
+
+<p class="alias" style="margin-bottom: 0;">
+<i>Alias:</i> <b>PAGINATION</b>
+</p>
+
+<p>
+By default, mom paginates documents (in the bottom margin). If
+you&#8217;d prefer she not paginate, turn pagination off by
+invoking <kbd>.PAGINATE</kbd> with any argument (<kbd>OFF</kbd>,
+<kbd>NO</kbd>, <kbd>QUIT</kbd>, <kbd>END</kbd>, <kbd>X</kbd>...),
+e.g.
+<br/>
+<span class="pre-in-pp">
+ .PAGINATE NO
+</span>
+To (re)start pagination, invoke <kbd>.PAGINATE</kbd> without any
+argument.
+</p>
+
+<!-- -PAGENUMBER- -->
+
+<div id="pagenumber" class="box-macro-args">
+Macro: <b>PAGENUMBER</b> <kbd class="macro-args">&lt;number&gt;</kbd>
+</div>
+
+<p>
+As is to be expected, pagination of documents begins at page 1. If
+you&#8217;d prefer that mom begin with a different number on the
+first page of a document, invoke <kbd>.PAGENUMBER</kbd> with the
+number you want.
+</p>
+
+<p>
+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.
+</p>
+
+<!-- -PAGENUM_STYLE- -->
+
+<div id="pagenum-style" class="box-macro-args">
+Macro: <b>PAGENUM_STYLE</b> <kbd class="macro-args">DIGIT | ROMAN | roman | ALPHA | alpha</kbd>
+</div>
+
+<p>
+PAGENUM_STYLE lets you tell mom what kind of page numbering you
+want.
+<br/>
+<span class="pre-in-pp">
+ 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...)
+</span>
+</p>
+
+<!-- -PAGENUM_ON_FIRST_PAGE- -->
+
+<div id="pagenum-on-first-page" class="box-macro-args">
+Macro: <b>PAGENUM_ON_FIRST_PAGE</b> <kbd class="macro-args">toggle</kbd>
+</div>
+
+<p>
+This macro applies only if you&#8217;ve enabled
+<a href="#footers">FOOTERS</a>.
+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
+<a href="rectoverso.html#collate">COLLATE</a>).
+If you&#8217;d like the page number to appear on &#8220;first&#8221; pages
+when footers are on, invoke
+<br/>
+<span class="pre-in-pp">
+ .PAGENUM_ON_FIRST_PAGE
+</span>
+with no argument. Any other argument turns the feature off
+(<kbd>OFF</kbd>, <kbd>QUIT</kbd>, <kbd>END</kbd>, <kbd>X</kbd>,
+etc).
+</p>
+
+<p>
+As with most of the
+<a href="definitions.html#controlmacro">control macros</a>,
+PAGENUM_ON_FIRST_PAGE can be invoked at any time, meaning that if
+you don&#8217;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
+<a href="docprocessing.html#start">START</a>
+of the document, then invoke it either just before or after your
+first COLLATE.
+</p>
+
+<!-- -DRAFT_WITH_PAGENUMBER- -->
+
+<div id="draft-with-pagenumber" class="box-macro-args">
+Macro: <b>DRAFT_WITH_PAGENUMBER</b>
+</div>
+
+<p>
+Sometimes, in
+<a href="docprocessing.html#copystyle">COPYSTYLE <kbd>DRAFT</kbd></a>,
+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.
+</p>
+
+<p>
+Invoked without an argument, <kbd>.DRAFT_WITH_PAGENUMBER</kbd>
+removes draft/revision information from the page headers and
+attaches it instead to the document&#8217;s page numbering, in the
+form
+<br/>
+<span class="pre-in-pp">
+ Draft #, Rev. # / &lt;pagenumber&gt;
+</span>
+If you have not supplied mom with a draft number (with
+<a href="docprocessing.html#draft">DRAFT</a>)
+DRAFT_WITH_PAGENUMBER will assume &#8220;Draft 1&#8220;, and will
+print it before the page number.
+</p>
+
+<p>
+See the note in
+<a href="docprocessing.html#copystyle-note">COPYSTYLE <kbd>DRAFT</kbd>
+</a>
+for other ways of dealing with crowded page headers when formatting
+draft-style copy.
+</p>
+
+<!-- -PAGENUMBER_STRING- -->
+
+<div id="pagenumber-string" class="box-macro-args">
+Macro: <b>PAGENUMBER_STRING</b> "&lt;text of page number string&gt;"
+</div>
+
+<p>
+If you want page numbering to contain text in addition to the page
+number itself, use PAGENUMBER_STRING.
+</p>
+
+<p>
+The most common use for PAGENUMBER_STRING is to include the total
+number of pages along with the page number, for example
+&#8220;Page 1 of 10, Page 2 of 10...&#8221; To accomplish this,
+you&#8217;d enter
+<br/>
+<span class="pre-in-pp">
+ .PAGENUMBER_STRING "Page \*[PAGE#] of 10"
+</span>
+Notice that the page number is entered symbolically with the
+<a href="definitions.html#inlines">inline escape</a>
+<span style="white-space:nowrap"><kbd><span class="nobr">\*[PAGE#]</span></kbd>,</span>
+while the total number of pages must be entered explicitly after the
+document is complete and the total number of pages known.
+</p>
+
+<!-- -PAGINATE_CONTROL- -->
+
+<div class="macro-list-container">
+<h3 id="index-paginate-control" class="macro-list">Pagination control macros and defaults</h3>
+
+<ol style="margin-top: -1.5em; padding-bottom: 6px;">
+ <li><a href="#paginate-general">Family/font/size/colour</a></li>
+ <li><a href="#pagenum-pos">Page number position (vertical and horizontal)</a></li>
+ <li><a href="#pagenum-hyphens">Enclose page numbers with hyphens (on or off)</a></li>
+</ol>
+</div>
+
+<h4 id="paginate-general" class="docs">1. Page number family/font/size/colour</h4>
+
+<div class="defaults-container" style="margin-top: 1em; padding-bottom: 8px;">
+<p class="defaults" style="padding-top: 6px;">
+See
+<a href="docelement.html#control-macro-args">Arguments to the control macros</a>.
+<br/>
+The following control macros may also be
+<a href="docelement.html#grouping">grouped</a>
+using PAGENUMBER_STYLE.*
+</p>
+<span class="pre defaults">
+.PAGENUM_FAMILY default = prevailing document family
+.PAGENUM_FONT default = roman
+.PAGENUM_SIZE default = +0 (i.e. same size as paragraph text)
+.PAGENUM_COLOR default = black
+</span>
+</div>
+
+<p style="margin-top: -2em">
+*Note: Do not confuse PAGENUMBER_STYLE with
+<a href="#pagenum-style">PAGENUM_STYLE</a>.
+</p>
+
+<h4 id="pagenum-pos" class="docs" style="margin-top: 0em;">2. Page number position</h4>
+
+<div class="box-macro-args" style="margin-top: 1em;">
+Macro: <b>PAGENUM_POS</b> <kbd class="macro-args">[ TOP | BOTTOM ]&nbsp;&nbsp;[ LEFT | CENTER | RIGHT ]</kbd>
+</div>
+
+<p>
+Use PAGENUM_POS to change the default position of automatic page
+numbering. PAGENUM_POS requires <i>two</i> arguments: a vertical
+position (<kbd>TOP</kbd> or <kbd>BOTTOM</kbd>) and a horizontal
+position (<kbd>LEFT</kbd> or <kbd>CENTER</kbd> or <kbd>RIGHT</kbd>).
+</p>
+
+<p>
+For example, if you turn both
+<a href="definitions.html#header">headers</a>
+and
+<a href="definitions.html#footer">footers</a>
+off (with <kbd>.HEADERS&nbsp;OFF</kbd> and
+<kbd>.FOOTERS&nbsp;OFF</kbd>) and you want mom to number your pages
+at the top right position, enter
+<br/>
+<span class="pre-in-pp">
+ .PAGENUM_POS TOP RIGHT
+</span>
+</p>
+
+<div id="pagenum-pos-note" class="box-tip" style="margin-top: 1em;">
+<p class="tip">
+<span class="note">Note:</span>
+HEADERS must be OFF for PAGENUM_POS TOP to work.
+</p>
+</div>
+
+<h4 id="pagenum-hyphens" class="docs" style="margin-top: -1em;">3. Enclose page numbers with hyphens (on or off)</h4>
+
+<div class="box-macro-args" style="margin-top: 1em;">
+Macro: <b>PAGENUM_HYPHENS</b> <kbd class="macro-args">toggle</kbd>
+</div>
+
+<p>
+By default, mom encloses page numbers between hyphens. If you
+don&#8217;t want this behaviour, invoke the macro PAGENUM_HYPHENS
+with any argument (<kbd>OFF</kbd>, <kbd>QUIT</kbd>, <kbd>END</kbd>,
+<kbd>X</kbd>, etc), like this:
+<br/>
+<span class="pre-in-pp">
+ .PAGENUM_HYPHENS OFF
+</span>
+If, for some reason, you want to turn page number hyphens back
+on, invoke the macro without an argument.
+</p>
+
+<!-- -BLANK_PAGE- -->
+
+<h2 id="blank-pages" class="macro-group">Inserting blank pages into a document</h2>
+
+<div class="box-macro-args">
+Macro: <b>BLANKPAGE</b> <kbd class="macro-args">&lt;# of blank pages to insert&gt; [DIVIDER [NULL]]</kbd>
+</div>
+
+<p>
+This one does exactly what you&#8217;d expect&mdash;inserts a blank
+page (or pages) into a document. Unless you give the optional argument,
+<kbd>NULL</kbd>, mom silently increments the page number of every
+blank page and keeps track of
+<a href="rectoverso.html#recto-verso">recto/verso</a>
+stuff, but otherwise does nothing. This is useful for forcing new
+sections of a document onto recto pages, but may have other
+applications as well.
+</p>
+
+<p>
+The required 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:
+<br/>
+<span class="pre-in-pp">
+ .BLANKPAGE 1
+</span>
+The optional argument <kbd>DIVIDER</kbd> must be given if
+you&#8217;re inserting a blank page before the start of major
+document sections (chapters, endnotes, bibliographies,
+or tables of contents&#8211;provided the table of contents is not being
+<a href="tables-of-contents.html#auto-relocate-toc">autorelocated</a>).
+Without the <kbd>DIVIDER</kbd> argument, mom simply
+inserts the blank pages and prepares the next page to receive
+<a href="definitions.html#running">running text</a>.
+</p>
+
+<p>
+<kbd>NULL</kbd>, which is also optional, allows you to output the
+specified number of pages without mom incrementing the page number
+for each blank page. She will, however, continue to keep track
+of which pages are recto/verso if recto/verso printing has been
+enabled.
+</p>
+
+<div id="blankpage-note" class="box-tip" style="margin-top: 1.5em;">
+<p class="tip">
+<span class="note">Note:</span>
+Do not use BLANKPAGE before TOC if the table of contents is being
+<a href="tables-of-contents.html#auto-relocate-toc">autorelocated</a>.
+</p>
+</div>
+
+<div class="rule-long"><hr/></div>
+
+<!-- Navigation links -->
+<table style="width: 100%; margin-top: 12px;">
+<tr>
+ <td style="width: 33%;"><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="width: 24%; text-align: center;"><a href="#top">Top</a></td>
+ <td style="width: 42%; text-align: right;"><a href="rectoverso.html">Next: Recto/verso printing, collating</a></td>
+</tr>
+</table>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/momdoc/images.html b/contrib/mom/momdoc/images.html
new file mode 100644
index 0000000..dc1837f
--- /dev/null
+++ b/contrib/mom/momdoc/images.html
@@ -0,0 +1,3515 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>Mom -- Graphics, floats, and preprocessor support</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div id="top" class="page">
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+<tr>
+ <td><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="text-align: right;"><a href="headfootpage.html#top">Next: Page headers/footers, pagination</a></td>
+</tr>
+</table>
+
+<h1 class="docs">Graphics, floats, and preprocessor support</h1>
+
+<div style="width: 80%; margin: auto;">
+<ul class="no-enumerator" style="margin-left: -1em;">
+ <li><a href="#images-intro">Inserting images and graphics</a>
+ <ul>
+ <li><a href="#converting">Image conversion and file processing</a>
+ <ul style="margin-left: -1em">
+ <li><a href="#pdf">PDF</a></li>
+ <li><a href="#eps">EPS</a></li>
+ </ul></li>
+ <li><a href="#pdf-image">The PDF_IMAGE macro</a>
+ <ul style="margin-left: -1em">
+ <li><a href="#pdf-image-frame">PDF_IMAGE_FRAME</a>&mdash;set parameters for image frames</li>
+ </ul></li>
+ <li><a href="#pspic">The PSPIC macro</a></li>
+ </ul></li>
+ <li><a href="#floats-intro">Floats</a>
+ <ul>
+ <li><a href="#float">The FLOAT macro</a></li>
+ <li><a href="#float-label-caption">Labelling and captioning floats</a>
+ <ul style="margin-left: -1em">
+ <li><a href="#label">LABEL</a></li>
+ <li><a href="#caption">CAPTION</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a href="#preprocessor-support">Preprocessor support</a>
+ <ul>
+ <li><a href="#tbl">tbl</a>
+ <ul style="margin-left: -1em;">
+ <li><a href="#ts-te">.TS / .TH / .TE macros and arguments</a></li>
+ </ul></li>
+ <li><a href="#eqn">eqn</a>
+ <ul style="margin-left: -1em;">
+ <li><a href="#eq-en">.EQ / .EN macros and arguments</a></li>
+ </ul></li>
+ <li><a href="#pic">pic</a>
+ <ul style="margin-left: -1em;">
+ <li><a href="#ps-pe">.PS / .PE macros and arguments</a></li>
+ <li><a href="#pic-text-style">PIC_TEXT_STYLE</a>&mdash;set parameters for text in diagrams</li>
+ </ul></li>
+ <li><a href="#grap">grap</a></li>
+ <li><a href="#refer">refer</a></li>
+ </ul></li>
+ <li><a href="#captions-and-labels">Captions and labels</a>
+ <ul>
+ <li><a href="#autolabel">AUTOLABEL</a></li>
+ <li><a href="#set-autolabel">SET_AUTOLABEL</a></li>
+ <li><a href="#caption-after-label">CAPTION_AFTER_LABEL</a></li>
+ <li><a href="#captions-labels-sources">CAPTIONS / LABELS / SOURCES</a>&mdash;set parameters for each</li>
+ <li><a href="#mla">MLA</a></li>
+ </ul></li>
+ <li><a href="#lists-of">Lists of Figures, Tables, and Equations</a>
+ <ul>
+ <li><a href="#lists-placement">Placement of Lists</a></li>
+ <li><a href="#lists-macros">Macros to generate Lists</a></li>
+ <li><a href="#formatting-lists">Formatting and style parameters for Lists</a>
+ <ul style="margin-left: -1em">
+ <li><a href="#lists-style">LISTS_STYLE</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a href="#box-intro">Shaded backgrounds and frames (boxes)</a>
+ <ul>
+ <li><a href="#box-intro">Introduction and description</a></li>
+ <li><a href="#box">The BOX macro</a></li>
+ <li><a href="#box-notes">Additional notes on box usage and behaviour</a>
+ <ul>
+ <li><a href="#qbef">QUOTE, BLOCKQUOTE, EPIGRAPH, FLOAT</a></li>
+ <li><a href="#code">CODE</a></li>
+ <li><a href="#quotes">Description of boxed BLOCKQUOTEs and EPIGRAPHs</a>
+ <ul style="margin-left: -1em; list-style: disc;">
+ <li><a href="#leftover">Leftover box syndrome</a></li>
+ </ul></li>
+ <li><a href="#slides">Slides</a></li>
+ <li><a href="#footnotes">Footnotes</a></li>
+ </ul></li>
+ <li><a href="#page-color-intro">Page colour</a></li>
+ </ul>
+ </li>
+</ul>
+</div>
+
+<div class="rule-medium"><hr/></div>
+
+<h2 id="images-intro" class="docs">Inserting images and graphics</h2>
+
+<p>
+In order to include images in mom documents, the images must be in
+either PDF (.pdf) or EPS (.eps) format. Each format requires its own
+macro, but both take the same arguments, and in the same order.
+</p>
+
+<p>
+Please note that there are differences in the way the files
+containing PDF and EPS images must be processed, hence documents may
+not contain a mix.
+</p>
+
+<h3 id="converting" class="docs">Image conversion and file processing</h3>
+
+<p>
+When your image files are not in PDF or EPS format&mdash;jpgs,
+for example&mdash;you must convert them before including them in
+a mom document. Any utility for converting images may used. The
+ImageMagick suite of programmes, present on most GNU/Linux
+systems, contains <b>convert</b>, which is simple and effective.
+</p>
+
+<h4 id="pdf" class="docs">PDF</h4>
+
+<p>
+Assuming a jpg image, conversion to PDF is done like this:
+<br/>
+<span class="pre-in-pp">
+ convert &lt;image&gt;.jpg &lt;image&gt;.pdf
+</span>
+Any image type supported by <b>convert</b> may be converted this
+way.
+</p>
+
+<p>
+Mom files containing PDF images must be processed using
+groff&#8217;s pdf driver. Use of
+<a href="using.html#pdfmom" style="font-weight: bold">pdfmom</a>
+is strongly recommended, which natively invokes the pdf driver.
+<br/>
+<span class="pre-in-pp">
+ pdfmom doc.mom &gt; doc.pdf
+</span>
+</p>
+
+<h4 id="eps" class="docs">EPS</h4>
+
+<p>
+Assuming a jpg image, conversion to EPS is done like this:
+<br/>
+<span class="pre-in-pp">
+ convert &lt;image&gt;.jpg &lt;image&gt;.eps
+</span>
+Any image type supported by <b>convert</b> may be converted this
+way. There have been reports of trouble with PostScript level 2
+images, so don&#8217;t save your images in this format.
+</p>
+
+<p>
+Mom files containing EPS images must be processed using
+groff&#8217;s postscript driver. Use of
+<a href="using.html#pdfmom" style="font-weight: bold">pdfmom</a>,
+which can be told to use the postscript driver, is strongly
+recommended.
+<br/>
+<span class="pre-in-pp">
+ pdfmom -Tps doc.mom &gt; doc.pdf
+</span>
+</p>
+
+<!-- -PDF_IMAGE- -->
+
+<div class="macro-id-overline">
+<h3 id="pdf-image" class= "macro-id">PDF_IMAGE</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>PDF_IMAGE</b> \
+<br/>
+<kbd class="macro-args">[ -L | -C | -R | -I &lt;indent&gt; ] \
+<br/>
+&lt;pdf image file&gt; &lt;width&gt; &lt;height&gt; [ SCALE &lt;factor&gt; ] \
+<br/>
+[ ADJUST +|-&lt;vertical adjustment&gt; ] [ NO_SHIM ] [ NO_FLEX ] \
+<br/>
+[ FRAME ] \
+<br/>
+[ CAPTION "&lt;caption&gt;" ] [ SHORT_CAPTION "&lt;short caption&gt;" ] \
+<br/>
+[ LABEL "&lt;label&gt;" ] [ TARGET "&lt;name&gt;" ]</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;<span style="font-style: normal">
+<kbd>&lt;indent&gt;</kbd>,
+<kbd>&lt;width&gt;</kbd>,
+<kbd>&lt;height&gt;</kbd></span>
+and
+<span style="font-style: normal">
+<kbd>&lt;vertical adjustment&gt;</kbd></span>
+require a
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Mom files with embedded PDF images must be processed with
+pdfmom&nbsp;doc.mom&nbsp;&gt;&nbsp;doc.pdf. Arguments may be broken
+into several lines using the &#8220;line-continued&#8221; backslash
+(<b>\</b>), as shown above.
+</p>
+</div>
+
+<p>
+Unlike
+<a href="#pspic">PSPIC</a>,
+which it resembles, PDF_IMAGE requires that the pdf image&#8217;s
+dimensions (the bounding box,
+<a href="#bounding-box">see below</a>)
+be supplied each time it&#8217;s called.
+</p>
+
+<p>
+The first optional argument tells mom how to align the image
+horizontally, with <kbd>-L</kbd>, <kbd>-C</kbd>, and <kbd>-R</kbd>
+standing for left, centre and right respectively. If you need more
+precise placement, the <kbd>-I</kbd> argument allows you to give an
+indent from the left margin. Thus, to indent a PDF image 6
+<a href="definitions.html#picaspoints">picas</a>
+from the left margin
+<br/>
+<span class="pre-in-pp">
+ .PDF_IMAGE -I 6P &lt;remaining arguments&gt;
+</span>
+If you omit the first argument, the image will be centred.
+</p>
+
+<p>
+<kbd>&lt;pdf image&gt;</kbd> must be in PDF format, with a .pdf
+extension. If it is not, mom will abort with a message. See
+<a href="#pdf">here</a>
+for instructions on converting image formats to PDF.
+</p>
+
+<p id="bounding-box">
+<kbd>&lt;width&gt;</kbd> and <kbd>&lt;height&gt;</kbd> are the
+dimensions of the image&#8217;s bounding box. The most reliable way
+of getting the bounding box is with the utility, <strong>pdfinfo</strong>:
+<br/>
+<span class="pre-in-pp">
+ pdfinfo &lt;image.pdf&gt; | grep "Page *size"
+</span>
+This will spit out a line that looks like this:
+<br/>
+<span class="pre-in-pp">
+ Page size: width x height pts
+</span>
+<kbd>pts</kbd> means
+<a href="definitions.html#picaspoints">points</a>,
+therefore the unit of measure appended to <kbd>&lt;width&gt;</kbd>
+and <kbd>&lt;height&gt;</kbd> must be <kbd>p</kbd>.
+</p>
+
+<p>
+The remaining arguments are optional and may be entered in any
+order, although it&#8217;s best to put <kbd>CAPTION</kbd>,
+<kbd>SHORT_CAPTION</kbd>, and <kbd>LABEL</kbd> last.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">SCALE</h5>
+
+<p>
+<kbd>SCALE</kbd> allows you to scale the image by
+<kbd>&lt;factor&gt;</kbd>. The factor is a percentage of the
+image&#8217;s original dimensions, thus <kbd>SCALE&nbsp;50</kbd>
+scales the image to 50 percent of its original size. No percent
+sign or unit of measure should be appended.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">ADJUST</h5>
+
+<p>
+<kbd>ADJUST</kbd> lets you raise (<kbd>-</kbd>) or lower
+(<kbd>+</kbd>) the image
+<span style="font-style: italic">within the space allotted for it</span>
+by the amount you specify. This is useful for achieving good
+optical centering between surrounding blocks of type. A unit of
+measure is required.
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Tip:</span>
+You may sometimes find that a PDF_IMAGE at the bottom of a page
+doesn&#8217;t sit flush on the bottom margin, however attempts to lower it
+by adding space beforehand result in it being deferred to the next
+page.
+</p>
+
+<p class="tip-bottom">
+The solution is to introduce <i>negative</i> space before the image
+so that it displays on the page, then lower it to the bottom margin
+with PDF_IMAGE&#8217;s ADJUST argument.
+</p>
+</div>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">NO_SHIM</h5>
+
+<p>
+<kbd>NO_SHIM</kbd> instructs mom not to apply
+<a href="docprocessing.html#shim-vs-flex">shimming</a>
+after an image, which she will do automatically when shimming is
+enabled, which it is by default. Shimming ensures that running text
+after the image falls properly on the page&#8217;s
+<a href="definitions.html#baseline-grid">baseline grid</a>,
+but can result in slightly unequal spacing above and below
+(correctable with the <kbd>ADJUST</kbd> argument).
+<kbd>NO_SHIM</kbd> is useful when you have several images on the
+page and there are visible differences in the spacing beneath them
+as a result of shimming. To ensure a flush bottom margin, the last
+image on the page should be shimmed, i.e. should not be given the
+<kbd>NO_SHIM</kbd> argument.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">NO_FLEX</h5>
+
+<p>
+<kbd>NO_FLEX</kbd> instructs mom not to apply
+<a href="docprocessing.html#shim-vs-flex">flex-spacing</a>
+after an image, which she will do automatically when flex-spacing is
+enabled. <kbd>NO_FLEX</kbd> is useful when you have several images
+on the page and you want to distribute excess vertical
+whitespace on the page amongst other flex-spacing points on the
+page. If there are no others, the final image should be
+flex-spaced, i.e. not given the <kbd>NO_FLEX</kbd> argument.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">FRAME</h5>
+
+<p>
+<kbd>FRAME</kbd> instructs mom to put a frame around the image.
+Parameters for the frame are set with
+<a href="#pdf-image-frame">PDF_IMAGE_FRAME</a>.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">CAPTION</h5>
+
+<p>
+<kbd>CAPTION</kbd> allows you to give the image a caption. By
+default, the caption appears above the image, but may be attached to
+the label that appears beneath the image. See
+<a href="#caption-after-label">CAPTION_AFTER_LABEL</a>
+in
+<a href="#captions-and-labels">Captions and labels</a>.
+The text of the caption must be surrounded by double-quotes.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">SHORT_CAPTION</h5>
+
+<p>
+<kbd>SHORT_CAPTION</kbd> allows you to trim long captions for
+inclusion in the List of Figures. The text you supply, surrounded
+by double-quotes, is what will appear in the List.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">LABEL</h5>
+
+<p>
+<kbd>LABEL</kbd>, if given, appears beneath the image. The text you
+supply, surrounded by double-quotes, is how the image is labelled
+in both the document proper and the List of Figures. Mom provides
+an auto-labelling facility for images (see
+<a href="#autolabel">AUTOLABEL</a>),
+which, if enabled, overrides the <kbd>LABEL</kbd> argument.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">TARGET</h5>
+
+<p>
+<kbd>TARGET</kbd> followed by a unique name surrounded by
+double-quotes creates a PDF target for the image so that it may be
+linked to from other places in the file (with PDF_LINK; see
+<a href="version-2.html#mom-pdf">Producing PDFs with groff and mom</a>).
+</p>
+
+<p>
+<b><i>Please note:</i></b> The following functionality is available
+only with groff 1.22.4 or later.
+</p>
+
+<p>
+When
+<a href="#autolabel">autolabelling</a>
+is enabled and the document is processed with
+<a href="using.html#pdfmom" style="font-weight: bold">pdfmom</a>,
+the target name can be used to generate the target&#8217;s label
+number in running text if it is entered as a groff string, i.e. of the
+form <kbd><span class="nobr">\*[name]</span></kbd>. For example, if you create
+a target named &#8220;foo&#8221; for a pdf image whose autolabel
+number would be 3, entering
+<br/>
+<span class="pre-in-pp">
+ See
+ .PDF_LINK foo "Figure \*[foo]"
+</span>
+anywhere in running text would result in a pdf link that reads
+&#8220;Figure 3&#8221;. If chapter numbers are being prefixed to
+labels, the same string in, say, chapter 5 would produce the pdf
+link &#8220;Figure 5.3&#8221;.
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Note: Version 2.0-c change</span>
+<br/>
+Mom now treats all pdf images identically to
+<a href="#floats-intro">floats</a>,
+which is to say that if an image doesn&#8217;t fit on the output
+page, she will defer it to the top of the next page while continuing
+to process
+<a href="definitions.html#running">running text</a>.
+<kbd>ADJUST</kbd> is ignored whenever an image is the first to be
+deferred, except when moving from column to column on the same page,
+when the image may need to be optically adjusted. Subsequent images
+that do not fit, if any, are output in order immediately after the
+first.
+</p>
+
+<p class="tip-bottom">
+Prior to 2.0-c, it was recommended that images be wrapped inside
+<a href="#float">FLOAT</a>,
+but this is now no longer required, and should, in fact, be avoided.
+</p>
+</div>
+
+<!-- -PDF_IMAGE_FRAME- -->
+
+<div class="macro-id-overline">
+<h3 id="pdf-image-frame" class= "macro-id">PDF_IMAGE_FRAME</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>PDF_IMAGE_FRAME</b> <kbd class="macro-args">&lt;inset amount&gt; &lt;rule weight&gt; &lt;color&gt;</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;<span style="font-style: normal"><kbd>&lt;inset amount&gt;</kbd></span>
+requires a
+<a href="definitions.html#unitofmeasure">unit of measure</a>;
+conversely,
+<span style="font-style: normal"><kbd>&lt;rule weight&gt;</kbd></span>
+must not have a unit of measure appended
+</p>
+
+<p>
+PDF_IMAGE_FRAME establishes the parameters for subsequent invocations of
+<a href="#pdf-image">PDF_IMAGE</a>
+when the <kbd>FRAME</kbd> argument is given. Arguments must appear
+in order, and any you wish left at the current value should be
+entered as two adjacent double-quotes. So, for example,
+<br/>
+<span class="pre-in-pp">
+ .PDF_IMAGE_FRAME "" "" blue
+</span>
+leaves the inset value and rule weight at their current value and
+changes the frame colour to blue.
+</p>
+
+<p>
+Frames are drawn <span class="italic">outside</span> the image at
+its requested dimensions inclusive of scaling. Colours must be
+pre-initialized with
+<a href="color.html#xcolor">XCOLOR</a>
+or
+<a href="color.html#newcolor">NEWCOLOR</a>.
+</p>
+
+<p>
+The default inset is 6 <a
+href="definitions.html#picaspoints">points</a>, the default rule
+weight is .5 (points), and the default colour is black.
+</p>
+
+<!-- -PSPIC- -->
+
+<div class="macro-id-overline">
+<h3 id="pspic" class= "macro-id">PSPIC</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>PSPIC</b> <kbd class="macro-args">[ -L | -R | -I &lt;n&gt; ] &lt;file&gt; [ width [ height ] ]</kbd>
+</div>
+
+<p>
+PSPIC is not actually part of mom, but rather a macro included with
+every groff installation. <kbd>man groff_tmac</kbd> contains the
+documentation for PSPIC, but I&#8217;ll repeat it here with a few
+modifications for clarity.
+</p>
+
+<div class="examples-container">
+<h3 id="groff-tmac" class="docs" style="margin-top: .5em;">From <span style="text-transform: none">groff_tmac</span></h3>
+<p style="margin-top: .5em; margin-bottom: .5em;">
+<kbd>&lt;file&gt;</kbd> is the name of the file containing the
+image; <kbd>width</kbd> and <kbd>height</kbd> give the desired
+width and height of the image as you wish it to appear within the
+document. The width and height arguments may have
+<a href="definitions.html#unitofmeasure">units of measure</a>
+attached; the default unit of measure is <kbd>i</kbd>. PSPIC will
+scale the graphic uniformly in the x and y directions so that
+it is no more than <kbd>width</kbd> wide and <kbd>height</kbd>
+high. By default, the graphic will be horizontally centred. The
+<kbd>-L</kbd> and <kbd>-R</kbd> options cause the graphic to be
+left-aligned and right-aligned, respectively. The <kbd>-I</kbd>
+option causes the graphic to be indented by <kbd>&lt;n&gt;</kbd>;
+the default unit of measure is <kbd>m</kbd>
+(<a href="definitions.html#em">ems</a>).
+</p>
+</div>
+
+<p>
+It is not necessary to pass PSPIC the <kbd>&lt;width&gt;</kbd>
+and <kbd>&lt;height&gt;</kbd> arguments unless you are scaling
+the image, in which case you will most likely need the original
+dimensions of the EPS image&#8217;s bounding box. These can be
+found with
+<br/>
+<span class="pre-in-pp">
+ gs -q -dBATCH -dNOPAUSE -sDEVICE=bbox &lt;image file&gt;.pdf 2&gt;&amp;1 \
+ | grep "%%BoundingBox" | cut -d " " -f4,5
+</span>
+The two digits returned are in
+<a href="definitions.html#picaspoints">points</a>,
+therefore the
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+<kbd>p</kbd> must be appended to them.
+</p>
+
+<p>
+Because PSPIC lacks the <kbd>ADJUST</kbd> option offered by
+<a href="#pdf-image">PDF_IMAGE</a>
+a certain amount of manual tweaking of the vertical placement of the
+image will probably be required, typically by using the
+<a href="typesetting.html#ald">ALD</a>
+and
+<a href="typesetting.html#rld">RLD</a>
+macros. Wrapping the image in a
+<a href="#float">float</a>
+and using FLOAT&#8217;s <kbd>ADJUST</kbd> option can also be used to
+correct optical centering.
+</p>
+
+<p>
+Additionally, non-floated EPS images
+will almost certainly disrupt the baseline placement of
+<a href="definitions.html#running">running text</a>.
+In order to get mom back on track after inserting a non-floated
+<kbd>.PSPIC</kbd> image, insert the
+<a href="docprocessing.html#shim">SHIM</a>
+or
+<a href="docprocessing.html#flex">FLEX</a>
+macro afterwards, depending on the
+<a href="docprocessing.html#vertical-whitespace-management">vertical whitespace management</a>
+strategy in effect, so that the bottom margin of running text falls
+where it should.
+</p>
+
+<p>
+Remember that mom files with embedded EPS images must be processed
+with
+<br/>
+<span class="pre-in-pp">
+ pdfmom -Tps doc.mom &gt; doc.pdf
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Please note:</span>
+<kbd>PSPIC</kbd> does not support
+<a href="autolabel">autolabelling</a>,
+labels, captions, or inclusion in the List of Figures. If you wish
+this functionality,
+<a href="#converting">convert your images to pdf</a>
+and use
+<a href="#pdf-image">PDF_IMAGE</a>
+instead, then process the file with
+<a href="using.html#pdfmom" style="font-weight: bold">pdfmom</a>
+(without the <kbd>-Tps</kbd> option).
+</p>
+</div>
+<div class="rule-medium"><hr/></div>
+
+<h2 id="floats-intro" class="docs">Introduction to floats</h2>
+
+<p>
+Non-textual insertions in a document (tables, for example) sometimes
+do not fit on the output page of a PDF or PostScript document at
+the place they&#8217;re inserted in the input file. It&#8217;s
+necessary, therefore, to defer them to the next page while carrying
+on with
+<a href="definitions.html#running">running text</a>.
+</p>
+
+<p>
+Whenever you need this functionality, mom provides the FLOAT macro.
+</p>
+
+<p>
+Floats are usually used for images and graphics, but can contain
+anything you like, including text. Whatever&#8217;s in the
+float will be kept together as a block, output immediately if
+there&#8217;s room, or deferred to the top of the next output page
+when there isn&#8217;t; running text continues to the bottom of the
+previous page without interruption.
+</p>
+
+<p>
+In the case of a float that doesn&#8217;t fit being followed by
+one that does, both are deferred and output one after the other.
+Note that this represents a change from versions 2.1-b_1 and earlier
+where the second float was output in position and the first was
+deferred.
+</p>
+
+<p>
+A key distinction between a float and a
+<a href="docelement.html#quote">QUOTE</a>
+or
+<a href="docelement.html#blockquote">BLOCKQUOTE</a>
+is that while a float keeps everything together and defers output if
+necessary, quotes and blockquotes are output immediately, and may
+start on one page and finish on the next.
+</p>
+
+<p>
+Floats always begin in
+<a href="definitions.html#filled">no-fill mode</a>.
+Text entered immediately after FLOAT will be set line-for-line
+unless a
+<a href="typesetting.html#justify">JUSTIFY</a>
+or
+<a href="typesetting.html#quad">QUAD&nbsp;L|R|C</a>
+precedes it. Alternatively, any macro that sets a quad direction
+may be used, e.g.
+<a href="docelement.html#pp">PP</a>.
+</p>
+
+<p>
+Floats always deposit a break before they begin, which means the
+line beforehand will not be
+<a href="definitions.html#filled">filled</a>.
+Floats, therefore, cannot be inserted in the middle of a paragraph
+without studying the output file and determining where to break or
+<a href="typesetting.html#spread">spread</a>
+the line before the float. Furthermore, if you want a float between
+paragraphs, the float should come before <kbd>.PP</kbd>, like this:
+<br/>
+<span class="pre-in-pp">
+ .FLOAT
+ ...
+ .FLOAT OFF
+ .PP
+</span>
+not
+<br/>
+<span class="pre-in-pp">
+ .PP
+ .FLOAT
+ ...
+ .FLOAT OFF
+</span>
+</p>
+
+<p id="float-spacing">
+Floats begin on the baseline immediately below the running text
+preceding them. No additional whitespace surrounds them, above or
+below. Running text below a float is, however,
+<a href="docprocessing.html#shim">shimmed</a>
+or
+<a href="docprocessing.html#flex">flex-spaced</a>,
+depending on the
+<a href="docprocessing.html#vertical-whitespace-management">vertical whitespace management</a>
+strategy in effect. This behaviour can be disabled for individual
+floats with <kbd>NO_SHIM</kbd> or <kbd>NO_FLEX</kbd>.
+</p>
+
+<p>
+If you&#8217;d like more space around a float, you must add it
+manually, for example with
+<a href="typesetting.html#ald">ALD</a>
+or
+<a href="typesetting.html#space">SPACE</a>.
+</p>
+
+<!-- -FLOAT- -->
+
+<div class="macro-id-overline">
+<h3 id="float" class= "macro-id">FLOAT</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>FLOAT</b> <kbd class="macro-args">&lt;arguments&gt; | &lt;anything&gt;
+<br/>
+Arguments:
+<br/>
+[ ADJUST +|-&lt;amount&gt; ] \
+<br/>
+[ FORCE ] \
+<br/>
+[ SPAN ] \
+<br/>
+[ INDENT &lt;value&gt; ] \
+<br/>
+[ CENTER ] \
+<br/>
+[ RIGHT ] \
+<br/>
+[ NO_SHIM] \
+<br/>
+[ NO_FLEX ] \
+<br/>
+[ TARGET "&lt;name&gt;" ]</kbd>
+<br/>
+</div>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+FLOAT is intended for use with the document processing macros only.
+</p>
+</div>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+As a general rule, avoid consecutive floats that have no intervening
+<a href="definitions.html#running">running text</a>.
+Rather, wrap all the material into a single float.
+</p>
+</div>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Deferred floats are output with the left indent that was in effect
+when they were input. If you do not want this behaviour, disable
+the indent prior to inputting the float and re-enable it afterward.
+</p>
+</div>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Mom treats <b>pic</b> pre-processor directives and pdf images as
+floats so it is not necessary to wrap them inside FLOAT unless
+additional material is included in what is floated.
+</p>
+</div>
+
+<p style="margin-top: -.5em">
+To begin a float, simply invoke <kbd>.FLOAT</kbd> and follow it with
+whatever you want the float to contain. When you&#8217;re done,
+invoke <kbd>.FLOAT&nbsp;OFF</kbd> (or <kbd>OFF</kbd>,
+<kbd>QUIT</kbd>, <kbd>END</kbd>, <kbd>X</kbd>, etc).
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">ADJUST</h5>
+
+<p>
+The optional <kbd>ADJUST</kbd> argument tells mom to raise
+(<kbd>+</kbd>) or lower (<kbd>-</kbd>) the float <i>within
+the space allotted to it</i> by the specified amount.
+<kbd>&lt;amount&gt;</kbd> must have a
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+appended. <kbd>ADJUST</kbd> gives you precise control over
+the vertical centering of floats, allowing you to compensate for
+unequal spacing that may result from the automatic
+<a href="docprocessing.html#shim">shimming</a>
+or
+<a href="docprocessing.html#flex">flex-spacing</a>
+floats.
+</p>
+
+<p>
+<kbd>ADJUST</kbd> is ignored for the first float deferred to
+a following page but respected for subsequent deferred floats
+output immediately afterwards.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">FORCE</h5>
+
+<p>
+The <kbd>FORCE</kbd> argument instructs mom to output the float
+exactly where it occurs in the input file. With <kbd>FORCE</kbd>,
+mom immediately breaks to a new page to output the float if it does
+not fit on the current page. While this is somewhat contrary to the
+notion of floats (i.e. that running text should continue to fill the
+page), there are circumstances where it may be desirable.
+</p>
+
+<p>
+If you need to force a page break after completion of a float that
+has been deferred to a subsequent page, insert <kbd>\!.bp</kbd>
+immediately before terminating the float.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">SPAN</h5>
+
+<p>
+The <kbd>SPAN</kbd> argument tells mom that a float, if deferred,
+may carry onto multiple pages. Please note that <kbd>SPAN</kbd> may
+not be used for floats containing a boxed table; mom will abort with
+a warning should this occur. Unboxed tables, on the other hand, are
+acceptable within floats that are given the <kbd>SPAN</kbd> argument.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">INDENT</h5>
+
+<p>
+<kbd>INDENT</kbd> allows you to indent a float from the left margin
+by a specified value. The value must have a
+(<a href="definitions.html#unitofmeasure">unit of measure</a>
+appended to it.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">CENTER</h5>
+
+<p>
+<kbd>CENTER</kbd> instructs mom to center a float if it is not
+already centered by default.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">RIGHT</h5>
+
+<p>
+<kbd>RIGHT</kbd> instructs mom to place a float at the right of the
+page; the longest line in the float will be flush with the
+page&#8217;s right margin.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">NO_SHIM</h5>
+
+<p>
+<kbd>NO_SHIM</kbd> instructs mom not to apply
+<a href="docprocessing.html#shim-vs-flex">shimming</a>
+after a float, which she will do automatically when shimming is
+enabled, which it is by default. Shimming ensures that running text
+after the float falls properly on the page&#8217;s
+<a href="definitions.html#baseline-grid">baseline grid</a>,
+but can result in slightly unequal spacing above and below
+(correctable with the <kbd>ADJUST</kbd> argument).
+<kbd>NO_SHIM</kbd> is useful when you have several floats on the
+page and there are visible differences in the spacing beneath them
+as a result of shimming. To ensure a flush bottom margin, the last
+float on the page should be shimmed, i.e. should not be given the
+<kbd>NO_SHIM</kbd> argument.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">NO_FLEX</h5>
+
+<p>
+<kbd>NO_FLEX</kbd> instructs mom not to apply
+<a href="docprocessing.html#shim-vs-flex">flex-spacing</a>
+after a float, which she will do automatically when flex-spacing is
+enabled. <kbd>NO_FLEX</kbd> is useful when you have several floats
+on the page and you want to distribute excess vertical
+whitespace on the page amongst other flex-spacing points on the
+page. If there are no others, the final float should be
+flex-spaced, i.e. not given the <kbd>NO_FLEX</kbd> argument.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">TARGET</h5>
+
+<p>
+<kbd>TARGET</kbd> followed by a unique name surrounded by
+double-quotes creates a PDF target for the float so that it may be
+linked to from other places in the file (with PDF_LINK; see
+<a href="version-2.html#mom-pdf">Producing PDFs with groff and mom</a>).
+</p>
+
+<p>
+Floats cannot be autolabelled, so unlike pdf images and
+pre-processor material, the target name cannot be used as a string
+to generate the target&#8217;s label number in running text. Label
+numbers for floats must be entered explicitly running text, however
+they may be entered symbolically in the argument to
+<a href="#label">LABEL</a>.
+See
+<a href="#reserved-label-strings">Reserved variables for
+labels</a>.
+</p>
+
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span>
+Floats use
+<a href="definitions.html#filled">no-fill mode</a>,
+with each input line beginning at the left margin. If this is not
+what you want, you must specify the preferred horizontal alignment
+<i>within the float</i> (e.g.
+<a href="typesetting.html#lrc">CENTER</a>
+or
+<a href="typesetting.html#lrc">RIGHT</a>).
+</p>
+
+<p class="tip-bottom">
+Furthermore, if you want text
+<a href="definitions.html#filled">filled</a>,
+you must specify
+<a href="typesetting.html#quad"><kbd>.QUAD&nbsp;L|R|C</kbd></a>
+or
+<a href="typesetting.html#justify"><kbd>.JUSTIFY</kbd></a>&mdash;again,
+within the float.
+</p>
+</div>
+
+<h2 id="float-label-caption" class="docs">Labelling and captioning floats</h2>
+
+<p>
+Labelling and captioning of tables (<b>tbl</b>), equations
+(<b>eq</b>), diagrams (<b>pic</b>) and pdf images
+(<a href="#pdf-image">PDF_IMAGE</a>)
+are handled by the macros that initiate them, regardless of whether
+they&#8217;re wrapped inside a float. However, since a float may
+contain any valid input, it is sometimes necessary to add a label
+and/or caption to the float itself.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="important">Important:</span>
+Always use the native labelling/captioning facilities for
+preprocessor output and pdf images rather than labelling the
+containing float, if any.
+</p>
+</div>
+
+<p>
+The macros to label and caption floats are
+<a href="#label">LABEL</a>
+and
+<a href="#caption">CAPTION</a>.
+If a label or caption is to appear above the float, the appropriate
+macro is entered immediately after
+<a href="#float">FLOAT</a>.
+If a label or caption is to appear beneath the float, the appropriate
+macro is entered immediately before ending the float with
+<kbd>FLOAT&nbsp;OFF</kbd>.
+</p>
+
+<p>
+If a label and caption are to be joined, the <b>LABEL</b> macro is
+used to enter both by passing the <kbd>CAPTION</kbd> argument to
+<kbd>LABEL</kbd>.
+</p>
+
+<p>
+It is impossible for mom to know the contents of a float, so
+floats cannot be autolabelled. Each label must be entered
+explicitly. Mom does, however, provide a way to enter both
+chapter numbers and incrementing label numbers
+<a href="#reserved-label-strings">symbolically</a>,
+easing the burden of keeping the numbering scheme intact as
+labelled floats are added to or subtracted from a document.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Tip:</span>
+<a href="docelement.html#blockquote">QUOTE</a>
+and
+<a href="docelement.html#blockquote">BLOCKQUOTE</a>
+may also be labelled and captioned using <b>LABEL</b> and
+<b>CAPTION</b>.
+</p>
+</div>
+
+<h4 class="docs">Spacing</h4>
+
+<p>
+If a float has a caption at the top, the caption is whitespaced
+1/4 linespace from running text and the float itself begins
+an additional 1/4 linespace below the caption. If the float has
+no corresponding label at the bottom, the float observes the
+bottom-spacing rules for all floats, namely that no extra space is
+added other than
+<a href="docprocessing.html#shim">shimming</a>
+or
+<a href="docprocessing.html#shim-vs-flex">flex-spacing</a>,
+depending on the
+<a href="docprocessing.html#vertical-whitespace-management">vertical whitespace management</a>
+in effect.
+</p>
+
+<p>
+If a float has a label at the bottom but no caption at the top, the
+float begins exactly where started, i.e. with no extra whitespace
+between running text and the float. The label (and attached
+caption, if any) are whitespaced 1/4 linespace below the float,
+with an additional 1/4 linespace underneath <i>plus</i> shimming or
+flex-spacing.
+</p>
+
+<p>
+Labelled/captioned quotes and blockquotes inside floats treat the
+labels/captions as part of the quote so the spacing above and
+below the whole float block is what you&#8217;d expect from quotes
+normally, while the spacing between the label/caption and the quote
+is 1/4 linespace.
+</p>
+
+<div class="macro-id-overline">
+<h3 id="label" class="macro-id">LABEL</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>LABEL</b>
+<kbd class="macro-args">"&lt;label&gt;" [ CAPTION "&lt;caption&gt;" ] [ SHORT_CAPTION ] \
+<br/>
+[ TO_LIST FIGURES | TABLES | EQUATIONS ]</kbd>
+</div>
+
+<p>
+The placement of a float&#8217;s label depends on where you put it
+inside the float.
+</p>
+
+<p>
+If you want a label at the top, put <kbd>LABEL</kbd> immediately
+underneath
+<a href="#float">FLOAT</a>
+and follow it with the text of the label surrounded by double-quotes:
+<br/>
+<span class="pre-in-pp">
+ .FLOAT
+ .LABEL "Fig. 1"
+</span>
+If you want a label at the bottom, put <kbd>LABEL</kbd> immediately
+before ending the float:
+<br/>
+<span class="pre-in-pp">
+ .FLOAT
+ &lt;contents of float&gt;
+ .LABEL "Fig. 1"
+ .FLOAT OFF
+</span>
+</p>
+
+<h3 id="reserved-label-strings" class="docs" style="text-transform: none">Reserved variables for labels</h3>
+
+<p>
+Mom reserves strings you may use when entering
+label text after the <kbd>LABEL</kbd> argument.
+<kbd><span class="nobr">\*[chapter]</span></kbd> holds the current chapter
+or major section number. <kbd><span class="nobr">\*[fig-label]</span></kbd>,
+<kbd><span class="nobr">\*[tbl-label]</span></kbd>, and
+<kbd><span class="nobr">\*[eqn-label]</span></kbd> increment the label number of
+the appropriate label type by one, and are initially set to zero
+after each invocation of
+<a href="docprocessing.html#start">START</a>
+when the
+<a href="docprocessing.html#doctype">DOCTYPE</a>
+is <kbd>CHAPTER</kbd>. Thus, in every chapter requiring numbered
+float labels, you can enter
+<br/>
+<span class="pre-in-pp">
+ .LABEL "Fig. \*[chapter].\*[fig-label]. TO_LIST FIGURES
+</span>
+which, assuming the third autolabelled float of Chapter 2, will
+produce <kbd>Fig. 2.3.</kbd>
+</p>
+
+<p>
+If your <b>DOCTYPE</b> is <kbd>DEFAULT</kbd> or <kbd>NAMED</kbd>,
+you must reset <kbd><span class="nobr">\*[&lt;type&gt;-label]</span></kbd> after
+each
+<a href="docprocessing.html#collate">COLLATE</a>
+by entering
+<br/>
+<span class="pre-in-pp">
+ .AUTOLABEL_&lt;list type&gt;
+</span>
+before <kbd>.START</kbd>.
+</p>
+
+<p>
+If
+<a href="#autolabel">autolabelling</a>
+is enabled, e.g. <kbd>.AUTOLABEL_IMAGES</kbd> (List
+of Figures) or <kbd>.AUTOLABEL_PIC</kbd> (also List of Figures),
+the prefix is stripped from the label when it appears in
+the List. Thus, if you have invoked <kbd>.AUTOLABEL_PIC</kbd>,
+<br/>
+<span class="pre-in-pp">
+ .LABEL "Fig. 1.1."
+ CAPTION "Caption for label \
+ TO_LIST FIGURES
+</span>
+or
+<br/>
+<span class="pre-in-pp">
+ .LABEL "Fig. \*[chapter].\*[label]." \
+ CAPTION "Caption for label \
+ TO_LIST FIGURES
+</span>
+will appear in the List of Figures as &#8220;1.1.&nbsp;&nbsp;Caption for
+label&#8221;.
+</p>
+
+<h3 class="docs">CAPTION</h3>
+
+<p>
+If you&#8217;d like a caption attached to the label, pass
+<kbd>LABEL</kbd> the optional argument <kbd>CAPTION</kbd> followed
+by the text of the caption as a single string surrounded by
+double-quotes:
+<br/>
+<span class="pre-in-pp">
+ .FLOAT
+ &lt;contents of float&gt;
+ .LABEL "Fig. 1" CAPTION "Caption for Fig. 1"
+ .FLOAT OFF
+</span>
+Note that the
+<a href="#caption">CAPTION</a>
+macro by itself permits entering several strings, each output on
+a line by itself, whereas the <kbd>CAPTION</kbd> argument to
+<kbd>LABEL</kbd> accepts only a single string.
+</p>
+
+<h3 class="docs">SHORT_CAPTION</h3>
+
+<p>
+If your caption runs long and you&#8217;re including the
+float in a &#8220;List of ...&#8221;, (see
+<a href="#list-of">TO_LIST</a>, below)
+<kbd>SHORT_CAPTION</kbd> tells
+mom how you&#8217;d like the caption to appear in the List.
+</p>
+
+<h3 class="docs">TO_LIST</h3>
+
+<p>
+The optional argument <kbd>TO_LIST</kbd> tells mom to add the
+float&#8217;s label and attached caption, if present, to the specified
+<a href="#lists-of">list</a>,
+which may be one of <kbd>FIGURES</kbd>, <kbd>TABLES</kbd>, or
+<kbd>EQUATIONS</kbd>.
+</p>
+
+<p>
+If, for some reason, you want only the caption appended to the List,
+give <kbd>\&amp;</kbd> as the first argument to LABEL, followed by
+<kbd>CAPTION&nbsp;&#8220;caption&#8221;</kbd>:
+<br/>
+<span class="pre-in-pp">
+ .LABEL \&amp; \
+ CAPTION "caption"
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Tip:</span>
+<kbd>TO_LIST</kbd> can be used to handle situations where labelled
+floats need to go to a uniquely named &#8220;List of ...&#8221;.
+</p>
+
+<p class="tip-bottom">
+Suppose, for example, your document contains figures (e.g.
+<b>pic</b> output or pdf-images) and tables, and you need a
+&#8220;List of Examples&#8221; for floats labelled &#8220;Example
+n.n&#8221;. By changing the default title string for
+<a href="#lists-macros">LIST_OF_EQUATIONS</a>
+to &#8220;List of Examples&#8221;, you may include the float in your
+List of Examples with
+<br/>
+<span class="pre-in-pp">
+ .TO_FIGURES EQUATIONS
+</span>
+</p>
+</div>
+
+<div class="macro-id-overline">
+<h3 id="caption" class="macro-id">CAPTION</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>CAPTION</b>
+<kbd class="macro-args">"&lt;caption&gt;" \
+<br/>
+[ "&lt;additional line&gt;" [ "&lt;additional line&gt;"... ] ] \
+<br/>
+[ TO_LIST FIGURES | TABLES | EQUATIONS ]</kbd>
+</div>
+
+<p>
+The placement of a float&#8217;s caption depends on where you put it
+inside the float.
+</p>
+
+<p>
+If you want a caption at the top, put <kbd>CAPTION</kbd> immediately
+underneath
+<a href="#float">FLOAT</a>
+and follow it with the text of the caption surrounded by double-quotes:
+<br/>
+<span class="pre-in-pp">
+ .FLOAT
+ .CAPTION "Caption at top of float"
+</span>
+<b>CAPTION</b> can take multiple string arguments, allowing for
+captions that run to several lines. There is a caveat: the strings
+are not automatically broken into individual lines. You must
+provide strings that include literal breaks or spaces:
+<br/>
+<span class="pre-in-pp">
+ .FLOAT
+ .CAPTION "Caption" ".BR" "at top" ".BR" "of float"
+</span>
+or, easier to read:
+<br/>
+<span class="pre-in-pp">
+ .FLOAT
+ .CAPTION "Caption" \
+ ".BR" \
+ "at top" \
+ ".BR" \
+ "of float"
+</span>
+If you want a caption at the bottom, put <kbd>CAPTION</kbd> immediately
+before ending the float:
+<br/>
+<span class="pre-in-pp">
+ .FLOAT
+ &lt;contents of float&gt;
+ .CAPTION "Caption at bottom of float"
+ .FLOAT OFF
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If you want a caption attached to a label, do not use
+<b>CAPTION</b> by itself. Rather, invoke
+<a href="#label"><kbd>.LABEL</kbd></a>
+with the <kbd>CAPTION</kbd> argument.
+</p>
+</div>
+
+<div class="rule-medium"><hr/></div>
+
+<h2 id="preprocessor-support" class="docs">Preprocessor support</h2>
+
+<p>
+Mom offers full support for the <b>eqn</b> (equations), <b>pic</b>
+(diagrams), <b>grap</b> (graphs), <b>tbl</b> (tables) and
+<b>refer</b> (bibliographies/citations) preprocessors, including
+captions, labelling, autolabelling, and inclusion in the Lists of
+Equations, Figures, and Tables.
+</p>
+
+<p>
+Other than <b>refer</b>, which is discussed at length in the <a
+href="refer.html">Bibliographies and references</a> section, it is
+beyond the scope of this documentation to cover full preprocessor
+usage. Consult the manpages <b>eqn(1)</b>, <b>pic(1)</b>,
+<b>grap(1)</b> and <b>tbl(1)</b> for instructions.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Version 2.0-c changes</span>
+<br/>
+Preprocessor support has been revised and expanded as of version 2.0-c.
+Please read the following sections thoroughly and update any
+documents created with versions prior to 2.0-c as necessary.
+</p>
+</div>
+
+<h3 id="tbl" class="docs">tbl support</h3>
+
+<p>
+Mom documents can include tables generated with the groff
+preprocessor <b>tbl</b>. If you are unfamiliar with <b>tbl</b>, I
+recommend downloading a copy of
+<a href="http://plan9.bell-labs.com/10thEdMan/tbl.pdf">Tbl - A Program to Format Tables</a>,
+which, in addition to providing a thorough introduction, contains
+some fine examples. If you use <b>tbl</b>, you must pass groff or
+pdfmom the <b>-t</b> flag when you process the file.
+</p>
+
+<p>
+Tables formatted with <kbd>tbl</kbd> begin with the macro
+<kbd>.TS</kbd> (<b>T</b>able <b>S</b>tart) and end with
+<kbd>.TE</kbd> (<b>T</b>able <b>E</b>nd). Depending on where you
+want your tables output in a document, you may need to wrap
+your <kbd>tbl</kbd> code inside a
+<a href="#floats-intro">float</a>,
+or pass the <kbd>H</kbd> argument to <kbd>.TS</kbd>.
+</p>
+
+<p>
+If you put <kbd>tbl</kbd> code inside a float, the table will be
+output immediately if it fits on the page, or deferred to the top
+of the next page if it doesn&#8217;t. If you prefer a table to
+begin where you say and span over to the next page, or if you know
+for certain a boxed table will run to multiple pages, simply pass the
+<kbd>H</kbd> argument to <kbd>.TS</kbd>, along with a corresponding
+<a href="#th"><kbd>TH</kbd></a>
+and do not wrap the table inside a float.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If you create a boxed table that will span several pages, do not
+wrap the table inside a float. Boxed, multipage tables and FLOAT
+should be considered mutually exclusive. This restriction is
+imposed by the <kbd>tbl</kbd> preprocessor itself, not groff or
+mom. Unboxed tables that span several pages, however, are
+acceptable within FLOAT.
+</p>
+</div>
+
+<h4 id="tbl-placement" class="docs">tbl placement in mom docs</h4>
+
+<p>
+If you use <kbd>.TS</kbd> without the <kbd>H</kbd> argument (and
+therefore no <kbd>.TH</kbd>), tables that fit on the page are output
+in position. If there is not enough room to output the table,
+<kbd>tbl</kbd> will abort with message instructing you to use
+<kbd>.TS H/.TH</kbd>. Given that <kbd>.TS</kbd> without <kbd>H</kbd>
+may sometimes fail, it is advisable to begin all <b>tbl</b> blocks
+with <kbd>.TS H</kbd>.
+</p>
+
+<p>
+If you give <kbd>.TS</kbd> the <kbd>H</kbd> argument (with a
+corresponding <kbd>.TH</kbd>), tables will be output in position and
+span as many pages as necessary to complete output. A table header
+will be printed at the top of each page&#8217;s table output. In the
+event that there is not enough room to print the table header and
+at least one row of table data near the bottom of a page, mom will
+break to a new page before beginning table output, leaving a gap
+in
+<a href="definitions.html#running">running text</a>.
+</p>
+
+<p>
+Boxed tables inside
+<a href="#floats-intro">floats</a>
+are output in position if they fit on the page. If not, they are
+deferred to the top of the next page without a break in running
+text. Boxed tables within floats may not, however, span multiple
+pages; mom will abort with a message should a boxed table in a float
+run longer than the page.
+</p>
+
+<p>
+Unboxed tables inside floats may span multiple pages provided the
+<kbd>SPAN</kbd> argument has been given to
+<a href="#float">FLOAT</a>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+The vertical spacing around unfloated tables may appear slightly
+unequal, especially if there are several tables on the page. This
+is a result of the
+<a href="docprocessing.html#shim">shimming</a>
+or
+<a href="docprocessing.html#flex">flex-spacing</a>
+that mom applies automatically after each table, depending on which
+<a href="docprocessing.html#vertical-whitespace-management">vertical whitespace management</a>
+is in effect. You may
+disable shimming or flex-spacing with
+<a href="docprocessing.html#no-shim">NO_SHIM</a>
+or
+<a href="docprocessing.html#no-flex">NO_FLEX</a>,
+or by passing the <kbd>NO_SHIM</kbd> or <kbd>NO_FLEX</kbd> argument
+to <kbd>.TS</kbd>. In either case, you will still likely want to
+adjust the spacing around with table with the <kbd>ADJUST</kbd>
+argument to <kbd>.TS</kbd>. Tables inside floats should be adjusted
+with the <kbd>ADJUST</kbd> argument to
+<a href="#float">FLOAT</a>,
+not the <kbd>ADJUST</kbd> argument to <kbd>.TS</kbd>.
+</p>
+</div>
+
+<div class="macro-id-overline">
+<h3 id="ts-te" class= "macro-id">.TS / .TH / .TE</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <a href="#ts"><b>TS</b></a>
+<kbd class="macro-args"><br/>
+Arguments:
+<br/>
+&nbsp;&nbsp;[ H ]
+<br/>
+&nbsp;&nbsp;[ BOXED ]
+<br/>
+&nbsp;&nbsp;[ CENTER ]
+<br/>
+&nbsp;&nbsp;[ NEEDS ]
+<br/>
+&nbsp;&nbsp;[ ADJUST +|-&lt;vertical adjustment&gt;]</kbd>
+<span style="font-size: 95%">
+(<a href="definitions.html#unitofmeasure">unit of measure</a>
+required)
+</span>
+<kbd class="macro-args"><br/>
+&nbsp;&nbsp;[ NO_SHIM ]
+<br/>
+&nbsp;&nbsp;[ NO_FLEX ]
+<br/>
+&nbsp;&nbsp;[ CAPTION "&lt;caption&gt;" ]
+<br/>
+&nbsp;&nbsp;[ SHORT_CAPTION "&lt;short caption&gt;" ]
+<br/>
+&nbsp;&nbsp;[ LABEL "&lt;label&gt;" ]
+<br/>
+&nbsp;&nbsp;[ TARGET "&lt;name&gt;" ]
+</kbd>
+<br/>
+Macro: <a href="#th"><b>TH</b></a> <kbd class="macro-args">(optional, only if .TS H)</kbd>
+<br/>
+Macro: <a href="#te"><b>TE</b></a> <kbd class="macro-args">[ SOURCE "&lt;text of table source&gt;" ]</kbd>
+</div>
+
+<p>
+Tables to be formatted with <kbd>tbl</kbd> begin with the macro
+<kbd>.TS</kbd> and end with <kbd>.TE</kbd>. Global <kbd>tbl</kbd>
+options (&#8220;flags&#8221;), formatting, and data (per
+<kbd>tbl(1)</kbd>) come between the two macros.
+<br/>
+<span class="pre-in-pp">
+ .TS
+ &lt;tbl options, formatting, and data&gt;
+ .TE
+</span>
+Tables may be wrapped inside a
+<a href="#float-intro">float</a>,
+in which case, the entire table will be output on the current page
+if it fits, or deferred to the next page if it doesn&#8217;t.
+<br/>
+<span class="pre-in-pp">
+ .FLOAT
+ .TS
+ &lt;tbl options, formatting, and data&gt;
+ .TE
+ .FLOAT OFF
+</span>
+</p>
+
+<div class="macro-id-overline">
+<h4 id="ts" class="docs" style="font-size: 100%; margin-top: .5em">The .TS macro</h4>
+</div>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note: Version 2.0-c change</span>
+<br/>
+2.0-c introduces revisions to the handling of labels and/or
+captions, which, along with <kbd>NO_SHIM</kbd>, must now be given
+as arguments to <kbd>.TS</kbd> rather than <kbd>.TE</kbd>, as was
+the case formerly. Please read this section carefully if you have
+documents containing tables as they may need to be updated.
+</p>
+</div>
+
+<div class="box-important" style="margin-top: 1em">
+<p class="tip">
+<span class="important">IMPORTANT:</span>
+All arguments to <b>TS</b> must appear on the same line as
+<kbd>.TS</kbd>. Do not attempt to break them up with the
+&#8220;line-continued&#8221; backslash. You may want to set your
+text editor to &#8220;wrap&#8221; mode in order to see all your
+arguments. This annoyance stems from the preprocessor mechanism
+itself, not groff or mom.
+</p>
+</div>
+
+<p>
+The <b>TS</b> macro must be invoked before entering a <kbd>tbl</kbd>
+block. You may give as many or as few of its arguments as required,
+in any order, although it is advisable to put <kbd>CAPTION</kbd>,
+<kbd>SHORT_CAPTION</kbd>, and/or <kbd>LABEL</kbd> last.
+</p>
+
+<h5 id="h" class="docs" style="margin-top: 1em; text-transform: none">H</h5>
+
+<p>
+With the <b>H</b> argument, a table will span as many pages as
+necessary, with or without a running header. The placement of the
+corresponding
+<a href="#th"><kbd>.TH</kbd></a>,
+which is required whenever the <b>H</b> argument is given,
+determines what, if anything, goes in the header. Compare the
+following:
+<span class="pre-in-pp">
+ .TS H .TS H
+ c s s c s s
+ c s s c s s
+ c c c c c c
+ n n n. n n n.
+ Percent Increase .TH
+ 2002-2012 Percent Increase
+ .TH 2002-2012
+ &lt;tbl data&gt; &lt;tbl data&gt;
+ .TE .TE
+</span>
+The first example will create a table that spans multiple
+pages if necessary, with a running header (&#8220;Percent
+Increase&nbsp;/&nbsp;2002-2012&#8221;) for that table appearing at
+the top of each page until the table ends. The second example,
+equally, may run to several pages, but without the running header.
+See
+<a href="#th"><b>TH</b></a>
+for an explanation of <kbd>.TH</kbd> placement.
+</p>
+
+<div id="h-tip" class="box-tip">
+<p class="tip">
+<span class="note">Tip:</span>
+Generally speaking, it&#8217;s a good idea to get into the habit
+of using <kbd>.TS H</kbd> all the time, since there are no
+circumstances under which it fails, whereas <kbd>.TS</kbd> without
+<kbd>H</kbd> will fail on tables that exceed the page length.
+</p>
+</div>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">BOXED</h5>
+
+<p>
+If a table is to be boxed (i.e., <kbd>tbl</kbd> is given the flags
+<kbd>'box'</kbd> or <kbd>'allbox'</kbd>) you must pass the argument
+<kbd>BOXED</kbd> to <kbd>.TS</kbd>, as in this example:
+<br/>
+<span class="pre-in-pp">
+ .TS BOXED
+ allbox;
+ c s s
+ c c c
+ n n n.
+ &lt;tbl data&gt;
+ .TE
+</span>
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">CENTER</h5>
+
+<p>
+If a table is to be centered on the page, (i.e., <kbd>tbl</kbd> is
+given the <kbd>'center'</kbd> flag), you must pass the argument
+<kbd>CENTER</kbd> to <kbd>.TS</kbd>, as in this example, which
+creates a (possibly) multipage boxed table, centered on the page,
+with a running header.
+<span class="pre-in-pp">
+ .TS H BOXED CENTER
+ allbox center;
+ c s s
+ c s s
+ c c c
+ n n n.
+ Percent Increase
+ 2002-2012
+ .TH
+ &lt;tbl data&gt;
+ .TE
+</span>
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">NEEDS</h5>
+
+<p>
+If a table is not inside a float and you pass <kbd>.TS </kbd> the
+<kbd>H</kbd> argument (which you should; see the tip
+<a href="#h-tip">here</a>),
+mom begins output immediately where the table occurs in the
+input file <i>if there is enough room on the output page for the
+table header plus at least one row of table data</i>. If there
+isn&#8217;t enough room, mom breaks to a new page before beginning
+the table, leaving a gap in
+<a href="definitions.html#running">running text</a>
+at the bottom of the previous page. If, for aesthetic reasons,
+you would prefer that mom require more than one row of table data
+beneath the header near the bottom of a page, you may increase the
+number with the <kbd>NEEDS</kbd> argument, followed by the desired
+number of rows.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">ADJUST</h5>
+
+<p>
+<kbd>ADJUST</kbd> lets you raise (<kbd>-</kbd>) or lower
+(<kbd>+</kbd>) the table
+<span style="font-style: italic">within the space allotted for it</span>
+by the amount you specify. This is useful for achieving good
+optical centering between surrounding blocks of type. A unit of
+measure is required.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">NO_SHIM</h5>
+
+<p>
+<kbd>NO_SHIM</kbd> instructs mom not to apply
+<a href="docprocessing.html#shim-vs-flex">shimming</a>
+after a table, which she will do automatically when shimming is
+enabled, which it is by default. Shimming ensures that running text
+after the table falls properly on the page&#8217;s
+<a href="definitions.html#baseline-grid">baseline grid</a>,
+but can result in slightly unequal spacing above and below
+(correctable with the <kbd>ADJUST</kbd> argument).
+<kbd>NO_SHIM</kbd> is useful when you have several tables on the
+page and there are visible differences in the spacing beneath them
+as a result of shimming. To ensure a flush bottom margin, the last
+table on the page should be shimmed, i.e. should not be given the
+<kbd>NO_SHIM</kbd> argument.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">NO_FLEX</h5>
+
+<p>
+<kbd>NO_FLEX</kbd> instructs mom not to apply
+<a href="docprocessing.html#shim-vs-flex">flex-spacing</a>
+after a table, which she will do automatically when flex-spacing is
+enabled. <kbd>NO_FLEX</kbd> is useful when you have several tables
+on the page and you want to distribute excess vertical
+whitespace on the page amongst other flex-spacing points on the
+page. If there are no others, the final table should be
+flex-spaced, i.e. not given the <kbd>NO_FLEX</kbd> argument.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">CAPTION</h5>
+
+<p>
+<kbd>CAPTION</kbd> allows you to give the table a caption. By
+default, the caption appears above the table, but may be attached to
+the label that appears beneath the table. See
+<a href="#caption-after-label">CAPTION_AFTER_LABEL</a>
+in
+<a href="#captions-and-labels">Captions and labels</a>.
+The text of the caption must be surrounded by double-quotes.
+</p>
+
+<p>
+Please note that if your table has a caption, you must invoke
+<kbd>TS</kbd> with the <kbd>H</kbd> flag, which also entails the use
+of
+<a href="#th">TH</a>.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">SHORT_CAPTION</h5>
+
+<p>
+<kbd>SHORT_CAPTION</kbd> allows you to trim long captions for
+inclusion in the List of Tables. The text you supply, surrounded
+by double-quotes, is what will appear in the List.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">LABEL</h5>
+
+<p>
+<kbd>LABEL</kbd>, if given, appears beneath the table. The text you
+supply, surrounded by double-quotes, is how the table is labelled
+in both the document proper and the List of Tables. Mom provides
+an auto-labelling facility for tables (see
+<a href="#autolabel">AUTOLABEL</a>),
+which, if enabled, overrides the <kbd>LABEL</kbd> argument.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">TARGET</h5>
+
+<p>
+<kbd>TARGET</kbd> followed by a unique name surrounded by
+double-quotes creates a PDF target for the table so that it may be
+linked to from other places in the file (with PDF_LINK; see
+<a href="version-2.html#mom-pdf">Producing PDFs with groff and mom</a>).
+</p>
+
+<p>
+<b><i>Please note:</i></b> The following functionality is available
+only with groff 1.22.4 or later.
+</p>
+
+<p>
+When
+<a href="#autolabel">autolabelling</a>
+is enabled and the document is processed with
+<a href="using.html#pdfmom" style="font-weight: bold">pdfmom</a>,
+the target name can be used to generate the target&#8217;s label
+number in running text if it is entered as a groff string, i.e. of
+the form <kbd><span class="nobr">\*[name]</span></kbd>. For example, if you
+create a target called &#8220;foo&#8221; for a table whose autolabel
+number would be 3, entering
+<br/>
+<span class="pre-in-pp">
+ See
+ .PDF_LINK foo "Table \*[foo]"
+</span>
+anywhere in running text would result in a pdf link that reads
+&#8220;Table 3&#8221;. If chapter numbers are being prefixed to
+labels, the same string in, say, chapter 5 would produce the pdf
+link &#8220;Table 5.3&#8221;.
+</p>
+
+<div class="macro-id-overline">
+<h4 id="th" class="docs" style="font-size: 100%; margin-top: .5em">The .TH macro</h4>
+</div>
+
+<p>
+The <b>TH</b> macro (<b>T</b>able <b>H</b>eader), which is required
+when you begin a table with <kbd>.TS H</kbd>, allows you to
+determine what goes in a table&#8217;s running header if it spans
+multiple pages. Placing <kbd>.TH</kbd> under the first row of
+<kbd>tbl</kbd> data makes the first row the header. If placed under
+the second row, the first and second rows form the header, and so
+on.
+</p>
+
+<p>
+As there are sometimes reasons to run <kbd>.TS H</kbd> when
+you don&#8217;t, in fact, want a running header (e.g. when
+your table has a caption), you can suppress it by placing
+<kbd>.TH</kbd> immediately underneath your <kbd>tbl</kbd> formatting
+specifications, the last line of which always ends with a period
+(see <kbd>tbl(1)</kbd>).
+</p>
+
+<p>
+See the
+<kbd><a href="#h">H</a></kbd>
+argument to <kbd>.TS</kbd> for examples demonstrating <kbd>.TH</kbd>
+placement.
+</p>
+
+<div class="macro-id-overline">
+<h4 id="te" class="docs" style="font-size: 100%; margin-top: .5em">The .TE macro</h4>
+</div>
+
+<p>
+<kbd>tbl</kbd> blocks must be terminated with <kbd>.TE</kbd>,
+which, as of version 2.0-c, takes a single, optional argument,
+<kbd>SOURCE</kbd>. (Formerly, <kbd>TE</kbd> took a label/caption
+argument along with arguments controlling placement.) The argument
+is followed by the text of the table&#8217;s source, surrounded by
+double-quotes. The SOURCE argument may only be used if
+<a href="#mla">MLA</a>
+(Modern Language Association) style is enabled.
+</p>
+
+<div class="rule-medium"><hr/></div>
+
+<h3 id="pic" class="docs">pic support</h3>
+
+<p>
+Mom documents can include diagrams generated with the groff
+preprocessor <b>pic</b>. If you are unfamiliar with <b>pic</b>, I
+recommend downloading a copy of
+<a href="http://www.kohala.com/start/troff/gpic.raymond.ps">Making Pictures with GNU PIC</a>
+which provides a thorough introduction and contains many examples.
+If you use <b>pic</b>, you must pass groff or pdfmom the <b>-p</b>
+flag when you process the file.
+
+</p>
+
+<p>
+Diagrams created with <kbd>pic</kbd> begin with the macro
+<kbd>.PS</kbd> (<b>P</b>ic <b>S</b>tart) and end with
+<kbd>.PE</kbd> (<b>P</b>ic <b>E</b>nd). Everything between them is
+interpreted by the preprocessor as pic instructions. Please note:
+<i>Making Pictures with GNU PIC</i> says that <kbd>.PF</kbd> can
+also be used to terminate a pic diagram, but this is not supported
+by mom.
+</p>
+
+<p>
+Pic diagrams are always centered. Note that this represents a
+change from version 2.0-b of mom, where centering diagrams required
+passing <kbd>-mpic</kbd> to <b>groff</b> or
+<a href="using.html#pdfmom" style="font-weight: bold">pdfmom</a>
+on the command line.
+</p>
+
+<p>
+In addition, mom treats <b>pic</b> diagrams identically to
+<a href="#floats-intro">floats</a>,
+which is to say that if a diagram doesn&#8217;t fit on the output
+page, she will defer it to the top of the next page while continuing
+to process
+<a href="definitions.html#running">running text</a>.
+<kbd>ADJUST</kbd> is ignored whenever a diagram is deferred, except
+when moving from column to column on the same page, when the diagram
+may need to be optically adjusted. Subsequent diagrams that do not
+fit, if any, are output in order immediately after the first.
+</p>
+
+<p>
+Lastly, if your diagrams contain text, you may set all the type
+parameters for the text (family, font, size, leading) separately
+from the <b>pic</b> block with the macro
+<a href="#pic-text-style">PIC_TEXT_STYLE</a>.
+If you need to change the type parameters within the block
+on-the-fly, you must use <b>pic</b>&#8217;s native facilities for
+doing so.
+</p>
+
+<div class="macro-id-overline">
+<h3 id="ps-pe" class= "macro-id">.PS / .PE</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>PS</b>
+<kbd class="macro-args">
+<br/>
+Arguments: [ &lt;width&gt;&nbsp;&lt;height&gt; ]
+<kbd class="macro-args">
+<br/>
+&nbsp;&nbsp;[ LEFT ]</kbd>
+<br/>
+&nbsp;&nbsp;[ ADJUST +|-&lt;vertical adjustment&gt;]</kbd>
+<span style="font-size: 95%">
+(<a href="definitions.html#unitofmeasure">unit of measure</a>
+required)
+</span>
+<kbd class="macro-args"><br/>
+&nbsp;&nbsp;[ NO_SHIM ]
+<br/>
+&nbsp;&nbsp;[ NO_FLEX ]
+<br/>
+&nbsp;&nbsp;[ CAPTION "&lt;caption&gt;" ]
+<br/>
+&nbsp;&nbsp;[ SHORT_CAPTION "&lt;short caption&gt;" ]
+<br/>
+&nbsp;&nbsp;[ LABEL "&lt;label&gt;" ]
+<br/>
+&nbsp;&nbsp;[ TARGET "&lt;name&gt;" ]
+</kbd>
+<br/>
+Macro: <b>PE</b> <span style="font-size: 95%">(no arguments; ends
+the <b>pic</b> block)</span>
+</div>
+
+<div class="box-important" style="margin-top: 1.5em">
+<p class="tip">
+<span class="important">IMPORTANT:</span>
+All arguments to <b>PS</b> must appear on the same line as
+<kbd>.PS</kbd>. Do not attempt to break them up with the
+&#8220;line-continued&#8221; backslash. You may want to set your
+text editor to &#8220;wrap&#8221; mode in order to see all your
+arguments. This annoyance stems from the preprocessor mechanism
+itself, not groff or mom.
+</p>
+</div>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">'width' and 'height'</h5>
+
+<p>
+The <kbd>width</kbd> and <kbd>height</kbd> arguments to
+<kbd>.PS</kbd> are idiosyncratic owing to the preprocessor itself.
+Both are optional and both expect a value in inches, so neither
+argument should have a
+(<a href="definitions.html#unitofmeasure">unit of measure</a>
+appended.
+</p>
+
+<p>
+If the <kbd>width</kbd> argument is supplied, the diagram, but
+not any text it contains, is scaled to the given width. If a
+literal width argument of <kbd>0</kbd> (zero) is given and a
+<kbd>height</kbd> argument is supplied, the diagram, but not any
+text it contains, will be scaled to the requested height. In the
+case of two non-zero arguments being given, only the height scaling
+is applied.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">LEFT</h5>
+
+<p>
+By default, pic diagrams are centred on the page. If you would
+prefer them to be flush left, pass <kbd>PS</kbd> the <kbd>LEFT</kbd>
+argument.
+</p>
+<h5 class="docs" style="margin-top: 1em; text-transform: none">ADJUST</h5>
+
+<p>
+<kbd>ADJUST</kbd> lets you raise (<kbd>-</kbd>) or lower
+(<kbd>+</kbd>) a diagram
+<span style="font-style: italic">within the space allotted for it</span>
+by the amount you specify. This is useful for achieving good
+optical centering between surrounding blocks of type. A unit of
+measure is required.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">NO_SHIM</h5>
+
+<p>
+<kbd>NO_SHIM</kbd> instructs mom not to apply
+<a href="docprocessing.html#shim-vs-flex">shimming</a>
+after a <b>pic</b> diagram, which she will do automatically when
+shimming is enabled, which it is by default. Shimming ensures that
+running text after the diagram falls properly on the page&#8217;s
+<a href="definitions.html#baseline-grid">baseline grid</a>,
+but can result in slightly unequal spacing above and below
+(correctable with the <kbd>ADJUST</kbd> argument).
+<kbd>NO_SHIM</kbd> is useful when you have several diagrams on the
+page and there are visible differences in the spacing beneath them
+as a result of shimming. To ensure a flush bottom margin, the last
+diagram on the page should be shimmed, i.e. should not be given the
+<kbd>NO_SHIM</kbd> argument.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">NO_FLEX</h5>
+
+<p>
+<kbd>NO_FLEX</kbd> instructs mom not to apply
+<a href="docprocessing.html#shim-vs-flex">flex-spacing</a>
+after a <b>pic</b> diagram, which she will do automatically when
+flex-spacing is enabled. <kbd>NO_FLEX</kbd> is useful when you
+have several diagrams on the page and you want to distribute excess
+vertical whitespace on the page amongst other flex-spacing points
+on the page. If there are no others, the final diagram should be
+flex-spaced, i.e. not given the <kbd>NO_FLEX</kbd> argument.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">CAPTION</h5>
+
+<p>
+<kbd>CAPTION</kbd> allows you to give the diagram a caption. By
+default, the caption appears above the diagram, but may be attached to
+the label that appears beneath it. See
+<a href="#caption-after-label">CAPTION_AFTER_LABEL</a>
+in
+<a href="#captions-and-labels">Captions and labels</a>.
+The text of the caption must be surrounded by double-quotes.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">SHORT_CAPTION</h5>
+
+<p>
+<kbd>SHORT_CAPTION</kbd> allows you to trim long captions for
+inclusion in the List of Figures. The text you supply, surrounded
+by double-quotes, is what will appear in the List.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">LABEL</h5>
+
+<p>
+<kbd>LABEL</kbd>, if given, appears beneath the diagram. The text you
+supply, surrounded by double-quotes, is how the diagram is labelled
+in both the document proper and the List of Figures. Mom provides
+an auto-labelling facility for diagrams (see
+<a href="#autolabel">AUTOLABEL</a>),
+which, if enabled, overrides the <kbd>LABEL</kbd> argument.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">TARGET</h5>
+
+<p>
+<kbd>TARGET</kbd> followed by a unique name surrounded by
+double-quotes creates a PDF target for the diagram so that it may be
+linked to from other places in the file (with PDF_LINK; see
+<a href="version-2.html#mom-pdf">Producing PDFs with groff and mom</a>).
+</p>
+
+<p>
+<b><i>Please note:</i></b> The following functionality is available
+only with groff 1.22.4 or later.
+</p>
+
+<p>
+When
+<a href="#autolabel">autolabelling</a>
+is enabled and the document is processed with
+<a href="using.html#pdfmom" style="font-weight: bold">pdfmom</a>,
+the target name can be used to generate the target&#8217;s label
+number in running text if it is entered as a groff string, i.e. of
+the form <kbd><span class="nobr">\*[name]</span></kbd>. For example, if you
+create a target called &#8220;foo&#8221; for a diagram whose
+autolabel number would be 3, entering
+<br/>
+<span class="pre-in-pp">
+ See
+ .PDF_LINK foo "Figure \*[foo]"
+</span>
+anywhere in running text would result in a pdf link that reads
+&#8220;Figure 3&#8221;. If chapter numbers are being prefixed to
+labels, the same string in, say, chapter 5 would produce the pdf
+link &#8220;Figure 5.3&#8221;.
+</p>
+
+<!-- PIC_TEXT_STYLE -->
+
+<div class="macro-id-overline">
+<h3 id="pic-text-style" class= "macro-id">PIC_TEXT_STYLE</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>PIC_TEXT_STYLE</b> \
+<br/>
+<kbd class="macro-args">
+&nbsp;&nbsp;[ FAMILY ] "&lt;family&gt;" \
+<br/>
+&nbsp;&nbsp;[ FONT ] "&lt;font&gt;" \
+<br/>
+&nbsp;&nbsp;[ SIZE ] "+|-&lt;size&gt;" \
+<br/>
+&nbsp;&nbsp;[ AUTOLEAD ] "&lt;value&gt;"
+</kbd>
+</div>
+
+<p>
+Diagrams drawn with <b>pic</b> may contain text, and groff
+<a href="inlines.html#intro-inlines">inline escapes</a>
+may be used to alter the text parameters. A problem that arises
+from so doing is that, in many cases, it clutters up the <b>pic</b>
+code unnecessarily.
+</p>
+
+<p>
+PIC_TEXT_STYLE lets you establish the type parameters for text
+inside a <b>pic</b> block all at once in cases where so doing
+improves the readability of your mom source files.
+</p>
+
+<p>
+The arguments to PIC_TEXT_STYLE behave identically to the arguments
+to other control macros, explained
+<a href="docelement.html#control-macro-args">here</a>.
+They may be given in any order, and you may use as many or as few as
+you like.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Text within <b>pic</b> diagrams does not scale when you provide a
+scaling argument to <kbd>.PS</kbd>. This is a limitation of the
+preprocessor itself, not groff or mom.
+</p>
+</div>
+
+<div class="rule-medium"><hr/></div>
+
+<h3 id="grap" class="docs">grap support</h3>
+
+<p>
+Grap is a <b>pic</b> preprocessor for creating graphs. Grap
+usage is covered in the <kbd>grap(1)</kbd> manpage. Its mom
+implementation is the same as for <b>pic</b> except that instead of
+enclosing directives between
+<a href="#ps-pe">.PS&nbsp;/&nbsp;.PE</a>,
+they are enclosed between <b>.G1/.G2</b>. If you use <b>grap</b>,
+you must pass groff or pdfmom the <b>-G</b> flag when you process
+the file.
+
+</p>
+
+<p>
+<b>.G1</b> takes all the same arguments as
+<a href="#ps-pe">PS</a>
+with one exception: the argument <b>GRAP</b> must always be given to
+<b>.G1</b>. So, for example, a skeleton grap block raised 2 points
+and with a caption would be entered:
+<br/>
+<span class="pre-in-pp">
+ .G1 GRAP ADJUST +2p CAPTION "Graph caption"
+ &lt;grap directives&gt;
+ .G2
+</span>
+
+</p>
+
+<div class="rule-medium"><hr/></div>
+
+<h3 id="eqn" class="docs">eqn support</h3>
+
+<p>
+Support for <b>eqn</b> is provided via extensions to the standard
+<kbd>.EQ/.EN</kbd> macros. <kbd>eqn</kbd> usage itself is beyond
+the scope of this documentation, but is covered in the manpage
+<kbd>eqn(1)</kbd>. You can also download a copy of Ted
+Harding&#8217;s
+<a href="http://lists.gnu.org/archive/html/groff/2013-10/pdfTyBN2VWR1c.pdf">
+A Guide to Typesetting Mathematics Using GNU eqn
+</a>,
+which contains useful examples. If you use <b>eqn</b>, you must give groff or
+pdfmom the <b>-e</b> flag.
+
+</p>
+
+<div class="macro-id-overline">
+<h3 id="eq-en" class= "macro-id">.EQ / .EN</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <a href="#eq"><b>EQ</b></a>
+<br/>
+<kbd class="macro-args">Arguments:
+<br/>
+&nbsp;&nbsp;[ -L | -C | -I &lt;indent&gt; ]</kbd>
+<span style="font-size: 95%">
+(<a href="definitions.html#unitofmeasure">unit of measure</a>
+required)
+</span>
+<kbd class="macro-args"><br/>
+&nbsp;&nbsp;[ ADJUST +|-&lt;vertical adjustment&gt;]</kbd>
+<span style="font-size: 95%">
+(<a href="definitions.html#unitofmeasure">unit of measure</a>
+required)
+</span>
+<kbd class="macro-args"><br/>
+&nbsp;&nbsp;[ NO_SHIM ]
+<br/>
+&nbsp;&nbsp;[ NO_FLEX ]
+<br/>
+&nbsp;&nbsp;[ CAPTION "&lt;caption&gt;" ]
+<br/>
+&nbsp;&nbsp;[ LABEL "&lt;label&gt;" ]
+<br/>
+&nbsp;&nbsp;[ SHIFT_LABEL +|-&lt;vertical adjustment&gt; ]
+<br/>
+&nbsp;&nbsp;[ SHORT_CAPTION "&lt;short caption&gt;" ]
+<br/>
+&nbsp;&nbsp;[ TARGET "&lt;name&gt;" ]
+<br/>
+&nbsp;&nbsp;[ CONTINUED | CONT | ... ]</kbd>
+</div>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note: Version 2.0-c change</span>
+<br/>
+2.0-c introduces revisions to <b>EQ</b>, including the addition
+of a dash (<kbd>-</kbd>) to the positioning arguments
+(<kbd>-L</kbd>, <kbd>-C</kbd>, and <kbd>-I</kbd>) and the removal of a
+default value for <kbd>-I</kbd>. Other changes include passing all
+options to <kbd>.EQ</kbd> (including the label) such that
+<kbd>.EN</kbd> takes only a single, optional argument saying whether
+the equation is to be continued at the next invocation of
+<kbd>.EQ</kbd>. Please read this section carefully if you have
+documents containing equations as they may need to be updated.
+</p>
+</div>
+
+<div class="box-important" style="margin-top: 1em">
+<p class="tip">
+<span class="important">IMPORTANT:</span>
+All arguments to <b>EQ</b> must appear on the same line as
+<kbd>.EQ</kbd>. Do not attempt to break them up with the
+&#8220;line-continued&#8221; backslash. You may want to set your
+text editor to &#8220;wrap&#8221; mode in order to see all your
+arguments. This annoyance stems from the preprocessor mechanism
+itself, not groff or mom.
+</p>
+</div>
+
+<div class="macro-id-overline" style="margin-top: .5em">
+<h4 id="eq" class="docs" style="font-size: 100%; margin-top: .5em">The .EQ macro</h4>
+</div>
+
+<p>
+Equations to be set with <b>eqn</b> begin with <kbd>.EQ</kbd>,
+followed by <b>eqn</b> code. Equations are centered by default,
+but may be set flush left or indented from the left margin
+if <kbd>-L</kbd> or <kbd>-I</kbd> are passed as arguments to
+<kbd>.EQ</kbd>.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">ADJUST</h5>
+
+<p>
+<kbd>ADJUST</kbd> lets you raise (<kbd>-</kbd>) or lower
+(<kbd>+</kbd>) an equation
+<span style="font-style: italic">within the space allotted for it</span>
+by the amount you specify. This is useful for achieving good
+optical centering between surrounding blocks of type. A unit of
+measure is required.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">NO_SHIM</h5>
+
+<p>
+<kbd>NO_SHIM</kbd> instructs mom not to apply
+<a href="docprocessing.html#shim-vs-flex">shimming</a>
+after an equation, which she will do automatically when shimming is
+enabled, which it is by default. Shimming ensures that running text
+after the equation falls properly on the page&#8217;s
+<a href="definitions.html#baseline-grid">baseline grid</a>,
+but can result in slightly unequal spacing above and
+below (correctable with the <kbd>ADJUST</kbd> argument).
+<kbd>NO_SHIM</kbd> is useful when you have several equations on the
+page and there are visible differences in the spacing beneath them
+as a result of shimming. To ensure a flush bottom margin, the last
+equation on the page should be shimmed, i.e. should not be given the
+<kbd>NO_SHIM</kbd> argument.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">NO_FLEX</h5>
+
+<p>
+<kbd>NO_FLEX</kbd> instructs mom not to apply
+<a href="docprocessing.html#shim-vs-flex">flex-spacing</a>
+after an equation, which she will do automatically when flex-spacing
+is enabled. <kbd>NO_FLEX</kbd> is useful when you have several
+equations on the page and you want to distribute excess vertical
+whitespace on the page amongst other flex-spacing points on
+the page. If there are no others, the final equation should be
+flex-spaced, i.e. not given the <kbd>NO_FLEX</kbd> argument.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">CAPTION</h5>
+
+<p>
+<kbd>CAPTION</kbd> allows you to give the equation a caption.
+Equation captions always appear beneath the equation.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">SHORT_CAPTION</h5>
+
+<p>
+<kbd>SHORT_CAPTION</kbd> allows you to trim long captions for
+inclusion in the List of Equations. The text you supply, surrounded
+by double-quotes, is what will appear in the List.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">LABEL</h5>
+
+<p>
+<kbd>LABEL</kbd>, if given, appears on the same baseline as the last line of the
+equation, flush with the left or right margin, depending on the
+equation&#8217;s horizontal position. The text you supply, surrounded by
+double-quotes, is how
+the equation is labelled in both the document proper and the List of
+Equations. Mom provides an auto-labelling facility for equations (see
+<a href="#autolabel">AUTOLABEL</a>),
+which, if enabled, overrides the <kbd>LABEL</kbd> argument.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">SHIFT_LABEL</h5>
+
+<p>
+<kbd>SHIFT_LABEL</kbd> allows you to raise (<kbd>-</kbd>) or lower
+(<kbd>+</kbd>) the equation label. It&#8217;s primary use is to
+center equation labels vertically on the equation rather than flush
+with the last line. Assuming a three-line equation,
+<kbd>.EQ&nbsp;SHIFT_LABEL&nbsp;-1v</kbd> would raise the label by
+one line, thus centering it vertically on the equation.
+</p>
+
+<h5 class="docs" style="margin-top: 1em; text-transform: none">TARGET</h5>
+
+<p>
+<kbd>TARGET</kbd> followed by a unique name surrounded by
+double-quotes creates a PDF target for the equation so that it may
+be linked to from other places in the file (with PDF_LINK; see
+<a href="version-2.html#mom-pdf">Producing PDFs with groff and mom</a>).
+</p>
+
+<p>
+<b><i>Please note:</i></b> The following functionality is available
+only with groff 1.22.4 or later.
+</p>
+
+<p>
+When
+<a href="#autolabel">autolabelling</a>
+is enabled and the document is processed with
+<a href="using.html#pdfmom" style="font-weight: bold">pdfmom</a>,
+the target name can be used to generate the target&#8217;s label
+number in running text if it is entered as a groff string, i.e. of
+the form <kbd><span class="nobr">\*[name]</span></kbd>. For example, if you
+create a target called &#8220;foo&#8221; for an equation whose
+autolabel number would be 3, entering
+<br/>
+<span class="pre-in-pp">
+ See
+ .PDF_LINK foo "Equation \*[foo]"
+</span>
+anywhere in running text would result in a pdf link that reads
+&#8220;Equation 3&#8221;. If chapter numbers are being prefixed to
+labels, the same string in, say, chapter 5 would produce the pdf
+link &#8220;Equation 5.3&#8221;.
+</p>
+
+
+<div class="macro-id-overline" style="margin-top: .5em">
+<h4 id="en" class="docs" style="font-size: 100%; margin-top: .5em">The .EN macro</h4>
+</div>
+
+<p>
+A block of <b>eqn</b> code is terminated with <kbd>.EN</kbd>.
+</p>
+
+<p>
+If an equation needs to span multiple lines, possibly aligned
+with <b>eqn</b>&#8217;s <kbd>'mark'</kbd> and <kbd>'lineup'</kbd>
+directives, separate invocations of <kbd><span class="nobr">.EQ/.EN</span></kbd>
+are required for each line, and the optional argument,
+<kbd>CONTINUED</kbd> (or <kbd>CONT</kbd>, or <kbd>...</kbd> [three
+dots, an ellipsis]), must be passed to <kbd>.EN</kbd>.
+</p>
+
+<p>
+If <kbd>-L</kbd> or <kbd>-I</kbd> is given to the first
+<kbd>.EQ</kbd> of a multi-line equation, they remain in effect
+until an <kbd>.EN</kbd> without the <kbd>CONTINUED</kbd> argument
+is reached.
+</p>
+
+<p>
+Mom does not treat equations as floats, therefore it is possible to
+begin an equation on one page and terminate it on the next. If you
+wish to keep all lines of an equation together, you must wrap the
+equation, including all invocations of <kbd>.EQ/.EN</kbd>, inside
+a
+<a href="#floats-intro">float</a>.
+</p>
+
+<div class="rule-medium"><hr/></div>
+
+<h3 id="refer" class="docs">refer support</h3>
+
+<p>
+<b>refer</b> support is covered in the section
+<a href="refer.html">Bibliographies and references</a>.
+</p>
+
+<div class="rule-medium"><hr/></div>
+
+<h2 id="captions-and-labels" class="docs">Captions and labels</h2>
+
+<ul>
+ <li><a href="#autolabel">AUTOLABEL</a></li>
+ <li><a href="#caption-after-label">CAPTION_AFTER_LABEL</a></li>
+ <li><a href="#mla">MLA</a>&mdash;MLA-style captioning and labelling</li>
+ <li><a href="#captions-labels-sources">Set style parameters for captions, labels, and sources</a></li>
+</ul>
+
+<p>
+Mom includes facilities for adding captions and labels to figures,
+tables, equations, and pdf images, including auto-labelling. If
+Lists of Figures, Tables, and Equations are desired, captions (if
+any) and labels (if any) are collected and output in the Lists with
+the appropriate page number.
+</p>
+
+<p>
+The distinction between a caption and a label is that labels are
+identifiers, e.g. &#8220;Fig. 1&#8221; or &#8220;Table 3&#8221;,
+while captions are descriptive or informative. For most types of
+writing, it is usual to provide both.
+</p>
+
+<p>
+By default, mom sets captions above figures (i.e. <b>pic</b> output and
+pdf images) and tables. This behaviour may be modified with the
+macro
+<a href="#caption-after-label">CAPTION_AFTER_LABEL</a>.
+Equations always have their captions set underneath. All aspects of
+the text style for captions may be set with the macro
+<a href="#captions-labels-sources">CAPTIONS</a>.
+</p>
+
+<p>
+Labels for tables are set underneath the table unless the
+<a href="#mla">MLA</a>
+macro has been invoked, in which case the label and caption appear
+above the table, per MLA style, and the source for the table, if
+any, appears underneath. Labels for figures are set underneath.
+Equation labels, by default, are set on the same baseline as the
+last line of the equation. Like captions, all aspects of text style
+for labels may be established with a single macro
+<a href="#labels">LABELS</a>.
+Furthermore, mom can autolabel figures, tables, and equations, with
+or without a prefixed chapter number.
+</p>
+
+<div class="macro-id-overline">
+<h3 id="autolabel" class="macro-id">Autolabel</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>AUTOLABEL_EQUATIONS</b>
+<br/>
+Macro: <b>AUTOLABEL_IMAGES</b>
+<br/>
+Macro: <b>AUTOLABEL_PIC</b>
+<br/>
+Macro: <b>AUTOLABEL_TABLES</b>
+<br/>
+<kbd class="macro-args">Arguments:
+<br/>
+[ PREFIX "&lt;string&gt;"] [ SUFFIX "&lt;string&gt;"] [ PREFIX_CHAPTER [ &lt;n&gt; ] ]
+</kbd>
+</div>
+
+<p>
+<b>AUTOLABEL_&lt;type&gt;</b> takes care of labelling &lt;type&gt; by
+identifying each with a separate, incrementing numeric scheme, which
+is also collected for output in Lists of Figures, Equations, and
+Tables.
+</p>
+
+<p>
+Autolabelling may be disabled on-the-fly by giving any argument
+other than <kbd>PREFIX</kbd>, <kbd>SUFFIX</kbd>, or
+<kbd>PREFIX_CHAPTER</kbd> to the appropriate macro. For example,
+<br/>
+<span class="pre-in-pp">
+ .AUTOLABEL_IMAGES NO
+</span>
+would disable autolabelling of images.
+</p>
+
+<h4 class="docs" style="margin-top: -.5em">Prefixes and suffixes</h4>
+
+<p>
+By default, when <b>AUTOLABEL</b> is enabled, the label numbers are
+prefixed, and, in the case of equations, suffixed, with strings such
+that they appear for tables as &#8220;Table&nbsp;&lt;n&gt;&#8221;, for
+<b>pic</b> diagrams and pdf images as &#8220;Fig.&nbsp;&lt;n&gt;&#8221;,
+and for equations as &#8220;Eq.&nbsp;(&lt;n&gt;)&#8221;.
+</p>
+
+<p>
+You can use <kbd>PREFIX&nbsp;&lt;"string"&gt;</kbd> to change what
+comes before the automatic numbering. For example, if you are
+including musical excerpts in your document, MLA style requires that
+they be labelled &#8220;Ex.&nbsp;&lt;n&gt;&#8221;. Since musical
+excerpts are likely to be scanned images (in pdf format, don&#8217;t
+forget), you have to change the prefix string for pdf images:
+<br/>
+<span class="pre-in-pp">
+ .AUTOLABEL_IMAGES \
+ PREFIX "Ex. " \
+ SUFFIX ""
+</span>
+If you need a suffix after the automatic numbering, use
+<kbd>SUFFIX&nbsp;&lt;"string"&gt;</kbd>, like this:
+<br/>
+<span class="pre-in-pp">
+ .AUTOLABEL_IMAGES \
+ PREFIX "(Fig. " \
+ SUFFIX ")"
+</span>
+Note from the above that both arguments, <kbd>PREFIX</kbd> and
+<kbd>SUFFIX</kbd>, are required should you want either. Two
+adjacent double-quotes leaves the string blank.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+In automatically formatted
+<a href="#lists-macros">&#8220;Lists of ...&#8221;</a>,
+label number prefixes are stripped when autolabelling is enabled.
+</p>
+</div>
+
+<h4 class="docs" style="margin-top: -.5em">Prefixing chapter numbers</h4>
+
+<p>
+If you would like mom to prefix chapter numbers to the label,
+pass <kbd>AUTOLABEL_&lt;type&gt;</kbd> the argument
+<kbd>PREFIX_CHAPTER</kbd>.
+</p>
+
+<p>
+If for some reason you need to specify the chapter number,
+you may do so by passing the number as an argument to
+<kbd>PREFIX_CHAPTER</kbd>. Subsequent chapters or major sections
+will increment by one as expected.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+For the purposes of labelling, mom treats
+<a href="docprocessing.html#doctype">DOCTYPE&nbsp;DEFAULT</a>
+as if it were <b>DOCTYPE&nbsp;CHAPTER</b>, hence, with
+<kbd>PREFIX_CHAPTER</kbd>, each collated <b>DEFAULT</b>
+doctype&#8217;s prefixed &#8220;chapter&#8221; number is
+incremented and the label number itself reset to &#8220;1&#8221;.
+If you do not supply the <kbd>PREFIX_CHAPTER</kbd> argument, the
+label number is <i>not</i> reset automatically. To reset it, invoke
+<kbd>.AUTOLABEL_&lt;type&gt;</kbd> after each
+<a href="docprocessing.html#collate">COLLATE</a>.
+</p>
+</div>
+
+<div id="set-autolabel" class="box-macro-args" style="margin-top: .5em">
+Macro: <b>SET_AUTOLABEL</b> <kbd class="macro-args">FIG | TBL | PIC | EQN &lt;n&gt;</kbd>
+</div>
+
+<p>
+You may sometimes need to set or reset the autolabel number for a
+particular type of pre-processor or for PDF images. This is likely
+to occur if you are using
+<a href="#float">FLOAT</a>
+in conjunction with the <kbd>TO_LIST</kbd> argument.
+</p>
+
+<p>
+For example, if your document has Figures (PDF images, pic diagrams)
+and you want your tables to be labelled as Figures as well, you have
+to wrap the tables inside a float and label the float manually as
+&#8220;Fig.&nbsp;n&#8221;, sending it to the List of Figures with
+<kbd>TO_LIST FIGURES</kbd>.
+</p>
+
+<p>
+Mom does not autolabel floats or assign them automatically
+to a list, so she doesn&#8217;t know you&#8217;ve interrupted the
+auto-incrementing label numbers. Use SET_AUTOLABEL get her back on
+track. The number you give as an argument after telling her which
+kind of label number to set is the one you want to appear next.
+<br/>
+<span class="pre-in-pp">
+ .SET_AUTOLABEL FIG 6
+</span>
+means the next autolabelled Figure will be &#8220;Fig. 6.&#8221;
+</p>
+
+<div class="macro-id-overline">
+<h3 id="caption-after-label" class="macro-id">Captions after labels</h3>
+</div>
+
+<div class="box-macro-args" style="margin-top: .5em">
+Macro: <b>CAPTION_AFTER_LABEL</b> <kbd class="macro-args">IMG | PIC | TBL | ALL [ &lt;anything&gt; ]</kbd>
+</div>
+
+<p>
+By default, mom sets captions above figures (<b>pic</b> output
+and pdf images) and tables; labels are always underneath.
+</p>
+
+<p>
+<kbd>.CAPTION_AFTER_LABEL</kbd>, with one of the required arguments,
+instructs mom to attach captions directly to the appropriate
+labels, beginning on the same line. Any argument after the first
+disables this behaviour, restoring caption placement to mom&#8217;s
+default. For example,
+<br/>
+<span class="pre-in-pp">
+ .CAPTION_AFTER_LABEL ALL
+</span>
+would enable captions after labels globally, while a subsequent
+<br/>
+<span class="pre-in-pp">
+ .CAPTION_AFTER_LABEL IMG OFF
+</span>
+would disable captions after labels for pdf images only.
+<kbd>OFF</kbd> can be anything you like (<kbd>X</kbd>,
+<kbd>NO</kbd>, etc).
+</p>
+
+<p>
+If
+<a href="#mla">MLA</a>
+is enabled, there&#8217;s no need to invoke
+<kbd>CAPTION_AFTER_LABEL</kbd> as this is implied.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+A separate invocation of <kbd>.CAPTION_AFTER_LABEL</kbd> is required
+for each one of the required first arguments. You cannot, for
+example, do
+<br/>
+<span class="pre-in-pp">
+ .CAPTION_AFTER_LABEL IMG TBL
+</span>
+Rather, you must do
+<br/>
+<span class="pre-in-pp">
+ .CAPTION_AFTER_LABEL IMG
+ .CAPTION_AFTER_LABEL TBL
+</span>
+</p>
+</div>
+
+<div class="macro-id-overline">
+<h3 id="mla" class="macro-id">MLA-style captioning and labelling</h3>
+</div>
+
+<div class="box-macro-args" style="margin-top: .5em">
+Macro: <b>MLA</b> <kbd class="macro-args"> [ &lt;anything&gt; ]</kbd>
+</div>
+
+<p>
+Modern Language Association style dictates that captions should
+always go after labels. Furthermore, labels and captions for tables
+should go <i>above</i> the tables, with the source for the table, if
+any, underneath.
+</p>
+
+<p>
+Invoking <kbd>.MLA</kbd> by itself takes care of these details. If
+you need to disable MLA-style captioning and labelling mid-document,
+<kbd>.MLA&nbsp;OFF</kbd> does the trick. <kbd>OFF</kbd> can be
+anything you like (<kbd>X</kbd>, <kbd>NO</kbd>, etc).
+</p>
+
+<div class="macro-id-overline" style="margin-top: 1em">
+<h3 id="captions-labels-sources" class="macro-id">Style parameters for captions, labels and sources</h3>
+</div>
+
+<div class="box-macro-args" style="margin-top: .5em">
+Macro: <b>CAPTIONS</b> <kbd class="macro-args">EQN | IMG | PIC | TBL | FLOATING | ALL</kbd>
+<br/>
+Macro: <b>LABELS</b> <kbd class="macro-args">EQN | IMG | PIC | TBL | FLOATING | ALL</kbd>
+<br/>
+Macro: <b>SOURCES</b> <kbd class="macro-args">TBL</kbd>
+<br/>
+<kbd class="macro-args">Style arguments:
+<br/>
+&nbsp;&nbsp;FAMILY &lt;family&gt; \
+<br/>
+&nbsp;&nbsp;FONT &lt;font&gt; \
+<br/>
+&nbsp;&nbsp;SIZE +|-&lt;size&gt; \
+<br/>
+&nbsp;&nbsp;AUTOLEAD &lt;value&gt; \
+<br/>
+&nbsp;&nbsp;COLOR &lt;color&gt; \
+<br/>
+&nbsp;&nbsp;QUAD LEFT | CENTER | RIGHT [ ON_LL ] \
+<br/>
+&nbsp;&nbsp;INDENT &lt;indent&gt; \
+<br/>
+&nbsp;&nbsp;ADJUST +|-&lt;vertical adjustment&gt;
+</kbd>
+</div>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Arguments may be broken into several lines using the
+&#8220;line-continued&#8221; backslash (<b>\</b>), as shown above.
+</p>
+</div>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Additional note:</span>
+Mom&#8217;s default style for labels, captions, and sources is
+the same as the style used for running text, with two exceptions:
+labels are set in bold, except for eqn which is roman medium, and
+the autolead value for all three is &#8220;2&#8221;, effectively
+tightening the lead. Furthermore, they are quadded left (except
+eqn, which is quadded right.)
+</p>
+</div>
+
+<p>
+With the exception of <kbd>ADJUST</kbd> and <kbd>QUAD</kbd> (which
+requires a bit of explanation), the style arguments to <kbd>CAPTIONS</kbd>,
+<kbd>LABELS</kbd>, and <kbd>SOURCES</kbd> (which is only available
+for tables) behave identically to the
+<a href="docelement.html#control-macro-args">arguments to control macros</a>.
+</p>
+
+<p>
+The first, required argument after <kbd>CAPTIONS</kbd>,
+<kbd>LABELS</kbd>, or <kbd>SOURCES</kbd> indicates the preprocessor
+type for which you are setting the parameters. (For convenience
+PDF_IMAGE&mdash;argument <kbd>IMG</kbd>&mdash;is here treated as a
+preprocessor.) <kbd>FLOATING</kbd> sets the style for the macros
+<a href="#caption">CAPTION</a>
+and
+<a href="#label">LABEL</a>,
+which are used to label floats, quotes, and blockquotes.
+</p>
+
+<p>
+An argument of <kbd>ALL</kbd> sets a unified style for all
+preprocessors, floats, quotes, and blockquotes. If the
+<kbd>ALL</kbd> argument is given, arguments to subsequent
+invocations of <kbd>CAPTIONS</kbd>, <kbd>LABELS</kbd>, or
+<kbd>SOURCES</kbd> overwrite only the explicitly named style
+parameters.
+</p>
+
+<h4 class="docs">QUAD &mdash; quadding of labels, captions, and sources</h4>
+
+<h5 class="docs" style="text-transform: none">&bull;&nbsp;pic, tbl, pdf images</h5>
+
+<p>
+By default, figures (<b>pic</b> output and pdf images) and tables
+have their captions and labels set quad left. Sources (for
+tables) are also set quad left. Equations have their labels
+set quad right, and their captions centered.
+</p>
+
+<p>
+Regardless of the quad direction, captions, labels and sources
+are set on the width of the figure, table, or pdf image
+unless you pass the optional <kbd>ON_LL</kbd> argument to
+<kbd><span class="nobr">QUAD&nbsp;&lt;direction&gt;</span></kbd>, in which case
+the prevailing document line length is used instead.
+</p>
+
+<h5 class="docs" style="text-transform: none">&bull;&nbsp;eqn</h5>
+
+<p>
+Equations behave differently. By default, equation labels are
+set flush right with the page&#8217;s right margin regardless of
+equation positioning, which is, again by default, centered. If the
+equation is positioned left, the label will appear at the right
+margin regardless of the direction you give to <kbd>QUAD</kbd>. If
+the equation is indented with the
+<kbd><span class="nobr">-I&nbsp;&lt;indent&gt;</span></kbd> option, a quad
+direction of <kbd>LEFT</kbd> is observed, but may overprint the last
+line of the equation.
+</p>
+
+<p>
+Note that there is no <kbd>CENTER</kbd> option for equation labels,
+and that captions are always quadded over the prevailing document
+line length.
+</p>
+
+<h5 class="docs" style="text-transform: none">&bull;&nbsp;quotes and blockquotes</h5>
+
+<p>
+Floating labels attached to <b>QUOTE</b>s are quadded on the
+prevailing document line length, and require the <kbd>INDENT</kbd>
+argument if you want to align them with the left and/or right edges
+the quote.
+</p>
+
+<p>
+Floating labels attached to <b>BLOCKQUOTE</b>s are always quadded on
+the indent and line length of the blockquote.
+</p>
+
+<h5 class="docs" style="text-transform: none">&bull;&nbsp;floats</h5>
+
+<p>
+Floating labels and captions attached to <b>FLOAT</b>s are always
+quadded over the prevailing document line length, and require the
+<kbd>INDENT</kbd> argument if you want to align them with the left
+and/or right edges of the float&#8217;s contents.
+</p>
+
+<h4 class="docs">INDENT</h4>
+
+<p>
+The <kbd>INDENT</kbd> argument may only be used if the label
+or caption type is <kbd>FLOATING</kbd>, and only applies to
+<b>FLOAT</b>s and <b>QUOTE</b>s, not <b>BLOCKQUOTE</b>s.
+</p>
+
+<p>
+It is not possible for mom to know the width of a float before
+setting a label or caption attached to a float. She therefore sets
+it on the prevailing document line length. While this isn&#8217;t
+much of an issue when the label or caption quad is <b>CENTER</b>,
+you may want to adjust the horizontal positioning when the quad is
+<b>LEFT</b> or <b>RIGHT</b>.
+</p>
+
+<p>
+<kbd>INDENT</kbd>, with a numeric value to which a
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+is appended, allows you to indent a floating label or caption so
+it lines up with the left edge of a <b>FLOAT</b> or <b>QUOTE</b>.
+<kbd>INDENT&nbsp;RIGHT</kbd> (with a value) allows you to shorten the
+line length to the appropriate width. If you need both a left and
+right indent, invoke <kbd>LABELS</kbd> or <kbd>CAPTIONS</kbd> twice,
+one instance containing <kbd>INDENT&nbsp;&lt;indent&gt;</kbd> and
+the other <kbd>INDENT&nbsp;RIGHT&nbsp;&lt;indent&gt;</kbd>.
+</p>
+
+<h4 class="docs">ADJUST</h4>
+
+<p>
+The <kbd>ADJUST</kbd> argument allows you to add(<kbd>+</kbd>) or
+subtract (<kbd>-</kbd>) vertical space between labels and captions
+and the output to which they are attached. The argument requires a
+<a href="definitions.html#unitofmeasure">unit of measure</a>.
+For example, if you find that table labels are a bit too close to
+the table itself,
+<br/>
+<span class="pre-in-pp">
+ .LABELS TBL ADJUST +3p
+</span>
+would put three extra points of space between the bottoms of tables
+and the labels that appear beneath them.
+</p>
+
+<h2 id="lists-of" class="docs">Lists of Figures, Tables, and Equations</h2>
+
+<p>
+Besides a
+<a href="tables-of-contents.html">Table of Contents</a>,
+mom can generate Lists of Figures, Tables, and Equations. Labels
+and captions are collected and concatenated, and output in lists
+with the appropriate page number, just like a Table of Contents.
+Including such lists in a document is as simple as adding whichever
+you need of
+<br/>
+<span class="pre-in-pp">
+ .LIST_OF_FIGURES
+ .LIST_OF_EQUATIONS
+ .LIST_OF_TABLES
+</span>
+to the end of your input file.
+</p>
+
+<p>
+Also like the Table of Contents, entries in the Lists&#8217; output
+are clickable PDF links when a document is viewed at the screen.
+</p>
+
+<h3 id="lists-placement" class="docs">Placement of Lists</h3>
+
+<p>
+Lists normally appear after the Table of Contents, and continue
+the page numbering scheme used for it. By default, the Table of
+Contents begins on roman-numeral page &#8220;i&#8221;.
+</p>
+
+<p>
+If you are using mom&#8217;s
+<a href="tables-of-contents.html#auto-relocate-toc">AUTO_RELOCATE_TOC</a>
+feature, you have two options for placement of the Lists within the
+document. If you want the Lists shifted to the top of the document
+along with the Table of Contents, invoke the Lists macros <i>after</i>
+<a href="tables-of-contents.html#toc"><kbd>.TOC</kbd></a>.
+If you prefer to have the Lists at the end of the document, invoke
+the Lists macros <i>before</i> <kbd>.TOC</kbd>.
+</p>
+
+<p>
+Lists shifted with the Table of Contents do not appear in the Table
+of Contents itself, but do appear as clickable links in the PDF
+outline typically available in the left panel of most PDF viewers.
+Lists that are not shifted with the Table of Contents appear in both
+the Table of Contents itself and the PDF outline.
+</p>
+
+<div class="macro-id-overline" style="margin-top: 1em">
+<h3 id="lists-macros" class="macro-id">Macros to generate Lists</h3>
+</div>
+
+<div class="box-macro-args" style="margin-top: .5em">
+Macro: <b>LIST_OF_EQUATIONS</b>
+<br/>
+Macro: <b>LIST_OF_FIGURES</b>
+<br/>
+Macro: <b>LIST_OF_TABLES</b>
+<br/>
+<kbd class="macro-args">Arguments:
+<br/>
+&nbsp;&nbsp;[ TITLE_STRING "&lt;string&gt;" ] [ START_PAGENUM &lt;page number&gt; ]
+</kbd>
+</div>
+
+<p>
+The first optional argument to the <kbd>LIST_OF_&lt;type&gt;</kbd>
+macros allows you to change the title that appears at the top of the
+page. This is useful not only for internationalization, or to meet
+the requirements of various style guides, but is also useful
+for, say, documents containing musical examples, which, per
+MLA-style, should be labelled &#8220;Example &#8221; or
+&#8220;Ex. &#8221;. When it comes time to output the List of
+Figures (to which musical examples, usually scanned pdf images, belong),
+<br/>
+<span class="pre-in-pp">
+ LIST_OF_FIGURES TITLE_STRING "List of Examples"
+</span>
+ensures that the title of the List is correct.
+</p>
+
+<p>
+The second optional argument allows you to give a starting page
+number for a list in cases where mom&#8217;s pagination scheme does
+not provide the List with the starting page number you want.
+</p>
+<h3 id="formatting-lists" class="docs">Formatting and style parameters for Lists</h3>
+
+<p>
+Like the Table of Contents, nearly every aspect of Lists can be
+designed independently of a document&#8217;s overall style. By
+default, Lists follow the formatting and style parameters of the
+Table of Contents, both mom&#8217;s defaults and any changes you may
+have made to the Table of Contents.
+</p>
+
+<p>
+If you wish to make changes to any aspect of Lists formatting
+or styling, the macro <kbd>LISTS_STYLE</kbd> provides all the
+tools necessary. It is unlikely that you&#8217;ll want the
+formatting of the various list types to differ one from the other,
+so <kbd>LISTS_STYLE</kbd> applies to all Lists. In the event that
+you do need to change some aspect of the formatting for different
+list types, simply invoke <kbd>LISTS_STYLE</kbd> immediately prior
+to each list whose formatting needs to be changed.
+</p>
+
+<div class="macro-id-overline" style="margin-top: 1em">
+<h3 id="lists-style" class="macro-id">Lists style</h3>
+</div>
+
+<div class="box-macro-args" style="margin-top: .5em">
+Macro: <b>LISTS_STYLE</b> <kbd class="macro-args">
+<br/>
+Arguments:
+<br/>
+&nbsp;&nbsp;FAMILY &lt;family&gt; \
+<br/>
+&nbsp;&nbsp;FONT &lt;font&gt; \
+<br/>
+&nbsp;&nbsp;PT_SIZE &lt;size&gt; \
+<br/>
+&nbsp;&nbsp;LEAD &lt;leading&gt; \
+<br/>
+&nbsp;&nbsp;TITLE_FAMILY &lt;family&gt; \
+<br/>
+&nbsp;&nbsp;TITLE_FONT &lt;font&gt; \
+<br/>
+&nbsp;&nbsp;TITLE_SIZE +|-&lt;size&gt; \
+<br/>
+&nbsp;&nbsp;TITLE_QUAD LEFT | CENTER | RIGHT \
+<br/>
+&nbsp;&nbsp;TOC_HEADER_UNDERSCORE default = none
+<br/>
+&nbsp;&nbsp;TITLE_COLOR &lt;color&gt; \
+<br/>
+&nbsp;&nbsp;PN_FAMILY &lt;family&gt; \
+<br/>
+&nbsp;&nbsp;PN_FONT &lt;font&gt; \
+<br/>
+&nbsp;&nbsp;PN_SIZE +|-&lt;size&gt; \
+<br/>
+&nbsp;&nbsp;EQN_PN_PADDING &lt;placeholders&gt; \
+<br/>
+&nbsp;&nbsp;FIG_PN_PADDING &lt;placeholders&gt; \
+<br/>
+&nbsp;&nbsp;TBL_PN_PADDING &lt;placeholders&gt; \
+<br/>
+&nbsp;&nbsp;PAGENUM_STYLE DIGIT | ROMAN | roman | ALPHA | alpha \
+<br/>
+&nbsp;&nbsp;NO_PAGINATION
+</kbd>
+</div>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Arguments may be broken into several lines using the
+&#8220;line-continued&#8221; backslash (<b>\</b>), as shown above.
+</p>
+</div>
+
+<p>
+<kbd>FAMILY</kbd> is the family for the entirety of Lists pages.
+</p>
+
+<p>
+<kbd>FONT</kbd> is the font for the entirety of Lists pages.
+</p>
+
+<p>
+<kbd>PT_SIZE</kbd> is the base point size for the entirety of Lists
+pages.
+</p>
+
+<p>
+<kbd>LEAD</kbd> is the base leading for the entirety of Lists pages.
+</p>
+
+<p>
+<kbd>TITLE_FAMILY</kbd> is the family for the Lists titles if you
+want it different from the family otherwise used for the Lists
+pages.
+</p>
+
+<p>
+<kbd>TITLE_FONT</kbd> is the font for the Lists titles if you want
+it different from the font otherwise used for the Lists pages.
+</p>
+
+<p>
+<kbd>TITLE_SIZE</kbd> tells mom by how much to increase
+(<kbd>+</kbd>) or decrease (<kbd>-</kbd>) the point size of the
+titles relative to the overall point size of Lists pages.
+</p>
+
+<p>
+<kbd>TITLE_QUAD</kbd> tells mom how to position the title
+horizontally.
+</p>
+
+<p>
+<kbd>TITLE_COLOR</kbd> sets the colour for the titles. The colour
+must be pre-initialized with
+<a href="color.html#newcolor">NEWCOLOR</a>
+or
+<a href="color.html#xcolor">XCOLOR</a>.
+</p>
+
+<p>
+<kbd>PN_FAMILY</kbd> sets the family for entry pagenumbers.
+</p>
+
+<p>
+<kbd>PN_FONT</kbd> sets the font for entry pagenumbers.
+</p>
+
+<p>
+<kbd>PN_SIZE</kbd> tells mom by how much to increase (<kbd>+</kbd>)
+or decrease (<kbd>-</kbd>) the point size of entry pagenumbers
+relative to the overall point size of Lists pages.
+</p>
+
+<p>
+<kbd>EQN_PN_PADDING</kbd>, <kbd>FIG_PN_PADDING</kbd>, and
+<kbd>TBL_PN_PADDING</kbd> tells mom how many placeholders to reserve
+for the entry pagenumbers in their respective Lists. If, for example,
+a document with both tables and figures runs to over a hundred
+pages, but there are no tables after page 99,
+<br/>
+<span class="pre-in-pp">
+ LISTS_STYLE FIG_PN_PADDING 3
+ LISTS_STYLE TBL_PN_PADDING 2
+</span>
+would prevent an unneeded, reserved placeholder from putting too
+much space between the leader and the entry pagenumber in the List of
+Tables.
+</p>
+
+<p>
+The padding in effect, unless you change it, is whatever was set for
+the Tables of Contents; mom&#8217;s default is &#8220;3&#8221;.
+</p>
+
+<p>
+<kbd>PAGENUM_STYLE</kbd> tells mom which pagination format to use
+for the page numbers of the Lists pages themselves. By default,
+since Lists observe what is in effect for the Table of Contents, the
+pagination format is &#8220;roman&#8221;. Please note that the
+starting page number for any of the Lists is given as an argument to
+the
+<a href="#lists-of">LISTS_0F_&lt;type&gt;</a>
+macro.
+</p>
+
+<p>
+<kbd>NO_PAGINATION</kbd> disables pagination of Lists pages.
+</p>
+
+<h2 id="box-intro" class="docs">Shaded backgrounds and frames (boxes)</h2>
+
+<p>
+Mom lets you add shaded backgrounds and frames to text and other
+material. For convenience, she calls backgrounds and frames
+&#8220;boxes.&#8221; Entire passages may be boxed, or individual
+document elements like headings, quotes, or pre-processor output.
+Furthermore, boxes may be nested.
+</p>
+
+<p>
+Boxes start on the baseline where the boxed material would have
+started were it not for the box, subject to minor aesthetic
+corrections mom takes the liberty of making.
+</p>
+
+<p>
+Boxes extend from the current left margin to the current right
+margin, respecting any active left and/or right indents. There are
+two exceptions,
+<a href="docelement.html#epigraph">EPIGRAPH BLOCK</a>
+and
+<a href="docelement.html#blockquote">BLOCKQUOTE</a>,
+which are discussed
+<a href="#quotes">here</a>.
+</p>
+
+<p>
+After a box is started, active left and right indents are
+cleared. The box&#8217;s inset determines the new left and right
+margins. Indents set inside a box are relative to the inset.
+When a box is stopped, formerly active left and right indents
+are restored.
+</p>
+
+<p>
+Frames are drawn from the perimeter inward. The inset is
+relative to the inner edge of the frame.
+</p>
+
+<p>
+If a box (including the bottom inset) can complete on a page, it
+does, even if there is no further room for type. This may, on
+occasion, result in slight deviations from normal bottom margin
+alignment.
+</p>
+
+<p>
+Boxes span pages whenever the boxed material continues on the next
+page. Spanning boxes extend fully to the bottom margin of the page
+on which they begin, leaving a slightly larger inset at the bottom
+than around the other sides.
+</p>
+
+<p>
+When there is not enough room to set at least one line of type
+inside a box, mom defers starting the box until the next page,
+leaving a gap.
+</p>
+
+<p>
+Boxed material is not
+<a href="docprocessing.html#shim-vs-flex">shimmed</a>
+or
+<a href="docprocessing.html#shim-vs-flex">flexed</a>.
+If either was active prior to the box, it is restored when the box
+ends and mom automatically shims or flexes whatever comes next.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="important">NOTE:</span>
+Shaded backgrounds and frames are not available when your
+<a href="docprocessing.html#printstyle">PRINTSTYLE</a>
+is <kbd>TYPEWRITE</kbd> or when
+<a href="docprocessing.html#columns">COLUMNS</a> are enabled.
+</p>
+</div>
+
+<div class="macro-id-overline">
+<h3 id="box" class= "macro-id">BOX</h3>
+</div>
+
+<div id="box-macro" class="box-macro-args" style="margin-top: .5em">
+Macro: <b>BOX</b> <kbd class="macro-args"> [ &lt;arguments&gt; ] | &lt;anything&gt;
+<br/>
+Arguments:
+<br/>
+[ SHADED &lt;color&gt; | OUTLINED &lt;colour&gt; ] \
+<br/>
+[ INSET &lt;dist&gt; ] \
+<br/>
+[ WEIGHT &lt;wt&gt; ] \
+<br/>
+[ ADJUST +|-&lt;amount&gt; ] \
+<br/>
+[ EQN | PIC | GRAP | IMG ]
+</kbd>
+</div>
+
+<p>
+Without arguments, BOX begins a shaded grey background.
+The material inside is inset by one
+<a href="definitions.html#picaspoints">pica</a>.
+Any other type of box requires at a minimum either
+<kbd>SHADED</kbd> or <kbd>OUTLINED</kbd>. In the case of boxes
+that are to contain pdf images or pre-processor material for
+<a href="#eqn">eqn</a>,
+<a href="#pic">pic</a>,
+or
+<a href="#grap">grap</a>,
+<kbd>IMG</kbd>, <kbd>EQN</kbd>, <kbd>PIC</kbd>, or <kbd>GRAP</kbd>
+must also be given. Note that
+<a href="#tbl">tbl</a>
+does not have this requirement.
+</p>
+
+<p>
+BOX is a
+<a href="definitions.html#toggle">toggle macro</a>,
+so any argument other than one in the list completes the box
+(<kbd>QUIT</kbd>, <kbd>END</kbd>, <kbd>X</kbd>, etc).
+</p>
+
+<p>
+Boxes should be started inside toggle macros like
+<a href="docelement.html#quote">QUOTE</a>
+or
+<a href="#float">FLOAT</a>
+just after the macro is called, and terminated just before toggling
+the macro off (unless you wish the box to enclose further material).
+</p>
+
+<p>
+Non-toggle macros like
+<a href="docelement.html#heading">HEADING</a>
+or
+<a href="docelement.html#pp">PP</a>
+require that the box be started beforehand. Boxed pre-processor
+material must be fully enclosed by BOX&nbsp;/&nbsp;BOX&nbsp;OFF, as
+in this recipe for a one-off boxed pic diagram:
+<span class="pre-in-pp">
+.BOX
+.PS
+&lt;pic commands&gt;
+.PE
+.BOX OFF
+</span>
+Arguments to BOX are not sticky. Each time you invoke BOX, you
+must invoke it with arguments unless you want mom&#8217;s default grey
+background. If all or several boxes in a document require the same
+arguments, create a macro at the top of the input file that calls
+BOX with the arguments you want, e.g.
+<span class="pre-in-pp">
+&nbsp;&nbsp;.de PINK_BOX
+&nbsp;&nbsp;.BOX \
+&nbsp;&nbsp;&nbsp;&nbsp;SHADED pink \
+&nbsp;&nbsp;&nbsp;&nbsp;OUTLINED darkred \
+&nbsp;&nbsp;&nbsp;&nbsp;WEIGHT 1p \
+&nbsp;&nbsp;&nbsp;&nbsp;INSET 9p
+&nbsp;&nbsp;..
+</span>
+<kbd>.PINK_BOX</kbd> may then be used instead of <kbd>.BOX</kbd> any
+time you want a box with those arguments.
+</p>
+
+<h3 class="docs">SHADED | OUTLINED</h3>
+
+<p>
+<kbd>SHADED</kbd> or <kbd>OUTLINED</kbd> are required. Both may
+be given, resulting in a shaded background with a frame, and both
+require a colour, e.g.
+<span class="pre-in-pp">
+&nbsp;&nbsp;.BOX SHADED blue OUTLINED black
+</span>
+The colour may be
+</p>
+
+<ul style="margin-top: -1em;">
+ <li>an xcolor name</li>
+ <li>a colour initialized with
+ <a href="color.html#newcolor">NEWCOLOR</a>
+ or
+ <a href="color.html#xcolor">XCOLOR</a>
+ </li>
+ <li>an RGB hexadecimal string beginning with (e.g. #FF0000)</li>
+</ul>
+
+<p>
+Note that without <kbd>SHADED</kbd>, the above would simply draw a
+black frame.
+</p>
+
+<h3 class="docs">WEIGHT</h3>
+
+<p>
+Mom&#8217;s default weight for <kbd>OUTLINED</kbd> is 1/2
+<a href="definitions.html#picaspoints">point</a>.
+If you&#8217;d like to change it, give <kbd>WEIGHT</kbd> the desired
+value with a unit of measure appended, typically points, e.g.
+<span class="pre-in-pp">
+&nbsp;&nbsp;.BOX OUTLINED black WEIGHT 1p
+</span>
+</p>
+
+<h3 class="docs">INSET</h3>
+
+<p>
+Mom&#8217;s default inset for boxes is one
+<a href="definitions.html#picaspoints">pica</a>
+on all sides. If you&#8217;d like a larger or smaller inset, give
+<kbd>INSET</kbd> the distance you want with a unit of measure
+appended, e.g.
+<span class="pre-in-pp">
+&nbsp;&nbsp;.BOX SHADED pink INSET 2m
+</span>
+</p>
+
+<h3 class="docs">ADJUST</h3>
+
+<p>
+If you are not happy with the starting position of a box, you can
+change it by giving <kbd>ADJUST</kbd> the distance you want it
+raised (-) or lowered (+) with a unit of measure appended. For
+example, to lower a box three points,
+<span class="pre-in-pp">
+&nbsp;&nbsp;.BOX OUTLINED black ADJUST +3p
+</span>
+To raise it,
+<span class="pre-in-pp">
+&nbsp;&nbsp;.BOX OUTLINED black ADJUST -3p
+</span>
+</p>
+
+<h3 class="docs">PIC / GRAP / EQN / IMG</h3>
+
+<p>
+The <kbd>PIC</kbd> argument must be given to BOX if the box contains
+any
+<a href="#pic">pic</a>
+diagrams. Likewise, graphs made with
+<a href="#grap">grap</a>,
+equations made with
+<a href="#eqn">eqn</a>,
+and
+<a href="#pdf-image">pdf images</a>
+require a corresponding <kbd>GRAP</kbd>, <kbd>EQN</kbd>, or
+<kbd>IMG</kbd> argument.
+</p>
+
+<p>
+If you&#8217;re boxing a single diagram, graph, or pdf image, wrap
+it in a float, like this:
+<span class="pre-in-pp">
+&nbsp;&nbsp;.FLOAT
+&nbsp;&nbsp;.BOX PIC &lt;other parameters&gt;
+&nbsp;&nbsp;.PS
+&nbsp;&nbsp;&lt;pic input&gt;
+&nbsp;&nbsp;.PE
+&nbsp;&nbsp;.BOX OFF
+&nbsp;&nbsp;.FLOAT OFF
+</span>
+Notice that in the case of pdf images, pic, and grap, this
+represents a change from the norm, where the use of FLOAT may be
+destructive and is discouraged.
+</p>
+
+<h2 id="box-notes" class="docs">Additional notes on BOX usage and behaviour</h2>
+
+<h3 id="qbef" class="docs">QUOTE, BLOCKQUOTE, EPIGRAPH, FLOAT</h3>
+
+<p>
+<a href="docelement.html#quote">QUOTE</a>,
+<a href="docelement.html#blockquote">BLOCKQUOTE</a>,
+<a href="docelement.html#epigraph">EPIGRAPH</a>,
+and
+<a href="images.html#float">FLOAT</a>
+require that boxes be started <i>after</i> they are
+invoked and stopped just before they are toggled off:
+<span class="pre-in-pp">
+&nbsp;&nbsp;.QUOTE
+&nbsp;&nbsp;.BOX &lt;parameters&gt;
+&nbsp;&nbsp;Text of quote
+&nbsp;&nbsp;.BOX OFF
+&nbsp;&nbsp;.QUOTE OFF
+</span>
+</p>
+
+<h3 id="code" class="docs">CODE</h3>
+
+<p>
+If you&#8217;re boxing
+<a href="docelement.html#code">CODE</a>
+that&#8217;s wrapped inside
+<a href="docelement.html#quote">QUOTE</a>,
+as described
+<a href="docelement.html#quote-code">here</a>,
+set the quote indent to &#8220;0&#8221; with
+<span class="pre-in-pp">
+&nbsp;&nbsp;.QUOTE_STYLE INDENT 0
+</span>
+so that the box&#8217;s leftmost inset is respected.
+</p>
+
+<p>
+Here&#8217;s a recipe for setting boxed code with an 18-point inset:
+<span class="pre-in-pp">
+&nbsp;&nbsp;.QUOTE_STYLE INDENT 0
+&nbsp;&nbsp;.QUOTE
+&nbsp;&nbsp;.CODE
+&nbsp;&nbsp;.BOX INSET 18p
+&nbsp;&nbsp;Hello, world.
+&nbsp;&nbsp;.BOX OFF
+&nbsp;&nbsp;.QUOTE OFF
+</span>
+Note that CODE, wrapped inside QUOTE, does not require a corresponding CODE OFF.
+</p>
+
+<h4 id="quotes" class="docs">Description of boxed BLOCKQUOTES and EPIGRAPH BLOCKS</h4>
+
+<p>
+When you box a BLOCKQUOTE, or an EPIGRAPH with the <kbd>BLOCK</kbd>
+argument, the box is centred on the page and is only as wide as the
+blockquote or epigraph plus the box&#8217;s inset.
+</p>
+
+<p>
+QUOTE and EPIGRAPH (without the <kbd>BLOCK</kbd> argument), on the
+other hand, set the box fully to the left and right margins.
+</p>
+
+<h4 id="leftover" class="docs">Leftover box syndrome</h4>
+
+<p>
+Boxed quotes and blockquotes sometimes exhibit leftover box
+syndrome, where the page after a fully terminated boxed quote or
+blockquote begins with an empty bit of box. Equally, you may
+sometimes see the lower edge of a quote&#8217;s or
+blockquote&#8217;s box falling slightly below the page&#8217;s
+bottom margin.
+</p>
+
+<p>
+The solution in both situations is to use the <kbd>ADJUST</kbd>
+argument to raise or lower the box&#8217;s starting position.
+Leftover box syndrome is usually fixed by raising the box slightly.
+When the box runs too deep, lowering it is generally recommended,
+although this will result in a widowed line at the top of the next
+page. In either case, some experimentation is necessary.
+</p>
+
+<h3 id="slides" class="docs">SLIDES</h3>
+
+<p>
+On a slide with no pauses, boxes behave as they do in printed
+documents.
+</p>
+
+<p>
+When a slide contains pauses, only the material up to the first
+pause is boxed. As subsequent material is revealed, the box changes
+location, moving down to surround each new item. This behaviour
+persists until the box is stopped, making it useful for highlighting
+material as it is revealed.
+</p>
+
+<h3 id="footnotes" class="docs">Footnotes</h3>
+
+<p>
+You don&#8217;t have to worry about boxes encroaching on footnotes.
+Mom makes sure they don&#8217;t.
+</p>
+
+<h2 id="page-color-intro" class="docs">Page colour</h2>
+
+<p>
+Mom lets you change the page (&#8220;paper&#8221;) colour
+from white to anything you like. While this has limited application
+in printed documents, it can be effective in
+<a href="docprocessing.html#slides">slide presentations</a>.
+</p>
+
+<div class="macro-id-overline">
+<h3 id="page-color" class= "macro-id">PAGE_COLOR</h3>
+</div>
+
+<div id="page-color-macro" class="box-macro-args" style="margin-top: .5em">
+Macro: <b>PAGE_COLOR</b> <kbd class="macro-args"> &lt;color&gt; | OFF | off</kbd>
+</div>
+<p class="requires" style="font-style: normal">
+<i>Aliased as</i> <kbd>PAGE_COLOUR</kbd>, <kbd>SLIDE_COLOR</kbd>,
+<i>and</i> <kbd>SLIDE_COLOUR</kbd>.
+</p>
+
+<p>
+When you invoke PAGE_COLOR with a <kbd>color</kbd> argument, the
+current and subsequent pages turn the colour you request. If
+more than one instance of PAGE_COLOR appears before a page break,
+including <kbd>PAGE_COLOR OFF</kbd>, only the last applies.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Unlike other
+<a href="definitions.html#toggle">toggle macros</a>,
+PAGE_COLOR requires the use of <kbd>OFF</kbd> or <kbd>off</kbd>
+to terminate it rather than an arbitrary string (<kbd>OFF</kbd>,
+<kbd>QUIT</kbd>, <kbd>END</kbd>, <kbd>X</kbd>, etc).
+</p>
+</div>
+
+<div class="rule-long"><hr/></div>
+
+<!-- Navigation links -->
+<table style="width: 100%; margin-top: 12px;">
+<tr>
+ <td style="width: 33%;"><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="width: 20%; text-align: center;"><a href="#top">Top</a></td>
+ <td style="width: 46%; text-align: right;"><a href="headfootpage.html">Next: Page headers/footers, pagination</a></td>
+</tr>
+</table>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/momdoc/inlines.html b/contrib/mom/momdoc/inlines.html
new file mode 100644
index 0000000..8613161
--- /dev/null
+++ b/contrib/mom/momdoc/inlines.html
@@ -0,0 +1,1112 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>Mom -- Inline escapes</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div id="top" class="page">
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+<tr>
+ <td><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="text-align: right;"><a href="color.html#top">Next: Coloured text</a></td>
+</tr>
+</table>
+
+<h1 id="inline-escapes" class="docs">Inline escapes</h1>
+
+<div style="text-align: center;">
+<a href="#index-inlines">List of inline escapes</a>
+</div>
+
+<div class="rule-medium"><hr/></div>
+
+<h2 id="intro-inlines" class="docs">Introduction</h2>
+<p>
+Inline escapes, as described in the
+<a href="definitions.html#inlines">groff terms</a>
+section of this manual, are typesetting commands that appear in text
+<a href="definitions.html#inputline">input lines</a>,
+as opposed to macros and other
+<a href="definitions.html#controllines">control lines</a>
+that must appear on lines by themselves.
+</p>
+
+<p>
+Aside from altering type parameters within a line, inlines also tell
+groff about special characters&mdash;em-dashes, bullets,
+<a href="definitions.html#figurespace">figure/digit-width spaces</a>,
+and so on. It is beyond the scope of this manual to provide
+a complete list of groff&#8217;s inline functions and special
+characters. I recommend having a look at the
+<a href="intro.html#canonical">canonical reference materials</a>
+should you need more information than is contained herein.
+</p>
+
+<p>
+In groff, the escape character is the backslash (<kbd>\</kbd>).
+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 (<kbd>\\</kbd>). Groff understands that this
+means &#8220;please print a backslash character.&#8221;
+</p>
+
+<p>
+You can also use <kbd>\e</kbd> to print a literal backslash, or use
+<a href="goodies.html#esc-char">ESC_CHAR</a> to change the escape
+character to something other than the backslash, which lets you
+use a single backslash as a literal backslash.
+</p>
+
+<p>
+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.
+</p>
+
+<p>
+Mom recognizes that certain escapes get used more often than others.
+For these, she has a consistent input style that takes the form
+<kbd><span class="nobr">\*[...]</span></kbd>, which makes them stand out well
+from the text of your documents. These escapes are the ones listed
+under
+<a href="#inlines-mom">Mom&#8217;s personal inline escapes</a>.
+</p>
+
+<p>
+Despite mom&#8217;s best intentions, there are still
+a number of typesetting functions that can only be accomplished
+with groff&#8217;s native inline escapes. I&#8217;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
+<a href="intro.html#canonical">canonical reference materials</a>
+pertaining to groff.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="tip">Helpful bit of information:</span>
+Inline escapes can be used in
+<a href="docprocessing.html#docprocessing">document processing macros</a>
+that take
+<a href="definitions.html#stringargument">string arguments</a>.
+</p>
+</div>
+
+<div class="macro-list-container">
+<h3 id="index-inlines" class="macro-list">List of inline escapes</h3>
+
+<ul class="macro-list">
+<li id="inlines-mom"><a href="#inlines-mom-top">Mom&#8217;s personal inline escapes</a>
+<ul class="no-enumerator" style="margin-left: -1.5em;">
+ <li><a href="#inline-fonts-mom">Changing fonts</a></li>
+ <li><a href="#inline-size-mom">Changing point size</a></li>
+ <li><a href="#uc-lc">Capitalise a section of type</a></li>
+ <li><a href="#inline-kerning-mom">Pairwise kerning</a></li>
+ <li><a href="#inline-horizontal-mom">Horizontal movement</a></li>
+ <li><a href="#inline-vertical-mom">Vertical movement</a></li>
+ <li><a href="#inline-b-mom">Terminate a line without advancing on the page</a></li>
+ <li><a href="#tb-plus-mom">Call the next sequential tab without advancing on the page</a></li>
+ <li><a href="#inline-rule-mom">Full measure rules</a>
+ <ul class="sublist" style="font-size: 100%;">
+ <li><a href="#rule-weight">Macro to control the weight of rules</a></li>
+ </ul></li>
+</ul></li>
+<li id="inlines-groff"><a href="#inlines-groff-top">Commonly-used groff inline escapes</a>
+<ul class="no-enumerator" style="margin-left: -1.5em;">
+ <li><kbd>\f</kbd>&nbsp;<a href="#inline-fonts-groff">Font control</a></li>
+ <li><kbd>\h</kbd>&nbsp;<a href="#inline-horizontal-groff">Inline horizontal motions</a></li>
+ <li><kbd>\v</kbd>&nbsp;<a href="#inline-vertical-groff">Inline vertical motions</a></li>
+ <li><kbd>\w</kbd>&nbsp;<a href="#inline-stringwidth-groff">String width function</a></li>
+ <li><kbd>\l</kbd>&nbsp;<a href="#inline-linedrawing-groff">Horizontal line drawing function</a></li>
+ <li style="margin-left: 1.6em;"><a href="#inline-characters-groff">Special characters</a></li>
+</ul></li>
+</ul>
+</div>
+
+<div class="rule-medium"><hr/></div>
+
+<!-- -INLINE_FONTS_MOM- -->
+
+<h2 id="inlines-mom-top" class="macro-group">Mom&#8217;s personal inline escapes</h2>
+
+<h3 id="inline-fonts-mom" class="docs">Changing fonts</h3>
+
+<p>
+Mom provides five escapes for changing fonts inline:
+<br/>
+<span class="pre-in-pp">
+ \*[ROM] Change to the medium roman font
+ \*[IT] Change to the medium italic font
+ \*[BD] Change to the bold roman font
+ \*[BDI] Change to the bold italic font
+ \*[PREV] Revert to the previous font (once only)*
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">*Note:</span>
+<kbd><span class="nobr">\*[PREV]</span></kbd> does not operate "stack
+style". It returns to the previous font once only, and
+afterwards has no effect. In other words, in the case of
+<kbd><span class="nobr">\*[PREV]\*[PREV]</span></kbd>, only the first
+<kbd><span class="nobr">\*[PREV]</span></kbd> is respected; the second one is silently
+ignored.
+</p>
+</div>
+
+<p>
+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
+<a href="#inline-fonts-groff">font control with <kbd>\f</kbd></a>.
+</p>
+
+<div class="box-notes">
+<h3 id="inlines-docprocessing-fonts" class="docs notes">Notes concerning document processing</h3>
+<p style="margin-top: .5em;">
+If you&#8217;re using the
+<a href="docprocessing.html#docprocessing">document processing macros</a>,
+inline font changes remain in effect only for the duration of the
+current document element tag.
+</p>
+
+<p class="tip-bottom">
+Additionally, if you&#8217;re designing your own
+<a href="headfootpage.html#headfootpage-intro">HEADERS or FOOTERS</a>
+and want to use mom&#8217;s inline escapes for changing fonts as
+part of the left, centre and/or right strings, or in the strings
+for
+<a href="headfootpage.html#hdrftr-rectoverso">recto</a>
+and/or
+<a href="headfootpage.html#hdrftr-rectoverso">verso</a>
+HEADERS or FOOTERS, or in the strings passed to
+<a href="headfootpage.html#headers-and-footers">HEADERS_AND_FOOTERS</a>,
+you must enter the inlines beginning with <kbd>\E*</kbd>
+rather than just <kbd><span class="nobr">\*</span></kbd>, e.g.
+<kbd><span class="nobr">\E*[BD]</span></kbd>. You may, in such cases, prefer to
+use the simpler groff inline escape
+<a href="#inline-fonts-groff"><kbd>\f</kbd></a>.
+</p>
+</div>
+
+<!-- -INLINE_SIZE_MOM- -->
+
+<h3 id="inline-size-mom" class="docs">Changing point size</h3>
+<p>
+Mom has two inline escapes for changing point size:
+<br/>
+<span class="pre-in-pp">
+ \*[SIZE &lt;size&gt;]
+</span>
+and
+<br/>
+<span class="pre-in-pp">
+ \*S[&lt;size&gt;]
+</span>
+where &#8220;size&#8221; 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
+<br/>
+<span class="pre-in-pp">
+ \*[SIZE 12]
+</span>
+or
+<br/>
+<span class="pre-in-pp">
+ \*S[12]
+</span>
+Entering either <kbd><span class="nobr">\*[SIZE]</span></kbd> or
+<kbd><span class="nobr">\*S[]</span></kbd> with no argument reverts to the former
+point size.
+</p>
+
+<p>
+The advantage of the first form is that it&#8217;s easy to remember,
+and follows mom&#8217;s usual inline syntax. The advantage of the
+second is that it&#8217;s more concise.
+</p>
+
+<p>
+Notice that in both cases, the new size does not require a
+<a href="definitions.html#unitofmeasure">unit of measure</a>;
+<a href="definitions.html#picaspoints">points</a>
+is assumed. However, a unit of measure may be appended to the size
+if that&#8217;s what you wish. Fractional sizes are, of course,
+allowed.
+</p>
+
+<p>
+The size given to <kbd><span class="nobr">\*[SIZE&nbsp;&lt;size&gt;]</span></kbd>
+or <kbd><span class="nobr">\*S[&lt;size&gt;]</span></kbd> may be expressed in
+plus or minus terms, which can be very useful. In the following
+examples, the word &#8220;mom&#8221; will be output 2 points larger
+than the point size of the rest of the line.
+<br/>
+<span class="pre-in-pp">
+ 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.
+</span>
+Please note that inline size changes do not update the leading if
+<a href="typesetting.html#autolead">AUTOLEAD</a>
+is enabled.
+</p>
+
+<div class="box-notes">
+<h3 id="inline-docprocessing-ps" class="docs notes">NOTE CONCERNING DOCUMENT PROCESSING</h3>
+<p style="margin-top: .5em;">
+If you&#8217;re using the
+<a href="docprocessing.html#docprocessing">document processing macros</a>
+and wish to design your own
+<a href="headfootpage.html#headfootpage-intro">HEADERS or FOOTERS</a>
+using mom&#8217;s inline escape for changing point size as part of
+the left, centre and/or right strings, or in the strings for
+<a href="headfootpage.html#hdrftr-rectoverso">recto</a>
+and/or
+<a href="headfootpage.html#hdrftr-rectoverso">verso</a>
+HEADERS or FOOTERS, or in the strings passed to
+<a href="headfootpage.html#headers-and-footers">HEADERS_AND_FOOTERS</a>,
+you <i>must</i> use the form <kbd><span class="nobr">\*S[&lt;n&gt;]</span></kbd>
+and enter the inline beginning with <kbd>\E*</kbd>, like this:
+<kbd><span class="nobr">\E*S[&lt;+|-&gt;&lt;n&gt;]</span></kbd>.
+</p>
+
+<p class="tip-bottom">
+<span class="additional-note">Additional note:</span>
+If you&#8217;re accustomed to groff&#8217;s usual way of handling
+inline size requests <kbd>(\sN, \s±N, \s(NN, \s±(NN, \s[NNN],
+\s±[NNN]),</kbd> feel free to continue with your old habits. Mom
+doesn&#8217;t care.
+</p>
+</div>
+
+<!-- -CAPITALISATION- -->
+
+<h3 id="uc-lc" class="docs">Capitalise a section of type</h3>
+<p>
+If you need to capitalise a region of type inline,
+bracket the region of type with the inline escapes,
+<kbd><span class="nobr">\*[UC]</span></kbd> (Upper Case) and
+<kbd><span class="nobr">\*[LC]</span></kbd> (Lower Case), like this:
+<br/>
+<span class="pre-in-pp">
+ All work \*[UC]and\*[LC] no play makes Jack a dull boy.
+</span>
+The above produces, on output
+<br/>
+<span class="pre-in-pp">
+ All work AND no play makes Jack a dull boy.
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+<kbd>\*[UC]</kbd> and <kbd>\*[LC]</kbd> must not be used inside the
+<a href="definitions.html#stringargument">string arguments</a>
+passed to the
+<a href="headfootpage.html#hdrftr-strings">HEADER_&lt;POSITION&gt;</a>
+macro. Instead, use the control macro
+<a href="headfootpage.html#_caps">HEADER_&lt;POSITION&gt;_CAPS.</a>
+For
+<a href="headfootpage.html#hdrftr-rectoverso">HEADER_RECTO</a>
+(or _VERSO) or
+<a href="headfootpage.html#hdrftr-rectoverso">FOOTER_RECTO</a>
+(or _VERSO), supply the <kbd>CAPS</kbd> option to the appropriate
+macro.
+</p>
+</div>
+
+<!-- -INLINE_KERNING_MOM- -->
+
+<h3 id="inline-kerning-mom" class="docs">Pairwise kerning</h3>
+<p>
+Pairwise kerning means moving specific letter pairs closer
+together or further apart (see
+<a href="definitions.html#kern">Typesetting terms, kerning</a>
+for more details).
+</p>
+
+<p>
+Mom permits inline pairwise kerning through the use of the inline
+escapes
+<br/>
+<span class="pre-in-pp">
+ \*[BU &lt;n&gt;]&nbsp;Closes the space between letters (Back Units).
+ \*[FU &lt;n&gt;]&nbsp;Opens the space between letters (Forward Units).
+</span>
+<b>&lt;n&gt;</b> is the number of
+<a href="definitions.html#kernunit">kern units</a>
+by which to close or open the space between letters.
+</p>
+
+<p>
+For example,
+<br/>
+<span class="pre-in-pp">
+ THE HUMAN COST OF COMMODIF\*[FU 1]YING FRESH W\*[BU 4]A\*[BU 5]TER
+</span>
+moves the letter Y in &#8220;COMMODIFYING&#8221; one kern unit away
+from the letter F, and the letter A in &#8220;WATER&#8221; four
+kern units closer to the letter W. Additionally, the letter T in
+&#8220;WATER&#8221; is moved five kern units closer to the letter A.
+</p>
+
+<p>
+For backward compatibility, the forms
+<br/>
+<span class="pre-in-pp">
+ \*[BU1]...\*[BU36]&nbsp;Move backward 1...36 <a href="definitions.html#kernunit">kern units</a>
+ \*[FU1]...\*[FU36]&nbsp;Move forward 1...36 <a href="definitions.html#kernunit">kern units</a>
+</span>
+also exist (i.e. with no space before the number of kern units desired,
+up to a limit of 36).
+</p>
+
+<p id="kernunit">
+The default size of a kern unit is 1/36 of the current point size;
+this may be changed by invoking the macro <kbd>.KERN_UNIT</kbd>
+with the desired value, which represents a fraction of the current
+point size. For example, to change the kern unit to 1/54 of the
+current point size,
+<br/>
+<span class="pre-in-pp">
+ .KERN_UNIT 54
+</span>
+To restore the kern unit to its default, invoke
+<kbd>.KERN_UNIT</kbd> with an argument of <kbd>DEFAULT</kbd>.
+</p>
+
+
+<div class="box-notes">
+<h3 id="inlines-docprocessing-kerning" class="docs notes">Notes concerning document processing</h3>
+<p style="margin-top: .5em;">
+If you&#8217;re using the
+<a href="docprocessing.html#docprocessing">document processing macros</a>
+and wish to design your own
+<a href="headfootpage.html#headfootpage-intro">HEADERS or FOOTERS</a>
+using mom&#8217;s inline escapes for kerning as part of the left,
+centre and/or right strings, or in the strings for
+<a href="headfootpage.html#hdrftr-rectoverso">recto</a>
+and/or
+<a href="headfootpage.html#hdrftr-rectoverso">verso</a>
+HEADERS or FOOTERS, or in the strings passed to
+<a href="headfootpage.html#headers-and-footers">HEADERS_AND_FOOTERS</a>,
+you <i>must</i> use the forms
+<kbd><span class="nobr">\E*[BU&lt;n&gt;]</span></kbd> and
+<kbd><span class="nobr">\E*[FU&lt;n&gt;]</span></kbd> (i.e. with no space),
+and enter the inline beginning with <kbd><span class="nobr">\E*</span></kbd>
+rather than just <kbd><span class="nobr">\*</span></kbd>, e.g.
+<kbd><span class="nobr">\E*[BU4]</span></kbd>.
+</p>
+
+<p class="tip-bottom">
+<span class="additional-note">Additional note:</span>
+Using the <kbd>BU</kbd> or <kbd>FU</kbd> escapes between characters
+pairs that are already automatically kerned (see
+<a href="typesetting.html#kern">KERN</a>)
+disables the automatic kerning and uses the value you give to
+<kbd>BU</kbd> or <kbd>FU</kbd> instead.
+</p>
+</div>
+
+<!-- -INLINE_HORIZONTAL_MOM- -->
+
+<h3 id="inline-horizontal-mom" class="docs">Horizontal inline movement</h3>
+<p>
+Sometimes, you may need to insert a specified amount of white
+space into an
+<a href="definitions.html#outputline">output line</a>,
+or&mdash;occasionally&mdash;back up to a previous position on an
+<a href="definitions.html#inputline">output</a>
+line in order to create special typographic effects.
+</p>
+
+<p>
+Mom&#8217;s inline escapes for these horizontal movements are
+<br/>
+<span id="bck" class="pre-in-pp">
+ \*[BCK &lt;n unit&gt;]&nbsp;&nbsp;Move backward inline the specified number of
+ <a href="definitions.html#unitofmeasure">units of measure</a>; decimal fractions are allowed.
+</span>
+and
+<span id="fwd" class="pre-in-pp">
+ \*[FWD &lt;n unit&gt;]&nbsp;&nbsp;Move forward inline the specified number of
+ <a href="definitions.html#unitofmeasure">units of measure</a>; decimal fractions are allowed.
+</span>
+</p>
+
+<p>
+For example,
+<br/>
+<span class="pre-in-pp">
+ 1.\*[FWD 12p]The Free Trade Play-Offs: WalMart 100, Mexico 0
+</span>
+puts 12 points of space between <kbd>1.</kbd> and
+<kbd>The</kbd>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+For backward compatibility, the forms
+<br/>
+<span class="pre-in-pp">
+ \*[BP.25]...\*[BP12.75]&nbsp;Move backward .25...12.75 points
+ \*[FP.25]...\*[FP12.75]&nbsp;Move forward .25...12.75 points
+</span>
+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&#8217;s possible to do,
+for example, <kbd><span class="nobr">\*[FP.5]</span></kbd> or
+<kbd><span class="nobr">\*[BP1.25]</span></kbd> up to a limit of 12.75 points.
+</p>
+</div>
+
+<div class="box-notes">
+<h3 id="inlines-docprocessing-horizontal" class="docs notes">Note concerning document processing</h3>
+<p style="margin-top: .5em; padding-bottom: .5em;">
+If you&#8217;re using the
+<a href="docprocessing.html#docprocessing">document processing macros</a>
+and wish to design your own
+<a href="headfootpage.html#headfootpage-intro">HEADERS or FOOTERS</a>
+using mom&#8217;s inline escapes for horizontal movements as part of
+the left, centre and/or right strings, or in the strings for
+<a href="headfootpage.html#hdrftr-rectoverso">recto</a>
+and/or
+<a href="headfootpage.html#hdrftr-rectoverso">verso</a>
+HEADERS or FOOTERS, or in the strings passed to
+<a href="headfootpage.html#headers-and-footers">HEADERS_AND_FOOTERS</a>,
+you <i>must</i> use the forms
+<kbd><span class="nobr">\E*[BP&lt;n&gt;]</span></kbd> and
+<kbd><span class="nobr">\E*[FP&lt;n&gt;]</span></kbd> (i.e. with no space),
+and enter the inline beginning with <kbd><span class="nobr">\E*</span></kbd>
+rather than just <kbd><span class="nobr">\*</span></kbd>, e.g.
+<kbd><span class="nobr">\E*[BP.75]</span></kbd>. You may, in such cases, prefer
+to use the native groff inline escape
+<a href="#inline-horizontal-groff"><kbd>\h</kbd></a>.
+</p>
+</div>
+
+<!-- -INLINE_VERTICAL_MOM- -->
+
+<h3 id="inline-vertical-mom" class="docs">Vertical inline movement</h3>
+<p>
+If you need to move portions of type up or down on a line, mom
+provides the following inline escapes:
+<br/>
+<span id="down" class="pre-in-pp">
+ \*[DOWN &lt;n unit&gt;]&nbsp;Move down inline the specified number of
+ <a href="definitions.html#unitofmeasure">units of measure</a>
+
+ <span id="up">\*[UP &lt;n unit&gt;]&nbsp;Move up inline the specified number of
+ <a href="definitions.html#unitofmeasure">units of measure</a></span>
+</span>
+For example,
+<br/>
+<span class="pre-in-pp">
+ Tel: 905\*[UP 1p]-\*[DOWN 1p]4072
+</span>
+moves the hyphen in the telephone number up by 1 point, then
+moves back down by the same amount.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+<kbd><span class="nobr">\*[UP]</span></kbd> and
+<kbd><span class="nobr">\*[DOWN]</span></kbd>
+do not work in conjunction with the inline escape,
+<a href="#inline-rule-mom"><kbd><span class="nobr">\*[RULE]</span></kbd></a>.
+</p>
+
+<p>
+<span class="additional-note">Additional note:</span>
+For backward compatibility, the following are also available:
+<br/>
+<span class="pre-in-pp">
+ \*[ALD.25]...\*[ALD12.75] Advance lead .25...12.75 points (move downward)
+ \*[RLD.25]...\*[RLD12.75] Reverse lead .25...12.75 points (move upward)
+</span>
+</p>
+
+<p class="tip-bottom">
+Both <kbd><span class="nobr">\*[ALD]</span></kbd> and
+<kbd><span class="nobr">\*[RLD]</span></kbd> work in points, hence you
+mustn&#8217;t use a unit of measure.
+</p>
+</div>
+
+<div class="box-notes">
+<h3 id="inline-docprocessing-vertical" class="docs notes">Note concerning document processing</h3>
+<p style="margin-top: .5em; padding-bottom: .5em;">
+If you&#8217;re using the
+<a href="docprocessing.html#docprocessing">document processing macros</a>
+and wish to design your own
+<a href="headfootpage.html#headfootpage-intro">HEADERS or FOOTERS</a>
+using mom&#8217;s inline escapes for vertical movements as part of
+the left, centre and/or right strings, or in the strings for
+<a href="headfootpage.html#hdrftr-rectoverso">recto</a>
+and/or
+<a href="headfootpage.html#hdrftr-rectoverso">verso</a>
+HEADERS or FOOTERS, or in the strings passed to
+<a href="headfootpage.html#headers-and-footers">HEADERS_AND_FOOTERS</a>,
+you <i>must</i> use the forms
+<kbd><span class="nobr">\E*[ALD&lt;n&gt;]</span></kbd> and
+<kbd>\E*[RLD&lt;n&gt;]</kbd> (i.e. with no space), and enter the
+inline beginning with <kbd><span class="nobr">\E*</span></kbd> rather than just
+<kbd><span class="nobr">\*</span></kbd>,
+e.g. <kbd><span class="nobr">\E*[ALD.5]</span></kbd>.
+You may, in such cases, prefer to use the native groff inline
+escape
+<a href="#inline-vertical-groff"><kbd>\v</kbd></a>.
+
+</p>
+</div>
+
+<!-- -INLINE_B_MOM- -->
+
+<h3 id="inline-b-mom" class="docs">Terminate a line without advancing on the page</h3>
+<p>
+Sometimes, you want mom to break a line but not advance on the page.
+This can be accomplished with the macro
+<a href="typesetting.html#el">EL</a>
+or with the escape <kbd><span class="nobr">\*[B]</span></kbd>. Simply attach
+<kbd><span class="nobr">\*[B]</span></kbd> to the end of any input line. Using
+the example given in the document entry for EL, you&#8217;d use
+<kbd><span class="nobr">\*[B]</span></kbd> like this:
+<br/>
+<span class="pre-in-pp">
+ .LEFT
+ .LS 12.5
+ A line of text.\*[B]
+ .ALD 24p
+ The next line of text.
+</span>
+
+<kbd>\*[B]</kbd> works reliably regardless of the current
+<a href="definitions.html#filled">fill mode</a>.
+</p>
+
+<!-- -INLINE_TB+_MOM- -->
+
+<h3 id="tb-plus-mom" class="docs">Call the next sequential tab without advancing on the page</h3>
+<p>
+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 NOTE
+<a href="typesetting.html#note-tn">here</a>
+if you&#8217;re not clear how mom manages tabs and linebreaks.) To
+do so, simply attach the escape <kbd><span class="nobr">\*[TB+]</span></kbd> to
+the end of the input line in previous tab, like this:
+<br/>
+<span class="pre-in-pp">
+ .TAB 1
+ Some text\*[TB+] \" In tab 1
+ Some more text \" In tab 2, same baseline.
+</span>
+
+<kbd><span class="nobr">\*[TB+]</span></kbd> works reliably regardless of the
+current
+<a href="definitions.html#filled">fill mode</a>.
+</p>
+
+<!-- -INLINE_RULE_MOM- -->
+
+<h3 id="inline-rule-mom" class="docs">Full measure rules</h3>
+<p>
+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
+<kbd><span class="nobr">\l'\n[.l]u'</span></kbd>, which is annoying to type,
+and doesn&#8217;t mean a whole heck of a lot if you&#8217;re new
+to groff. The inline, <kbd><span class="nobr">\*[RULE]</span></kbd>, is a
+simple replacement for <kbd><span class="nobr">\l'\n[.l]u'</span></kbd>. Use it
+whenever you need a rule drawn to the full measure of the current
+line or tab length, for example:
+<br/>
+<span class="pre-in-pp">
+ .LL 6P
+ \*[RULE]
+</span>
+
+The above draws a rule the full measure of the 6-pica line length.
+For another way to draw full measure rules, see the macro
+<a href="graphical.html#drh">DRH</a>.
+</p>
+
+<p>
+<kbd>\*[RULE]</kbd> must appear on an
+<a href="definitions.html#inputline">input line</a>
+by itself, and always causes a break when entered after a normal
+input line of text. It does not, however, deposit a break when used
+immediately after a macro.
+</p>
+
+<p>
+The weight of the rule drawn with <kbd><span class="nobr">\*[RULE]</span></kbd>
+is controlled with the macro
+<a href="#rule-weight">RULE_WEIGHT</a>.
+Mom&#8217;s default is 1/2 point.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+<kbd><span class="nobr">\*[RULE]</span></kbd> 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:
+<br/>
+<span class="pre-in-pp">
+ Signature__________________________________________
+</span>
+If you wish to accomplish this effect, you have to use
+<kbd>\*[RULE]</kbd> in conjunction with the
+<a href="goodies.html#pad">PAD</a>
+macro and
+<a href="typesetting.html#string-tabs">string tabs</a>.
+(See the
+<a href="goodies.html#pad-example">example</a>
+provided with PAD.)
+<a name="RULE_EXCEPTION"></a>
+</p>
+
+<p>
+Please also note that the inline escapes
+<a href="#up"><kbd><span class="nobr">\*[UP]</span></kbd></a>
+and
+<a href="#down"><kbd>\*[DOWN]</kbd></a>
+cannot be used in conjunction with <kbd><span class="nobr">\*[RULE]</span></kbd>.
+</p>
+
+<p>
+This <i>doesn&#8217;t</i> work:
+<br/>
+<span class="pre-in-pp">
+ \*[DOWN 2p]\*[RULE]\*[UP 2p]
+</span>
+whereas this does:
+<br/>
+<span class="pre-in-pp">
+ .ALD 2p
+ \*[RULE]
+ .RLD 2p
+</span>
+</p>
+
+<p class="tip-bottom">
+See groff&#8217;s
+<a href="#inline-linedrawing-groff">Horizontal line drawing function</a>
+for more information on drawing horizontal rules.
+</p>
+</div>
+
+<!-- -RULE_WEIGHT- -->
+
+<div id="rule-weight" class="box-macro-args">
+Macro: <b>RULE_WEIGHT</b> <kbd>&lt;weight in points&gt;</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Must <span class="normal">not</span> have a
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+appended.
+<br/>
+&nbsp;&nbsp;Argument must be greater than 0 and less than 100; decimal
+fractions are allowed.
+</p>
+
+<p>
+RULE_WEIGHT allows you to tell mom how heavy (in other words, how
+&#8220;thick&#8221;) you want the rules drawn with the inline
+escape,
+<a href="#inline-rule-mom"><kbd><span class="nobr">\*[RULE]</span></kbd></a>.
+It takes a single argument: the weight of the rule in
+<a href="definitions.html#picaspoints">points</a>
+<i>but without the</i>
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+<kbd>p</kbd> <i>attached</i>. Thus, to set the weight of rules
+drawn with <kbd><span class="nobr">\*[RULE]</span></kbd> to 1-1/4 points,
+you&#8217;d do
+<br/>
+<span class="pre-in-pp">
+ .RULE_WEIGHT 1.25
+</span>
+</p>
+
+<p>
+RULE_WEIGHT also sets the weight of rules drawn
+with
+<a href="graphical.html#drh"><kbd>.DRH</kbd></a>
+when DRH is not given any arguments.
+</p>
+
+<div class="rule-medium"><hr/></div>
+
+<!-- -INLINE_FONT_GROFF- -->
+
+<h2 id="inlines-groff-top" class="macro-group">Commonly-used groff inline escapes</h2>
+
+<h3 id="inline-fonts-groff" class="docs">Font control (<kbd style="text-transform: none">\f</kbd>)</h3>
+
+<p>
+Groff&#8217;s basic mechanism for inline font control is the escape
+<kbd>\f[&lt;font&gt;]</kbd>.
+<br/>
+<span class="pre-in-pp">
+ \f[R] Change to the medium roman font (equivalent to mom's \*[ROM])
+ \f[I] Change to the medium italic font (equivalent to mom's \*[IT])
+ \f[B] Change to the bold roman font (equivalent to mom's \*[BD])
+ \f[BI] Change to the bold italic font (equivalent to mom's \*[BDI])
+ \f[P] Revert to the previous font (equivalent to mom's \*[PREV])
+</span>
+</p>
+
+<p>
+<kbd>\f[&lt;font&gt;]</kbd> can be used with any valid
+<a href="definitions.html#font">font style</a>
+registered with groff. (See
+<a href="appendices.html#style-extensions">here</a>
+for a list of pre-registered font styles provided by mom).
+</p>
+
+<p>
+<kbd>\f[&lt;family&gt;&lt;font&gt;]</kbd> can also take a complete valid
+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:
+<br/>
+<span class="pre-in-pp">
+ .FAM T
+ .FT R
+ The command \f[CBI]ls -l\f[P] gives a "long" directory listing.
+</span>
+The Unix command <kbd>ls -l</kbd> will appear in Courier Bold Italic
+in a line that is otherwise in Times Roman.
+</p>
+
+<!-- -INLINE_HORIZONTAL_GROFF- -->
+
+<h3 id="inline-horizontal-groff" class="docs">Inline horizontal motions (<kbd style="text-transform: none;">\h</kbd>)</h3>
+
+<p>
+Whenever you need to move forward or backward on a line, use the
+inline
+<br/>
+<span class="pre-in-pp">
+ \h'&lt;distance&gt;'
+</span>
+In order to avoid unpleasant surprises, always append a
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+to <kbd>&lt;distance&gt;</kbd>. For example,
+<br/>
+<span class="pre-in-pp">
+ \h'1.25i'
+</span>
+moves you 1.25 inches to the right (forward) of the horizontal
+position on the current
+<a href="definitions.html#outputline">output line</a>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+<kbd>\h'&lt;distance&gt;'</kbd> is exactly equivalent to a
+<a href="#fwd"><kbd><span class="nobr">\*[FWD&nbsp;n&lt;unit&gt;]</span></kbd></a>.
+</p>
+</div>
+
+<p>
+To move backwards by the same amount, do
+<br/>
+<span class="pre-in-pp">
+ \h'-1.25i'
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip" style="margin-top: -1em;">
+<span class="note">Note:</span>
+<kbd>\h'-&lt;distance&gt;'</kbd> is exactly equivalent to
+<a href="#bck"><kbd><span class="nobr">\*[BCK&nbsp;n&lt;unit&gt;]</span></kbd></a>.
+</p>
+</div>
+
+<!-- -INLINE_VERTICAL_GROFF- -->
+
+<h3 id="inline-vertical-groff" class="docs">Inline vertical motions (<kbd style="text-transform: none;">\v</kbd>)</h3>
+
+<p>
+If you need to raise or lower type on a line (say, for sub- or
+superscripts, or any other special effect), use
+<br/>
+<span class="pre-in-pp">
+ \v'&lt;distance&gt;'
+</span>
+In order to avoid unpleasant surprises, always append a
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+to <kbd>&lt;distance&gt;</kbd>. For example,
+<br/>
+<span class="pre-in-pp">
+ \v'.6m'
+</span>
+moves you (approx.) 2/3 of an
+<a href="definitions.html#em">em</a>
+downward on the current
+<a href="definitions.html#outputline">output line</a>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+<kbd>\v'&lt;distance&gt;'</kbd> is exactly equivalent to
+<a href="#down"><kbd><span class="nobr">\*[DOWN&nbsp;n&lt;unit&gt;]</span></kbd></a>.
+</p>
+</div>
+
+<p style="margin-top: -.5em;">
+To move upward an equivalent amount, do
+<br/>
+<span class="pre-in-pp">
+ \v'-.6m'
+</span>
+</p>
+
+<div class="box-tip" style="margin-top: -1em;">
+<p class="tip">
+<span class="note">Note:</span>
+<kbd>\v'&lt;-distance&gt;'</kbd> is exactly equivalent to
+<a href="#up"><kbd><span class="nobr">\*[UP&nbsp;n&lt;unit&gt;]</span></kbd></a>.
+</p>
+</div>
+
+<div class="box-important">
+<p class="tip">
+<span class="important">Important:</span>
+The vertical motion of <kbd>\v</kbd> only affects type on the
+current
+<a href="definitions.html#outputline">output line</a>.
+When groff breaks the output line, the effect of
+<kbd>\v</kbd> is cancelled; the baseline of the next output line
+is where it would be if you hadn&#8217;t used <kbd>\v</kbd>.
+</p>
+</div>
+
+<div class="box-tip">
+<p class="tip">
+<span class="tip">Tip:</span>
+When using <kbd>\v</kbd> for occasional effects in a line,
+don&#8217;t forget to reverse it when you&#8217;ve done what you
+want to do. Otherwise, the remaining type will be set too high (if
+you used <kbd>\v</kbd> with the minus sign) or too low (if you used
+<kbd>\v</kbd> without the minus sign).
+</p>
+</div>
+
+<!-- -INLINE_STRINGWIDTH_GROFF- -->
+
+<h3 id="inline-stringwidth-groff" class="docs">String width function (<kbd style="text-transform: none;">\w</kbd>)</h3>
+
+<p>
+In the context of mom, the string width inline
+<kbd>\w'&lt;string&gt;'</kbd> 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 &#8220;Examples:&#8221; plus a space, you can set it with
+the <kbd>\w</kbd> inline escape:
+<br/>
+<span class="pre-in-pp">
+ .IL "\w'Examples: '"
+</span>
+</p>
+
+<div class="box-tip" style="margin-top: -1em;">
+<p class="tip">
+<span class="note">Note:</span>
+Whenever you pass <kbd>\w'string'</kbd>
+to a macro that normally requires a
+<a href="definitions.html#unitofmeasure">unit of measure</a>,
+<i>do NOT add a unit of measure to the</i>
+<kbd>\w'string'</kbd> <i>argument.</i>
+</p>
+
+<p class="tip-bottom">
+Furthermore, if the <kbd>\w</kbd> is used in place of a
+<a href="definitions.html#numericargument">numeric argument</a>
+to a macro and <kbd>string</kbd> is composed of several words
+separated by spaces, you must surround the whole escape with double
+quotes, as in the example above.
+</p>
+</div>
+
+<!-- -INLINE_LINEDRAWING_GROFF- -->
+
+<h3 id="inline-linedrawing-groff" class="docs">Horizontal line drawing function (<kbd style="text-transform: none;">\l</kbd>)</h3>
+
+<p>
+The <kbd>\l'distance'</kbd> inline allows you to draw a horizontal
+rule of the specified distance. You must supply a
+<a href="definitions.html#unitofmeasure">unit of measure</a>.
+Therefore, to set a 3-pica rule into a line of text, you&#8217;d do
+<br/>
+<span class="pre-in-pp">
+ A line of text with a superfluous \l'3P' 3-pica rule in it.
+</span>
+<kbd>\l'3P'</kbd>, above, not only draws the rule, but advances 3
+picas horizontally as well, just as you&#8217;d expect.
+</p>
+
+<p>
+For an easy way of drawing rules to the full measure of the current
+line or tab length, see
+<a href="#inline-rule-mom">Full measure rules</a>.
+</p>
+
+<p>
+The weight (thickness) of rules varies according to the point
+size in effect when you invoke <kbd>\l</kbd>, but you can&#8217;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).
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Besides <kbd>\l</kbd>, <b>groff</b> provides a number of more
+sophisticated &#8220;drawing&#8221; escapes. It is well beyond
+the scope of this documentation to demonstrate their usage; see
+<br/>
+<span class="pre-in-pp">
+ info groff \\D
+</span>
+for directions concerning their use. The drawing escapes can be a
+bit unwieldy, so mom provides &#8220;user-friendly&#8221; macros for
+the
+<a href="graphical.html#top">graphical objects</a>
+most commonly encountered in typesetting: horizontal and vertical
+rules, boxes, and circles (ellipses).
+</p>
+
+<p class="tip-bottom">
+Additionally, groff comes with two &#8220;preprocessors&#8221; that
+let you create ruled tables and vector diagrams (line drawings):
+<b>tbl</b> and <b>pic</b>. The documentation for <b>tbl</b> can be
+downloaded from
+<br/>
+ <a style="display: inline-block; margin-left: 2em; margin-top: .5em; margin-bottom: .5em" href="http://cm.bell-labs.com/cm/cs/doc/76/tbl.ps.gz">http://cm.bell-labs.com/cm/cs/doc/76/tbl.ps.gz</a>
+<br/>
+and <b>pic</b> from
+<br/>
+ <a style="display: inline-block; margin-left: 2em; margin-top: .5em; margin-bottom: .5em" href="http://www.kohala.com/start/troff/gpic.raymond.ps">http://www.kohala.com/start/troff/gpic.raymond.ps</a>
+<br/>
+Both are powerful tools, but they can be nasty to learn&mdash;at
+first, anyway. You may prefer to use a vector drawing program
+to create diagrams and tables; inserting the results into a
+document is easy enough with
+<a href="images.html#pdf-image">PDF_IMAGE</a>
+or
+<a href="images.html#pspic">PSPIC</a>.
+</p>
+</div>
+
+<!-- -INLINE_CHARACTERS_GROFF- -->
+
+<h3 id="inline-characters-groff" class="docs">Special characters and symbols</h3>
+<p>
+Here follows a short list of commonly-used special characters
+available via inline escapes. If you&#8217;re not sure of the
+meaning of some of these characters, consult the
+<a href="definitions.html#top">Definitions of Terms</a>.
+</p>
+
+<p>
+For a complete list of special characters and glyphs (i.e. just
+about anything you&#8217;d ever want to appear on the printed
+page, including mathematical symbols, accented characters, unusual
+ligatures and letters unique to various European languages), consult
+<kbd>man groff_char</kbd>.
+</p>
+
+<span class="pre">
+ CHARACTER ESCAPE SEQUENCE
+ --------- ---------------
+ Comment line \# or .\"
+ Fixed-width space \&lt;space&gt;
+ Unbreakable space \~
+ Digit-width (figure) space \0
+ Zero-width character \&amp;
+ Discretionary hyphen \%
+ Backslash \\ or \e
+ Plus&#47;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]
+ Open (left) single-quote \[oq]
+ Close (right) single-quote \[cq]
+ 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]
+</span>
+<br/>
+
+<div class="rule-long"><hr/></div>
+
+<!-- Navigation links -->
+<table style="width: 100%; margin-top: 12px;">
+<tr>
+ <td style="width: 33%;"><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="width: 33%; text-align: center;"><a href="#top">Top</a></td>
+ <td style="width: 33%; text-align: right;"><a href="color.html#top">Next: Coloured text</a></td>
+</tr>
+</table>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/momdoc/intro.html b/contrib/mom/momdoc/intro.html
new file mode 100644
index 0000000..3e25631
--- /dev/null
+++ b/contrib/mom/momdoc/intro.html
@@ -0,0 +1,487 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>What is mom?</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div id="top" class="page">
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+ <tr>
+ <td><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="text-align: right;"><a href="definitions.html#top">Next: Definitions</a></td>
+ </tr>
+ </table>
+
+<h1 id="intro" class="docs">What is mom?</h1>
+
+<div style="text-align: center;">
+<ul class="no-enumerator" style="margin-left: -2.5em;">
+ <li ><a href="#intro-intro">Who is mom meant for?</a></li>
+ <li ><a href="#intro-typesetting">Typesetting with mom</a></li>
+ <li ><a href="#intro-docprocessing">Document processing with mom</a></li>
+ <li ><a href="#intro-philosophy">Mom&#8217;s philosophy</a></li>
+ <li ><a href="#intro-documentation">A note on mom&#8217;s documentation</a></li>
+ <li ><a href="#canonical">Canonical reference materials</a></li>
+ <li ><a href="#macro-args">How to read macro arguments</a></li>
+</ul>
+</div>
+
+<div class="rule-short" style="margin-top: 18px;"><hr/></div>
+
+<h2 id="intro-intro" class="docs">Who is mom meant for?</h2>
+
+<p>
+Mom (&#8220;my own macros&#8221;, &#8220;my other macros&#8221;,
+&#8220;maximum overdrive macros&#8221;...) is a macro set for groff,
+designed to format documents in Portable Document Format (.pdf) and
+PostScript (.ps). She&#8217;s aimed at three kinds of users:
+</p>
+
+<ol style="margin-top: -.5em; margin-bottom: -.5em;">
+ <li>Typesetters who suspect groff might be the right
+ tool for the job but who are frustrated,
+ intimidated, or puzzled by groff&#8217;s terse,
+ not-always-typographically-intuitive
+ <a href="definitions.html#primitives">primitives</a>;
+ </li>
+ <li>Writers who need to format their work easily, with a
+ minimum of clutter;
+ </li>
+ <li>Newcomers to groff, typesetting, or document processing
+ who need a well-documented macro set to get them started.
+ </li>
+</ol>
+
+<p>
+Mom is actually two macro packages in one: a very complete set
+of typesetting macros, and an equally thorough set of document
+formatting macros. The typesetting macros afford fine-grained
+control over all visible aspects of page layout and design (margins,
+fonts, sizes, kerning, etc), while the document formatting macros
+focus on the logical structure of a document (titles, headings,
+paragraphs, lists, etc) and call on groff to render logical
+structure into pleasing type.
+</p>
+
+<h2 id="intro-typesetting" class="docs">Typesetting with mom</h2>
+
+<p>
+Mom&#8217;s typesetting macros control the basic parameters
+of type: margins, line lengths, 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.
+</p>
+
+<p>
+The typesetting macros also provide the means to create horizontal
+and vertical rules, rectangles (boxes, frames), and ellipses
+(circles).
+</p>
+
+<p>
+In terms of typographic control, the typesetting macros provide
+access to groff&#8217;s primitives in a way that&#8217;s consistent,
+sensible, and easy to use. With them, you can create individual
+pages designed from the ground up. Provided you have not signalled
+to mom that you want document processing (via the
+<a href="docprocessing.html#start">START</a>
+macro; see below), every typesetting 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.
+</p>
+
+<p>
+Years of experience have convinced me that no program can ever
+replace the human eye and human input when it comes to high quality
+typesetting. Words and punctuation on the printed page are too
+variable, too fluid, to be rendered flawlessly by any algorithm,
+no matter how clever.
+</p>
+
+<p>
+Mom, therefore, does not try to guess solutions for issues like
+hanging punctuation, or left-margin adjustments for troublesome
+letters like T, V and W. Rather, she provides tools that allow
+knowledgeable typesetters to handle these typographic challenges in
+ways that are easier and more intuitive than manipulating groff at
+the primitive level.
+</p>
+
+<h2 id="intro-docprocessing" class="docs">Document processing with mom</h2>
+
+<p>
+Mom&#8217;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&#8217;d like your headings underlined,
+or in caps, or centred rather than flush left, you can make the
+changes easily and have them apply to the whole document. Temporary
+and one-off changes are easy, too.
+</p>
+
+<p>
+Mom has some features other macro sets don&#8217;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&#8217;s a special
+macro&mdash;
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPEWRITE</kbd></a>&mdash;
+that changes typeset documents into ones that would make an
+old-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.
+</p>
+
+<h2 id="intro-philosophy" class="docs">Mom&#8217;s philosophy</h2>
+
+<p>
+Formatting documents should be easy, from soup to nuts. Writers
+need to focus on what they&#8217;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&#8217;t be too much clutter. Your documents
+should be as readable inside a text editor as they are on the
+printed page.
+</p>
+
+<p>
+Unfortunately, in computerland, &#8220;easy,&#8221;
+&#8220;comprehensible,&#8221; and &#8220;readable&#8221; often
+mean &#8220;you&#8217;re stuck with what you get.&#8221; No
+document formatting system can give you exactly what you want all
+the time, every time. Documents always need to be tweaked, either
+to satisfy a typographic whim or to clarify some aspect of their
+content.
+</p>
+
+<p>
+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
+<a href="definitions.html#primitives">primitives</a>
+and
+<a href="definitions.html#inlines">inline escapes</a>
+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 as an encrypted password. This does
+not make for happy-camper writers, who either find themselves stuck
+with a formatting style they don&#8217;t like, or are forced to
+learn groff from the ground up&mdash;a daunting task, to say the
+least.
+</p>
+
+<p>
+Mom aims to make creating documents a simple matter, but with no
+corresponding loss of user control. The document processing macros
+provide an initial set of reasonable defaults, but anything that
+is not to your liking can be changed. In combination with the
+typesetting macros, you have all the tools you need to massage
+passages and tweak pages until they look utterly professional.
+</p>
+
+<p>
+One rarely hears the term &#8220;user interface&#8221; in
+conjunction with document processing. Since 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
+&#8220;coding&#8221; 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&#8217;s going on in a document easier to decipher,
+typographically and structurally.
+</p>
+
+<p>
+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&#8217;s displayed. She&#8217;s
+designed for primarily for PDF or PostScript output, although
+with
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPEWRITE</kbd></a>
+she produces acceptable terminal copy. No attempt is made to be
+compatible with older versions of troff.
+</p>
+
+<p>
+One special feature in mom&#8217;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, &#8220;hang.&#8221; There are,
+of course, situations where whitespace at the bottom of a page
+may be unavoidable (for example, you wouldn&#8217;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 (&#8220;line
+spacing&#8221;) and the spacing between different elements on the
+page.
+</p>
+
+<h2 id="intro-documentation" class="docs">A note on mom&#8217;s documentation</h2>
+
+<p>
+Writing documentation is tough, no doubt about it. One is never
+quite sure of the user&#8217;s level of expertise. Is s/he new to
+the application, new to its underlying protocols and programs, new
+to the operating system? At some point, one has to decide for whom
+the documentation is intended. Making the wrong choice can mean the
+difference between a program that gets used and a program that gets
+tossed.
+</p>
+
+<p>
+Mom&#8217;s documentation assumes users know their way around
+their own operating system (basic file management, how to use
+the command line, how to use a text editor, etc). I run GNU/Linux,
+and while the documentation may exhibit a GNU/Linux bias, mom
+and groff can, in fact, be run on other platforms.
+</p>
+
+<p>
+The documentation further assumes users at least know what groff
+is, even if they don&#8217;t know much about it. Lastly,
+it assumes that everyone&mdash;groff newbies and experts
+alike&mdash;learns faster from a few well-placed examples than
+from manpage-style reference docs. What mom&#8217;s documentation
+doesn&#8217;t assume is that you know everything&mdash;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&#8217;t enough, I offer examples.
+</p>
+
+<h3 id="canonical" class="docs">Canonical reference materials</h3>
+
+<p>
+The canonical reference materials for groff are
+<strong>cstr54</strong> (a downloadable PostScript copy of which
+is available
+<a href="http://www.kohala.com/start/troff/cstr54.ps">here</a>)
+and the <strong>troff</strong> and <strong>groff_diff</strong>
+manpages. The most complete and up-to-date source of information is
+the groff info pages, available by typing <kbd>info groff</kbd> at
+the command line (assuming you have the TeXinfo standalone browser
+installed on your system, which is standard for most GNU/Linux
+distributions). And for inputting special characters, see <kbd>man
+groff_char</kbd>.
+</p>
+
+<p style="margin-top: 24px;">
+I&#8217;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&#8217;m more interested in getting mom users up and running.
+<i>Mea culpa.</i>
+</p>
+
+<p>
+Groff has ancillary programmes (pre-processors) for generating
+tables (<strong>tbl</strong>), diagrams (<strong>pic</strong>), and
+equations (<strong>eqn</strong>), which may be used in conjunction
+with mom. The manuals describing their usage are found at:
+<br/>
+<span style="display:block; margin-top: .5em">
+<kbd>&nbsp;&nbsp;tbl</kbd>&nbsp;<a href="http://www.kohala.com/start/troff/v7man/tbl/tbl.ps">http://www.kohala.com/start/troff/v7man/tbl/tbl.ps</a>
+<br/>
+<kbd>&nbsp;&nbsp;pic</kbd>&nbsp;<a href="http://www.kohala.com/start/troff/gpic.raymond.ps">http://www.kohala.com/start/troff/gpic.raymond.ps</a>
+<br/>
+<kbd>&nbsp;&nbsp;eqn</kbd>&nbsp;<a href="http://www.kohala.com/start/troff/v7man/eqn/eqn2e.ps">http://www.kohala.com/start/troff/v7man/eqn/eqn2e.ps</a>
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip-top" style="padding-bottom: 9px;">
+<b>Note:</b> Mom&#8217;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&#8217;s contained in this documentation.
+</p>
+</div>
+
+<div class="rule-short" style="padding-top: 6px; padding-bottom: 3px;"><hr/></div>
+
+<h2 id="macro-args" class="docs">How to read macro arguments</h2>
+
+<p>
+The concise descriptions of macros in this documentation typically
+look like this:
+</p>
+
+<div class="box-macro-args">
+Macro: <b>MACRO_NAME</b> <kbd class="macro-args">arguments</kbd>
+</div>
+
+<p>
+<kbd>arguments</kbd> lists the macro&#8217;s
+arguments using conventions that should be familiar to anyone who
+has ever read a manpage. Briefly:
+</p>
+
+<ol>
+ <li>Macro arguments are separated from each other by spaces.</li>
+ <li>If an argument is surrounded by chevrons
+ (<kbd>&lt;&nbsp;&gt;</kbd>), it&#8217;s a description
+ of the argument, not the argument itself.
+ </li>
+ <li>If an argument begins with or is surrounded by double-quotes, the
+ double quotes must be included in the argument.
+ </li>
+ <li>If the user has a choice between several arguments, each of the
+ choices is separated by the pipe character
+ (<kbd>|</kbd>), which means &#8220;or.&#8221;
+ </li>
+ <li>Arguments that are optional are surrounded by square brackets.</li>
+ <li><kbd>&lt;off&gt;</kbd> or <kbd>&lt;anything&gt;</kbd> in an argument
+ list means that any argument other than those in the argument
+ list turns the macro off.
+ </li>
+</ol>
+
+<h3 id="toggle-macro" class="docs">Toggle macros</h3>
+
+<p>
+Some macros don&#8217;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&#8217;s right: <em>any</em>
+argument (in caps, lowercase, or a mixture thereof). This permits
+choosing whatever works for you: <kbd>OFF</kbd>, <kbd>end</kbd>,
+<kbd>Quit</kbd>, <kbd>Q</kbd>, <kbd>X</kbd>, and so on.
+</p>
+
+<p>
+Since these macros toggle things on and off, the argument list
+simply reads <kbd>toggle</kbd>.
+</p>
+
+<div id="examples" class="examples-container">
+<h2 class="docs" style="margin-top: .5em;">Examples</h2>
+
+<div class="examples">Example 1: An argument requiring double-quotes</div>
+
+<div class="box-macro-args" style="max-width: 684px;">
+Macro: <b>TITLE</b> <kbd class="macro-args">&quot;&lt;title of document&gt;&quot;</kbd>
+</div>
+
+<p>
+The required argument to TITLE is the title of your document.
+Since it&#8217;s surrounded by double-quotes, you must include
+them in the argument, like this:
+<br/>
+<span class="pre-in-pp">
+ .TITLE "My Pulitzer Novel"
+</span>
+</p>
+
+<div class="examples" style="margin-top: -1em;">Example 2: A macro with required and optional arguments</div>
+
+<div class="box-macro-args" style="width: 684px;">
+Macro: <b>TAB_SET</b> <kbd class="macro-args">&lt;tab number&gt; &lt;indent&gt; &lt;length&gt; [ L | R | C | J [ QUAD ] ]&nbsp;</kbd>
+</div>
+
+<p>
+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:
+<br/>
+<span class="pre-in-pp">
+ .TAB_SET 3 6P 3P
+</span>
+The remaining two arguments are optional. The first is a
+single letter, either <kbd>L, R, C</kbd> or
+<kbd>J</kbd>. The second, which is itself
+optional after <kbd>L, R, C</kbd> or
+<kbd>J</kbd>, is the word <kbd>QUAD</kbd>.
+Therefore, depending on what additional information you wish to
+pass to the macro, you could enter:
+<br/>
+<span class="pre-in-pp">
+ .TAB_SET 3 6P 3P L
+</span>
+or
+<br/>
+<span class="pre-in-pp">
+ .TAB_SET 3 6P 3P L QUAD
+</span>
+</p>
+
+<div id="toggle-example" class="examples" style="margin-top: -1em;">Example 3: A sample toggle macro:</div>
+
+<div class="box-macro-args" style="max-width: 684px;">
+Macro: <b>QUOTE</b> <kbd class="macro-args">toggle</kbd>
+</div>
+
+<p>
+<kbd>QUOTE</kbd> begins a section of quoted text
+in a document and doesn&#8217;t require an argument. When the
+quote&#8217;s finished, you have to tell mom it&#8217;s done.
+<span class="pre">
+ .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
+</span>
+</p>
+
+<p>
+ Alternatively, you could have turned the quote off with
+ <kbd>END</kbd>, or <kbd>X</kbd>, or something else.
+ </p>
+</div>
+
+<!-- Navigation links -->
+<table style="width: 100%; margin-top: 12px;">
+<tr>
+ <td style="width: 33%;"><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="width: 33%; text-align: center;"><a href="#top">Top</a></td>
+ <td style="width: 33%; text-align: right;"><a href="definitions.html#top">Next: Definitions</a></td>
+</tr>
+</table>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/momdoc/letters.html b/contrib/mom/momdoc/letters.html
new file mode 100644
index 0000000..3021eb2
--- /dev/null
+++ b/contrib/mom/momdoc/letters.html
@@ -0,0 +1,577 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>Mom -- Writing letters</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div id="top" class="page">
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+<tr>
+ <td><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="text-align: right;"><a href="macrolist.html#top">Next: Quick reference guide</a></td>
+</tr>
+</table>
+
+<h1 class="docs">Writing letters</h1>
+
+<div style="width: 33%; margin: auto;">
+<ul class="no-enumerator">
+ <li><a href="#letters-intro">Introduction</a></li>
+ <li><a href="#letters-tutorial">Tutorial</a></li>
+ <li><a href="#letters-defaults">Mom&#8217;s default letter style</a></li>
+ <li><a href="#index-letters-macros">The letter macros</a></li>
+</ul>
+</div>
+
+<div class="rule-medium"><hr/></div>
+
+<h2 id="letters-intro" class="docs">Introduction</h2>
+
+<p>
+Mom&#8217;s simple but effective letter-writing macros are a subset
+of the
+<a href="docprocessing.html#docprocessing">document processing macros</a>,
+designed to ease the creation of correspondence.
+</p>
+
+<p>
+Because the letter macros are a subset of the document processing
+macros, you can use
+<a href="definitions.html#controlmacro">control macros</a>
+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.
+</p>
+
+<div class="examples-container" style="margin-top: 1.5em; margin-bottom: 1.5em;">
+<h3 id="letters-tutorial" class="docs">Tutorial &ndash; writing letters</h3>
+
+<p>
+Mom letters begin, like all mom-processed documents, with
+<a href="docprocessing.html#reference-macros">reference macros</a>
+(in this case,
+<a href="docprocessing.html#author">AUTHOR</a>),
+a
+<a href="docprocessing.html#doctype">DOCTYPE</a>
+(LETTER, obviously), the essential
+<a href="docprocessing.html#printstyle">PRINTSTYLE</a>
+macro, and
+<a href="docprocessing.html#start">START</a>,
+like this:
+<br/>
+<span class="pre-in-pp">
+ .AUTHOR "Yannick P. Guique"
+ .DOCTYPE LETTER
+ .PRINTSTYLE TYPESET
+ .START
+</span>
+PRINTSTYLE, above, could also be <kbd>TYPEWRITE</kbd>. Mom has no
+objection to creating letters that look like they were typed on an
+Underwood by a shapely secretary with 1940s gams.
+</p>
+
+<p>
+Please note that if you choose <kbd>PRINTSTYLE TYPEWRITE</kbd>,
+there&#8217;s no need to give the <kbd>SINGLESPACE</kbd> option, as
+this is the unalterable default for letters.
+</p>
+
+<p>
+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&#8217;s you; in business
+correspondence, typically both name and address), and a greeting
+(in full, e.g. &#8220;Dear Mr. Smith,&#8221; or &#8220;Dear
+Mr. Smith:&#8221;).
+</p>
+
+<p>
+The macros for entering the headers are simple (they&#8217;re not even
+<a href="definitions.html#toggle">toggles</a>):
+<br/>
+<span class="pre-in-pp">
+ .DATE
+ .TO
+ .FROM
+ .GREETING
+</span>
+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&#8217;s opening according to what you do include. See
+<a href="#letters-defaults">Default for letters</a>
+to find out how mom formats the headers.
+</p>
+
+<p>
+Once you&#8217;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
+<a href="docelement.html#pp">PP</a>
+macro.
+</p>
+
+<p>
+At the end of the letter, should you wish a closing (&#8220;Yours
+truly,&#8221; &#8220;Sincerely,&#8221; &#8220;Hugs and
+kisses&#8221;), invoke the macro <kbd>.CLOSING</kbd> on a line
+by itself, and follow it with the text of the closing. <b>N.B.</b>
+Don&#8217;t put your name here; mom supplies it automatically from
+<a href="docprocessing.html#author">AUTHOR</a>),
+with enough space to leave room for your signature. If you omit the
+closing, mom simply adds your name (from AUTHOR), again with enough
+space for your signature.
+</p>
+
+<p>
+Assuming our tutorial letter is for business correspondence,
+here&#8217;s what the complete letter looks like.
+<br/>
+<span class="pre-in-pp">
+ .AUTHOR "Yannick P. Guique"
+ .DOCTYPE LETTER
+ .PRINTSTYLE TYPESET
+ .START
+ .DATE
+ August 25, 2010
+ .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 once again 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 relies heavily on open source programs and
+ protocols, notably TCP/IP.
+ .PP
+ Therefore, in the interests of your corporation&#8217;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,
+</span>
+This produces a letter with headers that follow the North American
+standard for business correspondence. If you&#8217;d prefer another style
+of correspondence, for example, British, you&#8217;d set up the same
+letter like this:
+<br/>
+<span class="pre-in-pp">
+ .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,
+</span>
+Notice the use of <kbd>.RIGHT</kbd> after <kbd>.FROM</kbd> and
+<kbd>.DATE</kbd> in this example, used to change the default quad
+for these macros.
+</p>
+</div>
+
+<h2 id="letters-defaults" class="docs">Default letter style</h2>
+
+<p>
+In letters, if the order of header macros is
+</p>
+<ol style="margin-top: -.5em;">
+ <li><kbd>.DATE</kbd></li>
+ <li><kbd>.TO</kbd>&nbsp;&nbsp;(the addressee)</li>
+ <li><kbd>.FROM</kbd>&nbsp;&nbsp;(the addresser)</li>
+ <li><kbd>.GREETING</kbd>&nbsp;&nbsp;(&#8220;Dear Whoever,&#8221; &#8220;To Whom It May Concern,&#8221; etc.)</li>
+</ol>
+<p style="margin-top: -.5em;">
+mom sets
+</p>
+<ul style="margin-top: -.5em;">
+ <li>the date flush right, page right, at the top of page one,
+ with a gap of two linespaces underneath
+ </li>
+ <li>the addressee (<kbd>.TO</kbd>) in a block flush left, page
+ left, with a gap of one linespace underneath
+ </li>
+ <li>the addresser (<kbd>.FROM</kbd>) in a block flush left, page
+ left, with a gap of one linespace underneath
+ </li>
+ <li>the greeting flush left, with a gap of one linespace
+ underneath
+ </li>
+</ul>
+<p style="margin-top: -.5em;">
+which is the standard for North American business correspondence.
+</p>
+
+<p>
+If you switch the order of <kbd>.DATE</kbd>, <kbd>.TO</kbd> and/or
+<kbd>.FROM</kbd>, 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
+<kbd>.RIGHT</kbd> macro, on a line by itself, immediately before
+inputting the text of the header.)
+</p>
+
+<p>
+Following the headers, mom sets
+</p>
+<ul style="margin-top: -.5em;">
+ <li>the body of the letter justified</li>
+ <li>in multi-page letters:
+ <ul style="margin-left: -.5em;">
+ <li>a footer indicating there&#8217;s a next page (of the form <kbd>.../#</kbd>)</li>
+ <li>the page number at the top of every page after page one</li>
+ </ul></li>
+ <li>the closing/signature lines flush left, indented halfway across the page</li>
+</ul>
+
+<p>
+Other important style defaults are listed below, and may be changed
+via the
+<a href="typesetting.html#top">typesetting macros</a>
+or the document processing
+<a href="definitions.html#controlmacro">control macros</a>
+prior to
+<a href="docprocessing.html#start">START</a>.
+Assume that any style parameter not listed below is the same as for
+any document processed with
+<a href="docprocessing.html#typeset-defaults">PRINTSTYLE <kbd>TYPESET</kbd></a>
+or
+<a href="docprocessing.html#typewrite-defaults">PRINTSTYLE <kbd>TYPEWRITE</kbd></a>.
+</p>
+
+<div class="defaults-container" style="padding-bottom: 8px;">
+<span class="pre defaults">
+ PARAMETER PRINTSTYLE TYPESET PRINTSTYLE TYPEWRITE
+
+ Paper size 8.5 x 11 inches 8.5 x 11 inches
+ Left/right margins 1.125 inches 1.125 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 &quot;next page&quot; number of the form .../#
+</span>
+</div>
+
+<div class="rule-medium"><hr/></div>
+
+
+<div class="macro-list-container">
+<h3 id="index-letters-macros" class="macro-list">The letter macros</h3>
+<p style="margin-left: 9px; margin-top: -1.5em;">
+All letter macros must come after
+<a href="docprocessing.html#start">START</a>,
+except NO_SUITE, which must come after
+<a href="docprocessin.html#start">PRINTSTYLE</a>
+and before
+<a href="docprocessing.html#start">START</a>.
+</p>
+
+<ul class="macro-list" style="margin-top: -.75em;">
+ <li><a href="#date">DATE</a></li>
+ <li><a href="#to">TO</a></li>
+ <li><a href="#from">FROM</a></li>
+ <li><a href="#greeting">GREETING</a></li>
+ <li><a href="#closing">CLOSING</a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#closing-indent">CLOSING_INDENT</a></li>
+ <li><a href="#signature-indent">SIGNATURE_INDENT</a></li>
+ </ul></li>
+ <li><a href="#no-suite">NO_SUITE</a> &ndash; turn the &#8220;next page&#8221; footer off</li>
+</ul>
+</div>
+
+<!-- -DATE- -->
+
+<div id="date" class="box-macro-args">
+Macro: <b>DATE</b>
+</div>
+
+<p>
+Invoke <kbd>.DATE</kbd> on a line by itself, with the date
+underneath, like this:
+<br/>
+<span class="pre-in-pp">
+ .DATE
+ October 31, 2012
+</span>
+If you wish to change the default quad direction for the date,
+enter <kbd>.LEFT</kbd> or <kbd>.RIGHT</kbd>, on a line by itself,
+immediately after <kbd>.DATE</kbd>.
+</p>
+
+<p>
+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:
+<br/>
+<span class="pre-in-pp">
+ .DATE
+ October 31, 2012
+ .SPACE \"Or, more simply, .SP
+</span>
+If you wish to remove the default space,
+<br/>
+<span class="pre-in-pp">
+ .SPACE -1v \"Or, more simply, .SP -1v
+</span>
+will do the trick.
+</p>
+
+<!-- -TO- -->
+
+<div id="to" class="box-macro-args">
+Macro: <b>TO</b>
+</div>
+
+<p>
+Invoke <kbd>.TO</kbd> on a line by itself, with the name and address
+of the addressee underneath, like this:
+<br/>
+<span class="pre-in-pp">
+ .TO
+ JOHN SMITH
+ 10 Roberts Crescent
+ Bramladesh, Ont.
+</span>
+If you wish to change the default quad direction for the address,
+enter <kbd>.LEFT</kbd> or <kbd>.RIGHT</kbd>, on a line by itself,
+immediately after <kbd>.TO</kbd>.
+</p>
+
+<p>
+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:
+<br/>
+<span class="pre-in-pp">
+ .TO
+ JOHN SMITH
+ 10 Roberts Crescent
+ Bramladesh, Ont.
+ .SPACE \"Or, more simply, .SP
+</span>
+If you wish to remove the default space,
+<br/>
+<span class="pre-in-pp">
+ .SPACE -1v \"Or, more simply, .SP -1v
+</span>
+will do the trick.
+</p>
+
+<!-- -FROM- -->
+
+<div id="from" class="box-macro-args">
+Macro: <b>FROM</b>
+</div>
+
+<p>
+Invoke <kbd>.FROM</kbd> on a line by itself, with the name and
+address of the addresser underneath, like this:
+<br/>
+<span class="pre-in-pp">
+ .FROM
+ JOE BLOW
+ 15 Brunette Road
+ Ste-Vieille-Andouille, Québec
+</span>
+If you wish to change the default quad direction for the address,
+enter <kbd>.LEFT</kbd> or <kbd>.RIGHT</kbd>, on a line by itself,
+immediately after <kbd>.FROM</kbd>.
+</p>
+
+<p>
+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:
+<br/>
+<span class="pre-in-pp">
+ .FROM
+ JOE BLOW
+ 15 Brunette Road
+ Ste-Vieille-Andouille, Québec
+ .SPACE \"Or, more simply, .SP
+</span>
+If you wish to remove the default space,
+<br/>
+<span class="pre-in-pp">
+ .SPACE -1v \"Or, more simply, .SP -1v
+</span>
+will do the trick.
+</p>
+
+<!-- -GREETING- -->
+
+<div id="greeting" class="box-macro-args">
+Macro: <b>GREETING</b>
+</div>
+
+<p>
+Invoke <kbd>.GREETING</kbd> on a line by itself, with the full
+salutation you want for the letter underneath, like this:
+<br/>
+<span class="pre-in-pp">
+ .GREETING
+ Dear Mr. Smith,
+</span>
+</p>
+
+<!-- -CLOSING- -->
+
+<div id="closing" class="box-macro-args">
+Macro: <b>CLOSING</b>
+</div>
+
+<p>
+Invoke <kbd>.CLOSING</kbd> on a line by itself after the body of
+the letter, with the closing you&#8217;d like (e.g. &#8220;Yours
+truly,&#8221;) underneath, like this:
+<br/>
+<span class="pre-in-pp">
+ .CLOSING
+ Yours truly,
+</span>
+</p>
+
+<div class="box-tip" style="background-color: #E3D2B1;">
+<p class="tip">
+<span class="tip" style="display: inline-block; padding-bottom: .5em; color: #000056;">CLOSING control macros and defaults</span>
+<br/>
+Two macros control the behaviour of <kbd>.CLOSING</kbd>:
+</p>
+<ul style="margin-top: -1.25em;">
+ <li>CLOSING_INDENT</li>
+ <li>SIGNATURE_SPACE</li>
+</ul>
+
+<p id="closing-indent" style="margin-top: -.25em;">
+The first, CLOSING_INDENT, indicates the distance from the left
+margin you&#8217;d like to have your closing indented. It takes a
+single
+<a href="definitions.html#numericargument">numeric argument</a>
+and must have a
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+appended to it, unless you want an indent of 0 (zero). Mom&#8217;s
+default is one half the width of the letter&#8217;s line length
+(i.e. halfway across the page). If you wanted, instead, an indent of
+6
+<a href="definitions.html#picaspoints">picas</a>,
+you&#8217;d do it like this:
+<br/>
+<span class="pre-in-pp">
+ .CLOSING_INDENT 6P
+</span>
+Or, if you wanted to have no indent at all:
+<br/>
+<span class="pre-in-pp">
+ .CLOSING_INDENT 0
+</span>
+</p>
+
+<p id="signature-space" style="margin-top: -1.25em;">
+The second, SIGNATURE_SPACE, controls how much room to leave for the
+signature. It takes a single
+<a href="definitions.html#numericargument">numeric argument</a>
+and must have a
+<a href="definitions.html#unitofmeasure">unit of measure</a>
+appended to it. Mom&#8217;s default is 3 line spaces, but if you
+wanted to change that to, say, 2 line spaces, you&#8217;d do:
+<br/>
+<span class="pre-in-pp">
+ .SIGNATURE_SPACE 2v
+</span>
+</p>
+</div>
+
+<!-- -NO_SUITE- -->
+
+<div id="no-suite" class="box-macro-args" style="margin-top: 2em;">
+Macro: <b>NO_SUITE</b>
+</div>
+
+<p>
+If you don&#8217;t want mom to print a &#8220;next page&#8221;
+number at the bottom of multi-page letters, invoke
+<kbd>.NO_SUITE</kbd>, on a line by itself, prior to
+<a href="docprocessing.html#start">START</a>.
+</p>
+
+<div class="rule-long"><hr/></div>
+
+<!-- Navigation links -->
+<table style="width: 100%; margin-top: 12px;">
+<tr>
+ <td style="width: 33%;"><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="width: 33%; text-align: center;"><a href="#top">Top</a></td>
+ <td style="width: 33%; text-align: right;"><a href="macrolist.html">Next: Quick reference guide</a></td>
+</tr>
+</table>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/momdoc/macrolist.html b/contrib/mom/momdoc/macrolist.html
new file mode 100644
index 0000000..81ebd7c
--- /dev/null
+++ b/contrib/mom/momdoc/macrolist.html
@@ -0,0 +1,1529 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>Mom -- Quick reference guide</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div id="top" class="page" style="width: 800px">
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+<tr>
+ <td><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="text-align: right;"><a href="appendices.html#top">Next: Appendices</a></td>
+</tr>
+</table>
+
+<h1 class="docs">Quick reference guide</h1>
+
+<p>
+Once you know your way around mom, you may find this guide
+preferable to using the Table of Contents. It lists mom&#8217;s
+major user-space macros. The links point to references found
+elsewhere in the documentation.
+</p>
+
+<div class="macro-list-container" style="padding-left: 9px; padding-right: 9px; padding-bottom: 9px;">
+<h2 class="docs" style="text-align: center; padding-top: 15px;">Index to the quick reference guide</h2>
+<div style="width: 50%; float: left; margin-right: 9px;">
+<h3 class="docs" style="margin-top: 1.25em;">TYPESETTING MACROS</h3>
+<ul style="margin-top: .5em; margin-left: 0; padding-left: 0; list-style-type: none;">
+ <li><a href="#qr-1">Paper size, margins, line length</a></li>
+ <li><a href="#qr-2">Family, font, point size</a></li>
+ <li><a href="#qr-3">Font modifications</a></li>
+ <li><a href="#qr-4">Linespacing (leading)</a></li>
+ <li><a href="#qr-5">Justification, quad, breaking lines</a></li>
+ <li><a href="#qr-6">Hyphenation</a></li>
+ <li><a href="#qr-7">Word and sentence spacing</a></li>
+ <li><a href="#qr-8">Kerning, ligatures, smartquotes</a></li>
+ <li><a href="#qr-9">Horizontal/vertical motions, columns</a></li>
+ <li><a href="#qr-10">Indents</a></li>
+ <li><a href="#qr-11">Tabs</a></li>
+ <li><a href="#qr-12">Underscoring, underlining</a></li>
+ <li><a href="#qr-13">Superscipts</a></li>
+ <li><a href="#qr-14">Nested lists</a></li>
+ <li><a href="#qr-15">Colour</a></li>
+ <li><a href="#qr-16">Dropcaps</a></li>
+ <li><a href="#qr-56">Smallcaps</a></li>
+ <li><a href="#qr-17">Utilities</a></li>
+ <li><a href="#qr-18">Graphical objects and images</a></li>
+</ul>
+<h3 class="docs" style="margin-top: -.5em;">DOCUMENT PROCESSING MACROS</h3>
+<ul style="margin-top: .5em; margin-left: 0; padding-left: 0; list-style-type: none;">
+ <li><a href="#qr-19">Reference macros (metadata)</a></li>
+ <li><a href="#qr-20">Document type and initial defaults</a></li>
+ <li><a href="#qr-59">&nbsp;&nbsp;&ndash;&nbsp;Slides</a></li>
+ <li><a href="#qr-23">TYPEWRITE control macros</a></li>
+ <li><a href="#qr-57">Vertical whitespace management</a></li>
+ <li><a href="#qr-47">Document and section cover (title) pages</a></li>
+ <li><a href="#qr-22">Set documents in columns</a></li>
+ <li><a href="#qr-21">Line numbering</a></li>
+ <li><a href="#qr-24">Initiate document processing</a></li>
+</ul>
+</div>
+<ul style="margin-top: 1.75em; margin-left: 0; padding-left: 0; list-style-type: none;">
+ <li><a href="#qr-42">Global print style changes after START</a></li>
+ <li><a href="#qr-43">Managing the docheader</a></li>
+ <li><a href="#qr-25">Epigraphs</a></li>
+ <li><a href="#qr-26">Headings</a></li>
+ <li><a href="#qr-30">Paragraphs</a></li>
+ <li><a href="#qr-31">Quotes (line for line quotes)</a> </li>
+ <li><a href="#qr-32">Blockquotes (cited passages of text)</a></li>
+ <li><a href="#qr-33">Code snippets (inserting bits of programming code)</a></li>
+ <li><a href="#qr-34">Author linebreaks (section breaks)</a></li>
+ <li><a href="#qr-35">Document termination string</a></li>
+ <li><a href="#qr-36">Footnotes</a></li>
+ <li><a href="#qr-37">Endnotes</a></li>
+ <li><a href="#qr-38">Margin notes</a></li>
+ <li><a href="#qr-49">Floats</a></li>
+ <li><a href="#qr-53">Images and graphics</a></li>
+ <li><a href="#qr-60">Shaded backgrounds, frames, page colour</a></li>
+ <li><a href="#qr-51">eqn support</a></li>
+ <li><a href="#qr-52">pic support</a></li>
+ <li><a href="#qr-58">grap support</a></li>
+ <li><a href="#qr-50">tbl support</a></li>
+ <li><a href="#qr-54">Captions and labels</a></li>
+ <li><a href="#qr-39">Bibliographic references</a></li>
+ <li><a href="#qr-40">Tables of contents</a></li>
+ <li><a href="#qr-55">Lists of Figures, Tables, and Equations</a></li>
+ <li><a href="#qr-41">Letter (correspondence) macros</a></li>
+ <li><a href="#qr-44">Managing page headers and footers</a></li>
+ <li><a href="#qr-45">Recto/verso page headers and footers</a></li>
+ <li><a href="#qr-46">Pagination</a></li>
+ <li><a href="#qr-48">Utilities</a></li>
+</ul>
+</div>
+
+<h2 class="docs">Quick reference guide</h2>
+
+<div style="display: inline-block; margin-top: 1em; margin-bottom: .5em; border-bottom: 2px solid #302419;"><kbd>TYPESETTING MACROS</kbd></div>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-1" class="quick-ref" colspan="2">
+<a href="typesetting.html#page-setup-intro">+++ Paper size, margins, line length</a></th>
+</tr>
+<tr>
+<td><a href="typesetting.html#paper">PAPER</a></td><td>-- set common paper sizes (letter, A4, etc)</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#pagewidth">PAGEWIDTH</a></td><td>-- set a custom page width</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#pagelength">PAGELENGTH</a></td><td>-- set a custom page length</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#page">PAGE</a></td><td>-- set explicit page dimensions and margins</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#t-margin">T_MARGIN</a></td><td>-- set a top margin</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#b-margin">B_MARGIN</a></td><td>-- set a bottom margin</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#l-margin">L_MARGIN</a></td><td>-- set a left margin (page offset)</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#r-margin">R_MARGIN</a></td><td>-- set a right margin</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#linelength">LL</a></td><td>-- set a line length</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr><th id="qr-2" class="quick-ref" colspan="2">
+<a href="typesetting.html#basic-params-intro">+++ Family, font, point size</a></th></tr>
+<tr>
+<td><a href="typesetting.html#family">FAMILY</a></td><td>-- set the family of type</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#font">FT</a></td><td>-- set the font style (roman, italic, etc)</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#fallback-font">FALLBACK_FONT</a></td><td>-- establish a fallback font (for missing fonts)</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#ps">PT_SIZE</a></td><td>-- set the point size</td>
+</tr>
+<tr>
+<td><a href="inlines.html#inline-size-mom">\*[SIZE n]</a></td><td>-- change the point size inline</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-3" class="quick-ref" colspan="2">
+<a href="typesetting.html#modifications-intro">+++ Font modifications</a></th>
+</tr>
+<tr><td style="padding-left: 0;">Pseudo italic</td></tr>
+<tr>
+<td><a href="typesetting.html#setslant">SETSLANT</a></td><td>-- set the degree of slant</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#slant-inline">\*[SLANT]</a></td><td>-- invoke pseudo italic inline</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#slant-inline">\*[SLANTX]</a></td><td>-- turn off pseudo italic inline</td>
+</tr>
+<tr><td style="padding-left: 0;">Pseudo bold</td></tr>
+<tr>
+<td><a href="typesetting.html#setbolder">SETBOLDER</a></td><td>-- set the amount of emboldening</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#bolder-inline">\*[BOLDER]</a></td><td>-- invoke pseudo bold inline</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#bolder-inline">\*[BOLDERX]</a></td><td>-- turn off pseudo bold inline</td>
+</tr>
+<tr><td style="padding-left: 0;">Pseudo condensed</td></tr>
+<tr>
+<td><a href="typesetting.html#condense">CONDENSE</a></td><td>-- set the amount to pseudo condense</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#cond-inline">\*[COND]</a></td><td>-- invoke pseudo condensing inline</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#cond-inline">\*[CONDX]</a></td><td>-- turn off pseudo condensing inline</td>
+</tr>
+<tr><td style="padding-left: 0;">Pseudo extended</td></tr>
+<tr>
+<td><a href="typesetting.html#extend">EXTEND</a></td><td>-- set the amount to pseudo extend</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#ext-inline">\*[EXT]</a></td><td>-- invoke pseudo extending inline</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#ext-inline">\*[EXTX]</a></td><td>-- turn off pseudo condensing inline</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-4" class="quick-ref" colspan="2">
+<a href="typesetting.html#leading">+++ Linespacing (leading)</a></th>
+</tr>
+<tr>
+<td><a href="typesetting.html#leading">LS</a></td><td>-- set the linespacing (leading)</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#autolead">AUTOLEAD</a></td><td>-- set the linespacing relative to the point size</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-5" class="quick-ref" colspan="2">
+<a href="typesetting.html#justification-intro">+++ Justification, quad, line-by-line setting, breaking lines</a></th>
+</tr>
+<tr>
+<td><a href="typesetting.html#justify">JUSTIFY</a></td><td>-- justify text to both margins</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#quad">QUAD</a></td><td>-- "justify" text left, centre, or right</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#lrc">LEFT</a></td><td>-- set line-by-line quad left</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#lrc">CENTER</a></td><td>-- set line-by-line quad centre</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#lrc">RIGHT</a></td><td>-- set line-by-line quad right</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#br">BR</a></td><td>-- break a justified line</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#spread">SPREAD</a></td><td>-- force justify a line</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#el">EL</a></td><td>-- break a line without advancing on the page</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-6" class="quick-ref" colspan="2">
+<a href="typesetting.html#hy">+++ Hyphenation</a></th>
+</tr>
+<tr>
+<td><a href="typesetting.html#hy">HY</a></td><td>-- automatic hyphenation on/off</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#hy-set">HY_SET</a></td><td>-- set automatic hyphenation parameters</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-7" class="quick-ref" colspan="2">
+<a href="typesetting.html#ws">+++ Word and sentence spacing</a></th>
+</tr>
+<tr>
+<td><a href="typesetting.html#ws">WS</a></td><td>-- set the minimum word space size</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#ss">SS</a></td><td>-- set the sentence space size</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-8" class="quick-ref" colspan="2">
+<a href="typesetting.html#kern">+++ Kerning, ligatures, smartquotes</a></th>
+</tr>
+<tr>
+<td><a href="typesetting.html#kern">KERN</a></td><td>-- automatic character pair kerning on/off</td>
+</tr>
+<tr>
+<td><a href="inlines.html#inline-kerning-mom">\*[BU n]</a></td><td>-- move characters pairs closer together inline</td>
+</tr>
+<tr>
+<td><a href="inlines.html#inline-kerning-mom">\*[FU n]</a></td><td>-- move character pairs further apart inline</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#rw">RW</a></td><td>-- uniformly tighten space between characters</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#ew">EW</a></td><td>-- uniformly loosen space between characters</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#br-at-line-kern">BR_AT_LINE_KERN</a></td><td>-- break previous line when RW or EW is invoked</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#ligatures">LIGATURES</a></td><td>-- automatic generation of ligatures on/off</td>
+</tr>
+<tr>
+<td><a href="goodies.html#smartquotes">SMARTQUOTES</a></td><td>-- smartquoting on/off</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-9" class="quick-ref" colspan="2">
+<a href="typesetting.html#aldrld-intro">+++ Horizontal and vertical movements, columnar setting</a></th>
+</tr>
+<tr>
+<td><a href="typesetting.html#ald">ALD</a></td><td>-- move downards on the page</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#rld">RLD</a></td><td>-- move upwards on the page</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#space">SPACE</a></td><td>-- insert space between lines on a page</td>
+</tr>
+<tr>
+<td><a href="inlines.html#down">\*[DOWN n]</a></td><td>-- temporarily move downwards in a line</td>
+</tr>
+<tr>
+<td><a href="inlines.html#up">\*[UP n]</a></td><td>-- temporarily move upwards in a line</td>
+</tr>
+<tr>
+<td><a href="inlines.html#fwd">\*[FWD n]</a></td><td>-- move forward in a line</td>
+</tr>
+<tr>
+<td><a href="inlines.html#bck">\*[BCK n]</a></td><td>-- move backwards in a line</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#mco">MCO</a></td><td>-- multiple columns on</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#mcr">MCR</a></td><td>-- recto vertical position of column start</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#mcx">MCX</a></td><td>-- multiple columns off, advance past longest column</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-10" class="quick-ref" colspan="2">
+<a href="typesetting.html#indents-intro">+++ Indents</a></th>
+</tr>
+<tr>
+<td><a href="typesetting.html#il">IL</a></td><td>-- set and turn on a left indent</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#ir">IR</a></td><td>-- set and turn on a right indent</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#ib">IB</a></td><td>-- set and turn on indents both left and right</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#iq">IQ</a></td><td>-- quit (exit) all indents</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#ti">TI</a></td><td>-- set and turn on a temporary (one line) indent</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#hi">HI</a></td><td>-- set and turn on a hanging indent</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#iq">ILX</a></td><td>-- left indents off</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#iq">IRX</a></td><td>-- right indents off</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#iq">IBX</a></td><td>-- both left and right indents off</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-11" class="quick-ref" colspan="2">
+<a href="typesetting.html#tabs-intro">+++ Tabs</a></th>
+</tr>
+<tr>
+<td><a href="typesetting.html#tab-set">TAB_SET</a></td><td>-- set up a typesetting tab</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#tab">TAB &lt;n&gt;</a></td><td>-- call tab &lt;n&gt;</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#tq">TQ</a></td><td>-- quit (exit) tabs</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#inline-st">\*[ST&lt;n&gt;]...</a></td><td>-- string tabs (mark tab positions inline)</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#inline-st">\*[ST&lt;n&gt;X]</a></td>
+</tr>
+<tr>
+<td><a href="typesetting.html#tn">TN</a></td><td>-- move to tab&lt;n+1&gt; without advancing on the page</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#st">ST</a></td><td>-- set quad/fill for string tabs</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-12" class="quick-ref" colspan="2">
+<a href="goodies.html#underscore">+++ Underscoring, underlining</a></th>
+</tr>
+<tr>
+<td><a href="goodies.html#underscore">UNDERSCORE</a></td><td>-- underscore</td>
+</tr>
+<tr>
+<td><a href="goodies.html#underscore2">UNDERSCORE2</a></td><td>-- double underscore</td>
+</tr>
+<tr>
+<td><a href="goodies.html#underline">UNDERLINE</a></td><td>-- underline (fixed width fonts only)</td>
+</tr>
+<tr>
+<td><a href="goodies.html#ul">\*[UL]...</a></td><td>-- invoke underlining inline (fixed width fonts only)</td>
+</tr>
+<tr>
+<td><a href="goodies.html#ul">\*[ULX]</a></td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-13" class="quick-ref" colspan="2">
+<a href="goodies.html#sup">+++ Superscipts</a></th>
+</tr>
+<tr>
+<td><a href="goodies.html#sup">\*[SUP]...\*[SUPX]</a></td><td>-- superscript</td>
+</tr>
+<tr>
+<td><a href="goodies.html#sup">\*[CONDSUP]...\*[CONDSUPX]</a></td><td>-- pseudo-condensed superscript</td>
+</tr>
+<tr>
+<td><a href="goodies.html#sup">\*[EXTSUP]...\*[EXTSUPX]</a></td><td>-- pseudo extended supercript</td>
+</tr>
+<tr>
+<td><a href="goodies.html#sup-raise">SUPERSCRIPT_RAISE_AMOUNT</a></td><td>-- vertical offset of superscripts</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-14" class="quick-ref" colspan="2">
+<a href="docelement.html#list-intro">+++ Nested lists</a></th>
+</tr>
+<tr>
+<td><a href="docelement.html#list">LIST</a></td><td>-- begin a list</td>
+</tr>
+<tr>
+<td><a href="docelement.html#item">ITEM</a></td><td>-- begin an item in a list</td>
+</tr>
+<tr>
+<td><a href="docelement.html#shift-list">SHIFT_LIST</a></td><td>-- change the indent of a list</td>
+</tr>
+<tr>
+<td><a href="docelement.html#reset-list">RESET_LIST</a></td><td>-- clear and reset a list&#8217;s enumerator</td>
+</tr>
+<tr>
+<td><a href="docelement.html#pad-list-digits">PAD_LIST_DIGITS</a></td><td>-- reserve space for digits</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-15" class="quick-ref" colspan="2">
+<a href="color.html#color-intro">+++ Colour</a></th>
+</tr>
+<tr>
+<td><a href="color.html#newcolor">NEWCOLOR</a></td><td>-- initialize (define) a colour</td>
+</tr>
+<tr>
+<td><a href="color.html#color">COLOR</a></td><td>-- begin using an initialized colour</td>
+</tr>
+<tr>
+<td><a href="color.html#xcolor">XCOLOR</a></td><td>-- initialize a "named" X colour</td>
+</tr>
+<tr>
+<td><a href="color.html#color-inline">\*[&lt;colorname&gt;]</a></td><td>-- begin using an initialized colour inline</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-16" class="quick-ref" colspan="2">
+<a href="goodies.html#dropcap">+++ Dropcaps</a></th>
+</tr>
+<tr>
+<td><a href="goodies.html#dropcap">DROPCAP</a></td><td>-- set a dropcap</td>
+</tr>
+<tr>
+<td><a href="goodies.html#dropcap-family">DROPCAP_FAMILY</a></td><td>-- set a dropcap&#8217;s family</td>
+</tr>
+<tr>
+<td><a href="goodies.html#dropcap-font">DROPCAP_FONT</a></td><td>-- set a dropcap&#8217;s font style</td>
+</tr>
+<tr>
+<td><a href="goodies.html#dropcap-color">DROPCAP_COLOR</a></td><td>-- set a dropcap&#8217;s colour</td>
+</tr>
+<tr>
+<td><a href="goodies.html#dropcap-adjust">DROPCAP_ADJUST</a></td><td>-- adjust size of a dropcap</td>
+</tr>
+<tr>
+<td><a href="goodies.html#dropcap-gutter">DROPCAP_GUTTER</a></td><td>-- adjust space between a dropcap and regular text</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-56" class="quick-ref" colspan="2">
+<a href="typesetting.html#smallcaps">+++ Smallcaps</a></th>
+</tr>
+<tr>
+<td><a href="typesetting.html#smallcaps">SMALLCAPS</a></td>
+</tr>
+<tr>
+<td><a href="typesetting.html#smallcaps-style">SMALLCAPS_STYLE</a></td>
+</tr>
+</table>
+
+
+<table class="quick-ref">
+<tr>
+<th id="qr-17" class="quick-ref" colspan="2">+++ Utilities</th>
+</tr>
+<tr>
+<td><a href="goodies.html#alias">ALIAS</a></td><td>-- give a macro a new name</td>
+</tr>
+<tr>
+<td><a href="goodies.html#caps">CAPS</a></td><td>-- set type all caps</td>
+</tr>
+<tr>
+<td><a href="goodies.html#silent">COMMENT</a></td><td>-- silently embed comments in a document</td>
+</tr>
+<tr>
+<td><a href="goodies.html#esc-char">ESC_CHAR</a></td><td>-- change the default escape character</td>
+</tr>
+<tr>
+<td><a href="goodies.html#leader">\*[LEADER]</a></td><td>-- insert leaders at the end of a line</td>
+</tr>
+<tr>
+<td><a href="goodies.html#leader-character">LEADER_CHARACTER</a></td><td>-- change the character used for leaders</td>
+</tr>
+<tr>
+<td><a href="typesetting.html#newpage">NEWPAGE</a></td><td>-- break to a new page</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#newslide">NEWSLIDE</a></td><td>-- break to a new slide</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#pause">PAUSE</a></td><td>-- pause slide presentation</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#transition">TRANSITION</a></td><td>-- transition effect for slides</td>
+</tr>
+<tr>
+<td><a href="goodies.html#pad">PAD</a></td><td>-- insert equalized whitespace into a line</td>
+</tr>
+<tr>
+<td><a href="goodies.html#pad-marker">PAD_MARKER</a></td><td>-- change the pad marker</td>
+</tr>
+<tr>
+<td><a href="inlines.html#inline-rule-mom">\*[RULE]</a></td><td>-- draw a full measure rule</td>
+</tr>
+<tr>
+<td><a href="goodies.html#sizespecs">SIZESPECS</a></td><td>-- cap-height, x-height, descender depth</td>
+</tr>
+<tr>
+<td><a href="goodies.html#silent">SILENT</a></td><td>-- output processing off or on</td>
+</tr>
+<tr>
+<td><a href="goodies.html#trap">TRAP</a></td><td>-- enable or disable page position traps</td>
+</tr>
+<tr>
+<td><a href="goodies.html#left-hang">LEFT_HANG / \*[HANG]</a></td><td>-- hanging punctuation</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-18" class="quick-ref" colspan="2">
+<a href="graphical.html#intro-graphical">+++ Graphical objects and images</a></th>
+</tr>
+<tr>
+<td><a href="graphical.html#drh">DRH</a></td><td>-- draw a horizontal rule</td>
+</tr>
+<tr>
+<td><a href="graphical.html#drv">DRV</a></td><td>-- draw a vertical rule</td>
+</tr>
+<tr>
+<td><a href="graphical.html#dbx">DBX</a></td><td>-- draw a box</td>
+</tr>
+<tr>
+<td><a href="graphical.html#dcl">DCL</a></td><td>-- draw a circle (ellipse)</td>
+</tr>
+<tr>
+<td><a href="inlines.html#rule-weight">RULE_WEIGHT</a></td><td>-- set weight of rules drawn with \*[RULE]</td>
+</tr>
+<tr>
+<td><a href="images.html#pdf-image">PDF_IMAGE</a></td><td>-- insert a PDF image</td>
+</tr>
+<tr>
+<td><a href="images.html#pspic">PSPIC</a></td><td>-- insert a PostScript image</td>
+</tr>
+</table>
+
+<div style="display: inline-block; margin-top: 1em; margin-bottom: .5em; border-bottom: 2px solid #302419;"><kbd>DOCUMENT PROCESSING MACROS</kbd></div>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-19" class="quick-ref" colspan="2">
+<a href="docprocessing.html#reference-macros">+++ Reference macros</a></th>
+</tr>
+<tr>
+<td><a href="docprocessing.html#title">TITLE</a></td><td>-- document title</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#doc-title">DOCTITLE</a></td><td>-- document title (if different from TITLE)</td>
+</tr>
+<tr>
+<td><a href="docelement.html#endnote-title">ENDNOTE_TITLE</a></td><td>-- document/chapter id string for endnotes</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#chapter">CHAPTER</a></td><td>-- chapter number</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#chapter-title">CHAPTER_TITLE</a></td><td>-- chapter title</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#chapter-string">CHAPTER_STRING</a></td><td>-- what to use in place of &#8220;Chapter&#8221;</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#subtitle">SUBTITLE</a></td><td>-- document subtitle</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#author">AUTHOR</a></td><td>-- document author(s)</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#covertitle">DOC_COVERTITLE</a></td><td>-- document title cover</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#covertitle">COVERTITLE</a></td><td>-- section cover title</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#copyright">COPYRIGHT</a></td><td>-- copyright</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#misc">MISC</a></td><td>-- miscellaneous cover information</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#draft">DRAFT</a></td><td>-- document&#8217;s draft number</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#draft-string">DRAFT_STRING</a></td><td>-- what to use in place of &#8220;Draft&#8221;</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#revision">REVISION</a></td><td>-- document&#8217;s revision number</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#revision-string">REVISION_STRING</a></td><td>-- what to use in place of &#8220;Revision&#8221;</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#pdftitle">PDF_TITLE</a></td><td>-- PDF viewer window title</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#toc-heading">TOC_HEADING</a></td><td>-- non-pagenumbered line inserted into the TOC</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-20" class="quick-ref" colspan="2">
+<a href="docprocessing.html#docstyle-macros">+++ General document formatting directives</a></th>
+</tr>
+<tr>
+<td><a href="docprocessing.html#doctype">DOCTYPE</a></td><td>-- general document type</td>
+</tr>
+<tr>
+<td id="qr-59"><a href="docprocessing.html#slides">DOCTYPE SLIDES</a></td><td>-- create slide presentation</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#copystyle">COPYSTYLE</a></td><td>-- draft or final copy</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#printstyle">PRINTSTYLE</a></td><td>-- typeset or &#8220;typewritten&#8221;</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-21" class="quick-ref" colspan="2">
+<a href="docelement.html#number-lines-intro">+++ Line numbering</a></th>
+</tr>
+<tr>
+<td><a href="docelement.html#number-lines">NUMBER_LINES</a></td><td>-- automatic line numbering on/off</td>
+</tr>
+<tr>
+<td><a href="docelement.html#number-quote-lines">NUMBER_QUOTE_LINES</a></td><td>-- numbering of QUOTE lines on/off</td>
+</tr>
+<tr>
+<td><a href="docelement.html#number-blockquote-lines">NUMBER_BLOCKQUOTE_LINES</a></td><td>-- numbering of BLOCKQUOTE lines on/off</td>
+</tr>
+<tr>
+<td><a href="docelement.html#number-lines-control">Control macros</a></td><td></td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-22" class="quick-ref" colspan="2">
+<a href="docprocessing.html#columns-intro">+++ Set documents in columns</a></th>
+</tr>
+<tr>
+<td><a href="docprocessing.html#columns">COLUMNS</a></td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#col-next">COL_NEXT</a></td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#col-break">COL_BREAK</a></td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-23" class="quick-ref" colspan="2">+++ TYPEWRITE control macros</th>
+</tr>
+<tr>
+<td><a href="docprocessing.html#typewriter-family">TYPEWRITER_FAMILY</a></td><td>alternative to Courier</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#typewriter-size">TYPEWRITER_SIZE</a></td><td>point size of typewriter font</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#typewriter-underlining">UNDERLINE_ITALIC</a></td><td>-- underlining of italics on</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#printstyle-italics">UNDERLINE_QUOTES</a></td><td>-- underlining of QUOTEs on/off</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#printstyle-italics">ITALIC_MEANS_ITALIC</a></td><td>-- use real italics (not underlining)</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#typewriter-underlining">UNDERLINE_SLANT</a></td><td>-- underlining of pseudo-italics on</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#typewriter-underlining">SLANT_MEANS_SLANT</a></td><td>-- use pseudo italics (not underlining)</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-24" class="quick-ref" colspan="2">
+<a href="docprocessing.html#start-macro">+++ Initiate document processing</a></th>
+</tr>
+<tr>
+<td><a href="docprocessing.html#start">START</a></td><td>-- begin document processing</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-25" class="quick-ref" colspan="2">
+<a href="docelement.html#epigraph-intro">+++ Epigraphs</a></th>
+</tr>
+<tr>
+<td><a href="docelement.html#epigraph">EPIGRAPH</a></td><td>-- set an epigraph underneath the docheader</td>
+</tr>
+<tr>
+<td><a href="docelement.html#epigraph-control">Control macros</a></td><td>-- change default style of epigraphs</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-26" class="quick-ref" colspan="2">
+<a href="docelement.html#heading-intro">+++ Headings</a></th>
+</tr>
+<tr>
+<td><a href="docelement.html#heading">HEADING</a></td><td>-- hierarchical headings</td>
+</tr>
+<tr>
+<td><a href="docelement.html#heading-control">Control macros</a></td><td>-- style heading levels</td>
+</tr>
+<tr>
+<td><a href="docelement.html#heading-style">&nbsp;HEADING_STYLE</a></td><td>-- set style parameters for heading levels</td>
+</tr>
+<tr>
+<td><a href="docelement.html#prefix-chapter-number">&nbsp;PREFIX_CHAPTER_NUMBER</a></td><td>-- add chapter number to heading numbering</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-30" class="quick-ref" colspan="2">
+<a href="docelement.html#pp-intro">+++ Paragraphs</a></th>
+</tr>
+<tr>
+<td><a href="docelement.html#pp">PP</a></td><td>-- set a paragraph</td>
+</tr>
+<tr>
+<td><a href="docelement.html#pp-control">Control macros</a></td><td>-- managing paragraph style concerns</td>
+</tr>
+<tr>
+<td><a href="docelement.html#pp-font">&nbsp;PP_FONT</a></td><td>-- globally change font of regular paragraphs</td>
+</tr>
+<tr>
+<td><a href="docelement.html#para-indent">&nbsp;PARA_INDENT</a></td><td>-- set the paragraph first-line indent</td>
+</tr>
+<tr>
+<td><a href="docelement.html#para-indent-first">&nbsp;INDENT_FIRST_PARAS</a></td><td>-- indenting of paragraph first-lines on/off</td>
+</tr>
+<tr>
+<td><a href="docelement.html#pp-space">&nbsp;PARA_SPACE</a></td><td>-- linespace between paragraphs on/off</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-31" class="quick-ref" colspan="2">
+<a href="docelement.html#quote-intro">+++ Quotes (line for line verbatim quotes)</a></th>
+</tr>
+<tr>
+<td><a href="docelement.html#quote">QUOTE</a></td><td>-- set quoted text line for line </td>
+</tr>
+<tr>
+<td><a href="docelement.html#quote-general">Control macros</a></td><td>-- change default style of quotes</td>
+</tr>
+<tr>
+<td><a href="docelement.html#always-fullspace-quotes">&nbsp;ALWAYS_FULLSPACE_QUOTES</a></td><td>-- control vertical space around quotes</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-32" class="quick-ref" colspan="2">
+<a href="docelement.html#blockquote-intro">+++ Blockquotes (cited passages of text)</a></th>
+</tr>
+<tr>
+<td><a href="docelement.html#blockquote">BLOCKQUOTE</a></td><td>-- set passages of cited text</td>
+</tr>
+<tr>
+<td><a href="docelement.html#blockquote-general">Control macros</a></td><td>-- change default blockquote style</td>
+</tr>
+<tr>
+<td><a href="docelement.html#always-fullspace-quotes">&nbsp;ALWAYS_FULLSPACE_BLOCKQUOTES</a></td><td>-- control vertical spacing</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-49" class="quick-ref" colspan="2">
+<a href="images.html#floats-intro">+++ Floats</a></th>
+</tr>
+<tr>
+<td style="vertical-align: top"><a href="images.html#float">FLOAT</a></td><td>-- keep blocks of input together, output on next page
+<br/>
+&nbsp;&nbsp;&nbsp;if necessary</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-53" class="quick-ref" colspan="2">
+<a href="images.html#images-intro">+++ Images and graphics</a></th>
+</tr>
+<tr>
+<td style="vertical-align: top"><a href="images.html#pdf">PDF_IMAGE</a></td><td>-- inserting pdf images</td>
+</tr>
+<tr>
+<td style="vertical-align: top"><a href="images.html#pdf-image-frame">&nbsp;PDF_IMAGE_FRAME</a></td><td>-- set parameters for pdf image frames</td>
+</tr>
+<tr>
+<td style="vertical-align: top"><a href="images.html#pspic">PSPIC</a></td><td>-- inserting PostScript images</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-60" class="quick-ref" colspan="2">
+<a href="images.html#box-intro">+++ Shaded backgrounds, frames, page colour</a></th>
+</tr>
+<tr>
+<td style="vertical-align: top"><a href="images.html#box-macro">BOX</a>&nbsp;-- shaded backgrounds and frames</td>
+</tr>
+<tr>
+<td style="vertical-align: top"><a href="images.html#page-color">PAGE_COLOR</a></td>
+</tr>
+
+</table>
+<table class="quick-ref">
+<tr>
+<th id="qr-51" class="quick-ref" colspan="2">
+<a href="images.html#eqn">+++ eqn support</a></th>
+</tr>
+<tr>
+<td><a href="images.html#eq-en">EQ</a></td><td>-- begin an eqn block</td>
+</tr>
+<tr>
+<td><a href="images.html#eq-en">EN</a></td><td>-- end an eqn block</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-52" class="quick-ref" colspan="2">
+<a href="images.html#pic">+++ pic support</a></th>
+</tr>
+<tr>
+<td><a href="images.html#ps-pe">PS</a></td><td>-- begin a pic block</td>
+</tr>
+<tr>
+<td><a href="images.html#ps-pe">PE</a></td><td>-- end a pic block</td>
+</tr>
+<tr>
+<td><a href="images.html#pic-text-style">PIC_TEXT_STYLE</a></td><td>-- set style for pic text</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-58" class="quick-ref" colspan="2">
+<a href="images.html#grap">+++ grap support</a></th>
+</tr>
+<tr>
+<td><a href="images.html#grap">G1</a></td><td>-- begin a grap block</td>
+</tr>
+<tr>
+<td><a href="images.html#grap">G2</a></td><td>-- end a grap block</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-50" class="quick-ref" colspan="2">
+<a href="images.html#tbl">+++ tbl support</a></th>
+</tr>
+<tr>
+<td><a href="images.html#ts-te">TS</a></td><td>-- begin a tbl block</td>
+</tr>
+<tr>
+<td><a href="images.html#ts-te">TH</a></td><td>-- running table header (after TS H)</td>
+</tr>
+<tr>
+<td><a href="images.html#ts-te">TE</a></td><td>-- end tbl block</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-54" class="quick-ref" colspan="2">
+<a href="images.html#captions-and-labels">+++ Captions and labels</a></th>
+</tr>
+<tr>
+<td><a href="images.html#autolabel">AUTOLABEL</a></td><td>-- auto-label figures, tables, equations</td>
+</tr>
+<tr>
+<td><a href="images.html#set-autolabel">SET_AUTOLABEL</a></td><td>-- set or reset autolabel numbers</td>
+</tr>
+<tr>
+<td><a href="images.html#caption-after-label">CAPTION_AFTER_LABEL</a></td><td>-- place captions after labels</td>
+</tr>
+<tr>
+<td><a href="images.html#mla">MLA</a></td><td>-- MLA-style labelling and captioning</td>
+</tr>
+<tr>
+<td><a href="images.html#caption">CAPTION</a></td><td>-- add a caption to a float or (block)quote</td>
+</tr>
+<tr>
+<td><a href="images.html#label">LABEL</a></td><td>-- add a label to a float or (block)quote</td>
+</tr>
+<tr>
+<td><a href="images.html#captions-labels-sources">CAPTIONS</a></td><td>-- set style for captions</td>
+</tr>
+<tr>
+<td><a href="images.html#captions-labels-sources">LABELS</a></td><td>-- set style for labels</td>
+</tr>
+<tr>
+<td><a href="images.html#captions-labels-sources">SOURCES</a></td><td>-- set style for sources (tbl only)</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-55" class="quick-ref" colspan="2">
+<a href="images.html#lists-of">+++ Lists of Figures, Tables, and Equations</a></th>
+</tr>
+<tr>
+<td><a href="images.html#lists-macros">LIST_OF_FIGURES</a></td><td>-- generate a List of Figures</td>
+</tr>
+<tr>
+<td><a href="images.html#lists-macros">LIST_OF_TABLES</a></td><td>-- generate a List of Tables</td>
+</tr>
+<tr>
+<td><a href="images.html#lists-macros">LIST_OF_EQUATIONS</a></td><td>-- generate a List of Equations</td>
+</tr>
+<tr>
+<td><a href="images.html#lists-style">LISTS_STYLE</a></td><td>-- set style parameters for Lists</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-33" class="quick-ref" colspan="2">
+<a href="docelement.html#code-intro">+++ Code snippets</a></th>
+</tr>
+<tr>
+<td><a href="docelement.html#code">CODE</a></td><td>-- set a code snippet</td>
+</tr>
+<tr>
+<td><a href="docelement.html#code-control">Control macros</a></td><td>-- change default style of code snippets</td>
+</tr>
+<tr>
+<td><a href="docelement.html#code-general">&nbsp;General</a></td><td>-- family, font, and colour</td>
+</tr>
+<tr>
+<td><a href="docelement.html#code-size">&nbsp;CODE_SIZE</a></td><td>-- code size as a percentage of prevailing text</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-34" class="quick-ref" colspan="2">
+<a href="docelement.html#linebreak-intro">+++ Author linebreaks (section breaks)</a></th>
+</tr>
+<tr>
+<td><a href="docelement.html#linebreak">LINEBREAK</a></td><td>-- insert an author linebreak (section break)</td>
+</tr>
+<tr>
+<td><a href="docelement.html#linebreak-control">Control macros</a></td><td>-- change default style of linebreaks</td>
+</tr>
+<tr>
+<td><a href="docelement.html#linebreak-char">&nbsp;LINEBREAK_CHAR</a></td><td>-- character to use for author linebreaks</td>
+</tr>
+<tr>
+<td><a href="docelement.html#linebreak-color">&nbsp;LINEBREAK_COLOR</a></td><td>-- colour of author linebreak character</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-35" class="quick-ref" colspan="2">
+<a href="docelement.html#finis-intro">+++ Document termination string</a></th>
+</tr>
+<tr>
+<td><a href="docelement.html#finis">FINIS</a></td><td>-- insert a document termination string</td>
+</tr>
+<tr>
+<td><a href="docelement.html#finis-control">Control macros</a></td><td>-- change default style finis string</td>
+</tr>
+<tr>
+<td><a href="docelement.html#finis-string">&nbsp;FINIS_STRING</a></td><td>-- set the document termination string</td>
+</tr>
+<tr>
+<td><a href="docelement.html#finis-string-caps">&nbsp;FINIS_STRING_CAPS</a></td><td>-- capitalization of termination string</td>
+</tr>
+<tr>
+<td><a href="docelement.html#finis-color">&nbsp;FINIS_COLOR</a></td><td>-- set the document termination string colour</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-36" class="quick-ref" colspan="2">
+<a href="docelement.html#footnote-intro">+++ Footnotes</a></th>
+</tr>
+<tr>
+<td><a href="docelement.html#footnote">FOOTNOTE</a></td><td>-- set a footnote</td>
+</tr>
+<tr>
+<td><a href="docelement.html#footnote-general">Control macros</a></td><td>-- change default style of footnotes</td>
+</tr>
+<tr>
+<td><a href="docelement.html#footnote-markers">&nbsp;FOOTNOTE_MARKERS</a></td><td>-- footnote markers on/off</td>
+</tr>
+<tr>
+<td><a href="docelement.html#footnote-marker-style">&nbsp;FOOTNOTE_MARKER_STYLE</a></td><td>-- type of footnote marker to use</td>
+</tr>
+<tr>
+<td><a href="docelement.html#reset-footnote-number">&nbsp;RESET_FOOTNOTE_NUMBER</a></td><td>-- reset footnote numbering</td>
+</tr>
+<tr>
+<td><a href="docelement.html#footnote-rule">&nbsp;FOOTNOTE_RULE</a></td><td>-- footnote separator rule on/off</td>
+</tr>
+<tr>
+<td><a href="docelement.html#footnote-rule-adj">&nbsp;FOOTNOTE_RULE_ADJ</a></td><td>-- adjust position of footnote rule</td>
+</tr>
+<tr>
+<td><a href="docelement.html#footnote-rule-length">&nbsp;FOOTNOTE_RULE_LENGTH</a></td><td>-- adjust length of footnote rule</td>
+</tr>
+<tr>
+<td style="vertical-align: top;"><a href="docelement.html#footnotes-run-on">&nbsp;FOOTNOTES_RUN_ON</a></td>
+ <td>-- instruct footnotes to be continuous</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-37" class="quick-ref" colspan="2">
+<a href="docelement.html#endnote-intro">+++ Endnotes</a></th>
+</tr>
+<tr>
+<td><a href="docelement.html#endnote">ENDNOTE</a></td><td>-- set an endnote</td>
+</tr>
+<tr>
+<td style="vertical-align: top;"><a href="docelement.html#en-mark">\*[EN-MARK]</a></td>
+ <td>-- mark initial line of a range of line numbers<br />
+&nbsp;&nbsp;&nbsp;(for use with line numbered endnotes)</td>
+</tr>
+<tr>
+<td><a href="docelement.html#endnotes">ENDNOTES</a></td><td>-- output endnotes</td>
+</tr>
+<tr>
+<td><a href="docelement.html#endnote-control">Control macros</a></td><td></td>
+</tr>
+</table>
+
+<table class="quick-ref" style="margin-top: -.5em; margin-left: 1em;">
+<tr>
+<td><a href="docelement.html#endnotes-general">General style control</a></td>
+</tr>
+<tr>
+<td><a href="docelement.html#endnotes-pagination">Pagination</a></td>
+</tr>
+<tr>
+<td><a href="docelement.html#endnotes-header-control">Header/footer control</a></td>
+</tr>
+<tr>
+<td><a href="docelement.html#endnotes-header-string-control">Title control</a></td>
+</tr>
+<tr>
+<td><a href="docelement.html#endnotes-doc-title">Document/section identification control</a></td>
+</tr>
+<tr>
+<td><a href="docelement.html#endnotes-numbering">Identification style</a></td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-38" class="quick-ref" colspan="2">
+<a href="docelement.html#margin-notes-intro">+++ Margin notes</a></th>
+</tr>
+<tr>
+<td><a href="docelement.html#mn-init">MN_INIT</a></td><td>-- initialize margin notes</td>
+</tr>
+<tr>
+<td><a href="docelement.html#mn">MN</a></td><td>-- set a margin note</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-39" class="quick-ref" colspan="2">
+<a href="refer.html#intro-ref">+++ Bibliographic references</a></th>
+</tr>
+<tr>
+<td><a href="refer.html#ref">REF</a></td><td>-- begin a reference</td>
+</tr>
+<tr>
+<td><a href="refer.html#footnote-refs">FOOTNOTE_REFS</a></td><td>-- place references in footnotes</td>
+</tr>
+<tr>
+<td><a href="refer.html#endnote-refs">ENDNOTE_REFS</a></td><td>-- place references in endnotes</td>
+</tr>
+<tr>
+<td><a href="refer.html#bracket-refs">REF( / REF)</a></td><td>-- put parentheses around embedded references</td>
+</tr>
+<tr>
+<td><a href="refer.html#bracket-refs">REF[ / REF]</a></td><td>-- put square brackets around embedded references</td>
+</tr>
+<tr>
+<td><a href="refer.html#bracket-refs">REF{ / REF}</a></td><td>-- put curly braces around embedded references</td>
+</tr>
+<tr>
+<td><a href="refer.html#bibliography">BIBLIOGRAPHY</a></td><td>-- output a bibliography</td>
+</tr>
+<tr>
+<td><a href="refer.html#biblio-control">Control macros</a></td>
+</tr>
+</table>
+
+<table class="quick-ref" style="margin-top: -.5em; margin-left: 1em;">
+<tr>
+<td><a href="refer.html#bibliography-type">BIBLIOGRAPHY_TYPE</a>&nbsp;-- "plain" or enumerated list</td>
+</tr>
+<tr>
+<td><a href="refer.html#biblio-general">General style control</a></td>
+</tr>
+<tr>
+<td><a href="refer.html#biblio-header-control">Header/footer control</a></td>
+</tr>
+<tr>
+<td><a href="refer.html#biblio-main-title">Main head control</a></td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-40" class="quick-ref" colspan="2">
+<a href="tables-of-contents.html">+++ Tables of contents</a></th>
+</tr>
+<tr>
+<td><a href="tables-of-contents.html#toc">TOC</a></td><td>-- output a table of contents</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#no-toc-entry">NO_TOC_ENTRY</a></td><td>-- omit a document section from the TOC</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#toc-heading">TOC_HEADING</a></td><td>-- insert a heading into the TOC</td>
+</tr>
+<tr>
+<td><a href="tables-of-contents.html#index-toc-control">Control macros</a></td>
+</tr>
+</table>
+
+<table class="quick-ref" style="margin-top: -.5em; margin-left: 1em;">
+<tr>
+<td><a href="tables-of-contents.html#toc-general">General style control</a></td>
+</tr>
+<tr>
+<td><a href="tables-of-contents.html#toc-pagenumbering">Page numbering</a></td>
+</tr>
+<tr>
+<td><a href="tables-of-contents.html#toc-header">Header string control</a></td>
+</tr>
+<tr>
+<td><a href="tables-of-contents.html#toc-style">Entries and reference page numbers style control</a></td>
+</tr>
+<tr>
+<td><a href="tables-of-contents.html#toc-title-style">TOC_TITLE_STYLE</a></td>
+</tr>
+<tr>
+<td><a href="tables-of-contents.html#toc-entry-style">TOC_ENTRY_STYLE</a></td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#toc-heading-style">TOC_HEADING_STYLE</a></td>
+</tr>
+<tr>
+<td><a href="tables-of-contents.html#toc-additional">Additional table of contents control macros</a></td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-41" class="quick-ref" colspan="2">
+<a href="letters.html">+++ Letter (correspondence) macros</a></th>
+</tr>
+<tr>
+<td><a href="letters.html#date">DATE</a></td><td>-- letter&#8217;s date</td>
+</tr>
+<tr>
+<td><a href="letters.html#from">FROM</a></td><td>-- letter&#8217;s addresser</td>
+</tr>
+<tr>
+<td><a href="letters.html#to">TO</a></td><td>-- letter&#8217;s addressee</td>
+</tr>
+<tr>
+<td><a href="letters.html#greeting">GREETING</a></td><td>-- letter&#8217;s salutation</td>
+</tr>
+<tr>
+<td><a href="letters.html#closing">CLOSING</a></td><td>-- letter&#8217;s closing salutation</td>
+</tr>
+<tr>
+<td><a href="letters.html#closing-indent">CLOSING_INDENT</a></td><td>-- indentation of the closing salutation</td>
+</tr>
+<tr>
+<td><a href="letters.html#signature-space">SIGNATURE_SPACE</a></td><td>-- room to leave for the signature</td>
+</tr>
+<tr>
+<td><a href="letters.html#no-suite">NO_SUITE</a></td><td>-- printing of &quot;next page number&quot; off or on</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-42" class="quick-ref" colspan="2">
+<a href="docprocessing.html#style-after-start">+++ Changing global print style parameters after START</a></th>
+</tr>
+<tr>
+<td><a href="docprocessing.html#doc-left-margin">DOC_LEFT_MARGIN</a></td><td>-- left margin of everything on the page</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#doc-right-margin">DOC_RIGHT_MARGIN</a></td><td>-- right margin of everything on the page</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#doc-line-length">DOC_LINE_LENGTH</a></td><td>-- document&#8217;s base line length</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#doc-family">DOC_FAMILY</a></td><td>-- document&#8217;s base family</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#doc-pt-size">DOC_PT_SIZE</a></td><td>-- document&#8217;s base point size</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#doc-lead">DOC_LEAD</a></td><td>-- document&#8217;s base lead</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#doc-quad">DOC_QUAD</a></td><td>-- document&#8217;s base quad directions</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-43" class="quick-ref" colspan="2">
+<a href="docprocessing.html#docheader">+++ Managing a document&#8217;s first-page header</a></th>
+</tr>
+<tr>
+<td><a href="docprocessing.html#docheader">DOCHEADER</a></td><td>-- document first-page header on/off</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#index-docheader-control">Control macros</a></td><td>-- change default style of docheader elements</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-44" class="quick-ref" colspan="2">
+<a href="headfootpage.html#headfoot-management">+++ Managing page headers and footers</a></th>
+</tr>
+<tr>
+<td><a href="headfootpage.html#headers">HEADERS</a></td><td>-- page headers on/off</td>
+</tr>
+<tr>
+<td><a href="headfootpage.html#footers">FOOTERS</a></td><td>-- page footers on/off</td>
+</tr>
+<tr>
+<td style="vertical-align: top;"><a href="headfootpage.html#headers-and-footers">HEADERS_AND_FOOTERS</a></td><td>-- enable generation of both headers and<br/>
+&nbsp;&nbsp;&nbsp;footers</td>
+</tr>
+<tr>
+<td><a href="headfootpage.html#headfoot-control">Control macros</a></td>
+</tr>
+</table>
+
+<table class="quick-ref" style="margin-top: -.5em; margin-left: 1em;">
+<tr>
+<td><a href="headfootpage.html#hdrftr-strings">Strings</a></td><td>-- left-right-center strings</td>
+</tr>
+<tr>
+<td><a href="headfootpage.html#hdrftr-style">Style</a></td><td>-- change defaults for headers and/or footers</td>
+</tr>
+<tr>
+<td><a href="headfootpage.html#hdrftr-style-global">Global</a></td><td>-- global style changes</td>
+</tr>
+<tr>
+<td><a href="headfootpage.html#hdrftr-style-part">Part-by-part</a></td><td>-- part-by-part style changes</td>
+</tr>
+<tr>
+<td><a href="headfootpage.html#vertical-spacing">Vertical placement</a></td><td>-- adjust position of headers and/or footers</td>
+</tr>
+<tr>
+<td><a href="headfootpage.html#hdrftr-separator">Separator rule</a></td><td>-- manage the header/footer separator rule</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-45" class="quick-ref" colspan="2">
+<a href="rectoverso.html">+++ Recto/verso page headers and footers</a></th>
+</tr>
+<tr>
+<td><a href="rectoverso.html#recto-verso">RECTO_VERSO</a></td><td>-- recto/verso headers and/or footers on/off</td>
+</tr>
+<tr>
+<td><a href="rectoverso.html#force-recto">FORCE_RECTO</a></td><td>-- insert blank pages so chapters start recto</td>
+</tr>
+<tr>
+<td><a href="rectoverso.html#switch-hdrftr">SWITCH_HEADERS</a></td><td>-- switch recto or verso header</td>
+</tr>
+<tr>
+<td><a href="rectoverso.html#switch-hdrftr">SWITCH_FOOTERS</a></td><td>-- switch recto or verso footer</td>
+</tr>
+<tr>
+<td><a href="headfootpage.html#hdrftr-recto">HEADER_RECTO</a></td><td>-- string that constitutes a recto header</td>
+</tr>
+<tr>
+<td><a href="headfootpage.html#hdrftr-verso">HEADER_VERSO</a></td><td>-- string that constitutes a verso header</td>
+</tr>
+<tr>
+<td><a href="headfootpage.html#hdrftr-recto">FOOTER_RECTO</a></td><td>-- string that constitutes a recto footer</td>
+</tr>
+<tr>
+<td><a href="headfootpage.html#hdrftr-verso">FOOTER_VERSO</a></td><td>-- string that constitutes a recto footer</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-46" class="quick-ref" colspan="2">
+<a href="headfootpage.html#pagination-intro">+++ Pagination</a></th>
+</tr>
+<tr>
+<td><a href="headfootpage.html#paginate">PAGINATE</a></td><td>-- pagination on/off</td>
+</tr>
+<tr>
+<td><a href="headfootpage.html#index-paginate-control">Control macros</a></td><td>-- change default style for pagination</td>
+</tr>
+<tr>
+<td><a href="headfootpage.html#pagenumber">&nbsp;PAGENUMBER</a></td><td>-- user-defined (starting) page number</td>
+</tr>
+<tr>
+<td><a href="headfootpage.html#pagenum-style">&nbsp;PAGENUM_STYLE</a></td><td>-- digits, roman numerals, etc</td>
+</tr>
+<tr>
+<td><a href="headfootpage.html#pagenumber-string">&nbsp;PAGENUMBER_STRING</a></td><td>-- user-defined page numbering string</td>
+</tr>
+<tr>
+<td><a href="headfootpage.html#pagenum-on-first-page">&nbsp;PAGENUM_ON_FIRST_PAGE</a></td><td>-- when page numbering is at page top</td>
+</tr>
+<tr>
+<td style="vertical-align: top;"><a href="headfootpage.html#draft-with-pagenumber">&nbsp;DRAFT_WITH_PAGENUMBER</a></td><td>-- attach draft/revision to page number</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-57" class="quick-ref" colspan="2">
+<a href="docprocessing.html#vertical-whitespace-management">+++ Vertical whitespace management</a></th>
+</tr>
+<tr>
+<td><a href="docprocessing.html#shim">SHIM</a></td><td>-- align to the baseline grid</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#flex">FLEX</a></td><td>-- insert flexible whitespace</td>
+</tr>
+</table>
+
+
+<table class="quick-ref">
+<tr>
+<th id="qr-47" class="quick-ref" colspan="2">
+<a href="cover.html">+++ Document and section cover (title) pages</a></th>
+</tr>
+<tr>
+<td><a href="cover.html#cover">DOC_COVER</a></td><td>-- information to include in a document cover</td>
+</tr>
+<tr>
+<td><a href="cover.html#cover">COVER</a></td><td>-- information to include in a section cover</td>
+</tr>
+<tr>
+<td><a href="cover.html#on-off">DOC_COVERS</a></td><td>-- printing of document covers on/off</td>
+</tr>
+<tr>
+<td><a href="cover.html#on-off">COVERS</a></td><td>-- printing of section covers on/off</td>
+</tr>
+<tr>
+<td><a href="cover.html#covertext">DOC_COVERTEXT</a></td><td>-- user-added text for document covers</td>
+</tr>
+<tr>
+<td><a href="cover.html#covertext">COVERTEXT</a></td><td>-- user-added text for section covers</td>
+</tr>
+<tr>
+<td><a href="cover.html#coverimage">DOC_COVER_IMAGE</a></td><td>-- add images to document covers</td>
+</tr>
+<tr>
+<td><a href="cover.html#coverimage">COVER_IMAGE</a></td><td>-- add images to document covers</td>
+</tr>
+<tr>
+<td><a href="cover.html#cover-control">Control macros</a></td><td>-- change style defaults for covers</td>
+</tr>
+</table>
+
+<table class="quick-ref">
+<tr>
+<th id="qr-48" class="quick-ref" colspan="2">+++ Utilities</th>
+</tr>
+<tr>
+<td><a href="docprocessing.html#add-space">ADD_SPACE</a></td><td>-- add space to the top of a page</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#add-space">RESTORE_SPACE</a></td><td>-- restore spacing at the top of a page</td>
+</tr>
+<tr>
+<td><a href="headfootpage.html#blank-pages">BLANKPAGE</a></td><td>-- output one or more blank pages</td>
+</tr>
+<tr>
+<td><a href="docprocessing.html#doc-lead-adjust">DOC_LEAD_ADJUST</a></td><td>-- adjust leading to fill pages</td>
+</tr>
+<tr>
+<td><a href="rectoverso.html#collate">COLLATE</a></td><td>-- join documents (chapters/sections)</td>
+</tr>
+<tr>
+<td><a href="goodies.html#center-block">CENTER_BLOCK</a></td><td>-- centre blocks of type</td>
+</tr>
+</table>
+
+<div class="rule-long"><hr/></div>
+
+<!-- Navigation links -->
+<table style="width: 100%; margin-top: 12px;">
+<tr>
+ <td style="width: 33%;"><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="width: 33%; text-align: center;"><a href="#top">Top</a></td>
+ <td style="width: 33%; text-align: right;"><a href="appendices.html">Next: Appendices</a></td>
+</tr>
+</table>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/momdoc/rectoverso.html b/contrib/mom/momdoc/rectoverso.html
new file mode 100644
index 0000000..92cf80f
--- /dev/null
+++ b/contrib/mom/momdoc/rectoverso.html
@@ -0,0 +1,350 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>Mom -- Recto/verso printing, collating</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div id="top" class="page">
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+<tr>
+ <td><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="text-align: right;"><a href="cover.html#top">Next: Cover pages</a></td>
+</tr>
+</table>
+
+<h1 class="docs">Recto/verso printing, collating</h1>
+
+<div style="width: 50%; margin: auto;">
+<ul class="no-enumerator" style="margin-left: -1em;">
+ <li><a href="#rectoverso-intro">Introduction to recto/verso printing</a>
+ <ul style="margin-left: -.5em; list-style-type: disc;">
+ <li><a href="#rectoverso-list">Macro list</a></li>
+ </ul></li>
+ <li><a href="#collate-intro">Introduction to collating</a>
+ <ul style="margin-left: -.5em; list-style-type: disc;">
+ <li><a href="#collate">The COLLATE macro</a></li>
+ </ul></li>
+</ul>
+</div>
+
+<div class="rule-medium"><hr/></div>
+
+<h2 id="rectoverso-intro" class="docs">Introduction to recto/verso printing</h2>
+
+<p>
+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.
+</p>
+
+<p>
+With recto/verso, mom automatically takes control of the following
+aspects of alternating page layout:
+</p>
+<ul style="margin-top: -.5em; margin-left: -.5em; margin-bottom: -.5em;">
+ <li>switching left and right margins (if they&#8217;re not equal)</li>
+ <li>switching the left and right parts of the default 3-part
+ <a href="definitions.html#header">headers</a>
+ or
+ <a href="definitions.html#footer">footers</a>
+ (see the
+ <a href="headfootpage.html#description-general">General description of headers</a>)
+ </li>
+ <li>switching
+ <a href="headfootpage.html#hdrftr-recto">HEADER_RECTO</a>
+ and
+ <a href="headfootpage.html#hdrftr-recto">HEADER_VERSO</a>
+ if user-defined, single string recto/verso headers
+ or footers are used in place of the default 3-part
+ headers or footers
+ </li>
+ <li>switching the page number position (if page numbers are not centred)</li>
+</ul>
+<br/>
+
+<div class="macro-list-container">
+<h3 id="rectoverso-list" class="macro-list">Recto/verso macros</h3>
+<ul class="macro-list">
+ <li><a href="#recto-verso">RECTO_VERSO</a></li>
+ <li><a href="#force-recto">FORCE_RECTO</a></li>
+ <li><a href="#switch-hdrftr">SWITCH_HEADERS (also FOOTERS)</a>
+ &ndash; switch starting position of the header parts (left and right)
+ </li>
+</ul>
+</div>
+
+<!-- -RECTO_VERSO- -->
+
+<div id="recto-verso" class="box-macro-args">
+Macro: <b>RECTO_VERSO</b>
+</div>
+
+<p>
+If you want mom to set up alternating pages for recto/verso
+printing, simply invoke RECTO_VERSO, with no argument, anywhere in
+your document (most likely before
+<a href="docprocessing.html#start">START</a>).
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span>
+Recto/verso always switches the left and right parts of
+<a href="definitions.html#header">headers</a>
+or
+<a href="definitions.html#footer">footers</a>
+on odd/even pages. However, it only switches the left and right
+margins if the margins aren&#8217;t equal. Consequently, it is
+your responsibility to set the appropriate differing left and right
+margins with
+<a href="typesetting.html#l-margin">L_MARGIN</a>
+and
+<a href="typesetting.html#r-margin">R_MARGIN</a>
+(prior to
+<a href="docprocessing.html#start">START</a>)
+or with
+<a href="docprocessing.html#doc-left-margin">DOC_LEFT_MARGIN</a>
+and
+<a href="docprocessing.html#doc-right-margin">DOC_RIGHT_MARGIN</a>
+(before or after START).
+</p>
+
+<p class="tip-bottom">
+Equally, recto/verso only switches the page number position if page
+numbers aren&#8217;t centred, which means you have to set the page
+number position with
+<a href="headfootpage.html#pagenum-pos">PAGENUM_POS</a>
+(before or after START).
+</p>
+</div>
+
+<!-- -FORCE_RECTO- -->
+
+<div id="force-recto" class="box-macro-args" style="margin-top: 1em;">
+Macro: <b>FORCE_RECTO</b>
+</div>
+
+<p>
+It is a common convention with two-sided printing to ensure that
+cover pages, title pages, and chapters or major sections of a document
+always begin on the recto side of a page. This sometimes
+necessitates inserting a blank page before the start of a new
+chapter or major section.
+</p>
+
+<p>
+If you would like mom to take care of this for you automatically,
+simply invoke <kbd>FORCE_RECTO</kbd> before the first
+<a href="docprocessing.html#start">START</a>
+of the document.
+</p>
+
+<!-- -SWITCH_HDRFTR- -->
+
+<div id="switch-hdrftr" class="box-macro-args" style="margin-top: 1em;">
+Macro: <b>SWITCH_HEADERS</b>
+</div>
+
+<p>
+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&#8217;t like mom&#8217;s default
+placement of author and title, use SWITCH_HEADERS to reverse it.
+</p>
+
+<p>
+SWITCH_HEADERS can also be useful in conjunction with
+<a href="#recto-verso">RECTO_VERSO</a>.
+The assumption of RECTO_VERSO is that the first page of a document
+(i.e. recto/odd) represents the norm for header-left and header-right,
+meaning that the second (and all subsequent verso/even) pages of the
+document will reverse the order of header-left and header-right.
+</p>
+
+<p>
+If mom&#8217;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.
+</p>
+
+<div class="rule-medium"><hr/></div>
+
+<!-- ===================================================================== -->
+
+<h2 id="collate-intro" class="docs">Introduction to collating</h2>
+
+<p>
+Many people wisely keep chapters of a long work in separate
+files, previewing or printing them as needed during the draft
+phase. However, when it comes to the final version, mom requires
+a single, collated file in order to keep track of page numbering
+and recto/verso administration, generating tables of contents and
+endnotes, ensuring that
+<a href="definitions.html#docheader">docheaders</a>
+get printed correctly, and a host of other details.
+</p>
+
+<p>
+The COLLATE macro, which can be used with any
+<a href="docprocessing.html#doctype">DOCTYPE</a>
+except <kbd>LETTER</kbd>, lets you glue mom-formatted input files
+together. You need only concatenate chapters into a single file
+(most likely with <kbd>cat(1)</kbd>), and put
+<kbd>.COLLATE</kbd> at the end of each concatenated chapter.
+Assuming all the files begin with the required
+<a href="docprocessing.html#reference-macros">reference macros</a>
+(metadata), style parameters, and
+<a href="docprocessing.html#start">START</a>,
+each chapter will begin on a fresh page and behave as expected.
+</p>
+
+<p>
+Even if you work with monolithic, multi-chapter files, every
+chapter and its associated metadata plus <kbd>.START</kbd>
+still needs to be preceded by <kbd>.COLLATE</kbd>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+COLLATE assumes you are collating documents/files with similar
+type-style parameters hence there&#8217;s no need for PRINTSTYLE
+to appear after COLLATE, although if you&#8217;re collating
+documents that were created as separate files, chances are the
+PRINTSTYLE&#8217;s already there.
+</p>
+</div>
+
+<div class="box-tip">
+<p id="caution" class="tip">
+<b>Two words of caution:</b>
+</p>
+<ol style="margin-top: -1.25em; padding-bottom: .5em;">
+ <li>Do not collate documents of differing
+ PRINTSTYLES (i.e., don&#8217;t try to
+ collate a <kbd>TYPESET</kbd> document and <kbd>TYPEWRITE</kbd>
+ document).
+ </li>
+ <li>Use <kbd>.DOC_FAMILY</kbd> instead of
+ <kbd>.FAMILY</kbd> if, for some reason, you want to
+ change the family of all the document elements after
+ <kbd>.COLLATE</kbd>. <kbd>.FAMILY</kbd>, by itself, will
+ change the family of paragraph text only.
+ </li>
+</ol>
+</div>
+
+<!-- -COLLATE- -->
+
+<div class="macro-id-overline">
+<h3 id="collate" class="macro-id">collate</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>COLLATE</b>
+</div>
+
+<p>
+The most basic (and most likely) collating situation looks like
+this:
+<br/>
+<span class="pre-in-pp">
+ .COLLATE
+ .CHAPTER 17
+ .START
+</span>
+A slightly more complex version of the same thing, for chapters
+that require their own titles, looks like this:
+<br/>
+<span class="pre-in-pp">
+ .COLLATE
+ .CHAPTER_TITLE "Geek Fatigue: Symptoms and Causes"
+ .START
+</span>
+</p>
+
+<div class="box-tip" style="margin-top: -1em">
+<p class="tip">
+<span class="tip">Tip:</span>
+If the last line of text before <kbd>.COLLATE</kbd>
+falls too close to the bottom margin, or if the line is followed
+by a macro likely to cause a linebreak (e.g. <kbd>.LIST OFF</kbd> or
+<kbd>.IQ</kbd>), mom may output a superfluous blank page before
+the start of the following document.
+</p>
+
+<p class="tip-bottom" style="margin-top: -1em">
+In order to avoid this, insert
+<a href="docprocessing.html#EL"><kbd>.EL</kbd></a>
+after the last line of text, before <kbd>.COLLATE</kbd> and/or any
+concluding macros. For example,
+<br/>
+<span class="pre-in-pp">
+ some concluding text.\c
+ .EL
+ .COLLATE
+</span>
+or
+<br/>
+<span class="pre-in-pp">
+ some concluding text.\c
+ .EL
+ .LIST OFF
+ .COLLATE
+</span>
+</p>
+</div>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+See the
+<a href="#caution">two words of caution</a>,
+above.
+</p>
+</div>
+
+<div class="rule-long"><hr/></div>
+
+<!-- Navigation links -->
+<table style="width: 100%; margin-top: 12px;">
+<tr>
+ <td style="width: 33%;"><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="width: 33%; text-align: center;"><a href="#top">Top</a></td>
+ <td style="width: 33%; text-align: right;"><a href="cover.html">Next: Cover pages</a></td>
+</tr>
+</table>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/momdoc/refer.html b/contrib/mom/momdoc/refer.html
new file mode 100644
index 0000000..5f11814
--- /dev/null
+++ b/contrib/mom/momdoc/refer.html
@@ -0,0 +1,2129 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>Mom -- Document processing, bibliographies and references</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div id="top" class="page">
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+<tr>
+ <td><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="text-align: right;"><a href="letters.html#top">Next: Writing letters</a></td>
+</tr>
+</table>
+
+<h1 class="docs">Bibliographies and references</h1>
+
+<div style="width: 75%; margin: auto;">
+<ul class="no-enumerator">
+ <li><a href="#intro-ref">Introduction to bibliographies and references</a></li>
+ <li><a href="#tutorial-ref">Tutorial on <kbd>refer</kbd> usage with mom</a>
+ <ul style="margin-left: -.5em; list-style-type: disc;">
+ <li><a href="#db-ref">Create a <kbd>refer</kbd> database</a></li>
+ <li><a href="#rcommands-ref">Insert a <kbd>refer</kbd> block</a></li>
+ <li><a href="#placement-ref">Tell mom where you want your references (if footnotes or endnotes)</a></li>
+ <li><a href="#accessing-ref">Accessing references in the database</a></li>
+ <li><a href="#fn-en-recipe">Entering footnote/endnote references</a></li>
+ <li><a href="#parenthetical">Parenthetical insertions</a></li>
+ <li><a href="#bibliography-from-embedded">Generating a bibliography from parenthetical insertions</a></li>
+ <li><a href="#bibliography-recipe">Generating a comprehensive bibliography</a></li>
+ <li><a href="#invoking-ref">Invoking groff with mom and <kbd>refer</kbd></a></li>
+ </ul></li>
+ <li><a href="#mla">MLA (Modern Language Association) style</a>
+ <ul style="margin-left: -.5em; list-style-type: disc;">
+ <li><a href="#ref-styles">Types of references (endnote, footnote, or embedded in text)</a></li>
+ <li><a href="#parenthetical">Inserting parenthetical references into the text</a></li>
+ </ul></li>
+ <li><a href="#database">The <kbd>refer</kbd> database</a>
+ <ul style="margin-left: -.5em; list-style-type: disc;">
+ <li><a href="#database-intro">Introduction</a></li>
+ <li><a href="#database-rules">Rules</a></li>
+ <li><a href="#fields-quick">Quick guide to field identifiers (%A for author, %T for title, etc)</a></li>
+ <li><a href="#fields-specifics">Field identifiers: specifics, usage and examples</a></li>
+ </ul></li>
+ <li><a href="#index-ref">The bibliography and reference macros</a>
+ <ul style="margin-left: -.5em; list-style-type: disc;">
+ <li><a href="#biblio-control">Bibliography control macros and defaults</a></li>
+ </ul></li>
+</ul>
+</div>
+
+<div class="rule-medium"><hr/></div>
+
+<h2 id="intro-ref" class="docs">Introduction to bibliographies and references</h2>
+
+<p>
+Mom provides the ability to format and generate bibliographies, as
+well as footnote or endnote references, in MLA (Modern Language
+Association) style. She accomplishes this by working in conjunction
+with a special groff program called <kbd>refer</kbd>.
+</p>
+
+<p>
+<kbd>Refer</kbd> requires first that you create a database of works
+that will be cited in your documents. Once that&#8217;s done, special
+macros let you briefly key in references to entries in the database
+and have mom format them with respect to order, punctuation and
+italicization in footnotes, endnotes, or a full bibliography.
+</p>
+
+<p>
+<kbd>Refer</kbd> has been around for a long time. It&#8217;s
+powerful and has many, many features. Unfortunately, the manpage
+(<kbd>man&nbsp;refer</kbd>), while complete and accurate, is
+dense and not a good introduction. (It&#8217;s a classic manpage
+Catch-22: the manpage is useful only after you know how to use the
+program.)
+</p>
+
+<p>
+In order to get mom users up and running with <kbd>refer</kbd>,
+this section of mom&#8217;s documentation focuses exclusively, in a
+recipe-like manner, on what you need to know to use <kbd>refer</kbd>
+satisfactorily in conjunction with mom. The instructions are not to
+be taken as a manual on full <kbd>refer</kbd> usage.
+</p>
+
+<p>
+If you&#8217;re already a <kbd>refer</kbd> user, the information
+herein will be useful for adapting your current <kbd>refer</kbd>
+usage to mom&#8217;s way of doing things. If you&#8217;ve never
+used <kbd>refer</kbd>, the information is essential, and, in many
+cases, may be all you need.
+</p>
+
+<p>
+I encourage anyone interested in what MLA style looks
+like&mdash;and, by extension, how your bibliographies and references
+will look after mom formats them&mdash;to check out
+<br/>
+<span class="pre-in-pp">
+ <a href="http://www.aresearchguide.com/12biblio.html">http://www.aresearchguide.com/12biblio.html</a>
+</span>
+or any other website or reference book on MLA style.
+</p>
+
+<div class="rule-short" style="margin-top: 1em;"><hr/></div>
+
+<div class="examples-container" style="margin-top: 1.5em; margin-bottom: 1.5em;">
+<h3 id="tutorial-ref" class="docs">Tutorial on refer usage with mom</h3>
+<ol style="margin-top: 1em; margin-bottom: -.5em;">
+ <li><a href="#db-ref">Create a <kbd>refer</kbd> database</a>
+ <ul style="margin-left: -.5em; list-style-type: disc;">
+ <li><a href="#example-refer-database">example <kbd>refer</kbd> database</a></li>
+ </ul></li>
+ <li><a href="#rcommands-ref">Insert a <kbd>refer</kbd> block</a>
+ <ul style="margin-left: -.5em; list-style-type: disc;">
+ <li><a href="#fn-en-block">refer block for footnotes/endnotes</a></li>
+ <li><a href="#in-text-block">refer block for parenthetical insertions into running text</a></li>
+ <li><a href="#bibliography-block">refer block for comprehensive bibliographies (reading lists)</a></li>
+ </ul></li>
+ <li><a href="#placement-ref">Tell mom where you want your references (if footnotes or endnotes)</a></li>
+ <li><a href="#accessing-ref">Accessing references in the database</a></li>
+ <li><a href="#fn-en-recipe">Entering footnote/endnote references</a></li>
+ <li><a href="#parenthetical-insertions">Parenthetical insertions</a></li>
+ <li><a href="#bibliography-from-embedded">Generating a bibliography from parenthetical insertions</a></li>
+ <li><a href="#bibliography-recipe">Generating a comprehensive bibliography</a></li>
+ <li><a href="#invoking-ref">Invoking groff with mom and <kbd>refer</kbd></a></li>
+</ol>
+
+<h4 id="db-ref" class="docs">1. Create a refer database</h4>
+
+<p>
+The first step in using <kbd>refer</kbd> with mom is creating a
+database. The database is a text file containing entries for the
+works you will be citing. You may set up separate databases for
+individual documents, or create a large database that can be
+accessed by many documents.
+</p>
+
+<p>
+Entries (&#8220;records&#8221; in refer-speak) in the database
+are separated from each other by a single, blank line. The records
+themselves are composed of single lines (&#8220;fields&#8221;) with
+no blank lines between them. Each field begins with a percent
+sign and a single letter (the &quot;field identifier&quot;)
+e.g. <kbd>%A</kbd> or <kbd>%T</kbd>. 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.
+</p>
+
+<!-- Add rules for punctuation and italics -->
+
+<p>
+Here&#8217;s an example database containing two records so you can
+visualize what the above paragraph says.
+</p>
+
+<div id="example-refer-database" class="examples" style="margin-top: -.5em;">Example <kbd>refer</kbd> database</div>
+<div class="examples-container" style="padding-bottom: 1em;">
+<span class="pre">
+%A Terry Pratchett
+%A Neil Gaiman
+%T Good Omens
+%C London
+%I Gollancz
+%D 1990
+
+%A Peter Schaffter
+%T The Schumann Proof
+%C Toronto
+%I RendezVous Press
+%D 2004
+</span>
+</div>
+
+<p>
+The order in which you enter fields doesn&#8217;t matter.
+<kbd>Refer</kbd> will re-arrange them for you.
+</p>
+
+<h4 id="rcommands-ref" class="docs">2. Insert a refer block</h4>
+
+<p>
+Having set up your database, you now need to put some
+<kbd>refer</kbd>-specific commands in your mom file.
+</p>
+
+<p>
+<kbd>Refer</kbd> commands are introduced by a single line
+containing <kbd>.R1</kbd>, and concluded with a single line
+containing <kbd>.R2</kbd>. What goes between the <kbd>.R1</kbd>
+and <kbd>.R2</kbd> lines is called a &#8220;refer block&#8221;.
+<kbd>Refer</kbd> commands in a refer block should be entered one per
+line, in lowercase letters, <i>with no initial period</i> (dot).
+The actual commands depend on whether you want your references
+</p>
+<ul>
+<li>in footnotes/endnotes</li>
+<li>parenthetically inserted (in abbreviated form) into running text,
+referring to a works-cited list (bibliography)</li>
+<li>to generate a comprehensive bibliography (a reading list)</li>
+</ul>
+
+<h5 id="fn-en-block" class="docs" style="font-size: 90%; margin-top: .25em;">Refer block for footnotes/endnotes</h5>
+
+<p style="margin-top: .5em;">
+If you want footnote or endnote references, place this block at
+the <i>top</i> of your mom file.
+</p>
+
+<div id="refer-block1" class="examples" style="margin-top: -.5em;">
+<div class="examples-container" style="padding-bottom: 1em;">
+<span class="pre">
+.R1
+no-label-in-text
+no-label-in-reference
+join-authors " and " ", " ", and "
+database &lt;full path to database&gt;
+.R2
+</span>
+</div>
+</div>
+<p style="margin-top: .5em; font-size: 95%; line-height: 120%;">
+<kbd>&lt;full&nbsp;path&nbsp;to&nbsp;the&nbsp;database&gt;</kbd>
+means the full path including the filename, e.g.
+<kbd>/home/user/refer/my-database-file</kbd>.
+</p>
+
+<h5 id="in-text-block" class="docs" style="font-size: 90%; margin-top: .25em;">Refer block for parenthetical insertions into running text</h5>
+
+<p style="margin-top: .5em;">
+If you want short, parenthetical insertions into running text,
+referring to works cited in a bibliography, place this block at
+the <i>top</i> of your mom file.
+</p>
+
+<div id="refer-block2" class="examples" style="margin-top: -.5em;">
+<div class="examples-container" style="padding-bottom: 1em;">
+<span class="pre">
+.R1
+label "(A.n|Q)"
+bracket-label " (" ")" ", "
+join-authors ", and " ", " ", and "
+move-punctuation
+reverse A1
+sort A1Q1T1B1E1
+database &lt;full path to database&gt;
+.R2
+</span>
+</div>
+</div>
+<p style="margin-top: .5em; font-size: 95%; line-height: 120%;">
+<kbd>&lt;full&nbsp;path&nbsp;to&nbsp;the&nbsp;database&gt;</kbd>
+means the full path including the filename, e.g.
+<kbd>/home/user/refer/my-database-file</kbd>.
+</p>
+
+<h5 id="bibliography-block" class="docs" style="font-size: 90%; margin-top: .25em;">Refer block for comprehensive bibliographies</h5>
+
+<p style="margin-top: .5em;">
+If you want to output an entire <kbd>refer</kbd> database, or
+generate a comprehensive bibliography (a reading list) from a
+database, place this block at the <i>bottom</i> of your mom file,
+either prior to or immediately after invoking
+<a href="#bibliography">BIBLIOGRAPHY</a>.
+</p>
+
+<div id="refer-block3" class="examples" style="margin-top: -.5em;">
+<div class="examples-container" style="padding-bottom: 1em;">
+<span class="pre">
+.R1
+no-label-in-text
+no-label-in-reference
+join-authors ", and " ", " ", and "
+sort A1Q1T1B1E1
+reverse A1
+database &lt;full path to database&gt;
+.R2
+</span>
+</div>
+</div>
+
+<p style="margin-top: .5em; font-size: 95%; line-height: 120%;">
+<kbd>&lt;full&nbsp;path&nbsp;to&nbsp;the&nbsp;database&gt;</kbd>
+means the full path including the filename, e.g.
+<kbd>/home/user/refer/my-database</kbd>.
+</p>
+
+<h4 id="placement-ref" class="docs">3. Tell mom where you want your references</h4>
+
+<p>
+If you want references in footnotes, issue the instruction
+<br/>
+<span class="pre-in-pp">
+ .FOOTNOTE_REFS
+</span>
+anywhere before the first citation in your file. Footnote markers
+will be inserted into the text, and the bibliographic information
+for the citation will appear as a footnote.
+</p>
+
+<p>
+If you want references in endnotes, issue the instruction
+<br/>
+<span class="pre-in-pp">
+ .ENDNOTE_REFS
+</span>
+anywhere before the first citation in your file. Endnote markers
+will be inserted into the text, and the bibliographic information
+for the citation will appear as an endnote entry.
+</p>
+
+<p>
+Note that if you want references parenthetically inserted
+into running text, referring to entries in a works-cited list
+(bibliography) that <kbd>mom</kbd> and <kbd>refer</kbd> assemble
+automatically, no special instructions are required. See
+<a href="#bibliography-from-embedded">Generating a bibliography from parenthetical insertions</a>
+for how to output the collected references.
+</p>
+
+<p>
+For outputting an entire <kbd>refer</kbd> database, or
+generating a comprehensive reading list from a database, see the
+macro
+<a href="#bibliography">BIBLIOGRAPHY</a>.
+</p>
+
+<h4 id="accessing-ref" class="docs">4. Accessing references in the database</h4>
+
+<p>
+References are accessed by putting keywords from the desired database
+record between two special <kbd>refer</kbd> commands:
+<br/>
+<span class="pre-in-pp">
+ .[
+</span>
+and
+<br/>
+<span class="pre-in-pp">
+ .]
+</span>
+Keywords are any word, or set of words, that identify a database
+record unambiguously. Thus, if you have only one database record for
+the author Ray Bradbury,
+<br/>
+<span class="pre-in-pp">
+ .[
+ bradbury
+ .]
+</span>
+is sufficient. However, if your database contains several records
+for books by Bradbury, say, <i>Fahrenheit 451</i> and <i>The
+Martian Chronicles</i>,
+&#8220;<kbd>bradbury&nbsp;451</kbd>&#8221; and
+&#8220;<kbd>bradbury&nbsp;martian</kbd>&#8221; would identify the two records unambiguously.
+</p>
+
+<p>
+A special database field identifier, <kbd>%K</kbd>, lets you create
+unique keywords for database records to help clear up any ambiguity.
+</p>
+
+<p>
+Notice that you don&#8217;t have to worry about capitalization when
+entering keywords.
+</p>
+
+<h4 id="fn-en-recipe" class="docs">5. Entering footnote/endnote references</h4>
+
+<p>
+Depending on which you have issued, a
+<kbd><a href="#footnote-refs">.FOOTNOTE_REFS</a></kbd>
+or an
+<kbd><a href="#endnote-refs">.ENDNOTE_REFS</a></kbd>
+command, entering references is done like this:
+<br/>
+<span class="pre-in-pp">
+ .REF
+ .[
+ keyword(s)
+ .]
+ .REF
+</span>
+If FOOTNOTE_REFS is in effect, the reference between the first
+and second <kbd>.REF</kbd> will be treated as a footnote. If
+ENDNOTE_REFS, it will be treated as an endnote. Endnote references
+must be explicitly output with
+<a href="docelement.html#ENDNOTES">ENDNOTES</a>
+at the end of your file, before
+<a href="tables-of-contents.html#TOC">TOC</a>.
+</p>
+
+<div class="box-important">
+<p class="tip">
+<span class="important">Important:</span>
+REF behaves identically to
+<a href="docelement.html#footnote">FOOTNOTE</a>
+and
+<a href="docelement.html#endnote">ENDNOTE</a>
+with respect to the use of the <kbd>\c</kbd> inline escape. Please
+read the
+<a href="docelement.html#footnote-note">HYPER IMPORTANT NOTE</a>
+found in the document entry for FOOTNOTE (which also applies to
+ENDNOTE).
+</p>
+</div>
+
+<h4 id="parenthetical-insertions" class="docs">6. Parenthetical insertions</h4>
+
+<p>
+See
+<a href="#parenthetical">Inserting parenthetical references into
+text</a>.
+</p>
+
+<h4 id="bibliography-from-embedded" class="docs">7. Generating a bibliography from parenthetical insertions</h4>
+
+<p>
+To generate a bibliography from works cited by parenthetical
+insertions in the text, put this at the end of your document, before
+<kbd><a href="tables-of-contest.html#TOC">.TOC</a></kbd>.
+<br/>
+<span class="pre-in-pp">
+ .BIBLIOGRAPHY
+ .[
+ $LIST$
+ .]
+ .BIBLIOGRAPHY OFF
+</span>
+</p>
+
+<h4 id="bibliography-recipe" class="docs">8. Generating a comprehensive bibliography</h4>
+
+<p>
+You can also generate a comprehensive bibliography, which is to say a
+bibliography containing more works than are actually cited (a
+&#8220;reading list&#8221;), by placing references between
+<kbd><a href="#bibliography">.BIBLIOGRAPHY</a></kbd>
+and
+<kbd><a href="#bibliography">.BIBLIOGRAPHY&nbsp;OFF</a></kbd>.
+Once you have input the desired references, insert
+<br/>
+<span class="pre-in-pp">
+ .[
+ $LIST$
+ .]
+</span>
+and follow it with <kbd>.BIBLIOGRAPHY&nbsp;OFF</kbd>. Study the
+example below if you&#8217;re having trouble visualizing this.
+</p>
+
+<div id="example-bibliography" class="examples" style="margin-top: -.5em;">Example bibliography</div>
+<div class="examples-container" style="padding-bottom: 1em;">
+<span class="pre">
+.BIBLIOGRAPHY
+.R1
+no-label-in-text
+no-label-in-reference
+join-authors ", and " ", " ", and "
+sort A1Q1T1B1E1
+reverse A1
+database &lt;full path to database&gt;
+.R2
+.[
+bradbury
+.]
+.[
+pratchett
+.]
+.[
+$LIST$
+.]
+.BIBLIOGRAPHY OFF
+</span>
+</div>
+
+<p>
+Alternatively, you can output an entire database as a
+bibliography. Do the following at the end of your document, before
+<kbd><a href="tables-of-contest.html#TOC">.TOC</a></kbd>.
+<br/>
+<span class="pre-in-pp">
+ .BIBLIOGRAPHY
+ .R1
+ no-label-in-text
+ no-label-in-reference
+ join-authors ", and " ", " ", and "
+ sort A1Q1T1B1E1
+ reverse A1
+ bibliography &lt;full path to database&gt;
+ .R2
+ .BIBLIOGRAPHY OFF
+</span>
+</p>
+
+<h4 id="invoking-ref" class="docs">9. Invoking groff with mom and refer</h4>
+
+<p>
+So, now you&#8217;ve got a document formatted properly to use
+references processed with <kbd>refer</kbd>, what do you do to output
+the document?
+</p>
+
+<p>
+It&#8217;s simple. Pass the <kbd>-R</kbd> flag to pdfmom or groff,
+like this:
+<br/>
+<span class="pre-in-pp">
+ pdfmom -R &lt;filename&gt; ...
+</span>
+</p>
+</div>
+
+<div class="rule-medium" style="margin-top: 1em;"><hr/></div>
+
+<h2 id="mla" class="docs">MLA (Modern Language Association) style</h2>
+
+<h3 id="ref-styles" class="docs">Types of references (endnote, footnote, or embedded in text)</h3>
+
+<p>
+MLA allows for three types of references, or referencing styles:
+</p>
+<ul style="margin-top: -.5em;">
+ <li>short, parenthetical references in the text, linked to a
+ works-cited list (bibliography) at the end of the document</li>
+ <li>footnote references</li>
+ <li>endnote references</li>
+</ul>
+
+<p style="margin-top: -.5em;">
+There are significant differences between the way footnote/endnote
+references should be formatted, and the formatting style of
+bibliographies. One example is that footnote/endnote references
+should have their first lines indented, whereas bibliographic
+references should have their second lines indented. Fortunately,
+with mom, there&#8217;s no need to concern yourself with the differences;
+they&#8217;re taken care of automatically.
+</p>
+
+<p>
+In terms of inserting references into your documents,
+footnote/endnote references are input in a manner similar to
+entering any other kind of
+<a href="docelement.html#footnote-into">footnote</a>
+or
+<a href="docelement.html#endnote-into">endnote</a>.
+Parenthetical references, however, need to be handled differently.
+See the next section.
+</p>
+
+<h3 id="parenthetical" class="docs">Inserting parenthetical references into the text</h3>
+
+<p>
+MLA style prefers restricting the information in parenthetical
+references to the barest minimum needed to identify works
+in the works-cited list (the bibliography). Typically, a
+parenthetical insertion is just the author&#8217;s last name
+followed by the page number of the cited work (if only one work by
+that author is cited), or by the author, a shortened title of the
+work, and the page number (if more than one work is cited).
+</p>
+
+<p>
+This necessitates a slightly fiddly way of entering parenthetical
+references, though not by any means difficult or hard to make sense
+of.
+</p>
+
+<p>
+The <kbd>refer</kbd> block suggested
+<a href="#refer-block2">here</a>
+for parenthetical references prints only the author&#8217;s
+last name from the database record identified by your keywords
+(the <kbd>label</kbd> command), surrounded by parentheses (the
+<kbd>bracket-label</kbd> command). Therefore, assuming you are
+citing Ray Bradbury&#8217;s <i>The Martian Chronicles</i>, and it is
+the only work by Bradbury mentioned in the text,
+<br/>
+<span class="pre-in-pp">
+ ...end of sentence.
+ .[
+ martian chronicles
+ .]
+ A new sentence...
+</span>
+will insert &#8220;<span style="font-family: times; font-size: 105%; font-weight: bold">...end of sentence (Bradbury). A new sentence...</span>&#8221; into the text.
+<i>The Martian Chronicles</i> will be added
+to the works-cited list generated at the end of the document if it
+is not already present as the result of an earlier reference.
+</p>
+
+<p>
+If you need a page number to identify where in <i>The Martian
+Chronicles</i> to find a specific quote
+<br/>
+<span class="pre-in-pp">
+ "...aluminum roaches and iron crickets."
+ .[
+ [ martian chronicles
+ .] 168)
+ A new sentence...
+</span>
+results in <span style="font-family: times; font-size: 105%; font-weight: bold">&#8220;...aluminum roaches and iron crickets.&#8221; (Bradbury 168) A new sentence...</span>&#8221;
+(which is excruciatingly correct MLA style). The
+&#8220;<kbd>[</kbd>&#8221; before <kbd>martian&nbsp;chronicles</kbd> tells
+refer to print the opening parenthesis; any text immediately
+following the &#8220;<kbd>.]</kbd>&#8221;, including spaces,
+<i>replaces</i> the closing parenthesis. (Notice that you have to
+add the closing parenthesis yourself after the page number.)
+</p>
+
+<p>
+If your document cites more than one work by Bradbury and you need
+a title and page number in addition to the author&#8217;s name in
+the inline reference,
+<br/>
+<span class="pre-in-pp">
+ "...aluminum roaches and iron crickets."
+ .[
+ [ bradbury martian
+ .], \fIChronicles\fP 168)
+ A new sentence...
+</span>
+will produce &#8220;<span style="font-family: times; font-size: 105%; font-weight: bold">&#8220;...aluminum roaches and iron crickets.&#8221; (Bradbury, <i>Chronicles</i> 168) A new sentence...</span>&#8221;.
+</p>
+
+<div class="examples-container" style="margin-top: 1.5em; margin-bottom: 1.5em;">
+<h3 class="docs">The <span style="text-transform: none">&#8216;label&#8217;</span><span style="text-transform: uppercase"> and</span> <span style="text-transform: none">&#8216;bracket-label&#8217;</span><span style="text-transform: uppercase"> commands</span></h3>
+
+<p>
+The <kbd>label</kbd> and <kbd>bracket-label</kbd> commands in
+the refer block allow you to customize what information goes
+into parenthetical references, and how they should be formatted.
+<kbd>label</kbd> dictates which fields from the database record
+to print and how to punctuate them. <kbd>bracket-label</kbd>
+controls the bracketing style. Users are encouraged to consult
+<kbd>man&nbsp;refer</kbd> for usage.
+</p>
+
+<p>
+Here&#8217;s an example of how to set up APA-style references, which
+require the author and date of publication, optionally with a page
+number or range of pages.
+<br/>
+<span class="pre-in-pp">
+ .R1
+ label "(A.n|Q) ', ' D.y"
+ bracket-label " (" ")" ", "
+ join-authors ", and " ", " ", and "
+ move-punctuation
+ reverse A1
+ sort A1Q1T1B1E1
+ database /home/peter/Groff-mom/Testing/Refer/refer-database
+ .R2
+</span>
+Assuming a reference to a work by Ursula Leguin published in 1980
+<br/>
+<span class="pre-in-pp">
+ .[
+ leguin
+ .]
+</span>
+produces
+<span style="font-family: times; font-size: 105%; font-weight: bold">
+(Leguin, 1980)
+</span>.
+If a page number is also required
+<br/>
+<span class="pre-in-pp">
+ .[
+ [ leguin
+ .], p. 73)
+</span>
+produces
+<span style="font-family: times; font-size: 105%; font-weight: bold">(Leguin, 1980, p. 73)</span>.
+</p>
+</div>
+
+<div class="rule-medium" style="margin-top: 1em;"><hr/></div>
+
+<h2 id="database" class="docs">The refer database</h2>
+
+<h3 id="database-intro" class="docs">Introduction</h3>
+
+<p style="margin-top: .5em;">
+The heart and soul of <kbd>refer</kbd> is the bibliographic
+database. Knowing how to create records (i.e. the entries for works
+cited in a document) is largely a question matching data (author,
+title, publisher, etc) with the correct field identifier. For
+example, if you&#8217;re citing from a scholarly journal, you need to know
+that <kbd>%J</kbd> is the field identifier for journal names and
+<kbd>%N</kbd> is the field identifier for the journal number. Use
+the
+<a href="#fields-quick">Quick list of field identifiers</a>
+as your guide.
+</p>
+
+<h3 id="database-rules" class="docs">The rules</h3>
+
+<p style="margin-top: .5em;">
+Entering the data correctly is also important. Fortunately, there
+are very few rules, and those there are make sense. In a nutshell:
+</p>
+<ul style="margin-top: -.5em;">
+ <li>enter the data in each field in natural order; author John Smith is
+ &#8220;John Smith&#8221;, editor Jane Doe is &#8220;Jane Doe&#8221;</li>
+ <li>capitalize all proper nouns and words in titles as you expect
+ to see them; otherwise, use lowercase</li>
+ <li>use no terminating punctuation unless required; typically,
+ required punctuation is the period after a shortform
+ (&#8220;ed.&#8221; or &#8220;eds.&#8221;, &#8220;Jr.&#8221;,
+ etc) or a question mark or exclamation mark at the end of a
+ title</li>
+ <li>if part of a field needs to be set off in single-quotes, use
+ <kbd>\[oq]</kbd> and <kbd>\[cq]</kbd> (openquote, closequote) rather than the
+ single-quote (or apostrophe) character on your keyboard</li>
+ <li>if part of a field needs to be forced into italics, use the
+ escapes <kbd><span class="nobr">\*[IT]</span></kbd> and
+ <kbd><span class="nobr">\*[PREV]</span></kbd>; if the italicized portion
+ concludes the field, omit <kbd><span class="nobr">\*[PREV]</span></kbd></li>
+ <li>if you require characters with accents, ligatures or special
+ symbols, use groff&#8217;s &#8220;named&#8221; glyphs (e.g.
+ <kbd>\['e]</kbd> for <kbd>é</kbd>); a full list can be found in
+ <kbd>man groff_char</kbd></li>
+</ul>
+
+<h3 id="fields-quick" class="docs" style="margin-top: 1.25em; margin-bottom: .5em;">Quick guide to field identifiers <span style="text-transform: none;">(click on any that are links for more information)</span></h3>
+
+<div class="examples-container" style="padding-bottom: 1em;">
+<span class="pre">
+<a class="quick" href="#A">%A</a> author &ndash; records may contain multiple authors,
+ one per line
+<a class="quick" href="#Q">%Q</a> non-human author &ndash; corporate author, e.g. National Geographic;
+ may also be used for exceptional reference types
+<a class="quick" href="#m">%m</a> multiple authors &ndash; whenever "et al." is desirable
+<a class="quick" href="#i">%i</a> idem &ndash; multiple works by the same author
+<a class="quick" href="#p">%p</a> post-author &ndash; post-author information (e.g. appendix,
+ foreword, letter)
+%T title &ndash; primary title (of a book) or the
+ title of an article (within a scholarly
+ journal or a magazine)
+%B book title &ndash; when %T contains the title of an article;
+<a class="quick" href="#q">%q</a> force quote &ndash; force a title into double-quotes
+%t reprint title &ndash; if different from a work's original title
+%b main author &ndash; when citing a preface, foreword,
+ introduction, or afterword, the author of
+ the complete original work
+<a class="quick" href="#E">%E</a> editor &ndash; records may contain multiple editors,
+ one per line
+<a class="quick" href="#l">%l</a> translator &ndash; if more than one translator, all the
+ names
+%r translator &ndash; if tr. and ed. are one in the same
+ and editor
+%M magazine or &ndash; when %T contains the title of an article
+ newspaper
+%J journal &ndash; when %T contains the title of an article
+%e edition &ndash; number or name of an edition
+ (e.g. Second, 2nd, Collector's, etc.)
+%S series &ndash; series name of books or journals
+%V volume &ndash; volume number (of books)
+%N journal number &ndash; journal or magazine number
+%R report number &ndash; technical report number
+%G gov&#8217;t. &ndash; government ordering number
+<a class="quick" href="#O">%O</a> other &ndash; information for which there is no appropriate
+ field letter
+<a class="quick" href="#C">%C</a> city &ndash; city of publication
+%I publisher &ndash; publisher
+%D date &ndash; publication date
+<a class="quick" href="#d">%d</a> original
+ publication date &ndash; if different from date of publication
+<a class="quick" href="#P">%P</a> page(s) &ndash; page number or range
+<a class="quick" href="#n">%n</a> annotation &ndash; annotation to the reference
+%s site name &ndash; for internet references, the website name
+%c content &ndash; for internet references, the source of
+ the material (e.g. Web or Email); for websites,
+ the content, if unclear
+%o organization &ndash; for internet sites, the organization, group
+ or sponsor of the site
+%a access date &ndash; for internet sites, the date of access
+%u URL &ndash; for internet sites, the full URL
+<a class="quick" href="#K">%K</a> keywords &ndash; words that help clear up ambiguities in
+ the database
+</span>
+</div>
+
+<h3 id="fields-specifics" class="docs">Field identifiers: specifics, usage and examples</h3>
+
+<h4 id="A" class="docs fields">%A &ndash; author field</h4>
+
+<p>
+For multiple authors, enter each in a separate <kbd>%A</kbd>
+field in the order in which they should appear. If the author on
+the title page is the editor (say, a book of short stories edited by
+Ray Bradbury), add <kbd>, ed.</kbd> to the end of the
+<kbd>%A</kbd> field, like this:
+<br/>
+<span class="pre-in-pp">
+ %A Ray Bradbury, ed.
+</span>
+Do not use the <kbd>%E</kbd> field in these instances. If the work
+has several such editors, enter each in a separate <kbd>%A</kbd>
+field, as for multiple authors, and add <kbd>, eds.</kbd> to the
+last one, like this:
+<br/>
+<span class="pre-in-pp">
+ %A Jane Dearborne
+ %A Bill Parsons, eds.
+</span>
+</p>
+
+<h4 id="Q" class="docs fields">%Q &ndash; exceptional entries</h4>
+
+<p>
+Sometimes, a work has no author or title information, for example a
+book review in a newspaper. In such cases, use <kbd>%Q</kbd>, like
+this:
+<br/>
+<span class="pre-in-pp">
+ %Q Rev. of \*[IT]Mean Streets Omnibus\*[PREV], ed. Raymond Hammett
+ %M Times Literary Supplement
+ %D 7 July 1972
+</span>
+</p>
+
+<h4 id="m" class="docs fields">%m &ndash; multiple authors (et al.)</h4>
+
+<p>
+Whenever it&#8217;s desirable to abbreviate a list of authors with
+&#8220;et al.&#8221; enter it in the <kbd>%m field</kbd>, like this:
+<br/>
+<span class="pre-in-pp">
+ %A Paul Lauter
+ %A Doug Scofield
+ %m et al.
+</span>
+</p>
+
+<h4 id="i" class="docs fields">%i &ndash; idem</h4>
+
+<p>
+Whenever there are several works by the same author, fill out the
+<kbd>%A</kbd> field with the author&#8217;s name and follow it with the
+<kbd>%i idem</kbd>, like this:
+<br/>
+<span class="pre-in-pp">
+ %A Jonathon Schmidt
+ %i idem
+</span>
+Per MLA style, the author&#8217;s name will be replaced by a long dash.
+</p>
+
+<p>
+If it&#8217;s necessary to state the role the author served (say,
+editor or translator), fill out the <kbd>%i</kbd> field with the
+information minus <kbd>idem</kbd>, like this:
+<br/>
+<span class="pre-in-pp">
+ %A Ray Bradbury
+ %i ed.
+ %T Timeless Stories for Today and Tomorrow
+</span>
+</p>
+
+<h4 id="p" class="docs fields">%p &ndash; post-author information</h4>
+
+<p>
+When citing from a preface, foreword, introduction, afterword,
+or appendix, MLA requires that the information come between the
+author&#8217;s name and the work&#8217;s title, like this:
+<br/>
+<span class="pre-in-pp">
+ %A Martin Packham, Jr.
+ %p appendix
+ %T Why the West was Won
+</span>
+Do not capitalize the first word in the <kbd>%p</kbd> field unless
+it is a proper noun.
+</p>
+
+<h4 id="q" class="docs fields">%q &ndash; force title into double-quotes</h4>
+
+<p>
+Occasionally, you may not be able to use <kbd>%T</kbd> for the
+title because doing so will cause it to come out in italics when
+double-quotes are called for. An example of this is when citing
+from a dissertation. Use <kbd>%q</kbd> to get around the problem,
+like this:
+<br/>
+<span class="pre-in-pp">
+ %A Carol Sakala
+ %q Maternity Care Policy in the United States
+ %O diss., Boston U, 1993
+</span>
+</p>
+
+<h4 id="E" class="docs fields">%E &ndash; editor</h4>
+
+<p>
+Use this only if the author and the editor are not one in the same,
+e.g.
+<br/>
+<span class="pre-in-pp">
+ %A Geoffrey Chaucer
+ %T The Works of Geoffrey Chaucer
+ %E F. W. Robinson
+</span>
+</p>
+
+<h4 id="l" class="docs fields">%l &ndash; translator</h4>
+
+<p>
+If there is more than one translator, enter all the names, with
+appropriate conjunctions and punctuation, like this:
+<br/>
+<span class="pre-in-pp">
+ %A Feodor Dostoevsky
+ %T Crime and Punishment
+ %l Jessie Coulson, Marjorie Benton, and George Bigian
+</span>
+</p>
+
+<h4 id="O" class="docs fields">%O &ndash; other</h4>
+
+<p>
+Occasionally, MLA requires additional information after the title
+but before the publication data (city/publisher/date), for instance,
+the number of volumes in a series, or the fact that the work cited
+is a dissertation. Here are two examples:
+<br/>
+<span class="pre-in-pp">
+ %A Arthur M. Schlesinger
+ %T History of U.S. Political Parties
+ %O 4 vols.
+ %C New York
+ %I Chelsea
+ %D 1973
+
+ %A Carol Sakala
+ %q Maternity Care Policy in the United States
+ %O diss., Boston U, 1993
+</span>
+Do not capitalize the first word of the <kbd>%O</kbd> field unless
+it is a proper noun.
+</p>
+
+<p>
+Generally, consider <kbd>%O</kbd> a catch-all for information that
+does not match the criterion of any existing field identifier.
+</p>
+
+<h4 id="C" class="docs fields">%C &ndash; city</h4>
+
+<p>
+Normally, <kbd>%C</kbd> takes the name of the city of publication,
+and that&#8217;s all. In the case of a republished book, if new material
+has been added, put such information in the <kbd>%C</kbd>
+field, like this:
+<br/>
+<span class="pre-in-pp">
+ %A Theodore Dreiser
+ %T Sister Carrie
+ %d 1900
+ %C Introd. E. L. Doctorow, New York
+</span>
+</p>
+
+<h4 id="d" class="docs fields">%d &ndash; original date of publication</h4>
+
+<p>
+Normally, all that is required in the <kbd>%d</kbd> field is the
+original date of publication. However, if supplementary original
+publication data is desired, include it in the field, like this:
+<br/>
+<span class="pre-in-pp">
+ %A Kazuo Ishiguro
+ %T The Remains of the Day
+ %d London: Faber, 1989
+ %C New York
+ %I Knopf
+ %D 1990
+</span>
+</p>
+
+<h4 id="K" class="docs fields">%K &ndash; keywords</h4>
+
+<p>
+<kbd>Refer</kbd> hates ambiguity, and complains when encountering
+it. Ambiguities result from the duplication of any word in more
+than one database record when that word is used to identify a
+reference in your input file. Use <kbd>%K</kbd> to create unique
+keywords found nowhere else in the database.
+</p>
+
+<p>
+Imagine, for example, that your database contains records for
+Ray Bradbury&#8217;s <i>The Illustrated Man</i>, another record for
+<i>The Illustrated Bradbury</i> and a third for <i>Bradbury,
+Illustrated</i>. <kbd>%K</kbd> can be used to clear up any
+ambiguities by assigning a unique word to each record, for example
+<kbd>%K ill-man</kbd> for the first, <kbd>%K ill-brad</kbd> for the
+second, and <kbd>%K brad-ill</kbd> for the third.
+</p>
+
+<h4 id="P" class="docs fields">%P &ndash; pages</h4>
+
+<p>
+When citing page numbers, which is often the case with footnotes
+and endnotes, it is not necessary to put the numbers in the database
+records. The <kbd>%P</kbd> field can be added underneath the
+keyword(s) in the <kbd>.[</kbd> / <kbd>.]</kbd> entries in your
+input file, allowing you to recycle database records. For example,
+<br/>
+<span class="pre-in-pp">
+ %A Frye
+ %T Anatomy
+ %K frye-anat
+</span>
+could be your short record for Northrop Frye&#8217;s <i>The Anatomy of
+Criticism</i>. Any time you wanted to cite a particular page or
+range of pages from that work in a footnote or endnote, you can
+put
+<br/>
+<span class="pre-in-pp">
+ .REF
+ .[
+ frye-anat
+ %P 67-8
+ .]
+ .REF
+</span>
+in your input file, and have it show up with the correct page(s).
+</p>
+
+<h4 id="n" class="docs fields">%n &ndash; annotations</h4>
+
+<p>
+Annotations come at the very end of references. Capitalize all
+words that require it, including, for bibliographic references (but not
+for footnotes/endnotes) the first.
+</p>
+
+<div class="rule-short"><hr/></div>
+
+<div class="macro-list-container">
+<h3 id="index-ref" class="macro-list">The bibliography and reference macros</h3>
+<ul class="macro-list">
+ <li><a href="#ref">REF</a> &ndash; begin/end a <kbd>refer</kbd> reference that will go in a footnote or endnote</li>
+ <li><a href="#footnote-refs">FOOTNOTE_REFS</a> &ndash; instruct mom to put REFs in footnotes</li>
+ <li><a href="#endnote-refs">ENDNOTE_REFS</a> &ndash; instruct mom to put REFs in endnotes</li>
+ <li><a href="#indent-refs">INDENT_REFS</a> &ndash; manage indenting of references, per MLA standards</li>
+ <li><a href="#hyphenate-refs">HYPHENATE_REFS</a> &ndash; enable/disable hyphenation of references</li>
+ <li><a href="#bibliography">BIBLIOGRAPHY</a> &ndash; begin a bibliography</li>
+ <li><a href="#bibliography-type">BIBLIOGRAPHY_TYPE</a> &ndash; plain, or numbered list bibliography</li>
+ <li><a href="#biblio-control">Bibliography control macros and defaults</a></li>
+</ul>
+</div>
+
+<!-- -REF- -->
+
+<div class="macro-id-overline">
+<h3 id="ref" class="macro-id">Begin/end a reference that goes in a footnote or endnote</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>REF</b>
+</div>
+
+<p>
+The macro REF tells mom that what follows is
+<kbd>refer</kbd>-specific, a keyword-identified reference to a
+<kbd>refer</kbd> database record. Depending on whether you&#8217;ve issued
+a
+<kbd><a href="#footnote-refs">.FOOTNOTE_REFS</a></kbd>
+or
+<kbd><a href="#endnote-refs">.ENDNOTE_REFS</a></kbd>
+instruction, the reference will be formatted and placed in a
+footnote, or collected for output in the endnotes. Parenthetical
+insertion of references into the text do not require
+<kbd>.REF</kbd> (see
+<a href="#parenthetical">Inserting parenthetical references into the text</a>.)
+</p>
+
+<p>
+Before you use REF, you must create a <kbd>refer</kbd> block
+containing <kbd>refer</kbd> commands (see
+<a href="#rcommands-ref">Required refer commands</a>
+in the tutorial, above).
+</p>
+
+<p>
+REF usage always looks like this:
+<br/>
+<span class="pre-in-pp">
+ .REF
+ .[
+ keyword(s)
+ .]
+ .REF
+</span>
+Notice that REF &#8220;brackets&#8221; the <kbd>refer</kbd> instructions,
+and never takes an argument.
+</p>
+
+<p>
+What REF really is is a convenience. One could, for example, put a
+reference in a footnote by doing
+<br/>
+<span class="pre-in-pp">
+ .FOOTNOTE
+ .[
+ keyword(s)
+ .]
+ .FOOTNOTE OFF
+</span>
+However, if you have a lot of references going into footnotes (or
+endnotes), it&#8217;s much shorter to type <kbd>.REF/.REF</kbd>
+than <kbd>.FOOTNOTE/.FOOTNOTE&nbsp;OFF</kbd>. It also helps you
+distinguish&mdash;visually, in your input file&mdash;between
+footnotes (or endnotes) which are references, and footnotes (or
+endnotes) which are explanatory, or expand on the text.
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span>
+If you&#8217;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
+<a href="docelement.html#footnote">FOOTNOTE</a>.
+</p>
+
+<p class="tip-bottom">
+<span class="additional-note">Additional note:</span>
+REF behaves identically to
+<a href="docelement.html#footnote">FOOTNOTE</a>
+or
+<a href="docelement.html#footnote">ENDNOTE</a>,
+so please read the HYPER IMPORTANT NOTE found in the document entry
+for
+<a href="docelement.html#footnote-note">FOOTNOTE</a>
+and/or
+<a href="docelement.html#endnote-note">ENDNOTE</a>
+for instructions on correct entry of text preceding and following REF.
+</p>
+</div>
+
+<!-- -FOOTNOTE_REFS- -->
+
+
+<div class="macro-id-overline">
+<h3 id="footnote-refs" class="macro-id">Instruct mom to put references in footnotes</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>FOOTNOTE_REFS</b>
+</div>
+
+<p>
+FOOTNOTE_REFS is an instruction to
+<a href="#ref">REF</a>,
+saying, &#8220;put all subsequent references bracketed by the REF
+macro into footnotes.&#8221; You invoke it by itself, with no
+argument.
+</p>
+
+<p>
+When FOOTNOTE_REFS is in effect, regular footnotes, (i.e.
+those introduced with <kbd>.FOOTNOTE</kbd> and terminated with
+<kbd>.FOOTNOTE OFF</kbd>) continue to behave normally.
+</p>
+
+<p>
+You may switch between FOOTNOTE_REFS and
+<a href="#endnote-refs">ENDNOTE_REFS</a>
+at any time.
+</p>
+
+<p>
+By default, FOOTNOTE_REFS sets the
+<a href="docelement.html#footnote-marker-style">FOOTNOTE_MARKER_STYLE</a>
+to <kbd>NUMBER</kbd> (i.e. superscript numbers). You may change
+change that if you wish by invoking FOOTNOTE_MARKER_STYLE, with the
+argument you want, after FOOTNOTE_REFS.
+</p>
+
+<p>
+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
+<a href="docelement.html#footnotes-run-on">FOOTNOTES_RUN_ON</a>
+in conjunctions with FOOTNOTE_REFS.
+</p>
+
+<!-- -ENDNOTE_REFS- -->
+
+<div class="macro-id-overline">
+<h3 id="endnote-refs" class="macro-id">Instruct mom to put references in endnotes</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>ENDNOTE_REFS</b>
+</div>
+
+<p>
+ENDNOTE_REFS is an instruction to
+<a href="#ref">REF</a>,
+saying, &#8220;add all subsequent references bracketed by the REF
+macro to endnotes.&#8221; You invoke it by itself, with no argument.
+</p>
+
+<p>
+When ENDNOTE_REFS is in effect, mom continues to format regular
+endnotes, (i.e. those introduced with <kbd>.ENDNOTE</kbd> and
+terminated with <kbd>.ENDNOTE&nbsp;OFF</kbd>) in the normal way.
+</p>
+
+<p>
+You may switch between ENDNOTE_REFS and
+<a href="#footnote-refs">FOOTNOTE_REFS</a>
+at any time.
+</p>
+
+<!-- -INDENT_REFS- -->
+
+<div class="macro-id-overline">
+<h3 id="indent-refs" class="macro-id">Manage indenting of references, per MLA standards</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>INDENT_REFS</b> <kbd class="macro-args">FOOTNOTE | ENDNOTE | BIBLIO &lt;indent&gt; </kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;<kbd style="font-style: normal;">&lt;indent&gt;</kbd> requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+MLA-style requires that footnote or endnote references should
+have their first lines indented, whereas bibliographic references
+should have their second and subsequent lines indented. Thus, if
+you invoke INDENT_REFS with a first argument of <kbd>FOOTNOTE</kbd>
+or <kbd>ENDNOTE</kbd>, the value you give to
+<kbd>&lt;indent&gt;</kbd> sets the indent of the first line for
+those types of references; if you invoke it with <kbd>BIBLIO</kbd>,
+the value you give <kbd>&lt;indent&gt;</kbd> sets the indent of
+second and subsequent lines in bibliographies.
+</p>
+
+<p>
+By default, the indent for all three types of references is 1/2-inch
+for
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPEWRITE</kbd></a>
+and 2
+<a href="definitions.html#em">ems</a>
+for
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPESET</kbd></a>.
+</p>
+
+<p>
+If you&#8217;d like to change the indent for footnote, endnote or
+bibliography references, just invoke <kbd>.INDENT_REFS</kbd> with
+a first argument saying which one you want the indent changed for, and
+a second argument saying what you&#8217;d like the indent to be.
+For example, if you want the second-line indent of references on a
+bibliography page to be 3
+<a href="definitions.html#picas-points">picas</a>,
+<br/>
+<span class="pre-in-pp">
+ .INDENT_REFS BIBLIO 3P
+</span>
+is how you&#8217;d set it up.
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="tip">Tip:</span>
+If you are identifying endnotes by line number
+(<a href="docelement.html#endnote-marker-style">ENDNOTE_MARKER_STYLE&nbsp;<kbd>LINE</kbd></a>)
+and have instructed mom to put references bracketed by
+<kbd><a href="#ref">.REF</a></kbd>
+into endnotes (with
+<a href="#endnote-refs">ENDNOTE_REFS</a>),
+you will almost certainly 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.
+</p>
+
+<p>
+The same advice applies to references in endnotes when you have enabled
+<br/>
+<span class="pre-in-pp">
+ <a href="docelement.html#endnote-numbers-align-left">.ENDNOTE_NUMBERS_ALIGN_LEFT</a>
+</span>
+in favour of mom&#8217;s default, which is to align them right.
+Study the output to determine what size of second-line indent works
+best.
+</p>
+
+<p class="tip-bottom">
+<i>(Frankly, endnote references formatted in MLA-style combined with
+left-aligned endnote numbers is a no-win situation, and so is best
+avoided. Wherever you set the indent, you&#8217;ll end up with the
+endnote numbers appearing to hang into the left margin, so you might
+as well have them hang, as is the case with
+<kbd style="font-style: normal;">.ENDNOTE_NUMBERS_ALIGN_RIGHT</kbd>.</i>&nbsp;&nbsp;&ndash;&nbsp;Ed.)
+</p>
+</div>
+
+<!-- -HYPHENATE_REFS- -->
+
+<div class="macro-id-overline">
+<h3 id="hyphenate-refs" class="macro-id">Enable/disable hyphenation of references</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>HYPHENATE_REFS</b> <kbd class="macro-args">&lt;toggle&gt;</kbd>
+</div>
+
+<p>
+If you have hyphenation turned on for a document (see
+<a href="typesetting.html#hy">HY</a>),
+and in most cases you probably do, mom will hyphenate references
+bracketed by the
+<a href="#ref">REF</a>
+macro. Since references typically contain quite a lot of proper
+names, which shouldn&#8217;t be hyphenated, you may want to disable
+hyphenation for references.
+</p>
+
+<p>
+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 (<kbd>OFF</kbd>, <kbd>NO</kbd>,
+<kbd>X</kbd>, etc.) will disable automatic hyphenation for
+references bracketed by REF.
+</p>
+
+<p>
+An alternative to turning reference hyphenation off is to prepend
+to selected proper names in your <kbd>refer</kbd> database
+the groff
+<a href="definitions.html#discretionaryhyphen">discretionary hyphen</a>
+character, <kbd>\%</kbd>. (See
+<a href="#ref-disc-hy">here</a>
+in the tutorial for an example.)
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+References embedded in the body of a document are considered part of
+<a href="definitions.html#running">running text</a>,
+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
+<a href="typesetting.html#hy">HY</a>,
+like this:
+<br/>
+<span class="pre-in-pp">
+ .HY OFF
+ .[
+ keyword(s)
+ .]
+ .HY
+</span>
+Alternatively, sprinkle your database fields liberally with
+<kbd>\%</kbd>.
+</p>
+</div>
+
+<!-- -BIBLIOGRAPHY- -->
+
+<div class="macro-id-overline">
+<h3 id="bibliography" class="macro-id">Begin a bibliography</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>BIBLIOGRAPHY</b> <kbd class="marco-args">toggle</kbd>
+</div>
+
+<p>
+To append a bibliography to your document, whether of references
+inserted parenthetically into text or a comprehensive reading list
+derived from a large <kbd>refer</kbd> database, all you need
+do is invoke <kbd>.BIBLIOGRAPHY</kbd>. <kbd>.BIBLIOGRAPHY</kbd>
+breaks to a new page, prints the title (BIBLIOGRAPHY by default, but
+that can be changed), and awaits <kbd>refer</kbd> instructions. How
+to create bibliographies is covered in the tutorial section,
+<a href="#bibliography-from-embedded">Generating a bibliography from parenthetical insertions</a>
+and
+<a href="#bibliography-recipe">Generating a comprehensive bibliography</a>.
+When all the required data has been entered, type
+<br/>
+<span class="pre-in-pp">
+ .BIBLIOGRAPHY OFF
+</span>
+to complete the bibliography.
+</p>
+
+<p>
+See the
+<a href="#biblio-control">Bibliography control macros and defaults</a>
+for macros to tweak, design and control the appearance of
+bibliography pages.
+</p>
+
+<!-- -BIBLIOGRAPHY_TYPE- -->
+
+<div class="macro-id-overline">
+<h3 id="bibliography-type" class="macro-id">Plain, or numbered list bibliography</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>BIBLIOGRAPHY_TYPE</b> <kbd class="macro-args">PLAIN | LIST [ &lt;list separator&gt; ] [ &lt;list prefix&gt; ]</kbd>
+</div>
+
+<p>
+Mom offers two styles of bibliography output: plain, or numbered
+list style. With the argument, <kbd>PLAIN</kbd>, bibliography entries are output
+with no enumerators. With the argument, <kbd>LIST</kbd>, each entry is numbered.
+</p>
+
+<p>
+The two optional arguments, <kbd>&lt;list&nbsp;separator&gt;</kbd>
+and <kbd>&lt;list&nbsp;prefix&gt;</kbd> have the same meaning as the
+equivalent arguments to
+<a href="docelement.html#list">LIST</a>
+(i.e. <kbd>&lt;separator&gt;</kbd> and <kbd>&lt;prefix&gt;</kbd>).
+</p>
+
+<p>
+You may enter the BIBLIOGRAPHY_TYPE either before or after
+<kbd>.BIBLIOGRAPHY</kbd>. It must, however, always come before
+any <kbd>refer</kbd> commands. See
+<a href="#bibliography-from-embedded">Generating a bibliography from parenthetical insertions</a>
+and
+<a href="#bibliography-recipe">Generating a comprehensive bibliography</a>.
+</p>
+
+<p>
+Mom&#8217;s default BIBLIOGRAPHY_TYPE is <kbd>PLAIN</kbd>.
+</p>
+
+<!-- -BIBLIO_CONTROL- -->
+
+<div class="defaults-container" style="background-color: #ded4bd; border: none;">
+<h3 id="biblio-control" class="docs defaults">Bibliography control macros and defaults</h3>
+
+<p style="margin-top: .25em; margin-left: 9px;">
+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.
+</p>
+
+<ol style="margin-top: -.5em; padding-bottom: .5em;">
+ <li><a href="#biblio-general"><b>General bibliography style control</b></a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#biblio-style">Base family/font/quad</a></li>
+ <li><a href="#biblio-pt-size">Base point size</a></li>
+ <li><a href="#biblio-lead">Leading</a></li>
+ <li><a href="#biblio-spacing">Adjust the space between bibliography entries</a></li>
+ <li><a href="#singlespace-biblio">Singlespace bibliographies (for TYPEWRITE only)</a></li>
+ <li><a href="#biblio-no-columns">Turning off column mode during bibliography output</a></li>
+ </ul></li>
+ <li><a href="#biblio-pagination"><b>Pagination of bibliographies</b></a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#biblio-pagenum-style">Page numbering style</a></li>
+ <li><a href="#biblio-first-pagenumber">Setting the first page number of bibliographies</a></li>
+ <li><a href="#biblio-no-first-pagenum">Omitting a page number on the first page of bibliographies</a></li>
+ <li><a href="#suspend-pagination">Suspending pagination during bibliography output</a></li>
+ </ul></li>
+ <li><a href="#biblio-header-control"><b>Header/footer control</b></a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#biblio-modify-hdrftr">Modifying what goes in bibliography headers/footers</a></li>
+ <li><a href="#biblio-hdrftr-center">Header/footer centre string when doctype is CHAPTER</a></li>
+ <li><a href="#biblio-allows-headers">Allow headers on bibliography pages</a></li>
+ </ul></li>
+ <li><a href="#biblio-main-title"><b>Bibliography first-page title control</b></a>
+ <ul>
+ <li><a href="#biblio-string">Title string</a></li>
+ <li><a href="#biblio-string-control">Title string control macros and defaults</a></li>
+ <li><a href="#biblio-string-placement">Title string placement</a></li>
+ <li><a href="#biblio-string-underline">Title string underscoring</a></li>
+ <li><a href="#biblio-string-caps">Title string capitalization</a></li>
+ </ul></li>
+</ol>
+</div>
+
+<h4 id="biblio-general" class="docs" style="margin-top: -1.5em; margin-bottom: .5em;">1. General bibliography page style control</h4>
+
+<h5 id="biblio-style" class="docs" style="margin-top: 0; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Base family/font/quad</h5>
+
+<div class="defaults-container" style="padding-bottom: 8px;">
+<p class="defaults" style="padding-top: 6px;">
+See
+<a href="#control-macro-args">Arguments to the control macros</a>.
+</p>
+<span class="pre defaults">
+.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 (LEFT) or J (JUSTIFIED);
+ R (RIGHT) and C (CENTER) will not work.
+</span>
+</div>
+
+<!-- -BIBLIO_PT_SIZE- -->
+
+<h5 id="biblio-pt-size" class="docs" style="margin-top: -1.5em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Base point size</h5>
+
+<div class="box-macro-args">
+Macro: <b>BIBLIOGRAPHY_PT_SIZE</b> <kbd class="macro-args">&lt;base type size of bibliography&gt;</kbd>
+</div>
+
+<p>
+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
+<a href="definitions.html#picaspoints">points</a>,
+unless you append an alternative
+<a href="definitions.html#unitofmeasure">unit of measure</a>.
+For example,
+<br/>
+<span class="pre-in-pp">
+ .BIBLIOGRAPHY_PT_SIZE 12
+</span>
+sets the base point size of type on the bibliography page to 12
+points, whereas
+<br/>
+<span class="pre-in-pp">
+ .BIBLIOGRAPHY_PT_SIZE .6i
+</span>
+sets the base point size of type on the bibliography page to 1/6 of an
+inch.
+</p>
+
+<p>
+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.
+</p>
+
+<p>
+The default for
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPESET</kbd></a>
+is 12.5 points (the same default size used in the body of the
+document).
+</p>
+
+<!-- -BIBLIO_LEAD- -->
+
+<h5 id="biblio-lead" class="docs" style="margin-top: -.5em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Leading</h5>
+
+<div class="box-macro-args">
+Macro: <b>BIBLIOGRAPHY_LEAD</b> <kbd class="macro-args">&lt;base leading of bibliographies&gt; [ ADJUST ]</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Does not require a <a href="definitions.html#unitofmeasure">unit of measure</a>; points is assumed
+</p>
+
+<p>
+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
+<a href="definitions.html#leading">leading</a>
+of bibliographies in
+<a href="definitions.html#picaspoints">points</a>
+unless you append an alternative
+<a href="definitions.html#unitofmeasure">unit of measure</a>.
+For example,
+<br/>
+<span class="pre-in-pp">
+ .BIBLIOGRAPHY_LEAD 14
+</span>
+sets the base leading of type on the bibliography page to 14
+points, whereas
+<br/>
+<span class="pre-in-pp">
+ .BIBLIOGRAPHY_LEAD .5i
+</span>
+sets the base leading of type on the bibliography page to 1/2 inch.
+</p>
+
+<p>
+If you want the leading of bibliographies adjusted to fill the page,
+pass BIBLIOGRAPHY_LEAD the optional argument,
+<kbd>ADJUST</kbd>. (See
+<a href="docprocessing.html#doc-lead-adjust">DOC_LEAD_ADJUST</a>
+for an explanation of leading adjustment.)
+</p>
+
+<p>
+The default for
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPESET</kbd></a>
+is the prevailing document lead (16 by default), adjusted.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Even if you give mom a <kbd>.DOC_LEAD_ADJUST&nbsp;OFF</kbd> command,
+she will still, by default, adjust bibliography leading. You
+<i>must</i> enter <kbd>BIBLIOGRAPHY_LEAD&nbsp;&lt;lead&gt;</kbd>
+with no <kbd>ADJUST</kbd> argument to disable this default
+behaviour.
+</p>
+</div>
+
+<!-- -BIBLIO_SPACING- -->
+
+<h5 id="biblio-spacing" class="docs" style="margin-top: -.5em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Adjust the space between bibliography entries</h5>
+
+<div class="box-macro-args">
+Macro: <b>BIBLIOGRAPHY_SPACING</b> <kbd class="macro-args">&lt;amount of space&gt; </kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+By default, mom inserts no space between bibliography entries.
+If you&#8217;d prefer she add some, instruct her to do so with
+BIBLIOGRAPHY_SPACING. Say, for example, you want a half a linespace
+between entries,
+<br/>
+<span class="pre-in-pp">
+ .BIBLIOGRAPHY_SPACING .5v
+</span>
+would do the trick.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+As with endnotes pages, inserting space between bibliography entries
+will most likely result in hanging bottom margins.
+</p>
+</div>
+
+<!-- -SINGLESPACE_BIBLIO- -->
+
+<h5 id="singlespace-biblio" class="docs" style="margin-top: -.5em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Singlespace bibliography (TYPEWRITE only)</h5>
+
+<div class="box-macro-args">
+Macro: <b>SINGLESPACE_BIBLIOGRAPHY</b> <kbd class="macro-args">&lt;toggle&gt;</kbd>
+</div>
+
+<p>
+If your
+<a href="docprocessing.html#printstyle">PRINTSTYLE</a>
+is <kbd>TYPEWRITE</kbd> and you use TYPEWRITE&#8217;s default
+double-spacing, bibliographies are double-spaced. If your document
+is single-spaced, bibliographies are single-spaced.
+</p>
+
+<p>
+If, for some reason, you&#8217;d prefer that bibliographies be
+single-spaced in an otherwise double-spaced document (including
+double-spaced
+<a href="rectoverso.html#collate">collated</a>
+documents), invoke <kbd>.SINGLESPACE_BIBLIOGRAPHY</kbd> with no
+argument.
+</p>
+
+<!-- -BIBLIO_NO_COLUMNS- -->
+
+<h5 id="biblio-no-columns" class="docs" style="margin-top: -.5em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Turning off column mode during bibliography output</h5>
+
+<div class="box-macro-args">
+Macro: <b>BIBLIOGRAPHY_NO_COLUMNS</b> <kbd class="macro-args">&lt;toggle&gt;</kbd>
+</div>
+
+<p>
+By default, if your document is set in
+<a href="docprocessing.html#columns">columns</a>,
+mom sets the bibliographies in columns, too. However, if your
+document is set in columns and you&#8217;d like the bibliographies
+not to be, just invoke <kbd>.BIBLIOGRAPHY_NO_COLUMNS</kbd> with
+no argument. The bibliography pages will be set to the full page
+measure of your document.
+</p>
+
+<p>
+If you output bibliographies at the end of each document in a
+<a href="rectoverso.html#collate">collated</a>
+document set in columns, column mode will automatically be
+reinstated for each document, even with BIBLIOGRAPHY_NO_COLUMNS
+turned on. In such circumstances, you must re-enable
+BIBLIOGRAPHY_NO_COLUMNS for each separate collated document.
+</p>
+
+<h4 id="biblio-pagination" class="docs" style="margin-bottom: .5em;">2. Pagination of bibliographies</h4>
+
+<!-- -BIBLIO_PAGENUM_STYLE- -->
+
+<h5 id="biblio-pagenum-style" class="docs" style="margin-top: 0; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Page numbering style</h5>
+
+<div class="box-macro-args">
+Macro: <b>BIBLIOGRAPHY_PAGENUM_STYLE</b> <kbd class="macro-args">DIGIT | ROMAN | roman | ALPHA | alpha</kbd>
+</div>
+
+<p>
+Use this macro to set the page numbering style of bibliography
+pages. The arguments are identical to those for
+<a href="headfootpage.html#pagenum-style">PAGENUM_STYLE</a>.
+The default is <kbd>digit</kbd>. You may want to change it to, say,
+<kbd>alpha</kbd>, which you would do with
+<br/>
+<span class="pre-in-pp">
+ .BIBLIOGRAPHY_PAGENUM_STYLE alpha
+</span>
+</p>
+
+<!-- -BIBLIO_FIRST_PAGENUMBER- -->
+
+<h5 id="biblio-first-pagenumber" class="docs" style="margin-top: -.5em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Setting the first page number of bibliographies</h5>
+
+<div class="box-macro-args">
+Macro: <b>BIBILOGRAPHY_FIRST_PAGENUMBER</b> <kbd class="macro-args">&lt;page # that appears on page 1 of bibliographies&gt;</kbd>
+</div>
+
+<p>
+Use this macro with caution. If the bibliography for a
+<a href="rectoverso.html#collate">collated</a>
+document is to be output at the document&#8217;s end,
+BIBLIOGRAPHY_FIRST_PAGENUMBER tells mom what page number to put on
+the first page of the bibliography.
+</p>
+
+<p>
+However, if you&#8217;re outputting a bibliography at the end of each
+section (chapter, article, etc) of a collated document,
+you have to reset every section&#8217;s first page number after
+<a href="rectoverso.html#collate">COLLATE</a>
+and before
+<a href="docprocessing.html#start">START</a>.
+</p>
+
+<!-- -BIBLIO_NO_FIRST_PAGENUN- -->
+
+<h5 id="biblio-no-first-pagenum" class="docs" style="margin-top: -.25em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Omitting a page number on the first page of bibliographies</h5>
+
+<div class="box-macro-args">
+Macro: <b>BIBLIOGRAPHY_NO_FIRST_PAGENUM</b> <kbd class="macro-args">&lt;toggle&gt;</kbd>
+</div>
+
+<p>
+This macro is for use only if
+<a href="headfootpage.html#footers">FOOTERS</a>
+are on. It tells
+<kbd><a href="#bibliography">BIBLIOGRAPHY</a></kbd>
+not to print a page number on the first bibliography page.
+Mom&#8217;s default is to print the page number.
+</p>
+
+<!-- -SUSPEND_PAGINATION- -->
+
+<h5 id="suspend-pagination" class="docs" style="margin-top: -.5em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Suspending pagination during bibliography output</h5>
+
+<div class="box-macro-args" style="margin-bottom: 1em;">
+Macro: <b>SUSPEND_PAGINATION</b>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>RESTORE_PAGINATION</b>
+</div>
+
+<p>
+SUSPEND_PAGINATION doesn&#8217;t take an argument. Invoked
+immediately prior to
+<kbd><a href="#bibliography">BIBLIOGRAPHY</a></kbd>,
+it turns off pagination for the duration of the bibliography. Mom
+continues, however to increment page numbers silently.
+</p>
+
+<p>
+To restore normal document pagination after bibliographies, invoke
+<kbd>.RESTORE_PAGINATION</kbd> (again, with no argument) immediately
+after you&#8217;ve finished with your bibliography.
+</p>
+
+<h4 id="biblio-header-control" class="docs" style="margin-bottom: .5em;">3. Header/footer control</h4>
+
+<h5 id="biblio-modify-hdrftr" class="docs" style="margin-top: 0; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Modifying what goes in the bibliography header/footer</h5>
+
+<p style="margin-top: 0">
+If you wish to modify what appears in the header/footer that appears
+on bibliography pages, make the changes before you invoke
+<a href="#bibliography"><kbd>.BIBLIOGRAPHY</kbd></a>,
+not afterwards.
+</p>
+
+<p>
+Except in the case of
+<a href="docprocessing.html#doctype">DOCTYPE <kbd>CHAPTER</kbd></a>,
+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&#8217; headers/footers, or
+you would like her to add one in cases where there hasn&#8217;t been
+one before (e.g. DOCTYPE DEFAULT) invoke
+<kbd><a href="#bibliography-hdrftr-center">.BIBLIOGRAPHY_HEADER_CENTER</a></kbd>
+with no argument.
+</p>
+
+<p>
+An important change you may want to make is to put the word
+&#8220;Bibliography&#8221; in the header/footer centre position. To
+do so, invoke
+<br/>
+<span class="pre-in-pp" style="margin-bottom: -1em;">
+ .BIBLIOGRAPHY_HEADER_CENTER
+ .HEADER_CENTER "Bibliography"
+</span>
+or
+<span class="pre-in-pp" style="margin-top: -.5em;">
+ .BIBLIOGRAPHY_FOOTER_CENTER
+ .FOOTER_CENTER "Bibliography"
+</span>
+prior to invoking <kbd>.BIBLIOGRAPHY</kbd>.
+</p>
+
+<div class="box-important">
+<p class="tip">
+<span class="important">Important:</span>
+Unless you have a running centre string in your headers or footers, you must invoke
+<span class="pre-in-pp" style="margin-top: -.5em;">
+ <a href="#endnotes-hdrftr-center">.BIBLIOGRAPHY_HEADER_CENTER</a>
+</span>
+or
+<span class="pre-in-pp" style="margin-top: -.5em;">
+ <a href="#endnotes-hdrftr-center">.BIBLIOGRAPHY_FOOTER_CENTER</a>
+</span>
+in order for the centre string to appear, as demonstrated above.
+</p>
+</div>
+
+<h5 id="biblio-hdrftr-center" class="docs" style="margin-top: 0; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Header/footer centre string when doctype is CHAPTER</h5>
+
+<div class="box-macro-args">
+Macro: <b>BIBLIOGRAPHY_HEADER_CENTER</b> <kbd class="macro-args">toggle</kbd>
+</div>
+
+<p>
+If your
+<a href="docprocessing.html#doctype">DOCTYPE</a>
+is <kbd>CHAPTER</kbd> and you want mom to include a centre
+string in the headers/footers that appear on bibliography
+pages, or if you do not have a running header/footer
+centre string in the body of the document, invoke
+<kbd>.BIBLIOGRAPHY_HEADER_CENTER</kbd> (or
+<kbd>.BIBLIOGRAPHY_FOOTER_CENTER</kbd>) with no argument before
+defining the centre string . Mom&#8217;s default is NOT to print the
+centre string.
+</p>
+
+<p>
+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 (<kbd>OFF</kbd>, <kbd>QUIT</kbd>, <kbd>Q</kbd>,
+<kbd>X</kbd>...).
+</p>
+
+<h5 id="biblio-allows-headers" class="docs" style="margin-top: -.5em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Allow headers on bibliography pages</h5>
+
+<div class="box-macro-args">
+Macro: <b>BIBLIOGRAPHY_ALLOWS_HEADERS</b> <kbd class="macro-args">&lt;none&gt; | ALL</kbd>
+</div>
+
+<p>
+By default, if HEADERS are on, mom prints page headers on all
+bibliography pages except the first. If you don&#8217;t want her to
+print headers on bibliography pages, do
+<br/>
+<span class="pre-in-pp">
+ .BIBLIOGRAPHY_ALLOWS_HEADERS OFF
+</span>
+If you want headers on every page including the first, do
+<br/>
+<span class="pre-in-pp">
+ .BIBLIOGRAPHY_ALLOWS_HEADERS ALL
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+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&nbsp;OFF.
+</p>
+</div>
+
+<h4 id="biblio-main-title" class="docs">4. Bibliography first-page title control</h4>
+
+<!-- -BIBLIO_STRING- -->
+
+<h5 id="biblio-string" class="docs" style="margin-top: 1em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Title string</h5>
+
+<div class="box-macro-args">
+Macro: <b>BIBLIOGRAPHY_STRING</b> <kbd class="macro-args">&quot;&lt;title to print at the top of bibliography pages&gt;&quot;</kbd>
+</div>
+<p class="alias" style="margin-bottom: 0;">
+<i>Alias:</i> <b>BIBLIOGRAPHY_HEADER</b>
+</p>
+
+<p>
+By default, mom prints the word &#8220;BIBLIOGRAPHY&#8221; as a title
+at the top of the first page of a bibliography. If you want her to
+print something else, invoke <kbd>.BIBLIOGRAPHY_STRING</kbd> with
+the title you want, surrounded by double-quotes.
+</p>
+
+<p>
+If you don&#8217;t want a title at the top of the first bibliography
+page, invoke <kbd>.BIBLIOGRAPHY_STRING</kbd> with a blank argument
+(either two double-quotes side by
+side&mdash;<kbd>&quot;&quot;</kbd>&mdash;or no argument at all).
+</p>
+
+<!-- -BIBLIO_STRING_CONTROL- -->
+
+<h5 id="biblio-string-control" class="docs" style="margin-top: -.5em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Title string control macros and defaults</h5>
+
+<div class="defaults-container" style="padding-bottom: 8px;">
+<p class="defaults" style="padding-top: 6px;">
+See
+<a href="#control-macro-args">Arguments to the control macros</a>.
+</p>
+<span class="pre defaults">
+.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)
+</span>
+</div>
+
+<!-- -BIBLIOGRAPHY_STRING_ADVANCE- -->
+
+<h5 id="biblio-string-placement" class="docs" style="margin-top: -1em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Title string placement</h5>
+
+<div class="box-macro-args">
+Macro: <b>BIBLIOGRAPHY_STRING_ADVANCE</b> <kbd class="macro-args">&lt;distance from top of page&gt;</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Argument requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+By default, mom places the title (the docheader, as it were) of
+bibliographies (typically "BIBLIOGRAPHY") on the same
+<a href="definitions.html#baseline">baseline</a>
+that is used for the start of
+<a href="definitions.html#running">running text</a>.
+If you&#8217;d prefer another location, higher or lower on the page
+(thereby also raising or lowering the starting position of the
+bibliography itself), invoke <kbd>.BIBLIOGRAPHY_STRING_ADVANCE</kbd>
+with an argument stating the distance from the top edge of the page
+at which you&#8217;d like the title placed.
+</p>
+
+<p>
+The argument requires a unit of measure, so if you&#8217;d like the title
+to appear 1-1/2 inches from the top edge of the page, you&#8217;d tell
+mom about it like this:
+<br/>
+<span class="pre-in-pp">
+ .BIBLIOGRAPHY_STRING_ADVANCE 1.5i
+</span>
+</p>
+
+<!-- -BIBLIO_STRING_UNDERLINE- -->
+
+<h5 id="biblio-string-underline" class="docs" style="margin-top: -1em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Title string underscoring</h5>
+
+<div class="box-macro-args">
+Macro: <b>BIBLIOGRAPHY_STRING_UNDERSCORE</b> <kbd class="macro-args">[DOUBLE] [&lt;underline weight&gt; [&lt;underline gap&gt; [&lt;distance between double rules]]] | &lt;none&gt; | &lt;anything&gt;</kbd>
+</div>
+
+<p class="alias" style="margin-bottom: 0;">
+<i>Alias:</i> <b>BIBLIOGRAPHY_STRING_UNDERLINE</b>
+</p>
+
+<p class="requires">
+&bull;&nbsp;The argument
+<span style="font-style: normal"><kbd>&lt;underscore weight&gt;</kbd></span>
+must not have the
+<a href="definitions.html#unitofmeasure">unit of measure</a>,
+<span style="font-style: normal;"><kbd>p</kbd></span>, appended to it
+</p>
+
+<p>
+Invoked without an argument,
+<kbd>.BIBLIOGRAPHY_STRING_UNDERSCORE</kbd> will place a single rule
+underneath the bibliography&#8217;s first-page title. Invoked with the
+argument, <kbd>DOUBLE</kbd>, BIBLIOGRAPHY_STRING_UNDERSCORE will
+double-underscore the title. Invoked with any other non-numeric
+argument, (e.g. <kbd>OFF</kbd>, <kbd>NO</kbd>, <kbd>X</kbd>, etc.)
+the macro disables underlining of the title.
+</p>
+
+<p>
+In addition, you can use BIBLIOGRAPHY_STRING_UNDERSCORE to control
+the weight of the underscore rule(s), the gap between the title and
+the underscore, and, in the case of double-underscores, the distance
+between the two rules.
+</p>
+
+<p>
+Some examples:
+<br/>
+<span class="pre-in-pp">
+ .BIBLIOGRAPHY_STRING_UNDERLINE 1
+ - turn underlining on; set the rule weight to 1 point
+
+ .BIBLIOGRAPHY_STRING_UNDERLINE 1 3p
+ - turn underlining on; set the rule weight to 1 point; set
+ the gap between the string and the underline to 3 points
+
+ .BIBLIOGRAPHY_STRING_UNDERLINE DOUBLE .75 3p
+ - turn double-underlining on; set the rule weight to 3/4 of
+ a point; set the gap between the string and the upper
+ underline to 3 points; leave the gap between the upper
+ and the lower underline at the default
+
+ .BIBLIOGRAPHY_STRING_UNDERLINE DOUBLE 1.5 1.5p 1.5p
+ - turn double-underlining on; set the rule weight to 1-1/2
+ points; set the gap between the string and the upper
+ underline to 1-1/2 points; set the gap between the upper
+ and the lower underline to 1-1/2 points
+</span>
+Note, from the above, that in all instances, underscoring (single or
+double) is enabled whenever BIBLIOGRAPHY_STRING_UNDERSCORE is used
+in this way.
+</p>
+
+<p>
+By default, mom double-underscores the title if your
+<a href="docprocessing.html#printstyle">PRINTSTYLE</a>
+is <kbd>TYPEWRITE</kbd>.
+</p>
+
+<!-- -BIBLIO_STRING_CAPS- -->
+
+<h5 id="biblio-string-caps" class="docs" style="margin-top: -.5em; margin-bottom: .5em; margin-left: .5em;">&bull;&nbsp;Title string capitalization</h5>
+
+<div class="box-macro-args">
+Macro: <b>BIBLIOGRAPHY_STRING_CAPS</b> <kbd class="macro-args">toggle</kbd>
+</div>
+
+<p>
+Invoked by itself, <kbd>.BIBLIOGRAPHY_STRING_CAPS</kbd> will
+automatically capitalize the bibliography first-page title. Invoked
+with any other argument, the macro disables automatic capitalization
+of the title.
+</p>
+
+<p>
+If you&#8217;re generating a table of contents, you may want the
+bibliography first-page title to be in caps, but the toc entry in
+caps/lower case. If the argument to
+<kbd><a href="#bibliography-string">BIBLIOGRAPHY_STRING</a></kbd>
+is in caps/lower case and BIBLIOGRAPHY_STRING_CAPS is
+on, this is exactly what will happen.
+</p>
+
+<p>
+Mom&#8217;s default is to capitalize the bibliography first-page
+title.
+</p>
+
+<div class="rule-long"><hr/></div>
+
+<!-- Navigation links -->
+<table style="width: 100%; margin-top: 12px;">
+<tr>
+ <td style="width: 33%;"><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="width: 33%; text-align: center;"><a href="#top">Top</a></td>
+ <td style="width: 33%; text-align: right;"><a href="letters.html">Next: Writing letters</a></td>
+</tr>
+</table>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/momdoc/reserved.html b/contrib/mom/momdoc/reserved.html
new file mode 100644
index 0000000..4cdab3b
--- /dev/null
+++ b/contrib/mom/momdoc/reserved.html
@@ -0,0 +1,2736 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>Mom -- Reserved words (macros, strings, registers)</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div id="top" class="page" style="width: 800px;">
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+<tr>
+ <td><a href="toc.html">Back to Table of Contents</a></td>
+</tr>
+</table>
+
+<h1 id="reserved-words" class="docs">List of reserved words (macros, strings, registers)</h1>
+
+<p>
+The following is a list of reserved words used by mom. Before
+changing the name of any macro or document element tag with
+<a href="goodies.html#ALIAS">ALIAS</a>,
+I strongly recommend doing a search of this page for your proposed
+new name. If you find it in the left hand column, choose something
+else instead.
+</p>
+
+<p>
+Anyone interested in hacking/patching mom&#8217;s macro file
+(om.tmac) will also find this list useful since it lists most of
+the macros, strings, diversions, aliases, and number registers
+mom uses, along with brief descriptions of their functions.
+</p>
+
+<p>
+The list is not exhaustive. PDF-related macros, strings, registers,
+and diversions, as well as those associated with preprocessor
+support and &#8220;Lists of&#8221; are not included.
+</p>
+
+<div class="rule-medium"><hr/></div>
+
+<span class="pre" style="scroll: none;">
+<span style="display: block; text-decoration: underline;">TYPESETTING</span>
+<span style="display: block; margin-top: -1em;">+++MACROS+++</span>
+<span style="display: block; margin-top: -1em; margin-bottom: -1em;">*Page layout</span>
+ 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
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Page control</span>
+ DO_B_MARGIN Margin at bottom of page; trap-invoked
+ DO_T_MARGIN Margin at top of page; trap-invoked
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Style</span>
+ 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
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Autolead</span>
+ AUTOLEAD Always lead n points more than .PT_SIZE
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Quad, fill, justification</span>
+ JUSTIFY Justified text
+ QUAD Filled text, left, right, or centre
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Quad, no-fill</span>
+ CENTER Line-for-line, non-filled text, centre
+ LEFT Line-for-line, non-filled text, left
+ RIGHT Line-for-line, non-filled text, right
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Hyphenation</span>
+ HY Turn hyphenation on/off, or set LINES, MARGIN, SPACE
+ HY_SET Set LINES, MARGIN, SPACE in a single command
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Advanced style</span>
+ KERN Turn automatic kerning on or off
+ LIGATURES Turn ligatures on or off
+ SS Sentence space control
+ WS Word space control
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Line breaks</span>
+ BR Alias of br
+ EL Breaks line but doesn't advance
+ SPACE Alias of sp
+ SPREAD Alias of brp
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Vertical motions</span>
+ ALD Advance lead
+ RLD Reverse lead
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Indents</span>
+ 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
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Tabs</span>
+ ST String tab
+ TAB_SET Tab Set
+ TN Tab Next
+ TQ Tab Quit
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Columnar tabs</span>
+ MCO Turn on multi-column mode
+ MCR Return to top of column
+ MCX Turn off multi-column mode
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Underscore</span>
+ UNDERSCORE Underscores words or phrases
+ UNDERSCORE2 Double underscores words or phrases
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Underline</span>
+ UNDERLINE Underlines whole passages (Courier only)
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Smart Quotes</span>
+ SMARTQUOTES Turns smart quotes on or off
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Graphical objects</span>
+ RULE_WEIGHT Weight of rules drawn with \*[RULE]
+ DBX Draw box
+ DCL Draw circle (ellipse)
+ DRH Draw horizontal rule
+ DRV Draw vertical rule
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Misc + Support</span>
+ 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
+ SUPERSCRIPT_RAISE_AMOUNT Change default vertical displacement of superscripts
+ TRAP Turn traps off or on
+
+<span style="display: block; margin-top: -.5em; margin-bottom: -2.5em;">+++DIVERSIONS+++</span>
+
+ 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
+
+<span style="display: block; margin-top: -.5em; margin-bottom: -2.5em;">+++NUMBER REGISTERS+++</span>
+
+ #ABORT_FT_ERRORS Abort on FT errors? (boolean)
+ #ALD ALD value
+ #ARGS_TO_LIST Tells LIST whether LIST was invoked with a valid
+ arg; controls LIST OFF processing
+ #ARGS_TO_SQ Tells SMARTQUOTES whether it was invoked with a
+ valid arg; controls SMARTQUOTES OFF
+ processing
+ #AUTOLEAD_FACTOR Using FACTOR arg to AUTOLEAD? (boolean)
+ #AUTO_LEAD Using autolead? (boolean)
+ #AUTOLEAD_VALUE Auto leading value
+ #BL_INDENT Value of left indent when IB
+ #B_MARGIN Bottom margin
+ #B_MARGIN_SET Has a bottom margin been set with B_MARGIN? (boolean)
+ #BOLDER_UNITS Number of units to embolden type
+ #BR_AT_LINE_KERN Break when EW/RW are invoked? (boolean)
+ #BR_INDENT Value of right indent when IB
+ #BX_SOLID Draw box filled? (boolean)
+ c column mark
+ #CAPS_ON Is CAPS enabled? (boolean)
+ #CL_SOLID Draw circle filled? (boolean)
+ #CODE_FAM Use different family from Courier for CODE? (boolean)
+ #CODE_FT Use different font from roman for CODE? (boolean)
+ #CONDENSE Are we in pseudo-condense mode? (boolean)
+ #CONDENSE_WAS_ON For restoring \*[COND] in DROPCAP
+ #COND_WIDTH Width of pseudo-condensed type
+ (pointsize x $COND_PERCENT)
+ #CURRENT_HY \\n[.hy] when ref*normal-print called
+ #CURRENT_L_LENGTH Current line length at first invocation of LIST;
+ like #ORIG_L_LENGTH
+ #CURRENT_TAB Current tab number
+ #DC_COLOR Colorize dropcap? (boolean)
+ #DC_GUT Width of dropcap gutter
+ #DC_HEIGHT Dropcap height
+ #DC_LINES Number of lines for dropcap
+ #DEGREES # of degrees slant for pseudo-italic
+ #ENUMERATOR&lt;n&gt; Number register enumerator for depth &lt;n&gt; in lists
+ #EW Is EW in effect? (boolean)
+ #EXT_WIDTH Width of pseudo-extended type
+ (pointsize x $EXT_PERCENT)
+ #EXTEND Are we in pseudo-extend mode? (boolean)
+ #EXTEND_WAS_ON For restoring \*[EXT] in DROPCAP
+ #FILL_MODE Which fill mode are we in? ( \n[.j] )
+ #FILLED Are we in a fill mode? (boolean)
+ #H_INDENT Value of left indent when IH
+ #HL_INDENT&lt;n&gt; Hanging indent for LIST depth &lt;n&gt;
+ #HL_INDENT Value of the hang when IH
+ #HY_SET Did we manually set hyphenation parameters?
+ (boolean)
+ #HYPHEN_ADJ Amount by which to raise hyphens surrounding page
+ numbers
+ #HYPHENATE Hyphenation on? (boolean)
+ #IN_ITEM Are we in a list item? (boolean)
+ #IN_ITEM_L_INDENT Value passed to IL if #IN_ITEM=1
+ #IN_TAB Are we in a tab? (boolean)
+ Set in macro TAB; used in ST to determine
+ whether to add #ST_OFFSET to #ST&lt;n&gt;_OFFSET
+ #INDENT_ACTIVE Indicates whether an indent is active (boolean)
+ #INDENT_BOTH_ACTIVE Toggle
+ #INDENT_LEFT_ACTIVE Toggle
+ #INDENT_RIGHT_ACTIVE Toggle
+ #INDENT_STYLE_BOTH Indicates IB when #INDENT_ACTIVE=1 (boolean)
+ #INDENT_STYLE_HANG Indicates IH when #INDENT_ACTIVE=1 (boolean)
+ #INDENT_STYLE_LEFT Indicates IL when #INDENT_ACTIVE=1 (boolean)
+ #INDENT_STYLE_RIGHT Indicates IR when #INDENT_ACTIVE=1 (boolean)
+ #INDENT_STYLE_TEMP Indicates IT when #INDENT_ACTIVE=1 (boolean)
+ #IGNORE_COLUMNS Don't set document in columns (boolean)
+ #IN_DIVER Are we in a diversion? (boolean)
+ #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 (boolean)
+ #KERN Kern on? (boolean)
+ #KERN_UNIT Size of kern units (1/36 of current point size)
+ #KERN_WAS_ON Indicates kerning was on; used in list ITEMs (boolean)
+ #LAST_TAB Last tab number set in multi-columns
+ #LAST_FN_COUNT_FOR_COLS #FN_COUNT_FOR_COLS at top of HEADER
+ #LEAD Leading (alias)
+ #LIGATURES Ligatures on? (boolean)
+ #LIST_INDENT&lt;n&gt; Left indent of list &lt;n&gt;
+ #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 In EPIGRAPH, #LOOP=1 if a while loop executes;
+ otherwise 0. Elsewhere, an arbitrary incrementing
+ register used to read in strings
+ #MCX_ALD Amount to advance past end of longest column
+ #NEWPAGE Was NEWPAGE just invoked? (boolean)
+ #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
+ #NOFILL Are we in a nofill mode? (boolean)
+ #NOFILL_MODE Nofill mode
+ #OLD_LEAD Lead in effect prior to changing it with .vs
+ in .LS or .AUTOLEAD
+ #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? (boolean)
+ #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? (boolean)
+ #PRINT_FOOTER_ON_PAGE_1 (boolean)
+ #PSEUDO_FILL Signals that LEFT, RIGHT or CENTER is
+ in effect (booleand off, i.e. to 0, when
+ QUAD &lt;arg&gt; 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?
+ (boolean)
+ #QUAD In autoquad mode? (boolean)
+ #QUIT Tells LIST whether to exit lists completely
+ (boolean)
+ #REMOVE Used in LIST OFF cleanup
+ #RESTORE_FILL Used to restore \[.u] state if temporarily changed
+ #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? (boolean)
+ #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
+ #RESTORE_TRAP Did we have to disable traps? Used in
+ graphical object macros (boolean)
+ #RESTORE_SQ Instructs SMARTQUOTES to restore smartquotes if
+ SMARTQUOTES invoked without an arg
+ #RLD RLD value
+ #RULE_WEIGHT Weight given to RULE_WEIGHT
+ #RULE_WEIGHT_ADJ RULE_WEIGHT/2
+ #RW Is RW in effect? (boolean)
+ #SHIFT_LIST&lt;n&gt; Value to add to #LIST_INDENT&lt;n&gt; for shifted lists
+ #SILENT Is silent on? (boolean)
+ #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? (boolean)
+ #SPACE_TO_END Whitespace at end of string passed to PAD
+ #SQ_WAS_ON Instructs CODE OFF to restore smartquotes if they
+ were on prior to CODE
+ #ST&lt;n&gt;_LENGTH Length of ST&lt;n&gt;; calculated during ST &lt;n&gt;
+ #ST&lt;n&gt;_MARK Page offset of autotab &lt;n&gt; at ST&lt;n&gt;X
+ #ST_NUM Incrementing counter for autotab identification
+ #ST&lt;n&gt;_OFFSET Offset (from current tab) to add to #ST&lt;n&gt;_OFFSET
+ when calculating string indents set from within
+ tabs
+ #ST&lt;n&gt;_OFFSET Indent of autotab &lt;n&gt; (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
+ #STR_LENGTH Holds string length derived from .length request
+ tbl Are we in a tbl? (boolean)
+ #T_INDENT Value of temporary indent
+ #T_MARGIN Top margin
+ #TAB_ACTIVE Are we in a tab? (boolean)
+ #TAB_NUMBER Tab number given to TAB_SET
+ #TAB_LENGTH Tab length given to TAB_SET
+ #TAB_OFFSET Tab indent given to TAB_SET
+ #TEXT_WIDTH Width of string to underscore
+ #TN Was TN (or \*[T+] called? (boolean)
+ #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
+ #UNDERSCORE_WEIGHT Weight of underscores
+ #UNDERSCORE_WEIGHT_ADJ UNDERSCORE_WEIGHT/2
+ #USER_SET_L_LENGTH Did user invoke LL? (boolean)
+ #USER_SET_TITLE_ITEM Did user invoke TOC_TITLE_ENTRY?
+ #WEIGHT Weight given to #RULE_WEIGHT
+ #WEIGHT_ADJ RULE_WEIGHT/2
+ u Horiz position of start of underscore
+
+<span style="display: block; margin-top: -.5em; margin-bottom: -2.5em;">+++STRINGS+++</span>
+
+ $ARG String holding substrings derived from .substring
+ request
+ $COND_PERCENT Percentage by which to pseudo-condense type
+ $COLOR_SCHEME Color scheme used in NEWCOLOR
+ $&lt;colorname&gt;_FILL XCOLOR "alias" with _FILL attached; used to determine if
+ the alias exists when the alias is passed to DBX SOLID
+ or DCL SOLID
+ $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
+ $DROPCAP The dropcap letter
+ $ENUMERATOR&lt;n&gt; String enumerator for depth &lt;n&gt; in lists
+ $ENUMERATOR_TYPE&lt;n&gt; Type of enumerator used in LIST&lt;n&gt;
+ $EW Value passed to EW
+ $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
+ $PREFIX&lt;n&gt; Prefix for enumerator of LIST&lt;n&gt;
+ $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)
+ $RESTORE_SQ The smartquoting string last passed to SMARTQUOTES
+ $RULE_GAP Distance between underscore rules
+ $RW Value passed to RW
+ $SAVED_STYLE Current style, if there is one (used in FAMILY)
+ $SAVED_UNDERSCORE_GAP Temporarily holds string in $UNDERSCORE_GAP
+ $SEPARATOR&lt;n&gt; Separator for depth &lt;n&gt; in lists
+ $SS_VAR Holds + or - sentence space value
+ $ST&lt;n&gt;_FILL Always QUAD if QUAD passed to ST &lt;n&gt;
+ ST\n[#LOOP] Used to initialize string tab markers (1-19)
+ ST\n[#LOOP]X Used to initialize string tab markers (1-19)
+ $ST&lt;n&gt;_QUAD_DIR Quad direction supplied to ST for &lt;n&gt;
+ $SUP_LOWER Vertical displacement amount of superscripts
+ $SUP_RAISE Vertical displacement amount of superscripts
+ $SUP_RAISE_AMOUNT Argument passed to SUPERSCRIPT_RAISE_AMOUNT
+ $TAB_NUMBER Argument passed to TAB macro to call TAB# macro
+ created in TAB_SET
+ $UNDERSCORE_GAP Distance between text and underscore rule
+ $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
+
+<span style="display: block; margin-top: -.5em; margin-bottom: -2.5em;">+++ALIASES+++</span>
+
+ 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
+ INCLUDE so
+ 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
+
+<span style="display: block; margin-top: -.5em; margin-bottom: -2.5em;">+++ALIASES FOR NUMBER REGISTERS+++</span>
+
+ #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
+
+<span style="display: block; margin-top: -.5em; margin-bottom: -2.5em;">+++INLINE ESCAPES+++</span>
+
+ ALD&lt;n&gt; Move down inline by &lt;n&gt; (between .25 and 12.75)
+ B Inline equivalent to .EL
+ BCK Inline backward horizontal movement
+ BD Bold font
+ BDI Bold italic font
+ BLACK Color
+ black color
+ BOLDER Pseudo-bold on
+ BOLDERX Pseudo-bold off
+ BP Back points (horizontal movement)
+ BP&lt;n&gt; Back points by &lt;n&gt; (between .25 and 12.75)
+ BU Back units (inline pairwise kerning)
+ BU&lt;n&gt; Back units by &lt;n&gt; (between 1 and 36)
+ COND Pseudo-condense type
+ 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)
+ CONDSUP Pseudo-condensed superscript (using value set with
+ CONDENSE)
+ CONDSUPX Pseudo-condensed superscript off
+ CONDX Pseudo-condense off
+ DOWN Inline downward vertical movement
+ EN-MARK Inline escape to indicate the beginning of a
+ range of lines used to identify an endnote
+ EXT Pseudo-extend type
+ EXTX Pseudo-extend off
+ EXTSUP Pseudo-extended superscript
+ EXTSUPX Pseudo-extended superscript off
+ FN-MARK Inline escape to indicate the beginning of a
+ range of lines used to identify a footnote
+ FP&lt;n&gt; Forward points by &lt;n&gt; (between .25 and 12.75)
+ FP Forward points (horizontal movement)
+ FU Forward units (inline pairwise kerning)
+ FU&lt;n&gt; Forward units by &lt;n&gt; (between 1 and 36)
+ FWD Inline forward horizontal movement
+ PREV Return to previous font in effect
+ RLD&lt;n&gt; Move up, inline, by &lt;n&gt; (between .25 and 12.75)
+ ROM Roman (medium) font
+ S Same \s
+ SLANT Slant (pseudo-italic on
+ SLANTX Slant off
+ ST&lt;n&gt; String tab end marker
+ ST&lt;n&gt; String tab start marker
+ SUP Superscript
+ SUPX Superscript off
+ TB+ Move to next tab number (n+1) without advancing on the page
+ UP Inline upward vertical movement
+ WHITE Color
+ white Color
+
+<span style="display: block; margin-top: -.5em; margin-bottom: -2.5em;">+++SPECIAL CHARACTERS+++</span>
+
+ FOOT The foot character \(fm
+ INCH The inch character \(fm\(fm
+ 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
+<span style="display: block; margin-top: 1em; text-decoration: underline;">DOCUMENT PROCESSING</span>
+<span style="display: block; margin-top: -1em;">+++MACROS+++</span>
+<span style="display: block; margin-top: -1em; margin-bottom: -1em;">*Document info (reference macros)</span>
+ 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
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Covers</span>
+ COVER What goes on cover
+ COVERS Whether covers get printed (boolean)
+ 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
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Document style</span>
+ 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
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Document tags and macros</span>
+ 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
+ EQ/EN eqn block
+ FINIS Prints --END--
+ FLOAT Keep material together as a block; defer output
+ to following page if not enough room to print
+ 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
+ SUBSUBHEAD Subsubheads
+ TH Running tbl header
+ TS/TE Begin/end a tbl block
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Headers/footers</span>
+ DO_FOOTER Prints footer (after footnote processing, if any)
+ FOOTER_ON_FIRST_PAGE Print footer on first page? (boolean)
+ 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
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Control macros</span>
+-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
+ COVERS_COUNT_PAGES Whether to include cover pages in pagination scheme
+ DOC_COVER_ADVANCE Vertical place on page to start outputting
+ doc cover material
+ DOC_COVER_LEAD Lead in/decrease for doc cover pages
+ DOC_COVERS_COUNT_PAGES Whether to include doc cover pages in pagination
+ scheme
+
+-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
+ FINIS_STRING_CAPS Whether to capitalize the finis string
+
+-eqn-
+ EQ_INDENT Indent value if 'EQ I'
+
+-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
+ FOOTNOTE_SPACING Post endnotenote item spacing
+ ENDNOTE_STRING Endnotes page head
+ ENDNOTE_STRING_ADVANCE Distance of title string "ENDNOTES" from top
+ edge of page
+ ENDNOTE_STRING_CAPS Capitalize the endnotes string
+ ENDNOTE_STRING_UNDERLINE Underscoring of endnotes page head
+ ENDNOTE_TITLE Endnotes identifying title
+ ENDNOTE_TITLE_SPACE Distance from top of page to endnotest title
+ ENDNOTE_TITLE_UNDERLINE Underscoring of endnotes identifying title
+ ENDNOTES_ALLOWS_HEADERS Page headers on endnotes pages? (boolean)
+ 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_ADVANCE Distance of title string "BIBLIOGRAPHY" from
+ top edge of page
+ BIBLIOGRAPHY_STRING_CAPS Capitalize bib title string
+ BIBLIOGRAPHY_STRING_UNDERLINE 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? (boolean)
+ 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? (boolean)
+ 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? (boolean)
+ 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
+ HEADER_GAP Space between header and running text
+ HEADER_MARGIN Space from top of page to header
+ HEADERS_AND_FOOTERS Enables and permits the creation of
+ headers and footers that appear on the
+ same page
+ 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 (boolean)
+ 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-
+ HEAD_CAPS Print section titles in caps? (boolean)
+ HEAD_SPACE Give HEADs 2 line-spaces before. If OFF,
+ only 1. Default is on.
+ HEAD_UNDERLINE Underline section titles? (boolean)
+ NUMBER_HEADS Print head numbers
+ RESET_HEAD_NUMBER Reset head number
+ HEAD_BASELINE_ADJUST Amount to raise head above baseline
+
+-Subheads-
+ NUMBER_SUBHEADS Print subhead numbers
+ RESET_SUBHEAD_NUMBER Reset subhead number
+ SUBHEAD_BASELINE_ADJUST Amount to raise subhead above baseline
+
+-Subsubheads-
+ NUMBER_SUBSUBHEADS Print subhead numbers
+ RESET_SUBSUBHEAD_NUMBER Reset subhead number
+ SUBSUBHEAD_BASELINE_ADJUST Amount to raise subhead above baseline
+
+-Para heads-
+ NUMBER_PARAHEADS Print parahead numbers
+ PARAHEAD_INDENT How much to indent paraheads
+ RESET_PARAHEAD_NUMBER Reset parahead number
+
+ PREFIX_CH_NUM_WARNING Macro to abort PREFIX_CHAPTER_NUMBER
+ with a warning if the arg to CHAPTER isn't
+ a digit, and user hasn't supplied a digit
+ to PREFIX_CHAPTER_NUMBER
+ PREFIX_CHAPTER_NUMBER Prefix the chapter number to numbered
+ heads, subheads and paraheads
+-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? (boolean)
+ 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
+
+<span style="display: block; margin-top: -.75em; margin-bottom: -1em;">*Aliases for header/footer control macros</span>
+ 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
+
+<span style="display: block; margin-top: -.5em; margin-bottom: -2.5em;">+++LETTER MACROS+++</span>
+
+ CLOSING Closing (i.e. Yours truly,)
+ CLOSING_INDENT Left indent of CLOSING
+ 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
+ SIGNATURE_SPACE Amount of room to leave for signature
+ TO Addressee's name and address
+ ALL_DONE .em (the "end macro") for letters
+
+<span style="display: block; margin-top: -.5em; margin-bottom: -2.5em;">+++SUPPORT+++</span>
+
+ 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
+ NO_SHIM Disable SHIM
+ 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 "valid" baseline
+ TBL*CLEANUP Remove selected registers and strings created
+ by TS/TH/TE
+ TBL*GET_QUAD Establish quad of tbl caption
+ tbl*float-warning If tbl in a float exceeds page limits
+ tbl*print-header Administrivia for printing tbl headers
+ tbl@top-hook Trap-invoked (HEADER); prints running tbl header
+ and moves FOOTER/FN_OVERFLOW_TRAP_POS traps
+ to accommodate tbl
+ 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 valid 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.
+
+<span style="display: block; margin-top: -.5em; margin-bottom: -2.5em;">+++DIVERSIONS+++</span>
+
+ B_QUOTE Block (indented) quote text
+ CLOSING_TEXT Closing (i.e. Yours truly,)
+ EPI_TEXT Epigraph text
+ END_NOTES Endnotes text
+ FLOAT*DIV Float content
+ 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&lt;n&gt; Date, addresser, addressee or greeting;
+ &lt;n&gt; 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
+ tbl*header-div Running tbl header
+ TOC_ENTRIES TOC entries
+
+<span style="display: block; margin-top: -.5em; margin-bottom: -2.5em;">+++NUMBER REGISTERS+++</span>
+
+ #ADJ_BIB_LEAD Adjust BIB_LEAD? (boolean)
+ #ADJ_DOC_LEAD Adjust DOC_LEAD? (boolean)
+ #ADJ_EN_LEAD Adjust EN_LEAD? (boolean)
+ #ADJ_TOC_LEAD Adjust TOC_LEAD? (boolean)
+ #ADVANCE_FROM_TOP Distance from page top to start of
+ running text if no docheader
+ #ARG_NUM Keeps track of number of args passed to a
+ macro
+ #ARGS_TO_LIST Was LIST passed some args? (boolean)
+ #ATTRIBUTE_COLOR Colorize attribute string? (boolean)
+ #AUTHOR_&lt;n&gt; Strings passed to AUTHOR
+ #AUTHOR_COLOR Colorize author(s)? (boolean)
+ #AUTHOR_COVER_NUM Incrementing register used in defining
+ $AUTHOR_COVER_&lt;n&gt; strings
+ #AUTHOR_DOCCOVER_NUM Incrementing register used in defining
+ $AUTHOR_COVER_&lt;n&gt; strings
+ #AUTHOR_NUM Keeps track of user-defined string
+ AUTHOR_&lt;n&gt; 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? (boolean)
+ #BIB_ALLOWS_HEADERS_ALL Put headers on all bib pages? (boolean)
+ #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?
+ (boolean)
+ #BIB_LEAD Bibliography lead, expressed in points
+ #BIB_LIST Output bibs in list style? (boolean)
+ #BIB_NO_COLS De-columnize bibliographies? (boolean)
+ #BIB_NO_FIRST_PN Put a page number on the first page of
+ bibliographies? (boolean)
+ #BIB_SINGLESPACE Single-space TYPEWRITE bibliographies? (boolean)
+ #BIB_SPACE Post item space for bibliography pages
+ #BIB_STRING_ADVANCE Vertical position of "BIBLIOGRAPHY" string
+ (relative to the top edge of the page)
+ #BIB_STRING_CAPS Capitalize bib title? (boolean)
+ #BIB_STRING_UNDERLINE Underscore bib title? 0=no; 1=yes; 2=double
+ #BIB_STRING_UNDERLINE_WEIGHT Underline weight in units
+ #BIB_STRING_UNDERLINE_WEIGHT_ADJ Underline weight/2
+ #BIB_PS Base point size for bibliography pages expressed
+ in points
+ #BIBLIOGRAPHY Are we doing a bib page? (boolean)
+ #BQ_AUTOLEAD Register created by BLOCKQUOTE_AUTOLEAD
+ #BQ_LEAD Leading of blockquotes
+ #BQUOTE_COLOR Colorize blockquotes? (boolean)
+ #BQUOTE_LN Number blockquotes? (boolean)
+ #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
+ (boolean)
+ #CENTER_CAP_HEIGHT Cap height of CENTER string in
+ headers/footers
+ #CH_NUM The chapter number obtained by
+ PREFIX_CHAPTER_NUMBER
+ #CHAPTER_CALLED Has CHAPTER been invoked? (boolean); used
+ by PREFIX_CHAPTER_NUMBER to see whether
+ to try to get the chapter number from
+ the arg passed to CHAPTER
+ #CHAPTER_TITLE_NUM Incrementing register used to define strings
+ $CHAPTER_TITLE_&lt;n&gt;
+ #CHAPTER_TITLE_COLOR Colorize chapter title? (boolean)
+ #CLOSING Is there a closing (for letters)? (boolean)
+ #CODE_COLOR Colorize CODE? (boolean)
+ #CODE_SIZE_ADJ Percentage by which to scale CODE font
+ #COL_L_LENGTH Line length of columns
+ #COL_&lt;n&gt;_L_MARGIN Left margin of column &lt;n&gt;
+ #COL_NEXT Was COL_NEXT invoked? (boolean; used in
+ FOOTER)
+ #COL_NUM Incrementing counter of num of columns;
+ for use with #COL_&lt;n&gt;_L_MARGIN
+ #COL_TOTAL #COL_L_LENGTH + #GUTTER; used to calculate
+ #COL_&lt;n&gt;_L_MARGIN
+ #COLLATE Are we performing a COLLATE? (boolean)
+ #COLLATED_DOC If 1, instructs TOC that this is a collated
+ doc
+ #COLUMNS Are columns turned on? (boolean)
+ #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 Print a COVER? (boolean)
+ #COVER_ATTRIBUTE_COLOR Colorize cover attribution string? (boolean)
+ #COVER_AUTHOR Put AUTHOR(s) on COVER? (boolean)
+ #COVER_AUTHOR_COLOR Colorize cover author(s)? (boolean)
+ #COVER_BLANKPAGE Output blankpage after COVER? (boolean)
+ #COVER_COLOR Colorize COVER? (boolean)
+ #COVER_COPYRIGHT Put copyright on COVER? (boolean)
+ #COVER_COPYRIGHT_COLOR Colorize cover copyright line? (boolean)
+ #COVER_DOCTYPE Put doctype on COVER? (boolean)
+ #COVER_DOCTYPE_COLOR Colorize cover doctype? (boolean)
+ #COVER_END Are we ending a COVER? (boolean)
+ #COVER_LEAD Cover leading
+ #COVER_MISC Put misc on COVER? (boolean)
+ #COVER_MISC_COLOR Colorize cover misc line? (boolean)
+ #COVER_RULE_WEIGHT Doctype underline weight on COVER
+ #COVER_RULE_WEIGHT_ADJ COVER_RULE_WEIGHT/2
+ #COVER_START_POS Vertical starting pos of cover material
+ #COVER_SUBTITLE Put subtitle on COVER? (boolean)
+ #COVER_TITLE Put title on COVER? (boolean)
+ #COVER_TITLE_NUM Number of cover title items
+ #COVER_TITLE_COLOR Colorize cover title? (boolean)
+ #COVER_SUBTITLE_COLOR Colorize cover subtitle? (boolean)
+ #COVER_UNDERLINE Underline doctype on COVER? (boolean)
+ #COVER_UNDERLINE_WEIGHT Doctype underline weight on COVER
+ #COVER_UNDERLINE_WEIGHT_ADJ COVER_UNDERLINE_WEIGHT/2
+ #CURRENT_V_POS \n[.d] ; used in SHIM
+ #COVERS Print covers? (boolean)
+ #COVERS_COUNT Include COVER in pagination scheme? (boolean)
+ #COVERS_OFF Don't print COVERs (boolean)
+ #DATE_FIRST Was .DATE invoked as first letter
+ header after .START? (boolean)
+ dc "mark" register for document columns
+ DD Vert. space before and after eqn blocks
+ defer / new-defer Appended to FLOAT*DIV: if float deferred
+ #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
+ #DEFER_SPACE_ADDED Was space added between two "first" footnotes that
+ appear on the same page? (boolean)
+ #DELAY_SHIM Instructs DO_QUOTE to delay SHIM when quote
+ falls at the top of a page
+ #DEPTH LIST depth
+ #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
+ D-float Depth of float containing/ending with
+ DRH, DRV, DBX, or DCL
+ DI eqn indent if EQ I
+ #DIVER_FN Register that tells FOOTNOTE whether to
+ "move" or "defer" a footnote collected
+ inside a diversion
+ #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
+ #DOC_COVER Are we doing a DOC_COVER? (boolean)
+ #DOC_COVER_AUTHOR Put AUTHOR(s) on DOC_COVER? (boolean)
+ #DOCCOVER_BLANKPAGE Output blank page after DOC_COVER? (boolean)
+ #DOC_COVER_CHAPTER_TITLE_COLOR Colorize CHAPTER_TITLE on DOC_COVER? (boolean)
+ #DOC_COVER_COPYRIGHT Put copyright on DOC_COVER? (boolean)
+ #DOC_COVER_DOCTYPE Put doctype on DOC_COVER? (boolean)
+ #DOCCOVER_END Are we finishing a DOC_COVER? (boolean)
+ #DOC_COVER_LEAD Doc cover leading
+ #DOC_COVER_MISC Put misc on DOC_COVER? (boolean)
+ #DOC_COVER_START_POS Vertical starting pos of doc cover material
+ #DOC_COVER_COLOR Colorize cover? (boolean)
+ #DOC_COVER_START_POS Vertical starting pos of cover material
+ #DOC_COVER_TITLE_COLOR Colorize doc cover title? (boolean)
+ #DOC_COVER_SUBTITLE_COLOR Colorize doc cover subtitle? (boolean)
+ #DOC_COVER_ATTRIBUTE_COLOR Colorize doc cover attribution string? (boolean)
+ #DOC_COVER_AUTHOR_COLOR Colorize doc cover author(s)? (boolean)
+ #DOC_COVER_DOCTYPE_COLOR Colorize doc cover doctype? (boolean)
+ #DOC_COVER_COPYRIGHT_COLOR Colorize doc cover copyright line? (boolean)
+ #DOC_COVER_MISC_COLOR Colorize doc cover misc line? (boolean)
+ #DOC_COVER_SUBTITLE Put subtitle on DOC_COVER? (boolean)
+ #DOC_COVER_TITLE Put title on DOC_COVER? (boolean)
+ #DOC_COVER_TITLE_NUM Number of doc cover title items
+ #DOC_COVERS Print doc covers? (boolean)
+ #DOC_COVERS_OFF Don't print DOC_COVERs (boolean)
+ #DOCCOVER_RULE_WEIGHT Doctype underline weight on DOC_COVER
+ #DOCCOVER_RULE_WEIGHT_ADJ DOCCOVER_RULE_WEIGHT/2
+ #DOCCOVER_UNDERLINE Underline doctype on DOC_COVER? (boolean)
+ #DOCCOVER_UNDERLINE_WEIGHT Doctype underline weight on DOC_COVER
+ #DOCCOVER_UNDERLINE_WEIGHT_ADJ DOCCOVER_UNDERLINE_WEIGHT/2
+ #DOCCOVERS_COUNT Include DOC_COVER in pagination scheme? (boolean)
+ #DOC_HEADER Whether to print a doc header (boolean)
+ #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
+ #DOC_TYPE 1=default, 2=chapter, 3=named, 4=letter
+ #DOCHEADER_ADVANCE Distance from top-of-page to baseline of
+ docheader
+ #DOCHEADER_COLOR Colorize docheader? (boolean)
+ #DOCHEADER_DEPTH Depth of docheader
+ #DOCHEADER_LEAD Lead of doc header
+ (#DOC_LEAD + #DOCHEADER_LEAD_ADJ)
+ #DOC_LEAD_ADJUST_OFF Don't adjust DOC_LEAD (boolean)
+ #DOCS Always 1 after START
+ #DOCTITLE_NUM Number of doctitle items
+ #DOCTYPE_COLOR Colorize doctype? (boolean)
+ #DOCTYPE_RULE_WEIGHT Doctype underline weight
+ #DOCTYPE_RULE_WEIGHT_ADJ DOCTYPE_RULE_WEIGHT/2
+ #DOCTYPE_UNDERLINE Underline doctype? (boolean)
+ #DOCTYPE_UNDERLINE_WEIGHT Weight of doctype underline
+ #DOCTYPE_UNDERLINE_WEIGHT_ADJ DOCTYPE_UNDERLINE_WEIGHT/2
+ #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? (boolean)
+ #DIVER_LN_OFF Turn linenumbering off in (block)quotes?
+ (boolean)
+ #DRAFT_WITH_PAGENUM Are we attaching draft/revision info to page
+ number? (boolean)
+ #EM_ADJUST Amount to raise \(em at END
+ #EN_ALLOWS_HEADERS Put page headers on endnotes pages? (boolean)
+ #EN_ALLOWS_HEADERS_ALL Put page headers on all endnotes pages?
+ (boolean)
+ #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? (boolean)
+ #EN_LEAD Lead of endnotes
+ #EN_LN_BRACKETS Are we using brackets for line-numbered
+ endnotes (boolean)
+ #EN_LN_SEP Are we using a separator for line-numbered
+ endnotes (boolean)
+ #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? (boolean)
+ #EN_NO_FIRST_PN Put pagenumber on 1st page of endnotes?
+ (boolean)
+ #EN_NUMBER Number of current endnote
+ #EN_NUMBER_PLACEHOLDERS Number of placeholders to reserve for endnotes
+ numbers
+ #EN_NUMBERS_ALIGN_RIGHT Hang and align endnote numbers right?
+ (boolean)
+ #EN_NUMBERS_ALIGN_LEFT Align endnote numbers with left margin?
+ (boolean)
+ #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? (boolean)
+ #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? (boolean)
+ #EN_SINGLESPACE Single space endnotes pages? (boolean)
+ #EN_STRING_ADVANCE Vertical position of "ENDNOTES" string (relative to
+ the top edge of the page)
+ #EN_STRING_CAPS Should ENDNOTES capitalize the endnotes
+ string? (boolean)
+ #EN_STRING_UNDERLINE Underscore endnotes page head? (boolean)
+ #EN_STRING_UNDERLINE_WEIGHT Weight of endnotes page title underscore
+ #EN_STRING_UNDERLINE_WEIGHT_ADJ EN_STRING_UNDERLINE_WEIGHT_ADJ/2
+ #EN_TEXT_INDENT Page offset for text of endnotes when
+ numbers right align
+ #EN_TITLE_UNDERLINE Underscore endnotes document identifier?
+ (boolean)
+ #EN_TITLE_UNDERLINE_WEIGHT Weight of endnotes document identification
+ underscore
+ #EN_TITLE_UNDERLINE_WEIGHT_ADJ #EN_STRING_UNDERLINE_WEIGHT_ADJ/2
+ #END_QUOTE For PP=0 indenting; did we just end a quote?
+ (boolean)
+ #ENDNOTE Are we in an endnote? (boolean)
+ #ENDNOTE_REFS Are REFs going to endnotes? (boolean)
+ #ENDNOTES Are we in an endnote (for FOOTERs; boolean)
+ #EPI_ACTIVE Are we in an epigraph? (boolean)
+ #EPI_AUTOLEAD Autolead value for epigraphs
+ #EPI_COLOR Colorize epigraphs? (boolean)
+ #EPI_DEPTH Depth of epigraph from first baseline to
+ last
+ #EPI_FITS Does epigraph fit on page/column? (boolean)
+ #EPIGRAPH Did we have an epigraph? (boolean)
+ #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? (boolean)
+ #EPI_WHITESPACE Space after epigraph to compensate for
+ epigraph leading
+ #FIELD Incrementing register tacked onto LETTERHEAD
+ #FINIS Was FINIS invoked? (boolean)
+ #FINIS_STRING_CAPS Capitalize finis string? (boolean)
+ #FINIS_COLOR Colorize FINIS? (boolean)
+ #FIRST_DOC_TITLE_PN Page number of 1st (collated) doc (for TOC)
+ #FIRST_DOC_TOC_PN_PADDING Padding for 1st page number of 1st (collated) doc
+ (for TOC)
+ float*after-shim / \n[nl]; tests if SHIM has stayed on the same
+ float*before-shim baseline
+ float-span Float can run to multiple pages? (boolean)
+ float*with-tbl Float contains a tbl block
+ #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? (boolean)
+ 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 valid 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?
+ (boolean)
+ #FN_LN_SEP Is a footnote linenumber separator being used?
+ (boolean)
+ #FN_MARK \n[ln] when \*[FN-MARK] is called
+ #FN_MARK_2 \n[nl] when FOOTNOTE is called
+ #FN_MARKER_STYLE 1=STAR; 2=NUMBER
+ #FN_MARKERS Print footnote markers? (boolean)
+ #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_DEPTH Depth of leftover from footnote processing
+ #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? (boolean)
+ #FN_RULE Print fn rule? (boolean)
+ #FN_RULE_ADJ # of points to raise footnote separator from
+ its baseline
+ #FN_RULE_LENGTH Length of footnote separator rule
+ #FN_RULE_WEIGHT Weight of the footnote separator rule
+ #FN_RULE_WEIGHT_ADJ FN_RULE_WEIGHT/2
+ #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)
+ #FOOTER_RULE Print footer rule? (boolean)
+ #FOOTER_RULE_GAP Gap between footer and separator rule above
+ #FOOTER_RULE_WEIGHT Weight of footer rule
+ #FOOTER_RULE_WEIGHT_ADJ #FOOTER_RULE_WEIGHT/2
+ #FOOTERS_ON Are we using footers? (boolean)
+ #FOOTERS_WERE_ON Were footers on? - used in FINIS and BLANKPAGE
+ (boolean)
+ #FOOTNOTE_COLOR Colorize footnotes? (boolean)
+ #FORCE Force float? (boolean)
+ #FROM_BIB_STRING Tells UNDERSCORE it's underscoring $BIB_STRING
+ #FROM_COVER Tells UNDERSCORE it's underscoring on a cover
+ #FROM_DOC_COVER Tells UNDERSCORE it's underscoring on a doccover
+ #FROM_DOCTYPE Tells UNDERSCORE it's underscoring the doctype
+ #FROM_EN_STRING Tells UNDERSCORE it's underscoring $EN_STRING
+ #FROM_EN_TITLE Tells UNDERSCORE it's underscoring $EN_TITLE
+ #FROM_HEAD Tells UNDERSCORE it's underscoring a head
+ #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? (boolean)
+ #GET_DC_HEIGHT Used in routine to get the correct point size for
+ dropcaps
+ #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
+ #H_BASELINE_ADJ Vertical spacing adjustment for heads (default=0)
+ #HDRFTR_BOTH Are we setting both headers and footers? (boolean)
+ #HDRFTR_CENTER_CAPS CENTER part of header/footer in caps?
+ (boolean; default=off)
+ #HDRFTR_CENTER_COLOR Colorize header/footer center? (boolean)
+ #HDRFTR_COLOR Colorize headers/footers? (boolean)
+ #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?
+ (boolean; default=off)
+ #HDRFTR_LEFT_COLOR Colorize header/footer left? (boolean)
+ #HDRFTR_PT_SIZE Initial point size of headers/footers
+ #HDRFTR_RECTO_CAPS Header/footer recto caps? (boolean)
+ #HDRFTR_RIGHT_CAPS Right part of header/footer in caps?
+ (boolean; default=on)
+ #HDRFTR_RIGHT_COLOR Colorize header/footer right? (boolean)
+ #HDRFTR_RULE Print head/footer rule? (boolean)
+ #HDRFTR_RULE_COLOR Colorize header/footer rule? (boolean)
+ #HDRFTR_RULE_GAP Space between header/footer and
+ header/footer rule
+ #HDRFTR_RULE_WEIGHT Weight of header/footer rule
+ #HDRFTR_RULE_WEIGHT_ADJ HDRFTR_RULE_WEIGHT/2
+ #HDRFTR_TMP_CAPS_SWITCH Temporarily holds HDRFTR_LEFT_CAPS value if
+ #SWITCH_HDRFTR=1
+ #HDRFTR_VERSO_CAPS Header/footer verso caps? (boolean)
+ #HEAD 1=main/section head 2=subhead
+ #HEAD_CAPS Print section titles in caps? (boolean)
+ #HEAD_COLOR Colorize heads? (boolean)
+ #HEADER_GAP Distance from header to running text
+ #HEAD_NUM Head number
+ #HEAD_SPACE 2 line spaces before heads? (boolean)
+ #HEAD_UNDERLINE Underline heads? (boolean)
+ #HEAD_UNDERLINE_WEIGHT Head underline weight
+ #HEAD_UNDERLINE_WEIGHT_ADJ HEAD_UNDERLINE_WEIGHT/2
+ #HEADER_MARGIN Distance from top of page to header
+ #HEADER_RULE Print header rule? (boolean)
+ #HEADER_RULE_GAP Gap between header and header rule
+ #HEADER_RULE_WEIGHT Header rule weight
+ #HEADER_RULE_WEIGHT_ADJ HEADER_RULE_WEIGHT/2
+ #HEADERS_ON Headers on? (boolean)
+ #HEADER_STATE Saves header state in COLLATE for use in
+ START after COLLATE
+ #HEADERS_WERE_ON Were headers on? - used in BLANKPAGE (boolean)
+ #HF_OFF Has HEADERS_AND_FOOTERS been turned off? (boolean)
+ #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? (boolean)
+ #INDENT_FIRSTS Tells footnotes to leave INDENT_FIRST_PARAS
+ alone if it's on for running text.
+ #ITALIC_MEANS_ITALIC For TYPEWRITE. (boolean)
+ #ITEM Counter for removing _1, _2, _3... strings
+ in TITLE, CHAPTER_TITLE, etc.
+ #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
+ #LB_CHAR_ITERATIONS Number of linebreak character iterations
+ #LEFT_CAP_HEIGHT Cap height of left string in headers/footers
+ #VALID_BASELINE Calculates vert. position of next valid
+ baseline in SHIM
+ #LETTER_STYLE 1=BUSINESS 2=PERSONAL
+ #LINEBREAK Did we have a linebreak? (boolean)
+ #LINEBREAK_COLOR Colorize linebreak? (boolean)
+ #LINENUMBER_COLOR Colorize linenumbers? (boolean)
+ #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 Test 1st arg to NUMBER_LINES for digit or string
+ MN-active Are we doing a margin note? (boolean)
+ MN-curr Current margin note
+ MN-div-&lt;n&gt;-depth Depth of margin note &lt;n&gt;
+ MN-hy Hyphenation flag of margin notes
+ #MNinit Have margin notes been initialized? (boolean)
+ #MNinit_DEFERRED Did we have to defer a margin note? (boolean)
+ MN-last-pos Baseline of previous margin note
+ MN-lead-adj Difference between the current DOC_LEAD and the
+ leading used in margin notes
+ MN-left Number of current left margin note
+ MN-left-start Horizontal start position of left margin note
+ MN-left-width Width of left margin note
+ MN-right Number of current right margin note
+ MN-right-start Horizontal start position of right margin note
+ MN-right-width Width of right margin note
+ MN-sep Gutter between margin notes and running text
+ MN-shifted Did we have to shift a margin note down?
+ (boolean)
+ MN-size Point size of margin notes
+ MN-spacing Leading of margin notes
+ #MISC_&lt;n&gt; Used to print "next" misc lines in DO_COVER
+ #MISC_COVER_NUM Number of cover misc items
+ #MISC_DOCCOVER_NUM Number od doc cover misc items
+ #MISC_NUM Number of MISC items
+ #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)
+ #NEITHER Should we print no covers? (boolean)
+ #NEXT_AUTHOR Supplies correct digit to AUTHOR_&lt;n&gt;
+ 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
+ #NEXT_SUBTITLE Incrementing register used to print subtitles
+ #no-repeat-MN-left Don't repeat left margin note (boolean)
+ #no-repeat-MN-right Don't repeat right margin note (boolean)
+ #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_BREAK Set to 1 in COLLATE if last line of
+ text before COLLATE falls at the bottom
+ of the page; instructs NEWPAGE to use
+ 'br instead of .br
+ #NO_COLUMNS Don't print document in columns (boolean)
+ #NO_FN_MARKER Don't print footnote markers (boolean)
+ #NO_SHIM Should SHIM shim? (boolean)
+ #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? (boolean)
+ #NOT_YET_ADJUSTED Line on which a footnote was called has not yet
+ been adjusted by groff (boolean)
+ #NUM_AUTHORS # of authors mod 2 to test if odd or even
+ # of authors
+ #NUM_MISCS Number of args passed to MISC
+ #NUM_MISCS_COVER Number of args passed to MISC COVER
+ #NUM_MISCS_DOCCOVER Number of args passed to MISC DOC_COVER
+ #NUMBER_HEAD Are heads numbered? (boolean)
+ #NUMBER_PH Are paraheads numbered? (boolean)
+ #NUMBER_SH Are subheads numbered? (boolean)
+ #NUMBER_SSH Are subsubheads numbered? (boolean)
+ #NUM_COLS Number of columns per page
+ #NUMBERED If set to 1, lets PARAHEAD know that
+ main-, sub-, and subsubhead numbers have already been
+ prefixed to the parahead string
+ #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
+ #ORIG_DOC_LEAD DOC_LEAD before endnotes, bibliographies, tocs
+ #ORIG_L_LENGTH \\n[.l] before starting LISTs
+ #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
+ #OVERFLOW_LEFT Does left margin note overflow? (boolean)
+ #OVERFLOW_RIGHT Does right margin note overflow? (boolean)
+ #P Page number for margin notes
+ #PAD_LIST_DIGITS&lt;n&gt; Pad LIST digits for LIST &lt;n&gt;? (boolean)
+ #PAGE_NUM_ADJ What to add to n% to get #PAGENUMBER
+ #PAGE_NUM_H_POS 1=left 2=CENTER 3=right; default=2
+ #PAGE_NUM_COLOR Colorize pagenumbers? (boolean)
+ #PAGE_NUM_HYPHENS Print hyphens surrounding page numbers?
+ (boolean)
+ #PAGE_NUM_HYPHENS_SET Did user set (or unset) hyphens around page
+ numbers? (boolean)
+ #PAGE_NUM_POS_SET Did user set page number position? (boolean)
+ #PAGE_NUM_SET Test if PAGE_1_NUM was used to set 1st page
+ number
+ #PAGE_NUM_V_POS 1=top 2=bottom; default=2
+ #PAGE_NUMS Print page numbers? (boolean)
+ #PAGE_POS Exact position on page during a diversion
+ (required for collecting footnotes inside
+ a diversion)
+ #PAGE_TOP \n[nl] after HEADER completes itself
+ #PAGENUM_STYLE_SET Did we set pagenumber style? (boolean)
+ #PAGENUMBER The page number
+ #PAGES Number of blank pages to output
+ #PAGINATE Are we paginating? (boolean)
+ #PAGINATE_TOC Is toc pagination on? (boolean)
+ #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 (boolean)
+ #PH_COLOR Colorize paraheads? (boolean)
+ #PH_INDENT Size of parahead indent
+ #PH_NUM Parahead number
+ #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? (boolean)
+ #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
+ #PRE_COLLATE Set to 1 in COLLATE; prevents FAMILY
+ from clobbering a user-set DOC_FAMILY
+ #PREFIX_CH_NUM Prefix the chapter number to numbered
+ heads, subheads and/or paraheads? (boolean)
+ #PREV_FN_DEFERRED Was previous footnote deferred? (boolean)
+ #PRINT_PAGENUM_ON_PAGE_1 Should we print the page number on first
+ page of doc when footers are on? (boolean)
+ #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?
+ (boolean)
+ #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 Colorize quotes (poetic)? (boolean)
+ #QUOTE_LN Linenumber quotes? (boolean)
+ #RECTO_VERSO Switch HEADER_LEFT and HEADER_RIGHT on
+ alternate pages? (boolean)
+ ref*suppress-period Suppress period at end of ref field? (boolean)
+ ref*type Kind of reference we're building
+ #REF Was REF called? (boolean)
+ #REF_HY Hyphenate REFs? (boolean)
+ #REF_WARNING Have we issued a ref warning? (boolean)
+ #REPEAT Number of times to repeat linebreak
+ character
+ #RERUN_TRAPS Should we invoke TRAPS? (boolean)
+ #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_EN_PP_INDENT 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?
+ (boolean)
+ #RESET_L_LENGTH Stores current line length when necessary
+ #RESET_PARA_SPACE Holds current value of boolean register
+ #PP_SPACE
+ #RESET_PP_INDENT Stores value of PP_INDENT when needed
+ #RESET_QUOTE_SPACING Stores value of boolean register
+ #FULLSPACE_QUOTES (used in endnotes)
+ #RESTORE_ADJ_DOC_LEAD Stores value of #ADJ_DOC_LEAD whenever needed
+ #RESTORE_B_MARGIN Stores #B_MARGIN whenever needed
+ #RESTORE_DOC_LEAD Stores value of current doc lead (used in
+ endnotes)
+ #RESTORE_HY Restore hyphenation after .][? (boolean)
+ #RESTORE_INDENT Store \n[.i] whenever needed
+ #RESTORE_L_LENGTH Stores \n[.l] whenever needed
+ #RESTORE_LN_NUM Should we restore line numbering? (boolean)
+ #RESTORE_OFFSET Page offset at moment footer trap is sprung;
+ not currently used
+ #RESTORE_UNDERLINE Instructs CODE OFF to restore underlining of
+ italics (TYPEWRITE) if underlining was
+ formerly on
+ #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? (boolean)
+ #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_DOC_LEAD Stored value of #DOC_LEAD (used in DEFAULTS after
+ a COLLATE)
+ #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_FN_NUMBER Stores current FN_NUMBER whenever needed
+ #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.
+ #SAVED_UNDERSCORE_WEIGHT Stores underscore weight whenever needed
+ #SAVED_UNDERSCORE_WEIGHT_ADJ SAVED_UNDERSCORE_WEIGHT/2
+ #SAVED_VFP Store variable footer position whenever needed
+ #SAVED_WEIGHT Stores weight given to RULE_WEIGHT whenever needed
+ #SAVED_WEIGHT_ADJ SAVED_UNDERSCORE_WEIGHT/2
+ #SEP_TYPE Set to 1 if LIST separator is ( or [ or {
+ #SH_COLOR Colorize subheads? (boolean)
+ #SH_BASELINE_ADJ #DOC_LEAD/8 (TYPESET) or /5 (TYPEWRITE)
+ (used for subhead vertical spacing)
+ #SH_NUM Subhead number
+ #SHIM Amount of lead required to advance to
+ next valid baseline
+ #SILENT_BQUOTE_LN "Silently" linenumber blockquotes? (boolean)
+ #SILENT_QUOTE_LN "Silently" linenumber quotes? (boolean)
+ #SINGLE_SPACE Is TYPEWRITE in single space mode? (boolean)
+ #SKIP ENTRY If one, don't print the first entry (the
+ document title) in the TOC of uncollated docs.
+ #SKIP_FOOTER If 1, instructs DO_FOOTER to do nothing
+ if B_MARGIN falls below FOOTER_MARGIN
+ #SLANT_MEANS_SLANT For TYPEWRITE. (boolean)
+ #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
+ #SPACE_TO_FOOTER Distance to FOOTER trap; used to calculate
+ available space when FOOTNOTE is called inside
+ a diversion
+ #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.
+ #SSH_BASELINE_ADJ #DOC_LEAD/8 (TYPESET) or /5 (TYPEWRITE)
+ (used for subsubhead vertical spacing)
+ #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
+ #SUBHEAD Was subhead the last macro invoked? (boolean)
+ Controls vert. space between SUBHEAD and
+ SUBSUBHEAD
+ #SUBTITLE_COLOR Colorize subtitle? (boolean)
+ #SUBTITLE_COVER_NUM Incrementing register used to define strings
+ $SUBTITLE_COVER_&lt;n&gt;
+ #SUBTITLE_DOCCOVER_NUM Incrementing register used to define strings
+ $SUBTITLE_DOCCOVER_&lt;n&gt;
+ #SUBTITLE_NUM Incrementing register used to define strings
+ $SUBTITLE_&lt;n&gt;
+ #SUBTITLES Holds number of subtitle items
+ #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?
+ (boolean)
+ tbl*boxed tbl has box or allbox (boolean)
+ tbl*center-label-on-table Is tbl caption centered? (boolean)
+ tbl*have-header tbl has a running header (boolean)
+ tbl*header-ht Depth of tbl*header-div
+ tbl*left-label-on-table Is tbl caption quad left? (boolean)
+ tbl*move-fn-overflow-trap Whether to move FN_OVERFLOW_TRAP_POS
+ to accommodate tbl
+ tbl*move-fn-overflow Amount by which to change
+ FN_OVERFLOW_TRAP_POS to accommodate tbl
+ tbl*move-footer Amount by which to change FOOTER trap
+ to accommodate tbl
+ tbl*move-footer-trap Whether to move FOOTER trap to accommodate
+ tbl
+ tbl*no-shim Whether to SHIM tbl (boolean)
+ tbl*right-label-on-table Is tbl caption quad right? (boolean)
+ #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? (boolean)
+ #TITLE_COLOR Colorize title? (boolean)
+ #TITLE_NUM Number of title items
+ #TOC_AUTHORS Whether to append author(s) to toc doc
+ title entries (boolean)
+ #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
+ @TOP Controls .ns at page top;
+ trap-invoked (FOOTER); mostly trap-removed
+ (RR_@TOP)
+ #TOTAL_FIELDS Total number of letter header fields
+ #TRAP \n[.t]-1 (used in DO_QUOTE)
+ #TW Width of tbl block
+ #UNADJUSTED_DOC_LEAD Argument passed to DOC_LEAD prior to
+ adjusting (set in TRAPS)
+ #UNDERLINE_ITALIC For TYPEWRITE. (boolean)
+ #UNDERLINE_ON Was UNDERLINE called? (boolean)
+ #UNDERLINE_QUOTES Was UNDERLINE_QUOTES called? (boolean)
+ #UNDERLINE_QUOTE Underline pquotes? (boolean)
+ #UNDERLINE_SLANT For TYPEWRITE. (boolean)
+ #UNDERLINE_WAS_ON Was underlining on prior to the
+ invocation of current macro? (boolean)
+ #UNDERLINE_WAS_ON_FN As above, but for footnotes only
+ #USER_DEF_HDRFTR_CENTER Has user defined hdrftr center? (boolean)
+ #USER_DEF_HDRFTR_LEFT Has user defined hdrftr left? (boolean)
+ #USER_DEF_HDRFTR_RIGHT Has user defined hdrftr right? (boolean)
+ #USER_DEF_HEADER_CENTER User defined CENTER title? (boolean);
+ used in COPYSTYLE
+ #USER_DEF_HEADER_LEFT User defined CENTER title? (boolean);
+ used in COPYSTYLE
+ #USER_DEF_HEADER_RIGHT User defined CENTER title? (boolean)
+ used in COPYSTYLE
+ #USERDEF_HDRFTR User defined single string recto/verso
+ header/footer? (boolean)
+ #USERDEF_HDRFTR_RECTO_QUAD 1=left, 2=CENTER, 3=right
+ #USERDEF_HDRFTR_VERSO_QUAD 1=left, 2=CENTER, 3=right
+ #VARIABLE_FOOTER_POS Wandering trap position for processing
+ footnotes and footers; pos depends on number of
+ 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.
+
+<span style="display: block; margin-top: -.5em; margin-bottom: -2.5em;">+++STRINGS+++</span>
+
+ $1ST_LETTER First letter of first arg to LIST
+ $ADJUST_BIB_LEAD 2nd arg to BIBLIOGRAPHY_LEAD; if not blank
+ adjust bib leading
+ $ADJUST_EN_LEAD 2nd arg to ENDNOTE_LEAD; if not blank adjust
+ endnote leading
+ $ADJUST_TOC_LEAD 2nd arg to TOC_LEAD; if not blank adjust
+ toc leading
+ $ATTRIBUTE_COLOR Attribution string color
+ $ATTRIBUTE_STRING Attribution string in doc header
+ $ATTRIBUTE_STRING_COVER Attribution string on cover
+ $ATTRIBUTE_STRING_DOCCOVER Attribution string on doc cover
+ $AUTHOR_&lt;n&gt; Document author(s)
+ $AUTHOR The author, or the first argument
+ passed to .AUTHOR ($AUTHOR_1)
+ $AUTHOR_COLOR Author color
+ $AUTHOR_COVER_&lt;n&gt; Author(s) on cover
+ $AUTHOR_DOCCOVER_&lt;n&gt; Author(s) on doc cover
+ $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
+ $AUTHORS Comma-separated concatenated
+ string of all args passed to .AUTHOR
+ $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_QUAD
+ $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_RULE_GAP Distance between the underscores when
+ BIB_STRING (bib first-page header) is
+ double-underlined
+ $BIB_STRING_SIZE_CHANGE Bib title size (+ or -)
+ $BIB_STRING_UNDERLINE_GAP Distance between BIB_STRING text and (first)
+ underline rule
+ $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
+ $BX_COLOR Box color
+ $BX_DEPTH Box depth
+ $BX_INDENT Box left margin starting position
+ $BX_WEIGHT Box rule weight
+ $BX_WIDTH Box width
+ $CENTER_TITLE What to put in the middle of header
+ title
+ $CH_NUM Chapter number (as a string)
+ $CHAPTER The chapter number
+ $CHAPTER_STRING What to print whenever the word
+ "chapter" is required
+ $CHAPTER_TITLE Concatenated args passed to CHAPTER_TITLE
+ $CHAPTER_TITLE_&lt;n&gt; Chapter title items
+ $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
+ $CL_COLOR Circle (ellipse) color
+ $CL_DEPTH Circle (ellipse) depth
+ $CL_INDENT Circle (ellipse) left margin starting
+ position
+ $CL_WEIGHT Circle (ellipse) rule weight
+ $CL_WIDTH Circle (ellipse) width
+ $CLOSE_INDENT Argument passed to CLOSING_INDENT
+ $CODE_FAM Family to use with CODE
+ $CODE_FT Font to use with CODE
+ $CODE_COLOR Color of CODE
+ $COLOR_SCHEME Color scheme arg passed to NEWCOLOR
+ $COPY_STYLE DRAFT or FINAL
+ $COPYRIGHT Copyright info
+ $COPYRIGHT_COVER Copyright info for cover
+ $COPYRIGHT_DOCCOVER Copyright info for doc cover
+ $COPYRIGHT_FAM Copyright line family
+ $COPYRIGHT_FT Copyright line font
+ $COPYRIGHT_PT_SIZE Base string to which $COPYRIGHT_SIZE_CHANGE
+ is appended
+ $COPYRIGHT_SIZE_CHANGE Copyright line size
+ $COPYRIGHT_COLOR Copyright line color
+ $COPYRIGHT_QUAD Copyright line quad direction
+ $COVER_ATTRIBUTE_COLOR Cover attribution string color
+ $COVER_AUTHOR_COLOR Cover author(s) color
+ $COVER_AUTHOR_FAM Cover author(s) family
+ $COVER_AUTHOR_FT Cover author(s) font
+ $COVER_AUTHOR_PT_SIZE Author point size on cover
+ $COVER_AUTHOR_SIZE_CHANGE Cover author(s) size
+ $COVER_CHAPTER_TITLE_COLOR Color of chapter title on cover
+ $COVER_CHAPTER_TITLE_PT_SIZE Size of chapter title on cover
+ $COVER_COLOR Overall cover color
+ $COVER_COPYRIGHT_PT_SIZE Size of copyright info on cover
+ $COVER_DOCTYPE_PT_SIZE Size of doctype on cover
+ $COVER_FAM Overall cover family
+ $COVER_LEAD_ADJ String appended to DOC_LEAD to arrive at
+ base leading of covers
+ $COVER_SUBTITLE_PT_SIZE Size of subtitle on cover
+ $COVER_TITLE_PT_SIZE Size of title on cover
+ $COVER_TITLE User-defined cover title string
+ $COVER_TITLE_&lt;n&gt; Cover title items
+ $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_UNDERLINE_GAP Distance between baseline of the doctype
+ on covers and the underline
+ $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_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
+ $DC_COLOR Dropcap color
+ $DOC_COVER_ATTRIBUTE_COLOR Doc cover attribution string color
+ $DOC_COVER_AUTHOR_COLOR Doc cover author(s) color
+ $DOC_COVER_AUTHOR_FAM Doc cover author(s) family
+ $DOC_COVER_AUTHOR_FT Doc cover author(s) font
+ $DOC_COVER_AUTHOR_PT_SIZE Size of author on doc cover
+ $DOC_COVER_AUTHOR_SIZE_CHANGE Doc cover author(s) size
+ $DOC_COVER_CHAPTER_TITLE_COLOR Color of chapter title on doc cover
+ $DOC_COVER_CHAPTER_TITLE_PT_SIZE Size of chapter title on doc cover
+ $DOC_COVER_COLOR Overall doc cover color
+ $DOC_COVER_COPYRIGHT_COLOR Doc cover copyright color
+ $DOC_COVER_COPYRIGHT_FAM Doc cover copyright family
+ $DOC_COVER_COPYRIGHT_FT Doc cover copyright font
+ $DOC_COVER_COPYRIGHT_PT_SIZE Size of copyright info on doc cover
+ $DOC_COVER_COPYRIGHT_SIZE_CHANGE Doc cover copyright size
+ $DOC_COVER_DOCTYPE_COLOR Doc cover doctype color
+ $DOC_COVER_DOCTYPE_FAM Doc cover doctype family
+ $DOC_COVER_DOCTYPE_FT Doc cover doctype font
+ $DOC_COVER_DOCTYPE_PT_SIZE Size of doctype on doc cover
+ $DOC_COVER_DOCTYPE_SIZE_CHANGE Doc cover doctype size
+ $DOC_COVER_MISC_COLOR Doc cover misc 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_FAM Overall doc cover family
+ $DOC_COVER_LEAD_ADJ String appended to DOC_LEAD to arrive at base
+ leading of doc covers
+ $DOC_COVER_SUBTITLE_FAM Doc cover subtitle family
+ $DOC_COVER_SUBTITLE_FT Doc cover subtitle font
+ $DOC_COVER_SUBTITLE_PT_SIZE Size of subtitle on doc cover
+ $DOC_COVER_SUBTITLE_SIZE_CHANGE Doc cover subtitle size
+ $DOC_COVER_SUBTITLE_COLOR Doc cover subtitle color
+ $DOC_COVER_TITLE User-defined doc cover title string
+ $DOC_COVER_TITLE_&lt;n&gt; Doc cover title items
+ $DOC_COVER_TITLE_COLOR Doc cover title color
+ $DOC_COVER_TITLE_FAM Doc cover title family
+ $DOC_COVER_TITLE_FT Doc cover title font
+ $DOC_COVER_TITLE_PT_SIZE Size of title on doc cover
+ $DOC_COVER_TITLE_SIZE_CHANGE Doc cover title size
+ $DOC_FAM Predominant font family used in the
+ document
+ $DOC_QUAD Quad used for body text (justified or
+ left)
+ $DOC_TITLE Concatenated args passed to DOCTITLE
+ $DOC_TITLE_&lt;n&gt; DOCTITLE items
+ $DOC_TYPE Document type (default, chapter, named,
+ letter)
+ $DOCCOVER_UNDERLINE_GAP Distance between baseline of doctype and the
+ underline on covers
+ $DOCHEADER_COLOR Color of docheader
+ $DOCHEADER_FAM Family used for all parts of the docheader
+ $DOCHEADER_QUAD Quad direction (LRC) of docheader
+ $DOCHEADER_LEAD_ADJ +|- value applied to #DOC_LEAD to
+ in/decrease leading of doc header
+ $DOCTYPE_COLOR Color of DOCTYPE string in 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
+ $DOCTYPE_UNDERLINE_GAP Distance between baseline of DOCTYPE and the
+ underline in doc header
+ $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_LEAD Leading of endnotes pages
+ $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_LN_SEP User-defined separator to use between line
+ number(s) and endnotes when endnotes are
+ identified by line number
+ $EN_LN_SIZE_CHANGE Size change (+ or -) for line-numbers in
+ line-number identified endnotes
+ $EN_OPEN_BRACKET Open bracket for line-number enumerated
+ 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_RULE_GAP Distance between rules when EN_STRING is
+ double-underlined
+ $EN_STRING_UNDERLINE_GAP Distance between baseline of EN_STRING and
+ underline rule
+ $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_TITLE_UNDERLINE_GAP Distance between baseline of EN_TITLE and
+ underline rule
+ $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_OFFSET_VALUE Arg passed to EPIGRAPH_INDENT if the
+ arg has a unit of measure appended to it
+ $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"
+ $EVAL_EI_ARG Temporary string to find out whether
+ the arg to EPIGRAPH_INDENT ended with
+ a unit of measure
+ $EVAL_QI_ARG Temporary string to find out whether
+ the arg to QUOTE_INDENT ended with
+ a unit of measure
+ eval*[B Used to get substring of \*([B
+ eval*[S Used to get substring of \*([S
+ eval*[s Used to get substring of \*([s
+ $FINIS_COLOR Color of FINIS string
+ $FINIS_STRING What to print when FINIS macro is
+ invoked
+ float-adj:bottom A + or - sign
+ float-adj:top A + or - sign
+ float*type Used with tbl; 'boxed' or 'table'
+ 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
+ $FN_SPACE Post footnote space
+ $FOOTNOTE_COLOR Footnote color
+ $FTR_RECTO_QUAD Quad direction of footer recto
+ $FTR_RECTO_STRING String for footer recto
+ $FTR_VERSO_QUAD Quad direction of footer verso
+ $FTR_VERSO_STRING String for footer verso
+ $HDR_RECTO_QUAD Quad of header recto
+ $HDR_RECTO_STRING String for header recto
+ $HDR_VERSO_QUAD Quad of header verso
+ $HDR_VERSO_STRING String for header verso
+
+<span style="display: block; border-top: 1px solid black; border-bottom: 1px solid black; padding-top: 2px;">**Note: "header", in the descriptions below, means either headers or footers</span>
+ $HDRFTR_CENTER What to put in CENTER part of headers;
+ default doctype
+ $HDRFTR_CENTER_COLOR Color of CENTER part of headers
+ $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_COLOR Color of LEFT part of 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_COLOR Color of RIGHT part of headers
+ $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_RULE_COLOR Color of header rule
+ $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
+ $HDRFTR_TMP_COLOR_SWITCH Temporarily holds HDRFTR_LEFT_COLOR 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
+ $HEAD_UNDERLINE_GAP Distance between a head and the underline
+ $HYPHEN Vertically adjusted hyphen used around page
+ numbers
+ $LHS Holds digits on the left side of the decimal
+ in weight arg passed to RULE_WEIGHT
+ $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_COLOR Linenumber color
+ $LN_FAMILY Linenumber family
+ $LN_FONT Linenumber font
+ $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
+ $LN_SIZE_CHANGE ps in/decrease of linenumbers
+ $MISC_&lt;n&gt; Position of args pass to MISC
+ $MISC_COLOR Misc color
+ $MISC_COVER_&lt;n&gt; Misc items for cover
+ $MISC_DOCCOVER_&lt;n&gt; Misc items for doc cover
+ $MISC_QUAD Misc quad direction
+ $MN-arg&lt;n&gt; Sequentially numbered args passed to MNinit
+ MN-color Color of margin note
+ MN-curr Number of current margin note
+ MN-dir Left or right margin note
+ MN-font Font of margin note
+ MN-left-ad Fill mode of margin note
+ 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
+ $PH_FAM Parahead family
+ $PH_FT Parahead font
+ $PH_SIZE_CHANGE ps in/decrease of paraheads
+ $PH_SPACE Amount of horizontal space between a parahead
+ and the start of paragraph text
+ $PP_FT Font used in paragraphs
+ $RESTORE_PAGENUM_STYLE Hold previous page numbering style
+ $ROMAN_WIDTH&lt;n&gt; The digit(s) appended by user to ROMAN or
+ roman when LIST is invoked
+ $Q_LN_GUTTER Gutter between linenumbers and quotes
+ in quotes
+ $Q_OFFSET_VALUE Arg passed to QUOTE_INDENT if the
+ arg has a unit of measure appended to it
+ $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*post-punct Final punctuation mark of references
+ ref*spec!&lt;n&gt; Holds fields required by differing reference
+ types
+ ref*string The data passed to a reference
+ $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
+ $REF_STYLE MLA bibliography-style or footnote/endnote
+ style; used in ref*add-&lt;x&gt;
+ $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
+ $RHS Holds digits on the right side of the decimal
+ in weight arg passed to RULE_WEIGHT
+ $RL_COLOR Rule color (DRH/DRV)
+ $RL_DEPTH Rule depth (DRH/DRV)
+ $RL_INDENT Left start position of rule (DRH/DRV)
+ $RL_LENGTH Rule length (DRH/DRV)
+ $RL_WEIGHT Rule weight (DRH/DRV)
+ $SAVED_COPYRIGHT Temporarily holds string in $COPYRIGHT
+ $SAVED_RULE_GAP Temporarily holds string in $RULE_GAP
+ $SAVED_DOC_FAM Document family in effect before COLLATE
+ $SAVED_PP_FT $PP_FT in effect at start of
+ .COLLATE; tested for and removed
+ in .PP
+ $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
+ $SIG_SPACE Arg passed to macro, SIGNATURE_SPACE
+ $SUBTITLE Concatenated args passed to SUBTITLE
+ $SUBTITLE_&lt;n&gt; Subtitle items for doc header
+ $SUBTITLE_COLOR Color of subtitle
+ $SUBTITLE_COVER_&lt;n&gt; Subtitle items for cover
+ $SUBTITLE_DOCCOVER_&lt;n&gt; Subtitle items for doc cover
+ $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
+ tbl*center 'C' if set
+ tbl*label Text of tbl caption
+ tbl*needs # of rows of tbl data required to print
+ tbl near bottom of page
+ tbl*user-add-space User-added space before a tbl caption
+ $TITLE Concatenated args pass to TITLE
+ $TITLE_&lt;n&gt; Title items
+ $TITLE_COLOR Color of 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_LEAD Leading of toc pages
+ $TOC_PH_ITEM Toc parahead entry
+ $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
+ $TOC_TITLE_ITEM Toc document title item
+ $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
+
+<span style="display: block; margin-top: -.5em; margin-bottom: -2.5em;">+++PREPROCESSOR KEYWORDS+++</span>
+
+ (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
+
+<span style="display: block; margin-top: -.5em; margin-bottom: -2.5em;">+++ALIASES+++</span>
+
+<span style="display: block; border: 1px solid black; padding-left: 12px; padding-bottom: 9px;">
+<span style="display: block; margin-top: -1em;">Please note:</span>
+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&#8217;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.
+</span>
+
+<span style="display: block; margin-top: -1.5em; margin-bottom: -2.5em;">+++These aliases are for convenience, and header/footer management+++</span>
+
+ BIBLIOGRAPHY_STRING_UNDERSCORE BIBLIOGRAPHY_STRING_UNDERLINE
+ CITATION BLOCKQUOTE
+ CITE BLOCKQUOTE
+ COL_BREAK COL_NEXT
+ DOC_FAM DOC_FAMILY
+ DOC_L_LENGTH DOC_LINE_LENGTH
+ DOC_L_LENGTH DOC_LINE_LENGTH
+ DOC_L_MARGIN DOC_LEFT_MARGIN
+ DOC_L_MARGIN DOC_LEFT_MARGIN
+ DOC_LS DOC_LEAD
+ DOC_PS DOC_PT_SIZE
+ DOC_R_MARGIN DOC_RIGHT_MARGIN
+ DOC_R_MARGIN DOC_RIGHT_MARGIN
+ ENDNOTE_STRING_UNDERSCORE ENDNOTE_STRING_UNDERLINE
+ ENDNOTE_TITLE_UNDERSCORE ENDNOTE_TITLE_UNDERLINE
+ 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
+
+<span style="display: block; margin-top: -.5em; margin-bottom: -2.5em;">+++These aliases are used for docelement type-style control+++</span>
+
+ 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
+ DOCHEADER_QUAD _QUAD
+ 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
+ LINENUMBER_FAMILY _COLOR
+ LINENUMBER_FONT _COLOR
+ LINENUMBER_SIZE _COLOR
+ LINENUMBER_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
+
+<span style="display: block; margin-top: -.5em; margin-bottom: -2.5em;">+++These aliases are used to control underlining/underscoring weights+++</span>
+
+ UNDERSCORE_WEIGHT RULE_WEIGHT
+ HEAD_UNDERLINE_WEIGHT RULE_WEIGHT
+ HEADER_RULE_WEIGHT RULE_WEIGHT
+ FOOTER_RULE_WEIGHT RULE_WEIGHT
+ FOOTNOTE_RULE_WEIGHT RULE_WEIGHT
+ COVER_UNDERLINE_WEIGHT RULE_WEIGHT
+ DOC_COVER_UNDERLINE_WEIGHT RULE_WEIGHT
+ ENDNOTE_STRING UNDERLINE_WEIGHT RULE_WEIGHT
+ ENDNOTE_TITLE UNDERLINE_WEIGHT RULE_WEIGHT
+ BIBLIOGRAPHY_STRING UNDERLINE_WEIGHT RULE_WEIGHT
+</span>
+
+<div class="rule-long" style="margin-top: 2em;"><hr/></div>
+
+<!-- Navigation links -->
+<table style="width: 100%; margin-top: 12px;">
+<tr>
+ <td style="width: 33%;"><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="width: 33%; text-align: right;"><a href="#top">Top</a></td>
+</tr>
+</table>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/momdoc/stylesheet.css b/contrib/mom/momdoc/stylesheet.css
new file mode 100644
index 0000000..9d9efa3
--- /dev/null
+++ b/contrib/mom/momdoc/stylesheet.css
@@ -0,0 +1,691 @@
+/* Copyright (C) 2004-2020 Free Software Foundation, Inc. */
+/* This file is part of mom, which is part of groff, a free software */
+/* project. */
+
+/* You can redistribute it and/or modify it under the terms of the */
+/* "GNU General Public License" as published by the "Free Software */
+/* Foundation", version 2.
+
+/* The license text is available in the internet at */
+/* <http://www.gnu.org/licenses/gpl-2.0.html> */
+
+/* stylesheet for the mom macros documentation */
+
+a:link { color: blue; text-decoration: none; }
+a:hover { color: red; text-decoration: underline; }
+a:visited { color: purple; text-decoration: none; }
+a:visited:hover { color: purple; text-decoration: underline; }
+a.header-link:visited { color: #6e70cc ; }
+a.header-link:visited:hover { color: #6e70cc ; }
+
+a:link.quick { text-decoration: underline; }
+.version /* version number for top of toc.html */
+{
+ font-size: 90% ;
+ text-align: center ;
+}
+
+.page /* Page setup: page color, size and border */
+{
+ width: 67% ;
+ position: relative ;
+ top: 12px ;
+ bottom: 12px ;
+ margin: auto ;
+ padding: 12px ;
+ border: solid 1px #ceac8d ;
+ color: #302419 ;
+ background-color: #ffffeb ;
+ font: 1em/1.5em arial,sans-serif ;
+ font-variant-ligatures: none;
+}
+
+.nobr /* Make <nobr> a class property */
+{
+ white-space: nowrap ;
+ hyphens: none ;
+}
+
+/* Heads */
+
+h1.docs
+{
+ font-family: arial,sans-serif ;
+ font-size: 125% ;
+ text-align: center ;
+ color: #002b56 ;
+ background-color: #e2f1ff ;
+ outline: solid 1px #99cccc ;
+ padding: 6px ;
+}
+h2.docs
+{
+ margin-bottom: -.25em ;
+ font-size: 105% ;
+ color: #000056 ;
+}
+h2.macro-group /* ie "Page setup" or "Indents" or "Multi-columns" */
+{
+ margin-top: 1em ;
+ font-size: 120% ;
+ color: #000056 ;
+ background-color: #dfccad ;
+ padding: 6px ;
+}
+h3.docs
+{
+ margin-bottom: -.5em ;
+ font-size: 95% ;
+ color: #000056 ;
+ text-transform: uppercase ;
+}
+h3.appendices
+{
+ font-size: 100% ;
+ text-transform: none ;
+}
+h3.notes
+{
+ display: inline-block ;
+ margin-top: .5em ;
+}
+h3.control
+{
+ padding-top: .5em ;
+ font-size: 100% ;
+ text-transform: none ;
+}
+h3.numbered
+{
+ font-size: 100% ;
+ margin-bottom: -.5em ;
+}
+h3.macro-id
+{
+ font-size: 105% ;
+ color: #000056 ;
+ text-transform: uppercase ;
+ margin-top: 3px ;
+ margin-bottom: 0px ;
+}
+h4.docs
+{
+ font-size: 95% ;
+ margin-bottom: -.5em ;
+ color: #000056 ;
+}
+h4.doc-param-macros
+{
+ margin-top: -.5em ;
+}
+h4.arg-list
+{
+ margin-top: -.5em ;
+}
+h4.fields
+{
+ color: #302419 ;
+}
+h5.docs
+{
+ margin-bottom: -.5em ;
+ font-size: 95% ;
+ color: #000056 ;
+ text-transform: uppercase ;
+}
+ul.doc-param-macros
+{
+ margin-top: .75em ;
+ margin-left: -.5em ;
+}
+.control-macros-header
+{
+ display: inline-block ;
+ margin-bottom: -.25em ;
+ padding: 2px 6px 0 6px ;
+ outline: 1px solid #000058 ;
+ font-size: 100% ;
+ background-color: #e2f1ff ;
+}
+.control-macro
+{
+ font-size: 100% ;
+ margin-bottom: -.75em ;
+ color: #2f2f71 ;
+}
+.macro-id-overline
+{
+ display: inline-block ;
+ border-top: solid 2px #8d8775 ;
+ margin-bottom: .5em ;
+}
+
+/* Paragraphs */
+
+p.no-indent
+{
+ text-indent: 0px ;
+}
+p.requires
+{
+ font-family: arial,sans-serif ;
+ font-style: italic ;
+ text-indent: 0px ;
+ margin-top: .25em ;
+}
+p.alias
+{
+ font-family: arial,sans-serif ;
+ font-style: normal ;
+ text-indent: 0px ;
+ margin-top: .25em ;
+}
+
+/* Horizontal rules */
+
+hr /* horizontal rules need a border to be colorized) */
+{
+ border: solid 1px #8d8775 ;
+}
+div.rule-short /* for section breaks; top/bottom margins set manually */
+{
+ display: block ;
+ width: 25% ;
+ margin: auto;
+ clear: both ;
+}
+div.rule-medium /* underneath mini-tocs; top/bottom margins set manually */
+{
+ display: block ;
+ width: 40% ;
+ margin: auto;
+ clear: both ;
+}
+div.rule-long /* precedes nav bar at bottom of page */
+{
+ display: block ;
+ width: 90% ;
+ margin: auto;
+}
+
+/* Boxed text */
+
+.box-macro-args /* Macro name+args */
+{
+ display: block ;
+ border: solid 1px #302419 ;
+ padding-top: 5px ;
+ padding-bottom: 3px ;
+ padding-left: 15px ;
+ padding-right: 15px ;
+ background-color: #ffffff ;
+ white-space: nowrap ;
+ overflow: auto ;
+}
+.box-code
+{
+ display: block ;
+ width: 100% ;
+ border: solid 1px #302419 ;
+ padding-top: 5px ;
+ padding-bottom: 18px ;
+ padding-left: 15px ;
+ padding-right: 15px ;
+ color: #6f614a ;
+ background-color: #ffffff ;
+ white-space: nowrap ;
+}
+.box-tip
+{
+ outline: solid 1px #ceac8d ;
+ padding-left: 15px ;
+ padding-right: 15px ;
+ text-align: justify ;
+ background-color: #f9f9d9 ;
+ margin-bottom: 1.5em ;
+ }
+.box-example-layout
+{
+ outline: solid 1px #ceac8d ;
+ padding-left: 15px ;
+ padding-right: 15px ;
+ text-align: justify ;
+ background-color: #f9f9d9 ;
+ margin-bottom: 2.5em ;
+ }
+.box-notes
+{
+ outline: solid 1px #ceac8d ;
+ padding-left: 15px ;
+ padding-right: 15px ;
+ text-align: justify ;
+ background-color: #f9f9d9 ;
+ margin-bottom: 1.5em ;
+ }
+.box-important
+{
+ outline: solid 1px #ce7a65 ;
+ padding-left: 15px ;
+ padding-right: 15px ;
+ text-align: justify ;
+ background-color: #f9f9d9 ;
+ margin-bottom: 1.5em ;
+}
+p.tip
+{
+ padding-top: 9px ;
+ padding-bottom: 9px ;
+ text-indent: 0px ;
+}
+p.tip-top
+{
+ padding-top: 9px ;
+ text-indent: 0px ;
+}
+p.tip-bottom
+{
+ padding-bottom: 9px ;
+ text-indent: 0px ;
+}
+
+/* Pre-formatted code */
+
+span.pre /* pre-formatted multi-line blocks; indent must be exactly 2 spaces */
+{
+ display: block ;
+ position: relative ;
+ top: -1em ;
+ margin-bottom: -1.5em ;
+ font-family: "Lucida Console",monospace ;
+ font-weight: bolder ;
+ font-size: 95% ;
+ white-space: pre ;
+ overflow: auto ;
+}
+span.defaults
+{
+ margin-left: 6px ;
+ padding-bottom: 1em ;
+ font-size: 95% ;
+}
+span.pre-in-pp
+{
+ display: block ;
+ position: relative ;
+ top: -1em ;
+ margin-bottom: -.5em ;
+ font-family: "Lucida Console",monospace ;
+ font-weight: bolder ;
+ font-size: 95% ;
+ white-space: pre ;
+ overflow: auto ;
+}
+span.important
+{
+ font-family: arial,sans-serif ;
+ font-weight: bolder ;
+ color: #8b0000 ;
+}
+span.note
+{
+ font-family: arial,sans-serif ;
+ font-weight: bolder ;
+ color: #443526 ;
+}
+span.additional-note
+{
+ font-family: arial,sans-serif ;
+ font-weight: bolder ;
+ font-style: italic ;
+ color: #443526 ;
+}
+span.tip
+{
+ font-family: arial,sans-serif ;
+ font-weight: bolder ;
+ color: #443526 ;
+}
+span.experts
+{
+ font-family: arial,sans-serif ;
+ font-weight: bolder ;
+ color: #443526 ;
+}
+/* Mini-tocs (usually at top of page) */
+
+/* 1-column, centered mini-toc */
+ul.mini-toc-centered
+{
+ text-align: center ;
+ list-style-type: none ;
+ margin-left: -40px ;
+}
+
+/* 2-column mini-toc column defs*/
+.mini-toc-col-1
+{
+ float: left ;
+ width: 49% ;
+ margin-left: -10px ;
+}
+.mini-toc-col-2
+{
+ float: left ;
+ width: 51% ;
+ clear: right ;
+}
+
+/* 3-column mini-toc column defs */
+.col-1-definitions
+{
+ float: left ;
+ width: 32% ;
+ height: 55em ;
+ padding-bottom: 9px;
+ background-color: #ded4bd ;
+ margin-right: 2% ;
+}
+.col-2-definitions
+{
+ float: left ;
+ width: 32% ;
+ height: 55em ;
+ padding-bottom: 9px;
+ background-color: #ded4bd ;
+ margin-right: 2% ;
+}
+.col-3-definitions
+{
+ float: left ;
+ width: 32% ;
+ height: 55em ;
+ padding-bottom: 9px;
+ background-color: #ded4bd ;
+ margin-bottom: 24px ;
+}
+
+/* List styles */
+
+ul.toc
+{
+ margin-top: .5em ;
+}
+ul.no-enumerator
+{
+ list-style-type: none ;
+}
+.list-head
+{
+ font-family: arial,sans-serif ;
+ font-weight: bolder ;
+ font-size: 110% ;
+ color: #000056 ;
+}
+.list-head-goodies
+{
+ font-family: arial,sans-serif ;
+ font-weight: normal ;
+ font-size: 110% ;
+ color: #000056 ;
+}
+.no-anchor
+{
+ color: #302419 ;
+ font-weight: bold ;
+}
+.text-color
+{
+ color: #302419 ;
+}
+li.item
+{
+ font-family: arial,sans-serif ;
+ font-weight: normal ;
+ font-size: 100% ;
+ margin-left: -10px ;
+ list-style-type: disc ;
+}
+.mini-toc
+{
+ margin-top: -1em ;
+ font-size: 90% ;
+}
+.sublist
+{
+ margin-left: -1em ;
+ font-size: 90% ;
+ color: #302419 ;
+ list-style-type: disc ;
+}
+.sub
+{
+ list-style-type: circle ;
+}
+.normal
+{
+ font-style: normal ;
+ font-size: 100% ;
+}
+.normal-smaller
+{
+ font-weight: normal ;
+ color: #302419 ;
+ font-size: 90% ;
+}
+.normal-sub-sub
+{
+ font-weight: normal ;
+ color: #302419 ;
+ font-size: 90% ;
+}
+
+/* Macro lists / defaults */
+
+div.macro-list-container
+{
+ background-color: #ded4bd ;
+ margin-bottom: 1.5em ;
+}
+h3.macro-list
+{
+ font-size: 100% ;
+ color: #000056 ;
+ text-transform: uppercase ;
+ padding: 9px ;
+}
+ul.macro-list
+{
+ margin-left: -21px ;
+ padding-right: 12px ;
+ list-style-type: none ;
+ font-family: arial,sans-serif ;
+ margin-top: -1.25em ;
+ padding-bottom: 6px ;
+}
+ol.macro-list
+{
+ font-family: arial,sans-serif ;
+ margin-top: -1.25em ;
+ padding-bottom: 6px ;
+}
+
+.defaults-container
+{
+ background-color: #e3d2b1 ;
+ border: 1px solid #3f2c00 ;
+ margin-bottom: 2.5em ;
+}
+h3.defaults
+{
+ font-size: 100% ;
+ color: #000056 ;
+ text-transform: uppercase ;
+ padding: 9px ;
+}
+p.defaults
+{
+ margin-top: .25em ;
+ margin-left: 6px ;
+ margin-right: 12px ;
+ margin-bottom: 0 ;
+}
+#toc-title, #toc-head, #toc-subhead, #toc-parahead
+{
+ display: block ;
+ margin-top: -1em ;
+ margin-bottom: -1em ;
+}
+
+/* Bottom of page spacer */
+
+div.bottom-spacer
+{
+ display: block ;
+ height: 24px ;
+}
+
+/* General markup */
+
+kbd
+{
+ font-family: "Lucida Console",monospace ;
+ font-weight: bold ;
+ font-size: 98% ;
+}
+kbd.macro-args
+{
+ margin-right: .5em ;
+ color: #6f614a ;
+ white-space: nowrap ;
+ overflow: auto ;
+}
+
+/* tocs */
+
+h1.toc
+{
+ font-family: arial,sans-serif ;
+ font-size: 175% ;
+ text-align: center ;
+ color: #002b56 ;
+ background-color: #e2f1ff ;
+ outline: solid 1px #99cccc ;
+ padding: 6px ;
+}
+h2.toc
+{
+ font-size: 120% ;
+ color: #000056 ;
+}
+h3.toc
+{
+ margin-top: -.5em ;
+ margin-bottom: -.5em ;
+ font-size: 100% ;
+ color: #6e70cc ;
+}
+.highlight
+{
+ font-weight: bold ;
+}
+.fourth-level
+{
+ margin-left: -1.25em ;
+ list-style-type: none ;
+}
+ul.toc-docproc
+{
+ margin-left: -1em ;
+}
+.toc-docproc-header
+{
+ margin-top: -.5em ;
+ text-transform: uppercase ;
+}
+a.header-link
+{
+ color: #6e70cc ;
+ font-size: 95% ;
+}
+
+/* Examples */
+
+.examples-container
+{
+ border: solid 1px #917963 ;
+ background-color: #f9f9d9 ;
+ padding-left: 24px ;
+ padding-right: 24px ;
+ padding-top: 3px ;
+ padding-bottom: 3px ;
+}
+
+.examples
+{
+ font-weight: bolder ;
+ font-size: 98% ;
+ color: #524b3f ;
+ margin-top: 12px ;
+ margin-bottom: 3px ;
+}
+
+/* definitions.html */
+
+table.definitions /* mini-toc is set up as a table */
+{
+ margin-top: 12px ;
+ text-align: left ;
+ margin-left: 12px ;
+}
+th.definitions
+{
+ padding-bottom: 6px ;
+ font-size: 120% ;
+ color: #000056 ;
+}
+dt /* definition terms in italic*/
+{
+ font-style: italic ;
+}
+dt.no-italic
+{
+ font-style: normal ;
+}
+
+/* Tables */
+table.quick-ref
+{
+ margin-top: .25em ;
+}
+table.quick-ref, th.quick-ref
+{
+ padding-bottom: .25em ;
+ font-family: "Lucida Console",monospace ;
+ font-weight: bold ;
+ text-align: left ;
+}
+
+td
+{
+ padding: 0 ;
+ padding-left: .5em ;
+}
+
+/* Misc */
+
+span.book-title
+{
+ font-style: italic ;
+}
+
+dt.params
+{
+ font-style: normal ;
+ font-weight: bold ;
+}
+
+dd.cover-args
+{
+ margin-bottom: .25em;
+ margin-left: 1.25em ;
+}
diff --git a/contrib/mom/momdoc/tables-of-contents.html b/contrib/mom/momdoc/tables-of-contents.html
new file mode 100644
index 0000000..1f9affb
--- /dev/null
+++ b/contrib/mom/momdoc/tables-of-contents.html
@@ -0,0 +1,1224 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>Mom -- Document processing, tables of contents</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div id="top" class="page">
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+<tr>
+ <td><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="text-align: right;"><a href="refer.html#top">Next: Bibliographies and references</a></td>
+</tr>
+</table>
+
+<h1 class="docs">Tables of contents</h1>
+
+<div style="width: 68%; margin: auto;">
+<ul class="no-enumerator">
+ <li><a href="#toc-intro">Introduction to tables of contents</a></li>
+ <li><a href="#toc-appearance">Tables of contents appearance and behaviour</a></li>
+ <li><a href="#pdf-output">PDF output</a>
+ <ul style="margin-left: -.5em; list-style-type: disc;">
+ <li><a href="#positioning">Positioning the table of contents</a></li>
+ <li><a href="#auto-relocate-toc">AUTO_RELOCATE_TOC</a></li>
+ <li><a href="#psselect"><kbd>psselect</kbd></a></li>
+ </ul></li>
+ <li><a href="#toc">The TOC macro</a>
+ <ul style="margin-left: -.5em; list-style-type: disc;">
+ <li><a href="#toc-heading">TOC_HEADING</a></li>
+ </ul></li>
+ <li><a href="#toc-control-top">Control macros for tables of contents</a>
+ <ul style="margin-left: -.5em; list-style-type: disc;">
+ <li><a href="#index-toc-control">Table of contents control macros</a></li>
+ </ul></li>
+</ul>
+</div>
+
+<div class="rule-medium"><hr/></div>
+
+<h2 id="toc-intro" class="docs">Introduction to tables of contents</h2>
+
+<p>
+Want a table of contents for your document? Easy. Just enter
+<br/>
+<span class="pre-in-pp">
+ .TOC
+</span>
+as the very last macro of your input file. Mom will have picked
+up all document titles (in
+<a href="rectoverso.html#collate">collated</a>
+documents) and headings, as well as the endnotes section and
+bibliography, if they exist, and assigned them the appropriate page
+number. Talk about a no-brainer!
+</p>
+
+<p>
+That said, tables of contents 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 table of
+contents&#8217; typographic appearance, you can.
+</p>
+
+<h2 id="toc-appearance" class="docs">Tables of contents appearance and behaviour</h2>
+
+<p>
+When you output a table of contents (with
+<kbd><a href="#toc">.TOC</a></kbd>),
+mom finishes processing the last page of your document then breaks
+to a new page for printing the table of contents.
+</p>
+
+<p>
+Mom follows standard typesetting conventions for tables of contents.
+To this end, if
+<a href="headfootpage.html#headers">HEADERS</a>
+are enabled for the document, the first page of the table of
+contents has no page header, but does have a first page number
+(roman numeral), always &#8220;i&#8221;, in the bottom margin. If
+<a href="headfootpage.html#footers">FOOTERS</a>
+are enabled 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 table of contents, simply
+invoke
+<a href="headfootpage.html#footer-on-first-page"><kbd>.FOOTER_ON_FIRST_PAGE</kbd></a>
+immediately before <kbd>.TOC</kbd>.) Subsequent table of contents
+pages have both page headers or footers and a page number.
+</p>
+
+<p>
+Entries in a table of contents are hierarchically indented, as you
+would expect, and if headings are numbered in the body of the document,
+you can instruct mom to number them in the table of contents as
+well (see
+<a href="#toc-entry-numbers">TOC_ENTRY_NUMBERS</a>).
+</p>
+
+<p>
+Tables of contents are never set in columns, regardless of whether
+the rest of the document is. Lastly, if
+<a href="rectoverso.html#recto-verso">recto/verso</a>
+printing is enabled, the table of contents respects it. This
+sometimes leads to tables of contents that begin with the wrong
+margins, but the margins can be corrected either by outputting a
+<a href="headfootpage.html#blank-pages">BLANKPAGE</a>
+or by using the control macro
+<a href="#toc-rv-switch">TOC_RV_SWITCH</a>.
+</p>
+
+<p>
+The overall table of contents
+<a href="definitions.html#family">family</a>,
+<a href="definitions.html#ps">point size</a>
+and
+<a href="definitions.html#leading">lead</a>
+can be altered with
+<a href="definitions.html#controlmacro">control macros</a>,
+as can the family,
+<a href="definitions.html#font">font</a>,
+point size and indent of each level of entry. Furthermore, the page
+numbering style can be changed, as can the amount of visual space
+reserved for entry page numbers.
+</p>
+
+<h2 id="pdf-output" class="docs">PDF output</h2>
+
+<p>
+When files containing a table of contents are processed with
+<a href="using.html#pdfmom" style="font-weight: bold">pdfmom</a>,
+entries in the table of contents are clickable links when the
+document is viewed at the screen. The colour of the links is the
+last <kbd>.PDF_LINK_COLOR</kbd> in effect, so if you wish another
+colour, it should be set just before issuing <kbd>.TOC</kbd>.
+</p>
+
+<p>
+When preparing files for printing, coloured links in both the table
+of contents and elsewhere in the document may not be desirable.
+You can disable the colour by passing
+<a href="using.html#pdfmom" style="font-weight: bold">pdfmom</a>
+the <kbd>-c</kbd> option, like this: <br/>
+<span class="pre-in-pp">
+ pdfmom -c doc.mom &gt; doc.pdf
+</span>
+</p>
+
+<h3 id="positioning" class="docs">Positioning the Table of Contents</h3>
+
+<p>
+Because a table of contents can&#8217;t be generated until the
+end of a document (hence the last macro in the file), it is also
+the last page of the document. While this is desirable for some
+language conventions&mdash;French, for example&mdash;it is not
+desirable for others.
+</p>
+
+<h4 id="auto-relocate-toc" class="docs">Automatic PDF relocation of the Table of Contents</h4>
+
+<p>
+When
+<a href="using.html#pdfmom" style="font-weight: bold">pdfmom</a>
+is used to process files with a table of contents, the macro
+<kbd>.AUTO_RELOCATE_TOC</kbd> can be used to reposition the table
+of contents to the top of the output document, with the presence
+of a cover and/or title page sensibly taken into account. Full
+AUTO_RELOCATE_TOC usage is described in the manual,
+<a href="https://www.schaffter.ca/mom/pdf/mom-pdf.pdf"><span class="book-title">Producing PDFs with groff and mom</span></a>.
+</p>
+
+<p>
+In order to take advantage of automatic table of contents
+repositioning, you must use
+<a href="using.html#pdfmom" style="font-weight: bold">pdfmom</a>
+with groff&#8217;s native PDF driver (i.e. without the
+<strong>-Tps</strong> flag). Files that need to be processed with
+the <strong>-Tps</strong> flag require you to reposition the table
+of contents yourself with <strong>psselect</strong>, described
+below.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+<kbd>AUTO_RELOCATE_TOC</kbd> must come before
+<a href="docprocessing.html#start">START</a>.
+</p>
+</div>
+
+<h4 id="psselect" class="docs"><span style="text-transform: none">Using psselect to relocate the Table of Contents in PostScript documents</span></h4>
+
+<p>
+To change the location of the table of contents in files
+processed with <kbd>pdfmom -Tps</kbd>, you have two choices:
+rearrange the pages by hand (okay for one or two hard copies),
+or use the <strong>psselect</strong> programme provided by the
+<strong>psutils</strong> suite of tools (which you may have to
+install as a package from your distribution if it is not already on
+your system).
+</p>
+
+<p>
+The procedure for using <strong>psselect</strong> to put the
+table of contents near the beginning of a document begins by
+you determining how many pages it contains. You can do this by
+previewing the document with the document viewer of your choice
+(gv, Okular, Evince, etc).
+</p>
+
+<p>
+Once you know the number of pages in the table of contents, you use
+<strong>psselect</strong> to place them where you want.
+</p>
+
+<p>
+Say, for example, the table of contents runs to just one page. The
+command to place a one-page table of contents at the start of a
+document is:
+<br/>
+<span class="pre-in-pp">
+ psselect -p _1,1-_2
+</span>
+The <kbd>-p</kbd> option instructs <kbd>psselect</kbd> that what
+follows is a comma-separated list of the order in which you want
+pages of a document rearranged. The underscore character means
+"counting backwards from the end of the document". Thus, the above
+says: "Put the last page first (i.e. the table of contents), followed
+by all pages from the original first page up to the second to last
+(i.e. the last page before the table of contents)."
+</p>
+
+<p>
+If your table of contents runs to two pages, the option to
+<kbd>psselect</kbd> would look like this:
+<br/>
+<span class="pre-in-pp">
+ psselect -p _1-_2,1-_3
+</span>
+If your table of contents runs to two pages and you have a cover
+page, the command would look like this:
+<br/>
+<span class="pre-in-pp">
+ psselect -p 1,_1-_2,2-_3
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+<kbd>psselect</kbd> outputs to stdout, so you have to redirect the
+output to a new file.
+<br/>
+<span class="pre-in-pp" style="margin-bottom: -1em">
+ psselect -p &lt;page list&gt; &lt;file&gt;.ps &gt; &lt;new-file&gt;.ps
+</span>
+</p>
+</div>
+
+<!-- -TOC- -->
+
+<div class="macro-id-overline">
+<h3 id="toc" class="macro-id">The TOC macro</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>TOC</b> <kbd class="macro-args">[ INCLUDE_TITLE ]</kbd>
+</div>
+
+<p>
+If you want a table of contents, just place <kbd>.TOC</kbd> at the
+very end of your document. Mom takes care of the rest.
+</p>
+
+<p>
+The optional argument, <kbd>INCLUDE_TITLE</kbd>, is needed only
+if your document is standalone, i.e. is not collated, for example
+an essay. By default, mom does not include the title (and page
+number) of standalone documents in the Table of Contents since it
+is largely redundant. If you would like her to include the title,
+invoke <kbd>.TOC</kbd> with <kbd>INCLUDE_TITLE</kbd>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+If the last line of text in a document, before <kbd>.TOC</kbd>,
+falls too close to the bottom margin, or if the line is followed
+by a macro likely to cause a linebreak (e.g. <kbd>.LIST OFF</kbd> or
+<kbd>.IQ</kbd>), mom may output a superfluous blank page before the
+Table of Contents.
+</p>
+
+<p class="tip-bottom" style="margin-top: -1em">
+In order to avoid this, insert
+<a href="typesetting.html#el"><kbd>.EL</kbd></a>
+after the last line of text, before <kbd>.TOC</kbd> and/or any
+concluding macros. For example,
+<br/>
+<span class="pre-in-pp">
+ some concluding text.
+ .EL
+ .TOC
+</span>
+or
+<br/>
+<span class="pre-in-pp">
+ some concluding text.
+ .EL
+ .LIST OFF
+ .TOC
+</span>
+</p>
+</div>
+
+<div class="macro-id-overline">
+<h3 class="macro-id">TOC heading</h3>
+</div>
+
+<div id="toc-heading" class="box-macro-args">
+Macro: <b>TOC_HEADING</b> <kbd class="macro-args">&quot;&lt;single line TOC heading&gt;&quot;</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Argument must be enclosed in double-quotes
+</p>
+
+<p>
+You may sometimes want to insert a line of text into the table of
+contents without it referring to a page number, for example to
+identify a &#8220;Part I&#8221; and a &#8220;Part II&#8221;.
+</p>
+
+<p>
+Placed before any instance of the
+<a href="docprocessing.html#start">START</a>
+macro, TOC_HEADING inserts its text into the table of contents
+before the next section title or heading. A modest amount of
+whitespace is introduced above and beneath to distinguish it easily
+from table of contents entries.
+</p>
+
+<p>
+The appearance of the heading may be controlled with
+the macro
+<a href="docprocessing.html#toc-heading-style">TOC_HEADING_STYLE</a>.
+</p>
+
+
+<div class="rule-short"><hr/></div>
+
+<h2 id="toc-control-top" class="macro-group">Control macros for tables of contents</h2>
+
+<p>
+Aside from allowing you to set the style of table of contents
+entries on a per-level basis, the control macros let you design
+the table of contents as if they were a complete document unto
+themselves (overall family, headers/footers, pagination, etc).
+</p>
+
+<div class="defaults-container" style="background-color: #ded4bd; border: none;">
+<h3 id="index-toc-control" class="docs defaults">Table of contents control macros</h3>
+
+<ol style="margin-top: .5em; padding-bottom: .5em;">
+ <li><a href="#toc-general">General table of contents style control</a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#toc-family">TOC_FAMILY</a> &ndash; base family for tables of contents</li>
+ <li><a href="#toc-pt-size">TOC_PT_SIZE</a> &ndash; base point size for tables of contents</li>
+ <li><a href="#toc-lead">TOC_LEAD</a> &ndash; leading of tables of contents</li>
+ </ul></li>
+ <li><a href="#toc-pagenumbering">Page numbering</a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#paginate-toc">PAGINATE_TOC</a> &ndash; turn table of contents pagination on or off</li>
+ <li><a href="#toc-pagenum-style">TOC_PAGENUM_STYLE</a> &ndash; table of contents page numbering style</li>
+ </ul></li>
+ <li><a href="#toc-header">Header string (e.g. &#8220;Contents&#8221;) and style</a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#toc-header-string">Changing the header string</a></li>
+ <li><a href="#toc-header-v-pos">Header string vertical placement</a></li>
+ <li><a href="#toc-header-style">Header string control macros and defaults</a></li>
+ </ul></li>
+ <li><a href="#toc-style">Entries and reference page number style</a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#toc-pn">Reference page numbers style control</a></li>
+ <li><a href="#toc-title-style">Title entry style control</a></li>
+ <li><a href="#toc-entry-style">Heading entry style control</a></li>
+ <li>Numbering table of contents items
+ <ul style="margin-left: -.75em; list-style: disc">
+ <li><a href="#toc-prefix-ch-number">Prefix chapter/section numbers</a>
+ <ul style="margin-left: -.75em;">
+ <li><a href="#toc-pad-ch-numbers">Pad chapter/section numbers</a></li>
+ </ul></li>
+ <li><a href="#toc-entry-numbers">Numbering heading entries</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a href="#toc-additional">Additional table of contents control macros</a>
+ <ul style="margin-left: -.5em;">
+ <li><a href="#toc-appends-author">Append author(s) to table of contents title entries</a></li>
+ <li><a href="#toc-title-entry">Alter the wording of a table of contents title entry</a></li>
+ <li><a href="#space-toc-items">Space table of contents entries pleasingly</a></li>
+ <li><a href="#toc-padding">Establish the number of placeholders to leave for page reference numbers</a></li>
+ <li><a href="#toc-rv-switch">Switch tables of contents page margins</a></li>
+ </ul></li>
+ <li><a href="#toc-more">I still need more!</a></li>
+</ol>
+</div>
+
+<h4 id="toc-general" class="docs" style="margin-top: -1.5em; margin-bottom: .5em;">1. General tables of contents style control</h4>
+
+<!-- -TOC_FAMILY- -->
+
+<div id="toc-family" class="box-macro-args">
+Macro: <b>TOC_FAMILY</b> <kbd class="macro-args">&lt;family&gt;</kbd>
+</div>
+
+<p>
+TOC_FAMILY establishes the default family for every page element in
+a table of contents, including the table of contents&#8217; header
+string (by default, &#8220;Contents&#8221;) and the page
+number in the top or bottom margin. The default is the prevailing
+document family.
+</p>
+
+<p>
+All page elements in the table of contents also have their own
+_FAMILY control macros, which can be used on a case-by-case basis to
+override the default family set with TOC_FAMILY.
+</p>
+
+<!-- -TOC_PT_SIZE- -->
+
+<div id="toc-pt-size" class="box-macro-args">
+Macro: <b>TOC_PT_SIZE</b> <kbd class="macro-args">&lt;base type size of the toc&gt;</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Does not require a <a href="definitions.html#unitofmeasure">unit of measure</a>; points is assumed
+</p>
+
+<p>
+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. (Compare this with the
+<a href="docelement.html#point-size">_SIZE</a>
+control macros.) The argument represents the base point size
+of tables of contents from which the size of all other table of
+contents elements are calculated.
+</p>
+
+<p>
+The default for
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPESET</kbd></a>
+is 12.5 points (the same default size used in the body of the
+document).
+</p>
+
+<!-- -TOC_LEAD- -->
+
+<div id="toc-lead" class="box-macro-args">
+Macro: <b>TOC_LEAD</b> <kbd class="macro-args">&lt;leading of the toc&gt; [ ADJUST ]</kbd>
+</div>
+
+<p class="requires">
+&bull;&nbsp;Does not require a <a href="definitions.html#unitofmeasure">unit of measure</a>; points is assumed
+</p>
+
+<p>
+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
+<a href="definitions.html#leading">leading</a>
+of tables of contents in
+<a href="definitions.html#picaspoints">points</a>
+unless you append an alternative
+<a href="definitions.html#unitofmeasure">unit of measure</a>.
+For example,
+<br/>
+<span class="pre-in-pp">
+ .TOC_LEAD 14
+</span>
+sets the base leading of tables of contents to 14 points, whereas
+<br/>
+<span class="pre-in-pp">
+ .TOC_LEAD .5i
+</span>
+sets the base leading of tables of contents to 1/2 inch.
+</p>
+
+<p>
+If you want the leading of tables of contents adjusted to fill the
+page, pass TOC_LEAD the optional argument <kbd>ADJUST</kbd>. (See
+<a href="docprocessing.html#doc-lead-adjust">DOC_LEAD_ADJUST</a>
+for an explanation of leading adjustment.)
+</p>
+
+<p>
+The default for
+<a href="docprocessing.html#printstyle">PRINTSTYLE TYPESET</a>
+is the prevailing document lead (16 by default), adjusted.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Even if you give mom a <kbd>.DOC_LEAD_ADJUST&nbsp;OFF</kbd> command,
+she will still, by default, adjust the leading of the table of
+contents. You <i>must</i> enter
+<kbd>TOC_LEAD&nbsp;&lt;lead&gt;</kbd> with no <kbd>ADJUST</kbd>
+argument to disable this default behaviour.
+</p>
+
+<p class="tip-bottom">
+<span class="additional-note">Additional note:</span>
+Tables of contents are always double-spaced in
+<a href="docprocessing.html#printstyle">PRINTSTYLE <kbd>TYPEWRITE</kbd></a>,
+regardless of whether the body of the document is single-spaced.
+</p>
+</div>
+
+<h4 id="toc-pagenumbering" class="docs">2. Page numbering</h4>
+
+<p>
+The pagination style of tables of contents is controlled by the same
+macros that control
+<a href="headfootpage.html#pagination-intro">document page numbering</a>,
+except
+<a href="headfootpage.html#pagenum">PAGENUM</a>
+(tables of contents always start on page 1). The defaults are the
+same as for the rest of the document, with the exception that tables
+of contents, by default, have roman numeral page numbers.
+</p>
+
+<p>
+Therefore, if you wish to change some aspect of table of contents
+pagination style, use the
+<a href="headfootpage.html#index-pagination-control">document pagination control macros</a>
+immediately prior to <kbd>.TOC</kbd>.
+</p>
+
+<p>
+A special macro,
+<a href="#toc-pagenum-style">TOC_PAGENUM_STYLE</a>,
+controls the style of table of contents pagination (i.e. the actual
+table of contents pages&#8217; numbers, not the page number
+references of entries).
+</p>
+
+<!-- -PAGINATE_TOC- -->
+
+<div id="paginate-toc" class="box-macro-args">
+Macro: <b>PAGINATE_TOC</b> <kbd class="macro-args">&lt;toggle&gt;</kbd>
+</div>
+
+<p>
+By default, mom paginates tables of contents. If you&#8217;d like
+her not to, do
+<br/>
+<span class="pre-in-pp">
+ .PAGINATE_TOC OFF
+</span>
+(or <kbd>NO, X,</kbd> etc).
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+Simply invoking
+<kbd>.PAGINATION&nbsp;OFF</kbd>
+or
+<kbd>.PAGINATE&nbsp;OFF</kbd>
+disables table of contents pagination <i>for the first
+page of the table of contents only.</i> You must use
+<kbd>.PAGINATE_TOC&nbsp;OFF</kbd> to disable table of contents
+pagination completely, even if pagination is turned off elsewhere in
+your document.
+</p>
+</div>
+
+<!-- -TOC_PAGENUM_STYLE- -->
+
+<div id="toc-pagenum-style" class="box-macro-args">
+Macro: <b>TOC_PAGENUM_STYLE</b> <kbd class="macro-args">&lt;DIGIT | ROMAN | roman | ALPHA | alpha&gt;</kbd>
+</div>
+<p class="requires">
+See
+<a href="headfootpage.html#pagenum-style"><span style="font-style: normal;">PAGENUM_STYLE</span></a>
+for an explanation of the arguments.
+</p>
+
+<p>
+By default, mom uses roman numerals to number table of contents
+pages. Use TOC_PAGENUM_STYLE if you&#8217;d prefer something else.
+For example, to have standard digits instead of roman numerals, do
+the following:
+<br/>
+<span class="pre-in-pp">
+ .TOC_PAGENUM_STYLE DIGIT
+</span>
+</p>
+
+<h4 id="toc-header" class="docs" style="margin-top: -.5em;">3. Header string and style</h4>
+
+<p>
+The table of contents header string is the title that appears at the top of the
+table of contents. By default, it&#8217;s &#8220;Contents&#8221;.</p>
+
+<div id="toc-header-string" class="box-macro-args">
+Macro: <b>TOC_HEADER_STRING</b> <kbd class="macro-args">&lt;string&gt;</kbd>
+</div>
+
+<p>
+If you&#8217;d like the title of the table of contents to read
+something other than &#8220;Contents&#8221;, do, for
+example
+<br/>
+<span class="pre-in-pp">
+ .TOC_HEADER_STRING "Table of Contents"
+</span>
+</p>
+
+<h5 id="toc-header-v-pos" class="docs" style="margin-top: 1em; text-transform: none;">Header string vertical placement</h5>
+
+<div id="toc-header-v-pos1" class="box-macro-args" style="margin-top: 1em">
+Macro: <b>TOC_HEADER_V_POS</b> <kbd class="macro-args">&lt;distance from top of page&gt;</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+Normally, the TOC header string falls at the same vertical position
+as the
+<a href="definitions.html#docheader">docheader</a>.
+If you&#8217;d like it to fall at a different position, say 2 inches, use
+<br/>
+<span class="pre-in-pp">
+ .TOC_HEADER_V_POS 2i
+</span>
+</p>
+
+<h5 id="toc-header-style" class="docs" style="margin-top: -.5em; text-transform: none;">Header string control macros and defaults</h5>
+
+<div class="defaults-container" style="margin-top: 1em; padding-bottom: 8px;">
+<p class="defaults" style="padding-top: 6px;">
+See
+<a href="docelement.html#control-macro-args">Arguments to the control macros</a>.
+<br/>
+The following TOC_HEADER control macros may also be
+<a href="#grouping">grouped</a>
+using TOC_HEADER_STYLE.
+</p>
+<span class="pre defaults">
+.TOC_HEADER_FAMILY default = prevailing doc family
+.TOC_HEADER_FONT default = bold
+.TOC_HEADER_SIZE default = +4
+.TOC_HEADER_QUAD default = left
+.TOC_HEADER_COLOR default = black
+.TOC_HEADER_CAPS default = no
+.TOC_HEADER_SMALLCAPS default = no
+.TOC_HEADER_UNDERSCORE default = none
+</span>
+</div>
+
+<h4 id="toc-style" class="docs" style="margin-top: -.5em;">4. Entries and reference page numbers style</h4>
+
+<p>
+&#8220;Entries&#8221; refers to the hierarchical arrangement of
+section titles (in
+<a href="rectoverso.html#collate-intro">collated</a>
+documents) and headings as they appear in the table of contents:
+<span class="pre-in-pp">
+ Section title
+ Head level 1
+ Head level 2
+ Head level 3
+ ...
+</span>
+The style for title entries (e.g. chapter numbers or titles) and
+heading levels is controlled by
+<a href="#toc-title-style">TOC_TITLE_STYLE </a>
+and
+<a href="#toc-entry-style">TOC_ENTRY_STYLE</a>
+respectively.
+</p>
+
+<p id="toc-pn">
+&#8220;Reference page numbers&#8221; means the page numbers
+associated with entries. Macros to control their style take the
+form <kbd>.TOC_PN_&lt;SPEC&gt;</kbd>, and the defaults are listed
+here.
+</p>
+
+<div class="defaults-container" style="margin-top: 1em; padding-bottom: 8px;">
+<p class="defaults" style="padding-top: 6px;">
+See
+<a href="docelement.html#control-macro-args">Arguments to the control macros</a>.
+
+<span class="pre defaults">
+.TOC_PN_FAMILY default = prevailing doc family
+.TOC_PN_FONT default = roman
+.TOC_PN_SIZE default = 0
+</span>
+</p>
+</div>
+
+<!-- -TOC_TITLE_STYLE- -->
+
+<div id="toc-title-style" class="box-macro-args">
+Macro: <b>TOC_TITLE_STYLE</b> <kbd class="macro-args">&lt;see below for args&gt;</kbd>
+</div>
+
+<p>
+TOC_TITLE_STYLE allows you to set all the style parameters for
+title entries in the tables of contents with one macro. The
+number of arguments can run long, so you may want to break them into
+several lines with the backslash character (<kbd>\</kbd>). The
+arguments are:
+<br/>
+<span class="pre-in-pp">
+ FAMILY &lt;family&gt;
+ FONT &lt;font&gt;
+ SIZE +|-&lt;n&gt;
+ COLOR &lt;color&gt;
+ INDENT &lt;amount&gt;
+ CAPS | NO_CAPS
+</span>
+The arguments may be entered in any order.
+</p>
+
+<p>
+The family, font, size, and color arguments behave identically
+to the individual control macros that govern other tags, therefore see
+<a href="docelement.html#control-macro-args">Arguments to the control macros</a>
+for usage. Their defaults are the same as for paragraphs in
+<a href="definitions.html#running">running text</a>.
+</p>
+
+<p>
+<kbd>INDENT</kbd> lets you indent title entries by the amount specified, and
+requires a
+<a href="definitions.html#unitofmeasure">unit of measure</a>.
+The default is zero.
+</p>
+
+<p>
+<kbd>CAPS</kbd> instructs mom to capitalize title entries.
+Capitalization may be enabled or disabled on a per-entry-level
+basis.
+</p>
+
+<p>
+As an example, if you want title entries bold, slightly larger than other
+entries and capitalized, you could do either
+<br/>
+<span class="pre-in-pp">
+ .TOC_TITLE_ENTRY FONT B SIZE +.5 CAPS
+</span>
+or
+<br/>
+<span class="pre-in-pp">
+ .TOC_TITLE_ENTRY \
+ FONT B \
+ SIZE +.5 \
+ CAPS
+</span>
+</p>
+
+<!-- -TOC_ENTRY_STYLE- -->
+
+<div id="toc-entry-style" class="box-macro-args">
+Macro: <b>TOC_ENTRY_STYLE</b> <kbd class="macro-args">&lt;level&gt; &lt;see below for remaining args&gt;</kbd>
+</div>
+
+<p>
+TOC_ENTRY_STYLE allows you to set individually all the style
+parameters for any level of entry (beneath titles) in the tables
+of contents. The number of arguments can run long, so you may
+want to break them into several lines with the backslash character
+(<kbd>\</kbd>).
+</p>
+
+<p>
+<kbd>&lt;level&gt;</kbd> corresponds to a
+<a href="docelement.html#heading">HEADING</a>
+level assigned in the body of the document. The remaining arguments
+are as follows.
+<br/>
+<span class="pre-in-pp">
+ FAMILY &lt;family&gt;
+ FONT &lt;font&gt;
+ SIZE +|-&lt;n&gt;
+ COLOR &lt;color&gt;
+ INDENT &lt;amount&gt;
+ CAPS | NO_CAPS
+</span>
+The arguments may be entered in any order.
+</p>
+
+<p>
+The family, font, size, and color arguments behave identically
+to the individual control macros that govern other tags, therefore see
+<a href="docelement.html#control-macro-args">Arguments to the control macros</a>
+for usage. Their defaults are the same as for paragraphs in
+<a href="definitions.html#running">running text</a>.
+</p>
+
+<p>
+<kbd>INDENT</kbd> lets you indent entries by the amount specified, and
+requires a
+<a href="definitions.html#unitofmeasure">unit of measure</a>.
+Mom sensibly indents and aligns all levels of entry. If you change
+the indent for any level, all levels beneath it are still indented
+according to mom&#8217;s normal arrangement, but with the indent
+assigned to <kbd>level</kbd> taken into account. When you use
+<kbd>INDENT</kbd>, the indent is measured from the left edge of
+the text of the previous level, including numbering, if any.
+</p>
+
+<p>
+<kbd>CAPS</kbd> instructs mom to capitalize title entries.
+Capitalization may be enabled or disabled on a per-title basis.
+</p>
+
+<p>
+As an example, if you want a particular entry level, say
+&#8220;2&#8221;, to be in Helvetica, italics, and slightly larger
+than other entries, you could do either
+<br/>
+<span class="pre-in-pp">
+ .TOC_ENTRY_STYLE 2 FAMILY H FONT I SIZE +.25
+</span>
+or
+<br/>
+<span class="pre-in-pp">
+ .TOC_ENTRY_STYLE 2 \
+ FAMILY H
+ FONT I \
+ SIZE +.25
+</span>
+</p>
+
+<!-- -PREFIX_CHAPTER_NUMBERS- -->
+
+<div id="toc-prefix-ch-number" class="box-macro-args">
+Macro: <b>TOC_PREFIX_CHAPTER_NUMBER</b> <kbd class="macro-args">&lt;none&gt; &lt;anything&gt;</kbd>
+</div>
+<p class="alias" style="margin-bottom: 0;">
+<i>Alias:</i> <b>TOC_PREFIX_SECTION_NUMBER</b>
+</p>
+
+<p>
+By default, mom does not prefix a chapter number to chapters or
+section titles in the table of contents. If you would like her to
+do so, invoke <kbd>.TOC_PREFIX_CHAPTER_NUMBER</kbd> without an
+argument before
+<a href="docprocessing.html#start">START</a>.
+</p>
+
+<p>
+You may subsequently disable the prefixing of chapter numbers
+by supplying the macro with any argument (<kbd>OFF</kbd>,
+<kbd>QUIT</kbd>, <kbd>Q</kbd>, <kbd>X</kbd>...) prior to the
+<kbd>.START</kbd> that comes after
+<a href="rectoverso.html#collate"><kbd>.COLLATE</kbd></a>.
+</p>
+
+<p>
+This macro is useful you want chapters numbered in the table of
+contents but the chapters themselves are identified by title only.
+It can be used with both
+<a href="docprocessing.html#doctype">DOCTYPE CHAPTER</a>
+and
+<a href="docprocessing.html#doctype">DOCTYPE DEFAULT</a>.
+The alias <b>TOC_PREFIX_SECTION_NUMBER</b> may be preferable
+in the latter case.
+</p>
+
+<!-- -PAD_TOC_CHAPTER_NUMBERS- -->
+
+<div id="toc-pad-ch-numbers" class="box-macro-args">
+Macro: <b>PAD_TOC_CHAPTER_NUMBERS</b> <kbd class="macro-args">&lt;number of chapters&gt;</kbd>
+</div>
+<p class="alias" style="margin-bottom: 0;">
+<i>Alias:</i> <b>PAD_TOC_SECTION_NUMBERS</b>
+</p>
+
+
+<p>
+If the number of chapters or major sections
+(<a href="docprocessing.html#doctype">DOCTYPE DEFAULT</a>)
+exceeds 9, you can have mom pad the numbers so the rightmost
+numerals of the chapter numbers align. Simply invoke
+<kbd>PAD_TOC_CHAPTER_NUMBERS</kbd> with the number of chapters in
+the document.
+</p>
+
+<p>
+Without padding:
+<br/>
+<span class="pre-in-pp">
+ 9. Chapter Title.....................100
+ 10. Chapter Title....................123
+</span>
+With padding:
+<br/>
+<span class="pre-in-pp">
+ 9. Chapter Title....................100
+ 10. Chapter Title....................123
+</span>
+</p>
+
+<!-- -TOC_ENTRY_NUMBERS- -->
+
+<div id="toc-entry-numbers" class="box-macro-args">
+Macro: <b>TOC_ENTRY_NUMBERS</b> <kbd class="macro-args">&lt;FULL&gt; &lt;TRUNCATE&gt; &lt;NONE&gt;</kbd>
+</div>
+
+<p>
+If numbering is enabled for any level of
+<a href="docelement.html#heading">HEADING</a>,
+mom, by default, includes the numbering in that level&#8217;s
+entries in table of contents. If you would prefer that
+numbering not be included in the table of contents,
+issue <kbd>.TOC_ENTRY_NUMBERS&nbsp;NONE</kbd>. If
+you&#8217;d like to include numbering, but not the full,
+concatenated numbering used in the body of the document, issue
+<kbd>.TOC_ENTRY_NUMBERS&nbsp;TRUNCATE</kbd>.
+</p>
+
+<p>
+Assuming numbering is enabled for HEADINGs 1, 2, and 3,
+<kbd>.TOC_ENTRY_NUMBERS FULL</kbd> (mom&#8217;s default), would
+result in
+<br/>
+<span class="pre-in-pp">
+ 1. Level-1 entry
+ 1.1. Level-2 entry
+ 1.1.1. Level-3 entry
+ 2. Level-1 entry
+ 2.1. Level-2 entry
+ 2.1.1. Level-3 entry
+</span>
+whereas <kbd>.TOC_ENTRY_NUMBERS TRUNCATE</kbd> would produce
+<br/>
+<span class="pre-in-pp">
+ 1. Level-1 entry
+ 1. Level-2 entry
+ 1. Level-3 entry
+ 2. Level-1 entry
+ 1. Level-2 entry
+ 1. Level-3 entry
+</span>
+and <kbd>.TOC_ENTRY_NUMBERS NONE</kbd> would remove numbering
+completely.
+<br/>
+<span class="pre-in-pp">
+ Level-1 entry
+ Level-2 entry
+ Level-3 entry
+ Level-1 entry
+ Level-2 entry
+ Level-3 entry
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+<kbd>.TOC_ENTRY_NUMBERS TRUNCATE</kbd> removes the numbering
+associated with table of contents chapter or section titles
+when
+<a href="docelement.html#prefix-chapter-number">PREFIX_CHAPTER_NUMBER</a>
+is enabled. To enable the numbering of chapter or section titles
+in this circumstance, use
+<a href="#toc-prefix-ch-number">TOC_PREFIX_CHAPTER_NUMBER</a>.
+</p>
+</div>
+
+<h4 id="toc-additional" class="docs" style="margin-top: -1em;">5. Additional table of contents control macros</h4>
+
+<p>
+The following five macros allow you to
+</p>
+<ul style="margin-top: -.5em; margin-left: -.5em;">
+ <li>instruct mom to <a href="#toc-appends-author">append author(s) to</a> <a href="docprocessing.html#title">TITLE</a> <a href="toc-appends-author">entries</a></li>
+ <li><a href="#toc-title-entry">alter the wording of</a> <a href="docprocessing.html#title">TITLE</a> <a href="#toc-title-entry">entries</a></li>
+ <li>instruct mom to <a href="#space-toc-items">space table of contents entries</a> pleasingly</li>
+ <li>establish <a href="#toc-padding">how many placeholders to leave for page number references</a></li>
+ <li><a href="#toc-rv-switch">switch table of contents page margins</a> should they be incorrect for recto/verso printing</li>
+</ul>
+
+<!-- -TOC_APPENDS_AUTHOR- -->
+
+<div id="toc-appends-author" class="box-macro-args">
+Macro: <b>TOC_APPENDS_AUTHOR</b> <kbd class="macro-args">&lt;none&gt; | &quot;&lt;name(s) of authors&gt;&quot;</kbd>
+</div>
+
+<p>
+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 table of contents&#8217; title entry for each story or
+article.
+</p>
+
+<p>
+If you invoke <kbd>.TOC_APPENDS_AUTHOR</kbd> <i>without</i> an
+argument, mom appends the first argument you passed to
+<a href="docprocessing.html#author">AUTHOR</a>
+to table of contents title entries, separated by a front-slash.
+</p>
+
+<p>
+If you invoke <kbd>.TOC_APPENDS_AUTHOR</kbd> <i>with</i> an argument
+(surrounded by double-quotes), mom will append it to the table of
+contents title entries instead. This is useful if you have multiple
+authors you wish to identify by last name only. For example, if
+three authors&mdash;Joe Blough, Jane Doe, and John Deere&mdash;are
+responsible for a single article
+<br/>
+<span class="pre-in-pp">
+ .TOC_APPENDS_AUTHOR "Blough et al."
+</span>
+would be a good way to identify them in the table of contents.
+</p>
+
+<!-- -TOC_TITLE_ENTRY- -->
+
+<div id="toc-title-entry" class="box-macro-args">
+Macro: <b>TOC_TITLE_ENTRY</b> <kbd class="macro-args">&quot;&lt;alternate wording for a title entry in the toc&gt;&quot;</kbd>
+</div>
+
+<p>
+In
+<a href="rectoverso.html#collate">collated</a>
+documents, the title of each chapter appears in the table of
+contents. It may sometimes happen that you don&#8217;t want the
+title as it appears in the table of contents to be the same as what
+appears in the
+<a href="definitions.html#docheader">docheader</a>.
+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
+<br/>
+<span class="pre-in-pp">
+ Chapter 6
+ Burning Bush &mdash; Maybe God Was Right
+</span>
+you might want only the chapter title, not the chapter number, to
+show up in the table of contents. (By default, <kbd>.TOC</kbd>
+generates both.)
+</p>
+
+<p>
+If you want to change the wording of a title entry in the table of
+contents, simply invoke
+<br/>
+<span class="pre-in-pp">
+ .TOC_TITLE_ENTRY
+</span>
+with the desired wording, enclosed in double-quotes. Using the
+example, above,
+<br/>
+<span class="pre-in-pp">
+ .CHAPTER 6
+ .CHAPTER_TITLE "Burning Bush &mdash; Maybe God Was Right"
+ .TOC_TITLE_ENTRY "Burning Bush"
+ .DOCTYPE CHAPTER
+</span>
+
+would identify chapter 6 in the table of contents simply as
+&#8220;Burning Bush&#8221;.
+</p>
+
+<!-- -SPACE_TOC_ITEMS- -->
+
+<div id="space-toc-items" class="box-macro-args">
+Macro: <b>SPACE_TOC_ITEMS</b>
+</div>
+
+<p>
+If you&#8217;d like mom to add a small amount of space between table
+of contents entry levels, use <kbd>.SPACE_TOC_ITEMS</kbd>. Mom will
+visually group entry levels in a way that&#8217;s pleasing to the
+eye. The only catch to this macro is that the bottom margins of
+table of contents pages may not align perfectly.
+</p>
+
+<p>
+Please note that
+<kbd>SPACE_TOC_ITEMS</kbd> is only available with
+<a href="docprocessing.html#printstyle">PRINTSTYLE TYPESET</a>.
+</p>
+
+
+<!-- -TOC_PADDING- -->
+
+<div id="toc-padding" class="box-macro-args">
+Macro: <b>TOC_PADDING</b> <kbd class="macro-args">&lt;number of placeholders to allow for page number listings&gt;</kbd>
+</div>
+
+<p>
+By default, mom allows room for 3 digits in the page number
+references of table of contents entries. If you&#8217;d like some
+other number of placeholders, say 2 (if your document runs to less
+than 100 pages), do
+<br/>
+<span class="pre-in-pp">
+ .TOC_PADDING 2
+</span>
+</p>
+
+<!-- -TOC_RV_SWITCH- -->
+
+<div id="toc-rv-switch" class="box-macro-args">
+Macro: <b>TOC_RV_SWITCH</b>
+</div>
+
+<p>
+TOC_RV_SWITCH doesn&#8217;t take an argument. It simply instructs
+mom to switch the left and right margins of the first table of
+contents page in
+<a href="rectoverso.html#recto-verso">recto/verso</a>
+documents should the table of contents happen to begin on an even
+page when you want an odd, or vice versa.
+</p>
+
+<p>
+The same result can be accomplished by outputting a
+<a href="headfootpage.html#blank-pages">BLANKPAGE</a>.
+</p>
+
+<h4 id="toc-more" class="docs" style="margin-top: -.5em;">6. I still need more!</h4>
+
+<p>
+If there is some aspect of Table of Contents formatting for which
+no TOC control macros are provided, mom has a special
+<a href="definitions.html#toggle">toggle macro</a>
+to help out: TOC_PAGE_SETTINGS.
+</p>
+
+<p>
+TOC_PAGE_SETTINGS allows you to enter extra formatting changes for
+the Table of Contents as if it were simply another collated section
+or chapter of a document. Because it&#8217;s a toggle macro,
+invoking it by itself begins collecting your formatting directives,
+and invoking it with any argument (<kbd>OFF</kbd>, <kbd>QUIT</kbd>,
+<kbd>END</kbd>...) stops the collection.
+</p>
+
+<p>
+TOC_PAGE_SETTINGS is special in that the formatting commands
+contained within it must be preceded by <kbd>\!</kbd> (that&#8217;s
+backslash-exclamation point).
+</p>
+
+<p id="toc-page-settings-example">
+For example, say you want to redesign the default page headers for
+the Tables of Contents so that it only contains the document title
+on the left and &#8220;Contents&#8221; in italics on the right, and
+furthermore adjust the footer margin and footer gap, this is how
+you&#8217;d do it:
+<br/>
+<span class="pre-in-pp">
+ .TOC_PAGE_SETTINGS
+ \!.HEADER_RECTO L "^\E*[$TITLE]#\*[IT]Contents\*[PREV]^"
+ \!.FOOTER_MARGIN 3P
+ \!.B_MARGIN 6P+3p
+ .TOC_PAGE_SETTINGS END
+</span>
+(For an explanation of why the example uses <kbd>.B_MARGIN</kbd> to
+set/change the footer gap, see
+<a href="headfootpage.html#gap-note">here</a>.)
+</p>
+
+<p>
+TOC_PAGE_SETTINGS can be put in the stylesheet section of a document
+(i.e. after
+<a href="docprocessing.html#printstyle">PRINTSTYLE</a>
+and before
+<a href="docprocessing.html#start">START</a>)
+or invoked just before
+<a href="#toc">TOC</a>.
+</p>
+
+<div class="rule-long"><hr/></div>
+
+<!-- Navigation links -->
+<table style="width: 100%; margin-top: 12px;">
+<tr>
+ <td style="width: 33%;"><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="width: 24%; text-align: center;"><a href="#top">Top</a></td>
+ <td style="width: 42%; text-align: right;"><a href="refer.html">Next: Bibliographies and references</a></td>
+</tr>
+</table>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/momdoc/toc.html b/contrib/mom/momdoc/toc.html
new file mode 100644
index 0000000..6273751
--- /dev/null
+++ b/contrib/mom/momdoc/toc.html
@@ -0,0 +1,476 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>Mom, version 2.5_d -- Table of Contents</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div class="page">
+
+ <div class="version">
+ mom, version 2.5_d
+ </div>
+
+<h1 class="toc" style="margin-top: 9px;">Table of Contents</h1>
+
+ <p style="margin-left: 2.75em; margin-right: 2.75em; text-align:center ">
+ The table of contents is large. To ease navigation,
+ click on any link in the
+ <br/>
+ <a href="#quick-toc">Quick Table of Contents</a>
+ <br/>
+ which will take you to the corresponding entry in the
+ <br/>
+ <a href="#detailed-toc">Detailed Table of Contents</a>.
+ <br/>
+ If you&#8217;ve been using mom for a while, you may prefer the
+ <br/>
+ <a href="macrolist.html#top">Quick Reference Guide</a>,
+ <br/>
+ which gives a convenient, categorized list of mom&#8217;s
+ user-space macros with links to corresponding entries in the
+ documentation.
+ </p>
+
+<div class="rule-medium"><hr/></div>
+
+<!-- -QUICK TABLE OF CONTENTS- -->
+
+ <h2 id="quick-toc" class="toc" style="margin-top: 18px; text-align: center;">Quick Table of Contents</h2>
+
+ <div style="width: 50%; margin-top: .75em; margin-left: 12px; float: left;">
+ <h3 id="version-2" class="toc"><a style="color: #6e70cc" href="#v2-notes">VERSION 2.0 NOTES</a></h3>
+ <br/>
+
+ <h3 id="introductory" class="toc"><a style="color: #6e70cc" href="#what">INTRODUCTION TO MOM</a></h3>
+
+ <ul class="toc">
+ <li><a href="#what">What is mom?</a></li>
+ <li><a href="#defs">Definitions of terms used in this manual</a></li>
+ <li><a href="#using">Using mom</a></li>
+ </ul>
+
+ <h3 id="typesetting" class="toc"><a style="color: #6e70cc" href="#typeset">TYPESETTING WITH MOM</a></h3>
+
+ <ul class="toc">
+ <li><a href="#type-intro">Introduction to the typesetting macros</a></li>
+ <li><a href="#page">Page setup</a></li>
+ <li><a href="#param">Basic typesetting parameters</a></li>
+ <li><a href="#just">Justifying, quadding, etc.</a></li>
+ <li><a href="#refine">Refinements</a></li>
+ <li><a href="#mod">Modifying type</a></li>
+ <li><a href="#vert">Vertical movements</a></li>
+ <li><a href="#tab">Tabs</a></li>
+ <li><a href="#col">Multiple columns</a></li>
+ <li><a href="#ind">Indents</a></li>
+ <li><a href="#goodies">Goodies</a></li>
+ <li><a href="#escapes">Inline escapes</a></li>
+ <li><a href="#color">Coloured text</a></li>
+ <li><a href="#graphical">Graphical objects</a></li>
+ </ul>
+ </div>
+
+ <div style="margin-left: 332px;">
+ <h3 id="document-processing" class="toc" style="margin-top: 1.25em;"><a style="color: #6e70cc" href="#doc-proc">DOCUMENT PROCESSING WITH MOM</a></h3>
+
+ <ul class="toc" style="margin-left: 3em;">
+ <li><a href="#doc-proc">Introduction to document processing</a></li>
+ <li><a href="#doc-defaults">Document defaults</a></li>
+ <li><a href="#vert-ws">Vertical whitespace management</a></li>
+ <li><a href="#prelim">Preliminary document setup</a></li>
+ <li><a href="#typemacdoc">Behaviour of the typesetting macros during document processing</a></li>
+ <li><a href="#tags">The document element tags</a> &ndash; headings, paragraphs, quotes, etc.</li>
+ <li><a href="#images">Graphics, floats, and preprocessor support</a></li>
+ <li><a href="#box">Shaded backgrounds and frames</a></li>
+ <li><a href="#hdrftr">Page headers and footers</a></li>
+ <li><a href="#paginate">Pagination</a></li>
+ <li><a href="#rv">Recto/verso printing and collating</a></li>
+ <li><a href="#cover">Cover pages</a></li>
+ <li><a href="#tocs">Tables of contents</a></li>
+ <li><a href="#ref">Bibliographies and references</a></li>
+ <li><a href="#letter">Writing letters</a>
+ <ul style="list-style-type: none;">
+ <li style="display: inline-block; width: 212px; height: 0; margin-top: .5em; margin-left: -2.5em; border: solid 1px #8d8775;">&nbsp;</li>
+ </ul></li>
+ <li style="margin-top: -1em;"><a href="#quick">Quick reference guide</a></li>
+ <li><a href="#appendices">Appendices</a></li>
+ </ul>
+ </div>
+
+ <div class="rule-long" style="clear: both;"><hr/></div>
+
+<!-- -FULL TABLE OF CONTENTS- -->
+
+ <h2 id="detailed-toc" class="toc" style="margin-top: 24px; text-align: center;">Detailed Table of Contents</h2>
+
+ <div style="margin-left: 12px;">
+ <h3 id="v2-notes" class="toc"><a style="color: #6e70cc" href="version-2.html#top">VERSION 2.0 NOTES</a></h3>
+
+ <ul class="toc">
+ <li><a href="version-2.html#prefatory">Prefatory comments</a></li>
+ <li><a href="version-2.html#differences">Differences between 2.0 and 1.x</a>
+ <ul>
+ <li><a href="version-2.html#pdf-support">PDF Support</a></li>
+ <li><a href="version-2.html#covers">Covers</a></li>
+ <li><a href="version-2.html#headings">Headings</a></li>
+ <li><a href="version-2.html#margin-notes">Margin notes</a></li>
+ <li><a href="version-2.html#floats">Floats</a></li>
+ <li><a href="version-2.html#table-of-contents">Table of Contents</a></li>
+ </ul></li>
+ <li><a href="version-2.html#pdfmom">The <strong>pdfmom</strong> wrapper around groff</a></li>
+ <li><a href="version-2.html#install-font">The <strong>install-font</strong> script</a></li>
+ </ul>
+
+ <h3 id="what" class="toc"><a style="color: #6e70cc" href="intro.html#top">1. WHAT IS MOM?</a></h3>
+
+ <ul class="toc">
+ <li><a href="intro.html#intro-intro">1.1 Who is mom meant for?</a></li>
+ <li><a href="intro.html#intro-typesetting">1.2 Typesetting with mom</a></li>
+ <li><a href="intro.html#intro-docprocessing">1.3 Document processing with mom</a></li>
+ <li><a href="intro.html#intro-philosophy">1.4 Mom&#8217;s philosophy</a></li>
+ <li><a href="intro.html#intro-documentation">1.5 A note on mom&#8217;s documentation</a>
+ <ul>
+ <li><a href="intro.html#canonical">1.5.1 Canonical reference materials</a></li>
+ <li><a href="intro.html#macro-args">1.5.2 How to read macro arguments</a></li>
+ <li><a href="intro.html#toggle-macro">1.5.3 &#8220;Toggle&#8221; macros</a></li>
+ <li><a href="intro.html#examples">1.5.4 Examples</a></li>
+ </ul>
+ </li>
+ </ul>
+
+ <h3 id="defs" class="toc"><a style="color: #6e70cc" href="definitions.html#top">2. DEFINITIONS OF TERMS USED IN THIS MANUAL</a></h3>
+
+ <ul class="toc">
+ <li><a href="definitions.html#typesetting-terms">2.1 Typesetting terms</a></li>
+ <li><a href="definitions.html#groff-terms">2.2 Groff terms</a></li>
+ <li><a href="definitions.html#mom-terms">2.3 Mom&#8217;s document processing terms</a></li>
+ </ul>
+
+ <h3 id="using" class="toc"><a style="color: #6e70cc" href="using.html#top">3. USING MOM</a></h3>
+
+ <ul class="toc">
+ <li><a href="using.html#using-intro">3.1 Introduction</a></li>
+ <li><a href="using.html#using-macros">3.2 How to input mom&#8217;s macros</a></li>
+ <li><a href="using.html#viewing">3.3 Processing and viewing documents</a>
+ <ul>
+ <li><a href="using.html#pdf">Mom and pdf</a></li>
+ <li><a href="using.html#pdfmom">pdfmom</a></li>
+ </ul></li>
+ <li><a href="using.html#previewing">3.4 Automatic previewing of documents</a></li>
+ </ul>
+
+<!-- -TYPESETTING MACROS- -->
+
+ <h3 id="typeset" class="toc"><a style="color: #6e70cc" href="typesetting.html#top">4. TYPESETTING WITH MOM</a></h3>
+
+ <ul class="toc">
+ <li><a id="type-intro" href="typesetting.html#typesetting-intro">4.1 Introduction to the typesetting macros</a></li>
+ <li><a id="page" href="typesetting.html#page-setup-intro">4.2 Page setup</a> &ndash; paper size and page margins
+ <ul>
+ <li><a href="typesetting.html#index-page-setup">4.2.1 Macro list</a></li>
+ </ul></li>
+ <li><a id="param" href="typesetting.html#basic-params-intro">4.3 Basic typesetting parameters</a> &ndash; family, font, fallback font, point size, line space, line length, autolead
+ <ul>
+ <li><a href="typesetting.html#index-basic">4.3.1 Macro list</a></li>
+ </ul></li>
+ <li><a id="just" href="typesetting.html#justification-intro">4.4 Justifying, quadding, filling and breaking lines</a>
+ <ul>
+ <li><a href="typesetting.html#index-justification">4.4.1 Macro list</a></li>
+ </ul></li>
+ <li><a id="refine" href="typesetting.html#refinements-intro">4.5 Refinements</a> &ndash; word space, sentence space, letter spacing (track kerning), hyphenation, kerning, ligatures
+ <ul>
+ <li><a href="typesetting.html#index-refinements">4.5.1 Macro list</a></li>
+ </ul></li>
+ <li><a id="mod" href="typesetting.html#modifications-intro">4.6 Modifying Type</a> &ndash; pseudo-italic, -bold, -condensed, and -extended
+ <ul>
+ <li><a href="typesetting.html#index-modifications">4.6.1 Macro list</a></li>
+ </ul></li>
+ <li><a id="vert" href="typesetting.html#aldrld-intro">4.7 Vertical Movements</a> &ndash; moving up and down on the page
+ <ul>
+ <li><a href="typesetting.html#index-aldrld">4.7.1 Macro list</a></li>
+ </ul></li>
+ <li><a id="tab" href="typesetting.html#tabs-intro">4.8 Tabs</a>
+ <ul>
+ <li><a href="typesetting.html#typesetting-tabs">4.8.1 Typesetting tabs</a>
+ <ul>
+ <li><a href="typesetting.html#typesetting-tabs-tut">4.8.1.1 Quickie tutorial</a></li>
+ </ul></li>
+ <li><a href="typesetting.html#string-tabs">4.8.2 String tabs (autotabs)</a>
+ <ul>
+ <li><a href="typesetting.html#string-tabs-tut">4.8.2.1 Quickie tutorial</a></li>
+ </ul></li>
+ <li><a href="typesetting.html#index-tabs">4.8.3 Macro list</a></li>
+ </ul></li>
+ <li><a id="col" href="typesetting.html#multicolumns-intro">4.9 Multiple columns</a>
+ <ul>
+ <li><a href="typesetting.html#index-multicolumns">4.9.1 Macro list</a></li>
+ </ul></li>
+ <li><a id="ind" href="typesetting.html#indents-intro">4.10 Indents</a>
+ <ul>
+ <li><a href="typesetting.html#indents-handling">4.10.1 A brief explanation of how mom handles indents</a></li>
+ <li><a href="typesetting.html#index-indents">4.10.2 Macro list</a></li>
+ </ul></li>
+ <li><a id="goodies" href="goodies.html#top">4.11 Goodies</a>
+ &ndash; aliases, transparent (comment) lines, smartquotes, caps,
+ underscoring/underlining, padding lines, leaders, drop
+ caps, superscripts, user-definable strings, changing the
+ escape character
+ <ul>
+ <li><a href="goodies.html#index-goodies">4.11.1 Macro list</a></li>
+ </ul></li>
+ <li><a id="escapes" href="inlines.html#top">4.12 Inline Escapes</a>
+ <ul>
+ <li><a href="inlines.html#intro-inlines">4.12.1 Introduction to inline escapes</a></li>
+ <li><a href="inlines.html#index-inlines">4.12.2 List of inline escapes</a></li>
+ <li><a href="inlines.html#inlines-mom-top">4.12.3 Mom&#8217;s personal inline escapes</a></li>
+ <li><a href="inlines.html#inlines-groff-top">4.12.4 Commonly-used groff inline escapes</a>
+ <ul>
+ <li><a href="inlines.html#inline-characters-groff">4.12.4.1 Special characters and symbols</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="color" href="color.html#top">4.13 Coloured text</a>
+ <ul>
+ <li><a href="color.html#intro-color">4.13.1 Introduction to coloured text</a></li>
+ <li><a href="color.html#index-color">4.13.2 Macro list</a></li>
+ </ul></li>
+ <li><a id="graphical" href="graphical.html#top">4.14 Graphical objects</a>
+ &ndash; horizontal and vertical rules, boxes, ellipses (circles)
+ <ul>
+ <li><a href="graphical.html#intro-graphical">4.14.1 Introduction to graphical objects</a></li>
+ <li><a href="graphical.html#index-graphical">4.13.2 Macro list</a></li>
+ </ul></li>
+ </ul>
+
+<!-- -DOCUMENT PROCESSING MACORS- -->
+
+ <h3 id="doc-proc" class="toc"><a style="color: #6e70cc" href="docprocessing.html#top">5. DOCUMENT PROCESSING WITH MOM</a></h3>
+ <ul class="toc">
+ <li><a href="docprocessing.html#docprocessing-intro">5.1 Introduction to document processing</a></li>
+ <li><a id="doc-defaults" href="docprocessing.html#defaults">5.2 Document defaults</a> &ndash; papersize, margins, etc.
+ <ul>
+ <li><a id="vert-ws" href="docprocessing.html#vertical-whitespace-management">5.2.1 Vertical whitespace management</a>
+ <ul>
+ <li><a href="docprocessing.html#shim">5.2.1.1 SHIM</a></li>
+ <li><a href="docprocessing.html#flex">5.2.1.2 FLEX</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="prelim" href="docprocessing.html#setup" class="highlight">5.3 PRELIMINARY DOCUMENT SETUP</a>
+ <ul>
+ <li><a href="docprocessing.html#docprocessing-tut">5.3.1 Tutorial</a> &ndash; setting up a mom document</li>
+ <li><a href="docprocessing.html#reference-macros">5.3.2 The reference macros</a> &ndash; metadata mom needs to do her job
+ <ul>
+ <li><a href="docprocessing.html#title">5.3.2.1 TITLE</a></li>
+ <li><a href="docprocessing.html#doc-title">5.3.2.2 DOCTITLE</a></li>
+ <li><a href="docprocessing.html#subtitle">5.3.2.3 SUBTITLE</a></li>
+ <li><a href="docprocessing.html#author">5.3.2.4 AUTHOR</a></li>
+ <li><a href="docprocessing.html#chapter">5.3.2.5 CHAPTER</a></li>
+ <li><a href="docprocessing.html#chapter-title">5.3.2.6 CHAPTER_TITLE</a></li>
+ <li><a href="docprocessing.html#draft">5.3.2.7 DRAFT</a></li>
+ <li><a href="docprocessing.html#revision">5.3.2.8 REVISION</a></li>
+ <li><a href="docprocessing.html#copyright">5.3.2.9 COPYRIGHT</a></li>
+ <li><a href="docprocessing.html#misc">5.3.2.10 MISC</a></li>
+ <li><a href="docprocessing.html#covertitle">5.3.2.11 COVERTITLE</a></li>
+ <li><a href="docprocessing.html#covertitle">5.3.2.12 DOC_COVERTITLE</a></li>
+ <li><a href="docprocessing.html#pdftitle">5.3.2.13 PDF_TITLE</a></li>
+ <li><a href="docprocessing.html#toc-heading">5.3.2.14 TOC_HEADING</a></li>
+ </ul></li>
+ <li><a href="docprocessing.html#docstyle-macros">5.3.3 The docstyle macros</a> &ndash; base templates; what kind of document you&#8217;re creating, how you want it to look overall
+ <ul>
+ <li><a href="docprocessing.html#doctype">5.3.3.1 DOCTYPE</a> &ndash; the kind of document (default, chapter, named, letter)
+ <ul style="list-style-type: circle">
+ <li><a href="docprocessing.html#slides">DOCTYPE SLIDES</a></li>
+ </ul></li>
+ <li><a href="docprocessing.html#printstyle">5.3.3.2 PRINTSTYLE</a> &ndash; typeset or &#8220;typewritten, double-spaced&#8221;</li>
+ <li><a href="docprocessing.html#copystyle">5.3.3.3 COPYSTYLE</a> &ndash; draft or final</li>
+ </ul></li>
+ <li><a href="docprocessing.html#start-macro">5.3.4 Initiate document processing</a>
+ <ul>
+ <li><a href="docprocessing.html#start">5.3.4.1 START</a> &ndash; the required macro to initiate document processing</li>
+ </ul></li>
+ <li><a href="docprocessing.html#docheader">5.3.5 Managing the DOCHEADER</a> &ndash; title, author, etc. on first page
+ <ul>
+ <li><a href="docprocessing.html#docheader-control">5.3.5.1 DOCHEADER control</a></li>
+ </ul></li>
+ <li><a href="docprocessing.html#columns-intro">5.3.6 Setting documents in columns</a></li>
+ <li><a href="docprocessing.html#style-before-start">5.3.7 Establishing type and formatting parameters <span style="font-style: italic">before</span> START</a>
+ <ul>
+ <li><a href="docprocessing.html#type-before-start">5.3.7.1 Use of the typesetting macros before START</a>
+ <ul class="fourth-level">
+ <li>&ndash; <a href="docprocessing.html#include">5.3.7.1.1 Including (sourcing) style sheets and files</a></li>
+ <li>&ndash; <a href="docprocessing.html#color">5.3.7.1.2 Initializing colours</a></li>
+ </ul></li>
+ <li><a href="docprocessing.html#doc-lead-adjust">5.3.7.2 DOC_LEAD_ADJUST</a> &ndash; adjust document
+ <a href="definitions.html#leading">leading</a>
+ to fill pages</li>
+ </ul></li>
+ <li><a href="docprocessing.html#style-after-start">5.3.8 Changing basic type and formatting parameters <span style="font-style: italic">after</span> START</a></li>
+ <li><ul>
+ <li><a id="typemacdoc" href="docprocessing.html#behaviour">5.3.8.1 Behaviour of the typesetting macros during document processing</a></li>
+ <li><a href="docprocessing.html#intro-doc-param">5.3.8.2 Post-START global style-change macros</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="tags" class="highlight" href="docelement.html#top">5.4 THE DOCUMENT ELEMENT TAGS</a>
+ <ul>
+ <li><a href="docelement.html#docelement-intro">5.4.1 Introduction to the document element tags</a>
+ <ul>
+ <li><a href="docelement.html#docelement-control">5.4.1.1 Control macros</a> &ndash; changing style defaults for document element tags</li>
+ <li><a href="docelement.html#control-macro-args">5.4.1.2 Arguments to the control macros</a></li>
+ </ul></li>
+ <li><a href="docelement.html#epigraph-intro">5.4.2 Epigraphs</a></li>
+ <li><a href="docelement.html#pp-intro">5.4.3 Paragraphs</a></li>
+ <li><a href="docelement.html#heading-intro">5.4.4 Headings</a></li>
+ <li><a href="docelement.html#linebreak-intro">5.4.5 Linebreaks</a> &ndash; author linebreaks (section breaks)</li>
+ <li><a href="docelement.html#quote-intro">5.4.6 Quotes</a> &ndash; line for line poetic quotes or unformatted, verbatim text (e.g. blocks of code)</li>
+ <li><a href="docelement.html#blockquote-intro">5.4.7 Blockquotes</a> &ndash; cited material</li>
+ <li><a href="docelement.html#code">5.4.8 Code</a> &ndash; inserting code snippets</li>
+ <li><a href="docelement.html#list-intro">5.4.9 Lists</a> &ndash; nested lists</li>
+ <li><a href="docelement.html#number-lines-intro">5.4.10 Line numbering</a></li>
+ <li><a href="docelement.html#footnote-intro">5.4.11 Footnotes</a></li>
+ <li><a href="docelement.html#endnote-intro">5.4.12 Endnotes</a></li>
+ <li><a href="docelement.html#margin-notes-intro">5.4.13 Margin notes</a></li>
+ <li><a href="docelement.html#finis-intro">5.4.14 Document termination string</a> &ndash; FINIS</li>
+ </ul></li>
+ <li><a id="images" class="highlight" href="images.html#top">5.5 GRAPHICS, FLOATS, AND PREPROCESSOR SUPPORT</a>
+ <ul>
+ <li><a href="images.html#images-intro">5.5.1 Inserting images and graphics</a></li>
+ <li><a href="images.html#converting">5.5.2 Image conversion and file processing</a></li>
+ <li><a href="images.html#pdf-image">5.5.3 PDF_IMAGE</a>
+ <ul>
+ <li><a href="images.html#pdf-image-frame">5.5.3.1 PDF_IMAGE_FRAME</a></li>
+ </ul></li>
+ <li><a href="images.html#pspic">5.5.4 PSPIC</a></li>
+ <li><a href="images.html#floats-intro">5.5.5 Floats</a>
+ <ul>
+ <li><a href="images.html#float">5.5.5.1 FLOAT</a></li>
+ </ul></li>
+ <li><a href="images.html#preprocessor-support">5.5.6 Preprocessor support</a>
+ <ul>
+ <li><a href="images.html#tbl">5.5.6.1 tbl support</a></li>
+ <li><a href="images.html#eqn">5.5.6.2 eqn support</a></li>
+ <li><a href="images.html#pic">5.5.6.3 pic support</a></li>
+ <li><a href="images.html#grap">5.5.6.4 grap support</a>
+ <ul style="list-style-type: disc">
+ <li><a href="images.html#pic-text-style">5.5.6.3.1 PIC_TEXT_STYLE</a></li>
+ </ul></li>
+ <li><a href="images.html#refer">5.5.6.4 refer support</a></li>
+ </ul></li>
+ <li><a href="images.html#captions-and-labels">5.5.7 Captions and labels</a>
+ <ul>
+ <li><a href="images.html#autolabel">5.5.7.1 AUTOLABEL</a></li>
+ <li><a href="images.html#caption-after-label">5.5.7.2 CAPTION_AFTER_LABEL</a></li>
+ <li><a href="images.html#captions-labels-sources">5.5.7.3 CAPTIONS / LABELS / SOURCES&mdash;set style parameters</a></li>
+ <li><a href="images.html#mla">5.5.7.4 MLA</a></li>
+ </ul></li>
+ <li><a href="images.html#lists-of">5.5.8 Lists of Figures, Tables, and Equations</a>
+ <ul>
+ <li><a href="images.html#lists-placement">5.5.8.1 Placement of Lists</a></li>
+ <li><a href="images.html#lists-macros">5.5.8.2 Macros to generate Lists</a></li>
+ <li><a href="images.html#formatting-lists">5.5.8.3 Formatting and style parameters for Lists</a>
+ <ul>
+ <li><a href="#lists-style">5.5.8.3.1 LISTS_STYLE</a></li>
+ </ul></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="box" class="highlight" href="headfootpage.html#top">5.6 SHADED BACKGROUNDS AND FRAMES</a>
+ <ul>
+ <li><a href="images.html#box-intro">5.6.1 Introduction</a></li>
+ <li><a href="images.html#box-macro">5.6.2 The BOX macro</a></li>
+ <li><a href="images.html#box-notes">5.6.3 Additional notes on BOX usage and behaviour</a></li>
+ <li><a href="images.html#page-color">5.6.4 PAGE_COLOR</a></li>
+ </ul>
+ </li>
+ <li><a id="hdrftr" class="highlight" href="headfootpage.html#top">5.7 PAGE HEADERS AND FOOTERS</a>
+ <ul>
+ <li><a href="headfootpage.html#headfootpage-intro">5.7.1 Introduction</a></li>
+ <li><a href="headfootpage.html#description-general">5.7.2 General description of headers/footers</a></li>
+ <li><a href="headfootpage.html#header-style">5.7.3 Default specs for headers/footers</a></li>
+ <li><a href="headfootpage.html#vertical-spacing">5.7.4 Vertical placement and spacing of headers/footers</a></li>
+ <li><a href="headfootpage.html#headfoot-management">5.7.5 Managing page headers and footers</a></li>
+ <li><a href="headfootpage.html#headfoot-control">5.7.6 Control macros for headers/footers</a></li>
+ <li><a href="headfootpage.html#userdef-hdrftr-rv">5.7.7 User-defined, single string recto/verso headers/footers</a>
+ <ul>
+ <li><a href="headfootpage.html#userdef-hdrftr">5.7.7.1 User-defined, single string headers/footers (no recto/verso)</a></li>
+ </ul></li>
+ <li><a href="headfootpage.html#headers-and-footers-intro">5.7.8 Headers and footers on the same page</a></li>
+ </ul></li>
+ <li><a id="paginate" class="highlight" href="headfootpage.html#pagination-intro">5.8 PAGINATION</a>
+ <ul>
+ <li><a href="headfootpage.html#pagination">5.8.1 Introduction</a></li>
+ <li><a href="headfootpage.html#index-pagination">5.8.2 Pagination macros list</a></li>
+ <li><a href="headfootpage.html#blank-pages">5.8.3 Blank pages</a></li>
+ </ul></li>
+ <li><a id="rv" class="highlight" href="rectoverso.html#top">5.9 RECTO/VERSO PRINTING, COLLATING</a>
+ <ul>
+ <li><a href="rectoverso.html#rectoverso-intro">5.9.1 Introduction to recto/verso printing</a>
+ <ul>
+ <li><a href="rectoverso.html#rectoverso-list">5.9.1.1 Macro list</a></li>
+ </ul></li>
+ <li><a href="rectoverso.html#collate-intro">5.9.2 Introduction to collating</a>
+ <ul>
+ <li><a href="rectoverso.html#collate">5.9.2.1 The COLLATE macro</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="cover" class="highlight" href="cover.html#top">5.10 COVER PAGES</a></li>
+ <li><a id="tocs" class="highlight" href="tables-of-contents.html#top">5.11 TABLES OF CONTENTS</a>
+ <ul>
+ <li><a href="tables-of-contents.html#toc-intro">5.11.1 Introduction</a> &ndash; the TOC macro</li>
+ <li><a href="tables-of-contents.html#toc-appearance">5.11.2 Table of contents appearance and behaviour</a></li>
+ <li><a href="tables-of-contents.html#pdf-output">5.11.3 PDF output</a></li>
+ <li><a href="tables-of-contents.html#positioning">5.11.4 Positioning the table of contents</a>
+ <ul>
+ <li><a href="tables-of-contents.html#auto-relocate-toc">5.11.2 Automatic PDF relocation of the Table of Contents</a></li>
+ <li><a href="tables-of-contents.html#psselect">5.11.2 Using psselect to relocate the TOC in PostScript documents</a></li>
+ </ul></li>
+ <li><a href="tables-of-contents.html#index-toc-control">5.11.5 Table of contents control macros</a></li>
+ </ul></li>
+ <li><a id="ref" class="highlight" href="refer.html#top">5.12 BIBLIOGRAPHIES AND REFERENCES</a></li>
+ <li><a id="letter" class="highlight" href="letters.html#top">5.13 WRITING LETTERS</a>
+ <ul>
+ <li><a href="letters.html#letters-intro">5.13.1 Introduction to writing letters</a></li>
+ <li><a href="letters.html#letters-tutorial">5.13.2 Tutorial on writing letters</a></li>
+ <li><a href="letters.html#letters-defaults">5.13.3 Default letter style</a></li>
+ <li><a href="letters.html#index-letters-macros">5.13.4 The letter macros</a></li>
+ </ul></li>
+ </ul>
+ <h3 id="quick" class="toc highlight"><a style="color: #6e70cc" href="macrolist.html#top">6. QUICK REFERENCE GUIDE</a></h3>
+ <h3 id="appendices" class="toc" style="margin-top: .5em;"><a style="color: #6e70cc" href="appendices.html#top">7. APPENDICES</a></h3>
+ <ul class="toc">
+ <li><a href="appendices.html#fonts">7.1 Adding fonts to groff</a>
+ <ul>
+ <li><a href="appendices.html#steps">7.1.1 Step-by-step instructions</a></li>
+ </ul></li>
+ <li><a href="appendices.html#codenotes">7.2 Some reflections on mom</a></li>
+ <li><a href="reserved.html">7.3 List of reserved words (macros, registers, strings)</a></li>
+ <li><a href="appendices.html#contact">7.4 Contact the author</a></li>
+ </ul>
+ </div>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/momdoc/typesetting.html b/contrib/mom/momdoc/typesetting.html
new file mode 100644
index 0000000..51d199e
--- /dev/null
+++ b/contrib/mom/momdoc/typesetting.html
@@ -0,0 +1,4988 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>Mom -- Typesetting Macros</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div id="top" class="page">
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+<tr>
+ <td><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="text-align: right;"><a href="goodies.html#top">Next: Goodies</a></td>
+</tr>
+</table>
+
+<h1 id="typesetting" class="docs">The typesetting macros</h1>
+
+<div id="typesetting-macros-mini-toc" class="mini-toc">
+<div class="mini-toc-col-1">
+<ul class="no-enumerator">
+ <li class="list-head"><a href="#typesetting-macros">Introduction</a></li>
+ <li class="list-head"><a href="#page-setup-intro">Paper and page setup</a>
+ <ul>
+ <li class="item"><a href="#page-setup-note"><i>Important note on page dimensions &amp; papersize</i></a></li>
+ <li class="item"><a href="#index-page-setup">Macro list</a></li>
+ </ul></li>
+ <li class="list-head"><a href="#basic-params-intro">Basic typesetting parameters</a>
+ <ul>
+ <li class="item"><a href="#index-basic">Macro list</a></li>
+ </ul></li>
+ <li class="list-head"><a href="#justification-intro">Justification and quadding/
+ <br/>
+ <span style="margin-left: 1em;">breaking and joining lines</span></a>
+ <ul>
+ <li class="item"><a href="#index-justification">Macro list</a></li>
+ </ul></li>
+ <li class="list-head"><a href="#refinements-intro">Typographic refinements</a>
+ <ul>
+ <li class="item"><a href="#index-refinements">Macro list</a></li>
+ </ul></li>
+ <li class="list-head"><a href="#modifications-intro">Type modifications (pseudo font styles)</a>
+ <ul class="no-enumerator">
+ <li class="item"><a href="#index-modifications">Macro list</a></li>
+ </ul></li>
+ <li class="list-head"><a href="#aldrld-intro">Vertical movements</a>
+ <ul class="no-enumerator">
+ <li class="item"><a href="#index-aldrld">Macro list</a>
+ </li>
+ </ul></li>
+</ul>
+</div>
+<div class="mini-toc-col-2">
+ <ul class="no-enumerator">
+ <li class="list-head"><a href="#tabs-intro">Tabs</a>
+ <ul class="no-enumerator">
+ <li class="item"><a href="#typesetting-tabs">Typesetting tabs</a>
+ <ul style="margin-left: -.5em;">
+ <li class="item" style="margin-left: -.5em; list-style-type: circle;"><a href="#typesetting-tabs-tut">Quickie tutorial on typesetting tabs</a></li>
+ </ul></li>
+ <li class="item"><a href="#string-tabs">String tabs</a>
+ <ul style="margin-left: -.5em;">
+ <li class="item" style="margin-left: -.5em; list-style-type: circle;"><a href="#string-tabs-tut">Quickie tutorial on string tabs</a></li>
+ </ul></li>
+ <li class="item"><a href="#index-tabs">Macro list</a></li>
+ </ul></li>
+ <li class="list-head"><a href="#multicolumns-intro">Multiple columns</a>
+ <ul class="no-enumerator">
+ <li class="item"><a href="#index-multicolumns">Macro list</a>
+ </li>
+ </ul></li>
+ <li class="list-head"><a href="#indents-intro">Indents</a>
+ <ul class="no-enumerator">
+ <li class="item"><a href="#indents-handling">How mom handles indents</a></li>
+ <li class="item"><a href="#index-indents">Macro list</a>
+ </li>
+ </ul></li>
+ <li class="list-head"><a href="goodies.html#goodies">Goodies</a>
+ <ul class="no-enumerator">
+ <li class="item"><a href="goodies.html#goodies-macros">Macro list</a>
+ </li>
+ </ul></li>
+ <li class="list-head"><a href="inlines.html#top">Inline escapes</a>
+ <ul class="no-enumerator">
+ <li class="item"><a href="inlines.html#index-inlines">List of inline escapes</a>
+ </li>
+ </ul></li>
+ <li class="list-head"><a href="color.html">Coloured text</a>
+ <ul class="no-enumerator">
+ <li class="item"><a href="color.html#index-color">Macro list</a></li>
+ </ul></li>
+</ul>
+</div>
+</div>
+
+<div class="rule-medium"><hr/></div>
+
+<h2 id="typesetting-intro" class="docs">Introduction</h2>
+
+<p>
+Mom&#8217;s typesetting macros provide access to groff&#8217;s
+typesetting capabilities. Aside from controlling basic type
+parameters (family, font, line length, point size, leading),
+mom&#8217;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.
+</p>
+
+<p>
+In some cases, mom&#8217;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.
+</p>
+
+<p>
+Mom&#8217;s typesetting macros can be used as a standalone package,
+independent of the
+<a href="docprocessing.html#top">document processing macros</a>.
+With them, you can typeset on-the-fly. Book covers, your best
+friend&#8217;s résumé, a poster for a lost dog&mdash;none of these
+requires structured document processing (page headers, paragraphs,
+headings, footnotes, etc). What they do demand is precise control over
+every element on the page. The typesetting macros give you that
+control.
+</p>
+
+<div class="rule-short" style="margin-bottom: 24px;"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="page-setup-intro" class="macro-group">Paper and page setup: paper size &amp; page margins</h2>
+
+<p>
+The page setup macros establish the physical dimensions of your page
+and the margins you want it to have. The
+<a href="#paper">PAPER</a>
+macro provides a shortcut for setting the page to the correct
+dimensions for a number of common paper sizes. The
+<a href="#page">PAGE</a>
+macro provides a convenient way of setting the page dimensions and
+some or all of the page margins with a single macro.
+</p>
+
+<div class="box-notes">
+<h3 id="page-setup-note" class="docs notes">Important note on page dimensions and papersize</h3>
+
+<p style="margin-top: .5em;">
+When mom files are processed with
+<a href="using.html#pdfmom" style="font-weight: bold">pdfmom</a>,
+which is recommended (see
+<a href="http://www.schaffter.ca/mom/pdf/mom-pdf.pdf"><span class="book-title">Producing PDFs with groff and mom</span></a>),
+page dimensions are automatically passed to groff, and you
+don&#8217;t have to worry about them.
+</p>
+
+<p>
+Mom documents processed directly with <strong>groff</strong>, or with
+<strong>pdfroff</strong>, or with <strong>pdfmom&nbsp;&#8209;Tps</strong>, require
+that the papersize be given on the command line as well if the
+papersize is different from the default on your system. You can
+verify&mdash;or change&mdash;the default papersize by inspecting the
+files
+<br/>
+<span class="pre-in-pp">
+ &lt;path to groff&gt;/font/devps/DESC
+</span>
+and
+<br/>
+<span class="pre-in-pp">
+ &lt;path to groff&gt;/font/devpdf/DESC
+</span>
+(See <strong>man papersize</strong> for list of valid papersize
+names, as well as for instructions on how to enter a non-standard
+size.)
+</p>
+
+<p>
+If you occasionally need to print on sheets that do not
+conform to your default papersize, you must, in addition
+to setting the page dimensions in your mom file, pass the
+<kbd>-P-p&lt;papersize&gt;</kbd> option to <strong>groff</strong>,
+<strong>pdfroff</strong>, or <strong>pdfmom -Tps</strong>.
+</p>
+
+<p>
+For example, suppose your routine papersize is &#8220;letter&#8221;,
+and you need to print something on a legal-sized sheet. After
+telling mom about the legal-size sheet (with either
+<a href="#pagelength">PAGELENGTH</a>
+and
+<a href="#pagewidth">PAGEWIDTH</a>
+or
+<a href="#paper">PAPER</a>,
+or
+<a href="#page">PAGE</a>),
+you must include <kbd>-P-p&lt;papersize&gt;</kbd> on whichever
+command line you use, e.g.
+<br/>
+<span class="pre-in-pp">
+ pdfmom -Tps -mom -P-plegal
+</span>
+Remember, though, that
+<a href="using.html#pdfmom" style="font-weight: bold">pdfmom</a>,
+with no <kbd>-Tps</kbd> option, is smart enough to know the
+papersize from the dimensions provided in your mom file.
+</p>
+
+<p class="tip-bottom">
+Consult <kbd>man groff</kbd>, <kbd>man grops</kbd> and <kbd>man
+groff_font</kbd> for additional information concerning papersizes,
+as well as information on printing in &#8220;landscape&#8221;
+orientation.
+</p>
+</div>
+
+<div class="macro-list-container">
+<h3 id="index-page-setup" class="macro-list">Paper and page setup macros</h3>
+
+<ul class="macro-list">
+ <li><a href="#pagewidth">PAGEWIDTH</a> &ndash; page width</li>
+ <li><a href="#pagelength">PAGELENGTH</a> &ndash; page length</li>
+ <li><a href="#paper">PAPER</a> &ndash; common paper sizes</li>
+ <li><a href="#l-margin">L_MARGIN</a> &ndash; left margin</li>
+ <li><a href="#r-margin">R_MARGIN</a> &ndash; right margin</li>
+ <li><a href="#t-margin">T_MARGIN</a> &ndash; top margin</li>
+ <li><a href="#b-margin">B_MARGIN</a> &ndash; bottom margin</li>
+ <li><a href="#page">PAGE</a> &ndash; page dimensions and margins all in one fell swoop</li>
+ <li><a href="#newpage">NEWPAGE</a> &ndash; start a new page</li>
+</ul>
+</div>
+
+<!-- -PAGEWIDTH- -->
+
+<div class="macro-id-overline">
+<h3 id="pagewidth" class="macro-id">Page width</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>PAGEWIDTH</b> <kbd class="macro-args">&lt;width of printer sheet&gt;</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+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 that the width of your printer sheet is
+8-1/2 inches, you enter
+<br/>
+<span class="pre-in-pp">
+ .PAGEWIDTH 8.5i
+</span>
+Please read the
+<a href="#page-setup-note">Important note on page dimensions and papersize</a>
+for information on ensuring groff respects your PAGEWIDTH.
+</p>
+
+<!-- -PAGELENGTH- -->
+
+<div class="macro-id-overline">
+<h3 id="pagelength" class="macro-id">Page length</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>PAGELENGTH</b> <kbd class="macro-args">&lt;length of printer sheet&gt;</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+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
+<br/>
+<span class="pre-in-pp">
+ .PAGELENGTH 11i
+</span>
+Please read the
+<a href="#page-setup-note">Important note on page dimensions and papersize</a>
+for information on ensuring groff respects your PAGELENGTH.
+</p>
+
+<!-- -PAPER- -->
+
+<div class="macro-id-overline">
+<h3 id="paper" class="macro-id">Paper</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>PAPER</b> <kbd class="macro-args">&lt;paper type&gt; [ LANDSCAPE ]</kbd>
+</div>
+
+<p>
+PAPER provides a convenient way to set the dimensions for some
+common printer sheet sizes. <kbd>&lt;paper&nbsp;type&gt;</kbd> can
+be one of:
+<br/>
+<span class="pre-in-pp">
+ LETTER EXECUTIVE
+ LEGAL 10x14
+ STATEMENT A3
+ TABLOID A4
+ LEDGER A5
+ FOLIO B4
+ QUARTO B5
+</span>
+Say, for example, you have A4-sized sheets in your printer. It&#8217;s
+shorter (and easier) to enter
+<br/>
+<span class="pre-in-pp">
+ .PAPER A4
+</span>
+than to remember the correct dimensions and enter
+<br/>
+<span class="pre-in-pp">
+ .PAGEWIDTH 595p
+ .PAGELENGTH 842p
+</span>
+If you&#8217;d like landscape orientation for your paper type,
+pass PAPER the <kbd>LANDSCAPE</kbd> argument.
+</p>
+
+<p>
+Please read the
+<a href="#page-setup-note">Important note on page dimensions and papersize</a>
+for information on ensuring groff respects your PAPER size.
+</p>
+
+<div class="box-important">
+<p class="tip">
+<span class="important">Important:</span> If you need PAPER,
+it should always be placed at the very top of your file.
+</p>
+</div>
+
+<!-- -L_MARGIN- -->
+
+<div class="macro-id-overline">
+<h3 id="l-margin" class="macro-id">Left margin</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>L_MARGIN</b> <kbd class="macro-args">&lt;left margin&gt;</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+L_MARGIN establishes the distance from the left edge of the printer
+sheet at which you want your type to start.
+<a href="#il">Left indents</a>
+and
+<a href="#tabs">tabs</a>
+are calculated from the value you pass to L_MARGIN.
+If you use the macros
+<a href="#pagewidth">PAGEWIDTH</a>
+or
+<a href="#paper">PAPER</a>
+without setting L_MARGIN, mom automatically sets the left margin to
+1 inch.
+</p>
+
+<p>
+A unit of measure is required and decimal fractions are allowed.
+Therefore, to set the left margin at 3 picas (1/2 inch), you&#8217;d
+enter either
+<br/>
+<span class="pre-in-pp">
+ .L_MARGIN 3P
+</span>
+or
+<span class="pre-in-pp">
+ .L_MARGIN .5i
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> L_MARGIN behaves in a special way
+when you&#8217;re using the
+<a href="docprocessing.html#docprocessing">document processing macros</a>.
+See
+<a href="docprocessing.html#behaviour">Typesetting macros during document processing</a>
+for an explanation.
+</p>
+</div>
+
+<!-- -R_MARGIN- -->
+
+<div class="macro-id-overline">
+<h3 id="r-margin" class="macro-id">Right margin</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>R_MARGIN</b> <kbd class="macro-args">&lt;right margin&gt;</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<div class="box-important">
+<p class="tip">
+<span class="important">IMPORTANT:</span> R_MARGIN, if used, must
+come after
+<a href="#paper">PAPER</a>,
+<a href="#pagewidth">PAGEWIDTH</a>,
+<a href="#l-margin">L_MARGIN</a>
+and/or
+<a href="#page">PAGE</a>
+(if a right margin isn&#8217;t given to PAGE). The reason is that
+R_MARGIN calculates line length from the overall page dimensions and
+the left margin. Mom can&#8217;t make the calculation if
+she doesn&#8217;t know the page width and the left margin.
+</p>
+</div>
+
+<p>
+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.
+</p>
+
+<p>
+The line length macro
+(<a href="#linelength">LL</a>)
+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.
+</p>
+
+<p>
+For example, if you&#8217;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:
+<br/>
+<span class="pre-in-pp">
+ .L_MARGIN 6P
+ .R_MARGIN 6P
+</span>
+That way, you don&#8217;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, e.g.
+<br/>
+<span class="pre-in-pp">
+ .LL 17P+3p
+</span>
+If you use the macros
+<a href="#page">PAGE</a>,
+<a href="#pagewidth">PAGEWIDTH</a>
+or
+<a href="#paper">PAPER</a>
+without invoking <kbd>.R_MARGIN</kbd> afterwards, mom automatically
+sets R_MARGIN to 1 inch. If you set a line length after these
+macros (with
+<a href="#linelength">LL</a>),
+the line length calculated by R_MARGIN is, of course, overridden.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> R_MARGIN behaves in a special way when you&#8217;re
+using the
+<a href="docprocessing.html#docprocessing">document processing macros</a>.
+See
+<a href="docprocessing.html#behaviour">Typesetting macros during document processing</a>
+for an explanation.
+</p>
+</div>
+
+<!-- -T_MARGIN- -->
+
+<div class="macro-id-overline">
+<h3 id="t-margin" class="macro-id">Top margin</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>T_MARGIN</b> <kbd class="macro-args">&lt;top margin&gt;</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+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&#8217;d enter
+<br/>
+<span class="pre-in-pp">
+ .T_MARGIN 2.5c
+</span>
+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
+<a href="definitions.html#baseline">baseline</a>. Therefore,
+<br/>
+<span class="pre-in-pp">
+ .T_MARGIN 1.5i
+</span>
+puts the baseline of the first line of type 1-1/2 inches beneath the
+top of the page.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> T_MARGIN means something slightly
+different when you&#8217;re using the
+<a href="docprocessing.html#docprocessing">document processing macros</a>.
+See
+<a href="docprocessing.html#tb-margins">Top and bottom margins in document processing</a>
+for an explanation.
+</p>
+</div>
+
+<div class="box-important">
+<p class="tip">
+<span class="important">IMPORTANT:</span> T_MARGIN does two
+things: it establishes the top margin for pages that come after
+it <i>and</i> 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
+<a href="#newpage">NEWPAGE</a>,
+like this:
+<br/>
+<span class="pre-in-pp" style="margin-bottom: -1em;">
+ .NEWPAGE
+ .T_MARGIN 6P
+ &lt;text&gt;
+</span>
+</p>
+</div>
+
+<!-- -B_MARGIN- -->
+
+<div class="macro-id-overline">
+<h3 id="b-margin" class="macro-id">Bottom margin</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>B_MARGIN</b> <kbd class="macro-args">&lt;bottom margin&gt;</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+B_MARGIN sets a nominal position at the bottom of the page beyond
+which you don&#8217;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
+<br/>
+<span class="pre-in-pp">
+ .B_MARGIN .75i
+</span>
+Obviously, if you haven&#8217;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.
+</p>
+
+<p>
+Occasionally, owing to a peculiarity in groff, an extra line will
+fall below the nominal bottom margin. If you&#8217;re using the
+<a href="docprocessing.html#docprocessing">document processing macros</a>,
+this is unlikely to happen; the document processing macros are very
+hard-nosed about aligning bottom margins.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> The meaning of B_MARGIN is slightly
+different when you&#8217;re using the document processing macros.
+See
+<a href="docprocessing.html#tb-margins">Top and bottom margins in document processing</a>
+for an explanation.
+</p>
+</div>
+
+<!-- -PAGE- -->
+
+<div class="macro-id-overline">
+<h3 id="page" class="macro-id">Page</h3>
+</div>
+
+<div class="box-macro-args" style="overflow: auto;">
+Macro: <b>PAGE</b> <kbd class="macro-args">&lt;width&gt;&nbsp;[ &lt;length&gt; [ &lt;lm&gt; [ &lt;rm&gt; [ &lt;tm&gt; [ &lt;bm&gt; ] ] ] ] ]</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;All arguments require a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<div class="box-important">
+<p class="tip">
+<span class="important">IMPORTANT:</span> If you&#8217;re using the
+<a href="docprocessing.html#docprocessing">document processing macros</a>,
+PAGE must come after
+<a href="docprocessing.html#printstyle">PRINTSTYLE</a>.
+Otherwise, it should go at the top of a document, prior to any
+text. And remember, when you&#8217;re using the document processing
+macros, top margin and bottom margin mean something slightly
+different than when you&#8217;re using just the typesetting macros
+(see
+<a href="docprocessing.html#tb-margins">Top and bottom margins in document processing</a>).
+</p>
+</div>
+
+<p>
+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&#8217;t
+skip over any. <kbd>&lt;lm&gt;, &lt;rm&gt;, &lt;tm&gt;</kbd>, and
+<kbd>&lt;bm&gt;</kbd> refer to the left, right, top and bottom
+margins respectively.
+</p>
+
+<p>
+Assuming your page dimensions are 11 inches by 17 inches, and
+that&#8217;s all you want to set, enter
+<br/>
+<span class="pre-in-pp">
+ .PAGE 11i 17i
+</span>
+If you want to set the left margin as well, say, at 1 inch, PAGE
+would look like this:
+<br/>
+<span class="pre-in-pp">
+ .PAGE 11i 17i 1i
+</span>
+Now suppose you also want to set the top margin, say, at 1-1/2
+inches. &lt;tm&gt; comes after &lt;rm&gt; in the optional arguments,
+but you can&#8217;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:
+<br/>
+<span class="pre-in-pp">
+ .PAGE 11i 17i 1i 1i 1.5i
+ | |
+ required right---+ +---top margin
+ margin
+</span>
+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
+<br/>
+<span class="pre-in-pp">
+ .PAGE 8.5i 11i 45p 45p 45p 45p
+</span>
+This sets up an 8-1/2 by 11 inch page with margins of 45 points
+(5/8-inch) all around.
+</p>
+
+<p>
+Additionally, if you are not using the
+<a href="docprecessing.html">document processing macros</a>
+and invoke PAGE with a top margin argument, any macro you invoke
+after PAGE will likely move the
+<a href="definitions.html#baseline">baseline</a>
+of the first line of text down by one linespace. To compensate, do
+<br/>
+<span class="pre-in-pp">
+ .RLD 1v
+</span>
+immediately before entering any text.
+</p>
+
+<p>
+Please read the
+<a href="#page-setup-note">Important note on page dimensions and papersize</a>
+for information on ensuring groff respects your PAGE dimensions and
+margins.
+</p>
+
+<!-- -NEWPAGE- -->
+
+<div class="macro-id-overline">
+<h3 id="newpage" class="macro-id">Start a new page</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>NEWPAGE</b>
+</div>
+
+<p>
+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
+<a href="#t-margin">T_MARGIN</a>).
+</p>
+
+<div class="rule-short" style="margin-bottom: 24px;"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="basic-params-intro" class="macro-group">Basic typesetting parameters</h2>
+
+<p>
+The basic typesetting parameter macros deal with fundamental
+requirements for setting type: family, font, point size, leading,
+and line length.
+</p>
+
+<p>
+If you&#8217;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
+<a href="docprocessing.html#behaviour">Typesetting macros during document processing</a>
+for an explanation.
+</p>
+
+<div id="index-basic" class="macro-list-container">
+<h3 class="macro-list">Basic parameter macros</h3>
+<ul class="macro-list">
+ <li><a href="#family">FAMILY</a> &ndash; type family</li>
+ <li><a href="#font">FT</a> &ndash; font</li>
+ <li><a href="#fallback-font">FALLBACK_FONT</a> &ndash; for invalid fonts</li>
+ <li><a href="#ps">PT_SIZE</a> &ndash; point size of type</li>
+ <li><a href="#leading">LS</a> &ndash; line spacing/leading</li>
+ <li><a href="#autolead">AUTOLEAD</a> &ndash; automatic line spacing</li>
+ <li><a href="#linelength">LL</a> &ndash; line length</li>
+</ul>
+</div>
+
+<!-- -FAMILY- -->
+
+<div class="macro-id-overline">
+<h3 id="family" class="macro-id">Type family</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>FAMILY</b> <kbd class="macro-args">&lt;family&gt;</kbd>
+</div>
+<p class="alias">
+<i>Alias:</i> <b>FAM</b>
+</p>
+
+<p>
+FAMILY takes one argument: the name of the
+<a href="definitions.html#family">family</a>
+you want. Groff comes with a small set of basic families, each
+identified by a 1-, 2-or 3-letter mnemonic. The standard families
+are:
+<br/>
+<span class="pre-in-pp">
+ A = Avant Garde
+ BM = Bookman
+ H = Helvetica
+ HN = Helvetica Narrow
+ N = New Century Schoolbook
+ P = Palatino
+ T = Times Roman
+ ZCM = Zapf Chancery
+</span>
+The argument you pass to FAMILY is the identifier at left, above.
+For example, if you want Helvetica, enter
+<br/>
+<span class="pre-in-pp">
+ .FAMILY H
+</span>
+</p>
+
+<div class="box-tip" style="margin-top: -1em;">
+<p class="tip-top">
+<span class="note">Note:</span> The font macro
+(<a href="#font">FT</a>)
+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. <kbd>ZCM</kbd>, for example,
+only exists in one style: Italic (<kbd>I</kbd>). Therefore,
+<kbd>.FT&nbsp;ZCMI</kbd> makes more sense than setting the family to
+<kbd>ZCM</kbd>, then setting the font to <kbd>I</kbd>.
+</p>
+
+<p>
+Furthermore, if you need to access a character from groff's Zapf
+Dingbats font directly, use <kbd>.FT&nbsp;ZD</kbd> or the
+<a href="definitions.html#inlines">inline escape</a>
+<kbd>\f[ZD]</kbd>. Commonly-used dingbats are
+available without changing to the ZD font by using groff's
+pre-defined character escapes, e.g. <kbd>\[rh]</kbd> for a pointing
+right hand; see <kbd>man groff_char</kbd> for a complete list.
+Dingbats that have not been pre-defined must be accessed with the
+<kbd>\N</kbd> escape. For example, <kbd>\f[ZD]\N'37'</kbd> prints
+the (undefined) telephone dingbat.
+</p>
+
+<p id="fam-add-note" class="tip-bottom">
+<span class="additional-note">Additional note:</span>
+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
+<a href="#fallback-font">fallback font</a>.
+</p>
+</div>
+
+<p style="margin-top: -.5em;">
+If you are running a version of groff greater than or
+equal to 1.19.2, when you invoke the FAMILY macro, mom
+&#8220;remembers&#8221; 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:
+<br/>
+<span class="pre-in-pp">
+ .FAMILY BM \" Bookman family
+ .FT I \" Medium Italic
+ &lt;some text&gt; \" Bookman Medium Italic
+ .FAMILY H \" Helvetica family
+ &lt;more text&gt; \" Helvetica Medium Italic
+</span>
+However, if the font style does not exist in the new family, mom
+will set all subsequent type in the
+<a href="#fallback-font">fallback font</a>
+(by default, Courier Medium Roman) until she encounters a
+<a href="#font">FT</a>
+request that&#8217;s valid for the family. For example, assuming
+you don&#8217;t have the font &#8220;Medium Condensed Roman&#8221;
+(mom extension &#8220;CD&#8221;) in the Helvetica family:
+<br/>
+<span class="pre-in-pp">
+ .FAMILY UN \" Univers family
+ .FT CD \" Medium Condensed
+ &lt;some text&gt; \" Univers Medium Condensed
+ .FAMILY H \" Helvetica family
+ &lt;more text&gt; \" Courier Medium Roman!
+</span>
+In the above example, you must follow
+<kbd>.FAMILY&nbsp;H</kbd> with a FT request
+that&#8217;s valid for Helvetica.
+</p>
+
+<p>
+Please see the Appendices,
+<a href="appendices.html#fonts">Adding fonts to groff</a>,
+for information on adding fonts and families to groff, as well as
+to see a list of the extensions mom provides to groff&#8217;s basic
+<b>R</b>, <b>I</b>, <b>B</b>, <b>BI</b> styles.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="tip">Suggestion:</span> When adding
+families to groff, I recommend following the established standard
+for the naming families and fonts. For example, if you add the
+Garamond family, name the font files
+<br/>
+<span class="pre-in-pp">
+ GARAMONDR
+ GARAMONDI
+ GARAMONDB
+ GARAMONDBI
+</span>
+GARAMOND then becomes a valid family name you can pass to FAMILY.
+(You could, of course, shorten GARAMOND to just G, or GD.) <b>R</b>,
+<b>I</b>, <b>B</b>, and <b>BI</b> after GARAMOND are the roman,
+italic, bold and bold-italic fonts respectively.
+</p>
+</div>
+
+<!-- -FT- -->
+
+<div class="macro-id-overline">
+<h3 id="font" class="macro-id">FT</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>FT</b> <kbd class="macro-args">R | I | B | BI | &lt;any other valid font style&gt;</kbd>
+</div>
+<p class="alias">
+<i>Alias:</i> <b>FONT</b>
+</p>
+
+<p>
+By default, groff permits FT to take one of four possible arguments
+specifying the desired font:
+<br/>
+<span class="pre-in-pp">
+ R = (Medium) Roman
+ I = (Medium) Italic
+ B = Bold (Roman)
+ BI = Bold Italic
+</span>
+For example, if your
+<a href="definitions.html#family">family</a>
+is Helvetica, entering
+<br/>
+<span class="pre-in-pp">
+ .FT B
+</span>
+will give you the Helvetica bold
+<a href="definitions.html#font">font</a>.
+If your family were Palatino, you&#8217;d get the Palatino bold
+font.
+</p>
+
+<p>
+Mom considerably extends the range of arguments you can pass to FT,
+making it more convenient to add and access fonts of differing
+<a href="definitions.html#weight">weights</a>
+and
+<a href="definitions.html#shape">shapes</a>
+within the same family. Have a look
+<a href="appendices.html#style-extensions">here</a>
+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
+<a href="appendices.html#fonts">Adding fonts to groff</a>
+for instructions and information.) Please also read the
+<a href="#fam-add-note">Additional note</a>
+found in the description of the FAMILY macro.
+</p>
+
+<p>
+How mom reacts to an invalid argument to FT depends on which version
+of groff you&#8217;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&#8217;ve set up the
+<a href="#fallback-font">fallback font</a>,
+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.
+</p>
+
+<p>
+FT will also accept, as an argument, a full family+font name. For
+example,
+<br/>
+<span class="pre-in-pp">
+ .FT HB
+</span>
+will set subsequent type in Helvetica Bold. However, I strongly
+recommend keeping family and font separate except where doing so is
+genuinely inconvenient.
+</p>
+
+<p>
+For inline control of fonts, see
+<a href="inlines.html#inline-fonts-mom">Inline Escapes, font control</a>.
+</p>
+
+
+<!-- -FALLBACK_FONT- -->
+
+<div class="macro-id-overline">
+<h3 id="fallback-font" class="macro-id">Fallback font</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>FALLBACK_FONT</b> <kbd class="macro-args">&lt;fallback font&gt; [ ABORT | WARN ]</kbd>
+</div>
+
+<p>
+In the event that you pass an invalid argument to
+<a href="#font">.FAMILY</a>
+(i.e. a non-existent family), mom, by default, uses the fallback
+font, Courier Medium Roman (CR), in order to continue processing
+your file.
+</p>
+
+<p>
+If you&#8217;d prefer another fallback font, pass FALLBACK_FONT the
+full family+font name of the font you&#8217;d like. For example, if
+you&#8217;d rather the fallback font were Times Roman Medium Roman,
+<br/>
+<span class="pre-in-pp">
+ .FALLBACK_FONT TR
+</span>
+would do the trick.
+</p>
+
+<p>
+Mom issues a warning whenever a font style set with
+<a href="#font">FT</a>
+does not exist, either because you haven&#8217;t registered the
+style (see
+<a href="appendices.html#register-style">here</a>
+for instructions on registering styles), or because the font style
+does not exist in the current family set with
+<a href="#family">FAMILY</a>.
+By default, mom then aborts, which allows you to correct the
+problem.
+</p>
+
+<p>
+If you&#8217;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 <kbd>WARN</kbd>, either by itself, or in
+conjunction with your chosen fallback font.
+</p>
+
+<p>
+Some examples of invoking FALLBACK_FONT:
+</p>
+
+<ul class="no-enumerator" style="margin-left: -1em;">
+<li style="margin-top: -.5em;">
+<kbd>.FALLBACK_FONT WARN</kbd>
+<br/>
+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.
+<br/>
+</li>
+<li style="margin-top: .5em;">
+<kbd>.FALLBACK_FONT TR WARN</kbd>
+<br/>
+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, &#8220;TR&#8221; will be
+the fallback font whenever you try to access a family that does not
+exist.
+</li>
+<li style="margin-top: .5em;">
+<kbd>.FALLBACK_FONT TR ABORT</kbd>
+<br/>
+mom will abort whenever you try to access a non-existent font, and
+will use the fallback font &#8220;TR&#8221; whenever you try to
+access a family that does not exist.
+</li>
+</ul>
+
+<p>
+If, for some reason, you want to revert to ABORT, just enter
+<kbd>.FALLBACK_FONT&nbsp;ABORT</kbd> and mom will once again abort
+on font errors.
+</p>
+
+<!-- -PT_SIZE- -->
+
+<div class="macro-id-overline">
+<h3 id="ps" class="macro-id">Point size of type</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>PT_SIZE</b> <kbd class="macro-args">&lt;size of type in points&gt;</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Does not require a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+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&#8217;s a near universal convention that type size
+is measured in points. Therefore, to change the type size to, say,
+11 points, enter
+<br/>
+<span class="pre-in-pp">
+ .PT_SIZE 11
+</span>
+Point sizes may be fractional (e.g. 10.25 or 12.5).
+</p>
+
+<p>
+If you invoke PT_SIZE without an argument, it reverts to its former
+value. For example, if your point size is 10 and you change it to
+12 with <kbd>.PT_SIZE&nbsp;12</kbd>, entering <kbd>.PT_SIZE</kbd>
+(i.e. without an argument) resets the point size to 10.
+</p>
+
+<p>
+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
+<br/>
+<span class="pre-in-pp">
+ .PT_SIZE +2
+</span>
+then later reset it to 12 with
+<span class="pre-in-pp">
+ .PT_SIZE -2
+</span>
+or, more simply, just
+<span class="pre-in-pp">
+ .PT_SIZE
+</span>
+The size of type can also be changed inline. See
+<a href="inlines.html#inline-size-mom">Inline Escapes, changing point size</a>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> It is unfortunate that the
+<kbd>pic</kbd> preprocessor has already taken the name,
+<kbd>PS</kbd>, and thus mom&#8217;s macro for setting point
+sizes can&#8217;t use it. However, if you aren&#8217;t using
+<kbd>pic</kbd>, you might want to
+<a href="goodies.html#alias">alias</a>
+PT_SIZE as PS, since there&#8217;d be no conflict. For example
+<br/>
+<span class="pre-in-pp">
+ .ALIAS PS PT_SIZE
+</span>
+would allow you to set point sizes with <kbd>.PS</kbd>.
+</p>
+</div>
+
+<!-- -LS- -->
+
+<div class="macro-id-overline">
+<h3 id="leading" class="macro-id">Line spacing / leading</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>LS</b> <kbd class="macro-args">&lt;distance between lines&gt;</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Does not require a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+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
+<a href="definitions.html#leading">leading</a>
+is most often given in points. Therefore, to set the linespace to
+14 points, you would enter
+<br/>
+<span class="pre-in-pp">
+ .LS 14
+</span>
+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
+<br/>
+<span class="pre-in-pp">
+ .LS .25i
+</span>
+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
+<br/>
+<span class="pre-in-pp">
+ .LS +3
+</span>
+then later reset it to 14 points with
+<br/>
+<span class="pre-in-pp">
+ .LS -3
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="experts">Experts:</span> LS should not be confused with
+the groff primitive <kbd>.ls</kbd>. LS acts like
+<kbd>.vs</kbd>. mom does not provide a macro analogous to
+<kbd>.ls</kbd>.
+</p>
+</div>
+
+<!-- -AUTOLEAD- -->
+
+<div class="macro-id-overline">
+<h3 id="autolead" class="macro-id">Automatic line spacing</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>AUTOLEAD</b> <kbd class="macro-args">&lt;amount of automatic leading&gt; [FACTOR]</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Does not require a <a href="definitions.html#unitofmeasure">unit of measure</a>
+<br/>
+(Please see
+<a href="docprocessing.html#autolead">here</a>
+for information on using
+<span style="font-style: normal">AUTOLEAD</span> during document
+processing.)
+</p>
+
+<p>
+Without the <kbd>FACTOR</kbd> argument, AUTOLEAD calculates the
+linespace for you by adding its argument to the current point size
+of type. All subsequent
+<a href="#ps">PT_SIZE</a>
+requests automatically update the linespacing by the autolead amount.
+</p>
+
+<p>
+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).
+</p>
+
+<p>
+As an example, if your current point size of type is 12, entering
+<br/>
+<span class="pre-in-pp">
+ .AUTOLEAD 2
+</span>
+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
+<a href="definitions.html#inlines">inline</a>)
+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.
+</p>
+
+<p>
+Automatic updating of the linespacing continues until you enter a
+&#8220;manual&#8221; line space value with
+<a href="#leading">LS</a>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="experts">Experts:</span> Please note that the groff
+<a href="definitions.html#primitives">primitives</a>,
+<kbd>.vs</kbd> and <kbd>.ps</kbd>, are unaffected by, and have no
+effect, on AUTOLEAD.
+</p>
+</div>
+
+<p>
+If you give AUTOLEAD the optional FACTOR argument, AUTOLEAD
+calculates the line space as a factor of the
+<a href="definitions.html#numericargument">numeric argument</a>
+you gave AUTOLEAD. For example, if your point size is 12,
+<br/>
+<span class="pre-in-pp">
+ .AUTOLEAD 1.125 FACTOR
+</span>
+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).
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> There&#8217;s no need to prepend a
+plus sign
+(<kbd>+</kbd>)
+to AUTOLEAD&#8217;s argument, although you may do so if you wish.
+</p>
+</div>
+
+<!-- -LL- -->
+
+<div class="macro-id-overline">
+<h3 id="linelength" class="macro-id">Line length</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>LL</b> <kbd class="macro-args">&lt;line length&gt;</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+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.
+</p>
+
+<p>
+LL requires a unit of measure. Therefore, to set the line length to
+39 picas, you would enter
+<br/>
+<span class="pre-in-pp">
+ .LL 39P
+</span>
+As with other macros that require a unit of measure, the argument to
+LL may be fractional. For example,
+<br/>
+<span class="pre-in-pp">
+ .LL 4.5i
+</span>
+sets the line length to 4-1/2 inches.
+</p>
+
+<p>
+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
+<a href="definitions.html#picaspoints">points</a>, you could
+do
+<br/>
+<span class="pre-in-pp">
+ .LL +3p
+</span>
+This is especially handy when you want to &#8220;hang&#8221;
+punctuation outside the right margin since you can pass
+groff&#8217;s
+<a href="inlines.html#inline-stringwidth-groff"><kbd>\w</kbd></a>
+escape as the argument to LL, like this:
+<br/>
+<span class="pre-in-pp">
+ .LL +\w'.'u
+</span>
+The above example increases the current line length by the width of
+a period. Notice that you must append the
+<a href="definitions.html#unitofmeasure">unit of measure</a>,
+<b>u</b>, to the escape since LL requires a unit of measure.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> The right margin macro
+<a href="#r-margin">(R_MARGIN)</a>
+can also be used to set line length.
+</p>
+</div>
+
+<div class="rule-short"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="justification-intro" class="macro-group">Justification and quadding/breaking and joining lines</h2>
+
+<p>
+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).
+</p>
+
+<p>
+These macros also determine whether or not
+<a href="definitions.html#inputline">input lines</a>
+are joined and
+<a href="definitions.html#filled">filled</a>
+during output.
+</p>
+
+<p>
+Additionally, macros that deal with how to break
+<a href="definitions.html#outputline">output lines</a>
+are covered in this section, as is the
+<a href="definitions.html#inlines">inline escape</a>
+for joining input lines.
+</p>
+
+<p>
+You may encounter some words here that are unfamiliar. Refer to
+<a href="definitions.html#typesetting">Typesetting terms</a>
+and
+<a href="definitions.html#groff">Groff terms</a>
+for an explanation.
+</p>
+
+<div id="index-justification" class="macro-list-container">
+<h3 class="macro-list">Justification and quadding/breaking and joining lines macros</h3>
+<ul class="macro-list">
+ <li>Fill modes
+ <ul style="list-style-type: none; margin-left: -1em;">
+ <li><a href="#justify">JUSTIFY</a> &ndash; set lines justified</li>
+ <li><a href="#quad">QUAD</a> &ndash; set filled lines flush left, right or centred</li>
+ </ul></li>
+ <li>Nofill modes
+ <ul style="list-style-type: none; margin-left: -1em;">
+ <li><a href="#lrc">LEFT</a> &ndash; set non-filled lines flush left</li>
+ <li><a href="#lrc">RIGHT</a> &ndash; set non-filled lines flush right</li>
+ <li><a href="#lrc">CENTER</a> &ndash; set non-filled lines centred</li>
+ </ul></li>
+ <li>Breaking lines
+ <ul style="list-style-type: none; margin-left: -1em;">
+ <li><a href="#br">BR</a> &ndash; manually break an output line</li>
+ <li><a href="#el">EL</a> &ndash; break a line without advancing to the next output line</li>
+ <li><a href="#space">SPACE</a> &ndash; break a line and add space before the next output line</li>
+ <li><a href="#spread">SPREAD</a> &ndash; break and force-justify an output line</li>
+ </ul></li>
+ <li>Joining input lines in <a href="definitions.html#filled">nofill mode</a>
+ <ul style="list-style-type: none; margin-left: -1em;">
+ <li><a href="#join">\c</a> inline escape</li>
+ </ul></li>
+</ul>
+</div>
+
+<!-- -JUSTIFY- -->
+
+<div class="macro-id-overline">
+<h3 id="justify" class="macro-id">Justify lines</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>JUSTIFY</b>
+</div>
+
+<p class="requires">
+(See
+<a href="definitions.html#filled">fill mode</a>
+for a definition of the difference between &#8220;fill&#8221; and
+&#8220;no-fill&#8221; modes.)
+</p>
+
+<p>
+JUSTIFY doesn&#8217;t take an argument.
+<a href="definitions.html#inputline">Input lines</a>
+after JUSTIFY are
+<a href="definitions.html#filled">filled</a>
+and
+<a href="definitions.html#just">justified</a>
+upon output.
+</p>
+
+<p>
+To break lines and prevent them from being filled and justified, use
+the
+<a href="#br">BR</a>
+macro.
+</p>
+
+<!-- -QUAD- -->
+
+<div class="macro-id-overline">
+<h3 id="quad" class="macro-id">Quad lines left, right, or centre</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>QUAD</b> <kbd class="macro-args">L | LEFT | R | RIGHT | C | CENTER | J | JUSTIFY</kbd>
+</div>
+
+<p class="alias" style="margin-bottom: 0;">
+<i>Alias:</i> <b>FILL</b>
+</p>
+
+<p class="requires">(See
+<a href="definitions.html#filled">fill mode</a>
+for a definition of the difference between &#8220;fill&#8221; and
+&#8220;no-fill&#8221; modes.)
+</p>
+
+<p>
+QUAD takes one argument: the direction in which lines should be
+<a href="definitions.html#quad">quadded</a>.
+<a href="definitions.html#inputline">Input lines</a>
+after QUAD are
+<a href="definitions.html#filled">filled</a>
+upon output.
+</p>
+
+<p>
+If <kbd>L</kbd> or <kbd>LEFT</kbd>, type is set flush along the left
+margin.
+</p>
+
+<p>
+If <kbd>R</kbd> or <kbd>RIGHT</kbd>, type is set flush along the
+right margin.
+</p>
+
+<p>
+If <kbd>C</kbd> or <kbd>CENTER</kbd> type is set centred on the
+current line length.
+</p>
+
+<p>
+<kbd>J</kbd> and <kbd>JUSTIFY</kbd> justify text, and are
+included as a convenience only. Obviously, if text is
+justified, it isn&#8217;t quadded. <kbd>.QUAD&nbsp;J</kbd> and
+<kbd>.QUAD&nbsp;JUSTIFY</kbd> have exactly the same effect as
+<a href="#justify">JUSTIFY</a>.
+</p>
+
+<p>
+To break lines and prevent them from being filled, use the
+<a href="#br">BR</a>
+macro.
+</p>
+
+<!-- -LEFT, RIGHT, CENTER- -->
+
+<div class="macro-id-overline">
+<h3 id="lrc" class="macro-id">Set lines flush left, right or centered in no-fill mode</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>LEFT</b>
+<br/>
+Macro: <b>RIGHT</b>
+<br/>
+Macro: <b>CENTER</b> &nbsp;(alias CENTRE)
+</div>
+
+<p class="requires">
+(See
+<a href="definitions.html#filled">no-fill mode</a>
+for a definition of the difference between &#8220;fill&#8221; and
+&#8220;no-fill&#8221; modes.)
+</p>
+
+<p>
+LEFT, RIGHT, and CENTER let you enter text on a line for line basis
+without having to use the
+<a href="#br">BR</a>
+macro after each line. Consider the following:
+<br/>
+<span class="pre-in-pp">
+ .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
+</span>
+Because text after <kbd>.QUAD&nbsp;LEFT</kbd> is
+<a href="definitions.html#filled">filled</a>,
+you have to use the
+<a href="#br">BR</a>
+macro to prevent the lines from running together. Not only is this
+annoying to type, it&#8217;s awkward to read in a text editor. Much
+better to do
+<br/>
+<span class="pre-in-pp">
+ .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.
+</span>
+</p>
+
+<div class="box-important" style="margin-top: -.5em;">
+<p class="tip">
+<span class="important">IMPORTANT:</span> Because LEFT,
+RIGHT, and CENTER are nofill modes, groff does not always respect the
+current line length.
+<a href="definitions.html#inputline">Input lines</a>
+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.
+</p>
+</div>
+
+<!-- -BR- -->
+
+<div class="macro-id-overline">
+<h3 id="br" class="macro-id">Manually break lines</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>BR</b>
+</div>
+
+<p>
+When using
+<a href="#justify">JUSTIFY</a>
+or
+<a href="#quad">QUAD</a>,
+BR tells mom about partial lines that you want broken (as opposed to
+<a href="definitions.html#filled">filled</a>).
+Any partial
+<a href="definitions.html#outputline">output line</a>
+that immediately precedes BR will be
+<a href="definitions.html#quad">quadded</a>
+in the direction of the current quad, or set flush left if text is
+<a href="definitions.html#just">justified</a>.
+</p>
+
+<p>
+Most of the time, you won&#8217;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&#8217;d
+expect a break, mom puts it in herself. Equally, in macros where a
+break isn&#8217;t normally desirable, no break occurs. This means
+text files don&#8217;t get cluttered with annoying BR&#8217;s.
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span> Lines of text in
+<a href="definitions.html#filled">nofill mode</a>
+never require a BR. Furthermore, in nofill mode, ALL macros cause a
+break. If a break is not desired, use the
+<a href="#join"><kbd>\c</kbd></a>
+<a href="definitions.html#inlines">inline escape</a>.
+</p>
+
+<p class="tip-bottom" style="margin-top: -1em">
+<span class="experts">Experts:</span> BR is an alias for
+<kbd>.br</kbd>. You can use either, or mix
+&#8217;n&#8217; match with impunity.
+</p>
+</div>
+
+<!-- -EL- -->
+
+<div class="macro-id-overline">
+<h3 id="el" class="macro-id">Manually break a line without advancing on the page</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>EL</b>
+</div>
+
+<p class="requires">
+In nofill modes
+<span style="font-style: normal;">
+(<a href="#left">LEFT</a>,
+<a href="#right">RIGHT</a>,
+<a href="#center">CENTER</a>)
+</span>
+you must terminate the line input preceding
+<span style="font-style: normal;">EL</span>
+with the
+<span style="font-style: normal;">
+<kbd>\c</kbd> inline escape.
+</span>
+</p>
+
+<p style="margin-top: -.5em">
+<i><b>Suggestion:</b> If you find remembering whether to put in the</i>
+<kbd>\c</kbd>
+<i>bothersome, you may prefer to use the</i>
+<a href="definitions.html#inlines">inline escape</a>
+<i>alternative to</i> EL,
+<a href="inlines.html#b"><kbd><span class="nobr">\*[B]</span></kbd></a>,
+<i>which works consistently regardless of the fill mode.
+</i>EL <i>does not work after the</i>
+<a href="goodies.html#pad">PAD</a>
+<i>macro. See</i>
+<a href="goodies.html#nobreak"><kbd>.PAD&nbsp;NOBREAK</kbd></a>
+<i>for the way around this.</i>
+</p>
+
+<p id="el-example">
+EL (&#8220;<span style="text-decoration: underline;">E</span>nd <span style="text-decoration: underline;">L</span>ine&#8221;)
+is conceptually equivalent to the notion of a carriage return with
+no linefeed. Its function is simple: it breaks a line without
+advancing on the page. As an example of where you might use it,
+imagine that you&#8217;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:
+<br/>
+<span class="pre-in-pp">
+ .LEFT
+ .LS 12.5
+ A line of text.\c
+ .EL
+ .ALD 24p
+ The next line of text.
+</span>
+may be more intuitive than
+<br/>
+<span class="pre-in-pp">
+ .LEFT
+ .LS 12.5
+ A line of text.
+ .ALD 11.5p
+ The next line of text.
+</span>
+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&#8217;t have to recalculate the extra space.
+</p>
+
+<p>
+ALD in the above examples stands for
+&#8220;<span style="text-decoration: underline;">A</span>dvance
+<span style="text-decoration: underline;">L</span>ea<span style="text-decoration: underline;">D</span>&#8221;,
+which is covered in the section
+<a href="#aldrld-intro">Vertical movements</a>.
+</p>
+
+<!-- -SP- -->
+
+<div class="macro-id-overline">
+<h3 id="space" class="macro-id">Break lines and add space between</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>SPACE</b> <kbd class="macro-args">[&lt;space to add between lines&gt;]</kbd>
+</div>
+<p class="alias">
+<i>Alias:</i> <b>SP</b>
+</p>
+
+<p>
+SPACE breaks a line, just like
+<a href="#br">BR</a>,
+then adds space after the line. With no argument, it adds an extra
+line space. If you pass it a numeric argument without supplying a
+<a href="definitions.html#unitofmeasure">unit of measure</a>,
+it advances that number of extra line spaces. For example:
+<br/>
+<span class="pre-in-pp">
+ .SPACE
+</span>
+breaks the line then adds an extra linespace, whereas
+<br/>
+<span class="pre-in-pp">
+ .SPACE 2
+</span>
+breaks the line and adds two extra linespaces.
+</p>
+
+<p>
+If you supply a unit of measure, SPACE breaks the line and advances
+the specified vertical distance, as in
+<br/>
+<span class="pre-in-pp">
+ .SPACE 6p
+</span>
+which breaks the line and advances six points further.
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="tip">Tip:</span> SPACE and
+<a href="#ald">ALD</a>
+can be used interchangeably (<kbd>.SPACE&nbsp;6p</kbd> and
+<kbd>.ALD&nbsp;6p</kbd> 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.
+</p>
+
+<p>
+<span class="experts">Experts:</span> SPACE is an alias of
+<kbd>.sp</kbd>. You can use either, or mix &#8217;n&#8217; match
+with impunity. Because SPACE aliases <kbd>.sp</kbd>, it may be used
+with groff&#8217;s absolute position modifier
+&#8220;<kbd>|</kbd>&#8221; (the pipe
+character) to move to a specified vertical location on the page.
+Consult
+<span class="pre-in-pp">
+ info&nbsp;groff&nbsp;&#8220;Manipulating Spacing&#8221;
+</span>
+or, more simply,
+<span class="pre-in-pp">
+ info&nbsp;groff&nbsp;sp.
+</span>
+</p>
+</div>
+
+<!-- -SPREAD- -->
+
+<div class="macro-id-overline">
+<h3 id="spread" class="macro-id">Break and force justify (spread) lines</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>SPREAD</b>
+</div>
+
+<p>
+Sometimes, you need to break a line of
+<a href="definitions.html#just">justified</a>
+text and have it come out fully justified, not
+<a href="definitions.html#quad">quadded</a>
+left the way it would be with the
+<a href="#br">BR</a>
+macro. An example of where you&#8217;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.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="experts">Experts:</span> SPREAD is an alias for
+<kbd>.brp</kbd> You can use either, or mix &#8217;n&#8217; match
+with impunity.
+</p>
+</div>
+
+<!-- -JOIN- -->
+
+<div class="macro-id-overline">
+<h3 id="join" class="macro-id">Join input lines</h3>
+</div>
+
+<div class="box-macro-args">
+Inline: <kbd class="macro-args">\c</kbd>
+</div>
+
+<p>
+Sometimes, especially when in one of the
+<a href="definitions.html#filled">nofill modes</a>,
+a macro will cause a break where you don&#8217;t want one. In order
+to prevent this from happening (in other words, to join
+<a href="definitions.html#inputline">input lines</a>
+together, forming one
+<a href="definitions.html#outputline">output line</a>),
+use the groff
+<a href="definitions.html#inlines">inline escape</a>
+<kbd>\c</kbd> at the end of each input line to be
+joined to another, like this:
+<br/>
+<span class="pre-in-pp">
+ .LEFT
+ .FAMILY T
+ .FT R
+ Some lines of text to be \c
+ .FAMILY H
+ .FT B
+ joined \c
+ .FAMILY T
+ .FT R
+ together.
+</span>
+Upon output, the lines will be joined together to read
+<br/>
+<span class="pre-in-pp">
+ Some lines of text to be joined together.
+</span>
+with the word &#8220;joined&#8221; in Helvetica bold. Note the
+spaces before <kbd>\c</kbd>. Without them, the last three words of
+the output line would read
+<br/>
+<span class="pre-in-pp">
+ bejoinedtogether
+</span>
+Please also note that had the example been in one of the
+<a href="definitions.html#filled">fill modes</a>,
+there&#8217;d have been no need for the <kbd>\c</kbd>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<b>Addendum:</b> The example, above, is designed to demonstrate the
+use of <kbd>\c</kbd>. An easier and more intuitive way
+to accomplish the family/font change in the example would be with
+the groff
+<a href="definitions.html#inlines">inline escape</a>,
+<kbd><a href="inlines.html#inline-fonts-groff">\f</a></kbd>,
+like this:
+<br/>
+<span class="pre-in-pp" style="padding-bottom: 0px;">
+ Some lines of text to be \f[HB]joined\*[PREV] together.
+</span>
+</p>
+</div>
+
+<div class="rule-short" style="margin-bottom: 24px;"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="refinements-intro" class="macro-group">Typographic refinements</h2>
+
+<p>
+The macros in this section help you tweak groff&#8217;s behaviour,
+ensuring that your documents look typographically professional.
+</p>
+
+<div id="index-refinements" class="macro-list-container">
+<h3 class="macro-list">Typographic refinements macros</h3>
+
+<ul class="macro-list">
+ <li>Word and sentence spacing
+ <ul style="list-style-type: none; margin-left: -1em;">
+ <li><a href="#ws">WS</a> &ndash; word spacing</li>
+ <li><a href="#ss">SS</a> &ndash; sentence space</li>
+ </ul></li>
+ <li>Letter spacing (track kerning)
+ <ul style="list-style-type: none; margin-left: -1em;">
+ <li><a href="#rw">RW</a> &ndash; reduce whitespace</li>
+ <li><a href="#ew">EW</a> &ndash; expand whitespace</li>
+ <li><a href="#br-at-line-kern">BR_AT_LINE_KERN</a></li>
+ </ul></li>
+ <li>Hyphenation
+ <ul style="list-style-type: none; margin-left: -1em;">
+ <li><a href="#hy">HY</a> &ndash; turn auto hyphenation on/off, or set specific hyphenation parameters</li>
+ <li><a href="#hy-set">HY_SET</a> &ndash; set all hyphenation parameters</li>
+ </ul></li>
+ <li>Automatic kerning and ligatures
+ <ul style="list-style-type: none; margin-left: -1em;">
+ <li><a href="#kern">KERN</a> &ndash; turn automatic pairwise kerning on or off</li>
+ <li><a href="#ligatures">LIGATURES</a> &ndash; turn automatic generation of ligatures on or off</li>
+ </ul></li>
+</ul>
+</div>
+
+<!-- -WS- -->
+
+<div class="macro-id-overline">
+<h3 id="ws" class="macro-id">Word spacing</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>WS</b> <kbd class="macro-args">&lt;+|-wordspace&gt; | DEFAULT</kbd>
+</div>
+
+<p>
+WS (Word Space) increases or decreases the amount of space between
+words. In
+<a href="definitions.html#filled">nofill modes</a>,
+or if
+<a href="#quad">QUAD</a>
+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
+<a href="definitions.html#just">justified</a>,
+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.
+</p>
+
+<p>
+Word space is relative to point size. 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 between 3 and 5
+produces a subtle but noticeable difference. In/decreasing by a
+value greater than 6 is almost always apparent. You should preview
+your work to assess the effect of WS.
+</p>
+
+<p id="ws-usage">
+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
+<br/>
+<span class="pre-in-pp">
+ .WS -2
+</span>
+To increase it by a noticeable amount, you might enter
+<br/>
+<span class="pre-in-pp">
+ .WS +6
+</span>
+You can reset the word spacing to its previous value by switching
+the plus or minus sign, like this:
+<br/>
+<span class="pre-in-pp">
+ .WS +2
+ A line of text
+ .WS -2
+</span>
+The <kbd>.WS&nbsp;-2</kbd> undoes the effect of
+<kbd>.WS&nbsp;+2</kbd>. You can also reset WS to its groff default
+by entering
+<br/>
+<span class="pre-in-pp">
+ .WS DEFAULT
+</span>
+This can be particularly useful if you&#8217;ve been playing around
+with plus and minus values, and can&#8217;t remember by how much to
+in/decrease the word space to get it back to normal.
+</p>
+
+<!-- -SS- -->
+
+<div class="macro-id-overline">
+<h3 id="ss" class="macro-id">Sentence space</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>SS</b> <kbd class="macro-args">&lt;+sentence space&gt; | 0 | DEFAULT</kbd>
+</div>
+
+<p>
+SS (Sentence Space) tells groff how to treat double spaces it
+encounters between sentences in
+<a href="definitions.html#inputline">input lines</a>.
+If you use SS, input sentences with two spaces after them <i>and</i>
+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,
+<br/>
+<span class="pre-in-pp">
+ .SS +2
+</span>
+means that input sentences with two spaces after them receive a
+normal word space PLUS the +2 value passed to SS.
+</p>
+
+<p>
+Like
+<a href="#ws">WS</a>,
+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). Increasing by a
+value greater than 10 is always apparent. You should preview your
+work to assess the effect of SS.
+</p>
+
+<p>
+There&#8217;s an additional argument you can pass SS: the number
+zero (without the plus sign). It&#8217;s the argument you&#8217;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
+<br/>
+<span class="pre-in-pp">
+ .SS 0
+</span>
+at the top of your files.
+</p>
+
+<p>
+If you do use SS for something other than ensuring that you
+don&#8217;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
+<br/>
+<span class="pre-in-pp">
+ .SS DEFAULT
+</span>
+If you&#8217;re using the
+<a href="docprocessing.html">document processing macros</a>
+and your
+<a href="docprocessing.html#printstyle">PRINTSTYLE</a>
+is <kbd>TYPEWRITE</kbd>, <kbd>.SS&nbsp;DEFAULT</kbd> is the
+default, because you do want double spaces between sentences in copy
+that imitates the look of a typewritten document.
+</p>
+
+<div class="box-important">
+<p class="tip">
+<span class="important">IMPORTANT:</span> SS with an argument other
+than <kbd>0</kbd> (zero) should only be used if you&#8217;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.
+</p>
+</div>
+
+<!-- -HY- -->
+
+<div class="macro-id-overline">
+<h3 id="hy" class="macro-id">Automatic hyphenation control</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>HY</b> <kbd class="macro-args">LINES &lt;max. number of consecutive hyphenated lines&gt;</kbd>
+ <br/>
+Macro: <b>HY</b> <kbd class="macro-args">MARGIN &lt;size of hyphenation margin&gt;</kbd>
+ <br/>
+Macro: <b>HY</b> <kbd class="macro-args">SPACE &lt;extra interword spacing to prevent hyphenation&gt;</kbd>
+ <br/>
+Macro: <b>HY</b> <kbd class="macro-args">DEFAULT</kbd>
+ <br/>
+Macro: <b>HY</b> <kbd class="macro-args">toggle</kbd>
+</div>
+<p class="alias">
+<i>Aliases:</i> <b>HYPHENATE, HYPHENATION</b>
+</p>
+
+<p>
+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&#8217;ve broken them down into separate sections.
+</p>
+
+<h3 class="docs">1.&nbsp;&nbsp;HY</h3>
+
+<p>
+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
+<a href="intro.html#macro-args">How to read macro arguments</a>,
+you could turn HY off by entering
+<br/>
+<span class="pre-in-pp">
+ .HY OFF
+</span>
+or
+<span class="pre-in-pp">
+ .HY X
+</span>
+or
+<span class="pre-in-pp">
+ .HY END
+</span>
+A subsequent call to HY restores hyphenation with the parameters for
+LINES, MARGIN, or SPACE that were formerly in effect (see below).
+</p>
+
+<p>
+HY observes the following default hyphenation rules:
+</p>
+<ul style="margin-top: -.5em; margin-left: 18px;">
+ <li>Last lines (i.e. ones that will spring a trap&mdash;typically
+ the last line on a page) will not be hyphenated.
+ </li>
+ <li>The first and last two characters of a word are never
+ split off.
+ </li>
+</ul>
+
+<h3 class="docs numbered">2.&nbsp;&nbsp;HY LINES</h3>
+
+<p>
+HY LINES sets the maximum number of consecutive hyphenated lines
+that will appear in output copy. 2 is a very good choice, and
+you&#8217;d set it with
+<br/>
+<span class="pre-in-pp">
+ .HY LINES 2
+</span>
+By default, when you turn automatic hyphenation on, there is no
+limit to the number of consecutive hyphenated lines.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span>
+<a href="definitions.html#discretionaryhyphen">Discretionary hyphens</a>
+count when groff is figuring out how many lines to hyphenate;
+explicit hyphens (i.e. the actual hyphen character) do not.
+</p>
+</div>
+
+<h3 class="docs numbered">3.&nbsp;&nbsp;HY MARGIN</h3>
+
+<p>
+HY MARGIN sets the amount of room allowed at the end of a line
+before hyphenation is tripped (e.g., if there&#8217;s only 6 points
+left at the end of a line, groff won&#8217;t try to hyphenate the
+next word). HY MARGIN only applies if you&#8217;re using
+<a href="#quad">QUAD</a>,
+and is really only useful if you&#8217;re using QUAD LEFT.
+</p>
+
+<p>
+As an example, if you don&#8217;t want groff to hyphenate words
+when there&#8217;s only 18 points of space left at the end of a
+left-quadded line, you&#8217;d enter
+<br/>
+<span class="pre-in-pp" style="margin-bottom: -1em">
+ .HY MARGIN 18p
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> The numeric argument after HY
+MARGIN requires a
+<a href="definitions.html#unitofmeasure">unit of measure</a>.
+</p>
+</div>
+
+<h3 class="docs numbered">4.&nbsp;&nbsp;HY SPACE</h3>
+
+<p>
+HY SPACE sets an amount of extra interword space that groff will
+try to put between words on a line in order to <i>prevent</i>
+hyphenation. HY SPACE applies only to
+<a href="definitions.html#just">justified lines</a>.
+Generally speaking, you&#8217;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&#8217;d set with
+<br/>
+<span class="pre-in-pp">
+ .HY SPACE .5p
+</span>
+or
+<span class="pre-in-pp" style="margin-bottom: -1em">
+ .HY SPACE 1p
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> The numeric argument after HY SPACE
+requires a
+<a href="definitions.html#unitofmeasure">unit of measure</a>.
+</p>
+</div>
+
+<h3 class="docs numbered">5.&nbsp;&nbsp;HY DEFAULT</h3>
+
+<p>
+HY DEFAULT resets automatic hyphenation to its default behaviour,
+cancelling any changes made with HY <kbd>LINES</kbd>, HY
+<kbd>MARGIN</kbd>, and/or HY <kbd>SPACE</kbd>.
+</p>
+
+<div class="box-notes">
+<h3 id="hyphenation-thoughts" class="docs notes">Thoughts on hyphenation in general</h3>
+
+<p style="margin-top: .5em">
+Hyphenation is a necessary evil. If it can be avoided, it
+should be. If it can&#8217;t be, it should occur infrequently.
+That&#8217;s the reason for the number of parameters you can set
+with HY.
+</p>
+
+<p class="tip-bottom">
+Furthermore, hyphenation in
+<a href="definitions.html#rag">rag</a>
+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.
+</p>
+</div>
+
+<!-- -HY_SET- -->
+
+<div class="macro-id-overline">
+<h3 id="hy-set" class="macro-id">Set hyphenation parameters all at once</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>HY_SET</b> <kbd class="macro-args">&lt;lines&gt; [ &lt;margin&gt; [ &lt;space&gt; ] ]</kbd>
+</div>
+
+<p class="alias">
+<i>Alias:</i> <b>HYSET</b>
+</p>
+
+<p>
+HY_SET lets you set the parameters for hyphenation
+with a single macro. <kbd>&lt;lines&gt;,</kbd>
+<kbd>&lt;margin&gt;</kbd>, and
+<kbd>&lt;space&gt;</kbd> correspond to the numeric
+values required by <kbd>LINES</kbd>,
+<kbd>MARGIN</kbd>, and <kbd>SPACE</kbd> as described
+<a href="#hy">above</a>.
+</p>
+
+<p>
+To set just the maximum number of consecutive hyphenated lines,
+you&#8217;d enter
+<br/>
+<span class="pre-in-pp">
+ .HY_SET 2
+</span>
+If you wanted the same number of maximum consecutive hyphenated
+lines and a hyphenation margin for use with
+<a href="definitions.html#rag">rag</a>
+copy,
+<br/>
+<span class="pre-in-pp">
+ .HY_SET 2 36p
+</span>
+would set the hyphenation margin to 36 points.
+</p>
+
+<p>
+If you wanted the same number of maximum consecutive hyphenated
+lines and a hyphenation space of 2 points for use with
+<a href="definitions.html#just">justified</a>
+copy,
+<br/>
+<span class="pre-in-pp">
+ .HYSET 2 0 2p
+</span>
+is how you&#8217;d do it.
+</p>
+
+<!-- -RW- -->
+
+<div class="macro-id-overline">
+<h3 id="rw" class="macro-id">Reduce whitespace</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>RW</b> <kbd class="macro-args">&lt;amount of whitespace reduction between letters&gt;</kbd>
+</div>
+
+<p>
+RW (<span style="text-decoration: underline;">R</span>educe <span style="text-decoration: underline;">W</span>hitespace)
+and its corresponding macro
+EW (<span style="text-decoration: underline;">E</span>xpand <span style="text-decoration: underline;">W</span>hitespace),
+allow you to tighten (or loosen)
+<a href="definitions.html#outputline">output lines</a>
+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.
+</p>
+
+<p>
+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&#8217;ll most likely use small
+decimal values when tightening lines. For example,
+<br/>
+<span class="pre-in-pp">
+ .RW .1
+</span>
+or
+<span class="pre-in-pp">
+ .RW .2
+</span>
+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.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> By default, RW does not deposit a
+<a href="#br">break</a>
+when it&#8217;s invoked if you&#8217;re in one of the
+<a href="definitions.html#fill">fill</a>
+modes (i.e.
+<a href="#quad">QUAD</a>
+L, R, C, J, or
+<a href="#justify">JUSTIFY</a>).
+If you want
+RW to break at the ends of the previous
+<a href="definitions.html#inputline">input lines</a>
+while you&#8217;re in a fill mode, tell mom
+that&#8217;s what you want by invoking
+<kbd><a href="#br-at-line-kern">.BR_AT_LINE_KERN</a></kbd>.
+</p>
+</div>
+
+<div class="box-important">
+<p class="tip">
+<span class="important">IMPORTANT:</span>
+RW (and its complement, EW, see below) only affects the current
+font, and remains in effect for that font every time it&#8217;s
+called, hence it must be reset to zero to cancel its effect
+(<kbd>.RW&nbsp;0</kbd>).
+</p>
+</div>
+
+<!-- -EW- -->
+
+<div class="macro-id-overline">
+<h3 id="ew" class="macro-id">Expand whitespace</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>EW</b> <kbd class="macro-args">&lt;amount of whitespace expansion between letters&gt;</kbd>
+</div>
+
+<p>
+EW (<span style="text-decoration: underline;">E</span>xpand <span style="text-decoration: underline;">W</span>hitespace)
+expands the amount of whitespace between letters, effectively
+&#8220;loosening&#8221; lines of type.
+</p>
+
+<p>
+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&#8217;ll most likely use small
+decimal values when loosening lines. For example,
+<br/>
+<span class="pre-in-pp">
+ .EW .1
+</span>
+or
+<span class="pre-in-pp">
+ .EW .2
+</span>
+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.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> By default, EW does not deposit a
+<a href="#br">break</a>
+when it&#8217;s invoked if you&#8217;re in one of the
+<a href="definitions.html#fill">fill</a>
+modes (i.e.
+<a href="#quad">QUAD</a>
+L, R, C, J, or
+<a href="#justify">JUSTIFY</a>).
+If you want
+EW to break at the ends of the previous
+<a href="definitions.html#inputline">input lines</a>
+while you&#8217;re in a fill mode, tell mom that&#8217;s what you
+want by invoking the
+<kbd><a href="#br-at-line-kern">.BR_AT_LINE_KERN</a></kbd>
+toggle macro.
+</p>
+</div>
+
+<div class="box-important">
+<p class="tip">
+<span class="important">IMPORTANT:</span>
+EW (and its complement, RW, see above) only affects the current
+font, and remains in effect for that font every time it&#8217;s
+called, hence it must be reset to zero to cancel its effect
+(<kbd>.RW&nbsp;0</kbd>).
+</p>
+</div>
+
+<!-- -BR_AT_LINE_KERN- -->
+
+<div class="macro-id-overline">
+<h3 id="br-at-line-kern" class="macro-id">Break before line kerning</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>BR_AT_LINE_KERN</b> <kbd class="macro-args">toggle</kbd>
+</div>
+
+<p>
+By default, in
+<a href="definitions.html#filled">fill</a>
+modes (i.e.
+<a href="#quad">QUAD</a>
+L, R, C, J, or
+<a href="#justify">JUSTIFY</a>)
+mom does not break
+<a href="definitions.html#inputline">input lines</a>
+when you invoke
+<a href="#rw">RW</a>
+or
+<a href="#ew">EW</a>.
+If you&#8217;d like her to break input lines prior to RW or EW,
+invoke <kbd>.BR_AT_INPUT_LINE</kbd> without any argument. To
+disable the breaks, invoke <kbd>.BR_AT_INPUT_LINE</kbd> with any
+argument (<kbd>OFF</kbd>, <kbd>QUIT</kbd>, <kbd>END</kbd>,
+<kbd>X</kbd>...), like this
+<br/>
+<span class="pre-in-pp">
+ .BR_AT_LINE_KERN OFF
+</span>
+or
+<span class="pre-in-pp">
+ .BR_AT_LINE_KERN X
+</span>
+With QUAD L, R, or C, mom simply breaks the line. With QUAD J (or
+just JUSTIFY, which is the same thing), she breaks and
+<a href="definitions.html#force">force justifies</a>
+the line prior to <kbd>.EW</kbd> or <kbd>.RW</kbd>.
+</p>
+
+<!-- -KERN- -->
+
+<div class="macro-id-overline">
+<h3 id="kern" class="macro-id">Automatic kerning</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>KERN</b> <kbd class="macro-args">toggle</kbd>
+</div>
+
+<p>
+By itself (i.e. with no argument), KERN turns automatic pairwise
+<a href="definitions.html#kern">kerning</a>
+on. With any argument (e.g. <kbd>OFF</kbd>, <kbd>Q</kbd>,
+<kbd>X</kbd>), pairwise kerning is turned off.
+</p>
+
+<p>
+Kerning of individual character pairs can be controlled with the two
+<a href="definitions.html#inlines">inline escapes</a>
+<br/>
+<kbd>\*[BU&nbsp;&lt;n&gt;]</kbd> and
+<kbd>\*[FU&nbsp;&lt;n&gt;]</kbd>. See
+<a href="inlines.html#inline-kerning-mom">Inline Escapes, kerning</a>.
+</p>
+
+<!-- -LIGATURES- -->
+
+<div class="macro-id-overline">
+<h3 id="ligatures" class="macro-id">Automatic ligature generation</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>LIGATURES</b> <kbd class="macro-args">toggle</kbd>
+</div>
+<p class="alias">
+<i>Alias:</i> <b>LIG</b>
+</p>
+
+<p>
+Provided your current font has
+<a href="definitions.html#ligatures">ligatures</a>,
+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 &#8220;finally&#8221;,
+the fi combination will be output as an fi ligature. Generally
+speaking, ligatures are A Good Thing, hence mom has them on by
+default.
+</p>
+
+<p>
+LIGATURES with any argument turns automatic ligature generation off.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> Not all fonts support ligatures.
+</p>
+</div>
+
+<div class="rule-short"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="modifications-intro" class="macro-group">Type modifications (pseudo font styles)</h2>
+
+<p>
+It sometimes happens that a
+<a href="definitions.html#family">family</a>
+doesn&#8217;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 the condensed version. That&#8217;s
+where these macros and inline escapes come in. With them, you
+can fake the fonts you&#8217;re missing. A word of caution,
+though: &#8220;faked&#8221; fonts are just that&mdash;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.
+</p>
+
+<div id="index-modifications" class="macro-list-container">
+<h3 class="macro-list">Type modifications macros</h3>
+
+<ul class="macro-list">
+ <li>Pseudo italic
+ <ul style="list-style: none; margin-left: -1em;">
+ <li><a href="#setslant">SETSLANT</a> &ndash; degree of pseudo-italicizing</li>
+ <li><a href="#slant-inline">\*[SLANT]</a> &ndash; inline escape for pseudo-italicizing type</li>
+ </ul></li>
+ <li>Pseudo bold
+ <ul style="list-style: none; margin-left: -1em;">
+ <li><a href="#setbolder">SETBOLDER</a> &ndash; amount of emboldening</li>
+ <li><a href="#bolder-inline">\*[BOLDER]</a> &ndash; inline escape for emboldening type</li>
+ </ul></li>
+ <li>Pseudo condensed
+ <ul style="list-style: none; margin-left: -1em;">
+ <li><a href="#condense">CONDENSE</a> &ndash; percentage for pseudo-condensed type</li>
+ <li><a href="#cond-inline">\*[COND]</a> &ndash; inline escape for pseudo-condensed type</li>
+ </ul></li>
+ <li>Pseudo extended
+ <ul style="list-style: none; margin-left: -1em;">
+ <li><a href="#extend">EXTEND</a> &ndash; percentage for pseudo-extended type</li>
+ <li><a href="#ext-inline">\*[EXT]</a> &ndash; inline escape for pseudo-extending</li>
+ </ul></li>
+ <li>Smallcaps
+ <ul style="list-style: none; margin-left: -1em;">
+ <li><a href="#smallcaps">SMALLCAPS</a> &ndash; enable smallcaps</li>
+ <li><a href="#smallcaps-style">SMALLCAPS_STYLE</a> &ndash; size, weight, and width of smallcaps</li>
+ </ul></li>
+</ul>
+</div>
+
+<!-- -SETSLANT- -->
+
+<div class="macro-id-overline">
+<h3 id="setslant" class="macro-id">Set degree of slant for pseudo-italicizing</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>SETSLANT</b> <kbd class="macro-args">&lt;degrees to slant type&gt; | RESET</kbd>
+</div>
+
+<p>
+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&#8217;s default is 15, which produces an
+acceptable approximation of an italic font. If you want another
+value&mdash;say, 13 degrees&mdash;you&#8217;d set it by entering
+<br/>
+<span class="pre-in-pp">
+ .SETSLANT 13
+</span>
+If you change the degree of slant and later want to set it back to
+the mom default, do
+<br/>
+<span class="pre-in-pp">
+ .SETSLANT RESET
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> 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
+<a href="definitions.html#inlines">inline escape</a>
+<kbd>\*[SLANT]</kbd>.
+</p>
+</div>
+
+<!-- -\*[SLANT]- -->
+
+<div class="macro-id-overline">
+<h3 id="slant-inline" class="macro-id">Pseudo italic on/off</h3>
+</div>
+
+<div class="box-macro-args">
+Inline: <kbd class="macro-args">\*[SLANT]</kbd>
+<br/>
+Inline: <kbd class="macro-args">\*[SLANTX</kbd>]
+</div>
+
+<p>
+<kbd class="macro-args">\*[SLANT]</kbd> begins pseudo-italicizing. <kbd class="macro-args"><span class="nobr">\*[SLANTX]</span></kbd> turns
+the feature off. Both are <a href="definitions.html#inlines">inline
+escapes</a>,
+therefore they should not appear as separate lines, but rather be
+embedded in text lines, like this:
+<br/>
+<span class="pre-in-pp">
+ Not \*[SLANT]everything\*[SLANTX] is as it seems.
+</span>
+Alternatively, if you wanted the whole line pseudo-italicized,
+you&#8217;d do
+<br/>
+<span class="pre-in-pp">
+ \*[SLANT]Not everything is as it seems.\*[SLANTX]
+</span>
+Once <kbd><span class="nobr">\*[SLANT]</span></kbd> is invoked, it remains in
+effect until turned off.
+</p>
+
+<div class="box-tip" style="margin-top: .5em;">
+<p class="tip">
+<span class="note">Note:</span> If you&#8217;re using the
+<a href="docprocessing.html#docprocessing">document processing macros</a>
+with
+<a href="docprocessing.html#printstyle">PRINTSTYLE TYPEWRITE</a>,
+mom underlines pseudo-italics by default. To change this behaviour,
+use the special macro
+<a href="docprocessing.html#typewrite-control">SLANT_MEANS_SLANT</a>.
+</p>
+</div>
+
+<!-- -SETBOLDER- -->
+
+<div class="macro-id-overline">
+<h3 id="setbolder" class="macro-id">Set amount of emboldening</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>SETBOLDER</b> <kbd class="macro-args">&lt;amount of emboldening, in machine units&gt; | RESET</kbd>
+</div>
+
+<p>
+Emboldening of type is accomplished by printing characters twice;
+the second printing is slightly offset from the first, effectively
+&#8220;thickening&#8221; the character. SETBOLDER lets you set the
+number of
+<a href="definitions.html#units">machine units</a>
+for the offset. Mom&#8217;s default is 700 units, which produces an
+acceptable approximation of a bold font. If you want another
+value&mdash;say, 500 units&mdash;you&#8217;d set it by entering
+<br/>
+<span class="pre-in-pp">
+ .SETBOLDER 500
+</span>
+If you change the emboldening offset and later want to set it back
+to the mom default, do
+<br/>
+<span class="pre-in-pp">
+ .SETBOLDER RESET
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> 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
+<a href="definitions.html#inlines">inline escape</a>
+<kbd><span class="nobr">\*[BOLDER]</span></kbd>.
+</p>
+</div>
+
+<!-- -\*[BOLDER]- -->
+
+<div class="macro-id-overline">
+<h3 id="bolder-inline" class="macro-id">Emboldening on/off</h3>
+</div>
+
+<div class="box-macro-args">
+Inline: <kbd class="macro-args">\*[BOLDER]</kbd>
+<br/>
+Inline: <kbd class="macro-args">\*[BOLDERX]</kbd>
+</div>
+
+<p>
+<kbd class="macro-args">\*[BOLDER]</kbd> begins emboldening type.
+<kbd class="macro-args"><span class="nobr">\*[BOLDERX]</span></kbd> turns the
+feature off. Both are
+<a href="definitions.html#inlines">inline escapes</a>,
+therefore they should not appear as separate lines, but rather be
+embedded in text lines, like this:
+<br/>
+<span class="pre-in-pp">
+ Not \*[BOLDER]everything\*[BOLDERX] is as it seems.
+</span>
+Alternatively, if you wanted the whole line emboldened,
+you&#8217;d do
+<br/>
+<span class="pre-in-pp">
+ \*[BOLDER]Not everything is as it seems.\*[BOLDERX]
+</span>
+Once <kbd><span class="nobr">\*[BOLDER]</span></kbd> is invoked, it remains in
+effect until turned off.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> If you&#8217;re using the
+<a href="docprocessing.html#docprocessing">document processing macros</a>
+with
+<a href="docprocessing.html#printstyle">PRINTSTYLE TYPEWRITE</a>,
+mom ignores <kbd>\*[BOLDER]</kbd> requests.
+</p>
+</div>
+
+<!-- -CONDENSE- -->
+
+<div class="macro-id-overline">
+<h3 id="condense" class="macro-id">Set percentage for pseudo-condensed type</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>CONDENSE</b> <kbd class="macro-args">&lt;pseudo-condense percentage&gt;</kbd>
+</div>
+
+<p>
+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.
+</p>
+
+<p>
+Mom has no default value for CONDENSE, therefore you must set it
+before using the
+<a href="definitions.html#inlines">inline escape</a>
+<kbd><a href="#cond-inline"><span class="nobr">\*[COND]</span></a></kbd>.
+80 percent of the normal character width is a good value, and
+you&#8217;d set it like this:
+<br/>
+<span class="pre-in-pp">
+ .CONDENSE 80
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span> 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
+<a href="definitions.html#inlines">inline escape</a>
+<kbd><span class="nobr">\*[COND]</span></kbd>.
+</p>
+
+<p class="tip-bottom">
+<span class="additional-note">Additional note:</span> Make sure that
+pseudo-condensing is off (with
+<kbd><a href="#cond-inline"><span class="nobr">\*[CONDX]</span></a></kbd>)
+before making any changes to the pseudo-condense percentage
+with CONDENSE.
+</p>
+</div>
+
+<!-- -\*[COND]- -->
+
+<div class="macro-id-overline">
+<h3 id="cond-inline" class="macro-id">Pseudo-condensing on/off</h3>
+</div>
+
+<div class="box-macro-args">
+Inline: <kbd class="macro-args">\*[COND]</kbd>
+<br/>
+Inline: <kbd class="macro-args">\*[CONDX]</kbd>
+</div>
+
+<p>
+<kbd>\*[COND]</kbd> begins pseudo-condensing type.
+<kbd><span class="nobr">\*[CONDX]</span></kbd> turns the feature off. Both are
+<a href="definitions.html#inlines">inline escapes</a>,
+therefore they should not appear as separate lines, but rather be
+embedded in text lines, like this:
+<br/>
+<span class="pre-in-pp">
+ \*[COND]Not everything is as it seems.\*[CONDX]
+</span>
+<kbd><span class="nobr">\*[COND]</span></kbd> remains in effect until you turn it
+off with <kbd><span class="nobr">\*[CONDX]</span></kbd>.
+</p>
+
+<div class="box-important">
+<p class="tip">
+<span class="important">IMPORTANT:</span> You must turn
+<kbd><span class="nobr">\*[COND]</span></kbd> off before making any changes to
+the point size of your type, either via the
+<a href="#ps">PT_SIZE</a>
+macro or with the <kbd>\s</kbd> inline escape. If you wish
+the new point size to be pseudo-condensed, simply re-invoke
+<kbd><span class="nobr">\*[COND]</span></kbd> afterwards. Equally,
+<kbd><span class="nobr">\*[COND]</span></kbd> must be turned off before changing
+the condense percentage with
+<kbd><a href="#condense">.CONDENSE</a></kbd>.
+</p>
+</div>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> If you&#8217;re using the
+<a href="docprocessing.html#docprocessing">document processing macros</a>
+with
+<a href="docprocessing.html#printstyle">PRINTSTYLE TYPEWRITE</a>,
+mom ignores <kbd>\*[COND]</kbd> requests.
+</p>
+</div>
+
+<!-- -EXTEND- -->
+
+<div class="macro-id-overline">
+<h3 id="extend" class="macro-id">Set percentage for pseudo-extended type</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>EXTEND</b> <kbd class="macro-args">&lt;pseudo-extend percentage&gt;</kbd>
+</div>
+
+<p>
+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.
+</p>
+
+<p>
+Mom has no default value for EXTEND, therefore you must set it
+before using the
+<a href="definitions.html#inlines">inline escape</a>
+<kbd><a href="#ext-inline"><span class="nobr">\*[EXT]</span></a></kbd>. 120% of
+the normal character width is a good value, and you&#8217;d set it
+like this:
+<br/>
+<span class="pre-in-pp">
+ .EXTEND 120
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span> 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
+<a href="definitions.html#inlines">inline escape</a>
+<kbd><span class="nobr">\*[EXT]</span></kbd>.
+</p>
+
+<p class="tip-bottom">
+<span class="additional-note">Additional note:</span> Make sure that
+pseudo-extending is off (with
+<a href="#ext-inline"><kbd>\*[EXTX]</kbd></a>)
+before making any changes to the pseudo-extend percentage
+with EXTEND.
+</p>
+</div>
+
+<!-- -\*[EXT]- -->
+
+<div class="macro-id-overline">
+<h3 id="ext-inline" class="macro-id">Pseudo-extending on/off</h3>
+</div>
+
+<div class="box-macro-args">
+Inline: <kbd class="macro-args">\*[EXT]</kbd>
+<br/>
+Inline: <kbd class="macro-args">\*[EXTX]</kbd>
+</div>
+
+<p>
+<kbd>\*[EXT]</kbd> begins pseudo-extending type.
+<kbd><span class="nobr">\*[EXTX]</span></kbd> turns the feature off. Both are
+<a href="definitions.html#inlines">inline escapes</a>,
+therefore they should not appear as separate lines, but rather be
+embedded in text lines, like this:
+<br/>
+<span class="pre-in-pp">
+ \*[EXT]Not everything is as it seems.\*[EXTX]
+</span>
+<kbd>\*[EXT]</kbd> remains in effect until you turn it off with
+<kbd><span class="nobr">\*[EXTX]</span></kbd>.
+</p> <div class="box-important"> <p class="tip">
+<span class="important">IMPORTANT:</span> You must turn
+<kbd><span class="nobr">\*[EXT]</span></kbd> off before making any changes to the
+point size of your type, either via the
+<a href="#ps">PT_SIZE</a>
+macro or with the <kbd>\s</kbd> inline escape. If you wish
+the new point size to be pseudo-extended, simply re-invoke
+<kbd><span class="nobr">\*[EXT]</span></kbd> afterwards. Equally,
+<kbd><span class="nobr">\*[EXT]</span></kbd> must be turned off before changing
+the extend percentage with
+<a href="#extend">EXTEND</a>.
+</p>
+</div>
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> If you&#8217;re using the
+<a href="docprocessing.html#docprocessing">document processing macros</a>
+with
+<a href="docprocessing.html#printstyle">PRINTSTYLE TYPEWRITE</a>,
+mom ignores <kbd><span class="nobr">\*[EXT]</span></kbd> requests.
+</p>
+</div>
+
+<!-- SMALLCAPS -->
+
+<div class="macro-id-overline">
+<h3 id="smallcaps" class="macro-id">Smallcaps</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>SMALLCAPS</b> <kbd class="macro-args">&lt;toggle&gt;</kbd>
+</div>
+
+<p>
+To begin setting type in pseudo-smallcaps, simply invoke
+<kbd>.SMALLCAPS</kbd>. When you no longer want them, invoke
+<kbd>SMALLCAPS&nbsp;OFF</kbd> (or <kbd>END</kbd>, <kbd>STOP</kbd>,
+<kbd>DONE</kbd>, etc). If you are currently in a
+<a href="definitions.html#filled">no-fill mode</a>,
+(i.e.
+<a href="#lrc">LEFT</a>,
+<a href="#lrc">CENTER</a>,
+or
+<a href="#lrc">RIGHT</a>)
+and you want the smallcaps to continue on the same line,
+append a <kbd>\c</kbd> to the line, like this
+<br/>
+<span class="pre-in-pp">
+ A line of type\c
+ .SMALLCAPS
+ with a few words in smallcaps.
+ .SMALLCAPS OFF
+</span>
+The line preceding <kbd>.SMALLCAPS&nbsp;OFF</kbd> should also have a
+<kbd>\c</kbd> appended to it if you wish it to continue unbroken.
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span>
+SMALLCAPS does not have an inline equivalent to
+<a href="inlines.html#uc-lc">
+<span class="nobr"><kbd>\*[UC]</kbd> / <kbd>\*[LC]</kbd></span>
+</a>.
+Furthermore, if you&#8217;re using the
+<a href="docprocessing.html#docprocessing">document processing macros</a>
+with
+<a href="docprocessing.html#printstyle">PRINTSTYLE TYPEWRITE</a>,
+mom ignores SMALLCAPS.
+</p>
+
+<p class="tip-bottom">
+Additionally, be aware that no automatic
+<a href="definitions.html#kern">kerning</a>
+takes place while pseudo-smallcaps are in effect.
+</p>
+</div>
+
+<div class="macro-id-overline">
+<h3 id="smallcaps-style" class="macro-id">Set size, weight, and width of smallcaps</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>SMALLCAPS_STYLE</b> <kbd class="macro-args">SIZE &lt;percentage&gt; WEIGHT_ADJ &lt;percentage&gt; EXTEND &lt;percentage&gt;</kbd>
+</div>
+
+<p>
+True smallcaps are not a font effect, but, like designer cuts of
+bold, condensed, and extended, actual fonts provided with some
+families. It is highly recommended that you acquire real smallcaps
+fonts rather than relying on mom&#8217;s pseudo version.
+</p>
+
+<p>
+To achieve a reasonable facsimile of designer-cut smallcaps fonts,
+mom needs to know the percentage of regular caps at a given point
+size by which to reduce the small caps. To make adjustments for
+the difference in weight and width of the smaller caps, she also
+needs to know by how much to embolden (&#8220;fatten&#8221;) the
+smallcaps, and by how much to increase their width.
+</p>
+
+<p>
+All three arguments to SMALLCAPS_STYLE reflect a
+percentage of the point size in effect when
+<a href="#smallcaps">SMALLCAPS</a>
+is invoked. Mom&#8217;s defaults for pseudo-smallcaps are:
+<br/>
+<span class="pre-in-pp">
+ SIZE = 74%
+ WEIGHT_ADJ = .3%
+ EXTEND = 5%
+</span>
+To change any or all of the defaults, you might enter
+<br/>
+<span class="pre-in-pp">
+ .SMALLCAPS_STYLE SIZE 80 WEIGHT_ADJ .25 EXTEND 3
+</span>
+or, more readably,
+<br/>
+<span class="pre-in-pp">
+ .SMALLCAPS_STYLE
+ SIZE 80 \
+ WEIGHT_ADJ .25 \
+ EXTEND 3
+</span>
+Note that you do not have to give SMALLCAPS_STYLE all three
+arguments, and that the arguments may be entered in any order. Any
+arguments you omit will remain at their former value.
+</p>
+
+<div class="rule-short" style="margin-bottom: 24px;"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="aldrld-intro" class="macro-group">Vertical movements</h2>
+
+The two macros in this section allow you to move down or up on the
+page relative to the current
+<a href="definitions.html#baseline">baseline</a>.
+
+<div id="index-aldrld" class="macro-list-container">
+<h3 class="macro-list">Vertical movements macros</h3>
+<ul class="macro-list">
+ <li><a href="#ald">ALD</a> &ndash; Advance Lead</li>
+ <li><a href="#rld">RLD</a> &ndash; Reverse Lead</li>
+ <li>(see also <a href="#space">SPACE</a>)</li>
+</ul>
+</div>
+
+<!-- -ALD- -->
+
+<div class="macro-id-overline">
+<h3 id="ald" class="macro-id">Advance Lead (move downward)</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>ALD</b> <kbd class="macro-args">&lt;distance to move downward&gt;</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+ALD takes one argument: the distance to move downward on the page
+relative to the current vertical position.
+</p>
+
+<p>
+ALD causes a line break, which means the argument is added to the
+current
+<a href="definitions.html#leading">leading</a>.
+For example, if your current leading is 12 points, a line of type
+after <kbd>.ALD 6p</kbd> will be 18 points distant from the previous
+line.
+</p>
+
+<p>
+If you wish to advance the argument's distance <i>from the
+current baseline,</i> it should be preceded by
+<a href="#el">EL</a>.
+For example,
+<br/>
+<span class="pre-in-pp">
+ .LEFT
+ .LS 12
+ First line.
+ Second line.\c
+ .EL
+ .ALD 15p
+ Third line.
+</span>
+would place the third line exactly 15 points beneath the second.
+</p>
+
+<p>
+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
+<br/>
+<span class="pre-in-pp">
+ .ALD .25i
+</span>
+or
+<br/>
+<span class="pre-in-pp">
+ .ALD 1P+6p
+</span>
+As the mnemonic
+(<span style="text-decoration: underline;">A</span>dvance <span style="text-decoration: underline;">L</span>ea<span style="text-decoration: underline;">D</span>)
+suggests, you&#8217;ll most often use ALD with
+<a href="definitions.html#picaspoints">points</a>
+of lead.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> 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 <kbd>-1v</kbd> (minus one
+line space), like this:
+<br/>
+<span class="pre-in-pp">
+ .ALD 1i-1v
+</span>
+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.
+</p>
+</div>
+
+<!-- -RLD- -->
+
+<div class="macro-id-overline">
+<h3 id="rld" class="macro-id">Reverse Lead (move upward)</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>RLD</b> <kbd class="macro-args">&lt;distance to move upward&gt;</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+RLD takes one argument: the distance to move upward on the page
+relative to the current vertical position.
+</p>
+
+<p>
+RLD causes a line break, which means the argument is subtracted from
+the current
+<a href="definitions.html#leading">leading</a>.
+For example, if your current leading is 12 points, a line of type
+after <kbd>.RLD 6p</kbd> will be 6 points distant from the previous
+line.
+</p>
+
+<p>
+If you wish to move upward <i>from the current baseline</i> by the
+argument's distance, RLD should be preceded by
+<a href="#el">EL</a>.
+For example,
+<br/>
+<span class="pre-in-pp">
+ .LEFT
+ .LS 18
+ First line.
+ Second line.\c
+ .EL
+ .RLD 3p
+ Third line.
+</span>
+would raise the third line by 3 points relative to the baseline of
+the second line. Put another way, if the <kbd>.RLD</kbd> in the
+example were 18p, the third line would fall on the same baseline as
+the second.
+</p>
+
+<p>
+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
+<br/>
+<span class="pre-in-pp">
+ .RLD .25i
+</span>
+or
+<span class="pre-in-pp">
+ .RLD 1P+6p
+</span>
+As the mnemonic
+(<span style="text-decoration: underline;">R</span>everse <span style="text-decoration: underline;">L</span>ea<span style="text-decoration: underline;">D</span>)
+suggests, you&#8217;ll most often use RLD with
+<a href="definitions.html#picaspoints">points</a>
+of lead.
+</p>
+
+<div class="rule-short" style="margin-bottom: 24px;"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="tabs-intro" class="macro-group">Tabs</h2>
+
+<p>
+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&#8217;s
+notion of tabs. I recommend reading this section carefully in order
+to understand how mom handles tabs.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> see the section
+<a href="docprocessing.html#behaviour">Typesetting macros during document processing</a>
+for reassuring information on the use of tabs during
+<a href="docprocessing.html#docprocessing">document processing</a>.
+</p>
+</div>
+
+<h3 id="typesetting-tabs" class="docs">Typesetting tabs</h3>
+
+<p>
+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
+<a href="#multicolumns-intro">multi-column macros</a>,
+typesetting tabs significantly facilitate tabular and columnar work.
+</p>
+
+<p>
+Typesetting tabs are created with the
+<a href="#tab-set">TAB_SET</a>
+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
+<a href="#tab">TAB</a>
+macro.
+</p>
+
+<div class="examples-container">
+<h3 id="typesetting-tabs-tut" class="docs notes">Quickie tutorial on typesetting tabs</h3>
+
+<p style="margin-top: .5em;">
+Say you want to set up three tabs to produce an employee evaluation
+that looks something like this:
+</p>
+
+<div class="box-code" style="padding-bottom: 0;">
+<span id="typsetting-tabs-sample" class="pre-in-pp" style="color: #302419">
+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.
+</span>
+</div>
+
+<p>
+You want the first tab, CRITERION,
+</p>
+<ul style="margin-top: -.5em; margin-bottom: -.5em;">
+<li>to begin at the left margin of the page &ndash; i.e. no indent</li>
+<li>to have a line length of 5 picas</li>
+<li>to be set flush left</li>
+</ul>
+
+<p>
+Tabs must be numbered, and each has to be set up with a separate
+<a href="#tab-set">TAB_SET</a>
+line. Therefore, to set up tab 1, you enter
+<br/>
+<span class="pre-in-pp">
+ .TAB_SET 1 0 5P L
+ | | | |
+ tab #--+ | | +--direction
+ | |
+ indent--+ +--length
+</span>
+You want the second tab, EVALUATION,
+</p>
+<ul style="margin-top: -.5em; margin-bottom: -.5em;">
+<li>to begin 8 picas from the left margin</li>
+<li>to have a length of 9 picas</li>
+<li>to be set centered</li>
+</ul>
+
+<p>
+You set it up like this:
+<br/>
+<span class="pre-in-pp">
+ .TAB_SET 2 8P 9P C
+ | | | |
+ tab #--+ | | +--direction
+ | |
+ indent--+ +--length
+</span>
+You want the third tab, COMMENTS,
+</p>
+<ul style="margin-top: -.5em; margin-bottom: -.5em;">
+<li>to begin 19 picas from the left margin</li>
+<li>to have a length of 17 picas</li>
+<li>to be set flush left, <a href="definitions.html#filled">filled</a></li>
+</ul>
+
+<p>
+The setup looks like this:
+<br/>
+<span class="pre-in-pp">
+ .TAB_SET 3 19P 17P L QUAD
+ | | | | |
+ | | | | +--fill output lines
+ | | | |
+ tab #--+ | | +--direction
+ | |
+ indent--+ +--length
+</span>
+Once the tabs are set up, you can call them in one of two ways:
+</p>
+<ul style="margin-top: -.5em; margin-bottom: -.5em;">
+<li>with <kbd><a href="#tab">.TAB</a></kbd> (passing the tab
+ number as an argument), which breaks the current line,
+ advances one linespace and calls the tab.</li>
+<li>with <kbd><a href="#tn">.TN</a></kbd> (Tab Next), which 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.), or, more
+ conveniently, with the
+ <kbd><a href="#tn">\*[TB+]</a></kbd>
+ <a href="definitions.html#inlines">inline escape</a></li>
+</ul>
+
+<p>
+To exit from tabs and restore your original left margin, line
+length, quad direction and fill mode, use
+<kbd><a href="#tq">.TQ</a></kbd>
+(Tab Quit).
+</p>
+
+<p>
+Here&#8217;s how the input for our sample employee evaluation looks
+(with some introductory parameters):
+</p>
+
+<div class="examples" style="margin-bottom: 0px;">Code:</div>
+<div class="box-code" style="height: 324px; padding-bottom: 18px; overflow: auto;">
+<span class="pre-in-pp">
+.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\*[TB+]
+EVALUATION\*[TB+]
+COMMENTS
+.SP
+.TAB 1
+Service\*[TB+]
+Good\*[TB+]
+Many clients specifically request support from Joe by name.
+.SP
+.TAB 1
+Punctuality\*[TB+]
+Satisfactory\*[TB+]
+Tends to arrive after 8:00am, but often works through lunch hour.
+.SP
+.TAB 1
+Team spirit\*[TB+]
+Needs work\*[TB+]
+Persistently gives higher priority to helping clients
+than respecting organizational hierarchy.
+.TQ
+</span>
+</div>
+
+<p>
+Try setting this up and processing it with
+<br/>
+<span class="pre-in-pp">
+ pdfmom filename.mom &gt; filename.pdf
+</span>
+then previewing the .pdf file. Notice how <kbd>.TN</kbd>
+simply moves over to the next tab, while the combination
+<kbd>.SP/.TAB&nbsp;1</kbd> breaks the line, advances by one extra
+linespace, and calls the first tab.
+</p>
+
+<p>
+Notice, too, how the <kbd>QUAD</kbd> argument passed to tab 3 means
+you don&#8217;t have to worry about the length of
+<a href="definitions.html#inputline">input lines</a>;
+mom
+<a href="definitions.html#filled">fills</a>
+the tab and sets the type flush left.
+</p>
+</div>
+
+<h3 id="string-tabs" class="docs">String tabs (autotabs)</h3>
+
+<p>
+String tabs let you mark off tab positions with
+<a href="definitions.html#inlines">inline escapes</a>
+embedded in
+<a href="definitions.html#inputline">input lines</a>.
+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.
+</p>
+
+<p>
+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
+<a href="goodies.html#silent">SILENT</a>
+macro.)
+</p>
+
+<p>
+Next, you invoke the
+<a href="#st">ST</a>
+macro for every string tab you defined, and optionally pass quad and
+fill information to it. That done, string tabs are called with the
+<a href="#tab">TAB</a>
+macro, just like typesetting tabs.
+</p>
+
+<p>
+In combination with the
+<a href="goodies.html#pad">PAD</a>
+macro and the groff inline escape
+<kbd><a href="inlines.html#inline-horizontal-groff">\h</a></kbd>
+(move horizontally across the page) or mom&#8217;s
+<kbd><a href="inlines.html#inline-horizontal-mom">\*[FWD&nbsp;&lt;distance&gt;]</a></kbd>
+(move forward) inline, string tabs provide tremendous flexibility in
+setting up complex tab structures.
+</p>
+
+<div class="examples-container">
+<h3 id="string-tabs-tut" class="docs notes">Quickie tutorial on string tabs</h3>
+<p style="margin-top: .5em;">
+Say you want to set up tabs for the
+<a href="#typsetting-tabs-sample">employee evaluation form</a>
+used as an example in the
+<a href="#typesetting-tabs-tut">typesetting tabs tutorial</a>.
+This time, though, you want to play around with the point size of
+type, so you can&#8217;t know exactly how long the tabs will be or
+where they should start. All you know is
+</p>
+<ul style="margin-top: -.5em; margin-bottom: -.5em;">
+<li>CRITERION is the longest line in tab 1</li>
+<li>EVALUATION is the longest line in tab 2</li>
+<li>tab 3 should extend to the current right margin</li>
+<li>you want a 1 pica gutter between each tab</li>
+</ul>
+
+<p>
+This is an ideal job for string tabs.
+</p>
+
+<p>
+The first thing you need for string tabs is an
+<a href="definitions.html#inputline">input line</a>
+with tab positions marked on it. Tabs are marked with the
+<a href="definitions.html#inlines">inline escapes</a>
+<a href="#inline-st"><kbd><span class="nobr">\*[ST&lt;n&gt;]</span></kbd></a>
+and
+<a href="#inline-st"><kbd><span class="nobr">\*[ST&lt;n&gt;X]</span></kbd></a>,
+where <kbd>&lt;n&gt;</kbd>
+is the number you want the tab to have. (In this example, we
+enclose the input line with the
+<a href="goodies.html#silent">SILENT</a>
+macro so the line doesn&#8217;t print. We also use the
+<a href="goodies.html#pad">PAD</a>
+macro to permit defining tab 3 as simply &#8220;the amount of space
+remaining on the input line.&#8221;)
+</p>
+
+<p>
+The setup looks like this:
+</p>
+
+<div class="examples" style="margin-bottom: 0px;">Code:</div>
+
+<div class="box-code">
+<span class="pre-in-pp">
+.SILENT
+.PAD "\*[ST1]CRITERION\*[ST1X]\*[FWD 12p]\*[ST2]EVALUATION\*[ST2X]\*[FWD 12p]\*[ST3]#\*[ST3X]"
+.SILENT OFF
+</span>
+</div>
+
+<p>
+The long line after <kbd>.PAD</kbd> looks scary, but
+it isn&#8217;t really. Here&#8217;s what it means when broken down
+into its component parts:
+</p>
+<ul style="margin-bottom: -1em;">
+<li>The longest line in tab 1 is &#8220;CRITERION&#8221;, so we
+ enclose CRITERION with begin/end markers for string tab 1:
+<br/>
+<span class="pre-in-pp" style="margin-bottom: -.25em;">
+ \*[ST1]CRITERION\*[ST1X]
+</span>
+</li>
+<li>We want a 1 pica (12 points) gutter between tab 1 and 2,
+ so we insert 12 points of space with <span class="nobr">\*[FWD&nbsp;12p]:</span>
+<br/>
+<span class="pre-in-pp" style="margin-bottom: -.25em;">
+ \*[FWD 12p]
+</span>
+</li>
+<li>The longest line in tab 2 is &#8220;EVALUATION&#8221;, so
+ we enclose EVALUATION with begin/end markers for string
+ tab 2:
+<span class="pre-in-pp" style="margin-bottom: -.25em;">
+ \*[ST2]EVALUATION\*[ST2X]
+</span>
+</li>
+<li>We want 1 pica (12 points) between tab 2 and 3, so we
+ insert it with:
+<br/>
+<span class="pre-in-pp" style="margin-bottom: -.25em;">
+ \*[FWD 12p]
+</span>
+</li>
+<li>We want tab 3 to be as long as whatever space remains on
+ the current line length, so we enclose the
+ <a href="goodies.html#pad-marker">pad marker</a>
+ (#) with begin/end markers for string tab 3:
+<span class="pre-in-pp">
+ \*[ST3]#\*[ST3X]
+</span>
+ </li>
+</ul>
+
+<p>
+The tabs are now defined, but they require
+<a href="definitions.html#quad">quad direction</a>
+and
+<a href="definitions.html#filled">fill</a>
+information. For each string tab defined above, enter a separate
+<kbd><a href="#st">.ST</a></kbd>
+line, like this:
+<br/>
+<span class="pre-in-pp">
+ .ST 1 L
+ .ST 2 L
+ .ST 3 L QUAD
+ | | |
+ | | +--fill output lines
+ | |
+tab #--+ +--direction
+</span>
+From here on in, you call the tabs with
+<kbd><a href="#tab">.TAB</a></kbd>,
+<kbd><a href="#tn">.TN</a></kbd>,
+or
+<a href="#tn"><kbd><span class="nobr">\*[TB+]</span></kbd></a>
+just like typesetting tabs (see
+<a href="#typesetting-tabs-tut">typesetting tabs tutorial</a>).
+</p>
+
+<p>
+Here&#8217;s the complete setup and entry for the sample employee
+evaluation form utilizing string tabs.
+</p>
+
+<div class="examples" style="margin-bottom: 0px;">Code:</div>
+<div class="box-code" style="height: 324px; padding-bottom: 18px; overflow: scroll;">
+<span class="pre-in-pp">
+.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\*[TB+]
+EVALUATION\*[TB+]
+COMMENTS
+.SP
+.TAB 1
+Service\*[TB+]
+Good\*[TB+]
+Many clients specifically request support from Joe by name.
+.SP
+.TAB 1
+Punctuality\*[TB+]
+Satisfactory\*[TB+]
+Tends to arrive after 8:00am, but often works through lunch hour.
+.SP
+.TAB 1
+Team spirit\*[TB+]
+Needs work\*[TB+]
+Persistently gives higher priority to helping clients
+than respecting organizational hierarchy.
+.TQ
+</span>
+</div>
+
+<p>
+Try setting this up and processing it with
+<br/>
+<span class="pre-in-pp">
+ pdfmom filename.mom &gt; filename.pdf
+</span>
+and previewing the .pdf file.
+</p>
+
+<p>
+Now, change the point size of the above sample to 12 and preview it
+again. You&#8217;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.
+</p>
+
+<p>
+Now try increasing the gutters to 2 picas
+(<kbd><span class="nobr">\*[FWD&nbsp;24p]</span></kbd> or
+<kbd><span class="nobr">\*[FWD&nbsp;2P]</span></kbd> instead of
+<kbd><span class="nobr">\*[FWD&nbsp;12p]</span></kbd>). Preview the file again,
+and notice how the tab structure remains the same, but the gutters
+are wider.
+</p>
+</div>
+
+<div id="index-tabs" class="macro-list-container">
+<h3 class="macro-list">Tabs macros</h3>
+
+<ul class="macro-list">
+ <li><a href="#tab-set">TAB_SET</a> &ndash; create typesetting tabs</li>
+ <li><a href="#inline-st">\*[ST]...\*[STX]</a> &ndash; inline escapes for marking String Tabs</li>
+ <li><a href="#st">ST</a> &ndash; set String Tabs</li>
+ <li><a href="#tab">TAB</a> &ndash; call tabs</li>
+ <li><a href="#tn">TN</a> &ndash; Tab Next; call next tab in sequence</li>
+ <li><a href="#tn">\*[TB+]</a> &ndash; inline escape to call next tab in sequence</li>
+ <li><a href="#tq">TQ</a> &ndash; Tab Quit</li>
+</ul>
+
+</div>
+
+<!-- -TAB_SET- -->
+
+<div class="macro-id-overline">
+<h3 id="tab-set" class="macro-id">Set up typesetting tabs</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>TAB_SET</b> <kbd class="macro-args">&lt;tab number&gt; &lt;indent&gt; &lt;length&gt; L | R | C | J [ QUAD ]</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;<kbd style="font-style: normal;">&lt;indent&gt;</kbd> and <kbd style="font-style: normal;">&lt;length&gt;</kbd> require a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p style="margin-bottom: -.5em;">
+TAB_SET creates typesetting tabs that later can be called with
+<kbd><a href="#tab">.TAB</a></kbd>.
+Typesetting tabs are numbered, and defined by an indent, a length,
+and a quad direction, hence TAB_SET has four required arguments:
+</p>
+<ul style="margin-top: .5em; margin-bottom: -.5em;">
+<li>a tab number</li>
+<li>an indent (measured from the left margin of the page,
+ or, if you&#8217;re already in a tab, from the left margin of the tab)</li>
+<li>a length</li>
+<li>a direction</li>
+</ul>
+
+<p>
+To set up a centred tab 6 picas long and 9 points from the left
+margin, you&#8217;d enter
+<br/>
+<span class="pre-in-pp">
+ .TAB_SET 1 9p 6P C
+</span>
+The tab number in the above (&#8221;1&#8221;) is simply an
+identifier. It could have been 4, or 17, or 296. There&#8217;s no
+need to set up tabs in numerical sequence.
+</p>
+
+<p>
+By default, tabs are in
+<a href="definitions.html#filled">nofill</a>
+mode, meaning you can enter text in tabs on a line-for-line basis
+without having to use the
+<a href="#br">BR</a>
+macro. If you want a tab to be
+<a href="definitions.html#filled">filled</a>,
+pass the optional argument <kbd>QUAD</kbd>,
+which will make the tab behave as if you&#8217;d entered
+<kbd class="bold">.QUAD&nbsp;L&nbsp;|&nbsp;R&nbsp;|&nbsp;C</kbd>.
+</p>
+
+<p>
+For
+<a href="definitions.html#just">justified</a>
+tabs, simply pass the argument J (without the QUAD argument), like
+this:
+<br/>
+<span class="pre-in-pp">
+ .TAB 1 9p 6P J
+</span>
+Once tabs are set, they can be called at any time with the
+<a href="#tab">TAB&nbsp;&lt;n&gt;</a>
+macro, where &lt;n&gt; is the number of the desired tab.
+</p>
+
+<p>
+You can set up any number of typesetting tabs. However, be aware
+that
+<a href="#string-tabs">string tabs</a>
+are also called with TAB&nbsp;&lt;n&gt;, so be careful that you
+don&#8217;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.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> If you use TAB_SET while
+you&#8217;re currently inside a tab, the indent argument is the
+distance from the tab&#8217;s left margin, not the left margin of
+the page. Therefore, you should exit tabs (with
+<kbd><a href="#tq">.TQ</a></kbd>)
+before creating new tabs (unless, of course, you want to set up a
+tab structure within the confines of an existing tab).
+</p>
+</div>
+
+<div class="box-important">
+<p class="tip">
+<span class="important">IMPORTANT:</span> Turn all indents off (see
+<a href="#indents">Indents</a>)
+before setting up tabs with TAB_SET, or mom may get confused.
+</p>
+</div>
+
+<!-- -INLINE_ST- -->
+
+<div class="macro-id-overline">
+<h3 id="inline-st" class="macro-id">Mark positions of string tabs</h3>
+</div>
+
+<div class="box-macro-args">
+Inlines: <kbd class="macro-args">\*[ST&lt;number&gt;]...\*[ST&lt;number&gt;X]</kbd>
+</div>
+
+<p class="requires">
+The <a href="definitions.html#quad">quad</a>
+direction must be
+<span style="font-style: normal">LEFT</span>
+or
+<span style="font-style: normal">JUSTIFY</span>
+(see
+<a href="#quad"><span style="font-style: normal">QUAD</span></a>
+and
+<a href="#justify"><span style="font-style: normal">JUSTIFY</span></a>)
+or the
+<a href="definitions.html#filled">no-fill mode</a>
+set to
+<a href="#lrc"><span style="font-style: normal">LEFT</span></a>
+in order for these inlines to function properly. Please see
+<a href="#important1"><span style="font-style: normal">IMPORTANT</span></a>,
+below.
+</p>
+
+<p>
+String tabs need to be marked off with
+<a href="definitions.html#inlines">inline escapes</a>
+before being set up with the
+<a href="#st">ST</a>
+macro. Any input line may contain string tab markers. <kbd
+class="bold">&lt;number&gt;</kbd>, above, means the numeric
+identifier of the tab. The following shows a sample input line with
+string tab markers.
+<br/>
+<span class="pre-in-pp">
+ \*[ST1]Now is the time\*[ST1X] for all \*[ST2]good men\*ST2X] to come to the aid of the party.
+</span>
+String tab 1 begins at the start of the line and ends after the word
+&#8220;time&#8221;. String tab 2 starts at &#8220;good&#8221; and
+ends after &#8220;men&#8221;. Inline escapes (e.g. font or point
+size changes, or horizontal movements, including
+<a href="goodies.html#pad">padding</a>)
+are taken into account when mom determines the position and length
+of string tabs.
+</p>
+
+<p>
+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.
+</p>
+
+<p>
+Once string tabs have been marked in input lines, they have to be
+&#8220;set&#8221; with
+<kbd><a href="#st">.ST</a></kbd>,
+after which they may be called, by number, with
+<kbd><a href="#tab">.TAB</a></kbd>.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> 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
+<a href="goodies.html#silent">SILENT</a>
+macro.
+</p>
+</div>
+
+<div class="box-important">
+<p class="tip-top">
+<span id="important1" class="important">IMPORTANT:</span>
+Owing to the way groff processes
+<a href="definitions.html#inputline">input lines</a>
+and turns them into
+<a href="definitions.html#outputline">output lines</a>,
+it is not possible for mom to &#8220;guess&#8221; the correct
+starting position of string tabs marked off in lines that are
+centered or set flush right.
+</p>
+
+<p>
+Equally, she cannot guess the starting position if a line is fully
+justified and broken with
+<a href="#spread">SPREAD</a>.
+</p>
+
+<p>
+In other words, in order to use string tabs,
+<a href="#lrc">LEFT</a>
+must be active, or, if
+<a href="#quad">QUAD&nbsp;LEFT</a>
+or
+<a href="#justify">JUSTIFY</a>
+are active, the line on which the string tabs are marked must be
+broken &#8220;manually&#8221; with
+<kbd><a href="#br">.BR</a></kbd>
+(but not
+<kbd><a href="#spread">.SPREAD</a></kbd>).
+</p>
+
+<p class="tip-bottom">
+To circumvent this behaviour, I recommend using the
+<a href="goodies.html#pad">PAD</a>
+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,
+<br/>
+<span class="pre-in-pp">
+ .CENTER
+ \*[ST1]A line of text\*[ST1X]\c
+ .EL
+ .ST 1
+ .TAB 1
+ .PT_SIZE 24
+ .ALD 3p
+ \*[RULE]
+ .RLD 3p
+ .TQ
+</span>
+you should do:
+<br/>
+<span class="pre-in-pp">
+ .QUAD CENTER
+ .PAD "#\*[ST1]A line of text\*[ST1X]#"
+ .EL
+ .ST 1
+ .TAB 1
+ .PT_SIZE 24
+ .ALD 3p
+ \*[RULE] \" Note that you can&#8217;t use \*[UP ] or \*[DOWN] with \*[RULE]
+ .RLD 3p
+ .TQ
+</span>
+</p>
+</div>
+
+<!-- -ST- -->
+
+<div class="macro-id-overline">
+<h3 id="st" class="macro-id">Set string tabs</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>ST</b> <kbd class="macro-args">&lt;tab number&gt; L | R | C | J [ QUAD ]</kbd>
+</div>
+
+<p>
+After string tabs have been marked off on an input line (see
+<a href="#inline-st"><kbd><span class="nobr">\*[ST]...\*[STX]</span></kbd></a>),
+you need to &#8220;set&#8221; them by giving them a direction and,
+optionally, the <kbd>QUAD</kbd> argument. In this respect, ST is
+like
+<a href="#tab-set">TAB_SET</a>
+except that you don&#8217;t have to give ST an indent or a
+line length (that&#8217;s already taken care of, inline, by
+<kbd><span class="nobr">\*[ST]...\*[STX]</span></kbd>). If you want string tab 1
+to be left, enter
+<br/>
+<span class="pre-in-pp">
+ .ST 1 L
+</span>
+If you want it to be left and
+<a href="definitions.html#filled">filled</a>, enter
+<br/>
+<span class="pre-in-pp">
+ .ST 1 L QUAD
+</span>
+If you want it to be justified, enter
+<br/>
+<span class="pre-in-pp">
+ .ST 1 J
+</span>
+See the
+<a href="#string-tabs-tut">Quickie tutorial on string tabs</a>
+for a full explanation of setting up string tabs.
+</p>
+
+<!-- -TAB- -->
+
+<div class="macro-id-overline">
+<h3 id="tab" class="macro-id">Call tabs</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>TAB</b> <kbd class="macro-args">&lt;tab number&gt;</kbd>
+</div>
+<p class="alias">
+<i>Alias:</i> <b>TB</b>
+</p>
+
+<p>
+After tabs have been defined (either with
+<a href="#tab-set">TAB_SET</a>
+or
+<a href="#st">ST</a>),
+TAB moves to whatever tab number you pass it as an argument. For
+example,
+<br/>
+<span class="pre-in-pp">
+ .TAB 3
+</span>
+moves you to tab 3.
+</p>
+
+<div id="note-tn" class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span> TAB breaks the line preceding it and
+advances 1 linespace. Hence,
+<br/>
+<span class="pre-in-pp">
+ .TAB 1
+ A line of text in tab 1.
+ .TAB 2
+ A line of text in tab 2.
+</span>
+produces, on output
+<br/>
+<span class="pre-in-pp">
+ A line of text in tab 1.
+ A line of text in tab 2.
+</span>
+If you want the tabs to line up, use
+<a href="#tn">TN</a>
+(Tab Next)
+or, more conveniently, the inline escape
+<a href="#tn"><span class="nobr">\*[TB+]</span></a>:
+<br/>
+<span class="pre-in-pp">
+ .TAB 1
+ A line of text in tab 1.\*[TB+]
+ A line of text in tab 2.
+</span>
+which produces
+<br/>
+<span class="pre-in-pp">
+ A line of text in tab 1. A line of text in tab 2.
+</span>
+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
+<a href="#multicolumns-intro">multi-column</a> macros.
+</p>
+
+<p id="tab-add-note" class="tip-bottom">
+<span class="additional-note">Additional note:</span> 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.
+</p>
+</div>
+
+<!-- -TN- -->
+
+<div class="macro-id-overline">
+<h3 id="tn" class="macro-id">Tab Next</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>TN</b>
+<br/>Inline escape: <b>\*[TB+]</b>
+</div>
+
+<p>
+TN moves over to the next tab in numeric sequence (tab n+1) without
+advancing on the page. See the
+<a href="#note-tn">NOTE</a>
+in the description of the TAB macro for an example of how TN works.
+</p>
+
+<p>
+In tabs that aren&#8217;t given the <kbd class="normal">QUAD</kbd>
+argument when they&#8217;re set up with
+<a href="#tab-set" class="normal">TAB&nbsp;SET</a>
+or
+<a href="#st" class="normal">ST</a>,
+you must terminate the line preceding <kbd class="normal">.TN</kbd>
+with the <kbd class="normal">\c</kbd> inline escape. Conversely,
+if you did give a <kbd>QUAD</kbd> argument to TAB_SET or ST, the
+<kbd>\c</kbd> must not be used.
+</p>
+
+<p>
+If you find remembering whether to put in the
+<kbd class="normal">\c</kbd> bothersome, you may prefer to use the
+<a href="definitions.html#inlines" class="normal">inline escape</a>
+alternative to
+<kbd class="normal">.TN</kbd>,
+<a href="inlines.html#tb-plus-mom"><kbd class="normal"><span class="nobr">\*[TB+]</span></kbd></a>,
+which works consistently regardless of the fill mode.
+</p>
+
+<div id="tn-note" class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> You must put text in the
+<a href="definitions.html#inputline">input line</a>
+immediately after TN. Stacking of TN&#8217;s is not
+allowed. In other words, you cannot do
+<br/>
+<span class="pre-in-pp">
+ .TAB 1
+ Some text\c
+ .TN
+ Some more text\c
+ .TN
+ .TN
+ Yet more text
+</span>
+The above example, assuming tabs numbered from 1 to 4, should be entered
+<br/>
+<span class="pre-in-pp">
+ .TAB 1
+ Some text\c
+ .TN
+ Some more text\c
+ .TN
+ \&amp;\c
+ .TN
+ Yet more text
+</span>
+
+<kbd>\&amp;</kbd> is a zero-width, non-printing character that groff
+recognizes as valid input, hence meets the requirement for input
+text following <kbd>.TN</kbd>.
+</p>
+</div>
+
+<!-- -TQ- -->
+
+<div class="macro-id-overline">
+<h3 id="tq" class="macro-id">Tab Quit</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>TQ</b>
+</div>
+
+<p>
+TQ takes you out of whatever tab you were in, advances 1 linespace,
+and restores the left margin, line length, quad direction and
+<a href="definitions.html#filled">fill mode</a>
+that were in effect prior to invoking any tabs.
+</p>
+
+<div class="rule-short" style="margin-bottom: 24px;"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="multicolumns-intro" class="macro-group">Multiple columns</h2>
+
+<p>
+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
+<a href="definitions.html#baseline">baseline</a>
+of the first line in the previous tab. To demonstrate:
+<br/>
+<span class="pre-in-pp">
+ .TAB 1
+ Carrots
+ Potatoes
+ Broccoli
+ .TAB 2
+ $1.99/5 lbs
+ $0.25/lb
+ $0.99/bunch
+</span>
+produces, on output
+<br/>
+<span class="pre-in-pp">
+ Carrots
+ Potatoes
+ Broccoli
+ $1.99/5 lbs
+ $0.25/lb
+ $0.99/bunch
+</span>
+The multi-column macros allow you to set tabs in columnar fashion,
+rather than line by line. When you invoke multi-column mode (with
+<kbd><a href="#mco">.MCO</a></kbd> &ndash;
+<span style="text-decoration: underline">M</span>ulti-<span style="text-decoration: underline">C</span>olumn <span style="text-decoration: underline">O</span>n),
+mom saves the position of the current baseline.
+<kbd><a href="#mcr">.MCR</a></kbd>
+(<span style="text-decoration: underline">M</span>ulti-<span style="text-decoration: underline">C</span>olumn <span style="text-decoration: underline">R</span>eturn)
+at any point while multi-columns are on returns you to the saved
+position. Exiting multi-columns
+(<kbd><a href="#mcx">.MCX</a></kbd> &ndash;
+<span style="text-decoration: underline">M</span>ulti-<span style="text-decoration: underline">C</span>olumn e<span style="text-decoration: underline">X</span>it)
+quits the current tab (if you&#8217;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.)
+</p>
+
+<p>
+Using our example above, but setting it in multi-column mode,
+<br/>
+<span class="pre-in-pp">
+ .MCO
+ .TAB 1
+ Carrots
+ Potatoes
+ Broccoli
+ .MCR
+ .TAB 2
+ $1.99/5 lbs
+ $0.25/lb
+ $0.99/bunch
+ .MCX
+</span>
+produces
+<br/>
+<span class="pre-in-pp">
+ Carrots $1.99/5 lbs
+ Potatoes $0.25/lb
+ Broccoli $0.99/bunch
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> Do not confuse MCO with
+the
+<a href="docprocessing.html#columns">COLUMNS</a>
+macro in the
+<a href="docprocessing.html#docprocessing">document processing macros</a>.
+</p>
+</div>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Additional Note:</span>
+Do not use multi-columns with
+<a href="docprocessing.html#slide">DOCTYPE&nbsp;SLIDES</a>
+because MCX uses the lowest line on the page to determine column
+depth. Owing to the fact that both headers and footers are printed
+prior to slides receiving text, MCX will always go to the
+footer position. If you need functionality similar to MCO/MCX, use
+the groff requests <kbd>.mk</kbd> and <kbd>.rt</kbd>. See
+<kbd>info groff mk</kbd>.
+</p>
+</div>
+
+<div id="index-multicolumns" class="macro-list-container">
+<h3 class="macro-list">Multi-columns macros</h3>
+
+<ul class="macro-list">
+ <li><a href="#mco">MCO</a> &ndash; begin multi-column setting</li>
+ <li><a href="#mcr">MCR</a> &ndash; return to top of column</li>
+ <li><a href="#mcx">MCX</a> &ndash; exit multi-columns</li>
+</ul>
+</div>
+
+<!-- -MCO- -->
+
+<div class="macro-id-overline">
+<h3 id="mco" class="macro-id">Begin multi-column setting</h3>
+</div>
+
+<div class="box-macro-args">
+ Macro: <b>MCO</b>
+</div>
+
+<p>
+MCO (<span style="text-decoration: underline;">M</span>ulti-<span style="text-decoration: underline;">C</span>olumn <span style="text-decoration: underline;">O</span>n) is the macro you use to begin multi-column
+setting. It marks the current
+<a href="definitions.html#baseline">baseline</a>
+as the top of your columns, for use later with
+<a href="#mcr">MCR</a>.
+See the
+<a href="#multicolumns-intro">introduction to columns</a>
+for an explanation of multi-columns and some sample
+input.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> Do not confuse MCO with
+the
+<a href="docprocessing.html#columns">COLUMNS</a>
+macro in the
+<a href="docprocessing.html#docprocessing">document processing macros</a>.
+</p>
+</div>
+
+<!-- -MCR- -->
+
+<div class="macro-id-overline">
+<h3 id="mcr" class="macro-id">Return to top of column</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>MCR</b>
+</div>
+
+<p>
+Once you&#8217;ve turned multi-columns on (with
+<kbd><a href="#mco">.MCO</a></kbd>),
+<kbd>.MCR</kbd>, at any time, returns you to the top of
+your columns.
+</p>
+
+<!-- -MCX- -->
+
+<div class="macro-id-overline">
+<h3 id="mcx" class="macro-id">Exit multi-columns</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>MCX</b> <kbd class="macro-args">[ &lt;distance to advance below longest column&gt; ]</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;Optional argument requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+MCX takes you out of any tab you were in (by silently invoking
+<kbd><a href="#tq">.TQ</a></kbd>)
+and advances to the bottom of the longest column.
+</p>
+
+<p>
+Without an argument, MCX advances 1 linespace below the longest
+column. Linespace, in this instance, is the
+<a href="definitions.html#leading">leading</a>
+in effect at the moment MCX is invoked.
+</p>
+
+<p>
+If you pass the <kbd>&lt;distance&gt;</kbd> 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&#8217;d enter
+<br/>
+<span class="pre-in-pp">
+ .MCX 6p
+</span>
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> If you wish to advance a precise
+distance below the
+<a href="definitions.html#baseline">baseline</a>
+of the longest column, use MCX with an argument of 0 (zero; no unit
+of measure required) in conjunction with the
+<a href="#ald">ALD</a>
+macro, like this:
+<br/>
+<span class="pre-in-pp" style="margin-bottom: -12px;">
+ .MCX 0
+ .ALD 24p
+</span>
+</p>
+</div>
+
+<p>
+The above advances to precisely 24 points below the baseline
+of the longest column.
+</p>
+
+<div class="rule-short" style="margin-bottom: 24px;"><hr/></div>
+
+<!-- ==================================================================== -->
+
+<h2 id="indents-intro" class="macro-group">Indents</h2>
+
+<p>
+With mom&#8217;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 &#8220;hanging&#8221; left indents (the reverse of a temporary
+indent; the first line isn&#8217;t indented, subsequent lines are).
+</p>
+
+<h3 id="indents-handling" class="docs">How mom handles indents</h3>
+
+<p>
+Mom provides five kinds of indents: left, right, both, temporary,
+and hanging. Each is invoked by its own name:
+</p>
+<ul style="margin-top: -.5em; margin-bottom: -.5em;">
+<li>IL &ndash; Indent Left</li>
+<li>IR &ndash; Indent Right</li>
+<li>IB &ndash; Indent Both</li>
+<li>HI &ndash; Hanging Indent</li>
+<li>TI &ndash; Temporary Indent</li>
+</ul>
+
+<p>
+In addition, there are four macros to control exiting from
+indents:
+</p>
+<ul style="margin-top: -.5em; margin-bottom: -.5em;">
+<li>IQ &ndash; quit all active indents</li>
+<li>ILX &ndash; exit indent style left</li>
+<li>IRX &ndash; exit indent style right</li>
+<li>IBX &ndash; exit indent style both</li>
+</ul>
+
+<p>
+This section deals exclusively with IL, IR, and IB. For an
+explanation of hanging and temporary indents&mdash;how they work and
+how to use them&mdash;see
+<a href="#hi">Hanging indents</a>
+and
+<a href="#ti">Temporary indents</a>.
+</p>
+
+<p>
+The first time you invoke any of mom&#8217;s indents, you must
+supply a measure. For example,
+<br/>
+<span class="pre-in-pp">
+ .IL 2P
+</span>
+indents text 2 picas from the left margin (or current tab indent).
+</p>
+
+<p>
+When you want to exit the above indent, use either
+<br/>
+<span class="pre-in-pp" style="margin-bottom: -1em;">
+ .IQ
+</span>
+or
+<span class="pre-in-pp" style="margin-top: -.5em;">
+ .ILX
+</span>
+The next time you want the same indent, invoke it without the
+argument, like this:
+<br/>
+<span class="pre-in-pp">
+ .IL
+</span>
+As you can see, once you&#8217;ve supplied a measure to an indent
+macro, mom stores the value, obviating the need to repeat it on
+subsequent invocations. And mom doesn&#8217;t just store the
+measure&mdash;she hangs on to it tenaciously. Arguments passed to
+IL, IR, and IB are additive. Consider the following:
+<br/>
+<span class="pre-in-pp">
+ .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...
+ ...
+ ...
+</span>
+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&#8217;d expect, set to the full measure.
+The third block of text&mdash;the one to pay attention to&mdash;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.
+</p>
+
+<p>
+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 <kbd>.IR</kbd> without an argument.
+</p>
+
+<p>
+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).
+<br/>
+<span class="pre-in-pp">
+ .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.
+</span>
+Sometimes, you may want to clear out the stored indent
+values&mdash;let mom start indenting with a clean slate, as it
+were. Giving the optional argument <kbd>CLEAR</kbd> to any of the
+&#8220;indent quit&#8221; macros resets them to zero.
+</p>
+<ul style="margin-top: -.5em; margin-bottom: -.5em;">
+ <li>IQ CLEAR &ndash; quit and clear all indents</li>
+ <li>ILX CLEAR &ndash; quit and clear indent style left</li>
+ <li>IRX CLEAR &ndash; quit and clear indent style right</li>
+ <li>IBX CLEAR &ndash; quit and clear indent style both</li>
+</ul>
+
+<p>
+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.
+<br/>
+<span class="pre-in-pp">
+ .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
+</span>
+If, at <kbd>.IRX</kbd>, you wanted the text afterwards to have no
+indents (either left or right), you would enter <kbd>.IQ</kbd>,
+which exits all indent styles at once.
+</p>
+
+<p>
+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&#8217;s better to use tabs, or actually change the left margin
+or the line length. Mom&#8217;s indenting macros are flexible and
+powerful, but easy to get tangled up in.
+</p>
+
+<div class="box-tip">
+<p class="tip">
+<span class="note">Note:</span> see the section
+<a href="docprocessing.html#behaviour">Typesetting macros during document processing</a>
+for information and advice on using indents with the
+<a href="docprocessing.html#docprocessing">document processing macros</a>.
+</p>
+</div>
+
+<div id="index-indents" class="macro-list-container">
+<h3 class="macro-list">Indents macros</h3>
+
+<ul class="macro-list">
+ <li><a href="#il">IL</a> &ndash; Indent left</li>
+ <li><a href="#ir">IR</a> &ndash; Indent right</li>
+ <li><a href="#ib">IB</a> &ndash; Indent both</li>
+ <li><a href="#ti">TI</a> &ndash; Temporary indent, left</li>
+ <li><a href="#hi">HI</a> &ndash; Hanging Indent
+ <ul style="margin-left: -.5em; list-style-type: disc;">
+ <li><a href="#num-lists">Recipe: a numbered list using hanging indents</a></li>
+ </ul></li>
+ <li><a href="#iq">IQ</a> &ndash; Quit indents, all</li>
+ <li><a href="#iq">ILX</a> &ndash; Exit indent style left</li>
+ <li><a href="#iq">IRX</a> &ndash; Exit indent style right</li>
+ <li><a href="#iq">IBX</a> &ndash; Exit indent style both</li>
+</ul>
+</div>
+
+<!-- -IL- -->
+
+<div class="macro-id-overline">
+<h3 id="il" class="macro-id">Indent left</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>IL</b> <kbd class="macro-args">[ &lt;measure&gt; ]</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;The optional argument requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+IL indents text from the left margin of the page, or if you&#8217;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.
+</p>
+
+<p>
+The first time you invoke <kbd>.IL</kbd>, 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
+<kbd><a href="inlines.html#inline-stringwidth-groff">\w</a></kbd>
+<a href="definitions.html#inlines">inline escape</a>
+may be used to specify a text-dependent measure, in which case no
+unit of measure is required. For example,
+<br/>
+<span class="pre-in-pp">
+ .IL \w'margarine'
+</span>
+indents text by the width of the word &#8220;margarine&#8221;.
+</p>
+
+<p>
+With no argument, IL after an ILX indents by its last active value. See the
+<a href="#indents-handling">explanation of how mom handles indents</a>
+for more details.
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span> Calling a tab (with
+<kbd><a href="#tab">.TAB&nbsp;&lt;n&gt;</a></kbd>)
+automatically cancels any active indents.
+</p>
+
+<p class="tip-bottom">
+<span class="additional-note">Additional note:</span> Invoking IL
+automatically turns off IB.
+</p>
+</div>
+
+<!-- -IR- -->
+
+<div class="macro-id-overline">
+<h3 id="ir" class="macro-id">Indent right</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>IR</b> <kbd class="macro-args">[ &lt;measure&gt; ]</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;The optional argument requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+IR indents text from the right margin of the page, or if
+you&#8217;re in a tab, from the end of the tab.
+</p>
+
+<p>
+The first time you invoke <kbd>.IR</kbd>, 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
+<kbd><a href="inlines.html#inline-stringwidth-groff">\w</a></kbd>
+<a href="definitions.html#inlines">inline escape</a>
+may be used to specify a text-dependent measure, in which case no
+unit of measure is required. For example, <br/>
+<span class="pre-in-pp">
+ .IR \w'jello'
+</span>
+indents text by the width of the word &#8220;jello&#8221;.
+</p>
+
+<p>
+With no argument, IR after an IRX indents by its last active value. See the
+<a href="#indents-handling">explanation of how mom handles indents</a>
+for more details.
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span> Calling a tab (with
+<kbd><a href="#tab">.TAB&nbsp;&lt;n&gt;</a></kbd>)
+automatically cancels any active indents.
+</p>
+
+<p class="tip-bottom">
+<span class="additional-note">Additional note:</span> Invoking IR
+automatically turns off IB.
+</p>
+</div>
+
+<!-- -IB- -->
+
+<div class="macro-id-overline">
+<h3 id="ib" class="macro-id">Indent both</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>IB</b> <kbd class="macro-args">[ &lt;indent-1&gt; &lt;indent-2&gt; ]</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;The optional arguments require a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+IB allows you to set or invoke a left and a right indent at the same
+time.
+</p>
+
+<p>
+If you supply only an <kbd>indent-1</kbd> argument, the argument is
+the amount to indent from both the left and right margins. If you
+give both <kbd>indent-1</kbd> and <kbd>indent-2</kbd>, the first is
+the indent from the left margin and the second is the indent from
+the right margin.
+</p>
+
+<p>
+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&#8217;ll save
+yourself a lot of grief.)
+</p>
+
+<p>
+A minus sign may be prepended to the arguments to subtract from
+their current values. The
+<a href="inlines.html#inline-stringwidth-groff"><kbd>\w</kbd></a>
+<a href="definitions.html#inlines">inline escape</a>
+may be used to specify text-dependent measures, in which case no
+unit of measure is required. For example,
+<br/>
+<span class="pre-in-pp">
+ .IB \w&#8217;margarine&#8217; \w'jello'
+</span>
+left indents text by the width of the word &#8220;margarine&#8221;
+and right indents by the width of &#8220;jello&#8221;.
+</p>
+
+<p>
+Like IL and IR, IB with no argument after an IBX indents by its
+last active values. See the
+<a href="#indents-handling">explanation of how mom handles indents</a>
+for more details.
+</p>
+
+<div class="box-tip">
+<p class="tip-top">
+<span class="note">Note:</span> Calling a tab (with
+<a href="#tab"><kbd>.TAB&nbsp;&lt;n&gt;</kbd></a>)
+automatically cancels any active indents.
+</p>
+
+<p class="tip-bottom">
+<span class="additional-note">Additional note:</span> Invoking IB
+automatically turns off IL and IR.
+</p>
+</div>
+
+<!-- -TI- -->
+
+<div class="macro-id-overline">
+<h3 id="ti" class="macro-id">Temporary (left) indent</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>TI</b> <kbd class="macro-args">[ &lt;measure&gt; ]</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;The optional argument requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+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&#8217;s
+<a href="docelement.html#pp">PP</a>
+macro, for example, uses a temporary indent.)
+</p>
+
+<p>
+The first time you invoke <kbd>.TI</kbd>, you must give
+it a measure. If you want to indent the first line of a paragraph
+by, say, 2
+<a href="definitions.html#em">ems</a>,
+do
+<br/>
+<span class="pre-in-pp">
+ .TI 2m
+</span>
+Subsequent invocations of TI do not require you to supply a measure;
+mom keeps track of the last measure you gave it.
+</p>
+
+<p>
+Because temporary indents are temporary, there&#8217;s no need to
+turn them off.
+</p>
+
+<div class="box-important">
+<p class="tip">
+<span class="important">IMPORTANT:</span> Unlike IL, IR, and IB,
+measures given to TI are <i>not</i> additive. In the following
+example, the second <kbd>.TI&nbsp;2P</kbd> is exactly 2 picas.
+<br/>
+<span class="pre-in-pp" style="margin-bottom: -18px;">
+ .TI 1P
+ The beginning of a paragraph...
+ .TI 2P
+ The beginning of another paragraph...
+</span>
+</p>
+</div>
+
+<!-- -HI- -->
+
+<div class="macro-id-overline">
+<h3 id="hi" class="macro-id">Hanging indent</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>HI</b> <kbd class="macro-args">[ &lt;measure&gt; ]</kbd>
+</div>
+<p class="requires">
+&bull;&nbsp;The optional argument requires a <a href="definitions.html#unitofmeasure">unit of measure</a>
+</p>
+
+<p>
+A hanging indent looks like this:
+<br/>
+<span class="pre-in-pp">
+ 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...
+</span>
+The first line of text &#8220;hangs&#8221; outside the left margin.
+</p>
+
+<p>
+In order to use hanging indents, you must first have a left indent
+active (set with either
+<kbd><a href="#il">.IL</a></kbd>
+or
+<kbd><a href="#ib">.IB</a></kbd>).
+Mom will not hang text outside the left margin set with
+<kbd><a href="#l-margin">.L_MARGIN</a></kbd>
+or outside the left margin of a tab.
+</p>
+
+<p>
+The first time you invoke <kbd>.HI</kbd>, you must give
+it a measure. If you want the first line of a paragraph to hang by,
+say, 1 pica, do
+<br/>
+<span class="pre-in-pp">
+ .IL 1P
+ .HI 1P
+</span>
+Subsequent invocations of HI do not require you to supply a measure;
+mom keeps track of the last measure you gave it.
+</p>
+
+<p>
+Generally speaking, you should invoke HI immediately prior to the
+line you want hung (i.e. without any intervening
+<a href="definitions.html#controllines">control lines</a>).
+And because hanging indents affect only one line, there&#8217;s no
+need to turn them off.
+</p>
+
+<div class="box-important">
+<p class="tip">
+<span class="important">IMPORTANT:</span> 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.
+</p>
+</div>
+
+<h4 id="num-lists" class="macro-id">Recipe: A numbered list using hanging indents</h4>
+
+<div class="box-tip" style="margin-top: -.5em; margin-bottom: -.5em;">
+<p class="tip">
+<span class="note">Note:</span> mom has macros for setting lists (see
+<a href="docelement.html#list-intro">Nested lists</a>).
+This recipe exists to demonstrate the use of hanging indents only.
+</p>
+</div>
+
+<p style="margin-top: 1.5em;">
+<span class="pre-in-pp">
+ .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.'
+ .HI \w'\0\0.'
+ 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&#8217;s word on the subject except
+ Mr. Adams&#8217;.
+ .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&#8217;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?
+</span>
+First, we invoke a left indent with a measure equal to the width of
+2
+<a href="definitions.html#figurespace">figures spaces</a>
+plus a period (using the
+<a href="inlines.html#inline-stringwidth-groff"><kbd>\w</kbd></a>
+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 &#8220;out to the left
+margin&#8221;). Because we begin the first line with a number,
+a period, and a figure space, the actual text (&#8220;The most
+important point...&#8221;) starts at exactly the same spot as the
+indented lines that follow.
+</p>
+
+<p>
+Notice that subsequent invocations of <kbd>.HI</kbd> don&#8217;t
+require a measure to be given.
+</p>
+
+<p>
+Paste the example above into a file and preview it with
+<br/>
+<span class="pre-in-pp">
+ pdfmom filename.mom &gt; filename.pdf
+</span>
+to see hanging indents in action.
+</p>
+
+<!-- -IX- -->
+
+<div class="macro-id-overline">
+<h3 id="iq" class="macro-id">Quitting indents</h3>
+</div>
+
+<div class="box-macro-args">
+Macro: <b>IQ</b> <kbd class="macro-args">[ CLEAR ]</kbd> (quit any/all indents &mdash; see IMPORTANT NOTE)
+</div>
+<br/>
+
+Macro: <b>ILX</b> <kbd class="macro-args">[ CLEAR ]</kbd> (exit Indent Left)
+<br/>
+
+Macro: <b>IRX</b> <kbd class="macro-args">[ CLEAR ]</kbd> (exit Indent Right)
+<br/>
+
+Macro: <b>IBX</b> <kbd class="macro-args">[ CLEAR ]</kbd> (exit Indent Both)
+
+<div class="box-important">
+<p class="tip-top">
+<span class="important">IMPORTANT NOTE:</span> The original macro
+for quitting all indents was IX. This usage has been 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.
+</p>
+
+<p class="tip-bottom">
+As a consequence of this change, ILX, IRX and IBX may now also be
+invoked as ILQ, IRQ and IBQ. Both forms are acceptable.
+</p>
+</div>
+
+<p>
+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.
+</p>
+
+<p>
+If you pass these macros the optional argument <kbd>CLEAR</kbd>,
+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.
+</p>
+
+<p>
+<kbd>.IQ&nbsp;CLEAR</kbd>, as you&#8217;d suspect,
+quits and clears the values for all indent styles at once.
+</p>
+
+<div class="rule-long"><hr/></div>
+
+<!-- Navigation links -->
+<table style="width: 100%; margin-top: 12px;">
+<tr>
+ <td style="width: 33%;"><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="width: 33%; text-align: center;"><a href="#top">Top</a></td>
+ <td style="width: 33%; text-align: right;"><a href="goodies.html#top">Next: Goodies</a></td>
+</tr>
+</table>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/momdoc/using.html b/contrib/mom/momdoc/using.html
new file mode 100644
index 0000000..c93e385
--- /dev/null
+++ b/contrib/mom/momdoc/using.html
@@ -0,0 +1,319 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>Using mom</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div id="top" class="page">
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+ <tr>
+ <td><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="text-align: right;"><a href="typesetting.html#top">Next: The typesetting macros</a></td>
+ </tr>
+ </table>
+
+<h1 id="using" class="docs">Using mom</h1>
+
+<div style="text-align: left; margin-left: 33%">
+<ul class="no-enumerator" style="margin-left: -2.5em;">
+ <li><a href="#using-intro">Introduction</a></li>
+ <li><a href="#using-macros">How to input mom&#8217;s macros</a></li>
+ <li><a href="#viewing">Processing and viewing documents</a>
+ <ul>
+ <li class="item"><a href="#pdf">Mom and PDF</a></li>
+ <li class="item"><a href="#pdfmom">pdfmom</a></li>
+ </ul></li>
+ <li><a href="#previewing">Automatic previewing of documents</a></li>
+</ul>
+</div>
+
+<div class="rule-short" style="margin-top: 18px;"><hr/></div>
+
+<h2 id="using-intro" class="docs">Introduction</h2>
+
+<p>
+As explained in the section
+<a href="intro.html#top">What is mom?</a>,
+mom can be used in two ways: for straightforward typesetting or for
+document processing. The difference between the two is that in
+straightforward typesetting, every macro is a literal instruction
+that determines precisely how text following it will look. Document
+processing, on the other hand, uses markup tags (e.g. <kbd>.PP</kbd>
+for paragraphs, <kbd>.HEADING</kbd> for different levels of heads,
+<kbd>.FOOTNOTE</kbd> for footnotes, etc.) that perform typesetting
+operations automatically.
+</p>
+
+<p>
+You tell mom that you want to use the document processing macros
+with the
+<a href="docprocessing.html#start">START</a>
+macro. After START, mom determines the appearance of
+text following the markup tags automatically, although you, the
+user, can easily change how the tags are interpreted.
+</p>
+
+<h2 id="using-macros" class="docs">How to input mom&#8217;s macros</h2>
+
+<p>
+Regardless of whether you&#8217;re preparing a term paper or making a
+flyer for your lost dog, the following apply.
+</p>
+
+<ol style="margin-top: -.5em; margin-bottom: -.5em;">
+ <li>
+ You need a good text editor for inputting mom files.
+ <br/>
+ <span style="display: block; margin-top: .25em; margin-bottom: .5em;">
+ I cannot recommend highly enough that you use an editor that
+ lets you write syntax highlighting rules for mom&#8217;s
+ macros and
+ <a href="definitions.html#inlines">inline escapes</a>.
+ Simply colourizing macros and inlines to half-intensity can be
+ enough to make text stand out clearly from formatting commands.
+ Mom herself comes with a complete set of syntax highlighting
+ rules for the vim editor. A number of freely available editors
+ come with groff syntax highlighting rules, which are sufficient
+ for mom files, though not as colourful or complete as the vim
+ rules that ship with mom.
+ </span>
+ </li>
+ <li>
+ Macros begin with a period (dot) at the left margin of your text
+ editor&#8217;s screen, and must be entered in upper case (capital)
+ letters.
+ </li>
+ <li>
+ Macro
+ <a href="definitions.html#arguments">arguments</a>
+ 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.
+ </li>
+ <li>
+ Arguments to a macro must appear on the same line as the
+ macro.
+ <br/>
+ <span style="display: block; margin-top: .25em; margin-bottom: .5em;">
+ If the argument list is very long, you may use the
+ backslash character (<kbd>\</kbd>) to break the line visually.
+ From groff&#8217;s point of view, the backslash and newline are
+ invisible. Thus, for example,
+ <span class="pre" style="margin-bottom: -2.25em">
+ .HEADING_STYLE 1 FAMILY Garamond FONT B SIZE +2
+ </span>
+ and
+ <span class="pre" style="margin-bottom: -2.25em">
+ .HEADING_STYLE 1 \
+ FAMILY Garamond \
+ FONT B \
+ SIZE +2
+ </span>
+ </span>
+ are exactly equivalent.
+ </li>
+ <li>
+ Any argument (except a
+ <a href="definitions.html#stringargument">string argument</a>)
+ that is not a digit must be entered in upper case
+ (capital) letters.
+ </li>
+ <li>
+ 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. <kbd>+2</kbd>).
+ </li>
+ <li>
+ Any argument that requires a
+ <a href="definitions.html#unitofmeasure">unit of measure</a>
+ must have the unit appended directly to the argument, with no
+ intervening space (e.g. <kbd>.5i</kbd>).
+ </li>
+ <li>
+ <a href="definitions.html#stringargument">String arguments</a>,
+ in the sense of this manual, must be surrounded by double-quotes
+ (e.g. <kbd>"text"</kbd>). Multiple
+ string arguments are separated from each other by spaces (with
+ each argument surrounded by double-quotes).
+ <br/>
+ <span style="display: block; margin-top: .25em; margin-bottom: .5em;">
+ If a string argument becomes
+ uncomfortably long, you may break it into two or more lines
+ with the backslash character.
+ <span class="pre">
+ .SUBTITLE "An In-Depth Consideration of the \
+ Implications of Forty-Two as the Answer to Life, \
+ The Universe, and Everything"
+ </span>
+ </span>
+ </li>
+</ol>
+
+<div class="box-tip">
+<p class="tip">
+<span class="tip">Tip:</span>
+It&#8217;s important that your documents be easy to read and
+understand 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 comment line. In groff, that&#8217;s
+done with <kbd>\#</kbd> (backslash-pound) or <kbd>.\"</kbd>
+(period-backslash-doublequote) on a line by itself. Either
+instructs groff to ignore the remainder of the line, which may or
+may not contain text. Consider the following, which is a template
+for starting the chapter of a book.
+<br/>
+<span class="pre-in-pp">
+ \# Reference/meta-data
+ .TITLE "My Pulitzer Novel"
+ .AUTHOR "Joe Blow"
+ .CHAPTER 1
+ \# Template
+ .DOCTYPE CHAPTER
+ .PRINTSTYLE TYPESET
+ \# Type style
+ .FAM P
+ .PT_SIZE 10
+ .LS 12
+ \#
+ .START
+</span>
+You may also, if you wish, add a comment to the end of a line with
+<kbd>\"</kbd> (no period), like this:
+<br/>
+<span class="pre-in-pp">
+ .FAMILY P \" Maybe Garamond instead?
+</span>
+</p>
+</div>
+
+<h2 id="viewing" class="docs">Processing and viewing documents</h2>
+
+<p>
+The most basic command-line usage for processing a file formatted
+with the mom macros is
+<br/>
+<span class="pre-in-pp">
+ groff -mom filename.mom &gt; filename.ps
+</span>
+which processes the .mom file and dumps the output into a
+viewable/printable PostScript file.
+</p>
+
+<h3 id="pdf" class="docs">Mom and PDF</h3>
+
+<p>
+Adobe&#8217;s Portable Document Format (PDF) has largely supplanted
+PostScript, of which it is a subset, as the standard for typeset
+documents. While printed versions of documents in either format
+will be identical, PDF documents, when viewed at the screen, may
+also contain clickable links and a number of other special features.
+</p>
+
+<p>
+As of version 2.0, mom supports full PDF integration. The creation
+and processing of mom files into PostScript documents remains
+unchanged from 1.x, but the expected and recommended format of final
+documents is now PDF.
+</p>
+
+<p>
+The manual,
+<a href="http://www.schaffter.ca/mom/pdf/mom-pdf.pdf"><span class="book-title">Producing PDFs with groff and mom</span></a>,
+explains and demonstrates the PDF-specific macros that are available
+in mom, as well as the use of <strong>pdfmom</strong>, the
+recommended way to process mom files.
+</p>
+
+<h4 id="pdfmom" class="docs">pdfmom</h4>
+
+<p>
+Groff provides more than one way to generate PDF documents,
+but when processing files formatted with the mom macros,
+<strong>pdfmom</strong> is the recommended and most robust way to do
+it:
+<br/>
+<span class="pre-in-pp">
+ pdfmom filename.mom &gt; filename.pdf
+</span>
+<strong>pdfmom</strong> is a wrapper around groff, and accepts all
+groff&#8217;s command-line options as listed in the groff manpage.
+Full usage is explained in the manual,
+<a href="http://www.schaffter.ca/mom/pdf/mom-pdf.pdf"><span class="book-title">Producing PDFs with groff and mom</span></a>.
+</p>
+
+<p>
+PDF links in a document, including linked entries in the
+Table of Contents, are identified by colour. When printing
+documents with links, you will most likely not want the link
+text coloured. The groff option, <kbd>-c</kbd>, disables colour
+throughout a document; thus, when preparing a document for printing,
+you should use:
+<br/>
+<span class="pre-in-pp">
+ pdfmom -c filename.mom &gt; filename.pdf
+</span>
+<strong>pdfmom</strong> tends to produce large files. You may
+reduce their size by piping them through ps2pdf:
+<br/>
+<span class="pre-in-pp">
+ pdfmom -c filename.mom | ps2pdf - filename.pdf
+</span>
+Be aware, though, that files piped through ps2pdf will lose some pdf
+metadata, notably the document window title set with PDF_TITLE.
+</p>
+
+<h2 id="previewing" class="docs">Automatic previewing of documents</h2>
+
+<p>
+Most PDF viewers have a &#8220;Watch File&#8221; option, which
+automatically updates a displayed document whenever there&#8217;s
+a change. This is useful when preparing documents that require
+judgment calls. I recommend creating a keymapping in your
+text editor that both saves the mom file and processes it with
+<strong>pdfmom</strong>. The displayed PDF then automatically
+reflects whatever changes you save to the mom file.
+</p>
+
+<div class="rule-long"><hr/></div>
+
+<!-- Navigation links -->
+<table style="width: 100%; margin-top: 12px;">
+ <tr>
+ <td style="width: 33%;"><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="width: 33%; text-align: center;"><a href="#top">Top</a></td>
+ <td style="width: 33%; text-align: right;"><a href="typesetting.html#top">Next: The typesetting macros</a></td>
+</tr>
+</table>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/momdoc/version-2.html b/contrib/mom/momdoc/version-2.html
new file mode 100644
index 0000000..bd1cb8d
--- /dev/null
+++ b/contrib/mom/momdoc/version-2.html
@@ -0,0 +1,424 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+Written by Peter Schaffter (peter@schaffter.ca).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
+ <title>Mom -- Version 2.0 notes</title>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body style="background-color: #f5faff;">
+
+<!-- ==================================================================== -->
+
+<div id="top" class="page">
+
+<!-- Navigation links -->
+<table style="width: 100%;">
+<tr>
+ <td><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="text-align: right;"><a href="intro.html#top">Next: Introduction to mom</a></td>
+</tr>
+</table>
+
+<h1 class="docs">Version 2.0 notes</h1>
+
+<div style="width: 70%; margin: auto;">
+<ol style="margin-left: -1em;">
+ <li><a href="#prefatory">Prefatory comments</a></li>
+ <li><a href="#differences">Differences between 2.0 and 1.x</a>
+ <ul class="no-enumerator" style="padding-left: 0">
+ <li><a href="#pdf-support">2.1 PDF support</a>
+ <ul class="no-enumerator" style="padding-left: 1em">
+ <li><a href="#mom-pdf">2.1.1 The manual, <span class="book-title">Producing PDFs with groff and mom</span></a></li>
+ <li><a href="#pdf-image">2.1.2 PDF_IMAGE</a></li>
+ </ul></li>
+ <li><a href="#covers">2.2 Covers</a></li>
+ <li><a href="#headings">2.3 Headings</a></li>
+ <li><a href="#margin-notes">2.4 Margin notes</a></li>
+ <li><a href="#floats">2.5 Floats</a></li>
+ <li><a href="#table-of-contents">2.5 Tables of contents</a></li>
+ </ul></li>
+ <li><a href="#v2.1-changes">Version 2.1 changes</a></li>
+ <li><a href="#v2.2-changes">Version 2.2 changes</a></li>
+ <li><a href="#v2.5-changes">Version 2.5 changes</a></li>
+ <li><a href="#pdfmom">The <strong>pdfmom</strong> wrapper around groff</a></li>
+ <li><a href="#install-font">The <strong>install-font.sh</strong> script</a></li>
+</ol>
+</div>
+
+<div class="rule-medium"><hr/></div>
+
+<h2 id="prefatory" class="docs">1. Prefatory comments</h2>
+
+<p>
+Version 2.0 comes about as a result of Deri James&#8217;
+contribution of <strong>gropdf</strong> to <strong>groff</strong>,
+and his subsequent work integrating the device with
+<strong>mom</strong>.
+</p>
+
+<p>
+Whereas the 1.x releases were oriented toward PostScript output,
+2.0 focuses on PDF output, a bias reflected throughout this
+documentation. Users are strongly encouraged to process their files
+with
+<a href="#pdfmom"><strong>pdfmom</strong></a>,
+a wrapper around <strong>groff&nbsp;-Tpdf</strong>, in order to take
+full advantage of all PDF has to offer.
+</p>
+
+<p>
+While portions of mom have been rewritten, and new features
+introduced, 2.0 is backwardly compatible with 1.x releases. Changes
+are either transparent, or accompanied by notifications on stderr.
+</p>
+
+<p>
+The implementation of nested heads has been completely rethought,
+as has the manner of styling of them. There are no limits on
+how deep the nesting can go. The 1.x macros <kbd>HEAD</kbd>,
+<kbd>SUBHEAD</kbd>, and <kbd>SUBSUBHEAD</kbd> may still be used, but
+must be re-designed with the new <kbd>HEADING_STYLE</kbd> macro
+if their 1.x defaults are not desired.
+</p>
+
+<p>
+In conjunction with the changes to nested heads, Table of Contents
+generation has also been rethought. Greater flexibility in the
+inclusion of toc entry numbering been added. Like nested heads,
+there&#8217;s a new macro <kbd>TOC_ENTRY_STYLE</kbd> that permits
+styling of each level in the toc hierarchy separately. The default
+overall layout has also been significantly improved, achieving a
+level of typographical elegance formerly lacking. Best of all, the
+Table of Contents can now be repositioned to the correct spot at the
+top of a document from within the mom source file.
+</p>
+
+<p>
+When mom files are processed with <strong>pdfmom</strong>, a PDF
+outline for the Contents panel of PDF viewers is automatically
+generated. In addition, entries in the Table of Contents
+are clickable links when a document is viewed at the screen.
+<strong>pdfmom</strong> also permits setting a document&#8217;s
+papersize within the source file without the corresponding need for
+<kbd>-P-p&lt;papersize&gt;</kbd> on the command line.
+</p>
+
+<p>
+Lastly, while not strictly part of mom, a bash script,
+<strong>install-font.sh</strong>, has been posted at the
+<a href="https://www.schaffter.ca/mom/">mom site</a>.
+The script significantly eases the installation of new
+groff families and fonts, with conversion to .pfa
+and .t42 being performed by <strong>fontforge</strong>.
+</p>
+
+<h2 id="differences" class="docs">2. Differences between v2.0 and v1.x</h2>
+
+<h3 id="pdf-support" class="docs">2.1. PDF support</h3>
+
+<p>
+PDF support has been added, with features including the automatic
+generation of PDF outlines, embedding of images in PDF format (via
+the
+<a href="images.html#pdf-image">PDF_IMAGE</a>
+macro) and PDF linking (internal and external).
+</p>
+
+<h4 id="mom-pdf" class="docs">2.1.1. Producing PDFs with groff and mom</h4>
+
+<p>
+A manual in PDF format,
+<span class="book-title">Producing PDFs with groff and mom</span>,
+has been added to the documentation. The file,
+<strong>mom-pdf.pdf</strong> can be found in
+<br/>
+<span class="pre-in-pp">
+ /usr/local/share/doc/groff-&lt;version&gt;/pdf/
+</span>
+or
+<br/>
+<span class="pre-in-pp">
+ /usr/share/doc/groff-base/pdf/
+</span>
+or at
+<br/>
+<span class="pre-in-pp">
+ <a href="http://www.schaffter.ca/mom/momdoc/mom-pdf.pdf">http://www.schaffter.ca/mom/momdoc/mom-pdf.pdf</a>
+</span>
+PDF usage, and all associated macros except
+<a href="#pdf-image">PDF_IMAGE</a>,
+are fully explained in the manual, which should be considered an
+integral part of the present documentation. In addition, the mom
+source file for the manual can be found in
+<br/>
+<span class="pre-in-pp">
+ /usr/local/share/doc/groff-&lt;version&gt;/examples/mom
+</span>
+or
+<br/>
+<span class="pre-in-pp">
+ /usr/share/doc/groff-base/examples/mom/
+</span>
+and provides an excellent demonstration of mom usage.
+</p>
+
+<h4 id="pdf-image" class="docs">2.1.2. PDF_IMAGE</h4>
+
+<p>
+A new macro for embedding PDF images has been added,
+<a href="images.html#pdf-image">PDF_IMAGE</a>.
+</p>
+
+<p>
+PDF_IMAGE functions similarly to PSPIC and accepts the same
+arguments. Differences in implementation are that PDF_IMAGE
+requires the image dimensions (the bounding box) to be supplied.
+Instructions for getting the bounding box are included in the
+documentation entry for PDF_IMAGE. Two additional options,
+<kbd>SCALE</kbd> and <kbd>ADJUST</kbd>, allow scaling of the image
+and optical centering.
+</p>
+
+<h3 id="covers" class="docs">2.2. Covers</h3>
+
+<p>
+Arguments to
+<a href="cover.html#cover">COVER</a>
+and
+<a href="cover.html#doc-cover">DOC_COVER</a>
+may now be given in any order.
+</p>
+
+<h3 id="headings" class="docs">2.3. Headings</h3>
+
+<p>
+The 1.x macros HEAD, SUBHEAD, SUBSUBHEAD, are now deprecated and
+have been replaced by the single macro
+<a href="docelement.html#heading">HEADING <kbd>&lt;n&gt;</kbd></a>,
+where <kbd>&lt;n&gt;</kbd> is the heading level. The deprecated
+macros may still be used, and conform in style to their original
+defaults; they are, however, wrappers around HEADING levels 1
+&#8211; 3. Both the wrappers and HEADING itself can take a
+<kbd>NAMED&nbsp;&lt;id&gt;</kbd> argument, specifying a PDF link
+destination.
+</p>
+
+<p>
+Styling of headings is managed by the single macro <a
+href="docelement.html#heading">HEADING_STYLE &lt;n&gt;</a> where
+<kbd>&lt;n&gt;</kbd> conforms to a heading level. The control
+macros for HEAD, SUBHEAD and SUBSUBHEAD have been removed. Users
+wishing to style the wrappers must use HEADING_STYLE.
+</p>
+
+<p>
+PARAHEAD is no longer valid. Paragraph heads in 2.0 are created
+by passing the <kbd>PARAHEAD</kbd> argument to HEADING. Mom
+will abort with an informational message whenever she encounters
+<kbd>.PARAHEAD</kbd>.
+</p>
+
+<h3 id="margin-notes" class="docs">2.4. Margin notes</h3>
+
+<p>
+The macro for setting margin note parameters,
+<a href="docelement.html#mn-init">MN_INIT</a>,
+has been re-written such that each parameter now has the form
+<kbd>&lt;PARAMETER&gt; &lt;value&gt;</kbd>. This differs
+from 1.x where parameters were entered without a preceding
+<kbd>&lt;PARAMETER&gt;</kbd> flag. Parameters may be entered in any
+order. Any that are skipped are set to default values. Documents
+created with 1.x will have to have their <kbd>MN_INIT</kbd> updated
+accordingly.
+</p>
+
+<h3 id="floats" class="docs">2.5. Floats</h3>
+
+<p>
+A
+<a href="images.html#floats-intro">FLOAT</a>
+macro has been added, which functions similarly to the <kbd>ms</kbd>
+macros&#8217; <kbd>.KF/.KE</kbd>, i.e., the contents of the float are
+output immediately if there&#8217;s room on the page, otherwise
+normal text processing continues and the contents are output at the
+top of the next page. An <kbd>ADJUST</kbd> argument to FLOAT allows
+for optical centering.
+</p>
+
+<h3 id="table-of-contents" class="docs">2.6. Tables of contents</h3>
+
+<p>
+The default look of the Table of Contents has been overhauled to
+produce a more typographically pleasing result. All control macros
+for TOC title and entry styles have been removed, replaced by
+<a href="tables-of-contents.html#toc-title-style">TOC_TITLE_STYLE</a>
+and
+<a href="tables-of-contents.html#toc-title-style">TOC_ENTRY_STYLE <kbd>&lt;n&gt;</kbd></a>
+where <kbd>&lt;n&gt;</kbd> corresponds to a heading level. Both
+macros permit setting any or all of the style parameters for TOC
+titles (i.e. chapters or major sections/divisions of a collated
+document) and TOC entries (nested heading levels) at once.
+Documents created with 1.x that contain TOCs will need to have their
+TOC style updated if the new defaults are unsatisfactory.
+</p>
+
+<p>
+Two new TOC control macros have been added,
+<a href="tables-of-contents.html#space-toc-items">SPACE_TOC_ITEMS</a>
+and
+<a href="tables-of-contents.html#auto-relocate-toc">AUTO_RELOCATE_TOC</a>.
+SPACE_TOC_ITEMS groups TOC entry levels and separates them with a
+discrete amount of whitespace. This leads to improved legibility,
+and is highly recommended even though it is not mom&#8217;s
+default. AUTO_RELOCATE_TOC intelligently repositions the Table
+of Contents to the top of a document when the mom source file is
+processed with
+<a href="pdfmom">pdfmom</a>.
+</p>
+
+<h2 id="v2.1-changes" class="docs">3. Version 2.1 changes</h2>
+<p> Version 2.1 adds these features: </p> <ul style="margin-top: -.5em; width: 90%">
+ <li>expansion of cover, docheader, page header, and heading
+ control macros to permit caps, smallcaps, color, and
+ underscoring</li>
+ <li>the ability to style every element appearing in docheaders and
+ automatically-generated cover/title pages separately</li>
+ <li>macros to place images on cover/title pages</li>
+ <li>a new macro COVERTEXT that allows adding text (e.g. an
+ Abstract) to automatically-generated cover/title pages or to
+ create cover/title pages entirely by hand</li>
+ <li>separate indent control macros for QUOTES and BLOCKQUOTES</li>
+ <li>pseudo-smallcaps, including a control macro to choose the
+ size, weight, and width of the small caps</li>
+ <li>new &lt;element&gt;_STYLE macros that allow setting
+ parameters for &lt;element&gt; with a single macro using
+ keyword/value pairs</li>
+</ul>
+
+<p>
+The following changes have been made:
+</p>
+
+<ul style="margin-top: -.5em; width: 90%">
+ <li>MISC_AUTOLEAD (including COVER_MISC_AUTOLEAD and
+ DOC_COVER_MISC_AUTOLEAD) has been replaced in favour of MISC_LEAD,
+ which takes an absolute leading value rather than one derived
+ from the point size.</li>
+ <li>COVER_UNDERLINE and DOC_COVER_UNDERLINE have been
+ removed in favour of COVER_DOCTYPE_UNDERLINE and
+ DOC_COVER_DOCTYPE_UNDERLINE.</li>
+ <li>DOCTYPE NAMED <kbd>&lt;string&gt;</kbd> no longer accepts a
+ <kbd>color</kbd> argument; setting the colour for
+ <kbd>&lt;string&gt;</kbd> is accomplished with DOCTYPE_COLOR
+ <kbd>&lt;color&gt;</kbd>. In addition, the string now has a
+ complete set of control macros.</li>
+ <li>Default underscoring of the DOCTYPE NAMED string has been
+ removed, both in the docheader and on cover/title pages.</li>
+ <li>No cover/title page data persists, however formatting for the
+ elements on them does.</li>
+</ul>
+
+<h2 id="v2.2-changes" class="docs">4. Version 2.2 changes</h2>
+
+<p>
+Version 2.2 adds these features:
+</p>
+<ul style="margin-top: -.5em; width: 90%">
+ <li>flex-spacing, an alternative to mom&#8217;s default shimming
+ policy; flex-spacing balances vertical whitespace on the page by
+ distributing any excess equally at sensible points so that running
+ text always fills the page to the bottom margin (see
+ <a href="docprocessing.html#vertical-whitespace-management">
+ vertical whitespace management</a>)
+ </li>
+ <li>improvements to auto-labelling, such that it is now possible
+ to link symbolically to auto-labelled preprocessor material and
+ PDF images (note that you must be running groff 1.22.4 or higher
+ for this feature)
+ </li>
+</ul>
+
+<h2 id="v2.5-changes" class="docs">5. Version 2.5 changes</h2>
+
+<p>
+Version 2.5 adds shaded backgrounds and frames that span pages
+appropriately when necessary, and a macro to set page or slide
+background colour.
+</p>
+
+<h2 id="pdfmom" class="docs">6. pdfmom</h2>
+
+<p>
+Deri James has provided <strong>pdfmom</strong>, a wrapper around
+groff that processes mom source files with all the PDF bells and
+whistles. Its use is highly recommended. Usage is explained in the
+manual,
+<a href="http://www.schaffter.ca/mom/pdf/mom-pdf.pdf">
+ <span class="book-title">Producing PDFs with groff and mom</span>
+</a>.
+A significant convenience of pdfmom is that it can, with the
+<kbd>-Tps</kbd> flag, be used to pass processing over to Keith
+Marshall&#8217;s <strong>pdfroff</strong>. This is useful when
+processing files that contain PostScript images embedded with
+<a href="images.html#pspic">PSPIC</a>.
+pdfmom, without the flag, uses groff&#8217;s PDF device
+(<strong>gropdf</strong>), which only recognizes PDF images that
+have been embedded with
+<a href="images.html#pdf-image">PDF_IMAGE</a>.
+</p>
+
+<h2 id="install-font" class="docs">7. install-font.sh</h2>
+
+<p>
+A bash script, <strong>install-font.sh</strong>, has been posted at the
+<a href="http://www.schaffter.ca/mom/mom-01.html">mom site</a>.
+There&#8217;s nothing mom-specific about the script, and it is not
+an official part of groff.
+</p>
+
+<p>
+Installing groff fonts is a multi-step procedure, which, while not
+difficult, can be a nuisance. install-font.sh takes
+care of all the details, including converting fonts to formats
+acceptable to <strong>grops</strong> and <strong>gropdf</strong>,
+creating and installing the groff fonts in the appropriate
+directories, updating the download files, and installing the
+original fonts in a system-wide directory, if desired.
+</p>
+
+<div class="rule-long"><hr/></div>
+
+<!-- Navigation links -->
+<table style="width: 100%; margin-top: 12px;">
+<tr>
+ <td style="width: 33%;"><a href="toc.html">Back to Table of Contents</a></td>
+ <td style="width: 20%; text-align: center;"><a href="#top">Top</a></td>
+ <td style="width: 46%; text-align: right;"><a href="intro.html">Next: Introduction to mom</a></td>
+</tr>
+</table>
+
+</div>
+
+<div class="bottom-spacer"><br/></div>
+
+</body>
+</html>
diff --git a/contrib/mom/om.tmac b/contrib/mom/om.tmac
new file mode 100644
index 0000000..adb7508
--- /dev/null
+++ b/contrib/mom/om.tmac
@@ -0,0 +1,24571 @@
+.ig
+Mom -- a typesetting/document-processing macro set for groff.
+
+Copyright (C) 2002-2020 Free Software Foundation, Inc.
+ Written by Peter Schaffter <peter@schaffter.ca>
+ PDF integration contributed by Deri James <deri.james@chuzzlewit.co.uk>
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+Version 2.5_d
+-------------
+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." Version 2.0 removed some of the redundancies
+and cruft, but mom still needs some nip and tuck.
+
+"<anything>" in the description of arguments that can be passed
+to a macro means that any argument turns the feature off.
+
+Thanks to everyone who has contributed suggestions and patches,
+and to those whose GPL'd work has been plundered. Special thanks
+to Werner Lemberg (margin notes), Tadziu Hoffman (underlining),
+Deri James (pdf integration), Robin Haberkorn (tbl integration, eqn
+extensions, and float management).
+..
+\#
+\# ====================================================================
+\#
+.if \n(.C \
+. ab [mom]: The groff mom macros do not work in compatibility mode.
+\# Check that GNU troff is being run
+.if !\n[.g]=1 \
+. ab [mom]: The mom macros require that you be running GNU troff.
+\# Check which version of groff is being run
+.if (\n[.x]\n[.y] < 118) \
+. ab [mom]: You need GNU troff version 1.18 or higher to run this version of mom.
+\# Mom version
+.ds version 2.5_d
+.if dVERSION \{\
+. ab [mom]: Version \*[version]
+.\}
+\# Groff revision
+.ds short_revision \n[.Y]
+.substring short_revision 0 0
+\#
+\# Add supplementary styles
+.sty \n[.fp] UL \" Ultra Light
+.sty \n[.fp] ULI \" Ultra Light Italic
+.sty \n[.fp] ULCD \" Ultra Light Condensed
+.sty \n[.fp] ULCDI \" Ultra Light Condensed Italic
+.sty \n[.fp] ULEX \" Ultra Light Extended
+.sty \n[.fp] ULEXI \" Ultra Light Extended Italic
+\#
+.sty \n[.fp] XL \" Extra Light
+.sty \n[.fp] XLI \" Extra Light Italic
+.sty \n[.fp] XLCD \" Extra Light Condensed
+.sty \n[.fp] XLCDI \" Extra Light Condensed Italic
+.sty \n[.fp] XLEX \" Extra Light Extended
+.sty \n[.fp] XLEXI \" Extra Light Extended Italic
+\#
+.sty \n[.fp] TH \" Thin
+.sty \n[.fp] THI \" Thin Italic
+.sty \n[.fp] THCD \" Thin Condensed
+.sty \n[.fp] THCDI \" Thin Condensed Italic
+.sty \n[.fp] THEX \" Thin Extended
+.sty \n[.fp] THEXI \" Thin Extended Italic
+\#
+.sty \n[.fp] L \" Light Roman
+.sty \n[.fp] LI \" Light Italic
+.sty \n[.fp] LCD \" Light Condensed
+.sty \n[.fp] LCDI \" Light Condensed Italic
+.sty \n[.fp] LEX \" Light Extended
+.sty \n[.fp] LEXI \" Light Extended Italic
+\#
+.sty \n[.fp] BK \" Book Roman
+.sty \n[.fp] BKI \" Book Italic
+.sty \n[.fp] BKCD \" Book Condensed
+.sty \n[.fp] BKCDI \" Book Condensed Italic
+.sty \n[.fp] BKEX \" Book Extended
+.sty \n[.fp] BKEXI \" Book Extended Italic
+\#
+.sty \n[.fp] CD \" Medium Condensed
+.sty \n[.fp] CDI \" Medium Condensed Italic
+.sty \n[.fp] EX \" Medium Extended
+.sty \n[.fp] EXI \" Medium Extended Italic
+\#
+.sty \n[.fp] DB \" DemiBold Roman
+.sty \n[.fp] DBI \" DemiBold Italic
+.sty \n[.fp] DBCD \" DemiBold Condensed
+.sty \n[.fp] DBCDI \" DemiBold Condensed Italic
+.sty \n[.fp] DBEX \" DemiBold Extended
+.sty \n[.fp] DBEXI \" DemiBold Extended Italic
+\#
+.sty \n[.fp] SB \" SemiBold Roman
+.sty \n[.fp] SBI \" SemiBold Italic
+.sty \n[.fp] SBCD \" SemiBold Condensed
+.sty \n[.fp] SBCDI \" SemiBold Condensed Italic
+.sty \n[.fp] SBEX \" SemiBold Extended
+.sty \n[.fp] SBEXI \" SemiBold Extended Italic
+\#
+.sty \n[.fp] BCD \" Bold Condensed
+.sty \n[.fp] BCDI \" Bold Condensed Italic
+.sty \n[.fp] BEX \" Bold Extended
+.sty \n[.fp] BEXI \" Bold Extended Italic
+.sty \n[.fp] BO \" Bold Outline
+\#
+.sty \n[.fp] XB \" Extra Bold
+.sty \n[.fp] XBI \" Extra Bold Italic
+.sty \n[.fp] XBCD \" Extra Bold Condensed
+.sty \n[.fp] XBCDI \" Extra Bold Condensed Italic
+.sty \n[.fp] XBEX \" Extra Bold Extended
+.sty \n[.fp] XBEXI \" Extra Bold Extended Italic
+\#
+.sty \n[.fp] UB \" Ultra Bold
+.sty \n[.fp] UBI \" Ultra Bold Italic
+.sty \n[.fp] UBCD \" Ultra Bold Condensed
+.sty \n[.fp] UBCDI \" Ultra Bold Condensed Italic
+.sty \n[.fp] UBEX \" Ultra Bold Extended
+.sty \n[.fp] UBEXI \" Ultra Bold Extended Italic
+\#
+.sty \n[.fp] HV \" Heavy
+.sty \n[.fp] HVI \" Heavy Italic
+.sty \n[.fp] HVCD \" Heavy Condensed
+.sty \n[.fp] HVCDI \" Heavy Condensed Italic
+.sty \n[.fp] HVEX \" Heavy Extended
+.sty \n[.fp] HVEXI \" Heavy Extended Italic
+\#
+.sty \n[.fp] BL \" Black
+.sty \n[.fp] BLI \" Black Italic
+.sty \n[.fp] BLCD \" Black Condensed
+.sty \n[.fp] BLCDI \" Black Condensed Italic
+.sty \n[.fp] BLEX \" Black Extended
+.sty \n[.fp] BLEXI \" Black Extended Italic
+.sty \n[.fp] BLO \" Black Outline
+\#
+.sty \n[.fp] XBL \" Extra Black
+.sty \n[.fp] XBLI \" Extra Black Italic
+.sty \n[.fp] XBLCD \" Extra Black
+.sty \n[.fp] XBLCDI \" Extra Black
+.sty \n[.fp] XBLEX \" Extra Black Italic
+.sty \n[.fp] XBLEXI \" Extra Black Italic
+\#
+.sty \n[.fp] UBL \" Ultra Black
+.sty \n[.fp] UBLI \" Ultra Black Italic
+.sty \n[.fp] UBLCD \" Ultra Black Condensed
+.sty \n[.fp] UBLCDI \" Ultra Black Condensed Italic
+.sty \n[.fp] UBLEX \" Ultra Black Extended
+.sty \n[.fp] UBLEXI \" Ultra Black Extended Italic
+\#
+.sty \n[.fp] SC \" Small Caps Roman
+.sty \n[.fp] SCI \" Small Caps Italic
+.sty \n[.fp] SCDB \" Small Caps Demibold
+.sty \n[.fp] SCDBI \" Small Caps Demibold Italic
+.sty \n[.fp] SCSB \" Small Caps Semibold
+.sty \n[.fp] SCSBI \" Small Caps Semibold Italic
+\#
+\# Instruct grops to use square linecaps and joins.
+\# This instruction is also executed in DO_B_MARGIN, NEWPAGE, and HEADER
+\#
+.if !n \X'ps: exec 0 setlinejoin'\X'ps: exec 0 setlinecap'
+\#
+\# The following PostScript, provided by Tadziu Hoffmann, permits
+\# no-fail underlining
+\#
+.de ul*ps
+ps: def
+grops begin
+/decornone { grops begin /X { } def /Y { } def /y2 -1 def end } def
+/decorline { grops begin u neg /uld exch def u /ulw exch def
+ /X { currentpoint /y0 exch def /x0 exch def } def
+ /Y { currentpoint /y1 exch def /x1 exch def
+ drawline /x2 x1 def /y2 y1 def } def end } def
+/drawline { gsave ulw setlinewidth 0 setlinecap x1 y1 uld sub moveto
+ y2 y0 eq { x2 y2 } { x0 y0 } ifelse uld sub lineto stroke
+ grestore } def
+decornone
+/uld 0 def
+/ulw 0 def
+/A { X show Y } def
+/B { 0 SC 3 -1 roll X widthshow Y } def
+/C { 0 exch X ashow Y } def
+/D { 0 exch 0 SC 5 2 roll X awidthshow Y } def
+/E { 0 rmoveto X show Y } def
+/F { 0 rmoveto 0 SC 3 -1 roll X widthshow Y } def
+/G { 0 rmoveto 0 exch X ashow Y } def
+/H { 0 rmoveto 0 exch 0 SC 5 2 roll X awidthshow Y } def
+/I { 0 exch rmoveto X show Y } def
+/J { 0 exch rmoveto 0 SC 3 -1 roll X widthshow Y } def
+/K { 0 exch rmoveto 0 exch X ashow Y } def
+/L { 0 exch rmoveto 0 exch 0 SC 5 2 roll X awidthshow Y } def
+/M { rmoveto X show Y } def
+/N { rmoveto 0 SC 3 -1 roll X widthshow Y } def
+/O { rmoveto 0 exch X ashow Y } def
+/P { rmoveto 0 exch 0 SC 5 2 roll X awidthshow Y } def
+/Q { moveto X show Y } def
+/R { moveto 0 SC 3 -1 roll X widthshow Y } def
+/S { moveto 0 exch X ashow Y } def
+/T { moveto 0 exch 0 SC 5 2 roll X awidthshow Y } def
+end
+..
+\#
+.if !n \Y[ul*ps]
+.if n .color 0
+.nr TOC.RELOCATE 0 \" TOC.RELOCATE is off by default
+.ds PDFHREF.TEXTCOL.DEFAULT 0.0 0.3 0.9
+.nr PDFHREF.VIEW.LEADING.C 3i
+.nr PDFHREF.VIEW.LEADING.T 1i
+.nr PDFHREF.VIEW.LEADING 0
+.nr PDFHREF.VIEW.LEADING.H \n[PDFHREF.VIEW.LEADING]
+\#
+\# ====================================================================
+\#
+\# 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 SPREAD brp
+.ALIAS ESC_CHAR ec
+.ALIAS STRING ds
+.ALIAS INCLUDE so
+\#
+\# 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
+.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
+\#
+\# 'END' is used throughout as the 2nd arg to 'MAC' (alias of .de)
+\# Defining it as a macro here prevents groff from complaining
+\# that 'END' isn't defined.
+\#
+.de END
+..
+\#
+\# ====================================================================
+\#
+\# +++PAGE LAYOUT+++
+\#
+\# Macros that control the physical layout of the page: paper size
+\# and margins.
+\#
+\# PAGE WIDTH
+\# ----------
+\# *Argument:
+\# <width of printer sheet>
+\# *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
+. if '\\*[.T]'pdf' \X'papersize=\\n[#PAGE_WIDTH]z,\\n[#PAGE_LENGTH]z'\c
+.END
+\#
+\# L_MARGIN
+\# --------
+\# *Argument:
+\# <offset from page left>
+\# *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:
+\# <width of right margin>
+\# *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[.l]u
+. nr #L_LENGTH \\n[.l]
+.END
+\#
+\# T_MARGIN
+\# --------
+\# *Argument:
+\# <distance to advance from top of page>
+\# *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)
+. if !\\n[#DOCS] .sp |\\n[#T_MARGIN]u-1v
+. wh 0i DO_T_MARGIN
+.END
+\#
+\# B_MARGIN
+\# --------
+\# *Argument:
+\# <space to leave at the bottom of the page>
+\# *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:
+\# <pagewidth> [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
+\#
+\# gropdf: pass pagelength to postprocessor; no need for -P-p
+\#
+.MAC PAGELENGTH END
+. pl \\$*
+. if '\\*[.T]'pdf' \X'papersize=\\n[#PAGE_WIDTH]z,\\n[#PAGE_LENGTH]z'\c
+.END
+\#
+\# =====================================================================
+\#
+\# +++PAGE CONTROL+++
+\#
+\# Generic macros for breaking pages.
+\#
+\# DO_T_MARGIN
+\# -----------
+\# *Argument:
+\# <none>
+\# *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
+. sp |\\n[#T_MARGIN]u-1v
+. ev
+.END
+\#
+\# DO_B_MARGIN
+\# -----------
+\# *Argument:
+\# <none>
+\# *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
+. if !n .nop \X'ps: exec 0 setlinejoin'\X'ps: exec 0 setlinecap'
+. ie \\n[#DOCS] \
+. if !\\n[#NEWPAGE] .bp
+. el .bp
+. ev
+.END
+\#
+\# NEWPAGE
+\# -------
+\# *Argument:
+\# <none>
+\# *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
+. if \\n[#DOC_TYPE]=5 \{\
+. if \\n[#NUM_ARGS]>0 \
+. pdftransition PAGE \\$1
+. \}
+. if !\\n[defer] \{\
+. nr #NEWPAGE 1
+. rr tbl*no-print-header
+. \}
+. ie !\\n[#DOCS]=1 \
+. if \\n[#B_MARGIN_SET]=1 .DO_B_MARGIN
+. el \{\
+. if (\\n[#COLUMNS]=1):(\\n[#COLUMNS]=2) .nr #COL_NUM \\n[#NUM_COLS]
+. if !\\n[#FN_DEPTH] \{\
+. ch FN_OVERFLOW_TRAP
+. nr #RESET_FN_OVERFLOW_TRAP 1
+. \}
+. \}
+. if dPDF.EXPORT \
+. if \\n[#FLEX_ACTIVE] \
+. if !\\n[#NO_FLEX] \
+. tm .ds pre-newpage-\\n% \\n%@\\n[#COL_NUM]
+. ie \\n[#DOCS]=1 \{\
+. if (\\n[@TOP]=0):(\\n[#END_COVER]=1) .bp
+. rr #END_COVER
+. if \\n[#RESET_FN_OVERFLOW_TRAP] \{\
+. wh -\\n[#FN_OVERFLOW_TRAP_POS]u FN_OVERFLOW_TRAP
+. rr #RESET_FN_OVERFLOW_TRAP_POS
+. \}
+. \}
+. el .if !\\n[#B_MARGIN_SET]=1 .bp
+.END
+\#
+.ALIAS NEWSLIDE NEWPAGE
+\#
+\# =====================================================================
+\#
+\# +++GENERAL STYLE MACROS+++
+\#
+\# LINE LENGTH
+\# -----------
+\# *Argument:
+\# <line length>
+\# *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[.l]u
+.END
+\#
+\# +++FAMILY AND FONT+++
+\#
+\# FALLBACK FONT
+\# -------------
+\# *Argument:
+\# <fallback font> [ 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:
+\# <font family>
+\# *Function:
+\# Stores user supplied font family in string $FAMILY. Sets .fam
+\# to $FAMILY.
+\#
+.MAC FAMILY END
+. if '\\n[.ev]'COVER_TEXT' .ds $SAVED_DOC_FAM \\n[.fam]
+. if \\n[#COLLATE] .rm $SAVED_DOC_FAM
+. ds $FAMILY \\$1
+. if \\n[#PRINT_STYLE]=1 \{\
+. fam \\*[$TYPEWRITER_FAM]
+. return
+. \}
+. if \\n[#IGNORE] \{\
+. fam \\*[$TYPEWRITER_FAM]
+. return
+. \}
+. if (\\n[.x]\\n[.y]\\*[short_revision] >= 1192) .ds $SAVED_STYLE \\n[.sty]
+. ft 0
+. fam \\*[$FAMILY]
+. if (\\n[.x]\\n[.y]\\*[short_revision] >= 1192) \{\
+. ft \\*[$SAVED_STYLE]
+. if !F\\n[.fn] .ft 0
+. \}
+. ie \\n[#PRE_COLLATE]=1 .
+. el \{\
+. if \\n[#COLLATE]=1 \
+. if !r#START .ds $DOC_FAM \\*[$FAMILY]
+. \}
+.END
+\#
+\# FONT
+\# ----
+\# *Argument:
+\# R | I | B | BI | <other style extension>
+\# *Function:
+\# Stores user supplied font in $FONT and sets .ft to $FONT.
+\#
+.MAC FT END
+. ds $FONT \\$1
+. 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
+. \}
+. ft 0
+. ft \\*[$FONT]
+. if (\\n[.x]\\n[.y]\\*[short_revision] >= 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 [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. \}
+. 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.
+. ie \\n[#ABORT_FT_ERRORS]=0 \
+. tm1 " Continuing to process using fallback font.
+. el .ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. \}
+. \}
+. \}
+. \}
+.END
+\#
+\# POINT SIZE
+\# ----------
+\# *Arguments:
+\# <point size of type>
+\# *Function:
+\# Sets point size to user supplied value in scaled points.
+\# If #AUTO_LEAD is on, resets lead accordingly.
+\# *Notes:
+\# Must NOT use a unit of measure.
+\#
+.MAC PT_SIZE END
+. if \\n[#PRINT_STYLE]=1 .return
+. if \\n[#IGNORE] .return
+. ps \\$1
+. nr #PT_SIZE_IN_UNITS \\n[.ps]
+. ie '\\$0'DOC_PT_SIZE' \{\
+. if !\\n[#DOCS] .DOC_MACRO_ERROR \\$0
+. br
+. nr #NEW_DOC_PT_SIZE \\n[.ps]
+. if \\n[#DOC_AUTOLEAD] \{\
+. ie !\\n[#DOC_AUTOLEAD_FACTOR] .nr #AUTOLEADING \\n[#DOC_AUTOLEAD]
+. el .nr #AUTOLEADING \\n[.ps]*\\n[#DOC_AUTOLEAD]/1000-\\n[.ps]
+. nr #DOC_LEAD \\n[.ps]+\\n[#AUTOLEADING]
+. nr #RESET_TRAPS 1
+. \}
+. \}
+. el \{\
+. if \\n[#AUTO_LEAD] \{\
+. nr #SAVED_VS \\n[.v]
+. vs \\n[.ps]u+\\n[#AUTOLEADING]u
+. \}
+. \}
+. if \\n[pdfbx-running]=1 \{\
+. nr #VS_DIFF \\n[#SAVED_VS]-\\n[.v]
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u+\\n[#VS_DIFF]u
+. \}
+.END
+\#
+\# SIZE (inline)
+\# -------------
+\# *Arguments:
+\# <point size of type>
+\# *Function:
+\# Sets point size to user supplied value in scaled points.
+\# Intended to be called inline with \*[SIZE <n><unit>]
+\# *Notes:
+\# Can be used with a unit of measure or not.
+\#
+.MAC SIZE END
+\c
+.ps \\$1
+.END
+\#
+\# LEADING
+\# -------
+\# *Argument:
+\# <leading between lines of text>
+\# *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
+. if \\n[#PRINT_STYLE]=1 .return
+. if \\n[#IGNORE] .return
+. if \\n[#AUTO_LEAD] \{\
+. rr #AUTO_LEAD
+. rr #AUTOLEAD_VALUE
+. rr #AUTOLEADING
+. \}
+. nr #SAVED_VS \\n[.v]
+. vs \\$1
+. if \\n[pdfbx-running]=1 \{\
+. nr #VS_DIFF \\n[#SAVED_VS]-\\n[.v]
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u+\\n[#VS_DIFF]u
+. \}
+. if !\\n[#START] \
+. if \\n[.t]<\\n[.v] 'bp
+.END
+\#
+\# AUTOLEAD
+\# --------
+\# *Argument:
+\# <leading value to add to #PT_SIZE> [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/1000 instead of the two being added
+\# together.
+\#
+.MAC AUTOLEAD END
+. if \\n[#PRINT_STYLE]=1 .return
+. if \\n[#IGNORE] .return
+. nr #AUTO_LEAD 1 \" autolead on or off
+. nr #AUTOLEAD_VALUE (p;\\$1) \" arg x 1000
+. ie '\\$2'FACTOR' \{\
+. if !\\n[#DOCS] .nr #DOC_AUTOLEAD_FACTOR \\n[#AUTOLEAD_VALUE] \" save for DOC_PT_SIZE
+. nr #AUTOLEADING \\n[.ps]*\\n[#AUTOLEAD_VALUE]/1000-\\n[.ps]
+. \}
+. el .nr #AUTOLEADING \\n[#AUTOLEAD_VALUE]
+. vs \\n[.ps]u+\\n[#AUTOLEADING]u
+.END
+\#
+\# STRINGS FOR INLINE CONTROL OF GENERAL TYPE STYLE
+\# ------------------------------------------------
+.ds ROM \Ef[R]
+.ds IT \Ef[I]
+.ds BD \Ef[B]
+.ds BDI \Ef[BI]
+.ds PREV \Ef[]
+.ds S \Es
+\#
+\# =====================================================================
+\#
+\# +++KERNING+++
+\#
+\# AUTOMATIC PAIRWISE KERNING
+\# --------------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Turns automatic pairwise kerning on or off.
+\#
+.MAC KERN END
+. ie '\\$1'' \{\
+. kern
+. nr #KERN 1
+. \}
+. el \{\
+. kern 0
+. nr #KERN 0
+. \}
+.END
+\#
+\# INLINE KERNING AND HORIZONTAL MOVEMENT
+\# --------------------------------------
+\#
+\# Inline kerning provides a simple way to adjust the amount of
+\# space between any two letters. It's predicated on a unit of
+\# measure "U", which, by default, 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.
+\#
+\# The default value for U may be changed or reset with the
+\# KERN_UNIT macro.
+\#
+.MAC KERN_UNIT END
+. ie '\\$1'DEFAULT' .ds $KERN_UNIT 36
+. el .ds $KERN_UNIT \\$1
+.END
+\#
+.ds $KERN_UNIT 36
+.ds BU \h'-(\En[.ps]u/\E*[$KERN_UNIT]u*\\$1u)'
+.ds FU \h'(\En[.ps]u/\E*[$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[.ps]u/\E*[$KERN_UNIT]u*\n[#LOOP]u)'
+. ds FU\n[#LOOP] \h'(\En[.ps]u/\E*[$KERN_UNIT]u*\n[#LOOP]u)'
+.\}
+\#
+\# Horizontal movements
+\# --------------------
+\# BP1...12.75 and FP1...12.75 move backwards or forwards inline by the
+\# specified number of points.
+\#
+.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 (TRACK) KERNING
+\# --------------------------
+\# *Argument:
+\# <amount of track kerning>
+\# *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.
+\#
+\# A value of 1 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.
+\#
+\# \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
+. \}
+. rr #EW
+. rm $EW
+. nr #RW 1
+. ds $RW \\$1
+. tkf \\n[.f] 1 -\\$1 1 -\\$1
+.END
+\#
+.MAC EW END
+. if \\n[#BR_AT_LINE_KERN] \{\
+. ie \\n[#JUSTIFY]=1 .brp
+. el .br
+. \}
+. rr #RW
+. rm $RW
+. nr #EW 1
+. ds $EW \\$1
+. 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_AT_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:
+\# <none> | <anything> | DEFAULT
+\# or
+\# LINES <n> | MARGIN <n> | SPACE <n>
+\# *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 <n> sets the number of allowable consecutive hyphenated lines.
+\#
+\# HY MARGIN <n> 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
+. if \\n[#LINES] .hlm \\n[#LINES]
+. if \\n[#MARGIN] .hym \\n[#MARGIN]]
+. if \\n[#SPACE] .hys \\n[#SPACE]
+. 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
+. nr #HY_LINES \\$2
+. \}
+. if '\\$1'MARGIN' \{\
+. hym \\$2
+. nr #HY_MARGIN \\$2
+. \}
+. if '\\$1'SPACE' \{\
+. hys \\$2
+. nr #HY_SPACE \\$2
+. \}
+. if '\\$1'DEFAULT' \{\
+. hlm -1
+. hym 0
+. hys 0
+. rr #HY_LINES
+. rr #HY_SPACE
+. rr #HY_MARGIN
+. \}
+. \}
+.END
+\#
+\# HYPHENATION PARAMETERS
+\# ----------------------
+\# *Arguments:
+\# <# of lines> | <size of margin> | <amount of interword space>
+\# *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:
+\# <user supplied lead to advance below current baseline>
+\# *Function:
+\# Creates or modifies register #ALD. Adds user supplied lead
+\# below current baseline.
+\# *Notes:
+\# Requires a unit of measure.
+\#
+.MAC ALD END
+. if '\\$0'ALD' \{\
+. nr #ALD (u;\\$1)
+. sp \\n[#ALD]u
+. \}
+. if '\\$0'ADD_SPACE' \{\
+. vpt 0
+. nr #ALD \\$1
+. rs
+. nop \&
+. br
+. sp |\\n[#T_MARGIN]u-1v+\\n[#ALD]u
+. rr @TOP
+. nr #SPACE_ADDED 1
+. vpt
+. \}
+. if '\\$0'SPACE' .sp \\$1
+. if '\\$0'SP' .sp \\$1
+.END
+\#
+\# REVERSE LEAD
+\# ------------
+\# *Argument:
+\# <user supplied lead to reverse above current baseline>
+\# *Function:
+\# Creates or modifies register #RLD. Reverses user supplied
+\# lead above current baseline.
+\# *Notes:
+\# Requires a unit of measure.
+\#
+.MAC RLD END
+. br
+. nr #RLD (u;\\$1)
+. sp -\\n[#RLD]u
+.END
+\#
+\# ALD/RLD STRINGS
+\# ---------------
+\# 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 preferred methods
+\# of advancing and reversing on the page inline are \*[UP <n><unit>]
+\# and \*[DOWN <n><unit>].
+\#
+.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:
+\# <none> | <anything>
+\# *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:
+\# [ ,, ] | [ << ] | [ >> ] | <anything>
+\# or
+\# [ DA | DE | EN | ES | FR | IT | NL | NO | PT | SV ] | <anything>
+\# *Function:
+\# Turns smartquotes on (optionally with a quoting style from the
+\# argument list, or off).
+\# If no quoting style is given, then EN (English) is used by default.
+\# If no quoting style is given and smart quotes have been turned off
+\# previously, the old quoting style will be restored.
+\# *Notes:
+\# The " character is read outside the macro when mom is
+\# processed. The strings for open/close ($QUOTE<n>) are then
+\# defined in the macro.
+\#
+.char " \\*[$QUOTE\\n[#OPEN_CLOSE]]\R'#OPEN_CLOSE (1-\\n[#OPEN_CLOSE])'
+.nr #SQ_ON 0
+\#
+.MAC SMARTQUOTES END
+.\" First " will be translated to $QUOTE0
+. nr #OPEN_CLOSE 0
+. if '\\$1'' \{\
+. if !'\\*[$RESTORE_SQ]'' \{\
+. SMARTQUOTES \\*[$RESTORE_SQ]
+. return
+. \}
+.\" Default smart quotes (English)
+. ds $QUOTE0 \[lq]
+. ds $QUOTE1 \[rq]
+. ds $RESTORE_SQ EN
+. nr #SQ_ON 1
+. return
+. \}
+. if '\\$1',,' \{\
+. ds $QUOTE0 \[Bq]
+. ds $QUOTE1 \[lq]
+. ds $RESTORE_SQ \\$1
+. nr #SQ_ON 1
+. return
+. \}
+. if '\\$1'<<' \{\
+. ds $QUOTE0 \[Fo]
+. ds $QUOTE1 \[Fc]
+. ds $RESTORE_SQ \\$1
+. nr #SQ_ON 1
+. return
+. \}
+. if '\\$1'>>' \{\
+. ds $QUOTE0 \[Fc]
+. ds $QUOTE1 \[Fo]
+. ds $RESTORE_SQ \\$1
+. nr #SQ_ON 1
+. return
+. \}
+. if '\\$1'DA' \{\
+. ds $QUOTE0 \[Fc]
+. ds $QUOTE1 \[Fo]
+. ds $RESTORE_SQ \\$1
+. nr #SQ_ON 1
+. return
+. \}
+. if '\\$1'DE' \{\
+. ds $QUOTE0 \[Bq]
+. ds $QUOTE1 \[lq]
+. ds $RESTORE_SQ \\$1
+. nr #SQ_ON 1
+. return
+. \}
+. if '\\$1'EN' \{\
+. ds $QUOTE0 \[lq]
+. ds $QUOTE1 \[rq]
+. ds $RESTORE_SQ \\$1
+. nr #SQ_ON 1
+. return
+. \}
+. if '\\$1'ES' \{\
+. ds $QUOTE0 \[lq]
+. ds $QUOTE1 \[rq]
+. ds $RESTORE_SQ \\$1
+. nr #SQ_ON 1
+. return
+. \}
+. if '\\$1'FR' \{\
+. ds $QUOTE0 \[Fo]\|
+. ds $QUOTE1 \|\[Fc]
+. ds $RESTORE_SQ \\$1
+. nr #SQ_ON 1
+. return
+. \}
+. if '\\$1'IT' \{\
+. ds $QUOTE0 \[Fo]\|
+. ds $QUOTE1 \|\[Fc]
+. ds $RESTORE_SQ \\$1
+. nr #SQ_ON 1
+. return
+. \}
+. if '\\$1'NL' \{\
+. ds $QUOTE0 \[rq]
+. ds $QUOTE1 \[rq]
+. ds $RESTORE_SQ \\$1
+. nr #SQ_ON 1
+. return
+. \}
+. if '\\$1'NO' \{\
+. ds $QUOTE0 \[Fo]
+. ds $QUOTE1 \[Fc]
+. ds $RESTORE_SQ \\$1
+. nr #SQ_ON 1
+. return
+. \}
+. if '\\$1'PT' \{\
+. ds $QUOTE0 \[Fo]
+. ds $QUOTE1 \[Fc]
+. ds $RESTORE_SQ \\$1
+. nr #SQ_ON 1
+. return
+. \}
+. if '\\$1'SV' \{\
+. ds $QUOTE0 \[Fc]
+. ds $QUOTE1 \[Fc]
+. ds $RESTORE_SQ \\$1
+. nr #SQ_ON 1
+. return
+. \}
+.\" None of the above -> turn smartquotes off
+. ds $QUOTE0 \[dq]
+. ds $QUOTE1 \[dq]
+. nr #SQ_ON 0
+.END
+\#
+.ds $QUOTE0 \[lq]
+.ds $QUOTE1 \[rq]
+\#
+\# Strings for foot and inch marks
+\#
+.ds FOOT \[fm]
+.ds INCH \[fm]\[fm]
+\#
+\# =====================================================================
+\#
+\# +++LINE BREAKS+++
+\#
+\# NO-SPACE BREAK
+\# --------------
+\# *Argument:
+\# <none>
+\# *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.
+\# Preferable, since it works with filled and non-filled copy and
+\# doesn't require the user to remember whether to use (or not use)
+\# \c.
+\#
+.ds B \h'|0'\R'#NO_ADVANCE 1'\c
+\#
+\# =====================================================================
+\#
+\# +++FILLING/QUADDING/JUSTIFYING+++
+\#
+\# JUSTIFY
+\# -------
+\# *Argument:
+\# <none>
+\# *Function:
+\# Turns fill on and sets .ad to b.
+\# *Notes:
+\# Justifies text left and right.
+\#
+.MAC JUSTIFY END
+\#. if r pdfbx-top 'sp -1
+. 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
+. if r pdfbx-top \{\
+' sp -1
+. rr pdfbx-top
+. \}
+.\" The QUAD in PP adds an unwanted linespace after a HEADING at the
+.\" top of a pdf box because of this .br, so HEADING assigns the
+.\" tmp register "bx-top\n[stack]" to inhibit it.
+. ie !r pdfbx-top\\n[stack] .br
+. el .rr pdfbx-top\\n[stack]
+. if \\n[#COVERTEXT_PP] \
+. ds $RESTORE_DOC_QUAD \\*[$QUAD_VALUE]
+. ds $QUAD_VALUE \\$1
+. substring $QUAD_VALUE 0 0
+. 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]'R' \{\
+. nr #JUSTIFY 0
+. ad r
+. \}
+. if '\\*[$QUAD_VALUE]'C' \{\
+. nr #JUSTIFY 0
+. ad c
+. \}
+. if '\\*[$QUAD_VALUE]'J' \{\
+. nr #JUSTIFY 1
+. ad b
+. \}
+. nr #PSEUDO_FILL 0
+.END
+\#
+\# LEFT, RIGHT, AND CENTER
+\# -----------------------
+\# The purpose of these macros is to allow the user to enter lines
+\# of text that will be quadded LRC without having to stick .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 fill mode.
+\#
+\# LEFT
+\# ----
+\# *Argument:
+\# <none>
+\# *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. 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:
+\# <none>
+\# *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
+. \}
+. nf
+. rj 100000
+. nr #PSEUDO_FILL 1
+.END
+\#
+\# CENTER
+\# ------
+\# *Argument:
+\# <none>
+\# *Function:
+\# Turns fill off. 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
+. \}
+. nf
+. ce 100000
+. nr #PSEUDO_FILL 1
+.END
+\#
+\# CENTER BLOCKS OF TYPE
+\# ---------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Allows users to centre blocks of type on the page without
+\# altering their quad.
+\#
+.MAC CENTER_BLOCK END
+. br
+. ie !\\n[.$] .di CENTER*BLOCK
+. el \{\
+. di
+. in \\n[.l]u-\\n[dl]u/2u
+. if \\n[.u] .nr #FILLED 1
+. nf
+. CENTER*BLOCK
+. if \\n[#FILLED] .fi
+. rr #FILLED
+. in
+. \}
+.END
+\#
+.ALIAS CENTRE_BLOCK CENTER_BLOCK
+\#
+\# =====================================================================
+\#
+\# +++TABS+++
+\#
+\# There are two different kinds of tabs: 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 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.
+\#
+\# 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]
+.ds ST102 \Ek[#ST102_OFFSET]
+.ds ST102X \Ek[#ST102_MARK]
+.ds ST103 \Ek[#ST103_OFFSET]
+.ds ST103X \Ek[#ST103_MARK]
+\#
+\# QUAD AND SET STRING TABS
+\# ------------------------
+\# *Arguments:
+\# <stringtab number> 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:
+\# <n> 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'<string>'u--if more than one word in string, surround
+\# with double quotes "\w'<three word string>'"
+\# 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
+\#
+\# Tabs are not columnar in behaviour. .TN and \*[TB+] permit
+\# bottom-line to bottom-line tab movement.
+\#
+\# When resetting tabs, .TQ must be invoked before .TAB_SET.
+\#
+\# Indents are turned off automatically whenever a new tab is called
+\# with TAB <n>.
+\#
+\# Generally, 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]
+. 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]
+. ie !'\\\\n[.z]'' \
+\!. po \\\\\\\\n[#L_MARGIN]u+\\\\n[#TAB_OFFSET\\\\*[$CURRENT_TAB]]u
+. el \
+. po \\\\n[#L_MARGIN]u+\\\\n[#TAB_OFFSET\\\\*[$CURRENT_TAB]]u
+. ll \\n[#TAB_LENGTH]u
+. ta \En[.l]u
+. 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
+. \}
+..
+. rr #TAB_ACTIVE
+.END
+\#
+\# TAB
+\# ---
+\# *Arguments:
+\# <tab number to tab into>
+\# *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:
+\# <none>
+\# *Function:
+\# Automatically moves to TAB<n+1> 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
+. vpt 0
+. sp -1v
+. nr #NEXT_TAB \\n[#CURRENT_TAB]+1
+. TAB\\n[#NEXT_TAB]
+. vpt
+.END
+\#
+\# An inline escape to accomplish the same thing. 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:
+\# <none>
+\# *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 precede setting new tabs to get the tabs' indents
+\# measured from page left. Otherwise, the tabs' indents are
+\# measured from the left margin of the currently active tab.
+\#
+.MAC TQ END
+. br
+. rr #TAB_ACTIVE
+. rr #IN_TAB
+. nr #LOOP 0 1
+. while \\n+[#LOOP]<20 \{\
+. rm $ST\\n[#LOOP]_FILL
+. \}
+. rr #LOOP
+. ie !'\\n[.z]'' \{\
+\!. po \\n[#L_MARGIN]u
+\!. ll \\n[#L_LENGTH]u
+. \}
+. el \{\
+. po \\n[#L_MARGIN]u
+. ll \\n[#L_LENGTH]u
+. \}
+. ll \\n[#L_LENGTH]u
+. ta \\n[.l]u
+. 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:
+\# <pre-defined NEWCOLOR or XCOLOR>
+\# *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:
+\# <color name> [<color scheme>] <color definition>
+\# *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:
+\# <x color name> [<alias>]
+\# *Function:
+\# Defines a string of x color name (i.e. a predefined x
+\# color). If <alias> is given, creates a string of <alias name>
+\# that references the x color name of the first argument.
+\# *Notes:
+\# The color name must be a valid 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]
+. ds $\\$2_FILL \\$1
+. ds COLAL_\\$2 \\$1
+. \}
+.END
+\#
+\# Pre-define xcolors black and white
+\#
+.ds black \m[black]
+.ds BLACK \m[black]
+.ds white \m[white]
+.ds WHITE \m[white]
+.ds default black
+\#
+\# =====================================================================
+\#
+\# +++MISCELLANEOUS USEFUL MACROS AND STRINGS+++
+\#
+.nr _w 500
+.nr _d 1250
+\#
+\# These string are used for creating aliases within loops that set
+\# style for doc-cover, cover, and docheader items. They're defined
+\# here because underscoring needs them.
+\#
+.ds TITLE_TYPE_1 ATTRIBUTE
+.ds TITLE_TYPE_2 AUTHOR
+.ds TITLE_TYPE_3 CHAPTER
+.ds TITLE_TYPE_4 CHAPTER_TITLE
+.ds TITLE_TYPE_5 COVERTITLE
+.ds TITLE_TYPE_6 DOCTITLE
+.ds TITLE_TYPE_7 DOCTYPE
+.ds TITLE_TYPE_8 DOC_COVERTITLE
+.ds TITLE_TYPE_9 SUBTITLE
+.ds TITLE_TYPE_10 TITLE
+.ds TITLE_TYPE_11 MISC
+.ds TITLE_TYPE_12 COPYRIGHT
+.ds TITLE_TYPE_13 DOC_COVER_TITLE
+.ds TITLE_TYPE_14 COVER_TITLE
+\#
+\# UNDERLINE
+\# ---------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Simulates typewriter-style underlining of italic passages.
+\# *Notes:
+\# Defaults for rule weight and distance from baseline are below.
+\# UNDERLINE_SPECS lets user change them
+\#
+.MAC UNDERLINE_SPECS END
+. ie \B'\\$1' .nr _w (u;\\$1)
+. el \{\
+. ie '\\$1'DEFAULT' .nr _w 500
+. el \{\
+. nr _w 500
+. tm1 "[mom]: The first argument to \\$0 must be a numeric
+. tm1 " argument with a unit of measure appended, or DEFAULT.
+. tm1 " Setting underline weight to DEFAULT.
+. \}
+. \}
+. shift
+. ie \B'\\$1' .nr _d (u;\\$1)
+. el \{\
+. ie '\\$1'DEFAULT' .nr _d 1250
+. el \{\
+. nr _d 1250
+. tm1 "[mom]: The second argument to \\$0 must be a numeric
+. tm1 " argument with a unit of measure appended, or DEFAULT.
+. tm1 " Setting underline distance from baseline to DEFAULT.
+. \}
+. \}
+.END
+\#
+.MAC UNDERLINE END
+. ds $SAVED_SS_VAR \\*[$SS_VAR]
+. ie '\\$1'' \{\
+. nr #UNDERLINE_ON 1
+. ss \\n[.ss] 0
+. ie !n .nop \X'ps: exec \\n[_w] \\n[_d] decorline'\c
+. el .cu 1000
+. \}
+. el \{\
+. nr #UNDERLINE_ON 0
+. if !'\\*[$SAVED_SS_VAR]'' .SS \\*[$SAVED_SS_VAR]
+. ie !n .nop \X'ps: exec decornone'\c
+. el .cu 0
+. \}
+.END
+\#
+\# UL/ULX
+\# ------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Simulates typewriter-style underlining of italic passages.
+\# *Notes:
+\# Intended to be called with inline escapes \*[UL] (underline
+\# on) and \*[ULX] (underline off).
+\#
+.MAC UL END
+\c
+. ds $SAVED_SS_VAR \\*[$SS_VAR]
+. ss \\n[.ss] 0
+. ie !'\\n[.z]'' \{\
+\c
+. ie !n \{\
+. if !\\n[.k]=0 \?\h'-\w'\\n[.ss]'u'\?
+\?\R'#UNDERLINE_ON 1'\X'ps: exec \\n[_w] \\n[_d] decorline'\?\c
+. \}
+. el \{\
+\?\R'#UNDERLINE_ON 1'\?\c
+. cu 1000
+. \}
+. \}
+. el \{\
+. ie !n \{\
+. nr #UNDERLINE_ON 1
+. nop \X'ps: exec \\n[_w] \\n[_d] decorline'\c
+. \}
+. el \{\
+\R'#UNDERLINE_ON 1'\c
+. cu 1000
+. \}
+. \}
+.END
+\#
+.MAC ULX END
+\c
+. SS \\*[$SAVED_SS_VAR]
+. rm $SAVED_SS_VAR
+. ie !'\\n[.z]'' \{\
+\c
+. ie !n \{\
+\?\R'#UNDERLINE_ON 0'\X'ps: exec decornone'\?\c
+. \}
+. el \{\
+\?\R'#UNDERLINE_ON 0'\?\c
+. cu 0
+. \}
+. \}
+. el \{\
+. ie !n \{\
+. nr #UNDERLINE_ON 0
+. nop \X'ps: exec decornone'\c
+. \}
+. el \{\
+. nr #UNDERLINE_ON 0
+. cu 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
+\#
+\# UNDERSCORE does not work across line breaks. Each line of text
+\# must be entered separately. If the UNDERSCORE begins in the
+\# middle of a line and crosses over a break, the portion before
+\# the break and the portion afterwards must be entered
+\# separately.
+\#
+.MAC UNDERSCORE END
+. nr #SAVED_UNDERSCORE_WEIGHT \\n[#UNDERSCORE_WEIGHT]
+. nr #SAVED_UNDERSCORE_WEIGHT_ADJ \\n[#UNDERSCORE_WEIGHT_ADJ]
+. ds $SAVED_UNDERSCORE_GAP \\*[$UNDERSCORE_GAP]
+. if \\n[#NUM_ARGS]>=2 \{\
+. if \B'\\$1' \{\
+. ds $UNDERSCORE_GAP \\$1
+. shift
+. \}
+. if '\\$1'PREFIX' \{\
+. ds $PREFIX \\$2
+. shift 2
+. \}
+. if '\\$1'SUFFIX' \{\
+. ds $SUFFIX \\$2
+. shift 2
+. \}
+. \}
+. if !'\\*[$TITLE_TYPE]'' \{\
+. nr #UNDERSCORE_WEIGHT \\n[#\\*[$TITLE_TYPE]_UNDERLINE_WEIGHT]
+. nr #UNDERSCORE_WEIGHT_ADJ \\n[#\\*[$TITLE_TYPE]_UNDERLINE_WEIGHT_ADJ]
+. ds $UNDERSCORE_GAP \\*[$\\*[$TITLE_TYPE]_UNDERLINE_GAP]
+. \}
+. nr #TEXT_WIDTH \w'\\$1'
+. ie \\n[.u]=1 \{\
+\\*[$PREFIX]\Z'\\$1'\
+\Z'\D't \\n[#UNDERSCORE_WEIGHT]''\
+\v'\\*[$UNDERSCORE_GAP]+\\n[#UNDERSCORE_WEIGHT_ADJ]u'\
+\D'l \\n[#TEXT_WIDTH]u 0'\
+\Z'\D't \\n[#RULE_WEIGHT]''\
+\v'-(\\*[$UNDERSCORE_GAP]+\\n[#UNDERSCORE_WEIGHT_ADJ]u)'\\*[$SUFFIX]\c
+. nop
+. \}
+. el \{\
+\\*[$PREFIX]\Z'\\$1'\
+\Z'\D't \\n[#UNDERSCORE_WEIGHT]''\
+\v'\\*[$UNDERSCORE_GAP]+\\n[#UNDERSCORE_WEIGHT_ADJ]u'\
+\D'l \\n[#TEXT_WIDTH]u 0'\
+\Z'\D't \\n[#RULE_WEIGHT]''\
+\v'-(\\*[$UNDERSCORE_GAP]+\\n[#UNDERSCORE_WEIGHT_ADJ]u)'\\*[$SUFFIX]
+. \}
+. nr #UNDERSCORE_WEIGHT \\n[#SAVED_UNDERSCORE_WEIGHT]
+. nr #UNDERSCORE_WEIGHT_ADJ \\n[#SAVED_UNDERSCORE_WEIGHT_ADJ]
+. ds $UNDERSCORE_GAP \\*[$SAVED_UNDERSCORE_GAP]
+. rr #SAVED_UNDERSCORE_WEIGHT
+. rr #SAVED_UNDERSCORE_WEIGHT_ADJ
+. rm $SAVED_UNDERSCORE_GAP
+. rm $PREFIX
+. rm $SUFFIX
+. rm $TITLE_TYPE
+.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 #SAVED_UNDERSCORE_WEIGHT \\n[#UNDERSCORE_WEIGHT]
+. nr #SAVED_UNDERSCORE_WEIGHT_ADJ \\n[#UNDERSCORE_WEIGHT_ADJ]
+. ds $SAVED_UNDERSCORE_GAP \\*[$UNDERSCORE_GAP]
+. ds $SAVED_RULE_GAP \\*[$RULE_GAP]
+. if \\n[#NUM_ARGS]>=2 \{\
+. if \B'\\$1' \{\
+. ds $UNDERSCORE_GAP \\$1
+. shift
+. \}
+. if \B'\\$1' \{\
+. ds $RULE_GAP \\$1
+. shift
+. \}
+. if '\\$1'PREFIX' \{\
+. ds $PREFIX \\$2
+. shift 2
+. \}
+. if '\\$1'SUFFIX' \{\
+. ds $SUFFIX \\$2
+. shift 2
+. \}
+. if \\n[#NUM_ARGS]=3 \{\
+. ds $UNDERSCORE_GAP \\$1
+. ds $RULE_GAP \\$2
+. shift 2
+. \}
+. if !'\\*[$TITLE_TYPE]'' \{\
+. nr #UNDERSCORE_WEIGHT \\n[#\\*[$TITLE_TYPE]_UNDERLINE_WEIGHT]
+. nr #UNDERSCORE_WEIGHT_ADJ \\n[#\\*[$TITLE_TYPE]_UNDERLINE_WEIGHT_ADJ]
+. ds $UNDERSCORE_GAP \\*[$\\*[$TITLE_TYPE]_UNDERLINE_GAP]
+. ds $RULE_GAP \\*[$\\*[$TITLE_TYPE]_RULE_GAP]
+. \}
+. nr #TEXT_WIDTH \w'\\$1'
+. ie \\n[.u]=1 \{\
+\\*[$PREFIX]\Z'\\$1'\
+\Z'\D't \\n[#UNDERSCORE_WEIGHT]''\
+\v'\\*[$UNDERSCORE_GAP]+\\n[#UNDERSCORE_WEIGHT_ADJ]u'\
+\Z'\D'l \\n[#TEXT_WIDTH]u 0''\
+\v'\\*[$RULE_GAP]+\\n[#UNDERSCORE_WEIGHT]u'\
+\D'l \\n[#TEXT_WIDTH]u 0'\
+\Z'\D't \\n[#RULE_WEIGHT]''\
+\v'-(\\*[$UNDERSCORE_GAP]+\\*[$RULE_GAP])-(\\n[#UNDERSCORE_WEIGHT]u*2u)'\\*[$SUFFIX]\c
+. \}
+. el \{\
+\\*[$PREFIX]\Z'\\$1'\
+\Z'\D't \\n[#UNDERSCORE_WEIGHT]''\
+\v'\\*[$UNDERSCORE_GAP]+\\n[#UNDERSCORE_WEIGHT_ADJ]u'\
+\Z'\D'l \\n[#TEXT_WIDTH]u 0''\
+\v'\\*[$RULE_GAP]+\\n[#UNDERSCORE_WEIGHT]u'\
+\D'l \\n[#TEXT_WIDTH]u 0'\
+\Z'\D't \\n[#RULE_WEIGHT]''\
+\v'-(\\*[$UNDERSCORE_GAP]+\\*[$RULE_GAP])-(\\n[#UNDERSCORE_WEIGHT]u*2u)'\\*[$SUFFIX]
+. \}
+. nr #UNDERSCORE_WEIGHT \\n[#SAVED_UNDERSCORE_WEIGHT]
+. nr #UNDERSCORE_WEIGHT_ADJ \\n[#SAVED_UNDERSCORE_WEIGHT_ADJ]
+. ds $UNDERSCORE_GAP \\*[$SAVED_UNDERSCORE_GAP]
+. rr #SAVED_UNDERSCORE_WEIGHT
+. rr #SAVED_UNDERSCORE_WEIGHT_ADJ
+. rm $PREFIX
+. rm $SUFFIX
+. rm $SAVED_UNDERSCORE_GAP
+. rm $SAVED_RULE_GAP
+. rm $TITLE_TYPE
+.END
+\#
+\# Default underscoring underline and rule gaps
+\#
+.ds $BIB_STRING_RULE_GAP 2p
+.ds $BIB_STRING_UNDERLINE_GAP 2p
+.ds $EN_STRING_RULE_GAP 2p
+.ds $EN_STRING_UNDERLINE_GAP 2p
+.ds $EN_TITLE_UNDERLINE_GAP 2p
+.ds $RULE_GAP 2p
+.ds $TOC_HEADER_RULE_GAP 2p
+.ds $TOC_HEADER_UNDERLINE_GAP 2p
+.ds $UNDERSCORE_GAP 2p
+\#
+.nr #LOOP 0 1
+.while \n+[#LOOP]<=14 \{\
+. ds $\*[TITLE_TYPE_\n[#LOOP]]_RULE_GAP 2p
+. ds $COVER_\*[TITLE_TYPE_\n[#LOOP]]_RULE_GAP 2p
+. ds $DOC_COVER_\*[TITLE_TYPE_\n[#LOOP]]_RULE_GAP 2p
+. ds $\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_GAP 2p
+. ds $COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_GAP 2p
+. ds $DOC_COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_GAP 2p
+.\}
+\#
+\# SUPERSCRIPT
+\# -----------
+\# *Function:
+\# Prints everything after inline 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.
+\#
+\# Default raise/lower amount
+.ds $SUP_RAISE \v'-.3m'
+.ds $SUP_LOWER \v'.3m'
+\#
+\# SUPERSCRIPT RAISE
+\# -----------------
+\# *Argument:
+\# <amount to raise superscript>
+\# *Function:
+\# Defines strings $SUP_RAISE and $SUP_LOWER for use with \*[SUP],
+\# \*[CONDSUP] and \*[EXTSUP].
+\#
+.MAC SUPERSCRIPT_RAISE_AMOUNT END
+. ds $SUP_RAISE_AMOUNT \\$1
+. ds $SUP_RAISE \v'-\\*[$SUP_RAISE_AMOUNT]'
+. ds $SUP_LOWER \v'\\*[$SUP_RAISE_AMOUNT]'
+.END
+\#
+.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]\E*[$SUP_RAISE]\s[\En[#SUP_PT_SIZE]u]
+\#
+.ds SUPX \s[\En[#PT_SIZE_IN_UNITS]u]\E*[$SUP_LOWER]
+\#
+.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]\E*[$SUP_RAISE]\s[\En[#SUP_PT_SIZE]u]\E*[COND_FOR_SUP]
+\#
+.ds CONDSUPX \s[\En[#PT_SIZE_IN_UNITS]u]\E*[$SUP_LOWER]\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]\E*[$SUP_RAISE]\s[\En[#SUP_PT_SIZE]u]\E*[EXT_FOR_SUP]
+\#
+.ds EXTSUPX \s[\En[#PT_SIZE_IN_UNITS]u]\E*[$SUP_LOWER]\E*[EXT]
+\#
+\# SLANT
+\# -----
+\#
+\# SETSLANT
+\# --------
+\# *Arguments:
+\# <number of degrees> | 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:
+\# <amount of emboldening> | 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:
+\# <percentage to condense/expand type size>
+\# *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 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'\Es[0]\R'#PT_SIZE_IN_UNITS \En[.ps]'\H'\En[#PT_SIZE_IN_UNITS]u'
+.ds EXTX \
+\ER'#EXTEND 0'\Es[0]\R'#PT_SIZE_IN_UNITS \En[.ps]'\H'\En[#PT_SIZE_IN_UNITS]u'
+\#
+\# +++PAD LINES+++ (insert space)
+\#
+\# PAD MARKER
+\# ----------
+\# *Arguments:
+\# <character to use for marking pad points>
+\# *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
+\# ---
+\# *Arguments:
+\# "<string of text with padding markers inserted>"
+\# "<id of bookmark created by .PDF_BOOKMARK>"
+\# *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.
+\# *Notes:
+\# String tabs may be marked off during PAD.
+\#
+.MAC PAD END
+. if \\n[.u]=1 .nr fill 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]
+.\" .if !n .fp \\n[.fp] \\n[.sty]
+. ds $FONT_FOR_PAD \\n[.sty]
+. 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
+. if \\n[#INDENT_ACTIVE] \{\
+. if \\n[#INDENT_LEFT_ACTIVE] .ll -\\n[#L_INDENT]u
+. if \\n[#INDENT_RIGHT_ACTIVE] .ll -\\n[#R_INDENT]u
+. if \\n[#INDENT_BOTH_ACTIVE] .ll -\\n[#BR_INDENT]u
+. \}
+. char \\*[$PAD_MARKER] \
+\R'#SPACE_TO_END \En[.l]-\En[p]'\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
+. if \\n[#INDENT_ACTIVE] \
+. if (\\n[#INDENT_LEFT_ACTIVE]=1):(\\n[#INDENT_BOTH_ACTIVE]) .ll
+. char \\*[$PAD_MARKER] \h'\En[#PAD_SPACE]u'
+. if \\n[#SILENT] .SILENT
+. fam \\*[$FAMILY_FOR_PAD]
+\f[\\*[$FONT_FOR_PAD]]\s[\\n[#SIZE_FOR_PAD]u]
+. ie '\\$2'' .nop \\*[$PAD_STRING]
+. el \{\
+. ie !'\\$2'NOBREAK' .pdfhref L -D "\\$2" -E -- \&\\*[$PAD_STRING]
+. el .nop \\*[$PAD_STRING]
+. \}
+. if \\n[#SILENT] .SILENT OFF
+. br
+. if \\n[fill] \{\
+. fi
+. rr fill
+. \}
+. rr #PAD_COUNT
+. rr #SPACE_TO_END
+. rr #PAD_SPACE
+. rm $PAD_STRING
+. rm PAD_STRING
+. rchar \\*[$PAD_MARKER]
+. if '\\$2'NOBREAK' \{\
+. TRAP OFF
+. EOL
+. TRAP
+. \}
+.END
+\#
+\# +++LEADERS+++
+\#
+\# 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:
+\# <character to use whenever \*[LEADER] is invoked>
+\# *Function:
+\# Set leader character.
+\#
+.MAC LEADER_CHARACTER END
+. lc \\$1
+.END
+\#
+.ds LEADER 
+\#
+\# +++DROP CAPS+++
+\#
+\# DROP CAP FAMILY
+\# ---------------
+\# *Argument:
+\# <family of drop cap>
+\# *Function:
+\# Creates or modifies string $DC_FAM.
+\#
+.MAC DROPCAP_FAMILY END
+. ds $DC_FAM \\$1
+.END
+\#
+\# DROP CAP FONT
+\# -------------
+\# *Argument:
+\# <font of drop cap>
+\# *Function:
+\# Creates or modifies string $DC_FT.
+\#
+.MAC DROPCAP_FONT END
+. ds $DC_FT \\$1
+.END
+\#
+\# DROPCAP COLOR
+\# -------------
+\# *Arguments:
+\# <pre-defined XCOLOR or NEWCOLOR>
+\# *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:
+\# <width of gutter between drop cap and indented text>
+\# *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:
+\# <dropcap letter> <# 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 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 \\n[#IGNORE]=1 \{\
+. PRINT \\$1\c
+. return
+. \}
+. br
+. if n \{\
+. PRINT \\$1\c
+. return
+. \}
+. if \\n[#DOCS] \{\
+. if \\n[#PRINT_STYLE]=1 \{\
+. PRINT \\$1\c
+. return
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. sp -1
+. if \\n[#PP_STYLE]=2 \{\
+. PRINT \\$1\c
+. return
+. \}
+. if \\n[#PP]>1 \{\
+. if \\n[#PP_INDENT] .ti \\n[#PP_INDENT]u
+. PRINT \\$1\c
+. 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
+. ie \\n[#DOCS] .ds $RESTORE_FAM \\*[$DOC_FAM]
+. el .ds $RESTORE_FAM \\n[.fam]
+. ie \\n[#DOCS] .ds $RESTORE_FT \\*[$PP_FT]
+. el .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
+. nr #DC_LINES +1
+. if (\\n[#DC_LINES]v-1v)>(\\n[.t]-1) \{\
+. nr pgnum \\n%+\\n[#PAGE_NUM_ADJ] 1
+. if \\n[#COLUMNS]=1 .ds col-num ", column \\n[#COL_NUM]
+. tm1 \
+"[mom]: Dropcap at line \\n[.c] does not fit on page \\n[pgnum]\\*[col-num].
+. tm1 \
+" Shifting paragraph to next page or column.
+. ie \\n[#COLUMNS] .COL_NEXT
+. el .NEWPAGE
+. \}
+. ie \\n[#DC_COLOR]=1 \{\
+. ie !'\\$3'' \{\
+. ie '\\$3'COND' \
+. PRINT \
+\\*[DOWN \\n[#DC_LINES]v]\
+\m[\\*[$DC_COLOR]]\\*[COND]\\*[$DROPCAP]\\*[CONDX]\m[]\\*[UP \\n[#DC_LINES]v]
+. el \
+. PRINT \
+\\*[DOWN \\n[#DC_LINES]v]\
+\m[\\*[$DC_COLOR]]\\*[EXT]\\*[$DROPCAP]\\*[EXTX]\m[]\\*[UP \\n[#DC_LINES]v]
+. \}
+. el .PRINT \
+\\*[DOWN \\n[#DC_LINES]v]\
+\m[\\*[$DC_COLOR]]\\*[$DROPCAP]\m[]\\*[UP \\n[#DC_LINES]v]
+. \}
+. el \{\
+. ie !'\\$3'' \{\
+. ie '\\$3'COND' \
+. PRINT \
+\\*[DOWN \\n[#DC_LINES]v]\
+\\*[COND]\\*[$DROPCAP]\\*[CONDX]\\*[UP \\n[#DC_LINES]v]
+. el \
+. PRINT \
+\\*[DOWN \\n[#DC_LINES]v]\
+\\*[EXT]\\*[$DROPCAP]\\*[EXTX]\\*[UP \\n[#DC_LINES]v]
+. \}
+. el .PRINT \
+\\*[DOWN \\n[#DC_LINES]v]\
+\\*[$DROPCAP]\\*[UP \\n[#DC_LINES]v]
+. \}
+. if '\\$3'COND' \E*[COND]
+. if '\\$3'EXT' \E*[EXT]
+. ie \\n[.i] \{\
+. vs 0
+. br
+. in +\w'\\*[$DROPCAP]'u+\\n[#DC_GUT]u
+. vs
+. \}
+. el \{\
+. vs 0
+. br
+. in \w'\\*[$DROPCAP]'u+\\n[#DC_GUT]u
+. vs
+. \}
+. if '\\$3'COND' \E*[CONDX]\c
+. if '\\$3'EXT' \E*[EXTX]\c
+. 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[.d]u+\\n[#DC_HEIGHT]u-1v DROPCAP_OFF
+. el .wh \\n[.d]u+\\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
+. ch DROPCAP_OFF
+.END
+\#
+\# =====================================================================
+\#
+\# +++GRAPHICAL OBJECTS+++
+\#
+\# Set params for graphical objects.
+\#
+.MAC GRAPHICAL_OBJ END
+. rr #FILLED
+. rr #FILL_MODE
+. rr #NOFILL
+. rr #NOFILL_MODE
+. if \\n[.vpt]=1 \{\
+. vpt 0
+. nr #RESTORE_TRAP 1
+. \}
+. ie !\\n[#NO_ADVANCE]=1 .br
+. el \{\
+. sp -1v
+. rr #NO_ADVANCE
+. \}
+. ie \\n[.u]=1 \{\
+. nr #FILLED 1
+. nr #FILL_MODE \\n[.j]
+. \}
+. el \{\
+. nr #NOFILL 1
+. if \\n[.ce]>0 .nr #NOFILL_MODE 3
+. if \\n[.rj]>0 .nr #NOFILL_MODE 5
+. ce 0
+. rj 0
+. \}
+. nf
+.END
+\#
+\# HORIZONTAL RULE - DRH
+\# ---------------------
+\# *Arguments:
+\# <none> | <rule weight> <indent> <length> [ <color> ]
+\# *Function:
+\# With no arg, draws a full measure rule. With args, draws
+\# described horizontal rule.
+\# *Notes:
+\# Rules are drawn left-to-right, from the baseline down, and
+\# return to their point of origin. If no arg given (full measure
+\# rule), the rule weight is the one set by RULE_WEIGHT.
+\#
+.MAC DRH END
+. GRAPHICAL_OBJ
+. ds $RL_WEIGHT \\$1
+. ds $RL_INDENT \\$2
+. ds $RL_LENGTH \\$3
+. ie !'\\$4'' .ds $RL_COLOR \\$4
+. el \{\
+. ie '\\n[.m]'' .ds $RL_COLOR \\*[default]
+. el .ds $RL_COLOR \\n[.m]
+. \}
+. nr #SAVED_WEIGHT \\n[#RULE_WEIGHT]
+. nr #SAVED_WEIGHT_ADJ \\n[#RULE_WEIGHT_ADJ]
+. di NULL
+. if \\n[#NUM_ARGS]>=1 .RULE_WEIGHT \\*[$RL_WEIGHT]
+. di
+. COLOR \\*[$RL_COLOR]
+. ie \\n[#NUM_ARGS]=0 \{\
+. ie \\n[#INDENT_ACTIVE] \{\
+. nr #RESTORE_L_LENGTH \\n[.l]
+. if \\n[#INDENT_BOTH_ACTIVE] .ll \\n[.l]u-\\n[#BL_INDENT]u
+. if \\n[#INDENT_LEFT_ACTIVE] .ll \\n[.l]u-\\n[#L_INDENT]u
+\Z'\D't \\n[#RULE_WEIGHT]''\
+\h'\\*[$RL_INDENT]+\\n[#RULE_WEIGHT_ADJ]u'\
+\v'\\n[#RULE_WEIGHT_ADJ]u'\
+\D'l \En[.l]u 0'\v'-\\n[#RULE_WEIGHT_ADJ]u'\
+\v'-\\n[#RULE_WEIGHT_ADJ]u'\
+\Z'\D't \\n[#SAVED_RULE_WEIGHT]''
+. ll \\n[#RESTORE_L_LENGTH]u
+. rr #RESTORE_L_LENGTH
+. \}
+. el \{\
+\Z'\D't \\n[#RULE_WEIGHT]''\
+\h'\\*[$RL_INDENT]+\\n[#RULE_WEIGHT_ADJ]u'\
+\v'\\n[#RULE_WEIGHT_ADJ]u'\
+\D'l \En[.l]u 0'\v'-\\n[#RULE_WEIGHT_ADJ]u'\
+\v'-\\n[#RULE_WEIGHT_ADJ]u'\
+\Z'\D't \\n[#SAVED_RULE_WEIGHT]''
+. \}
+. \}
+. el \{\
+\Z'\D't \\n[#RULE_WEIGHT]''\
+\h'\\*[$RL_INDENT]+\\n[#RULE_WEIGHT_ADJ]u'\
+\v'\\n[#RULE_WEIGHT_ADJ]u'\
+\D'l \\*[$RL_LENGTH] 0'\
+\v'-\\n[#RULE_WEIGHT_ADJ]u'\
+\Z'\D't \\n[#SAVED_RULE_WEIGHT]''
+. rr #RESTORE_L_LENGTH
+. \}
+. if \\n[#FILLED]=1 \{\
+. if \\n[#FILL_MODE]=0 .QUAD LEFT
+. if \\n[#FILL_MODE]=1 .JUSTIFY
+. if \\n[#FILL_MODE]=3 .QUAD CENTER
+. if \\n[#FILL_MODE]=5 .QUAD RIGHT
+. rr #FILLED
+. \}
+. sp -1v
+. if \\n[#NOFILL]=1 \{\
+. if \\n[#NOFILL_MODE]=3 .CENTER
+. if \\n[#NOFILL_MODE]=5 .RIGHT
+. \}
+. gcolor
+. nr #RULE_WEIGHT \\n[#SAVED_WEIGHT]
+. nr #RULE_WEIGHT_ADJ \\n[#SAVED_WEIGHT_ADJ]
+. rr #SAVED_WEIGHT
+. rr #SAVED_WEIGHT_ADJ
+. if \\n[#RESTORE_TRAP]=1 \{\
+. vpt
+. rr #RESTORE_TRAP
+. \}
+. if '\\n[.z]'FLOAT*DIV' \
+. if !(\\n[.d]+\\n[#WEIGHT])<\\n[D-float] .nr D-float \\n[.d]+\\n[#WEIGHT]
+.END
+\#
+\# RULE
+\# ----
+\# *Argument:
+\# <none>
+\# *Function:
+\# Draws a rule the length of the current measure.
+\# *Notes:
+\# A convenience macro. DRH with no argument does the same thing.
+\# Kept in for backward compatibility.
+\#
+.MAC RULE END
+. if \\n[.u]=1 \{\
+. nr fill 1
+. ds $CURRENT_QUAD \\*[$QUAD_VALUE]
+. nf
+. \}
+. ie \\n[#INDENT_ACTIVE] \{\
+. if \\n[#INDENT_BOTH_ACTIVE] .ll \\n[.l]u-\\n[#BL_INDENT]u
+. if \\n[#INDENT_LEFT_ACTIVE] .ll \\n[.l]u-\\n[#L_INDENT]u
+. PRINT \
+\Z'\D't \\n[#RULE_WEIGHT]''\
+\v'\\n[#RULE_WEIGHT_ADJ]u'\
+\h'\\n[#RULE_WEIGHT_ADJ]u'\
+\D'l \En[.l]u 0'\v'-\\n[#RULE_WEIGHT_ADJ]u'\h'|0'\c
+. ll
+. rr #RESTORE_L_LENGTH
+. \}
+. el \{\
+. PRINT \
+\Z'\D't \\n[#RULE_WEIGHT]''\
+\v'\\n[#RULE_WEIGHT_ADJ]u'\
+\h'\\n[#RULE_WEIGHT_ADJ]u'\
+\D'l \En[.l]u 0'\v'-\\n[#RULE_WEIGHT_ADJ]u'\h'|0'\c
+. \}
+. if \\n[fill] \{\
+. fi
+. rr fill
+. QUAD \\*[$CURRENT_QUAD]
+. rm $CURRENT_QUAD
+. \}
+. EOL
+.END
+\#
+\# VERTICAL RULE - DRV
+\# -------------------
+\# *Arguments:
+\# <rule weight> <indent> <depth> [ <color> ]
+\# *Function:
+\# Draws described vertical rule.
+\# *Notes:
+\# Rules are drawn left-to-right, from the baseline down, and
+\# return to their point of origin.
+.MAC DRV END
+. GRAPHICAL_OBJ
+. ds $RL_WEIGHT \\$1
+. ds $RL_INDENT \\$2
+. ds $RL_DEPTH \\$3
+. ie !'\\$4'' \
+. ds $RL_COLOR \\$4
+. el \{\
+. ie '\\n[.m]'' .ds $RL_COLOR \\*[default]
+. el .ds $RL_COLOR \\n[.m]
+. \}
+. nr #SAVED_WEIGHT \\n[#RULE_WEIGHT]
+. nr #SAVED_WEIGHT_ADJ \\n[#RULE_WEIGHT_ADJ]
+. RULE_WEIGHT \\*[$RL_WEIGHT]
+. COLOR \\*[$RL_COLOR]
+\Z'\D't \\n[#RULE_WEIGHT]''\
+\h'\\*[$RL_INDENT]+\\n[#RULE_WEIGHT]u+\\n[#RULE_WEIGHT_ADJ]u'\
+\D'l 0 \\*[$RL_DEPTH]'\
+\D't \\n[#SAVED_RULE_WEIGHT]'
+. if \\n[#FILLED]=1 \{\
+. if \\n[#FILL_MODE]=0 .QUAD LEFT
+. if \\n[#FILL_MODE]=1 .JUSTIFY
+. if \\n[#FILL_MODE]=3 .QUAD CENTER
+. if \\n[#FILL_MODE]=5 .QUAD RIGHT
+. rr #FILLED
+. \}
+. sp -1v
+. if \\n[#NOFILL]=1 \{\
+. if \\n[#NOFILL_MODE]=3 .CENTER
+. if \\n[#NOFILL_MODE]=5 .RIGHT
+. \}
+. gcolor
+. nr #RULE_WEIGHT \\n[#SAVED_WEIGHT]
+. nr #RULE_WEIGHT_ADJ \\n[#SAVED_WEIGHT_ADJ]
+. if \\n[#RESTORE_TRAP]=1 \{\
+. vpt
+. rr #RESTORE_TRAP
+. \}
+. if '\\n[.z]'FLOAT*DIV' \
+. if !(\\n[.d]+\\*[$RL_DEPTH])<\\n[D-float] .nr D-float \\n[.d]+\\*[$RL_DEPTH]
+.END
+\#
+\# BOXES - DBX
+\# -----------
+\# *Arguments:
+\# <rule weight>|SOLID <indent> <width>|FULL_MEASURE <depth> [ <color> ]
+\# *Function:
+\# Draws described box.
+\# *Notes:
+\# Boxes are drawn left-to-right, from the baseline down, and
+\# return to their point of origin. Box rules are drawn from the
+\# perimeter inwards.
+\#
+.MAC DBX END
+. GRAPHICAL_OBJ
+. ie '\\$1'SOLID' .nr #BX_SOLID 1
+. el .ds $BX_WEIGHT \\$1
+. ds $BX_INDENT \\$2
+. ie '\\$3'FULL_MEASURE' \{\
+. ie (\\n[#INDENT_LEFT_ACTIVE]+\\n[#INDENT_RIGHT_ACTIVE]+\\n[#INDENT_BOTH_ACTIVE])=0 \{\
+. nr #WIDTH \\n[.l]
+. ds $BX_WIDTH \\n[#WIDTH]u
+. \}
+. el \{\
+. if \\n[#INDENT_LEFT_ACTIVE] \{\
+. nr #WIDTH \\n[.l]-\\n[#L_INDENT]
+. ds $BX_WIDTH \\n[#WIDTH]u
+. \}
+. if \\n[#INDENT_RIGHT_ACTIVE] \{\
+. nr #WIDTH \\n[.l]
+. ds $BX_WIDTH \\n[#WIDTH]u
+. \}
+. if \\n[#INDENT_BOTH_ACTIVE] \{\
+. nr #WIDTH \\n[.l]-(\\n[#BL_INDENT])
+. ds $BX_WIDTH \\n[#WIDTH]u
+. \}
+. \}
+. \}
+. el .ds $BX_WIDTH \\$3
+. ds $BX_DEPTH \\$4
+. ie !'\\$5'' \{\
+. ie d$\\$5_FILL .ds $BX_COLOR \\*[$\\$5_FILL]
+. el .ds $BX_COLOR \\$5
+. \}
+. el \{\
+. ie '\\n[.m]'' .ds $BX_COLOR \\*[default]
+. el .ds $BX_COLOR \\n[.m]
+. \}
+. nr #SAVED_WEIGHT \\n[#RULE_WEIGHT]
+. nr #SAVED_WEIGHT_ADJ \\n[#WEIGHT_ADJ]
+. if !'\\$1'SOLID' .RULE_WEIGHT \\*[$BX_WEIGHT]
+. ds $BX_INDENT \\*[$BX_INDENT]-\\n[#WEIGHT_ADJ]u
+. ie \\n[#BX_SOLID]=1 \{\
+. fcolor \\*[$BX_COLOR]
+\h'\\*[$BX_INDENT]+\\n[#BOX_WEIGHT_ADJ]u+\\n[#RULE_WEIGHT]u'\
+\D'P \\*[$BX_WIDTH] 0 0 \\*[$BX_DEPTH] -\\*[$BX_WIDTH] 0 0 -\\*[$BX_DEPTH]'
+. fcolor
+. rr #BX_SOLID
+. \}
+. el \{\
+. COLOR \\*[$BX_COLOR]
+\Z'\D't \\n[#RULE_WEIGHT]''\
+\h'\\*[$BX_INDENT]+\\n[#RULE_WEIGHT]u+\\n[#RULE_WEIGHT_ADJ]u'\
+\v'\\n[#WEIGHT_ADJ]u'\
+\D'p \\*[$BX_WIDTH]-\\n[#RULE_WEIGHT]u 0 0 \\*[$BX_DEPTH]-\\n[#RULE_WEIGHT]u -\\*[$BX_WIDTH]+\\n[#RULE_WEIGHT]u 0 0 -\\*[$BX_DEPTH]+\\n[#RULE_WEIGHT]u'\
+\v'-\\n[#WEIGHT_ADJ]u'\
+\Z'\D't \\n[#SAVED_RULE_WEIGHT]''
+. gcolor
+. \}
+. sp -1v
+. if \\n[#FILLED]=1 \{\
+. if \\n[#FILL_MODE]=0 .QUAD LEFT
+. if \\n[#FILL_MODE]=1 .JUSTIFY
+. if \\n[#FILL_MODE]=3 .QUAD CENTER
+. if \\n[#FILL_MODE]=5 .QUAD RIGHT
+. \}
+. if \\n[#NOFILL]=1 \{\
+. if \\n[#NOFILL_MODE]=3 .CENTER
+. if \\n[#NOFILL_MODE]=5 .RIGHT
+. \}
+. nr #RULE_WEIGHT \\n[#SAVED_WEIGHT]
+. nr #WEIGHT_ADJ \\n[#SAVED_WEIGHT_ADJ]
+. rr #SAVED_WEIGHT
+. rr #SAVED_WEIGHT_ADJ
+. if \\n[#RESTORE_TRAP]=1 \{\
+. vpt
+. rr #RESTORE_TRAP
+. \}
+. if '\\n[.z]'FLOAT*DIV' \
+. if !(\\n[.d]+\\*[$BX_DEPTH])<\\n[D-float] .nr D-float \\n[.d]+\\*[$BX_DEPTH]
+.END
+\#
+\# ELLIPSES - DCL
+\# --------------
+\# *Arguments:
+\# <rule weight>|SOLID <indent> <width>|FULL_MEASURE <depth> [ <color> ]
+\# *Function:
+\# Draws described ellipses.
+\# *Notes:
+\# Ellipses (circles) are drawn left-to-right, from the baseline
+\# down, and return to their point of origin. Ellipse rules are
+\# drawn from the perimeter inwards.
+\#
+.MAC DCL END
+. GRAPHICAL_OBJ
+. ie '\\$1'SOLID' .nr #CL_SOLID 1
+. el .ds $CL_WEIGHT \\$1
+. ds $CL_INDENT \\$2
+. ds $CL_WIDTH \\$3
+. ie '\\$3'FULL_MEASURE' \{\
+. ie (\\n[#INDENT_LEFT_ACTIVE]+\\n[#INDENT_RIGHT_ACTIVE]+\\n[#INDENT_BOTH_ACTIVE])=0 \
+. nr #WIDTH \\n[.l]
+. ds $CL_WIDTH \\n[#WIDTH]u
+. el \{\
+. if \\n[#INDENT_LEFT_ACTIVE] \{\
+. nr #WIDTH \\n[.l]-\\n[#L_INDENT]
+. ds $CL_WIDTH \\n[#WIDTH]u
+. \}
+. if \\n[#INDENT_RIGHT_ACTIVE] \{\
+. nr #WIDTH \\n[.l]
+. ds $CL_WIDTH \\n[#WIDTH]u
+. \}
+. if \\n[#INDENT_BOTH_ACTIVE] \{\
+. nr #WIDTH \\n[.l]-(\\n[#BL_INDENT])
+. ds $CL_WIDTH \\n[#WIDTH]u
+. \}
+. \}
+. \}
+. el .ds $CL_WIDTH \\$3
+. ds $CL_DEPTH \\$4
+. ie !'\\$5'' \{\
+. ie d$\\$5_FILL .ds $CL_COLOR \\*[$\\$5_FILL]
+. el .ds $CL_COLOR \\$5
+. \}
+. el \{\
+. ie '\\n[.m]'' .ds $CL_COLOR \\*[default]
+. el .ds $CL_COLOR \\n[.m]
+. \}
+. nr #SAVED_WEIGHT \\n[#RULE_WEIGHT]
+. nr #SAVED_WEIGHT_ADJ \\n[#WEIGHT_ADJ]
+. if !'\\$1'SOLID' .RULE_WEIGHT \\*[$CL_WEIGHT]
+. ds $CL_INDENT \\*[$CL_INDENT]-\\n[#WEIGHT_ADJ]u
+. ie \\n[#CL_SOLID]=1 \{\
+. fcolor \\*[$CL_COLOR]
+\h'\\*[$CL_INDENT]+\\n[#RULE_WEIGHT]u'\
+\v'\\*[$CL_DEPTH]/2u'\
+\D'E \\*[$CL_WIDTH]-\\n[#RULE_WEIGHT]u \\*[$CL_DEPTH]-\\n[#RULE_WEIGHT]u'\
+\v'-\\*[$CL_DEPTH]/2u'
+. fcolor
+. rr #CL_SOLID
+. \}
+. el \{\
+. COLOR \\*[$CL_COLOR]
+\Z'\D't \\n[#RULE_WEIGHT]''\
+\h'\\*[$CL_INDENT]+\\n[#RULE_WEIGHT]u+\\n[#RULE_WEIGHT_ADJ]u'\
+\v'\\*[$CL_DEPTH]/2u'\
+\D'e \\*[$CL_WIDTH]-\\n[#RULE_WEIGHT]u \\*[$CL_DEPTH]-\\n[#RULE_WEIGHT]u'\
+\v'-(\\*[$CL_DEPTH]/2u)'\
+\Z'\D't \\n[#SAVED_RULE_WEIGHT]''
+. gcolor
+. \}
+. sp -1v
+. if \\n[#FILLED]=1 \{\
+. if \\n[#FILL_MODE]=0 .QUAD LEFT
+. if \\n[#FILL_MODE]=1 .JUSTIFY
+. if \\n[#FILL_MODE]=3 .QUAD CENTER
+. if \\n[#FILL_MODE]=5 .QUAD RIGHT
+. rr #FILLED
+. \}
+. if \\n[#NOFILL]=1 \{\
+. if \\n[#NOFILL_MODE]=3 .CENTER
+. if \\n[#NOFILL_MODE]=5 .RIGHT
+. \}
+. nr #RULE_WEIGHT \\n[#SAVED_WEIGHT]
+. nr #WEIGHT_ADJ \\n[#SAVED_WEIGHT_ADJ]
+. rr #SAVED_WEIGHT
+. rr #SAVED_WEIGHT_ADJ
+. if \\n[#RESTORE_TRAP]=1 \{\
+. vpt
+. rr #RESTORE_TRAP
+. \}
+. if '\\n[.z]'FLOAT*DIV' \
+. if !(\\n[.d]+\\*[$CL_DEPTH])<\\n[D-float] .nr D-float \\n[.d]+\\*[$CL_DEPTH]
+.END
+\#
+\# RULE WEIGHT
+\# -----------
+\# *Argument:
+\# <weight of rules in points>
+\# *Function:
+\# Sets \D't <n>' to the correct number of machine units for the
+\# argument given in points.
+\# *Notes:
+\# Decimal fractions are allowed. Rule weight must be < 100.
+\#
+.MAC RULE_WEIGHT END
+. di NULL \" Diverted so there's no problem with breaks, spacing, etc.
+. ds $ARG \\$1
+. substring $ARG -1
+. if !\B'\\*[$ARG]' \{\
+. tm1 "[mom]: The argument to \\$0 must not have a unit of measure appended.
+. ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. \}
+. length #STR_LENGTH \\$1
+. ds $ARG \\$1
+. substring $ARG 0 0
+. ie '\\*[$ARG]'.' \{\
+. ds $ARG \\$1
+. substring $ARG 1 \\n[#STR_LENGTH]-1
+. nr #WEIGHT \\*[$ARG]*100
+. if (\\n[#WEIGHT]>=1000) \{\
+. while (\\n[#WEIGHT]>=1000) \{\
+. nr #WEIGHT \\n[#WEIGHT]/10
+. \}
+. \}
+. \}
+. el \{\
+. ds $ARG \\$1
+. length #ARG_LENGTH \\*[$ARG]
+. if \\n[#ARG_LENGTH]>1 .substring $ARG 1 1
+. ie '\\*[$ARG]'.' \{\
+. ds $LHS \\$1
+. substring $LHS 0 0
+. ds $RHS \\$1
+. substring $RHS 2
+. nr #WEIGHT \\*[$LHS]\\*[$RHS]*100
+. if (\\n[#WEIGHT]>=10000) \{\
+. while (\\n[#WEIGHT]>=10000) \{\
+. nr #WEIGHT \\n[#WEIGHT]/10
+. \}
+. \}
+. \}
+. el \{\
+. ie \\n[#STR_LENGTH]<=2 .nr #WEIGHT \\$1*1000
+. el \{\
+. ds $ARG \\$1
+. substring $ARG 2 2
+. ie !'\\*[$ARG]'.' \{\
+. tm1 "[mom]: Invalid argument given to macro \\$0 at line \\n[.c].
+. tm1 " Rule weight must be < 100 points.
+. tm1 " Falling back to default weight .5 points.
+. nr #WEIGHT 500
+. \}
+. el \{\
+. ds $LHS \\$1
+. substring $LHS 0 1
+. ds $RHS \\$1
+. substring $RHS 3
+. nr #WEIGHT \\*[$LHS]\\*[$RHS]*1000
+. if (\\n[#WEIGHT]>=100000) \{\
+. while (\\n[#WEIGHT]>=100000) \{\
+. nr #WEIGHT \\n[#WEIGHT]/10
+. \}
+. \}
+. \}
+. \}
+. \}
+. \}
+. nr #WEIGHT_ADJ \\n[#WEIGHT]/2
+. if '\\$0'BIBLIOGRAPHY_STRING_UNDERLINE_WEIGHT' \
+. ds $TITLE_TYPE BIB_STRING_
+. if '\\$0'ENDNOTE_TITLE_UNDERLINE_WEIGHT' \
+. ds $TITLE_TYPE EN_TITLE_
+. if '\\$0'EN_HEADER_UNDERLINE_WEIGHT' \
+. ds $TITLE_TYPE EN_STRING_
+. if !'\\*[$TITLE_TYPE]'BIB_STRING' \
+. if !'\\*[$TITLE_TYPE]'EN_TITLE' \
+. if !'\\*[$TITLE_TYPE]'EN_STRING' \
+. ds _TYPE \\$0
+. length type-len _TYPE
+. if \\n[type-len]>17 \{\
+. substring _TYPE 0 -17
+. ds $TITLE_TYPE \\*[_TYPE]
+. \}
+. if !'\\*[$TITLE_TYPE]'' \{\
+. nr #\\*[$TITLE_TYPE]UNDERLINE_WEIGHT \\n[#WEIGHT]
+. nr #\\*[$TITLE_TYPE]UNDERLINE_WEIGHT_ADJ \\n[#WEIGHT_ADJ]
+. \}
+. if '\\$0'RULE_WEIGHT' \{\
+. nr #RULE_WEIGHT \\n[#WEIGHT]
+. nr #RULE_WEIGHT_ADJ \\n[#WEIGHT_ADJ]
+. \}
+. if '\\$0'UNDERSCORE_WEIGHT' \{\
+. nr #UNDERSCORE_WEIGHT \\n[#WEIGHT]
+. nr #UNDERSCORE_WEIGHT_ADJ \\n[#WEIGHT_ADJ]
+. \}
+. if '\\$0'FOOTER_RULE_WEIGHT' \{\
+. nr #FOOTER_RULE_WEIGHT \\n[#WEIGHT]
+. nr #FOOTER_RULE_WEIGHT_ADJ \\n[#WEIGHT_ADJ]
+. \}
+. if '\\$0'FOOTNOTE_RULE_WEIGHT' \{\
+. nr #FN_RULE_WEIGHT \\n[#WEIGHT]
+. nr #FN_RULE_WEIGHT_ADJ \\n[#WEIGHT_ADJ]
+. \}
+. if '\\$0'HEADER_RULE_WEIGHT' \{\
+. nr #HEADER_RULE_WEIGHT \\n[#WEIGHT]
+. nr #HEADER_RULE_WEIGHT_ADJ \\n[#WEIGHT_ADJ]
+. \}
+. di
+.END
+\#
+\# Aliases for RULE_WEIGHT
+\#
+.ALIAS BIB_STRING_UNDERLINE_WEIGHT RULE_WEIGHT
+.ALIAS DOCTYPE_UNDERLINE_WEIGHT RULE_WEIGHT
+.ALIAS EN_STRING_UNDERLINE_WEIGHT RULE_WEIGHT
+.ALIAS EN_TITLE_UNDERLINE_WEIGHT RULE_WEIGHT
+.ALIAS FN_RULE_WEIGHT RULE_WEIGHT
+.ALIAS FOOTER_RULE_WEIGHT RULE_WEIGHT
+.ALIAS FOOTNOTE_RULE_WEIGHT RULE_WEIGHT
+.ALIAS HEADER_RULE_WEIGHT RULE_WEIGHT
+.ALIAS RULE_WEIGHT RULE_WEIGHT
+.ALIAS TOC_HEADER_UNDERLINE_WEIGHT RULE_WEIGHT
+.ALIAS UNDERSCORE_WEIGHT RULE_WEIGHT
+\#
+\# Default rule weights
+\#
+.nr #BIB_STRING_UNDERLINE_WEIGHT 500
+.nr #DOCTYPE_UNDERLINE_WEIGHT 500
+.nr #EN_STRING_UNDERLINE_WEIGHT 500
+.nr #EN_TITLE_UNDERLINE_WEIGHT 500
+.nr #FN_RULE_WEIGHT 500
+.nr #FOOTER_RULE_WEIGHT 500
+.nr #HEADER_RULE_WEIGHT 500
+.nr #RULE_WEIGHT 500
+.nr #TOC_HEADER_UNDERLINE_WEIGHT 500
+.nr #UNDERSCORE_WEIGHT 500
+\#
+.nr #BIB_STRING_UNDERLINE_WEIGHT_ADJ \n[#BIB_STRING_UNDERLINE_WEIGHT]/2
+.nr #DOCTYPE_UNDERLINE_WEIGHT_ADJ \n[#DOCTYPE_UNDERLINE_WEIGHT]/2
+.nr #EN_STRING_UNDERLINE_WEIGHT_ADJ \n[#EN_STRING_UNDERLINE_WEIGHT]/2
+.nr #EN_TITLE_UNDERLINE_WEIGHT_ADJ \n[#EN_TITLE_UNDERLINE_WEIGHT]/2
+.nr #FN_RULE_WEIGHT_ADJ \n[#FN_RULE_WEIGHT]/2
+.nr #FOOTER_RULE_WEIGHT_ADJ \n[#FOOTER_RULE_WEIGHT]/2
+.nr #HEADER_RULE_WEIGHT_ADJ \n[#HEADER_RULE_WEIGHT]/2
+.nr #RULE_WEIGHT_ADJ \n[#RULE_WEIGHT]/2
+.nr #TOC_HEADER_UNDERLINE_WEIGHT_ADJ \n[#TOC_HEADER_UNDERLINE_WEIGHT]/2
+.nr #UNDERSCORE_WEIGHT_ADJ \n[#UNDERSCORE_WEIGHT]/2
+\#
+\# Read in remaining aliases and default rule weights
+\#
+.nr #LOOP 0 1
+.while \n+[#LOOP]<=14 \{\
+. ALIAS \*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT RULE_WEIGHT
+. ALIAS COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT RULE_WEIGHT
+. ALIAS DOC_COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT RULE_WEIGHT
+. nr #\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT 500
+. nr #COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT 500
+. nr #DOC_COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT 500
+. nr #\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT_ADJ \
+ \n[#\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT]/2
+. nr #COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT_ADJ \
+ \n[#COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT]/2
+. nr #DOC_COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT_ADJ \
+ \n[#DOC_COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT]/2
+.\}
+\#
+\# Set default rule weight
+\#
+.di NULL
+\D't 500'
+.di
+\#
+\# =====================================================================
+\#
+\# +++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.
+\#
+\# \n[.sss] holds the current sentence space value.
+\#
+.MAC WS END
+. ds $WS_CURR \\n[.ss]
+. ds $WS_VAR \\$1
+. ie '\\$1'DEFAULT' .ss 12 \\n[.sss]
+. el \{\
+. ds $WS (\\*[$WS_CURR]+\\*[$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
+. ds $SS_VAR \\$1
+. ie '\\$1'0' .ss \\n[.ss] 0
+. el \{\
+. ie '\\$1'DEFAULT' .ss \\n[.ss]
+. el .ss \\n[.ss] \\*[$SS_VAR]
+. \}
+.END
+\#
+\# =====================================================================
+\#
+\# INDENTS
+\# -------
+\#
+\# +++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[.l]u-\\n[#L_INDENT]u
+. if \\n[#IN_ITEM] .nr #IN_ITEM_L_INDENT 0
+. \}
+. el \{\
+. br
+. nr #L_INDENT +(u;\\$1)
+. in \\n[#L_INDENT]u
+. ta \\n[.l]u-\\n[#L_INDENT]u
+. if \\n[#IN_ITEM] .nr #IN_ITEM_L_INDENT +(u;\\$1)
+. \}
+.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[.l]u-\\n[#R_INDENT]u
+. ta \\n[.l]u-\\n[#L_INDENT]u
+. \}
+. el \{\
+. ll \\n[.l]u-\\n[#R_INDENT]u
+. ta \\n[.l]u-\\n[#L_INDENT]u
+. \}
+. \}
+. el \{\
+. br
+. nr #R_INDENT (u;\\$1)
+. ie \\n[#TAB_ACTIVE] \{\
+. ll \\n[.l]u-\\n[#R_INDENT]u
+. ta \\n[.l]u-\\n[#L_INDENT]u
+. \}
+. el \{\
+. ll \\n[.l]u-\\n[#R_INDENT]u
+. ta \\n[.l]u-\\n[#L_INDENT]u
+. \}
+. \}
+.END
+\#
+\# +++INDENT BOTH+++
+\#
+.MAC IB END
+. br
+. 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'' \{\
+. ie \\n[#DOCS] \
+. ll \\n[#DOC_L_LENGTH]u-\\n[#BR_INDENT]u
+. el .ll \\n[.l]u-\\n[#BR_INDENT]u
+. in \\n[#BL_INDENT]u
+. ta \\n[.l]u
+. \}
+. el \{\
+. nr #BL_INDENT (\\n[#INDENT]+\\$1)
+. ie \\n[#NUM_ARGS]=2 .nr #BR_INDENT +(\\$2)
+. el .nr #BR_INDENT \\n[#BL_INDENT]
+. if '\\n[.z]'' .ll
+. ll \\n[.l]u-\\n[#BR_INDENT]u
+. in \\n[#BL_INDENT]u
+. ta \\n[.l]u-\\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
+. ie \\n[#IN_ITEM] .nr #L_INDENT -\\n[#IN_ITEM_L_INDENT]
+. el \{\
+. br
+. ie \\n[pdfbx-running]=1 \
+. ie !r pdfbx-clear \{\
+. in \\*[wt\\n[stack]]+\\*[gap\\n[stack]]u+\\n[#IL_ACTIVE]u
+. el .in \\*[wt\\n[stack]]+\\*[gap\\n[stack]]u
+. \}
+. el .in 0
+. rr #INDENT_LEFT_ACTIVE
+. nr #L_INDENT_ILX \\n[#L_INDENT]
+. \}
+. if '\\$1'CLEAR' \{\
+. if \\n[pdfbx-running]=1 \
+. if !r pdfbx-clear \
+. in \\*[wt\\n[stack]]+\\*[gap\\n[stack]]u
+. rr #L_INDENT
+. rr #INDENT_STYLE_LEFT
+. rr #L_INDENT_ILX
+. rr #INDENT_ACTIVE
+. \}
+.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[.l]u
+. \}
+. el \{\
+. ie \\n[pdfbx-running]=1 \{\
+. if !r pdfbx-clear \
+. ll \\n[pdfbx-ll]u
+. \}
+. el .ll \\n[#DOC_L_LENGTH]u
+. ta \\n[.l]u
+. \}
+. \}
+. if '\\$1'CLEAR' \{\
+. if \\n[pdfbx-running]=1 \{\
+. if !r pdfbx-clear \
+. ll \\n[#L_LENGTH]u-(\\*[wt\\n[stack]]+\\*[gap\\n[stack]]u)
+. \}
+. rr #R_INDENT
+. rr #INDENT_STYLE_RIGHT
+. \}
+.END
+\#
+.MAC IBX END
+. br
+. in 0
+. rr #INDENT_ACTIVE
+. rr #INDENT_BOTH_ACTIVE
+. ie \\n[#TAB_ACTIVE] .TAB\\n[#CURRENT_TAB]
+. el \{\
+. ie \\n[#COLUMNS] \{\
+. ll \\n[#COL_L_LENGTH]u
+. ta \\n[.l]u
+. \}
+. el \{\
+. ll \\n[#L_LENGTH]u
+. ta \\n[.l]u
+. \}
+. \}
+. 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 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
+. rr #INDENT_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[.l]u
+. \}
+. el \{\
+. ll \\n[#L_LENGTH]u
+. ta \\n[.l]u
+. \}
+. \}
+. \}
+. 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[.l]u
+. \}
+. el \{\
+. ll \\n[#L_LENGTH]u
+. ta \\n[.l]u
+. \}
+. \}
+. \}
+. 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[.l]u
+. \}
+. el \{\
+. ll \\n[#L_LENGTH]u
+. ta \\n[.l]u
+. \}
+. \}
+. \}
+. 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[.l]u
+. \}
+. el \{\
+. ll \\n[#L_LENGTH]u
+. ta \\n[.l]u
+. \}
+. \}
+. \}
+. 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
+. \}
+.END
+\#
+\# =====================================================================
+\#
+\# +++HANGING CHARACTERS+++
+\#
+\# LEFT_HANG hangs its argument to the left of the left margin.
+\# If enclosed in double-quotes, the argument may contain local
+\# horizontal motions. Input text after LEFT_HANG must begin
+\# by repeating the text of the argument including horizontal
+\# motions. If the hung character is a left double-quote,
+\# \[lq] must be used in the argument and the usual keyboard
+\# double-quote (") used for the input text (so as not to confuse
+\# SMARTQUOTES).
+\#
+\# HANG is called inline with \*[HANG <character>]. Hangs its
+\# single-character argument, typically a punctuation mark, to the
+\# right of the right margin in justified copy. Unlike LEFT_HANG,
+\# does not require repeating the character as part of input text.
+\#
+\# Except for hung hyphens, HANG may be used mid-line in input
+\# text. Hung hyphens must come at the end of input lines. If
+\# the hung character is a right double-quote, "\[rq]" must be
+\# used as the argument (that is, the rq character surrounded by
+\# double-quotes). The double-quotes are required for all special
+\# characters that have the form \[c].
+\#
+.MAC LEFT_HANG END
+. nr hang-char-width \w'\\$1'
+. ds hang-char-gutter \\$2
+. ie '\\*[hang-char-gutter]'' \
+. nr hang-char \\n[hang-char-width]
+. el \
+. nr hang-char \\n[hang-char-width]+\\*[hang-char-gutter]
+\h'-\\n[hang-char]u'\c
+.END
+\#
+.MAC HANG END
+\c
+.if '\\$1'\[rq]' .nr #OPEN_CLOSE 0
+\c
+\&\\$1\c
+\h'-\w'\\$1'u'\c
+.END
+\#
+\# =====================================================================
+\#
+\# +++MULTIPLE COLUMNS+++
+\#
+\# MULTIPLE COLUMNS ON
+\# -------------------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Marks the top of a column set
+\#
+.MAC MCO END
+. mk c
+.END
+\#
+\# MULTIPLE COLUMN RETURN
+\# ----------------------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Returns to the top of a column set
+\#
+.MAC MCR END
+. vpt 0
+. sp |\\n[c]u
+. vpt
+.END
+\#
+\# MULTIPLE COLUMNS OFF
+\# --------------------
+\# *Arguments:
+\# <none> | <lead to advance beneath bottom of deepest column>
+\# *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
+. vpt 0
+. ie '\\$1'' \{\
+. if '\\n[.z]'FLOAT*DIV' \!.TQ
+. TQ
+. sp |\\n[.h]u
+. \}
+. el \{\
+. nr #MCX_ALD (\\$1)
+. TQ
+. ie \\n[#MCX_ALD]=0 .sp |\\n[.h]u-1v
+. el .sp |\\n[.h]u+\\n[#MCX_ALD]u
+. rr #MCX_ALD
+. \}
+. vpt
+.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 encloses the offending lines in TRAP OFF/TRAP.
+\#
+.MAC TRAP END
+. ie '\\$1'' .vpt
+. el .vpt 0
+.END
+\#
+\# SILENT
+\# ------
+\# *Arguments:
+\# <none> | <anything>
+\# *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
+\#
+\# Numbered strings for while loop in SMALLCAPS.
+\#
+.ds $c1 a
+.ds $c2 b
+.ds $c3 c
+.ds $c4 d
+.ds $c5 e
+.ds $c6 f
+.ds $c7 g
+.ds $c8 h
+.ds $c9 i
+.ds $c10 j
+.ds $c11 k
+.ds $c12 l
+.ds $c13 m
+.ds $c14 n
+.ds $c15 o
+.ds $c16 p
+.ds $c17 q
+.ds $c18 r
+.ds $c19 s
+.ds $c20 t
+.ds $c21 u
+.ds $c22 v
+.ds $c23 w
+.ds $c24 x
+.ds $c25 y
+.ds $c26 z
+.ds $c27 \[`a]
+.ds $c28 \[^a]
+.ds $c29 \['a]
+.ds $c30 \[:a]
+.ds $c31 \[oa]
+.ds $c32 \[~a]
+.ds $c33 \[ae]
+.ds $c34 \[`e]
+.ds $c35 \[^e]
+.ds $c36 \['e]
+.ds $c37 \[:e]
+.ds $c38 \[`i]
+.ds $c39 \[^i]
+.ds $c40 \['i]
+.ds $c41 \[:i]
+.ds $c42 \[`o]
+.ds $c43 \[^o]
+.ds $c44 \['o]
+.ds $c45 \[:o]
+.ds $c46 \[~o]
+.ds $c47 \[/o]
+.ds $c48 \[`u]
+.ds $c49 \[^u]
+.ds $c50 \['u]
+.ds $c51 \[:u]
+.ds $c52 \[,c]
+.ds $c53 \[Sd]
+.ds $c54 \[~n]
+.ds $c55 \[Sd]
+.ds $c56 \[Tp]
+.ds $c57 \['y]
+.ds $c58 \[:y]
+\#
+.ds $C1 A
+.ds $C2 B
+.ds $C3 C
+.ds $C4 D
+.ds $C5 E
+.ds $C6 F
+.ds $C7 G
+.ds $C8 H
+.ds $C9 I
+.ds $C10 J
+.ds $C11 K
+.ds $C12 L
+.ds $C13 M
+.ds $C14 N
+.ds $C15 O
+.ds $C16 P
+.ds $C17 Q
+.ds $C18 R
+.ds $C19 S
+.ds $C20 T
+.ds $C21 U
+.ds $C22 V
+.ds $C23 W
+.ds $C24 X
+.ds $C25 Y
+.ds $C26 Z
+.ds $C27 \[`A]
+.ds $C28 \[^A]
+.ds $C29 \['A]
+.ds $C30 \[:A]
+.ds $C31 \[oA]
+.ds $C32 \[~A]
+.ds $C33 \[AE]
+.ds $C34 \[`E]
+.ds $C35 \[^E]
+.ds $C36 \['E]
+.ds $C37 \[:E]
+.ds $C38 \[`I]
+.ds $C39 \[^I]
+.ds $C40 \['I]
+.ds $C41 \[:I]
+.ds $C42 \[`O]
+.ds $C43 \[^O]
+.ds $C44 \['O]
+.ds $C45 \[:O]
+.ds $C46 \[~O]
+.ds $C47 \[/O]
+.ds $C48 \[`U]
+.ds $C49 \[^U]
+.ds $C50 \['U]
+.ds $C51 \[:U]
+.ds $C52 \[,C]
+.ds $C53 \[-D]
+.ds $C54 \[~N]
+.ds $C55 \[-D]
+.ds $C56 \[TP]
+.ds $C57 \['Y]
+.ds $C58 \[:Y]
+\#
+\# CAPS
+\# ----
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Converts text to caps, or, if OFF, reverts to normal caps/lc.
+\# *Notes:
+\# For inline control of capitalization style, use \*[UC] and
+\# \*[LC].
+\#
+.MAC CAPS END
+. ie '\\$1'' \{\
+. LC_TO_CAPS
+. nr #CAPS_ON 1
+. \}
+. el \{\
+. CAPS_TO_LC
+. rr #CAPS_ON
+. \}
+.END
+\#
+.MAC UC END
+\c
+. LC_TO_CAPS
+. nr #CAPS_ON 1
+.END
+\#
+.MAC LC END
+\c
+. CAPS_TO_LC
+. rr #CAPS_ON
+.END
+\#
+\# Perform lowercase conversion to caps or revert to lowercase
+\#
+.MAC CONVERT_CASE END
+. if '\\$0'LC_TO_CAPS' \{\
+. nr #LOOP 0 1
+. while \\n+[#LOOP]<=58 \{\
+. tr \\*[$c\\n[#LOOP]]\\*[$C\\n[#LOOP]]
+. \}
+. \}
+. if '\\$0'CAPS_TO_LC' \{\
+. nr #LOOP 0 1
+. while \\n+[#LOOP]<=58 \{\
+. tr \\*[$c\\n[#LOOP]]\\*[$c\\n[#LOOP]]
+. \}
+. \}
+.END
+.
+.ALIAS LC_TO_CAPS CONVERT_CASE
+.ALIAS CAPS_TO_LC CONVERT_CASE
+.
+\#
+\# SMALLCAPS
+\# ---------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Converts text to smallcaps, or, if <anything>, reverts to normal
+\# caps/lc.
+\# *Notes:
+\# SMALLCAPS has no inline escape eqiv. to \*[UC].
+\#
+.MAC SMALLCAPS END
+. if \\n[#PRINT_STYLE]=2 \{\
+. if !\\n[.u] \
+. if \\n[.int] .nop \& \c
+. nr sc*size \\n[.ps]*\\n[sc*factor]/1000
+. if \\n[sc*wt-adj] .nr sc*wt-adj-factor \\n[sc*size]*\\n[sc*wt-adj]/1000
+. if \\n[sc*extend] .nr sc*extend-factor \\n[sc*size]*\\n[sc*extend]/1000
+. ie '\\$1'' \{\
+. nr #SMALLCAPS_ON 1
+. nr #LOOP 0 1
+. while \\n+[#LOOP]<=58 \{\
+. char \\*[$c\\n[#LOOP]] \
+\Z'\s[\\n[sc*size]u+\\n[sc*extend-factor]u]\H'-\\n[sc*extend-factor]u'\
+\\*[$C\\n[#LOOP]]'\
+\h'\\n[sc*wt-adj-factor]u'\\*[$C\\n[#LOOP]]\s[0]
+. \}
+. \}
+. el \{\
+. nr #LOOP 0 1
+. while \\n+[#LOOP]<=58 \{\
+. rchar \\*[$c\\n[#LOOP]]
+. \}
+. rr sc*wt-adj-factor
+. rr sc*extend-factor
+. rr #SMALLCAPS_ON
+. \}
+. \}
+.END
+\#
+\# SMALLCAPS_SIZE
+\# --------------
+\# *Arguments:
+\# <size> [ <weight adjustment>
+\# *Function:
+\# Sets registers 'sc*factor', 'sc*wt-adj', and sc*extend.
+\# *Notes:
+\# Weight adjustment pseudo-emboldens small caps to visually match the
+\# weight of the larger real caps.
+\#
+\# Both sc*factor (size) and sc*wt-adj (weight adjustment) args are
+\# expressed as percentages of type size.
+\#
+.MAC SMALLCAPS_STYLE END
+. nr #LOOP 0 1
+. while \\n+[#LOOP]<=\\n[#NUM_ARGS] \{\
+. if '\\$1'SIZE' \{\
+. shift
+. nr sc*factor (z;\\$1)/100
+. shift
+. \}
+. if '\\$1'WEIGHT_ADJ' \{\
+. shift
+. nr sc*wt-adj (z;\\$1)/100
+. shift
+. \}
+. if '\\$1'EXTEND' \{\
+. shift
+. nr sc*extend (z;\\$1)/100
+. shift
+. \}
+. \}
+. if \\n[sc*wt-adj]=0 .rr sc*wt-adj
+. if \\n[sc*extend]=0 .rr sc*extend
+.END
+.
+.SMALLCAPS_STYLE \
+SIZE 74 \
+WEIGHT_ADJ .3 \
+EXTEND 5
+\#
+\# SIZESPECS
+\# ---------
+\# Argument:
+\# <none>
+\# 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
+. if !'\\n[.z]'' \
+. if \\n[dn] .nr saved-dn \\n[dn]
+. di TYPESIZE
+E\R'#CAP_HEIGHT \\n[.cht]'
+e\R'#X_HEIGHT \\n[.cht]'
+y\R'#DESCENDER \\n[.cdp]'
+. br
+. ds $CAP_HEIGHT \\n[#CAP_HEIGHT]u
+. ds $X_HEIGHT \\n[#X_HEIGHT]u
+. ds $DESCENDER \\n[#DESCENDER]u
+. di
+. if !'\\n[.z]'' \
+. nr dn \\n[saved-dn]
+.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 FONT FT
+.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
+\# ===============================================
+\#
+\# DOC_MACRO_ERROR
+\# ---------------
+\# *Arguments:
+\# None.
+\# *Function:
+\# Warning message if DOC_<PARAMETER> called before START.
+\#
+.MAC DOC_MACRO_ERROR END
+. if '\\$1'DOC_L_MARGIN' .ds $REPLACEMENT L_MARGIN
+. if '\\$1'DOC_R_MARGIN' .ds $REPLACEMENT R_MARGIN
+. if '\\$1'DOC_LINE_LENGTH' .ds $REPLACEMENT LL
+. if '\\$1'DOC_FAMILY' .ds $REPLACEMENT "FAMILY or FAM
+. if '\\$1'DOC_PT_SIZE' .ds $REPLACEMENT PT_SIZE
+. if '\\$1'DOC_LEAD' .ds $REPLACEMENT LS
+. if '\\$1'DOC_QUAD' .ds $REPLACEMENT QUAD
+. tm1 "[mom]: \\$1 at line \\n[.c] of '\\n[.F]' should not be used before START.
+. tm1 " Use \\*[$REPLACEMENT] instead.
+. ab [mom]: Aborting.
+.END
+\#
+\# +++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.
+\# *Notes:
+\# LANDSCAPE may be given after papersize arg.
+\#
+.MAC PAPER END
+. vs 0
+. 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 '\\$2'LANDSCAPE' \{\
+. nr #PAGE_WIDTH_TMP \\n[#PAGE_WIDTH]
+. PAGEWIDTH \\n[#PAGE_LENGTH]u
+. PAGELENGTH \\n[#PAGE_WIDTH_TMP]u
+. as $PAPER " LANDSCAPE\"
+. \}
+. if !r#L_MARGIN .L_MARGIN \\n[.o]
+. if !r#R_MARGIN .R_MARGIN \\n[#PAGE_WIDTH]u-\\n[#L_MARGIN]u-1i
+. if '\\*[.T]'pdf' .br
+. vs
+.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 \{\
+. if '\\$1'TYPESET' \{\
+. pl 1
+. ab [mom]: Terminal output requires PRINTSTYLE TYPEWRITE. Aborting.
+. \}
+. \}
+. if !\\n[#COLLATE]=1 \{\
+. if !d$PAPER \{\
+. PAGELENGTH 11i
+. PAGEWIDTH 8.5i
+. \}
+. if '\\$1'TYPEWRITE' \{\
+. nr #PRINT_STYLE 1
+. if !\\n[#DOC_TYPE]=4 \{\
+. L_MARGIN 6P
+. R_MARGIN 6P
+. \}
+. ds $TYPEWRITER_FAM C
+. ds $TYPEWRITER_PS 12
+. TYPEWRITER
+. color 0
+. ie '\\$2'SINGLESPACE' \{\
+. nr #SINGLE_SPACE 1
+. vs 12
+. ie \\n[#DOC_TYPE]=4 .nr #FOOTER_ADJ \\n[.v]
+. el .nr #FOOTER_ADJ \\n[.v]
+. nr #ORIGINAL_DOC_LEAD \\n[.v]
+. \}
+. el \{\
+. if !\\n[#DOC_TYPE]=4 \{\
+. vs 24
+. nr #FOOTER_ADJ \\n[.v]/2
+. nr #ORIGINAL_DOC_LEAD \\n[.v]
+. \}
+. \}
+. QUAD L
+. HY OFF
+. SMARTQUOTES OFF
+. if !\\n[#PP_INDENT] .nr #PP_INDENT 3P
+. HDRFTR_RIGHT_CAPS
+. nr #BOLDER_UNITS 0
+. nr #CONDENSE 0
+. nr #EXTEND 0
+. if !\\n[#ITALIC_MEANS_ITALIC] \{\
+. rm IT
+. rm PREV
+. UNDERLINE_ITALIC
+. \}
+. rm BD
+. rm BDI
+. if !\\n[#SLANT_MEANS_SLANT] .UNDERLINE_SLANT
+. if !\\n[#UNDERLINE_QUOTES] .UNDERLINE_QUOTES
+. nr #IGNORE_COLUMNS 1
+. nr #RULE_WEIGHT 500
+. char \[em] --
+. tr `'
+. tr \[lq]"
+. tr \[rq]"
+. \}
+. if '\\$1'TYPESET' \{\
+. nr #PRINT_STYLE 2
+. if !\\n[#DOC_TYPE]=5 \{\
+. if !\\n[#DOC_TYPE]=4 \{\
+. L_MARGIN 6P
+. R_MARGIN 6P
+. \}
+. \}
+. FAMILY T
+. FT R
+. if !\\n[#DOC_TYPE]=4 .ps 12.5
+. if !\\n[#DOC_TYPE]=4 .vs 16
+.\" In DEFAULTS, TRAPS is run with this leading, so we need a register to
+.\" hold it for use with the .sp in FOOTER
+. nr #FOOTER_ADJ 12000
+. 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
+. \}
+.\" Set up default style for nine levels of headings
+. nr #HD_LEVEL 0 1 \" loop step
+. nr #LOOP 9 \" loop count
+. while \\n+[#HD_LEVEL]<=\\n[#LOOP] \{\
+. HEADING_STYLE \\n[#HD_LEVEL] \
+ FONT B \
+ SIZE +0 \
+ QUAD L \
+ NEEDS 1 \
+ COLOR black
+.\" Set up default style for nine levels of TOC headings
+. TOC_ENTRY_STYLE \\n[#HD_LEVEL] \
+ FONT R \
+ SIZE +0 \
+ COLOR black
+. \}
+.\" Set up decreasing sizes for headings levels 1 - 3, starting at +3
+. nr #HD_LEVEL 0 1 \" loop step
+. nr #LOOP 3 \" loop count
+. nr #HD_SIZE 4 1
+. while \\n+[#HD_LEVEL]<=\\n[#LOOP] \{\
+. nr #HD_SIZE_CHANGE \\n-[#HD_SIZE]
+. ds $HEAD_\\n[#HD_LEVEL]_SIZE +\\n[#HD_SIZE_CHANGE]
+. \}
+.\" Set up TOC title style
+. TOC_TITLE_STYLE FONT R SIZE +0 INDENT 0
+.\" Set up captions, labels, sources
+. LABELS ALL FONT B AUTOLEAD 2
+. LABELS EQN FONT R QUAD RIGHT
+. CAPTIONS ALL AUTOLEAD 2
+. CAPTIONS EQN QUAD CENTER
+. SOURCES TBL AUTOLEAD 2
+. \}
+.END
+\#
+\# Set limited parameters to TYPEWRITE.
+\#
+.MAC TYPEWRITER_FAMILY END
+. ds $TYPEWRITER_FAM \\$1
+.END
+\#
+.ALIAS TYPEWRITER_FAM TYPEWRITER_FAMILY
+\#
+.MAC TYPEWRITER_SIZE END
+. ds $TYPEWRITER_PS \\$1
+.END
+\#
+.MAC TYPEWRITER END
+. fam \\*[$TYPEWRITER_FAM]
+. ft R
+. ps \\*[$TYPEWRITER_PS]
+.END
+\#
+\# ITALIC MEANS ITALIC
+\# -------------------
+\# *Argument:
+\# <none>
+\# *Function:
+\# Instructs TYPEWRITE to treat italics as italics, whether
+\# invoked via control lines or inline.
+\# *Notes:
+\# ITALIC_MEANS_ITALIC and UNDERLINE_ITALIC are mutually 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 \Ef[R]
+. ds IT \Ef[I]
+. ds PREV \Ef[]
+. \}
+.END
+\#
+\# UNDERLINE ITALIC
+\# ----------------
+\# *Argument:
+\# <none>
+\# *Function:
+\# Instructs TYPEWRITE to underline italics, whether invoked
+\# via control lines or inline.
+\# *Notes:
+\# UNDERLINE_ITALIC and ITALIC_MEANS_ITALIC are mutually 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 \f[P]\E*[ULX]
+. \}
+.END
+\#
+\# UNDERLINE SLANT
+\# ---------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Instructs TYPEWRITE to underline occurrences 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 mutually 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 '\\*[$CHAPTER_STRING]'' .CHAPTER_STRING "Chapter"
+. if '\\*[$DRAFT_STRING]'' .DRAFT_STRING "Draft"
+. if '\\*[$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 \\n[#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_1]'' \
+. ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE]
+. el .ds $HDRFTR_CENTER \\*[$CHAPTER_STRING]
+. \}
+. el \{\
+. ie !'\\*[$CHAPTER_TITLE_1]'' \
+. ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE]
+. el .ds $HDRFTR_CENTER \\*[$CHAPTER_STRING] \\*[$CHAPTER]
+. \}
+. \}
+. el \{\
+. ie '\\*[$REVISION]'' \{\
+. ie '\\*[$CHAPTER]'' \{\
+. ie !'\\*[$CHAPTER_TITLE_1]'' \{\
+. 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_1]'' \{\
+. ie '\\*[$DRAFT]'' \
+. ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE]
+. el \{\
+. ds $HDRFTR_CENTER \
+ \\*[$CHAPTER_TITLE_1], \
+ \\*[$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_1]'' \{\
+. 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_1]'' \{\
+. 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 \\n[#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_1]'' \
+. ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE]
+. el \
+. ds $HDRFTR_CENTER \\*[$CHAPTER_STRING]
+. \}
+. el \{\
+. ie !'\\*[$CHAPTER_TITLE_1]'' \
+. 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 \\n[#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 (reference macros, metadata)+++
+\#
+\# *Arguments:
+\# various string/register arguments
+\# *Function:
+\# Set strings and registers for covers, docheaders, page headers.
+\#
+.MAC DOCTITLE END
+. rr #DOCTITLE_NUM
+. nr #DOCTITLE_NUM 0 1
+. while \\n[#NUM_ARGS]>\\n[#DOCTITLE_NUM] \{\
+. ds $DOCTITLE_\\n+[#DOCTITLE_NUM] \\$\\n[#DOCTITLE_NUM]
+. \}
+. ds $DOCTITLE \\$*
+. PDF_TITLE \\*[$DOCTITLE]
+.END
+\#
+.MAC TITLE END \"Document title
+. if '\\$1'DOC_COVER' \{\
+. shift
+. DOC_COVERTITLE \\$@
+. return
+. \}
+. if '\\$1'COVER' \{\
+. shift
+. COVERTITLE \\$@
+. return
+. \}
+. ie \\n[#NUM_ARGS]=0 \{\
+. if \\n[#TITLE_NUM] \{\
+. nr #ITEM 0 1
+. while \\n[#TITLE_NUM]>\\n[#ITEM] \{\
+. rm $TITLE_\\n+[#ITEM]
+. \}
+. rr #TITLE_NUM
+. \}
+. \}
+. el \{\
+. nr #TITLE_NUM 0 1
+. while \\n[#NUM_ARGS]>\\n[#TITLE_NUM] \{\
+. ds $TITLE_\\n+[#TITLE_NUM] \\$\\n[#TITLE_NUM]
+. \}
+. ds $TITLE \\$*
+. \}
+.END
+\#
+.MAC SUBTITLE END \"Document sub-title
+. ie \\n[#NUM_ARGS]=0 \{\
+. if \\n[#DOC_COVER_SUBTITLE_NUM] \
+. ds COVER_ DOC_COVER_
+. if \\n[#COVER_SUBTITLE_NUM] \
+. ds COVER_ COVER_
+. if \\n[#\\*[COVER_]SUBTITLE_NUM] \{\
+. nr #ITEM 0 1
+. while \\n[#\\*[COVER_]SUBTITLE_NUM]>\\n[#ITEM] \{\
+. rm $\\*[COVER_]SUBTITLE_\\n+[#ITEM]
+. \}
+. rr #\\*[COVER_]SUBTITLE_NUM
+. rm $SUBTITLE
+. \}
+. \}
+. el \{\
+. if '\\$1'DOC_COVER' \{\
+. ds COVER_ DOC_COVER_
+. shift
+. \}
+. if '\\$1'COVER' \{\
+. ds COVER_ COVER_
+. shift
+. \}
+. nr #\\*[COVER_]SUBTITLE_NUM 0 1
+. while \\n[#NUM_ARGS]>\\n[#\\*[COVER_]SUBTITLE_NUM] \{\
+. ds $\\*[COVER_]SUBTITLE_\\n+[#\\*[COVER_]SUBTITLE_NUM] \
+\\$\\n[#\\*[COVER_]SUBTITLE_NUM]
+. \}
+. rm COVER_
+. ds $SUBTITLE \\$*
+. \}
+.END
+\#
+.MAC CHAPTER END \"If document is a chapter, the chapter number
+. nr #CHAPTER_CALLED 1
+. ds $CHAPTER \\$1
+. if \B'\\*[$CHAPTER]' .nr #CH_NUM \\*[$CHAPTER]
+. if !r #CH_NUM .nr #CH_NUM 1
+.END
+.
+.MAC CHAPTER_NUMBER END
+. nr #CH_NUM \\$1
+.END
+\#
+.MAC CHAPTER_TITLE END \" This defines what comes after Chapter #
+. ie \\n[#NUM_ARGS]=0 \{\
+. if \\n[#CHAPTER_TITLE_NUM] \{\
+. nr #ITEM 0 1
+. while \\n[#CHAPTER_TITLE_NUM]>\\n[#ITEM] \{\
+. rm $CHAPTER_TITLE_\\n+[#ITEM]
+. \}
+. rr #CHAPTER_TITLE_NUM
+. rm $CHAPTER_TITLE
+. \}
+. \}
+. el \{\
+. rr #CHAPTER_TITLE_NUM
+. nr #CHAPTER_TITLE_NUM 0 1
+. while \\n[#NUM_ARGS]>\\n[#CHAPTER_TITLE_NUM] \{\
+. ds $CHAPTER_TITLE_\\n+[#CHAPTER_TITLE_NUM] \
+\\$\\n[#CHAPTER_TITLE_NUM]
+. \}
+. ds $CHAPTER_TITLE \\$*
+. \}
+.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.
+. rr #NO_PRINT_AUTHOR
+. if '\\$1'DOC_COVER' \{\
+. ds COVER_ DOC_COVER_
+. shift
+. \}
+. if '\\$1'COVER' \{\
+. ds COVER_ COVER_
+. shift
+. \}
+. nr #\\*[COVER_]AUTHOR_NUM 0 1
+. while \\n[#NUM_ARGS]>\\n[#\\*[COVER_]AUTHOR_NUM] \{\
+. ds $\\*[COVER_]AUTHOR_\\n+[#\\*[COVER_]AUTHOR_NUM] \
+\\$\\n[#\\*[COVER_]AUTHOR_NUM]
+. if !'\\*[$\\*[COVER_]AUTHOR_\\n[#\\*[COVER_]AUTHOR_NUM]]'' \
+. as $AUTHORS \
+"\\*[$\\*[COVER_]AUTHOR_\\n[#\\*[COVER_]AUTHOR_NUM]], \"
+. \}
+. ds $AUTHOR \\*[$AUTHOR_1]
+. substring $AUTHORS 0 -2
+. ds PDF_AUTHORS \\*[$AUTHORS]
+. pdfmomclean PDF_AUTHORS
+. nop \!x X ps:exec [/Author (\\*[PDF_AUTHORS]) /DOCINFO pdfmark
+.END
+.
+.ALIAS EDITOR AUTHOR
+\#
+.MAC COPYRIGHT END \"For use on cover pages only
+. ie \\n[#NUM_ARGS]=1 \
+. ds $COVER_COPYRIGHT \[co]\\$1
+. el \{\
+. if '\\$1'COVER' .ds $COVER_COPYRIGHT \[co]\\$2
+. if '\\$1'DOC_COVER' .ds $DOC_COVER_COPYRIGHT \[co]\\$2
+. \}
+.END
+\#
+.MAC COPYRIGHT_V_ADJUST END
+. ds $COPYRIGHT_V_ADJ \\$1
+.END
+\#
+.MAC MISC END \"Doc cover and cover pages only; enclose all args in double quotes
+. rm COVER_
+. ie \\n[#NUM_ARGS]=0 \{\
+. if \\n[#DOC_COVER_MISC_LINES] \
+. ds COVER_ DOC_COVER_
+. if \\n[#COVER_MISC_LINES] \
+. ds COVER_ COVER_
+. if \\n[#\\*[COVER_]MISC_LINES] \{\
+. nr #LINE 0 1
+. while \\n[#\\*[COVER_]MISC_LINES]>\\n[#LINE] \{\
+. rm $\\*[COVER_]MISC_\\n+[#LINE]
+. \}
+. rr #\\*[COVER_]MISC_LINES
+. \}
+. \}
+. el \{\
+. if '\\$1'DOC_COVER' \{\
+. ds COVER_ DOC_COVER_
+. shift
+. \}
+. if '\\$1'COVER' \{\
+. ds COVER_ COVER_
+. shift
+. \}
+. nr #\\*[COVER_]MISC_LINE 0 1
+. while \\n[#NUM_ARGS]>\\n[#\\*[COVER_]MISC_LINE] \{\
+. ds $\\*[COVER_]MISC_\\n+[#\\*[COVER_]MISC_LINE] \
+\\$[\\n[#\\*[COVER_]MISC_LINE]]
+. \}
+. nr #\\*[COVER_]MISC_LINES \\n[#NUM_ARGS]
+. rm COVER_
+. \}
+.END
+\#
+\# Page number that appears on page one.
+.MAC PAGENUMBER END
+. 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
+\#
+\# Replacement string for pagenumber.
+.MAC PAGENUMBER_STRING END
+. ds $PAGENUM_STRING \\$1
+.END
+\#
+\# ====================================================================
+\#
+\# +++TYPE OF DOCUMENT+++
+\#
+\# DOCUMENT TYPE
+\# -------------
+\# *Argument:
+\# DEFAULT | CHAPTER | NAMED "<whatever> | LETTER
+\# *Function:
+\# Creates strings and sets registers for document types.
+\# *Notes:
+\# Number registers: DEFAULT=1, CHAPTER=2, NAMED=3, LETTER=4,
+\# SLIDES=5
+\#
+.MAC DOCTYPE END
+. if '\\$1'DEFAULT' .nr #DOC_TYPE 1
+. if '\\$1'CHAPTER' .nr #DOC_TYPE 2
+. if '\\$1'NAMED' \{\
+. rr #NO_PRINT_DOCTYPE
+. ds $DOC_TYPE \\$2
+. nr #DOC_TYPE 3
+. \}
+. if '\\$1'LETTER' \{\
+. nr #DOC_TYPE 4
+. L_MARGIN 1.125i
+. R_MARGIN 1.125i
+. ps 12
+. vs 13.5
+. nr #FOOTER_ADJ \\n[.v]
+. 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
+. \}
+. if '\\$1'SLIDES' \{\
+. shift
+. nr #DOC_TYPE 5
+. PRINTSTYLE TYPESET
+. FAMILY H
+. QUAD CENTER
+. QUOTE_STYLE QUAD CENTER
+. BLOCKQUOTE_STYLE \
+ QUAD J \
+ INDENT \\n[.l]u/5u
+. PARA_INDENT 0
+. NO_SHIM
+. NO_FLEX
+. HEADING_STYLE 1 \
+ SIZE +8 \
+ QUAD CENTER
+. HEADING_STYLE 2 \
+ SIZE +4 \
+ QUAD CENTER
+. HEADING_STYLE 3 \
+ SIZE +2 \
+ QUAD CENTER
+. DOCHEADER off
+. PAGINATION off
+. PAGENUM_HYPHENS off
+. HEADERS off
+. FOOTERS off
+. HEADERS_PLAIN
+. FOOTERS_PLAIN
+. nr loop-count 0 1
+. nr loop-counter \\n[#NUM_ARGS]
+.\" Default 16:9 setup if no ASPECT
+. PAGE 11i 6.1875i 36p 36p 80p 72p
+. PT_SIZE 14
+. AUTOLEAD 4
+. HEADER_SIZE -2
+. while \\n+[loop-count]<=\\n[loop-counter] \{\
+. if '\\$1'ASPECT' \{\
+. if '\\$2'4:3' \{\
+. PAGE 11i 8.25i 36p 36p 90p 84p
+. PT_SIZE 16
+. AUTOLEAD 6
+. HEADER_SIZE -3
+. \}
+. if '\\$2'16:9' \{\
+. PAGE 11i 6.1875i 36p 36p 80p 72p
+. PT_SIZE 14
+. AUTOLEAD 4
+. HEADER_SIZE -2
+. \}
+. shift 2
+. \}
+. if '\\$1'HEADER' \{\
+. shift 1
+. nr #SLIDE_HEADERS 1
+. ds $SLIDE_HDR_L \\$1
+. ds $SLIDE_HDR_C \\$2
+. ds $SLIDE_HDR_R \\$3
+. HEADER_MARGIN 45p
+. shift 3
+. \}
+. if '\\$1'FOOTER' \{\
+. shift 1
+. nr #SLIDE_FOOTERS 1
+. ds $SLIDE_FTR_L \\$1
+. ds $SLIDE_FTR_C \\$2
+. ds $SLIDE_FTR_R \\$3
+. shift 3
+. \}
+. if '\\$1'TRANSITION' \{\
+. shift 1
+. ds $TRANS_TYPE \\$1
+. shift 1
+. \}
+. if '\\$1'PAUSE' \{\
+. shift 1
+. ds $PAUSE_TYPE \\$1
+. shift 1
+. \}
+. \}
+. if d $TRANS_TYPE \
+. pdftransition PAGE \\*[$TRANS_TYPE]
+. if d $PAUSE_TYPE \
+. pdftransition BLOCK \\*[$PAUSE_TYPE]
+. \}
+. ie \\n[#SLIDE_HEADERS]+\\n[#SLIDE_FOOTERS]=2 \{\
+. HEADERS_AND_FOOTERS L "^\\*[$SLIDE_HDR_L]#\\*[$SLIDE_HDR_C]#\\*[$SLIDE_HDR_R]^" \
+ L "^\\*[$SLIDE_FTR_L]#\\*[$SLIDE_FTR_C]#\\*[$SLIDE_FTR_R]^"
+. \}
+. el \{\
+. if \\n[#SLIDE_HEADERS] \{\
+. HEADERS
+. HEADER_RECTO L "^\\*[$SLIDE_HDR_L]#\\*[$SLIDE_HDR_C]#\\*[$SLIDE_HDR_R]^" \
+. \}
+. if \\n[#SLIDE_FOOTERS] \{\
+. FOOTERS
+. FOOTER_RECTO L "^\\*[$SLIDE_FTR_L]#\\*[$SLIDE_FTR_C]#\\*[$SLIDE_FTR_R]^"
+. \}
+. \}
+.END
+\#
+\# +++LETTER MACROS+++
+\#
+\# First, create a register to hold incrementing numbers to be
+\# appended to LETTERHEAD.
+\#
+.nr #FIELD 0 1
+\#
+\# DATE
+\# ----
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Stores date (entered on the line after .DATE) in diversion
+\# LETTERHEAD<n>
+\#
+.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:
+\# <none>
+\# *Function:
+\# Stores addressee address (entered on the line after .TO) in
+\# diversion LETTERHEAD<n>
+\#
+.MAC TO END
+. if !'\\n[.z]'' .di
+. di LETTERHEAD\\n+[#FIELD]
+. LEFT
+.END
+\#
+\# FROM
+\# ----
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Stores addresser address (entered on the line after .FROM) in
+\# diversion LETTERHEAD<n>
+\#
+.MAC FROM END
+. if !'\\n[.z]'' .di
+. di LETTERHEAD\\n+[#FIELD]
+. LEFT
+.END
+\#
+\# GREETING
+\# --------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Stores greeting (entered on the line after .GREETING) in
+\# diversion LETTERHEAD<n>
+\#
+.MAC GREETING END
+. if !'\\n[.z]'' .di
+. di LETTERHEAD\\n+[#FIELD]
+. LEFT
+.END
+\#
+\# CLOSING
+\# -------
+\# *Arguments:
+\# <closing string>
+\# *Function:
+\# Stores greeting in diversion CLOSING.
+\#
+.MAC CLOSING END
+. if '\\*[$SIG_SPACE]'' .ds $SIG_SPACE 3v
+. ie ( (2v+\\*[$SIG_SPACE]) > \\n[.t] ) \{\
+. ie !\\n[@TOP] \{\
+. ch HEADER
+. ch FOOTER
+. br
+. tm1 "[mom]: Insufficient room for \\$0 and signature line.
+. ab [mom]: Terminating '\\n[.F]' before closing.
+. \}
+. el .sp
+. \}
+. el .br
+. nr #CLOSING 1
+. di CLOSING_TEXT
+.END
+\#
+\# CLOSING INDENT
+\# --------------
+\# *Argument:
+\# <amount to indent closing from left margin>
+\# *Function:
+\# Defines string $CLOSE_INDENT for use in macro, ALL_DONE.
+\#
+.MAC CLOSING_INDENT END
+. ds $CLOSE_INDENT \\$1
+.END
+\#
+\# SIGNATURE_SPACE
+\# ---------------
+\# *Argument:
+\# <amount of space to leave for signature>
+\# *Function:
+\# Defines string $SIG_SPACE for use in macro, ALL_DONE.
+\#
+.MAC SIGNATURE_SPACE END
+. ds $SIG_SPACE \\$1
+.END
+\#
+\# NO SUITE
+\# --------
+\# *Arguments:
+\# <none>
+\# *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 FOR DOCUMENT PROCESSING+++
+\#
+\# TYPE-STYLE CONTROL MACROS
+\# -------------------------
+\# The control macros for family, font, size, color and quad are
+\# here grouped together. Each (e.g., _FAMILY) uses the calling alias
+\# to determine the document element to which the style parameter
+\# applies. Defaults for all these guys are set in DEFAULTS, and
+\# listed in the "Control Macros" section of the documentation
+\# pertinent to the element whose style is to be changed.
+\#
+.MAC _FAMILY END
+. ds PARAM FAM
+. ds ELEMENT \\$0
+. if '\\$0'COPYRIGHT_FAMILY' \
+. ds ELEMENT COVER_COPYRIGHT_FAMILY
+. ds FROM_ALIAS \\$0
+. substring ELEMENT 0 -4 \" Strip 'ILY' from FAMILY
+. ASSIGN_ELEMENT \\$1
+.END
+\#
+.MAC _FONT END
+. ds PARAM FT
+. ds ELEMENT \\$0
+. ds FROM_ALIAS \\$0
+. if '\\$0'COPYRIGHT_FONT' \
+. ds ELEMENT COVER_COPYRIGHT_FONT
+. substring ELEMENT 0 -5
+. ds ELEMENT \\*[ELEMENT]FT \" ELEMENT is now \\$0_FT
+. ASSIGN_ELEMENT \\$1
+.END
+\#
+.MAC _SIZE END
+. ds PARAM SIZE_CHANGE
+. ds ELEMENT \\$0_CHANGE
+. if '\\$0'CODE_SIZE' \{\
+. ds PARAM SIZE_ADJ
+. ds ELEMENT \\$0_ADJ
+. \}
+. if '\\$0'COPYRIGHT_SIZE' \
+. ds ELEMENT COVER_COPYRIGHT_SIZE_CHANGE
+. ds FROM_ALIAS \\$0
+. ASSIGN_ELEMENT \\$1
+.END
+\#
+.MAC _COLOR END
+. if \\n[#PRINT_STYLE]=1 .return
+. ds PARAM COLOR
+. ds ELEMENT \\$0
+. if '\\$0'COPYRIGHT_COLOR' \
+. ds ELEMENT COVER_COPYRIGHT_COLOR
+. ds FROM_ALIAS \\$0
+. ASSIGN_ELEMENT \\$1
+.END
+\#
+.MAC _CAPS END
+. ds CAPS_TYPE \\$0
+. substring CAPS_TYPE 0 7
+. ds CALLED_AS \\$0
+. substring CALLED_AS -7
+. ie '\\*[CALLED_AS]'NO_CAPS' \{\
+. ie '\\*[CAPS_TYPE]'BIBLIOGR' \{\
+. if '\\$0'BIBLIOGRAPHY_HEADER_NO_CAPS' .rr #BIB_STRING_CAPS
+. if '\\$0'BIBLIOGRAPHY_STRING_NO_CAPS' .rr #BIB_STRING_CAPS
+. \}
+. el \{\
+. ie '\\*[CAPS_TYPE]'ENDNOTES' \{\
+. if '\\$0'ENDNOTES_HEADER_NO_CAPS' .rr #EN_STRING_CAPS
+. if '\\$0'ENDNOTES_STRING_NO_CAPS' .rr #EN_STRING_CAPS
+. \}
+. el \{\
+. ie '\\$0'TOC_HEADER_NO_CAPS' .rr #TOC_STRING_CAPS
+. el \{\
+. ds REGISTER_TYPE \\$0
+. substring REGISTER_TYPE 0 -8
+. as REGISTER_TYPE CAPS
+. rr #\\*[REGISTER_TYPE]
+. \}
+. \}
+. \}
+. \}
+. el \{\
+. ie '\\*[CAPS_TYPE]'BIBLIOGR' \{\
+. if '\\$0'BIBLIOGRAPHY_HEADER_CAPS' .nr #BIB_STRING_CAPS 1
+. if '\\$0'BIBLIOGRAPHY_STRING_CAPS' .nr #BIB_STRING_CAPS 1
+. \}
+. el .nr #\\$0 1
+. \}
+.END
+.
+.ALIAS _NO_CAPS _CAPS
+\#
+.MAC _SMALLCAPS END
+. ds SMALLCAPS_TYPE \\$0
+. substring SMALLCAPS_TYPE 0 7
+. ds CALLED_AS \\$0
+. substring CALLED_AS -12
+. ie '\\*[CALLED_AS]'NO_SMALLCAPS' \{\
+. ie '\\*[SMALLCAPS_TYPE]'BIBLIOGR' \{\
+. if '\\$0'BIBLIOGRAPHY_HEADER_NO_SMALLCAPS' .rr #BIB_STRING_SMALLCAPS
+. if '\\$0'BIBLIOGRAPHY_STRING_NO_SMALLCAPS' .rr #BIB_STRING_SMALLCAPS
+. \}
+. el \{\
+. ie '\\*[SMALLCAPS_TYPE]'ENDNOTES' \{\
+. if '\\$0'ENDNOTES_HEADER_NO_SMALLCAPS' .rr #EN_STRING_SMALLCAPS
+. if '\\$0'ENDNOTES_STRING_NO_SMALLCAPS' .rr #EN_STRING_SMALLCAPS
+. \}
+. el \{\
+. ie '\\$0'TOC_HEADER_NO_SMALLCAPS' .rr #TOC_STRING_SMALLCAPS
+. el \{\
+. ds REGISTER_TYPE \\$0
+. substring REGISTER_TYPE 0 -13
+. as REGISTER_TYPE SMALLCAPS
+. rr #\\*[REGISTER_TYPE]
+. \}
+. \}
+. \}
+. \}
+. el \{\
+. ie '\\*[SMALLCAPS_TYPE]'BIBLIOGR' \{\
+. if '\\$0'BIBLIOGRAPHY_HEADER_SMALLCAPS' .nr #BIB_STRING_SMALLCAPS 1
+. if '\\$0'BIBLIOGRAPHY_STRING_SMALLCAPS' .nr #BIB_STRING_SMALLCAPS 1
+. \}
+. el .nr #\\$0 1
+. \}
+.END
+.
+.ALIAS _NO_SMALLCAPS _SMALLCAPS
+\#
+.MAC _QUAD END
+. if '\\$0'BIBLIOGRAPHY_QUAD' \{\
+. if '\\$1'R' .QUAD-ERROR \\$0
+. if '\\$1'C' .QUAD-ERROR \\$0
+. \}
+. if '\\$0'ENDNOTE_QUAD' \{\
+. if '\\$1'R' .QUAD-ERROR \\$0
+. if '\\$1'C' .QUAD-ERROR \\$0
+. \}
+. if '\\$0'DOC_QUAD' \
+. if !\\n[#DOCS] .DOC_MACRO_ERROR \\$0
+. ds PARAM QUAD
+. ds ELEMENT \\$0
+. if '\\$0'COPYRIGHT_QUAD' \
+. ds ELEMENT COVER_COPYRIGHT_QUAD
+. ds FROM_ALIAS \\$0
+. ASSIGN_ELEMENT \\$1
+.END
+\#
+\# Special handling for QUOTE quadding
+\#
+.MAC QUOTE_QUAD END
+. ds $Q_QUAD \\$0
+. substring $Q_QUAD 6
+.END
+.
+.ALIAS QUOTE_LEFT QUOTE_QUAD
+.ALIAS QUOTE_CENTER QUOTE_QUAD
+.ALIAS QUOTE_RIGHT QUOTE_QUAD
+\#
+.MAC QUAD-ERROR END
+. tm1 "[mom]: \\$1 at line \\n[.c] of '\\n[.F]' must be set to either L or J.
+. ab [mom]: Aborting.
+.END
+\#
+.MAC ASSIGN_ELEMENT END
+. rm $\\*[ELEMENT] \" Clear this first
+.\" HDRFTR_<POSITION>_<PARAMETER> need special handling.
+. ds hdrftr \\*[FROM_ALIAS]
+. substring hdrftr 0 5
+. if '\\*[hdrftr]'HDRFTR' \{\
+. ds hdrftr-pos-element \\*[ELEMENT]
+.\" See if ELEMENT is of the form HDRFTR_<pos>_<param>
+. substring hdrftr-pos-element 0 7
+. substring hdrftr-pos-element -1
+. if !'\\*[ELEMENT]'HDRFTR_COLOR' \{\
+. if '\\*[hdrftr-pos-element]'L' .nr hdrftr-pos-element 1
+. if '\\*[hdrftr-pos-element]'C' .nr hdrftr-pos-element 1
+. if '\\*[hdrftr-pos-element]'R' .nr hdrftr-pos-element 1
+. \}
+. \}
+. if !\\n[hdrftr-pos-element] \{\
+. ds c1-c5 \\*[ELEMENT]
+. substring c1-c5 0 4 \" Grab first five letters of the alias
+. \}
+.\" If none of the following, convert the substring of the
+.\" calling alias, ie \*[ELEMENT], into the parameter string, e.g.,
+.\" $TITLE_FAM, assign arg, and set register.
+. if !'\\*[c1-c5]'BIBLI' \
+. if !'\\*[c1-c5]'BLOCK' \
+. if !'\\*[c1-c5]'CITAT' \
+. if !'\\*[c1-c5]'ENDNO' \
+. if !'\\*[c1-c5]'EPIGR' \
+. if !'\\*[c1-c5]'FOOTN' \
+. if !'\\*[c1-c5]'HDRFT' \
+. if !'\\*[c1-c5]'LINEN' \
+. if !'\\*[c1-c5]'PAGEN' \{\
+. ie '\\*[ELEMENT]'CODE_SIZE_ADJ' .nr #\\*[ELEMENT] \\$1
+. el \{\
+. ds $\\*[ELEMENT] \\$1
+. nr #\\*[ELEMENT] 1
+. \}
+. \}
+. if '\\*[$\\*[ELEMENT]]'' \{\
+. if '\\*[c1-c5]'BIBLI' .ASSIGN_PARAM BIB \\$1
+. if '\\*[c1-c5]'BLOCK' .ASSIGN_PARAM BQUOTE_ \\$1
+. if '\\*[c1-c5]'CITAT' .ASSIGN_PARAM BQUOTE_ \\$1
+. if '\\*[c1-c5]'ENDNO' .ASSIGN_PARAM EN \\$1
+. if '\\*[c1-c5]'EPIGR' .ASSIGN_PARAM EPI_ \\$1
+. if '\\*[c1-c5]'FOOTN' .ASSIGN_PARAM FN_ \\$1
+. if '\\*[c1-c5]'HDRFT' .ASSIGN_PARAM HDRFTR_ \\$1
+. if '\\*[c1-c5]'LINEN' .ASSIGN_PARAM LN_ \\$1
+. if '\\*[c1-c5]'PAGEN' .ASSIGN_PARAM PAGE_NUM_ \\$1
+. \}
+. if \\n[hdrftr-pos-element] \{\
+. if '\\*[hdrftr-pos-element]'L' .ds hdrftr-pos-element LEFT
+. if '\\*[hdrftr-pos-element]'C' .ds hdrftr-pos-element CENTER
+. if '\\*[hdrftr-pos-element]'R' .ds hdrftr-pos-element RIGHT
+. if '\\*[ELEMENT]'HDRFTR_\\*[hdrftr-pos-element]_FAM' \
+. ds $HDRFTR_\\*[hdrftr-pos-element]_FAM \\$1
+. \}
+. rr hdrftr-pos-element
+. rm hdrftr-pos-element
+.END
+\#
+.MAC ASSIGN_PARAM END
+. if '\\*[PARAM]'FAM' .nr substr-index -7
+. if '\\*[PARAM]'FT' .nr substr-index -5
+. if '\\*[PARAM]'SIZE_CHANGE' .nr substr-index -5
+. if '\\*[PARAM]'COLOR' .nr substr-index -6
+. if '\\*[PARAM]'QUAD' .nr substr-index -5
+. if '\\$1'BIB' \{\
+. ds ELEMENT \\*[FROM_ALIAS]
+. substring ELEMENT 12 \\n[substr-index]
+. if '\\*[ELEMENT]'_HEADER_' \
+. ds ELEMENT _STRING_
+. \}
+. if '\\$1'BQUOTE_' .rm ELEMENT
+. if '\\$1'EN' \{\
+. ds ELEMENT \\*[FROM_ALIAS]
+. substring ELEMENT 7 \\n[substr-index]
+. if '\\*[ELEMENT]'S_HEADER_' \
+. ds ELEMENT _STRING_
+. if '\\*[ELEMENT]'_LINENUMBER_' \
+. ds ELEMENT _LN_
+. \}
+. if '\\$1'EPI_' .rm ELEMENT
+. if '\\$1'FN_' .rm ELEMENT
+. if '\\$1'HDRFTR_' \{\
+. if '\\*[ELEMENT]'HDRFTR_FAM' \{\
+. nr #HDRFTR 1
+. ds $HDRFTR_FAM \\$2
+. ds $HDRFTR_LEFT_FAM \\$2
+. ds $HDRFTR_CENTER_FAM \\$2
+. ds $HDRFTR_RIGHT_FAM \\$2
+. \}
+. if '\\*[ELEMENT]'HDRFTR_COLOR' \{\
+. nr #HDRFTR 1
+. nr #HDRFTR_COLOR 1
+. ds $HDRFTR_COLOR \\$2
+. \}
+. if '\\*[ELEMENT]'HDRFTR_SIZE_CHANGE' \{\
+. nr #HDRFTR 1
+. ds $HDRFTR_SIZE_CHANGE \\$2
+. \}
+. if '\\*[PARAM]'SIZE_CHANGE' \{\
+. nr #HDRFTR 1
+. if '\\*[hdrftr-pos-element]'L' \
+. ds $HDRFTR_LEFT_SIZE_CHANGE \\$2
+. if '\\*[hdrftr-pos-element]'C' \
+. ds $HDRFTR_CENTER_SIZE_CHANGE \\$2
+. if '\\*[hdrftr-pos-element]'R' \
+. ds $HDRFTR_RIGHT_SIZE_CHANGE \\$2
+. \}
+. if !r #HDRFTR \{\
+. substring ELEMENT 7 \\n[substr-index]
+. if '\\*[ELEMENT]'_LEFT' .ds ELEMENT _STRING_
+. \}
+. \}
+. if '\\$1'LN_' .rm ELEMENT
+. if '\\$1'PAGE_NUM_' .rm ELEMENT
+. if !r #HDRFTR \{\
+. ds $\\$1\\*[ELEMENT]\\*[PARAM] \\$2
+. nr #\\$1\\*[ELEMENT]\\*[PARAM] 1
+. \}
+. rr #HDRFTR
+. rm hdrftr-pos-element
+. rr substr-index
+. rm FROM_ALIAS
+. rm ELEMENT
+.END
+\#
+.MAC TITLE_LEAD END
+. ds $TYPE \\$0
+. substring $TYPE 0 2
+. if '\\*[$TYPE]'DOC' .nr DOC_ 1
+. ds $TYPE \\$0
+. ie '\\*[$TYPE]'MISC_LEAD' .ds $TYPE COVER_MISC
+. el .substring $TYPE -6 0
+. ds $\\*[$TYPE]_LEAD \\$1
+. nr #\\*[$TYPE]_LEAD 1
+. rm $TYPE
+.END
+\#
+\# The _STYLE macro, called by various aliases, allows grouping
+\# style parameters for most document elements in a single macro
+\# using 'KEYWORD value' pairs.
+\#
+.MAC _STYLE END
+. SILENT \" Some of the invoked macros cause unwanted breaks
+. ds $STYLE_TYPE \\$0
+. substring $STYLE_TYPE 0 -7
+. ds $HDR_FTR \\*[$STYLE_TYPE]
+. length #HDR_FTR_STRING $HDR_FTR
+. if \\n[#HDR_FTR_STRING]<=5 .substring $HDR_FTR 0 5 \" HEADER or FOOTER
+. if '\\*[$HDR_FTR]'HEADER' .ds $HDR_FTR HEADER
+. if '\\*[$HDR_FTR]'FOOTER' .ds $HDR_FTR FOOTER
+. ds $POS \\$0
+. substring $POS 7 7
+. if '\\*[$POS]'L' .ds $POS LEFT
+. if '\\*[$POS]'C' .ds $POS CENTER
+. if '\\*[$POS]'R' .ds $POS RIGHT
+. if '\\*[$STYLE_TYPE]'\\*[$HDR_FTR]_\\*[$POS]' \{\
+. ds $\\*[$HDR_FTR]_\\*[$POS] \\*[$HDR_FTR]_\\*[$POS]
+. ds $STYLE_TYPE HDRFTR_\\*[$POS]
+. \}
+. if '\\*[$STYLE_TYPE]'ENDNOTES_HEADER' \
+. ds $BIB-EN-TOC EN_STRING
+. if '\\*[$STYLE_TYPE]'ENDNOTE_STRING' \
+. ds $BIB-EN-TOC EN_STRING
+. if '\\*[$STYLE_TYPE]'BIBLIOGRAPHY_HEADER' \
+. ds $BIB-EN-TOC BIB_STRING
+. if '\\*[$STYLE_TYPE]'BIBLIOGRAPHY_STRING' \
+. ds $BIB-EN-TOC BIB_STRING
+. if '\\*[$STYLE_TYPE]'TOC_HEADER' \
+. ds $BIB-EN-TOC TOC_STRING
+. if '\\*[$STYLE_TYPE]'PAGENUMBER' \
+. ds $STYLE_TYPE PAGENUM
+. nr #LOOP 0 1
+. nr #STYLE_PARAMS \\n[#NUM_ARGS]
+. while \\n+[#LOOP]<=\\n[#STYLE_PARAMS] \{\
+. if '\\$1'FAMILY' \{\
+. shift
+. \\*[$STYLE_TYPE]_FAMILY \\$1
+. shift
+. \}
+. if '\\$1'FONT' \{\
+. shift
+. \\*[$STYLE_TYPE]_FONT \\$1
+. shift
+. \}
+. if '\\$1'SIZE' \{\
+. shift
+. \\*[$STYLE_TYPE]_SIZE \\$1
+. shift
+. \}
+. if '\\$1'COLOR' \{\
+. shift
+. \\*[$STYLE_TYPE]_COLOR \\$1
+. shift
+. \}
+. if '\\$1'CAPS' \{\
+. if \\n[#\\*[$STYLE_TYPE]_SMALLCAPS] \{\
+. tm1 \
+"[mom]: '\\*[$STYLE_TYPE]_STYLE' contains CAPS and SMALLCAPS. \
+CAPS takes precedence.
+. rr #\\*[$STYLE_TYPE]_SMALLCAPS
+. \}
+. \\*[$STYLE_TYPE]_CAPS
+. if d $\\*[$HDR_FTR]_LEFT .HEADER_LEFT_CAPS
+. if d $\\*[$HDR_FTR]_CENTER .HEADER_CENTER_CAPS
+. if d $\\*[$HDR_FTR]_CENTRE .HEADER_CENTER_CAPS
+. if d $\\*[$HDR_FTR]_RIGHT .HEADER_RIGHT_CAPS
+. shift
+. \}
+. if '\\$1'NO_CAPS' \{\
+. nr #\\*[$STYLE_TYPE]_CAPS 0
+. if !'\\*[$BIB-EN-TOC]'' \
+. rr #\\*[$BIB-EN-TOC]_CAPS
+. shift
+. \}
+. if '\\$1'SMALLCAPS' \{\
+. if \\n[#\\*[$STYLE_TYPE]_CAPS] \{\
+. tm1 \
+"[mom]: '\\*[$STYLE_TYPE]_STYLE' contains CAPS and SMALLCAPS. \
+SMALLCAPS takes precedence.
+. rr #\\*[$STYLE_TYPE]_CAPS
+. \}
+. \\*[$STYLE_TYPE]_SMALLCAPS
+. shift
+. \}
+. if '\\$1'NO_SMALLCAPS' \{\
+. rr #\\*[$STYLE_TYPE]_SMALLCAPS
+. if !'\\*[$BIB-EN-TOC]'' \
+. rr #\\*[$BIB-EN-TOC]_SMALLCAPS
+. shift
+. \}
+. if '\\$1'LEAD' \{\
+. shift
+. \\*[$STYLE_TYPE]_LEAD \\$1
+. shift
+. \}
+. if '\\$1'AUTOLEAD' \{\
+. shift
+. \\*[$STYLE_TYPE]_AUTOLEAD \\$1
+. shift
+. \}
+. if '\\$1'SPACE' \{\
+. shift
+. \\*[$STYLE_TYPE]_SPACE \\$1
+. shift
+. \}
+. if '\\$1'QUAD' \{\
+. shift
+. ie '\\*[$STYLE_TYPE]'QUOTE' \{\
+. ds $QUAD_TYPE \\$1
+. substring $QUAD_TYPE 0 0
+. if '\\*[$QUAD_TYPE]'L' .QUOTE_LEFT
+. if '\\*[$QUAD_TYPE]'C' .QUOTE_CENTER
+. if '\\*[$QUAD_TYPE]'R' .QUOTE_RIGHT
+. \}
+. el .\\*[$STYLE_TYPE]_QUAD \\$1
+. shift
+. \}
+. if '\\$1'INDENT' \{\
+. shift
+. \\*[$STYLE_TYPE]_INDENT \\$1
+. shift
+. \}
+.\" UNDERLINE and UNDERSCORE are identical but we can't use : or &
+.\" in string comparisons.
+. if '\\$1'UNDERLINE' \{\
+. shift
+. if '\\$1'DOUBLE' \{\
+. as ul-args \\$1 \"
+. shift
+. \}
+. nr #COUNT 0 1
+. while \\n+[#COUNT]<=3 \{\
+. if \B'\\$1' \{\
+. as ul-args \\$1 \"
+. shift
+. \}
+. \}
+. \\*[$STYLE_TYPE]_UNDERSCORE \\*[ul-args]
+. \}
+. if '\\$1'UNDERSCORE' \{\
+. shift
+. if '\\$1'DOUBLE' \{\
+. as ul-args \\$1 \"
+. shift
+. \}
+. nr #COUNT 0 1
+. while \\n+[#COUNT]<=3 \{\
+. if \B'\\$1' \{\
+. as ul-args \\$1 \"
+. shift
+. \}
+. \}
+. \\*[$STYLE_TYPE]_UNDERSCORE \\*[ul-args]
+. \}
+. if '\\$1'NO_UNDERSCORE' \{\
+. rr #\\*[$STYLE_TYPE]_UNDERLINE
+. if !'\\*[$BIB-EN-TOC]'' \
+. rr #\\*[$BIB-EN-TOC]_UNDERLINE
+. shift
+. \}
+. if '\\$1'NO_UNDERLINE' \{\
+. rr #\\*[$STYLE_TYPE]_UNDERLINE
+. if !'\\*[$BIB-EN-TOC]'' \
+. rr #\\*[$BIB-EN-TOC]_UNDERLINE
+. shift
+. \}
+. if '\\$1'V_ADJUST' \{\
+. shift
+. COPYRIGHT_V_ADJUST \\$1
+. shift
+. \}
+. \}
+. rm $STYLE_TYPE
+. rm $HDR_FTR
+. rm $POS
+. rm $HEADER_LEFT
+. rm $HEADER_CENTER
+. rm $HEADER_RIGHT
+. rm $BIB-EN-TOC
+. rm ul-args
+. SILENT off
+.END
+.
+.ds STYLE_TYPE_1 ATTRIBUTE
+.ds STYLE_TYPE_2 AUTHOR
+.ds STYLE_TYPE_3 BIBLIOGRAPHY_HEADER
+.ds STYLE_TYPE_4 BIBLIOGRAPHY_STRING
+.ds STYLE_TYPE_5 BLOCKQUOTE
+.ds STYLE_TYPE_6 CHAPTER
+.ds STYLE_TYPE_7 CHAPTER_TITLE
+.ds STYLE_TYPE_8 CODE
+.ds STYLE_TYPE_9 COPYRIGHT
+.ds STYLE_TYPE_10 COVER
+.ds STYLE_TYPE_11 COVERTITLE
+.ds STYLE_TYPE_12 DOC_COVERTITLE
+.ds STYLE_TYPE_13 DOCHEADER
+.ds STYLE_TYPE_14 DOCTITLE
+.ds STYLE_TYPE_15 DOCTYPE
+.ds STYLE_TYPE_16 ENDNOTE_TITLE
+.ds STYLE_TYPE_17 ENDNOTES_HEADER
+.ds STYLE_TYPE_18 ENDNOTE_STRING
+.ds STYLE_TYPE_19 EPIGRAPH
+.ds STYLE_TYPE_20 FINIS
+.ds STYLE_TYPE_21 FOOTER_LEFT
+.ds STYLE_TYPE_22 FOOTER_CENTER
+.ds STYLE_TYPE_23 FOOTER_CENTRE
+.ds STYLE_TYPE_24 FOOTER_RIGHT
+.ds STYLE_TYPE_25 FOOTNOTE
+.ds STYLE_TYPE_26 HEADER_LEFT
+.ds STYLE_TYPE_27 HEADER_CENTER
+.ds STYLE_TYPE_28 HEADER_CENTRE
+.ds STYLE_TYPE_29 HEADER_RIGHT
+.ds STYLE_TYPE_30 LEAD
+.ds STYLE_TYPE_31 LINENUMBER
+.ds STYLE_TYPE_32 MISC
+.ds STYLE_TYPE_33 QUOTE
+.ds STYLE_TYPE_34 PAGENUMBER
+.ds STYLE_TYPE_35 SUBTITLE
+.ds STYLE_TYPE_36 TITLE
+.ds STYLE_TYPE_37 TOC_HEADER
+.
+.nr #LOOP 0 1
+.while \n+[#LOOP]<=37 \{\
+. ALIAS \*[STYLE_TYPE_\n[#LOOP]]_STYLE _STYLE
+. ALIAS COVER_\*[STYLE_TYPE_\n[#LOOP]]_STYLE _STYLE
+. ALIAS DOC_COVER_\*[STYLE_TYPE_\n[#LOOP]]_STYLE _STYLE
+.\}
+\#
+\# UNDERLINE CONTROL
+\# -----------------
+\# *Arguments:
+\# [ DOUBLE ] [ <underline weight> [<underline gap>] ] | <none> | <anything>
+\# *Function:
+\# Toggles underlining of the element indicated by the calling alias
+\# on or off. Uses #<element>_UNDERLINE_WEIGHT to set the weight,
+\# and defines string $<element>_UNDERLINE_GAP.
+\#
+.MAC _UNDERLINE END
+. ds $GET_TITLE_TYPE \\$0
+. substring $GET_TITLE_TYPE -2
+. ie '\\*[$GET_TITLE_TYPE]'NE' \{\
+.\" Called as _UNDERLINE
+. ds $GET_TITLE_TYPE \\$0
+. substring $GET_TITLE_TYPE 0 -10
+. ds $TITLE_TYPE \\*[$GET_TITLE_TYPE]
+. \}
+. el \{\
+.\" Called as _UNDERSCORE
+. ds $GET_TITLE_TYPE \\$0
+. substring $GET_TITLE_TYPE 0 -11
+. ds $TITLE_TYPE \\*[$GET_TITLE_TYPE]
+. \}
+. ds $GET_TITLE_TYPE \\$0
+. substring $GET_TITLE_TYPE 0 2
+. if '\\*[$GET_TITLE_TYPE]'BIB' .ds $TITLE_TYPE BIB_STRING_
+. if '\\*[$GET_TITLE_TYPE]'SUB' .ds $TITLE_TYPE SUBTITLE_
+. ds $GET_TITLE_TYPE \\$0
+. substring $GET_TITLE_TYPE 0 7
+. if '\\*[$GET_TITLE_TYPE]'ENDNOTES' .ds $TITLE_TYPE EN_STRING_
+. ds $GET_TITLE_TYPE \\$0
+. substring $GET_TITLE_TYPE 0 10
+. if '\\*[$GET_TITLE_TYPE]'ENDNOTE_STR' .ds $TITLE_TYPE EN_STRING_
+. if '\\*[$GET_TITLE_TYPE]'ENDNOTE_TIT' .ds $TITLE_TYPE EN_TITLE_
+. ie '\\$1'' .nr #\\*[$TITLE_TYPE]UNDERLINE 1
+. el \{\
+. ie \\n[#NUM_ARGS]=1 \{\
+. ie \B'\\$1' \{\
+. if !\\n[#PRINT_STYLE]=1 \{\
+. \\*[$TITLE_TYPE]UNDERLINE_WEIGHT \\$1
+. nr #\\*[$TITLE_TYPE]UNDERLINE 1
+. \}
+. \}
+. el \{\
+. ie '\\$1'DOUBLE' .nr #\\*[$TITLE_TYPE]UNDERLINE 2
+. el .nr #\\*[$TITLE_TYPE]UNDERLINE 0
+. \}
+. \}
+. el \{\
+. if !\\n[#PRINT_STYLE]=1 \{\
+. nr #\\*[$TITLE_TYPE]UNDERLINE 1
+. if '\\$1'DOUBLE' \{\
+. nr #\\*[$TITLE_TYPE]UNDERLINE 2
+. shift
+. \}
+. \\*[$TITLE_TYPE]UNDERLINE_WEIGHT \\$1
+. if !'\\$2'' \
+. ds $\\*[$TITLE_TYPE]UNDERLINE_GAP \\$2
+. if !'\\$3'' \
+. ds $\\*[$TITLE_TYPE]RULE_GAP \\$3
+. \}
+. \}
+. \}
+. rm $TITLE_TYPE
+.END
+.
+.ALIAS ENDNOTE_STRING_UNDERLINE _UNDERLINE
+.ALIAS ENDNOTE_STRING_UNDERSCORE _UNDERLINE
+\#
+\# DEFAULTS
+\# --------
+\# *Arguments:
+\# <none>
+\# *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 !\\n[#DOC_TYPE]=5 \{\
+. ie !d $PAPER \{\
+. PAGEWIDTH \\n[#PAGE_WIDTH]u
+. PAGELENGTH \\n[.p]u
+. \}
+. el .PAPER \\*[$PAPER]
+. \}
+. if !\\n[#DOC_TYPE] .DOCTYPE DEFAULT
+. if !r #CH_NUM .nr #CH_NUM 1
+. 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 !r #HEADER_MARGIN .HEADER_MARGIN 4P+6p
+. if !r #HEADER_GAP .HEADER_GAP 3P
+. if \\n[#FOOTERS_ON] \{\
+. HEADERS OFF
+. ie \\n[#PAGINATE] \
+. if \\n[#PAGE_NUM_POS_SET]=0 .PAGENUM_POS TOP CENTER
+. el \
+. if !\\n[#T_MARGIN] .T_MARGIN 6P
+. \}
+. if !\\n[#HEADERS_ON] \{\
+. if !\\n[#FOOTERS_ON] \{\
+. ie \\n[#PAGE_NUM_V_POS]=1 \{\
+. HEADER_MARGIN \\n[#HEADER_MARGIN]
+. HEADER_GAP \\n[#HEADER_GAP]
+. \}
+. el .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[#HEADER_RULE_GAP] .HEADER_RULE_GAP 4p
+. if !\\n[#FOOTER_RULE_GAP] .FOOTER_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])
+. ie !'\\*[$SAVED_DOC_FAM]'' \{\
+. ds $DOC_FAM \\*[$SAVED_DOC_FAM]
+. rm $SAVED_DOC_FAM
+. \}
+. el .ds $DOC_FAM \\*[$FAMILY]
+. ie !r #DOC_PT_SIZE .nr #DOC_PT_SIZE \\n[#PT_SIZE]
+. el \
+. if !\\n[#DOC_PT_SIZE]=\\n[#PT_SIZE] \
+. nr #DOC_PT_SIZE \\n[#PT_SIZE]
+. if \\n[#TOC] .nr #DOC_PT_SIZE \\n[#TOC_PS]
+. if \\n[#ENDNOTES] .nr #DOC_PT_SIZE \\n[#EN_PS]
+. if \\n[#BIBLIOGRAPHY] .nr #DOC_PT_SIZE \\n[#BIB_PS]
+. if \
+(\\n[#TOC]=0)&\
+(\\n[#LIST_OF_FIGURES]=0)&\
+(\\n[#LIST_OF_TABLES]=0)&\
+(\\n[#LIST_OF_EQUATIONS]=0) \
+. nr #DOC_LEAD \\n[.v]
+. nr #DOC@LEAD \\n[#DOC_LEAD]
+. if \\n[#AUTO_LEAD] .nr #DOC_AUTOLEAD \\n[#AUTOLEAD_VALUE]
+.\" #SAVED_DOC_LEAD is set in COLLATE
+. if \\n[#SAVED_DOC_LEAD] \{\
+. if \
+(\\n[#TOC]=0)&\
+(\\n[#LIST_OF_FIGURES]=0)&\
+(\\n[#LIST_OF_TABLES]=0)&\
+(\\n[#LIST_OF_EQUATIONS]=0) \{\
+. ie !\\n[#DOC_LEAD]=\\n[#SAVED_DOC_LEAD] .nr #RERUN_TRAPS 1
+. el .nr #SKIP_TRAPS 1
+. \}
+. \}
+. ie \\n[#ADJ_DOC_LEAD]=1 .
+. el \
+. if !\\n[#DOC_LEAD_ADJUST_OFF] .DOC_LEAD_ADJUST
+. ie d$RESTORE_DOC_QUAD \{\
+. ds $DOC_QUAD \\*[$RESTORE_DOC_QUAD]
+. rm $RESTORE_DOC_QUAD
+. \}
+. el .ds $DOC_QUAD \\*[$QUAD_VALUE]
+. if '\\*[$FONT]'' .FT R
+. if '\\*[$PP_FT]'' .ds $PP_FT \\*[$FONT]
+. FT \\*[$PP_FT]
+.\" 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
+.\" Enable shimming if user hasn't turned it off
+. if \\n[#NO_SHIM]=2 \{\
+. rr #NO_SHIM
+. nr #NO_FLEX 1
+. \}
+.\" General style defaults for both PRINTSTYLEs
+. nr #PP_STYLE 1
+. PARA_INDENT \\n[#PP_INDENT]u
+. if !d $HDRFTR_FAM .ds $HDRFTR_FAM \\*[$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 \
+. if !d$PAGENUM_STRING .PAGENUM_HYPHENS
+. 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_MARKERS]=1 \{\
+. if \\n[#FN_REF]=1 \
+. if !\\n[#FN_MARKER_STYLE] .FOOTNOTE_MARKER_STYLE NUMBER
+. if !\\n[#FN_MARKER_STYLE] .FOOTNOTE_MARKER_STYLE STAR
+. \}
+. if !r #EN_MARKER_STYLE .ENDNOTE_MARKER_STYLE SUPERSCRIPT
+. 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 \{\
+. ds quad-check \\*[$DOC_QUAD]
+. substring quad-check 0 0
+. if '\\*[$DOC_QUAD]'C' .nr quad-check 1
+. if '\\*[$DOC_QUAD]'R' .nr quad-check 1
+. ie \\n[quad-check] .ENDNOTE_QUAD J
+. el .ENDNOTE_QUAD \\*[$DOC_QUAD]
+. rr quad-check
+. \}
+. if !d $EN_STRING .ENDNOTES_HEADER_STRING "Endnotes"
+. if !d $EN_STRING_FAM .ENDNOTES_HEADER_FAMILY \\*[$EN_FAM]
+. if !d $EN_STRING_QUAD .ENDNOTES_HEADER_QUAD CENTER
+. if !d $EN_TITLE \{\
+. ie \\n[#DOC_TYPE]=2 \{\
+. ie !'\\*[$CHAPTER_TITLE_1]'' \{\
+. ie '\\*[$CHAPTER]'' .ENDNOTE_TITLE "\\*[$CHAPTER_TITLE]"
+. el .ENDNOTE_TITLE \
+"\\*[$CHAPTER_STRING] \\*[$CHAPTER]: \\*[$CHAPTER_TITLE]"
+. \}
+. el \{\
+. 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 !d $EN_NUMBER_FAM .ENDNOTE_NUMBER_FAMILY \\*[$EN_FAM]
+. if !d $EN_LN_FAM .ENDNOTE_LINENUMBER_FAMILY \\*[$EN_FAM]
+. if !r #EN_NUMBERS_ALIGN_LEFT \{\
+. if !r #EN_NUMBERS_ALIGN_RIGHT \{\
+. ie !\\n[#EN_MARKER_STYLE]=2 .ENDNOTE_NUMBERS_ALIGN RIGHT 2
+. el .ENDNOTE_NUMBERS_ALIGN RIGHT 4
+. \}
+. \}
+. if !r #EN_LN_GAP .ENDNOTE_LINENUMBER_GAP 1m
+. if !r #EN_ALLOWS_HEADERS .ENDNOTES_ALLOWS_HEADERS
+. 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 \{\
+. ds quad-check \\*[$DOC_QUAD]
+. substring quad-check 0 0
+. if '\\*[$DOC_QUAD]'C' .nr quad-check 1
+. if '\\*[$DOC_QUAD]'R' .nr quad-check 1
+. ie \\n[quad-check] .BIBLIOGRAPHY_QUAD J
+. el .BIBLIOGRAPHY_QUAD \\*[$DOC_QUAD]
+. rr quad-check
+. \}
+. 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 !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
+.\" Line numbering
+. if !r #LN_GUTTER .nr #LN_GUTTER 2
+. if !r #Q_LN_GUTTER .nr #Q_LN_GUTTER 2
+. if !r #BQ_LN_GUTTER .nr #BQ_LN_GUTTER 2
+. if !d $LN_FAM .ds $LN_FAM \\*[$DOC_FAM]
+. if !d $LN_FT .ds $LN_FT R
+. if !d $LN_SIZE_CHANGE .ds $LN_SIZE_CHANGE +0
+. if !d $LN_COLOR .ds $LN_COLOR black
+.\" PDF link colour
+. if !\\n[PDFHREF_COLOR_SET] .PDF_LINK_COLOR 0.0 0.3 0.9
+.\" PDF frame
+. if !d pdf-img:frame-weight .ds pdf-img:frame-weight .5
+. if !d pdf-img:frame-color .ds pdf-img:frame-color black
+.\" Captions, labels, sources
+.\" All at default doc specs except leading, which is autolead 2
+. nr label-type-counter 0 1
+. while \\n+[label-type-counter]<=5 \{\
+. if \\n[label-type-counter]=1 .ds label-type eqn
+. if \\n[label-type-counter]=2 .ds label-type pdf-img
+. if \\n[label-type-counter]=3 .ds label-type pic
+. if \\n[label-type-counter]=4 .ds label-type tbl
+. if \\n[label-type-counter]=5 .ds label-type floating
+. nr spec-type-counter 0 1
+. while \\n+[spec-type-counter]<=3 \{\
+. if \\n[spec-type-counter]=1 .ds spec-type label
+. if \\n[spec-type-counter]=2 .ds spec-type caption
+. if \\n[spec-type-counter]=3 .ds spec-type source
+. set-defaults
+. set-inline-specs
+. \}
+. rm label-type
+. rm spec-type
+. \}
+.\" String defaults for both PRINTSTYLEs
+. ie \\n[#DOC_TYPE]=1 \{\
+. ie '\\*[$DOCTITLE]'' \{\
+. if \\n[#USER_DEF_HDRFTR_LEFT]=0 .ds $HDRFTR_LEFT \\*[$AUTHOR_1]
+. if \\n[#USER_DEF_HDRFTR_RIGHT]=0 .ds $HDRFTR_RIGHT \\*[$TITLE]
+. \}
+. el \{\
+. if \\n[#COPY_STYLE]=1 .DRAFT_WITH_PAGENUMBER
+. if \\n[#USER_DEF_HDRFTR_LEFT]=0 .ds $HDRFTR_LEFT \\*[$AUTHOR_1]
+. if \\n[#USER_DEF_HDRFTR_CENTER]=0 .ds $HDRFTR_CENTER \\*[$TITLE]
+. if \\n[#USER_DEF_HDRFTR_RIGHT]=0 .ds $HDRFTR_RIGHT \\*[$DOCTITLE]
+. \}
+. \}
+. el \{\
+. if \\n[#USER_DEF_HDRFTR_LEFT]=0 .ds $HDRFTR_LEFT \\*[$AUTHOR_1]
+. if \\n[#USER_DEF_HDRFTR_RIGHT]=0 .ds $HDRFTR_RIGHT \\*[$TITLE]
+. \}
+. if !d $ATTRIBUTE_STRING .ds $ATTRIBUTE_STRING by
+. if !d $FINIS_STRING .FINIS_STRING "End"
+. if !r #FINIS_STRING_CAPS .nr #FINIS_STRING_CAPS 1
+.\" 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 $MISC_QUAD .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 \{\
+. TYPEWRITER
+. SS DEFAULT
+. if \\n[#UNDERLINE_QUOTES]=1 .UNDERLINE_QUOTES
+. if \\n[#UNDERLINE_QUOTES]=0 .UNDERLINE_QUOTES OFF
+. if !\\n[#HDRFTR_PLAIN] \{\
+. if !r #HDRFTR_RIGHT_CAPS .nr #HDRFTR_RIGHT_CAPS 1
+. if \\n[#HDRFTR_RIGHT_CAPS]=0 \
+. if !d $HDRFTR_RIGHT_SIZE_CHANGE .HDRFTR_RIGHT_SIZE +0
+. \}
+.\" +Doctype underlining (if NAMED)
+. if !r #DOCTYPE_UNDERLINE .nr #DOCTYPE_UNDERLINE 1
+.\" +Quotes and blockquotes
+. if !r #Q_OFFSET_VALUE \
+. if '\\*[$Q_OFFSET_VALUE]'' \
+. QUOTE_INDENT \\n[#PP_INDENT]u+(\\n[#PP_INDENT]u/2u)
+. if !d $Q_QUAD .QUOTE_LEFT
+. if !d $BQUOTE_QUAD .BLOCKQUOTE_QUAD LEFT
+. if !r #BQ_OFFSET_VALUE \
+. if '\\*[$BQ_OFFSET_VALUE]'' \
+. BLOCKQUOTE_INDENT \\n[#PP_INDENT]u+(\\n[#PP_INDENT]u/2u)
+.\" +Epigraphs
+. if !r #EPI_OFFSET_VALUE \
+. if '\\*[$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
+.\" +Endnotes
+. if !r #EN_PP_INDENT .ENDNOTE_PARA_INDENT \\n[#PP_INDENT]
+. if !r #EN_STRING_CAPS .ENDNOTES_HEADER_CAPS
+. if !r #EN_STRING_UNDERLINE .nr #EN_STRING_UNDERLINE 2
+.\" +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
+. \}
+.\" +Bibliography
+. if !r #BIB_STRING_UNDERLINE .nr #BIB_STRING_UNDERLINE 2
+. if !r #BIB_STRING_CAPS .BIBLIOGRAPHY_STRING_CAPS
+. \}
+.\" Defaults for printstyle TYPESET
+. if \\n[#PRINT_STYLE]=2 \{\
+. if !d $DOCHEADER_LEAD_ADJ .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
+.\" (doctitle)
+. if !d $COVER_DOCTITLE_FAM \{\
+. ie !d $DOC_COVER_FAM .COVER_DOCTITLE_FAMILY \\*[$DOC_FAM]
+. el .COVER_DOCTITLE_FAMILY \\*[$COVER_FAM]
+. \}
+. if !d $COVER_DOCTITLE_FT .COVER_DOCTITLE_FONT B
+. if !d $COVER_DOCTITLE_SIZE_CHANGE .COVER_DOCTITLE_SIZE +3.5
+.\" (covertitle)
+. if !d $COVER_COVERTITLE_FAM \{\
+. ie !d $COVER_FAM .COVER_COVERTITLE_FAMILY \\*[$DOC_FAM]
+. el .COVER_COVERTITLE_FAMILY \\*[$COVER_FAM]
+. \}
+. if !d $COVER_COVERTITLE_FT .COVER_COVERTITLE_FONT B
+. if !d $COVER_COVERTITLE_SIZE_CHANGE .COVER_COVERTITLE_SIZE +3.5
+.\" (doc_covertitle)
+. if !d $COVER_DOC_COVERTITLE_FAM \{\
+. ie !d $COVER_FAM .COVER_DOC_COVERTITLE_FAMILY \\*[$DOC_FAM]
+. el .COVER_DOC_COVERTITLE_FAMILY \\*[$COVER_FAM]
+. \}
+. if !d $COVER_DOC_COVERTITLE_FT .COVER_DOC_COVERTITLE_FONT B
+. if !d $COVER_DOC_COVERTITLE_SIZE_CHANGE .COVER_DOC_COVERTITLE_SIZE +3.5
+.\" (chapter)
+. if !d $COVER_CHAPTER_FAM \{\
+. ie !d $COVER_FAM .COVER_CHAPTER_FAMILY \\*[$DOC_FAM]
+. el .COVER_CHAPTER_FAMILY \\*[$COVER_FAM]
+. \}
+. if !d $COVER_CHAPTER_FT .COVER_CHAPTER_FONT B
+. if !d $COVER_CHAPTER_SIZE_CHANGE .COVER_CHAPTER_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_ATTRIBUTE_FAM \{\
+. ie !d $COVER_FAM .COVER_ATTRIBUTE_FAMILY \\*[$DOC_FAM]
+. el .COVER_ATTRIBUTE_FAMILY \\*[$COVER_FAM]
+. \}
+. if !d $COVER_ATTRIBUTE_FT .COVER_ATTRIBUTE_FONT I
+. if !d $COVER_ATTRIBUTE_SIZE_CHANGE .COVER_ATTRIBUTE_SIZE +0
+. 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
+.\" (misc)
+. if !d $COVER_MISC_FAM .COVER_MISC_FAMILY \\*[$DOC_FAM]
+. if !d $COVER_MISC_FT .COVER_MISC_FONT R
+. if !d $COVER_MISC_SIZE_CHANGE .COVER_MISC_SIZE -2
+. if !r #COVER_MISC_LEAD .COVER_MISC_LEAD 14.5
+.\" +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
+.\" (doctitle)
+. if !d $DOC_COVER_DOCTITLE_FAM \{\
+. ie !d $DOC_COVER_FAM .DOC_COVER_DOCTITLE_FAMILY \\*[$DOC_FAM]
+. el .DOC_COVER_DOCTITLE_FAMILY \\*[$DOC_COVER_FAM]
+. \}
+. if !d $DOC_COVER_DOCTITLE_FT .DOC_COVER_DOCTITLE_FONT B
+. if !d $DOC_COVER_DOCTITLE_SIZE_CHANGE .DOC_COVER_DOCTITLE_SIZE +3.5
+.\" (covertitle)
+. if !d $DOC_COVER_COVERTITLE_FAM \{\
+. ie !d $COVER_FAM .DOC_COVER_COVERTITLE_FAMILY \\*[$DOC_FAM]
+. el .DOC_COVER_COVERTITLE_FAMILY \\*[$COVER_FAM]
+. \}
+. if !d $DOC_COVER_COVERTITLE_FT .DOC_COVER_COVERTITLE_FONT B
+. if !d $DOC_COVER_COVERTITLE_SIZE_CHANGE .DOC_COVER_COVERTITLE_SIZE +3.5
+.\" (doc_covertitle)
+. if !d $DOC_COVER_DOC_COVERTITLE_FAM \{\
+. ie !d $COVER_FAM .DOC_COVER_DOC_COVERTITLE_FAMILY \\*[$DOC_FAM]
+. el .DOC_COVER_DOC_COVERTITLE_FAMILY \\*[$COVER_FAM]
+. \}
+. if !d $DOC_COVER_DOC_COVERTITLE_FT .DOC_COVER_DOC_COVERTITLE_FONT B
+. if !d $DOC_COVER_DOC_COVERTITLE_SIZE_CHANGE .DOC_COVER_DOC_COVERTITLE_SIZE +3.5
+.\" (chapter)
+. if !d $DOC_COVER_CHAPTER_FAM \{\
+. ie !d $DOC_COVER_FAM .DOC_COVER_CHAPTER_FAMILY \\*[$DOC_FAM]
+. el .DOC_COVER_CHAPTER_FAMILY \\*[$DOC_COVER_FAM]
+. \}
+. if !d $DOC_COVER_CHAPTER_FT .DOC_COVER_CHAPTER_FONT B
+. if !d $DOC_COVER_CHAPTER_SIZE_CHANGE .DOC_COVER_CHAPTER_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_ATTRIBUTE_FAM \{\
+. ie !d $DOC_COVER_FAM .DOC_COVER_ATTRIBUTE_FAMILY \\*[$DOC_FAM]
+. el .DOC_COVER_ATTRIBUTE_FAMILY \\*[$DOC_COVER_FAM]
+. \}
+. if !d $DOC_COVER_ATTRIBUTE_FT .DOC_COVER_ATTRIBUTE_FONT I
+. if !d $DOC_COVER_ATTRIBUTE_SIZE_CHANGE .DOC_COVER_ATTRIBUTE_SIZE +0
+. 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
+.\" (misc)
+. if !d $DOC_COVER_MISC_FAM .DOC_COVER_MISC_FAMILY \\*[$DOC_FAM]
+. if !d $DOC_COVER_MISC_FT .DOC_COVER_MISC_FONT R
+. if !d $DOC_COVER_MISC_SIZE_CHANGE .DOC_COVER_MISC_SIZE -2
+. if !r #DOC_COVER_MISC_LEAD .DOC_COVER_MISC_LEAD 14.5
+.\" +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
+.\" Title size change
+. if !d $TITLE_SIZE_CHANGE \{\
+. ie \\n[#DOC_TYPE]=2 .TITLE_SIZE +4
+. el .TITLE_SIZE +3.5
+. \}
+. if !d $CHAPTER_FAM \{\
+. ie !d $DOCHEADER_FAM .CHAPTER_FAMILY \\*[$DOC_FAM]
+. el .CHAPTER_FAMILY \\*[$DOCHEADER_FAM]
+. \}
+. if !d $CHAPTER_FT .CHAPTER_FONT B
+. if !d $CHAPTER_SIZE_CHANGE .CHAPTER_SIZE +4
+. 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 $ATTRIBUTE_FAM \{\
+. ie !d $DOCHEADER_FAM .ATTRIBUTE_FAMILY \\*[$DOC_FAM]
+. el .ATTRIBUTE_FAMILY \\*[$DOCHEADER_FAM]
+. \}
+. if !d $ATTRIBUTE_FT .ATTRIBUTE_FONT I
+. if !d $ATTRIBUTE_SIZE_CHANGE .ATTRIBUTE_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 !\\n[#HDRFTR_PLAIN] \{\
+. 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
+. ie !r #HDRFTR_RIGHT_CAPS \{\
+. nr #HDRFTR_RIGHT_CAPS 1
+. if !d $HDRFTR_RIGHT_SIZE_CHANGE \
+. HDRFTR_RIGHT_SIZE -2
+. \}
+. el \{\
+. if \\n[#HDRFTR_RIGHT_CAPS]=0 \
+. if !d $HDRFTR_RIGHT_SIZE_CHANGE \
+. HDRFTR_RIGHT_SIZE -.5
+. \}
+. ie !\\n[#HDRFTR_RIGHT_SMALLCAPS] \{\
+. if \\n[#HDRFTR_RIGHT_CAPS] \
+. if !d $HDRFTR_RIGHT_SIZE_CHANGE \
+. HDRFTR_RIGHT_SIZE -2
+. \}
+. el \{\
+. nr #SKIP_CAPS_SMALLCAPS_WARNING 1
+. if \\n[#HDRFTR_RIGHT_CAPS] .HDRFTR_RIGHT_CAPS OFF
+. \}
+. if !d $HDRFTR_RIGHT_SIZE_CHANGE .HDRFTR_RIGHT_SIZE -.5
+. \}
+.\" +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 \
+. if '\\*[$Q_OFFSET_VALUE]'' .QUOTE_INDENT 3
+. if !d $Q_QUAD .QUOTE_LEFT
+.\" +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
+. if !r #BQ_OFFSET_VALUE \
+. if '\\*[$BQ_OFFSET_VALUE]'' .BLOCKQUOTE_INDENT 3
+.\" +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 \
+. if '\\*[$EPI_OFFSET_VALUE]'' .EPIGRAPH_INDENT 3
+.\" +Linebreaks
+. if !d $LINEBREAK_CHAR .LINEBREAK_CHAR * 3 3p
+. if !d $LINEBREAK_COLOR .LINEBREAK_COLOR black
+.\" +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 .ENDNOTES_HEADER_FONT B
+. if !d $EN_STRING_SIZE_CHANGE .ENDNOTES_HEADER_SIZE +3.5
+. 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_LN_FT .ENDNOTE_LINENUMBER_FONT R
+. if !d $EN_NUMBER_SIZE_CHANGE .ENDNOTE_NUMBER_SIZE +0
+. if !d $EN_LN_SIZE_CHANGE .ENDNOTE_LINENUMBER_SIZE +0
+. if !r #EN_PP_INDENT .ENDNOTE_PARA_INDENT 1.5m
+. if !d $EN_SPACE .ENDNOTE_SPACING 0
+.\" +Bibliography
+. if !r #BIB_LIST .BIBLIOGRAPHY_TYPE PLAIN
+. 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 +3.5
+.\" +Table of contents
+. if !d $TOC_FAM .TOC_FAMILY \\*[$DOC_FAM]
+. if !r #TOC_PS .TOC_PT_SIZE (\\n[#DOC_PT_SIZE]u)
+. if '\\*[$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 +3.5
+. if !d $TOC_HEADER_FT .TOC_HEADER_FONT B
+. if !d $TOC_PN_FAM .TOC_PN_FAMILY \\*[$TOC_FAM]
+. if !d $TOC_PN_FT .TOC_PN_FONT R
+. if !d $TOC_PN_SIZE_CHANGE .TOC_PN_SIZE +0
+. if !d $TOC_TITLE_FAM .TOC_TITLE_FAMILY \\*[$TOC_FAM]
+. \}
+.\" +Refer support
+. if !r #EN_REF .nr #FN_REF 1
+. if !d $REF_FN_INDENT \{\
+. if \\n[#PRINT_STYLE]=1 .INDENT_REFS FOOTNOTE .5i
+. if \\n[#PRINT_STYLE]=2 .INDENT_REFS FOOTNOTE 2m
+. \}
+. if !d $REF_EN_INDENT \{\
+. if \\n[#PRINT_STYLE]=1 .INDENT_REFS ENDNOTE .5i
+. if \\n[#PRINT_STYLE]=2 .INDENT_REFS ENDNOTE 2m
+. \}
+. if !d $REF_BIB_INDENT \{\
+. if \\n[#PRINT_STYLE]=1 .INDENT_REFS BIBLIO .5i
+. if \\n[#PRINT_STYLE]=2 .INDENT_REFS BIBLIO 2m
+. \}
+.\" Define strings for idem entries
+. if \\n[#PRINT_STYLE]=1 .char \[idem] \[hy]\[hy]\[hy]
+. if \\n[#PRINT_STYLE]=2 .char \[idem] \v'-.3m'\l'3m'\v'.3m'
+.\" Adjust doc leading for PRINTSTYLE TYPESET
+. if \\n[#PRINT_STYLE]=2 \
+. if \\n[#ADJ_DOC_LEAD]=1 .DOC_LEAD_ADJUST
+.\" This diversion is to get a value for #FN_AUTOLEAD
+. di NULL
+. if \\n[#AUTO_LEAD] \{\
+. nr #RESTORE_AUTO_LEAD 1
+. nr #SAVED_AUTOLEAD_VALUE \\n[#AUTOLEAD_VALUE]
+. \}
+. ev NULL
+. if \\n[#PRINT_STYLE]=1 \{\
+. ps \\*[$TYPEWRITER_PS]
+. ie \\n[#SINGLE_SPACE]=1 .vs \\n[#ORIGINAL_DOC_LEAD]u
+. el .vs \\n[#ORIGINAL_DOC_LEAD]u/2u
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. ps \\n[#DOC_PT_SIZE]u\\*[$FN_SIZE_CHANGE]
+. vs \\n[.ps]u+\\n[#FN_AUTOLEAD]u
+. \}
+. nr #FN_LEAD \\n[#LEAD]
+. ev
+. di
+. if \\n[#RESTORE_AUTO_LEAD] \{\
+. nr #AUTO_LEAD 1
+. nr #AUTOLEAD_VALUE \\n[#SAVED_AUTOLEAD_VALUE]
+. \}
+. if !\\n[#SKIP_TRAPS] .TRAPS
+. rr #SKIP_TRAPS
+. if \\n[#REMOVE_ADJ] .DOC_LEAD \\n[#DOC_LEAD]u-\\n[#DOC_LEAD_ADJ]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 " invoke .FOOTER_MARGIN 0 before .START
+. nr #SKIP_FOOTER 1
+. \}
+.\" 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 \\n[#UNADJUSTED_DOC_LEAD]u ADJUST
+. el .ENDNOTE_LEAD \\*[$EN_LEAD] \\*[$ADJUST_EN_LEAD]
+. ie !d $BIB_LEAD .BIBLIOGRAPHY_LEAD \\n[#UNADJUSTED_DOC_LEAD]u ADJUST
+. el .BIBLIOGRAPHY_LEAD \\*[$BIB_LEAD] \\*[$ADJUST_BIB_LEAD]
+. ie !d $TOC_LEAD .TOC_LEAD \\n[#UNADJUSTED_DOC_LEAD]u \\*[$ADJUST_TOC_LEAD]
+. el .TOC_LEAD \\*[$TOC_LEAD] \\*[$ADJUST_TOC_LEAD]
+. \}
+. ie !d $BIB_SPACE .BIBLIOGRAPHY_SPACING 0
+. el \{\
+. if \\n[#DEFER_BIB_SPACING]=1 \{\
+. BIBLIOGRAPHY_SPACING \\*[$BIB_SPACE]
+. rr #DEFER_BIB_SPACING
+. \}
+. \}
+. nr #DOC_LEAD \\n[#RESTORE_DOC_LEAD]u
+. nr #B_MARGIN \\n[#RESTORE_B_MARGIN]
+. vs \\n[#DOC_LEAD]u
+. if !\\n[#PRINT_STYLE]=1 \{\
+. if \\n[#RERUN_TRAPS] \{\
+. TRAPS
+. rr #RERUN_TRAPS
+. \}
+. \}
+.\" Set default heading and toc-entry family if not done already
+. nr #HD_LEVEL 0 1 \" loop step
+. nr #LOOP 9 \" loop count
+. while \\n+[#HD_LEVEL]<=\\n[#LOOP] \{\
+. if '\\*[$HEAD_\\n[#HD_LEVEL]_FAM]'' \
+. ds $HEAD_\\n[#HD_LEVEL]_FAM \\*[$DOC_FAM]
+. if '\\*[$HEAD_\\n[#HD_LEVEL]_BASELINE_ADJ]'' \
+. ds $HEAD_\\n[#HD_LEVEL]_BASELINE_ADJ \\n[.v]/10
+. if '\\*[$TOC_HEAD_\\n[#HD_LEVEL]_FAM]'' \
+. ds $TOC_HEAD_\\n[#HD_LEVEL]_FAM \\*[$TOC_FAM]
+. \}
+. if '\\*[$TOC_TITLE_FAM]'' .TOC_TITLE_FAMILY \\*[$DOC_FAM]
+.\" TOC heading (single, non-pagenumbered line insertion)
+. if !d $TOC_HEADING_FAM .ds $TOC_HEADING_FAM \\*[$DOC_FAM]
+. if !d $TOC_HEADING_FT .ds $TOC_HEADING_FT R
+. if !d $TOC_HEADING_SIZE .ds $TOC_HEADING_SIZE +0
+. if !d $TOC_HEADING_COLOR .ds $TOC_HEADING_COLOR black
+. if !d $TOC_HEADING_QUAD .ds $TOC_HEADING_QUAD L
+. if !d $SPACE_ABOVE .ds $SPACE_ABOVE .75v
+. if !d $SPACE_BENEATH .ds $SPACE_BENEATH .25v
+.\" Re-run MNinit to capture strings and registers set in DEFAULTS.
+. if !'\\*[$MN-arg1]'' \{\
+. MNinit \
+\\*[$MN-arg1] \\*[$MN-arg2] \
+\\*[$MN-arg3] \\*[$MN-arg4] \
+\\*[$MN-arg5] \\*[$MN-arg6] \
+\\*[$MN-arg7] \\*[$MN-arg8] \
+\\*[$MN-arg9]
+. \}
+. if \\n[#PRINT_STYLE]=1 .nr #IGNORE 1
+. if \\n[#AUTO_LEAD] \{\
+. rr #AUTO_LEAD
+. rr #AUTOLEAD_VALUE
+. \}
+.END
+\#
+\# =================================================================
+\#
+\# Macros and aliases needed for doccover, cover, and docheader in
+\# START.
+\#
+.MAC DOC_HEADER_QUAD END
+. if '\\$0'DOC_HEADER_QUAD' .ds $CALLING_MACRO DOCHEADER
+. if '\\$0'COVER_H_POS' .ds $CALLING_MACRO COVER
+. if '\\$0'DOC_COVER_H_POS' .ds $CALLING_MACRO DOC_COVER
+. ie !'\\*[$\\*[$CALLING_MACRO]_QUAD]'' \{\
+. substring $\\*[$CALLING_MACRO]_QUAD 0 0
+. if '\\*[$\\*[$CALLING_MACRO]_QUAD]'L' .LEFT
+. if '\\*[$\\*[$CALLING_MACRO]_QUAD]'C' .CENTER
+. if '\\*[$\\*[$CALLING_MACRO]_QUAD]'C' .RIGHT
+. \}
+. el .CENTER
+.END
+.
+.ALIAS COVER_H_POS DOC_HEADER_QUAD
+.ALIAS DOC_COVER_H_POS DOC_HEADER_QUAD
+\#
+.MAC DO_TITLE_OR_AUTHOR END
+. ie '\\$0'DO_AUTHORS' .ds $TTL_AUTH AUTHOR
+. el .ds $TTL_AUTH TITLE
+. if '\\*[$\\*[$PRFX]\\*[$TTL_AUTH]_1]'' \{\
+. if !'\\*[$\\*[$PRFX]DOC\\*[$TTL_AUTH]_1]'' \
+. ds $\\*[$PRFX]\\*[$TTL_AUTH]_1 "\&"
+. if !'\\*[$AUTHOR_1]'' .rm $PRFX
+. \}
+. if !'\\*[$\\*[$PRFX]\\*[$TTL_AUTH]_1]'' \{\
+. if '\\$0'DO_SUBTITLE' \{\
+. if '\\*[$PRFX]'\\*[DOC_]COVER_SUB' \{\
+. ds $PRFX SUB
+. nr #\\*[DOC_]COVER_SUB 1
+. \}
+. \}
+. if !\\n[#PRINT_STYLE]=1 \{\
+. if (\\n[#COVER]=1):(\\n[#DOC_COVER]=1) \
+. if !'\\*[$PRFX]'SUB' \
+. rn $PRFX $PRFX_SAVED
+. fam \\*[$\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_FAM]
+. ft \\*[$\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_FT]
+. ps \
+\\n[#DOC_PT_SIZE]u\\*[$\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_SIZE_CHANGE]
+. if '\\*[$COVER_TYPE]'' .vs \\n[#DOCHEADER_LEAD]u
+. if !'\\*[$\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_LEAD]'' \{\
+. vs \\*[$\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_LEAD]
+. if \\n[#DOCHEADER] .sp |\\n[#T_MARGIN]u-1v
+. \}
+. if \\n[#CHAPTER+TITLE]=1 .ALD \\n[.v]u/4u \" A little space before the chapter title
+. if \\n[#\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_COLOR]=1 \
+. COLOR \\*[$\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_COLOR]
+. if \\n[#\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_CAPS]=1 .CAPS
+. if \\n[#\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_SMALLCAPS]=1 .SMALLCAPS
+. if (\\n[#COVER]=1):(\\n[#DOC_COVER]=1) \
+. rn $PRFX_SAVED $PRFX
+. if \\n[#\\*[DOC_]COVER_TITLE]=2 \
+. ds $PRFX DOC
+. \}
+. if \\n[#\\*[DOC_]COVER_SUB] \{\
+. rr #\\*[DOC_]COVER_SUB
+. ds $PRFX \\*[DOC_]COVER_SUB
+. ds $SAVED_COVER_TYPE \\*[$COVER_TYPE]
+. rm $COVER_TYPE
+. \}
+. nr #ARG_NUM 0 1
+. while \\n[#\\*[$PRFX]\\*[$TTL_AUTH]_NUM]>=\\n+[#ARG_NUM] \{\
+. ie \\n[#\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_UNDERLINE] \{\
+. ds $TITLE_TYPE \\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]
+. ie \\n[#\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_UNDERLINE]=2 \{\
+. ie !\\n[#PRINT_STYLE]=1 \
+. UNDERSCORE2 \\*[$\\*[$PRFX]\\*[$TTL_AUTH]_UNDERLINE_GAP] \
+\\*[$\\*[$PRFX]\\*[$TTL_AUTH]_RULE_GAP] \
+"\\*[$\\*[$PRFX]\\*[$TTL_AUTH]_\\n[#ARG_NUM]]
+. el .UNDERSCORE "\\*[$\\*[$PRFX]\\*[$TTL_AUTH]_\\n[#ARG_NUM]]
+. \}
+. el \{\
+. ie !\\n[#PRINT_STYLE]=1 \
+. UNDERSCORE "\\*[$\\*[$PRFX]\\*[$TTL_AUTH]_\\n[#ARG_NUM]]
+. el .PRINT "\\*[$\\*[$PRFX]\\*[$TTL_AUTH]_\\n[#ARG_NUM]]
+. \}
+. \}
+. el \{\
+. PRINT "\\*[$\\*[$PRFX]\\*[$TTL_AUTH]_\\n[#ARG_NUM]]
+. \}
+. if \\n[#ARG_NUM]>1 .as PDF_BM " \"
+. as PDF_BM \\*[$\\*[$PRFX]\\*[$TTL_AUTH]_\\n[#ARG_NUM]]
+. \}
+. rm $TITLE_TYPE
+. if \\n[#PRINT_STYLE]=2 .vs
+. if \\n[#\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_COLOR]=1 \
+. gcolor
+. SMALLCAPS off
+. CAPS off
+. \}
+. if !'\\*[$SAVED_COVER_TYPE]'' \{\
+. ds $COVER_TYPE \\*[$SAVED_COVER_TYPE]
+. rm $SAVED_COVER_TYPE
+. \}
+.END
+.
+.ALIAS DO_TITLE DO_TITLE_OR_AUTHOR
+.ALIAS DO_SUBTITLE DO_TITLE_OR_AUTHOR
+.ALIAS DO_AUTHORS DO_TITLE_OR_AUTHOR
+\#
+.MAC DO_CHAPTER END
+. fam \\*[$\\*[DOC_]COVER_CHAPTER_FAM]
+. ft \\*[$\\*[DOC_]COVER_CHAPTER_FT]
+. ps \\n[#DOC_PT_SIZE]u\\*[$\\*[DOC_]COVER_CHAPTER_SIZE_CHANGE]
+. if \\n[#\\*[DOC_]COVER_CHAPTER_COLOR]=1 \
+. COLOR \\*[$\\*[DOC_]COVER_CHAPTER_COLOR]
+. if \\n[#\\*[DOC_]COVER_CHAPTER_CAPS]=1 .CAPS
+. if \\n[#\\*[DOC_]COVER_CHAPTER_SMALLCAPS]=1 .SMALLCAPS
+. ie \\n[#\\*[DOC_]COVER_CHAPTER_UNDERLINE] \{\
+. ds $TITLE_TYPE \\*[$COVER_TYPE]CHAPTER
+. ie \\n[#\\*[DOC_]COVER_CHAPTER_UNDERLINE]=2 \
+. UNDERSCORE2 \\*[$\\*[DOC_]COVER_CHAPTER_UNDERLINE_GAP] \
+\\*[$\\*[DOC_]COVER_CHAPTER_RULE_GAP] "\\*[$CHAPTER_STRING] \\*[$CHAPTER]"
+. el .UNDERSCORE "\\*[$CHAPTER_STRING] \\*[$CHAPTER]"
+. \}
+. el .PRINT "\\*[$CHAPTER_STRING] \\*[$CHAPTER]"
+. gcolor
+. SMALLCAPS off
+. CAPS off
+.END
+.
+.ALIAS DO_TITLE DO_TITLE_OR_AUTHOR
+.ALIAS DO_SUBTITLE DO_TITLE_OR_AUTHOR
+.ALIAS DO_AUTHORS DO_TITLE_OR_AUTHOR
+\#
+.MAC DO_CHAPTER END
+. fam \\*[$\\*[DOC_]COVER_CHAPTER_FAM]
+. ft \\*[$\\*[DOC_]COVER_CHAPTER_FT]
+. ps \\n[#DOC_PT_SIZE]u\\*[$\\*[DOC_]COVER_CHAPTER_SIZE_CHANGE]
+. if \\n[#\\*[DOC_]COVER_CHAPTER_COLOR]=1 \
+. COLOR \\*[$\\*[DOC_]COVER_CHAPTER_COLOR]
+. if \\n[#\\*[DOC_]COVER_CHAPTER_CAPS]=1 .CAPS
+. if \\n[#\\*[DOC_]COVER_CHAPTER_SMALLCAPS]=1 .SMALLCAPS
+. ie \\n[#\\*[DOC_]COVER_CHAPTER_UNDERLINE] \{\
+. ds $TITLE_TYPE \\*[$COVER_TYPE]CHAPTER
+. ie \\n[#\\*[DOC_]COVER_CHAPTER_UNDERLINE]=2 \
+. UNDERSCORE2 \\*[$\\*[DOC_]COVER_CHAPTER_UNDERLINE_GAP] \
+\\*[$\\*[DOC_]COVER_CHAPTER_RULE_GAP] "\\*[$CHAPTER_STRING] \\*[$CHAPTER]"
+. el .UNDERSCORE "\\*[$CHAPTER_STRING] \\*[$CHAPTER]"
+. \}
+. el .PRINT "\\*[$CHAPTER_STRING] \\*[$CHAPTER]"
+. gcolor
+. SMALLCAPS off
+. CAPS off
+.END
+\#
+\# Spacing adjustments for (doc)cover and docheader elements
+\#
+.MAC _SPACE END
+. ds $\\$0R \\$1
+.END
+.
+.ds SPACER_TYPE_1 SUBTITLE
+.ds SPACER_TYPE_2 ATTRIBUTE
+.ds SPACER_TYPE_3 AUTHOR
+.ds SPACER_TYPE_4 CHAPTER_TITLE
+.ds SPACER_TYPE_5 DOCTYPE
+.
+.nr #LOOP 0 1
+.while \n+[#LOOP]<=5 \{\
+. ALIAS \*[SPACER_TYPE_\n[#LOOP]]_SPACE _SPACE
+. ALIAS COVER_\*[SPACER_TYPE_\n[#LOOP]]_SPACE _SPACE
+. ALIAS DOC_COVER_\*[SPACER_TYPE_\n[#LOOP]]_SPACE _SPACE
+.\}
+\#
+.MAC DEFAULT_DOCHEADER END
+. nr #DOCHEADER 1
+. DOC_HEADER_QUAD
+. vs \\n[#DOCHEADER_LEAD]u
+. if \\n[#PRINT_STYLE]=2 \
+. if \\n[#DOCHEADER_COLOR]=1 \
+. COLOR \\*[$DOCHEADER_COLOR]
+. DO_TITLE
+. rr #DOCHEADER
+. if !'\\*[$SUBTITLE_1]'' \{\
+. ds $PRFX SUB
+. if !'\\*[$SUBTITLE_SPACER]'' .sp \\*[$SUBTITLE_SPACER]
+. if \\n[#PRINT_STYLE]=2 \
+. if \\n[#DOCHEADER_COLOR]=1 \
+. COLOR \\*[$DOCHEADER_COLOR]
+. DO_SUBTITLE
+. rm $PRFX
+. \}
+. if !\\n[#NO_PRINT_AUTHOR] \{\
+. if !'\\*[$AUTHOR_1]'' \{\
+. ie \\n[#PRINT_STYLE]=1 \{\
+. TYPEWRITER
+. ie \\n[#SINGLE_SPACE]=1 .vs \\n[#DOC_LEAD]u
+. el .vs \\n[#DOC_LEAD]u/2u
+. sp
+. \}
+. el .vs \\n[#DOC_LEAD]u\\*[$DOCHEADER_LEAD_ADJ]
+. if d$ATTRIBUTE_STRING \{\
+. FAMILY \\*[$ATTRIBUTE_FAM]
+. FT \\*[$ATTRIBUTE_FT]
+. ps \
+\\n[#DOC_PT_SIZE]u\\*[$ATTRIBUTE_SIZE_CHANGE]
+. if \\n[#DOCHEADER_COLOR]=1 \
+. COLOR \\*[$DOCHEADER_COLOR]
+. if \\n[#ATTRIBUTE_COLOR]=1 \
+. COLOR \\*[$ATTRIBUTE_COLOR]
+. if \\n[#ATTRIBUTE_CAPS]=1 .CAPS
+. if !'\\*[$ATTRIBUTE_SPACER]'' \
+. sp \\*[$ATTRIBUTE_SPACER]
+. ie \\n[#ATTRIBUTE_UNDERLINE] \{\
+. ds $TITLE_TYPE ATTRIBUTE
+. ie \\n[#ATTRIBUTE_UNDERLINE]=2 \
+. UNDERSCORE2 \\*[$ATTRIBUTE_UNDERLINE_GAP] \
+\\*[$ATTRIBUTE_RULE_GAP] "\\*[$ATTRIBUTE_STRING]"
+. el .UNDERSCORE "\\*[$ATTRIBUTE_STRING]"
+. \}
+. el .PRINT "\\*[$ATTRIBUTE_STRING]"
+. if \\n[#ATTRIBUTE_COLOR]=1 .gcolor
+. CAPS off
+. \}
+. if !'\\*[$AUTHOR_SPACER]'' .sp \\*[$AUTHOR_SPACER]
+. if \\n[#DOCHEADER_COLOR]=1 \
+. COLOR \\*[$DOCHEADER_COLOR]
+. DO_AUTHORS
+. \}
+. \}
+. FAMILY \\*[$DOC_FAM]
+. FT R
+.END
+\#
+.MAC DEFAULT_DOCHEADER_TYPEWRITE END
+. CENTER
+. TYPEWRITER
+. if !\\n[#SINGLE_SPACE] \{\
+. vs \\n[#DOC_LEAD]u/2u
+. sp |\\n[#T_MARGIN]u-1v
+. \}
+. if !'\\*[$TITLE_1]'' \{\
+. ie \\n[#SINGLE_SPACE] \
+. vs \\n[#DOC_LEAD]u+(\\n[#DOC_LEAD]u/4u)
+. el .vs (\\n[#DOC_LEAD]u/2u)+(\\n[#DOC_LEAD]u/4u)
+. CAPS
+. DO_TITLE
+. CAPS OFF
+. vs
+. \}
+. if !'\\*[$SUBTITLE]'' \{\
+. ds $PRFX SUB
+. sp
+. DO_SUBTITLE
+. rm $PRFX
+. \}
+. if !\\n[#NO_PRINT_AUTHOR] \{\
+. if !'\\*[$AUTHOR_1]'' \{\
+. sp
+. if d$ATTRIBUTE_STRING .PRINT "\\*[$ATTRIBUTE_STRING]
+. sp
+. DO_AUTHORS
+. \}
+. \}
+.END
+\#
+.MAC CHAPTER_DOCHEADER END
+. DOC_HEADER_QUAD
+. FAMILY \\*[$CHAPTER_FAM]
+. FT \\*[$CHAPTER_FT]
+. ps \\n[#DOC_PT_SIZE]u\\*[$CHAPTER_SIZE_CHANGE]
+. vs \\n[#DOCHEADER_LEAD]u
+.\" Chapter title only
+. ie '\\*[$CHAPTER]'' \{\
+. if \\n[#PRINT_STYLE]=2 \
+. if \\n[#DOCHEADER_COLOR]=1 \
+. COLOR \\*[$DOCHEADER_COLOR]
+. if !'\\*[$CHAPTER_TITLE_1]'' \{\
+. ds $PRFX CHAPTER_
+. nr #DOCHEADER 1
+. DO_TITLE
+. rr #DOCHEADER
+. rm $PRFX
+. \}
+. \}
+.\" Chapter string, possibly with a chapter title
+. el \{\
+. if \\n[#PRINT_STYLE]=2 \{\
+. if \\n[#DOCHEADER_COLOR]=1 \
+. COLOR \\*[$DOCHEADER_COLOR]
+. if \\n[#CHAPTER_COLOR]=1 \
+. COLOR \\*[$CHAPTER_COLOR]
+. \}
+. if \\n[#CHAPTER_CAPS]=1 .CAPS
+. ie \\n[#CHAPTER_UNDERLINE] \{\
+. ds $TITLE_TYPE CHAPTER
+. ie \\n[#CHAPTER_UNDERLINE]=2 \
+. UNDERSCORE2 \\*[$CHAPTER_UNDERLINE_GAP] \
+\\*[$CHAPTER_RULE_GAP] "\\*[$CHAPTER_STRING] \\*[$CHAPTER]"
+. el .UNDERSCORE "\\*[$CHAPTER_STRING] \\*[$CHAPTER]"
+. \}
+. el .PRINT "\\*[$CHAPTER_STRING] \\*[$CHAPTER]"
+. rm $TITLE_TYPE
+. if \\n[#PRINT_STYLE]=2 \
+. if \\n[#CHAPTER_COLOR]=1 .gcolor
+. CAPS off
+. if !'\\*[$CHAPTER_TITLE_1]'' \{\
+. ds $PRFX CHAPTER_
+. if \\n[#PRINT_STYLE]=2 \{\
+. nr #CHAPTER+TITLE 1
+. if \\n[#DOCHEADER_COLOR]=1 \
+. COLOR \\*[$DOCHEADER_COLOR]
+. \}
+. if !'\\*[$CHAPTER_TITLE_SPACER]'' \
+. sp \\*[$CHAPTER_TITLE_SPACER]
+. DO_TITLE
+. rm $PRFX
+. rr #CHAPTER+TITLE
+. \}
+. \}
+. FAMILY \\*[$DOC_FAM]
+. FT R
+.END
+\#
+.MAC CHAPTER_DOCHEADER_TYPEWRITE END
+. CENTER
+. TYPEWRITER
+. if !\\n[#SINGLE_SPACE] \{\
+. vs \\n[#DOC_LEAD]u/2u
+. sp |\\n[#T_MARGIN]u-1v
+. \}
+. ie '\\*[$CHAPTER]'' \{\
+. CAPS
+. ie !'\\*[$CHAPTER_TITLE]'' \{\
+. vs \\n[.v]u+(\\n[.v]u/3u)
+. nr #ARG_NUM 0 1
+. while \\n[#CHAPTER_TITLE_NUM]>=\\n+[#ARG_NUM] \{\
+. UNDERSCORE 3p "\\*[$CHAPTER_TITLE_\\n[#ARG_NUM]]"
+. \}
+. vs
+. \}
+. el \{\
+. CAPS
+. UNDERSCORE 3p "\\*[$CHAPTER_STRING]"
+. \}
+. CAPS OFF
+. RLD 1v
+. \}
+. el \{\
+. CAPS
+. UNDERSCORE 3p "\\*[$CHAPTER_STRING] \\*[$CHAPTER]
+. CAPS OFF
+. if !'\\*[$CHAPTER_TITLE]'' \{\
+. sp
+. nr #ARG_NUM 0 1
+. while \\n[#CHAPTER_TITLE_NUM]>=\\n+[#ARG_NUM] \{\
+. PRINT "\\*[$CHAPTER_TITLE_\\n[#ARG_NUM]]
+. \}
+. \}
+. sp -1
+. \}
+. vs \\n[#DOC_LEAD]u
+. if \\n[#SINGLE_SPACE] .sp 2
+.END
+\#
+.MAC NAMED_DOCHEADER END
+. DEFAULT_DOCHEADER
+. if !\\n[#NO_PRINT_DOCTYPE] \{\
+. FAMILY \\*[$DOCTYPE_FAM]
+. FT \\*[$DOCTYPE_FT]
+. ps \\n[#DOC_PT_SIZE]u\\*[$DOCTYPE_SIZE_CHANGE]
+. vs \\n[#DOCHEADER_LEAD]u
+. ALD \\n[#DOCHEADER_LEAD]u
+. if \\n[#DOCHEADER_COLOR]=1 \
+. COLOR \\*[$DOCHEADER_COLOR]
+. if \\n[#DOCTYPE_COLOR]=1 \
+. COLOR \\*[$DOCTYPE_COLOR]
+. if \\n[#DOCTYPE_CAPS]=1 .CAPS
+. if !'\\*[$DOCTYPE_SPACER]'' .sp \\*[$DOCTYPE_SPACER]
+. ie \\n[#DOCTYPE_UNDERLINE] \{\
+. ds $TITLE_TYPE DOCTYPE
+. ie \\n[#DOCTYPE_UNDERLINE]=2 \
+. UNDERSCORE2 \\*[$DOCTYPE_UNDERLINE_GAP] \
+\\*[$DOCTYPE_RULE_GAP] "\\*[$DOC_TYPE]
+. el .UNDERSCORE "\\*[$DOC_TYPE]
+. \}
+. el .PRINT "\\*[$DOC_TYPE]
+. gcolor
+. CAPS off
+. \}
+. FAMILY \\*[$DOC_FAM]
+. FT R
+.END
+\#
+\# COVER PAGE
+\# ----------
+\# *Arguments:
+\# TITLE | DOCTITLE | CHAPTER | CHAPTER_TITLE | CHAPTER+TITLE | COVERTITLE \
+\# [ SUBTITLE AUTHOR DOCTYPE COPYRIGHT MISC BLANKPAGE PDF_OUTLINE_LABEL ]
+\# *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. BLANKPAGE inserts a blank page
+\# after the cover.
+\#
+\# If called as DOC_COVER, performs the same operations, but
+\# applies everything to a doc cover.
+\#
+.MAC COVER END
+. rm DOC_
+. ie '\\$0'DOC_COVER' \{\
+. nr #DOC_COVER 1
+. ds DOC_ DOC_
+. \}
+. el .nr #COVER 1
+. if \\n[#NUM_ARGS]=1 \{\
+. if '\\$1'\\*[DOC_]COVERTEXT' \
+. nr #\\*[DOC_]COVERTEXT_ONLY 1
+. \}
+. if \\n[#NUM_ARGS]=3 \{\
+. if '\\$1'\\*[DOC_]COVERTEXT' \
+. if '\\$2'PDF_OUTLINE_LABEL' \
+. nr #\\*[DOC_]COVERTEXT_ONLY 1
+. if '\\$1'PDF_OUTLINE_LABEL' \
+. if '\\$2'\\*[DOC_]COVERTEXT' \
+. nr #\\*[DOC_]COVERTEXT_ONLY 1
+. \}
+. nr #ARG_NUM 0 1
+. nr #COVER_ITEM \\n[#NUM_ARGS] \"loop count
+. while \\n+[#ARG_NUM]<=\\n[#COVER_ITEM] \{\
+. if '\\$1'DOCTITLE' \{\
+. nr #\\*[DOC_]COVER_TITLE 2
+. shift
+. \}
+. if '\\$1'TITLE' \{\
+. nr #\\*[DOC_]COVER_TITLE 1
+. if \\n[#FROM_\\*[DOC_]COVERTITLE] \{\
+. nr #\\*[DOC_]COVER_TITLE 7
+. rr #FROM_\\*[DOC_]COVERTITLE
+. \}
+. shift
+. \}
+. if '\\$1'CHAPTER' \{\
+. nr #\\*[DOC_]COVER_TITLE 3
+. shift
+. \}
+. if '\\$1'CHAPTER_TITLE' \{\
+. nr #\\*[DOC_]COVER_TITLE 4
+. shift
+. \}
+. if '\\$1'CHAPTER+TITLE' \{\
+. nr #\\*[DOC_]COVER_TITLE 5
+. shift
+. \}
+. if '\\$1'COVERTITLE' \{\
+. nr #COVERTITLE 1
+. nr #\\*[DOC_]COVER_TITLE 6
+. shift
+. \}
+. if '\\$1'DOC_COVERTITLE' \{\
+. nr #DOC_COVERTITLE 1
+. nr #\\*[DOC_]COVER_TITLE 7
+. shift
+. \}
+. if '\\$1'SUBTITLE' \{\
+. nr #\\*[DOC_]COVER_SUBTITLE 1
+. shift
+. \}
+. if '\\$1'AUTHOR' \{\
+. nr #\\*[DOC_]COVER_AUTHOR 1
+. shift
+. \}
+. if '\\$1'EDITOR' \{\
+. nr #\\*[DOC_]COVER_AUTHOR 1
+. shift
+. \}
+. if '\\$1'DOCTYPE' \{\
+. nr #\\*[DOC_]COVER_DOCTYPE 1
+. shift
+. \}
+. if '\\$1'COPYRIGHT' \{\
+. nr #\\*[DOC_]COVER_COPYRIGHT 1
+. shift
+. \}
+. if '\\$1'MISC' \{\
+. nr #\\*[DOC_]COVER_MISC 1
+. shift
+. \}
+. if '\\$1'\\*[DOC_]COVERTEXT' \{\
+. nr #\\*[DOC_]COVERTEXT 1
+. shift
+. \}
+. if '\\$1'\\*[DOC_]COVER_IMAGE' \{\
+. nr #\\*[DOC_]COVER_IMAGE 1
+. shift
+. \}
+. if '\\$1'PDF_OUTLINE_LABEL' \{\
+. shift
+. ds $PDF_\\*[DOC_]COVER_LABEL \\$1
+. shift
+. \}
+. if '\\$1'BLANKPAGE' \{\
+. nr #\\*[DOC_]COVER_BLANKPAGE 1
+. shift
+. \}
+. \}
+. if '\\$0'DOC_COVER' .rm DOC_
+.END
+\#
+\# COVER TITLE
+\# -----------
+\# *Arguments:
+\# <covertitle>
+\# *Function:
+\# Stores cover title in string(s) for output on cover pages.
+\#
+.MAC COVERTITLE END
+. rm DOC_
+. if '\\$0'DOC_COVERTITLE' \
+. ds DOC_ DOC_
+. nr #FROM_\\*[DOC_]COVERTITLE 1
+. ie \\n[#NUM_ARGS]=0 \{\
+. nr argc 0 1
+. while \\n+[argc]<=3 \{\
+. if \\n[#\\*[DOC_]COVER_TITLE_NUM] \{\
+. nr #ITEM 0 1
+. while \\n[#\\*[DOC_]COVERTITLE_NUM]>\\n[#ITEM] \{\
+. rm $\\*[DOC_]COVERTITLE_\\n+[#ITEM]
+. \}
+. rr #\\*[DOC_]COVERTITLE_NUM
+. rm $\\*[DOC_]COVERTITLE
+. \}
+. \}
+. \}
+. el \{\
+. nr #\\*[DOC_]COVERTITLE_NUM 0 1
+. while \\n[#NUM_ARGS]>\\n[#\\*[DOC_]COVERTITLE_NUM] \{\
+. ds \
+$\\*[DOC_]COVERTITLE_\\n+[#\\*[DOC_]COVERTITLE_NUM] \\$\\n[#\\*[DOC_]COVERTITLE_NUM]
+. nr #\\*[DOC_]COVERTITLE_NUM \\n[#\\*[DOC_]COVERTITLE_NUM]
+. \}
+. ds $\\*[DOC_]COVERTITLE \\$*
+. \}
+.END
+\#
+.MAC COVER_ATTRIBUTE_STRING END
+. if '\\$0'DOC_COVER_ATTRIBUTE_STRING' \
+. ds DOC_ DOC_
+. ds $\\*[DOC_]COVER_ATTRIBUTE_STRING \\$1
+. rm DOC_
+.END
+.
+.ALIAS DOC_COVER_ATTRIBUTE_STRING COVER_ATTRIBUTE_STRING
+\#
+\# COVER TEXT
+\# ----------
+\# *Arguments:
+\# [ START <vertical pos> ] | <anything>
+\# *Function:
+\# With no arg, begins a diversion holding the cover text for
+\# output on the cover page. With START <pos>, sets a vertical
+\# starting position relative to the top edge of the page. With
+\# any other arg, ends the diversion.
+\# *Notes:
+\# Aliased as DOC_COVERTEXT.
+\#
+\# If no other items assigned to cover pages, starts 1/3 of the
+\# way down the cover page unless START pos is given, otherwise
+\# starts underneath the last of title, subtitle, author(s) or
+\# doctype, preceded by a blank line.
+\#
+\# Does not persist.
+\#
+.MAC COVERTEXT END
+. rm DOC_
+. if '\\$0'DOC_COVERTEXT' .ds DOC_ DOC_
+. if '\\$1'START' \{\
+. shift
+. nr #\\*[DOC_]COVERTEXT_START_POS (u;\\$1)
+. shift
+. \}
+. ie '\\$1'' \{\
+. nr #COVERTEXT_PP 1
+. di \\*[DOC_]COVER_TEXT
+. ev COVER_TEXT
+. evc 0
+\!. if \\\\n[#\\*[DOC_]COVERTEXT_ONLY] \
+. sp |\\\\n[#T_MARGIN]u-\\\\n[#DOC_LEAD]u
+\!. ie !\\n[#\\*[DOC_]COVERTEXT_START_POS] \{\
+\!. sp |\\n[.p]u/3u-1v
+\!. \}
+\!. el \{\
+\!. vs 0
+\!. sp |0i
+\!. vs \\\\n[#DOC_LEAD]u+\\\\*[$\\*[DOC_]COVER_LEAD_ADJ]
+\!. sp |\\n[#\\*[DOC_]COVERTEXT_START_POS]u-1
+\!. \}
+\!. vpt
+. \}
+. el \{\
+. br
+\!. vpt 0
+. ev
+. di
+. rm $FONT
+. rr #COVERTEXT_PP
+. IQ CLEAR
+. \}
+. rm DOC_
+.END
+.
+.ALIAS DOC_COVERTEXT COVERTEXT
+\#
+\# COVER IMAGE
+\# -----------
+\#*Arguments:
+\# <image file> <width> <height> [ -L|-C|-R|-I <ind> Y-pos [ X-pos ] ]
+\#*Function:
+\# Places an image on doccovers and covers.
+\#*Notes:
+\# Aliased as DOC_COVER_IMAGE.
+\#
+\# <width> and <height> are required. With no further args, images
+\# are set at 0,0 by default so that full page images fill the entire
+\# printer sheet.
+\#
+\# Positioning args are the same as PDF_IMAGE. -L, -R, -C and -I <ind>
+\# observe the left and right margins.
+\#
+\# Y-pos is required for all but full page images; without it, images
+\# are flush with the top of the page. X-pos is only needed if the
+\# user prefers to give absolute X,Y positioning.
+\#
+\# Note that Y-pos comes before X-pos in the args.
+\#
+.MAC COVER_IMAGE END
+. if '\\$0'DOC_COVER_IMAGE' .ds DOC_ DOC_
+. ds \\*[DOC_]COVER_IMG_FILE \\$1
+. nr \\*[DOC_]COVER_IMG_W (z;\\$2)
+. nr \\*[DOC_]COVER_IMG_H (z;\\$3)
+. if !'\\$4'' \{\
+. ie !\B'\\$4' \{\
+. if '\\$4'-L' .nr \\*[DOC_]COVER_IMG_IND \
+ \\n[#L_MARGIN]u
+. if '\\$4'-C' .nr \\*[DOC_]COVER_IMG_IND \
+ \\n[#PAGE_WIDTH]u-\\n[\\*[DOC_]COVER_IMG_W]u/2
+. if '\\$4'-R' .nr \\*[DOC_]COVER_IMG_IND \
+ \\n[#L_MARGIN]+\\n[.l]u-\\n[\\*[DOC_]COVER_IMG_W]u
+. if '\\$4'-I' \{\
+. nr \\*[DOC_]COVER_IMG_IND \\n[#L_MARGIN]+\\$5
+. if !'\\$6'' .nr \\*[DOC_]COVER_IMG_Y (u;\\$6)
+. shift \\n[#NUM_ARGS]
+. \}
+. if \B'\\$5' .nr \\*[DOC_]COVER_IMG_Y (u;\\$5)
+. \}
+. el \{\
+. nr \\*[DOC_]COVER_IMG_Y (u;\\$4)
+. if \B'\\$5' .nr \\*[DOC_]COVER_IMG_X (u;\\$5)
+. \}
+. \}
+. rm DOC_
+.END
+.
+.ALIAS DOC_COVER_IMAGE COVER_IMAGE
+\#
+.MAC DO_COVER_IMAGE END
+. ll \\n[#PAGE_WIDTH]u
+. po 0
+. vs 0
+. sp |0i
+. if \\n[\\*[DOC_]COVER_IMG_Y] .sp \\n[\\*[DOC_]COVER_IMG_Y]u
+. if \\n[\\*[DOC_]COVER_IMG_X] .in \\n[\\*[DOC_]COVER_IMG_X]u
+. if \\n[\\*[DOC_]COVER_IMG_IND] .in \\n[\\*[DOC_]COVER_IMG_IND]u
+. if \\n[.u]=1 .nf
+. nop \X'pdf: pdfpic \\*[\\*[DOC_]COVER_IMG_FILE] -L \
+\\n[\\*[DOC_]COVER_IMG_W]z \\n[\\*[DOC_]COVER_IMG_H]z'
+. in
+. vs
+. po
+. ll
+.END
+.
+.ALIAS DO_DOC_COVER_IMAGE DO_COVER_IMAGE
+\#
+\# 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
+\#
+\# MISC_AUTOLEAD functionality has been removed. Leading for MISCs
+\# is now entered as an absolute value. The macro emits a warning.
+\#
+.MAC MISC_AUTOLEAD END
+. ds replacement \\$0
+. substring replacement 0 -9
+. ds replacement \\*[replacement]LEAD
+. ds cover-type \\$0
+. substring cover-type 0 2
+. ie '\\*[cover-type]'COV' .ds cover-type cover
+. el .ds cover-type doc-cover
+. tm1 "[mom]: \\$0 at line \\n[.c] of '\\n[.F]' is no longer valid.
+. tm1 " Leading of \\*[cover-type] MISC items is now set with \\*[replacement], which
+. tm1 " takes an absolute leading value. Please update your document.
+. ab [mom]: Aborting.
+.END
+.
+.ALIAS DOC_COVER_MISC_AUTOLEAD MISC_AUTOLEAD
+.ALIAS COVER_MISC_AUTOLEAD MISC_AUTOLEAD
+\#
+\# COVER PAGE START POSITION
+\# -------------------------
+\# *Arguments:
+\# <distance from page top at which to start cover/doc cover>
+\# *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
+. ds COVER_TYPE \\$0
+. substring COVER_TYPE 0 2
+. ie 'COVER_TYPE'DOC' .nr #DOC_COVER_START_POS (\\$1)
+. el .nr #COVER_START_POS (\\$1)
+.END
+.
+.ALIAS DOC_COVER_ADVANCE COVER_ADVANCE
+.ALIAS DOC_COVER_START_POS COVER_ADVANCE
+.ALIAS COVER_ADVANCE COVER_ADVANCE
+.ALIAS COVER_START_POS COVER_ADVANCE
+\#
+\# COVERS - WHETHER TO PRINT
+\# -------------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *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
+\#
+\# COVER_COUNTS_PAGES
+\# ------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Creates or removes registers #COVERS_COUNT or #DOCCOVERS_COUNT,
+\# used in END_COVER to determine whether to increment the page
+\# number silently when doc covers or covers are output.
+\#
+.MAC COVER_COUNTS_PAGES END
+. if '\\$0'DOC_COVER_COUNTS_PAGES' \{\
+. ie '\\$1'' .nr #DOCCOVERS_COUNT 1
+. el .rr #DOCCOVERS_COUNT
+. return
+. \}
+. if '\\$0'COVER_COUNTS_PAGES' \{\
+. ie '\\$1'' .nr #COVERS_COUNT 1
+. el .rr #COVERS_COUNT
+. return
+. \}
+.END
+\#
+.MAC DO_COVER END
+. nr #DOING_COVER 1
+. ev COVER
+. evc 0
+. vpt 0
+. 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
+. \}
+. ds PDF_BM
+. ie '\\$0'DO_DOC_COVER' \{\
+. ds DOC_ DOC_
+. nr #DOC_COVER_DONE 1
+. if '\\*[$PDF_DOC_COVER_LABEL]'' \
+. ds $PDF_DOC_COVER_LABEL Cover:
+. \}
+. el \
+. if '\\*[$PDF_COVER_LABEL]'' \
+. ds $PDF_COVER_LABEL Title Page:
+. ds $COVER_TYPE \\*[DOC_]COVER_
+. if !r#\\*[DOC_]COVER_START_POS \
+. nr #\\*[DOC_]COVER_START_POS \\n[#PAGE_LENGTH]/3
+. if \\n[#PRINT_STYLE]=1 \
+. if !\\n[#SINGLE_SPACE]=1 .vs \\n[#DOC_LEAD]u/2u
+. if \\n[#PRINT_STYLE]=2 \{\
+. vs \\n[#DOC_LEAD]u\\*[$\\*[DOC_]COVER_LEAD_ADJ]
+. nr #\\*[DOC_]COVER_LEAD \\n[.v]
+. \}
+. if \\n[.ns] .rs
+. if '\\$0'DO_COVER' \{\
+. if \\n[TOC.RELOCATE]==5 \
+. if !rTOC_BH .TOC_BEFORE_HERE
+. \}
+. if '\\$0'DO_DOC_COVER' \{\
+. if \\n[TOC.RELOCATE]==3 \
+. if !rTOC_BH .TOC_BEFORE_HERE
+. \}
+. RV_HARD_SET_MARGINS
+.\" Cover image
+. if \\n[#\\*[DOC_]COVER_IMAGE]=1 \{\
+. DO_\\*[DOC_]COVER_IMAGE
+. rr #\\*[DOC_]COVER_IMAGE
+. \}
+.\" Start cover
+. sp |\\n[#\\*[DOC_]COVER_START_POS]u-1v
+. if !\\n[#PRINT_STYLE]=1 \
+. if \\n[#\\*[DOC_]COVER_COLOR]=1 \
+. COLOR \\*[$\\*[DOC_]COVER_COLOR]
+. \\*[DOC_]COVER_H_POS
+. if (\\n[#\\*[DOC_]COVER_TITLE]=1):(\\n[#\\*[DOC_]COVER_TITLE]=2) .ds DOC DOC
+. fam \\*[$\\*[DOC_]COVER_\\*[DOC]TITLE_FAM]
+. ft \\*[$\\*[DOC_]COVER_\\*[DOC]TITLE_FT]
+. ps \\*[$\\*[DOC_]COVER_\\*[DOC]TITLE_SIZE_CHANGE]
+. ie \\n[#PRINT_STYLE]=1 .TYPEWRITER
+. el .vs \\n[#\\*[DOC_]COVER_LEAD]u
+. nr PDFHREF.VIEW.LEADING \\n[PDFHREF.VIEW.LEADING.C]
+.\" Title and/or doctitle
+. if (\\n[#\\*[DOC_]COVER_TITLE]=1):(\\n[#\\*[DOC_]COVER_TITLE]=2) \{\
+. ie \\n[#PRINT_STYLE]=1 \{\
+. vs \\n[.v]u*2u
+. sp -1.5
+. CAPS
+. nr #ARG_NUM 0 1
+. while \\n[#TITLE_NUM]>=\\n+[#ARG_NUM] \{\
+. UNDERSCORE "\\*[$TITLE_\\n[#ARG_NUM]]"
+. if \\n[#ARG_NUM]>1 .as PDF_BM " \"
+. as PDF_BM \\*[$TITLE_\\n[#ARG_NUM]]
+. \}
+. CAPS OFF
+. vs
+. \}
+. el \{\
+. DO_TITLE
+. rm $PRFX
+. \}
+. PDF_BOOKMARK 1 \\*[$PDF_\\*[DOC_]COVER_LABEL] \\*[PDF_BM]
+. \}
+.\" Chapter
+. if \\n[#\\*[DOC_]COVER_TITLE]=3 \{\
+. ie \\n[#PRINT_STYLE]=1 \{\
+. CAPS
+. UNDERSCORE "\\*[$CHAPTER_STRING] \\*[$CHAPTER]
+. CAPS OFF
+. \}
+. el .DO_CHAPTER
+. PDF_BOOKMARK 1 \
+\\*[$PDF_\\*[DOC_]COVER_LABEL] \\*[$CHAPTER_STRING] \\*[$CHAPTER]
+. if \\n[#\\*[DOC_]COVER_CHAPTER_CAPS]=1 .CAPS off
+. \}
+.\" Chapter title
+. if \\n[#\\*[DOC_]COVER_TITLE]=4 \{\
+. ie \\n[#PRINT_STYLE]=1 \{\
+. CAPS
+. nr #ARG_NUM 0 1
+. vs \\n[.v]u*2u
+. sp -1.5
+. while \\n[#CHAPTER_TITLE_NUM]>=\\n[#ARG_NUM] \{\
+. UNDERSCORE "\\*[$CHAPTER_TITLE_\\n+[#ARG_NUM]]"
+. if \\n[#ARG_NUM]>1 .as PDF_BM " \"
+. as PDF_BM \\*[$CHAPTER_TITLE_\\n[#ARG_NUM]]
+. \}
+. CAPS OFF
+. vs
+. \}
+. el \{\
+. ds $PRFX CHAPTER_
+. DO_TITLE
+. rm $PRFX
+. \}
+. PDF_BOOKMARK 1 \\*[$PDF_\\*[DOC_]COVER_LABEL] \\*[PDF_BM]
+. \}
+.\" Chapter + chapter title
+. if \\n[#\\*[DOC_]COVER_TITLE]=5 \{\
+. ie \\n[#PRINT_STYLE]=1 \{\
+. CAPS
+. UNDERSCORE "\\*[$CHAPTER_STRING] \\*[$CHAPTER]
+. CAPS OFF
+. \}
+. el .DO_CHAPTER
+. if !'\\*[$CHAPTER_TITLE_1]'' \{\
+. ie \\n[#PRINT_STYLE]=1 \{\
+. ie \\n[#SINGLE_SPACE]=0 .vs \\n[#DOC_LEAD]u/2u
+. el .vs \\n[#DOC_LEAD]u
+. sp
+. nr #ARG_NUM 0 1
+. while \\n[#CHAPTER_TITLE_NUM]>=\\n+[#ARG_NUM] \{\
+. PRINT "\\*[$CHAPTER_TITLE_\\n[#ARG_NUM]]"
+. if \\n[#ARG_NUM]>1 .as PDF_BM " \"
+. as PDF_BM \\*[$CHAPTER_TITLE_\\n[#ARG_NUM]]
+. \}
+. if \\n[#SINGLE_SPACE]=0 .vs \\n[#DOC_LEAD]u
+. \}
+. el \{\
+. ds $PRFX CHAPTER_
+. if \\n[#PRINT_STYLE]=2 .nr #CHAPTER+TITLE 1
+. if !'\\*[$\\*[DOC_]COVER_CHAPTER_TITLE_SPACER]'' \
+. sp \\*[$\\*[DOC_]COVER_CHAPTER_TITLE_SPACER]
+. DO_TITLE
+. rr #CHAPTER+TITLE
+. rm $PRFX
+. \}
+. \}
+. PDF_BOOKMARK 1 \\*[$PDF_\\*[DOC_]COVER_LABEL] \\*[PDF_BM]
+. \}
+.\" (Doc)covertitle
+.\" Titles to (doc)covers that are entered with
+.\" .TITLE DOC_COVER title
+.\" and included in (DOC)COVER with TITLE get treated as
+.\" (DOC_)COVERTITLEs, so we define the appropriate strings and
+.\" registers from their (DOC_)COVER_TITLE equivalents.
+.\"
+. if (\\n[#\\*[DOC_]COVER_TITLE]=6):(\\n[#\\*[DOC_]COVER_TITLE]=7) \{\
+. ds $\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_FAM \
+\\*[$\\*[DOC_]COVER_TITLE_FAM]
+. ds $\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_FT \
+\\*[$\\*[DOC_]COVER_TITLE_FT]
+. ds $\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_COLOR \
+\\*[$\\*[DOC_]COVER_TITLE_COLOR]
+. nr #\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_COLOR \
+\\n[#\\*[DOC_]COVER_TITLE_COLOR]
+. nr #\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_CAPS \
+\\n[#\\*[DOC_]COVER_TITLE_CAPS]
+. nr #\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_SMALLCAPS \
+\\n[#\\*[DOC_]COVER_TITLE_SMALLCAPS]
+. ds $\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_LEAD \
+\\*[$\\*[DOC_]COVER_TITLE_LEAD]
+. ds $\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_SIZE_CHANGE \
+\\*[$\\*[DOC_]COVER_TITLE_SIZE_CHANGE]
+. nr #\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_UNDERLINE \
+\\n[#\\*[DOC_]COVER_TITLE_UNDERLINE]
+. nr #\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_UNDERLINE_WEIGHT \
+\\n[#\\*[DOC_]COVER_TITLE_UNDERLINE_WEIGHT]
+. nr #\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_UNDERLINE_WEIGHT_ADJ \
+\\n[#\\*[DOC_]COVER_TITLE_UNDERLINE_WEIGHT_ADJ]
+. ds $\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_UNDERLINE_GAP \
+\\*[$\\*[DOC_]COVER_TITLE_UNDERLINE_GAP]
+. ds $\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_RULE_GAP \
+\\*[$\\*[DOC_]COVER_TITLE_RULE_GAP]
+. ie \\n[#PRINT_STYLE]=1 \{\
+. CAPS
+. vs \\n[.v]u*2u
+. nr #ARG_NUM 0 1
+. while \\n[#\\*[DOC_]COVERTITLE_NUM]>=\\n+[#ARG_NUM] \{\
+. UNDERSCORE "\\*[$\\*[DOC_]COVERTITLE_\\n[#ARG_NUM]]"
+. if \\n[#ARG_NUM]>1 .as PDF_BM " \"
+. as PDF_BM \\*[$\\*[DOC_]COVERTITLE_\\n[#ARG_NUM]]
+. \}
+. vs
+. CAPS OFF
+. \}
+. el \{\
+. ds $PRFX \\*[DOC_]COVER
+. DO_TITLE
+. rm $PRFX
+. \}
+. PDF_BOOKMARK 1 \\*[$PDF_\\*[DOC_]COVER_LABEL] \\*[PDF_BM]
+. \}
+. ie !'\\*[DOC_]'' \{\
+. if !\\n[#DOC_COVER_TITLE] \
+. if '\\*[$PDF_\\*[DOC_]COVER_LABEL]'' \
+. PDF_BOOKMARK 1 Cover page
+. \}
+. el \{\
+. if !\\n[#COVER_TITLE] \
+. if '\\*[$PDF_\\*[DOC_]COVER_LABEL]'' \
+. PDF_BOOKMARK 1 Title page
+. \}
+. rr #\\*[DOC_]COVER_TITLE
+.\" Subtitle
+. if \\n[#\\*[DOC_]COVER_SUBTITLE]=1 \{\
+. ie \\n[#PRINT_STYLE]=1 \{\
+. if !'\\*[$\\*[DOC_]COVER_SUBTITLE_1]'' \
+. ds $PRFX \\*[DOC_]COVER_
+. sp 2
+. nr #ARG_NUM 0 1
+. while \\n[#\\*[$PRFX]SUBTITLE_NUM]>=\\n+[#ARG_NUM] \{\
+. PRINT "\\*[$\\*[$PRFX]SUBTITLE_\\n[#ARG_NUM]]"
+. \}
+. rm $PRFX
+. \}
+. el \{\
+. ie !'\\*[$\\*[DOC_]COVER_SUBTITLE_1]'' .ds $PRFX \\*[DOC_]COVER_SUB
+. el .ds $PRFX SUB
+. if !'\\*[$\\*[DOC_]COVER_SUBTITLE_SPACER]'' \
+. sp \\*[$\\*[DOC_]COVER_SUBTITLE_SPACER]
+. DO_SUBTITLE
+. rm $PRFX
+. \}
+. \}
+. if \\n[#PRINT_STYLE]=1 \
+. if !r#\\*[DOC_]COVER_SUBTITLE .sp
+.\" Author (plus attribution)
+. if \\n[#\\*[DOC_]COVER_AUTHOR]=1 \{\
+. ie \\n[#PRINT_STYLE]=1 \
+. sp
+. el \{\
+. ie !'\\*[$\\*[DOC_]COVER_AUTHOR_LEAD]'' \
+. vs \\*[$\\*[DOC_]COVER_AUTHOR_LEAD]
+. el .vs \\n[#\\*[DOC_]COVER_LEAD]u
+. \}
+. if '\\*[$\\*[DOC_]COVER_ATTRIBUTE_STRING]'' \
+. ds $\\*[DOC_]COVER_ATTRIBUTE_STRING \
+ \\*[$ATTRIBUTE_STRING]
+. ie !\\n[#PRINT_STYLE]=1 \{\
+. fam \\*[$\\*[DOC_]COVER_ATTRIBUTE_FAM]
+. ft \\*[$\\*[DOC_]COVER_ATTRIBUTE_FT]
+. ps \
+\\n[#DOC_PT_SIZE]u\\*[$\\*[DOC_]COVER_ATTRIBUTE_SIZE_CHANGE]
+. if \\n[#\\*[DOC_]COVER_ATTRIBUTE_COLOR]=1 \
+. COLOR \\*[$\\*[DOC_]COVER_ATTRIBUTE_COLOR]
+. if \\n[#\\*[DOC_]COVER_ATTRIBUTE_CAPS]=1 .CAPS
+. if \\n[#\\*[DOC_]COVER_ATTRIBUTE_SMALLCAPS]=1 .SMALLCAPS
+. if !'\\*[$\\*[DOC_]COVER_ATTRIBUTE_SPACER]'' \
+. sp \\*[$\\*[DOC_]COVER_ATTRIBUTE_SPACER]
+. ie \\n[#\\*[DOC_]COVER_ATTRIBUTE_UNDERLINE] \{\
+. ds $TITLE_TYPE \\*[DOC_]COVER_ATTRIBUTE
+. ie \\n[#\\*[DOC_]COVER_ATTRIBUTE_UNDERLINE]=2 \
+. UNDERSCORE2 \\*[$\\*[DOC_]COVER_ATTRIBUTE_UNDERLINE_GAP] \
+\\*[$\\*[DOC_]COVER_ATTRIBUTE_RULE_GAP] "\\*[$\\*[DOC_]COVER_ATTRIBUTE_STRING]"
+. el .UNDERSCORE \\*[$\\*[DOC_]COVER_ATTRIBUTE_STRING]
+. \}
+. el .PRINT "\\*[$\\*[DOC_]COVER_ATTRIBUTE_STRING]"
+. SMALLCAPS off
+. CAPS off
+. if \\n[#\\*[DOC_]COVER_ATTRIBUTE_COLOR]=1 \
+. gcolor
+. \}
+. el \
+. PRINT "\\*[$\\*[DOC_]COVER_ATTRIBUTE_STRING]"
+. ie \\n[#PRINT_STYLE]=1 .sp
+. el \{\
+. if !'\\*[$\\*[DOC_]COVER_AUTHOR_SPACER]'' \
+. sp \\*[$\\*[DOC_]COVER_AUTHOR_SPACER]
+. \}
+. if '\\$0'DO_COVER' \
+. ds $PRFX COVER_
+. if '\\$0'DO_DOC_COVER' \
+. ds $PRFX DOC_COVER_
+. DO_AUTHORS
+. rm $PRFX
+. \}
+.\" Named doctype string
+. if \\n[#DOC_TYPE]=3 \{\
+. if \\n[#\\*[DOC_]COVER_DOCTYPE]=1 \{\
+. ie \\n[#PRINT_STYLE]=1 \{\
+. TYPEWRITER
+. sp 1.5
+. UNDERSCORE2 3p 2p "\\*[$DOC_TYPE]
+. \}
+. el \{\
+. fam \\*[$\\*[DOC_]COVER_DOCTYPE_FAM]
+. ft \\*[$\\*[DOC_]COVER_DOCTYPE_FT]
+. ps \
+\\n[#DOC_PT_SIZE]u\\*[$\\*[DOC_]COVER_DOCTYPE_SIZE_CHANGE]
+. if \\n[#\\*[DOC_]COVER_DOCTYPE_COLOR]=1 \
+. COLOR \\*[$\\*[DOC_]COVER_DOCTYPE_COLOR]
+. sp
+. if \\n[#\\*[DOC_]COVER_DOCTYPE_CAPS]=1 .CAPS
+. if \\n[#\\*[DOC_]COVER_DOCTYPE_SMALLCAPS]=1 .SMALLCAPS
+. if !'\\*[$\\*[DOC_]COVER_DOCTYPE_SPACER]'' \
+. sp \\*[$\\*[DOC_]COVER_DOCTYPE_SPACER]
+. ie \\n[#\\*[DOC_]COVER_DOCTYPE_UNDERLINE] \{\
+. ds $TITLE_TYPE \\*[DOC_]COVER_DOCTYPE
+. ie \\n[#\\*[DOC_]COVER_DOCTYPE_UNDERLINE]=2 \
+. UNDERSCORE2 \\*[$\\*[DOC_]COVER_DOCTYPE_UNDERLINE_GAP] \
+\\*[$\\*[DOC_]COVER_DOCTYPE_RULE_GAP] "\\*[$DOC_TYPE]"
+. el .UNDERSCORE "\\*[$DOC_TYPE]"
+. \}
+. el .PRINT "\\*[$DOC_TYPE]"
+. SMALLCAPS off
+. CAPS off
+. if \\n[#\\*[DOC_]COVER_DOCTYPE_COLOR]=1 \
+. gcolor
+. \}
+. \}
+. \}
+.\" Covertext
+. if \\n[#\\*[DOC_]COVERTEXT]=1 \{\
+. nr #DOING_COVERTEXT 1
+. if !\\n[#\\*[DOC_]COVERTEXT_START_POS] .sp
+. if \\n[#\\*[DOC_]COVERTEXT]=1 \{\
+. ev \\*[DOC_]COVERTEXT
+. nf
+. \\*[DOC_]COVER_TEXT
+. ev
+. \}
+. if \\n[#\\*[DOC_]COVERTEXT_ONLY] \
+. PDF_BOOKMARK 1 \\*[$PDF_\\*[DOC_]COVER_LABEL] \\*[PDF_BM]
+. rr #\\*[DOC_]COVERTEXT
+. rm \\*[DOC_]COVER_TEXT
+. rr #DOING_COVERTEXT
+. rr #\\*[DOC_]COVERTEXT_START_POS
+. \}
+. sp |\\n[#VISUAL_B_MARGIN]u
+.\" Copyright
+. ie \\n[#PRINT_STYLE]=1 \
+. if !\\n[#SINGLE_SPACE] .sp
+. el \{\
+. fam \\*[$\\*[DOC_]COVER_COPYRIGHT_FAM]
+. ft \\*[$\\*[DOC_]COVER_COPYRIGHT_FT]
+. ps \\n[#DOC_PT_SIZE]u\\*[$\\*[DOC_]COVER_COPYRIGHT_SIZE_CHANGE]
+. nr #COPYRIGHT_V_POS \\n[#DOC_LEAD]-\\n[.v]
+. sp \\n[#COPYRIGHT_V_POS]u
+. rr #COPYRIGHT_V_POS
+. \}
+. if \\n[#\\*[DOC_]COVER_COPYRIGHT]=1 \{\
+. if '\\*[$\\*[DOC_]COVER_COPYRIGHT]'' \
+. ds $\\*[DOC_]COVER_COPYRIGHT \\*[$COVER_COPYRIGHT]
+. QUAD \\*[$\\*[DOC_]COVER_COPYRIGHT_QUAD]
+. if \\n[#\\*[DOC_]COVER_COPYRIGHT_COLOR]=1 \
+. COLOR \\*[$\\*[DOC_]COVER_COPYRIGHT_COLOR]
+. ie !'\\*[$COPYRIGHT_V_ADJ]'' \
+. PRINT \v'\\*[$COPYRIGHT_V_ADJ]'\\*[$\\*[DOC_]COVER_COPYRIGHT]
+. el \
+. PRINT \\*[$\\*[DOC_]COVER_COPYRIGHT]
+. if \\n[#\\*[DOC_]COVER_COPYRIGHT_COLOR]=1 \
+. gcolor
+. \}
+. sp |\\n[#VISUAL_B_MARGIN]u
+.\" Misc
+. if \\n[#\\*[DOC_]COVER_MISC]=1 \{\
+. if \\n[#PRINT_STYLE]=2 \{\
+. fam \\*[$\\*[DOC_]COVER_MISC_FAM]
+. ft \\*[$\\*[DOC_]COVER_MISC_FT]
+. ps \\n[#DOC_PT_SIZE]u\\*[$\\*[DOC_]COVER_MISC_SIZE_CHANGE]
+. vs \\*[$\\*[DOC_]COVER_MISC_LEAD]
+. if \\n[#\\*[DOC_]COVER_MISC_COLOR]=1 \
+. COLOR \\*[$\\*[DOC_]COVER_MISC_COLOR]
+. \}
+. ie !'\\*[$\\*[DOC_]COVER_MISC_1]'' \{\
+. QUAD \\*[$\\*[DOC_]COVER_MISC_QUAD]
+. da MISC_DIV
+. nr #NEXT_MISC 0 1
+. while \\n[#\\*[DOC_]COVER_MISC_LINES]>=\\n+[#NEXT_MISC] \{\
+. nop \\*[$\\*[DOC_]COVER_MISC_\\n[#NEXT_MISC]]
+. br
+. \}
+. da
+. \}
+. el \{\
+. QUAD \\*[$MISC_QUAD]
+. da MISC_DIV
+. nr #NEXT_MISC 0 1
+. while \\n[#MISC_LINES]>=\\n+[#NEXT_MISC] \{\
+. nop \\*[$MISC_\\n[#NEXT_MISC]]
+. br
+. \}
+. da
+. \}
+. nr #MISC_V_ADJ \\n[#DOC_LEAD]-\\n[.v]
+. sp \\n[#MISC_V_ADJ]u
+. sp -\\n[dn]u+1
+. nf
+. MISC_DIV
+. if \\n[#MISC_COLOR]=1 .gcolor
+. if \\n[#\\*[DOC_]COVER_MISC_COLOR]=1 .gcolor
+. rm MISC_DIV
+. rr #MISC_DEPTH
+. \}
+. if \\n[TOC.RELOCATE]==1 \{\
+. if !\\n[#COVER_BLANKPAGE] \
+. if !rTOC_BH .TOC_AFTER_HERE
+. \}
+. if '\\$0'DO_COVER' \{\
+. if \\n[TOC.RELOCATE]==6 \
+. if !rTOC_BH .TOC_AFTER_HERE
+. \}
+. if '\\$0'DO_DOC_COVER' \{\
+. if \\n[TOC.RELOCATE]==4 \
+. if !rTOC_BH .TOC_AFTER_HERE
+. \}
+. END_COVER
+.END
+\#
+\# Macro to terminate (doc)cover processing
+\#
+.MAC END_COVER END
+. EOL
+. vpt
+. rr #\\*[DOC_]COVERTEXT_ONLY
+. rr #\\*[DOC_]COVER_TITLE
+. rr #\\*[DOC_]COVERTITLE
+. rr #\\*[DOC_]COVER_SUBTITLE
+. rr #\\*[DOC_]COVER_AUTHOR
+. rr #\\*[DOC_]COVER_DOCTYPE
+. rr #\\*[DOC_]COVER_COPYRIGHT
+. rr #\\*[DOC_]COVER_MISC
+. rr #\\*[DOC_]COVERTEXT
+. rr #\\*[DOC_]COVER_IMAGE
+. rr #\\*[DOC_]COVER_BLANKPAGE
+. rm $PDF_\\*[DOC_]COVER_LABEL
+. rr #\\*[DOC_]COVER
+. if '\\*[$COVER_TYPE]'DOC_COVER_' .ds DOC DOC
+. rm $COVER_TYPE
+. if \\n[#DOC_TYPE]=5 .nr #SKIP 1
+. nr #END_COVER 1
+. NEWPAGE
+. rr #NEWPAGE
+. rr #SKIP
+. if \\n[#PAGINATION_WAS_ON]=1 .nr % +1
+. ie \\n[#\\*[DOC_]COVER_BLANKPAGE]=1 \{\
+. if \\n[TOC.RELOCATE] \
+. if !\\n[#TOC_BH] .TOC_AFTER_HERE
+.\" Without the empty PDF_BOOKMARK, (doc)cover BLANKPAGE causes
+.\" the PDF outline to place the first doc or chapter before the TOC,
+.\" even though PDF output is correct.
+. PDF_BOOKMARK 1
+. nop \&
+. bp
+. rr #\\*[DOC_]COVER_BLANKPAGE
+. if !\\n[#\\*[DOC]COVERS_COUNT]=1 .nr % -2
+. rm DOC_
+. \}
+. el \
+. if !\\n[#\\*[DOC]COVERS_COUNT]=1 .nr #PAGE_NUM_ADJ -1
+. if !'\\n[.ev]'0' .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
+. if \\n[.ns] .nop \&
+. if \\n[#RECTO_VERSO] .nr #RV_POST_COVER 1
+. rm DOC_
+.END
+\#
+\# +++START THE DOCUMENT+++
+\#
+\# THE START MACRO
+\# ---------------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Macro to start document processing. Reads in default document
+\# style parameters and any parameters 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.
+\#
+.MAC START END
+. nr #DOCS 1
+. if \\n[TOC.RELOCATE]==2 \
+. if !\\n[TOC_BH] .TOC_BEFORE_HERE
+. if !n .nop \X'ps: exec 0 setlinejoin'\X'ps: exec 0 setlinecap'
+. if !\\n[#PRINT_STYLE] \{\
+. PRINTSTYLE TYPEWRITE
+. PRINT \&
+. po 6P
+. ll 39P
+. ta \\n[.l]u
+. sp |1i-1v
+. CENTER
+. PRINT "You neglected to enter a PRINTSTYLE."
+. ab [mom]: PRINTSTYLE missing. Aborting '\\n[.F]'.
+. \}
+. if \\n[#LINENUMBERS]=1 \{\
+. nm
+. 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]
+. PRINT \&
+. if !'\\*[$RESTORE_PAGENUM_STYLE]'' \{\
+. PAGENUM_STYLE \\*[$RESTORE_PAGENUM_STYLE]
+. rm $RESTORE_PAGENUM_STYLE
+. \}
+. if \\n[#PAGINATE_WAS_ON] \{\
+. PAGINATE
+. rr #PAGINATE_WAS_ON
+. \}
+. \}
+. DEFAULTS
+. nr #PAGE_TOP \\n[#T_MARGIN]u-\\n[#DOC_LEAD]u
+. rr #RESET_TRAPS
+. if !r#EN_Q_AUTOLEAD .nr #EN_Q_LEAD \\n[#EN_LEAD]
+. if !r#EN_BQ_AUTOLEAD .nr #EN_BQ_LEAD \\n[#EN_LEAD]
+.\" TOC/recto-verso stuff
+. nr @L_MARGIN \\n[#DOC_L_MARGIN]
+. nr @R_MARGIN \\n[#DOC_R_MARGIN]
+.\" Covers and doc covers
+. if \\n[#DOC_COVERS]=1 \{\
+. if \\n[#DOC_COVER]=1 .DO_DOC_COVER
+. \}
+. if \\n[#COVERS]=1 \{\
+. if \\n[#COVER]=1 .DO_COVER
+. \}
+. nr PDFHREF.VIEW.LEADING \\n[PDFHREF.VIEW.LEADING.T]
+. if !\\n[#TOC] .RV_HARD_SET_MARGINS
+. if \\n[#COLUMNS] .COLUMNS \\n[#NUM_COLS] \\n[#GUTTER]u
+. sp |\\n[#DOCHEADER_ADVANCE]u-\\n[#DOC_LEAD]u
+.\" Collect TITLE for TOC.
+. if !\\n[#TOC]=1 \{\
+. 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
+. \}
+. \}
+. as $TOC_TITLE_ITEM \|
+. if \\n[#PREFIX_CH_NUM] \
+. ds $TOC_CH_NUM \
+ \\n[#CH_NUM].\[toc-hd-num-spacer]
+. if \\n[#TOC_PREFIX_CH_NUM] \{\
+. rn $TOC_TITLE_ITEM $TOC_TITLE_ITEM_OLD
+. ds $TOC_CH_NUM \
+ \\n[#CH_NUM].\[toc-hd-num-spacer]
+. if (\\n[#PAD_TOC_CH_NUM]=2)&(\\n[#CH_NUM]<10) \
+. ds $TOC_CH_NUM \h'\w'\0'u'\\*[$TOC_CH_NUM]
+. if \\n[#PAD_TOC_CH_NUM]=3 \{\
+. if \\n[#CH_NUM]<10 \
+. ds $TOC_CH_NUM \h'\w'\0'u*2u'\\*[$TOC_CH_NUM]
+. if (\\n[#CH_NUM]>=10)&(\\n[#CH_NUM]<100) \
+. ds $TOC_CH_NUM \h'\w'\0'u'\\*[$TOC_CH_NUM]
+. \}
+. if \\n[#PAD_TOC_CH_NUM]=4 \{\
+. if \\n[#CH_NUM]<10 \
+. ds $TOC_CH_NUM \h'\w'\0'u*3u'\\*[$TOC_CH_NUM]
+. if (\\n[#CH_NUM]>=10)&(\\n[#CH_NUM]<100) \
+. ds $TOC_CH_NUM \h'\w'\0'u*2u'\\*[$TOC_CH_NUM]
+. if (\\n[#CH_NUM]>=100)&(\\n[#CH_NUM]<1000) \
+. ds $TOC_CH_NUM \h'\w'\0'u'\\*[$TOC_CH_NUM]
+. \}
+. ds $TOC_TITLE_ITEM \\*[$TOC_CH_NUM]\\*[$TOC_TITLE_ITEM_OLD]
+. rm $TOC_TITLE_ITEM_OLD
+. \}
+. \}
+. if !'\\*[$TOC_HEADING]'' \{\
+. HEADING_TO_TOC
+. rm $TOC_HEADING
+. \}
+. if !\\n[#TOC] \{\
+. if !'\\*[$TOC_TITLE_ITEM]'' \{\
+. PDF_BOOKMARK 1 \\*[$TOC_TITLE_ITEM]
+. if !r #NO_TOC_ENTRY .TITLE_TO_TOC
+. if r #NO_TOC_ENTRY .rr #NO_TOC_ENTRY
+. \}
+. \}
+. if !\\n[#TOC] .nr #POST_TOP 1
+.\" End TITLE collection
+. if \\n[#PRINT_PAGENUM_ON_PAGE_1] \{\
+. if \\n[#PAGE_NUM_V_POS]=1 \{\
+. br
+. sp |\\n[#HEADER_MARGIN]u
+. PRINT_PAGE_NUMBER
+. \}
+. \}
+. rr #COLLATE
+. rr #PAGINATION_STATE
+.\" End collate stuff
+. if \\n[#DOC_TYPE]=5 \{\
+. rr @TOP
+. ch RR_@TOP
+. \}
+. sp |\\n[#DOCHEADER_ADVANCE]u-\\n[#DOC_LEAD]u
+. ie \\n[#DOC_HEADER]=0 \{\
+. if \\n[.ns] .rs
+. 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 \{\
+. br
+. sp |\\n[#ADVANCE_FROM_TOP]u-1v
+. if \\n[#ADJ_DOC_LEAD]=1 \
+. if !\\n[#DOCHEADER_NO_SHIM] .SHIM_1
+. \}
+. el \{\
+. br
+. 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
+. \}
+. el \{\
+. if \\n[#AUTO_LEAD] .nr #RESTORE_AUTO_LEAD 1
+. nr #CURRENT_LEAD \\n[.v]
+. if \\n[#PRINT_STYLE]=2 .vs \\n[#DOC_LEAD]u\\*[$DOCHEADER_LEAD_ADJ]
+. nr #DOCHEADER_LEAD_DIFF \\n[#CURRENT_LEAD]-\\n[.v]
+. sp +\\n[#DOCHEADER_LEAD_DIFF]u
+. if \\n[#RESTORE_AUTO_LEAD] \{\
+. nr #AUTO_LEAD 1
+. nr #AUTOLEAD_VALUE \\n[#SAVED_AUTOLEAD_VALUE]
+. \}
+. nr #DOCHEADER_LEAD \\n[.v]
+. vpt 0
+.\" Default doctype
+. if \\n[#DOC_TYPE]=1 \{\
+. if \\n[.ns] \{\
+. rs
+. nop \&
+. sp -1
+. \}
+. ev DOCHEADER
+. evc 0
+. L_MARGIN \\n[#DOC_L_MARGIN]u
+. LL \\n[#DOC_L_LENGTH]u
+. ta \\n[.l]u
+. if \\n[#PRINT_STYLE]=1 .DEFAULT_DOCHEADER_TYPEWRITE
+. if \\n[#PRINT_STYLE]=2 .DEFAULT_DOCHEADER
+. ev
+. \}
+.\" Chapter doctype
+. if \\n[#DOC_TYPE]=2 \{\
+. if \\n[.ns] .rs
+. ev DOCHEADER
+. evc 0
+. if \\n[#DOCHEADER_COLOR]=1 \
+. COLOR \\*[$DOCHEADER_COLOR]
+. L_MARGIN \\n[#DOC_L_MARGIN]u
+. LL \\n[#DOC_L_LENGTH]u
+. ta \\n[.l]u
+. if \\n[#PRINT_STYLE]=1 .CHAPTER_DOCHEADER_TYPEWRITE
+. if \\n[#PRINT_STYLE]=2 .CHAPTER_DOCHEADER
+. ev
+. \}
+.\" Named
+. if \\n[#DOC_TYPE]=3 \{\
+. if \\n[.ns] \{\
+. rs
+. nop \&
+. sp -1
+. \}
+. ev DOCHEADER
+. evc 0
+. if \\n[#DOCHEADER_COLOR]=1 \
+. COLOR \\*[$DOCHEADER_COLOR]
+. L_MARGIN \\n[#DOC_L_MARGIN]u
+. LL \\n[#DOC_L_LENGTH]u
+. ta \\n[.l]u
+. if \\n[#PRINT_STYLE]=1 \{\
+. DEFAULT_DOCHEADER_TYPEWRITE
+. if !\\n[#NO_PRINT_DOCTYPE] \{\
+. sp
+. UNDERSCORE2 3p 2p "\\*[$DOC_TYPE]"
+. \}
+. \}
+. if \\n[#PRINT_STYLE]=2 .NAMED_DOCHEADER
+. ev
+. \}
+. if !\\n[#DOC_TYPE]=4 \{\
+. if \\n[#PRINT_STYLE]=1 .sp
+. if \\n[#PRINT_STYLE]=2 .sp \\n[#DOC_LEAD]u*2u
+. if \\n[#COLUMNS] \{\
+. nr #COL_NUM 0 1
+. nr #L_LENGTH_FOR_EPI \\n[#L_LENGTH]
+. ie \\n[#RV_POST_COVER] \{\
+. nr #COL_\\n+[#COL_NUM]_L_MARGIN \\n[#DOC_L_MARGIN]
+. po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u
+. nr #L_MARGIN \\n[.o]
+. rr #RV_POST_COVER
+. \}
+. el \{\
+. po \\n[#COL_\\n+[#COL_NUM]_L_MARGIN]u
+. nr #L_MARGIN \\n[.o]
+. \}
+. LL \\n[#COL_L_LENGTH]u
+. ta \\n[.l]u
+. \}
+. \}
+. nr #NO_PRINT_AUTHOR 1
+. nr #NO_PRINT_DOCTYPE 1
+. \}
+. vs \\n[#DOC_LEAD]u
+. if \\n[#PRINT_STYLE]=1 \
+. if \\n[#SINGLE_SPACE]=1 .sp
+. if \\n[#ADJ_DOC_LEAD]=1 \
+. if \\n[#ADVANCE_FROM_TOP]=0 \
+. if \\n[#DOC_HEADER]=1 \
+. if !\\n[#DOCHEADER_NO_SHIM] .SHIM_1
+. if \\n[#COLUMNS] .mk dc
+. FAMILY \\*[$DOC_FAM]
+. QUAD \\*[$DOC_QUAD]
+. CLEANUP_DEFAULTS
+. nr #START_FOR_FOOTERS 1
+. if !\\n[#DOC_TYPE]=4 .em TERMINATE
+. if \\n[#LINENUMBERS]=2 \{\
+. ie \\n[#PER_SECTION] .NUMBER_LINES 1
+. el .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
+. \}
+. nr PDFHREF.VIEW.LEADING \\n[PDFHREF.VIEW.LEADING.H]
+. vpt
+. if !r flex .nr flex 1
+. nr flex-spaces 0
+.\" If one-page, don't flex.
+. if !dPDF.EXPORT \{\
+. if \\n[#FLEX_ACTIVE] \{\
+. if !\\n[#NO_FLEX] \{\
+. if d pre-toc-\\n%@\\n[#COL_NUM] \
+. nr #NO_FLEX 1
+. if d pre-list-\\n%@\\n[#COL_NUM] \
+. nr #NO_FLEX 1
+. if d page-\\n%@\\n[#COL_NUM] \
+. nr #NO_FLEX 1
+. if '\\*[last-page]'\\n%@\\n[#COL_NUM]' \
+. nr #NO_FLEX 1
+. \}
+. \}
+. \}
+. if \\n[#DOC_TYPE]=5 \{\
+. if \\n[#HDRFTR_BOTH] \
+. HEADER_RECTO \\*[$HDR_RECTO_QUAD] "\\*[$HDR_RECTO_STRING]"
+. if \\n[#SLIDE_HEADERS] .HEADER
+. if \\n[#HDRFTR_BOTH] \
+. FOOTER_RECTO \\*[$FTR_RECTO_QUAD] "\\*[$FTR_RECTO_STRING]"
+. if \\n[#SLIDE_FOOTERS] \
+. PRINT_FOOTER
+. sp |\\n[#T_MARGIN]u-\\n[#DOC_LEAD]u
+. vpt
+. \}
+.END
+\#
+.MAC RR_ADVANCE_FROM_TOP END
+. rr #ADVANCE_FROM_TOP
+. ch RR_ADVANCE_FROM_TOP
+.END
+\#
+.MAC CLEANUP_DEFAULTS END
+. nr #START 1
+. if \\n[#DOC_HEADER]=1 .nr #DOC_HEADER 2
+. rm $TOC_TITLE_ITEM
+. rr #MISC_NUM
+. rr #MISCS
+. rr #NEXT_AUTHOR
+. rr #NEXT_MISC
+. wh \\n[nl]u+1u RR_ADVANCE_FROM_TOP
+. rr #DOCHEADER_NO_SHIM
+.END
+\#
+\# ====================================================================
+\#
+\# +++MACROS TO CHANGE SOME DEFAULTS+++
+\#
+\# DOCUMENT HEADER
+\# ---------------
+\# *Argument:
+\# <none> | <anything> [distance to advance from top of page] [NO_SHIM]
+\# *Function:
+\# Turns printing of document header on or off. If a second
+\# numeric argument with 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 <anything> (which turns
+\# document headers off), the optional 2nd argument may be given
+\# (with a unit of measure).
+\#
+.MAC DOCHEADER END
+. if \\n[#NUM_ARGS]=0 .nr #DOC_HEADER 1
+. if \\n[#NUM_ARGS]=1 \{\
+. ie '\\$1'NO_SHIM' .nr #DOCHEADER_NO_SHIM 1
+. el .nr #DOC_HEADER 0
+. \}
+. if \\n[#NUM_ARGS]>1 \{\
+. nr #DOC_HEADER 0
+. if \B'\\$2' .nr #ADVANCE_FROM_TOP \\$2
+. if '\\$3'NO_SHIM' .nr #DOCHEADER_NO_SHIM 1
+. \}
+.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:
+\# <docheader start position>
+\# *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:
+\# <left margin of document>
+\# *Function:
+\# Creates or modifies register #DOC_L_MARGIN.
+\# *Notes:
+\# Affects everything on the page.
+\#
+.MAC DOC_LEFT_MARGIN END
+. if !\\n[#DOCS] .DOC_MACRO_ERROR \\$0
+. br
+. nr #DOC_L_MARGIN (\\$1)
+. L_MARGIN \\n[#DOC_L_MARGIN]u
+.END
+\#
+\# DOCUMENT RIGHT MARGIN
+\# ---------------------
+\# *Argument:
+\# <right margin of document>
+\# *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:
+\# <line length of document>
+\# *Function:
+\# Creates or modifies register #DOC_L_LENGTH.
+\# *Notes:
+\# Affects everything on the page.
+\#
+.MAC DOC_LINE_LENGTH END
+. if !\\n[DOCS] .DOC_MACRO_ERROR \\$0
+. br
+. nr #DOC_L_LENGTH (\\$1)
+. LL \\n[#DOC_L_LENGTH]u
+. ta \\n[.l]u
+.END
+\#
+\# DOCUMENT FAMILY
+\# ---------------
+\# *Argument:
+\# <family of running text>
+\# *Function:
+\# Creates or modifies string $DOC_FAM.
+\# *Notes:
+\# Affects everything except headers and footers.
+\#
+.MAC DOC_FAMILY END
+. if !\\n[DOCS] .DOC_MACRO_ERROR \\$0
+. br
+. ds $DOC_FAM \\$1
+. ds $FAMILY \\*[$DOC_FAM]
+. AUTHOR_FAMILY \\*[$DOC_FAM]
+. BLOCKQUOTE_FAMILY \\*[$DOC_FAM]
+. DOCHEADER_FAMILY \\*[$DOC_FAM]
+. DOCTYPE_FAMILY \\*[$DOC_FAM]
+. EPIGRAPH_FAMILY \\*[$DOC_FAM]
+. FOOTNOTE_FAMILY \\*[$DOC_FAM]
+. HDRFTR_FAMILY \\*[$DOC_FAM]
+. LINENUMBER_FAMILY \\*[$DOC_FAM]
+. QUOTE_FAMILY \\*[$DOC_FAM]
+. SUBTITLE_FAMILY \\*[$DOC_FAM]
+. TITLE_FAMILY \\*[$DOC_FAM]
+.END
+\#
+\# DOCUMENT POINT SIZE
+\# -------------------
+\# *Argument:
+\# <point size of running text>
+\# *Function:
+\# Creates or modifies register #DOC_PT_SIZE.
+\# *Notes:
+\# DOC_PT_SIZE is the basis for calculating all type sizes in
+\# a document. Ignored if PRINTSTYLE TYPEWRITE.
+\#
+.ALIAS DOC_PT_SIZE PT_SIZE
+\#
+\# DOCUMENT LEAD
+\# -------------
+\# *Argument:
+\# <lead (".vs") of running text> [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). Ignored if PRINTSTYLE TYPEWRITE.
+\#
+.MAC DOC_LEAD END
+. if \\n[#IGNORE] .return
+. if !\\n[#DOCS] .DOC_MACRO_ERROR \\$0
+. br
+. if '\\$0'DOC_LEAD' \{\
+. vs \\$1
+. rr #DOC_AUTOLEAD
+. rr #DOC_AUTOLEAD_FACTOR
+. nr #DOC_LEAD \\n[.v]
+. \}
+. nr #RESET_TRAPS 1
+. if !\\n[#ADJ_DOC_LEAD] .nr #REMOVE_ADJ 1
+. if !'\\$0'DOC_LEAD' \{\
+. if '\\$0'EN_LEAD' .nr #DOC_LEAD \\n[#EN_LEAD]
+. if '\\$0'BIB_LEAD' .nr #DOC_LEAD \\n[#BIB_LEAD]
+. if '\\$0'TOC_LEAD' .nr #DOC_LEAD \\n[#TOC_LEAD]
+. if '\\$2'ADJUST' .TRAPS
+. rr #RESET_TRAPS
+. \}
+.END
+\#
+\# ADJUST DOCUMENT LEAD
+\# --------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *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
+. rr #DOC_LEAD_ADJUST_OFF
+. \}
+. el \{\
+. nr #ADJ_DOC_LEAD 0
+. nr #DOC_LEAD_ADJUST_OFF 1
+. \}
+.END
+\#
+\# SHIM
+\# ----
+\# *Argument:
+\# None
+\# *Function:
+\# Advances to the next valid 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 valid baseline.
+\#
+\# First, a little convenience macro
+\#
+.MAC PROCESS_SHIM END
+. if !\\n[nl]=\\n[#VALID_BASELINE] \{\
+. while \\n+[#VALID_BASELINE]<\\n[#CURRENT_V_POS] .
+. nr #SHIM \\n[#VALID_BASELINE]-\\n[#CURRENT_V_POS]
+. \}
+.END
+\#
+\# And a macro to disable SHIM
+\#
+.MAC NO_SHIM END
+. ie '\\$1'' \{\
+. nr #NO_SHIM 1
+. nr #FLEX_ACTIVE 1
+. \}
+. el \{\
+. rr #NO_SHIM
+. rr #SHIM
+. rr #FLEX_ACTIVE
+. \}
+.END
+\#
+.nr #NO_SHIM 2 \" Restored to 1 in DEFAULTS.
+\#
+.MAC SHIM END
+. if \\n[#NO_SHIM] \
+. if !'\\$0'SHIM_1' .return
+. if !\\n[#NO_FLEX] \{\
+. if !'\\$0'SHIM_1' \{\
+. tm1 "[mom]: \
+SHIM, line \\n[.c], is incompatible with flex-spacing, which is enabled.
+. tm1 " \
+Flex-spacing must be disabled with NO_FLEX before using SHIM.
+. ab [mom]: Aborting '\\n[.F]', line \\n[.c].
+. \}
+. \}
+. nr #VALID_BASELINE \\n[#T_MARGIN]-\\n[#DOC_LEAD] \\n[#DOC_LEAD]
+. if !r#CURRENT_V_POS .nr #CURRENT_V_POS \\n[.d]
+. ie \\n[#ADVANCE_FROM_TOP] \{\
+. ie \\n[#CURRENT_V_POS]<(\\n[#T_MARGIN]-1v) \{\
+. while \\n-[#VALID_BASELINE]>\\n[#CURRENT_V_POS] .
+. nr #VALID_BASELINE +\\n[#DOC_LEAD]
+. nr #SHIM \\n[#VALID_BASELINE]-\\n[#CURRENT_V_POS]
+. \}
+. el .PROCESS_SHIM
+. \}
+. el .PROCESS_SHIM
+. nr #SHIM_MAX \\n[#DOC_LEAD]*10/15
+. if !\\n[#CALCULATE_ONLY] \{\
+. if !\\n[defer-count] \
+. if \\n[#SHIM]>\\n[#SHIM_MAX] .sp -1
+' sp \\n[#SHIM]u
+. \}
+. rr #CURRENT_V_POS
+.END
+\#
+.ALIAS SHIM_1 SHIM
+\#
+\# ====================================================================
+\#
+\# +++FLEX SPACING+++
+\#
+\# INSERT FLEX SPACE
+\# -----------------
+\# *Arguments:
+\# FORCE
+\# *Function:
+\# Inserts flexible whitespace ("flex-space").
+\# *Notes:
+\# FORCE restores flex-spacing if an .ns is preventing it.
+\# Useful in conjunction with deferred floated material that
+\# plants an .ns after outputting the last deferred float.
+\#
+.MAC FLEX END
+. if !\\n[#NO_SHIM] \{\
+. if \\n[#NO_FLEX] \{\
+. tm1 "[mom]: \
+FLEX, line \\n[.c], is incompatible with shimming, which is presently enabled.
+. tm1 " \
+Shimming must be disabled with NO_SHIM before using FLEX.
+. ab [mom]: Aborting '\\n[.F]', line \\n[.c].
+. \}
+. \}
+. if '\\$1'FORCE' \{\
+. nr flex:force 1
+. return
+. \}
+. if !\\n[#NO_FLEX] \{\
+. if !\\n[.ns] \{\
+. if !\\n[.t]<=\\n[.v] \{\
+. nr flex-spaces +1
+. if dflex-space:\\n[flex]@\\n[#COL_NUM] \{\
+. sp \\*[flex-space:\\n[flex]@\\n[#COL_NUM]]
+. \}
+. \}
+. \}
+. \}
+.END
+\#
+.MAC NO_FLEX END
+. rr flexed
+. ie '\\$1'' \{\
+. nr #NO_FLEX 1
+. if \\n[#FLEX_ACTIVE] .rr #FLEX_ACTIVE
+. \}
+. el \
+. if !\\n[#DOC_TYPE]=5 .rr #NO_FLEX
+.END
+\#
+\# CALCULATE FLEX SPACES
+\# ---------------------
+\# *Function:
+\# Derives flex-space size by dividing the space remaining before
+\# FOOTER by the number of times FLEX was used on the page/col.
+\# *Notes:
+\# .h is reliable for determining space remaining, but can't be used
+\# for columns because it can't be zeroed from one col to the
+\# next. Workaround is to use nl for columns and compensate for
+\# .br's, .sp's, and .ne's. Here be dragons.
+\#
+.MAC CALCULATE_FLEX END
+. nr flex:target-pos \\n[.p]+\\n[#VARIABLE_FOOTER_POS]-1
+. nr flex:current-pos \\n[.h]-\\n[.v]
+. if \\n[#COLUMNS] \{\
+. ie \\n[.trunc] \
+. nr flex:current-pos \\n[nl]-\\n[.v]-(\\n[.trunc]-1)
+. el .nr flex:current-pos \\n[nl]-\\n[.v]
+. if '\\n[.ev]'tbl*end' \{\
+. nr flex:current-pos \\n[nl]-(\\n[.trunc]-1)
+. if \\n[tbl*boxed] .nr flex:current-pos -.65v
+. \}
+. ie \\n[nl-from-heading] \{\
+. nr flex:current-pos \\n[nl-from-heading]-\\n[.v]
+. rr nl-from-heading
+. \}
+. el \{\
+. if !\\n[.pe] \{\
+. if \\n[nl]=(\\n[.p]+(\\n[#VARIABLE_FOOTER_POS]-1)) \
+. nr flex-spaces -1
+. \}
+. \}
+. \}
+. nr flex:space-remaining \
+ \\n[flex:target-pos]-\\n[flex:current-pos]
+. if \\n[flex-spaces] \{\
+. nr flex-space:\\n[flex]@\\n[#COL_NUM] \
+ \\n[flex:space-remaining]/\\n[flex-spaces]
+. if dPDF.EXPORT \{\
+. tm .ds flex-space:\\n[flex]@\\n[#COL_NUM] \
+ \\n[flex-space:\\n[flex]@\\n[#COL_NUM]]u
+.\" For debugging: catch edge-cases that result in negative
+.\" flex-spacing and don't apply flex to the page/column.
+. if \\n[flex-space:\\n[flex]@\\n[#COL_NUM]]<0 \{\
+. tm .ds flex-space:\\n[flex]@\\n[#COL_NUM] 0
+. tm .ds Negative flex space \\n%@\\n[#COL_NUM] (\\n[flex-space:\\n[flex]@\\n[#COL_NUM]])
+. \}
+. \}
+. \}
+.END
+\#
+\# ====================================================================
+\#
+\# +++INTERNATIONALIZATION+++
+\#
+\# ATTRIBUTE STRING
+\# ----------------
+\# *Argument:
+\# <what goes in the "by" slot before author in the document header>
+\# *Function:
+\# Creates or modifies string $ATTRIBUTE_STRING.
+\# *Notes:
+\# Default is "by". A blank string ("") may be used if no
+\# attribution is desired. Blank line results.
+\#
+.MAC ATTRIBUTE_STRING END
+. if !'\\$1'DOC_COVER' \
+. if !'\\$1'COVER' .nr #NEITHER 1
+. if !'\\$1'COVER' \
+. if !'\\$1'DOC_COVER' .nr #NEITHER 1
+. if '\\$1'DOC_COVER' \{\
+. ds $DOC_COVER_ATTRIBUTE_STRING \\$2
+. if '\\*[$DOC_COVER_ATTRIBUTE_STRING]'' \
+. ds $DOC_COVER_ATTRIBUTE_STRING \&
+. \}
+. if '\\$1'COVER' \{\
+. ds $COVER_ATTRIBUTE_STRING \\$2
+. if '\\*[$COVER_ATTRIBUTE_STRING]'' \
+. ds $COVER_ATTRIBUTE_STRING \&
+. \}
+. if \\n[#NEITHER]=1 \{\
+. ds $ATTRIBUTE_STRING \\$1
+. rr #NEITHER
+. \}
+.END
+\#
+\# CHAPTER STRING
+\# --------------
+\# *Argument:
+\# <what to print any time the word "chapter" is required>
+\# *Function:
+\# Creates or modifies string $CHAPTER_STRING.
+\# *Notes:
+\# Default is "chapter".
+\#
+.MAC CHAPTER_STRING END
+. ds $CHAPTER_STRING \\$1
+.END
+\#
+\# DRAFT STRING
+\# ------------
+\# *Argument:
+\# <what to print any time the word "draft" is required>
+\# *Function:
+\# Creates or modifies string $DRAFT_STRING.
+\# *Notes:
+\# Default is "draft".
+\#
+.MAC DRAFT_STRING END
+. ds $DRAFT_STRING \\$1
+.END
+\#
+\# REVISION STRING
+\# ---------------
+\# *Argument:
+\# <what to print any time the word "revision" is required>
+\# *Function:
+\# Creates or modifies string $REVISION_STRING.
+\# *Notes:
+\# Default is "revision".
+\#
+.MAC REVISION_STRING END
+. ds $REVISION_STRING \\$1
+.END
+\#
+\# FINIS STRING
+\# ------------
+\# *Argument:
+\# <what to print with the finis macro>
+\# *Function:
+\# Creates or modifies string $FINIS_STRING.
+\# *Notes:
+\# Default is "END".
+\#
+.MAC FINIS_STRING END
+. ds $FINIS_STRING \\$1
+.END
+\#
+\# ====================================================================
+\#
+\# +++RECTO/VERSO+++
+\#
+\# RECTO_VERSO
+\# -----------
+\# *Arguments:
+\# <none> | <anything>
+\# *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
+\#
+\# FORCE RECTO
+\# -----------
+\# *Function:
+\# Forces doccover and cover pages to recto
+\#
+.MAC FORCE_RECTO END
+. ie '\\$1'' \{\
+. nr #FORCE_RECTO 1
+. nr #DOC_COVER_BLANKPAGE 1
+. nr #COVER_BLANKPAGE 1
+. \}
+. el \{\
+. rr #FORCE_RECTO
+. rr #DOC_COVER_BLANKPAGE
+. rr #COVER_BLANKPAGE
+. \}
+.END
+\#
+.MAC RV_HARD_SET_MARGINS END
+. DOC_LEFT_MARGIN \\n[@L_MARGIN]u
+. DOC_RIGHT_MARGIN \\n[@R_MARGIN]u
+. po \\n[#DOC_L_MARGIN]u
+. LL \\n[#DOC_L_LENGTH]u
+.END
+\#
+\# ====================================================================
+\#
+\# +++EPIGRAPHS+++
+\#
+\# EPIGRAPH INDENT
+\# ---------------
+\# *Argument:
+\# <value by which to multiply PP_INDENT for block epigraphs>
+\# *Function:
+\# Creates or modifies register #EPI_OFFSET_VALUE.
+\# *Notes:
+\# Default is 2 for TYPEWRITE, 3 for TYPESET.
+\#
+.MAC EPIGRAPH_INDENT END
+. rr #EPI_OFFSET_VALUE
+. rm $EPI_OFFSET_VALUE
+. ds $EVAL_EI_ARG \\$1
+. substring $EVAL_EI_ARG -1
+. ie \B'\\*[$EVAL_EI_ARG]' .nr #EPI_OFFSET_VALUE \\$1
+. el .ds $EPI_OFFSET_VALUE \\$1
+. rm $EVAL_EI_ARG
+.END
+\#
+\# EPIGRAPH AUTOLEAD
+\# -----------------
+\# *Argument:
+\# <amount of lead to add to the epigraph ps for epigraph leading>
+\# *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 (p;\\$1)
+.END
+\#
+\# EPIGRAPH
+\# --------
+\# *Arguments:
+\# BLOCK | <anything>
+\# *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 .sp \\n[#DOC_LEAD]u
+. \}
+. ie '\\$1'' \{\
+. nr #EPIGRAPH 1
+. ev EPIGRAPH
+. nr #IN_DIVER 1
+. ll \\n[#L_LENGTH]u
+. ta \\n[.l]u
+. CHECK_INDENT
+. if \\n[#COLUMNS] \{\
+. ie \\n[#START] \{\
+. ll \\n[#DOC_L_LENGTH]u
+. ta \\n[.l]u
+. \}
+. el \{\
+. ll \\n[#COL_L_LENGTH]u
+. ta \\n[.l]u
+. \}
+. \}
+. CENTER
+. if \\n[#PRINT_STYLE]=1 \{\
+. fam \\*[$TYPEWRITER_FAM]
+. ft R
+. if '\\*[$EPI_FT]'I' .FT I
+. ps \\*[$TYPEWRITER_PS]
+. 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]
+. ps \\n[#DOC_PT_SIZE]u\\*[$EPI_SIZE_CHANGE]
+. if \\n[#EPI_COLOR]=1 \{\
+. nf
+\m[\\*[$EPI_COLOR]]
+. EOL
+. \}
+. vs \\n[.ps]u+\\n[#EPI_AUTOLEAD]u
+. 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
+. evc 0
+. ie \\n[#START] \{\
+. ie \\n[#COLUMNS] \{\
+. ie r#EPI_OFFSET_VALUE \
+. ll \
+\\n[#L_LENGTH_FOR_EPI]u-(\\n[#PP_INDENT]u*(\\n[#EPI_OFFSET_VALUE]u*2u))
+. el \
+. ll \
+\\n[#L_LENGTH_FOR_EPI]u-(\\*[$EPI_OFFSET_VALUE]u*2u)
+. ta \\n[.l]u
+. \}
+. el \{\
+. ie r#EPI_OFFSET_VALUE \
+. ll \
+\\n[#L_LENGTH]u-(\\n[#PP_INDENT]u*(\\n[#EPI_OFFSET_VALUE]u*2u))
+. el \
+. ll \\n[#L_LENGTH]u-(\\*[$EPI_OFFSET_VALUE]*2u)
+. ta \\n[.l]u
+. \}
+. \}
+. el \{\
+. ie r#EPI_OFFSET_VALUE \
+. ll \
+\\n[#L_LENGTH]u-(\\n[#PP_INDENT]u*(\\n[#EPI_OFFSET_VALUE]u*2u))
+. el \
+. ll \\n[#L_LENGTH]u-(\\*[$EPI_OFFSET_VALUE]*2u)
+. ta \\n[.l]u
+. if \\n[#COLUMNS] \{\
+. ie r#EPI_OFFSET_VALUE \
+. ll \
+\\n[#COL_L_LENGTH]u-(\\n[#PP_INDENT]u*(\\n[#EPI_OFFSET_VALUE]u*2u))
+. el \
+. ll \\n[#COL_L_LENGTH]u-(\\*[$EPI_OFFSET_VALUE]*2u)
+. ta \\n[.l]u
+. \}
+. CHECK_INDENT
+. \}
+. if \\n[#PRINT_STYLE]=1 \{\
+. fam \\*[$TYPEWRITER_FAM]
+. ft R
+. if '\\*[$EPI_FT]'I' .FT I
+. ps \\*[$TYPEWRITER_PS]
+. 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]
+. ps \\n[#DOC_PT_SIZE]u\\*[$EPI_SIZE_CHANGE]
+. if \\n[#EPI_COLOR]=1 \{\
+. nf
+\m[\\*[$EPI_COLOR]]
+. EOL
+. \}
+. vs \\n[.ps]u+\\n[#EPI_AUTOLEAD]u
+. 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:
+\# <none>
+\# *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] \{\
+. if !\\n[#NO_SHIM] .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]=1 \
+. if !\\n[#SINGLE_SPACE]=1 .ALD \\n[#DOC_LEAD]u
+. if \\n[#PRINT_STYLE]=2 \{\
+. ie !\\n[#DOC_TYPE]=2 .RLD \\n[#DOC_LEAD]u
+. el \{\
+. ie '\\*[$CHAPTER_TITLE]'' .RLD \\n[#DOC_LEAD]u
+. el .if '\\*[$CHAPTER]'' .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 \
+. ALD \\n[#DOC_LEAD]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
+. \}
+. \}
+. SET_EPI_OFFSET
+. nf
+. EPI_TEXT
+. br
+. ie \\n[#START] \{\
+. if \\n[#PRINT_STYLE]=1 .SHIM_1
+. 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 \
+. SHIM_1
+. 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
+. \}
+. \}
+. SHIM
+. \}
+. 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
+\#
+.MAC SET_EPI_OFFSET END
+. 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 \{\
+. ie !\\n[#EPI_OFFSET_VALUE]=0 \
+. nr #EPI_OFFSET \
+\\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#EPI_OFFSET_VALUE])
+. el \
+. if !'\\*[$EPI_OFFSET_VALUE]'' \
+. nr #EPI_OFFSET \\n[#L_MARGIN]+\\*[$EPI_OFFSET_VALUE]
+. if \\n[#COLUMNS] \{\
+. ie !\\n[#EPI_OFFSET_VALUE]=0 \
+. nr #EPI_OFFSET \
+\\n[#COL_\\n[#COL_NUM]_L_MARGIN]+(\\n[#PP_INDENT]*\\n[#EPI_OFFSET_VALUE])
+. el \
+. if !'\\*[$EPI_OFFSET_VALUE]'' \
+. nr #EPI_OFFSET \
+\\n[#COL_\\n[#COL_NUM]_L_MARGIN]+\\*[$EPI_OFFSET_VALUE]
+. \}
+. if !'\\$0'GET_EPI_OFFSET' \
+. if !\\n[#EPI_OFFSET]=0 .po \\n[#EPI_OFFSET]u
+. \}
+.END
+.
+.ALIAS GET_EPI_OFFSET SET_EPI_OFFSET
+\#
+\# ====================================================================
+\#
+\# +++FINIS MACRO+++
+\#
+\# FINIS
+\# -----
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Deposits --END-- at the end of a document.
+\#
+.MAC FINIS END
+. if !\\n[@TOP] \{\
+. if \\n[.t]<=2v \{\
+. tm1 "[mom]: '\\n[.F]': Insufficient room to print \\$0 on last page.
+. return
+. \}
+. \}
+. 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[#FINIS_STRING_CAPS]=1 .CAPS
+. if \\n[#PRINT_STYLE]=1 \{\
+. ie !\\n[#FINIS_NO_DASHES] .PRINT "--\\*[$FINIS_STRING]--
+. el .PRINT "\\*[$FINIS_STRING]
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. if \\n[#FINIS_COLOR]=1 .COLOR \\*[$FINIS_COLOR]
+. ie !\\n[#FINIS_NO_DASHES] .ds $FINIS_DASH \
+\v'-\\n[#EM_ADJUST]u'\[em]\v'+\\n[#EM_ADJUST]u'
+. el .rm $FINIS_DASH
+. PRINT \
+\\*[$FINIS_DASH]\\*[$FINIS_STRING]\\*[$FINIS_DASH]\c
+. \}
+. EL
+. if \\n[#FINIS_COLOR]=1 .gcolor
+. if \\n[#FINIS_STRING_CAPS]=1 .CAPS OFF
+. ev
+. pdfsync
+.END
+\#
+.MAC FINIS_STRING_CAPS END
+. ie '\\$1'' .nr #FINIS_STRING_CAPS 1
+. el .nr #FINIS_STRING_CAPS 0
+.END
+.
+.ALIAS FINIS_CAPS FINIS_STRING_CAPS
+\#
+.MAC FINIS_NO_DASHES END
+. nr #FINIS_NO_DASHES 1
+.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]
+.ALIAS SLIDE# PAGE#
+\#
+.MAC RESTORE_SPACE END
+. if !\\n[#START] .vpt 0
+. if \\n[@TOP] \{\
+. ch RR_@TOP
+. rr @TOP
+. \}
+. if \\n[#NEWPAGE] .rr #NEWPAGE
+. if \\n[.u]=1 .nr #FILLED 1
+. nf
+. rs
+. nop \&
+. sp -1
+. if \\n[#FILLED] \{\
+. fi
+. rr #FILLED
+. \}
+. if !\\n[#START] .vpt
+.END
+\#
+\# HDRFTR RULE GAP
+\# ---------------
+\# *Argument:
+\# <amount of space between header/footer and header/footer rule>
+\# *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)
+. if '\\$0'HEADER_RULE_GAP' \
+. nr #HEADER_RULE_GAP \\n[#HDRFTR_RULE_GAP]
+. if '\\$0'FOOTER_RULE_GAP' \
+. nr #FOOTER_RULE_GAP \\n[#HDRFTR_RULE_GAP]
+.END
+\#
+\# HDRFTR LEFT
+\# -----------
+\# *Argument:
+\# <what to put in the left position of page header/footers>
+\# *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 ellipsis 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 <POSITION> CAPS AND SMALLCAPS
+\# ------------------------------------
+\# *Argument:
+\# <none> | <anything>
+\# *Function:
+\# Turns capitalisation of $HDRFTR_<POSITION> on or off.
+\# *Notes:
+\# Default for RIGHT (ie AUTHOR) is on.
+\#
+.MAC CAPS_SMALLCAPS_WARNING END
+. tm1 "[mom]: At line \\n[.c], both CAPS and SMALLCAPS have been enabled for HEADER_\\$1.
+. tm1 " CAPS takes precedence.
+.END
+.
+.MAC _HDRFTR_CAPS END
+. ds $HDR_FTR \\$0
+. substring $HDR_FTR 0 5 \" HEADER or FOOTER
+. ds POSITION \\$0
+. substring POSITION 7 7
+. if '\\*[POSITION]'L' .ds POSITION LEFT
+. if '\\*[POSITION]'C' .ds POSITION CENTER
+. if '\\*[POSITION]'R' .ds POSITION RIGHT
+. if \\n[#HDRFTR_\\*[POSITION]_SMALLCAPS]=1 \
+. CAPS_SMALLCAPS_WARNING \\*[POSITION]
+. ie '\\$1'' .nr #HDRFTR_\\*[POSITION]_CAPS 1
+. el \{\
+. nr #HDRFTR_\\*[POSITION]_CAPS 0
+. ds $HDRFTR_\\*[POSITION]_SIZE_CHANGE +0
+. \}
+.END
+.
+.MAC _HDRFTR_SMALLCAPS END
+. ds $HDR_FTR \\$0
+. substring $HDR_FTR 0 5 \" HEADER or FOOTER
+. ds POSITION \\$0
+. substring POSITION 7 7
+. if '\\*[POSITION]'L' .ds POSITION LEFT
+. if '\\*[POSITION]'C' .ds POSITION CENTER
+. if '\\*[POSITION]'R' .ds POSITION RIGHT
+. if \\n[#HDRFTR_\\*[POSITION]_CAPS]=1 \
+. CAPS_SMALLCAPS_WARNING \\*[POSITION]
+. ie '\\$1'' .nr #HDRFTR_\\*[POSITION]_SMALLCAPS 1
+. el \
+. nr #HDRFTR_\\*[POSITION]_SMALLCAPS 0
+.END
+\#
+\# HDRFTR CENTER
+\# -------------
+\# *Argument:
+\# <what to put in the centre position of page header/footers>
+\# *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 ellipsis 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'HEADER_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
+. \}
+. ie '\\$1'TOC' .ds $TOC_HDRFTR_CENTER \\$2
+. el .ds $HDRFTR_CENTER \\$1
+.END
+\#
+\# HDRFTR CENTER CAPS AND SMALLCAPS
+\# --------------------------------
+\# *Argument:
+\# <none> | <anything>
+\# *Function:
+\# Turns capitalisation of $HDRFTR_CENTER (typically, doctype of
+\# the document) on or off.
+\# *Notes:
+\# Default is on.
+\#
+.MAC HDRFTR_CENTER_SMALLCAPS END
+. if \\n[#HDRFTR_CENTER_SMALLCAPS]=1 \
+. CAPS_SMALLCAPS_WARNING CENTER
+. ie '\\$1'' .nr #HDRFTR_CENTER_SMALLCAPS 1
+. el \
+. nr #HDRFTR_CENTER_SMALLCAPS 0
+.END
+\#
+\# HDRFTR CENTER PADDING
+\# ---------------------
+\# *Argument:
+\# LEFT | RIGHT <amount of padding to put left or right of hdrftr
+\# center string>
+\# *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.
+\#
+\# 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:
+\# <none>
+\# *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:
+\# <what to put in the right position of page header/footers>
+\# *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 ellipsis 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 AND SMALLCAPS
+\# -------------------------------
+\# *Argument:
+\# <none> | <anything>
+\# *Function:
+\# Turns capitalisation of $HDRFTR_RIGHT (typically, the title of
+\# the document) on or off.
+\# *Notes:
+\# Default is on.
+\#
+.MAC HDRFTR_RIGHT_SMALLCAPS END
+. if \\n[#HDRFTR_RIGHT_SMALLCAPS]=1 \
+. CAPS_SMALLCAPS_WARNING RIGHT
+. ie '\\$1'' .nr #HDRFTR_RIGHT_SMALLCAPS 1
+. el \
+. nr #HDRFTR_RIGHT_SMALLCAPS 0
+.END
+\#
+\# HDRFTR RULE
+\# -----------
+\# *Arguments:
+\# <none> | <anything>
+\# *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
+. if r #HEADERS_ON \
+. if \\n[#HEADERS_ON]=1 .nr #HDRFTR_RULE_GAP \\n[#HEADER_RULE_GAP]
+. if r #FOOTERS_ON \
+. if \\n[#FOOTERS_ON]=1 .nr #HDRFTR_RULE_GAP \\n[#FOOTER_RULE_GAP]
+. if '\\$0'HDRFTR_RULE_INTERNAL' \{\
+. ie \\n[#USERDEF_HDRFTR] \{\
+. nr #CAP_HEIGHT_ADJUST \\n[#HDRFTR_HEIGHT]
+. if \\n[#HEADERS_ON] \{\
+. rt \\n[y]u
+. ALD \\n[#HDRFTR_RULE_GAP]u
+. nr #HDRFTR_RULE_WEIGHT \\n[#HEADER_RULE_WEIGHT]
+. nr #HDRFTR_RULE_WEIGHT_ADJ \\n[#HEADER_RULE_WEIGHT_ADJ]
+. \}
+. if \\n[#FOOTERS_ON] \{\
+. rt \\n[y]u
+. RLD \
+\\n[#HDRFTR_RULE_GAP]u+\\n[#CAP_HEIGHT_ADJUST]u+\\n[#FOOTER_RULE_WEIGHT]u
+. nr #HDRFTR_RULE_WEIGHT \\n[#FOOTER_RULE_WEIGHT]
+. nr #HDRFTR_RULE_WEIGHT_ADJ \\n[#FOOTER_RULE_WEIGHT_ADJ]
+. \}
+. ie \\n[#HDRFTR_RULE_COLOR]=1 \{\
+\m[\\*[$HDRFTR_RULE_COLOR]]\
+\D't \\n[#HDRFTR_RULE_WEIGHT]u'\
+\h'|0'\
+\v'+\\n[#HDRFTR_RULE_WEIGHT_ADJ]u'\
+\D'l \\n[#DOC_L_LENGTH]u 0'\
+\D't \\n[#RULE_WEIGHT]u'\
+\h'-\\n[#RULE_WEIGHT]u'\
+\m[]
+. \}
+. el \{\
+\D't \\n[#HDRFTR_RULE_WEIGHT]u'\
+\h'|0'\
+\v'+\\n[#HDRFTR_RULE_WEIGHT_ADJ]u'\
+\D'l \\n[#DOC_L_LENGTH]u 0'\
+\D't \\n[#RULE_WEIGHT]u'\
+\h'-\\n[#RULE_WEIGHT]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]
+. \}
+. if \\n[#HEADERS_ON] \{\
+. rt \\n[y]u
+. ALD \\n[#HDRFTR_RULE_GAP]u
+. nr #HDRFTR_RULE_WEIGHT \\n[#HEADER_RULE_WEIGHT]
+. nr #HDRFTR_RULE_WEIGHT_ADJ \\n[#HEADER_RULE_WEIGHT_ADJ]
+. \}
+. if \\n[#FOOTERS_ON] \{\
+. rt \\n[y]u
+. RLD \
+\\n[#HDRFTR_RULE_GAP]u+\\n[#CAP_HEIGHT_ADJUST]u+\\n[#FOOTER_RULE_WEIGHT]u
+. nr #HDRFTR_RULE_WEIGHT \\n[#FOOTER_RULE_WEIGHT]
+. nr #HDRFTR_RULE_WEIGHT_ADJ \\n[#FOOTER_RULE_WEIGHT_ADJ]
+. \}
+. ie \\n[#HDRFTR_RULE_COLOR]=1 \{\
+\m[\\*[$HDRFTR_RULE_COLOR]]\
+\D't \\n[#HDRFTR_RULE_WEIGHT]u'\
+\h'|0'\
+\v'+\\n[#HDRFTR_RULE_WEIGHT_ADJ]u'\
+\D'l \\n[#DOC_L_LENGTH]u 0'\
+\D't \\n[#RULE_WEIGHT]u'\
+\h'-\\n[#RULE_WEIGHT]u'\
+\m[]
+. \}
+. el \{\
+\D't \\n[#HDRFTR_RULE_WEIGHT]u'\
+\h'|0'\
+\v'+\\n[#HDRFTR_RULE_WEIGHT_ADJ]u'\
+\D'l \\n[#DOC_L_LENGTH]u 0'\
+\D't \\n[#RULE_WEIGHT]u'\
+\h'-\\n[#RULE_WEIGHT]u'
+. \}
+. br
+. \}
+. \}
+. if '\\$0'HEADER_RULE' \{\
+. ie '\\$1'' \{\
+. nr #HEADER_RULE 1
+. nr #HDRFTR_RULE 1
+. \}
+. el \{\
+. nr #HEADER_RULE 0
+. nr #HDRFTR_RULE 0
+. \}
+. \}
+. if '\\$0'FOOTER_RULE' \{\
+. ie '\\$1'' \{\
+. nr #FOOTER_RULE 1
+. nr #HDRFTR_RULE 1
+. \}
+. el \{\
+. nr #FOOTER_RULE 0
+. nr #HDRFTR_RULE 0
+. \}
+. \}
+. if '\\$0'HDRFTR_RULE' \{\
+. ie '\\$1'' .nr #HDRFTR_RULE 1
+. el .nr #HDRFTR_RULE 0
+. \}
+.END
+.
+.ALIAS HDRFTR_RULE_INTERNAL HDRFTR_RULE
+\#
+\# HDRFTR PLAIN
+\# ------------
+\# *Arguments:
+\# <none>
+\# *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
+. nr #HDRFTR_PLAIN 1
+. rm $HDRFTR_FAMILY
+. rm #HDRFTR_PT_SIZE
+. rm $HDRFTR_COLOR
+. rm $HDRFTR_LEFT_FAMILY
+. rm $HDRFTR_LEFT_FONT
+. rm $HDRFTR_LEFT_SIZE_CHANGE
+. rr #HDRFTR_LEFT_CAPS
+. rr #HDRFTR_LEFT_SMALLCAPS
+. rr #HDRFTR_LEFT_COLOR
+. rm $HDRFTR_CENTER_FAMILY
+. rm $HDRFTR_CENTER_FONT
+. rm $HDRFTR_CENTER_SIZE_CHANGE
+. rr #HDRFTR_CENTER_CAPS
+. rr #HDRFTR_CENTER_SMALLCAPS
+. rr #HDRFTR_CENTER_COLOR
+. rm $HDRFTR_RIGHT_FAMILY
+. rm $HDRFTR_RIGHT_FONT
+. rm $HDRFTR_RIGHT_SIZE_CHANGE
+. rr #HDRFTR_RIGHT_CAPS
+. rr #HDRFTR_RIGHT_SMALLCAPS
+. rr #HDRFTR_RIGHT_COLOR
+.END
+\#
+\# SWITCH HDRFTR
+\# -------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Creates or modifies register #SWITCH_HDRFTR, used to switch
+\# default location of HDRFTR_LEFT and HDRFTR_RIGHT.
+\# *Notes:
+\# Default is OFF.
+\#
+\# 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 conjunction 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.
+\#
+.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 <hdrftr_recto_string>
+\# *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 or FOOTER_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
+. ds $QUAD_TYPE \\$1
+. substring $QUAD_TYPE 0 0
+. if '\\*[$QUAD_TYPE]'L' .nr #USERDEF_HDRFTR_RECTO_QUAD 1
+. if '\\*[$QUAD_TYPE]'C' .nr #USERDEF_HDRFTR_RECTO_QUAD 2
+. if '\\*[$QUAD_TYPE]'R' .nr #USERDEF_HDRFTR_RECTO_QUAD 3
+. shift
+. ie '\\$1'CAPS' \{\
+. nr #HDRFTR_RECTO_CAPS 1
+. ds $USERDEF_HDRFTR_RECTO \\$2
+. \}
+. el .ds $USERDEF_HDRFTR_RECTO \\$1
+.END
+\#
+\# USER DEFINED HDRFTR VERSO
+\# -------------------------
+\# *Arguments:
+\# L | LEFT | C | CENTER | CENTER | R | RIGHT <hdrftr_verso_string>
+\# *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
+. ds $QUAD_TYPE \\$1
+. if !'\\*[$QUAD_TYPE]'' .substring $QUAD_TYPE 0 0
+. if '\\*[$QUAD_TYPE]'L' .nr #USERDEF_HDRFTR_VERSO_QUAD 1
+. if '\\*[$QUAD_TYPE]'C' .nr #USERDEF_HDRFTR_VERSO_QUAD 2
+. if '\\*[$QUAD_TYPE]'R' .nr #USERDEF_HDRFTR_VERSO_QUAD 3
+. shift
+. ie '\\$1'CAPS' \{\
+. nr #HDRFTR_VERSO_CAPS 1
+. ds $USERDEF_HDRFTR_VERSO \\$2
+. \}
+. el .ds $USERDEF_HDRFTR_VERSO \\$1
+.END
+\#
+\# PRINT FOOTER ON FIRST PAGE
+\# --------------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *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:
+\# <none> | <anything>
+\# *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:
+\# <none>
+\# *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[#DOC_TYPE]=5 \{\
+. if !\\n[#HDRFTR_BOTH] .PRINT_USERDEF_HDRFTR
+. return
+. \}
+. if !\\n[#PRINT_FOOTER_ON_PAGE_1] \{\
+. ie !\\n[#HDRFTR_BOTH] .return
+. el \{\
+. rr #FOOTERS_ON
+. if !\\n[#COLLATE] .nr #HEADERS_ON 1
+. ie \\n[#HEADER_RULE]=1 .HEADER_RULE
+. el .HEADER_RULE OFF
+. ie \\n[#HDRFTR_BOTH] .HEADER_VERSO \\*[$HDR_VERSO_QUAD] "\\*[$HDR_VERSO_STRING]"
+. el .HEADER_RECTO \\*[$HDR_RECTO_QUAD] "\\*[$HDR_RECTO_STRING]"
+. 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_TMP_SMALLCAPS_SWITCH \\n[#HDRFTR_LEFT_SMALLCAPS]
+. nr #HDRFTR_LEFT_SMALLCAPS \\n[#HDRFTR_RIGHT_SMALLCAPS]
+. 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 \\n[y]u
+. 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 \\n[y]u
+. 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]]
+. \}
+. fam \\*[$HDRFTR_LEFT_FAM]
+. ft \\*[$HDRFTR_LEFT_FT]
+. ps \\n[#HDRFTR_PT_SIZE]u\\*[$HDRFTR_LEFT_SIZE_CHANGE]
+. 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_SMALLCAPS] .SMALLCAPS
+. 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 .nop \&
+. \}
+. if \\n[#HDRFTR_LEFT_CAPS] .CAPS OFF
+. if \\n[#HDRFTR_LEFT_SMALLCAPS] .SMALLCAPS OFF
+. fam \\*[$HDRFTR_CENTER_FAM]
+. ft \\*[$HDRFTR_CENTER_FT]
+. ps \\n[#HDRFTR_PT_SIZE]u\\*[$HDRFTR_CENTER_SIZE_CHANGE]
+. if \\n[#FOOTERS_ON] \{\
+. di NULL
+. SIZESPECS
+. nr #CENTER_CAP_HEIGHT \\n[#CAP_HEIGHT]
+. di
+. \}
+. CENTER
+. if \\n[#HDRFTR_CENTER_SMALLCAPS] .SMALLCAPS
+. if \\n[#HDRFTR_CENTER_CAPS] .CAPS
+. rt \\n[y]u
+. 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
+. if \\n[#HDRFTR_CENTER_SMALLCAPS] .SMALLCAPS OFF
+. fam \\*[$HDRFTR_RIGHT_FAM]
+. ft \\*[$HDRFTR_RIGHT_FT]
+. ps \\n[#HDRFTR_PT_SIZE]u\\*[$HDRFTR_RIGHT_SIZE_CHANGE]
+. 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_SMALLCAPS] .SMALLCAPS
+. if \\n[#HDRFTR_RIGHT_CAPS] .CAPS
+. rt \\n[y]u
+. 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_RIGHT_SMALLCAPS] .SMALLCAPS OFF
+. \}
+. if \\n[#HDRFTR_RULE] .HDRFTR_RULE_INTERNAL
+. br
+.END
+\#
+\# PRINT USER DEFINED HEADER/FOOTER
+\# --------------------------------
+\# *Arguments:
+\# <none>
+\# *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 \{\
+. fam \\*[$HDRFTR_FAM]
+. ft R
+. ps \\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
+. if \\n[#HDRFTR_RECTO_CAPS]=1 .CAPS
+. if '\\n[.ev]'FOOTER' .vs 0
+. PRINT \\*[$USERDEF_HDRFTR_RECTO]
+. if '\\n[.ev]'FOOTER' .vs
+. if \\n[#HDRFTR_RECTO_CAPS]=1 .CAPS OFF
+. 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
+. if \\n[#HDRFTR_VERSO_CAPS]=1 .CAPS
+. if '\\n[.ev]'FOOTER' .vs 0
+. PRINT \\*[$USERDEF_HDRFTR_VERSO]
+. if '\\n[.ev]'FOOTER' .vs
+. if \\n[#HDRFTR_VERSO_CAPS]=1 .CAPS OFF
+. 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
+. if \\n[#HDRFTR_RECTO_CAPS]=1 .CAPS
+. if '\\n[.ev]'FOOTER' .vs 0
+. PRINT \\*[$USERDEF_HDRFTR_RECTO]
+. if '\\n[.ev]'FOOTER' .vs
+. if \\n[#HDRFTR_RECTO_CAPS]=1 .CAPS OFF
+. 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
+. if \\n[#HDRFTR_RECTO_CAPS]=1 .CAPS
+. if '\\n[.ev]'FOOTER' .vs 0
+. if !r #SKIP .PRINT \\*[$USERDEF_HDRFTR_RECTO]
+. if '\\n[.ev]'FOOTER' .vs
+. if \\n[#HDRFTR_RECTO_CAPS]=1 .CAPS OFF
+. 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:
+\# <none> | <anything>
+\# *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:
+\# <amount of space between top of page and header>
+\# *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:
+\# <amount of space between header and running text>
+\# *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:
+\# <none>
+\# *Function:
+\# Resets margin notes, processes footnote and margin note
+\# leftover, takes care of recto-verso, prepares for columns after
+\# first, determines whether to flex-space the page,,outputs
+\# deferred floats, and does some tbl magic. If headers are
+\# enabled, prints header appropriate to DOC_TYPE, PRINTSTYLE, and
+\# COPYSTYLE.
+\#
+.MAC HEADER END
+. vpt 0
+. if \\n[#DOC_TYPE]=5 \{\
+. if \\n[#SLIDE_FOOTERS] \{\
+. PRINT_FOOTER
+. if \\n[#HDRFTR_BOTH] \
+. HEADER_RECTO \\*[$HDR_RECTO_QUAD] "\\*[$HDR_RECTO_STRING]"
+. \}
+. \}
+. nr flex-spaces 0
+. nr flex +1
+. if \\n[#NEW_DOC_PT_SIZE] .nr #DOC_PT_SIZE \\n[#NEW_DOC_PT_SIZE]
+. rr #NEW_DOC_PT_SIZE
+. if \\n[#RESET_TRAPS] \{\
+. TRAPS
+. if \\n[#REMOVE_ADJ] .nr #DOC_LEAD -\\n[#DOC_LEAD_ADJ]
+. \}
+. rr #REMOVE_ADJ
+. rr #RESET_TRAPS
+. 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
+. if !\\n[#DIVERTED] .rr #PREV_FN_DEFERRED
+. po \\n[#DOC_L_MARGIN]u
+. if \\n[#RECTO_VERSO] \{\
+. if !\\n[#TOC_RV_SWITCH]=2 \{\
+. nr #DOC_LR_MARGIN_TMP \\n[#DOC_L_MARGIN]
+. DOC_LEFT_MARGIN \\n[#DOC_R_MARGIN]u
+. if \\n[#CROPS] .DOC_LEFT_MARGIN \\n[#DOC_R_MARGIN]u+\\n[cropmarks]u
+. DOC_RIGHT_MARGIN \\n[#DOC_LR_MARGIN_TMP]u
+. if \\n[#CROPS] .DOC_RIGHT_MARGIN \\n[#DOC_LR_MARGIN_TMP]u-\\n[cropmarks]u
+. SWITCH_HDRFTR_CENTER_PAD
+. \}
+. \}
+. 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[.l]u
+. if \\n[#PRINT_STYLE]=1 \{\
+. fam \\*[$TYPEWRITER_FAM]
+. ft R
+. ps \\*[$TYPEWRITER_PS]\\*[$HDRFTR_SIZE_CHANGE]
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. fam \\*[$HDRFTR_FAM]
+. ft R
+. ps \\n[#DOC_PT_SIZE]u\\*[$HDRFTR_SIZE_CHANGE]
+. \}
+. nr #HDRFTR_PT_SIZE \\n[#PT_SIZE]
+. if \\n[#CAPS_ON] \{\
+. nr #CAPS_WAS_ON 1
+. CAPS OFF
+. \}
+. if \\n[#PRINT_STYLE]=1 \{\
+. if \\n[#ENDNOTES]=1 \{\
+.\" Single-spaced endnotes have a different lead
+. if \\n[#EN_SINGLESPACE] \{\
+. nr #RESTORE_DOC_LEAD \\n[#DOC_LEAD]
+. nr #DOC_LEAD \\n[#EN_LEAD]u
+. \}
+. \}
+. \}
+. if !n .nop \X'ps: exec 0 setlinejoin'\X'ps: exec 0 setlinecap'
+. sp -1v
+. if \\n[#DOC_TYPE]=5 \{\
+. if \\n[#SLIDE_HEADERS] \{\
+. HEADERS
+. if \\n[#SLIDE_FOOTERS] \{\
+. FOOTERS off
+.\" So rule prints after header on first page
+. if !r #SKIP_RULE \{\
+. sp
+. if \\n[#HEADER_RULE] .HEADER_RULE
+. nr #SKIP_RULE 1
+. \}
+. \}
+. \}
+. \}
+. ie \\n[#HEADERS_ON] .PRINT_HDRFTR
+. el \{\
+. if \\n[#PAGE_NUM_V_POS]=1 \
+. if \\n[#PAGINATE] .PRINT_PAGE_NUMBER
+. \}
+. 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
+.\" PDF boxes
+. if \\n[pdfbx-running]=1 \{\
+. if !\\n[pdfbx-div-start] \{\
+. ps \\n[#SIZE_AT_FOOTER]u
+. SIZESPECS
+. ds pdfbx-cap-adj \\*[$CAP_HEIGHT]
+. ps
+. sp |\\n[t]u-\\n[#LEAD_AT_FOOTER]u
+. sp (\\*[wt\\n[stack]]/2u)+\\*[pdfbx-cap-adj]+\\*[gap\\n[stack]]u
+. ch FOOTER \\n[#VFP\\n[stack]]u
+. \}
+. \}
+. 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[#TAB_ACTIVE] .TAB \\n[#CURRENT_TAB]
+. if \\n[#QUOTE] \{\
+. ie \\n[#TAB_ACTIVE] .TAB \\n[#CURRENT_TAB]
+. el \{\
+. ie r #\\*[BQ]_OFFSET_VALUE .nr #\\*[BQ]_OFFSET \
+\\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#\\*[BQ]_OFFSET_VALUE])
+. el .nr #\\*[BQ]_OFFSET \\n[#L_MARGIN]+\\*[$\\*[BQ]_OFFSET_VALUE]
+. ie \\n[#QUOTE]=1 \{\
+. if !'\\*[$Q_QUAD]'CENTER' \
+. if !'\\*[$Q_QUAD]'RIGHT' \
+. po \\n[#Q_OFFSET]u
+. \}
+. el .po \\n[#\\*[BQ]_OFFSET]u
+. \}
+. if !\\n[pdfbx-running]=0 \{\
+. if \\n[#PRINT_STYLE]=2 .sp \\n[#Q_LEAD_DIFF]u
+. \}
+. \}
+. if \\n[#IN_LIST] \
+. po +\\n[#LIST_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[#EPIGRAPH] \{\
+. ie \\n[#TAB_ACTIVE] .TAB \\n[#CURRENT_TAB]
+. el \{\
+. ie r#EPI_OFFSET_VALUE \
+. nr #EPI_OFFSET \
+\\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#EPI_OFFSET_VALUE])
+. el \
+. nr #EPI_OFFSET \\n[#L_MARGIN]+\\*[$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 .sp \\n[#DOC_LEAD]u-\\n[#EPI_LEAD]u
+. \}
+. \}
+. el .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[.l]u
+. if \\n[#QUOTE] \{\
+. ie \\n[#\\*[BQ]_OFFSET_VALUE] \
+. po +(\\n[#PP_INDENT]u*\\n[#\\*[BQ]_OFFSET_VALUE]u)
+. el \
+. po +\\*[$\\*[BQ]_OFFSET_VALUE]
+. \}
+. if \\n[#EPIGRAPH] \{\
+. if \\n[#EPI_ACTIVE] \{\
+. ie \\n[#EPI_FITS] .
+. el .nr dc -\\n[#EPI_LEAD_DIFF]
+. \}
+. ie r#EPI_OFFSET_VALUE \{\
+. po \
+\\n[#COL_\\n[#COL_NUM]_L_MARGIN]u+(\\n[#PP_INDENT]u*\\n[#EPI_OFFSET_VALUE]u)
+. \}
+. el .po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u+\\*[$EPI_OFFSET_VALUE]
+. \}
+. \}
+. 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
+. if \\n[#PRE_COLLATE]=1 .rr #PRE_COLLATE
+. if \\n[#UNDERLINE_WAS_ON]=1 \{\
+. vs 0
+. ie !n \
+. nop \R'#UNDERLINE_ON 1'\X'ps: exec \\n[_w] \\n[_d] decorline'
+. el .cu 1000
+. br
+. ns
+. rr #UNDERLINE_WAS_ON
+. \}
+. if \\n[#RESTORE_PAGINATION] \{\
+. PAGINATE
+. rr #RESTORE_PAGINATION
+. \}
+. ch RR_@TOP
+. ie \\n[tbl*have-header] .rr @TOP
+. el .wh \\n[nl]u+1u RR_@TOP
+. if \\n[#FLEX_ACTIVE] \{\
+. if \\n[#RESTORE_FLEX] \{\
+. rr #NO_FLEX
+. rr #RESTORE_FLEX
+. \}
+. if \\n[#RESTORE_COL_FLEX] \{\
+. rr #NO_FLEX
+. rr #RESTORE_COL_FLEX
+. \}
+. \}
+.\" Don't flex the last page/col, or the page/col before a COLLATE,
+.\" NEWPAGE, COL_NEXT, or BLANKPAGE.
+. if !dPDF.EXPORT \{\
+. if \\n[#FLEX_ACTIVE] \
+. if !\\n[#NO_FLEX] \
+. nr #RESTORE_FLEX 1
+. if '\\*[last-page]'\\n%@\\n[#COL_NUM]' \
+. if !\\n[#NO_FLEX] .nr #NO_FLEX 1
+. if '\\*[pre-collate-\\n%]'\\n%@\\n[#COL_NUM]' \
+. if !\\n[#NO_FLEX] .nr #NO_FLEX 1
+. if '\\*[pre-newpage-\\n%]'\\n%@\\n[#COL_NUM]' \
+. if !\\n[#NO_FLEX] .nr #NO_FLEX 1
+. if d page-\\n%@\\n[#COL_NUM] .nr #NO_FLEX 1
+. \}
+. ie \\n[defer] .PROCESS_FLOATS
+. el \{\
+.\" These two sets of conditions only occur if the .br in .TS causes
+.\" a page break.
+. if !\\n[doing-tbl] \{\
+. if (\\n[tbl*have-caption]=1)&(\\n[tbl*caption-after-label]=0) \{\
+. RESTORE_SPACE
+. if !\\n[span] \{\
+. ie \\n[#MLA] .sp \\n[tbl*label-lead-diff]u
+. el .sp \\n[tbl*caption-lead-diff]u
+. \}
+. \}
+. \}
+. \}
+.\" So tables without TH that don't fit don't overprint first row
+.\" at top of page
+. ie \\n[tbl*no-header] \{\
+. rs
+. nop \&
+. vpt
+. rr \\n[tbl*no-header]
+. SHIM_1
+. \}
+. el .vpt
+. if \\n[span] \{\
+. ev FLOAT
+. if \\n[#INDENT_LEFT_ACTIVE] .in \\n[#L_INDENT]u/2u
+. nf
+. RESTORE_SPACE
+. if !\\n[tbl*no-top-hook] \
+. if \\n[tbl*have-header:1] .tbl*print-header
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u
+. ch FN_OVERFLOW_TRAP -\\n[#FN_OVERFLOW_TRAP_POS]u
+. \}
+. if !\\n[begin-tbl] \
+. if !r tbl*no-top-hook .tbl@top-hook
+. rr tbl*no-top-hook
+. if r flex:force .rr flex:force
+. rr ref*last
+. if !\\n[float*defer] .ev 0
+. if (\\n[pdfbx-running]=1):(\\n[#DOC_TYPE]=5) \{\
+. rr @TOP
+. ch RR_@TOP
+. \}
+. if \\n[pdfbx-running]=1 \
+. ch FOOTER \\n[#VFP\\n[stack]]u
+.END
+\#
+\# ====================================================================
+\#
+\# +++FOOTERS+++
+\#
+\# FOOTERS (off or on)
+\# -------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *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'' \{\
+. rr #HEADERS_ON
+. nr #FOOTERS_ON 1
+. PAGENUM_POS TOP CENTER
+. \}
+. el .nr #FOOTERS_ON 0
+.END
+\#
+\# FOOTER MARGIN
+\# -------------
+\# *Argument:
+\# <footer margin>
+\# *Function:
+\# Creates or modifies register #FOOTER_MARGIN which holds the
+\# amount of space to leave between the page number and the bottom
+\# of the page.
+\# *Notes:
+\# Unit of measure required. Default is 3P.
+\#
+.MAC FOOTER_MARGIN END
+. ie \\n%>0 .nr #FOOTER_MARGIN (\\$1)
+. el .
+.END
+\#
+\# FOOTER GAP
+\# ----------
+\# *Argument:
+\# <distance from end of running text to page # or footer>
+\# *Function:
+\# Creates or modifies register #FOOTER_GAP which holds the
+\# amount of space to leave between running text and the page number.
+\# *Notes:
+\# Requires unit of measure. Default is 3P. Measured baseline to
+\# baseline.
+\#
+.MAC FOOTER_GAP END
+. ie \\n%>0 .nr #FOOTER_GAP (\\$1)
+. el .
+.END
+\#
+\# FOOTER
+\# ------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Gathers strings for flex-spacing, processes margin notes and
+\# footnotes, prepares for move to next column or page. Places
+\# footer at bottom of page if #FOOTERS=1, otherwise places page
+\# number at bottom of page (if #PAGINATE=1). Page numbers are
+\# in arabic or roman according to COPYSTYLE. DRAFT starts the
+\# document at page 1 regardless of PAGENUMBER. FINAL respects
+\# PAGENUMBER.
+\#
+.MAC FOOTER END
+. if r #START .rr #START
+. if \\n[pdfbx-running] \{\
+. if \\n[#FN_COUNT] \{\
+. nr pdfbx-fn-trap \\n[nl]+\\*[wt\\n[stack]]+\\*[gap\\n[stack]]
+. nop \!x X pdf: background footnote \\n[pdfbx-fn-trap]z
+. rr pdfbx-fn-trap
+. \}
+. \}
+. CALCULATE_FLEX
+. if \\n[#DOING_COVERTEXT] \{\
+. tm1 "[mom]: COVERTEXT exceeds cover page depth.
+. ab [mom]: Aborting '\\n[.F]'.
+. \}
+. vpt 0
+. rr #LB_4_HD
+. rr #QUOTE_4_HD
+. nr #LEAD_AT_FOOTER \\n[.v]
+. nr #SIZE_AT_FOOTER \\n[.ps]
+. if !r pg-trans .nr pg-trans 0 1
+. ev PAGE_TRANSITION\\n+[pg-trans]
+. pdfmarksuspend
+. ie !n .nop \X'ps: exec decornone'
+. el .cu 0
+. br
+. if \\n[#UNDERLINE_ON]=1 .nr #UNDERLINE_WAS_ON 1
+. if \\n[MN-left]>0 \{\
+. if !\\n[#no-repeat-MN-left]=1 \{\
+. MNbottom-left
+. nr #no-repeat-MN-left 1
+. \}
+. if '\\n[.z]'MN_OVERFLOW_LEFT' \{\
+. di
+. nr #MN_OVERFLOW_LEFT 1
+. rr #OVERFLOW_LEFT
+. \}
+. \}
+. if \\n[MN-right]>0 \{\
+. if !\\n[#no-repeat-MN-right]=1 .MNbottom-right
+. if '\\n[.z]'MN_OVERFLOW_RIGHT' \{\
+. di
+. nr #MN_OVERFLOW_RIGHT 1
+. rr #OVERFLOW_RIGHT
+. \}
+. \}
+\# Table bottom hook, draws the table borders in
+\# multipage boxed tables.
+. tbl@bottom-hook
+. ch MN_OVERFLOW_TRAP
+. nr #L_MARGIN_DIFF \\n[#L_MARGIN]-\\n[#DOC_L_MARGIN]
+. if !\\n[#FN_DEFER] \{\
+. nr #DIVER_DEPTH 0
+. if \\n[#FN_DEPTH] \{\
+. if \\n[#DIVERTED]=3 .nr #FN_DEPTH +\\n[#VFP_DIFF]
+. vpt 0
+. sp \
+|\\n[#PAGE_LENGTH]u-(\\n[#B_MARGIN]u+\\n[#FN_DEPTH]u-\\n[#DOC_LEAD]u)
+. vpt
+. po \\n[#DOC_L_MARGIN]u
+. if \\n[#COLUMNS] \{\
+. po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u
+. nr #L_MARGIN \\n[.o]
+. nr #FROM_FOOTER 1
+. \}
+. nf
+. ch FN_OVERFLOW_TRAP -\\n[#FN_OVERFLOW_TRAP_POS]u
+. FOOTNOTES
+. rm FOOTNOTES
+. if d RUNON_FOOTNOTES .rm RUNON_FOOTNOTES
+. if \\n[#PRINT_STYLE]=1 .vs \\n[#LEAD_AT_FOOTER]u
+. if \\n[#PRINT_STYLE]=2 .vs \\n[#LEAD_AT_FOOTER]u
+. if '\\n[.z]'FN_OVERFLOW' \{\
+. di
+. nr #FN_OVERFLOW_DEPTH \\n[#DIVER_DEPTH]
+. \}
+. nr #FN_COUNT_AT_FOOTER \\n[#FN_COUNT]
+. nr #FN_COUNT 0
+. if \\n[#COL_NEXT] \{\
+. ie !\\n[#COL_NUM]=\\n[#NUM_COLS] .nr #COL_NUM \\n-[#COL_NUM]
+. el .nr #COL_NUM \\n[#NUM_COLS] 1
+. \}
+. \}
+. rr #DIVERTED
+. \}
+. nr @TOP 1
+. ie \\n[#COLUMNS]=1 \{\
+. ie (\\n[#COL_NUM]=\\n[#NUM_COLS]):(\\n[#NEWPAGE]=1) \{\
+. rr #NEWPAGE
+. DO_FOOTER
+. \}
+. el \{\
+. ie (\\n[#ENDNOTES]=1):(\\n[#BIBLIOGRAPHY]=1) \{\
+. if \\n[#ENDNOTES] .sp |\\n[ec]u-\\n[#EN_LEAD]u
+. if \\n[#BIBLIOGRAPHY] .sp |\\n[bc]u-\\n[#BIB_LEAD]u
+. \}
+. el \{\
+. vs \\n[#LEAD_AT_FOOTER]u
+. rt \\n[dc]u
+. nr flex-spaces 0
+. \}
+. if d page-\\n%@\\n[#COL_NUM] \{\
+. rr #NO_FLEX
+. rr #RESTORE_COL_FLEX
+. \}
+. po \\n[#COL_\\n+[#COL_NUM]_L_MARGIN]u
+. if !dPDF.EXPORT \{\
+. if \\n[#FLEX_ACTIVE] \{\
+. if !\\n[#NO_FLEX] \{\
+. if '\\*[last-page]'\\n%@\\n[#COL_NUM]' \
+. nr #NO_FLEX 1
+. if '\\*[pre-collate]'\\n%@\\n[#COL_NUM]' \
+. nr #NO_FLEX 1
+. if '\\*[pre-newpage-\\n%]'\\n%@\\n[#COL_NUM]' \{\
+. nr #NO_FLEX 1
+. nr #RESTORE_FLEX 1
+. \}
+. if d page-\\n%@\\n[#COL_NUM] \{\
+. nr #NO_FLEX 1
+. nr #RESTORE_COL_FLEX 1
+. \}
+. \}
+. \}
+. \}
+. nr #L_MARGIN \\n[.o]
+. if \\n[#FN_DEPTH] .PROCESS_FN_LEFTOVER
+. vs \\n[#LEAD_AT_FOOTER]u
+. if \\n[#PREV_FN_DEFERRED] .nr #PREV_FN_DEFERRED 2
+. rr #RULED
+. if !\\n[#EPIGRAPH] .rr #COL_NEXT
+. if !\\n[#QUOTE] .rr #COL_NEXT
+. if \\n[#RESET_FN_COUNTERS]=1 \{\
+. rr #RESET_FN_COUNTERS
+. PROCESS_FN_IN_DIVER
+. LS \\n[#LEAD_AT_FOOTER]u
+. nr #FN_COUNT \\n[#FN_COUNT] 1
+. nr #FN_COUNT_FOR_COLS \\n[#FN_COUNT_FOR_COLS] 1
+. rm FN_IN_DIVER
+. if dRUNON_FN_IN_DIVER .rm RUNON_FN_IN_DIVER
+. \}
+. rr #DEFER_SPACE_ADDED
+. if \\n[#TAB_ACTIVE] .TAB \\n[#CURRENT_TAB]
+. if \\n[#QUOTE] \{\
+. ie \\n[#TAB_ACTIVE] .TAB \\n[#CURRENT_TAB]
+. el \{\
+. ie \\n[#Q_OFFSET_VALUE] \
+. nr #Q_OFFSET \
+\\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#Q_OFFSET_VALUE])
+. el \
+. nr #Q_OFFSET \\n[#L_MARGIN]+\\*[$Q_OFFSET_VALUE]
+. if \\n[#COLUMNS] \{\
+. ie \\n[#Q_OFFSET_VALUE] .nr #Q_OFFSET \
+\\n[#COL_\\n[#COL_NUM]_L_MARGIN]+(\\n[#PP_INDENT]*\\n[#Q_OFFSET_VALUE])
+. el .nr #Q_OFFSET \
+\\n[#COL_\\n[#COL_NUM]_L_MARGIN]+\\*[$Q_OFFSET_VALUE]
+. \}
+. po \\n[#Q_OFFSET]u
+. \}
+. \}
+. if \\n[#EPIGRAPH] \{\
+. ie \\n[#TAB_ACTIVE] .TAB \\n[#CURRENT_TAB]
+. el \{\
+. ie r#EPI_OFFSET_VALUE .nr #EPI_OFFSET \
+\\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#EPI_OFFSET_VALUE])
+. el .nr #EPI_OFFSET \
+\\n[#L_MARGIN]+\\*[$EPI_OFFSET_VALUE]
+. if \\n[#COLUMNS] \{\
+. ie r#EPI_OFFSET_VALUE .nr #EPI_OFFSET \
+\\n[#COL_\\n[#COL_NUM]_L_MARGIN]+(\\n[#PP_INDENT]*\\n[#EPI_OFFSET_VALUE])
+. el .nr #EPI_OFFSET \
+\\n[#COL_\\n[#COL_NUM]_L_MARGIN]+\\*[$EPI_OFFSET_VALUE]
+. \}
+. po \\n[#EPI_OFFSET]u
+. \}
+. \}
+. ie \\n[tbl*interrupted] \{\
+. tbl*print-header
+. rr tbl*interrupted
+. \}
+. el .if !r tbl*no-top-hook .tbl@top-hook
+. rr tbl*no-top-hook
+. ie \\n[#EPIGRAPH] \{\
+. ie !\\n[#EPI_ACTIVE] \{\
+. ns
+. rr #EPI_ACTIVE
+. \}
+. el \{\
+. sp |\\n[dc]u+(\\n[#DOC_LEAD]u-\\n[#EPI_LEAD]u)
+. rr #EPI_ACTIVE
+. \}
+. \}
+. el .ns
+. ev
+. \}
+. ns
+. rr #DIVERTED
+. ch RR_@TOP
+. wh \\n[nl]u+1u RR_@TOP
+. if \\n[tbl*have-header] .tbl@bottom-hook
+. if \\n[defer] .PROCESS_FLOATS
+. ie \\n[tbl*no-header] \{\
+. rs
+. nop \&
+. vpt
+. rr \\n[tbl*no-header]
+. SHIM_1
+. \}
+. el .vpt
+. if '\\n[.ev]'caption' .rs
+. if \\n[tbl*interrupted] .tbl*print-header
+. rr tbl*interrupted
+. \}
+. el .DO_FOOTER
+. pdfmarkrestart
+.END
+\#
+\# PROCESS FOOTER
+\# --------------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Prints footer (page number, or 3-part footer).
+\# Resets CAPS and UNDERLINE if they were on.
+\#
+.MAC DO_FOOTER END
+.\" Kill pdfbackground if BoxStop causes a page break
+. if r pdfbxstop \{\
+. pdfbackground off
+. rr pdfbx-running
+. \}
+.\" Part of workaround for refer spitting out a blank page if the
+.\" last reference falls on the bottom line.
+. if \\n[num*refs] \{\
+. if \\n[ref*num]=\\n[num*refs] \{\
+. rr num*refs
+. nr ref*last 1
+. \}
+. \}
+. ie !\\n[#DOC_TYPE]=5 .PRINT_FOOTER
+. el .vpt
+. if !\\n[ref*last] \{\
+. ie \\n[defer]>0 \{\
+\c
+' bp
+. \}
+. el 'bp
+. \}
+.END
+\#
+.MAC PRINT_FOOTER END
+. if r #SAVED_FOOTER_POS .ch FOOTER \\n[#SAVED_FOOTER_POS]u
+. rr #SAVED_FOOTER_POS
+. vpt 0
+. sp -1
+. ev FOOTER
+. ie n \
+. sp |\\n[#PAGE_LENGTH]u-\\n[#FOOTER_MARGIN]u
+. el \
+. sp |\\n[#PAGE_LENGTH]u-\\n[#FOOTER_MARGIN]u-\\n[#FOOTER_ADJ]u
+. mk y
+. UNDERLINE OFF
+. po \\n[#DOC_L_MARGIN]u
+. ll \\n[#DOC_L_LENGTH]u
+. ta \\n[.l]u
+. if \\n[#PRINT_STYLE]=1 .TYPEWRITER
+. if \\n[#PRINT_STYLE]=2 \{\
+. fam \\*[$HDRFTR_FAM]
+. ft R
+. ps \\n[#DOC_PT_SIZE]u\\*[$HDRFTR_SIZE_CHANGE]
+. \}
+. nr #HDRFTR_PT_SIZE \\n[#PT_SIZE]
+. if \\n[#CAPS_ON] \{\
+. nr #CAPS_WAS_ON 1
+. CAPS OFF
+. \}
+. ie \\n[#FOOTERS_ON] \{\
+. if !\\n[#SKIP_FOOTER]>0 .PRINT_HDRFTR
+. if \\n[#HDRFTR_BOTH] \
+. HEADER_RECTO \\*[$HDR_RECTO_QUAD] "\\*[$HDR_RECTO_STRING]"
+. if \\n[#DOC_TYPE]=5 .FOOTERS
+. \}
+. el \{\
+. if \\n[#PAGINATE] \{\
+. if \\n[#PAGE_NUM_V_POS]=2 \
+. if !\\n[#SKIP_FOOTER]>0 .PRINT_PAGE_NUMBER
+. \}
+. \}
+. rr #SKIP_FOOTER
+. if \\n[#CAPS_WAS_ON] \{\
+. CAPS
+. rr #CAPS_WAS_ON
+. \}
+. ev
+. vpt
+.END
+\#
+\# ====================================================================
+\#
+\# +++HEADERS AND FOOTERS+++
+\#
+\# HEADERS_AND_FOOTERS
+\# -------------------
+\# *Arguments:
+\# HEADER_RECTO_QUAD \
+\# HEADER_RECTO_STRING \
+\# FOOTER_RECTO_QUAD \
+\# FOOTER_RECTO_STRING \
+\# HEADER_VERSO_QUAD \
+\# HEADER_VERSO_STRING \
+\# FOOTER_VERSO_QUAD \
+\# FOOTER_VERSO_STRING
+\# | <anything>
+\# *Function:
+\# Allows having both headers and footers. Sets register
+\# #HDRFTR_BOTH to 1; collects HEADER/FOOTER_RECTO/VERSO
+\# information; appends FOOTER_RECTO and FOOTER_VERSO to
+\# START and turns off pagination; appends to macros
+\# PRINT_USERDEF_HDRFTR and HEADER the necessary number
+\# register manipulations and redefinitions of the
+\# HEADER/FOOTER_RECTO/VERSO strings so that both
+\# headers and footers get printed, with the appropriate
+\# strings for each
+\# *Notes:
+\# Works in conjunction with HDRFTR_RECTO and HDRFTR_VERSO (qqv.),
+\# ergo all style changes must be done inline in the strings
+\# passed as arguments.
+\#
+.MAC HEADERS_AND_FOOTERS END
+. ie \\n[#NUM_ARGS]>1 \{\
+. nr #HDRFTR_BOTH 1
+. nr #FOOTERS_ON 1
+. if !r#HEADER_RULE .nr #HEADER_RULE 1
+. if !r#FOOTER_RULE .nr #FOOTER_RULE 1
+. ds $HDR_RECTO_QUAD \\$1
+. ds $HDR_RECTO_STRING \\$2
+. ds $FTR_RECTO_QUAD \\$3
+. ds $FTR_RECTO_STRING \\$4
+. ds $HDR_VERSO_QUAD \\$5
+. ds $HDR_VERSO_STRING \\$6
+. ds $FTR_VERSO_QUAD \\$7
+. ds $FTR_VERSO_STRING \\$8
+.am START DONE
+. if \\\\n[#HDRFTR_BOTH]=1 \{\
+. FOOTER_RECTO \\\\*[$FTR_RECTO_QUAD] "\\\\*[$FTR_RECTO_STRING]"
+. FOOTER_VERSO \\\\*[$FTR_VERSO_QUAD] "\\\\*[$FTR_VERSO_STRING]"
+. if \\\\n[#HEADER_RULE]=1 .HEADER_RULE
+. ie \\\\n[#FOOTER_RULE]=1 .FOOTER_RULE
+. el .FOOTER_RULE OFF
+. if r #PAGINATE .rr #PAGINATE
+. if r #PAGE_NUM_V_POS .rr #PAGE_NUM_V_POS
+. \}
+.DONE
+.am PRINT_USERDEF_HDRFTR DONE
+. if \\\\n[#HDRFTR_BOTH]=1 \{\
+. if \\n[#FOOTERS_ON]=1 \{\
+. if !\\\\n[#COLLATE]=1 \{\
+. HEADER_RECTO \\*[$HDR_RECTO_QUAD] "\\*[$HDR_RECTO_STRING]"
+. HEADER_VERSO \\*[$HDR_VERSO_QUAD] "\\*[$HDR_VERSO_STRING]"
+. rr #FOOTERS_ON
+. nr #HEADERS_ON 1
+. ie \\\\n[#HEADER_RULE]=1 .HEADER_RULE
+. el .HEADER_RULE OFF
+. \}
+. \}
+. if \\n[#HEADERS_ON]=1 \{\
+. FOOTER_RECTO \\*[$FTR_RECTO_QUAD] "\\*[$FTR_RECTO_STRING]"
+. FOOTER_VERSO \\*[$FTR_VERSO_QUAD] "\\*[$FTR_VERSO_STRING]"
+. \}
+. \}
+.DONE
+.am HEADER DONE
+. if \\\\n[#HDRFTR_BOTH]=1 \{\
+. if r #START_FOR_FOOTERS .rr #START_FOR_FOOTERS
+. rr #HEADERS_ON
+. nr #FOOTERS_ON 1
+. FOOTER_RECTO \\*[$FTR_RECTO_QUAD] "\\*[$FTR_RECTO_STRING]"
+. FOOTER_VERSO \\*[$FTR_VERSO_QUAD] "\\*[$FTR_VERSO_STRING]"
+. ie \\\\n[#FOOTER_RULE]=1 .FOOTER_RULE
+. el .FOOTER_RULE OFF
+. \}
+.DONE
+. \}
+. el \{\
+. rr #HDRFTR_BOTH
+. rr #USERDEF_HDRFTR
+. rm $USERDEF_HDRFTR_RECTO
+. rm $USERDEF_HDRFTR_VERSO
+. FOOTERS OFF
+. HEADERS
+. if \\n[#COLLATE]=1 \{\
+. nr #HEADER_STATE 1
+. nr #PAGINATION_STATE 1
+. \}
+. PAGINATE
+. PAGENUM_POS BOTTOM CENTER
+. nr #HF_OFF 1
+. \}
+.END
+\#
+\# ====================================================================
+\#
+\# +++HEADINGS+++
+\#
+.char \[hd-num-spacer] \0
+.char \[parahead-spacer] \~\~
+.char \[toc-hd-num-spacer] \h'\w'\[en]'u'
+.ds toc-word-space \ \" ie an unbreakable space
+\#
+\# HEADING
+\# -------
+\# *Arguments:
+\# <heading level> [PARAHEAD] [NAMED <pdf-id>] <heading text>
+\# *Function:
+\# Assigns a heading level to the heading text and prints heading
+\# in the style set up for that level. If PARAHEAD given, the
+\# heading is attached to the body of the paragraph. If NAMED
+\# given, creates a target for pdf links. Collects the heading
+\# for the TOC and sets TOC indenting appropriate for the level.
+\# *Notes:
+\# If PARAHEAD given, HEADING must come after PP.
+\#
+.MAC HEADING END
+. ie !r pdfbx-top \{\
+' br
+. if \\n[@TOP] .br
+. \}
+. el \{\
+. if r pdfbx-running .nr pdfbx-top 1
+. \}
+. if !\B'\\$1' \{\
+. tm1 "[mom]: The first argument to \\$0 must be a numeric heading level.
+. ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. \}
+. if r #QUOTE .rr #QUOTE
+. if r #END_QUOTE .rr #END_QUOTE
+. if r #EPIGRAPH .rr #EPIGRAPH
+. vs \\n[#DOC_LEAD]u
+. if \\$1<\\n[#LEVEL] \
+. nr #ACTIVE_LEVELS \\n[#LEVEL] \" loop count for resetting numbering registers
+. nr #LAST_LEVEL \\n[#LEVEL] \" used during TOC collection, if SPACE_TOC_ITEMS
+. nr #LEVEL \\$1 \" resets #LEVEL to arg
+. shift
+. nr #ARG_NUM 0 1
+. while \\n+[#ARG_NUM]<=2 \{\
+. if '\\$1'NAMED' \{\
+. ds PDF_NM "\\$1 \\$2
+. shift 2 \" \\$1 is now heading text
+. \}
+. if '\\$1'PARAHEAD' \{\
+. nr #PARAHEAD 1
+. shift \" \\$1 is now NAMED, if we have it; otherwise heading text
+. \}
+. \}
+.\" Spacing
+. if \\n[#Q_LEAD_DIFF_CHECK] .sp -1
+. if \\n[.t]<\\n[.v] .nr nl-from-heading \\n[nl]
+. ie !\\n[#PARAHEAD] \{\
+. if !\\n[@TOP] \{\
+. nr #HEAD 1
+. ie !\\n[#START] \{\
+. nr #HEADING_NEEDS \\n[#NUM_ARGS]v+\\*[$HEAD_\\n[#LEVEL]_NEEDS]v+1v
+. if \\n[#HEAD_\\n[#LEVEL]_SPACE_AFTER] .nr #HEADING_NEEDS +1v
+. if \\n[.t]<\\n[#HEADING_NEEDS] .sp \\n[.t]u
+. vpt 0
+. if !r pdfbx-top \
+. if !\\n[#SPACE_ADDED] .if !\\n[#LINEBREAK] .sp
+. \}
+. el \{\
+. ie !\\n[#PP] \{\
+. rr #START
+. RESTORE_SPACE
+. if !\\n[#SPACE_ADDED] \
+. if !\\n[#COLUMNS] .sp
+. \}
+. el .sp
+. \}
+. if \\n[#EPIGRAPH] \
+. if \\n[#SINGLE_SPACE] .sp
+. \}
+. if \\n[#PP_SPACE] \
+. if \\n[#QUOTE_4_HD] .sp .5v
+. ie !\\n[#SPACE_ADDED] \{\
+. if !\\n[.ns] \{\
+. ie !\\n[#NO_SHIM] \
+. if !\\n[#HEAD_\\n[#LEVEL]_NO_SHIM] \
+. if !r pdfbx-top .SHIM
+. el \{\
+. if !\\n[#NO_FLEX] \
+. if !\\n[#HEAD_\\n[#LEVEL]_NO_FLEX] \
+. if !r pdfbx-top .FLEX
+. \}
+. \}
+. \}
+. el .rr #SPACE_ADDED
+. vpt
+. \}
+. el \{\
+. if \\n[#NUM_ARGS]>1 \{\
+. tm1 "[mom]: Error at line \\n[.c], \\$0.
+. tm1 " PARAHEAD may not be given more than 1 line of text.
+. ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. \}
+. vpt 0
+. if !(\\n[#PRINT_STYLE]=1)&(\\n[#SINGLE_SPACE]=1) .sp -1v
+. if \\n[#QUOTE_4_HD] \{\
+. sp -1v
+. if \\n[#PP_SPACE] \{\
+. sp .5v
+. SHIM
+. \}
+. \}
+. if (\\n[#QUOTE_4_HD]=0)&(\\n[#LB_4_HD]=0)&(\\n[#START]=0) \
+. if !\\n[#LB_4_PARAHEAD] .sp -1v
+. \}
+. ev HEADING
+. evc 0
+.\" Style
+. if \\n[#PRINT_STYLE]=2 \{\
+. fam \\*[$HEAD_\\n[#LEVEL]_FAM]
+. ft \\*[$HEAD_\\n[#LEVEL]_FT]
+. ps \\n[#DOC_PT_SIZE]u\\*[$HEAD_\\n[#LEVEL]_SIZE]
+. if r pdfbx-top \{\
+. SIZESPECS
+. ie \\n[#PP]=0 \{\
+. rt
+. ds pdfbx-cap-adj \\*[$CAP_HEIGHT]
+. sp (\\*[wt\\n[stack]]/2u)+\\*[pdfbx-cap-adj]+\\*[gap\\n[stack]]u
+. \}
+. el \{\
+. nr pdfbx-cap-adj \\*[$CAP_HEIGHT]-\\*[pdfbx-cap-adj]
+. sp \\n[pdfbx-cap-adj]u
+. \}
+. \}
+. nf
+. \}
+.\" Numbering
+. ds $TOC_HD_NUM_PREV \\*[$TOC_HD_NUM]
+. rm $TOC_HD_NUM
+. rm $PDF_HD_NUM
+. ie \\n[#NUMBER_HEAD_\\n[#LEVEL]] \{\
+. if \\n[#PREFIX_CH_NUM] .ds $HD_NUM \\n[#CH_NUM].
+. nr #HEAD_\\n[#LEVEL]_NUM +1 \" incremented manually here; still auto-increments
+.\" Reset numbering registers for headings beneath current level
+. nr @LEVEL \\n[#LEVEL] 1 \" loop step
+. nr #LOOP \\n[#ACTIVE_LEVELS] \" loop count
+. while \\n+[@LEVEL]<=\\n[#LOOP] \
+. if \\n[#HEAD_\\n[@LEVEL]_NUM] \
+. nr #HEAD_\\n[@LEVEL]_NUM 0 1
+.\" Build numbering strings for body and toc
+. nr @LEVEL 0 1 \" loop step
+. nr #LOOP \\n[#LEVEL] \" loop count
+. while \\n+[@LEVEL]<=\\n[#LOOP] \
+. if \\n[#HEAD_\\n[@LEVEL]_NUM] \
+. as $HD_NUM \\n[#HEAD_\\n[@LEVEL]_NUM].
+. ie \\n[#TRUNC_TOC_HD_NUM] \
+. ds $TOC_HD_NUM \\n[#HEAD_\\n[#LEVEL]_NUM].
+. el .ds $TOC_HD_NUM \\*[$HD_NUM]
+. if \\n[#LEVEL]=1 \
+. ds $TOC_HD_NUM_PREV \\*[$TOC_HD_NUM]
+. if \\n[#TOC_NO_HD_NUM] .rm $TOC_HD_NUM
+. if !\\n[#HEAD_\\n[#LEVEL]_NUM]] .rm $TOC_HD_NUM
+. as $HD_NUM \[hd-num-spacer]
+. ds $PDF_HD_NUM \\*[$TOC_HD_NUM]
+. if !'\\*[$TOC_HD_NUM]'' .as $TOC_HD_NUM \[toc-hd-num-spacer]
+. if !'\\*[$PDF_HD_NUM]'' .as $PDF_HD_NUM " "
+. \}
+. el .nr @LEVEL \\n[#LEVEL] 1
+.\" TOC collection and formatting
+. nr #TOC_ENTRY_PN \\n%+\\n[#PAGE_NUM_ADJ]
+. af #TOC_ENTRY_PN \\g[#PAGENUMBER]
+. nr #ARG_NUM 0 1
+. while \\n[#ARG_NUM]<\\n[#NUM_ARGS] \{\
+. as $TOC_HEAD_\\n[#LEVEL]_ITEM "\\$[\\n+[#ARG_NUM]]
+. if \\n[#NUM_ARGS]>\\n[#ARG_NUM] \
+. as $TOC_HEAD_\\n[#LEVEL]_ITEM "\\*[toc-word-space]
+. \}
+. PDF_BOOKMARK \
+ \\*[PDF_NM] \\n[#LEVEL]+1 \
+ \\*[$PDF_HD_NUM] \\*[$TOC_HEAD_\\n[#LEVEL]_ITEM]
+. rm PDF_NM
+. rm $PDF_HD_NUM
+. ev TOC_EV
+. ie \\n[#PRINT_STYLE]=1 \{\
+. fam \\*[$TYPEWRITER_FAM]
+. ft R
+. ps \\*[$TYPEWRITER_PS]
+. \}
+. el \{\
+. FAMILY \\*[$TOC_HEAD_\\n[#LEVEL]_FAM]
+. FT \\*[$TOC_HEAD_\\n[#LEVEL]_FT]
+. ps \\n[#TOC_PS]u\\*[$TOC_HEAD_\\n[#LEVEL]_SIZE]
+. \}
+.\" Indents for TOC heading levels.
+.\" First, numbered heads. @LEVEL here is #LEVEL+1
+. ie \\n[#NUMBER_HEAD_\\n[#LEVEL]] \{\
+. ie !\\n[#TOC_NO_HD_NUM] \{\
+. ie \\n[#TRUNC_TOC_HD_NUM] \{\
+. if !\\n[#TOC_HEAD_\\n[@LEVEL]_INDENT_SET] \{\
+. ie !\\n[#FROM_STYLE_\\n[@LEVEL]] \{\
+. ie !\\n[#NUMBER_HEAD_\\n[@LEVEL]] \
+. nr #TOC_HEAD_\\n[@LEVEL]_INDENT \
+\\n[#TOC_HEAD_\\n-[@LEVEL]_INDENT]+\
+\w'\\*[$TOC_HD_NUM]'+\
+1.5m
+. el \
+. nr #TOC_HEAD_\\n[@LEVEL]_INDENT \
+\\n[#TOC_HEAD_\\n-[@LEVEL]_INDENT]+\
+\w'\\*[$TOC_HD_NUM]'
+. \}
+. el \
+. nr #TOC_HEAD_\\n[@LEVEL]_INDENT \
+ \\n[#TOC_HEAD_\\n-[@LEVEL]_INDENT]
+. \}
+. \}
+. el \{\
+. if !\\n[#TOC_HEAD_\\n[@LEVEL]_INDENT_SET] \{\
+. ie !\\n[#FROM_STYLE_\\n[@LEVEL]] \{\
+. ie \\n[#NUMBER_HEAD_\\n-[@LEVEL]] \{\
+. ie !\\n[#NUMBER_HEAD_\\n+[@LEVEL]] \
+. nr #TOC_HEAD_\\n[@LEVEL]_INDENT \
+\\n[#TOC_HEAD_\\n-[@LEVEL]_INDENT]+\
+\w'\\*[$TOC_HD_NUM_PREV]'+\
+1.5m
+. el \{\
+.\" Get the number of digits in the chapter number
+. ds ch-num-width \\n[#CH_NUM]
+. length ch-num-width \\*[ch-num-width]
+. nr ch-num-width -1
+. nr num-ch-digits \w'\0'*\\n[ch-num-width]
+. nr #TOC_HEAD_\\n[@LEVEL]_INDENT \
+\\n[#TOC_HEAD_\\n-[@LEVEL]_INDENT]+\
+\\n[num-ch-digits]+\
+\w'.\[toc-hd-num-spacer]'
+. \}
+. \}
+. el \
+. nr #TOC_HEAD_\\n[@LEVEL]_INDENT \
+\\n[#TOC_HEAD_\\n-[@LEVEL]_INDENT]+\
+\w'\\n[#TOC_HD_NUM].'
+. ie \\n[#LEVEL]=1 \
+. nr #TOC_HEAD_\\n+[@LEVEL]_INDENT +\w'\0'
+. el \{\
+. if !\\n[#NUMBER_HEAD_\\n[@LEVEL]] \{\
+. nr @LEVEL \\n+[@LEVEL] 1
+. nr #TOC_HEAD_\\n+[@LEVEL]_INDENT +\w'\0'
+. \}
+. \}
+. \}
+. el \
+. nr #TOC_HEAD_\\n[@LEVEL]_INDENT \
+\\n[#TOC_HEAD_\\n-[@LEVEL]_INDENT]+\
+\\n[#TOC_HEAD_\\n+[@LEVEL]_INDENT]
+. \}
+. if \\n[#LEVEL]=1 \{\
+. if \\n[#NUMBER_HEAD_\\n[@LEVEL]] \{\
+. if \\n[#PREFIX_CH_NUM] \
+. nr #TOC_HEAD_\\n[@LEVEL]_INDENT \
+\w'\\*[$TOC_HD_NUM]'
+. \}
+. \}
+. \}
+. \}
+. el \{\
+. ie !\\n[#FROM_STYLE_\\n[@LEVEL]] \{\
+. if !\\n[#TOC_HEAD_\\n[@LEVEL]_INDENT_SET] \
+. nr #TOC_HEAD_\\n[@LEVEL]_INDENT \
+ \\n[#TOC_HEAD_\\n-[@LEVEL]_INDENT]+1.5m
+. \}
+. el \{\
+. if !\\n[#TOC_HEAD_\\n[@LEVEL]_INDENT_SET] \
+. nr #TOC_HEAD_\\n[@LEVEL]_INDENT \
+\\n[#TOC_HEAD_\\n-[@LEVEL]_INDENT]+\
+\\n[#TOC_HEAD_\\n+[@LEVEL]_INDENT]
+. \}
+. \}
+. \}
+.\" Non-numbered heads
+. el \{\
+. nr @LEVEL \\n[#LEVEL] 1
+.\" increments @LEVEL even if false
+. ie \\n[#FROM_STYLE_\\n+[@LEVEL]] \{\
+. if !\\n[#TOC_HEAD_\\n[@LEVEL]_INDENT_SET] \{\
+. nr #TOC_HEAD_\\n[@LEVEL]_INDENT \
+\\n[#TOC_HEAD_\\n[#LEVEL]_INDENT]+\
+\\n[#TOC_HEAD_\\n[@LEVEL]_INDENT]
+. if !\\n[#LEVEL]=\\n[#LAST_LEVEL] \{\
+. if \\n[#NUMBER_HEAD_\\n[@LEVEL]] \
+. nr #TOC_HEAD_\\n[#LEVEL]_INDENT \
+\\n[#TOC_HEAD_\\n[@LEVEL]_INDENT]+\
+\w'\\*[$TOC_HD_NUM_PREV]'
+. \}
+. \}
+. \}
+. el \{\
+. nr #TOC_HEAD_\\n[@LEVEL]_INDENT \
+ \\n[#TOC_HEAD_\\n-[@LEVEL]_INDENT]+1.5m
+. if \\n[#LEVEL]=1 \{\
+. if !\\n[#FROM_STYLE_1] \
+. nr #TOC_HEAD_1_INDENT 0
+. \}
+. \}
+. \}
+. nr #TOC_HEAD_\\n[@LEVEL]_INDENT_SET 1
+. HD_TO_TOC
+. rm $TOC_HEAD_\\n[#LEVEL]_ITEM
+.\" Print heading
+. if !\\n[#PARAHEAD] .\\*[$HEAD_\\n[#LEVEL]_QUAD]
+. if \\n[#CAPS_ON] \{\
+. CAPS OFF
+. nr #CAPS_RESTORE 1
+. \}
+. if \\n[#HEAD_\\n[#LEVEL]_CAPS] \{\
+. CAPS
+. nr #CAPS_OFF 1
+. \}
+. if \\n[#SMALLCAPS_ON] \{\
+. SMALLCAPS OFF
+. nr #SMALLCAPS_RESTORE 1
+. \}
+. if \\n[#HEAD_\\n[#LEVEL]_SMALLCAPS] \{\
+. SMALLCAPS
+. nr #SMALLCAPS_OFF 1
+. \}
+. if !'\\*[$HEAD_\\n[#LEVEL]_COLOR]'' \
+. COLOR \\*[$HEAD_\\n[#LEVEL]_COLOR]
+. nop \X'ps: exec decornone'\c
+. if r pdfbx-top \{\
+. ds $RESTORE_ADJ \\*[$HEAD_\\n[#LEVEL]_BASELINE_ADJ]
+. ds $HEAD_\\n[#LEVEL]_BASELINE_ADJ 0
+. \}
+. nr #ARG_NUM 0 1
+. while \\n+[#ARG_NUM]<=\\n[#NUM_ARGS] \{\
+. if \\n[#PARAHEAD] \
+. nr #PP_TEXT_OFFSET \
+ \w'\\*[$HD_NUM]\\$[\\n[#ARG_NUM]]'+\w'\[parahead-spacer]'
+. if (\\n[#HEAD_\\n[#LEVEL]_UNDERSCORE]=0)&(\\n[#HEAD_\\n[#LEVEL]_UNDERSCORE2]=0) \{\
+. ie \\n[#HD_NUM_INDENT] \{\
+. if !'\\*[$HEAD_\\n[#LEVEL]_QUAD]'CENTER' \
+. ti \\n[#HD_NUM_INDENT]u
+. PRINT \
+"\v'-\\*[$HEAD_\\n[#LEVEL]_BASELINE_ADJ]'\\$[\\n[#ARG_NUM]]
+. br
+. \}
+. el \{\
+. ie !\\n[#PARAHEAD] \{\
+. PRINT \
+"\v'-\\*[$HEAD_\\n[#LEVEL]_BASELINE_ADJ]'\\*[$HD_NUM]\\$[\\n[#ARG_NUM]]
+. br
+. \}
+. el \{\
+. if (\\n[#PP]>0):(\\n[#INDENT_FIRST_PARAS]) \{\
+. if !\\n[#LB_4_PARAHEAD] \{\
+. if !\\n[#START] \{\
+. if \\n[#PP_ACTIVE] \{\
+. ie \\n[#PP]=1 .br
+. el \{\
+. nr #PP_TEXT_OFFSET +\\n[#PP_INDENT]
+. ie !\\n[pdfbx-running] .ti \\n[#PP_INDENT]u
+. el .ti \\n[#PP_INDENT]u+\\*[wt\\n[stack]]+\\*[gap\\n[stack]]u
+. \}
+. \}
+. \}
+. \}
+. \}
+. ie \\n[#PRINT_STYLE]=1 \
+. PRINT "\\*[UL]\\*[$HD_NUM]\\$[\\n[#ARG_NUM]]\\*[ULX]
+. el .PRINT "\\*[$HD_NUM]\\$[\\n[#ARG_NUM]]
+. rr #LB_4_PARAHEAD
+. sp -1v
+. \}
+. \}
+. \}
+. if \\n[#HEAD_\\n[#LEVEL]_UNDERSCORE] \{\
+. nr #SAVED_UL_WEIGHT \\n[#UNDERSCORE_WEIGHT]
+. UNDERSCORE_WEIGHT \\*[$HEAD_\\n[#LEVEL]_UL_WEIGHT]
+. ie \\n[#HD_NUM_INDENT] \{\
+. if !'\\*[$HEAD_\\n[#LEVEL]_QUAD]'CENTER' \
+. ti \\n[#HD_NUM_INDENT]u
+. UNDERSCORE \\*[$HEAD_\\n[#LEVEL]_UL_GAP] \
+ "\v'-\\*[$HEAD_\\n[#LEVEL]_BASELINE_ADJ]'\\$[\\n[#ARG_NUM]]
+. br
+. \}
+. el \{\
+. ie !\\n[#PARAHEAD] \{\
+. UNDERSCORE \\*[$HEAD_\\n[#LEVEL]_UL_GAP] \
+"\v'-\\*[$HEAD_\\n[#LEVEL]_BASELINE_ADJ]'\\*[$HD_NUM]\\$[\\n[#ARG_NUM]]
+. br
+. \}
+. el \{\
+. if (\\n[#PP]>0):(\\n[#INDENT_FIRST_PARAS]) \{\
+. if !\\n[#LB_4_HD] \{\
+. if !\\n[#START] \{\
+. if \\n[#PP_ACTIVE] \{\
+. nr #PP_TEXT_OFFSET +\\n[#PP_INDENT]
+. if (\\n[#PRINT_STYLE]=1)&(\\n[#SINGLE_SPACE]=1) .sp -1v
+. ti \\n[#PP_INDENT]u
+. \}
+. \}
+. \}
+. \}
+. UNDERSCORE \\*[$HEAD_\\n[#LEVEL]_UL_GAP] \
+ "\\*[$HD_NUM]\\$[\\n[#ARG_NUM]]
+. sp -1v
+. \}
+. \}
+. nr #UNDERSCORE_WEIGHT \\n[#SAVED_UL_WEIGHT]
+. \}
+. if \\n[#HEAD_\\n[#LEVEL]_UNDERSCORE2] \{\
+. nr #SAVED_UL2_WEIGHT \\n[#UNDERSCORE_WEIGHT]
+. UNDERSCORE_WEIGHT \\*[$HEAD_\\n[#LEVEL]_UL2_WEIGHT]
+. ie \\n[#HD_NUM_INDENT] \{\
+. if !'\\*[$HEAD_\\n[#LEVEL]_QUAD]'CENTER' \
+. ti \\n[#HD_NUM_INDENT]u
+. UNDERSCORE2 \\*[$HEAD_\\n[#LEVEL]_UL2_GAP_1] \
+ \\*[$HEAD_\\n[#LEVEL]_UL2_GAP_2] \
+ "\v'-\\*[$HEAD_\\n[#LEVEL]_BASELINE_ADJ]'\\$[\\n[#ARG_NUM]]
+. br
+. \}
+. el \{\
+. ie !\\n[#PARAHEAD] \{\
+. UNDERSCORE2 \\*[$HEAD_\\n[#LEVEL]_UL2_GAP_1] \
+ \\*[$HEAD_\\n[#LEVEL]_UL2_GAP_2] \
+"\v'-\\*[$HEAD_\\n[#LEVEL]_BASELINE_ADJ]'\\*[$HD_NUM]\\$[\\n[#ARG_NUM]]
+. br
+. \}
+. el \{\
+. if (\\n[#PP]>0):(\\n[#INDENT_FIRST_PARAS]) \{\
+. if !\\n[#LB_4_HD] \{\
+. if !\\n[#START] \{\
+. if \\n[#PP_ACTIVE] \{\
+. nr #PP_TEXT_OFFSET +\\n[#PP_INDENT]
+. if (\\n[#PRINT_STYLE]=1)&(\\n[#SINGLE_SPACE]=1) \
+. sp -1v
+. ti \\n[#PP_INDENT]u
+. \}
+. \}
+. \}
+. \}
+. UNDERSCORE2 \\*[$HEAD_\\n[#LEVEL]_UL2_GAP_1] \
+\\*[$HEAD_\\n[#LEVEL]_UL2_GAP_2] "\\*[$HD_NUM]\\$[\\n[#ARG_NUM]]
+. sp -1v
+. \}
+. \}
+. nr #UNDERSCORE_WEIGHT \\n[#SAVED_UL2_WEIGHT]
+. \}
+. if !\\n[#HD_NUM_INDENT] .nr #HD_NUM_INDENT \w'\\*[$HD_NUM]'
+. \}
+. if r pdfbx-top \{\
+. ds $HEAD_\\n[#LEVEL]_BASELINE_ADJ \\*[$RESTORE_ADJ]
+. if !\\n[#PARAHEAD] .sp \\*[$HEAD_\\n[#LEVEL]_BASELINE_ADJ]
+. \}
+. if !\\n[#PARAHEAD] \
+. if \\n[#HEAD_\\n[#LEVEL]_SPACE_AFTER] .sp
+. if \\n[#CAPS_OFF] \{\
+. CAPS OFF
+. rr #CAPS_OFF
+. \}
+. if \\n[#CAPS_RESTORE] \{\
+. CAPS
+. rr #CAPS_RESTORE
+. \}
+. if \\n[#SMALLCAPS_OFF] \{\
+. SMALLCAPS OFF
+. rr #SMALLCAPS_OFF
+. \}
+. if \\n[#SMALLCAPS_RESTORE] \{\
+. SMALLCAPS
+. rr #SMALLCAPS_RESTORE
+. \}
+. ev
+. rm $HD_NUM
+. rr #HD_NUM_INDENT
+. if \\n[@TOP] \{\
+. ch RR_@TOP
+. rr @TOP
+. rs
+. nop \&
+. sp -1
+. \}
+. if \\n[#PARAHEAD] \{\
+. ie !\\n[pdfbx-running] .ti \\n[#PP_TEXT_OFFSET]u
+. el .ti \\n[#PP_TEXT_OFFSET]u+\\*[wt\\n[stack]]+\\*[gap\\n[stack]]u
+. \}
+. if !\\n[#PARAHEAD] .nr #PP 0
+. rr #PARAHEAD
+. if \\n[#LB_4_HD] .rr #LB_4_HD
+. if \\n[#QUOTE_4_HD] .rr #QUOTE_4_HD
+. vpt
+. rr nl-from-heading
+. if r pdfbx-top \{\
+. rr pdfbx-top
+. nr pdfbx-top\\n[stack] 1
+. \}
+.END
+\#
+\# HEADING_STYLE
+\# -------------
+\# *Arguments:
+\# <level>
+\# FAMILY <family>
+\# FONT <font>
+\# SIZE <+|-n>
+\# COLOR <color>
+\# CAPS | NO_CAPS
+\#---when called as HEADING_STYLE, these are also available---
+\# QUAD <direction>
+\# NUMBER | NO_NUMBER
+\# SPACE_AFTER | NO_SPACE_AFTER
+\# UNDERSCORE <weight> <gap> | UNDERSCORE2 <weight> <gap1> <gap2>
+\# NO_UNDERSCORE | NO_UNDERSCORE2
+\# BASELINE_ADJUST
+\#---when called as TOC_ENTRY_STYLE this is also available---
+\# INDENT
+\# *Function:
+\# Sets up complete style parameters for HEADING <level>. If
+\# invoked as TOC_ENTRY_STYLE, sets up parameters for the
+\# corresponding TOC entry at <level>.
+\# *Notes:
+\# Arguments may be given in any order. Any not given retain
+\# their current values. Defaults for an initial 9 levels of
+\# heading are set up in PRINTSTYLE.
+\#
+\# NUMBER indicates that hierarchic numbering of <level> should be
+\# prepended to heading text. If invoked as TOC_ENTRY_STYLE,
+\# prepend numbering to TOC entries at <level> (only works if
+\# NUMBER is given to the corresponding HEADING <level>).
+\#
+\# INDENT refers to the indent for <level> in the TOC. It is
+\# measured from the left offset of the entry level above it
+\# (including numbering, if present). TOC entry levels beneath
+\# <level> will have their indents adjusted accordingly.
+\#
+.MAC HEADING_STYLE END
+. if !'\\$0'TOC_HEADING_STYLE' \{\
+. if !\B'\\$1' \{\
+. tm1 "[mom]: The first argument to \\$0 must be a numeric heading level.
+. ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. \}
+. nr #LEVEL \\$1
+. if \\n[#FROM_OLDSTYLE] .nr #LEVEL_\\n[#LEVEL]_SET 1
+. shift
+.\" Prepend TOC_ to style strings if called as TOC_ENTRY_STYLE
+. \}
+. if '\\$0'TOC_ENTRY_STYLE' .ds $TOC TOC_
+. nr #ARG_NUM 0 1
+. nr #ATTRIB \\n[#NUM_ARGS]
+. while \\n+[#ARG_NUM]<=\\n[#ATTRIB] \{\
+. if '\\$1'UNDERSCORE' \{\
+. nr #HEAD_\\n[#LEVEL]_UNDERSCORE 1
+. shift
+. if '\\$1'' \{\
+. tm1 "[mom]: The UNDERSCORE argument to \\$0 requires a rule weight.
+. ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. \}
+. ds $HEAD_\\n[#LEVEL]_UL_WEIGHT \\$1
+. shift
+. if '\\$1'' \{\
+. tm1 "[mom]: The UNDERSCORE argument to \\$0 requires a rule gap.
+. ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. \}
+. ds $HEAD_\\n[#LEVEL]_UL_GAP \\$1
+. shift
+. \}
+. if '\\$1'NO_UNDERSCORE' \{\
+. rr #HEAD_\\n[#LEVEL]_UNDERSCORE
+. shift
+. \}
+. if '\\$1'UNDERSCORE2' \{\
+. nr #HEAD_\\n[#LEVEL]_UNDERSCORE2 1
+. shift
+. if '\\$1'' \{\
+. tm1 "[mom]: The UNDERSCORE2 argument to \\$0 requires a rule weight.
+. ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. \}
+. ds $HEAD_\\n[#LEVEL]_UL2_WEIGHT \\$1
+. shift
+. if '\\$1'' \{\
+. tm1 "[mom]: The UNDERSCORE2 argument to \\$0 requires a rule gap.
+. ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. \}
+. ds $HEAD_\\n[#LEVEL]_UL2_GAP_1 \\$1
+. shift
+. if '\\$1'' \{\
+. tm1 "[mom]: The UNDERSCORE2 argument to \\$0 requires an inter-rule gap.
+. ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. \}
+. ds $HEAD_\\n[#LEVEL]_UL2_GAP_2 \\$1
+. shift
+. \}
+. if '\\$1'NO_UNDERSCORE2' \{\
+. rr #HEAD_\\n[#LEVEL]_UNDERSCORE2
+. shift
+. \}
+. if '\\$1'SPACE_ABOVE' \{\
+. shift
+. ds $SPACE_ABOVE \\$1
+. shift
+. \}
+. if '\\$1'SPACE_BENEATH' \{\
+. shift
+. ds $SPACE_BENEATH \\$1
+. shift
+. \}
+. if '\\$1'SPACE_AFTER' \{\
+. nr #HEAD_\\n[#LEVEL]_SPACE_AFTER 1
+. shift
+. \}
+. if '\\$1'NO_SPACE_AFTER' \{\
+. rr #HEAD_\\n[#LEVEL]_SPACE_AFTER
+. shift
+. \}
+. if '\\$1'FAMILY' \{\
+. shift
+. ds $\\*[$TOC]HEAD_\\n[#LEVEL]_FAM \\$1
+. if '\\$0'TOC_HEADING_STYLE' .ds $TOC_HEADING_FAM \\$1
+. shift
+. \}
+. if '\\$1'FONT' \{\
+. shift
+. ds $\\*[$TOC]HEAD_\\n[#LEVEL]_FT \\$1
+. if '\\$0'TOC_HEADING_STYLE' .ds $TOC_HEADING_FT \\$1
+. shift
+. \}
+. if '\\$1'SIZE' \{\
+. shift
+. ds $\\*[$TOC]HEAD_\\n[#LEVEL]_SIZE \\$1
+. if '\\$0'TOC_HEADING_STYLE' .ds $TOC_HEADING_SIZE \\$1
+. shift
+. \}
+. if '\\$1'QUAD' \{\
+. shift
+. ds $QUAD_TYPE \\$1
+. substring $QUAD_TYPE 0 0
+. ie !'\\$0'TOC_HEADING_STYLE' \{\
+. if '\\*[$QUAD_TYPE]'L' .ds $HEAD_\\n[#LEVEL]_QUAD LEFT
+. if '\\*[$QUAD_TYPE]'C' .ds $HEAD_\\n[#LEVEL]_QUAD CENTER
+. if '\\*[$QUAD_TYPE]'R' .ds $HEAD_\\n[#LEVEL]_QUAD RIGHT
+. \}
+. el \{\
+. if '\\*[$QUAD_TYPE]'L' .ds $TOC_HEADING_QUAD LEFT
+. if '\\*[$QUAD_TYPE]'C' .ds $TOC_HEADING_QUAD CENTER
+. if '\\*[$QUAD_TYPE]'R' .ds $TOC_HEADING_QUAD RIGHT
+. \}
+. shift
+. \}
+. if '\\$1'COLOR' \{\
+. shift
+. ds $\\*[$TOC]HEAD_\\n[#LEVEL]_COLOR \\$1
+. if '\\$0'TOC_HEADING_STYLE' .ds $TOC_HEADING_COLOR \\$1
+. shift
+. \}
+. if '\\$1'BASELINE_ADJUST' \{\
+. shift
+. ds $HEAD_\\n[#LEVEL]_BASELINE_ADJ \\$1
+. shift
+. \}
+. if '\\$1'CAPS' \{\
+. nr #\\*[$TOC]HEAD_\\n[#LEVEL]_CAPS 1
+. shift
+. \}
+. if '\\$1'NO_CAPS' \{\
+. rr #HEAD_\\n[#LEVEL]_CAPS
+. shift
+. \}
+. if '\\$1'SMALLCAPS' \{\
+. nr #\\*[$TOC]HEAD_\\n[#LEVEL]_SMALLCAPS 1
+. shift
+. \}
+. if '\\$1'NO_SMALLCAPS' \{\
+. rr #HEAD_\\n[#LEVEL]_SMALLCAPS
+. shift
+. \}
+. if '\\$1'NUMBER' \{\
+. nr #NUMBER_HEAD_\\n[#LEVEL] 1
+. nr #HEAD_\\n[#LEVEL]_NUM 0 1
+. shift
+. \}
+. if '\\$1'NO_NUMBER' \{\
+. rr #NUMBER_HEAD_\\n[#LEVEL]
+. shift
+. \}
+. if '\\$1'PREFIX_CHAPTER' \{\
+. shift
+. ie \B'\\$1' \{\
+. PREFIX_CHAPTER_NUMBER \\$1
+. \}
+. el .PREFIX_CHAPTER_NUMBER
+. \}
+. if '\\$1'INDENT' \{\
+. shift
+. nr #TOC_HEAD_\\n[#LEVEL]_INDENT \\$1
+. nr #FROM_STYLE_\\n[#LEVEL] 1
+. shift
+. \}
+. if '\\$1'NEEDS' \{\
+. shift
+. ds $HEAD_\\n[#LEVEL]_NEEDS \\$1
+. shift
+. \}
+. if '\\$1'SHIM' \{\
+. rr #HEAD_\\n[#LEVEL]_NO_SHIM
+. shift
+. \}
+. if '\\$1'NO_SHIM' \{\
+. nr #HEAD_\\n[#LEVEL]_NO_SHIM 1
+. shift
+. \}
+. if '\\$1'FLEX' \{\
+. rr #HEAD_\\n[#LEVEL]_NO_FLEX
+. shift
+. \}
+. if '\\$1'NO_FLEX' \{\
+. nr #HEAD_\\n[#LEVEL]_NO_FLEX 1
+. shift
+. \}
+. \}
+. rr #LEVEL
+. if d$TOC .rm $TOC
+.END
+.
+.ALIAS TOC_ENTRY_STYLE HEADING_STYLE
+.ALIAS TOC_HEADING_STYLE HEADING_STYLE
+\#
+\# OLDSTYLE HEADINGS
+\# -----------------
+\# *Arguments:
+\# None.
+\# *Function:
+\# Called from HEAD, SUBHEAD, and SUBSUBHEAD, sets style
+\# parameters for HEADINGs 1-3 to former mom defaults for those macros.
+\# Any styles already assigned to those levels are retained.
+\#
+\# Called by user with no argument, allows use of old style HEAD,
+\# SUBHEAD, and SUBSUBHEAD without generating the deprecated msg.
+\# *Notes:
+\# For backward compatibility, and to ease the transition to
+\# the HEADING scheme for heads.
+\#
+\# Paraheads must be set with .HEADING <level> PARAHEAD; attempts
+\# to call PARAHEAD abort with an instructive message.
+\#
+.MAC OLDSTYLE_HEADINGS END
+. if '\\$1'' .nr #SKIP_MSG 1
+. nr #FROM_OLDSTYLE 1 \" Used in HEADING
+. if \\n[#PRINT_STYLE]=1 \{\
+. if !\\n[#LEVEL_1_SET] \{\
+. HEADING_STYLE 1 \
+ FONT R \
+ SIZE +0 \
+ QUAD C \
+ CAPS \
+ UNDERSCORE .5 2p \
+ BASELINE_ADJUST 0 \
+ SPACE_AFTER
+. nr #OLDSTYLE_HD 1
+. return
+. \}
+. if !\\n[#LEVEL_2_SET] \{\
+. HEADING_STYLE 2 \
+ FONT R \
+ SIZE +0 \
+ UNDERSCORE .5 2p \
+ BASELINE_ADJUST \\n[.v]/8
+. nr #OLDSTYLE_SH 1
+. return
+. \}
+. if !\\n[#LEVEL_3_SET] \{\
+. HEADING_STYLE 3 \
+ FONT R \
+ SIZE +0 \
+ BASELINE_ADJUST \\n[.v]/8
+. nr #OLDSTYLE_SSH 1
+. return
+. \}
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. if !\\n[#LEVEL_1_SET] \{\
+. HEADING_STYLE 1 \
+ FAMILY \E*[$DOC_FAM] \
+ FONT B \
+ SIZE +1 \
+ QUAD C \
+ CAPS \
+ UNDERSCORE .5 2p \
+ BASELINE_ADJUST 0 \
+ SPACE_AFTER
+. nr #OLDSTYLE_HD 1
+. return
+. \}
+. if !\\n[#LEVEL_2_SET] \{\
+. HEADING_STYLE 2 \
+ FAMILY \E*[$DOC_FAM] \
+ FONT B \
+ SIZE +.5 \
+ BASELINE_ADJUST \\n[.v]/8
+. nr #OLDSTYLE_SH 1
+. return
+. \}
+. if !\\n[#LEVEL_3_SET] \{\
+. HEADING_STYLE 3 \
+ FAMILY \E*[$DOC_FAM] \
+ FONT I \
+ SIZE +.5 \
+ BASELINE_ADJUST \\n[.v]/8
+. nr #OLDSTYLE_SSH 1
+. return
+. \}
+. \}
+. rr #FROM_OLDSTYLE
+.END
+\#
+\# "Deprecated" message
+\#
+.MAC DEPRECATED END
+. if !\\n[#SKIP_MSG] \{\
+. tm1 "[mom]: Macro '\\$1' at line \\n[.c] is deprecated.
+. tm1 " Invoking HEADING \\$2 instead and assigning style defaults
+. tm1 " from former \\$1 as described in the documentation.
+. tm1 " If another style is desired, use HEADING_STYLE \\$2 to
+. tm1 " create it (see docs).
+. tm1 " Further warnings will not be emitted for \\$1.
+. tm1 " To avoid this message when using the deprecated HEAD,
+. tm1 " SUBHEAD, and SUBSUBHEAD macros, add '.OLDSTYLE_HEADINGS'
+. tm1 " after PRINTSTYLE before START.
+. rm $MACRO
+. \}
+.END
+\#
+\# Wrappers around old-style headings.
+\#
+.MAC HEAD END
+. if !\\n[#OLDSTYLE_HD] \{\
+. DEPRECATED HEAD 1
+. OLDSTYLE_HEADINGS HEAD
+. \}
+. HEADING 1 \\$@
+.END
+\#
+.MAC SUBHEAD END
+. if !\\n[#OLDSTYLE_SH] \{\
+. DEPRECATED SUBHEAD 2
+. OLDSTYLE_HEADINGS SUBHEAD
+. \}
+. HEADING 2 \\$@
+.END
+\#
+.MAC SUBSUBHEAD END
+. if !\\n[#OLDSTYLE_SSH] \{\
+. DEPRECATED SUBSUBHEAD 3
+. OLDSTYLE_HEADINGS SUBSUBHEAD
+. \}
+. HEADING 3 \\$@
+.END
+\#
+.MAC PARAHEAD END
+. tm1 "[mom]: \\$0 is no longer a valid macro.
+. tm1 " Use 'HEADING <level> PARAHEAD <text>' instead.
+. tm1 " You will probably want to invoke HEADING_STYLE to set
+. tm1 " the type parameters for the parahead. See docs.
+. ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+.END
+\#
+\# Wrapper macro for oldstyle NUMBER_HEADS, NUMBER_SUBHEADS...
+\#
+.MAC HEADING_NUMBERS END
+. if '\\$0'NUMBER_PARAHEADS' \{\
+. tm1 "[mom]: \\$0 is no longer a valid macro.
+. tm1 " Use 'HEADING_STYLE <level> NUMBER' instead. See docs.
+. ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. return
+. \}
+. if '\\$0'NUMBER_HEADS' .nr level 1
+. if '\\$0'NUMBER_SUBHEADS' .nr level 2
+. if '\\$0'NUMBER_SUBSUBHEADS' .nr level 3
+. ds mom "[mom]:\"
+. ie '\\$1'' .ds $PARAM NUMBER
+. el \{\
+. ds $PARAM NO_NUMBER
+. ds $SWITCH " \\$1
+. \}
+. HEADING_STYLE \\n[level] \\*[$PARAM]
+. if (\\n[#OLDSTYLE_HD]=1):(\\n[#OLDSTYLE_SH]=1):(\\n[#OLDSTYLE_SSH]=1) \{\
+. tm1 "\\*[mom] OLDSTYLE_HEADINGS detected.
+. ds mom " \"
+. \}
+. tm1 "\\*[mom] Setting HEADING_STYLE \\n[level] to '\\*[$PARAM]' at '\\$0\\*[$SWITCH]', line \\n[.c].
+. rm $PARAM
+. rm $SWITCH
+.END
+.
+.ALIAS NUMBER_HEADS HEADING_NUMBERS
+.ALIAS NUMBER_SUBHEADS HEADING_NUMBERS
+.ALIAS NUMBER_SUBSUBHEADS HEADING_NUMBERS
+.ALIAS NUMBER_PARAHEADS HEADING_NUMBERS
+\#
+\# PREFIX CHAPTER NUMBERS TO HEADINGS/TOC ENTRIES
+\# ----------------------------------------------
+\# *Arguments:
+\# <none> | <chapter number> | <anything>
+\# *Function:
+\# Toggles register #PREFIX_CH_NUM. Uses $CHAPTER to set #CH_NUM
+\# if $CHAPTER is a digit; if <chapter number> given, sets #CH_NUM
+\# to arg.
+\# *Notes:
+\# Default is OFF.
+\#
+.MAC PREFIX_CHAPTER_NUMBER END
+. if \\n[#NUM_ARGS]=0 \{\
+. if !'\\*[$CHAPTER]'' \{\
+. if !\B'\\*[$CHAPTER]' \{\
+. tm1 "[mom]: \\$0 at line \\n[.c] cannot determine a chapter number.
+. tm1 " Enter the current chapter number as a digit after PREFIX_CHAPTER.
+. ab [mom]: Aborting '\\n[.F]', line \\n[.c].
+. \}
+. \}
+. \}
+. ie '\\$1'' .nr #PREFIX_CH_NUM 1
+. el \{\
+. ie \B'\\$1' \{\
+. nr #PREFIX_CH_NUM 1
+. nr #CH_NUM \\$1
+. \}
+. el .rr #PREFIX_CH_NUM
+. \}
+.END
+\#
+\# ====================================================================
+\#
+\# +++LINE BREAKS+++
+\#
+\# LINEBREAK CHARACTER
+\# -------------------
+\# *Arguments:
+\# [character] [iterations] [vertical adjustment]
+\# *Function:
+\# Allows user to specify a line break character and the number
+\# of times to repeat it horizontally.
+\# *Notes:
+\# Without an argument, LINEBREAK_CHAR will deposit a blank line.
+\#
+\# Vertical adjustment requires a unit of measure (most likely
+\# "p"), and has to be preceded by +|-
+\#
+.MAC LINEBREAK_CHAR END
+. nr #REPEAT 1
+. ds $LINEBREAK_CHAR \\$1
+. if !'\\$2'' .nr #LB_CHAR_ITERATIONS \\$2
+. if !'\\$3'' .ds $LINEBREAK_CHAR_V_ADJ \\$3
+. if '\\*[$LINEBREAK_CHAR_V_ADJ]'' .ds $LINEBREAK_CHAR_V_ADJ +0
+. if \\n[#LB_CHAR_ITERATIONS] \{\
+. while (\\n[#LB_CHAR_ITERATIONS]>\\n[#REPEAT]) \{\
+. as $LINEBREAK_CHAR "\\ \\$1
+. nr #REPEAT \\n[#REPEAT]+1
+. \}
+. \}
+. rr #REPEAT
+. rr #LB_CHAR_ITERATIONS
+.END
+\#
+\# LINE BREAK
+\# ----------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Deposits line break character.
+\# *Notes:
+\# If $LINEBREAK_CHAR is blank, simply advances 2 line spaces.
+\#
+.MAC LINEBREAK END
+. if r #Q_AT_TOP .rr #Q_AT_TOP
+. if \\n[@TOP] .RESTORE_SPACE
+. ie '\\*[$LINEBREAK_CHAR]'' \{\
+. br
+. nop \&
+. sp
+. \}
+. el \{\
+. ie \\n[#END_QUOTE] .
+. el .sp
+. ev LINEBREAK
+. evc 0
+. CENTER
+. PRINT \
+\m[\\*[$LINEBREAK_COLOR]]\v'\\*[$LINEBREAK_CHAR_V_ADJ]'\
+\\*[$LINEBREAK_CHAR]\m[]
+. sp
+. ev
+. QUAD \\*[$DOC_QUAD]
+. \}
+. nr #LINEBREAK 1
+. if r #QUOTE .rr #QUOTE
+. if r #END_QUOTE .rr #END_QUOTE
+. nr #PP 0
+. nr #LB_4_HD 1
+. nr #LB_4_PARAHEAD 1
+.END
+\#
+\# ====================================================================
+\#
+\# +++PARAGRAPHS+++
+\#
+\# PARAGRAPH FONT
+\# --------------
+\# *Argument:
+\# <font of running text>
+\# *Function:
+\# Creates or modifies string $PP_FT.
+\# *Notes:
+\# Affects all paragraphs.
+\#
+.MAC PP_FONT END
+. if \\n[#PRINT_STYLE]=1 \{\
+. ie \\n[#ITALIC_MEANS_ITALIC] .nop
+. el .return
+. \}
+. if \\n[#COLLATE]=1 \
+. if !'\\*[$SAVED_PP_FT]'' .rm $SAVED_PP_FT
+. ds $PP_FT \\$1
+. FT \\*[$PP_FT]
+.END
+\#
+\# PARAGRAPH INDENT
+\# ----------------
+\# *Argument:
+\# <amount to indent paragraphs in running text (ipPcm)>
+\# *Function:
+\# Allows user to change the default para indent. The change will
+\# affect the indent of QUOTEs and BLOCKQUOTEs as well.
+\# *Notes:
+\# Default for printstyle TYPEWRITE is 1/2-inch. Default for
+\# printstyle TYPESET is 2 ems. The defaults are set in
+\# PRINTSTYLE, not DEFAULTS.
+\#
+.MAC PARA_INDENT END
+. ie \B'\\$1' \{\
+. nr #PP_INDENT (\\$1)
+. nr #SAVED_PP_INDENT \\n[#PP_INDENT]
+. \}
+. el \{\
+. ie '\\$1'' \{\
+. nr #PP_INDENT \\n[#SAVED_PP_INDENT]
+. rr #SAVED_PP_INDENT
+. \}
+. el \{\
+. nr #SAVED_PP_INDENT \\n[#PP_INDENT]
+. rr #PP_INDENT
+. \}
+. \}
+.END
+\#
+\# INDENT FIRST PARAGRAPHS
+\# -----------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# By default, the first para of a document, as well as the first
+\# paras of blockquotes and block-style epigraphs are not indented.
+\# When invoked, this macro will indent all paras.
+\# *Notes:
+\# Default is OFF.
+\#
+.MAC INDENT_FIRST_PARAS END
+. ie '\\$1'' .nr #INDENT_FIRST_PARAS 1
+. el .rr #INDENT_FIRST_PARAS
+.END
+\#
+\# INTER-PARAGRAPH SPACING
+\# -----------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Adds a line space between paragraphs in body text. Block quotes
+\# are unaffected.
+\# *Notes:
+\# Default is OFF. PARA_SPACE is not recommended for use with
+\# PRINTSTYLE TYPEWRITE without SINGLESPACE.
+\#
+.MAC PARA_SPACE END
+. ie '\\$1'' \
+. nr #PP_SPACE 1
+. el \{\
+. ie \B'\\$1' \{\
+. nr #PP_SPACE 1
+. ds $PP_SPACE_AMOUNT \\$1
+. \}
+. el .rr #PP_SPACE
+. \}
+.END
+\#
+\# PARAGRAPH
+\# ---------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Figures out what to do with paragraphs under differing conditions.
+\# *Notes:
+\# Note the use of transparent line break (\!.br) to get
+\# PP to work within blockquotes and epigraphs.
+\#
+\# PP_STYLE 1 = regular paras; 2 = blockquotes, epigraphs
+\#
+.MAC PP END
+. if \\n[#COVERTEXT_PP] \{\
+. ie \\n[#INDENT_ACTIVE] .ti \\n[#INDENT]u+\\n[#PP_INDENT]u
+. el .ti \\n[#PP_INDENT]u
+. return
+. \}
+. if \\n[#PP]>0 .br
+. if \\n[#DOC_TYPE]=4 \{\
+. if !'\\n[.z]'' .di
+. nr #TOTAL_FIELDS \\n[#FIELD]
+. nr #FIELD 0 1
+. nr #NUM_FIELDS 0 1
+. if \\n[#TOTAL_FIELDS]>0 \{\
+. while \\n+[#NUM_FIELDS]<=\\n[#TOTAL_FIELDS] \{\
+. nf
+. LETTERHEAD\\n+[#FIELD]
+. QUAD \\*[$DOC_QUAD]
+. ALD \\n[#DOC_LEAD]u
+. if \\n[#DATE_FIRST]=1 .ALD \\n[#DOC_LEAD]u
+. rr #DATE_FIRST
+. rm LETTERHEAD\\n[#FIELD]
+. \}
+. rr #FIELD
+. rr #NUM_FIELDS
+. rr #TOTAL_FIELDS
+. \}
+. \}
+. rr #PP_ACTIVE
+. if r #Q_AT_TOP .rr #Q_AT_TOP
+. if \\n[#PP_STYLE]=1 \{\
+. if \\n[#ENDNOTE] \{\
+. nr #RESET_PARA_SPACE \\n[#PP_SPACE]
+. ie \\n[#EN_PP_SPACE] .PARA_SPACE
+. el .PARA_SPACE OFF
+. \}
+. if !\\n[#ENDNOTE] .po \\n[#L_MARGIN]u
+. if \\n[#COLUMNS] \{\
+. if !\\n[#ENDNOTE] \{\
+. po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u
+. nr #L_MARGIN \\n[.o]
+. \}
+. \}
+. if \\n[#TAB_ACTIVE] .TAB \\n[#CURRENT_TAB]
+. ie \\n[#PRINT_STYLE]=1 \{\
+. TYPEWRITER
+. ie \\n[#ENDNOTE] .vs \\n[#EN_LEAD]u
+. el .vs \\n[#DOC_LEAD]u
+. QUAD \\*[$DOC_QUAD]
+. if \\n[#SLANT_ON] \
+. if \\n[#UNDERLINE_SLANT] .UNDERLINE
+. if '\\*[$PP_FT]'I' \
+. if \\n[#ITALIC_MEANS_ITALIC] .FT I
+. \}
+. el \{\
+. ie \\n[#ENDNOTE] \{\
+. FAMILY \\*[$EN_FAM]
+. FT \\*[$EN_FT]
+. ps \\n[#EN_PS]u
+. vs \\n[#EN_LEAD]u
+. QUAD \\*[$EN_QUAD]
+. \}
+. el \{\
+. FAMILY \\*[$DOC_FAM]
+. if !'\\*[$SAVED_PP_FT]'' \{\
+. ds $PP_FT \\*[$SAVED_PP_FT]
+. rm $SAVED_PP_FT
+. \}
+. FT \\*[$PP_FT]
+. ps \\n[#DOC_PT_SIZE]u
+. vs \\n[#DOC_LEAD]u
+. QUAD \\*[$DOC_QUAD]
+. \}
+. \}
+. ie \\n[#PP]=0 \{\
+. if \\n[#INDENT_FIRST_PARAS] \{\
+. ie \\n[#INDENT_ACTIVE] .ti \\n[#INDENT]u+\\n[#PP_INDENT]u
+. el .ti \\n[#PP_INDENT]u
+. if '\\n[.z]'END_NOTES' \
+. ti \\n[#EN_PP_INDENT]u+\\n[#EN_TEXT_INDENT]u
+. \}
+. if r #END_QUOTE \{\
+. if \\n[#END_QUOTE] \{\
+. if !\\n[#LINEBREAK] \{\
+. ie \\n[#INDENT_ACTIVE] .ti \\n[#INDENT]u+\\n[#PP_INDENT]u
+. el .ti \\n[#PP_INDENT]u
+. if '\\n[.z]'END_NOTES' \
+. ti \\n[#EN_PP_INDENT]u+\\n[#EN_TEXT_INDENT]u
+. \}
+. \}
+. \}
+. \}
+. el \{\
+. if \\n[#PP_SPACE] \{\
+. ie \\n[#END_QUOTE] \{\
+. ie !'\\*[$PP_SPACE_AMOUNT]'' .sp \\*[$PP_SPACE_AMOUNT]
+. el .sp
+. rr #END_QUOTE
+. nr #NO_SPACE 1
+. nr #BASELINE_MARK \\n[nl]
+. \}
+. el \{\
+. if \\n[#NO_SPACE]=1 .rr #NO_SPACE
+. if \\n[post-float] \{\
+. if (\\n[.t]-1)<\\*[$PP_SPACE_AMOUNT] \{\
+. ie \\n[#COLS] .COL_NEXT
+. el .NEWPAGE
+. \}
+. rr post-float
+. \}
+. if !\\n[nl]=\\n[#BASELINE_MARK] \{\
+. ie !'\\*[$PP_SPACE_AMOUNT]'' .sp \\*[$PP_SPACE_AMOUNT]
+. el .sp
+. rr #BASELINE_MARK
+. \}
+. \}
+. \}
+. if \\n[restore-pp-space] \{\
+. rr restore-pp-space
+. PARA_SPACE
+. \}
+. ie \\n[#INDENT_ACTIVE] .ti \\n[#INDENT]u+\\n[#PP_INDENT]u
+. el .ti \\n[#PP_INDENT]u
+. if '\\n[.z]'END_NOTES' \
+. ti \\n[#EN_PP_INDENT]u+\\n[#EN_TEXT_INDENT]u
+. \}
+. if r #START .rr #START
+. if r #QUOTE .rr #QUOTE
+. if r #END_QUOTE .rr #END_QUOTE
+. if r #HEAD .rr #HEAD
+. if r #SUBHEAD .rr #SUBHEAD
+. if r #EPIGRAPH .rr #EPIGRAPH
+. if r #Q_FITS .rr #Q_FITS
+. if r #LINEBREAK .rr #LINEBREAK
+. if \\n[#ENDNOTE] \{\
+. ie \\n[#RESET_PARA_SPACE] .PARA_SPACE
+. el .PARA_SPACE OFF
+. \}
+. if \\n[#CONDENSE] \{\
+\E*[COND]\c
+. \}
+. if \\n[#EXTEND]=1 \{\
+\E*[EXT]\c
+. \}
+. nr #PP +1
+. \}
+. if \\n[#PP_STYLE]=2 \{\
+\!. br
+. ie \\n[#Q_PP]=0 \{\
+. if \\n[#INDENT_FIRST_PARAS] \
+. ti \\n[#PP_INDENT]u/2u
+. if \\n[#ENDNOTE] \{\
+. ie \\n[#INDENT_FIRSTS] .ti \\n[#PP_INDENT]u/2u
+. el .ti 0
+. \}
+. \}
+. el \{\
+. ti \\n[#PP_INDENT]u/2u
+. if \\n[#PP_SPACE]=1 \{\
+. ie !'\\*[$PP_SPACE_AMOUNT]'' .ALD \\*[$PP_SPACE_AMOUNT]
+. el .sp
+. \}
+. \}
+. if \\n[#CONDENSE] \{\
+\E*[COND]\c
+. \}
+. if \\n[#EXTEND]=1 \{\
+\E*[EXT]\c
+. \}
+. nr #Q_PP +1
+. \}
+.\" This takes care of multi-paragraph dialogue, where each para
+.\" is introduced by an open quote whereas the previous para has
+.\" no close quote.
+. if \\n[#OPEN_CLOSE]=1 .nr #OPEN_CLOSE 0
+. nr #PP_ACTIVE 1
+. UNDERLINE OFF
+. if r #QUOTE_4_HD .rr #QUOTE_4_HD
+. if r #LB_4_HD .rr #LB_4_HD
+.END
+\#
+\# ====================================================================
+\#
+\# +++QUOTES+++
+\#
+\# ---Line for line quotes, e.g. poetry or code snippets---
+\#
+\# UNDERLINE QUOTES
+\# ----------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Creates or modifies register #UNDERLINE_QUOTES (toggle).
+\# If on, line for line quotes are underlined when printstyle
+\# is TYPEWRITE.
+\# *Notes:
+\# Default is ON for printstyle TYPEWRITE.
+\#
+.MAC UNDERLINE_QUOTES END
+. ie '\\$1'' .nr #UNDERLINE_QUOTES 1
+. el .rr #UNDERLINE_QUOTES
+.END
+\#
+\# QUOTE INDENT
+\# ------------
+\# *Argument:
+\# <integer> | <integer with unit of measure appended>
+\# *Function:
+\# Creates or modifies register #Q_OFFSET_VALUE or string
+\# $Q_OFFSET_VALUE.
+\# *Notes:
+\# If just an integer given, value by which to multiply PARA_INDENT
+\# to get quote indent. If integer with a unit of measure appended,
+\# absolute value of quote indent.
+\#
+\# Default is 3 for typeset; 2 for typewrite.
+\#
+.MAC QUOTE_INDENT END
+. if '\\$0'BLOCKQUOTE_INDENT' .ds BQ BQ
+. if '\\$0'QUOTE_INDENT' .ds BQ Q
+. rr #\\*[BQ]_OFFSET_VALUE
+. rm $\\*[BQ]_OFFSET_VALUE
+. ds $EVAL_QI_ARG \\$1
+. substring $EVAL_QI_ARG -1
+. ie \B'\\*[$EVAL_QI_ARG]' .nr #\\*[BQ]_OFFSET_VALUE \\$1
+. el .ds $\\*[BQ]_OFFSET_VALUE \\$1
+. rm BQ
+.END
+.
+.ALIAS BLOCKQUOTE_INDENT QUOTE_INDENT
+\#
+\# QUOTE_AUTOLEAD
+\# --------------
+\# *Arguments:
+\# <autolead value>
+\# *Function:
+\# Sets autolead for quotes and/or blockquotes.
+\#
+.MAC QUOTE_AUTOLEAD END
+. rr #\\$0_DEFAULT
+. if '\\$0'QUOTE_AUTOLEAD' .nr #Q_AUTOLEAD (p;\\$1)
+. if '\\$0'BLOCKQUOTE_AUTOLEAD' .nr #BQ_AUTOLEAD (p;\\$1)
+. if '\\$0'ENDNOTE_QUOTE_AUTOLEAD' .nr #EN_Q_AUTOLEAD (p;\\$1)
+. if '\\$0'ENDNOTE_BLOCKQUOTE_AUTOLEAD' .nr #EN_BQ_AUTOLEAD (p;\\$1)
+.END
+.
+.ALIAS BLOCKQUOTE_AUTOLEAD QUOTE_AUTOLEAD
+.ALIAS ENDNOTE_QUOTE_AUTOLEAD QUOTE_AUTOLEAD
+.ALIAS ENDNOTE_BLOCKQUOTE_AUTOLEAD QUOTE_AUTOLEAD
+\#
+\# ALWAYS FULLSPACE QUOTES
+\# -----------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Toggles register #FULLSPACE_QUOTES.
+\# *Notes:
+\# If user doesn't like the default 1/2 line space above and below
+\# quotes, s/he can turn it off here. Has no effect in TYPEWRITE.
+\#
+.MAC ALWAYS_FULLSPACE_QUOTES END
+. if '\\$1'' .nr #FULLSPACE_QUOTES 1
+. el .rr #FULLSPACE_QUOTES
+.END
+\#
+\# QUOTE
+\# -----
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Indents quoted text on a line for line basis, or turns QUOTE off.
+\# *Notes:
+\# Owing to the need to bottom align TYPESET pages, quoted text gets
+\# diverted so its depth can be measured (in DO_QUOTE) for determining
+\# how much space to put before and after.
+\#
+.MAC QUOTE END
+. ie \\n[@TOP] \
+. br
+. el 'br
+. if \\n[#PP]>0 .rr #START
+. if '\\n[.z]'FLOAT*DIV' .nr Q-float 1
+. if \\n[#LINENUMBERS]=1 \{\
+. nr #LINENUMBERS 2
+. nr #NEXT_LN \\n[ln]
+. nm
+. \}
+. if '\\$1'ADJUST' \{\
+. ds $Q_SPACE_ADJUST \\$2
+. shift 2
+. \}
+. ie '\\$1'' \{\
+. ev QUOTE
+. evc 0
+. if \\n[.i] .in 0
+. if \\n[#LINENUMBERS]=2 \
+. if \\n[#SILENT_QUOTE_LN]=1 .nm \\n[#NEXT_LN] 1000 -4
+. nr #IN_DIVER 1
+. nr #QUOTE 1
+. di P_QUOTE
+. if '\\*[$Q_QUAD]'RIGHT' \{\
+. ie !'\\*[$Q_OFFSET_VALUE]'' .ll \\n[#L_LENGTH]u-\\*[$Q_OFFSET_VALUE]
+. el .ll \\n[#L_LENGTH]u-(\\n[#PP_INDENT]u*\\n[#Q_OFFSET_VALUE]u)
+. \}
+. ta \\n[.l]u
+. if \\n[#COLUMNS] \{\
+. ie \\n[#Q_OFFSET_VALUE] \
+. ll \\n[#COL_L_LENGTH]u-(\\n[#PP_INDENT]u*\\n[#Q_OFFSET_VALUE]u)
+. el .ll \\n[#COL_L_LENGTH]u-\\*[$Q_OFFSET_VALUE]
+. ta \\n[.l]u
+. \}
+. if \\n[#PRINT_STYLE]=1 \{\
+. TYPEWRITER
+. vs \\n[#DOC_LEAD]u
+. LEFT
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. FAMILY \\*[$QUOTE_FAM]
+. FT \\*[$QUOTE_FT]
+. ps \\n[#DOC_PT_SIZE]u\\*[$QUOTE_SIZE_CHANGE]
+. ie !r #Q_AUTOLEAD .vs \\n[#DOC_LEAD]u
+. el \{\
+. vs \\n[.ps]u+\\n[#Q_AUTOLEAD]u
+. nr #Q_LEAD \\n[.v]
+. \}
+. if \\n[#ENDNOTE] \{\
+. ps \\n[#EN_PS]u\\*[$QUOTE_SIZE_CHANGE]
+. ie !r #EN_Q_AUTOLEAD .vs \\n[#EN_Q_LEAD]u
+. el \{\
+. vs \\n[.ps]u+\\n[#EN_Q_AUTOLEAD]u
+. nr #EN_Q_LEAD \\n[.v]
+. \}
+. \}
+. nr #Q_LEAD_REAL \\n[.v]
+. if \\n[#QUOTE_COLOR]=1 \{\
+. nf
+. COLOR \\*[$QUOTE_COLOR]
+. \}
+. \\*[$Q_QUAD]
+. \}
+. if \\n[#LINENUMBERS]=2 \{\
+. ie \\n[#QUOTE_LN]=1 \{\
+. if '\\n[#Q_LN_GUTTER]'' .nr #Q_LN_GUTTER \\n[#LN_GUTTER]
+. LN_PARAMS
+. nm \\n[ln] "" \\n[#Q_LN_GUTTER] -3-\\n[#Q_LN_GUTTER]
+. RESTORE_PARAMS
+. \}
+. el \
+. if !\\n[#SILENT_QUOTE_LN] .NUMBER_LINES OFF
+. \}
+. nr #Q_TOP \\n[nl]
+. if \\n[#PRINT_STYLE]=1 \
+. if \\n[#UNDERLINE_QUOTES] .FT I
+. \}
+. el .DO_QUOTE
+.END
+\#
+\# CODE
+\# ----
+\# *Arguments:
+\# <none> [ BR | BREAK | SPREAD ]
+\# or
+\# <anything> [ BR | BREAK | SPREAD ]
+\# *Function:
+\# Takes care of administrivia associated with setting code snippets.
+\#
+.MAC CODE END
+\c
+. if '\\$1'BR' \{\
+. ie '\\n[.z]'FLOAT*DIV' 'br
+. el .br
+. shift
+. \}
+. if '\\$1'BREAK' \{\
+. ie '\\n[.z]'FLOAT*DIV' 'br
+. el .br
+. shift
+. \}
+. if '\\$1'SPREAD' \{\
+. ie '\\n[.z]'FLOAT*DIV' 'brp
+. el .brp
+. shift
+. \}
+. ie '\\$1'' \{\
+. ds $RESTORE_FAM \\n[.fam]
+. ds $RESTORE_FT \\n[.sty]
+. ie \\n[#PRINT_STYLE]=1 \{\
+. CODE_FAMILY C
+. ie \\n[#CODE_FT]=1 .ft \\*[$CODE_FT]
+. el \{\
+. CODE_FONT R
+. ft R
+. char ' \[aq]
+. \}
+. if \\n[#UNDERLINE_QUOTES]=1 \{\
+. nr #RESTORE_UNDERLINE 1
+. UNDERLINE_QUOTES OFF
+. FT \\*[$CODE_FT]
+. char ' \[aq]
+. \}
+. \}
+. el \{\
+. ie \\n[#CODE_FAM]=1 .fam \\*[$CODE_FAM]
+. el \{\
+. CODE_FAMILY C
+. fam \\*[$CODE_FAM]
+. \}
+. ie \\n[#CODE_FT]=1 .ft \\*[$CODE_FT]
+. el \{\
+. CODE_FONT R
+. ft \\*[$CODE_FT]
+. \}
+. if \\n[#CODE_COLOR]=1 .COLOR \\*[$CODE_COLOR]
+. char ' \[aq]
+. if !\\n[#CODE_SIZE_ADJ]=0 \{\
+. ds $RESTORE_SIZE \\n[.s]
+. ps \\n[#PT_SIZE]u*\\n[#CODE_SIZE_ADJ]u/100u
+. \}
+. if \\n[#SQ_ON] \{\
+. nr #SQ_WAS_ON 1
+. SMARTQUOTES OFF
+. \}
+. \}
+. \}
+. el \{\
+. fam \\*[$RESTORE_FAM]
+. ft \\*[$RESTORE_FT]
+. if !\\n[#CODE_SIZE_ADJ]=0 .ps \\*[$RESTORE_SIZE]
+. rm $RESTORE_FAM
+. rm $RESTORE_FT
+. rm $RESTORE_SIZE
+. if \\n[#PRINT_STYLE]=2 .char ' \[cq]
+. if !'\\n[.z]'' \
+. if \\n[#LINENUMBERS] .nn
+. if \\n[#CODE_COLOR]=1 .gcolor
+. if \\n[#RESTORE_UNDERLINE]=1 \{\
+. rr #RESTORE_UNDERLINE
+. UNDERLINE_QUOTES
+. \}
+. if \\n[#SQ_WAS_ON]=1 \{\
+. rr #SQ_WAS_ON
+. SMARTQUOTES
+. \}
+. if \\n[#QUOTE] .sp -1
+. if \\n[pdfbx-end] .if !\\n[#QUOTE] .sp -1
+. \}
+.END
+\#
+\# ---Blockquotes---
+\#
+\# BLOCKQUOTE
+\# ----------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Indents quoted text in fill mode and shortens line length
+\# equivalently, or turns BLOCKQUOTE off.
+\# *Notes:
+\# Owing to the need to bottom align TYPESET pages, quoted text gets
+\# diverted so its depth can be measured (in DO_QUOTE) for determining
+\# how much space to put before and after.
+\#
+\# .PP after blockquote is optional if there's only one para,
+\# but required if there's more than one.
+\#
+.MAC BLOCKQUOTE END
+. ie \\n[@TOP] \
+. br
+. el 'br
+. if \\n[#PP]>0 .rr #START
+. if '\\n[.z]'FLOAT*DIV' .nr Q-float 1
+. if \\n[#LINENUMBERS]=1 \{\
+. nr #LINENUMBERS 2
+. nr #NEXT_LN \\n[ln]
+. nm
+. \}
+. if '\\$1'ADJUST' \{\
+. ds $BQ_SPACE_ADJUST \\$2
+. shift 2
+. \}
+. ie '\\$1'' \{\
+. ev BLOCKQUOTE
+. evc 0
+. if \\n[.i] .in 0
+. if \\n[#LINENUMBERS]=2 \
+. if \\n[#SILENT_BQUOTE_LN]=1 .nm \\n[#NEXT_LN] 1000 -4
+. nr #IN_DIVER 1
+. nr #QUOTE 2
+. nr #PP_STYLE 2
+. nr #Q_PP 0
+. di B_QUOTE
+. ie !'\\*[$BQ_OFFSET_VALUE]'' .ll \\n[#L_LENGTH]u-(\\*[$BQ_OFFSET_VALUE]*2u)
+. el .ll \\n[#L_LENGTH]u-(\\n[#PP_INDENT]u*(\\n[#BQ_OFFSET_VALUE]u*2u))
+. if \\n[#ENDNOTE] \{\
+. if \\n[#EN_NUMBERS_ALIGN_RIGHT] \{\
+. ie r#BQ_OFFSET_VALUE \
+. ll \
+\\n[#RESET_L_LENGTH]u-\\n[#EN_TEXT_INDENT]u-(\\n[#EN_PP_INDENT]u*(\\n[#BQ_OFFSET_VALUE]u*2u))
+. el \
+. ll \
+\\n[#RESET_L_LENGTH]u-\\n[#EN_TEXT_INDENT]u-(\\*[$BQ_OFFSET_VALUE]*2u)
+. \}
+. if \\n[#EN_NUMBERS_ALIGN_LEFT] \{\
+. ie r#BQ_OFFSET_VALUE \
+. ll \\n[#L_LENGTH]u-(\\n[#EN_PP_INDENT]u*(\\n[#BQ_OFFSET_VALUE]u*2u))
+. el \
+. ll \\n[#L_LENGTH]u-(\\*[$BQ_OFFSET_VALUE]u*2u)
+. \}
+. \}
+. ta \\n[.l]u
+. CHECK_INDENT
+. if \\n[#COLUMNS] \{\
+. ie r#BQ_OFFSET_VALUE \
+. ll \
+\\n[#COL_L_LENGTH]u-(\\n[#PP_INDENT]u*(\\n[#BQ_OFFSET_VALUE]u*2u))
+. el \
+. ll \\n[#COL_L_LENGTH]u-(\\*[$BQ_OFFSET_VALUE]*2u)
+. if \\n[#ENDNOTE] \{\
+. if \\n[#EN_NUMBERS_ALIGN_RIGHT] \{\
+. ie r#BQ_OFFSET_VALUE \
+. ll \
+\\n[#RESET_L_LENGTH]u-\\n[#EN_TEXT_INDENT]u-(\\n[#EN_PP_INDENT]u*(\\n[#BQ_OFFSET_VALUE]u*2u))
+. el \
+. ll \
+\\n[#RESET_L_LENGTH]u-\\n[#EN_TEXT_INDENT]u-(\\*[$BQ_OFFSET_VALUE]*2u)
+. \}
+. if \\n[#EN_NUMBERS_ALIGN_LEFT] \{\
+. ie r#BQ_OFFSET_VALUE \
+. ll \
+\\n[#COL_L_LENGTH]u-(\\n[#EN_PP_INDENT]u*(\\n[#BQ_OFFSET_VALUE]u*2u))
+. el \
+. ll \\n[#COL_L_LENGTH]u-(\\*[$BQ_OFFSET_VALUE]*2u)
+. \}
+. \}
+. ta \\n[.l]u
+. \}
+. if \\n[#PRINT_STYLE]=1 \{\
+. TYPEWRITER
+. vs \\n[#DOC_LEAD]u
+. QUAD LEFT
+. HY OFF
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. FAMILY \\*[$BQUOTE_FAM]
+. FT \\*[$BQUOTE_FT]
+. ps \\n[#DOC_PT_SIZE]u\\*[$BQUOTE_SIZE_CHANGE]
+. ie !r #BQ_AUTOLEAD .vs \\n[#DOC_LEAD]u
+. el \{\
+. vs \\n[.ps]u+\\n[#BQ_AUTOLEAD]u
+. nr #BQ_LEAD \\n[.v]
+. \}
+. if \\n[#ENDNOTE] \{\
+. ps \\n[#EN_PS]u\\*[$BQUOTE_SIZE_CHANGE]
+. ie !r#EN_BQ_AUTOLEAD .vs \\n[#EN_BQ_LEAD]u
+. el \{\
+. vs \\n[.ps]u+\\n[#EN_BQ_AUTOLEAD]u
+. nr #EN_BQ_LEAD \\n[.v]
+. \}
+. \}
+. nr #BQ_LEAD_REAL \\n[.v]
+. if \\n[#BQUOTE_COLOR]=1 \{\
+. nf
+. COLOR \\*[$BQUOTE_COLOR]
+. \}
+. QUAD \\*[$BQUOTE_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
+. \}
+. if \\n[#LINENUMBERS]=2 \{\
+. ie \\n[#BQUOTE_LN]=1 \{\
+. if '\\n[#BQ_LN_GUTTER]'' .nr #BQ_LN_GUTTER \\n[#LN_GUTTER]
+. LN_PARAMS
+. nm \\n[ln] "" \\n[#BQ_LN_GUTTER] -3-\\n[#BQ_LN_GUTTER]
+. RESTORE_PARAMS
+. \}
+. el \
+. if !\\n[#SILENT_BQUOTE_LN] .NUMBER_LINES OFF
+. \}
+. nr #Q_TOP \\n[nl]
+. if \\n[#INDENT_FIRST_PARAS] \{\
+. ie !\\n[#ENDNOTE] \{\
+. if \\n[#PRINT_STYLE]=1 .ti \\n[#PP_INDENT]u/2u
+. if \\n[#PRINT_STYLE]=2 .ti \\n[#PP_INDENT]u/2u
+. \}
+. el \{\
+. if \\n[#INDENT_FIRSTS]=1 \{\
+. if \\n[#PRINT_STYLE]=1 .ti \\n[#EN_PP_INDENT]u/2u
+. if \\n[#PRINT_STYLE]=2 .ti \\n[#EN_PP_INDENT]u/2u
+. \}
+. \}
+. \}
+. \}
+. el .DO_BLOCKQUOTE
+.END
+\#
+\# DO QUOTE
+\# --------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Ends the diversion P_QUOTE or B_QUOTE. Spaces them according to
+\# PRINTSTYLE, whether there's inter-paragraph spacing, and page
+\# position. TYPEWRITE treats spacing the same way in all circumstance
+\# (viz. an extra line space). TYPESET puts in only half
+\# line spaces if the entire quote plus 1 line of body under the quote
+\# fits on the page; otherwise it puts in a full extra blank
+\# line. (This is to ensure the page remains bottom aligned).
+\#
+.MAC DO_QUOTE END
+. br
+. if \\n[#DIVER_LN_OFF] \{\
+\!. NUMBER_LINES OFF
+. rr #DIVER_LN_OFF
+. \}
+. nr #Q_DEPTH \\n[.d]
+. di
+. if '\\$0'DO_BLOCKQUOTE' .ds BQ BQ
+. if '\\$0'DO_QUOTE' .ds BQ Q
+. 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 #Q_LEAD_DIFF \\n[#LEAD]-\\n[#\\*[BQ]_LEAD_REAL]
+. nr q-lead-diff \\n[#Q_LEAD_DIFF]
+. if !\\n[pdfbx-running] \{\
+. if !'\\n[.z]'FLOAT*DIV' \{\
+. br
+. nr #CALCULATE_ONLY 1
+. nr #CURRENT_V_POS \\n[nl]+\\n[#Q_DEPTH]
+. SHIM
+. rr #CALCULATE_ONLY
+. nr #Q_SPACE_EQ (\\n[#SHIM]/2)
+. nr #TRAP \\n[.t]-1
+. \}
+. \}
+. if \\n[#ENDNOTE] \{\
+. nr #RESET_QUOTE_SPACING \\n[#FULLSPACE_QUOTES]
+. ALWAYS_FULLSPACE_QUOTES
+. \}
+. if \\n[#PRINT_STYLE]=1 \{\
+. if \\n[#START]=1 .
+. if \\n[#START]=0 \
+. if !\\n[#LINEBREAK] .ALD \\n[#DOC_LEAD]u
+. if \\n[#HEAD] \
+. if \\n[#HEAD]=1 .RLD \\n[#DOC_LEAD]u
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. ie \\n[#PP_SPACE] \{\
+. ie \\n[#HEAD] .
+. el \{\
+. ie \\n[#START] .
+. el \{\
+. ie \\n[#FULLSPACE_QUOTES] .ALD \\n[#DOC_LEAD]u
+. el .ALD \\n[#DOC_LEAD]u/2u
+. \}
+. \}
+. \}
+. el \{\
+. if !\\n[nl]=\\n[#PAGE_TOP] \{\
+. ie \\n[#Q_DEPTH]<(\\n[#TRAP_DISTANCE]-1) \{\
+. ie ((\\n[#TRAP_DISTANCE]-1)-\\n[#Q_DEPTH])<\\n[#DOC_LEAD] \
+. Q_NOFIT
+. el \{\
+. ie (\\n[#TRAP_DISTANCE]-\\n[#DOC_LEAD])<\\n[#DOC_LEAD] \
+. Q_NOFIT
+. el \{\
+. ie (\\n[#Q_DEPTH]+\\n[.v])=(\\n[#TRAP_DISTANCE]-1) \
+. Q_NOFIT
+. el .Q_FITS
+. \}
+. \}
+. \}
+. el .Q_NOFIT
+. \}
+. \}
+. if \\n[#LINEBREAK] \{\
+. vpt 0
+. ie !\\n[@TOP] .sp -\\n[#DOC_LEAD]u
+. el \{\
+. nop
+. sp |\\n[#T_MARGIN]u-\\n[#BQ_LEAD]u
+. \}
+. vpt
+. \}
+. \}
+. ie !'\\*[$\\*[BQ]_OFFSET_VALUE]'' \
+. nr #\\*[BQ]_OFFSET \\n[#L_MARGIN]+(\\*[$\\*[BQ]_OFFSET_VALUE])
+. el \
+. nr #\\*[BQ]_OFFSET \
+\\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#\\*[BQ]_OFFSET_VALUE])
+. if \\n[#COLUMNS] \{\
+. ie r#\\*[BQ]_OFFSET_VALUE \
+. nr #\\*[BQ]_OFFSET \
+\\n[#COL_\\n[#COL_NUM]_L_MARGIN]+(\\n[#PP_INDENT]*\\n[#\\*[BQ]_OFFSET_VALUE])
+. el .nr #\\*[BQ]_OFFSET \
+\\n[#COL_\\n[#COL_NUM]_L_MARGIN]+\\*[$\\*[BQ]_OFFSET_VALUE]
+. \}
+. if !\\n[#ENDNOTE] \{\
+. ie '\\*[BQ]'Q' \{\
+. if '\\*[$Q_QUAD]'LEFT' \{\
+. po \\n[#Q_OFFSET]u
+. if '\\n[.z]'FLOAT*DIV' \!.po \\n[#Q_OFFSET]u
+. \}
+. \}
+. el \{\
+. po \\n[#\\*[BQ]_OFFSET]u
+. if '\\n[.z]'FLOAT*DIV' \!.po \\n[#\\*[BQ]_OFFSET]u
+. \}
+. \}
+. if \\n[#ENDNOTE] \{\
+. ie \\n[#\\*[BQ]_OFFSET_VALUE] \
+. in +\\n[#EN_PP_INDENT]u*\\n[#\\*[BQ]_OFFSET_VALUE]u
+. el .in +\\*[$\\*[BQ]_OFFSET_VALUE]
+. \}
+. ie \\n[#START]=1 \
+. RLD 0-\\n[#Q_LEAD_DIFF]u
+. el \{\
+. if \\n[#PRINT_STYLE]=2 \{\
+. ie !\\n[pdfbx-post-q] \{\
+. ie !\\n[#NO_SHIM] \
+. sp \\n[#Q_SPACE_EQ]u+(\\n[#Q_LEAD_DIFF]u/2u)
+. el .if !\\n[#NO_FLEX] .FLEX
+. \}
+. el .sp -.5
+. \}
+. \}
+. if \\n[#QUOTE]=1 \{\
+. if !'\\*[$Q_SPACE_ADJUST]'' .sp +\\*[$Q_SPACE_ADJUST]
+. nf
+. P_QUOTE
+. if !'\\*[$Q_SPACE_ADJUST]'' \{\
+. sp -\\*[$Q_SPACE_ADJUST]
+. rm $Q_SPACE_ADJUST
+. \}
+. \}
+. if \\n[#QUOTE]=2 \{\
+. if !'\\*[$BQ_SPACE_ADJUST]'' .sp +\\*[$BQ_SPACE_ADJUST]
+. nf
+. B_QUOTE
+. if !'\\*[$BQ_SPACE_ADJUST]'' \{\
+. sp -\\*[$BQ_SPACE_ADJUST]
+. rm $BQ_SPACE_ADJUST
+. \}
+. \}
+. if !\\n[#START] .rr #QUOTE
+. rr delay-ev-pop
+. if !'\\n[.z]'FLOAT*DIV' \{\
+. if \\n[#PRINT_STYLE]=1 \{\
+. if !\\n[.v]=\\n[#DOC_LEAD] \{\
+. if !r pdfbx-post-q \{\
+. ie !\\n[#NO_SHIM] .SHIM
+. el \
+. if !\\n[#NO_FLEX] .FLEX
+. \}
+. \}
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. ie \\n[#START] \{\
+. ie \\n[#PP_SPACE] .
+. el \{\
+. sp \\n[#DOC_LEAD]u/2u
+. if !r pdfbx-post-q \{\
+. ie !\\n[#NO_SHIM] .SHIM
+. el \
+. if !\\n[#NO_FLEX] .FLEX
+. \}
+. \}
+. \}
+. el \{\
+. ie \\n[#HEAD]=1 \{\
+. sp \\n[#DOC_LEAD]u
+. if !r pdfbx-post-q \{\
+. ie !\\n[#NO_SHIM] .SHIM
+. el \
+. if !\\n[#NO_FLEX] .FLEX
+. \}
+. \}
+. el \{\
+. ie \\n[#FULLSPACE_QUOTES] \{\
+. ie \\n[#ENDNOTE] .ALD \\n[#EN_LEAD]u
+. el .if !'\\n[.z]'FLOAT*DIV' .ALD \\n[#DOC_LEAD]u
+. \}
+. el \
+. if !'\\n[.z]'FLOAT*DIV' .ALD \\n[#DOC_LEAD]u/2u
+. ie \\n[#Q_FITS] \{\
+. ie (\\n[#Q_TOP]=\\n[#PAGE_TOP]):(\\n[@TOP]=1) \{\
+. if \\n[has-label] .sp \\n[#DOC_LEAD]u/2u
+. if !'\\n[.z]'FLOAT*DIV' \{\
+. nr #Q_AT_TOP 1
+. nr #DELAY_SHIM 1
+. \}
+. \}
+. el \{\
+. ie !\\n[#NO_SHIM] .SHIM
+. el .if !\\n[#NO_FLEX] .FLEX
+. \}
+. \}
+. el \{\
+. ie r pdfbx-post-q \{\
+. if \\n[.t]>1v \{\
+. ie !\\n[#NO_SHIM] .SHIM
+. el \
+. if !\\n[#NO_FLEX] .FLEX
+. \}
+. \}
+. el \{\
+. ie !\\n[#NO_SHIM] .SHIM
+. el \
+. if !\\n[#NO_FLEX] .FLEX
+. \}
+.\" Make sure that Q_LEAD_DIFF is not added to the first line of
+.\" normal text at the top of any page following output of a quote
+.\" whose last line falls on B_MARGIN of the previous page.
+. if \\n[#Q_LEAD_DIFF] \{\
+. if \\n[nl]=(\\n[#T_MARGIN]-\\n[#DOC_LEAD]+\\n[#Q_LEAD_DIFF]) \{\
+. PRINT \&
+. br
+. sp -1v-\\n[#Q_LEAD_DIFF]u
+. nr #Q_LEAD_DIFF_CHECK 1
+. \}
+. \}
+. \}
+. \}
+. \}
+. \}
+. \}
+. if \\n[#RESTORE_NO_SHIM] .nr #NO_SHIM 1
+. rr #Q_SPACE_EQ
+. if \\n[#LINENUMBERS]=2 \{\
+. nr #LINENUMBERS 1
+. if !\\n[#ENDNOTE] \{\
+. ie \\n[#RESTORE_LN_NUM]=1 \{\
+. LN_PARAMS
+. nm \\n[#NEXT_LN]
+. RESTORE_PARAMS
+. \}
+. el \{\
+. LN_PARAMS
+. nm +0
+. RESTORE_PARAMS
+. \}
+. \}
+. \}
+. if \\n[#ENDNOTE] \
+. nr #FULLSPACE_QUOTES \\n[#RESET_QUOTE_SPACING]
+. if r #HEAD .rr #HEAD
+. if r #EPIGRAPH .rr #EPIGRAPH
+. rr #Q_PP
+. rr #LINEBREAK
+. nr #PP_STYLE 1
+. nr #END_QUOTE 1
+. if !\\n[#ENDNOTE] \
+. po \\n[#L_MARGIN]u
+. if \\n[#ENDNOTE] .in \\n[#EN_TEXT_INDENT]u
+. if \\n[#COLUMNS] \{\
+. if !\\n[#ENDNOTE] \{\
+. po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u
+. nr #L_MARGIN \\n[.o]
+. \}
+. if \\n[#ENDNOTE] .in \\n[#EN_TEXT_INDENT]u
+. \}
+. ie !\\n[#ENDNOTE] .QUAD \\*[$DOC_QUAD]
+. el .QUAD \\*[EN_QUAD]
+. if r #DELAY_SHIM \{\
+. ie !\\n[#NO_SHIM] .SHIM
+. el \
+. if !\\n[#NO_FLEX] .FLEX
+. rr #DELAY_SHIM
+. \}
+. if \\n[#PRINT_STYLE]=1 \
+. if \\n[#UNDERLINE_QUOTES] .FT R
+. nr #QUOTE_4_HD 1
+. rr #\\*[BQ]_LEAD_REAL
+. rm BQ
+. if \\n[#DOC_TYPE]=5 .NO_SHIM
+. if '\\n[.z]'FLOAT*DIV' \!.po \\n[#L_MARGIN]u
+.END
+.
+.ALIAS DO_BLOCKQUOTE DO_QUOTE
+\#
+\# Utility macros for DO_QUOTE
+\# ---------------------------
+\#
+.MAC Q_FITS END
+. nr #Q_FITS 1
+. ie \\n[#HEAD]=1 .ALD \\n[#Q_LEAD_DIFF]u
+. el \{\
+. ie \\n[#START] .
+. el \{\
+. ie \\n[#FULLSPACE_QUOTES] \{\
+. ie \\n[#ENDNOTE] .ALD \\n[#EN_LEAD]u+\\n[#Q_LEAD_DIFF]u
+. el .ALD \\n[#DOC_LEAD]u+\\n[#Q_LEAD_DIFF]u
+. \}
+. el \{\
+.\" This seems to be the only way to get the baseline of quotes that
+.\" start at the top of the page to fall on the first line of the
+.\" grid (ie. on the first valid baseline of the page).
+. ie \\n[#Q_TOP]=\\n[#PAGE_TOP] \{\
+. if \\n[#QUOTE]=1 .ds $QUOTE_TYPE Q
+. if \\n[#QUOTE]=2 .ds $QUOTE_TYPE B
+. rn \\*[$QUOTE_TYPE]_QUOTE Q_TEMP
+. di \\*[$QUOTE_TYPE]_QUOTE
+. nf
+. if \\n[#QUOTE]=1 .vs \\n[#Q_LEAD]u
+. if \\n[#QUOTE]=2 .vs \\n[#BQ_LEAD]u
+. PRINT \&
+. sp -1v+\\n[#Q_LEAD_DIFF]u
+. Q_TEMP
+. di
+. rm Q_TEMP
+. sp \\n[#DOC_LEAD]u/2u
+. \}
+. el \
+. sp \\n[#DOC_LEAD]u/2u
+. \}
+. \}
+. if \\n[#DIVER_FN]=2 .rr #DIVER_FN
+. if !\\n[#NO_FLEX] .FLEX
+. \}
+. rm $QUOTE_TYPE
+.END
+\#
+.MAC Q_NOFIT END
+. rr #Q_FITS
+. if \\n[#QUOTE]=1 \{\
+. ds $QUOTE_TYPE Q
+. ds quote-type quote
+. \}
+. if \\n[#QUOTE]=2 \{\
+. ds $QUOTE_TYPE B
+. ds quote-type blockquote
+. \}
+. if \\n[has-caption] \{\
+. if !\\n[@TOP] \
+. if !\\n[nl]=\\n[#PAGE_TOP] \
+. if (\\n[.t]-1)<\
+\\n[#DOC_LEAD]+(\\n[#DOC_LEAD]/4)\
++\\n[#\\*[QUOTE_TYPE]_LEAD] \{\
+. tm1 "[mom]: Insufficient room for caption and at least one line of \\*[quote-type]
+. tm1 " on page \\n[%] (line \\n[.c]). Moving quote to next page or column.
+. ie \\n[#COLUMNS] .COL_NEXT
+. el .NEWPAGE
+. \}
+. \}
+. ie r#HEAD \
+. if \\n[#HEAD]=1 .
+. el \{\
+. if \\n[#Q_DEPTH]=0 \
+. if \\n[.ns] .rs
+. ie \\n[#FULLSPACE_QUOTES] \{\
+. ie \\n[#ENDNOTE] .sp \\n[#EN_LEAD]u+\\n[#Q_LEAD_DIFF]u
+. el .sp \\n[#DOC_LEAD]u+\\n[#Q_LEAD_DIFF]u
+. \}
+. el \{\
+. sp .5
+. if \\n[@TOP] .rs
+. \}
+. ie \\n[#Q_LEAD_REAL] \
+. nr #Q_PARTIAL_DEPTH 0 \\n[#Q_LEAD_REAL]
+. el .nr #Q_PARTIAL_DEPTH 0 \\n[#BQ_LEAD_REAL]
+. while \\n+[#Q_PARTIAL_DEPTH]<(\\n[#TRAP_DISTANCE]-1) \{\
+.
+. \}
+. if !\\n[#Q_LEAD_REAL]=\\n[#DOC_LEAD] \{\
+. ie \\n[#Q_LEAD_REAL] \
+. nr #Q_PARTIAL_DEPTH -\\n[#Q_LEAD_REAL]
+. el .nr #Q_PARTIAL_DEPTH -\\n[#BQ_LEAD_REAL]
+. \}
+. nr #Q_SPACE_EQ \
+(\\n[#TRAP_DISTANCE]-1)-\\n[#Q_PARTIAL_DEPTH]+(\\n[#Q_LEAD_DIFF]u/2u)
+. if \\n[#FN_COUNT]>0 .nr #Q_SPACE_EQ (\\n[#Q_SPACE_EQ] / 2u)
+.\" Hack to deal with the fact that even though the above routine
+.\" makes the bottom line of the quote fall exactly on the bottom
+.\" margin when traps are disabled, it refuses to do so when traps
+.\" are on. The difference by which it's off is #Q_LEAD_DIFF
+.\" (the +\\n[#Q_LEAD_DIFF] at the end of the line, above). Hack
+.\" solution: temporarily lower the FOOTER trap position.
+. if !\\n[pdfbx-running] \{\
+. if !\\n[#Q_DEPTH]=0 \{\
+. nr #SAVED_FOOTER_POS \\n[#VARIABLE_FOOTER_POS]
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u+.25v
+. \}
+. \}
+.\}
+.END
+\#
+\# ====================================================================
+\#
+\# +++PAGINATION+++
+\#
+\# PAGINATE
+\# --------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Turns page numbering off or on during document processing.
+\# *Notes:
+\# Default is on.
+\#
+.MAC PAGINATE END
+. ie '\\$1'' \{\
+. nr #PAGINATE 1
+. if \\n[#SAVED_V_POS] \{\
+. nr #PAGE_NUM_V_POS \\n[#SAVED_V_POS]
+. rr #SAVED_V_POS
+. \}
+. \}
+. el \{\
+. nr #PAGINATE 0
+. nr #SAVED_V_POS \\n[#PAGE_NUM_V_POS]
+. rr #PAGE_NUM_V_POS
+. \}
+. if \\n[#HF_OFF]=1 \{\
+. rr #PAGINATION_STATE
+. rr #HF_OFF
+. \}
+.END
+\#
+\# SUSPEND PAGINATION (before ENDNOTES)
+\# ------------------
+\# *Argument:
+\# <none>
+\# *Function:
+\# Creates register #SUSPEND_PAGINATION
+\# *Notes:
+\# Useful only to suspend pagination before outputting endnotes.
+\#
+.MAC SUSPEND_PAGINATION END
+. nr #SUSPEND_PAGINATION 1
+.END
+\#
+\# RESTORE PAGINATION (after ENDNOTES)
+\# ------------------
+\# *Argument:
+\# <none>
+\# *Function:
+\# Removes register #SUSPEND_PAGINATION. Creates register
+\# #DEFER_PAGINATION
+\# *Notes:
+\# Useful only to restore pagination after outputting endnotes.
+\#
+.MAC RESTORE_PAGINATION END
+. rr #SUSPEND_PAGINATION
+. if \\n[#PAGE_NUM_V_POS]=1 .PAGINATE
+. if \\n[#PAGE_NUM_V_POS]=2 .nr #DEFER_PAGINATION 1
+.END
+\#
+\# PAGE NUMBER FORMAT
+\# ------------------
+\# *Arguments:
+\# DIGIT | ROMAN | roman | ALPHA | alpha
+\# *Function:
+\# Assigns user entered format to #PAGENUMBER.
+\#
+.MAC PAGENUM_STYLE END
+. nr #PAGENUM_STYLE_SET 1
+. if '\\$1'DIGIT' \{\
+. ds $PAGENUM_STYLE \\$1
+. af #PAGENUMBER 1
+. \}
+. if '\\$1'ROMAN' \{\
+. ds $PAGENUM_STYLE \\$1
+. af #PAGENUMBER I
+. \}
+. if '\\$1'roman' \{\
+. ds $PAGENUM_STYLE \\$1
+. af #PAGENUMBER i
+. \}
+. if '\\$1'ALPHA' \{\
+. ds $PAGENUM_STYLE \\$1
+. af #PAGENUMBER A
+. \}
+. if '\\$1'alpha' \{\
+. ds $PAGENUM_STYLE \\$1
+. af #PAGENUMBER a
+. \}
+.END
+\#
+\# HYPHENS AROUND PAGE NUMBERS
+\# ---------------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Creates or modifies register #PAGE_NUM_HYPHENS.
+\# Used to dis/enable hyphens on either side of page numbers.
+\# *Notes:
+\# Default is on.
+\#
+.MAC PAGENUM_HYPHENS END
+. nr #PAGE_NUM_HYPHENS_SET 1
+. ie '\\$1'' .nr #PAGE_NUM_HYPHENS 1
+. el .rr #PAGE_NUM_HYPHENS
+.END
+\#
+\# PAGENUMBER POSITION
+\# -------------------
+\# *Arguments:
+\# TOP | BOTTOM LEFT | CENTER | RIGHT
+\# *Function:
+\# Creates or modifies various PAGE_NUM_H | V_POS registers.
+\# Used to position page numbers.
+\# *Notes:
+\# Default is center/bottom.
+\#
+.MAC PAGENUM_POS END
+. nr #PAGE_NUM_POS_SET 1
+. if '\\$1'TOP' .nr #PAGE_NUM_V_POS 1
+. if '\\$1'BOTTOM' .nr #PAGE_NUM_V_POS 2
+. if '\\$2'LEFT' .nr #PAGE_NUM_H_POS 1
+. if '\\$2'CENTER' .nr #PAGE_NUM_H_POS 2
+. if '\\$2'CENTRE' .nr #PAGE_NUM_H_POS 2
+. if '\\$2'RIGHT' .nr #PAGE_NUM_H_POS 3
+.END
+\#
+.MAC PN_WITH_HYPHENS END
+. nr #HYPHEN_ADJ \\n[#CAP_HEIGHT]/12
+. ds $HYPHEN \v'-\En[#HYPHEN_ADJ]u'-\v'\En[#HYPHEN_ADJ]u'
+. ds $PN_FOR_KN \\n[#PAGENUMBER]
+.\" Check for initial or terminal 1's or 7's, and apply a little kerning
+. substring $PN_FOR_KN 0 0 \" 1st digit
+. if '\\*[$PN_FOR_KN]'1' .ds $PRE_HY_KN \*[BU3]
+. if '\\*[$PN_FOR_KN]'7' .ds $PRE_HY_KN \*[BU3]
+. ds $PN_FOR_KN \\n[#PAGENUMBER]
+. substring $PN_FOR_KN -1 -1 \" last digit
+. if '\\*[$PN_FOR_KN]'1' .ds $POST_HY_KN \*[BU3]
+. if '\\*[$PN_FOR_KN]'7' .ds $POST_HY_KN \*[BU3]
+. PRINT \
+\m[\\*[$PAGE_NUM_COLOR]]\
+\\*[$HYPHEN]\|\\*[$PRE_HY_KN]\\n[#PAGENUMBER]\\*[$POST_HY_KN]\|\\*[$HYPHEN]
+. br
+. rm $PRE_HY_KERN
+. rm $POST_HY_KERN
+.END
+\#
+\# PRINT PAGE NUMBER
+\# -----------------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Prints page number if PAGINATE=1.
+\#
+.MAC PRINT_PAGE_NUMBER END
+. ev PAGENUMBER
+. nf
+. po \\n[#DOC_L_MARGIN]u
+. ll \\n[#DOC_L_LENGTH]u
+. ta \\n[.l]u
+. fam \\*[$PAGE_NUM_FAM]
+. ft \\*[$PAGE_NUM_FT]
+. ps \\n[#DOC_PT_SIZE]u\\*[$PAGE_NUM_SIZE_CHANGE]
+. if \\n[#PRINT_STYLE]=1 .TYPEWRITER
+. if \\n[#PAGE_NUM_V_POS]=1 .vs 0
+. if o \{\
+. ie \\n[#PAGE_NUM_H_POS]=1 .LEFT
+. el .RIGHT
+. \}
+. if e \{\
+. ie \\n[#PAGE_NUM_H_POS]=1 .RIGHT
+. el .LEFT
+. \}
+. if \\n[#PAGE_NUM_H_POS]=2 .CENTER
+. if \\n[#RECTO_VERSO]=0 \{\
+. if \\n[#PAGE_NUM_H_POS]=1 .LEFT
+. if \\n[#PAGE_NUM_H_POS]=2 .CENTER
+. if \\n[#PAGE_NUM_H_POS]=3 .RIGHT
+. \}
+. nr #PAGENUMBER \\n%+\\n[#PAGE_NUM_ADJ]
+. if \\n[#EN_FIRST_PAGE] \{\
+. if \\n[#EN_FIRST_PN] .PAGENUMBER \\n[#EN_FIRST_PN]
+. rr #EN_FIRST_PAGE
+. \}
+. if \\n[#BIB_FIRST_PAGE] \{\
+. if \\n[#BIB_FIRST_PN] .PAGENUMBER \\n[#BIB_FIRST_PN]
+. rr #BIB_FIRST_PAGE
+. \}
+. ie \\n[#DRAFT_WITH_PAGENUM] \{\
+. ie '\\*[$REVISION]'' \
+. PRINT "\\*[$DRAFT_STRING]\\*[$DRAFT] / \\n[#PAGENUMBER]"
+. el \{\
+. ie '\\*[$DRAFT]'' \
+. PRINT "\\*[$REVISION_STRING] \\*[$REVISION] / \\n[#PAGENUMBER]"
+. el \
+. PRINT \
+"\\*[$DRAFT_STRING]\\*[$DRAFT], \\*[$REVISION_STRING] \\*[$REVISION] / \
+\\n[#PAGENUMBER]"
+. \}
+. \}
+. el \{\
+. ie \\n[#PAGE_NUM_HYPHENS] \{\
+. if '\\*[$PAGENUM_STYLE]'DIGIT' \{\
+. di NULL
+1\\R'#CAP_HEIGHT \\n[.cht]'
+. di
+. PN_WITH_HYPHENS
+. \}
+. if '\\*[$PAGENUM_STYLE]'ROMAN' \{\
+. di NULL
+I\\R'#CAP_HEIGHT \\n[.cht]'
+. di
+. PN_WITH_HYPHENS
+. \}
+. if '\\*[$PAGENUM_STYLE]'ALPHA' \{\
+. di NULL
+E\\R'#CAP_HEIGHT \\n[.cht]'
+. di
+. PN_WITH_HYPHENS
+. \}
+. if '\\*[$PAGENUM_STYLE]'roman' \
+. PRINT \m[\\*[$PAGE_NUM_COLOR]]-\|\\n[#PAGENUMBER]\|-
+. if '\\*[$PAGENUM_STYLE]'alpha' \
+. PRINT \m[\\*[$PAGE_NUM_COLOR]]-\|\\n[#PAGENUMBER]\|-
+. \}
+. el \{\
+. ie !d$PAGENUM_STRING .PRINT \m[\\*[$PAGE_NUM_COLOR]]\\n[#PAGENUMBER]
+. el .PRINT \m[\\*[$PAGE_NUM_COLOR]]\\*[$PAGENUM_STRING]
+. \}
+. \}
+. ev
+. nr #DIVER_DEPTH 0
+.END
+\#
+\# ====================================================================
+\#
+\# +++FOOTNOTES+++
+\#
+\# Mom's footnote handling is baroque, to say the least. There are
+\# redundancies in a number of the macros involved, as well as some
+\# registers that probably don't get used anymore. The baggage is left
+\# in in case some new footnote oddity/challenge gets thrown at her.
+\#
+\# The macros are heavily commented.
+\#
+\# FOOTNOTE AUTOLEAD
+\# -----------------
+\# *Arguments:
+\# <autolead value for footnotes>
+\# *Function:
+\# Creates or modifies register #FN_AUTOLEAD.
+\# *Notes:
+\# Default is #DOC_LEAD/2 for TYPEWRITE; 2 for TYPESET
+\#
+.MAC FOOTNOTE_AUTOLEAD END
+. nr #FN_AUTOLEAD (p;\\$1)
+.END
+\#
+\# FOOTNOTE MARKERS
+\# ----------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Turns generation of footnote markers on or off.
+\# *Notes:
+\# Default is on.
+\#
+.MAC FOOTNOTE_MARKERS END
+. ie '\\$1'' .nr #FN_MARKERS 1
+. el .nr #FN_MARKERS 0
+.END
+\#
+\# FOOTNOTE MARKER STYLE
+\# ---------------------
+\# *Arguments:
+\# STAR | NUMBER | LINE
+\# *Function:
+\# Sets register #FN_MARKER_STYLE, used in FOOTNOTE to determine
+\# the style of footnote markers.
+\# *Notes:
+\# 1=STAR; 2=NUMBER; 3=LINE. LINE means "use output line numbers".
+\# Default is STAR.
+\#
+.MAC FOOTNOTE_MARKER_STYLE END
+. if '\\$1'STAR' \{\
+. if \\n[#FN_MARKER_STYLE]=3 \{\
+. if !\\n[#NEWPAGE]=1 \{\
+. tm1 "[mom]: Your current FOOTNOTE_MARKER STYLE is LINE.
+. tm1 " You cannot change footnote marker style without
+. tm1 " first breaking to a new page with NEWPAGE.
+. tm1 " Ignoring request FOOTNOTE_MARKER_STYLE STAR at line \\n[.c].
+. return
+. \}
+. \}
+. if \\n[#RUN_ON]=1 \{\
+. tm1 "[mom]: FOOTNOTE_MARKER_STYLE STAR at line \\n[.c] is incompatible
+. tm1 " with RUN_ON footnotes. Ignoring request.
+. return
+. \}
+. nr #FN_MARKER_STYLE 1
+. if \\n[#NEWPAGE]=1 .rr #NEWPAGE
+. FOOTNOTE_MARKERS
+. \}
+. if '\\$1'NUMBER' \{\
+. if \\n[#FN_MARKER_STYLE]=3 \{\
+. if !\\n[#NEWPAGE]=1 \{\
+. tm1 "[mom]: Your current FOOTNOTE_MARKER STYLE is NUMBER.
+. tm1 " You cannot change footnote marker style without
+. tm1 " first breaking to a new page with NEWPAGE.
+. tm1 " Ignoring request FOOTNOTE_MARKER_STYLE NUMBER at line \\n[.c].
+. return
+. \}
+. \}
+. if \\n[#RUN_ON]=1 \{\
+. tm1 "[mom]: FOOTNOTE_MARKER_STYLE NUMBER at line \\n[.c] is incompatible
+. tm1 " with RUN_ON footnotes. Ignoring request.
+. return
+. \}
+. nr #FN_MARKER_STYLE 2
+. shift
+. if '\\$1'NO_SUPERSCRIPT' .nr #NO_SUPERSCRIPT 1
+. if \\n[#NEWPAGE]=1 .rr #NEWPAGE
+. FOOTNOTE_MARKERS
+. \}
+. if '\\$1'LINE' \{\
+. nr #FN_MARKER_STYLE 3
+. FOOTNOTE_MARKERS OFF
+. if !\\n[#FN_LN_SEP] \
+. if !\\n[#FN_LN_BRACKETS] .FOOTNOTE_LINENUMBER_BRACKETS SQUARE
+. \}
+.END
+\#
+\# FOOTNOTE NUMBER PLACEHOLDERS
+\# ----------------------------
+\# *Argument:
+\# <number of placeholders>
+\# *Function:
+\# Sets register #FN_NUMBER_PLACEHOLDERS, used to establish whether to
+\# right pad a footnote number (in the footnote itself, not body copy).
+\# *Notes:
+\# No default is set for this; user must determine if, and where, it's
+\# required
+\#
+.MAC FOOTNOTE_NUMBER_PLACEHOLDERS END
+. nr #FN_NUMBER_PLACEHOLDERS \\$1
+.END
+\#
+\# FOOTNOTE LINENUMBER MARK
+\# ------------------------
+\# *Function:
+\# This string, when called inline, stores the current output line
+\# number in register #FN_MARK for use with FOOTNOTE.
+\#
+.ds FN_MARK \R'#FN_MARK \En[ln]'
+\#
+\# FOOTNOTE LINENUMBER SEPARATOR
+\# -----------------------------
+\# *Argument:
+\# <user-defined separator>
+\# *Function:
+\# Stores user-defined separator (for use then
+\# FOOTNOTE_MARKER_STYLE is LINE) in string $FN_LN_SEP. The
+\# separator is intended to be used when the user wishes a
+\# separator, rather than the choice of brackets offered by
+\# FOOTNOTE_LINENUMBER_BRACKETS.
+\#
+.MAC FOOTNOTE_LINENUMBER_SEPARATOR END
+. rr #FN_LN_BRACKETS
+. nr #FN_LN_SEP 1
+. ds $FN_LN_SEP "\\$1
+.END
+\#
+\# FOOTNOTE LINENUMBER BRACKETS
+\# ----------------------------
+\# *Argument:
+\# PARENS | SQUARE | BRACES or ( | [ | {
+\# *Function:
+\# Sets register #FN_LN_BRACKETS to 1, and creates strings
+\# $FN_OPEN_BRACKET and $FN_CLOSE_BRACKET according to the given
+\# argument.
+\#
+.MAC FOOTNOTE_LINENUMBER_BRACKETS END
+. rr #FN_LN_SEP
+. nr #FN_LN_BRACKETS 1
+. if '\\$1'PARENS' \{\
+. ds $FN_OPEN_BRACKET (
+. ds $FN_CLOSE_BRACKET )
+. \}
+. if '\\$1'(' \{\
+. ds $FN_OPEN_BRACKET (
+. ds $FN_CLOSE_BRACKET )
+. \}
+. if '\\$1'SQUARE' \{\
+. ds $FN_OPEN_BRACKET [
+. ds $FN_CLOSE_BRACKET ]
+. \}
+. if '\\$1'[' \{\
+. ds $FN_OPEN_BRACKET [
+. ds $FN_CLOSE_BRACKET ]
+. \}
+. if '\\$1'BRACES' \{\
+. ds $FN_OPEN_BRACKET {
+. ds $FN_CLOSE_BRACKET }
+. \}
+. if '\\$1'{' \{\
+. ds $FN_OPEN_BRACKET {
+. ds $FN_CLOSE_BRACKET }
+. \}
+.END
+\#
+\# RESET FOOTNOTE NUMBER
+\# ---------------------
+\# *Arguments:
+\# <none> | PAGE
+\# *Function:
+\# Resets register #FN_NUMBER to 1. If argument is PAGE, creates
+\# toggle #RESET_FN_NUMBER which is checked in HEADER. If 1,
+\# numbered footnotes on every page start at 1.
+\#
+.MAC RESET_FOOTNOTE_NUMBER END
+. ie '\\$1'' .nr #FN_NUMBER 0 1
+. el .nr #RESET_FN_NUMBER 1
+.END
+\#
+\# FOOTNOTE RULE LENGTH
+\# --------------------
+\# *Arguments:
+\# <length of rule used to separate footnotes from running text>
+\# *Function:
+\# Creates or modifies registers #FN_RULE_LENGTH.
+\# *Notes:
+\# Requires unit of measure (iPpcm).
+\# Default is 4P for both PRINTSTYLEs.
+\#
+.MAC FOOTNOTE_RULE_LENGTH END
+. nr #FN_RULE_LENGTH (\\$1)
+.END
+\#
+\# FOOTNOTE_RULE_ADJ
+\# -----------------
+\# *Arguments:
+\# <number of points to raise footnote rule from it's baseline position>
+\# *Function:
+\# Creates or modifies register #FN_RULE_ADJ.
+\# *Notes:
+\# Default is 3p for both TYPESTYLES.
+\#
+\# Requires unit of measure.
+\#
+.MAC FOOTNOTE_RULE_ADJ END
+. nr #FN_RULE_ADJ (\\$1)
+.END
+\#
+\# FOOTNOTE RULE
+\# -------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Turns printing of footnote separator rule on or off. If invoked as
+\# PRINT_FOOTNOTE_RULE, prints footnote separator rule.
+\# *Notes:
+\# Default is on.
+\#
+\# Invoked in FOOTNOTE (as PRINT_FOOTNOTE_RULE) as 1st line of a footnote
+\# if the footnote number (#FN_COUNT) is 1.
+\#
+.MAC FOOTNOTE_RULE END
+. ie '\\$0'PRINT_FOOTNOTE_RULE' \{\
+. if \\n[#FN_RULE]=0 .RLD 1v
+. RLD 1v
+. LEFT
+\v'-\\n[#FN_RULE_ADJ]u-\\n[#FN_RULE_WEIGHT_ADJ]u'\
+\D't \\n[#FN_RULE_WEIGHT]'\
+\h'-\\n[#FN_RULE_WEIGHT]u'\
+\D'l \\n[#FN_RULE_LENGTH]u 0'\
+\v'+\\n[#FN_RULE_ADJ]u+\\n[#FN_RULE_WEIGHT_ADJ]u'
+\!. ps \\n[#DOC_PT_SIZE]u\\*$[FN_SIZE_CHANGE]
+. QUAD \\*[$FN_QUAD]
+. \}
+. el \{\
+. ie '\\$1'' .nr #FN_RULE 1
+. el .nr #FN_RULE 0
+. \}
+.END
+\#
+\# FOOTNOTE SPACING
+\# ----------------
+\# *Arguments:
+\# <per item post footnote spacing> | <anything>
+\# *Function:
+\# Enables printing of post footnote spacing.
+\# *Notes:
+\# Default is no space.
+\#
+.MAC FOOTNOTE_SPACING END
+. ie \B'\\$1' .ds $FN_SPACE \\$1
+. el .rm $FN_SPACE
+.END
+\#
+\# FOOTNOTE FIRST LINE INDENT
+\# --------------------------
+\# *Arguments:
+\# <indent>
+\# *Function:
+\# Indents first line of footnotes.
+\# *Notes:
+\# Default is no indent.
+\#
+.MAC FOOTNOTE_INDENT END
+. nr #FN_INDENT \\$1
+.END
+\#
+\# RUN ON FOOTNOTES
+\# ----------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Toggles run-on footnotes on or off.
+\#
+.MAC FOOTNOTES_RUN_ON END
+. ie '\\$1'' \{\
+. if \\n[#FN_COUNT]>0 \{\
+. tm1 "[mom]: Switching to run-on footnotes at line \\n[.c] will cause
+. tm1 " you to loose footnotes already formatted for this page.
+. tm1 " Ignoring request FOOTNOTES_RUN_ON.
+. rr #RUN_ON
+. return
+. \}
+. nr #RUN_ON 1
+. if \\n[#FN_MARKER_STYLE]=1 .RUNON_WARNING
+. if \\n[#FN_MARKER_STYLE]=2 .RUNON_WARNING
+. \}
+. el \{\
+. if \\n[#FN_COUNT]>0 \{\
+. if \\n[#RUN_ON]=1 \{\
+. tm1 "[mom]: Switching off run-on footnotes at line \\n[.c] will cause
+. tm1 " you to loose footnotes already formatted for this page.
+. tm1 " Ignoring request FOOTNOTES_RUN_ON \\$1.
+. return
+. \}
+. \}
+. rr #RUN_ON
+. \}
+.END
+\#
+.MAC RUNON_WARNING END
+. if \\n[#FN_MARKER_STYLE]=1 \{\
+. tm1 "[mom]: The footnote marker style active at line \\n[.c] is STAR,
+. tm1 " which is incompatible with run-on footnotes. Please change
+. tm1 " the footnote marker style to LINE. Continuing to process,
+. tm1 " but ignoring request FOOTNOTES_RUN_ON.
+. rr #RUN_ON
+. \}
+. if \\n[#FN_MARKER_STYLE]=2 \{\
+. tm1 "[mom]: The footnote marker style active at line \\n[.c] is NUMBER,
+. tm1 " which is incompatible with run-on footnotes. Please change
+. tm1 " the footnote marker style to LINE. Continuing to process,
+. tm1 " but ignoring request FOOTNOTES_RUN_ON.
+. rr #RUN_ON
+. \}
+.END
+\#
+\# FOOTNOTE
+\# --------
+\# *Arguments:
+\# <none> | INDENT L|LEFT|R|RIGHT|B|BOTH <indent value> | <anything>
+\# *Function:
+\# Begins collecting and diverting footnote text if no argument
+\# given. Otherwise, ends diversion FOOTNOTES, measures footnote
+\# depth, and sets footnote trap.
+\# *Notes:
+\# The input line preceding a footnote call MUST terminate with \c
+\# or the footnote marker will be spaced away from the word it
+\# should be joined to.
+\#
+\# If FOOTNOTE is invoked with INDENT, the footnote will
+\# be indented. An indent style and an indent value must be given.
+\# Subsequent footnotes will NOT be indented; INDENT must be given
+\# for each footnote the user wants indented.
+\#
+.MAC FOOTNOTE END
+. ie '\\$1'' \{\
+. if \\n[#UNDERLINE_ON] \{\
+. UNDERLINE OFF
+. nr #UNDERLINE_WAS_ON_FN 1
+. \}
+. if \\n[#FN_MARKER_STYLE]=3 \{\
+. if !\\n[#LINENUMBERS] \{\
+. tm1 "[mom]: Line numbering must be enabled with NUMBER_LINES when
+. tm1 " FOOTNOTE_MARKER_STYLE is LINE.
+. ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. \}
+. if \\n[#FN_MARK]=0 .nr #FN_MARK \\n[ln]
+. nr #FN_MARK_2 \\n[ln]
+. if '\\n[.z]'P_QUOTE' \{\
+. nr #FN_MARK -1
+. nr #FN_MARK_2 -1
+. \}
+. if \\n[#IN_DIVER]=1 \{\
+. if '\\n[.z]'P_QUOTE' \{\
+. if !\\n[#QUOTE_LN]=1 \{\
+. if !\\n[#SILENT_QUOTE_LN]=1 \{\
+. tm1 "[mom]: You have requested a line-numbered footnote inside a
+. tm1 " QUOTE at line \\n[.c], but line-numbering has not been enabled
+. tm1 " for QUOTES. Printing footnote with label "0".
+. rr #FN_MARK
+. rr #FN_MARK_2
+. \}
+. \}
+. \}
+. if '\\n[.z]'B_QUOTE' \{\
+. if !\\n[#BQUOTE_LN]=1 \{\
+. if !\\n[#SILENT_BQUOTE_LN]=1 \{\
+. tm1 "[mom]: You have requested a line-numbered footnote inside a
+. tm1 " BLOCKQUOTE at line \\n[.c], but line-numbering has not been enabled
+. tm1 " for BLOCKQUOTES. Printing footnote with label "0".
+. rr #FN_MARK
+. rr #FN_MARK_2
+. \}
+. \}
+. \}
+. \}
+. \}
+.\" Begin processing footnotes that occur inside QUOTE, BLOCKQUOTE
+.\" or EPIGRAPH.
+. if \\n[#IN_DIVER]=1 \{\
+. nr #PAGE_POS \\n[nl]+\\n[.d]+\\n[#DOC_LEAD]
+. nr #FOOTER_POS \\n[#PAGE_LENGTH]+(\\n[#VARIABLE_FOOTER_POS]-1)
+. nr #SPACE_TO_FOOTER \\n[#FOOTER_POS]-\\n[#PAGE_POS]
+.\" Are we on a "defer" line? If so, defer the text of the footnote.
+. ie \\n[#SPACE_TO_FOOTER]<=\\n[#DOC_LEAD] \
+. nr #DIVER_FN 2 \" treat like a normal deferred footnote
+. el \
+. nr #DIVER_FN 2 \" treat like a normal footnote
+. if \\n[#PAGE_POS]>\\n[#FOOTER_POS] \
+. nr #DIVER_FN 1 \" move this footnote
+.\" Test for situation where, because a final line of QUOTE, BLOCKQUOTE
+.\" or EPIGRAPH isn't yet adjusted at this point, the last word on the
+.\" line may *seem* to belong to the final line of the page, but will,
+.\" in fact, become the first word of the subsequent page. In such
+.\" circumstances, we want the footnote to be treated as a "moved"
+.\" diversion footnote.
+. if \\n[.k]>\\n[.l] .nr #DIVER_FN 1
+. if r #DIVER_FN \{\
+. if !\\n[#DIVER_FN]=2 .\\n+[#DONE_ONCE]
+.\" A footnote inside a diversion will become the 1st footnote on the
+.\" following page/column.
+. if \\n[#DIVER_FN]=1 .DIVER_FN_1_PRE
+.\" A footnote inside a diversion that should be treated like a
+.\" normal footnote (including defers.)
+. if \\n[#DIVER_FN]=2 .DIVER_FN_2_PRE
+. \}
+. nr #SAVED_FN_COUNT \\n[#FN_COUNT]+1
+. nr #SAVED_FN_COUNT_FOR_COLS \\n[#FN_COUNT_FOR_COLS]+1
+. \}
+.\" End processing footnotes that occur inside QUOTE, BLOCKQUOTE or
+.\" EPIGRAPH.
+.\"
+.\" Test for situation where, because a final line of running text
+.\" isn't yet adjusted at this point, the last word on the line may
+.\" *seem* to belong to the final line of the page, but will, in
+.\" fact, become the first word of the subsequent page. In such
+.\" circumstances, we want the footnote marker in running text to
+.\" be the correct one for the 1st footnote on the page.
+. if \\n[.k]>\\n[.l] \{\
+. if (\\n[nl]+\\n[#DOC_LEAD])>(\\n[#PAGE_LENGTH]+\\n[#VARIABLE_FOOTER_POS]) \{\
+. ie \\n[#COLUMNS]=1 \{\
+. if \\n[#COL_NUM]=\\n[#NUM_COLS] \{\
+. if \\n[#FN_MARKER_STYLE]=1 .nr #FN_COUNT_FOR_COLS 0 1
+. if \\n[#FN_MARKER_STYLE]=2 \{\
+. if \\n[#RESET_FN_NUMBER] \{\
+. nr #FN_NUMBER 0 1
+. nr #NOT_YET_ADJUSTED 1
+. \}
+. \}
+. \}
+. \}
+. el \{\
+. if \\n[#FN_MARKER_STYLE]=1 .nr #FN_COUNT 0 1
+. if \\n[#FN_MARKER_STYLE]=2 \{\
+. if \\n[#RESET_FN_NUMBER] \{\
+. nr #FN_NUMBER 0 1
+. nr #NOT_YET_ADJUSTED 1
+. \}
+. \}
+. \}
+. \}
+. \}
+. if \\n[#FN_MARKERS] \{\
+.\" Housekeeping
+. if \\n[#CONDENSE] \*[CONDX]\c
+. if \\n[#EXTEND] \*[EXTX]\c
+.\" Add footnote markers to running text...
+. if !\\n[#NO_FN_MARKER] \{\
+.\" ...but not if TERMINATE has not been called
+. if !r#TERMINATE \{\
+.\" Marker style star/dagger/double-dagger
+. if \\n[#FN_MARKER_STYLE]=1 \{\
+.\" Columnar docs either move col to col, or last col to next page.
+.\" They require their own special FN_COUNT because regular FN_COUNT
+.\" is used to figure out things like whether or not to put a rule
+.\" above footnotes (in addition to keeping track of the footnote
+.\" count in non-columnar docs).
+. ie \\n[#COLUMNS]=1 \{\
+. if \\n[#FN_COUNT_FOR_COLS]=0 .PRINT \*[BU2]*\c
+. if \\n[#FN_COUNT_FOR_COLS]=1 .PRINT \*[BU1]\[dg]\c
+. if \\n[#FN_COUNT_FOR_COLS]=2 .PRINT \[dd]\c
+. if \\n[#FN_COUNT_FOR_COLS]=3 .PRINT \*[BU2]**\c
+. if \\n[#FN_COUNT_FOR_COLS]=4 .PRINT \*[BU1]\[dg]\[dg]\c
+. if \\n[#FN_COUNT_FOR_COLS]=5 .PRINT \[dd]\[dd]\c
+. if \\n[#FN_COUNT_FOR_COLS]=6 .PRINT \*[BU2]***\c
+. if \\n[#FN_COUNT_FOR_COLS]=7 .PRINT \*[BU1]\[dg]\[dg]\[dg]\c
+. if \\n[#FN_COUNT_FOR_COLS]=8 .PRINT \[dd]\[dd]\[dd]\c
+. if \\n[#FN_COUNT_FOR_COLS]=9 .PRINT \*[BU2]****\c
+. \}
+. el \{\
+. if \\n[#FN_COUNT]=0 .PRINT \*[BU2]*\c
+. if \\n[#FN_COUNT]=1 .PRINT \*[BU1]\[dg]\c
+. if \\n[#FN_COUNT]=2 .PRINT \[dd]\c
+. if \\n[#FN_COUNT]=3 .PRINT \*[BU2]**\c
+. if \\n[#FN_COUNT]=4 .PRINT \*[BU1]\[dg]\[dg]\c
+. if \\n[#FN_COUNT]=5 .PRINT \[dd]\[dd]\c
+. if \\n[#FN_COUNT]=6 .PRINT \*[BU2]***\c
+. if \\n[#FN_COUNT]=7 .PRINT \*[BU1]\[dg]\[dg]\[dg]\c
+. if \\n[#FN_COUNT]=8 .PRINT \[dd]\[dd]\[dd]\c
+. if \\n[#FN_COUNT]=9 .PRINT \*[BU2]****\c
+. \}
+. \}
+.\" Marker style superscript numbers
+. if \\n[#FN_MARKER_STYLE]=2 \{\
+. if \\n[#PRINT_STYLE]=1 \
+. PRINT \
+"\s-2\v'-\\n[#DOC_LEAD]u/5u'\\n+[#FN_NUMBER]\v'+\\n[#DOC_LEAD]u/5u'\s+2\c"
+. if \\n[#PRINT_STYLE]=2 \
+. PRINT \
+"\*[SUP]\\n+[#FN_NUMBER]\*[SUPX]\c"
+. \}
+. \}
+. \}
+. \}
+.\" More housekeeping
+.\"
+.\" #SPACE_REMAINING is the space left between where we are
+.\" on the page and the bottom margin. It's used to determine whether
+.\" or not the footnote will overflow, and how many lines of
+.\" footnotes will fit on the page if some have to overflow.
+. ie \\n[#DIVER_FN]=2 \
+. nr #SPACE_REMAINING (\\n[#PAGE_LENGTH]-\\n[#B_MARGIN])-(\\n[#PAGE_POS])
+. el \
+. nr #SPACE_REMAINING (\\n[#PAGE_LENGTH]-\\n[#B_MARGIN])-\\n[nl]
+. if \\n[#FROM_DIVERT_FN]=1 \{\
+. nr #SPACE_REMAINING \\n[#PAGE_LENGTH]-\\n[#B_MARGIN]
+. rr #FROM_DIVERT_FN
+. \}
+. nr #PP_STYLE_PREV \\n[#PP_STYLE]
+. nr #PP_STYLE 2
+. if \\n[#INDENT_FIRST_PARAS] .nr #INDENT_FIRSTS 1
+. INDENT_FIRST_PARAS
+.\" Prepare FOOTNOTE to receive footnote text.
+. if \\n[.hy] .nr #RESTORE_HY_PARAMS \\n[.hy]
+. ev FOOTNOTES
+. ll \\n[#DOC_L_LENGTH]u
+. ta \\n[.l]u
+. if \\n[#COLUMNS]=1 \{\
+. ll \\n[#COL_L_LENGTH]u
+. ta \\n[.l]u
+. \}
+. if \\n[#FN_R_INDENT] \{\
+. ll -\\n[#FN_R_INDENT]u
+. ta \\n[.l]u
+. \}
+. if \\n[#FN_BR_INDENT] \{\
+. ll -\\n[#FN_BR_INDENT]u
+. ta \\n[.l]u
+. \}
+. FAMILY \\*[$FN_FAM]
+. FT \\*[$FN_FT]
+. ps \\n[#DOC_PT_SIZE]u\\*[$FN_SIZE_CHANGE]
+. vs \\n[.ps]u+\\n[#FN_AUTOLEAD]u
+. QUAD \\*[$FN_QUAD]
+. if \\n[#PRINT_STYLE]=1 \{\
+. TYPEWRITER
+. ie \\n[#SINGLE_SPACE] .vs \\n[#ORIGINAL_DOC_LEAD]u
+. el .vs \\n[#ORIGINAL_DOC_LEAD]u/2u
+. QUAD LEFT
+. HY OFF
+. \}
+. nr #FN_LEAD \\n[#LEAD]
+.\" Begin diversion FOOTNOTES or FN_IN_DIVER
+. ie r#COUNTERS_RESET \{\
+. ie \\n[#DONE_ONCE]=1 \{\
+. ie \\n[#RUN_ON] \{\
+. di RUNON_FN_IN_DIVER
+. nr #RUNON_FN_IN_DIVER 1
+. \}
+. el .di FN_IN_DIVER
+. \}
+. el \{\
+. ie \\n[#RUN_ON] \{\
+. da RUNON_FN_IN_DIVER
+. nr #RUNON_FN_IN_DIVER 1
+. \}
+. el .da FN_IN_DIVER
+. \}
+. \\n+[#DONE_ONCE]
+. \}
+. el \{\
+. ie \\n[#RUN_ON] \{\
+. nh
+. da RUNON_FOOTNOTES
+. nr #RUNON_FOOTNOTES 1
+. \}
+. el .da FOOTNOTES
+. \}
+. if \\n[#FOOTNOTE_COLOR]=1 \{\
+. TRAP OFF
+. nf
+\m[\\*[$FOOTNOTE_COLOR]]
+. EOL
+. fi
+. TRAP
+. \}
+. if \\n[#EPIGRAPH] .nr #FN_FOR_EPI 1
+.\" When a deferred footnote is also the 1st footnote on the page,
+.\" and when the page it's output on also has footnotes, some
+.\" whitespace is needed between the deferred footnote and the
+.\" first footnote belonging to the output page so that there's
+.\" no confusion when two stars (or two number 1s) appear in
+.\" footnotes...
+. if \\n[#FN_DEFER_SPACE] \{\
+.\" ...but only add the extra space if TERMINATE has not been called
+. if !r#TERMINATE \{\
+.\" ...and not if defer space has already been added
+. if !\\n[#DEFER_SPACE_ADDED] \{\
+.\" ...and not if the footnote count the last time we checked for
+.\" a defer situation inside a diversion is greater than 1.
+. if !\\n[#SAVED_DIVER_FN_COUNT]>1 \{\
+. if \\n[#FN_MARKER_STYLE]=1 .ALD 1v
+. if \\n[#RESET_FN_NUMBER] .ALD 1v
+. nr #DEFER_SPACE_ADDED 1
+. \}
+. \}
+. \}
+. rr #FN_DEFER_SPACE
+. rr #SAVED_DIVER_FN_COUNT
+. \}
+. if \\n[#DIVERTED]=3 \{\
+. if \\n[#FN_COUNT]>0 \{\
+\!. RLD 1v
+. \}
+. \}
+.\" Add footnote rule (or, if no rule, some whitespace).
+.\" N.B.- this line increments #FN_COUNT each and every time FOOTNOTE
+.\" is run.
+. if \\n+[#FN_COUNT]=1 \{\
+.\" If a footnote is called in a diversion, and the footnote has to
+.\" be moved, don't put in the rule now (it's taken care of when
+.\" FN_IN_DIVER is output into FOOTNOTE in PROCESS_FN_IN_DIVER).
+. if !\\n[#DONT_RULE_ME]=1 \{\
+. if !\\n[#FN_DEPTH] \{\
+. if \\n[#PRINT_STYLE]=1 \
+. if !\\n[#RUN_ON] .sp \\n[#DOC_LEAD]u
+. ie \\n[#FN_RULE]=1 \{\
+. if !\\n[#RUN_ON] \{\
+. if \\n[#SINGLE_SPACE] .sp \\n[#DOC_LEAD]u
+. PRINT_FOOTNOTE_RULE
+. if !'\\*[$FN_SPACE]'' .sp -\\*[$FN_SPACE]
+. \}
+. \}
+. el .sp
+. nr #RULED 1
+. \}
+. \}
+. \}
+. rr #DONT_RULE_ME
+. ds $RESTORE_SS_VAR \\*[$SS_VAR]
+. SS 0
+.\" Add footnote markers to footnote text...
+. ie \\n[#FN_MARKERS] \{\
+. if !'\\*[$FN_SPACE]'' \
+. if \\n[#FN_COUNT]>0 .ALD \\*[$FN_SPACE]
+. if !\\n[#NO_FN_MARKER] \{\
+.\" ...but not if TERMINATE has been called.
+. if !r#TERMINATE \{\
+. if \\n[#REF]=1 \{\
+. nr #REF_FN_INDENT (u;\\*[$REF_FN_INDENT])
+. ti \\n[#REF_FN_INDENT]u
+. \}
+. if \\n[#FN_MARKER_STYLE]=1 \{\
+. ie \\n[#COLUMNS]=1 \{\
+. \\n+[#FN_COUNT_FOR_COLS]
+. if \\n[#FN_COUNT_FOR_COLS]=1 .PRINT \h'0+\\n[#FN_INDENT]u'*\c
+. if \\n[#FN_COUNT_FOR_COLS]=2 .PRINT \h'0+\\n[#FN_INDENT]u'\[dg]\c
+. if \\n[#FN_COUNT_FOR_COLS]=3 .PRINT \h'0+\\n[#FN_INDENT]u'\[dd]\c
+. if \\n[#FN_COUNT_FOR_COLS]=4 .PRINT \h'0+\\n[#FN_INDENT]u'**\c
+. if \\n[#FN_COUNT_FOR_COLS]=5 .PRINT \h'0+\\n[#FN_INDENT]u'\[dg]\[dg]\c
+. if \\n[#FN_COUNT_FOR_COLS]=6 .PRINT \h'0+\\n[#FN_INDENT]u'\[dd]\[dd]\c
+. if \\n[#FN_COUNT_FOR_COLS]=7 .PRINT \h'0+\\n[#FN_INDENT]u'***\c
+. if \\n[#FN_COUNT_FOR_COLS]=8 .PRINT \h'0+\\n[#FN_INDENT]u'\[dg]\[dg]\[dg]\c
+. if \\n[#FN_COUNT_FOR_COLS]=9 .PRINT \h'0+\\n[#FN_INDENT]u'\[dd]\[dd]\[dd]\c
+. if \\n[#FN_COUNT_FOR_COLS]=10 .PRINT \h'0+\\n[#FN_INDENT]u'****\c
+. \}
+. el \{\
+. if \\n[#FN_COUNT]=1 .PRINT \h'0+\\n[#FN_INDENT]u'*\c
+. if \\n[#FN_COUNT]=2 .PRINT \h'0+\\n[#FN_INDENT]u'\[dg]\c
+. if \\n[#FN_COUNT]=3 .PRINT \h'0+\\n[#FN_INDENT]u'\[dd]\c
+. if \\n[#FN_COUNT]=4 .PRINT \h'0+\\n[#FN_INDENT]u'**\c
+. if \\n[#FN_COUNT]=5 .PRINT \h'0+\\n[#FN_INDENT]u'\[dg]\[dg]\c
+. if \\n[#FN_COUNT]=6 .PRINT \h'0+\\n[#FN_INDENT]u'\[dd]\[dd]\c
+. if \\n[#FN_COUNT]=7 .PRINT \h'0+\\n[#FN_INDENT]u'***\c
+. if \\n[#FN_COUNT]=8 .PRINT \h'0+\\n[#FN_INDENT]u'\[dg]\[dg]\[dg]\c
+. if \\n[#FN_COUNT]=9 .PRINT \h'0+\\n[#FN_INDENT]u'\[dd]\[dd]\[dd]\c
+. if \\n[#FN_COUNT]=10 .PRINT \h'0+\\n[#FN_INDENT]u'****\c
+. \}
+. \}
+. if \\n[#FN_MARKER_STYLE]=2 \{\
+. ds $FN_NUMBER \\n[#FN_NUMBER]
+. length #FN_NUMBER_LENGTH \\*[$FN_NUMBER]
+. if \\n[#COLUMNS]=1 \
+. \\n+[#FN_COUNT_FOR_COLS]
+. if \\n[#NOT_YET_ADJUSTED]=1 \{\
+. nr #FN_NUMBER 1 1
+. rr #NOT_YET_ADJUSTED
+. \}
+. if \\n[#PRINT_STYLE]=1 \{\
+. ie \\n[#NO_SUPERSCRIPT] \{\
+. ie \\n[#FN_NUMBER_LENGTH]<\\n[#FN_NUMBER_PLACEHOLDERS] \
+. PRINT "\h'0+\\n[#FN_INDENT]u'\0(\\n[#FN_NUMBER])\|\c"
+. el \
+. PRINT "\h'0+\\n[#FN_INDENT]u'(\\n[#FN_NUMBER])\|\c"
+. \}
+. el \{\
+. ie \\n[#FN_NUMBER_LENGTH]<\\n[#FN_NUMBER_PLACEHOLDERS] \
+. PRINT \
+"\h'0+\\n[#FN_INDENT]u'\s-2\v'-\\n[.v]u/5u'\0\\n[#FN_NUMBER]\|\v'+\\n[.v]u/5u'\s+2\|\c"
+. el \
+. PRINT \
+"\h'0+\\n[#FN_INDENT]u'\s-2\v'-\\n[.v]u/5u'\\n[#FN_NUMBER]\|\v'+\\n[.v]u/5u'\s+2\|\c"
+. \}
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. ie \\n[#FN_NUMBER_LENGTH]<\\n[#FN_NUMBER_PLACEHOLDERS] \
+. PRINT "\h'0+\\n[#FN_INDENT]u'\*[SUP]\0\\n[#FN_NUMBER]\*[SUPX]\*[FU 3]\c"
+. el \
+. PRINT "\h'0+\\n[#FN_INDENT]u'\*[SUP]\\n[#FN_NUMBER]\*[SUPX]\*[FU 3]\c"
+. \}
+. \}
+. \}
+. \}
+. \}
+. el \{\
+.\" Line-numbered footnotes handling
+. if \\n[#FN_MARKER_STYLE]=3 \{\
+. if \\n[#FN_SPACE]>0 \{\
+. if !\\n[#RUN_ON]=1 \
+. if \\n[#FN_COUNT]>0 .ALD \\n[#FN_SPACE]u
+. \}
+. if \\n[#REF]=1 \{\
+. if !\\n[#RUN_ON]=1 \{\
+\!. ti +\\n[#REF_FN_INDENT]uu
+. \}
+. \}
+. ie \\n[#FN_LN_BRACKETS]=1 \{\
+. ds $FN_LINENUMBER \h'0+\\n[#FN_INDENT]u'\v'-.085m'\\*[$FN_OPEN_BRACKET]\v'.085m'
+. ie \\n[#FN_MARK_2]=\\n[#FN_MARK] \
+. as $FN_LINENUMBER \
+\\n[#FN_MARK]\v'-.085m'\\*[$FN_CLOSE_BRACKET]\v'.085m'\h'.25m'
+. el \
+. as $FN_LINENUMBER \
+\\n[#FN_MARK]\v'-.1m'-\v'.1m'\\n[#FN_MARK_2]\v'-.085m'\
+\\*[$FN_CLOSE_BRACKET]\v'.085m'\h'.25m'
+. \}
+. el \{\
+. ie \\n[#FN_MARK_2]=\\n[#FN_MARK] \
+. ds $FN_LINENUMBER \\n[#FN_MARK]\\*[$FN_LN_SEP]
+. el \
+. ds $FN_LINENUMBER \
+\h'0+\\n[#FN_INDENT]u'\\n[#FN_MARK]\v'-.1m'-\v'.1m'\\n[#FN_MARK_2]\\*[$FN_LN_SEP]
+. \}
+. \}
+. if !\\n[#NO_FN_MARKER] \
+. PRINT \\*[$FN_LINENUMBER]\c
+. rm $FN_LINENUMBER
+. nr #FN_MARK 0
+. \}
+. \}
+. el \{\
+.\" If INDENT arg is passed to FOOTNOTE, calculate the indent...
+. ie '\\$1'INDENT' \{\
+. ev FOOTNOTES
+. if '\\$2'L' .in (\\$3)
+. if '\\$2'LEFT' .in (\\$3)
+. if '\\$2'R' .nr #FN_R_INDENT (\\$3)
+. if '\\$2'RIGHT' .nr #FN_R_INDENT (\\$3)
+. if '\\$2'B' \{\
+. nr #FN_BL_INDENT (\\$3)
+. ie '\\$4'' .nr #FN_BR_INDENT \\n[#FN_BL_INDENT]
+. el .nr #FN_BR_INDENT (\\$4)
+. in \\n[#FN_BL_INDENT]u
+. \}
+. if '\\$2'BOTH' \{\
+. nr #FN_BL_INDENT (\\$3)
+. ie '\\$4'' .nr #FN_BR_INDENT \\n[#FN_BL_INDENT]
+. el .nr #FN_BR_INDENT (\\$4)
+. in \\n[#FN_BL_INDENT]u
+. \}
+. ev
+.\" ...then re-run FOOTNOTE without an argument.
+. FOOTNOTE
+. \}
+. el \{\
+. br
+.\" Add "defer space" if the previously diverted footnote was the
+.\" 1st footnote proper to its page (i.e. it looks like a deferred
+.\" footnote but it's really an overflow).
+. if \\n[#DIVERTED] \{\
+. if \\n[#PREV_FN_DEFERRED]=1 \{\
+. if \\n[#FN_MARKER_STYLE]=1 .ALD \\n[#FN_LEAD]u
+. if \\n[#RESET_FN_NUMBER] .ALD \\n[#FN_LEAD]u
+. nr #PREV_FN_DEFERRED 2
+. \}
+. \}
+. if \\n[#REF]=1 \{\
+\!. in
+. \}
+.\" Terminate FOOTNOTES or FN_IN_DIVER diversion
+. di
+. HY_SET 1 \\n[#DIVERSIONS_HY_MARGIN]u (\\n[#PT_SIZE]u/1000u/8u)p
+. if \\n[#RESTORE_HY_PARAMS] .hy \\n[#RESTORE_HY_PARAMS]
+.\" More housekeeping
+.\" Turn off indent possibly set by FOOTNOTE INDENT
+. in 0
+. ev
+. if \\n[#UNDERLINE_WAS_ON_FN] \{\
+. UNDERLINE
+. rr #UNDERLINE_WAS_ON_FN
+. \}
+.\" Restore sentence spacing
+. if \\n[#PRINT_STYLE]=2 \{\
+. if d $RESTORE_SS_VAR .SS \\*[$RESTORE_SS_VAR]
+. rm $RESTORE_SS_VAR
+. \}
+. rr #FN_R_INDENT
+. rr #FN_BR_INDENT
+. nr #PP_STYLE \\n[#PP_STYLE_PREV]
+. if !\\n[#INDENT_FIRSTS] .INDENT_FIRST_PARAS OFF
+. rr #INDENT_FIRSTS
+.\" Calculate footnote depth, but not if #COUNTERS_RESET (created in
+.\" DIVER_FN_1_PRE) to instruct FOOTNOTES to skip this step for now
+.\" (it's taken care of when FN_IN_DIVER is output into FOOTNOTES in
+.\" PROCESS_FN_IN_DIVER).
+. ie r#COUNTERS_RESET .rr #COUNTERS_RESET
+. el \{\
+. nr #GET_DEPTH 1
+.\" If the footnote is the 1st on the page and it falls too close
+.\" to the bottom margin, defer the footnote text to the next page...
+. if (\\n[#SPACE_REMAINING]-1)<=(\\n[.v]) \{\
+.\" ...but not if PROCESS_FN_LEFTOVER has set #PREV_FN_DEFERRED to 1
+. if !\\n[#PREV_FN_DEFERRED]=1 \{\
+. nr #FN_DEFER 1
+. nr #FN_DEPTH +\\n[#DIVER_DEPTH]
+. rr #GET_DEPTH
+.\" This is required so that the defer space clause can distinguish
+.\" a real #FN_COUNT=1 from one generated if FOOTNOTE is run inside
+.\" QUOTE, BLOCKQUOTE or EPIGRAPH
+. if \\n[#DIVER_FN]=2 \{\
+. nr #SAVED_DIVER_FN_COUNT \\n[#FN_COUNT]
+. rr #DIVER_FN
+. \}
+. \}
+. \}
+.\" Calculate the footnote depth.
+. if \\n[#GET_DEPTH]=1 \{\
+.\" Save the previous footnote depth (for use when there will be
+.\" some overflowed footnote text).
+. nr #SAVED_FN_DEPTH_1 \\n[#FN_DEPTH]
+.\" Add the depth of the current footnote to any already existent
+.\" footnotes.
+. nr #FN_DEPTH +\\n[#DIVER_DEPTH]
+.\" Special handling for run-on footnotes
+. if \\n[#RUN_ON]=1 \{\
+. if \\n[#RUNON_FOOTNOTES] .unformat RUNON_FOOTNOTES
+. if \\n[#RUNON_FN_IN_DIVER] .unformat RUNON_FN_IN_DIVER
+. ev FOOTNOTES
+.\" Recreate FOOTNOTES with rule followed by text of unformatted
+.\" run-on footnotes.
+. di FOOTNOTES
+. ie \\n[#FN_RULE]=0 .RLD 1v
+. el \{\
+\v'-\\n[#FN_RULE_ADJ]u-\\n[#FN_RULE_WEIGHT_ADJ]u'\
+\D't \\n[#FN_RULE_WEIGHT]'\
+\h'-\\n[#FN_RULE_WEIGHT]u'\
+\D'l \\n[#FN_RULE_LENGTH]u 0'\
+\v'+\\n[#FN_RULE_ADJ]u+\\n[#FN_RULE_WEIGHT_ADJ]u'
+. \}
+. br
+. if \\n[#RUNON_FOOTNOTES] \{\
+. RUNON_FOOTNOTES
+. rr #RUNON_FOOTNOTES
+. \}
+. if \\n[#RUNON_FN_IN_DIVER] \{\
+. RUNON_FN_IN_DIVER
+. rr #RUNON_FN_IN_DIVER
+. \}
+. br
+. di
+. ev
+. nr #FN_DEPTH \\n[#DIVER_DEPTH]
+. nr #SAVED_VFP 0+\\n[#VARIABLE_FOOTER_POS]
+. nr #VARIABLE_FOOTER_POS 0-\\n[#B_MARGIN]u
+. \}
+.\" Save the new depth
+. nr #SAVED_FN_DEPTH_2 \\n[#FN_DEPTH]
+.\" Signal that defer space should be added when PROCESS_FN_LEFTOVER
+.\" processes deferred footnotes.
+. if \\n[#FN_DEFER] \{\
+. if \\n[#FN_COUNT]=2 \{\
+. ie \\n[#COLUMNS] \{\
+. if !\\n[#FROM_FOOTER] \{\
+. if \\n[#FN_DEFER]=1 .nr #FN_DEFER_SPACE 1
+. if \\n[#FN_COUNT_FOR_COLS]>=1 .rr #FN_DEFER_SPACE
+. if \\n[#FROM_HEADER] .nr #FN_DEFER_SPACE 1
+. \}
+. \}
+. el .nr #FN_DEFER_SPACE 1
+. \}
+. rr #FN_DEFER
+. \}
+.\" If the depth of the whole footnote won't fit in the space
+.\" between where we are on the page and the bottom margin, calculate
+.\" how much of it will fit.
+. if \\n[#FN_DEPTH]>\\n[#SPACE_REMAINING] \{\
+. nr #FN_LINES 0 1
+. while (\\n+[#FN_LINES]*\\n[#FN_LEAD])<\\n[#SPACE_REMAINING] \{\
+. nr #FN_DEPTH (\\n[#FN_LINES]*\\n[#FN_LEAD])
+. \}
+. nr #VFP_DIFF \\n[#FN_DEPTH]-\\n[#SAVED_FN_DEPTH_1]
+. nr #OVERFLOW 1
+.\" Very occasionally, #VFP_DIFF, on a 1st footnote that isn't to
+.\" be deferred, comes up with a depth equal to exactly 1 line
+.\" of footnotes, i.e. enough room to print the rule and nothing
+.\" else. The following tests for such a condition, and rather than
+.\" attempting to treat the footnote as an overflow, it tells mom to
+.\" treat it as a special kind of deferred footnote (#FN_DEFER 2).
+. if \\n[#SAVED_FN_DEPTH_1]=0 \{\
+. if \\n[#FN_DEPTH]=\\n[#FN_LEAD] \{\
+. nr #FN_DEFER 2
+. nr #FN_DEPTH \\n[#SAVED_FN_DEPTH_2]
+. rr #OVERFLOW
+. \}
+. \}
+. \}
+.\" Calculate VFP based on whether the footnote overflows, or is to
+.\" be treated normally.
+. ie \\n[#OVERFLOW]=1 \{\
+. if \\n[#RUN_ON] \{\
+. rr #VARIABLE_FOOTER_POS
+. nr #VARIABLE_FOOTER_POS \\n[#SAVED_VFP]
+. \}
+. ie \\n[#FN_COUNT]=1 \{\
+. ie \\n[#RULED]=1 \{\
+. ie \\n[#COLUMNS]=1 \{\
+. ie \\n[#COL_NUM]=\\n[#NUM_COLS] \{\
+. ie \\n[#FROM_FOOTER] \{\
+. ie \\n[#FN_COUNT_FOR_COLS]>1 \{\
+. nr #FN_DEPTH -\\n[#FN_DEPTH]
+. if \\n[#DIVERTED]=1 .nr #DIVERTED 3
+. if !\\n[#PREV_FN_DEFERRED]=1 \
+. nr #FN_DEPTH -\\n[#VFP_DIFF]
+. \}
+. el \{\
+. nr #VARIABLE_FOOTER_POS -\\n[#FN_DEPTH]
+. if \\n[#DIVERTED]=1 .nr #DIVERTED 3
+. \}
+. \}
+. el .nr #VARIABLE_FOOTER_POS -(\\n[#FN_DEPTH])
+. \}
+. el .nr #VARIABLE_FOOTER_POS -(\\n[#FN_DEPTH])
+. \}
+. el .nr #VARIABLE_FOOTER_POS -(\\n[#FN_DEPTH])
+. \}
+. el \{\
+. nr #VARIABLE_FOOTER_POS -\\n[#VFP_DIFF]
+. if \\n[#DIVERTED]=1 .nr #DIVERTED 3
+. if !\\n[#PREV_FN_DEFERRED]=1 \{\
+. ie \\n[#COLUMNS]=1 \
+. if !\\n[#FROM_FOOTER] .
+. el .nr #FN_DEPTH -\\n[#VFP_DIFF]
+. \}
+. if \\n[#DIVERTED]=3 \{\
+. if !\\n[#PREV_FN_DEFERRED] \{\
+. if !\\n[#FROM_FOOTER] \{\
+. if \\n[#FN_COUNT]=1 \{\
+. if !\\n[#VFP_DIFF] \{\
+. if \\n[#FN_MARKER_STYLE]=1 \{\
+. da FOOTNOTES
+\!. ALD \\n[#FN_LEAD]u
+. di
+. \}
+. if \\n[#RESET_FN_NUMBER] \{\
+. da FOOTNOTES
+\!. ALD \\n[#FN_LEAD]u
+. di
+. \}
+. \}
+. \}
+. \}
+. \}
+. \}
+. \}
+. nr #FN_DEPTH \\n[#SAVED_FN_DEPTH_1]+\\n[#VFP_DIFF]
+. \}
+. el \{\
+. nr #VARIABLE_FOOTER_POS -\\n[#VFP_DIFF]
+. nr #FN_DEPTH \\n[#SAVED_FN_DEPTH_1]+\\n[#VFP_DIFF]
+. \}
+. rr #OVERFLOW
+. rr #RULED
+. \}
+. el \{\
+. nr #VARIABLE_FOOTER_POS -\\n[#DIVER_DEPTH]
+. if \\n[#PREV_FN_DEFERRED]=1 \{\
+. if \\n[#DIVERTED] \{\
+. if !\\n[#FN_DEPTH]=\\n[#SAVED_FN_DEPTH_1] \{\
+. nr #FN_DEPTH +\\n[#FN_LEAD]
+. nr #VARIABLE_FOOTER_POS -\\n[#FN_LEAD]
+. rr #PREV_FN_DEFERRED
+. \}
+. \}
+. \}
+. if \\n[#FN_COUNT]>1 \{\
+. nr #NO_BACK_UP 1
+. rr #DIVERTED
+. rr #RULED
+. \}
+. \}
+. \}
+. \}
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u
+.\" If we have a footnote whose text has to be deferred to the next
+.\" page, reset the FOOTER trap to its original location.
+. if \\n[#FN_DEFER] \{\
+. nr #VARIABLE_FOOTER_POS 0-\\n[#B_MARGIN]u
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u
+. \}
+. \}
+. nr #NO_FN_MARKER 0
+. \}
+. if \\n[#NUM_ARGS]=2 \{\
+. if '\\$2'BREAK' .BR
+. if '\\$2'BR' .BR
+. \}
+.END
+\#
+\# Utility macros to manage footnotes that occur inside diversions
+\# ---------------------------------------------------------------
+\#
+\# There are some redundancies here; they're left in in case unforeseen
+\# footnote situations crop up in the future that might require
+\# manipulation of them.
+\#
+\# 1. Pre-footnote processing for footnotes in diversions
+\#
+\# a) A footnote inside a diversion will be moved entirely (marker
+\# in running text and text of footnote) to the next page/column.
+\#
+.MAC DIVER_FN_1_PRE END
+. nr #RESET_FN_COUNTERS 1
+. nr #COUNTERS_RESET 1
+. if \\n[#DONE_ONCE]=1 \{\
+. if \\n[#FN_DEFER] \{\
+. if \\n[#SAVED_DIVER_FN_COUNT]=1 \{\
+. ie \\n[#COLUMNS]=1 \
+. if \\n[#COL_NUM]=\\n[#NUM_COLS] .nr #FN_DEFER_SPACE 1
+. el .nr #FN_DEFER_SPACE 1
+. \}
+. \}
+. if \\n[#FN_MARKER_STYLE]=1 \{\
+. if \\n[#FN_COUNT]>0 .nr #FN_COUNT 0 1
+. if \\n[#COLUMNS]=1 \
+. if \\n[#COL_NUM]=\\n[#NUM_COLS] .nr #FN_COUNT_FOR_COLS 0 1
+. \}
+. if \\n[#FN_MARKER_STYLE]=2 \{\
+. if \\n[#RESET_FN_NUMBER]=1 \{\
+. ie \\n[#COLUMNS]=1 \
+. if \\n[#COL_NUM]=\\n[#NUM_COLS] .nr #FN_NUMBER 0 1
+. el .nr #FN_NUMBER 0 1
+. \}
+. \}
+. \}
+.END
+\#
+\# b) Treat as a normal footnote, including defers.
+\#
+.MAC DIVER_FN_2_PRE END
+. nr #RESET_FN_COUNTERS 2
+.END
+\#
+\# 2. Post-footnote processing for footnotes in diversions
+\#
+\# Even when a footnote inside a diversion is treated as
+\# "normal," some manipulation of registers is required. The
+\# macro is called in DO_QUOTE (i.e. at the termination of
+\# quotes and blockquotes) and in DO_EPIGRAPH.
+\#
+.MAC DIVER_FN_2_POST END
+. if \\n[#DONE_ONCE]=1 \{\
+. if \\n[#FN_MARKER_STYLE]=1 \{\
+. if \\n[#FN_COUNT]=0 .nr #DONT_RULE_ME 1
+. if \\n[#FN_COUNT]>0 .nr #FN_COUNT 0 1
+. if \\n[#COLUMNS]=1 \{\
+. if \\n[#COL_NUM]=\\n[#NUM_COLS] .nr #FN_COUNT_FOR_COLS 0 1
+. if !\\n[#COL_NUM]=\\n[#NUM_COLS] .
+. \}
+. \}
+. if \\n[#FN_MARKER_STYLE]=2 \{\
+. if \\n[#FN_COUNT]=0 .nr #DONT_RULE_ME 1
+. if \\n[#FN_COUNT]>0 .nr #FN_COUNT 0 1
+. if \\n[#RESET_FN_NUMBER]=1 \{\
+. ie \\n[#COLUMNS]=1 \
+. if \\n[#COL_NUM]=\\n[#NUM_COLS] .nr #FN_NUMBER 0 1
+. el .nr #FN_NUMBER 0 1
+. \}
+. \}
+. \}
+.END
+\#
+\# The main macros that handle footnote processing.
+\# -----------------------------------------------
+\#
+\# FN_OVERFLOW_TRAP starts off "underneath" FOOTER, but is revealed
+\# as #VARIABLE_FOOTER_POSITION changes the position of FOOTER.
+\# FN_OVERFLOW_TRAP simply starts diversion FN_OVERFLOW to "catch"
+\# the overflow. The diversion is ended in FOOTER, immediately after
+\# FOOTER outputs the diversion, FOOTNOTES, before PROCESS_FN_LEFTOVER
+\# is run (either in HEADER, or in FOOTER if moving col to col).
+\#
+.MAC FN_OVERFLOW_TRAP END
+. if \\n[#FN_COUNT] \{\
+. di FN_OVERFLOW
+. ie !\\n[#NO_BACK_UP]=1 \{\
+. if \\n[#PREV_FN_DEFERRED] \{\
+. ie \\n[#COLUMNS]=1 \{\
+. if \\n[#FROM_FOOTER] \{\
+. if \\n[#PREV_FN_DEFERRED] \{\
+. if !\\n[#COL_NUM]=\\n[#NUM_COLS] \
+. rr #PREV_FN_DEFERRED
+. \}
+. \}
+. if !\\n[#FROM_FOOTER] \{\
+. if !\\n[#COL_NUM]=\\n[#NUM_COLS] \{\
+. if !\\n[#LAST_FN_COUNT_FOR_COLS]>1 \{\
+\!. RLD \\n[#FN_LEAD]u
+. \}
+. \}
+. \}
+. \}
+. el \{\
+\!. RLD \\n[#FN_LEAD]u
+. \}
+. \}
+. \}
+. el \{\
+. rr #NO_BACK_UP
+. rr #PREV_FN_DEFERRED
+. \}
+. \}
+.\" When #FROM_DIVERT_FN is 1, it signals to FOOTNOTE, when run from
+.\" within DIVERT_FN_LEFTOVER, to set #SPACE_REMAINING to the total
+.\" area allowable for running text.
+. nr #FROM_DIVERT_FN 1
+.END
+\#
+\# PROCESS_FN_LEFTOVER is called at the top of HEADER, and in
+\# FOOTER if we're moving from one column to the next (i.e. after
+\# outputting FOOTNOTES). It checks for whether we have a "deferred
+\# footnote" situation, and resets counters and number registers
+\# accordingly. Lastly, if we have some footnote overflow, it calls
+\# DIVERT_FN_LEFTOVER.
+\#
+.MAC PROCESS_FN_LEFTOVER END
+. if \\n[#PREV_FN_DEFERRED]=2 \
+. if \\n[#FN_COUNT_AT_FOOTER]>1 .rr #PREV_FN_DEFERRED
+. ie !\\n[#FN_DEFER] \{\
+. nr #FN_COUNT 0 1
+. nr #FN_DEPTH 0
+. nr #VARIABLE_FOOTER_POS 0-\\n[#B_MARGIN]
+. \}
+. el \{\
+. if \\n[#FN_DEFER]=1 .nr #VARIABLE_FOOTER_POS 0-\\n[#B_MARGIN]
+. if \\n[#FN_DEFER]=2 \{\
+. nr #FN_DEPTH 0
+. nr #VARIABLE_FOOTER_POS 0-\\n[#B_MARGIN]
+. \}
+. \}
+. nr #SPACE_REMAINING 0
+. ch FOOTER -\\n[#B_MARGIN]u
+. if \\n[#FN_DEFER] \{\
+. nr #NO_FN_MARKER 1
+. rn FOOTNOTES DEFERRED-FOOTNOTE
+. nr #FN_DEPTH 0
+. FOOTNOTE
+. nf
+. DEFERRED-FOOTNOTE
+. FOOTNOTE OFF
+. ie \\n[#COLUMNS]=1 \{\
+. if \\n[#COL_NUM]=\\n[#NUM_COLS] \{\
+. if !\\n[#FROM_FOOTER] \
+. if \\n[#FN_COUNT_FOR_COLS]=1 .nr #PREV_FN_DEFERRED 1
+. \}
+. \}
+. el .nr #PREV_FN_DEFERRED 1
+. \}
+. if !\\n[#FN_DEFER] \
+. if \\n[#FN_OVERFLOW_DEPTH] .DIVERT_FN_LEFTOVER
+. ie \\n[#COLUMNS]=1 \{\
+. if \\n[#COL_NUM]>1 \
+. if \\n[#COL_NUM]=\\n[#NUM_COLS] .nr #FN_COUNT 0 1
+. \}
+. el .nr #FN_COUNT 0 1
+. if \\n[#DIVER_FN]=2 .rr #DIVER_FN
+. rr #FROM_DIVERT_FN
+.END
+\#
+\# DIVERT_FN_LEFTOVER is called in PROCESS_FN_LEFTOVER (at
+\# the top of HEADER, and in FOOTER if we're moving from one column
+\# to the next).
+\#
+.MAC DIVERT_FN_LEFTOVER END
+. nr #NO_FN_MARKER 1
+. nr #DIVERTED 1
+. FOOTNOTE
+. nf
+. FN_OVERFLOW
+. FOOTNOTE OFF
+. if \\n[#PREV_FN_DEFERRED] \{\
+. nr #FN_DEPTH -\\n[#FN_LEAD]
+. nr #VARIABLE_FOOTER_POS +\\n[#FN_LEAD]
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u
+. if \\n[#PREV_FN_DEFERRED]=2 \{\
+. nr #PREV_FN_DEFERRED 1
+. rr #DIVERTED
+. \}
+. \}
+. rr #FN_OVERFLOW_DEPTH
+.END
+\#
+\# This is a special macro to deal with footnotes that are set inside
+\# diversions (QUOTE, BLOCKQUOTE and EPIGRAPH). It's called in HEADER
+\# (and in FOOTER, if we're moving from column to column), and comes
+\# after PROCESS_FOOTNOTE_LEFTOVER in those two macros.
+\#
+.MAC PROCESS_FN_IN_DIVER END
+. nr #SPACE_REMAINING 0
+. ch FOOTER -\\n[#B_MARGIN]u
+. nr #NO_FN_MARKER 1
+. if !\\n[#RESET_FN_COUNTERS]=2 .rr #RESET_FN_COUNTERS
+. FOOTNOTE
+. if \\n[#FN_OVERFLOW_DEPTH] .nf
+. ie dRUNON_FN_IN_DIVER \{\
+. RUNON_FN_IN_DIVER
+. rm RUNON_FN_IN_DIVER
+. \}
+. el \{\
+. nf
+. FN_IN_DIVER
+. \}
+. FOOTNOTE OFF
+. rr #DIVER_FN
+.END
+\#
+\# ====================================================================
+\#
+\# +++ENDNOTES+++
+\#
+\# When endnotes are output, the spacing between the notes is always
+\# 1 extra linespace. This can have bottom margin consequences. If
+\# this doesn't bother you, don't worry about it. If it does bother
+\# you, and you want to adjust the spacing between any two endnotes (as
+\# they're output), make the spacing adjustments (.ALD/.RLD) at the
+\# *end* of endnotes (i.e. just before .ENDNOTE OFF), not at the top.
+\#
+\# Endnotes must be output manually with .ENDNOTES. This allows user
+\# the flexibility to output endnotes at the end of each collated
+\# document, or to output them at the end of the entire document.
+\#
+\# Control macros
+\# --------------
+\#
+\# ENDNOTE POINT SIZE
+\# ------------------
+\# *Argument:
+\# <base point size for endnotes>
+\# *Function:
+\# Creates or modifies register #EN_PS.
+\# *Notes:
+\# Default is same as running text in body of document.
+\#
+\# This size control macro differs from other size control macros
+\# in that it sets an absolute point size, not a relative one. This
+\# is because a) endnotes always appear separate from the body of
+\# a document and therefore don't need to be relative to the body
+\# of the document, and b) there are quite a few elements of the
+\# endnotes page(s) that need to be relative to the base point size
+\# of that page. If the base endnote point size were relative to
+\# the body of the document (i.e. a _SIZE macro taking a +|- value)
+\# getting the rest of the endnote elements sized properly could
+\# become very confusing.
+\#
+.MAC ENDNOTE_PT_SIZE END
+. nr #EN_PS (p;\\$1)
+.END
+\#
+\# ENDNOTE SPACING
+\# ----------------
+\# *Arguments:
+\# <per item endnote spacing> | <anything>
+\# *Function:
+\# Enables space between endnotes items.
+\# *Notes:
+\# Default is no space.
+\#
+.MAC ENDNOTE_SPACING END
+. ie \B'\\$1' .ds $EN_SPACE \\$1
+. el .rm $EN_SPACE
+.END
+\#
+\# ENDNOTES_HDRFTR_CENTER
+\# ----------------------
+\# *Argument:
+\# toggle
+\# *Function:
+\# Creates or removes toggle register #EN_HDRFTR_CENTER, used to
+\# determine whether mom should print a/the hdrftr center string
+\# on the endnotes page. Primarily to enable/disable printing of the
+\# chapter name in hdrftrs when DOCTYPE CHAPTER.
+\# *Notes:
+\# Default is OFF
+\#
+.MAC ENDNOTES_HDRFTR_CENTER END
+. ie '\\$1'' .nr #EN_HDRFTR_CENTER 1
+. el .rr #EN_HDRFTR_CENTER
+.END
+\#
+\# ENDNOTE STRING
+\# --------------
+\# *Argument:
+\# <title for endnotes page>
+\# *Function:
+\# Creates or modifies string $EN_STRING.
+\# *Notes:
+\# Default is "Endnotes"
+\#
+.MAC ENDNOTES_HEADER_STRING END
+. ds $EN_STRING \\$1
+.END
+.
+.ALIAS ENDNOTE_STRING ENDNOTES_HEADER_STRING
+\#
+\# ENDNOTE STRING START POSITION
+\# ----------------------------
+\# *Argument:
+\# <distance from page top>
+\# *Function:
+\# Creates or modifies register #EN_STRING_V_POS
+\#
+.MAC ENDNOTES_HEADER_V_POS END
+. nr #EN_STRING_V_POS (\\$1)
+.END
+.
+.ALIAS ENDNOTE_STRING_ADVANCE ENDNOTES_HEADER_V_POS
+.ALIAS ENDNOTE_STRING_V_POS ENDNOTES_HEADER_V_POS
+.ALIAS ENDNOTES_HEADER_V_POS ENDNOTES_HEADER_V_POS
+\#
+\# ENDNOTE HEADER CAPS and SMALLCAPS
+\# ---------------------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Turns capitalization or smallcaps style of the endnotes pages
+\# title string "Endnotes" on or off.
+\# *Notes:
+\# Users may want the endnotes pages title string to be in
+\# caps, but the toc entry for endnotes in lower case. If the
+\# argument to ENDNOTES_HEADER_STRING is in lower case and
+\# ENDNOTES_HEADER_CAPS is turned on, this is exactly what will
+\# happen. Ditto for smallcaps.
+\#
+\# Default for CAPS is on.
+\#
+.MAC ENDNOTES_HEADER_CAPS END
+. ie '\\$1'' .nr #EN_STRING_CAPS 1
+. el .nr #EN_STRING_CAPS 0
+.END
+.
+.ALIAS ENDNOTE_STRING_CAPS ENDNOTES_HEADER_CAPS
+.
+.MAC ENDNOTES_HEADER_SMALLCAPS END
+. ie '\\$1'' .nr #EN_STRING_SMALLCAPS 1
+. el .nr #EN_STRING_SMALLCAPS 0
+.END
+.
+.ALIAS ENDNOTE_STRING_SMALLCAPS ENDNOTES_HEADER_SMALLCAPS
+\#
+\# ENDNOTE TITLE
+\# -------------
+\# *Argument:
+\# <string that appears before the first endnote pertaining to any document>
+\# *Function:
+\# Creates string $EN_TITLE.
+\# *Notes:
+\# Default is the document title, or, if doc is a chapter, "Chapter #"
+\#
+.MAC ENDNOTE_TITLE END
+. ds $EN_TITLE \\$1
+.END
+\#
+\# ENDNOTE MARKER STYLE
+\# --------------------
+\# *Arguments:
+\# NUMBER | LINE | SUPERSCRIPT
+\# *Function:
+\# Sets register #EN_MARKER_STYLE, used in ENDNOTE to determine
+\# the style of endnote markers (labels).
+\# *Notes:
+\# 1=NUMBER; 2=LINE. LINE means "use output line numbers".
+\# Default is NUMBER.
+\#
+.MAC ENDNOTE_MARKER_STYLE END
+. if '\\$1'NUMBER' .nr #EN_MARKER_STYLE 1
+. if '\\$1'LINE' \{\
+. nr #EN_MARKER_STYLE 2
+. if !\\n[#EN_LN_SEP] \
+. if !\\n[#EN_LN_BRACKETS] .ENDNOTE_LINENUMBER_BRACKETS SQUARE
+. \}
+. if '\\$1'SUPERSCRIPT' .nr #EN_MARKER_STYLE 3
+.END
+\#
+\# ENDNOTE LINENUMBER MARK
+\# -----------------------
+\# *Function:
+\# This string, when called inline, stores the current output line
+\# number in register #EN_MARK for use with ENDNOTE.
+\#
+.ds EN_MARK \R'#EN_MARK \En[ln]'
+\#
+\# ENDNOTE LINENUMBER SEPARATOR
+\# ----------------------------
+\# *Argument:
+\# <user-defined separator>
+\# *Function:
+\# Stores user-defined separator (for use then
+\# ENDNOTE_MARKER_STYLE is LINE) in string $EN_LN_SEP. The
+\# separator is intended to be used when the user wishes a
+\# separator, rather than the choice of brackets offered by
+\# ENDNOTE_LINENUMBER_BRACKETS.
+\#
+.MAC ENDNOTE_LINENUMBER_SEPARATOR END
+. rr #EN_LN_BRACKETS
+. nr #EN_LN_SEP 1
+. ds $EN_LN_SEP "\\$1
+.END
+\#
+\# ENDNOTE LINENUMBER BRACKETS
+\# ---------------------------
+\# *Argument:
+\# PARENS | SQUARE | BRACES or ( | [ | {
+\# *Function:
+\# Sets register #EN_LN_BRACKETS to 1, and creates strings
+\# $EN_OPEN_BRACKET and $EN_CLOSE_BRACKET according to the given argument.
+\#
+.MAC ENDNOTE_LINENUMBER_BRACKETS END
+. rr #EN_LN_SEP
+. nr #EN_LN_BRACKETS 1
+. if '\\$1'PARENS' \{\
+. ds $EN_OPEN_BRACKET (
+. ds $EN_CLOSE_BRACKET )
+. \}
+. if '\\$1'(' \{\
+. ds $EN_OPEN_BRACKET (
+. ds $EN_CLOSE_BRACKET )
+. \}
+. if '\\$1'SQUARE' \{\
+. ds $EN_OPEN_BRACKET [
+. ds $EN_CLOSE_BRACKET ]
+. \}
+. if '\\$1'[' \{\
+. ds $EN_OPEN_BRACKET [
+. ds $EN_CLOSE_BRACKET ]
+. \}
+. if '\\$1'BRACES' \{\
+. ds $EN_OPEN_BRACKET {
+. ds $EN_CLOSE_BRACKET }
+. \}
+. if '\\$1'{' \{\
+. ds $EN_OPEN_BRACKET {
+. ds $EN_CLOSE_BRACKET }
+. \}
+.END
+\#
+\# ENDNOTE LINENUMBER GAP
+\# ----------------------
+\# *Argument:
+\# <space between line-number labels and endnotes text>
+\# *Function:
+\# Defines string $EN_LN_GAP, used during printing of line-number
+\# labels in ENDNOTE.
+\#
+.MAC ENDNOTE_LINENUMBER_GAP END
+. nr #EN_LN_GAP (u;\\$1)
+.END
+\#
+\# ENDNOTE NUMBERS ALIGNMENT
+\# -------------------------
+\# *Argument:
+\# LEFT | RIGHT <max. number of digit placeholders that will appear in endnotes>
+\# *Function:
+\# Creates registers for _LEFT or _RIGHT; creates register
+\# #EN_NUMBER_PLACEHOLDERS.
+\# *Notes:
+\# Default is for endnote numbers to be right aligned to 2 placeholders.
+\#
+.MAC ENDNOTE_NUMBERS_ALIGN END
+. if '\\$1'LEFT' \{\
+. rr #EN_NUMBERS_ALIGN_RIGHT
+. nr #EN_NUMBERS_ALIGN_LEFT 1
+. \}
+. if '\\$1'RIGHT' \{\
+. rr #EN_NUMBERS_ALIGN_LEFT
+. nr #EN_NUMBERS_ALIGN_RIGHT 1
+. \}
+. nr #EN_NUMBER_PLACEHOLDERS \\$2
+.END
+\#
+\# ENDNOTE PARAGRAPH INDENT
+\# ------------------------
+\# *Argument:
+\# <first line indent of paras subsequent to 1st in endnotes>
+\# *Function:
+\# Creates register #EN_PP_INDENT for use in .PP.
+\# *Notes:
+\# Requires a unit of measure.
+\#
+\# Default is 1.5m for TYPESET; same indent as PARA_INDENT for TYPEWRITE.
+\#
+.MAC ENDNOTE_PARA_INDENT END
+. nr #EN_PP_INDENT (\\$1)
+.END
+\#
+\# TURN OFF COLUMN MODE FOR ENDNOTES
+\# ---------------------------------
+\# *Argument:
+\# <none> | <anything>
+\# *Function:
+\# Creates or removes register #EN_NO_COLS
+\# *Notes:
+\# Allows user to tell mom not to set endnotes in columnar
+\# documents in columns. Default is to set endnotes in columns.
+\#
+.MAC ENDNOTES_NO_COLUMNS END
+. ie '\\$1'' .nr #EN_NO_COLS 1
+. el .rr #EN_NO_COLS
+.END
+\#
+\# NO FIRST PAGE NUMBER ON ENDNOTES FIRST PAGE
+\# -------------------------------------------
+\# *Argument:
+\# <none> | <anything>
+\# *Function:
+\# Creates or removes register #EN_NO_FIRST_PN
+\# *Notes:
+\# For use if FOOTERS are on. Tells ENDNOTES not to put a page
+\# number on the first endnotes page. Some users may want this.
+\# Default is to print a page number at the top of the first
+\# endnotes page when footers are on.
+\#
+.MAC ENDNOTES_NO_FIRST_PAGENUM END
+. ie '\\$1'' .nr #EN_NO_FIRST_PN 1
+. el .rr #EN_NO_FIRST_PN
+.END
+\#
+\# PAGE HEADERS ON ENDNOTES PAGES
+\# ------------------------------
+\# *Argument:
+\# <none> | ALL
+\# *Function:
+\# Creates or removes register #EN_ALLOWS_HEADERS or
+\# #EN_ALLOWS_HEADERS_ALL
+\# *Notes:
+\# Whether ENDNOTES puts a page header at the top of endnotes
+\# pages if page headers are used throughout the document.
+\# Default is to insert the page headers, but not on the first
+\# page. If the optional argument ALL is given, ENDNOTES puts a
+\# page header on the first page as well.
+\#
+.MAC ENDNOTES_ALLOWS_HEADERS END
+. ie '\\$1'' .nr #EN_ALLOWS_HEADERS 1
+. el \{\
+. ie '\\$1'ALL' \{\
+. nr #EN_ALLOWS_HEADERS 1
+. nr #EN_ALLOWS_HEADERS_ALL 1
+. \}
+. el \{\
+. nr #EN_ALLOWS_HEADERS 0
+. nr #EN_ALLOWS_HEADERS_ALL 0
+. \}
+. \}
+.END
+\#
+\# ENDNOTES PAGES PAGE NUMBERING STYLE
+\# -----------------------------------
+\# *Argument:
+\# DIGIT | ROMAN | roman | ALPHA | alpha
+\# *Function:
+\# Creates or modifies $EN_PN_STYLE.
+\# *Notes:
+\# Allows user to define what style should be used for endnotes
+\# pages page numbering. Arguments are the same as for
+\# PAGENUM_STYLE.
+\#
+\# Default is DIGIT.
+\#
+.MAC ENDNOTES_PAGENUM_STYLE END
+. ds $EN_PN_STYLE \\$1
+.END
+\#
+\# FIRST PAGE NUMBER FOR ENDNOTES
+\# ------------------------------
+\# *Argument:
+\# <page number that appears on page 1 of endnotes pages>
+\# *Function:
+\# Creates or modifies string $EN_FIRST_PN
+\# *Notes:
+\# To be used with caution, only if all endnotes
+\# are to be output at once, i.e. not at the end of the separate
+\# docs of a collated doc
+\#
+.MAC ENDNOTES_FIRST_PAGENUMBER END
+. nr #EN_FIRST_PN \\$1
+.END
+\#
+\# SINGLESPACE ENDNOTES
+\# --------------------
+\# *Argument:
+\# <none> | <anything>
+\# *Function:
+\# Sets lead of endnotes pages in TYPEWRITE to 12 points,
+\# adjusted.
+\# *Notes:
+\# Default is to double-space endnotes pages.
+\#
+.MAC SINGLESPACE_ENDNOTES END
+. if \\n[#PRINT_STYLE]=1 \{\
+. ie \\n[#SINGLE_SPACE] \{\
+. nr #EN_SINGLESPACE 1
+. rr #IGNORE
+. if \\n[#OK_PROCESS_LEAD] \{\
+. ENDNOTE_LEAD 12 ADJUST
+. nr #IGNORE 1
+. \}
+. \}
+. el \{\
+. ie '\\$1'' \{\
+. nr #EN_SINGLESPACE 1
+. rr #IGNORE
+. if \\n[#OK_PROCESS_LEAD] \{\
+. ENDNOTE_LEAD 12 ADJUST
+. nr #IGNORE 1
+. \}
+. \}
+. el \{\
+. rr #EN_SINGLESPACE
+. rr #IGNORE
+. if \\n[#OK_PROCESS_LEAD] \{\
+. ENDNOTE_LEAD 24 ADJUST
+. nr #IGNORE 1
+. \}
+. \}
+. \}
+. \}
+.END
+\#
+\# ENDNOTE PARAGRAPH SPACE
+\# -----------------------
+\# *Argument:
+\# toggle
+\# *Function:
+\# Creates toggle register #EN_PP_SPACE for use in .PP.
+\# *Notes:
+\# Like PARA_SPACE. Default is not to space endnote paras.
+\#
+.MAC ENDNOTE_PARA_SPACE END
+. ie '\\$1'' .nr #EN_PP_SPACE 1
+. el .rr #EN_PP_SPACE
+.END
+\#
+\# ENDNOTE
+\# -------
+\# *Argument:
+\# toggle
+\# *Function:
+\# Places superscript endnote number in text, then collects and
+\# processes endnote in diversion END_NOTES.
+\# *Notes:
+\# \c must be appended to the word immediately preceding .ENDNOTE
+\# when ENDNOTE_MARKER_STYLE is NUMBER.
+\#
+.MAC ENDNOTE END
+. ie '\\$1'' \{\
+. nr #ENDNOTE 1
+. ie !\\n[#EN_MARKER_STYLE]=2 \{\
+. if \\n[#CONDENSE] .nop \*[CONDX]\c
+. if \\n[#EXTEND] .nop \*[EXTX]\c
+. if \\n[#UNDERLINE_ON] \{\
+. nr #UNDERLINE_WAS_ON 1
+. UNDERLINE OFF
+. \}
+. if \\n[#PRINT_STYLE]=1 \{\
+. if \\n[#SLANT_ON] \{\
+. nr #SLANT_WAS_ON 1
+. nop \*[SLANTX]\c
+. \}
+.\" Vertical raise amount here is more than when the same string is printed in
+.\" the endnotes so bottom of number aligns with top of bowl.
+. PRINT \
+"\s-2\v'-\\n[#DOC_LEAD]u/5u'\\n+[#EN_NUMBER]\v'+\\n[#DOC_LEAD]u/5u'\s+2\c"
+. \}
+. if \\n[#PRINT_STYLE]=2 .PRINT \*[SUP]\\n+[#EN_NUMBER]\*[SUPX]\c
+. \}
+. el \{\
+. ie r#EN_NUMBER .nr #EN_NUMBER \\n[#EN_NUMBER]+1
+. el .nr #EN_NUMBER 1 1
+. if !\\n[#LINENUMBERS] \{\
+. tm1 "[mom]: Line numbering must be enabled with NUMBER_LINES when
+. tm1 " ENDNOTE_MARKER_STYLE is LINE.
+. ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. \}
+. if \\n[#EN_MARK]=0 .nr #EN_MARK \\n[ln]
+. nr #EN_MARK_2 \\n[ln]
+. if '\\n[.z]'P_QUOTE' \{\
+. nr #EN_MARK -1
+. nr #EN_MARK_2 -1
+. \}
+. \}
+. nr #PP_STYLE_PREV \\n[#PP_STYLE]
+. nr #PP_STYLE 1
+. if \\n[#INDENT_FIRST_PARAS] .nr #INDENT_FIRSTS 1
+. INDENT_FIRST_PARAS
+. ev EN
+. da END_NOTES
+. LL \\n[#DOC_L_LENGTH]u
+. ta \\n[.l]u
+. if \\n[#COLUMNS] \{\
+. ie \\n[#EN_NO_COLS] .LL \\n[#DOC_L_LENGTH]u
+. el .LL \\n[#COL_L_LENGTH]u
+. ta \\n[.l]u
+. \}
+\!. if \\\\n[.vpt]=0 .vpt
+\!. ne 3
+. vs \\n[#EN_LEAD]u
+.\" Print identifying doc title (e.g., Chapter n)
+. if \\n[#EN_NUMBER]=1 \{\
+. if \\n[#PRINT_STYLE]=1 .TYPEWRITER
+. if \\n[#PRINT_STYLE]=2 \{\
+. FAMILY \\*[$EN_TITLE_FAM]
+. FT \\*[$EN_TITLE_FT]
+. ps \\n[#EN_PS]u\\*[$EN_TITLE_SIZE_CHANGE]
+. if \\n[#EN_TITLE_COLOR] .COLOR \\*[$EN_TITLE_COLOR]
+. if \\n[#ENDNOTE_TITLE_SMALLCAPS] .SMALLCAPS
+. if \\n[#ENDNOTE_TITLE_CAPS] .CAPS
+. \}
+. ie \\n[#SINGLE_SPACE]=1 .sp 2
+. el .sp
+. if !'\\*[$EN_TITLE]'' \{\
+. substring $EN_TITLE_QUAD 0 0
+. if '\\*[$EN_TITLE_QUAD]'L' .LEFT
+. if '\\*[$EN_TITLE_QUAD]'C' .CENTER
+. if '\\*[$EN_TITLE_QUAD]'R' .RIGHT
+\!. vpt 0
+. sp -.25v
+. ie \\n[#EN_TITLE_UNDERLINE] \
+. UNDERSCORE "\\*[$EN_TITLE]"
+. el \{\
+. ie \\n[#PRINT_STYLE]=1 \
+. UNDERSCORE "\\*[$EN_TITLE]"
+. el .PRINT "\\*[$EN_TITLE]"
+. \}
+. sp .25v
+\!. vpt
+. \}
+. if \\n[#EN_TITLE_COLOR] .gcolor
+. if \\n[#ENDNOTE_TITLE_SMALLCAPS] .SMALLCAPS OFF
+. if \\n[#ENDNOTE_TITLE_CAPS] .CAPS OFF
+. \}
+.\" Get indent from endnotes point size; convert string to reg in
+.\" case indent string is, e.g., m or n
+. ps \\n[#EN_PS]u
+. nr #REF_EN_INDENT (u;\\*[$REF_EN_INDENT])
+. if \\n[#PRINT_STYLE]=1 \{\
+. TYPEWRITER
+. if \\n[#EN_NUMBER]=1 \{\
+. ie \\n[#SINGLE_SPACE]=1 .sp
+. el .sp .25
+. \}
+. if \\n[#EN_MARKER_STYLE]=3 .ps -2
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. if \\n[#EN_MARKER_STYLE]=1 \{\
+. FAMILY \\*[$EN_NUMBER_FAM]
+. FT \\*[$EN_NUMBER_FT]
+. ps \\n[#EN_PS]u\\*[$EN_NUMBER_SIZE_CHANGE]
+. \}
+. if \\n[#EN_MARKER_STYLE]=2 \{\
+. FAMILY \\*[$EN_LN_FAM]
+. FT \\*[$EN_LN_FT]
+. ps \\n[#EN_PS]u\\*[$EN_LN_SIZE_CHANGE]
+. \}
+. if \\n[#EN_MARKER_STYLE]=3 \{\
+. FAMILY \\*[$EN_NUMBER_FAM]
+. FT \\*[$EN_NUMBER_FT]
+. ps \\n[#PT_SIZE_IN_UNITS]u*6u/10u
+. \}
+. \}
+.\" Build string for line-numbered endnotes
+. if \\n[#EN_MARKER_STYLE]=2 \{\
+. ie \\n[#EN_LN_BRACKETS]=1 \{\
+. ds $EN_LINENUMBER \v'-.085m'\\*[$EN_OPEN_BRACKET]\v'.085m'
+. ie \\n[#EN_MARK_2]=\\n[#EN_MARK] .as $EN_LINENUMBER \
+\\n[#EN_MARK]\v'-.085m'\\*[$EN_CLOSE_BRACKET]\v'.085m'\"
+. el .as $EN_LINENUMBER \
+\\n[#EN_MARK]\v'-.1m'-\v'.1m'\\n[#EN_MARK_2]\v'-.085m'\
+\\*[$EN_CLOSE_BRACKET]\v'.085m'\"
+. \}
+. el \{\
+. ie \\n[#EN_MARK_2]=\\n[#EN_MARK] \
+. ds $EN_LINENUMBER \
+\\n[#EN_MARK]\\*[$EN_LN_SEP]
+. el \
+. ds $EN_LINENUMBER \
+\\n[#EN_MARK]\v'-.1m'-\v'.1m'\\n[#EN_MARK_2]\\*[$EN_LN_SEP]
+. \}
+. nr #EN_MARK 0
+. \}
+. vpt 0
+. ie \\n[#EN_NUMBERS_ALIGN_RIGHT] .RIGHT
+. el .LEFT
+. if \\n[#EN_MARKER_STYLE]=1 \
+. nr #EN_NUMBER_L_LENGTH \w'\0'*\\n[#EN_NUMBER_PLACEHOLDERS]+\w'.'
+. if \\n[#EN_MARKER_STYLE]=2 \{\
+. ie \\n[#EN_LN_BRACKETS]=1 .nr #EN_NUMBER_L_LENGTH \
+(\w'\0'*(\\n[#EN_NUMBER_PLACEHOLDERS]*2))+\w'-[]'
+. el .nr #EN_NUMBER_L_LENGTH \
+(\w'\0'*(\\n[#EN_NUMBER_PLACEHOLDERS]*2))+\w'-\\*[$EN_LN_SEP]'
+. RIGHT
+. \}
+. if \\n[#EN_MARKER_STYLE]=3 \{\
+. nr #EN_NUMBER_L_LENGTH \
+\w'\0'*\\n[#EN_NUMBER_PLACEHOLDERS]+.15m
+. RIGHT
+. \}
+. ie \\n[#REF]=1 \
+. ll \\n[#EN_NUMBER_L_LENGTH]u+\\n[#REF_EN_INDENT]u
+. el .ll \\n[#EN_NUMBER_L_LENGTH]u
+. if \\n[#EN_MARKER_STYLE]=1 \{\
+. if \\n[#REF]=1 .ti \\n[#REF_EN_INDENT]u
+. nop \En[#EN_NUMBER].
+. \}
+. if \\n[#EN_MARKER_STYLE]=2 \{\
+. nop \\*[$EN_LINENUMBER]
+. rm $EN_LINENUMBER
+. \}
+. if \\n[#EN_MARKER_STYLE]=3 \{\
+\!. vpt 0
+. ps \" Reset ps changed to get width of s-script numbers
+. ie \\n[#PRINT_STYLE]=1 \{\
+.\" Vertical raise amount here is less than when the same string is printed in
+.\" the body of the text because number precedes a cap.
+. nop \
+\s-2\v'-\\n[#DOC_LEAD]u/7u'\\n[#EN_NUMBER]\|\v'+\\n[#DOC_LEAD]u/7u'\s+2
+. \}
+. el .nop \E*[SUP]\\n[#EN_NUMBER]\E*[SUPX]\h'.15m'
+. \}
+. EOL
+. ll
+\!. vpt
+. nr #EN_FIGURE_SPACE \w'\0'
+. if \\n[#EN_MARKER_STYLE]=1 \{\
+. ie \\n[#REF]=1 .ti \
+\\n[#EN_NUMBER_L_LENGTH]u+\\n[#REF_EN_INDENT]u+\\n[#EN_FIGURE_SPACE]u
+. el .in \
+\\n[#EN_NUMBER_L_LENGTH]u+\\n[#EN_FIGURE_SPACE]u
+. \}
+. if \\n[#EN_MARKER_STYLE]=2 \{\
+. ie \\n[#REF]=1 .ti \
+\\n[#EN_NUMBER_L_LENGTH]u+\\n[#REF_EN_INDENT]u+\\n[#EN_LN_GAP]u
+. el .ti \
+\\n[#EN_NUMBER_L_LENGTH]u+\\n[#EN_LN_GAP]u
+. \}
+. if \\n[#EN_MARKER_STYLE]=3 \{\
+. ie \\n[#REF]=1 .ti \
+\\n[#EN_NUMBER_L_LENGTH]u+\\n[#REF_EN_INDENT]u+\w'\|'u
+. el .in \
+\\n[#EN_NUMBER_L_LENGTH]u
+. \}
+. nr #EN_TEXT_INDENT \\n[.i]
+. QUAD \\*[$EN_QUAD]
+. vpt
+. if \\n[#PRINT_STYLE]=1 .TYPEWRITER
+. if \\n[#PRINT_STYLE]=2 \{\
+. FAMILY \\*[$EN_FAM]
+. FT \\*[$EN_FT]
+. ps \\n[#EN_PS]u
+. \}
+. \}
+. el \{\
+\!. ie \\n[#EN_NUMBER]=\\\\n[#LAST_EN] .vpt 0
+\!. el .br
+. if \\n[#PRINT_STYLE]=2 .sp \\*[$EN_SPACE]
+. in 0
+. if \\n[#EN_MARKER_STYLE]=2 \{\
+\!. in 0
+. \}
+. da
+.\" Restore sentence spacing
+. if \\n[#PRINT_STYLE]=2 \{\
+. if d$RESTORE_SS_VAR .SS \\*[$RESTORE_SS_VAR]
+. rm $RESTORE_SS_VAR
+. \}
+. ev
+.\" Restore lead -- need
+. nr #PP_STYLE \\n[#PP_STYLE_PREV]
+. if !\\n[#INDENT_FIRSTS] .INDENT_FIRST_PARAS OFF
+. rr #INDENT_FIRSTS
+. rr #ENDNOTE
+. if \\n[#UNDERLINE_WAS_ON] \{\
+. rr #UNDERLINE_WAS_ON
+. UNDERLINE
+. \}
+. if \\n[#SLANT_WAS_ON] \{\
+. rr #SLANT_WAS_ON
+\*[SLANT]\c
+. \}
+. \}
+. if \\n[#NUM_ARGS]=2 \{\
+. if '\\$2'BREAK' .BR
+. if '\\$2'BR' .BR
+. \}
+.END
+\#
+\# Endnotes (user space macro)
+\# ---------------------------
+\#
+\# ENDNOTES
+\# --------
+\# *Arguments:
+\# none
+\# *Function:
+\# Sets new document leading from #EN_LEAD, breaks to a new page,
+\# sets up an endnotes page based on registers and strings associated
+\# with endnotes, then outputs diversion END_NOTES.
+\#
+.MAC ENDNOTES END
+. if \\n[defer] .NEWPAGE
+. nr #LAST_EN \\n[#EN_NUMBER]
+. nr #ENDNOTES 1
+. nr #EN_FIRST_PAGE 1
+. SETUP_ENDNOTES
+. if !\\n[#PRINT_STYLE]=1 .chop END_NOTES
+. nf
+. END_NOTES
+. rm END_NOTES
+. ps \\n[#DOC_PT_SIZE]u
+. if \\n[#PRINT_STYLE]=1 .vs \\n[#DOC_LEAD]u
+. if \\n[#PRINT_STYLE]=2 \{\
+. ie \\n[#ADJ_EN_LEAD] \
+. nr #DOC_LEAD \\n[#RESTORE_DOC_LEAD]
+. el .DOC_LEAD \\n[#RESTORE_DOC_LEAD]u
+. rr #RESTORE_DOC_LEAD
+. \}
+. if \\n[#COLUMNS_WERE_ON] .nr #COLUMNS 1
+. if \\n[#HEADER_STATE]=1 .HEADERS
+. if \\n[#LINENUMBERS]=2 \{\
+. NUMBER_LINES RESUME
+. nr #LINENUMBERS 1
+. \}
+. rr #ENDNOTES
+.END
+\#
+\# Macros common to endnotes, bibliography, and toc
+\# ------------------------------------------------
+\#
+.MAC SETUP_BIB_EN END
+. if '\\$0'SETUP_BIBLIOGRAPHY' .ds EN-OR-BIB BIB
+. if '\\$0'SETUP_ENDNOTES' .ds EN-OR-BIB EN
+. nr #HEADER_STATE \\n[#HEADERS_ON]
+. ds $RESTORE_PAGENUM_STYLE \\*[$PAGENUM_STYLE]
+. if \\n[#LINENUMBERS]=1 \{\
+. NUMBER_LINES OFF
+. nr #LINENUMBERS 2
+. \}
+. if \\n[#HEADERS_ON]=1 \
+. if !\\n[#\\*[EN-OR-BIB]_ALLOWS_HEADERS_ALL] .HEADERS OFF
+. if \\n[#HEADER_STATE]=1 \{\
+. ie \\n[#\\*[EN-OR-BIB]_HDRFTR_CENTER]=1 .
+. el .rm $HDRFTR_CENTER
+. \}
+. ie !\\n[#SUSPEND_PAGINATION] \{\
+. if \\n[#PAGINATE]=1 \{\
+. if \\n[#PAGE_NUM_V_POS]=1 \{\
+. PAGENUM_STYLE \\*[$\\*[EN-OR-BIB]_PN_STYLE]
+. if \\n[#\\*[EN-OR-BIB]_FIRST_PN] .PAGENUMBER \\n[#\\*[EN-OR-BIB]_FIRST_PN]-1
+. if r #\\*[EN-OR-BIB]_NO_FIRST_PN .nr #PAGINATE 0
+. \}
+. \}
+. \}
+. el \{\
+. ie \\n[#PAGE_NUM_V_POS]=2 .nr #PAGINATE 1
+. el .nr #PAGINATE 0
+. \}
+. if \\n[#FOOTERS_ON]=1 \{\
+. if !'\\*[$HDRFTR_CENTER_OLD]'' \
+. ds $HDRFTR_CENTER \\*[$HDRFTR_CENTER_OLD]
+. \}
+. NEWPAGE
+. if \\n[#FOOTERS_ON]=1 \{\
+. ds $HDRFTR_CENTER \\*[$HDRFTR_CENTER_NEW]
+. rm $HDRFTR_CENTER_OLD
+. rm $HDRFTR_CENTER_NEW
+. \}
+. ie !\\n[#SUSPEND_PAGINATION] \{\
+. if \\n[#PAGE_NUM_V_POS]=1 \{\
+. if r #\\*[EN-OR-BIB]_NO_FIRST_PN \
+. if \\n[#PAGINATION_STATE]=1 .nr #PAGINATE 1
+. \}
+. \}
+. el \
+. if \\n[#PAGE_NUM_V_POS]=2 .nr #PAGINATE 0
+. rr #PAGINATION_STATE
+. PAGENUM_STYLE \\*[$\\*[EN-OR-BIB]_PN_STYLE]
+. if \\n[#\\*[EN-OR-BIB]_FIRST_PN] .PAGENUMBER \\n[#\\*[EN-OR-BIB]_FIRST_PN]
+. if \\n[#HEADER_STATE]=1 \
+. if \\n[#\\*[EN-OR-BIB]_ALLOWS_HEADERS] .HEADERS
+.\" Collect endnotes title string for TOC
+. nr #TOC_ENTRY_PN \\n%+\\n[#PAGE_NUM_ADJ]
+. af #TOC_ENTRY_PN \\g[#PAGENUMBER]
+. ds $TOC_TITLE_ITEM \\*[$\\*[EN-OR-BIB]_STRING]\|
+. PDF_BOOKMARK 1 \\*[$\\*[EN-OR-BIB]_STRING]
+. TITLE_TO_TOC
+.\" End collection of endnotes title string for TOC
+.\" Process endnotes
+. if \\n[#PRINT_STYLE]=1 .vs \\n[#\\*[EN-OR-BIB]_LEAD]u
+. if \\n[#PRINT_STYLE]=2 \{\
+. if \\n[#\\*[EN-OR-BIB]_NO_COLS] \{\
+. if \\n[#COLUMNS] .nr #COLUMNS_WERE_ON 1
+. nr #COLUMNS 0
+. \}
+. nr #RESTORE_DOC_LEAD \\n[#DOC_LEAD]
+. ie \\n[#ADJ_\\*[EN-OR-BIB]_LEAD] .nr #DOC_LEAD \\n[#\\*[EN-OR-BIB]_LEAD]
+. el .DOC_LEAD \\n[#\\*[EN-OR-BIB]_LEAD]u
+. \}
+. vpt 0
+. RESTORE_SPACE
+. ie r#\\*[EN-OR-BIB]_STRING_V_POS .sp |\\n[#\\*[EN-OR-BIB]_STRING_V_POS]u-1v
+. el .sp |\\n[#T_MARGIN]u-\\n[#\\*[EN-OR-BIB]_LEAD]u
+. vpt
+. mk ec
+. if \\n[#SLANT_ON] \{\
+\*[SLANTX]\c
+. \}
+. sp
+. if !'\\*[$\\*[EN-OR-BIB]_STRING]'' \{\
+. if \\n[#PRINT_STYLE]=1 \{\
+. TYPEWRITER
+. vs \\n[#\\*[EN-OR-BIB]_LEAD]u
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. LL \\n[#DOC_L_LENGTH]u
+. ta \\n[.l]u
+. if \\n[#COLUMNS] \{\
+. ie \\n[#\\*[EN-OR-BIB]_NO_COLS] .LL \\n[#DOC_L_LENGTH]u
+. el .LL \\n[#COL_L_LENGTH]u
+. ta \\n[.l]u
+. \}
+. FAMILY \\*[$\\*[EN-OR-BIB]_STRING_FAM]
+. FT \\*[$\\*[EN-OR-BIB]_STRING_FT]
+. ps \\n[#\\*[EN-OR-BIB]_PS]u\\*[$\\*[EN-OR-BIB]_STRING_SIZE_CHANGE]
+. vs \\n[#\\*[EN-OR-BIB]_LEAD]u
+. \}
+. substring $\\*[EN-OR-BIB]_STRING_QUAD 0 0
+. if '\\*[$\\*[EN-OR-BIB]_STRING_QUAD]'L' .LEFT
+. if '\\*[$\\*[EN-OR-BIB]_STRING_QUAD]'C' .CENTER
+. if '\\*[$\\*[EN-OR-BIB]_STRING_QUAD]'R' .RIGHT
+. EOL
+. if \\n[#\\*[EN-OR-BIB]_STRING_COLOR]=1 .COLOR \\*[$\\*[EN-OR-BIB]_STRING_COLOR]
+. if \\n[#\\*[EN-OR-BIB]_STRING_CAPS] .CAPS
+. if \\n[#\\*[EN-OR-BIB]_STRING_SMALLCAPS] .SMALLCAPS
+. ie \\n[#\\*[EN-OR-BIB]_STRING_UNDERLINE] \{\
+. if \\n[#PRINT_STYLE]=2 .ds $TITLE_TYPE \\*[EN-OR-BIB]_STRING
+. ie \\n[#PRINT_STYLE]=1 \
+. UNDERSCORE2 3p 2p "\\*[$\\*[EN-OR-BIB]_STRING]"
+. el \{\
+. ie \\n[#\\*[EN-OR-BIB]_STRING_UNDERLINE]=2 \
+. UNDERSCORE2 \\*[$\\*[EN-OR-BIB]_UNDERLINE_GAP] \\*[$\\*[EN-OR-BIB]_RULE_GAP] "\\*[$\\*[EN-OR-BIB]_STRING]"
+. el .UNDERSCORE "\\*[$\\*[EN-OR-BIB]_STRING]"
+. \}
+. \}
+. el .PRINT "\\*[$\\*[EN-OR-BIB]_STRING]
+. \}
+. SMALLCAPS OFF
+. if \\n[#\\*[EN-OR-BIB]_STRING_COLOR]=1 .gcolor
+. CAPS OFF
+. FAMILY \\*[$\\*[EN-OR-BIB]_FAMILY]
+. FT \\*[$\\*[EN-OR-BIB]_FT]
+. ps -\\*[$\\*[EN-OR-BIB]_STRING_SIZE_CHANGE]
+. ie \\n[#PRINT_STYLE]=1 \{\
+. ie \\n[#SINGLE_SPACE]=1 .sp
+. el \{\
+. ie \\n[#\\*[EN-OR-BIB]_SINGLESPACE]=1 .sp
+. el .
+. \}
+. \}
+. el \{\
+. ie '\\*[EN-OR-BIB]'BIB' .sp 2
+. el .sp
+. \}
+. SHIM
+. QUAD \\*[$\\*[EN-OR-BIB]_QUAD]
+.END
+.
+.ALIAS SETUP_BIBLIOGRAPHY SETUP_BIB_EN
+.ALIAS SETUP_ENDNOTES SETUP_BIB_EN
+\#
+\# ENDNOTES, BIBLIOGRAPHY and TOC LEADING
+\# --------------------------------------
+\# *Argument:
+\# <leading> [ ADJUST ]
+\# *Function:
+\# Depending on the name by which it's called, creates or modifies
+\# register #<type>_LEAD, where <type> is BIB, EN, or TOC. Creates or removes
+\# register #ADJ_<type>_LEAD. Stores arguments in strings if BIB,
+\# EN, or TOC leading are set before START.
+\# *Notes:
+\# Default is same as doc lead for TYPESET, adjusted; 24 for TYPEWRITE.
+\#
+.MAC _LEAD END
+. if '\\$0'BIBLIOGRAPHY_LEAD' .ds $SECTION BIB
+. if '\\$0'ENDNOTE_LEAD' .ds $SECTION EN
+. if '\\$0'TOC_LEAD' .ds $SECTION TOC
+. rr #ADJ_\\*[$SECTION]_LEAD
+. ds $\\*[$SECTION]_LEAD \\$1
+. rm $ADJUST_\\*[$SECTION]_LEAD
+. if '\\$2'ADJUST' \{\
+. nr #ADJ_\\*[$SECTION]_LEAD 1
+. ds $ADJUST_\\*[$SECTION]_LEAD ADJUST
+. \}
+. if !\\n[#OK_PROCESS_LEAD] .return
+. nr #\\*[$SECTION]_LEAD (p;\\$1)
+.END
+.
+.ALIAS BIBLIOGRAPHY_LEAD _LEAD
+.ALIAS ENDNOTE_LEAD _LEAD
+.ALIAS TOC_LEAD _LEAD
+\#
+\# ====================================================================
+\#
+\# +++BIBLIOGRAPHY+++
+\#
+\# Mom treats bibliographies and endnotes very similarly. The chief
+\# difference is that endnotes are collected and formatted inside a
+\# diversion, while bibliographies are built "by hand." ENDNOTES sets
+\# up the endnotes page and outputs the formatted diversion.
+\# BIBLIOGRAPHY sets up the bibliography page, then awaits refer
+\# commands.
+\#
+\# All of the bibliography control macros have their exact
+\# counterparts in the endnotes control macros. See, therefore,
+\# Arguments, Functions, and Notes in the Endnotes section.
+\#
+\# Bibliography control macros
+\#
+.MAC BIBLIOGRAPHY_PT_SIZE END
+. nr #BIB_PS (p;\\$1)
+.END
+\#
+.MAC BIBLIOGRAPHY_HDRFTR_CENTER END
+. ie '\\$1'' .nr #BIB_HDRFTR_CENTER 1
+. el .rr #BIB_HDRFTR_CENTER
+.END
+\#
+.MAC BIBLIOGRAPHY_STRING END
+. ds $BIB_STRING \\$1
+.END
+\#
+.MAC BIBLIOGRAPHY_STRING_ADVANCE END
+. nr #BIB_STRING_V_POS (u;\\$1)
+.END
+\#
+.MAC BIBLIOGRAPHY_STRING_V_POS END
+. nr #BIB_STRING_V_POS (u;\\$1)
+.END
+.
+.ALIAS BIBLIOGRAPHY_HEADER_V_POS BIBLIOGRAPHY_STRING_V_POS
+\#
+.MAC BIBLIOGRAPHY_NO_COLUMNS END
+. ie '\\$1'' .nr #BIB_NO_COLS 1
+. el .rr #BIB_NO_COLS
+.END
+\#
+.MAC BIBLIOGRAPHY_NO_FIRST_PAGENUM END
+. ie '\\$1'' .nr #BIB_NO_FIRST_PN 1
+. el .rr #BIB_NO_FIRST_PN
+.END
+\#
+.MAC BIBLIOGRAPHY_ALLOWS_HEADERS END
+. ie '\\$1'' .nr #BIB_ALLOWS_HEADERS 1
+. el \{\
+. ie '\\$1'ALL' \{\
+. nr #BIB_ALLOWS_HEADERS 1
+. nr #BIB_ALLOWS_HEADERS_ALL 1
+. \}
+. el \{\
+. rr #BIB_ALLOWS_HEADERS
+. rr #BIB_ALLOWS_HEADERS_ALL
+. \}
+. \}
+.END
+\#
+.MAC BIBLIOGRAPHY_PAGENUM_STYLE END
+. ds $BIB_PN_STYLE \\$1
+.END
+\#
+.MAC BIBLIOGRAPHY_FIRST_PAGENUMBER END
+. nr #BIB_FIRST_PN \\$1
+.END
+\#
+.MAC SINGLESPACE_BIBLIOGRAPHY END
+. if \\n[#PRINT_STYLE]=1 \{\
+. ie \\n[#SINGLE_SPACE] \{\
+. nr #BIB_SINGLESPACE 1
+. rr #IGNORE
+. if \\n[#OK_PROCESS_LEAD] \{\
+. BIBLIOGRAPHY_LEAD 12 ADJUST
+. nr #IGNORE 1
+. \}
+. \}
+. el \{\
+. ie '\\$1'' \{\
+. nr #BIB_SINGLESPACE 1
+. rr #IGNORE
+. if \\n[#OK_PROCESS_LEAD] \{\
+. BIBLIOGRAPHY_LEAD 12 ADJUST
+. nr #IGNORE 1
+. \}
+. \}
+. el \{\
+. rr #BIB_SINGLESPACE
+. rr #IGNORE
+. if \\n[#OK_PROCESS_LEAD] \{\
+. BIBLIOGRAPHY_LEAD 24 ADJUST
+. nr #IGNORE 1
+. \}
+. \}
+. \}
+. \}
+.END
+\#
+\# Style for outputting collected bibliographic references
+\# -------------------------------------------------------
+\# *Argument:
+\# LIST | PLAIN [ <list separator> ] [ <list prefix> ]
+\# *Function:
+\# Sets #BIB_LIST to 1 for numbered list style, 0 for plain output
+\# *Notes:
+\# Technically, user is supposed to enter PLAIN if s/he wants an
+\# unnumbered bibliography, but the el clause says "any arg but
+\# LIST means unnumbered." Effectively, any arg but LIST produces
+\# a "plain" bibliographic list.
+\#
+\# The 2nd and 3rd args have the same options as the 2nd and 3rd
+\# args to LIST.
+\#
+.MAC BIBLIOGRAPHY_TYPE END
+. ie '\\$1'LIST' \{\
+. nr #BIB_LIST 1
+. ie '\\$2'' \
+. if '\\*[$BIB_LIST_SEPARATOR]'' .ds $BIB_LIST_SEPARATOR .
+. el .ds $BIB_LIST_SEPARATOR \\$2
+. ie '\\$3'' .ds $BIB_LIST_PREFIX
+. el .ds $BIB_LIST_PREFIX \\$3
+. \}
+. el .nr #BIB_LIST 0
+.END
+\#
+\# Spacing between items in bibliographies
+\# ---------------------------------------
+\# *Argument:
+\# <amount of space>
+\# *Function:
+\# Gets value for $BIB_SPACE.
+\# *Notes:
+\# Requires a unit of measure.
+\#
+.MAC BIBLIOGRAPHY_SPACING END
+. ds $BIB_SPACE \\$1
+.END
+\#
+\# Bibliography (user space macro)
+\# -------------------------------
+\# *Function:
+\# Sets up a new page, with title, ready to accept the output
+\# of refer's $LIST$ or .R1 bibliography .R2
+\# *Notes:
+\# Bibliography pages are set up almost identically to endnotes pages.
+\#
+.MAC BIBLIOGRAPHY END
+. if \\n[defer] .NEWPAGE
+. ie '\\$1'' \{\
+. rr #FN_REF
+. rr #EN_REF
+. nr #BIBLIOGRAPHY 1
+. nr #BIB_FIRST_PAGE 1
+\#. nr #SKIP_FOOTER +1
+. SETUP_BIBLIOGRAPHY
+\#. nr #SKIP_FOOTER -1
+. if \\n[#PRINT_STYLE]=1 \{\
+. ie \\n[#SINGLE_SPACE]=1 .vs \\n[#BIB_LEAD]u
+. el \{\
+. ie \\n[#BIB_SINGLESPACE]=1 .vs \\n[#BIB_LEAD]u
+. el .vs \\n[#BIB_LEAD]u
+. \}
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. ie \\n[#ADJ_BIB_LEAD] \
+. nr #DOC_LEAD \\n[#RESTORE_DOC_LEAD]
+. el .DOC_LEAD \\n[#RESTORE_DOC_LEAD]u
+. rr #RESTORE_DOC_LEAD
+. \}
+. if \\n[#COLUMNS_WERE_ON] .nr #COLUMNS 1
+. if \\n[#HEADER_STATE]=1 .HEADERS
+. if \\n[#LINENUMBERS]=2 \{\
+. NUMBER_LINES RESUME
+. nr #LINENUMBERS 1
+. \}
+. di BIB
+. \}
+. el \{\
+. br
+. di
+.\" Part of workaround for refer spitting out a blank page if the
+.\" last ref falls on the bottom line.
+. nr num*refs \\n[ref*num*first-pass]
+. nf
+. chop BIB
+. BIB
+. \}
+. rr #BIBLIOGRAPHY
+.END
+\#
+\# ====================================================================
+\#
+\# +++TABLE OF CONTENTS+++
+\#
+\# Strings to allocate space for leaders and entry page numbers
+\#
+.ds $TOC_PN \\*[ST102]\F[\\*[$TOC_PN_FAM]]\f[\\*[$TOC_PN_FT]]\
+\s[\\n[#TOC_PS]u]^\\*[ST102X]\\*[ST103]\s[\\*[$TOC_PN_SIZE_CHANGE]]\
+\h'.2n'\h'\w'0'u*\\n[#TOC_PN_PADDING]u'\\*[ST103X]
+\#
+.ds $TOC_PN_TYPEWRITE \\*[ST102]^\\*[ST102X]\\*[ST103]\
+\h'\w'0'u*\\n[#TOC_PN_PADDING]u'\\*[ST103X]
+\#
+\# Macro to remove titles from the TOC.
+\# Primarily to remove the copyright page from the TOC.
+\#
+.MAC NO_TOC_ENTRY END
+. nr #NO_TOC_ENTRY 1
+.END
+\#
+\# USER-INSERTED HEADING IN TOC
+\# ----------------------------
+\# *Arguments:
+\# <text>
+\# *Function:
+\# Inserts a single line of non-pagenumbered text into the TOC.
+\#
+.MAC TOC_HEADING END
+. ds $TOC_HEADING \\$1
+.END
+\#
+\# TOC collector
+\#
+.MAC TO_TOC END
+. if !'\\n[.ev]'TOC_EV' .ev TOC_EV
+. nr #TOC_CH_NUM_INDENT \w'\\*[$TOC_CH_NUM]'
+. da TOC_ENTRIES
+\!. ie \\\\n[#SKIP_ENTRY]=1 \{\
+. rr #SKIP_ENTRY
+\!. \}
+\!. el \{\
+. TQ
+. ie \\n[#PRINT_STYLE]=1 \{\
+\!. fam \\*[$TYPEWRITER_FAM]
+\!. ft R
+\!. ps \\*[$TYPEWRITER_PS]
+. ds _TYPEWRITE _TYPEWRITE
+. \}
+. el \{\
+. ie '\\$0'HD_TO_TOC' \{\
+\!. ps \\n[#TOC_PS]u\\*[$TOC_HEAD_\\n[#LEVEL]_SIZE]
+. \}
+. el \{\
+\!. FAMILY \\*[$TOC_TITLE_FAM]
+\!. FT \\*[$TOC_TITLE_FT]
+\!. ps \\n[#TOC_PS]u\\*[$TOC_TITLE_SIZE]
+. \}
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. rm _TYPEWRITE
+. if \\n[#SPACE_TOC_ITEMS] \{\
+. if \\n[#POST_TOP]=1 \{\
+. ie !\\n[#LEVEL]=\\n[#LAST_LEVEL] \{\
+. ie \\n[#LEVEL]>\\n[#LAST_LEVEL] \!.sp .2v
+. el \!.sp .4v
+. \}
+. el \{\
+. if \\n[#COLLATED_DOC] \
+. if '\\$0'TITLE_TO_TOC' \!.sp .4v
+. \}
+. \}
+. \}
+. \}
+\!. vpt 0
+\!. PAD_MARKER ^
+. if !'\\$0'HD_TO_TOC' \{\
+\!. if \\n[#TOC_TITLE_CAPS]=1 .CAPS
+. \}
+. if '\\$0'HD_TO_TOC' \{\
+. nr #POST_TOP 1
+\!. if \\n[#TOC_HEAD_\\n[#LEVEL]_CAPS]=1 .CAPS
+. \}
+. ie '\\$0'HD_TO_TOC' \{\
+. if \\n[#PRINT_STYLE]=1 \{\
+. ds $TOC_HEAD_\\n[#LEVEL]_FAM] \\*[$TYPEWRITER_FAM]
+. ds $TOC_HEAD_\\n[#LEVEL]_FT] R
+. \}
+\!. PAD \
+"\f[\\*[$TOC_HEAD_\\n[#LEVEL]_FAM]\
+\\*[$TOC_HEAD_\\n[#LEVEL]_FT]]\
+\h'\\\\n[#TOC_INDENT_ADJ]u'\h'\\n[#TOC_HEAD_\\n[#LEVEL]_INDENT]u'\
+\\*[$TOC_HD_NUM]\\*[$TOC_HEAD_\\n[#LEVEL]_ITEM]\\*[$TOC_PN\\*[_TYPEWRITE]]" \
+"\\*[PDFBOOKMARK.NAME]"
+. \}
+. el \{\
+. ie '\\$0'HEADING_TO_TOC' \{\
+. if \\n[#PRINT_STYLE]=1 \{\
+. ds $TOC_TITLE_FAM \\*[$TYPEWRITER_FAM]
+. ds $TOC_TITLE_FT R
+. \}
+. if !'\\*[$TOC_HEADING_QUAD]'' \{\
+. substring $TOC_HEADING_QUAD 0 0
+. if '\\*[$TOC_HEADING_QUAD]'L' \!.LEFT
+. if '\\*[$TOC_HEADING_QUAD]'C' \!.CENTER
+. if '\\*[$TOC_HEADING_QUAD]'R' \!.RIGHT
+. \}
+\!. vpt
+\!. ne \\*[$SPACE_ABOVE]+\\*[$SPACE_BENEATH]+2v
+\!. vpt 0
+. if \\n[#PRINT_STYLE]=2 \
+. if \\n[#POST_TOP] \!.sp \\*[$SPACE_ABOVE]
+. ie \\n[#PRINT_STYLE]=1 \!.nop \\*[$TOC_HEADING]
+. el \{\
+\!. nop \
+\f[\\*[$TOC_HEADING_FAM]\\*[$TOC_HEADING_FT]]\
+\s[\\*[$TOC_HEADING_SIZE]]\
+\m[\\*[$TOC_HEADING_COLOR]]\
+\\*[$TOC_HEADING]\
+\m[]\s[0]\f[P]
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. ie \\n[#SPACE_TOC_ITEMS] \
+. if \\n[#POST_TOP]=0 \!.sp \\*[$SPACE_BENEATH]
+. el \!.sp \\*[$SPACE_BENEATH]
+. \}
+\!. vpt
+. da
+. ev
+. return
+. \}
+. el \{\
+\!. PAD \
+"\f[\\*[$TOC_TITLE_FAM]\\*[$TOC_TITLE_FT]]\
+\h'\\n[#TOC_TITLE_INDENT]u'\\*[$TOC_TITLE_ITEM]\\*[$TOC_PN\\*[_TYPEWRITE]]" \
+"\\*[PDFBOOKMARK.NAME]"
+. \}
+. \}
+. ie '\\$0'HD_TO_TOC' \
+\!. if \\n[#TOC_HEAD_\\n[#LEVEL]_CAPS]=1 .CAPS OFF
+. el \
+\!. if \\n[#TOC_TITLE_CAPS]=1 .CAPS OFF
+\!. PAD_MARKER #
+\!. EOL
+\!. ST 102 L
+\!. ST 103 R QUAD
+. if \\n[#PRINT_STYLE]=2 \{\
+\!. FAMILY \\*[$TOC_PN_FAM]
+\!. FT \\*[$TOC_PN_FT]
+\!. ps \\n[#TOC_PS]u
+. \}
+\!. TAB 102
+\!. PRINT \fR\\*[LEADER]\f[]
+\!. TN
+. if \\n[#PRINT_STYLE]=2 \{\
+\!. ps \\*[$TOC_PN_SIZE_CHANGE]
+. \}
+\!. PRINT \\n[#TOC_ENTRY_PN]
+\!. \}
+. da
+. ev
+.END
+.
+.ALIAS HD_TO_TOC TO_TOC
+.ALIAS TITLE_TO_TOC TO_TOC
+.ALIAS HEADING_TO_TOC TO_TOC
+\#
+\# Control macros for toc
+\# ----------------------
+\#
+\# TOC TITLE STYLE
+\# ---------------
+\# *Arguments:
+\# FAMILY <family>
+\# FONT <font>
+\# SIZE <+|-n>
+\# COLOR <color>
+\# CAPS
+\# INDENT
+\# *Function:
+\# Assigns complete style parameters to TITLEs (doc titles,
+\# chapter titles, etc) in the TOC.
+\# *Notes:
+\# TITLEs are not headings, therefore they require their own style
+\# macro. Otherwise, the same as TOC_ENTRY_STYLE.
+\#
+.MAC TOC_TITLE_STYLE END
+. nr #ARG_NUM 0 1
+. nr #ATTRIB \\n[#NUM_ARGS]
+. while \\n+[#ARG_NUM]<=\\n[#ATTRIB] \{\
+. if '\\$1'FAMILY' \{\
+. shift
+. ds $TOC_TITLE_FAM \\$1
+. shift
+. \}
+. if '\\$1'FONT' \{\
+. shift
+. ds $TOC_TITLE_FT \\$1
+. shift
+. \}
+. if '\\$1'SIZE' \{\
+. shift
+. ds $TOC_TITLE_SIZE \\$1
+. shift
+. \}
+. if '\\$1'CAPS' \{\
+. nr #TOC_TITLE_CAPS 1
+. shift
+. \}
+. if '\\$1'NO_CAPS' \{\
+. rr #TOC_TITLE_CAPS
+. shift
+. \}
+. if '\\$1'SMALLCAPS' \{\
+. nr #TOC_TITLE_SMALLCAPS 1
+. shift
+. \}
+. if '\\$1'NO_SMALLCAPS' \{\
+. rr #TOC_TITLE_SMALLCAPS
+. shift
+. \}
+. if '\\$1'INDENT' \{\
+. shift
+. nr #TOC_TITLE_INDENT \\$1
+. shift
+. \}
+. \}
+.END
+\#
+\# TOC HEADER STRING
+\# -----------------
+\# *Argument:
+\# <string for "doc header" of first toc page>
+\# *Function:
+\# Creates or modifies string $TOC_HEADER_STRING
+\# *Notes:
+\# Default is "Contents".
+\#
+.MAC TOC_HEADER_STRING END
+. ds $TOC_HEADER_STRING \\$1
+.END
+\#
+\# TOC HEADER CAPS and SMALLCAPS
+\# -----------------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Turns capitalization or smallcaps style of the toc title string
+\# on or off.
+\# *Notes:
+\# Users may want the toc title string to be in
+\# caps, but the page header to be in lower case. If the
+\# argument to TOC_HEADER_STRING is in lower case and
+\# TOC_HEADER_CAPS is turned on, this is exactly what will
+\# happen. Ditto for SMALLCAPS.
+\#
+.MAC TOC_HEADER_CAPS END
+. ie '\\$1'' .nr #TOC_STRING_CAPS 1
+. el .nr #TOC_STRING_CAPS 0
+.END
+.
+.MAC TOC_HEADER_SMALLCAPS END
+. ie '\\$1'' .nr #TOC_STRING_SMALLCAPS 1
+. el .nr #TOC_STRING_SMALLCAPS 0
+.END
+.
+\#
+\# TOC VERTICAL PLACEMENT
+\# ----------------------
+\# *Argument:
+\# <distance from page top>
+\# *Function:
+\# Creates register #TOC_HEADER_V_POS.
+\# *Notes:
+\# Default is same as normal docheader position.
+\#
+.MAC TOC_HEADER_V_POS END
+. nr #TOC_HEADER_V_POS (u;\\$1)
+.END
+\#
+\#
+\# TOC POINT SIZE
+\# --------------
+\# *Argument:
+\# <base point size for toc pages>
+\# *Function:
+\# Creates or modifies register #TOC_PS.
+\# *Notes:
+\# This size control macro differs from other size control macros
+\# in that it sets an absolute point size, not a relative one.
+\# See notes for ENDNOTE_PT_SIZE for explanation.
+\#
+\# No unit of measure required (points assumed). Default is 12.5
+\# for TYPESET.
+\#
+.MAC TOC_PT_SIZE END
+. nr #TOC_PS (p;\\$1)
+.END
+\#
+\# TOC ENTRIES PAGE NUMBERS PADDING
+\# --------------------------------
+\# *Argument:
+\# <number of placeholders for toc entries page numbers>
+\# *Function:
+\# Creates or modifies register #TOC_PN_PADDING.
+\# *Notes:
+\# "Placeholders" is the maximum number of digits in a page
+\# number numeral.
+\#
+\# Default is 3.
+\#
+.MAC TOC_PADDING END
+. nr #TOC_PN_PADDING \\$1
+.END
+\#
+\# PAGINATE TOC
+\# ------------
+\# *Argument:
+\# <none> | <anything>
+\# *Function:
+\# Creates or removes register #PAGINATE_TOC.
+\# *Notes:
+\# Default is to paginate toc.
+\#
+.MAC PAGINATE_TOC END
+. ie '\\$1'' .nr #PAGINATE_TOC 1
+. el .nr #PAGINATE_TOC 0
+.END
+\#
+.MAC TOC_FIRST_PAGENUM END
+. nr #TOC_START_PAGENUM \\$1
+.END
+\#
+\# TOC PAGES PAGE-NUMBERING STYLE
+\# ------------------------------
+\# *Argument:
+\# DIGIT | ROMAN | roman | ALPHA | alpha
+\# *Function:
+\# Creates or modifies string $TOC_PN_STYLE
+\# *Notes:
+\# Page numbering style for page numbers that appear in the
+\# headers/footers of toc pages. See notes for PAGENUM_STYLE.
+\#
+\# Default is roman.
+\#
+.MAC TOC_PAGENUM_STYLE END
+. ds $TOC_PN_STYLE \\$1
+.END
+\#
+\# TOC RECTO_VERSO SWITCH
+\# ----------------------
+\# *Argument:
+\# <none> | <anything>
+\# *Function:
+\# Creates or removes register #TOC_RV_SWITCH
+\# *Notes:
+\# Allows switching of L/R margins if a doc is recto/verso and
+\# the first toc page happens to fall the wrong way
+\#
+.MAC TOC_RV_SWITCH END
+. ie '\\$1'' .nr #TOC_RV_SWITCH 1
+. el .rr #TOC_RV_SWITCH
+.END
+\#
+\# TOC ENTRY SPACING
+\# -----------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Toggles whether a small amount of space is inserted between TOC
+\# entries for greater legibility.
+\#
+.MAC SPACE_TOC_ITEMS END
+. ie !'\\$1'' .rr #SPACE_TOC_ITEMS
+. el .nr #SPACE_TOC_ITEMS 1
+.END
+\#
+\# NUMBERING OF TOC CHAPTER/SECTION ENTRIES
+\# ----------------------------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Determines whether chapter numbers are prefixed to title
+\# entries in the TOC (title here means chapter/chapter-title
+\# or, if the doctype is DEFAULT or NAMED, the section title.
+\# *Notes:
+\# Aliased as TOC_PREFIX_SECTION_NUMBER.
+\#
+.MAC TOC_PREFIX_CHAPTER_NUMBER END
+. ie '\\$1'' .nr #TOC_PREFIX_CH_NUM 1
+. el .rr #TOC_PREFIX_CH_NUM
+.END
+.
+.ALIAS TOC_PREFIX_SECTION_NUMBER TOC_PREFIX_CHAPTER_NUMBER
+\#
+\# PADDING OF TOC CHAPTER/SECTION NUMBERS
+\# --------------------------------------
+\# *Arguments:
+\# <amount of padding> | <anything>
+\# *Function:
+\# Insert figure spaces before toc chapter numbers so they
+\# right align.
+\# *Notes:
+\# Aliased as PAD_TOC_SECTION_NUMBERS.
+\#
+.MAC PAD_TOC_CHAPTER_NUMBERS END
+. ie !'\\$1'' .nr #PAD_TOC_CH_NUM \\$1
+. el .rr #PAD_TOC_CH_NUM
+.END
+.
+.ALIAS PAD_TOC_SECTION_NUMBERS PAD_TOC_CHAPTER_NUMBERS
+\#
+\# NUMBERING OF TOC HEAD ENTRIES
+\# -----------------------------
+\# *Arguments:
+\# FULL | TRUNCATE | NONE
+\# *Function:
+\# Determines how, or whether, to prepend heading numbers to TOC
+\# entries.
+\# *Notes:
+\# FULL means the complete numbering string (default).
+\#
+\# TRUNCATE means prepend a single digit sufficient to identify
+\# an entry's place in the numbering scheme with reference to the
+\# level above it. Thus, if a HEADING 1 is the second HEADING 1
+\# and therefore numbered "2.", a HEADING 2 beneath it (in the TOC)
+\# will have only "1." prepended to the entry; TOC indenting makes it
+\# evident under which level the HEADING 2 belongs.
+\#
+\# Note that TRUNCATE also removes chapter numbers, if
+\# PREFIX_CHAPTER_NUMBER is on.
+\#
+.MAC TOC_ENTRY_NUMBERS END
+. if '\\$1'TRUNCATE' .nr #TRUNC_TOC_HD_NUM 1
+. if '\\$1'FULL' .nr #TRUNC_TOC_HD_NUM 0
+. if '\\$1'NONE' .nr #TOC_NO_HD_NUM 1
+.END
+\#
+\# User defined TITLE entry string
+\#
+.MAC TOC_TITLE_ENTRY END
+. nr #USER_SET_TITLE_ITEM 1
+. ds $USER_SET_TITLE_ITEM \\$1
+.END
+\#
+\# APPEND AUTHOR(S) TO TOC DOC TITLE ENTRIES
+\# -----------------------------------------
+\# *Argument:
+\# <none> | <name(s) of author(s) as they should appear in toc doc title entries>
+\# *Function:
+\# Creates register #TOC_AUTHORS (to tell TOC to append authors
+\# to toc doc title entries). Optionally creates string
+\# $TOC_AUTHORS.
+\# *Notes:
+\# Normally, TOC does not append the author(s) to a toc doc title
+\# entry. This special macro instructs TOC to do so.
+\#
+\# If user has multiple authors for each doc when collating,
+\# TOC_APPENDS_AUTHOR "<string>" must be inserted somewhere between
+\# COLLATE and START in each doc. Otherwise, mom prints only the
+\# first author given to AUTHOR.
+\#
+.MAC TOC_APPENDS_AUTHOR END
+. nr #TOC_AUTHORS 1
+. if !'\\$1'' .ds $TOC_AUTHORS \\$1
+.END
+\#
+\# TABLE OF CONTENTS PAGE SETUP
+\# ----------------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Some changes to the TOC layout (e.g. margins and page headers)
+\# are not covered by the TOC and endnotes control macros. This
+\# macro permits access to any and all page setup macros not so
+\# covered.
+\# *Notes
+\# Wraps a diversion that ends when the macro is invoked with an
+\# argument. The contained formatting macros must be preceded by
+\# '\!'. The diversion is output before START in TOC.
+\#
+.MAC TOC_PAGE_SETTINGS END
+. nr #TOC_PAGE_PARAMS 1
+. ie '\\$1'' \
+. di TOC_PAGE_PARAMS
+. el .di
+.END
+\#
+\# TABLE OF CONTENTS
+\# -----------------
+\# *Arguments:
+\# none
+\# *Function:
+\# Takes care of the administrivia of setting up the TOC as if
+\# it's a collated doc, then outputs the formatted TOC_ENTRIES
+\# diversion.
+\#
+.MAC TOC END
+. ie (\\n[@TOP]=0)&(\\n[.t]<=\\n[.v]) \
+' br \" When last line of text is on or near b-margin.
+. el .br \" All other cases
+. if dPDF.EXPORT \
+. if \\n[#FLEX_ACTIVE] \
+. if !\\n[#NO_FLEX] \
+. tm .ds pre-toc-\\n%@\\n[#COL_NUM] 1
+. if \\n[#TOC_RV_SWITCH]=1 .nr #TOC_RV_SWITCH 2
+. char \[leader] " .
+. LEADER_CHARACTER \[leader]
+. if !\\n[#TOC_HEAD_1_INDENT] \
+. nr #TOC_INDENT_ADJ 1.5m
+. if \\n[#TOC_PREFIX_CH_NUM] \
+. nr #TOC_INDENT_ADJ \\n[#TOC_CH_NUM_INDENT]
+. if !\\n[#DOC_TYPE]=2 \{\
+. if !'\\$1'INCLUDE_TITLE' \{\
+. if r #LEVEL .nr #SKIP_ENTRY 1
+. nr #TOC_INDENT_ADJ 0
+. \}
+. \}
+. nr #TOC 1
+. nr TOC.RELOCATE 0
+. if \\n[#LINENUMBERS]=1 \{\
+. NUMBER_LINES OFF
+. nr #LINENUMBERS 2
+. \}
+. if !r #PAGINATE_TOC .PAGINATE_TOC
+. nr #TOC_FIRST_PAGE 1
+. if \\n[#FINIS] \{\
+. if \\n[#FOOTERS_WERE_ON] \
+. FOOTERS \" Have to turn FOOTERS on for next bit to work, so we can't skip this step
+. \}
+. if \\n[#FOOTERS_ON]=1 \{\
+. if !'\\*[$HDRFTR_CENTER_OLD]'' \
+. ds $HDRFTR_CENTER \\*[$HDRFTR_CENTER_OLD]
+. ie \\n[#PAGINATE_TOC]=1 .PAGINATE
+. el .PAGINATION OFF
+. \}
+. if \\n[#FOOTERS_WERE_ON] .FOOTERS OFF \" But have to turn FOOTERS off again so they don't print when FINIS was called
+. rr #COLUMNS
+. COLLATE
+. if \\n[#PRINT_STYLE]=1 \{\
+. rr #IGNORE
+. if \\n[#SINGLE_SPACE] .DOC_LEAD 24
+. DOC_LEAD_ADJUST
+. TRAPS
+. nr #IGNORE 1
+. \}
+. if \\n[#FINIS] \{\
+. if \\n[#FOOTERS_WERE_ON] .FOOTERS \" Finally, turn footers on if they were on
+. rr #FOOTERS_WERE_ON
+. if \\n[#PAGINATION_WAS_ON] \{\
+. nr #PAGINATE 1
+. rr #PAGINATION_WAS_ON
+. \}
+. rr #FINIS
+. \}
+. ie \\n[#PAGINATE_TOC]=1 .PAGINATE
+. el .PAGINATION OFF
+. ds $HDRFTR_CENTER \\*[$HDRFTR_CENTER_NEW]
+. rm $HDRFTR_CENTER_OLD
+. rm $HDRFTR_CENTER_NEW
+. rr #COLLATED_DOC
+. if !r #TOC_START_PAGENUM .nr #TOC_START_PAGENUM 1
+. PAGENUMBER \\n[#TOC_START_PAGENUM]
+. if \\n[#LINENUMBERS]=2 .nr #LINENUMBERS 3
+. L_MARGIN \\n[#DOC_L_MARGIN]u
+. LL \\n[#DOC_L_LENGTH]u
+. HEADER_CENTER "\\*[$TOC_HEADER_STRING]
+. if \\n[#SLANT_ON] .nop \\*[SLANTX]
+. PAGENUM_STYLE \\*[$TOC_PN_STYLE]
+. PAGENUM_FAMILY \\*[$TOC_PN_FAM]
+. if r #TOC_PAGE_PARAMS .TOC_PAGE_PARAMS
+. ie \\n[#ADJ_TOC_LEAD] \{\
+. DOC_LEAD \\*[$TOC_LEAD] ADJUST
+. TRAPS
+. \}
+. el .DOC_LEAD \\*[$TOC_LEAD]
+. ie \\n[#TOC_HEADER_V_POS] \
+. DOCHEADER OFF \\n[#TOC_HEADER_V_POS]u-\\n[#DOC_LEAD]u
+. el .DOCHEADER OFF \\n[#T_MARGIN]u-\\n[#DOC_LEAD]u
+. if (\\n[#PRINT_STYLE]=1)&(\\n[#SINGLE_SPACE]=1) \
+. DOCHEADER OFF \\n[#T_MARGIN]u-(\\n[#DOC_LEAD]u*2u)
+. START
+. PDF_BOOKMARK 1 \\*[$TOC_HEADER_STRING]
+. if \\n[#PRINT_STYLE]=1 .TYPEWRITER
+. if \\n[#PRINT_STYLE]=2 \{\
+. FAMILY \\*[$TOC_HEADER_FAM]
+. FT \\*[$TOC_HEADER_FT]
+. ps \\n[#TOC_PS]u\\*[$TOC_HEADER_SIZE_CHANGE]
+. if \\n[#TOC_HEADER_COLOR]=1 \
+. COLOR \\*[$TOC_HEADER_COLOR]
+. \}
+. QUAD \\*[$TOC_HEADER_QUAD]
+. if \\n[#TOC_STRING_CAPS] .CAPS
+. if \\n[#TOC_STRING_SMALLCAPS] .SMALLCAPS
+. if \\n[#PRINT_STYLE]=1 \
+. UNDERSCORE 3p "\\*[$TOC_HEADER_STRING]"
+. if \\n[#PRINT_STYLE]=2 \{\
+. ie \\n[#TOC_HEADER_UNDERLINE] \{\
+. ds $TITLE_TYPE TOC_HEADER
+. ie \\n[#TOC_HEADER_UNDERLINE]=2 \
+. UNDERSCORE2 \\*[$TOC_UNDERLINE_GAP] \\*[$TOC_RULE_GAP] "\\*[$TOC_HEADER_STRING]"
+. el .UNDERSCORE "\\*[$TOC_HEADER_STRING]"
+. \}
+. el .PRINT \\*[$TOC_HEADER_STRING]
+. \}
+. SMALLCAPS OFF
+. CAPS OFF
+. if \\n[#TOC_HEADER_COLOR]=1 .gcolor
+. br
+. sp
+. SHIM_1
+. nf
+. TOC_ENTRIES
+. if \\n[#LINENUMBERS]=3 \{\
+. NUMBER_LINES RESUME
+. nr #LINENUMBERS 1
+. nn 1
+. \}
+. rr #TOC
+. rr #TOC_RV_SWITCH
+. pdfsync
+.END
+\#
+\# ====================================================================
+\#
+\# +++COLUMNS+++
+\#
+\# COLUMNS
+\# -------
+\# *Arguments:
+\# <number of columns> <width of gutters>
+\# *Function:
+\# Creates registers associated with setting docs in columns.
+\# Calculates column line lengths and offsets
+\# *Notes:
+\# COLUMNS, if used, s/b the last macro invoked before START.
+\#
+.MAC COLUMNS END
+. if \\n[#IGNORE_COLUMNS]=1 .return
+. nr #COLUMNS 1
+. nr #NUM_COLS \\$1
+. nr #GUTTER (\\$2)
+. nr #COL_L_LENGTH \\n[#L_LENGTH]-(\\n[#GUTTER]*(\\n[#NUM_COLS]-1))/\\n[#NUM_COLS]
+. nr #COL_TOTAL 0 \\n[#COL_L_LENGTH]+\\n[#GUTTER]
+. nr #COL_NUM 0 1
+. while !\\n[#COL_NUM]=\\n[#NUM_COLS] \{\
+. nr #COL_\\n+[#COL_NUM]_L_MARGIN \\n[#L_MARGIN]+\\n[#COL_TOTAL]
+. nr #COL_TOTAL \\n+[#COL_TOTAL]
+. \}
+. if \\n[#NUM_COLS]=1 \
+. if !\\n[#COLLATE]=1 .MN_INIT
+. rr #COL_TOTAL
+. rr #COL_NUM
+.END
+\#
+\# MARK COL V-POSITION AFTER DOCHEADER
+\# -----------------------------------
+\# *Arguments:
+\# none
+\# *Function:
+\# Sets 1st page dc register.
+\# *Notes:
+\# Only required if manual spacing, positive or negative, precedes
+\# start of columns on first page of doc.
+\#
+.MAC COL_MARK END
+. mk dc
+.END
+\#
+\# NEXT COLUMN
+\# -----------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Breaks current column and moves to next column.
+\# If current column is the last on the page, breaks
+\# to a new page.
+\#
+.MAC COL_NEXT END
+. if \\n[#COLUMNS] \{\
+. nr #COL_NEXT 1
+. vpt 0
+. if !'\\$1'internal' \
+. if dPDF.EXPORT \
+. if \\n[#FLEX_ACTIVE] \
+. if !\\n[#NO_FLEX] \
+. if \\n[#COL_NUM]>1 \
+. tm .ds page-\\n%@\\n[#COL_NUM] 1
+. ie '\\$0'COL_NEXT' .br
+. el \{\
+. brp
+. RLD 1v
+. \}
+. vpt
+. ie \\n[#COL_NUM]=\\n[#NUM_COLS] .NEWPAGE
+. el .FOOTER
+. \}
+.END
+\#
+\# ====================================================================
+\#
+\# +++LISTS+++
+\#
+\# LIST
+\# ----
+\# *Arguments:
+\# [ BULLET | DASH | DIGIT | alpha | ALPHA | roman | ROMAN | USER ] \
+\# [ <separator> | NONE ] [ <prefix> ] [ <anything> ]
+\# *Function:
+\# Stores indent information in effect prior to invocation and
+\# initializes a list with the supplied enumerator (and separator).
+\# *Notes:
+\# Default enumerator is a bullet.
+\#
+\# Enumerator *must* be supplied for every list that's to the
+\# right of another list, every time, unless the default bullet is
+\# desired.
+\#
+\# <anything> moves back one list level intuitively, or exits lists
+\# completely if the level in which it's invoked is the first.
+\#
+.MAC LIST END
+. br
+. if r pdfbx-top 'sp -1
+. ds $1ST_LETTER \\$1
+. if !'\\*[$1ST_LETTER]'' .substring $1ST_LETTER 0 0
+. if '\\*[$1ST_LETTER]'r' .ds $1ST_LETTER R
+. ie '\\*[$1ST_LETTER]'R' \{\
+. if r #ROMAN_LIST .rr #ROMAN_LIST
+. if '\\$1'ROMAN' .nr #ROMAN_LIST 1
+. if '\\$1'roman' .nr #ROMAN_LIST 1
+. ds $LAST_CHAR \\$1
+. substring $LAST_CHAR -1
+. if !\B'\\*[$LAST_CHAR]' \{\
+. if !r #ROMAN_LIST \{\
+. LIST OFF
+. return
+. \}
+. tm1 "[mom]: You must append a number to the '\\$1' argument to \\$0.
+. tm1 " The number should be the total number of items in this list.
+. tm1 " See the documentation.
+. ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. \}
+. ds $ROMAN_WIDTH \\$1
+. substring $ROMAN_WIDTH 1
+. while !\B'\\*[$ROMAN_WIDTH]' \{\
+. substring $ROMAN_WIDTH 1
+. \}
+. length #ROMAN_LENGTH \\*[$ROMAN_WIDTH]
+. ds $LIST_ARG_1 \\$1
+. substring $LIST_ARG_1 0 -(\\n[#ROMAN_LENGTH]+1)
+. \}
+. el .ds $LIST_ARG_1 \\$1
+. if !r#DEPTH \{\
+. if \\n[#INDENT_ACTIVE] \{\
+. nr #STORED_HL_INDENT \\n[#HL_INDENT]
+. nr #STORED_T_INDENT \\n[#T_INDENT]
+. if \\n[#INDENT_STYLE_LEFT] \
+. nr #STORED_L_INDENT \\n[#L_INDENT]
+. if \\n[#INDENT_STYLE_RIGHT] \
+. nr #STORED_R_INDENT \\n[#R_INDENT]
+. if \\n[#INDENT_STYLE_BOTH] \{\
+. nr #STORED_BL_INDENT \\n[#BL_INDENT]
+. nr #STORED_BR_INDENT \\n[#BR_INDENT]
+. \}
+. \}
+. nr #CURRENT_L_LENGTH \\n[.l]
+. nr #DEPTH 0 1
+. if \\n[#INDENT_ACTIVE]=1 \{\
+. if \\n[#INDENT_LEFT_ACTIVE]=1 \
+. nr #RESTORE_PREV_INDENT 1
+. if \\n[#INDENT_BOTH_ACTIVE]=1 \{\
+. ie \\n[#DOC_TYPE]=5 .IBX CLEAR
+. el .IBX
+. nr #ORIG_L_LENGTH \\n[.l]
+. IB
+. nr #RESTORE_PREV_INDENT 2
+. \}
+. if \\n[#INDENT_RIGHT_ACTIVE]=1 \{\
+. ie \\n[#DOC_TYPE]=5 .IRX CLEAR
+. el .IRX
+. nr #ORIG_L_LENGTH \\n[.l]
+. IR
+. nr #RESTORE_PREV_INDENT 3
+. if \\n[#INDENT_LEFT_ACTIVE]=1 \
+. nr #RESTORE_PREV_INDENT 4
+. \}
+. \}
+. \}
+. ds pre-list-quad \\*[$QUAD_VALUE]
+. substring pre-list-quad 0 0
+. if '\\*[pre-list-quad]'C' \{\
+. if !'\\n[.z]'LIST*DIV' \{\
+. nr #PRE_LIST_QUAD \\n[.j]
+. nr #LIST_CENTER 1
+. if !'\\n[.z]'LIST*DIV' .di LIST*DIV
+\!. nr #IN_LIST 1
+. ad l
+. \}
+. \}
+. if '\\*[pre-list-quad]'R' \{\
+. if !'\\n[.z]'LIST*DIV' \{\
+. nr #PRE_LIST_QUAD \\n[.j]
+. nr #LIST_RIGHT 1
+. if !'\\n[.z]'LIST*DIV' .di LIST*DIV
+\!. nr #IN_LIST 1
+. ad l
+. \}
+. \}
+. ie \\n[#NUM_ARGS]=0 \{\
+. nr #ARGS_TO_LIST 1 \" So default behaves as if LIST BULLET
+. ds $ENUMERATOR\\n+[#DEPTH] \[bu]
+. ds $ENUMERATOR_TYPE\\n[#DEPTH] other
+. ds $SEPARATOR
+. ds $PREFIX
+. ds $SEPARATOR\\n[#DEPTH]
+. ds $PREFIX\\n[#DEPTH]
+. \}
+. el \{\
+. rr #ARGS_TO_LIST \" Clear this before processing arg 1.
+. if '\\*[$LIST_ARG_1]'DASH' \{\
+. nr #ARGS_TO_LIST 1
+. ds $ENUMERATOR\\n+[#DEPTH] \[en]
+. ds $ENUMERATOR_TYPE\\n[#DEPTH] other
+. ds $SEPARATOR\\n[#DEPTH]
+. ds $PREFIX\\n[#DEPTH]
+. \}
+. if '\\*[$LIST_ARG_1]'BULLET' \{\
+. nr #ARGS_TO_LIST 1
+. ds $ENUMERATOR\\n+[#DEPTH] \[bu]
+. ds $ENUMERATOR_TYPE\\n[#DEPTH] other
+. ds $SEPARATOR\\n[#DEPTH]
+. ds $PREFIX\\n[#DEPTH]
+. \}
+. if '\\*[$LIST_ARG_1]'DIGIT' \{\
+. nr #ARGS_TO_LIST 1
+. nr #ENUMERATOR\\n+[#DEPTH] 0 1
+. ds $ENUMERATOR_TYPE\\n[#DEPTH] register
+. ds $SEPARATOR\\n[#DEPTH] .
+. ds $PREFIX\\n[#DEPTH]
+. if \\n[#NUM_ARGS]>=2 \{\
+. ie '\\$2'NONE' .ds $SEPARATOR\\n[#DEPTH]
+. el .ds $SEPARATOR\\n[#DEPTH] \\$2
+. if \\n[#NUM_ARGS]=3 .ds $PREFIX\\n[#DEPTH] \\$3
+. \}
+. \}
+. if '\\*[$LIST_ARG_1]'alpha' \{\
+. nr #ARGS_TO_LIST 1
+. nr #ENUMERATOR\\n+[#DEPTH] 0 1
+. af #ENUMERATOR\\n[#DEPTH] a
+. ds $ENUMERATOR_TYPE\\n[#DEPTH] register
+. ds $SEPARATOR\\n[#DEPTH] )
+. ds $PREFIX\\n[#DEPTH]
+. if \\n[#NUM_ARGS]>=2 \{\
+. ie '\\$2'NONE' .ds $SEPARATOR\\n[#DEPTH]
+. el .ds $SEPARATOR\\n[#DEPTH] \\$2
+. if \\n[#NUM_ARGS]=3 .ds $PREFIX\\n[#DEPTH] \\$3
+. \}
+. \}
+. if '\\*[$LIST_ARG_1]'ALPHA' \{\
+. nr #ARGS_TO_LIST 1
+. nr #ENUMERATOR\\n+[#DEPTH] 0 1
+. af #ENUMERATOR\\n[#DEPTH] A
+. ds $ENUMERATOR_TYPE\\n[#DEPTH] register
+. ds $SEPARATOR\\n[#DEPTH] )
+. ds $PREFIX\\n[#DEPTH]
+. if \\n[#NUM_ARGS]>=2 \{\
+. ie '\\$2'NONE' .ds $SEPARATOR\\n[#DEPTH]
+. el .ds $SEPARATOR\\n[#DEPTH] \\$2
+. if \\n[#NUM_ARGS]=3 \
+. ds $PREFIX\\n[#DEPTH] \\$3
+. \}
+. \}
+. if '\\*[$1ST_LETTER]'R' \{\
+. nr #ARGS_TO_LIST 1
+. nr #ENUMERATOR\\n+[#DEPTH] 0 1
+. if '\\*[$LIST_ARG_1]'roman' .af #ENUMERATOR\\n[#DEPTH] i
+. if '\\*[$LIST_ARG_1]'ROMAN' .af #ENUMERATOR\\n[#DEPTH] I
+. ds $ENUMERATOR_TYPE\\n[#DEPTH] roman
+. ds $SEPARATOR\\n[#DEPTH] )
+. ds $PREFIX\\n[#DEPTH]
+. if \\n[#NUM_ARGS]>=2 \{\
+. ie '\\$2'NONE' .ds $SEPARATOR\\n[#DEPTH]
+. el .ds $SEPARATOR\\n[#DEPTH] \\$2
+. if \\n[#NUM_ARGS]=3 .ds $PREFIX\\n[#DEPTH] \\$3
+. \}
+. \}
+. if '\\*[$LIST_ARG_1]'USER' \{\
+. nr #ARGS_TO_LIST 1
+. ds $ENUMERATOR\\n+[#DEPTH] \\$2
+. ds $ENUMERATOR_TYPE\\n[#DEPTH] other
+. ds $SEPARATOR\\n[#DEPTH]
+. ds $PREFIX\\n[#DEPTH]
+. \}
+. if '\\*[$LIST_ARG_1]'VARIABLE' \{\
+. if \\n[#NUM_ARGS]<2 \{\
+. tm1 "[mom]: You must follow the \\$1 argument to \\$0 with the widest
+. tm1 " enumerator to be used. See the documentation.
+. ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. \}
+. nr #ARGS_TO_LIST 1
+. ds $ENUMERATOR\\n+[#DEPTH]
+. ds $ENUMERATOR_TYPE\\n[#DEPTH] variable
+. ds $ENUMERATOR_WIDTH\\n[#DEPTH] \w'\\$2\ '
+. ds $SEPARATOR\\n[#DEPTH]
+. ds $PREFIX\\n[#DEPTH]
+. \}
+. if '\\*[$LIST_ARG_1]'PLAIN' \{\
+. nr #ARGS_TO_LIST 1
+. ds $ENUMERATOR\\n+[#DEPTH]
+. ds $ENUMERATOR_TYPE\\n[#DEPTH] plain
+. ds $SEPARATOR\\n[#DEPTH]
+. ds $PREFIX\\n[#DEPTH]
+. \}
+. if \\n[#NUM_ARGS]=1 \{\
+. if !r#ARGS_TO_LIST \{\
+. ie \\n[#DEPTH]=1 \{\
+. ie \\n[#NEXT_DEPTH_BACK]=0 \{\
+. SET_LIST_INDENT
+. if \\n[#QUIT]=1 \{\
+. QUIT_LISTS
+. return
+. \}
+. return
+. \}
+. el \{\
+. QUIT_LISTS
+. return
+. \}
+. \}
+. el \{\
+. SET_LIST_INDENT
+. return
+. \}
+. \}
+. \}
+. \}
+. nr #TOTAL_LISTS \\n[#DEPTH]
+. if '\\*[$ENUMERATOR_TYPE\\n[#DEPTH]]'register' \{\
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]m\\*[$SEPARATOR\\n[#DEPTH]]\ '
+. if '\\*[$LIST_ARG_1]'ALPHA' .nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]M\\*[$SEPARATOR\\n[#DEPTH]]\ '
+. \}
+. if '\\*[$ENUMERATOR_TYPE\\n[#DEPTH]]'roman' \
+. GET_ROMAN_INDENT
+. if '\\*[$ENUMERATOR_TYPE\\n[#DEPTH]]'other' \
+. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$ENUMERATOR\\n[#DEPTH]]\ '
+. if '\\*[$ENUMERATOR_TYPE\\n[#DEPTH]]'variable' \
+. nr #LIST_INDENT\\n[#DEPTH] \\*[$ENUMERATOR_WIDTH\\n[#DEPTH]]
+. ll \\n[#CURRENT_L_LENGTH]u
+. ie \\n[#DEPTH]=1 \{\
+. ie \\n[#INDENT_ACTIVE]=1 \{\
+. if \\n[#INDENT_STYLE_LEFT]=1 \{\
+. if \\n[#L_INDENT_ILX] \{\
+. rr #L_INDENT
+. rr #L_INDENT_ILX
+. \}
+. nr #L_INDENT \\n[#L_INDENT]+\\n[#LIST_INDENT\\n[#DEPTH]]
+. nr #HL_INDENT\\n[#DEPTH] \\n[#LIST_INDENT\\n[#DEPTH]]
+. nr #LIST_INDENT\\n[#DEPTH] \\n[#L_INDENT]
+. \}
+. if \\n[#INDENT_BOTH_ACTIVE]=1 \{\
+. nr #L_INDENT \\n[#BL_INDENT]+\\n[#LIST_INDENT\\n[#DEPTH]]
+. nr #HL_INDENT\\n[#DEPTH] \\n[#LIST_INDENT\\n[#DEPTH]]
+. nr #LIST_INDENT\\n[#DEPTH] \\n[#L_INDENT]
+. \}
+. if \\n[#INDENT_RIGHT_ACTIVE]=1 \{\
+. ie \\n[#INDENT_LEFT_ACTIVE]=1 \{\
+. \" Don't do anything; we already have a left indent
+. \}
+. el \{\
+. nr #L_INDENT +\\n[#LIST_INDENT\\n[#DEPTH]]
+. nr #HL_INDENT\\n[#DEPTH] \\n[#LIST_INDENT\\n[#DEPTH]]
+. \}
+. \}
+. \}
+. el \{\
+. nr #L_INDENT +\\n[#LIST_INDENT\\n[#DEPTH]]
+. nr #HL_INDENT\\n[#DEPTH] \\n[#LIST_INDENT\\n[#DEPTH]]
+. \}
+. \}
+. el \{\
+. nr #L_INDENT +\\n[#LIST_INDENT\\n[#DEPTH]]
+. nr #HL_INDENT\\n[#DEPTH] \\n[#LIST_INDENT\\n[#DEPTH]]
+. \}
+.END
+\#
+\# ITEM
+\# ----
+\# *Arguments:
+\# <none> | <space before item>
+\# *Function:
+\# Prints enumerator for a given list depth and prepares mom to
+\# receive the text of an item.
+\#
+.MAC ITEM END
+. ie \\n[#NUM_ARGS]=2 .sp \\$2
+. el \
+. if \B'\\$1' .sp \\$1
+. if '\\*[$ENUMERATOR_TYPE\\n[#DEPTH]]'plain' .nop
+. if !r#DEPTH .return
+. if \\n[#LINENUMBERS]=1 \{\
+. NUMBER_LINES OFF
+. nr #LINENUMBERS 2
+. \}
+. if \\n[#KERN]=1 \{\
+. nr #KERN_WAS_ON 1
+. KERN OFF
+. \}
+. rr #IN_ITEM
+. IL
+. nr #IN_ITEM 1
+. ll \\n[#CURRENT_L_LENGTH]u \" Set ll again because IL turns IB off.
+. ie !'\\n[.z]'' \!.TRAP OFF
+. el .TRAP OFF
+. HI \\n[#HL_INDENT\\n[#DEPTH]]u
+. if '\\*[$SEPARATOR\\n[#DEPTH]]')' .nr #SEP_TYPE 1
+. if '\\*[$SEPARATOR\\n[#DEPTH]]']' .nr #SEP_TYPE 1
+. if '\\*[$SEPARATOR\\n[#DEPTH]]'}' .nr #SEP_TYPE 1
+. ie \\n[#IN_BIB_LIST]=1 \{\
+. ie \\n[#ENUMERATOR\\n[#DEPTH]]<9 \{\
+. ie \\n[#SEP_TYPE]=1 .PRINT \
+\v'-.085m'\\*[$PREFIX\\n[#DEPTH]]\v'.085m'\
+\\n+[#ENUMERATOR\\n[#DEPTH]]\v'-.085m'\\*[$SEPARATOR\\n[#DEPTH]]\v'.085m'
+. el .PRINT \
+\\*[$PREFIX\\n[#DEPTH]]\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]]
+. \}
+. el \{\
+. ie \\n[#SEP_TYPE]=1 .PRINT \
+\h'-\w'\0'u'\v'-.085m'\\*[$PREFIX\\n[#DEPTH]]\v'.085m'\
+\\n+[#ENUMERATOR\\n[#DEPTH]]\v'-.085m'\\*[$SEPARATOR\\n[#DEPTH]]\v'.085m'
+. el .PRINT \
+\h'-\w'\0'u'\
+\\*[$PREFIX\\n[#DEPTH]]\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]]
+. \}
+. \}
+. el \{\
+. ie '\\*[$ENUMERATOR_TYPE\\n[#DEPTH]]'register' \{\
+.\" DIGIT
+. ie '\\g[#ENUMERATOR\\n[#DEPTH]]'0' \{\
+. ie \\n[#PAD_LIST_DIGITS\\n[#DEPTH]]=1 \{\
+. ie \\n[#ENUMERATOR\\n[#DEPTH]]<9 \{\
+. ie \\n[#SEP_TYPE]=1 .PRINT \
+\0\v'-.085m'\\*[$PREFIX\\n[#DEPTH]]\v'.085m'\\n+[#ENUMERATOR\\n[#DEPTH]]\
+\v'-.085m'\\*[$SEPARATOR\\n[#DEPTH]]\v'.085m'
+. el .PRINT \
+\0\\*[$PREFIX\\n[#DEPTH]]\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]]
+. \}
+. el \{\
+. ie \\n[#SEP_TYPE]=1 .PRINT \
+\v'-.085m'\\*[$PREFIX\\n[#DEPTH]]\v'.085m'\\n+[#ENUMERATOR\\n[#DEPTH]]\
+\v'-.085m'\\*[$SEPARATOR\\n[#DEPTH]]\v'.085m'
+. el .PRINT \
+\\*[$PREFIX\\n[#DEPTH]]\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]]
+. \}
+. \}
+. el \{\
+. ie \\n[#SEP_TYPE]=1 .PRINT \
+\v'-.085m'\\*[$PREFIX\\n[#DEPTH]]\v'.085m'\\n+[#ENUMERATOR\\n[#DEPTH]]\
+\v'-.085m'\\*[$SEPARATOR\\n[#DEPTH]]\v'.085m'
+. el .PRINT \
+\\*[$PREFIX\\n[#DEPTH]]\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]]
+. \}
+. \}
+. el \{\
+.\" ALPHA
+. ie '\\g[#ENUMERATOR\\n[#DEPTH]]'A' \{\
+. ie \\n[#SEP_TYPE]=1 .PRINT \
+\v'-.085m'\\*[$PREFIX\\n[#DEPTH]]\v'.085m'\\n+[#ENUMERATOR\\n[#DEPTH]]\
+\v'-.085m'\\*[$SEPARATOR\\n[#DEPTH]]\v'.085m'
+. el .PRINT \
+\\*[$PREFIX\\n[#DEPTH]]\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]]
+. \}
+.\" alpha
+. el .PRINT \
+\\*[$PREFIX\\n[#DEPTH]]\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]]
+. \}
+. \}
+. if '\\*[$ENUMERATOR_TYPE\\n[#DEPTH]]'roman' \{\
+. ie \\n[#PAD_LIST_DIGITS\\n[#DEPTH]]=1 \{\
+.\" ROMAN I, padded
+. ie '\\g[#ENUMERATOR\\n[#DEPTH]]'I' \{\
+. ie \\n[#SEP_TYPE]=1 .PRINT \
+\h'\\n[#HL_INDENT\\n[#DEPTH]]u'\h'-\w'\\*[$PREFIX\\n[#DEPTH]]\
+\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]]\0'u'\
+\v'-.085m'\\*[$PREFIX\\n[#DEPTH]]\v'.085m'\\n[#ENUMERATOR\\n[#DEPTH]]\
+\v'-.085m'\\*[$SEPARATOR\\n[#DEPTH]]\v'.085m'
+. el .PRINT \
+\h'\\n[#HL_INDENT\\n[#DEPTH]]u'\h'-\w'\\*[$PREFIX\\n[#DEPTH]]\
+\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]]\
+\0'u'\\*[$PREFIX\\n[#DEPTH]]\\n[#ENUMERATOR\\n[#DEPTH]]\
+\\*[$SEPARATOR\\n[#DEPTH]]
+. \}
+.\" roman i, padded
+. el .PRINT \
+\h'\\n[#HL_INDENT\\n[#DEPTH]]u'\h'-\w'\\*[$PREFIX\\n[#DEPTH]]\
+\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]]\0'u'\
+\\*[$PREFIX\\n[#DEPTH]]\\n[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]]
+. \}
+.\" No pad
+. el \{\
+.\" ROMAN I, no pad
+. ie '\\g[#ENUMERATOR\\n[#DEPTH]]'I' \{\
+. ie \\n[#SEP_TYPE]=1 .PRINT \
+\v'-.085m'\\*[$PREFIX\\n[#DEPTH]]\v'.085m'\\n+[#ENUMERATOR\\n[#DEPTH]]\
+\v'-.085m'\\*[$SEPARATOR\\n[#DEPTH]]\v'.085m'
+. el .PRINT \
+\\*[$PREFIX\\n[#DEPTH]]\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]]
+. \}
+.\" roman i, no pad
+. el .PRINT \
+\\*[$PREFIX\\n[#DEPTH]]\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]]
+. \}
+. \}
+. if '\\*[$ENUMERATOR_TYPE\\n[#DEPTH]]'other' \
+. PRINT \\*[$ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]]
+. if '\\*[$ENUMERATOR_TYPE\\n[#DEPTH]]'variable' \
+. PRINT \\$1
+. \}
+. rr #SEP_TYPE
+. EOL
+. if \\n[#REF]=1 \{\
+. IL +\\n[#REF_BIB_INDENT]u
+. ti \\n[#L_INDENT]u-\\n[#REF_BIB_INDENT]u
+. \}
+. ie !'\\n[.z]'' \!.TRAP
+. el .TRAP
+. if \\n[#KERN_WAS_ON]=1 \{\
+. KERN
+. rr #KERN_WAS_ON
+. \}
+. if \\n[#LINENUMBERS]=2 \{\
+. NUMBER_LINES RESUME
+. nr #LINENUMBERS 1
+. \}
+.END
+\#
+\# A utility macro that determines the space to reserve for
+\# roman numeral enumerated lists. Limit is 20 roman numerals
+\# per list. If this isn't enough, the user can add to the
+\# macro.
+\#
+.MAC GET_ROMAN_INDENT END
+. if '\\*[$LIST_ARG_1]'roman' \{\
+. if '\\*[$ROMAN_WIDTH]'1' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 1
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]i\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'2' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 2
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]ii\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'3' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 3
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]iii\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'4' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 4
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]iii\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'5' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 5
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]iii\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'6' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 6
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]iii\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'7' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 7
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]vii\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'8' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 8
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]viii\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'9' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 9
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]viii\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'10' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 10
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]viii\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'11' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 11
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]viii\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'12' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 12
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]viii\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'13' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 13
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]xiii\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'14' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 14
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]xiii\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'15' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 15
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]xiii\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'16' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 16
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]xiii\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'17' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 17
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]xvii\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'18' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 18
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]xviii\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'19' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 19
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]xviii\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'20' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 20
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]xviii\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. \}
+. if '\\*[$LIST_ARG_1]'ROMAN' \{\
+. if '\\*[$ROMAN_WIDTH]'1' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 1
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]I\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'2' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 2
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]II\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'3' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 3
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]III\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'4' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 4
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]IV\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'5' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 5
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]IV\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'6' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 6
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]IV\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'7' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 7
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]VII\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'8' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 8
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]VIII\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'9' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 9
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]VIII\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'10' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 10
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]VIII\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'11' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 11
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]VIII\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'12' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 12
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]VIII\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'13' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 13
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]XIII\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'14' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 14
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]XIV\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'15' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 15
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]XIV\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'16' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 16
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]XIV\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'17' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 17
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]XVII\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'18' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 18
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]XVIII\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'19' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 19
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]XVIII\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. if '\\*[$ROMAN_WIDTH]'20' \{\
+. ds $ROMAN_WIDTH\\n[#DEPTH] 20
+. nr #LIST_INDENT\\n[#DEPTH] \
+\w'\\*[$PREFIX\\n[#DEPTH]]XVIII\\*[$SEPARATOR\\n[#DEPTH]]\0'
+. \}
+. \}
+.END
+\#
+\# SHIFT LIST
+\# ----------
+\# *Arguments:
+\# <amount by which to indent a list to the right>
+\# *Function:
+\# Adds the value of the arg to the current list's indent.
+\# *Notes:
+\# Requires a unit of measure.
+\#
+.MAC SHIFT_LIST END
+. nr #SHIFT_LIST\\n[#DEPTH] (\\$1)
+. nr #L_INDENT +\\n[#SHIFT_LIST\\n[#DEPTH]]
+.END
+\#
+\# PAD LIST DIGITS
+\# ---------------
+\# *Arguments:
+\# [ LEFT ]
+\# *Function:
+\# Adds a figure space to a list's hanging and left indent. If
+\# LEFT is given, sets reg. #PAD_LIST_DIGITS to 1 for use in ITEM.
+\#
+.MAC PAD_LIST_DIGITS END
+. if '\\g[#ENUMERATOR\\n[#DEPTH]]'0' \{\
+. nr #LIST_INDENT\\n[#DEPTH] +\\w'\\0'
+. nr #L_INDENT \\n[#LIST_INDENT\\n[#DEPTH]]+\\n[#LIST_INDENT\\n-[#DEPTH]]
+. nr #HL_INDENT\\n+[#DEPTH] +\\w'\\n[#ENUMERATOR\\n[#DEPTH]]'
+. if '\\$1'LEFT' .nr #PAD_LIST_DIGITS\\n[#DEPTH] 1
+. \}
+. if '\\g[#ENUMERATOR\\n[#DEPTH]]'i' \
+. if '\\$1'LEFT' .nr #PAD_LIST_DIGITS\\n[#DEPTH] 1
+. if '\\g[#ENUMERATOR\\n[#DEPTH]]'I' \
+. if '\\$1'LEFT' .nr #PAD_LIST_DIGITS\\n[#DEPTH] 1
+.END
+\#
+\# RESET LIST
+\# ----------
+\# *Arguments:
+\# none
+\# *Function:
+\# Resets register enumerators to 1, a, i...
+\#
+.MAC RESET_LIST END
+. ie '\\$1'' .nr #ENUMERATOR\\n[#DEPTH] 0 1
+. el .nr #ENUMERATOR\\n[#DEPTH] \\$1-1 1
+.END
+\#
+\# QUIT LISTS
+\# ----------
+\# *Arguments:
+\# none
+\# *Function:
+\# Exits lists cleanly and restores any indents that were in
+\# effect prior to LIST.
+\#
+.MAC QUIT_LISTS END
+. br
+. if '\\n[.z]'LIST*DIV' \{\
+\!. rr #IN_LIST
+. di
+. \}
+. IQ CLEAR
+. nr #HL_INDENT \\n[#STORED_HL_INDENT]
+. nr #T_INDENT \\n[#STORED_T_INDENT]
+. nr #L_INDENT \\n[#STORED_L_INDENT]
+. nr #R_INDENT \\n[#STORED_R_INDENT]
+. nr #BL_INDENT \\n[#STORED_BL_INDENT]
+. nr #BR_INDENT \\n[#STORED_BR_INDENT]
+. rr #STORED_HL_INDENT
+. if \\n[#LIST_CENTER] \
+. nr #LIST_OFFSET_VALUE \\n[.l]-\\n[dl]/2
+. if \\n[#LIST_RIGHT] \{\
+. nr #LIST_OFFSET_VALUE \\n[.l]-\\n[dl]
+. if r pdfbx-running \
+. nr #LIST_OFFSET_VALUE \
+\\n[.l]-\\n[dl]-\\*[gap\\n[stack]]-(\\*[wt\\n[stack]]/2)
+. \}
+. po +\\n[#LIST_OFFSET_VALUE]u
+. if \\n[.u] .nr #FILLED 1
+. nf
+. if dLIST*DIV \{\
+. LIST*DIV
+. rm LIST*DIV
+. \}
+. if \\n[#FILLED] .fi
+. if !\\n[#PRE_LIST_QUAD]=\\n[.j] .ad \\n[#PRE_LIST_QUAD]
+. rr #FILLED
+. po
+. rr #PRE_LIST_QUAD
+. if \\n[#RESTORE_PREV_INDENT]=1 \
+. IL
+. if \\n[#RESTORE_PREV_INDENT]=2 \{\
+. ll \\n[#ORIG_L_LENGTH]u
+. IB
+. \}
+. if \\n[#RESTORE_PREV_INDENT]=3 \{\
+. ll \\n[#ORIG_L_LENGTH]u
+. IR
+. \}
+. if \\n[#RESTORE_PREV_INDENT]=4 \{\
+. nr #R_INDENT \\n[#STORED_R_INDENT]
+. nr #L_INDENT \\n[#STORED_L_INDENT]
+. ll \\n[#ORIG_L_LENGTH]u
+. IR
+. IL
+. \}
+.\" Clean up after exiting last depth of list
+. nr #REMOVE 0 1
+. while \\n+[#REMOVE]<=\\n[#TOTAL_LISTS] \{\
+. rr #LIST_INDENT\\n[#REMOVE]
+. rr #ENUMERATOR\\n[#REMOVE]
+. rm $ENUMERATOR\\n[#REMOVE]
+. rm $SEPARATOR\\n[#REMOVE]
+. rm $ENUMERATOR_TYPE\\n[#REMOVE]
+. rr #PAD_LIST_DIGITS\\n[#REMOVE]
+. rr #SHIFT_LIST\\n[#REMOVE]
+. \}
+. rr #STORED_L_INDENT
+. rr #STORED_BL_INDENT
+. rr #STORED_BR_INDENT
+. rr #STORED_R_INDENT
+. rr #STORED_R_INDENT
+. rr #REMOVE
+. rr #TOTAL_LISTS
+. rr #QUIT
+. rr #DEPTH
+. rr #NEXT_DEPTH_BACK
+. rr #RESTORE_PREV_INDENT
+. rr #ORIG_L_LENGTH
+. rr #CURRENT_L_LENGTH
+. rr #IN_ITEM
+. rr #IN_ITEM_L_INDENT
+.END
+\#
+\# SET LIST INDENT
+\# ---------------
+\# *Arguments:
+\# none
+\# *Function:
+\# Restores indent of prev. list in nested lists. Also sets the
+\# #QUIT register if an invocation of LIST OFF applies to the first
+\# level of list.
+\#
+.MAC SET_LIST_INDENT END
+. nr #NEXT_DEPTH_BACK \\n[#DEPTH]-1
+. if \\n[#NEXT_DEPTH_BACK]=0 \{\
+. nr #QUIT 1
+. if \\n[#INDENT_ACTIVE]=1 \{\
+. if \\n[#INDENT_STYLE_BOTH]=1 \{\
+. ie \\n[#DOCS] \
+. ll \\n[#DOC_L_LENGTH]u-\\n[#STORED_BR_INDENT]u
+. el \
+. ll \\n[#L_LENGTH]u-\\n[#STORED_BR_INDENT]u
+. in \\n[#BL_INDENT]u
+. \}
+. if \\n[#INDENT_STYLE_LEFT] \{\
+. in \\n[#STORED_L_INDENT]u
+. \}
+. if \\n[#INDENT_STYLE_RIGHT] \{\
+. ie \\n[#DOCS] \
+. ll \\n[#DOC_L_LENGTH]u-\\n[#STORED_R_INDENT]u
+. el \
+. ll \\n[#L_LENGTH]u-\\n[#STORED_R_INDENT]u
+. \}
+. \}
+. return
+. \}
+. nr #L_INDENT -\\n[#LIST_INDENT\\n[#DEPTH]]+\\n[#SHIFT_LIST\\n[#DEPTH]]
+. nr #HL_INDENT \\n[#HL_INDENT\\n-[#DEPTH]]
+.END
+\#
+\# ====================================================================
+\#
+\# +++DOCUMENT PROCESSING MISC AND SUPPORT MACROS+++
+\#
+\# COLLATE
+\# -------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Turns headers off (if on) and saves header state, sets register
+\# #COLLATE to 1 (toggle), and breaks to a new page.
+\# *Notes:
+\# COLLATE exists primarily to allow putting multiple chapters in
+\# a single file, although it can be used for any document type. After
+\# COLLATE, any of the macros that normally precede START may be
+\# used, and should behave as expected.
+\#
+\# N.B.--the START macro must be used after every COLLATE
+\#
+.MAC COLLATE END
+. if dPDF.EXPORT .tm .ds pre-collate-\\n% \\n%@\\n[#COL_NUM]
+. if \\n[defer] \{\
+. nr #BLANKPAGE_AFTER_DEFER 1
+. bp
+. \}
+. nr #HEADER_STATE \\n[#HEADERS_ON]
+. if (\\n[defer]=0)&(\\n[float*defer]=0) .HEADERS OFF
+. if \\n[#LINENUMBERS] \{\
+. NUMBER_LINES off
+. nr #LINENUMBERS 2
+. \}
+. if \\n[#BLANKPAGE] \{\
+. if \\n[nl]=\\n[#PAGE_TOP] \{\
+. nr #NO_NEWPAGE 1
+. RESTORE_SPACE
+. \}
+. rr #BLANKPAGE
+. \}
+. if \\n[defer] \
+. DO_FOOTER
+. EOL
+. ds $SAVED_DOC_FAM \\*[$DOC_FAM]
+. ds $SAVED_PP_FT \\*[$PP_FT]
+. nr #COLLATE 1
+. nr #PRE_COLLATE 1
+. nr #POST_TOP 1
+. nr #HEAD_1_NUM 0 1
+. if !\\n[#LISTS] \{\
+. if \\n[eqn*label-with-chapter]=1 .nr eqn*label-num 0 1
+. if \\n[float*label-with-chapter]=1 .nr fig*label-num 0 1
+. if \\n[pdf-img*label-with-chapter]=1 .nr fig*label-num 0 1
+. if \\n[pic*label-with-chapter]=1 .nr fig*label-num 0 1
+. if \\n[tbl*label-with-chapter]=1 .nr tbl*label-num 0 1
+. \}
+. if \\n[#DOC_HEADER]=2 .nr #DOC_HEADER 1
+. if \\n[#PAGE_NUM_V_POS]=1 \{\
+. nr #PAGINATION_STATE \\n[#PAGINATE]
+. PAGINATION OFF
+. \}
+. IQ CLEAR
+. TQ
+. LL \\n[#DOC_L_LENGTH]u
+. PT_SIZE \\n[#DOC_PT_SIZE]u
+. QUAD \\*[$DOC_QUAD]
+. nr #SAVED_DOC_LEAD \\n[#DOC_LEAD]
+. nr #COLLATED_DOC 1
+. vs \\n[#DOC_LEAD]u
+\*[SLANTX]
+\*[CONDX]
+\*[EXTX]
+. if \\n[#TOC] \{\
+. if \\n[TOC_BH]=1 .pdfswitchtopage before MOM:TOC
+. if \\n[TOC_BH]=2 .pdfswitchtopage after MOM:TOC
+. \}
+. if !\\n[#NO_NEWPAGE] .NEWPAGE
+. if !\\n[#TOC] \{\
+. if \\n[#FORCE_RECTO] \{\
+. ds $PN_FORMAT_CURR \\g[#PAGENUMBER]
+. af #PAGENUMBER 1
+. if \\n[#PAGENUMBER]%2=1 .nr #ODD_PAGENUM 1
+. af #PAGENUMBER \\*[$PN_FORMAT_CURR]
+. if \\n[#ODD_PAGENUM] .BLANKPAGE 1 DIVIDER
+. rr #ODD_PAGENUM
+. rr #BLANKPAGE_AFTER_DEFER
+. \}
+. \}
+. rr #NO_NEWPAGE
+. ch RR_@TOP
+. rr @TOP
+. if \\n[.ns] \{\
+. rs
+. nop \&
+. \}
+. if '\\n[.ev]'PAGE_TRANSITION\\n[pg-trans]' .ev
+. if \\n[#DEFER_PAGINATION] .PAGINATE
+. if !'\\*[$RESTORE_PAGENUM_STYLE]'' \{\
+. PAGENUM_STYLE \\*[$RESTORE_PAGENUM_STYLE]
+. rm $RESTORE_PAGENUM_STYLE
+. \}
+. if \\n[#CH_NUM] \
+. if \\n[#TOC]=0 .nr #CH_NUM +1
+. rm $EN_TITLE
+. COVERTITLE
+. DOC_COVERTITLE
+. TITLE
+. CHAPTER
+. CHAPTER_TITLE
+. SUBTITLE
+. MISC
+. rr #COVER_TITLE
+. rr #DOC_COVER_TITLE
+. rr #FROM_COVERTITLE
+. rr #FROM_DOC_COVERTITLE
+. rr #MISC
+. rr #COVER_MISC
+. rr #DOC_COVER_MISC
+. rr #COPYRIGHT
+. rr #COVER_COPYRIGHT
+. rr #DOC_COVER_COPYRIGHT
+. rr #COVER_AUTHOR
+. rr #DOC_COVER_AUTHOR
+. rm COVER_TEXT
+. rm DOC_COVER_TEXT
+. rm $COPYRIGHT
+. rm $COVER_COPYRIGHT
+. rm $DOC_COVER_COPYRIGHT
+. rr #END_QUOTE
+. rr #PAGENUM_STYLE_SET
+. rr #DOC_COVER
+. rr #COVER
+. rr #LAST_LEVEL
+. rr #LEVEL
+. if \\n[#RESTORE_PN_V_POS] \{\
+. nr #PAGE_NUM_V_POS \\n[#RESTORE_PN_V_POS]
+. rr #RESTORE_PN_V_POS
+. \}
+. nr #LOOP 0 1
+. while \\n+[#LOOP]<=\\n[@LEVEL] \
+. rr #TOC_HEAD_\\n[#LOOP]_INDENT_SET
+. if \\n[#FLEX_ACTIVE] .rr #NO_FLEX
+.END
+\#
+\# NUMBER_LINES
+\# ------------
+\# *Arguments:
+\# <starting line number> [ <increment> [ <gutter> ] ]
+\# or
+\# <anything> | RESUME
+\# *Function:
+\# Begin, suspend/turn off, or resume numbering of output lines.
+\#
+.MAC NUMBER_LINES END
+. if '\\n[.z]'EPI_TEXT' .return
+. if '\\$1'' \{\
+. tm1 "[mom]: NUMBER_LINES at line \\n[.c] has no argument.
+. tm1 " You have forgotten to give a starting line number or 'RESUME'.
+. ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. \}
+. if !\\n[#LINENUMBERS]=2 .nr #LINENUMBERS 1
+.\" Test whether the first arg is a digit.
+. if \B'\\$1' \{\
+. if \\n[#QUOTE] \{\
+. if \\n[#QUOTE]=1 .ds macro QUOTE
+. if \\n[#QUOTE]=2 .ds macro BLOCKQUOTE
+. tm1 "[mom]: \\$0 at line \\n[.c] may not be used inside \\*[macro].
+. tm1 " Please set NUMBER_LINES before \\*[macro], followed by
+. tm1 " NUMBER_\\*[macro]_LINES.
+. ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. \}
+. nr #LN \\$1
+. ds $LN_NUM \\$1
+. if !'\\n[.z]'' .nr #RESTORE_LN_NUM 1
+. ie '\\$2'' \
+. if '\\*[$LN_INC]'' .ds $LN_INC 1
+. el .ds $LN_INC \\$2
+. ie '\\$3'' \
+. if !\\n[#LN_GUTTER] .nr #LN_GUTTER 2
+. el .nr #LN_GUTTER \\$3
+. \}
+. ie !\\n[#LN] \{\
+.\" In other words, the first arg was not a digit.
+. rr #LN
+. ie '\\$1'RESUME' \{\
+. LN_PARAMS
+. nm \\*[$LN_NUM]
+. RESTORE_PARAMS
+. \}
+. el \{\
+. nm
+.\" Register ln is still set and may confuse preprocessors like tbl.
+.\" Still, resuming line numbering must be possible, so save ln in
+.\" $LN_NUM
+. ds $LN_NUM \\n[ln]
+. if !\\n[#QUOTE] .nr ln 0
+. if !\\n[#LINENUMBERS]=2 .rr #LINENUMBERS
+. \}
+. \}
+. el \{\
+. LN_PARAMS
+. nm \\*[$LN_NUM] \\*[$LN_INC] \\n[#LN_GUTTER] -3-\\n[#LN_GUTTER]
+. RESTORE_PARAMS
+. if !'\\n[.z]'' .nr #DIVER_LN_OFF 1
+. \}
+. rr #LN
+.END
+\#
+\# LINENUMBER STYLE PARAMETERS
+\# ---------------------------
+\# *Arguments:
+\# none
+\# *Function:
+\# LN_PARAMS sets parameters for line numbers.
+\# RESTORE_PARAMS restores them after internal calls to .nm
+\# *Notes:
+\# It's not documented, but groff's linenumbering is processed
+\# in a unique environment reserved for the numbers, such that
+\# whatever style params were in effect prior to the invocation
+\# of .nm remain in effect for the numbers even if the running
+\# text has different params. Eg, If you set .gcolor to 'purple'
+\# before .nm then set it back to what it was, the numbers will be
+\# purple while the text remains at the default color.
+\#
+.MAC LN_PARAMS END
+. ie d$LN_FAM .fam \\*[$LN_FAM]
+. el .fam \\n[.fam]
+. ie d$LN_FT .ft \\*[$LN_FT]
+. el .ft \\n[.sty]
+. ie d$LN_SIZE_CHANGE .ps \\*[$LN_SIZE_CHANGE]
+. el .ps \\n[.s]
+. ie d$LN_COLOR .COLOR \\*[$LN_COLOR]
+. el .gcolor \\n[.m]
+.END
+\#
+.MAC RESTORE_PARAMS END
+. fam
+. ft
+. ps
+. gcolor
+.END
+\#
+\# Whether, at COLLATE, to reset line number to 1.
+\#
+\# NUMBER LINES PER SECTION
+\# ------------------------
+\# *Argument:
+\# none
+\# *Function:
+\# Sets register that determines whether, at COLLATE, to reset
+\# line number to 1.
+\# *Notes:
+\# The default is to continue the line numbering from where it
+\# left off.
+\#
+.MAC NUMBER_LINES_PER_SECTION END
+. nr #PER_SECTION 1
+.END
+\#
+\# NUMBER QUOTE AND BLOCKQUOTE LINES AS PART OF RUNNING TEXT
+\# ---------------------------------------------------------
+\# *Argument:
+\# <gutter> | <anything>
+\# *Function:
+\# Sets #(B)QUOTE_LN to 1 if no argument, or a single numeric
+\# argument, is given; otherwise, turns (BLOCK)QUOTE linenumbering
+\# off.
+\# *Notes:
+\# #(B)QUOTE is checked for in QUOTE and BLOCKQUOTE.
+\# The single numeric argument allows establishing a different gutter from
+\# the one used for line numbers in running text.
+\#
+.MAC NUMBER_QUOTE_LINES END
+. ie \\n[#NUM_ARGS]=0 .nr #QUOTE_LN 1
+. el \{\
+. ie \B'\\$1' \{\
+. nr #QUOTE_LN 1
+. nr #Q_LN_GUTTER \\$1
+. \}
+. el \{\
+. ie '\\$1'SILENT' .nr #SILENT_QUOTE_LN 1
+. el \{\
+. rr #QUOTE_LN
+. rr #SILENT_QUOTE_LN
+. \}
+. \}
+. \}
+.END
+\#
+.MAC NUMBER_BLOCKQUOTE_LINES END
+. ie \\n[#NUM_ARGS]=0 .nr #BQUOTE_LN 1
+. el \{\
+. ie \B'\\$1' \{\
+. nr #BQUOTE_LN 1
+. nr #BQ_LN_GUTTER \\$1
+. \}
+. el \{\
+. ie '\\$1'SILENT' .nr #SILENT_BQUOTE_LN 1
+. el \{\
+. rr #BQUOTE_LN
+. rr #SILENT_BQUOTE_LN
+. \}
+. \}
+. \}
+.END
+\#
+\# OUTPUT BLANK PAGES
+\# ------------------
+\# *Argument:
+\# <number of blank pages to output> [ DIVIDER [ NULL ] ]
+\# *Function:
+\# Outputs blank pages.
+\# *Notes:
+\# If recto/verso, each page is recto/verso, even if there's
+\# nothing on it.
+\#
+\# The 1st argument to BLANKPAGE is non-optional. DIVIDER is for
+\# blank pages before endnotes, bibliographies, tocs, new chapters.
+\#
+.MAC BLANKPAGE END
+. nr #BLANKPAGE 1
+. nr #HOW_MANY \\$1
+. shift
+. nr #PAGES 0 1
+. if \\n[#LINENUMBERS] \{\
+. nr #LINENUMBERS_WERE_ON 1
+. NUMBER_LINES OFF
+. \}
+. while \\n+[#PAGES]<=\\n[#HOW_MANY] \{\
+. if \\n[#HEADERS_ON]=1 \{\
+. nr #HEADERS_WERE_ON 1
+. HEADERS OFF
+. \}
+. if \\n[#PAGE_NUM_V_POS]=1 \{\
+. if \\n[#PAGINATE]=1 .nr #PAGINATE_WAS_ON 1
+. nr #RESTORE_PN_V_POS \\n[#PAGE_NUM_V_POS]
+. PAGINATION OFF
+. \}
+. if \\n[#COLUMNS]=1 .nr #COLUMNS +1
+. NEWPAGE \" Break to blank page
+. nop \&
+. br
+. if \\n[#FOOTERS_ON]=1 \{\
+. nr #FOOTERS_WERE_ON 1
+. FOOTERS OFF
+. \}
+. if \\n[#PAGE_NUM_V_POS]=2 \{\
+. if \\n[#PAGINATE]=1 .nr #PAGINATE_WAS_ON 1
+. nr #RESTORE_PN_V_POS \\n[#PAGE_NUM_V_POS]
+. PAGINATION OFF
+. \}
+. if !'\\$1'DIVIDER' .if \\n[#HEADERS_WERE_ON] .HEADERS
+. \}
+. if \\n[#COLUMNS]=2 .nr #COLUMNS -1
+. NEWPAGE \" Break to text page
+. ie '\\$1'DIVIDER' \{\
+. if \\n[#BLANKPAGE_AFTER_DEFER] .bp
+. if \\n[#FOOTERS_WERE_ON] .FOOTERS
+. if \\n[#RESTORE_PN_V_POS] \{\
+. if \\n[#PAGINATE_WAS_ON] .PAGINATE
+. nr #PAGE_NUM_V_POS \\n[#RESTORE_PN_V_POS]
+. \}
+. if \\n[#HEADERS_WERE_ON] .HEADERS
+. shift
+. if '\\$1'NULL' .nr #PAGE_NUM_ADJ -\\n[#HOW_MANY]
+. \}
+. el \{\
+. if '\\$1'' \{\
+. if \\n[#FOOTERS_WERE_ON] .FOOTERS
+. if \\n[#RESTORE_PN_V_POS] \{\
+. if \\n[#PAGINATE_WAS_ON] .PAGINATE
+. nr #PAGE_NUM_V_POS \\n[#RESTORE_PN_V_POS]
+. \}
+. \}
+. if '\\$1'NULL' \{\
+. if \\n[#FOOTERS_WERE_ON] .FOOTERS
+. if \\n[#RESTORE_PN_V_POS]=2 \
+. nr #PAGE_NUM_V_POS \\n[#RESTORE_PN_V_POS]
+. if \\n[#PAGE_NUM_V_POS]=2 \
+. if \\n[#PAGINATE_WAS_ON] .PAGINATE
+. nr #PAGE_NUM_ADJ -\\n[#HOW_MANY]
+. \}
+. \}
+. if \\n[#PAGINATE]=1 \
+. if \\n[#RESTORE_PN_V_POS]=1 \{\
+. RESTORE_SPACE
+. sp |\\n[#HEADER_MARGIN]u
+. PRINT_PAGE_NUMBER
+. \}
+. if \\n[#LINENUMBERS_WERE_ON] .NUMBER_LINES RESUME
+. rr #HOW_MANY
+. rr #HEADERS_WERE_ON
+. rr #FOOTERS_WERE_ON
+. rr #PAGINATE_WAS_ON
+. rr #RESTORE_PN_V_POS
+.END
+\#
+\# FLOATS
+\# ------
+\#
+.am PSPIC \" Need to do this for PSPIC inside a float
+. vpt 0
+\h'(\\n[ps-offset]u + \\n[ps-deswid]u)'
+. sp -1
+. vpt
+..
+\#
+.MAC PROCESS_FLOATS END
+. if \\n[#TAB_ACTIVE] \{\
+. nr #RESTORE_TAB 1
+. TQ
+. \}
+. if !\\n[tbl*no-top-hook] .tbl@top-hook
+. rr tbl*no-top-hook
+. sp |\\n[#T_MARGIN]u-\\n[#DOC_LEAD]u
+. if r pdfbx-defer \{\
+. nr lead-diff \\n[#LEAD_AT_FOOTER]-\\n[.v]
+. sp |\\n[t]u-\\n[.v]u+\\n[lead-diff]u
+. rr pdfbx-defer
+. \}
+. nr defer-count \\n[defer]
+. nr #TMP_PAGE_OFFSET \\n[.o]
+. po \\n[#L_MARGIN]u
+. ev protect
+. evc FLOAT
+. nf
+. RESTORE_SPACE
+. if '\\*[float*type:\\n[defer]]'boxed-tbl:\\n[defer]' \{\
+. ch RR_@TOP
+.\" Get depth of the first deferred float when there's more than one.
+. if (\\n[.t] >= 1)&(\\n[float-depth:\\n[defer]] > (\\n[.t]+\\n[#DOC_LEAD])) \
+. tbl*float-warning
+. if \\n[#MLA] .sp \\n[tbl*label-lead-diff]u
+. if (\\n[tbl*have-caption:\\n[defer]]=1)&(\\n[tbl*caption-after-label]=0) \
+. sp \\n[tbl*caption-lead-diff]u
+. if \\n[tbl*caption-after-label] \
+. sp |\\n[#T_MARGIN]u-\\n[#DOC_LEAD]u
+. \}
+. if \\n[float*pic:1] \{\
+. if (\\n[pic*have-caption]=1)&(\\n[pic*caption-after-label]=0) \{\
+. ie \\n[#COLUMNS] \
+. sp |\\n[dc]u+\\n[pic*caption-lead-diff]u
+. el .sp |\\n[#T_MARGIN]u-\\n[#DOC_LEAD]u+\\n[pic*caption-lead-diff]u
+. \}
+. rr pic*caption-lead-diff
+. rr pic*top-lead-diff
+. rr float*pic
+. \}
+. if \\n[float*img:1] \{\
+. ie \\n[#COLUMNS] \
+. sp |\\n[dc]u
+. el \
+. sp |\\n[#T_MARGIN]u-\\n[#DOC_LEAD]u
+. if \\n[pdf-img:frame] \{\
+. sp -(\\*[pdf-img:frame-weight]p*2u)
+. rr pdf-img:frame
+. \}
+. \}
+. if \\n[defers] .rr defers
+. nr loop-count 0 1
+. nr new-defer 0 1
+. while \\n+[loop-count]<=\\n[defer-count] \{\
+. nr tbl*no-top-hook 1
+. rnn defer float*defer \" So '.if \n[defer]' is skipped during float output
+. vpt
+. ch RR_@TOP
+. rr @TOP
+. if \\n[pdf-img*have-caption] \
+. if !\\n[pdf-img*caption-after-label] .sp -.5v
+. rr pdf-img*have-caption
+. rr pic*have-caption
+. if '\\*[float*type:\\n[loop-count]]'table:\\n[loop-count]' \{\
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u
+. ch FN_OVERFLOW_TRAP -\\n[#FN_OVERFLOW_TRAP_POS]u
+. \}
+. ie !\\n[float-span:\\n[loop-count]] \{\
+. ie ((\\n[float-depth:\\n[loop-count]]-\\n[.v])>\\n[.t]):(\\n[D-float:\\n[loop-count]]>\\n[.t]):(\\n[defers]=1) \{\
+.\" Insufficient space, defer to next page
+. nr defers 1
+. rn FLOAT*DIV:\\n[loop-count] NEW*FLOAT*DIV:\\n+[new-defer]
+. rnn float-depth:\\n[loop-count] new-float-depth:\\n[new-defer]
+. rnn D-float:\\n[loop-count] new-D-float:\\n[new-defer]
+. \}
+. el \{\
+. output-float
+. ie !r pdfboxed \{\
+. ie (\\n[.t]-2)<(\\n[#DOC_LEAD]u/2) .SHIM_1
+. el .sp .5
+. \}
+. el .rr pdfboxed
+. \}
+. \}
+. el \{\
+. rr tbl*no-top-hook
+. if \\n[float-span:\\n[loop-count]] \
+. rn tbl*header-div:\\n[loop-count] tbl*header-div:span
+. ie !r pdfboxed \{\
+. output-float
+. sp .5
+. \}
+. el .rr pdfboxed
+. \}
+. if !\\n[loop-count]=\\n[defer-count] .rr flexed
+. rr float-span:\\n[loop-count]
+. rr float*tbl:\\n[loop-count]
+. rr tbl*have-caption:\\n[loop-count]
+. rr float*tbl*center:\\n[loop-count]
+. rr tbl*have-header:\\n[loop-count]
+. rm float*div:\\n[loop-count]
+. rr float-depth:\\n[loop-count]
+. rm tbl*header-div:\\n[loop-count]
+. rm float*type:\\n[loop-count]
+. \}
+. if !\\n[float*defer]=1 \{\
+. if !(\\n[loop-count]-1)=1 \{\
+. if !\\n[.t]=1 .sp -.5
+. \}
+. \}
+. if !\\n[@no-shim] \
+. if !\\n[q-float] \
+. if !\\n[#NO_SHIM] .SHIM
+.\" FLOAT arrays are empty now
+.\" Rename new arrays (FLOATs deferred to next page) to proper names
+. rr float*defer
+. rnn new-defer defer
+. nr loop-count 0 1
+. while \\n+[loop-count]<=\\n[defer] \{\
+. rn NEW*FLOAT*DIV:\\n[loop-count] FLOAT*DIV:\\n[loop-count]
+. rnn new-float-depth:\\n[loop-count] float-depth:\\n[loop-count]
+. rnn new-D-float:\\n[loop-count] D-float:\\n[loop-count]
+. \}
+. if !\\n[#TMP_PAGE_OFFSET]=\\n[.o] .po \\n[#TMP_PAGE_OFFSET]u
+. rr #TMP_PAGE_OFFSET
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u
+. ch FN_OVERFLOW_TRAP -\\n[#FN_OVERFLOW_TRAP_POS]u
+. if \\n[float-depth:1]>\\n[.t] .bp
+. ie !\\n[#NO_SHIM] .SHIM
+. el \{\
+. if !\\n[#NO_FLEX] \
+. if !\\n[flexed] .FLEX
+. \}
+. if !\\n[#NO_SHIM] \
+. if \\n[#SHIM]>(\\n[#DOC_LEAD]-(\\n[#DOC_LEAD]/4)) \
+' sp -\\n[#DOC_LEAD]u
+. ie !\\n[flex:force] .ns
+. el \{\
+. rr flex:force
+. if !\\n[#NO_FLEX] .FLEX
+. \}
+. nr tbl*have-header 0
+. rr tbl*have-caption
+. rr loop-count
+. rr defer-count
+. rr float*before-shim
+. rr float*after-shim
+. rm float-adj
+. rr check-indent
+. if \\n[#NEWPAGE] \{\
+. vpt
+' bp
+. rr #NEWPAGE
+. \}
+. rr float*img
+. rr float*eqn
+. rr float*tbl
+. rr float*pic
+. if \\n[#RESTORE_TAB] \{\
+. TAB \\n[#CURRENT_TAB]
+. rr #RESTORE_TAB
+. \}
+.END
+\#
+.MAC output-float END
+. if \\n[float*img] \{\
+. if \\n[loop-count]=1 .nr no-top-space:1 1
+. \}
+. vpt 0
+. if \\n[.ns] \{\
+. rs
+. nop \&
+. sp -1
+. \}
+. if \\n[no-top-space:1] \{\
+. ie !\\n[#COLUMNS] \{\
+. sp |\\n[#T_MARGIN]u-\\n[#DOC_LEAD]u
+. ns
+. \}
+. el .sp |\\n[dc]u
+. if \\n[float*tbl:1] \{\
+. if !\\n[no-top-space:1] .RESTORE_SPACE
+. ie \\n[tbl*caption-top-lead-diff] \{\
+. sp \\n[tbl*caption-top-lead-diff]u
+. rr tbl*caption-top-lead-diff
+. \}
+. el \{\
+. if '\\*[float*type:1]'boxed-tbl:1' \{\
+. ie (\\n[tbl*have-caption]=1)&(\\n[tbl*caption-after-label]=0) .sp .3n
+. el .sp (\\n[#DOC_LEAD]u/2u)+.3n
+. \}
+. \}
+. rr float*tbl:1
+. \}
+. if \\n[float*img:1] \{\
+. RESTORE_SPACE
+. if \\n[pdf-img*caption-top-lead-diff] \{\
+. sp \\n[pdf-img*caption-top-lead-diff]u
+. rr pdf-img*caption-top-lead-diff
+. \}
+. \}
+. \}
+. if \\n[float*pic] \{\
+. nr pic*top-space-adj \\n[#DOC_LEAD]-\\n[pic@text-lead]
+. if (\\n[pic*have-caption]=0):(\\n[pic*caption-after-label]=1) \
+. sp \\n[pic*top-space-adj]u
+. if \\n[#COLUMNS] \
+. if !'\\*[pic*space-adj:\\n[loop-count]]'' \
+. sp \\*[pic*space-adj:\\n[loop-count]]
+. \}
+. nf
+. if \\n[q-float] \
+. if !\\n[has-caption] .sp \\n[#Q_LEAD_DIFF]u
+. if \\n[Q-float]=2 .sp |\\n[t]u-.5v
+. ns
+. vpt
+. if \\n[check-indent] \{\
+. if \\n[#INDENT_LEFT_ACTIVE] \{\
+. in \\n[#L_INDENT]u/2u
+. \}
+. \}
+. rr no-top-space:1
+. if \\n[loop-count]>1 \{\
+. if !'\\*[float-adj:\\n[loop-count]]'' \{\
+. rs
+. sp \\*[float-adj:\\n[loop-count]]
+. ns
+. nr restore-v-pos 1
+. \}
+. \}
+. nr check-indent 1
+. FLOAT*DIV:\\n[loop-count]
+. if \\n[no-top-space:1] \
+. RESTORE_SPACE
+. if \\n[restore-v-pos] \{\
+. sp -\\*[float-adj:\\n[loop-count]]
+. rm float-adj:\\n[loop-count]
+. rr restore-v-pos
+. \}
+. if r float*img:1 \{\
+. sp .5
+. rr float*img:1
+. \}
+. if r Q-float:1 \{\
+. if !\\n[#FULLSPACE_QUOTES] .sp -.5
+. rr Q-float:1
+. \}
+. if \\n[#COLUMNS] \
+. if !'\\*[pic*space-adj:\\n[loop-count]]'' \
+. sp -\\*[pic*space-adj:\\n[loop-count]]
+. rm pic*space-adj:\\n[loop-count]
+. if \\n[D-float:1] .rr D-float:1
+. rr D-float
+. rr @no-shim
+. rr q-float
+. rm B_QUOTE
+. rm P_QUOTE
+.END
+\#
+\# FLOAT
+\# -----
+\# *Arguments:
+\# [ ADJUST +|-<amount> ] [ FORCE] [ SPAN] [ NO_SHIM] | [ NO_FLEX ] [ TARGET ] | <anything>
+\# *Function:
+\# Captures input in a diversion, which is output immediately if
+\# there's room on the page; otherwise outputs diversion at top of
+\# next page.
+\# *Notes:
+\# ADJUST allows for raising or lowering the contents of
+\# the diversion within the space allotted. FORCE breaks to
+\# a new page immediately.
+\#
+\#
+.MAC FLOAT END
+. nr ll-pre-float \\n[.l]
+. if \\n[#NUM_ARGS]>0 \{\
+. nr loop-count 0 1
+. nr loop-counter \\n[#NUM_ARGS]
+. while \\n+[loop-count]<=\\n[loop-counter] \{\
+. if '\\$1'FORCE' \{\
+. nr #FORCE 1
+. shift
+. \}
+. if '\\$1'SPAN' \{\
+. nr float-span 1
+. shift
+. \}
+. if '\\$1'ADJUST' \{\
+. shift
+. ds float-adj \\$1
+. shift
+. \}
+. if '\\$1'CENTER' \{\
+. nr center-float 1
+. shift
+. \}
+. if '\\$1'CENTRE' \{\
+. nr center-float 1
+. shift
+. \}
+. if '\\$1'INDENT' \{\
+. shift
+. nr indent-float \\$1
+. shift
+. \}
+. if '\\$1'RIGHT' \{\
+. nr right-float 1
+. shift
+. \}
+. if '\\$1'NO_SHIM' \{\
+. nr @no-shim 1
+. shift
+. \}
+. if '\\$1'NO_FLEX' \{\
+. nr @no-flex 1
+. shift 1
+. \}
+. if '\\$1'TARGET' \{\
+. shift
+. ds float*target "\\$1
+. shift 1
+. \}
+. \}
+. \}
+. ie \\n[float*started] .rr float*started
+. el \{\
+. while !'\\$1'' .shift 1
+. nr float*started 1
+. \}
+. ie '\\$1'' \{\
+.\" Harmonize floats treated as defers and floats proper to the top
+.\" of the next page between passes when flex is enabled.
+.\"
+.\" Without this, floats near the bottom of the page may be deferred
+.\" on the first pass, but when flex-spacing moves the line just
+.\" before the float to the bottom of the page, the upcoming .br
+.\" causes the float to be proper to the next page instead of
+.\" deferred to it.
+. nr floatnum +1
+. ie !\\n[#NO_FLEX] \{\
+.\" Only on 2nd pass
+. if !dPDF.EXPORT \{\
+. ie d float\\n[floatnum]:no-defer .br
+. el \{\
+.\" .v in the following is arbitrary. Groff rounds down decimal
+.\" fractions so flex-spacing may be slightly short. Since there
+.\" are no conditions under which a .t-1 (bottom margin) < .v
+.\" on the 1st pass doesn't cause a float to be deferred, all floats
+.\" on the second pass that meet the condition are also, correctly,
+.\" deferred.
+. if (\\n[.t]-1)<\\n[.v] \
+. if !\\n[@TOP] .nr no-break 1
+. \}
+. \}
+.\" Only on 1st pass
+. ie !\\n[no-break] \{\
+. ds pre-float:page@col \\n%@\\n[#COL_NUM]
+. br
+. ds post-float:page@col \\n%@\\n[#COL_NUM]
+. if dPDF.EXPORT \{\
+. if !'\\*[pre-float:page@col]'\\*[post-float:page@col]' \
+. tm .ds float\\n[floatnum]:no-defer 1
+. \}
+. \}
+. el .rr no-break
+. \}
+. el .br
+. if \\n[nl]=\\n[#PAGE_TOP] \
+. RESTORE_SPACE
+. ds ev-pre-float \\n[.ev]
+. ev FLOAT
+. evc \\*[ev-pre-float]
+. if \\n[.u] .nr fill-pre-float 1 \" Needed for tbl
+. di FLOAT*DIV
+. if !'\\*[float*target]'' .PDF_TARGET "\\*[float*target]
+. rm float*target
+. nf
+. \}
+. el \{\
+. br
+.\" So @no-shim persists if float output with output-float
+. if r @no-shim .nr float*no-shim 1
+. if \\n[float-span] \{\
+. nr span 1
+\!. rr span
+. \}
+\!. rm tbl*header-div:span
+\!. nr tbl*no-print-header 1
+. di
+. if \\n[float-span] \{\
+. nr dn-save \\n[dn]
+. da FLOAT*DIV
+\!. rr float-span
+. da
+. nr dn \\n[dn-save]
+. rr dn-save
+. \}
+. ie \\n[float*tbl] \
+. if !\\n[tbl*have-header] .ev 0
+. el .ev 0
+. if \\n[tbl*boxed] \{\
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u+\\n[#DOC_LEAD]u
+. ch FN_OVERFLOW_TRAP -\\n[#FN_OVERFLOW_TRAP_POS]u+\\n[#DOC_LEAD]u
+. ie !\\n[#MLA] \{\
+. ie (\\n[tbl@label]=1):(\\n[tbl@source]=1):(\\n[tbl*autolabel]=1) .nr dn -.65v
+. el .nr dn +.65v
+. rr tbl@label
+. rr tbl@source
+. \}
+. el .if !\\n[tbl@source] .nr dn -1.65v
+. \}
+.\" Defer float
+. if (\\n[dn]>\\n[.t]):(\\n[D-float]>\\n[.t]):(\\n[defer]>0) \{\
+. if !\\n[float-span] \{\
+. if (\\n[dn]+(\\n[.v]*2)>(\\n[.p]-\\n[#TOP_MARGIN]-\\n[#DOC_LEAD]-\\n[#B_MARGIN])) \{\
+. tm1 "[mom]: Floated element exceeds page depth.
+. ab [mom]: Aborting '\\n[.F]' at line \\n[.c].
+. \}
+. \}
+.\" Save depth of diversion here. The .da zeroes it.
+. nr dn-save \\n[dn]
+. if \\n[#FLEX_ACTIVE] \{\
+. if !\\n[@no-flex] \{\
+. da FLOAT*DIV
+\!. FLEX
+\!. nr flexed 1
+. da
+. \}
+. \}
+. nr dn \\n[dn-save]
+. rr dn-save
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u
+. ch FN_OVERFLOW_TRAP -\\n[#FN_OVERFLOW_TRAP_POS]u
+. ev 0
+. ie \\n[@TOP] \{\
+. br
+. if \\n[tbl*boxed] .rs
+. rr tbl*boxed
+. \}
+. el \{\
+. if !\\n[defer] .nr defer 0 1
+. rn FLOAT*DIV FLOAT*DIV:\\n+[defer]
+. if !'\\*[float-adj]'' \
+. rn float-adj float-adj:\\n[defer]
+. if \\n[float-span] \
+. if !\\n[tbl*boxed] .rnn float-span float-span:\\n[defer]
+. if \\n[float*tbl] \{\
+. if \\n[defer]>0 \{\
+. nr no-top-space:\\n[defer] 1
+. nr float*tbl:\\n[defer] 1
+. if \\n[tbl*have-caption] \
+. nr tbl*have-caption:\\n[defer] 1
+. \}
+. ie \\n[tbl*boxed] \
+. ds float*type:\\n[defer] boxed-tbl:\\n[defer]
+. el .ds float*type:\\n[defer] table:\\n[defer]
+. if \\n[tbl*center] .nr float*tbl-center:\\n[defer] 1
+. if \\n[tbl*have-header] .rnn tbl*have-header tbl*have-header:\\n[defer]
+. rn tbl*header-div tbl*header-div:\\n[defer]
+. rr tbl*center
+. \}
+. if \\n[float*eqn] \{\
+. if \\n[defer]=1 .nr no-top-space:\\n[defer] 1
+. ds float*type:\\n[defer] eqn
+. \}
+. if \\n[float*pic] \{\
+. ds float*type:\\n[defer] pic
+. nr float*pic:\\n[defer] 1
+. rn pic*space-adj pic*space-adj:\\n[defer]
+. \}
+. if \\n[float*img] \{\
+. ds float*type:\\n[defer] img
+. nr float*img:\\n[defer] 1
+. nr no-top-space:\\n[defer] 1
+. \}
+. if \\n[D-float] .nr D-float:\\n[defer] \\n[D-float]
+. if \\n[Q-float] .nr Q-float:\\n[defer] \\n[#Q-float]
+. nr float-depth:\\n[defer] \\n[dn]
+. if \\n[#FORCE] \{\
+. ie \\n[#COLUMNS] .COL_NEXT
+. el .NEWPAGE
+. rr #FORCE
+. \}
+. if \\n[tbl*boxed] .rr tbl*boxed
+. if \\n[table] .rr table
+. br
+. return \" output div after header
+. \}
+. \}
+. nr dn-save \\n[dn]
+. if \\n[#FLEX_ACTIVE] \{\
+. if !\\n[@no-flex] \{\
+. da FLOAT*DIV
+\!. FLEX
+\!. nr flexed 1
+. da
+. \}
+. \}
+. nr dn \\n[dn-save]
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u
+. ch FN_OVERFLOW_TRAP -\\n[#FN_OVERFLOW_TRAP_POS]u
+. vpt 0
+. if !'\\*[float-adj]'' .sp \\*[float-adj]
+. if \\n[.u] .nr fill 1
+. if \\n[@TOP] \{\
+. nr no-adjust 1
+. rr @TOP
+. \}
+. if \\n[float*tbl] \{\
+. if (\\n[#MLA]=1)&(\\n[tbl@source]=0) \
+. chop FLOAT*DIV
+. if \\n[nl]=\\n[#PAGE_TOP] \{\
+. ie (\\n[tbl*have-caption]=1)&(\\n[tbl*caption-after-label]=0) \{\
+. ie !\\n[#MLA] .sp \\n[tbl*caption-lead-diff]u
+. el .ch RR_@TOP
+. \}
+. el \{\
+. ev protect
+. evc FLOAT
+. nf
+. rs
+. ie \\n[tbl*boxed] .sp |\\n[#PAGE_TOP]u+.3n
+. el .sp |\\n[#PAGE_TOP]u-.25v
+. \}
+. \}
+. \}
+. if \\n[float*img] \
+. if \\n[pdf-img:frame] \
+. sp -(\\*[pdf-img:frame-weight]p*2u)
+. if !'\\n[.ev]'protect' \{\
+. ev protect
+. evc FLOAT
+' nf
+. \}
+. if \\n[float*tbl] \{\
+. if \\n[tbl*boxed] \
+. if \\n[tbl*center] \
+. if \\n[#L_INDENT] \
+. in -\\n[#L_INDENT]u/2u
+. \}
+. if \\n[center-float] \
+. in (\\n[.l]u-\\n[dl]u)/2u
+. if \\n[indent-float] \
+. in \\n[indent-float]u
+. if \\n[right-float] \
+. in \\n[.l]u-\\n[dl]u
+. FLOAT*DIV
+. if (\\n[center-float]>0):(\\n[indent-float]>0):(\\n[right-float]>0) \
+. in
+. ev
+. if \\n[float*tbl] \{\
+. rr tbl*no-print-header
+. ie \\n[tbl*boxed] \{\
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u
+. ch FN_OVERFLOW_TRAP -\\n[#FN_OVERFLOW_TRAP_POS]u
+. ie \\n[nl]>(\\n[.p]+\\n[#VARIABLE_FOOTER_POS]) \{\
+. ie \\n[#COLUMNS] .COL_NEXT
+. el .NEWPAGE
+. \}
+. el \{\
+. if \\n[dn-save]=\\n[bx-tbl-depth] .sp .35v
+. rr dn-save
+. if !\\n[tbl*plain-boxed] \{\
+. if !\\n[tbl*autolabel] \{\
+. if !\\n[#MLA] \{\
+. if \\n[tbl@label]=1 .sp .5
+. \}
+. \}
+. \}
+. rr tbl*boxed
+. rr bx-tbl-depth
+. \}
+. \}
+. el \{\
+. if !'\\*[tbl*label]'' \
+. if \\n[tbl*autolabel]=0 .sp .5
+. \}
+. rr float*tbl
+. rr tbl*center
+. rm tbl*header-div
+. rr tbl*have-caption
+. rr tbl*have-label
+. rr tbl*have-source
+. rm tbl*caption
+. rm tbl*label
+. rm tbl*source
+. \}
+. if \\n[float*img] \
+. if (\\n[.t]-1)>(\\n[#DOC_LEAD]u/2u) .sp .5
+. if \\n[D-float] \{\
+. ie \\n[dn]=0 .sp \\n[D-float]u+\\n[#DOC_LEAD]u
+. el \
+. if \\n[dn]<\\n[D-float] \
+. sp \\n[D-float]u+\\n[#DOC_LEAD]u-\\n[dn]u
+.\" Flex won't grab .h of D-floats without a dummy text line.
+. vpt 0
+. nop \&
+. sp -1
+. vpt 1
+. \}
+. if \\n[fill] \{\
+. fi
+. rr fill
+. \}
+. rm FLOAT*DIV
+. if !'\\*[float-adj]'' \
+. if !\\n[no-adjust] .sp -\\*[float-adj]
+. vpt
+. if \\n[Q-float] \{\
+. sp .5
+. rr Q-float
+. \}
+. if !\\n[#NO_SHIM] \
+. if !\\n[@no-shim] .SHIM
+. rm float-adj
+. rm no-adjust
+. rr center-float
+. rr indent-float
+. rr right-float
+. rr D-float
+. rr @no-shim
+. rr @no-flex
+. rr #FORCE
+. rm P_QUOTE
+. rm B_QUOTE
+. if \\n[float*img] .rr float*img
+. if \\n[float*pic] .rr float*pic
+. if \\n[float*eqn] .rr float*eqn
+. rr float*target
+. rm float*target
+. if \\n[#NO_SHIM] \
+. if !\\n[#NO_FLEX] .nr post-float 1
+. ev \\*[ev-pre-float]
+. rr fill-pre-float
+. rm ev-pre-float
+. \}
+.END
+\#
+\# SET TRAPS FOR HEADERS/FOOTERS/FOOTNOTES
+\# ---------------------------------------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Sets header/footer/footnotes/etc... traps.
+\#
+\# TRAPS calculates the number of lines that actually fit on a
+\# page based on #B_MARGIN and resets page bottom trap to coincide
+\# with the depth of that number of lines, or, if #ADJ_DOC_LEAD=1,
+\# adjusts #DOC_LEAD so that the last line of text on a page falls
+\# exactly on #B_MARGIN.
+\#
+.MAC RR_@TOP END \" Trap-invoked after first line of text on a new page
+. rr @TOP
+. if \\n[.ns] \{\
+. vpt 0
+. rs
+. if \\n[.u] .nr fill 1
+. nf
+. nop \&
+. sp -1
+. if \\n[fill] .fi
+. if r #NEWPAGE .rr #NEWPAGE
+. \}
+. if \\n[.vpt]=0 .vpt
+.END
+\#
+.MAC TRAPS END
+. if !\\n[#UNADJUSTED_DOC_LEAD] .nr #UNADJUSTED_DOC_LEAD \\n[#DOC@LEAD]
+.\" Remove all header/footer traps
+. if !\\n[#NO_TRAP_RESET] \{\
+. ch DO_T_MARGIN
+. ch DO_B_MARGIN
+. ch HEADER
+. ch FOOTER
+. ch FN_OVERFLOW_TRAP
+.\" Plant header trap
+. wh 0 HEADER
+. \}
+.\" Adjust lead so last line of text falls on B_MARGIN
+. nr #LINES_PER_PAGE 0 1
+. nr #DOC_LEAD_ADJ 0 1
+. nr #DEPTH_TO_B_MARGIN \\n[#PAGE_LENGTH]-\\n[#ORIGINAL_B_MARGIN]-\\n[#DOC_LEAD]
+.\" Get the number of unadjusted lines that fit on the page; always a
+.\" bit short of the bottom margin
+. while \\n[#T_MARGIN]+(\\n[#DOC_LEAD]*\\n+[#LINES_PER_PAGE])<\\n[#DEPTH_TO_B_MARGIN] \{\
+.
+. \}
+. nr #LINES_PER_PAGE -1
+.\" Add machine units, 1 at a time, increasing the leading until the
+.\" new leading fills the page properly
+. while \\n[#T_MARGIN]+(\\n[#DOC_LEAD]+\\n+[#DOC_LEAD_ADJ]*\\n[#LINES_PER_PAGE])<=\\n[#DEPTH_TO_B_MARGIN] \{\
+.
+. \}
+. DOC_LEAD \\n[#DOC_LEAD]u+\\n[#DOC_LEAD_ADJ]u
+.\" The "visual" bottom margin is what \n[nl] would report on the
+.\" last line before the FOOTER trap is sprung
+. nr #VISUAL_B_MARGIN \\n[#T_MARGIN]+(\\n[#LINES_PER_PAGE]*\\n[#DOC_LEAD])
+.\" Get the difference between #B_MARGIN and #VISUAL_B_MARGIN
+. nr #FOOTER_DIFF (\\n[#PAGE_LENGTH]-\\n[#B_MARGIN])-\\n[#VISUAL_B_MARGIN]
+.\" Set #B_MARGIN to 1 machine unit lower on the page than #VISUAL_B_MARGIN
+. nr #B_MARGIN \\n[#B_MARGIN]+(\\n[#FOOTER_DIFF]-1)
+.\" Set the FN_OVERFLOW_TRAP position
+. nr #FN_OVERFLOW_TRAP_POS \\n[#B_MARGIN]-\\n[#FN_LEAD]
+. if \\n[#PRINT_STYLE]=1 .nr #FN_OVERFLOW_TRAP_POS \\n[#ORIGINAL_B_MARGIN]u
+.\" Set footer and footnote overflow traps
+. if !\\n[#NO_TRAP_RESET] \{\
+. nr #FN_COUNT 0 1
+. nr #SPACE_REMAINING 0
+. nr #FN_DEPTH 0
+. nr #VARIABLE_FOOTER_POS 0-\\n[#B_MARGIN]u
+. wh \\n[.p]u FOOTER
+. wh -(\\n[#FN_OVERFLOW_TRAP_POS]u) FN_OVERFLOW_TRAP
+. ch FOOTER -\\n[#B_MARGIN]u
+. \}
+.END
+\#
+\# CHECK INDENT
+\# ------------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Adds left, right, or both indent values to document elements
+\# like heads and subheads that are processed in environments.
+\#
+.MAC CHECK_INDENT END
+. if \\n[#INDENT_LEFT_ACTIVE] \{\
+. in \\n[#L_INDENT]u
+. if \\n[#QUOTE] \{\
+. in -\\n[#L_INDENT]u \"Because we added an indent in 2nd line of macro
+. ll -\\n[#L_INDENT]u
+. ta \\n[.l]u
+. \}
+. if \\n[#EPIGRAPH] \{\
+. in -\\n[#L_INDENT]u
+. ll -\\n[#L_INDENT]u
+. ta \\n[.l]u
+. \}
+. \}
+. if \\n[#INDENT_RIGHT_ACTIVE] \{\
+. ll -\\n[#R_INDENT]u
+. ta \\n[.l]u
+. \}
+. if \\n[#INDENT_BOTH_ACTIVE] \{\
+. in \\n[#BL_INDENT]u
+. ll -\\n[#BR_INDENT]u
+. ta \\n[.l]u
+. if \\n[#QUOTE] \{\
+. in -\\n[#BL_INDENT]u
+. ie \\n[#BR_INDENT]=\\n[#BL_INDENT] \{\
+. ll -\\n[#BR_INDENT]u
+. ta \\n[.l]u
+. \}
+. el \{\
+. ll -(\\n[#BR_INDENT]u/2u)
+. ta \\n[.l]u
+. \}
+. \}
+. if \\n[#EPIGRAPH] \{\
+. in -\\n[#BL_INDENT]u
+. ie \\n[#BR_INDENT]=\\n[#BL_INDENT] \{\
+. ll -\\n[#BR_INDENT]u
+. ta \\n[.l]u
+. \}
+. el \{\
+. ll -(\\n[#BR_INDENT]u/2u)
+. ta \\n[.l]u
+. \}
+. \}
+. \}
+.END
+\#
+\# REMOVE INDENT
+\# -------------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Removes left, right, or both indent values from document elements
+\# like heads and subheads that are processed in environments.
+\#
+.MAC REMOVE_INDENT END
+. in 0
+. ll \\n[#L_LENGTH]u
+. ta \\n[.l]u
+.END
+\#
+\# This .em (for all DOC_TYPEs, except 4 [LETTER]) ensures that
+\# deferred footnotes and floats that happen on the 2nd to last page
+\# get output, and the last page/col isn't flexed.
+\#
+.MAC TERMINATE END
+. if dPDF.EXPORT .tm .ds last-page \\n%@\\n[#COL_NUM]
+. ie \\n[#FN_DEPTH] \{\
+. ie \\n[#FN_DEFER] \{\
+. br
+. nr #TERMINATE 1
+. FOOTNOTE
+. nf
+. FOOTNOTE OFF
+. \}
+. el \{\
+. br
+. ch FN_OVERFLOW_TRAP
+. FOOTER
+. \}
+. \}
+. el \{\
+. br
+. ch FN_OVERFLOW_TRAP
+. FOOTER
+. \}
+. if \\n[defer] \
+' bp
+.END
+\#
+\# END MACRO FOR LETTERS
+\# ---------------------
+\# *Arguments:
+\# none
+\# *Function:
+\# The .em macro executed at the end of letters. Turns footers
+\# and pagination off, terminates and outputs diversion CLOSING
+\# (indented with the author's name underneath).
+\#
+.MAC ALL_DONE END
+. ch FOOTER
+. ch HEADER
+. br
+. if \\n[#DOC_TYPE]=4 \{\
+. if !'\\n[.z]'' \{\
+. br
+. ALD \\*[$SIG_SPACE]
+. di
+. \}
+. IQ CLEAR
+. TQ
+. LEFT
+. ie !'\\*[$CLOSE_INDENT]'' .IL \\*[$CLOSE_INDENT]
+. el .IL \\n[#DOC_L_LENGTH]u/2u
+. sp
+. if \\n[#CLOSING] \{\
+. CLOSING_TEXT
+. br
+. \}
+. PRINT \\*[$AUTHOR_1]
+. \}
+.END
+\#
+\# Set up a default papersize of US letter
+\#
+.PAGEWIDTH 8.5i
+.PAGELENGTH 11i
+\#
+\# ====================================================================
+\#
+\# +++DOCUMENT PROCESSING ALIASES+++
+\#
+\# Create aliases to make life easier for users: synonyms, short forms
+\# and alternate spellings.
+\#
+.ALIAS CITATION BLOCKQUOTE
+.ALIAS CITE BLOCKQUOTE
+.ALIAS DOC_R_MARGIN DOC_RIGHT_MARGIN
+.ALIAS DOC_L_MARGIN DOC_LEFT_MARGIN
+.ALIAS DOC_L_LENGTH DOC_LINE_LENGTH
+.ALIAS DOC_RMARGIN DOC_RIGHT_MARGIN
+.ALIAS DOC_LMARGIN DOC_LEFT_MARGIN
+.ALIAS DOC_LLENGTH DOC_LINE_LENGTH
+.ALIAS DOC_FAM DOC_FAMILY
+.ALIAS DOC_LS DOC_LEAD
+.ALIAS DOC_PS DOC_PT_SIZE
+.ALIAS FILL QUAD
+.ALIAS PAGENUM PAGENUMBER
+.ALIAS PAGINATION PAGINATE
+.ALIAS PP_FT PP_FONT
+.ALIAS TOC_PS TOC_PT_SIZE
+\#
+\# HEADER and FOOTER macros
+\# ------------------------
+\# Because the type-style of headers and footers are managed
+\# identically, and the type-style macros (_<type parameter>) all
+\# require the correct name of the calling macro, it's necessary
+\# to create HEADER_ and FOOTER_ macros here that are basically
+\# aliases with an argument.
+\#
+.MAC FOOTER_CENTER_COLOR END
+. HDRFTR_CENTER_COLOR \\$1
+.END
+\#
+.MAC FOOTER_CENTER_COLOUR END
+. HDRFTR_CENTER_COLOR \\$1
+.END
+\#
+.MAC FOOTER_CENTER_FAM END
+. HDRFTR_CENTER_FAMILY \\$1
+.END
+\#
+.MAC FOOTER_CENTER_FAMILY END
+. HDRFTR_CENTER_FAMILY \\$1
+.END
+\#
+.MAC FOOTER_CENTER_FONT END
+. HDRFTR_CENTER_FONT \\$1
+.END
+\#
+.MAC FOOTER_CENTER_FT END
+. HDRFTR_CENTER_FONT \\$1
+.END
+\#
+.MAC FOOTER_CENTER_PS END
+. HDRFTR_CENTER_SIZE \\$1
+.END
+\#
+.MAC FOOTER_CENTER_SIZE END
+. HDRFTR_CENTER_SIZE \\$1
+.END
+\#
+.MAC FOOTER_CENTRE_CAPS END
+. HDRFTR_CENTER_CAPS \\$1
+.END
+\#
+.MAC FOOTER_CENTRE_COLOR END
+. HDRFTR_CENTER_COLOR \\$1
+.END
+\#
+.MAC FOOTER_CENTRE_COLOUR END
+. HDRFTR_CENTER_COLOR \\$1
+.END
+\#
+.MAC FOOTER_CENTRE_FAM END
+. HDRFTR_CENTER_FAMILY \\$1
+.END
+\#
+.MAC FOOTER_CENTRE_FAMILY END
+. HDRFTR_CENTER_FAMILY \\$1
+.END
+\#
+.MAC FOOTER_CENTRE_FONT END
+. HDRFTR_CENTER_FONT \\$1
+.END
+\#
+.MAC FOOTER_CENTRE_FT END
+. HDRFTR_CENTER_FONT \\$1
+.END
+\#
+.MAC FOOTER_CENTRE_PS END
+. HDRFTR_CENTER_SIZE \\$1
+.END
+\#
+.MAC FOOTER_CENTRE_SIZE END
+. HDRFTR_CENTER_SIZE \\$1
+.END
+\#
+.MAC FOOTER_COLOR END
+. HDRFTR_COLOR \\$1
+.END
+\#
+.MAC FOOTER_COLOUR END
+. HDRFTR_COLOR \\$1
+.END
+\#
+.MAC FOOTER_FAM END
+. HDRFTR_FAMILY \\$1
+.END
+\#
+.MAC FOOTER_FAMILY END
+. HDRFTR_FAMILY \\$1
+.END
+\#
+.MAC FOOTER_LEFT_COLOR END
+. HDRFTR_LEFT_COLOR \\$1
+.END
+\#
+.MAC FOOTER_LEFT_COLOUR END
+. HDRFTR_LEFT_COLOR \\$1
+.END
+\#
+.MAC FOOTER_LEFT_FAM END
+. HDRFTR_LEFT_FAMILY \\$1
+.END
+\#
+.MAC FOOTER_LEFT_FAMILY END
+. HDRFTR_LEFT_FAMILY \\$1
+.END
+\#
+.MAC FOOTER_LEFT_FONT END
+. HDRFTR_LEFT_FONT \\$1
+.END
+\#
+.MAC FOOTER_LEFT_FT END
+. HDRFTR_LEFT_FONT \\$1
+.END
+\#
+.MAC FOOTER_LEFT_PS END
+. HDRFTR_LEFT_SIZE \\$1
+.END
+\#
+.MAC FOOTER_LEFT_SIZE END
+. HDRFTR_LEFT_SIZE \\$1
+.END
+\#
+.MAC FOOTER_RIGHT_COLOR END
+. HDRFTR_RIGHT_COLOR \\$1
+.END
+\#
+.MAC FOOTER_RIGHT_COLOUR END
+. HDRFTR_RIGHT_COLOR \\$1
+.END
+\#
+.MAC FOOTER_RIGHT_FAM END
+. HDRFTR_RIGHT_FAMILY \\$1
+.END
+\#
+.MAC FOOTER_RIGHT_FAMILY END
+. HDRFTR_RIGHT_FAMILY \\$1
+.END
+\#
+.MAC FOOTER_RIGHT_FONT END
+. HDRFTR_RIGHT_FONT \\$1
+.END
+\#
+.MAC FOOTER_RIGHT_FT END
+. HDRFTR_RIGHT_FONT \\$1
+.END
+\#
+.MAC FOOTER_RIGHT_PS END
+. HDRFTR_RIGHT_SIZE \\$1
+.END
+\#
+.MAC FOOTER_RIGHT_SIZE END
+. HDRFTR_RIGHT_SIZE \\$1
+.END
+\#
+.MAC FOOTER_RULE_COLOR END
+. HDRFTR_RULE_COLOR \\$1
+.END
+\#
+.MAC FOOTER_SIZE END
+. HDRFTR_SIZE \\$1
+.END
+\#
+.MAC HEADER_CENTER_COLOR END
+. HDRFTR_CENTER_COLOR \\$1
+.END
+\#
+.MAC HEADER_CENTER_COLOUR END
+. HDRFTR_CENTER_COLOR \\$1
+.END
+\#
+.MAC HEADER_CENTER_FAM END
+. HDRFTR_CENTER_FAMILY \\$1
+.END
+\#
+.MAC HEADER_CENTER_FAMILY END
+. HDRFTR_CENTER_FAMILY \\$1
+.END
+\#
+.MAC HEADER_CENTER_FONT END
+. HDRFTR_CENTER_FONT \\$1
+.END
+\#
+.MAC HEADER_CENTER_FT END
+. HDRFTR_CENTER_FONT \\$1
+.END
+\#
+.MAC HEADER_CENTER_PS END
+. HDRFTR_CENTER_SIZE \\$1
+.END
+\#
+.MAC HEADER_CENTER_SIZE END
+. HDRFTR_CENTER_SIZE \\$1
+.END
+\#
+.MAC HEADER_CENTRE_COLOR END
+. HDRFTR_CENTER_COLOR \\$1
+.END
+\#
+.MAC HEADER_CENTRE_COLOUR END
+. HDRFTR_CENTER_COLOR \\$1
+.END
+\#
+.MAC HEADER_CENTRE_FAM END
+. HDRFTR_CENTER_FAMILY \\$1
+.END
+\#
+.MAC HEADER_CENTRE_FAMILY END
+. HDRFTR_CENTER_FAMILY \\$1
+.END
+\#
+.MAC HEADER_CENTRE_FONT END
+. HDRFTR_CENTER_FONT \\$1
+.END
+\#
+.MAC HEADER_CENTRE_FT END
+. HDRFTR_CENTER_FONT \\$1
+.END
+\#
+.MAC HEADER_CENTRE_PS END
+. HDRFTR_CENTER_SIZE \\$1
+.END
+\#
+.MAC HEADER_CENTRE_SIZE END
+. HDRFTR_CENTER_SIZE \\$1
+.END
+\#
+.MAC HEADER_COLOR END
+. HDRFTR_COLOR \\$1
+.END
+\#
+.MAC HEADER_COLOUR END
+. HDRFTR_COLOR \\$1
+.END
+\#
+.MAC HEADER_FAM END
+. HDRFTR_FAMILY \\$1
+.END
+\#
+.MAC HEADER_FAMILY END
+. HDRFTR_FAMILY \\$1
+.END
+\#
+.MAC HEADER_LEFT_COLOR END
+. HDRFTR_LEFT_COLOR \\$1
+.END
+\#
+.MAC HEADER_LEFT_COLOUR END
+. HDRFTR_LEFT_COLOR \\$1
+.END
+\#
+.MAC HEADER_LEFT_FAM END
+. HDRFTR_LEFT_FAMILY \\$1
+.END
+\#
+.MAC HEADER_LEFT_FAMILY END
+. HDRFTR_LEFT_FAMILY \\$1
+.END
+\#
+.MAC HEADER_LEFT_FONT END
+. HDRFTR_LEFT_FONT \\$1
+.END
+\#
+.MAC HEADER_LEFT_FT END
+. HDRFTR_LEFT_FONT \\$1
+.END
+\#
+.MAC HEADER_LEFT_PS END
+. HDRFTR_LEFT_SIZE \\$1
+.END
+\#
+.MAC HEADER_LEFT_SIZE END
+. HDRFTR_LEFT_SIZE \\$1
+.END
+\#
+.MAC HEADER_RIGHT_COLOR END
+. HDRFTR_RIGHT_COLOR \\$1
+.END
+\#
+.MAC HEADER_RIGHT_COLOUR END
+. HDRFTR_RIGHT_COLOR \\$1
+.END
+\#
+.MAC HEADER_RIGHT_FAM END
+. HDRFTR_RIGHT_FAMILY \\$1
+.END
+\#
+.MAC HEADER_RIGHT_FAMILY END
+. HDRFTR_RIGHT_FAMILY \\$1
+.END
+\#
+.MAC HEADER_RIGHT_FONT END
+. HDRFTR_RIGHT_FONT \\$1
+.END
+\#
+.MAC HEADER_RIGHT_FT END
+. HDRFTR_RIGHT_FONT \\$1
+.END
+\#
+.MAC HEADER_RIGHT_PS END
+. HDRFTR_RIGHT_SIZE \\$1
+.END
+\#
+.MAC HEADER_RIGHT_SIZE END
+. HDRFTR_RIGHT_SIZE \\$1
+.END
+\#
+.MAC HEADER_RULE_COLOR END
+. HDRFTR_RULE_COLOR \\$1
+.END
+\#
+.MAC HEADER_SIZE END
+. HDRFTR_SIZE \\$1
+.END
+\#
+\# Aliases for other HEADER and FOOTER macros.
+\#
+.ALIAS BIBLIOGRAPHY_FOOTER_CENTER BIBLIOGRAPHY_HDRFTR_CENTER
+.ALIAS BIBLIOGRAPHY_FOOTER_CENTRE BIBLIOGRAPHY_HDRFTR_CENTER
+.ALIAS BIBLIOGRAPHY_HEADER_CENTER BIBLIOGRAPHY_HDRFTR_CENTER
+.ALIAS BIBLIOGRAPHY_HEADER_CENTRE BIBLIOGRAPHY_HDRFTR_CENTER
+.
+.ALIAS ENDNOTES_FOOTER_CENTER ENDNOTES_HDRFTR_CENTER
+.ALIAS ENDNOTES_FOOTER_CENTRE ENDNOTES_HDRFTR_CENTER
+.ALIAS ENDNOTES_HEADER_CENTER ENDNOTES_HDRFTR_CENTER
+.ALIAS ENDNOTES_HEADER_CENTRE ENDNOTES_HDRFTR_CENTER
+.
+.ALIAS FOOTER_CENTER HDRFTR_CENTER
+.ALIAS TOC_PAGEFOOTER_CENTER HDRFTR_CENTER
+.ALIAS TOC_PAGEFOOTER_CENTRE HDRFTR_CENTER
+.ALIAS FOOTER_CENTER_CAPS _HDRFTR_CAPS
+.ALIAS FOOTER_CENTER_PAD HDRFTR_CENTER_PAD
+.ALIAS FOOTER_CENTER_SMALLCAPS _HDRFTR_SMALLCAPS
+.ALIAS FOOTER_CENTRE HDRFTR_CENTER
+.ALIAS FOOTER_CENTRE_CAPS _HDRFTR_CAPS
+.ALIAS FOOTER_CENTRE_PAD HDRFTR_CENTER_PAD
+.ALIAS FOOTER_CENTRE_SMALLCAPS _HDRFTR_SMALLCAPS
+.ALIAS FOOTER_LEFT HDRFTR_LEFT
+.ALIAS FOOTER_LEFT_CAPS _HDRFTR_CAPS
+.ALIAS FOOTER_LEFT_SMALLCAPS _HDRFTR_SMALLCAPS
+.ALIAS FOOTER_PLAIN HDRFTR_PLAIN
+.ALIAS FOOTER_RECTO HDRFTR_RECTO
+.ALIAS FOOTER_RIGHT HDRFTR_RIGHT
+.ALIAS FOOTER_RIGHT_CAPS _HDRFTR_CAPS
+.ALIAS FOOTER_RIGHT_SMALLCAPS _HDRFTR_SMALLCAPS
+.ALIAS FOOTER_RULE HDRFTR_RULE
+.ALIAS FOOTER_RULE_GAP HDRFTR_RULE_GAP
+.ALIAS FOOTER_VERSO HDRFTR_VERSO
+.
+.ALIAS HEADER_CENTER HDRFTR_CENTER
+.ALIAS TOC_PAGEHEADER_CENTER HDRFTR_CENTER
+.ALIAS TOC_PAGEHEADER_CENTRE HDRFTR_CENTER
+.ALIAS HEADER_CENTER_CAPS _HDRFTR_CAPS
+.ALIAS HEADER_CENTER_PAD HDRFTR_CENTER_PAD
+.ALIAS HEADER_CENTER_SMALLCAPS _HDRFTR_SMALLCAPS
+.ALIAS HEADER_CENTRE HDRFTR_CENTER
+.ALIAS HEADER_CENTRE_CAPS _HDRFTR_CAPS
+.ALIAS HEADER_CENTRE_PAD HDRFTR_CENTER_PAD
+.ALIAS HEADER_CENTRE_SMALLCAPS _HDRFTR_SMALLCAPS
+.ALIAS HEADER_LEFT HDRFTR_LEFT
+.ALIAS HEADER_LEFT_CAPS _HDRFTR_CAPS
+.ALIAS HEADER_LEFT_SMALLCAPS _HDRFTR_SMALLCAPS
+.ALIAS HEADER_PLAIN HDRFTR_PLAIN
+.ALIAS HEADER_RECTO HDRFTR_RECTO
+.ALIAS HEADER_RIGHT HDRFTR_RIGHT
+.ALIAS HEADER_RIGHT_CAPS _HDRFTR_CAPS
+.ALIAS HEADER_RIGHT_SMALLCAPS _HDRFTR_SMALLCAPS
+.ALIAS HEADER_RULE HDRFTR_RULE
+.ALIAS HEADER_RULE_GAP HDRFTR_RULE_GAP
+.ALIAS HEADER_VERSO HDRFTR_VERSO
+.
+.ALIAS SWITCH_FOOTERS SWITCH_HDRFTR
+.ALIAS SWITCH_HEADERS SWITCH_HDRFTR
+\#
+\# Create type-style aliases for tags, titles, and page elements
+\#
+\# These are used for creating aliases with while loops
+\#
+.ds ELEMENT_TYPE_1 BIBLIOGRAPHY_STRING
+.ds ELEMENT_TYPE_2 BIBLIOGRAPHY_HEADER
+.ds ELEMENT_TYPE_3 BLOCKQUOTE
+.ds ELEMENT_TYPE_4 CITATION
+.ds ELEMENT_TYPE_5 CITE
+.ds ELEMENT_TYPE_6 ENDNOTES_HEADER
+.ds ELEMENT_TYPE_7 ENDNOTE_STRING
+.ds ELEMENT_TYPE_8 EPIGRAPH
+.ds ELEMENT_TYPE_9 HDRFTR_CENTER
+.ds ELEMENT_TYPE_10 HDRFTR_LEFT
+.ds ELEMENT_TYPE_11 HDRFTR_RIGHT
+.ds ELEMENT_TYPE_12 LINENUMBER
+.ds ELEMENT_TYPE_13 PAGENUM
+.ds ELEMENT_TYPE_14 QUOTE
+.ds ELEMENT_TYPE_15 TOC_HEADER
+.ds ELEMENT_TYPE_16 CODE
+.ds ELEMENT_TYPE_17 FINIS
+.ds ELEMENT_TYPE_18 COPYRIGHT
+\#
+\# Create aliases for _FAMILY
+.ALIAS BIBLIOGRAPHY_FAMILY _FAMILY
+.ALIAS COVER_FAMILY _FAMILY
+.ALIAS DOCHEADER_FAMILY _FAMILY
+.ALIAS DOC_COVER_FAMILY _FAMILY
+.ALIAS ENDNOTE_FAMILY _FAMILY
+.ALIAS ENDNOTE_LINENUMBER_FAMILY _FAMILY
+.ALIAS ENDNOTE_NUMBER_FAMILY _FAMILY
+.ALIAS ENDNOTE_STRING_FAMILY _FAMILY
+.ALIAS ENDNOTE_TITLE_FAMILY _FAMILY
+.ALIAS FOOTNOTE_FAMILY _FAMILY
+.ALIAS HDRFTR_FAMILY _FAMILY
+.ALIAS PAGENUMBER_FAMILY _FAMILY
+.ALIAS TOC_FAMILY _FAMILY
+.ALIAS TOC_PAGENUMBER_FAMILY _FAMILY
+.ALIAS TOC_PN_FAMILY _FAMILY
+.ALIAS TOC_TITLE_FAMILY _FAMILY
+\#
+.nr #LOOP 0 1
+.while \n+[#LOOP]<=18 \{\
+. ALIAS \*[ELEMENT_TYPE_\n[#LOOP]]_FAMILY _FAMILY
+.\}
+\# Covers, docheader
+.nr #LOOP 0 1
+.while \n+[#LOOP]<=12 \{\
+. ALIAS \*[TITLE_TYPE_\n[#LOOP]]_FAMILY _FAMILY
+. ALIAS COVER_\*[TITLE_TYPE_\n[#LOOP]]_FAMILY _FAMILY
+. ALIAS DOC_COVER_\*[TITLE_TYPE_\n[#LOOP]]_FAMILY _FAMILY
+.\}
+\#
+\# Create aliases for _FONT
+.ALIAS BIBLIOGRAPHY_FONT _FONT
+.ALIAS ENDNOTE_FONT _FONT
+.ALIAS ENDNOTE_LINENUMBER_FONT _FONT
+.ALIAS ENDNOTE_NUMBER_FONT _FONT
+.ALIAS ENDNOTE_TITLE_FONT _FONT
+.ALIAS FOOTNOTE_FONT _FONT
+.ALIAS TOC_PN_FONT _FONT
+\#
+.nr #LOOP 0 1
+.while \n+[#LOOP]<=18 \{\
+. ALIAS \*[ELEMENT_TYPE_\n[#LOOP]]_FONT _FONT
+.\}
+\# Covers, docheader
+.nr #LOOP 0 1
+.while \n+[#LOOP]<=12 \{\
+. ALIAS \*[TITLE_TYPE_\n[#LOOP]]_FONT _FONT
+. ALIAS COVER_\*[TITLE_TYPE_\n[#LOOP]]_FONT _FONT
+. ALIAS DOC_COVER_\*[TITLE_TYPE_\n[#LOOP]]_FONT _FONT
+.\}
+\#
+\# Create aliases for _SIZE
+.ALIAS ENDNOTE_LINENUMBER_SIZE _SIZE
+.ALIAS ENDNOTE_NUMBER_SIZE _SIZE
+.ALIAS ENDNOTE_TITLE_SIZE _SIZE
+.ALIAS FOOTNOTE_SIZE _SIZE
+.ALIAS HDRFTR_SIZE _SIZE
+.ALIAS TOC_PN_SIZE _SIZE
+\#
+.nr #LOOP 0 1
+.while \n+[#LOOP]<=18 \{\
+. ALIAS \*[ELEMENT_TYPE_\n[#LOOP]]_SIZE _SIZE
+.\}
+\# Covers, docheader
+.nr #LOOP 0 1
+.while \n+[#LOOP]<=12 \{\
+. ALIAS \*[TITLE_TYPE_\n[#LOOP]]_SIZE _SIZE
+. ALIAS COVER_\*[TITLE_TYPE_\n[#LOOP]]_SIZE _SIZE
+. ALIAS DOC_COVER_\*[TITLE_TYPE_\n[#LOOP]]_SIZE _SIZE
+.\}
+\#
+\# Create aliases for TITLE_LEAD
+.nr #LOOP 0 1
+.while \n+[#LOOP]<=12 \{\
+. ALIAS \*[TITLE_TYPE_\n[#LOOP]]_LEAD TITLE_LEAD
+. ALIAS COVER_\*[TITLE_TYPE_\n[#LOOP]]_LEAD TITLE_LEAD
+. ALIAS DOC_COVER_\*[TITLE_TYPE_\n[#LOOP]]_LEAD TITLE_LEAD
+.\}
+\#
+\# Create aliases for _UNDERLINE
+.ALIAS BIBLIOGRAPHY_HEADER_UNDERLINE _UNDERLINE
+.ALIAS BIBLIOGRAPHY_HEADER_UNDERSCORE _UNDERLINE
+.ALIAS BIBLIOGRAPHY_STRING_UNDERLINE _UNDERLINE
+.ALIAS BIBLIOGRAPHY_STRING_UNDERSCORE _UNDERLINE
+.ALIAS BIB_STRING_UNDERLINE _UNDERLINE
+.ALIAS ENDNOTES_HEADER_UNDERLINE _UNDERLINE
+.ALIAS ENDNOTES_HEADER_UNDERSCORE _UNDERLINE
+.ALIAS ENDNOTES_STRING_UNDERLINE _UNDERLINE
+.ALIAS ENDNOTES_STRING_UNDERSCORE _UNDERLINE
+.ALIAS ENDNOTE_TITLE_UNDERLINE _UNDERLINE
+.ALIAS ENDNOTE_TITLE_UNDERSCORE _UNDERLINE
+.ALIAS EN_STRING_UNDERLINE _UNDERLINE
+.ALIAS EN_STRING_UNDERSCORE _UNDERLINE
+.ALIAS TOC_HEADER_UNDERLINE _UNDERLINE
+.ALIAS TOC_HEADER_UNDERSCORE _UNDERLINE
+\#
+.nr #LOOP 0 1
+.while \n+[#LOOP]<=12 \{\
+. ALIAS \*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE _UNDERLINE
+. ALIAS \*[TITLE_TYPE_\n[#LOOP]]_UNDERSCORE _UNDERLINE
+. ALIAS COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE _UNDERLINE
+. ALIAS COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERSCORE _UNDERLINE
+. ALIAS DOC_COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE _UNDERLINE
+. ALIAS DOC_COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERSCORE _UNDERLINE
+.\}
+\#
+\# Create aliases for _COLOR
+.ALIAS BIBLIOGRAPHY_HEADER_COLOR _COLOR
+.ALIAS COVER_COLOR _COLOR
+.ALIAS DOCHEADER_COLOR _COLOR
+.ALIAS ENDNOTE_TITLE_COLOR _COLOR
+.ALIAS FINIS_COLOR _COLOR
+.ALIAS FOOTNOTE_COLOR _COLOR
+.ALIAS HDRFTR_COLOR _COLOR
+.ALIAS HDRFTR_RULE_COLOR _COLOR
+.ALIAS LINEBREAK_COLOR _COLOR
+.ALIAS SECTION_COLOR _COLOR
+\#
+.nr #LOOP 0 1
+.while \n+[#LOOP]<=18 \{\
+. ALIAS \*[ELEMENT_TYPE_\n[#LOOP]]_COLOR _COLOR
+.\}
+\# Covers, docheader
+.nr #LOOP 0 1
+.while \n+[#LOOP]<=12 \{\
+. ALIAS \*[TITLE_TYPE_\n[#LOOP]]_COLOR _COLOR
+. ALIAS COVER_\*[TITLE_TYPE_\n[#LOOP]]_COLOR _COLOR
+. ALIAS DOC_COVER_\*[TITLE_TYPE_\n[#LOOP]]_COLOR _COLOR
+.\}
+\#
+\# Create aliases for _CAPS
+.ALIAS BIBLIOGRAPHY_HEADER_CAPS _CAPS
+.ALIAS BIBLIOGRAPHY_STRING_CAPS _CAPS
+.ALIAS ENDNOTE_TITLE_CAPS _CAPS
+\#
+.nr #LOOP 0 1
+.while \n+[#LOOP]<=12 \{\
+. ALIAS \*[TITLE_TYPE_\n[#LOOP]]_CAPS _CAPS
+. ALIAS COVER_\*[TITLE_TYPE_\n[#LOOP]]_CAPS _CAPS
+. ALIAS DOC_COVER_\*[TITLE_TYPE_\n[#LOOP]]_CAPS _CAPS
+.\}
+\#
+\# Create aliases for _SMALLCAPS
+.ALIAS BIBLIOGRAPHY_HEADER_SMALLCAPS _SMALLCAPS
+.ALIAS BIBLIOGRAPHY_STRING_SMALLCAPS _SMALLCAPS
+.ALIAS ENDNOTE_TITLE_SMALLCAPS _SMALLCAPS
+.ALIAS HDRFTR_CENTER_SMALLCAPS _SMALLCAPS
+.ALIAS HDRFTR_LEFT_SMALLCAPS _SMALLCAPS
+.ALIAS HDRFTR_RIGHT_SMALLCAPS _SMALLCAPS
+\#
+.nr #LOOP 0 1
+.while \n+[#LOOP]<=12 \{\
+. ALIAS \*[TITLE_TYPE_\n[#LOOP]]_SMALLCAPS _SMALLCAPS
+. ALIAS COVER_\*[TITLE_TYPE_\n[#LOOP]]_SMALLCAPS _SMALLCAPS
+. ALIAS DOC_COVER_\*[TITLE_TYPE_\n[#LOOP]]_SMALLCAPS _SMALLCAPS
+.\}
+\#
+\# Create aliases for _QUAD
+.ALIAS BIBLIOGRAPHY_HEADER_QUAD _QUAD
+.ALIAS BIBLIOGRAPHY_QUAD _QUAD
+.ALIAS BIBLIOGRAPHY_STRING_QUAD _QUAD
+.ALIAS BLOCKQUOTE_QUAD _QUAD
+.ALIAS COPYRIGHT_QUAD _QUAD
+.ALIAS COVER_COPYRIGHT_QUAD _QUAD
+.ALIAS COVER_MISC_QUAD _QUAD
+.ALIAS COVER_QUAD _QUAD
+.ALIAS DOCHEADER_QUAD _QUAD
+.ALIAS DOC_COVER_COPYRIGHT_QUAD _QUAD
+.ALIAS DOC_COVER_MISC_QUAD _QUAD
+.ALIAS DOC_COVER_QUAD _QUAD
+.ALIAS DOC_QUAD _QUAD
+.ALIAS ENDNOTES_HEADER_QUAD _QUAD
+.ALIAS ENDNOTE_QUAD _QUAD
+.ALIAS ENDNOTE_STRING_QUAD _QUAD
+.ALIAS ENDNOTE_TITLE_QUAD _QUAD
+.ALIAS EPIGRAPH_QUAD _QUAD
+.ALIAS FOOTNOTE_QUAD _QUAD
+.ALIAS MISC_QUAD _QUAD
+.ALIAS TOC_HEADER_QUAD _QUAD
+\#
+\# Support aliases
+\#
+.ALIAS COL_BREAK COL_NEXT
+.ALIAS DOC_COVER COVER
+.ALIAS DOC_COVERS COVERS
+.ALIAS DOC_COVERTITLE COVERTITLE
+.ALIAS DOC_COVER_COUNTS_PAGES COVER_COUNTS_PAGES
+.ALIAS DOC_COVER_LEAD COVER_LEAD
+.ALIAS DOC_DOC_COVERTITLE COVERTITLE
+.ALIAS DO_DOC_COVER DO_COVER
+.ALIAS PRINT_FOOTNOTE_RULE FOOTNOTE_RULE
+\#
+\# Miscellaneous aliases
+.ALIAS SECTION LINEBREAK
+.ALIAS SECTION_CHAR LINEBREAK_CHAR
+\#
+\# Miscellaneous macros to take care of backward compatibility
+\# -----------------------------------------------------------
+\#
+\# As of 1.1.9, EL and TN got changed to make TRAP...TRAP OFF
+\# unnecessary for users. However, I used both macros extensively
+\# throughout this file (in conjunction with TRAP...TRAP OFF).
+\# EOL is the old EL; used only in om.tmac.
+\#
+.MAC EOL END
+. if \\n[.vpt] \{\
+. vpt 0
+. nr #RESTORE_TRAP 1
+. \}
+. br
+. sp -1v
+. if \\n[#RESTORE_TRAP] \{\
+. vpt
+. rr #RESTORE_TRAP
+. \}
+.END
+\#
+\# PREPROCESSOR SUPPORT
+\# ====================
+\#
+\# Utility macros--label and caption styles, lists collector, lists
+\# generator.
+\#
+.nr lists*target 0 1
+.
+.MAC get-label-type END
+. if \\n[all]=1 .ds label-type eqn
+. if \\n[all]=2 .ds label-type pdf-img
+. if \\n[all]=3 .ds label-type pic
+. if \\n[all]=4 .ds label-type tbl
+. if \\n[all]=5 .ds label-type floating
+.END
+\#
+.MAC set-defaults END
+. if '\\*[\\*[label-type]*\\*[spec-type]-family]'' \
+. ds \\*[label-type]*\\*[spec-type]-family \\*[$DOC_FAM]\"
+. if '\\*[\\*[label-type]*\\*[spec-type]-font]'' \
+. ds \\*[label-type]*\\*[spec-type]-font R\"
+. if '\\*[\\*[label-type]*\\*[spec-type]-size-change]'' \
+. ds \\*[label-type]*\\*[spec-type]-size-change +0\"
+. if !r \\*[label-type]*\\*[spec-type]-autolead \
+. nr \\*[label-type]*\\*[spec-type]-autolead 2
+. if '\\*[\\*[label-type]*\\*[spec-type]-space]'' \
+. ds \\*[label-type]*\\*[spec-type]-space +0\"
+. if '\\*[\\*[label-type]*\\*[spec-type]-color]'' \
+. ds \\*[label-type]*\\*[spec-type]-color black\"
+. if '\\*[\\*[label-type]*\\*[spec-type]-quad]'' \{\
+. ie '\\*[label-type]'eqn' \{\
+. if '\\*[spec-type]'caption' \
+. ds \\*[label-type]*\\*[spec-type]-quad C\"
+. \}
+. el .ds \\*[label-type]*\\*[spec-type]-quad L\"
+. \}
+. if '\\n[\\*[label-type]*\\*[spec-type]-quad-on-ll]'' \
+. nr \\*[label-type]*\\*[spec-type]-quad-on-ll 1
+. if '\\*[spec-type]'caption' \
+. nr default-left 1
+.END
+\#
+.MAC set-inline-specs END
+. ds \\*[label-type]*\\*[spec-type]-specs \
+\f[\\*[\\*[label-type]*\\*[spec-type]-family]\\*[\\*[label-type]*\\*[spec-type]-font]]\
+\s[\\*[\\*[label-type]*\\*[spec-type]-size-change]]\
+\m[\\*[\\*[label-type]*\\*[spec-type]-color]]
+.END
+\#
+\# Line lengths, indents, and quads for captions and labels.
+\# Aliased for eqn, pic, pdf-image, and tbl.
+\#
+.MAC SET_QUAD END
+. ds label-type \\$0
+. substring label-type 0 2
+. if '\\*[label-type]'PDF' .ds label-type pdf-img
+. if '\\*[label-type]'TBL' .ds label-type tbl
+. if '\\*[label-type]'PIC' .ds label-type pic
+. if '\\*[label-type]'EQN' .ds label-type eqn
+. ds spec-type \\$0
+. substring spec-type -6 -10
+. if '\\*[spec-type]'PTION' .ds spec-type caption
+. if '\\*[spec-type]'LABEL' .ds spec-type label
+. if '\\*[spec-type]'OURCE' .ds spec-type source
+. QUAD \\$1
+. ds \\*[label-type]*\\*[spec-type]-quad \\$1
+. substring \\*[label-type]*\\*[spec-type]-quad 0 0
+. if '\\*[label-type]'pdf-img' \{\
+. if '\\*[\\*[label-type]*\\*[spec-type]-quad]'L' \{\
+. if !\\n[pdf-img*\\*[spec-type]-quad-on-ll] \{\
+. ie !'\\*[pdf-img:pos]'-R' \
+. ll \\n[pdf-img:ind]u+\\n[pdf-img:width]u+\\n[pdf-img:frame-inset]u
+. el .ll -\\n[ind-pre-img]u
+. if '\\*[pdf-img:pos]'-C' \
+. in \\n[pdf-img:ind]u-\\n[pdf-img:frame-inset]u
+. if '\\*[pdf-img:pos]'-R' \
+. in \\n[.l]u-(\\n[pdf-img:width]u+(\\n[pdf-img:frame-inset]u*2u))
+. if '\\*[pdf-img:pos]'-I' \
+. in \\n[pdf-img:ind]u
+. \}
+. \}
+. if '\\*[\\*[label-type]*\\*[spec-type]-quad]'C' \{\
+. if !\\n[pdf-img*\\*[spec-type]-quad-on-ll] \{\
+. if '\\*[pdf-img:pos]'-L' \
+. ll \\n[pdf-img:width]u+(\\n[pdf-img:frame-inset]u*2u)
+. if '\\*[pdf-img:pos]'-C' \{\
+. ll (\\n[ll-pre-img]u-\\n[pdf-img:width]u/2u+(\\n[pdf-img:frame-inset]u))+\\n[pdf-img:width]u
+. in \\n[.l]u-(\\n[pdf-img:width]u+(\\n[pdf-img:frame-inset]u*2u))
+. \}
+. if '\\*[pdf-img:pos]'-R' \{\
+. ll -\\n[ind-pre-img]u
+. in \\n[.l]u-(\\n[pdf-img:width]u+(\\n[pdf-img:frame-inset]u*2u))
+. \}
+. if '\\*[pdf-img:pos]'-I' \{\
+. ll \\n[pdf-img:ind]u+\\n[pdf-img:width]u+(\\n[pdf-img:frame-inset]u*2u)
+. in \\n[pdf-img:ind]u
+. \}
+. \}
+. \}
+. if '\\*[\\*[label-type]*\\*[spec-type]-quad]'R' \{\
+. if !\\n[pdf-img*\\*[spec-type]-quad-on-ll] \{\
+. if '\\*[pdf-img:pos]'-L' \
+. ll \\n[pdf-img:width]u+(\\n[pdf-img:frame-inset]u*2u]
+. if '\\*[pdf-img:pos]'-C' \{\
+. ll (\\n[.l]u-\\n[ind-pre-img]u-\\n[pdf-img:width]u/2u)+\\n[pdf-img:width]u+\\n[pdf-img:frame-inset]u
+. in \\n[pdf-img:ind]u
+. \}
+. if '\\*[pdf-img:pos]'-R' \{\
+. ll -\\n[ind-pre-img]u
+. in \\n[.l]u-\\n[pdf-img:width]u
+. \}
+. if '\\*[pdf-img:pos]'-I' \{\
+. ll \\n[pdf-img:ind]u+\\n[pdf-img:width]u+(\\n[pdf-img:frame-inset]u*2u)
+. in \\n[pdf-img:ind]u
+. \}
+. \}
+. \}
+. \}
+. if '\\*[label-type]'pic' \{\
+. if !\\n[pic*\\*[spec-type]-quad-on-ll] \{\
+. ie \\n[pic*left] .ll \\n[pic*div-width]u
+. el \{\
+. ll \\n[pic*div-width]u
+. in (\\n[ll-pre-float]u-\\n[pic*div-width]u)/2u
+. \}
+. \}
+. \}
+. if '\\*[label-type]'tbl' \{\
+. if !\\n[tbl*\\*[spec-type]-quad-on-ll] \{\
+. ie \\n[tbl*center] \{\
+. ie '\\*[spec-type]'label' \{\
+.\" Differentiate between a tbl label and a float label
+. ie !'\\*[ev-current]'FLOAT' \{\
+. ll \\n[ll-pre-tbl]u-\\n[TW]u/2u+\\n[TW]u
+. if \\n[tbl*have-header] \
+. in (\\n[ll-pre-tbl]u-\\n[.i]u)-\\n[TW]u/2u+\\n[.i]u
+. \}
+. el \{\
+. in \\n[ll-pre-tbl]u+\\n[.i]u-\\n[TW]u/2u
+. ll \\n[.l]u-\\n[.i]u
+. \}
+. \}
+. el \{\
+. if '\\*[spec-type]'source' \{\
+. ie \\n[float*tbl] \{\
+. ll \\n[TW]u
+\!. in \\n[ll-pre-tbl]u-\\n[TW]u/2u+\\n[tmp-ind]u
+. \}
+. el \{\
+. ll \\n[TW]u+\\n[ind-pre-tbl]u
+. ie \\n[ind-pre-tbl] \
+\!. in \\n[ll-pre-tbl]u-\\n[TW]u/2u
+. el \
+\!. in \\n[ll-pre-tbl]u-\\n[TW]u/2u+\\n[tmp-ind]u
+. \}
+\!. ti -\\n[tmp-ind]u
+. \}
+. if '\\*[spec-type]'caption' \{\
+. ll \\n[ll-pre-tbl]u+\\n[.i]u-\\n[TW]u/2u+\\n[TW]u
+. in \\n[ll-pre-tbl]u+\\n[.i]u-\\n[TW]u/2u
+. \}
+. \}
+. \}
+. el \{\
+. ll \\n[TW]u+\\n[.i]u
+.\" Check the effect of setting a source in non-MLA mode.
+. if '\\*[spec-type]'source' \{\
+. if \\n[#MLA] \{\
+. ie \\n[float*tbl] \{\
+\!. ll \\n[TW]u+\\n[ind-pre-tbl]u
+\!. in \\n[tmp-ind]u+\\n[ind-pre-tbl]u
+\!. ti -\\n[tmp-ind]u
+. \}
+. el \{\
+. ll \\n[TW]u+\\n[ind-pre-tbl]u
+\!. in \\n[tmp-ind]u
+\!. ti -\\n[tmp-ind]u
+. \}
+. \}
+. \}
+. \}
+. \}
+. \}
+.END
+\#
+.ALIAS TBL*SET_CAPTION_QUAD SET_QUAD
+.ALIAS TBL*SET_LABEL_QUAD SET_QUAD
+.ALIAS TBL*SET_SOURCE_QUAD SET_QUAD
+.ALIAS PDF_IMG*SET_CAPTION_QUAD SET_QUAD
+.ALIAS PDF_IMG*SET_LABEL_QUAD SET_QUAD
+.ALIAS PIC*SET_CAPTION_QUAD SET_QUAD
+.ALIAS PIC*SET_LABEL_QUAD SET_QUAD
+\#
+.MAC style END
+. ds label-type \\$0
+. substring label-type 0 2
+. if '\\*[label-type]'img' .ds label-type pdf-img
+. if '\\*[label-type]'tbl' .ds label-type tbl
+. if '\\*[label-type]'pic' .ds label-type pic
+. ds spec-type \\$0
+. substring spec-type 4 6
+. if '\\*[spec-type]'cap' .ds spec-type caption
+. if '\\*[spec-type]'lab' .ds spec-type label
+. if '\\*[spec-type]'sou' .ds spec-type source
+. ie \\n[#PRINT_STYLE]=1 .TYPEWRITER
+. el \{\
+' fam \\*[\\*[label-type]*\\*[spec-type]-family]
+' ft \\*[\\*[label-type]*\\*[spec-type]-font]
+' ps \\n[#DOC_PT_SIZE]u\\*[\\*[label-type]*\\*[spec-type]-size-change]
+. \m[\\*[\\*[label-type]*\\*[spec-type]-color]]
+. \}
+.END
+\#
+.ALIAS tbl*caption-style style
+.ALIAS tbl*label-style style
+.ALIAS tbl*source-style style
+.ALIAS img*caption-style style
+.ALIAS img*label-style style
+.ALIAS img*source-style style
+.ALIAS pic*caption-style style
+.ALIAS pic*label-style style
+.ALIAS pic*source-style style
+\#
+\# User style macros
+\#
+\# TYPE SPECS FOR LABELS, CAPTIONS, AND SOURCES
+\# --------------------------------------------
+\# Aliased as CAPTIONS and LABELS for eqn, pic, tbl, and pdf images.
+\# *Arguments:
+\# EQN | IMG | PIC | TBL | FLOATING \
+\# Remaining arguments are optional
+\# FAMILY fam \
+\# FONT sty \
+\# SIZE +|-size \
+\# QUAD LEFT | CENTRE | RIGHT [ ON_LL ] \
+\# COLOR color \
+\# AUTOLEAD n \
+\# ADJUST +|-n
+\# *Function:
+\# Sets type specs for captions, labels, and sources according to
+\# calling alias name
+\# *Notes:
+\# SIZE is relative to running text.
+\# QUAD optional arg says quad on full line length rather than
+\# pdf-img or pre-processor output.
+\#
+.MAC CAPTION_LABEL_SPECS END
+. if '\\$0'CAPTIONS' .ds spec-type caption
+. if '\\$0'LABELS' .ds spec-type label
+. if '\\$0'SOURCES' .ds spec-type source
+. ds $LABEL-TYPE \\$1
+. if '\\$1'EQN' .ds label-type eqn
+. if '\\$1'FLOATING' .ds label-type floating
+. if '\\$1'IMG' .ds label-type pdf-img
+. if '\\$1'PIC' .ds label-type pic
+. if '\\$1'TBL' .ds label-type tbl
+. if '\\$1'ALL' .nr all 1
+. shift
+. nr loop-counter \\n[#NUM_ARGS]
+. nr loop-count 0 1
+. while \\n+[loop-count]<=\\n[loop-counter] \{\
+. if '\\$1'FAMILY' \{\
+. shift
+. ie r all \{\
+. nr all 0 1
+. while \\n+[all]<=5 \{\
+. get-label-type
+. ds \\*[label-type]*\\*[spec-type]-family \\$1
+. \}
+. \}
+. el .ds \\*[label-type]*\\*[spec-type]-family \\$1
+. if \\n[#PRINT_STYLE]=1 \
+. ds \\*[label-type]*\\*[spec-type]-family \\*[$TYPEWRITER_FAM]
+. shift
+. \}
+. if '\\$1'FONT' \{\
+. shift
+. ie r all \{\
+. nr all 0 1
+. while \\n+[all]<=5 \{\
+. get-label-type
+. ds \\*[label-type]*\\*[spec-type]-font \\$1
+. \}
+. \}
+. el .ds \\*[label-type]*\\*[spec-type]-font \\$1
+. if \\n[#PRINT_STYLE]=1 \
+. ds \\*[label-type]*\\*[spec-type]-font R
+. shift
+. \}
+. if '\\$1'SIZE' \{\
+. shift
+. ie r all \{\
+. nr all 0 1
+. while \\n+[all]<=5 \{\
+. get-label-type
+. ds \\*[label-type]*\\*[spec-type]-size-change \\$1
+. \}
+. \}
+. el .ds \\*[label-type]*\\*[spec-type]-size-change \\$1
+. if \\n[#PRINT_STYLE]=1 \
+. ds \\*[label-type]*\\*[spec-type]-size-change +0
+. shift
+. \}
+. if '\\$1'AUTOLEAD' \{\
+. shift
+. ie r all \{\
+. nr all 0 1
+. while \\n+[all]<=5 \{\
+. get-label-type
+. nr \\*[label-type]*\\*[spec-type]-autolead (p;\\$1)
+. \}
+. \}
+. el .nr \\*[label-type]*\\*[spec-type]-autolead (p;\\$1)
+. shift
+. \}
+. if '\\$1'QUAD' \{\
+. shift
+. ie r all \{\
+. nr all 0 1
+. while \\n+[all]<=5 \{\
+. get-label-type
+. ds \\*[label-type]*\\*[spec-type]-quad \\$1
+. substring \\*[label-type]*\\*[spec-type]-quad 0 0
+. if '\\$2'ON_LL' \
+. nr \\*[label-type]*\\*[spec-type]-quad-on-ll 1
+. \}
+. \}
+. el \{\
+. ds \\*[label-type]*\\*[spec-type]-quad \\$1
+. substring \\*[label-type]*\\*[spec-type]-quad 0 0
+. if \\n[\\*[label-type]*\\*[spec-type]-quad-on-ll] \
+. rr \\*[label-type]*\\*[spec-type]-quad-on-ll
+. if '\\$2'ON_LL' \
+. nr \\*[label-type]*\\*[spec-type]-quad-on-ll 1
+. \}
+. ie '\\$2'ON_LL' .shift 2
+. el .shift
+. \}
+. if '\\$1'COLOR' \{\
+. shift
+. ie r all \{\
+. nr all 0 1
+. while \\n+[all]<=5 \{\
+. get-label-type
+. ds \\*[label-type]*\\*[spec-type]-color \\$1
+. \}
+. \}
+. el .ds \\*[label-type]*\\*[spec-type]-color \\$1
+. if \\n[#PRINT_STYLE]=1 \
+. ds \\*[label-type]*\\*[spec-type]-color black
+. shift
+. \}
+. if '\\$1'ADJUST' \{\
+. shift
+. ie r all \{\
+. nr all 0 1
+. while \\n+[all]<=5 \{\
+. get-label-type
+. ds \\*[label-type]*\\*[spec-type]-space \\$1
+. \}
+. \}
+. el .ds \\*[label-type]*\\*[spec-type]-space \\$1
+. if \\n[#PRINT_STYLE]=1 \
+. ds \\*[label-type]*\\*[spec-type]-space +0
+. shift
+. \}
+. if '\\$1'INDENT' \{\
+. shift
+. ie '\\*[label-type]'floating' \{\
+. ie \B'\\$1' \{\
+. nr \\*[label-type]*\\*[spec-type]-indent-l \\$1
+. shift
+. \}
+. el \{\
+. ie '\\$1'RIGHT' \{\
+. shift
+. nr \\*[label-type]*\\*[spec-type]-indent-r \\$1
+. shift
+. \}
+. el \{\
+. tm1 \
+"[mom]: Missing value for INDENT in macro '\\$0' at line \\n[.c].
+. ab \
+[mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. \}
+. \}
+. \}
+. el \{\
+. shift
+. if !\\n[#SKIP_INDENT_WARNING] \{\
+. tm1 \
+"[mom]: '\\$0 \\*[$LABEL-TYPE]' at line \\n[.c] does not take an indent.
+. tm1 \
+" No indent(s) will be applied.
+. nr #SKIP_INDENT_WARNING 1
+. \}
+. if '\\$1'INDENT' .shift
+. if '\\$1'RIGHT' .shift
+. if \B'\\$1' .shift
+. \}
+. \}
+. \}
+. ie r all \{\
+. nr all 0 1
+. while \\n+[all]<=5 \{\
+. get-label-type
+. set-defaults
+. set-inline-specs
+. \}
+. \}
+. el \{\
+. set-defaults
+. set-inline-specs
+. \}
+. ds revert-specs \f[]\s[0]\m[]
+. rr #SKIP_INDENT_WARNING
+. rr all
+.END
+.
+.ALIAS CAPTIONS CAPTION_LABEL_SPECS
+.ALIAS LABELS CAPTION_LABEL_SPECS
+.ALIAS SOURCES CAPTION_LABEL_SPECS
+\#
+\# LABELS and CAPTIONS (floats and [block]quotes)
+\# ----------------------------------------------
+\# *Arguments:
+\# <text of label or caption> [ CAPTION <text of caption> ] \
+\# [ TO_LIST FIGURES | EQUATIONS | TABLES ]
+\# *Function:
+\# Add label/caption to float, quotes, and blockquotes
+\# *Notes:
+\# Aliased as CAPTION. If called as CAPTION, prints all
+\# double-quoted text strings including ".br" or ".sp";
+\# may come at top or bottom of labelled object, or both.
+\# If called as LABEL, optional arg CAPTION attaches caption
+\# text to the label; may only come at bottom of object and
+\# can only take one double-quoted text string.
+\#
+\# These strings allow users to create labels of the form
+\# 'Fig. \*[chapter].\*[fig-label]', e.g. 'Fig. 1.1'
+\#
+.ds chapter \\n[#CH_NUM]
+.ds fig-label \\n+[fig*label-num]
+.ds tbl-label \\n+[tbl*label-num]
+.ds eqn-label \\n+[eqn*label-num]
+\#
+\#
+.MAC LABEL END
+. br
+. if \\n[.ns] \{\
+. vpt 0
+. rs
+. nop \&
+. sp -1
+. vpt
+. \}
+. if r chop-space .sp -1
+. rr chop-space
+. if \\n[#QUOTE] .nr q-float 1
+. if '\\$0'CAPTION' \{\
+. ds labelcap caption
+. ds $FLOATING_CAPTION \\$*
+. \}
+. if '\\$0'LABEL' \{\
+. ds labelcap label
+. ds $FLOATING_LABEL \\$1
+. shift
+. nr loop-counter 0 1
+. nr loop-count \\n[#NUM_ARGS]
+. while \\n+[loop-counter]<=\\n[loop-count] \{\
+. if '\\$1'CAPTION' \{\
+. nr with-caption 1
+. ds $FLOATING_CAPTION \\$2
+. shift 2
+. \}
+. if '\\$1'SHORT_CAPTION' \{\
+. ds $LIST_CAPTION \\$2
+. shift 2
+. \}
+. if '\\$1'TO_LIST' \{\
+. nr to-list 1
+. if '\\$2'FIGURES' .ds $LIST_OF FIGURES
+. if '\\$2'EQUATIONS' .ds $LIST_OF EQUATIONS
+. if '\\$2'TABLES' .ds $LIST_OF TABLES
+. shift 2
+. \}
+. \}
+. \}
+. if \\n[D-float] \
+. if \\n[.d]>\\n[D-float] \
+. sp \\n[.d]u-\\n[D-float]u
+. rr has-\\*[labelcap]
+. nr has-\\*[labelcap] 1
+. rr @bottom
+. if !\\n[.d]=0 .nr @bottom 1
+. ds ev-current \\n[.ev]
+. ev floating*labelcap
+. evc \\*[ev-current]
+. ps \\n[#DOC_PT_SIZE]u
+. if \\n[floating*\\*[labelcap]-indent-l] \
+. in \\n[floating*\\*[labelcap]-indent-l]u
+. if \\n[floating*\\*[labelcap]-indent-r] \
+. ll -\\n[floating*\\*[labelcap]-indent-r]u
+. ds $QUAD_PREV \\*[$QUAD_VALUE]
+. QUAD \\*[floating*\\*[labelcap]-quad]
+.\" 1/4 space before both captions and labels
+\!. if \\\\n[nl]=\\\\n[#PAGE_TOP] .nr deferred-float 1
+. if !\\n[deferred-float] \{\
+. ie !\\n[@bottom] \{\
+. ie '\\n[.z]'' \
+. sp \\n[#DOC_LEAD]u/4u
+. el \
+. if '\\n[.z]'FLOAT*DIV' .sp \\n[#DOC_LEAD]u/4u
+. \}
+. el \{\
+. sp \\n[#DOC_LEAD]u/4u
+. rr @bottom
+. \}
+. \}
+\!. if \\\\n[deferred-float] \{\
+. if !\\n[#QUOTE] .sp -(\\n[#DOC_LEAD]u/4u)
+\!. \}
+. nr floating*\\*[labelcap]-lead-diff \\n[.v]
+. vs \\n[.ps]u+\\n[floating*\\*[labelcap]-autolead]u
+. nr floating*\\*[labelcap]-lead-diff \
+ \\n[floating*\\*[labelcap]-lead-diff]-\\n[.v]
+. if !\\n[deferred-float] \
+. RESTORE_SPACE
+. ie '\\*[labelcap]'label' \{\
+. if \\n[to-list] \{\
+.\" Strip prefix from label if list-type is being autolabelled
+.\" Becomes $LIST_LABEL
+. if '\\*[$LIST_OF]'FIGURES' \
+. if r fig*label-num .STRIP_PRFX_SFFX "\\*[$FLOATING_LABEL]"
+. if '\\*[$LIST_OF]'TABLES' \
+. if r tbl*label-num .STRIP_PRFX_SFFX "\\*[$FLOATING_LABEL]"
+. if '\\*[$LIST_OF]'EQUATIONS' \
+. if r eqn*label-num .STRIP_PRFX_SFFX "\\*[$FLOATING_LABEL]"
+. \}
+. ds $FLOATING_LABEL \
+\F[\\\\*[floating*label-family]]\
+\f[\\\\*[floating*label-font]]\
+\s[\\\\*[floating*label-size-change]]\
+\m[\\\\*[floating*label-color]]\
+\\*[$FLOATING_LABEL]
+. \}
+. el \{\
+. if !\\n[deferred-float] \
+. sp \\n[floating*caption-lead-diff]u
+. if !'\\*[floating*caption-space]'' \
+. sp \\*[floating*caption-space]
+. while !'\\$1'' \{\
+. nop \
+\F[\\*[floating*caption-family]]\
+\f[\\*[floating*caption-font]]\
+\s[\\*[floating*caption-size-change]]\
+\m[\\*[floating*caption-color]]\
+\\$1
+. if \\n[.u]=1 .br
+. shift
+. \}
+. if !'\\*[floating*caption-space]'' \
+. sp -\\*[floating*caption-space]
+. \}
+. if \\n[with-caption] \{\
+. nr width-label \w'\\*[$FLOATING_LABEL]'
+. if !\\n[width-label]=0 \
+. as $FLOATING_LABEL \0
+. as $FLOATING_LABEL \
+\F[\\\\*[floating*caption-family]]\
+\f[\\\\*[floating*caption-font]]\
+\s[\\\\*[floating*caption-size-change]]\
+\m[\\\\*[floating*caption-color]]\
+\\*[$FLOATING_CAPTION]
+. if '\\*[$LIST_CAPTION]'' \
+. ds $LIST_CAPTION \\*[$FLOATING_CAPTION]
+. \}
+. if !'\\*[$FLOATING_LABEL]'' \{\
+. sp \\n[floating*label-lead-diff]u
+. if !'\\*[floating*label-space]'' \
+. sp \\*[floating*label-space]
+. nop \\*[$FLOATING_LABEL]
+. if \\n[.u]=1 .br
+. if !'\\*[floating*label-space]'' \
+. sp -\\*[floating*label-space]
+. \}
+.\" 1/4 space after captions and labels
+. ie !\\n[@bottom] \
+. sp \\n[#DOC_LEAD]u/4u
+. el \{\
+. if '\\n[.z]'FLOAT*DIV' \{\
+. sp \\n[#DOC_LEAD]u/4u
+\!. if \\\\n[deferred-float] \
+. sp -(\\n[#DOC_LEAD]u/4u)
+. \}
+. \}
+\!. rr deferred-float
+. ll
+. vs
+. QUAD \\*[$QUAD_PREV]
+. in
+. ev
+. if \\n[to-list] \{\
+. nr loop-counter 0 1
+. nr loop-count 2
+. ds labelcap label
+. while \\n+[loop-counter]<=\\n[loop-count] \{\
+. ds \\*[labelcap]-family \\*[floating*\\*[labelcap]-family]
+. ds \\*[labelcap]-font \\*[floating*\\*[labelcap]-font]
+. ds \\*[labelcap]-size-change \\*[floating*\\*[labelcap]-size-change]
+. ds \\*[labelcap]-color \\*[floating*\\*[labelcap]-color]
+. ie '\\*[$LISTS_FAM]'' \
+. ds floating*\\*[labelcap]-family \\*[$DOC_FAM]
+. el \
+. ds floating*\\*[labelcap]-family \\*[$LISTS_FAM]
+. if '\\*[$LISTS_FT]'' \
+. ds floating*\\*[labelcap]-font R
+. ds floating*\\*[labelcap]-size-change +0
+. ds floating*\\*[labelcap]-color pdf:href.colour
+. ds labelcap caption
+. \}
+. ie '\\*[$LIST_LABEL]'' .TO_\\*[$LIST_OF] "\\*[$FLOATING_LABEL]
+. el .TO_\\*[$LIST_OF] "\\*[$LIST_LABEL]" "\\*[$LIST_CAPTION]
+. rr to-list
+. nr loop-counter 0 1
+. nr loop-count 2
+. ds labelcap label
+. while \\n+[loop-counter]<=\\n[loop-count] \{\
+. ds floating*\\*[labelcap]-family \\*[\\*[labelcap]-family]
+. ds floating*\\*[labelcap]-font \\*[\\*[labelcap]-font]
+. ds floating*\\*[labelcap]-size-change \\*[\\*[labelcap]-size-change]
+. ds floating*\\*[labelcap]-color \\*[\\*[labelcap]-color]
+. ds labelcap caption
+. \}
+. \}
+. rr with-caption
+. rm $FLOATING_CAPTION
+. rm $FLOATING_LABEL
+. rm $LIST_LABEL
+. rm $LIST_CAPTION
+.END
+.
+.ALIAS CAPTION LABEL
+.
+.MAC STRIP_PRFX_SFFX END
+.\" Strip suffix from label string
+. ds suffix \\$1
+. substring suffix -1
+.\" If suffix is '.' ',' ':' or ')', remove it.
+. if '\\*[suffix]'.' .nr strip-suffix 1
+. if '\\*[suffix]',' .nr strip-suffix 1
+. if '\\*[suffix]':' .nr strip-suffix 1
+. if '\\*[suffix]')' .nr strip-suffix 1
+. if \\n[strip-suffix] \{\
+. ds $LIST_LABEL \\$1
+. substring $LIST_LABEL 0 -2
+. \}
+. rr strip-suffix
+. if '\\*[$LIST_LABEL]'' .ds $LIST_LABEL \\$1
+.\" Remove prefix (e.g. "Fig. ") by looping through $LIST_LABEL
+.\" until a digit is encountered
+. nr loop-counter 100 \" arbitrary
+. nr loop-count 0 1
+. while \\n+[loop-count]<=\\n[loop-counter] \{\
+. substring $LIST_LABEL 1
+. if \B'\\*[$LIST_LABEL]' .break
+. \}
+. substring $LIST_LABEL 1
+.END
+\#
+\# CAPTION_AFTER_LABEL
+\# -------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Sets register indicating non-MLA captions should come after labels.
+\#
+.MAC CAPTION_AFTER_LABEL END
+. if '\\$1'IMG' .ds type pdf-img
+. if '\\$1'PIC' .ds type pic
+. if '\\$1'TBL' .ds type tbl
+. if !\\n[#MLA] \{\
+. nr \\*[type]*caption-after-label 1
+. if '\\$1'ALL' \{\
+. nr pdf-img*caption-after-label 1
+. nr tbl*caption-after-label 1
+. nr pic*caption-after-label 1
+. \}
+. if !'\\$2'' \{\
+. ie !'\\$1'ALL' .rr \\*[type]*caption-after-label
+. el \{\
+. rr pdf-img*caption-after-label
+. rr tbl*caption-after-label
+. rr pic*caption-after-label
+. \}
+. \}
+. \}
+.END
+\#
+\# AUTOLABELLING
+\# -------------
+\# *Argument:
+\# [ PREFIX <prefix> SUFFIX <suffix> ] | <anything>
+\# *Function:
+\# Turns label autonumbering on of off; optionally lets user set
+\# prefix and suffix for labels.
+\# *Notes:
+\# Aliased for images (pdf), tbl, pic, and eqn.
+\#
+.MAC AUTOLABEL END
+. if '\\$0'AUTOLABEL_EQUATIONS' .ds label-type eqn
+. if '\\$0'AUTOLABEL_TABLES' .ds label-type tbl
+. if '\\$0'AUTOLABEL_PIC' \{\
+. ds label-type pic
+. nr fig*autolabel 1
+. \}
+. if '\\$0'AUTOLABEL_IMAGES' \{\
+. ds label-type pdf-img
+. nr fig*autolabel 1
+. \}
+. if !'\\$1'' \{\
+. ds \\*[label-type]-label-args \\$1
+. substring \\*[label-type]-label-args -1 -3
+. \}
+. if '\\*[\\*[label-type]-label-args]'FIX' .nr \\*[label-type]-label-args 1
+. if '\\*[\\*[label-type]-label-args]'TER' .nr \\*[label-type]-label-args 1
+. if !\\n[\\*[label-type]*label-num] \
+. nr \\*[label-type]*label-num 0 1
+. if '\\*[label-type]'pdf-img' \
+. if !\\n[fig*label-num] .nr fig*label-num 0 1
+. if '\\*[label-type]'pic' \
+. if !\\n[pic*label-num] .nr fig*label-num 0 1
+. nr \\*[label-type]*autolabel 1
+. nr loop-counter 0 1
+. nr loop-count \\n[#NUM_ARGS]
+. while \\n+[loop-counter]<=\\n[loop-count] \{\
+. if '\\$1'PREFIX' \{\
+. ds \\*[label-type]*label-prfx \\$2
+. nr \\*[label-type]*label-prfx-set 1
+. shift 2
+. \}
+. if '\\$1'SUFFIX' \{\
+. ds \\*[label-type]*label-sffx \\$2
+. nr \\*[label-type]*label-sffx-set 1
+. shift 2
+. \}
+. if '\\$1'PREFIX_CHAPTER' \{\
+. if \\n[fig*autolabel] .nr fig*label-with-chapter 1
+. nr \\*[label-type]*label-with-chapter 1
+. shift 1
+. if \B'\\$1' \{\
+. nr #CH_NUM \\$1
+. shift
+. \}
+. \}
+. \}
+. if '\\*[\\*[label-type]*label-prfx]'' \{\
+. if '\\*[label-type]'eqn' \
+. if !\\n[\\*[label-type]*label-prfx-set] \
+. ds \\*[label-type]*label-prfx (\"
+. if '\\*[label-type]'pic' \
+. if !\\n[\\*[label-type]*label-prfx-set] \
+. ds \\*[label-type]*label-prfx Fig. \"
+. if '\\*[label-type]'pdf-img' \
+. if !\\n[\\*[label-type]*label-prfx-set] \
+. ds \\*[label-type]*label-prfx Fig. \"
+. if '\\*[label-type]'tbl' \
+. if !\\n[\\*[label-type]*label-prfx-set] \
+. ds \\*[label-type]*label-prfx Table \"
+. \}
+. if '\\*[\\*[label-type]*label-sffx]'' \{\
+. if '\\*[label-type]'eqn' \
+. if !\\n[\\*[label-type]*label-sffx-set] \
+. ds \\*[label-type]*label-sffx )\"
+. if '\\*[label-type]'pic' \
+. if !\\n[\\*[label-type]*label-sffx-set] \
+. ds \\*[label-type]*label-sffx .\"
+. if '\\*[label-type]'pdf-img' \
+. if !\\n[\\*[label-type]*label-sffx-set] \
+. ds \\*[label-type]*label-sffx .\"
+. if '\\*[label-type]'tbl' \
+. if !\\n[\\*[label-type]*label-sffx-set] \
+. ds \\*[label-type]*label-sffx .\"
+. \}
+. if \\n[\\*[label-type]-label-args]>0 \{\
+. if \\n[\\*[label-type]*label-prfx-set]+\\n[\\*[label-type]*label-sffx-set]=1 \{\
+. ie (\\n[\\*[label-type]*label-prfx-set]=1)&(\\n[\\*[label-type]*label-sffx-set]=0) \
+. ds missing-arg SUFFIX
+. el .ds missing-arg PREFIX
+. tm1 "[mom]: You must supply a \\*[missing-arg] argument to \\$0.
+. tm1 " If you wish the \\*[missing-arg] to be blank, use \\*[missing-arg] "".
+. ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. \}
+. \}
+. if \\n[#NUM_ARGS]=1 \{\
+. rr fig*autolabel
+. rr \\*[label-type]*autolabel
+. rr \\*[label-type]*label-prfx-set
+. rr \\*[label-type]*label-sffx-set
+. \}
+. rr \\*[label-type]-label-args
+.END
+\#
+.ALIAS AUTOLABEL_EQUATIONS AUTOLABEL
+.ALIAS AUTOLABEL_IMAGES AUTOLABEL
+.ALIAS AUTOLABEL_PIC AUTOLABEL
+.ALIAS AUTOLABEL_TABLES AUTOLABEL
+\#
+\# SET AUTOLABEL NUMBER
+\# --------------------
+\# *Argument:
+\# FIG | TBL | PIC | EQN <n>
+\# *Function:
+\# Sets the autolabel number for the corresponding label type.
+\# *Notes:
+\# Used to set autolabel number when manual labelling of floats
+\# (in conjunction with TO_LIST) disrupts auto-incrementing.
+\#
+.MAC SET_AUTOLABEL END
+. rm labelnum-type
+. if '\\$1'FIG' .ds labelnum-type fig
+. if '\\$1'TBL' .ds labelnum-type tbl
+. if '\\$1'PIC' .ds labelnum-type pic
+. if '\\$1'EQN' .ds labelnum-type eqn
+. nr labelnum \\$2-1
+. nr \\*[labelnum-type]*label-num \\n[labelnum] 1
+.END
+\#
+\# MLA STYLE
+\# ---------
+\# *Argument:
+\# <none> | <anything>
+\# *Function:
+\# Sets or removes register #MLA.
+\# *Notes:
+\# MLA formatting differs from other styles wrt caption and
+\# label placement.
+\#
+.MAC MLA END
+. ie '\\$1'' \{\
+. nr #MLA 1
+. nr pdf-img*caption-after-label 1
+. nr pic*caption-after-label 1
+. rr tbl*caption-after-label
+. \}
+. el \
+. rr #MLA
+.END
+\#
+.MAC mla@error END
+. tm1 "[mom]: MLA style enabled, but \\$1 has no corresponding \\$2.
+. ab [mom]: Aborting '\\$3' at \\$4, line \\$5.
+.END
+\#
+\# LISTS_OF
+\# --------
+\# *Aliases:
+\# LIST_OF_EQUATIONS
+\# LIST_OF_FIGURES
+\# LIST_OF_TABLES
+\# *Arguments:
+\# [ TITLE_STRING <string> ] [ START_PAGENUM <pagenumber> ]
+\# *Function:
+\# Generates lists-of based on calling alias.
+\# *Notes:
+\# Called at end of file.
+\# If after TOC, and TOC is being auto-relocated, lists are also
+\# relocated. If called before, lists are output at end of file.
+\#
+.MAC LISTS_OF END
+. EOL
+. ds $LIST_TYPE \\$0
+. nr #LISTS 1
+. substring $LIST_TYPE -1 -4
+. if '\\*[$LIST_TYPE]'URES' \{\
+. ds $LIST_TYPE FIGURES
+. ds list-type fig
+. ds label-type fig
+. ds \\*[$LIST_TYPE]_TITLE_STRING "List of Figures
+. \}
+. if '\\*[$LIST_TYPE]'BLES' \{\
+. ds $LIST_TYPE TABLES
+. ds list-type tbl
+. ds label-type tbl
+. ds \\*[$LIST_TYPE]_TITLE_STRING "List of Tables
+. \}
+. if '\\*[$LIST_TYPE]'IONS' \{\
+. ds $LIST_TYPE EQUATIONS
+. ds list-type eqn
+. ds label-type eqn
+. ds \\*[$LIST_TYPE]_TITLE_STRING "List of Equations
+. \}
+. nr #LIST_OF_\\*[$LIST_TYPE] 1
+. nr loop-count 0 1
+. nr loop-counter \\n[#NUM_ARGS]
+. while \\n+[loop-count]<=\\n[loop-counter] \{\
+. if '\\$1'TITLE_STRING' \{\
+. ds \\*[$LIST_TYPE]_TITLE_STRING \\$2
+. shift 2
+. \}
+. if '\\$1'START_PAGENUM' \{\
+. nr #\\*[$LIST_TYPE]_START_PAGENUM \\$2
+. shift 2
+. \}
+. \}
+. if dPDF.EXPORT \
+. if \\n[#FLEX_ACTIVE] \
+. if !\\n[#NO_FLEX] \
+. tm .ds pre-list-\\n%@\\n[#COL_NUM] 1
+. char \[leader] " .
+. LEADER_CHARACTER \[leader]
+. if \\n[#LINENUMBERS]=1 \{\
+. NUMBER_LINES OFF
+. nr #LINENUMBERS 2
+. \}
+. if \\n[#FINIS] \{\
+. if \\n[#FOOTERS_WERE_ON] \
+. FOOTERS
+. \}
+. if \\n[#FOOTERS_ON]=1 \{\
+. if !'\\*[$HDRFTR_CENTER_OLD]'' .ds $HDRFTR_CENTER \\*[$HDRFTR_CENTER_OLD]
+. ie \\n[#LISTS_NO_PAGENUM]=1 .PAGINATION OFF
+. el .PAGINATE
+. \}
+. if \\n[#FOOTERS_WERE_ON] \
+. if !\\n[#FINIS] .FOOTERS OFF
+. rr #COLUMNS
+. COLLATE
+. if \\n[#PRINT_STYLE]=1 \{\
+. if \\n[#SINGLE_SPACE] .LS 24
+. DOC_LEAD_ADJUST
+. \}
+. if \\n[#FINIS] \{\
+. if \\n[#FOOTERS_WERE_ON] .FOOTERS
+. rr #FOOTERS_WERE_ON
+. if \\n[#PAGINATION_WAS_ON] \{\
+. nr #PAGINATE 1
+. rr #PAGINATION_WAS_ON
+. \}
+. rr #FINIS
+. \}
+. ds $HDRFTR_CENTER \\*[$HDRFTR_CENTER_NEW]
+. rm $HDRFTR_CENTER_OLD
+. rm $HDRFTR_CENTER_NEW
+. rr #COLLATED_DOC
+. DOCTYPE DEFAULT
+. DOCHEADER
+. rr #DOCHEADER_ADVANCE
+. TITLE "\\*[\\*[$LIST_TYPE]_TITLE_STRING]
+. AUTHOR ""
+. L_MARGIN \\n[#DOC_L_MARGIN]u
+. LL \\n[#DOC_L_LENGTH]u
+. if '\\*[$LISTS_FAM]'' \
+. ds $LISTS_FAM \\*[$TOC_FAM]
+. if '\\*[$LISTS_FT]'' \
+. ds $LISTS_FT \\*[$TOC_TITLE_FT]
+. if !\\n[#LISTS_PS] \
+. nr #LISTS_PS \\n[#TOC_PS]
+. ps \\n[#LISTS_PS]u
+. if !\\n[#LISTS_LEAD] \
+. nr #LISTS_LEAD \\n[#TOC_LEAD]
+. if \\n[#PRINT_STYLE]=2 \{\
+. ie \\n[#LISTS_LEAD_ADJUST]=1 \{\
+. nr #DOC_LEAD \\n[#LISTS_LEAD]
+. DOC_LEAD_ADJUST
+. TRAPS
+. \}
+. el \{\
+. nr #DOC_LEAD \\n[#LISTS_LEAD]
+. DOC_LEAD_ADJUST OFF
+. \}
+. \}
+. ie !'\\*[$LISTS_TITLE_QUAD]'' \
+. DOCHEADER_QUAD \\*[$LISTS_TITLE_QUAD]
+. el .DOCHEADER_QUAD \\*[$TOC_HEADER_QUAD]
+. if !'\\*[$LISTS_TITLE_FAM]'' \
+. TITLE_FAMILY \\*[$LISTS_TITLE_FAM]
+. if !'\\*[$LISTS_TITLE_FT]'' \
+. TITLE_FONT \\*[$LISTS_TITLE_FT]
+. if !'\\*[$LISTS_TITLE_SIZE]'' \
+. TITLE_SIZE \\*[$LISTS_TITLE_SIZE]
+. if !'\\*[$LISTS_TITLE_COLOR]'' \
+. TITLE_COLOR \\*[$LISTS_TITLE_COLOR]
+. if \\n[#LISTS_TITLE_CAPS] \
+. TITLE_CAPS
+. if \\n[#LISTS_TITLE_SMALLCAPS] \
+. TITLE_SMALLCAPS
+. if \\n[#LISTS_TITLE_UNDERSCORE] \{\
+. TITLE_UNDERSCORE \
+\\*[DOUBLE] \
+\\*[$LISTS_OF_UL_WT] \
+\\*[$LISTS_OF_UL_GAP] \
+\\*[$LISTS_OF_RULE_GAP]
+. \}
+. if '\\*[$LISTS_PN_FAM]'' \
+. ds $LISTS_PN_FAM \\*[$TOC_PN_FAM]
+. if '\\*[$LISTS_PN_FT]'' \
+. ds $LISTS_PN_FT \\*[$TOC_PN_FT]
+. if '\\*[$LISTS_PN_SIZE_CHANGE]'' \
+. ds $LISTS_PN_SIZE_CHANGE \\*[$TOC_PN_SIZE_CHANGE]
+. if !\\n[#EQN_PN_PADDING] \
+. nr #EQN_PN_PADDING \\n[#TOC_PN_PADDING]
+. if !\\n[#FIG_PN_PADDING] \
+. nr #FIG_PN_PADDING \\n[#TOC_PN_PADDING]
+. if !\\n[#TBL_PN_PADDING] \
+. nr #TBL_PN_PADDING \\n[#TOC_PN_PADDING]
+. ie '\\*[$LISTS_PAGENUM_STYLE]'' \
+. PAGENUM_STYLE \\*[$TOC_PAGENUM_STYLE]
+. el \
+. PAGENUM_STYLE \\*[$LISTS_PAGENUM_STYLE]
+. if r #\\*[$LIST_TYPE]_START_PAGENUM \
+. PAGENUMBER \\n[#\\*[$LIST_TYPE]_START_PAGENUM]
+. if r #LISTS_NO_PAGENUM .PAGINATION off
+. HEADER_LEFT "\\*[$HDRFTR_LEFT]
+. HEADER_RIGHT "\\*[$HDRFTR_RIGHT]
+. HEADER_CENTER "\\*[\\*[$LIST_TYPE]_TITLE_STRING]
+. if \\n[#LINENUMBERS]=2 .nr #LINENUMBERS 3
+.\" Get num placeholders for ch. num and label num.
+. if \\n[\\*[list-type]*autolabel] \{\
+. if \\n[\\*[label-type]*label-with-chapter] \{\
+. if \\n[#CH_NUM]<1000 .nr chapno-width 3
+. if \\n[#CH_NUM]<100 .nr chapno-width 2
+. if \\n[#CH_NUM]<10 .nr chapno-width 1
+. \}
+. if \\n[\\*[list-type]*label-num]<1000 .nr label-width 3
+. if \\n[\\*[list-type]*label-num]<100 .nr label-width 2
+. if \\n[\\*[list-type]*label-num]<10 .nr label-width 1
+.\" Calculate width of label-num tab
+. nr label-width \\n[\\*[list-type]*label-width]
+. \}
+. if \\n[#SLANT_ON] .nop \\*[SLANTX]
+. if \\n[#COLUMNS]=1 .nr #COLUMNS 0
+. START
+. if \\n[#PRINT_STYLE]=2 .sp -1
+. if '\\*[$LIST_TYPE]'FIGURES' .LIST_OF_FIG
+. if '\\*[$LIST_TYPE]'TABLES' .LIST_OF_TBL
+. if '\\*[$LIST_TYPE]'EQUATIONS' .LIST_OF_EQN
+. if \\n[#LINENUMBERS]=3 \{\
+. NUMBER_LINES RESUME
+. nr #LINENUMBERS 1
+. nn 1
+. \}
+. rr #LISTS
+. pdfsync
+.END
+.\"
+.ALIAS LIST_OF_EQUATIONS LISTS_OF
+.ALIAS LIST_OF_FIGURES LISTS_OF
+.ALIAS LIST_OF_TABLES LISTS_OF
+\#
+\# LISTS-OF STYLE
+\# --------------
+\# *Arguments:
+\# FAMILY fam \
+\# FONT sty \
+\# PT_SIZE size \
+\# LEAD leading [ADJUST] \
+\# TITLE_FAMILY fam \
+\# TITLE_FONT sty \
+\# TITLE_SIZE +|-size \
+\# TITLE_QUAD LEFT | CENTER | RIGHT \
+\# TITLE_COLOR color \
+\# TITLE_CAPS \
+\# TITLE_NO_CAPS \
+\# TITLE_SMALLCAPS \
+\# TITLE_NO_SMALLCAPS \
+\# TITLE_UNDERSCORE [ DOUBLE] <wt> <gap> (dbl-rule-gap) \
+\# NO_PAGINATION \
+\# PAGENUM_STYLE format \
+\# PN_FAMILY fam \
+\# PN_FONT sty \
+\# PN_SIZE +|-size \
+\# PN_PADDING n
+\# *Function:
+\# Allows setting of all style parameters for lists-of.
+\# *Notes:
+\# Assumption is that lists-of will all have the same style.
+\# TOC style is used if LISTS_STYLE is omitted.
+\#
+.MAC LISTS_STYLE END
+. nr loop-count 0 1
+. nr loop-counter \\n[#NUM_ARGS]
+. while \\n+[loop-count]<=\\n[loop-counter] \{\
+. if '\\$1'FAMILY' \{\
+. ds $LISTS_FAM \\$2
+. shift 2
+. \}
+. if '\\$1'FONT' \{\
+. ds $LISTS_FT \\$2
+. shift 2
+. \}
+. if '\\$1'TITLE_FAMILY' \{\
+. ds $LISTS_TITLE_FAM \\$2
+. shift 2
+. \}
+. if '\\$1'TITLE_FONT' \{\
+. ds $LISTS_TITLE_FT \\$2
+. shift 2
+. \}
+. if '\\$1'TITLE_SIZE' \{\
+. ds $LISTS_TITLE_SIZE \\$2
+. shift 2
+. \}
+. if '\\$1'TITLE_QUAD' \{\
+. ds $LISTS_TITLE_QUAD \\$2
+. shift 2
+. \}
+. if '\\$1'TITLE_COLOR' \{\
+. ds $LISTS_TITLE_COLOR \\$2
+. shift 2
+. \}
+. if '\\$1'TITLE_CAPS' \{\
+. nr #LISTS_TITLE_CAPS 1
+. shift 1
+. \}
+. if '\\$1'TITLE_NO_CAPS' \{\
+. rr #LISTS_TITLE_CAPS
+. shift 1
+. \}
+. if '\\$1'TITLE_SMALLCAPS' \{\
+. nr #LISTS_TITLE_SMALLCAPS 1
+. shift 1
+. \}
+. if '\\$1'TITLE_NO_SMALLCAPS' \{\
+. rr #LISTS_TITLE_NO_SMALLCAPS
+. shift 1
+. \}
+.\" UNDERSCORE and UNDERLINE are identical, but we can't evaluate
+.\" the results of two string comparisons.
+. if '\\$1'TITLE_UNDERSCORE' \{\
+. nr #LISTS_TITLE_UNDERSCORE 1
+. shift
+. ie '\\$1'DOUBLE' \{\
+. ds DOUBLE DOUBLE
+. shift
+. if \B'\\$1' \{\
+. ds $LISTS_OF_UL_WT \\$1
+. shift
+. \}
+. if \B'\\$1' \{\
+. ds $LISTS_OF_UL_GAP \\$1
+. shift
+. \}
+. if \B'\\$1' \{\
+. ds $LISTS_OF_RULE_GAP \\$1
+. shift
+. \}
+. \}
+. el \{\
+. if \B'\\$1' \{\
+. ds $LISTS_OF_UL_WT \\$1
+. shift
+. \}
+. if \B'\\$1' \{\
+. ds $LISTS_OF_UL_GAP \\$1
+. shift
+. \}
+. \}
+. \}
+. if '\\$1'TITLE_UNDERLINE' \{\
+. nr #LISTS_TITLE_UNDERSCORE 1
+. shift
+. ie '\\$1'DOUBLE' \{\
+. ds DOUBLE DOUBLE
+. shift
+. if \B'\\$1' \{\
+. ds $LISTS_OF_UL_WT \\$1
+. shift
+. \}
+. if \B'\\$1' \{\
+. ds $LISTS_OF_UL_GAP \\$1
+. shift
+. \}
+. if \B'\\$1' \{\
+. ds $LISTS_OF_RULE_GAP \\$1
+. shift
+. \}
+. \}
+. el \{\
+. if \B'\\$1' \{\
+. ds $LISTS_OF_UL_WT \\$1
+. shift
+. \}
+. if \B'\\$1' \{\
+. ds $LISTS_OF_UL_GAP \\$1
+. shift
+. \}
+. \}
+. \}
+. if '\\$1'TITLE_NO_UNDERSCORE' \{\
+. rr #LISTS_TITLE_UNDERSCORE 1
+. rm DOUBLE
+. rm $LISTS_OF_UL_WT
+. rm $LISTS_OF_UL_GAP
+. rm $LISTS_OF_RULE_GAP
+. shift
+. \}
+. if '\\$1'TITLE_NO_UNDERLINE' \{\
+. rr #LISTS_TITLE_UNDERSCORE 1
+. rm DOUBLE
+. rm $LISTS_OF_UL_WT
+. rm $LISTS_OF_UL_GAP
+. rm $LISTS_OF_RULE_GAP
+. shift
+. \}
+. if '\\$1'PT_SIZE' \{\
+. nr #LISTS_PS (p;\\$2)
+. shift 2
+. \}
+. if '\\$1'LEAD' \{\
+. nr #LISTS_LEAD (p;\\$2)
+. ie !'\\$3'ADJUST' \{\
+. nr #LISTS_LEAD_ADJUST 0
+. shift 2
+. \}
+. el \{\
+. nr #LISTS_LEAD_ADJUST 1
+. shift 3
+. \}
+. \}
+. if '\\$1'NO_PAGINATION' \{\
+. nr #LISTS_NO_PAGENUM 1
+. shift 1
+. \}
+. if '\\$1'PAGENUM_STYLE' \{\
+. ds $LISTS_PAGENUM_STYLE \\$2
+. shift 2
+. \}
+. if '\\$1'PN_FAMILY' \{\
+. ds $LISTS_PN_FAM \\$2
+. shift 2
+. \}
+. if '\\$1'PN_FONT' \{\
+. ds $LISTS_PN_FT \\$2
+. shift 2
+. \}
+. if '\\$1'PN_SIZE' \{\
+. ds $LISTS_PN_SIZE_CHANGE \\$2
+. shift 2
+. \}
+. if '\\$1'EQN_PN_PADDING' \{\
+. nr #EQN_PN_PADDING \\$2
+. shift 2
+. \}
+. if '\\$1'FIG_PN_PADDING' \{\
+. nr #FIG_PN_PADDING \\$2
+. shift 2
+. \}
+. if '\\$1'TBL_PN_PADDING' \{\
+. nr #TBL_PN_PADDING \\$2
+. shift 2
+. \}
+. \}
+.END
+\#
+\# Lists-of collector
+\# Strings to allocate space for leaders and entry page numbers
+\#
+.ds $LISTS_PN \\*[ST102]\F[\\*[$LISTS_PN_FAM]]\f[\\*[$LISTS_PN_FT]]\
+\s[\\n[#LISTS_PS]u]^\\*[ST102X]\\*[ST103]\s[\\\\*[$LISTS_PN_SIZE_CHANGE]]\
+\h'.5m'\h'\w'0'u*\\\\n[#LISTS_PN_PADDING]u'\\*[ST103X]
+\#
+.ds $LISTS_PN_TYPEWRITE \\*[ST102]^\\*[ST102X]\\*[ST103]\|\
+\h'\w'\0'u*\\\\n[#LISTS_PN_PADDING]u'\\*[ST103X]
+\#
+.MAC LISTS_COLLECTOR END
+. nr #LISTS_ENTRY_PN \\n%+\\n[#PAGE_NUM_ADJ]
+. if \\n[#KERN] .nr #RESTORE_KERN 1
+. KERN OFF
+. if '\\$0'TO_EQUATIONS' \{\
+. ds list-type eqn
+. ds label-type eqn
+. da LIST_OF_EQN
+\!. nr #LISTS_PN_PADDING \\\\n[#EQN_PN_PADDING]
+. \}
+. if '\\$0'TO_FIGURES' \{\
+. ds list-type fig
+. ds label-type fig
+. if (\\n[pdf-img*have-label]=1):(\\n[pdf-img*autolabel]=1):\
+(\\n[pic*autolabel]=1):(\\n[pic*have-label]=1) \{\
+. nr \\*[label-type]*have-label 1
+. if !'\\*[pdf-img*label]'' .rn pdf-img*label \\*[label-type]*label
+. if !'\\*[pic*label]'' .rn pic*label \\*[label-type]*label
+. \}
+. da LIST_OF_FIG
+\!. nr #LISTS_PN_PADDING \\\\n[#FIG_PN_PADDING]
+. \}
+. if '\\$0'TO_TABLES' \{\
+. ds list-type tbl
+. ds label-type tbl
+. da LIST_OF_TBL
+\!. nr #LISTS_PN_PADDING \\\\n[#TBL_PN_PADDING]
+. \}
+. br
+. ie \\n[#PRINT_STYLE]=1 \{\
+\!. fam \\*[$TYPEWRITER_FAM]
+\!. ft R
+\!. ps \\*[$TYPEWRITER_PS]
+. ds _TYPEWRITE _TYPEWRITE
+. \}
+. el \{\
+\!. FAMILY \\\\*[$LISTS_FAM]
+\!. FONT \\\\*[$LISTS_FT]
+\!. ps \\\\n[#LISTS_PS]u
+. \}
+. if \\n[#PRINT_STYLE]=2 .rm _TYPEWRITE
+\!. PAD_MARKER ^
+\!. vpt 0
+. ie !\\n[\\*[label-type]*autolabel] \{\
+.\" If there is a label...
+. if !'\\*[\\*[label-type]*label]'' \
+\!. PAD \
+"\\*[ST100]\h'\w'\\*[\\*[label-type]*label]'u'\\*[ST100X]\0\\*[ST101]\h'\w'\\$2'u'\\*[ST101X]\\\\*[$LISTS_PN\\*[_TYPEWRITE]]" \
+"\*[PDFBOOKMARK.NAME]"
+.\" If there is no label...
+. if '\\*[\\*[label-type]*label]'' \
+\!. PAD \
+"\\*[ST100]\\*[ST100X]\\*[ST101]\h'\w'\\$1'u'\0\\*[ST101X]\\\\*[$LISTS_PN\\*[_TYPEWRITE]]" \
+"\*[PDFBOOKMARK.NAME]"
+. \}
+.\" If autolabelling...
+. el \
+\!. PAD \
+"\\*[ST100]\h'\\\\n[label-width]u'\\*[ST100X]\ \ \ \\*[ST101]\h'\w'\\$2'u'\\*[ST101X]\\\\*[$LISTS_PN\\*[_TYPEWRITE]]" \
+"\*[PDFBOOKMARK.NAME]"
+\!. PAD_MARKER #
+\!. EOL
+. ie !\\n[\\*[label-type]*autolabel] \
+\!. ST 100 L
+. el \
+\!. ST 100 R
+\!. ST 101 L
+\!. ST 102 L
+\!. ST 103 R
+. if \\n[#PRINT_STYLE]=2 \{\
+\!. FAMILY \\\\*[$LISTS_FAM]
+\!. FT \\\\*[$LISTS_FT]
+\!. ps \\\\n[#LISTS_PS]u
+. \}
+\!. TAB 100
+\!. PDF_LINK \\*[list-type]:\\n[lists*target] "\\$1"
+\!. TN
+\!. vpt 0
+\!. PDF_LINK \\*[list-type]:\\n[lists*target] "\\$2"
+\!. TN
+\!. vpt 0
+\!. PRINT \fR\\*[LEADER]\f[]
+\!. TN
+. if \\n[#PRINT_STYLE]=2 \{\
+\!. FAMILY \\\\*[$LISTS_PN_FAM]
+\!. FT \\\\*[$LISTS_PN_FT]
+\!. ps \\\\*[$LISTS_PN_SIZE_CHANGE]
+. \}
+\!. PRINT \\n[#LISTS_ENTRY_PN]
+\!. TQ
+\!. vpt
+. da
+. if \\n[#RESTORE_KERN] .KERN
+.END
+.
+.ALIAS TO_EQUATIONS LISTS_COLLECTOR
+.ALIAS TO_FIGURES LISTS_COLLECTOR
+.ALIAS TO_TABLES LISTS_COLLECTOR
+\#
+\# ***tbl***
+\#
+\# Support for multipage tables with headers borrowed from ms and
+\# mommified by Robin Haberkorn <robin.haberkorn@googlemail.com>
+\# with extensions by Peter Schaffter.
+\#
+.nr tbl*have-header 0
+.ds T&
+\#
+.MAC TS END
+. if \\n[.t]<\\n[#DOC_LEAD] .nr begin-tbl 1
+. br
+. rr tbl*pdfbx
+. if r pdfbx-top \{\
+. rt
+. sp (\\*[wt\\n[stack]]/2u)+\\*[gap\\n[stack]]u
+. \}
+. rr begin-tbl
+. rm tbl*caption
+. rm tbl*label
+. rr tbl*have-caption
+. rr tbl*have-label
+. rr tbl*have-header
+. rr float*tbl
+. rr tbl*boxed
+. nr ind-pre-tbl \\n[.i]
+. nr ll-pre-tbl \\n[.l]
+. nr lead-pre-tbl \\n[.v]
+. nr tbl*needs 1
+. nr doing-tbl 1
+. nf
+. if '\\n[.z]'FLOAT*DIV' .nr float*tbl 1
+. if !'\\n[.z]'FLOAT*DIV' \{\
+. if \\n[.t]=1 \{\
+. if (\\n[@TOP]=0)&(\\n[#START]=0) \{\
+. ie \\n[#COLUMNS] .COL_NEXT internal
+. el .NEWPAGE
+. \}
+. \}
+. \}
+. nr loop-count 0 1
+. nr loop-counter \\n[#NUM_ARGS]
+. ie \\n[#NUM_ARGS]=1 \{\
+. if '\\$1'H' \{\
+. nr tbl*have-header 1
+. nr tbl*plain 1
+. \}
+. \}
+. el \{\
+. while \\n+[loop-count]<=\\n[loop-counter] \{\
+. if '\\$1'H' \{\
+. nr tbl*have-header 1
+. shift
+. \}
+. if '\\$1'BOXED' \{\
+. nr tbl*boxed 1
+. shift
+. \}
+. if '\\$1'CENTER' \{\
+. if \\n[#INDENT_BOTH_ACTIVE] \{\
+. IBX
+. nr #RESTORE_INDENT_BOTH 1
+. \}
+. nr tbl*center 1
+. shift
+. \}
+. if '\\$1'CENTRE' \{\
+. if \\n[#INDENT_BOTH_ACTIVE] \{\
+. IBX
+. nr #RESTORE_INDENT_BOTH 1
+. \}
+. nr tbl*center 1
+. shift
+. \}
+. if '\\$1'NEEDS' \{\
+. nr tbl*needs \\$2
+. shift 2
+. \}
+. if '\\$1'NO_SHIM' \{\
+. nr tbl*no-shim 1
+. shift
+. \}
+. if '\\$1'NO_FLEX' \{\
+. nr tbl*no-flex 1
+. shift
+. \}
+. if '\\$1'ADJUST' \{\
+. ds tbl*space-adj \\$2
+. shift 2
+. \}
+. if '\\$1'CAPTION' \{\
+. nr tbl*have-caption 1
+. ds tbl*caption \\$2
+. shift 2
+. \}
+. if '\\$1'SHORT_CAPTION' \{\
+. ds tbl*caption-short \\$2
+. shift 2
+. \}
+. if '\\$1'LABEL' \{\
+. nr tbl*have-label 1
+. ds tbl*label \\$2
+. shift 2
+. \}
+. if '\\$1'TARGET' \{\
+. ds target "\\$2
+. PDF_TARGET "\\*[target]
+. shift 2
+. \}
+. \}
+. \}
+. if (\\n[tbl*have-caption]=0):(\\n[tbl*caption-after-label]=1) \{\
+. rr pdfbx-top
+. if \\n[tbl*boxed] .sp -1p
+. \}
+. if \\n[tbl*have-header] .nr tbl*needs +1
+. if (\\n[tbl*have-label]=1):(\\n[tbl*autolabel]=1) \
+. ds label-type tbl
+. if (\\n[tbl*have-caption]=1)&(\\n[tbl*have-header]=0) \
+. tbl*caption-warning
+. if \\n[tbl*boxed] \{\
+. if (\\n[tbl*have-label]=0)&(\\n[tbl*have-caption]=0)&\
+(\\n[tbl*autolabel]=0)&(\\n[tbl*have-source]=0) \
+. nr tbl*plain-boxed 1
+. \}
+. if !\\n[tbl*have-header] .nr tbl*no-header 1
+. ds tbl*label-sffx-tmp \\*[tbl*label-sffx]
+. if !'\\*[tbl*label-sffx-tmp]'' .substring tbl*label-sffx-tmp -1
+. if '\\*[tbl*label-sffx-tmp]'.' \
+. if (\\n[tbl*caption-after-label]=0):(\\n[#MLA]=1) .chop tbl*label-sffx
+. if \\n[tbl*caption-after-label] \{\
+. if !'\\*[tbl*label-sffx]'' \
+. if '\\*[tbl*caption]'' .chop tbl*label-sffx
+. \}
+. if !'\\*[tbl*caption-short]'' .ds short -short
+. if \\n[tbl*autolabel] \{\
+. if \\n[tbl*label-with-chapter] \
+. ds chapno \\n[#CH_NUM].
+. ds tbl*label \
+\\*[tbl*label-prfx]\\*[chapno]\\n+[tbl*label-num]\\*[tbl*label-sffx]\"
+. nr tbl*label-width \w'\\*[tbl*label]'
+. \}
+. ie \\n[@TOP] \{\
+. if !'\\n[.z]'FLOAT*DIV' \{\
+. RESTORE_SPACE
+. nr @TOP 1
+. if \\n[#COLUMNS] \
+. if !'\\*[tbl*space-adj]'' \
+. sp \\*[tbl*space-adj]-1v
+. if \\n[tbl*boxed] .nr tbl*boxed 2
+. vpt
+. \}
+. \}
+. el \
+. if !'\\*[tbl*space-adj]'' .sp \\*[tbl*space-adj]u
+. if !\\n[#MLA] \{\
+. if (\\n[tbl*have-caption]=0):(\\n[tbl*caption-after-label]=1) \{\
+. ie !'\\n[.z]'FLOAT*DIV' \{\
+. ie !\\n[tbl*boxed]=2 \{\
+. if \\n[tbl*have-header] .nr tbl*restore-header 1
+. if !\\n[@TOP] .sp .5v
+. if \\n[tbl*boxed] .sp .25v
+. if \\n[tbl*restore-header]=1 .nr tbl*have-header 1
+. \}
+. el \{\
+. if !\\n[tbl*boxed] .ns
+. sp .25v
+. \}
+. \}
+. el .sp .5v
+. \}
+. \}
+. if \\n[nl]=\\n[#PAGE_TOP] .ns
+. if '\\n[.z]'FLOAT*DIV' \{\
+. ie \\n[defer]>0 .sp .5v
+. el .sp .25v
+. \}
+. if \\n[@TOP] .rr @TOP
+. ds ev-current \\n[.ev]
+. if (\\n[nl]=\\n[#PAGE_TOP]):(\\n[nl]=\\n[dc]) \
+. nr tbl*caption-lead-diff-adj 1
+. if \\n[#MLA] \
+. if \\n[tbl*have-label]+\\n[tbl*have-caption]=0 \
+. sp .5v
+. if \\n[tbl*boxed]=2 \{\
+. if \\n[#MLA]=0 \
+. if (\\n[tbl*caption-after-label]=1):(\\n[tbl*have-caption]=0) \
+. sp 1n
+. \}
+. fi
+. if \\n[tbl*have-header] \{\
+. di tbl*header-div
+. ev table-header
+. evc \\*[ev-current]
+. if !\\n[float-span] \{\
+. ie '\\*[ev-current]'FLOAT' \{\
+. ie !\\n[tbl*center] \
+. in 0
+. el \{\
+. in 0
+\!. in 0
+. \}
+. \}
+. el \!.in 0
+. \}
+. \}
+.END
+\#
+.MAC TH END
+. ie '\\n[.z]'tbl*header-div' \{\
+. nr T. 0
+. T#
+. di
+. ev
+. if \\n[#PDF_BOOKMARKS] \{\
+. ie !'\\n[.z]'' \{\
+. if (\\n[float*img]=0)&(\\n[float*pic]=0)&(\\n[float*eqn]=0) \{\
+\!. PDF_TARGET tbl:\\\\n+[lists*target]
+. ie !'\\*[tbl*label]'' \
+\!. TO_TABLES "\\*[tbl*label]" "\\*[tbl*caption\\*[short]]"
+. el \
+\!. TO_TABLES "\\*[tbl*caption\\*[short]]"
+. \}
+. \}
+. el \{\
+. if '\\n[.z]'' .PDF_TARGET tbl:\\n+[lists*target]
+. ie !'\\*[tbl*label]'' \
+. TO_TABLES "\\*[tbl*label]" "\\*[tbl*caption\\*[short]]"
+. el \
+. TO_TABLES "\\*[tbl*caption\\*[short]]"
+. \}
+. \}
+. if \\n[#MLA] .if !\\n[tbl*have-caption] \
+. mla@error label caption \\n[.F] \\$0 \\n[.c]
+. if !'\\n[.z]'FLOAT*DIV' \{\
+. ie !\\n[tbl*boxed] \{\
+. nr th*needs (u;\\n[dn]+\\n[tbl*needs]v)
+. if \\n[th*needs]>\\n[.t] \{\
+. if dPDF.EXPORT \
+. if \\n[#FLEX_ACTIVE] \
+. if !\\n[#NO_FLEX] \
+. tm .ds pre-newpage-\\n% \\n%@\\n[#COL_NUM]
+. ne \\n[dn]u+\\n[tbl*needs]v
+. nr tbl@needs 1
+. \}
+. \}
+. el \{\
+. nr th*needs (u;\\n[dn]+.3n+\\n[tbl*needs]v)
+. if \\n[th*needs]>\\n[.t] \{\
+. if \\n[#COLUMNS] \
+. if !\\n[#COL_NUM]=\\n[#NUM_COLS] \
+. nr tbl*no-top-hook 1
+. nr tbl*no-print-header 1
+. if dPDF.EXPORT \
+. if \\n[#FLEX_ACTIVE] \
+. if !\\n[#NO_FLEX] \
+. tm .ds pre-newpage-\\n% \\n%@\\n[#COL_NUM]
+. ne \\n[dn]u+\\n[tbl*needs]v
+. nr tbl@needs 1
+. \}
+. \}
+. \}
+. ie (\\n[dn]-\\n[.v])>\\n[.t] \{\
+. if !\\n[@TOP] .@error ridiculously long table header
+. if \\n[tbl@needs] \{\
+. if \\n[tbl*boxed] \{\
+. RESTORE_SPACE
+. sp -1n
+. \}
+. rr tbl@needs
+. \}
+. if \\n[tbl*have-caption] .TBL*CAPTION
+. \}
+. el \{\
+. nr tbl*header-ht \\n[dn]
+. if \\n[tbl@needs] \{\
+. if \\n[tbl*boxed] \{\
+. RESTORE_SPACE
+. if !\\n[#MLA] \{\
+. if (\\n[tbl*have-caption]=0):(\\n[tbl*caption-after-label]=1) \
+. nop \&
+. sp -1n
+. \}
+. \}
+. rr tbl@needs
+. \}
+. if (\\n[tbl*have-caption]=1)&(\\n[tbl*caption-after-label]=0) \{\
+. TBL*CAPTION
+. vs
+. \}
+. tbl*print-header
+. \}
+. \}
+. el \{\
+. if \\n[tbl*have-caption] \{\
+. TBL*CAPTION
+. nr skip-th-warning 1
+. \}
+. if !\\n[skip-th-warning] .@error .TH without .TS H
+. rr skip-th-warning
+. \}
+.\" When centering a boxed table inside a float, .T# won't place
+.\" vertical rules in the correct horizontal position unless .ll is
+.\" given a nominal value (can be anything) and an indent is set
+.\" manually.
+. if '\\n[.z]'FLOAT*DIV' \{\
+. if \\n[tbl*center] \{\
+. nr float*ll \\n[.l]
+. ll 0
+. in \\n[float*ll]u-\\n[TW]u/2u
+. \}
+. \}
+.END
+\#
+.MAC TE END
+. if !r TW \{\
+. tm1 "[mom]: '\\n[.F]' contains tbl(1) data but '-t' flag is missing from
+. tm1 " the command line.
+. ab Aborting.
+. \}
+. ev tbl*end \" Needed because of .ad changes
+. evc \\*[ev-current]
+. nh
+. nf
+. rr tbl*no-header
+. if !'\\$1'' \{\
+. if '\\$1'SOURCE' \{\
+. ie !\\n[#MLA] \{\
+. tm1 "[mom]: \\$1 argument to \\$0 at line \\n[.c], but MLA style not enabled.
+. tm1 " Ignoring \\$1, but continuing to process.
+. \}
+. el \{\
+. nr tbl*have-source 1
+. shift
+. \}
+. \}
+. \}
+. if (\\n[#MLA]=1)&(\\n[tbl*have-source]=0) .tbl*source-warning
+. if !'\\n[.z]'FLOAT*DIV' \{\
+. if \\n[.t]<(\\n[.v]/2u) \{\
+. ie (\\n[tbl*have-label]=1):\
+(\\n[tbl*caption-after-label]=1):\
+(\\n[tbl*have-source]=1):\
+(\\n[tbl*autolabel]=1) \{\
+. rm tbl*header-div
+. nr tbl*no-top-hook 1
+. ie \\n[tbl*autolabel] \
+. if \\n[#MLA] \
+. if !\\n[tbl*have-source] .
+. el \{\
+. nr pgnum \\n%+\\n[#PAGE_NUM_ADJ]
+. if \\n[#COLUMNS]=1 .ds col-num ", column \\n[#COL_NUM]
+. tm1 "[mom]: '\\n[.F]', macro \\$0, line \\n[.c]:
+. tm1 " Insufficient room for label, caption, and/or source after
+. tm1 " table on page \\n[pgnum]\\*[col-num]. Omitting, but continuing to process table.
+. \}
+. nr tbl*skip-source 1
+. nr tbl*skip-label 1
+. rr tbl*have-caption
+. ie \\n[#COLUMNS] \
+. COL_NEXT internal
+. el .NEWPAGE
+. \}
+. el \{\
+.\" Don't print tbl-header at top of next page or column if tbl
+.\" finishes without room for further input at bottom of page
+. rm tbl*header-div
+. nr tbl*no-print-header 1
+. nr tbl*no-top-hook 1
+. ie \\n[#COLUMNS] \
+. COL_NEXT internal
+. el .NEWPAGE
+. \}
+. \}
+. \}
+. if !\\n[#MLA] \{\
+. if (\\n[tbl*have-label]=1):(\\n[tbl*autolabel]=1):(\\n[tbl*caption-after-label]=1) \{\
+. ev label
+. if '\\*[ev-current]'FLOAT' .evc 0
+. ie \\n[#PRINT_STYLE]=1 .TYPEWRITER
+. el \{\
+. tbl*label-style
+. vs \\n[.ps]u+\\n[tbl*label-autolead]u
+. \}
+. SIZESPECS
+. if \\n[tbl*label-with-chapter] \
+. ds chapno \\n[#CH_NUM].
+. TBL*SET_LABEL_QUAD \\*[tbl*label-quad]
+. di tbl*label-div
+. ie \\n[tbl*boxed] .sp \\n[#CAP_HEIGHT]u
+. el .sp \\n[#DOC_LEAD]u/4u
+. if (\\n[tbl*have-label]=1):(\\n[tbl*autolabel]=1) \{\
+. if !'\\*[tbl*label-space]'' .sp \\*[tbl*label-space]
+. ie \\n[tbl*autolabel] \{\
+. ie !\\n[tbl*caption-after-label] .nop \
+\\*[tbl*label]
+. el \{\
+. nop \
+\\*[tbl*label]\|
+. tbl*caption-style
+. vs \\n[.ps]u+\\n[tbl*caption-autolead]u
+. ds tbl*caption-old \\*[tbl*caption]
+. ds tbl*caption " \\*[tbl*caption]
+. nop \\*[tbl*caption]
+. ds tbl*caption \\*[tbl*caption-old]
+. \}
+. \}
+. el \{\
+. ie !\\n[tbl*caption-after-label] .nop \\*[tbl*label]
+. el \{\
+. nop \\*[tbl*label]\ \|\c
+. tbl*caption-style
+. vs \\n[.ps]u+\\n[tbl*caption-autolead]u
+. ds tbl*caption " \\*[tbl*caption]
+. nop \\*[tbl*caption]
+. \}
+. \}
+. \}
+. br
+. di
+. in 0
+. ev
+. nr pgnum \\n%+\\n[#PAGE_NUM_ADJ]
+. ie !'\\n[.z]'FLOAT*DIV' \{\
+. rr tbl*have-header
+. rr tbl*have-caption
+. ie (\\n[dn]-\\n[.v])>\\n[.t] \{\
+. if \\n[#COLUMNS]=1 .ds col-num ", column \\n[#COL_NUM]
+. tm1 "[mom]: '\\n[.F]', macro \\$0, line \\n[.c]:
+. tm1 " Insufficient room for label, caption, and/or source after
+. tm1 " table on page \\n[pgnum]\\*[col-num]. Omitting, but continuing to process.
+. ie \\n[#COLUMNS] \
+. COL_NEXT internal
+. el .NEWPAGE
+. if d tbl*header-div .rm tbl*header-div
+. rr tbl*caption-top-lead-diff
+. nr tbl*skip-source 1
+. nr tbl*skip-label 1
+. \}
+. el .print-label
+. \}
+. el .print-label
+. \}
+. \}
+. if \\n[tbl*autolabel] \{\
+. ds tbl*label \\*[chapno]\\n[tbl*label-num]
+. if dLABEL.REFS \
+. tm .ds \\*[target] \\*[chapno]\\n[tbl*label-num]
+. rm target
+. \}
+. if !\\n[tbl*skip-source] \{\
+. if \\n[tbl*have-source] \{\
+. ds tbl*source \\$1
+. SIZESPECS
+. ev source
+. evc \\*[ev-current]
+. nf
+. nh
+. ie \\n[#PRINT_STYLE]=1 \{\
+. TYPEWRITER
+. sp
+. \}
+. el \{\
+. tbl*source-style
+. vs \\n[.ps]u+\\n[tbl*source-autolead]u
+. \}
+. di tbl*source-div
+. TBL*SET_SOURCE_QUAD \\*[tbl*source-quad]
+. if (\\n[tbl*have-label]=0)&(\\n[#MLA]=0) \
+. if !\\n[tbl*autolabel] .sp \\n[#CAP_HEIGHT]u
+. if \\n[#MLA] \
+. sp \\n[#CAP_HEIGHT]u
+. if !'\\*[tbl*source-space]'' .sp \\*[tbl*source-space]
+. nop \\*[tbl*source]
+. br
+. di
+. nf
+. tbl*source-div
+. ev
+. \}
+. \}
+. if '\\n[.z]'FLOAT*DIV' .nr bx-tbl-depth \\n[.d]-1v
+. if '\\n[.z]'tbl*header-div' \{\
+. @error .TS with 'H' flag but no corresponding .TH
+. ab Aborting.
+. \}
+. ev
+. if !\\n[tbl*plain] \{\
+. ie \\n[tbl*plain-boxed] \{\
+. ie \\n[#MLA] .if !\\n[tbl*have-source] .sp .6v
+. el .sp
+. \}
+. el \{\
+. if !\\n[tbl*have-source] \{\
+. if (\\n[tbl*have-label]=0)&\
+(\\n[tbl*caption-after-label]=0)&(\\n[tbl*autolabel]=0) \
+. sp 1v
+. if (\\n[tbl*have-label]=1):(\\n[tbl*autolabel]=1) \
+. sp .5v
+. \}
+. if '\\n[.z]'FLOAT*DIV' .nr chop-space 1
+. \}
+. \}
+. ll \\n[ll-pre-tbl]u
+. if (\\n[nl]=\\n[dc]):(\\n[nl]=\\n[#PAGE_TOP]) .ns
+. if !'\\*[tbl*space-adj]'' .sp -\\*[tbl*space-adj]u
+. if \\n[#MLA] \
+. sp .5v
+. if !r pdfbx-running \{\
+. ie !\\n[tbl*no-shim] \{\
+. ie !\\n[#NO_SHIM] \
+. if !'\\n[.z]'FLOAT*DIV' .SHIM
+. el \
+. if !\\n[tbl*no-flex] \
+. if !\\n[#NO_FLEX] \
+. if !'\\n[.z]'FLOAT*DIV' .FLEX
+. \}
+. el \
+. if !\\n[tbl*no-flex] \
+. if !\\n[#NO_FLEX] \
+. if !'\\n[.z]'FLOAT*DIV' .FLEX
+. \}
+. ie \\n[tbl*boxed] \{\
+. nr tbl*pdfbx 2
+. if \\n[tbl*have-label] .nr tbl*pdfbx 3
+. \}
+. el .nr tbl*pdfbx 1
+. TBL*CLEANUP
+. it 2 rr-tbl*pdfbx
+.END
+\#
+\# Utility macros for tbl
+\#
+.MAC TBL*CAPTION END
+. ev caption
+. evc \\*[ev-current]
+. vs \\n[.ps]u+\\n[tbl*caption-autolead]u
+. nr caption-lead \\n[.v]
+. nr tbl*caption-lead-diff \\n[lead-pre-tbl]-\\n[.v]
+. nr tbl*caption-top-lead-diff \\n[tbl*caption-lead-diff]
+. ie !\\n[#MLA] \{\
+. if \\n[tbl*have-caption] \{\
+.\" Get rid of these guys when you're sure you don't need them.
+\#. if !'\\n[.z]'FLOAT*DIV' \{\
+. if !\\n[tbl*caption-after-label] \{\
+. ie (\\n[nl]=\\n[#PAGE_TOP]):(\\n[nl]=\\n[dc]) \{\
+. RESTORE_SPACE
+. ie \\n[#COLUMNS] .sp |\\n[dc]u
+. el .sp |\\n[#T_MARGIN]u-\\n[#DOC_LEAD]u
+. sp \\n[tbl*caption-lead-diff]u
+. \}
+. el \{\
+. if \\n[.ns] .if !(\\n[nl]=\\n[#PAGE_TOP]) .rs
+. if !\\n[pdfbx-top] .sp \\n[#DOC_LEAD]u/2u
+. \}
+. if \\n[pdfbx-top] \{\
+. ps \\*[tbl*caption-size-change]
+. SIZESPECS
+. ps
+. nr pdfbx-top 1 \" SIZESPECS trips rr-pdfbx-top
+. rt
+. sp \\*[gap\\n[stack]]u+\\*[wt\\n[stack]]\
++\\n[tbl*caption-top-lead-diff]u+\\*[$CAP_HEIGHT]+.5p
+. \}
+. \}
+\#. \}
+. nh
+. \}
+. \}
+. el \{\
+. if !\\n[tbl*autolabel] \{\
+. ie !\\n[tbl*have-label] \
+. mla@error caption label \\n[.F] \\$0 \\n[.c]
+. el .ev label
+. \}
+. \}
+. ie \\n[#PRINT_STYLE]=1 .nr tmp-ind 2m
+. el .nr tmp-ind 1.25m
+. ie \\n[#PRINT_STYLE]=1 .TYPEWRITER
+. el \{\
+. if !\\n[#MLA] \{\
+. tbl*caption-style
+. nr lead-current \\n[.v]
+. \}
+. \}
+. ie !\\n[#MLA] \{\
+. ie !\\n[tbl*caption-after-label] \{\
+. di tbl*caption-div
+. ie \\n[tbl*center] \!.in -\\n[ind-pre-tbl]u
+. el \!.in 0
+. TBL*SET_CAPTION_QUAD \\*[tbl*caption-quad]
+. nop \\*[tbl*caption]
+. br
+. di
+. evc 0
+. if !'\\n[.z]'FLOAT*DIV' \{\
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u+\\n[#DOC_LEAD]u
+. ch FN_OVERFLOW_TRAP -\\n[#FN_OVERFLOW_TRAP_POS]u+\\n[#DOC_LEAD]u
+. nr caption-needs 2
+. ie \\n[tbl*boxed] .nr tbl*lead \\n[.v]+3n
+. el .nr tbl*lead \\n[.v]
+. if \
+(\\n[dn]+(\\n[tbl*lead]*(\\n[tbl*needs]+1)))>=\\n[.t] \{\
+. nr pgnum \\n%+\\n[#PAGE_NUM_ADJ]
+. if \\n[#COLUMNS]=1 .ds col-num ", column \\n[#COL_NUM]
+. tm1 \
+"[mom]: Table with caption at line \\n[.c] \
+does not fit on page \\n[pgnum]\\*[col-num].
+. tm1 \
+" Shifting table to next page or column.
+. ie (\\n[#COLUMNS]=1)&(\\n[#COL_NUM]=\\n[#NUM_COLS]) \{\
+. rr tbl*no-header
+. NEWPAGE
+. \}
+. el \{\
+. nr tbl*no-top-hook -1
+. sp \\n[.t]u
+. ie \\n[#COLUMNS] \
+. sp |\\n[dc]u+\\n[tbl*caption-lead-diff]u
+. el .sp |\\n[#PAGE_TOP]u+\\n[tbl*caption-lead-diff]u
+. \}
+. \}
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u
+. ch FN_OVERFLOW_TRAP -\\n[#FN_OVERFLOW_TRAP_POS]u
+. \}
+. if \\n[.u] .nr fill 1
+. nf
+. if \\n[.ns] .RESTORE_SPACE
+. tbl*caption-div
+. if \\n[#PRINT_STYLE]=1 .sp .5v
+. if !'\\*[tbl*caption-space]'' \
+. sp \\*[tbl*caption-space]
+. if \\n[tbl*caption-lead-diff-adj] \{\
+. sp -\\n[tbl*caption-lead-diff]u
+. rr tbl*caption-lead-diff-adj
+. \}
+. if \\n[fill-pre-float] .fi
+. \}
+. el \{\
+. if (\\n[tbl*have-label]=0) \{\
+. if !\\n[tbl*autolabel] \{\
+. tm1 "[mom]: CAPTION_AFTER_LABEL enabled, but no label given
+. tm1 " for table at line \\n[.c].
+. tm1 " Skipping caption but continuing to process.
+. \}
+. \}
+. \}
+. \}
+. el \{\
+. if (\\n[tbl*have-label]=1):(\\n[tbl*autolabel]=1) \{\
+. ie !\\n[tbl*have-caption] \
+. mla@error label caption \\n[.F] \\$0 \\n[.c]
+. el \{\
+. ie !'\\n[.z]'FLOAT*DIV' \{\
+. ie (\\n[nl]=\\n[#PAGE_TOP]):(\\n[nl]=\\n[dc]) \{\
+. ie !\\n[#COLUMNS] \
+. sp |\\n[#PAGE_TOP]u+\\n[tbl*caption-lead-diff]u
+. el .sp |\\n[dc]u+\\n[tbl*caption-lead-diff]u
+. \}
+. el .sp .5v
+. \}
+. el .sp .5v
+. \}
+. ev label
+. evc \\*[ev-current]
+. nh
+. ie \\n[#PRINT_STYLE]=1 .TYPEWRITER
+. el \{\
+. tbl*label-style
+. vs \\n[.ps]u+\\n[tbl*label-autolead]u
+. nr tbl*label-lead-diff \\n[lead-pre-tbl]-\\n[.v]
+. \}
+. if \\n[tbl*label-with-chapter] \
+. ds chapno \\n[#CH_NUM].
+. if r pdfbx-top \
+. if \\n[#MLA] .nr pdfbx-mla-tbl-top 1
+. TBL*SET_LABEL_QUAD \\*[tbl*label-quad]
+. if \\n[pdfbx-mla-tbl-top] \{\
+. sp
+. sp \\n[tbl*label-lead-diff]u
+. rr pdfbx-mla-tbl-top
+. \}
+. di tbl*mla-label-caption
+\!. in 0
+. ie \\n[tbl*autolabel] \{\
+. ds label \
+\\*[tbl*label-prfx]\\*[chapno]\\n[tbl*label-num]\\*[tbl*label-sffx]\"
+. nop \\*[label]
+. nr tbl*label-width \w'\\*[label]'
+. rr label
+. \}
+. el \{\
+. if !'\\*[tbl*label]'' \{\
+. nop \\*[tbl*label]
+. nr tbl*label-width \w'\\*[tbl*label]'
+. \}
+. \}
+. if \\n[tbl*autolabel] \
+. ds tbl*label \\*[chapno]\\n[tbl*label-num]
+. br
+. di
+. \}
+. da tbl*mla-label-caption
+. ie \\n[#PRINT_STYLE]=1 .TYPEWRITER
+. el .tbl*caption-style
+. if '\\*[tbl*caption-quad]'L' \{\
+. EOL
+. ie \\n[float*tbl] \{\
+. ie \\n[tbl*center] \
+. ll \\n[ll-pre-tbl]u-\\n[TW]u/2u+\\n[TW]u-\\n[tmp-ind]u
+. el \
+. ll \\n[TW]u+\\n[.i]u-\\n[tmp-ind]u
+\!. in \\n[tmp-ind]u
+. ti -\\n[tmp-ind]u
+. \}
+. el \{\
+. ie \\n[tbl*center] \{\
+. if '\\*[tbl*label-quad]'L' \{\
+. ll \\n[ll-pre-tbl]u-\\n[TW]u/2u+\\n[TW]u
+\!. in \\n[tmp-ind]u
+. \}
+. \}
+. el \
+. in \\n[tmp-ind]u+\\n[ind-pre-tbl]u
+. \}
+. ti -\\n[tmp-ind]u
+. \}
+. nop \\*[tbl*caption]
+. br
+\!. in
+. da
+. if !'\\n[.z]'FLOAT*DIV' \{\
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u+\\n[#DOC_LEAD]u
+. ch FN_OVERFLOW_TRAP -\\n[#FN_OVERFLOW_TRAP_POS]u+\\n[#DOC_LEAD]u
+. ie \\n[#MLA] .nr caption-needs 3
+. el .nr caption-needs 2
+. if \
+(\\n[dn]+(\\n[#DOC_LEAD]*\\n[tbl*needs])+(\\n[caption-needs]*\\n[caption-lead]))>\\n[.t] \{\
+. nr pgnum \\n%+\\n[#PAGE_NUM_ADJ]
+. if \\n[#COLUMNS] .ds col-num ", column \\n[#COL_NUM]
+. tm1 \
+"[mom]: Table with caption at line \\n[.c] \
+does not fit on page \\n[pgnum]\\*[col-num].
+. tm1 \
+" Shifting table to next column or page.
+. ie (\\n[#COLUMNS]=1)&(\\n[#COL_NUM]=\\n[#NUM_COLS]) \{\
+. rr tbl*no-header
+. if \\n[defer] .nr skip-th-warning 1
+. NEWPAGE
+. \}
+. el \{\
+. nr tbl*no-top-hook 1
+. sp \\n[.t]u
+. if (\\n[tbl*caption-after-label]=1):(\\n[tbl*plain]=1) \
+. sp 1n-.3n
+. \}
+. \}
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u
+. ch FN_OVERFLOW_TRAP -\\n[#FN_OVERFLOW_TRAP_POS]u
+. \}
+. nf
+. if (\\n[nl]=\\n[#PAGE_TOP]):(\\n[nl]=\\n[dc]) \
+. nr tbl*label-lead-diff-adj 1
+. ie (\\n[.t]>1)&(\\n[@TOP]=0) \{\
+. if !\\n[#NO_FLEX] \{\
+. NO_FLEX
+. nr #RESTORE_FLEX 1
+. \}
+. if \\n[.ns] .rs
+. sp \\n[tbl*label-lead-diff]u
+. \}
+. el \{\
+. if \\n[.t]=1 .sp \\n[.t]u
+. ie \\n[#COL_NUM]>1 \
+. ie (\\n[nl]=\\n[#PAGE_TOP]):(\\n[nl]=\\n[dc]) \
+. sp |\\n[dc]u+\\n[tbl*label-lead-diff]u
+. el .sp .5v
+. \}
+. tbl*mla-label-caption
+. \}
+. ie \\n[#PRINT_STYLE]=1 .sp .5v
+. el .sp .5n
+. if \\n[tbl*label-lead-diff-adj] \{\
+. sp -\\n[tbl*label-lead-diff]u
+. rr tbl*label-lead-diff-adj
+. \}
+. br
+. if !'\\*[tbl*caption-space]'' .sp \\*[tbl*caption-space]
+. ie \\n[float*tbl] .ev FLOAT
+. el .ev \\*[ev-current]
+.END
+\#
+.MAC TBL*CLEANUP END
+. if !'\\n[.z]'FLOAT*DIV' \{\
+. rm tbl*header-div
+. rm short
+. rm tbl*caption
+. rm tbl*caption-short
+. rm tbl*label
+. rr tbl*center
+. rr tbl*caption-top-lead-diff
+. rr tbl*have-header
+. rr tbl*no-print-header
+. rr tbl*have-caption
+. rr tbl*have-label
+. rr tbl*plain-boxed
+. rr tbl*boxed
+. \}
+. rr doing-tbl
+. rm tbl*space-adj
+. rr tbl*skip-label
+. rr tbl*skip-source
+. rr tbl*label-warning
+. rr tbl*no-shim
+. rr tbl*no-flex
+. rr tbl*plain
+. rr tbl*caption-top-lead-diff
+. rnn tbl*have-label tbl@label
+. rnn tbl*have-source tbl@source
+. if '\\*[tbl*label-sffx-tmp]'.' .ds tbl*label-sffx .
+. if \\n[#RESTORE_INDENT_BOTH] \{\
+. IB
+. rr #RESTORE_INDENT_BOTH
+. \}
+. if \\n[#RESTORE_INDENT_LEFT] \{\
+. IL
+. rr #RESTORE_INDENT_LEFT
+. \}
+. if \\n[#RESTORE_FLEX] \{\
+. NO_FLEX off
+. rr #RESTORE_FLEX
+. \}
+.END
+\#
+.MAC print-label END
+. if \\n[.u] .nr fill 1
+. nf
+. if \\n[tbl*center] \{\
+. if '\\n[.z]'' \{\
+. ll \\n[.l]u-\\n[TW]u/2u+\\n[TW]u
+. if \\n[ind-pre-tbl] \
+. in \\n[ind-pre-tbl]u-(\\n[ind-pre-tbl]u/2u)
+. \}
+. \}
+. if !\\n[tbl*skip-label] \
+. tbl*label-div
+. if \\n[tbl*center] \{\
+. if '\\n[.z]'' \{\
+. ll
+. in 0
+. \}
+. \}
+. if \\n[fill] .fi
+. rr fill
+.END
+\#
+.MAC tbl@top-hook END
+. if (\\n[tbl*have-header:1]=1):(\\n[tbl*have-header]=1) \{\
+. if !r tbl*no-print-header \{\
+. nf
+. rr @TOP
+. ch RR_@TOP
+. ev top-hook
+. evc 0
+. rs
+. nop \&
+. ie !\\n[tbl*boxed] .sp -1
+. el .sp -1n
+. tbl*print-header
+. ev
+. \}
+. \}
+.END
+\#
+.MAC tbl*print-header END
+. if \\n[.u]=1 \{\
+. nf
+. nr fill 1
+. \}
+. if \\n[#COL_NUM]>1 \
+. if !\\n[tbl*have-caption] \
+. if (\\n[@TOP]=1):(\\n[nl]=\\n[dc]) \
+. sp .3n
+. if \\n[tbl*center] \!.in \\n[ind-pre-tbl]u/2u
+. ie d tbl*header-div:span .tbl*header-div:span
+. el .tbl*header-div
+. if '\\n[.z]'FLOAT*DIV' \
+. if \\n[tbl*center] .ce 1000
+. mk #T
+.END
+\#
+.MAC tbl@bottom-hook END
+. rr #DIVERTED
+. rr @TOP
+. ch RR_@TOP
+.END
+\#
+.MAC tbl*float-warning END
+. tm1 "[mom]: Table in FLOAT, output page \\n[#PAGENUMBER], exceeds page vertical limits.
+. tm1 " Multipage boxed tables cannot be contained within floats.
+. ab [mom]: Aborting '\\n[.F]', approx. line \\n[.c].
+.END
+\#
+.MAC tbl*caption-warning END
+. tm1 "[mom]: TS at line \\n[.c] has CAPTION but no H argument.
+. tm1 " CAPTION requires H with a corresponding .TH.
+. ab [mom]: Aborting '\\n[.F]'.
+.END
+\#
+.MAC tbl*source-warning END
+. tm1 "[mom]: MLA enabled, but TE at line \\n[.c] has no SOURCE.
+. tm1 " MLA style for tables requires that a source be cited.
+. ab [mom]: Aborting '\\n[.F]'.
+.END
+\#
+.MAC ds@need END \" Move vertically until there is enough space for \$1
+. if '\\n(.z'' \{\
+. while \\n[.t]<=(\\$1)&(\\n[nl]>\\n[#PAGE_TOP]) \{\
+. rs
+' sp \\n[.t]u
+. \}
+. \}
+.END
+\#
+\# ***eqn***
+\#
+\# EQ/EN macros borrowed from ms, mommified by Robin Haberkorn
+\# <robin.haberkorn@googlemail.com>, expanded by Peter Schaffter.
+\#
+\# EQ [ -L | -C | -I <indent> ] [label]
+\# EN [ CONT | CONTINUED | ... ]
+\#
+\# Equations are centered by default, but can be left-justified
+\# (EQ -L), explicitly centered, or indented (EQ -I).
+\#
+\# Each eqn block for multi-line equations aligned with 'mark' and
+\# 'lineup' should be terminated by passing 'CONT' or 'CONTINUED'
+\# or '...' to EN.
+\#
+\# Note that geqn mark and lineup work correctly in centered equations.
+\#
+.MAC EQ END
+. if \\n[eqn*copy-in]=1 \{\
+. if !\\n[eqn-linenum] .nr eqn-linenum \\n[.c]
+. if !\\n[pgnum] .nr pgnum \\n%+\\n[#PAGE_NUM_ADJ]
+. br
+. if \\n[.u] .nr fill 1
+. rr float*eqn
+. if '\\n[.z]'FLOAT*DIV' .nr float*eqn 1
+. nr eqn*restore-adj \\n[.j]
+. na
+. if !\\n[continued] \{\
+. PDF_TARGET eqn:\\n+[lists*target]
+. rr eqn*type
+. nr loop-counter \\n[#NUM_ARGS]
+. nr loop-count 0 1
+. while \\n+[loop-count]<=\\n[loop-counter] \{\
+. if '\\$1'-L' \{\
+. nr eqn*left 1
+. nr eqn*type 1
+. shift
+. \}
+. if '\\$1'-I' \{\
+. nr eqn*ind 1
+. nr eqn*type 2
+. shift
+. ds DI \\$1
+. ds DI@cont \\*[DI]
+. shift
+. \}
+. if '\\$1'-C' \{\
+. nr eqn*center 1
+. nr eqn*type 3
+. shift
+. \}
+. if '\\$1'ADJUST' \{\
+. ds eqn*space-adj \\$2
+. shift 2
+. \}
+. if '\\$1'LABEL' \{\
+. ds eqn*label \\$2
+. shift 2
+. \}
+. if '\\$1'SHIFT_LABEL' \{\
+. ds eqn*shift-label \\$2
+. shift 2
+. \}
+. if '\\$1'CAPTION' \{\
+. ds eqn*caption \\$2
+. shift 2
+. \}
+. if '\\$1'SHORT_CAPTION' \{\
+. ds eqn*caption-short \\$2
+. shift 2
+. \}
+. if '\\$1'TARGET' \{\
+. ds target "\\$2
+. PDF_TARGET "\\*[target]
+. shift 2
+. \}
+. if '\\$1'NO_SHIM' \{\
+. nr @no-shim 1
+. shift 1
+. \}
+. if '\\$1'NO_FLEX' \{\
+. nr eqn*no-flex
+. shift
+. \}
+. \}
+. \}
+. if (\\n[eqn*have-label]=1):(\\n[eqn*autolabel]=1) \
+. ds label-type eqn
+. if '\\*[eqn*shift-label]'' .ds eqn*shift-label 0
+. if !\\n[eqn*type] \{\
+. nr eqn*center 1
+. nr eqn*type 3
+. shift
+. \}
+. if !'\\*[eqn*caption]'' \{\
+. if '\\*[caption-quad]'L' \{\
+. if \\n[default-left] .ds caption-quad R
+. rr default-left
+. \}
+. \}
+. if !\\n[continued] \{\
+. if !'\\*[eqn*caption-short]'' .ds short -short
+. if \\n[eqn*autolabel] \{\
+. if \\n[eqn*label-with-chapter] \
+. ds chapno \\n[#CH_NUM].
+. ds eqn*label \\*[chapno]\\n+[eqn*label-num]
+. nr eqn*label-width \w'\\*[eqn*label]'
+. if dLABEL.REFS \
+. tm .ds \\*[target] \\*[chapno]\\n[eqn*label-num]
+. rm target
+. nr eqn*label-num -1
+. \}
+. ie !'\\n[.z]'' \{\
+. if (\\n[float*img]=0)&(\\n[float*pic]=0)&(\\n[float*tbl]=0) \{\
+\!. PDF_TARGET eqn:\\\\n+[lists*target]
+. ie !'\\*[eqn*label]'' \
+\!. TO_EQUATIONS "\\*[eqn*label]" "\\*[eqn*caption\\*[short]]"
+. el \
+\!. TO_EQUATIONS "\\*[eqn*caption\\*[short]]"
+. \}
+. \}
+. el \{\
+. PDF_TARGET eqn:\\n+[lists*target]
+. ie !'\\*[eqn*label]'' \
+. TO_EQUATIONS "\\*[eqn*label]" "\\*[eqn*caption\\*[short]]"
+. el \
+. TO_EQUATIONS "\\*[eqn*caption\\*[short]]"
+. \}
+. \}
+. if \\n[continued] \{\
+. rm continued
+. rr continued
+. \}
+. if \\n[eqn@left*cont] .nr eqn*type 1
+. if \\n[eqn@ind*cont] \{\
+. nr eqn*type 2
+. ds DI \\*[DI@cont]
+. \}
+. \}
+. if \\n[eqn@center*cont] .nr eqn*type 3
+. ev EQN
+. evc 0
+. di eqn*div
+. in 0
+. nf
+.END
+\#
+.MAC EN END
+. if !'\\n[.z]'eqn*div' \{\
+. @error mismatched EN
+. return
+. \}
+. br
+. di
+. ev
+. if !'\\*[eqn*label]'' .nr eqn*have-label 1
+. if !'\\*[eqn*caption]'' .nr eqn*have-caption 1
+. if !'\\$1'' \{\
+. ie '\\$1'...' .ds continued CONT
+. el .ds continued \\$1
+. substring continued 0 3
+. ie '\\*[continued]'CONT' \{\
+. nr continued 1
+. rm continued
+. if \\n[eqn*ind] .nr eqn@ind*cont 1
+. if \\n[eqn*left] .nr eqn@left*cont 1
+. if \\n[eqn*center] .nr eqn@center*cont 1
+. \}
+. el \{\
+. tm1 "[mom]: Invalid argument \\$1 to \\$0.
+. tm1 " Must be 'CONTINUED', 'CONT', or '...'
+. ab [mom]: Aborting '\\n[.F]' at line \\n[.c].
+. \}
+. \}
+. if \\n[dl]:\\n[eqn*have-label] \{\
+. ds eqn*tabs \\n[.tabs]
+. ie \\n[dl] \{\
+. if !'\\n[.z]'FLOAT*DIV' \{\
+. ie \\n[eqn*have-caption] .ne \\n[dn]u-\\n[.V]
+. el .ne \\n[dn]u-1v-\\n[.V]
+. \}
+. chop eqn*div
+. if '\\*[DD]'' \{\
+. ds DD .5v
+. if !\\n[@TOP] \{\
+. ie r pdfbx-top \{\
+. SIZESPECS
+. rt
+. sp (\\*[wt\\n[stack]]/2u)+\\*[gap\\n[stack]]u+\\*[$CAP_HEIGHT]
+. \}
+. el .sp \\*[DD]
+. if !'\\*[eqn*space-adj]'' .sp \\*[eqn*space-adj]u
+. \}
+. \}
+. ie \\n[eqn*type]=1 \{\
+. ta (u;\\n[.l]-\\n[.i])R
+. ie \\n[continued] .nop \\*[eqn*div]
+. el \{\
+. ie \\n[eqn*autolabel] \
+.nop \
+\\*[eqn*div]\
+\\*[eqn*label-specs]\
+\t\v'+\\*[eqn*shift-label]'\
+\\*[eqn*label-prfx]\\*[chapno]\\n+[eqn*label-num]\\*[eqn*label-sffx]\
+\v'-\\*[eqn*shift-label]'\
+\\*[revert-specs]
+. el \
+.nop \
+\\*[eqn*div]\
+\\*[eqn*label-specs]\
+\t\v'+\\*[eqn*shift-label]'\
+\\*[eqn*label]\
+\v'-\\*[eqn*shift-label]'\
+\\*[revert-specs]
+. \}
+. if !\\n[continued] \{\
+. if \\n[eqn*have-caption] \
+. ADD_CAPTION
+. \}
+. \}
+. el \{\
+. ie \\n[eqn*type]=2 \{\
+. ie '\\*[eqn*label-quad]'L' \{\
+. ta \\*[DI]
+. ie \\n[continued] .nop \t\\*[eqn*div]
+. el \{\
+. ie \\n[eqn*autolabel] \
+.nop \
+\\*[eqn*label-specs]\
+\v'+\\*[eqn*shift-label]'\
+\\*[eqn*label-prfx]\\*[chapno]\\n+[eqn*label-num]\\*[eqn*label-sffx]\
+\v'-\\*[eqn*shift-label]'\
+\t\\*[eqn*div]\
+\\*[revert-specs]
+. el \
+.nop \
+\\*[eqn*label-specs]\
+\v'+\\*[eqn*shift-label]'\
+\\*[eqn*label]\
+\v'-\\*[eqn*shift-label]'\
+\\*[revert-specs]\
+\t\\*[eqn*div]
+. \}
+. \}
+. el \{\
+. ta \\*[DI] (u;\\n[.l]-\\n[.i])R
+. ie \\n[continued] .nop \t\\*[eqn*div]
+. el \{\
+. ie \\n[eqn*autolabel] \
+.nop \
+\t\\*[eqn*div]\
+\\*[eqn*label-specs]\
+\t\v'+\\*[eqn*shift-label]'\
+\\*[eqn*label-prfx]\\*[chapno]\\n+[eqn*label-num]\\*[eqn*label-sffx]\
+\v'-\\*[eqn*shift-label]'\
+\\*[revert-specs]
+. el \
+.nop \
+\t\\*[eqn*div]\
+\\*[eqn*label-specs]\
+\t\v'+\\*[eqn*shift-label]'\
+\\*[eqn*label]\
+\v'-\\*[eqn*shift-label]'\
+\\*[revert-specs]
+. \}
+. \}
+. if !\\n[continued] \{\
+. if \\n[eqn*have-caption] \
+. ADD_CAPTION
+. \}
+. \}
+. el \{\
+. ie '\\*[eqn*label-quad]'L' \{\
+. ta (u;\\n[.l]-\\n[.i]/2)C
+. ie \\n[continued] .nop \t\\*[eqn*div]
+. el \{\
+. ie \\n[eqn*autolabel] \
+.nop \
+\\*[eqn*label-specs]\
+\v'+\\*[eqn*shift-label]'\
+\\*[eqn*label-prfx]\\*[chapno]\\n+[eqn*label-num]\\*[eqn*label-sffx]\
+\v'-\\*[eqn*shift-label]'\
+\t\\*[eqn*div]\
+\\*[revert-specs]
+. el \
+.nop \
+\\*[eqn*label-specs]\
+\v'+\\*[eqn*shift-label]'\
+\\*[eqn*label]\
+\v'-\\*[eqn*shift-label]'\
+\\*[revert-specs]\
+\t\\*[eqn*div]
+. \}
+. \}
+. el \{\
+. ta (u;\\n[.l]-\\n[.i]/2)C (u;\\n[.l]-\\n[.i])R
+. ie \\n[continued] .nop \t\\*[eqn*div]
+. el \{\
+. ie \\n[eqn*autolabel] \
+.nop \
+\t\\*[eqn*div]\
+\\*[eqn*label-specs]\
+\t\v'+\\*[eqn*shift-label]'\
+\\*[eqn*label-prfx]\\*[chapno]\\n+[eqn*label-num]\\*[eqn*label-sffx]\
+\v'-\\*[eqn*shift-label]'\
+\\*[revert-specs]
+. el \
+.nop \
+\t\\*[eqn*div]\
+\\*[eqn*label-specs]\
+\t\v'+\\*[eqn*shift-label]'\
+\\*[eqn*label]\
+\v'-\\*[eqn*shift-label]'\
+\\*[revert-specs]
+. \}
+. \}
+. if !\\n[continued] \{\
+. if \\n[eqn*have-caption] \
+. ADD_CAPTION
+. \}
+. \}
+. \}
+. \}
+. el \{\
+. ta (u;\\n[.l]-\\n[.i])R
+.nop \
+\\*[eqn*label-specs]\
+\t\v'+\\*[eqn*shift-label]'\
+\t\\*[eqn*label]\
+\v'-\\*[eqn*shift-label]'\
+\\*[revert-specs]
+. \}
+. ta \\*[eqn*tabs]
+.\" if continuing (ie is a multi-line equation), don't space and SHIM
+. if !\\n[continued] \{\
+. br
+. if !\\n[@TOP] \{\
+. if !\\n[.t]<(\\*[DD]+1) \{\
+. sp \\*[DD]
+. ie !\\n[eqn*have-caption] \{\
+. sp .25v
+. if \\n[pdfbx-running] .nr eqn*pdfbx 1
+. \}
+. el .if \\n[pdfbx-running] .nr eqn*pdfbx 2
+. \}
+. \}
+. if !'\\*[eqn*space-adj]'' .sp -\\*[eqn*space-adj]u
+. ie !\\n[eqn*no-shim] \{\
+. ie !\\n[#NO_SHIM] \
+. if !'\\n[.z]'FLOAT*DIV' .SHIM
+. el \
+. if !\\n[eqn*no-flex] \
+. if !\\n[#NO_FLEX] \
+. if !'\\n[.z]'FLOAT*DIV' .FLEX
+. \}
+. el \
+. if !\\n[eqn*no-flex] \
+. if !\\n[#NO_FLEX] \
+. if !'\\n[.z]'FLOAT*DIV' .FLEX
+. rm DD
+. rm eqn*caption
+. rm eqn*caption-short
+. rm eqn*label
+. rm short
+. rr eqn*copy-in
+. \}
+. rm DI@cont
+. rr eqn*center
+. rr eqn@center*cont
+. rr eqn*have-label
+. rr eqn*have-caption
+. rr eqn*ind
+. rr eqn@ind*cont
+. rr eqn*left
+. rr eqn@left*cont
+. \}
+. nr eqn*copy-in 1
+. ad \\n[eqn*restore-adj]
+. if \\n[fill] .fi
+. rr fill
+.END
+\#
+.MAC ADD_CAPTION END
+. ie \\n[.t]<\\n[.v] \{\
+. if !'\\n[.z]'FLOAT*DIV' \{\
+. if \\n[#COLUMNS]=1 .ds col-num ", column \\n[#COL_NUM]
+. tm1 "[mom]: '\\n[.F]', macro EQ, line \\n[eqn-linenum]:
+. tm1 " Insufficient room for equation caption on page \\n[pgnum]\\*[col-num].
+. tm1 " Skipping caption but continuing to process.
+. if !\\n[@TOP] \{\
+. ie \\n[#COLUMNS] \
+. COL_NEXT internal
+. el .NEWPAGE
+. \}
+. rr eqn-linenum
+. rr pgnum
+. \}
+. \}
+. el \{\
+. if \\n[#PRINT_STYLE]=2 \{\
+. ps \\*[eqn*caption-size-change]
+. nr lead-curr \\n[.v]
+. sp .5v
+. vs \\n[.ps]u+\\n[eqn*caption-autolead]u
+. nr eqn*caption-lead-diff \\n[lead-curr]-\\n[.v]
+. sp \\n[eqn*caption-lead-diff]u
+. ps
+. if !'\\*[eqn*caption-space]'' \
+. sp \\*[eqn*caption-space]
+. \}
+. if '\\*[eqn*caption-quad]'L' \{\
+. fi
+. ad l
+. nop \
+\\*[eqn*caption-specs]\
+\\*[eqn*caption]\
+\\*[revert-specs]
+. nf
+. \}
+. if '\\*[eqn*caption-quad]'C' \{\
+. fi
+. ad c
+. nop \
+\\*[eqn*caption-specs]\
+\\*[eqn*caption]\
+\\*[revert-specs]
+. nf
+. \}
+. if '\\*[eqn*caption-quad]'R' \{\
+. fi
+. ad r
+. nop \
+\\*[eqn*caption-specs]\
+\\*[eqn*caption]\
+\\*[revert-specs]
+. nf
+. \}
+. if !'\\*[eqn*caption-space]'' \
+. sp -\\*[eqn*caption-space]
+. vs
+. \}
+.END
+\#
+\# ***pic***
+\#
+.MAC have-adjust END
+. nr #ARGS 0 1
+. nr #COUNT \\n[#NUM_ARGS]
+. while \\n+[#ARGS]<=\\n[#COUNT] \{\
+. if '\\$1'ADJUST' \{\
+. ds pic*space-adj \\$2
+. break
+. \}
+. shift
+. \}
+.END
+\#
+\# User settable text style for pic
+\#
+\# PIC_TEXT_STYLE
+\# --------------
+\# *Argument:
+\# <offset from page left>
+\# *Function:
+\# Stores user supplied page offset in register #L_MARGIN.
+\# Sets .po to user supplied offset.
+\# *Notes:
+\# Requires unit of measure.
+\#
+.MAC PIC_TEXT_STYLE END
+. nr #ARGS 0 1
+. nr #COUNT \\n[#NUM_ARGS]
+. while \\n+[#ARGS]<=\\n[#COUNT] \{\
+. if '\\$1'FAMILY' \{\
+. shift
+. ds pic*text-family \\$1
+. shift
+. \}
+. if '\\$1'FONT' \{\
+. shift
+. ds pic*text-font \\$1
+. shift
+. \}
+. if '\\$1'SIZE' \{\
+. shift
+. ds pic*text-size-change \\$1
+. shift
+. \}
+. if '\\$1'AUTOLEAD' \{\
+. shift
+. nr pic*text-autolead \\$1
+. shift
+. \}
+. \}
+.END
+\#
+\# Main macros
+\#
+.MAC PS END
+. if \\n[pdfbx-running] \{\
+. ie !r pdfbx-top .nr pic*pdfbx 2
+. el .nr pic*pdfbx 1
+. \}
+. if !\\n[#PP] .nop
+. br
+. have-adjust \\$@ \" Adjusting is handled by FLOAT
+. if !'\\n[.z]'FLOAT*DIV' \
+. FLOAT ADJUST \\*[pic*space-adj]
+. PDF_TARGET fig:\\n+[lists*target]
+. ds ev-current \\n[.ev]
+. rr float*pic
+. rr pic*have-label
+. rr grap
+. nr float*pic 1
+. nr ind-pre-pic \\n[.i]
+. nr lead-pre-pic \\n[.v]
+. if \\n[#MLA] \
+. if !\\n[pdfbx-running] .sp .5v
+. in 0
+. ev PIC
+. evc \\n[ev-current]
+. nf
+. ie \\n[#NUM_ARGS]<2 .@error bad arguments to PS (not preprocessed with pic?)
+. el \{\
+. if \B'\\$1' \{\
+. ie !\B'\\$2' .ds pic*scale-width \\$1
+. el .ds pic*scale-width \\$2
+. \}
+. \}
+.\" This is a bit confusing. pic is decorated with 2 args (width
+.\" and height), which are read during pre-processing but have to be
+.\" ignored when parsing args during main processing. We shift pic's
+.\" args out of the way, then pop them off the arg stack because
+.\" they're not needed during macro processing.
+. while \B'\\$1' .shift
+. nr loop-counter \\n[#NUM_ARGS]
+. nr loop-count 0 1
+. while \\n+[loop-count]<=\\n[loop-counter] \{\
+. if '\\$1'LEFT' \{\
+. nr pic*left 1
+. shift 1
+. \}
+. if '\\$1'CAPTION' \{\
+. nr pic*have-caption 1
+. ds pic*caption \\$2
+. shift 2
+. \}
+. if '\\$1'SHORT_CAPTION' \{\
+. ds pic*caption-short \\$2
+. shift 2
+. \}
+. if '\\$1'LABEL' \{\
+. nr pic*have-label 1
+. ds pic*label \\$2
+. shift 2
+. \}
+. if '\\$1'TARGET' \{\
+. ds target "\\$2
+. PDF_TARGET "\\*[target]
+. shift 2
+. \}
+. if '\\$1'NO_SHIM' \{\
+. nr @no-shim 1
+. shift 1
+. \}
+. if '\\$1'NO_FLEX' \{\
+. nr @no-flex 1
+. shift 1
+. \}
+. if '\\$1'GRAP' \{\
+. nr grap 1
+. shift 1
+. \}
+. \}
+. if (\\n[pic*have-label]=1):(\\n[pic*autolabel]=1) \
+. ds label-type pic
+. ds pic*label-sffx-tmp \\*[pic*label-sffx]
+. if !'\\*[pic*label-sffx-tmp]'' \
+. substring pic*label-sffx-tmp -1
+. if '\\*[pic*label-sffx-tmp]'.' \
+. if \\n[pic*caption-after-label]=0 .chop pic*label-sffx
+. if \\n[#MLA] \{\
+. if (\\n[pic*have-label]=1):(\\n[pic*autolabel]=1) \{\
+. if !\\n[pic*have-caption] \
+. mla@error label caption \\n[.F] \\$0 \\n[.c]
+. \}
+. if \\n[pic*have-caption] \{\
+. if !\\n[pic*have-label] \{\
+. if !\\n[pic*autolabel] \
+. mla@error caption label \\n[.F] \\$0 \\n[.c]
+. \}
+. \}
+. \}
+. if !'\\*[pic*text-family]'' \
+. fam \\*[pic*text-family]
+. if !'\\*[pic*text-font]'' \
+. ft \\*[pic*text-font]
+. if !'\\*[pic*text-size-change]'' \
+. ps \\n[#DOC_PT_SIZE]u\\*[pic*text-size-change]
+. nr lead-current \\n[.v]
+. ie \\n[pic*text-autolead] \
+. vs \\n[.ps]u+(\\n[pic*text-autolead]u*1000u)
+. el .vs \\n[.ps]u
+. nr pic@text-lead \\n[.v]
+. nr pic@text-size \\n[.ps]
+. if !'\\*[pic*text-color]'' .COLOR \\*[pic*text-color]
+. if \\n[@TOP] \{\
+. RESTORE_SPACE
+. nr pic*top-lead-adj 1
+. \}
+. nr pic*top-lead-diff \\n[lead-pre-pic]u-\\n[.v]u
+. if (\\n[pic*have-caption]=0):(\\n[pic*caption-after-label]=1) \{\
+. ie \\n[pic*top-lead-adj] \{\
+. sp \\n[pic*top-lead-diff]u
+. rr pic*top-lead-adj
+. \}
+. el .if (\\n[pic*caption-after-label]=0):(\\n[#MLA]=0) \
+. sp \\n[lead-pre-pic]u/2u
+. \}
+. if \\n[pic*label-with-chapter] \
+. ds chapno \\n[#CH_NUM].
+. if \\n[pic*autolabel] \
+. ds pic*label \\*[pic*label-prfx]\\*[chapno]\\n+[fig*label-num]\\*[pic*label-sffx]
+. nr fig*label-width \w'\\*[pic*label]'
+. if !'\\*[pic*caption-short]'' .ds short -short
+. if \\n[#PDF_BOOKMARKS] \{\
+. ie !'\\*[pic*label]'' \
+\!. TO_FIGURES "\\*[pic*label]" "\\*[pic*caption\\*[short]]"
+. el \
+\!. TO_FIGURES "\\*[pic*caption\\*[short]]"
+. \}
+. di pic*div
+.END
+\#
+.MAC PE END
+. di
+. nr pic*div-width \\n[dl]
+. if \\n[@TOP] \
+. RESTORE_SPACE
+. if !\\n[nl]=\\n[#PAGE_TOP] .sp \\n[lead-pre-pic]u/2u
+. if (\\n[pic*have-caption]=1)&(\\n[pic*caption-after-label]=0) \{\
+. ev caption
+. evc \\*[ev-current]
+. nh
+. ie \\n[#PRINT_STYLE]=1 .TYPEWRITER
+. el \{\
+. if \\n[.u] \{\
+. nr fill 1
+. nf
+. \}
+. pic*caption-style
+. if \\n[fill] .fi
+. rr fill
+. nr lead-current \\n[.v]
+. vs \\n[.ps]u+\\n[pic*caption-autolead]u
+. nr pic*caption-lead-diff \\n[lead-current]-\\n[.v]
+. in \\n[ind-pre-pic]u
+. \}
+. PIC*SET_CAPTION_QUAD \\*[pic*caption-quad]
+. if \\n[@TOP] .RESTORE_SPACE
+\!. in -\\n[ind-pre-pic]u
+. sp \\n[pic*caption-lead-diff]u
+\!. if \\\\n[.ns] .rs
+. if \\n[pic*pdfbx]=1 \{\
+. SIZESPECS
+. if \\n[PIC]=1 \!.rt
+. if \\n[PIC]=2 .rt
+. sp \\n[pic*caption-lead-diff]u
+. sp \\*[wt\\n[stack]]+\\*[gap\\n[stack]]u+\\*[$CAP_HEIGHT]
+. nr pic*pdfbx 2
+. \}
+. nop \\*[pic*caption]
+. if \\n[#PRINT_STYLE]=1 .sp .5
+. if !'\\*[pic*caption-space]'' \
+. sp \\*[pic*caption-space]-\\n[pic*text-autolead]p
+. br
+. ev
+. \}
+. if \\n[pic*pdfbx]=1 \{\
+. if (\\n[pic*have-caption]=0):(\\n[pic*caption-after-label]=1) \{\
+. if \\n[PIC]=1 \!.rt
+. if \\n[PIC]=2 .rt
+. sp \\n[#DOC_LEAD]u/2u
+. sp \\*[wt\\n[stack]]+\\*[gap\\n[stack]]u
+.\" Correct for wandering top of pic
+. sp -\\n[pic*text-autolead]p
+. \}
+. \}
+. if !\\n[pic*left] \
+. in (\\n[ll-pre-float]u-\\n[pic*div-width]u)/2u
+. if \\n[grap] \
+\!. sp -2
+. if (\\n[grap]=1)&(\\n[pic*caption-after-label]=1) \
+\!. sp -2
+. if \\n[pdfbx-running] \{\
+. if \\n[pdfbx-top] \{\
+. ie !\\n[pic*left] \!.in -\\*[gap\\n[stack]]u*2u
+. el .in -\\*[wt\\n[stack]]
+. \}
+. \}
+. if (\\n[pic*pdfbx]=0):(\\n[pic*pdfbx]=2) \
+. if (\\n[pic*have-caption]=0)&(\\n[pic*caption-after-label]=0) \
+\!. sp -.5-\\n[pic*text-autolead]p
+. pic*div
+. br
+. if (\\n[pic*have-label]=1):(\\n[pic*autolabel]=1):(\\n[pic*caption-after-label]=1) \{\
+. nr lead-pre-label \\n[.v]
+. ev label
+. evc \\*[ev-current]
+. ie \\n[#PRINT_STYLE]=1 .TYPEWRITER
+. el \{\
+. pic*label-style
+. nr lead-current \\n[.v]
+. vs \\n[.ps]u+\\n[pic*label-autolead]u
+. in \\n[ind-pre-pic]u
+. sp \\n[lead-current]u-\\n[.v]u
+. \}
+. PIC*SET_LABEL_QUAD \\*[pic*label-quad]
+\!. in -\\n[ind-pre-pic]u
+. if !'\\*[pic*label-space]'' .sp \\*[pic*label-space]
+. if \\n[#PRINT_STYLE]=1 .sp .5v
+. if \\n[#PRINT_STYLE]=2 \{\
+. SIZESPECS
+. if !\\n[pic*pdfbx] \{\
+. ie !\\n[grap] .sp -1
+. el .sp -1.5
+. \}
+. sp \\*[$CAP_HEIGHT]+.5
+. if \\n[grap] .if !\\n[pic*have-label] .sp -.5
+. \}
+. ie \\n[pic*autolabel] \
+. nop \
+\\*[pic*label-prfx]\\*[chapno]\\n[fig*label-num]\\*[pic*label-sffx]\|
+. el \
+. if !'\\*[pic*label]'' .nop \\*[pic*label]
+. if dLABEL.REFS \{\
+. if \\n[pic*autolabel] \
+. tm .ds \\*[target] \\*[chapno]\\n[fig*label-num]
+. if \\n[pic*have-label] \
+. tm .ds \\*[target] \\*[pic*label]
+. \}
+. rm target
+. fam
+. ft
+. ps
+. gcolor
+. ie !\\n[pic*caption-after-label] .br
+. el \{\
+. if !'\\*[pic*caption]'' .nop \
+\\*[pic*caption-specs]\\*[pic*caption]\\*[revert-specs]
+. br
+. \}
+. ev
+. in 0
+. \}
+. if \\n[pic*pdfbx] .nr pic*pdfbx 2
+. ev
+. if !\\n[pdfbx-running] \
+. sp .5
+. if \\n[pic*pdfbx]=2 .if !\\n[grap] .sp .5
+. ie \\n[pdfbx-running] \
+. if \\n[PIC]=1 .FLOAT off
+. el .FLOAT off
+. it 1 rr-pic*pdfbx
+. in \\n[ind-pre-pic]u
+. if !\\n[defer] .rr pic*have-caption
+. rm pic*left
+. rm short
+. rr float*pic
+. if '\\*[pic*label-sffx-tmp]'.' .ds pic*label-sffx .
+. if \\n[pdfbx-running]=0 .rr pdfbx-running
+. if r pdfbx-top .rr pdfbx-top
+. if '\\*[pic*label-sffx-tmp]'.' .ds pic*label-sffx .
+.END
+\#
+\# ***refer***
+\#
+\# Footnote references
+\# -------------------
+\# *Function:
+\# Instruct REF to put references in footnotes.
+\#
+.MAC FOOTNOTE_REFS END
+. ie !'\\$1'' .rr #FN_REF
+. el \{\
+. if r #EN_REF .rr #EN_REF
+. nr #FN_REF 1
+. \}
+.END
+\#
+\# Endnote references
+\# ------------------
+\# *Function:
+\# Instruct REF to collect references for endnotes output.
+\#
+.MAC ENDNOTE_REFS END
+. ie !'\\$1'' .rr #EN_REF
+. el \{\
+. if r #FN_REF .rr #FN_REF
+. nr #EN_REF 1
+. if !r#EN_MARKER_STYLE .ENDNOTE_MARKER_STYLE SUPERSCRIPT
+. \}
+.END
+\#
+\# Prepare mom for a reference
+\# ---------------------------
+\# *Argument:
+\# <none> | INDENT L|LEFT|R|RIGHT|B|BOTH <indent value>
+\# *Function:
+\# Calls FOOTNOTE or ENDNOTE, depending on whether #REF_FN or
+\# #REF_EN is set to 1.
+\# *Notes:
+\# For convenience, REF is a toggle.
+\#
+\# REF optionally takes the same arguments as FOOTNOTE, allowing
+\# users to indent references that go in footnotes when footnote
+\# indenting is required. FOOTNOTE_REFS must be on for this.
+\#
+.MAC REF END
+. ie \\n[#FN_REF]+\\n[#EN_REF]=0 \{\
+. if !\\n[#REF_WARNING]=1 \{\
+. tm1 "[mom]: Before REF at line \\n[.c], neither FOOTNOTE_REFS nor ENDNOTE_REFS
+. tm1 " has been selected. If "sort" and "accumulate" are in your refer
+. tm1 " commands, references will be collected for later output with $LIST$.
+. tm1 " Otherwise, they will disappear.
+. nr #REF_WARNING 1
+. \}
+. \}
+. el \{\
+. ie \\n[#REF]=1 \{\
+. if \\n[#FN_REF]=1 .FOOTNOTE OFF
+. if \\n[#EN_REF]=1 .ENDNOTE OFF
+. rr #REF
+. \}
+. el \{\
+. rr #REF_WARNING
+. nr #REF 1
+. if \\n[#FN_REF]=1 .FOOTNOTE \\$1 \\$2 \\$3
+. if \\n[#EN_REF]=1 .ENDNOTE
+. \}
+. \}
+.END
+\#
+\# Embedded references in text (with brackets)
+\# -------------------------------------------
+\#
+.MAC REF_BRACKETS_NOTICE END
+. tm1 "[mom]: \\$1 has been removed from mom. See the mom documentation 'refer.html'
+. tm1 " for instructions on parenthetical insertions of references into text.
+. ie '\\$1'REF_STYLE' .tm1 " Continuing to process '\\n[.F]' from line \\n[.c].
+. el .ab [mom]: Aborting '\\n[.F]' at \\$1, line \\n[.c].
+.END
+\#
+.MAC REF_BRACKETS_START END
+. REF_BRACKETS_NOTICE \\$0
+.END
+\#
+.MAC REF_BRACKETS_END END
+. REF_BRACKETS_NOTICE \\$0
+.END
+\#
+\# These four pairs of aliases used to allow users to embed
+\# references in text and have them surrounded by (), [], {} or <>.
+\# bracket-label should be used in the refer block instead.
+\#
+.ALIAS REF( REF_BRACKETS_START
+.ALIAS REF) REF_BRACKETS_END
+\#
+.ALIAS REF[ REF_BRACKETS_START
+.ALIAS REF] REF_BRACKETS_END
+\#
+.ALIAS REF{ REF_BRACKETS_START
+.ALIAS REF} REF_BRACKETS_END
+\#
+.ALIAS REF< REF_BRACKETS_START
+.ALIAS REF> REF_BRACKETS_END
+\#
+\# Refer indenting
+\# ---------------
+\# *Argument:
+\# FOOTNOTE | ENDNOTE | BIBLIO <indent for 2nd and subsequent lines of discrete reference entries>
+\# *Function:
+\# Sets registers #REF_FN_INDENT, #REF_EN_INDENT or #REF_BIB_INDENT.
+\# *Notes:
+\# Indent value requires a unit of measure. If refs are going
+\# into footnotes or endnotes, first lines get indented; if going
+\# into a bibliography, second lines get indented
+\#
+.MAC INDENT_REFS END
+. if '\\$1'FOOTNOTE' .ds $REF_FN_INDENT \\$2
+. if '\\$1'ENDNOTE' .ds $REF_EN_INDENT \\$2
+. if '\\$1'BIBLIO' .ds $REF_BIB_INDENT \\$2
+.END
+\#
+.ALIAS REF_INDENT INDENT_REFS
+\#
+\# Hyphenation of references
+\# -------------------------
+\# *Argument:
+\# <none> | <anything>
+\# *Function:
+\# Sets register #REF_HY
+\#
+.MAC HYPHENATE_REFS END
+. ie '\\$1'' .nr #REF_HY 1
+. el \
+. if r #REF_HY .rr #REF_HY
+.END
+\#
+\# The remainder of the definitions in this section are modified
+\# versions of the definitions found in the refer module of s.tmac.
+\#
+.de @error
+.tm [mom]: '\\n[.F]', line \\n[.c]: \\$*
+..
+\#
+\# Underlining unavoidably turns off sentence spacing.
+\#
+.de ref*restore-ss
+\c
+.SS \\*[$SAVED_SS_VAR]
+.if '\\n[.z]'END_NOTES' \{\
+\c
+\E*[PREV]\c
+.\}
+..
+\# The following strings define the order of entries for different
+\# types of references. Each letter in the string refers to a database
+\# field (A for author, T1/T2 for article and book titles, etc).
+\#
+.de ref*specs
+.if \\n[#PRINT_STYLE]=1 \{\
+. char ' \[aq]
+. char \[oq] \[aq]
+.\}
+.\" Internet site - type 0
+.ds ref*spec!0 i Q A m p T2 s o D c a u n
+.\" Journal article - type 1
+.ds ref*spec!1 i Q A m p T2 q O J V S N D P n
+.\" Book - type 2
+.ds ref*spec!2 i Q A m p T1 q b d l r E S e V O C I D P t n
+.\" Article within book - type 3
+.ds ref*spec!3 i Q A m p T2 B b d l r E S e V O C I D P t n
+.\" Tech report - type 4
+.ds ref*spec!4 i Q A m p T1 R G O C I D P n
+.\" Magazine or newspaper article - type 5
+.ds ref*spec!5 i Q A m p T2 O M V S N D P n
+..
+\#
+\# Refer's "1st" macro. Since it is possible to define database
+\# fields using any single letter, we remove all possible string
+\# definitions of the form [X and [x. Also, reset ref*spec!<n>
+\# strings to their defaults.
+\#
+.de ]-
+.ref*specs
+.rm [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
+.if r [e .rr [e \" [e persists if %e field is last
+.rr ref*type
+.rm ref*string
+..
+\#
+\# Refer's "2nd" macro; builds up a reference with ref*build, and
+\# prints it with ref*print.
+\#
+.de ][
+.nr ref*type \\$1
+.if \\n[ref*type]=0 \{\
+. ie d [C \{\
+. if !d [I \{\
+. nr pre-1900 1 \" If pre-1900, MLA allows excluding publisher
+. nr ref*type 2
+. \}
+. \}
+. el .nr ref*type 2
+. if d [q .nr ref*type 2
+.\}
+.if d [u .nr ref*type 0 \" If %u exists, always treat as Internet ref
+.if \\n[ref*type]=3 \{\
+. if !'\\*([R'' \{\
+. nr ref*type 4
+. ds ref*spec!4 i Q A m p T2 B R O C I D P n
+. \}
+. if !'\\*([G'' \{\
+. nr ref*type 4
+. ds ref*spec!4 i A m p T2 B G O C I D P O n
+. \}
+.\}
+.if r [T \{\
+. als [T1 [T
+. als [T2 [T
+.\}
+.ie d ref*spec!\\n[ref*type] .ref*build \\*[ref*spec!\\n[ref*type]]
+.el \{\
+. @error unknown reference type '\\n[ref*type]'
+. ref*build \\*[ref*spec!0]
+.\}
+.if !\\n[.hy]=0 \{\
+.nr #RESTORE_HY \\n[.hy]
+.if !r#REF_HY .nh
+.\}
+.ref*print
+.if !\\n[#RESTORE_HY]=0 .hy \\n[#RESTORE_HY]
+.rr #RESTORE_HY
+.rm ref*string
+.rm [F [T1 [T2
+..
+\#
+\# Refer's "3rd" macros, which set up and terminate the output
+\# of collected references
+\#
+.de ]<
+.rm author \" If not, persists over multiple 'bibliography' commands
+.als ref*print ref*end-print
+.nr #REF 1
+.if \\n[#BIB_LIST]=1 \{\
+. nr #IN_BIB_LIST 1
+. LIST DIGIT \\*[$BIB_LIST_SEPARATOR] \\*[$BIB_LIST_PREFIX]
+.\}
+..
+\#
+.de ]>
+.LIST OFF
+.rr #REF
+.rr #IN_BIB_LIST
+.als ref*print ref*normal-print
+..
+\#
+\# Output
+\# ------
+\#
+\# Output normal, non-collected refs
+\#
+.de ref*normal-print
+.nr #CURRENT_HY \\n[.hy]
+\\*[ref*string]
+..
+\#
+\# Output collected refs
+\#
+.de ref*end-print
+.\" 10 is arbitrary
+.nn 10
+.nr #REF_BIB_INDENT (u;\\*[$REF_BIB_INDENT])
+.ie \\n[#BIB_LIST]=0 \{\
+. in +\\n[#REF_BIB_INDENT]u
+. ti -\\n[#REF_BIB_INDENT]u
+.\}
+.el .ITEM
+.\" Part of workaround for refer spitting out a blank page if the
+.\" last ref falls on the bottom line.
+\\*[ref*string]\R'ref*num*first-pass +1'\?\R'ref*num +1'\?
+.sp \\*[$BIB_SPACE]
+.ie \\n[#BIB_LIST]=0 .in
+.el .IL -\\n[#REF_BIB_INDENT]u
+.nn 0
+..
+\#
+.als ref*print ref*normal-print
+\#
+\# Build up the ref*string
+\#
+\# Correct MLA "typewritten" style (printstyle TYPEWRITE) demands
+\# two spaces after each period. The spaces are hardwired into the
+\# string definitions (ref*add-<x>), so we have to make sure that there
+\# aren't two spaces when the printstyle is TYPESET. Since I find that
+\# references look a bit crowded with 0 sentence space, I've bumped it
+\# up to +8. User's sentence spacing is reset in FOOTNOTES and ENDNOTES.
+\#
+.de ref*build
+.if \\n[#PRINT_STYLE]=2 \
+. if (\\n[#FN_REF]+\\n[#EN_REF])>0 .SS +8
+.rm ref*string
+.while \\n[.$] \{\
+. if d [\\$1 \{\
+. ie d ref*add-\\$1 .ref*add-\\$1
+. el .ref*add-dflt \\$1
+. \}
+. shift
+.\}
+.\" now add a final period
+.ie d ref*string \{\
+. if !\\n[ref*suppress-period] .as ref*string .
+. if d ref*post-punct \{\
+. as ref*string "\\*[ref*post-punct]
+. rm ref*post-punct
+. \}
+.\}
+.el .ds ref*string
+..
+\#
+\# The following macros determine how entries are formatted WRT
+\# punctuation, type style, additional strings, etc.
+\#
+\# o First argument is the database field letter.
+\# o Second argument is the punctuation character to use to separate this
+\# field from the previous field.
+\# o Third argument is a string with which to prefix this field.
+\# o Fourth argument is a string with which to postfix this field.
+\# o Fifth argument is a string to add after the punctuation character
+\# supplied by the next field.
+\#
+\# %A Author(s)
+.de ref*add-A
+.ds eval*[A \\*([A
+.substring eval*[A -1
+.if !\\n[skip-[A] \{\
+. if '\\*[eval*[A]'.' \
+. if !\\n[#FN_REF]+\\n[#EN_REF] .chop [A
+.\" Per MLA, footnotes and endnotes should not use idem, therefore
+.\" if %i contains other than idem (e.g., ed., trans.), transpose it
+.\" to after author's name
+. ie \\n[#FN_REF]+\\n[#EN_REF]=1 \{\
+. ie !'\\*[idem]'' .ref*field A "" "" "? \\*[idem]"
+. el .ref*field A
+. rm idem
+. el .ref*field A
+. \}
+.\}
+.if \\n([A .nr ref*suppress-period 1
+.rr skip-[A
+..
+\# %i Idem.
+\#
+\# In bibliographies, per MLA, replace %A with long dash after
+\# first entry with author's name; if %i field contains other than
+\# the word 'idem', appends it to the dash.
+\# In foot/endnotes, idem is ignored; MLA requires full name for
+\# each foot/endnote entry.
+\#
+.de ref*add-i
+.\" Is a foot/endnote.
+.ie \\n[#FN_REF]+\\n[#EN_REF]=1 \{\
+. ie '\\*([i'idem' .rm [i
+. el .ds idem \\*([i
+.\}
+.el \{\
+. rr skip-[A
+.\" %i is idem
+. ie '\\*([i'idem' \{\
+.\" If [A (%A) is the same as the last [A, captured in 'author'.
+. if '\\*([A'\\*[author]' \{\
+. rm [i
+. ref*field i "" \[idem] "" " "
+. nr skip-[A 1
+. \}
+. ds author \\*([A
+. \}
+.\" %i is not 'idem'; attach to long dash
+. el \{\
+. ds eval*[i \\*([i
+. substring eval*[i -1
+. if '\\*[eval*[i]'.' \{\
+. chop [i
+. ds idem \\*([i
+. \}
+. rm [i
+. rm [A
+. ref*field i "" \[idem] ", \\*[idem]" " "
+. \}
+.\}
+..
+\# %m Multiple authors (et al.)
+.de ref*add-m
+.if !\\n[#FN_REF]+\\n[#EN_REF] \{\
+. ds eval*[m \\*([m
+. substring eval*[m -1
+. if '\\*[eval*[m]'.' .chop [m
+.\}
+.ref*field m ,
+..
+\# %p Post-author string (e.g., Preface, Foreword, etc)
+.de ref*add-p
+.\" Convert first letter to uppercase, per MLA, if BIBLIO
+.if !\\n[#FN_REF]+\\n[#EN_REF] \{\
+. ds initial*cap \\*([p
+. substring initial*cap 0 0
+. ds [p*string \\*([p
+. substring [p*string 1
+. ds [p \E*[UC]\\*[initial*cap]\E*[LC]\\*[[p*string]
+.\}
+.ie \\n[#FN_REF]+\\n[#EN_REF] .ref*field p ,
+.el .ref*field p . " "
+..
+\# %Q Author(s) when author is not a person
+.de ref*add-Q
+.ie \\n[#FN_REF]+\\n[#EN_REF] .ref*field Q
+.el .ref*field Q
+..
+\# %T Title (generic)
+.de ref*add-T1
+.ie \\n[#FN_REF]+\\n[#EN_REF] .ref*field T , \E*[IT] \E*[ref*restore-ss]
+.el \{\
+. ie !'\\*([A'' .ref*field T . " \E*[IT]" \E*[ref*restore-ss]
+. el \{\
+. ie !'\\*([Q'' .ref*field T . " \E*[IT]" \E*[ref*restore-ss]
+. el .ref*field T . \E*[IT] \E*[ref*restore-ss]
+. \}
+.\}
+.if \\n([T .nr ref*suppress-period \\n([T
+..
+\# %T Title of a chapter or article
+.de ref*add-T2
+.ie \\n[#FN_REF]+\\n[#EN_REF] \
+. ref*field T , \[lq] "" \[rq]
+.el \{\
+. ie '\\*([A'' \{\
+. ref*field T . \[lq] "" \[rq]
+. if !'\\*([Q''.ref*field T . " \[lq]" "" \[rq]
+. \}
+. el .ref*field T . " \[lq]" "" \[rq]
+.\}
+.if \\n([T .nr ref*suppress-period \\n([T
+..
+\# %B Book title (when citing an article from a book)
+.de ref*add-B
+.ie \\n[#FN_REF]+\\n[#EN_REF] \{\
+. ie \\n([T .ref*field B "" \E*[IT] \E*[ref*restore-ss]
+. el .ref*field B , \E*[IT] \E*[ref*restore-ss]
+.\}
+.el \{\
+. ie \\n([T .ref*field B "" ".\E*[IT]" \E*[ref*restore-ss]
+. el .ref*field B . " \E*[IT]" \E*[ref*restore-ss]
+.\}
+\# refer doesn't set reg [T to 1 for these book titles, so we do it here
+.ds eval*[B \\*([B
+.substring eval*[B -1
+.rr [T
+.if '\\*[eval*[B]'!' .nr [T 1
+.if '\\*[eval*[B]'?' .nr [T 1
+.rm eval*[B
+..
+\# %q Titles that must go in quotes (e.g. an unpublished dissertation)
+.de ref*add-q
+.ie \\n[#FN_REF]+\\n[#EN_REF] .ref*field q , \[lq] "" \[rq]
+.el \{\
+. ie !'\\*([A'' .ref*field q . " \[lq]" "" \[rq]
+. el \{\
+. ie !'\\*([Q'' .ref*field q . " \[lq]" "" \[rq]
+. el .ref*field q . \[lq] "" \[rq]
+. \}
+.\}
+..
+\# %R Report number for technical reports
+.de ref*add-R
+.ref*field R . " "
+..
+\# %J Journal name
+.de ref*add-J
+.ie \\n[#FN_REF]+\\n[#EN_REF] \{\
+. ie \\n([T .ref*field J "" "\E*[IT]" \E*[ref*restore-ss]
+. el .ref*field J , "\E*[IT]" \E*[ref*restore-ss]
+.\}
+.el \{\
+. ie \\n([T .ref*field J "" " \E*[IT]" \E*[ref*restore-ss]
+. el .ref*field J . " \E*[IT]" \E*[ref*restore-ss]
+.\}
+..
+\# %M Magazine or newspaper name
+.de ref*add-M
+.ie \\n[#FN_REF]+\\n[#EN_REF] \{\
+. ie \\n([T .ref*field M "" "\E*[IT]" \E*[ref*restore-ss]
+. el .ref*field M , "\E*[IT]" \E*[ref*restore-ss]
+.\}
+.el \{\
+. ie \\n([T .ref*field M "" " \E*[IT]" \E*[ref*restore-ss]
+. el .ref*field M . " \E*[IT]" \E*[ref*restore-ss]
+.\}
+..
+\# %E Editor(s)
+.de ref*add-E
+.ds eval*[E \\*([E
+.substring eval*[E -1
+.if '\\*[eval*[E]'.' \{\
+. if !\\n[#FN_REF]+\\n[#EN_REF] .chop [E
+. rm eval*[E
+.\}
+.\" Workaround for join-authors also joining editors. MLA style
+.\" requires a comma after first editor only if there are more than
+.\" two, whereas join-authors always puts a comma after the first if
+.\" there's more than one.
+.rm eval*[E
+.nr position 1 1
+.nr counter 1 1
+.while !'\\*[eval*[E]',' \{\
+. ds eval*[E \\*([E
+. substring eval*[E \\n+[position] \\n[position]
+. if \\n+[counter]>30 .break \" 30 is arbitrary
+.\}
+.\" Check for " and"
+.if '\\*[eval*[E]',' \{\
+. ds eval*[E \\*([E
+. nr and-check \\n[position]+4
+. substring eval*[E \\n+[position] \\n[and-check]
+.\}
+.if '\\*[eval*[E]' and' \{\
+. nr counter 1 1
+. nr start-range -1 1
+. nr end-range 3 1
+. while !'\\*[eval*[E]', and' \{\
+. ds eval*[E \\*([E
+. substring eval*[E \\n+[start-range] \\n+[end-range]
+. if \\n+[counter]>50 .break \" just in case; 50 is arbitrary
+. \}
+. if '\\*[eval*[E]', and' \{\
+. length len*[E \\*([E
+. nr rhs \\n[len*[E]-\\n[start-range]
+. ds lhs \\*([E
+. ds rhs \\*([E
+. substring lhs 0 \\n[start-range]-1
+. substring rhs -(\\n[rhs]-1)
+. ds [E \\*[lhs]\\*[rhs]
+. \}
+. rm lhs
+. rm rhs
+. rr and-check
+. rr counter
+. rr start-range
+. rr end-range
+. rr len*[E
+.\}
+.\" End workaround
+.ie !\\n[ref*type]=0 \{\
+. ie \\n([E>0 \{\
+. ie \\n[#FN_REF]+\\n[#EN_REF] \{\
+. ie \\n([T .ref*field E "" "ed. "
+. el .ref*field E , "ed. "
+. \}
+. el \{\
+. ie \\n([T .ref*field E "" " Eds. "
+. el .ref*field E . " Eds. "
+. \}
+. \}
+. el \{\
+. ie \\n[#FN_REF]+\\n[#EN_REF] \{\
+. ie \\n([T .ref*field E "" "ed. "
+. el .ref*field E , "ed. "
+. \}
+. el \{\
+. ie \\n([T .ref*field E "" " Ed. "
+. el .ref*field E . " Ed. "
+. \}
+. \}
+.\}
+.el \{\
+. ie \\n([T .ref*field E "" " "
+. el .ref*field E . " "
+.\}
+.rr [T
+.rr [E
+..
+\# %e Edition
+.de ref*add-e
+.ie \\n([T .ref*field e "" "" " ed."
+.el \{\
+. ie \\n[#FN_REF]+\\n[#EN_REF] .ref*field e , "" " ed."
+. el .ref*field e . " " " ed."
+.\}
+.nr ref*suppress-period 1
+.nr [e 1
+.rr [T
+..
+\# %V Volume (of a journal, or series of books); for journals, %N may be preferable
+.de ref*add-V
+.if \\n[ref*type]=1 \
+. ref*field V
+.if \\n[ref*type]=2 \{\
+. ie \\n[#FN_REF]+\\n[#EN_REF] .ref*field V , "vol. "
+. el \{\
+. ie \\n([T .ref*field V "" " Vol. "
+. el .ref*field V . " Vol. "
+. \}
+.\}
+.if \\n[ref*type]=3 \{\
+. ie \\n([T .ref*field V "" " "
+. el .ref*field V . " "
+.\}
+.rr [T
+..
+\# %N Journal number
+.de ref*add-N
+.ref*field N
+..
+\# %S Series (books or journals)
+.de ref*add-S
+.if \\n[ref*type]=1 \
+. ref*field S
+.if \\n[ref*type]=2 \{\
+. ie \\n[#FN_REF]+\\n[#EN_REF] \{\
+. ie \\n([T .ref*field S
+. el .ref*field S ,
+. \}
+. el \{\
+. ie \\n([T .ref*field S "" " "
+. el .ref*field S . " "
+. \}
+.\}
+.if \\n[ref*type]=3 \{\
+. ie \\n([T .ref*field S "" " "
+. el .ref*field S . " "
+.\}
+.rr [T
+\# refer doesn't set reg [T to 1 for series titles, so we do it here
+.ds eval*[S \\*([S
+.substring eval*[S -1
+.if '\\*[eval*[S]'!' .nr [T 1
+.if '\\*[eval*[S]'?' .nr [T 1
+.rm eval*[S
+..
+\# %C City
+.de ref*add-C
+.ie \\n[#FN_REF]+\\n[#EN_REF] \{\
+. ie r [d \{\
+. ref*field C
+. rr [d
+. \}
+. el \
+. ref*field C "" \*[FU 2](
+. if \\n([T .nr ref*suppress-period \\n([T
+.\}
+.el \{\
+. ie \\n([T .ref*field C "" " "
+. el \{\
+. ie r [e .ref*field C "" " "
+. el .ref*field C . " "
+. \}
+.\}
+.rr [T
+.rr [e
+..
+\# %I Publisher (I stands for Issuer)
+.de ref*add-I
+.ie \\n[#FN_REF]+\\n[#EN_REF] \{\
+. ie !'\\*([C'' .ref*field I :
+. el .ref*field I "" (
+.\}
+.el \{\
+. ie !'\\*([C'' .ref*field I :
+. el \{\
+. ie \\n([T .ref*field I "" " "
+. el .ref*field I . " "
+. \}
+.\}
+.rr [T
+..
+\# %D Date of publication
+.de ref*add-D
+.if \\n[ref*type]=0 \{\
+. ie \\n[#FN_REF]+\\n[#EN_REF] .ref*field D ,
+. el .ref*field D . " "
+.\}
+.if \\n[ref*type]=1 \
+. ref*field D "" "(" ")"
+.if \\n[ref*type]=2 \{\
+. ie \\n[#FN_REF]+\\n[#EN_REF] .ref*field D , "" )
+. el .ref*field D ,
+.\}
+.if \\n[ref*type]=3 \{\
+. ie !'\\*([C'' \{\
+. ie \\n[#FN_REF]+\\n[#EN_REF] .ref*field D , "" )
+. el .ref*field D ,
+. \}
+. el \{\
+. if '\\*([I'' \{\
+. ds eval*[D \\*([D
+. substring eval*[D 0 -4
+. ie '\\*[eval*[D]'1' .ds kern \*[BU3]
+. el .ds kern \*[BU2]
+. ie \\n[#PRINT_STYLE]=2 \
+. if \\n[#FN_REF]+\\n[#EN_REF] .ref*field D "" (\\*[kern] )
+. el .ref*field D
+. \}
+. rm eval*[D
+. rm kern
+. \}
+.\}
+.if \\n[ref*type]=4 .ref*field D ,
+.if \\n[ref*type]=5 .ref*field D
+.ds eval*[D \\*([D
+.substring eval*[D -1
+.if '\\*[eval*[D]'.' .nr ref*suppress-period 1
+..
+\# %P Page number(s)
+.de ref*add-P
+.if \\n[ref*type]=5 .nr ref*type 1
+.ie \\n[#FN_REF]+\\n[#EN_REF] \{\
+. ie \\n[ref*type]=1 .ref*field P : "" .
+. el .ref*field P "" "\|"
+. if \\n[ref*type]=1 .nr ref*suppress-period 1
+.\}
+.el \{\
+. ie \\n[ref*type]=1 .ref*field P \|:
+. el \{\
+. ie d [n .ref*field P . \| .
+. el .ref*field P . " "
+. \}
+.\}
+..
+\# %G Gov't. ordering number
+.de ref*add-G
+.ie \\n[#FN_REF]+\\n[#EN_REF] ref*field G ,
+.el .ref*field G . " "
+..
+\# %O Other (info that goes after %T [or %B] but is hard to categorize; e.g., a dissertation)
+.de ref*add-O
+.ds eval*[O \\*([O
+.substring eval*[O -1
+.if '\\*[eval*[O]'.' .nr [O 1
+.ds initial*cap \\*([O
+.substring initial*cap 0 0
+.ds [O*string \\*([O
+.substring [O*string 1
+.if !\\n[#FN_REF]+\\n[#EN_REF] \
+. ds [O \E*[UC]\\*[initial*cap]\E*[LC]\\*[[O*string]
+.ie \\n[#FN_REF]+\\n[#EN_REF] .ref*field O ,
+.el \{\
+. if \\n([O=1 .chop [O
+. ie r [e .ref*field O "" " "
+. el \{\
+. ie !d [A .ref*field O
+. el .ref*field O . " "
+. \}
+.\}
+.rr [O
+.rr [e
+..
+\# %n Annotations (after ref)
+.de ref*add-n
+.ds eval*[n \\*([n
+.substring eval*[n -1
+.if '\\*[eval*[n]'.' .chop [n
+.if '\\*[eval*[n]'?' .nr [n 1
+.if '\\*[eval*[n]'!' .nr [n 1
+.ie \\n[#FN_REF]+\\n[#EN_REF] .ref*field n ,
+.el \{\
+. ie !'\\*([P'' .ref*field n "" " "
+. el .ref*field n . " "
+.\}
+.if r [n .nr ref*suppress-period 1
+.rr [n
+..
+\#
+.de ref*add-dflt
+.ref*field \\$1 ,
+..
+\#
+\# Book reprints
+\# -------------
+\# %d date of publication (the original date of publication)
+.de ref*add-d
+.ie \\n[#FN_REF]+\\n[#EN_REF] \{\
+. ref*field d "" ( ;
+. nr [d 1
+.\}
+.el \{\
+. ie \\n([T .ref*field d "" " "
+. el .ref*field d . " "
+.\}
+.rr [T
+..
+\# %b main author when citing from a preface, introduction, foreword
+\# or afterword
+.de ref*add-b
+.ie \\n[#FN_REF]+\\n[#EN_REF] \{\
+. ie \\n([T .ref*field b "" "by"
+. el .ref*field b , "by "
+.\}
+.el \{\
+. ie \\n([T .ref*field b "" " By "
+. el .ref*field b . " By "
+.\}
+.rr [T
+..
+\# %t title, if different from original title (the T field, which s/b
+\# the original title)
+.de ref*add-t
+.ie \\n[#FN_REF]+\\n[#EN_REF] .ref*field t , "rpt. of \E*[IT] " \E*[ref*restore-ss]
+.el \{\
+. ie \\n([T .ref*field t "" " Rpt. of \E*[IT] " \E*[ref*restore-ss]
+. el .ref*field t . " Rpt. of \E*[IT] " \E*[ref*restore-ss]
+.\}
+.rr [T
+..
+\#
+\# Translated works
+\# ----------------
+\# %l Trans(l)ator
+.de ref*add-l
+.ie \\n[#FN_REF]+\\n[#EN_REF] \{\
+. ie \\n([T .ref*field l "" "trans. "
+. el .ref*field l , "trans. "
+.\}
+.el \{\
+. ie \\n([T .ref*field l "" " Trans. "
+. el .ref*field l . " Trans. "
+.\}
+.rr [T
+..
+\# %r Translato(r) and edito(r)
+.de ref*add-r
+.ie \\n[#FN_REF]+\\n[#EN_REF] .ref*field r , "trans. and ed. "
+.el \{\
+. ie \\n([T .ref*field r "" " Trans. and ed. "
+. el .ref*field r . " Trans. and ed. "
+.\}
+.rr [T
+..
+\#
+\# Internet
+\# --------
+\# %s Site name
+.de ref*add-s
+.ie \\n[#FN_REF]+\\n[#EN_REF] .ref*field s , \E*[IT] \E*[ref*restore-ss]
+.el \{\
+.ie \\n([s .ref*field s "" ".\E*[IT]" \E*[ref*restore-ss]
+.el .ref*field s . " \E*[IT]" \E*[ref*restore-ss]
+.\}
+.\" refer doesn't set reg [T to 1 for these titles, so we do it here
+.if !\\n[#FN_REF]+\\n[#EN_REF] \{\
+. ds eval*[s \\*([s
+. substring eval*[s -1
+. rr [T
+. if '\\*[eval*[s]'.' .nr [T 1
+. if '\\*[eval*[s]'!' .nr [T 1
+. if '\\*[eval*[s]'?' .nr [T 1
+. rm eval*[s
+.\}
+..
+\# %c content of site (ie. Web, Online posting, etc)
+.de ref*add-c
+.ie \\n[#FN_REF]+\\n[#EN_REF] .ref*field c ,
+.el \{\
+. ie \\n([T .ref*field c "" " "
+. el .ref*field c . " "
+.\}
+.rr [T
+..
+\# %o organization, group or sponsor of site
+.de ref*add-o
+.ie \\n[#FN_REF]+\\n[#EN_REF] .ref*field o ,
+.el \{\
+. ie \\n([T .ref*field o "" " "
+. el .ref*field o . " "
+.\}
+.rr [T
+..
+\# %a access date, i.e. the date you read it
+.de ref*add-a
+.ie \\n[#FN_REF]+\\n[#EN_REF] .ref*field a ,
+.el \{\
+. ie \\n([T .ref*field a "" " "
+. el .ref*field a . " "
+.\}
+.rr [T
+..
+\# %u URL
+.de ref*add-u
+.ref*field u "" < >
+.rr [T
+..
+.de ref*add-z
+.ref*field z
+..
+\#
+\# Build up reference string from ref*add-<x> macros.
+\#
+\# First, a string to ensure next field's font is reset to roman
+\# (TYPESET) or non-underlined (TYPEWRITE)
+\#
+.ie !n .ds ref*roman \f[R]\X'ps: exec decornone'\?\R'#UNDERLINE_ON 0'\?
+.el .ds ref*roman \f[R]\?\R'#UNDERLINE_ON 0'\?
+\#
+.de ref*field
+.if d ref*string \{\
+. ie d ref*post-punct \{\
+. as ref*string "\\$2\\*[ref*post-punct] \"
+. rm ref*post-punct
+. \}
+. el .as ref*string "\\$2 \"
+.\}
+.as ref*string "\\$3\\*([\\$1\\$4\E*[ref*roman]
+.if \\n[.$]>4 .ds ref*post-punct "\\$5\E*[ref*roman]
+.nr ref*suppress-period 0
+..
+\#
+\# MARGIN NOTES
+\# ------------
+\#
+\# Wrapper for MNinit.
+\#
+.MAC MN_INIT END
+. if \B'\\$2' \{\
+. tm1 "[mom]: 1.x-style \\$0 detected, but you are using v2.x.
+. tm1 " v2.x requires flags before arguments to \\$0.
+. tm1 " Please read docelement.html#mn-init and update your file.
+. ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. \}
+. nr #ARGS 0 1
+. nr #COUNT 9
+. while \\n+[#ARGS]<=\\n[#COUNT] \
+. ds $MN-arg\\n[#ARGS] @
+. nr #FLAG 0 1
+. nr #COUNT \\n[#NUM_ARGS]
+. while \\n+[#FLAG]<=\\n[#COUNT] \{\
+. if '\\$1'RAGGED' \{\
+. ds $MN-arg1 \\$1
+. shift
+. \}
+. if '\\$1'SYMMETRIC' \{\
+. ds $MN-arg1 \\$1
+. shift
+. \}
+. if '\\$1'L_WIDTH' \{\
+. shift
+. ds $MN-arg2 \\$1
+. shift
+. \}
+. if '\\$1'R_WIDTH' \{\
+. shift
+. ds $MN-arg3 \\$1
+. shift
+. \}
+. if '\\$1'GUTTER' \{\
+. shift
+. ds $MN-arg4 \\$1
+. shift
+. \}
+. if '\\$1'FONTSTYLE' \{\
+. shift
+. ds $MN-arg5 \\$1
+. shift
+. \}
+. if '\\$1'SIZE' \{\
+. shift
+. ds $MN-arg6 \\$1
+. shift
+. \}
+. if '\\$1'LEAD' \{\
+. shift
+. ds $MN-arg7 \\$1
+. shift
+. \}
+. if '\\$1'COLOR' \{\
+. shift
+. ds $MN-arg8 \\$1
+. shift
+. \}
+. if '\\$1'HY' \{\
+. shift
+. ds $MN-arg9 \\$1
+. shift
+. \}
+. \}
+. if '\\*[$MN-arg5]'@' .ds $MN-arg5 \E*[$DOC_FAM]R
+. MNinit \
+\\*[$MN-arg1] \\*[$MN-arg2] \
+\\*[$MN-arg3] \\*[$MN-arg4] \
+\\*[$MN-arg5] \\*[$MN-arg6] \
+\\*[$MN-arg7] \\*[$MN-arg8] \
+\\*[$MN-arg9]
+.END
+\#
+.MAC MN_OVERFLOW_TRAP END
+. if \\n[#OVERFLOW_LEFT]=1 \{\
+. nr #no-repeat-MN-left 1
+. di MN_OVERFLOW_LEFT
+. \}
+. if \\n[#OVERFLOW_RIGHT]=1 \{\
+. nr #no-repeat-MN-right 1
+. di MN_OVERFLOW_RIGHT
+. \}
+. rr #OVERFLOW_LEFT
+. rr #OVERFLOW_RIGHT
+.END
+\#
+\# The remainder of the margin notes macros and routines are adapted
+\# from Werner Lemberg's MN.tmac.
+\#
+\# MNinit
+\# ------
+\# Usage:
+\# MNinit [ragged|symmetric] \
+\# left-width right-width separation \
+\# font fontsize vertical-spacing \
+\# color hyphenation-flags
+\#
+\# Initialize margin notes. Empty arguments (denoted with "") set
+\# default values. If the first argument is the string 'ragged',
+\# left and right margin notes are printed ragged-right. If it is
+\# 'symmetric', left margin notes are printed ragged-left and right
+\# margin notes ragged-right. If omitted, margin notes are left
+\# and right adjusted.
+\#
+.de MNinit
+. nr #MNinit 1
+. ds MN-left-ad b\"
+. ds MN-right-ad b\"
+. if '\\$1'@' .shift
+. if '\\$1'RAGGED' \{\
+. ds MN-left-ad l\"
+. ds MN-right-ad l\"
+. shift
+. \}
+. if '\\$1'SYMMETRIC' \{\
+. ds MN-left-ad r\"
+. ds MN-right-ad l\"
+. shift
+. \}
+. ie \B'\\$3' .nr MN-sep (n;\\$3)
+. el .nr MN-sep 1m
+. if ((\\n[.o] - \\n[MN-sep]) < 1n) \
+. ab MN: Left margin too small (<1n) for requested margin notes separation.
+. ie \B'\\$1' \{\
+. nr MN-left-width (n;\\$1)
+. nr MN-left-start (\\n[.o] - \\n[MN-sep] - \\n[MN-left-width])
+. \}
+. el \{\
+. nr MN-left-width (\\n[.o] - \\n[MN-sep])
+. nr MN-left-start 0
+. \}
+. if (\\n[MN-left-start] < 0) \
+. ab MN: Left margin too small for requested margin notes settings.
+. if (\\n[MN-left-width] < 1n) \
+. ab MN: Left margin notes width too small (<1n).
+. ie \B'\\$2' \{\
+. nr MN-right-width (n;\\$2)
+. nr MN-right-start (\\n[.o] + \\n[.l] + \\n[MN-sep])
+. if \\n[#COLUMNS]=1 \{\
+. if !\\n[#NUM_COLS]=1 \
+. nr MN-right-start (\\n[#COL_2_L_MARGIN] + \\n[#COL_L_LENGTH] + \\n[MN-sep])
+. \}
+. \}
+. el \{\
+. nr MN-right-width \\n[MN-left-width]
+. nr MN-right-start (\\n[.o] + \\n[.l] + \\n[MN-sep])
+. if \\n[#COLUMNS]=1 \{\
+. if !\\n[#NUM_COLS]=1 \
+. nr MN-right-start (\\n[#COL_2_L_MARGIN] + \\n[#COL_L_LENGTH] + \\n[MN-sep])
+. \}
+. \}
+. ie \A'\\$4' \{\
+. ds MN-font \\$4\"
+. if \\n[#PRINT_STYLE]=1 .ds MN-font CR
+. \}
+. el \{\
+. ds MN-font \\*[$PP_FT]
+. if \\n[#PRINT_STYLE]=1 .ds MN-font CR
+. \}
+. ie \B'\\$5' \{\
+. ps \\$5
+. nr MN-size \\n[.ps]
+. ps
+. if \\n[#PRINT_STYLE]=1 \{\
+. ps \\*[$TYPEWRITER_PS]
+. nr MN-size \\n[.ps]
+. ps
+. \}
+. \}
+. el \
+. nr MN-size \\n[#DOC_PT_SIZE]
+. ie \B'\\$6' \{\
+' vs \\$6
+. nr MN-spacing \\n[.v]
+' vs
+. if \\n[#PRINT_STYLE]=1 \
+. nr MN-spacing \\n[#DOC_LEAD]
+. \}
+. el .nr MN-spacing \\n[#DOC_LEAD]
+. ie \A'\\$7' \
+. if !\\n[#PRINT_STYLE]=1 .ds MN-color \\$7\"
+. el \
+. if !\\n[#PRINT_STYLE]=1 .ds MN-color
+. ie \B'\\$8' .nr MN-hy \\$8
+. el .nr MN-hy \\n[.hy]
+. ev MNbottom-left-env
+. if \A'\\*[MN-font]' .ft \\*[MN-font]
+. if \\n[MN-size] .ps \\n[MN-size]u
+. if \\n[MN-spacing] .vs \\n[MN-spacing]u
+. ll \\n[MN-left-width]u
+. ad \\*[MN-left-ad]
+. hy \\n[MN-hy]
+' in 0
+. nop \m[\\*[MN-color]]\c
+. ev
+. ev MNbottom-right-env
+. if \A'\\*[MN-font]' .ft \\*[MN-font]
+. if \\n[MN-size] .ps \\n[MN-size]u
+. if \\n[MN-spacing] .vs \\n[MN-spacing]u
+. ll \\n[MN-right-width]u
+. ad \\*[MN-right-ad]
+. hy \\n[MN-hy]
+' in 0
+. nop \m[\\*[MN-color]]\c
+. ev
+. nr MN-active 0
+..
+\# MN
+\# --
+\# Usage:
+\#
+\# MN LEFT|RIGHT
+\# margin note text
+\# MN
+\#
+\# With a parameter, start a margin note, otherwise end a margin note.
+\# If the parameter is the string 'left', define a left margin note,
+\# otherwise define a right margin note.
+\#
+.de MN
+. ds MN-dir \\$1
+. if !'\\$1'LEFT' \{\
+. if !'\\$1'RIGHT' \{\
+. MN_QUIT
+. return
+. \}
+. \}
+. if \\n[#COLUMNS]=1 \{\
+. if \\n[#NUM_COLS]>2 \{\
+. tm [mom]: Macro MN: More than two columns. Ignoring margin notes.
+. return
+. \}
+. if !\\n[#NUM_COLS]=1 \{\
+. ie \\n[#COL_NUM]=1 .ds MN-dir LEFT
+. el .ds MN-dir RIGHT
+. \}
+. \}
+. if !\\n[#MNinit]=1 \{\
+. tm1 "[mom]: Macro MN: You must set parameters with MN_INIT before using MN.
+. ab [mom]: Aborting '\\n[.F]' at MN, line \\n[.c].
+. \}
+. ie !'\\$1'' \{\
+. if \\n[MN-active] \{\
+. tm [mom]: Macro MN: Can't handle nested margin notes, line \\n[.c].
+. return
+. \}
+. nr MN-active 1
+. ev MN-env
+. ie '\\*[MN-dir]'LEFT' \{\
+. nr MN-left +1
+. ds MN-curr l-\\n[MN-left]\"
+. evc MNbottom-left-env
+. \}
+. el \{\
+. nr MN-right +1
+. ds MN-curr r-\\n[MN-right]\"
+. evc MNbottom-right-env
+. \}
+. mk MN-mk-\\*[MN-curr]
+. di MN-div-\\*[MN-curr]
+. \}
+. el .MN_QUIT
+..
+\#
+\# MN_QUIT
+\# -------
+\# Utility macro to handle .MN OFF | QUIT | X etc
+\#
+.de MN_QUIT
+. if \\n[MN-active] \{\
+. br
+. di
+. nr MN-div-\\*[MN-curr]-depth \\n[dn]
+. ev
+. \}
+. nr MN-active 0
+..
+\#
+\# MNtop
+\# -----
+\# Resets these registers (called in HEADER)
+.de MNtop
+. nr MN-left 0
+. nr MN-right 0
+. nr MN-active 0
+. rr MN-shifted
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u
+..
+\#
+\# MNbottom
+\# --------
+\# Executed in FOOTER.
+\#
+.de MNbottom
+. if '\\$0'MNbottom-left' \{\
+. ds MN-pos left
+. ds l-r l
+. ds Left-Right Left
+. \}
+. if '\\$0'MNbottom-right' \{\
+. ds MN-pos right
+. ds l-r r
+. ds Left-Right Right
+. \}
+. nr MN-curr 0
+. nr MN-last-pos 0
+. nr MN-lead-adj \\n[#DOC_LEAD]-\\n[MN-spacing]
+. vpt 0
+. if \\n[MN-active] \{\
+. di
+. tm [mom]: Macro MN: Margin note finished by new page. Ignored.
+. \}
+. if \\n[#RECTO_VERSO] \{\
+. if e \{\
+. if '\\*[MN-pos]'right' \
+. nr MN-\\*[MN-pos]-start (\\n[.o]+\\n[.l]+\\n[MN-sep])
+. if '\\*[MN-pos]'left' \
+. nr MN-\\*[MN-pos]-start (\\n[.o]-\\n[MN-sep]-\\n[MN-left-width])
+. \}
+. \}
+. po \\n[MN-\\*[MN-pos]-start]u
+. ev MNbottom-\\*[MN-pos]-env
+. nr #P \\n%+\\n[#PAGE_NUM_ADJ]
+. while (\\n[MN-curr] < \\n[MN-\\*[MN-pos]]) \{\
+. nr MN-curr +1
+. ie (\\n[MN-last-pos] < \\n[MN-mk-\\*[l-r]-\\n[MN-curr]]) \
+. sp |\\n[MN-mk-\\*[l-r]-\\n[MN-curr]]u+\\n[MN-lead-adj]u
+. el \{\
+. nr MN-shifted 1
+. sp 1v
+. SHIM
+. if \\n[#SHIM]>\\n[MN-spacing] .sp -(1v+\\n[MN-lead-adj]u)
+. tm [mom]: Macro MN: Warning: \\*[Left-Right] margin note #\\n[MN-curr] on page \\n[#P] shifted down.
+. \}
+.\" If last margin note doesn't fit
+. if ( (\\n[nl]+\\n[MN-div-\\*[l-r]-\\n[MN-curr]-depth]) > (\\n[.p]+\\n[#VARIABLE_FOOTER_POS]-1) ) \{\
+. if \\n[MN-shifted]=1 \{\
+. sp -(1v+\\n[#SHIM]u)
+. rm MN-div-\\*[l-r]-\\n[MN-curr]
+. tm1 "[mom]: \
+No room to start \\*[MN-pos] margin note #\\n[MN-curr] on page \\n[#P].
+. tm1 " Ignoring margin note.
+. rr MN-shifted
+. \}
+. nr #no-repeat-MN-\\*[MN-pos] 1
+. if '\\*[MN-pos]'left' .nr #OVERFLOW_LEFT 1
+. if '\\*[MN-pos]'right' .nr #OVERFLOW_RIGHT 1
+. ie \\n[#FN_COUNT]=0 \{\
+. ch FOOTER \\n[.p]u
+. wh \\n[#VARIABLE_FOOTER_POS]u+\\n[MN-lead-adj]u+1u MN_OVERFLOW_TRAP
+. \}
+. el \
+. wh \\n[.p]u+\\n[#VARIABLE_FOOTER_POS]u-1u MN_OVERFLOW_TRAP
+. vpt
+. \}
+. nf
+. MN-div-\\*[l-r]-\\n[MN-curr]
+. fi
+. br
+. nr MN-last-pos \\n[nl]
+. \}
+. ev
+. po
+. if !\\n[#no-repeat-MN-\\*[MN-pos]]=1 .vpt
+..
+.
+.ALIAS MNbottom-right MNbottom
+.ALIAS MNbottom-left MNbottom
+\#
+\# PDF SUPPORT
+\# ===========
+\#
+\# Initial setup
+\#
+.nr CURRENT_LEVEL 0
+.nr VIRTUAL_LEVEL 0
+.nr #PDF_BOOKMARKS 1
+.nr #PDF_BOOKMARKS_OPEN 1
+.pdfview /PageMode /UseOutlines
+\#
+\# TOC_BEFORE_HERE
+\# ---------------
+\#
+\# Call this and the TOC will be placed preceding this page
+\#
+.MAC TOC_BEFORE_HERE END
+. nr TOC_BH 1
+. pdfpagename MOM:TOC
+.END
+\#
+\# TOC_AFTER_HERE
+\# ---------------
+\#
+\# Call this and the TOC will be placed after this page
+\#
+.MAC TOC_AFTER_HERE END
+. nr TOC_BH 2
+. pdfpagename MOM:TOC
+.END
+\#
+\# PDF_LINK_COLOR
+\# -----------------
+\#
+\# Arguments:-
+\# <name defined by previous call to XCOLOR or NEWCOLOR> or
+\# <red> <green> <blue> all 0.0 -> 1.0
+\# Notes
+\# Should be called before START but can also be called at any time to change colour
+\# The colour assigned at the end of the document is used for all links in the TOC
+\#
+.MAC PDF_LINK_COLOR END
+. ie \\n[.$]==3 \{\
+. ds PDFHREF.COLOUR \\$*
+. if !(\B'\\$1' & \B'\\$2' & \B'\\$3') \{\
+. tm1 "[mom]: All three arguments to \\$0 at line \\n[.c] must be decimal.
+. tm1 " Continuing to process using default link color.
+. ds PDFHREF.COLOUR 0.0 0.3 0.9
+. \}
+. defcolor pdf:href.colour rgb \\*[PDFHREF.COLOUR]
+. ds PDFHREF.TEXT.COLOUR pdf:href.colour
+. \}
+. el \{\
+. ie \\n[.$]==0 \{\
+. if dPDFHREF.TEXTCOL.DEFAULT \
+. PDF_LINK_COLOR \\*[PDFHREF.TEXTCOL.DEFAULT]
+. \}
+. el \{\
+. ds ARG_1 \\$1
+. substring ARG_1 0 0
+. ie '\\*[ARG_1]'#' \{\
+. defcolor pdf:href.colour rgb \\$1
+. ds PDFHREF.TEXT.COLOUR pdf:href.colour
+. \}
+. el \{\
+. ie dCOLAL_\\$1 .ds PDFHREF.TEXT.COLOUR \\*[COLAL_\\$1]
+. el .ds PDFHREF.TEXT.COLOUR \\$1
+. \}
+. \}
+. \}
+. if !\\n[PDFHREF_COLOR_SET]=1 \
+. nr PDFHREF_COLOR_SET 1
+.END
+\#
+.ALIAS PDF_LINK_COLOUR PDF_LINK_COLOR
+\#
+\# AUTO_RELOCATE_TOC
+\# -----------------
+\#
+\# Call before START to have TOC automatically relocated to after the
+\# DOC COVER (if there is one) or the COVER if there isn't
+\#
+.MAC AUTO_RELOCATE_TOC END
+. if '\\$1'' .nr TOC.RELOCATE 1
+. if '\\$1'TOP' .nr TOC.RELOCATE 2
+. if '\\$1'BEFORE_DOCCOVER' .nr TOC.RELOCATE 3 \" Same as TOP unless no DOCCOVER
+. if '\\$1'AFTER_DOCCOVER' .nr TOC.RELOCATE 4
+. if '\\$1'BEFORE_COVER' .nr TOC.RELOCATE 5
+. if '\\$1'AFTER_COVER' .nr TOC.RELOCATE 6
+.END
+\#
+.ALIAS AUTO_TOC_RELOCATE AUTO_RELOCATE_TOC
+\#
+\# PDF_BOOKMARK
+\# ------------
+\# *Argument:
+\# Hierarchy Level
+\# Bookmark Text
+\# *Function:
+\# Creates a bookmark using the given text
+\# The level controls the hierarchy of the bookmarks
+\# *Notes
+\# Bookmarks can be turned off (will not be added to document outline) by calling
+\# "PDF_BOOKMARKS NO" and turned on with "PDF_BOOKMARKS".
+\#
+\# Bookmarks can be open or closed by calling PDF_BOOKMARKS_OPEN
+\#
+.MAC PDF_BOOKMARK END
+. if \\n[#PDF_BOOKMARKS] \{\
+. ie '\\$1'NAMED' \{\
+. ds PDF_NM -T \\$2
+. ds PDF_NM2 \\$2
+. shift 2
+. \}
+. el .ds PDF_NM
+. nr LEVEL_REQ \\$1
+. shift
+. ie \\n[LEVEL_REQ]>\\n[VIRTUAL_LEVEL] \{\
+. nr VIRTUAL_LEVEL \\n[LEVEL_REQ]
+. nr LEVEL_REQ \\n[CURRENT_LEVEL]+1
+. \}
+. el \{\
+. ie \\n[LEVEL_REQ]<\\n[VIRTUAL_LEVEL] \{\
+. nr VIRTUAL_DIFF \\n[VIRTUAL_LEVEL]-\\n[LEVEL_REQ]
+. nr VIRTUAL_LEVEL \\n[LEVEL_REQ]
+. nr LEVEL_REQ (\\n[CURRENT_LEVEL]-\\n[VIRTUAL_DIFF])>?1
+. \}
+. el .nr LEVEL_REQ \\n[CURRENT_LEVEL]
+. \}
+. ds PDF_TX \\$*
+. pdfmomclean PDF_TX
+. nr PDF_LEV (\\n[LEVEL_REQ]*\\n[#PDF_BOOKMARKS_OPEN])
+. ie '\\*[.T]'ps' \{\
+. if !'\\*[PDF_NM]'' \{\
+. pdfhref M -N \\*[PDF_NM2] -- \\*[PDF_TX]
+. if !dpdf:href.map .tm gropdf-info:href \\*[PDF_NM2] \\*[PDF_TX]
+. \}
+. pdfbookmark \\n[PDF_LEV] \\*[PDF_TX]
+. \}
+. el .pdfbookmark \\*[PDF_NM] \\n[PDF_LEV] \\$*
+. nr CURRENT_LEVEL \\n[LEVEL_REQ]
+. rr LEVEL_REQ
+. rr PDF_LEV
+. rr VIRTUAL_DIFF
+. rm PDF_NM
+. \}
+.END
+\#
+\# PDF_TITLE
+\# ---------
+\# *Argument:
+\# Title Text
+\# *Function
+\# Set the PDF title (this is often used by PDF readers to title the main window)
+\#
+.MAC PDF_TITLE END
+. ds pdftitle \\$*
+. pdfmomclean pdftitle
+. nop \!x X ps:exec [/Title (\\*[pdftitle]) /DOCINFO pdfmark
+.END
+\#
+\# PDF_BOOKMARKS
+\# -------------
+\# *Argument:
+\# <nothing> | <anything>
+\# *Function:
+\# With no parameter turns on outline bookmarks
+\# With any parameter turns off outline bookmarks
+\#
+.MAC PDF_BOOKMARKS END
+. ie '\\$1'' .nr #PDF_BOOKMARKS 1
+. el .nr #PDF_BOOKMARKS 0
+.END
+\#
+\# PDF_BOOKMARKS_OPEN
+\# ------------------
+\# *Argument:
+\# <number> | <nothing> | <text>
+\# *Function:
+\# If arg is numeric all Bookmark levels > arg are closed
+\# If arg is empty all bookmarks are open
+\# If arg is any text then any following bookmarks are closed
+\#
+.MAC PDF_BOOKMARKS_OPEN END
+. ie \B'\\$1' \{\
+. nr PDFOUTLINE.FOLDLEVEL \\$1
+. nr #PDF_BOOKMARKS_OPEN 1
+. \}
+. el .if '\\*[.T]'pdf' \{\
+. nr PDFOUTLINE.FOLDLEVEL 10000
+. ie '\\$1'' .nr #PDF_BOOKMARKS_OPEN 1
+. el .nr #PDF_BOOKMARKS_OPEN 0-1
+. \}
+.END
+\#
+\# PDF_LINK
+\# --------
+\# *Arguments:
+\# $1 = named link
+\# [PREFIX text] : text to prefix link
+\# [SUFFIX text] : text after link
+\# text
+\# *Notes
+\# Text is output as a hotspot link to named destination.
+\# If text has final '*' it is replaced with the text associated with the link
+\#
+.MAC PDF_LINK END
+. ds PDF_NM \\$1
+. shift
+. ie '\\$1'PREFIX' \{\
+. ds PDF_PRE -P "\&\\$2"
+. shift 2
+. \}
+. el .ds PDF_PRE
+. ie '\\$1'SUFFIX' \{\
+. ds PDF_POST -A "\\$2"
+. shift 2
+. \}
+. el .ds PDF_POST
+. ds PDF_AST_Q
+. ds PDF_TXT \&\\$1
+. ds PDF_AST \\*[PDF_TXT]
+. substring PDF_AST -1 -1
+. if '\\*[PDF_AST]'+' \{\
+. ds PDF_AST *
+. ds PDF_AST_Q ""
+. \}
+. if '\\*[PDF_AST]'*' \{\
+. chop PDF_TXT
+. ie '\\*[.T]'pdf' \{\
+. ie d pdf:look(\\*[PDF_NM]) \
+. as PDF_TXT \&\\*[PDF_AST_Q]\\*[pdf:look(\\*[PDF_NM])]\\*[PDF_AST_Q]
+. el \{\
+. as PDF_TXT Unknown
+. if !rPDF_UNKNOWN .tm \
+\\n[.F]:\\n[.c]: forward reference detected (please run using 'pdfmom')
+. nr PDF_UNKNOWN 1
+. \}
+. \}
+. el \{\
+. ie d pdf:href(\\*[PDF_NM]).info \
+. as PDF_TXT \&\\*[PDF_AST_Q]\\*[pdf:href(\\*[PDF_NM]).info]\\*[PDF_AST_Q]
+. el .as PDF_TXT Unknown
+. \}
+. \}
+. pdfhref L \\*[PDF_PRE] \\*[PDF_POST] -D \\*[PDF_NM] -- \\*[PDF_TXT]
+. rm PDF_NM
+. rm PDF_PRE
+. rm PDF_POST
+. rm PDF_TXT
+. rm PDF_AST
+. rm PDF_AST_Q
+.END
+\#
+.MAC PDF_WWW_LINK END
+. ds PDF_NM \\$1
+. shift
+. ie '\\$1'PREFIX' \{\
+. ds PDF_PRE -P "\\$2"
+. shift 2
+. \}
+. el .ds PDF_PRE
+. ie '\\$1'SUFFIX' \{\
+. ds PDF_POST -A "\\$2"
+. shift 2
+. \}
+. el .ds PDF_POST
+. ds PDF_AST_Q
+. ds PDF_TXT \\$1
+. ie !'\\*[PDF_TXT]'' \{\
+. ds PDF_AST \\*[PDF_TXT]
+. substring PDF_AST -1 -1
+. if '\\*[PDF_AST]'+' \{\
+. ds PDF_AST *
+. ds PDF_AST_Q ""
+. \}
+. if '\\*[PDF_AST]'*' \{\
+. chop PDF_TXT
+. as PDF_TXT \&\\*[PDF_AST_Q]\\*[PDF_NM]\\*[PDF_AST_Q]
+. \}
+. \}
+. el .ds PDF_TXT \\*[PDF_NM]
+. pdfhref W -D "\\*[PDF_NM]" \\*[PDF_PRE] \\*[PDF_POST] -- \\*[PDF_TXT]
+. rm PDF_NM
+. rm PDF_PRE
+. rm PDF_POST
+. rm PDF_TXT
+. rm PDF_AST PDF_AST_Q
+.END
+\#
+.MAC PDF_TARGET END
+. ds ARG_1 \\$1
+. shift
+. ie '\\$*'' .pdfhref M -N \\*[ARG_1] -- \\$*
+. el .pdfhref M -N \\*[ARG_1] -E -- \\$*
+. if '\\*[.T]'ps' .if !dpdf:href.map .tm gropdf-info:href \\*[ARG_1] \\$*
+.END
+\#
+\# PDF_IMAGE
+\# ---------
+\# *Arguments:
+\# [ -L -| -R | -C | -I <indent> ] \
+\# <image file> <width> <height> \
+\# [ SCALE <factor> ] [ ADJUST +|-<vertical shift> ] [ TARGET <pdf target> ] \
+\# [ NO_SHIM ] [ NO_FLEX ]
+\# *Function:
+\# Allows embedding of PDF images with the same arguments as PSPIC
+\# plus SCALE and ADJUST options.
+\# *Notes:
+\# <image file> <width> <height> are required.
+\#
+.MAC PDF_IMAGE END
+. br
+. if !'\\n[.z]'FLOAT*DIV' \{\
+. nr pdf-img:float 1
+. FLOAT
+. \}
+. PDF_TARGET fig:\\n+[lists*target]
+. nr float*img 1
+. ds ev-current \\n[.ev]
+. ev IMG
+. evc \\*[ev-current]
+. if \\n[#HYPHENATE] .nh
+. nr ind-pre-img \\n[.i]
+. nr ll-pre-img \\n[.l]
+. in 0
+. ds pos:tmp \\$1
+. substring pos:tmp 0 0
+. ie !'\\*[pos:tmp]'-' .ds pdf-img:pos -C
+. el \{\
+. ds pdf-img:pos \\$1
+. shift
+. \}
+. if '\\*[pdf-img:pos]'-I' \{\
+. nr pdf-img:ind \\$1
+. shift
+. \}
+. ds pdf-img:file \\$1
+. ds pdf-img@file \\$1
+. substring pdf-img@file -1 -3
+. if !'\\*[pdf-img@file]'pdf' \{\
+. tm1 "[mom]: Image file '\\*[pdf-img:file]' at line \\n[.c] not found, or not a PDF image.
+. ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c].
+. \}
+. nr pdf-img:width \\$2
+. nr pdf-img:depth \\$3
+. shift 3
+. nr loop-counter \\n[#NUM_ARGS]
+. nr loop-count 0 1
+. while \\n+[loop-count]<=\\n[loop-counter] \{\
+. if '\\$1'SCALE' \{\
+. shift
+. nr pdf-img:scale \\$1
+. shift
+. nr pdf-img:width \\n[pdf-img:width]*\\n[pdf-img:scale]/100
+. nr pdf-img:depth \\n[pdf-img:depth]*\\n[pdf-img:scale]/100
+. \}
+. if '\\$1'ADJUST' \{\
+. shift
+. ds pdf-img:adj \\$1
+. shift
+. \}
+. if '\\$1'FRAME' \{\
+. nr pdf-img:frame 1
+. if !r pdf-img:frame-inset .nr pdf-img:frame-inset 6p
+. shift
+. \}
+. if '\\$1'CAPTION' \{\
+. nr pdf-img*have-caption 1
+. ds pdf-img*caption \\$2
+. shift 2
+. \}
+. if '\\$1'SHORT_CAPTION' \{\
+. ds pdf-img*caption-short \\$2
+. shift 2
+. \}
+. if '\\$1'LABEL' \{\
+. nr pdf-img*have-label 1
+. ds pdf-img*label \\$2
+. ds label-type pdf-img
+. shift 2
+. \}
+. if '\\$1'TARGET' \{\
+. ds target "\\$2
+. PDF_TARGET "\\*[target]
+. shift 2
+. \}
+. if '\\$1'NO_SHIM' \{\
+. if !'\\n[.z]'FLOAT*DIV' .nr pdf-img*no-shim 1
+. nr @no-shim 1
+. shift 1
+. \}
+. if '\\$1'NO_FLEX' \{\
+. nr pdf-img*no-flex 1
+. nr @no-flex 1
+. shift 1
+. \}
+. \}
+. if (\\n[pdf-img*have-label]=1):(\\n[pdf-img*autolabel]=1) \
+. ds label-type pdf-img
+. if !'\\*[pdf-img*label-sffx]'' \{\
+. ds pdf-img*label-sffx-tmp \\*[pdf-img*label-sffx]
+. substring pdf-img*label-sffx-tmp -1
+. if '\\*[pdf-img*label-sffx-tmp]'.' \
+. if \\n[pdf-img*caption-after-label]=0 .chop pdf-img*label-sffx
+. \}
+. if '\\*[pdf-img:pos]'-C' \
+. nr pdf-img:ind (\\n[.ll]-\\n[ind-pre-img]-\\n[pdf-img:width])/2
+. if '\\*[pdf-img:pos]'-R' \
+. nr pdf-img:ind \\n[.ll]-\\n[pdf-img:width]-\\n[ind-pre-img]
+. if \\n[pdf-img*label-with-chapter] \
+. ds chapno \\n[#CH_NUM].
+. if \\n[pdf-img*autolabel] \{\
+. ds pdf-img*label \\*[pdf-img*label-prfx]\\*[chapno]\\n+[fig*label-num]\\*[pdf-img*label-sffx]
+. nr fig*label-width \w'\\*[pdf-img*label]'
+. nr fig*label-num -1
+. \}
+. if !'\\*[pdf-img*caption-short]'' .ds short -short
+. if \\n[#PDF_BOOKMARKS] \{\
+. ie (\\n[pdf-img*have-label]=1):(\\n[pdf-img*autolabel]=1) \{\
+\!. TO_FIGURES "\\*[pdf-img*label]" "\\*[pdf-img*caption\\*[short]]"
+. \}
+. el \{\
+\!. if !'\\*[pdf-img*caption\\*[short]]'' \
+\!. TO_FIGURES "\\*[pdf-img*caption\\*[short]]"
+. \}
+. \}
+. if r IMG \{\
+. if \\n[pdfbx-top] \
+. rt
+. sp (\\*[wt\\n[stack]]/2u)+\\*[gap\\n[stack]]u
+. nr img*pdfbx 1
+. \}
+. di PDF*IMAGE
+. if \\n[@TOP] \{\
+. ch RR_@TOP
+. rs
+. nop \&
+. sp -1v
+. \}
+. if \\n[pdf-img*have-caption] \{\
+. if !\\n[pdf-img*autolabel] \{\
+. if !\\n[pdf-img*have-label] \{\
+. if \\n[#MLA] \
+. mla@error caption label \\n[.F] \\$0 \\n[.c]
+. \}
+. \}
+. if !\\n[pdf-img*caption-after-label] \{\
+. if !r pdfbx-top \
+. if !\\n[@TOP] \!.sp .5v
+. nr lead-pre-caption \\n[.v]
+. ev caption
+. evc IMG
+. ie \\n[#PRINT_STYLE]=1 .TYPEWRITER
+. el \{\
+. img*caption-style
+. vs \\n[.ps]u+\\n[pdf-img*caption-autolead]u
+. \}
+. if r pdfbx-top .nr restore-pdfbx-top 1
+. PDF_IMG*SET_CAPTION_QUAD \\*[pdf-img*caption-quad]
+. if r restore-pdfbx-top \{\
+. nr pdfbx-top 1
+. rr restore-pdfbx-top
+. \}
+. nr pdf-img*caption-top-lead-diff \\n[lead-pre-caption]-\\n[.v]
+. if r pdfbx-top \{\
+. SIZESPECS
+. rt
+. sp \\n[pdf-img*caption-top-lead-diff]u
+. sp (\\*[wt\\n[stack]])+\\*[gap\\n[stack]]u+\\*[$CAP_HEIGHT]
+. rr pdfbx-top
+. \}
+. if \\n[pdfbx-running] \{\
+. in -(\\*[wt\\n[stack]])+\\*[gap\\n[stack]]u
+. ll -(\\*[wt\\n[stack]])+\\*[gap\\n[stack]]u
+. \}
+. nop \\*[pdf-img*caption]
+. if r pdfbx-running \{\
+. in
+. ll
+. \}
+. br
+. if !'\\*[pdf-img*caption-space]'' .sp \\*[pdf-img*caption-space]
+. ev
+. in 0
+. sp -.5v
+. \}
+. \}
+. nf
+. if \\n[pdf-img:frame] \{\
+. nr frame-width \\n[pdf-img:width]+(\\n[pdf-img:frame-inset]*2)
+. nr frame-depth \\n[pdf-img:depth]+(\\n[pdf-img:frame-inset]*2)
+. if '\\*[pdf-img:pos]'-L' \{\
+. nr pdf-img:ind \\n[pdf-img:frame-inset]
+. nr pdf-img:dbx-ind 0
+. \}
+. if '\\*[pdf-img:pos]'-C' \{\
+. nr pdf-img:dbx-ind \
+\\n[.ll]-\\n[ind-pre-img]-\\n[pdf-img:width]/2-\\n[pdf-img:frame-inset]
+. \}
+. if '\\*[pdf-img:pos]'-R' \{\
+. nr pdf-img:ind -\\n[pdf-img:frame-inset]
+. nr pdf-img:dbx-ind \
+\\n[.l]u-(\\n[pdf-img:width]u+(\\n[pdf-img:frame-inset]u*2u)+\\n[ind-pre-img]u)
+. \}
+. if '\\*[pdf-img:pos]'-I' \{\
+. nr pdf-img:ind +\\n[pdf-img:frame-inset]
+. nr pdf-img:dbx-ind \\n[pdf-img:ind]-\\n[pdf-img:frame-inset]
+. \}
+. DBX \\*[pdf-img:frame-weight] \
+ \\n[pdf-img:dbx-ind]u \
+ \\n[frame-width]u \
+ \\n[frame-depth]u \
+ \\*[pdf-img:frame-color]
+. sp \\n[pdf-img:frame-inset]u
+. nr pdf-img:ind -\\n[pdf-img:frame-inset]
+. \}
+. ti \\n[pdf-img:ind]u+\\n[pdf-img:frame-inset]u
+. nop \X'pdf: pdfpic \\*[pdf-img:file] -L \\n[pdf-img:width]z \\n[pdf-img:depth]z'
+. if r pdfbx-top .rr pdfbx-top
+. if '\\*[pdf-img:pos]'-C' .nr pdf-img:ind +\\n[pdf-img:frame-inset]
+. sp \\n[pdf-img:depth]u
+. if \\n[pdf-img:frame] .sp \\n[pdf-img:frame-inset]u
+. if (\\n[pdf-img*have-label]=1):(\\n[pdf-img*autolabel]=1):(\\n[pdf-img*caption-after-label]=1) \{\
+. if \\n[#MLA] \{\
+. if (\\n[pdf-img*have-label]=1):(\\n[pdf-img*autolabel]=1) \{\
+. if !\\n[pdf-img*have-caption] \
+. mla@error label caption \\n[.F] \\$0 \\n[.c]
+. \}
+. \}
+. nr lead-pre-label \\n[.v]
+. ev label
+. evc IMG
+. ie \\n[#PRINT_STYLE]=1 .TYPEWRITER
+. el \{\
+. img*label-style
+. vs \\n[.ps]u+\\n[pdf-img*label-autolead]u
+. \}
+. if \\n[pdf-img*label-with-chapter] \
+. ds chapno \\n[#CH_NUM].
+. PDF_IMG*SET_LABEL_QUAD \\*[pdf-img*label-quad]
+. SIZESPECS
+. nr pdf-img*label-lead-diff \\n[lead-pre-label]-\\n[.v]
+. sp -.5+\\*[$CAP_HEIGHT]+\\n[pdf-img*label-lead-diff]u
+. if !'\\*[pdf-img*label-space]'' .sp \\*[pdf-img*label-space]
+. if \\n[pdfbx-running] \{\
+. in -(\\*[wt\\n[stack]])+\\*[gap\\n[stack]]u
+. ll -(\\*[wt\\n[stack]])+\\*[gap\\n[stack]]u
+. \}
+. ie \\n[pdf-img*autolabel] \{\
+. nop \
+\\*[pdf-img*label-prfx]\\*[chapno]\\n+[fig*label-num]\\*[pdf-img*label-sffx]\|
+. ds pdf-img*label \\*[chapno]\\n[fig*label-num]
+. if dLABEL.REFS \
+. tm .ds \\*[target] \\*[chapno]\\n[fig*label-num]
+. rm target
+. \}
+. el .if !'\\*[pdf-img*label]'' .nop \\*[pdf-img*label]
+. fam
+. ft
+. ps
+. if r pdfbx-running \{\
+. in
+. ll
+. \}
+. gcolor
+. if !'\\*[pdf-img*caption]'' \{\
+. if \\n[pdf-img*caption-after-label] \{\
+. ds pdf-img*caption-old \\*[pdf-img*caption]
+. ds pdf-img*caption " \\*[pdf-img*caption]
+. nop \\*[pdf-img*caption-specs]\\*[pdf-img*caption]\\*[revert-specs]
+. ds pdf-img*caption \\*[pdf-img*caption-old]
+. \}
+. \}
+. br
+. ev
+. in 0
+. \}
+\!. in
+. di
+. nf
+. vpt 0
+. if !'\\*[pdf-img:adj]'' \{\
+. if \\n[@TOP] \
+. if \\n[#COLUMNS]>1 \
+\!. rs
+\!. sp \\*[pdf-img:adj]
+. \}
+. PDF*IMAGE
+. if !'\\*[pdf-img:adj]'' \
+. if !\\n[@TOP] \!.sp -\\*[pdf-img:adj]
+. vpt
+. ev
+. if \\n[pdf-img:float] \{\
+. FLOAT off
+. nr dl \\n[pdf-img:width]
+. \}
+. if \\n[img*pdfbx] \{\
+. sp .5
+. nr img*pdfbx 2
+. \}
+. if !\\n[pdf-img:float] \{\
+. ie !\\n[#NO_SHIM] \
+. if !\\n[pdf-img*no-shim] .SHIM
+. el \
+. if !\\n[#NO_FLEX] \
+. if !\\n[pdf-img*no-flex] .FLEX
+. \}
+. PDF_IMAGE_CLEAN
+.END
+\#
+\# PDF_IMAGE_FRAME
+\# ---------------
+\# *Arguments:
+\# [ <inset> ] [ <rule weight> ] [ <color> ]
+\# *Function:
+\# Sets parameters for pdf image frames.
+\# *Notes:
+\# Defaults are '6p' '.5' 'black'. Arguments to be left at default
+\# must be entered as "".
+\#
+.MAC PDF_IMAGE_FRAME END
+. ie !'\\$1''\{\
+. ds frame-arg \\$1
+. substring frame-arg -1
+. ie \B'\\*[frame-arg]' \{\
+. tm1 "[mom]: \\$0 inset argument at line \\n[.c]
+. tm1 " of '\\n[.F]' requires a unit of measure.
+. tm1 " Default 6 point inset will be used instead.
+. \}
+. el \{\
+. nr pdf-img:frame-inset \\$1
+. shift
+. \}
+. \}
+. el .shift
+. ie !'\\$1'' \{\
+. ds frame-arg \\$1
+. substring frame-arg -1
+. ie \B'\\*[frame-arg]' \{\
+. ds pdf-img:frame-weight \\$1
+. shift
+. \}
+. el \{\
+. ds frame-arg \\$1
+. substring frame-arg -1
+. length arg-len \\*[frame-arg]
+. if \\n[arg-len]=1 \{\
+. tm1 "[mom]: \\$0 rule weight argument at line \\n[.c]
+. tm1 " of '\\n[.F]' must not have a unit of measure appended.
+. tm1 " Default .5 rule weight will be used instead.
+. shift
+. \}
+. \}
+. \}
+. el .shift
+. if !'\\$1'' \{\
+. ie m \\$1 .ds pdf-img:frame-color \\$1
+. el \{\
+. tm1 "[mom]: \\$0 color argument '\\$1' at line \\n[.c]
+. tm1 " of '\\n[.F]' is not a valid color.
+. tm1 " Default black will be used instead.
+. \}
+. \}
+.END
+\#
+.MAC PDF_IMAGE_CLEAN END
+. rm PDF*IMAGE
+. rm pdf-img:adj
+. rm pdf-img*caption
+. rm pdf-img*caption-short
+. rm pdf-img:file
+. rm pdf-img*label
+. rm pdf-img:pos
+. rm short
+. rr ind-pre-img
+. rr pdf-img:depth
+. rr pdf-img:float
+. if !\\n[pdf-img:frame] \
+. rr pdf-img:frame
+. rr pdf-img:ind
+. rr pdf-img:no-shim
+. rr pdf-img:no-flex
+. rr pdf-img:scale
+. if !\\n[defer] \
+. rr pdf-img*have-caption
+. rr pdf-img:frame-inset
+. rr pdf-img:width
+. if '\\*[pdf-img*label-sffx-tmp]'.' .ds pdf-img*label-sffx .
+. it 1 rr-img*pdfbx
+.END
+\#
+.de pdfmomclean
+. ie '\\n[.z]'' \{\
+. ds pdfcleaned \\$*
+. ev pdfcln
+. tr \[em]-
+. nf
+. box pdf:clean
+. nop \\*[\\*[pdfcleaned]]
+. fl
+. box
+. chop pdf:clean
+. asciify pdf:clean
+. ev
+. ds \\*[pdfcleaned] "\\*[pdf:clean]
+. rm pdf:clean
+. tr \[em]\[em]
+. \}
+. el .nop \!.pdfmomclean \\$@
+..
+\#
+.MAC PAUSE END
+. nr pdfbx-inhibit-space 1
+. if \\n[pdfbx-running] \{\
+. nr pdfbx-pause 1
+. rr pdfbx-inhibit-space
+. BoxStop
+. \}
+. vpt 0
+. br
+. vpt
+. ie !'\\n[.z]'' \{\
+\!. pdfpause
+\!. pdftransition BLOCK \\$1
+. \}
+. el \{\
+. pdfpause
+. pdftransition BLOCK \\$1
+. \}
+. if \\n[pdfbx-pause] \{\
+. BoxStart \\*[pdfbx-args]
+. rr pdfbx-pause
+. rr pdfbx-inhibit-space
+. \}
+.END
+\#
+.MAC TRANSITION END
+. ie !'\\n[.z]'' \
+\!. pdftransition PAGE \\$1
+. el .pdftransition PAGE \\$1
+.END
+\#
+\# Shaded backgrounds and frames (pdf boxes), page colour
+\#
+\# BOX
+\# ---
+\# *Arguments:
+\# SHADED <color> | OUTLINED <color> \
+\# [ WEIGHT <wt> ] [ INSET <dist> ] \
+\# [ ADJUST +|-<amount> ] \
+\# [ EQN | PIC | GRAP | IMG ]
+\# *Function:
+\# Calls BoxStart with the supplied arguments or stops a running
+\# box.
+\# *Notes:
+\# If OUTLINED given but no WEIGHT, the default weight is .5p.
+\# Otherwise, args have no defaults.
+\#
+.MAC BOX END
+. nr #FROM_BOX 1
+. ie \\n[#NUM_ARGS]=0 \
+. BoxStart SHADED grey85 INSET 1P
+. el \{\
+. ie \\n[#NUM_ARGS]=1 .BoxStop
+. el .BoxStart \\$*
+. \}
+. rr #FROM_BOX
+.END
+\#
+\# PAGE COLOUR
+\# -----------
+\# *Arguments:
+\# <color> | OFF | off
+\# *Function:
+\# Sets pagefill to <color> or stops pagefill.
+\# *Notes:
+\# OFF|off is required instead of the usual <anything>.
+\#
+.MAC PAGE_COLOR END
+. ie !'\\$1'OFF' \{\
+. ie !'\\$1'off' \{\
+. fcolor \\$1
+. device pdf: background pagefill
+. \}
+. el .device pdf: background off
+. \}
+. el .device pdf: background off
+.END
+\#
+.ALIAS PAGE_COLOUR PAGE_COLOR
+.ALIAS SLIDE_COLOR PAGE_COLOR
+.ALIAS SLIDE_COLOUR PAGE_COLOR
+\#
+\# Begin or end a box; called from BoxStart
+\#
+.de pdfbackground
+. device pdf: background \\$*
+. if '\\$1'off' \{\
+. ie (\\n[stack]-1)=0 \{\
+. if \\n[.t]>(1.6v+(\\*[wt\\n[stack]]/2u)) \
+. sp \\*[wt\\n[stack]]/2u
+. \}
+. el \{\
+. nr pdfbx-container \\n[stack]-1
+. if \\n[.t]>=((\\*[wt\\n[stack]]/2u)+(\\*[gap\\n[pdfbx-container]])+(\\*[wt\\n[pdfbx-container]])) \
+. sp \\*[wt\\n[stack]]/2u
+. \}
+. \}
+..
+\#
+\# Input trap macros
+\#
+.de rr-pdfbx-top
+. rr pdfbx-top
+..
+\#
+.de rr-pdfbx-end
+. rr pdfbx-end
+..
+\#
+.de rr-pdfbxstop
+. rr pdfbxstop
+..
+\#
+.de rr-pic*pdfbx
+. rr pic*pdfbx
+..
+\#
+.de rr-tbl*pdfbx
+. rr tbl*pdfbx
+..
+\#
+.de rr-img*pdfbx
+. rr img*pdfbx
+..
+\#
+.de rr-pdfbx-post-q
+. rr pdfbx-post-q
+..
+\#
+.de rr-pdfbx-div-start
+. rr pdfbx-div-start
+..
+\#
+\# Heavy lifting macros called from BOX.
+\#
+.de BoxStart
+. ds pdfbx-args \\$*
+. if \\n[pdfbx-inhibit-space] .sp -1
+. rr pdfbx-inhibit-space
+. if \\n[#PP_SPACE] \{\
+. nr restore-pp-space 1
+. PARA_SPACE off
+. \}
+. if \\n[#PRINT_STYLE]=1 \{\
+. tm1 "[mom]: PRINTSTYLE TYPEWRITE does not permit shaded backgrounds and frames.
+. tm1 " Continuing to process without backgrounds or frames.
+. return
+. \}
+. if \\n[#COLUMNS] \{\
+. tm1 "[mom]: Shaded backgrounds and frames are not available when COLUMNS are enabled.
+. tm1 " Continuing to process without backgrounds or frames.
+. return
+. \}
+. if \\n[Q-float]=1 .nr Q-float 2
+. if !'\\n[.z]'' \{\
+. nr pdfbx-div-start 1
+\!. it 1 rr-pdfbx-div-start
+. \}
+. if !\\n[#NO_SHIM] \{\
+. NO_SHIM
+. nr pdfbx-restore-shim 1
+. \}
+. if !\\n[#NO_FLEX] \{\
+. NO_FLEX
+. nr pdfbx-restore-flex 1
+. \}
+. if (\\n[#NO_SHIM]=0)&(\\n[#NO_FLEX]=1) .nr pdfbx-restore-shim 1
+. if (\\n[#NO_SHIM]=1)&(\\n[#NO_FLEX]=0) .nr pdfbx-restore-flex 1
+. rr shad
+. rr outl
+. rm wt
+. rm pdfbx-adj
+. nr pdfbx-running 1
+. nr pdfbx-top 1
+. nr stack +1
+. nr pdfbx-prev \\n[stack]-1
+. ds type " "
+. ie r #FROM_BOX .ds calling-macro BOX
+. el .ds calling-macro \\$0
+. while \\n[.$] \{\
+. if !'\\$1'SHADED' \
+. if !'\\$1'OUTLINED' \
+. if !'\\$1'WEIGHT' \
+. if !'\\$1'INSET' \
+. if !'\\$1'PIC' \
+. if !'\\$1'GRAP' \
+. if !'\\$1'EQN' \
+. if !'\\$1'IMG' \
+. if !'\\$1'ADJUST' \{\
+. tm [mom]: Invalid argument '\\$1' to \\*[calling-macro], line \\n[.c].
+. shift 1
+. \}
+. if '\\$1'SHADED' \{\
+. nop \\M[\\$2]\c
+. nr shad 1
+. chop type
+. as type "fill"
+. shift 2
+. \}
+. if '\\$1'OUTLINED' \{\
+. nop \\m[\\$2]\c
+. nr outl 1
+. chop type
+. as type "box"
+. shift 2
+. \}
+. if '\\$1'WEIGHT' \{\
+. ds wt \\$2
+. shift 2
+. \}
+. if '\\$1'INSET' \{\
+. nr gap \\$2
+. shift 2
+. \}
+. if '\\$1'ADJUST' \{\
+. ds pdfbx-adj \\$2
+. shift 2
+. \}
+. if '\\$1'PIC' \{\
+. ie '\\n[.z]'FLOAT*DIV' .nr PIC 2
+. el .nr PIC 1
+. shift 1
+. \}
+. if '\\$1'GRAP' \{\
+. ie '\\n[.z]'FLOAT*DIV' .nr PIC 2
+. el .nr PIC 1
+. shift 1
+. \}
+. if '\\$1'EQN' \{\
+. nr EQN 1
+. shift 1
+. \}
+. if '\\$1'IMG' \{\
+. nr IMG 1
+. shift 1
+. \}
+. \}
+. if '\\*[type]' ' .ds type "fill "
+. chop type
+. if !r gap .nr gap 1P
+. ie \\n[outl] \
+. if '\\*[wt]'' .ds wt .5p
+. el .ds wt 0
+. if d pdfbx-adj .sp \\*[pdfbx-adj]
+. if \\n[@TOP] \{\
+. RESTORE_SPACE
+. sp -1
+. nr @TOP 1
+. \}
+. nr pdfbxstop 1 \" Stop box in footer if .br causes a page break
+. br
+. if \\n[Q-float]=2 .sp -.5
+. rr pdfbxstop
+. fl
+. SIZESPECS
+. ds pdfbx-cap-adj \\*[$CAP_HEIGHT]
+.\" Top spacing
+. if \\n[#EPIGRAPH]+\\n[#QUOTE]=0 \
+. if \\n[#START] .sp -2
+. if \\n[#EPIGRAPH] \{\
+. ie \\n[#START] \!.sp -2
+. el \!.sp -1.5
+. \}
+. if \\n[#QUOTE] \{\
+. if !\\n[@TOP] \!.sp -.5-\\*[pdfbx-cap-adj]
+. if \\n[#START] \!.sp .5+\\*[wt]
+. rr @TOP
+. \}
+. if '\\n[.z]'FLOAT*DIV' \{\
+. if !\\n[#START] \!.sp -1
+. nr no-top-space:1 1
+. nr pdfboxed 1
+. \}
+. if \\n[stack]=1 \{\
+. if \\n[#INDENT_LEFT_ACTIVE] .nr #IL_ACTIVE \\n[#L_INDENT]
+. if \\n[#INDENT_RIGHT_ACTIVE] .nr #IR_ACTIVE \\n[#R_INDENT]
+. if \\n[#INDENT_BOTH_ACTIVE] \{\
+. nr #IBL_ACTIVE \\n[#BL_INDENT]
+. nr #IBR_ACTIVE \\n[#BR_INDENT]
+. \}
+. if \\n[#IN_ITEM] \
+. if \\n[#BR_INDENT] .nr #IBR_ACTIVE \\n[#BR_INDENT]
+. \}
+.\" Set l
+. nr pdfbx-l \\n[#L_MARGIN]
+. if \\n[#EPIGRAPH]=2 \{\
+. GET_EPI_OFFSET
+. nr pdfbx-l \\n[#EPI_OFFSET]
+. \}
+. if \\n[#QUOTE]=2 \{\
+. ie \\n[#BQ_OFFSET_VALUE] \
+. nr pdfbx-l \\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#BQ_OFFSET_VALUE])
+. el \
+. nr pdfbx-l \\n[#L_MARGIN]+(\\*[$BQ_OFFSET_VALUE])
+. \}
+. ie \\n[stack]=1 \
+. nr l \\n[pdfbx-l]+(\\*[wt]/2)+\\n[#IL_ACTIVE]+\\n[#IBL_ACTIVE]
+. el .nr l +(\\*[wt\\n[pdfbx-prev]]/2)+\\*[gap\\n[pdfbx-prev]]+(\\*[wt]/2)
+.\" Set r
+. nr r \\n[pdfbx-l]+\\n[.l]-(\\*[wt]/2u)
+. if \\n[#QUOTE]=1 .nr r \\n[pdfbx-l]+\\n[#L_LENGTH]-(\\*[wt]/2)
+. if \\n[#IR_ACTIVE] .nr r \\n[pdfbx-l]+\\n[#L_LENGTH]-\\n[#IR_ACTIVE]-(\\*[wt]/2)
+. if \\n[#IBR_ACTIVE] .nr r \\n[pdfbx-l]+\\n[#L_LENGTH]-\\n[#IBR_ACTIVE]-(\\*[wt]/2)
+.\" Set t
+. ie \\n[stack]=1 .nr t \\n[#T_MARGIN]+(\\*[wt]/2)
+. el .nr t +(\\*[wt\\n[pdfbx-prev]]/2)+\\*[gap\\n[pdfbx-prev]]+(\\*[wt]/2)
+.\" Set b
+. nr b \\n[.p]+\\n[#VARIABLE_FOOTER_POS]-(\\*[wt]/2)+\\n[#DOC_LEAD]u
+.\" Clear indents
+. if \\n[stack]=1 \{\
+. nr pdfbx-clear 1
+. ILX CLEAR
+. IRX CLEAR
+. if !\\n[#QUOTE]=2 \
+. if !\\n[#EPIGRAPH]=2 \
+. IBX CLEAR
+. if \\n[#IR_ACTIVE] .nr pdfbx-pre-ll \\n[#L_LENGTH]
+. rr pdfbx-clear
+. \}
+.\" See if box fits
+.\" PIC and IMG are in floats, which take care of fit/defer.
+. if (\\n[PIC]=0)&(\\n[IMG]=0) \{\
+. if '\\n[.z]'' \{\
+. nr pdfbx-min \
+ (\\*[wt]*2)+\\*[pdfbx-cap-adj]+(\\n[gap]*2)
+. if r EQN .nr pdfbx-min +1v
+. if \\n[.t]<\\n[pdfbx-min] \{\
+. rr pdfbx-running
+. bp
+. nr pdfbx-running 1
+. RESTORE_SPACE
+. \}
+. \}
+. \}
+.\" FOOTER trap
+. if !r #VFP0 .nr #VFP0 \\n[#VARIABLE_FOOTER_POS]
+. nr #VFP\\n[stack] 0\\n[#VFP\\n[pdfbx-prev]]-\\*[wt]-\\n[gap]
+. nr #VARIABLE_FOOTER_POS 0\\n[#VFP\\n[stack]]
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u
+. mk
+. sp \\*[wt]/2u
+.
+. pdfbackground \\*[type] \\n[l]z \\n[t]z \\n[r]z \\n[b]z \\*[wt]
+.
+.\" Always start at wt+gap
+. ie \\n[#IL_ACTIVE]:\\n[#IBL_ACTIVE] \
+. IL \\n[gap]u+\\*[wt]+\\n[#IL_ACTIVE]u+\\n[#IBL_ACTIVE]u
+. el .IL \\n[gap]u+\\*[wt]
+. ie \\n[#IR_ACTIVE]:\\n[#IBR_ACTIVE] \
+. IR \\n[gap]u+\\*[wt]+\\n[#IR_ACTIVE]u+\\n[#IBR_ACTIVE]u
+. el .IR \\n[gap]u+\\*[wt]
+. nr pdfbx-ll \\n[.l]
+. rt
+. sp \\*[wt]+\\*[pdfbx-cap-adj]+\\n[gap]u
+. if (\\n[shad]=1) .nop \\M[]\c
+. if (\\n[outl]=1) .nop \\m[]\c
+. ds gap\\n[stack] \\n[gap]
+. ds wt\\n[stack] \\*[wt]
+. rm wt type
+. it 2 rr-pdfbx-top
+..
+\#
+.de BoxStop
+. if \\n[#PRINT_STYLE]=1 .return
+. if \\n[#COLUMNS]=1 .return
+. if \\n[#QUOTE]=1 .nr pdfboxed 1
+. if \\n[pdfbx-end]=\\n[nl] \{\
+. ie !'\\n[.z]'FLOAT*DIV' .nr pdfbxstop-consec 1
+. el \
+\!. if '\\n[.z]'FLOAT*DIV' .nr pdfbxstop-consec 1
+. rr pdfbx-end
+. \}
+. nr pdfbxstop 1 \" Stop box in footer if EOL causes a page break
+. if !'\\n[.z]'' \!.nr pdfbxstop 1
+. EOL
+. rr pdfbxstop
+. if (\\n[.ns]+\\n[@TOP])>0 .RESTORE_SPACE
+. nr pdfbx-prev \\n[stack]-1
+. nr #VARIABLE_FOOTER_POS 0\\n[#VFP\\n[pdfbx-prev]]
+. if \\n[stack]=1 \{\
+. if !\\n[#FN_COUNT] .nr #VARIABLE_FOOTER_POS 0-\\n[#B_MARGIN]
+. \}
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u
+. if !'\\n[.z]'' \!.ch FOOTER \\n[#VARIABLE_FOOTER_POS]u
+. ie !r pdfbxstop-consec \{\
+. sp \\*[gap\\n[stack]]u+(\\*[wt\\n[stack]]/2u)
+. if r tbl*pdfbx \{\
+. if \\n[tbl*pdfbx]=1 .sp -.6
+. if \\n[tbl*pdfbx]=2 .sp -.6-1p
+. if \\n[tbl*pdfbx]=3 .sp -.6+1.5p
+. \}
+. if r eqn*pdfbx \{\
+. if \\n[eqn*pdfbx]=1 .sp -.75
+. if \\n[eqn*pdfbx]=2 .sp -.5
+. rr eqn*pdfbx
+. \}
+. \}
+. el \{\
+. sp
+. if r pdfbx-post-space .sp -\\n[pdfbx-post-space]u
+. rr pdfbx-post-space
+. sp (\\*[wt\\n[stack]]/2u)+\\*[gap\\n[stack]]u
+. if \\n[.t]<(\\*[wt\\n[stack]]+\\*[gap\\n[stack]]) \{\
+. nr pdfbx-container \\n[stack]+1
+. sp \\*[wt\\n[pdfbx-container]]/2u
+. \}
+. \}
+. if \\n[pic*pdfbx]=2 \
+. sp -.5
+. if \\n[grap] \
+. if \\n[pic*have-label] \
+. sp .5
+. if \\n[img*pdfbx]=2 \
+. sp -.5
+.
+. pdfbackground off
+.
+. EOL
+. if \\n[.t]<1v \{\
+. nr pdfbxstop 1 \" Stop box in footer if .br causes a page break
+. br
+. \}
+. if \\n[pdfbx-pause] .sp -2
+. if \\n[pic*pdfbx] \
+. if \\n[pic*have-label] .sp .5
+. IL -(\\*[gap\\n[stack]]u+\\*[wt\\n[stack]])
+. IR -(\\*[gap\\n[stack]]u+\\*[wt\\n[stack]])
+.\" Bottom spacing
+.\" If the .sp or .br in the ie/el clause causes a break, tell
+.\" HEADER to skip the PDF boxes stanza.
+. nr pdfbxstop 1
+. if !'\\n[.z]'' \!.nr pdfbxstop 1
+. if '\\n[.z]'FLOAT*DIV' .if \\n[float*tbl] .sp -.5
+. ie \\n[.t]>1v \{\
+. nr pdfbx-post-space 1.6v
+. if \\n[#EPIGRAPH] \
+. nr pdfbx-post-space .6v
+. \}
+. el .br
+. rr pdfbxstop
+. if '\\n[.z]'FLOAT*DIV' \!.rr pdfbxstop
+. sp \\n[pdfbx-post-space]u
+. if \\n[pic*pdfbx] \
+. sp -.5
+. if \\n[img*pdfbx] \
+. sp -.5
+. if \\n[#QUOTE] .sp -.5+(\\*[wt\\n[stack]]/2u)
+. nr pdfbx-end \\n[nl]
+. it 2 rr-pdfbx-end
+. rr pdfbxstop-consec
+. ie '\\n[.z]'' .rr pdfbx-running
+. el \{\
+\!. rr pdfbx-running
+\!. nr pdfbx-defer 1
+. \}
+. ie '\\n[.z]'' .nr stack \\n[stack]-1
+. el \{\
+\!.nr stack-for-float \\n[stack]
+\!.nr stack \\n[stack]-1
+. \}
+. if \\n[pic*pdfbx] .rr pic*pdfbx
+. if \\n[tbl*pdfbx] .rr tbl*pdfbx
+. if \\n[img*pdfbx] .rr img*pdfbx
+. if \\n[stack]=0 \{\
+. ILX CLEAR
+. IRX CLEAR
+. IBX CLEAR
+. if \\n[#IL_ACTIVE] \{\
+. nr #L_INDENT \\n[#IL_ACTIVE]
+. IL
+. rr #IL_ACTIVE
+. \}
+. if \\n[#IR_ACTIVE] \{\
+. nr #R_INDENT \\n[#IR_ACTIVE]
+. ll \\n[pdfbx-pre-ll]u
+. IR
+. rr pdfbx-pre-ll
+. rr #IR_ACTIVE
+. \}
+. if \\n[#IBR_ACTIVE] \{\
+. ll \\n[pdfbx-pre-ll]u
+. IB \\n[#IBL_ACTIVE]u \\n[#IBR_ACTIVE]u
+. rr pdfbx-pre-ll
+. rr #IBR_ACTIVE
+. rr #IBL_ACTIVE
+. \}
+. if r PIC \{\
+. rr pic*pdfbx
+. rr PIC
+. \}
+. if r EQN \{\
+. rr eqn*pdfbx
+. rr EQN
+. \}
+. if r IMG \{\
+. rr img*pdfbx
+. rr IMG
+. \}
+. \}
+. if '\\n[.z]'P_QUOTE' \{\
+. nr pdfbx-post-q 1
+. it 2 rr-pdfbx-post-q
+. \}
+. if d pdfbx-adj .rm pdfbx-adj
+. if \\n[restore-pp-space] \{\
+. rr restore-pp-space
+. PARA_SPACE
+. \}
+. if \\n[pdfbx-restore-shim] \{\
+. NO_SHIM off
+. rr pdfbx-restore-shim
+. \}
+. if \\n[pdfbx-restore-flex] \{\
+. NO_FLEX off
+. rr pdfbx-restore-flex
+. \}
+. ie '\\n[.z]'' \{\
+. if \\n[stack]=0 \{\
+. rr #VFP0
+. if !\\n[#NO_SHIM] .SHIM
+. if !\\n[#NO_FLEX] .FLEX
+. \}
+. \}
+. el \{\
+\!. if (\\\\n[stack]=0) \{\
+. rr #VFP0
+. if !r #EPIGRAPH \!.SHIM
+. \}
+. \}
+..
+\#
+\# Local Variables:
+\# mode: nroff
+\# End:
+\# vim: filetype=groff:
diff --git a/contrib/pdfmark/ChangeLog b/contrib/pdfmark/ChangeLog
new file mode 100644
index 0000000..1c5a18f
--- /dev/null
+++ b/contrib/pdfmark/ChangeLog
@@ -0,0 +1,683 @@
+2023-02-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * pdfmark.am (uninstall-pdfmark-hook): Simplify uninstallation.
+ Try to remove the configured `pdfdocdir` in the event it is
+ empty, but do not fail if it isn't. (It can be a directory
+ shared with other groff components; we don't know in what order
+ the uninstall targets will serialize, but the last one run
+ should succeed.)
+
+2022-09-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * sanitize.tmac: Move comment to where escape sequences are
+ recognized. Problem arose in commit 058b63ce3d, 2021-09-04.
+
+ troff:.../contrib/pdfmark/sanitize.tmac:162: warning: macro '\"'
+ not defined
+
+2022-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * pdfmark.am: Rename `BUILD_PDFDOC` to `USE_GROPDF`.
+
+2022-03-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * pdfmark.am: Eliminate `PDFMARK_TFLAG` and `PDFMARK_PFLAG` Make
+ macros; they were expanded in only one place.
+ (PDFROFF): Track rename of Make macro `TFLAG` to `MFLAG`.
+
+2022-03-30 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * cover.ms: Die horribly if `PSPIC` call fails.
+
+2022-03-26 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * pdfmark.am (PDFDOCFILES): Replace hard-coded "gnu.eps"
+ file name with expansion of `DOC_GNU_EPS`.
+ (contrib/pdfmark/pdfmark.pdf): Pass `-I` option to pdfroff(1) to
+ enable location of "gnu.eps" file.
+
+2021-10-24 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Adapt to accommodate global XH and XN implementations.
+
+ cf. <https://savannah.gnu.org/bugs/?58946#comment13>
+
+ * spdf.tmac (XH-INIT, XN-INIT, XH-UPDATE-TOC): Delete definitions;
+ the defaults, provided by s.tmac, are now sufficient.
+ (XH-REPLACEMENT, XN-REPLACEMENT): Define these, rather than...
+ (XH, XN): ...these, respectively.
+
+2021-10-02 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Make a minor layout adjustment.
+
+ * pdfmark.ms (Section 2.4.3): Add a vertical space reservation, to
+ avoid a widow line at the end of the paragraph explaining use of...
+ (PDFHREF.Y): ...this computed register, in the definition of...
+ (PDFBOOKMARK.VIEW): ...this.
+
+2021-10-02 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Clarify references to use of the -Tpdf option.
+
+ * pdfmark.ms (Section 2, Section 3.1): Add footnotes, indicating that
+ only "-Tps" and "-Tpdf" output formats are supported, and that "-Tpdf"
+ may avoid a separate step, to convert from PostScript to PDF.
+
+2021-10-02 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Work around misplacement of link "hot-spots" in footnotes.
+
+ * pdfmark.ms (pdfhref-nobreak): New document-local macro; used instead
+ of "pdfhref", this forces paragraph adjustment before placement of any
+ unbreakable link text, for which line-wrap may be required. Currently
+ observed only within footnotes, without adjustment, the "hot-spot" for
+ the link may be placed 1v above its associated text.
+
+2021-10-02 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Link footnote reference marks to footnote text.
+
+ * pdfmark.ms (FP): Redefine locally; replace s.tmac default.
+ (FF): Do not redefine; our FP replacement macro does not use it.
+ [d FS-MARK] (FS-MARK): Redefine locally; map it to...
+ (pdf:fn.mark): ...this locally defined macro.
+ [!d FS-MARK] (@FS): Rename s.tmac implementation as...
+ (pdf:fn.record): ...this, then redefine @FS itself, to call...
+ (pdf:fn.mark, pdf:fn.record): ...these, in respective order.
+ (groff-1.19.1, GhostScript-8.14): Update footnote reference syntax.
+ (Ghostscript-8.14, MSYS): Emulate sentence space after footnote mark.
+ (*): Replace s.tmac string definition; make it equivalent to "\c",
+ after renaming its original implementation as...
+ (pdf:fn.index): ...this; synchronize references with changes to...
+ (pdf:fn.index.count): ...this new locally defined register; it is
+ auto-incremented by one, as each footnote is placed.
+
+2021-10-01 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Incorporate user-defined TOC leader style.
+
+ * pdfmark.ms: Make some comment tidy-up adjustments.
+ (TC-LEADER, TC-MARGIN): Define them, to take advantage of new
+ s.tmac features; cf. <https://savannah.gnu.org/bugs/?61157>.
+
+2021-09-18 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Factor a further unnecessary macro out of spdf.tmac
+
+ * spdf.tmac (XR): Remove it; relocate it to...
+ * pdfmark.ms (XR): ...here.
+
+2021-09-13 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Add comments to annotate locally-defined font change macros.
+
+ * pdfmark.ms (EM): Annotate this locally-defined emphasis macro...
+ (CWB, CWI, CWBI): ...these constant width font interpolation macros...
+ (=): ...and this locally-defined IP tag variant string.
+
+2021-09-13 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Update defunct internet URL references.
+
+ * pdfmark.ms (pdfmark-manual): Adobe moved the document (again);
+ update the document reference macro, to follow the URL relocation.
+ (www.mingw.org): The MinGW Project has relinquished this domain;
+ update the URL reference, to follow web-site relocation to...
+ (mingw.osdn.io): ...here.
+
+2021-09-13 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Factor document-specific bloat out of spdf.tmac
+
+ * spdf.tmac: Reorganize; add many comments.
+ (XN): Retained, but reimplemented, to serve as...
+ (XH, XN): ...both of these; add callback hooks for...
+ (XH-INIT, XN-INIT, XH-UPDATE-TOC): ...these; provide no-op stubs;
+ factor out TOC collection code, delegating to XH-UPDATE-TOC.
+ (opt*XN-N, opt*XN-S, opt*XN-X): Rename internal macros to...
+ (de spdf:XH-N, de spdf:XH-S, de spdf:XH-X): ...these, respectively.
+ (AN, @AN, IE, IS, LU, NN, PXREF, SAME-PAGE, XM): Delete; we do not
+ require these; if users do, they should define their own.
+ (pdf@toc): Delete internal macro; fold body into...
+ (TC): ...this.
+
+ * pdfmark.ms (XH-UPDATE-TOC): Implement callback; it is based on...
+ (XN): ...original implementation of this, factored out of spdf.tmac,
+ but with significant simplification, to remove unnecessary code.
+ (XNVS1, XNVS2, XNVS3): Tighten vertical spacing.
+
+2021-09-04 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Reduce potential for user-space exposure of "ms" internals.
+
+ * spdf.tmac (@NH): Append to s.tmac macro; assign...
+ (spdf:nh*hl): ...this new internal register; alias it to...
+ (.NH): ...this new public name, hence making it track...
+ (nh*hl): ...this s.tmac internal numeric register.
+ (XN): Use \n[.NH] instead of \n[nh*hl].
+
+2021-09-03 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Sanitize text for use in PDF document outlines.
+
+ * sanitize.tmac: New file; it implements...
+ (sanitize): ...this new macro; interprets its first argument as a
+ string name, and copies its remaining arguments to the named string,
+ discarding specific embedded troff escape sequences; currently...
+ (\F): ...only this is identified as "specifically discardable".
+
+ * pdfmark.am (TMACFILES): Add sanitize.tmac
+
+ * spdf.tmac (mso): Include sanitize.tmac
+ (xn*ref, xn*argc): Rename all occurrences...
+ (spdf:refname, spdf:argc): ...to these, respectively.
+ (XN): Stop inserting $* directly into PDF outlines; instead, use...
+ (spdf:bm.text): ...this new string; this is locally defined by...
+ (spdf:bm.define): ...this new macro; passed the original $* from
+ XN, this itself, is locally defined as a redirectable alias for...
+ (spdf:bm.basic): ...this new local macro; it simply copies $*,
+ passed from XN, to the string named by its first argument, (which is
+ always spdf:bm.text), so reproducing previous behaviour.
+ (opt*XN-S): New macro; defined for internal use only, it adds a "-S"
+ option to XN, such that, when specified, it temporarily redirects...
+ (spdf:bm.define): ...this macro mapping alias to...
+ (sanitize): ...this.
+
+ * pdfmark.ms (XN): Add "-S" option for all headings which include...
+ (\F[C]...\F[]): ...this escape sequence.
+
+2021-08-21 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Define, and use registered trade mark strings.
+
+ * pdfmark.ms (Adobe, Acrobat, Distiller, PostScript, Microsoft):
+ Define as strings. Each expands to its own name, followed by the
+ registered trademark symbol, as a superscript, and optional trailing
+ punctuation, below the superscript. Use each as required.
+
+2021-08-21 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Prefer "-ize" to "-ise" where etymology permits.
+
+ * pdfmark.ms: For all verbs, and their derivative nouns, for which
+ British English allows either "-ise" or "-ize" as ending, prefer the
+ "-ize" form of verb, and "-ization" form of noun, throughout.
+
+2021-08-20 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Correct a spelling error.
+
+ * pdfmark.ms (Section 2.5.3.1): Fix typo: s/exanple/example/.
+
+2021-08-20 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Space out section headings in pdfmark.ms source.
+
+ * pdfmark.ms (.NH): Precede each instance by one null request, to
+ improve readability.
+
+2021-08-18 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Refine pdfroff "missing ghostscript" diagnostic.
+
+ * pdfroff.sh [$GS = ":"]: Fix typo: s/connot/cannot/; refine text.
+
+2020-12-25 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * pdfmark.am (PDFROFF): Call pdfroff without
+ `--keep-temporary-files` option. Temporary directories are
+ created with mktemp(1) and files with an embedded process
+ identifier, which frustrates reproducible builds.
+
+ See <https://savannah.gnu.org/bugs/?57218>.
+
+2018-02-28 Werner LEMBERG <wl@gnu.org>
+
+ * pdfmark.am (pdfmark.pdf): Use $(GROFF_V).
+
+2018-02-28 Werner LEMBERG <wl@gnu.org>
+
+ * pdfmark.am (pdfroff): Use $(AM_V_GEN) to silence file generation.
+
+2015-08-22 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * pdfroff.1.man: Rename `pdfroff.man'.
+
+ * pdfmark.am: Add `Last update'. Setup Emacs mode.
+
+2015-08-05 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * pdfmark.am: Add `Last update'. Setup Emacs mode.
+
+2015-04-03 Werner LEMBERG <wl@gnu.org>
+
+ * pdfroff.man: Make it work in compatibility mode.
+
+2014-10-14 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Deduce "--no-toc-relocation" from input stream (revisited).
+
+ * pdfroff.sh (WRKFILE): Correct malformed sed expression.
+
+ * spdf.tmac (TC): Prefer value of pdfroff's PHASE register to defined
+ state of pdf:href.map, when choosing to emit control record to...
+ (toc_relocation): ...enable this.
+
+2014-10-13 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Deduce "--no-toc-relocation" from input stream.
+
+ * pdfroff.sh (WRKFILE): Scan it for "pdfroff-option:set" records;
+ apply settings; check for equivalent of "--no-toc-relocation" option.
+
+ * spdf.tmac (TC): Emit "pdfroff-option:set toc-relocation=enabled".
+
+2014-10-12 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Avoid spurious user visible control messages on stderr.
+
+ * pdfroff.sh (REFCOPY): Ensure that at least one pdfhref mark of type
+ 'Z' will remain in the reference map, after all references have been
+ resolved; this is required, to suppress writing of reference control
+ records to stderr during the final PDF output processing phase.
+
+2014-09-04 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * all pdfmark source files: Copying (remove last updates and
+ replace years with package years) and Emacs setup.
+
+2014-03-30 Steffen Nurpmeso <sdaoden@yandex.com>
+
+ * Makefile.sub: Put straight error-prevention prefixes for `rm'.
+
+2014-03-29 Steffen Nurpmeso <sdaoden@yandex.com>
+
+ * Makefile.sub: Handle examples separately, controlled by
+ $(make{_,_install_,_uninstall_}examples).
+
+2013-01-28 Deri James <deri@chuzzlewit.myzen.co.uk>
+
+ * pdfmark.tmac (pdfmark, pdf:composed): Use `\!' instead of `\X'.
+
+ With the old pdfmark there are gaps between two of the lines, but
+ with the new version they disappear. The use of `.br' and `.in 0'
+ is arbitrary any request which causes an implicit break could be
+ used. Two breaks together only produce one line break, but if there
+ is an intervening `\X' then the second break finds the line buffer
+ not empty and generates another line break.
+
+ Using `\!' does alter the position of the pdfmark lines in the
+ intermediate file sent to grops (the pdfmark lines are output
+ immediately rather than being serialised through the output line
+ processing), but this has no effect since the contents of the
+ pdfmark line stay the same. It is the contents which determine
+ where bookmarks jump to not the position of the record in the input
+ stream to grops.
+
+ I initially used `.output', but hit a snag if a pdfbookmark occurs
+ before the document starts to output (message saying to insert an
+ explicit `.br'), this is quite likely for things like `.pdfinfo
+ /Author' which occur at the top of the document. So I'm using the
+ `\!' escape.
+
+2012-09-20 Werner LEMBERG <wl@gnu.org>
+
+ Simplify enviroment handling.
+
+ Suggested by Ivan Shmakov <oneingray@gmail.com>.
+
+ * Makefile.sub (PDFROFF): Don't use export.
+
+2011-12-26 Mike Frysinger <vapier@gentoo.org>
+
+ Fix parallel build race failure.
+
+ Sometimes building in parallel will fail in the pdfmark directory:
+
+ make[2]: Entering directory '.../contrib/pdfmark'
+ rm -f pdfroff
+ rm -f pdfmark.pdf
+ sed -f ... ./pdfroff.sh >pdfroff
+ ...; ./pdfroff ... pdfmark.ms >pdfmark.pdf
+ /bin/sh: ./pdfroff: Permission denied
+ chmod +x pdfroff
+ make[2]: *** [pdfmark.pdf] Error 126
+
+ This is because the generated pdf files use the local generated
+ pdfroff helper script, but they don't depend directly upon it, so
+ make tries to create the two in parallel and randomly falls over.
+
+ * Makefile.sub: Have all the .pdf files explicitly depend on the
+ `pdfroff' helper script.
+
+2010-12-23 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Update copyright notices; pdfmark.tmac bug-fix.
+
+ * pdfmark.tmac: Update copyright notices.
+ (pdf*href.mark.resolve): Avoid premature removal, by aliasing to...
+ (pdf*href.mark.begin): ...this, rather than renaming.
+
+ * pdfroff.sh, pdfroff.man: Update copyright notices.
+
+2010-12-14 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Clean up handling of temporary files directory.
+
+ * .cvsignore (pdfroff-*): Ignore sub-directories matching this.
+ * Makefile.sub (MOSTLCLEANDIRADD): Schedule them for removal.
+
+2010-12-02 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Address potential temporary file security vulnerabilities.
+
+ * pdfroff.sh (GROFF_TMPDIR): Use mktemp(1) to assign it, if possible;
+ fall back to ${TMPDIR}, ${TMP} or ${TEMP} if unsuccessful.
+ * pdfroff.man: Document it.
+
+2009-08-16 Colin Watson <cjwatson@debian.org>
+
+ Make pdfroff's GhostScript invocation safer.
+
+ * pdfroff.sh (PDFROFF_POSTPROCESSOR_COMMAND): Add `-dSAFER' option.
+ * pdfroff.man: Document it.
+
+2008-12-28 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Avoid phantom line wrapping in pdfhref hot-spots.
+
+ * pdfmark.tmac (pdf*href.mark.end): Emit hot-spot end markers within
+ scope of `\Z', to prevent possible output line length overflow which
+ may occur only in the layout computation passes, but not in the final
+ output pass. Problem observed and identified by Nick Stoughton; it
+ causes some hot-spots to be displaced from their proper locations.
+
+2007-04-11 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Avoid stray newlines in folded pdfmark literal content.
+
+ * pdfmark.tmac (pdf*pdfmark.dispatch.wrapped): New string; define it
+ when accumulating long literal content; make it undefined otherwise.
+ (PDFMARK.FOLDWIDTH, PDFMARK.FOLDWIDTH.MAX): Reserve space for two
+ extra characters, to accommodate a space and an escaped newline,
+ while accumulating literal content, in case folding is required.
+ (pdf*pdfmark.dispatch) [pdf*pdfmark.dispatch.wrapped]: Add them.
+
+2007-04-11 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * pdfmark.tmac (pdfbookmark): Don't evaluate within diversions; defer
+ placement until diversion is copied out at top level.
+
+2007-02-06 Eric S. Raymond <esr@snark.thyrsus.com>
+
+ * pdfroff.man: Update .UR/.UE and .MT/.ME to latest changes in
+ an-ext.tmac.
+
+2007-01-30 Werner LEMBERG <wl@gnu.org>
+
+ * pdfroff.man: Updated.
+
+2007-01-21 Werner LEMBERG <wl@gnu.org>
+
+ * pdfroff.man: Revised, based on a patch from Eric Raymond. It now
+ uses the new macros from an-ext.tmac. This is the first of a series
+ of man patches which Eric has contributed.
+
+2006-07-30 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * pdfroff.sh (PDFROFF_KILL_NULL_PAGES): Require `%%BeginPageSetup' on
+ PostScript output line immediately following `%%Page:'.
+
+2006-07-29 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * pdfroff.sh (PDFROFF_KILL_NULL_PAGES): Require `sed' to match a more
+ explicit regular expression, for detection of redundant pages.
+
+2006-07-14 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * pdfroff.sh (PDFWRITE): Local shell variable replaced...
+ (PDFROFF_POSTPROCESSOR_COMMAND): by this new environment variable...
+ (GROFF_GHOSTSCRIPT_INTERPRETER): with this bound to it.
+ (PDFROFF_COLLATE, PDFROFF_KILL_NULL_PAGES): New environment variables.
+ (--no-kill-null-pages): New command line option; implement it, and...
+ (--help): Add description for it.
+
+ * pdfroff.man (PDFROFF_POSTPROCESSOR_COMMAND): Document it.
+ (PDFROFF_COLLATE, PDFROFF_KILL_NULL_PAGES): Document them.
+ (--no-kill-null-pages): Document it.
+
+2006-07-14 Zvezdan Petkovic <zpetkovic@acm.org>
+
+ * pdfroff.sh (--emit-ps): New command line option; implement it.
+ (--help): Add description for it.
+
+ * pdfroff.man (--emit-ps): Document it.
+
+2006-06-11 Werner LEMBERG <wl@gnu.org>
+
+ * pdfroff.man: Add `.ig' block after NAME section to make mandb
+ happy.
+
+2006-03-31 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Split `pdfmark' output as required, to avoid excessively long
+ `ps:exec' intermediate output records.
+
+ * pdfmark.tmac (pdfmark): Macro extended to deploy ...
+ (pdf*pdfmark.limit): New macro; use it to define ...
+ (PDFMARK.FOLDWIDTH, PDFMARK.FOLDWIDTH.MAX): New registers.
+ (pdf*compose.first, pdf*compose.next, pdf*compose.literal): New
+ macros; each will be aliased as required to ...
+ (pdf*compose): ... this, to dynamically construct ...
+ (pdf:composed.line, pdf:composed.literal): ... these new strings.
+ (pdf:compose.test): New dynamically constructed string; use it to
+ detect parenthesised literals in pdfmark content, so folding can be
+ avoided within them, subject to honouring of `PDFMARK.FOLDWIDTH'.
+ (pdf*length.increment): New macro; it triggers output folding when ...
+ (pdf:length): ... this new register exceeds `PDFMARK.FOLDWIDTH.MAX'.
+ (pdf*pdfmark.post.first, pdf*pdfmark.post.next): New macros; each will
+ be aliased as required to ...
+ (pdf*pdfmark.post): ... this, and invoked by ...
+ (pdf*pdfmark.dispatch): ... this new macro; use it to define ...
+ (pdf:composed): ... this dynamically constructed macro; use ...
+ (pdf*end): ... this new macro to terminate it.
+
+2006-03-09 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Incorporate portability recommendations by Ralf Wildenhues
+ <ralf.wildenhues@gmx.de>
+
+ * pdfroff.sh: Avoid unsafe quoting in variable substitutions of
+ the form "${VAR+"set"}"; remove outer quotes everywhere; prefix
+ with `x' on each side of comparisons.
+ ($NULLCMD): Define when `$ZSH_VERSION' is set, i.e. when host
+ has `/bin/sh -> zsh'; also...
+ (emulate sh): Invoke, for this case.
+
+ Enhancement/bug fix requested by Werner LEMBERG <wl@gnu.org>
+
+ * pdfroff.sh (--help): Direct output to `stdout', not `stderr'.
+ (--keep-temporary-files): New option; implement it.
+
+ * pdfroff.man (OPTIONS): Document `--keep-temporary-files' option.
+ (FILES): Note names and purpose of files it affects.
+
+ * Makefile.sub (PDFROFF): Add `--keep-temporary-files' option;
+ retain them in `GROFF_TMPDIR=.'.
+ (CLEANADD): Include temporary files matching `pdf[0-9]*'.
+
+2006-03-08 Werner LEMBERG <wl@gnu.org>
+
+ * pdfmark.ms: Update URL for Adobe Reference Manual.
+
+2006-02-26 Claudio Fontana <claudio@gnu.org>
+
+ * Makefile.sub: Add DESTDIR to install and uninstall targets
+ to support staged installations.
+
+2006-02-25 Werner LEMBERG <wl@gnu.org>
+
+ * pdfmark.ms: Correct typo; reported by Thomas Klausner.
+
+2006-02-24 Werner LEMBERG <wl@gnu.org>
+
+ * pdfmark.ms, pdfroff.sh: Replace legal/illegal with valid/invalid.
+
+2005-06-22 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ pdfroff.sh portability enhancement.
+
+ * pdfroff.sh (ARGLIST): Variable removed.
+ (GROFF_STYLE): Use it for all groff invocations.
+ (INPUT_FILES): Pass to all groff invocations, instead of ARGLIST.
+ (CS_MACRO, CE_MACRO): Initialize independently.
+ (CS_FILTER): Simplify quoting; it used to confuse some shells.
+ (Source): CVS keyword removed; replaced by...
+ (RCSfile, Revision): these.
+
+2005-06-17 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * pdfroff.sh (MATCH): Correct quoting.
+ (Source): Add terminating `$' on CVS keyword.
+
+2005-06-17 Zvezdan Petkovic <zpetkovic@acm.org>
+
+ * Makefile.sub: (RM): Define as `rm -f', for `make' programs
+ which don't predefine it.
+
+2005-06-16 Bernd Warken <groff-bernd.warken-72@web.de>
+
+ * pdfroff.sh (NULLDEV): Correct misspelled instance of NULDEV.
+
+2005-05-28 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile.sub (.ms.pdf): Use `--stylesheet', not `--style'.
+
+2005-05-26 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile.sub, pdfmark.tmac, pdfroff.sh, spdf.tmac: Update postal
+ address for Free Software Foundation.
+
+2005-05-17 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Improve portability of `pdfroff' shell script.
+
+ * pdfroff.sh: Add space in shebang, conforming to portability
+ guidelines in `autoconf' docs.
+ (searchpath): New shell function; use it instead of `type' command
+ to locate prerequisite helper programs.
+
+ * pdfroff.man: Document influence of `OSTYPE' and `PATH_SEPARATOR'
+ environment variables.
+
+ * Makefile.sub (pdfroff): Make it depend on SH_DEPS_SED_SCRIPT,
+ from arch/misc/shdeps.sh; use it to customize PATH_SEPARATOR
+ initialization code for `searchpath' function in pdfroff.sh.
+
+2005-05-16 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Interim documentation update.
+
+ * pdfmark.ms (GROFF-WEBSITE): New string; use it in references and
+ examples.
+ (Section 2.5): Add definitions of D and Z operators, for use with
+ pdfhref macro.
+ (Section 2.5.4): Complete description of pdfhref macro usage for
+ `Linking to Internet Resources'; provide examples.
+
+2005-05-14 Nick Stoughton <nick@usenix.org>
+
+ * pdfmark.tmac (LB): Renamed to ...
+ (PDFLB): This to avoid conflicts with mm's LB macro.
+
+2005-05-02 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Handle parsing anomalies in Cygwin's `ash', and similar, shells.
+
+ * pdfroff.sh ($CAT, $GREP, $SED, $GROFF, $DIFF): Avoid interpreting
+ misdirected error messages, which `type' sends to `stdout' in some
+ shells, as a successful program file match.
+
+ ($AWK, $GS): Likewise; also ensure that multiple choice match
+ prototypes are eval'ed as such, in case token splitting occurs
+ before variable expansion.
+
+2005-04-24 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Add support for folded outlines in PDF documents.
+
+ * pdfmark.tmac (PDFOUTLINE.FOLDLEVEL): New register.
+ (pdf:bm.emit): Use it.
+
+ * pdfmark.ms: Document it.
+
+2005-03-25 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile.in: Removed.
+
+2005-03-24 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile: Renamed to...
+ * Makefile.in: This.
+
+2005-03-22 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * pdfroff.sh: Eliminate invalid program reference to $AWK, when
+ invoked with `--no-reference-dictionary' option.
+
+2005-03-02 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ * contrib/pdfmark/Makefile.sub (install_data): Use $(INSTALL_SCRIPT)
+ to install `pdfroff'.
+ * contrib/pdfmark/pdfroff.man (opte): New macro.
+ Use it to remove spurious equal signs from SYNOPSIS.
+
+2005-02-28 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ Provide `pdfroff' shell script, and manpage to document it;
+ runs multiple groff passes, to format PDF documents.
+
+ * pdfroff.sh: New shell script template;
+ * pdfroff.man: New man page to document it.
+
+ Integrate `pdfmark' into normal groff build system;
+ install macro `pdfmark' packages, build and install `pdfroff',
+ and PDF format documentation.
+
+ * Makefile.sub: Rewritten.
+ * pdfmark.tmac: Modified.
+ (pdfhref): New macro operators, `D' and `Z'.
+ (pdf*href-D, pdf*href-Z): New macros: implement them.
+ (pdf*href.mark.resolve, pdf*href.mark.emit, pdf*href.mark.flush):
+ Modified macro algorithm, to eliminate inconsistencies between
+ `grohtml' representations of `opminy' from differing groff versions.
+ (pdf*href.mark, pdf*href.mark.release, pdf*href.mark.close):
+ deleted (redundant macros).
+ (PDFHREF.LEADING): Default value changed (was 2.5p; now -1.0p).
+ Global comment updates.
+
+ * TODO: Updated.
+
+2004-12-10 Werner LEMBERG <wl@gnu.org>
+
+ * TODO: Updated.
+
+2004-12-08 Keith Marshall <keith.d.marshall@ntlworld.com>
+
+ First import of pdfmark files.
+
+________________________________________________________________________
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+Local Variables:
+fill-column: 72
+mode: change-log
+version-control: never
+End:
+vim:set autoindent textwidth=72:
diff --git a/contrib/pdfmark/PROBLEMS b/contrib/pdfmark/PROBLEMS
new file mode 100644
index 0000000..d31be4a
--- /dev/null
+++ b/contrib/pdfmark/PROBLEMS
@@ -0,0 +1,32 @@
+ -*- text -*-
+ Copyright (C) 2004-2020 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+Known PROBLEMS in pdfmark.tmac
+==============================
+
+Bounding boxes for link hot-spots which straddle a page break
+are not computed correctly.
+
+*** Resolved: 06-Dec-2004 (KDM): pdfmark.tmac.patch-20041206 ***
+
+--------
+
+Documents including a large number of cross references may fail,
+with an 'input stack limit exceeded' error.
+
+*** Resolved: 27-Sep-2004 (KDM): pdfmark.tmac.patch-20040927 ***
+
+--------
+
+Links placed in diversions, such as footnotes or floating keeps,
+resolve to the wrong destinations; (mapping order becomes confused
+between links in diversion, and links in running text following
+the diversion).
+
+--------
+
+Annotations placed by .pdfnote cannot exceed about 200 chars.
diff --git a/contrib/pdfmark/README b/contrib/pdfmark/README
new file mode 100644
index 0000000..7440ffd
--- /dev/null
+++ b/contrib/pdfmark/README
@@ -0,0 +1,57 @@
+ -*- text -*-
+ Copyright (C) 2004-2020 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+README for pdfmark.tmac
+=======================
+
+Copyright (C) 2004, 2009 Free Software Foundation Inc.
+Contributed by Keith Marshall (keith.d.marshall@ntlworld.com)
+
+This is free software. See file COPYING, for copying permissions,
+and warranty disclaimer.
+
+This is a preview release of a proposed pdfmark.tmac macro package,
+for use with GNU troff (groff). It is not yet complete, and should
+be considered as an alpha release; there are a few problems to be
+resolved (see file PROBLEMS).
+
+Partial documentation is provided, in groff-ms format. To convert
+this to PDF format, you will require a working groff installation,
+a working ghostscript installation, with the gs command in your PATH,
+and a GNU-compatible make. The tarball should be unpacked in the
+top directory of your groff source tree, then:
+
+ cd <groff-current>/contrib/pdfmark
+ make pdfmark
+
+where <groff-current> is the top directory of your current groff
+source tree.
+
+Included in this package, are:
+
+ pdfmark.tmac -- the core pdfmark macro set
+ spdf.tmac -- a rudimentary set of bindings for ms macros
+ pdfmark.ms -- preliminary documentation
+ cover.ms -- a template for the documentation cover sheet
+ gnu.eps -- the groff logo, copied from the groff distribution
+ Makefile -- makefile, for formatting the documentation
+ README -- this file
+ PROBLEMS -- a list of known problems
+ TODO -- a list of planned features, not yet implemented
+
+To make the pdfmark macros generally usable, copy pdfmark.tmac to the
+'site-tmac' directory appropriate to your groff installation; (ms users
+may also wish to copy spdf.tmac). The macros may then be accessed, by
+including the '-mpdfmark' option on the groff command line; (for ms
+users, '-mspdf' is equivalent to '-ms -mpdfmark', with some extra
+macros 'thrown in').
+
+Comments, and bug reports are welcomed. Please post to the groff
+mailing list, groff@gnu.org; (you must be subscribed to this list to
+post mails). To subscribe, visit
+
+ http://lists.gnu.org/mailman/listinfo/groff
diff --git a/contrib/pdfmark/TODO b/contrib/pdfmark/TODO
new file mode 100644
index 0000000..219b60e
--- /dev/null
+++ b/contrib/pdfmark/TODO
@@ -0,0 +1,60 @@
+ -*- text -*-
+ Copyright 2004-2020 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+TODO items for pdfmark.tmac
+===========================
+
+Add copyright information to PDF documentation.
+
+--------
+
+Add acknowledgements and trade mark ownership notifications
+to PDF documentation.
+
+--------
+
+Provide documentation in man page and texinfo formats.
+
+--------
+
+Add comments in spdf.tmac, to clarify its operation.
+Also add commentary in pdfmark.tmac, to clarify operation of
+recent changes.
+
+--------
+
+Make Makefile generic, so 'configure' can resolve target
+system dependencies.
+
+* Comment added 2005-02-26 by Keith Marshall <keith.d.marshall@ntlworld.com>
+
+If this refers to contrib/pdfmark/Makefile, then it is addressed by the new
+'pdfroff' script; the original Makefile may be considered redundant. Local
+system dependencies are resolved by 'configure', and applied to 'pdfroff',
+when it is generated from 'pdfroff.sh'.
+
+--------
+
+Improve Makefile.sub, to integrate pdfmark.tmac installation
+into a regular groff build. Add it to groff's Makefile.in.
+
+* Comment added 2005-02-26 by Keith Marshall <keith.d.marshall@ntlworld.com>
+
+Completed.
+
+--------
+
+Provide a 'pdfmark' script (or call it 'groff2pdf'?) which
+actually converts a groff input file to pdf, and which
+takes care of the necessary intermediate steps to handle
+PDF marks.
+
+* Comment added 2005-02-26 by Keith Marshall <keith.d.marshall@ntlworld.com>
+
+This facility now provided by 'pdfroff' script; documented in 'pdfroff.man'.
+Man page still requires an additional section, to describe use of 'stylesheet'
+feature. Script also requires documentation in PDF and texinfo formats.
diff --git a/contrib/pdfmark/cover.ms b/contrib/pdfmark/cover.ms
new file mode 100644
index 0000000..b647a29
--- /dev/null
+++ b/contrib/pdfmark/cover.ms
@@ -0,0 +1,70 @@
+.\" Copyright (C) 2004-2020 Free Software Foundation, Inc.
+.\"
+.\" Copying and distribution of this file, with or without modification,
+.\" are permitted in any medium without royalty provided the copyright
+.\" notice and this notice are preserved.
+.\"
+.am pspic*error-hook
+. ab \\n[.F]:\\n[.c]: fatal error: PSPIC failed to include '\\$1'
+..
+.de CS
+.if !rCO .nr CO 0
+.if !rTL .nr TL 0
+.\".nr PO*SAVED \\n[PO]
+.nr LL*SAVED \\n[LL]
+.nr HM*SAVED \\n[HM]
+.nr HM 0
+.nr PO (2.1c+\\n[CO]u)
+.nr LL 17.1c
+\&
+.nr PS*SAVED \\n[PS]
+.nr VS*SAVED \\n[VS]
+.nr PS 24
+.nr VS 30
+.CD
+.fam T
+.sp |(5.9c+\\n[TL]u)
+.als AU au@first
+..
+.de au@first
+.sp 1.5v
+.als AU au@next
+.AU \\$@
+..
+.de au@next
+.DE
+.nr PS 18
+.nr VS 18
+.CD
+.sp 0.5v
+\\$*
+..
+.de AI
+\H'-4z'\\$*\H'0'
+..
+.de CE
+.DE
+.sp |17.5c
+.PSPIC gnu.eps
+.nr PS 19
+.CD
+.fam H
+.tkf HR 10z 2p 20z 4p
+\H'-4z'A GNU MANUAL\H'0'
+.DE
+.\".nr PO \\n[PO*SAVED]
+.nr LL \\n[LL*SAVED]
+.nr PS \\n[PS*SAVED]
+.nr VS \\n[VS*SAVED]
+.nr HM \\n[HM*SAVED]
+.\".rr PO*SAVED
+.rr LL*SAVED
+.rr PS*SAVED
+.rr VS*SAVED
+.rr HM*SAVED
+.fam
+..
+.\" Local Variables:
+.\" mode: nroff
+.\" End:
+.\" vim: filetype=groff:
diff --git a/contrib/pdfmark/pdfmark.am b/contrib/pdfmark/pdfmark.am
new file mode 100644
index 0000000..15eec8c
--- /dev/null
+++ b/contrib/pdfmark/pdfmark.am
@@ -0,0 +1,99 @@
+# Copyright (C) 2005-2021 Free Software Foundation, Inc.
+# Written by Keith Marshall (keith.d.marshall@ntlworld.com)
+# Automake migration by Bertrand Garrigues
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+pdfmark_srcdir = $(top_srcdir)/contrib/pdfmark
+pdfmark_builddir = $(top_builddir)/contrib/pdfmark
+
+man1_MANS += contrib/pdfmark/pdfroff.1
+
+bin_SCRIPTS += pdfroff
+
+# Files installed in $(tmacdir)
+TMACFILES = \
+ contrib/pdfmark/pdfmark.tmac \
+ contrib/pdfmark/sanitize.tmac \
+ contrib/pdfmark/spdf.tmac
+pdfmarktmacdir = $(tmacdir)
+dist_pdfmarktmac_DATA = $(TMACFILES)
+
+# Files installed in $(pdfdocdir)
+PDFDOCFILES = \
+ contrib/pdfmark/pdfmark.pdf
+if USE_PDFROFF
+pdfmarkpdfdocdir = $(pdfdocdir)
+nodist_pdfmarkpdfdoc_DATA = $(PDFDOCFILES)
+MOSTLYCLEANFILES += $(PDFDOCFILES)
+else
+EXTRA_DIST += $(PDFDOCFILES)
+endif
+
+EXTRA_DIST += \
+ contrib/pdfmark/cover.ms \
+ contrib/pdfmark/pdfmark.ms \
+ contrib/pdfmark/ChangeLog \
+ contrib/pdfmark/README \
+ contrib/pdfmark/PROBLEMS \
+ contrib/pdfmark/TODO \
+ contrib/pdfmark/pdfroff.1.man \
+ contrib/pdfmark/pdfroff.sh
+
+PDFROFF=\
+ GROFF_TMPDIR=. \
+ GROFF_COMMAND_PREFIX= \
+ GROFF_BIN_DIR="$(GROFF_BIN_DIR)" \
+ GROFF_BIN_PATH="$(GROFF_BIN_PATH)" \
+ ./pdfroff \
+ $(FFLAG) $(MFLAG) -dpaper=$(PAGE) -P-p$(PAGE) -M$(pdfmark_srcdir)
+
+contrib/pdfmark/pdfmark.pdf: contrib/pdfmark/pdfmark.ms
+ $(GROFF_V)$(MKDIR_P) `dirname $@` \
+ && $(PDFROFF) -I $(doc_builddir) -I $(doc_srcdir) -mspdf \
+ --stylesheet=$(pdfmark_srcdir)/cover.ms \
+ $(top_srcdir)/contrib/pdfmark/pdfmark.ms >$@
+
+# The pdf files use the local script to generate.
+$(PDFDOCFILES): pdfroff groff troff gropdf
+$(PDFDOCFILES): $(dist_devpsfont_DATA) $(nodist_devpsfont_DATA) \
+ $(DOC_GNU_EPS)
+
+pdfroff: contrib/pdfmark/pdfroff.sh $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)sed -f $(SH_DEPS_SED_SCRIPT) \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e "s|[@]GROFF_AWK_INTERPRETERS[@]|$(ALT_AWK_PROGS)|" \
+ -e "s|[@]GROFF_GHOSTSCRIPT_INTERPRETERS[@]|$(ALT_GHOSTSCRIPT_PROGS)|" \
+ -e "s|[@]GROFF_BIN_DIR[@]|$(bindir)|" $(pdfmark_srcdir)/pdfroff.sh \
+ >$@ \
+ && chmod +x $@
+
+mostlyclean-local: mostlyclean_pdfmark
+mostlyclean_pdfmark:
+ rm -rf $(top_builddir)/pdfroff-*
+
+uninstall_groffdirs: uninstall-pdfmark-hook
+uninstall-pdfmark-hook:
+if USE_PDFROFF
+ -rmdir $(DESTDIR)$(pdfmarkpdfdocdir)
+endif
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/contrib/pdfmark/pdfmark.ms b/contrib/pdfmark/pdfmark.ms
new file mode 100644
index 0000000..0d7d28c
--- /dev/null
+++ b/contrib/pdfmark/pdfmark.ms
@@ -0,0 +1,2831 @@
+.ig
+pdfmark.ms
+
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2021 Free Software Foundation, Inc.
+written by Keith Marshall <keith.d.marshall@ntlworld.com>
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, 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.
+..
+.
+.CS
+Portable Document Format
+Publishing with GNU Troff
+.AU Keith Marshall
+.AI <keith.d.marshall@ntlworld.com>
+.CE
+.
+.\" Specify the Internet address for the groff web site.
+.\"
+.ds GROFF-WEBSITE http://www.gnu.org/software/groff
+.
+.\" Set the PDF default document view attribute, to ensure that the document
+.\" outline is visible, each time the document is opened in Acrobat Reader.
+.\"
+.pdfview /PageMode /UseOutlines
+.\"
+.\" Initialize the outline view to show only three heading levels,
+.\" with additional subordinate level headings folded.
+.\"
+.nr PDFOUTLINE.FOLDLEVEL 3
+.
+.\" Add document identification meta-data
+.\"
+.pdfinfo /Title Portable Document Format Publishing with GNU Troff
+.pdfinfo /Author Keith Marshall
+.pdfinfo /Subject Tips and Techniques for Exploiting PDF Features with GNU Troff
+.pdfinfo /Keywords groff troff PDF pdfmark
+.
+.\" Set the default cross reference format to indicate section numbers,
+.\" rather than page numbers, when we insert a reference pointer.
+.\"
+.ds PDFHREF.INFO section \\*[SN-NO-DOT] \\$*
+.
+.\" Define a macro, to print reference links WITHOUT the usual "see" prefix.
+.\"
+.de XR-NO-PREFIX
+.rn PDFHREF.PREFIX xx
+.ds PDFHREF.PREFIX
+.XR \\$@
+.rn xx PDFHREF.PREFIX
+..
+.
+.\" Define a string, to insert a Registered Trade Mark symbol as
+.\" a superscript...
+.\"
+.ds rg \*{\(rg\*}
+.\"
+.\" ...and use it to define strings, representing frequently used
+.\" registered trade marks.
+.\"
+.ds Adobe "Adobe\Z'\\$1'\*(rg\"
+.ds Acrobat "Acrobat\Z'\\$1'\*(rg\"
+.ds Distiller "Distiller\Z'\\$1'\*(rg\"
+.ds PostScript "PostScript\Z'\\$1'\*(rg\"
+.\"
+.ds Microsoft "Microsoft\Z'\\$1'\*(rg\"
+.
+.\" Establish the page layout.
+.\"
+.nr PO 2.5c
+.nr LL 17.0c
+.nr LT 17.0c
+.nr DI 5n
+.nr HY 0
+.
+.\" Within the table of contents, the width of the right-hand margin,
+.\" in which space is reserved for the display of page numbers, and the
+.\" appearance of the leaders which precede it, are controlled by:-
+.\"
+.char \[TC-LEADER] \h'0.8n'.
+.nr TC-MARGIN \w'00000'
+.
+.\" Generate headers in larger point sizes, for NH levels < 4,
+.\" with point size increasing by 1.5p, for each lesser NH level.
+.\"
+.nr GROWPS 4
+.nr PSINCR 1.5p
+.
+.
+.\" Implement an interface with the FS macro (from s.tmac) to facilitate
+.\" placement of footnote reference marks, with each serving as an active
+.\" pdfhref link to the associated footnote itself.
+.\"
+.de pdf:fn.mark nr
+.\" Macro to replace original duty performed by "\**"; must be invoked
+.\" at point of footnote mark placement, e.g. by FS, BEFORE recording of
+.\" the associated text within the footnote diversion is commenced.
+.\"
+.ie \\n[.$] \{\
+. pdfhref L -D pdf:fn\\$1 -- \\$2
+. pdfhref M -N pdf:fn\\$1r
+. \}
+.\"
+.\" s.tmac does not publicly expose its auto-incrementing footnote index;
+.\" to avoid a dependency on an undocumented internal feature, we create
+.\" our own counter, while keeping the internal index synchronized, by
+.\" interpolating a renamed "\**", each time we increment our counter.
+.\"
+.el .\\$0 \\n+[pdf:fn.index.count] \\*[pdf:fn.index]
+.nr pdf:fn.index.count 0 1
+.rn * pdf:fn.index
+.ds * \c
+.
+.\" For versions of s.tmac which support the FS-MARK callback hook, it
+.\" is sufficient for us to answer the callback request.
+.\"
+.\" FIXME: in time, we may be able to unconditionally assume that this
+.\" callback hook will be supported...
+.\"
+.ie d FS-MARK .als FS-MARK pdf:fn.mark
+.el \{\
+.\" ...but in the interim, we may need to redefine s.tmac's FS macro,
+.\" (actually the @FS internal macro, rather than FS itself), to gain
+.\" an effect equivalent to taking control of FS-MARK, to achieve the
+.\" placement of a footnote mark as an active pdfhref link.
+.\"
+.rn @FS pdf:fn.record
+.de @FS
+.pdf:fn.mark
+.pdf:fn.record
+..
+.\}
+.\" Override s.tmac's (undocumented) footnote output hook; this emulates
+.\" the default output style for \n[FF] == 3 footnotes, with the footnote
+.\" number formatted as a pdfhref link back to the position at which the
+.\" footnote marker appears, within the document text.
+.\"
+.de FP
+.LP
+.nr pdf:fn.tag.width (u;2*\\n[FI])
+.ds pdf:fn.tag \s'-1.5p'\\$1.\s'+1.5p'
+.pdfhref M -N pdf:fn\\$1
+.in +\\n[pdf:fn.tag.width]u
+.ti -\\n[pdf:fn.tag.width]u
+.nr pdf:fn.tag.width -\\w'\\*[pdf:fn.tag]'u
+.pdfhref L -D pdf:fn\\$1r -A \\h'\\n[pdf:fn.tag.width]u'\c -- \\*[pdf:fn.tag]
+..
+.de pdfhref-nobreak
+.\" FIXME: I've only noticed this anomaly when planting pdfhref links
+.\" within footnotes; if the start of the link text is placed near the
+.\" line length limit, and all of it is moved to the start of the next
+.\" line, the "hot-spot" region is computed to be one line higher than
+.\" it should be; ending the preceding input line with "\c", and then
+.\" invoking pdfhref via this wrapper, works around this issue.
+.\"
+.ie \\n[.l]-\\n[.i]-\\n[.k]-\\w'\\$\\n[.$]' \&
+.el \p
+.pdfhref \\$*
+..
+.
+.\" Define a local macro to facilitate choice of style for emphasis;
+.\" by default, make it equivalent to the ms standard "I" macro.
+.\"
+.de EM
+.\".I "\s'+0.3'\\$1\s0" "\\$2" "\\$3"
+.I \\$@
+..
+.\" Also, define variations on the ms standard "CW" macro, to add
+.\" bold, italic, and both styles to constant width text; note that
+.\" each of these accept two additional arguments, in comparison to
+.\" standard "CW", such that \$1 specifies the text which is to be
+.\" styled, \$2 and \$3 specify inner after/before bracketting, to
+.\" set as regular "CW" text, while \$4 and \$5 become equivalent
+.\" to \$2 and \$3 of standard "CW", acting as outer bracketting.
+.\"
+.de CWB
+\\$5\fC\\$3\fP\f(CB\\$1\fP\fC\\$2\fP\\$4
+..
+.de CWI
+\\$5\fC\\$3\fP\f(CI\\$1\fP\fC\\$2\fP\\$4
+..
+.de CWBI
+\\$5\fC\\$3\fP\f[CBI]\\$1\fP\fC\\$2\fP\\$4
+..
+.\" Finally, augment this group with a variant string, which may be
+.\" used to set constant width tags on "IP" paragraphs, with \$1 set
+.\" as if by "CWB", followed by an optional suffix set as if by "CWBI",
+.\" and with the suffix bracketted by \$3 after and \$4 before, each
+.\" set in the regular "CW" style.
+.\"
+.ds = \f(CB\\$1\f(CR\\$4\f[CBI]\\$2\f(CR\\$3
+.
+.\" Additionally, add a cross-reference convenience macro, emulating
+.\" the style of the "ms" font change macros...
+.\"
+.\" .XR <dest-name> [<affixed> [<prefix>]]
+.\"
+.\" ...such that, when invoked with one, two, or three arguments, this
+.\" expands to the equivalent of:
+.\"
+.\" .pdfhref L -D <dest-name> [-A <affixed> [-P <prefix>]]
+.\"
+.\" to place a pdfhref reference link, to a named destination, within
+.\" the same document, using the reference text which is predefined in
+.\" the reference dictionary entry associated with the destination.
+.\"
+.de XR
+.if \\n(.$ \{\
+. if \\n[OPMODE] \{\
+. ds xr!argv -D "\\$1"
+. if \\n(.$>1 .as xr!argv " -A "\\$2"
+. if \\n(.$>2 .as xr!argv " -P "\\$3"
+. pdfhref L \\*[xr!argv]
+. rm xr!argv
+. \}
+. \}
+..
+.
+.NH 1
+.\" Conventionally, in "ms", NH precedes text which is to be set as a
+.\" numbered section heading, but it makes no provision for automatic
+.\" reference to that heading in a table of contents, or (in the case
+.\" of PDF document production) in a document outline. Both of these
+.\" limitations may be mitigated, by using the XN macro, (provided by
+.\" spdf.tmac), which sets its arguments, both as text to be included
+.\" in the section heading, as printed, and as an assocated document
+.\" outline reference; it will also make this same text available to
+.\" the user-specified callback macro, XH-UPDATE-TOC, whereby it may
+.\" be used, e.g. to construct a table of contents entry.
+.\"
+.\" Within the table of contents, structural layout will be achieved,
+.\" under the direction of the following spacing control constants:
+.\"
+.ds XNVS1 0.50v \" leading for top level
+.ds XNVS2 0.15v \" leading at nesting level increment
+.ds XNVS3 0.30v \" leading following nested group
+.\"
+.\" Note that one TOC related callback hook is shared by both XH and
+.\" XN; its is called XH-UPDATE-TOC, regardless of whether called by
+.\" XH or by XN; when called by XN, it is invoked with arguments:
+.\"
+.\" .XH-UPDATE-TOC <outline-level> <section-number> <text> ...
+.\"
+.de XH-UPDATE-TOC
+.\" This implementation of XH-UPDATE-TOC utilizes the rudimentary ms
+.\" mechanism for formatting a table of contents, using XS and XE to
+.\" bracket individual entries.
+. XS
+. \" A local register, tc*hl, is used to track the outline level
+. \" of each TOC entry, as it is added; it is not defined, until
+. \" the first entry is recorded...
+. \"
+. if r tc*hl \{\
+. \" ...after which, we use it to establish indentation,
+. \" to reflect changes in outline level.
+. \"
+. ie \\$1>1 \{\
+. \" When at any outline level greater than one,
+. \" any level increment will be offset by XNVS2
+. \" units of vertical space...
+. \"
+. ie \\$1>\\n[tc*hl] .sp \\*[XNVS2]
+.
+. \" ...whereas any decrement will be offset by
+. \" XNVS3 units.
+. \"
+. el .if \\n[tc*hl]>\\$1 .sp \\*[XNVS3]
+. \}
+.
+. \" ...but every top-level entry, after the first, is
+. \" offset by XNVS1 units.
+. \"
+. el .sp \\*[XNVS1]
+. \}
+.
+. \" \$1 becomes the effective outline level for the current table
+. \" of contents entry, but we must ensure that it is one or more.
+. \"
+. ie \\$1 .nr tc*hl \\$1
+. el .nr tc*hl 1
+.
+. \" The current outline level determines the indentation at which
+. \" we place the section number reference...
+. \"
+. nop \h'\\n[tc*hl]-1m'\\$2\c
+.
+. \" ...after which we discard \$1 and \$2, allowing us to append
+. \" all remaining arguments, ensuring that there is at least 0.5n
+. \" of following space, before the first leader dot.
+. \"
+. shift 2
+. nop \h'1.5n'\\$*\h'0.5n'
+. XE
+..
+.XN Introduction
+.\"
+.\" If using an old s.tmac, without the SN-NO-DOT extension, ensure
+.\" that we get SOMETHING in section number references.
+.\"
+.if !d SN-NO-DOT .als SN-NO-DOT SN
+.LP
+It might appear that it is a fairly simple matter to
+produce documents in \*[Adobe]\~\(lqPortable\~Document\~Format\(rq,
+commonly known as PDF, using
+.CW groff ) GNU\~Troff\~(
+as the document formatter.
+Indeed,
+.CW groff 's
+default output format is the native \*[Adobe]\~\*[PostScript] format,
+which PDF producers such as \*[Adobe] \*[Acrobat] \*[Distiller ,]
+or GhostScript, expect as their input format.
+Thus, the PDF production process would seem to entail simply
+formatting the document source with
+.CW groff ,
+to produce a \*[PostScript] version of the document,
+which can subsequently be processed by \*[Acrobat] \*[Distiller]
+or GhostScript, to generate the final PDF document.
+.LP
+For many PDF production requirements,
+the production cycle described above may be sufficient.
+However, this is a limited PDF production method,
+in which the resultant PDF document represents no more than
+an on screen image of the printed form of the document, if
+.CW groff 's
+\*[PostScript] output were printed directly.
+.LP
+The Portable Document Format provides a number of features,
+which significantly enhance the experience of reading a document on screen,
+but which are of little or no value to a document which is merely printed.
+It
+.EM is
+possible to exploit these PDF features, which are described in the \*[Adobe]
+.de pdfmark-manual pdfmark-manual
+.\" This is an example of a resource reference specified by URI ...
+.\" We may need to refer often to the Adobe pdfmark Reference Manual,
+.\" so we create the internet link definition using a macro, to make
+.\" it reusable.
+.\"
+.\" Note also, that we protect the description of the reference by
+.\" preceding it with "--", to avoid "invalid character in name" type
+.\" error messages from groff (caused by the use of "\~").
+.\"
+.pdfhref W -D https://www.adobe.com/go/acrobatsdk_pdfmark \
+ -P \(lq -A \(rq\\$1 -- pdfmark\~Reference\~Manual
+.pdfmark-manual ,
+with some refinement of the simple PDF production method, provided
+appropriate \(lqfeature implementing\(rq instructions can be embedded into
+.CW groff 's
+\*[PostScript] rendering of the document.
+This, of course, implies that the original document source, which
+.CW groff
+will process to generate the \*[PostScript] description of the document,
+must include appropriate markup to exploit the desired PDF features.
+It is this preparation of the
+.CW groff
+document source to exploit a number of these features,
+which provides the principal focus of this document.
+.LP
+The markup techniques to be described have been utilized in the production of
+the PDF version of this document itself.
+This has been formatted using
+.CW groff 's
+.CW ms
+macro package;
+thus, usage examples may be found in the document source file,
+.CW \n(.F ,
+to which comments have been added,
+to help identify appropriate markup examples for implementing PDF features,
+such as:\(en
+.QS
+.IP \(bu
+Selecting a default document view, which defines how the document will appear
+when opened in the reader application; for example, when this document is
+opened in \*[Acrobat]\~Reader, it should display the top of the cover sheet,
+in the document view pane, while a document outline should appear to the left,
+in the \(lqBookmarks\(rq pane.
+.IP \(bu
+Adding document identification \(lqmeta\(hydata\(rq,
+which can be accessed, in \*[Acrobat]\~Reader,
+by inspecting the \(lqFile\^/\^Document\~Properties\^/\^Summary\(rq.
+.IP \(bu
+Creating a document outline, which will be displayed in the \(lqBookmarks\(rq
+pane of \*[Acrobat]\~Reader, such that readers may quickly navigate to any
+section of the document, simply by clicking on the associated heading
+in the outline view.
+.IP \(bu
+Embedding active links in the body of the document, such that readers may
+quickly navigate to related material at another location within the same
+document, or in another PDF document, or even to a related Internet resource,
+specified by its URI.
+.IP \(bu
+Adding annotations, in the form of \(lqsticky notes\(rq, at strategic
+points within the PDF document.
+.QE
+.LP
+All of the techniques described have been tested on
+.EM both
+GNU/Linux, and on \*[Microsoft] Windows\(tm2000 operating platforms, using
+.CW groff
+.CW 1.19.1 ,\**
+.FS
+Later versions should, and some earlier versions may, be equally suitable.
+See\c
+.pdfhref-nobreak W \*[GROFF-WEBSITE]
+for information and availability of the latest version.
+.FE
+in association with
+.CW AFPL
+.CW GhostScript
+.CW 8.14 .\**
+.FS
+Again, other versions may be suitable.
+See\c
+.pdfhref-nobreak W http://ghostscript.com
+for information and availability.
+.FE
+\&
+Other tools employed, which should be readily available on
+.EM any
+Unix\(tm
+or GNU/Linux system, are
+.CW sed ,
+.CW awk
+and
+.CW make ,
+together with an appropriate text editor, for creating and marking up the
+.CW groff
+input files.
+These additional utilities are not provided, as standard,
+on the \*[Microsoft] Windows\(tm platform,
+but several third party implementations are available.
+Some worth considering include the MKS\*(rg\~Toolkit,\**
+.FS
+A commercial offering; see\c
+.pdfhref-nobreak W http://mkssoftware.com/products/tk/default.asp
+for information.
+.FE
+Cygwin,\**
+.FS
+A
+.EM free
+but comprehensive
+.SM
+POSIX
+.LG
+emulation environment and
+Unix\(tm
+toolkit for \%32\(hybit \*[Microsoft] Windows\(tm platforms; see\c
+.pdfhref-nobreak W http://cygwin.com
+for information and download.
+.FE
+or MSYS.\**
+.FS
+Another free, but minimal suite of common
+Unix\(tm
+tools for \%32\(hybit \*[Microsoft] Windows\(tm, available for download from\c
+.pdfhref-nobreak W -A ; https://mingw.osdn.io
+it
+.EM does
+include those tools listed above,
+and is the package which was actually used when performing the Windows\(tm2000
+platform tests referred to in the text.
+.FE
+\&
+This list is by no means exhaustive, and should in no way be construed as an
+endorsement of any of these packages, nor to imply that other similar packages,
+which may be available, are in any way inferior to them.
+.bp
+.
+.NH 1
+.\" We may wish a section heading to represent a named destination,
+.\" so that we can create a linked reference to it, from some other
+.\" part of the PDF document, (or even from another PDF document).
+.\"
+.\" Here we use the "-N" option of the "XN" macro, to create a named
+.\" PDF link destination, at the location of the heading. Notice that
+.\" we also use the "--" marker to separate the heading text from the
+.\" preceding option specification; it is not strictly necessary in
+.\" this case, but it does help to set off the heading text from the
+.\" option specification.
+.\"
+.XN -N pdf-features -- Exploiting PDF Document Features
+.LP
+To establish a consistent framework for adding PDF features, a
+.CW groff
+macro package, named
+.CW pdfmark.tmac ,
+has been provided.
+Thus, to incorporate PDF features in a document,
+the appropriate macro calls, as described below, may be placed in the
+.CW groff
+document source, which should then be processed with a
+.CW groff
+command of the form\**
+.FS
+.pdfhref M pdf-features-fn
+.nr pdf-features-fn \n[fn*text-num]
+Note that,
+if any
+.CW -T \^\c
+.CWI dev
+option is specified,
+it should be either
+.CW -T \^\c
+.CW ps ,
+or
+.CW -T \^\c
+.CW pdf ;
+any other explicit choice is unlikely to be compatible with
+.CW -m \|\|\c
+.CW pdfmark ,
+and will have an unpredictable
+(possibly erroneous)
+effect on the output.
+If no
+.CW -T \^\c
+.CWI dev
+option is specified,
+(in which case
+.CW -T \^\c
+.CW ps
+is implicitly assumed),
+or if
+.CW -T \^\c
+.CW ps
+is explicitly specified,
+then the output will be produced in \*[PostScript] format,
+and will require conversion to PDF,
+(e.g. by using GhostScript tools);
+explicit specification of
+.CW -T \^\c
+.CW pdf
+will result in direct output in PDF format,
+thus obviating the need for conversion.
+.FE
+.QP
+.fam C
+groff [-Tps\h'0.2p'|\h'0.2p'-Tpdf] [-m\F[]\|\|\FC\c
+.I name ]
+-m\F[]\|\|\FC\c
+.B pdfmark
+.I options \F[]\|\|\FC\c [-
+.I file \F[]\|\|\FC\c "...] "
+\&...
+.LP
+It may be noted that the
+.CW pdfmark
+macros have no dependencies on, and no known conflicts with,
+any other
+.CW groff
+macro package; thus, users are free to use any other macro package,
+of their choice, to format their documents, while also using the
+.CW pdfmark
+macros to add PDF features.
+.
+.NH 2
+.XN -S -N pdfmark-operator -- The \F[C]pdfmark\F[] Operator
+.LP
+All PDF features are implemented by embedding instances of the
+.B \F[C]pdfmark\F[]
+operator, as described in the \*[Adobe]
+.pdfmark-manual ,
+into
+.CW groff 's
+\*[PostScript] output stream.
+To facilitate the use of this operator, the
+.CW pdfmark
+macro package defines the primitive
+.CW pdfmark
+macro; it simply emits its argument list,
+as arguments to a
+.CW pdfmark
+operator, in the \*[PostScript] output stream.
+.LP
+.pdfhref M -N pdfmark-example
+To illustrate the use of the
+.CW pdfmark
+macro, the following is a much simplified example of how a bookmark
+may be added to a PDF document outline
+.QP
+.CW ".pdfmark \e"
+.RS 4
+.nf
+.fam C
+/Count 2 \e
+/Title (An Example of a Bookmark with Two Children) \e
+/View [/FitH \en[PDFPAGE.Y]] \e
+/OUT
+.RE
+.LP
+In general, users should rarely need to use the
+.CW pdfmark
+macro directly.
+In particular, the above example is too simple for general use; it
+.EM will
+create a bookmark, but it does
+.EM not
+address the issues of setting the proper value for the
+.CW /Count
+key, nor of computing the
+.CW PDFPAGE.Y
+value used in the
+.CW /View
+key. The
+.CW pdfmark
+macro package includes a more robust mechanism for creating bookmarks,
+.\"
+.\" Here is an example of how a local reference may be planted,
+.\" using the automatic formatting feature of the "pdfhref" macro.
+.\"
+.\" This is a forward reference to the named destination "add-outline",
+.\" which is defined below, using the "XN" wrapper macro, from the
+.\" "spdf.tmac" macro package. The automatically formatted reference
+.\" will be enclosed in parentheses, as specified by the use of
+.\" "-P" and "-A" options.
+.\"
+.pdfhref L -P ( -A ), -D add-outline
+.\"
+which addresses these issues automatically.
+Nevertheless, the
+.CW pdfmark
+macro may be useful to users wishing to implement more advanced PDF features,
+than those currently supported directly by the
+.CW pdfmark
+macro package.
+.
+.NH 2
+.XN -N docview -- Selecting an Initial Document View
+.LP
+By default,
+when a PDF document is opened,
+the first page will be displayed,
+at the default magnification set for the reader,
+and outline and thumbnail views will be hidden.
+When using a PDF reader,
+such as \*[Acrobat]\~Reader,
+which supports the
+.CW /DOCVIEW
+class of the
+.CW pdfmark
+operator,
+these default initial view settings may be overridden,
+using the
+.CW pdfview
+macro.
+For example
+.QP
+.CW ".pdfview /PageMode /UseOutlines"
+.LP
+will cause \*[Acrobat]\~Reader to open the document outline view,
+to the left of the normal page view,
+while
+.QP
+.CW ".pdfview /PageMode /UseThumbs"
+.LP
+will open the thumbnail view instead.
+.LP
+Note that the two
+.CW /PageMode
+examples, above, are mutually exclusive \(em it is not possible to have
+.EM both
+outline and thumbnail views open simultaneously.
+However, it
+.EM is
+permitted to add
+.CW /Page
+and
+.CW /View
+keys, to force the document to open at a page other than the first,
+or to change the magnification at which the document is initially displayed;
+see the
+.pdfmark-manual
+for more information.
+.LP
+It should be noted that the view controlling meta\(hydata, defined by the
+.CW pdfview
+macro, is not written immediately to the \*[PostScript] output stream,
+but is stored in an internal meta\(hydata \(lqcache\(rq,
+(simply implemented as a
+.CW groff
+diversion).
+This \(lqcached\(lq meta\(hydata must be written out later, by invoking the
+.CW pdfsync
+macro,
+.\"
+.\" Here is another example of how we may introduce a forward reference.
+.\" This time we are using the shorter notation afforded by the "XR" macro
+.\" provided by "spdf.tmac"; this example is equivalent to the native
+.\" "pdfmark.tmac" form
+.\" .pdfhref L -D pdfsync -P ( -A ).
+.\"
+.XR pdfsync ). (
+.
+.NH 2
+.XN -N docinfo -- Adding Document Identification Meta-Data
+.LP
+In addition to the
+.CW /DOCVIEW
+class of meta\(hydata described above,
+.XR docview ), (
+we may also wish to include document identification meta\(hydata,
+which belongs to the PDF
+.CW /DOCINFO
+class.
+.LP
+To do this, we use the
+.CW pdfinfo
+macro.
+As an example of how it is used,
+the identification meta\(hydata attached to this document
+was specified using a macro sequence similar to:\(en
+.DS I
+.CW
+\&.pdfinfo /Title PDF Document Publishing with GNU Troff
+\&.pdfinfo /Author Keith Marshall
+\&.pdfinfo /Subject How to Exploit PDF Features with GNU Troff
+\&.pdfinfo /Keywords groff troff PDF pdfmark
+.DE
+Notice that the
+.CW pdfinfo
+macro is repeated, once for each
+.CW /DOCINFO
+record to be placed in the document.
+In each case, the first argument is the name of the applicable
+.CW /DOCINFO
+key, which
+.EM must
+be named with an initial solidus character;
+all additional arguments are collected together,
+to define the value to be associated with the specified key.
+.LP
+As is the case with the
+.CW pdfview
+macro,
+.XR docview ), (
+the
+.CW /DOCINFO
+records specified with the
+.CW pdfinfo
+macro are not immediately written to the \*[PostScript] output stream;
+they are stored in the same meta\(hydata cache as
+.CW /DOCVIEW
+specifications, until this cache is explicitly flushed,
+by invoking the
+.CW pdfsync
+macro,
+.XR pdfsync ). (
+.
+.NH 2
+.XN -N add-outline -- Creating a Document Outline
+.LP
+A PDF document outline comprises a table of references,
+to \(lqbookmarked\(rq locations within the document.
+When the document is viewed in an \(lqoutline\~aware\(rq PDF document reader,
+such as \*[Adobe] \*[Acrobat] Reader,
+this table of \(lqbookmarks\(rq may be displayed in a document outline pane,
+or \(lqBookmarks\(rq pane, to the left of the main document view.
+Individual references in the outline view may then be selected,
+by clicking with the mouse,
+to jump directly to the associated marked location in the document view.
+.LP
+The document outline may be considered as a collection of \(lqhypertext\(rq
+references to \(lqbookmarked\(rq locations within the document.
+The
+.CW pdfmark
+macro package provides a single generalized macro,
+.CW pdfhref ,
+for creating and linking to \(lqhypertext\(rq reference marks.
+This macro will be described more comprehensively in a later section,
+.XR pdfhref ); (
+the description here is restricted to its use for defining document outline entries.
+.
+.NH 3
+.XN -N basic-outline -- A Basic Document Outline
+.LP
+In its most basic form, the document outline comprises a structured list of headings,
+each associated with a marked location, or \(lqbookmark\(rq, in the document text,
+and a specification for how that marked location should be displayed,
+when this bookmark is selected.
+.LP
+To create a PDF bookmark, the
+.CW pdfhref
+macro is used,
+at the point in the document where the bookmark is to be placed,
+in the form
+.QP
+.fam C
+.B ".pdfhref O"
+.I level > <
+.I "descriptive text ..."
+.LP
+in which the reference class
+.CWB O \& \& \(rq \(lq
+stipulates that this is an outline reference.
+.LP
+Alternatively, for those users who may prefer to think of a document outline
+simply as a collection of bookmarks, the
+.CW pdfbookmark
+macro is also provided \(em indeed,
+.CW pdfhref
+invokes it, when processing the
+.CWB O \& \& \(rq \(lq
+reference class operator.
+It may be invoked directly, in the form
+.QP
+.fam C
+.B .pdfbookmark
+.I level > <
+.I "descriptive text ..."
+.LP
+Irrespective of which of the above macro forms is employed, the
+.CWI level > <
+argument is required.
+It is a numeric argument, defining the nesting level of the \(lqbookmark\(rq
+in the outline hierarchy, with one being the topmost level.
+Its function may be considered analagous to the
+.EM "heading level"
+of the document's section headings,
+for example, as specified with the
+.CW NH
+macro, if using the
+.CW ms
+macros to format the document.
+.LP
+All further arguments, following the
+.CWI level > <
+argument, are collected together, to specify the heading text which will appear
+in the document's outline view.
+Thus, the outline entry for this section of this document,
+which has a level three heading,
+might be specified as
+.QP
+.CW
+\&.pdfhref O 3 \*(SN A Basic Document Outline
+.LP
+or, in the alternative form using the
+.CW pdfbookmark
+macro, as
+.QP
+.CW
+\&.pdfbookmark 3 \*(SN A Basic Document Outline
+.
+.NH 3
+.XN Hierarchical Structure in a Document Outline
+.LP
+When a document outline is created, using the
+.CW pdfhref
+macro as described in
+.\"
+.\" Here is an example of how we can temporarily modify the format of
+.\" a reference link, in this case to indicate only the section number
+.\" of the link target, in the form "section #", (or, if we define
+.\" "SECREF.BEGIN" before the call, its content followed by the
+.\" section number).
+.\"
+.\" We first define a macro, which will get the reference data from
+.\" pdfhref, as arguments, and will return the formatted output, as we
+.\" require it, the string "PDFHREF.TEXT".
+.\"
+.de SECREF
+.while \\n(.$ \{\
+. ie '\\$1'section' \{\
+. if !dSECREF.BEGIN .ds SECREF.BEGIN \\$1
+. ds PDFHREF.TEXT \\*[SECREF.BEGIN]\~\\$2
+. rm SECREF.BEGIN
+. shift \\n(.$
+. \}
+. el .shift
+. \}
+..
+.\" We now tell "pdfhref" to use our formatting macro, in place of
+.\" its builtin default formatter, before we specify the reference.
+.\"
+.pdfhref F SECREF
+.pdfhref L -A , -D basic-outline
+.\"
+.\" At this point, we would normally revert the "pdfhref" formatter
+.\" to use its default, built in macro. However, in this particular
+.\" case, we want to use our custom format one more time, before we
+.\" revert it, so we will omit the reversion step this time.
+.\"
+and any entry is added at a nesting level greater than one,
+then a hierarchical structure is automatically defined for the outline.
+However, as was noted in the simplified
+.pdfhref L -D pdfmark-example -- example
+in
+.pdfhref L -A , -D pdfmark-operator
+.\"
+.\" And now, we revert to default "pdfhref" formatting behaviour,
+.\" by completing the call we delayed above.
+.\"
+.pdfhref F
+.\"
+the data required by the
+.CW pdfmark
+operator to create the outline entry may not be fully defined,
+when the outline reference is defined in the
+.CW groff
+document source.
+Specifically, when the outline entry is created, its
+.CW /Count
+key must be assigned a value equal to the number of its subordinate entries,
+at the next inner level of the outline hierarchy;
+typically however,
+these subordinate entries will be defined
+.EM later
+in the document source, and the appropriate
+.CW /Count
+value will be unknown, when defining the parent entry.
+.LP
+To resolve this paradox, the
+.CW pdfhref
+macro creates the outline entry in two distinct phases \(em
+a destination marker is placed in the \*[PostScript] output stream immediately,
+when the outline reference is defined,
+but the actual outline entry is stored in an internal \(lqoutline cache\(rq,
+until its subordinate hierarchy has been fully defined;
+it can then be inserted in the output stream, with its
+.CW /Count
+value correctly assigned.
+Effectively, to ensure integrity of the document outline structure,
+this means that each top level outline entry, and
+.EM all
+of its subordinates, are retained in the cache, until the
+.EM next
+top level entry is defined.
+.LP
+One potential problem, which arises from the use of the \(lqoutline cache\(rq,
+is that, at the end of any document formatting run, the last top level outline entry,
+and any subordinates defined after it, will remain in the cache, and will
+.EM not
+be automatically written to the output stream.
+To avoid this problem, the user should follow the guidelines given in
+.\"
+.\" Here is a more conventional example of how to temporarily change
+.\" to the format used to display reference links. We will again use
+.\" the "SECREF" format, which we defined above, but on this occasion
+.\" we will immediately revert to the default format, after the link
+.\" has been placed.
+.\"
+.pdfhref F SECREF
+.pdfhref L -D pdfsync -A ,
+.pdfhref F
+.\"
+to synchronize the output state with the cache state,
+.XR pdfsync ), (
+at the end of the
+.CW groff
+formatting run.
+.
+.NH 3
+.XN -N outline-view -- Associating a Document View with an Outline Reference
+.LP
+Each \(lqbookmark\(rq entry, in a PDF document outline,
+is associated with a specific document view.
+When the reader selects any outline entry,
+the document view changes to display the document context
+associated with that entry.
+.LP
+The document view specification,
+to be associated with any document outline entry,
+is established at the time when the outline entry is created.
+However, rather than requiring that each individual use of the
+.CW pdhref
+macro, to create an outline entry,
+should include its own view specification,
+the actual specification assigned to each entry is derived from
+a generalized specification defined in the string
+.CW PDFBOOKMARK.VIEW ,
+together with the setting of the numeric register
+.CW PDFHREF.VIEW.LEADING ,
+which determine the effective view specification as follows:\(en
+.QS
+.IP \*[= PDFBOOKMARK.VIEW]
+Establishes the magnification at which the document will be viewed,
+at the location of the \(lqbookmark\(rq; by default, it is defined by
+.RS
+.QP
+.CW ".ds PDFBOOKMARK.VIEW /FitH \e\en[PDFPAGE.Y] u"
+.RE
+.IP
+which displays the associated document view,
+with the \(lqbookmark\(rq location positioned at the top of the display window,
+and with the magnification set to fit the page width to the width of the window.
+.IP \*[= PDFHREF.VIEW.LEADING]
+Specifies additional spacing,
+to be placed between the top of the display window
+and the actual location of the \(lqbookmark\(rq on the displayed page view.
+By default, it is set as
+.RS
+.QP
+.CW ".nr PDFHREF.VIEW.LEADING 5.0p"
+.RE
+.IP
+Note that
+.CW PDFHREF.VIEW.LEADING
+does not represent true \(lqleading\(rq, in the typographical sense,
+since any preceding text, set in the specified display space,
+will be visible at the top of the document viewing window,
+when the reference is selected.
+.IP
+Also note that the specification of
+.CW PDFHREF.VIEW.LEADING
+is shared by
+.EM all
+reference views defined by the
+.CW pdfhref
+macro; whereas
+.CW PDFBOOKMARK.VIEW
+is applied exclusively to outline references,
+there is no independent
+.CW PDFBOOKMARK.VIEW.LEADING
+specification.
+.QE
+.LP
+If desired, the view specification may be changed, by redefining the string
+.CW PDFBOOKMARK.VIEW ,
+and possibly also the numeric register
+.CW PDFHREF.VIEW.LEADING .
+Any alternative definition for
+.CW PDFBOOKMARK.VIEW
+.EM must
+be specified in terms of valid view specification parameters,
+as described in the \*[Adobe]
+.pdfmark-manual .
+.LP
+Note the use of the register
+.CW PDFPAGE.Y ,
+in the default definition of
+.CW PDFBOOKMARK.VIEW
+above.
+This register is computed by
+.CW pdfhref ,
+when creating an outline entry;
+it specifies the vertical position of the \(lqbookmark\(rq,
+in basic
+.CW groff
+units, relative to the
+.EM bottom
+edge of the document page on which it is defined,
+and is followed, in the
+.CW PDFBOOKMARK.VIEW
+definition, by the
+.CW grops
+.CW u \(rq \(lq
+operator, to convert it to \*[PostScript] units on output.
+It may be used in any redefined specification for
+.CW PDFBOOKMARK.VIEW ,
+(or in the analogous definition of
+.CW PDFHREF.VIEW ,
+described in
+'ne 2v
+.XR-NO-PREFIX pdfhref-view ),
+but
+.EM not
+in any other context,
+since its value is undefined outside the scope of the
+.CW pdfhref
+macro.
+.LP
+Since
+.CW PDFPAGE.Y
+is computed relative to the
+.EM bottom
+of the PDF output page,
+it is important to ensure that the page length specified to
+.CW troff
+correctly matches the size of the logical PDF page.
+This is most effectively ensured,
+by providing
+.EM identical
+page size specifications to
+.CW groff ,
+.CW grops
+and to the \*[PostScript] to PDF converter employed,
+and avoiding any page length changes within the document source.
+.LP
+Also note that
+.CW PDFPAGE.Y
+is the only automatically computed \(lqbookmark\(rq location parameter;
+if the user redefines
+.CW PDFBOOKMARK.VIEW ,
+and the modified view specification requires any other positional parameters,
+then the user
+.EM must
+ensure that these are computed
+.EM before
+invoking the
+.CW pdfhref
+macro.
+.
+.NH 3
+.XN -N outline-folding -- Folding the Outline to Conceal Less Significant Headings
+.LP
+When a document incorporates many subheadings,
+at deeply nested levels,
+it may be desirable to \(lqfold\(rq the outline
+such that only the major heading levels are initially visible,
+yet making the inferior subheadings accessible,
+by allowing the reader to expand the view of any heading branch on demand.
+.LP
+The
+.CW pdfmark
+macros support this capability,
+through the setting of the
+.CW PDFOUTLINE.FOLDLEVEL
+register.
+This register should be set to the number of heading levels
+which it is desired to show in expanded form, in the
+.EM initial
+document outline display;
+all subheadings at deeper levels will still be added to the outline,
+but will not become visible until the outline branch containing them is expanded.
+'ne 5
+For example, the setting used in this document:
+.QS
+.LD
+.fam C
+\&.\e" Initialize the outline view to show only three heading levels,
+\&.\e" with additional subordinate level headings folded.
+\&.\e"
+\&.nr PDFOUTLINE.FOLDLEVEL 3
+.DE
+.QE
+.LP
+results in only the first three levels of headings being displayed
+in the document outline,
+.EM until
+the reader chooses to expand the view,
+and so reveal the lower level headings in any outline branch.
+.LP
+The initial default setting of
+.CW PDFOUTLINE.FOLDLEVEL ,
+if the document author does not choose to change it,
+is 10,000.
+This is orders of magnitude greater than the maximum heading level
+which is likely to be used in any document;
+thus the default behaviour will be to show document outlines fully expanded,
+to display all headings defined,
+at all levels within each document.
+.LP
+The setting of
+.CW PDFOUTLINE.FOLDLEVEL
+may be changed at any time;
+however, the effect of each such change may be difficult to predict,
+since it is applied not only to outline entries which are defined
+.EM after
+the setting is changed,
+but also to any entries which remain in the outline cache,
+.EM at
+this time.
+Therefore, it is recommended that
+.CW PDFOUTLINE.FOLDLEVEL
+should be set
+.EM once ,
+at the start of each document;
+if it
+.EM is
+deemed necessary to change it at any other time,
+the outline cache should be flushed,
+.XR pdfsync ), (
+.EM immediately
+before the change,
+which should immediately preceed a level one heading.
+.
+.NH 3
+.XN -N multipart-outline -- Outlines for Multipart Documents
+.LP
+When a document outline is created, using the
+.CW pdfhref
+macro, each reference mark is automatically assigned a name,
+composed of a fixed stem followed by a serially generated numeric qualifier.
+This ensures that, for each single part document, every outline reference
+has a uniquely named destination.
+.LP
+As the overall size of the PDF document increases,
+it may become convenient to divide it into smaller,
+individually formatted \*[PostScript] components,
+which are then assembled, in the appropriate order,
+to create a composite PDF document.
+While this strategy may simplify the overall process of creating and
+editing larger documents, it does introduce a problem in creating
+an overall document outline,
+since each individual \*[PostScript] component will be assigned
+duplicated sequences of \(lqbookmark\(rq names,
+with each name ultimately referring to multiple locations in the composite document.
+To avoid such reference naming conflicts, the
+.CW pdfhref
+macro allows the user to specify a \(lqtag\(rq,
+which is appended to the automatically generated \(lqbookmark\(rq name;
+this may be used as a discriminating mark, to distinguish otherwise
+similarly named destinations, in different sections of the composite document.
+.LP
+To create a \(lqtagged\(rq document outline,
+the syntax for invocation of the
+.CW pdfhref
+macro is modified, by the inclusion of an optional \(lqtag\(rq specification,
+.EM before
+the nesting level argument, i.e.
+.QP
+.fam C
+.B ".pdfhref O"
+.B -T \& [
+.I tag >] <
+.I level > <
+.I "descriptive text ..."
+.LP
+The optional
+.CWI tag > <
+argument may be composed of any characters of the user's choice;
+however, its initial character
+.EM "must not"
+be any decimal digit, and ideally it should be kept short
+\(em one or two characters at most.
+.LP
+By employing a different tag in each section,
+the user can ensure that \(lqbookmark\(rq names remain unique,
+throughout all the sections of a composite document.
+For example, when using the
+.CW spdf.tmac
+macro package, which adds
+.CW pdfmark
+capabilities to the standard
+.CW ms
+package,
+.XR using-spdf ), (
+the table of contents is collected into a separate \*[PostScript] section
+from the main body of the document.
+In the \(lqbody\(rq section, the document outline is \(lquntagged\(rq,
+but in the \(lqTable\~of\~Contents\(rq section, a modified version of the
+.CW TC
+macro adds an outline entry for the start of the \(lqTable\~of\~Contents\(rq,
+invoking the
+.CW pdfhref
+macro as
+.QP
+.CW ".pdfhref O -T T 1 \e\e*[TOC]"
+.LP
+to tag the associated outline destination name with the single character suffix,
+.CW T \(rq. \(lq
+Alternatively, as in the case of the basic outline,
+.XR basic-outline ), (
+this may equally well be specified as
+.QP
+.CW ".pdfbookmark -T T 1 \e\e*[TOC]"
+.
+.NH 3
+.XN Delegation of the Outline Definition
+.LP
+Since the most common use of a document outline
+is to provide a quick method of navigating through a document,
+using active \(lqhypertext\(rq links to chapter and section headings,
+it may be convenient to delegate the responsibility of creating the outline
+to a higher level macro, which is itself used to
+define and format the section headings.
+This approach has been adopted in the
+.CW spdf.tmac
+package, to be described later,
+.XR using-spdf ). (
+.LP
+When such an approach is adopted,
+the user will rarely, if ever, invoke the
+.CW pdfhref
+macro directly, to create a document outline.
+For example, the structure and content of the outline for this document
+has been exclusively defined, using a combination of the
+.CW NH
+macro, from the
+.CW ms
+package, to establish the structure, and the
+.CW XN
+macro from
+.CW spdf.tmac ,
+to define the content.
+In this case,
+the responsibility for invoking the
+.CW pdfhref
+macro, to create the document outline,
+is delegated to the
+.CW XN
+macro.
+.
+.NH 2
+.XN -N pdfhref -- Adding Reference Marks and Links
+.LP
+.pdfhref F SECREF
+.ds SECREF.BEGIN Section
+.pdfhref L -D add-outline
+.pdfhref F
+has shown how the
+.CW pdfhref
+macro may be used to create a PDF document outline.
+While this is undoubtedly a powerful capability,
+it is by no means the only trick in the repertoire of this versatile macro.
+.LP
+The macro name,
+.CW pdfhref ,
+which is a contraction of \(lqPDF HyperText Reference\(rq,
+indicates that the general purpose of this macro is to define
+.EM any
+type of dynamic reference mark, within a PDF document.
+Its generalized usage syntax takes the form
+.QP
+.fam C
+.B .pdfhref
+.BI class > <
+.I "-options ...\&" ] [
+[--]
+.I "descriptive text ...\&" ] [
+.LP
+where
+.CW <\f(CIclass\fP>
+represents a required single character argument,
+which defines the specific reference operation to be performed,
+and may be selected from:\(en
+.QS
+.IP \*[= O]
+Add an entry to the document outline.
+This operation has been described earlier,
+.XR add-outline ). (
+.IP \*[= M]
+Place a \(lqnamed destination\(rq reference mark at the current output position,
+in the current PDF document,
+.XR mark-dest ). (
+.IP \*[= D]
+Specify the content of a PDF document reference dictionary entry;
+typically, such entries are generated automatically,
+by transformation of the intermediate output resulting from the use of
+.CW pdfhref
+.CWB M \& \& \(rq, \(lq
+with the
+.CWB -X \& \& \(rq \(lq
+modifier,
+.XR create-map ); (
+however, it is also possible to specify such entries manually,
+.XR user-format ). (
+.IP \*[= L]
+Insert an active link to a named destination,
+.XR link-named ), (
+at the current output position in the current PDF document,
+such that when the reader clicks on the link text,
+the document view changes to show the location of the named destination.
+.IP \*[= W]
+Insert an active link to a \(lqweb\(rq resource,
+.XR add-weblink ), (
+at the current output position in the current PDF document.
+This is effectively the same as using the
+.CWB L \& \& \(rq \(lq
+operator to establish a link to a named destination in another PDF document,
+.XR link-extern ), (
+except that in this case, the destination is specified by a
+\(lquniform resource identifier\(rq, or
+.CW URI ;
+this may represent any Internet or local resource
+which can be specified in this manner.
+.IP \*[= F]
+Specify a user defined macro, to be called by
+.CW pdfhref ,
+when formatting the text in the active region of a link,
+.XR set-format ). (
+.IP \*[= Z]
+Define the absolute position on the physical PDF output page,
+where the \(lqhot\(hyspot\(rq associated with an active link is to be placed.
+Invoked in pairs, marking the starting and ending PDF page co\(hyordinates
+for each link \(lqhot\(hyspot\(rq, this operator is rarely, if ever,
+specified directly by the user;
+rather, appropriate
+.CW pdfhref
+.CWB Z \& \& \(rq \(lq
+specifications are inserted automatically into the document reference map
+during the PDF document formatting process,
+.XR create-map ). (
+.IP \*[= I]
+Initialize support for
+.CW pdfhref
+features.
+The current
+.CW pdfhref
+implementation provides only one such feature which requires initialization
+\(em a helper macro which must be attached to a user supplied page trap handler,
+in order to support mapping of reference \(lqhot\(hyspots\(rq
+which extend through a page transition;
+.XR page-trap ). (
+.QE
+.
+.NH 3
+.XN -S -- Optional Features of the \F[C]pdfhref\F[] Macro
+.LP
+The behaviour of a number of the
+.CW pdfhref
+macro operations can be modified,
+by including
+.EM "option specifiers" \(rq \(lq
+after the operation specifying argument,
+but
+.EM before
+any other arguments normally associated with the operation.
+In
+.EM all
+cases, an option is specified by an
+.EM "option flag" \(rq, \(lq
+comprising an initial hyphen,
+followed by one or two option identifying characters.
+Additionally,
+.EM some
+options require
+.EM "exactly one"
+option argument;
+for these options, the argument
+.EM must
+be specified, and it
+.EM must
+be separated from the preceding option flag by one or more
+.EM spaces ,
+(tabs
+.EM "must not"
+be used).
+It may be noted that this paradigm for specifying options
+is reminiscent of most
+Unix\(tm
+shells; however, in the case of the
+.CW pdfhref
+macro, omission of the space separating an option flag from its argument is
+.EM never
+permitted.
+.LP
+A list of
+.EM all
+general purpose options supported by the
+.CW pdfhref
+macro is given below.
+Note that not all options are supported for all
+.CW pdfhref
+operations; the operations affected by each option are noted in the list.
+For
+.EM most
+operations, if an unsupported option is specified,
+it will be silently ignored; however, this behaviour should
+not be relied upon.
+.LP
+The general purpose options, supported by the
+.CW pdfhref
+macro, are:\(en
+.QS
+.IP \*[= -N\0 name > <]
+Allows the
+.CWI name > <
+associated with a PDF reference destination
+to be defined independently from the following text,
+which describes the reference.
+This option affects only the
+.CWB M \& \& \(rq \(lq
+operation of the
+.CW pdfhref
+macro,
+.XR mark-dest ). (
+.IP \*[= -E]
+Also used exclusively with the
+.CWB M \& \& \(rq \(lq
+operator, the
+.CWB -E
+option causes any specified
+.CWI descriptive \& \& \~\c
+.CWI text
+arguments,
+.XR mark-dest ), (
+to be copied, or
+.EM echoed ,
+in the body text of the document,
+at the point where the reference mark is defined;
+(without the
+.CWB -E
+option, such
+.CWI descriptive \& \& \~\c
+.CWI text
+will appear
+.EM only
+at points where links to the reference mark are placed,
+and where the standard reference display format,
+.XR set-format ), (
+is used).
+.IP \*[= -D\0 dest > <]
+Specifies the
+.CW URI ,
+or the destination name associated with a PDF active link,
+independently of the following text,
+which describes the link and demarcates the link \(lqhot\(hyspot\(rq.
+This option affects the behaviour of the
+.CW pdfhref
+macro's
+.CWB L \& \& \(rq \(lq
+and
+.CWB W \& \& \(rq \(lq
+operations.
+.IP
+When used with the
+.CWB L \& \& \(rq \(lq
+operator, the
+.CWI dest > <
+argument must specify a PDF \(lqnamed destination\(rq,
+as defined using
+.CW pdfhref
+with the
+.CWB M \& \& \(rq \(lq
+operator.
+.IP
+When used with the
+.CWB W \& \& \(rq \(lq
+operator,
+.CWI dest > <
+must specify a link destination in the form of a
+\(lquniform resource identifier\(rq, or
+.CW URI ,
+.XR add-weblink ). (
+.IP \*[= -F\0 file > <]
+When used with the
+.CWB L \& \& \(rq \(lq
+.CW pdfhref
+operator,
+.CWI file > <
+specifies an external PDF file in which the named destination
+for the link reference is defined.
+This option
+.EM must
+be specified with the
+.CWB L \& \& \(rq \(lq
+operator,
+to create a link to a destination in a different PDF document;
+when the
+.CWB L \& \& \(rq \(lq
+operator is used
+.EM without
+this option, the link destination is assumed to be defined
+within the same document.
+.IP \*[= -P\0 \(dqprefix\(hytext\(dq > <]
+Specifies
+.CWI \(dqprefix\(hytext\(dq > <
+to be attached to the
+.EM start
+of the text describing an active PDF document link,
+with no intervening space, but without itself being included in the
+active area of the link \(lqhot\(hyspot\(rq;
+it is effective with the
+.CWB L \& \& \(rq \(lq
+and
+.CWB W \& \& \(rq \(lq
+.CW pdfhref
+operators.
+.IP
+Typically, this option would be used to insert punctuation before
+the link \(lqhot\(hyspot\(rq.
+Thus, there is little reason for the inclusion of spaces in
+.CWI \(dqprefix\(hytext\(dq > < ;
+however, if such space is required, then the enclosing double quotes
+.EM must
+be specified, as indicated.
+.IP \*[= -A\0 \(dqaffixed\(hytext\(dq > <]
+Specifies
+.CWI \(dqaffixed\(hytext\(dq > <
+to be attached to the
+.EM end
+of the text describing an active PDF document link,
+with no intervening space, but without itself being included in the
+active area of the link \(lqhot\(hyspot\(rq;
+it is effective with the
+.CWB L \& \& \(rq \(lq
+and
+.CWB W \& \& \(rq \(lq
+.CW pdfhref
+operators.
+.IP
+Typically, this option would be used to insert punctuation after
+the link \(lqhot\(hyspot\(rq.
+Thus, there is little reason for the inclusion of spaces in
+.CWI \(dqaffixed\(hytext\(dq > < ;
+however, if such space is required, then the enclosing double quotes
+.EM must
+be specified, as indicated.
+.IP \*[= -T\0 tag > <]
+When specified with the
+.CWB O \& \& \(rq \(lq
+operator,
+.CWI tag > <
+is appended to the \(lqbookmark\(rq name assigned to the generated outline entry.
+This option is
+.EM required ,
+to distinguish between the series of \(lqbookmark\(rq names generated in
+individual passes of the
+.CW groff
+formatter, when the final PDF document is to be assembled
+from a number of separately formatted components;
+.XR multipart-outline ). (
+.IP \*[= -X]
+This
+.CW pdfhref
+option is used with either the
+.CWB M \& \& \(rq \(lq
+operator, or with the
+.CWB L \& \& \(rq \(lq
+operator.
+.IP
+When used with the
+.CWB M \& \& \(rq \(lq
+operator,
+.XR mark-dest ), (
+it ensures that a cross reference record for the marked destination
+will be included in the document reference map,
+.XR export-map ). (
+.IP
+When used with the
+.CWB L \& \& \(rq \(lq
+operator,
+.XR link-named ), (
+it causes the reference to be displayed in the standard cross reference format,
+.XR set-format ), (
+but substituting the
+.CWI descriptive \& \& \~\c
+.CWI text
+specified in the
+.CW pdfhref \& \(lq
+.CW L \(rq
+argument list,
+for the description specified in the document reference map.
+.IP \*[= --]
+Marks the end of the option specifiers.
+This may be used with all
+.CW pdfhref
+operations which accept options, to prevent
+.CW pdfhref
+from interpreting any following arguments as option specifiers,
+even if they would otherwise be interpreted as such.
+It is also useful when the argument list to
+.CW pdfhref
+contains special characters \(em any special character,
+which is not valid in a
+.CW groff
+macro name, will cause a parsing error, if
+.CW pdfhref
+attempts to match it as a possible option flag;
+using the
+.CW -- \(rq \(lq
+flag prevents this, so suppressing the
+.CW groff
+warning message, which would otherwise ensue.
+.IP
+Using this flag after
+.EM all
+sequences of macro options is recommended,
+even when it is not strictly necessary,
+if only for the entirely cosmetic benefit of visually separating
+the main argument list from the sequence of preceding options.
+.QE
+.LP
+In addition to the
+.CW pdfhref
+options listed above, a supplementary set of two character options are defined.
+These supplementary options, listed below, are intended for use with the
+.CWB L \& \& \(rq \(lq
+operator, in conjunction with the
+.CWB -F \& \& \~\c
+.CWBI file > <
+option, to specify alternate file names,
+in formats compatible with the file naming conventions
+of alternate operating systems;
+they will be silently ignored, if used in any other context.
+.LP
+The supported alternate file name options,
+which are ignored if the
+.CWB -F \& \& \~\c
+.CWBI file > <
+option is not specified, are:\(en
+.QS
+.IP \*[= -DF\0 dos\(hyfile > <]
+Specifies the name of the file in which a link destination is defined,
+using the file naming semantics of the
+.CW MS\(hyDOS \*(rg
+operating system.
+When the PDF document is read on a machine
+where the operating system uses the
+.CW MS\(hyDOS \*(rg
+file system, then
+.CWI dos\(hyfile > <
+is used as the name of the file containing the reference destination,
+overriding the
+.CWI file > <
+argument specified with the
+.CWB -F
+option.
+.IP \*[= -MF\0 mac\(hyfile > <]
+Specifies the name of the file in which a link destination is defined,
+using the file naming semantics of the
+.CW Apple \*(rg
+.CW Macintosh \*(rg
+operating system.
+When the PDF document is read on a machine
+where the operating system uses the
+.CW Macintosh \*(rg
+file system, then
+.CWI mac\(hyfile > <
+is used as the name of the file containing the reference destination,
+overriding the
+.CWI file > <
+argument specified with the
+.CWB -F
+option.
+.IP \*[= -UF\0 unix\(hyfile > <]
+Specifies the name of the file in which a link destination is defined,
+using the file naming semantics of the
+.CW Unix \(tm
+operating system.
+When the PDF document is read on a machine
+where the operating system uses
+.CW POSIX
+file naming semantics, then
+.CWI unix\(hyfile > <
+is used as the name of the file containing the reference destination,
+overriding the
+.CWI file > <
+argument specified with the
+.CWB -F
+option.
+.IP \*[= -WF\0 win\(hyfile > <]
+Specifies the name of the file in which a link destination is defined,
+using the file naming semantics of the
+.CW MS\(hyWindows \*(rg
+32\(hybit operating system.
+When the PDF document is read on a machine
+where the operating system uses any of the
+.CW MS\(hyWindows \*(rg
+file systems, with long file name support, then
+.CWI win\(hyfile > <
+is used as the name of the file containing the reference destination,
+overriding the
+.CWI file > <
+argument specified with the
+.CWB -F
+option.
+.QE
+.
+.NH 3
+.XN -N mark-dest -- Marking a Reference Destination
+.LP
+The
+.CW pdfhref
+macro may be used to create active links to any Internet resource,
+specified by its
+.CW URI ,
+or to any \(lqnamed destination\(rq,
+either within the same document, or in another PDF document.
+Although the PDF specification allows link destinations to be defined
+in terms of a page number, and an associated view specification,
+this style of reference is not currently supported by the
+.CW pdfhref
+macro, because it is not possible to adequately bind the specification
+for the destination with the intended reference context.
+.LP
+References to Internet resources are interpreted in accordance with the
+.CW W3C
+standard for defining a
+.CW URI ;
+hence the only prerequisite, for creating a link to any Internet resource,
+is that the
+.CW URI
+be properly specified, when declaring the reference;
+.XR add-weblink ). (
+In the case of references to \(lqnamed destinations\(rq in PDF documents,
+however, it is necessary to provide a mechanism for creating such
+\(lqnamed destinations\(rq.
+This may be accomplished, by invoking the
+.CW pdfhref
+macro in the form
+.QP
+.fam C
+.B ".pdfhref M"
+.B -N \& [
+.I name >] <
+.B -X ] [
+.B -E ] [
+.I "descriptive text ...\&" ] [
+.LP
+This creates a \(lqnamed destination\(rq reference mark, with its name specified by
+.CWI name > < ,
+or, if the
+.CWB -N
+option is not specified, by the first word of
+.CWI descriptive \& \& \~\c
+.CWI text \& \& ;
+(note that this imposes the restriction that,
+if the
+.CWB -N
+option is omitted, then
+.EM "at least"
+one word of
+.CWI descriptive \& \& \~\c
+.CWI text
+.EM must
+be specified).
+Additionally, a reference view will be automatically defined,
+and associated with the reference mark,
+.XR pdfhref-view ), (
+.\" and, if any
+.\" .CWI descriptive
+.\" .CWI text
+.\" is specified, or the
+and, if the
+.CWB -X
+option is specified, and no document cross reference map has been imported,
+.XR import-map ), (
+then a cross reference mapping record,
+.XR export-map ), (
+will be written to the
+.CW stdout
+stream;
+this may be captured, and subsequently used to generate a cross reference map
+for the document,
+.XR create-map ). (
+.LP
+When a \(lqnamed destination\(rq reference mark is created, using the
+.CW pdfhref
+macro's
+.CWB M \& \& \(rq \(lq
+operator, there is normally no visible effect in the formatted document; any
+.CWI descriptive \& \& \~\c
+.CWI text
+which is specified will simply be stored in the cross reference map,
+for use when a link to the reference mark is created.
+This default behaviour may be changed, by specifying the
+.CWB -E
+option, which causes any specified
+.CWI descriptive \& \& \~\c
+.CWI text
+to be \(lqechoed\(rq in the document text,
+at the point where the reference mark is placed,
+in addition to its inclusion in the cross reference map.
+.
+.NH 4
+.XN -N export-map -- Mapping a Destination for Cross Referencing
+.LP
+Effective cross referencing of
+.EM any
+document formatted by
+.CW groff
+requires multiple pass formatting.
+Details of how this multiple pass formatting may be accomplished,
+when working with the
+.CW pdfmark
+macros, will be discussed later,
+.XR do-xref ); (
+at this stage, the discussion will be restricted to the initial preparation,
+which is required at the time when the cross reference destinations are defined.
+.LP
+The first stage, in the process of cross referencing a document,
+is the generation of a cross reference map.
+Again, the details of
+.EM how
+the cross reference map is generated will be discussed in
+.pdfhref F SECREF L -D do-xref -A ;
+.pdfhref F
+however, it is important to recognize that
+.EM what
+content is included in the cross reference map is established
+when the reference destination is defined \(em it is derived
+from the reference data exported on the
+.CW stderr
+stream by the
+.CW pdfhref
+macro, when it is invoked with the
+.CWB M \& \& \(rq \(lq
+operator, and is controlled by whatever definition of the string
+.CW PDFHREF.INFO
+is in effect, when the
+.CW pdfhref
+macro is invoked.
+.LP
+The initial default setting of
+.CW PDFHREF.INFO
+is
+.QP
+.CW ".ds PDFHREF.INFO page \e\en% \e\e$*"
+.LP
+which ensures that the cross reference map will contain
+at least a page number reference, supplemented by any
+.CWI descriptive \& \& \~\c
+.CWI text
+which is specified for the reference mark, as defined by the
+.CW pdfhref
+macro, with its
+.CWB M \& \& \(rq \(lq
+operator; this may be redefined by the user,
+to export additional cross reference information,
+or to modify the default format for cross reference links,
+.XR set-format ). (
+.
+.NH 4
+.XN -N pdfhref-view -- Associating a Document View with a Reference Mark
+.LP
+In the same manner as each document outline reference, defined by the
+.CW pdfhref
+macro with the
+.CWB O \& \& \(rq \(lq
+operator,
+.XR add-outline ), (
+has a specific document view associated with it,
+each reference destination marked by
+.CW pdfhref
+with the
+.CWB M \& \& \(rq \(lq
+operator, requires an associated document view specification.
+.LP
+The mechanism whereby a document view is associated with a reference mark
+is entirely analogous to that employed for outline references,
+.XR outline-view ), (
+except that the
+.CW PDFHREF.VIEW
+string specification is used, in place of the
+.CW PDFBOOKMARK.VIEW
+specification.
+Thus, the reference view is defined in terms of:\(en
+.QS
+.IP \*[= PDFHREF.VIEW]
+A string,
+establishing the position of the reference mark within the viewing window,
+and the magnification at which the document will be viewed,
+at the location of the marked reference destination;
+by default, it is defined by
+.RS
+.QP
+.CW ".ds PDFHREF.VIEW /FitH \e\en[PDFPAGE.Y] u"
+.RE
+.IP
+which displays the reference destination at the top of the viewing window,
+with the magnification set to fit the page width to the width of the window.
+.IP \*[= PDFHREF.VIEW.LEADING]
+A numeric register,
+specifying additional spacing, to be placed between the top of the display
+window and the actual position at which the location of the reference
+destination appears within the window.
+This register is shared with the view specification for outline references,
+and thus has the same default initial setting,
+.RS
+.QP
+.CW ".nr PDFHREF.VIEW.LEADING 5.0p"
+.RE
+.IP
+as in the case of outline reference views.
+.IP
+Again, notice that
+.CW PDFHREF.VIEW.LEADING
+does not represent true typographic \(lqleading\(rq,
+since any preceding text, set in the specified display space,
+will be visible at the top of the viewing window,
+when the reference is selected.
+.QE
+.LP
+Just as the view associated with outline references may be changed,
+by redefining
+.CW PDFBOOKMARK.VIEW ,
+so the view associated with marked reference destinations may be changed,
+by redefining
+.CW PDFHREF.VIEW ,
+and, if desired,
+.CW PDFHREF.VIEW.LEADING ;
+such changes will become effective for all reference destinations marked
+.EM after
+these definitions are changed.
+(Notice that, since the specification of
+.CW PDFHREF.VIEW.LEADING
+is shared by both outline reference views and marked reference views,
+if it is changed, then the views for
+.EM both
+reference types are changed accordingly).
+.LP
+It may again be noted, that the
+.CW PDFPAGE.Y
+register is used in the definition of
+.CW PDFHREF.VIEW ,
+just as it is in the definition of
+.CW PDFBOOKMARK.VIEW ;
+all comments in
+.pdfhref F SECREF L -D outline-view
+.pdfhref F
+relating to its use, and indeed to page position computations in general,
+apply equally to marked reference views and to outline reference views.
+.
+.NH 3
+.XN -N link-named -- Linking to a Marked Reference Destination
+.LP
+Any named destination, such as those marked by the
+.CW pdfhref
+macro, using it's
+.CWB M \& \& \(rq \(lq
+operator, may be referred to from any point in
+.EM any
+PDF document, using an
+.EM "active link" ;
+such active links are created by again using the
+.CW pdfhref
+macro, but in this case, with the
+.CWB L \& \& \(rq \(lq
+operator.
+This operator provides support for two distinct cases,
+depending on whether the reference destination is defined in
+the same document as the link,
+.XR link-intern ), (
+or is defined as a named destination in a different PDF document,
+.XR link-extern ). (
+.
+.NH 4
+.XN -N link-intern -- References within a Single PDF Document
+.LP
+The general syntactic form for invoking the
+.CW pdfhref
+macro,
+when creating a link to a named destination within the same PDF document is
+.QP
+.fam C
+.B .pdfhref
+.B L
+.B -D \& [
+.BI dest-name >] <
+.B -P \& [
+.BI prefix-text >] <
+.B -A \& [
+.BI affixed-text >] <
+\e
+.br
+\0\0\0
+.B -X ] [
+.B -- ] [
+.I "descriptive text ...\&" ] [
+.LP
+where
+.CWI dest-name > <
+specifies the name of the link destination,
+as specified using the
+.CW pdfhref
+.CWB M \& \& \(rq \(lq
+operation; (it may be defined either earlier in the document,
+to create a backward reference, or later, to create a forward reference).
+.\"
+.\" Here's a example of how to add an iconic annotation.
+.\"
+.\".pdfnote -T "Internal Cross References" \
+.\" This description is rather terse, and could benefit from \
+.\" the inclusion of an example.
+.LP
+If any
+.CWI descriptive \& \& \~\c
+.CWI text
+arguments are specified, then they will be inserted into the
+.CW groff
+output stream, to define the text appearing in the \(lqhot\(hyspot\(rq
+region of the link;
+this will be printed in the link colour specified by the string,
+.CW PDFHREF.TEXT.COLOUR ,
+which is described in
+.XR-NO-PREFIX set-colour .
+If the
+.CWB -X
+option is also specified, then the
+.CWI descriptive \& \& \~\c
+.CWI text
+will be augmented, by prefacing it with page and section number indicators,
+in accordance with the reference formatting rules which are in effect,
+.XR set-format ); (
+such indicators will be included within the active link region,
+and will also be printed in the link colour.
+.LP
+Note that
+.EM either
+the
+.CWB -D \& \& \~\c
+.CWBI dest\(hyname > <
+option,
+.EM or
+the
+.CWI descriptive \& \& \~\c
+.CWI text
+arguments,
+.EM "but not both" ,
+may be omitted.
+If the
+.CWB -D \& \& \~\c
+.CWBI dest\(hyname > <
+option is omitted, then the first word of
+.CWI descriptive \& \& \~\c
+.CWI text \& \& ,
+i.e.\~all text up to but not including the first space,
+will be interpreted as the
+.CWBI dest\(hyname > <
+for the link; this text will also appear in the running text of the document,
+within the active region of the link.
+Alternatively, if the
+.CWB -D \& \& \~\c
+.CWBI dest\(hyname > <
+option
+.EM is
+specified, and
+.CWI descriptive \& \& \~\c
+.CWI text
+is not,
+then the running text which defines the reference,
+and its active region,
+will be derived from the reference description which is specified
+when the named destination is marked,
+.XR mark-dest ), (
+and will be formatted according to the reference formatting rules
+which are in effect, when the reference is placed,
+.XR set-format ); (
+in this case, it is not necessary to specify the
+.CWB -X
+option to activate automatic formatting of the reference \(em it is implied,
+by the omission of all
+.CWI descriptive \& \& \~\c
+.CWI text
+arguments.
+.LP
+The
+.CWB -P \& \& \~\c
+.CWBI prefix\(hytext > <
+and
+.CWB -A \& \& \~\c
+.CWBI affixed\(hytext > <
+options may be used to specify additional text
+which will be placed before and after the linked text respectively,
+with no intervening space.
+Such prefixed and affixed text will be printed in the normal text colour,
+and will not be included within the active region of the link.
+This feature is mostly useful for creating parenthetical references,
+or for placing punctuation adjacent to,
+but not included within,
+the text which defines the active region of the link.
+.LP
+The operation of the
+.CW pdfhref
+macro, when used with its
+.CWB L \& \& \(rq \(lq
+operator to place a link to a named PDF destination,
+may best be illustrated by an example.
+However, since the appearance of the link will be influenced by
+factors established when the named destination is marked,
+.XR mark-dest ), (
+and also by the formatting rules in effect when the link is placed,
+the presentation of a suitable example will be deferred,
+until the formatting mechanism has been explained,
+.XR set-format ). (
+.
+.NH 4
+.XN -N link-extern -- References to Destinations in Other PDF Documents
+.LP
+The
+.CW pdfhref
+macro's
+.CWB L \& \& \(rq \(lq
+operator is not restricted to creating reference links
+within a single PDF document.
+When the link destination is defined in a different document,
+then the syntactic form for invoking
+.CW pdfhref
+is modified, by the addition of options to specify the
+name and location of the PDF file in which the destination is defined.
+Thus, the extended
+.CW pdfhref
+syntactic form becomes
+.QP
+.fam C
+.B .pdfhref
+.B L
+.B -F
+.BI file > <
+.B -D \& [
+.BI dest-name >] <
+\e
+.br
+\0\0\0
+.B -DF \& [
+.BI dos-file >] <
+.B -MF \& [
+.BI mac-file >] <
+.B -UF \& [
+.BI unix-file >] <
+\e
+.br
+\0\0\0
+.B -WF \& [
+.BI win-file >] <
+.B -P \& [
+.BI prefix-text >] <
+.B -A \& [
+.BI affixed-text >] <
+\e
+.br
+\0\0\0
+.B -X ] [
+.B -- ] [
+.I "descriptive text ...\&" ] [
+.LP
+where the
+.CWB -F \& \& \~\c
+.CWBI file > <
+option serves
+.EM two
+purposes: it both indicates to the
+.CW pdfhref
+macro that the specified reference destination
+is defined in an external PDF file,
+and it also specifies the normal path name,
+which is to be used to locate this file,
+when a user selects the reference.
+.LP
+In addition to the
+.CWB -F \& \& \~\c
+.CWBI file > <
+option, which
+.EM must
+be specified when referring to a destination in an external PDF file,
+the
+.CWB -DF \& \& \~\c
+.CWBI dos\(hyfile > < ,
+.CWB -MF \& \& \~\c
+.CWBI mac\(hyfile > < ,
+.CWB -UF \& \& \~\c
+.CWBI unix\(hyfile > <
+and
+.CWB -WF \& \& \~\c
+.CWBI win\(hyfile > <
+options may be used to specify the location of the file
+containing the reference destination,
+in a variety of operating system dependent formats.
+These options assign their arguments to the
+.CW /DosFile ,
+.CW /MacFile ,
+.CW /UnixFile
+and
+.CW /WinFile
+keys of the generated
+.CW pdfmark
+respectively; thus when any of these options are specified,
+.EM "in addition to"
+the
+.CWB -F \& \& \~\c
+.CWBI file > <
+option, and the document is read on the appropriate operating systems,
+then the path names specified by
+.CWBI dos\(hyfile > < ,
+.CWBI mac\(hyfile > < ,
+.CWBI unix\(hyfile > <
+and
+.CWBI win\(hyfile > <
+will be searched,
+.EM instead
+of the path name specified by
+.CWBI file > < ,
+for each of the
+.CW MS\(hyDOS \*(rg,
+.CW Apple \*(rg
+.CW Macintosh \*(rg,
+.CW Unix \(tm
+and
+.CW MS\(hyWindows \*(rg
+operating systems, respectively; see the
+.pdfmark-manual ,
+for further details.
+.LP
+Other than the use of these additional options,
+which specify that the reference destination is in an external PDF file,
+the behaviour of the
+.CW pdfhref
+.CWB L \& \& \(rq \(lq
+operator, with the
+.CWB -F \& \& \~\c
+.CWBI file > <
+option, remains identical to its behaviour
+.EM without
+this option,
+.XR link-intern ), (
+with respect to the interpretation of other options,
+the handling of the
+.CWI descriptive \& \& \~\c
+.CWI text
+arguments, and the formatting of the displayed reference.
+.LP
+Once again, since the appearance of the reference is determined by
+factors specified in the document reference map,
+and also by the formatting rules in effect when the reference is placed,
+the presentation of an example of the placing of
+a reference to an external destination will be deferred,
+until the formatting mechanism has been explained,
+.XR set-format ). (
+.
+.NH 3
+.XN -N add-weblink -- Linking to Internet Resources
+.LP
+In addition to supporting the creation of cross references
+to named destinations in PDF documents, the
+.CW pdfhref
+macro also has the capability to create active links to Internet resources,
+or indeed to
+.EM any
+resource which may be specified by a Uniform Resource Identifier,
+(which is usually abbreviated to the acronym \(lqURI\(rq,
+and sometimes also referred to as a Uniform Resource Locator,
+or \(lqURL\(rq).
+.LP
+Since the mechanism for creating a link to a URI differs somewhat
+from that for creating PDF references, the
+.CW pdfhref
+macro is invoked with the
+.CWB W \& \& \(rq \(lq
+(for \(lqweb\(hylink\(rq) operator, rather than the
+.CWB L \& \& \(rq \(lq
+operator; nevertheless, the invocation syntax is similar, having the form
+.QP
+.fam C
+.B .pdfhref
+.B W
+.B -D \& [
+.BI URI >] <
+.B -P \& [
+.BI prefix-text >] <
+.B -A \& [
+.BI affixed-text >] <
+\e
+.br
+\0\0\0
+.B -- ] [
+.I "descriptive text ...\&"
+.LP
+where the optional
+.CWB -D
+.CWBI URI > <
+modifier specifies the address for the target Internet resource,
+in any appropriate
+.EM "Uniform Resource Identifier"
+format, while the
+.CWI descriptive
+.CWI text
+argument specifies the text which is to appear in the \(lqhot\(hyspot\(rq
+region, and the
+.CWB -P
+.CWBI prefix\(hytext > <
+and
+.CWB -A
+.CWBI affixed\(hytext > <
+options have the same effect as in the case of local document links,
+.XR link-intern ). (
+.LP
+Notice that it is not mandatory to include the
+.CWB -D
+.CWBI URI > <
+in the link specification; if it
+.EM is
+specified, then it is not necessary for the URI to appear,
+in the running text of the document \(em the
+.CWI descriptive
+.CWI text
+argument exactly defines the text
+which will appear within the \(lqhot\(hyspot\(rq region,
+and this need not include the URI.
+However, if the
+.CWB -D \& \& \~\c
+.CWBI URI > <
+specification is omitted, then the
+.CWI descriptive
+.CWI text
+argument
+.EM must
+be an
+.EM exact
+representation of the URI, which
+.EM will ,
+therefore, appear as the entire content of the \(lqhot\(hyspot\(rq.
+For example, we could introduce a reference to
+.pdfhref W -D \*[GROFF-WEBSITE] -A , the groff web site
+in which the actual URI is concealed, by using mark up such as:\(en
+.DS I
+.CW
+For example, we could introduce a reference to
+\&.pdfhref W -D \*[GROFF-WEBSITE] -A , the groff web site
+in which the actual URI is concealed,
+.DE
+Alternatively,
+to refer the reader to the groff web site,
+making it obvious that the appropriate URI is
+.pdfhref W -A , \*[GROFF-WEBSITE]
+the requisite mark up might be:\(en
+.DS I
+.CW
+to refer the reader to the groff web site,
+making it obvious that the appropriate URI is
+\&.pdfhref W -A , \*[GROFF-WEBSITE]
+the requisite mark up might be:\e(en
+.DE
+.
+.NH 3
+.XN -N set-format -- Establishing a Format for References
+.LP
+There are two principal aspects to be addressed,
+when defining the format to be used when displaying references.
+Firstly, it is desirable to provide a visual cue,
+to indicate that the text describing the reference is imbued
+with special properties \(em it is dynamically linked to the reference
+destination \(em and secondly, the textual content should
+describe where the link leads, and ideally,
+it should also describe the content of the reference destination.
+.LP
+The visual cue,
+that a text region defines a dynamically linked reference,
+is most commonly provided by printing the text within the active
+region in a distinctive colour.
+This technique will be employed automatically by the
+.CW pdfhref
+macro \(em
+.XR set-colour
+\(em unless the user specifically chooses to adopt, and implement,
+some alternative strategy.
+.
+.NH 4
+.XN -N set-colour -- Using Colour to Demarcate Link Regions
+.LP
+Typically, when a PDF document contains
+.EM active
+references to other locations, either within the same document,
+or even in other documents, or on the World Wide Web,
+it is usually desirable to make the regions
+where these active links are placed stand out from the surrounding text.
+.
+.NH 4
+.XN -N user-format -- Specifying Reference Text Explicitly
+.
+.NH 4
+.XN -N auto-format -- Using Automatically Formatted Reference Text
+.
+.NH 4
+.XN -N custom-format -- Customizing Automatically Formatted Reference Text
+.LP
+It is incumbent on the user,
+if employing automatic formatting of the displayed reference,
+.XR set-format ), (
+to ensure that an appropriate reference definition
+is created for the reference destination,
+and is included in the reference map for the document
+in which the reference will appear;
+thus, it may be easiest to
+.EM always
+use manual formatting for external references.
+.
+.NH 3
+.XN Problematic Links
+.LP
+Irrespective of whether a
+.CW pdfhref
+reference is placed using the
+.CWB L \& \& \(rq \(lq
+operator, or the
+.CWB W \& \& \(rq \(lq
+operator, there may be occasions when the resulting link
+does function as expected.
+A number of scenarios, which are known to be troublesome,
+are described below.
+.
+.NH 4
+.XN -N page-trap -- Links with a Page Transition in the Active Region
+.LP
+When a link is placed near the bottom of a page,
+it is possible that its active region, or \(lqhot\(hyspot\(rq,
+may extend on to the next page.
+In this situation, a page trap macro is required
+to intercept the page transition, and to restart the mapping of
+the \(lqhot\(hyspot\(rq boundary on the new page.
+.LP
+The
+.CW pdfmark
+macro package includes a suitable page trap macro, to satisfy this requirement.
+However, to avoid pre\(hyempting any other requirement the user may have for
+a page transition trap, this is
+.EM not
+installed as an active page trap,
+unless explicitly requested by the user.
+.LP
+To enable proper handling of page transitions,
+which occur within the active regions of reference links,
+the user should:\(en
+.QS
+.nr ITEM 0 1
+.IP \n+[ITEM].
+Define a page transition macro, to provide whatever features may be required,
+when a page transition occurs \(em e.g.\& printing footnotes,
+adding page footers and headers, etc.
+This macro should end by setting the output position at the correct
+vertical page offset, where the printing of running text is to restart,
+following the page transition.
+.IP \n+[ITEM].
+Plant a trap to invoke this macro, at the appropriate vertical position
+marking the end of normal running text on each page.
+.KS
+.IP \n+[ITEM].
+Initialize the
+.CW pdfhref
+hook into this page transition trap, by invoking
+.RS
+.IP
+.fam C
+.B "pdfhref I -PT"
+.BI macro-name > <
+.LP
+where
+.CWBI macro-name > <
+is the name of the user supplied page trap macro,
+to ensure that
+.CW pdfhref
+will correctly restart mapping of active link regions,
+at the start of each new page.
+.KE
+.RE
+.QE
+.LP
+It may be observed that this initialization of the
+.CW pdfhref
+page transition hook is, typically, required only once
+.EM before
+document formatting begins.
+Users of document formatting macro packages may reasonably expect that
+this initialization should be performed by the macro package itself.
+Thus, writers of such macro packages which include
+.CW pdfmark
+bindings, should provide appropriate initialization,
+so relieving the end user of this responsibility.
+The following example, abstracted from the sample
+.CW ms
+binding package,
+.CW spdf.tmac ,
+illustrates how this may be accomplished:\(en
+.DS I
+.CW
+\&.\e" groff "ms" provides the "pg@bottom" macro, which has already
+\&.\e" been installed as a page transition trap. To ensure proper
+\&.\e" mapping of "pdfhref" links which overflow the bottom of any
+\&.\e" page, we need to install the "pdfhref" page transition hook,
+\&.\e" as an addendum to this macro.
+\&.
+\&.pdfhref I -PT pg@bottom
+.DE
+.
+.NH 2
+.XN -N add-note -- Annotating a PDF Document using Pop-Up Notes
+.
+.NH 2
+.XN -S -N pdfsync -- Synchronizing Output and \F[C]pdfmark\F[] Contexts
+.LP
+It has been noted previously, that the
+.CW pdfview
+macro,
+.XR docview ), (
+the
+.CW pdfinfo
+macro,
+.XR docinfo ), (
+and the
+.CW pdfhref
+macro, when used to create a document outline,
+.XR add-outline ), (
+do not immediately write their
+.CW pdfmark
+output to the \*[PostScript] data stream;
+instead, they cache their output, in a
+.CW groff
+diversion, in the case of the
+.CW pdfview
+and
+.CW pdfinfo
+macros, or in an ordered collection of strings and numeric registers,
+in the case of the document outline,
+until a more appropriate time for copying it out.
+In the case of
+.CW pdfview
+and
+.CW pdfinfo
+\(lqmeta\(hydata\(rq,
+this \(lqmore appropriate time\(rq is explicitly chosen by the user;
+in the case of document outline data,
+.EM some
+cached data may be implicitly written out as the document outline is compiled,
+but there will
+.EM always
+be some remaining data, which must be explicitly flushed out, before the
+.CW groff
+formatting process is allowed to complete.
+.LP
+To allow the user to choose when cached
+.CW pdfmark
+data is to be flushed to the output stream, the
+.CW pdfmark
+macro package provides the
+.CW pdfsync
+macro, (to synchronize the cache and output states).
+In its simplest form, it is invoked without arguments, i.e.
+.QP
+.fam C
+.B .pdfsync
+.LP
+This form of invocation ensures that
+.EM both
+the \(lqmeta\(hydata cache\(rq, containing
+.CW pdfview
+and
+.CW pdfinfo
+data,
+.EM and
+the \(lqoutline cache\(rq,
+containing any previously uncommitted document outline data,
+are flushed; ideally, this should be included in a
+.CW groff
+\(lqend macro\(rq, to ensure that
+.EM both
+caches are flushed, before
+.CW groff
+terminates.
+.LP
+Occasionally,
+it may be desirable to flush either the \(lqmeta\(hydata cache\(rq,
+without affecting the \(lqoutline cache\(rq, or vice\(hyversa,
+at a user specified time, prior to reaching the end of the document.
+This may be accomplished, by invoking the
+.CW pdfsync
+macro with an argument, i.e.
+.QP
+.fam C
+.B ".pdfsync M"
+.LP
+to flush only the \(lqmeta\(hydata cache\(rq, or
+.QP
+.fam C
+.B ".pdfsync O"
+.LP
+to flush only the \(lqoutline cache\(rq.
+.LP
+The \(lqmeta\(hydata cache\(rq can normally be safely flushed
+in this manner, at any time
+.EM after
+output of the first page has started;
+(it may cause formatting problems,
+most notably the appearance of unwanted white space, if flushed earlier,
+or indeed, if flushed immediately after a page transition,
+but before the output of the content on the new page has commenced).
+Caution is required, however, when explicitly flushing the
+\(lqoutline cache\(rq, since if the outline is to be
+subsequently extended, then the first outline entry after flushing
+.EM must
+be specified at level 1.
+Nevertheless, such explicit flushing may occasionally be necessary;
+for example, the
+.CW TC
+macro in the
+.CW spdf.tmac
+package,
+.XR using-spdf ), (
+invokes
+.CW ".pdfsync\ O" \(rq \(lq
+to ensure that the outline for the \(lqbody\(rq section of the document
+is terminated,
+.EM before
+it commences the formatting of the table of contents section.
+.bp
+.
+.NH 1
+.XN -N pdf-layout -- PDF Document Layout
+.LP
+The
+.CW pdfmark
+macros described in the preceding section,
+.XR pdf-features ), (
+provide no inherent document formatting capability of their own.
+However,
+they may be used in conjunction with any other
+.CW groff
+macro package of the user's choice,
+to add such capability.
+.LP
+In preparing this document, the standard
+.CW ms
+macro package, supplied as a component of the GNU Troff distribution,
+has been employed.
+To facilitate the use of the
+.CW pdfmark
+macros with the
+.CW ms
+macros,
+a binding macro package,
+.CW spdf.tmac ,
+has been created.
+The use of this binding macro package is described in the following section,
+.XR using-spdf ); (
+it may also serve as an example to users of other standard
+.CW groff
+macro packages,
+as to how the
+.CW pdfmark
+macros may be employed with their chosen primary macro package.
+.
+.NH 2
+.XN -S -N using-spdf -- Using \F[C]pdfmark\F[] Macros with the \F[C]ms\F[] Macro Package
+.LP
+The use of the binding macro package,
+.CW spdf.tmac ,
+allows for the use of the
+.CW pdfmark
+macros in conjunction with the
+.CW ms
+macros,
+simply by issuing a
+.CW groff
+command of the form\**
+.FS
+Once again,
+.pdfhref L -D pdf-features-fn -- as noted in footnote\*{\n[pdf-features-fn]\*}
+to
+.XR-NO-PREFIX pdf-features ,
+do not specify any
+.CW -T \^\c
+.CWI dev
+option,
+other than
+.CW -T \^\c
+.CW ps ,
+or
+.CW -T \^\c
+.CW pdf ;
+specify
+.CW -T \^\c
+.CW pdf ,
+if you wish to avoid the conversion of \*[PostScript] output to PDF,
+which will be required if you specify
+.CW -T \^\c
+.CW ps ,
+or if you omit the
+.CW -T \^\c
+.CWI dev
+option entirely.
+.FE
+.QP
+.fam C
+groff [-Tps\h'0.2p'|\h'0.2p'-Tpdf] [-m\F[]\|\|\FC\c
+.B spdf
+.I options \F[]\|\|\FC\c [-
+.I file \F[]\|\|\FC\c "...] "
+\&...
+.LP
+When using the
+.CW spdf.tmac
+package, the
+.CW groff
+input files may be marked up using any of the standard
+.CW ms
+macros to specify document formatting,
+while PDF features may be added,
+using any of the
+.CW pdfmark
+macros described previously,
+.XR pdf-features ). (
+Additionally,
+.CW spdf.tmac
+defines a number of convenient extensions to the
+.CW ms
+macro set, to better accomodate the use of PDF features within the
+.CW ms
+formatting framework,
+and to address a number of
+.CW ms
+document layout issues,
+which require special handling when producing PDF documents.
+These additional macros,
+and the issues they are intended to address,
+are described below.
+.
+.NH 3
+.XN -S -- \F[C]ms\F[] Section Headings in PDF Documents
+.LP
+Traditionally,
+.CW ms
+provides the
+.CW NH
+and
+.CW SH
+macros, to specify section headings.
+However,
+there is no standard mechanism for generating a
+table of contents entry based on the text of the section heading;
+neither is there any recognized standard method for establishing a
+cross reference link to the section.
+.LP
+To address this
+.CW ms
+limitation,
+.CW spdf.tmac
+defines the
+.CW XN
+macro,
+.XR xn-macro ), (
+to be used in conjunction with the
+.CW NH
+macro.
+.
+.NH 4
+.XN -S -N xn-macro -- The \F[C]XN\F[] Macro
+.bp
+.
+.NH 1
+.XN The PDF Publishing Process
+.
+.NH 2
+.XN -N do-xref -- Resolving Cross References
+.
+.NH 3
+.XN -N create-map -- Creating a Document Reference Map
+.
+.NH 3
+.XN -N import-map -- Deploying a Document Reference Map
+.TC
+.\" Local Variables:
+.\" mode: nroff
+.\" End:
+.\" vim: filetype=groff:
diff --git a/contrib/pdfmark/pdfmark.tmac b/contrib/pdfmark/pdfmark.tmac
new file mode 100644
index 0000000..5f664f2
--- /dev/null
+++ b/contrib/pdfmark/pdfmark.tmac
@@ -0,0 +1,1953 @@
+.ig
+
+pdfmark.tmac
+
+Copyright (C) 2004-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+Author's Note
+=============
+
+While I have written this macro package from scratch, much of my
+inspiration has come from discussion on the groff mailing list
+(mailto:groff@gnu.org). I am particularly indebted to:
+
+ Kees Zeelenberg, for an earlier macro package he posted,
+ a study of which helped me to get started.
+
+ Carlos J. G. Duarte and Werner Lemberg, whose discussion
+ on computation of the bounding boxes for link "hot-spots"
+ forms the basis of such computations in this package.
+..
+.if !\n(.g .ab These pdfmark macros require groff.
+.\"
+.\" Check if we have already been loaded -- do not reload
+.if d pdfmark .nx
+.\"
+.\" ======================================================================
+.\" Module PDFMARK: Insert Arbitrary PDFMARK Code in the Postscript Stream
+.\" ======================================================================
+.\"
+.\" PDFMARK output may be disabled, by zeroing the PDFOPMODE register,
+.\" ( which mimics a more generic OPMODE, if it is defined ).
+.\"
+.if rOPMODE .aln PDFOPMODE OPMODE
+.\"
+.\" but if OPMODE wasn't defined,
+.\" then make the default PDFMARK mode ENABLED.
+.\"
+.if !rPDFOPMODE .nr PDFOPMODE 1
+.\"
+.\" PDFMARK output must be constrained to a maximum line length limit,
+.\" for strict compliance with the Postscript DSC. This limit is defined
+.\" in register "PDFMARK.FOLDWIDTH.MAX". This is user definable, up to a
+.\" ceiling value of 255, which is also its default value; this limit
+.\" is enforced for each PDFMARK, by macro "pdf*pdfmark.limit".
+.\"
+.de pdf*pdfmark.limit
+.\" ----------------------------------------------------------------
+.\" Usage:
+.\" .pdf*pdfmark.limit REGISTER-NAME DEFAULT-MAXIMUM-VALUE
+.\" ----------------------------------------------------------------
+.\"
+.\" If a register named REGISTER-NAME has not been defined, then
+.\" define it now, with default value = DEFAULT-MAXIMUM-VALUE.
+.\"
+.if !r\\$1 .nr \\$1 \\$2
+.\"
+.\" But when it has already been defined, ensure that its value does
+.\" not exceed DEFAULT-MAXIMUM-VALUE; if value does exceed this ceiling,
+.\" then redefine it, to enforce the limit.
+.\"
+.if (\\n[\\$1] > \\$2) .nr \\$1 \\$2
+..
+.\" The "pdfmark" macro is responsible for emitting the appropriate
+.\" Postscript code.
+.\"
+.de pdfmark
+.\" ----------------------------------------------------------------
+.\" Usage:
+.\" .pdfmark text of pdfmark instruction
+.\" Macro supplies the required opening "[" and closing "pdfmark"
+.\" operator; DO NOT include them in the instruction text!
+.\" ----------------------------------------------------------------
+.\"
+.if \\n[PDFOPMODE] \{\
+.\"
+.\" Strict DSC compliance forbids emission of ps:exec lines which
+.\" exceed 255 characters in length. We will allow the user to specify
+.\" an alternative lesser limit ...
+.\"
+. pdf*pdfmark.limit PDFMARK.FOLDWIDTH.MAX 255
+.\"
+.\" ... and we will also support a second lesser limit, which will be
+.\" applied to literal text parenthetically embedded within the PDFMARK.
+.\"
+. pdf*pdfmark.limit PDFMARK.FOLDWIDTH \\n[PDFMARK.FOLDWIDTH.MAX]
+.\"
+.\" We will push out the entire PDFMARK in one chunk, provided it fits
+.\" within this limit.
+.\"
+. length pdf:length "[\\$* pdfmark\"
+. ie !(\\n[pdf:length] > \\n[PDFMARK.FOLDWIDTH]) \{\
+. \"
+. \" This PDFMARK is suitable for single chunk output ...
+. \"
+. nop \!x X ps:exec [\\$* pdfmark
+. \}
+. el \{\
+. \" ... but, when the limit would be violated, then we must
+. \" recompose the specified PDFMARK, spreading it over as many
+. \" continuation lines as are necessary.
+. \"
+. als pdf*compose pdf*compose.first
+. while \\n(.$ \{\
+. pdf*compose \\$1
+. shift
+. \}
+. \"
+. \" Complete the PDFMARK recomposition, by appending a
+. \" "pdfmark" operator, and push it out to the intermediate
+. \" output stream, (excluding its final line break).
+. \"
+. pdf*compose pdfmark
+. pdf*pdfmark.dispatch
+. \"
+. \" And clean up when done.
+. \"
+. rm pdf*compose pdf*pdfmark.post
+. rm pdf:compose.test pdf:composed.literal
+. \}
+. rr pdf:length
+. \}
+..
+.\" When a PDFMARK exceeds the specified output record length limit,
+.\" then we decompose it, subsequently using the dynamically overloaded
+.\" macro, "pdf*compose", to reassemble it into as many continuation
+.\" records as it may require.
+.\"
+.\" Each call to "pdf*compose" uses macro "pdf*length.increment" to
+.\" keep track of the current output record length, so ensuring that
+.\" the active maximum length limit is not violated.
+.\"
+.de pdf*length.increment
+.\" ----------------------------------------------------------------
+.\" Usage:
+.\" .pdf*length.increment NEXT-ADDITION
+.\" ----------------------------------------------------------------
+.\"
+.ie d pdf:composed.line \
+. length pdf:length "\\*[pdf:composed.line] \\$*\"
+.el .length pdf:length "\\$*\"
+..
+.\" The first call to "pdf*compose" for each PDFMARK is directed
+.\" to "pdf*compose.first"; this initialises the local strings
+.\" and macros used to compose the eventual PDFMARK output.
+.\"
+.de pdf*compose.first
+.\" ----------------------------------------------------------------
+.\" Usage:
+.\" .als pdf*compose pdf*compose.first
+.\" . pdf*compose TOKEN
+.\" ----------------------------------------------------------------
+.\"
+.\" Ensure that the output record accumulator will be initialised
+.\" on posting of the first composed PDFMARK record.
+.\"
+.als pdf*pdfmark.post pdf*pdfmark.post.first
+.\"
+.\" The first token passed to "pdf*compose" should not be a
+.\" literal, but be prepared to handle one, just in case.
+.\"
+.ds pdf:compose.test \\$1
+.substring pdf:compose.test 0 0
+.ie '('\\*[pdf:compose.test]' \{\
+.\"
+.\" We found a literal, even though we didn't expect it;
+.\" if it's a single element literal, we can just handle it
+.\" as if it is a regular token anyway.
+.\"
+. ds pdf:compose.test "\\$\\n(.$\"
+. substring pdf:compose.test -1
+. if !')'\\*[pdf:compose.test]' \{\
+. \"
+. \" But when it is the first of a literal sequence,
+. \" then we need to set up "pdf*compose" to handle it.
+. \"
+. ds pdf:composed.literal "[\\$*\"
+. als pdf*compose pdf*compose.literal
+. \}
+. \}
+.el .ds pdf:compose.test )
+.if ')'\\*[pdf:compose.test]' \{\
+.\"
+.\" In the normal case, we start each new PDFMARK with a
+.\" regular token; save it as the first in the composed output
+.\" line sequence, and set up "pdf*compose" to collect
+.\" the rest of the sequence.
+.\"
+. ds pdf:composed.line "[\\$*\"
+. als pdf*compose pdf*compose.next
+. \}
+..
+.\" Subsequent calls to "pdf*compose", while collecting
+.\" regular tokens, are then directed to "pdf*compose.next".
+.\"
+.de pdf*compose.next
+.\" ----------------------------------------------------------------
+.\" Usage:
+.\" .als pdf*compose pdf*compose.next
+.\" . pdf*compose TOKEN
+.\" ----------------------------------------------------------------
+.\"
+.\" This first checks to ensure that the supplied token really is
+.\" a regular token, and not the first element in a literal.
+.\"
+.ds pdf:compose.test \\$1
+.substring pdf:compose.test 0 0
+.ie '('\\*[pdf:compose.test]' \{\
+.\"
+.\" The supplied token represents the first element of a literal,
+.\" but it may be a single element literal, which we simply handle
+.\" as a regular token anyway.
+.\"
+. ds pdf:compose.test "\\$\\n(.$\"
+. substring pdf:compose.test -1
+. if !')'\\*[pdf:compose.test]' \{\
+. \"
+. \" The supplied token is the first of a sequence of elements
+. \" which collectively define a literal, so start collecting a
+. \" composite literal token, and change the "pdf*compose"
+. \" state, to collect and append the remaining elements.
+. \"
+. ds pdf:composed.literal "\\$*\"
+. als pdf*compose pdf*compose.literal
+. \}
+. \}
+.el .ds pdf:compose.test )
+.if ')'\\*[pdf:compose.test]' \{\
+.\"
+.\" The supplied token IS a regular token; add it, but ensure that
+.\" the active maximum record length limit is honoured.
+.\"
+. pdf*length.increment "\\$*\"
+. ie (\\n[pdf:length] > \\n[PDFMARK.FOLDWIDTH.MAX]) \{\
+. \"
+. \" Adding this token would cause the current PDFMARK record, in
+. \" groff's intermediate output file, to overflow the active record
+. \" length limit, so post the current record and start another.
+. \"
+. pdf*pdfmark.dispatch
+. ds pdf:composed.line "\\$*\"
+. \}
+. el \{\
+. \"
+. \" This token will fit in the current PDFMARK record, without
+. \" violating the active length limit, so simply add it.
+. \"
+. ie d pdf:composed.line .as pdf:composed.line " \\$*\"
+. el .ds pdf:composed.line "\\$*\"
+. \}
+. \}
+..
+.\" While assembling a multiple token literal sequence into a single
+.\" literal token, successive calls to "pdf*compose" are directed
+.\" to "pdf*compose.literal".
+.\"
+.de pdf*compose.literal
+.\" ----------------------------------------------------------------
+.\" Usage:
+.\" .als pdf*compose pdf*compose.literal
+.\" . pdf*compose TOKEN
+.\" ----------------------------------------------------------------
+.\"
+.\" First, check to ensure that the current token can be appended to
+.\" the accumulated literal, without extending it beyond the maximum
+.\" allowed literal token length.
+.\"
+.length pdf:length "\\*[pdf:composed.literal] \\$*\"
+.ie (\\n[pdf:length] > (\\n[PDFMARK.FOLDWIDTH] - 2)) \{\
+.\"
+.\" If it has grown too long, then it must be folded across two
+.\" physical PDFMARK output records, so check if we can accommodate
+.\" the portion collected so far within the current output record.
+.\"
+. pdf*length.increment "\\*[pdf:composed.literal]\"
+. if (\\n[pdf:length] > (\\n[PDFMARK.FOLDWIDTH.MAX] - 2)) \{\
+. \"
+. \" The current output record CAN'T accommodate the currently
+. \" composed portion of the literal, so flush out the current
+. \" record, to make way for the accumulated literal, and mark
+. \" the dispatch mode as "wrapped", for the fragments of the
+. \" folded literal string, which are to follow.
+. \"
+. pdf*pdfmark.dispatch
+. ds pdf*pdfmark.dispatch.wrapped
+. \}
+. ie d pdf:composed.line \{\
+. \"
+. \" If we DIDN'T need to flush the current output record,
+. \" then we can simply append the accumulated literal to it...
+. \"
+. as pdf:composed.line " \\*[pdf:composed.literal]\"
+. \}
+. el \{\
+. \"
+. \" otherwise, when the current record has been flushed, or is
+. \" empty, then we promote the accumulated literal, to make it
+. \" the next output record...
+. \"
+. rn pdf:composed.literal pdf:composed.line
+. \}
+.\"
+.\" Now, to complete the fold, flush out any accumulated partial
+.\" output record, and continue accumulating the literal, starting
+.\" with the current token.
+.\"
+. pdf*pdfmark.dispatch
+. ds pdf:composed.literal "\\$*\"
+. \}
+.el \{\
+.\"
+.\" Alternatively, when we HAVEN'T identified a need to fold the
+.\" current output record, then we simply append the current token
+.\" to the accumulated literal token buffer string.
+.\"
+. as pdf:composed.literal " \\$*\"
+. \}
+.\"
+.\" Having ensured that we have sufficient space, in which to
+.\" append the current token to the currently accumulated literal,
+.\" we check its rightmost character, to see if is the closing
+.\" parenthesis, which completes the literal.
+.\"
+.ds pdf:compose.test \\$\\n(.$
+.substring pdf:compose.test -1
+.if ')'\\*[pdf:compose.test]' \{\
+.\"
+.\" The literal has been completely collected, so we may now append
+.\" it to the current output record, as a single literal token, but
+.\" subject to the constraint that it must not extend the output
+.\" record beyond the maximum permitted length.
+.\"
+. pdf*length.increment "\\*[pdf:composed.literal]\"
+. ie (\\n[pdf:length] > \\n[PDFMARK.FOLDWIDTH.MAX]) \{\
+. \"
+. \" So, when the literal cannot be accommodated within the maximum
+. \" length constraint, then we flush the current record, and start
+. \" a new one, with the literal token as its first entry.
+. \"
+. pdf*pdfmark.dispatch
+. rn pdf:composed.literal pdf:composed.line
+. \}
+. el \{\
+. \"
+. \" When the literal CAN be accommodated within the maximum length
+. \" constraint, then ...
+. \"
+. ie d pdf:composed.line \{\
+. \"
+. \" When an output record has already been instantiated, we
+. \" append the literal token to it, and discard the accumulator
+. \" string, which is no longer required.
+. \"
+. as pdf:composed.line " \\*[pdf:composed.literal]\"
+. rm pdf:composed.literal
+. \}
+. el \{\
+. \"
+. \" But when no output record yet exists, then we simply
+. \" reassign the accumulated literal token, to instantiate a
+. \" new output record.
+. \"
+. rn pdf:composed.literal pdf:composed.line
+. \}
+. \}
+.\"
+.\" Finally, since we have completed the accumulation of the literal, we
+.\" revert to the "unwrapped" mode of operation for "pdf*pdfmark.dispatch",
+.\" and restore the normal "pdf*compose" action, for collection of the next
+.\" token (if any).
+.\"
+. rm pdf*pdfmark.dispatch.wrapped
+. als pdf*compose pdf*compose.next
+. \}
+..
+.\" While composing a multiple record PDFMARK, each composed record
+.\" must be added to the collection, whenever the partially composed
+.\" output record has been filled; this is handled when necessary,
+.\" by calling the "pdf*pdfmark.dispatch" macro.
+.\"
+.de pdf*pdfmark.dispatch
+.\" ----------------------------------------------------------------
+.\" Usage:
+.\" .pdf*pdfmark.dispatch
+.\" ----------------------------------------------------------------
+.\"
+.if d pdf:composed.line \{\
+.\"
+.\" This is simply a wrapper around the overloaded "pdf*pdfmark.post"
+.\" macro, ensuring that an output record has actually been collected
+.\" before attempting to post it; it then cleans up after posting, to
+.\" ensure that each collected record is posted only once.
+.\"
+. if d pdf*pdfmark.dispatch.wrapped \{\
+. \"
+. \" When dispatching an excessively long literal string, which
+. \" must be wrapped over multiple records, this mode is active
+. \" for all but the closing record; we must escape the newline
+. \" at the end of each such unclosed literal record.
+. \"
+. as pdf:composed.line " \\\\\\\\\"
+. \}
+. pdf*pdfmark.post
+. rm pdf:composed.line
+. \}
+..
+.\" For each PDFMARK, the first call of "pdf*pdfmark.post" is directed
+.\" to the "pdf*pdfmark.post.first" macro; this initialises the state
+.\" of the "pdf:composed" macro, for assembly of a new PDFMARK.
+.\"
+.de pdf*pdfmark.post.first
+. nop \!x X ps:exec \\*[pdf:composed.line]
+.\"
+.\" Subsequent calls to "pdf*pdfmark.post" are redirected to the
+.\" alternative "pdf*pdfmark.post.next" macro, which simply appends
+.\" additional PDFMARK records to the "pdf:composed" macro.
+.\"
+.als pdf*pdfmark.post pdf*pdfmark.post.next
+..
+.de pdf*pdfmark.post.next
+. nop \!+\\*[pdf:composed.line]
+..
+.\" "pdf*end" is a dummy macro. It is required to mark the end
+.\" of each individual fragment which is added to "pdf:composed";
+.\" other than this, it does nothing.
+.\"
+.de pdf*end
+..
+.\"
+.\" Some supporting macros defer actual pdfmark output until an
+.\" appropriate time for it to be written; the "pdfsync" macro
+.\" provides a mechanism for flushing such deferred output;
+.\" it should be called from an end macro, and at any other time
+.\" when it may be deemed necessary to flush pdfmark context.
+.\"
+.de pdfsync
+.\" ----------------------------------------------------------------
+.\" Usage:
+.\" .pdfsync buffer ...
+.\" Arguments indicate which "buffer(s)" to flush:
+.\" O -> bookmark (outline) cache
+.\" M -> document metadata diversion
+.\" If no argument, flush ALL buffers
+.\" ----------------------------------------------------------------
+.\"
+.ie \\n(.$ \{\
+. while \\n(.$ \{\
+. if '\\$1'O' .pdf:bm.sync 1
+. if '\\$1'M' \{\
+. if dpdf:metadata .pdf:metadata
+. rm pdf:metadata
+. \}
+. shift
+. \}
+. \}
+.el .pdfsync O M
+..
+.\"
+.\" some helper functions ...
+.\"
+.\" "pdf:warn" and "pdf:error" write diagnostic messages to stderr
+.\"
+.de pdf:warn
+.\" ----------------------------------------------------------
+.\" Usage:
+.\" .pdf:warn text of message
+.\" ----------------------------------------------------------
+.\"
+.tm \\n(.F:\\n(.c: macro warning: \\$*
+..
+.de pdf:error
+.\" ----------------------------------------------------------
+.\" Usage:
+.\" .pdf:error text of message
+.\" ----------------------------------------------------------
+.\"
+.tm \\n(.F:\\n(.c: macro error: \\$*
+..
+.\" "pdf:pop", assisted by "pdf*pop", allows us to retrieve register,
+.\" or string values, from a string masquerading as a data queue,
+.\" or as a stack.
+.\"
+.de pdf:pop
+.\" ----------------------------------------------------------------
+.\" Usage:
+.\" .pdf:pop <type> <to-name> <from-name>
+.\" $1 = nr for numeric register, ds for string
+.\" $2 = name of register or string to be assigned
+.\" $3 = name of string, from which data is to be retrieved
+.\" ----------------------------------------------------------------
+.\"
+.pdf*pop \\$* \\*[\\$3]
+..
+.de pdf*pop
+.ds pdf:stack \\$3
+.\\$1 \\$2 \\$4
+.shift 4
+.ie \\n(.$ .ds \\*[pdf:stack] \\$*
+.el .rm \\*[pdf:stack]
+.rm pdf:stack
+..
+.\"
+.\"
+.\" ===========================================================
+.\" Module PDFINFO: Insert MetaData Entries into a PDF Document
+.\" ===========================================================
+.\"
+.\" N.B.
+.\" Output from the macros in this module is deferred, until
+.\" subsequent invocation of .pdfsync, or .pdfexit
+.\"
+.\" ."pdfinfo" provides a general purpose form of metadata entry ...
+.\" it allows arbitrary text to be associated with any specified
+.\" metadata field name.
+.\"
+.de pdfinfo
+.\" -------------------------------------------------------------------
+.\" Usage:
+.\" .pdfinfo /FieldName field content ...
+.\" Examples:
+.\" .pdfinfo /Title A PDF Document
+.\" .pdfinfo /Author Keith Marshall
+.\" -------------------------------------------------------------------
+.\"
+.ds pdf:meta.field \\$1
+.shift
+.da pdf:metadata
+\!.pdfmark \\*[pdf:meta.field] (\\$*) /DOCINFO
+.di
+.rm pdf:meta.field
+..
+.\"
+.\" Macro "pdfview" defines a special form of metadata entry ...
+.\" it uses the /DOCVIEW pdfmark, to specify the initial (default) view,
+.\" when the document is opened.
+.\"
+.de pdfview
+.\" -------------------------------------------------------------------
+.\" Usage:
+.\" .pdfview view parameters ...
+.\" Examples:
+.\" .pdfview /PageMode /UseOutlines
+.\" .pdfview /Page 2 /View [/FitH \n(.p u]
+.\" -------------------------------------------------------------------
+.\"
+.da pdf:metadata
+\!.pdfmark \\$* /DOCVIEW
+.di
+..
+.\"
+.\"
+.\" =====================================================================
+.\" Module PDFNOTE: Insert "Sticky Note" Style Comments in a PDF Document
+.\" =====================================================================
+.\"
+.\" "PDFNOTE.WIDTH" and "PDFNOTE.HEIGHT" set the preferred size for
+.\" display of the "sticky note" pane, when opened. Acrobat Reader
+.\" seems not to honour these -- perhaps GhostScript doesn't encode
+.\" them correctly! Anyway, let's set some suitable default values,
+.\" in case the user has a set up which does work as advertised.
+.\"
+.nr PDFNOTE.WIDTH 3.5i
+.nr PDFNOTE.HEIGHT 2.0i
+.\"
+.\" "pdf:bbox" defines the expression used to set the size and location
+.\" of the bounding rectangle for display of notes and link "hot-spots".
+.\" This is defined, such that a note is placed at troff's current text
+.\" position on the current page, with its displayed image size defined
+.\" by the "PDFNOTE.WIDTH" and "PDFNOTE.HEIGHT" registers, while the
+.\" bounds for a link "hot-spot" are matched to the text region which
+.\" defines the "hot-spot".
+.\"
+.ds pdf:bbox \\n[pdf:llx] u \\n[pdf:lly] u \\n[pdf:urx] u \\n[pdf:ury] u
+.\"
+.\" Getting line breaks into the text of a PDFNOTE is tricky -- we need
+.\" to get a "\n" into the Postscript stream, but three levels of "\" are
+.\" swallowed, when we invoke "pdfnote". The following definition of "PDFLB",
+.\" (for LineBreak), is rather ugly, but does allow us to use
+.\"
+.\" .pdfnote Some text.\*[PDFLB]Some more text, on a new line.
+.\"
+.ds PDFLB \\\\\\\\\\\\\\\\n
+.\"
+.de pdfnote
+.\" ----------------------------------------------------------------------
+.\" Usage:
+.\" .pdfnote [-T "Text for Title"] Text of note ...
+.\" ----------------------------------------------------------------------
+.\"
+.if \\n[PDFOPMODE] \{\
+.\"
+.\" First, compute the bounding rectangle,
+.\" for this PDFNOTE instance
+.\"
+. mk pdf:ury
+. nr pdf:llx \\n(.k+\\n(.o+\\n[.in]
+. nr pdf:lly \\n[pdf:ury]-\\n[PDFNOTE.HEIGHT]
+. nr pdf:urx \\n[pdf:llx]+\\n[PDFNOTE.WIDTH]
+. ds pdf:note.instance /Rect [\\*[pdf:bbox]]
+.\"
+.\" Parse any specified (recognisable) PDFNOTE options
+.\"
+. while dpdf:note\\$1 \{\
+. pdf:note\\$1 \\$@
+. shift \\n[pdf:note.argc]
+. \}
+.\"
+.\" Emit the note, and clean up
+.\"
+. pdfmark \\*[pdf:note.instance] /Contents (\\$*) /ANN
+. rm pdf:note.instance
+. rr pdf:note.argc
+. \}
+..
+.de pdf:note-T
+.nr pdf:note.argc 2
+.as pdf:note.instance " /Title (\\$2)
+..
+.\"
+.\"
+.\" =====================================================================
+.\" Module PDFBOOKMARK: Add an Outline Reference in the PDF Bookmark Pane
+.\" =====================================================================
+.\"
+.\" "PDFBOOKMARK.VIEW" controls how the document will be displayed,
+.\" when the user selects a bookmark. This default setting will fit
+.\" the page width to the viewing window, with the bookmarked entry
+.\" located at the top of the viewable area.
+.\"
+.ds PDFBOOKMARK.VIEW /FitH \\n[PDFPAGE.Y] u
+.\"
+.\" "PDFOUTLINE.FOLDLEVEL" controls how the document outline will be
+.\" displayed. It is a number, defining the maximum heading level
+.\" which will be visible, without outline expansion by the user, in
+.\" the initial view of the document outline. Assuming that no sane
+.\" document will ever extend to 10,000 levels of nested headings,
+.\" this initial default value causes outlines to be fully expanded.
+.\"
+.nr PDFOUTLINE.FOLDLEVEL 10000
+.\"
+.\" The actual job of creating an outline reference
+.\" is performed by the "pdfbookmark" macro.
+.\"
+.de pdfbookmark
+.\" ------------------------------------------------------------------
+.\" Usage:
+.\" .pdfbookmark [-T tag] level "Text of Outline Entry"
+.\"
+.\" $1 = nesting level for bookmark (1 is top level)
+.\" $2 = text for bookmark, (in PDF viewer bookmarks list)
+.\" $3 = suffix for PDF internal bookmark name (optional)
+.\" ------------------------------------------------------------------
+.\"
+.ie '\\n(.z'' \{\
+.\"
+.\" When we are at the top diversion level, i.e. actually emitting text
+.\" to the output device stream, then we compute the location of, and
+.\" plant this bookmark immediately.
+.\"
+. if \\n[PDFOPMODE] \{\
+. \"
+. \" Make the bookmark name "untagged" by default,
+. \" then parse any specified options, to set a "tag", if required
+. \"
+. ds pdf:href-T
+. while dpdf:href.opt\\$1 \{\
+. pdf:href.opt\\$1 \\$@
+. shift \\n[pdf:href.argc]
+. \}
+. rr pdf:href.argc
+. \"
+. \" If we found "--" to mark the end of the options, discard it
+. \"
+. if '\\$1'--' .shift
+. \"
+. \" Synchronise the bookmark cache
+. \" to the requested bookmark nesting level
+. \"
+. pdf:bm.sync \\$1
+. shift
+. \"
+. \" Increment the bookmark serialisation index
+. \" in order to generate a uniquely serialised bookmark name,
+. \" ( which we return in the string "PDFBOOKMARK.NAME" ),
+. \" and insert this bookmark into the cache
+. \"
+. pdf:href.sety
+. nr pdf:bm.nr +1
+. ds PDFBOOKMARK.NAME pdf:bm\\n[pdf:bm.nr]\\*[pdf:href-T]
+. ds pdf:bm\\n[pdf:bm.nr] /Dest /\\*[PDFBOOKMARK.NAME]
+. pdfmark \\*[pdf:bm\\n[pdf:bm.nr]] /View [\\*[PDFBOOKMARK.VIEW]] /DEST
+. as pdf:bm\\n[pdf:bm.nr] " /Title (\\$*)
+. pdf:href.options.clear
+. rr PDFPAGE.Y
+. \}
+. \}
+.el \{\
+.\"
+.\" But when we are collecting a diversion which will be written out later,
+.\" then we must defer bookmark placement, until we emit the diversion.
+.\" (don't rely on $0 == pdfbookmark here; it may be a volatile alias).
+.\"
+. nop \!.pdfbookmark \\$@
+. \}
+..
+.\"
+.\" Macro "pdf:bm.sync" is called for each bookmark created,
+.\" to establish a cache entry at the appropriate nesting level.
+.\" It will flush ALL previous cache content, when called to
+.\" add a new bookmark at level 1, or if simply called at
+.\" level 1, without adding any bookmark.
+.\"
+.de pdf:bm.sync
+.\" ------------------------------------------------------------------
+.\" Usage:
+.\" .pdf:bm.sync level
+.\" $1 = nesting level of current bookmark, or 1 to flush cache
+.\" ------------------------------------------------------------------
+.\"
+.\" First validate the bookmark nesting level
+.\" adjusting it if required
+.\"
+.if \\$1>\\n[pdf:bm.nl] .nr pdf:bm.nl +1
+.ie \\$1>\\n[pdf:bm.nl] \{\
+. pdf:warn adjusted level \\$1 bookmark; should be <= \\n[pdf:bm.nl]
+. \}
+.el .nr pdf:bm.nl \\$1
+.if \\n[pdf:bm.nl]<1 \{\
+. pdf:warn bad arg (\\$1) in \\$0 \\$1; \\$0 1 forced
+. nr pdf:bm.nl 1
+. \}
+.\"
+.\" If reverting from a higher to a lower nesting level,
+.\" cyclicly adjust cache counts for each pending higher level
+.\"
+.if \\n[pdf:bm.lc]>=\\n[pdf:bm.nl] \{\
+. nr pdf:bm.lc +1
+. if !rpdf:bm.c\\n[pdf:bm.lc].c .nr pdf:bm.c\\n[pdf:bm.lc].c 0
+. while \\n[pdf:bm.lc]>\\n[pdf:bm.nl] \{\
+. as pdf:bm.c\\n[pdf:bm.lc] " \\n[pdf:bm.c\\n[pdf:bm.lc].c]
+. rr pdf:bm.c\\n[pdf:bm.lc].c
+. nr pdf:bm.lc -1
+. \}
+. \}
+.\"
+.\" Update the cache level,
+.\" flushing when we are at level 1
+.\"
+.nr pdf:bm.lc \\n[pdf:bm.nl]
+.ie \\n[pdf:bm.nl]=1 \{\
+. while \\n[pdf:bm.ic]<\\n[pdf:bm.nr] .pdf:bm.emit 0
+. rr pdf:bm.rc
+. \}
+.el .nr pdf:bm.c\\n[pdf:bm.nl].c +1
+..
+.\" Macro "pdf:bm.emit" is called, when the cache is at level 1.
+.\" This flushes ALL pending bookmarks from the cache, i.e. the
+.\" preceding level 1 bookmark, and any nested dependents,
+.\" which it may have.
+.\"
+.de pdf:bm.emit
+.\" ------------------------------------------------------------------
+.\" Usage:
+.\" .pdf:bm.emit flag
+.\" $1 = reference counting flag, used to control recursion
+.\" ------------------------------------------------------------------
+.\"
+.\" First check for nested dependents,
+.\" and append the "dependent count" to the bookmark, as required.
+.\"
+.nr pdf:bm.ic +1
+.nr pdf:bm.lc +1
+.pdf:pop nr pdf:bm.rc pdf:bm.c\\n[pdf:bm.lc]
+.if \\n[pdf:bm.rc] \{\
+. ds pdf:bm.fold
+. if \\n[pdf:bm.lc]>\\n[PDFOUTLINE.FOLDLEVEL] .ds pdf:bm.fold -
+. as pdf:bm\\n[pdf:bm.ic] " /Count \\*[pdf:bm.fold]\\n[pdf:bm.rc]
+. rm pdf:bm.fold
+. \}
+.pdfmark \\*[pdf:bm\\n[pdf:bm.ic]] /OUT
+.rm pdf:bm\\n[pdf:bm.ic]
+.\"
+.\" For ALL dependents, if any,
+.\" recursively flush out any higher level dependents,
+.\" which they themselves may have
+.\"
+.while \\n[pdf:bm.rc] \{\
+. nr pdf:bm.rc -1
+. pdf:bm.emit \\n[pdf:bm.rc]
+. \}
+.\"
+.\" Finally,
+.\" unwind the recursive call stack, until we return to the top level.
+.\"
+.nr pdf:bm.rc \\$1
+.nr pdf:bm.lc -1
+..
+.nr pdf:bm.nr 0
+.nr pdf:bm.nl 1
+.nr pdf:bm.lc 0
+.nr pdf:bm.ic 0
+.\"
+.\"
+.\" =============================================================
+.\" Module PDFHREF: Create Hypertext References in a PDF Document
+.\" =============================================================
+.\"
+.\" "PDFHREF.VIEW" controls how the document will be displayed,
+.\" when the user follows a link to a named reference.
+.\"
+.ds PDFHREF.VIEW /FitH \\n[PDFPAGE.Y] u
+.\"
+.\" This default setting will fit the page width to the viewing
+.\" window, with the bookmarked entry located close to the top
+.\" of the viewable area. "PDFHREF.VIEW.LEADING" controls the
+.\" actual distance below the top of the viewing window, where
+.\" the reference will be positioned; 5 points is a reasonable
+.\" default offset.
+.\"
+.nr PDFHREF.VIEW.LEADING 5.0p
+.\"
+.\" Yuk!!!
+.\" PDF view co-ordinates are mapped from the bottom left corner,
+.\" of the page, whereas page printing co-ordinates are mapped
+.\" conventionally, from top left.
+.\"
+.\" Macro "pdf:href.sety" transforms the vertical position of the
+.\" last printed baseline, from the printing co-ordinate domain to
+.\" the PDF view domain.
+.\"
+.de pdf:href.sety
+.\" ----------------------------------------------------------------
+.\" Usage:
+.\" .pdf:href.sety
+.\" ----------------------------------------------------------------
+.\"
+.\" This computation yields the vertical view co-ordinate
+.\" in groff's basic units; don't forget to append grops' "u"
+.\" conversion operator, when writing the pdfmark!
+.\"
+.nr PDFPAGE.Y \\n(.p-\\n(nl+\\n[PDFHREF.VIEW.LEADING]
+..
+.\" When we create a link "hot-spot" ...
+.\" "PDFHREF.LEADING" sets the distance above the top of the glyph
+.\" bounding boxes, in each line of link text, over which the link
+.\" hot-spot will extend, while "PDFHREF.HEIGHT" sets the hot-spot
+.\" height, PER LINE of text occupied by the reference.
+.\"
+.\" Since most fonts specify some leading space within the bounding
+.\" boxes of their glyphs, a better appearance may be achieved when
+.\" NEGATIVE leading is specified for link hot-spots; indeed, when
+.\" the default 10pt Times font is used, -1.0 point seems to be a
+.\" reasonable default value for "PDFHREF.LEADING" -- it may be
+.\" changed, if desired.
+.\"
+.\" "PDFHREF.HEIGHT" is initially set as one vertical spacing unit;
+.\" note that it is defined as a string, so it will adapt to changes
+.\" in the vertical spacing. Changing it is NOT RECOMMENDED.
+.\"
+.nr PDFHREF.LEADING -1.0p
+.ds PDFHREF.HEIGHT 1.0v
+.\"
+.\" PDF readers generally place a rectangular border around link
+.\" "hot-spots". Within text, this looks rather ugly, so we set
+.\" "PDFHREF.BORDER" to suppress it -- the three zeroes represent
+.\" the border parameters in the "/Border [0 0 0]" PDFMARK string,
+.\" and may be changed to any valid form, as defined in Adobe's
+.\" PDFMARK Reference Manual.
+.\"
+.ds PDFHREF.BORDER 0 0 0
+.\"
+.\" "PDFHREF.COLOUR" (note British spelling) defines the colour to
+.\" be used for display of link "hot-spots". This will apply both
+.\" to borders, if used, and, by default to text; however, actual
+.\" text colour is set by "PDFHREF.TEXT.COLOUR", which may be reset
+.\" independently of "PDFHREF.COLOUR", to achieve contrasting text
+.\" and border colours.
+.\"
+.\" "PDFHREF.COLOUR" must be set to a sequence of three values,
+.\" each in the range 0.0 .. 1.0, representing the red, green, and
+.\" blue components of the colour specification in the RGB colour
+.\" domain, which is shared by "groff" and the PDF readers.
+.\"
+.ds PDFHREF.COLOUR 0.35 0.00 0.60
+.defcolor pdf:href.colour rgb \*[PDFHREF.COLOUR]
+.\"
+.\" "PDFHREF.TEXT.COLOUR", on the other hand, is simply defined
+.\" using any "groff" colour name -- this default maps it to the
+.\" same colour value as "PDFHREF.COLOUR".
+.\"
+.ds PDFHREF.TEXT.COLOUR pdf:href.colour
+.\"
+.\" Accommodate users who prefer the American spelling, COLOR, to
+.\" the British spelling, COLOUR.
+.\"
+.als PDFHREF.COLOR PDFHREF.COLOUR
+.als PDFHREF.TEXT.COLOR PDFHREF.TEXT.COLOUR
+.\"
+.\" All PDF "Hypertext" reference capabilities are accessed
+.\" through the "pdfhref" macro
+.\"
+.de pdfhref
+.\" -----------------------------------------------------------------
+.\" Usage:
+.\" .pdfhref <subcommand [options ...] [parameters ...]> ...
+.\" -----------------------------------------------------------------
+.\"
+.if \\n[PDFOPMODE] \{\
+.\"
+.\" Loop over all subcommands specified in the argument list
+.\"
+. while \\n(.$ \{\
+. \"
+. \" Initially, assume each subcommand will complete successfully
+. \"
+. nr pdf:href.ok 1
+. \"
+. \" Initialise -E and -X flags in the OFF state
+. \"
+. nr pdf:href-E 0
+. nr pdf:href-X 0
+. \"
+. \" Handle the case where subcommand is specified as "-class",
+. \" setting up appropriate macro aliases for subcommand handlers.
+. \"
+. if dpdf*href\\$1 .als pdf*href pdf*href\\$1
+. if dpdf*href\\$1.link .als pdf*href.link pdf*href\\$1.link
+. if dpdf*href\\$1.file .als pdf*href.file pdf*href\\$1.file
+. \"
+. \" Repeat macro alias setup
+. \" for the case where the subcommand is specified as "class",
+. \" (without a leading hyphen)
+. \"
+. if dpdf*href-\\$1 .als pdf*href pdf*href-\\$1
+. if dpdf*href-\\$1.link .als pdf*href.link pdf*href-\\$1.link
+. if dpdf*href-\\$1.file .als pdf*href.file pdf*href-\\$1.file
+. \"
+. \" Process one subcommand ...
+. \"
+. ie dpdf*href \{\
+. \"
+. \" Subcommand "class" is recognised ...
+. \" discard the "class" code from the argument list,
+. \" set the initial argument count to swallow all arguments,
+. \" and invoke the selected subcommand handler.
+. \"
+. shift
+. nr pdf:argc \\n(.$
+. pdf*href \\$@
+. \"
+. \" When done,
+. \" discard all arguments actually consumed by the handler,
+. \" before proceeding to the next subcommand (if any).
+. \"
+. shift \\n[pdf:argc]
+. \}
+. el \{\
+. \"
+. \" Subcommand "class" is not recognised ...
+. \" issue a warning, and discard the entire argument list,
+. \" so aborting this "pdfhref" invocation
+. \"
+. pdf:warn \\$0: undefined reference class '\\$1' ignored
+. shift \\n(.$
+. \}
+. \"
+. \" Clean up temporary reference data,
+. \" to ensure it doesn't propagate to any future reference
+. \"
+. rm pdf*href pdf:href.link pdf:href.files
+. rr pdf:href-E pdf:href-X
+. pdf:href.options.clear
+. \}
+. rr pdf:href.ok
+. \}
+..
+.\"
+.\" Macros "pdf:href.flag" and "pdf:href.option"
+.\" provide a generic mechanism for switching on flag type options,
+.\" and for decoding options with arguments, respectively
+.\"
+.de pdf:href.flag
+.\" ----------------------------------------------------------------------
+.\" ----------------------------------------------------------------------
+.nr pdf:href\\$1 1
+.nr pdf:href.argc 1
+..
+.de pdf:href.option
+.\" ----------------------------------------------------------------------
+.\" ----------------------------------------------------------------------
+.ds pdf:href\\$1 \\$2
+.nr pdf:href.argc 2
+..
+.\"
+.\" Valid PDFHREF options are simply declared
+.\" by aliasing option handlers to "pdf:href.option",
+.\" or to "pdf:href.flag", as appropriate
+.\"
+.als pdf:href.opt-A pdf:href.option \" affixed text
+.als pdf:href.opt-D pdf:href.option \" destination name
+.als pdf:href.opt-E pdf:href.flag \" echo link descriptor
+.als pdf:href.opt-F pdf:href.option \" remote file specifier
+.als pdf:href.opt-N pdf:href.option \" reference name
+.als pdf:href.opt-P pdf:href.option \" prefixed text
+.als pdf:href.opt-T pdf:href.option \" bookmark "tag"
+.als pdf:href.opt-X pdf:href.flag \" cross reference
+.\"
+.\" For references to another document file
+.\" we also need to support OS dependent file name specifiers
+.\"
+.als pdf:href.opt-DF pdf:href.option \" /DOSFile specifier
+.als pdf:href.opt-MF pdf:href.option \" /MacFile specifier
+.als pdf:href.opt-UF pdf:href.option \" /UnixFile specifier
+.als pdf:href.opt-WF pdf:href.option \" /WinFile specifier
+.\"
+.\" Macro "pdf:href.options.clear" ensures that ALL option
+.\" argument strings are deleted, after "pdfhref" has completed
+.\" all processing which depends on them
+.\"
+.de pdf:href.options.clear
+.\" -----------------------------------------------------------------
+.\" Usage:
+.\" .pdf:href.options.clear [option ...]
+.\" -----------------------------------------------------------------
+.\"
+.\" When an option list is specified ...
+.\"
+.ie \\n(.$ \{\
+. \"
+. \" then loop through the list,
+. \" deleting each specified option argument string in turn
+. \"
+. while \\n(.$ \{\
+. if dpdf:href-\\$1 .rm pdf:href-\\$1
+. shift
+. \}
+. \}
+.\"
+.\" ... but when no list is specified,
+.\" then recurse, to clear all known option argument strings
+.\"
+.el .pdf:href.options.clear A D F N P T DF MF UF WF
+..
+.\"
+.\" "PDFHREF.INFO" establishes the content of the cross reference
+.\" data record, which is exported via the "stderr" stream, when a
+.\" cross reference anchor is created using a "pdfhref" macro request
+.\" of the form
+.\"
+.\" .pdfhref M -N name -X text ...
+.\"
+.\" .ds PDFHREF.INFO \\*[PDFHREF.NAME] reference data ...
+.\"
+.ds PDFHREF.INFO page \\n% \\$*
+.\"
+.\" Macro "pdf*href-M" is the handler invoked by "pdfhref", when
+.\" called with the "M" reference class specifier, to create a
+.\" named cross reference mark, and to emit a cross reference
+.\" data record, as specified by "PDFHREF.INFO".
+.\"
+.de pdf*href-M
+.\" -----------------------------------------------------------------
+.\" Usage:
+.\" .pdfhref M [-X] [-N name | -D name] [-E] descriptive text ...
+.\" -----------------------------------------------------------------
+.\"
+.\" Initially, declare the -D and -N string options as empty,
+.\" so we avoid warning messages when we try to use them, and find
+.\" that they are undefined.
+.\"
+.ds pdf:href-D
+.ds pdf:href-N
+.\"
+.\" Parse, interpret, and strip any specified options from the
+.\" argument list. (Note that only options with a declared handler
+.\" will be processed; there is no provision for detecting invalid
+.\" options -- anything which is not recognised is assumed to start
+.\" the "descriptive text" component of the argument list).
+.\"
+.while dpdf:href.opt\\$1 \{\
+. pdf:href.opt\\$1 \\$@
+. shift \\n[pdf:href.argc]
+. \}
+.\"
+.\" If we found "--", to mark the end of the options,
+.\" then we should discard it.
+.\"
+.if '\\$1'--' .shift
+.\"
+.\" All PDF reference markers MUST be named. The name may have been
+.\" supplied using the "-N Name" option, (or the "-D Name" option);
+.\" if not, deduce it from the first "word" in the "descriptive text",
+.\" if any, and set the marker -- if we still can't identify the name
+.\" for the destination, then this marker will not be created.
+.\"
+.pdf*href.set \\*[pdf:href-N] \\*[pdf:href-D] \\$1
+.\"
+.\" If we specified a cross reference, with the "-X" option, and the
+.\" reference mark has been successfully created, then we now need to
+.\" write the cross reference info to the STDERR stream
+.\"
+.if \\n[pdf:href-X] .pdf*href.export \\*[PDFHREF.INFO]
+.\"
+.\" Irrespective of whether this marker is created, or not,
+.\" the descriptive text will be copied to the groff output stream,
+.\" provided the "-E" option was specified
+.\"
+.if \\n[pdf:href-E] \&\\$*
+..
+.\"
+.de pdf*href.set
+.\" ----------------------------------------------------------------------
+.\" ----------------------------------------------------------------------
+.pdf*href.map.init
+.ie \\n(.$ \{\
+. \"
+. \" a marker name has been supplied ...
+. \" if we are formatting for immediate output,
+. \" emit PDFMARK code to establish the associated view
+. \"
+. ie '\\n(.z'' \{\
+. pdf:href.sety
+. pdfmark /Dest /\\$1 /View [\\*[PDFHREF.VIEW]] /DEST
+. ds PDFHREF.NAME \\$1
+. rr PDFPAGE.Y
+. \}
+. \"
+. \" but, when formatting a diversion ...
+. \" delay output of the PDFMARK code, until the diversion
+. \" is eventually written out
+. \"
+. el \!.\\$0 \\$@
+. \"
+. \" check if we also need to emit cross reference data
+. \" (caller will do this if "pdf:href-X" is set, but it is
+. \" not necessary, when "pdf:href.map" already exists)
+. \"
+. if dpdf:href.map .nr pdf:href-X 0
+. \}
+.el \{\
+. \" marker is unnamed ...
+. \" issue error message; do not emit reference data
+. \"
+. pdf:warn pdfhref destination marker must be named
+. nr pdf:href-X 0
+. \}
+..
+.de pdf*href.export
+.\"
+.\" Called ONLY by "pdf*href-M",
+.\" this macro ensures that the emission of exported reference data
+.\" is synchronised with the placement of the reference mark,
+.\" especially when the mark is defined within a diversion.
+.\"
+.ie '\\n(.z'' .tm gropdf-info:href \\*[PDFHREF.NAME] \\$*
+.el \!.\\$0 \\$@
+..
+.\"
+.\" Macro "pdf*href-D" is invoked when "pdfhref" is called
+.\" with the "D" reference class specifier; it provides a
+.\" standardised mechanism for interpreting reference data
+.\" exported by the "M" reference class, and may be used
+.\" to directly define external reference data, without the
+.\" use of "M" reference class designators in the source
+.\" document.
+.\"
+.de pdf*href-D
+.ds pdf:href-N
+.\"
+.\" Parse, interpret, and strip any specified options from the
+.\" argument list. (Note that only options with a declared handler
+.\" will be processed; there is no provision for detecting invalid
+.\" options -- anything which is not recognised is assumed to start
+.\" the "descriptive text" component of the argument list).
+.\"
+.while dpdf:href.opt\\$1 \{\
+. pdf:href.opt\\$1 \\$@
+. shift \\n[pdf:href.argc]
+. \}
+.\"
+.\" If we found "--", to mark the end of the options,
+.\" then we should discard it.
+.\"
+.if '\\$1'--' .shift
+.\"
+.ie '\\*[pdf:href-N]'' \{\
+. pdf:warn pdfhref defined reference requires a name
+. \}
+.el \{\
+. ds pdf:href(\\*[pdf:href-N]).info \\$*
+. \}
+..
+.\"
+.\" Macro "pdf*href-F" is invoked when "pdfhref" is called
+.\" with the "F" reference class specifier; it allows the user
+.\" to provide an alternative interpreter macro, which will be
+.\" called when a "PDFHREF.INFO" record is retrieved to define
+.\" the text of a cross reference link "hot spot".
+.\"
+.de pdf*href-F
+.\" ----------------------------------------------------------------
+.\" Usage:
+.\" .pdfhref F [macro-name]
+.\" ----------------------------------------------------------------
+.\"
+.\" Set macro specified by "macro-name" as the format interpreter
+.\" for parsing "PDFHREF.INFO" records; if "macro-name" is omitted,
+.\" or is specified as the reserved name "default", then use the
+.\" default format parser, "pdf*href.format", defined below.
+.\"
+.if '\\$1'default' .shift \\n(.$
+.ie \\n(.$ .als pdf*href.format \\$1
+.el .als pdf*href.format pdf*href.default
+.nr pdf:argc 1
+..
+.\" The default reference formatting macro is defined below.
+.\" It parses the "PDFHREF.INFO" record specific to each reference,
+.\" recognising the keywords "file", "page" and "section", when they
+.\" appear in initial key/value pairs, replacing the key/value pair
+.\" with "PDFHREF.FILEREF", "PDFHREF.PAGEREF" or "PDFHREF.SECTREF"
+.\" respectively; any additional data in the "PDFHREF.INFO" record
+.\" is enclosed in typographic double quotes, and the parsed record
+.\" is appended to "PDFHREF.PREFIX", to be returned as the formatted
+.\" reference text.
+.\"
+.\" Default definitions for the reference strings "PDFHREF.PREFIX",
+.\" "PDFHREF.FILEREF", "PDFHREF.PAGEREF" and "PDFHREF.SECTREF" are
+.\" provided, in the English language. Users may substitute any
+.\" desired alternative definitions, for example, when formatting
+.\" documents in other languages. In each case, "\\$1" may be used
+.\" in the substitution, to represent the "value" component of the
+.\" respective key/value pair specified in the "PDFHREF.INFO" record.
+.\"
+.ds PDFHREF.PREFIX see
+.ds PDFHREF.PAGEREF page \\$1,
+.ds PDFHREF.SECTREF section \\$1,
+.ds PDFHREF.FILEREF \\$1
+.\"
+.de pdf*href.format
+.\" -----------------------------------------------------------------
+.\" Usage: (to be called ONLY by "pdfhref")
+.\" .pdf*href.format cross reference data ...
+.\" -----------------------------------------------------------------
+.\"
+.\" This macro is responsible for defining the strings "PDFHREF.TEXT"
+.\" and "PDFHREF.DESC", which are used by the "pdfhref" macro, as the
+.\" basis for generating the text content of a link "hot spot"; (any
+.\" user specified alternate formatter MUST do likewise).
+.\"
+.\" Note that "PDFHREF.TEXT" defines the overall format for the "link
+.\" text", while "PDFHREF.DESC" is the descriptive component thereof.
+.\"
+.\" This default implementation, subject to user customisation of the
+.\" "internationalisation" strings defined above, formats "hot spots"
+.\" of the style
+.\"
+.\" see page N, section S, "descriptive text ..."
+.\"
+.ds PDFHREF.TEXT \\*[PDFHREF.PREFIX]
+.while d\\$0.\\$1 \{\
+. \\$0.\\$1 "\\$2"
+. shift 2
+. \}
+.\"
+.\" Retrieve the descriptive text from the cross reference data,
+.\" ONLY IF no overriding description has been set by the calling
+.\" "pdfhref" macro invocation.
+.\"
+.if \\n(.$ .if !dPDFHREF.DESC .ds PDFHREF.DESC \\$*
+.\"
+.\" Augment "PDFHREF.TEXT" so the descriptive text will be included
+.\" in the text of the formatted reference
+.\"
+.if dPDFHREF.DESC .as PDFHREF.TEXT " \(lq\\\\*[PDFHREF.DESC]\(rq
+.\"
+.\" Finally, suppress any leading spaces,
+.\" which may have been included in the PDFHREF.TEXT definition.
+.\"
+.ds PDFHREF.TEXT \\*[PDFHREF.TEXT]
+..
+.de pdf*href.format.file
+.\" ----------------------------------------------------------------------
+.\" Include a file identifier in a formatted reference.
+.\" This is invoked ONLY by "pdf*href.format", and ONLY IF the
+.\" reference data includes an initial file identifier tuple.
+.\" ----------------------------------------------------------------------
+.\"
+.as PDFHREF.TEXT " \\*[PDFHREF.FILEREF]
+..
+.de pdf*href.format.page
+.\" ----------------------------------------------------------------------
+.\" Include a page number in a formatted reference.
+.\" This is invoked ONLY by "pdf*href.format", and ONLY IF the
+.\" reference data includes an initial page number tuple.
+.\" ----------------------------------------------------------------------
+.\"
+.as PDFHREF.TEXT " \\*[PDFHREF.PAGEREF]
+..
+.de pdf*href.format.section
+.\" ----------------------------------------------------------------------
+.\" Include a section number in a formatted reference.
+.\" This is invoked ONLY by "pdf*href.format", and ONLY IF the
+.\" reference data includes an initial section number tuple.
+.\" ----------------------------------------------------------------------
+.\"
+.as PDFHREF.TEXT " \\*[PDFHREF.SECTREF]
+..
+.\"
+.\" Make "pdf*href.format" the default cross reference formatter
+.\"
+.als pdf*href.default pdf*href.format
+.\"
+.\"
+.\" Macro "pdf*href" provides a generic mechanism for placing link
+.\" "hot-spots" in a PDF document. ALL "pdfhref" class macros which
+.\" create "hot-spots" are aliased to this macro; each must also have
+.\" an appropriately aliased definition for "pdf*href.template".
+.\"
+.de pdf*href
+.\" ------------------------------------------------------------------
+.\" Usage:
+.\" .pdf*href class [options ...] [link text ...]
+.\" ------------------------------------------------------------------
+.\"
+.\" First, we initialise an empty string, which will be affixed to
+.\" the end of the "link text". (This is needed to cancel the effect
+.\" of a "\c" escape, which is placed at the end of the "link text"
+.\" to support the "-A" option -- any text supplied by the user, when
+.\" the "-A" option is specified, will replace this empty string).
+.\"
+.ds pdf:href-A
+.\"
+.\" Now we interpret, and remove any specified options from the
+.\" argument list. (Note that only options with a declared handler
+.\" will be processed; there is no provision for detecting invalid
+.\" options -- anything which is not recognised is assumed to start
+.\" the "link text" component of the argument list).
+.\"
+.while dpdf:href.opt\\$1 \{\
+. pdf:href.opt\\$1 \\$@
+. shift \\n[pdf:href.argc]
+. \}
+.\"
+.\" If we found "--", to mark the end of the options, then we should
+.\" discard it.
+.\"
+.if '\\$1'--' .shift
+.\"
+.\" All PDF link classes REQUIRE a named destination. This may have
+.\" been supplied using the "-D Name" option, but, if not, deduce it
+.\" from the first "word" in the "link text", if any -- if we still
+.\" can't identify the destination, then set "pdf:href.ok" to zero,
+.\" so this link will not be created.
+.\"
+.if !dpdf:href-D .pdf:href.option -D \\$1
+.if '\\*[pdf:href-D]'' \{\
+. pdf:error pdfhref has no destination
+. nr pdf:href.ok 0
+. \}
+.\"
+.\" Some PDF link classes support a "/File (FilePathName)" argument.
+.\"
+.if dpdf*href.file \{\
+. \"
+. \" When this is supported, it may be specified by supplying
+. \" the "-F FileName" option, which is captured in "pdf:href-F".
+. \"
+. if dpdf:href-F \{\
+. \"
+. \" the /File key is present, so set up the link specification
+. \" to establish the reference to the specified file
+. \"
+. als pdf*href.link pdf*href.file
+. ds pdf:href.files /File (\\*[pdf:href-F])
+. \"
+. \" in addition to the /File key,
+. \" there may also be platform dependent alternate file names
+. \"
+. if dpdf:href-DF .as pdf:href.files " /DOSFile (\\*[pdf:href-DF])
+. if dpdf:href-MF .as pdf:href.files " /MacFile (\\*[pdf:href-MF])
+. if dpdf:href-UF .as pdf:href.files " /UnixFile (\\*[pdf:href-UF])
+. if dpdf:href-WF .as pdf:href.files " /WinFile (\\*[pdf:href-WF])
+. \}
+. \" In some cases, the "/File" key is REQUIRED.
+. \" We will know it is missing, if "pdf*href.link" is not defined.
+. \"
+. if !dpdf*href.link \{\
+. \"
+. \" When a REQUIRED "/File" key specification is not supplied,
+. \" then complain, and set "pdf:href.ok" to abort the creation
+. \" of the current reference.
+. \"
+. pdf:error pdfhref: required -F specification omitted
+. nr pdf:href.ok 0
+. \}
+. \" Now, we have no further use for "pdf*href.file".
+. \"
+. rm pdf*href.file
+. \}
+.\"
+.\" Now, initialise a string, defining the PDFMARK code sequence
+.\" to create the reference, using the appropriate type indicators.
+.\"
+.ds pdf:href.link /Subtype /Link \\*[pdf*href.link]
+.\"
+.\" And now, we have no further use for "pdf*href.link".
+.\"
+.rm pdf*href.link
+.\"
+.\" If the user specified any "link prefix" text, (using the "-P text"
+.\" option), then emit it BEFORE processing the "link text" itself.
+.\"
+.if dpdf:href-P \&\\*[pdf:href-P]\c
+.ie \\n[pdf:href.ok] \{\
+. \"
+. \" This link is VALID (so far as we can determine) ...
+. \" Modify the "link text" argument specification, as required,
+. \" to include any pre-formatted cross reference information
+. \"
+. ie \\n(.$ \{\
+. \"
+. \" One or more "link text" argument(s) are present,
+. \" so, set the link description from the argument(s) ...
+. \"
+. ds PDFHREF.DESC \\\\$*
+. ie \\n[pdf:href-X] \{\
+. \"
+. \" ... and, when the "-X" flag is set,
+. \" also include formatted location information,
+. \" derived from the cross reference record.
+. \"
+. pdf*href.format \\*[pdf:href(\\*[pdf:href-D]).info]
+. \}
+. el \{\
+. \" ... but, when the "-X" flag is NOT set,
+. \" use only the argument(s) as the entire content
+. \" of the "link text"
+. \"
+. rn PDFHREF.DESC PDFHREF.TEXT
+. \}
+. \}
+. el \{\
+. \" No "link text" arguments are present,
+. \" so, format the cross reference record to define
+. \" the content of the "link text".
+. \"
+. pdf*href.format \\*[pdf:href(\\*[pdf:href-D]).info]
+. \}
+. \" Apply border and colour specifications to the PDFMARK string
+. \" definition, as required.
+. \"
+. if dPDFHREF.BORDER .as pdf:href.link " /Border [\\*[PDFHREF.BORDER]]
+. if dPDFHREF.COLOUR .as pdf:href.link " /Color [\\*[PDFHREF.COLOUR]]
+. \"
+. \" Emit the "link text", in its appropriate colour, marking the
+. \" limits of its bounding box(es), as the before and after output
+. \" text positions.
+. \"
+. pdf*href.mark.begin "\\*[pdf:href.link]"
+. if dPDFHREF.COLOUR .defcolor pdf:href.colour rgb \\*[PDFHREF.COLOUR]
+. nop \&\m[\\*[PDFHREF.TEXT.COLOUR]]\\*[PDFHREF.TEXT]\m[]\c
+. pdf*href.mark.end
+. \"
+. \" Clean up the temporary registers and strings, used to
+. \" compute the "hot-spot" bounds, and format the reference,
+. \"
+. rm PDFHREF.DESC PDFHREF.TEXT
+. \}
+.\"
+.\" But when we identify an INVALID link ...
+.\" We simply emit the "link text", with no colour change, no border,
+.\" and no associated "hot-spot".
+.\"
+.el \&\\$*\c
+.\"
+.\" And then, if the user specified any affixed text, (using the
+.\" "-A text" option), we tack it on at the end.
+.\"
+.nop \&\\*[pdf:href-A]
+..
+.de pdf*href.map.init
+.\" ----------------------------------------------------------------------
+.\" ----------------------------------------------------------------------
+.\"
+.if dpdf:href.map-1 \{\
+. \"
+. \" We have a reference map, but we haven't started to parse it yet.
+. \" This must be the first map reference in pass 2, so we need to
+. \" "kick-start" the parsing process, by loading the first indexed
+. \" sub-map into the global map.
+. \"
+. rn pdf:href.map-1 pdf:href.map
+. als pdf:href.map.internal pdf:href.map
+. nr pdf:href.map.index 1 1
+. \}
+.als pdf*href.map.init pdf*href.mark.idle
+..
+.\"
+.\" "pdf*href-Z" is used to add link co-ordinate entries to the
+.\" "pdf:href.map". Primarily, it is used by the "pdfroff" formatter,
+.\" to pass link co-ordinate data from one "groff" formatting pass to
+.\" the next, and is not generally useful to the end user.
+.\"
+.de pdf*href-Z
+.\" ----------------------------------------------------------------------
+.\" Usage:
+.\" .pdfhref Z page-index x-displacement y-displacement
+.\" Where:
+.\" page-index is the reference mark's page number
+.\" x-displacement is its offset from the left edge of the page
+.\" y-displacement is its offset from the top edge of the page
+.\" ( both displacement values are expressed in basic groff units, )
+.\" ( and measured perpendicular to their respective page edges. )
+.\" ----------------------------------------------------------------------
+.\"
+.ie \\n(.$=3 .ds pdf:href.map-\\n+[pdf*href-Z.index] \\$*
+.el .pdf:error pdfhref Z operator expects exactly three arguments
+..
+.\" Initialise the auto-incrementing "pdf*href-Z.index" register,
+.\" to ensure that sub-map numbering starts at 1.
+.\"
+.nr pdf*href-Z.index 0 1
+.\"
+.de pdf*href.map.read
+.\" ----------------------------------------------------------------------
+.\" Usage: (internal use only):
+.\" .pdf*href.map.read co-ordinate name list ...
+.\" ----------------------------------------------------------------------
+.\"
+.\" Reads values from "pdf:href.map" to each named register, in turn
+.\" Reading to "null" discards the corresponding value in "pdf:href.map"
+.\"
+.while \\n(.$ \{\
+. \"
+. \" Loop over all registers named in the argument list,
+. \" assigning values from "pdf:href.map" to each in turn.
+. \"
+. pdf:pop nr pdf:\\$1 pdf:href.map.internal
+. if !dpdf:href.map.internal \{\
+. \"
+. \" We ran out of map references in the current sub-map,
+. \" so move on to the next indexed sub-map, if any.
+. \"
+. if dpdf:href.map-\\n+[pdf:href.map.index] \{\
+. rn pdf:href.map-\\n[pdf:href.map.index] pdf:href.map
+. als pdf:href.map.internal pdf:href.map
+. \}
+. \}
+. \"
+. \" Proceed to the next named co-ordinate, (if any), specified
+. \" in the argument list.
+. \"
+. shift
+. \}
+.\"
+.\" Discard any assignments to a register named "null"
+.\"
+.rr pdf:null
+..
+.de pdf*href.mark.begin
+.\" ----------------------------------------------------------------------
+.\" ----------------------------------------------------------------------
+.pdf*href.map.init
+.ie dpdf:href.map \{\
+. \"
+. \" Once we have established a document reference map,
+. \" then this, and all subsequent calls to "pdf*href.mark.begin",
+. \" may be redirected to the reference mark resolver, and the
+. \" "pdf*href.mark.end" macro has nothing further to do.
+. \"
+. pdf*href.mark.resolve \\$@
+. als pdf*href.mark.begin pdf*href.mark.resolve
+. als pdf*href.mark.end pdf*href.mark.idle
+. \}
+.el \{\
+. \" Since we don't yet have a document reference map, the
+. \" reference mark resolver will not work, in this pass of the
+. \" formatter; this, and all subsequent calls to "pdf*href.mark.begin",
+. \" may be redirected to "pdf*href.mark.end", which is responsible
+. \" for emitting the reference mark data to be incorporated into
+. \" the reference map in a subsequent formatting pass.
+. \"
+. pdf*href.mark.end
+. als pdf*href.mark.begin pdf*href.mark.end
+. \}
+..
+.de pdf*href.mark.resolve
+.\" ----------------------------------------------------------------------
+.\" ----------------------------------------------------------------------
+.ie '\\n(.z'' \{\
+. ds pdf:href.link \\$1
+. nr pdf:urx \\n(.o+\\n(.l
+. pdf*href.map.read spg llx ury epg urx.end lly.end
+. ie \\n[pdf:spg]=\\n[pdf:epg] \{\
+. \"
+. \" This link is entirely contained on a single page ...
+. \" emit the text, which defines the content of the link region,
+. \" then make it active.
+. \"
+. pdf*href.mark.emit 1 \\n[pdf:urx.end]
+. if \\n[pdf:lly]<\\n[pdf:lly.end] \{\
+. \"
+. \" This link spans multiple output lines; we must save its
+. \" original end co-ordinates, then define a new intermediate
+. \" end point, to create a PDFMARK "hot-spot" extending from
+. \" the start of the link to the end if its first line.
+. \"
+. nr pdf:ury +1v
+. nr pdf:llx \\n(.o+\\n[.in]
+. nr pdf:lly \\n[pdf:lly.end]-\\*[PDFHREF.HEIGHT]
+. if \\n[pdf:ury]<\\n[pdf:lly] \{\
+. nr pdf:lly +\\*[PDFHREF.HEIGHT]-1v
+. pdf*href.mark.emit 2
+. nr pdf:ury \\n[pdf:lly.end]-\\*[PDFHREF.HEIGHT]
+. \}
+. pdf*href.mark.emit 0 \\n[pdf:urx.end]
+. \}
+. pdf*href.mark.flush
+. \}
+. el \{\
+. \" This link is split across a page break, so ...
+. \" We must mark the "hot-spot" region on the current page,
+. \" BEFORE we emit the link text, as we will have moved off
+. \" this page, by the time the text has been output.
+. \"
+. \" First step: define the region from the start of the link,
+. \" to the end of its first line.
+. \"
+. pdf*href.mark.emit 1 \\n[pdf:urx]
+. \"
+. \" All additional regions MUST align with the left margin.
+. \"
+. nr pdf:llx \\n(.o+\\n[.in]
+. \"
+. \" If the current page can accommodate more than the current line,
+. \" then it will include a second active region for this link; this
+. \" will extend from just below the current line to the end of page
+. \" trap, if any, or the bottom of the page otherwise, and occupy
+. \" the full width of the page, between the margins.
+. \"
+. nr pdf:ury +1v
+. pdf*href.mark.emit 3
+. \"
+. \" We now need a page transition trap, to map the active link
+. \" region(s), which overflow on to the following page(s); (the
+. \" handler for this trap MUST have been previously installed).
+. \"
+. ie dpdf*href.mark.hook \{\
+. \"
+. \" The page transition trap handler has been installed,
+. \" so we may activate both it, and also the appropriate
+. \" termination handler, to deactivate it when done.
+. \"
+. als pdf*href.mark.hook pdf*href.mark.trap
+. \"
+. \" Now we set up "pdf:epg" to count the number of page breaks
+. \" which this link will span, and emit the link text, leaving
+. \" the page trap macro to map active regions on intervening
+. \" pages, which are included in the link.
+. \"
+. nr pdf:epg -\\n[pdf:spg] 1
+. \}
+. el \{\
+. \" There was no handler initialised for the page trap,
+. \" so we are unable to map the active regions for this link;
+. \" we may discard the remaining map data for this link,
+. \" and issue a diagnostic.
+. \"
+. pdf:error pdfhref: link dissociated at page break (trap not initialised)
+. if dPDFHREF.BROKEN.COLOR \{\
+. \"
+. \" The user may opt to have such broken links highlighted.
+. \" We use "PDFHREF.BROKEN.COLOUR" to specify this requirement,
+. \" but the user may prefer the American spelling, so we will
+. \" handle both as equivalent.
+. \"
+. als PDFHREF.BROKEN.COLOUR PDFHREF.BROKEN.COLOR
+. \}
+. if dPDFHREF.BROKEN.COLOUR \{\
+. if dPDFHREF.COLOUR .als PDFHREF.COLOUR PDFHREF.BROKEN.COLOUR
+. \}
+. \}
+. \}
+. \}
+.el \!.\\$0 \\$@
+..
+.\"
+.\" Macro "pdf*href.mark.emit" is called only by "pdf*href". It is
+.\" responsible for emitting the PDFMARK code, to establish the
+.\" "hot-spot" region associated with a document or resource link.
+.\"
+.de pdf*href.mark.emit
+.\" ----------------------------------------------------------------------
+.\" Usage:
+.\" .pdf*href.mark.emit <action> [<end-urx>]
+.\" <action> == 0 --> normal operation -- link height = 1 line
+.\" <action> == 1 --> start of link -- add leading above text
+.\" <action> == 2 --> overtall link -- set intermediate baseline
+.\" <action> == 3 --> split link -- break at bottom of page
+.\" ----------------------------------------------------------------------
+.\"
+.if \\$1=1 \{\
+. \"
+. \" Initialising a new link region ...
+. \" Some different versions of "groff" disagree about the vertical
+. \" displacement of "opminy", as emitted by "\O1|\h'-\w"|"u'\O2\c",
+. \" relative to the current text baseline. Therefore, recompute
+. \" the link displacement, independently of "opminy".
+. \"
+. mk pdf:ury.base
+. while \\n[pdf:ury.base]<\\n[pdf:ury] .nr pdf:ury.base +1v
+. nr pdf:ury.base -1m+\\n[PDFHREF.LEADING]
+. \"
+. \" adjust the end-point vertical displacement by the same offset,
+. \" and then relocate the link starting point to its new displacement,
+. \" as established by this base line relative computation.
+. \"
+. nr pdf:lly.end +\\n[pdf:ury.base]-\\n[pdf:ury]+\\*[PDFHREF.HEIGHT]
+. rnn pdf:ury.base pdf:ury
+. \}
+.if \\$1<2 \{\
+. \"
+. \" Link segment fits on a single line ...
+. \" Set its height and end-point horizontal displacement accordingly.
+. \"
+. nr pdf:lly \\n[pdf:ury]+\\*[PDFHREF.HEIGHT]
+. if \\n[pdf:lly]>=\\n[pdf:lly.end] .nr pdf:urx \\$2
+. \}
+.ie \\$1=3 \{\
+. \"
+. \" Link segment extends beyond the next page break ...
+. \" Recompute truncated height, to just fit portion on current page,
+. \" recursing to emit it, and leaving page trap mechanism to place
+. \" continuation region(s) on following page(s).
+. \"
+. nr pdf:lly (\\n[.t]u-\\n[.V]u)/1v
+. if \\n[pdf:lly]>0 \{\
+. nr pdf:lly \\n[pdf:ury]+\\n[pdf:lly]v-1v+\\*[PDFHREF.HEIGHT]
+. pdf*href.mark.emit 2
+. \}
+. \}
+.el \{\
+. \" Link region size and placement has been fully specified ...
+. \" Emit it.
+. \"
+. pdfmark \\*[pdf:href.link] /Rect [\\*[pdf:bbox]] /ANN
+. \}
+..
+.\"
+.\" When "pdf*href" emits a link for which the "hot-spot" spans a
+.\" page break, then we need to provide a "hook" in to the page break
+.\" trap, so we can map the "hot-spot" regions which are to be placed
+.\" on either side of the page break.
+.\"
+.\" Macro "pdf*href.mark.idle" is a dummy macro, which provide this
+.\" "hook" for normal page breaks, where there is no link "hot-spot"
+.\" crossing the break.
+.\"
+.de pdf*href.mark.idle
+.\" ----------------------------------------------------------------------
+.\" Usage:
+.\" Called only as an internal hook, by a page trap macro.
+.\" Expects no arguments, and does nothing.
+.\" ----------------------------------------------------------------------
+..
+.\"
+.\" Macro "pdf*href.mark.trap" is the active "hook", which is substituted
+.\" for "pdf*href,mark.idle" at those page breaks which are crossed by
+.\" a link "hot-spot".
+.\"
+.de pdf*href.mark.trap
+.\" ----------------------------------------------------------------------
+.\" Usage:
+.\" Called only as an internal hook, by a page trap macro.
+.\" Expects no arguments. Maps residual link "hot-spot" regions,
+.\" which spill beyond any page break. Not to be invoked directly
+.\" by the user, nor by any user supplied macro.
+.\" ----------------------------------------------------------------------
+.\"
+.mk pdf:ury
+.nr pdf:ury +1v-1m-\\n[PDFHREF.LEADING]
+.ie \\n-[pdf:epg] \{\
+. \"
+. \" The link "hot-spot" extends across more than one page break,
+. \" so, for each page which is completely contained within the
+. \" extent of the link, simply mark the entire text area on the
+. \" page as a "hot-spot".
+. \"
+. pdf*href.mark.emit 3
+. \}
+.el \{\
+. \" The link "hot-spot" ends on the page which immediately follows
+. \" the current page transition, so we may now finalise this link.
+. \"
+. nr pdf:lly \\n[pdf:ury]+\\*[PDFHREF.HEIGHT]
+. if \\n[pdf:lly.end]>\\n[pdf:lly] \{\
+. \"
+. \" The "hot-spot" extends beyond the first line of text,
+. \" on its final page; compute and emit "hot-spot" region to cover
+. \" the full with of the text area, including all but the last
+. \" line of the link text.
+. \"
+. while \\n[pdf:lly.end]>\\n[pdf:lly] .nr pdf:lly +1v
+. nr pdf:lly -1v
+. pdf*href.mark.emit 2
+. \"
+. \" Now, adjust the vertical "hot-spot" mapping reference,
+. \" to identify the correct position for the last line of
+. \" text, over which the "hot-spot" extends.
+. \"
+. nr pdf:ury \\n[pdf:lly.end]-\\*[PDFHREF.HEIGHT]
+. \}
+. \"
+. \" We now have exactly one final line of text, over which we must
+. \" emit a "hot-spot" region; map it, terminate page trap processing
+. \" for this "hot-spot", and clean up the "hot-spot" mapping context.
+. \"
+. pdf*href.mark.emit 0 \\n[pdf:urx.end]
+. als pdf*href.mark.hook pdf*href.mark.idle
+. pdf*href.mark.flush
+. \}
+..
+.de pdf*href.mark.flush
+.\" ----------------------------------------------------------------------
+.\" ----------------------------------------------------------------------
+.rr pdf:spg pdf:epg
+.rr pdf:llx pdf:lly pdf:urx pdf:ury
+.if dPDFHREF.COLOR .als PDFHREF.COLOUR PDFHREF.COLOR
+.rr pdf:urx.end pdf:lly.end
+..
+.de pdf*href.mark.end
+.\" ----------------------------------------------------------------------
+.\" ----------------------------------------------------------------------
+\O1\Z'|'\O2\c
+..
+.\" Macro "pdf*href-I" is used for one time initialisation of special
+.\" "pdfhref" features; (currently, only the above page trap hook is
+.\" supported, but it is implemented with one level of indirection, to
+.\" accommodate possible future expansion).
+.
+.de pdf*href-I
+.\" ----------------------------------------------------------------------
+.\" Usage:
+.\" .pdfhref I -<option> <optarg> [-<option> <optarg>] ...
+.\" ----------------------------------------------------------------------
+.\"
+.\" Loop over all arguments, in pairs ...
+.
+.while \\n(.$ \{\
+. \"
+. \" handing them off to their respective initialisers,
+. \" when suitable initialisers exist, or complaining otherwise.
+. \"
+. ie dpdf*href\\$1.init .pdf*href\\$1.init \\$2
+. el .pdf*error pdfhref:init: unknown feature '\\$1'
+. shift 2
+. \}
+..
+.\" Before we can use the page break "hook", we need to initialise it
+.\" as an addendum to a regular page break trap. To ensure that we don't
+.\" compromise the user's page trap setup, we leave the onus for this
+.\" initialisation with the user, but we provide the "pdf*href-PT.init"
+.\" macro, (invoked by ".pdfhref I -PT <macro-name>"), to implement a
+.\" suitable initialisation action.
+.
+.de pdf*href-PT.init
+.\" ----------------------------------------------------------------------
+.\" Usage:
+.\" .pdfhref I -PT <macro-name>
+.\" <macro-name> == name of user's page break trap macro
+.\" ----------------------------------------------------------------------
+.\"
+.\" Initially, map the page break hook to its default, do nothing helper.
+.
+.als pdf*href.mark.hook pdf*href.mark.idle
+.ie !\\n(.$ \{\
+. \"
+. \" Don't have enough arguments to specify a page trap macro name,
+. \" so simply plant "pdf*href.mark.hook" as a top of page trap.
+. \"
+. wh 0 pdf*href.mark.hook
+. \}
+.el \{\
+. \" Page trap macro name is specified in "\\$1" ...
+. \"
+. ie d\\$1 \{\
+. \"
+. \" When this page trap macro already exists, then we simply
+. \" append a call to "pdf*href.mark.hook" to it.
+. \"
+. am \\$1 pdf*href.mark.idle
+. pdf*href.mark.hook
+. pdf*href.mark.idle
+. \}
+. el \{\
+. \" However, when the specified page trap macro does not yet
+. \" exist, then we create it, and plant it as a top of page
+. \" trap.
+. \"
+. de \\$1 pdf*href.mark.idle
+. pdf*href.mark.hook
+. pdf*href.mark.idle
+. wh 0 \\$1
+. \}
+. \}
+..
+.
+.\" "pdf*href-L" is the generic handler for creating references to
+.\" named destinations in PDF documents. It supports both local
+.\" references, to locations within the same document, through its
+.\" "pdf*href-L.link" attribute, and also references to locations
+.\" in any other PDF document, through "pdf*href-L.file".
+.\"
+.als pdf*href-L pdf*href
+.ds pdf*href-L.link /Dest /\\\\*[pdf:href-D]
+.ds pdf*href-L.file /Action /GoToR \\\\*[pdf:href.files] \\*[pdf*href-L.link]
+.\"
+.\" "pdf*href-O" is the "official" handler for creating PDF
+.\" document outlines. It is simply an alias to "pdfbookmark",
+.\" which may also be invoked directly, if preferred. Neither
+.\" a "pdf*href-O.link" nor a "pdf*href-O.file" attribute is
+.\" required.
+.\"
+.als pdf*href-O pdfbookmark
+.\"
+.\" "pdf*href-W" is the generic handler for creating references to
+.\" web resources, (or any resource specified by a uniform resource
+.\" identifier). Such resource links are fully specified by the
+.\" "pdf*href-W.link" attribute.
+.\"
+.als pdf*href-W pdf*href
+.ds pdf*href-W.link /Action << /Subtype /URI /URI (\\\\*[pdf:href-D]) >>
+.\"
+.\" Local Variables:
+.\" mode: nroff
+.\" End:
+.\" vim: filetype=groff:
+.\" pdfmark.tmac: end of file
diff --git a/contrib/pdfmark/pdfroff.1.man b/contrib/pdfmark/pdfroff.1.man
new file mode 100644
index 0000000..029a1f4
--- /dev/null
+++ b/contrib/pdfmark/pdfroff.1.man
@@ -0,0 +1,981 @@
+.TH pdfroff @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+pdfroff \- construct files in Portable Document Format using
+.I groff
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2005-2020 Free Software Foundation, Inc.
+.\"
+.\" This file is part of groff, the GNU roff type-setting system.
+.\"
+.\" Permission is granted to copy, distribute and/or modify this
+.\" document under the terms of the GNU Free Documentation License,
+.\" Version 1.3 or any later version published by the Free Software
+.\" Foundation; with no Invariant Sections, 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_pdfroff_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY pdfroff
+.RI [ groff-option ]
+.RB [ \-\-emit\-ps ]
+.RB [ \-\-no\-toc\-relocation ]
+.RB [ \-\-no\-kill\-null\-pages ]
+.RB [ \-\-stylesheet=\c
+.IR name ]
+.RB [ \-\-no\-pdf\-output ]
+.RB [ \-\-pdf\-output=\c
+.IR name ]
+.RB [ \-\-no\-reference\-dictionary ]
+.RB [ \-\-reference\-dictionary=\c
+.IR name ]
+.RB [ \-\-report\-progress ]
+.RB [ \-\-keep\-temporary\-files ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY pdfroff
+.B \-h
+.
+.SY pdfroff
+.B \-\-help
+.YS
+.
+.
+.SY pdfroff
+.B \-v
+.RI [ groff-option
+\&.\|.\|.\&]
+.
+.SY pdfroff
+.B \-\-version
+.RI [ groff-option
+\&.\|.\|.\&]
+.YS
+.
+.
+.P
+.I groff-option
+is any short option supported by
+.MR groff @MAN1EXT@
+except for
+.BR \-h ,
+.BR \-T ,
+and
+.BR \-v ;
+see section \[lq]Usage\[rq] below.
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I pdfroff
+is a wrapper program for the GNU text processing system,
+.IR groff .
+.
+It transparently handles the mechanics of multiple pass
+.I groff
+processing,
+when applied to suitably marked up
+.I groff
+source files,
+such that tables of contents and body text are formatted separately,
+and are subsequently combined in the correct order,
+for final publication as a single PDF document.
+.
+A further optional \[lq]style sheet\[rq] capability is provided;
+this allows for the definition of content which is required to precede
+the table of contents,
+in the published document.
+.
+.
+.P
+For each invocation of
+.IR pdfroff ,
+the ultimate
+.I groff
+output stream is post-processed by the Ghostscript
+.MR gs 1
+interpreter to produce a finished PDF document.
+.
+.
+.P
+.I pdfroff
+makes no assumptions about,
+and imposes no restrictions on,
+the use of any
+.I groff
+macro packages which the user may choose to employ,
+in order to achieve a desired document format;
+however,
+it
+.I does
+include specific built in support for the
+.I \%pdfmark
+macro package,
+should the user choose to employ it.
+.
+Specifically,
+if the
+.I pdfhref
+macro,
+defined in the
+.I \%pdfmark.tmac
+package,
+is used to define public reference marks,
+or dynamic links to such reference marks,
+then
+.I pdfroff
+performs as many preformatting
+.I groff
+passes as required,
+up to a maximum limit of
+.IR four ,
+in order to compile a document reference dictionary,
+to resolve
+references,
+and to expand the dynamically defined content of links.
+.
+.
+.\" ====================================================================
+.SH Usage
+.\" ====================================================================
+.
+The command line is parsed in accordance with normal GNU conventions,
+but with one exception\(emwhen specifying any short form option
+(i.e.,
+a single character option introduced by a single hyphen),
+and if that option expects an argument,
+then it
+.I must
+be specified independently
+(i.e.,
+it may
+.I not
+be appended to any group of other single character short form options).
+.
+.
+.P
+Long form option names
+(i.e.,
+those introduced by a double hyphen)
+may
+be abbreviated to their minimum length unambiguous initial substring.
+.
+.
+.P
+Otherwise,
+.I pdfroff
+usage closely mirrors that of
+.I groff
+itself.
+.
+Indeed,
+with the exception of the
+.BR \-h ,
+.BR \-v ,
+and
+.BI \-T \ dev
+short form options,
+and all long form options,
+which are parsed
+internally by
+.IR pdfroff ,
+all options and file name arguments specified on the command line are
+passed on to
+.IR groff ,
+to control the formatting of the PDF document.
+.
+Consequently,
+.I pdfroff
+accepts all options and arguments,
+as specified in
+.MR groff @MAN1EXT@ ,
+which may also be considered as the definitive reference for all
+standard
+.I pdfroff
+options and argument usage.
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.I pdfroff
+accepts all of the short form options
+(i.e.,
+those introduced by a
+single hyphen),
+which are available with
+.I groff
+itself.
+.
+In most cases,
+these are simply passed transparently to
+.IR groff ;
+the following,
+however,
+are handled specially by
+.IR pdfroff .
+.
+.
+.TP
+.B \-h
+Same as
+.BR \-\-help ;
+see below.
+.
+.
+.TP
+.B \-i
+Process standard input,
+after all other specified input files.
+.
+This is passed transparently to
+.IR groff ,
+but,
+if grouped with other options,
+it
+.I must
+be the first in the group.
+.
+Hiding it within a group breaks standard input processing,
+in the multiple-pass
+.I groff
+processing context of
+.IR pdfroff .
+.
+.
+.TP
+.BI \-T \ dev
+Only
+.B \-T\ ps
+is supported by
+.IR pdfroff .
+.
+Attempting to specify any other device causes
+.I pdfroff
+to abort.
+.
+.
+.TP
+.B \-v
+Same as
+.BR \-\-version ;
+see below.
+.
+.
+.P
+See
+.MR groff @MAN1EXT@
+for a description of all other short form options,
+which are
+transparently passed through
+.I pdfroff
+to
+.IR groff .
+.
+.
+.P
+All long form options
+(i.e.,
+those introduced by a double hyphen)
+are interpreted locally by
+.IR pdfroff ;
+they are
+.I not
+passed on to
+.IR groff ,
+unless otherwise stated below.
+.
+.
+.TP
+.B \-\-help
+Causes
+.I pdfroff
+to display a summary of the its usage syntax,
+and supported options,
+and then exit.
+.
+.
+.TP
+.B \-\-emit\-ps
+Suppresses the final output conversion step,
+causing
+.I pdfroff
+to emit PostScript output instead of PDF.
+.
+This may be useful to capture intermediate PostScript output when using
+a specialised postprocessor,
+such as
+.I gpresent
+for example,
+in place of the default Ghostscript PDF writer.
+.
+.
+.TP
+.B \-\-keep\-temporary\-files
+Suppresses the deletion of temporary files,
+which normally occurs
+after
+.I pdfroff
+has completed PDF document formatting;
+this may be useful when debugging formatting problems.
+.
+.
+.IP
+See section \[lq]Files\[rq] below for a description of the temporary
+files used by
+.IR pdfroff .
+.
+.
+.TP
+.B \-\-no\-pdf\-output
+May be used with the
+.BI \%\-\-reference\-dictionary= name
+option
+(described below)
+to eliminate the overhead of PDF formatting when running
+.I pdfroff
+to create a reference dictionary for use in a different document.
+.
+.
+.TP
+.B \-\-no\-reference\-dictionary
+May be used to eliminate the overhead of creating a reference
+dictionary,
+when it is known that the target PDF document contains no public
+references,
+created by the
+.B pdfhref
+macro.
+.
+.
+.TP
+.B \-\-no\-toc\-relocation
+May be used to eliminate the extra
+.I groff
+processing pass,
+which is required to generate a table of contents,
+and relocate it to the start of the PDF document,
+when processing any document which lacks an automatically
+generated table of contents.
+.
+.
+.TP
+.B \-\-no\-kill\-null\-pages
+While preparing for simulation of the manual collation step,
+which is traditionally required to relocate a
+.I "table of contents"
+to the start of a document,
+.I pdfroff
+accumulates a number of empty page descriptions
+into the intermediate PostScript output stream.
+.
+During the final collation step,
+these empty pages are normally discarded from the finished document;
+this option forces
+.I pdfroff
+to leave them in place.
+.
+.
+.TP
+.BI \-\-pdf\-output= name
+Specifies the name to be used for the resultant PDF document;
+if unspecified,
+the PDF output is written to standard output.
+.
+A future version of
+.I pdfroff
+may use this option,
+to encode the document name in a generated reference dictionary.
+.
+.
+.TP
+.BI \-\-reference\-dictionary= name
+Specifies the name to be used for the generated reference dictionary
+file;
+if unspecified,
+the reference dictionary is created in a temporary file,
+which is deleted when
+.I pdfroff
+completes processing of the current document.
+.
+This option
+.I must
+be specified,
+if it is desired to save the reference dictionary,
+for use in references placed in other PDF documents.
+.
+.
+.TP
+.B \-\-report\-progress
+Causes
+.I pdfroff
+to display an informational message on standard error,
+at the start of each
+.I groff
+processing pass.
+.
+.
+.TP
+.BI \-\-stylesheet= name
+Specifies the name of an
+.IR "input file" ,
+to be used as a style sheet for formatting of content,
+which is to be placed
+.I before
+the table of contents,
+in the formatted PDF document.
+.
+.
+.TP
+.B \-\-version
+Causes
+.I pdfroff
+to display a version identification message.
+.
+The entire command line is then passed transparently to
+.IR groff ,
+in a
+.I one
+pass operation
+.IR only ,
+in order to display the associated
+.I groff
+version information,
+before exiting.
+.
+.
+.\" ====================================================================
+.SH Environment
+.\" ====================================================================
+.
+The following environment variables may be set,
+and exported,
+to modify the behaviour of
+.IR pdfroff .
+.
+.
+.TP
+.I PDFROFF_COLLATE
+Specifies the program to be used
+for collation of the finished PDF document.
+.
+.
+.IP
+This collation step may be required to move
+.I tables of contents
+to the start of the finished PDF document,
+when formatting with traditional macro packages,
+which print them at the end.
+.
+However,
+users should not normally need to specify
+.IR \%PDFROFF_COLLATE ,
+(and indeed,
+are not encouraged to do so).
+.
+If unspecified,
+.I pdfroff
+uses
+.MR sed @MAN1EXT@
+by default,
+which normally suffices.
+.
+.
+.IP
+If
+.I \%PDFROFF_COLLATE
+.I is
+specified,
+then it must act as a filter,
+accepting a list of file name arguments,
+and write its output to the standard output stream,
+whence it is piped to the
+.IR \%PDFROFF_POSTPROCESSOR_COMMAND ,
+to produce the finished PDF output.
+.
+.
+.IP
+When specifying
+.IR \%PDFROFF_COLLATE ,
+it is normally necessary to also specify
+.IR \%PDFROFF_KILL_NULL_PAGES .
+.
+.
+.IP
+.I \%PDFROFF_COLLATE
+is ignored,
+if
+.I pdfroff
+is invoked with the
+.B \%\-\-no\-kill\-null\-pages
+option.
+.
+.
+.TP
+.I PDFROFF_KILL_NULL_PAGES
+Specifies options to be passed to the
+.I \%PDFROFF_COLLATE
+program.
+.
+.
+.IP
+It should not normally be necessary to specify
+.IR \%PDFROFF_KILL_NULL_PAGES .
+.
+The internal default is a
+.MR sed @MAN1EXT@
+script,
+which is intended to remove completely blank pages
+from the collated output stream,
+and which should be appropriate in most applications of
+.IR pdfroff .
+.
+However,
+if any alternative to
+.MR sed @MAN1EXT@
+is specified for
+.IR \%PDFROFF_COLLATE ,
+then it is likely that a corresponding alternative specification for
+.I \%PDFROFF_KILL_NULL_PAGES
+is required.
+.
+.
+.IP
+As in the case of
+.IR \%PDFROFF_COLLATE ,
+.I \%PDFROFF_KILL_NULL_PAGES
+is ignored,
+if
+.I pdfroff
+is invoked with the
+.B \%\-\-no\-kill\-null\-pages
+option.
+.
+.
+.TP
+.I PDFROFF_POSTPROCESSOR_COMMAND
+Specifies the command to be used for the final document conversion
+from PostScript intermediate output to PDF.
+.
+It must behave as a filter,
+writing its output to the standard output stream,
+and must accept an arbitrary number of
+.I files .\|.\|.\&
+arguments,
+with the special case of
+.RB \[lq] \- \[rq]
+representing the standard input stream.
+.
+.
+.IP
+If unspecified,
+.I \%PDFROFF_POSTPROCESSOR_COMMAND
+defaults to
+.
+.RS 12n
+.EX
+gs \-dBATCH \-dQUIET \-dNOPAUSE \-dSAFER \-sDEVICE=pdfwrite \e
+ \-sOutputFile=\-
+.EE
+.RE
+.
+.
+.TP
+.I GROFF_TMPDIR
+Identifies the directory in which
+.I pdfroff
+should create temporary files.
+.
+If
+.I \%GROFF_TMPDIR
+is
+.I not
+specified,
+then the variables
+.IR TMPDIR ,
+.I TMP
+and
+.I TEMP
+are considered in turn as possible temporary file repositories.
+.
+If none of these are set,
+then temporary files are created
+in the current directory.
+.
+.
+.TP
+.I GROFF_GHOSTSCRIPT_INTERPRETER
+Specifies the program to be invoked when
+.I pdfroff
+converts
+.I groff
+PostScript output to PDF.
+.
+If
+.I \%PDFROFF_POSTPROCESSOR_COMMAND
+is specified,
+then the command name it specifies is
+.I implicitly
+assigned to
+.IR \%GROFF_GHOSTSCRIPT_INTERPRETER ,
+overriding any explicit setting specified in the environment.
+.
+If
+.I \%GROFF_GHOSTSCRIPT_INTERPRETER
+is not specified,
+then
+.I pdfroff
+searches the process
+.IR PATH ,
+looking for a program with any of the well known names
+for the Ghostscript interpreter;
+if no Ghostscript interpreter can be found,
+.I pdfroff
+aborts.
+.
+.
+.TP
+.I GROFF_AWK_INTERPRETER
+Specifies the program to be invoked when
+.I pdfroff
+is extracting reference dictionary entries from a
+.I groff
+intermediate message stream.
+.
+If
+.I \%GROFF_AWK_INTERPRETER
+is not specified,
+then
+.I pdfroff
+searches the process
+.IR PATH ,
+looking for any of the preferred programs,
+.IR gawk ,
+.IR mawk ,
+.IR nawk ,
+and
+.IR awk ,
+in that order;
+if none of these are found,
+.I pdfroff
+issues a warning message,
+and continue processing;
+however,
+in this case,
+no reference dictionary is created.
+.
+.
+.TP
+.I OSTYPE
+Typically defined automatically by the operating system,
+.I \%OSTYPE
+is used on Microsoft Win32/MS-DOS platforms
+.IR only ,
+to infer the default
+.I \%PATH_SEPARATOR
+character,
+which is used when parsing the process
+.I PATH
+to search for external helper programs.
+.
+.
+.TP
+.I PATH_SEPARATOR
+If set,
+.I \%PATH_SEPARATOR
+overrides the default separator character,
+(\[oq]:\[cq] on POSIX/Unix systems,
+inferred from
+.I \%OSTYPE
+on Microsoft Win32/MS-DOS),
+which is used when parsing the process
+.I PATH
+to search for external helper programs.
+.
+.
+.TP
+.I SHOW_PROGRESS
+If this is set to a non-empty value,
+then
+.I pdfroff
+always behaves as if the
+.B \%\-\-report\-progress
+option is specified on the command line.
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+Input and output files for
+.I pdfroff
+may be named according to any convention of the user's choice.
+.
+Typically,
+input files may be named according to the choice of the principal
+normatting macro package,
+e.g.,
+.RI file .ms
+might be an input file for formatting using the
+.I ms
+macros
+.RI ( s.tmac );
+normally,
+the final output file should be named
+.RI file .pdf .
+.
+.
+.P
+Temporary files created by
+.I pdfroff
+are placed in the file system hierarchy,
+in or below the directory specified by environment variables
+(see section \[lq]Environment\[rq] above).
+.
+If
+.MR mktemp @MAN1EXT@
+is available,
+it is invoked to create a private subdirectory of
+the nominated temporary files directory,
+(with subdirectory name derived from the template
+.IR pdfroff\-XXXXXXXXXX );
+if this subdirectory is successfully created,
+the temporary files will be placed within it,
+otherwise they will be placed directly in the directory
+nominated in the environment.
+.
+.
+.P
+All temporary files themselves
+are named according to the convention
+.IR pdf $$ . *,
+where
+.I $$
+is the standard shell variable representing the process identifier of
+the
+.I pdfroff
+process itself,
+and
+.I *
+represents any of the extensions used by
+.I pdfroff
+to identify the following temporary and intermediate files.
+.
+.
+.TP
+.IR pdf $$ .tmp
+A scratch pad file,
+used to capture reference data emitted by
+.IR groff ,
+during the
+.I reference dictionary
+compilation phase.
+.
+.
+.TP
+.IR pdf $$ .ref
+The
+.IR "reference dictionary" ,
+as compiled in the last but one pass of the
+.I reference dictionary
+compilation phase;
+(at the start of the first pass,
+this file is created empty;
+in successive passes,
+it contains the
+.I reference dictionary
+entries,
+as collected in the preceding pass).
+.
+.
+.IP
+If the
+.BR \%\-\-reference\-dictionary =\c
+.I name
+option is specified,
+this intermediate file becomes permanent,
+and is named
+.IR name ,
+rather than
+.IR pdf $$ .ref .
+.
+.
+.TP
+.IR pdf $$ .cmp
+Used to collect
+.I reference dictionary
+entries during the active pass of the
+.I reference dictionary
+compilation phase.
+.
+At the end of any pass,
+when the content of
+.IR pdf $$ .cmp
+compares as identical to
+.IR pdf $$ .ref ,
+(or the corresponding file named by the
+.BR \%\-\-reference\-dictionary =\c
+.I name
+option),
+then
+.I reference dictionary
+compilation is terminated,
+and the
+.I document reference map
+is appended to this intermediate file,
+for inclusion in the final formatting passes.
+.
+.
+.TP
+.IR pdf $$ .tc
+An intermediate
+.I PostScript
+file,
+in which \[lq]Table of Contents\[rq] entries are collected,
+to facilitate relocation before the body text,
+on ultimate output to the
+.I Ghostscript
+postprocessor.
+.
+.
+.TP
+.IR pdf $$ .ps
+An intermediate
+.I PostScript
+file,
+in which the body text is collected prior to ultimate output to the
+.I Ghostscript
+postprocessor,
+in the proper sequence,
+.I after
+.IR pdf $$ .tc .
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+.I pdfroff
+was written by
+.MT keith\:.d\:.marshall@\:ntlworld\:.com
+Keith Marshall
+.ME ,
+who maintains it at
+.UR https://\:osdn\:.net/\:users/\:keith/\:pf/\:\%groff-pdfmark/\
+\:wiki/\:\%FrontPage
+his
+.I groff-pdfmark
+OSDN site
+.UE .
+.
+.IR groff 's
+version may be withdrawn in a future release.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is the primary
+.I groff
+manual.
+.
+You can browse it interactively with \[lq]info groff\[rq].
+.
+.
+.P
+Since
+.I pdfroff
+provides a superset of all
+.I groff
+capabilities,
+the above manual,
+or its terser reference page,
+.MR groff @MAN7EXT@
+may also be considered definitive references to all
+.I standard
+capabilities of
+.IR pdfroff ,
+with this document providing the reference to
+.IR pdfroff 's
+extended features.
+.
+.
+.P
+While
+.I pdfroff
+imposes neither any restriction on,
+nor any requirement for,
+the use of any specific
+.I groff
+macro package,
+a number of supplied macro packages,
+and in particular those associated with the package
+.IR \%pdfmark.tmac ,
+are best suited for use with
+.I pdfroff
+as the preferred formatter.
+.
+.
+.TP
+.I @PDFDOCDIR@/\:\%pdfmark.pdf
+\[lq]Portable Document Format Publishing with GNU
+.IR Troff \[rq],
+by Keith Marshall,
+offers detailed documentation on the use of these packages.
+.
+This file,
+together with its source,
+.IR \%pdfmark.ms ,
+is part of the
+.I groff
+distribution.
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_pdfroff_1_man_C]
+.do rr *groff_pdfroff_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/pdfmark/pdfroff.sh b/contrib/pdfmark/pdfroff.sh
new file mode 100644
index 0000000..f34c841
--- /dev/null
+++ b/contrib/pdfmark/pdfroff.sh
@@ -0,0 +1,682 @@
+#! /bin/sh
+# ------------------------------------------------------------------------------
+#
+# Function: Format PDF Output from groff Markup
+#
+# Copyright (C) 2005-2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# ------------------------------------------------------------------------------
+#
+# Set up an identifier for the NULL device.
+# In most cases "/dev/null" will be correct, but some shells on
+# MS-DOS/MS-Windows systems may require us to use "NUL".
+#
+ NULLDEV="/dev/null"
+ test -c $NULLDEV || NULLDEV="NUL"
+#
+# Set up the command name to use in diagnostic messages.
+# (We can't assume we have 'basename', so use the full path if required.
+# Also use the 'exec 2>...' workaround for a bug in Cygwin's 'ash').
+#
+ CMD=`exec 2>$NULLDEV; basename $0` || CMD=$0
+#
+# To ensure that prerequisite helper programs are available, and are
+# executable, a [fairly] portable method of detecting such programs is
+# provided by function 'searchpath'.
+#
+ searchpath(){
+ #
+ # Usage: searchpath progname path
+ #
+ IFS=${PATH_SEPARATOR-":"} prog=':'
+ for dir in $2
+ do
+ for ext in '' '.exe'
+ #
+ # try 'progname' with all well known extensions
+ # (e.g. Win32 may require 'progname.exe')
+ #
+ do
+ try="$dir/$1$ext"
+ test -f "$try" && test -x "$try" && prog="$try" && break
+ done
+ test "$prog" = ":" || break
+ done
+ echo "$prog"
+ }
+# @PATH_SEARCH_SETUP@
+#
+# If the system maps '/bin/sh' to some 'zsh' implementation,
+# then we may need this hack, adapted from autoconf code.
+#
+ test x${ZSH_VERSION+"set"} = x"set" && NULLCMD=":" \
+ && (emulate sh) >$NULLDEV 2>&1 && emulate sh
+#
+# We need both 'grep' and 'sed' programs, to parse script options,
+# and we also need 'cat', to display help and some error messages,
+# so ensure they are all installed, before we continue.
+#
+ CAT=`searchpath cat "$PATH"`
+ GREP=`searchpath grep "$PATH"`
+ SED=`searchpath sed "$PATH"`
+#
+# Another fundamental requirement is the 'groff' program itself;
+# we MUST use a 'groff' program located in 'GROFF_BIN_DIR', if this
+# is specified; if not, we will search 'GROFF_BIN_PATH', only falling
+# back to a 'PATH' search, if neither of these is specified.
+#
+ if test -n "$GROFF_BIN_DIR"
+ then
+ GPATH=GROFF_BIN_DIR
+ GROFF=`searchpath groff "$GROFF_BIN_DIR"`
+#
+ elif test -n "$GROFF_BIN_PATH"
+ then
+ GPATH=GROFF_BIN_PATH
+ GROFF=`searchpath groff "$GROFF_BIN_PATH"`
+#
+ else
+ GPATH=PATH
+ GROFF=`searchpath groff "$PATH"`
+ fi
+#
+# If one or more of these is missing, diagnose and bail out.
+#
+ NO='' NOPROG="$CMD: installation problem: cannot find program"
+ test "$CAT" = ":" && echo >&2 "$NOPROG 'cat' in PATH" && NO="$NO 'cat'"
+ test "$GREP" = ":" && echo >&2 "$NOPROG 'grep' in PATH" && NO="$NO 'grep'"
+ test "$GROFF" = ":" && echo >&2 "$NOPROG 'groff' in $GPATH" && NO="$NO 'groff'"
+ test "$SED" = ":" && echo >&2 "$NOPROG 'sed' in PATH" && NO="$NO 'sed'"
+ if test -n "$NO"
+ then
+ set $NO
+ test $# -gt 1 && NO="s" IS="are" || NO='' IS="is"
+ while test $# -gt 0
+ do
+ test $# -gt 2 && NO="$NO $1,"
+ test $# -eq 2 && NO="$NO $1 and" && shift
+ test $# -lt 2 && NO="$NO $1"
+ shift
+ done
+ $CAT >&2 <<-ETX
+
+ *** FATAL INSTALLATION ERROR ***
+
+ The program$NO $IS required by '$CMD',
+ but cannot be found; '$CMD' is unable to continue.
+
+ ETX
+ exit 1
+ fi
+#
+# Identify the postprocessor command, for writing PDF output.
+# (May be forced, by defining PDFROFF_POSTPROCESSOR_COMMAND in the environment;
+# if this is not set, leave blank to use the built in default).
+#
+ if test -n "${PDFROFF_POSTPROCESSOR_COMMAND}"
+ then
+ GROFF_GHOSTSCRIPT_INTERPRETER=`set command ${PDFROFF_POSTPROCESSOR_COMMAND};
+ echo $2`
+ fi
+#
+# Set up temporary/intermediate file locations, with traps to
+# clean them up on exit. Note that, for greater portability, we
+# prefer to refer to events by number, rather than by symbolic
+# names; thus, the EXIT event is trapped as event zero.
+#
+ export TMPDIR GROFF_TMPDIR
+ TMPDIR=${GROFF_TMPDIR=${TMPDIR-${TMP-${TEMP-"."}}}}
+ if GROFF_TMPDIR=`exec 2>${NULLDEV}; mktemp -dt pdfroff-XXXXXXXXXX`
+ then
+ #
+ # We successfully created a private temporary directory,
+ # so to clean up, we may simply purge it.
+ #
+ trap "rm -rf ${GROFF_TMPDIR}" 0
+ #
+ else
+ #
+ # Creation of a private temporary directory was unsuccessful;
+ # fall back to user nominated directory, (using current directory
+ # as default), and schedule removal of only the temporary files.
+ #
+ GROFF_TMPDIR=${TMPDIR}
+ trap "rm -f ${GROFF_TMPDIR}/pdf$$.*" 0
+ fi
+ #
+ # In the case of abnormal termination events, we force an exit
+ # (with status code '1'), leaving the normal exit trap to clean
+ # up the temporary files, as above. Note that we again prefer
+ # to refer to events by number, rather than by symbolic names;
+ # here we trap SIGHUP, SIGINT, SIGQUIT, SIGPIPE and SIGTERM.
+ #
+ trap "exit 1" 1 2 3 13 15
+#
+ WRKFILE=${GROFF_TMPDIR}/pdf$$.tmp
+#
+ REFCOPY=${GROFF_TMPDIR}/pdf$$.cmp
+ REFFILE=${GROFF_TMPDIR}/pdf$$.ref
+#
+ CS_DATA=""
+ TC_DATA=${GROFF_TMPDIR}/pdf$$.tc
+ BD_DATA=${GROFF_TMPDIR}/pdf$$.ps
+#
+# Initialise 'groff' format control settings,
+# to discriminate table of contents and document body formatting passes.
+#
+ TOC_FORMAT="-rPHASE=1"
+ BODY_FORMAT="-rPHASE=2"
+#
+ LONGOPTS="
+ help reference-dictionary no-reference-dictionary
+ stylesheet pdf-output no-pdf-output
+ version report-progress no-toc-relocation
+ emit-ps keep-temporary-files no-kill-null-pages
+ "
+# Parse the command line, to identify 'pdfroff' specific options.
+# Collect all other parameters into new argument and file lists,
+# to be passed on to 'groff', enforcing the '-Tps' option.
+#
+ DIFF="" STREAM="" INPUT_FILES=""
+ SHOW_VERSION="" GROFF_STYLE="$GROFF -Tps"
+ while test $# -gt 0
+ do
+ case "$1" in
+#
+# Long options must be processed locally ...
+#
+ --*)
+#
+# First identify, matching any abbreviation to its full form.
+#
+ MATCH="" OPTNAME=`IFS==; set dummy $1; echo $2`
+ for OPT in $LONGOPTS
+ do
+ MATCH="$MATCH"`echo --$OPT | $GREP "^$OPTNAME"`
+ done
+#
+# For options in the form --option=value
+# capture any specified value into $OPTARG.
+#
+ OPTARG=`echo $1 | $SED -n s?"^${OPTNAME}="??p`
+#
+# Perform case specific processing for matched option ...
+#
+ case "$MATCH" in
+
+ --help)
+ $CAT <<-ETX
+ Usage: $CMD [-option ...] [--long-option ...] [file ...]
+
+ Options:
+ -h
+ --help
+ Display this usage summary, and exit.
+
+ -v
+ --version
+ Display a version identification message and exit.
+
+ --report-progress
+ Enable console messages, indicating the progress of the
+ PDF document formatting process.
+
+ --emit-ps
+ Emit PostScript output instead of PDF; this may be useful
+ when the ultimate PDF output is to be generated by a more
+ specialised postprocessor, (e.g. gpresent), rather than
+ the default GhostScript PDF writer.
+
+ --pdf-output=name
+ Write the PDF, (or PostScript), output stream to file
+ 'name'; if this option is unspecified, standard output
+ is used for PDF, (or PostScript), output.
+
+ --no-pdf-output
+ Suppress the generation of PDF, (or PostScript), output
+ entirely; use this with the --reference-dictionary option,
+ if processing a document stream to produce only a
+ reference dictionary.
+
+ --no-reference-dictionary
+ Suppress the generation of a '$CMD' reference dictionary
+ for the PDF document. Normally '$CMD' will create a
+ reference dictionary, at the start of document processing;
+ this option can accelerate processing, if it is known in
+ advance, that no reference dictionary is required.
+
+ --reference-dictionary=name
+ Save the document reference dictionary in file 'name'.
+ If 'name' already exists, when processing commences, it
+ will be used as the base case, from which the updated
+ dictionary will be derived. If this option is not used,
+ then the reference dictionary, created during the normal
+ execution of '$CMD', will be deleted on completion of
+ document processing.
+
+ --stylesheet=name
+ Use the file 'name' as a 'groff' style sheet, to control
+ the appearance of the document's front cover section. If
+ this option is not specified, then no special formatting
+ is applied, to create a front cover section.
+
+ --no-toc-relocation
+ Suppress the multiple pass 'groff' processing, which is
+ normally required to position the table of contents at the
+ start of a PDF document.
+
+ --no-kill-null-pages
+ Suppress the 'null page' elimination filter, which is used
+ to remove the excess blank pages produced by the collation
+ algorithm used for 'toc-relocation'.
+
+ --keep-temporary-files
+ Suppress the normal clean up of temporary files, which is
+ scheduled when 'pdfroff' completes.
+
+ ETX
+ exit 0
+ ;;
+
+ --version)
+ GROFF_STYLE="$GROFF_STYLE \"$1\""
+ SHOW_VERSION="GNU pdfroff (groff) version @VERSION@"
+ ;;
+
+ --report-progress)
+ SHOW_PROGRESS=echo
+ ;;
+
+ --keep-temporary-files)
+ trap "" 0
+ ;;
+
+ --emit-ps)
+ PDFROFF_POSTPROCESSOR_COMMAND="$CAT"
+ ;;
+
+ --pdf-output)
+ PDF_OUTPUT="$OPTARG"
+ ;;
+
+ --no-pdf-output)
+ PDF_OUTPUT="$NULLDEV"
+ ;;
+
+ --reference-dictionary)
+ REFFILE="$OPTARG"
+ ;;
+
+ --no-reference-dictionary)
+ AWK=":" DIFF=":" REFFILE="$NULLDEV" REFCOPY="$NULLDEV"
+ ;;
+
+ --stylesheet)
+ STYLESHEET="$OPTARG" CS_DATA=${GROFF_TMPDIR}/pdf$$.cs
+ ;;
+
+ --no-toc-relocation)
+ TC_DATA="" TOC_FORMAT="" BODY_FORMAT=""
+ ;;
+
+ --no-kill-null-pages)
+ PDFROFF_COLLATE="$CAT" PDFROFF_KILL_NULL_PAGES=""
+ ;;
+#
+# any other non-null match must have matched more than one defined case,
+# so report the ambiguity, and bail out.
+#
+ --*)
+ echo >&2 "$CMD: ambiguous abbreviation in option '$1'"
+ exit 1
+ ;;
+#
+# while no match at all simply represents an undefined case.
+#
+ *)
+ echo >&2 "$CMD: unknown option '$1'"
+ exit 1
+ ;;
+ esac
+ ;;
+#
+# A solitary hyphen, as an argument, means "stream STDIN through groff",
+# while the "-i" option means "append STDIN stream to specified input files",
+# so set up a mechanism to achieve this, for ALL 'groff' passes.
+#
+ - | -i*)
+ STREAM="$CAT ${GROFF_TMPDIR}/pdf$$.in |"
+ test "$1" = "-" && INPUT_FILES="$INPUT_FILES $1" \
+ || GROFF_STYLE="$GROFF_STYLE $1"
+ ;;
+#
+# Those standard options which expect an argument, but are specified with
+# an intervening space, between flag and argument, must be reparsed, so we
+# can trap invalid use of '-T dev', or missing input files.
+#
+ -[dfFILmMnoPrTwW])
+ OPTNAME="$1"
+ shift; set reparse "$OPTNAME$@"
+ ;;
+#
+# Among standard options, '-Tdev' is treated as a special case.
+# '-Tps' is automatically enforced, so if specified, is silently ignored.
+#
+ -Tps) ;;
+#
+# No other '-Tdev' option is permitted.
+#
+ -T*) echo >&2 "$CMD: option '$1' is incompatible with PDF output"
+ exit 1
+ ;;
+#
+# '-h' and '-v' options redirect to their equivalent long forms ...
+#
+ -h*) set redirect --help
+ ;;
+#
+ -v*) shift; set redirect --version "$@"
+ ;;
+#
+# All other standard options are simply passed through to 'groff',
+# with no validation beforehand.
+#
+ -*) GROFF_STYLE="$GROFF_STYLE \"$1\""
+ ;;
+#
+# All non-option arguments are considered as possible input file names,
+# and are passed on to 'groff', unaltered.
+#
+ *) INPUT_FILES="$INPUT_FILES \"$1\""
+ ;;
+ esac
+ shift
+ done
+#
+# If the '-v' or '--version' option was specified,
+# then we simply emulate the behaviour of 'groff', with this option,
+# and quit.
+#
+ if test -n "$SHOW_VERSION"
+ then
+ echo >&2 "$SHOW_VERSION"
+ echo >&2; eval $GROFF_STYLE $INPUT_FILES
+ exit $?
+ fi
+#
+# Establish how to invoke 'echo', suppressing the terminating newline.
+# (Adapted from 'autoconf' code, as found in 'configure' scripts).
+#
+ case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,*-n*) n='' c='' ;;
+ *c*) n='-n' c='' ;;
+ *) n='' c='\c' ;;
+ esac
+#
+# If STDIN is specified among the input files,
+# or if no input files are specified, then we need to capture STDIN,
+# so we can replay it into each 'groff' processing pass.
+#
+ test -z "$INPUT_FILES" && STREAM="$CAT ${GROFF_TMPDIR}/pdf$$.in |"
+ test -n "$STREAM" && $CAT > ${GROFF_TMPDIR}/pdf$$.in
+#
+# Unless reference resolution is explicitly suppressed,
+# we initiate it by touching the cross reference dictionary file,
+# and initialise the comparator, to kickstart the reference resolver loop.
+#
+ SAY=":"
+ if test -z "$DIFF"
+ then
+ >> $REFFILE
+ echo kickstart > $REFCOPY
+ test x${SHOW_PROGRESS+"set"} = x"set" && SAY=echo
+#
+# In order to correctly resolve 'pdfmark' references,
+# we need to have both the 'awk' and 'diff' programs available.
+#
+ NO=''
+ if test -n "$GROFF_AWK_INTERPRETER"
+ then
+ AWK="$GROFF_AWK_INTERPRETER"
+ test -f "$AWK" && test -x "$AWK" || AWK=":"
+ else
+ for prog in @GROFF_AWK_INTERPRETERS@
+ do
+ AWK=`searchpath $prog "$PATH"`
+ test "$AWK" = ":" || break
+ done
+ fi
+ DIFF=`searchpath diff "$PATH"`
+ test "$AWK" = ":" && echo >&2 "$NOPROG 'awk' in PATH" && NO="$NO 'awk'"
+ test "$DIFF" = ":" && echo >&2 "$NOPROG 'diff' in PATH" && NO="$NO 'diff'"
+ if test -n "$NO"
+ then
+ set $NO
+ SAY=":" AWK=":" DIFF=":"
+ test $# -gt 1 && NO="s $1 and $2 are" || NO=" $1 is"
+ $CAT >&2 <<-ETX
+
+ *** WARNING ***
+
+ The program$NO required, but cannot be found;
+ consequently, '$CMD' is unable to resolve 'pdfmark' references.
+
+ Document processing will continue, but no 'pdfmark' reference dictionary
+ will be compiled; if any 'pdfmark' reference appears in the resulting PDF
+ document, the formatting may not be correct.
+
+ ETX
+ fi
+ fi
+#
+# Run the multi-pass 'pdfmark' reference resolver loop ...
+#
+ $SAY >&2 $n Resolving references ..$c
+ until $DIFF $REFCOPY $REFFILE 1>$NULLDEV 2>&1
+ do
+#
+# until all references are resolved, to yield consistent values
+# in each of two consecutive passes, or until it seems that no consistent
+# resolution is achievable.
+#
+ $SAY >&2 $n .$c
+ PASS_INDICATOR="${PASS_INDICATOR}."
+ if test "$PASS_INDICATOR" = "...."
+ then
+#
+# More than three passes required indicates a probable inconsistency
+# in the source document; diagnose, and bail out.
+#
+ $SAY >&2 " failed"
+ $CAT >&2 <<-ETX
+ $CMD: unable to resolve references consistently after three passes
+ $CMD: the source document may exhibit instability about the reference(s) ...
+ ETX
+#
+# Report the unresolved references, as a diff between the two pass files,
+# preferring 'unified' or 'context' diffs, when available
+#
+ DIFFOPT=''
+ $DIFF -c0 $NULLDEV $NULLDEV 1>$NULLDEV 2>&1 && DIFFOPT='-c0'
+ $DIFF -u0 $NULLDEV $NULLDEV 1>$NULLDEV 2>&1 && DIFFOPT='-u0'
+ $DIFF >&2 $DIFFOPT $REFCOPY $REFFILE
+ exit 1
+ fi
+#
+# Replace the comparison file copy from any previous pass,
+# with the most recently updated copy of the reference dictionary.
+# (Some versions of 'mv' may not support overwriting of an existing file,
+# so remove the old comparison file first).
+#
+ rm -f $REFCOPY
+ mv $REFFILE $REFCOPY
+#
+# Run 'groff' and 'awk', to identify reference marks in the document source,
+# filtering them into the reference dictionary; discard incomplete 'groff' output
+# at this stage.
+#
+ eval $STREAM $GROFF_STYLE -Z 1>$NULLDEV 2>$WRKFILE $REFCOPY $INPUT_FILES
+ $AWK '/^gropdf-info:href/ {$1 = ".pdfhref D -N"; print}' $WRKFILE > $REFFILE
+ done
+ $SAY >&2 " done"
+#
+# To get to here ...
+# We MUST have resolved all 'pdfmark' references, such that the content of the
+# updated reference dictionary file EXACTLY matches the last saved copy.
+#
+# If PDF output has been suppressed, then there is nothing more to do.
+#
+ test "$PDF_OUTPUT" = "$NULLDEV" && exit 0
+#
+# We are now ready to start preparing the intermediate PostScript files,
+# from which the PDF output will be compiled -- but before proceeding further ...
+# let's make sure we have a GhostScript interpreter to convert them!
+#
+ if test -n "$GROFF_GHOSTSCRIPT_INTERPRETER"
+ then
+ GS="$GROFF_GHOSTSCRIPT_INTERPRETER"
+ test -f "$GS" && test -x "$GS" || GS=":"
+ else
+ for prog in @GROFF_GHOSTSCRIPT_INTERPRETERS@
+ do
+ GS=`searchpath $prog "$PATH"`
+ test "$GS" = ":" || break
+ done
+ fi
+#
+# If we could not find a GhostScript interpreter, then we can do no more.
+#
+ if test "$GS" = ":"
+ then
+ echo >&2 "$CMD: installation problem: cannot find GhostScript interpreter"
+ $CAT >&2 <<-ETX
+
+ *** FATAL INSTALLATION ERROR ***
+
+ '$CMD' requires a GhostScript interpreter to convert PostScript to PDF.
+ You do not appear to have one installed; thus, '$CMD' cannot continue.
+
+ ETX
+ exit 1
+ fi
+#
+# We now extend the local copy of the reference dictionary file,
+# to create a full 'pdfmark' reference map for the document ...
+#
+ $AWK '/^grohtml-info/ {print ".pdfhref Z", $2, $3, $4}' $WRKFILE >> $REFCOPY
+#
+# ... appending a dummy map reference, to ensure that at least
+# one such is always present; (this is required, to suppress any
+# further intermediate output to stderr during the "press-ready"
+# runs of groff, for PDF output file production).
+#
+ echo ".pdfhref Z 0 0 0" >> $REFCOPY
+#
+# Evaluate any processing options which may have been specified
+# as a result of parsing the document source ...
+#
+ eval `$SED -n '/^ *pdfroff-option:set */s///p' $WRKFILE`
+#
+# ... (which is currently supported to enable "toc-relocation",
+# only when the document actually relies on it, and if it is not
+# explicitly disabled from the command line) ...
+#
+ if test x${toc_relocation-"auto"} != xenabled
+ then
+#
+# ... thus we reproduce the effect of the "--no-toc-relocation"
+# option, when no enabling request is detected in the document
+# control stream.
+#
+ TC_DATA="" TOC_FORMAT="" BODY_FORMAT=""
+ fi
+#
+# Re-enable progress reporting, if necessary ...
+# (Missing 'awk' or 'diff' may have disabled it, to avoid display
+# of spurious messages associated with reference resolution).
+#
+ test x${SHOW_PROGRESS+"set"} = x"set" && SAY=echo
+#
+# If a document cover style sheet is specified ...
+# then we run a special formatting pass, to create a cover section file.
+#
+ if test -n "$STYLESHEET"
+ then
+ DOT='^\.[ ]*'
+ CS_MACRO=${CS_MACRO-"CS"} CE_MACRO=${CE_MACRO-"CE"}
+ $SAY >&2 $n "Formatting document ... front cover section ..$c"
+ CS_FILTER="$STREAM $SED -n '/${DOT}${CS_MACRO}/,/${DOT}${CE_MACRO}/p'"
+ eval $CS_FILTER $INPUT_FILES | eval $GROFF_STYLE $STYLESHEET - > $CS_DATA
+ $SAY >&2 ". done"
+ fi
+#
+# If table of contents relocation is to be performed (it is, by default),
+# then we run an extra 'groff' pass, to format a TOC intermediate file.
+#
+ if test -n "$TC_DATA"
+ then
+ $SAY >&2 $n "Formatting document ... table of contents ..$c"
+ eval $STREAM $GROFF_STYLE $TOC_FORMAT $REFCOPY $INPUT_FILES > $TC_DATA
+ $SAY >&2 ". done"
+ fi
+#
+# In all cases, a final 'groff' pass is required, to format the document body.
+#
+ $SAY >&2 $n "Formatting document ... body section ..$c"
+ eval $STREAM $GROFF_STYLE $BODY_FORMAT $REFCOPY $INPUT_FILES > $BD_DATA
+ $SAY >&2 ". done"
+#
+# Finally ...
+# Invoke GhostScript as a PDF writer, to bind all of the generated
+# PostScript intermediate files into a single PDF output file.
+#
+ $SAY >&2 $n "Writing PDF output ..$c"
+ if test -z "$PDFROFF_POSTPROCESSOR_COMMAND"
+ then
+ PDFROFF_POSTPROCESSOR_COMMAND="$GS -dQUIET -dBATCH -dNOPAUSE -dSAFER
+ -sDEVICE=pdfwrite -sOutputFile="${PDF_OUTPUT-"-"}
+
+ elif test -n "$PDF_OUTPUT"
+ then
+ exec > $PDF_OUTPUT
+ fi
+#
+# (This 'sed' script is a hack, to eliminate redundant blank pages).
+#
+ ${PDFROFF_COLLATE-"$SED"} ${PDFROFF_KILL_NULL_PAGES-'
+ /%%Page:/{
+ N
+ /%%BeginPageSetup/b again
+ }
+ b
+ :again
+ /%%EndPageSetup/b finish
+ /%%Page:/{
+ N
+ b again
+ }
+ b
+ :finish
+ N
+ /^%%Page:.*\n0 Cg EP$/d
+ '} $TC_DATA $BD_DATA | $PDFROFF_POSTPROCESSOR_COMMAND $CS_DATA -
+ $SAY >&2 ". done"
+#
+# ------------------------------------------------------------------------------
+# $RCSfile$ $Revision$: end of file
diff --git a/contrib/pdfmark/sanitize.tmac b/contrib/pdfmark/sanitize.tmac
new file mode 100644
index 0000000..49feaa9
--- /dev/null
+++ b/contrib/pdfmark/sanitize.tmac
@@ -0,0 +1,170 @@
+.ig
+
+sanitize.tmac
+
+Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+..
+.eo
+.de sanitize
+.\" Usage: .sanitize name text ...
+.\"
+.\" Remove designated formatting escape sequences from "text ..."; return
+.\" the sanitized text in a string register, identified by "name".
+.\"
+.\" Begin by initializing the named result as an empty string, bind it to
+.\" an internal reference name, and discard the "name" argument, to leave
+.\" only the text which is to be sanitized, as residual arguments.
+.\"
+. ds \$1
+. als sanitize:result \$1
+. shift
+.
+.\" Initialize a working string register, which we will cyclically reduce
+.\" until it becomes empty, after starting with all of the text passed as
+.\" the residual arguments, and establish its initial length.
+.\"
+. ds sanitize:residual "\$*\"
+. length sanitize:residual.length "\$*\"
+.
+.\" Begin the cyclic reduction loop...
+.\"
+. while \n[sanitize:residual.length] \{\
+. \"
+. \" ...assuming, at the start of each cycle, that the next character
+. \" will not be skipped, and that it will be moved from the residual,
+. \" to the result, as the character-by-character scan proceeds.
+. \"
+. nr sanitize:skip.count 0
+. sanitize:scan.execute
+.
+. \" For each character scanned, we need to check if it matches the
+. \" normal escape character; the check is most readily performed, if
+. \" an alternative escape character is introduced, and when a match
+. \" is found, we prepare to skip an escape sequence.
+. \"
+. ec !
+. if '!*[sanitize:scan.char]'\' .nr sanitize:skip.count 1
+. ec
+. ie \n[sanitize:skip.count] \{\
+. \"
+. \" When a possible escape sequence has been detected, we back it
+. \" up, (in case it isn't recognized, and we need to reinstate its
+. \" content into the result string), then scan ahead to check for
+. \" an identifiable escape sequence...
+. \"
+. rn sanitize:scan.char sanitize:hold
+. sanitize:scan.execute
+. ie d sanitize:esc-\*[sanitize:scan.char] \
+. \"
+. \" ...which we delegate to its appropriate handler, to skip...
+. \"
+. sanitize:esc-\*[sanitize:scan.char]
+.
+. \" ...but, in the case of an unrecognized escape sequence, we copy
+. \" its backed-up content, followed by the character retrieved from
+. \" the current scan cycle, to the result string.
+. \"
+. el .as sanitize:result "\*[sanitize:hold]\*[sanitize:scan.char]\"
+. \}
+.
+. \" When the current scan cycle has retrieved a character, which isn't
+. \" part of any possible escape sequence, we simply copy that character
+. \" to the result string.
+. \"
+. el .as sanitize:result "\*[sanitize:scan.char]\"
+. \}
+.
+.\" Clean up the register space, by deleting all of the string registers,
+.\" and numeric registers, which are designated as temporary, for private
+.\" use within this macro only.
+.\"
+. rm sanitize:hold sanitize:scan.char sanitize:residual sanitize:result
+. rr sanitize:residual.length sanitize:skip.count
+..
+.de sanitize:scan.execute
+.\" Usage (internal): .sanitize:scan.execute
+.\"
+.\" Perform a single-character reduction of sanitize:residual, by copying
+.\" its initial character to sanitize:scan.char, and then deleting it from
+.\" sanitize:residual itself. (Note that we use arithmetic decrementation
+.\" of sanitize:residual.length, rather than repeating the length request
+.\" on sanitize:residual, because reduction WILL fail when there is only
+.\" one character remaining).
+.\"
+. nr sanitize:residual.length -1
+. ds sanitize:scan.char "\*[sanitize:residual]\"
+. substring sanitize:scan.char 0 0
+. substring sanitize:residual 1
+..
+.de sanitize:skip-(
+.\" Usage (internal): .sanitize:skip-(
+.\"
+.\" For any identified escape sequence, with a two-character property name,
+.\" simply skip over the next two characters in the residual string.
+.\"
+. nr sanitize:residual.length -2
+. substring sanitize:residual 2
+..
+.de sanitize:skip-[
+.\" Usage (internal): .sanitize:skip-[
+.\"
+.\" For any identified escape sequence, with an arbitrary-length property
+.\" name, skip following characters in the residual string, until we find
+.\" a terminal "]" character, or we exhaust the residual.
+.\"
+. while \n[sanitize:skip.count] \{\
+. sanitize:scan.execute
+. ie \n[sanitize:residual.length] \{\
+. \" We haven't yet exhausted the residual; if we find a nested "["
+. \" character, increment the nesting level, otherwise decrement it
+. \" for each "]"; it will become zero at the terminal "]".
+. \"
+. ie '\*[sanitize:scan.char]'[' .nr sanitize:skip.count +1
+. el .if '\*[sanitize:scan.char]']' .nr sanitize:skip.count -1
+. \}
+. \" Stop unconditionally, if we do exhaust the residual.
+. \"
+. el .nr sanitize:skip.count 0
+. \}
+..
+.de sanitize:esc-generic
+.\" Usage: .sanitize:esc-X
+.\"
+.\" (X represents any legitimate single-character escape sequence id).
+.\"
+.\" Handler for skipping "\X" sequences, in text which is to be sanitized;
+.\" this will automatically detect sequences conforming to any of the forms
+.\" "\Xc", "\X(cc", or "\X[...]", and will handle each appropriately. The
+.\" implementation is generic, and may be aliased to handle any specific
+.\" escape sequences, which exhibit similar semantics.
+.\"
+. sanitize:scan.execute
+. if d sanitize:skip-\*[sanitize:scan.char] \
+. sanitize:skip-\*[sanitize:scan.char]
+..
+.ec
+.\" Map the generic handler to specific escape sequences, as required.
+.\"
+.als sanitize:esc-F sanitize:esc-generic
+.\" Local Variables:
+.\" mode: nroff
+.\" End:
+.\" vim: filetype=groff:
+.\" sanitize.tmac: end of file
diff --git a/contrib/pdfmark/spdf.tmac b/contrib/pdfmark/spdf.tmac
new file mode 100644
index 0000000..130d8bd
--- /dev/null
+++ b/contrib/pdfmark/spdf.tmac
@@ -0,0 +1,328 @@
+.ig
+
+spdf.tmac
+
+Binding macros for use of "-m pdfmark" in conjunction with "-ms".
+
+
+Copyright (C) 2004-2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+..
+.\" Bindings
+.\" ========
+.\"
+.\" Generic output mode control flag; pdfmark.tmac will bind this to
+.\" its own internal PDFOPMODE flag.
+.\"
+.if !r OPMODE .nr OPMODE 1
+.\"
+.mso s.tmac
+.mso sanitize.tmac
+.mso pdfmark.tmac
+.
+.\" Establish a handler to clean up output context, at end of document.
+.\"
+.de pdf@exit em
+. if \\n[OPMODE] .pdfsync
+. pg@end-text
+.em pdf@exit
+.
+.
+.\" Omitted Sections
+.\" ================
+.\"
+.\" Define section markers, for special document sections,
+.\" which are to be omitted from regular document processing.
+.\"
+.\" .OMIT <name1> <name2>
+.\"
+.\" Defines a pair of macros, <name1> and <name2>, such that execution
+.\" of .<name1> marks the start of a block of troff input which should
+.\" be ignored; this block ends, on execution of .<name2>
+.\"
+.de OMIT OMIT
+. de \\$1
+. omit@begin \\$1 \\$2
+. .
+. de \\$2
+. omit@end \\$1 \\$2
+. .
+.\" Definition of the OMIT macro itself, ends when it is first used,
+.\" to identify an omitted section marker macro pair.
+.\"
+.OMIT CS CE \" front cover text, processed independently
+.OMIT MS ME \" menu definitions, for info documents only
+.
+.\" Actual omission is initiated by recording the name of the block
+.\" start macro, followed by injection of an "ig" request...
+.\"
+.de omit@begin
+. ds omit@section \\$1
+\. ig \\$2
+..
+.\" ...and terminates with verification that the end macro matches
+.\" the start macro, and removal of the start macro record; (error
+.\" reporting uses the "@error" macro, from s.tmac).
+.\"
+.de omit@end
+. if !'\\*[omit@section]'\\$1' .@error \\$2 without \\$1
+. rm omit@section
+..
+.
+.\" Document Outlines, and Section Headings
+.\" =======================================
+.\"
+.\" .XH [-N <name>] [-S] [-X] <outline-level> <heading-text> ...
+.\" .XN [-N <name>] [-S] [-X] <heading-text> ...
+.\"
+.\" Use after SH, and XN <n> respectively, to define text to be set
+.\" within the section heading, as a PDF document ouline entry, and
+.\" optionally, as a table of contents entry.
+.\"
+.\" Options:
+.\" -N <name> Assigns <name> as a pdfhref destination,
+.\" and associates it with the heading.
+.\"
+.\" -S Strip troff font-change escapes from the
+.\" text copied to the document outline.
+.\"
+.\" -X Force pdfhref destination assignment; if
+.\" -N <name> is unspecified, use first word
+.\" of <heading-text> as <name>.
+.\"
+.\" Arguments:
+.\" <outline-level> The nesting level of the heading, within
+.\" the document outline, and TOC. Required
+.\" for XH; inferred from NH <n>, for XN.
+.\"
+.\" <heading-text> Text (required) to appear within each of
+.\" the section heading, document outline,
+.\" and (optionally) TOC.
+.\"
+.\" Hooks:
+.\" XH-INIT User-defined macro, called on entry to XH;
+.\" used to specify initialization state which
+.\" may be needed after using SH; e.g. specify
+.\" a PDFHREF.INFO state without incorporation
+.\" of any "section" references.
+.\"
+.\" XN-INIT User-defined macro, called on entry to XN;
+.\" used to specify initialization state which
+.\" may be needed after using NH; e.g. specify
+.\" a PDFHREF.INFO state which may incorporate
+.\" "section" references.
+.\"
+.\" XH-UPDATE-TOC User-defined macro, called by both XH, and
+.\" XN; (there is no XN-UPDATE-TOC). Must be
+.\" defined, if a TOC entry is to be generated
+.\" by either XH, or XN; the format of such a
+.\" TOC entry is determined by the definition
+.\" of this macro.
+.\"
+.\" Our replacements for both XH, and XN macros share a common entry
+.\" point; we map both to their respective replacement hooks, so that
+.\" we may continue to take advantage of setup logic in s.tmac. When
+.\" these are eventually invoked, they will have been renamed so that
+.\" they replace XH, and XH respectively.
+.\"
+.de XH-REPLACEMENT als
+.als XN-REPLACEMENT XH-REPLACEMENT
+.\" FIXME: within s.tmac, the heading level established by the most
+.\" recent prior invocation of the NH macro is tracked by the "nh*hl"
+.\" private register; perhaps s.tmac could expose this more publicly,
+.\" as by this ostensibly read-only alias, since we need it to keep
+.\" PDF document outlines in synchronization with NH level...
+.\"
+.\" .aln .NH nh*hl
+.\"
+.\" ...but maybe a local "belt and braces" approach is better anyway,
+.\" to insulate "nh*hl" from possible abuse of our ".NH" register, by
+.\" any users who may be determined to shoot themselves in the foot!
+.\"
+.ie r nh*hl .nr spdf:nh*hl \n[nh*hl]
+.el .nr spdf:nh*hl 0
+.am @NH
+. nr spdf:nh*hl \\n[nh*hl]
+..
+.aln .NH spdf:nh*hl
+.
+.\" The common entry point for both XH, and XN, handles initialization,
+.\" and interpretation of any specified options, before handing over to
+.\" one of two distinct formatting helper macros, which are specific to
+.\" the XH, and XN implementations respectively.
+.\"
+.am XH-REPLACEMENT \" thus serving as implementation for both XH and XN
+.\"
+.\" The user is expected to furnish the XH-INIT, XH-UPDATE-TOC, and
+.\" XN-INIT handlers. (Note that the XH-UPDATE-TOC hook serves both
+.\" XH and XN; there is no separate XN-UPDATE-TOC). A suitable stub
+.\" for each is provided by s.tmac; we have no need to replace them.
+.\"
+. \\$0-INIT
+. rm spdf:refname
+. als spdf:bm.define spdf:bm.basic
+. while d spdf:XH\\$1 \{\
+. spdf:XH\\$1 \\$*
+. shift \\n[spdf:argc]
+. \}
+. rr spdf:argc
+. if '\\$1'--' .shift
+. spdf:\\$0.format \\$@
+..
+.\" Interpret the "-N <name>" option...
+.\"
+.de spdf:XH-N
+. ds spdf:refname \\$2
+. nr spdf:argc 2
+..
+.\" ...the "-X" option, and...
+.\"
+.de spdf:XH-X
+. if !d spdf:refname .ds spdf:refname \\\\$1
+. nr spdf:argc 1
+..
+.\" ...the "-S" option.
+.\"
+.de spdf:XH-S
+. als spdf:bm.define sanitize
+. nr spdf:argc 1
+..
+.\" By default, when the "-S" option is not specified, the text
+.\" incorporated into the PDF document outline will be a simple
+.\" verbatim copy of the arguments.
+.\"
+.de spdf:bm.basic
+. shift \" ignore \$1; it should always be "spdf:bm.text"
+. ds spdf:bm.text "\\$*\"
+..
+.\" After initialization, and interpretation of options, the XH
+.\" and XN implementations diverge, into this helper macro, which
+.\" is specific to the XH implementation...
+.\"
+.de spdf:XH.format
+. XH-UPDATE-TOC \\$@
+. ds spdf:bm.argv \\$1
+. shift \" finalization doesn't want the outline level in \$1
+. spdf:XH.finalize \\$@
+..
+.\" ...and this, which is specific to XN...
+.\"
+.de spdf:XN.format
+. ds spdf:bm.argv \\n[.NH] \\*[SN]
+. XH-UPDATE-TOC \\n[.NH] \\*[SN] \\$@
+. spdf:XH.finalize \\$@
+..
+.\" ...before ultimately converging back into this finalization
+.\" macro, which is once again common to both XH and XN.
+.\"
+.de spdf:XH.finalize
+. spdf:bm.define spdf:bm.text "\\$*"
+. if d spdf:refname .pdfhref M -X -N \\*[spdf:refname] -- \\$@
+. pdfhref O \\*[spdf:bm.argv] \\*[spdf:bm.text]
+. rm spdf:refname spdf:bm.argv spdf:bm.text
+. nop \\$*
+..
+.
+.\" Cross-Reference Marshalling
+.\" ===========================
+.\"
+.\" s.tmac provides the "pg@bottom" macro, which has already
+.\" been installed as a page transition trap. To ensure proper
+.\" mapping of "pdfhref" links which overflow the bottom of any
+.\" page, we need to install the "pdfhref" page transition hook,
+.\" as an addendum to this macro.
+.
+.pdfhref I -PT pg@bottom
+.
+.
+.\" Phased Output Control
+.\" =====================
+.\"
+.\" Segregate output of table of contents, and document body text,
+.\" into two distinct output phases, to facilitate assembly of the
+.\" aggregate document in the correct order, particularly when the
+.\" TOC is generated at the end, by the default "ms" mechanism.
+.\"
+.nr PDF-TOC-ONLY 1
+.nr PDF-BODY-TEXT 2
+.\"
+.\" .OP [<output-phase>]
+.\"
+.\" If the user-specified PHASE numeric register has been defined,
+.\" and its value matches the <output-phase> argument value, (or if
+.\" no <output-phase> argument is specified), then set the OPMODE
+.\" control flag to one, and activate groff's "pen-down" mode.
+.\"
+.\" Otherwise, if <output-phase> is specified, but does NOT match
+.\" PHASE, set OPMODE to zero, and select "pen-up" mode.
+.\"
+.\" Alternatively, if PHASE has not been defined, unconditionally
+.\" set OPMODE to one, and leave groff's pen state unchanged.
+.\"
+.de OP
+.ie r PHASE \{\
+. ie \\n(.$ \{\
+. nr op:request 0
+. while \\n(.$ \{\
+. if \\$1=\\n[PHASE] .nr op:request 1
+. shift
+. \}
+. \}
+. el .nr op:request 1
+. if !\\n[op:request]=\\n[OPMODE] \{\
+. nr OPMODE \\n[op:request]
+. nop \O[\\n[OPMODE]]\c
+. \}
+. \}
+.el .nr OPMODE 1
+..
+.
+.\" Table of Contents Generation
+.\" ============================
+.\"
+.\" .TC [no]
+.\"
+.\" Replaces (and emulates) the TC macro, from s.tmac, to ensure
+.\" that the pdfmark document outline cache is flushed, before TOC
+.\" generation commences, that an outline reference is added for the
+.\" TOC itself, and that pdfroff TOC relocation mode is enabled, for
+.\" the TOC output phase of document production.
+.\"
+.de TC
+. pdfsync O
+. P1
+. OP \n[PDF-TOC-ONLY]
+. pg@begin 1 i
+. if !\\n[PHASE] .tm pdfroff-option:set toc_relocation=enabled
+. if \\n[OPMODE] \{\
+. pdfhref O -T T 1 "\\*[TOC]"
+. pdfsync O
+. \}
+. PX \\$1
+..
+.
+.\" Initialize the default output state, for production of "body-text".
+.\"
+.OP \n[PDF-BODY-TEXT]
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" End:
+.\" vim: filetype=groff:
+.\" spdf.tmac: end of file
diff --git a/contrib/pic2graph/pic2graph.1.man b/contrib/pic2graph/pic2graph.1.man
new file mode 100644
index 0000000..f3c1c1e
--- /dev/null
+++ b/contrib/pic2graph/pic2graph.1.man
@@ -0,0 +1,234 @@
+.TH pic2graph @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+pic2graph \- convert a
+.I pic
+diagram into a cropped image
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" This documentation is released to the public domain.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_pic2graph_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY pic2graph
+.RB [ \-unsafe ]
+.RB [ \-format\~\c
+.IR output-format ]
+.RB [ \-eqn\~\c
+.IR delimiters ]
+.RI [ convert-argument \~.\|.\|.]
+.YS
+.
+.
+.SY pic2graph
+.B \-\-help
+.YS
+.
+.
+.SY pic2graph
+.B \-v
+.
+.SY pic2graph
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I pic2graph
+reads a
+.MR @g@pic @MAN1EXT@
+program from the standard input and writes an image file,
+by default in Portable Network Graphics (PNG) format,
+to the standard output.
+.
+It furthermore translates
+.MR @g@eqn @MAN1EXT@
+constructs, so it can be used for generating images of mathematical
+formulae.
+.
+.
+.PP
+The input PIC code should
+.I not
+be wrapped with the
+.B .PS
+and
+.BR .PE / .PF
+macros that normally guard it within
+.MR groff @MAN1EXT@
+documents.
+.
+.
+.\" FIXME: How old? This text hasn't been touched since 2008 at latest.
+.\" Older versions of
+.\" .I \%convert
+.\" will produce a black-on-white graphic; newer ones may produce a
+.\" black-on-transparent graphic.
+.
+.PP
+Arguments not recognized by
+.I pic2graph
+are passed to the ImageMagick or GraphicsMagick program
+.MR convert 1 .
+.
+.
+By specifying these, you can give your image a border,
+.\" Transparent backgrounds are the default in 2018.
+.\" force the background transparent,
+set the image's pixel density,
+or perform other useful transformations.
+.
+.
+.PP
+The output image is clipped using
+.IR \%convert 's
+.B \-trim
+option to the smallest possible bounding box that contains all the black
+pixels.
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.TP
+.BI \-eqn\~ delimiters
+Use
+.I delimiters
+as the opening and closing
+characters that delimit
+.I @g@eqn
+directives;
+the default is \(lq$$\(rq.
+.
+The option argument
+.I delimiters
+should be a two-character string,
+but an empty string (\(dq\(dq) is accepted as a directive to disable
+.I @g@eqn
+processing.
+.
+.
+.TP
+.BI \-format\~ output-format
+Write the image in
+.IR output-format ,
+which must be understood by
+.IR \%convert ;
+the default is PNG.
+.
+.
+.TP
+.B \-unsafe
+Run
+.I groff
+in
+.I unsafe
+mode, enabling the PIC command
+.B sh
+to execute arbitrary Unix shell commands.
+.
+The
+.I groff
+default is to forbid this.
+.
+.
+.\" ====================================================================
+.SH Environment
+.\" ====================================================================
+.
+.TP
+.I \%GROFF_TMPDIR
+.TQ
+.I \%TMPDIR
+.TQ
+.I TMP
+.TQ
+.I TEMP
+These environment variables are searched in the given order to determine
+the directory where temporary files will be created.
+.
+If none are set,
+.I /tmp
+is used.
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+.I pic2graph
+was written by
+.MT esr@\:thyrsus\:.com
+Eric S.\& Raymond
+.ME ,
+based on a recipe by W.\& Richard Stevens.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+W.\& Richard Stevens,
+.UR http://\:www\:.kohala\:.com/\:start/\:troff/\:pic2html\:.html
+.I Turning PIC into HTML
+.UE
+.
+.
+.PP
+.MR eqn2graph @MAN1EXT@ ,
+.MR grap2graph @MAN1EXT@ ,
+.MR @g@pic @MAN1EXT@ ,
+.MR @g@eqn @MAN1EXT@ ,
+.MR groff @MAN1EXT@ ,
+.MR convert 1
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_pic2graph_1_man_C]
+.do rr *groff_pic2graph_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/pic2graph/pic2graph.am b/contrib/pic2graph/pic2graph.am
new file mode 100644
index 0000000..9788270
--- /dev/null
+++ b/contrib/pic2graph/pic2graph.am
@@ -0,0 +1,40 @@
+# Copyright (C) 2001-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# pic2graph.am
+#
+
+pic2graph_srcdir = $(top_srcdir)/contrib/pic2graph
+man1_MANS += contrib/pic2graph/pic2graph.1
+bin_SCRIPTS += pic2graph
+EXTRA_DIST += \
+ contrib/pic2graph/pic2graph.sh \
+ contrib/pic2graph/pic2graph.1.man
+
+pic2graph: $(pic2graph_srcdir)/pic2graph.sh
+ $(AM_V_GEN)sed -e "s|[@]g[@]|$(g)|g" \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e $(SH_SCRIPT_SED_CMD) $(pic2graph_srcdir)/pic2graph.sh \
+ >$@ \
+ && chmod +x $@
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/contrib/pic2graph/pic2graph.sh b/contrib/pic2graph/pic2graph.sh
new file mode 100644
index 0000000..b229914
--- /dev/null
+++ b/contrib/pic2graph/pic2graph.sh
@@ -0,0 +1,122 @@
+#! /bin/sh
+#
+# pic2graph -- compile PIC image descriptions to bitmap images
+#
+# by Eric S. Raymond <esr@thyrsus.com>, July 2002
+
+# In Unixland, the magic is in knowing what to string together...
+#
+# Take a pic/eqn diagram on stdin, emit cropped bitmap on stdout.
+# The pic markup should *not* be wrapped in .PS/.PE, this script will do that.
+# An -unsafe 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). An -eqn option changes the eqn delimiters.
+# All other options are passed to convert(1). The default format in 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. Only the -U option of gpic(1) is relevant. -C doesn't matter because
+# we're generating our own .PS/.PE, -[ntcz] are irrelevant because we're
+# generating Postscript.
+#
+# 2. Ditto for groff(1), though it's a longer and more tedious demonstration.
+#
+# 3. Many options of convert(1) are potentially relevant (especially
+# -density, -interlace, -transparency, -border, and -comment).
+#
+# Thus, we pass -U to gpic and groff, and everything else to convert(1).
+#
+# We don't have complete option coverage on eqn because this is primarily
+# intended as a pic translator; we can live with eqn defaults.
+#
+groffpic_opts=""
+convert_opts=""
+convert_trim_arg="-trim"
+format="png"
+eqndelim='$$'
+
+while [ "$1" ]
+do
+ case $1 in
+ -unsafe)
+ groffpic_opts="-U";;
+ -format)
+ format=$2
+ shift;;
+ -eqn)
+ eqndelim=$2
+ shift;;
+ -v | --version)
+ echo "GNU pic2graph (groff) version @VERSION@"
+ exit 0;;
+ --help)
+ echo "usage: pic2graph [ option ...] < in > out"
+ exit 0;;
+ *)
+ convert_opts="$convert_opts $1";;
+ esac
+ shift
+done
+
+if [ "$eqndelim" ]
+then
+ eqndelim="delim $eqndelim"
+fi
+
+# create temporary directory
+tmp=
+for d in "$GROFF_TMPDIR" "$TMPDIR" "$TMP" "$TEMP" /tmp
+do
+ test -n "$d" && break
+done
+
+if ! test -d "$d"
+then
+ echo "$0: error: temporary directory \"$d\" does not exist or is" \
+ "not a directory" >&2
+ exit 1
+fi
+
+if ! tmp=`(umask 077 && mktemp -d -q "$d/pic2graph-XXXXXX") 2> /dev/null`
+then
+ # mktemp failed--not installed or is a version that doesn't support those
+ # flags? Fall back to older method which uses more predictable naming.
+ #
+ # $RANDOM is a Bashism. The fallback of $PPID is not good pseudorandomness,
+ # but is supported by the stripped-down dash shell, for instance.
+ tmp="$d/pic2graph$$-${RANDOM:-$PPID}"
+ (umask 077 && mkdir "$tmp") 2> /dev/null
+fi
+
+if ! test -d "$tmp"
+then
+ echo "$0: error: cannot create temporary directory \"$tmp\"" >&2
+ exit 1
+fi
+
+# See if the installed version of convert(1) is new enough to support the -trim
+# option. Versions that didn't were described as "old" as early as 2008.
+is_convert_recent=`convert -help | grep -e -trim`
+if test -z "$is_convert_recent"
+then
+ echo "$0: warning: falling back to old '-crop 0x0' trim method" >&2
+ convert_trim_arg="-crop 0x0"
+fi
+
+trap 'exit_status=$?; rm -rf "$tmp" && exit $exit_status' EXIT INT TERM
+
+# Here goes:
+# 1. Wrap the input in dummy .PS/PE macros (and add possibly null .EQ/.EN)
+# 2. Process through eqn and pic to emit troff markup.
+# 3. Process through groff to emit Postscript.
+# 4. Use convert(1) to crop the PostScript and turn it into a bitmap.
+(echo ".EQ"; echo $eqndelim; echo ".EN"; echo ".PS"; cat; echo ".PE") | \
+ groff -e -p $groffpic_opts -Tps -P-pletter > "$tmp"/pic2graph.ps \
+ && convert $convert_trim_arg $convert_opts "$tmp"/pic2graph.ps \
+ "$tmp"/pic2graph.$format \
+ && cat "$tmp"/pic2graph.$format
+
+# End
diff --git a/contrib/rfc1345/COPYRIGHT b/contrib/rfc1345/COPYRIGHT
new file mode 100644
index 0000000..9f3b859
--- /dev/null
+++ b/contrib/rfc1345/COPYRIGHT
@@ -0,0 +1,23 @@
+Copyright (c) 2021 Dorai Sitaram
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice (including
+the next paragraph) shall be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/contrib/rfc1345/groff_rfc1345.7.man b/contrib/rfc1345/groff_rfc1345.7.man
new file mode 100644
index 0000000..c04cad9
--- /dev/null
+++ b/contrib/rfc1345/groff_rfc1345.7.man
@@ -0,0 +1,265 @@
+.TH groff_rfc1345 @MAN7EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+groff_rfc1345 \- special character names from RFC 1345 and Vim digraphs
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (c) 2021 Dorai Sitaram
+.\"
+.\" Permission is hereby granted, free of charge, to any person
+.\" obtaining a copy of this software and associated documentation files
+.\" (the "Software"), to deal in the Software without restriction,
+.\" including without limitation the rights to use, copy, modify, merge,
+.\" publish, distribute, sublicense, and/or sell copies of the Software,
+.\" and to permit persons to whom the Software is furnished to do so,
+.\" subject to the following conditions:
+.\"
+.\" The above copyright notice and this permission notice (including the
+.\" next paragraph) shall be included in all copies or substantial
+.\" portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+.\" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+.\" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+.\" BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+.\" ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+.\" CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+.\" SOFTWARE.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_rfc1345_7_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The file
+.I rfc1345.tmac
+defines special character escape sequences for
+.MR groff @MAN7EXT@
+based on the glyph mnemonics specified in RFC 1345 and the digraph table
+of the text editor Vim.
+.
+Each escape sequence translates to a Unicode code point,
+and will render correctly if the underlying font is a Unicode font that
+covers the code point.
+.
+.
+.PP
+For example,
+.RB \[lq] \[rs][Rx] \[rq]
+is the \[lq]recipe\[rq] or \[lq]prescription take\[rq] symbol,
+and maps to the code point U+211E.
+.
+.I groff
+lets you write it as
+.RB \[lq] \[rs][u211E] \[rq],
+but
+.RB \[lq] \[rs][Rx] \[rq]
+is more mnemonic.
+.
+.
+.PP
+For a list of the glyph names provided,
+please see the file
+.IR rfc1345.tmac ,
+which contains definitions of the form
+.
+.RS
+.EX
+\&.char \[rs][Rx] \[rs][u211E] \[rs]" PRESCRIPTION TAKE
+.EE
+.RE
+.
+where
+.BR .char 's
+first argument defines a
+.I groff
+special character escape sequence with a mnemonic glyph name,
+its second argument is a special character escape sequence based on the
+code point,
+and the comment describes the glyph defined.
+.
+.
+.PP
+The RFC 1345 glyph names cover a wide range of Unicode code points,
+including
+supplemental Latin,
+Greek,
+Cyrillic,
+Hebrew,
+Arabic,
+Hiragana,
+Katakana,
+and Bopomofo letters,
+punctuation,
+math notation,
+currency
+symbols,
+industrial and entertainment icons,
+and box-drawing symbols.
+.
+.
+.PP
+The Vim digraph table is practically a subset of RFC 1345
+(being limited to two-character mnemonics),
+but,
+as a newer implementation,
+adds four mnemonics not specified in the RFC
+(the horizontal ellipsis,
+the Euro sign,
+and two mappings for the rouble sign).
+.
+These have also been added to
+.IR rfc1345.tmac .
+.
+.
+.PP
+.I rfc1345.tmac
+contains a total of 1,696 glyph names.
+.
+It is not an
+error to load
+.I rfc1345.tmac
+if your font does not have all the glyphs,
+as long as it contains the glyphs that you actually use in your
+document.
+.
+.
+.PP
+The RFC 1345 mnemonics are not identical in every case to the mappings
+for special character glyph names that are built in to
+.IR groff ;
+for example,
+.RB \[lq] \[rs][<<] \[rq]
+means the \[lq]much less than\[rq] sign (U+226A) when
+.I rfc1345.tmac
+is not loaded and this special character is not otherwise defined by a
+document or macro package.
+.
+.I rfc1345.tmac
+redefines
+.RB \[lq] \[rs][<<] \[rq]
+to the \[lq]left-pointing double angle quotation mark\[rq] (U+00AB).
+.
+See
+.MR groff_char @MAN7EXT@
+for the full list of predefined special character escape sequences.
+.
+.
+.\" ====================================================================
+.SS Usage
+.\" ====================================================================
+.
+Load the
+.I rfc1345.tmac
+file.
+.
+This can be done by either adding
+.RB \[lq] ".mso rfc1345.tmac" \[rq]
+to your document before the first use of any of the glyph names the
+macro file defines,
+or by using the
+.MR @g@troff @MAN1EXT@
+option
+.RB \[lq] "\-m rfc1345" \[rq]
+from the shell.
+.
+.
+.\" ====================================================================
+.SS Bugs
+.\" ====================================================================
+.
+As the
+.I groff
+Texinfo manual notes,
+\[lq][o]nly the current font is checked for ligatures and kerns;
+neither special fonts nor entities defined with the
+.B char
+request
+(and its siblings)
+are taken into account.\[rq]
+.
+Many of the characters defined in
+.I rfc1345.tmac
+are accented Latin letters,
+and will be affected by this deficiency,
+.UR https://\:savannah\:.gnu\:.org/\:bugs/\:?59932
+producing subpar typography
+.UE .
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @MACRODIR@/\:rfc1345\:.tmac
+implements the character mappings.
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+.I rfc1345\:.tmac
+was contributed by
+.MT ds26gte@\:yahoo\:.com
+Dorai Sitaram
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.UR https://\:tools\:.ietf\:.org/\:html/\:rfc1345
+RFC 1345
+.UE ,
+by Keld Simonsen,
+June 1992.
+.
+.
+.PP
+The Vim digraph table can be listed using the
+.MR vim 1
+command
+.RB \[lq] ":help \%digraph\-table" \[rq].
+.
+.
+.PP
+.MR groff_char @MAN7EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_rfc1345_7_man_C]
+.do rr *groff_groff_rfc1345_7_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/rfc1345/rfc1345.am b/contrib/rfc1345/rfc1345.am
new file mode 100644
index 0000000..7a23424
--- /dev/null
+++ b/contrib/rfc1345/rfc1345.am
@@ -0,0 +1,41 @@
+# Copyright 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+rfc1345_srcdir = $(top_srcdir)/contrib/rfc1345
+rfc1345_builddir = $(top_builddir)/contrib/rfc1345
+
+man7_MANS += contrib/rfc1345/groff_rfc1345.7
+
+# files installed in $(tmacdir)
+rfc1345tmacdir = $(tmacdir)
+dist_rfc1345tmac_DATA = contrib/rfc1345/rfc1345.tmac
+
+rfc1345_TESTS= \
+ contrib/rfc1345/tests/rfc1345-smoke-test.sh
+TESTS += $(rfc1345_TESTS)
+EXTRA_DIST += $(rfc1345_TESTS)
+
+EXTRA_DIST += \
+ contrib/rfc1345/groff_rfc1345.7.man \
+ contrib/rfc1345/COPYRIGHT
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/contrib/rfc1345/rfc1345.tmac b/contrib/rfc1345/rfc1345.tmac
new file mode 100644
index 0000000..5041e78
--- /dev/null
+++ b/contrib/rfc1345/rfc1345.tmac
@@ -0,0 +1,1705 @@
+.ig
+rfc1345.tmac
+
+Adds glyph names formed from
+- the mnemonics specified in
+ RFC 1345, https://www.rfc-editor.org/rfc/rfc1345.txt,
+ Keld Simonsen, June 1992; and
+- the digraphs ,. Eu =R =P from Vim's digraph table.
+..
+.char \[!I] \[u00A1] \" INVERTED EXCLAMATION MARK
+.char \[Ct] \[u00A2] \" CENT SIGN
+.char \[Pd] \[u00A3] \" POUND SIGN
+.char \[Cu] \[u00A4] \" CURRENCY SIGN
+.char \[Ye] \[u00A5] \" YEN SIGN
+.char \[BB] \[u00A6] \" BROKEN BAR
+.char \[SE] \[u00A7] \" SECTION SIGN
+.char \[':] \[u00A8] \" DIAERESIS
+.char \[Co] \[u00A9] \" COPYRIGHT SIGN
+.char \[-a] \[u00AA] \" FEMININE ORDINAL INDICATOR
+.char \[<<] \[u00AB] \" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+.char \[NO] \[u00AC] \" NOT SIGN
+.char \[--] \[u00AD] \" SOFT HYPHEN
+.char \[Rg] \[u00AE] \" REGISTERED SIGN
+.char \['m] \[u00AF] \" MACRON
+.char \[DG] \[u00B0] \" DEGREE SIGN
+.char \[+-] \[u00B1] \" PLUS-MINUS SIGN
+.char \[2S] \[u00B2] \" SUPERSCRIPT TWO
+.char \[3S] \[u00B3] \" SUPERSCRIPT THREE
+.char \[''] \[u00B4] \" ACUTE ACCENT
+.char \[My] \[u00B5] \" MICRO SIGN
+.char \[PI] \[u00B6] \" PILCROW SIGN
+.char \[.M] \[u00B7] \" MIDDLE DOT
+.char \[',] \[u00B8] \" CEDILLA
+.char \[1S] \[u00B9] \" SUPERSCRIPT ONE
+.char \[-o] \[u00BA] \" MASCULINE ORDINAL INDICATOR
+.char \[>>] \[u00BB] \" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+.char \[14] \[u00BC] \" VULGAR FRACTION ONE QUARTER
+.char \[12] \[u00BD] \" VULGAR FRACTION ONE HALF
+.char \[34] \[u00BE] \" VULGAR FRACTION THREE QUARTERS
+.char \[?I] \[u00BF] \" INVERTED QUESTION MARK
+.char \[A!] \[u00C0] \" LATIN CAPITAL LETTER A WITH GRAVE
+.char \[A'] \[u00C1] \" LATIN CAPITAL LETTER A WITH ACUTE
+.char \[A>] \[u00C2] \" LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+.char \[A?] \[u00C3] \" LATIN CAPITAL LETTER A WITH TILDE
+.char \[A:] \[u00C4] \" LATIN CAPITAL LETTER A WITH DIAERESIS
+.char \[AA] \[u00C5] \" LATIN CAPITAL LETTER A WITH RING ABOVE
+.char \[AE] \[u00C6] \" LATIN CAPITAL LETTER AE
+.char \[C,] \[u00C7] \" LATIN CAPITAL LETTER C WITH CEDILLA
+.char \[E!] \[u00C8] \" LATIN CAPITAL LETTER E WITH GRAVE
+.char \[E'] \[u00C9] \" LATIN CAPITAL LETTER E WITH ACUTE
+.char \[E>] \[u00CA] \" LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+.char \[E:] \[u00CB] \" LATIN CAPITAL LETTER E WITH DIAERESIS
+.char \[I!] \[u00CC] \" LATIN CAPITAL LETTER I WITH GRAVE
+.char \[I'] \[u00CD] \" LATIN CAPITAL LETTER I WITH ACUTE
+.char \[I>] \[u00CE] \" LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+.char \[I:] \[u00CF] \" LATIN CAPITAL LETTER I WITH DIAERESIS
+.char \[D-] \[u00D0] \" LATIN CAPITAL LETTER ETH (Icelandic)
+.char \[N?] \[u00D1] \" LATIN CAPITAL LETTER N WITH TILDE
+.char \[O!] \[u00D2] \" LATIN CAPITAL LETTER O WITH GRAVE
+.char \[O'] \[u00D3] \" LATIN CAPITAL LETTER O WITH ACUTE
+.char \[O>] \[u00D4] \" LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+.char \[O?] \[u00D5] \" LATIN CAPITAL LETTER O WITH TILDE
+.char \[O:] \[u00D6] \" LATIN CAPITAL LETTER O WITH DIAERESIS
+.char \[*X] \[u00D7] \" MULTIPLICATION SIGN
+.char \[O/] \[u00D8] \" LATIN CAPITAL LETTER O WITH STROKE
+.char \[U!] \[u00D9] \" LATIN CAPITAL LETTER U WITH GRAVE
+.char \[U'] \[u00DA] \" LATIN CAPITAL LETTER U WITH ACUTE
+.char \[U>] \[u00DB] \" LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+.char \[U:] \[u00DC] \" LATIN CAPITAL LETTER U WITH DIAERESIS
+.char \[Y'] \[u00DD] \" LATIN CAPITAL LETTER Y WITH ACUTE
+.char \[TH] \[u00DE] \" LATIN CAPITAL LETTER THORN (Icelandic)
+.char \[ss] \[u00DF] \" LATIN SMALL LETTER SHARP S (German)
+.char \[a!] \[u00E0] \" LATIN SMALL LETTER A WITH GRAVE
+.char \[a'] \[u00E1] \" LATIN SMALL LETTER A WITH ACUTE
+.char \[a>] \[u00E2] \" LATIN SMALL LETTER A WITH CIRCUMFLEX
+.char \[a?] \[u00E3] \" LATIN SMALL LETTER A WITH TILDE
+.char \[a:] \[u00E4] \" LATIN SMALL LETTER A WITH DIAERESIS
+.char \[aa] \[u00E5] \" LATIN SMALL LETTER A WITH RING ABOVE
+.char \[ae] \[u00E6] \" LATIN SMALL LETTER AE
+.char \[c,] \[u00E7] \" LATIN SMALL LETTER C WITH CEDILLA
+.char \[e!] \[u00E8] \" LATIN SMALL LETTER E WITH GRAVE
+.char \[e'] \[u00E9] \" LATIN SMALL LETTER E WITH ACUTE
+.char \[e>] \[u00EA] \" LATIN SMALL LETTER E WITH CIRCUMFLEX
+.char \[e:] \[u00EB] \" LATIN SMALL LETTER E WITH DIAERESIS
+.char \[i!] \[u00EC] \" LATIN SMALL LETTER I WITH GRAVE
+.char \[i'] \[u00ED] \" LATIN SMALL LETTER I WITH ACUTE
+.char \[i>] \[u00EE] \" LATIN SMALL LETTER I WITH CIRCUMFLEX
+.char \[i:] \[u00EF] \" LATIN SMALL LETTER I WITH DIAERESIS
+.char \[d-] \[u00F0] \" LATIN SMALL LETTER ETH (Icelandic)
+.char \[n?] \[u00F1] \" LATIN SMALL LETTER N WITH TILDE
+.char \[o!] \[u00F2] \" LATIN SMALL LETTER O WITH GRAVE
+.char \[o'] \[u00F3] \" LATIN SMALL LETTER O WITH ACUTE
+.char \[o>] \[u00F4] \" LATIN SMALL LETTER O WITH CIRCUMFLEX
+.char \[o?] \[u00F5] \" LATIN SMALL LETTER O WITH TILDE
+.char \[o:] \[u00F6] \" LATIN SMALL LETTER O WITH DIAERESIS
+.char \[-:] \[u00F7] \" DIVISION SIGN
+.char \[o/] \[u00F8] \" LATIN SMALL LETTER O WITH STROKE
+.char \[u!] \[u00F9] \" LATIN SMALL LETTER U WITH GRAVE
+.char \[u'] \[u00FA] \" LATIN SMALL LETTER U WITH ACUTE
+.char \[u>] \[u00FB] \" LATIN SMALL LETTER U WITH CIRCUMFLEX
+.char \[u:] \[u00FC] \" LATIN SMALL LETTER U WITH DIAERESIS
+.char \[y'] \[u00FD] \" LATIN SMALL LETTER Y WITH ACUTE
+.char \[th] \[u00FE] \" LATIN SMALL LETTER THORN (Icelandic)
+.char \[y:] \[u00FF] \" LATIN SMALL LETTER Y WITH DIAERESIS
+.char \[A-] \[u0100] \" LATIN CAPITAL LETTER A WITH MACRON
+.char \[a-] \[u0101] \" LATIN SMALL LETTER A WITH MACRON
+.char \[A(] \[u0102] \" LATIN CAPITAL LETTER A WITH BREVE
+.char \[a(] \[u0103] \" LATIN SMALL LETTER A WITH BREVE
+.char \[A;] \[u0104] \" LATIN CAPITAL LETTER A WITH OGONEK
+.char \[a;] \[u0105] \" LATIN SMALL LETTER A WITH OGONEK
+.char \[C'] \[u0106] \" LATIN CAPITAL LETTER C WITH ACUTE
+.char \[c'] \[u0107] \" LATIN SMALL LETTER C WITH ACUTE
+.char \[C>] \[u0108] \" LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+.char \[c>] \[u0109] \" LATIN SMALL LETTER C WITH CIRCUMFLEX
+.char \[C.] \[u010A] \" LATIN CAPITAL LETTER C WITH DOT ABOVE
+.char \[c.] \[u010B] \" LATIN SMALL LETTER C WITH DOT ABOVE
+.char \[C<] \[u010C] \" LATIN CAPITAL LETTER C WITH CARON
+.char \[c<] \[u010D] \" LATIN SMALL LETTER C WITH CARON
+.char \[D<] \[u010E] \" LATIN CAPITAL LETTER D WITH CARON
+.char \[d<] \[u010F] \" LATIN SMALL LETTER D WITH CARON
+.char \[D/] \[u0110] \" LATIN CAPITAL LETTER D WITH STROKE
+.char \[d/] \[u0111] \" LATIN SMALL LETTER D WITH STROKE
+.char \[E-] \[u0112] \" LATIN CAPITAL LETTER E WITH MACRON
+.char \[e-] \[u0113] \" LATIN SMALL LETTER E WITH MACRON
+.char \[E(] \[u0114] \" LATIN CAPITAL LETTER E WITH BREVE
+.char \[e(] \[u0115] \" LATIN SMALL LETTER E WITH BREVE
+.char \[E.] \[u0116] \" LATIN CAPITAL LETTER E WITH DOT ABOVE
+.char \[e.] \[u0117] \" LATIN SMALL LETTER E WITH DOT ABOVE
+.char \[E;] \[u0118] \" LATIN CAPITAL LETTER E WITH OGONEK
+.char \[e;] \[u0119] \" LATIN SMALL LETTER E WITH OGONEK
+.char \[E<] \[u011A] \" LATIN CAPITAL LETTER E WITH CARON
+.char \[e<] \[u011B] \" LATIN SMALL LETTER E WITH CARON
+.char \[G>] \[u011C] \" LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+.char \[g>] \[u011D] \" LATIN SMALL LETTER G WITH CIRCUMFLEX
+.char \[G(] \[u011E] \" LATIN CAPITAL LETTER G WITH BREVE
+.char \[g(] \[u011F] \" LATIN SMALL LETTER G WITH BREVE
+.char \[G.] \[u0120] \" LATIN CAPITAL LETTER G WITH DOT ABOVE
+.char \[g.] \[u0121] \" LATIN SMALL LETTER G WITH DOT ABOVE
+.char \[G,] \[u0122] \" LATIN CAPITAL LETTER G WITH CEDILLA
+.char \[g,] \[u0123] \" LATIN SMALL LETTER G WITH CEDILLA
+.char \[H>] \[u0124] \" LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+.char \[h>] \[u0125] \" LATIN SMALL LETTER H WITH CIRCUMFLEX
+.char \[H/] \[u0126] \" LATIN CAPITAL LETTER H WITH STROKE
+.char \[h/] \[u0127] \" LATIN SMALL LETTER H WITH STROKE
+.char \[I?] \[u0128] \" LATIN CAPITAL LETTER I WITH TILDE
+.char \[i?] \[u0129] \" LATIN SMALL LETTER I WITH TILDE
+.char \[I-] \[u012A] \" LATIN CAPITAL LETTER I WITH MACRON
+.char \[i-] \[u012B] \" LATIN SMALL LETTER I WITH MACRON
+.char \[I(] \[u012C] \" LATIN CAPITAL LETTER I WITH BREVE
+.char \[i(] \[u012D] \" LATIN SMALL LETTER I WITH BREVE
+.char \[I;] \[u012E] \" LATIN CAPITAL LETTER I WITH OGONEK
+.char \[i;] \[u012F] \" LATIN SMALL LETTER I WITH OGONEK
+.char \[I.] \[u0130] \" LATIN CAPITAL LETTER I WITH DOT ABOVE
+.char \[i.] \[u0131] \" LATIN SMALL LETTER I DOTLESS
+.char \[IJ] \[u0132] \" LATIN CAPITAL LIGATURE IJ
+.char \[ij] \[u0133] \" LATIN SMALL LIGATURE IJ
+.char \[J>] \[u0134] \" LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+.char \[j>] \[u0135] \" LATIN SMALL LETTER J WITH CIRCUMFLEX
+.char \[K,] \[u0136] \" LATIN CAPITAL LETTER K WITH CEDILLA
+.char \[k,] \[u0137] \" LATIN SMALL LETTER K WITH CEDILLA
+.char \[kk] \[u0138] \" LATIN SMALL LETTER KRA (Greenlandic)
+.char \[L'] \[u0139] \" LATIN CAPITAL LETTER L WITH ACUTE
+.char \[l'] \[u013A] \" LATIN SMALL LETTER L WITH ACUTE
+.char \[L,] \[u013B] \" LATIN CAPITAL LETTER L WITH CEDILLA
+.char \[l,] \[u013C] \" LATIN SMALL LETTER L WITH CEDILLA
+.char \[L<] \[u013D] \" LATIN CAPITAL LETTER L WITH CARON
+.char \[l<] \[u013E] \" LATIN SMALL LETTER L WITH CARON
+.char \[L.] \[u013F] \" LATIN CAPITAL LETTER L WITH MIDDLE DOT
+.char \[l.] \[u0140] \" LATIN SMALL LETTER L WITH MIDDLE DOT
+.char \[L/] \[u0141] \" LATIN CAPITAL LETTER L WITH STROKE
+.char \[l/] \[u0142] \" LATIN SMALL LETTER L WITH STROKE
+.char \[N'] \[u0143] \" LATIN CAPITAL LETTER N WITH ACUTE
+.char \[n'] \[u0144] \" LATIN SMALL LETTER N WITH ACUTE
+.char \[N,] \[u0145] \" LATIN CAPITAL LETTER N WITH CEDILLA
+.char \[n,] \[u0146] \" LATIN SMALL LETTER N WITH CEDILLA
+.char \[N<] \[u0147] \" LATIN CAPITAL LETTER N WITH CARON
+.char \[n<] \[u0148] \" LATIN SMALL LETTER N WITH CARON
+.char \['n] \[u0149] \" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+.char \[NG] \[u014A] \" LATIN CAPITAL LETTER ENG (Lappish)
+.char \[ng] \[u014B] \" LATIN SMALL LETTER ENG (Lappish)
+.char \[O-] \[u014C] \" LATIN CAPITAL LETTER O WITH MACRON
+.char \[o-] \[u014D] \" LATIN SMALL LETTER O WITH MACRON
+.char \[O(] \[u014E] \" LATIN CAPITAL LETTER O WITH BREVE
+.char \[o(] \[u014F] \" LATIN SMALL LETTER O WITH BREVE
+.char \[O"] \[u0150] \" LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+.char \[o"] \[u0151] \" LATIN SMALL LETTER O WITH DOUBLE ACUTE
+.char \[OE] \[u0152] \" LATIN CAPITAL LIGATURE OE
+.char \[oe] \[u0153] \" LATIN SMALL LIGATURE OE
+.char \[R'] \[u0154] \" LATIN CAPITAL LETTER R WITH ACUTE
+.char \[r'] \[u0155] \" LATIN SMALL LETTER R WITH ACUTE
+.char \[R,] \[u0156] \" LATIN CAPITAL LETTER R WITH CEDILLA
+.char \[r,] \[u0157] \" LATIN SMALL LETTER R WITH CEDILLA
+.char \[R<] \[u0158] \" LATIN CAPITAL LETTER R WITH CARON
+.char \[r<] \[u0159] \" LATIN SMALL LETTER R WITH CARON
+.char \[S'] \[u015A] \" LATIN CAPITAL LETTER S WITH ACUTE
+.char \[s'] \[u015B] \" LATIN SMALL LETTER S WITH ACUTE
+.char \[S>] \[u015C] \" LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+.char \[s>] \[u015D] \" LATIN SMALL LETTER S WITH CIRCUMFLEX
+.char \[S,] \[u015E] \" LATIN CAPITAL LETTER S WITH CEDILLA
+.char \[s,] \[u015F] \" LATIN SMALL LETTER S WITH CEDILLA
+.char \[S<] \[u0160] \" LATIN CAPITAL LETTER S WITH CARON
+.char \[s<] \[u0161] \" LATIN SMALL LETTER S WITH CARON
+.char \[T,] \[u0162] \" LATIN CAPITAL LETTER T WITH CEDILLA
+.char \[t,] \[u0163] \" LATIN SMALL LETTER T WITH CEDILLA
+.char \[T<] \[u0164] \" LATIN CAPITAL LETTER T WITH CARON
+.char \[t<] \[u0165] \" LATIN SMALL LETTER T WITH CARON
+.char \[T/] \[u0166] \" LATIN CAPITAL LETTER T WITH STROKE
+.char \[t/] \[u0167] \" LATIN SMALL LETTER T WITH STROKE
+.char \[U?] \[u0168] \" LATIN CAPITAL LETTER U WITH TILDE
+.char \[u?] \[u0169] \" LATIN SMALL LETTER U WITH TILDE
+.char \[U-] \[u016A] \" LATIN CAPITAL LETTER U WITH MACRON
+.char \[u-] \[u016B] \" LATIN SMALL LETTER U WITH MACRON
+.char \[U(] \[u016C] \" LATIN CAPITAL LETTER U WITH BREVE
+.char \[u(] \[u016D] \" LATIN SMALL LETTER U WITH BREVE
+.char \[U0] \[u016E] \" LATIN CAPITAL LETTER U WITH RING ABOVE
+.char \[u0] \[u016F] \" LATIN SMALL LETTER U WITH RING ABOVE
+.char \[U"] \[u0170] \" LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+.char \[u"] \[u0171] \" LATIN SMALL LETTER U WITH DOUBLE ACUTE
+.char \[U;] \[u0172] \" LATIN CAPITAL LETTER U WITH OGONEK
+.char \[u;] \[u0173] \" LATIN SMALL LETTER U WITH OGONEK
+.char \[W>] \[u0174] \" LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+.char \[w>] \[u0175] \" LATIN SMALL LETTER W WITH CIRCUMFLEX
+.char \[Y>] \[u0176] \" LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+.char \[y>] \[u0177] \" LATIN SMALL LETTER Y WITH CIRCUMFLEX
+.char \[Y:] \[u0178] \" LATIN CAPITAL LETTER Y WITH DIAERESIS
+.char \[Z'] \[u0179] \" LATIN CAPITAL LETTER Z WITH ACUTE
+.char \[z'] \[u017A] \" LATIN SMALL LETTER Z WITH ACUTE
+.char \[Z.] \[u017B] \" LATIN CAPITAL LETTER Z WITH DOT ABOVE
+.char \[z.] \[u017C] \" LATIN SMALL LETTER Z WITH DOT ABOVE
+.char \[Z<] \[u017D] \" LATIN CAPITAL LETTER Z WITH CARON
+.char \[z<] \[u017E] \" LATIN SMALL LETTER Z WITH CARON
+.char \[O9] \[u01A0] \" LATIN CAPITAL LETTER O WITH HORN
+.char \[o9] \[u01A1] \" LATIN SMALL LETTER O WITH HORN
+.char \[OI] \[u01A2] \" LATIN CAPITAL LETTER OI
+.char \[oi] \[u01A3] \" LATIN SMALL LETTER OI
+.char \[yr] \[u01A6] \" LATIN LETTER YR
+.char \[U9] \[u01AF] \" LATIN CAPITAL LETTER U WITH HORN
+.char \[u9] \[u01B0] \" LATIN SMALL LETTER U WITH HORN
+.char \[Z/] \[u01B5] \" LATIN CAPITAL LETTER Z WITH STROKE
+.char \[z/] \[u01B6] \" LATIN SMALL LETTER Z WITH STROKE
+.char \[ED] \[u01B7] \" LATIN CAPITAL LETTER EZH
+.char \[A<] \[u01CD] \" LATIN CAPITAL LETTER A WITH CARON
+.char \[a<] \[u01CE] \" LATIN SMALL LETTER A WITH CARON
+.char \[I<] \[u01CF] \" LATIN CAPITAL LETTER I WITH CARON
+.char \[i<] \[u01D0] \" LATIN SMALL LETTER I WITH CARON
+.char \[O<] \[u01D1] \" LATIN CAPITAL LETTER O WITH CARON
+.char \[o<] \[u01D2] \" LATIN SMALL LETTER O WITH CARON
+.char \[U<] \[u01D3] \" LATIN CAPITAL LETTER U WITH CARON
+.char \[u<] \[u01D4] \" LATIN SMALL LETTER U WITH CARON
+.char \[U:-] \[u01D5] \" LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+.char \[u:-] \[u01D6] \" LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+.char \[U:'] \[u01D7] \" LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+.char \[u:'] \[u01D8] \" LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+.char \[U:<] \[u01D9] \" LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+.char \[u:<] \[u01DA] \" LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+.char \[U:!] \[u01DB] \" LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+.char \[u:!] \[u01DC] \" LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+.char \[A1] \[u01DE] \" LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+.char \[a1] \[u01DF] \" LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+.char \[A7] \[u01E0] \" LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+.char \[a7] \[u01E1] \" LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+.char \[A3] \[u01E2] \" LATIN CAPITAL LETTER AE WITH MACRON
+.char \[a3] \[u01E3] \" LATIN SMALL LETTER AE WITH MACRON
+.char \[G/] \[u01E4] \" LATIN CAPITAL LETTER G WITH STROKE
+.char \[g/] \[u01E5] \" LATIN SMALL LETTER G WITH STROKE
+.char \[G<] \[u01E6] \" LATIN CAPITAL LETTER G WITH CARON
+.char \[g<] \[u01E7] \" LATIN SMALL LETTER G WITH CARON
+.char \[K<] \[u01E8] \" LATIN CAPITAL LETTER K WITH CARON
+.char \[k<] \[u01E9] \" LATIN SMALL LETTER K WITH CARON
+.char \[O;] \[u01EA] \" LATIN CAPITAL LETTER O WITH OGONEK
+.char \[o;] \[u01EB] \" LATIN SMALL LETTER O WITH OGONEK
+.char \[O1] \[u01EC] \" LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+.char \[o1] \[u01ED] \" LATIN SMALL LETTER O WITH OGONEK AND MACRON
+.char \[EZ] \[u01EE] \" LATIN CAPITAL LETTER EZH WITH CARON
+.char \[ez] \[u01EF] \" LATIN SMALL LETTER EZH WITH CARON
+.char \[j<] \[u01F0] \" LATIN SMALL LETTER J WITH CARON
+.char \[G'] \[u01F4] \" LATIN CAPITAL LETTER G WITH ACUTE
+.char \[g'] \[u01F5] \" LATIN SMALL LETTER G WITH ACUTE
+.char \[AA'] \[u01FA] \" LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+.char \[aa'] \[u01FB] \" LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+.char \[AE'] \[u01FC] \" LATIN CAPITAL LETTER AE WITH ACUTE
+.char \[ae'] \[u01FD] \" LATIN SMALL LETTER AE WITH ACUTE
+.char \[O/'] \[u01FE] \" LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+.char \[o/'] \[u01FF] \" LATIN SMALL LETTER O WITH STROKE AND ACUTE
+.char \[;S] \[u02BF] \" MODIFIER LETTER LEFT HALF RING
+.char \['<] \[u02C7] \" CARON
+.char \['(] \[u02D8] \" BREVE
+.char \['.] \[u02D9] \" DOT ABOVE
+.char \['0] \[u02DA] \" RING ABOVE
+.char \[';] \[u02DB] \" OGONEK
+.char \['"] \[u02DD] \" DOUBLE ACUTE ACCENT
+.char \[A%] \[u0386] \" GREEK CAPITAL LETTER ALPHA WITH ACUTE
+.char \[E%] \[u0388] \" GREEK CAPITAL LETTER EPSILON WITH ACUTE
+.char \[Y%] \[u0389] \" GREEK CAPITAL LETTER ETA WITH ACUTE
+.char \[I%] \[u038A] \" GREEK CAPITAL LETTER IOTA WITH ACUTE
+.char \[O%] \[u038C] \" GREEK CAPITAL LETTER OMICRON WITH ACUTE
+.char \[U%] \[u038E] \" GREEK CAPITAL LETTER UPSILON WITH ACUTE
+.char \[W%] \[u038F] \" GREEK CAPITAL LETTER OMEGA WITH ACUTE
+.char \[i3] \[u0390] \" GREEK SMALL LETTER IOTA WITH ACUTE AND DIAERESIS
+.char \[A*] \[u0391] \" GREEK CAPITAL LETTER ALPHA
+.char \[B*] \[u0392] \" GREEK CAPITAL LETTER BETA
+.char \[G*] \[u0393] \" GREEK CAPITAL LETTER GAMMA
+.char \[D*] \[u0394] \" GREEK CAPITAL LETTER DELTA
+.char \[E*] \[u0395] \" GREEK CAPITAL LETTER EPSILON
+.char \[Z*] \[u0396] \" GREEK CAPITAL LETTER ZETA
+.char \[Y*] \[u0397] \" GREEK CAPITAL LETTER ETA
+.char \[H*] \[u0398] \" GREEK CAPITAL LETTER THETA
+.char \[I*] \[u0399] \" GREEK CAPITAL LETTER IOTA
+.char \[K*] \[u039A] \" GREEK CAPITAL LETTER KAPPA
+.char \[L*] \[u039B] \" GREEK CAPITAL LETTER LAMDA
+.char \[M*] \[u039C] \" GREEK CAPITAL LETTER MU
+.char \[N*] \[u039D] \" GREEK CAPITAL LETTER NU
+.char \[C*] \[u039E] \" GREEK CAPITAL LETTER XI
+.char \[O*] \[u039F] \" GREEK CAPITAL LETTER OMICRON
+.char \[P*] \[u03A0] \" GREEK CAPITAL LETTER PI
+.char \[R*] \[u03A1] \" GREEK CAPITAL LETTER RHO
+.char \[S*] \[u03A3] \" GREEK CAPITAL LETTER SIGMA
+.char \[T*] \[u03A4] \" GREEK CAPITAL LETTER TAU
+.char \[U*] \[u03A5] \" GREEK CAPITAL LETTER UPSILON
+.char \[F*] \[u03A6] \" GREEK CAPITAL LETTER PHI
+.char \[X*] \[u03A7] \" GREEK CAPITAL LETTER CHI
+.char \[Q*] \[u03A8] \" GREEK CAPITAL LETTER PSI
+.char \[W*] \[u03A9] \" GREEK CAPITAL LETTER OMEGA
+.char \[J*] \[u03AA] \" GREEK CAPITAL LETTER IOTA WITH DIAERESIS
+.char \[V*] \[u03AB] \" GREEK CAPITAL LETTER UPSILON WITH DIAERESIS
+.char \[a%] \[u03AC] \" GREEK SMALL LETTER ALPHA WITH ACUTE
+.char \[e%] \[u03AD] \" GREEK SMALL LETTER EPSILON WITH ACUTE
+.char \[y%] \[u03AE] \" GREEK SMALL LETTER ETA WITH ACUTE
+.char \[i%] \[u03AF] \" GREEK SMALL LETTER IOTA WITH ACUTE
+.char \[u3] \[u03B0] \" GREEK SMALL LETTER UPSILON WITH ACUTE AND DIAERESIS
+.char \[a*] \[u03B1] \" GREEK SMALL LETTER ALPHA
+.char \[b*] \[u03B2] \" GREEK SMALL LETTER BETA
+.char \[g*] \[u03B3] \" GREEK SMALL LETTER GAMMA
+.char \[d*] \[u03B4] \" GREEK SMALL LETTER DELTA
+.char \[e*] \[u03B5] \" GREEK SMALL LETTER EPSILON
+.char \[z*] \[u03B6] \" GREEK SMALL LETTER ZETA
+.char \[y*] \[u03B7] \" GREEK SMALL LETTER ETA
+.char \[h*] \[u03B8] \" GREEK SMALL LETTER THETA
+.char \[i*] \[u03B9] \" GREEK SMALL LETTER IOTA
+.char \[k*] \[u03BA] \" GREEK SMALL LETTER KAPPA
+.char \[l*] \[u03BB] \" GREEK SMALL LETTER LAMDA
+.char \[m*] \[u03BC] \" GREEK SMALL LETTER MU
+.char \[n*] \[u03BD] \" GREEK SMALL LETTER NU
+.char \[c*] \[u03BE] \" GREEK SMALL LETTER XI
+.char \[o*] \[u03BF] \" GREEK SMALL LETTER OMICRON
+.char \[p*] \[u03C0] \" GREEK SMALL LETTER PI
+.char \[r*] \[u03C1] \" GREEK SMALL LETTER RHO
+.char \[*s] \[u03C2] \" GREEK SMALL LETTER FINAL SIGMA
+.char \[s*] \[u03C3] \" GREEK SMALL LETTER SIGMA
+.char \[t*] \[u03C4] \" GREEK SMALL LETTER TAU
+.char \[u*] \[u03C5] \" GREEK SMALL LETTER UPSILON
+.char \[f*] \[u03C6] \" GREEK SMALL LETTER PHI
+.char \[x*] \[u03C7] \" GREEK SMALL LETTER CHI
+.char \[q*] \[u03C8] \" GREEK SMALL LETTER PSI
+.char \[w*] \[u03C9] \" GREEK SMALL LETTER OMEGA
+.char \[j*] \[u03CA] \" GREEK SMALL LETTER IOTA WITH DIAERESIS
+.char \[v*] \[u03CB] \" GREEK SMALL LETTER UPSILON WITH DIAERESIS
+.char \[o%] \[u03CC] \" GREEK SMALL LETTER OMICRON WITH ACUTE
+.char \[u%] \[u03CD] \" GREEK SMALL LETTER UPSILON WITH ACUTE
+.char \[w%] \[u03CE] \" GREEK SMALL LETTER OMEGA WITH ACUTE
+.char \['G] \[u03D8] \" GREEK NUMERAL SIGN
+.char \[,G] \[u03D9] \" GREEK LOWER NUMERAL SIGN
+.char \[T3] \[u03DA] \" GREEK CAPITAL LETTER STIGMA
+.char \[t3] \[u03DB] \" GREEK SMALL LETTER STIGMA
+.char \[M3] \[u03DC] \" GREEK CAPITAL LETTER DIGAMMA
+.char \[m3] \[u03DD] \" GREEK SMALL LETTER DIGAMMA
+.char \[K3] \[u03DE] \" GREEK CAPITAL LETTER KOPPA
+.char \[k3] \[u03DF] \" GREEK SMALL LETTER KOPPA
+.char \[P3] \[u03E0] \" GREEK CAPITAL LETTER SAMPI
+.char \[p3] \[u03E1] \" GREEK SMALL LETTER SAMPI
+.char \['%] \[u03F4] \" ACUTE ACCENT AND DIAERESIS (Tonos and Dialytika)
+.char \[j3] \[u03F5] \" GREEK IOTA BELOW
+.char \[IO] \[u0401] \" CYRILLIC CAPITAL LETTER IO
+.char \[D%] \[u0402] \" CYRILLIC CAPITAL LETTER DJE (Serbocroatian)
+.char \[G%] \[u0403] \" CYRILLIC CAPITAL LETTER GJE (Macedonian)
+.char \[IE] \[u0404] \" CYRILLIC CAPITAL LETTER UKRAINIAN IE
+.char \[DS] \[u0405] \" CYRILLIC CAPITAL LETTER DZE (Macedonian)
+.char \[II] \[u0406] \" CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+.char \[YI] \[u0407] \" CYRILLIC CAPITAL LETTER YI (Ukrainian)
+.char \[J%] \[u0408] \" CYRILLIC CAPITAL LETTER JE
+.char \[LJ] \[u0409] \" CYRILLIC CAPITAL LETTER LJE
+.char \[NJ] \[u040A] \" CYRILLIC CAPITAL LETTER NJE
+.char \[Ts] \[u040B] \" CYRILLIC CAPITAL LETTER TSHE (Serbocroatian)
+.char \[KJ] \[u040C] \" CYRILLIC CAPITAL LETTER KJE (Macedonian)
+.char \[V%] \[u040E] \" CYRILLIC CAPITAL LETTER SHORT U (Byelorussian)
+.char \[DZ] \[u040F] \" CYRILLIC CAPITAL LETTER DZHE
+.char \[A=] \[u0410] \" CYRILLIC CAPITAL LETTER A
+.char \[B=] \[u0411] \" CYRILLIC CAPITAL LETTER BE
+.char \[V=] \[u0412] \" CYRILLIC CAPITAL LETTER VE
+.char \[G=] \[u0413] \" CYRILLIC CAPITAL LETTER GHE
+.char \[D=] \[u0414] \" CYRILLIC CAPITAL LETTER DE
+.char \[E=] \[u0415] \" CYRILLIC CAPITAL LETTER IE
+.char \[Z%] \[u0416] \" CYRILLIC CAPITAL LETTER ZHE
+.char \[Z=] \[u0417] \" CYRILLIC CAPITAL LETTER ZE
+.char \[I=] \[u0418] \" CYRILLIC CAPITAL LETTER I
+.char \[J=] \[u0419] \" CYRILLIC CAPITAL LETTER SHORT I
+.char \[K=] \[u041A] \" CYRILLIC CAPITAL LETTER KA
+.char \[L=] \[u041B] \" CYRILLIC CAPITAL LETTER EL
+.char \[M=] \[u041C] \" CYRILLIC CAPITAL LETTER EM
+.char \[N=] \[u041D] \" CYRILLIC CAPITAL LETTER EN
+.char \[O=] \[u041E] \" CYRILLIC CAPITAL LETTER O
+.char \[P=] \[u041F] \" CYRILLIC CAPITAL LETTER PE
+.char \[R=] \[u0420] \" CYRILLIC CAPITAL LETTER ER
+.char \[S=] \[u0421] \" CYRILLIC CAPITAL LETTER ES
+.char \[T=] \[u0422] \" CYRILLIC CAPITAL LETTER TE
+.char \[U=] \[u0423] \" CYRILLIC CAPITAL LETTER U
+.char \[F=] \[u0424] \" CYRILLIC CAPITAL LETTER EF
+.char \[H=] \[u0425] \" CYRILLIC CAPITAL LETTER HA
+.char \[C=] \[u0426] \" CYRILLIC CAPITAL LETTER TSE
+.char \[C%] \[u0427] \" CYRILLIC CAPITAL LETTER CHE
+.char \[S%] \[u0428] \" CYRILLIC CAPITAL LETTER SHA
+.char \[Sc] \[u0429] \" CYRILLIC CAPITAL LETTER SHCHA
+.char \[="] \[u042A] \" CYRILLIC CAPITAL LETTER HARD SIGN
+.char \[Y=] \[u042B] \" CYRILLIC CAPITAL LETTER YERU
+.char \[%"] \[u042C] \" CYRILLIC CAPITAL LETTER SOFT SIGN
+.char \[JE] \[u042D] \" CYRILLIC CAPITAL LETTER E
+.char \[JU] \[u042E] \" CYRILLIC CAPITAL LETTER YU
+.char \[JA] \[u042F] \" CYRILLIC CAPITAL LETTER YA
+.char \[a=] \[u0430] \" CYRILLIC SMALL LETTER A
+.char \[b=] \[u0431] \" CYRILLIC SMALL LETTER BE
+.char \[v=] \[u0432] \" CYRILLIC SMALL LETTER VE
+.char \[g=] \[u0433] \" CYRILLIC SMALL LETTER GHE
+.char \[d=] \[u0434] \" CYRILLIC SMALL LETTER DE
+.char \[e=] \[u0435] \" CYRILLIC SMALL LETTER IE
+.char \[z%] \[u0436] \" CYRILLIC SMALL LETTER ZHE
+.char \[z=] \[u0437] \" CYRILLIC SMALL LETTER ZE
+.char \[i=] \[u0438] \" CYRILLIC SMALL LETTER I
+.char \[j=] \[u0439] \" CYRILLIC SMALL LETTER SHORT I
+.char \[k=] \[u043A] \" CYRILLIC SMALL LETTER KA
+.char \[l=] \[u043B] \" CYRILLIC SMALL LETTER EL
+.char \[m=] \[u043C] \" CYRILLIC SMALL LETTER EM
+.char \[n=] \[u043D] \" CYRILLIC SMALL LETTER EN
+.char \[o=] \[u043E] \" CYRILLIC SMALL LETTER O
+.char \[p=] \[u043F] \" CYRILLIC SMALL LETTER PE
+.char \[r=] \[u0440] \" CYRILLIC SMALL LETTER ER
+.char \[s=] \[u0441] \" CYRILLIC SMALL LETTER ES
+.char \[t=] \[u0442] \" CYRILLIC SMALL LETTER TE
+.char \[u=] \[u0443] \" CYRILLIC SMALL LETTER U
+.char \[f=] \[u0444] \" CYRILLIC SMALL LETTER EF
+.char \[h=] \[u0445] \" CYRILLIC SMALL LETTER HA
+.char \[c=] \[u0446] \" CYRILLIC SMALL LETTER TSE
+.char \[c%] \[u0447] \" CYRILLIC SMALL LETTER CHE
+.char \[s%] \[u0448] \" CYRILLIC SMALL LETTER SHA
+.char \[sc] \[u0449] \" CYRILLIC SMALL LETTER SHCHA
+.char \[='] \[u044A] \" CYRILLIC SMALL LETTER HARD SIGN
+.char \[y=] \[u044B] \" CYRILLIC SMALL LETTER YERU
+.char \[%'] \[u044C] \" CYRILLIC SMALL LETTER SOFT SIGN
+.char \[je] \[u044D] \" CYRILLIC SMALL LETTER E
+.char \[ju] \[u044E] \" CYRILLIC SMALL LETTER YU
+.char \[ja] \[u044F] \" CYRILLIC SMALL LETTER YA
+.char \[io] \[u0451] \" CYRILLIC SMALL LETTER IO
+.char \[d%] \[u0452] \" CYRILLIC SMALL LETTER DJE (Serbocroatian)
+.char \[g%] \[u0453] \" CYRILLIC SMALL LETTER GJE (Macedonian)
+.char \[ie] \[u0454] \" CYRILLIC SMALL LETTER UKRAINIAN IE
+.char \[ds] \[u0455] \" CYRILLIC SMALL LETTER DZE (Macedonian)
+.char \[ii] \[u0456] \" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+.char \[yi] \[u0457] \" CYRILLIC SMALL LETTER YI (Ukrainian)
+.char \[j%] \[u0458] \" CYRILLIC SMALL LETTER JE
+.char \[lj] \[u0459] \" CYRILLIC SMALL LETTER LJE
+.char \[nj] \[u045A] \" CYRILLIC SMALL LETTER NJE
+.char \[ts] \[u045B] \" CYRILLIC SMALL LETTER TSHE (Serbocroatian)
+.char \[kj] \[u045C] \" CYRILLIC SMALL LETTER KJE (Macedonian)
+.char \[v%] \[u045E] \" CYRILLIC SMALL LETTER SHORT U (Byelorussian)
+.char \[dz] \[u045F] \" CYRILLIC SMALL LETTER DZHE
+.char \[Y3] \[u0462] \" CYRILLIC CAPITAL LETTER YAT
+.char \[y3] \[u0463] \" CYRILLIC SMALL LETTER YAT
+.char \[O3] \[u046A] \" CYRILLIC CAPITAL LETTER BIG YUS
+.char \[o3] \[u046B] \" CYRILLIC SMALL LETTER BIG YUS
+.char \[F3] \[u0472] \" CYRILLIC CAPITAL LETTER FITA
+.char \[f3] \[u0473] \" CYRILLIC SMALL LETTER FITA
+.char \[V3] \[u0474] \" CYRILLIC CAPITAL LETTER IZHITSA
+.char \[v3] \[u0475] \" CYRILLIC SMALL LETTER IZHITSA
+.char \[C3] \[u0480] \" CYRILLIC CAPITAL LETTER KOPPA
+.char \[c3] \[u0481] \" CYRILLIC SMALL LETTER KOPPA
+.char \[G3] \[u0490] \" CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+.char \[g3] \[u0491] \" CYRILLIC SMALL LETTER GHE WITH UPTURN
+.char \[A+] \[u05D0] \" HEBREW LETTER ALEF
+.char \[B+] \[u05D1] \" HEBREW LETTER BET
+.char \[G+] \[u05D2] \" HEBREW LETTER GIMEL
+.char \[D+] \[u05D3] \" HEBREW LETTER DALET
+.char \[H+] \[u05D4] \" HEBREW LETTER HE
+.char \[W+] \[u05D5] \" HEBREW LETTER VAV
+.char \[Z+] \[u05D6] \" HEBREW LETTER ZAYIN
+.char \[X+] \[u05D7] \" HEBREW LETTER HET
+.char \[Tj] \[u05D8] \" HEBREW LETTER TET
+.char \[J+] \[u05D9] \" HEBREW LETTER YOD
+.char \[K%] \[u05DA] \" HEBREW LETTER FINAL KAF
+.char \[K+] \[u05DB] \" HEBREW LETTER KAF
+.char \[L+] \[u05DC] \" HEBREW LETTER LAMED
+.char \[M%] \[u05DD] \" HEBREW LETTER FINAL MEM
+.char \[M+] \[u05DE] \" HEBREW LETTER MEM
+.char \[N%] \[u05DF] \" HEBREW LETTER FINAL NUN
+.char \[N+] \[u05E0] \" HEBREW LETTER NUN
+.char \[S+] \[u05E1] \" HEBREW LETTER SAMEKH
+.char \[E+] \[u05E2] \" HEBREW LETTER AYIN
+.char \[P%] \[u05E3] \" HEBREW LETTER FINAL PE
+.char \[P+] \[u05E4] \" HEBREW LETTER PE
+.char \[Zj] \[u05E5] \" HEBREW LETTER FINAL TSADI
+.char \[ZJ] \[u05E6] \" HEBREW LETTER TSADI
+.char \[Q+] \[u05E7] \" HEBREW LETTER QOF
+.char \[R+] \[u05E8] \" HEBREW LETTER RESH
+.char \[Sh] \[u05E9] \" HEBREW LETTER SHIN
+.char \[T+] \[u05EA] \" HEBREW LETTER TAV
+.char \[,+] \[u060C] \" ARABIC COMMA
+.char \[;+] \[u061B] \" ARABIC SEMICOLON
+.char \[?+] \[u061F] \" ARABIC QUESTION MARK
+.char \[H'] \[u0621] \" ARABIC LETTER HAMZA
+.char \[aM] \[u0622] \" ARABIC LETTER ALEF WITH MADDA ABOVE
+.char \[aH] \[u0623] \" ARABIC LETTER ALEF WITH HAMZA ABOVE
+.char \[wH] \[u0624] \" ARABIC LETTER WAW WITH HAMZA ABOVE
+.char \[ah] \[u0625] \" ARABIC LETTER ALEF WITH HAMZA BELOW
+.char \[yH] \[u0626] \" ARABIC LETTER YEH WITH HAMZA ABOVE
+.char \[a+] \[u0627] \" ARABIC LETTER ALEF
+.char \[b+] \[u0628] \" ARABIC LETTER BEH
+.char \[tm] \[u0629] \" ARABIC LETTER TEH MARBUTA
+.char \[t+] \[u062A] \" ARABIC LETTER TEH
+.char \[tk] \[u062B] \" ARABIC LETTER THEH
+.char \[g+] \[u062C] \" ARABIC LETTER JEEM
+.char \[hk] \[u062D] \" ARABIC LETTER HAH
+.char \[x+] \[u062E] \" ARABIC LETTER KHAH
+.char \[d+] \[u062F] \" ARABIC LETTER DAL
+.char \[dk] \[u0630] \" ARABIC LETTER THAL
+.char \[r+] \[u0631] \" ARABIC LETTER REH
+.char \[z+] \[u0632] \" ARABIC LETTER ZAIN
+.char \[s+] \[u0633] \" ARABIC LETTER SEEN
+.char \[sn] \[u0634] \" ARABIC LETTER SHEEN
+.char \[c+] \[u0635] \" ARABIC LETTER SAD
+.char \[dd] \[u0636] \" ARABIC LETTER DAD
+.char \[tj] \[u0637] \" ARABIC LETTER TAH
+.char \[zH] \[u0638] \" ARABIC LETTER ZAH
+.char \[e+] \[u0639] \" ARABIC LETTER AIN
+.char \[i+] \[u063A] \" ARABIC LETTER GHAIN
+.char \[++] \[u0640] \" ARABIC TATWEEL
+.char \[f+] \[u0641] \" ARABIC LETTER FEH
+.char \[q+] \[u0642] \" ARABIC LETTER QAF
+.char \[k+] \[u0643] \" ARABIC LETTER KAF
+.char \[l+] \[u0644] \" ARABIC LETTER LAM
+.char \[m+] \[u0645] \" ARABIC LETTER MEEM
+.char \[n+] \[u0646] \" ARABIC LETTER NOON
+.char \[h+] \[u0647] \" ARABIC LETTER HEH
+.char \[w+] \[u0648] \" ARABIC LETTER WAW
+.char \[j+] \[u0649] \" ARABIC LETTER ALEF MAKSURA
+.char \[y+] \[u064A] \" ARABIC LETTER YEH
+.char \[:+] \[u064B] \" ARABIC FATHATAN
+.char \["+] \[u064C] \" ARABIC DAMMATAN
+.char \[=+] \[u064D] \" ARABIC KASRATAN
+.char \[/+] \[u064E] \" ARABIC FATHA
+.char \['+] \[u064F] \" ARABIC DAMMA
+.char \[1+] \[u0650] \" ARABIC KASRA
+.char \[3+] \[u0651] \" ARABIC SHADDA
+.char \[0+] \[u0652] \" ARABIC SUKUN
+.char \[aS] \[u0670] \" SUPERSCRIPT ARABIC LETTER ALEF
+.char \[p+] \[u067E] \" ARABIC LETTER PEH
+.char \[v+] \[u06A4] \" ARABIC LETTER VEH
+.char \[gf] \[u06AF] \" ARABIC LETTER GAF
+.char \[0a] \[u06F0] \" EASTERN ARABIC-INDIC DIGIT ZERO
+.char \[1a] \[u06F1] \" EASTERN ARABIC-INDIC DIGIT ONE
+.char \[2a] \[u06F2] \" EASTERN ARABIC-INDIC DIGIT TWO
+.char \[3a] \[u06F3] \" EASTERN ARABIC-INDIC DIGIT THREE
+.char \[4a] \[u06F4] \" EASTERN ARABIC-INDIC DIGIT FOUR
+.char \[5a] \[u06F5] \" EASTERN ARABIC-INDIC DIGIT FIVE
+.char \[6a] \[u06F6] \" EASTERN ARABIC-INDIC DIGIT SIX
+.char \[7a] \[u06F7] \" EASTERN ARABIC-INDIC DIGIT SEVEN
+.char \[8a] \[u06F8] \" EASTERN ARABIC-INDIC DIGIT EIGHT
+.char \[9a] \[u06F9] \" EASTERN ARABIC-INDIC DIGIT NINE
+.char \[A-0] \[u1E00] \" LATIN CAPITAL LETTER A WITH RING BELOW
+.char \[a-0] \[u1E01] \" LATIN SMALL LETTER A WITH RING BELOW
+.char \[B.] \[u1E02] \" LATIN CAPITAL LETTER B WITH DOT ABOVE
+.char \[b.] \[u1E03] \" LATIN SMALL LETTER B WITH DOT ABOVE
+.char \[B-.] \[u1E04] \" LATIN CAPITAL LETTER B WITH DOT BELOW
+.char \[b-.] \[u1E05] \" LATIN SMALL LETTER B WITH DOT BELOW
+.char \[B_] \[u1E06] \" LATIN CAPITAL LETTER B WITH LINE BELOW
+.char \[b_] \[u1E07] \" LATIN SMALL LETTER B WITH LINE BELOW
+.char \[C,'] \[u1E08] \" LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+.char \[c,'] \[u1E09] \" LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+.char \[D.] \[u1E0A] \" LATIN CAPITAL LETTER D WITH DOT ABOVE
+.char \[d.] \[u1E0B] \" LATIN SMALL LETTER D WITH DOT ABOVE
+.char \[D-.] \[u1E0C] \" LATIN CAPITAL LETTER D WITH DOT BELOW
+.char \[d-.] \[u1E0D] \" LATIN SMALL LETTER D WITH DOT BELOW
+.char \[D_] \[u1E0E] \" LATIN CAPITAL LETTER D WITH LINE BELOW
+.char \[d_] \[u1E0F] \" LATIN SMALL LETTER D WITH LINE BELOW
+.char \[D,] \[u1E10] \" LATIN CAPITAL LETTER D WITH CEDILLA
+.char \[d,] \[u1E11] \" LATIN SMALL LETTER D WITH CEDILLA
+.char \[D->] \[u1E12] \" LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+.char \[d->] \[u1E13] \" LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+.char \[E-!] \[u1E14] \" LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+.char \[e-!] \[u1E15] \" LATIN SMALL LETTER E WITH MACRON AND GRAVE
+.char \[E-'] \[u1E16] \" LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+.char \[e-'] \[u1E17] \" LATIN SMALL LETTER E WITH MACRON AND ACUTE
+.char \[E->] \[u1E18] \" LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+.char \[e->] \[u1E19] \" LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+.char \[E-?] \[u1E1A] \" LATIN CAPITAL LETTER E WITH TILDE BELOW
+.char \[e-?] \[u1E1B] \" LATIN SMALL LETTER E WITH TILDE BELOW
+.char \[E,(] \[u1E1C] \" LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+.char \[e,(] \[u1E1D] \" LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+.char \[F.] \[u1E1E] \" LATIN CAPITAL LETTER F WITH DOT ABOVE
+.char \[f.] \[u1E1F] \" LATIN SMALL LETTER F WITH DOT ABOVE
+.char \[G-] \[u1E20] \" LATIN CAPITAL LETTER G WITH MACRON
+.char \[g-] \[u1E21] \" LATIN SMALL LETTER G WITH MACRON
+.char \[H.] \[u1E22] \" LATIN CAPITAL LETTER H WITH DOT ABOVE
+.char \[h.] \[u1E23] \" LATIN SMALL LETTER H WITH DOT ABOVE
+.char \[H-.] \[u1E24] \" LATIN CAPITAL LETTER H WITH DOT BELOW
+.char \[h-.] \[u1E25] \" LATIN SMALL LETTER H WITH DOT BELOW
+.char \[H:] \[u1E26] \" LATIN CAPITAL LETTER H WITH DIAERESIS
+.char \[h:] \[u1E27] \" LATIN SMALL LETTER H WITH DIAERESIS
+.char \[H,] \[u1E28] \" LATIN CAPITAL LETTER H WITH CEDILLA
+.char \[h,] \[u1E29] \" LATIN SMALL LETTER H WITH CEDILLA
+.char \[H-(] \[u1E2A] \" LATIN CAPITAL LETTER H WITH BREVE BELOW
+.char \[h-(] \[u1E2B] \" LATIN SMALL LETTER H WITH BREVE BELOW
+.char \[I-?] \[u1E2C] \" LATIN CAPITAL LETTER I WITH TILDE BELOW
+.char \[i-?] \[u1E2D] \" LATIN SMALL LETTER I WITH TILDE BELOW
+.char \[I:'] \[u1E2E] \" LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+.char \[i:'] \[u1E2F] \" LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+.char \[K'] \[u1E30] \" LATIN CAPITAL LETTER K WITH ACUTE
+.char \[k'] \[u1E31] \" LATIN SMALL LETTER K WITH ACUTE
+.char \[K-.] \[u1E32] \" LATIN CAPITAL LETTER K WITH DOT BELOW
+.char \[k-.] \[u1E33] \" LATIN SMALL LETTER K WITH DOT BELOW
+.char \[K_] \[u1E34] \" LATIN CAPITAL LETTER K WITH LINE BELOW
+.char \[k_] \[u1E35] \" LATIN SMALL LETTER K WITH LINE BELOW
+.char \[L-.] \[u1E36] \" LATIN CAPITAL LETTER L WITH DOT BELOW
+.char \[l-.] \[u1E37] \" LATIN SMALL LETTER L WITH DOT BELOW
+.char \[L--.] \[u1E38] \" LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+.char \[l--.] \[u1E39] \" LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+.char \[L_] \[u1E3A] \" LATIN CAPITAL LETTER L WITH LINE BELOW
+.char \[l_] \[u1E3B] \" LATIN SMALL LETTER L WITH LINE BELOW
+.char \[L->] \[u1E3C] \" LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+.char \[l->] \[u1E3D] \" LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+.char \[M'] \[u1E3E] \" LATIN CAPITAL LETTER M WITH ACUTE
+.char \[m'] \[u1E3F] \" LATIN SMALL LETTER M WITH ACUTE
+.char \[M.] \[u1E40] \" LATIN CAPITAL LETTER M WITH DOT ABOVE
+.char \[m.] \[u1E41] \" LATIN SMALL LETTER M WITH DOT ABOVE
+.char \[M-.] \[u1E42] \" LATIN CAPITAL LETTER M WITH DOT BELOW
+.char \[m-.] \[u1E43] \" LATIN SMALL LETTER M WITH DOT BELOW
+.char \[N.] \[u1E44] \" LATIN CAPITAL LETTER N WITH DOT ABOVE
+.char \[n.] \[u1E45] \" LATIN SMALL LETTER N WITH DOT ABOVE
+.char \[N-.] \[u1E46] \" LATIN CAPITAL LETTER N WITH DOT BELOW
+.char \[n-.] \[u1E47] \" LATIN SMALL LETTER N WITH DOT BELOW
+.char \[N_] \[u1E48] \" LATIN CAPITAL LETTER N WITH LINE BELOW
+.char \[n_] \[u1E49] \" LATIN SMALL LETTER N WITH LINE BELOW
+.char \[N->] \[u1E4A] \" LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+.char \[N->] \[u1E4B] \" LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+.char \[O?'] \[u1E4C] \" LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+.char \[o?'] \[u1E4D] \" LATIN SMALL LETTER O WITH TILDE AND ACUTE
+.char \[O?:] \[u1E4E] \" LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+.char \[o?:] \[u1E4F] \" LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+.char \[O-!] \[u1E50] \" LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+.char \[o-!] \[u1E51] \" LATIN SMALL LETTER O WITH MACRON AND GRAVE
+.char \[O-'] \[u1E52] \" LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+.char \[o-'] \[u1E53] \" LATIN SMALL LETTER O WITH MACRON AND ACUTE
+.char \[P'] \[u1E54] \" LATIN CAPITAL LETTER P WITH ACUTE
+.char \[p'] \[u1E55] \" LATIN SMALL LETTER P WITH ACUTE
+.char \[P.] \[u1E56] \" LATIN CAPITAL LETTER P WITH DOT ABOVE
+.char \[p.] \[u1E57] \" LATIN SMALL LETTER P WITH DOT ABOVE
+.char \[R.] \[u1E58] \" LATIN CAPITAL LETTER R WITH DOT ABOVE
+.char \[r.] \[u1E59] \" LATIN SMALL LETTER R WITH DOT ABOVE
+.char \[R-.] \[u1E5A] \" LATIN CAPITAL LETTER R WITH DOT BELOW
+.char \[r-.] \[u1E5B] \" LATIN SMALL LETTER R WITH DOT BELOW
+.char \[R--.] \[u1E5C] \" LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+.char \[r--.] \[u1E5D] \" LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+.char \[R_] \[u1E5E] \" LATIN CAPITAL LETTER R WITH LINE BELOW
+.char \[r_] \[u1E5F] \" LATIN SMALL LETTER R WITH LINE BELOW
+.char \[S.] \[u1E60] \" LATIN CAPITAL LETTER S WITH DOT ABOVE
+.char \[s.] \[u1E61] \" LATIN SMALL LETTER S WITH DOT ABOVE
+.char \[S-.] \[u1E62] \" LATIN CAPITAL LETTER S WITH DOT BELOW
+.char \[s-.] \[u1E63] \" LATIN SMALL LETTER S WITH DOT BELOW
+.char \[S'.] \[u1E64] \" LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+.char \[s'.] \[u1E65] \" LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+.char \[S<.] \[u1E66] \" LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+.char \[s<.] \[u1E67] \" LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+.char \[S.-.] \[u1E68] \" LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+.char \[S.-.] \[u1E69] \" LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+.char \[T.] \[u1E6A] \" LATIN CAPITAL LETTER T WITH DOT ABOVE
+.char \[t.] \[u1E6B] \" LATIN SMALL LETTER T WITH DOT ABOVE
+.char \[T-.] \[u1E6C] \" LATIN CAPITAL LETTER T WITH DOT BELOW
+.char \[t-.] \[u1E6D] \" LATIN SMALL LETTER T WITH DOT BELOW
+.char \[T_] \[u1E6E] \" LATIN CAPITAL LETTER T WITH LINE BELOW
+.char \[t_] \[u1E6F] \" LATIN SMALL LETTER T WITH LINE BELOW
+.char \[T->] \[u1E70] \" LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+.char \[t->] \[u1E71] \" LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+.char \[U--:] \[u1E72] \" LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+.char \[u--:] \[u1E73] \" LATIN SMALL LETTER U WITH DIAERESIS BELOW
+.char \[U-?] \[u1E74] \" LATIN CAPITAL LETTER U WITH TILDE BELOW
+.char \[u-?] \[u1E75] \" LATIN SMALL LETTER U WITH TILDE BELOW
+.char \[U->] \[u1E76] \" LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+.char \[u->] \[u1E77] \" LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+.char \[U?'] \[u1E78] \" LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+.char \[u?'] \[u1E79] \" LATIN SMALL LETTER U WITH TILDE AND ACUTE
+.char \[U-:] \[u1E7A] \" LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+.char \[u-:] \[u1E7B] \" LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+.char \[V?] \[u1E7C] \" LATIN CAPITAL LETTER V WITH TILDE
+.char \[v?] \[u1E7D] \" LATIN SMALL LETTER V WITH TILDE
+.char \[V-.] \[u1E7E] \" LATIN CAPITAL LETTER V WITH DOT BELOW
+.char \[v-.] \[u1E7F] \" LATIN SMALL LETTER V WITH DOT BELOW
+.char \[W!] \[u1E80] \" LATIN CAPITAL LETTER W WITH GRAVE
+.char \[w!] \[u1E81] \" LATIN SMALL LETTER W WITH GRAVE
+.char \[W'] \[u1E82] \" LATIN CAPITAL LETTER W WITH ACUTE
+.char \[w'] \[u1E83] \" LATIN SMALL LETTER W WITH ACUTE
+.char \[W:] \[u1E84] \" LATIN CAPITAL LETTER W WITH DIAERESIS
+.char \[w:] \[u1E85] \" LATIN SMALL LETTER W WITH DIAERESIS
+.char \[W.] \[u1E86] \" LATIN CAPITAL LETTER W WITH DOT ABOVE
+.char \[w.] \[u1E87] \" LATIN SMALL LETTER W WITH DOT ABOVE
+.char \[W-.] \[u1E88] \" LATIN CAPITAL LETTER W WITH DOT BELOW
+.char \[w-.] \[u1E89] \" LATIN SMALL LETTER W WITH DOT BELOW
+.char \[X.] \[u1E8A] \" LATIN CAPITAL LETTER X WITH DOT ABOVE
+.char \[x.] \[u1E8B] \" LATIN SMALL LETTER X WITH DOT ABOVE
+.char \[X:] \[u1E8C] \" LATIN CAPITAL LETTER X WITH DIAERESIS
+.char \[x:] \[u1E8D] \" LATIN SMALL LETTER X WITH DIAERESIS
+.char \[Y.] \[u1E8E] \" LATIN CAPITAL LETTER Y WITH DOT ABOVE
+.char \[y.] \[u1E8F] \" LATIN SMALL LETTER Y WITH DOT ABOVE
+.char \[Z>] \[u1E90] \" LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+.char \[z>] \[u1E91] \" LATIN SMALL LETTER Z WITH CIRCUMFLEX
+.char \[Z-.] \[u1E92] \" LATIN CAPITAL LETTER Z WITH DOT BELOW
+.char \[z-.] \[u1E93] \" LATIN SMALL LETTER Z WITH DOT BELOW
+.char \[Z_] \[u1E94] \" LATIN CAPITAL LETTER Z WITH LINE BELOW
+.char \[z_] \[u1E95] \" LATIN SMALL LETTER Z WITH LINE BELOW
+.char \[h_] \[u1E96] \" LATIN SMALL LETTER H WITH LINE BELOW
+.char \[t:] \[u1E97] \" LATIN SMALL LETTER T WITH DIAERESIS
+.char \[w0] \[u1E98] \" LATIN SMALL LETTER W WITH RING ABOVE
+.char \[y0] \[u1E99] \" LATIN SMALL LETTER Y WITH RING ABOVE
+.char \[A-.] \[u1EA0] \" LATIN CAPITAL LETTER A WITH DOT BELOW
+.char \[a-.] \[u1EA1] \" LATIN SMALL LETTER A WITH DOT BELOW
+.char \[A2] \[u1EA2] \" LATIN CAPITAL LETTER A WITH HOOK ABOVE
+.char \[a2] \[u1EA3] \" LATIN SMALL LETTER A WITH HOOK ABOVE
+.char \[A>'] \[u1EA4] \" LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+.char \[a>'] \[u1EA5] \" LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+.char \[A>!] \[u1EA6] \" LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+.char \[a>!] \[u1EA7] \" LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+.char \[A>2] \[u1EA8] \" LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+.char \[a>2] \[u1EA9] \" LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+.char \[A>?] \[u1EAA] \" LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+.char \[a>?] \[u1EAB] \" LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+.char \[A>-.] \[u1EAC] \" LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+.char \[a>-.] \[u1EAD] \" LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+.char \[A('] \[u1EAE] \" LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+.char \[a('] \[u1EAF] \" LATIN SMALL LETTER A WITH BREVE AND ACUTE
+.char \[A(!] \[u1EB0] \" LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+.char \[a(!] \[u1EB1] \" LATIN SMALL LETTER A WITH BREVE AND GRAVE
+.char \[A(2] \[u1EB2] \" LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+.char \[a(2] \[u1EB3] \" LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+.char \[A(?] \[u1EB4] \" LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+.char \[a(?] \[u1EB5] \" LATIN SMALL LETTER A WITH BREVE AND TILDE
+.char \[A(-.] \[u1EB6] \" LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+.char \[a(-.] \[u1EB7] \" LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+.char \[E-.] \[u1EB8] \" LATIN CAPITAL LETTER E WITH DOT BELOW
+.char \[e-.] \[u1EB9] \" LATIN SMALL LETTER E WITH DOT BELOW
+.char \[E2] \[u1EBA] \" LATIN CAPITAL LETTER E WITH HOOK ABOVE
+.char \[e2] \[u1EBB] \" LATIN SMALL LETTER E WITH HOOK ABOVE
+.char \[E?] \[u1EBC] \" LATIN CAPITAL LETTER E WITH TILDE
+.char \[e?] \[u1EBD] \" LATIN SMALL LETTER E WITH TILDE
+.char \[E>'] \[u1EBE] \" LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+.char \[e>'] \[u1EBF] \" LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+.char \[E>!] \[u1EC0] \" LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+.char \[e>!] \[u1EC1] \" LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+.char \[E>2] \[u1EC2] \" LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+.char \[e>2] \[u1EC3] \" LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+.char \[E>?] \[u1EC4] \" LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+.char \[e>?] \[u1EC5] \" LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+.char \[E>-.] \[u1EC6] \" LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+.char \[e>-.] \[u1EC7] \" LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+.char \[I2] \[u1EC8] \" LATIN CAPITAL LETTER I WITH HOOK ABOVE
+.char \[i2] \[u1EC9] \" LATIN SMALL LETTER I WITH HOOK ABOVE
+.char \[I-.] \[u1ECA] \" LATIN CAPITAL LETTER I WITH DOT BELOW
+.char \[i-.] \[u1ECB] \" LATIN SMALL LETTER I WITH DOT BELOW
+.char \[O-.] \[u1ECC] \" LATIN CAPITAL LETTER O WITH DOT BELOW
+.char \[o-.] \[u1ECD] \" LATIN SMALL LETTER O WITH DOT BELOW
+.char \[O2] \[u1ECE] \" LATIN CAPITAL LETTER O WITH HOOK ABOVE
+.char \[o2] \[u1ECF] \" LATIN SMALL LETTER O WITH HOOK ABOVE
+.char \[O>'] \[u1ED0] \" LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+.char \[o>'] \[u1ED1] \" LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+.char \[O>!] \[u1ED2] \" LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+.char \[o>!] \[u1ED3] \" LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+.char \[O>2] \[u1ED4] \" LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+.char \[o>2] \[u1ED5] \" LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+.char \[O>?] \[u1ED6] \" LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+.char \[o>?] \[u1ED7] \" LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+.char \[O>-.] \[u1ED8] \" LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+.char \[o>-.] \[u1ED9] \" LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+.char \[O9'] \[u1EDA] \" LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+.char \[o9'] \[u1EDB] \" LATIN SMALL LETTER O WITH HORN AND ACUTE
+.char \[O9!] \[u1EDC] \" LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+.char \[o9!] \[u1EDD] \" LATIN SMALL LETTER O WITH HORN AND GRAVE
+.char \[O92] \[u1EDE] \" LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+.char \[o92] \[u1EDF] \" LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+.char \[O9?] \[u1EE0] \" LATIN CAPITAL LETTER O WITH HORN AND TILDE
+.char \[o9?] \[u1EE1] \" LATIN SMALL LETTER O WITH HORN AND TILDE
+.char \[O9-.] \[u1EE2] \" LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+.char \[o9-.] \[u1EE3] \" LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+.char \[U-.] \[u1EE4] \" LATIN CAPITAL LETTER U WITH DOT BELOW
+.char \[u-.] \[u1EE5] \" LATIN SMALL LETTER U WITH DOT BELOW
+.char \[U2] \[u1EE6] \" LATIN CAPITAL LETTER U WITH HOOK ABOVE
+.char \[u2] \[u1EE7] \" LATIN SMALL LETTER U WITH HOOK ABOVE
+.char \[U9'] \[u1EE8] \" LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+.char \[u9'] \[u1EE9] \" LATIN SMALL LETTER U WITH HORN AND ACUTE
+.char \[U9!] \[u1EEA] \" LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+.char \[u9!] \[u1EEB] \" LATIN SMALL LETTER U WITH HORN AND GRAVE
+.char \[U92] \[u1EEC] \" LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+.char \[u92] \[u1EED] \" LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+.char \[U9?] \[u1EEE] \" LATIN CAPITAL LETTER U WITH HORN AND TILDE
+.char \[u9?] \[u1EEF] \" LATIN SMALL LETTER U WITH HORN AND TILDE
+.char \[U9-.] \[u1EF0] \" LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+.char \[u9-.] \[u1EF1] \" LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+.char \[Y!] \[u1EF2] \" LATIN CAPITAL LETTER Y WITH GRAVE
+.char \[y!] \[u1EF3] \" LATIN SMALL LETTER Y WITH GRAVE
+.char \[Y-.] \[u1EF4] \" LATIN CAPITAL LETTER Y WITH DOT BELOW
+.char \[y-.] \[u1EF5] \" LATIN SMALL LETTER Y WITH DOT BELOW
+.char \[Y2] \[u1EF6] \" LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+.char \[y2] \[u1EF7] \" LATIN SMALL LETTER Y WITH HOOK ABOVE
+.char \[Y?] \[u1EF8] \" LATIN CAPITAL LETTER Y WITH TILDE
+.char \[y?] \[u1EF9] \" LATIN SMALL LETTER Y WITH TILDE
+.char \[;'] \[u1F00] \" GREEK DASIA AND ACUTE ACCENT
+.char \[,'] \[u1F01] \" GREEK PSILI AND ACUTE ACCENT
+.char \[;!] \[u1F02] \" GREEK DASIA AND VARIA
+.char \[,!] \[u1F03] \" GREEK PSILI AND VARIA
+.char \[?;] \[u1F04] \" GREEK DASIA AND PERISPOMENI
+.char \[?,] \[u1F05] \" GREEK PSILI AND PERISPOMENI
+.char \[!:] \[u1F06] \" GREEK DIAERESIS AND VARIA
+.char \[?:] \[u1F07] \" GREEK DIAERESIS AND PERISPOMENI
+.char \[1N] \[u2002] \" EN SPACE
+.char \[1M] \[u2003] \" EM SPACE
+.char \[3M] \[u2004] \" THREE-PER-EM SPACE
+.char \[4M] \[u2005] \" FOUR-PER-EM SPACE
+.char \[6M] \[u2006] \" SIX-PER-EM SPACE
+.char \[1T] \[u2009] \" THIN SPACE
+.char \[1H] \[u200A] \" HAIR SPACE
+.char \[-1] \[u2010] \" HYPHEN
+.char \[-N] \[u2013] \" EN DASH
+.char \[-M] \[u2014] \" EM DASH
+.char \[-3] \[u2015] \" HORIZONTAL BAR
+.char \[!2] \[u2016] \" DOUBLE VERTICAL LINE
+.char \[=2] \[u2017] \" DOUBLE LOW LINE
+.char \['6] \[u2018] \" LEFT SINGLE QUOTATION MARK
+.char \['9] \[u2019] \" RIGHT SINGLE QUOTATION MARK
+.char \[.9] \[u201A] \" SINGLE LOW-9 QUOTATION MARK
+.char \[9'] \[u201B] \" SINGLE HIGH-REVERSED-9 QUOTATION MARK
+.char \["6] \[u201C] \" LEFT DOUBLE QUOTATION MARK
+.char \["9] \[u201D] \" RIGHT DOUBLE QUOTATION MARK
+.char \[:9] \[u201E] \" DOUBLE LOW-9 QUOTATION MARK
+.char \[9"] \[u201F] \" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+.char \[/-] \[u2020] \" DAGGER
+.char \[/=] \[u2021] \" DOUBLE DAGGER
+.char \[..] \[u2025] \" TWO DOT LEADER
+.char \[,.] \[u2026] \" HORIZONTAL ELLIPSIS (Vim)
+.char \[%0] \[u2030] \" PER MILLE SIGN
+.char \[1'] \[u2032] \" PRIME
+.char \[2'] \[u2033] \" DOUBLE PRIME
+.char \[3'] \[u2034] \" TRIPLE PRIME
+.char \[1"] \[u2035] \" REVERSED PRIME
+.char \[2"] \[u2036] \" REVERSED DOUBLE PRIME
+.char \[3"] \[u2037] \" REVERSED TRIPLE PRIME
+.char \[Ca] \[u2038] \" CARET
+.char \[<1] \[u2039] \" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+.char \[>1] \[u203A] \" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+.char \[:X] \[u203B] \" REFERENCE MARK
+.char \[!*2] \[u203C] \" DOUBLE EXCLAMATION MARK
+.char \['-] \[u203E] \" OVERLINE
+.char \[/f] \[u2044] \" FRACTION SLASH
+.char \[0S] \[u2070] \" SUPERSCRIPT DIGIT ZERO
+.char \[4S] \[u2074] \" SUPERSCRIPT DIGIT FOUR
+.char \[5S] \[u2075] \" SUPERSCRIPT DIGIT FIVE
+.char \[6S] \[u2076] \" SUPERSCRIPT DIGIT SIX
+.char \[7S] \[u2077] \" SUPERSCRIPT DIGIT SEVEN
+.char \[8S] \[u2078] \" SUPERSCRIPT DIGIT EIGHT
+.char \[9S] \[u2079] \" SUPERSCRIPT DIGIT NINE
+.char \[+S] \[u207A] \" SUPERSCRIPT PLUS SIGN
+.char \[-S] \[u207B] \" SUPERSCRIPT MINUS
+.char \[=S] \[u207C] \" SUPERSCRIPT EQUALS SIGN
+.char \[(S] \[u207D] \" SUPERSCRIPT LEFT PARENTHESIS
+.char \[)S] \[u207E] \" SUPERSCRIPT RIGHT PARENTHESIS
+.char \[nS] \[u207F] \" SUPERSCRIPT LATIN SMALL LETTER N
+.char \[0s] \[u2080] \" SUBSCRIPT DIGIT ZERO
+.char \[1s] \[u2081] \" SUBSCRIPT DIGIT ONE
+.char \[2s] \[u2082] \" SUBSCRIPT DIGIT TWO
+.char \[3s] \[u2083] \" SUBSCRIPT DIGIT THREE
+.char \[4s] \[u2084] \" SUBSCRIPT DIGIT FOUR
+.char \[5s] \[u2085] \" SUBSCRIPT DIGIT FIVE
+.char \[6s] \[u2086] \" SUBSCRIPT DIGIT SIX
+.char \[7s] \[u2087] \" SUBSCRIPT DIGIT SEVEN
+.char \[8s] \[u2088] \" SUBSCRIPT DIGIT EIGHT
+.char \[9s] \[u2089] \" SUBSCRIPT DIGIT NINE
+.char \[+s] \[u208A] \" SUBSCRIPT PLUS SIGN
+.char \[-s] \[u208B] \" SUBSCRIPT MINUS
+.char \[=s] \[u208C] \" SUBSCRIPT EQUALS SIGN
+.char \[(s] \[u208D] \" SUBSCRIPT LEFT PARENTHESIS
+.char \[)s] \[u208E] \" SUBSCRIPT RIGHT PARENTHESIS
+.char \[Li] \[u20A4] \" LIRA SIGN
+.char \[Pt] \[u20A7] \" PESETA SIGN
+.char \[W=] \[u20A9] \" WON SIGN
+.char \[Eu] \[u20AC] \" EURO SIGN (Vim)
+.char \[=R] \[u20BD] \" ROUBLE SIGN (Vim)
+.char \[=P] \[u20BD] \" ROUBLE SIGN (Vim)
+.char \[oC] \[u2103] \" DEGREE CENTIGRADE
+.char \[co] \[u2105] \" CARE OF
+.char \[oF] \[u2109] \" DEGREE FAHRENHEIT
+.char \[N0] \[u2116] \" NUMERO SIGN
+.char \[PO] \[u2117] \" SOUND RECORDING COPYRIGHT
+.char \[Rx] \[u211E] \" PRESCRIPTION TAKE
+.char \[SM] \[u2120] \" SERVICE MARK
+.char \[TM] \[u2122] \" TRADE MARK SIGN
+.char \[Om] \[u2126] \" OHM SIGN
+.char \[AO] \[u212B] \" ANGSTROEM SIGN
+.char \[13] \[u2153] \" VULGAR FRACTION ONE THIRD
+.char \[23] \[u2154] \" VULGAR FRACTION TWO THIRDS
+.char \[15] \[u2155] \" VULGAR FRACTION ONE FIFTH
+.char \[25] \[u2156] \" VULGAR FRACTION TWO FIFTHS
+.char \[35] \[u2157] \" VULGAR FRACTION THREE FIFTHS
+.char \[45] \[u2158] \" VULGAR FRACTION FOUR FIFTHS
+.char \[16] \[u2159] \" VULGAR FRACTION ONE SIXTH
+.char \[56] \[u215A] \" VULGAR FRACTION FIVE SIXTHS
+.char \[18] \[u215B] \" VULGAR FRACTION ONE EIGHTH
+.char \[38] \[u215C] \" VULGAR FRACTION THREE EIGHTHS
+.char \[58] \[u215D] \" VULGAR FRACTION FIVE EIGHTHS
+.char \[78] \[u215E] \" VULGAR FRACTION SEVEN EIGHTHS
+.char \[1R] \[u2160] \" ROMAN NUMERAL ONE
+.char \[2R] \[u2161] \" ROMAN NUMERAL TWO
+.char \[3R] \[u2162] \" ROMAN NUMERAL THREE
+.char \[4R] \[u2163] \" ROMAN NUMERAL FOUR
+.char \[5R] \[u2164] \" ROMAN NUMERAL FIVE
+.char \[6R] \[u2165] \" ROMAN NUMERAL SIX
+.char \[7R] \[u2166] \" ROMAN NUMERAL SEVEN
+.char \[8R] \[u2167] \" ROMAN NUMERAL EIGHT
+.char \[9R] \[u2168] \" ROMAN NUMERAL NINE
+.char \[aR] \[u2169] \" ROMAN NUMERAL TEN
+.char \[bR] \[u216A] \" ROMAN NUMERAL ELEVEN
+.char \[cR] \[u216B] \" ROMAN NUMERAL TWELVE
+.char \[50R] \[u216C] \" ROMAN NUMERAL FIFTY
+.char \[100R] \[u216D] \" ROMAN NUMERAL ONE HUNDRED
+.char \[500R] \[u216E] \" ROMAN NUMERAL FIVE HUNDRED
+.char \[1000R] \[u216F] \" ROMAN NUMERAL ONE THOUSAND
+.char \[1r] \[u2170] \" SMALL ROMAN NUMERAL ONE
+.char \[2r] \[u2171] \" SMALL ROMAN NUMERAL TWO
+.char \[3r] \[u2172] \" SMALL ROMAN NUMERAL THREE
+.char \[4r] \[u2173] \" SMALL ROMAN NUMERAL FOUR
+.char \[5r] \[u2174] \" SMALL ROMAN NUMERAL FIVE
+.char \[6r] \[u2175] \" SMALL ROMAN NUMERAL SIX
+.char \[7r] \[u2176] \" SMALL ROMAN NUMERAL SEVEN
+.char \[8r] \[u2177] \" SMALL ROMAN NUMERAL EIGHT
+.char \[9r] \[u2178] \" SMALL ROMAN NUMERAL NINE
+.char \[ar] \[u2179] \" SMALL ROMAN NUMERAL TEN
+.char \[br] \[u217A] \" SMALL ROMAN NUMERAL ELEVEN
+.char \[cr] \[u217B] \" SMALL ROMAN NUMERAL TWELVE
+.char \[50r] \[u217C] \" SMALL ROMAN NUMERAL FIFTY
+.char \[100r] \[u217D] \" SMALL ROMAN NUMERAL ONE HUNDRED
+.char \[500r] \[u217E] \" SMALL ROMAN NUMERAL FIVE HUNDRED
+.char \[1000r] \[u217F] \" SMALL ROMAN NUMERAL ONE THOUSAND
+.char \[1000RCD] \[u2180] \" ROMAN NUMERAL ONE THOUSAND C D
+.char \[5000R] \[u2181] \" ROMAN NUMERAL FIVE THOUSAND
+.char \[10000R] \[u2182] \" ROMAN NUMERAL TEN THOUSAND
+.char \[<-] \[u2190] \" LEFTWARDS ARROW
+.char \[-!] \[u2191] \" UPWARDS ARROW
+.char \[->] \[u2192] \" RIGHTWARDS ARROW
+.char \[-v] \[u2193] \" DOWNWARDS ARROW
+.char \[<>] \[u2194] \" LEFT RIGHT ARROW
+.char \[UD] \[u2195] \" UP DOWN ARROW
+.char \[<!!] \[u2196] \" NORTH WEST ARROW
+.char \[//>] \[u2197] \" NORTH EAST ARROW
+.char \[!!>] \[u2198] \" SOUTH EAST ARROW
+.char \[<//] \[u2199] \" SOUTH WEST ARROW
+.char \[<=] \[u21D0] \" LEFTWARDS DOUBLE ARROW
+.char \[=>] \[u21D2] \" RIGHTWARDS DOUBLE ARROW
+.char \[==] \[u21D4] \" LEFT RIGHT DOUBLE ARROW
+.char \[FA] \[u2200] \" FOR ALL
+.char \[dP] \[u2202] \" PARTIAL DIFFERENTIAL
+.char \[TE] \[u2203] \" THERE EXISTS
+.char \[/0] \[u2205] \" EMPTY SET
+.char \[DE] \[u2206] \" INCREMENT
+.char \[NB] \[u2207] \" NABLA
+.char \[(-] \[u2208] \" ELEMENT OF
+.char \[-)] \[u220B] \" CONTAINS AS MEMBER
+.char \[*P] \[u220F] \" N-ARY PRODUCT
+.char \[+Z] \[u2211] \" N-ARY SUMMATION
+.char \[-2] \[u2212] \" MINUS SIGN
+.char \[-+] \[u2213] \" MINUS-OR-PLUS SIGN
+.char \[*-] \[u2217] \" ASTERISK OPERATOR
+.char \[Ob] \[u2218] \" RING OPERATOR
+.char \[Sb] \[u2219] \" BULLET OPERATOR
+.char \[RT] \[u221A] \" SQUARE ROOT
+.char \[0(] \[u221D] \" PROPORTIONAL TO
+.char \[00] \[u221E] \" INFINITY
+.char \[-L] \[u221F] \" RIGHT ANGLE
+.char \[-V] \[u2220] \" ANGLE
+.char \[PP] \[u2225] \" PARALLEL TO
+.char \[AN] \[u2227] \" LOGICAL AND
+.char \[OR] \[u2228] \" LOGICAL OR
+.char \[(U] \[u2229] \" INTERSECTION
+.char \[)U] \[u222A] \" UNION
+.char \[In] \[u222B] \" INTEGRAL
+.char \[DI] \[u222C] \" DOUBLE INTEGRAL
+.char \[Io] \[u222E] \" CONTOUR INTEGRAL
+.char \[.:] \[u2234] \" THEREFORE
+.char \[:.] \[u2235] \" BECAUSE
+.char \[:R] \[u2236] \" RATIO
+.char \[::] \[u2237] \" PROPORTION
+.char \[?1] \[u223C] \" TILDE OPERATOR
+.char \[CG] \[u223E] \" INVERTED LAZY S
+.char \[?-] \[u2243] \" ASYMPTOTICALLY EQUAL TO
+.char \[?=] \[u2245] \" APPROXIMATELY EQUAL TO
+.char \[?2] \[u2248] \" ALMOST EQUAL TO
+.char \[=?] \[u224C] \" ALL EQUAL TO
+.char \[HI] \[u2253] \" IMAGE OF OR APPROXIMATELY EQUAL TO
+.char \[!=] \[u2260] \" NOT EQUAL TO
+.char \[=3] \[u2261] \" IDENTICAL TO
+.char \[=<] \[u2264] \" LESS-THAN OR EQUAL TO
+.char \[>=] \[u2265] \" GREATER-THAN OR EQUAL TO
+.char \[<*] \[u226A] \" MUCH LESS-THAN
+.char \[*>] \[u226B] \" MUCH GREATER-THAN
+.char \[!<] \[u226E] \" NOT LESS-THAN
+.char \[!>] \[u226F] \" NOT GREATER-THAN
+.char \[(C] \[u2282] \" SUBSET OF
+.char \[)C] \[u2283] \" SUPERSET OF
+.char \[(_] \[u2286] \" SUBSET OF OR EQUAL TO
+.char \[)_] \[u2287] \" SUPERSET OF OR EQUAL TO
+.char \[0.] \[u2299] \" CIRCLED DOT OPERATOR
+.char \[02] \[u229A] \" CIRCLED RING OPERATOR
+.char \[-T] \[u22A5] \" UP TACK
+.char \[.P] \[u22C5] \" DOT OPERATOR
+.char \[:3] \[u22EE] \" VERTICAL ELLIPSIS
+.char \[.3] \[u22EF] \" MIDLINE HORIZONTAL ELLIPSIS
+.char \[Eh] \[u2302] \" HOUSE
+.char \[<7] \[u2308] \" LEFT CEILING
+.char \[>7] \[u2309] \" RIGHT CEILING
+.char \[7<] \[u230A] \" LEFT FLOOR
+.char \[7>] \[u230B] \" RIGHT FLOOR
+.char \[NI] \[u2310] \" REVERSED NOT SIGN
+.char \[(A] \[u2312] \" ARC
+.char \[TR] \[u2315] \" TELEPHONE RECORDER
+.char \[Iu] \[u2320] \" TOP HALF INTEGRAL
+.char \[Il] \[u2321] \" BOTTOM HALF INTEGRAL
+.char \[</] \[u2329] \" LEFT-POINTING ANGLE BRACKET
+.char \[/>] \[u232A] \" RIGHT-POINTING ANGLE BRACKET
+.char \[Vs] \[u2423] \" OPEN BOX
+.char \[1h] \[u2440] \" OCR HOOK
+.char \[3h] \[u2441] \" OCR CHAIR
+.char \[2h] \[u2442] \" OCR FORK
+.char \[4h] \[u2443] \" OCR INVERTED FORK
+.char \[1j] \[u2446] \" OCR BRANCH BANK IDENTIFICATION
+.char \[2j] \[u2447] \" OCR AMOUNT OF CHECK
+.char \[3j] \[u2448] \" OCR DASH
+.char \[4j] \[u2449] \" OCR CUSTOMER ACCOUNT NUMBER
+.char \[1-o] \[u2460] \" CIRCLED DIGIT ONE
+.char \[2-o] \[u2461] \" CIRCLED DIGIT TWO
+.char \[3-o] \[u2462] \" CIRCLED DIGIT THREE
+.char \[4-o] \[u2463] \" CIRCLED DIGIT FOUR
+.char \[5-o] \[u2464] \" CIRCLED DIGIT FIVE
+.char \[6-o] \[u2465] \" CIRCLED DIGIT SIX
+.char \[7-o] \[u2466] \" CIRCLED DIGIT SEVEN
+.char \[8-o] \[u2467] \" CIRCLED DIGIT EIGHT
+.char \[9-o] \[u2468] \" CIRCLED DIGIT NINE
+.char \[10-o] \[u2469] \" CIRCLED NUMBER TEN
+.char \[11-o] \[u246A] \" CIRCLED NUMBER ELEVEN
+.char \[12-o] \[u246B] \" CIRCLED NUMBER TWELVE
+.char \[13-o] \[u246C] \" CIRCLED NUMBER THIRTEEN
+.char \[14-o] \[u246D] \" CIRCLED NUMBER FOURTEEN
+.char \[15-o] \[u246E] \" CIRCLED NUMBER FIFTEEN
+.char \[16-o] \[u246F] \" CIRCLED NUMBER SIXTEEN
+.char \[17-o] \[u2470] \" CIRCLED NUMBER SEVENTEEN
+.char \[18-o] \[u2471] \" CIRCLED NUMBER EIGHTEEN
+.char \[19-o] \[u2472] \" CIRCLED NUMBER NINETEEN
+.char \[20-o] \[u2473] \" CIRCLED NUMBER TWENTY
+.char \[(1)] \[u2474] \" PARENTHESIZED DIGIT ONE
+.char \[(2)] \[u2475] \" PARENTHESIZED DIGIT TWO
+.char \[(3)] \[u2476] \" PARENTHESIZED DIGIT THREE
+.char \[(4)] \[u2477] \" PARENTHESIZED DIGIT FOUR
+.char \[(5)] \[u2478] \" PARENTHESIZED DIGIT FIVE
+.char \[(6)] \[u2479] \" PARENTHESIZED DIGIT SIX
+.char \[(7)] \[u247A] \" PARENTHESIZED DIGIT SEVEN
+.char \[(8)] \[u247B] \" PARENTHESIZED DIGIT EIGHT
+.char \[(9)] \[u247C] \" PARENTHESIZED DIGIT NINE
+.char \[(10)] \[u247D] \" PARENTHESIZED NUMBER TEN
+.char \[(11)] \[u247E] \" PARENTHESIZED NUMBER ELEVEN
+.char \[(12)] \[u247F] \" PARENTHESIZED NUMBER TWELVE
+.char \[(13)] \[u2480] \" PARENTHESIZED NUMBER THIRTEEN
+.char \[(14)] \[u2481] \" PARENTHESIZED NUMBER FOURTEEN
+.char \[(15)] \[u2482] \" PARENTHESIZED NUMBER FIFTEEN
+.char \[(16)] \[u2483] \" PARENTHESIZED NUMBER SIXTEEN
+.char \[(17)] \[u2484] \" PARENTHESIZED NUMBER SEVENTEEN
+.char \[(18)] \[u2485] \" PARENTHESIZED NUMBER EIGHTEEN
+.char \[(19)] \[u2486] \" PARENTHESIZED NUMBER NINETEEN
+.char \[(20)] \[u2487] \" PARENTHESIZED NUMBER TWENTY
+.char \[1.] \[u2488] \" DIGIT ONE FULL STOP
+.char \[2.] \[u2489] \" DIGIT TWO FULL STOP
+.char \[3.] \[u248A] \" DIGIT THREE FULL STOP
+.char \[4.] \[u248B] \" DIGIT FOUR FULL STOP
+.char \[5.] \[u248C] \" DIGIT FIVE FULL STOP
+.char \[6.] \[u248D] \" DIGIT SIX FULL STOP
+.char \[7.] \[u248E] \" DIGIT SEVEN FULL STOP
+.char \[8.] \[u248F] \" DIGIT EIGHT FULL STOP
+.char \[9.] \[u2490] \" DIGIT NINE FULL STOP
+.char \[10.] \[u2491] \" NUMBER TEN FULL STOP
+.char \[11.] \[u2492] \" NUMBER ELEVEN FULL STOP
+.char \[12.] \[u2493] \" NUMBER TWELVE FULL STOP
+.char \[13.] \[u2494] \" NUMBER THIRTEEN FULL STOP
+.char \[14.] \[u2495] \" NUMBER FOURTEEN FULL STOP
+.char \[15.] \[u2496] \" NUMBER FIFTEEN FULL STOP
+.char \[16.] \[u2497] \" NUMBER SIXTEEN FULL STOP
+.char \[17.] \[u2498] \" NUMBER SEVENTEEN FULL STOP
+.char \[18.] \[u2499] \" NUMBER EIGHTEEN FULL STOP
+.char \[19.] \[u249A] \" NUMBER NINETEEN FULL STOP
+.char \[20.] \[u249B] \" NUMBER TWENTY FULL STOP
+.char \[(a)] \[u249C] \" PARENTHESIZED LATIN SMALL LETTER A
+.char \[(b)] \[u249D] \" PARENTHESIZED LATIN SMALL LETTER B
+.char \[(c)] \[u249E] \" PARENTHESIZED LATIN SMALL LETTER C
+.char \[(d)] \[u249F] \" PARENTHESIZED LATIN SMALL LETTER D
+.char \[(e)] \[u24A0] \" PARENTHESIZED LATIN SMALL LETTER E
+.char \[(f)] \[u24A1] \" PARENTHESIZED LATIN SMALL LETTER F
+.char \[(g)] \[u24A2] \" PARENTHESIZED LATIN SMALL LETTER G
+.char \[(h)] \[u24A3] \" PARENTHESIZED LATIN SMALL LETTER H
+.char \[(i)] \[u24A4] \" PARENTHESIZED LATIN SMALL LETTER I
+.char \[(j)] \[u24A5] \" PARENTHESIZED LATIN SMALL LETTER J
+.char \[(k)] \[u24A6] \" PARENTHESIZED LATIN SMALL LETTER K
+.char \[(l)] \[u24A7] \" PARENTHESIZED LATIN SMALL LETTER L
+.char \[(m)] \[u24A8] \" PARENTHESIZED LATIN SMALL LETTER M
+.char \[(n)] \[u24A9] \" PARENTHESIZED LATIN SMALL LETTER N
+.char \[(o)] \[u24AA] \" PARENTHESIZED LATIN SMALL LETTER O
+.char \[(p)] \[u24AB] \" PARENTHESIZED LATIN SMALL LETTER P
+.char \[(q)] \[u24AC] \" PARENTHESIZED LATIN SMALL LETTER Q
+.char \[(r)] \[u24AD] \" PARENTHESIZED LATIN SMALL LETTER R
+.char \[(s)] \[u24AE] \" PARENTHESIZED LATIN SMALL LETTER S
+.char \[(t)] \[u24AF] \" PARENTHESIZED LATIN SMALL LETTER T
+.char \[(u)] \[u24B0] \" PARENTHESIZED LATIN SMALL LETTER U
+.char \[(v)] \[u24B1] \" PARENTHESIZED LATIN SMALL LETTER V
+.char \[(w)] \[u24B2] \" PARENTHESIZED LATIN SMALL LETTER W
+.char \[(x)] \[u24B3] \" PARENTHESIZED LATIN SMALL LETTER X
+.char \[(y)] \[u24B4] \" PARENTHESIZED LATIN SMALL LETTER Y
+.char \[(z)] \[u24B5] \" PARENTHESIZED LATIN SMALL LETTER Z
+.char \[A-o] \[u24B6] \" CIRCLED LATIN CAPITAL LETTER A
+.char \[B-o] \[u24B7] \" CIRCLED LATIN CAPITAL LETTER B
+.char \[C-o] \[u24B8] \" CIRCLED LATIN CAPITAL LETTER C
+.char \[D-o] \[u24B9] \" CIRCLED LATIN CAPITAL LETTER D
+.char \[E-o] \[u24BA] \" CIRCLED LATIN CAPITAL LETTER E
+.char \[F-o] \[u24BB] \" CIRCLED LATIN CAPITAL LETTER F
+.char \[G-o] \[u24BC] \" CIRCLED LATIN CAPITAL LETTER G
+.char \[H-o] \[u24BD] \" CIRCLED LATIN CAPITAL LETTER H
+.char \[I-o] \[u24BE] \" CIRCLED LATIN CAPITAL LETTER I
+.char \[J-o] \[u24BF] \" CIRCLED LATIN CAPITAL LETTER J
+.char \[K-o] \[u24C0] \" CIRCLED LATIN CAPITAL LETTER K
+.char \[L-o] \[u24C1] \" CIRCLED LATIN CAPITAL LETTER L
+.char \[M-o] \[u24C2] \" CIRCLED LATIN CAPITAL LETTER M
+.char \[N-o] \[u24C3] \" CIRCLED LATIN CAPITAL LETTER N
+.char \[O-o] \[u24C4] \" CIRCLED LATIN CAPITAL LETTER O
+.char \[P-o] \[u24C5] \" CIRCLED LATIN CAPITAL LETTER P
+.char \[Q-o] \[u24C6] \" CIRCLED LATIN CAPITAL LETTER Q
+.char \[R-o] \[u24C7] \" CIRCLED LATIN CAPITAL LETTER R
+.char \[S-o] \[u24C8] \" CIRCLED LATIN CAPITAL LETTER S
+.char \[T-o] \[u24C9] \" CIRCLED LATIN CAPITAL LETTER T
+.char \[U-o] \[u24CA] \" CIRCLED LATIN CAPITAL LETTER U
+.char \[V-o] \[u24CB] \" CIRCLED LATIN CAPITAL LETTER V
+.char \[W-o] \[u24CC] \" CIRCLED LATIN CAPITAL LETTER W
+.char \[X-o] \[u24CD] \" CIRCLED LATIN CAPITAL LETTER X
+.char \[Y-o] \[u24CE] \" CIRCLED LATIN CAPITAL LETTER Y
+.char \[Z-o] \[u24CF] \" CIRCLED LATIN CAPITAL LETTER Z
+.char \[a-o] \[u24D0] \" CIRCLED LATIN SMALL LETTER A
+.char \[b-o] \[u24D1] \" CIRCLED LATIN SMALL LETTER B
+.char \[c-o] \[u24D2] \" CIRCLED LATIN SMALL LETTER C
+.char \[d-o] \[u24D3] \" CIRCLED LATIN SMALL LETTER D
+.char \[e-o] \[u24D4] \" CIRCLED LATIN SMALL LETTER E
+.char \[f-o] \[u24D5] \" CIRCLED LATIN SMALL LETTER F
+.char \[g-o] \[u24D6] \" CIRCLED LATIN SMALL LETTER G
+.char \[h-o] \[u24D7] \" CIRCLED LATIN SMALL LETTER H
+.char \[i-o] \[u24D8] \" CIRCLED LATIN SMALL LETTER I
+.char \[j-o] \[u24D9] \" CIRCLED LATIN SMALL LETTER J
+.char \[k-o] \[u24DA] \" CIRCLED LATIN SMALL LETTER K
+.char \[l-o] \[u24DB] \" CIRCLED LATIN SMALL LETTER L
+.char \[m-o] \[u24DC] \" CIRCLED LATIN SMALL LETTER M
+.char \[n-o] \[u24DD] \" CIRCLED LATIN SMALL LETTER N
+.char \[o-o] \[u24DE] \" CIRCLED LATIN SMALL LETTER O
+.char \[p-o] \[u24DF] \" CIRCLED LATIN SMALL LETTER P
+.char \[q-o] \[u24E0] \" CIRCLED LATIN SMALL LETTER Q
+.char \[r-o] \[u24E1] \" CIRCLED LATIN SMALL LETTER R
+.char \[s-o] \[u24E2] \" CIRCLED LATIN SMALL LETTER S
+.char \[t-o] \[u24E3] \" CIRCLED LATIN SMALL LETTER T
+.char \[u-o] \[u24E4] \" CIRCLED LATIN SMALL LETTER U
+.char \[v-o] \[u24E5] \" CIRCLED LATIN SMALL LETTER V
+.char \[w-o] \[u24E6] \" CIRCLED LATIN SMALL LETTER W
+.char \[x-o] \[u24E7] \" CIRCLED LATIN SMALL LETTER X
+.char \[y-o] \[u24E8] \" CIRCLED LATIN SMALL LETTER Y
+.char \[z-o] \[u24E9] \" CIRCLED LATIN SMALL LETTER Z
+.char \[0-o] \[u24EA] \" CIRCLED DIGIT ZERO
+.char \[hh] \[u2500] \" BOX DRAWINGS LIGHT HORIZONTAL
+.char \[HH] \[u2501] \" BOX DRAWINGS HEAVY HORIZONTAL
+.char \[vv] \[u2502] \" BOX DRAWINGS LIGHT VERTICAL
+.char \[VV] \[u2503] \" BOX DRAWINGS HEAVY VERTICAL
+.char \[3-] \[u2504] \" BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+.char \[3_] \[u2505] \" BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+.char \[3!] \[u2506] \" BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+.char \[3/] \[u2507] \" BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+.char \[4-] \[u2508] \" BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+.char \[4_] \[u2509] \" BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+.char \[4!] \[u250A] \" BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+.char \[4/] \[u250B] \" BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+.char \[dr] \[u250C] \" BOX DRAWINGS LIGHT DOWN AND RIGHT
+.char \[dR] \[u250D] \" BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+.char \[Dr] \[u250E] \" BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+.char \[DR] \[u250F] \" BOX DRAWINGS HEAVY DOWN AND RIGHT
+.char \[dl] \[u2510] \" BOX DRAWINGS LIGHT DOWN AND LEFT
+.char \[dL] \[u2511] \" BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+.char \[Dl] \[u2512] \" BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+.char \[LD] \[u2513] \" BOX DRAWINGS HEAVY DOWN AND LEFT
+.char \[ur] \[u2514] \" BOX DRAWINGS LIGHT UP AND RIGHT
+.char \[uR] \[u2515] \" BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+.char \[Ur] \[u2516] \" BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+.char \[UR] \[u2517] \" BOX DRAWINGS HEAVY UP AND RIGHT
+.char \[ul] \[u2518] \" BOX DRAWINGS LIGHT UP AND LEFT
+.char \[uL] \[u2519] \" BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+.char \[Ul] \[u251A] \" BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+.char \[UL] \[u251B] \" BOX DRAWINGS HEAVY UP AND LEFT
+.char \[vr] \[u251C] \" BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+.char \[vR] \[u251D] \" BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+.char \[Udr] \[u251E] \" BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+.char \[uDr] \[u251F] \" BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+.char \[Vr] \[u2520] \" BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+.char \[UdR] \[u2521] \" BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+.char \[uDR] \[u2522] \" BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+.char \[VR] \[u2523] \" BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+.char \[vl] \[u2524] \" BOX DRAWINGS LIGHT VERTICAL AND LEFT
+.char \[vL] \[u2525] \" BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+.char \[Udl] \[u2526] \" BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+.char \[uDl] \[u2527] \" BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+.char \[Vl] \[u2528] \" BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+.char \[UdL] \[u2529] \" BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+.char \[uDL] \[u252A] \" BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+.char \[VL] \[u252B] \" BOX DRAWINGS HEAVY VERTICAL AND LEFT
+.char \[dh] \[u252C] \" BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+.char \[dLr] \[u252D] \" BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+.char \[dlR] \[u252E] \" BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+.char \[dH] \[u252F] \" BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+.char \[Dh] \[u2530] \" BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+.char \[DLr] \[u2531] \" BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+.char \[DlR] \[u2532] \" BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+.char \[DH] \[u2533] \" BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+.char \[uh] \[u2534] \" BOX DRAWINGS LIGHT UP AND HORIZONTAL
+.char \[uLr] \[u2535] \" BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+.char \[ulR] \[u2536] \" BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+.char \[uH] \[u2537] \" BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+.char \[Uh] \[u2538] \" BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+.char \[ULr] \[u2539] \" BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+.char \[UlR] \[u253A] \" BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+.char \[UH] \[u253B] \" BOX DRAWINGS HEAVY UP AND HORIZONTAL
+.char \[vh] \[u253C] \" BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+.char \[vLr] \[u253D] \" BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+.char \[vlR] \[u253E] \" BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+.char \[vH] \[u253F] \" BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+.char \[Udh] \[u2540] \" BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+.char \[uDh] \[u2541] \" BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+.char \[Vh] \[u2542] \" BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+.char \[UdLr] \[u2543] \" BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+.char \[UdlR] \[u2544] \" BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+.char \[uDLr] \[u2545] \" BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+.char \[uDlR] \[u2546] \" BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+.char \[UdH] \[u2547] \" BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+.char \[uDH] \[u2548] \" BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+.char \[VLr] \[u2549] \" BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+.char \[VlR] \[u254A] \" BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+.char \[VH] \[u254B] \" BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+.char \[FD] \[u2571] \" BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+.char \[BD] \[u2572] \" BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+.char \[TB] \[u2580] \" UPPER HALF BLOCK
+.char \[LB] \[u2584] \" LOWER HALF BLOCK
+.char \[FB] \[u2588] \" FULL BLOCK
+.char \[lB] \[u258C] \" LEFT HALF BLOCK
+.char \[RB] \[u2590] \" RIGHT HALF BLOCK
+.char \[.S] \[u2591] \" LIGHT SHADE
+.char \[:S] \[u2592] \" MEDIUM SHADE
+.char \[?S] \[u2593] \" DARK SHADE
+.char \[fS] \[u25A0] \" BLACK SQUARE
+.char \[OS] \[u25A1] \" WHITE SQUARE
+.char \[RO] \[u25A2] \" WHITE SQUARE WITH ROUNDED CORNERS
+.char \[Rr] \[u25A3] \" WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+.char \[RF] \[u25A4] \" SQUARE WITH HORIZONTAL FILL
+.char \[RY] \[u25A5] \" SQUARE WITH VERTICAL FILL
+.char \[RH] \[u25A6] \" SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+.char \[RZ] \[u25A7] \" SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+.char \[RK] \[u25A8] \" SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+.char \[RX] \[u25A9] \" SQUARE WITH DIAGONAL CROSSHATCH FILL
+.char \[sB] \[u25AA] \" BLACK SMALL SQUARE
+.char \[SR] \[u25AC] \" BLACK RECTANGLE
+.char \[Or] \[u25AD] \" WHITE RECTANGLE
+.char \[UT] \[u25B2] \" BLACK UP-POINTING TRIANGLE
+.char \[uT] \[u25B3] \" WHITE UP-POINTING TRIANGLE
+.char \[PR] \[u25B6] \" BLACK RIGHT-POINTING TRIANGLE
+.char \[Tr] \[u25B7] \" WHITE RIGHT-POINTING TRIANGLE
+.char \[Dt] \[u25BC] \" BLACK DOWN-POINTING TRIANGLE
+.char \[dT] \[u25BD] \" WHITE DOWN-POINTING TRIANGLE
+.char \[PL] \[u25C0] \" BLACK LEFT-POINTING TRIANGLE
+.char \[Tl] \[u25C1] \" WHITE LEFT-POINTING TRIANGLE
+.char \[Db] \[u25C6] \" BLACK DIAMOND
+.char \[Dw] \[u25C7] \" WHITE DIAMOND
+.char \[LZ] \[u25CA] \" LOZENGE
+.char \[0m] \[u25CB] \" WHITE CIRCLE
+.char \[0o] \[u25CE] \" BULLSEYE
+.char \[0M] \[u25CF] \" BLACK CIRCLE
+.char \[0L] \[u25D0] \" CIRCLE WITH LEFT HALF BLACK
+.char \[0R] \[u25D1] \" CIRCLE WITH RIGHT HALF BLACK
+.char \[Sn] \[u25D8] \" INVERSE BULLET
+.char \[Ic] \[u25D9] \" INVERSE WHITE CIRCLE
+.char \[Fd] \[u25E2] \" BLACK LOWER RIGHT TRIANGLE
+.char \[Bd] \[u25E3] \" BLACK LOWER LEFT TRIANGLE
+.char \[*2] \[u2605] \" BLACK STAR
+.char \[*1] \[u2606] \" WHITE STAR
+.char \[TEL] \[u260E] \" BLACK TELEPHONE
+.char \[tel] \[u260F] \" WHITE TELEPHONE
+.char \[<H] \[u261C] \" WHITE LEFT POINTING INDEX
+.char \[>H] \[u261E] \" WHITE RIGHT POINTING INDEX
+.char \[0u] \[u263A] \" WHITE SMILING FACE
+.char \[0U] \[u263B] \" BLACK SMILING FACE
+.char \[SU] \[u263C] \" WHITE SUN WITH RAYS
+.char \[Fm] \[u2640] \" FEMALE SIGN
+.char \[Ml] \[u2642] \" MALE SIGN
+.char \[cS] \[u2660] \" BLACK SPADE SUIT
+.char \[cH] \[u2661] \" WHITE HEART SUIT
+.char \[cD] \[u2662] \" WHITE DIAMOND SUIT
+.char \[cC] \[u2663] \" BLACK CLUB SUIT
+.char \[cS-] \[u2664] \" WHITE SPADE SUIT
+.char \[cH-] \[u2665] \" BLACK HEART SUIT
+.char \[cD-] \[u2666] \" BLACK DIAMOND SUIT
+.char \[cC-] \[u2667] \" WHITE CLUB SUIT
+.char \[Md] \[u2669] \" QUARTER NOTE
+.char \[M8] \[u266A] \" EIGHTH NOTE
+.char \[M2] \[u266B] \" BARRED EIGHTH NOTES
+.char \[M16] \[u266C] \" BARRED SIXTEENTH NOTES
+.char \[Mb] \[u266D] \" MUSIC FLAT SIGN
+.char \[Mx] \[u266E] \" MUSIC NATURAL SIGN
+.char \[MX] \[u266F] \" MUSIC SHARP SIGN
+.char \[OK] \[u2713] \" CHECK MARK
+.char \[XX] \[u2717] \" BALLOT X
+.char \[-X] \[u2720] \" MALTESE CROSS
+.char \[IS] \[u3000] \" IDEOGRAPHIC SPACE
+.char \[,_] \[u3001] \" IDEOGRAPHIC COMMA
+.char \[._] \[u3002] \" IDEOGRAPHIC PERIOD
+.char \[+"] \[u3003] \" DITTO MARK
+.char \[+_] \[u3004] \" IDEOGRAPHIC DITTO MARK
+.char \[*_] \[u3005] \" IDEOGRAPHIC ITERATION MARK
+.char \[;_] \[u3006] \" IDEOGRAPHIC CLOSING MARK
+.char \[0_] \[u3007] \" IDEOGRAPHIC NUMBER ZERO
+.char \[<+] \[u300A] \" LEFT DOUBLE ANGLE BRACKET
+.char \[>+] \[u300B] \" RIGHT DOUBLE ANGLE BRACKET
+.char \[<'] \[u300C] \" LEFT CORNER BRACKET
+.char \[>'] \[u300D] \" RIGHT CORNER BRACKET
+.char \[<"] \[u300E] \" LEFT WHITE CORNER BRACKET
+.char \[>"] \[u300F] \" RIGHT WHITE CORNER BRACKET
+.char \[("] \[u3010] \" LEFT BLACK LENTICULAR BRACKET
+.char \[)"] \[u3011] \" RIGHT BLACK LENTICULAR BRACKET
+.char \[=T] \[u3012] \" POSTAL MARK
+.char \[=_] \[u3013] \" GETA MARK
+.char \[('] \[u3014] \" LEFT TORTOISE SHELL BRACKET
+.char \[)'] \[u3015] \" RIGHT TORTOISE SHELL BRACKET
+.char \[(I] \[u3016] \" LEFT WHITE LENTICULAR BRACKET
+.char \[)I] \[u3017] \" RIGHT WHITE LENTICULAR BRACKET
+.char \[-?] \[u301C] \" WAVE DASH
+.char \[=T:)] \[u3020] \" POSTAL MARK FACE
+.char \[A5] \[u3041] \" HIRAGANA LETTER SMALL A
+.char \[a5] \[u3042] \" HIRAGANA LETTER A
+.char \[I5] \[u3043] \" HIRAGANA LETTER SMALL I
+.char \[i5] \[u3044] \" HIRAGANA LETTER I
+.char \[U5] \[u3045] \" HIRAGANA LETTER SMALL U
+.char \[u5] \[u3046] \" HIRAGANA LETTER U
+.char \[E5] \[u3047] \" HIRAGANA LETTER SMALL E
+.char \[e5] \[u3048] \" HIRAGANA LETTER E
+.char \[O5] \[u3049] \" HIRAGANA LETTER SMALL O
+.char \[o5] \[u304A] \" HIRAGANA LETTER O
+.char \[ka] \[u304B] \" HIRAGANA LETTER KA
+.char \[ga] \[u304C] \" HIRAGANA LETTER GA
+.char \[ki] \[u304D] \" HIRAGANA LETTER KI
+.char \[gi] \[u304E] \" HIRAGANA LETTER GI
+.char \[ku] \[u304F] \" HIRAGANA LETTER KU
+.char \[gu] \[u3050] \" HIRAGANA LETTER GU
+.char \[ke] \[u3051] \" HIRAGANA LETTER KE
+.char \[ge] \[u3052] \" HIRAGANA LETTER GE
+.char \[ko] \[u3053] \" HIRAGANA LETTER KO
+.char \[go] \[u3054] \" HIRAGANA LETTER GO
+.char \[sa] \[u3055] \" HIRAGANA LETTER SA
+.char \[za] \[u3056] \" HIRAGANA LETTER ZA
+.char \[si] \[u3057] \" HIRAGANA LETTER SI
+.char \[zi] \[u3058] \" HIRAGANA LETTER ZI
+.char \[su] \[u3059] \" HIRAGANA LETTER SU
+.char \[zu] \[u305A] \" HIRAGANA LETTER ZU
+.char \[se] \[u305B] \" HIRAGANA LETTER SE
+.char \[ze] \[u305C] \" HIRAGANA LETTER ZE
+.char \[so] \[u305D] \" HIRAGANA LETTER SO
+.char \[zo] \[u305E] \" HIRAGANA LETTER ZO
+.char \[ta] \[u305F] \" HIRAGANA LETTER TA
+.char \[da] \[u3060] \" HIRAGANA LETTER DA
+.char \[ti] \[u3061] \" HIRAGANA LETTER TI
+.char \[di] \[u3062] \" HIRAGANA LETTER DI
+.char \[tU] \[u3063] \" HIRAGANA LETTER SMALL TU
+.char \[tu] \[u3064] \" HIRAGANA LETTER TU
+.char \[du] \[u3065] \" HIRAGANA LETTER DU
+.char \[te] \[u3066] \" HIRAGANA LETTER TE
+.char \[de] \[u3067] \" HIRAGANA LETTER DE
+.char \[to] \[u3068] \" HIRAGANA LETTER TO
+.char \[do] \[u3069] \" HIRAGANA LETTER DO
+.char \[na] \[u306A] \" HIRAGANA LETTER NA
+.char \[ni] \[u306B] \" HIRAGANA LETTER NI
+.char \[nu] \[u306C] \" HIRAGANA LETTER NU
+.char \[ne] \[u306D] \" HIRAGANA LETTER NE
+.char \[no] \[u306E] \" HIRAGANA LETTER NO
+.char \[ha] \[u306F] \" HIRAGANA LETTER HA
+.char \[ba] \[u3070] \" HIRAGANA LETTER BA
+.char \[pa] \[u3071] \" HIRAGANA LETTER PA
+.char \[hi] \[u3072] \" HIRAGANA LETTER HI
+.char \[bi] \[u3073] \" HIRAGANA LETTER BI
+.char \[pi] \[u3074] \" HIRAGANA LETTER PI
+.char \[hu] \[u3075] \" HIRAGANA LETTER HU
+.char \[bu] \[u3076] \" HIRAGANA LETTER BU
+.char \[pu] \[u3077] \" HIRAGANA LETTER PU
+.char \[he] \[u3078] \" HIRAGANA LETTER HE
+.char \[be] \[u3079] \" HIRAGANA LETTER BE
+.char \[pe] \[u307A] \" HIRAGANA LETTER PE
+.char \[ho] \[u307B] \" HIRAGANA LETTER HO
+.char \[bo] \[u307C] \" HIRAGANA LETTER BO
+.char \[po] \[u307D] \" HIRAGANA LETTER PO
+.char \[ma] \[u307E] \" HIRAGANA LETTER MA
+.char \[mi] \[u307F] \" HIRAGANA LETTER MI
+.char \[mu] \[u3080] \" HIRAGANA LETTER MU
+.char \[me] \[u3081] \" HIRAGANA LETTER ME
+.char \[mo] \[u3082] \" HIRAGANA LETTER MO
+.char \[yA] \[u3083] \" HIRAGANA LETTER SMALL YA
+.char \[ya] \[u3084] \" HIRAGANA LETTER YA
+.char \[yU] \[u3085] \" HIRAGANA LETTER SMALL YU
+.char \[yu] \[u3086] \" HIRAGANA LETTER YU
+.char \[yO] \[u3087] \" HIRAGANA LETTER SMALL YO
+.char \[yo] \[u3088] \" HIRAGANA LETTER YO
+.char \[ra] \[u3089] \" HIRAGANA LETTER RA
+.char \[ri] \[u308A] \" HIRAGANA LETTER RI
+.char \[ru] \[u308B] \" HIRAGANA LETTER RU
+.char \[re] \[u308C] \" HIRAGANA LETTER RE
+.char \[ro] \[u308D] \" HIRAGANA LETTER RO
+.char \[wA] \[u308E] \" HIRAGANA LETTER SMALL WA
+.char \[wa] \[u308F] \" HIRAGANA LETTER WA
+.char \[wi] \[u3090] \" HIRAGANA LETTER WI
+.char \[we] \[u3091] \" HIRAGANA LETTER WE
+.char \[wo] \[u3092] \" HIRAGANA LETTER WO
+.char \[n5] \[u3093] \" HIRAGANA LETTER N
+.char \[vu] \[u3094] \" HIRAGANA LETTER VU
+.char \["5] \[u309B] \" KATAKANA-HIRAGANA VOICED SOUND MARK
+.char \[05] \[u309C] \" KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+.char \[*5] \[u309D] \" HIRAGANA ITERATION MARK
+.char \[+5] \[u309E] \" HIRAGANA VOICED ITERATION MARK
+.char \[a6] \[u30A1] \" KATAKANA LETTER SMALL A
+.char \[A6] \[u30A2] \" KATAKANA LETTER A
+.char \[i6] \[u30A3] \" KATAKANA LETTER SMALL I
+.char \[I6] \[u30A4] \" KATAKANA LETTER I
+.char \[u6] \[u30A5] \" KATAKANA LETTER SMALL U
+.char \[U6] \[u30A6] \" KATAKANA LETTER U
+.char \[e6] \[u30A7] \" KATAKANA LETTER SMALL E
+.char \[E6] \[u30A8] \" KATAKANA LETTER E
+.char \[o6] \[u30A9] \" KATAKANA LETTER SMALL O
+.char \[O6] \[u30AA] \" KATAKANA LETTER O
+.char \[Ka] \[u30AB] \" KATAKANA LETTER KA
+.char \[Ga] \[u30AC] \" KATAKANA LETTER GA
+.char \[Ki] \[u30AD] \" KATAKANA LETTER KI
+.char \[Gi] \[u30AE] \" KATAKANA LETTER GI
+.char \[Ku] \[u30AF] \" KATAKANA LETTER KU
+.char \[Gu] \[u30B0] \" KATAKANA LETTER GU
+.char \[Ke] \[u30B1] \" KATAKANA LETTER KE
+.char \[Ge] \[u30B2] \" KATAKANA LETTER GE
+.char \[Ko] \[u30B3] \" KATAKANA LETTER KO
+.char \[Go] \[u30B4] \" KATAKANA LETTER GO
+.char \[Sa] \[u30B5] \" KATAKANA LETTER SA
+.char \[Za] \[u30B6] \" KATAKANA LETTER ZA
+.char \[Si] \[u30B7] \" KATAKANA LETTER SI
+.char \[Zi] \[u30B8] \" KATAKANA LETTER ZI
+.char \[Su] \[u30B9] \" KATAKANA LETTER SU
+.char \[Zu] \[u30BA] \" KATAKANA LETTER ZU
+.char \[Se] \[u30BB] \" KATAKANA LETTER SE
+.char \[Ze] \[u30BC] \" KATAKANA LETTER ZE
+.char \[So] \[u30BD] \" KATAKANA LETTER SO
+.char \[Zo] \[u30BE] \" KATAKANA LETTER ZO
+.char \[Ta] \[u30BF] \" KATAKANA LETTER TA
+.char \[Da] \[u30C0] \" KATAKANA LETTER DA
+.char \[Ti] \[u30C1] \" KATAKANA LETTER TI
+.char \[Di] \[u30C2] \" KATAKANA LETTER DI
+.char \[TU] \[u30C3] \" KATAKANA LETTER SMALL TU
+.char \[Tu] \[u30C4] \" KATAKANA LETTER TU
+.char \[Du] \[u30C5] \" KATAKANA LETTER DU
+.char \[Te] \[u30C6] \" KATAKANA LETTER TE
+.char \[De] \[u30C7] \" KATAKANA LETTER DE
+.char \[To] \[u30C8] \" KATAKANA LETTER TO
+.char \[Do] \[u30C9] \" KATAKANA LETTER DO
+.char \[Na] \[u30CA] \" KATAKANA LETTER NA
+.char \[Ni] \[u30CB] \" KATAKANA LETTER NI
+.char \[Nu] \[u30CC] \" KATAKANA LETTER NU
+.char \[Ne] \[u30CD] \" KATAKANA LETTER NE
+.char \[No] \[u30CE] \" KATAKANA LETTER NO
+.char \[Ha] \[u30CF] \" KATAKANA LETTER HA
+.char \[Ba] \[u30D0] \" KATAKANA LETTER BA
+.char \[Pa] \[u30D1] \" KATAKANA LETTER PA
+.char \[Hi] \[u30D2] \" KATAKANA LETTER HI
+.char \[Bi] \[u30D3] \" KATAKANA LETTER BI
+.char \[Pi] \[u30D4] \" KATAKANA LETTER PI
+.char \[Hu] \[u30D5] \" KATAKANA LETTER HU
+.char \[Bu] \[u30D6] \" KATAKANA LETTER BU
+.char \[Pu] \[u30D7] \" KATAKANA LETTER PU
+.char \[He] \[u30D8] \" KATAKANA LETTER HE
+.char \[Be] \[u30D9] \" KATAKANA LETTER BE
+.char \[Pe] \[u30DA] \" KATAKANA LETTER PE
+.char \[Ho] \[u30DB] \" KATAKANA LETTER HO
+.char \[Bo] \[u30DC] \" KATAKANA LETTER BO
+.char \[Po] \[u30DD] \" KATAKANA LETTER PO
+.char \[Ma] \[u30DE] \" KATAKANA LETTER MA
+.char \[Mi] \[u30DF] \" KATAKANA LETTER MI
+.char \[Mu] \[u30E0] \" KATAKANA LETTER MU
+.char \[Me] \[u30E1] \" KATAKANA LETTER ME
+.char \[Mo] \[u30E2] \" KATAKANA LETTER MO
+.char \[YA] \[u30E3] \" KATAKANA LETTER SMALL YA
+.char \[Ya] \[u30E4] \" KATAKANA LETTER YA
+.char \[YU] \[u30E5] \" KATAKANA LETTER SMALL YU
+.char \[Yu] \[u30E6] \" KATAKANA LETTER YU
+.char \[YO] \[u30E7] \" KATAKANA LETTER SMALL YO
+.char \[Yo] \[u30E8] \" KATAKANA LETTER YO
+.char \[Ra] \[u30E9] \" KATAKANA LETTER RA
+.char \[Ri] \[u30EA] \" KATAKANA LETTER RI
+.char \[Ru] \[u30EB] \" KATAKANA LETTER RU
+.char \[Re] \[u30EC] \" KATAKANA LETTER RE
+.char \[Ro] \[u30ED] \" KATAKANA LETTER RO
+.char \[WA] \[u30EE] \" KATAKANA LETTER SMALL WA
+.char \[Wa] \[u30EF] \" KATAKANA LETTER WA
+.char \[Wi] \[u30F0] \" KATAKANA LETTER WI
+.char \[We] \[u30F1] \" KATAKANA LETTER WE
+.char \[Wo] \[u30F2] \" KATAKANA LETTER WO
+.char \[N6] \[u30F3] \" KATAKANA LETTER N
+.char \[Vu] \[u30F4] \" KATAKANA LETTER VU
+.char \[KA] \[u30F5] \" KATAKANA LETTER SMALL KA
+.char \[KE] \[u30F6] \" KATAKANA LETTER SMALL KE
+.char \[Va] \[u30F7] \" KATAKANA LETTER VA
+.char \[Vi] \[u30F8] \" KATAKANA LETTER VI
+.char \[Ve] \[u30F9] \" KATAKANA LETTER VE
+.char \[Vo] \[u30FA] \" KATAKANA LETTER VO
+.char \[.6] \[u30FB] \" KATAKANA MIDDLE DOT
+.char \[-6] \[u30FC] \" KATAKANA-HIRAGANA PROLONGED SOUND MARK
+.char \[*6] \[u30FD] \" KATAKANA ITERATION MARK
+.char \[+6] \[u30FE] \" KATAKANA VOICED ITERATION MARK
+.char \[b4] \[u3105] \" BOPOMOFO LETTER B
+.char \[p4] \[u3106] \" BOPOMOFO LETTER P
+.char \[m4] \[u3107] \" BOPOMOFO LETTER M
+.char \[f4] \[u3108] \" BOPOMOFO LETTER F
+.char \[d4] \[u3109] \" BOPOMOFO LETTER D
+.char \[t4] \[u310A] \" BOPOMOFO LETTER T
+.char \[n4] \[u310B] \" BOPOMOFO LETTER N
+.char \[l4] \[u310C] \" BOPOMOFO LETTER L
+.char \[g4] \[u310D] \" BOPOMOFO LETTER G
+.char \[k4] \[u310E] \" BOPOMOFO LETTER K
+.char \[h4] \[u310F] \" BOPOMOFO LETTER H
+.char \[j4] \[u3110] \" BOPOMOFO LETTER J
+.char \[q4] \[u3111] \" BOPOMOFO LETTER Q
+.char \[x4] \[u3112] \" BOPOMOFO LETTER X
+.char \[zh] \[u3113] \" BOPOMOFO LETTER ZH
+.char \[ch] \[u3114] \" BOPOMOFO LETTER CH
+.char \[sh] \[u3115] \" BOPOMOFO LETTER SH
+.char \[r4] \[u3116] \" BOPOMOFO LETTER R
+.char \[z4] \[u3117] \" BOPOMOFO LETTER Z
+.char \[c4] \[u3118] \" BOPOMOFO LETTER C
+.char \[s4] \[u3119] \" BOPOMOFO LETTER S
+.char \[a4] \[u311A] \" BOPOMOFO LETTER A
+.char \[o4] \[u311B] \" BOPOMOFO LETTER O
+.char \[e4] \[u311C] \" BOPOMOFO LETTER E
+.char \[eh4] \[u311D] \" BOPOMOFO LETTER EH
+.char \[ai] \[u311E] \" BOPOMOFO LETTER AI
+.char \[ei] \[u311F] \" BOPOMOFO LETTER EI
+.char \[au] \[u3120] \" BOPOMOFO LETTER AU
+.char \[ou] \[u3121] \" BOPOMOFO LETTER OU
+.char \[an] \[u3122] \" BOPOMOFO LETTER AN
+.char \[en] \[u3123] \" BOPOMOFO LETTER EN
+.char \[aN] \[u3124] \" BOPOMOFO LETTER ANG
+.char \[eN] \[u3125] \" BOPOMOFO LETTER ENG
+.char \[er] \[u3126] \" BOPOMOFO LETTER ER
+.char \[i4] \[u3127] \" BOPOMOFO LETTER I
+.char \[u4] \[u3128] \" BOPOMOFO LETTER U
+.char \[iu] \[u3129] \" BOPOMOFO LETTER IU
+.char \[v4] \[u312A] \" BOPOMOFO LETTER V
+.char \[nG] \[u312B] \" BOPOMOFO LETTER NG
+.char \[gn] \[u312C] \" BOPOMOFO LETTER GN
+.char \[(JU)] \[u321C] \" PARENTHESIZED HANGUL JU
+.char \[1c] \[u3220] \" PARENTHESIZED IDEOGRAPH ONE
+.char \[2c] \[u3221] \" PARENTHESIZED IDEOGRAPH TWO
+.char \[3c] \[u3222] \" PARENTHESIZED IDEOGRAPH THREE
+.char \[4c] \[u3223] \" PARENTHESIZED IDEOGRAPH FOUR
+.char \[5c] \[u3224] \" PARENTHESIZED IDEOGRAPH FIVE
+.char \[6c] \[u3225] \" PARENTHESIZED IDEOGRAPH SIX
+.char \[7c] \[u3226] \" PARENTHESIZED IDEOGRAPH SEVEN
+.char \[8c] \[u3227] \" PARENTHESIZED IDEOGRAPH EIGHT
+.char \[9c] \[u3228] \" PARENTHESIZED IDEOGRAPH NINE
+.char \[10c] \[u3229] \" PARENTHESIZED IDEOGRAPH TEN
+.char \[KSC] \[u327F] \" KOREAN STANDARD SYMBOL
+.char \[ff] \[uFB00] \" LATIN SMALL LIGATURE FF
+.char \[fi] \[uFB01] \" LATIN SMALL LIGATURE FI
+.char \[fl] \[uFB02] \" LATIN SMALL LIGATURE FL
+.char \[ffi] \[uFB03] \" LATIN SMALL LIGATURE FFI
+.char \[ffl] \[uFB04] \" LATIN SMALL LIGATURE FFL
+.char \[ft] \[uFB05] \" LATIN SMALL LIGATURE FT
+.char \[st] \[uFB06] \" LATIN SMALL LIGATURE ST
+.char \[3+;] \[uFE7D] \" ARABIC SHADDA MEDIAL FORM
+.char \[aM.] \[uFE82] \" ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
+.char \[aH.] \[uFE84] \" ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
+.char \[a+-] \[uFE8D] \" ARABIC LETTER ALEF ISOLATED FORM
+.char \[a+.] \[uFE8E] \" ARABIC LETTER ALEF FINAL FORM
+.char \[b+-] \[uFE8F] \" ARABIC LETTER BEH ISOLATED FORM
+.char \[b+,] \[uFE90] \" ARABIC LETTER BEH INITIAL FORM
+.char \[b+;] \[uFE91] \" ARABIC LETTER BEH MEDIAL FORM
+.char \[b+.] \[uFE92] \" ARABIC LETTER BEH FINAL FORM
+.char \[tm-] \[uFE93] \" ARABIC LETTER TEH MARBUTA ISOLATED FORM
+.char \[tm.] \[uFE94] \" ARABIC LETTER TEH MARBUTA FINAL FORM
+.char \[t+-] \[uFE95] \" ARABIC LETTER TEH ISOLATED FORM
+.char \[t+,] \[uFE96] \" ARABIC LETTER TEH INITIAL FORM
+.char \[t+;] \[uFE97] \" ARABIC LETTER TEH MEDIAL FORM
+.char \[t+.] \[uFE98] \" ARABIC LETTER TEH FINAL FORM
+.char \[tk-] \[uFE99] \" ARABIC LETTER THEH ISOLATED FORM
+.char \[tk,] \[uFE9A] \" ARABIC LETTER THEH INITIAL FORM
+.char \[tk;] \[uFE9B] \" ARABIC LETTER THEH MEDIAL FORM
+.char \[tk.] \[uFE9C] \" ARABIC LETTER THEH FINAL FORM
+.char \[g+-] \[uFE9D] \" ARABIC LETTER JEEM ISOLATED FORM
+.char \[g+,] \[uFE9E] \" ARABIC LETTER JEEM INITIAL FORM
+.char \[g+;] \[uFE9F] \" ARABIC LETTER JEEM MEDIAL FORM
+.char \[g+.] \[uFEA0] \" ARABIC LETTER JEEM FINAL FORM
+.char \[hk-] \[uFEA1] \" ARABIC LETTER HAH ISOLATED FORM
+.char \[hk,] \[uFEA2] \" ARABIC LETTER HAH INITIAL FORM
+.char \[hk;] \[uFEA3] \" ARABIC LETTER HAH MEDIAL FORM
+.char \[hk.] \[uFEA4] \" ARABIC LETTER HAH FINAL FORM
+.char \[x+-] \[uFEA5] \" ARABIC LETTER KHAH ISOLATED FORM
+.char \[x+,] \[uFEA6] \" ARABIC LETTER KHAH INITIAL FORM
+.char \[x+;] \[uFEA7] \" ARABIC LETTER KHAH MEDIAL FORM
+.char \[x+.] \[uFEA8] \" ARABIC LETTER KHAH FINAL FORM
+.char \[d+-] \[uFEA9] \" ARABIC LETTER DAL ISOLATED FORM
+.char \[d+.] \[uFEAA] \" ARABIC LETTER DAL FINAL FORM
+.char \[dk-] \[uFEAB] \" ARABIC LETTER THAL ISOLATED FORM
+.char \[dk.] \[uFEAC] \" ARABIC LETTER THAL FINAL FORM
+.char \[r+-] \[uFEAD] \" ARABIC LETTER REH ISOLATED FORM
+.char \[r+.] \[uFEAE] \" ARABIC LETTER REH FINAL FORM
+.char \[z+-] \[uFEAF] \" ARABIC LETTER ZAIN ISOLATED FORM
+.char \[z+.] \[uFEB0] \" ARABIC LETTER ZAIN FINAL FORM
+.char \[s+-] \[uFEB1] \" ARABIC LETTER SEEN ISOLATED FORM
+.char \[s+,] \[uFEB2] \" ARABIC LETTER SEEN INITIAL FORM
+.char \[s+;] \[uFEB3] \" ARABIC LETTER SEEN MEDIAL FORM
+.char \[s+.] \[uFEB4] \" ARABIC LETTER SEEN FINAL FORM
+.char \[sn-] \[uFEB5] \" ARABIC LETTER SHEEN ISOLATED FORM
+.char \[sn,] \[uFEB6] \" ARABIC LETTER SHEEN INITIAL FORM
+.char \[sn;] \[uFEB7] \" ARABIC LETTER SHEEN MEDIAL FORM
+.char \[sn.] \[uFEB8] \" ARABIC LETTER SHEEN FINAL FORM
+.char \[c+-] \[uFEB9] \" ARABIC LETTER SAD ISOLATED FORM
+.char \[c+,] \[uFEBA] \" ARABIC LETTER SAD INITIAL FORM
+.char \[c+;] \[uFEBB] \" ARABIC LETTER SAD MEDIAL FORM
+.char \[c+.] \[uFEBC] \" ARABIC LETTER SAD FINAL FORM
+.char \[dd-] \[uFEBD] \" ARABIC LETTER DAD ISOLATED FORM
+.char \[dd,] \[uFEBE] \" ARABIC LETTER DAD INITIAL FORM
+.char \[dd;] \[uFEBF] \" ARABIC LETTER DAD MEDIAL FORM
+.char \[dd.] \[uFEC0] \" ARABIC LETTER DAD FINAL FORM
+.char \[tj-] \[uFEC1] \" ARABIC LETTER TAH ISOLATED FORM
+.char \[tj,] \[uFEC2] \" ARABIC LETTER TAH INITIAL FORM
+.char \[tj;] \[uFEC3] \" ARABIC LETTER TAH MEDIAL FORM
+.char \[tj.] \[uFEC4] \" ARABIC LETTER TAH FINAL FORM
+.char \[zH-] \[uFEC5] \" ARABIC LETTER ZAH ISOLATED FORM
+.char \[zH,] \[uFEC6] \" ARABIC LETTER ZAH INITIAL FORM
+.char \[zH;] \[uFEC7] \" ARABIC LETTER ZAH MEDIAL FORM
+.char \[zH.] \[uFEC8] \" ARABIC LETTER ZAH FINAL FORM
+.char \[e+-] \[uFEC9] \" ARABIC LETTER AIN ISOLATED FORM
+.char \[e+,] \[uFECA] \" ARABIC LETTER AIN INITIAL FORM
+.char \[e+;] \[uFECB] \" ARABIC LETTER AIN MEDIAL FORM
+.char \[e+.] \[uFECC] \" ARABIC LETTER AIN FINAL FORM
+.char \[i+-] \[uFECD] \" ARABIC LETTER GHAIN ISOLATED FORM
+.char \[i+,] \[uFECE] \" ARABIC LETTER GHAIN INITIAL FORM
+.char \[i+;] \[uFECF] \" ARABIC LETTER GHAIN MEDIAL FORM
+.char \[i+.] \[uFED0] \" ARABIC LETTER GHAIN FINAL FORM
+.char \[f+-] \[uFED1] \" ARABIC LETTER FEH ISOLATED FORM
+.char \[f+,] \[uFED2] \" ARABIC LETTER FEH INITIAL FORM
+.char \[f+;] \[uFED3] \" ARABIC LETTER FEH MEDIAL FORM
+.char \[f+.] \[uFED4] \" ARABIC LETTER FEH FINAL FORM
+.char \[q+-] \[uFED5] \" ARABIC LETTER QAF ISOLATED FORM
+.char \[q+,] \[uFED6] \" ARABIC LETTER QAF INITIAL FORM
+.char \[q+;] \[uFED7] \" ARABIC LETTER QAF MEDIAL FORM
+.char \[q+.] \[uFED8] \" ARABIC LETTER QAF FINAL FORM
+.char \[k+-] \[uFED9] \" ARABIC LETTER KAF ISOLATED FORM
+.char \[k+,] \[uFEDA] \" ARABIC LETTER KAF INITIAL FORM
+.char \[k+;] \[uFEDB] \" ARABIC LETTER KAF MEDIAL FORM
+.char \[k+.] \[uFEDC] \" ARABIC LETTER KAF FINAL FORM
+.char \[l+-] \[uFEDD] \" ARABIC LETTER LAM ISOLATED FORM
+.char \[l+,] \[uFEDE] \" ARABIC LETTER LAM INITIAL FORM
+.char \[l+;] \[uFEDF] \" ARABIC LETTER LAM MEDIAL FORM
+.char \[l+.] \[uFEE0] \" ARABIC LETTER LAM FINAL FORM
+.char \[m+-] \[uFEE1] \" ARABIC LETTER MEEM ISOLATED FORM
+.char \[m+,] \[uFEE2] \" ARABIC LETTER MEEM INITIAL FORM
+.char \[m+;] \[uFEE3] \" ARABIC LETTER MEEM MEDIAL FORM
+.char \[m+.] \[uFEE4] \" ARABIC LETTER MEEM FINAL FORM
+.char \[n+-] \[uFEE5] \" ARABIC LETTER NOON ISOLATED FORM
+.char \[n+,] \[uFEE6] \" ARABIC LETTER NOON INITIAL FORM
+.char \[n+;] \[uFEE7] \" ARABIC LETTER NOON MEDIAL FORM
+.char \[n+.] \[uFEE8] \" ARABIC LETTER NOON FINAL FORM
+.char \[h+-] \[uFEE9] \" ARABIC LETTER HEH ISOLATED FORM
+.char \[h+,] \[uFEEA] \" ARABIC LETTER HEH INITIAL FORM
+.char \[h+;] \[uFEEB] \" ARABIC LETTER HEH MEDIAL FORM
+.char \[h+.] \[uFEEC] \" ARABIC LETTER HEH FINAL FORM
+.char \[w+-] \[uFEED] \" ARABIC LETTER WAW ISOLATED FORM
+.char \[w+.] \[uFEEE] \" ARABIC LETTER WAW FINAL FORM
+.char \[j+-] \[uFEEF] \" ARABIC LETTER ALEF MAKSURA ISOLATED FORM
+.char \[j+.] \[uFEF0] \" ARABIC LETTER ALEF MAKSURA FINAL FORM
+.char \[y+-] \[uFEF1] \" ARABIC LETTER YEH ISOLATED FORM
+.char \[y+,] \[uFEF2] \" ARABIC LETTER YEH INITIAL FORM
+.char \[y+;] \[uFEF3] \" ARABIC LETTER YEH MEDIAL FORM
+.char \[y+.] \[uFEF4] \" ARABIC LETTER YEH FINAL FORM
+.char \[lM-] \[uFEF5] \" ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
+.char \[lM.] \[uFEF6] \" ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
+.char \[lH-] \[uFEF7] \" ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
+.char \[lH.] \[uFEF8] \" ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
+.char \[lh-] \[uFEF9] \" ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
+.char \[lh.] \[uFEFA] \" ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM
+.char \[la-] \[uFEFB] \" ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+.char \[la.] \[uFEFC] \" ARABIC LIGATURE LAM WITH ALEF FINAL FORM
diff --git a/contrib/rfc1345/tests/rfc1345-smoke-test.sh b/contrib/rfc1345/tests/rfc1345-smoke-test.sh
new file mode 100755
index 0000000..5fd2fb7
--- /dev/null
+++ b/contrib/rfc1345/tests/rfc1345-smoke-test.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Smoke-test rfc1345.tmac.
+
+DOC='\[,.]'
+
+OUTPUT=$(echo "$DOC" | "$groff" -T utf8 -m rfc1345 -P-cbou -Z)
+
+echo "$OUTPUT" | grep -Fqx 'Cu2026'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/contrib/sboxes/ChangeLog b/contrib/sboxes/ChangeLog
new file mode 100644
index 0000000..4d56984
--- /dev/null
+++ b/contrib/sboxes/ChangeLog
@@ -0,0 +1,202 @@
+2023-02-18 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * sboxes.am (uninstall_sboxes): Clean more fastidiously; try to
+ remove the configured `sboxespdfdocdir` in the event it is
+ empty, but do not fail if it isn't. (It can be a directory
+ shared with other groff components; we don't know in what order
+ the uninstall targets will serialize, but the last one run
+ should succeed.)
+
+2022-10-23 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * sboxes.tmac: Escape newline after opening conditional block.
+
+2022-05-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * sboxes.am: Rename `BUILD_PDFDOC` to `USE_GROPDF`.
+
+2022-05-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * sboxes.am ($(sboxes_builddir)/msboxes.pdf): Depend on new name
+ for devpdf stamp file.
+
+2022-04-03 Ingo Schwarze <schwarze@openbsd.org>
+
+ * sboxes.am: msboxes.ms is documentation, not merely an example.
+ Consequently, install msboxes.ms unconditionally and msboxes.pdf
+ if BUILD_PDFDOC is enabled, both to the documentation directory
+ rather than to the examples directory.
+
+2022-04-02 Ingo Schwarze <schwarze@openbsd.org>
+
+ * sboxes.am: Stop installing msboxes.ms.in;
+ installing msboxes.ms and msboxes.pdf is enough.
+
+2022-03-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * sboxes.am: Track rename of `DOC_GROFF_ONLY` to `DOC_GROFF`.
+
+2022-03-29 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * msboxes.ms.in: Tweak sboxes documentation to imply ms
+ dependency.
+
+ Fixes <https://savannah.gnu.org/bugs/?62062>.
+
+2022-03-22 Ingo Schwarze <schwarze@openbsd.org>
+
+ * sboxes.am: fix non-portable syntax in the msboxes.pdf target
+ by using DOC_GROFF_ONLY rather than DOC_GROFF in order to not
+ use $< outside a suffix rule; DOC_GROFF functionality is not
+ needed here in the first place.
+
+2022-03-22 Ingo Schwarze <schwarze@openbsd.org>
+
+ * sboxes.am: make the build of msboxes.{ms,pdf} work with BSD
+ make by using $(sboxes_builddir) consistently to prevent
+ variations in target names.
+
+2022-02-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * sboxes.tmac: Prefix early diagnostics with package file name
+ literally. (We don't yet know if we can use \*[] string
+ interpolation.) It is better to violate DRY a little here than
+ to obscure from the user what is emitting the diagnostic.
+
+2022-02-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * sboxes.tmac: Skip macro package instead of aborting if there
+ are prerequisite problems. This is an auxiliary package; it is
+ not necessarily fatal to the user's purposes if it doesn't load.
+
+2022-02-06 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * notquine.sed: Convert tilde to special character when inlining
+ document source (\~ is used).
+
+2021-11-01 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * msboxes.ms.in: Retitle document to "Using PDF Boxes with
+ _groff and_ the ms macros" (emphasis added) to make it clearer
+ that this package does not _require_ ms.
+
+2021-10-27 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * notquine.sed: Improve portability and tighten logic. Thanks
+ to Axel Kielhorn for the report and Andreas Kusalananda Kähäri
+ for the suggested improvements.
+
+2021-10-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * sboxes.tmac: Rename strings and macro I introduced so that
+ they fit Deri's selection within the name space (prefix "bx").
+ Rename existing macros to use the groff ms(7) naming convention.
+ None of the macros in this "module" seem meant to be visible to
+ other modules, so suffix the module name with '*' instead of
+ '@'. Drop unused 7th argument in a `pdfbackground` call.
+
+2021-10-24 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * sboxes.tmac: Define GSBOX register as 0, then redefine it as 1
+ only if the output device is `pdf`. (This way a document author
+ can easily and separately test the presence of the package and
+ whether the device-specific feature is likely to work.)
+ (pdfbackground): Only define (overriding `pdf.tmac`) if GSBOX is
+ false.
+ * msboxes.ms.in: Document this aspect of the package interface.
+
+2021-10-21 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * sboxes.am (SBOXES_FLAGS): Drop variable since we only expand
+ it in one place.
+ ($(sboxes_builddir)/msboxes.pdf): Be more consistent with the
+ rest of our build, particularly documentation generated in the
+ groff `doc` directory. Use `GROFF_V` instead of `AM_V_GEN` to
+ control output (since it is in fact groff producing the target).
+ Use `DOC_GROFF` to produce the document rather than
+ `test-groff`. Use the former `SBOXES_FLAGS` here.
+
+2021-10-20 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * sboxes.am ($(sboxes_builddir)/msboxes.ms,
+ $(sboxes_builddir)/msboxes.pdf): Be quieter by default; use
+ $(AM_V_at) and $(AM_V_GEN) more consistently with the rest of
+ the build.
+
+2021-10-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * sboxes.tmac: Rename macros to get out of user name space. Our
+ ms package documentation says that externally visible names will
+ consist only of uppercase letters and digits.
+ (BoxStart): Rename to BOXSTART.
+ (BoxStop): Rename to BOXSTOP.
+ * msboxes.ms.in: Document and use new names.
+
+2021-10-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * sboxes.tmac: Add more prerequisite checking. Check `GS`
+ register for groff ms macros specifically. Check installed
+ version of groff since the gropdf in earlier versions won't
+ implement the underlying feature. Add new string to introduce
+ diagnostic messages now that we have more than one (that we can
+ emit without limp-along AT&T compatibility mode).
+ (sboxes*error): Use new string in diagnostic message.
+
+2021-10-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * sboxes.tmac (sboxes*error): Add new macro to produce
+ diagnostic message in a standard format.
+ (BoxStart): Use it.
+
+2021-10-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ Make msboxes.ms quote its own source through a
+ self-interpolation process (with help from sed and the build
+ system), avoiding the need to manually keep the source document
+ and its quoted form in sync.
+
+ * msboxes.ms: Rename to...
+ * msboxes.ms.in: ...this.
+ * notquine.sed: New file; this sed script performs quotation of
+ roff syntax characters (and hyphens), inserts the quoted form of
+ the document's source into itself, and reproduces Deri's
+ Schrödinger's footnote trick.
+ * sboxes.am: Introduce new variables `sboxes_builddir` and
+ `sboxesnotquine` for convenience. Update value of
+ $(SBOXES_EXAMPLEFILES) to point to the new .in source file. Add
+ the generated ms document to $(SBOXES_PROCESSEDEXAMPLEFILES) and
+ $(MOSTLYCLEANFILES). Add the `notquine` sed script to the
+ distribution archive via $(EXTRA_DIST).
+ ($(sboxes_builddir)/msboxes.ms): New rule produces the ms
+ document from msboxes.ms.in, constructing it with sed.
+ ($(sboxes_builddir)/msboxes.pdf): Update rule to add dependency
+ on source document, use new `sboxes_builddir` variable, and look
+ for source document in the build tree instead of the source.
+
+2021-10-17 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * sboxes.am: Add this ChangeLog to `EXTRA_DIST`.
+
+2021-10-11 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * sboxes.am (MOSTLYCLEANFILES): Add
+ `$(SBOXES_PROCESSEDEXAMPLEFILES)`; allows `distcheck` target to
+ succeed.
+
+________________________________________________________________________
+
+##### License
+
+Copyright 2021 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+##### Editor settings
+Local Variables:
+fill-column: 72
+mode: change-log
+version-control: never
+End:
+vim:set autoindent textwidth=72:
diff --git a/contrib/sboxes/msboxes.ms.in b/contrib/sboxes/msboxes.ms.in
new file mode 100644
index 0000000..a1700df
--- /dev/null
+++ b/contrib/sboxes/msboxes.ms.in
@@ -0,0 +1,272 @@
+.\" groff -ms -msboxes -Tpdf
+.nr LL 17c
+.nr PO 2c
+.nr PS 11
+.nr VS 13
+.nr PI 3.5n
+.nr HM 2c
+.nr FM 2c
+.nr QI 7n
+.ss 12 0
+.ND March 2021
+.EH '%''March 2021'
+.EF ''''
+.OH 'Using PDF boxes with \f[I]groff\f[] and the \f[I]ms\f[] macros''%'
+.OF ''''
+.\" Define a quotation macro.
+.de Qq
+. nop \[lq]\\$1\[rq]\\$2
+..
+.\" Define a macro for code literals; use bold and disable hyphenation.
+.de Lt
+. ft B
+. nh
+. nop \&\\$1\c
+. hy \\n[HY]
+. ft
+. nop \&\\$2
+..
+.ds FAM H
+.TL
+Using PDF boxes with
+.BI groff
+and the
+.BI ms
+macros
+.AU
+Deri James
+.AI
+deri@chuzzlewit.myzen.co.uk
+.LP
+An extension in version 1.23.0 of
+.I gropdf ,
+the PDF output driver for the
+.I groff
+document formatting system,
+allows coloured rectangles to be placed beneath any output created by
+.I groff .
+The extension can be accessed via a device control escape sequence
+.Lt "\[rs]X\[aq]pdf: background" \~.\|.\|.\|\c
+.Lt \[aq]
+or a convenience macro
+.Lt pdfbackground
+supporting the same parameters.
+.QS
+.BOXSTART SHADED cornsilk OUTLINED brown INDENT 2n WEIGHT 1p
+\M[floralwhite]\c
+.pdfbackground pagefill
+\M[]\c
+.B
+\[rs]X\[aq]pdf: background
+.BI
+cmd left top right bottom weight\[aq]
+.br
+.Lt .pdfbackground
+.BI
+cmd left top right bottom weight
+.LP
+each produce a background rectangle on the page, where
+.IP \f[I]cmd 8n \" indent enough to fit "bottom" tag
+is the command, which can be any of
+.Qq page|fill|box
+in combination.
+Thus,
+.Qq pagefill
+would draw a rectangle which covers the whole current page size (in
+which case the rest of the parameters can be omitted because the box
+dimensions are taken from the current media size).
+.Qq boxfill ,
+on the other hand, requires the given dimensions to place the box.
+Including
+.Qq fill
+in the command will paint the rectangle with the current fill colour (as
+with
+.Lt \[rs]M[] )
+and including
+.Qq box
+will give the rectangle a border in the current stroke colour
+(as with
+.Lt \[rs]m[] ).
+.sp \n[PD]u
+.I cmd
+may also be
+.Qq off
+on its own, which will terminate drawing the current box.
+If you have specified a page colour with
+.Qq pagefill ,
+it is always the first box in the stack, and if you specify it again, it
+will replace the first entry.
+Be aware that the
+.Qq pagefill
+box renders the page opaque, so tools that
+.Qq watermark
+PDF pages are unlikely to be successful.
+To return the background to transparent, issue an
+.Qq off
+command with no other boxes open.
+.sp \n[PD]u
+Finally,
+.I cmd
+may be
+.Qq footnote
+followed by a new value for
+.I bottom ,
+which will be used for all open boxes on the current page.
+This is to allow room for footnote areas that grow while a page is
+processed (to accommodate multiple footnotes,
+for instance).\m[red]\**\m[]\" FOOTNOTE
+.FS
+If the value is negative, it is used as an offset from the bottom of the
+page.
+.FE
+.nr oldPD \n[PD]
+.nr PD 0
+.IP \f[I]left
+.IP \f[I]top
+.IP \f[I]right
+.IP \f[I]bottom
+.nr PD \n[oldPD]
+are the coordinates of the box.
+The
+.I top
+and
+.I bottom
+coordinates are the minimum and maximum for the box, since the actual
+start of the box is
+.I groff 's
+drawing position when you issue the command, and the bottom of the box
+is the point where you turn the box
+.Qq off .
+The top and bottom coordinates are used only if the box drawing extends
+onto the next page; ordinarily, they would be set to the header and
+footer margins.
+.IP \f[I]weight
+provides the line width for the border if
+.Qq box
+is included in the command.
+.BOXSTOP
+.QE
+For an even more convenient interface, include
+.Lt \-msboxes
+on the
+.I groff
+command line; the
+.I sboxes
+package defines the macros
+.Lt BOXSTART
+and
+.Lt BOXSTOP .
+.QS
+.BOXSTART SHADED cornsilk OUTLINED brown INDENT 2n WEIGHT 1p
+.BOXSTART SHADED cornsilk3 INDENT 2p
+.Lt .BOXSTART
+.Lt SHADED
+.I colour
+.Lt OUTLINED
+.I colour
+.Lt INDENT
+.I size
+.Lt WEIGHT
+.I size
+.BOXSTOP
+.LP
+begins a box,
+where the argument after
+.Lt SHADED
+gives the fill colour and that after
+.Lt OUTLINED
+the border colour.
+Omit the former to get a borderless filled box and the latter for a
+border with no fill.
+The specified
+.Lt WEIGHT
+is used if the box is
+.Lt OUTLINED .
+.LP
+.Lt INDENT
+precedes a value which leaves a gap between the border and the contents
+inside the box.
+.LP
+Each
+.I colour
+must be a defined
+.I groff
+colour name,
+and each
+.I size
+a valid
+.I groff
+numeric expression.
+The keyword/value pairs can be specified in any order.
+.BOXSTOP
+.QE
+Boxes can be stacked, so you can start a box within another box; usually
+the later boxes would be smaller than the containing box, but this is
+not enforced.
+When using
+.Lt BOXSTART ,
+the left position is the current indent minus the
+.Lt INDENT
+in the command,
+and the right position is the left position (calculated above) plus the
+current line length and twice the indent.
+The synopsis of
+.Lt BOXSTART
+above itself uses a
+.Lt BOXSTART
+call without borders and with a
+.Lt 2p
+(two point) indent.
+.QS
+.BOXSTART SHADED cornsilk OUTLINED brown INDENT 2n WEIGHT 1p
+.BOXSTART SHADED cornsilk3 INDENT 2p
+.Lt .BOXSTOP
+.BOXSTOP
+.LP
+takes no parameters.
+It closes the most recently started box at the current vertical position
+after adding its
+.Lt INDENT
+spacing.
+.BOXSTOP
+.QE
+Your
+.I groff
+documents can conditionally exercise the
+.I sboxes
+macros.
+The register
+.Lt GSBOX
+is defined if the package is loaded, and interpolates a true value if
+the
+.Lt pdf
+output device is in use.
+.LP
+.I sboxes
+furthermore hooks into the
+.I "groff ms"
+package to receive notifications when footnotes are growing, so that it
+can close boxes on a page before footnotes are printed.
+When that condition obtains,
+.I sboxes
+will close open boxes two points\**
+.FS
+This amount probably will not match the box's
+.Lt INDENT .
+.FE
+above the footnote separator and re-open them on the next page.
+.LP
+This document was produced using the following code.
+.ds FAM C
+.nr PS 11
+.nr VS 13
+.LP
+.BOXSTART SHADED white OUTLINED brown INDENT 2n WEIGHT 1p
+.nf
+\# REPLACEME
+.BOXSTOP
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/contrib/sboxes/notquine.sed b/contrib/sboxes/notquine.sed
new file mode 100644
index 0000000..1a110ab
--- /dev/null
+++ b/contrib/sboxes/notquine.sed
@@ -0,0 +1,18 @@
+s/.*\\##.*/&\
+&/
+s/\\##//
+t
+s/\\" FOOTNOTE/@FOOTNOTE@/
+s/\\/\\[rs]/g
+s/-/\\&/g
+s/'/\\[aq]/g
+s/~/\\[ti]/g
+s/^\./\\\&&/
+/@FOOTNOTE@/a\
+.FS\
+This is a long footnote occupying multiple output lines.\
+Its only purpose is to verify that the bottom of the box on this page\
+has been adjusted upwards to accommodate it.\
+.FE
+s/@FOOTNOTE@/\\m[red]\\**\\m[]/
+s/REPLACEME/(replaced by source of this document)/
diff --git a/contrib/sboxes/sboxes.am b/contrib/sboxes/sboxes.am
new file mode 100644
index 0000000..7786337
--- /dev/null
+++ b/contrib/sboxes/sboxes.am
@@ -0,0 +1,74 @@
+# Copyright (C) 2021 Free Software Foundation, Inc.
+# Written by Bertrand Garrigues <bertrand.garrigues@laposte.net>
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+sboxes_srcdir = $(top_srcdir)/contrib/sboxes
+sboxes_builddir = $(top_builddir)/contrib/sboxes
+sboxesnotquine = $(sboxes_srcdir)/notquine.sed
+
+sboxestmacdir = $(tmacdir)
+dist_sboxestmac_DATA = contrib/sboxes/sboxes.tmac
+
+EXTRA_DIST += \
+ contrib/sboxes/ChangeLog \
+ contrib/sboxes/msboxes.ms.in \
+ contrib/sboxes/notquine.sed
+
+SBOXES_EXAMPLEFILES = $(sboxes_srcdir)/msboxes.ms.in
+
+sboxesotherdocdir = $(docdir)
+nodist_sboxesotherdoc_DATA = $(sboxes_builddir)/msboxes.ms
+
+if USE_GROPDF
+sboxespdfdocdir = $(pdfdocdir)
+nodist_sboxespdfdoc_DATA = $(sboxes_builddir)/msboxes.pdf
+endif
+
+MOSTLYCLEANFILES += msboxes.ms \
+ $(nodist_sboxesotherdoc_DATA) \
+ $(nodist_sboxespdfdoc_DATA)
+
+# The ordering of the sed -e expressions is important.
+$(sboxes_builddir)/msboxes.ms: $(SBOXES_EXAMPLEFILES) $(sboxesnotquine)
+ $(AM_V_at)mkdir -p $(sboxes_builddir)
+ $(AM_V_at)$(SED) -n -e '1,/REPLACEME/p' \
+ $(SBOXES_EXAMPLEFILES) > $@.tmp
+ $(AM_V_at)$(SED) -f $(sboxesnotquine) \
+ $(SBOXES_EXAMPLEFILES) >> $@.tmp
+ $(AM_V_at)$(SED) -n -e '/REPLACEME/,$$p' \
+ $(SBOXES_EXAMPLEFILES) >> $@.tmp
+ $(AM_V_GEN)mv $@.tmp $@
+
+$(sboxes_builddir)/msboxes.pdf: $(sboxes_builddir)/msboxes.ms \
+ $(dist_sboxestmac_DATA) groff troff gropdf font/devpdf/stamp
+ $(GROFF_V)$(DOC_GROFF) -M$(sboxes_srcdir) -ms -msboxes -Tpdf \
+ $(sboxes_builddir)/msboxes.ms > $@
+
+uninstall_groffdirs: uninstall_sboxes
+uninstall_sboxes:
+ if test -d $(DESTDIR)$(exampledir)/sboxes; then \
+ rmdir $(DESTDIR)$(exampledir)/sboxes; \
+ fi
+if USE_GROPDF
+ -rmdir $(DESTDIR)$(sboxespdfdocdir)
+endif
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/contrib/sboxes/sboxes.tmac b/contrib/sboxes/sboxes.tmac
new file mode 100644
index 0000000..63c9263
--- /dev/null
+++ b/contrib/sboxes/sboxes.tmac
@@ -0,0 +1,147 @@
+.ig
+
+sboxes.tmac
+
+Copyright (C) 2021 Free Software Foundation, Inc.
+ Written by Deri James (deri@chuzzlewit.myzen.co.uk)
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+..
+.if !\n(.g \{\
+. tm sboxes.tmac: macros require groff extensions; not loading
+. nx
+.\}
+.
+.if \n(.C \{\
+. tm sboxes.tmac: macros do not work in compatibility mode; not loading
+. nx
+.\}
+.
+.\" Define a string for use in diagnostic messages.
+.ds bx*name sboxes.tmac\"
+.
+.if !r GS \
+. ab \*[bx*name]: ms macros must be loaded first; aborting
+.
+.if (\n[.x]\n[.y] < 123) \{\
+. ds bx*msg \*[bx*name]: groff 1.23 or later is required,\"
+. as bx*msg " but found groff \n[.x].\n[.y]; not loading\"
+. tm \*[bx*msg]
+. nx
+.\}
+.
+.\" See if already loaded.
+.if r GSBOX .nx
+.
+.\" GSBOX is defined if the package is loaded, and true if it will work.
+.nr GSBOX 0
+.if '\*[.T]'pdf' \
+. nr GSBOX 1
+.
+.nr bx*stack 0
+.
+.de bx*error
+. tm \*[bx*name]:\\n[.F]:\\n[.c]: error: \\$*
+..
+.
+.\" Define dummy macro if we're not formatting for the pdf device.
+.if !\n[GSBOX] \{\
+. de pdfbackground
+. .
+.\}
+.
+.\" Link into ms macros to trap footnote growth
+.am fn@print-sep
+. nr bx*pb \\n[nl]u-2p
+. nop \!x X pdf: background footnote \\n[bx*pb]z
+. rr bx*pb
+..
+.\" Has PD been actioned?
+.am par*start
+. nr bx*PD \\n[PD]
+..
+.
+.de BOXSTART
+. fl
+. nr bx*stack \\n[bx*stack]+1u
+. nr bx*shad 0
+. nr bx*outl 0
+. nr bx*ind 1P
+. ds bx*wt 0
+. ds bx*type "\"
+. while \\n[.$] \{\
+. ie 'SHADED'\\$1' \{\
+. nop \\M[\\$2]\c
+. nr bx*shad 1
+. as bx*type "fill\"
+. shift 2
+. \}
+. el \{\
+. ie 'OUTLINED'\\$1' \{\
+. nop \\m[\\$2]\c
+. nr bx*outl 1
+. as bx*type "box\"
+. shift 2
+. \}
+. el \{\
+. ie 'WEIGHT'\\$1' \{\
+. ds bx*wt \\$2
+. shift 2
+. \}
+. el \{\
+. ie 'INDENT'\\$1' \{\
+. nr bx*ind \\$2
+. shift 2
+. \}
+. el \{\
+. bx*error ignoring unrecognized BOXSTART parameter '\\$1'
+. shift
+. \}
+. \}
+. \}
+. \}
+. \}
+.
+. if '\\*[bx*type]'' .ds bx*type "fill"
+. nr bx*l \\n[\\n[.ev]:li]s+\\n[.o]s-\\n[bx*ind]u
+. nr bx*r \\n[bx*l]u+\\n[.l]-\\n[\\n[.ev]:li]+(\\n[bx*ind]u*2u)
+. nr bx*gap \\n[.v]-\\n[.ps]+\\*[bx*wt]
+. nr bx*bot \\n[.p]u-\\n[FM]u+\\n[bx*ind]u+\\n[.ps]u
+. nr bx*top \\n[HM]-\\n[bx*ind]u+\\n[bx*gap]u
+. ne \\n[bx*ind]u+2v+\\*[bx*wt]
+. sp -(2v-(\\n[bx*PD]u*2u))u
+. pdfbackground \\*[bx*type] \\n[bx*l]z \\n[bx*top]z \
+ \\n[bx*r]z \\n[bx*bot]z \
+ \\*[bx*wt]
+. sp (\\n[bx*ind]u-1v)u
+. if (\\n[bx*shad]=1) .nop \\M[]\c
+. if (\\n[bx*outl]=1) .nop \\m[]\c
+. ds bx*ind\\n[bx*stack] \\n[bx*ind]
+. rr bx*shad bx*outl bx*ind bx*bot bx*top bx*l bx*r
+. rm wt type
+. sp -(\\n[bx*gap]u)
+. nr bx*PD 0
+..
+.de BOXSTOP
+. sp \\*[bx*ind\\n[bx*stack]]u-\\n[.psr]u
+. pdfbackground off
+. nr bx*stack \\n[bx*stack]-1u
+..
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set expandtab filetype=groff textwidth=72:
diff --git a/doc/automake.mom b/doc/automake.mom
new file mode 100644
index 0000000..5609e19
--- /dev/null
+++ b/doc/automake.mom
@@ -0,0 +1,789 @@
+.\" -*- mode: text; coding: utf-8; -*-
+.\"
+.\" Copyright ©2014 - 2022 Free Software Foundation
+.\" 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
+.\"
+.\" Permission is hereby granted, free of charge, to any person
+.\" obtaining a copy of this software and associated documentation
+.\" files (the "Software"), to deal in the Software without restriction,
+.\" including, without limitation, the rights to use, copy, modify,
+.\" merge, publish, distribute, sublicense, and sell copies of
+.\" the Software, and to permit persons to whom the Software is
+.\" furnished to do so, subject to the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be
+.\" included in all copies, or substantial portions, of the Software;
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS," WITHOUT WARRANTY OF ANY KIND,
+.\" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+.\" OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
+.\" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+.\" HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY,
+.\" WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING
+.\" FROM, OUT OF, OR IN CONNECTION WITH, THE SOFTWARE, OR THE USE OF,
+.\" OR OTHER DEALINGS IN, THE SOFTWARE.
+.\"
+.\" Formatted with the mom macros
+.\" .RW (reduce) and .EW (expand) control track kerning
+.\" .WS controls word spacing
+.\" Hanging punctuation and hyphens are inserted manually
+.\"
+.TITLE "Using Automake in the Groff project"
+.AUTHOR "Bertrand Garrigues"
+.COPYRIGHT "2014, 2017 Free Software Foundation"
+.COVER TITLE AUTHOR DOCTYPE COPYRIGHT
+.
+.PAPER LETTER
+.PRINTSTYLE TYPESET
+.
+.HEADING_STYLE 1 NUMBER
+.HEADING_STYLE 2 NUMBER
+.HEADING_STYLE 3 NUMBER
+.HEADING_STYLE 4 NUMBER
+.
+.QUOTE_INDENT 2m
+.CODE_FONT CB
+.
+\# Table of contents
+.TOC_PADDING 2
+.SPACE_TOC_ITEMS
+.AUTO_RELOCATE_TOC
+.TOC_ENTRY_STYLE 2 FONT I
+.TOC_LEAD 14
+.
+.NO_SHIM \" Flex-spaced
+.
+.START
+.
+.PP
+This is a quick overview of how to use `automake' in the groff
+project, and is intended to help the developers and contributors
+find their way when they have to make changes to the sources files
+or to the data that are installed. If you need more details on
+`automake', here are some reading suggestions:
+.
+.LEFT
+.SP 3p
+.
+.LIST
+.SHIFT_LIST 1m
+.ITEM
+The Automake Manual:
+\*[FWD 1m]\c
+.PDF_WWW_LINK https://www.gnu.org/software/automake/manual/automake.html
+.SP 3p
+.ITEM
+A book by John Calcote, with good practical examples:
+\*[FWD 1m]\c
+.PDF_WWW_LINK http://fsmsh.com/2753
+.SP 3p
+.ITEM
+This site, by Diego Petteno, with good practical examples too:
+\*[FWD 1m]\c
+.PDF_WWW_LINK https://autotools.io/index.html
+.LIST OFF
+.
+.JUSTIFY
+.HY DEFAULT
+.
+.HEADING 1 "Overview, the initial build"
+.
+.HEADING 2 "First build"
+.
+.PP
+Groff integrates the `gnulib' and uses its `bootstrap' script. When
+compiling from the git repository, you should first invoke this
+script:
+.QUOTE
+.CODE
+$ ./bootstrap
+.CODE OFF
+.QUOTE OFF
+This will:
+.
+.QUAD LEFT
+.HY OFF
+.
+.LIST
+.SHIFT_LIST 1m
+.ITEM
+.SP 3p
+Clone the gnulib repository as a git submodule in `gnulib',
+add the needed gnulib sources files in `lib',
+add the needed gnulib m4 macros in `gnulib_m4'.
+.SP 3p
+.ITEM
+Invoke autoreconf that will call all the `GNU autotools' (`aclocal',
+`autoheader', `autoconf', `automake') in the right order for
+creating the following files:
+.LIST DASH
+.SHIFT_LIST .5m
+.SP 3p
+.ITEM
+INSTALL (a symlink to gnulib's INSTALL file)
+.ITEM
+Makefile.in
+.ITEM
+aclocal.m4
+.ITEM
+autom4te.cache/
+.ITEM
+build-aux/ (that contains all the helper scripts)
+.ITEM
+configure
+.ITEM
+src/include/config.hin
+.LIST BACK
+.LIST OFF
+.
+.SP 3p
+.JUSTIFY
+.HY DEFAULT
+.
+.WS +2
+.EW .5
+The file aclocal.m4 is generated and the groff m4 macros are
+included via the acinclude.m4 file.
+.WS DEFAULT
+.EW 0
+.
+.PP
+At this point you can invoke the `configure' script and call `make'
+to build the groff project. You can do it in the source tree:
+.QUOTE
+.CODE
+$ ./configure
+$ make
+.CODE OFF
+.QUOTE OFF
+You can also build groff in an out-of-source build tree, which is
+cleaner:
+.QUOTE
+.CODE
+$ mkdir build
+$ cd build
+$ ../configure
+$ make
+.CODE OFF
+.QUOTE OFF
+Parallel build is also supported: `make' can be invoked
+with the -j option, which will greatly speed up the build.
+.
+.HEADING 2 "Automake in the autotools process"
+.
+.PP
+Automake's main job is to generate a Makefile.in file (this file is
+maintained manually on projects using only autoconf). The main file
+processed by `automake' is the Makefile.am file, which eventually
+generates a Makefile. The (simplified) process is:
+.
+.SP 3p
+.QUAD LEFT
+.HY OFF
+.
+.LIST
+.SHIFT_LIST 1m
+.ITEM
+`aclocal' generates the `aclocal.m4' file from `configure.ac' and
+the user-defined macros in `acinclude.m4'.
+.ITEM
+`autoheader' generates config.h.in.
+.ITEM
+`autoconf' generates the `configure' script from `aclocal.m4' and `configure.ac'
+.ITEM
+`automake' generates Makefile.in from Makefile.am and the
+`configure.ac' file. It also generates some helper scripts, on the
+groff project they are located in build-aux.
+.ITEM
+`configure' generates `config.status'
+.ITEM
+`config.status' generates the Makefile and config.h.
+.LIST OFF
+.
+.SP 3p
+.JUSTIFY
+.HY DEFAULT
+.
+.WS -2
+.RW .16
+Finally, `autoreconf' is the program that can be used to call these
+various tools in the correct order.
+.RW 0
+.WS DEFAULT
+.
+.PP
+Automake defines a set of special variables that are used to
+generate various build rules in the final Makefile. Note however
+that if Automake's predefined rules are not enough, you still have
+the possibility of adding handwritten standard `make' rules in a
+Makefile.am; these rules will be copied verbatim in the Makefile.in
+and then in the final Makefile.
+.
+.HEADING 2 "Modification of autotools files"
+.
+.PP
+Previously, when groff used `autoconf' only and not `automake',
+you had to invoke manually the autotools, depending on what you
+modified. For example, to change the file `aclocal.m4', you had
+to run the shell command `aclocal -I m4'; to recreate the files
+`configure' and `Makefile', you had to use the command 'autoreconf
+- I m4'.
+.PP
+Now, as groff uses `automake', you don't need to run `autoreconf'.
+If you make some changes in Makefile.am or configure.ac, all the
+files that need to be updated will be regenerated when you execute
+`make'.
+.
+.HEADING 1 "Building a program"
+.
+.HEADING 2 "A program and its source files"
+.
+.PP
+Generally speaking, when using `automake' you will have to write a
+Makefile.am file and use the variable \*[CODE]bin_PROGRAMS\*[CODE OFF]
+to declare a program that should be built, and then list the
+sources of this program in a variable that starts with the name of
+your program and ends with \*[CODE]_SOURCES\*[CODE OFF]\&. In the
+groff project we have only 1 top-level Makefile.am that includes
+several \&.am files.
+.PP
+Take for example the build of grolbp, in src/devices/grolbp/grolbp.am.
+The file starts with:
+.QUOTE ADJUST -4p
+.CODE
+bin_PROGRAMS += grolbp
+.CODE OFF
+.QUOTE OFF
+This says that a program named `grolbp' is added to the list of the
+programs that should be built. The variable
+\*[CODE]bin_PROGRAMS\*[CODE OFF] is initialized to an empty string in
+the top-level Makefile.am, which includes grolbp.am. (We will see later
+why we don't write directly
+\*[CODE]bin_PROGRAMS\~=\~grolbp\*[CODE OFF] in a Makefile.am in the
+grolbp directory.)
+.PP
+Then, we list the sources of grolbp like this:
+.QUOTE ADJUST -4p
+.IL 1m
+.HI 1m
+.CODE
+grolbp_SOURCES = \\
+src/devices/grolbp/lbp.cpp \\
+src/devices/grolbp/lbp.h \\
+src/devices/grolbp/charset.h
+.CODE OFF
+.QUOTE OFF
+.ILQ
+As you added `grolbp' to \*[CODE]bin_PROGRAMS\*[CODE OFF],
+you need to define the sources of grolbp in the variable
+\*[CODE]grolbp_SOURCES\*[CODE OFF]\&. If you write in another file
+\*[CODE]bin_PROGRAMS += foo\*[CODE OFF] you will list the sources
+of `foo' in \*[CODE]foo_SOURCES\*[CODE OFF]\&.
+.PP
+With these two statements, the resulting generated Makefile
+will contain everything that is needed to build, clean,
+install and uninstall the `grolbp' binary when invoking the
+adequate `make' command. Also, the source files listed in
+\*[CODE]grolbp_SOURCES\*[CODE OFF] will automatically be included in
+the distribution tarball. That is why the headers are also listed
+in \*[CODE]grolbp_SOURCES\*[CODE OFF]: it is not necessary to add
+them in order to correctly build `grolbp', but this way the headers
+will be distributed.
+.
+.SP 3p
+.QUAD LEFT
+.HY OFF
+.
+.LIST
+.SHIFT_LIST 1m
+.ITEM
+The path to the files are relative to the top-level directory.
+.ITEM
+The binaries are generated in the top-level build directory.
+.ITEM
+The \&.o files are generated in the directory where the source files
+are located, or, in the case of an out-of-source build tree, in a
+directory that is the replication of the source tree directory.
+For example if you built groff in a `build' directory, lbp.o
+(object file from src/devices/grolbp/lbp.cpp) will be located in
+build/src/devices/grolbp/lbp.o.
+.LIST OFF
+.
+.SP 3p
+.JUSTIFY
+.HY DEFAULT
+.
+We will also see later the reasons; this is due to the non-recursive
+make design.
+.
+.HEADING 2 "Linking against a library"
+.
+.PP
+To list which libraries grolbp needs to link against, we just write:
+.QUOTE
+.IL
+.HI
+.CODE
+grolbp_LDADD = $(LIBM) \\
+libdriver.a \\
+libgroff.a \\
+lib/libgnu.a
+.CODE OFF
+.QUOTE OFF
+.ILQ
+Again, we use the variable \*[CODE]grolbp_LDADD\*[CODE OFF] because
+we added a program named `grolbp'. This will also automatically
+set build dependencies between `grolbp' and the libraries it needs:
+`libdriver.a' and `libgroff.a', that are convenience libraries built
+within the groff project, will be compiled before grolbp.
+.
+.HEADING 2 "Preprocessor flags"
+.
+.PP
+Preprocessor flags that are common to all the binaries are listed
+in the variable \*[CODE]AM_CPPFLAGS\*[CODE OFF] in the top-level
+Makefile.am. If a `foo' binary needs specific preprocessor
+flags, use \*[CODE]foo_CPPFLAGS\*[CODE OFF], for example, in
+src/devices/xditview/xditview.am, extra flags are needed to build
+gxditview and are added like this:
+.QUOTE
+.IL
+.HI
+.CODE
+gxditview_CPPFLAGS = $(AM_CPPFLAGS) $(X_CFLAGS) -Dlint \\
+-I$(top_builddir)/src/devices/xditview
+.CODE OFF
+.QUOTE OFF
+.ILQ
+.PP
+The use of specific CPPFLAGS changes the name of the generated objects:
+the \&.o object files are prefixed with the name of the program.
+For example, the \&.o file corresponding to
+src/devices/xditview/device.c will be
+src/devices/xditview/gxditview-device.o.
+.
+.HEADING 2 "Cleaning"
+.
+.PP
+You don't need to write rules to clean the programs listed in
+\*[CODE]bin_PROGRAMS\*[CODE OFF], `automake' will write them for
+you. However, some programs might have generated sources that
+should be cleaned. In this case, you have mainly two special
+variables to list extra files that should be cleaned:
+.
+.SP 3p
+.QUAD LEFT
+.HY OFF
+.
+.LIST
+.SHIFT_LIST 1m
+.ITEM
+\*[CODE]MOSTLYCLEANFILES\*[CODE OFF] for files that should be
+cleaned by `make mostlyclean'
+.ITEM
+\*[CODE]CLEANFILES\*[CODE OFF ] for files that should be cleaned by
+`make clean'
+.LIST OFF
+.
+.JUSTIFY
+.HY DEFAULT
+.SP 3p
+.
+There is also the possibility of writing custom rules. We will see
+that later.
+.
+.HEADING 2 "Dependencies"
+.
+.PP
+We have already seen that when linking against a convenience
+library, the dependencies are already created by `automake'.
+However, some dependencies still need to be manually added, for
+example when a source file includes a generated header. In this
+case, the easiest way is to add a plain-make dependency. For
+example, src/roff/groff/groff.cpp includes defs.h, which is a
+generated header. We just add in src/roff/groff/groff.am:
+.QUOTE
+.CODE
+src/roff/groff/groff.$(OBJEXT): defs.h
+.CODE OFF
+.QUOTE OFF
+.
+.HEADING 2 "Scripts"
+.
+.PP
+Apart from \*[CODE]bin_PROGRAMS\*[CODE OFF], there is another
+similar special variable for scripts: \*[CODE]bin_SCRIPTS\*[CODE OFF]\&.
+The scripts listed in this variable will automatically be
+built (of course you have to provide your custom rule to build the
+script), installed and uninstalled when invoking `make', `make
+install' and `make uninstall'. The main difference is that unlike
+the programs listed in \*[CODE]bin_PROGRAMS\*[CODE OFF], the scripts
+will not be cleaned by default. They are not distributed by default
+either. In the groff project, \*[CODE]bin_SCRIPTS\*[CODE OFF] are
+cleaned because they are added to \*[CODE]MOSTLYCLEANFILES\*[CODE OFF]
+in the top-level Makefile.am.
+.PP
+A simple example are the gropdf and pdfmom scripts in
+src/devices/gropdf/gropdf.am:
+.CODE_SIZE 84
+.QUOTE_INDENT 1
+.QUOTE
+.CODE
+bin_SCRIPTS += gropdf pdfmom
+ [...]
+gropdf: $(gropdf_dir)/gropdf.pl $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)$(RM) $@ \\
+ sed -f $(SH_DEPS_SED_SCRIPT) \\
+ -e "s|[@]VERSION[@]|$(VERSION)|" \\
+ -e "s|[@]PERL[@]|$(PERL)|" \\
+ -e "s|[@]GROFF_FONT_DIR[@]|$(fontpath)|" \\
+ -e "s|[@]RT_SEP[@]|$(RT_SEP)|" $(gropdf_dir)/gropdf.pl \\
+ >$@ \
+ && chmod +x $@
+
+pdfmom: $(gropdf_dir)/pdfmom.pl $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)$(RM) $@ \\
+ sed -f $(SH_DEPS_SED_SCRIPT) \\
+ -e "s|[@]VERSION[@]|$(VERSION)|" \\
+ -e "s|[@]RT_SEP[@]|$(RT_SEP)|" \\
+ -e "s|[@]PERL[@]|$(PERL)|" $(gropdf_dir)/pdfmom.pl \\
+ >$@
+ && chmod +x $@
+.QUOTE OFF
+.QUOTE_INDENT 2m
+.CODE_SIZE 100
+In this example, the `@' symbol is protected by square brackets to
+prevent the substitution of the variable by `automake'.
+.
+.HEADING 1 "Non-recursive make schema"
+.
+.PP
+There are two possibilities for organizing the Makefile.am of a
+large project, using a recursive or a non-recursive `make'.
+.
+.HEADING 2 "1st possibility: make recursion"
+.
+.PP
+A top level Makefile.am includes another Makefile.am, using the
+\*[CODE]SUBDIRS\*[CODE OFF] directive, and the Makefile.am of each
+sub-directory lists the programs that should be built. If we had
+chosen this type of organization, we would have a Makefile.am in
+src/devices/grolbp and in each directory that contain sources to
+build a program (tbl, eqn, troff, and so on). We would write in the
+top-level Makefile.am:
+.QUOTE
+.IL
+.HI
+.CODE
+SUBDIRS = src/devices/grolbp \\
+\&... (and all the dir that build a program or a script)
+.CODE OFF
+.QUOTE OFF
+and in src/devices/grolbp, we would have a file Makefile.am that
+contains:
+.QUOTE
+.CODE
+bin_PROGRAMS = grolbp
+grolbp_SOURCES = lbp.cpp lbp.h charset.h
+.CODE OFF
+.QUOTE OFF
+.PP
+Only `grolbp' is affected to the variable \*[CODE]bin_PROGRAMS\*[CODE OFF]\&.
+It would be the same in, say, src/roff/troff: you would have a Makefile.am
+with \*[CODE]bin_PROGRAMS = troff\*[CODE OFF]\&. We would have
+one generated Makefile per Makefile.am file: in the build tree
+you will have the top-level Makefile, grolbp's Makefile in
+src/devices/grolbp, troff's Makefile in src/roff/troff, and so on.
+When calling `make' to build everything, `make' will be recursively
+called in all the directories that have a Makefile. Thus, the
+paths are logically relative to the directory that contains the
+Makefile.am.
+.PP
+This approach has the disadvantage of making dependencies harder
+to resolve: each Makefile does not know the targets of the other
+Makfiles. It also makes the build slower.
+.
+.HEADING 2 "Non-recursive make used by the Groff project"
+.
+.PP
+The second possibility, which was chosen for the groff project, is to use
+a non-recursive make schema. It is described in paragraph 7.3 of
+the Automake manual ("An Alternative Approach to Subdirectories"),
+based on the following paper from Peter Miller:
+.PDF_WWW_LINK http://miller.emu.id.au/pmiller/books/rmch/ \
+ SUFFIX . "\*[IT]Recursive Make Considered Harmful\*[PREV]"
+.PP
+The idea is to have a single Makefile that contains all the rules.
+That is why we have only a single Makefile.am in the top-level
+directory which includes all the \&.am files that define rules
+to build the various programs. The inclusion is done with the
+\*[CODE]include\*[CODE OFF] directive, not \*[CODE]SUBDIRS\*[CODE OFF]\&.
+Using `include' is like copying the contents of the included
+file into the top-level Makefile.am, and will not generate other
+Makefile.
+.PP
+We first say in this top-level Makefile.am:
+.QUOTE
+.CODE
+bin_PROGAMS =
+.CODE OFF
+.QUOTE OFF
+and then all the \&.am files that define a program to be built (e.g.
+src/devices/grolbp/grolbp.am, src/roff/troff/troff.am, and so on)
+overload this variable, so that at the end, all the programs that
+should be built are listed in this \*[CODE]bin_PROGRAMS\*[CODE OFF]
+variable. This is the reason why all the paths in the various \&.am
+files are relative to the top-level directory: at the end we will
+have only one Makefile in the top-level directory of the build tree.
+.PP
+As the resulting single Makefile knows all the targets, the
+dependencies are easier to manage. The build is also faster,
+particularly when compiling a single file: `make' is called once only
+and the file will be instantly rebuilt, while on a recursive make
+system, `make' will have to be invoked in all the sub-directories.
+.PP
+Note also that in order to make `gnulib' work with this
+non-recursive schema, the `--automake-subdir'
+configuration should be selected in bootstrap.conf.
+.
+.HEADING 1 "Installing data"
+.
+.PP
+Variables that end with \*[CODE]_DATA\*[CODE OFF] are special
+variables used to list files that should be installed in a
+particular location. The prefix of the variables should refer to
+another previously defined variable that ends with a `dir' suffix.
+This variable that ends with `dir' defines where the files should be
+installed.
+.
+.HEADING 2 "A simple case"
+.
+.PP
+For example, in font/devX100/devX100.am, we can see this:
+.QUOTE
+.CODE
+if !WITHOUT_X11
+devX100fontdir = $(fontdir)/devX100
+devX100font_DATA = $(DEVX100FONTS)
+endif
+.SP
+EXTRA_DIST += $(DEVX100FONTS)
+.CODE OFF
+.QUOTE OFF
+.WS -4
+\*[CODE]DEVX100FONTS\*[CODE OFF] is just a list of font files,
+defined at the beginning of devX100.am. \*[CODE]fontdir\*[CODE OFF]
+is where all the font directories are installed, it is defined
+in the top-level Makefile.am. The conditional
+\*[CODE]if\~!WITHOUT_X11\*[CODE OFF]
+is used to prevent the installation of
+these files if X11 is not available.
+.WS DEFAULT
+.PP
+We first define where we wants to install the devX100 fonts with:
+.QUOTE
+.CODE
+devX100fontdir = $(fontdir)/devX100
+.CODE OFF
+.QUOTE OFF
+Because we declared a variable ending with `dir', we are allowed
+to define \*[CODE]devX100font_DATA\*[CODE OFF] (you remove the
+`dir' suffix and add \*[CODE]_DATA\*[CODE OFF]). Wildcards are not
+supported in the special variables that end with
+\*[CODE]_DATA\*[CODE OFF]\&.
+.PP
+With these two lines, `make install' will install the files
+listed in \*[CODE]DEVX100FONTS\*[CODE OFF] and `make uninstall'
+will uninstall them. \*[CODE]devX100fontdir\*[CODE OFF] will be
+automatically created if missing during the installation
+process, but not removed during the uninstall. The complete
+\*[CODE]fontdir\*[CODE OFF] is removed by a custom uninstall rule
+(uninstall_groffdirs in Makefile.am).
+.PP
+Because the files listed in \*[CODE]devX100font_DATA\*[CODE OFF]
+are not distributed by default, we explicitly added them to the
+\*[CODE]EXTRA_DIST\*[CODE OFF] variable, which lists all the files
+that should be distributed and that are not taken into account by
+the default automake rules.
+.QUOTE
+.CODE
+ EXTRA_DIST += $(DEVX100FONTS)
+.CODE OFF
+.QUOTE OFF
+Another possibility would have been to add a `dist' prefix to the
+\*[CODE]devX100font_DATA\*[CODE OFF] variable, in this case the use
+of \*[CODE]EXTRA_DIST\*[CODE OFF] is useless (except of course if
+\*[CODE]WITHOUT_X11\*[CODE OFF] is true, in this case we don't
+install the files but we still have to distribute them):
+.QUOTE
+.CODE
+if !WITHOUT_X11
+devX100fontdir = $(fontdir)/devX100
+dist_devX100font_DATA = $(DEVX100FONTS)
+else
+EXTRA_DIST += $(DEVX100FONTS)
+endif
+.CODE OFF
+.QUOTE OFF
+.
+.HEADING 2 "Dealing with generated files"
+.
+.PP
+In the previous example, all the font files that must be installed
+were already present in the source tree. But in some cases,
+you need to generate the files you intend to install. In this
+case, the files should be installed but not distributed. A
+simple way to deal with this is to add a `nodist' prefix to your
+\*[CODE]xxx_DATA\*[CODE OFF] variable.
+.PP
+For example in font/devps/devps.am, we have a list of
+font files already present in the source tree, defined
+by \*[CODE]DEVPSFONTFILES\*[CODE OFF], and another list
+of font files that are generated, listed in the variable
+\*[CODE]DEVPSFONTFILES_GENERATED\*[CODE OFF]\&. They should all
+by installed in a `devps' directory under the fontdir. Thus
+the following three lines, where we use the `dist' and `nodist'
+prefixes:
+.QUOTE
+.CODE
+devpsfontdir = $(fontdir)/devps
+dist_devpsfont_DATA = $(DEVPSFONTFILES)
+nodist_devpsfont_DATA = $(DEVPSFONTFILES_GENERATED)
+.CODE OFF
+.QUOTE OFF
+The generated files are not cleaned by default, thus we add:
+.QUOTE
+.CODE
+MOSTLYCLEANFILES += $(DEVPSFONTFILES_GENERATED)
+.CODE OFF
+.QUOTE OFF
+.
+.HEADING 1 "Extending Automake's rules"
+.
+.HEADING 2 "Local clean rules"
+.
+.PP
+In most of the cases, the files that need to be cleaned are
+automatically determined by `automake', or were added to the
+\*[CODE]MOSTCLEANFILES\*[CODE OFF] or \*[CODE]CLEANFILES\*[CODE OFF]
+variables. However, you might need to define a specific rule
+to clean some files that were not added to any list. Automake
+defines a set of targets to extend the clean targets with your
+own rules: clean-local, mostlyclean-local, distclean-local or
+maintainerclean-local. An example of such extension exists in
+font/devpdf/devpdf.am: because some fonts are not explicitly listed
+in a \*[CODE]xxx_DATA\*[CODE OFF] variable but generated by a custom
+rule, we define an extra rule to extend the `mostlyclean' target:
+.CODE_SIZE 92
+.QUOTE
+.CODE
+mostlyclean-local: mostlyclean_devpdf_extra
+mostlyclean_devpdf_extra:
+ @echo Cleaning font/devpdf
+ rm -rf $(top_builddir)/font/devpdf/enc \\
+ $(top_builddir)/font/devpdf/map;
+ if test -d $(top_builddir)/font/devpdf; then \\
+ for f in $(GROFF_FONT_FILES); do \\
+ rm -f $(top_builddir)/font/devpdf/$$f; \\
+ done; \\
+ fi
+.CODE OFF
+.QUOTE OFF
+.
+.NO_FLEX OFF \" Prevent upcoming NEWPAGE from disabling flex-spacing.
+.HEADING 2 "Local install/uninstall rules and hooks"
+.
+.PP
+Similarly to the clean rules, there are extensions to install and
+uninstall rules. They come with two flavous, local rules and hooks.
+.
+.SP 3p
+.QUAD LEFT
+.HY OFF
+.
+.LIST
+.SHIFT_LIST 1m
+.ITEM
+There are 2 rules to extend install commands: `install-exec-local'
+for binaries and `install-data-local' for data.
+.ITEM
+There is 1 uninstall local rule: `uninstall-local'.
+.LIST OFF
+.
+.SP 3p
+.JUSTIFY
+.HY DEFAULT
+.
+There are no guarantees on the order of execution of these local
+rules. An example of local rule is the installation of GXditview.ad
+and GXditview-color.ad files in src/devices/xditview/xditview.am: if
+theses files are already installed, the old files are first saved.
+Also, the final file that is installed is stripped from its \&.ad
+suffix. Thus the usage of a custom rule rather than the definition
+of a \*[CODE]xxx_DATA\*[CODE OFF] variable:
+.FLEX
+.QUOTE
+.CODE
+# Custom installation of GXditview.ad and GXditview-color.ad
+install-data-local: install_xditview
+uninstall-local: uninstall_xditview
+.SP
+[...]
+install_xditview: $(xditview_srcdir)/GXditview.ad
+ -test -d $(DESTDIR)$(appdefdir) \\
+ || $(mkinstalldirs) $(DESTDIR)$(appdefdir)
+ if test -f $(DESTDIR)$(appdefdir)/GXditview; then \\
+ mv $(DESTDIR)$(appdefdir)/GXditview \\
+ $(DESTDIR)$(appdefdir)/GXditview.old; \\
+ fi
+ [...]
+ $(INSTALL_DATA) $(xditview_srcdir)/GXditview.ad \\
+ $(DESTDIR)$(appdefdir)/GXditview
+.CODE OFF
+.QUOTE OFF
+.PP
+Hooks, on the other hand, are guaranteed to be executed after all the
+standard targets have been executed.
+.BR
+.SP 3p
+.QUAD LEFT
+.HY OFF
+.
+.LIST
+.SHIFT_LIST 1m
+.SP 3p
+.ITEM
+There are 2 install hooks: `install-exec-hook' and
+`install-data-hook'.
+.ITEM
+There is 1 uninstall hook: `unintall-hook'
+.LIST OFF
+.
+.SP 3p
+.JUSTIFY
+.HY DEFAULT
+.
+.PP
+An example of hook is the `uninstall_groffdirs' rule in the
+top-level Makefile.am. This hook is used to remove all the
+directories specific to groff introduced by the installation
+process. Obviously it could not be a local extension of `uninstall'
+because the order of execution is not guaranteed.
+.QUOTE
+.CODE
+# directories specific to groff
+uninstall-hook: uninstall_groffdirs
+uninstall_groffdirs:
+ if test -d $(DESTDIR)$(datasubdir); then \\
+ rm -rf $(DESTDIR)$(fontdir); \\
+ rm -rf $(DESTDIR)$(oldfontdir); \\
+ rmdir $(DESTDIR)$(datasubdir); \\
+ fi
+ [...]
+.CODE OFF
+.QUOTE OFF
+.TOC
+.\" Local Variables:
+.\" mode: nroff
+.\" End:
+.\" vim: filetype=groff:
diff --git a/doc/doc.am b/doc/doc.am
new file mode 100644
index 0000000..cddc519
--- /dev/null
+++ b/doc/doc.am
@@ -0,0 +1,711 @@
+# Copyright (C) 2002-2022 Free Software Foundation, Inc.
+# Original Makefile.sub written by Werner Lemberg <wl@gnu.org>.
+# Adapted to Automake by Bertrand Garrigues
+# (bertrand.garrigues@laposte.net).
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+doc_srcdir = $(abs_top_srcdir)/doc
+doc_builddir = $(abs_top_builddir)/doc
+
+# Some document sources are parameterized in configuration options like
+# the groff version number and the command prefix. Use this in target
+# rules to prepare formattable versions of them from .in files.
+DOC_SED = $(SED) \
+ -e "s;[@]VERSION[@];$(VERSION);" \
+ -e "s;[@]g[@];$(g);g;"
+
+# Use this in target rules to run the build tree's groff.
+#
+# It includes flags to locate its tmac and device/font description
+# directories and to produce verbose diagnostics in the event of syntax
+# or formatting problems.
+DOC_GROFF = \
+ GROFF_COMMAND_PREFIX= \
+ GROFF_BIN_PATH="$(GROFF_BIN_PATH)" \
+ $(GROFFBIN) -M $(doc_srcdir) $(MFLAG) $(FFLAG) -ww -b
+
+# This image file is used by several documents in the groff source tree.
+DOC_GNU_EPS = doc/gnu.eps
+
+# Other doc, installed in $(docdir)
+# Files located in the source tree
+DOCFILES_INST = \
+ doc/me-revisions \
+ doc/ms.ms \
+ doc/pic.ms
+DOCFILES_NOINST = \
+ doc/meintro.me.in \
+ doc/meintro_fr.me.in \
+ doc/meref.me.in
+# Files that undergo a transformation prior to groff processing
+GENERATEDDOCFILES = \
+ doc/meintro.me \
+ doc/meintro_fr.me \
+ doc/meref.me
+# Files generated in the build tree
+if USE_GROHTML
+PROCESSEDDOCFILES_HTML = \
+ doc/pic.html
+endif
+if USE_GROPDF
+PROCESSEDDOCFILES_PDF = \
+ doc/automake.pdf \
+ doc/groff-man-pages.pdf
+endif
+PROCESSEDDOCFILES_PS = \
+ doc/meref.ps \
+ doc/meintro.ps \
+ doc/meintro_fr.ps \
+ doc/ms.ps \
+ doc/pic.ps
+PROCESSEDDOCFILES_TXT = \
+ doc/groff-man-pages.utf8.txt
+PROCESSEDDOCFILES = \
+ $(PROCESSEDDOCFILES_HTML) \
+ $(PROCESSEDDOCFILES_PS) \
+ $(PROCESSEDDOCFILES_PDF) \
+ $(PROCESSEDDOCFILES_TXT)
+
+# Declare minimal dependencies for documents by output driver.
+PROCESSEDFILES_DEPS_HTML = pre-grohtml groff troff post-grohtml \
+ font/devhtml/stamp font/devps/stamp
+PROCESSEDFILES_DEPS_PS = groff troff grops font/devps/stamp
+PROCESSEDFILES_DEPS_PDF = groff troff gropdf font/devpdf/stamp
+PROCESSEDFILES_DEPS_TXT = groff troff grotty font/devutf8/stamp
+
+if USE_GROHTML
+$(PROCESSEDDOCFILES_HTML): $(PROCESSEDFILES_DEPS_HTML)
+endif
+$(PROCESSEDDOCFILES_PS): $(PROCESSEDFILES_DEPS_PS)
+if USE_GROPDF
+$(PROCESSEDDOCFILES_PDF): $(PROCESSEDFILES_DEPS_PDF)
+endif
+$(PROCESSEDDOCFILES_TXT): $(PROCESSEDFILES_DEPS_TXT)
+
+otherdocdir = $(docdir)
+dist_otherdoc_DATA = $(DOCFILES_INST)
+nodist_otherdoc_DATA = $(PROCESSEDDOCFILES) $(GENERATEDDOCFILES)
+MOSTLYCLEANFILES += $(GENERATEDDOCFILES) $(PROCESSEDDOCFILES)
+EXTRA_DIST += $(DOCFILES_NOINST)
+
+# pdf doc, written in mom and therefore using contrib/mom/mom.am
+# definitions
+EXTRA_DIST += doc/automake.mom
+if USE_GROPDF
+docpdfdocdir = $(pdfdocdir)
+nodist_docpdfdoc_DATA = doc/automake.pdf
+endif
+doc/automake.pdf: doc/automake.mom pdfmom contrib/mom/om.tmac
+
+# GNU PIC html documentation, installed in $(htmldocdir)
+# Other pic*.html files are installed by the local rule
+if USE_GROHTML
+htmlpicdir = $(htmldocdir)
+htmlpic_DATA = $(PROCESSEDDOCFILES_HTML)
+HTMLDOCFILESALL = pic*.html
+HTMLDOCIMAGEFILES = pic*
+endif
+
+# Examples files, installed in $(exampledir)
+
+# source tree files
+EXAMPLEFILES = \
+ doc/webpage.ms \
+ doc/groff.css \
+ doc/grnexmpl.g \
+ doc/grnexmpl.me
+
+# Generated in the build tree
+if USE_GROHTML
+PROCESSEDEXAMPLEFILES_HTML = doc/webpage.html
+else
+PROCESSEDEXAMPLEFILES_HTML =
+endif
+PROCESSEDEXAMPLEFILES_PS = \
+ doc/webpage.ps \
+ doc/grnexmpl.ps
+PROCESSEDEXAMPLEFILES = \
+ $(PROCESSEDEXAMPLEFILES_HTML) \
+ $(PROCESSEDEXAMPLEFILES_PS)
+
+$(PROCESSEDEXAMPLEFILES_HTML): $(PROCESSEDFILES_DEPS_HTML)
+$(PROCESSEDEXAMPLEFILES_PS): $(PROCESSEDFILES_DEPS_PS)
+
+docexamplesdir = $(exampledir)
+dist_docexamples_DATA = $(EXAMPLEFILES)
+nodist_docexamples_DATA = $(PROCESSEDEXAMPLEFILES)
+MOSTLYCLEANFILES += $(PROCESSEDEXAMPLEFILES)
+
+if USE_GROHTML
+# webpage.html is generated; webpage*.html files are installed by the
+# local rule.
+HTMLEXAMPLEFILESALL = webpage*.html
+HTMLEXAMPLEIMAGEFILES = webpage*
+htmlexamplesdir = $(exampledir)
+endif
+
+# Locate image subdirectory for HTML documents relative to an
+# installation directory such as `htmldocdir` or `exampledir`. Do _not_
+# use for locating files within the source or build trees.
+imagedir = img
+
+EXTRA_DIST += \
+ doc/txi-en.tex
+
+# Introduce variables to house the groff man pages. We break the list
+# of page sources into multiple chunks because we have to load Swedish
+# localization before formatting groff_mmse.7 and then reload English
+# localization afterward. This also serves as a test of groff locale
+# switching; being lazy and shunting groff_mmse.7 off to the end of the
+# document would not achieve this goal (and not loading Swedish
+# localization at all to format it would be gauche).
+GROFF_MAN_PAGES1 = \
+ src/utils/addftinfo/addftinfo.1 \
+ src/utils/afmtodit/afmtodit.1 \
+ contrib/chem/chem.1 \
+ src/preproc/eqn/eqn.1 \
+ contrib/eqn2graph/eqn2graph.1 \
+ contrib/gdiffmk/gdiffmk.1 \
+ contrib/glilypond/glilypond.1 \
+ contrib/gperl/gperl.1 \
+ contrib/gpinyin/gpinyin.1 \
+ contrib/grap2graph/grap2graph.1 \
+ src/preproc/grn/grn.1 \
+ src/devices/grodvi/grodvi.1 \
+ src/roff/groff/groff.1 \
+ src/utils/grog/grog.1 \
+ src/devices/grohtml/grohtml.1 \
+ src/devices/grolbp/grolbp.1 \
+ src/devices/grolj4/grolj4.1 \
+ src/devices/gropdf/gropdf.1 \
+ src/devices/grops/grops.1 \
+ src/devices/grotty/grotty.1 \
+ $(GXDITVIEW_MAN1) \
+ src/utils/hpftodit/hpftodit.1 \
+ src/utils/indxbib/indxbib.1 \
+ src/utils/lkbib/lkbib.1 \
+ src/utils/lookbib/lookbib.1 \
+ contrib/mm/mmroff.1 \
+ src/preproc/eqn/neqn.1 \
+ src/roff/nroff/nroff.1 \
+ src/devices/gropdf/pdfmom.1 \
+ contrib/pdfmark/pdfroff.1 \
+ src/utils/pfbtops/pfbtops.1 \
+ src/preproc/pic/pic.1 \
+ contrib/pic2graph/pic2graph.1 \
+ src/preproc/preconv/preconv.1 \
+ src/preproc/refer/refer.1 \
+ src/preproc/soelim/soelim.1 \
+ src/preproc/tbl/tbl.1 \
+ src/utils/tfmtodit/tfmtodit.1 \
+ src/roff/troff/troff.1 \
+ $(XTOTROFF_MAN1) \
+ man/groff_font.5 \
+ man/groff_out.5 \
+ man/groff_tmac.5 \
+ man/groff.7 \
+ man/groff_char.7 \
+ man/groff_diff.7 \
+ contrib/hdtbl/groff_hdtbl.7 \
+ tmac/groff_man.7 \
+ tmac/groff_man_style.7 \
+ tmac/groff_mdoc.7 \
+ tmac/groff_me.7 \
+ contrib/mm/groff_mm.7
+
+GROFF_MAN_PAGES2 = \
+ contrib/mm/groff_mmse.7
+
+GROFF_MAN_PAGES3 = \
+ contrib/mom/groff_mom.7 \
+ tmac/groff_ms.7 \
+ contrib/rfc1345/groff_rfc1345.7 \
+ tmac/groff_trace.7 \
+ tmac/groff_www.7 \
+ man/roff.7
+
+GROFF_MAN_PAGES_ALL = $(GROFF_MAN_PAGES1) $(GROFF_MAN_PAGES2) \
+ $(GROFF_MAN_PAGES3)
+
+# This is a convenience target for (re-)generating all the man pages.
+man-all: $(GROFF_MAN_PAGES_ALL)
+
+# ...and for cleaning them.
+man-clean:
+ $(RM) $(GROFF_MAN_PAGES_ALL)
+
+# Many pages use tbl, a few use eqn, and soelim(1) uses pic. We also
+# need groff's FreeEuro font so we can embed it.
+#
+# We embed the fonts (-P-e) to (1) honor the current PDF standard, (2)
+# ensure consistent rendering of the document, and (3) exercise this
+# feature of gropdf.
+doc/groff-man-pages.pdf: $(GROFF_MAN_PAGES_ALL) eqn pic tbl \
+ $(TMAC_PACKAGE_MAN) $(TMAC_PACKAGE_MDOC) font/devps/freeeuro.pfa
+ $(GROFF_V)$(DOC_GROFF) -pet -mandoc -dHF=HB -rC1 \
+ -rCHECKSTYLE=3 -Tpdf -P-e \
+ $(GROFF_MAN_PAGES1) \
+ $(tmac_srcdir)/sv.tmac $(GROFF_MAN_PAGES2) \
+ $(tmac_srcdir)/en.tmac $(GROFF_MAN_PAGES3) > $@
+
+doc/groff-man-pages.utf8.txt: $(GROFF_MAN_PAGES_ALL) eqn pic tbl \
+ $(TMAC_PACKAGE_MAN) $(TMAC_PACKAGE_MDOC)
+ $(GROFF_V)$(DOC_GROFF) -pet -Tutf8 -mandoc \
+ -rCHECKSTYLE=3 $(GROFF_MAN_PAGES1) \
+ $(tmac_srcdir)/sv.tmac $(GROFF_MAN_PAGES2) \
+ $(tmac_srcdir)/en.tmac $(GROFF_MAN_PAGES3) > $@
+
+doc/grnexmpl.ps: $(doc_srcdir)/grnexmpl.me $(doc_srcdir)/grnexmpl.g \
+ grn eqn
+ $(GROFF_V)$(MKDIR_P) `dirname $@` \
+ && $(DOC_GROFF) -Tps -ge -me $(doc_srcdir)/grnexmpl.me >$@
+
+# Generating *.me from *.me.in is, surprisingly, a challenge.
+# 1. A pattern rule ("%.me: %.me.in") is not portable to NetBSD or
+# OpenBSD make.
+# 2. A single-suffix rule works in an isolated Makefile, but _only_
+# with the .SUFFIXES special target, not with the
+# (Automake-specific) SUFFIXES macro.
+# .SUFFIXES: .in
+# .in:
+# $(DOC_SED) $< >$@
+# (One can validly complain that this approach is too general.)
+# 3. GNU Automake insists that we use the SUFFIXES macro and not the
+# special target.
+# error: use variable 'SUFFIXES', not target '.SUFFIXES'
+# 4. What about a target rule? We'd have to explicitly write the first
+# dependency name in the rule commands because NetBSD make (and
+# reportedly OpenBSD) refuses to honor the $< variable in target
+# rules.
+#
+# So what is left? A double-suffix rule--but you have to use it in a
+# special way that is explicitly not countenanced by POSIX.
+#
+# "The application shall ensure that the target portion is a valid
+# target name (see Target Rules) of the form .s2 or .s1.s2 (where .s1
+# and .s2 are suffixes that have been given as prerequisites of the
+# .SUFFIXES special target and s1 and s2 do not contain any <slash> or
+# <period> characters.) If there is only one <period> in the target,
+# it is a single-suffix inference rule. Targets with two periods are
+# double-suffix inference rules. Inference rules can have only one
+# target before the <colon>."
+# (POSIX Issue 8, make(1), "Inference Rules")
+#
+# A double-suffix rule won't work in an obvious way because its
+# semantics are that the suffix is replaced, not removed. You have to
+# add both suffixes to the .SUFFIXES special target, in order with the
+# dependency first.
+# .SUFFIXES: .me.in .me
+# .me.in.me:
+# $(DOC_SED) $< >$@
+# Thanks to Automake, we must say
+# SUFFIXES += .me.in .me
+# for reason 3 above. The GNU Automake manual does not explicitly state
+# that it preserves the ordering of the suffixes, but for now it does.
+#
+# It appears to be dumb luck that this works; the rigamarole by itself
+# justifies to me the worth of GNU Make's pattern rules (which require
+# neither '.SUFFIXES' nor 'SUFFIXES') and establishing semantics for $<
+# in target rules. But I won't hold my breath waiting on other make(1)
+# implementors to agree. -- GBR
+.PRECIOUS: $(GENERATEDDOCFILES)
+SUFFIXES += .me.in .me
+.me.in.me:
+ $(GROFF_V)$(MKDIR_P) `dirname $@` \
+ && $(DOC_SED) $< >$@
+
+.me.ps:
+ $(GROFF_V)$(MKDIR_P) `dirname $@` \
+ && $(DOC_GROFF) -Tps -me $< >$@
+
+# Use '-K utf8', not '-k', in case 'configure' didn't find uchardet.
+# The French translation uses tbl; its English counterpart does not.
+doc/meintro_fr.ps: doc/meintro_fr.me preconv
+ $(GROFF_V)$(MKDIR_P) `dirname $@` \
+ && $(DOC_GROFF) -K utf8 -t -Tps -me -mfr $< >$@
+
+doc/ms.ps: $(doc_srcdir)/ms.ms eqn tbl
+ $(GROFF_V)$(MKDIR_P) `dirname $@` \
+ && $(DOC_GROFF) -et -Tps -ms $(doc_srcdir)/ms.ms >$@
+
+doc/pic.ps: $(doc_srcdir)/pic.ms eqn pic tbl
+ $(GROFF_V)$(MKDIR_P) `dirname $@` \
+ && $(DOC_GROFF) -pet -Tps -ms $(doc_srcdir)/pic.ms >$@
+
+doc/webpage.ps: $(DOC_GNU_EPS) tmac/www.tmac tbl
+doc/webpage.ps: $(doc_srcdir)/webpage.ms
+ $(GROFF_V)$(MKDIR_P) `dirname $@` \
+ && $(DOC_GROFF) -I $(doc_srcdir) -I $(doc_builddir) -t -Tps \
+ -ms -mwww $(doc_srcdir)/webpage.ms >$@
+
+# We have no "generic" ms documents.
+#.ms.ps:
+# $(GROFF_V)$(MKDIR_P) `dirname $@` \
+# && $(DOC_GROFF) -Tps -ms $< >$@
+
+doc/pic.html: eqn pic tbl
+doc/pic.html: tmac/www.tmac
+doc/pic.html: $(doc_srcdir)/pic.ms
+ $(GROFF_V)$(MKDIR_P) $(doc_builddir) \
+ && cd $(doc_builddir) \
+ && $(DOC_GROFF) -pet -P-Ipic -P-Dimg -P-jpic -Thtml -ms \
+ $(doc_srcdir)/pic.ms > pic.html
+
+doc/webpage.html: tbl
+doc/webpage.html: tmac/www.tmac
+doc/webpage.html: $(DOC_GNU_EPS)
+doc/webpage.html: $(doc_srcdir)/groff.css
+doc/webpage.html: $(doc_srcdir)/webpage.ms
+ $(GROFF_V)$(MKDIR_P) $(doc_builddir) \
+ && cd $(doc_builddir) \
+ && $(DOC_GROFF) -t -I $(doc_srcdir) -P-jwebpage -P-nrb \
+ -P-Iwebpage -P-Dimg -Thtml -ms $(doc_srcdir)/webpage.ms \
+ > webpage.html
+
+# We remove groff.css only from an out-of-source build tree.
+mostlyclean-local: mostlyclean_doc
+mostlyclean_doc:
+if USE_GROHTML
+ if test -d $(doc_builddir); then \
+ cd $(doc_builddir) \
+ && for f in $(HTMLDOCFILESALL); do \
+ $(RM) $$f; \
+ done; \
+ fi
+ if test -d $(doc_builddir)/img; then \
+ cd $(doc_builddir)/img \
+ && for f in $(HTMLDOCIMAGEFILES); do \
+ $(RM) $$f; \
+ done; \
+ rmdir $(doc_builddir)/img || :; \
+ fi
+endif
+ if test $(top_builddir) != $(top_srcdir); then \
+ $(RM) $(top_builddir)/doc/groff.css; \
+ fi
+if USE_GROHTML
+ if test -d $(doc_builddir); then \
+ cd $(doc_builddir) \
+ && for f in $(HTMLEXAMPLEFILESALL); do \
+ $(RM) $$f; \
+ done; \
+ fi
+ if test -d $(doc_builddir)/img; then \
+ cd $(doc_builddir)/img \
+ && for f in $(HTMLEXAMPLEIMAGEFILES); do \
+ $(RM) $$f; \
+ done; \
+ rmdir $(doc_builddir)/img || :; \
+ fi
+endif
+
+install-data-hook: install_doc_htmldoc
+install_doc_htmldoc:
+if USE_GROHTML
+ cd $(doc_builddir) \
+ && for f in `ls $(HTMLDOCFILESALL)`; do \
+ $(RM) $(DESTDIR)$(htmldocdir)/$$f; \
+ $(INSTALL_DATA) $$f $(DESTDIR)$(htmldocdir)/$$f; \
+ done
+ -test -d $(DESTDIR)$(htmldocdir)/$(imagedir) \
+ || $(mkinstalldirs) $(DESTDIR)$(htmldocdir)/$(imagedir)
+ $(RM) $(DESTDIR)$(htmldocdir)/$(imagedir)/$(HTMLDOCIMAGEFILES)
+ $(INSTALL_DATA) $(doc_builddir)/img/$(HTMLDOCIMAGEFILES) \
+ $(DESTDIR)$(htmldocdir)/$(imagedir)
+endif
+
+install-data-hook: install_doc_gnu_eps install_doc_examples
+
+install_doc_gnu_eps: $(DOC_GNU_EPS)
+ for d in $(doc_builddir) $(doc_srcdir); do \
+ if test -f "$$d/gnu.eps"; then \
+ $(RM) $(DESTDIR)$(exampledir)/gnu.eps; \
+ $(INSTALL_DATA) \
+ $$d/gnu.eps $(DESTDIR)$(exampledir)/gnu.eps; \
+ break; \
+ fi; \
+ done
+
+install_doc_examples: $(DOC_GNU_EPS)
+if USE_GROHTML
+ cd $(doc_builddir) \
+ && for f in `ls $(HTMLEXAMPLEFILESALL)`; do \
+ $(RM) $(DESTDIR)$(exampledir)/$$f; \
+ $(INSTALL_DATA) $$f $(DESTDIR)$(exampledir)/$$f; \
+ done
+ -test -d $(DESTDIR)$(exampledir)/$(imagedir) \
+ || $(mkinstalldirs) $(DESTDIR)$(exampledir)/$(imagedir)
+ $(RM) \
+ $(DESTDIR)$(exampledir)/$(imagedir)/$(HTMLEXAMPLEIMAGEFILES)
+ $(INSTALL_DATA) $(doc_builddir)/img/$(HTMLEXAMPLEIMAGEFILES) \
+ $(DESTDIR)$(exampledir)/$(imagedir)
+endif
+
+uninstall-hook: \
+ uninstall_doc_examples uninstall_doc_htmldoc
+uninstall_doc_examples:
+ $(RM) $(DESTDIR)$(exampledir)/gnu.eps
+if USE_GROHTML
+ -test -d $(DESTDIR)$(docexamplesdir) \
+ && cd $(DESTDIR)$(docexamplesdir) \
+ && for f in $(HTMLEXAMPLEFILESALL); do \
+ $(RM) $$f; \
+ done
+ -test -d $(DESTDIR)$(docexamplesdir)/$(imagedir) \
+ && cd $(DESTDIR)$(docexamplesdir)/$(imagedir) \
+ && for f in $(HTMLEXAMPLEIMAGEFILES); do \
+ $(RM) $$f; \
+ done
+ -rmdir $(DESTDIR)$(docexamplesdir)/$(imagedir)
+ -rmdir $(DESTDIR)$(docexamplesdir)
+endif
+
+uninstall_doc_htmldoc:
+if USE_GROHTML
+ -test -d $(DESTDIR)$(htmldocdir) \
+ && cd $(DESTDIR)$(htmldocdir) \
+ && for f in $(HTMLDOCFILESALL); do \
+ $(RM) $$f; \
+ done
+ -test -d $(DESTDIR)$(htmldocdir)/$(imagedir) \
+ && cd $(DESTDIR)$(htmldocdir)/$(imagedir) \
+ && for f in $(HTMLDOCIMAGEFILES); do \
+ $(RM) $$f; \
+ done
+ -rmdir $(DESTDIR)$(htmldocdir)/$(imagedir)
+ -rmdir $(DESTDIR)$(htmldocdir)
+endif
+
+# groff Texinfo manual
+#
+# We produce all possible formats by by default and ship them in the
+# distribution archive ('make dist') so that people don't need to have
+# 'makeinfo' or TeX available.
+#
+# The GNU info, plain text, and HTML formats require only 'makeinfo'.
+#
+# DVI and PDF require a working TeX installation. We can't use
+# Automake's facilities for PDF production because its 'dist' target
+# attempts to generate 'groff.pdf' by invoking 'texi2dvi' without the
+# '-E' option (use 'makeinfo' to expand macros), which is needed to
+# build this file. 'texi2dvi' honors the 'MAKEINFO' environment
+# variable.
+#
+# Were the foregoing not true, we would simply say this:
+#info_TEXINFOS = doc/groff.texi
+#doc_groff_TEXINFOS = doc/fdl.texi
+
+if USE_TEX
+GROFF_DVI = doc/groff.dvi
+GROFF_PDF = doc/groff.pdf
+endif
+
+all: doc/groff.info doc/groff.txt doc/groff.html $(GROFF_DVI) \
+ $(GROFF_PDF)
+
+# Distribute the manual in source form as well.
+EXTRA_DIST += doc/groff.texi doc/fdl.texi
+
+EXTRA_DIST += doc/groff.info
+MAINTAINERCLEANFILES += doc/groff.info
+doc/groff.info: $(doc_srcdir)/groff.texi
+ $(AM_V_at)$(MKDIR_P) $(doc_builddir)
+ $(AM_V_GEN)LANG=C \
+ LC_ALL=C \
+ $(MAKEINFO) -o doc/groff.info --enable-encoding \
+ -I $(doc_srcdir) $(doc_srcdir)/groff.texi
+
+# Distribute the Info files.
+dist-hook: dist-info-bits
+dist-info-bits:
+ chmod u+w $(distdir)/doc
+ for d in $(doc_builddir) $(doc_srcdir); do \
+ if [ -f "$$d"/groff.info ]; then \
+ cp -f "$$d"/groff.info-* $(distdir)/doc; \
+ break; \
+ fi; \
+ done
+
+EXTRA_DIST += doc/groff.txt
+MAINTAINERCLEANFILES += doc/groff.txt
+.texi.txt:
+ $(AM_V_at)$(MKDIR_P) $(doc_builddir)
+ $(AM_V_GEN)LANG=C \
+ LC_ALL=C \
+ $(MAKEINFO) --enable-encoding -I $(doc_srcdir) --plaintext \
+ -o $@ $<
+
+# Generate HTML, both split into several files, and as a single file.
+# 'html' and its installation counterpart 'install-html' are standard
+# Automake targets.
+EXTRA_DIST += doc/groff.html doc/groff.html.node
+MAINTAINERCLEANFILES += doc/groff.html doc/groff.html.node
+.texi.html:
+ $(AM_V_at)$(MKDIR_P) $(doc_builddir)/
+ $(AM_V_GEN)LANG=C \
+ LC_ALL=C \
+ $(MAKEINFO) --html -I $(doc_srcdir) \
+ -o doc/`basename $@`.node $<
+ $(AM_V_at)LANG=C \
+ LC_ALL=C \
+ $(MAKEINFO) --html -I $(doc_srcdir) --no-split \
+ -o $@ $<
+
+EXTRA_DIST += doc/groff.dvi doc/groff.pdf
+
+# Define pattern rules to make our Texinfo manual in DVI and PDF
+# formats. 'pdf' and 'dvi' and their installation counterparts
+# 'install-pdf' and 'install-dvi' are standard Automake targets.
+.texi.dvi:
+if HAVE_TEXI2DVI
+if USE_TEX
+ $(AM_V_at)$(MKDIR_P) $(doc_builddir)
+ $(AM_V_GEN)LANG=C \
+ LC_ALL=C \
+ TEXINPUTS="$(top_srcdir)/build-aux:$(TEXINPUTS)" \
+ MAKEINFO='$(MAKEINFO) -I $(doc_srcdir)' \
+ FORCE_SOURCE_DATE=1 \
+ $(PROG_TEXI2DVI) -e --batch --build-dir=doc/`basename $@`.t2d \
+ -o $@ $<
+else
+ @echo "program 'tex' is missing; cannot generate $@" >&2; \
+ exit 1
+endif # USE_TEX
+else
+ @echo "program 'texi2dvi' is missing or too old;" \
+ "cannot generate $@" >&2; \
+ exit 1
+endif # HAVE_TEXI2DVI
+
+.texi.pdf:
+if HAVE_TEXI2DVI
+if USE_TEX
+ $(AM_V_at)$(MKDIR_P) $(doc_builddir)
+ $(AM_V_GEN)LANG=C \
+ LC_ALL=C \
+ TEXINPUTS="$(top_srcdir)/build-aux:$(TEXINPUTS)" \
+ MAKEINFO='$(MAKEINFO) -I $(doc_srcdir)' \
+ $(PROG_TEXI2DVI) -e --batch --pdf \
+ --build-dir=doc/`basename $@`.t2p -o $@ $<
+else
+ @echo "program 'tex' is missing; cannot generate $@" >&2; \
+ exit 1
+endif # USE_TEX
+else
+ @echo "program 'texi2dvi' is missing or too old;" \
+ "cannot generate $@" >&2; \
+ exit 1
+endif # HAVE_TEXI2DVI
+
+install-doc: install-dvi install-html install-pdf
+
+maintainer-clean-local:
+ $(RM) $(doc_builddir)/groff.info*
+ $(RM) $(doc_builddir)/groff.pdf
+ $(RM) $(doc_builddir)/groff.dvi
+ $(RM) $(doc_builddir)/groff.txt
+ $(RM) -r $(doc_builddir)/groff.html.*
+
+install-data-local: install-txt
+install-txt:
+ -test -d $(DESTDIR)$(docdir) \
+ || $(mkinstalldirs) $(DESTDIR)$(docdir)
+ cp $(top_srcdir)/doc/groff.txt $(DESTDIR)$(docdir)
+
+install-data-local: install_infodoc
+install_infodoc: doc/groff.info
+ -test -d $(DESTDIR)$(infodir) \
+ || $(mkinstalldirs) $(DESTDIR)$(infodir)
+ $(RM) $(DESTDIR)/doc/groff.info*
+ for d in $(doc_builddir) $(doc_srcdir); do \
+ if [ -f "$$d"/groff.info ]; then \
+ cp "$$d"/groff.info* $(DESTDIR)$(infodir); \
+ $(INSTALL_INFO) --info-file="$$d"/groff.info \
+ --info-dir=$(DESTDIR)$(infodir); \
+ break; \
+ fi; \
+ done
+install-pdf-local: doc/groff.pdf
+ -test -d $(DESTDIR)$(pdfdocdir) \
+ || $(mkinstalldirs) $(DESTDIR)$(pdfdocdir)
+ cp $(top_srcdir)/doc/groff.pdf $(DESTDIR)$(pdfdocdir)
+install-html-local: doc/groff.html
+ -test -d $(DESTDIR)$(htmldocdir)/groff.html.mono \
+ || $(mkinstalldirs) $(DESTDIR)$(htmldocdir)/groff.html.mono
+ cp -r $(top_srcdir)/doc/groff.html \
+ $(DESTDIR)$(htmldocdir)/groff.html.mono
+ cp -r $(top_srcdir)/doc/groff.html.node \
+ $(DESTDIR)$(htmldocdir)
+
+uninstall-local: uninstall_infodoc uninstall-pdf uninstall-html \
+ uninstall-txt
+uninstall_doc: uninstall-local
+uninstall-doc: uninstall-local
+uninstall_infodoc:
+ -$(INSTALL_INFO) --remove --info-dir=$(DESTDIR)$(infodir) \
+ $(DESTDIR)$(infodir)/groff.info
+ -for f in `ls $(DESTDIR)$(infodir)/groff.info*`; do \
+ $(RM) $$f; \
+ done
+uninstall-pdf:
+ $(RM) $(DESTDIR)$(pdfdocdir)/groff.pdf
+ -rmdir $(DESTDIR)$(pdfdocdir)
+uninstall-html:
+ $(RM) $(DESTDIR)$(htmldocdir)/groff.html.mono/*
+ $(RM) $(DESTDIR)$(htmldocdir)/groff.html.node/*
+uninstall-txt:
+ $(RM) $(DESTDIR)$(docdir)/groff.txt
+
+# An image of a gnu in enscapsulated PostScript is generated during the
+# build process if necessary. Our configure script assumes pnmdepth is
+# available if xpmtoppm is (see macro "GROFF_PROG_XPMTOPPM").
+EXTRA_DIST += $(DOC_GNU_EPS) doc/gnu.xpm
+$(DOC_GNU_EPS): doc/gnu.xpm
+ $(AM_V_GEN)if test "$(XPMTOPPM)" != found; then \
+ echo "program 'xpmtoppm' is missing; can't generate $@" >&2; \
+ exit 1; \
+ fi; \
+ if test "$(pnmtops)" != found; then \
+ echo "program 'pnmtops' is missing; can't generate $@" >&2; \
+ exit 1; \
+ fi; \
+ if ! echo "$(pnmtops_nosetpage)" | grep -q nosetpage; then \
+ echo "program 'pnmtops' can't handle -nosetpage option;" \
+ "can't generate $@" >&2; \
+ exit 1; \
+ fi; \
+ xpmtoppm $(top_srcdir)/doc/gnu.xpm | pnmdepth 15 \
+ | $(pnmtops_nosetpage) -noturn -rle >$@
+
+# Provide a copy of the image in the distribution archive to accommodate
+# systems without a tool to generate it from an X pixmap.
+dist-hook: dist-gnueps
+dist-gnueps:
+ chmod u+w $(distdir)/doc
+ for d in $(doc_builddir) $(doc_srcdir); do \
+ if [ -f "$$d"/$(DOC_GNU_EPS) ]; then \
+ cp -f "$$d"/$(DOC_GNU_EPS) $(distdir)/doc; \
+ break; \
+ fi; \
+ done
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/doc/fdl.texi b/doc/fdl.texi
new file mode 100644
index 0000000..46f6b81
--- /dev/null
+++ b/doc/fdl.texi
@@ -0,0 +1,505 @@
+@c The GNU Free Documentation License.
+@center Version 1.3, 3 November 2008
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2000-2018 Free Software Foundation, Inc.
+@uref{http://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @dfn{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.
+
+@item
+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, La@TeX{} 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.
+
+The ``publisher'' means any person or entity that distributes copies
+of the Document to the public.
+
+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.
+
+@item
+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.
+
+@item
+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.
+
+@item
+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:
+
+@enumerate A
+@item
+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.
+
+@item
+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.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+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.
+
+@item
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+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.
+
+@item
+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.
+
+@item
+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.
+
+@item
+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.
+
+@item
+Delete any section Entitled ``Endorsements''. Such a section
+may not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled ``Endorsements'' or
+to conflict in title with any Invariant Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+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.
+
+@item
+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.''
+
+@item
+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.
+
+@item
+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.
+
+@item
+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.
+
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+
+@item
+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
+@uref{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. If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy's public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+
+@item
+RELICENSING
+
+``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works. A
+public wiki that anybody can edit is an example of such a server. A
+``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
+site means any set of copyrightable works thus published on the MMC
+site.
+
+``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+
+``Incorporate'' means to publish or republish a Document, in whole or
+in part, as part of another Document.
+
+An MMC is ``eligible for relicensing'' if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole
+or in part into the MMC, (1) had no cover texts or invariant sections,
+and (2) were thus incorporated prior to November 1, 2008.
+
+The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+
+@end enumerate
+
+@page
+@heading 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:
+
+@smallexample
+@group
+ Copyright (C) @var{year} @var{your name}.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ 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''.
+@end group
+@end smallexample
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with@dots{}Texts.''@: line with this:
+
+@smallexample
+@group
+ with the Invariant Sections being @var{list their titles}, with
+ the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
+ being @var{list}.
+@end group
+@end smallexample
+
+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.
+
+@c Local Variables:
+@c ispell-local-pdict: "ispell-dict"
+@c End:
diff --git a/doc/gnu.eps b/doc/gnu.eps
new file mode 100644
index 0000000..6a836c7
--- /dev/null
+++ b/doc/gnu.eps
@@ -0,0 +1,784 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%LanguageLevel: 2
+%%Creator: pnmtops
+%%Title: noname.ps
+%%Pages: 1
+%%BoundingBox: 203 311 408 481
+%%EndComments
+%%BeginSetup
+/rlestr1 1 string def
+/readrlestring {
+ /rlestr exch def
+ currentfile rlestr1 readhexstring pop
+ 0 get
+ dup 127 le {
+ currentfile rlestr 0
+ 4 3 roll
+ 1 add getinterval
+ readhexstring pop
+ length
+ } {
+ 257 exch sub dup
+ currentfile rlestr1 readhexstring pop
+ 0 get
+ exch 0 exch 1 exch 1 sub {
+ rlestr exch 2 index put
+ } for
+ pop
+ } ifelse
+} bind def
+/readstring {
+ dup length 0 {
+ 3 copy exch
+ 1 index sub
+ getinterval
+ readrlestring
+ add
+ 2 copy le { exit } if
+ } loop
+ pop pop
+} bind def
+/rpicstr 107 string def
+/gpicstr 107 string def
+/bpicstr 107 string def
+%%EndSetup
+%%Page: 1 1
+gsave
+203.76 311.04 translate
+204.48 169.92 scale
+213 177 4
+[ 213 0 0 -177 0 177 ]
+{ rpicstr readstring }
+{ gpicstr readstring }
+{ bpicstr readstring }
+true 3
+colorimage
+97ff00f097ff00f097ff00f097ff00f097ff00f097ff00f0ecff04eddcaabddeb1ff00f0ecff04ed
+dcaabddeb1ff00f0ecff04eddcaabddeb1ff00f0eeff0ad988777478864555678adfb5ff00f0eeff
+0ad988777478864555678adfb5ff00f0eeff0ad988777478864555678adfb5ff00f0f0ff0dfdbba9
+4afcb867b544777675447cb6ff00f0f0ff0dfdbba94afcb867b544777675447cb6ff00f0f0ff0dfd
+bba94afcb867b544777675447cb6ff00f0f1ff10faab6985449d5d649543484465675558bdd3ff01
+ecdfe8ff00f0f1ff10faab6985449d5d649543484465675558bdd3ff01ecdfe8ff00f0f1ff10faab
+6985449d5d649543484465675558bdd3ff01ecdfe8ff00f0f2ff12fb9de89476454897d54a443974
+43575554339fd7ff06d978778998889ceaff00f0f2ff12fb9de89476454897d54a44397443575554
+339fd7ff06d978778998889ceaff00f0f2ff12fb9de89476454897d54a44397443575554339fd7ff
+06d978778998889ceaff00f0f3ff14fc9cfff834455554669b487434a5444755555346cfdaff0afc
+869cfdcfa9fedaa988dfecff00f0f3ff14fc9cfff834455554669b487434a5444755555346cfdaff
+0afc869cfdcfa9fedaa988dfecff00f0f3ff14fc9cfff834455554669b487434a5444755555346cf
+daff0afc869cfdcfa9fedaa988dfecff00f0f3ff159bffd5ae84534554454c74b444474444944566
+5549effdff00fee2ff0ce8977adb8874764564444aee99ecff00f0f3ff159bffd5ae84534554454c
+74b4444744449445665549effdff00fee2ff0ce8977adb8874764564444aee99ecff00f0f3ff159b
+ffd5ae84534554454c74b4444744449445665549effdff00fee2ff0ce8977adb8874764564444aee
+99ecff00f0f5ff18fee8defd9975ca4535454445c47844455444554456444558bffeff0176afe4ff
+05e8448baa5665fe44054535797efc8bedff00f0f5ff18fee8defd9975ca4535454445c478444554
+44554456444558bffeff0176afe4ff05e8448baa5665fe44054535797efc8bedff00f0f5ff18fee8
+defd9975ca4535454445c47844455444554456444558bffeff0176afe4ff05e8448baa5665fe4405
+4535797efc8bedff00f0f5ff07e7cef97cd76758a4fe540356754b44fe540b46455463855caaacdd
+a7bdafedff01fdbefbff07fd77a86754454445fe4405896446effc9eeeff00f0f5ff07e7cef97cd7
+6758a4fe540356754b44fe540b46455463855caaacdda7bdafedff01fdbefbff07fd77a867544544
+45fe4405896446effc9eeeff00f0f5ff07e7cef97cd76758a4fe540356754b44fe540b4645546385
+5caaacdda7bdafedff01fdbefbff07fd77a86754454445fe4405896446effc9eeeff00f0f6ff11fe
+8e758a849ec65488444467c86467945646fe440954555757efca78bffaefedff02d675affeff13fe
+ed976666844443444343444455677898affbaeefff00f0f6ff11fe8e758a849ec65488444467c864
+67945646fe440954555757efca78bffaefedff02d675affeff13feed976666844443444343444455
+677898affbaeefff00f0f6ff11fe8e758a849ec65488444467c86467945646fe440954555757efca
+78bffaefedff02d675affeff13feed976666844443444343444455677898affbaeefff00f0f6ff1d
+c79889555655afc64664457efd75b594485445455445494674eefddeefdaecff039efb6466fd4412
+466558444334563454434555434459cfffe9eff0ff00f0f6ff1dc79889555655afc64664457efd75
+b594485445455445494674eefddeefdaecff039efb6466fd44124665584443345634544345554344
+59cfffe9eff0ff00f0f6ff1dc79889555655afc64664457efd75b594485445455445494674eefdde
+efdaecff039efb6466fd4412466558444334563454434555434459cfffe9eff0ff00f0f7ff1ef9ac
+796686455447eea64589dffffffddc669557656856684494cecba66c8eecff1aa8fefecb985677b6
+5554844434345346433456457899998effffadf0ff00f0f7ff1ef9ac796686455447eea64589dfff
+fffddc669557656856684494cecba66c8eecff1aa8fefecb985677b6555484443434534643345645
+7899998effffadf0ff00f0f7ff1ef9ac796686455447eea64589dffffffddc669557656856684494
+cecba66c8eecff1aa8fefecb985677b65554844434345346433456457899998effffadf0ff00f0f7
+ff1dc7ffeffb557555465bfe77ccfffecccbba568c9dfe8aefbed8dbfeeffd99ebff1bf57deef855
+4454555556534333453453345434644454444579fffbdff1ff00f0f7ff1dc7ffeffb557555465bfe
+77ccfffecccbba568c9dfe8aefbed8dbfeeffd99ebff1bf57deef855445455555653433345345334
+5434644454444579fffbdff1ff00f0f7ff1dc7ffeffb557555465bfe77ccfffecccbba568c9dfe8a
+efbed8dbfeeffd99ebff1bf57deef8554454555556534333453453345434644454444579fffbdff1
+ff00f0f8ff1efe9ffdedffe7445465959ffbefe967abbbcdcb97778999aaacceefffeb89dfeaff10
+94679d9964454555569a65664345334443fb44034568ffbef1ff00f0f8ff1efe9ffdedffe7445465
+959ffbefe967abbbcdcb97778999aaacceefffeb89dfeaff1094679d9964454555569a6566434533
+4443fb44034568ffbef1ff00f0f8ff1efe9ffdedffe7445465959ffbefe967abbbcdcb97778999aa
+acceefffeb89dfeaff1094679d9964454555569a65664345334443fb44034568ffbef1ff00f0f8ff
+0ef9ffc5457bff944545bd78ffe97aeffbff07edddccbccccccedee8ff1bfe96434689d556686887
+75874765675444443333344455789cfffaeff2ff00f0f8ff0ef9ffc5457bff944545bd78ffe97aef
+fbff07edddccbccccccedee8ff1bfe96434689d55668688775874765675444443333344455789cff
+faeff2ff00f0f8ff0ef9ffc5457bff944545bd78ffe97aeffbff07edddccbccccccedee8ff1bfe96
+434689d55668688775874765675444443333344455789cfffaeff2ff00f0f8ff0c9ddea6544469e8
+56567efceb9dd6ff05fda754445bdefdff04c65dfe5444fb33043446effebff2ff00f0f8ff0c9dde
+a6544469e856567efceb9dd6ff05fda754445bdefdff04c65dfe5444fb33043446effebff2ff00f0
+f8ff0c9ddea6544469e856567efceb9dd6ff05fda754445bdefdff04c65dfe5444fb33043446effe
+bff2ff00f0f9ff0cf8bc7559bb853459679aa9fe9dcbff03fea68ed6fd3307344456765467dfaff2
+ff00f0f9ff0cf8bc7559bb853459679aa9fe9dcbff03fea68ed6fd3307344456765467dfaff2ff00
+f0f9ff0cf8bc7559bb853459679aa9fe9dcbff03fea68ed6fd3307344456765467dfaff2ff00f0fa
+ff0dfd74469cb646bdb63459eeffd8efc9ff0dc7cd33334444588754334457dfccf2ff00f0faff0d
+fd74469cb646bdb63459eeffd8efc9ff0dc7cd33334444588754334457dfccf2ff00f0faff0dfd74
+469cb646bdb63459eeffd8efc9ff0dc7cd33334444588754334457dfccf2ff00f0faff0cf8964444
+5885457dc436cefb8ec7ff028ab445fd3305345676654debf2ff00f0faff0cf89644445885457dc4
+36cefb8ec7ff028ab445fd3305345676654debf2ff00f0faff0cf89644445885457dc436cefb8ec7
+ff028ab445fd3305345676654debf2ff00f0faff0bc8ffeb7444455444895befb9c6ff05fb8c9543
+3334fe4403577769faf2ff00f0faff0bc8ffeb7444455444895befb9c6ff05fb8c95433334fe4403
+577769faf2ff00f0faff0bc8ffeb7444455444895befb9c6ff05fb8c95433334fe4403577769faf2
+ff00f0fbff0cfe7cbbcacdb6444455666ffb9fc5ff02b8fc43fd330444455568caf2ff00f0fbff0c
+fe7cbbcacdb6444455666ffb9fc5ff02b8fc43fd330444455568caf2ff00f0fbff0cfe7cbbcacdb6
+444455666ffb9fc5ff02b8fc43fd330444455568caf2ff00f0fbff0be7e555444569a7444558dfd8
+c4ff0cfa7fb53334433333457abbebeff3ff00f0fbff0be7e555444569a7444558dfd8c4ff0cfa7f
+b53334433333457abbebeff3ff00f0fbff0be7e555444569a7444558dfd8c4ff0cfa7fb533344333
+33457abbebeff3ff00f0fbff0b9bfc9cea7544568855da8b8eedff05edbbaaaabcefddff0197e6fe
+330634578865569dcff3ff00f0fbff0b9bfc9cea7544568855da8b8eedff05edbbaaaabcefddff01
+97e6fe330634578865569dcff3ff00f0fbff0b9bfc9cea7544568855da8b8eedff05edbbaaaabcef
+ddff0197e6fe330634578865569dcff3ff00f0fcff0cfe7ffffeefffd9445776eff7dfefff09eb86
+7789998778778adff7ff02cbcdefecff0bfaa5333433433469dfffffbff3ff00f0fcff0cfe7ffffe
+efffd9445776eff7dfefff09eb867789998778778adff7ff02cbcdefecff0bfaa5333433433469df
+ffffbff3ff00f0fcff0cfe7ffffeefffd9445776eff7dfefff09eb867789998778778adff7ff02cb
+cdefecff0bfaa5333433433469dfffffbff3ff00f0fcff0bf9dfffcbaaabceeb556cffabefff0be7
+69cedbb9988aa9abba88cffaff05fea8998889adecff0a77344555455444467cffaff3ff00f0fcff
+0bf9dfffcbaaabceeb556cffabefff0be769cedbb9988aa9abba88cffaff05fea8998889adecff0a
+77344555455444467cffaff3ff00f0fcff0bf9dfffcbaaabceeb556cffabefff0be769cedbb9988a
+a9abba88cffaff05fea8998889adecff0a77344555455444467cffaff3ff00f0fcff0be8ff944433
+44446afb9efc8ff0ff0dfc69a899abdefeecba8668aa78cffcff07fb9aba988abdfcbdedff0ac874
+55544433344458ffbff3ff00f0fcff0be8ff94443344446afb9efc8ff0ff0dfc69a899abdefeecba
+8668aa78cffcff07fb9aba988abdfcbdedff0ac87455544433344458ffbff3ff00f0fcff0be8ff94
+443344446afb9efc8ff0ff0dfc69a899abdefeecba8668aa78cffcff07fb9aba988abdfcbdedff0a
+c87455544433344458ffbff3ff00f0fcff0a9dc856789a987544dfffe7f0ff03fd747adffaff04ec
+877667dffeff09e978879bcedba98aecbfeeff02f7da53fe3304344456efbff3ff00f0fcff0a9dc8
+56789a987544dfffe7f0ff03fd747adffaff04ec877667dffeff09e978879bcedba98aecbfeeff02
+f7da53fe3304344456efbff3ff00f0fcff0a9dc856789a987544dfffe7f0ff03fd747adffaff04ec
+877667dffeff09e978879bcedba98aecbfeeff02f7da53fe3304344456efbff3ff00f0fcff0a8f99
+8887765567977bffadf0ff01a58efeff04fdcfefffcefeff0feb8549ffffd9968ceffb5becfffc89
+efeeff0af9c85333333443344679cef3ff00f0fcff0a8f998887765567977bffadf0ff01a58efeff
+04fdcfefffcefeff0feb8549ffffd9968ceffb5becfffc89efeeff0af9c85333333443344679cef3
+ff00f0fcff0a8f998887765567977bffadf0ff01a58efeff04fdcfefffcefeff0feb8549ffffd996
+8ceffb5becfffc89efeeff0af9c85333333443344679cef3ff00f0fdff01faadfe4406568aa86576
+df9ff1ff1dfa8efffffeffff9c885de67cffec9bfd848ddab98effffe754547ffffe89eeff0afd9f
+645aa6434696445ecef3ff00f0fdff01faadfe4406568aa86576df9ff1ff1dfa8efffffeffff9c88
+5de67cffec9bfd848ddab98effffe754547ffffe89eeff0afd9f645aa6434696445ecef3ff00f0fd
+ff01faadfe4406568aa86576df9ff1ff1dfa8efffffeffff9c885de67cffec9bfd848ddab98effff
+e754547ffffe89eeff0afd9f645aa6434696445ecef3ff00f0fdff0bf666544565654458dec9bf9f
+f1ff009bfeff1af9c8d99aa9485967ee6766cf9c65be88befdca8d4447349aeffd8ceeff097d4433
+47984348684eddf3ff00f0fdff0bf666544565654458dec9bf9ff1ff009bfeff1af9c8d99aa94859
+67ee6766cf9c65be88befdca8d4447349aeffd8ceeff097d443347984348684eddf3ff00f0fdff0b
+f666544565654458dec9bf9ff1ff009bfeff1af9c8d99aa9485967ee6766cf9c65be88befdca8d44
+47349aeffd8ceeff097d443347984348684eddf3ff00f0fdff0bb888aaa8877655554ceffdbff2ff
+20e8cfffffc9b9aaab69b74b69586865565ba6d786b7559c5d644945a3465da9ea8eefff09786443
+3434685345bfbcf3ff00f0fdff0bb888aaa8877655554ceffdbff2ff20e8cfffffc9b9aaab69b74b
+69586865565ba6d786b7559c5d644945a3465da9ea8eefff097864433434685345bfbcf3ff00f0fd
+ff0bb888aaa8877655554ceffdbff2ff20e8cfffffc9b9aaab69b74b69586865565ba6d786b7559c
+5d644945a3465da9ea8eefff097864433434685345bfbcf3ff00f0fdff0b6efddb9865554445569f
+faeff2ff008efeff17887b8a8c57c668874758754764655a869e644566d548a394fe33025bd7dff0
+ff099a44333344447944bfbaf3ff00f0fdff0b6efddb9865554445569ffaeff2ff008efeff17887b
+8a8c57c668874758754764655a869e644566d548a394fe33025bd7dff0ff099a44333344447944bf
+baf3ff00f0fdff0b6efddb9865554445569ffaeff2ff008efeff17887b8a8c57c668874758754764
+655a869e644566d548a394fe33025bd7dff0ff099a44333344447944bfbaf3ff00f0feff0bfe7ffc
+544444555556666df8f2ff22f8cfbea86ea55d697e56d575a546458546554355a64ba454439b34c4
+54334333345a7bf0ff099d544555433445b65dbaf3ff00f0feff0bfe7ffc544444555556666df8f2
+ff22f8cfbea86ea55d697e56d575a546458546554355a64ba454439b34c454334333345a7bf0ff09
+9d544555433445b65dbaf3ff00f0feff0bfe7ffc544444555556666df8f2ff22f8cfbea86ea55d69
+7e56d575a546458546554355a64ba454439b34c454334333345a7bf0ff099d544555433445b65dba
+f3ff00f0feff02fbae95fc44034547eee9f2ff239cdd9bc65bd55d677f56e574c454459645544345
+6855d555654d7386453344533334b99ff1ff09ab4444345543454885a9f3ff00f0feff02fbae95fc
+44034547eee9f2ff239cdd9bc65bd55d677f56e574c4544596455443456855d555654d7386453344
+533334b99ff1ff09ab4444345543454885a9f3ff00f0feff02fbae95fc44034547eee9f2ff239cdd
+9bc65bd55d677f56e574c4544596455443456855d555654d7386453344533334b99ff1ff09ab4444
+345543454885a9f3ff00f0feff0bf8d9444578b9bcba75356e9cf3ff24f9aff768f549e55a857f55
+d463b4444595476454455655ab584844a3784643637443335bb8f1ff09baa443444345544448e9f3
+ff00f0feff0bf8d9444578b9bcba75356e9cf3ff24f9aff768f549e55a857f55d463b44445954764
+54455655ab584844a3784643637443335bb8f1ff09baa443444345544448e9f3ff00f0feff0bf8d9
+444578b9bcba75356e9cf3ff24f9aff768f549e55a857f55d463b4444595476454455655ab584844
+a3784643637443335bb8f1ff09baa443444345544448e9f3ff00f0feff0bf7fb59bba8754444458d
+ef8ff3ff25bce9fa56f648f659956f55d474944444a65784563455945b6594b4546c354363854333
+349b9ff2ff09aba433345533344346e9f3ff00f0feff0bf7fb59bba8754444458def8ff3ff25bce9
+fa56f648f659956f55d474944444a65784563455945b6594b4546c354363854333349b9ff2ff09ab
+a433345533344346e9f3ff00f0feff0bf7fb59bba8754444458def8ff3ff25bce9fa56f648f65995
+6f55d474944444a65784563455945b6594b4546c354363854333349b9ff2ff09aba4333455333443
+46e9f3ff00f0feff0bf7ffb854346788787569ce9ff4ff21fe8ff77655f645f756a46e55a4747445
+44b566a4754554a446846479864a45435375fe4301499cf2ff098d7643333568634446daf3ff00f0
+feff0bf7ffb854346788787569ce9ff4ff21fe8ff77655f645f756a46e55a474744544b566a47545
+54a446846479864a45435375fe4301499cf2ff098d7643333568634446daf3ff00f0feff0bf7ffb8
+54346788787569ce9ff4ff21fe8ff77655f645f756a46e55a474744544b566a4754554a446846479
+864a45435375fe4301499cf2ff098d7643333568634446daf3ff00f0feff0bf8ff84589876555676
+6acd9ff4ff21e7ee99b445e754e945945f54c584654544b577c46454548566458a5d5c3864446545
+fe43024486eff3ff0a7f8ac7333334774446faeff4ff00f0feff0bf8ff845898765556766acd9ff4
+ff21e7ee99b445e754e945945f54c584654544b577c46454548566458a5d5c3864446545fe430244
+86eff3ff0a7f8ac7333334774446faeff4ff00f0feff0bf8ff845898765556766acd9ff4ff21e7ee
+99b445e754e945945f54c584654544b577c46454548566458a5d5c3864446545fe43024486eff3ff
+0a7f8ac7333334774446faeff4ff00f0feff0bf8fe576544455666567ace9ff4ff278dbb6a9544d8
+54da45a46f64d584554644c576c4858554655788fe8b84478445464444534344467df4ff0bfe8e55
+44333334557554cbdff4ff00f0feff0bf8fe576544455666567ace9ff4ff278dbb6a9544d854da45
+a46f64d584554644c576c4858554655788fe8b84478445464444534344467df4ff0bfe8e55443333
+34557554cbdff4ff00f0feff0bf8fe576544455666567ace9ff4ff278dbb6a9544d854da45a46f64
+d584554644c576c4858554655788fe8b84478445464444534344467df4ff0bfe8e55443333345575
+54cbdff4ff00f0feff0bfafc57555666655654448d8ff5ff29f8cff6489735c854bc55c56e54d584
+454844c578d485a6755433a47cf96445b4454735446444344456dff5ff02faae57fd3304355854eb
+dff4ff00f0feff0bfafc57555666655654448d8ff5ff29f8cff6489735c854bc55c56e54d5844548
+44c578d485a6755433a47cf96445b4454735446444344456dff5ff02faae57fd3304355854ebdff4
+ff00f0feff0bfafc57555666655654448d8ff5ff29f8cff6489735c854bc55c56e54d584454844c5
+78d485a6755433a47cf96445b4454735446444344456dff5ff02faae57fd3304355854ebdff4ff00
+f0feff0bfdf9a44578adb985445bff8ff5ff299afff6488a34c954ad54d66e44d494444655b679d4
+a5c59666c9c445bfb343b54555364465443444456ef5ff03f8efd543fd330355a4cbeff4ff00f0fe
+ff0bfdf9a44578adb985445bff8ff5ff299afff6488a34c954ad54d66e44d494444655b679d4a5c5
+9666c9c445bfb343b54555364465443444456ef5ff03f8efd543fd330355a4cbeff4ff00f0feff0b
+fdf9a44578adb985445bff8ff5ff299afff6488a34c954ad54d66e44d494444655b679d4a5c59666
+c9c445bfb343b54555364465443444456ef5ff03f8efd543fd330355a4cbeff4ff00f0fdff0af67b
+dfea6546988655cf8ff6ff2afaadff55487c34c9549d44c76c44b4a5445546975bc4a5d4a55dfdc3
+334543437735553444564434443446f5ff04f7ffa43453fe3303347cebeff4ff00f0fdff0af67bdf
+ea6546988655cf8ff6ff2afaadff55487c34c9549d44c76c44b4a5445546975bc4a5d4a55dfdc333
+4543437735553444564434443446f5ff04f7ffa43453fe3303347cebeff4ff00f0fdff0af67bdfea
+6546988655cf8ff6ff2afaadff55487c34c9549d44c76c44b4a5445546975bc4a5d4a55dfdc33345
+43437735553444564434443446f5ff04f7ffa43453fe3303347cebeff4ff00f0feff0bfcf9fb8545
+6875543345cf8ff6ff2ba8fb9d44486e34a7549c45d66a4594a4444446685ca47694844ae5e53465
+554368345434445545454433446ef6ff0bf7fd533346334333345dfbeff4ff00f0feff0bfcf9fb85
+456875543345cf8ff6ff2ba8fb9d44486e34a7549c45d66a4594a4444446685ca47694844ae5e534
+65554368345434445545454433446ef6ff0bf7fd533346334333345dfbeff4ff00f0feff0bfcf9fb
+85456875543345cf8ff6ff2ba8fb9d44486e34a7549c45d66a4594a4444446685ca47694844ae5e5
+3465554368345434445545454433446ef6ff0bf7fd533346334333345dfbeff4ff00f0feff0bfbfe
+a558754444697657ff8ff7ff2dfa9ffe5e44466f45a7558b45e5763694b44544574d6c9576556347
+e4db747ca544683444344554454454353446eff7ff0ad6543433346434433489fbf3ff00f0feff0b
+fbfea558754444697657ff8ff7ff2dfa9ffe5e44466f45a7558b45e5763694b44544574d6c957655
+6347e4db747ca544683444344554454454353446eff7ff0ad6543433346434433489fbf3ff00f0fe
+ff0bfbfea558754444697657ff8ff7ff2dfa9ffe5e44466f45a7558b45e5763694b44544574d6c95
+76556347e4db747ca544683444344554454454353446eff7ff0ad6543433346434433489fbf3ff00
+f0feff0bfaee887544459b85448cfd9cf7ff2d9affff5b54565e5486547847d4644866844535457a
+4959fe9a6544d5affb4486866834443444644544643744468ef7ff0a958b433333364334347ffaf3
+ff00f0feff0bfaee887544459b85448cfd9cf7ff2d9affff5b54565e5486547847d4644866844535
+457a4959fe9a6544d5affb4486866834443444644544643744468ef7ff0a958b433333364334347f
+faf3ff00f0feff0bfaee887544459b85448cfd9cf7ff2d9affff5b54565e5486547847d464486684
+4535457a4959fe9a6544d5affb4486866834443444644544643744468ef7ff0a958b433333364334
+347ffaf3ff00f0feff0bfadc985459da534784578ad8f8ff2ff8bffbbf7844566f54855455488444
+464853543646696fedcdc84a46555effa543545b444443447446445547645ad7acf8ff0274d543fe
+3304543343affbf3ff00f0feff0bfadc985459da534784578ad8f8ff2ff8bffbbf7844566f548554
+55488444464853543646696fedcdc84a46555effa543545b444443447446445547645ad7acf8ff02
+74d543fe3304543343affbf3ff00f0feff0bfadc985459da534784578ad8f8ff2ff8bffbbf784456
+6f54855455488444464853543646696fedcdc84a46555effa543545b444443447446445547645ad7
+acf8ff0274d543fe3304543343affbf3ff00f0feff0bfb9ba56ce9534775444598f7f9ff30fe7cff
+fc5f9654556f655455445846a7577a556577bf777855547a7b683836acee63455c54454444645743
+65448457ed9af9ff02fb8663fd33043433436ffaf3ff00f0feff0bfb9ba56ce9534775444598f7f9
+ff30fe7cfffc5f9654556f655455445846a7577a556577bf777855547a7b683836acee63455c5445
+444464574365448457ed9af9ff02fb8663fd33043433436ffaf3ff00f0feff0bfb9ba56ce9534775
+444598f7f9ff30fe7cfffc5f9654556f655455445846a7577a556577bf777855547a7b683836acee
+63455c5445444464574365448457ed9af9ff02fb8663fd33043433436ffaf3ff00f0feff0cfe8eda
+e9444454465445bdeabffaff31e7dffece5eb555466f555474afd99d84aaa954578887445aedc4bf
+8a7a76633455335b7b8487446447a944644454448ff99ffaff0be7e834334334333343343afbf3ff
+00f0feff0cfe8edae9444454465445bdeabffaff31e7dffece5eb555466f555474afd99d84aaa954
+578887445aedc4bf8a7a76633455335b7b8487446447a944644454448ff99ffaff0be7e834334334
+333343343afbf3ff00f0feff0cfe8edae9444454465445bdeabffaff31e7dffece5eb555466f5554
+74afd99d84aaa954578887445aedc4bf8a7a76633455335b7b8487446447a944644454448ff99ffa
+ff0be7e834334334333343343afbf3ff00f0fdff0b7eec56b6434654445566ce9ffbff32fe7dffff
+7c7ba5565566487884963466556778887666789beffff65d9358c585455954ad8c73445534556644
+444334544cfe69faff0b7bd44334333343333334dfbef3ff00f0fdff0b7eec56b6434654445566ce
+9ffbff32fe7dffff7c7ba5565566487884963466556778887666789beffff65d9358c585455954ad
+8c73445534556644444334544cfe69faff0b7bd44334333343333334dfbef3ff00f0fdff0b7eec56
+b6434654445566ce9ffbff32fe7dffff7c7ba5565566487884963466556778887666789beffff65d
+9358c585455954ad8c73445534556644444334544cfe69faff0b7bd44334333343333334dfbef3ff
+00f0fdff0b7c94774445544454445bef8cfbff0ee8dfffffa887b46644886ec7458aeffaff00eefe
+ff19fe48ec535948437958f9566ab87dbefecaa967675574578de69ffcff02f87b63fa330234ef9f
+f3ff00f0fdff0b7c94774445544454445bef8cfbff0ee8dfffffa887b46644886ec7458aeffaff00
+eefeff19fe48ec535948437958f9566ab87dbefecaa967675574578de69ffcff02f87b63fa330234
+ef9ff3ff00f0fdff0b7c94774445544454445bef8cfbff0ee8dfffffa887b46644886ec7458aeffa
+ff00eefeff19fe48ec535948437958f9566ab87dbefecaa967675574578de69ffcff02f87b63fa33
+0234ef9ff3ff00f0fdff02a97bb6fe4406585446449ff8bffdff0dfe7effffaec7b6c46545bd7579
+cff3ff0dc57dc6335364543a58efffffb79ffeff11fdcb86557455cf97cffddeffea5564943334fe
+330434334afdaff3ff00f0fdff02a97bb6fe4406585446449ff8bffdff0dfe7effffaec7b6c46545
+bd7579cff3ff0dc57dc6335364543a58efffffb79ffeff11fdcb86557455cf97cffddeffea556494
+3334fe330434334afdaff3ff00f0fdff02a97bb6fe4406585446449ff8bffdff0dfe7effffaec7b6
+c46545bd7579cff3ff0dc57dc6335364543a58efffffb79ffeff11fdcb86557455cf97cffddeffea
+5564943334fe330434334afdaff3ff00f0fdff0cc9ec64444448754475345fff89fdff0bc8efffea
+6bc6b484959866aef1ff08fe745885443334549ffdff01b6effdff10fdb685554bfc654456b847e7
+e633433343fe3303436ff9eff3ff00f0fdff0cc9ec64444448754475345fff89fdff0bc8efffea6b
+c6b484959866aef1ff08fe745885443334549ffdff01b6effdff10fdb685554bfc654456b847e7e6
+33433343fe3303436ff9eff3ff00f0fdff0cc9ec64444448754475345fff89fdff0bc8efffea6bc6
+b484959866aef1ff08fe745885443334549ffdff01b6effdff10fdb685554bfc654456b847e7e633
+433343fe3303436ff9eff3ff00f0fdff1be7a644654595644853464cfff88dffffd99fffffc969e5
+9595746aeff8ff00eff9ff0dea454589333684dffffdeffffc6ffbff0ea555635cfec8668aeff764
+54233334fd33014bf9f2ff00f0fdff1be7a644654595644853464cfff88dffffd99fffffc969e595
+95746aeff8ff00eff9ff0dea454589333684dffffdeffffc6ffbff0ea555635cfec8668aeff76454
+233334fd33014bf9f2ff00f0fdff1be7a644654595644853464cfff88dffffd99fffffc969e59595
+746aeff8ff00eff9ff0dea454589333684dffffdeffffc6ffbff0ea555635cfec8668aeff7645423
+3334fd33014bf9f2ff00f0fdff10f7d6585468574476447445efffb988889dfeff058957e564459e
+f9ff03fea9568ff9ff0dfeedb845339d75bfffc57fffffb7fbff0cfee644338ebdfb99eac5333553
+fc33023467ccf2ff00f0fdff10f7d6585468574476447445efffb988889dfeff058957e564459ef9
+ff03fea9568ff9ff0dfeedb845339d75bfffc57fffffb7fbff0cfee644338ebdfb99eac5333553fc
+33023467ccf2ff00f0fdff10f7d6585468574476447445efffb988889dfeff058957e564459ef9ff
+03fea9568ff9ff0dfeedb845339d75bfffc57fffffb7fbff0cfee644338ebdfb99eac5333553fc33
+023467ccf2ff00f0fdff0cfab7a54674655764477544b9cffdff07fdecda5d56e437dffaff05feca
+aada35effbff10eeefffeedeb436e7487ff9a87efffff9affbff07cd55433444854344fe33084333
+43333334447a9ff2ff00f0fdff0cfab7a54674655764477544b9cffdff07fdecda5d56e437dffaff
+05fecaaada35effbff10eeefffeedeb436e7487ff9a87efffff9affbff07cd55433444854344fe33
+08433343333334447a9ff2ff00f0fdff0cfab7a54674655764477544b9cffdff07fdecda5d56e437
+dffaff05fecaaada35effbff10eeefffeedeb436e7487ff9a87efffff9affbff07cd554334448543
+44fe3308433343333334447a9ff2ff00f0fdff0cfc9e94664655764458473455cefdff06f99b875d
+75838ff9ff04c446655339fbff11fe7445effffef955b3346ec8646effffef6dfbff02db9443fd33
+0034f8330248fe9ff2ff00f0fdff0cfc9e94664655764458473455cefdff06f99b875d75838ff9ff
+04c446655339fbff11fe7445effffef955b3346ec8646effffef6dfbff02db9443fd330034f83302
+48fe9ff2ff00f0fdff0cfc9e94664655764458473455cefdff06f99b875d75838ff9ff04c4466553
+39fbff11fe7445effffef955b3346ec8646effffef6dfbff02db9443fd330034f8330248fe9ff2ff
+00f0fcff157f9764556664457464345577fddfffffea4a475d8434f9ff05fa444343336ffaff10d8
+44aeffefffd553338f9433afffffcfb7fbff03fbd54334fd330b4334433333343333443dfadff2ff
+00f0fcff157f9764556664457464345577fddfffffea4a475d8434f9ff05fa444343336ffaff10d8
+44aeffefffd553338f9433afffffcfb7fbff03fbd54334fd330b4334433333343333443dfadff2ff
+00f0fcff157f9764556664457464345577fddfffffea4a475d8434f9ff05fa444343336ffaff10d8
+44aeffefffd553338f9433afffffcfb7fbff03fbd54334fd330b4334433333343333443dfadff2ff
+00f0fcff158deb457866437655733543459b67ffffa947584b8357f9ff05e433344336effaff10fe
+a46cffeffc644358de6434dffffebff6fbff02fe9944f633044233343ceaf1ff00f0fcff158deb45
+7866437655733543459b67ffffa947584b8357f9ff05e433344336effaff10fea46cffeffc644358
+de6434dffffebff6fbff02fe9944f633044233343ceaf1ff00f0fcff158deb457866437655733543
+459b67ffffa947584b8357f9ff05e433344336effaff10fea46cffeffc644358de6434dffffebff6
+fbff02fe9944f633044233343ceaf1ff00f0fcff15bbfb669694455548434634554865faedb64559
+4a639ef9ff04934334338ffcff14d7558dfffaaacffffb4368adfe6338dfffffcff7effbff01c844
+fd33ff34fd330043fe33015e9ef1ff00f0fcff15bbfb669694455548434634554865faedb645594a
+639ef9ff04934334338ffcff14d7558dfffaaacffffb4368adfe6338dfffffcff7effbff01c844fd
+33ff34fd330043fe33015e9ef1ff00f0fcff15bbfb669694455548434634554865faedb645594a63
+9ef9ff04934334338ffcff14d7558dfffaaacffffb4368adfe6338dfffffcff7effbff01c844fd33
+ff34fd330043fe33015e9ef1ff00f0fcff14e9fb5d6b54465455444534544685f77e7645674545f9
+ff04fd4335337cfcff15b5335646fffffc8bbffea8aeffed733aabaadedff8effbff01f854fb3300
+43fc330334447bbff1ff00f0fcff14e9fb5d6b54465455444534544685f77e7645674545f9ff04fd
+4335337cfcff15b5335646fffffc8bbffea8aeffed733aabaadedff8effbff01f854fb330043fc33
+0334447bbff1ff00f0fcff14e9fb5d6b54465455444534544685f77e7645674545f9ff04fd433533
+7cfcff15b5335646fffffc8bbffea8aeffed733aabaadedff8effbff01f854fb330043fc33033444
+7bbff1ff00f0fcff14f8c5d896547544644444344555a5f75c6654664489f9ff04f6335438bffdff
+15f946aeff74efffffd58ffffefffffa94368dfc8ccff7faff01fb44f533024475a9f0ff00f0fcff
+14f8c5d896547544644444344555a5f75c6654664489f9ff04f6335438bffdff15f946aeff74efff
+ffd58ffffefffffa94368dfc8ccff7faff01fb44f533024475a9f0ff00f0fcff14f8c5d896547544
+644444344555a5f75c6654664489f9ff04f6335438bffdff15f946aeff74efffffd58ffffefffffa
+94368dfc8ccff7faff01fb44f533024475a9f0ff00f0fcff14fa6de875657456445454443654b6f5
+6a6754543bdff9ff04b4367469bffeff0afc65cfffff849fffffb69ffdff07f883357cfeebffe6fa
+ff02fd6543fe330334443334fd330253adccf0ff00f0fcff14fa6de875657456445454443654b6f5
+6a6754543bdff9ff04b4367469bffeff0afc65cfffff849fffffb69ffdff07f883357cfeebffe6fa
+ff02fd6543fe330334443334fd330253adccf0ff00f0fcff14fa6de875657456445454443654b6f5
+6a6754543bdff9ff04b4367469bffeff0afc65cfffff849fffffb69ffdff07f883357cfeebffe6fa
+ff02fd6543fe330334443334fd330253adccf0ff00f0fcff13fe8ffa75685655446463444555a5e5
+6a7845535ff9ff04fc537fdaf5fdff01a38ffeff05d44efffffaaefdff03f98334bffeff00b7faff
+03fb643343fe3302443334fe330343566e9ff0ff00f0fcff13fe8ffa75685655446463444555a5e5
+6a7845535ff9ff04fc537fdaf5fdff01a38ffeff05d44efffffaaefdff03f98334bffeff00b7faff
+03fb643343fe3302443334fe330343566e9ff0ff00f0fcff13fe8ffa75685655446463444555a5e5
+6a7845535ff9ff04fc537fdaf5fdff01a38ffeff05d44efffffaaefdff03f98334bffeff00b7faff
+03fb643343fe3302443334fe330343566e9ff0ff00f0fbff129ef75968545745544354455575b45a
+765443bff9ff04c57affffc6fdff0057fdff06f93dfffffc58effeff07fa53339efeffff8bf9ff02
+843343fe330944333334333433bf78cff0ff00f0fbff129ef75968545745544354455575b45a7654
+43bff9ff04c57affffc6fdff0057fdff06f93dfffffc58effeff07fa53339efeffff8bf9ff028433
+43fe330944333334333433bf78cff0ff00f0fbff129ef75968545745544354455575b45a765443bf
+f9ff04c57affffc6fdff0057fdff06f93dfffffc58effeff07fa53339efeffff8bf9ff02843343fe
+330944333334333433bf78cff0ff00f0fbff06cbfb5795456848fe44074555548559675434f9ff05
+fd9bafffff6afeff0cfc5dfffcb9876639fffffe54bffeff07fc533356779bff8df9ff02fc4435fe
+33ff44ff3304443646fe8aefff00f0fbff06cbfb5795456848fe44074555548559675434f9ff05fd
+9bafffff6afeff0cfc5dfffcb9876639fffffe54bffeff07fc533356779bff8df9ff02fc4435fe33
+ff44ff3304443646fe8aefff00f0fbff06cbfb5795456848fe44074555548559675434f9ff05fd9b
+afffff6afeff0cfc5dfffcb9876639fffffe54bffeff07fc533356779bff8df9ff02fc4435fe33ff
+44ff3304443646fe8aefff00f0fbff11f8fea9945895584534444956457459664437f8ff04e8efff
+fe4dfeff0cfa38fb5333433335cfffffc4bffeff01fe93fd3301597bf8ff0d743534333334443343
+535559fe8fefff00f0fbff11f8fea9945895584534444956457459664437f8ff04e8effffe4dfeff
+0cfa38fb5333433335cfffffc4bffeff01fe93fd3301597bf8ff0d743534333334443343535559fe
+8fefff00f0fbff11f8fea9945895584534444956457459664437f8ff04e8effffe4dfeff0cfa38fb
+5333433335cfffffc4bffeff01fe93fd3301597bf8ff0d743534333334443343535559fe8fefff00
+f0fbff11fbafff8678c4644434445c5645544b66644bf8ff04eefffffa6ffeff0cfd345333343338
+94bffffff6bffdff06d4354456875449f8ff01c434fe330834444543537cbfd8efefff00f0fbff11
+fbafff8678c4644434445c5645544b66644bf8ff04eefffffa6ffeff0cfd34533334333894bfffff
+f6bffdff06d4354456875449f8ff01c434fe330834444543537cbfd8efefff00f0fbff11fbafff86
+78c4644434445c5645544b66644bf8ff04eefffffa6ffeff0cfd34533334333894bffffff6bffdff
+06d4354456875449f8ff01c434fe330834444543537cbfd8efefff00f0faff058efff6c89474fe44
+076b5645555b67544ef5ff01f7affeff0cfe533334333338b97ffffffeadfdff07f6464545557744
+eff9ff0cf5333433334333453356fffb6eeeff00f0faff058efff6c89474fe44076b5645555b6754
+4ef5ff01f7affeff0cfe533334333338b97ffffffeadfdff07f6464545557744eff9ff0cf5333433
+334333453356fffb6eeeff00f0faff058efff6c89474fe44076b5645555b67544ef5ff01f7affeff
+0cfe533334333338b97ffffffeadfdff07f6464545557744eff9ff0cf5333433334333453356fffb
+6eeeff00f0faff10e8eff8ea7544734454886544555b56648ff5ff01f4effdff075335843345338a
+7dfeff0079fdff07fe469333435777cff9ff02f64445fe33064466659efa77dfeeff00f0faff10e8
+eff8ea7544734454886544555b56648ff5ff01f4effdff075335843345338a7dfeff0079fdff07fe
+469333435777cff9ff02f64445fe33064466659efa77dfeeff00f0faff10e8eff8ea754473445488
+6544555b56648ff5ff01f4effdff075335843345338a7dfeff0079fdff07fe469333435777cff9ff
+02f64445fe33064466659efa77dfeeff00f0faff10fd9dfceb6559533844a59554565a5554eff5ff
+00e6fdff08fe45bdc43344436edefeff0067fdff07fe747334334789eff9ff0bfb4446333344458e
+66b758efedff00f0faff10fd9dfceb6559533844a59554565a5554eff5ff00e6fdff08fe45bdc433
+44436edefeff0067fdff07fe747334334789eff9ff0bfb4446333344458e66b758efedff00f0faff
+10fd9dfceb6559533844a59554565a5554eff5ff00e6fdff08fe45bdc43344436edefeff0067fdff
+07fe747334334789eff9ff0bfb4446333344458e66b758efedff00f0f9ff0ef8efee669a43484585
+b4657649453cf4ff009afcff0b4cffd33333435daefffffe5dfdff01eec5fe330136bff8ff09fd69
+b643345874bd636bebff00f0f9ff0ef8efee669a43484585b4657649453cf4ff009afcff0b4cffd3
+3333435daefffffe5dfdff01eec5fe330136bff8ff09fd69b643345874bd636bebff00f0f9ff0ef8
+efee669a43484585b4657649453cf4ff009afcff0b4cffd33333435daefffffe5dfdff01eec5fe33
+0136bff8ff09fd69b643345874bd636bebff00f0f9ff0efe9fffa9b634a54768a5b55559549ff4ff
+007efcff0b88fef5333334775ffffff8affdff07feeb43333356768ff8ff07c9fb87dcfed876adea
+ff00f0f9ff0efe9fffa9b634a54768a5b55559549ff4ff007efcff0b88fef5333334775ffffff8af
+fdff07feeb43333356768ff8ff07c9fb87dcfed876adeaff00f0f9ff0efe9fffa9b634a54768a5b5
+5559549ff4ff007efcff0b88fef5333334775ffffff8affdff07feeb43333356768ff8ff07c9fb87
+dcfed876adeaff00f0f8ff0ccbffbae86594775d6684547655f3ff006ffcff07e77cdc433346a56f
+f7ff0583333377845ff8ff06f5668877778bdffcff03feffdfdffeff00fef6ff00f0f8ff0ccbffba
+e86594775d6684547655f3ff006ffcff07e77cdc433346a56ff7ff0583333377845ff8ff06f56688
+77778bdffcff03feffdfdffeff00fef6ff00f0f8ff0ccbffbae86594775d6684547655f3ff006ffc
+ff07e77cdc433346a56ff7ff0583333377845ff8ff06f5668877778bdffcff03feffdfdffeff00fe
+f6ff00f0f8ff0cfdaeefffda55b4ab586554954bf4ff01fc4efdff08feeda49fd88989b59ff7ff05
+d445569c94cff8ff03fbdedeeffcff0ddeffe58bff6e6ffffebde597bdbef9ff00f0f8ff0cfdaeef
+ffda55b4ab586554954bf4ff01fc4efdff08feeda49fd88989b59ff7ff05d445569c94cff8ff03fb
+dedeeffcff0ddeffe58bff6e6ffffebde597bdbef9ff00f0f8ff0cfdaeefffda55b4ab586554954b
+f4ff01fc4efdff08feeda49fd88989b59ff7ff05d445569c94cff8ff03fbdedeeffcff0ddeffe58b
+ff6e6ffffebde597bdbef9ff00f0f7ff0bfabdfffcbb49e6bf7654854ff4ff01f95efbff05fd67aa
+b75558f6ff05f945669859dff7ff008ffaff0fa4cff738fe579fcbfe76db549b6577affbff00f0f7
+ff0bfabdfffcbb49e6bf7654854ff4ff01f95efbff05fd67aab75558f6ff05f945669859dff7ff00
+8ffaff0fa4cff738fe579fcbfe76db549b6577affbff00f0f7ff0bfabdfffcbb49e6bf7654854ff4
+ff01f95efbff05fd67aab75558f6ff05f945669859dff7ff008ffaff0fa4cff738fe579fcbfe76db
+549b6577affbff00f0f6ff0afcacfc94aa79fd6855578ff4ff01f59efbff05eefd989abdeff5ff03
+947757daf6ff009dfaff0ffb5dff56fd45eb48dfa55d849b46b6effbff00f0f6ff0afcacfc94aa79
+fd6855578ff4ff01f59efbff05eefd989abdeff5ff03947757daf6ff009dfaff0ffb5dff56fd45eb
+48dfa55d849b46b6effbff00f0f6ff0afcacfc94aa79fd6855578ff4ff01f59efbff05eefd989abd
+eff5ff03947757daf6ff009dfaff0ffb5dff56fd45eb48dfa55d849b46b6effbff00f0f5ff09feba
+befecffcde8cd5dff4ff01e6aefaff03feefffeef4ff03f64dfffcf6ff00e8f9ff0dd6efd8ee5dd4
+36bff846d48c4c6efaff00f0f5ff09febabefecffcde8cd5dff4ff01e6aefaff03feefffeef4ff03
+f64dfffcf6ff00e8f9ff0dd6efd8ee5dd436bff846d48c4c6efaff00f0f5ff09febabefecffcde8c
+d5dff4ff01e6aefaff03feefffeef4ff03f64dfffcf6ff00e8f9ff0dd6efd8ee5dd436bff846d48c
+4c6efaff00f0f3ffffbb00cefeff00e5f3ff0198ccf8ff01efdff4ff04fd58fff97ff7ff00f8f9ff
+0efa6fffffec59358876446467558aeffbff00f0f3ffffbb00cefeff00e5f3ff0198ccf8ff01efdf
+f4ff04fd58fff97ff7ff00f8f9ff0efa6fffffec59358876446467558aeffbff00f0f3ffffbb00ce
+feff00e5f3ff0198ccf8ff01efdff4ff04fd58fff97ff7ff00f8f9ff0efa6fffffec593588764464
+67558aeffbff00f0f1ff04ecbcceff69f3ff025cfacee9ff03a4cffb58f7ff01fbcffbff0fcaa957
+766664678889bdeff9fffffebffbff00f0f1ff04ecbcceff69f3ff025cfacee9ff03a4cffb58f7ff
+01fbcffbff0fcaa957766664678889bdeff9fffffebffbff00f0f1ff04ecbcceff69f3ff025cface
+e9ff03a4cffb58f7ff01fbcffbff0fcaa957766664678889bdeff9fffffebffbff00f0efff02fdc9
+4ef4ff03fd3efbcde9ff04f77ffe46dff7ff009ffbff047bcc89bceffbff00fafeff00bffbff00f0
+efff02fdc94ef4ff03fd3efbcde9ff04f77ffe46dff7ff009ffbff047bcc89bceffbff00fafeff00
+bffbff00f0efff02fdc94ef4ff03fd3efbcde9ff04f77ffe46dff7ff009ffbff047bcc89bceffbff
+00fafeff00bffbff00f0eeff01f96ff4ff03f73cfedde9ff04fb4dffa78ef7ff00dafbff028fffcf
+f9ff04fafffffebffbff00f0eeff01f96ff4ff03f73cfedde9ff04fb4dffa78ef7ff00dafbff028f
+ffcff9ff04fafffffebffbff00f0eeff01f96ff4ff03f73cfedde9ff04fb4dffa78ef7ff00dafbff
+028fffcff9ff04fafffffebffbff00f0eeff01f4cff4ff03d54efffee8ff0498fff5d7eef8ff01f9
+effcff029ffeaffdff08eddbba9997ab79adbffbff00f0eeff01f4cff4ff03d54efffee8ff0498ff
+f5d7eef8ff01f9effcff029ffeaffdff08eddbba9997ab79adbffbff00f0eeff01f4cff4ff03d54e
+fffee8ff0498fff5d7eef8ff01f9effcff029ffeaffdff08eddbba9997ab79adbffbff00f0eeff00
+c6f3ff027956dfe7ff04e5eff78e7df8ff01fe9ffdff10fd787658a987765445785796a8dd55a9cf
+fbff00f0eeff00c6f3ff027956dfe7ff04e5eff78e7df8ff01fe9ffdff10fd787658a98776544578
+5796a8dd55a9cffbff00f0eeff00c6f3ff027956dfe7ff04e5eff78e7df8ff01fe9ffdff10fd7876
+58a987765445785796a8dd55a9cffbff00f0eeff007af4ff02fc5fb7e6ff05f56ff95fe9cff8ff00
+dbfdff0ffe9a7684bbb968d74bff78f9fedf97dffaff00f0eeff007af4ff02fc5fb7e6ff05f56ff9
+5fe9cff8ff00dbfdff0ffe9a7684bbb968d74bff78f9fedf97dffaff00f0eeff007af4ff02fc5fb7
+e6ff05f56ff95fe9cff8ff00dbfdff0ffe9a7684bbb968d74bff78f9fedf97dffaff00f0efff01fe
+4ef4ff02f78f95f1ff00edf7ff06fd5dfa4effaaeff9ff01fbdffcff0d9bd5fffe6af94aff77f9ff
+efe7dffaff00f0efff01fe4ef4ff02f78f95f1ff00edf7ff06fd5dfa4effaaeff9ff01fbdffcff0d
+9bd5fffe6af94aff77f9ffefe7dffaff00f0efff01fe4ef4ff02f78f95f1ff00edf7ff06fd5dfa4e
+ffaaeff9ff01fbdffcff0d9bd5fffe6af94aff77f9ffefe7dffaff00f0efff01fb6ff4ff03c4efb6
+8ef4ff05feeeb4aeffecf9ff0688fc4afffe89eff9ff00aefcff0d8bb5ffff6afa49ff77f9fffff7
+dffaff00f0efff01fb6ff4ff03c4efb68ef4ff05feeeb4aeffecf9ff0688fc4afffe89eff9ff00ae
+fcff0d8bb5ffff6afa49ff77f9fffff7dffaff00f0efff01fb6ff4ff03c4efb68ef4ff05feeeb4ae
+ffecf9ff0688fc4afffe89eff9ff00aefcff0d8bb5ffff6afa49ff77f9fffff7dffaff00f0efff01
+f7aff5ff05fe59ffd85eeff5ff0596678959ddddf9ff07e6bd59fffffd99aefaff01f98efdff0d6b
+c5ffff5afa48ff86f8ffeff7dffaff00f0efff01f7aff5ff05fe59ffd85eeff5ff0596678959dddd
+f9ff07e6bd59fffffd99aefaff01f98efdff0d6bc5ffff5afa48ff86f8ffeff7dffaff00f0efff01
+f7aff5ff05fe59ffd85eeff5ff0596678959ddddf9ff07e6bd59fffffd99aefaff01f98efdff0d6b
+c5ffff5afa48ff86f8ffeff7dffaff00f0efff01f4eff5ff05f77ffffc668ff2ff05c8667878888b
+fcff02fb6c59fdff02d98beffbff01e8effeff0d7ad6fffe5afb49ff75f8fffff7dffaff00f0efff
+01f4eff5ff05f77ffffc668ff2ff05c8667878888bfcff02fb6c59fdff02d98beffbff01e8effeff
+0d7ad6fffe5afb49ff75f8fffff7dffaff00f0efff01f4eff5ff05f77ffffc668ff2ff05c8667878
+888bfcff02fb6c59fdff02d98beffbff01e8effeff0d7ad6fffe5afb49ff75f8fffff7dffaff00f0
+efff00c5f4ff05a6efffff754df3ff05ecbcccddeeeffaff01685afcff03fb78adeffeff02ebaaef
+feff0d7bd6ffff4bfb4aff75f8fffff7dffaff00f0efff00c5f4ff05a6efffff754df3ff05ecbccc
+ddeeeffaff01685afcff03fb78adeffeff02ebaaeffeff0d7bd6ffff4bfb4aff75f8fffff7dffaff
+00f0efff00c5f4ff05a6efffff754df3ff05ecbcccddeeeffaff01685afcff03fb78adeffeff02eb
+aaeffeff0d7bd6ffff4bfb4aff75f8fffff7dffaff00f0efff0089f5ff01e76ffeff01fb6bf5ff06
+fd66787765458df9ff01a46cfaff05c988999989befcff0d7bc7ffff5afc59ff76f8fffff6dffaff
+00f0efff0089f5ff01e76ffeff01fb6bf5ff06fd66787765458df9ff01a46cfaff05c988999989be
+fcff0d7bc7ffff5afc59ff76f8fffff6dffaff00f0efff0089f5ff01e76ffeff01fb6bf5ff06fd66
+787765458df9ff01a46cfaff05c988999989befcff0d7bc7ffff5afc59ff76f8fffff6dffaff00f0
+efff005ef6ff02fe55dffdff00abf5ff01f5affeff03feb858effbff01d54eefff0d8bc7fffe4afc
+5aff77f8fffff6effaff00f0efff005ef6ff02fe55dffdff00abf5ff01f5affeff03feb858effbff
+01d54eefff0d8bc7fffe4afc5aff77f8fffff6effaff00f0efff005ef6ff02fe55dffdff00abf5ff
+01f5affeff03feb858effbff01d54eefff0d8bc7fffe4afc5aff77f8fffff6effaff00f0f0ff01fb
+5ff6ff01c44dfcff00eff5ff0098fbff01d74bfbff02fc4beff0ff0d7bb7fffe4afd4aff87f8ffff
+f6effaff00f0f0ff01fb5ff6ff01c44dfcff00eff5ff0098fbff01d74bfbff02fc4beff0ff0d7bb7
+fffe4afd4aff87f8fffff6effaff00f0f0ff01fb5ff6ff01c44dfcff00eff5ff0098fbff01d74bfb
+ff02fc4beff0ff0d7bb7fffe4afd4aff87f8fffff6effaff00f0f0ff01f6bff7ff02fd44cff0ff01
+fc4dfaff01b58efbff0474dfedc88af3ff0d7bb7fffe49fe4bff78f7fffff6effaff00f0f0ff01f6
+bff7ff02fd44cff0ff01fc4dfaff01b58efbff0474dfedc88af3ff0d7bb7fffe49fe4bff78f7ffff
+f6effaff00f0f0ff01f6bff7ff02fd44cff0ff01fc4dfaff01b58efbff0474dfedc88af3ff0d7bb7
+fffe49fe4bff78f7fffff6effaff00f0f0ff00b5f6ff01b55cefff04f6cfb6448efcff01a5affcff
+0596544557776df4ff0d7bb7fffe49fe4cff78f8fffff6effaff00f0f0ff00b5f6ff01b55cefff04
+f6cfb6448efcff01a5affcff0596544557776df4ff0d7bb7fffe49fe4cff78f8fffff6effaff00f0
+f0ff00b5f6ff01b55cefff04f6cfb6448efcff01a5affcff0596544557776df4ff0d7bb7fffe49fe
+4cff78f8fffff6effaff00f0f1ff01fe5cf8ff03fea658efefff05e6f8357755dffdff02fd66bffc
+ff00fefeff01d5eff5ff0d7ba8fffe49fe4cff88f7fffff6effaff00f0f1ff01fe5cf8ff03fea658
+efefff05e6f8357755dffdff02fd66bffcff00fefeff01d5eff5ff0d7ba8fffe49fe4cff88f7ffff
+f6effaff00f0f1ff01fe5cf8ff03fea658efefff05e6f8357755dffdff02fd66bffcff00fefeff01
+d5eff5ff0d7ba8fffe49fe4cff88f7fffff6effaff00f0f1ff01f59ff9ff03eb7457afeeff05a8a3
+7ffffceffcff02fa57dff9ff01fa8ff5ff0d7bb8fffd4afe4dff89f7fffff6effaff00f0f1ff01f5
+9ff9ff03eb7457afeeff05a8a37ffffceffcff02fa57dff9ff01fa8ff5ff0d7bb8fffd4afe4dff89
+f7fffff6effaff00f0f1ff01f59ff9ff03eb7457afeeff05a8a37ffffceffcff02fa57dff9ff01fa
+8ff5ff0d7bb8fffd4afe4dff89f7fffff6effaff00f0f1ff0086fbff05eca876678ccdedff027d53
+bff8ff01e75bf8ff005ff5ff0c7cb8fffd4afe4cffacf8fffff6f9ff00f0f1ff0086fbff05eca876
+678ccdedff027d53bff8ff01e75bf8ff005ff5ff0c7cb8fffd4afe4cffacf8fffff6f9ff00f0f1ff
+0086fbff05eca876678ccdedff027d53bff8ff01e75bf8ff005ff5ff0c7cb8fffd4afe4cffacf8ff
+fff6f9ff00f0f2ff01fa4efdff08fb75468beffe9db9efeeff026d84eff7ff0185aff9ff006df5ff
+0c6cb8fffc4bfb4dff8cf7fffff5f9ff00f0f2ff01fa4efdff08fb75468beffe9db9efeeff026d84
+eff7ff0185aff9ff006df5ff0c6cb8fffc4bfb4dff8cf7fffff5f9ff00f0f2ff01fa4efdff08fb75
+468beffe9db9efeeff026d84eff7ff0185aff9ff006df5ff0c6cb8fffc4bfb4dff8cf7fffff5f9ff
+00f0f2ff01a4dffeff03f95799bffeff02fa8abfeeff076dc5ffffc74579effcff00faf8ff008bf5
+ff0c6ca9fffc4bfb4cff8cf7fffff5f9ff00f0f2ff01a4dffeff03f95799bffeff02fa8abfeeff07
+6dc5ffffc74579effcff00faf8ff008bf5ff0c6ca9fffc4bfb4cff8cf7fffff5f9ff00f0f2ff01a4
+dffeff03f95799bffeff02fa8abfeeff076dc5ffffc74579effcff00faf8ff008bf5ff0c6ca9fffc
+4bfb4cff8cf7fffff5f9ff00f0f3ff01fa4cfdff0284efe9fdff02fe87bfeeff07befdffff75dca6
+5ef2ff00a9f5ff0c6da9fffc4bfb4cff8bf7fffff5f9ff00f0f3ff01fa4cfdff0284efe9fdff02fe
+87bfeeff07befdffff75dca65ef2ff00a9f5ff0c6da9fffc4bfb4cff8bf7fffff5f9ff00f0f3ff01
+fa4cfdff0284efe9fdff02fe87bfeeff07befdffff75dca65ef2ff00a9f5ff0c6da9fffc4bfb4cff
+8bf7fffff5f9ff00f0f3ff0173bffeff03fd4bff9dfcff01c4efeeff07dcfffffe43643567f2ff00
+a9f5ff0c6c99fffb4bfb4cff8cf7fffff5f9ff00f0f3ff0173bffeff03fd4bff9dfcff01c4efeeff
+07dcfffffe43643567f2ff00a9f5ff0c6c99fffb4bfb4cff8cf7fffff5f9ff00f0f3ff0173bffeff
+03fd4bff9dfcff01c4efeeff07dcfffffe43643567f2ff00a9f5ff0c6c99fffb4bfb4cff8cf7ffff
+f5f9ff00f0f4ff01f939fdff03f66fff7ffcff00f6f2ff00cefaff06fe433333569adff5ff01db7c
+f5ff0c5d99fffb4aa539ff7cf7fffff5f9ff00f0f4ff01f939fdff03f66fff7ffcff00f6f2ff00ce
+faff06fe433333569adff5ff01db7cf5ff0c5d99fffb4aa539ff7cf7fffff5f9ff00f0f4ff01f939
+fdff03f66fff7ffcff00f6f2ff00cefaff06fe433333569adff5ff01db7cf5ff0c5d99fffb4aa539
+ff7cf7fffff5f9ff00f0f4ff01f57ffdff03b4bfff7ffcff01f7bff4ff01edeffaff06fe6333333b
+546ef6ff02fe875ff5ff0c6da9fffb479dc6bf6cf7fffff5f9ff00f0f4ff01f57ffdff03b4bfff7f
+fcff01f7bff4ff01edeffaff06fe6333333b546ef6ff02fe875ff5ff0c6da9fffb479dc6bf6cf7ff
+fff5f9ff00f0f4ff01f57ffdff03b4bfff7ffcff01f7bff4ff01edeffaff06fe6333333b546ef6ff
+02fe875ff5ff0c6da9fffb479dc6bf6cf7fffff5f9ff00f0f4ff09f4effea69ec849fffe8ffcff01
+f85ff6ff02fe866df8ff05e633334d553af6ff02f7577ff5ff0c5db8fffb46ffec5e6cf7fffff5f9
+ff00f0f4ff09f4effea69ec849fffe8ffcff01f85ff6ff02fe866df8ff05e633334d553af6ff02f7
+577ff5ff0c5db8fffb46ffec5e6cf7fffff5f9ff00f0f4ff09f4effea69ec849fffe8ffcff01f85f
+f6ff02fe866df8ff05e633334d553af6ff02f7577ff5ff0c5db8fffb46ffec5e6cf7fffff5f9ff00
+f0f4ff09f77863577347dffffb9ffcff01f95bf6ff01d6aef6ff04b8aeff5b46f6ff0283447ff5ff
+0c6ec8fffb4afff9344497ffffe5f9ff00f0f4ff09f77863577347dffffb9ffcff01f95bf6ff01d6
+aef6ff04b8aeff5b46f6ff0283447ff5ff0c6ec8fffb4afff9344497ffffe5f9ff00f0f4ff09f778
+63577347dffffb9ffcff01f95bf6ff01d6aef6ff04b8aeff5b46f6ff0283447ff5ff0c6ec8fffb4a
+fff9344497ffffe5f9ff00f0f4ff09fe99abfffedffffffabffcff01f8c9f6ff005df2ff026cb3ef
+f8ff03f84334cff5ff0c5eb9fffb38ffe46745a7fffeb6f9ff00f0f4ff09fe99abfffedffffffabf
+fcff01f8c9f6ff005df2ff026cb3eff8ff03f84334cff5ff0c5eb9fffb38ffe46745a7fffeb6f9ff
+00f0f4ff09fe99abfffedffffffabffcff01f8c9f6ff005df2ff026cb3eff8ff03f84334cff5ff0c
+5eb9fffb38ffe46745a7fffeb6f9ff00f0ecff01f9dffcfffff8f2ff01baeff7ff025ce4aff9ff03
+fe743337f4ff0c5eb8fffa45ffe5ff6cf7eadda6f9ff00f0ecff01f9dffcfffff8f2ff01baeff7ff
+025ce4aff9ff03fe743337f4ff0c5eb8fffa45ffe5ff6cf7eadda6f9ff00f0ecff01f9dffcfffff8
+f2ff01baeff7ff025ce4aff9ff03fe743337f4ff0c5eb8fffa45ffe5ff6cf7eadda6f9ff00f0ecff
+01f8dffcfffff8f3ff05c5464afffffefbff03fe6ff57ffaff04feb643345ef4ff0c4eb8fff944cf
+88ff5bf7a37ba6f9ff00f0ecff01f8dffcfffff8f3ff05c5464afffffefbff03fe6ff57ffaff04fe
+b643345ef4ff0c4eb8fff944cf88ff5bf7a37ba6f9ff00f0ecff01f8dffcfffff8f3ff05c5464aff
+fffefbff03fe6ff57ffaff04feb643345ef4ff0c4eb8fff944cf88ff5bf7a37ba6f9ff00f0ecff01
+f9cffcff01f9e7f3ff05aedfe5bffdeff9ff01f99ffbff05eed7433346bff4ff0c4db9fff846df59
+ff6bf7a35ca7f9ff00f0ecff01f9cffcff01f9e7f3ff05aedfe5bffdeff9ff01f99ffbff05eed743
+3346bff4ff0c4db9fff846df59ff6bf7a35ca7f9ff00f0ecff01f9cffcff01f9e7f3ff05aedfe5bf
+fdeff9ff01f99ffbff05eed7433346bff4ff0c4db9fff846df59ff6bf7a35ca7f9ff00f0ecff01f9
+cffcff02fac8dff2ff02fc4df8f0ff04fc64333378f3ff0c4ca9fff639ee84af5bf7834b97f9ff00
+f0ecff01f9cffcff02fac8dff2ff02fc4df8f0ff04fc64333378f3ff0c4ca9fff639ee84af5bf783
+4b97f9ff00f0ecff01f9cffcff02fac8dff2ff02fc4df8f0ff04fc64333378f3ff0c4ca9fff639ee
+84af5bf7834b97f9ff00f0ecff01fabffbff01a85ef1ff0179e8f1ff05fe853333356ef3ff0c4da5
+585445759a5a5bf7c69b97f9ff00f0ecff01fabffbff01a85ef1ff0179e8f1ff05fe853333356ef3
+ff0c4da5585445759a5a5bf7c69b97f9ff00f0ecff01fabffbff01a85ef1ff0179e8f1ff05fe8533
+33356ef3ff0c4da5585445759a5a5bf7c69b97f9ff00f0ecff01fb9ffaff0097f1ff01d6aaf1ff05
+e743433346dff3ff0c4da85eedba8654444bf7edfb97f9ff00f0ecff01fb9ffaff0097f1ff01d6aa
+f1ff05e743433346dff3ff0c4da85eedba8654444bf7edfb97f9ff00f0ecff01fb9ffaff0097f1ff
+01d6aaf1ff05e743433346dff3ff0c4da85eedba8654444bf7edfb97f9ff00f0ecff01fd8ffaff01
+e6cff2ff01f96af2ff05fe743433346ef2ff0c5d8668aceffffffe5bf7effc97f9ff00f0ecff01fd
+8ffaff01e6cff2ff01f96af2ff05fe743433346ef2ff0c5d8668aceffffffe5bf7effc97f9ff00f0
+ecff01fd8ffaff01e6cff2ff01f96af2ff05fe743433346ef2ff0c5d8668aceffffffe5bf7effc97
+f9ff00f0ecff01fe7ffaff01f89ff2ff01fe58f4ff07feede744443346dff2ff0c7d746456555666
+685bf7fffd98f9ff00f0ecff01fe7ffaff01f89ff2ff01fe58f4ff07feede744443346dff2ff0c7d
+746456555666685bf7fffd98f9ff00f0ecff01fe7ffaff01f89ff2ff01fe58f4ff07feede7444433
+46dff2ff0c7d746456555666685bf7fffd98f9ff00f0ebff007ffaff01eb8ff1ff00b5f2ff05c889
+755459eff2ff0c6c8555bfffffec585bf7fffda8f9ff00f0ebff007ffaff01eb8ff1ff00b5f2ff05
+c889755459eff2ff0c6c8555bfffffec585bf7fffda8f9ff00f0ebff007ffaff01eb8ff1ff00b5f2
+ff05c889755459eff2ff0c6c8555bfffffec585bf7fffda8f9ff00f0ebff007ffaff01bd8ff1ff01
+f6cff3ff09eeffedbafd8efffeeedff7ff04fe696597fefeff05d55bf6fffea9f9ff00f0ebff007f
+faff01bd8ff1ff01f6cff3ff09eeffedbafd8efffeeedff7ff04fe696597fefeff05d55bf6fffea9
+f9ff00f0ebff007ffaff01bd8ff1ff01f6cff3ff09eeffedbafd8efffeeedff7ff04fe696597fefe
+ff05d55bf6fffea9f9ff00f0ebff007efaff01db9cf1ff01fb8feeff06fb67656764666dfaff0efd
+84434658abceeeecb64af6fffea8f9ff00f0ebff007efaff01db9cf1ff01fb8feeff06fb67656764
+666dfaff0efd84434658abceeeecb64af6fffea8f9ff00f0ebff007efaff01db9cf1ff01fb8feeff
+06fb67656764666dfaff0efd84434658abceeeecb64af6fffea8f9ff00f0ebff009bfaff01f9c8f0
+ff007eedff05ccfffebefe7afaff0ef86aa98999a8764444364af6fffea9f9ff00f0ebff009bfaff
+01f9c8f0ff007eedff05ccfffebefe7afaff0ef86aa98999a8764444364af6fffea9f9ff00f0ebff
+009bfaff01f9c8f0ff007eedff05ccfffebefe7afaff0ef86aa98999a8764444364af6fffea9f9ff
+00f0ebff00bafaff02fe95acf1ff00d8edff06fbdf97cceee6effbff0eb86544665567594666444a
+e6fffd9af9ff00f0ebff00bafaff02fe95acf1ff00d8edff06fbdf97cceee6effbff0eb865446655
+67594666444ae6fffd9af9ff00f0ebff00bafaff02fe95acf1ff00d8edff06fbdf97cceee6effbff
+0eb86544665567594666444ae6fffd9af9ff00f0ebff00d8f9ff03fbcb88eff3ff01fd8feeff06fe
+9eb4386efc7ffbff0efeb764957acb5756544649d5fffd8af9ff00f0ebff00d8f9ff03fbcb88eff3
+ff01fd8feeff06fe9eb4386efc7ffbff0efeb764957acb5756544649d5fffd8af9ff00f0ebff00d8
+f9ff03fbcb88eff3ff01fd8feeff06fe9eb4386efc7ffbff0efeb764957acb5756544649d5fffd8a
+f9ff00f0ebff00f7f9ff04fcbffd88eff3ff00c9eeff06fd7ed5439eff8af9ff0ce5f7aefe6ecdbd
+dc58d6fffc8af9ff00f0ebff00f7f9ff04fcbffd88eff3ff00c9eeff06fd7ed5439eff8af9ff0ce5
+f7aefe6ecdbddc58d6fffc8af9ff00f0ebff00f7f9ff04fcbffd88eff3ff00c9eeff06fd7ed5439e
+ff8af9ff0ce5f7aefe6ecdbddc58d6fffc8af9ff00f0ebff00f7f8ff03baacfd7cf3ff01fc9ff2ff
+0aeffebaa638e8547fffd5dffaff0ce5f6adec58deebba57e6fffb8af9ff00f0ebff00f7f8ff03ba
+acfd7cf3ff01fc9ff2ff0aeffebaa638e8547fffd5dffaff0ce5f6adec58deebba57e6fffb8af9ff
+00f0ebff00f7f8ff03baacfd7cf3ff01fc9ff2ff0aeffebaa638e8547fffd5dffaff0ce5f6adec58
+deebba57e6fffb8af9ff00f0ebff01facff8ff03eb9cf7dff3ff0186cff7ff0ec96655556798674a
+54ba555cfffc6dfbff10feb5b76554445569a738f6fffa88ccccdffcff00f0ebff01facff8ff03eb
+9cf7dff3ff0186cff7ff0ec96655556798674a54ba555cfffc6dfbff10feb5b76554445569a738f6
+fffa88ccccdffcff00f0ebff01facff8ff03eb9cf7dff3ff0186cff7ff0ec96655556798674a54ba
+555cfffc6dfbff10feb5b76554445569a738f6fffa88ccccdffcff00f0ebff01fd9ff7ff02fab86a
+f3ff1be749effecbceefffeed996543344444333334bdeb36a454779bec68efcff00b6fc440b5444
+564ae6fffd855554456dfdff00f0ebff01fd9ff7ff02fab86af3ff1be749effecbceefffeed99654
+3344444333334bdeb36a454779bec68efcff00b6fc440b5444564ae6fffd855554456dfdff00f0eb
+ff01fd9ff7ff02fab86af3ff1be749effecbceefffeed996543344444333334bdeb36a454779bec6
+8efcff00b6fc440b5444564ae6fffd855554456dfdff00f0eaff006ff7ff02fe99e7f2ff08a45553
+3469cdcdb643fa3322349ffff73435469766774688898899996444455555455555454af6ffff8645
+4444489afeff00f0eaff006ff7ff02fe99e7f2ff08a455533469cdcdb643fa3322349ffff7343546
+9766774688898899996444455555455555454af6ffff86454444489afeff00f0eaff006ff7ff02fe
+99e7f2ff08a455533469cdcdb643fa3322349ffff734354697667746888988999964444555554555
+55454af6ffff86454444489afeff00f0eaff008df7ff02f9e8f8f2ff06fc445bdcdb9754fc331034
+44334438fffffd455844678bdfdacebafeab00a8fb990f98775cf5efff78bbcbaaaab77ffffff0ea
+ff008df7ff02f9e8f8f2ff06fc445bdcdb9754fc33103444334438fffffd455844678bdfdacebafe
+ab00a8fb990f98775cf5efff78bbcbaaaab77ffffff0eaff008df7ff02f9e8f8f2ff06fc445bdcdb
+9754fc33103444334438fffffd455844678bdfdacebafeab00a8fb990f98775cf5efff78bbcbaaaa
+b77ffffff0eaff00d8f7ff02f8d9acf1ff04e534444343fd33134433456655437ffffffe466857ec
+a37be8788767fe8815778799998aaabbba5bc5efff7899866658869ffffff0eaff00d8f7ff02f8d9
+acf1ff04e534444343fd33134433456655437ffffffe466857eca37be8788767fe8815778799998a
+aabbba5bc5efff7899866658869ffffff0eaff00d8f7ff02f8d9acf1ff04e534444343fd33134433
+456655437ffffffe466857eca37be8788767fe8815778799998aaabbba5bc5efff7899866658869f
+fffff0eaff00f7f7ff02f98e8ef1ff0ffc74333334688887abcbaaefefded9affeff22488666fed3
+47c49ddcbbaabbba75a469c85cccdccb7db5cffe7cfff8bd6ff9cffffff0eaff00f7f7ff02f98e8e
+f1ff0ffc74333334688887abcbaaefefded9affeff22488666fed347c49ddcbbaabbba75a469c85c
+ccdccb7db5cffe7cfff8bd6ff9cffffff0eaff00f7f7ff02f98e8ef1ff0ffc74333334688887abcb
+aaefefded9affeff22488666fed347c49ddcbbaabbba75a469c85cccdccb7db5cffe7cfff8bd6ff9
+cffffff0eaff00f7f7ff02f78f8fefff03edcdddeff9ff01fd8ffeff0757b585dfe447c4bffcff04
+86e49efa7ffeff0d8ee5cffd7dfff8ce6ff9dffffff0eaff00f7f7ff02f78f8fefff03edcdddeff9
+ff01fd8ffeff0757b585dfe447c4bffcff0486e49efa7ffeff0d8ee5cffd7dfff8ce6ff9dffffff0
+eaff00f7f7ff02f78f8fefff03edcdddeff9ff01fd8ffeff0757b585dfe447c4bffcff0486e49efa
+7ffeff0d8ee5cffd7dfff8ce6ff9dffffff0eaff01f8dff8ff02f78cafedff00fcf8ff0cfe7fffff
+fe58c6949fe559b4dffcff04a7f48fe99ffeff0d8ff5dffe6dfff9ce6ff9dffffff0eaff01f8dff8
+ff02f78cafedff00fcf8ff0cfe7ffffffe58c6949fe559b4dffcff04a7f48fe99ffeff0d8ff5dffe
+6dfff9ce6ff9dffffff0eaff01f8dff8ff02f78cafedff00fcf8ff0cfe7ffffffe58c6949fe559b4
+dffcff04a7f48fe99ffeff0d8ff5dffe6dfff9ce6ff9dffffff0eaff01fbaff8ff02f96cafe3ff0b
+fb8ffffffe58d8955ff65cb6fbff1596e58ff88ffffffd7ee5dfff6dfff8cd7ff9effffff0eaff01
+fbaff8ff02f96cafe3ff0bfb8ffffffe58d8955ff65cb6fbff1596e58ff88ffffffd7ee5dfff6dff
+f8cd7ff9effffff0eaff01fbaff8ff02f96cafe3ff0bfb8ffffffe58d8955ff65cb6fbff1596e58f
+f88ffffffd7ee5dfff6dfff8cd7ff9effffff0e9ff007ff7ff01798fe3ff0bf6dffffffd58e7765e
+f66e97fbff1596f57ff98ffffffd7ff5efff6dfff8dd8ff8effffff0e9ff007ff7ff01798fe3ff0b
+f6dffffffd58e7765ef66e97fbff1596f57ff98ffffffd7ff5efff6dfff8dd8ff8effffff0e9ff00
+7ff7ff01798fe3ff0bf6dffffffd58e7765ef66e97fbff1596f57ff98ffffffd7ff5efff6dfff8dd
+8ff8effffff0e9ff00baf7ff01f66ce3ff00c6feff07fd69e6685be66f88fbff1196f59ff99fffff
+fe8fe6ffff5efff8ec9ff7feff00f0e9ff00baf7ff01f66ce3ff00c6feff07fd69e6685be66f88fb
+ff1196f59ff99ffffffe8fe6ffff5efff8ec9ff7feff00f0e9ff00baf7ff01f66ce3ff00c6feff07
+fd69e6685be66f88fbff1196f59ff99ffffffe8fe6ffff5efff8ec9ff7feff00f0e9ff00f7f7ff03
+fe87fffde6ff01fe7dfeff07fc5af67938d67f6afbff04a5d59ff89ffeff099fe7ffff5efff8fbaf
+f7feff00f0e9ff00f7f7ff03fe87fffde6ff01fe7dfeff07fc5af67938d67f6afbff04a5d59ff89f
+feff099fe7ffff5efff8fbaff7feff00f0e9ff00f7f7ff03fe87fffde6ff01fe7dfeff07fc5af679
+38d67f6afbff04a5d59ff89ffeff099fe7ffff5efff8fbaff7feff00f0e9ff01f9cff7ff02fbbff7
+e7ff02fd88effeff07fb5ce67935d78e5efbff0495c49ff89ffeff099fe7ffff5efff8fabff6feff
+00f0e9ff01f9cff7ff02fbbff7e7ff02fd88effeff07fb5ce67935d78e5efbff0495c49ff89ffeff
+099fe7ffff5efff8fabff6feff00f0e9ff01f9cff7ff02fbbff7e7ff02fd88effeff07fb5ce67935
+d78e5efbff0495c49ff89ffeff099fe7ffff5efff8fabff6feff00f0e9ff01fd8ff6ff01aee8eaff
+fffe02b88aeffdff07fb4ec8a944b7ad5ffbff0496c49ff7affeff099fe7ffff5ffff8f9dff7feff
+00f0e9ff01fd8ff6ff01aee8eafffffe02b88aeffdff07fb4ec8a944b7ad5ffbff0496c49ff7affe
+ff099fe7ffff5ffff8f9dff7feff00f0e9ff01fd8ff6ff01aee8eafffffe02b88aeffdff07fb4ec8
+a944b7ad5ffbff0496c49ff7affeff099fe7ffff5ffff8f9dff7feff00f0e8ff007ef6ff03fac9ff
+dff1ff07db967665555788cffbff07fb4eb8d67587c97ffbff0486d49fe7affeff099fe7ffff6fff
+f8f8efe6feff00f0e8ff007ef6ff03fac9ffdff1ff07db967665555788cffbff07fb4eb8d67587c9
+7ffbff0486d49fe7affeff099fe7ffff6ffff8f8efe6feff00f0e8ff007ef6ff03fac9ffdff1ff07
+db967665555788cffbff07fb4eb8d67587c97ffbff0486d49fe7affeff099fe7ffff6ffff8f8efe6
+feff00f0e8ff00b8f6ff03fac9ffdff2ff06b643333343334ef9ff07f95faae6a566d79ffbff1186
+d49fe6affffffe8fe8ffff6ffff8f8ffd5feff00f0e8ff00b8f6ff03fac9ffdff2ff06b643333343
+334ef9ff07f95faae6a566d79ffbff1186d49fe6affffffe8fe8ffff6ffff8f8ffd5feff00f0e8ff
+00b8f6ff03fac9ffdff2ff06b643333343334ef9ff07f95faae6a566d79ffbff1186d49fe6afffff
+fe8fe8ffff6ffff8f8ffd5feff00f0e8ff01f9bff7ff03cbb9fe8ff4ff01fe94fb33007ff9ff07f8
+6f8af7d655d5dffbff1186d4aff5affffffe7fe8ffff7ffff7f7ffb5feff00f0e8ff01f9bff7ff03
+cbb9fe8ff4ff01fe94fb33007ff9ff07f86f8af7d655d5dffbff1186d4aff5affffffe7fe8ffff7f
+fff7f7ffb5feff00f0e8ff01f9bff7ff03cbb9fe8ff4ff01fe94fb33007ff9ff07f86f8af7d655d5
+dffbff1186d4aff5affffffe7fe8ffff7ffff7f7ffb5feff00f0e7ff007ef7ff03adc9fadff4ff08
+b544333334333434dff9ff06f76f7bf97656e5faff0496e3bff4cffeff099fe8ffff7fffe8f7ffc8
+feff00f0e7ff007ef7ff03adc9fadff4ff08b544333334333434dff9ff06f76f7bf97656e5faff04
+96e3bff4cffeff099fe8ffff7fffe8f7ffc8feff00f0e7ff007ef7ff03adc9fadff4ff08b5443333
+34333434dff9ff06f76f7bf97656e5faff0496e3bff4cffeff099fe8ffff7fffe8f7ffc8feff00f0
+e7ff00d9f7ff03cae7f8fef4ff0083fc33014339f8ff06f68f6dfc5947c5faff11a5e3cff4aaa978
+998fd8fffc49ffe8f7ffcbfeff00f0e7ff00d9f7ff03cae7f8fef4ff0083fc33014339f8ff06f68f
+6dfc5947c5faff11a5e3cff4aaa978998fd8fffc49ffe8f7ffcbfeff00f0e7ff00d9f7ff03cae7f8
+fef4ff0083fc33014339f8ff06f68f6dfc5947c5faff11a5e3cff4aaa978998fd8fffc49ffe8f7ff
+cbfeff00f0e7ff01facff8ff02f7e8c7f3ff079c665655469de63af8ff1ff59f6ffe4b48c4666777
+6678776656d4cff49bbba9978fc7fffe546db8f7ffcafeff00f0e7ff01facff8ff02f7e8c7f3ff07
+9c665655469de63af8ff1ff59f6ffe4b48c46667776678776656d4cff49bbba9978fc7fffe546db8
+f7ffcafeff00f0e7ff01facff8ff02f7e8c7f3ff079c665655469de63af8ff1ff59f6ffe4b48c466
+67776678776656d4cff49bbba9978fc7fffe546db8f7ffcafeff00f0e6ff008ef8ff04fe8977fffc
+f4ff07c58e7ad9cfe864cff9ff1fe59f6ffe7769c6eeeedddeddeeffc5e4cfd4dffffffb9fd7ffff
+ac6478e8ffcafeff00f0e6ff008ef8ff04fe8977fffcf4ff07c58e7ad9cfe864cff9ff1fe59f6ffe
+7769c6eeeedddeddeeffc5e4cfd4dffffffb9fd7ffffac6478e8ffcafeff00f0e6ff008ef8ff04fe
+8977fffcf4ff07c58e7ad9cfe864cff9ff1fe59f6ffe7769c6eeeedddeddeeffc5e4cfd4dffffffb
+9fd7ffffac6478e8ffcafeff00f0e6ff01e7eff8ff0afa45dffcfffdbefdfffaeffbff07f7cd6ffc
+bffbf86ff9ff07b69e6fffd46bd49efbff11c6f3cfe4effffffccfe9fffe9ffc67d9ffbbfeff00f0
+e6ff01e7eff8ff0afa45dffcfffdbefdfffaeffbff07f7cd6ffcbffbf86ff9ff07b69e6fffd46bd4
+9efbff11c6f3cfe4effffffccfe9fffe9ffc67d9ffbbfeff00f0e6ff01e7eff8ff0afa45dffcfffd
+befdfffaeffbff07f7cd6ffcbffbf86ff9ff07b69e6fffd46bd49efbff11c6f3cfe4effffffccfe9
+fffe9ffc67d9ffbbfeff00f0e6ff01fe7cf8ff09fe74affcfcfe8cefffb6faff07fa9a8efe9ffffd
+4df9ff08b6cd7ffff55da877dffcff11b6d4dfd4effffffddff9fffe9fffa9caffadfeff00f0e6ff
+01fe7cf8ff09fe74affcfcfe8cefffb6faff07fa9a8efe9ffffd4df9ff08b6cd7ffff55da877dffc
+ff11b6d4dfd4effffffddff9fffe9fffa9caffadfeff00f0e6ff01fe7cf8ff09fe74affcfcfe8cef
+ffb6faff07fa9a8efe9ffffd4df9ff08b6cd7ffff55da877dffcff11b6d4dfd4effffffddff9fffe
+9fffa9caffadfeff00f0e5ff01f9bff9ff02fe946ffefb03cebfff5cfaff07fe8e8afe9fcdff76f9
+ff0985e99ffff85e5adc69effdff03d6435554feff0afebff8fffe8fff8aabefaffeff00f0e5ff01
+f9bff9ff02fe946ffefb03cebfff5cfaff07fe8e8afe9fcdff76f9ff0985e99ffff85e5adc69effd
+ff03d6435554feff0afebff8fffe8fff8aabefaffeff00f0e5ff01f9bff9ff02fe946ffefb03cebf
+ff5cfaff07fe8e8afe9fcdff76f9ff0985e99ffff85e5adc69effdff03d6435554feff0afebff8ff
+fe8fff8aabefaffeff00f0e4ff00a9f8ff08f94dfbfce8df9ffbaaf9ff06df8a9bbfd8ffb7f9ff09
+d565cffff86d658ee749fcff02ecbacefeff0afe8fe5fffe9fff6656896cfeff00f0e4ff00a9f8ff
+08f94dfbfce8df9ffbaaf9ff06df8a9bbfd8ffb7f9ff09d565cffff86d658ee749fcff02ecbacefe
+ff0afe8fe5fffe9fff6656896cfeff00f0e4ff00a9f8ff08f94dfbfce8df9ffbaaf9ff06df8a9bbf
+d8ffb7f9ff09d565cffff86d658ee749fcff02ecbacefeff0afe8fe5fffe9fff6656896cfeff00f0
+e4ff01fc7df9ff08fd46ebfdd9cb8ef8ccf9ff06fedf97fff7ff98f8ff09faefffe89e6e859fd75b
+f6ff0d56a8fffebfffcdfedd648dfffff0e4ff01fc7df9ff08fd46ebfdd9cb8ef8ccf9ff06fedf97
+fff7ff98f8ff09faefffe89e6e859fd75bf6ff0d56a8fffebfffcdfedd648dfffff0e4ff01fc7df9
+ff08fd46ebfdd9cb8ef8ccf9ff06fedf97fff7ff98f8ff09faefffe89e6e859fd75bf6ff0d56a8ff
+febfffcdfedd648dfffff0e3ff01e8cff9ff0797c8febc69caf8fbf7ff04a6ffe7ff6cf5ff1fc5ae
+7ffc54bfe767777665555567988899aa86455557aaaaababbbb969fffff0e3ff01e8cff9ff0797c8
+febc69caf8fbf7ff04a6ffe7ff6cf5ff1fc5ae7ffc54bfe767777665555567988899aa86455557aa
+aaababbbb969fffff0e3ff01e8cff9ff0797c8febc69caf8fbf7ff04a6ffe7ff6cf5ff1fc5ae7ffc
+54bfe767777665555567988899aa86455557aaaaababbbb969fffff0e2ff008ef9ff07f999aeae56
+e8f8fbf8ff05fd89bfbafb8ff5ff16a5ac9fffd536ce4cedeeeecb99aa9cddccbbbbaa99a98afeaa
+05a98989fffff0e2ff008ef9ff07f999aeae56e8f8fbf8ff05fd89bfbafb8ff5ff16a5ac9fffd536
+ce4cedeeeecb99aa9cddccbbbbaa99a98afeaa05a98989fffff0e2ff008ef9ff07f999aeae56e8f8
+fbf8ff05fd89bfbafb8ff5ff16a5ac9fffd536ce4cedeeeecb99aa9cddccbbbbaa99a98afeaa05a9
+8989fffff0e2ff00edf8ff0796eaaf859ba7fcdff9ff05ebfcbf7ef6eff5ff079478affffe95344e
+edff03d8fffff0e2ff00edf8ff0796eaaf859ba7fcdff9ff05ebfcbf7ef6eff5ff079478affffe95
+344eedff03d8fffff0e2ff00edf8ff0796eaaf859ba7fcdff9ff05ebfcbf7ef6eff5ff079478afff
+fe95344eedff03d8fffff0d8ff07fdbb9fd85da6bfaff8ff03e9ec8f7cf4ff02fc75bffeff03d538
+99abfecc12bbabbabaaabcdeedcb98888999a9987afffff0d8ff07fdbb9fd85da6bfaff8ff03e9ec
+8f7cf4ff02fc75bffeff03d53899abfecc12bbabbabaaabcdeedcb98888999a9987afffff0d8ff07
+fdbb9fd85da6bfaff8ff03e9ec8f7cf4ff02fc75bffeff03d53899abfecc12bbabbabaaabcdeedcb
+98888999a9987afffff0d7ff06aad9ff96e86edcf8ff039dd7e8cff3ff00fefdff10fed787666556
+677788888999987667789bfecc01cdeefeff00f0d7ff06aad9ff96e86edcf8ff039dd7e8cff3ff00
+fefdff10fed787666556677788888999987667789bfecc01cdeefeff00f0d7ff06aad9ff96e86edc
+f8ff039dd7e8cff3ff00fefdff10fed787666556677788888999987667789bfecc01cdeefeff00f0
+d8ff07fddbfd98e67e77faf9ff03f9cd7ebdd4ff00f0d8ff07fddbfd98e67e77faf9ff03f9cd7ebd
+d4ff00f0d8ff07fddbfd98e67e77faf9ff03f9cd7ebdd4ff00f0d8ff08fbaffffecd8ba9adbffbff
+04fe9bc7ebbfd4ff00f0d8ff08fbaffffecd8ba9adbffbff04fe9bc7ebbfd4ff00f0d8ff08fbafff
+fecd8ba9adbffbff04fe9bc7ebbfd4ff00f0d8ff08bcdfffffefb7e88fbefcff04edcbee7eacd3ff
+00f0d8ff08bcdfffffefb7e88fbefcff04edcbee7eacd3ff00f0d8ff08bcdfffffefb7e88fbefcff
+04edcbee7eacd3ff00f0d9ff09feb9fffffeecd7e98ffafdff09f857dfe7e9efffeca99ed7ff00f0
+d9ff09feb9fffffeecd7e98ffafdff09f857dfe7e9efffeca99ed7ff00f0d9ff09feb9fffffeecd7
+e98ffafdff09f857dfe7e9efffeca99ed7ff00f0d9ff01faf8feff05c9e8e89efe9ffeff0ae76cff
+8d8cfd98adfbb8ced8ff00f0d9ff01faf8feff05c9e8e89efe9ffeff0ae76cff8d8cfd98adfbb8ce
+d8ff00f0d9ff01faf8feff05c9e8e89efe9ffeff0ae76cff8d8cfd98adfbb8ced8ff00f0d9ff0af9
+f8ffffdbe7ca9caeff8ffeff0b8a6ff9c8ce875effeeff8bdfd9ff00f0d9ff0af9f8ffffdbe7ca9c
+aeff8ffeff0b8a6ff9c8ce875effeeff8bdfd9ff00f0d9ff0af9f8ffffdbe7ca9caeff8ffeff0b8a
+6ff9c8ce875effeeff8bdfd9ff00f0d9fffff908ffeacf9e9e7eadfbbffeff0b6a7fc99cf7c746ca
+47bfe8bfd9ff00f0d9fffff908ffeacf9e9e7eadfbbffeff0b6a7fc99cf7c746ca47bfe8bfd9ff00
+f0d9fffff908ffeacf9e9e7eadfbbffeff0b6a7fc99cf7c746ca47bfe8bfd9ff00f0d9ff09faebfd
+bfeadf8e8f9ef9fdff0b6a8f89afe77444b8498ff7bfd9ff00f0d9ff09faebfdbfeadf8e8f9ef9fd
+ff0b6a8f89afe77444b8498ff7bfd9ff00f0d9ff09faebfdbfeadf8e8f9ef9fdff0b6a8f89afe774
+44b8498ff7bfd9ff00f0d9ff09fdddfbfb9eff8b9f8fdbfdff0b5c8e68ff95433386447865afd9ff
+00f0d9ff09fdddfbfb9eff8b9f8fdbfdff0b5c8e68ff95433386447865afd9ff00f0d9ff09fdddfb
+fb9eff8b9f8fdbfdff0b5c8e68ff95433386447865afd9ff00f0d7ff17ce9effff9c8f9fbdfffffe
+ff6f7b5eff643343453543688fd9ff00f0d7ff17ce9effff9c8f9fbdfffffeff6f7b5eff64334345
+3543688fd9ff00f0d7ff17ce9effff9c8f9fbdfffffeff6f7b5eff643343453543688fd9ff00f0d7
+ff17e9efffffab6cdb9efffffdff6f8b4fff64434437443345bfd9ff00f0d7ff17e9efffffab6cdb
+9efffffdff6f8b4fff64434437443345bfd9ff00f0d7ff17e9efffffab6cdb9efffffdff6f8b4fff
+64434437443345bfd9ff00f0d7ff00dbfeff12e89afabdfffffddf8bca7bff83436434433466d8ff
+00f0d7ff00dbfeff12e89afabdfffffddf8bca7bff83436434433466d8ff00f0d7ff00dbfeff12e8
+9afabdfffffddf8bca7bff83436434433466d8ff00f0d7ff00befeff12f9b6cbeafeffffafb5fef9
+bfc359d834433598d8ff00f0d7ff00befeff12f9b6cbeafeffffafb5fef9bfc359d834433598d8ff
+00f0d7ff00befeff12f9b6cbeafeffffafb5fef9bfc359d834433598d8ff00f0d2ff119c8ffbffef
+ff8ee58fff99e548784433455ed8ff00f0d2ff119c8ffbffefff8ee58fff99e548784433455ed8ff
+00f0d2ff119c8ffbffefff8ee58fff99e548784433455ed8ff00f0d2ff01fccffdff06b9fa8afffb
+7743fe3301548ed8ff00f0d2ff01fccffdff06b9fa8afffb7743fe3301548ed8ff00f0d2ff01fccf
+fdff06b9fa8afffb7743fe3301548ed8ff00f0d2ff00fafcff0cfa68858efffc87433333356549d9
+ff00f0d2ff00fafcff0cfa68858efffc87433333356549d9ff00f0d2ff00fafcff0cfa68858efffc
+87433333356549d9ff00f0d2ff00ebfbff0cb99a769effffdca7568effe69adaff00f0d2ff00ebfb
+ff0cb99a769effffdca7568effe69adaff00f0d2ff00ebfbff0cb99a769effffdca7568effe69ada
+ff00f0d2ff00cffaff03feffc7effdff03efffb68adaff00f0d2ff00cffaff03feffc7effdff03ef
+ffb68adaff00f0d2ff00cffaff03feffc7effdff03efffb68adaff00f0c8ff01fedffcff02fe645a
+daff00f0c8ff01fedffcff02fe645adaff00f0c8ff01fedffcff02fe645adaff00f097ff00f097ff
+00f097ff00f097ff00f097ff00f097ff00f097ff00f097ff00f097ff00f0
+currentdict /inputf undef
+currentdict /picstr undef
+currentdict /rpicstr undef
+currentdict /gpicstr undef
+currentdict /bpicstr undef
+grestore
+showpage
+%%Trailer
diff --git a/doc/gnu.xpm b/doc/gnu.xpm
new file mode 100644
index 0000000..bc54934
--- /dev/null
+++ b/doc/gnu.xpm
@@ -0,0 +1,198 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"213 177 14 1",
+/* colors */
+"` c #FFF",
+"a c #DDD",
+"b c #BBB",
+"c c #999",
+"d c #777",
+"e c #555",
+"f c #333",
+"g c #EEE",
+"h c #CCC",
+"i c #AAA",
+"j c #888",
+"k c #666",
+"l c #444",
+"m c #222",
+/* pixels */
+"`````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"`````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"``````````````````````````````````````````gaahiibaag`````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"``````````````````````````````````````acjjdddldjjkleeekdjia``````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"```````````````````````````````````abbicli`hbjkdbelldddkdelldh```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"`````````````````````````````````iibkcjellcaeaklcelfljllkekdeeejba````````````````````````````````````````````````````````````````````````````````````````````gha````````````````````````````````````````````````````",
+"```````````````````````````````bcagjcldkleljcdaelillfcdllfedeeelffc`````````````````````````````````````````````````````````````````````````````````````acdjddjccjjjch```````````````````````````````````````````````",
+"`````````````````````````````hch```jflleeeelkkcbljdlfliellldeeeeeflkh````````````````````````````````````````````````````````````````````````````````hjkch`ah`ic`gaiicjja````````````````````````````````````````````",
+"````````````````````````````cb``aeigjlefleellelhdlblllldllllcllekkeelcg``````````g``````````````````````````````````````````````````````````````gjcddiabjjdldkleklllliggcc```````````````````````````````````````````",
+"`````````````````````````ggjag`accdehilefelelllehldjllleellleellekllleejb```````dki```````````````````````````````````````````````````````````gjlljbiiekkelllllllefedcdg`hjb`````````````````````````````````````````",
+"````````````````````````gdhg`cdhadkdejilelelelekdelbllelelellkleelkfjeehiiihaaidbai``````````````````````````````````````````abg`````````````addijkdellelllelllllljckllkg``hcg```````````````````````````````````````",
+"```````````````````````gjgdejijlcghkeljjllllkdhjklkdcleklklllllleleeededg`hidjb``ig`````````````````````````````````````````akdei````````ggacdkkkkjllllflllflflllleekddjcji``big`````````````````````````````````````",
+"``````````````````````hdcjjceeekeei`hklkklledg`adebeclljelleleellelclkdlgg`aagg`ai``````````````````````````````````````````cg`bklkklllllllllkkeejlllfflekflellfleeelfllech```gcg````````````````````````````````````",
+"`````````````````````cihdckkjkleelldggiklejca``````aahkkceedkekjekkjllclhghbikkhjg``````````````````````````````````````````ij`g`ghbcjekddbkeeeljlllflfleflklfflekledjccccjg````ia```````````````````````````````````",
+"````````````````````hd``g``beedeeelkeb`gddhh```ghhhbbiekjhca`gjig`bgajab`gg``acc`````````````````````````````````````````````edagg`jeelleleeeeekeflfffleflefflelflklllelllledc```ba``````````````````````````````````",
+"```````````````````gc``aga``gdllelkecec``bg`gckdibbbhahbcdddjccciiihhgg```gbjca```````````````````````````````````````````````clkdcaccklleleeeekcikekklflefflllflllllllllllllekj``bg`````````````````````````````````",
+"```````````````````c``heledb``cllelebadj``gcdig`````````````gaaahhbhhhhhhgag```````````````````````````````````````````````````gcklflkjcaeekkjkjjddejdldkekdelllllfffffllleedjch```ig````````````````````````````````",
+"``````````````````caagikelllkcgjekekdg`hgbca```````````````````````````````````````````````````````````````````````````````````````aidelllebag````````hkea`gelllfffffffffffffllkg``gb````````````````````````````````",
+"`````````````````jbhdeecbbjefleckdciic`gca`````````````````````````````````````````````````````````````````````````````````````````````````````````````gikjgakffffffffflllekdkelkda`i````````````````````````````````",
+"```````````````adllkchbklkbabkflecgg``ajg`````````````````````````````````````````````````````````````````````````````````````````````````````````````````hdhaffffllllejjdelfflleda`hh```````````````````````````````",
+"```````````````jckllllejjeledahlfkhg`bjg````````````````````````````````````````````````````````````````````````````````````````````````````````````````````jiblleffffffffflekdkkelagb```````````````````````````````",
+"``````````````hj``gbdlllleellljcebg`bc```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````bjhcelffffllllllledddkc`i```````````````````````````````",
+"`````````````gdhbbhihabklllleekkk``bc`````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````bj`hlfffffffffllleeekjhi```````````````````````````````",
+"````````````gdgeeelllekcidllleeja`aj```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````id`befffllfffffledibbgbg``````````````````````````````",
+"````````````cb`hchgidellekjjeeaijbjg````````````````````````````````````````gabbiiiibhg`````````````````````````````````````````````````````````````````````````cdgkfffffffledjjkeekcah``````````````````````````````",
+"```````````gd````gg```aclleddkg``da`````````````````````````````````````gbjkddjcccjddjddjia`````````````````````hbhag````````````````````````````````````````````iieffflfflfflkca`````b``````````````````````````````",
+"```````````ca```hbiiibhggbeekh``ib````````````````````````````````````gdkchgabbccjjiicibbijjh````````````````gijccjjjcia``````````````````````````````````````````ddflleeeleellllkdh``i``````````````````````````````",
+"``````````gj``clllffllllki`bcg`hj````````````````````````````````````hkcijccibag`gghbijkkjiidjh````````````bcibicjjiba`hba````````````````````````````````````````hjdleeelllffflllej``b``````````````````````````````",
+"``````````cahjekdjcicjdella```gd```````````````````````````````````adldia```````````````ghjddkkda```````gcdjjdcbhgabicjighb````````````````````````````````````````daiefffffffflllekg`b``````````````````````````````",
+"``````````j`ccjjjddkeekdcddb``ia``````````````````````````````````iejg```````ah`g```hg``````gbjelc````acckjhg``bebgh```hjcg````````````````````````````````````````chjeffffffllffllkdchg`````````````````````````````",
+"`````````iiallllllekjiijkedka`c``````````````````````````````````ijg`````g````chjjeagkdh``ghcb`ajljaaibcjg````gdeleld````gjc```````````````````````````````````````ac`kleiiklflkcklleghg`````````````````````````````",
+"`````````kkkellekekellejaghcb`c`````````````````````````````````cb```````chjacciicljeckdggkdkkh`chkebgjjbg`ahijallldflcig``ajh``````````````````````````````````````dallffldcjlfljkjlgaa`````````````````````````````",
+"````````bjjjiiijjddkeeeelhg``ab```````````````````````````````gjh`````hcbciiibkcbdlbkcejkjkeekebikadjkbdeecheakllcleiflkeaicgijg````````````````````````````````````djkllfflflkjefleb`bh`````````````````````````````",
+"````````kg`aabcjkeeellleekc``ig```````````````````````````````jg``````jjdbjijhedhkkjjdldejdeldklkeeijkcgkllekkaeljifclffffffebada```````````````````````````````````cillfffflllldcllb`bi`````````````````````````````",
+"```````gd``hellllleeeeekkkka`j```````````````````````````````jh`bgijkgieeakcdgekaedeielklejelkeelfeeiklbilellfcbflhlelfflffffleidb``````````````````````````````````caelleeelffllebkeabi`````````````````````````````",
+"```````bigcellllllllllleldgggc``````````````````````````````chaacbhkebaeeakdd`ekgedlhlelleckleellflekjeeaeeekeladfjkleffllefffflbcc`````````````````````````````````ibllllfleelfleljjeic`````````````````````````````",
+"```````jacllledjbcbhbidefekgch`````````````````````````````ci``dkj`elcgeeijed`eealkfblllleceldklelleekeeibejljllifdjlklfkfdllfffebbj````````````````````````````````biillflllfleelllljgc`````````````````````````````",
+"```````d`becbbijdelllllejag`j`````````````````````````````bhgc`iek`klj`keccek`eealdlclllllikedjlekfleeclebkeclblelkhfelfkfjelfffflcbc```````````````````````````````ibilfffleefffllflkgc`````````````````````````````",
+"```````d``bjelflkdjjdjdekchgc````````````````````````````gj``ddkee`kle`dekilkgeeildldllellbekkildeleelillkjlkldcjklilelfefdelflflflcch``````````````````````````````jadklffffekjkflllkai`````````````````````````````",
+"```````j``jlejcjdkeeekdkkihac```````````````````````````gdggccbllegdelgclecle`elhejlkelellbeddhlkleleljekklejieaehfjklllkelelflflflljkg`````````````````````````````d`jihdffffflddlllk`ig````````````````````````````",
+"```````j`gedkellleekkkekdihgc```````````````````````````jabbkicellajelaileilk`klaejleelkllhedkhljejeelkeedjj`gjbjlldjllelklllleflflllkda```````````````````````````gjgeellfffffleedeelhba````````````````````````````",
+"```````i`hedeeekkkkeekellljaj``````````````````````````jh``kljcdfehjelbheehekgelaejlleljllhedjaljeikdeelffildh`cklleblleldfellklllfllleka``````````````````````````iigedfffffffffeejelgba````````````````````````````",
+"```````a`cilledjiabcjelleb``j`````````````````````````ci```kljjiflhceliaelakkgllalcllllkeebkdcalieheckkkhchlleb`bflfbeleeefkllkellfllllekg`````````````````````````jg`aelfffffffffeeilhbg````````````````````````````",
+"`````````kdba`gikelkcjjkeeh`j````````````````````````iia``eeljdhflhcelcallhdkhllblielleelkcdebhliealieea`ahffflelflfddfeeeflllekllflllfllk`````````````````````````d``ilfleffffffffldhgbg````````````````````````````",
+"```````h`c`bjelekjdeelffleh`j```````````````````````ij`bcallljkgflidelchleakkileclillllllkkjehildkcljlligegeflkeeelfkjflelfllleelelellffllkg```````````````````````d`aeffflkfflfffflea`bg````````````````````````````",
+"```````b`gieejdellllkcdked``j``````````````````````ic``geglllkk`leideejblegedkfkclbllelledlakhcedkeekfldglabdldhiellkjflllflleellellelfefllkg`````````````````````akelflffflklfllffljc`b`````````````````````````````",
+"```````iggjjdelllecbjelljh`ach````````````````````ci````ebelekegeljkeldjldalklljkkjllefeledilcec`gcikellaei``blljkjkkjflllflllkllellklfdlllkjg````````````````````cejblffffffklfflfld``i`````````````````````````````",
+"```````iahcjelecaiefldjledjiaj```````````````````jb``bb`djllekk`eljeeleeljjllllkljefelfklkkck`gahahjlilkeeeg``ielfeleblllllflldllklleeldkleiadih``````````````````dlaelfffffffelfflfi``b`````````````````````````````",
+"```````bcbiekhgceflddelllecj`d`````````````````gdh```he`ckeleek`keeleellejlkideddieekeddb`dddjeeeldidbkjfjfkihggkfleehellellllkledlfkelljledgaci`````````````````bjkkfffffffffflfflfk``i`````````````````````````````",
+"```````gjgaigcllllellkellebagib```````````````gda``ghgegbeeelkk`eeeldli`accajliiiceledjjjdlleigahlb`jididkkffleeffebdbjljdllklldicllklllelllj``cc```````````````gdgjflfflfflfffflfflfi`b`````````````````````````````",
+"````````dgghekbklflkellleekkhgc``````````````gda````dhdbieekeekkljdjjlckflkkeekddjjjdkkkdjcbg````keacfejhejeleeceliajhdflleefleekklllllfflellh`gkc``````````````dballfflfffflffffffla`bg`````````````````````````````",
+"````````dhclddllleelllelllebg`jh````````````gja`````ijjdblkklljjkghdlejig```````````````gg```````gljghefecljlfdcej`cekkibjdabg`ghiickdkdeedledjagkc````````````jdbkfffffffffffffffflg`c``````````````````````````````",
+"````````icdbbkllllllejellkllc``jb``````````gdg````ighdbkhlkelebadedch`````````````````````````````hedahkffefklelfiejg`````bdc````````ahbjkeedleeh`cdh``aag``gieeklclffflffffffflffli`ai``````````````````````````````",
+"````````hcghklllllljdelldefle```jc````````hjg```gikbhkbljlcecjkkig`````````````````````````````````gdlejjellffflelc`````````bkg``````````abkjeeelb`hkellekbjldgdgkfflffflffffffflfk``cg``````````````````````````````",
+"````````gdikllkeleceklljeflklh```jja````acc`````hckcgececedlkig```````````````````g`````````````````gilelejcfffkjla````ag````hk`````````````ieeekfeh`ghjkkjig``dklelmfffflfffffffflb`c```````````````````````````````",
+"`````````dakejelkjedlldklldlleg```bcjjjjca``````jcedgekllecg`````````````````gicekj``````````````````ggabjleffcadeb```hed`````bd`````````````ggkllffjgba`bccgihefffeefffffffffffflkdhh```````````````````````````````",
+"`````````ibdielkdlkeedkllddellbch``````````aghaieaekglfda````````````````ghiiiaifeg`````````````ggg```ggagblfkgdljd``cijdg`````ci`````````````haeelffllljelfllfffffflffflffffffllldic````````````````````````````````",
+"`````````hcgclkklkeedkllejldfleehg`````````ccbjdeadejfj`````````````````hllkkeeffc`````````````gdlleg````g`ceebfflkghjklkg````g`ka````````````abcllfffffffffflfffffffffffffffffflj`gc````````````````````````````````",
+"``````````d`cdkleekkklledlklfleedd`aa`````gilildeajlfl`````````````````illlflfffk```````````````ajllig``g```aeefffj`clffi`````h`bd`````````````baelfflfffffffflffllfffffflffffllfa`ia````````````````````````````````",
+"``````````jagbledjkklfdkeedffelflecbkd````icldejlbjfed````````````````glfffllffkg````````````````gilkh``g``hkllfejagklfla````gb``k`````````````gccllfffffffffffffffffffffflmffflfhgi`````````````````````````````````",
+"``````````bb`bkkckclleeeljlflkfleeljke`igabkleeclikfcg````````````````cflfflffj```````````adeeja```iiih````blfkjia`gkffja`````h``dg`````````````hjllffffffffflflfffffffflfffffffegcg`````````````````````````````````",
+"``````````gc`beakbellkeleellleflellkje`ddgdklekdlele`````````````````alffeffdh``````````beffeklk`````hjbb``gijig``gadffiibiiaga``jg``````````````jelfffffffffffflffffffffffffllldbb``````````````````````````````````",
+"```````````jheajckeldellklllllflleeeie`dehkkelkklljc`````````````````kffelfjb``````````clkig``dlg`````aej````g`````iclfkja`hjhh``d```````````````bllfffffffffffffffffffffffflldeic```````````````````````````````````",
+"```````````ikagjdekedlekllelelllfkelbk`ekikdelelfba`````````````````blfkdlkcb````````hkeh`````jlc`````bkc``````````jjffedh`ggb``gk```````````````akelfffffffflllffflffffffffefiahh```````````````````````````````````",
+"```````````gj``idekjekeellklkfllleeeiegekidjleefe``````````````````hefd`ai`e````````ifj```````allg`````iig`````````cjfflb```````bd```````````````bklfflfffffffllffflfffffflfekkgc````````````````````````````````````",
+"````````````cg`deckjeledleellfelleeedebleidkellfb`````````````````hedi````hk````````ed`````````cfa`````hejg````````iefffcg`g````jb````````````````jlfflfffffffllffffflffflffb`djh````````````````````````````````````",
+"````````````hb`bedcelekjljllllllleeeeljeeckdelfl`````````````````acbi`````ki```````hea```hbcjdkkfc`````gelb````````hefffekddcb``ja`````````````````hllfeffffffllllffffllfklk`gji`````````````````````````````````````",
+"`````````````j`gicclejceejlefllllcekledleckkllfd``````````````````gjg````gla```````ifj`beffflffffeh`````hlb````````gcfffffffffecdb``````````````````dlfeflffffflllfflfefeeec`gj``````````````````````````````````````",
+"`````````````bi```jkdjhlklllflllehekleellbkkkllb``````````````````gg`````ik````````aflefffflfffjclb``````kb`````````alfellekjdellc``````````````````hlflfffffffllllelfefdhb`ajg``````````````````````````````````````",
+"``````````````jg```khjcldlllllllkbekleeeebkdellg`````````````````````````di````````gefffflfffffjbcd``````gia`````````klkleleeeddllg``````````````````effflfffflfffleffek```bkg```````````````````````````````````````",
+"``````````````gjg``jgidelldflleljjkelleeebekklj``````````````````````````lg`````````effejlffleffjida``````dc`````````glkcffflfedddh``````````````````kllleffffffllkkkecg`idda````````````````````````````````````````",
+"```````````````aca`hgbkeeceffjllieceelekeieeelg`````````````````````````gk`````````glebahlfflllfkgag``````kd`````````gdldfflffldjcg``````````````````blllkfffflllejgkkbdejg``````````````````````````````````````````",
+"`````````````````jg`ggkkcilfljlejeblkedklclefh``````````````````````````ci``````````lh``affffflfeaig`````gea````````gghefffffffkb````````````````````akcbklfflejdlbakfkb`````````````````````````````````````````````",
+"`````````````````gc```icbkflieldkjiebeeeecelc```````````````````````````dg``````````jj`g`efffffldde``````ji``````````ggblfffffekdkj```````````````````hc`bjdah`gajdkia```````````````````````````````````````````````",
+"``````````````````hb``bigjkeclddeakkjleldkee````````````````````````````k```````````gddhahlffflkiek`````````````````````jfffffddjle````````````````````ekkjjddddjba````````````g``a`a````````g```````````````````````",
+"```````````````````aigg```aieeblibejkeelcelb```````````````````````````hlg`````````ggailc`ajjcjcbec`````````````````````alleekchclh````````````````````bagagg```````````ag``gejb``kgk````gbagecdbabg`````````````````",
+"`````````````````````iba```hbblcgkb`dkeljel````````````````````````````ceg`````````````akdiibdeeej```````````````````````clekkcjeca`````````````````````j```````````````ilh``dfj`gedc`hb`gdkabelcbkeddi``````````````",
+"```````````````````````hih`hcliidc`akjeeedj````````````````````````````ecg````````````gg`acjcibag`````````````````````````clddedai``````````````````````ca```````````````bea``ek`alegblja`ieeajlcblkbkg``````````````",
+"`````````````````````````gbibg`gh``hagjhaea```````````````````````````gkig```````````````gg```gg```````````````````````````kla```h``````````````````````gj````````````````akg`ajggeaalfkb``jlkaljhlhkg```````````````",
+"````````````````````````````bbbbhg``````ge````````````````````````````cjhh``````````````````g`a````````````````````````````aej```cd``````````````````````j`````````````````ik`````ghecfejjdkllklkdeejig``````````````",
+"````````````````````````````````ghbhhg``kc````````````````````````````eh`ihg````````````````````````````````````````````````ilh``bej`````````````````````bh`````````````hiiceddkkkklkdjjjcbag``c`````gb``````````````",
+"`````````````````````````````````````ahclg```````````````````````````afg`bha`````````````````````````````````````````````````dd``glka`````````````````````c`````````````dbhhjcbhg``````````````i``````b``````````````",
+"```````````````````````````````````````ck````````````````````````````dfh`gaa`````````````````````````````````````````````````bla``idjg````````````````````ai````````````j```h``````````````````i`````gb``````````````",
+"```````````````````````````````````````lh```````````````````````````aelg```g``````````````````````````````````````````````````cj```eadgg```````````````````cg```````````c``gi`````````gaabbicccdibdciab``````````````",
+"``````````````````````````````````````hk````````````````````````````dceka`````````````````````````````````````````````````````geg``djgda```````````````````gc``````````adjdkejicjddkelledjedckijaaeeich``````````````",
+"``````````````````````````````````````di```````````````````````````he`bd```````````````````````````````````````````````````````ek``ce`gch```````````````````ab`````````gcidkjlbbbckjadlb``dj`c`ga`cda````````````````",
+"`````````````````````````````````````glg```````````````````````````dj`ce````````````````````````````````ga`````````````````````aea`ilg``iig``````````````````ba```````````cbae```gki`cli``dd`c``g`gda````````````````",
+"`````````````````````````````````````bk```````````````````````````hlg`bkjg```````````````````````````gggblig``gh````````````````jj`hli```gjcg`````````````````ig``````````jbbe````ki`ilc``dd`c`````da````````````````",
+"`````````````````````````````````````di``````````````````````````gec``ajegg`````````````````````````ckkdjcecaaaa````````````````gkbaec`````accig```````````````cjg````````kbhe````ei`ilj``jk`j``g``da````````````````",
+"`````````````````````````````````````lg``````````````````````````dd````hkkj```````````````````````````````hjkkdjdjjjjb```````````bkhec````````acjbg`````````````gjg```````diak```gei`blc``de`j`````da````````````````",
+"````````````````````````````````````he``````````````````````````ikg`````dela````````````````````````````ghbhhhaaggg```````````````kjei```````````bdjiag```````gbiig```````dbak````lb`bli``de`j`````da````````````````",
+"````````````````````````````````````jc````````````````````````gdk````````bkb`````````````````````````akkdjddkeleja````````````````ilkh``````````````hcjjccccjcbg``````````dbhd````ei`hec``dk`j`````ka````````````````",
+"````````````````````````````````````eg```````````````````````geea`````````ib`````````````````````````ei````````gbjejg`````````````aelg````````````````````````````````````jbhd```gli`hei``dd`j`````kg````````````````",
+"```````````````````````````````````be```````````````````````hlla``````````g`````````````````````````cj````````````adlb`````````````hlbg```````````````````````````````````dbbd```gli`ali``jd`j`````kg````````````````",
+"```````````````````````````````````kb``````````````````````allh````````````````````````````````````hla``````````````bejg````````````dla`gahjji````````````````````````````dbbd```glc`glb``dj`d`````kg````````````````",
+"``````````````````````````````````be``````````````````````beeh`````````````````````````````````````kh`bklljg``````````iei```````````ckelleedddka``````````````````````````dbbd```glc`glh``dj`j`````kg````````````````",
+"`````````````````````````````````geh```````````````````gikejg`````````````````````````````````````gk`jfeddeea``````````akkb````````````g``````aeg`````````````````````````dbij```glc`glh``jj`d`````kg````````````````",
+"`````````````````````````````````ec`````````````````gbdledi```````````````````````````````````````ijifd````hg````````````ieda``````````````````ij`````````````````````````dbbj```ali`gla``jc`d`````kg````````````````",
+"````````````````````````````````jk````````````ghijdkkdjhha````````````````````````````````````````daefb```````````````````gdeb``````````````````e`````````````````````````dhbj```ali`glh``ih`j`````k`````````````````",
+"```````````````````````````````ilg`````````bdelkjbg``gcabcg```````````````````````````````````````kajlg`````````````````````jei`````````````````ka````````````````````````khbj```hlb`bla``jh`d`````e`````````````````",
+"``````````````````````````````ila````````cedccb````````ijib```````````````````````````````````````kahe````hdledcg````````````i``````````````````jb````````````````````````khic```hlb`blh``jh`d`````e`````````````````",
+"`````````````````````````````ilh````````jlg`gc`````````gjdb```````````````````````````````````````bg`a````deahikeg``````````````````````````````ic````````````````````````kaic```hlb`blh``jb`d`````e`````````````````",
+"````````````````````````````dfb````````alb``ca``````````hlg```````````````````````````````````````ah`````glfklfekd``````````````````````````````ic````````````````````````khcc```blb`blh``jh`d`````e`````````````````",
+"```````````````````````````cfc`````````kk```d````````````k``````````````````````````````hg```````````````glfffffekcia`````````````````````````abdh````````````````````````eacc```bliiefc``dh`d`````e`````````````````",
+"```````````````````````````ed`````````blb```d````````````db```````````````````````````gag````````````````gkffffffbelkg```````````````````````gjde`````````````````````````kaic```bldcahkb`kh`d`````e`````````````````",
+"```````````````````````````lg``gikcghjlc```gj````````````je````````````````````````gjkka``````````````````gkfffflaeefi```````````````````````dedd`````````````````````````eabj```blk``ghegkh`d`````e`````````````````",
+"```````````````````````````ddjkfeddflda````bc````````````ceb``````````````````````akig``````````````````````bjig``eblk``````````````````````jflld`````````````````````````kghj```bli```cflllcd````ge`````````````````",
+"```````````````````````````gccib```ga``````ib````````````jhc``````````````````````ea``````````````````````````````khbfg````````````````````jlfflh`````````````````````````egbc```bfj``glkdleid```gbk`````````````````",
+"```````````````````````````````````````````ca````````````j`j``````````````````````````````big`````````````````````ehgli``````````````````gdlfffd``````````````````````````egbj```ile``ge``kh`dgiaaik`````````````````",
+"```````````````````````````````````````````ja````````````j`j````````````````````````````helkli`````g`````````````gk``ed````````````````gbklffleg``````````````````````````lgbj```cllh`jj``eb`difdbik`````````````````",
+"```````````````````````````````````````````ch````````````cgd````````````````````````````iga`geb``ag``````````````````cc`````````````ggadlffflkb```````````````````````````labc```jlka`ec``kb`difehid`````````````````",
+"```````````````````````````````````````````ch````````````ihja````````````````````````````````hla`j```````````````````````````````````hklffffdj````````````````````````````lhic```kfcggjli`eb`djflbcd`````````````````",
+"```````````````````````````````````````````ib`````````````ijeg````````````````````````````````dcgj`````````````````````````````````gjefffffekg````````````````````````````laieejelledecieieb`dhkcbcd`````````````````",
+"```````````````````````````````````````````bc```````````````cd````````````````````````````````akii````````````````````````````````gdlflffflka`````````````````````````````laijeggabijkellllb`dga`bcd`````````````````",
+"```````````````````````````````````````````aj```````````````gkh````````````````````````````````cki```````````````````````````````gdlflffflkg``````````````````````````````eajkkjihg``````geb`dg``hcd`````````````````",
+"```````````````````````````````````````````gd````````````````jc````````````````````````````````gej```````````````````````````ggagdllllfflka```````````````````````````````dadlklekeeekkkkjeb`d```acj`````````````````",
+"````````````````````````````````````````````d```````````````gbj`````````````````````````````````be``````````````````````````````hjjcdeelecg```````````````````````````````khjeeeb`````ghejeb`d```aij`````````````````",
+"````````````````````````````````````````````d```````````````baj``````````````````````````````````kh`````````````````````````````gg``gabi`ajg```ggga``````````````````````gkckecd`g``````aeeb`k```gic`````````````````",
+"````````````````````````````````````````````dg``````````````abch`````````````````````````````````bj````````````````````````````````````````bkdkekdklkkka```````````````ajllflkejibhgggghbkli`k```gij`````````````````",
+"````````````````````````````````````````````cb```````````````chj``````````````````````````````````dg````````````````````````````````````````hh```gbg`gdi```````````````jkiicjcccijdkllllfkli`k```gic`````````````````",
+"````````````````````````````````````````````bi```````````````gceih````````````````````````````````aj`````````````````````````````````````````ba`cdhhgggkg`````````````bjkellkkeekdeclkkkllligk```aci`````````````````",
+"````````````````````````````````````````````aj`````````````````bhbjjg``````````````````````````````aj````````````````````````````````````````gcgblfjkg`hd``````````````gbdklcedihbedekellklcae```aji`````````````````",
+"`````````````````````````````````````````````d`````````````````hb``ajjg`````````````````````````````hc```````````````````````````````````````adgaelfcg``ji````````````````ge`dig`gkghabaahejak```hji`````````````````",
+"`````````````````````````````````````````````d``````````````````biih`adh`````````````````````````````hc```````````````````````````````g``gbiikfjgjeld```aea```````````````ge`kiaghejaggbbiedgk```bji`````````````````",
+"`````````````````````````````````````````````ih```````````````````gbch`da`````````````````````````````jkh`````````````````````hckkeeeekdcjkdlielbieeeh```hka`````````````gbebdkeellleekcidfj`k```ijjhhhha````````````",
+"`````````````````````````````````````````````ac``````````````````````ibjki````````````````````````````gdlcg``ghbhgg```ggacckelfflllllffffflbagbfkilelddcbghkjg``````````bkllllllllllelllekligk```ajeeeelleka`````````",
+"``````````````````````````````````````````````k``````````````````````gccgd``````````````````````````````ileeefflkchahabklfffffffffffffffflc````dflfelkcdkkddlkjjjcjjccccklllleeeeeleeeeeleli`k````jklellllljci```````",
+"``````````````````````````````````````````````ja`````````````````````cgj`j```````````````````````````````hllebahabcdelffffffffffflllffllfj`````aleejllkdjba`aihgbiibibibijcccccccccccccjddeh`eg```djbbhbiiiibdd``````",
+"``````````````````````````````````````````````aj`````````````````````jacih````````````````````````````````gefllllflfffffffffllfflekkeelfd``````glkkjedghifdbgjdjjdkdjjjjjjddjdccccjiiibbbiebheg```djccjkkkejjkc``````",
+"```````````````````````````````````````````````d`````````````````````cjgjg`````````````````````````````````hdlffffflkjjjjdibhbiig`g`agaci```````ljjkkk`gafldhlcaahbbiibbbideilkchjehhhahhbdabeh``gdh```jbak``ch``````",
+"```````````````````````````````````````````````d`````````````````````dj`j`````````````````````````````````````gahaaag``````````````````aj```````edbejea`glldhlb```````````jkglcg`id```````jggeh``ada```jhgk``ca``````",
+"```````````````````````````````````````````````ja````````````````````djhi``````````````````````````````````````````h```````````````````gd``````gejhkclc`geecbla```````````id`lj`gcc```````j``ea``gka```chgk``ca``````",
+"```````````````````````````````````````````````bi````````````````````ckhi``````````````````````````````````````````````````````````````bj``````gejajcee``kehbk````````````ckgej``jj``````adggea```ka```jhad``cg``````",
+"````````````````````````````````````````````````d`````````````````````dcj``````````````````````````````````````````````````````````````ka``````aejgddkeg`kkgcd````````````ck`ed``cj``````ad``eg```ka```jaaj``jg``````",
+"````````````````````````````````````````````````bi`````````````````````kkh````````````````````````````````````````````````````````````hk```````akcgkkjebgkk`jj````````````ck`ec``cc``````gj`gk````eg```jghc``d```````",
+"`````````````````````````````````````````````````d`````````````````````gjd```a```````````````````````````````````````````````````````gda```````hei`kdcfjakd`ki````````````ieaec``jc```````c`gd````eg```j`bi``d```````",
+"`````````````````````````````````````````````````ch``````````````````````bb``d`````````````````````````````````````````````````````ajjg````````behgkdcfeadjgeg````````````cehlc``jc```````c`gd````eg```j`ib``k```````",
+"`````````````````````````````````````````````````aj```````````````````````iggj```````````````````````````````````````````````g`gbjjig``````````blghjicllbdiae`````````````ckhlc``di```````c`gd````e````j`ca``d```````",
+"``````````````````````````````````````````````````dg```````````````````````ihc``a`````````````````````````````````abckdkkeeeedjjh``````````````blgbjakdejdhcd`````````````jkalc`gdi```````c`gd````k````j`jg`gk```````",
+"``````````````````````````````````````````````````bj```````````````````````ihc``a```````````````````````````````bklffffflffflg`````````````````ce`iigkiekkadc`````````````jkalc`gki``````gj`gj````k````j`j``ae```````",
+"```````````````````````````````````````````````````cb`````````````````````hbbc`gj````````````````````````````gclffffffffffffd``````````````````jk`ji`dakeeaea`````````````jkali``ei``````gd`gj````d````d`d``be```````",
+"````````````````````````````````````````````````````dg````````````````````iahc`ia```````````````````````````bellffffflffflfla``````````````````dk`db`cdkekge``````````````ckgfb``lh```````c`gj````d```gj`d``hj```````",
+"````````````````````````````````````````````````````ac````````````````````higd`j`g``````````````````````````jffffffffffflffc```````````````````kj`ka`hecldhe``````````````iegfh``liiicdjccj`aj```hlc``gj`d``hb```````",
+"`````````````````````````````````````````````````````ih````````````````````dgjhd````````````````````````````chkkekeelkcagkfi```````````````````ec`k``glbljhlkkkdddkkdjddkkekalh``lcbbbiccdj`hd```gelkabj`d``hi```````",
+"``````````````````````````````````````````````````````jg```````````````````gjcdd```h``````````````````````````hejgdiach`gjklh`````````````````gec`k``gddkchkggggaaagaagg``heglh`ala``````bc`ad````ihkldjgj``hi```````",
+"``````````````````````````````````````````````````````gdg````````````````````ilea``h```abg`a```ig``````````````dhak``hb``b`jk`````````````````bkcgk```alkbalcg````````````hk`fh`glg``````hh`gc```gc``hkdac``bb```````",
+"```````````````````````````````````````````````````````gdh```````````````````gdli``h`h`gjhg```bk```````````````icijg`gc````ala````````````````bkhad````eeaijdda```````````bkala`alg``````aa``c```gc```ichi``ia```````",
+"`````````````````````````````````````````````````````````cb``````````````````gclk``b`b`bhgb```eh```````````````gjgji`gc`ha``dk````````````````jegcc````jegeiahkcg`````````aklfeeel```````gb``j```gj```jiibg`i````````",
+"``````````````````````````````````````````````````````````ic```````````````````cla`b`hgja`c``bii````````````````a`jicbb`aj``bd````````````````aekeh````jkakejggdlc``````````ghbihg```````gj`ge```gc```kkekjckh```````",
+"```````````````````````````````````````````````````````````hda`````````````````alkgb`aachbjg`jhh`````````````````ga`cd```d``cj```````````````````ig```gjcgkgjec`adeb``````````````````````ekij```gb```ha`gaaklja`````",
+"````````````````````````````````````````````````````````````gjh`````````````````cdhj`gbhkchi`j`b````````````````````ik``gd``kh````````````````````````heigd``helb`gdkddddkkeeeeekdcjjjcciijkleeeediiiiibibbbbckc`````",
+"``````````````````````````````````````````````````````````````jg`````````````````cccigigekgj`j`b```````````````````ajcb`bi`bj`````````````````````````ieihc```aefkhglhgagggghbcciichaahhbbbbiiccicjiiiiiiiicjcjc`````",
+"``````````````````````````````````````````````````````````````ga``````````````````ckgii`jecbid`ha`````````````````gb`hb`dg`kg`````````````````````````cldji````gcefllg````````````````````````````````````````aj`````",
+"```````````````````````````````````````````````````````````````````````````````````abbc`ajeaikb`i```````````````````gcghj`dh```````````````````````````hdeb```````aefjccibhhhhhhbbibbibiiibhaggahbcjjjjccciccjdi`````",
+"````````````````````````````````````````````````````````````````````````````````````iiac``ckgjkgah``````````````````caadgjh``````````````````````````````g`````````gadjdkkkeekkdddjjjjjccccjdkkddjcbhhhhhhhagg```````",
+"```````````````````````````````````````````````````````````````````````````````````aab`acjgkdgdd`i`````````````````chadgba```````````````````````````````````````````````````````````````````````````````````````````",
+"```````````````````````````````````````````````````````````````````````````````````bi````ghajbiciab``````````````gcbhdgbb````````````````````````````````````````````````````````````````````````````````````````````",
+"``````````````````````````````````````````````````````````````````````````````````bha`````g`bdgjj`bg``````````gahbggdgih`````````````````````````````````````````````````````````````````````````````````````````````",
+"`````````````````````````````````````````````````````````````````````````````````gbc`````gghadgcj``i`````````jeda`gdgcg```ghiccg`````````````````````````````````````````````````````````````````````````````````````",
+"`````````````````````````````````````````````````````````````````````````````````i`j``````hcgjgjcg`gc```````gdkh``jajh`acjia`bbjhg```````````````````````````````````````````````````````````````````````````````````",
+"`````````````````````````````````````````````````````````````````````````````````c`j````abgdhichig``j```````jik``chjhgjdeg``gg``jba``````````````````````````````````````````````````````````````````````````````````",
+"`````````````````````````````````````````````````````````````````````````````````c`c``gih`cgcgdgia`bb```````kid`hcch`dhdlkhildb`gjb``````````````````````````````````````````````````````````````````````````````````",
+"`````````````````````````````````````````````````````````````````````````````````igb`ab`gia`jgj`cg`c````````kij`jci`gddlllbjlcj``db``````````````````````````````````````````````````````````````````````````````````",
+"`````````````````````````````````````````````````````````````````````````````````aaa`b`bcg``jbc`j`ab````````ehjgkj``celfffjklldjkei``````````````````````````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````hgcg````chj`c`ba`````g``k`dbeg``klfflflefelfkjj``````````````````````````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````gcg`````ibkhabcg`````a``k`jbl```kllfllfdllffleb``````````````````````````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````ab``````gjci`iba`````aa`jbhidb``jflfklfllfflkk```````````````````````````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````bg```````cbkhbgi`g````i`be`g`cb`hfecajfllffecj```````````````````````````````````````````````````````````````````````````````````",
+"``````````````````````````````````````````````````````````````````````````````````````````````chj``b``g```jggej```ccgeljdjllffleeg```````````````````````````````````````````````````````````````````````````````````",
+"```````````````````````````````````````````````````````````````````````````````````````````````hh`````````bc`iji```bddlfffffffeljg```````````````````````````````````````````````````````````````````````````````````",
+"```````````````````````````````````````````````````````````````````````````````````````````````i```````````ikjjejg```hjdlffffffekelc`````````````````````````````````````````````````````````````````````````````````",
+"``````````````````````````````````````````````````````````````````````````````````````````````gb````````````bccidkcg````ahidekjg``gkci```````````````````````````````````````````````````````````````````````````````",
+"``````````````````````````````````````````````````````````````````````````````````````````````h````````````````g``hdg`````````g```bkji```````````````````````````````````````````````````````````````````````````````",
+"```````````````````````````````````````````````````````````````````````````````````````````````````````````````````ga````````````gklei```````````````````````````````````````````````````````````````````````````````",
+"`````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"`````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"`````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````"
+};
diff --git a/doc/grnexmpl.g b/doc/grnexmpl.g
new file mode 100644
index 0000000..ba1a1b8
--- /dev/null
+++ b/doc/grnexmpl.g
@@ -0,0 +1,3250 @@
+sungremlinfile
+0 320.00 240.00
+ARC
+320.00 240.00
+320.00 416.00
+320.00 416.00
+320.00 64.00
+496.00 240.00
+144.00 240.00
+*
+4 0
+0
+CURVE BSPLINE
+764.00 288.00
+776.00 304.00
+764.00 320.00
+*
+3 0
+0
+CURVE BSPLINE
+768.00 288.00
+780.00 304.00
+768.00 320.00
+*
+3 0
+0
+CURVE BSPLINE
+768.00 320.00
+788.00 320.00
+800.00 304.00
+*
+3 0
+0
+CURVE BSPLINE
+768.00 288.00
+788.00 288.00
+800.00 304.00
+*
+3 0
+0
+ARC
+192.00 268.00
+192.00 267.00
+192.00 269.00
+192.00 267.00
+193.00 268.00
+191.00 268.00
+*
+3 0
+0
+ARC
+192.00 212.00
+192.00 211.00
+192.00 213.00
+192.00 211.00
+193.00 212.00
+191.00 212.00
+*
+3 0
+0
+CENTRIGHT
+476.00 32.00
+430.00 28.00
+453.00 28.00
+476.00 28.00
+*
+1 1
+10 $DP sub 2$
+CENTRIGHT
+476.00 224.00
+430.00 220.00
+453.00 220.00
+476.00 220.00
+*
+1 1
+10 $DP sub 2$
+CENTRIGHT
+476.00 256.00
+430.00 252.00
+453.00 252.00
+476.00 252.00
+*
+1 1
+10 $DP sub 2$
+CENTRIGHT
+476.00 448.00
+430.00 444.00
+453.00 444.00
+476.00 444.00
+*
+1 1
+10 $DP sub 2$
+VECTOR
+604.00 344.00
+612.00 344.00
+612.00 364.00
+620.00 364.00
+*
+6 0
+0
+ARC
+416.00 320.00
+416.00 319.00
+416.00 321.00
+416.00 319.00
+417.00 320.00
+415.00 320.00
+*
+3 0
+0
+CENTLEFT
+596.00 336.00
+596.00 332.00
+604.00 332.00
+613.00 332.00
+*
+1 1
+3 $-$
+CENTLEFT
+596.00 368.00
+596.00 364.00
+604.00 364.00
+612.00 364.00
+*
+1 1
+3 $+$
+POLYGON
+592.00 320.00
+592.00 384.00
+656.00 352.00
+592.00 320.00
+*
+3 1
+0
+ARC
+392.00 390.00
+392.00 392.00
+392.00 392.00
+392.00 388.00
+390.00 390.00
+394.00 390.00
+*
+3 0
+0
+VECTOR
+396.00 388.00
+384.00 384.00
+*
+3 0
+0
+ARC
+392.00 378.00
+392.00 380.00
+392.00 380.00
+392.00 376.00
+390.00 378.00
+394.00 378.00
+*
+3 0
+0
+ARC
+312.00 326.00
+312.00 328.00
+312.00 328.00
+312.00 324.00
+314.00 326.00
+310.00 326.00
+*
+3 0
+0
+CENTRIGHT
+276.00 352.00
+243.00 348.00
+259.00 348.00
+276.00 348.00
+*
+1 1
+7 $vv B2$
+POLYGON
+280.00 356.00
+280.00 348.00
+284.00 348.00
+288.00 352.00
+284.00 356.00
+*
+3 21
+0
+VECTOR
+308.00 324.00
+320.00 320.00
+*
+3 0
+0
+ARC
+312.00 314.00
+312.00 316.00
+312.00 316.00
+312.00 312.00
+314.00 314.00
+310.00 314.00
+*
+3 0
+0
+CENTLEFT
+292.00 212.00
+292.00 208.00
+300.00 208.00
+308.00 208.00
+*
+1 1
+3 $+$
+CENTLEFT
+292.00 268.00
+292.00 264.00
+300.00 264.00
+309.00 264.00
+*
+1 1
+3 $-$
+POLYGON
+288.00 192.00
+288.00 288.00
+384.00 240.00
+288.00 192.00
+*
+3 1
+0
+ARC
+256.00 268.00
+256.00 267.00
+256.00 269.00
+256.00 267.00
+257.00 268.00
+255.00 268.00
+*
+3 0
+0
+VECTOR
+328.00 268.00
+416.00 268.00
+416.00 320.00
+356.00 320.00
+*
+6 0
+0
+VECTOR
+356.00 328.00
+356.00 312.00
+*
+3 0
+0
+VECTOR
+352.00 328.00
+352.00 312.00
+*
+6 0
+0
+VECTOR
+320.00 320.00
+352.00 320.00
+*
+6 0
+0
+VECTOR
+312.00 312.00
+256.00 312.00
+256.00 268.00
+288.00 268.00
+*
+6 0
+0
+VECTOR
+224.00 276.00
+224.00 260.00
+*
+3 0
+0
+VECTOR
+228.00 276.00
+228.00 260.00
+*
+6 0
+0
+VECTOR
+228.00 268.00
+256.00 268.00
+*
+6 0
+0
+VECTOR
+224.00 268.00
+192.00 268.00
+192.00 384.00
+316.00 384.00
+*
+6 0
+0
+VECTOR
+320.00 392.00
+320.00 376.00
+*
+3 0
+0
+VECTOR
+316.00 392.00
+316.00 376.00
+*
+6 0
+0
+VECTOR
+312.00 328.00
+312.00 352.00
+288.00 352.00
+*
+6 0
+0
+VECTOR
+392.00 392.00
+416.00 392.00
+416.00 320.00
+*
+6 0
+0
+VECTOR
+320.00 384.00
+384.00 384.00
+*
+6 0
+0
+VECTOR
+192.00 256.00
+192.00 268.00
+160.00 268.00
+*
+6 0
+0
+ARC
+160.00 266.00
+160.00 268.00
+160.00 268.00
+160.00 264.00
+158.00 266.00
+162.00 266.00
+*
+3 0
+0
+VECTOR
+164.00 256.00
+152.00 260.00
+*
+3 0
+0
+ARC
+160.00 254.00
+160.00 256.00
+160.00 256.00
+160.00 252.00
+158.00 254.00
+162.00 254.00
+*
+3 0
+0
+ARC
+194.00 256.00
+196.00 256.00
+196.00 256.00
+192.00 256.00
+194.00 254.00
+194.00 258.00
+*
+3 0
+0
+VECTOR
+204.00 260.00
+200.00 248.00
+*
+3 0
+0
+VECTOR
+200.00 248.00
+200.00 232.00
+*
+6 0
+0
+VECTOR
+152.00 260.00
+128.00 260.00
+*
+6 0
+0
+ARC
+96.00 266.00
+96.00 268.00
+96.00 268.00
+96.00 264.00
+98.00 266.00
+94.00 266.00
+*
+3 0
+0
+VECTOR
+92.00 256.00
+104.00 260.00
+*
+3 0
+0
+ARC
+96.00 254.00
+96.00 256.00
+96.00 256.00
+96.00 252.00
+98.00 254.00
+94.00 254.00
+*
+3 0
+0
+VECTOR
+124.00 268.00
+124.00 252.00
+*
+3 0
+0
+VECTOR
+128.00 268.00
+128.00 252.00
+*
+6 0
+0
+VECTOR
+104.00 260.00
+124.00 260.00
+*
+6 0
+0
+VECTOR
+96.00 268.00
+96.00 320.00
+40.00 320.00
+*
+6 0
+0
+ARC
+28.00 338.00
+28.00 340.00
+28.00 340.00
+28.00 336.00
+30.00 338.00
+26.00 338.00
+*
+3 0
+0
+VECTOR
+24.00 336.00
+40.00 320.00
+*
+3 0
+0
+ARC
+28.00 302.00
+28.00 304.00
+28.00 304.00
+28.00 300.00
+30.00 302.00
+26.00 302.00
+*
+3 0
+0
+ARC
+14.00 320.00
+12.00 320.00
+12.00 320.00
+16.00 320.00
+14.00 322.00
+14.00 318.00
+*
+3 0
+0
+VECTOR
+96.00 252.00
+76.00 252.00
+*
+6 0
+0
+ARC
+68.00 258.00
+68.00 260.00
+68.00 260.00
+68.00 256.00
+70.00 258.00
+66.00 258.00
+*
+3 0
+0
+VECTOR
+64.00 248.00
+76.00 252.00
+*
+3 0
+0
+ARC
+68.00 246.00
+68.00 248.00
+68.00 248.00
+68.00 244.00
+70.00 246.00
+66.00 246.00
+*
+3 0
+0
+VECTOR
+352.00 384.00
+352.00 416.00
+512.00 416.00
+*
+6 0
+0
+VECTOR
+512.00 424.00
+512.00 408.00
+*
+3 0
+0
+VECTOR
+516.00 424.00
+516.00 408.00
+*
+6 0
+0
+VECTOR
+516.00 416.00
+564.00 416.00
+564.00 368.00
+592.00 368.00
+*
+6 0
+0
+VECTOR
+564.00 416.00
+564.00 448.00
+516.00 448.00
+*
+6 0
+0
+ARC
+480.00 454.00
+480.00 456.00
+480.00 456.00
+480.00 452.00
+482.00 454.00
+478.00 454.00
+*
+3 0
+0
+VECTOR
+476.00 444.00
+488.00 448.00
+*
+3 0
+0
+ARC
+480.00 442.00
+480.00 444.00
+480.00 444.00
+480.00 440.00
+482.00 442.00
+478.00 442.00
+*
+3 0
+0
+VECTOR
+512.00 456.00
+512.00 440.00
+*
+3 0
+0
+VECTOR
+516.00 456.00
+516.00 440.00
+*
+6 0
+0
+VECTOR
+488.00 448.00
+512.00 448.00
+*
+6 0
+0
+VECTOR
+480.00 440.00
+480.00 416.00
+*
+6 0
+0
+ARC
+352.00 384.00
+352.00 383.00
+352.00 385.00
+352.00 383.00
+353.00 384.00
+351.00 384.00
+*
+3 0
+0
+ARC
+480.00 416.00
+480.00 415.00
+480.00 417.00
+480.00 415.00
+481.00 416.00
+479.00 416.00
+*
+3 0
+0
+ARC
+564.00 416.00
+564.00 415.00
+564.00 417.00
+564.00 415.00
+565.00 416.00
+563.00 416.00
+*
+3 0
+0
+VECTOR
+480.00 456.00
+480.00 472.00
+*
+6 0
+0
+BOTCENT
+480.00 488.00
+452.00 488.00
+480.00 488.00
+509.00 488.00
+*
+1 1
+12 $- ^ vv REF$
+POLYGON
+484.00 480.00
+476.00 480.00
+476.00 476.00
+480.00 472.00
+484.00 476.00
+*
+3 21
+0
+ARC
+550.00 396.00
+548.00 396.00
+548.00 396.00
+552.00 396.00
+550.00 394.00
+550.00 398.00
+*
+3 0
+0
+VECTOR
+540.00 400.00
+544.00 388.00
+*
+3 0
+0
+VECTOR
+544.00 388.00
+544.00 316.00
+*
+6 0
+0
+VECTOR
+552.00 396.00
+552.00 416.00
+*
+6 0
+0
+ARC
+552.00 416.00
+552.00 415.00
+552.00 417.00
+552.00 415.00
+553.00 416.00
+551.00 416.00
+*
+3 0
+0
+CENTRIGHT
+516.00 352.00
+483.00 348.00
+499.00 348.00
+516.00 348.00
+*
+1 1
+7 $vv B1$
+POLYGON
+520.00 356.00
+520.00 348.00
+524.00 348.00
+528.00 352.00
+524.00 356.00
+*
+3 21
+0
+VECTOR
+512.00 280.00
+512.00 296.00
+*
+3 0
+0
+VECTOR
+516.00 280.00
+516.00 296.00
+*
+6 0
+0
+VECTOR
+564.00 288.00
+564.00 256.00
+516.00 256.00
+*
+6 0
+0
+ARC
+480.00 250.00
+480.00 248.00
+480.00 248.00
+480.00 252.00
+482.00 250.00
+478.00 250.00
+*
+3 0
+0
+VECTOR
+476.00 260.00
+488.00 256.00
+*
+3 0
+0
+ARC
+480.00 262.00
+480.00 260.00
+480.00 260.00
+480.00 264.00
+482.00 262.00
+478.00 262.00
+*
+3 0
+0
+VECTOR
+512.00 248.00
+512.00 264.00
+*
+3 0
+0
+VECTOR
+516.00 248.00
+516.00 264.00
+*
+6 0
+0
+VECTOR
+488.00 256.00
+512.00 256.00
+*
+6 0
+0
+VECTOR
+480.00 264.00
+480.00 288.00
+*
+6 0
+0
+ARC
+480.00 288.00
+480.00 289.00
+480.00 287.00
+480.00 289.00
+481.00 288.00
+479.00 288.00
+*
+3 0
+0
+ARC
+564.00 288.00
+564.00 289.00
+564.00 287.00
+564.00 289.00
+565.00 288.00
+563.00 288.00
+*
+3 0
+0
+VECTOR
+480.00 248.00
+480.00 232.00
+*
+6 0
+0
+ARC
+550.00 308.00
+548.00 308.00
+548.00 308.00
+552.00 308.00
+550.00 310.00
+550.00 306.00
+*
+3 0
+0
+VECTOR
+540.00 304.00
+544.00 316.00
+*
+3 0
+0
+VECTOR
+552.00 308.00
+552.00 288.00
+*
+6 0
+0
+ARC
+552.00 288.00
+552.00 289.00
+552.00 287.00
+552.00 289.00
+553.00 288.00
+551.00 288.00
+*
+3 0
+0
+VECTOR
+528.00 352.00
+544.00 352.00
+*
+6 0
+0
+ARC
+544.00 352.00
+544.00 351.00
+544.00 353.00
+544.00 351.00
+545.00 352.00
+543.00 352.00
+*
+3 0
+0
+VECTOR
+516.00 288.00
+564.00 288.00
+564.00 336.00
+592.00 336.00
+*
+6 0
+0
+VECTOR
+512.00 288.00
+448.00 288.00
+448.00 64.00
+*
+6 0
+0
+VECTOR
+352.00 416.00
+352.00 448.00
+*
+6 0
+0
+ARC
+352.00 416.00
+352.00 415.00
+352.00 417.00
+352.00 415.00
+353.00 416.00
+351.00 416.00
+*
+3 0
+0
+BOTCENT
+352.00 460.00
+343.00 460.00
+352.00 460.00
+361.00 460.00
+*
+1 1
+3 $A$
+POLYGON
+356.00 448.00
+348.00 448.00
+348.00 452.00
+352.00 456.00
+356.00 452.00
+*
+3 21
+0
+BOTCENT
+320.00 396.00
+307.00 396.00
+320.00 396.00
+333.00 396.00
+*
+1 1
+6 $cc F$
+BOTRIGHT
+348.00 328.00
+321.00 328.00
+334.00 328.00
+348.00 328.00
+*
+1 1
+6 $cc O$
+BOTCENT
+228.00 280.00
+215.00 280.00
+228.00 280.00
+242.00 280.00
+*
+1 1
+6 $cc C$
+BOTCENT
+128.00 272.00
+116.00 272.00
+128.00 272.00
+141.00 272.00
+*
+1 1
+6 $cc S$
+CENTLEFT
+204.00 256.00
+204.00 252.00
+227.00 252.00
+250.00 252.00
+*
+1 1
+10 $DP sub 2$
+BOTCENT
+68.00 264.00
+56.00 264.00
+68.00 264.00
+80.00 264.00
+*
+1 1
+4 $PN$
+TOPRIGHT
+388.00 380.00
+342.00 371.00
+365.00 371.00
+388.00 371.00
+*
+1 1
+10 $DP sub 2$
+TOPCENT
+392.00 348.00
+372.00 339.00
+392.00 339.00
+412.00 339.00
+*
+1 1
+6 $AGND$
+POLYGON
+396.00 352.00
+388.00 352.00
+388.00 356.00
+392.00 360.00
+396.00 356.00
+*
+3 21
+0
+VECTOR
+392.00 360.00
+392.00 376.00
+*
+6 0
+0
+TOPRIGHT
+540.00 396.00
+494.00 387.00
+517.00 387.00
+540.00 387.00
+*
+1 1
+10 $DP sub 1$
+CENTRIGHT
+508.00 440.00
+476.00 436.00
+492.00 436.00
+508.00 436.00
+*
+1 1
+7 $cc D1$
+CENTRIGHT
+508.00 408.00
+476.00 404.00
+492.00 404.00
+508.00 404.00
+*
+1 1
+7 $cc D2$
+BOTRIGHT
+508.00 268.00
+476.00 268.00
+492.00 268.00
+508.00 268.00
+*
+1 1
+7 $cc D1$
+BOTRIGHT
+508.00 300.00
+476.00 300.00
+492.00 300.00
+508.00 300.00
+*
+1 1
+7 $cc D2$
+VECTOR
+672.00 392.00
+672.00 344.00
+720.00 344.00
+720.00 392.00
+672.00 392.00
+*
+3 0
+0
+ARC
+696.00 396.00
+696.00 392.00
+696.00 400.00
+696.00 392.00
+700.00 396.00
+692.00 396.00
+*
+3 0
+0
+TOPCENT
+696.00 392.00
+688.00 383.00
+696.00 383.00
+705.00 383.00
+*
+1 1
+3 $R$
+ARC
+668.00 368.00
+668.00 364.00
+668.00 372.00
+668.00 364.00
+672.00 368.00
+664.00 368.00
+*
+3 0
+0
+CENTLEFT
+676.00 368.00
+676.00 364.00
+688.00 364.00
+700.00 364.00
+*
+1 1
+4 $CK$
+ARC
+724.00 368.00
+724.00 364.00
+724.00 372.00
+724.00 364.00
+720.00 368.00
+728.00 368.00
+*
+3 0
+0
+CENTRIGHT
+720.00 368.00
+688.00 364.00
+704.00 364.00
+720.00 364.00
+*
+1 1
+7 $O bar$
+CENTLEFT
+676.00 352.00
+676.00 348.00
+684.00 348.00
+693.00 348.00
+*
+1 1
+3 $D$
+CENTRIGHT
+720.00 352.00
+703.00 348.00
+711.00 348.00
+720.00 348.00
+*
+1 1
+3 $O$
+VECTOR
+656.00 352.00
+672.00 352.00
+*
+6 0
+0
+VECTOR
+720.00 352.00
+736.00 352.00
+736.00 176.00
+768.00 176.00
+*
+6 0
+0
+VECTOR
+728.00 368.00
+800.00 368.00
+*
+6 0
+0
+BOTRIGHT
+804.00 376.00
+762.00 376.00
+783.00 376.00
+804.00 376.00
+*
+1 1
+6 $DOWN$
+POLYGON
+800.00 372.00
+800.00 364.00
+804.00 364.00
+808.00 368.00
+804.00 372.00
+*
+3 21
+0
+VECTOR
+516.00 192.00
+564.00 192.00
+564.00 144.00
+592.00 144.00
+*
+6 0
+0
+VECTOR
+512.00 192.00
+432.00 192.00
+432.00 416.00
+*
+6 0
+0
+VECTOR
+512.00 200.00
+512.00 184.00
+*
+3 0
+0
+VECTOR
+516.00 200.00
+516.00 184.00
+*
+6 0
+0
+VECTOR
+564.00 192.00
+564.00 224.00
+516.00 224.00
+*
+6 0
+0
+ARC
+480.00 230.00
+480.00 232.00
+480.00 232.00
+480.00 228.00
+482.00 230.00
+478.00 230.00
+*
+3 0
+0
+VECTOR
+476.00 220.00
+488.00 224.00
+*
+3 0
+0
+ARC
+480.00 218.00
+480.00 220.00
+480.00 220.00
+480.00 216.00
+482.00 218.00
+478.00 218.00
+*
+3 0
+0
+VECTOR
+512.00 232.00
+512.00 216.00
+*
+3 0
+0
+VECTOR
+516.00 232.00
+516.00 216.00
+*
+6 0
+0
+VECTOR
+488.00 224.00
+512.00 224.00
+*
+6 0
+0
+VECTOR
+480.00 216.00
+480.00 192.00
+*
+6 0
+0
+ARC
+480.00 192.00
+480.00 191.00
+480.00 193.00
+480.00 191.00
+481.00 192.00
+479.00 192.00
+*
+3 0
+0
+ARC
+564.00 192.00
+564.00 191.00
+564.00 193.00
+564.00 191.00
+565.00 192.00
+563.00 192.00
+*
+3 0
+0
+VECTOR
+480.00 232.00
+480.00 248.00
+*
+6 0
+0
+VECTOR
+552.00 172.00
+552.00 192.00
+*
+6 0
+0
+ARC
+552.00 192.00
+552.00 191.00
+552.00 193.00
+552.00 191.00
+553.00 192.00
+551.00 192.00
+*
+3 0
+0
+TOPRIGHT
+508.00 220.00
+476.00 211.00
+492.00 211.00
+508.00 211.00
+*
+1 1
+7 $cc D1$
+TOPRIGHT
+508.00 188.00
+476.00 179.00
+492.00 179.00
+508.00 179.00
+*
+1 1
+7 $cc D2$
+VECTOR
+224.00 212.00
+192.00 212.00
+192.00 96.00
+316.00 96.00
+*
+6 0
+0
+VECTOR
+312.00 168.00
+256.00 168.00
+256.00 212.00
+288.00 212.00
+*
+6 0
+0
+VECTOR
+328.00 212.00
+416.00 212.00
+416.00 160.00
+356.00 160.00
+*
+6 0
+0
+VECTOR
+604.00 136.00
+612.00 136.00
+612.00 116.00
+620.00 116.00
+*
+6 0
+0
+ARC
+416.00 160.00
+416.00 161.00
+416.00 159.00
+416.00 161.00
+417.00 160.00
+415.00 160.00
+*
+3 0
+0
+CENTLEFT
+596.00 112.00
+596.00 108.00
+604.00 108.00
+613.00 108.00
+*
+1 1
+3 $-$
+CENTLEFT
+596.00 144.00
+596.00 140.00
+604.00 140.00
+612.00 140.00
+*
+1 1
+3 $+$
+POLYGON
+592.00 160.00
+592.00 96.00
+656.00 128.00
+592.00 160.00
+*
+3 1
+0
+ARC
+392.00 90.00
+392.00 88.00
+392.00 88.00
+392.00 92.00
+390.00 90.00
+394.00 90.00
+*
+3 0
+0
+VECTOR
+396.00 92.00
+384.00 96.00
+*
+3 0
+0
+ARC
+392.00 102.00
+392.00 100.00
+392.00 100.00
+392.00 104.00
+390.00 102.00
+394.00 102.00
+*
+3 0
+0
+ARC
+312.00 154.00
+312.00 152.00
+312.00 152.00
+312.00 156.00
+314.00 154.00
+310.00 154.00
+*
+3 0
+0
+CENTRIGHT
+276.00 128.00
+243.00 124.00
+259.00 124.00
+276.00 124.00
+*
+1 1
+7 $vv B2$
+POLYGON
+280.00 124.00
+280.00 132.00
+284.00 132.00
+288.00 128.00
+284.00 124.00
+*
+3 21
+0
+VECTOR
+308.00 156.00
+320.00 160.00
+*
+3 0
+0
+ARC
+312.00 166.00
+312.00 164.00
+312.00 164.00
+312.00 168.00
+314.00 166.00
+310.00 166.00
+*
+3 0
+0
+VECTOR
+356.00 152.00
+356.00 168.00
+*
+3 0
+0
+VECTOR
+352.00 152.00
+352.00 168.00
+*
+6 0
+0
+VECTOR
+320.00 160.00
+352.00 160.00
+*
+6 0
+0
+VECTOR
+320.00 88.00
+320.00 104.00
+*
+3 0
+0
+VECTOR
+316.00 88.00
+316.00 104.00
+*
+6 0
+0
+VECTOR
+312.00 152.00
+312.00 128.00
+288.00 128.00
+*
+6 0
+0
+VECTOR
+392.00 88.00
+416.00 88.00
+416.00 160.00
+*
+6 0
+0
+VECTOR
+320.00 96.00
+384.00 96.00
+*
+6 0
+0
+VECTOR
+352.00 96.00
+352.00 64.00
+512.00 64.00
+*
+6 0
+0
+VECTOR
+512.00 56.00
+512.00 72.00
+*
+3 0
+0
+VECTOR
+516.00 56.00
+516.00 72.00
+*
+6 0
+0
+VECTOR
+516.00 64.00
+564.00 64.00
+564.00 112.00
+592.00 112.00
+*
+6 0
+0
+VECTOR
+564.00 64.00
+564.00 32.00
+516.00 32.00
+*
+6 0
+0
+ARC
+480.00 26.00
+480.00 24.00
+480.00 24.00
+480.00 28.00
+482.00 26.00
+478.00 26.00
+*
+3 0
+0
+VECTOR
+476.00 36.00
+488.00 32.00
+*
+3 0
+0
+ARC
+480.00 38.00
+480.00 36.00
+480.00 36.00
+480.00 40.00
+482.00 38.00
+478.00 38.00
+*
+3 0
+0
+VECTOR
+512.00 24.00
+512.00 40.00
+*
+3 0
+0
+VECTOR
+516.00 24.00
+516.00 40.00
+*
+6 0
+0
+VECTOR
+488.00 32.00
+512.00 32.00
+*
+6 0
+0
+VECTOR
+480.00 40.00
+480.00 64.00
+*
+6 0
+0
+ARC
+352.00 96.00
+352.00 97.00
+352.00 95.00
+352.00 97.00
+353.00 96.00
+351.00 96.00
+*
+3 0
+0
+ARC
+480.00 64.00
+480.00 65.00
+480.00 63.00
+480.00 65.00
+481.00 64.00
+479.00 64.00
+*
+3 0
+0
+ARC
+564.00 64.00
+564.00 65.00
+564.00 63.00
+564.00 65.00
+565.00 64.00
+563.00 64.00
+*
+3 0
+0
+VECTOR
+480.00 24.00
+480.00 8.00
+*
+6 0
+0
+TOPCENT
+480.00 -4.00
+452.00 -13.00
+480.00 -13.00
+509.00 -13.00
+*
+1 1
+12 $- ^ vv REF$
+POLYGON
+484.00 0.00
+476.00 0.00
+476.00 4.00
+480.00 8.00
+484.00 4.00
+*
+3 21
+0
+ARC
+550.00 84.00
+548.00 84.00
+548.00 84.00
+552.00 84.00
+550.00 86.00
+550.00 82.00
+*
+3 0
+0
+VECTOR
+540.00 80.00
+544.00 92.00
+*
+3 0
+0
+VECTOR
+544.00 92.00
+544.00 164.00
+*
+6 0
+0
+VECTOR
+552.00 84.00
+552.00 64.00
+*
+6 0
+0
+ARC
+552.00 64.00
+552.00 65.00
+552.00 63.00
+552.00 65.00
+553.00 64.00
+551.00 64.00
+*
+3 0
+0
+CENTRIGHT
+516.00 128.00
+483.00 124.00
+499.00 124.00
+516.00 124.00
+*
+1 1
+7 $vv B1$
+POLYGON
+520.00 124.00
+520.00 132.00
+524.00 132.00
+528.00 128.00
+524.00 124.00
+*
+3 21
+0
+ARC
+550.00 172.00
+548.00 172.00
+548.00 172.00
+552.00 172.00
+550.00 170.00
+550.00 174.00
+*
+3 0
+0
+VECTOR
+540.00 176.00
+544.00 164.00
+*
+3 0
+0
+VECTOR
+528.00 128.00
+544.00 128.00
+*
+6 0
+0
+ARC
+544.00 128.00
+544.00 129.00
+544.00 127.00
+544.00 129.00
+545.00 128.00
+543.00 128.00
+*
+3 0
+0
+VECTOR
+352.00 64.00
+352.00 32.00
+*
+6 0
+0
+ARC
+352.00 64.00
+352.00 65.00
+352.00 63.00
+352.00 65.00
+353.00 64.00
+351.00 64.00
+*
+3 0
+0
+CENTCENT
+352.00 16.00
+344.00 12.00
+352.00 12.00
+360.00 12.00
+*
+1 1
+3 $B$
+POLYGON
+356.00 32.00
+348.00 32.00
+348.00 28.00
+352.00 24.00
+356.00 28.00
+*
+3 21
+0
+TOPCENT
+320.00 84.00
+307.00 75.00
+320.00 75.00
+333.00 75.00
+*
+1 1
+6 $cc F$
+TOPRIGHT
+348.00 160.00
+321.00 151.00
+334.00 151.00
+348.00 151.00
+*
+1 1
+6 $cc O$
+BOTRIGHT
+388.00 100.00
+342.00 100.00
+365.00 100.00
+388.00 100.00
+*
+1 1
+10 $DP sub 2$
+BOTCENT
+392.00 132.00
+372.00 132.00
+392.00 132.00
+412.00 132.00
+*
+1 1
+6 $AGND$
+POLYGON
+396.00 128.00
+388.00 128.00
+388.00 124.00
+392.00 120.00
+396.00 124.00
+*
+3 21
+0
+VECTOR
+392.00 120.00
+392.00 104.00
+*
+6 0
+0
+BOTRIGHT
+540.00 84.00
+494.00 84.00
+517.00 84.00
+540.00 84.00
+*
+1 1
+10 $DP sub 1$
+BOTRIGHT
+508.00 44.00
+476.00 44.00
+492.00 44.00
+508.00 44.00
+*
+1 1
+7 $cc D1$
+BOTRIGHT
+508.00 76.00
+476.00 76.00
+492.00 76.00
+508.00 76.00
+*
+1 1
+7 $cc D2$
+VECTOR
+672.00 88.00
+672.00 136.00
+720.00 136.00
+720.00 88.00
+672.00 88.00
+*
+3 0
+0
+ARC
+696.00 84.00
+696.00 88.00
+696.00 80.00
+696.00 88.00
+700.00 84.00
+692.00 84.00
+*
+3 0
+0
+BOTCENT
+696.00 88.00
+688.00 88.00
+696.00 88.00
+705.00 88.00
+*
+1 1
+3 $R$
+ARC
+668.00 112.00
+668.00 116.00
+668.00 108.00
+668.00 116.00
+672.00 112.00
+664.00 112.00
+*
+3 0
+0
+CENTLEFT
+676.00 112.00
+676.00 108.00
+688.00 108.00
+700.00 108.00
+*
+1 1
+4 $CK$
+ARC
+724.00 112.00
+724.00 116.00
+724.00 108.00
+724.00 116.00
+720.00 112.00
+728.00 112.00
+*
+3 0
+0
+CENTRIGHT
+720.00 112.00
+688.00 108.00
+704.00 108.00
+720.00 108.00
+*
+1 1
+7 $O bar$
+CENTLEFT
+676.00 128.00
+676.00 124.00
+684.00 124.00
+693.00 124.00
+*
+1 1
+3 $D$
+CENTRIGHT
+720.00 128.00
+703.00 124.00
+711.00 124.00
+720.00 124.00
+*
+1 1
+3 $O$
+VECTOR
+656.00 128.00
+672.00 128.00
+*
+6 0
+0
+VECTOR
+720.00 128.00
+800.00 128.00
+*
+6 0
+0
+CENTRIGHT
+804.00 120.00
+780.00 116.00
+792.00 116.00
+804.00 116.00
+*
+1 1
+4 $UP$
+POLYGON
+800.00 124.00
+800.00 132.00
+804.00 132.00
+808.00 128.00
+804.00 124.00
+*
+3 21
+0
+ARC
+256.00 212.00
+256.00 213.00
+256.00 211.00
+256.00 213.00
+257.00 212.00
+255.00 212.00
+*
+3 0
+0
+VECTOR
+224.00 204.00
+224.00 220.00
+*
+3 0
+0
+VECTOR
+228.00 204.00
+228.00 220.00
+*
+6 0
+0
+VECTOR
+228.00 212.00
+256.00 212.00
+*
+6 0
+0
+VECTOR
+192.00 224.00
+192.00 212.00
+160.00 212.00
+*
+6 0
+0
+ARC
+160.00 214.00
+160.00 212.00
+160.00 212.00
+160.00 216.00
+158.00 214.00
+162.00 214.00
+*
+3 0
+0
+VECTOR
+164.00 224.00
+152.00 220.00
+*
+3 0
+0
+ARC
+160.00 226.00
+160.00 224.00
+160.00 224.00
+160.00 228.00
+158.00 226.00
+162.00 226.00
+*
+3 0
+0
+ARC
+194.00 224.00
+196.00 224.00
+196.00 224.00
+192.00 224.00
+194.00 226.00
+194.00 222.00
+*
+3 0
+0
+VECTOR
+204.00 220.00
+200.00 232.00
+*
+3 0
+0
+VECTOR
+152.00 220.00
+128.00 220.00
+*
+6 0
+0
+ARC
+96.00 214.00
+96.00 212.00
+96.00 212.00
+96.00 216.00
+98.00 214.00
+94.00 214.00
+*
+3 0
+0
+VECTOR
+92.00 224.00
+104.00 220.00
+*
+3 0
+0
+ARC
+96.00 226.00
+96.00 224.00
+96.00 224.00
+96.00 228.00
+98.00 226.00
+94.00 226.00
+*
+3 0
+0
+VECTOR
+124.00 212.00
+124.00 228.00
+*
+3 0
+0
+VECTOR
+128.00 212.00
+128.00 228.00
+*
+6 0
+0
+VECTOR
+104.00 220.00
+124.00 220.00
+*
+6 0
+0
+VECTOR
+96.00 212.00
+96.00 160.00
+40.00 160.00
+*
+6 0
+0
+VECTOR
+96.00 228.00
+76.00 228.00
+*
+6 0
+0
+ARC
+68.00 222.00
+68.00 220.00
+68.00 220.00
+68.00 224.00
+70.00 222.00
+66.00 222.00
+*
+3 0
+0
+VECTOR
+64.00 232.00
+76.00 228.00
+*
+3 0
+0
+ARC
+68.00 234.00
+68.00 232.00
+68.00 232.00
+68.00 236.00
+70.00 234.00
+66.00 234.00
+*
+3 0
+0
+TOPCENT
+228.00 200.00
+215.00 191.00
+228.00 191.00
+242.00 191.00
+*
+1 1
+6 $cc C$
+TOPCENT
+128.00 208.00
+116.00 199.00
+128.00 199.00
+141.00 199.00
+*
+1 1
+6 $cc S$
+CENTLEFT
+204.00 224.00
+204.00 220.00
+227.00 220.00
+250.00 220.00
+*
+1 1
+10 $DP sub 2$
+CENTRIGHT
+154.00 240.00
+129.00 236.00
+141.00 236.00
+154.00 236.00
+*
+1 1
+5 $ITS$
+CENTCENT
+94.00 240.00
+84.00 236.00
+94.00 236.00
+105.00 236.00
+*
+1 1
+4 $SP$
+TOPCENT
+68.00 216.00
+56.00 207.00
+68.00 207.00
+80.00 207.00
+*
+1 1
+4 $PN$
+ARC
+432.00 416.00
+432.00 415.00
+432.00 417.00
+432.00 415.00
+433.00 416.00
+431.00 416.00
+*
+3 0
+0
+ARC
+448.00 64.00
+448.00 63.00
+448.00 65.00
+448.00 63.00
+449.00 64.00
+447.00 64.00
+*
+3 0
+0
+VECTOR
+480.00 248.00
+480.00 232.00
+*
+6 0
+0
+CENTRIGHT
+452.00 240.00
+396.00 236.00
+424.00 236.00
+452.00 236.00
+*
+1 1
+12 $+ ^ vv REF$
+POLYGON
+452.00 244.00
+452.00 236.00
+456.00 236.00
+460.00 240.00
+456.00 244.00
+*
+3 21
+0
+VECTOR
+460.00 240.00
+480.00 240.00
+*
+6 0
+0
+ARC
+480.00 240.00
+480.00 241.00
+480.00 239.00
+480.00 241.00
+481.00 240.00
+479.00 240.00
+*
+3 0
+0
+VECTOR
+160.00 252.00
+160.00 228.00
+*
+6 0
+0
+VECTOR
+160.00 240.00
+224.00 240.00
+*
+6 0
+0
+ARC
+160.00 240.00
+160.00 239.00
+160.00 241.00
+160.00 239.00
+161.00 240.00
+159.00 240.00
+*
+3 0
+0
+ARC
+200.00 240.00
+200.00 239.00
+200.00 241.00
+200.00 239.00
+201.00 240.00
+199.00 240.00
+*
+3 0
+0
+CENTLEFT
+236.00 240.00
+236.00 236.00
+252.00 236.00
+268.00 236.00
+*
+1 1
+5 $GND$
+POLYGON
+232.00 244.00
+232.00 236.00
+228.00 236.00
+224.00 240.00
+228.00 244.00
+*
+3 21
+0
+TOPRIGHT
+540.00 172.00
+494.00 163.00
+517.00 163.00
+540.00 163.00
+*
+1 1
+10 $DP sub 1$
+BOTRIGHT
+540.00 308.00
+494.00 308.00
+517.00 308.00
+540.00 308.00
+*
+1 1
+10 $DP sub 1$
+VECTOR
+340.00 260.00
+340.00 220.00
+300.00 240.00
+340.00 260.00
+*
+3 0
+0
+VECTOR
+340.00 232.00
+384.00 232.00
+384.00 224.00
+*
+6 0
+0
+POLYGON
+380.00 224.00
+392.00 224.00
+384.00 216.00
+376.00 224.00
+*
+6 21
+0
+VECTOR
+340.00 248.00
+392.00 248.00
+*
+6 0
+0
+BOTLEFT
+396.00 256.00
+396.00 256.00
+416.00 256.00
+437.00 256.00
+*
+1 1
+8 $vv INC$
+POLYGON
+400.00 252.00
+400.00 244.00
+396.00 244.00
+392.00 248.00
+396.00 252.00
+*
+3 21
+0
+CENTRIGHT
+336.00 248.00
+319.00 244.00
+327.00 244.00
+336.00 244.00
+*
+1 1
+3 $-$
+CENTRIGHT
+336.00 232.00
+320.00 228.00
+328.00 228.00
+336.00 228.00
+*
+1 1
+3 $+$
+VECTOR
+784.00 192.00
+768.00 192.00
+768.00 160.00
+784.00 160.00
+*
+3 0
+0
+ARC
+784.00 176.00
+784.00 160.00
+784.00 192.00
+*
+3 180
+0
+VECTOR
+784.00 256.00
+768.00 256.00
+768.00 224.00
+784.00 224.00
+*
+3 0
+0
+ARC
+784.00 240.00
+784.00 224.00
+784.00 256.00
+*
+3 180
+0
+ARC
+832.00 312.00
+832.00 296.00
+832.00 328.00
+*
+3 180
+0
+VECTOR
+832.00 328.00
+816.00 328.00
+816.00 296.00
+832.00 296.00
+*
+3 0
+0
+VECTOR
+744.00 368.00
+744.00 312.00
+772.00 312.00
+*
+6 0
+0
+VECTOR
+744.00 312.00
+744.00 240.00
+768.00 240.00
+*
+6 0
+0
+VECTOR
+728.00 112.00
+744.00 112.00
+744.00 232.00
+768.00 232.00
+*
+6 0
+0
+VECTOR
+800.00 304.00
+816.00 304.00
+*
+6 0
+0
+VECTOR
+816.00 320.00
+800.00 320.00
+800.00 332.00
+720.00 332.00
+*
+6 0
+0
+CENTRIGHT
+708.00 332.00
+683.00 328.00
+695.00 328.00
+708.00 328.00
+*
+1 1
+5 $ITS$
+POLYGON
+712.00 336.00
+712.00 328.00
+716.00 328.00
+720.00 332.00
+716.00 336.00
+*
+3 21
+0
+VECTOR
+760.00 332.00
+760.00 184.00
+768.00 184.00
+*
+6 0
+0
+VECTOR
+760.00 248.00
+768.00 248.00
+*
+6 0
+0
+VECTOR
+752.00 128.00
+752.00 168.00
+768.00 168.00
+*
+6 0
+0
+CENTLEFT
+828.00 240.00
+828.00 236.00
+843.00 236.00
+858.00 236.00
+*
+1 1
+5 $ABP$
+POLYGON
+816.00 244.00
+816.00 236.00
+820.00 236.00
+824.00 240.00
+820.00 244.00
+*
+3 21
+0
+VECTOR
+800.00 240.00
+816.00 240.00
+*
+6 0
+0
+CENTLEFT
+828.00 176.00
+828.00 172.00
+844.00 172.00
+860.00 172.00
+*
+1 1
+5 $ABN$
+POLYGON
+816.00 180.00
+816.00 172.00
+820.00 172.00
+824.00 176.00
+820.00 180.00
+*
+3 21
+0
+VECTOR
+800.00 176.00
+816.00 176.00
+*
+6 0
+0
+VECTOR
+848.00 312.00
+864.00 312.00
+*
+6 0
+0
+POLYGON
+864.00 316.00
+864.00 308.00
+868.00 308.00
+872.00 312.00
+868.00 316.00
+*
+3 21
+0
+CENTLEFT
+876.00 312.00
+876.00 308.00
+891.00 308.00
+907.00 308.00
+*
+1 1
+5 $ABC$
+ARC
+760.00 332.00
+760.00 331.00
+760.00 333.00
+760.00 331.00
+761.00 332.00
+759.00 332.00
+*
+3 0
+0
+ARC
+744.00 368.00
+744.00 367.00
+744.00 369.00
+744.00 367.00
+745.00 368.00
+743.00 368.00
+*
+3 0
+0
+ARC
+744.00 312.00
+744.00 311.00
+744.00 313.00
+744.00 311.00
+745.00 312.00
+743.00 312.00
+*
+3 0
+0
+ARC
+760.00 248.00
+760.00 247.00
+760.00 249.00
+760.00 247.00
+761.00 248.00
+759.00 248.00
+*
+3 0
+0
+VECTOR
+752.00 168.00
+752.00 296.00
+772.00 296.00
+*
+6 0
+0
+ARC
+752.00 128.00
+752.00 127.00
+752.00 129.00
+752.00 127.00
+753.00 128.00
+751.00 128.00
+*
+3 0
+0
+ARC
+752.00 168.00
+752.00 167.00
+752.00 169.00
+752.00 167.00
+753.00 168.00
+751.00 168.00
+*
+3 0
+0
+ARC
+28.00 178.00
+28.00 180.00
+28.00 180.00
+28.00 176.00
+30.00 178.00
+26.00 178.00
+*
+3 0
+0
+VECTOR
+24.00 176.00
+40.00 160.00
+*
+3 0
+0
+ARC
+28.00 142.00
+28.00 144.00
+28.00 144.00
+28.00 140.00
+30.00 142.00
+26.00 142.00
+*
+3 0
+0
+ARC
+14.00 160.00
+12.00 160.00
+12.00 160.00
+16.00 160.00
+14.00 162.00
+14.00 158.00
+*
+3 0
+0
+VECTOR
+28.00 300.00
+0.00 300.00
+0.00 180.00
+28.00 180.00
+*
+6 0
+0
+VECTOR
+12.00 320.00
+-16.00 320.00
+-16.00 160.00
+12.00 160.00
+*
+6 0
+0
+VECTOR
+28.00 140.00
+-32.00 140.00
+-32.00 340.00
+28.00 340.00
+*
+6 0
+0
+CENTRIGHT
+-60.00 268.00
+-116.00 264.00
+-88.00 264.00
+-60.00 264.00
+*
+1 1
+12 $+ ^ vv REF$
+POLYGON
+-56.00 272.00
+-56.00 264.00
+-52.00 264.00
+-48.00 268.00
+-52.00 272.00
+*
+3 21
+0
+VECTOR
+-48.00 268.00
+-32.00 268.00
+*
+6 0
+0
+ARC
+-32.00 268.00
+-32.00 267.00
+-32.00 269.00
+-32.00 267.00
+-31.00 268.00
+-33.00 268.00
+*
+3 0
+0
+ARC
+-16.00 240.00
+-16.00 239.00
+-16.00 241.00
+-16.00 239.00
+-15.00 240.00
+-17.00 240.00
+*
+3 0
+0
+VECTOR
+-48.00 240.00
+-16.00 240.00
+*
+6 0
+0
+POLYGON
+-56.00 244.00
+-56.00 236.00
+-52.00 236.00
+-48.00 240.00
+-52.00 244.00
+*
+3 21
+0
+CENTRIGHT
+-60.00 240.00
+-100.00 236.00
+-80.00 236.00
+-60.00 236.00
+*
+1 1
+6 $AGND$
+CENTRIGHT
+-60.00 212.00
+-117.00 208.00
+-89.00 208.00
+-60.00 208.00
+*
+1 1
+12 $- ^ vv REF$
+POLYGON
+-56.00 216.00
+-56.00 208.00
+-52.00 208.00
+-48.00 212.00
+-52.00 216.00
+*
+3 21
+0
+VECTOR
+-48.00 212.00
+0.00 212.00
+*
+6 0
+0
+ARC
+0.00 212.00
+0.00 211.00
+0.00 213.00
+0.00 211.00
+1.00 212.00
+-1.00 212.00
+*
+3 0
+0
+BOTRIGHT
+24.00 344.00
+-6.00 344.00
+9.00 344.00
+24.00 344.00
+*
+1 1
+5 $ABP$
+BOTRIGHT
+12.00 324.00
+-19.00 324.00
+-4.00 324.00
+12.00 324.00
+*
+1 1
+5 $ABC$
+BOTRIGHT
+24.00 304.00
+-8.00 304.00
+8.00 304.00
+24.00 304.00
+*
+1 1
+5 $ABN$
+BOTRIGHT
+24.00 184.00
+-6.00 184.00
+9.00 184.00
+24.00 184.00
+*
+1 1
+5 $ABP$
+BOTRIGHT
+12.00 164.00
+-19.00 164.00
+-4.00 164.00
+12.00 164.00
+*
+1 1
+5 $ABC$
+BOTRIGHT
+24.00 144.00
+-8.00 144.00
+8.00 144.00
+24.00 144.00
+*
+1 1
+5 $ABN$
+VECTOR
+68.00 260.00
+52.00 260.00
+52.00 220.00
+68.00 220.00
+*
+6 0
+0
+VECTOR
+68.00 244.00
+68.00 236.00
+*
+6 0
+0
+VECTOR
+68.00 240.00
+40.00 240.00
+*
+6 0
+0
+VECTOR
+52.00 260.00
+40.00 260.00
+*
+6 0
+0
+CENTRIGHT
+32.00 260.00
+-21.00 256.00
+5.00 256.00
+32.00 256.00
+*
+1 1
+12 $+ ^ vv SIG$
+POLYGON
+32.00 264.00
+32.00 256.00
+36.00 256.00
+40.00 260.00
+36.00 264.00
+*
+3 21
+0
+POLYGON
+32.00 244.00
+32.00 236.00
+36.00 236.00
+40.00 240.00
+36.00 244.00
+*
+3 21
+0
+CENTRIGHT
+32.00 240.00
+-22.00 236.00
+5.00 236.00
+32.00 236.00
+*
+1 1
+12 $- ^ vv SIG$
+ARC
+52.00 260.00
+52.00 259.00
+52.00 261.00
+52.00 259.00
+53.00 260.00
+51.00 260.00
+*
+3 0
+0
+ARC
+68.00 240.00
+68.00 239.00
+68.00 241.00
+68.00 239.00
+69.00 240.00
+67.00 240.00
+*
+3 0
+0
+VECTOR
+64.00 112.00
+96.00 112.00
+96.00 96.00
+*
+6 0
+0
+VECTOR
+88.00 96.00
+104.00 96.00
+*
+3 0
+0
+VECTOR
+88.00 92.00
+104.00 92.00
+*
+6 0
+0
+VECTOR
+96.00 92.00
+96.00 76.00
+*
+6 0
+0
+ARC
+90.00 68.00
+88.00 68.00
+88.00 68.00
+92.00 68.00
+90.00 70.00
+90.00 66.00
+*
+3 0
+0
+VECTOR
+92.00 64.00
+96.00 76.00
+*
+3 0
+0
+ARC
+102.00 68.00
+100.00 68.00
+100.00 68.00
+104.00 68.00
+102.00 70.00
+102.00 66.00
+*
+3 0
+0
+VECTOR
+128.00 92.00
+128.00 4.00
+*
+6 0
+0
+VECTOR
+120.00 96.00
+136.00 96.00
+*
+3 0
+0
+VECTOR
+120.00 92.00
+136.00 92.00
+*
+6 0
+0
+BOTCENT
+128.00 124.00
+119.00 124.00
+128.00 124.00
+137.00 124.00
+*
+1 1
+3 $A$
+POLYGON
+132.00 120.00
+124.00 120.00
+124.00 116.00
+128.00 112.00
+132.00 116.00
+*
+3 21
+0
+VECTOR
+128.00 112.00
+128.00 96.00
+*
+6 0
+0
+VECTOR
+88.00 68.00
+76.00 68.00
+76.00 28.00
+88.00 28.00
+*
+6 0
+0
+VECTOR
+104.00 68.00
+116.00 68.00
+116.00 28.00
+104.00 28.00
+*
+6 0
+0
+BOTLEFT
+100.00 100.00
+100.00 100.00
+114.00 100.00
+128.00 100.00
+*
+1 1
+6 $cc Y$
+BOTLEFT
+132.00 100.00
+132.00 100.00
+145.00 100.00
+158.00 100.00
+*
+1 1
+6 $cc Z$
+BOTRIGHT
+92.00 72.00
+46.00 72.00
+69.00 72.00
+92.00 72.00
+*
+1 1
+10 $DP sub 1$
+CENTRIGHT
+52.00 112.00
+8.00 108.00
+30.00 108.00
+52.00 108.00
+*
+1 1
+10 $+ ^ vv O$
+POLYGON
+56.00 116.00
+56.00 108.00
+60.00 108.00
+64.00 112.00
+60.00 116.00
+*
+3 21
+0
+BOTCENT
+384.00 300.00
+362.00 300.00
+384.00 300.00
+406.00 300.00
+*
+1 1
+10 $+ ^ vv O$
+POLYGON
+388.00 288.00
+380.00 288.00
+380.00 292.00
+384.00 296.00
+388.00 292.00
+*
+3 21
+0
+VECTOR
+384.00 288.00
+384.00 268.00
+*
+6 0
+0
+ARC
+384.00 268.00
+384.00 267.00
+384.00 269.00
+384.00 267.00
+385.00 268.00
+383.00 268.00
+*
+3 0
+0
+TOPCENT
+384.00 180.00
+362.00 171.00
+384.00 171.00
+407.00 171.00
+*
+1 1
+10 $- ^ vv O$
+POLYGON
+388.00 192.00
+380.00 192.00
+380.00 188.00
+384.00 184.00
+388.00 188.00
+*
+3 21
+0
+VECTOR
+384.00 192.00
+384.00 212.00
+*
+6 0
+0
+ARC
+384.00 212.00
+384.00 213.00
+384.00 211.00
+384.00 213.00
+385.00 212.00
+383.00 212.00
+*
+3 0
+0
+TOPLEFT
+132.00 -4.00
+132.00 -13.00
+145.00 -13.00
+158.00 -13.00
+*
+1 1
+6 $cc Z$
+VECTOR
+64.00 -16.00
+96.00 -16.00
+96.00 0.00
+*
+6 0
+0
+VECTOR
+88.00 0.00
+104.00 0.00
+*
+3 0
+0
+VECTOR
+88.00 4.00
+104.00 4.00
+*
+6 0
+0
+VECTOR
+96.00 4.00
+96.00 20.00
+*
+6 0
+0
+ARC
+90.00 28.00
+88.00 28.00
+88.00 28.00
+92.00 28.00
+90.00 26.00
+90.00 30.00
+*
+3 0
+0
+VECTOR
+92.00 32.00
+96.00 20.00
+*
+3 0
+0
+ARC
+102.00 28.00
+100.00 28.00
+100.00 28.00
+104.00 28.00
+102.00 26.00
+102.00 30.00
+*
+3 0
+0
+VECTOR
+120.00 0.00
+136.00 0.00
+*
+3 0
+0
+VECTOR
+120.00 4.00
+136.00 4.00
+*
+6 0
+0
+TOPCENT
+128.00 -28.00
+120.00 -37.00
+128.00 -37.00
+136.00 -37.00
+*
+1 1
+3 $B$
+POLYGON
+132.00 -24.00
+124.00 -24.00
+124.00 -20.00
+128.00 -16.00
+132.00 -20.00
+*
+3 21
+0
+VECTOR
+128.00 -16.00
+128.00 0.00
+*
+6 0
+0
+TOPLEFT
+100.00 -4.00
+100.00 -13.00
+114.00 -13.00
+128.00 -13.00
+*
+1 1
+6 $cc Y$
+CENTRIGHT
+92.00 24.00
+46.00 20.00
+69.00 20.00
+92.00 20.00
+*
+1 1
+10 $DP sub 1$
+CENTRIGHT
+52.00 -16.00
+8.00 -20.00
+30.00 -20.00
+52.00 -20.00
+*
+1 1
+10 $+ ^ vv O$
+POLYGON
+56.00 -20.00
+56.00 -12.00
+60.00 -12.00
+64.00 -16.00
+60.00 -20.00
+*
+3 21
+0
+VECTOR
+116.00 48.00
+152.00 48.00
+*
+6 0
+0
+CENTLEFT
+164.00 48.00
+164.00 44.00
+184.00 44.00
+205.00 44.00
+*
+1 1
+8 $vv INC$
+POLYGON
+152.00 44.00
+152.00 52.00
+156.00 52.00
+160.00 48.00
+156.00 44.00
+*
+3 21
+0
+ARC
+116.00 48.00
+116.00 49.00
+116.00 47.00
+116.00 49.00
+117.00 48.00
+115.00 48.00
+*
+3 0
+0
+ARC
+128.00 48.00
+128.00 49.00
+128.00 47.00
+128.00 49.00
+129.00 48.00
+127.00 48.00
+*
+3 0
+0
+ARC
+76.00 48.00
+76.00 49.00
+76.00 47.00
+76.00 49.00
+77.00 48.00
+75.00 48.00
+*
+3 0
+0
+VECTOR
+56.00 48.00
+76.00 48.00
+*
+6 0
+0
+POLYGON
+48.00 52.00
+48.00 44.00
+52.00 44.00
+56.00 48.00
+52.00 52.00
+*
+3 21
+0
+CENTRIGHT
+48.00 48.00
+15.00 44.00
+31.00 44.00
+48.00 44.00
+*
+1 1
+7 $vv B1$
+-1
diff --git a/doc/grnexmpl.me b/doc/grnexmpl.me
new file mode 100644
index 0000000..641d15c
--- /dev/null
+++ b/doc/grnexmpl.me
@@ -0,0 +1,88 @@
+.nr pp 12
+.nr tp 12
+.nr sp 12
+.nr fi 0
+.ls 1
+.po 1i
+.pl 11i
+.EQ
+gsize 12
+delim $$
+define // 'over down 10'
+define sw 'phi sub'
+define aa 'A sub'
+define vv 'V sub'
+define mm 'M sub'
+define nn 'N sub'
+define cc 'C sub'
+define ll 'L sub'
+define rr 'R sub'
+define ss 'S sub'
+define gg 'g sub'
+define ff 'F sub'
+define qq 'Q sub'
+define qqq '{C prime} sub'
+define pp 'P sub'
+define tt 'T sub'
+define zz 'Z sub'
+define kk 'K sub'
+define ii 'I sub'
+define iis 'IC sub'
+define e2 '2 sup'
+define sunc '{ sin x } / x'
+define vddm1V 'vv DD - 1 ^ roman V'
+define vssp1V 'vv SS + 1 ^ roman V'
+.EN
+.pp
+The following slide shows the complete schematics of the
+fully-differential RIC. The operation includes a
+correlated-double-sampling phase that occurs once every 256
+clock periods, also called the
+.i "spreading ratio" .
+This reset phase is controlled by clocks $ DP sub 1 $ and $ DP
+sub 2 $ in which the integrator is initialized by totally
+removing the charge from $ cc F $ and storing the low-frequency
+noise of the op amp in $ cc C $. At the same time the comparison
+thresholds are set.
+.fl
+.po -0.2i
+.sp 2
+.lp
+.(b
+.EQ
+gsize -4
+.EN
+.GS
+roman 1
+italics 2
+bold 3
+special 4
+narrow 1
+medium 3
+thick 5
+width 5.5
+l mg
+file grnexmpl.g
+.GE
+.EQ
+gsize +4
+.EN
+.)b
+.fl
+.po +0.2i
+.pp
+The faster clocks are $ PN $, $ ITS $ and $ SP $. The sampling
+capacitor $ cc S $ performs the delayed subtraction of a sample
+of the input signal $ +- ^ vv SIG $ and a choice of $ - ^ vv REF
+$, $ AGND $ or $ + ^ vv REF $ according to the operations
+performed by the logic partially depicted operating on past
+results of the comparisons. The synchronous comparators are
+reset at this fast rates, thus performing one comparison for
+every fast clock cycle. The dynamic common-mode feedback
+arrangement operates synchronously with the reset time slot and
+its configuration is equivalent to that in the differential
+feedback path.
+.\" Local Variables:
+.\" mode: nroff
+.\" End:
+.\" vim: filetype=groff:
diff --git a/doc/groff.css b/doc/groff.css
new file mode 100644
index 0000000..ea36359
--- /dev/null
+++ b/doc/groff.css
@@ -0,0 +1,17 @@
+
+body {
+ margin-top: 0%;
+ margin-left: 0%;
+ margin-right: 0%;
+ margin-bottom: 0%;
+ background-color: white;
+ color: black;
+}
+
+pre {
+ background-color: #E0E0E0;
+ color: black;
+ border: thin;
+ border-style: solid;
+}
+
diff --git a/doc/groff.dvi b/doc/groff.dvi
new file mode 100644
index 0000000..9efd1f6
--- /dev/null
+++ b/doc/groff.dvi
Binary files differ
diff --git a/doc/groff.html b/doc/groff.html
new file mode 100644
index 0000000..e085b9e
--- /dev/null
+++ b/doc/groff.html
@@ -0,0 +1,24945 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>The GNU Troff Manual</title>
+
+<meta name="description" content="The GNU Troff Manual">
+<meta name="keywords" content="The GNU Troff Manual">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="#Top" rel="start" title="Top">
+<link href="#Request-Index" rel="index" title="Request Index">
+<link href="#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="dir.html#Top" rel="up" title="(dir)">
+<link href="#Introduction" rel="next" title="Introduction">
+<link href="dir.html#Top" rel="prev" title="(dir)">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+a.summary-letter-printindex {text-decoration: none}
+div.center {text-align:center}
+div.display {margin-left: 3.2em}
+div.example {margin-left: 3.2em}
+kbd.key {font-style: normal}
+p.flushright-paragraph {text-align:right}
+pre.display-preformatted {font-family: inherit}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span.sansserif {font-family: sans-serif; font-weight: normal}
+span.w-nolinebreak-text {white-space: nowrap}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+td.printindex-index-entry {vertical-align: top}
+td.printindex-index-section {vertical-align: top}
+th.entries-header-printindex {text-align:left}
+th.sections-header-printindex {text-align:left}
+ul.mark-bullet {list-style-type: disc}
+ul.toc-numbered-mark {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<div class="top-level-extent" id="Top">
+<div class="nav-panel">
+<p>
+Next: <a href="#Introduction" accesskey="n" rel="next">Introduction</a>, Previous: <a href="dir.html#Top" accesskey="p" rel="prev">(dir)</a>, Up: <a href="dir.html#Top" accesskey="u" rel="up">(dir)</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h1 class="top" id="GNU-troff">GNU <code class="code">troff</code></h1>
+
+
+<p>This manual documents GNU <code class="code">troff</code> version 1.23.0.
+</p>
+<p>Copyright &copy; 1994&ndash;2023 Free Software Foundation, Inc.
+</p>
+<blockquote class="quotation">
+<p>Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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 &ldquo;GNU Free
+Documentation License&rdquo;.
+</p></blockquote>
+
+
+
+
+
+<div class="element-contents" id="SEC_Contents">
+<h2 class="contents-heading">Table of Contents</h2>
+
+<div class="contents">
+
+<ul class="toc-numbered-mark">
+ <li><a id="toc-Introduction-1" href="#Introduction">1 Introduction</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Background-1" href="#Background">1.1 Background</a></li>
+ <li><a id="toc-What-Is-groff_003f-1" href="#What-Is-groff_003f">1.2 What Is <code class="code">groff</code>?</a></li>
+ <li><a id="toc-groff-Capabilities-1" href="#groff-Capabilities">1.3 <code class="code">groff</code> Capabilities</a></li>
+ <li><a id="toc-Macro-Packages-1" href="#Macro-Package-Intro">1.4 Macro Packages</a></li>
+ <li><a id="toc-Preprocessors" href="#Preprocessor-Intro">1.5 Preprocessors</a></li>
+ <li><a id="toc-Output-Devices" href="#Output-Device-Intro">1.6 Output Devices</a></li>
+ <li><a id="toc-Installation-1" href="#Installation">1.7 Installation</a></li>
+ <li><a id="toc-Conventions-Used-in-This-Manual-1" href="#Conventions-Used-in-This-Manual">1.8 Conventions Used in This Manual</a></li>
+ <li><a id="toc-Credits-1" href="#Credits">1.9 Credits</a></li>
+ </ul></li>
+ <li><a id="toc-Invoking-groff-1" href="#Invoking-groff">2 Invoking <code class="code">groff</code></a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Options" href="#Groff-Options">2.1 Options</a></li>
+ <li><a id="toc-Environment-1" href="#Environment">2.2 Environment</a></li>
+ <li><a id="toc-Macro-Directories-1" href="#Macro-Directories">2.3 Macro Directories</a></li>
+ <li><a id="toc-Font-Directories-1" href="#Font-Directories">2.4 Font Directories</a></li>
+ <li><a id="toc-Paper-Format-1" href="#Paper-Format">2.5 Paper Format</a></li>
+ <li><a id="toc-Invocation-Examples-1" href="#Invocation-Examples">2.6 Invocation Examples</a></li>
+ </ul></li>
+ <li><a id="toc-Tutorial-for-Macro-Users-1" href="#Tutorial-for-Macro-Users">3 Tutorial for Macro Users</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Basics-1" href="#Basics">3.1 Basics</a></li>
+ <li><a id="toc-Common-Features-1" href="#Common-Features">3.2 Common Features</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Paragraphs-1" href="#Paragraphs">3.2.1 Paragraphs</a></li>
+ <li><a id="toc-Sections-and-Chapters-1" href="#Sections-and-Chapters">3.2.2 Sections and Chapters</a></li>
+ <li><a id="toc-Headers-and-Footers-1" href="#Headers-and-Footers">3.2.3 Headers and Footers</a></li>
+ <li><a id="toc-Page-Layout-1" href="#Page-Layout-Adjustment">3.2.4 Page Layout</a></li>
+ <li><a id="toc-Displays-and-Keeps-1" href="#Displays-and-Keeps">3.2.5 Displays and Keeps</a></li>
+ <li><a id="toc-Footnotes-and-Endnotes-1" href="#Footnotes-and-Endnotes">3.2.6 Footnotes and Endnotes</a></li>
+ <li><a id="toc-Table-of-Contents-1" href="#Table-of-Contents">3.2.7 Table of Contents</a></li>
+ <li><a id="toc-Indexing-1" href="#Indexing">3.2.8 Indexing</a></li>
+ <li><a id="toc-Document-Formats-1" href="#Document-Formats">3.2.9 Document Formats</a></li>
+ <li><a id="toc-Columnation-1" href="#Columnation">3.2.10 Columnation</a></li>
+ <li><a id="toc-Font-and-Size-Changes-1" href="#Font-and-Size-Changes">3.2.11 Font and Size Changes</a></li>
+ <li><a id="toc-Predefined-Text-1" href="#Predefined-Text">3.2.12 Predefined Text</a></li>
+ <li><a id="toc-Preprocessor-Support-1" href="#Preprocessor-Support">3.2.13 Preprocessor Support</a></li>
+ <li><a id="toc-Configuration-and-Customization-1" href="#Configuration-and-Customization">3.2.14 Configuration and Customization</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="toc-Macro-Packages-2" href="#Major-Macro-Packages">4 Macro Packages</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-man-1" href="#man">4.1 <samp class="file">man</samp></a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Optional-man-extensions-1" href="#Optional-man-extensions">4.1.1 Optional <samp class="file">man</samp> extensions</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Custom-headers-and-footers" href="#Custom-headers-and-footers">Custom headers and footers</a></li>
+ <li><a id="toc-Ultrix_002dspecific-man-macros" href="#Ultrix_002dspecific-man-macros">Ultrix-specific man macros</a></li>
+ <li><a id="toc-Simple-example" href="#Simple-example">Simple example</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="toc-mdoc-1" href="#mdoc">4.2 <samp class="file">mdoc</samp></a></li>
+ <li><a id="toc-me-1" href="#me">4.3 <samp class="file">me</samp></a></li>
+ <li><a id="toc-mm-1" href="#mm">4.4 <samp class="file">mm</samp></a></li>
+ <li><a id="toc-mom-1" href="#mom">4.5 <samp class="file">mom</samp></a></li>
+ <li><a id="toc-ms-1" href="#ms">4.6 <samp class="file">ms</samp></a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Introduction-2" href="#ms-Introduction">4.6.1 Introduction</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Basic-information" href="#ms-basic-information">4.6.1.1 Basic information</a></li>
+ </ul></li>
+ <li><a id="toc-Document-Structure" href="#ms-Document-Structure">4.6.2 Document Structure</a></li>
+ <li><a id="toc-Document-Control-Settings" href="#ms-Document-Control-Settings">4.6.3 Document Control Settings</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Margin-settings" href="#Margin-settings">Margin settings</a></li>
+ <li><a id="toc-Titles-_0028headers_002c-footers_0029" href="#Titles-_0028headers_002c-footers_0029">Titles (headers, footers)</a></li>
+ <li><a id="toc-Text-settings" href="#Text-settings">Text settings</a></li>
+ <li><a id="toc-Paragraph-settings" href="#Paragraph-settings">Paragraph settings</a></li>
+ <li><a id="toc-Heading-settings" href="#Heading-settings">Heading settings</a></li>
+ <li><a id="toc-Footnote-settings" href="#Footnote-settings">Footnote settings</a></li>
+ <li><a id="toc-Display-settings" href="#Display-settings">Display settings</a></li>
+ <li><a id="toc-Other-settings" href="#Other-settings">Other settings</a></li>
+ </ul></li>
+ <li><a id="toc-Document-Description-Macros" href="#ms-Document-Description-Macros">4.6.4 Document Description Macros</a></li>
+ <li><a id="toc-Body-Text" href="#ms-Body-Text">4.6.5 Body Text</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Text-settings-1" href="#Text-settings-in-ms">4.6.5.1 Text settings</a></li>
+ <li><a id="toc-Typographical-symbols" href="#Typographical-symbols-in-ms">4.6.5.2 Typographical symbols</a></li>
+ <li><a id="toc-Paragraphs-2" href="#Paragraphs-in-ms">4.6.5.3 Paragraphs</a></li>
+ <li><a id="toc-Headings" href="#Headings-in-ms">4.6.5.4 Headings</a></li>
+ <li><a id="toc-Typeface-and-decoration-1" href="#Typeface-and-decoration">4.6.5.5 Typeface and decoration</a></li>
+ <li><a id="toc-Lists" href="#Lists-in-ms">4.6.5.6 Lists</a></li>
+ <li><a id="toc-Indented-regions" href="#Indented-regions-in-ms">4.6.5.7 Indented regions</a></li>
+ <li><a id="toc-Keeps_002c-boxed-keeps_002c-and-displays" href="#ms-keeps-and-displays">4.6.5.8 Keeps, boxed keeps, and displays</a></li>
+ <li><a id="toc-Tables_002c-figures_002c-equations_002c-and-references" href="#ms-Insertions">4.6.5.9 Tables, figures, equations, and references</a></li>
+ <li><a id="toc-Footnotes" href="#ms-Footnotes">4.6.5.10 Footnotes</a></li>
+ <li><a id="toc-Language-and-localization" href="#ms-language-and-localization">4.6.5.11 Language and localization</a></li>
+ </ul></li>
+ <li><a id="toc-Page-layout" href="#ms-Page-Layout">4.6.6 Page layout</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Headers-and-footers" href="#ms-Headers-and-Footers">4.6.6.1 Headers and footers</a></li>
+ <li><a id="toc-Tab-stops" href="#Tab-Stops-in-ms">4.6.6.2 Tab stops</a></li>
+ <li><a id="toc-Margins" href="#ms-Margins">4.6.6.3 Margins</a></li>
+ <li><a id="toc-Multiple-columns" href="#ms-Multiple-Columns">4.6.6.4 Multiple columns</a></li>
+ <li><a id="toc-Creating-a-table-of-contents" href="#ms-TOC">4.6.6.5 Creating a table of contents</a></li>
+ </ul></li>
+ <li><a id="toc-Differences-from-AT_0026T-ms-1" href="#Differences-from-AT_0026T-ms">4.6.7 Differences from <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp></a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Unix-Version-7-ms-macros-not-implemented-by-groff-ms" href="#Missing-Unix-Version-7-ms-Macros">4.6.7.1 Unix Version 7 <samp class="file">ms</samp> macros not implemented by <code class="code">groff</code> <samp class="file">ms</samp></a></li>
+ </ul></li>
+ <li><a id="toc-Legacy-Features" href="#ms-Legacy-Features">4.6.8 Legacy Features</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-AT_0026T-accent-mark-strings" href="#AT_0026T-accent-mark-strings">AT&amp;T accent mark strings</a></li>
+ <li><a id="toc-Berkeley-accent-mark-and-glyph-strings" href="#Berkeley-accent-mark-and-glyph-strings">Berkeley accent mark and glyph strings</a></li>
+ </ul></li>
+ <li><a id="toc-Naming-Conventions" href="#ms-Naming-Conventions">4.6.9 Naming Conventions</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="toc-GNU-troff-Reference-1" href="#GNU-troff-Reference">5 GNU <code class="code">troff</code> Reference</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Text-1" href="#Text">5.1 Text</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Filling-1" href="#Filling">5.1.1 Filling</a></li>
+ <li><a id="toc-Sentences-1" href="#Sentences">5.1.2 Sentences</a></li>
+ <li><a id="toc-Hyphenation-1" href="#Hyphenation">5.1.3 Hyphenation</a></li>
+ <li><a id="toc-Breaking-1" href="#Breaking">5.1.4 Breaking</a></li>
+ <li><a id="toc-Adjustment-1" href="#Adjustment">5.1.5 Adjustment</a></li>
+ <li><a id="toc-Tabs-and-Leaders-1" href="#Tabs-and-Leaders">5.1.6 Tabs and Leaders</a></li>
+ <li><a id="toc-Requests-and-Macros-1" href="#Requests-and-Macros">5.1.7 Requests and Macros</a></li>
+ <li><a id="toc-Macro-Packages-3" href="#Macro-Packages">5.1.8 Macro Packages</a></li>
+ <li><a id="toc-Input-Encodings-1" href="#Input-Encodings">5.1.9 Input Encodings</a></li>
+ <li><a id="toc-Input-Conventions-1" href="#Input-Conventions">5.1.10 Input Conventions</a></li>
+ </ul></li>
+ <li><a id="toc-Page-Geometry-1" href="#Page-Geometry">5.2 Page Geometry</a></li>
+ <li><a id="toc-Measurements-1" href="#Measurements">5.3 Measurements</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Motion-Quanta-1" href="#Motion-Quanta">5.3.1 Motion Quanta</a></li>
+ <li><a id="toc-Default-Units-1" href="#Default-Units">5.3.2 Default Units</a></li>
+ </ul></li>
+ <li><a id="toc-Numeric-Expressions-1" href="#Numeric-Expressions">5.4 Numeric Expressions</a></li>
+ <li><a id="toc-Identifiers-1" href="#Identifiers">5.5 Identifiers</a></li>
+ <li><a id="toc-Formatter-Instructions-1" href="#Formatter-Instructions">5.6 Formatter Instructions</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Control-Characters-1" href="#Control-Characters">5.6.1 Control Characters</a></li>
+ <li><a id="toc-Invoking-Requests-1" href="#Invoking-Requests">5.6.2 Invoking Requests</a></li>
+ <li><a id="toc-Calling-Macros-1" href="#Calling-Macros">5.6.3 Calling Macros</a></li>
+ <li><a id="toc-Using-Escape-Sequences-1" href="#Using-Escape-Sequences">5.6.4 Using Escape Sequences</a></li>
+ <li><a id="toc-Delimiters-1" href="#Delimiters">5.6.5 Delimiters</a></li>
+ </ul></li>
+ <li><a id="toc-Comments-1" href="#Comments">5.7 Comments</a></li>
+ <li><a id="toc-Registers-1" href="#Registers">5.8 Registers</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Setting-Registers-1" href="#Setting-Registers">5.8.1 Setting Registers</a></li>
+ <li><a id="toc-Interpolating-Registers-1" href="#Interpolating-Registers">5.8.2 Interpolating Registers</a></li>
+ <li><a id="toc-Auto_002dincrement-1" href="#Auto_002dincrement">5.8.3 Auto-increment</a></li>
+ <li><a id="toc-Assigning-Register-Formats-1" href="#Assigning-Register-Formats">5.8.4 Assigning Register Formats</a></li>
+ <li><a id="toc-Built_002din-Registers-1" href="#Built_002din-Registers">5.8.5 Built-in Registers</a></li>
+ </ul></li>
+ <li><a id="toc-Manipulating-Filling-and-Adjustment-1" href="#Manipulating-Filling-and-Adjustment">5.9 Manipulating Filling and Adjustment</a></li>
+ <li><a id="toc-Manipulating-Hyphenation-1" href="#Manipulating-Hyphenation">5.10 Manipulating Hyphenation</a></li>
+ <li><a id="toc-Manipulating-Spacing-1" href="#Manipulating-Spacing">5.11 Manipulating Spacing</a></li>
+ <li><a id="toc-Tabs-and-Fields-1" href="#Tabs-and-Fields">5.12 Tabs and Fields</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Leaders-1" href="#Leaders">5.12.1 Leaders</a></li>
+ <li><a id="toc-Fields-1" href="#Fields">5.12.2 Fields</a></li>
+ </ul></li>
+ <li><a id="toc-Character-Translations-1" href="#Character-Translations">5.13 Character Translations</a></li>
+ <li><a id="toc-troff-and-nroff-Modes-1" href="#troff-and-nroff-Modes">5.14 <code class="code">troff</code> and <code class="code">nroff</code> Modes</a></li>
+ <li><a id="toc-Line-Layout-1" href="#Line-Layout">5.15 Line Layout</a></li>
+ <li><a id="toc-Line-Continuation-1" href="#Line-Continuation">5.16 Line Continuation</a></li>
+ <li><a id="toc-Page-Layout-2" href="#Page-Layout">5.17 Page Layout</a></li>
+ <li><a id="toc-Page-Control-1" href="#Page-Control">5.18 Page Control</a></li>
+ <li><a id="toc-Using-Fonts-1" href="#Using-Fonts">5.19 Using Fonts</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Selecting-Fonts-1" href="#Selecting-Fonts">5.19.1 Selecting Fonts</a></li>
+ <li><a id="toc-Font-Families-1" href="#Font-Families">5.19.2 Font Families</a></li>
+ <li><a id="toc-Font-Positions-1" href="#Font-Positions">5.19.3 Font Positions</a></li>
+ <li><a id="toc-Using-Symbols-1" href="#Using-Symbols">5.19.4 Using Symbols</a></li>
+ <li><a id="toc-Character-Classes-1" href="#Character-Classes">5.19.5 Character Classes</a></li>
+ <li><a id="toc-Special-Fonts-1" href="#Special-Fonts">5.19.6 Special Fonts</a></li>
+ <li><a id="toc-Artificial-Fonts-1" href="#Artificial-Fonts">5.19.7 Artificial Fonts</a></li>
+ <li><a id="toc-Ligatures-and-Kerning-1" href="#Ligatures-and-Kerning">5.19.8 Ligatures and Kerning</a></li>
+ <li><a id="toc-Italic-Corrections-1" href="#Italic-Corrections">5.19.9 Italic Corrections</a></li>
+ <li><a id="toc-Dummy-Characters-1" href="#Dummy-Characters">5.19.10 Dummy Characters</a></li>
+ </ul></li>
+ <li><a id="toc-Manipulating-Type-Size-and-Vertical-Spacing-1" href="#Manipulating-Type-Size-and-Vertical-Spacing">5.20 Manipulating Type Size and Vertical Spacing</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Changing-the-Type-Size-1" href="#Changing-the-Type-Size">5.20.1 Changing the Type Size</a></li>
+ <li><a id="toc-Changing-the-Vertical-Spacing-1" href="#Changing-the-Vertical-Spacing">5.20.2 Changing the Vertical Spacing</a></li>
+ <li><a id="toc-Using-Fractional-Type-Sizes-1" href="#Using-Fractional-Type-Sizes">5.20.3 Using Fractional Type Sizes</a></li>
+ </ul></li>
+ <li><a id="toc-Colors-1" href="#Colors">5.21 Colors</a></li>
+ <li><a id="toc-Strings-1" href="#Strings">5.22 Strings</a></li>
+ <li><a id="toc-Conditionals-and-Loops-1" href="#Conditionals-and-Loops">5.23 Conditionals and Loops</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Operators-in-Conditionals-1" href="#Operators-in-Conditionals">5.23.1 Operators in Conditionals</a></li>
+ <li><a id="toc-if_002dthen-1" href="#if_002dthen">5.23.2 if-then</a></li>
+ <li><a id="toc-if_002delse-1" href="#if_002delse">5.23.3 if-else</a></li>
+ <li><a id="toc-Conditional-Blocks-1" href="#Conditional-Blocks">5.23.4 Conditional Blocks</a></li>
+ <li><a id="toc-while-1" href="#while">5.23.5 while</a></li>
+ </ul></li>
+ <li><a id="toc-Writing-Macros-1" href="#Writing-Macros">5.24 Writing Macros</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Parameters-1" href="#Parameters">5.24.1 Parameters</a></li>
+ <li><a id="toc-Copy-Mode-1" href="#Copy-Mode">5.24.2 Copy Mode</a></li>
+ </ul></li>
+ <li><a id="toc-Page-Motions-1" href="#Page-Motions">5.25 Page Motions</a></li>
+ <li><a id="toc-Drawing-Geometric-Objects-1" href="#Drawing-Geometric-Objects">5.26 Drawing Geometric Objects</a></li>
+ <li><a id="toc-Deferring-Output-1" href="#Deferring-Output">5.27 Deferring Output</a></li>
+ <li><a id="toc-Traps-1" href="#Traps">5.28 Traps</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Vertical-Position-Traps-1" href="#Vertical-Position-Traps">5.28.1 Vertical Position Traps</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Page-Location-Traps-1" href="#Page-Location-Traps">5.28.1.1 Page Location Traps</a></li>
+ <li><a id="toc-The-Implicit-Page-Trap-1" href="#The-Implicit-Page-Trap">5.28.1.2 The Implicit Page Trap</a></li>
+ <li><a id="toc-Diversion-Traps-1" href="#Diversion-Traps">5.28.1.3 Diversion Traps</a></li>
+ </ul></li>
+ <li><a id="toc-Input-Line-Traps-1" href="#Input-Line-Traps">5.28.2 Input Line Traps</a></li>
+ <li><a id="toc-Blank-Line-Traps-1" href="#Blank-Line-Traps">5.28.3 Blank Line Traps</a></li>
+ <li><a id="toc-Leading-Space-Traps-1" href="#Leading-Space-Traps">5.28.4 Leading Space Traps</a></li>
+ <li><a id="toc-End_002dof_002dinput-Traps-1" href="#End_002dof_002dinput-Traps">5.28.5 End-of-input Traps</a></li>
+ </ul></li>
+ <li><a id="toc-Diversions-1" href="#Diversions">5.29 Diversions</a></li>
+ <li><a id="toc-Punning-Names-1" href="#Punning-Names">5.30 Punning Names</a></li>
+ <li><a id="toc-Environments-1" href="#Environments">5.31 Environments</a></li>
+ <li><a id="toc-Suppressing-Output-1" href="#Suppressing-Output">5.32 Suppressing Output</a></li>
+ <li><a id="toc-I_002fO-1" href="#I_002fO">5.33 I/O</a></li>
+ <li><a id="toc-Postprocessor-Access-1" href="#Postprocessor-Access">5.34 Postprocessor Access</a></li>
+ <li><a id="toc-Miscellaneous-1" href="#Miscellaneous">5.35 Miscellaneous</a></li>
+ <li><a id="toc-gtroff-Internals" href="#Gtroff-Internals">5.36 <code class="code">gtroff</code> Internals</a></li>
+ <li><a id="toc-Debugging-1" href="#Debugging">5.37 Debugging</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Warnings-1" href="#Warnings">5.37.1 Warnings</a></li>
+ </ul></li>
+ <li><a id="toc-Implementation-Differences-1" href="#Implementation-Differences">5.38 Implementation Differences</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Safer-Mode-1" href="#Safer-Mode">5.38.1 Safer Mode</a></li>
+ <li><a id="toc-Compatibility-Mode-1" href="#Compatibility-Mode">5.38.2 Compatibility Mode</a></li>
+ <li><a id="toc-Other-Differences-1" href="#Other-Differences">5.38.3 Other Differences</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="toc-File-Formats-1" href="#File-Formats">6 File Formats</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-gtroff-Output-1" href="#gtroff-Output">6.1 <code class="code">gtroff</code> Output</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Language-Concepts-1" href="#Language-Concepts">6.1.1 Language Concepts</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Separation-1" href="#Separation">6.1.1.1 Separation</a></li>
+ <li><a id="toc-Argument-Units-1" href="#Argument-Units">6.1.1.2 Argument Units</a></li>
+ <li><a id="toc-Document-Parts-1" href="#Document-Parts">6.1.1.3 Document Parts</a></li>
+ </ul></li>
+ <li><a id="toc-Command-Reference-1" href="#Command-Reference">6.1.2 Command Reference</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Comment-Command-1" href="#Comment-Command">6.1.2.1 Comment Command</a></li>
+ <li><a id="toc-Simple-Commands-1" href="#Simple-Commands">6.1.2.2 Simple Commands</a></li>
+ <li><a id="toc-Graphics-Commands-1" href="#Graphics-Commands">6.1.2.3 Graphics Commands</a></li>
+ <li><a id="toc-Device-Control-Commands-1" href="#Device-Control-Commands">6.1.2.4 Device Control Commands</a></li>
+ <li><a id="toc-Obsolete-Command-1" href="#Obsolete-Command">6.1.2.5 Obsolete Command</a></li>
+ </ul></li>
+ <li><a id="toc-Intermediate-Output-Examples-1" href="#Intermediate-Output-Examples">6.1.3 Intermediate Output Examples</a></li>
+ <li><a id="toc-Output-Language-Compatibility-1" href="#Output-Language-Compatibility">6.1.4 Output Language Compatibility</a></li>
+ </ul></li>
+ <li><a id="toc-Device-and-Font-Description-Files-1" href="#Device-and-Font-Description-Files">6.2 Device and Font Description Files</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-DESC-File-Format-1" href="#DESC-File-Format">6.2.1 <samp class="file">DESC</samp> File Format</a></li>
+ <li><a id="toc-Font-Description-File-Format-1" href="#Font-Description-File-Format">6.2.2 Font Description File Format</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="toc-Copying-This-Manual-1" href="#Copying-This-Manual">Appendix A Copying This Manual</a></li>
+ <li><a id="toc-Request-Index-1" href="#Request-Index" rel="index">Appendix B Request Index</a></li>
+ <li><a id="toc-Escape-Sequence-Index-1" href="#Escape-Sequence-Index" rel="index">Appendix C Escape Sequence Index</a></li>
+ <li><a id="toc-Operator-Index-1" href="#Operator-Index" rel="index">Appendix D Operator Index</a></li>
+ <li><a id="toc-Register-Index-1" href="#Register-Index" rel="index">Appendix E Register Index</a></li>
+ <li><a id="toc-Macro-Index-1" href="#Macro-Index" rel="index">Appendix F Macro Index</a></li>
+ <li><a id="toc-String-Index-1" href="#String-Index" rel="index">Appendix G String Index</a></li>
+ <li><a id="toc-File-Keyword-Index-1" href="#File-Keyword-Index" rel="index">Appendix H File Keyword Index</a></li>
+ <li><a id="toc-Program-and-File-Index-1" href="#Program-and-File-Index" rel="index">Appendix I Program and File Index</a></li>
+ <li><a id="toc-Concept-Index-1" href="#Concept-Index" rel="index">Appendix J Concept Index</a></li>
+</ul>
+</div>
+</div>
+<hr>
+<div class="chapter-level-extent" id="Introduction">
+<div class="nav-panel">
+<p>
+Next: <a href="#Invoking-groff" accesskey="n" rel="next">Invoking <code class="code">groff</code></a>, Previous: <a href="#Top" accesskey="p" rel="prev">GNU <code class="code">troff</code></a>, Up: <a href="#Top" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h2 class="chapter" id="Introduction-1">1 Introduction</h2>
+<a class="index-entry-id" id="index-introduction"></a>
+
+<p>GNU <code class="code">roff</code> (or <code class="code">groff</code>) is a programming system for
+typesetting documents. It is highly flexible and has been used
+extensively for over thirty years.
+</p>
+
+
+
+<ul class="mini-toc">
+<li><a href="#Background" accesskey="1">Background</a></li>
+<li><a href="#What-Is-groff_003f" accesskey="2">What Is <code class="code">groff</code>?</a></li>
+<li><a href="#groff-Capabilities" accesskey="3"><code class="code">groff</code> Capabilities</a></li>
+<li><a href="#Macro-Package-Intro" accesskey="4">Macro Packages</a></li>
+<li><a href="#Preprocessor-Intro" accesskey="5">Preprocessors</a></li>
+<li><a href="#Output-Device-Intro" accesskey="6">Output Devices</a></li>
+<li><a href="#Installation" accesskey="7">Installation</a></li>
+<li><a href="#Conventions-Used-in-This-Manual" accesskey="8">Conventions Used in This Manual</a></li>
+<li><a href="#Credits" accesskey="9">Credits</a></li>
+</ul>
+<hr>
+<div class="section-level-extent" id="Background">
+<div class="nav-panel">
+<p>
+Next: <a href="#What-Is-groff_003f" accesskey="n" rel="next">What Is <code class="code">groff</code>?</a>, Previous: <a href="#Introduction" accesskey="p" rel="prev">Introduction</a>, Up: <a href="#Introduction" accesskey="u" rel="up">Introduction</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Background-1">1.1 Background</h3>
+<a class="index-entry-id" id="index-background"></a>
+
+<p>M. Douglas McIlroy, formerly of AT&amp;T Bell Laboratories and present at
+the creation of the Unix operating system, offers an authoritative
+historical summary.
+</p>
+<blockquote class="quotation">
+<p>The prime reason for Unix was the desire of Ken [Thompson], Dennis
+[Ritchie], and Joe Ossanna to have a pleasant environment for software
+development. The fig leaf that got the nod from &hellip;
+management was that an early use would be to develop a &ldquo;stand-alone&rdquo;
+word-processing system for use in typing pools and secretarial offices.
+Perhaps they had in mind &ldquo;dedicated&rdquo;, as distinct from
+&ldquo;stand-alone&rdquo;; that&rsquo;s what eventuated in various cases, most notably
+in the legal/patent department and in the AT&amp;T CEO&rsquo;s office.
+</p>
+<p>Both those systems were targets of opportunity, not foreseen from the
+start. When Unix was up and running on the PDP-11, Joe got wind of
+the legal department having installed a commercial word processor.
+He went to pitch Unix as an alternative and clinched a trial by
+promising to make <code class="code">roff</code> able to number lines by tomorrow in order
+to fulfill a patent-office requirement that the commercial system did
+not support.
+</p>
+<p>Modems were installed so legal-department secretaries could try the
+Research machine. They liked it and Joe&rsquo;s superb customer service.
+Soon the legal department got a system of their own. Joe went on to
+create <code class="code">nroff</code> and <code class="code">troff</code>. Document preparation became a
+widespread use of Unix, but no stand-alone word-processing system was
+ever undertaken.
+</p></blockquote>
+
+<p>A history relating <code class="code">groff</code> to its predecessors <code class="code">roff</code>,
+<code class="code">nroff</code>, and <code class="code">troff</code> is available in the <cite class="cite">roff<span class="r">(7)</span></cite>
+man page.
+</p>
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="What-Is-groff_003f">
+<div class="nav-panel">
+<p>
+Next: <a href="#groff-Capabilities" accesskey="n" rel="next"><code class="code">groff</code> Capabilities</a>, Previous: <a href="#Introduction" accesskey="p" rel="prev">Introduction</a>, Up: <a href="#Introduction" accesskey="u" rel="up">Introduction</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="What-Is-groff_003f-1">1.2 What Is <code class="code">groff</code>?</h3>
+<a class="index-entry-id" id="index-what-is-groff_003f"></a>
+<a class="index-entry-id" id="index-groff_002d_002d_002dwhat-is-it_003f"></a>
+
+<p><code class="code">groff</code> (GNU <code class="code">roff</code>) is a typesetting system that reads plain
+text input files that include formatting commands to produce output in
+PostScript, PDF, HTML, DVI, or other formats, or for display to a
+terminal. Formatting commands can be low-level typesetting primitives,
+macros from a supplied package, or user-defined macros. All three
+approaches can be combined.
+</p>
+<p>A reimplementation and extension of the typesetter from <abbr class="acronym">AT&amp;T</abbr>
+Unix, <code class="code">groff</code> is present on most <abbr class="acronym">POSIX</abbr> systems owing to
+its long association with Unix manuals (including man pages). It and
+its predecessor are notable for their production of several best-selling
+software engineering texts. <code class="code">groff</code> is capable of producing
+typographically sophisticated documents while consuming minimal system
+resources.
+</p>
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="groff-Capabilities">
+<div class="nav-panel">
+<p>
+Next: <a href="#Macro-Package-Intro" accesskey="n" rel="next">Macro Packages</a>, Previous: <a href="#What-Is-groff_003f" accesskey="p" rel="prev">What Is <code class="code">groff</code>?</a>, Up: <a href="#Introduction" accesskey="u" rel="up">Introduction</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="groff-Capabilities-1">1.3 <code class="code">groff</code> Capabilities</h3>
+<a class="index-entry-id" id="index-groff-capabilities"></a>
+<a class="index-entry-id" id="index-capabilities-of-groff"></a>
+
+<p>GNU <code class="code">troff</code> is a typesetting document formatter; it provides a wide
+range of low-level text and page operations within the framework of a
+programming language. These operations compose to generate footnotes,
+tables of contents, mathematical equations, diagrams, multi-column text,
+and other elements of typeset works. Here is a survey of formatter
+features; all are under precise user control.
+</p>
+<ul class="itemize mark-bullet">
+<li>text filling, breaking, alignment to the left or right margin; centering
+
+</li><li>adjustment of inter-word space size to justify text, and of
+inter-sentence space size to suit local style conventions
+
+</li><li>automatic and manual determination of hyphenation break points
+
+</li><li>pagination
+
+</li><li>selection of any font available to the output device
+
+</li><li>adjustment of type size and vertical spacing (or &ldquo;leading&rdquo;)
+
+</li><li>configuration of line length and indentation amounts; columnation
+
+</li><li>drawing of geometric primitives (lines, arcs, polygons, circles,
+&hellip;)
+
+</li><li>setup of stroke and fill colors (where supported by the output
+device)
+
+</li><li>embedding of hyperlinks, images, document metadata, and other inclusions
+(where supported by the output device)
+</li></ul>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Macro-Package-Intro">
+<div class="nav-panel">
+<p>
+Next: <a href="#Preprocessor-Intro" accesskey="n" rel="next">Preprocessors</a>, Previous: <a href="#groff-Capabilities" accesskey="p" rel="prev"><code class="code">groff</code> Capabilities</a>, Up: <a href="#Introduction" accesskey="u" rel="up">Introduction</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Macro-Packages-1">1.4 Macro Packages</h3>
+<a class="index-entry-id" id="index-macro-package_002c-introduction"></a>
+<a class="index-entry-id" id="index-package_002c-macro_002c-introduction"></a>
+
+<p>Elemental typesetting functions can be be challenging to use directly
+with complex documents. A <em class="dfn">macro</em> facility specifies how certain
+routine operations, such as starting paragraphs, or printing headers and
+footers, should be performed in terms of those low-level instructions.
+Macros can be specific to one document or collected together into a
+<em class="dfn">macro package</em> for use by many. Several macro packages available;
+the most widely used are provided with <code class="code">groff</code>. They are
+<samp class="file">man</samp>, <samp class="file">mdoc</samp>, <samp class="file">me</samp>, <samp class="file">mm</samp>, <samp class="file">mom</samp>, and
+<samp class="file">ms</samp>.
+</p>
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Preprocessor-Intro">
+<div class="nav-panel">
+<p>
+Next: <a href="#Output-Device-Intro" accesskey="n" rel="next">Output Devices</a>, Previous: <a href="#Macro-Package-Intro" accesskey="p" rel="prev">Macro Packages</a>, Up: <a href="#Introduction" accesskey="u" rel="up">Introduction</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Preprocessors">1.5 Preprocessors</h3>
+<a class="index-entry-id" id="index-preprocessors"></a>
+
+<p>An alternative approach to complexity management, particularly when
+constructing tables, setting mathematics, or drawing diagrams, lies in
+preprocessing. A <em class="dfn">preprocessor</em> employs a domian-specific language
+to ease the generation of tables, equations, and so forth in terms that
+are convenient for human entry. Each preprocessor reads a document and
+translates the parts of it that apply to it into GNU <code class="code">troff</code> input.
+Command-line options to <code class="command">groff</code> tell it which preprocessors to
+use.
+</p>
+<p><code class="code">groff</code> provides preprocessors for laying out tables
+(<code class="command">gtbl</code>), typesetting equations (<code class="command">geqn</code>), drawing
+diagrams (<code class="command">gpic</code> and <code class="command">ggrn</code>), inserting bibliographic
+references (<code class="command">grefer</code>), and drawing chemical structures
+(<code class="command">gchem</code>). An associated program that is useful when dealing
+with preprocessors is <code class="command">gsoelim</code>.<a class="footnote" id="DOCF1" href="#FOOT1"><sup>1</sup></a>
+</p>
+<p><code class="code">groff</code> also supports <code class="code">grap</code>, a preprocessor for drawing
+graphs. A free implementation of it can be obtained separately.
+</p>
+<p>Unique to <code class="code">groff</code> is the <code class="code">preconv</code> preprocessor that enables
+<code class="code">groff</code> to handle documents in a variety of input encodings.
+</p>
+<p>Other preprocessors exist, but no free implementations
+are known. An example is <code class="command">ideal</code>, which draws diagrams using a
+mathematical constraint language.
+</p>
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Output-Device-Intro">
+<div class="nav-panel">
+<p>
+Next: <a href="#Installation" accesskey="n" rel="next">Installation</a>, Previous: <a href="#Preprocessor-Intro" accesskey="p" rel="prev">Preprocessors</a>, Up: <a href="#Introduction" accesskey="u" rel="up">Introduction</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Output-Devices">1.6 Output Devices</h3>
+<a class="index-entry-id" id="index-postprocessors"></a>
+<a class="index-entry-id" id="index-output-devices"></a>
+<a class="index-entry-id" id="index-devices-for-output"></a>
+
+<p>GNU <code class="code">troff</code>&rsquo;s output is in a device-independent page description
+language, which is then read by an <em class="dfn">output driver</em> that translates
+this language into a file format or byte stream that a piece of
+(possibly emulated) hardware understands. <code class="code">groff</code> features output
+drivers for PostScript devices, terminal emulators (and other simple
+typewriter-like machines), X11 (for previewing), TeX DVI, HP
+LaserJet&nbsp;4/PCL5 and Canon LBP printers (which use <abbr class="acronym">CaPSL</abbr>),
+<abbr class="acronym">HTML</abbr>, <abbr class="acronym">XHTML</abbr>, and <abbr class="acronym">PDF</abbr>.
+</p>
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Installation">
+<div class="nav-panel">
+<p>
+Next: <a href="#Conventions-Used-in-This-Manual" accesskey="n" rel="next">Conventions Used in This Manual</a>, Previous: <a href="#Output-Device-Intro" accesskey="p" rel="prev">Output Devices</a>, Up: <a href="#Introduction" accesskey="u" rel="up">Introduction</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Installation-1">1.7 Installation</h3>
+<a class="index-entry-id" id="index-installation"></a>
+
+<p>Locate installation instructions in the files <samp class="file">INSTALL</samp>,
+<samp class="file">INSTALL.extra</samp>, and <samp class="file">INSTALL.REPO</samp> in the <code class="code">groff</code> source
+distribution. Being a GNU project, <code class="code">groff</code> supports the familiar
+&lsquo;<samp class="samp">./configure &amp;&amp; make</samp>&rsquo; command sequence.
+</p>
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Conventions-Used-in-This-Manual">
+<div class="nav-panel">
+<p>
+Next: <a href="#Credits" accesskey="n" rel="next">Credits</a>, Previous: <a href="#Installation" accesskey="p" rel="prev">Installation</a>, Up: <a href="#Introduction" accesskey="u" rel="up">Introduction</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Conventions-Used-in-This-Manual-1">1.8 Conventions Used in This Manual</h3>
+
+<p>We apply the term &ldquo;groff&rdquo; to the language documented here, the GNU
+implementation of the overall system, the project that develops that
+system, and the command of that name. In the first sense, <code class="code">groff</code>
+is an extended dialect of the <code class="code">roff</code> language, for which many
+similar implementations exist.
+</p>
+<p>The <code class="code">roff</code> language features several major categories for which
+many items are predefined. Presentations of these items feature the
+form in which the item is most commonly used on the left, and, aligned
+to the right margin, the name of the category in brackets.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bexample_005d"><span class="category-def">Register: </span><span><strong class="def-name">\n[example]</strong><a class="copiable-link" href='#index-_005cn_005bexample_005d'> &para;</a></span></dt>
+<dd><p>The register &lsquo;<samp class="samp">example</samp>&rsquo; is one that that <code class="code">groff</code> <em class="emph">doesn&rsquo;t</em>
+predefine. You can create it yourself, though; see <a class="ref" href="#Setting-Registers">Setting Registers</a>.
+</p></dd></dl>
+
+<p>To make this document useful as a reference and not merely amiable
+bedtime reading, we tend to present these syntax items in exhaustive
+detail when they arise. References to topics discussed later in the
+text are frequent; skip material you don&rsquo;t understand yet.
+</p>
+<p>We use Texinfo&rsquo;s &ldquo;result&rdquo; (&rArr;) and error&rarr; notations to
+present output written to the standard output and standard error
+streams, respectively. Diagnostic messages from the GNU <code class="code">troff</code>
+formatter and other programs are examples of the latter, but the
+formatter can also be directed to write user-specified messages to the
+standard error stream. The notation then serves to identify the
+output stream and does not necessarily mean that an error has
+occurred.<a class="footnote" id="DOCF2" href="#FOOT2"><sup>2</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">$ echo &quot;Twelve o'clock and&quot; | groff -Tascii | sed '/^$/d'
+ &rArr; Twelve o'clock and
+$ echo '.tm all is well.' | groff &gt; /dev/null
+ error&rarr; all is well.
+</pre></div></div>
+
+<p>Sometimes we use &rArr; somewhat abstractly to represent formatted
+text that you will need to use a PostScript or PDF viewer program (or a
+printer) to observe. While arguably an abuse of notation, we think this
+preferable to requiring the reader to understand the syntax of these
+page description languages.
+</p>
+<p>We also present diagnostic messages in an abbreviated form, often
+omitting the name of the program issuing them, the input file name, and
+line number or other positional information when such data do not serve
+to illuminate the topic under discussion.
+</p>
+<p>Most examples are of <code class="code">roff</code> language input that would be placed in
+a text file. Occasionally, we start an example with a &lsquo;<samp class="samp">$</samp>&rsquo;
+character to indicate a shell prompt, as seen above.
+</p>
+<p>You are encouraged to try the examples yourself, and to alter them to
+better learn <code class="code">groff</code>&rsquo;s behavior. Our examples frequently need to
+direct the formatter to set a line length (with &lsquo;<samp class="samp">.ll</samp>&rsquo;) that will
+fit within the page margins of this manual. We mention this so that you
+know why it is there before we discuss the <code class="code">ll</code> request
+formally.<a class="footnote" id="DOCF3" href="#FOOT3"><sup>3</sup></a>
+</p>
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Credits">
+<div class="nav-panel">
+<p>
+Previous: <a href="#Conventions-Used-in-This-Manual" accesskey="p" rel="prev">Conventions Used in This Manual</a>, Up: <a href="#Introduction" accesskey="u" rel="up">Introduction</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Credits-1">1.9 Credits</h3>
+<a class="index-entry-id" id="index-credits"></a>
+
+<p>We adapted portions of this manual from existing documents. James
+Clark&rsquo;s man pages were an essential resource; we have updated them in
+parallel with the development of this manual. We based the tutorial for
+macro users on Eric Allman&rsquo;s introduction to his <samp class="file">me</samp> macro package
+(which we also provide, little altered from 4.4BSD). Larry Kollar
+contributed much of the material on the <samp class="file">ms</samp> macro package.
+</p>
+
+
+<hr>
+</div>
+</div>
+<div class="chapter-level-extent" id="Invoking-groff">
+<div class="nav-panel">
+<p>
+Next: <a href="#Tutorial-for-Macro-Users" accesskey="n" rel="next">Tutorial for Macro Users</a>, Previous: <a href="#Introduction" accesskey="p" rel="prev">Introduction</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h2 class="chapter" id="Invoking-groff-1">2 Invoking <code class="code">groff</code></h2>
+<a class="index-entry-id" id="index-invoking-groff"></a>
+<a class="index-entry-id" id="index-groff-invocation"></a>
+
+<p>This chapter focuses on how to invoke the <code class="code">groff</code> front end. This
+front end takes care of the details of constructing the pipeline among
+the preprocessors, <code class="code">gtroff</code> and the postprocessor.
+</p>
+<p>It has become a tradition that GNU programs get the prefix &lsquo;<samp class="samp">g</samp>&rsquo; to
+distinguish them from their original counterparts provided by the host
+(see <a class="pxref" href="#Environment">Environment</a>). Thus, for example, <code class="code">geqn</code> is GNU
+<code class="code">eqn</code>. On operating systems like GNU/Linux or the Hurd, which
+don&rsquo;t contain proprietary versions of <code class="code">troff</code>, and on
+MS-DOS/MS-Windows, where <code class="code">troff</code> and associated programs are not
+available at all, this prefix is omitted since GNU <code class="code">troff</code> is the
+only incarnation of <code class="code">troff</code> used. Exception: &lsquo;<samp class="samp">groff</samp>&rsquo; is never
+replaced by &lsquo;<samp class="samp">roff</samp>&rsquo;.
+</p>
+<p>In this document, we consequently say &lsquo;<samp class="samp">gtroff</samp>&rsquo; when talking about
+the GNU <code class="code">troff</code> program. All other implementations of <code class="code">troff</code> are called <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code>, which is the common origin of almost all <code class="code">troff</code>
+implementations<a class="footnote" id="DOCF4" href="#FOOT4"><sup>4</sup></a> (with more or less compatible changes). Similarly, we say
+&lsquo;<samp class="samp">gpic</samp>&rsquo;, &lsquo;<samp class="samp">geqn</samp>&rsquo;, and so on.
+</p>
+
+
+
+<ul class="mini-toc">
+<li><a href="#Groff-Options" accesskey="1">Options</a></li>
+<li><a href="#Environment" accesskey="2">Environment</a></li>
+<li><a href="#Macro-Directories" accesskey="3">Macro Directories</a></li>
+<li><a href="#Font-Directories" accesskey="4">Font Directories</a></li>
+<li><a href="#Paper-Format" accesskey="5">Paper Format</a></li>
+<li><a href="#Invocation-Examples" accesskey="6">Invocation Examples</a></li>
+</ul>
+<hr>
+<div class="section-level-extent" id="Groff-Options">
+<div class="nav-panel">
+<p>
+Next: <a href="#Environment" accesskey="n" rel="next">Environment</a>, Previous: <a href="#Invoking-groff" accesskey="p" rel="prev">Invoking <code class="code">groff</code></a>, Up: <a href="#Invoking-groff" accesskey="u" rel="up">Invoking <code class="code">groff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Options">2.1 Options</h3>
+<a class="index-entry-id" id="index-options"></a>
+
+<a class="index-entry-id" id="index-groff"></a>
+<a class="index-entry-id" id="index-gtroff"></a>
+<a class="index-entry-id" id="index-gpic"></a>
+<a class="index-entry-id" id="index-geqn"></a>
+<a class="index-entry-id" id="index-ggrn"></a>
+<a class="index-entry-id" id="index-grap"></a>
+<a class="index-entry-id" id="index-gtbl"></a>
+<a class="index-entry-id" id="index-gchem"></a>
+<a class="index-entry-id" id="index-grefer"></a>
+<a class="index-entry-id" id="index-gsoelim"></a>
+<a class="index-entry-id" id="index-preconv"></a>
+<p><code class="code">groff</code> normally runs the <code class="code">gtroff</code> program and a
+postprocessor appropriate for the selected device. The default device
+is &lsquo;<samp class="samp">ps</samp>&rsquo; (but it can be changed when <code class="code">groff</code> is configured and
+built). It can optionally preprocess with any of <code class="code">gpic</code>,
+<code class="code">geqn</code>, <code class="code">gtbl</code>, <code class="code">ggrn</code>, <code class="code">grap</code>, <code class="code">gchem</code>,
+<code class="code">grefer</code>, <code class="code">gsoelim</code>, or <code class="code">preconv</code>.
+</p>
+<p>This section documents only options to the <code class="code">groff</code> front end. Many
+of the arguments to <code class="code">groff</code> are passed on to <code class="code">gtroff</code>;
+therefore, those are also included. Arguments to preprocessors and
+output drivers can be found in the man pages <cite class="cite">gpic<span class="r">(1)</span></cite>,
+<cite class="cite">geqn<span class="r">(1)</span></cite>, <cite class="cite">gtbl<span class="r">(1)</span></cite>, <cite class="cite">ggrn<span class="r">(1)</span></cite>,
+<cite class="cite">grefer<span class="r">(1)</span></cite>, <cite class="cite">gchem<span class="r">(1)</span></cite>, <cite class="cite">gsoelim<span class="r">(1)</span></cite>,
+<cite class="cite">preconv<span class="r">(1)</span></cite>, <cite class="cite">grotty<span class="r">(1)</span></cite>, <cite class="cite">grops<span class="r">(1)</span></cite>,
+<cite class="cite">gropdf<span class="r">(1)</span></cite>, <cite class="cite">grohtml<span class="r">(1)</span></cite>, <cite class="cite">grodvi<span class="r">(1)</span></cite>,
+<cite class="cite">grolj4<span class="r">(1)</span></cite>, <cite class="cite">grolbp<span class="r">(1)</span></cite>, and <cite class="cite">gxditview<span class="r">(1)</span></cite>.
+</p>
+<p>The command-line format for <code class="code">groff</code> is:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">groff [ -abceghijklpstvzCEGNRSUVXZ ] [ -d<var class="var">cs</var> ] [ -D<var class="var">arg</var> ]
+ [ -f<var class="var">fam</var> ] [ -F<var class="var">dir</var> ] [ -I<var class="var">dir</var> ] [ -K<var class="var">arg</var> ]
+ [ -L<var class="var">arg</var> ] [ -m<var class="var">name</var> ] [ -M<var class="var">dir</var> ] [ -n<var class="var">num</var> ]
+ [ -o<var class="var">list</var> ] [ -P<var class="var">arg</var> ] [ -r<var class="var">cn</var> ] [ -T<var class="var">dev</var> ]
+ [ -w<var class="var">name</var> ] [ -W<var class="var">name</var> ] [ <var class="var">files</var>&hellip; ]
+</pre></div></div>
+
+<p>The command-line format for <code class="code">gtroff</code> is as follows.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">gtroff [ -abcivzCERU ] [ -d<var class="var">cs</var> ] [ -f<var class="var">fam</var> ] [ -F<var class="var">dir</var> ]
+ [ -m<var class="var">name</var> ] [ -M<var class="var">dir</var> ] [ -n<var class="var">num</var> ] [ -o<var class="var">list</var> ]
+ [ -r<var class="var">cn</var> ] [ -T<var class="var">name</var> ] [ -w<var class="var">name</var> ] [ -W<var class="var">name</var> ]
+ [ <var class="var">files</var>&hellip; ]
+</pre></div></div>
+
+<p>Obviously, many of the options to <code class="code">groff</code> are actually passed on to
+<code class="code">gtroff</code>.
+</p>
+<p>Options without an argument can be grouped behind a
+single&nbsp;<samp class="option">-</samp>. A filename of&nbsp;<samp class="file">-</samp> denotes the
+standard input. Whitespace is permitted between an option and its
+argument.
+</p>
+<p>The <code class="code">grog</code> command can be used to guess the correct <code class="code">groff</code>
+command to format a file. See its man page <cite class="cite">grog<span class="r">(1)</span></cite>; type
+&lsquo;<samp class="samp">man grog</samp>&rsquo; at the command line to view it.
+</p>
+<p><code class="command">groff</code>&rsquo;s command-line options are as follows.
+</p>
+<a class="index-entry-id" id="index-command_002dline-options"></a>
+<dl class="table">
+<dt id='index-plain-text-approximation-output-register-_0028_002eA_0029'><span>&lsquo;<samp class="samp">-a</samp>&rsquo;<a class="copiable-link" href='#index-plain-text-approximation-output-register-_0028_002eA_0029'> &para;</a></span></dt>
+<dd><p>Generate a plain text approximation of the typeset output. The
+read-only register <code class="code">.A</code> is set to&nbsp;1. See <a class="xref" href="#Built_002din-Registers">Built-in Registers</a>. This option produces a sort of abstract preview of the
+formatted output.
+</p>
+<ul class="itemize mark-bullet">
+<li>Page breaks are marked by a phrase in angle brackets; for example,
+&lsquo;<samp class="samp">&lt;beginning of page&gt;</samp>&rsquo;.
+
+</li><li>Lines are broken where they would be in the formatted output.
+
+</li><li>A horizontal motion of any size is represented as one space. Adjacent
+horizontal motions are not combined. Inter-sentence space nodes (those
+arising from the second argument to the <code class="code">ss</code> request) are not
+represented.
+
+</li><li>Vertical motions are not represented.
+
+</li><li>Special characters are rendered in angle brackets; for example, the
+default soft hyphen character appears as &lsquo;<samp class="samp">&lt;hy&gt;</samp>&rsquo;.
+</li></ul>
+
+<p>The above description should not be considered a specification; the
+details of <samp class="option">-a</samp> output are subject to change.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-b</samp>&rsquo;</dt>
+<dd><p>Write a backtrace reporting the state of <code class="command">gtroff</code>&rsquo;s input parser
+to the standard error stream with each diagnostic message. The line
+numbers given in the backtrace might not always be correct, because
+<code class="command">gtroff</code>&rsquo;s idea of line numbers can be confused by requests that
+append to
+macros.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-c</samp>&rsquo;</dt>
+<dd><p>Start with color output disabled.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-C</samp>&rsquo;</dt>
+<dd><p>Enable AT&amp;T <code class="command">troff</code> compatibility mode; implies <samp class="option">-c</samp>.
+See <a class="xref" href="#Implementation-Differences">Implementation Differences</a>, for the list of incompatibilities
+between <code class="command">groff</code> and <abbr class="acronym">AT&amp;T</abbr> <code class="command">troff</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-d<var class="var">c</var><var class="var">text</var></samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">-d<var class="var">string</var>=<var class="var">text</var></samp>&rsquo;</dt>
+<dd><p>Define <code class="code">roff</code> string <var class="var">c</var> or <var class="var">string</var> as&nbsp;<var class="var">t</var> or
+<var class="var">text</var>. <var class="var">c</var>&nbsp;must be one character; <var class="var">string</var> can be
+of arbitrary length. Such string assignments happen before any macro
+file is loaded, including the startup file. Due to <code class="code">getopt_long</code>
+limitations, <var class="var">c</var>&nbsp;cannot be, and <var class="var">string</var> cannot contain, an
+equals sign, even though that is a valid character in a <code class="code">roff</code>
+identifier.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-D<var class="var">enc</var></samp>&rsquo;</dt>
+<dd><p>Set fallback input encoding used by <code class="command">preconv</code> to <var class="var">enc</var>;
+implies <samp class="option">-k</samp>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-e</samp>&rsquo;</dt>
+<dd><p>Run <code class="command">geqn</code> preprocessor.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-E</samp>&rsquo;</dt>
+<dd><p>Inhibit <code class="command">gtroff</code> error messages. This option does <em class="emph">not</em>
+suppress messages sent to the standard error stream by documents or
+macro packages using <code class="code">tm</code> or related requests.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-f<var class="var">fam</var></samp>&rsquo;</dt>
+<dd><p>Use <var class="var">fam</var> as the default font family. See <a class="xref" href="#Font-Families">Font Families</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-F<var class="var">dir</var></samp>&rsquo;</dt>
+<dd><p>Search in directory <samp class="file"><var class="var">dir</var></samp> for the selected output device&rsquo;s
+directory of device and font description files. See the description of
+<code class="env">GROFF_FONT_PATH</code> in <a class="ref" href="#Environment">Environment</a> below for the default search
+locations and ordering.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-g</samp>&rsquo;</dt>
+<dd><p>Run <code class="command">ggrn</code> preprocessor.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-G</samp>&rsquo;</dt>
+<dd><p>Run <code class="command">grap</code> preprocessor; implies <samp class="option">-p</samp>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-h</samp>&rsquo;</dt>
+<dd><p>Display a usage message and exit.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-i</samp>&rsquo;</dt>
+<dd><p>Read the standard input after all the named input files have been
+processed.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-I<var class="var">dir</var></samp>&rsquo;</dt>
+<dd><p>Search the directory <var class="var">dir</var> for files named in several contexts;
+implies <samp class="option">-g</samp> and <samp class="option">-s</samp>.
+</p>
+<ul class="itemize mark-bullet">
+<li><code class="command">gsoelim</code> replaces <code class="code">so</code> requests with the contents of their
+file name arguments.
+
+</li><li><code class="command">gtroff</code> searches for files named as operands in its command
+line and as arguments to <code class="code">psbb</code>, <code class="code">so</code>, and <code class="code">soquiet</code>
+requests.
+
+</li><li>Output drivers may search for files; for instance, <code class="command">grops</code> looks
+for files named in &lsquo;<samp class="samp">\X'ps: import <span class="r">&hellip;</span>'</samp>&rsquo;, &lsquo;<samp class="samp">\X'ps: file
+<span class="r">&hellip;</span>'</samp>&rsquo;, and &lsquo;<samp class="samp">\X'pdf: pdfpic <span class="r">&hellip;</span>'</samp>&rsquo; device control
+escape sequences.
+</li></ul>
+
+<p>This option may be specified more than once; the directories are
+searched in the order specified. If you want to search the current
+directory before others, add &lsquo;<samp class="samp">-I .</samp>&rsquo; at the desired place. The
+current working directory is otherwise searched last. <samp class="option">-I</samp> works
+similarly to, and is named for, the &ldquo;include&rdquo; option of Unix C
+compilers.
+</p>
+<p><samp class="option">-I</samp> options are passed to <code class="command">gsoelim</code>, <code class="command">gtroff</code>,
+and output drivers; with the flag letter changed to <samp class="option">-M</samp>, they
+are also passed to <code class="command">ggrn</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-j</samp>&rsquo;</dt>
+<dd><p>Run <code class="command">gchem</code> preprocessor. Implies <samp class="option">-p</samp>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-k</samp>&rsquo;</dt>
+<dd><p>Run <code class="command">preconv</code> preprocessor. Refer to its man page for its
+behavior if neither of <code class="command">groff</code>&rsquo;s <samp class="option">-K</samp> or <samp class="option">-D</samp>
+options is also specified.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-K<var class="var">enc</var></samp>&rsquo;</dt>
+<dd><p>Set input encoding used by <code class="command">preconv</code> to <var class="var">enc</var>; implies
+<samp class="option">-k</samp>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-l</samp>&rsquo;</dt>
+<dd><p>Send the output to a spooler for printing. The <code class="code">print</code> directive
+in the device description file specifies the default command to be used;
+see <a class="ref" href="#Device-and-Font-Description-Files">Device and Font Description Files</a>.
+See options <samp class="option">-L</samp> and <samp class="option">-X</samp>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-L<var class="var">arg</var></samp>&rsquo;</dt>
+<dd><p>Pass <var class="var">arg</var> to the print spooler program. If multiple <var class="var">arg</var>s are
+required, pass each with a separate <samp class="option">-L</samp> option. <code class="command">groff</code>
+does not prefix an option dash to <var class="var">arg</var> before passing it to the
+spooler program.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-m<var class="var">name</var></samp>&rsquo;</dt>
+<dd><p>Process the file <samp class="file"><var class="var">name</var>.tmac</samp> prior to any input files.
+If not found, <samp class="file">tmac.<var class="var">name</var></samp> is attempted. <var class="var">name</var>
+(in both arrangements) is presumed to be a macro file; see the
+description of <code class="env">GROFF_TMAC_PATH</code> in <a class="ref" href="#Environment">Environment</a> below for the
+default search locations and ordering. This option and its argument are
+also passed to <code class="command">geqn</code>, <code class="command">grap</code>, and <code class="command">ggrn</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-M<var class="var">dir</var></samp>&rsquo;</dt>
+<dd><p>Search directory <samp class="file"><var class="var">dir</var></samp> for macro files; see the description
+of <code class="env">GROFF_TMAC_PATH</code> in <a class="ref" href="#Environment">Environment</a> below for the default
+search locations and ordering. This option and its argument are also
+passed to <code class="command">geqn</code>, <code class="command">grap</code>, and <code class="command">ggrn</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-n<var class="var">num</var></samp>&rsquo;</dt>
+<dd><p>Number the first page <var class="var">num</var>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-N</samp>&rsquo;</dt>
+<dd><p>Prohibit newlines between <code class="code">eqn</code> delimiters: pass <samp class="option">-N</samp> to
+<code class="command">geqn</code>.
+</p>
+</dd>
+<dt id='index-print-current-page-register-_0028_002eP_0029'><span>&lsquo;<samp class="samp">-o<var class="var">list</var></samp>&rsquo;<a class="copiable-link" href='#index-print-current-page-register-_0028_002eP_0029'> &para;</a></span></dt>
+<dd><p>Output only pages in <var class="var">list</var>, which is a comma-separated list of page
+ranges; &lsquo;<samp class="samp"><var class="var">n</var></samp>&rsquo; means page&nbsp;<var class="var">n</var>, &lsquo;<samp class="samp"><var class="var">m</var>-<var class="var">n</var></samp>&rsquo;
+means every page between <var class="var">m</var> and&nbsp;<var class="var">n</var>, &lsquo;<samp class="samp">-<var class="var">n</var></samp>&rsquo; means
+every page up to&nbsp;<var class="var">n</var>, &lsquo;<samp class="samp"><var class="var">n</var>-</samp>&rsquo; means every page from
+<var class="var">n</var>&nbsp;on. <code class="command">gtroff</code> stops processing and exits after
+formatting the last page enumerated in <var class="var">list</var>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-p</samp>&rsquo;</dt>
+<dd><p>Run <code class="command">gpic</code> preprocessor.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-P<var class="var">arg</var></samp>&rsquo;</dt>
+<dd><p>Pass <var class="var">arg</var> to the postprocessor. If multiple <var class="var">arg</var>s are
+required, pass each with a separate <samp class="option">-P</samp> option. <code class="command">groff</code>
+does not prefix an option dash to <var class="var">arg</var> before passing it to the
+postprocessor.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-r<var class="var">c</var><var class="var">numeric-expression</var></samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">-r<var class="var">register</var>=<var class="var">expr</var></samp>&rsquo;</dt>
+<dd><p>Set <code class="code">roff</code> register&nbsp;<var class="var">c</var> or <var class="var">register</var> to the value
+<var class="var">numeric-expression</var> (see <a class="pxref" href="#Numeric-Expressions">Numeric Expressions</a>).
+<var class="var">c</var>&nbsp;must be one character; <var class="var">register</var> can be of arbitrary
+length. Such register assignments happen before any macro file is
+loaded, including the startup file. Due to <code class="code">getopt_long</code>
+limitations, <var class="var">c</var>&nbsp;cannot be, and <var class="var">register</var> cannot contain,
+an equals sign, even though that is a valid character in a <code class="code">roff</code>
+identifier.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-R</samp>&rsquo;</dt>
+<dd><p>Run <code class="command">grefer</code> preprocessor. No mechanism is provided for passing
+arguments to <code class="command">grefer</code> because most <code class="command">grefer</code> options have
+equivalent language elements that can be specified within the document.
+</p>
+<a class="index-entry-id" id="index-troffrc"></a>
+<a class="index-entry-id" id="index-troffrc_002dend"></a>
+<p><code class="command">gtroff</code> also accepts a <samp class="option">-R</samp> option, which is not
+accessible via <code class="command">groff</code>. This option prevents the loading of the
+<samp class="file">troffrc</samp> and <samp class="file">troffrc-end</samp> files.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-s</samp>&rsquo;</dt>
+<dd><p>Run <code class="command">gsoelim</code> preprocessor.
+</p>
+</dd>
+<dt id='index-open-request_002c-and-safer-mode'><span>&lsquo;<samp class="samp">-S</samp>&rsquo;<a class="copiable-link" href='#index-open-request_002c-and-safer-mode'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-opena-request_002c-and-safer-mode"></a>
+<a class="index-entry-id" id="index-pso-request_002c-and-safer-mode"></a>
+<a class="index-entry-id" id="index-sy-request_002c-and-safer-mode"></a>
+<a class="index-entry-id" id="index-pi-request_002c-and-safer-mode"></a>
+<a class="index-entry-id" id="index-safer-mode"></a>
+<a class="index-entry-id" id="index-mode_002c-safer"></a>
+<p>Operate in &ldquo;safer&rdquo; mode; see <samp class="option">-U</samp> below for its opposite. For
+security reasons, safer mode is enabled by default.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-t</samp>&rsquo;</dt>
+<dd><p>Run <code class="command">gtbl</code> preprocessor.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-T<var class="var">dev</var></samp>&rsquo;</dt>
+<dd><p>Direct <code class="command">gtroff</code> to format the input for the output device
+<var class="var">dev</var>. <code class="command">groff</code> then calls an output driver to convert
+<code class="command">gtroff</code>&rsquo;s output to a form appropriate for <var class="var">dev</var>. The
+following output devices are available.
+</p>
+<dl class="table">
+<dt><code class="code">ps</code></dt>
+<dd><p>For PostScript printers and previewers.
+</p>
+</dd>
+<dt><code class="code">pdf</code></dt>
+<dd><p>For <abbr class="acronym">PDF</abbr> viewers or printers.
+</p>
+</dd>
+<dt><code class="code">dvi</code></dt>
+<dd><p>For TeX DVI format.
+</p>
+</dd>
+<dt><code class="code">X75</code></dt>
+<dd><p>For a 75<span class="dmn">dpi</span> X11 previewer.
+</p>
+</dd>
+<dt><code class="code">X75-12</code></dt>
+<dd><p>For a 75<span class="dmn">dpi</span> X11 previewer with a 12-point base font in the
+document.
+</p>
+</dd>
+<dt><code class="code">X100</code></dt>
+<dd><p>For a 100<span class="dmn">dpi</span> X11 previewer.
+</p>
+</dd>
+<dt><code class="code">X100-12</code></dt>
+<dd><p>For a 100<span class="dmn">dpi</span> X11 previewer with a 12-point base font in the
+document.
+</p>
+</dd>
+<dt id='index-encoding_002c-output_002c-ASCII'><span><code class="code">ascii</code><a class="copiable-link" href='#index-encoding_002c-output_002c-ASCII'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-encoding_002c-output_002c-ISO-646"></a>
+<a class="index-entry-id" id="index-ASCII-output-encoding"></a>
+<a class="index-entry-id" id="index-ISO-646-output-encoding"></a>
+<a class="index-entry-id" id="index-output-encoding_002c-ASCII"></a>
+<a class="index-entry-id" id="index-output-encoding_002c-ISO-646"></a>
+<p>For typewriter-like devices using the (7-bit) <abbr class="acronym">ASCII</abbr>
+(ISO&nbsp;646) character set.
+</p>
+</dd>
+<dt id='index-encoding_002c-output_002c-Latin_002d1-_0028ISO-8859_002d1_0029'><span><code class="code">latin1</code><a class="copiable-link" href='#index-encoding_002c-output_002c-Latin_002d1-_0028ISO-8859_002d1_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-Latin_002d1-_0028ISO-8859_002d1_0029-output-encoding"></a>
+<a class="index-entry-id" id="index-ISO-8859_002d1-_0028Latin_002d1_0029-output-encoding"></a>
+<a class="index-entry-id" id="index-output-encoding_002c-Latin_002d1-_0028ISO-8859_002d1_0029"></a>
+<p>For typewriter-like devices that support the <span class="w-nolinebreak-text">Latin-1</span><!-- /@w -->
+(ISO&nbsp;<span class="w-nolinebreak-text">8859-1</span><!-- /@w -->) character set.
+</p>
+</dd>
+<dt id='index-encoding_002c-output_002c-UTF_002d8'><span><code class="code">utf8</code><a class="copiable-link" href='#index-encoding_002c-output_002c-UTF_002d8'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-UTF_002d8-output-encoding"></a>
+<a class="index-entry-id" id="index-output-encoding_002c-UTF_002d8"></a>
+<p>For typewriter-like devices that use the Unicode (ISO&nbsp;10646)
+character set with <span class="w-nolinebreak-text">UTF-8</span><!-- /@w --> encoding.
+</p>
+</dd>
+<dt id='index-encoding_002c-output_002c-EBCDIC'><span><code class="code">cp1047</code><a class="copiable-link" href='#index-encoding_002c-output_002c-EBCDIC'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-EBCDIC-output-encoding"></a>
+<a class="index-entry-id" id="index-output-encoding_002c-EBCDIC"></a>
+<a class="index-entry-id" id="index-encoding_002c-output_002c-code-page-1047"></a>
+<a class="index-entry-id" id="index-code-page-1047-output-encoding"></a>
+<a class="index-entry-id" id="index-output-encoding_002c-code-page-1047"></a>
+<a class="index-entry-id" id="index-IBM-code-page-1047-output-encoding"></a>
+<a class="index-entry-id" id="index-CCSID-1047-output-encoding-_0028EBCDIC_0029"></a>
+<p>For typewriter-like devices that use the <abbr class="acronym">EBCDIC</abbr> encoding IBM
+code page 1047.
+</p>
+</dd>
+<dt><code class="code">lj4</code></dt>
+<dd><p>For HP LaserJet4-compatible (or other PCL5-compatible) printers.
+</p>
+</dd>
+<dt><code class="code">lbp</code></dt>
+<dd><p>For Canon <abbr class="acronym">CaPSL</abbr> printers (<span class="w-nolinebreak-text">LBP-4</span><!-- /@w --> and <span class="w-nolinebreak-text">LBP-8</span><!-- /@w --> series laser
+printers).
+</p>
+<a class="index-entry-id" id="index-pre_002dgrohtml"></a>
+<a class="index-entry-id" id="index-post_002dgrohtml"></a>
+<a class="index-entry-id" id="index-grohtml_002c-the-program"></a>
+</dd>
+<dt><code class="code">html</code></dt>
+<dt><code class="code">xhtml</code></dt>
+<dd><p>To produce <abbr class="acronym">HTML</abbr> and <abbr class="acronym">XHTML</abbr> output, respectively.
+This driver consists of two parts, a preprocessor
+(<code class="command">pre-grohtml</code>) and a postprocessor (<code class="command">post-grohtml</code>).
+</p></dd>
+</dl>
+
+<a class="index-entry-id" id="index-output-device-name-string-_0028_002eT_0029"></a>
+<a class="index-entry-id" id="index-output-device-usage-register-_0028_002eT_0029"></a>
+<p>The predefined GNU <code class="code">troff</code> string <code class="code">.T</code> contains the name of
+the output device; the read-only register <code class="code">.T</code> is set to&nbsp;1 if
+this option is used (which is always true if <code class="command">groff</code> is used to
+call GNU <code class="command">troff</code>). See <a class="xref" href="#Built_002din-Registers">Built-in Registers</a>.
+</p>
+<p>The postprocessor to be used for a device is specified by the
+<code class="code">postpro</code> command in the device description file. (See <a class="xref" href="#Device-and-Font-Description-Files">Device and Font Description Files</a>.) This can be overridden with the
+<samp class="option">-X</samp> option.
+</p>
+</dd>
+<dt id='index-mode_002c-unsafe'><span>&lsquo;<samp class="samp">-U</samp>&rsquo;<a class="copiable-link" href='#index-mode_002c-unsafe'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-unsafe-mode"></a>
+<p>Operate in <em class="dfn">unsafe mode</em>, which enables the <code class="code">open</code>,
+<code class="code">opena</code>, <code class="code">pi</code>, <code class="code">pso</code>, and <code class="code">sy</code> requests. These
+requests are disabled by default because they allow an untrusted input
+document to write to arbitrary file names and run arbitrary commands.
+This option also adds the current directory to the macro package search
+path; see the <samp class="option">-m</samp> option above. <samp class="option">-U</samp> is passed to
+<code class="command">gpic</code> and <code class="command">gtroff</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-v</samp>&rsquo;</dt>
+<dd><p>Write version information for <code class="command">groff</code> and all programs run by it
+to the standard output stream; that is, the given command line is
+processed in the usual way, passing <samp class="option">-v</samp> to the formatter and any
+pre- or postprocessors invoked.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-V</samp>&rsquo;</dt>
+<dd><p>Output the pipeline that would be run by <code class="command">groff</code>
+(as a wrapper program) to the standard output stream, but do not execute
+it. If given more than once, the pipeline is both written to the
+standard error stream and run.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-w<var class="var">category</var></samp>&rsquo;</dt>
+<dd><p>Enable warnings in <var class="var">category</var>. Categories are listed in
+<a class="ref" href="#Warnings">Warnings</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-W<var class="var">category</var></samp>&rsquo;</dt>
+<dd><p>Inhibit warnings in <var class="var">category</var>. Categories are listed in
+<a class="ref" href="#Warnings">Warnings</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-X</samp>&rsquo;</dt>
+<dd><p>Use <code class="command">gxditview</code> instead of the usual postprocessor to (pre)view
+a document on an X11 display. Combining this option with
+<samp class="option">-Tps</samp> uses the font metrics of the PostScript device, whereas
+the <samp class="option">-TX75</samp> and <samp class="option">-TX100</samp> options use the metrics of X11
+fonts.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-z</samp>&rsquo;</dt>
+<dd><p>Suppress formatted output from <code class="command">gtroff</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-Z</samp>&rsquo;</dt>
+<dd><p>Disable postprocessing. <code class="command">gtroff</code> output will appear on the
+standard output stream (unless suppressed with <samp class="option">-z</samp>; see
+<a class="ref" href="#gtroff-Output"><code class="code">gtroff</code> Output</a> for a description of this format.
+</p></dd>
+</dl>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Environment">
+<div class="nav-panel">
+<p>
+Next: <a href="#Macro-Directories" accesskey="n" rel="next">Macro Directories</a>, Previous: <a href="#Groff-Options" accesskey="p" rel="prev">Options</a>, Up: <a href="#Invoking-groff" accesskey="u" rel="up">Invoking <code class="code">groff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Environment-1">2.2 Environment</h3>
+<a class="index-entry-id" id="index-environment-variables"></a>
+<a class="index-entry-id" id="index-variables-in-environment"></a>
+
+<p>There are also several environment variables (of the operating system,
+not within <code class="code">gtroff</code>) that can modify the behavior of <code class="code">groff</code>.
+</p>
+<dl class="table">
+<dt id='index-GROFF_005fBIN_005fPATH_002c-environment-variable'><span><code class="code">GROFF_BIN_PATH</code><a class="copiable-link" href='#index-GROFF_005fBIN_005fPATH_002c-environment-variable'> &para;</a></span></dt>
+<dd><p>This search path, followed by <code class="code">PATH</code>, is used for commands executed
+by <code class="code">groff</code>.
+</p>
+</dd>
+<dt id='index-GROFF_005fCOMMAND_005fPREFIX_002c-environment-variable'><span><code class="code">GROFF_COMMAND_PREFIX</code><a class="copiable-link" href='#index-GROFF_005fCOMMAND_005fPREFIX_002c-environment-variable'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-command-prefix"></a>
+<a class="index-entry-id" id="index-prefix_002c-for-commands"></a>
+<p>If this is set to&nbsp;<var class="var">X</var>, then <code class="command">groff</code> runs
+<code class="command"><var class="var">X</var>troff</code> instead of <code class="command">gtroff</code>. This also applies
+to <code class="command">tbl</code>, <code class="command">pic</code>, <code class="command">eqn</code>, <code class="command">grn</code>,
+<code class="command">chem</code>, <code class="command">refer</code>, and <code class="command">soelim</code>. It does not
+apply to <code class="command">grops</code>, <code class="command">grodvi</code>, <code class="command">grotty</code>,
+<code class="command">pre-grohtml</code>, <code class="command">post-grohtml</code>, <code class="command">preconv</code>,
+<code class="command">grolj4</code>, <code class="command">gropdf</code>, and <code class="command">gxditview</code>.
+</p>
+<p>The default command prefix is determined during the installation
+process. If a non-GNU <code class="code">troff</code> system is found, prefix &lsquo;<samp class="samp">g</samp>&rsquo; is
+used, none otherwise.
+</p>
+</dd>
+<dt id='index-GROFF_005fENCODING_002c-environment-variable'><span><code class="code">GROFF_ENCODING</code><a class="copiable-link" href='#index-GROFF_005fENCODING_002c-environment-variable'> &para;</a></span></dt>
+<dd><p>The value of this variable is passed to the <code class="code">preconv</code>
+preprocessor&rsquo;s <samp class="option">-e</samp> option to select the character encoding of
+input files. This variable&rsquo;s existence implies the <code class="code">groff</code> option
+<samp class="option">-k</samp>. If set but empty, <code class="code">groff</code> calls <code class="code">preconv</code>
+without an <samp class="option">-e</samp> option. <code class="code">groff</code>&rsquo;s <samp class="option">-K</samp> option
+overrides <code class="env">GROFF_ENCODING</code>. See the <cite class="cite">preconv<span class="r">(7)</span></cite> man page;
+type &lsquo;<samp class="samp">man preconv</samp>&rsquo; at the command line to view it.
+</p>
+</dd>
+<dt id='index-GROFF_005fFONT_005fPATH_002c-environment-variable'><span><code class="code">GROFF_FONT_PATH</code><a class="copiable-link" href='#index-GROFF_005fFONT_005fPATH_002c-environment-variable'> &para;</a></span></dt>
+<dd><p>A list of directories in which to seek the selected output device&rsquo;s
+directory of device and font description files. GNU <code class="code">troff</code>
+will search directories given as arguments to any specified <samp class="option">-F</samp>
+options before these, and a built-in list of directories after them.
+See <a class="xref" href="#Font-Directories">Font Directories</a> and the <cite class="cite">troff<span class="r">(1)</span></cite> or
+<cite class="cite">gtroff<span class="r">(1)</span></cite> man pages.
+</p>
+</dd>
+<dt id='index-GROFF_005fTMAC_005fPATH_002c-environment-variable'><span><code class="code">GROFF_TMAC_PATH</code><a class="copiable-link" href='#index-GROFF_005fTMAC_005fPATH_002c-environment-variable'> &para;</a></span></dt>
+<dd><p>A list of directories in which to seek macro files. GNU <code class="code">troff</code>
+will search directories given as arguments to any specified <samp class="option">-M</samp>
+options before these, and a built-in list of directories after them.
+See <a class="xref" href="#Macro-Directories">Macro Directories</a> and the <cite class="cite">troff<span class="r">(1)</span></cite> or
+<cite class="cite">gtroff<span class="r">(1)</span></cite> man pages.
+</p>
+</dd>
+<dt id='index-GROFF_005fTMPDIR_002c-environment-variable'><span><code class="code">GROFF_TMPDIR</code><a class="copiable-link" href='#index-GROFF_005fTMPDIR_002c-environment-variable'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-TMPDIR_002c-environment-variable"></a>
+<p>The directory in which <code class="code">groff</code> creates temporary files. If this is
+not set and <code class="env">TMPDIR</code> is set, temporary files are created in that
+directory. Otherwise temporary files are created in a system-dependent
+default directory (on Unix and GNU/Linux systems, this is usually
+<samp class="file">/tmp</samp>). <code class="code">grops</code>, <code class="code">grefer</code>, <code class="code">pre-grohtml</code>, and
+<code class="code">post-grohtml</code> can create temporary files in this directory.
+</p>
+</dd>
+<dt id='index-GROFF_005fTYPESETTER_002c-environment-variable'><span><code class="code">GROFF_TYPESETTER</code><a class="copiable-link" href='#index-GROFF_005fTYPESETTER_002c-environment-variable'> &para;</a></span></dt>
+<dd><p>Sets the default output device. If empty or not set, a build-time
+default (often <code class="code">ps</code>) is used. The <samp class="option">-T<var class="var">dev</var></samp> option
+overrides <code class="env">GROFF_TYPESETTER</code>.
+</p>
+</dd>
+<dt id='index-SOURCE_005fDATE_005fEPOCH_002c-environment-variable'><span><code class="code">SOURCE_DATE_EPOCH</code><a class="copiable-link" href='#index-SOURCE_005fDATE_005fEPOCH_002c-environment-variable'> &para;</a></span></dt>
+<dd><p>A timestamp (expressed as seconds since the Unix epoch) to use as the
+output creation timestamp in place of the current time. The time is
+converted to human-readable form using <cite class="cite">localtime<span class="r">(3)</span></cite> when the
+formatter starts up and stored in registers usable by documents and
+macro packages (see <a class="pxref" href="#Built_002din-Registers">Built-in Registers</a>).
+</p>
+</dd>
+<dt id='index-TZ_002c-environment-variable'><span><code class="code">TZ</code><a class="copiable-link" href='#index-TZ_002c-environment-variable'> &para;</a></span></dt>
+<dd><p>The time zone to use when converting the current time (or value of
+<code class="env">SOURCE_DATE_EPOCH</code>) to human-readable form; see
+<cite class="cite">tzset<span class="r">(3)</span></cite>.
+</p></dd>
+</dl>
+
+<p>MS-DOS and MS-Windows ports of <code class="code">groff</code> use semicolons, rather than
+colons, to separate the directories in the lists described above.
+</p>
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Macro-Directories">
+<div class="nav-panel">
+<p>
+Next: <a href="#Font-Directories" accesskey="n" rel="next">Font Directories</a>, Previous: <a href="#Environment" accesskey="p" rel="prev">Environment</a>, Up: <a href="#Invoking-groff" accesskey="u" rel="up">Invoking <code class="code">groff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Macro-Directories-1">2.3 Macro Directories</h3>
+<a class="index-entry-id" id="index-macro-directories"></a>
+<a class="index-entry-id" id="index-directories-for-macros"></a>
+<a class="index-entry-id" id="index-searching-macros"></a>
+<a class="index-entry-id" id="index-macros_002c-searching"></a>
+
+<p>A macro file must have a name in the form <code class="code"><var class="var">name</var>.tmac</code> or
+<code class="code">tmac.<var class="var">name</var></code> and be placed in a <em class="dfn">tmac directory</em> to be
+found by the <samp class="option">-m<var class="var">name</var></samp> command-line option.<a class="footnote" id="DOCF5" href="#FOOT5"><sup>5</sup></a>
+<a class="index-entry-id" id="index-tmac_002c-directory"></a>
+<a class="index-entry-id" id="index-directory_002c-for-tmac-files"></a>
+<a class="index-entry-id" id="index-tmac_002c-path"></a>
+<a class="index-entry-id" id="index-path_002c-for-tmac-files"></a>
+<a class="index-entry-id" id="index-locating-macro-files"></a>
+<a class="index-entry-id" id="index-macro-file-search-path"></a>
+<a class="index-entry-id" id="index-file_002c-macro_002c-search-path"></a>
+<a class="index-entry-id" id="index-locating-macro-packages"></a>
+<a class="index-entry-id" id="index-macro-package-search-path"></a>
+<a class="index-entry-id" id="index-package_002c-macro_002c-search-path"></a>
+Together, these directories constitute the <em class="dfn">tmac path</em>. Each
+directory is searched in the following order until the desired macro
+file is found or the list is exhausted.
+</p>
+<ul class="itemize mark-bullet">
+<li>Directories specified with GNU <code class="code">troff</code>&rsquo;s or <code class="code">groff</code>&rsquo;s
+<samp class="option">-M</samp> command-line option.
+
+</li><li><a class="index-entry-id" id="index-GROFF_005fTMAC_005fPATH_002c-environment-variable-1"></a>
+Directories listed in the <code class="env">GROFF_TMAC_PATH</code> environment variable.
+
+</li><li><a class="index-entry-id" id="index-safer-mode-1"></a>
+<a class="index-entry-id" id="index-mode_002c-safer-1"></a>
+<a class="index-entry-id" id="index-unsafe-mode-1"></a>
+<a class="index-entry-id" id="index-mode_002c-unsafe-1"></a>
+<a class="index-entry-id" id="index-current-directory"></a>
+<a class="index-entry-id" id="index-directory_002c-current"></a>
+The current working directory (only if in unsafe mode using the
+<samp class="option">-U</samp> command-line option).
+
+</li><li><a class="index-entry-id" id="index-home-directory"></a>
+<a class="index-entry-id" id="index-directory_002c-home"></a>
+The user&rsquo;s home directory, <code class="env">HOME</code>.
+
+</li><li><a class="index-entry-id" id="index-site_002dlocal-directory"></a>
+<a class="index-entry-id" id="index-directory_002c-site_002dlocal"></a>
+<a class="index-entry-id" id="index-platform_002dspecific-directory"></a>
+<a class="index-entry-id" id="index-directory_002c-platform_002dspecific"></a>
+A platform-dependent directory, a site-local (platform-independent)
+directory, and the main <i class="slanted">tmac</i> directory. The locations
+corresponding to your installation are listed in section &ldquo;Environment&rdquo;
+of <cite class="cite">gtroff<span class="r">(1)</span></cite>. If not otherwise configured, they are as
+follows.
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">/usr/local/lib/groff/site-tmac
+/usr/local/share/groff/site-tmac
+/usr/local/share/groff/1.23.0/tmac
+</pre></div></div>
+
+<p>The foregoing assumes that the version of <code class="code">groff</code> is 1.23.0, and
+that the installation prefix was <samp class="file">/usr/local</samp>. It is possible to
+fine-tune these locations during the source configuration process.
+</p></li></ul>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Font-Directories">
+<div class="nav-panel">
+<p>
+Next: <a href="#Paper-Format" accesskey="n" rel="next">Paper Format</a>, Previous: <a href="#Macro-Directories" accesskey="p" rel="prev">Macro Directories</a>, Up: <a href="#Invoking-groff" accesskey="u" rel="up">Invoking <code class="code">groff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Font-Directories-1">2.4 Font Directories</h3>
+<a class="index-entry-id" id="index-font-directories"></a>
+<a class="index-entry-id" id="index-directories-for-fonts"></a>
+<a class="index-entry-id" id="index-searching-fonts"></a>
+<a class="index-entry-id" id="index-fonts_002c-searching"></a>
+
+<p><code class="code">groff</code> enforces few restrictions on how font description files are
+named. For its family/style mechanism to work (see <a class="pxref" href="#Font-Families">Font Families</a>),
+the names of fonts within a family should start with the family name,
+followed by the style. For example, the Times family uses &lsquo;<samp class="samp">T</samp>&rsquo; for
+the family name and &lsquo;<samp class="samp">R</samp>&rsquo;, &lsquo;<samp class="samp">B</samp>&rsquo;, &lsquo;<samp class="samp">I</samp>&rsquo;, and &lsquo;<samp class="samp">BI</samp>&rsquo; to
+indicate the styles &lsquo;roman&rsquo;, &lsquo;bold&rsquo;, &lsquo;italic&rsquo;, and &lsquo;bold italic&rsquo;,
+respectively. Thus the final font names are &lsquo;<samp class="samp">TR</samp>&rsquo;, &lsquo;<samp class="samp">TB</samp>&rsquo;,
+&lsquo;<samp class="samp">TI</samp>&rsquo;, and &lsquo;<samp class="samp">TBI</samp>&rsquo;.
+</p>
+<a class="index-entry-id" id="index-font-path"></a>
+<a class="index-entry-id" id="index-path_002c-for-font-files"></a>
+<p>Font description files are kept in <em class="dfn">font directories</em>, which
+together constitute the <em class="dfn">font path</em>. The search procedure
+always appends the directory <code class="code">dev</code><var class="var">name</var>, where <var class="var">name</var> is
+the name of the output device. Assuming TeX DVI output, and
+<samp class="file">/foo/bar</samp> as a font directory, the font description files for
+<code class="command">grodvi</code> must be in <samp class="file">/foo/bar/devdvi</samp>.
+Each directory in the font path is searched in the following order until
+the desired font description file is found or the list is exhausted.
+</p>
+<ul class="itemize mark-bullet">
+<li>Directories specified with GNU <code class="code">troff</code>&rsquo;s or <code class="code">groff</code>&rsquo;s
+<samp class="option">-f</samp> command-line option. All output drivers (and some
+preprocessors) support this option as well, because they require
+information about the glyphs to be rendered in the document.
+
+</li><li><a class="index-entry-id" id="index-GROFF_005fFONT_005fPATH_002c-environment-variable-1"></a>
+Directories listed in the <code class="env">GROFF_FONT_PATH</code> environment variable.
+
+</li><li><a class="index-entry-id" id="index-site_002dlocal-directory-1"></a>
+<a class="index-entry-id" id="index-directory_002c-site_002dlocal-1"></a>
+A site-local directory and the main font description directory.
+The locations corresponding to your installation are listed in section
+&ldquo;Environment&rdquo; of <cite class="cite">gtroff<span class="r">(1)</span></cite>. If not otherwise configured,
+they are as follows.
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">/usr/local/share/groff/site-font
+/usr/local/share/groff/1.23.0/font
+</pre></div></div>
+
+<p>The foregoing assumes that the version of <code class="code">groff</code> is 1.23.0, and
+that the installation prefix was <samp class="file">/usr/local</samp>. It is possible to
+fine-tune these locations during the source configuration process.
+</p></li></ul>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Paper-Format">
+<div class="nav-panel">
+<p>
+Next: <a href="#Invocation-Examples" accesskey="n" rel="next">Invocation Examples</a>, Previous: <a href="#Font-Directories" accesskey="p" rel="prev">Font Directories</a>, Up: <a href="#Invoking-groff" accesskey="u" rel="up">Invoking <code class="code">groff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Paper-Format-1">2.5 Paper Format</h3>
+<a class="index-entry-id" id="index-paper-format"></a>
+<a class="index-entry-id" id="index-format_002c-paper"></a>
+<a class="index-entry-id" id="index-paper-size"></a>
+<a class="index-entry-id" id="index-size_002c-paper"></a>
+<a class="index-entry-id" id="index-landscape-page-orientation"></a>
+<a class="index-entry-id" id="index-orientation_002c-landscape"></a>
+<a class="index-entry-id" id="index-page-orientation_002c-landscape"></a>
+
+<p>In <code class="code">groff</code>, the page dimensions for the formatter GNU <code class="code">troff</code>
+and for output devices are handled separately. See <a class="xref" href="#Page-Layout">Page Layout</a>, for
+vertical manipulation of the page size, and See <a class="xref" href="#Line-Layout">Line Layout</a>, for
+horizontal changes.
+<a class="index-entry-id" id="index-papersize_002etmac"></a>
+<a class="index-entry-id" id="index-troffrc-1"></a>
+The <samp class="file">papersize</samp> macro package, normally loaded by <samp class="file">troffrc</samp> at
+startup, provides an interface for configuring page dimensions by
+convenient names, like &lsquo;<samp class="samp">letter</samp>&rsquo; or &lsquo;<samp class="samp">a4</samp>&rsquo;; see
+<cite class="cite">groff_tmac<span class="r">(5)</span></cite>. The default used by the formatter depends on
+its build configuration, but is usually one of the foregoing, as
+geographically appropriate.
+</p>
+<p>It is up to each macro package to respect the page dimensions configured
+in this way.
+</p>
+<p>For each output device, the size of the output medium can be set in its
+<samp class="file">DESC</samp> file. Most output drivers also recognize a command-line
+option <samp class="option">-p</samp> to override the default dimensions and an option
+<samp class="option">-l</samp> to use landscape orientation. See <a class="xref" href="#DESC-File-Format"><samp class="file">DESC</samp> File Format</a>, for
+a description of the <code class="code">papersize</code> keyword, which takes an argument
+of the same form as <samp class="option">-p</samp>. The output driver&rsquo;s man page, such as
+<cite class="cite">grops<span class="r">(1)</span></cite>, may also be helpful.
+</p>
+<p><code class="code">groff</code> uses the command-line option <samp class="option">-P</samp> to pass options to
+postprocessors; for example, use the following for PostScript output on
+A4 paper in landscape orientation.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">groff -Tps -dpaper=a4l -P-pa4 -P-l -ms foo.ms &gt; foo.ps
+</pre></div></div>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Invocation-Examples">
+<div class="nav-panel">
+<p>
+Previous: <a href="#Paper-Format" accesskey="p" rel="prev">Paper Format</a>, Up: <a href="#Invoking-groff" accesskey="u" rel="up">Invoking <code class="code">groff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Invocation-Examples-1">2.6 Invocation Examples</h3>
+<a class="index-entry-id" id="index-invocation-examples"></a>
+<a class="index-entry-id" id="index-examples-of-invocation"></a>
+
+<p><code class="code">roff</code> systems are best known for formatting man pages. Once a
+<code class="command">man</code> librarian program has located a man page, it may execute
+a <code class="code">groff</code> command much like the following.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">groff -t -man -Tutf8 /usr/share/man/man1/groff.1
+</pre></div></div>
+
+<p>The librarian will also pipe the output through a pager, which might not
+interpret the SGR terminal escape sequences <code class="command">groff</code> emits for
+boldface, underlining, or italics; see the <cite class="cite">grotty<span class="r">(1)</span></cite> man page
+for a discussion.
+</p>
+<p>To process a <code class="code">roff</code> input file using the preprocessors
+<code class="command">gtbl</code> and <code class="command">gpic</code> and the <samp class="file">me</samp> macro package in the
+way to which AT&amp;T <code class="code">troff</code> users were accustomed, one would type (or
+script) a pipeline.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">gpic foo.me | gtbl | gtroff -me -Tutf8 | grotty
+</pre></div></div>
+
+<p>Using <code class="command">groff</code>, this pipe can be shortened to an equivalent
+command.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">groff -p -t -me -T utf8 foo.me
+</pre></div></div>
+
+<p>An even easier way to do this is to use <code class="command">grog</code> to guess the
+preprocessor and macro options and execute the result by using the
+command substitution feature of the shell.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">$(grog -Tutf8 foo.me)
+</pre></div></div>
+
+<p>Each command-line option to a postprocessor must be specified with any
+required leading dashes &lsquo;<samp class="samp">-</samp>&rsquo;
+because <code class="command">groff</code> passes the arguments as-is to the postprocessor;
+this permits arbitrary arguments to be transmitted. For example, to
+pass a title to the <code class="command">gxditview</code> postprocessor,
+the shell commands
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">groff -X -P -title -P 'trial run' mydoc.t
+</pre></div></div>
+
+<p>and
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">groff -X -Z mydoc.t | gxditview -title 'trial run' -
+</pre></div></div>
+
+<p>are equivalent.
+</p>
+
+
+
+<hr>
+</div>
+</div>
+<div class="chapter-level-extent" id="Tutorial-for-Macro-Users">
+<div class="nav-panel">
+<p>
+Next: <a href="#Major-Macro-Packages" accesskey="n" rel="next">Macro Packages</a>, Previous: <a href="#Invoking-groff" accesskey="p" rel="prev">Invoking <code class="code">groff</code></a>, Up: <a href="#Top" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h2 class="chapter" id="Tutorial-for-Macro-Users-1">3 Tutorial for Macro Users</h2>
+<a class="index-entry-id" id="index-tutorial-for-macro-users"></a>
+<a class="index-entry-id" id="index-macros_002c-tutorial-for-users"></a>
+<a class="index-entry-id" id="index-user_0027s-tutorial-for-macros"></a>
+<a class="index-entry-id" id="index-user_0027s-macro-tutorial"></a>
+
+<p>Most users of the <code class="code">roff</code> language employ a macro package to format
+their documents. Successful macro packages ease the composition
+process; their users need not have mastered the full formatting
+language, nor understand features like diversions, traps, and
+environments. This chapter aims to familiarize you with basic concepts
+and mechanisms common to many macro packages (like &ldquo;displays&rdquo;). If
+you prefer a meticulous and comprehensive presentation, try <a class="ref" href="#GNU-troff-Reference">GNU <code class="code">troff</code> Reference</a> instead.
+</p>
+
+
+
+<ul class="mini-toc">
+<li><a href="#Basics" accesskey="1">Basics</a></li>
+<li><a href="#Common-Features" accesskey="2">Common Features</a></li>
+</ul>
+<hr>
+<div class="section-level-extent" id="Basics">
+<div class="nav-panel">
+<p>
+Next: <a href="#Common-Features" accesskey="n" rel="next">Common Features</a>, Previous: <a href="#Tutorial-for-Macro-Users" accesskey="p" rel="prev">Tutorial for Macro Users</a>, Up: <a href="#Tutorial-for-Macro-Users" accesskey="u" rel="up">Tutorial for Macro Users</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Basics-1">3.1 Basics</h3>
+<a class="index-entry-id" id="index-basics-of-macro-package-usage"></a>
+<a class="index-entry-id" id="index-macro-package-usage_002c-basics-of"></a>
+
+<p>Let us first survey some basic concepts necessary to use a macro package
+fruitfully.<a class="footnote" id="DOCF6" href="#FOOT6"><sup>6</sup></a>
+References are made throughout to more detailed information.
+</p>
+<p>GNU <code class="code">troff</code> reads an input file prepared by the user and outputs a
+formatted document suitable for publication or framing. The input
+consists of text, or words to be printed, and embedded commands
+(<i class="slanted">requests</i> and <i class="slanted">escape sequences</i>), which tell GNU
+<code class="code">troff</code> how to format the output. See <a class="xref" href="#Formatter-Instructions">Formatter Instructions</a>.
+</p>
+<p>The word <i class="slanted">argument</i> is used in this chapter to mean a word or
+number that appears on the same line as a request, and which modifies
+the meaning of that request. For example, the request
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.sp
+</pre></div></div>
+
+<p>spaces one line, but
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.sp 4
+</pre></div></div>
+
+<p>spaces four lines. The number&nbsp;4 is an argument to the <code class="code">sp</code>
+request, which says to space four lines instead of one. Arguments are
+separated from the request and from each other by spaces (<em class="emph">not</em>
+tabs). See <a class="xref" href="#Invoking-Requests">Invoking Requests</a>.
+</p>
+<p>The primary function of GNU <code class="code">troff</code> is to collect words from input
+lines, fill output lines with those words, adjust the line to the
+right-hand margin by widening spaces, and output the result. For
+example, the input:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">Now is the time
+for all good men
+to come to the aid
+of their party.
+Four score and seven
+years ago, etc.
+</pre></div></div>
+
+<p>is read, packed onto output lines, and justified to produce:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; Now is the time for all good men to come to the aid of
+ &rArr; their party. Four score and seven years ago, etc.
+</pre></div></div>
+
+<p>Sometimes a new output line should be started even though the current
+line is not yet full&mdash;for example, at the end of a paragraph. To do
+this it is possible to force a <i class="slanted">break</i>, starting a new output
+line. Some requests cause a break automatically, as do (normally) blank
+input lines and input lines beginning with a space or tab.
+</p>
+<p>Not all input lines are <i class="slanted">text lines</i>&mdash;words to be formatted.
+Some are <i class="slanted">control lines</i> that tell a macro package (or GNU
+<code class="code">troff</code> directly) how to format the text. Control lines start with
+a dot (&lsquo;<samp class="samp">.</samp>&rsquo;) or an apostrophe (&lsquo;<samp class="samp">'</samp>&rsquo;) as the first character, and
+can be followed by a <i class="slanted">macro call</i>.
+</p>
+<p>The formatter also does more complex things, such as automatically
+numbering pages, skipping over page boundaries, putting footnotes in the
+correct place, and so forth.
+</p>
+<p>Here are a few hints for preparing text for input to GNU <code class="code">troff</code>.
+</p>
+<ul class="itemize mark-bullet">
+<li>First, keep the input lines short. Short input lines are easier to
+edit, and GNU <code class="code">troff</code> packs words onto longer lines anyhow.
+
+</li><li>In keeping with this, it is helpful to begin a new line after every
+comma or phrase, since common corrections are to add or delete sentences
+or phrases.
+
+</li><li>End each sentence with two spaces&mdash;or better, start each sentence on a
+new line. GNU <code class="code">troff</code> recognizes characters that usually end a
+sentence, and inserts inter-sentence space accordingly.
+
+</li><li>Do not hyphenate words at the end of lines&mdash;GNU <code class="code">troff</code> is smart
+enough to hyphenate words as needed, but is not smart enough to take
+hyphens out and join a word back together. Also, words such as
+&ldquo;mother-in-law&rdquo; should not be broken over a line, since then a space
+can occur where not wanted, such as &ldquo;<span class="w-nolinebreak-text">mother-</span>&nbsp;in<!-- /@w -->-law&rdquo;.
+</li></ul>
+
+<p>We offer further advice in <a class="ref" href="#Input-Conventions">Input Conventions</a>.
+</p>
+<a class="index-entry-id" id="index-vertical-spacing-_0028introduction_0029"></a>
+<a class="index-entry-id" id="index-spacing_002c-vertical-_0028introduction_0029"></a>
+<p>GNU <code class="code">troff</code> permits alteration of the distance between lines of
+text. This is termed <i class="slanted">vertical spacing</i> and is expressed in the
+same units as the type size&mdash;the point. The default is 10-point type
+on 12-point spacing. To get <i class="slanted">double-spaced</i> text you would set
+the vertical spacing to 24 points. Some, but not all, macro packages
+expose a macro or register to configure the vertical spacing.
+</p>
+<p>A number of requests allow you to change the way the output is arranged
+on the page, sometimes called the <i class="slanted">layout</i> of the output page.
+Most macro packages don&rsquo;t supply macros for performing these (at least
+not without performing other actions besides), as they are such basic
+operations. The macro packages for writing man pages, <samp class="file">man</samp> and
+<samp class="file">mdoc</samp>, don&rsquo;t encourage explicit use of these requests at all.
+</p>
+<a class="index-entry-id" id="index-spacing-_0028introduction_0029"></a>
+<p>The request &lsquo;<samp class="samp">.sp&nbsp;<var class="var">N</var></samp>&rsquo;<!-- /@w --> leaves <var class="var">N</var>&nbsp;lines of blank
+space. <var class="var">N</var>&nbsp;can be omitted (skipping a single line) or can
+be of the form <var class="var">N</var>i (for <var class="var">N</var>&nbsp;inches) or <var class="var">N</var>c (for
+<var class="var">N</var>&nbsp;centimeters). For example, the input:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.sp 1.5i
+My thoughts on the subject
+.sp
+</pre></div></div>
+
+<p>leaves one and a half inches of space, followed by the line &ldquo;My
+thoughts on the subject&rdquo;, followed by a single blank line (more
+measurement units are available; see <a class="ref" href="#Measurements">Measurements</a>).
+</p>
+<p>If you seek precision in spacing, be advised when using a macro package
+that it might not honor <code class="code">sp</code> requests as you expect; it can use a
+formatter feature called <i class="slanted">no-space mode</i> to prevent excess space
+from accumulating. Macro packages typically offer registers to control
+spacing between paragraphs, before section headings, and around displays
+(discussed below); use these facilities preferentially.
+See <a class="xref" href="#Manipulating-Spacing">Manipulating Spacing</a>.
+</p>
+<a class="index-entry-id" id="index-centering-lines-_0028introduction_0029"></a>
+<a class="index-entry-id" id="index-lines_002c-centering-_0028introduction_0029"></a>
+<p>Text lines can be centered by using the <code class="code">ce</code> request. The line
+after <code class="code">ce</code> is centered (horizontally) on the page. To center more
+than one line, use &lsquo;<samp class="samp">.ce&nbsp;<var class="var">N</var></samp>&rsquo;<!-- /@w --> (where <var class="var">N</var> is the number
+of lines to center), followed by the <var class="var">N</var>&nbsp;lines. To center many
+lines without counting them, type:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ce 1000
+lines to center
+.ce 0
+</pre></div></div>
+
+<p>The &lsquo;<samp class="samp">.ce&nbsp;0</samp>&rsquo;<!-- /@w --> request tells GNU <code class="code">troff</code> to center zero more
+lines, in other words, stop centering.
+</p>
+<a class="index-entry-id" id="index-right_002daligning-lines-_0028introduction_0029"></a>
+<a class="index-entry-id" id="index-lines_002c-right_002daligning-_0028introduction_0029"></a>
+<a class="index-entry-id" id="index-right_002djustifying-lines-_0028introduction_0029"></a>
+<a class="index-entry-id" id="index-lines_002c-right_002djustifying-_0028introduction_0029"></a>
+<p>GNU <code class="code">troff</code> also offers the <code class="code">rj</code> request for right-aligning
+text. It works analogously to <code class="code">ce</code> and is convenient for setting
+epigraphs.
+</p>
+<a class="index-entry-id" id="index-page-break-_0028introduction_0029"></a>
+<a class="index-entry-id" id="index-break_002c-page-_0028introduction_0029"></a>
+<p>The <code class="code">bp</code> request starts a new page; this necessarily implies an
+ordinary (line) break.
+</p>
+<a class="index-entry-id" id="index-break-_0028introduction_0029"></a>
+<a class="index-entry-id" id="index-line-break-_0028introduction_0029"></a>
+<p>All of these requests cause a break; that is, they always start a new
+line. To start a new line without performing any other action, use
+<code class="code">br</code>. If you invoke them with the apostrophe &lsquo;<samp class="samp">'</samp>&rsquo;, the
+<i class="slanted">no-break control character</i>, the (initial) break they normally
+perform is suppressed. &lsquo;<samp class="samp">'br</samp>&rsquo; does nothing.
+</p>
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Common-Features">
+<div class="nav-panel">
+<p>
+Previous: <a href="#Basics" accesskey="p" rel="prev">Basics</a>, Up: <a href="#Tutorial-for-Macro-Users" accesskey="u" rel="up">Tutorial for Macro Users</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Common-Features-1">3.2 Common Features</h3>
+<a class="index-entry-id" id="index-common-features"></a>
+<a class="index-entry-id" id="index-features_002c-common"></a>
+
+<p>GNU <code class="code">troff</code> provides low-level operations for formatting a
+document. Many routine operations are undertaken in nearly all
+documents that require a series of such primitive operations to be
+performed. These common tasks are grouped into <i class="slanted">macros</i>, which
+are then collected into a <i class="slanted">macro package</i>.
+</p>
+<p>Macro packages come in two varieties: &ldquo;major&rdquo; or &ldquo;full-service&rdquo;
+ones that manage page layout, and &ldquo;minor&rdquo; or &ldquo;auxiliary&rdquo; ones that
+do not, instead fulfilling narrow, specific tasks. Find a list in the
+<cite class="cite">groff_tmac<span class="r">(5)</span></cite> man page. Type &lsquo;<samp class="samp">man groff_tmac</samp>&rsquo; at the
+command line to view it.
+</p>
+<p>We survey several capabilities of full-service macro package below.
+Each package employs its own macros to exercise them. For details,
+consult its man page or, for <samp class="file">ms</samp>, see <a class="ref" href="#ms"><samp class="file">ms</samp></a>.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="#Paragraphs" accesskey="1">Paragraphs</a></li>
+<li><a href="#Sections-and-Chapters" accesskey="2">Sections and Chapters</a></li>
+<li><a href="#Headers-and-Footers" accesskey="3">Headers and Footers</a></li>
+<li><a href="#Page-Layout-Adjustment" accesskey="4">Page Layout</a></li>
+<li><a href="#Displays-and-Keeps" accesskey="5">Displays and Keeps</a></li>
+<li><a href="#Footnotes-and-Endnotes" accesskey="6">Footnotes and Endnotes</a></li>
+<li><a href="#Table-of-Contents" accesskey="7">Table of Contents</a></li>
+<li><a href="#Indexing" accesskey="8">Indexing</a></li>
+<li><a href="#Document-Formats" accesskey="9">Document Formats</a></li>
+<li><a href="#Columnation">Columnation</a></li>
+<li><a href="#Font-and-Size-Changes">Font and Size Changes</a></li>
+<li><a href="#Predefined-Text">Predefined Text</a></li>
+<li><a href="#Preprocessor-Support">Preprocessor Support</a></li>
+<li><a href="#Configuration-and-Customization">Configuration and Customization</a></li>
+</ul>
+<hr>
+<div class="subsection-level-extent" id="Paragraphs">
+<div class="nav-panel">
+<p>
+Next: <a href="#Sections-and-Chapters" accesskey="n" rel="next">Sections and Chapters</a>, Previous: <a href="#Common-Features" accesskey="p" rel="prev">Common Features</a>, Up: <a href="#Common-Features" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Paragraphs-1">3.2.1 Paragraphs</h4>
+<a class="index-entry-id" id="index-paragraphs"></a>
+
+<p>Paragraphs can be separated and indented in various ways. Some start
+with a blank line and have a first-line indentation, like most of the
+ones in this manual. Block paragraphs omit the indentation.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; Some men look at constitutions with sanctimonious
+ &rArr; reverence, and deem them like the ark of the
+ &rArr; covenant, too sacred to be touched.
+</pre></div></div>
+
+<a class="index-entry-id" id="index-tags_002c-paragraph"></a>
+<a class="index-entry-id" id="index-tagged-paragraphs"></a>
+<a class="index-entry-id" id="index-lists"></a>
+<p>We also frequently encounter <i class="slanted">tagged</i> paragraphs, which begin
+with a tag or label at the left margin and indent the remaining text.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; one This is the first paragraph. Notice how the
+ &rArr; first line of the resulting paragraph lines
+ &rArr; up with the other lines in the paragraph.
+</pre></div></div>
+
+<p>If the tag is too wide for the indentation, the line is broken.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; longlabel
+ &rArr; The label does not align with the subsequent
+ &rArr; lines, but they align with each other.
+</pre></div></div>
+
+<p>A variation of the tagged paragraph is the itemized or enumerated
+paragraph, which might use punctuation or a digit for a tag,
+respectively. These are frequently used to construct lists.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; o This list item starts with a bullet. When
+ &rArr; producing output for a device using the ASCII
+ &rArr; character set, an 'o' is formatted instead.
+</pre></div></div>
+
+<p>Often, use of the same macro without a tag continues such a discussion.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; -xyz This option is recognized but ignored.
+ &rArr;
+ &rArr; It had a security hole that we don't discuss.
+</pre></div></div>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Sections-and-Chapters">
+<div class="nav-panel">
+<p>
+Next: <a href="#Headers-and-Footers" accesskey="n" rel="next">Headers and Footers</a>, Previous: <a href="#Paragraphs" accesskey="p" rel="prev">Paragraphs</a>, Up: <a href="#Common-Features" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Sections-and-Chapters-1">3.2.2 Sections and Chapters</h4>
+
+<p>The simplest kind of section heading is unnumbered, set in a bold or
+italic style, and occupies a line by itself. Others possess
+automatically numbered multi-level headings and/or different typeface
+styles or sizes at different levels. More sophisticated macro packages
+supply macros for designating chapters and appendices.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Headers-and-Footers">
+<div class="nav-panel">
+<p>
+Next: <a href="#Page-Layout-Adjustment" accesskey="n" rel="next">Page Layout</a>, Previous: <a href="#Sections-and-Chapters" accesskey="p" rel="prev">Sections and Chapters</a>, Up: <a href="#Common-Features" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Headers-and-Footers-1">3.2.3 Headers and Footers</h4>
+
+<p><i class="slanted">Headers</i> and <i class="slanted">footers</i> occupy the top and bottom of
+each page, respectively, and contain data like the page number and the
+article or chapter title. Their appearance is not affected by the
+running text. Some packages allow for different titles on even- and
+odd-numbered pages (for printed, bound material).
+</p>
+<p>Headers and footers are together called <i class="slanted">titles</i>, and comprise
+three parts: left-aligned, centered, and right-aligned. A &lsquo;<samp class="samp">%</samp>&rsquo;
+character appearing anywhere in a title is automatically replaced by the
+page number. See <a class="xref" href="#Page-Layout">Page Layout</a>.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Page-Layout-Adjustment">
+<div class="nav-panel">
+<p>
+Next: <a href="#Displays-and-Keeps" accesskey="n" rel="next">Displays and Keeps</a>, Previous: <a href="#Headers-and-Footers" accesskey="p" rel="prev">Headers and Footers</a>, Up: <a href="#Common-Features" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Page-Layout-1">3.2.4 Page Layout</h4>
+
+<p>Most macro packages let the user specify the size of the page margins.
+The top and bottom margins are typically handled differently than the
+left and right margins; the latter two are derived from the
+<i class="slanted">page offset</i>, <i class="slanted">indentation</i>, and <i class="slanted">line length</i>.
+See <a class="xref" href="#Line-Layout">Line Layout</a>. Commonly, packages support registers to tune these
+values.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Displays-and-Keeps">
+<div class="nav-panel">
+<p>
+Next: <a href="#Footnotes-and-Endnotes" accesskey="n" rel="next">Footnotes and Endnotes</a>, Previous: <a href="#Page-Layout-Adjustment" accesskey="p" rel="prev">Page Layout</a>, Up: <a href="#Common-Features" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Displays-and-Keeps-1">3.2.5 Displays and Keeps</h4>
+<a class="index-entry-id" id="index-displays"></a>
+
+<p><i class="slanted">Displays</i> are sections of text set off from the surrounding
+material (typically paragraphs), often differing in indentation, and/or
+spacing. Tables, block quotations, and figures are displayed.
+Equations and code examples, when not much shorter than an output line,
+often are. Lists may or may not be. Packages for setting man pages
+support example displays but not keeps.
+</p>
+<a class="index-entry-id" id="index-keeps-_0028introduction_0029"></a>
+<p>A <i class="slanted">keep</i> is a group of output lines, often a display, that is
+formatted on a single page if possible; it causes a page break to happen
+early so as to not interrupt the kept material.
+</p>
+<a class="index-entry-id" id="index-keep_002c-floating"></a>
+<a class="index-entry-id" id="index-floating-keep"></a>
+<p><i class="slanted">Floating keeps</i> can move, or &ldquo;float&rdquo;, relative to the text
+around them in the input. They are useful for displays that are
+captioned and referred to by name, as with &ldquo;See figure&nbsp;3&rdquo;.
+Depending on the package, a floating keep appears at the bottom of the
+current page if it fits, and at the top of the next otherwise.
+Alternatively, floating keeps might be deferred to the end of a section.
+Using a floating keep can avoid the large vertical spaces that may
+precede a tall keep of the ordinary sort when it won&rsquo;t fit on the page.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Footnotes-and-Endnotes">
+<div class="nav-panel">
+<p>
+Next: <a href="#Table-of-Contents" accesskey="n" rel="next">Table of Contents</a>, Previous: <a href="#Displays-and-Keeps" accesskey="p" rel="prev">Displays and Keeps</a>, Up: <a href="#Common-Features" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Footnotes-and-Endnotes-1">3.2.6 Footnotes and Endnotes</h4>
+<a class="index-entry-id" id="index-footnotes"></a>
+<a class="index-entry-id" id="index-endnotes"></a>
+
+<p><i class="slanted">Footnotes</i> and <i class="slanted">endnotes</i> are forms of delayed
+formatting. They are recorded at their points of relevance in
+the input, but not formatted there. Instead, a <i class="slanted">mark</i> cues the
+reader to check the &ldquo;foot&rdquo;, or bottom, of the current page, or in the
+case of endnotes, an annotation list later in the document. Macro
+packages that support these features also supply a means of
+automatically numbering either type of annotation.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Table-of-Contents">
+<div class="nav-panel">
+<p>
+Next: <a href="#Indexing" accesskey="n" rel="next">Indexing</a>, Previous: <a href="#Footnotes-and-Endnotes" accesskey="p" rel="prev">Footnotes and Endnotes</a>, Up: <a href="#Common-Features" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Table-of-Contents-1">3.2.7 Table of Contents</h4>
+<a class="index-entry-id" id="index-table-of-contents"></a>
+<a class="index-entry-id" id="index-contents_002c-table-of"></a>
+
+<p>A package may handle a <i class="slanted">table of contents</i> by directing section
+heading macros to save section heading text and the page number where it
+occurs for use in a later <i class="slanted">entry</i> for a table of contents. It
+writes the collected entries at the end of the document, once all are
+known, upon request. A row of dots (a <i class="slanted">leader</i>) bridges the
+text on the left with its location on the right. Other collections
+might work in this manner, providing lists of figures or tables.
+</p>
+<p>A table of contents is often found at the end of a GNU <code class="code">troff</code>
+document because the formatter processes the document in a single pass.
+The <code class="command">gropdf</code> output driver supports a PDF feature that relocates
+pages at the time the document is rendered; see the <cite class="cite">gropdf<span class="r">(1)</span></cite>
+man page. Type &lsquo;<samp class="samp">man gropdf</samp>&rsquo; at the command line to view it.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Indexing">
+<div class="nav-panel">
+<p>
+Next: <a href="#Document-Formats" accesskey="n" rel="next">Document Formats</a>, Previous: <a href="#Table-of-Contents" accesskey="p" rel="prev">Table of Contents</a>, Up: <a href="#Common-Features" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Indexing-1">3.2.8 Indexing</h4>
+<a class="index-entry-id" id="index-index_002c-in-macro-package"></a>
+
+<a class="index-entry-id" id="index-makeindex"></a>
+<p>An index is similar to a table of contents, in that entry labels and
+locations must be collected, but poses a greater challenge because it
+needs to be sorted before it is output. Here, processing the document
+in multiple passes is inescapable, and tools like the <code class="code">makeindex</code>
+program are necessary.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Document-Formats">
+<div class="nav-panel">
+<p>
+Next: <a href="#Columnation" accesskey="n" rel="next">Columnation</a>, Previous: <a href="#Indexing" accesskey="p" rel="prev">Indexing</a>, Up: <a href="#Common-Features" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Document-Formats-1">3.2.9 Document Formats</h4>
+<a class="index-entry-id" id="index-document-formats"></a>
+
+<p>Some macro packages supply stock configurations of certain documents,
+like business letters and memoranda. These often also have provision
+for a <i class="slanted">cover sheet</i>, which may be rigid in its format. With
+these features, it is even more important to use the package&rsquo;s macros in
+preference to the formatter requests presented earlier, where possible.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Columnation">
+<div class="nav-panel">
+<p>
+Next: <a href="#Font-and-Size-Changes" accesskey="n" rel="next">Font and Size Changes</a>, Previous: <a href="#Document-Formats" accesskey="p" rel="prev">Document Formats</a>, Up: <a href="#Common-Features" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Columnation-1">3.2.10 Columnation</h4>
+
+<p>Macro packages apart from <samp class="file">man</samp> and <samp class="file">mdoc</samp> for man page
+formatting offer a facility for setting multiple columns on the page.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Font-and-Size-Changes">
+<div class="nav-panel">
+<p>
+Next: <a href="#Predefined-Text" accesskey="n" rel="next">Predefined Text</a>, Previous: <a href="#Columnation" accesskey="p" rel="prev">Columnation</a>, Up: <a href="#Common-Features" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Font-and-Size-Changes-1">3.2.11 Font and Size Changes</h4>
+
+<p>The formatter&rsquo;s requests and escape sequences for setting the typeface
+and size are not always intuitive, so all macro packages provide macros
+to make these operations simpler. They also make it more convenient to
+change typefaces in the middle of a word and can handle italic
+corrections automatically. See <a class="xref" href="#Italic-Corrections">Italic Corrections</a>.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Predefined-Text">
+<div class="nav-panel">
+<p>
+Next: <a href="#Preprocessor-Support" accesskey="n" rel="next">Preprocessor Support</a>, Previous: <a href="#Font-and-Size-Changes" accesskey="p" rel="prev">Font and Size Changes</a>, Up: <a href="#Common-Features" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Predefined-Text-1">3.2.12 Predefined Text</h4>
+
+<p>Most macro packages supply predefined strings to set prepared text like
+the date, or to perform operations like super- and subscripting.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Preprocessor-Support">
+<div class="nav-panel">
+<p>
+Next: <a href="#Configuration-and-Customization" accesskey="n" rel="next">Configuration and Customization</a>, Previous: <a href="#Predefined-Text" accesskey="p" rel="prev">Predefined Text</a>, Up: <a href="#Common-Features" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Preprocessor-Support-1">3.2.13 Preprocessor Support</h4>
+
+<p>All macro packages provide support for various preprocessors and may
+extend their functionality by defining macros to set their contents in
+displays. Examples include <code class="code">TS</code> and <code class="code">TE</code> for <code class="command">gtbl</code>,
+<code class="code">EQ</code> and <code class="code">EN</code> for <code class="command">geqn</code>, and <code class="code">PS</code> and <code class="code">PE</code>
+for <code class="command">gpic</code>.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Configuration-and-Customization">
+<div class="nav-panel">
+<p>
+Previous: <a href="#Preprocessor-Support" accesskey="p" rel="prev">Preprocessor Support</a>, Up: <a href="#Common-Features" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Configuration-and-Customization-1">3.2.14 Configuration and Customization</h4>
+
+<p>Packages provide means of customizing many of the details of how the
+package behaves. These range from setting the default type size to
+changing the appearance of section headers.
+</p>
+
+
+
+
+<hr>
+</div>
+</div>
+</div>
+<div class="chapter-level-extent" id="Major-Macro-Packages">
+<div class="nav-panel">
+<p>
+Next: <a href="#GNU-troff-Reference" accesskey="n" rel="next">GNU <code class="code">troff</code> Reference</a>, Previous: <a href="#Tutorial-for-Macro-Users" accesskey="p" rel="prev">Tutorial for Macro Users</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h2 class="chapter" id="Macro-Packages-2">4 Macro Packages</h2>
+<a class="index-entry-id" id="index-major-macro-package"></a>
+<a class="index-entry-id" id="index-package_002c-macro_002c-major"></a>
+<a class="index-entry-id" id="index-macro-package_002c-major"></a>
+
+<p>This chapter surveys the &ldquo;major&rdquo; macro packages that come with
+<code class="code">groff</code>. One, <samp class="file">ms</samp>, is presented in detail.
+</p>
+<a class="index-entry-id" id="index-full_002dservice-macro-package"></a>
+<a class="index-entry-id" id="index-package_002c-macro_002c-full_002dservice"></a>
+<a class="index-entry-id" id="index-macro-package_002c-full_002dservice"></a>
+<p>Major macro packages are also sometimes described as <em class="dfn">full-service</em>
+due to the breadth of features they provide and because more than one
+cannot be used by the same document; for example
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">groff -m man foo.man -m ms bar.doc
+</pre></div></div>
+
+<p>doesn&rsquo;t work. Option arguments are processed before non-option
+arguments; the above (failing) sample is thus reordered to
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">groff -m man -m ms foo.man bar.doc
+</pre></div></div>
+
+<a class="index-entry-id" id="index-minor-macro-package"></a>
+<a class="index-entry-id" id="index-package_002c-macro_002c-minor"></a>
+<a class="index-entry-id" id="index-macro-package_002c-minor"></a>
+<a class="index-entry-id" id="index-auxiliary-macro-package"></a>
+<a class="index-entry-id" id="index-package_002c-macro_002c-auxiliary"></a>
+<a class="index-entry-id" id="index-macro-package_002c-auxiliary"></a>
+<p>Many auxiliary, or &ldquo;minor&rdquo;, macro packages are also available. They
+may in general be used with any full-service macro package and handle a
+variety of tasks from character encoding selection, to language
+localization, to inlining of raster images. See the
+<cite class="cite">groff_tmac<span class="r">(5)</span></cite> man page for a list. Type &lsquo;<samp class="samp">man
+groff_tmac</samp>&rsquo; at the command line to view it.
+</p>
+
+
+
+<ul class="mini-toc">
+<li><a href="#man" accesskey="1"><samp class="file">man</samp></a></li>
+<li><a href="#mdoc" accesskey="2"><samp class="file">mdoc</samp></a></li>
+<li><a href="#me" accesskey="3"><samp class="file">me</samp></a></li>
+<li><a href="#mm" accesskey="4"><samp class="file">mm</samp></a></li>
+<li><a href="#mom" accesskey="5"><samp class="file">mom</samp></a></li>
+<li><a href="#ms" accesskey="6"><samp class="file">ms</samp></a></li>
+</ul>
+<hr>
+<div class="section-level-extent" id="man">
+<div class="nav-panel">
+<p>
+Next: <a href="#mdoc" accesskey="n" rel="next"><samp class="file">mdoc</samp></a>, Previous: <a href="#Major-Macro-Packages" accesskey="p" rel="prev">Macro Packages</a>, Up: <a href="#Major-Macro-Packages" accesskey="u" rel="up">Macro Packages</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="man-1">4.1 <samp class="file">man</samp></h3>
+<a class="index-entry-id" id="index-manual-pages"></a>
+<a class="index-entry-id" id="index-man-pages"></a>
+<a class="index-entry-id" id="index-an_002etmac"></a>
+<a class="index-entry-id" id="index-man_002etmac"></a>
+
+<p>The <code class="code">man</code> macro package is the most widely used and probably the
+most important ever developed for <code class="code">troff</code>. It is easy to use, and
+a vast majority of manual pages (&ldquo;man pages&rdquo;) are written in it.
+</p>
+<p><code class="code">groff</code>&rsquo;s implementation is documented in the
+<cite class="cite">groff_man<span class="r">(7)</span></cite> man page. Type &lsquo;<samp class="samp">man groff_man</samp>&rsquo; at the
+command line to view it.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="#Optional-man-extensions" accesskey="1">Optional <samp class="file">man</samp> extensions</a></li>
+</ul>
+<hr>
+<div class="subsection-level-extent" id="Optional-man-extensions">
+<div class="nav-panel">
+<p>
+Up: <a href="#man" accesskey="u" rel="up"><samp class="file">man</samp></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Optional-man-extensions-1">4.1.1 Optional <samp class="file">man</samp> extensions</h4>
+
+<a class="index-entry-id" id="index-man_002elocal"></a>
+<p>Use the file <samp class="file">man.local</samp> for local extensions to the <code class="code">man</code>
+macros or for style changes.
+</p>
+<ul class="mini-toc">
+<li><a href="#Custom-headers-and-footers" accesskey="1">Custom headers and footers</a></li>
+<li><a href="#Ultrix_002dspecific-man-macros" accesskey="2">Ultrix-specific man macros</a></li>
+<li><a href="#Simple-example" accesskey="3">Simple example</a></li>
+</ul>
+<div class="unnumberedsubsubsec-level-extent" id="Custom-headers-and-footers">
+<h4 class="unnumberedsubsubsec">Custom headers and footers</h4>
+<a class="index-entry-id" id="index-man-macros_002c-custom-headers-and-footers"></a>
+
+<p>In <code class="code">groff</code> versions 1.18.2 and later, you can specify custom
+headers and footers by redefining the following macros in
+<samp class="file">man.local</samp>.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002ePT"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.PT</code></strong><a class="copiable-link" href='#index-_002ePT'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PT-_005bman_005d"></a>
+<p>Control the content of the headers. Normally, the header prints the
+command name and section number on either side, and the optional fifth
+argument to <code class="code">TH</code> in the center.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eBT"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.BT</code></strong><a class="copiable-link" href='#index-_002eBT'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-BT-_005bman_005d"></a>
+<p>Control the content of the footers. Normally, the footer prints the
+page number and the third and fourth arguments to <code class="code">TH</code>.
+</p>
+<p>Use the <code class="code">FT</code> register to specify the footer position. The default
+is &minus;0.5<span class="dmn">i</span>.
+</p></dd></dl>
+
+</div>
+<div class="unnumberedsubsubsec-level-extent" id="Ultrix_002dspecific-man-macros">
+<h4 class="unnumberedsubsubsec">Ultrix-specific man macros</h4>
+<a class="index-entry-id" id="index-Ultrix_002dspecific-man-macros"></a>
+<a class="index-entry-id" id="index-man-macros_002c-Ultrix_002dspecific"></a>
+
+<a class="index-entry-id" id="index-man_002eultrix"></a>
+<p>The <code class="code">groff</code> source distribution includes a file named
+<samp class="file">man.ultrix</samp>, containing macros compatible with the Ultrix variant
+of <code class="code">man</code>. Copy this file into <samp class="file">man.local</samp> (or use the
+<code class="code">mso</code> request to load it) to enable the following macros.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eCT"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.CT</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">key</i></span></var><a class="copiable-link" href='#index-_002eCT'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-CT-_005bman_005d"></a>
+<p>Print &lsquo;<samp class="samp">&lt;CTRL/<var class="var">key</var>&gt;</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eCW"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.CW</code></strong><a class="copiable-link" href='#index-_002eCW'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-CW-_005bman_005d"></a>
+<p>Print subsequent text using a &ldquo;constant-width&rdquo; (monospaced) typeface
+(Courier roman).
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eDs"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.Ds</code></strong><a class="copiable-link" href='#index-_002eDs'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-Ds-_005bman_005d"></a>
+<p>Begin a non-filled display.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eDe"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.De</code></strong><a class="copiable-link" href='#index-_002eDe'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-De-_005bman_005d"></a>
+<p>End a non-filled display started with <code class="code">Ds</code>.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eEX"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.EX</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">indent</i></span>]</var><a class="copiable-link" href='#index-_002eEX'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-EX-_005bman_005d"></a>
+<p>Begin a non-filled display using a monospaced typeface (Courier roman).
+Use the optional <var class="var">indent</var> argument to indent the display.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eEE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.EE</code></strong><a class="copiable-link" href='#index-_002eEE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-EE-_005bman_005d"></a>
+<p>End a non-filled display started with <code class="code">EX</code>.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eG"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.G</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span>]</var><a class="copiable-link" href='#index-_002eG'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-G-_005bman_005d"></a>
+<p>Set <var class="var">text</var> in Helvetica. If no text is present on the line where
+the macro is called, then the text of the next line appears in
+Helvetica.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eGL"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.GL</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span>]</var><a class="copiable-link" href='#index-_002eGL'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-GL-_005bman_005d"></a>
+<p>Set <var class="var">text</var> in Helvetica oblique. If no text is present on the line
+where the macro is called, then the text of the next line appears in
+Helvetica Oblique.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eHB"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.HB</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span>]</var><a class="copiable-link" href='#index-_002eHB'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-HB-_005bman_005d"></a>
+<p>Set <var class="var">text</var> in Helvetica bold. If no text is present on the line
+where the macro is called, then all text up to the next <code class="code">HB</code>
+appears in Helvetica bold.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eTB"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.TB</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span>]</var><a class="copiable-link" href='#index-_002eTB'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-TB-_005bman_005d"></a>
+<p>Identical to <code class="code">HB</code>.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eMS"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.MS</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">title</i></span> <span class="r"><i class="slanted">sect</i></span> [<span class="r"><i class="slanted">punct</i></span>]</var><a class="copiable-link" href='#index-_002eMS'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MS-_005bman_005d"></a>
+<p>Set a man page reference in Ultrix format. The <var class="var">title</var> is in
+Courier instead of italic. Optional punctuation follows the section
+number without an intervening space.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eNT"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.NT</code></strong> <var class="def-var-arguments">[<code class="code">C</code>] [<span class="r"><i class="slanted">title</i></span>]</var><a class="copiable-link" href='#index-_002eNT'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-NT-_005bman_005d"></a>
+<p>Begin a note. Print the optional <span class="r"><i class="slanted">title</i></span>, or the word &ldquo;Note&rdquo;,
+centered on the page. Text following the macro makes up the body of the
+note, and is indented on both sides. If the first argument is <code class="code">C</code>,
+the body of the note is printed centered (the second argument replaces
+the word &ldquo;Note&rdquo; if specified).
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eNE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.NE</code></strong><a class="copiable-link" href='#index-_002eNE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-NE-_005bman_005d"></a>
+<p>End a note begun with <code class="code">NT</code>.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002ePN"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.PN</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">path</i></span> [<span class="r"><i class="slanted">punct</i></span>]</var><a class="copiable-link" href='#index-_002ePN'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PN-_005bman_005d"></a>
+<p>Set the path name in a monospaced typeface (Courier roman), followed by
+optional punctuation.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002ePn"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.Pn</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">punct</i></span>] <span class="r"><i class="slanted">path</i></span> [<span class="r"><i class="slanted">punct</i></span>]</var><a class="copiable-link" href='#index-_002ePn'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-Pn-_005bman_005d"></a>
+<p>If called with two arguments, identical to <code class="code">PN</code>. If called with
+three arguments, set the second argument in a monospaced typeface
+(Courier roman), bracketed by the first and third arguments in the
+current font.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eR"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.R</code></strong><a class="copiable-link" href='#index-_002eR'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-R-_005bman_005d"></a>
+<p>Switch to roman font and turn off any underlining in effect.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eRN"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.RN</code></strong><a class="copiable-link" href='#index-_002eRN'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-RN-_005bman_005d"></a>
+<p>Print the string &lsquo;<samp class="samp">&lt;RETURN&gt;</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eVS"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.VS</code></strong> <var class="def-var-arguments">[<code class="code">4</code>]</var><a class="copiable-link" href='#index-_002eVS'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-VS-_005bman_005d"></a>
+<p>Start printing a change bar in the margin if the number&nbsp;<code class="code">4</code> is
+specified. Otherwise, this macro does nothing.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eVE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.VE</code></strong><a class="copiable-link" href='#index-_002eVE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-VE-_005bman_005d"></a>
+<p>End printing the change bar begun by <code class="code">VS</code>.
+</p></dd></dl>
+
+</div>
+<div class="unnumberedsubsubsec-level-extent" id="Simple-example">
+<h4 class="unnumberedsubsubsec">Simple example</h4>
+
+<p>The following example <samp class="file">man.local</samp> file alters the <code class="code">SH</code> macro
+to add some extra vertical space before printing the heading. Headings
+are printed in Helvetica bold.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.\&quot; Make the heading fonts Helvetica
+.ds HF HB
+.
+.\&quot; Put more space in front of headings.
+.rn SH SH-orig
+.de SH
+. if t .sp (u;\\n[PD]*2)
+. SH-orig \\$*
+..
+</pre></div></div>
+
+
+
+<hr>
+</div>
+</div>
+</div>
+<div class="section-level-extent" id="mdoc">
+<div class="nav-panel">
+<p>
+Next: <a href="#me" accesskey="n" rel="next"><samp class="file">me</samp></a>, Previous: <a href="#man" accesskey="p" rel="prev"><samp class="file">man</samp></a>, Up: <a href="#Major-Macro-Packages" accesskey="u" rel="up">Macro Packages</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="mdoc-1">4.2 <samp class="file">mdoc</samp></h3>
+<a class="index-entry-id" id="index-mdoc-macros"></a>
+
+<p><code class="code">groff</code>&rsquo;s implementation of the BSD <samp class="file">doc</samp> package for man
+pages is documented in the <cite class="cite">groff_mdoc<span class="r">(7)</span></cite> man page. Type
+&lsquo;<samp class="samp">man groff_mdoc</samp>&rsquo; at the command line to view it.
+</p>
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="me">
+<div class="nav-panel">
+<p>
+Next: <a href="#mm" accesskey="n" rel="next"><samp class="file">mm</samp></a>, Previous: <a href="#mdoc" accesskey="p" rel="prev"><samp class="file">mdoc</samp></a>, Up: <a href="#Major-Macro-Packages" accesskey="u" rel="up">Macro Packages</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="me-1">4.3 <samp class="file">me</samp></h3>
+<a class="index-entry-id" id="index-me-macro-package"></a>
+
+<p><code class="code">groff</code>&rsquo;s implementation of the BSD <samp class="file">me</samp> macro package is
+documented using itself. A tutorial, <samp class="file">meintro.me</samp>, and reference,
+<samp class="file">meref.me</samp>, are available in <code class="code">groff</code>&rsquo;s documentation
+directory. A <cite class="cite">groff_me<span class="r">(7)</span></cite> man page is also available and
+identifies the installation path for these documents. Type &lsquo;<samp class="samp">man
+groff_me</samp>&rsquo; at the command line to view it.
+</p>
+<p>A French translation of the tutorial is available as
+<samp class="file">meintro_fr.me</samp> and installed parallel to the English version.
+</p>
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="mm">
+<div class="nav-panel">
+<p>
+Next: <a href="#mom" accesskey="n" rel="next"><samp class="file">mom</samp></a>, Previous: <a href="#me" accesskey="p" rel="prev"><samp class="file">me</samp></a>, Up: <a href="#Major-Macro-Packages" accesskey="u" rel="up">Macro Packages</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="mm-1">4.4 <samp class="file">mm</samp></h3>
+<a class="index-entry-id" id="index-mm-macro-package"></a>
+
+<p><code class="code">groff</code>&rsquo;s implementation of the <abbr class="acronym">AT&amp;T</abbr> memorandum macro
+package is documented in the <cite class="cite">groff_mm<span class="r">(7)</span></cite> man page. Type
+&lsquo;<samp class="samp">man groff_mm</samp>&rsquo; at the command line) to view it.
+</p>
+<p>A Swedish localization of <samp class="file">mm</samp> is also available; see
+<cite class="cite">groff_mmse<span class="r">(7)</span></cite>.
+</p>
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="mom">
+<div class="nav-panel">
+<p>
+Next: <a href="#ms" accesskey="n" rel="next"><samp class="file">ms</samp></a>, Previous: <a href="#mm" accesskey="p" rel="prev"><samp class="file">mm</samp></a>, Up: <a href="#Major-Macro-Packages" accesskey="u" rel="up">Macro Packages</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="mom-1">4.5 <samp class="file">mom</samp></h3>
+<a class="index-entry-id" id="index-mom-macro-package"></a>
+
+<p>The main documentation files for the <samp class="file">mom</samp> macros are in
+<abbr class="acronym">HTML</abbr> format. Additional, useful documentation is in
+<abbr class="acronym">PDF</abbr> format. See the <cite class="cite">groff<span class="r">(1)</span></cite> man page, section
+&ldquo;Installation Directories&rdquo;, for their location.
+</p>
+<ul class="itemize mark-bullet">
+<li><samp class="file">toc.html</samp>
+Entry point to the full mom manual.
+
+</li><li><samp class="file">macrolist.html</samp>
+Hyperlinked index of macros with brief descriptions, arranged by
+category.
+
+</li><li><samp class="file">mom-pdf.pdf</samp>
+<abbr class="acronym">PDF</abbr> features and usage.
+</li></ul>
+
+<p>The mom macros are in active development between <code class="code">groff</code> releases.
+The most recent version, along with up-to-date documentation, is
+available at <a class="uref" href="http://www.schaffter.ca/mom/mom-05.html">http://www.schaffter.ca/mom/mom-05.html</a>.
+</p>
+<p>The <cite class="cite">groff_mom<span class="r">(7)</span></cite> man page (type &lsquo;<samp class="samp">man groff_mom</samp>&rsquo; at
+the command line) contains a partial list of available macros, however
+their usage is best understood by consulting the <abbr class="acronym">HTML</abbr>
+documentation.
+</p>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="ms">
+<div class="nav-panel">
+<p>
+Previous: <a href="#mom" accesskey="p" rel="prev"><samp class="file">mom</samp></a>, Up: <a href="#Major-Macro-Packages" accesskey="u" rel="up">Macro Packages</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="ms-1">4.6 <samp class="file">ms</samp></h3>
+<a class="index-entry-id" id="index-ms-macros"></a>
+
+<p>The <samp class="file">ms</samp> (&ldquo;manuscript&rdquo;) package is suitable for the preparation
+of letters, memoranda, reports, and books. These <code class="code">groff</code>
+macros feature cover page and table of contents generation,
+automatically numbered headings, several paragraph styles, a variety of
+text styling options, footnotes, and multi-column page layouts.
+<samp class="file">ms</samp> supports the <code class="command">tbl</code>, <code class="command">eqn</code>, <code class="command">pic</code>, and
+<code class="command">refer</code> preprocessors for inclusion of tables, mathematical
+equations, diagrams, and standardized bibliographic citations. This
+implementation is mostly compatible with the documented interface and
+behavior of AT&amp;T Unix Version&nbsp;7 <samp class="file">ms</samp>. Many extensions from
+4.2BSD (Berkeley)
+and Tenth Edition Research Unix have been recreated.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="#ms-Introduction" accesskey="1">Introduction</a></li>
+<li><a href="#ms-Document-Structure" accesskey="2">Document Structure</a></li>
+<li><a href="#ms-Document-Control-Settings" accesskey="3">Document Control Settings</a></li>
+<li><a href="#ms-Document-Description-Macros" accesskey="4">Document Description Macros</a></li>
+<li><a href="#ms-Body-Text" accesskey="5">Body Text</a></li>
+<li><a href="#ms-Page-Layout" accesskey="6">Page layout</a></li>
+<li><a href="#Differences-from-AT_0026T-ms" accesskey="7">Differences from <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp></a></li>
+<li><a href="#ms-Legacy-Features" accesskey="8">Legacy Features</a></li>
+<li><a href="#ms-Naming-Conventions" accesskey="9">Naming Conventions</a></li>
+</ul>
+<hr>
+<div class="subsection-level-extent" id="ms-Introduction">
+<div class="nav-panel">
+<p>
+Next: <a href="#ms-Document-Structure" accesskey="n" rel="next">Document Structure</a>, Previous: <a href="#ms" accesskey="p" rel="prev"><samp class="file">ms</samp></a>, Up: <a href="#ms" accesskey="u" rel="up"><samp class="file">ms</samp></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Introduction-2">4.6.1 Introduction</h4>
+
+<p>The <samp class="file">ms</samp> macros are the oldest surviving package for <code class="code">roff</code>
+systems.<a class="footnote" id="DOCF7" href="#FOOT7"><sup>7</sup></a> While the <samp class="file">man</samp>
+package was designed for brief reference documents, the <samp class="file">ms</samp> macros
+are also suitable for longer works intended for printing and possible
+publication.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="#ms-basic-information" accesskey="1">Basic information</a></li>
+</ul>
+<hr>
+<div class="subsubsection-level-extent" id="ms-basic-information">
+<div class="nav-panel">
+<p>
+Next: <a href="#ms-Document-Structure" accesskey="n" rel="next">Document Structure</a>, Previous: <a href="#ms-Introduction" accesskey="p" rel="prev">Introduction</a>, Up: <a href="#ms-Introduction" accesskey="u" rel="up">Introduction</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Basic-information">4.6.1.1 Basic information</h4>
+
+<p><samp class="file">ms</samp> documents are plain text files; prepare them with your
+preferred text editor. If you&rsquo;re in a hurry to start, know that
+<samp class="file">ms</samp> needs one of its macros called at the beginning of a document
+so that it can initialize. A <em class="dfn">macro</em> is a formatting instruction to
+<samp class="file">ms</samp>. Put a macro call on a line by itself. Use &lsquo;<samp class="samp">.PP</samp>&rsquo; if you
+want your paragraph&rsquo;s first line to be indented, or &lsquo;<samp class="samp">.LP</samp>&rsquo; if you
+don&rsquo;t.
+</p>
+<p>After that, start typing normally. It is a good practice to start each
+sentence on a new line, or to put two spaces after sentence-ending
+punctuation, so that the formatter knows where the sentence boundaries
+are. You can separate paragraphs with further paragraphing macros, or
+with blank lines, and you can indent with tabs. When you need one of
+the features mentioned earlier (see <a class="pxref" href="#ms"><samp class="file">ms</samp></a>), return to this part of the
+manual.
+</p>
+<p>Format the document with the <code class="command">groff</code> command. <code class="command">nroff</code>
+can be useful for previewing.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">$ editor radical.ms
+$ nroff -ww -z -ms radical.ms # check for errors
+$ nroff -ms radical.ms | less -R
+$ groff -T ps -ms radical.ms &gt; radical.ps
+$ see radical.ps
+</pre></div>
+</td></tr></table>
+
+<p>Our <samp class="file">radical.ms</samp> document might look like this.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.LP
+Radical novelties are so disturbing that they tend to be
+suppressed or ignored, to the extent that even the
+possibility of their existence in general is more often
+denied than admitted.
+
+&rarr;That's what Dijkstra said, anyway.
+</pre></div>
+</td></tr></table>
+
+<p><samp class="file">ms</samp> exposes many aspects of document layout to user control via
+<code class="code">groff</code>&rsquo;s <em class="dfn">registers</em> and <em class="dfn">strings</em>, which store numbers
+and text, respectively. Measurements in <code class="code">groff</code> are expressed with
+a suffix called a <em class="dfn">scaling unit</em>.
+</p>
+<dl class="table">
+<dt><code class="code">i</code></dt>
+<dd><p>inches
+</p>
+</dd>
+<dt><code class="code">c</code></dt>
+<dd><p>centimeters
+</p>
+</dd>
+<dt><code class="code">p</code></dt>
+<dd><p>points (1/72 inch)
+</p>
+</dd>
+<dt><code class="code">P</code></dt>
+<dd><p>picas (1/6 inch)
+</p>
+</dd>
+<dt><code class="code">v</code></dt>
+<dd><p>vees; current vertical spacing
+</p>
+</dd>
+<dt><code class="code">m</code></dt>
+<dd><p>ems; width of an &ldquo;M&rdquo; in the current font
+</p>
+</dd>
+<dt><code class="code">n</code></dt>
+<dd><p>ens; one-half em
+</p></dd>
+</dl>
+
+<p>Set registers with the <code class="code">nr</code> request and strings with the <code class="code">ds</code>
+request. <em class="dfn">Requests</em> are like macro calls; they go on lines by
+themselves and start with the <em class="dfn">control character</em>, a dot (<code class="code">.</code>).
+The difference is that they directly instruct the formatter program,
+rather than the macro package. We&rsquo;ll discuss a few as applicable. It
+is wise to specify a scaling unit when setting any register that
+represents a length, size, or distance.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.nr PS 10.5p \&quot; Use 10.5-point type.
+.ds FAM P \&quot; Use Palatino font family.
+</pre></div>
+</td></tr></table>
+
+<p>In the foregoing, we see that <code class="code">\&quot;</code> begins a comment. This is an
+example of an <em class="dfn">escape sequence</em>, the other kind of formatting
+instruction. Escape sequences can appear anywhere. They begin with the
+escape character (<code class="code">\</code>) and are followed by at least one more
+character. <samp class="file">ms</samp> documents
+tend to use only a few of <code class="code">groff</code>&rsquo;s many requests and escape
+sequences; see <a class="ref" href="#Request-Index">Request Index</a> and <a class="ref" href="#Escape-Sequence-Index">Escape Sequence Index</a> or
+the <cite class="cite">groff<span class="r">(7)</span></cite> man page for complete lists.
+</p>
+<dl class="table">
+<dt><code class="code">\&quot;</code></dt>
+<dd><p>Begin comment; ignore remainder of line.
+</p>
+</dd>
+<dt><code class="code">\n[<var class="var">reg</var>]</code></dt>
+<dd><p>Interpolate value of register <var class="var">reg</var>.
+</p>
+</dd>
+<dt><code class="code">\*[<var class="var">str</var>]</code></dt>
+<dd><p>Interpolate contents of string <var class="var">str</var>.
+</p>
+</dd>
+<dt><code class="code">\*<var class="var">s</var></code></dt>
+<dd><p>abbreviation of <code class="code">\*[<var class="var">s</var>]</code>; the name <var class="var">s</var> must be only one
+character
+</p>
+</dd>
+<dt><code class="code">\[<var class="var">char</var>]</code></dt>
+<dd><p>Interpolate glyph of special character named <var class="var">char</var>.
+</p>
+</dd>
+<dt><code class="code">\&amp;</code></dt>
+<dd><p>dummy character
+</p>
+</dd>
+<dt><code class="code">\~</code></dt>
+<dd><p>Insert an unbreakable space that is adjustable like a normal space.
+</p>
+</dd>
+<dt><code class="code">\|</code></dt>
+<dd><p>Move horizontally by one-sixth em (&ldquo;thin space&rdquo;).
+</p></dd>
+</dl>
+
+<p>Prefix any words that start with a dot &lsquo;<samp class="samp">.</samp>&rsquo; or neutral apostrophe
+&lsquo;<samp class="samp">'</samp>&rsquo; with <code class="code">\&amp;</code> if they are at the beginning of an input line
+(or might become that way in editing) to prevent them from being
+interpreted as macro calls or requests. Suffix &lsquo;<samp class="samp">.</samp>&rsquo;, &lsquo;<samp class="samp">?</samp>&rsquo;, and
+&lsquo;<samp class="samp">!</samp>&rsquo; with <code class="code">\&amp;</code> when needed to cancel end-of-sentence detection.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">My exposure was \&amp;.5 to \&amp;.6 Sv of neutrons, said Dr.\&amp;
+Wallace after the criticality incident.
+</pre></div>
+</td></tr></table>
+
+
+<hr>
+</div>
+</div>
+<div class="subsection-level-extent" id="ms-Document-Structure">
+<div class="nav-panel">
+<p>
+Next: <a href="#ms-Document-Control-Settings" accesskey="n" rel="next">Document Control Settings</a>, Previous: <a href="#ms-Introduction" accesskey="p" rel="prev">Introduction</a>, Up: <a href="#ms" accesskey="u" rel="up"><samp class="file">ms</samp></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Document-Structure">4.6.2 Document Structure</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-general-structure"></a>
+
+<p>The <samp class="file">ms</samp> macro package expects a certain amount of structure:
+a well-formed document contains at least one paragraphing or heading
+macro call. Longer documents have a structure as follows.
+</p>
+<dl class="table">
+<dt><strong class="strong">Document type</strong></dt>
+<dd><p>Calling the <code class="code">RP</code> macro at the beginning of your document puts the
+document description (see below) on a cover page. Otherwise, <samp class="file">ms</samp>
+places the information (if any) on the first page, followed immediately
+by the body text. Some document types found in other <samp class="file">ms</samp>
+implementations are specific to <abbr class="acronym">AT&amp;T</abbr> or Berkeley, and are not
+supported by <code class="code">groff</code> <samp class="file">ms</samp>.
+</p>
+</dd>
+<dt><strong class="strong">Format and layout</strong></dt>
+<dd><p>By setting registers and strings, you can configure your document&rsquo;s
+typeface, margins, spacing, headers and footers, and footnote
+arrangement. See <a class="xref" href="#ms-Document-Control-Settings">Document Control Settings</a>.
+</p>
+</dd>
+<dt><strong class="strong">Document description</strong></dt>
+<dd><p>A document description consists of any of: a title, one or more authors&rsquo;
+names and affiliated institutions, an abstract, and a date or other
+identifier. See <a class="xref" href="#ms-Document-Description-Macros">Document Description Macros</a>.
+</p>
+</dd>
+<dt><strong class="strong">Body text</strong></dt>
+<dd><p>The main matter of your document follows its description (if any).
+<samp class="file">ms</samp> supports highly structured text consisting of paragraphs
+interspersed with multi-level headings (chapters, sections, subsections,
+and so forth) and augmented by lists, footnotes, tables, diagrams, and
+similar material. See <a class="xref" href="#ms-Body-Text">Body Text</a>.
+</p>
+</dd>
+<dt><strong class="strong">Tables of contents</strong></dt>
+<dd><p>Macros enable the collection of entries for a table of contents (or
+index) as the material they discuss appears in the document. You then
+call a macro to emit the table of contents at the end of your document.
+The table of contents must necessarily follow the rest of the text since
+GNU <code class="code">troff</code> is a single-pass formatter; it thus cannot determine
+the page number of a division of the text until it has been set and
+output. Since <samp class="file">ms</samp> was designed for the production of hard copy,
+the traditional procedure was to manually relocate the pages containing
+the table of contents between the cover page and the body text. Today,
+page resequencing is more often done in the digital domain. An index
+works similarly, but because it typically needs to be sorted after
+collection, its preparation requires separate processing.
+</p></dd>
+</dl>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="ms-Document-Control-Settings">
+<div class="nav-panel">
+<p>
+Next: <a href="#ms-Document-Description-Macros" accesskey="n" rel="next">Document Description Macros</a>, Previous: <a href="#ms-Document-Structure" accesskey="p" rel="prev">Document Structure</a>, Up: <a href="#ms" accesskey="u" rel="up"><samp class="file">ms</samp></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Document-Control-Settings">4.6.3 Document Control Settings</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-document-control-settings"></a>
+
+<p><samp class="file">ms</samp> exposes many aspects of document layout to user control via
+<code class="code">groff</code> requests. To use them, you must understand how to define
+registers and strings.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enr"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nr</code></strong> <var class="def-var-arguments">reg value</var><a class="copiable-link" href='#index-_002enr'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nr"></a>
+<p>Set register <var class="var">reg</var> to <var class="var">value</var>. If <var class="var">reg</var> doesn&rsquo;t exist, GNU
+<code class="code">troff</code> creates it.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eds"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ds</code></strong> <var class="def-var-arguments">name contents</var><a class="copiable-link" href='#index-_002eds'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ds"></a>
+<p>Set string <var class="var">name</var> to <var class="var">contents</var>.
+</p></dd></dl>
+
+<p>A list of document control registers and strings follows. For any
+parameter whose default is unsatisfactory, define its register or string
+before calling any <samp class="file">ms</samp> macro other than <code class="code">RP</code>.
+</p>
+<ul class="mini-toc">
+<li><a href="#Margin-settings" accesskey="1">Margin settings</a></li>
+<li><a href="#Titles-_0028headers_002c-footers_0029" accesskey="2">Titles (headers, footers)</a></li>
+<li><a href="#Text-settings" accesskey="3">Text settings</a></li>
+<li><a href="#Paragraph-settings" accesskey="4">Paragraph settings</a></li>
+<li><a href="#Heading-settings" accesskey="5">Heading settings</a></li>
+<li><a href="#Footnote-settings" accesskey="6">Footnote settings</a></li>
+<li><a href="#Display-settings" accesskey="7">Display settings</a></li>
+<li><a href="#Other-settings" accesskey="8">Other settings</a></li>
+</ul>
+<div class="unnumberedsubsubsec-level-extent" id="Margin-settings">
+<h4 class="unnumberedsubsubsec">Margin settings</h4>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bPO_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[PO]</code></strong><a class="copiable-link" href='#index-_005cn_005bPO_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PO-_005bms_005d"></a>
+<p>Defines the page offset (i.e., the left margin).
+</p>
+<p>Effective: next page.
+</p>
+<p>Default: Varies by output device and paper format; 1<span class="dmn">i</span> is used for
+typesetters using U.S. letter paper, and zero for terminals.
+See <a class="xref" href="#Paper-Format">Paper Format</a>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bLL_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[LL]</code></strong><a class="copiable-link" href='#index-_005cn_005bLL_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-LL-_005bms_005d"></a>
+<p>Defines the line length (i.e., the width of the body text).
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: Varies by output device and paper format; 6.5<span class="dmn">i</span> is used
+for typesetters using U.S. letter paper (see <a class="pxref" href="#Paper-Format">Paper Format</a>) and
+65<span class="dmn">n</span> on terminals.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bLT_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[LT]</code></strong><a class="copiable-link" href='#index-_005cn_005bLT_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-LT-_005bms_005d"></a>
+<p>Defines the title line length (i.e., the header and footer width). This
+is usually the same as <code class="code">LL</code>, but need not be.
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: Varies by output device and paper format; 6.5<span class="dmn">i</span> is used
+for typesetters using U.S. letter paper (see <a class="pxref" href="#Paper-Format">Paper Format</a>) and
+65<span class="dmn">n</span> on terminals.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bHM_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[HM]</code></strong><a class="copiable-link" href='#index-_005cn_005bHM_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-HM-_005bms_005d"></a>
+<p>Defines the header margin height at the top of the page.
+</p>
+<p>Effective: next page.
+</p>
+<p>Default: 1<span class="dmn">i</span>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bFM_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[FM]</code></strong><a class="copiable-link" href='#index-_005cn_005bFM_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-FM-_005bms_005d"></a>
+<p>Defines the footer margin height at the bottom of the page.
+</p>
+<p>Effective: next page.
+</p>
+<p>Default: 1<span class="dmn">i</span>.
+</p></dd></dl>
+
+</div>
+<div class="unnumberedsubsubsec-level-extent" id="Titles-_0028headers_002c-footers_0029">
+<h4 class="unnumberedsubsubsec">Titles (headers, footers)</h4>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bLH_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[LH]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bLH_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-LH-_005bms_005d"></a>
+<p>Defines the text displayed in the left header position.
+</p>
+<p>Effective: next header.
+</p>
+<p>Default: empty.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bCH_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[CH]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bCH_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-CH-_005bms_005d"></a>
+<p>Defines the text displayed in the center header position.
+</p>
+<p>Effective: next header.
+</p>
+<p>Default: &lsquo;<samp class="samp">-\n[%]-</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bRH_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[RH]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bRH_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-RH-_005bms_005d"></a>
+<p>Defines the text displayed in the right header position.
+</p>
+<p>Effective: next header.
+</p>
+<p>Default: empty.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bLF_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[LF]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bLF_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-LF-_005bms_005d"></a>
+<p>Defines the text displayed in the left footer position.
+</p>
+<p>Effective: next footer.
+</p>
+<p>Default: empty.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bCF_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[CF]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bCF_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-CF-_005bms_005d"></a>
+<p>Defines the text displayed in the center footer position.
+</p>
+<p>Effective: next footer.
+</p>
+<p>Default: empty.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bRF_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[RF]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bRF_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-RF-_005bms_005d"></a>
+<p>Defines the text displayed in the right footer position.
+</p>
+<p>Effective: next footer.
+</p>
+<p>Default: empty.
+</p></dd></dl>
+
+</div>
+<div class="unnumberedsubsubsec-level-extent" id="Text-settings">
+<h4 class="unnumberedsubsubsec">Text settings</h4>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bPS_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[PS]</code></strong><a class="copiable-link" href='#index-_005cn_005bPS_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PS-_005bms_005d-1"></a>
+<p>Defines the type size of the body text.
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: 10<span class="dmn">p</span>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bVS_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[VS]</code></strong><a class="copiable-link" href='#index-_005cn_005bVS_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-VS-_005bms_005d"></a>
+<p>Defines the vertical spacing (type size plus leading).
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: 12<span class="dmn">p</span>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bHY_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[HY]</code></strong><a class="copiable-link" href='#index-_005cn_005bHY_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-HY-_005bms_005d"></a>
+<p>Defines the automatic hyphenation mode used with the <code class="code">hy</code> request.
+Setting <code class="code">HY</code> to&nbsp;0 is equivalent to using the <code class="code">nh</code>
+request. This is a Tenth Edition Research Unix extension.
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: 6.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bFAM_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[FAM]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bFAM_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-FAM-_005bms_005d"></a>
+<p>Defines the font family used to typeset the document. This is a GNU
+extension.
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: defined by the output device; often &lsquo;<samp class="samp">T</samp>&rsquo; (see <a class="pxref" href="#ms-Body-Text">Body Text</a>)
+</p></dd></dl>
+
+</div>
+<div class="unnumberedsubsubsec-level-extent" id="Paragraph-settings">
+<h4 class="unnumberedsubsubsec">Paragraph settings</h4>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bPI_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[PI]</code></strong><a class="copiable-link" href='#index-_005cn_005bPI_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PI-_005bms_005d"></a>
+<p>Defines the indentation amount used by the <code class="code">PP</code>, <code class="code">IP</code> (unless
+overridden by an optional argument), <code class="code">XP</code>, and <code class="code">RS</code> macros.
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: 5<span class="dmn">n</span>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bPD_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[PD]</code></strong><a class="copiable-link" href='#index-_005cn_005bPD_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PD-_005bms_005d"></a>
+<p>Defines the space between paragraphs.
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: 0.3<span class="dmn">v</span> (1<span class="dmn">v</span> on low-resolution devices).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bQI_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[QI]</code></strong><a class="copiable-link" href='#index-_005cn_005bQI_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-QI-_005bms_005d"></a>
+<p>Defines the indentation amount used on both sides of a paragraph set
+with the <code class="code">QP</code> or between the <code class="code">QS</code> and <code class="code">QE</code> macros.
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: 5<span class="dmn">n</span>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bPORPHANS_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[PORPHANS]</code></strong><a class="copiable-link" href='#index-_005cn_005bPORPHANS_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PORPHANS-_005bms_005d"></a>
+<p>Defines the minimum number of initial lines of any paragraph that must
+be kept together to avoid isolated lines at the bottom of a page. If a
+new paragraph is started close to the bottom of a page, and there is
+insufficient space to accommodate <code class="code">PORPHANS</code> lines before an
+automatic page break, then a page break is forced before the start of
+the paragraph. This is a GNU extension.
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: 1.
+</p></dd></dl>
+
+</div>
+<div class="unnumberedsubsubsec-level-extent" id="Heading-settings">
+<h4 class="unnumberedsubsubsec">Heading settings</h4>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bPSINCR_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[PSINCR]</code></strong><a class="copiable-link" href='#index-_005cn_005bPSINCR_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PSINCR-_005bms_005d"></a>
+<p>Defines an increment in type size to be applied to a heading at a
+lesser depth than that specified in <code class="code">GROWPS</code>. The value of
+<code class="code">PSINCR</code> should be specified in points with the <span class="dmn">p</span> scaling
+unit and may include a fractional component; for example, &lsquo;<samp class="samp">.nr&nbsp;PSINCR&nbsp;1.5p</samp>&rsquo;<!-- /@w --> sets a type size increment of 1.5<span class="dmn">p</span>. This is a GNU
+extension.
+</p>
+<p>Effective: next heading.
+</p>
+<p>Default: 1<span class="dmn">p</span>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bGROWPS_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[GROWPS]</code></strong><a class="copiable-link" href='#index-_005cn_005bGROWPS_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-GROWPS-_005bms_005d"></a>
+<p>Defines the heading depth above which the type size increment set by
+<code class="code">PSINCR</code> becomes effective. For each heading depth less than the
+value of <code class="code">GROWPS</code>, the type size is increased by <code class="code">PSINCR</code>.
+Setting <code class="code">GROWPS</code> to any value less than&nbsp;2 disables the
+incremental heading size feature. This is a GNU extension.
+</p>
+<p>Effective: next heading.
+</p>
+<p>Default: 0.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bHORPHANS_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[HORPHANS]</code></strong><a class="copiable-link" href='#index-_005cn_005bHORPHANS_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-HORPHANS-_005bms_005d"></a>
+<p>Defines the minimum number of lines of an immediately succeeding
+paragraph that should be kept together with any heading introduced by
+the <code class="code">NH</code> or <code class="code">SH</code> macros. If a heading is placed close to the
+bottom of a page, and there is insufficient space to accommodate both
+the heading and at least <code class="code">HORPHANS</code> lines of the following
+paragraph, before an automatic page break, then the page break is forced
+before the heading. This is a GNU extension.
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: 1.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bSN_002dSTYLE_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[SN-STYLE]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bSN_002dSTYLE_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-SN_002dSTYLE-_005bms_005d"></a>
+<p>Defines the style used to print numbered headings. See <a class="xref" href="#Headings-in-ms">Headings</a>. This is a GNU extension.
+</p>
+<p>Effective: next heading.
+</p>
+<p>Default: alias of <code class="code">SN-DOT</code>
+</p></dd></dl>
+
+</div>
+<div class="unnumberedsubsubsec-level-extent" id="Footnote-settings">
+<h4 class="unnumberedsubsubsec">Footnote settings</h4>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bFI_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[FI]</code></strong><a class="copiable-link" href='#index-_005cn_005bFI_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-FI-_005bms_005d"></a>
+<p>Defines the footnote indentation. This is a Berkeley extension.
+</p>
+<p>Effective: next footnote.
+</p>
+<p>Default: 2<span class="dmn">n</span>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bFF_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[FF]</code></strong><a class="copiable-link" href='#index-_005cn_005bFF_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-FF-_005bms_005d"></a>
+<p>Defines the format of automatically numbered footnotes,
+and those for which the <code class="code">FS</code> request is given a marker argument, at
+the bottom of a column or page. This is a Berkeley extension.
+</p><dl class="table">
+<dt><code class="code">0</code></dt>
+<dd><p>Set an automatic number<a class="footnote" id="DOCF8" href="#FOOT8"><sup>8</sup></a> as a
+superscript (on typesetter devices) or surrounded by square brackets (on
+terminals). The footnote paragraph is indented as with <code class="code">PP</code> if
+there is an <code class="code">FS</code> argument or an automatic number, and as with
+<code class="code">LP</code> otherwise. This is the default.
+</p>
+</dd>
+<dt><code class="code">1</code></dt>
+<dd><p>As <code class="code">0</code>, but set the marker as regular text and follow an
+automatic number with a period.
+</p>
+</dd>
+<dt><code class="code">2</code></dt>
+<dd><p>As <code class="code">1</code>, but without indentation (like <code class="code">LP</code>).
+</p>
+</dd>
+<dt><code class="code">3</code></dt>
+<dd><p>As <code class="code">1</code>, but set the footnote paragraph with the marker hanging
+(like <code class="code">IP</code>).
+</p></dd>
+</dl>
+
+<p>Effective: next footnote.
+</p>
+<p>Default: 0.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bFPS_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[FPS]</code></strong><a class="copiable-link" href='#index-_005cn_005bFPS_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-FPS-_005bms_005d"></a>
+<p>Defines the footnote type size.
+</p>
+<p>Effective: next footnote.
+</p>
+<p>Default: <code class="code">\n[PS] - 2p</code>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bFVS_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[FVS]</code></strong><a class="copiable-link" href='#index-_005cn_005bFVS_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-FVS-_005bms_005d"></a>
+<p>Defines the footnote vertical spacing.
+</p>
+<p>Effective: next footnote.
+</p>
+<p>Default: <code class="code">\n[FPS] + 2p</code>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bFPD_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[FPD]</code></strong><a class="copiable-link" href='#index-_005cn_005bFPD_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-FPD-_005bms_005d"></a>
+<p>Defines the footnote paragraph spacing. This is a GNU extension.
+</p>
+<p>Effective: next footnote.
+</p>
+<p>Default: <code class="code">\n[PD] / 2</code>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bFR_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[FR]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bFR_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-FR-_005bms_005d"></a>
+<p>Defines the ratio of the footnote line length to the current line
+length. This is a GNU extension.
+</p>
+<p>Effective: next footnote in single-column arrangements, next page
+otherwise.
+</p>
+<p>Default: <code class="code">11/12</code>.
+</p></dd></dl>
+
+</div>
+<div class="unnumberedsubsubsec-level-extent" id="Display-settings">
+<h4 class="unnumberedsubsubsec">Display settings</h4>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bDD_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[DD]</code></strong><a class="copiable-link" href='#index-_005cn_005bDD_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-DD-_005bms_005d"></a>
+<p>Sets the display distance&mdash;the vertical spacing before and after a
+display, a <code class="code">tbl</code> table, an <code class="code">eqn</code> equation, or a <code class="code">pic</code>
+image. This is a Berkeley extension.
+</p>
+<p>Effective: next display boundary.
+</p>
+<p>Default: 0.5<span class="dmn">v</span> (1<span class="dmn">v</span> on low-resolution devices).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bDI_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[DI]</code></strong><a class="copiable-link" href='#index-_005cn_005bDI_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-DI-_005bms_005d"></a>
+<p>Sets the default amount by which to indent a display started with
+<code class="code">DS</code> and <code class="code">ID</code> without arguments, to &lsquo;<samp class="samp">.DS&nbsp;I</samp>&rsquo; without
+an indentation argument, and to equations set with &lsquo;<samp class="samp">.EQ&nbsp;I</samp>&rsquo;.
+This is a GNU extension.
+</p>
+<p>Effective: next indented display.
+</p>
+<p>Default: 0.5<span class="dmn">i</span>.
+</p></dd></dl>
+
+</div>
+<div class="unnumberedsubsubsec-level-extent" id="Other-settings">
+<h4 class="unnumberedsubsubsec">Other settings</h4>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bMINGW_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[MINGW]</code></strong><a class="copiable-link" href='#index-_005cn_005bMINGW_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MINGW-_005bms_005d"></a>
+<p>Defines the default minimum width between columns in a multi-column
+document. This is a GNU extension.
+</p>
+<p>Effective: next page.
+</p>
+<p>Default: 2<span class="dmn">n</span>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bTC_002dMARGIN_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[TC-MARGIN]</code></strong><a class="copiable-link" href='#index-_005cn_005bTC_002dMARGIN_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-TC_002dMARGIN-_005bms_005d"></a>
+<p>Defines the width of the field in which page numbers are set in a table
+of contents entry; the right margin thus moves inboard by this amount.
+This is a GNU extension.
+</p>
+<p>Effective: next <code class="code">PX</code> call.
+</p>
+<p>Default: <code class="code">\w'000'</code>
+</p></dd></dl>
+
+
+
+<hr>
+</div>
+</div>
+<div class="subsection-level-extent" id="ms-Document-Description-Macros">
+<div class="nav-panel">
+<p>
+Next: <a href="#ms-Body-Text" accesskey="n" rel="next">Body Text</a>, Previous: <a href="#ms-Document-Control-Settings" accesskey="p" rel="prev">Document Control Settings</a>, Up: <a href="#ms" accesskey="u" rel="up"><samp class="file">ms</samp></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Document-Description-Macros">4.6.4 Document Description Macros</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-document-description"></a>
+<a class="index-entry-id" id="index-document-description-macros_002c-_005bms_005d"></a>
+
+<p>Only the simplest document lacks a title.<a class="footnote" id="DOCF9" href="#FOOT9"><sup>9</sup></a> As its level of sophistication (or
+complexity) increases, it tends to acquire a date of revision,
+explicitly identified authors, sponsoring institutions for authors, and,
+at the rarefied heights, an abstract of its content. Define these
+data by calling the macros below in the order shown; <code class="code">DA</code> or
+<code class="code">ND</code> can be called to set the document date (or other identifier)
+at any time before (a) the abstract, if present, or (b) its information
+is required in a header or footer. Use of these macros is optional,
+except that <code class="code">TL</code> is mandatory if any of <code class="code">RP</code>, <code class="code">AU</code>,
+<code class="code">AI</code>, or <code class="code">AB</code> is called, and <code class="code">AE</code> is mandatory if
+<code class="code">AB</code> is called.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eRP"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.RP</code></strong> <var class="def-var-arguments">[<code class="code">no-repeat-info</code>] [<code class="code">no-renumber</code>]</var><a class="copiable-link" href='#index-_002eRP'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-RP-_005bms_005d"></a>
+<p>Use the &ldquo;report&rdquo; (<abbr class="acronym">AT&amp;T</abbr>: &ldquo;released paper&rdquo;) format for your
+document, creating a separate cover page. The default arrangement is to
+place most of the document description (title, author names and
+institutions, and abstract, but not the date) at the top of the first
+page. If the optional <code class="code">no-repeat-info</code> argument is given,
+<samp class="file">ms</samp> produces a cover page but does not repeat any of its
+information subsequently (but see the <code class="code">DA</code> macro below regarding
+the date). Normally, <code class="code">RP</code> sets the page number following the cover
+page to&nbsp;1. Specifying the optional <code class="code">no-renumber</code> argument
+suppresses this alteration. Optional arguments can occur in any order.
+<code class="code">no</code> is recognized as a synonym of <code class="code">no-repeat-info</code> for
+<code class="code">AT&amp;T</code> compatibility.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eTL"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.TL</code></strong><a class="copiable-link" href='#index-_002eTL'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-TL-_005bms_005d"></a>
+<p>Specify the document title. <samp class="file">ms</samp> collects text on input lines
+following this call into the title until reaching <code class="code">AU</code>, <code class="code">AB</code>,
+or a heading or paragraphing macro call.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eAU"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.AU</code></strong><a class="copiable-link" href='#index-_002eAU'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-AU-_005bms_005d"></a>
+<p>Specify an author&rsquo;s name. <samp class="file">ms</samp> collects text on input lines
+following this call into the author&rsquo;s name until reaching <code class="code">AI</code>,
+<code class="code">AB</code>, another <code class="code">AU</code>, or a heading or paragraphing macro call.
+Call it repeatedly to specify multiple authors.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eAI"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.AI</code></strong><a class="copiable-link" href='#index-_002eAI'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-AI-_005bms_005d"></a>
+<p>Specify the preceding author&rsquo;s institution. An <code class="code">AU</code> call is
+usefully followed by at most one <code class="code">AI</code> call; if there are more, the
+last <code class="code">AI</code> call controls. <samp class="file">ms</samp> collects text on input lines
+following this call into the author&rsquo;s institution until reaching
+<code class="code">AU</code>, <code class="code">AB</code>, or a heading or paragraphing macro call.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eDA"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.DA</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">x</i></span> &hellip;]</var><a class="copiable-link" href='#index-_002eDA'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-DA-_005bms_005d"></a>
+<p>Typeset the current date, or any arguments <var class="var">x</var>, in the center
+footer, and, if <code class="code">RP</code> is also called, left-aligned at the end of the
+description information on the cover page.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eND"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.ND</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">x</i></span> &hellip;]</var><a class="copiable-link" href='#index-_002eND'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ND-_005bms_005d"></a>
+<p>Typeset the current date, or any arguments <var class="var">x</var>, if <code class="code">RP</code> is also
+called, left-aligned at the end of the document description on the cover
+page. This is <code class="code">groff</code> <samp class="file">ms</samp>&rsquo;s default.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eAB"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.AB</code></strong> <var class="def-var-arguments">[<code class="code">no</code>]</var><a class="copiable-link" href='#index-_002eAB'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-AB-_005bms_005d"></a>
+<p>Begin the abstract. <samp class="file">ms</samp> collects text on input lines following
+this call into the abstract until reaching an <code class="code">AE</code> call. By
+default, <samp class="file">ms</samp> places the word &ldquo;ABSTRACT&rdquo; centered and in italics
+above the text of the abstract. The optional argument <code class="code">no</code>
+suppresses this heading.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eAE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.AE</code></strong><a class="copiable-link" href='#index-_002eAE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-AE-_005bms_005d"></a>
+<p>End the abstract.
+</p></dd></dl>
+
+<p>An example document description, using a cover page, follows.
+<a class="index-entry-id" id="index-cover-page-in-_005bms_005d_002c-example-markup"></a>
+<a class="index-entry-id" id="index-example-markup_002c-cover-page-in-_005bms_005d"></a>
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.RP
+.TL
+The Inevitability of Code Bloat
+in Commercial and Free Software
+.AU
+J.\&amp; Random Luser
+.AI
+University of West Bumblefuzz
+.AB
+This report examines the long-term growth of the code
+bases in two large,
+popular software packages;
+the free Emacs and the commercial Microsoft Word.
+While differences appear in the type or order of
+features added,
+due to the different methodologies used,
+the results are the same in the end.
+.PP
+The free software approach is shown to be superior in
+that while free software can become as bloated as
+commercial offerings,
+free software tends to have fewer serious bugs and the
+added features are more in line with user demand.
+.AE
+
+<span class="r">&hellip;the rest of the paper&hellip;</span>
+</pre></div>
+</td></tr></table>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="ms-Body-Text">
+<div class="nav-panel">
+<p>
+Next: <a href="#ms-Page-Layout" accesskey="n" rel="next">Page layout</a>, Previous: <a href="#ms-Document-Description-Macros" accesskey="p" rel="prev">Document Description Macros</a>, Up: <a href="#ms" accesskey="u" rel="up"><samp class="file">ms</samp></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Body-Text">4.6.5 Body Text</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-body-text"></a>
+
+<p>A variety of macros, registers, and strings can be used to structure and
+style the body of your document. They organize your text into
+paragraphs, headings, footnotes, and inclusions of material such as
+tables and figures.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="#Text-settings-in-ms" accesskey="1">Text settings</a></li>
+<li><a href="#Typographical-symbols-in-ms" accesskey="2">Typographical symbols</a></li>
+<li><a href="#Paragraphs-in-ms" accesskey="3">Paragraphs</a></li>
+<li><a href="#Headings-in-ms" accesskey="4">Headings</a></li>
+<li><a href="#Typeface-and-decoration" accesskey="5">Typeface and decoration</a></li>
+<li><a href="#Lists-in-ms" accesskey="6">Lists</a></li>
+<li><a href="#Indented-regions-in-ms" accesskey="7">Indented regions</a></li>
+<li><a href="#ms-keeps-and-displays" accesskey="8">Keeps, boxed keeps, and displays</a></li>
+<li><a href="#ms-Insertions" accesskey="9">Tables, figures, equations, and references</a></li>
+<li><a href="#ms-Footnotes">Footnotes</a></li>
+<li><a href="#ms-language-and-localization">Language and localization</a></li>
+</ul>
+<hr>
+<div class="subsubsection-level-extent" id="Text-settings-in-ms">
+<div class="nav-panel">
+<p>
+Next: <a href="#Typographical-symbols-in-ms" accesskey="n" rel="next">Typographical symbols</a>, Previous: <a href="#ms-Body-Text" accesskey="p" rel="prev">Body Text</a>, Up: <a href="#ms-Body-Text" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Text-settings-1">4.6.5.1 Text settings</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-text-settings"></a>
+
+<p>The <code class="code">FAM</code> string, a GNU extension, sets the font family for body
+text; the default is &lsquo;<samp class="samp">T</samp>&rsquo;. The <code class="code">PS</code> and <code class="code">VS</code> registers
+set the type size and vertical spacing (distance between text
+baselines), respectively. The font family and type size are ignored on
+terminal devices. Setting these parameters before the first call of a
+heading, paragraphing, or (non-date) document description macro also
+applies them to headers, footers, and (for <code class="code">FAM</code>) footnotes.
+</p>
+<p>Which font families are available depends on the output device; as a
+convention, <code class="code">T</code> selects a serif family (&ldquo;Times&rdquo;), <code class="code">H</code> a
+sans-serif family (&ldquo;Helvetica&rdquo;), and <code class="code">C</code> a monospaced family
+(&ldquo;Courier&rdquo;). The man page for the output driver documents its font
+repertoire. Consult the <cite class="cite">groff<span class="r">(1)</span></cite> man page for lists of
+available output devices and their drivers.
+</p>
+<p>The hyphenation mode (as used by the <code class="code">hy</code> request) is set from the
+<code class="code">HY</code> register. Setting <code class="code">HY</code> to &lsquo;<samp class="samp">0</samp>&rsquo; is equivalent to
+using the <code class="code">nh</code> request. This is a Tenth Edition Research Unix
+extension.
+</p>
+
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="Typographical-symbols-in-ms">
+<div class="nav-panel">
+<p>
+Next: <a href="#Paragraphs-in-ms" accesskey="n" rel="next">Paragraphs</a>, Previous: <a href="#Text-settings-in-ms" accesskey="p" rel="prev">Text settings</a>, Up: <a href="#ms-Body-Text" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Typographical-symbols">4.6.5.2 Typographical symbols</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-obtaining-typographical-symbols"></a>
+
+<p><samp class="file">ms</samp> provides a few strings to obtain typographical symbols not
+easily entered with the keyboard. These and many others are available
+as special character escape sequences&mdash;see the <cite class="cite">groff_char<span class="r">(7)</span></cite>
+man page.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_002d_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[-]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_002d_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002d-_005bms_005d"></a>
+<p>Interpolate an em dash.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bQ_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[Q]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bQ_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-Q-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bU_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[U]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bU_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-U-_005bms_005d"></a>
+<p>Interpolate typographer&rsquo;s quotation marks where available, and neutral
+double quotes otherwise. <code class="code">\*Q</code> is the left quote and <code class="code">\*U</code>
+the right.
+</p></dd></dl>
+
+
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="Paragraphs-in-ms">
+<div class="nav-panel">
+<p>
+Next: <a href="#Headings-in-ms" accesskey="n" rel="next">Headings</a>, Previous: <a href="#Typographical-symbols-in-ms" accesskey="p" rel="prev">Typographical symbols</a>, Up: <a href="#ms-Body-Text" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Paragraphs-2">4.6.5.3 Paragraphs</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-paragraph-handling"></a>
+
+<p>Paragraphing macros <em class="dfn">break</em>, or terminate, any pending output line
+so that a new paragraph can begin. Several paragraph types are
+available, differing in how indentation applies to them: to left, right,
+or both margins; to the first output line of the paragraph, all output
+lines, or all but the first. All paragraphing macro calls cause the
+insertion of vertical space in the amount stored in the <code class="code">PD</code>
+register, except at page or column breaks. Alternatively, a blank input
+line breaks the output line and vertically spaces by one vee.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eLP"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.LP</code></strong><a class="copiable-link" href='#index-_002eLP'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-LP-_005bms_005d"></a>
+<p>Set a paragraph without any (additional) indentation.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002ePP"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.PP</code></strong><a class="copiable-link" href='#index-_002ePP'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PP-_005bms_005d"></a>
+<p>Set a paragraph with a first-line left indentation in the amount stored
+in the <code class="code">PI</code> register.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eIP"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.IP</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">marker</i></span> [<span class="r"><i class="slanted">width</i></span>]]</var><a class="copiable-link" href='#index-_002eIP'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-IP-_005bms_005d"></a>
+<p>Set a paragraph with a left indentation. The optional <var class="var">marker</var> is
+not indented and is empty by default. It has several applications;
+see <a class="ref" href="#Lists-in-ms">Lists</a>. <var class="var">width</var> overrides the indentation amount
+stored in the <code class="code">PI</code> register; its default unit is &lsquo;<samp class="samp">n</samp>&rsquo;. Once
+specified, <var class="var">width</var> applies to further <code class="code">IP</code> calls until
+specified again or a heading or different paragraphing macro is called.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eQP"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.QP</code></strong><a class="copiable-link" href='#index-_002eQP'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-QP-_005bms_005d"></a>
+<p>Set a paragraph indented from both left and right margins by the amount
+stored in the <code class="code">QI</code> register.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eQS"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.QS</code></strong><a class="copiable-link" href='#index-_002eQS'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-QS-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eQE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.QE</code></strong><a class="copiable-link" href='#index-_002eQE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-QE-_005bms_005d"></a>
+<p>Begin (<code class="code">QS</code>) and end (<code class="code">QE</code>) a region where each paragraph is
+indented from both margins by the amount stored in the <code class="code">QI</code>
+register. The text between <code class="code">QS</code> and <code class="code">QE</code> can be structured
+further by use of other paragraphing macros.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eXP"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.XP</code></strong><a class="copiable-link" href='#index-_002eXP'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-XP-_005bms_005d"></a>
+<p>Set an &ldquo;exdented&rdquo; paragraph&mdash;one with a left indentation in the
+amount stored in the <code class="code">PI</code> register on every line <em class="emph">except</em> the
+first (also known as a hanging indent). This is a Berkeley extension.
+</p></dd></dl>
+
+<p>The following example illustrates the use of paragraphing macros.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.NH 2
+Cases used in the 2001 study
+.LP
+Two software releases were considered for this report.
+.PP
+The first is commercial software;
+the second is free.
+.IP \[bu]
+Microsoft Word for Windows,
+starting with version 1.0 through the current version
+(Word 2000).
+.IP \[bu]
+GNU Emacs,
+from its first appearance as a standalone editor through
+the current version (v20).
+See [Bloggs 2002] for details.
+.QP
+Franklin's Law applied to software:
+software expands to outgrow both RAM and disk space over
+time.
+.SH
+Bibliography
+.XP
+Bloggs, Joseph R.,
+.I &quot;Everyone's a Critic&quot; ,
+Underground Press, March 2002.
+A definitive work that answers all questions and
+criticisms about the quality and usability of free
+software.
+</pre></div>
+</td></tr></table>
+
+
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="Headings-in-ms">
+<div class="nav-panel">
+<p>
+Next: <a href="#Typeface-and-decoration" accesskey="n" rel="next">Typeface and decoration</a>, Previous: <a href="#Paragraphs-in-ms" accesskey="p" rel="prev">Paragraphs</a>, Up: <a href="#ms-Body-Text" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Headings">4.6.5.4 Headings</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-headings"></a>
+
+<p>Use headings to create a sequential or hierarchical structure for your
+document. The <samp class="file">ms</samp> macros print headings in <strong class="strong">bold</strong> using
+the same font family and, by default, type size as the body text.
+Headings are available with and without automatic numbering. Text on
+input lines following the macro call becomes the heading&rsquo;s title. Call
+a paragraphing macro to end the heading text and start the section&rsquo;s
+content.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eNH"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.NH</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">depth</i></span>]</var><a class="copiable-link" href='#index-_002eNH'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-NH-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eNH-1"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.NH</code></strong> <var class="def-var-arguments"><code class="t">S</code> <span class="r"><i class="slanted">heading-depth-index</i></span> &hellip;</var><a class="copiable-link" href='#index-_002eNH-1'> &para;</a></span></dt>
+<dd><p>Set an automatically numbered heading.
+</p>
+<p><samp class="file">ms</samp> produces a numbered heading the form <var class="var">a.b.c&hellip;</var>, to
+any depth desired, with the numbering of each depth increasing
+automatically and being reset to zero when a more significant level is
+increased. &ldquo;1&rdquo;&nbsp;is the most significant or coarsest division of
+the document. Only non-zero values are output. If <var class="var">depth</var> is
+omitted, it is taken to be &lsquo;<samp class="samp">1</samp>&rsquo;.
+</p>
+<p>If you specify <var class="var">depth</var> such that an ascending gap occurs relative to
+the previous <code class="code">NH</code> call&mdash;that is, you &ldquo;skip a depth&rdquo;, as by
+&lsquo;<samp class="samp">.NH 1</samp>&rsquo; and then &lsquo;<samp class="samp">.NH 3</samp>&rsquo;&mdash;<code class="code">groff</code> <samp class="file">ms</samp> emits a
+warning on the standard error stream.
+</p>
+<p>Alternatively, you can give <code class="code">NH</code> a first argument of&nbsp;<code class="code">S</code>,
+followed by integers to number the heading depths explicitly. Further
+automatic numbering, if used, resumes using the specified indices as
+their predecessors.
+This feature is a Berkeley extension.
+</p></dd></dl>
+
+<p>An example may be illustrative.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.NH 1
+Animalia
+.NH 2
+Arthropoda
+.NH 3
+Crustacea
+.NH 2
+Chordata
+.NH S 6 6 6
+Daimonia
+.NH 1
+Plantae
+</pre></div>
+</td></tr></table>
+
+<p>The above results in numbering as follows; the vertical space that
+normally precedes each heading is omitted.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">1. Animalia
+1.1. Arthropoda
+1.1.1. Crustacea
+1.2. Chordata
+6.6.6. Daimonia
+7. Plantae
+</pre></div></div>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bSN_002dSTYLE_005d-1"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[SN-STYLE]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bSN_002dSTYLE_005d-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-SN_002dSTYLE-_005bms_005d-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bSN_002dDOT_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[SN-DOT]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bSN_002dDOT_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-SN_002dDOT-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bSN_002dNO_002dDOT_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[SN-NO-DOT]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bSN_002dNO_002dDOT_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-SN_002dNO_002dDOT-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bSN_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[SN]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bSN_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-SN-_005bms_005d"></a>
+<p>After <code class="code">NH</code> is called, the assigned number is made available in the
+strings <code class="code">SN-DOT</code> (as it appears in a printed heading with default
+formatting, followed by a terminating period) and <code class="code">SN-NO-DOT</code> (with
+the terminating period omitted). These are GNU extensions.
+</p>
+<p>You can control the style used to print numbered headings by defining an
+appropriate alias for the string <code class="code">SN-STYLE</code>. By default,
+<code class="code">SN-STYLE</code> is aliased to <code class="code">SN-DOT</code>. If you prefer to omit the
+terminating period from numbers appearing in numbered headings, you may
+define the alias as follows.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.als SN-STYLE SN-NO-DOT
+</pre></div></div>
+
+<p>Any such change in numbering style becomes effective from the next use
+of <code class="code">NH</code> following redefinition of the alias for <code class="code">SN-STYLE</code>.
+The formatted number of the current heading is available in the
+<code class="code">SN</code> string (a feature first documented by Berkeley), which
+facilitates its inclusion in, for example, table captions, equation
+labels, and <code class="code">XS</code>/<code class="code">XA</code>/<code class="code">XE</code> table of contents entries.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eSH"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.SH</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">depth</i></span>]</var><a class="copiable-link" href='#index-_002eSH'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-SH-_005bms_005d"></a>
+<p>Set an unnumbered heading.
+</p>
+<p>The optional <var class="var">depth</var> argument is a GNU extension indicating the
+heading depth corresponding to the <var class="var">depth</var> argument of <code class="code">NH</code>.
+It matches the type size at which the heading is set to that of a
+numbered heading at the same depth when the <code class="code">GROWPS</code> and
+<code class="code">PSINCR</code> heading size adjustment mechanism is in effect.
+</p></dd></dl>
+
+<p>If the <code class="code">GROWPS</code> register is set to a value greater than the
+<var class="var">level</var> argument to <code class="code">NH</code> or <code class="code">SH</code>, the type size of a
+heading produced by these macros increases by <code class="code">PSINCR</code> units over
+the size specified by <code class="code">PS</code> multiplied by the difference of
+<code class="code">GROWPS</code> and <var class="var">level</var>. The value stored in <code class="code">PSINCR</code> is
+interpreted in <code class="code">groff</code> basic units; the <code class="code">p</code> scaling unit
+should be employed when assigning a value specified in points. For
+example, the sequence
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.nr PS 10
+.nr GROWPS 3
+.nr PSINCR 1.5p
+.NH 1
+Carnivora
+.NH 2
+Felinae
+.NH 3
+Felis catus
+.SH 2
+Machairodontinae
+</pre></div>
+</td></tr></table>
+
+<p>will cause &ldquo;1. Carnivora&rdquo; to be printed in 13-point text, followed by
+&ldquo;1.1. Felinae&rdquo; in 11.5-point text, while &ldquo;1.1.1. Felis catus&rdquo; and
+all more deeply nested heading levels will remain in the 10-point text
+specified by the <code class="code">PS</code> register. &ldquo;Machairodontinae&rdquo; is printed at
+11.5 points, since it corresponds to heading level&nbsp;2.
+</p>
+<p>The <code class="code">HORPHANS</code> register operates in conjunction with the <code class="code">NH</code>
+and <code class="code">SH</code> macros to inhibit the printing of isolated headings at the
+bottom of a page; it specifies the minimum number of lines of an
+immediately subsequent paragraph that must be kept on the same page as
+the heading. If insufficient space remains on the current page to
+accommodate the heading and this number of lines of paragraph text, a
+page break is forced before the heading is printed. Any display macro
+call or <code class="code">tbl</code>, <code class="code">pic</code>, or <code class="code">eqn</code> region between the heading
+and the subsequent paragraph suppresses this grouping. See <a class="xref" href="#ms-keeps-and-displays">Keeps, boxed keeps, and displays</a> and <a class="ref" href="#ms-Insertions">Tables, figures, equations, and references</a>.
+</p>
+
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="Typeface-and-decoration">
+<div class="nav-panel">
+<p>
+Next: <a href="#Lists-in-ms" accesskey="n" rel="next">Lists</a>, Previous: <a href="#Headings-in-ms" accesskey="p" rel="prev">Headings</a>, Up: <a href="#ms-Body-Text" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Typeface-and-decoration-1">4.6.5.5 Typeface and decoration</h4>
+
+<p>The <samp class="file">ms</samp> macros provide a variety of ways to style text.
+Attend closely to the ordering of arguments labeled <var class="var">pre</var> and
+<var class="var">post</var>, which is not intuitive. Support for <var class="var">pre</var>
+arguments is a GNU extension.<a class="footnote" id="DOCF10" href="#FOOT10"><sup>10</sup></a>
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eB"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.B</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span> [<span class="r"><i class="slanted">post</i></span> [<span class="r"><i class="slanted">pre</i></span>]]]</var><a class="copiable-link" href='#index-_002eB'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-B-_005bms_005d"></a>
+<p>Style <var class="var">text</var> in <b class="b">bold</b>, followed by <var class="var">post</var> in the previous
+font style without intervening space, and preceded by <var class="var">pre</var>
+similarly. Without arguments, <samp class="file">ms</samp> styles subsequent text in bold
+until the next paragraphing, heading, or no-argument typeface macro
+call.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eR-1"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.R</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span> [<span class="r"><i class="slanted">post</i></span> [<span class="r"><i class="slanted">pre</i></span>]]]</var><a class="copiable-link" href='#index-_002eR-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-R-_005bms_005d"></a>
+<p>As <code class="code">B</code>, but use the roman style (upright text of normal weight)
+instead of bold. Argument recognition is a GNU extension.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eI"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.I</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span> [<span class="r"><i class="slanted">post</i></span> [<span class="r"><i class="slanted">pre</i></span>]]]</var><a class="copiable-link" href='#index-_002eI'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-I-_005bms_005d"></a>
+<p>As <code class="code">B</code>, but use an <i class="i">italic</i> or oblique style instead of bold.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eBI"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.BI</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span> [<span class="r"><i class="slanted">post</i></span> [<span class="r"><i class="slanted">pre</i></span>]]]</var><a class="copiable-link" href='#index-_002eBI'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-BI-_005bms_005d"></a>
+<p>As <code class="code">B</code>, but use a bold italic or bold oblique style instead of
+upright bold. This is a Tenth Edition Research Unix extension.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eCW-1"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.CW</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span> [<span class="r"><i class="slanted">post</i></span> [<span class="r"><i class="slanted">pre</i></span>]]]</var><a class="copiable-link" href='#index-_002eCW-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-CW-_005bms_005d"></a>
+<p>As <code class="code">B</code>, but use a <code class="t">constant-width</code> (monospaced) roman typeface
+instead of bold. This is a Tenth Edition Research Unix extension.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eBX"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.BX</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span>]</var><a class="copiable-link" href='#index-_002eBX'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-BX-_005bms_005d"></a>
+<p>Typeset <var class="var">text</var> and draw a box around it. On terminal devices,
+reverse video is used instead. If you want <var class="var">text</var> to contain space,
+use unbreakable space or horizontal motion escape sequences (<code class="code">\~</code>,
+<code class="code">\<kbd class="key">SP</kbd></code>, <code class="code">\^</code>, <code class="code">\|</code>, <code class="code">\0</code> or <code class="code">\h</code>).
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eUL"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.UL</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span> [<span class="r"><i class="slanted">post</i></span>]]</var><a class="copiable-link" href='#index-_002eUL'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-UL-_005bms_005d"></a>
+<p>Typeset <var class="var">text</var> with an underline. <var class="var">post</var>, if present, is set
+after <var class="var">text</var> with no intervening space.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eLG"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.LG</code></strong><a class="copiable-link" href='#index-_002eLG'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-LG-_005bms_005d"></a>
+<p>Set subsequent text in larger type (two points larger than the
+current size) until the next type size, paragraphing, or heading macro
+call. You can specify this macro multiple times to enlarge the type
+size as needed.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eSM"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.SM</code></strong><a class="copiable-link" href='#index-_002eSM'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-SM-_005bms_005d"></a>
+<p>Set subsequent text in smaller type (two points smaller than the current
+size) until the next type size, paragraphing, or heading macro call.
+You can specify this macro multiple times to reduce the type size as
+needed.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eNL"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.NL</code></strong><a class="copiable-link" href='#index-_002eNL'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-NL-_005bms_005d"></a>
+<p>Set subsequent text at the normal type size (the amount in the <code class="code">PS</code>
+register).
+</p></dd></dl>
+
+<p><var class="var">pre</var> and <var class="var">post</var> arguments are typically used to simplify the
+attachment of punctuation to styled words. When <var class="var">pre</var> is used,
+a hyphenation control escape sequence <code class="code">\%</code> that would ordinarily
+start <var class="var">text</var> must start <var class="var">pre</var> instead to have the desired
+effect.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">The CS course's students found one C language keyword
+.CW static ) \%(
+most troublesome.
+</pre></div>
+</td></tr></table>
+
+<p>The foregoing example produces output as follows.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted"><span class="r">The CS course&rsquo;s students found one C language keyword (<code class="t">static</code>)
+most troublesome.</span>
+</pre></div>
+</td></tr></table>
+
+<p>You can use the output line continuation escape sequence <code class="code">\c</code> to
+achieve the same result (see <a class="pxref" href="#Line-Continuation">Line Continuation</a>). It is also
+portable to older <samp class="file">ms</samp> implementations.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">The CS course's students found one C language keyword
+\%(\c
+.CW \%static )
+most troublesome.
+</pre></div>
+</td></tr></table>
+
+<p><code class="code">groff</code> <samp class="file">ms</samp> also offers strings to begin and end super- and
+subscripting. These are GNU extensions.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_007b_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[{]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_007b_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_007b-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005b_007d_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[}]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_007d_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_007d-_005bms_005d"></a>
+<p>Begin and end superscripting, respectively.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_003c_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[&lt;]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_003c_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_003c-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005b_003e_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[&gt;]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_003e_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_003e-_005bms_005d"></a>
+<p>Begin and end subscripting, respectively.
+</p></dd></dl>
+
+<p>Rather than calling the <code class="code">CW</code> macro, in <code class="code">groff</code> <samp class="file">ms</samp> you
+might prefer to change the font family to Courier by setting the
+<code class="code">FAM</code> string to &lsquo;<samp class="samp">C</samp>&rsquo;. You can then use all four style macros
+above, returning to the default family (Times) with &lsquo;<samp class="samp">.ds FAM T</samp>&rsquo;.
+Because changes to <code class="code">FAM</code> take effect only at the next paragraph,
+<code class="code">CW</code> remains useful to &ldquo;inline&rdquo; a change to the font family,
+similarly to the practice of this document in noting syntactical
+elements of <samp class="file">ms</samp> and <code class="code">groff</code>.
+</p>
+
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="Lists-in-ms">
+<div class="nav-panel">
+<p>
+Next: <a href="#Indented-regions-in-ms" accesskey="n" rel="next">Indented regions</a>, Previous: <a href="#Typeface-and-decoration" accesskey="p" rel="prev">Typeface and decoration</a>, Up: <a href="#ms-Body-Text" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Lists">4.6.5.6 Lists</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-lists"></a>
+
+<p>The <var class="var">marker</var> argument to the <code class="code">IP</code> macro can be employed to
+present a variety of lists; for instance, you can use a bullet glyph
+(<code class="code">\[bu]</code>) for unordered lists, a number (or auto-incrementing
+register) for numbered lists, or a word or phrase for glossary-style or
+definition lists. If you set the paragraph indentation register
+<code class="code">PI</code> before calling <code class="code">IP</code>, you can later reorder the items in
+the list without having to ensure that a <var class="var">width</var> argument remains
+affixed to the first call.
+</p>
+<p>The following is an example of a bulleted list.
+<a class="index-entry-id" id="index-example-markup_002c-bulleted-list-_005bms_005d"></a>
+<a class="index-entry-id" id="index-bulleted-list_002c-example-markup-_005bms_005d"></a>
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.nr PI 2n
+A bulleted list:
+.IP \[bu]
+lawyers
+.IP \[bu]
+guns
+.IP \[bu]
+money
+</pre></div>
+</td></tr></table>
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">A bulleted list:
+
+&bull; lawyers
+
+&bull; guns
+
+&bull; money
+</pre></div></div>
+
+<p>The following is an example of a numbered list.
+<a class="index-entry-id" id="index-example-markup_002c-numbered-list-_005bms_005d"></a>
+<a class="index-entry-id" id="index-numbered-list_002c-example-markup-_005bms_005d"></a>
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.nr step 0 1
+.nr PI 3n
+A numbered list:
+.IP \n+[step]
+lawyers
+.IP \n+[step]
+guns
+.IP \n+[step]
+money
+</pre></div>
+</td></tr></table>
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">A numbered list:
+
+1. lawyers
+
+2. guns
+
+3. money
+</pre></div></div>
+
+<p>Here we have employed the <code class="code">nr</code> request to create a register of our
+own, &lsquo;<samp class="samp">step</samp>&rsquo;. We initialized it to zero and assigned it an
+auto-increment of 1. Each time we use the escape sequence
+&lsquo;<samp class="samp">\n+[PI]</samp>&rsquo; (note the plus sign), the formatter applies the increment
+just before interpolating the register&rsquo;s value. Preparing the <code class="code">PI</code>
+register as well enables us to rearrange the list without the tedium of
+updating macro calls.
+</p>
+<p>The next example illustrates a glossary-style list.
+<a class="index-entry-id" id="index-example-markup_002c-glossary_002dstyle-list-_005bms_005d"></a>
+<a class="index-entry-id" id="index-glossary_002dstyle-list_002c-example-markup-_005bms_005d"></a>
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">A glossary-style list:
+.IP lawyers 0.4i
+Two or more attorneys.
+.IP guns
+Firearms,
+preferably large-caliber.
+.IP money
+Gotta pay for those
+lawyers and guns!
+</pre></div>
+</td></tr></table>
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">A glossary-style list:
+
+lawyers
+ Two or more attorneys.
+
+guns Firearms, preferably large-caliber.
+
+money
+ Gotta pay for those lawyers and guns!
+</pre></div></div>
+
+<p>In the previous example, observe how the <code class="code">IP</code> macro places the
+definition on the same line as the term if it has enough space. If this
+is not what you want, there are a few workarounds we will illustrate by
+modifying the example. First, you can use a <code class="code">br</code> request to force
+a break after printing the term or label.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.IP guns
+.br
+Firearms,
+</pre></div>
+</td></tr></table>
+
+<p>Second, you could apply the <code class="code">\p</code> escape sequence to force a break.
+The space following the escape sequence is important; if you omit it,
+<code class="code">groff</code> prints the first word of the paragraph text on the same
+line as the term or label (if it fits) <em class="emph">then</em> breaks the line.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.IP guns
+\p Firearms,
+</pre></div>
+</td></tr></table>
+
+<p>Finally, you may append a horizontal motion to the marker with the
+<code class="code">\h</code> escape sequence; using the same amount as the indentation will
+ensure that the marker is too wide for <code class="code">groff</code> to treat it as
+&ldquo;fitting&rdquo; on the same line as the paragraph text.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.IP guns\h'0.4i'
+Firearms,
+</pre></div>
+</td></tr></table>
+
+<p>In each case, the result is the same.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">A glossary-style list:
+
+lawyers
+ Two or more attorneys.
+
+guns
+ Firearms, preferably large-caliber.
+
+money
+ Gotta pay for those lawyers and guns!
+</pre></div></div>
+
+
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="Indented-regions-in-ms">
+<div class="nav-panel">
+<p>
+Next: <a href="#ms-keeps-and-displays" accesskey="n" rel="next">Keeps, boxed keeps, and displays</a>, Previous: <a href="#Lists-in-ms" accesskey="p" rel="prev">Lists</a>, Up: <a href="#ms-Body-Text" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Indented-regions">4.6.5.7 Indented regions</h4>
+
+<p>You may need to indent a region of text while otherwise formatting it
+normally. Indented regions can be nested; you can change <code class="code">\n[PI]</code>
+before each call to vary the amount of inset.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eRS"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.RS</code></strong><a class="copiable-link" href='#index-_002eRS'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-RS-_005bms_005d"></a>
+<p>Begin a region where headings, paragraphs, and displays are indented
+(further) by the amount stored in the <code class="code">PI</code> register.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eRE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.RE</code></strong><a class="copiable-link" href='#index-_002eRE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-RE-_005bms_005d"></a>
+<p>End the (next) most recent indented region.
+</p></dd></dl>
+
+<p>This feature enables you to easily line up text under hanging and
+indented paragraphs.
+<a class="index-entry-id" id="index-ms-macros_002c-nested-lists"></a>
+<a class="index-entry-id" id="index-nested-lists-_005bms_005d"></a>
+For example, you may wish to structure lists hierarchically.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.IP \[bu] 2
+Lawyers:
+.RS
+.IP \[bu]
+Dewey,
+.IP \[bu]
+Cheatham,
+and
+.IP \[bu]
+and Howe.
+.RE
+.IP \[bu]
+Guns
+</pre></div>
+</td></tr></table>
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">&bull; Lawyers:
+
+ &bull; Dewey,
+
+ &bull; Cheatham, and
+
+ &bull; Howe.
+
+&bull; Guns
+</pre></div></div>
+
+
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="ms-keeps-and-displays">
+<div class="nav-panel">
+<p>
+Next: <a href="#ms-Insertions" accesskey="n" rel="next">Tables, figures, equations, and references</a>, Previous: <a href="#Indented-regions-in-ms" accesskey="p" rel="prev">Indented regions</a>, Up: <a href="#ms-Body-Text" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Keeps_002c-boxed-keeps_002c-and-displays">4.6.5.8 Keeps, boxed keeps, and displays</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-displays"></a>
+<a class="index-entry-id" id="index-ms-macros_002c-keeps"></a>
+<a class="index-entry-id" id="index-keeps-_005bms_005d"></a>
+
+<p>On occasion, you may want to <em class="dfn">keep</em> several lines of text, or a
+region of a document, together on a single page, preventing an automatic
+page break within certain boundaries. This can cause a page break to
+occur earlier than it normally would. For example, you may want to keep
+two paragraphs together, or a paragraph that refers to a table, list, or
+figure adjacent to the item it discusses. <samp class="file">ms</samp> provides the
+<code class="code">KS</code> and <code class="code">KE</code> macros for this purpose.
+</p>
+<p>You can alternatively specify a <em class="dfn">floating keep</em>: if a keep cannot
+fit on the current page, <samp class="file">ms</samp> holds its contents and
+allows material following the keep (in the source document) to fill the
+remainder of the current page. When the page breaks, whether by
+reaching the end or <code class="code">bp</code> request, <samp class="file">ms</samp> puts the floating keep
+at the beginning of the next page. This is useful for placing large
+graphics or tables that do not need to appear exactly where they occur
+in the source document.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eKS"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.KS</code></strong><a class="copiable-link" href='#index-_002eKS'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-KS-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eKF"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.KF</code></strong><a class="copiable-link" href='#index-_002eKF'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-KF-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eKE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.KE</code></strong><a class="copiable-link" href='#index-_002eKE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-KE-_005bms_005d"></a>
+<p><code class="code">KS</code> begins a keep, <code class="code">KF</code> a floating keep, and <code class="code">KE</code> ends a
+keep of either kind.
+</p></dd></dl>
+
+<p>As an alternative to the keep mechanism, the <code class="code">ne</code> request forces a
+page break if there is not at least the amount of vertical space
+specified in its argument remaining on the page (see <a class="pxref" href="#Page-Control">Page Control</a>).
+One application of <code class="code">ne</code> is to reserve space on the page for a
+figure or illustration to be included later.
+</p>
+<a class="index-entry-id" id="index-boxes-_005bms_005d"></a>
+<p>A <em class="dfn">boxed keep</em> has a frame drawn around it.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eB1"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.B1</code></strong><a class="copiable-link" href='#index-_002eB1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-B1-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eB2"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.B2</code></strong><a class="copiable-link" href='#index-_002eB2'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-B2-_005bms_005d"></a>
+<p><code class="code">B1</code> begins a keep with a box drawn around it. <code class="code">B2</code> ends a
+boxed keep.
+</p></dd></dl>
+
+<p>Boxed keep macros cause breaks; if you need to box a word or phrase
+within a line, see the <code class="code">BX</code> macro in <a class="ref" href="#Typeface-and-decoration">Typeface and decoration</a>.
+Box lines are drawn as close as possible to the text they enclose so
+that they are usable within paragraphs. If you wish to box one or more
+paragraphs, you may improve the appearance by calling <code class="code">B1</code> after
+the first paragraphing macro, and by adding a small amount of vertical
+space before calling <code class="code">B2</code>.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.LP
+.B1
+.I Warning:
+Happy Fun Ball may suddenly accelerate to dangerous
+speeds.
+.sp \n[PD]/2 \&quot; space by half the inter-paragraph distance
+.B2
+</pre></div>
+</td></tr></table>
+
+<p>If you want a boxed keep to float, you will need to enclose the
+<code class="code">B1</code> and <code class="code">B2</code> calls within a pair of <code class="code">KF</code> and <code class="code">KE</code>
+calls.
+</p>
+<a class="index-entry-id" id="index-displays-_005bms_005d"></a>
+<p><em class="dfn">Displays</em> turn off filling; lines of verse or program code are
+shown with their lines broken as in the source document without
+requiring <code class="code">br</code> requests between lines. Displays can be kept on a
+single page or allowed to break across pages. The <code class="code">DS</code> macro
+begins a kept display of the layout specified in its first argument;
+non-kept displays are begun with dedicated macros corresponding to their
+layout.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eDS"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.DS</code></strong> <var class="def-var-arguments"><code class="t">L</code></var><a class="copiable-link" href='#index-_002eDS'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-DS-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eLD"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.LD</code></strong><a class="copiable-link" href='#index-_002eLD'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-LD-_005bms_005d"></a>
+<p>Begin (<code class="code">DS</code>: kept) left-aligned display.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eDS-1"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.DS</code></strong> <var class="def-var-arguments">[<code class="t">I</code> [<span class="r"><i class="slanted">indent</i></span>]]</var><a class="copiable-link" href='#index-_002eDS-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-DS-_005bms_005d-1"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eID"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.ID</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">indent</i></span>]</var><a class="copiable-link" href='#index-_002eID'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ID-_005bms_005d"></a>
+<p>Begin (<code class="code">DS</code>: kept) display indented by <var class="var">indent</var> if specified,
+and by the amount of the <code class="code">DI</code> register otherwise.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eDS-2"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.DS</code></strong> <var class="def-var-arguments"><code class="t">B</code></var><a class="copiable-link" href='#index-_002eDS-2'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-DS-_005bms_005d-2"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eBD"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.BD</code></strong><a class="copiable-link" href='#index-_002eBD'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-BD-_005bms_005d"></a>
+<p>Begin a (<code class="code">DS</code>: kept) a block display: the entire display is
+left-aligned, but indented such that the longest line in the display
+is centered on the page.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eDS-3"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.DS</code></strong> <var class="def-var-arguments"><code class="t">C</code></var><a class="copiable-link" href='#index-_002eDS-3'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-DS-_005bms_005d-3"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eCD"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.CD</code></strong><a class="copiable-link" href='#index-_002eCD'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-CD-_005bms_005d"></a>
+<p>Begin a (<code class="code">DS</code>: kept) centered display: each line in the display
+is centered.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eDS-4"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.DS</code></strong> <var class="def-var-arguments"><code class="t">R</code></var><a class="copiable-link" href='#index-_002eDS-4'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-DS-_005bms_005d-4"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eRD"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.RD</code></strong><a class="copiable-link" href='#index-_002eRD'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-RD-_005bms_005d"></a>
+<p>Begin a (<code class="code">DS</code>: kept) right-aligned display. This is a GNU
+extension.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eDE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.DE</code></strong><a class="copiable-link" href='#index-_002eDE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-DE-_005bms_005d"></a>
+<p>End any display.
+</p></dd></dl>
+
+<p>The distance stored in the <code class="code">DD</code> register is inserted before and
+after each pair of display macros; this is a Berkeley extension. In
+<code class="code">groff</code> <samp class="file">ms</samp>, this distance replaces any adjacent
+inter-paragraph distance or subsequent spacing prior to a section
+heading. The <code class="code">DI</code> register is a GNU extension; its value is an
+indentation applied to displays created with &lsquo;<samp class="samp">.DS</samp>&rsquo; and &lsquo;<samp class="samp">.ID</samp>&rsquo;
+without arguments, to &lsquo;<samp class="samp">.DS I</samp>&rsquo; without an indentation argument, and
+to indented equations set with &lsquo;<samp class="samp">.EQ</samp>&rsquo;. Changes to either register
+take effect at the next display boundary.
+</p>
+
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="ms-Insertions">
+<div class="nav-panel">
+<p>
+Next: <a href="#ms-Footnotes" accesskey="n" rel="next">Footnotes</a>, Previous: <a href="#ms-keeps-and-displays" accesskey="p" rel="prev">Keeps, boxed keeps, and displays</a>, Up: <a href="#ms-Body-Text" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Tables_002c-figures_002c-equations_002c-and-references">4.6.5.9 Tables, figures, equations, and references</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-tables"></a>
+<a class="index-entry-id" id="index-ms-macros_002c-figures"></a>
+<a class="index-entry-id" id="index-ms-macros_002c-equations"></a>
+<a class="index-entry-id" id="index-ms-macros_002c-references"></a>
+<a class="index-entry-id" id="index-tables-_005bms_005d"></a>
+<a class="index-entry-id" id="index-figures-_005bms_005d"></a>
+<a class="index-entry-id" id="index-equations-_005bms_005d"></a>
+<a class="index-entry-id" id="index-references-_005bms_005d"></a>
+
+<p>The <samp class="file">ms</samp> package is often used with the <code class="code">tbl</code>, <code class="code">pic</code>,
+<code class="code">eqn</code>, and <code class="code">refer</code> preprocessors.
+<a class="index-entry-id" id="index-tbl"></a>
+<a class="index-entry-id" id="index-pic"></a>
+<a class="index-entry-id" id="index-eqn"></a>
+<a class="index-entry-id" id="index-refer"></a>
+Mark text meant for preprocessors by enclosing it in pairs of tokens
+as follows, with nothing between the dot and the macro name. The
+preprocessors match these tokens only at the start of an input line.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eTS"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.TS</code></strong> <var class="def-var-arguments">[<code class="code">H</code>]</var><a class="copiable-link" href='#index-_002eTS'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-TS-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eTE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.TE</code></strong><a class="copiable-link" href='#index-_002eTE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-TE-_005bms_005d"></a>
+<p>Demarcate a table to be processed by the <code class="code">tbl</code> preprocessor. The
+optional argument&nbsp;<code class="code">H</code> to <code class="code">TS</code> instructs <samp class="file">ms</samp> to
+repeat table rows (often column headings) at the top of each new page
+the table spans, if applicable; calling the <code class="code">TH</code> macro marks the
+end of such rows. The GNU <cite class="cite">tbl<span class="r">(1)</span></cite> man page provides a
+comprehensive reference to the preprocessor and offers examples of its
+use.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002ePS"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.PS</code></strong><a class="copiable-link" href='#index-_002ePS'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PS-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002ePE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.PE</code></strong><a class="copiable-link" href='#index-_002ePE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PE-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002ePF"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.PF</code></strong><a class="copiable-link" href='#index-_002ePF'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PF-_005bms_005d"></a>
+<p><code class="code">PS</code> begins a picture to be processed by the <code class="command">gpic</code>
+preprocessor; either of <code class="code">PE</code> or <code class="code">PF</code> ends it, the latter with
+&ldquo;flyback&rdquo; to the vertical position at its top. You can create
+<code class="code">pic</code> input manually or with a program such as <code class="code">xfig</code>.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eEQ"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.EQ</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">align</i></span> [<span class="r"><i class="slanted">label</i></span>]]</var><a class="copiable-link" href='#index-_002eEQ'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-EQ-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eEN"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.EN</code></strong><a class="copiable-link" href='#index-_002eEN'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-EN-_005bms_005d"></a>
+<p>Demarcate an equation to be processed by the <code class="code">eqn</code> preprocessor.
+The equation is centered by default; <var class="var">align</var> can be &lsquo;<samp class="samp">C</samp>&rsquo;,
+&lsquo;<samp class="samp">L</samp>&rsquo;, or &lsquo;<samp class="samp">I</samp>&rsquo; to (explicitly) center, left-align, or indent it
+by the amount stored in the <code class="code">DI</code> register, respectively. If
+specified, <var class="var">label</var> is set right-aligned.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002e_005b"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.[</code></strong><a class="copiable-link" href='#index-_002e_005b'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005b-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002e_005d"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.]</code></strong><a class="copiable-link" href='#index-_002e_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005d-_005bms_005d"></a>
+<p>Demarcate a bibliographic citation to be processed by the <code class="code">refer</code>
+preprocessor. The GNU <cite class="cite">refer<span class="r">(1)</span></cite> man page provides a
+comprehensive reference to the preprocessor and the format of its
+bibliographic database. Type &lsquo;<samp class="samp">man refer</samp>&rsquo; at the command line to
+view it.
+</p></dd></dl>
+
+<p>When <code class="code">refer</code> emits collected references (as might be done on a
+&ldquo;Works Cited&rdquo; page), it interpolates the <code class="code">REFERENCES</code> string as
+an unnumbered heading (<code class="code">SH</code>).
+</p>
+<a class="index-entry-id" id="index-table_002c-multi_002dpage_002c-example-_005bms_005d"></a>
+<a class="index-entry-id" id="index-multi_002dpage-table-example-_005bms_005d"></a>
+<p>The following is an example of how to set up a table that may print
+across two or more pages.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.TS H
+allbox;
+Cb | Cb .
+Part&rarr;Description
+_
+.TH
+.T&amp;
+GH-1978&rarr;Fribulating gonkulator
+<span class="r">&hellip;the rest of the table follows&hellip;</span>
+.TE
+</pre></div>
+</td></tr></table>
+
+<p>Attempting to place a multi-page table inside a keep can lead to
+unpleasant results, particularly if the <code class="code">tbl</code> <code class="code">allbox</code> option
+is used.
+</p>
+<a class="index-entry-id" id="index-equation-example-_005bms_005d"></a>
+<p>Mathematics can be typeset using the language of the <code class="code">eqn</code>
+preprocessor.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.EQ C (\*[SN-NO-DOT]a)
+p ~ = ~ q sqrt { ( 1 + ~ ( x / q sup 2 ) }
+.EN
+</pre></div>
+</td></tr></table>
+
+<p>This input formats a labelled equation. We used the <code class="code">SN-NO-DOT</code>
+string to base the equation label on the current heading number, giving
+us more flexibility to reorganize the document.
+</p>
+<p>Use <code class="command">groff</code> options to run preprocessors on the input:
+<samp class="option">-e</samp> for <code class="command">geqn</code>, <samp class="option">-p</samp> for <code class="command">gpic</code>,
+<samp class="option">-R</samp> for <code class="command">grefer</code>, and <samp class="option">-t</samp> for <code class="command">gtbl</code>.
+</p>
+
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="ms-Footnotes">
+<div class="nav-panel">
+<p>
+Previous: <a href="#ms-Insertions" accesskey="p" rel="prev">Tables, figures, equations, and references</a>, Up: <a href="#ms-Body-Text" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Footnotes">4.6.5.10 Footnotes</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-footnotes"></a>
+<a class="index-entry-id" id="index-footnotes-_005bms_005d"></a>
+
+<a class="index-entry-id" id="index-footnote-marker-_005bms_005d"></a>
+<a class="index-entry-id" id="index-marker_002c-footnote-_005bms_005d"></a>
+<p>A footnote is typically anchored to a place in the text with a
+<em class="dfn">marker</em>, which is a small integer, a symbol such as a dagger, or
+arbitrary user-specified text.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_002a_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[*]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_002a_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002a-_005bms_005d"></a>
+<p>Place an <em class="dfn">automatic number</em>, an automatically generated numeric
+footnote marker, in the text. Each time this string is interpolated,
+the number it produces increments by one. Automatic numbers start at 1.
+This is a Berkeley extension.
+</p></dd></dl>
+
+<p>Enclose the footnote text in <code class="code">FS</code> and <code class="code">FE</code> macro calls to set
+it at the nearest available &ldquo;foot&rdquo;, or bottom, of a text column or
+page.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eFS"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.FS</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">marker</i></span>]</var><a class="copiable-link" href='#index-_002eFS'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-FS-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eFE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.FE</code></strong><a class="copiable-link" href='#index-_002eFE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-FE-_005bms_005d"></a>
+<p>Begin (<code class="code">FS</code>) and end (<code class="code">FE</code>) a footnote. <code class="code">FS</code> calls
+<code class="code">FS-MARK</code> with any supplied <var class="var">marker</var> argument, which is then
+also placed at the beginning of the footnote text. If <var class="var">marker</var> is
+omitted, the next pending automatic footnote number enqueued by
+interpolation of the <code class="code">*</code> string is used, and if none exists,
+nothing is prefixed.
+</p></dd></dl>
+
+<p>You may not desire automatically numbered footnotes in spite of their
+convenience. You can indicate a footnote with a symbol or other text by
+specifying its marker at the appropriate place (for example, by using
+<code class="code">\[dg]</code> for the dagger glyph) <em class="emph">and</em> as an argument to the
+<code class="code">FS</code> macro. Such manual marks should be repeated as arguments to
+<code class="code">FS</code> or as part of the footnote text to disambiguate their
+correspondence. You may wish to use <code class="code">\*{</code> and <code class="code">\*}</code> to
+superscript the marker at the anchor point, in the footnote text, or
+both.
+</p>
+<p><code class="code">groff</code> <samp class="file">ms</samp> provides a hook macro, <code class="code">FS-MARK</code>, for
+user-determined operations to be performed when the <code class="code">FS</code> macro is
+called. It is passed the same arguments as <code class="code">FS</code> itself. An
+application of <code class="code">FS-MARK</code> is anchor placement for a hyperlink
+reference, so that a footnote can link back to its referential
+context.<a class="footnote" id="DOCF11" href="#FOOT11"><sup>11</sup></a> By default, this macro has an empty definition.
+<code class="code">FS-MARK</code> is a GNU extension.
+</p>
+<a class="index-entry-id" id="index-footnotes_002c-and-keeps-_005bms_005d"></a>
+<a class="index-entry-id" id="index-keeps_002c-and-footnotes-_005bms_005d"></a>
+<a class="index-entry-id" id="index-footnotes_002c-and-displays-_005bms_005d"></a>
+<a class="index-entry-id" id="index-displays_002c-and-footnotes-_005bms_005d"></a>
+<p>Footnotes can be safely used within keeps and displays, but you should
+avoid using automatically numbered footnotes within floating keeps. You
+can place a second <code class="code">\**</code> interpolation between a <code class="code">\**</code> and its
+corresponding <code class="code">FS</code> call as long as each <code class="code">FS</code> call occurs
+<em class="emph">after</em> the corresponding <code class="code">\**</code> and occurrences of <code class="code">FS</code>
+are in the same order as corresponding occurrences of <code class="code">\**</code>.
+</p>
+<p>Footnote text is formatted as paragraphs are, using analogous
+parameters. The registers <code class="code">FI</code>, <code class="code">FPD</code>, <code class="code">FPS</code>, and
+<code class="code">FVS</code> correspond to <code class="code">PI</code>, <code class="code">PD</code>, <code class="code">PS</code>, and <code class="code">CS</code>,
+respectively; <code class="code">FPD</code>, <code class="code">FPS</code>, and <code class="code">FVS</code> are GNU extensions.
+</p>
+<p>The <code class="code">FF</code> register controls the formatting of automatically numbered
+footnote paragraphs and those for which <code class="code">FS</code> is given a marker
+argument. See <a class="xref" href="#ms-Document-Control-Settings">Document Control Settings</a>.
+</p>
+<p>The default footnote line length is 11/12ths of the normal line length
+for compatibility with the expectations of historical <samp class="file">ms</samp>
+documents; you may wish to set the <code class="code">FR</code> string to &lsquo;<samp class="samp">1</samp>&rsquo; to align
+with contemporary typesetting practices. In the
+past,<a class="footnote" id="DOCF12" href="#FOOT12"><sup>12</sup></a> an <code class="code">FL</code> register
+was used for the line length in footnotes; however, setting this
+register at document initialization time had no effect on the footnote
+line length in multi-column arrangements.<a class="footnote" id="DOCF13" href="#FOOT13"><sup>13</sup></a>
+</p>
+<p><code class="code">FR</code> should be used in preference to the old <code class="code">FL</code> register in
+contemporary documents. The footnote line length is effectively
+computed as &lsquo;<samp class="samp"><i class="slanted">column-width</i> * \*[FR]</samp>&rsquo;. If an absolute
+footnote line length is required, recall that arithmetic expressions in
+<code class="code">roff</code> input are evaluated strictly from left to right, with no
+operator precedence (parentheses are honored).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds FR 0+3i \&quot; Set footnote line length to 3 inches.
+</pre></div></div>
+
+
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="ms-language-and-localization">
+<div class="nav-panel">
+<p>
+Next: <a href="#ms-Page-Layout" accesskey="n" rel="next">Page layout</a>, Previous: <a href="#ms-Footnotes" accesskey="p" rel="prev">Footnotes</a>, Up: <a href="#ms-Body-Text" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Language-and-localization">4.6.5.11 Language and localization</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-language"></a>
+<a class="index-entry-id" id="index-ms-macros_002c-localization"></a>
+<a class="index-entry-id" id="index-language-_005bms_005d"></a>
+<a class="index-entry-id" id="index-localization-_005bms_005d"></a>
+
+<p><code class="code">groff</code> <samp class="file">ms</samp> provides several strings that you can customize
+for your own purposes, or redefine to adapt the macro package to
+languages other than English. It is already localized for
+Czech, German, French, Italian, and Swedish. Load the desired
+localization macro package after <samp class="file">ms</samp>; see the
+<cite class="cite">groff_tmac<span class="r">(5)</span></cite> man page.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">$ groff -ms -mfr bienvenue.ms
+</pre></div>
+</td></tr></table>
+
+<p>The following strings are available.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bREFERENCES_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[REFERENCES]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bREFERENCES_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-REFERENCES-_005bms_005d"></a>
+<p>Contains the string printed at the beginning of a references
+(bibliography) page produced with GNU <cite class="cite">refer<span class="r">(1)</span></cite>. The default
+is &lsquo;<samp class="samp">References</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bABSTRACT_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[ABSTRACT]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bABSTRACT_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ABSTRACT-_005bms_005d"></a>
+<p>Contains the string printed at the beginning of the abstract. The
+default is &lsquo;<samp class="samp">\f[I]ABSTRACT\f[]</samp>&rsquo;; it includes font selection escape
+sequences to set the word in italics.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bTOC_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[TOC]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bTOC_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-TOC-_005bms_005d"></a>
+<p>Contains the string printed at the beginning of the table of contents.
+The default is &lsquo;<samp class="samp">Table of Contents</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bMONTH1_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH1]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH1_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH1-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH2_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH2]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH2_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH2-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH3_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH3]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH3_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH3-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH4_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH4]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH4_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH4-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH5_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH5]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH5_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH5-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH6_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH6]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH6_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH6-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH7_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH7]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH7_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH7-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH8_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH8]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH8_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH8-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH9_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH9]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH9_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH9-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH10_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH10]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH10_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH10-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH11_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH11]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH11_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH11-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH12_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH12]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH12_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH12-_005bms_005d"></a>
+<p>Contain the full names of the calendar months. The defaults are in
+English: &lsquo;<samp class="samp">January</samp>&rsquo;, &lsquo;<samp class="samp">February</samp>&rsquo;, and so on.
+</p></dd></dl>
+
+
+<hr>
+</div>
+</div>
+<div class="subsection-level-extent" id="ms-Page-Layout">
+<div class="nav-panel">
+<p>
+Next: <a href="#Differences-from-AT_0026T-ms" accesskey="n" rel="next">Differences from <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp></a>, Previous: <a href="#ms-Body-Text" accesskey="p" rel="prev">Body Text</a>, Up: <a href="#ms" accesskey="u" rel="up"><samp class="file">ms</samp></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Page-layout">4.6.6 Page layout</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-page-layout"></a>
+<a class="index-entry-id" id="index-page-layout-_005bms_005d"></a>
+
+<p><samp class="file">ms</samp>&rsquo;s default page layout arranges text in a single column with
+the page number between hyphens centered in a header on each page except
+the first, and produces no footers. You can customize this arrangement.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="#ms-Headers-and-Footers" accesskey="1">Headers and footers</a></li>
+<li><a href="#Tab-Stops-in-ms" accesskey="2">Tab stops</a></li>
+<li><a href="#ms-Margins" accesskey="3">Margins</a></li>
+<li><a href="#ms-Multiple-Columns" accesskey="4">Multiple columns</a></li>
+<li><a href="#ms-TOC" accesskey="5">Creating a table of contents</a></li>
+</ul>
+<hr>
+<div class="subsubsection-level-extent" id="ms-Headers-and-Footers">
+<div class="nav-panel">
+<p>
+Next: <a href="#Tab-Stops-in-ms" accesskey="n" rel="next">Tab stops</a>, Previous: <a href="#ms-Page-Layout" accesskey="p" rel="prev">Page layout</a>, Up: <a href="#ms-Page-Layout" accesskey="u" rel="up">Page layout</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Headers-and-footers">4.6.6.1 Headers and footers</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-headers"></a>
+<a class="index-entry-id" id="index-ms-macros_002c-footers"></a>
+<a class="index-entry-id" id="index-headers-_005bms_005d"></a>
+<a class="index-entry-id" id="index-footers-_005bms_005d"></a>
+
+<p>There are multiple ways to produce headers and footers. One is to
+define the strings <code class="code">LH</code>, <code class="code">CH</code>, and <code class="code">RH</code> to set the left,
+center, and right headers, respectively; and <code class="code">LF</code>, <code class="code">CF</code>, and
+<code class="code">RF</code> to set the left, center, and right footers. This approach
+suffices for documents that do not distinguish odd- and even-numbered
+pages.
+</p>
+<p>Another method is to call macros that set headers or footers for odd- or
+even-numbered pages. Each such macro takes a delimited argument
+separating the left, center, and right header or footer texts from each
+other. You can replace the neutral apostrophes (<code class="code">'</code>) shown below
+with any character not appearing in the header or footer text. These
+macros are Berkeley extensions.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eOH"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.OH</code></strong> <var class="def-var-arguments"><code class="code">'</code><span class="r"><i class="slanted">left</i></span><code class="code">'</code><span class="r"><i class="slanted">center</i></span><code class="code">'</code><span class="r"><i class="slanted">right</i></span><code class="code">'</code></var><a class="copiable-link" href='#index-_002eOH'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-OH-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eEH"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.EH</code></strong> <var class="def-var-arguments"><code class="code">'</code><span class="r"><i class="slanted">left</i></span><code class="code">'</code><span class="r"><i class="slanted">center</i></span><code class="code">'</code><span class="r"><i class="slanted">right</i></span><code class="code">'</code></var><a class="copiable-link" href='#index-_002eEH'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-EH-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eOF"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.OF</code></strong> <var class="def-var-arguments"><code class="code">'</code><span class="r"><i class="slanted">left</i></span><code class="code">'</code><span class="r"><i class="slanted">center</i></span><code class="code">'</code><span class="r"><i class="slanted">right</i></span><code class="code">'</code></var><a class="copiable-link" href='#index-_002eOF'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-OF-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eEF"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.EF</code></strong> <var class="def-var-arguments"><code class="code">'</code><span class="r"><i class="slanted">left</i></span><code class="code">'</code><span class="r"><i class="slanted">center</i></span><code class="code">'</code><span class="r"><i class="slanted">right</i></span><code class="code">'</code></var><a class="copiable-link" href='#index-_002eEF'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-EF-_005bms_005d"></a>
+<p>The <code class="code">OH</code> and <code class="code">EH</code> macros define headers for odd- (recto)
+and even-numbered (verso) pages, respectively; the <code class="code">OF</code> and
+<code class="code">EF</code> macros define footers for them.
+</p></dd></dl>
+
+<p>With either method, a percent sign <code class="code">%</code> in header or footer text is
+replaced by the current page number. By default, <samp class="file">ms</samp> places no
+header on a page numbered &ldquo;1&rdquo; (regardless of its number format).
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eP1"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.P1</code></strong><a class="copiable-link" href='#index-_002eP1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-P1-_005bms_005d"></a>
+<p>Typeset the header even on page&nbsp;1. To be effective, this macro
+must be called before the header trap is sprung on any page numbered
+&ldquo;1&rdquo;; in practice, unless your page numbering is unusual, this means
+that you should call it early, before <code class="code">TL</code> or any heading or
+paragraphing macro. This is a Berkeley extension.
+</p></dd></dl>
+
+<p>For even greater flexibility, <samp class="file">ms</samp> is designed to permit the
+redefinition of the macros that are called when the <code class="code">groff</code> traps
+that ordinarily cause the headers and footers to be output are sprung.
+<code class="code">PT</code> (&ldquo;page trap&rdquo;) is called by <samp class="file">ms</samp> when the header is to
+be written, and <code class="code">BT</code> (&ldquo;bottom trap&rdquo;) when the footer is to be.
+The <code class="code">groff</code> page location trap that <samp class="file">ms</samp> sets up to format the
+header also calls the (normally undefined) <code class="code">HD</code> macro after
+<code class="code">PT</code>; you can define <code class="code">HD</code> if you need additional processing
+after setting the header (for example, to draw a line below it).
+The <code class="code">HD</code> hook is a Berkeley extension. Any such macros you
+(re)define must implement any desired specialization for odd-, even-, or
+first numbered pages.
+</p>
+
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="Tab-Stops-in-ms">
+<div class="nav-panel">
+<p>
+Next: <a href="#ms-Margins" accesskey="n" rel="next">Margins</a>, Previous: <a href="#ms-Headers-and-Footers" accesskey="p" rel="prev">Headers and footers</a>, Up: <a href="#ms-Page-Layout" accesskey="u" rel="up">Page layout</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Tab-stops">4.6.6.2 Tab stops</h4>
+
+<p>Use the <code class="code">ta</code> request to define tab stops as needed. See <a class="xref" href="#Tabs-and-Fields">Tabs and Fields</a>.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eTA"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.TA</code></strong><a class="copiable-link" href='#index-_002eTA'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-TA-_005bms_005d"></a>
+<p>Reset the tab stops to the <samp class="file">ms</samp> default (every 5 ens).
+Redefine this macro to create a different set of default tab stops.
+</p></dd></dl>
+
+
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="ms-Margins">
+<div class="nav-panel">
+<p>
+Next: <a href="#ms-Multiple-Columns" accesskey="n" rel="next">Multiple columns</a>, Previous: <a href="#Tab-Stops-in-ms" accesskey="p" rel="prev">Tab stops</a>, Up: <a href="#ms-Page-Layout" accesskey="u" rel="up">Page layout</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Margins">4.6.6.3 Margins</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-margins"></a>
+
+<p>Control margins using the registers summarized in &ldquo;Margin settings&rdquo; in
+<a class="ref" href="#ms-Document-Control-Settings">Document Control Settings</a> above. There is no setting for the
+right margin; the combination of page offset <code class="code">\n[PO]</code> and line
+length <code class="code">\n[LL]</code> determines it.
+</p>
+
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="ms-Multiple-Columns">
+<div class="nav-panel">
+<p>
+Next: <a href="#ms-TOC" accesskey="n" rel="next">Creating a table of contents</a>, Previous: <a href="#ms-Margins" accesskey="p" rel="prev">Margins</a>, Up: <a href="#ms-Page-Layout" accesskey="u" rel="up">Page layout</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Multiple-columns">4.6.6.4 Multiple columns</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-multiple-columns"></a>
+<a class="index-entry-id" id="index-multiple-columns-_005bms_005d"></a>
+
+<p><samp class="file">ms</samp> can set text in as many columns as reasonably fit on the page.
+The following macros force a page break if a multi-column layout is
+active when they are called. The <code class="code">MINGW</code> register stores the
+default minimum gutter width; it is a GNU extension. When multiple
+columns are in use, keeps and the <code class="code">HORPHANS</code> and <code class="code">PORPHANS</code>
+registers work with respect to column breaks instead of page breaks.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002e1C"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.1C</code></strong><a class="copiable-link" href='#index-_002e1C'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-1C-_005bms_005d"></a>
+<p>Arrange page text in a single column (the default).
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002e2C"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.2C</code></strong><a class="copiable-link" href='#index-_002e2C'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-2C-_005bms_005d"></a>
+<p>Arrange page text in two columns.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eMC"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.MC</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">column-width</i></span> [<span class="r"><i class="slanted">gutter-width</i></span>]]</var><a class="copiable-link" href='#index-_002eMC'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MC-_005bms_005d"></a>
+<p>Arrange page text in multiple columns. If you specify no arguments, it
+is equivalent to the <code class="code">2C</code> macro. Otherwise, <var class="var">column-width</var> is
+the width of each column and <var class="var">gutter-width</var> is the minimum distance
+between columns.
+</p></dd></dl>
+
+
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="ms-TOC">
+<div class="nav-panel">
+<p>
+Next: <a href="#Differences-from-AT_0026T-ms" accesskey="n" rel="next">Differences from <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp></a>, Previous: <a href="#ms-Multiple-Columns" accesskey="p" rel="prev">Multiple columns</a>, Up: <a href="#ms-Page-Layout" accesskey="u" rel="up">Page layout</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Creating-a-table-of-contents">4.6.6.5 Creating a table of contents</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-creating-table-of-contents"></a>
+<a class="index-entry-id" id="index-table-of-contents_002c-creating-_005bms_005d"></a>
+
+<p>Because <code class="code">roff</code> formatters process their input in a single pass,
+material on page 50, for example, cannot influence what appears on
+page&nbsp;1&mdash;this poses a challenge for a table of contents at its
+traditional location in front matter, if you wish to avoid manually
+maintaining it. <samp class="file">ms</samp> enables the collection of material to be
+presented in the table of contents as it appears, saving its page number
+along with it, and then emitting the collected contents on demand toward
+the end of the document. The table of contents can then be resequenced
+to its desired location by physically rearranging the pages of a printed
+document, or as part of post-processing&mdash;with a <cite class="cite">sed<span class="r">(1)</span></cite>
+script to reorder the pages in <code class="command">troff</code>&rsquo;s output, with
+<cite class="cite">pdfjam<span class="r">(1)</span></cite>, or with <cite class="cite">gropdf<span class="r">(1)</span></cite>&rsquo;s
+&lsquo;<samp class="samp">.pdfswitchtopage</samp>&rsquo; feature, for example.
+</p>
+<p>Define an entry to appear in the table of contents by bracketing its
+text between calls to the <code class="code">XS</code> and <code class="code">XE</code> macros. A typical
+application is to call them immediately after <code class="code">NH</code> or <code class="code">SH</code> and
+repeat the heading text within them. The <code class="code">XA</code> macro, used within
+&lsquo;<samp class="samp">.XS</samp>&rsquo;/&lsquo;<samp class="samp">.XE</samp>&rsquo; pairs, supplements an entry&mdash;for instance, when
+it requires multiple output lines, whether because a heading is too long
+to fit or because style dictates that page numbers not be repeated. You
+may wish to indent the text thus wrapped to correspond to its heading
+depth; this can be done in the entry text by prefixing it with tabs or
+horizontal motion escape sequences, or by providing a second argument to
+the <code class="code">XA</code> macro. <code class="code">XS</code> and <code class="code">XA</code> automatically associate
+the page number where they are called with the text following them, but
+they accept arguments to override this behavior. At the end of the
+document, call <code class="code">TC</code> or <code class="code">PX</code> to emit the table of contents;
+<code class="code">TC</code> resets the page number to &lsquo;<samp class="samp">i</samp>&rsquo; (Roman numeral one), and
+then calls <code class="code">PX</code>. All of these macros are Berkeley extensions.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eXS"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.XS</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">page-number</i></span>]</var><a class="copiable-link" href='#index-_002eXS'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-XS-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eXA"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.XA</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">page-number</i></span> [<span class="r"><i class="slanted">indentation</i></span>]]</var><a class="copiable-link" href='#index-_002eXA'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-XA-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eXE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.XE</code></strong><a class="copiable-link" href='#index-_002eXE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-XE-_005bms_005d"></a>
+<p>Begin, supplement, and end a table of contents entry. Each entry is
+associated with <var class="var">page-number</var> (otherwise the current page number); a
+<var class="var">page-number</var> of &lsquo;<samp class="samp">no</samp>&rsquo; prevents a leader and page number from
+being emitted for that entry. Use of <code class="code">XA</code> within
+<code class="code">XS</code>/<code class="code">XE</code> is optional; it can be repeated. If
+<var class="var">indentation</var> is present, a supplemental entry is indented by that
+amount; ens are assumed if no unit is indicated. Text on input lines
+between <code class="code">XS</code> and <code class="code">XE</code> is stored for later recall by <code class="code">PX</code>.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002ePX"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.PX</code></strong> <var class="def-var-arguments">[<code class="code">no</code>]</var><a class="copiable-link" href='#index-_002ePX'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PX-_005bms_005d"></a>
+<p>Switch to single-column layout. Unless <code class="code">no</code> is specified, center
+and interpolate the <code class="code">TOC</code> string in bold and two points larger than
+the body text. Emit the table of contents entries.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eTC"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.TC</code></strong> <var class="def-var-arguments">[<code class="code">no</code>]</var><a class="copiable-link" href='#index-_002eTC'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-TC-_005bms_005d"></a>
+<p>Set the page number to&nbsp;1, the page number format to lowercase Roman
+numerals, and call <code class="code">PX</code> (with a <code class="code">no</code> argument, if present).
+</p></dd></dl>
+
+<p>Here&rsquo;s an example of typical <samp class="file">ms</samp> table of contents preparation.
+We employ horizontal escape sequences <code class="code">\h</code> to indent the entries by
+sectioning depth.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.NH 1
+Introduction
+.XS
+Introduction
+.XE
+<span class="r">&hellip;</span>
+.NH 2
+Methodology
+.XS
+\h'2n'Methodology
+.XA
+\h'4n'Fassbinder's Approach
+\h'4n'Kahiu's Approach
+.XE
+<span class="r">&hellip;</span>
+.NH 1
+Findings
+.XS
+Findings
+.XE
+<span class="r">&hellip;</span>
+.TC
+</pre></div>
+</td></tr></table>
+
+<p>The remaining features in this subsubsection are GNU extensions.
+<code class="code">groff</code> <samp class="file">ms</samp> obviates the need to repeat heading text after
+<code class="code">XS</code> calls. Call <code class="code">XN</code> and <code class="code">XH</code> after <code class="code">NH</code> and
+<code class="code">SH</code>, respectively.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eXN"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.XN</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">heading-text</i></span></var><a class="copiable-link" href='#index-_002eXN'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-XN-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eXH"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.XH</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">depth</i></span> <span class="r"><i class="slanted">heading-text</i></span></var><a class="copiable-link" href='#index-_002eXH'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-XH-_005bms_005d"></a>
+<p>Format <var class="var">heading-text</var> and create a corresponding table of contents
+entry. <code class="code">XN</code> computes the indentation from the depth of the
+preceding <code class="code">NH</code> call; <code class="code">XH</code> requires a <var class="var">depth</var> argument to
+do so.
+</p></dd></dl>
+
+<p><code class="code">groff</code> <samp class="file">ms</samp> encourages customization of table of contents
+entry production.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eXN_002dREPLACEMENT"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.XN-REPLACEMENT</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">heading-text</i></span></var><a class="copiable-link" href='#index-_002eXN_002dREPLACEMENT'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-XN_002dREPLACEMENT-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eXH_002dREPLACEMENT"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.XH-REPLACEMENT</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">depth</i></span> <span class="r"><i class="slanted">heading-text</i></span></var><a class="copiable-link" href='#index-_002eXH_002dREPLACEMENT'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-XH_002dREPLACEMENT-_005bms_005d"></a>
+<p>These hook macros implement <code class="code">XN</code> and <code class="code">XH</code>, respectively.
+They call <code class="code">XN-INIT</code> and pass their <var class="var">heading-text</var> arguments to
+<code class="code">XH-UPDATE-TOC</code>.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eXN_002dINIT"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.XN-INIT</code></strong><a class="copiable-link" href='#index-_002eXN_002dINIT'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-XN_002dINIT-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eXH_002dUPDATE_002dTOC"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.XH-UPDATE-TOC</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">depth</i></span> <span class="r"><i class="slanted">heading-text</i></span></var><a class="copiable-link" href='#index-_002eXH_002dUPDATE_002dTOC'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-XH_002dUPDATE_002dTOC-_005bms_005d"></a>
+<p>The <code class="code">XN-INIT</code> hook macro does nothing by default.
+<code class="code">XH-UPDATE-TOC</code> brackets <var class="var">heading-text</var> with <code class="code">XS</code> and
+<code class="code">XE</code> calls, indenting it by 2 ens per level of <var class="var">depth</var> beyond
+the first.
+</p></dd></dl>
+
+<p>We could therefore produce a table of contents similar to that in the
+previous example with fewer macro calls. (The difference is that this
+input follows the &ldquo;Approach&rdquo; entries with leaders and page numbers.)
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.NH 1
+.XN Introduction
+<span class="r">&hellip;</span>
+.NH 2
+.XN Methodology
+.XH 3 &quot;Fassbinder's Approach&quot;
+.XH 3 &quot;Kahiu's Approach&quot;
+<span class="r">&hellip;</span>
+.NH 1
+.XN Findings
+<span class="r">&hellip;</span>
+</pre></div>
+</td></tr></table>
+
+<p>To get the section number of the numbered headings into the table of
+contents entries, we might define <code class="code">XN-REPLACEMENT</code> as follows.
+(We obtain the heading depth from <code class="code">groff</code> <samp class="file">ms</samp>&rsquo;s internal
+register <code class="code">nh*hl</code>.)
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.de XN-REPLACEMENT
+.XN-INIT
+.XH-UPDATE-TOC \\n[nh*hl] \\$@
+\&amp;\\*[SN] \\$*
+..
+</pre></div>
+</td></tr></table>
+
+<p>You can change the style of the leader that bridges each table of
+contents entry with its page number; define the <code class="code">TC-LEADER</code> special
+character by using the <code class="code">char</code> request. A typical leader combines
+the dot glyph &lsquo;<samp class="samp">.</samp>&rsquo; with a horizontal motion escape sequence to
+spread the dots. The width of the page number field is stored in the
+<code class="code">TC-MARGIN</code> register.
+</p>
+
+<hr>
+</div>
+</div>
+<div class="subsection-level-extent" id="Differences-from-AT_0026T-ms">
+<div class="nav-panel">
+<p>
+Next: <a href="#ms-Naming-Conventions" accesskey="n" rel="next">Naming Conventions</a>, Previous: <a href="#ms-Page-Layout" accesskey="p" rel="prev">Page layout</a>, Up: <a href="#ms" accesskey="u" rel="up"><samp class="file">ms</samp></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Differences-from-AT_0026T-ms-1">4.6.7 Differences from <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp></h4>
+<a class="index-entry-id" id="index-ms-macros_002c-groff-differences-from-AT_0026T"></a>
+<a class="index-entry-id" id="index-AT_0026T-ms_002c-macro-package-differences"></a>
+
+<p>The <code class="code">groff</code> <samp class="file">ms</samp> macros are an independent reimplementation,
+using no <abbr class="acronym">AT&amp;T</abbr> code. Since they take advantage of the extended
+features of <code class="code">groff</code>, they cannot be used with <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code>. <code class="code">groff</code> <samp class="file">ms</samp> supports features described above
+as Berkeley and Tenth Edition Research Unix extensions, and adds several
+of its own.
+</p>
+<ul class="itemize mark-bullet">
+<li>The internals of <code class="code">groff</code> <samp class="file">ms</samp> differ from the internals of
+<abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp>. Documents that depend upon implementation
+details of <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp> may not format properly with
+<code class="code">groff</code> <samp class="file">ms</samp>. Such details include macros whose function was
+not documented in the <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp>
+manual.<a class="footnote" id="DOCF14" href="#FOOT14"><sup>14</sup></a>
+
+</li><li>The error-handling policy of <code class="code">groff</code> <samp class="file">ms</samp> is to detect and
+report errors, rather than to ignore them silently.
+
+</li><li>Tenth Edition Research Unix supported <code class="code">P1</code>/<code class="code">P2</code> macros to bracket code
+examples; <code class="code">groff</code> <samp class="file">ms</samp> does not.
+
+</li><li><code class="code">groff</code> <samp class="file">ms</samp> does not work in GNU <code class="code">troff</code>&rsquo;s
+<abbr class="acronym">AT&amp;T</abbr> compatibility mode. If loaded when that mode is enabled,
+it aborts processing with a diagnostic message.
+
+</li><li>Multiple line spacing is not supported. Use a larger vertical spacing
+instead.
+
+</li><li><code class="code">groff</code> <samp class="file">ms</samp> uses the same header and footer defaults in both
+<code class="code">nroff</code> and <code class="code">troff</code> modes as <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp> does in
+<code class="code">troff</code> mode; <abbr class="acronym">AT&amp;T</abbr>&rsquo;s default in <code class="code">nroff</code> mode is to
+put the date, in U.S. traditional format (e.g., &ldquo;January 1, 2021&rdquo;),
+in the center footer (the <code class="code">CF</code> string).
+
+</li><li>Many <code class="code">groff</code> <samp class="file">ms</samp> macros, including those for paragraphs,
+headings, and displays, cause a reset of paragraph rendering parameters,
+and may change the indentation; they do so not by incrementing or
+decrementing it, but by setting it absolutely. This can cause problems
+for documents that define additional macros of their own that try to
+manipulate indentation. Use the <samp class="file">ms</samp> <code class="code">RS</code> and <code class="code">RE</code>
+macros instead of the <code class="code">in</code> request.
+
+</li><li><a class="index-entry-id" id="index-fractional-type-sizes-in-ms-macros"></a>
+<a class="index-entry-id" id="index-ms-macros_002c-fractional-type-sizes-in"></a>
+<abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp> interpreted the values of the registers
+<code class="code">PS</code> and <code class="code">VS</code> in points, and did not support the use of
+scaling units with them. <code class="code">groff</code> <samp class="file">ms</samp> interprets values of
+the registers <code class="code">PS</code>, <code class="code">VS</code>, <code class="code">FPS</code>, and <code class="code">FVS</code> equal to
+or larger than&nbsp;1,000 (one thousand) as decimal fractions multiplied
+by&nbsp;1,000.<a class="footnote" id="DOCF15" href="#FOOT15"><sup>15</sup></a> This threshold makes use of a
+scaling unit with these parameters practical for high-resolution
+devices while preserving backward compatibility. It also permits
+expression of non-integral type sizes. For example, &lsquo;<samp class="samp">groff
+-rPS=10.5p</samp>&rsquo; at the shell prompt is equivalent to placing &lsquo;<samp class="samp">.nr PS
+10.5p</samp>&rsquo; at the beginning of the document.
+
+</li><li><abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp>&rsquo;s <code class="code">AU</code> macro supported arguments used with
+some document types; <code class="code">groff</code> <samp class="file">ms</samp> does not.
+
+</li><li>Right-aligned displays are available. The <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp>
+manual observes that &ldquo;it is tempting to assume that &lsquo;<samp class="samp">.DS R</samp>&rsquo; will
+right adjust lines, but it doesn&rsquo;t work&rdquo;. In <code class="code">groff</code> <samp class="file">ms</samp>,
+it does.
+
+</li><li>To make <code class="code">groff</code> <samp class="file">ms</samp> use the default page offset (which also
+specifies the left margin), the <code class="code">PO</code> register must stay undefined
+until the first <samp class="file">ms</samp> macro is called.
+
+<p>This implies that &lsquo;<samp class="samp">\n[PO]</samp>&rsquo; should not be used early in the
+document, unless it is changed also: accessing an undefined register
+automatically defines it.
+</p>
+</li><li><code class="code">groff</code> <samp class="file">ms</samp> supports the <code class="code">PN</code> register, but it is not
+necessary; you can access the page number via the usual <code class="code">%</code>
+register and invoke the <code class="code">af</code> request to assign a different format
+to it if desired.<a class="footnote" id="DOCF16" href="#FOOT16"><sup>16</sup></a>
+
+</li><li>The <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp> manual documents registers <code class="code">CW</code> and
+<code class="code">GW</code> as setting the default column width and &ldquo;intercolumn gap&rdquo;,
+respectively, and which applied when <code class="code">MC</code> was called with fewer
+than two arguments. <code class="code">groff</code> <samp class="file">ms</samp> instead treats <code class="code">MC</code>
+without arguments as synonymous with <code class="code">2C</code>; there is thus no
+occasion for a default column width register. Further, the <code class="code">MINGW</code>
+register and the second argument to <code class="code">MC</code> specify a <em class="emph">minimum</em>
+space between columns, not the fixed gutter width of <abbr class="acronym">AT&amp;T</abbr>
+<samp class="file">ms</samp>.
+
+</li><li>The <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp> manual did not document the <code class="code">QI</code>
+register; Berkeley and <code class="code">groff</code> <samp class="file">ms</samp> do.
+</li></ul>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bGS_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[GS]</code></strong><a class="copiable-link" href='#index-_005cn_005bGS_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-GS-_005bms_005d"></a>
+<p>The register <code class="code">GS</code> is set to&nbsp;1 by the <code class="code">groff</code> <samp class="file">ms</samp>
+macros, but is not used by the <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp> package.
+Documents that need to determine whether they are being formatted with
+<code class="code">groff</code> <samp class="file">ms</samp> or another implementation should test this
+register.
+</p></dd></dl>
+
+
+
+<ul class="mini-toc">
+<li><a href="#Missing-Unix-Version-7-ms-Macros" accesskey="1">Unix Version 7 <samp class="file">ms</samp> macros not implemented by <code class="code">groff</code> <samp class="file">ms</samp></a></li>
+</ul>
+<hr>
+<div class="subsubsection-level-extent" id="Missing-Unix-Version-7-ms-Macros">
+<div class="nav-panel">
+<p>
+Previous: <a href="#Differences-from-AT_0026T-ms" accesskey="p" rel="prev">Differences from <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp></a>, Up: <a href="#Differences-from-AT_0026T-ms" accesskey="u" rel="up">Differences from <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Unix-Version-7-ms-macros-not-implemented-by-groff-ms">4.6.7.1 Unix Version 7 <samp class="file">ms</samp> macros not implemented by <code class="code">groff</code> <samp class="file">ms</samp></h4>
+
+<p>Several macros described in the Unix Version&nbsp;7 <samp class="file">ms</samp>
+documentation are unimplemented by <code class="code">groff</code> <samp class="file">ms</samp> because they
+are specific to the requirements of documents produced internally by
+Bell Laboratories, some of which also require a glyph for the Bell
+System logo that <code class="code">groff</code> does not support. These macros
+implemented several document type formats
+(<code class="code">EG</code>, <code class="code">IM</code>, <code class="code">MF</code>, <code class="code">MR</code>, <code class="code">TM</code>, <code class="code">TR</code>), were meaningful only in conjunction with the use of certain document
+types
+(<code class="code">AT</code>, <code class="code">CS</code>, <code class="code">CT</code>, <code class="code">OK</code>, <code class="code">SG</code>), stored the postal addresses of Bell Labs sites
+(<code class="code">HO</code>, <code class="code">IH</code>, <code class="code">MH</code>, <code class="code">PY</code>, <code class="code">WH</code>), or lacked a stable definition over time
+(<code class="code">UX</code>). To compatibly render historical <samp class="file">ms</samp> documents using these macros,
+we advise your documents to invoke the <code class="code">rm</code> request to remove any
+such macros it uses and then define replacements with an authentically
+typeset original at hand.<a class="footnote" id="DOCF17" href="#FOOT17"><sup>17</sup></a> For
+informal purposes, a simple definition of <code class="code">UX</code> should maintain the
+readability of the document&rsquo;s substance.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.rm UX
+.ds UX Unix\&quot;
+</pre></div>
+</td></tr></table>
+
+
+<hr>
+</div>
+</div>
+<div class="subsection-level-extent" id="ms-Legacy-Features">
+<div class="nav-panel">
+<p>
+Next: <a href="#ms-Naming-Conventions" accesskey="n" rel="next">Naming Conventions</a>, Previous: <a href="#Differences-from-AT_0026T-ms" accesskey="p" rel="prev">Differences from <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp></a>, Up: <a href="#ms" accesskey="u" rel="up"><samp class="file">ms</samp></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Legacy-Features">4.6.8 Legacy Features</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-strings"></a>
+<a class="index-entry-id" id="index-ms-macros_002c-special-characters"></a>
+<a class="index-entry-id" id="index-ms-macros_002c-accent-marks"></a>
+<a class="index-entry-id" id="index-accent-marks-_005bms_005d"></a>
+<a class="index-entry-id" id="index-special-characters-_005bms_005d"></a>
+<a class="index-entry-id" id="index-strings-_005bms_005d"></a>
+
+<p><code class="code">groff</code> <samp class="file">ms</samp> retains some legacy features solely to support
+formatting of historical documents; contemporary ones should not use
+them because they can render poorly. See the <cite class="cite">groff_char<span class="r">(7)</span></cite>
+man page.
+</p>
+<ul class="mini-toc">
+<li><a href="#AT_0026T-accent-mark-strings" accesskey="1">AT&amp;T accent mark strings</a></li>
+<li><a href="#Berkeley-accent-mark-and-glyph-strings" accesskey="2">Berkeley accent mark and glyph strings</a></li>
+</ul>
+<div class="unnumberedsubsubsec-level-extent" id="AT_0026T-accent-mark-strings">
+<h4 class="unnumberedsubsubsec">AT&amp;T accent mark strings</h4>
+
+<p>AT&amp;T <samp class="file">ms</samp> defined accent mark strings as follows.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_0027_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[<code class="code">'</code>]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_0027_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_0027-_005bms_005d"></a>
+<p>Apply acute accent to subsequent glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_0060_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[<code class="code">`</code>]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_0060_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_0060-_005bms_005d"></a>
+<p>Apply grave accent to subsequent glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_003a_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[:]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_003a_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_003a-_005bms_005d"></a>
+<p>Apply dieresis (umlaut) to subsequent glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_005e_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[^]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_005e_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005e-_005bms_005d"></a>
+<p>Apply circumflex accent to subsequent glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_007e_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[~]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_007e_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_007e-_005bms_005d"></a>
+<p>Apply tilde accent to subsequent glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bC_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[C]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bC_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-C-_005bms_005d"></a>
+<p>Apply caron to subsequent glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_002c_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[,]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_002c_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002c-_005bms_005d"></a>
+<p>Apply cedilla to subsequent glyph.
+</p></dd></dl>
+
+</div>
+<div class="unnumberedsubsubsec-level-extent" id="Berkeley-accent-mark-and-glyph-strings">
+<h4 class="unnumberedsubsubsec">Berkeley accent mark and glyph strings</h4>
+
+<p>Berkeley <samp class="file">ms</samp> offered an <code class="code">AM</code> macro; calling it redefined the
+AT&amp;T accent mark strings (except for &lsquo;<samp class="samp">\*C</samp>&rsquo;), applied them to the
+<em class="emph">preceding</em> glyph, and defined additional strings, some for spacing
+glyphs.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eAM"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.AM</code></strong><a class="copiable-link" href='#index-_002eAM'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-AM-_005bms_005d"></a>
+<p>Enable alternative accent mark and glyph-producing strings.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_0027_005d-1"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[<code class="code">'</code>]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_0027_005d-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_0027-_005bms_005d-1"></a>
+<p>Apply acute accent to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_0060_005d-1"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[<code class="code">`</code>]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_0060_005d-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_0060-_005bms_005d-1"></a>
+<p>Apply grave accent to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_003a_005d-1"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[:]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_003a_005d-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_003a-_005bms_005d-1"></a>
+<p>Apply dieresis (umlaut) to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_005e_005d-1"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[^]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_005e_005d-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005e-_005bms_005d-1"></a>
+<p>Apply circumflex accent to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_007e_005d-1"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[~]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_007e_005d-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_007e-_005bms_005d-1"></a>
+<p>Apply tilde accent to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_002c_005d-1"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[,]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_002c_005d-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002c-_005bms_005d-1"></a>
+<p>Apply cedilla to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_002f_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[/]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_002f_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002f-_005bms_005d"></a>
+<p>Apply stroke (slash) to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bv_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[v]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bv_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-v-_005bms_005d"></a>
+<p>Apply caron to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_005f_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[_]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_005f_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005f-_005bms_005d"></a>
+<p>Apply macron to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_002e_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[.]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_002e_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002e-_005bms_005d"></a>
+<p>Apply underdot to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bo_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[o]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bo_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-o-_005bms_005d"></a>
+<p>Apply ring accent to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_003f_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[?]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_003f_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_003f-_005bms_005d"></a>
+<p>Interpolate inverted question mark.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_0021_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[!]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_0021_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_0021-_005bms_005d"></a>
+<p>Interpolate inverted exclamation mark.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b8_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[8]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b8_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-8-_005bms_005d"></a>
+<p>Interpolate small letter sharp s.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bq_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[q]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bq_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-q-_005bms_005d"></a>
+<p>Interpolate small letter o with hook accent (ogonek).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b3_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[3]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b3_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-3-_005bms_005d"></a>
+<p>Interpolate small letter yogh.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bd_002d_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[d-]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bd_002d_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-d_002d-_005bms_005d"></a>
+<p>Interpolate small letter eth.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bD_002d_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[D-]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bD_002d_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-D_002d-_005bms_005d"></a>
+<p>Interpolate capital letter eth.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bth_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[th]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bth_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-th-_005bms_005d"></a>
+<p>Interpolate small letter thorn.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bTh_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[Th]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bTh_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-Th-_005bms_005d"></a>
+<p>Interpolate capital letter thorn.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bae_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[ae]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bae_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ae-_005bms_005d"></a>
+<p>Interpolate small æ ligature.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bAe_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[Ae]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bAe_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-Ae-_005bms_005d"></a>
+<p>Interpolate capital Æ ligature.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005boe_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[oe]</code></strong><a class="copiable-link" href='#index-_005c_002a_005boe_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-oe-_005bms_005d"></a>
+<p>Interpolate small oe ligature.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bOE_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[OE]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bOE_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-OE-_005bms_005d"></a>
+<p>Interpolate capital OE ligature.
+</p></dd></dl>
+
+
+<hr>
+</div>
+</div>
+<div class="subsection-level-extent" id="ms-Naming-Conventions">
+<div class="nav-panel">
+<p>
+Previous: <a href="#ms-Legacy-Features" accesskey="p" rel="prev">Legacy Features</a>, Up: <a href="#ms" accesskey="u" rel="up"><samp class="file">ms</samp></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Naming-Conventions">4.6.9 Naming Conventions</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-naming-conventions"></a>
+<a class="index-entry-id" id="index-naming-conventions_002c-ms-macros"></a>
+
+<p>The following conventions are used for names of macros, strings, and
+registers. External names available to documents that use the
+<code class="code">groff</code> <samp class="file">ms</samp> macros contain only uppercase letters and digits.
+</p>
+<p>Internally, the macros are divided into modules. Conventions for
+identifier names are as follows.
+</p>
+<ul class="itemize mark-bullet">
+<li>Names used only within one module are of the form
+<var class="var">module</var><code class="code">*</code><var class="var">name</var>.
+
+</li><li>Names used outside the module in which they are defined are of the form
+<var class="var">module</var><code class="code">@</code><var class="var">name</var>.
+
+</li><li>Names associated with a particular environment are of the form
+<var class="var">environment</var><code class="code">:</code><var class="var">name</var>; these are used only within the
+<code class="code">par</code> module.
+
+</li><li><var class="var">name</var> does not have a module prefix.
+
+</li><li>Constructed names used to implement arrays are of the form
+<var class="var">array</var><code class="code">!</code><var class="var">index</var>.
+</li></ul>
+
+<p>Thus the <code class="code">groff</code> <samp class="file">ms</samp> macros reserve the following names.
+</p>
+<ul class="itemize mark-bullet">
+<li>Names containing the characters <code class="code">*</code>, <code class="code">@</code>, and&nbsp;<code class="code">:</code>.
+
+</li><li>Names containing only uppercase letters and digits.
+</li></ul>
+
+
+
+<hr>
+</div>
+</div>
+</div>
+<div class="chapter-level-extent" id="GNU-troff-Reference">
+<div class="nav-panel">
+<p>
+Next: <a href="#File-Formats" accesskey="n" rel="next">File Formats</a>, Previous: <a href="#Major-Macro-Packages" accesskey="p" rel="prev">Macro Packages</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h2 class="chapter" id="GNU-troff-Reference-1">5 GNU <code class="code">troff</code> Reference</h2>
+<a class="index-entry-id" id="index-reference_002c-gtroff"></a>
+<a class="index-entry-id" id="index-gtroff_002c-reference"></a>
+
+<p>This chapter covers <em class="emph">all</em> of the facilities of the GNU
+<code class="code">troff</code> formatting engine. Users of macro packages may skip it if
+not interested in details.
+</p>
+
+
+
+
+<ul class="mini-toc">
+<li><a href="#Text" accesskey="1">Text</a></li>
+<li><a href="#Page-Geometry" accesskey="2">Page Geometry</a></li>
+<li><a href="#Measurements" accesskey="3">Measurements</a></li>
+<li><a href="#Numeric-Expressions" accesskey="4">Numeric Expressions</a></li>
+<li><a href="#Identifiers" accesskey="5">Identifiers</a></li>
+<li><a href="#Formatter-Instructions" accesskey="6">Formatter Instructions</a></li>
+<li><a href="#Comments" accesskey="7">Comments</a></li>
+<li><a href="#Registers" accesskey="8">Registers</a></li>
+<li><a href="#Manipulating-Filling-and-Adjustment" accesskey="9">Manipulating Filling and Adjustment</a></li>
+<li><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></li>
+<li><a href="#Manipulating-Spacing">Manipulating Spacing</a></li>
+<li><a href="#Tabs-and-Fields">Tabs and Fields</a></li>
+<li><a href="#Character-Translations">Character Translations</a></li>
+<li><a href="#troff-and-nroff-Modes"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a></li>
+<li><a href="#Line-Layout">Line Layout</a></li>
+<li><a href="#Line-Continuation">Line Continuation</a></li>
+<li><a href="#Page-Layout">Page Layout</a></li>
+<li><a href="#Page-Control">Page Control</a></li>
+<li><a href="#Using-Fonts">Using Fonts</a></li>
+<li><a href="#Manipulating-Type-Size-and-Vertical-Spacing">Manipulating Type Size and Vertical Spacing</a></li>
+<li><a href="#Colors">Colors</a></li>
+<li><a href="#Strings">Strings</a></li>
+<li><a href="#Conditionals-and-Loops">Conditionals and Loops</a></li>
+<li><a href="#Writing-Macros">Writing Macros</a></li>
+<li><a href="#Page-Motions">Page Motions</a></li>
+<li><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></li>
+<li><a href="#Deferring-Output">Deferring Output</a></li>
+<li><a href="#Traps">Traps</a></li>
+<li><a href="#Diversions">Diversions</a></li>
+<li><a href="#Punning-Names">Punning Names</a></li>
+<li><a href="#Environments">Environments</a></li>
+<li><a href="#Suppressing-Output">Suppressing Output</a></li>
+<li><a href="#I_002fO">I/O</a></li>
+<li><a href="#Postprocessor-Access">Postprocessor Access</a></li>
+<li><a href="#Miscellaneous">Miscellaneous</a></li>
+<li><a href="#Gtroff-Internals"><code class="code">gtroff</code> Internals</a></li>
+<li><a href="#Debugging">Debugging</a></li>
+<li><a href="#Implementation-Differences">Implementation Differences</a></li>
+</ul>
+<hr>
+<div class="section-level-extent" id="Text">
+<div class="nav-panel">
+<p>
+Next: <a href="#Measurements" accesskey="n" rel="next">Measurements</a>, Previous: <a href="#GNU-troff-Reference" accesskey="p" rel="prev">GNU <code class="code">troff</code> Reference</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Text-1">5.1 Text</h3>
+<a class="index-entry-id" id="index-text_002c-GNU-troff-processing"></a>
+
+<p><abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> was designed to take input as it would be
+composed on a typewriter, including the teletypewriters used as early
+computer terminals, and relieve the user drafting a document of concern
+with details like line length, hyphenation breaking, and the achievement
+of straight margins. Early in its development, the program gained the
+ability to prepare output for a phototypesetter; a document could then
+be prepared for output to either a teletypewriter, a phototypesetter, or
+both. GNU <code class="code">troff</code> continues this tradition of permitting an author
+to compose a single master version of a document which can then be
+rendered for a variety of output formats or devices.
+</p>
+<p><code class="code">roff</code> input files contain text interspersed with instructions to
+control the formatter. Even in the absence of such instructions, GNU
+<code class="code">troff</code> still processes its input in several ways, by filling,
+hyphenating, breaking, and adjusting it, and supplementing it with
+inter-sentence space.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="#Filling" accesskey="1">Filling</a></li>
+<li><a href="#Sentences" accesskey="2">Sentences</a></li>
+<li><a href="#Hyphenation" accesskey="3">Hyphenation</a></li>
+<li><a href="#Breaking" accesskey="4">Breaking</a></li>
+<li><a href="#Adjustment" accesskey="5">Adjustment</a></li>
+<li><a href="#Tabs-and-Leaders" accesskey="6">Tabs and Leaders</a></li>
+<li><a href="#Requests-and-Macros" accesskey="7">Requests and Macros</a></li>
+<li><a href="#Macro-Packages" accesskey="8">Macro Packages</a></li>
+<li><a href="#Input-Encodings" accesskey="9">Input Encodings</a></li>
+<li><a href="#Input-Conventions">Input Conventions</a></li>
+</ul>
+<hr>
+<div class="subsection-level-extent" id="Filling">
+<div class="nav-panel">
+<p>
+Next: <a href="#Sentences" accesskey="n" rel="next">Sentences</a>, Previous: <a href="#Text" accesskey="p" rel="prev">Text</a>, Up: <a href="#Text" accesskey="u" rel="up">Text</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Filling-1">5.1.1 Filling</h4>
+
+<p>When GNU <code class="code">troff</code> starts up, it obtains information about the device
+for which it is preparing output.<a class="footnote" id="DOCF18" href="#FOOT18"><sup>18</sup></a> An essential property is the length of the output
+line, such as &ldquo;6.5 inches&rdquo;.
+</p>
+<a class="index-entry-id" id="index-word_002c-definition-of"></a>
+<a class="index-entry-id" id="index-filling"></a>
+<p>GNU <code class="code">troff</code> interprets plain text files employing the Unix
+line-ending convention. It reads input a character at a time,
+collecting words as it goes, and fits as many words together on an
+output line as it can&mdash;this is known as <em class="dfn">filling</em>. To GNU
+<code class="code">troff</code>, a <em class="dfn">word</em> is any sequence of one or more characters
+that aren&rsquo;t spaces or newlines. The exceptions separate
+words.<a class="footnote" id="DOCF19" href="#FOOT19"><sup>19</sup></a> To disable filling, see
+<a class="ref" href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">It is a truth universally acknowledged
+that a single man in possession of a
+good fortune must be in want of a wife.
+ &rArr; It is a truth universally acknowledged that a
+ &rArr; single man in possession of a good fortune must
+ &rArr; be in want of a wife.
+</pre></div></div>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Sentences">
+<div class="nav-panel">
+<p>
+Next: <a href="#Hyphenation" accesskey="n" rel="next">Hyphenation</a>, Previous: <a href="#Filling" accesskey="p" rel="prev">Filling</a>, Up: <a href="#Text" accesskey="u" rel="up">Text</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Sentences-1">5.1.2 Sentences</h4>
+<a class="index-entry-id" id="index-sentences"></a>
+
+<p>A passionate debate has raged for decades among writers of the English
+language over whether more space should appear between adjacent
+sentences than between words within a sentence, and if so, how much, and
+what other circumstances should influence this spacing.<a class="footnote" id="DOCF20" href="#FOOT20"><sup>20</sup></a>
+GNU <code class="code">troff</code> follows the example of <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>;
+it attempts to detect the boundaries between sentences, and supplies
+additional inter-sentence space between them.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">Hello, world!
+Welcome to groff.
+ &rArr; Hello, world! Welcome to groff.
+</pre></div></div>
+
+<a class="index-entry-id" id="index-end_002dof_002dsentence-characters"></a>
+<a class="index-entry-id" id="index-sentence-space"></a>
+<a class="index-entry-id" id="index-space-between-sentences"></a>
+<a class="index-entry-id" id="index-French-spacing"></a>
+<p>GNU <code class="code">troff</code> flags certain characters (normally &lsquo;<samp class="samp">!</samp>&rsquo;, &lsquo;<samp class="samp">?</samp>&rsquo;,
+and &lsquo;<samp class="samp">.</samp>&rsquo;) as potentially ending a sentence. When GNU <code class="code">troff</code>
+encounters one of these <em class="dfn">end-of-sentence characters</em> at the end of
+an input line, or one of them is followed by two (unescaped) spaces on
+the same input line, it appends an inter-word space followed by an
+inter-sentence space in the output.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">R. Harper subscribes to a maxim of P. T. Barnum.
+ &rArr; R. Harper subscribes to a maxim of P. T. Barnum.
+</pre></div></div>
+
+<p>In the above example, inter-sentence space is not added after &lsquo;<samp class="samp">P.</samp>&rsquo;
+or &lsquo;<samp class="samp">T.</samp>&rsquo; because the periods do not occur at the end of an input
+line, nor are they followed by two or more spaces. Let&rsquo;s imagine that
+we&rsquo;ve heard something about defamation from Mr. Harper&rsquo;s attorney,
+recast the sentence, and reflowed it in our text editor.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">I submit that R. Harper subscribes to a maxim of P. T.
+Barnum.
+ &rArr; I submit that R. Harper subscribes to a maxim of
+ &rArr; P. T. Barnum.
+</pre></div></div>
+
+<p>&ldquo;Barnum&rdquo; doesn&rsquo;t begin a sentence! What to do? Let us meet our first
+<em class="dfn">escape sequence</em>, a series of input characters that give
+instructions to GNU <code class="code">troff</code> instead of being used to construct
+output device glyphs.<a class="footnote" id="DOCF21" href="#FOOT21"><sup>21</sup></a> An escape sequence begins with the backslash character <code class="code">\</code>
+by default, an uncommon character in natural language text, and is
+<em class="emph">always</em> followed by at least one other character, hence the term
+&ldquo;sequence&rdquo;.
+</p>
+<a class="index-entry-id" id="index-_005c_0026_002c-at-end-of-sentence"></a>
+<p>The dummy character escape sequence <code class="code">\&amp;</code> can be used after an
+end-of-sentence character to defeat end-of-sentence detection on a
+per-instance basis. We can therefore rewrite our input more
+defensively.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">I submit that R.\&amp; Harper subscribes to a maxim of P.\&amp;
+T.\&amp; Barnum.
+ &rArr; I submit that R. Harper subscribes to a maxim of
+ &rArr; P. T. Barnum.
+</pre></div></div>
+
+<p>Adding text caused our input to wrap; now, we don&rsquo;t need <code class="code">\&amp;</code> after
+&lsquo;<samp class="samp">T.</samp>&rsquo; but we do after &lsquo;<samp class="samp">P.</samp>&rsquo;. Consistent use of the escape
+sequence ensures that potential sentence boundaries are robust to
+editing activities. Further advice along these lines will follow in
+<a class="ref" href="#Input-Conventions">Input Conventions</a>.
+</p>
+<a class="index-entry-id" id="index-end_002dof_002dsentence-transparent-characters"></a>
+<a class="index-entry-id" id="index-characters_002c-end_002dof_002dsentence-transparent"></a>
+<a class="index-entry-id" id="index-dg-glyph_002c-at-end-of-sentence"></a>
+<a class="index-entry-id" id="index-dd-glyph_002c-at-end-of-sentence"></a>
+<a class="index-entry-id" id="index-rq-glyph_002c-at-end-of-sentence"></a>
+<a class="index-entry-id" id="index-cq-glyph_002c-at-end-of-sentence"></a>
+<a class="index-entry-id" id="index-_0022_002c-at-end-of-sentence"></a>
+<a class="index-entry-id" id="index-_0027_002c-at-end-of-sentence"></a>
+<a class="index-entry-id" id="index-_0029_002c-at-end-of-sentence"></a>
+<a class="index-entry-id" id="index-_005d_002c-at-end-of-sentence"></a>
+<a class="index-entry-id" id="index-_002a_002c-at-end-of-sentence"></a>
+<a class="index-entry-id" id="index-special-characters"></a>
+<a class="index-entry-id" id="index-characters_002c-special"></a>
+<p>Normally, the occurrence of a visible non-end-of-sentence character (as
+opposed to a space or tab) immediately after an end-of-sentence
+character cancels detection of the end of a sentence. For example, it
+would be incorrect for GNU <code class="code">troff</code> to infer the end of a sentence
+after the dot in &lsquo;<samp class="samp">3.14159</samp>&rsquo;. However, several characters are
+treated <em class="emph">transparently</em> after the occurrence of an end-of-sentence
+character. That is, GNU <code class="code">troff</code> does not cancel end-of-sentence
+detection when it processes them. This is because such characters are
+often used as footnote markers or to close quotations and
+parentheticals. The default set is &lsquo;<samp class="samp">&quot;</samp>&rsquo;, &lsquo;<samp class="samp">'</samp>&rsquo;, &lsquo;<samp class="samp">)</samp>&rsquo;,
+&lsquo;<samp class="samp">]</samp>&rsquo;, &lsquo;<samp class="samp">*</samp>&rsquo;, <code class="code">\[dg]</code>, <code class="code">\[dd]</code>, <code class="code">\[rq]</code>, and
+<code class="code">\[cq]</code>. The last four are examples of <em class="dfn">special characters</em>,
+escape sequences whose purpose is to obtain glyphs that are not easily
+typed at the keyboard, or which have special meaning to GNU <code class="code">troff</code>
+(like <code class="code">\</code> itself).<a class="footnote" id="DOCF22" href="#FOOT22"><sup>22</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">\[lq]The idea that the poor should have leisure has always
+been shocking to the rich.\[rq]
+(Bertrand Russell, 1935)
+ &rArr; &quot;The idea that the poor should have
+ &rArr; leisure has always been shocking to
+ &rArr; the rich.&quot; (Bertrand Russell, 1935)
+</pre></div></div>
+
+<p>The sets of characters that potentially end sentences or are transparent
+to sentence endings are configurable. See the <code class="code">cflags</code> request in
+<a class="ref" href="#Using-Symbols">Using Symbols</a>. To change the additional inter-sentence space
+amount&mdash;even to remove it entirely&mdash;see <a class="ref" href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a>.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Hyphenation">
+<div class="nav-panel">
+<p>
+Next: <a href="#Breaking" accesskey="n" rel="next">Breaking</a>, Previous: <a href="#Sentences" accesskey="p" rel="prev">Sentences</a>, Up: <a href="#Text" accesskey="u" rel="up">Text</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Hyphenation-1">5.1.3 Hyphenation</h4>
+<a class="index-entry-id" id="index-hyphenation"></a>
+
+<p>When an output line is nearly full, it is uncommon for the next word
+collected from the input to exactly fill it&mdash;typically, there is room
+left over only for part of the next word. The process of splitting a
+word so that it appears partially on one line (with a hyphen to indicate
+to the reader that the word has been broken) with its remainder on the
+next is <em class="dfn">hyphenation</em>. Hyphenation points can be manually
+specified; GNU <code class="code">troff</code> also uses a hyphenation algorithm and
+language-specific pattern files (based on those used in TeX) to
+decide which words can be hyphenated and where.
+</p>
+<p>Hyphenation does not always occur even when the hyphenation rules for a
+word allow it; it can be disabled, and when not disabled there are
+several parameters that can prevent it in certain circumstances.
+See <a class="xref" href="#Manipulating-Hyphenation">Manipulating Hyphenation</a>.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Breaking">
+<div class="nav-panel">
+<p>
+Next: <a href="#Adjustment" accesskey="n" rel="next">Adjustment</a>, Previous: <a href="#Hyphenation" accesskey="p" rel="prev">Hyphenation</a>, Up: <a href="#Text" accesskey="u" rel="up">Text</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Breaking-1">5.1.4 Breaking</h4>
+<a class="index-entry-id" id="index-break"></a>
+<a class="index-entry-id" id="index-implicit-line-break"></a>
+<a class="index-entry-id" id="index-line-break_002c-output"></a>
+<a class="index-entry-id" id="index-output-line-break"></a>
+
+<p>Once an output line is full, the next word (or remainder of a hyphenated
+one) is placed on a different output line; this is called a <em class="dfn">break</em>.
+In this manual and in <code class="code">roff</code> discussions generally, a &ldquo;break&rdquo; if
+not further qualified always refers to the termination of an output
+line. When the formatter is filling text, it introduces breaks
+automatically to keep output lines from exceeding the configured line
+length. After an automatic break, GNU <code class="code">troff</code> adjusts the line if
+applicable (see below), and then resumes collecting and filling text on
+the next output line.
+</p>
+<p>Sometimes, a line cannot be broken automatically. This usually does
+not happen with natural language text unless the output line length has
+been manipulated to be extremely short, but it can with specialized
+text like program source code. We can use <code class="code">perl</code> at the shell
+prompt to contrive an example of failure to break the line. We also
+employ the <samp class="option">-z</samp> option to suppress normal output.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">$ perl -e 'print &quot;#&quot; x 80, &quot;\n&quot;;' | nroff -z
+ error&rarr; warning: cannot break line
+</pre></div></div>
+
+<p>The remedy for these cases is to tell GNU <code class="code">troff</code> where the line
+may be broken without hyphens. This is done with the non-printing break
+point escape sequence &lsquo;<samp class="samp">\:</samp>&rsquo;; see <a class="ref" href="#Manipulating-Hyphenation">Manipulating Hyphenation</a>.
+</p>
+<a class="index-entry-id" id="index-blank-line"></a>
+<a class="index-entry-id" id="index-empty-line"></a>
+<a class="index-entry-id" id="index-line_002c-blank"></a>
+<a class="index-entry-id" id="index-blank-line-macro-_0028blm_0029"></a>
+<p>What if the document author wants to stop filling lines temporarily, for
+instance to start a new paragraph? There are several solutions. A
+blank input line not only causes a break, but by default it also outputs
+a one-line vertical space (effectively a blank output line). This
+behavior can be modified; see <a class="ref" href="#Blank-Line-Traps">Blank Line Traps</a>. Macro packages
+may discourage or disable the blank line method of paragraphing in favor
+of their own macros.
+</p>
+<a class="index-entry-id" id="index-leading-spaces"></a>
+<a class="index-entry-id" id="index-spaces_002c-leading-and-trailing"></a>
+<a class="index-entry-id" id="index-trailing-spaces-on-text-lines"></a>
+<a class="index-entry-id" id="index-leading-space-macro-_0028lsm_0029"></a>
+<p>A line that begins with one or more spaces causes a break. The spaces
+are output at the beginning of the next line without being
+<em class="emph">adjusted</em> (see below); however, this behavior can be modified
+(see <a class="pxref" href="#Leading-Space-Traps">Leading Space Traps</a>). Again, macro packages may provide other
+methods of producing indented paragraphs. Trailing spaces on text lines
+are discarded.<a class="footnote" id="DOCF23" href="#FOOT23"><sup>23</sup></a>
+</p>
+<p>What if the file ends before enough words have been collected to fill an
+output line? Or the output line is exactly full but not yet broken, and
+there is no more input? GNU <code class="code">troff</code> interprets the end of input as
+a break. Certain requests also cause breaks, implicitly or explicitly.
+This is discussed in <a class="ref" href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a>.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Adjustment">
+<div class="nav-panel">
+<p>
+Next: <a href="#Tabs-and-Leaders" accesskey="n" rel="next">Tabs and Leaders</a>, Previous: <a href="#Breaking" accesskey="p" rel="prev">Breaking</a>, Up: <a href="#Text" accesskey="u" rel="up">Text</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Adjustment-1">5.1.5 Adjustment</h4>
+
+<a class="index-entry-id" id="index-extra-spaces-between-words"></a>
+<p>After GNU <code class="code">troff</code> performs an automatic break, it may then
+<em class="dfn">adjust</em> the line, widening inter-word spaces until the text reaches
+the right margin. Extra spaces between words are preserved. Leading
+and trailing spaces are handled as noted above. Text can be aligned to
+the left or right margin only, or centered; see <a class="ref" href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a>.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Tabs-and-Leaders">
+<div class="nav-panel">
+<p>
+Next: <a href="#Input-Conventions" accesskey="n" rel="next">Input Conventions</a>, Previous: <a href="#Adjustment" accesskey="p" rel="prev">Adjustment</a>, Up: <a href="#Text" accesskey="u" rel="up">Text</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Tabs-and-Leaders-1">5.1.6 Tabs and Leaders</h4>
+
+<a class="index-entry-id" id="index-horizontal-tab-character"></a>
+<a class="index-entry-id" id="index-tab-character"></a>
+<a class="index-entry-id" id="index-character_002c-horizontal-tab"></a>
+<a class="index-entry-id" id="index-leader-character"></a>
+<a class="index-entry-id" id="index-character_002c-leader"></a>
+<a class="index-entry-id" id="index-tab-stops"></a>
+<a class="index-entry-id" id="index-stops_002c-tab"></a>
+<p>GNU <code class="code">troff</code> translates input horizontal tab characters (&ldquo;tabs&rdquo;)
+and <kbd class="key">Control+A</kbd> characters (&ldquo;leaders&rdquo;) into movements to the next
+tab stop. Tabs simply move to the next tab stop; leaders place enough
+periods to fill the space. Tab stops are by default located every half
+inch measured from the drawing position corresponding to the beginning
+of the input line; see <a class="ref" href="#Page-Geometry">Page Geometry</a>. Tabs and leaders do not
+cause breaks and therefore do not interrupt filling. Below, we use
+arrows &rarr; and bullets &bull; to indicate input tabs and
+leaders, respectively.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">1
+&rarr; 2 &rarr; 3 &bull; 4
+&rarr; &bull; 5
+&rArr; 1 2 3.......4 ........5
+</pre></div></div>
+
+<p>Tabs and leaders lend themselves to table construction.<a class="footnote" id="DOCF24" href="#FOOT24"><sup>24</sup></a> The tab and leader glyphs can be
+configured, and further facilities for sophisticated table composition
+are available; see <a class="ref" href="#Tabs-and-Fields">Tabs and Fields</a>. There are many details to
+track when using such low-level features, so most users turn to the
+<cite class="cite">tbl<span class="r">(1)</span></cite> preprocessor to lay out tables.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Requests-and-Macros">
+<div class="nav-panel">
+<p>
+Next: <a href="#Macro-Packages" accesskey="n" rel="next">Macro Packages</a>, Previous: <a href="#Tabs-and-Leaders" accesskey="p" rel="prev">Tabs and Leaders</a>, Up: <a href="#Text" accesskey="u" rel="up">Text</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Requests-and-Macros-1">5.1.7 Requests and Macros</h4>
+
+<p>We have now encountered almost all of the syntax there is in the
+<code class="code">roff</code> language, with an exception already noted in passing.
+<a class="index-entry-id" id="index-request"></a>
+<a class="index-entry-id" id="index-control-character-_0028_002e_0029"></a>
+<a class="index-entry-id" id="index-character_002c-control-_0028_002e_0029"></a>
+<a class="index-entry-id" id="index-no_002dbreak-control-character-_0028_0027_0029"></a>
+<a class="index-entry-id" id="index-character_002c-no_002dbreak-control-_0028_0027_0029"></a>
+<a class="index-entry-id" id="index-control-character_002c-no_002dbreak-_0028_0027_0029"></a>
+A <em class="dfn">request</em> is an instruction to the formatter that occurs after a
+<em class="dfn">control character</em>, which is recognized at the beginning of an
+input line. The regular control character is a dot (<code class="code">.</code>). Its
+counterpart, the <em class="dfn">no-break control character</em>, a neutral apostrophe
+(<code class="code">'</code>), suppresses the break that is implied by some requests.
+These characters were chosen because it is uncommon for lines of text in
+natural languages to begin with them.
+<a class="index-entry-id" id="index-dummy-character-_0028_005c_0026_0029_002c-as-control-character-suppressor"></a>
+<a class="index-entry-id" id="index-character_002c-dummy-_0028_005c_0026_0029_002c-as-control-character-suppressor"></a>
+If you require a formatted period or apostrophe (closing single
+quotation mark) where GNU <code class="code">troff</code> is expecting a control character,
+prefix the dot or neutral apostrophe with the dummy character escape
+sequence, &lsquo;<samp class="samp">\&amp;</samp>&rsquo;.
+</p>
+<a class="index-entry-id" id="index-control-line"></a>
+<p>An input line beginning with a control character is called a
+<em class="dfn">control line</em>.
+<a class="index-entry-id" id="index-text-line"></a>
+Every line of input that is not a control line is a <em class="dfn">text
+line</em>.<a class="footnote" id="DOCF25" href="#FOOT25"><sup>25</sup></a>
+</p>
+<a class="index-entry-id" id="index-argument"></a>
+<p>Requests often take <em class="dfn">arguments</em>, words (separated from the request
+name and each other by spaces) that specify details of the action GNU
+<code class="code">troff</code> is expected to perform. If a request is meaningless
+without arguments, it is typically ignored.
+</p>
+<p>GNU <code class="code">troff</code>&rsquo;s requests and escape sequences comprise the control
+language of the formatter. Of key importance are the requests that
+define macros. Macros are invoked like requests, enabling the request
+repertoire to be extended or overridden.<a class="footnote" id="DOCF26" href="#FOOT26"><sup>26</sup></a>
+</p>
+<a class="index-entry-id" id="index-macro"></a>
+<a class="index-entry-id" id="index-calling-a-macro"></a>
+<a class="index-entry-id" id="index-interpolation"></a>
+<p>A <em class="dfn">macro</em> can be thought of as an abbreviation you can define for a
+collection of control and text lines. When the macro is <em class="dfn">called</em> by
+giving its name after a control character, it is replaced with what it
+stands for. The process of textual replacement is known as
+<em class="dfn">interpolation</em>.<a class="footnote" id="DOCF27" href="#FOOT27"><sup>27</sup></a> Interpolations are handled as soon as they are
+recognized, and once performed, a <code class="code">roff</code> formatter scans the
+replacement for further requests, macro calls, and escape sequences.
+</p>
+<p>In <code class="code">roff</code> systems, the <code class="code">de</code> request defines a
+macro.<a class="footnote" id="DOCF28" href="#FOOT28"><sup>28</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de DATE
+2020-11-14
+..
+</pre></div></div>
+
+<p>The foregoing input produces no output by itself; all we have done is
+store some information. Observe the pair of dots that ends the macro
+definition. This is a default; you can specify your own terminator for
+the macro definition as the second argument to the <code class="code">de</code> request.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de NAME ENDNAME
+Heywood Jabuzzoff
+.ENDNAME
+</pre></div></div>
+
+<p>In fact, the ending marker is itself the name of a macro to be
+called, or a request to be invoked, if it is defined at the time its
+control line is read.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de END
+Big Rip
+..
+.de START END
+Big Bang
+.END
+.START
+ &rArr; Big Rip Big Bang
+</pre></div></div>
+
+<p>In the foregoing example, &ldquo;Big Rip&rdquo; printed before &ldquo;Big Bang&rdquo;
+because its macro was <em class="emph">called</em> first. Consider what would happen
+if we dropped <code class="code">END</code> from the &lsquo;<samp class="samp">.de START</samp>&rsquo; line and added
+<code class="code">..</code> after <code class="code">.END</code>. Would the order change?
+</p>
+<p>Let us consider a more elaborate example.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de DATE
+2020-10-05
+..
+.
+.de BOSS
+D.\&amp; Kruger,
+J.\&amp; Peterman
+..
+.
+.de NOTICE
+Approved:
+.DATE
+by
+.BOSS
+..
+.
+Insert tedious regulatory compliance paragraph here.
+
+.NOTICE
+
+Insert tedious liability disclaimer paragraph here.
+
+.NOTICE
+ &rArr; Insert tedious regulatory compliance paragraph here.
+ &rArr;
+ &rArr; Approved: 2020-10-05 by D. Kruger, J. Peterman
+ &rArr;
+ &rArr; Insert tedious liability disclaimer paragraph here.
+ &rArr;
+ &rArr; Approved: 2020-10-05 by D. Kruger, J. Peterman
+</pre></div></div>
+
+<p>The above document started with a series of control lines. Three macros
+were defined, with a <code class="code">de</code> request declaring each macro&rsquo;s name, and
+the &ldquo;body&rdquo; of the macro starting on the next line and continuing until
+a line with two dots &lsquo;<samp class="samp"><code class="code">..</code></samp>&rsquo; marked its end. The text proper
+began only after the macros were defined; this is a common pattern.
+Only the <code class="code">NOTICE</code> macro was called &ldquo;directly&rdquo; by the document;
+<code class="code">DATE</code> and <code class="code">BOSS</code> were called only by <code class="code">NOTICE</code> itself.
+Escape sequences were used in <code class="code">BOSS</code>, two levels of macro
+interpolation deep.
+</p>
+<p>The advantage in typing and maintenance economy may not be obvious from
+such a short example, but imagine a much longer document with dozens of
+such paragraphs, each requiring a notice of managerial approval.
+Consider what must happen if you are in charge of generating a new
+version of such a document with a different date, for a different boss.
+With well-chosen macros, you only have to change each datum in one
+place.
+</p>
+<p>In practice, we would probably use strings (see <a class="pxref" href="#Strings">Strings</a>) instead of
+macros for such simple interpolations; what is important here is to
+glimpse the potential of macros and the power of recursive
+interpolation.
+</p>
+<p>We could have defined <code class="code">DATE</code> and <code class="code">BOSS</code> in the opposite order;
+perhaps less obviously, we could also have defined them <em class="emph">after</em>
+<code class="code">NOTICE</code>. &ldquo;Forward references&rdquo; like this are acceptable because
+the body of a macro definition is not (completely) interpreted, but
+stored instead (see <a class="pxref" href="#Copy-Mode">Copy Mode</a>). While a macro is being defined (or
+appended to), requests are not interpreted and macros not interpolated,
+whereas some commonly used escape sequences <em class="emph">are</em> interpreted.
+<code class="code">roff</code> systems also support recursive macro calls, as long as you
+have a way to break the recursion (see <a class="pxref" href="#Conditionals-and-Loops">Conditionals and Loops</a>).
+Maintainable <code class="code">roff</code> documents tend to arrange macro definitions to
+minimize forward references.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Macro-Packages">
+<div class="nav-panel">
+<p>
+Next: <a href="#Input-Encodings" accesskey="n" rel="next">Input Encodings</a>, Previous: <a href="#Requests-and-Macros" accesskey="p" rel="prev">Requests and Macros</a>, Up: <a href="#Text" accesskey="u" rel="up">Text</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Macro-Packages-3">5.1.8 Macro Packages</h4>
+<a class="index-entry-id" id="index-macro-package"></a>
+<a class="index-entry-id" id="index-package_002c-macro"></a>
+
+<p>Macro definitions can be collected into <em class="dfn">macro files</em>, <code class="code">roff</code>
+input files designed to produce no output themselves but instead ease
+the preparation of other <code class="code">roff</code> documents. There is no syntactical
+difference between a macro file and any other <code class="code">roff</code> document; only
+its purpose distinguishes it. When a macro file is installed at a
+standard location and suitable for use by a general audience, it is
+often termed a <em class="dfn">macro package</em>.<a class="footnote" id="DOCF29" href="#FOOT29"><sup>29</sup></a> Macro packages can be
+loaded by supplying the <samp class="option">-m</samp> option to GNU <code class="command">troff</code> or a
+<code class="code">groff</code> front end. Alternatively, a document requiring a macro
+package can load it with the <code class="code">mso</code> (&ldquo;macro source&rdquo;) request.
+</p>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Input-Encodings">
+<div class="nav-panel">
+<p>
+Next: <a href="#Input-Conventions" accesskey="n" rel="next">Input Conventions</a>, Previous: <a href="#Macro-Packages" accesskey="p" rel="prev">Macro Packages</a>, Up: <a href="#Text" accesskey="u" rel="up">Text</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Input-Encodings-1">5.1.9 Input Encodings</h4>
+
+<p>The <code class="command">groff</code> command&rsquo;s <samp class="option">-k</samp> option calls the
+<code class="command">preconv</code> preprocessor to perform input character encoding
+conversions. Input to the GNU <code class="code">troff</code> formatter itself, on the
+other hand, must be in one of two encodings it can recognize.
+</p>
+<dl class="table">
+<dt id='index-encoding_002c-input_002c-EBCDIC'><span><code class="code">cp1047</code><a class="copiable-link" href='#index-encoding_002c-input_002c-EBCDIC'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-EBCDIC_002c-input-encoding"></a>
+<a class="index-entry-id" id="index-input-encoding_002c-EBCDIC"></a>
+<a class="index-entry-id" id="index-encoding_002c-input_002c-code-page-1047"></a>
+<a class="index-entry-id" id="index-code-page-1047_002c-input-encoding"></a>
+<a class="index-entry-id" id="index-input-encoding_002c-code-page-1047"></a>
+<a class="index-entry-id" id="index-IBM-code-page-1047-input-encoding"></a>
+<a class="index-entry-id" id="index-cp1047_002etmac"></a>
+<p>The code page 1047 input encoding works only on <abbr class="acronym">EBCDIC</abbr>
+platforms (and conversely, the other input encodings don&rsquo;t work with
+<abbr class="acronym">EBCDIC</abbr>); the file <samp class="file">cp1047.tmac</samp> is loaded at startup.
+</p>
+</dd>
+<dt id='index-encoding_002c-input_002c-Latin_002d1-_0028ISO-8859_002d1_0029'><span><code class="code">latin1</code><a class="copiable-link" href='#index-encoding_002c-input_002c-Latin_002d1-_0028ISO-8859_002d1_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-Latin_002d1-_0028ISO-8859_002d1_0029_002c-input-encoding"></a>
+<a class="index-entry-id" id="index-ISO-8859_002d1-_0028Latin_002d1_0029_002c-input-encoding"></a>
+<a class="index-entry-id" id="index-input-encoding_002c-Latin_002d1-_0028ISO-8859_002d1_0029"></a>
+<a class="index-entry-id" id="index-latin1_002etmac"></a>
+<p>ISO <span class="w-nolinebreak-text">Latin-1</span><!-- /@w -->, an encoding for Western European languages, is the
+default input encoding on non-<abbr class="acronym">EBCDIC</abbr> platforms; the file
+<samp class="file">latin1.tmac</samp> is loaded at startup.
+</p></dd>
+</dl>
+
+<p>Any document that is encoded in ISO 646:1991 (a descendant of USAS
+<span class="w-nolinebreak-text">X3.4-1968</span><!-- /@w --> or &ldquo;US-ASCII&rdquo;), or, equivalently, uses only code points
+from the &ldquo;C0 Controls&rdquo; and &ldquo;Basic Latin&rdquo; parts of the Unicode
+character set is also a valid ISO <span class="w-nolinebreak-text">Latin-1</span><!-- /@w --> document; the standards
+are interchangeable in their first 128 code points.<a class="footnote" id="DOCF30" href="#FOOT30"><sup>30</sup></a>
+</p>
+<p>Other encodings are supported by means of macro packages.
+</p>
+<dl class="table">
+<dt id='index-encoding_002c-input_002c-Latin_002d2-_0028ISO-8859_002d2_0029'><span><code class="code">latin2</code><a class="copiable-link" href='#index-encoding_002c-input_002c-Latin_002d2-_0028ISO-8859_002d2_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-Latin_002d2-_0028ISO-8859_002d2_0029_002c-input-encoding"></a>
+<a class="index-entry-id" id="index-ISO-8859_002d2-_0028Latin_002d2_0029_002c-input-encoding"></a>
+<a class="index-entry-id" id="index-input-encoding_002c-Latin_002d2-_0028ISO-8859_002d2_0029"></a>
+<a class="index-entry-id" id="index-latin2_002etmac"></a>
+<p>To use ISO <span class="w-nolinebreak-text">Latin-2</span><!-- /@w -->, an encoding for Central and Eastern European
+languages, invoke &lsquo;<samp class="samp">.mso&nbsp;latin2.tmac</samp>&rsquo;<!-- /@w --> at the beginning of your
+document or supply &lsquo;<samp class="samp">-mlatin2</samp>&rsquo; as a command-line argument to
+<code class="code">groff</code>.
+</p>
+</dd>
+<dt id='index-encoding_002c-input_002c-Latin_002d5-_0028ISO-8859_002d9_0029'><span><code class="code">latin5</code><a class="copiable-link" href='#index-encoding_002c-input_002c-Latin_002d5-_0028ISO-8859_002d9_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-Latin_002d5-_0028ISO-8859_002d9_0029_002c-input-encoding"></a>
+<a class="index-entry-id" id="index-ISO-8859_002d9-_0028Latin_002d5_0029_002c-input-encoding"></a>
+<a class="index-entry-id" id="index-input-encoding_002c-Latin_002d5-_0028ISO-8859_002d9_0029"></a>
+<a class="index-entry-id" id="index-latin5_002etmac"></a>
+<p>To use ISO <span class="w-nolinebreak-text">Latin-5</span><!-- /@w -->, an encoding for the Turkish language, invoke
+&lsquo;<samp class="samp">.mso&nbsp;latin5.tmac</samp>&rsquo;<!-- /@w --> at the beginning of your document or
+supply &lsquo;<samp class="samp">-mlatin5</samp>&rsquo; as a command-line argument to <code class="code">groff</code>.
+</p>
+</dd>
+<dt id='index-encoding_002c-input_002c-Latin_002d9-_0028ISO-8859_002d15_0029'><span><code class="code">latin9</code><a class="copiable-link" href='#index-encoding_002c-input_002c-Latin_002d9-_0028ISO-8859_002d15_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-Latin_002d9-_0028ISO-8859_002d15_0029_002c-input-encoding"></a>
+<a class="index-entry-id" id="index-ISO-8859_002d15-_0028Latin_002d9_0029_002c-input-encoding"></a>
+<a class="index-entry-id" id="index-input-encoding_002c-Latin_002d9-_0028ISO-8859_002d15_0029"></a>
+<a class="index-entry-id" id="index-latin9_002etmac"></a>
+<p>ISO <span class="w-nolinebreak-text">Latin-9</span><!-- /@w --> succeeds <span class="w-nolinebreak-text">Latin-1</span><!-- /@w -->; it includes a Euro sign and better
+glyph coverage for French. To use this encoding, invoke &lsquo;<samp class="samp">.mso&nbsp;latin9.tmac</samp>&rsquo;<!-- /@w --> at the beginning of your document or supply
+&lsquo;<samp class="samp">-mlatin9</samp>&rsquo; as a command-line argument to <code class="code">groff</code>.
+</p></dd>
+</dl>
+
+<p>Some characters from an input encoding may not be available with a
+particular output driver, or their glyphs may not have representation in
+the font used. For terminal devices, fallbacks are defined, like
+&lsquo;<samp class="samp">EUR</samp>&rsquo; for the Euro sign and &lsquo;<samp class="samp">(C)</samp>&rsquo; for the copyright sign. For
+typesetter devices, you may need to &ldquo;mount&rdquo; fonts that support glyphs
+required by the document. See <a class="xref" href="#Font-Positions">Font Positions</a>.
+</p>
+<a class="index-entry-id" id="index-freeeuro_002epfa"></a>
+<a class="index-entry-id" id="index-ec_002etmac"></a>
+<p>Because a Euro glyph was not historically defined in PostScript fonts,
+<code class="code">groff</code> comes with a font called <samp class="file">freeeuro.pfa</samp> that provides
+the Euro in several styles. Standard PostScript fonts contain the
+glyphs from <span class="w-nolinebreak-text">Latin-5</span><!-- /@w --> and <span class="w-nolinebreak-text">Latin-9</span><!-- /@w --> that <span class="w-nolinebreak-text">Latin-1</span><!-- /@w --> lacks, so these
+encodings are supported for the <samp class="option">ps</samp> and <samp class="option">pdf</samp> output
+devices as <code class="code">groff</code> ships, while <span class="w-nolinebreak-text">Latin-2</span><!-- /@w --> is not.
+</p>
+<p>Unicode supports characters from all other input encodings; the
+<samp class="option">utf8</samp> output driver for terminals therefore does as well. The
+DVI output driver supports the <span class="w-nolinebreak-text">Latin-2</span><!-- /@w --> and <span class="w-nolinebreak-text">Latin-9</span><!-- /@w --> encodings if
+the command-line option <samp class="option">-mec</samp> is used as well. <a class="footnote" id="DOCF31" href="#FOOT31"><sup>31</sup></a>
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Input-Conventions">
+<div class="nav-panel">
+<p>
+Previous: <a href="#Input-Encodings" accesskey="p" rel="prev">Input Encodings</a>, Up: <a href="#Text" accesskey="u" rel="up">Text</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Input-Conventions-1">5.1.10 Input Conventions</h4>
+<a class="index-entry-id" id="index-input-conventions"></a>
+<a class="index-entry-id" id="index-conventions-for-input"></a>
+
+<p>Since GNU <code class="code">troff</code> fills text automatically, it is common practice
+in the <code class="code">roff</code> language to avoid visual composition of text in input
+files: the esthetic appeal of the formatted output is what matters.
+Therefore, <code class="code">roff</code> input should be arranged such that it is easy for
+authors and maintainers to compose and develop the document, understand
+the syntax of <code class="code">roff</code> requests, macro calls, and preprocessor
+languages used, and predict the behavior of the formatter. Several
+traditions have accrued in service of these goals.
+</p>
+<ul class="itemize mark-bullet">
+<li>Follow sentence endings in the input with newlines to ease their
+recognition (see <a class="pxref" href="#Sentences">Sentences</a>). It is frequently convenient to end
+text lines after colons and semicolons as well, as these typically
+precede independent clauses. Consider doing so after commas; they often
+occur in lists that become easy to scan when itemized by line, or
+constitute supplements to the sentence that are added, deleted, or
+updated to clarify it. Parenthetical and quoted phrases are also good
+candidates for placement on text lines by themselves.
+
+</li><li>Set your text editor&rsquo;s line length to 72 characters or
+fewer.<a class="footnote" id="DOCF32" href="#FOOT32"><sup>32</sup></a>
+This limit, combined with the previous item of advice, makes it less
+common that an input line will wrap in your text editor, and thus will
+help you perceive excessively long constructions in your text. Recall
+that natural languages originate in speech, not writing, and that
+punctuation is correlated with pauses for breathing and changes in
+prosody.
+
+</li><li>Use <code class="code">\&amp;</code> after &lsquo;<samp class="samp">!</samp>&rsquo;, &lsquo;<samp class="samp">?</samp>&rsquo;, and &lsquo;<samp class="samp">.</samp>&rsquo; if they are
+followed by space, tab, or newline characters and don&rsquo;t end a sentence.
+
+</li><li>In filled text lines, use <code class="code">\&amp;</code> before &lsquo;<samp class="samp">.</samp>&rsquo; and &lsquo;<samp class="samp">'</samp>&rsquo; if they
+are preceded by space, so that reflowing the input doesn&rsquo;t turn them
+into control lines.
+
+</li><li>Do not use spaces to perform indentation or align columns of a table.
+Leading spaces are reliable when text is not being filled.
+
+</li><li>Comment your document. It is never too soon to apply comments to
+record information of use to future document maintainers (including your
+future self). We thus introduce another escape sequence, <code class="code">\&quot;</code>,
+which causes GNU <code class="code">troff</code> to ignore the remainder of the input line.
+
+</li><li>Use the empty request&mdash;a control character followed immediately by a
+newline&mdash;to visually manage separation of material in input files.
+Many of the <code class="code">groff</code> project&rsquo;s own documents use an empty request
+between sentences, after macro definitions, and where a break is
+expected, and two empty requests between paragraphs or other requests or
+macro calls that will introduce vertical space into the document.
+
+<p>You can combine the empty request with the comment escape sequence to
+include whole-line comments in your document, and even &ldquo;comment out&rdquo;
+sections of it.
+</p></li></ul>
+
+<p>We conclude this section with an example sufficiently long to illustrate
+most of the above suggestions in practice. For the purpose of fitting
+the example between the margins of this manual with the font used for
+its typeset version, we have shortened the input line length to 56
+columns. As before, an arrow &rarr; indicates a tab character.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.\&quot; nroff this_file.roff | less
+.\&quot; groff -T ps this_file.roff &gt; this_file.ps
+&rarr;The theory of relativity is intimately connected with
+the theory of space and time.
+.
+I shall therefore begin with a brief investigation of
+the origin of our ideas of space and time,
+although in doing so I know that I introduce a
+controversial subject. \&quot; remainder of paragraph elided
+.
+.
+
+&rarr;The experiences of an individual appear to us arranged
+in a series of events;
+in this series the single events which we remember
+appear to be ordered according to the criterion of
+\[lq]earlier\[rq] and \[lq]later\[rq], \&quot; punct swapped
+which cannot be analysed further.
+.
+There exists,
+therefore,
+for the individual,
+an I-time,
+or subjective time.
+.
+This itself is not measurable.
+.
+I can,
+indeed,
+associate numbers with the events,
+in such a way that the greater number is associated with
+the later event than with an earlier one;
+but the nature of this association may be quite
+arbitrary.
+.
+This association I can define by means of a clock by
+comparing the order of events furnished by the clock
+with the order of a given series of events.
+.
+We understand by a clock something which provides a
+series of events which can be counted,
+and which has other properties of which we shall speak
+later.
+.\&quot; Albert Einstein, _The Meaning of Relativity_, 1922
+</pre></div>
+</td></tr></table>
+
+<hr>
+</div>
+</div>
+<div class="section-level-extent" id="Page-Geometry">
+<div class="nav-panel">
+<p>
+Next: <a href="#Measurements" accesskey="n" rel="next">Measurements</a>, Previous: <a href="#Text" accesskey="p" rel="prev">Text</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Page-Geometry-1">5.2 Page Geometry</h3>
+<a class="index-entry-id" id="index-page_002c-geometry-of"></a>
+<a class="index-entry-id" id="index-geometry_002c-page"></a>
+
+<p><code class="code">roff</code> systems format text under certain assumptions about the size
+of the output medium, or page. For the formatter to correctly break a
+line it is filling, it must know the line length, which it derives from
+the page width (see <a class="pxref" href="#Line-Layout">Line Layout</a>). For it to decide whether to write
+an output line to the current page or wait until the next one, it must
+know the page length (see <a class="pxref" href="#Page-Layout">Page Layout</a>).
+</p>
+<a class="index-entry-id" id="index-device-resolution"></a>
+<a class="index-entry-id" id="index-resolution_002c-device"></a>
+<a class="index-entry-id" id="index-basic-units"></a>
+<a class="index-entry-id" id="index-units_002c-basic"></a>
+<a class="index-entry-id" id="index-machine-units"></a>
+<a class="index-entry-id" id="index-units_002c-machine"></a>
+<p>A device&rsquo;s <em class="dfn">resolution</em> converts practical units like inches or
+centimeters to <em class="dfn">basic units</em>, a convenient length measure for the
+output device or file format. The formatter and output driver use basic
+units to reckon page measurements. The device description file defines
+its resolution and page dimensions (see <a class="pxref" href="#DESC-File-Format"><samp class="file">DESC</samp> File Format</a>).
+</p>
+<a class="index-entry-id" id="index-page"></a>
+<p>A <em class="dfn">page</em> is a two-dimensional structure upon which a <code class="code">roff</code>
+system imposes a rectangular coordinate system with its upper left
+corner as the origin. Coordinate values are in basic units and increase
+down and to the right. Useful ones are therefore always positive and
+within numeric ranges corresponding to the page boundaries.
+</p>
+<a class="index-entry-id" id="index-drawing-position"></a>
+<a class="index-entry-id" id="index-position_002c-drawing"></a>
+<p>While the formatter (and, later, output driver) is processing a page, it
+keeps track of its <em class="dfn">drawing position</em>, which is the location at
+which the next glyph will be written, from which the next motion will be
+measured, or where a geometric object will commence rendering.
+<a class="index-entry-id" id="index-text-baseline"></a>
+<a class="index-entry-id" id="index-baseline_002c-text"></a>
+Notionally, glyphs are drawn from the text baseline upward and to the
+right.<a class="footnote" id="DOCF33" href="#FOOT33"><sup>33</sup></a> The <em class="dfn">text baseline</em> is a (usually invisible) line upon
+which the glyphs of a typeface are aligned. A glyph therefore
+&ldquo;starts&rdquo; at its bottom-left corner. If drawn at the origin, a typical
+letter glyph would lie partially or wholly off the page, depending on
+whether, like &ldquo;g&rdquo;, it features a descender below the baseline.
+</p>
+<a class="index-entry-id" id="index-page-offset"></a>
+<a class="index-entry-id" id="index-offset_002c-page"></a>
+<p>Such a situation is nearly always undesirable. It is furthermore
+conventional not to write or draw at the extreme edges of the page.
+Therefore the initial drawing position of a <code class="code">roff</code> formatter is not
+at the origin, but below and to the right of it. This rightward shift
+from the left edge is known as the <em class="dfn">page
+offset</em>.<a class="footnote" id="DOCF34" href="#FOOT34"><sup>34</sup></a> The downward shift leaves room for a text output
+line.
+</p>
+<p>Text is arranged on a one-dimensional lattice of text baselines from the
+top to the bottom of the page.
+<a class="index-entry-id" id="index-vertical-spacing"></a>
+<a class="index-entry-id" id="index-spacing_002c-vertical"></a>
+<a class="index-entry-id" id="index-vee"></a>
+<em class="dfn">Vertical spacing</em> is the distance between adjacent text baselines.
+Typographic tradition sets this quantity to 120% of the type size. The
+initial drawing position is one unit of vertical spacing below the page
+top. Typographers term this unit a <i class="slanted">vee</i>.
+</p>
+<a class="index-entry-id" id="index-page-break"></a>
+<a class="index-entry-id" id="index-break_002c-page"></a>
+<a class="index-entry-id" id="index-page-ejection"></a>
+<a class="index-entry-id" id="index-ejection_002c-page"></a>
+<p>Vertical spacing has an impact on page-breaking decisions. Generally,
+when a break occurs, the formatter moves the drawing position to the
+next text baseline automatically. If the formatter were already writing
+to the last line that would fit on the page, advancing by one vee would
+place the next text baseline off the page. Rather than let that happen,
+<code class="code">roff</code> formatters instruct the output driver to eject the page,
+start a new one, and again set the drawing position to one vee below the
+page top; this is a <em class="dfn">page break</em>.
+</p>
+<p>When the last line of input text corresponds to the last output line
+that fits on the page, the break caused by the end of input will also
+break the page, producing a useless blank one. Macro packages keep
+users from having to confront this difficulty by setting &ldquo;traps&rdquo;
+(see <a class="pxref" href="#Traps">Traps</a>); moreover, all but the simplest page layouts tend to
+have headers and footers, or at least bear vertical margins larger than
+one vee.
+</p>
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Measurements">
+<div class="nav-panel">
+<p>
+Next: <a href="#Numeric-Expressions" accesskey="n" rel="next">Numeric Expressions</a>, Previous: <a href="#Text" accesskey="p" rel="prev">Text</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Measurements-1">5.3 Measurements</h3>
+<a class="index-entry-id" id="index-measurements"></a>
+<a class="index-entry-id" id="index-scaling-indicator"></a>
+<a class="index-entry-id" id="index-indicator_002c-scaling"></a>
+
+<a class="index-entry-id" id="index-units-of-measurement"></a>
+<a class="index-entry-id" id="index-measurement-units"></a>
+<p>The formatter sometimes requires the input of numeric parameters to
+specify measurements. These are specified as integers or decimal
+fractions with an optional <em class="dfn">scaling unit</em> suffixed. A scaling unit
+is a letter that immediately follows the last digit of a number. Digits
+after the decimal point are optional. Measurement expressions include
+&lsquo;<samp class="samp">10.5p</samp>&rsquo;, &lsquo;<samp class="samp">11i</samp>&rsquo;, and &lsquo;<samp class="samp">3.c</samp>&rsquo;.
+</p>
+<a class="index-entry-id" id="index-basic-units_002c-conversion-to"></a>
+<a class="index-entry-id" id="index-units_002c-basic_002c-conversion-to"></a>
+<a class="index-entry-id" id="index-conversion-to-basic-units"></a>
+<p>Measurements are scaled by the scaling unit and stored internally (with
+any fractional part discarded) in basic units.
+<a class="index-entry-id" id="index-device-resolution_002c-obtaining-in-the-formatter"></a>
+<a class="index-entry-id" id="index-resolution_002c-device_002c-obtaining-in-the-formatter"></a>
+The device resolution can therefore be obtained by storing a value of
+&lsquo;<samp class="samp">1i</samp>&rsquo; to a register. The only constraint on the basic unit is that
+it is at least as small as any other unit.
+</p>
+<dl class="table">
+<dd><a class="index-entry-id" id="index-basic-scaling-unit-_0028u_0029"></a>
+<a class="index-entry-id" id="index-u-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-u"></a>
+<a class="index-entry-id" id="index-scaling-unit-u"></a>
+</dd>
+<dt><code class="code">u</code></dt>
+<dd><p>Basic unit.
+</p>
+</dd>
+<dt id='index-inch-scaling-unit-_0028i_0029'><span><code class="code">i</code><a class="copiable-link" href='#index-inch-scaling-unit-_0028i_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-i-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-i"></a>
+<a class="index-entry-id" id="index-scaling-unit-i"></a>
+<p>Inch; defined as 2.54&nbsp;centimeters.
+</p>
+</dd>
+<dt id='index-centimeter-scaling-unit-_0028c_0029'><span><code class="code">c</code><a class="copiable-link" href='#index-centimeter-scaling-unit-_0028c_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-c-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-c"></a>
+<a class="index-entry-id" id="index-scaling-unit-c"></a>
+<p>Centimeter; a centimeter is about 0.3937&nbsp;inches.
+</p>
+</dd>
+<dt id='index-point-scaling-unit-_0028p_0029'><span><code class="code">p</code><a class="copiable-link" href='#index-point-scaling-unit-_0028p_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-p-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-p"></a>
+<a class="index-entry-id" id="index-scaling-unit-p"></a>
+<p>Point; a typesetter&rsquo;s unit used for measuring type size.
+There are 72&nbsp;points to an inch.
+</p>
+</dd>
+<dt id='index-pica-scaling-unit-_0028P_0029'><span><code class="code">P</code><a class="copiable-link" href='#index-pica-scaling-unit-_0028P_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-P-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-P"></a>
+<a class="index-entry-id" id="index-scaling-unit-P"></a>
+<p>Pica; another typesetter&rsquo;s unit. There are 6&nbsp;picas to an inch and
+12&nbsp;points to a pica.
+</p>
+</dd>
+<dt><code class="code">s</code></dt>
+<dt><code class="code">z</code></dt>
+<dd><p>See <a class="xref" href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a>, for a discussion of these units.
+</p>
+</dd>
+<dt><code class="code">f</code></dt>
+<dd><p>GNU <code class="code">troff</code> defines this unit to scale decimal fractions in the
+interval [0, 1] to 16-bit unsigned integers. It multiplies a quantity
+by 65,536. See <a class="xref" href="#Colors">Colors</a>, for usage.
+</p></dd>
+</dl>
+
+<p>The magnitudes of other scaling units depend on the text formatting
+parameters in effect. These are useful when specifying measurements
+that need to scale with the typeface or vertical spacing.
+</p>
+<dl class="table">
+<dt id='index-em-scaling-unit-_0028m_0029'><span><code class="code">m</code><a class="copiable-link" href='#index-em-scaling-unit-_0028m_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-m-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-m"></a>
+<a class="index-entry-id" id="index-scaling-unit-m"></a>
+<p>Em; an em is equal to the current type size in points. It is named thus
+because it is approximately the width of the letter&nbsp;&lsquo;<samp class="samp">M</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-en-scaling-unit-_0028n_0029'><span><code class="code">n</code><a class="copiable-link" href='#index-en-scaling-unit-_0028n_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-n-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-n"></a>
+<a class="index-entry-id" id="index-scaling-unit-n"></a>
+<p>En; an en is one-half em.
+</p>
+</dd>
+<dt id='index-vertical-space-unit-_0028v_0029'><span><code class="code">v</code><a class="copiable-link" href='#index-vertical-space-unit-_0028v_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-space_002c-vertical_002c-unit-_0028v_0029"></a>
+<a class="index-entry-id" id="index-vee-scaling-unit-_0028v_0029"></a>
+<a class="index-entry-id" id="index-v-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-v"></a>
+<a class="index-entry-id" id="index-scaling-unit-v"></a>
+<p>Vee; recall <a class="ref" href="#Page-Geometry">Page Geometry</a>.
+</p>
+</dd>
+<dt id='index-M-scaling-unit'><span><code class="code">M</code><a class="copiable-link" href='#index-M-scaling-unit'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-unit_002c-scaling_002c-M"></a>
+<a class="index-entry-id" id="index-scaling-unit-M"></a>
+<p>Hundredth of an em.
+</p></dd>
+</dl>
+
+
+
+<ul class="mini-toc">
+<li><a href="#Motion-Quanta" accesskey="1">Motion Quanta</a></li>
+<li><a href="#Default-Units" accesskey="2">Default Units</a></li>
+</ul>
+<hr>
+<div class="subsection-level-extent" id="Motion-Quanta">
+<div class="nav-panel">
+<p>
+Next: <a href="#Default-Units" accesskey="n" rel="next">Default Units</a>, Previous: <a href="#Measurements" accesskey="p" rel="prev">Measurements</a>, Up: <a href="#Measurements" accesskey="u" rel="up">Measurements</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Motion-Quanta-1">5.3.1 Motion Quanta</h4>
+<a class="index-entry-id" id="index-motion-quanta"></a>
+<a class="index-entry-id" id="index-quanta_002c-motion"></a>
+
+<p>An output device&rsquo;s basic unit <code class="code">u</code> is not necessarily its smallest
+addressable length; <code class="code">u</code> can be smaller to avoid problems with
+integer roundoff. The minimum distances that a device can work with in
+the horizontal and vertical directions are termed its <em class="dfn">motion
+quanta</em>. Measurements are rounded to applicable motion quanta.
+Half-quantum fractions round toward zero.
+</p>
+<a class="index-entry-id" id="index-horizontal-motion-quantum-register-_0028_002eH_0029"></a>
+<a class="index-entry-id" id="index-motion-quantum_002c-horizontal_002c-register-_0028_002eH_0029"></a>
+<a class="index-entry-id" id="index-horizontal-resolution-register-_0028_002eH_0029"></a>
+<a class="index-entry-id" id="index-resolution_002c-horizontal_002c-register-_0028_002eH_0029"></a>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002eH_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.H]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eH_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eH"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eV_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.V]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eV_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eV"></a>
+<p>These read-only registers interpolate the horizontal and vertical motion
+quanta, respectively, of the output device in basic units.
+</p></dd></dl>
+
+<p>For example, we might draw short baseline rules on a terminal device as
+follows. See <a class="xref" href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.tm \n[.H]
+ error&rarr; 24
+.nf
+\l'36u' 36u
+\l'37u' 37u
+ &rArr; _ 36u
+ &rArr; __ 37u
+</pre></div></div>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Default-Units">
+<div class="nav-panel">
+<p>
+Previous: <a href="#Motion-Quanta" accesskey="p" rel="prev">Motion Quanta</a>, Up: <a href="#Measurements" accesskey="u" rel="up">Measurements</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Default-Units-1">5.3.2 Default Units</h4>
+<a class="index-entry-id" id="index-default-units"></a>
+<a class="index-entry-id" id="index-units_002c-default"></a>
+
+<p>A general-purpose register (one created or updated with the <code class="code">nr</code>
+request; see see <a class="pxref" href="#Registers">Registers</a>) is implicitly dimensionless, or reckoned
+in basic units if interpreted in a measurement context. But it is
+convenient for many requests and escape sequences to infer a scaling
+unit for an argument if none is specified. An explicit scaling unit
+(not after a closing parenthesis) can override an undesirable default.
+Effectively, the default unit is suffixed to the expression if a scaling
+unit is not already present. GNU <code class="code">troff</code>&rsquo;s use of integer
+arithmetic should also be kept in mind (see <a class="pxref" href="#Numeric-Expressions">Numeric Expressions</a>).
+</p>
+<p>The <code class="code">ll</code> request interprets its argument in ems by default.
+Consider several attempts to set a line length of 3.5&nbsp;inches when
+the type size is 10&nbsp;points on a terminal device with a resolution
+of 240 basic units and horizontal motion quantum of 24. Some
+expressions become zero; the request clamps them to that quantum.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 3.5i \&quot; 3.5i (= 840u)
+.ll 7/2 \&quot; 7u/2u -&gt; 3u -&gt; 3m -&gt; 0, clamped to 24u
+.ll (7 / 2)u \&quot; 7u/2u -&gt; as above
+.ll 7/2i \&quot; 7u/2i -&gt; 7u/480u -&gt; 0 -&gt; as above
+.ll 7i/2 \&quot; 7i/2u -&gt; 1680u/2m -&gt; 1680u/24u -&gt; 35u
+.ll 7i/2u \&quot; 3.5i (= 840u)
+</pre></div></div>
+
+<a class="index-entry-id" id="index-measurements_002c-specifying-safely"></a>
+<p>The safest way to specify measurements is to attach a scaling unit. To
+multiply or divide by a dimensionless quantity, use &lsquo;<samp class="samp">u</samp>&rsquo; as its
+scaling unit.
+</p>
+
+
+<hr>
+</div>
+</div>
+<div class="section-level-extent" id="Numeric-Expressions">
+<div class="nav-panel">
+<p>
+Next: <a href="#Identifiers" accesskey="n" rel="next">Identifiers</a>, Previous: <a href="#Measurements" accesskey="p" rel="prev">Measurements</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Numeric-Expressions-1">5.4 Numeric Expressions</h3>
+<a class="index-entry-id" id="index-numeric-expressions"></a>
+<a class="index-entry-id" id="index-expressions_002c-numeric"></a>
+
+<p>A <em class="dfn">numeric expression</em> evaluates to an integer: it can be as
+simple as a literal &lsquo;<samp class="samp">0</samp>&rsquo; or it can be a complex sequence of register
+and string interpolations interleaved with measurements and operators.
+</p>
+<p>GNU <code class="code">troff</code> provides a set of mathematical and logical operators
+familiar to programmers&mdash;as well as some unusual ones&mdash;but supports
+only integer arithmetic.<a class="footnote" id="DOCF35" href="#FOOT35"><sup>35</sup></a> The internal data type
+used for computing results is usually a 32-bit signed integer, which
+suffices to represent magnitudes within a range of ±2
+billion.<a class="footnote" id="DOCF36" href="#FOOT36"><sup>36</sup></a>
+</p>
+<a class="index-entry-id" id="index-arithmetic-operators"></a>
+<a class="index-entry-id" id="index-operators_002c-arithmetic"></a>
+<a class="index-entry-id" id="index-truncating-division"></a>
+<a class="index-entry-id" id="index-addition"></a>
+<a class="index-entry-id" id="index-subtraction"></a>
+<a class="index-entry-id" id="index-multiplication"></a>
+<a class="index-entry-id" id="index-division_002c-truncating"></a>
+<a class="index-entry-id" id="index-modulus"></a>
+<a class="index-entry-id" id="index-_002b"></a>
+<a class="index-entry-id" id="index-_002d"></a>
+<a class="index-entry-id" id="index-_002a"></a>
+<a class="index-entry-id" id="index-_002f"></a>
+<a class="index-entry-id" id="index-_0025"></a>
+<p>Arithmetic infix operators perform a function on the numeric expressions
+to their left and right; they are <code class="code">+</code> (addition), <code class="code">-</code>
+(subtraction), <code class="code">*</code> (multiplication), <code class="code">/</code> (truncating
+division), and <code class="code">%</code> (modulus). <em class="dfn">Truncating division</em> rounds to
+the integer nearer to zero, no matter how large the fractional portion.
+Overflow and division (or modulus) by zero are errors and abort
+evaluation of a numeric expression.
+<a class="index-entry-id" id="index-unary-arithmetic-operators"></a>
+<a class="index-entry-id" id="index-operators_002c-unary-arithmetic"></a>
+<a class="index-entry-id" id="index-negation"></a>
+<a class="index-entry-id" id="index-assertion-_0028arithmetic-operator_0029"></a>
+<a class="index-entry-id" id="index-_002d-1"></a>
+<a class="index-entry-id" id="index-_002b-1"></a>
+<a class="index-entry-id" id="index-if-request_002c-and-the-_0021-operator"></a>
+<a class="index-entry-id" id="index-while-request_002c-and-the-_0021-operator"></a>
+</p>
+<p>Arithmetic unary operators operate on the numeric expression to their
+right; they are <code class="code">-</code> (negation) and <code class="code">+</code> (assertion&mdash;for
+completeness; it does nothing). The unary minus must often be used
+with parentheses to avoid confusion with the decrementation operator,
+discussed below.
+</p>
+<p>Observe the rounding behavior and effect of negative operands on the
+modulus and truncating division operators.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr T 199/100
+.nr U 5/2
+.nr V (-5)/2
+.nr W 5/-2
+.nr X 5%2
+.nr Y (-5)%2
+.nr Z 5%-2
+T=\n[T] U=\n[U] V=\n[V] W=\n[W] X=\n[X] Y=\n[Y] Z=\n[Z]
+ &rArr; T=1 U=2 V=-2 W=-2 X=1 Y=-1 Z=1
+</pre></div></div>
+
+<p>The sign of the modulus of operands of mixed signs is determined by the
+sign of the first. Division and modulus operators satisfy the following
+property: given a dividend&nbsp;<var class="var">a</var> and a divisor&nbsp;<var class="var">b</var>, a
+quotient&nbsp;<var class="var">q</var> formed by &lsquo;<samp class="samp">(a / b)</samp>&rsquo; and a
+remainder&nbsp;<var class="var">r</var> by &lsquo;<samp class="samp">(a % b)</samp>&rsquo;, then <em class="math">qb + r = a</em>.
+</p>
+<a class="index-entry-id" id="index-scaling-operator"></a>
+<a class="index-entry-id" id="index-operator_002c-scaling"></a>
+<a class="index-entry-id" id="index-_003b"></a>
+<p>GNU <code class="code">troff</code>&rsquo;s scaling operator, used with parentheses as
+<code class="code">(<var class="var">c</var>;<var class="var">e</var>)</code>, evaluates a numeric expression&nbsp;<var class="var">e</var>
+using&nbsp;<var class="var">c</var> as the default scaling unit. If <var class="var">c</var> is omitted,
+scaling units are ignored in the evaluation of&nbsp;<var class="var">e</var>. This
+operator can save typing by avoiding the attachment of scaling units to
+every operand out of caution. Your macros can select a sensible default
+unit in case the user neglects to supply one.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.\&quot; Indent by amount given in first argument; assume ens.
+.de Indent
+. in (n;\\$1)
+..
+</pre></div></div>
+
+<p>Without the scaling operator, the foregoing macro would, if called with
+a unitless argument, cause indentation by the <code class="code">in</code> request&rsquo;s
+default scaling unit (ems). The result would be twice as much
+indentation as expected.
+</p>
+<a class="index-entry-id" id="index-extremum-operators-_0028_003e_003f_002c-_003c_003f_0029"></a>
+<a class="index-entry-id" id="index-operators_002c-extremum-_0028_003e_003f_002c-_003c_003f_0029"></a>
+<a class="index-entry-id" id="index-maximum-operator"></a>
+<a class="index-entry-id" id="index-minimum-operator"></a>
+<a class="index-entry-id" id="index-_003e_003f"></a>
+<a class="index-entry-id" id="index-_003c_003f"></a>
+<p>GNU <code class="code">troff</code> also provides a pair of operators to compute the
+extrema of two operands: <code class="code">&gt;?</code> (maximum) and <code class="code">&lt;?</code> (minimum).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr slots 5
+.nr candidates 3
+.nr salaries (\n[slots] &lt;? \n[candidates])
+Looks like we'll end up paying \n[salaries] salaries.
+ &rArr; Looks like we'll end up paying 3 salaries.
+</pre></div></div>
+
+<a class="index-entry-id" id="index-comparison-operators"></a>
+<a class="index-entry-id" id="index-operators_002c-comparison"></a>
+<a class="index-entry-id" id="index-greater-than-_0028or-equal-to_0029-operator"></a>
+<a class="index-entry-id" id="index-less-than-_0028or-equal-to_0029-operator"></a>
+<a class="index-entry-id" id="index-equality-operator"></a>
+<a class="index-entry-id" id="index-_003c"></a>
+<a class="index-entry-id" id="index-_003e"></a>
+<a class="index-entry-id" id="index-_003e_003d"></a>
+<a class="index-entry-id" id="index-_003c_003d"></a>
+<a class="index-entry-id" id="index-_003d"></a>
+<a class="index-entry-id" id="index-_003d_003d"></a>
+<p>Comparison operators comprise <code class="code">&lt;</code> (less than), <code class="code">&gt;</code> (greater
+than), <code class="code">&lt;=</code> (less than or equal), <code class="code">&gt;=</code> (greater than or
+equal), and <code class="code">=</code> (equal). <code class="code">==</code> is a synonym for <code class="code">=</code>.
+When evaluated, a comparison is replaced with &lsquo;<samp class="samp">0</samp>&rsquo; if it is false
+and &lsquo;<samp class="samp">1</samp>&rsquo; if true. In the <code class="code">roff</code> language, positive values are
+true, others false.
+</p>
+<a class="index-entry-id" id="index-logical-operators"></a>
+<a class="index-entry-id" id="index-operators_002c-logical"></a>
+<a class="index-entry-id" id="index-logical-_0060_0060and_0027_0027-operator"></a>
+<a class="index-entry-id" id="index-logical-conjunction-operator"></a>
+<a class="index-entry-id" id="index-logical-_0060_0060or_0027_0027-operator"></a>
+<a class="index-entry-id" id="index-logical-disjunction-operator"></a>
+<a class="index-entry-id" id="index-_0026"></a>
+<a class="index-entry-id" id="index-_003a"></a>
+<p>We can operate on truth values with the logical operators <code class="code">&amp;</code>
+(logical conjunction or &ldquo;and&rdquo;) and <code class="code">:</code> (logical disjunction or
+&ldquo;or&rdquo;). They evaluate as comparison operators do.
+</p>
+<a class="index-entry-id" id="index-_0021"></a>
+<a class="index-entry-id" id="index-complementation_002c-logical"></a>
+<a class="index-entry-id" id="index-logical-complementation-operator"></a>
+<a class="index-entry-id" id="index-logical-not_002c-limitation-in-expression"></a>
+<a class="index-entry-id" id="index-expression_002c-limitation-of-logical-not-in"></a>
+<p>A logical complementation (&ldquo;not&rdquo;) operator, <code class="code">!</code>, works only
+within <code class="code">if</code>, <code class="code">ie</code>, and <code class="code">while</code> requests.
+Furthermore, <code class="code">!</code> is recognized only at the beginning of a numeric
+expression not contained by another numeric expression. In other words,
+it must be the &ldquo;outermost&rdquo; operator. Including it elsewhere in the
+expression produces a warning in the &lsquo;<samp class="samp">number</samp>&rsquo; category
+(see <a class="pxref" href="#Warnings">Warnings</a>), and its expression evaluates false. This
+unfortunate limitation maintains compatibility with <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code>. Test a numeric expression for falsity by
+comparing it to a false value.<a class="footnote" id="DOCF37" href="#FOOT37"><sup>37</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr X 1
+.nr Y 0
+.\&quot; This does not work as expected.
+.if (\n[X])&amp;(!\n[Y]) .nop A: X is true, Y is false
+.
+.\&quot; Use this construct instead.
+.if (\n[X])&amp;(\n[Y]&lt;=0) .nop B: X is true, Y is false
+ error&rarr; warning: expected numeric expression, got '!'
+ &rArr; B: X is true, Y is false
+</pre></div></div>
+
+<a class="index-entry-id" id="index-parentheses"></a>
+<a class="index-entry-id" id="index-order-of-evaluation-in-expressions"></a>
+<a class="index-entry-id" id="index-expression_002c-order-of-evaluation"></a>
+<a class="index-entry-id" id="index-_0028"></a>
+<a class="index-entry-id" id="index-_0029"></a>
+<p>The <code class="code">roff</code> language has no operator precedence: expressions are
+evaluated strictly from left to right, in contrast to schoolhouse
+arithmetic. Use parentheses <code class="code">(</code> <code class="code">)</code> to impose a desired
+precedence upon subexpressions.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr X 3+5*4
+.nr Y (3+5)*4
+.nr Z 3+(5*4)
+X=\n[X] Y=\n[Y] Z=\n[Z]
+ &rArr; X=32 Y=32 Z=23
+</pre></div></div>
+
+<a class="index-entry-id" id="index-_002b_002c-and-page-motion"></a>
+<a class="index-entry-id" id="index-_002d_002c-and-page-motion"></a>
+<a class="index-entry-id" id="index-motion-operators"></a>
+<a class="index-entry-id" id="index-operators_002c-motion"></a>
+<a class="index-entry-id" id="index-_002b-_0028unary_0029"></a>
+<a class="index-entry-id" id="index-_002d-_0028unary_0029"></a>
+<p>For many requests and escape sequences that cause motion on the page,
+the unary operators <code class="code">+</code> and <code class="code">-</code> work differently when leading
+a numeric expression. They then indicate a motion relative to the
+drawing position: positive is down in vertical contexts, right in
+horizontal ones.
+</p>
+<a class="index-entry-id" id="index-bp-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-in-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-ll-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-lt-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-nm-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-nr-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-pl-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-pn-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-po-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-ps-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-pvs-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-rt-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-ti-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-_005cH_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-_005cR_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-_005cs_002c-using-_002b-and-_002d-with"></a>
+<p><code class="code">+</code> and <code class="code">-</code> are also treated differently by the following
+requests and escape sequences: <code class="code">bp</code>, <code class="code">in</code>, <code class="code">ll</code>,
+<code class="code">lt</code>, <code class="code">nm</code>, <code class="code">nr</code>, <code class="code">pl</code>, <code class="code">pn</code>, <code class="code">po</code>,
+<code class="code">ps</code>, <code class="code">pvs</code>, <code class="code">rt</code>, <code class="code">ti</code>, <code class="code">\H</code>, <code class="code">\R</code>, and
+<code class="code">\s</code>. Here, leading plus and minus signs serve as incrementation
+and decrementation operators, respectively. To negate an expression,
+subtract it from zero or include the unary minus in parentheses with its
+argument. See <a class="xref" href="#Setting-Registers">Setting Registers</a>, for examples.
+</p>
+<a class="index-entry-id" id="index-_007c"></a>
+<a class="index-entry-id" id="index-_007c_002c-and-page-motion"></a>
+<a class="index-entry-id" id="index-absolute-_0028sic_0029-position-operator-_0028_007c_0029"></a>
+<a class="index-entry-id" id="index-position_002c-absolute-_0028sic_0029-operator-_0028_007c_0029"></a>
+<a class="index-entry-id" id="index-boundary_002drelative-motion-operator-_0028_007c_0029"></a>
+<p>A leading <code class="code">|</code> operator indicates a motion relative not to the
+drawing position but to a boundary. For horizontal motions, the
+measurement specifies a distance relative to a drawing position
+corresponding to the beginning of the <em class="emph">input</em> line. By default,
+tab stops reckon movements in this way. Most escape sequences do not;
+<code class="code">|</code> tells them to do so.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">Mind the \h'1.2i'gap.
+.br
+Mind the \h'|1.2i'gap.
+.br
+Mind the
+\h'|1.2i'gap.
+ &rArr; Mind the gap.
+ &rArr; Mind the gap.
+ &rArr; Mind the gap.
+</pre></div></div>
+
+<p>One use of this feature is to define macros whose scope is limited to
+the output they format.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.\&quot; underline word $1 with trailing punctuation $2
+.de Underline
+. nop \\$1\l'|0\[ul]'\\$2
+..
+Typographical emphasis is best used
+.Underline sparingly .
+</pre></div></div>
+
+<p>In the above example, &lsquo;<samp class="samp">|0</samp>&rsquo; specifies a negative motion from the
+current position (at the end of the argument just emitted, <code class="code">\$1</code>)
+to the beginning of the input line. Thus, the <code class="code">\l</code> escape sequence
+in this case draws a line from right to left. A macro call occurs at
+the beginning of an input line;<a class="footnote" id="DOCF38" href="#FOOT38"><sup>38</sup></a> if the <code class="code">|</code>
+operator were omitted, then the underline would be drawn at zero
+distance from the current position, producing device-dependent, and
+likely undesirable, results. On the &lsquo;<samp class="samp">ps</samp>&rsquo; output device, it
+underlines the period.
+</p>
+<p>For vertical motions, the <code class="code">|</code> operator specifies a distance from
+the first text baseline on the page or in the current
+diversion,<a class="footnote" id="DOCF39" href="#FOOT39"><sup>39</sup></a> using the current vertical
+spacing.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">A
+.br
+B \Z'C'\v'|0'D
+ &rArr; A D
+ &rArr; B C
+</pre></div></div>
+
+<p>In the foregoing example, we&rsquo;ve used the <code class="code">\Z</code> escape sequence
+(see <a class="pxref" href="#Page-Motions">Page Motions</a>) to restore the drawing position after formatting
+&lsquo;<samp class="samp">C</samp>&rsquo;, then moved vertically to the first text baseline on the page.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cB_0027anything_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\B<code class="code">'</code></code><span class="r"><i class="slanted">anything</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cB_0027anything_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cB"></a>
+<a class="index-entry-id" id="index-numeric-expression_002c-valid"></a>
+<a class="index-entry-id" id="index-valid-numeric-expression"></a>
+<p>Interpolate&nbsp;1 if <var class="var">anything</var> is a valid numeric expression,
+and&nbsp;0 otherwise. The delimiter need not be a neutral apostrophe;
+see <a class="ref" href="#Delimiters">Delimiters</a>.
+</p></dd></dl>
+
+<p>You might use <code class="code">\B</code> along with the <code class="code">if</code> request to filter out
+invalid macro or string arguments. See <a class="xref" href="#Conditionals-and-Loops">Conditionals and Loops</a>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.\&quot; Indent by amount given in first argument; assume ens.
+.de Indent
+. if \B'\\$1' .in (n;\\$1)
+..
+</pre></div></div>
+
+<p>A register interpolated as an operand in a numeric expression must have
+an Arabic format; luckily, this is the default. See <a class="xref" href="#Assigning-Register-Formats">Assigning Register Formats</a>.
+</p>
+<a class="index-entry-id" id="index-space-characters_002c-in-expressions"></a>
+<a class="index-entry-id" id="index-expressions_002c-and-space-characters"></a>
+<p>Because spaces separate arguments to requests, spaces are not allowed in
+numeric expressions unless the (sub)expression containing them is
+surrounded by parentheses. See <a class="xref" href="#Invoking-Requests">Invoking Requests</a>, and
+<a class="ref" href="#Conditionals-and-Loops">Conditionals and Loops</a>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nf
+.nr a 1+2 + 2+1
+\na
+ error&rarr; expected numeric expression, got a space
+ &rArr; 3
+.nr a 1+(2 + 2)+1
+\na
+ &rArr; 6
+</pre></div></div>
+
+<p>The <code class="code">nr</code> request (see <a class="pxref" href="#Setting-Registers">Setting Registers</a>) expects its second and
+optional third arguments to be numeric expressions; a bare <code class="code">+</code> does
+not qualify, so our first attempt got a warning.
+</p>
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Identifiers">
+<div class="nav-panel">
+<p>
+Next: <a href="#Formatter-Instructions" accesskey="n" rel="next">Formatter Instructions</a>, Previous: <a href="#Numeric-Expressions" accesskey="p" rel="prev">Numeric Expressions</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Identifiers-1">5.5 Identifiers</h3>
+<a class="index-entry-id" id="index-identifiers"></a>
+
+<p>An <em class="dfn">identifier</em> labels a GNU <code class="code">troff</code> datum such as a register,
+name (macro, string, or diversion), typeface, color, special character,
+character class, environment, or stream. Valid identifiers consist of
+one or more ordinary characters.
+<a class="index-entry-id" id="index-ordinary-character"></a>
+<a class="index-entry-id" id="index-character_002c-ordinary"></a>
+An <i class="slanted">ordinary character</i> is an input character that is not the
+escape character, a leader, tab, newline, or invalid as GNU <code class="code">troff</code>
+input.
+</p>
+<a class="index-entry-id" id="index-invalid-input-characters"></a>
+<a class="index-entry-id" id="index-input-characters_002c-invalid"></a>
+<a class="index-entry-id" id="index-characters_002c-invalid-input"></a>
+<a class="index-entry-id" id="index-Unicode"></a>
+<p>Invalid input characters are a subset of control characters (from the
+sets &ldquo;C0 Controls&rdquo; and &ldquo;C1 Controls&rdquo; as Unicode describes them).
+When GNU <code class="code">troff</code> encounters one in an identifier, it produces a
+warning in category &lsquo;<samp class="samp">input</samp>&rsquo; (see <a class="pxref" href="#Warnings">Warnings</a>). They are removed
+during interpretation: an identifier &lsquo;<samp class="samp">foo</samp>&rsquo;, followed by an invalid
+character and then &lsquo;<samp class="samp">bar</samp>&rsquo;, is processed as &lsquo;<samp class="samp">foobar</samp>&rsquo;.
+</p>
+<p>On a machine using the ISO 646, 8859, or 10646 character encodings,
+invalid input characters are <code class="code">0x00</code>, <code class="code">0x08</code>, <code class="code">0x0B</code>,
+<code class="code">0x0D</code>&ndash;<code class="code">0x1F</code>, and <code class="code">0x80</code>&ndash;<code class="code">0x9F</code>. On an
+<abbr class="acronym">EBCDIC</abbr> host, they are <code class="code">0x00</code>&ndash;<code class="code">0x01</code>, <code class="code">0x08</code>,
+<code class="code">0x09</code>, <code class="code">0x0B</code>, <code class="code">0x0D</code>&ndash;<code class="code">0x14</code>,
+<code class="code">0x17</code>&ndash;<code class="code">0x1F</code>, and
+<code class="code">0x30</code>&ndash;<code class="code">0x3F</code>.<a class="footnote" id="DOCF40" href="#FOOT40"><sup>40</sup></a> Some of these code points are used
+by GNU <code class="code">troff</code> internally, making it non-trivial to extend the
+program to accept UTF-8 or other encodings that use characters from
+these ranges.<a class="footnote" id="DOCF41" href="#FOOT41"><sup>41</sup></a>
+</p>
+<p>Thus, the identifiers &lsquo;<samp class="samp">br</samp>&rsquo;, &lsquo;<samp class="samp">PP</samp>&rsquo;, &lsquo;<samp class="samp">end-list</samp>&rsquo;,
+&lsquo;<samp class="samp">ref*normal-print</samp>&rsquo;, &lsquo;<samp class="samp">|</samp>&rsquo;, &lsquo;<samp class="samp">@_</samp>&rsquo;, and &lsquo;<samp class="samp">!&quot;#$%'()*+,-./</samp>&rsquo;
+are all valid. Discretion should be exercised to prevent confusion.
+Identifiers starting with &lsquo;<samp class="samp">(</samp>&rsquo; or &lsquo;<samp class="samp">[</samp>&rsquo; require care.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr x 9
+.nr y 1
+.nr (x 2
+.nr [y 3
+.nr sum1 (\n(x + \n[y])
+ error&rarr; a space character is not allowed in an escape
+ error&rarr; sequence parameter
+A:2+3=\n[sum1]
+.nr sum2 (\n((x + \n[[y])
+B:2+3=\n[sum2]
+.nr sum3 (\n[(x] + \n([y)
+C:2+3=\n[sum3]
+ &rArr; A:2+3=1 B:2+3=5 C:2+3=5
+</pre></div></div>
+
+<a class="index-entry-id" id="index-_005d_002c-as-part-of-an-identifier"></a>
+<p>An identifier with a closing bracket (&lsquo;<samp class="samp">]</samp>&rsquo;) in its name can&rsquo;t be
+accessed with bracket-form escape sequences that expect an identifier as
+a parameter. For example, &lsquo;<samp class="samp">\[foo]]</samp>&rsquo; accesses the glyph &lsquo;<samp class="samp">foo</samp>&rsquo;,
+followed by &lsquo;<samp class="samp">]</samp>&rsquo; in whatever the surrounding context is, whereas
+&lsquo;<samp class="samp">\C'foo]'</samp>&rsquo; formats a glyph named &lsquo;<samp class="samp">foo]</samp>&rsquo;. Similarly, the
+identifier &lsquo;<samp class="samp">(</samp>&rsquo; can&rsquo;t be interpolated <em class="emph">except</em> with bracket
+forms.
+</p>
+<a class="index-entry-id" id="index-refer_002c-and-macro-names-starting-with-_005b-or-_005d"></a>
+<a class="index-entry-id" id="index-_005b_002c-macro-names-starting-with_002c-and-refer"></a>
+<a class="index-entry-id" id="index-_005d_002c-macro-names-starting-with_002c-and-refer"></a>
+<a class="index-entry-id" id="index-macro-names_002c-starting-with-_005b-or-_005d_002c-and-refer"></a>
+<p>If you begin a macro, string, or diversion name with either of the
+characters &lsquo;<samp class="samp">[</samp>&rsquo; or &lsquo;<samp class="samp">]</samp>&rsquo;, you foreclose use of the <code class="code">grefer</code>
+preprocessor, which recognizes &lsquo;<samp class="samp">.[</samp>&rsquo; and &lsquo;<samp class="samp">.]</samp>&rsquo; as bibliographic
+reference delimiters.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cA_0027anything_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\A<code class="code">'</code></code><span class="r"><i class="slanted">anything</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cA_0027anything_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cA"></a>
+<p>Interpolate&nbsp;1 if <var class="var">anything</var> is a valid identifier, and&nbsp;0
+otherwise. The delimiter need not be a neutral apostrophe; see
+<a class="ref" href="#Delimiters">Delimiters</a>. Because invalid input characters are removed (see
+above), invalid identifiers are empty or contain spaces, tabs, or
+newlines.
+</p>
+<p>You can employ <code class="code">\A</code> to validate a macro argument before using it to
+construct another escape sequence or identifier.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.\&quot; usage: .init-coordinate-pair name val1 val2
+.\&quot; Create a coordinate pair where name!x=val1 and
+.\&quot; name!y=val2.
+.de init-coordinate-pair
+. if \A'\\$1' \{\
+. if \B'\\$2' .nr \\$1!x \\$2
+. if \B'\\$3' .nr \\$1!y \\$3
+. \}
+..
+.init-coordinate-pair center 5 10
+The center is at (\n[center!x], \n[center!y]).
+.init-coordinate-pair &quot;poi&rarr;nt&quot; trash garbage \&quot; ignored
+.init-coordinate-pair point trash garbage \&quot; ignored
+ &rArr; The center is at (5, 10).
+</pre></div></div>
+
+<p>In this example, we also validated the numeric arguments; the registers
+&lsquo;<samp class="samp">point!x</samp>&rsquo; and &lsquo;<samp class="samp">point!y</samp>&rsquo; remain undefined. See <a class="xref" href="#Numeric-Expressions">Numeric Expressions</a> for the <code class="code">\B</code> escape sequence.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-undefined-identifiers"></a>
+<a class="index-entry-id" id="index-identifiers_002c-undefined"></a>
+<p>How GNU <code class="code">troff</code> handles the interpretation of an undefined
+identifier depends on the context. There is no way to invoke an
+undefined request; such syntax is interpreted as a macro call instead.
+If the identifier is interpreted as a string, macro, or diversion, GNU
+<code class="code">troff</code> emits a warning in category &lsquo;<samp class="samp">mac</samp>&rsquo;, defines it as
+empty, and interpolates nothing. If the identifier is interpreted as a
+register, GNU <code class="code">troff</code> emits a warning in category &lsquo;<samp class="samp">reg</samp>&rsquo;,
+initializes it to zero, and interpolates that value. See <a class="xref" href="#Warnings">Warnings</a>,
+<a class="ref" href="#Interpolating-Registers">Interpolating Registers</a>, and <a class="ref" href="#Strings">Strings</a>. Attempting to use an
+undefined typeface, special character, color, character class,
+environment, or stream generally provokes an error diagnostic.
+</p>
+<a class="index-entry-id" id="index-name-space_002c-common_002c-of-macros_002c-diversions_002c-and-strings"></a>
+<a class="index-entry-id" id="index-common-name-space-of-macros_002c-diversions_002c-and-strings"></a>
+<a class="index-entry-id" id="index-macros_002c-shared-name-space-with-strings-and-diversions"></a>
+<a class="index-entry-id" id="index-strings_002c-shared-name-space-with-macros-and-diversions"></a>
+<a class="index-entry-id" id="index-diversions_002c-shared-name-space-with-macros-and-strings"></a>
+<p>Identifiers for requests, macros, strings, and diversions share one name
+space; special characters and character classes another. No other
+object types do.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de xxx
+. nop foo
+..
+.di xxx
+bar
+.br
+.di
+.
+.xxx
+ &rArr; bar
+</pre></div></div>
+
+<p>The foregoing example shows that GNU <code class="code">troff</code> reuses the identifier
+&lsquo;<samp class="samp">xxx</samp>&rsquo;, changing it from a macro to a diversion. No warning is
+emitted, and the previous contents of &lsquo;<samp class="samp">xxx</samp>&rsquo; are lost.
+</p>
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Formatter-Instructions">
+<div class="nav-panel">
+<p>
+Next: <a href="#Registers" accesskey="n" rel="next">Registers</a>, Previous: <a href="#Identifiers" accesskey="p" rel="prev">Identifiers</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Formatter-Instructions-1">5.6 Formatter Instructions</h3>
+<a class="index-entry-id" id="index-formatter-instructions"></a>
+<a class="index-entry-id" id="index-instructing-the-formatter"></a>
+
+<p>To support documents that require more than filling, automatic line
+breaking and hyphenation, adjustment, and supplemental inter-sentence
+space, the <code class="code">roff</code> language offers two means of embedding
+instructions to the formatter.
+</p>
+<a class="index-entry-id" id="index-request-1"></a>
+<p>One is a <em class="dfn">request</em>, which begins with a control character and takes
+up the remainder of the input line. Requests often perform relatively
+large-scale operations such as setting the page length, breaking the
+line, or starting a new page. They also conduct internal operations
+like defining macros.
+</p>
+<a class="index-entry-id" id="index-escape-sequence"></a>
+<a class="index-entry-id" id="index-sequence_002c-escape"></a>
+<p>The other is an <em class="dfn">escape sequence</em>, which begins with the escape
+character and can be embedded anywhere in the input, even in arguments
+to requests and other escape sequences. Escape sequences interpolate
+special characters, strings, or registers, and handle comparatively
+minor formatting tasks like sub- and superscripting.
+</p>
+<p>Some operations, such as font selection and type size alteration, are
+available via both requests and escape sequences.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="#Control-Characters" accesskey="1">Control Characters</a></li>
+<li><a href="#Invoking-Requests" accesskey="2">Invoking Requests</a></li>
+<li><a href="#Calling-Macros" accesskey="3">Calling Macros</a></li>
+<li><a href="#Using-Escape-Sequences" accesskey="4">Using Escape Sequences</a></li>
+<li><a href="#Delimiters" accesskey="5">Delimiters</a></li>
+</ul>
+<hr>
+<div class="subsection-level-extent" id="Control-Characters">
+<div class="nav-panel">
+<p>
+Next: <a href="#Invoking-Requests" accesskey="n" rel="next">Invoking Requests</a>, Previous: <a href="#Formatter-Instructions" accesskey="p" rel="prev">Formatter Instructions</a>, Up: <a href="#Formatter-Instructions" accesskey="u" rel="up">Formatter Instructions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Control-Characters-1">5.6.1 Control Characters</h4>
+<a class="index-entry-id" id="index-control-characters"></a>
+<a class="index-entry-id" id="index-configuring-control-characters"></a>
+<a class="index-entry-id" id="index-changing-control-characters"></a>
+
+<p>The mechanism of using <code class="code">roff</code>&rsquo;s control characters to invoke
+requests and call macros was introduced in <a class="ref" href="#Requests-and-Macros">Requests and Macros</a>.
+Control characters are recognized only at the beginning of an input
+line, or at the beginning of the branch of a control structure request;
+see <a class="ref" href="#Conditionals-and-Loops">Conditionals and Loops</a>.
+</p>
+<p>A few requests cause a break implicitly; use the no-break control
+character to prevent the break. Break suppression is its sole
+behavioral distinction. Employing the no-break control character to
+invoke requests that don&rsquo;t cause breaks is harmless but poor style.
+See <a class="xref" href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a>.
+</p>
+<a class="index-entry-id" id="index-control-character_002c-changing-_0028cc_0029"></a>
+<a class="index-entry-id" id="index-character_002c-control_002c-changing-_0028cc_0029"></a>
+<a class="index-entry-id" id="index-no_002dbreak-control-character_002c-changing-_0028c2_0029"></a>
+<a class="index-entry-id" id="index-character_002c-no_002dbreak-control_002c-changing-_0028c2_0029"></a>
+<a class="index-entry-id" id="index-control-character_002c-no_002dbreak_002c-changing-_0028c2_0029"></a>
+<p>The control &lsquo;<samp class="samp">.</samp>&rsquo; and no-break control &lsquo;<samp class="samp">'</samp>&rsquo; characters can each
+be changed to any ordinary character<a class="footnote" id="DOCF42" href="#FOOT42"><sup>42</sup></a>
+with the <code class="code">cc</code> and <code class="code">c2</code> requests, respectively.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ecc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.cc</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">o</i></span>]</var><a class="copiable-link" href='#index-_002ecc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-cc"></a>
+<p>Recognize the ordinary character&nbsp;<var class="var">o</var> as the control character.
+If&nbsp;<var class="var">o</var> is absent or invalid, the default control character
+&lsquo;<samp class="samp">.</samp>&rsquo; is selected. The identity of the control character is
+associated with the environment (see <a class="pxref" href="#Environments">Environments</a>).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ec2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.c2</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">o</i></span>]</var><a class="copiable-link" href='#index-_002ec2'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-c2"></a>
+<p>Recognize the ordinary character&nbsp;<var class="var">o</var> as the no-break control
+character. If&nbsp;<var class="var">o</var> is absent or invalid, the default no-break
+control character &lsquo;<samp class="samp">'</samp>&rsquo; is selected. The identity of the no-break
+control character is associated with the environment
+(see <a class="pxref" href="#Environments">Environments</a>).
+</p></dd></dl>
+
+<p>When writing a macro, you might wish to know which control character was
+used to call it.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002ebr_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.br]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ebr_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ebr-1"></a>
+<p>This read-only register interpolates&nbsp;1 if the currently executing
+macro was called using the normal control character and&nbsp;0
+otherwise. If a macro is interpolated as a string, the <code class="code">.br</code>
+register&rsquo;s value is inherited from the context of the string
+interpolation. See <a class="xref" href="#Strings">Strings</a>.
+</p>
+<a class="index-entry-id" id="index-intercepting-requests"></a>
+<a class="index-entry-id" id="index-requests_002c-intercepting"></a>
+<a class="index-entry-id" id="index-modifying-requests"></a>
+<a class="index-entry-id" id="index-requests_002c-modifying"></a>
+<p>Use this register to reliably intercept requests that imply breaks.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.als bp*orig bp
+.de bp
+. ie \\n[.br] .bp*orig
+. el 'bp*orig
+..
+</pre></div></div>
+
+<p>Testing the <code class="code">.br</code> register outside of a macro definition makes no
+sense.
+</p></dd></dl>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Invoking-Requests">
+<div class="nav-panel">
+<p>
+Next: <a href="#Calling-Macros" accesskey="n" rel="next">Calling Macros</a>, Previous: <a href="#Control-Characters" accesskey="p" rel="prev">Control Characters</a>, Up: <a href="#Formatter-Instructions" accesskey="u" rel="up">Formatter Instructions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Invoking-Requests-1">5.6.2 Invoking Requests</h4>
+<a class="index-entry-id" id="index-invoking-requests"></a>
+<a class="index-entry-id" id="index-requests_002c-invoking"></a>
+
+<p>A control character is optionally followed by tabs and/or spaces and
+then an identifier naming a request or macro. The invocation of an
+unrecognized request is interpreted as a macro call. Defining a macro
+with the same name as a request replaces the request. Deleting a
+request name with the <code class="code">rm</code> request makes it unavailable. The
+<code class="code">als</code> request can alias requests, permitting them to be wrapped or
+non-destructively replaced. See <a class="xref" href="#Strings">Strings</a>.
+</p>
+<a class="index-entry-id" id="index-request-arguments"></a>
+<a class="index-entry-id" id="index-arguments-to-requests"></a>
+<a class="index-entry-id" id="index-tabs_002c-and-macro-arguments"></a>
+<a class="index-entry-id" id="index-macro-arguments_002c-and-tabs"></a>
+<a class="index-entry-id" id="index-arguments-to-macros_002c-and-tabs"></a>
+<a class="index-entry-id" id="index-tabs_002c-and-request-arguments"></a>
+<a class="index-entry-id" id="index-request-arguments_002c-and-tabs"></a>
+<a class="index-entry-id" id="index-arguments-to-requests_002c-and-tabs"></a>
+<p>There is no inherent limit on argument length or quantity. Most
+requests take one or more arguments, and ignore any they do not expect.
+A request may be separated from its arguments by tabs or spaces, but
+only spaces can separate an argument from its successor. Only one
+between arguments is necessary; any excess is ignored. GNU <code class="code">troff</code>
+does not allow tabs for argument separation.<a class="footnote" id="DOCF43" href="#FOOT43"><sup>43</sup></a>
+</p>
+<p>Generally, a space <em class="emph">within</em> a request argument is not relevant, not
+meaningful, or is supported by bespoke provisions, as with the <code class="code">tl</code>
+request&rsquo;s delimiters (see <a class="pxref" href="#Page-Layout">Page Layout</a>). Some requests, like
+<code class="code">ds</code>, interpret the remainder of the control line as a single
+argument. See <a class="xref" href="#Strings">Strings</a>.
+</p>
+<a class="index-entry-id" id="index-structuring-source-code-of-documents-or-macro-packages"></a>
+<a class="index-entry-id" id="index-documents_002c-structuring-the-source-of"></a>
+<a class="index-entry-id" id="index-macro-package_002c-structuring-the-source-of"></a>
+<a class="index-entry-id" id="index-package_002c-package_002c-structuring-the-source-of"></a>
+<a class="index-entry-id" id="index-indentation_002c-of-roff-source-code"></a>
+<p>Spaces and tabs immediately after a control character are ignored.
+Commonly, authors structure the source of documents or macro files with
+them.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de center
+. if \\n[.br] \
+. br
+. ce \\$1
+..
+.
+.
+.de right-align
+.&rarr;if \\n[.br] \
+.&rarr;&rarr;br
+.&rarr;rj \\$1
+..
+</pre></div></div>
+
+<a class="index-entry-id" id="index-blank-line-trap-_0028blm_0029"></a>
+<a class="index-entry-id" id="index-blank-line-macro-_0028blm_0029-1"></a>
+<p>If you assign an empty blank line trap, you can separate macro
+definitions (or any input lines) with blank lines.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de do-nothing
+..
+.blm do-nothing \&quot; activate blank line trap
+
+.de center
+. if \\n[.br] \
+. br
+. ce \\$1
+..
+
+
+.de right-align
+.&rarr;if \\n[.br] \
+.&rarr;&rarr;br
+.&rarr;rj \\$1
+..
+
+.blm \&quot; deactivate blank line trap
+</pre></div></div>
+
+<p>See <a class="xref" href="#Blank-Line-Traps">Blank Line Traps</a>.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Calling-Macros">
+<div class="nav-panel">
+<p>
+Next: <a href="#Using-Escape-Sequences" accesskey="n" rel="next">Using Escape Sequences</a>, Previous: <a href="#Invoking-Requests" accesskey="p" rel="prev">Invoking Requests</a>, Up: <a href="#Formatter-Instructions" accesskey="u" rel="up">Formatter Instructions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Calling-Macros-1">5.6.3 Calling Macros</h4>
+<a class="index-entry-id" id="index-calling-macros"></a>
+<a class="index-entry-id" id="index-macro-arguments"></a>
+<a class="index-entry-id" id="index-arguments-to-macros"></a>
+
+<p>If a macro of the desired name does not exist when called, it is
+created, assigned an empty definition, and a warning in category
+&lsquo;<samp class="samp">mac</samp>&rsquo; is emitted. Calling an undefined macro <em class="emph">does</em> end a
+macro definition naming it as its end macro (see <a class="pxref" href="#Writing-Macros">Writing Macros</a>).
+</p>
+<a class="index-entry-id" id="index-spaces_002c-in-a-macro-argument"></a>
+<p>To embed spaces <em class="emph">within</em> a macro argument, enclose the argument in
+neutral double quotes <code class="code">&quot;</code>. Horizontal motion escape sequences are
+sometimes a better choice for arguments to be formatted as text.
+</p>
+<p>Consider calls to a hypothetical section heading macro &lsquo;<samp class="samp">uh</samp>&rsquo;.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.uh The Mouse Problem
+.uh &quot;The Mouse Problem&quot;
+.uh The\~Mouse\~Problem
+.uh The\ Mouse\ Problem
+</pre></div></div>
+
+<a class="index-entry-id" id="index-_005c_007e_002c-difference-from-_005cSP"></a>
+<a class="index-entry-id" id="index-_005cSP_002c-difference-from-_005c_007e"></a>
+<p>The first line calls <code class="code">uh</code> with three arguments: &lsquo;<samp class="samp">The</samp>&rsquo;,
+&lsquo;<samp class="samp">Mouse</samp>&rsquo;, and &lsquo;<samp class="samp">Problem</samp>&rsquo;. The remainder call the <code class="code">uh</code>
+macro with one argument, &lsquo;<samp class="samp">The Mouse Problem</samp>&rsquo;. The last solution,
+using escaped spaces, can be found in documents prepared for
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>. It can cause surprise when text is
+adjusted, because <code class="code">\<kbd class="key">SP</kbd></code> inserts a <em class="emph">fixed-width</em>,
+non-breaking space. GNU <code class="code">troff</code>&rsquo;s <code class="code">\~</code> escape sequence
+inserts an adjustable, non-breaking space.<a class="footnote" id="DOCF44" href="#FOOT44"><sup>44</sup></a>
+</p>
+<a class="index-entry-id" id="index-_0022_002c-embedding-in-a-macro-argument"></a>
+<a class="index-entry-id" id="index-double-quote_002c-embedding-in-a-macro-argument"></a>
+<a class="index-entry-id" id="index-_005c_002c-embedding-in-a-macro-argument"></a>
+<a class="index-entry-id" id="index-backslash_002c-embedding-in-a-macro-argument"></a>
+<p>The foregoing raises the question of how to embed neutral double quotes
+or backslashes in macro arguments when <em class="emph">those</em> characters are
+desired as literals. In GNU <code class="code">troff</code>, the special character escape
+sequence <code class="code">\[rs]</code> produces a backslash and <code class="code">\[dq]</code> a neutral
+double quote.
+</p>
+<p>In GNU <code class="code">troff</code>&rsquo;s <abbr class="acronym">AT&amp;T</abbr> compatibility mode, these
+characters remain available as <code class="code">\(rs</code> and <code class="code">\(dq</code>,
+respectively. <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> did not consistently define
+these special characters,
+but its descendants can be made to support them. See <a class="xref" href="#Device-and-Font-Description-Files">Device and Font Description Files</a>.
+</p>
+<p>If even that is not feasible, options remain. To obtain a literal
+escape character in a macro argument, you can simply type it if you
+change or disable the escape character first. See <a class="xref" href="#Using-Escape-Sequences">Using Escape Sequences</a>. Otherwise, you must escape the escape character repeatedly
+to a context-dependent extent. See <a class="xref" href="#Copy-Mode">Copy Mode</a>.
+</p>
+<p>For the (neutral) double quote, you have recourse to an obscure
+syntactical feature of <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>. Because a double
+quote can begin a macro argument, the formatter keeps track of whether
+the current argument was started thus, and doesn&rsquo;t require a space after
+the double quote that ends it.<a class="footnote" id="DOCF45" href="#FOOT45"><sup>45</sup></a> In
+the argument list to a macro, a double quote that <em class="emph">isn&rsquo;t</em> preceded
+by a space <em class="emph">doesn&rsquo;t</em> start a macro argument. If not preceded by a
+double quote that began an argument, this double quote becomes part of
+the argument. Furthermore, within a quoted argument, a pair of adjacent
+double quotes becomes a literal double quote.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de eq
+. tm arg1:\\$1 arg2:\\$2 arg3:\\$3
+. tm arg4:\\$4 arg5:\\$5 arg6:\\$6
+.. \&quot; 4 backslashes on the next line
+.eq a&quot; &quot;b c&quot; &quot;de&quot;f\\\\g&quot; h&quot;&quot;i &quot;j&quot;&quot;k&quot;
+ error&rarr; arg1:a&quot; arg2:b c arg3:de
+ error&rarr; arg4:f\g&quot; arg5:h&quot;&quot;i arg6:j&quot;k
+</pre></div></div>
+
+<p>Apart from the complexity of the rules, this traditional solution has
+the disadvantage that double quotes don&rsquo;t survive repeated argument
+expansion in <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> or GNU <code class="code">troff</code>&rsquo;s
+compatibility mode. This can frustrate efforts to pass such arguments
+intact through multiple macro calls.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.cp 1
+.de eq
+. tm arg1:\\$1 arg2:\\$2 arg3:\\$3
+. tm arg4:\\$4 arg5:\\$5 arg6:\\$6
+..
+.de xe
+. eq \\$1 \\$2 \\$3 \\$4 \\$5 \\$6
+.. \&quot; 8 backslashes on the next line
+.xe a&quot; &quot;b c&quot; &quot;de&quot;f\\\\\\\\g&quot; h&quot;&quot;i &quot;j&quot;&quot;k&quot;
+ error&rarr; arg1:a&quot; arg2:b arg3:c
+ error&rarr; arg4:de arg5:f\g&quot; arg6:h&quot;&quot;i
+</pre></div></div>
+
+<a class="index-entry-id" id="index-input-level"></a>
+<a class="index-entry-id" id="index-level_002c-input"></a>
+<a class="index-entry-id" id="index-interpolation-depth"></a>
+<a class="index-entry-id" id="index-depth_002c-interpolation"></a>
+<p>Outside of compatibility mode, GNU <code class="code">troff</code> doesn&rsquo;t exhibit this
+problem because it tracks the nesting depth of interpolations.
+See <a class="xref" href="#Implementation-Differences">Implementation Differences</a>.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Using-Escape-Sequences">
+<div class="nav-panel">
+<p>
+Next: <a href="#Delimiters" accesskey="n" rel="next">Delimiters</a>, Previous: <a href="#Calling-Macros" accesskey="p" rel="prev">Calling Macros</a>, Up: <a href="#Formatter-Instructions" accesskey="u" rel="up">Formatter Instructions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Using-Escape-Sequences-1">5.6.4 Using Escape Sequences</h4>
+<a class="index-entry-id" id="index-using-escape-sequences"></a>
+<a class="index-entry-id" id="index-escape-sequences"></a>
+
+<p>Whereas requests must occur on control lines, escape sequences can occur
+intermixed with text and may appear in arguments to requests, macros,
+and other escape sequences.
+<a class="index-entry-id" id="index-_005c"></a>
+An escape sequence is introduced by the escape character, a backslash
+<code class="code">\</code> (but see the <code class="code">ec</code> request below). The next character
+selects the escape&rsquo;s function.
+</p>
+<p>Escape sequences vary in length. Some take an argument, and of those,
+some have different syntactical forms for a one-character,
+two-character, or arbitrary-length argument. Others accept <em class="emph">only</em>
+an arbitrary-length argument. In the former scheme, a one-character
+argument follows the function character immediately, an opening
+parenthesis &lsquo;<samp class="samp">(</samp>&rsquo; introduces a two-character argument (no closing
+parenthesis is used), and an argument of arbitrary length is enclosed in
+brackets &lsquo;<samp class="samp">[]</samp>&rsquo;. In the latter scheme, the user selects a delimiter
+character. A few escape sequences are idiosyncratic, and support both
+of the foregoing conventions (<code class="code">\s</code>), designate their own
+termination sequence (<code class="code">\?</code>), consume input until the next newline
+(<code class="code">\!</code>, <code class="code">\&quot;</code>, <code class="code">\#</code>), or support an additional modifier
+character (<code class="code">\s</code> again, and <code class="code">\n</code>). As with requests, use of
+some escape sequences in source documents may interact poorly with a
+macro package you use; consult its documentation to learn of &ldquo;safe&rdquo;
+sequences or alternative facilities it provides to achieve the desired
+result.
+</p>
+<p>If an escape character is followed by a character that does not
+identify a defined operation, the escape character is ignored (producing
+a diagnostic of the &lsquo;<samp class="samp">escape</samp>&rsquo; warning category, which is not enabled
+by default) and the following character is processed normally.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">$ groff -Tps -ww
+.nr N 12
+.ds co white
+.ds animal elephant
+I have \fI\nN \*(co \*[animal]s,\f[]
+said \P.\&amp;\~Pseudo Pachyderm.
+ error&rarr; warning: escape character ignored before 'P'
+ &rArr; I have <i class="slanted">12 white elephants,</i> said P. Pseudo Pachyderm.
+</pre></div></div>
+
+<p>Escape sequence interpolation is of higher precedence than escape
+sequence argument interpretation. This rule affords flexibility in
+using escape sequences to construct parameters to other escape
+sequences.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds family C\&quot; Courier
+.ds style I\&quot; oblique
+Choice a typeface \f(\*[family]\*[style]wisely.
+ &rArr; Choose a typeface <i class="slanted">wisely.</i>
+</pre></div></div>
+
+<p>In the above, the syntax form &lsquo;<samp class="samp">\f(</samp>&rsquo; accepts only two characters for
+an argument; the example works because the subsequent escape sequences
+are interpolated before the selection escape sequence argument is
+processed, and strings <code class="code">family</code> and <code class="code">style</code> interpolate one
+character each.<a class="footnote" id="DOCF46" href="#FOOT46"><sup>46</sup></a>
+</p>
+<p>The escape character is nearly always interpreted when encountered; it
+is therefore desirable to have a way to interpolate it, disable it, or
+change it.
+</p>
+<a class="index-entry-id" id="index-formatting-the-escape-character-_0028_005ce_0029"></a>
+<a class="index-entry-id" id="index-escape-character_002c-formatting-_0028_005ce_0029"></a>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005ce-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\e</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005ce-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005ce"></a>
+<p>Interpolate the escape character.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-formatting-a-backslash-glyph-_0028_005c_005brs_005d_0029"></a>
+<a class="index-entry-id" id="index-backslash-glyph_002c-formatting-_0028_005c_005brs_005d_0029"></a>
+<p>The <code class="code">\[rs]</code> special character escape sequence formats a backslash
+glyph. In macro and string definitions, the input sequences <code class="code">\\</code>
+and <code class="code">\E</code> defer interpretation of escape sequences. See <a class="xref" href="#Copy-Mode">Copy Mode</a>.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eeo"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.eo</code></strong><a class="copiable-link" href='#index-_002eeo'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-eo"></a>
+<a class="index-entry-id" id="index-disabling-_005c-_0028eo_0029"></a>
+<a class="index-entry-id" id="index-_005c_002c-disabling-_0028eo_0029"></a>
+<p>Disable the escape mechanism except in copy mode. Once this request is
+invoked, no input character is recognized as starting an escape
+sequence in interpretation mode.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eec"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ec</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">o</i></span>]</var><a class="copiable-link" href='#index-_002eec'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ec"></a>
+<a class="index-entry-id" id="index-escape-character_002c-changing-_0028ec_0029"></a>
+<a class="index-entry-id" id="index-character_002c-escape_002c-changing-_0028ec_0029"></a>
+<p>Recognize the ordinary character&nbsp;<var class="var">o</var> as the escape character.
+If&nbsp;<var class="var">o</var> is absent or invalid, the default escape character
+&lsquo;<samp class="samp">\</samp>&rsquo; is selected.
+</p></dd></dl>
+
+<p>Switching escape sequence interpretation off to define a macro and back
+on afterward can obviate the need to double the escape character within
+the definition. See <a class="xref" href="#Writing-Macros">Writing Macros</a>. This technique is not available
+if your macro needs to interpolate values at the time it is
+<em class="emph">defined</em>&mdash;but many do not.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.\&quot; simplified `BR` macro from the man(7) macro package
+.eo
+.de BR
+. ds result \&amp;
+. while (\n[.$] &gt;= 2) \{\
+. as result \fB\$1\fR\$2\&quot;
+. shift 2
+. \}
+. if \n[.$] .as result \fB\$1\&quot;
+\*[result]
+. rm result
+. ft R
+..
+.ec
+</pre></div></div>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eecs"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ecs</code></strong><a class="copiable-link" href='#index-_002eecs'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ecs"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eecr"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ecr</code></strong><a class="copiable-link" href='#index-_002eecr'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ecr"></a>
+<p>The <code class="code">ecs</code> request stores the escape character for recall with
+<code class="code">ecr</code>. <code class="code">ecr</code> sets the escape character to &lsquo;<samp class="samp">\</samp>&rsquo; if none
+has been saved.
+</p>
+<p>Use these requests together to temporarily change the escape character.
+</p></dd></dl>
+
+<p>Using a different escape character, or disabling it, when calling macros
+not under your control will likely cause errors, since GNU <code class="code">troff</code>
+has no mechanism to &ldquo;intern&rdquo; macros&mdash;that is, to convert a macro
+definition into a form independent of its
+representation.<a class="footnote" id="DOCF47" href="#FOOT47"><sup>47</sup></a> When a
+macro is called, its contents are interpreted literally.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Delimiters">
+<div class="nav-panel">
+<p>
+Previous: <a href="#Using-Escape-Sequences" accesskey="p" rel="prev">Using Escape Sequences</a>, Up: <a href="#Formatter-Instructions" accesskey="u" rel="up">Formatter Instructions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Delimiters-1">5.6.5 Delimiters</h4>
+<a class="index-entry-id" id="index-delimiting-escape-sequence-arguments"></a>
+<a class="index-entry-id" id="index-escape-sequence-argument-delimiters"></a>
+<a class="index-entry-id" id="index-delimiters_002c-for-escape-sequence-arguments"></a>
+<a class="index-entry-id" id="index-arguments_002c-to-escape-sequences_002c-delimiting"></a>
+
+<a class="index-entry-id" id="index-_0027_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_0022_002c-as-delimiter"></a>
+<p>Some escape sequences that require parameters use delimiters. The
+neutral apostrophe <code class="code">'</code> is a popular choice and shown in this
+document. The neutral double quote <code class="code">&quot;</code> is also commonly seen.
+Letters, numerals, and leaders can be used. Punctuation characters
+are likely better choices, except for those defined as infix operators
+in numeric expressions; see below.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">\l'1.5i\[bu]' \&quot; draw 1.5 inches of bullet glyphs
+</pre></div></div>
+
+<a class="index-entry-id" id="index-_005c_0025_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005cSP_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_007c_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_005e_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_007b_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_007d_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_0027_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_0060_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_002d_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_005f_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_0021_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_003f_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_0029_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_002f_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_002c_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_0026_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_003a_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_007e_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c0_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005ca_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005cc_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005cd_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005ce_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005cE_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005cp_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005cr_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005ct_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005cu_002c-as-delimiter"></a>
+<p>The following escape sequences don&rsquo;t take arguments and thus are allowed
+as delimiters:
+<code class="code">\<kbd class="key">SP</kbd></code>, <code class="code">\%</code>, <code class="code">\|</code>, <code class="code">\^</code>, <code class="code">\{</code>,
+<code class="code">\}</code>, <code class="code">\'</code>, <code class="code">\`</code>, <code class="code">\-</code>, <code class="code">\_</code>, <code class="code">\!</code>,
+<code class="code">\?</code>, <code class="code">\)</code>, <code class="code">\/</code>, <code class="code">\,</code>, <code class="code">\&amp;</code>, <code class="code">\:</code>,
+<code class="code">\~</code>, <code class="code">\0</code>, <code class="code">\a</code>, <code class="code">\c</code>, <code class="code">\d</code>, <code class="code">\e</code>,
+<code class="code">\E</code>, <code class="code">\p</code>, <code class="code">\r</code>, <code class="code">\t</code>, and <code class="code">\u</code>. However,
+using them this way is discouraged; they can make the input confusing to
+read.
+</p>
+<a class="index-entry-id" id="index-_005cA_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cb_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005co_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cw_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cX_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cZ_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-newline_002c-as-delimiter"></a>
+<p>A few escape sequences,
+<code class="code">\A</code>,
+<code class="code">\b</code>,
+<code class="code">\o</code>,
+<code class="code">\w</code>,
+<code class="code">\X</code>,
+and <code class="code">\Z</code>, accept a newline as a delimiter. Newlines that serve
+as delimiters continue to be recognized as input line terminators.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">A caf\o
+e\(aa
+in Paris
+ &rArr; A café in Paris
+</pre></div></div>
+
+<p>Use of newlines as delimiters in escape sequences is also discouraged.
+</p>
+<a class="index-entry-id" id="index-_005cD_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005ch_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cH_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cl_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cL_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cN_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cR_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cs_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cS_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cv_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cx_002c-delimiters-allowed-by"></a>
+<p>Finally, the escape sequences <code class="code">\D</code>, <code class="code">\h</code>, <code class="code">\H</code>,
+<code class="code">\l</code>, <code class="code">\L</code>, <code class="code">\N</code>, <code class="code">\R</code>, <code class="code">\s</code>, <code class="code">\S</code>,
+<code class="code">\v</code>, and <code class="code">\x</code> prohibit many delimiters.
+</p>
+<ul class="itemize mark-bullet">
+<li><a class="index-entry-id" id="index-numerals_002c-as-delimiters"></a>
+<a class="index-entry-id" id="index-digits_002c-as-delimiters"></a>
+<a class="index-entry-id" id="index-_002e_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-decimal-point_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-dot_002c-as-delimiter"></a>
+the numerals <code class="code">0</code>-<code class="code">9</code> and the decimal point <code class="code">.</code>
+
+</li><li><a class="index-entry-id" id="index-operators_002c-as-delimiters"></a>
+<a class="index-entry-id" id="index-_002b_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_002d_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_002f_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_002a_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_0025_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_003c_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_003e_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_003d_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_0026_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_003a_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_0028_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_0029_002c-as-delimiter"></a>
+the (single-character) operators &lsquo;<samp class="samp">+-/*%&lt;&gt;=&amp;:()</samp>&rsquo;
+
+</li><li><a class="index-entry-id" id="index-space-character_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-tab-character_002c-as-delimiter"></a>
+the space and tab characters
+
+</li><li><a class="index-entry-id" id="index-_005c_0025_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005c_003a_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005c_007b_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005c_007d_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005c_0027_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005c_0060_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005c_002d_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005c_005f_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005c_0021_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005c_002f_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005cc_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005ce_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005cp_002c-as-delimiter-1"></a>
+any escape sequences other than <code class="code">\%</code>, <code class="code">\:</code>, <code class="code">\{</code>,
+<code class="code">\}</code>, <code class="code">\'</code>, <code class="code">\`</code>, <code class="code">\-</code>, <code class="code">\_</code>, <code class="code">\!</code>,
+<code class="code">\/</code>, <code class="code">\c</code>, <code class="code">\e</code>, and <code class="code">\p</code>
+</li></ul>
+
+<p>Delimiter syntax is complex and flexible primarily for historical
+reasons; the foregoing restrictions need be kept in mind mainly when
+using <code class="code">groff</code> in <abbr class="acronym">AT&amp;T</abbr> compatibility mode. GNU
+<code class="code">troff</code> keeps track of the nesting depth of escape sequence
+interpolations, so the only characters you need to avoid using as
+delimiters are those that appear in the arguments you input, not any
+that result from interpolation. Typically, <code class="code">'</code> works fine.
+See <a class="xref" href="#Implementation-Differences">Implementation Differences</a>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">$ groff -Tps
+.de Mw
+. nr wd \w'\\$1'
+. tm &quot;\\$1&quot; is \\n(wd units wide.
+..
+.Mw Wet'suwet'en
+.Mw Wet+200i
+.cp 1 \&quot; turn on compatibility mode
+.Mw Wet'suwet'en
+.Mw Wet'
+.Mw Wet+200i
+ error&rarr; &quot;Wet'suwet'en&quot; is 54740 units wide.
+ error&rarr; &quot;Wet'+200i&quot; is 42610 units wide.
+ error&rarr; &quot;Wet'suwet'en&quot; is 15860 units wide.
+ error&rarr; &quot;Wet'&quot; is 15860 units wide.
+ error&rarr; &quot;Wet'+200i&quot; is 14415860 units wide.
+</pre></div></div>
+
+<p>We see here that in compatibility mode, the part of the argument after
+the <code class="code">'</code> delimiter escapes from its context and, if nefariously
+crafted, influences the computation of the <var class="var">wd</var> register&rsquo;s value in
+a surprising way.
+</p>
+<hr>
+</div>
+</div>
+<div class="section-level-extent" id="Comments">
+<div class="nav-panel">
+<p>
+Next: <a href="#Registers" accesskey="n" rel="next">Registers</a>, Previous: <a href="#Formatter-Instructions" accesskey="p" rel="prev">Formatter Instructions</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Comments-1">5.7 Comments</h3>
+<a class="index-entry-id" id="index-comments"></a>
+
+<p>One of the most common forms of escape sequence is the
+comment.<a class="footnote" id="DOCF48" href="#FOOT48"><sup>48</sup></a>
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0022-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\&quot;</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0022-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0022"></a>
+<p>Start a comment. Everything up to the next newline is ignored.
+</p>
+<p>This may sound simple, but it can be tricky to keep the comments from
+interfering with the appearance of the output.
+<a class="index-entry-id" id="index-ds_002c-ds1-requests_002c-and-comments"></a>
+<a class="index-entry-id" id="index-as_002c-as1-requests_002c-and-comments"></a>
+If the escape sequence is to the right of some text or a request, that
+portion of the line is ignored, but spaces preceding it are processed
+normally by GNU <code class="code">troff</code>. This affects only the <code class="code">ds</code> and
+<code class="code">as</code> requests and their variants.
+</p>
+<a class="index-entry-id" id="index-tabs_002c-before-comments"></a>
+<a class="index-entry-id" id="index-comments_002c-lining-up-with-tabs"></a>
+<p>One possibly irritating idiosyncrasy is that tabs should not be used to
+vertically align comments in the source document. Tab characters are
+not treated as separators between a request name and its first argument,
+nor between arguments.
+</p>
+<a class="index-entry-id" id="index-undefined-request"></a>
+<a class="index-entry-id" id="index-request_002c-undefined"></a>
+<p>A comment on a line by itself is treated as a blank line, because after
+eliminating the comment, that is all that remains.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">Test
+\&quot; comment
+Test
+ &rArr; Test
+ &rArr;
+ &rArr; Test
+</pre></div></div>
+
+<p>To avoid this, it is common to combine the empty request with the
+comment escape sequence as &lsquo;<samp class="samp">.\&quot;</samp>&rsquo;, causing the input line to be
+ignored.
+</p>
+<a class="index-entry-id" id="index-_0027_002c-as-a-comment"></a>
+<p>Another commenting scheme sometimes seen is three consecutive single
+quotes (<code class="code">'''</code>) at the beginning of a line. This works, but GNU
+<code class="code">troff</code> emits a warning diagnostic (if enabled) about an undefined
+macro (namely &lsquo;<samp class="samp">''</samp>&rsquo;).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0023-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\#</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0023-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0023"></a>
+<p>Start a comment; everything up to and including the next newline is
+ignored. This <code class="code">groff</code> extension was introduced to avoid the
+problems described above.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">Test
+\# comment
+Test
+ &rArr; Test Test
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eig"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ig</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">end</i></span>]</var><a class="copiable-link" href='#index-_002eig'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ig"></a>
+<p>Ignore input until, in the current conditional block (if
+any),<a class="footnote" id="DOCF49" href="#FOOT49"><sup>49</sup></a> the macro <var class="var">end</var> is called
+at the start of a control line, or the control line &lsquo;<samp class="samp">..</samp>&rsquo; is
+encountered if <var class="var">end</var> is not specified. <code class="code">ig</code> is parsed as if it
+were a macro definition, but its contents are discarded, not
+stored.<a class="footnote" id="DOCF50" href="#FOOT50"><sup>50</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">hand\c
+.de TX
+fasting
+..
+.ig TX
+This is part of a large block of input that has been
+temporarily(?) commented out.
+We can restore it simply by removing the .ig request and
+the call of its end macro.
+.TX
+</pre></div></div>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; handfasting
+</pre></div></div>
+</dd></dl>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Registers">
+<div class="nav-panel">
+<p>
+Next: <a href="#Manipulating-Filling-and-Adjustment" accesskey="n" rel="next">Manipulating Filling and Adjustment</a>, Previous: <a href="#Formatter-Instructions" accesskey="p" rel="prev">Formatter Instructions</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Registers-1">5.8 Registers</h3>
+<a class="index-entry-id" id="index-registers"></a>
+
+<p>In the <code class="code">roff</code> language, numbers can be stored in <em class="dfn">registers</em>.
+Many built-in registers exist, supplying anything from the date to
+details of formatting parameters. You can also define your own.
+See <a class="xref" href="#Identifiers">Identifiers</a>, for information on constructing a valid name for a
+register.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="#Setting-Registers" accesskey="1">Setting Registers</a></li>
+<li><a href="#Interpolating-Registers" accesskey="2">Interpolating Registers</a></li>
+<li><a href="#Auto_002dincrement" accesskey="3">Auto-increment</a></li>
+<li><a href="#Assigning-Register-Formats" accesskey="4">Assigning Register Formats</a></li>
+<li><a href="#Built_002din-Registers" accesskey="5">Built-in Registers</a></li>
+</ul>
+<hr>
+<div class="subsection-level-extent" id="Setting-Registers">
+<div class="nav-panel">
+<p>
+Next: <a href="#Interpolating-Registers" accesskey="n" rel="next">Interpolating Registers</a>, Previous: <a href="#Registers" accesskey="p" rel="prev">Registers</a>, Up: <a href="#Registers" accesskey="u" rel="up">Registers</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Setting-Registers-1">5.8.1 Setting Registers</h4>
+<a class="index-entry-id" id="index-setting-registers-_0028nr_002c-_005cR_0029"></a>
+<a class="index-entry-id" id="index-registers_002c-setting-_0028nr_002c-_005cR_0029"></a>
+
+<p>Define registers and update their values with the <code class="code">nr</code> request or
+the <code class="code">\R</code> escape sequence.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enr-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nr</code></strong> <var class="def-var-arguments">ident value</var><a class="copiable-link" href='#index-_002enr-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nr-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cR_0027ident-value_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\R<code class="code">'</code></code><span class="r"><i class="slanted">ident value</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cR_0027ident-value_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cR"></a>
+<p>Set register <var class="var">ident</var> to <var class="var">value</var>. If <var class="var">ident</var> doesn&rsquo;t exist,
+GNU <code class="code">troff</code> creates it. In the <code class="code">\R</code> escape sequence, the
+delimiter need not be a neutral apostrophe; see <a class="ref" href="#Delimiters">Delimiters</a>. It
+also does not produce an input token in GNU <code class="code">troff</code>. See <a class="xref" href="#Gtroff-Internals"><code class="code">gtroff</code> Internals</a>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a (((17 + (3 * 4))) % 4)
+\n[a]
+.\R'a (((17 + (3 * 4))) % 4)'
+\n[a]
+ &rArr; 1 1
+</pre></div></div>
+
+<p>(Later, we will discuss additional forms of <code class="code">nr</code> and <code class="code">\R</code> that
+can change a register&rsquo;s value after it is dereferenced but before it is
+interpolated. See <a class="xref" href="#Auto_002dincrement">Auto-increment</a>.)
+</p>
+<p>The complete transparency of <code class="code">\R</code> can cause surprising effects if
+you use registers like <code class="code">.k</code>, which get evaluated at the time they
+are accessed.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 1.6i
+.
+aaa bbb ccc ddd eee fff ggg hhh\R':k \n[.k]'
+.tm :k == \n[:k]
+ &rArr; :k == 126950
+.
+.br
+.
+aaa bbb ccc ddd eee fff ggg hhh\h'0'\R':k \n[.k]'
+.tm :k == \n[:k]
+ &rArr; :k == 15000
+</pre></div></div>
+
+<p>If you process this with the PostScript device (<code class="code">-Tps</code>), there will
+be a line break eventually after <code class="code">ggg</code> in both input lines.
+However, after processing the space after <code class="code">ggg</code>, the partially
+collected line is not overfull yet, so GNU <code class="code">troff</code> continues to
+collect input until it sees the space (or in this case, the newline)
+after <code class="code">hhh</code>. At this point, the line is longer than the line
+length, and the line gets broken.
+</p>
+<p>In the first input line, since the <code class="code">\R</code> escape sequence leaves no
+traces, the check for the overfull line hasn&rsquo;t been done yet at the
+point where <code class="code">\R</code> gets handled, and you get a value for the
+<code class="code">.k</code> register that is even greater than the current line length.
+</p>
+<p>In the second input line, the insertion of <code class="code">\h'0'</code> to cause a
+zero-width motion forces GNU <code class="code">troff</code> to check the line length,
+which in turn causes the start of a new output line. Now <code class="code">.k</code>
+returns the expected value.
+</p></dd></dl>
+
+<p><code class="code">nr</code> and <code class="code">\R</code> each have two additional special forms to
+increment or decrement a register.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enr-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nr</code></strong> <var class="def-var-arguments">ident <code class="t">+</code><span class="r"><i class="slanted">value</i></span></var><a class="copiable-link" href='#index-_002enr-2'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nr-2"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002enr-3"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nr</code></strong> <var class="def-var-arguments">ident <code class="t">-</code><span class="r"><i class="slanted">value</i></span></var><a class="copiable-link" href='#index-_002enr-3'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cR_0027ident-_002bvalue_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\R<code class="code">'</code></code><span class="r"><i class="slanted">ident <code class="t">+</code>value</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cR_0027ident-_002bvalue_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cR-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cR_0027ident-_002dvalue_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\R<code class="code">'</code></code><span class="r"><i class="slanted">ident <code class="t">-</code>value</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cR_0027ident-_002dvalue_0027'> &para;</a></span></dt>
+<dd><p>Increment (decrement) register <var class="var">ident</var> by <var class="var">value</var>. In the
+<code class="code">\R</code> escape sequence, the delimiter need not be a neutral
+apostrophe; see <a class="ref" href="#Delimiters">Delimiters</a>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a 1
+.nr a +1
+\na
+ &rArr; 2
+</pre></div></div>
+
+<a class="index-entry-id" id="index-negating-register-values"></a>
+<p>A leading minus sign in <var class="var">value</var> is always interpreted as a
+decrementation operator, not an algebraic sign. To assign a register a
+negative value or the negated value of another register, you can
+force GNU <code class="code">troff</code> to interpret &lsquo;<samp class="samp">-</samp>&rsquo; as a negation or minus,
+rather than decrementation, operator: enclose it with its operand in
+parentheses or subtract it from zero.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a 7
+.nr b 3
+.nr a -\nb
+\na
+ &rArr; 4
+.nr a (-\nb)
+\na
+ &rArr; -3
+.nr a 0-\nb
+\na
+ &rArr; -3
+</pre></div></div>
+
+<p>If a register&rsquo;s prior value does not exist (the register was undefined),
+an increment or decrement is applied as if to&nbsp;0.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002err"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.rr</code></strong> <var class="def-var-arguments">ident</var><a class="copiable-link" href='#index-_002err'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rr"></a>
+<a class="index-entry-id" id="index-removing-a-register-_0028rr_0029"></a>
+<a class="index-entry-id" id="index-register_002c-removing-_0028rr_0029"></a>
+<p>Remove register <var class="var">ident</var>. If <var class="var">ident</var> doesn&rsquo;t exist, the request
+is ignored. Technically, only the name is removed; the register&rsquo;s
+contents are still accessible under aliases created with <code class="code">aln</code>, if
+any.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ernn"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.rnn</code></strong> <var class="def-var-arguments">ident1 ident2</var><a class="copiable-link" href='#index-_002ernn'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rnn"></a>
+<a class="index-entry-id" id="index-renaming-a-register-_0028rnn_0029"></a>
+<a class="index-entry-id" id="index-register_002c-renaming-_0028rnn_0029"></a>
+<p>Rename register <var class="var">ident1</var> to <var class="var">ident2</var>. If <var class="var">ident1</var> doesn&rsquo;t
+exist, the request is ignored. Renaming a built-in register does not
+otherwise alter its properties.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ealn"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.aln</code></strong> <var class="def-var-arguments">new old</var><a class="copiable-link" href='#index-_002ealn'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-aln"></a>
+<a class="index-entry-id" id="index-alias_002c-register_002c-creating-_0028aln_0029"></a>
+<a class="index-entry-id" id="index-creating-alias-for-register-_0028aln_0029"></a>
+<a class="index-entry-id" id="index-register_002c-creating-alias-for-_0028aln_0029"></a>
+<p>Create an alias <var class="var">new</var> for an existing register <var class="var">old</var>, causing
+the names to refer to the same stored object. If <var class="var">old</var> is
+undefined, a warning in category &lsquo;<samp class="samp">reg</samp>&rsquo; is produced and the request
+is ignored. See <a class="xref" href="#Warnings">Warnings</a>, for information about the enablement and
+suppression of warnings.
+</p>
+<a class="index-entry-id" id="index-alias_002c-register_002c-removing-_0028rr_0029"></a>
+<a class="index-entry-id" id="index-removing-alias-for-register-_0028rr_0029"></a>
+<a class="index-entry-id" id="index-register_002c-removing-alias-for-_0028rr_0029"></a>
+<p>To remove a register alias, invoke <code class="code">rr</code> on its name. A register&rsquo;s
+contents do not become inaccessible until it has no more names.
+</p></dd></dl>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Interpolating-Registers">
+<div class="nav-panel">
+<p>
+Next: <a href="#Auto_002dincrement" accesskey="n" rel="next">Auto-increment</a>, Previous: <a href="#Setting-Registers" accesskey="p" rel="prev">Setting Registers</a>, Up: <a href="#Registers" accesskey="u" rel="up">Registers</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Interpolating-Registers-1">5.8.2 Interpolating Registers</h4>
+<a class="index-entry-id" id="index-interpolating-registers-_0028_005cn_0029"></a>
+<a class="index-entry-id" id="index-registers_002c-interpolating-_0028_005cn_0029"></a>
+
+<p>Register contents are interpolated with the <code class="code">\n</code> escape sequence.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cni"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\n</code><span class="r"><i class="slanted">i</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cni'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cn"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_0028id"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\n(</code><span class="r"><i class="slanted">id</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cn_0028id'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005bident_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\n[</code><span class="r"><i class="slanted">ident</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cn_005bident_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nested-assignments"></a>
+<a class="index-entry-id" id="index-assignments_002c-nested"></a>
+<a class="index-entry-id" id="index-indirect-assignments"></a>
+<a class="index-entry-id" id="index-assignments_002c-indirect"></a>
+<p>Interpolate register with name <var class="var">ident</var> (one-character
+name&nbsp;<var class="var">i</var>, two-character name <var class="var">id</var>). <code class="code">\n</code> is
+interpreted even in copy mode (see <a class="pxref" href="#Copy-Mode">Copy Mode</a>). If the register is
+undefined, it is created and assigned a value of&nbsp;&lsquo;<samp class="samp">0</samp>&rsquo;, that
+value is interpolated, and a warning in category &lsquo;<samp class="samp">reg</samp>&rsquo; is emitted.
+See <a class="xref" href="#Warnings">Warnings</a>, for information about the enablement and suppression of
+warnings.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a 5
+.nr as \na+\na
+\n(as
+ &rArr; 10
+</pre></div></div>
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a1 5
+.nr ab 6
+.ds str b
+.ds num 1
+\n[a\n[num]]
+ &rArr; 5
+\n[a\*[str]]
+ &rArr; 6
+</pre></div></div>
+</dd></dl>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Auto_002dincrement">
+<div class="nav-panel">
+<p>
+Next: <a href="#Assigning-Register-Formats" accesskey="n" rel="next">Assigning Register Formats</a>, Previous: <a href="#Interpolating-Registers" accesskey="p" rel="prev">Interpolating Registers</a>, Up: <a href="#Registers" accesskey="u" rel="up">Registers</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Auto_002dincrement-1">5.8.3 Auto-increment</h4>
+<a class="index-entry-id" id="index-auto_002dincrementation-of-a-register"></a>
+<a class="index-entry-id" id="index-incrementation_002c-automatic_002c-of-a-register"></a>
+<a class="index-entry-id" id="index-decrementation_002c-automatic_002c-of-a-register"></a>
+
+<p>Registers can also be incremented or decremented by a configured amount
+at the time they are interpolated. The value of the increment is
+specified with a third argument to the <code class="code">nr</code> request, and a special
+interpolation syntax is used to alter and then retrieve the register&rsquo;s
+value. Together, these features are called
+<em class="dfn">auto-increment</em>.<a class="footnote" id="DOCF51" href="#FOOT51"><sup>51</sup></a>
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enr-4"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nr</code></strong> <var class="def-var-arguments">ident value incr</var><a class="copiable-link" href='#index-_002enr-4'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nr-3"></a>
+<a class="index-entry-id" id="index-_005cR_002c-difference-from-nr"></a>
+<p>Set register <var class="var">ident</var> to <var class="var">value</var> and its auto-incrementation
+amount to to <var class="var">incr</var>. The <code class="code">\R</code> escape sequence doesn&rsquo;t support
+an <var class="var">incr</var> argument.
+</p></dd></dl>
+
+<p>Auto-incrementation is not <em class="emph">completely</em> automatic; the <code class="code">\n</code>
+escape sequence in its basic form never alters the value of a register.
+To apply auto-incrementation to a register, interpolate it with
+&lsquo;<samp class="samp">\n±</samp>&rsquo;.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_002bi"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\n+</code><span class="r"><i class="slanted">i</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cn_002bi'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cn-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_002di"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\n-</code><span class="r"><i class="slanted">i</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cn_002di'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_002b_0028id"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\n+(</code><span class="r"><i class="slanted">id</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cn_002b_0028id'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_002d_0028id"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\n-(</code><span class="r"><i class="slanted">id</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cn_002d_0028id'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_002b_005bident_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\n+[</code><span class="r"><i class="slanted">ident</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cn_002b_005bident_005d'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_002d_005bident_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\n-[</code><span class="r"><i class="slanted">ident</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cn_002d_005bident_005d'> &para;</a></span></dt>
+<dd><p>Increment or decrement <var class="var">ident</var> (one-character
+name&nbsp;<var class="var">i</var>, two-character name <var class="var">id</var>) by the register&rsquo;s
+auto-incrementation value and then interpolate the new register value.
+If <var class="var">ident</var> has no auto-incrementation value, interpolate as with
+<code class="code">\n</code>.
+</p></dd></dl>
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a 0 1
+.nr xx 0 5
+.nr foo 0 -2
+\n+a, \n+a, \n+a, \n+a, \n+a
+.br
+\n-(xx, \n-(xx, \n-(xx, \n-(xx, \n-(xx
+.br
+\n+[foo], \n+[foo], \n+[foo], \n+[foo], \n+[foo]
+ &rArr; 1, 2, 3, 4, 5
+ &rArr; -5, -10, -15, -20, -25
+ &rArr; -2, -4, -6, -8, -10
+</pre></div></div>
+
+<a class="index-entry-id" id="index-increment-value-without-changing-the-register"></a>
+<a class="index-entry-id" id="index-value_002c-incrementing-without-changing-the-register"></a>
+<p>To change the increment value without changing the value of a register,
+assign the register&rsquo;s value to itself by interpolating it, and specify
+the desired increment normally. Apply an increment of &lsquo;<samp class="samp">0</samp>&rsquo; to
+disable auto-incrementation of the register.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Assigning-Register-Formats">
+<div class="nav-panel">
+<p>
+Next: <a href="#Built_002din-Registers" accesskey="n" rel="next">Built-in Registers</a>, Previous: <a href="#Auto_002dincrement" accesskey="p" rel="prev">Auto-increment</a>, Up: <a href="#Registers" accesskey="u" rel="up">Registers</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Assigning-Register-Formats-1">5.8.4 Assigning Register Formats</h4>
+<a class="index-entry-id" id="index-assign-number-format-to-register-_0028af_0029"></a>
+<a class="index-entry-id" id="index-number-formats_002c-assigning-to-register-_0028af_0029"></a>
+<a class="index-entry-id" id="index-register_002c-assigning-number-format-to-_0028af_0029"></a>
+
+<p>A writable register&rsquo;s value can be interpolated in several number
+formats. By default, conventional Arabic numerals are used.
+Other formats see use in sectioning and outlining schemes and
+alternative page numbering arrangements.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eaf"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.af</code></strong> <var class="def-var-arguments">reg fmt</var><a class="copiable-link" href='#index-_002eaf'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-af"></a>
+<p>Use number format <var class="var">fmt</var> when interpolating register <var class="var">reg</var>.
+Valid number formats are as follows.
+</p>
+<dl class="table">
+<dt><code class="code">0<span class="r">&hellip;</span></code></dt>
+<dd><p>Arabic numerals 0, 1, 2, and so on.
+Any decimal digit is equivalent to &lsquo;<samp class="samp">0</samp>&rsquo;; the formatter merely counts
+the digits specified. Multiple Arabic numerals in <var class="var">fmt</var> cause
+interpolations to be zero-padded on the left if necessary to at least as
+many digits as specified (interpolations never truncate a register
+value). A register with format &lsquo;<samp class="samp">00</samp>&rsquo; interpolates values 1, 2, 3 as
+&lsquo;<samp class="samp">01</samp>&rsquo;, &lsquo;<samp class="samp">02</samp>&rsquo;, &lsquo;<samp class="samp">03</samp>&rsquo;. The default format for all writable
+registers is &lsquo;<samp class="samp">0</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-Roman-numerals'><span><code class="code">I</code><a class="copiable-link" href='#index-Roman-numerals'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-numerals_002c-Roman"></a>
+<p>Uppercase Roman numerals: 0, I, II, III, IV,&nbsp;<small class="enddots">...</small>
+</p>
+</dd>
+<dt><code class="code">i</code></dt>
+<dd><p>Lowercase Roman numerals: 0, i, ii, iii, iv,&nbsp;<small class="enddots">...</small>
+</p>
+</dd>
+<dt><code class="code">A</code></dt>
+<dd><p>Uppercase letters: 0, A, B, C, &hellip;,&nbsp;Z, AA, AB,&nbsp;<small class="enddots">...</small>
+</p>
+</dd>
+<dt><code class="code">a</code></dt>
+<dd><p>Lowercase letters: 0, a, b, c, &hellip;,&nbsp;z, aa, ab,&nbsp;<small class="enddots">...</small>
+</p></dd>
+</dl>
+
+<p>Omitting <var class="var">fmt</var> causes a warning in category &lsquo;<samp class="samp">missing</samp>&rsquo;.
+See <a class="xref" href="#Warnings">Warnings</a>, for information about the enablement and suppression of
+warnings. Specifying an unrecognized format is an error.
+</p>
+<p>Zero values are interpolated as &lsquo;<samp class="samp">0</samp>&rsquo; in non-Arabic formats.
+Negative quantities are prefixed with &lsquo;<samp class="samp">-</samp>&rsquo; irrespective of format.
+In Arabic formats, the sign supplements the field width. If <var class="var">reg</var>
+doesn&rsquo;t exist, it is created with a zero value.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a 10
+.af a 0 \&quot; the default format
+\na,
+.af a I
+\na,
+.af a 321
+.nr a (-\na)
+\na,
+.af a a
+\na
+ &rArr; 10, X, -010, -j
+</pre></div></div>
+
+<a class="index-entry-id" id="index-Roman-numerals_002c-extrema-_0028maximum-and-minimum_0029"></a>
+<a class="index-entry-id" id="index-extreme-values-representable-with-Roman-numerals"></a>
+<a class="index-entry-id" id="index-maximum-value-representable-with-Roman-numerals"></a>
+<a class="index-entry-id" id="index-minimum-value-representable-with-Roman-numerals"></a>
+<p>The representable extrema in the &lsquo;<samp class="samp">i</samp>&rsquo; and &lsquo;<samp class="samp">I</samp>&rsquo; formats
+correspond to Arabic ±39,999. GNU <code class="code">troff</code> uses &lsquo;<samp class="samp">w</samp>&rsquo; and
+&lsquo;<samp class="samp">z</samp>&rsquo; to represent 5,000 and 10,000 in Roman numerals, respectively,
+following the convention of <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>&mdash;currently, the
+correct glyphs for Roman numerals five thousand (<code class="code">U+2181</code>) and ten
+thousand (<code class="code">U+2182</code>) are not used.
+</p>
+<a class="index-entry-id" id="index-read_002donly-register_002c-changing-format"></a>
+<a class="index-entry-id" id="index-changing-format_002c-and-read_002donly-registers"></a>
+<p>Assigning the format of a read-only register is an error. Instead, copy
+the read-only register&rsquo;s value to, and assign the format of, a writable
+register.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cgr"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\g</code><span class="r"><i class="slanted">r</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cgr'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cg"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cg_0028rg"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\g(</code><span class="r"><i class="slanted">rg</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cg_0028rg'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cg_005breg_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\g[</code><span class="r"><i class="slanted">reg</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cg_005breg_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-format-of-register-_0028_005cg_0029"></a>
+<a class="index-entry-id" id="index-register_002c-format-_0028_005cg_0029"></a>
+<p>Interpolate the format of the register <var class="var">reg</var> (one-character
+name&nbsp;<var class="var">r</var>, two-character name <var class="var">rg</var>). Zeroes represent
+Arabic formats. If <var class="var">reg</var> is not defined, <var class="var">reg</var> is not created
+and nothing is interpolated. <code class="code">\g</code> is interpreted even in copy mode
+(see <a class="pxref" href="#Copy-Mode">Copy Mode</a>).
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-register-format_002c-in-expressions"></a>
+<a class="index-entry-id" id="index-expressions_002c-and-register-format"></a>
+<p>GNU <code class="code">troff</code> interprets only Arabic numerals. The Roman numeral or
+alphabetic formats cannot be used as operands to arithmetic operators in
+expressions (see <a class="pxref" href="#Numeric-Expressions">Numeric Expressions</a>). For instance, it may be
+desirable to test the page number independently of its format.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.af % i \&quot; front matter
+.de header-trap
+. \&quot; To test the page number, we need it in Arabic.
+. ds saved-page-number-format \\g%\&quot;
+. af % 0
+. nr page-number-in-decimal \\n%
+. af % \\*[saved-page-number-format]
+. ie \\n[page-number-in-decimal]=1 .do-first-page-stuff
+. el \{\
+. ie o .do-odd-numbered-page-stuff
+. el .do-even-numbered-page-stuff
+. \}
+. rm saved-page-number-format
+..
+.wh 0 header-trap
+</pre></div></div>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Built_002din-Registers">
+<div class="nav-panel">
+<p>
+Previous: <a href="#Assigning-Register-Formats" accesskey="p" rel="prev">Assigning Register Formats</a>, Up: <a href="#Registers" accesskey="u" rel="up">Registers</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Built_002din-Registers-1">5.8.5 Built-in Registers</h4>
+<a class="index-entry-id" id="index-built_002din-registers"></a>
+<a class="index-entry-id" id="index-registers_002c-built_002din"></a>
+
+<p>Predefined registers whose identifiers start with a dot are read-only.
+Many are Boolean-valued, interpolating a true or false value testable
+with the <code class="code">if</code>, <code class="code">ie</code>, or <code class="code">while</code> requests. Some read-only
+registers are string-valued, meaning that they interpolate text.
+</p>
+<a class="index-entry-id" id="index-removing-a-built_002din-register"></a>
+<a class="index-entry-id" id="index-register_002c-built_002din_002c-removing"></a>
+<a class="index-entry-id" id="index-built_002din-register_002c-removing"></a>
+<p><strong class="strong">Caution:</strong> Built-in registers are subject to removal like
+others; once removed, they can be recreated only as normal writable
+registers and will not reflect formatter state.
+</p>
+<p>A register name (without the dot) is often associated with a request of
+the same name. A complete listing of all built-in registers can be
+found in <a class="ref" href="#Register-Index">Register Index</a>.
+</p>
+<p>We present here a few built-in registers that are not described
+elsewhere in this manual; they have to do with invariant properties of
+GNU <code class="code">troff</code>, or obtain information about the formatter&rsquo;s
+command-line options, processing progress, or the operating environment.
+</p>
+<dl class="table">
+<dt id='index-_002eA'><span><code class="code">\n[.A]</code><a class="copiable-link" href='#index-_002eA'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-approximation-output-register-_0028_002eA_0029"></a>
+<a class="index-entry-id" id="index-plain-text-approximation-output-register-_0028_002eA_0029-1"></a>
+<p>Approximate output is being formatted (Boolean-valued); see
+<code class="command">groff</code> <samp class="option">-a</samp> option (<a class="ref" href="#Groff-Options">Options</a>).
+</p>
+</dd>
+<dt id='index-c_002e'><span><code class="code">\n[.c]</code><a class="copiable-link" href='#index-c_002e'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ec"></a>
+</dd>
+<dt><code class="code">\n[c.]</code></dt>
+<dd><a class="index-entry-id" id="index-input-line-number-register-_0028_002ec_002c-c_002e_0029"></a>
+<a class="index-entry-id" id="index-line-number_002c-input_002c-register-_0028_002ec_002c-c_002e_0029"></a>
+<p>Input line number. &lsquo;<samp class="samp">c.</samp>&rsquo; is a writable synonym,
+affecting subsequent interpolations of both &lsquo;<samp class="samp">.c</samp>&rsquo; and &lsquo;<samp class="samp">c.</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-current-input-file-name-register-_0028_002eF_0029'><span><code class="code">\n[.F]</code><a class="copiable-link" href='#index-current-input-file-name-register-_0028_002eF_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-input-file-name_002c-current_002c-register-_0028_002eF_0029"></a>
+<a class="index-entry-id" id="index-_002eF"></a>
+<p>Name of input file (string-valued).
+</p>
+</dd>
+<dt id='index-_002eg'><span><code class="code">\n[.g]</code><a class="copiable-link" href='#index-_002eg'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-GNU-troff_002c-identification-register-_0028_002eg_0029"></a>
+<a class="index-entry-id" id="index-GNU_002dspecific-register-_0028_002eg_0029"></a>
+<p>Always true in GNU <code class="code">troff</code> (Boolean-valued). Documents can use
+this to ask the formatter if it claims <code class="code">groff</code> compatibility.
+</p>
+</dd>
+<dt id='index-_002eP'><span><code class="code">\n[.P]</code><a class="copiable-link" href='#index-_002eP'> &para;</a></span></dt>
+<dd><p>Output page selection status (Boolean-valued); see <code class="command">groff</code>
+<samp class="option">-o</samp> option (<a class="ref" href="#Groff-Options">Options</a>).
+</p>
+</dd>
+<dt id='index-number-of-registers-register-_0028_002eR_0029'><span><code class="code">\n[.R]</code><a class="copiable-link" href='#index-number-of-registers-register-_0028_002eR_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-registers_002c-number-of_002c-register-_0028_002eR_0029"></a>
+<a class="index-entry-id" id="index-_002eR-2"></a>
+<p>Count of available unused registers; always 10,000 in GNU
+<code class="code">troff</code>.<a class="footnote" id="DOCF52" href="#FOOT52"><sup>52</sup></a>
+</p>
+</dd>
+<dt id='index-_002eT-2'><span><code class="code">\n[.T]</code><a class="copiable-link" href='#index-_002eT-2'> &para;</a></span></dt>
+<dd><p>Indicator of output device selection (Boolean-valued); see
+<code class="command">groff</code> <samp class="option">-T</samp> option (<a class="ref" href="#Groff-Options">Options</a>).
+</p>
+</dd>
+<dt id='index-safer-mode-2'><span><code class="code">\n[.U]</code><a class="copiable-link" href='#index-safer-mode-2'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-mode_002c-safer-2"></a>
+<a class="index-entry-id" id="index-unsafe-mode-2"></a>
+<a class="index-entry-id" id="index-mode_002c-unsafe-2"></a>
+<a class="index-entry-id" id="index-_002eU"></a>
+<p>Unsafe mode enablement status (Boolean-valued); see <code class="command">groff</code>
+<samp class="option">-U</samp> option (<a class="ref" href="#Groff-Options">Options</a>).
+</p>
+</dd>
+<dt id='index-_002ex'><span><code class="code">\n[.x]</code><a class="copiable-link" href='#index-_002ex'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-major-version-number-register-_0028_002ex_0029"></a>
+<a class="index-entry-id" id="index-version-number_002c-major_002c-register-_0028_002ex_0029"></a>
+<p>Major version number of the running GNU <code class="code">troff</code> formatter. For
+example, if the version number is 1.23.0, then <code class="code">.x</code>
+contains&nbsp;&lsquo;<samp class="samp">1</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-_002ey'><span><code class="code">\n[.y]</code><a class="copiable-link" href='#index-_002ey'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-minor-version-number-register-_0028_002ey_0029"></a>
+<a class="index-entry-id" id="index-version-number_002c-minor_002c-register-_0028_002ey_0029"></a>
+<p>Minor version number of the running GNU <code class="code">troff</code> formatter. For
+example, if the version number is 1.23.0, then <code class="code">.y</code>
+contains&nbsp;&lsquo;<samp class="samp">23</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-_002eY'><span><code class="code">\n[.Y]</code><a class="copiable-link" href='#index-_002eY'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-revision-number-register-_0028_002eY_0029"></a>
+<p>Revision number of the running GNU <code class="code">troff</code> formatter. For example,
+if the version number is 1.23.0, then <code class="code">.Y</code> contains&nbsp;&lsquo;<samp class="samp">0</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-_0024_0024'><span><code class="code">\n[$$]</code><a class="copiable-link" href='#index-_0024_0024'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-process-ID-of-GNU-troff-register-_0028_0024_0024_0029"></a>
+<a class="index-entry-id" id="index-PID-of-GNU-troff-register-_0028_0024_0024_0029"></a>
+<a class="index-entry-id" id="index-GNU-troff_002c-process-ID-register-_0028_0024_0024_0029"></a>
+<a class="index-entry-id" id="index-GNU-troff_002c-PID-register-_0028_0024_0024_0029"></a>
+<p>Process identifier (PID) of the GNU <code class="code">troff</code> program in its
+operating environment.
+</p></dd>
+</dl>
+
+<p>Date- and time-related registers are set per the local time as
+determined by <cite class="cite">localtime<span class="r">(3)</span></cite> when the formatter launches. This
+initialization can be overridden by <code class="env">SOURCE_DATE_EPOCH</code> and
+<code class="env">TZ</code>; see <a class="ref" href="#Environment">Environment</a>.
+</p>
+<dl class="table">
+<dt id='index-seconds_002c-current-time-_0028seconds_0029'><span><code class="code">\n[seconds]</code><a class="copiable-link" href='#index-seconds_002c-current-time-_0028seconds_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-time_002c-current_002c-seconds-_0028seconds_0029"></a>
+<a class="index-entry-id" id="index-current-time_002c-seconds-_0028seconds_0029"></a>
+<a class="index-entry-id" id="index-seconds"></a>
+<p>Count of seconds elapsed in the minute (0&ndash;60). </p>
+</dd>
+<dt id='index-minutes_002c-current-time-_0028minutes_0029'><span><code class="code">\n[minutes]</code><a class="copiable-link" href='#index-minutes_002c-current-time-_0028minutes_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-time_002c-current_002c-minutes-_0028minutes_0029"></a>
+<a class="index-entry-id" id="index-current-time_002c-minutes-_0028minutes_0029"></a>
+<a class="index-entry-id" id="index-minutes"></a>
+<p>Count of minutes elapsed in the hour (0&ndash;59).
+</p>
+</dd>
+<dt id='index-hours_002c-current-time-_0028hours_0029'><span><code class="code">\n[hours]</code><a class="copiable-link" href='#index-hours_002c-current-time-_0028hours_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-time_002c-current_002c-hours-_0028hours_0029"></a>
+<a class="index-entry-id" id="index-current-time_002c-hours-_0028hours_0029"></a>
+<a class="index-entry-id" id="index-hours"></a>
+<p>Count of hours elapsed since midnight (0&ndash;23).
+</p>
+</dd>
+<dt id='index-day-of-the-week-register-_0028dw_0029'><span><code class="code">\n[dw]</code><a class="copiable-link" href='#index-day-of-the-week-register-_0028dw_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-date_002c-day-of-the-week-register-_0028dw_0029"></a>
+<a class="index-entry-id" id="index-dw"></a>
+<p>Day of the week (1&ndash;7; 1 is Sunday).
+</p>
+</dd>
+<dt id='index-day-of-the-month-register-_0028dy_0029'><span><code class="code">\n[dy]</code><a class="copiable-link" href='#index-day-of-the-month-register-_0028dy_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-date_002c-day-of-the-month-register-_0028dy_0029"></a>
+<a class="index-entry-id" id="index-dy"></a>
+<p>Day of the month (1&ndash;31).
+</p>
+</dd>
+<dt id='index-month-of-the-year-register-_0028mo_0029'><span><code class="code">\n[mo]</code><a class="copiable-link" href='#index-month-of-the-year-register-_0028mo_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-date_002c-month-of-the-year-register-_0028mo_0029"></a>
+<a class="index-entry-id" id="index-mo"></a>
+<p>Month of the year (1&ndash;12).
+</p>
+</dd>
+<dt id='index-date_002c-year-register-_0028year_002c-yr_0029'><span><code class="code">\n[year]</code><a class="copiable-link" href='#index-date_002c-year-register-_0028year_002c-yr_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-year_002c-current_002c-register-_0028year_002c-yr_0029"></a>
+<a class="index-entry-id" id="index-year"></a>
+<p>Gregorian year.
+</p>
+<a class="index-entry-id" id="index-CSTR-_002354-errata"></a>
+<a class="index-entry-id" id="index-CSTR-_002354-erratum_002c-yr-register"></a>
+</dd>
+<dt id='index-yr'><span><code class="code">\n[yr]</code><a class="copiable-link" href='#index-yr'> &para;</a></span></dt>
+<dd><p>Gregorian year minus&nbsp;1900. This register is incorrectly documented
+in the <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> manual as storing the last two digits
+of the current year. That claim stopped being true in 2000. Old
+<code class="code">troff</code> input that looks like:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">'\&quot; The year number is a surprise after 1999.
+This document was formatted in 19\n(yr.
+</pre></div></div>
+
+<p>can be corrected to:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">This document was formatted in \n[year].
+</pre></div></div>
+
+<p>or, for portability across many <code class="code">roff</code> programs, to the following.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr y4 1900+\n(yr
+This document was formatted in \n(y4.
+</pre></div></div>
+</dd>
+</dl>
+
+
+
+<hr>
+</div>
+</div>
+<div class="section-level-extent" id="Manipulating-Filling-and-Adjustment">
+<div class="nav-panel">
+<p>
+Next: <a href="#Manipulating-Hyphenation" accesskey="n" rel="next">Manipulating Hyphenation</a>, Previous: <a href="#Registers" accesskey="p" rel="prev">Registers</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Manipulating-Filling-and-Adjustment-1">5.9 Manipulating Filling and Adjustment</h3>
+<a class="index-entry-id" id="index-manipulating-filling-and-adjustment"></a>
+<a class="index-entry-id" id="index-filling-and-adjustment_002c-manipulating"></a>
+<a class="index-entry-id" id="index-adjustment-and-filling_002c-manipulating"></a>
+<a class="index-entry-id" id="index-justifying-text"></a>
+<a class="index-entry-id" id="index-text_002c-justifying"></a>
+
+<a class="index-entry-id" id="index-break-1"></a>
+<a class="index-entry-id" id="index-line-break"></a>
+<a class="index-entry-id" id="index-bp-request_002c-causing-implicit-break"></a>
+<a class="index-entry-id" id="index-ce-request_002c-causing-implicit-break"></a>
+<a class="index-entry-id" id="index-cf-request_002c-causing-implicit-break"></a>
+<a class="index-entry-id" id="index-fi-request_002c-causing-implicit-break"></a>
+<a class="index-entry-id" id="index-fl-request_002c-causing-implicit-break"></a>
+<a class="index-entry-id" id="index-in-request_002c-causing-implicit-break"></a>
+<a class="index-entry-id" id="index-nf-request_002c-causing-implicit-break"></a>
+<a class="index-entry-id" id="index-rj-request_002c-causing-implicit-break"></a>
+<a class="index-entry-id" id="index-sp-request_002c-causing-implicit-break"></a>
+<a class="index-entry-id" id="index-ti-request_002c-causing-implicit-break"></a>
+<a class="index-entry-id" id="index-trf-request_002c-causing-implicit-break"></a>
+<p>When an output line is pending (see below), a break moves the drawing
+position to the beginning of the next text baseline, interrupting
+filling. Various ways of causing breaks were shown in <a class="ref" href="#Breaking">Breaking</a>.
+The <code class="code">br</code> request likewise causes a break. Several other requests
+imply breaks: <code class="code">bp</code>, <code class="code">ce</code>, <code class="code">cf</code>, <code class="code">fi</code>, <code class="code">fl</code>,
+<code class="code">in</code>, <code class="code">nf</code>, <code class="code">rj</code>, <code class="code">sp</code>, <code class="code">ti</code>, and <code class="code">trf</code>.
+If the no-break control character is used with any of these requests,
+GNU <code class="code">troff</code> suppresses the break; instead the requested operation
+takes effect at the next break. &lsquo;<samp class="samp">'br</samp>&rsquo; does nothing.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 55n
+This line is normally filled and adjusted.
+.br
+A line's alignment is decided
+'ce \&quot; Center the next input line (no break).
+when it is output.
+This line returns to normal filling and adjustment.
+ &rArr; This line is normally filled and adjusted.
+ &rArr; A line's alignment is decided when it is output.
+ &rArr; This line returns to normal filling and adjustment.
+</pre></div></div>
+
+<a class="index-entry-id" id="index-pending-output-line"></a>
+<a class="index-entry-id" id="index-partially-collected-line"></a>
+<a class="index-entry-id" id="index-output-line-properties"></a>
+<a class="index-entry-id" id="index-properties-of-output-lines"></a>
+<p>Output line properties like page offset, indentation, adjustment, and
+even the location of its text baseline, are not determined until the
+line has been broken. An output line is said to be <em class="dfn">pending</em> if
+some input has been collected but an output line corresponding to it has
+not yet been written; such an output line is also termed <em class="dfn">partially
+collected</em>. If no output line is pending, it is as if a break has
+already happened; additional breaks, whether explicit or implicit, have
+no effect. If the vertical drawing position is negative&mdash;as it is when
+the formatter starts up&mdash;a break starts a new page (even if no output
+line is pending) unless an end-of-input macro is being interpreted.
+See <a class="xref" href="#End_002dof_002dinput-Traps">End-of-input Traps</a>.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ebr"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.br</code></strong><a class="copiable-link" href='#index-_002ebr'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-br"></a>
+<p>Break the line: emit any pending output line without adjustment.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">foo bar
+.br
+baz
+'br
+qux
+ &rArr; foo bar
+ &rArr; baz qux
+</pre></div></div>
+</dd></dl>
+
+<p>Sometimes you want to prevent a break within a phrase or between a
+quantity and its units.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_007e-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\~</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_007e-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_007e"></a>
+<a class="index-entry-id" id="index-unbreakable-space-_0028_005c_007e_0029"></a>
+<a class="index-entry-id" id="index-space_002c-unbreakable-_0028_005c_007e_0029"></a>
+<p>Insert an unbreakable space that is adjustable like an ordinary space.
+It is discarded from the end of an output line if a break is forced.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">Set the output speed to\~1.
+There are 1,024\~bytes in 1\~KiB.
+J.\~F.\~Ossanna wrote the original CSTR\~#54.
+</pre></div></div>
+</dd></dl>
+
+<p>By default, GNU <code class="code">troff</code> fills text and adjusts it to reach the
+output line length. The <code class="code">nf</code> request disables filling; the
+<code class="code">fi</code> request reënables it.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002efi"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.fi</code></strong><a class="copiable-link" href='#index-_002efi'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-fi"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eu_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.u]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eu_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eu"></a>
+<a class="index-entry-id" id="index-filling-of-output_002c-enabling-_0028fi_0029"></a>
+<a class="index-entry-id" id="index-output_002c-filling_002c-enablement-of-_0028fi_0029"></a>
+<a class="index-entry-id" id="index-fill-mode-_0028fi_0029_002c-enabling"></a>
+<a class="index-entry-id" id="index-mode_002c-fill-_0028fi_0029_002c-enabling"></a>
+<p>Enable filling of output lines; a pending output line is broken. The
+read-only register <code class="code">.u</code> is set to&nbsp;1. The filling enablement
+status, sometimes called <em class="dfn">fill mode</em>, is associated with the
+environment (see <a class="pxref" href="#Environments">Environments</a>). See <a class="xref" href="#Line-Continuation">Line Continuation</a>, for
+interaction with the <code class="code">\c</code> escape sequence.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enf"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nf</code></strong><a class="copiable-link" href='#index-_002enf'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nf"></a>
+<a class="index-entry-id" id="index-filling-of-output_002c-disabling-_0028nf_0029"></a>
+<a class="index-entry-id" id="index-output_002c-filling_002c-disablement-of-_0028nf_0029"></a>
+<a class="index-entry-id" id="index-no_002dfill-mode"></a>
+<a class="index-entry-id" id="index-mode_002c-no_002dfill"></a>
+<a class="index-entry-id" id="index-fill-mode_002c-disabling"></a>
+<a class="index-entry-id" id="index-mode_002c-fill_002c-disabling"></a>
+<p>Disable filling of output lines: the output line length (see <a class="pxref" href="#Line-Layout">Line Layout</a>) is ignored and output lines are broken where the input lines
+are. A pending output line is broken and adjustment is suppressed. The
+read-only register <code class="code">.u</code> is set to&nbsp;0. The filling enablement
+status is associated with the environment (see <a class="pxref" href="#Environments">Environments</a>). See
+<a class="ref" href="#Line-Continuation">Line Continuation</a>, for interaction with the <code class="code">\c</code> escape
+sequence.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ead"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ad</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">mode</i></span>]</var><a class="copiable-link" href='#index-_002ead'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ad"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ej_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.j]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ej_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ej"></a>
+<p>Enable output line adjustment in <var class="var">mode</var>, taking effect when the
+pending (or next) output line is broken. Adjustment is suppressed when
+filling is. <var class="var">mode</var> can have one of the following values.
+</p>
+<dl class="table">
+<dt><code class="code">b</code></dt>
+<dt><code class="code">n</code></dt>
+<dd><p>Adjust &ldquo;normally&rdquo;: if the output line does not consume the distance
+between the indentation and the configured output line length, GNU
+<code class="code">troff</code> stretches adjustable spaces within the line until that
+length is reached. When the indentation is zero, this mode spreads the
+line to both the left and right margins. This is the GNU <code class="code">troff</code>
+default.
+</p>
+</dd>
+<dt id='index-centered-text-_0028filled_0029'><span><code class="code">c</code><a class="copiable-link" href='#index-centered-text-_0028filled_0029'> &para;</a></span></dt>
+<dd><p>Center filled text. Contrast with the <code class="code">ce</code> request, which centers
+text <em class="emph">without</em> filling it.
+</p>
+</dd>
+<dt id='index-ragged_002dright-text'><span><code class="code">l</code><a class="copiable-link" href='#index-ragged_002dright-text'> &para;</a></span></dt>
+<dd><p>Align text to the left without adjusting it.
+</p>
+</dd>
+<dt id='index-ragged_002dleft-text'><span><code class="code">r</code><a class="copiable-link" href='#index-ragged_002dleft-text'> &para;</a></span></dt>
+<dd><p>Align text to the right without adjusting it.
+</p></dd>
+</dl>
+
+<p><var class="var">mode</var> can also be a value previously stored in the <code class="code">.j</code>
+register. Using <code class="code">ad</code> without an argument is the same as &lsquo;<samp class="samp">.ad
+\n[.j]</samp>&rsquo;; unless filling is disabled, GNU <code class="code">troff</code> resumes adjusting
+lines in the same way it did before adjustment was disabled by
+invocation of the <code class="code">na</code> request.
+</p>
+<a class="index-entry-id" id="index-adjustment-mode-register-_0028_002ej_0029"></a>
+<p>The adjustment mode and enablement status are encoded in the read-only
+register <code class="code">.j</code>. These parameters are associated with the
+environment (see <a class="pxref" href="#Environments">Environments</a>).
+</p>
+<p>The value of <code class="code">.j</code> for any adjustment mode is an implementation
+detail and should not be relied upon as a programmer&rsquo;s interface. Do
+not write logic to interpret or perform arithmetic on it.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 48n
+.de AD
+. br
+. ad \\$1
+..
+.de NA
+. br
+. na
+..
+left
+.AD r
+.nr ad \n(.j
+right
+.AD c
+center
+.NA
+left
+.AD
+center
+.AD \n(ad
+right
+</pre></div></div>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; left
+ &rArr; right
+ &rArr; center
+ &rArr; left
+ &rArr; center
+ &rArr; right
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ena"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.na</code></strong><a class="copiable-link" href='#index-_002ena'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-na"></a>
+<p>Disable output line adjustment. This produces the same output as
+left-alignment, but the value of the adjustment mode register <code class="code">.j</code>
+is altered differently. The adjustment mode and enablement status are
+associated with the environment (see <a class="pxref" href="#Environments">Environments</a>).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ebrp"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.brp</code></strong><a class="copiable-link" href='#index-_002ebrp'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-brp"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cp-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\p</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cp-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cp"></a>
+<p>Break, adjusting the line per the current adjustment mode. <code class="code">\p</code>
+schedules a break with adjustment at the next word boundary. The escape
+sequence is itself neither a break nor a space of any kind; it can thus
+be placed in the middle of a word to cause a break at the end of that
+word.
+</p>
+<p>Breaking with immediate adjustment can produce ugly results since GNU
+<code class="code">troff</code> doesn&rsquo;t have a sophisticated paragraph-building algorithm,
+as TeX has, for example. Instead, GNU <code class="code">troff</code> fills and adjusts
+a paragraph line by line.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 4.5i
+This is an uninteresting sentence.
+This is an uninteresting sentence.\p
+This is an uninteresting sentence.
+</pre></div></div>
+
+<p>is formatted as follows.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">This is an uninteresting sentence. This is
+an uninteresting sentence.
+This is an uninteresting sentence.
+</pre></div></div>
+</dd></dl>
+
+<a class="index-entry-id" id="index-productive-input-line"></a>
+<a class="index-entry-id" id="index-input-line_002c-productive"></a>
+<a class="index-entry-id" id="index-line_002c-productive-input"></a>
+<p>To clearly present the next couple of requests, we must introduce the
+concept of &ldquo;productive&rdquo; input lines. A <em class="dfn">productive input line</em> is
+one that directly produces formatted output. Text lines produce
+output,<a class="footnote" id="DOCF53" href="#FOOT53"><sup>53</sup></a> as do control
+lines containing requests like <code class="code">tl</code> or escape sequences like
+<code class="code">\D</code>. Macro calls are not <em class="emph">directly</em> productive, and thus not
+counted, but their interpolated contents can be. Empty requests, and
+requests and escape sequences that define registers or strings or alter
+the formatting environment (as with changes to the size, face, height,
+slant, or color of the type) are not productive. We will also preview
+the output line continuation escape sequence, <code class="code">\c</code>, which
+&ldquo;connects&rdquo; two input lines that would otherwise be counted separately.
+<a class="footnote" id="DOCF54" href="#FOOT54"><sup>54</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de hello
+Hello, world!
+..
+.ce \&quot; center output of next productive input line
+.
+.nr junk-reg 1
+.ft I
+Chorus: \c
+.ft
+.hello
+Went the day well?
+ &rArr; <i class="slanted">Chorus:</i> Hello, world!
+ &rArr; Went the day well?
+</pre></div></div>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ece"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ce</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">n</i></span>]</var><a class="copiable-link" href='#index-_002ece'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ce"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ece_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.ce]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ece_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ece-1"></a>
+<a class="index-entry-id" id="index-centered-text-_0028unfilled_0029"></a>
+<a class="index-entry-id" id="index-centering-lines-_0028ce_0029"></a>
+<a class="index-entry-id" id="index-lines_002c-centering-_0028ce_0029"></a>
+<p>Break (unless the no-break control character is used), center the output
+of the next <var class="var">n</var> productive input lines with respect to the line
+length and indentation without filling, then break again regardless of
+the invoking control character.
+If the argument is not positive, centering is disabled. Omitting the
+argument implies an <var class="var">n</var> of &lsquo;<samp class="samp">1</samp>&rsquo;. The count of lines remaining
+to be centered is stored in the read-only register <code class="code">.ce</code> and is
+associated with the environment (see <a class="pxref" href="#Environments">Environments</a>).
+</p>
+<a class="index-entry-id" id="index-ce-request_002c-difference-from-_002ead-c"></a>
+<p>While the &lsquo;<samp class="samp">.ad&nbsp;c</samp>&rsquo;<!-- /@w --> request also centers text, it fills the text
+as well.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de FR
+This is a small text fragment that shows the differences
+between the `.ce' and the `.ad c' requests.
+..
+.ll 4i
+.ce 1000
+.FR
+.ce 0
+
+.ad c
+.FR
+ &rArr; This is a small text fragment that shows
+ &rArr; the differences
+ &rArr; between the &lsquo;.ce&rsquo; and the &lsquo;.ad c&rsquo; requests.
+ &rArr;
+ &rArr; This is a small text fragment that shows
+ &rArr; the differences between the &lsquo;.ce&rsquo; and
+ &rArr; the &lsquo;.ad c&rsquo; requests.
+</pre></div></div>
+
+<p>The previous example illustrates a common idiom of turning centering on
+for a quantity of lines far in excess of what is required, and off again
+after the text to be centered. This technique relieves humans of
+counting lines for requests that take a count of input lines as an
+argument.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002erj"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.rj</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">n</i></span>]</var><a class="copiable-link" href='#index-_002erj'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rj"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002erj_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.rj]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002erj_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002erj-1"></a>
+<a class="index-entry-id" id="index-justifying-text-_0028rj_0029"></a>
+<a class="index-entry-id" id="index-text_002c-justifying-_0028rj_0029"></a>
+<a class="index-entry-id" id="index-right_002djustifying-_0028rj_0029"></a>
+<p>Break (unless the no-break control character is used), align the output
+of the next <var class="var">n</var> productive input lines to the right margin without
+filling, then break again regardless of the control character.
+If the argument is not positive, right-alignment is disabled. Omitting
+the argument implies an <var class="var">n</var> of &lsquo;<samp class="samp">1</samp>&rsquo;. The count of lines
+remaining to be right-aligned is stored in the read-only register
+<code class="code">.rj</code> and is associated with the environment
+(see <a class="pxref" href="#Environments">Environments</a>).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 49n
+.rj 3
+At first I hoped that such a technically unsound
+project would collapse but I soon realized it was
+doomed to success. \[em] C. A. R. Hoare
+ &rArr; At first I hoped that such a technically unsound
+ &rArr; project would collapse but I soon realized it was
+ &rArr; doomed to success. -- C. A. R. Hoare
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ess"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ss</code></strong> <var class="def-var-arguments">word-space-size [<span class="r"><i class="slanted">additional-sentence-space-size</i></span>]</var><a class="copiable-link" href='#index-_002ess'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ss"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ess_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.ss]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ess_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ess-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002esss_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.sss]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002esss_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002esss"></a>
+<a class="index-entry-id" id="index-word-space-size-register-_0028_002ess_0029"></a>
+<a class="index-entry-id" id="index-size-of-word-space-register-_0028_002ess_0029"></a>
+<a class="index-entry-id" id="index-space-between-words-register-_0028_002ess_0029"></a>
+<a class="index-entry-id" id="index-inter_002dsentence-space-size-register-_0028_002esss_0029"></a>
+<a class="index-entry-id" id="index-sentence-space-size-register-_0028_002esss_0029"></a>
+<a class="index-entry-id" id="index-size-of-sentence-space-register-_0028_002esss_0029"></a>
+<a class="index-entry-id" id="index-space-between-sentences-register-_0028_002esss_0029"></a>
+<p>Set the sizes of spaces between words and
+sentences<a class="footnote" id="DOCF55" href="#FOOT55"><sup>55</sup></a> in twelfths
+of font&rsquo;s space width (typically one-fourth to one-third em for Western
+scripts). The default for both parameters is&nbsp;12. Negative values
+are erroneous.
+<a class="index-entry-id" id="index-inter_002dword-spacing_002c-minimal"></a>
+<a class="index-entry-id" id="index-minimal-inter_002dword-spacing"></a>
+<a class="index-entry-id" id="index-space_002c-between-words"></a>
+The first argument is a minimum; if an output line undergoes adjustment,
+such spaces may increase in width.
+<a class="index-entry-id" id="index-inter_002dsentence-space_002c-additional"></a>
+<a class="index-entry-id" id="index-additional-inter_002dsentence-space"></a>
+<a class="index-entry-id" id="index-space_002c-between-sentences"></a>
+The optional second argument sets the amount of additional space
+separating sentences on the same output line. If omitted, this amount
+is set to <var class="var">word-space-size</var>. The request is ignored if there are no
+parameters.
+</p>
+<a class="index-entry-id" id="index-filling_002c-and-inter_002dsentence-space"></a>
+<a class="index-entry-id" id="index-mode_002c-fill_002c-and-inter_002dsentence-space"></a>
+<p>Additional inter-sentence space is used only if the output line is not
+full when the end of a sentence occurs in the input. If a sentence ends
+at the end of an input line, then both an inter-word space and an
+inter-sentence space are added to the output; if two spaces follow the
+end of a sentence in the middle of an input line, then the second space
+becomes an inter-sentence space in the output. Additional
+inter-sentence space is not adjusted, but the inter-word space that
+always precedes it may be. Further input spaces after the second, if
+present, are adjusted as normal.
+</p>
+<p>The read-only registers <code class="code">.ss</code> and <code class="code">.sss</code> hold the minimal
+inter-word space and additional inter-sentence space amounts,
+respectively. These parameters are part of the environment
+(see <a class="pxref" href="#Environments">Environments</a>), and rounded down to the nearest multiple
+of&nbsp;12 on terminals.
+</p>
+<a class="index-entry-id" id="index-discardable-horizontal-space"></a>
+<a class="index-entry-id" id="index-space_002c-discardable_002c-horizontal"></a>
+<a class="index-entry-id" id="index-horizontal-discardable-space"></a>
+<p>The <code class="code">ss</code> request can insert discardable horizontal space; that is,
+space that is discarded at a break. For example, some footnote styles
+collect the notes into a single paragraph with large gaps between
+each note.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 48n
+1.\~J. Fict. Ch. Soc. 6 (2020), 3\[en]14.
+.ss 12 48 \&quot; applies to next sentence ending
+Reprints no longer available through FCS.
+.ss 12 \&quot; go back to normal
+2.\~Better known for other work.
+ &rArr; 1. J. Fict. Ch. Soc. 6 (2020), 3-14. Reprints
+ &rArr; no longer available through FCS. 2. Better
+ &rArr; known for other work.
+</pre></div></div>
+
+<p>If <em class="emph">undiscardable</em> space is required, use the <code class="code">\h</code> escape
+sequence.
+</p></dd></dl>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Manipulating-Hyphenation">
+<div class="nav-panel">
+<p>
+Next: <a href="#Manipulating-Spacing" accesskey="n" rel="next">Manipulating Spacing</a>, Previous: <a href="#Manipulating-Filling-and-Adjustment" accesskey="p" rel="prev">Manipulating Filling and Adjustment</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Manipulating-Hyphenation-1">5.10 Manipulating Hyphenation</h3>
+<a class="index-entry-id" id="index-manipulating-hyphenation"></a>
+<a class="index-entry-id" id="index-hyphenation_002c-manipulating"></a>
+
+<a class="index-entry-id" id="index-hyphenation_002c-automatic"></a>
+<a class="index-entry-id" id="index-automatic-hyphenation"></a>
+<p>When filling, GNU <code class="code">troff</code> hyphenates words as needed at
+user-specified and automatically determined hyphenation points. The
+machine-driven determination of hyphenation points in words requires
+algorithms and data, and is susceptible to conventions and preferences.
+Before tackling such <em class="dfn">automatic hyphenation</em>, let us consider how
+hyphenation points can be set explicitly.
+</p>
+<a class="index-entry-id" id="index-hyphenation_002c-explicit"></a>
+<a class="index-entry-id" id="index-explicit-hyphenation"></a>
+<a class="index-entry-id" id="index-hyphenation_002c-manual"></a>
+<a class="index-entry-id" id="index-manual-hyphenation"></a>
+<p>Explicitly hyphenated words such as &ldquo;mother-in-law&rdquo; are eligible for
+breaking after each of their hyphens. Relatively few words in a
+language offer such obvious break points, however, and automatic
+detection of syllabic (or phonetic) boundaries for hyphenation is not
+perfect,<a class="footnote" id="DOCF56" href="#FOOT56"><sup>56</sup></a> particularly for
+unusual words found in technical literature. We can instruct GNU
+<code class="code">troff</code> how to hyphenate specific words if the need arises.
+</p>
+<a class="index-entry-id" id="index-hyphenation-exceptions"></a>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ehw"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hw</code></strong> <var class="def-var-arguments">word &hellip;</var><a class="copiable-link" href='#index-_002ehw'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hw"></a>
+<p>Define each <em class="dfn">hyphenation exception</em> <var class="var">word</var> with each hyphen &lsquo;-&rsquo;
+in the word indicating a hyphenation point. For example, the request
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.hw in-sa-lub-rious alpha
+</pre></div></div>
+
+<p>marks potential hyphenation points in &ldquo;insalubrious&rdquo;, and prevents
+&ldquo;alpha&rdquo; from being hyphenated at all.
+</p>
+<p>Besides the space character, any character whose hyphenation code is
+zero can be used to separate the arguments of <code class="code">hw</code> (see the
+<code class="code">hcode</code> request below). In addition, this request can be used more
+than once.
+</p>
+<a class="index-entry-id" id="index-hw-request_002c-and-hy-restrictions"></a>
+<p>Hyphenation points specified with <code class="code">hw</code> are not subject to the
+within-word placement restrictions imposed by the <code class="code">hy</code> request (see
+below).
+</p>
+<p>Hyphenation exceptions specified with the <code class="code">hw</code> request are
+associated with the hyphenation language (see the <code class="code">hla</code> request
+below) and environment (see <a class="pxref" href="#Environments">Environments</a>); invoking the <code class="code">hw</code>
+request in the absence of a hyphenation language is an error.
+</p>
+<p>The request is ignored if there are no parameters.
+</p></dd></dl>
+
+<p>These are known as hyphenation <i class="slanted">exceptions</i> in the expectation
+that most users will avail themselves of automatic hyphenation; these
+exceptions override any rules that would normally apply to a word
+matching a hyphenation exception defined with <code class="code">hw</code>.
+</p>
+<p>Situations also arise when only a specific occurrence of a word needs
+its hyphenation altered or suppressed, or when a URL or similar string
+needs to be breakable in sensible places without hyphenation.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0025-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\%</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0025-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0025"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_003a-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\:</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_003a-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_003a"></a>
+<a class="index-entry-id" id="index-hyphenation-character-_0028_005c_0025_0029"></a>
+<a class="index-entry-id" id="index-character_002c-hyphenation-_0028_005c_0025_0029"></a>
+<a class="index-entry-id" id="index-disabling-hyphenation-_0028_005c_0025_0029"></a>
+<a class="index-entry-id" id="index-hyphenation_002c-disabling-_0028_005c_0025_0029"></a>
+<p>To tell GNU <code class="code">troff</code> how to hyphenate words as they occur in input,
+use the <code class="code">\%</code> escape sequence; it is the default <em class="dfn">hyphenation
+character</em>. Each instance within a word indicates to GNU <code class="code">troff</code>
+that the word may be hyphenated at that point, while prefixing a word
+with this escape sequence prevents it from being otherwise hyphenated.
+This mechanism affects only that occurrence of the word; to change the
+hyphenation of a word for the remainder of input processing, use the
+<code class="code">hw</code> request.
+</p>
+<a class="index-entry-id" id="index-_005cX_002c-followed-by-_005c_0025"></a>
+<a class="index-entry-id" id="index-_005cY_002c-followed-by-_005c_0025"></a>
+<a class="index-entry-id" id="index-_005c_0025_002c-following-_005cX-or-_005cY"></a>
+<p>GNU <code class="code">troff</code> regards the escape sequences <code class="code">\X</code> and <code class="code">\Y</code> as
+starting a word; that is, the <code class="code">\%</code> escape sequence in, say,
+&lsquo;<samp class="samp">\X'...'\%foobar</samp>&rsquo;<!-- /@w --> or &lsquo;<samp class="samp">\Y'...'\%foobar</samp>&rsquo;<!-- /@w --> no longer
+prevents hyphenation of &lsquo;<samp class="samp">foobar</samp>&rsquo; but inserts a hyphenation point
+just prior to it; most likely this isn&rsquo;t what you want.
+See <a class="xref" href="#Postprocessor-Access">Postprocessor Access</a>.
+</p>
+<a class="index-entry-id" id="index-non_002dprinting-break-point-_0028_005c_003a_0029"></a>
+<a class="index-entry-id" id="index-breaking-without-hyphens-_0028_005c_003a_0029"></a>
+<a class="index-entry-id" id="index-file-names_002c-breaking-_0028_005c_003a_0029"></a>
+<a class="index-entry-id" id="index-breaking-file-names-_0028_005c_003a_0029"></a>
+<a class="index-entry-id" id="index-URLs_002c-breaking-_0028_005c_003a_0029"></a>
+<a class="index-entry-id" id="index-breaking-URLs-_0028_005c_003a_0029"></a>
+<p><code class="code">\:</code> inserts a non-printing break point; that is, a word can break
+there, but the soft hyphen glyph (see below) is not written to the
+output if it does. This escape sequence is an input word boundary, so
+the remainder of the word is subject to hyphenation as normal.
+</p>
+<p>You can combine <code class="code">\:</code> and <code class="code">\%</code> to control breaking of a file
+name or URL, or to permit hyphenation only after certain explicit
+hyphens within a word.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">The \%Lethbridge-Stewart-\:\%Sackville-Baggins divorce
+was, in retrospect, inevitable once the contents of
+\%/var/log/\:\%httpd/\:\%access_log on the family web
+server came to light, revealing visitors from Hogwarts.
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ehc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hc</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">char</i></span>]</var><a class="copiable-link" href='#index-_002ehc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hc"></a>
+<p>Change the hyphenation character to <var class="var">char</var>. This character then
+works as the <code class="code">\%</code> escape sequence normally does, and thus no longer
+appears in the output.<a class="footnote" id="DOCF57" href="#FOOT57"><sup>57</sup></a> Without an
+argument, <code class="code">hc</code> resets the hyphenation character to <code class="code">\%</code> (the
+default). The hyphenation character is associated with the environment
+(see <a class="pxref" href="#Environments">Environments</a>).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eshc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.shc</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">c</i></span>]</var><a class="copiable-link" href='#index-_002eshc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-shc"></a>
+<a class="index-entry-id" id="index-soft-hyphen-character_002c-setting-_0028shc_0029"></a>
+<a class="index-entry-id" id="index-character_002c-soft-hyphen_002c-setting-_0028shc_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-soft-hyphen-_0028hy_0029"></a>
+<a class="index-entry-id" id="index-soft-hyphen-glyph-_0028hy_0029"></a>
+<a class="index-entry-id" id="index-char-request_002c-and-soft-hyphen-character"></a>
+<a class="index-entry-id" id="index-tr-request_002c-and-soft-hyphen-character"></a>
+<p>Set the <em class="dfn">soft hyphen character</em>, inserted when a word is hyphenated
+automatically or at a hyphenation character, to the ordinary or special
+character&nbsp;<var class="var">c</var>.<a class="footnote" id="DOCF58" href="#FOOT58"><sup>58</sup></a> If the argument is omitted, the soft
+hyphen character is set to the default, <code class="code">\[hy]</code>. If no glyph for
+<var class="var">c</var> exists in the font in use at a potential hyphenation point, then
+the line is not broken there. Neither character definitions (specified
+with the <code class="code">char</code> and similar requests) nor translations (specified
+with the <code class="code">tr</code> request) are applied to <var class="var">c</var>.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-hyphenation-parameters_002c-automatic"></a>
+<a class="index-entry-id" id="index-automatic-hyphenation-parameters"></a>
+<p>Several requests influence automatic hyphenation. Because conventions
+vary, a variety of hyphenation modes is available to the <code class="code">hy</code>
+request; these determine whether hyphenation will apply to a
+word prior to breaking a line at the end of a page (more or less; see
+below for details), and at which positions within that word
+automatically determined hyphenation points are permissible. The places
+within a word that are eligible for hyphenation are determined by
+language-specific data and lettercase relationships. Furthermore,
+hyphenation of a word might be suppressed due to a limit on
+consecutive hyphenated lines (<code class="code">hlm</code>), a minimum line length
+threshold (<code class="code">hym</code>), or because the line can instead be adjusted with
+additional inter-word space (<code class="code">hys</code>).
+</p>
+<a class="index-entry-id" id="index-hyphenation-mode-register-_0028_002ehy_0029"></a>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ehy"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hy</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">mode</i></span>]</var><a class="copiable-link" href='#index-_002ehy'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hy"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ehy_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.hy]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ehy_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ehy-1"></a>
+<p>Set automatic hyphenation mode to <var class="var">mode</var>, an integer encoding
+conditions for hyphenation; if omitted, &lsquo;<samp class="samp">1</samp>&rsquo; is implied. The
+hyphenation mode is available in the read-only register &lsquo;<samp class="samp">.hy</samp>&rsquo;; it
+is associated with the environment (see <a class="pxref" href="#Environments">Environments</a>). The default
+hyphenation mode depends on the localization file loaded when GNU
+<code class="code">troff</code> starts up; see the <code class="code">hpf</code> request below.
+</p>
+<p>Typesetting practice generally does not avail itself of every
+opportunity for hyphenation, but the details differ by language and site
+mandates. The hyphenation modes of <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> were
+implemented with English-language publishing practices of the 1970s in
+mind, not a scrupulous enumeration of conceivable parameters. GNU
+<code class="code">troff</code> extends those modes such that finer-grained control is
+possible, favoring compatibility with older implementations over a more
+intuitive arrangement. The means of hyphenation mode control is a set
+of numbers that can be added up to encode the behavior
+sought.<a class="footnote" id="DOCF59" href="#FOOT59"><sup>59</sup></a> The entries in the
+following table are termed <em class="dfn">values</em>; the sum of the desired
+values is the <em class="dfn">mode</em>.
+</p>
+<dl class="table">
+<dt><code class="code">0</code></dt>
+<dd><p>disables hyphenation.
+</p>
+</dd>
+<dt><code class="code">1</code></dt>
+<dd><p>enables hyphenation except after the first and before the last character
+of a word.
+</p></dd>
+</dl>
+
+<p>The remaining values &ldquo;imply&rdquo; 1; that is, they enable hyphenation
+under the same conditions as &lsquo;<samp class="samp">.hy 1</samp>&rsquo;, and then apply or lift
+restrictions relative to that basis.
+</p>
+<dl class="table">
+<dt><code class="code">2</code></dt>
+<dd><p>disables hyphenation of the last word on a page,<a class="footnote" id="DOCF60" href="#FOOT60"><sup>60</sup></a> even for explicitly hyphenated words.
+</p>
+</dd>
+<dt><code class="code">4</code></dt>
+<dd><p>disables hyphenation before the last two characters of a word.
+</p>
+</dd>
+<dt><code class="code">8</code></dt>
+<dd><p>disables hyphenation after the first two characters of a word.
+</p>
+</dd>
+<dt><code class="code">16</code></dt>
+<dd><p>enables hyphenation before the last character of a word.
+</p>
+</dd>
+<dt><code class="code">32</code></dt>
+<dd><p>enables hyphenation after the first character of a word.
+</p></dd>
+</dl>
+
+<p>Apart from value&nbsp;2, restrictions imposed by the hyphenation mode
+are <em class="emph">not</em> respected for words whose hyphenations have been
+specified with the hyphenation character (&lsquo;<samp class="samp">\%</samp>&rsquo; by default) or the
+<code class="code">hw</code> request.
+</p>
+<p>Nonzero values in the previous table are additive. For example,
+mode&nbsp;12 causes GNU <code class="code">troff</code> to hyphenate neither the last two
+nor the first two characters of a word. Some values cannot be used
+together because they contradict; for instance, values 4 and&nbsp;16,
+and values 8 and&nbsp;32. As noted, it is superfluous to add 1 to any
+non-zero even mode.
+</p>
+<a class="index-entry-id" id="index-hyphenation-pattern-files"></a>
+<a class="index-entry-id" id="index-pattern-files_002c-for-hyphenation"></a>
+<p>The automatic placement of hyphens in words is determined by
+<em class="dfn">pattern files</em>, which are derived from TeX and available for
+several languages. The number of characters at the beginning of a word
+after which the first hyphenation point should be inserted is determined
+by the patterns themselves; it can&rsquo;t be reduced further without
+introducing additional, invalid hyphenation points (unfortunately, this
+information is not part of a pattern file&mdash;you have to know it in
+advance). The same is true for the number of characters at the end of
+a word before the last hyphenation point should be inserted. For
+example, you can supply the following input to &lsquo;<samp class="samp">echo $(nroff)</samp>&rsquo;.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 1
+.hy 48
+splitting
+</pre></div></div>
+
+<p>You will get
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">s- plit- t- in- g
+</pre></div></div>
+
+<p>instead of the correct &lsquo;split- ting&rsquo;. English patterns as distributed
+with GNU <code class="code">troff</code> need two characters at the beginning and three
+characters at the end; this means that value&nbsp;4 of <code class="code">hy</code> is
+mandatory. Value&nbsp;8 is possible as an additional restriction, but
+values&nbsp;16 and&nbsp;32 should be avoided, as should mode&nbsp;1.
+Modes&nbsp;4 and&nbsp;6 are typical.
+</p>
+<p>A table of left and right minimum character counts for hyphenation as
+needed by the patterns distributed with GNU <code class="code">troff</code> follows; see
+the <cite class="cite">groff_tmac<span class="r">(5)</span></cite> man page for more information on GNU
+<code class="code">troff</code>&rsquo;s language macro files.
+</p>
+<table class="multitable">
+<thead><tr><th>language</th><th>pattern name</th><th>left min</th><th>right min</th></tr></thead>
+<tbody><tr><td>Czech</td><td>cs</td><td>2</td><td>2</td></tr>
+<tr><td>English</td><td>en</td><td>2</td><td>3</td></tr>
+<tr><td>French</td><td>fr</td><td>2</td><td>3</td></tr>
+<tr><td>German traditional</td><td>det</td><td>2</td><td>2</td></tr>
+<tr><td>German reformed</td><td>den</td><td>2</td><td>2</td></tr>
+<tr><td>Italian</td><td>it</td><td>2</td><td>2</td></tr>
+<tr><td>Swedish</td><td>sv</td><td>1</td><td>2</td></tr>
+</tbody>
+</table>
+
+<p>Hyphenation exceptions within pattern files (i.e., the words within a
+TeX <code class="code">\hyphenation</code> group) obey the hyphenation restrictions
+given by <code class="code">hy</code>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enh"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nh</code></strong><a class="copiable-link" href='#index-_002enh'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nh"></a>
+<p>Disable automatic hyphenation; i.e., set the hyphenation mode to&nbsp;0
+(see above). The hyphenation mode of the last call to <code class="code">hy</code> is not
+remembered.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ehpf"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hpf</code></strong> <var class="def-var-arguments">pattern-file</var><a class="copiable-link" href='#index-_002ehpf'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hpf"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002ehpfa"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hpfa</code></strong> <var class="def-var-arguments">pattern-file</var><a class="copiable-link" href='#index-_002ehpfa'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hpfa"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002ehpfcode"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hpfcode</code></strong> <var class="def-var-arguments">a b [c d] &hellip;</var><a class="copiable-link" href='#index-_002ehpfcode'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hpfcode"></a>
+<a class="index-entry-id" id="index-hyphenation-patterns-_0028hpf_0029"></a>
+<a class="index-entry-id" id="index-patterns-for-hyphenation-_0028hpf_0029"></a>
+<p>Read hyphenation patterns from <var class="var">pattern-file</var>, which is sought
+in the same way that macro files are with the <code class="code">mso</code> request or the
+<samp class="option">-m<var class="var">name</var></samp> command-line option to <code class="code">groff</code>. The
+<var class="var">pattern-file</var> should have the same format as (simple) TeX
+pattern files. More specifically, the following scanning rules are
+implemented.
+</p>
+<ul class="itemize mark-bullet">
+<li>A percent sign starts a comment (up to the end of the line) even if
+preceded by a backslash.
+
+</li><li>&ldquo;Digraphs&rdquo; like <code class="code">\$</code> are not supported.
+
+</li><li><code class="code">^^<var class="var">xx</var></code> (where each <var class="var">x</var> is 0&ndash;9 or a&ndash;f) and
+<code class="code">^^<var class="var">c</var></code> (character <var class="var">c</var> in the code point range 0&ndash;127
+decimal) are recognized; other uses of <code class="code">^</code> cause an error.
+
+</li><li>No macro expansion is performed.
+
+</li><li><code class="code">hpf</code> checks for the expression <code class="code">\patterns{&hellip;}</code>
+(possibly with whitespace before or after the braces). Everything
+between the braces is taken as hyphenation patterns. Consequently,
+<code class="code">{</code> and <code class="code">}</code> are not allowed in patterns.
+
+</li><li>Similarly, <code class="code">\hyphenation{&hellip;}</code> gives a list of hyphenation
+exceptions.
+
+</li><li><code class="code">\endinput</code> is recognized also.
+
+</li><li>For backward compatibility, if <code class="code">\patterns</code> is missing, the whole
+file is treated as a list of hyphenation patterns (except that the
+<code class="code">%</code> character is recognized as the start of a comment).
+</li></ul>
+
+<p>The <code class="code">hpfa</code> request appends a file of patterns to the current list.
+</p>
+<p>The <code class="code">hpfcode</code> request defines mapping values for character codes in
+pattern files. It is an older mechanism no longer used by GNU
+<code class="code">troff</code>&rsquo;s own macro files; for its successor, see <code class="code">hcode</code>
+below. <code class="code">hpf</code> or <code class="code">hpfa</code> apply the mapping after reading the
+patterns but before replacing or appending to the active list of
+patterns. Its arguments are pairs of character codes&mdash;integers from 0
+to&nbsp;255. The request maps character code&nbsp;<var class="var">a</var> to
+code&nbsp;<var class="var">b</var>, code&nbsp;<var class="var">c</var> to code&nbsp;<var class="var">d</var>, and so on.
+Character codes that would otherwise be invalid in GNU <code class="code">troff</code> can
+be used. By default, every code maps to itself except those for letters
+&lsquo;A&rsquo; to &lsquo;Z&rsquo;, which map to those for &lsquo;a&rsquo; to &lsquo;z&rsquo;.
+</p>
+<a class="index-entry-id" id="index-localization"></a>
+<a class="index-entry-id" id="index-troffrc-2"></a>
+<a class="index-entry-id" id="index-cs_002etmac"></a>
+<a class="index-entry-id" id="index-de_002etmac"></a>
+<a class="index-entry-id" id="index-en_002etmac"></a>
+<a class="index-entry-id" id="index-fr_002etmac"></a>
+<a class="index-entry-id" id="index-it_002etmac"></a>
+<a class="index-entry-id" id="index-ja_002etmac"></a>
+<a class="index-entry-id" id="index-sv_002etmac"></a>
+<a class="index-entry-id" id="index-zh_002etmac"></a>
+<p>The set of hyphenation patterns is associated with the language set by
+the <code class="code">hla</code> request (see below). The <code class="code">hpf</code> request is usually
+invoked by a localization file loaded by the <samp class="file">troffrc</samp>
+file.<a class="footnote" id="DOCF61" href="#FOOT61"><sup>61</sup></a>
+</p>
+<p>A second call to <code class="code">hpf</code> (for the same language) replaces the
+hyphenation patterns with the new ones. Invoking <code class="code">hpf</code> or
+<code class="code">hpfa</code> causes an error if there is no hyphenation language. If no
+<code class="code">hpf</code> request is specified (either in the document, in a file
+loaded at startup, or in a macro package), GNU <code class="code">troff</code> won&rsquo;t
+automatically hyphenate at all.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ehcode"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hcode</code></strong> <var class="def-var-arguments">c1 code1 [c2 code2] &hellip;</var><a class="copiable-link" href='#index-_002ehcode'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hcode"></a>
+<a class="index-entry-id" id="index-hyphenation-code-_0028hcode_0029"></a>
+<a class="index-entry-id" id="index-code_002c-hyphenation-_0028hcode_0029"></a>
+<p>Set the hyphenation code of character <var class="var">c1</var> to <var class="var">code1</var>, that of
+<var class="var">c2</var> to <var class="var">code2</var>, and so on. A hyphenation code must be an
+ordinary character (not a special character escape sequence) other than
+a digit or a space. The request is ignored if given no arguments.
+</p>
+<p>For hyphenation to work, hyphenation codes must be set up. At
+startup, GNU <code class="code">troff</code> assigns hyphenation codes to the letters
+&lsquo;<samp class="samp">a</samp>&rsquo;&ndash;&lsquo;<samp class="samp">z</samp>&rsquo; (mapped to themselves), to the letters
+&lsquo;<samp class="samp">A</samp>&rsquo;&ndash;&lsquo;<samp class="samp">Z</samp>&rsquo; (mapped to &lsquo;<samp class="samp">a</samp>&rsquo;&ndash;&lsquo;<samp class="samp">z</samp>&rsquo;), and zero to all other
+characters. Normally, hyphenation patterns contain only lowercase
+letters which should be applied regardless of case. In other words,
+they assume that the words &lsquo;FOO&rsquo; and &lsquo;Foo&rsquo; should be hyphenated exactly
+as &lsquo;foo&rsquo; is. The <code class="code">hcode</code> request extends this principle to letters
+outside the Unicode basic Latin alphabet; without it, words containing
+such letters won&rsquo;t be hyphenated properly even if the corresponding
+hyphenation patterns contain them.
+</p>
+<p>For example, the following <code class="code">hcode</code> requests are necessary to assign
+hyphenation codes to the letters &lsquo;<samp class="samp">ÄäÖöÜüß</samp>&rsquo;, needed for German.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.hcode ä ä Ä ä
+.hcode ö ö Ö ö
+.hcode ü ü Ü ü
+.hcode ß ß
+</pre></div></div>
+
+<p>Without these assignments, GNU <code class="code">troff</code> treats the German word
+&lsquo;Kindergärten&rsquo;<!-- /@w --> (the plural form of &lsquo;kindergarten&rsquo;) as two words
+&lsquo;kinderg&rsquo;<!-- /@w --> and &lsquo;rten&rsquo;<!-- /@w --> because the hyphenation code of the
+umlaut&nbsp;a is zero by default, just like a space. There is a German
+hyphenation pattern that covers &lsquo;kinder&rsquo;<!-- /@w -->, so GNU <code class="code">troff</code> finds
+the hyphenation &lsquo;kin-der&rsquo;. The other two hyphenation points
+(&lsquo;kin-der-gär-ten&rsquo;) are missed.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ehla"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hla</code></strong> <var class="def-var-arguments">lang</var><a class="copiable-link" href='#index-_002ehla'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hla"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ehla_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.hla]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ehla_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ehla-1"></a>
+<a class="index-entry-id" id="index-hpf-request_002c-and-hyphenation-language"></a>
+<a class="index-entry-id" id="index-hw-request_002c-and-hyphenation-language"></a>
+<a class="index-entry-id" id="index-troffrc-3"></a>
+<a class="index-entry-id" id="index-troffrc_002dend-1"></a>
+<p>Set the hyphenation language to <var class="var">lang</var>. Hyphenation exceptions
+specified with the <code class="code">hw</code> request and hyphenation patterns and
+exceptions specified with the <code class="code">hpf</code> and <code class="code">hpfa</code> requests are
+associated with the hyphenation language. The <code class="code">hla</code> request is
+usually invoked by a localization file, which is turn loaded by the
+<samp class="file">troffrc</samp> or <samp class="file">troffrc-end</samp> file; see the <code class="code">hpf</code> request
+above.
+</p>
+<a class="index-entry-id" id="index-hyphenation-language-register-_0028_002ehla_0029"></a>
+<p>The hyphenation language is available in the read-only string-valued
+register &lsquo;<samp class="samp">.hla</samp>&rsquo;; it is associated with the environment
+(see <a class="pxref" href="#Environments">Environments</a>).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ehlm"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hlm</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">n</i></span>]</var><a class="copiable-link" href='#index-_002ehlm'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hlm"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ehlm_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.hlm]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ehlm_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ehlm-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ehlc_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.hlc]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ehlc_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ehlc"></a>
+<a class="index-entry-id" id="index-explicit-hyphen-_0028_005c_0025_0029"></a>
+<a class="index-entry-id" id="index-hyphen_002c-explicit-_0028_005c_0025_0029"></a>
+<a class="index-entry-id" id="index-consecutive-hyphenated-lines-_0028hlm_0029"></a>
+<a class="index-entry-id" id="index-lines_002c-consecutive-hyphenated-_0028hlm_0029"></a>
+<a class="index-entry-id" id="index-hyphenated-lines_002c-consecutive-_0028hlm_0029"></a>
+<p>Set the maximum quantity of consecutive hyphenated lines to <var class="var">n</var>. If
+<var class="var">n</var> is negative, there is no maximum. If omitted, <var class="var">n</var>
+is&nbsp;&minus;1. This value is associated with the environment
+(see <a class="pxref" href="#Environments">Environments</a>). Only lines output from a given environment
+count toward the maximum associated with that environment. Hyphens
+resulting from <code class="code">\%</code> are counted; explicit hyphens are not.
+</p>
+<a class="index-entry-id" id="index-hyphenation-consecutive-line-limit-register-_0028_002ehlm_0029"></a>
+<a class="index-entry-id" id="index-hyphenation-consecutive-line-count-register-_0028_002ehlc_0029"></a>
+<p>The <code class="code">.hlm</code> read-only register stores this maximum. The count of
+immediately preceding consecutive hyphenated lines is available in the
+read-only register <code class="code">.hlc</code>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ehym"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hym</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">length</i></span>]</var><a class="copiable-link" href='#index-_002ehym'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hym"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ehym_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.hym]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ehym_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ehym-1"></a>
+<a class="index-entry-id" id="index-hyphenation-margin-_0028hym_0029"></a>
+<a class="index-entry-id" id="index-margin-for-hyphenation-_0028hym_0029"></a>
+<a class="index-entry-id" id="index-ad-request_002c-and-hyphenation-margin"></a>
+<p>Set the (right) hyphenation margin to <var class="var">length</var>. If the adjustment
+mode is not &lsquo;<samp class="samp">b</samp>&rsquo; or &lsquo;<samp class="samp">n</samp>&rsquo;, the line is not hyphenated if it is
+shorter than <var class="var">length</var>. Without an argument, the hyphenation margin
+is reset to its default value, 0. The default scaling unit is &lsquo;<samp class="samp">m</samp>&rsquo;.
+The hyphenation margin is associated with the environment
+(see <a class="pxref" href="#Environments">Environments</a>).
+</p>
+<p>A negative argument resets the hyphenation margin to zero, emitting a
+warning in category &lsquo;<samp class="samp">range</samp>&rsquo;.
+</p>
+<a class="index-entry-id" id="index-hyphenation-margin-register-_0028_002ehym_0029"></a>
+<p>The hyphenation margin is available in the <code class="code">.hym</code> read-only
+register.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ehys"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hys</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">hyphenation-space</i></span>]</var><a class="copiable-link" href='#index-_002ehys'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hys"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ehys_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.hys]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ehys_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ehys-1"></a>
+<a class="index-entry-id" id="index-hyphenation-space-_0028hys_0029"></a>
+<a class="index-entry-id" id="index-hyphenation-space-adjustment-threshold"></a>
+<a class="index-entry-id" id="index-ad-request_002c-and-hyphenation-space"></a>
+<p>Suppress hyphenation of the line in adjustment modes &lsquo;<samp class="samp">b</samp>&rsquo; or
+&lsquo;<samp class="samp">n</samp>&rsquo; if it can be justified by adding no more than
+<var class="var">hyphenation-space</var> extra space to each inter-word space. Without
+an argument, the hyphenation space adjustment threshold is set to its
+default value, 0. The default scaling unit is &lsquo;<samp class="samp">m</samp>&rsquo;. The
+hyphenation space adjustment threshold is associated with the
+environment (see <a class="pxref" href="#Environments">Environments</a>).
+</p>
+<p>A negative argument resets the hyphenation space adjustment threshold to
+zero, emitting a warning in category &lsquo;<samp class="samp">range</samp>&rsquo;.
+</p>
+<a class="index-entry-id" id="index-hyphenation-space-adjustment-threshold-register-_0028_002ehys_0029"></a>
+<p>The hyphenation space adjustment threshold is available in the
+<code class="code">.hys</code> read-only register.
+</p></dd></dl>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Manipulating-Spacing">
+<div class="nav-panel">
+<p>
+Next: <a href="#Tabs-and-Fields" accesskey="n" rel="next">Tabs and Fields</a>, Previous: <a href="#Manipulating-Hyphenation" accesskey="p" rel="prev">Manipulating Hyphenation</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Manipulating-Spacing-1">5.11 Manipulating Spacing</h3>
+<a class="index-entry-id" id="index-manipulating-spacing"></a>
+<a class="index-entry-id" id="index-spacing_002c-manipulating"></a>
+
+<p>A break causes the formatter to update the vertical drawing position at
+which the new text baseline is aligned. You can alter this location.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002esp"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.sp</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">distance</i></span>]</var><a class="copiable-link" href='#index-_002esp'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-sp"></a>
+<p>Break and move the next text baseline down by <var class="var">distance</var>, or until
+springing a page location trap.<a class="footnote" id="DOCF62" href="#FOOT62"><sup>62</sup></a>
+If invoked with the no-break control character, <code class="code">sp</code> moves the
+pending output line&rsquo;s text baseline by <var class="var">distance</var>. A negative
+<var class="var">distance</var> will not reduce the position of the text baseline below
+zero. Inside a diversion, any <var class="var">distance</var> argument is ignored. The
+default scaling unit is &lsquo;<samp class="samp">v</samp>&rsquo;. If <var class="var">distance</var> is not specified,
+&lsquo;<samp class="samp">1v</samp>&rsquo; is assumed.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.pl 5v \&quot; Set page length to 5 vees.
+.de xx
+\-\-\-
+. br
+..
+.wh 0 xx \&quot; Set a trap at the top of the page.
+foo on page \n%
+.sp 2v
+bar on page \n%
+.sp 50v \&quot; This will cause a page break.
+baz on page \n%
+.pl \n(nlu \&quot; Truncate page to current position.
+ &rArr; ---
+ &rArr; foo on page 1
+ &rArr;
+ &rArr;
+ &rArr; bar on page 1
+ &rArr; ---
+ &rArr; baz on page 2
+</pre></div></div>
+
+<p>You might use the following macros to set the baseline of the next
+output text at a given distance from the top or the bottom of the page.
+We subtract one line height (<code class="code">\n[.v]</code>) because the <code class="code">|</code>
+operator moves to one vee below the page top (recall <a class="ref" href="#Numeric-Expressions">Numeric Expressions</a>).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de y-from-top-down
+. sp |\\$1-\\n[.v]u
+..
+.
+.de y-from-bot-up
+. sp |\\n[.p]u-\\$1-\\n[.v]u
+..
+</pre></div></div>
+
+<p>A call to &lsquo;<samp class="samp">.y-from-bot-up 10c</samp>&rsquo; means that the next text baseline
+will be 10&nbsp;cm from the bottom edge of the paper.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002els"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ls</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">count</i></span>]</var><a class="copiable-link" href='#index-_002els'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ls"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eL_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.L]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eL_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eL"></a>
+<a class="index-entry-id" id="index-double_002dspacing-_0028ls_0029"></a>
+<p>Set the line spacing; add <var class="var">count</var>&minus;1<!-- /@w --> blank lines after each
+line of text. With no argument, GNU <code class="code">troff</code> uses the previous
+value before the last <code class="code">ls</code> call. The default is <code class="code">1</code>.
+</p>
+
+<a class="index-entry-id" id="index-line-spacing-register-_0028_002eL_0029"></a>
+<p>The read-only register <code class="code">.L</code> contains the current line spacing; it
+is associated with the environment (see <a class="pxref" href="#Environments">Environments</a>).
+</p></dd></dl>
+
+<p>The <code class="code">ls</code> request is a coarse mechanism. See <a class="xref" href="#Changing-the-Type-Size">Changing the Type Size</a>, for the requests <code class="code">vs</code> and <code class="code">pvs</code> as alternatives to
+<code class="code">ls</code>.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cx_0027spacing_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\x<code class="code">'</code></code><span class="r"><i class="slanted">spacing</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cx_0027spacing_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cx"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ea_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.a]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ea_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ea"></a>
+<p>Sometimes, an output line requires additional vertical spacing, for
+instance to allow room for a tall construct like an inline equation with
+exponents or subscripts (particularly if they are iterated). The
+<code class="code">\x</code> escape sequence takes a delimited measurement (like
+&lsquo;<samp class="samp">\x'3p'</samp>&rsquo;) to increase the vertical spacing of the pending output
+line. The default scaling unit is &lsquo;<samp class="samp">v</samp>&rsquo;. If the measurement is
+positive, extra vertical space is inserted below the current line; a
+negative measurement adds space above. If <code class="code">\x</code> is applied to the
+pending output line multiple times, the maxima of the positive and
+negative adjustments are separately applied. The delimiter need not be
+a neutral apostrophe; see <a class="ref" href="#Delimiters">Delimiters</a>.
+</p>
+<a class="index-entry-id" id="index-extra-post_002dvertical-line-space-register-_0028_002ea_0029"></a>
+<p>The <code class="code">.a</code> read-only register contains the extra vertical spacing
+<em class="emph">after</em> the text baseline of the most recently emitted output line.
+(In other words, it is the largest positive argument to <code class="code">\x</code>
+encountered on that line.) This quantity is exposed via a register
+because if an output line requires this &ldquo;extra post-vertical line
+spacing&rdquo;, and the subsequent output line requires &ldquo;extra pre-vertical
+line spacing&rdquo; (a negative argument to <code class="code">\x</code>), then applying both
+can lead to excessive spacing between the output lines. Text that is
+piling high on line <var class="var">n</var> might not require (as much) extra
+pre-vertical line spacing if line <var class="var">n</var>&minus;1 carries extra
+post-vertical line spacing.
+</p>
+<p>Use of <code class="code">\x</code> can be necessary in combination with the
+bracket-building escape sequence <code class="code">\b</code>,<a class="footnote" id="DOCF63" href="#FOOT63"><sup>63</sup></a> as the following example shows.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nf
+This is a test of \[rs]b (1).
+This is a test of \[rs]b (2).
+This is a test of \b'xyz'\x'-1m'\x'1m' (3).
+This is a test of \[rs]b (4).
+This is a test of \[rs]b (5).
+ &rArr; This is a test of \b (1).
+ &rArr; This is a test of \b (2).
+ &rArr; x
+ &rArr; This is a test of y (3).
+ &rArr; z
+ &rArr; This is a test of \b (4).
+ &rArr; This is a test of \b (5).
+</pre></div></div>
+</dd></dl>
+
+<p>Without <code class="code">\x</code>, the backslashes on the lines marked &lsquo;<samp class="samp">(2)</samp>&rsquo; and
+&lsquo;<samp class="samp">(4)</samp>&rsquo; would be overprinted.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ens"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ns</code></strong><a class="copiable-link" href='#index-_002ens'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ns"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002ers"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.rs</code></strong><a class="copiable-link" href='#index-_002ers'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rs"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ens_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.ns]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ens_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ens-1"></a>
+<a class="index-entry-id" id="index-sp-request_002c-and-no_002dspace-mode"></a>
+<a class="index-entry-id" id="index-no_002dspace-mode-_0028ns_0029"></a>
+<a class="index-entry-id" id="index-mode_002c-no_002dspace-_0028ns_0029"></a>
+<a class="index-entry-id" id="index-blank-lines_002c-disabling"></a>
+<a class="index-entry-id" id="index-lines_002c-blank_002c-disabling"></a>
+<p>Enable <em class="dfn">no-space mode</em>. Vertical spacing, whether by <code class="code">sp</code>
+requests or blank input lines, is disabled. The <code class="code">bp</code> request to
+advance to the next page is also disabled, unless it is accompanied by a
+page number (see <a class="pxref" href="#Page-Control">Page Control</a>). No-space mode ends automatically
+when text<a class="footnote" id="DOCF64" href="#FOOT64"><sup>64</sup></a> is formatted for output <a class="footnote" id="DOCF65" href="#FOOT65"><sup>65</sup></a> or the <code class="code">rs</code> request is invoked, which ends
+no-space mode. The read-only register <code class="code">.ns</code> interpolates a Boolean
+value indicating the enablement of no-space mode.
+</p>
+<p>A paragraphing macro might ordinarily insert vertical space to separate
+paragraphs. A section heading macro could invoke <code class="code">ns</code> to suppress
+this spacing for the first paragraph in a section.
+</p></dd></dl>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Tabs-and-Fields">
+<div class="nav-panel">
+<p>
+Next: <a href="#Character-Translations" accesskey="n" rel="next">Character Translations</a>, Previous: <a href="#Manipulating-Spacing" accesskey="p" rel="prev">Manipulating Spacing</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Tabs-and-Fields-1">5.12 Tabs and Fields</h3>
+<a class="index-entry-id" id="index-tabs_002c-and-fields"></a>
+<a class="index-entry-id" id="index-fields_002c-and-tabs"></a>
+
+<a class="index-entry-id" id="index-tab-character-encoding"></a>
+<p>A tab character (<abbr class="acronym">ISO</abbr> code point&nbsp;9, <abbr class="acronym">EBCDIC</abbr>
+code point&nbsp;5) causes a horizontal movement to the next tab stop, if
+any.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005ct-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\t</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005ct-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005ct"></a>
+<a class="index-entry-id" id="index-tab-character_002c-non_002dinterpreted-_0028_005ct_0029"></a>
+<a class="index-entry-id" id="index-character_002c-tab_002c-non_002dinterpreted-_0028_005ct_0029"></a>
+<a class="index-entry-id" id="index-_005ct_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-_005ct"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-_005ct"></a>
+<p>Interpolate a tab in copy mode; see <a class="ref" href="#Copy-Mode">Copy Mode</a>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eta"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ta</code></strong> <var class="def-var-arguments">[[<span class="r"><i class="slanted">n1</i></span> <span class="r"><i class="slanted">n2</i></span> &hellip; <span class="r"><i class="slanted">nn</i></span> ]<code class="t">T</code> <span class="r"><i class="slanted">r1</i></span> <span class="r"><i class="slanted">r2</i></span> &hellip; <span class="r"><i class="slanted">rn</i></span>]</var><a class="copiable-link" href='#index-_002eta'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ta"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002etabs_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.tabs]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002etabs_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002etabs"></a>
+<p>Change tab stop positions. This request takes a series of tab
+specifiers as arguments (optionally divided into two groups with the
+letter &lsquo;<samp class="samp">T</samp>&rsquo;) that indicate where each tab stop is to be, overriding
+any previous settings. The default scaling unit is &lsquo;<samp class="samp">m</samp>&rsquo;. Invoking
+<code class="code">ta</code> without an argument removes all tab stops.
+<a class="index-entry-id" id="index-default-tab-stops"></a>
+<a class="index-entry-id" id="index-tab-stops_002c-default"></a>
+GNU <code class="code">troff</code>&rsquo;s startup value is &lsquo;<samp class="samp">T&nbsp;0.5i</samp>&rsquo;<!-- /@w -->.
+</p>
+<p>Tab stops can be specified absolutely&mdash;as distances from the left
+margin. The following example sets six tab stops, one every inch.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ta 1i 2i 3i 4i 5i 6i
+</pre></div></div>
+
+<p>Tab stops can also be specified using a leading &lsquo;<samp class="samp">+</samp>&rsquo;, which means
+that the specified tab stop is set relative to the previous tab stop.
+For example, the following is equivalent to the previous example.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ta 1i +1i +1i +1i +1i +1i
+</pre></div></div>
+
+<p>GNU <code class="code">troff</code> supports an extended syntax to specify repeating tab
+stops. These stops appear after a &lsquo;<samp class="samp">T</samp>&rsquo; argument. Their values are
+always taken as distances relative to the previous tab stop. This is
+the idiomatic way to specify tab stops at equal intervals in
+<code class="code">groff</code>. The following is, yet again, the same as the previous
+examples. It does more, in fact, since it defines an infinite number of
+tab stops at one-inch intervals.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ta T 1i
+</pre></div></div>
+
+<p>Now we are ready to interpret the full syntax given above. The
+<code class="code">ta</code> request sets tabs at positions <var class="var">n1</var>, <var class="var">n2</var>, &hellip;,
+<var class="var">nn</var>, then at <var class="var">nn</var>+<var class="var">r1</var>, <var class="var">nn</var>+<var class="var">r2</var>, &hellip;,
+<var class="var">nn</var>+<var class="var">rn</var>, then at <var class="var">nn</var>+<var class="var">rn</var>+<var class="var">r1</var>,
+<var class="var">nn</var>+<var class="var">rn</var>+<var class="var">r2</var>, &hellip;, <var class="var">nn</var>+<var class="var">rn</var>+<var class="var">rn</var>, and so
+on.
+</p>
+<p>For example, &lsquo;<samp class="samp">4c +6c T 3c 5c 2c</samp>&rsquo; is equivalent to &lsquo;<samp class="samp">4c 10c 13c
+18c 20c 23c 28c 30c &hellip;</samp>&rsquo;.
+</p>
+<p>Text written to a tab column (i.e., between two tab stops, or between a
+tab stop and an output line boundary) may be aligned to the right or
+left, or centered in the column. This alignment is determined by
+appending &lsquo;<samp class="samp">R</samp>&rsquo;, &lsquo;<samp class="samp">L</samp>&rsquo;, or &lsquo;<samp class="samp">C</samp>&rsquo; to the tab specifier. The
+default is &lsquo;<samp class="samp">L</samp>&rsquo;.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ta 1i 2iC 3iR
+</pre></div></div>
+
+<p>The beginning of an output line is not a tab stop; the text that begins
+an output line is placed according to the configured alignment and
+indentation; see <a class="ref" href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a> and <a class="ref" href="#Line-Layout">Line Layout</a>.
+</p>
+<p>A tab stop is converted into a non-breakable horizontal movement that
+cannot be adjusted.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 2i
+.ds foo a\tb\tc
+.ta T 1i
+\*[foo]
+ error&rarr; warning: cannot break line
+ &rArr; a b c
+</pre></div></div>
+
+<p>The above creates a single output line that is a bit longer than two
+inches (we use a string to show exactly where the tab stops are).
+Now consider the following.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 2i
+.ds bar a\tb c\td
+.ta T 1i
+\*[bar]
+ error&rarr; warning: cannot adjust line
+ &rArr; a b
+ &rArr; c d
+</pre></div></div>
+
+<p>GNU <code class="code">troff</code> first converts the line&rsquo;s tab stops into unbreakable
+horizontal movements, then breaks after &lsquo;<samp class="samp">b</samp>&rsquo;. This usually isn&rsquo;t
+what you want.
+</p>
+<p>Superfluous tab characters&mdash;those that do not correspond to a tab
+stop&mdash;are ignored except for the first, which delimits the characters
+belonging to the last tab stop for right-alignment or centering.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds Z foo\tbar\tbaz
+.ds ZZ foo\tbar\tbazqux
+.ds ZZZ foo\tbar\tbaz\tqux
+.ta 2i 4iR
+\*[Z]
+.br
+\*[ZZ]
+.br
+\*[ZZZ]
+.br
+ &rArr; foo bar baz
+ &rArr; foo bar bazqux
+ &rArr; foo bar bazqux
+</pre></div></div>
+
+<p>The first line right-aligns &ldquo;baz&rdquo; within the second tab stop. The
+second line right-aligns &ldquo;bazqux&rdquo; within it. The third line
+right-aligns only &ldquo;baz&rdquo; because of the additional tab character, which
+marks the end of the text occupying the last tab stop defined.
+</p>
+<p>Tab stops are associated with the environment (see <a class="pxref" href="#Environments">Environments</a>).
+</p>
+<a class="index-entry-id" id="index-tab-stop-settings-register-_0028_002etabs_0029"></a>
+<a class="index-entry-id" id="index-_002eS-register_002c-Plan-9-alias-for-_002etabs"></a>
+<a class="index-entry-id" id="index-_002etabs-register_002c-Plan-9-alias-_0028_002eS_0029"></a>
+<p>The read-only register <code class="code">.tabs</code> contains a string
+representation of the current tab settings suitable for use as an
+argument to the <code class="code">ta</code> request.<a class="footnote" id="DOCF66" href="#FOOT66"><sup>66</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds tab-string \n[.tabs]
+\*[tab-string]
+ &rArr; T120u
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002etc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.tc</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">c</i></span>]</var><a class="copiable-link" href='#index-_002etc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-tc"></a>
+<a class="index-entry-id" id="index-tab-repetition-character-_0028tc_0029"></a>
+<a class="index-entry-id" id="index-character_002c-tab-repetition-_0028tc_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-tab-repetition-_0028tc_0029"></a>
+<p>Set the tab repetition character to the ordinary or special character
+<var class="var">c</var>; normally, no glyph is written when moving to a tab stop (and
+some output devices may output space characters to achieve this motion).
+A <em class="dfn">tab repetition character</em> causes the formatter to write as many
+instances of <var class="var">c</var> as are necessary to occupy the interval from the
+horizontal drawing position to the next tab stop. With no argument, GNU
+<code class="code">troff</code> reverts to the default behavior. The tab repetition
+character is associated with the environment (see <a class="pxref" href="#Environments">Environments</a>).
+Only a single character of <var class="var">c</var> is recognized; any excess is ignored.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002elinetabs"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.linetabs</code></strong> <var class="def-var-arguments">n</var><a class="copiable-link" href='#index-_002elinetabs'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-linetabs"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002elinetabs_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.linetabs]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002elinetabs_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002elinetabs-1"></a>
+<a class="index-entry-id" id="index-tab_002c-line_002dtabs-mode"></a>
+<a class="index-entry-id" id="index-line_002dtabs-mode"></a>
+<a class="index-entry-id" id="index-mode_002c-line_002dtabs"></a>
+<p>If <var class="var">n</var> is missing or non-zero, activate <em class="dfn">line-tabs</em>; deactivate
+it otherwise (the default). Active line-tabs cause GNU <code class="code">troff</code>
+to compute tab distances relative to the start of the output line
+instead of the input line.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de Tabs
+. ds x a\t\c
+. ds y b\t\c
+. ds z c
+. ta 1i 3i
+\\*x
+\\*y
+\\*z
+..
+.Tabs
+.br
+.linetabs
+.Tabs
+ &rArr; a b c
+ &rArr; a b c
+</pre></div></div>
+
+<p>Line-tabs activation is associated with the environment
+(see <a class="pxref" href="#Environments">Environments</a>). The read-only register <code class="code">.linetabs</code>
+interpolates&nbsp;1 if line-tabs are active, and 0 otherwise.
+</p></dd></dl>
+
+
+
+<ul class="mini-toc">
+<li><a href="#Leaders" accesskey="1">Leaders</a></li>
+<li><a href="#Fields" accesskey="2">Fields</a></li>
+</ul>
+<hr>
+<div class="subsection-level-extent" id="Leaders">
+<div class="nav-panel">
+<p>
+Next: <a href="#Fields" accesskey="n" rel="next">Fields</a>, Previous: <a href="#Tabs-and-Fields" accesskey="p" rel="prev">Tabs and Fields</a>, Up: <a href="#Tabs-and-Fields" accesskey="u" rel="up">Tabs and Fields</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Leaders-1">5.12.1 Leaders</h4>
+<a class="index-entry-id" id="index-leaders"></a>
+
+<p>Sometimes it is desirable to fill a tab stop with a given glyph,
+but also use tab stops normally on the same output line. An example is
+a table of contents entry that uses dots to bridge the entry name with
+its page number, which is itself aligned between tab stops. The
+<code class="code">roff</code> language provides <em class="dfn">leaders</em> for this
+purpose.<a class="footnote" id="DOCF67" href="#FOOT67"><sup>67</sup></a>
+</p>
+<a class="index-entry-id" id="index-leader-character-1"></a>
+<p>A leader character (<abbr class="acronym">ISO</abbr> and <abbr class="acronym">EBCDIC</abbr> code
+point&nbsp;1, also known as <abbr class="acronym">SOH</abbr> or &ldquo;start of heading&rdquo;),
+behaves similarly to a tab character: it moves to the next tab stop.
+The difference is that for this movement, the default fill character is
+a period &lsquo;<samp class="samp">.</samp>&rsquo;.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005ca-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\a</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005ca-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005ca"></a>
+<a class="index-entry-id" id="index-leader-character_002c-non_002dinterpreted-_0028_005ca_0029"></a>
+<a class="index-entry-id" id="index-character_002c-leader_002c-non_002dinterpreted-_0028_005ca_0029"></a>
+<a class="index-entry-id" id="index-_005ca_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-_005ca"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-_005ca"></a>
+<p>Interpolate a leader in copy mode; see <a class="ref" href="#Copy-Mode">Copy Mode</a>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002elc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.lc</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">c</i></span>]</var><a class="copiable-link" href='#index-_002elc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-lc"></a>
+<a class="index-entry-id" id="index-leader-repetition-character-_0028lc_0029"></a>
+<a class="index-entry-id" id="index-character_002c-leader-repetition-_0028lc_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-leader-repetition-_0028lc_0029"></a>
+<p>Set the leader repetition character to the ordinary or special character
+<var class="var">c</var>. Recall <a class="ref" href="#Tabs-and-Leaders">Tabs and Leaders</a>: when encountering a leader
+character in the input, the formatter writes as many dots &lsquo;<samp class="samp">.</samp>&rsquo; as
+are necessary until
+reaching the next tab stop; this is the <em class="dfn">leader definition
+character</em>. Omitting <var class="var">c</var> unsets the leader
+character. With no argument, GNU <code class="code">troff</code> treats leaders the same
+as tabs. The leader repetition character is associated with the
+environment (see <a class="pxref" href="#Environments">Environments</a>). Only a single <var class="var">c</var> is
+recognized; any excess is ignored.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-table-of-contents-1"></a>
+<a class="index-entry-id" id="index-contents_002c-table-of-1"></a>
+<p>A table of contents, for example, may define tab stops after a section
+number, a title, and a gap to be filled with leader dots. The page
+number follows the leader, after a right-aligned final tab stop wide
+enough to house the largest page number occurring in the document.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds entry1 19.\tThe Prophet\a\t98
+.ds entry2 20.\tAll Astir\a\t101
+.ta .5i 4.5i +.5iR
+.nf
+\*[entry1]
+\*[entry2]
+ &rArr; 19. The Prophet............................. 98
+ &rArr; 20. All Astir............................... 101
+</pre></div></div>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Fields">
+<div class="nav-panel">
+<p>
+Previous: <a href="#Leaders" accesskey="p" rel="prev">Leaders</a>, Up: <a href="#Tabs-and-Fields" accesskey="u" rel="up">Tabs and Fields</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Fields-1">5.12.2 Fields</h4>
+<a class="index-entry-id" id="index-fields"></a>
+
+<a class="index-entry-id" id="index-field-delimiting-character-_0028fc_0029"></a>
+<a class="index-entry-id" id="index-delimiting-character_002c-for-fields-_0028fc_0029"></a>
+<a class="index-entry-id" id="index-character_002c-field-delimiting-_0028fc_0029"></a>
+<a class="index-entry-id" id="index-field-padding-character-_0028fc_0029"></a>
+<a class="index-entry-id" id="index-padding-character_002c-for-fields-_0028fc_0029"></a>
+<a class="index-entry-id" id="index-character_002c-field-padding-_0028fc_0029"></a>
+<p><em class="dfn">Fields</em> are a more general way of laying out tabular data. A field
+is defined as the data between a pair of <em class="dfn">delimiting characters</em>.
+It contains substrings that are separated by <em class="dfn">padding characters</em>.
+The width of a field is the distance on the <em class="emph">input</em> line from the
+position where the field starts to the next tab stop. A padding
+character inserts an adjustable space similar to TeX&rsquo;s <code class="code">\hss</code>
+command (thus it can even be negative) to make the sum of all substring
+lengths plus the adjustable space equal to the field width. If more
+than one padding character is inserted, the available space is evenly
+distributed among them.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002efc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.fc</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">delim-char</i></span> [<span class="r"><i class="slanted">padding-char</i></span>]]</var><a class="copiable-link" href='#index-_002efc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-fc"></a>
+<p>Define a delimiting and a padding character for fields. If the latter
+is missing, the padding character defaults to a space character. If
+there is no argument at all, the field mechanism is disabled (which is
+the default). In contrast to, e.g., the tab repetition character,
+delimiting and padding characters are <em class="emph">not</em> associated with the
+environment (see <a class="pxref" href="#Environments">Environments</a>).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.fc # ^
+.ta T 3i
+#foo^bar^smurf#
+.br
+#foo^^bar^smurf#
+ &rArr; foo bar smurf
+ &rArr; foo bar smurf
+</pre></div></div>
+</dd></dl>
+
+
+
+<hr>
+</div>
+</div>
+<div class="section-level-extent" id="Character-Translations">
+<div class="nav-panel">
+<p>
+Next: <a href="#troff-and-nroff-Modes" accesskey="n" rel="next"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a>, Previous: <a href="#Tabs-and-Fields" accesskey="p" rel="prev">Tabs and Fields</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Character-Translations-1">5.13 Character Translations</h3>
+<a class="index-entry-id" id="index-character-translations"></a>
+<a class="index-entry-id" id="index-translations-of-characters"></a>
+
+<p>A <em class="dfn">translation</em> is a mapping of an input character to an output
+glyph. The mapping occurs at output time, i.e., the input character
+gets assigned the metric information of the mapped output character
+right before input tokens are converted to nodes (see <a class="pxref" href="#Gtroff-Internals"><code class="code">gtroff</code> Internals</a>, for more on this process).
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002etr"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.tr</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">a</i></span><span class="r"><i class="slanted">b</i></span><span class="r"><i class="slanted">c</i></span><span class="r"><i class="slanted">d</i></span>&hellip;</var><a class="copiable-link" href='#index-_002etr'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-tr"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002etrin"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.trin</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">a</i></span><span class="r"><i class="slanted">b</i></span><span class="r"><i class="slanted">c</i></span><span class="r"><i class="slanted">d</i></span>&hellip;</var><a class="copiable-link" href='#index-_002etrin'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-trin"></a>
+<p>Translate character <var class="var">a</var> to glyph&nbsp;<var class="var">b</var>, character <var class="var">c</var> to
+glyph&nbsp;<var class="var">d</var>, and so on. If there is an odd number of characters
+in the argument, the last one is translated to a fixed-width space (the
+same one obtained by the <code class="code">\<kbd class="key">SP</kbd></code> escape sequence).
+</p>
+<p>The <code class="code">trin</code> request is identical to <code class="code">tr</code>, but when you unformat
+a diversion with <code class="code">asciify</code> it ignores the translation.
+See <a class="xref" href="#Diversions">Diversions</a>, for details about the <code class="code">asciify</code> request.
+</p>
+<p>Some notes:
+</p>
+<ul class="itemize mark-bullet">
+<li><a class="index-entry-id" id="index-_005c_0028_002c-and-translations"></a>
+<a class="index-entry-id" id="index-_005c_005b_002c-and-translations"></a>
+<a class="index-entry-id" id="index-_005c_0027_002c-and-translations"></a>
+<a class="index-entry-id" id="index-_005c_0060_002c-and-translations"></a>
+<a class="index-entry-id" id="index-_005c_002d_002c-and-translations"></a>
+<a class="index-entry-id" id="index-_005c_005f_002c-and-translations"></a>
+<a class="index-entry-id" id="index-_005cC_002c-and-translations"></a>
+<a class="index-entry-id" id="index-_005cN_002c-and-translations"></a>
+<a class="index-entry-id" id="index-char-request_002c-and-translations"></a>
+<a class="index-entry-id" id="index-special-characters-1"></a>
+<a class="index-entry-id" id="index-character_002c-special"></a>
+<a class="index-entry-id" id="index-numbered-glyph-_0028_005cN_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-numbered-_0028_005cN_0029"></a>
+Special characters (<code class="code">\(<var class="var">xx</var></code>, <code class="code">\[<var class="var">xxx</var>]</code>,
+<code class="code">\C'<var class="var">xxx</var>'</code>, <code class="code">\'</code>, <code class="code">\`</code>, <code class="code">\-</code>, <code class="code">\_</code>),
+glyphs defined with the <code class="code">char</code> request, and numbered glyphs
+(<code class="code">\N'<var class="var">xxx</var>'</code>) can be translated also.
+
+</li><li><a class="index-entry-id" id="index-_005ce_002c-and-translations"></a>
+The <code class="code">\e</code> escape can be translated also.
+
+</li><li><a class="index-entry-id" id="index-_005c_0025_002c-and-translations"></a>
+<a class="index-entry-id" id="index-_005c_007e_002c-and-translations"></a>
+Characters can be mapped onto the <code class="code">\%</code> and <code class="code">\~</code> escape
+sequences (but <code class="code">\%</code> and <code class="code">\~</code> can&rsquo;t be mapped onto another
+glyph).
+
+</li><li><a class="index-entry-id" id="index-backspace-character_002c-and-translations"></a>
+<a class="index-entry-id" id="index-character_002c-backspace_002c-and-translations"></a>
+<a class="index-entry-id" id="index-leader-character_002c-and-translations"></a>
+<a class="index-entry-id" id="index-character_002c-leader_002c-and-translations"></a>
+<a class="index-entry-id" id="index-newline-character_002c-and-translations"></a>
+<a class="index-entry-id" id="index-character_002c-newline_002c-and-translations"></a>
+<a class="index-entry-id" id="index-tab-character_002c-and-translations"></a>
+<a class="index-entry-id" id="index-character_002c-tab_002c-and-translations"></a>
+<a class="index-entry-id" id="index-_005ca_002c-and-translations"></a>
+<a class="index-entry-id" id="index-_005ct_002c-and-translations"></a>
+The following characters can&rsquo;t be translated: space (with one exception,
+see below), backspace, newline, leader (and <code class="code">\a</code>), tab (and
+<code class="code">\t</code>).
+
+</li><li><a class="index-entry-id" id="index-shc-request_002c-and-translations"></a>
+Translations are not considered for finding the soft hyphen character
+set with the <code class="code">shc</code> request.
+
+</li><li><a class="index-entry-id" id="index-_005c_0026_002c-and-translations"></a>
+The pair &lsquo;<samp class="samp"><var class="var">c</var>\&amp;</samp>&rsquo; (an arbitrary character&nbsp;<var class="var">c</var> followed
+by the dummy character) maps this character to &ldquo;nothing&rdquo;.
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">.tr a\&amp;
+foo bar
+ &rArr; foo br
+</pre></div></div>
+
+<p>Even the space character can be mapped to the dummy character.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.tr aa \&amp;
+foo bar
+ &rArr; foobar
+</pre></div></div>
+
+<p>As shown in the example, the space character can&rsquo;t be the first
+character/glyph pair as an argument of <code class="code">tr</code>. Additionally, it is
+not possible to map the space character to any other glyph; requests
+like &lsquo;<samp class="samp">.tr&nbsp;aa&nbsp;x</samp>&rsquo;<!-- /@w --> undo &lsquo;<samp class="samp">.tr&nbsp;aa&nbsp;\&amp;</samp>&rsquo;<!-- /@w --> instead.
+</p>
+<p>If justification is active, lines are justified in spite of the &lsquo;empty&rsquo;
+space character (but there is no minimal distance, i.e., the space
+character, between words).
+</p>
+</li><li>After an output glyph has been constructed (this happens at the moment
+immediately before the glyph is appended to an output glyph list, either
+by direct output, in a macro, diversion, or string), it is no longer
+affected by <code class="code">tr</code>.
+
+</li><li>Translating character to glyphs where one of them or both are undefined
+is possible also; <code class="code">tr</code> does not check whether the elements of its
+argument exist.
+
+<p>See <a class="xref" href="#Gtroff-Internals"><code class="code">gtroff</code> Internals</a>.
+</p>
+</li><li>Without an argument, the <code class="code">tr</code> request is ignored.
+</li></ul>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002etrnt"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.trnt</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">a</i></span><span class="r"><i class="slanted">b</i></span><span class="r"><i class="slanted">c</i></span><span class="r"><i class="slanted">d</i></span>&hellip;</var><a class="copiable-link" href='#index-_002etrnt'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-trnt"></a>
+<a class="index-entry-id" id="index-_005c_0021_002c-and-trnt"></a>
+<p><code class="code">trnt</code> is the same as the <code class="code">tr</code> request except that the
+translations do not apply to text that is transparently throughput into
+a diversion with <code class="code">\!</code>. See <a class="xref" href="#Diversions">Diversions</a>.
+</p>
+<p>For example,
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.tr ab
+.di x
+\!.tm a
+.di
+.x
+</pre></div></div>
+
+<p>prints &lsquo;<samp class="samp">b</samp>&rsquo; to the standard error stream; if <code class="code">trnt</code> is used
+instead of <code class="code">tr</code> it prints &lsquo;<samp class="samp">a</samp>&rsquo;.
+</p></dd></dl>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="troff-and-nroff-Modes">
+<div class="nav-panel">
+<p>
+Next: <a href="#Line-Layout" accesskey="n" rel="next">Line Layout</a>, Previous: <a href="#Character-Translations" accesskey="p" rel="prev">Character Translations</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="troff-and-nroff-Modes-1">5.14 <code class="code">troff</code> and <code class="code">nroff</code> Modes</h3>
+<a class="index-entry-id" id="index-troff-mode"></a>
+<a class="index-entry-id" id="index-mode_002c-troff"></a>
+<a class="index-entry-id" id="index-nroff-mode"></a>
+<a class="index-entry-id" id="index-mode_002c-nroff"></a>
+
+<p>Historically, <code class="code">nroff</code> and <code class="code">troff</code> were two separate programs;
+the former for terminal output, the latter for typesetters. GNU
+<code class="code">troff</code> merges both functions into one executable<a class="footnote" id="DOCF68" href="#FOOT68"><sup>68</sup></a> that sends its output to a
+device driver (<code class="code">grotty</code> for terminal devices, <code class="code">grops</code> for
+PostScript, and so on) which interprets this intermediate output format.
+When discussing <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>, it makes sense to talk
+about <em class="dfn"><code class="code">nroff</code> mode</em> and <em class="dfn"><code class="code">troff</code> mode</em> since the
+differences are hard-coded. GNU <code class="code">troff</code> takes information from
+device and font description files without handling requests specially if
+a terminal output device is used, so such a strong distinction is
+unnecessary.
+</p>
+<p>Usually, a macro package can be used with all output devices.
+Nevertheless, it is sometimes necessary to make a distinction between
+terminal and non-terminal devices: GNU <code class="code">troff</code> provides two
+built-in conditions &lsquo;<samp class="samp">n</samp>&rsquo; and &lsquo;<samp class="samp">t</samp>&rsquo; for the <code class="code">if</code>, <code class="code">ie</code>,
+and <code class="code">while</code> requests to decide whether GNU <code class="code">troff</code> shall
+behave like <code class="code">nroff</code> or like <code class="code">troff</code>.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002etroff"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.troff</code></strong><a class="copiable-link" href='#index-_002etroff'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-troff"></a>
+<a class="index-entry-id" id="index-troffrc-4"></a>
+<a class="index-entry-id" id="index-troffrc_002dend-2"></a>
+<p>Make the &lsquo;<samp class="samp">t</samp>&rsquo; built-in condition true (and the &lsquo;<samp class="samp">n</samp>&rsquo; built-in
+condition false) for <code class="code">if</code>, <code class="code">ie</code>, and <code class="code">while</code> conditional
+requests. This is the default if GNU <code class="code">troff</code> (<em class="emph">not</em>
+<code class="code">groff</code>) is started with the <samp class="option">-R</samp> switch to avoid loading of
+the startup files <samp class="file">troffrc</samp> and <samp class="file">troffrc-end</samp>. Without
+<samp class="option">-R</samp>, GNU <code class="code">troff</code> stays in <code class="code">troff</code> mode if the output
+device is not a terminal (e.g., &lsquo;ps&rsquo;).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enroff"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nroff</code></strong><a class="copiable-link" href='#index-_002enroff'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nroff"></a>
+<a class="index-entry-id" id="index-tty_002etmac"></a>
+<p>Make the &lsquo;<samp class="samp">n</samp>&rsquo; built-in condition true (and the &lsquo;<samp class="samp">t</samp>&rsquo; built-in
+condition false) for <code class="code">if</code>, <code class="code">ie</code>, and <code class="code">while</code> conditional
+requests. This is the default if GNU <code class="code">troff</code> uses a terminal
+output device; the code for switching to <code class="code">nroff</code> mode is in the
+file <samp class="file">tty.tmac</samp>, which is loaded by the startup file
+<code class="code">troffrc</code>.
+</p></dd></dl>
+
+<p>See <a class="xref" href="#Conditionals-and-Loops">Conditionals and Loops</a>, for more details on built-in conditions.
+</p>
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Line-Layout">
+<div class="nav-panel">
+<p>
+Next: <a href="#Line-Continuation" accesskey="n" rel="next">Line Continuation</a>, Previous: <a href="#troff-and-nroff-Modes" accesskey="p" rel="prev"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Line-Layout-1">5.15 Line Layout</h3>
+<a class="index-entry-id" id="index-line-layout"></a>
+<a class="index-entry-id" id="index-layout_002c-line"></a>
+
+<a class="index-entry-id" id="index-dimensions_002c-line"></a>
+<a class="index-entry-id" id="index-line-dimensions"></a>
+<p>The following drawing shows the dimensions that <code class="code">gtroff</code> uses for
+placing a line of output onto the page. They are labeled with the
+request that manipulates each dimension.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> --&gt;| in |&lt;--
+ |&lt;-----------ll------------&gt;|
+ +----+----+----------------------+----+
+ | : : : |
+ +----+----+----------------------+----+
+--&gt;| po |&lt;--
+ |&lt;--------paper width----------------&gt;|
+</pre></div></div>
+
+<p>These dimensions are:
+</p>
+<dl class="ftable">
+<dt id='index-po'><span><code class="code">po</code><a class="copiable-link" href='#index-po'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-left-margin-_0028po_0029"></a>
+<a class="index-entry-id" id="index-margin_002c-left-_0028po_0029"></a>
+<a class="index-entry-id" id="index-page-offset-_0028po_0029"></a>
+<a class="index-entry-id" id="index-offset_002c-page-_0028po_0029"></a>
+<p><em class="dfn">Page offset</em>&mdash;this is the leftmost position of text on the final
+output, defining the <em class="dfn">left margin</em>.
+</p>
+</dd>
+<dt id='index-in'><span><code class="code">in</code><a class="copiable-link" href='#index-in'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-indentation-_0028in_0029"></a>
+<a class="index-entry-id" id="index-line-indentation-_0028in_0029"></a>
+<p><em class="dfn">Indentation</em>&mdash;this is the distance from the left margin where
+text is printed.
+</p>
+</dd>
+<dt id='index-ll'><span><code class="code">ll</code><a class="copiable-link" href='#index-ll'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-line-length-_0028ll_0029"></a>
+<a class="index-entry-id" id="index-length-of-line-_0028ll_0029"></a>
+<p><em class="dfn">Line length</em>&mdash;this is the distance from the left margin to right
+margin.
+</p></dd>
+</dl>
+
+<a class="index-entry-id" id="index-margin_002c-right"></a>
+<a class="index-entry-id" id="index-right-margin"></a>
+<p>The right margin is not explicitly configured; the combination of page
+offset and line length provides the information necessary to derive it.
+</p>
+<p>A simple demonstration:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 3i
+This is text without indentation.
+The line length has been set to 3\~inches.
+.in +.5i
+.ll -.5i
+Now the left and right margins are both increased.
+.in
+.ll
+Calling .in and .ll without parameters restores
+the previous values.
+</pre></div></div>
+
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; This is text without indenta-
+ &rArr; tion. The line length has
+ &rArr; been set to 3 inches.
+ &rArr; Now the left and
+ &rArr; right margins are
+ &rArr; both increased.
+ &rArr; Calling .in and .ll without
+ &rArr; parameters restores the previ-
+ &rArr; ous values.
+</pre></div></div>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epo"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.po</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">offset</i></span>]</var><a class="copiable-link" href='#index-_002epo'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-po-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002epo-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.po</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">offset</i></span></var><a class="copiable-link" href='#index-_002epo-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002epo-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.po</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">offset</i></span></var><a class="copiable-link" href='#index-_002epo-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eo_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.o]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eo_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eo"></a>
+<a class="index-entry-id" id="index-tty_002etmac-1"></a>
+<p>Set page offset to <var class="var">offset</var> (or increment or decrement its current
+value by <var class="var">offset</var>). If invoked without an argument, the page offset
+is restored to the value before the previous <code class="code">po</code> request.
+This request does not cause a break; the page offset in effect when an
+output line is broken prevails (see <a class="pxref" href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a>). The initial value is 1<span class="dmn">i</span> and the default scaling
+unit is &lsquo;<samp class="samp">m</samp>&rsquo;. On terminal devices, the page offset is set to zero
+by a driver-specific macro file, <samp class="file">tty.tmac</samp>. The current page
+offset can be found in the read-only register &lsquo;<samp class="samp">.o</samp>&rsquo;.
+<a class="index-entry-id" id="index-CSTR-_002354-errata-1"></a>
+<a class="index-entry-id" id="index-CSTR-_002354-erratum_002c-po-request"></a>
+This request is incorrectly documented in the <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code> manual as using a default scaling unit of &lsquo;<samp class="samp">v</samp>&rsquo;.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.po 3i
+\n[.o]
+ &rArr; 720
+.po -1i
+\n[.o]
+ &rArr; 480
+.po
+\n[.o]
+ &rArr; 720
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ein"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.in</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">indent</i></span>]</var><a class="copiable-link" href='#index-_002ein'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-in-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002ein-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.in</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">indent</i></span></var><a class="copiable-link" href='#index-_002ein-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002ein-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.in</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">indent</i></span></var><a class="copiable-link" href='#index-_002ein-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ei_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.i]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ei_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ei"></a>
+<p>Set indentation to <var class="var">indent</var> (or increment or decrement the current
+value by <var class="var">indent</var>). This request causes a break. Initially, there
+is no indentation.
+</p>
+<p>If <code class="code">in</code> is called without an argument, the indentation is reset to
+the previous value before the last call to <code class="code">in</code>. The default
+scaling unit is &lsquo;<samp class="samp">m</samp>&rsquo;.
+</p>
+<p>If a negative indentation value is specified (which is not allowed),
+<code class="code">gtroff</code> emits a warning in category &lsquo;<samp class="samp">range</samp>&rsquo; and sets the
+indentation to zero.
+</p>
+<p>The effect of <code class="code">in</code> is delayed until a partially collected line (if
+it exists) is output. A temporary indentation value is reset to zero
+also.
+</p>
+<p>The current indentation (as set by <code class="code">in</code>) can be found in the
+read-only register &lsquo;<samp class="samp">.i</samp>&rsquo;. The indentation is associated with the
+environment (see <a class="pxref" href="#Environments">Environments</a>).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eti"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ti</code></strong> <var class="def-var-arguments">offset</var><a class="copiable-link" href='#index-_002eti'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ti"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eti-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ti</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">offset</i></span></var><a class="copiable-link" href='#index-_002eti-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002eti-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ti</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">offset</i></span></var><a class="copiable-link" href='#index-_002eti-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ein_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.in]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ein_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ein-3"></a>
+<p>Temporarily indent the next output line by <var class="var">offset</var>. If an
+increment or decrement value is specified, adjust the temporary
+indentation relative to the value set by the <code class="code">in</code> request.
+</p>
+<p>This request causes a break; its value is associated with the
+environment (see <a class="pxref" href="#Environments">Environments</a>). The default scaling unit is
+&lsquo;<samp class="samp">m</samp>&rsquo;. A call of <code class="code">ti</code> without an argument is ignored.
+</p>
+<p>If the total indentation value is negative (which is not allowed),
+<code class="code">gtroff</code> emits a warning in category &lsquo;<samp class="samp">range</samp>&rsquo; and sets the
+temporary indentation to zero. &lsquo;Total indentation&rsquo; is either
+<var class="var">offset</var> if specified as an absolute value, or the temporary plus
+normal indentation, if <var class="var">offset</var> is given as a relative value.
+</p>
+<p>The effect of <code class="code">ti</code> is delayed until a partially collected line (if
+it exists) is output.
+</p>
+<p>The read-only register <code class="code">.in</code> is the indentation that applies to the
+current output line.
+</p>
+<p>The difference between <code class="code">.i</code> and <code class="code">.in</code> is that the latter takes
+into account whether a partially collected line still uses the old
+indentation value or a temporary indentation value is active.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ell"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ll</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">length</i></span>]</var><a class="copiable-link" href='#index-_002ell'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ll-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002ell-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ll</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">length</i></span></var><a class="copiable-link" href='#index-_002ell-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002ell-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ll</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">length</i></span></var><a class="copiable-link" href='#index-_002ell-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002el_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.l]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002el_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002el"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ell_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.ll]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ell_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ell-3"></a>
+<p>Set the line length to <var class="var">length</var> (or increment or decrement the
+current value by <var class="var">length</var>). Initially, the line length is set to
+6.5<span class="dmn">i</span>. The effect of <code class="code">ll</code> is delayed until a partially
+collected line (if it exists) is output. The default scaling unit is
+&lsquo;<samp class="samp">m</samp>&rsquo;.
+</p>
+<p>If <code class="code">ll</code> is called without an argument, the line length is reset to
+the previous value before the last call to <code class="code">ll</code>. If a negative
+line length is specified (which is not allowed), <code class="code">gtroff</code> emits a
+warning in category &lsquo;<samp class="samp">range</samp>&rsquo; and sets the line length to zero. The
+line length is associated with the environment (see <a class="pxref" href="#Environments">Environments</a>).
+</p>
+<a class="index-entry-id" id="index-line-length-register-_0028_002el_0029"></a>
+<p>The current line length (as set by <code class="code">ll</code>) can be found in the
+read-only register &lsquo;<samp class="samp">.l</samp>&rsquo;. The read-only register <code class="code">.ll</code> is the
+line length that applies to the current output line.
+</p>
+<p>Similar to <code class="code">.i</code> and <code class="code">.in</code>, the difference between <code class="code">.l</code>
+and <code class="code">.ll</code> is that the latter takes into account whether a partially
+collected line still uses the old line length value.
+</p></dd></dl>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Line-Continuation">
+<div class="nav-panel">
+<p>
+Next: <a href="#Page-Layout" accesskey="n" rel="next">Page Layout</a>, Previous: <a href="#Line-Layout" accesskey="p" rel="prev">Line Layout</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Line-Continuation-1">5.16 Line Continuation</h3>
+<a class="index-entry-id" id="index-line-control"></a>
+<a class="index-entry-id" id="index-control_002c-line"></a>
+
+<p>When filling is enabled, input and output line breaks generally do not
+correspond. The <code class="code">roff</code> language therefore distinguishes input and
+output line continuation.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cRET-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\<kbd class="key">RET</kbd></code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cRET-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cRET"></a>
+<a class="index-entry-id" id="index-input-line-continuation-_0028_005cRET_0029"></a>
+<a class="index-entry-id" id="index-line_002c-input_002c-continuation-_0028_005cRET_0029"></a>
+<a class="index-entry-id" id="index-continuation_002c-input-line-_0028_005cRET_0029"></a>
+<a class="index-entry-id" id="index-_005cnewline"></a>
+<p><code class="code">\<kbd class="key">RET</kbd></code> (a backslash immediately followed by a newline)
+suppresses the effects of that newline in the input. The next input
+line thus retains the classification of its predecessor as a control or
+text line. <code class="code">\<kbd class="key">RET</kbd></code> is useful for managing line lengths in the
+input during document maintenance; you can break an input line in the
+middle of a request invocation, macro call, or escape sequence. Input
+line continuation is invisible to the formatter, with two exceptions:
+the <code class="code">|</code> operator recognizes the new input line
+(see <a class="pxref" href="#Numeric-Expressions">Numeric Expressions</a>), and the input line counter register
+<code class="code">.c</code> is incremented.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 50n
+.de I
+. ft I
+. nop \\$*
+. ft
+..
+Our film class watched
+.I The Effect of Gamma Rays on Man-in-the-Moon
+Marigolds. \&quot; whoops, the input line wrapped
+.br
+.I My own opus begins on line \n[.c] \
+and ends on line \n[.c].
+</pre></div></div>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; Our film class watched <i class="i">The Effect of Gamma Rays on</i>
+ &rArr; <i class="i">Man-in-the-Moon</i> Marigolds.
+ &rArr; <i class="i">My own opus begins on line 11 and ends on line 12.</i>
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cc-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\c</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cc-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cc"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eint_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.int]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eint_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eint"></a>
+<a class="index-entry-id" id="index-output-line_002c-continuation-_0028_005cc_0029"></a>
+<a class="index-entry-id" id="index-line_002c-output_002c-continuation-_0028_005cc_0029"></a>
+<a class="index-entry-id" id="index-continuation_002c-output-line-_0028_005cc_0029"></a>
+<a class="index-entry-id" id="index-interrupted-line"></a>
+<a class="index-entry-id" id="index-line_002c-interrupted"></a>
+<a class="index-entry-id" id="index-_005cR_002c-after-_005cc"></a>
+<p><code class="code">\c</code> continues an output line. Nothing after it on the input line
+is formatted. In contrast to <code class="code">\<kbd class="key">RET</kbd></code>, a line after <code class="code">\c</code>
+remains a new input line, so a control character is recognized at its
+beginning. The visual results depend on whether filling is enabled; see
+<a class="ref" href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a>.
+</p>
+<ul class="itemize mark-bullet">
+<li><a class="index-entry-id" id="index-_005cc_002c-when-filling-enabled"></a>
+<a class="index-entry-id" id="index-fill-mode_002c-and-_005cc"></a>
+<a class="index-entry-id" id="index-mode_002c-fill_002c-and-_005cc"></a>
+If filling is enabled, a word interrupted with <code class="code">\c</code> is continued
+with the text on the next input text line, without an intervening space.
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">This is a te\c
+st.
+ &rArr; This is a test.
+</pre></div></div>
+
+</li><li><a class="index-entry-id" id="index-_005cc_002c-when-filling-disabled"></a>
+<a class="index-entry-id" id="index-no_002dfill-mode_002c-and-_005cc"></a>
+<a class="index-entry-id" id="index-mode_002c-no_002dfill_002c-and-_005cc"></a>
+If filling is disabled, the next input text line after <code class="code">\c</code> is
+handled as a continuation of the same input text line.
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nf
+This is a \c
+test.
+ &rArr; This is a test.
+</pre></div></div>
+</li></ul>
+
+<p>An intervening control line that causes a break overrides <code class="code">\c</code>,
+flushing out the pending output line in the usual way.
+</p>
+<a class="index-entry-id" id="index-interrupted-line-register-_0028_002eint_0029"></a>
+<a class="index-entry-id" id="index-continued-output-line-register-_0028_002eint_0029"></a>
+<p>The <code class="code">.int</code> register contains a positive value if the last output
+line was continued with <code class="code">\c</code>; this datum is associated with the
+environment (see <a class="pxref" href="#Environments">Environments</a>).<a class="footnote" id="DOCF69" href="#FOOT69"><sup>69</sup></a>
+</p></dd></dl>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Page-Layout">
+<div class="nav-panel">
+<p>
+Next: <a href="#Page-Control" accesskey="n" rel="next">Page Control</a>, Previous: <a href="#Line-Continuation" accesskey="p" rel="prev">Line Continuation</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Page-Layout-2">5.17 Page Layout</h3>
+<a class="index-entry-id" id="index-page-layout"></a>
+<a class="index-entry-id" id="index-layout_002c-page"></a>
+
+<p>The formatter permits configuration of the page length and page number.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epl"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pl</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">length</i></span>]</var><a class="copiable-link" href='#index-_002epl'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-pl"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002epl-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pl</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">length</i></span></var><a class="copiable-link" href='#index-_002epl-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002epl-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pl</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">length</i></span></var><a class="copiable-link" href='#index-_002epl-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ep_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.p]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ep_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ep"></a>
+<a class="index-entry-id" id="index-page-length_002c-configuring-_0028pl_0029"></a>
+<a class="index-entry-id" id="index-length-of-the-page_002c-configuring-_0028pl_0029"></a>
+<a class="index-entry-id" id="index-configuring-the-page-length-_0028pl_0029"></a>
+<a class="index-entry-id" id="index-setting-the-page-length-_0028pl_0029"></a>
+<p>Change (increase or decrease) the page length per the numeric expression
+<var class="var">length</var>. The default scaling unit is &lsquo;<samp class="samp">v</samp>&rsquo;. A negative
+<var class="var">length</var> is valid, but an uncommon application: it prevents page
+location traps from being sprung,<a class="footnote" id="DOCF70" href="#FOOT70"><sup>70</sup></a> and each
+output line is placed on a new page. If <var class="var">length</var> is invalid, GNU
+<code class="code">troff</code> emits a warning in category &lsquo;<samp class="samp">number</samp>&rsquo;. If <var class="var">length</var>
+is absent or invalid, &lsquo;<samp class="samp">11i</samp>&rsquo; is assumed.
+</p>
+<a class="index-entry-id" id="index-page-length-register-_0028_002ep_0029"></a>
+<p>The read-only register &lsquo;<samp class="samp">.p</samp>&rsquo; interpolates the current page length.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epn"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pn</code></strong> <var class="def-var-arguments">num</var><a class="copiable-link" href='#index-_002epn'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-pn"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002epn-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pn</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">num</i></span></var><a class="copiable-link" href='#index-_002epn-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002epn-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pn</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">num</i></span></var><a class="copiable-link" href='#index-_002epn-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002epn_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.pn]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002epn_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002epn-3"></a>
+<a class="index-entry-id" id="index-page-number_002c-configuring-next-_0028pn_0029"></a>
+<a class="index-entry-id" id="index-next-page-number_002c-configuring-_0028pn_0029"></a>
+<a class="index-entry-id" id="index-number_002c-page_002c-next_002c-configuring-_0028pn_0029"></a>
+<p>Change (increase or decrease) the page number of the <em class="emph">next</em> page
+per the numeric expression <var class="var">num</var>. If <var class="var">num</var> is invalid, GNU
+<code class="code">troff</code> emits a warning in category &lsquo;<samp class="samp">number</samp>&rsquo; and ignores the
+request. Without an argument, <code class="code">pn</code> is ignored.
+</p>
+<a class="index-entry-id" id="index-next-page-number-register-_0028_002epn_0029"></a>
+<a class="index-entry-id" id="index-page-number_002c-next_002c-register-_0028_002epn_0029"></a>
+<p>The read-only register <code class="code">.pn</code> interpolates <var class="var">num</var> if set by
+<code class="code">pn</code> on the current page, or the current page number plus&nbsp;1.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-headers"></a>
+<a class="index-entry-id" id="index-footers"></a>
+<a class="index-entry-id" id="index-titles"></a>
+<p>The formatter offers special support for typesetting headers and
+footers, collectively termed <em class="dfn">titles</em>. Titles have an independent
+line length, and their placement on the page is not restricted.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002etl"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.tl</code></strong> <var class="def-var-arguments"><code class="code">'</code><span class="r"><i class="slanted">left</i></span><code class="code">'</code><span class="r"><i class="slanted">center</i></span><code class="code">'</code><span class="r"><i class="slanted">right</i></span><code class="code">'</code></var><a class="copiable-link" href='#index-_002etl'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-tl"></a>
+<a class="index-entry-id" id="index-title-line_002c-formatting-_0028tl_0029"></a>
+<a class="index-entry-id" id="index-formatting-a-title-line-_0028tl_0029"></a>
+<a class="index-entry-id" id="index-three_002dpart-title-_0028tl_0029"></a>
+<a class="index-entry-id" id="index-page-number-character-_0028_0025_0029"></a>
+<p>Format an output line as a title consisting of <var class="var">left</var>, <var class="var">center</var>,
+and <var class="var">right</var>, each aligned accordingly. The delimiter need not be a
+neutral apostrophe: <code class="code">tl</code> accepts the same delimiters as most escape
+sequences; see <a class="ref" href="#Delimiters">Delimiters</a>. If not used as the delimiter, any
+<em class="dfn">page number character</em> character is replaced with the current page
+number; the default is &lsquo;<samp class="samp">%</samp>&rsquo;; see the the <code class="code">pc</code> request below.
+Without an argument, <code class="code">tl</code> is ignored. <code class="code">tl</code> writes the title
+line immediately, ignoring any partially collected line.
+</p>
+<p>It is not an error to omit delimiters after the first. For example,
+&lsquo;<samp class="samp">.tl&nbsp;/Thesis</samp>&rsquo;<!-- /@w --> is interpreted as &lsquo;<samp class="samp">.tl&nbsp;/Thesis///</samp>&rsquo;<!-- /@w -->: it
+sets a title line comprising only the left-aligned word &lsquo;<samp class="samp">Thesis</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002elt"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.lt</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">length</i></span>]</var><a class="copiable-link" href='#index-_002elt'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-lt"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002elt-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.lt</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">length</i></span></var><a class="copiable-link" href='#index-_002elt-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002elt-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.lt</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">length</i></span></var><a class="copiable-link" href='#index-_002elt-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002elt_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.lt]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002elt_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002elt-3"></a>
+<a class="index-entry-id" id="index-length-of-title-line_002c-configuring-_0028lt_0029"></a>
+<a class="index-entry-id" id="index-title-length_002c-configuring-_0028lt_0029"></a>
+<p>Change (increase or decrease) the line length used by titles per the
+numeric expression <var class="var">length</var>. The default scaling unit is &lsquo;<samp class="samp">m</samp>&rsquo;.
+If <var class="var">length</var> is negative, GNU emits a warning in category
+&lsquo;<samp class="samp">range</samp>&rsquo; and treats <var class="var">length</var> as &lsquo;<samp class="samp">0</samp>&rsquo;. If <var class="var">length</var> is
+invalid, GNU <code class="code">troff</code> emits a warning in category &lsquo;<samp class="samp">number</samp>&rsquo; and
+ignores the request. The formatter&rsquo;s default title length is
+&lsquo;<samp class="samp">6.5i</samp>&rsquo;. With no argument, the title length is restored to the
+previous value. The title length is is associated with the environment
+(see <a class="pxref" href="#Environments">Environments</a>).
+</p>
+<a class="index-entry-id" id="index-title-line-length-register-_0028_002elt_0029"></a>
+<p>The read-only register &lsquo;<samp class="samp">.lt</samp>&rsquo; interpolates the title line length.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pc</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">char</i></span>]</var><a class="copiable-link" href='#index-_002epc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-pc"></a>
+<a class="index-entry-id" id="index-changing-the-page-number-character-_0028pc_0029"></a>
+<a class="index-entry-id" id="index-page-number-character_002c-changing-_0028pc_0029"></a>
+<a class="index-entry-id" id="index-_0025-1"></a>
+<p>Set the page number character to <var class="var">char</var>. With no argument, the page
+number character is disabled. <code class="code">pc</code> does not affect the
+register&nbsp;<code class="code">%</code>.
+</p></dd></dl>
+
+<p>The following example exercises title features.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.lt 50n
+This is my partially collected
+.tl 'Isomers 2023'%'Dextrose Edition'
+line.
+ &rArr; Isomers 2023 1 Dextrose Edition
+ &rArr; This is my partially collected line.
+</pre></div></div>
+
+<p>We most often see titles used in page header and footer traps.
+See <a class="xref" href="#Traps">Traps</a>.
+</p>
+
+<hr>
+</div>
+<div class="section-level-extent" id="Page-Control">
+<div class="nav-panel">
+<p>
+Next: <a href="#Using-Fonts" accesskey="n" rel="next">Using Fonts</a>, Previous: <a href="#Page-Layout" accesskey="p" rel="prev">Page Layout</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Page-Control-1">5.18 Page Control</h3>
+<a class="index-entry-id" id="index-page-control"></a>
+<a class="index-entry-id" id="index-control_002c-page"></a>
+
+<a class="index-entry-id" id="index-page-break-1"></a>
+<a class="index-entry-id" id="index-break_002c-page-1"></a>
+<a class="index-entry-id" id="index-page-ejection-1"></a>
+<a class="index-entry-id" id="index-ejection_002c-page-1"></a>
+<p>Discretionary page breaks can prevent the unwanted separation of
+content. A new page number takes effect during page ejection; see
+<a class="ref" href="#The-Implicit-Page-Trap">The Implicit Page Trap</a>.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ebp"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.bp</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">page-number</i></span>]</var><a class="copiable-link" href='#index-_002ebp'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-bp"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002ebp-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.bp</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">page-number</i></span></var><a class="copiable-link" href='#index-_002ebp-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002ebp-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.bp</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">page-number</i></span></var><a class="copiable-link" href='#index-_002ebp-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_0025_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[%]</code></strong><a class="copiable-link" href='#index-_005cn_005b_0025_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_0025-2"></a>
+<a class="index-entry-id" id="index-new-page-_0028bp_0029"></a>
+<a class="index-entry-id" id="index-page_002c-new-_0028bp_0029"></a>
+<p>Break the page and change (increase or decrease) the next page number
+per the numeric expression <var class="var">page-number</var>. If <var class="var">page-number</var> is
+invalid, GNU <code class="code">troff</code> emits a warning in category &lsquo;<samp class="samp">number</samp>&rsquo; and
+ignores the argument. This request causes a break. A page break
+advances the vertical drawing position to the bottom of the page,
+springing traps. See <a class="xref" href="#Page-Location-Traps">Page Location Traps</a>.
+<a class="index-entry-id" id="index-bp-request_002c-and-top_002dlevel-diversion"></a>
+<a class="index-entry-id" id="index-top_002dlevel-diversion_002c-and-bp"></a>
+<a class="index-entry-id" id="index-diversion_002c-top_002dlevel_002c-and-bp"></a>
+<code class="code">bp</code> has effect only if invoked within the top-level
+diversion.<a class="footnote" id="DOCF71" href="#FOOT71"><sup>71</sup></a>
+<a class="index-entry-id" id="index-CSTR-_002354-errata-2"></a>
+<a class="index-entry-id" id="index-CSTR-_002354-erratum_002c-bp-request"></a>
+This request is incorrectly documented in the <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code> manual as having a default scaling unit of &lsquo;<samp class="samp">v</samp>&rsquo;.
+</p>
+<a class="index-entry-id" id="index-page-number-register-_0028_0025_0029"></a>
+<a class="index-entry-id" id="index-current-page-number-_0028_0025_0029"></a>
+<p>The register <code class="code">%</code> interpolates the current page number.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de BP
+' bp \&quot; schedule page break once current line is output
+..
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ene"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ne</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">space</i></span>]</var><a class="copiable-link" href='#index-_002ene'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ne"></a>
+<a class="index-entry-id" id="index-orphan-lines_002c-preventing-with-ne"></a>
+<a class="index-entry-id" id="index-conditional-page-break-_0028ne_0029"></a>
+<a class="index-entry-id" id="index-page-break_002c-conditional-_0028ne_0029"></a>
+<p>Force a page break if insufficient vertical space is available (assert
+&ldquo;needed&rdquo; space). <code class="code">ne</code> tests the distance to the next page
+location trap; see <a class="ref" href="#Page-Location-Traps">Page Location Traps</a>, and breaks the page if
+that amount is less than <var class="var">space</var>. The default scaling unit is
+&lsquo;<samp class="samp">v</samp>&rsquo;. If <var class="var">space</var> is invalid, GNU <code class="code">troff</code> emits a warning
+in category &lsquo;<samp class="samp">number</samp>&rsquo; and ignores the argument. If <var class="var">space</var> is
+not specified, &lsquo;<samp class="samp">1v</samp>&rsquo; is assumed.
+</p>
+<a class="index-entry-id" id="index-widow"></a>
+<p>We can require space for at least the first two output lines of a
+paragraph, preventing its first line from being <i class="slanted">widowed</i> at the
+page bottom.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ne 2v
+Considering how common illness is,
+how tremendous the spiritual change that it brings,
+how astonishing,
+when the lights of health go down,
+the undiscovered countries that are then disclosed,
+what wastes and deserts of the soul a slight attack
+of influenza brings to view,
+</pre></div></div>
+
+<p>This method is reliable only if no output line is pending when <code class="code">ne</code>
+is invoked. When macro packages are used, this is often not the case:
+their paragraphing macros perform the break. You may need to experiment
+with placing the <code class="code">ne</code> after the paragraphing macro, or <code class="code">br</code>
+and <code class="code">ne</code> before it.
+</p>
+<a class="index-entry-id" id="index-orphan"></a>
+<a class="index-entry-id" id="index-widow-1"></a>
+<p><code class="code">ne</code> is also useful to force grouping of section headings with
+their subsequent paragraphs, or tables with their captions and/or
+explanations. Macro packages often use <code class="code">ne</code> with diversions to
+implement keeps and displays; see <a class="ref" href="#Diversions">Diversions</a>. They may also offer
+parameters for widow and orphan management.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002esv"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.sv</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">space</i></span>]</var><a class="copiable-link" href='#index-_002esv'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-sv"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eos"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.os</code></strong><a class="copiable-link" href='#index-_002eos'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-os"></a>
+<a class="index-entry-id" id="index-ne-request_002c-comparison-with-sv"></a>
+<p>Require vertical space as <code class="code">ne</code> does, but also <i class="slanted">save</i> it for
+later output by the <code class="code">os</code> request. If <var class="var">space</var> is available
+before the next page location trap, it is output immediately. Both
+requests ignore a partially collected line, taking effect at the next
+break.
+<a class="index-entry-id" id="index-sv-request_002c-and-no_002dspace-mode"></a>
+<a class="index-entry-id" id="index-os-request_002c-and-no_002dspace-mode"></a>
+<code class="code">sv</code> and <code class="code">os</code> ignore no-space mode (recall <a class="ref" href="#Manipulating-Spacing">Manipulating Spacing</a>). While the <code class="code">sv</code> request allows negative values for
+<var class="var">space</var>, <code class="code">os</code> ignores them. The default scaling unit is
+&lsquo;<samp class="samp">v</samp>&rsquo;. If <var class="var">space</var> is not specified, &lsquo;<samp class="samp">1v</samp>&rsquo; is assumed.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bnl_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[nl]</code></strong><a class="copiable-link" href='#index-_005cn_005bnl_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nl"></a>
+<a class="index-entry-id" id="index-vertical-drawing-position-_0028nl_0029"></a>
+<a class="index-entry-id" id="index-vertical-position_002c-drawing-_0028nl_0029"></a>
+<a class="index-entry-id" id="index-drawing-position_002c-vertical-_0028nl_0029"></a>
+<p><code class="code">nl</code> interpolates or sets the vertical drawing position. When the
+formatter starts, the first page transition hasn&rsquo;t happened yet, and
+<code class="code">nl</code> is negative. If a header trap has been planted on the page
+(typically at vertical position <code class="code">0</code>), you can assign a negative
+value to <code class="code">nl</code> to spring it if that page has already started
+(see <a class="pxref" href="#Page-Location-Traps">Page Location Traps</a>).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de HD
+. sp
+. tl ''Goldbach Solution''
+. sp
+..
+.
+First page.
+.bp
+.wh 0 HD \&quot; plant header trap at top of page
+.nr nl (-1)
+Second page.
+ &rArr; First page.
+ &rArr;
+ &rArr; <span class="r"><i class="i">(blank lines elided)</i></span>
+ &rArr;
+ &rArr; Goldbach Solution
+ &rArr;
+ &rArr; <span class="r"><i class="i">(blank lines elided)</i></span>
+ &rArr;
+ &rArr; Second page.
+</pre></div></div>
+
+<p>Without resetting <code class="code">nl</code> to a negative value, the trap just planted
+would be active beginning with the <em class="emph">next</em> page, not the current
+one.
+</p>
+<p>See <a class="xref" href="#Diversions">Diversions</a>, for a comparison of <code class="code">nl</code> with the <code class="code">.h</code> and
+<code class="code">.d</code> registers.
+</p></dd></dl>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Using-Fonts">
+<div class="nav-panel">
+<p>
+Next: <a href="#Manipulating-Type-Size-and-Vertical-Spacing" accesskey="n" rel="next">Manipulating Type Size and Vertical Spacing</a>, Previous: <a href="#Page-Control" accesskey="p" rel="prev">Page Control</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Using-Fonts-1">5.19 Using Fonts</h3>
+<a class="index-entry-id" id="index-font"></a>
+
+<a class="index-entry-id" id="index-typeface"></a>
+<a class="index-entry-id" id="index-font-family"></a>
+<a class="index-entry-id" id="index-font-style"></a>
+<a class="index-entry-id" id="index-style_002c-font"></a>
+<a class="index-entry-id" id="index-family_002c-font"></a>
+<a class="index-entry-id" id="index-text-font"></a>
+<a class="index-entry-id" id="index-special-font"></a>
+<a class="index-entry-id" id="index-unstyled-font"></a>
+<a class="index-entry-id" id="index-font_002c-text"></a>
+<a class="index-entry-id" id="index-font_002c-special"></a>
+<a class="index-entry-id" id="index-font_002c-unstyled"></a>
+<p>In digital typography, a <em class="dfn">font</em> is a collection of characters in a
+specific typeface that a device can render as glyphs at a desired
+size.<a class="footnote" id="DOCF72" href="#FOOT72"><sup>72</sup></a> A <code class="code">roff</code> formatter can change typefaces at any
+point in the text. The basic faces are a set of <em class="dfn">styles</em> combining
+upright and slanted shapes with normal and heavy stroke weights:
+&lsquo;<samp class="samp">R</samp>&rsquo;, &lsquo;<samp class="samp">I</samp>&rsquo;, &lsquo;<samp class="samp">B</samp>&rsquo;, and &lsquo;<samp class="samp">BI</samp>&rsquo;&mdash;these stand for
+<i class="slanted">roman</i>, <i class="slanted">italic</i>, <i class="slanted">bold</i>, and
+<i class="slanted">bold-italic</i>. For linguistic text, GNU <code class="code">troff</code> groups
+typefaces into <em class="dfn">families</em> containing each of these
+styles.<a class="footnote" id="DOCF73" href="#FOOT73"><sup>73</sup></a> A <em class="dfn">text font</em> is thus often a family
+combined with a style, but it need not be: consider the <code class="code">ps</code> and
+<code class="code">pdf</code> devices&rsquo; <code class="code">ZCMI</code> (Zapf Chancery Medium italic)&mdash;often,
+no other style of Zapf Chancery Medium is provided. On typesetting
+devices, at least one <em class="dfn">special font</em> is available, comprising
+<em class="dfn">unstyled</em> glyphs for mathematical operators and other purposes.
+</p>
+<a class="index-entry-id" id="index-font-description-file"></a>
+<a class="index-entry-id" id="index-description-file_002c-font"></a>
+<a class="index-entry-id" id="index-file_002c-font-description"></a>
+<a class="index-entry-id" id="index-font-metrics"></a>
+<a class="index-entry-id" id="index-metrics_002c-font"></a>
+<a class="index-entry-id" id="index-mounting-position"></a>
+<a class="index-entry-id" id="index-mounting-position-1"></a>
+<a class="index-entry-id" id="index-position_002c-mounting"></a>
+<p>Like <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>, GNU <code class="code">troff</code> does not itself load
+or manipulate a digital font file;<a class="footnote" id="DOCF74" href="#FOOT74"><sup>74</sup></a> instead it
+works with a <em class="dfn">font description file</em> that characterizes it,
+including its glyph repertoire and the <em class="dfn">metrics</em> (dimensions) of
+each glyph.<a class="footnote" id="DOCF75" href="#FOOT75"><sup>75</sup></a> This
+information permits the formatter to accurately place glyphs with
+respect to each other. Before using a font description, the formatter
+associates it with a <em class="dfn">mounting position</em>, a place in an ordered list
+of available typefaces.
+<a class="index-entry-id" id="index-abstract-font-style"></a>
+<a class="index-entry-id" id="index-font-style_002c-abstract"></a>
+<a class="index-entry-id" id="index-style_002c-font_002c-abstract"></a>
+So that a document need not be strongly coupled to a specific font
+family, in GNU <code class="code">troff</code> an output device can associate a style in
+the abstract sense with a mounting position. Thus the default family
+can be combined with a style dynamically, producing a <em class="dfn">resolved font
+name</em>.
+</p>
+<p>Fonts often have trademarked names, and even Free Software fonts can
+require renaming upon modification. <code class="code">groff</code> maintains a
+convention that a device&rsquo;s serif font family is given the name &lsquo;<samp class="samp">T</samp>&rsquo;
+(&ldquo;Times&rdquo;), its sans-serif family &lsquo;<samp class="samp">H</samp>&rsquo; (&ldquo;Helvetica&rdquo;), and its
+monospaced family &lsquo;<samp class="samp">C</samp>&rsquo; (&ldquo;Courier&rdquo;). Historical inertia has driven
+<code class="code">groff</code>&rsquo;s font identifiers to short uppercase abbreviations of font
+names, as with &lsquo;<samp class="samp">TR</samp>&rsquo;, &lsquo;<samp class="samp">TI</samp>&rsquo;, &lsquo;<samp class="samp">TB</samp>&rsquo;, &lsquo;<samp class="samp">TBI</samp>&rsquo;, and a
+special font &lsquo;<samp class="samp">S</samp>&rsquo;.
+</p>
+<p>The default family used with abstract styles can be changed at any time;
+initially, it is &lsquo;<samp class="samp">T</samp>&rsquo;. Typically, abstract styles are arranged in
+the first four mounting positions in the order shown above. The default
+mounting position, and therefore style, is always &lsquo;<samp class="samp">1</samp>&rsquo; (&lsquo;<samp class="samp">R</samp>&rsquo;).
+By issuing appropriate formatter instructions, you can override these
+defaults before your document writes its first glyph.
+</p>
+<a class="index-entry-id" id="index-graphic-renditions"></a>
+<a class="index-entry-id" id="index-renditions_002c-graphic"></a>
+<a class="index-entry-id" id="index-character-cell-attributes"></a>
+<a class="index-entry-id" id="index-attributes_002c-character-cell"></a>
+<a class="index-entry-id" id="index-cell_002c-character_002c-attributes"></a>
+<p>Terminal output devices cannot change font families and lack special
+fonts. They support style changes by overstriking, or by altering
+ISO&nbsp;6429/ECMA-48 <em class="dfn">graphic renditions</em> (character cell
+attributes).
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="#Selecting-Fonts" accesskey="1">Selecting Fonts</a></li>
+<li><a href="#Font-Families" accesskey="2">Font Families</a></li>
+<li><a href="#Font-Positions" accesskey="3">Font Positions</a></li>
+<li><a href="#Using-Symbols" accesskey="4">Using Symbols</a></li>
+<li><a href="#Character-Classes" accesskey="5">Character Classes</a></li>
+<li><a href="#Special-Fonts" accesskey="6">Special Fonts</a></li>
+<li><a href="#Artificial-Fonts" accesskey="7">Artificial Fonts</a></li>
+<li><a href="#Ligatures-and-Kerning" accesskey="8">Ligatures and Kerning</a></li>
+<li><a href="#Italic-Corrections" accesskey="9">Italic Corrections</a></li>
+<li><a href="#Dummy-Characters">Dummy Characters</a></li>
+</ul>
+<hr>
+<div class="subsection-level-extent" id="Selecting-Fonts">
+<div class="nav-panel">
+<p>
+Next: <a href="#Font-Families" accesskey="n" rel="next">Font Families</a>, Previous: <a href="#Using-Fonts" accesskey="p" rel="prev">Using Fonts</a>, Up: <a href="#Using-Fonts" accesskey="u" rel="up">Using Fonts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Selecting-Fonts-1">5.19.1 Selecting Fonts</h4>
+<a class="index-entry-id" id="index-font_002c-selection"></a>
+
+<p>We use <em class="dfn">font</em> to refer to any of several means of identifying a
+font: by mounting position (&lsquo;<samp class="samp">3</samp>&rsquo;), by abstract style (&lsquo;<samp class="samp">B</samp>&rsquo;), or
+by its identifier (&lsquo;<samp class="samp">TB</samp>&rsquo;).
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eft"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ft</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">font</i></span>]</var><a class="copiable-link" href='#index-_002eft'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ft"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cff"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\f</code><span class="r"><i class="slanted">f</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cff'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cf"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cf_0028fn"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\f(</code><span class="r"><i class="slanted">fn</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cf_0028fn'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cf_005bfont_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\f[</code><span class="r"><i class="slanted">font</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cf_005bfont_005d'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002efn_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.fn]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002efn_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002efn"></a>
+<a class="index-entry-id" id="index-changing-fonts-_0028ft_002c-_005cf_0029"></a>
+<a class="index-entry-id" id="index-fonts_002c-changing-_0028ft_002c-_005cf_0029"></a>
+<a class="index-entry-id" id="index-sty-request_002c-and-changing-fonts"></a>
+<a class="index-entry-id" id="index-fam-request_002c-and-changing-fonts"></a>
+<a class="index-entry-id" id="index-_005cF_002c-and-changing-fonts"></a>
+<a class="index-entry-id" id="index-styles"></a>
+<a class="index-entry-id" id="index-family"></a>
+<a class="index-entry-id" id="index-DESC"></a>
+<a class="index-entry-id" id="index-selecting-the-previous-font-_0028ft_0029"></a>
+<a class="index-entry-id" id="index-previous-font_002c-selecting-_0028ft_0029"></a>
+<a class="index-entry-id" id="index-font_002c-previous_002c-slecting-_0028ft_0029"></a>
+<p>The <code class="code">ft</code> request selects the typeface <var class="var">font</var>. If the argument
+is absent or &lsquo;<samp class="samp">P</samp>&rsquo;, it selects the previously chosen font. If
+<var class="var">font</var> is a non-negative integer, it is interpreted as mounting
+position; the font mounted there is selected. If that position refers
+to an abstract style, it is combined with the default family (see
+<code class="code">fam</code> and <code class="code">\F</code> below) to make a resolved font name. If the
+mounting position is not a style and no font is mounted there, GNU
+<code class="code">troff</code> emits a warning in category &lsquo;<samp class="samp">font</samp>&rsquo; and ignores the
+request.
+</p>
+<p>If <var class="var">font</var> matches a style name, it is combined with the current
+family to make a resolved font name. Otherwise, <var class="var">font</var> is assumed
+to already be a resolved font name.
+</p>
+<a class="index-entry-id" id="index-automatic-font-mounting"></a>
+<a class="index-entry-id" id="index-font-mounting_002c-automatic"></a>
+<a class="index-entry-id" id="index-mounting_002c-font_002c-automatic"></a>
+<p>The resolved font name is subject to translation (see request <code class="code">ftr</code>
+below). Next, the (possibly translated) font name&rsquo;s mounting position
+is looked up; if not mounted, <var class="var">font</var> is sought on the file system as
+a font description file and, if located, automatically mounted at the
+next available position (see register <code class="code">.fp</code> below). If the font
+was mounted using an identifier different from its font description file
+name (see request <code class="code">fp</code> below), that file name is then looked up.
+If a font description file for the resolved font name is not found, GNU
+<code class="code">troff</code> emits a warning in category &lsquo;<samp class="samp">font</samp>&rsquo; and ignores the
+request.
+</p>
+<p>The <code class="code">\f</code> escape sequence is similar, using one-character name (or
+mounting position) <var class="var">f</var>, two-character name <var class="var">fn</var>, or a name
+<var class="var">font</var> of arbitrary length.
+<a class="index-entry-id" id="index-previous-font_002c-selecting-_0028_005cf_005b_005d_002c-_005cfP_0029"></a>
+<a class="index-entry-id" id="index-font_002c-previous_002c-selecting-_0028_005cf_005b_005d_002c-_005cfP_0029"></a>
+&lsquo;<samp class="samp">\f[]</samp>&rsquo; selects the previous font. The syntax form &lsquo;<samp class="samp">\fP</samp>&rsquo; is
+supported for backward compatibility, and &lsquo;<samp class="samp">\f[P]</samp>&rsquo; for consistency.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">eggs, bacon,
+.ft I
+spam,
+.ft
+and sausage.
+.br
+eggs, bacon, \fIspam,\fP and sausage.
+ &rArr; eggs, bacon, <i class="slanted">spam,</i> and sausage
+ &rArr; eggs, bacon, <i class="slanted">spam,</i> and sausage
+</pre></div></div>
+
+<p>The current and previously selected fonts are properties of the
+environment (see <a class="pxref" href="#Environments">Environments</a>).
+</p>
+<p>The read-only string-valued register <code class="code">.fn</code> contains the resolved
+font name of the selected font.
+</p>
+<p><code class="code">\f</code> doesn&rsquo;t produce an input token in GNU <code class="code">troff</code>; it thus
+can be used in requests that expect a single-character argument. We can
+assign a font to a margin character as follows (see <a class="pxref" href="#Miscellaneous">Miscellaneous</a>).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.mc \f[I]x\f[]
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eftr"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ftr</code></strong> <var class="def-var-arguments">f [<span class="r"><i class="slanted">g</i></span>]</var><a class="copiable-link" href='#index-_002eftr'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ftr"></a>
+<a class="index-entry-id" id="index-font-translation-_0028ftr_0029"></a>
+<a class="index-entry-id" id="index-ft-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-ul-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-bd-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-_005cf_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-cs-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-tkf-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-special-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-fspecial-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-fp-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-sty-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-if-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-ie-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-while-request_002c-and-font-translations"></a>
+<p>Translate font&nbsp;<var class="var">f</var> to font&nbsp;<var class="var">g</var>. Whenever a font
+named&nbsp;<var class="var">f</var> is referred to in a <code class="code">\f</code> escape sequence, in the
+<code class="code">F</code> and <code class="code">S</code> conditional operators, or in the <code class="code">ft</code>,
+<code class="code">ul</code>, <code class="code">bd</code>, <code class="code">cs</code>, <code class="code">tkf</code>, <code class="code">special</code>,
+<code class="code">fspecial</code>, <code class="code">fp</code>, or <code class="code">sty</code> requests, font&nbsp;<var class="var">g</var> is
+used. If <var class="var">g</var> is missing or equal to&nbsp;<var class="var">f</var> the translation is
+undone.
+</p>
+<p>Font translations cannot be chained.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ftr XXX TR
+.ftr XXX YYY
+.ft XXX
+ error&rarr; warning: can't find font 'XXX'
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002efzoom"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.fzoom</code></strong> <var class="def-var-arguments">f [<span class="r"><i class="slanted">zoom</i></span>]</var><a class="copiable-link" href='#index-_002efzoom'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-fzoom"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ezoom_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.zoom]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ezoom_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ezoom"></a>
+<a class="index-entry-id" id="index-magnification-of-a-font-_0028fzoom_0029"></a>
+<a class="index-entry-id" id="index-font_002c-magnification-_0028fzoom_0029"></a>
+<a class="index-entry-id" id="index-zoom-factor-of-a-font-_0028fzoom_0029"></a>
+<a class="index-entry-id" id="index-factor_002c-zoom_002c-of-a-font-_0028fzoom_0029"></a>
+<a class="index-entry-id" id="index-font_002c-zoom-factor-_0028fzoom_0029"></a>
+<a class="index-entry-id" id="index-optical-size-of-a-font"></a>
+<a class="index-entry-id" id="index-font_002c-optical-size"></a>
+<a class="index-entry-id" id="index-size_002c-optical_002c-of-a-font"></a>
+<p>Set magnification of font&nbsp;<var class="var">f</var> to factor <var class="var">zoom</var>, which must
+be a non-negative integer multiple of 1/1000th. This request is useful
+to adjust the optical size of a font in relation to the others. In the
+example below, font <code class="code">CR</code> is magnified by 10% (the zoom factor is
+thus 1.1).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.fam P
+.fzoom CR 1100
+.ps 12
+Palatino and \f[CR]Courier\f[]
+</pre></div></div>
+
+<p>A missing or zero value of <var class="var">zoom</var> is the same as a value of 1000,
+which means no magnification. <var class="var">f</var>&nbsp;must be a resolved font
+name, not an abstract style.
+</p>
+<p>The magnification of a font is completely transparent to GNU
+<code class="code">troff</code>; a change of the zoom factor doesn&rsquo;t cause any effect
+except that the dimensions of glyphs, (word) spaces, kerns, etc., of the
+affected font are adjusted accordingly.
+</p>
+<p>The zoom factor of the current font is available in the read-only
+register &lsquo;<samp class="samp">.zoom</samp>&rsquo;, in multiples of 1/1000th. It returns zero if
+there is no magnification.
+</p></dd></dl>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Font-Families">
+<div class="nav-panel">
+<p>
+Next: <a href="#Font-Positions" accesskey="n" rel="next">Font Positions</a>, Previous: <a href="#Selecting-Fonts" accesskey="p" rel="prev">Selecting Fonts</a>, Up: <a href="#Using-Fonts" accesskey="u" rel="up">Using Fonts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Font-Families-1">5.19.2 Font Families</h4>
+<a class="index-entry-id" id="index-font-families"></a>
+<a class="index-entry-id" id="index-families_002c-font"></a>
+<a class="index-entry-id" id="index-font-styles"></a>
+<a class="index-entry-id" id="index-styles_002c-font"></a>
+
+<p>To accommodate the wide variety of fonts available, GNU <code class="code">troff</code>
+distinguishes <em class="dfn">font families</em> and <em class="dfn">font styles</em>. A resolved
+font name is the catenation of a font family and a style. Selecting an
+abstract style causes GNU <code class="code">troff</code> to combine it with the default
+font family.
+</p>
+<p>You can thus compose a document using abstract styles exclusively for
+its body or running text, selecting a specific family only for titles or
+examples, for instance, and change the default family on the command
+line (recall <a class="ref" href="#Groff-Options">Options</a>).
+</p>
+<p>Fonts for the devices <code class="code">ps</code>, <code class="code">pdf</code>, <code class="code">dvi</code>, <code class="code">lj4</code>,
+<code class="code">lbp</code>, and the X11 devices support this mechanism. By default,
+GNU <code class="code">troff</code> uses the Times family with the four styles &lsquo;<samp class="samp">R</samp>&rsquo;,
+&lsquo;<samp class="samp">I</samp>&rsquo;, &lsquo;<samp class="samp">B</samp>&rsquo;, and &lsquo;<samp class="samp">BI</samp>&rsquo;.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002efam"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.fam</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">family</i></span>]</var><a class="copiable-link" href='#index-_002efam'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-fam"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002efam_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.fam]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002efam_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002efam-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cFf"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\F</code><span class="r"><i class="slanted">f</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cFf'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cF"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cF_0028fm"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\F(</code><span class="r"><i class="slanted">fm</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cF_0028fm'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cF_005bfamily_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\F[</code><span class="r"><i class="slanted">family</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cF_005bfamily_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-changing-font-family-_0028fam_002c-_005cF_0029"></a>
+<a class="index-entry-id" id="index-font-family_002c-changing-_0028fam_002c-_005cF_0029"></a>
+<p>Set the default font family, used in combination with abstract styles to
+construct a resolved font name, to <var class="var">family</var> (one-character
+name&nbsp;<var class="var">f</var>, two-character name <var class="var">fm</var>). If no argument is
+given, GNU <code class="code">troff</code> selects the previous font family; if there none,
+is it falls back to the device&rsquo;s default<a class="footnote" id="DOCF76" href="#FOOT76"><sup>76</sup></a> or its own (&lsquo;<samp class="samp">T</samp>&rsquo;).
+</p>
+<p>The <code class="code">\F</code> escape sequence works similarly. In disanalogy to
+<code class="code">\f</code>, &lsquo;<samp class="samp">\FP</samp>&rsquo; makes &lsquo;<samp class="samp">P</samp>&rsquo; the default family. Use
+&lsquo;<samp class="samp">\F[]</samp>&rsquo; to select the previous default family. The default font
+family is available in the read-only string-valued register <code class="code">.fam</code>;
+it is associated with the environment (see <a class="pxref" href="#Environments">Environments</a>).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">spam, \&quot; startup defaults are T (Times) R (roman)
+.fam H \&quot; make Helvetica the default family
+spam, \&quot; family H + style R = HR
+.ft B \&quot; family H + style B = HB
+spam,
+.ft CR \&quot; Courier roman (default family not changed)
+spam,
+.ft \&quot; back to Helvetica bold
+spam,
+.fam T \&quot; make Times the default family
+spam, \&quot; family T + style B = TB
+.ft AR \&quot; font AR (not a style)
+baked beans,
+.ft R \&quot; family T + style R = TR
+and spam.
+</pre></div></div>
+
+<p><code class="code">\F</code> doesn&rsquo;t produce an input token in GNU <code class="code">troff</code>. As a
+consequence, it can be used in requests like <code class="code">mc</code> (which expects
+a single character as an argument) to change the font family on the fly.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.mc \F[P]x\F[]
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002esty"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.sty</code></strong> <var class="def-var-arguments">n style</var><a class="copiable-link" href='#index-_002esty'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-sty"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002esty_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.sty]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002esty_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002esty-1"></a>
+<a class="index-entry-id" id="index-setting-up-an-abstract-font-style-_0028sty_0029"></a>
+<a class="index-entry-id" id="index-abstract-font-style_002c-setting-up-_0028sty_0029"></a>
+<a class="index-entry-id" id="index-font-style_002c-abstract_002c-setting-up-_0028sty_0029"></a>
+<a class="index-entry-id" id="index-style_002c-font_002c-abstract_002c-setting-up-_0028sty_0029"></a>
+<a class="index-entry-id" id="index-cs-request_002c-and-font-styles"></a>
+<a class="index-entry-id" id="index-bd-request_002c-and-font-styles"></a>
+<a class="index-entry-id" id="index-tkf-request_002c-and-font-styles"></a>
+<a class="index-entry-id" id="index-uf-request_002c-and-font-styles"></a>
+<a class="index-entry-id" id="index-fspecial-request_002c-and-font-styles"></a>
+<p>Associate an abstract style <var class="var">style</var> with mounting
+position&nbsp;<var class="var">n</var>, which must be a non-negative integer. If the
+requests <code class="code">cs</code>, <code class="code">bd</code>, <code class="code">tkf</code>, <code class="code">uf</code>, or <code class="code">fspecial</code>
+are applied to an abstract style, they are instead applied to the member
+of the current family corresponding to that style.
+</p>
+<a class="index-entry-id" id="index-DESC-1"></a>
+<a class="index-entry-id" id="index-styles-1"></a>
+<p>The default family can be set with the <samp class="option">-f</samp> option (see <a class="pxref" href="#Groff-Options">Options</a>). The <code class="code">styles</code> command in the <samp class="file">DESC</samp> file controls
+which font positions (if any) are initially associated with abstract
+styles rather than fonts.
+</p>
+<p><strong class="strong">Caution:</strong> The <var class="var">style</var> argument is not validated.
+Errors may occur later, when the formatter attempts to construct a
+resolved font name, or format a character for output.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr BarPos \n[.fp]
+.sty \n[.fp] Bar
+.fam Foo
+.ft \n[BarPos]
+.tm .f=\n[.f]
+A
+ error&rarr; error: no font family named 'Foo' exists
+ error&rarr; .f=41
+ error&rarr; error: cannot format glyph: no current font
+</pre></div></div>
+
+<p>When an abstract style has been selected, the read-only string-valued
+register &lsquo;<samp class="samp">.sty</samp>&rsquo; interpolates its name; this datum is associated
+with the environment (see <a class="pxref" href="#Environments">Environments</a>). Otherwise, &lsquo;<samp class="samp">.sty</samp>&rsquo;
+interpolates nothing.
+</p></dd></dl>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Font-Positions">
+<div class="nav-panel">
+<p>
+Next: <a href="#Using-Symbols" accesskey="n" rel="next">Using Symbols</a>, Previous: <a href="#Font-Families" accesskey="p" rel="prev">Font Families</a>, Up: <a href="#Using-Fonts" accesskey="u" rel="up">Using Fonts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Font-Positions-1">5.19.3 Font Positions</h4>
+<a class="index-entry-id" id="index-font-positions"></a>
+<a class="index-entry-id" id="index-positions_002c-font"></a>
+
+<p>To support typeface indirection through abstract styles, and for
+compatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>, the formatter maintains
+a list of font <em class="dfn">positions</em> at which fonts required by a document are
+<em class="dfn">mounted</em>. An output device&rsquo;s description file <samp class="file">DESC</samp>
+typically configures a set of pre-mounted fonts; see <a class="ref" href="#Device-and-Font-Description-Files">Device and Font Description Files</a>. A font need not be explicitly mounted before
+it is selected; GNU <code class="code">troff</code> will search <code class="env">GROFF_FONT_PATH</code> for
+it by name and mount it at the first free mounting position on demand.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002efp"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.fp</code></strong> <var class="def-var-arguments">pos id [<span class="r"><i class="slanted">font-description-file-name</i></span>]</var><a class="copiable-link" href='#index-_002efp'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-fp"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ef_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.f]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ef_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ef"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002efp_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.fp]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002efp_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002efp-1"></a>
+<a class="index-entry-id" id="index-mounting-a-font-_0028fp_0029"></a>
+<a class="index-entry-id" id="index-font_002c-mounting-_0028fp_0029"></a>
+<p>Mount a font under the name <var class="var">id</var> at mounting position <var class="var">pos</var>, a
+non-negative integer. When the formatter starts up, it reads the output
+device&rsquo;s description to mount an initial set of faces, and selects font
+position&nbsp;1. Position&nbsp;0 is unused by default. Unless the
+<var class="var">font-description-file-name</var> argument is given, <var class="var">id</var> should be
+the name of a font description file stored in a directory corresponding
+to the selected output device. GNU <code class="code">troff</code> does not traverse
+directories to locate the font description file.
+</p>
+<a class="index-entry-id" id="index-font-aliasing-with-third-argument-to-fp-request"></a>
+<a class="index-entry-id" id="index-aliasing-fonts-with-third-argument-to-fp-request"></a>
+<p>The optional third argument enables font names to be aliased, which can
+be necessary in compatibility mode since AT&amp;T <code class="code">troff</code> syntax
+affords no means of identifying fonts with names longer than two
+characters, like &lsquo;<samp class="samp">TBI</samp>&rsquo; or &lsquo;<samp class="samp">ZCMI</samp>&rsquo;, in a font selection escape
+sequence. See <a class="xref" href="#Compatibility-Mode">Compatibility Mode</a>. You can also alias fonts on
+mounting for convenience or abstraction. (See below regarding the
+<code class="code">.fp</code> register.)
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.fp \n[.fp] SC ZCMI
+Send a \f(SChand-written\fP thank-you note.
+.fp \n[.fp] Emph TI
+.fp \n[.fp] Strong TB
+Are \f[Emph]these names\f[] \f[Strong]comfortable\f[]?
+</pre></div></div>
+
+<p>&lsquo;<samp class="samp">DESC</samp>&rsquo;, &lsquo;<samp class="samp">P</samp>&rsquo;, and non-negative integers are not usable as font
+identifiers.
+</p>
+<a class="index-entry-id" id="index-font-position-register-_0028_002ef_0029"></a>
+<p>The position of the currently selected font (or abstract style) is
+available in the read-only register &lsquo;<samp class="samp">.f</samp>&rsquo;. It is associated with
+the environment (see <a class="pxref" href="#Environments">Environments</a>).
+</p>
+<p>You can copy the value of <code class="code">.f</code> to another register to save it for
+later use.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr saved-font \n[.f]
+<span class="r">&hellip; <i class="i">text involving many font changes</i> &hellip;</span>
+.ft \n[saved-font]
+</pre></div></div>
+
+<a class="index-entry-id" id="index-next-free-font-position-register-_0028_002efp_0029"></a>
+<p>The index of the next (non-zero) free font position is available in the
+read-only register &lsquo;<samp class="samp">.fp</samp>&rsquo;.
+<a class="index-entry-id" id="index-DESC-file_002c-and-font-mounting"></a>
+Fonts not listed in the <samp class="file">DESC</samp> file are automatically mounted at
+position &lsquo;<samp class="samp">\n[.fp]</samp>&rsquo; when selected with the <code class="code">ft</code> request or
+<code class="code">\f</code> escape sequence. When mounting a font at a position
+explicitly with the <code class="code">fp</code> request, this same practice should be
+followed, although GNU <code class="code">troff</code> does not enforce this strictly.
+</p></dd></dl>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Using-Symbols">
+<div class="nav-panel">
+<p>
+Next: <a href="#Character-Classes" accesskey="n" rel="next">Character Classes</a>, Previous: <a href="#Font-Positions" accesskey="p" rel="prev">Font Positions</a>, Up: <a href="#Using-Fonts" accesskey="u" rel="up">Using Fonts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Using-Symbols-1">5.19.4 Using Symbols</h4>
+<a class="index-entry-id" id="index-using-symbols"></a>
+<a class="index-entry-id" id="index-symbols_002c-using"></a>
+
+<a class="index-entry-id" id="index-glyph"></a>
+<a class="index-entry-id" id="index-character"></a>
+<a class="index-entry-id" id="index-glyph_002c-distinguished-from-character"></a>
+<a class="index-entry-id" id="index-character_002c-distinguished-from-glyph"></a>
+<a class="index-entry-id" id="index-ligature"></a>
+<p>A <em class="dfn">glyph</em> is a graphical representation of a <em class="dfn">character</em>. While
+a character is an abstraction of semantic information, a glyph is
+something that can be seen on screen or paper. A character has many
+possible representation forms (for example, the character &lsquo;A&rsquo; can be
+written in an upright or slanted typeface, producing distinct
+glyphs). Sometimes, a sequence of characters map to a single glyph:
+this is a <em class="dfn">ligature</em>&mdash;the most common is &lsquo;fi&rsquo;.
+</p>
+<p>Space characters never become glyphs in GNU <code class="code">troff</code>. If not
+discarded (as when trailing on text lines), they are represented by
+horizontal motions in the output.
+</p>
+<a class="index-entry-id" id="index-symbol"></a>
+<a class="index-entry-id" id="index-special-fonts"></a>
+<a class="index-entry-id" id="index-fonts"></a>
+<a class="index-entry-id" id="index-DESC-2"></a>
+<a class="index-entry-id" id="index-special-request_002c-and-glyph-search-order"></a>
+<a class="index-entry-id" id="index-fspecial-request_002c-and-glyph-search-order"></a>
+<p>A <em class="dfn">symbol</em> is simply a named glyph. Within <code class="code">gtroff</code>, all glyph
+names of a particular font are defined in its font file. If the user
+requests a glyph not available in this font, <code class="code">gtroff</code> looks up an
+ordered list of <em class="dfn">special fonts</em>. By default, the PostScript output
+device supports the two special fonts &lsquo;<samp class="samp">SS</samp>&rsquo; (slanted symbols) and
+&lsquo;<samp class="samp">S</samp>&rsquo; (symbols) (the former is looked up before the latter). Other
+output devices use different names for special fonts. Fonts mounted
+with the <code class="code">fonts</code> keyword in the <samp class="file">DESC</samp> file are globally
+available. To install additional special fonts locally (i.e., for a
+particular font), use the <code class="code">fspecial</code> request.
+</p>
+<p>Here are the exact rules how <code class="code">gtroff</code> searches a given symbol:
+</p>
+<ul class="itemize mark-bullet">
+<li>If the symbol has been defined with the <code class="code">char</code> request, use it.
+This hides a symbol with the same name in the current font.
+
+</li><li>Check the current font.
+
+</li><li>If the symbol has been defined with the <code class="code">fchar</code> request, use it.
+
+</li><li>Check whether the current font has a font-specific list of special
+fonts; test all fonts in the order of appearance in the last
+<code class="code">fspecial</code> call if appropriate.
+
+</li><li>If the symbol has been defined with the <code class="code">fschar</code> request for the
+current font, use it.
+
+</li><li>Check all fonts in the order of appearance in the last <code class="code">special</code>
+call.
+
+</li><li>If the symbol has been defined with the <code class="code">schar</code> request, use it.
+
+</li><li>As a last resort, consult all fonts loaded up to now for special fonts
+and check them, starting with the lowest font number. This can
+sometimes lead to surprising results since the <code class="code">fonts</code> line in
+the <samp class="file">DESC</samp> file often contains empty positions, which are filled
+later on. For example, consider the following:
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">fonts 3 0 0 FOO
+</pre></div></div>
+
+<p>This mounts font <code class="code">foo</code> at font position&nbsp;3. We assume that
+<code class="code">FOO</code> is a special font, containing glyph <code class="code">foo</code>, and that no
+font has been loaded yet. The line
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.fspecial BAR BAZ
+</pre></div></div>
+
+<p>makes font <code class="code">BAZ</code> special only if font <code class="code">BAR</code> is active. We
+further assume that <code class="code">BAZ</code> is really a special font, i.e., the font
+description file contains the <code class="code">special</code> keyword, and that it also
+contains glyph <code class="code">foo</code> with a special shape fitting to font
+<code class="code">BAR</code>. After executing <code class="code">fspecial</code>, font <code class="code">BAR</code> is loaded
+at font position&nbsp;1, and <code class="code">BAZ</code> at position&nbsp;2.
+</p>
+<p>We now switch to a new font <code class="code">XXX</code>, trying to access glyph
+<code class="code">foo</code> that is assumed to be missing. There are neither
+font-specific special fonts for <code class="code">XXX</code> nor any other fonts made
+special with the <code class="code">special</code> request, so <code class="code">gtroff</code> starts the
+search for special fonts in the list of already mounted fonts, with
+increasing font positions. Consequently, it finds <code class="code">BAZ</code> before
+<code class="code">FOO</code> even for <code class="code">XXX</code>, which is not the intended behaviour.
+</p></li></ul>
+
+<p>See <a class="xref" href="#Device-and-Font-Description-Files">Device and Font Description Files</a>, and <a class="ref" href="#Special-Fonts">Special Fonts</a>, for
+more details.
+</p>
+<a class="index-entry-id" id="index-list-of-special-characters-_0028groff_005fchar_00287_0029-man-page_0029"></a>
+<a class="index-entry-id" id="index-special-characters_002c-list-of-_0028groff_005fchar_00287_0029-man-page_0029"></a>
+<a class="index-entry-id" id="index-characters_002c-special_002c-list-of-_0028groff_005fchar_00287_0029-man-page_0029"></a>
+<a class="index-entry-id" id="index-available-glyphs_002c-list-of-_0028groff_005fchar_00287_0029-man-page_0029"></a>
+<a class="index-entry-id" id="index-glyphs_002c-available_002c-list-of-_0028groff_005fchar_00287_0029-man-page_0029"></a>
+<p>The <cite class="cite">groff_char<span class="r">(7)</span></cite> man page houses a complete list of
+predefined special character names, but the availability of any as a
+glyph is device- and font-dependent. For example, say
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">man -Tdvi groff_char &gt; groff_char.dvi
+</pre></div></div>
+
+<p>to obtain those available with the DVI device and default font
+configuration.<a class="footnote" id="DOCF77" href="#FOOT77"><sup>77</sup></a> If you want to use an additional macro package to change
+the fonts used, <code class="code">groff</code> (or <code class="code">gtroff</code>) must be run directly.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">groff -Tdvi -mec -man groff_char.7 &gt; groff_char.dvi
+</pre></div></div>
+
+<a class="index-entry-id" id="index-composite-glyph-names"></a>
+<a class="index-entry-id" id="index-glyph-names_002c-composite"></a>
+<a class="index-entry-id" id="index-groff-glyph-list-_0028GGL_0029"></a>
+<a class="index-entry-id" id="index-GGL-_0028groff-glyph-list_0029"></a>
+<a class="index-entry-id" id="index-Adobe-Glyph-List-_0028AGL_0029"></a>
+<p>Special character names not listed in <cite class="cite">groff_char<span class="r">(7)</span></cite> are
+derived algorithmically, using a simplified version of the Adobe Glyph
+List (AGL) algorithm, which is described in
+<a class="uref" href="https://github.com/adobe-type-tools/agl-aglfn">https://github.com/adobe-type-tools/agl-aglfn</a>. The (frozen)
+set of names that can&rsquo;t be derived algorithmically is called the
+<em class="dfn"><code class="code">groff</code> glyph list (GGL)</em>.
+</p>
+<ul class="itemize mark-bullet">
+<li>A glyph for Unicode character U+<var class="var">XXXX</var>[<var class="var">X</var>[<var class="var">X</var>]], which is
+not a composite character is named
+<code class="code">u<var class="var">XXXX</var><span class="r">[</span><var class="var">X</var><span class="r">[</span><var class="var">X</var><span class="r">]]</span></code>. <var class="var">X</var> must be an
+uppercase hexadecimal digit. Examples: <code class="code">u1234</code>, <code class="code">u008E</code>,
+<code class="code">u12DB8</code>. The largest Unicode value is 0x10FFFF. There must be at
+least four <code class="code">X</code> digits; if necessary, add leading zeroes (after the
+&lsquo;<samp class="samp">u</samp>&rsquo;). No zero padding is allowed for character codes greater than
+0xFFFF. Surrogates (i.e., Unicode values greater than 0xFFFF
+represented with character codes from the surrogate area U+D800-U+DFFF)
+are not allowed either.
+
+</li><li>A glyph representing more than a single input character is named
+
+<div class="display">
+<pre class="display-preformatted">&lsquo;<samp class="samp">u</samp>&rsquo; <var class="var">component1</var> &lsquo;<samp class="samp">_</samp>&rsquo; <var class="var">component2</var> &lsquo;<samp class="samp">_</samp>&rsquo; <var class="var">component3</var> &hellip;
+</pre></div>
+
+<p>Example: <code class="code">u0045_0302_0301</code>.
+</p>
+<p>For simplicity, all Unicode characters that are composites must be
+maximally decomposed to NFD;<a class="footnote" id="DOCF78" href="#FOOT78"><sup>78</sup></a> for example,
+<code class="code">u00CA_0301</code> is not a valid glyph name since U+00CA (<small class="sc">LATIN
+CAPITAL LETTER E WITH CIRCUMFLEX</small>) can be further decomposed into U+0045
+(<small class="sc">LATIN CAPITAL LETTER E</small>) and U+0302 (<small class="sc">COMBINING CIRCUMFLEX
+ACCENT</small>). <code class="code">u0045_0302_0301</code> is thus the glyph name for U+1EBE,
+<small class="sc">LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE</small>.
+</p>
+</li><li>groff maintains a table to decompose all algorithmically derived glyph
+names that are composites itself. For example, <code class="code">u0100</code> (<small class="sc">LATIN
+LETTER A WITH MACRON</small>) is automatically decomposed into
+<code class="code">u0041_0304</code>. Additionally, a glyph name of the GGL is preferred
+to an algorithmically derived glyph name; <code class="code">groff</code> also
+automatically does the mapping. Example: The glyph <code class="code">u0045_0302</code> is
+mapped to <code class="code">^E</code>.
+
+</li><li>glyph names of the GGL can&rsquo;t be used in composite glyph names; for
+example, <code class="code">^E_u0301</code> is invalid.
+</li></ul>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0028nm"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\(</code><span class="r"><i class="slanted">nm</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0028nm'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_005bname_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\[</code><span class="r"><i class="slanted">name</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005c_005bname_005d'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005c_005bbase_002dglyph-combining_002dcomponent-_2026_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\[</code><span class="r"><i class="slanted">base-glyph combining-component &hellip;</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005c_005bbase_002dglyph-combining_002dcomponent-_2026_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0028"></a>
+<a class="index-entry-id" id="index-_005c_005b"></a>
+<p>Typeset a special character <var class="var">name</var> (two-character name <var class="var">nm</var>) or
+a composite glyph consisting of <var class="var">base-glyph</var> overlaid with one or
+more <var class="var">combining-component</var>s. For example, &lsquo;<samp class="samp">\[A ho]</samp>&rsquo; is a
+capital letter &ldquo;A&rdquo; with a &ldquo;hook accent&rdquo; (ogonek).
+</p>
+<p>There is no special syntax for one-character names&mdash;the analogous form
+&lsquo;<samp class="samp">\<var class="var">n</var></samp>&rsquo; would collide with other escape sequences. However, the
+four escape sequences <code class="code">\'</code>, <code class="code">\-</code>, <code class="code">\_</code>, and <code class="code">\`</code>,
+are translated on input to the special character escape sequences
+<code class="code">\[aa]</code>, <code class="code">\[-]</code>, <code class="code">\[ul]</code>, and <code class="code">\[ga]</code>, respectively.
+</p>
+<p>A special character name of length one is not the same thing as an
+ordinary character: that is, the character <code class="code">a</code> is not the same as
+<code class="code">\[a]</code>.
+</p>
+<p>If <var class="var">name</var> is undefined, a warning in category &lsquo;<samp class="samp">char</samp>&rsquo; is
+produced and the escape is ignored. See <a class="xref" href="#Warnings">Warnings</a>, for information
+about the enablement and suppression of warnings.
+</p>
+<p>GNU <code class="code">troff</code> resolves <code class="code">\[<span class="r">&hellip;</span>]</code> with more than a single
+component as follows:
+</p>
+<ul class="itemize mark-bullet">
+<li>Any component that is found in the GGL is converted to the
+<code class="code">u<var class="var">XXXX</var></code> form.
+
+</li><li>Any component <code class="code">u<var class="var">XXXX</var></code> that is found in the list of
+decomposable glyphs is decomposed.
+
+</li><li>The resulting elements are then concatenated with &lsquo;<samp class="samp">_</samp>&rsquo; in between,
+dropping the leading &lsquo;<samp class="samp">u</samp>&rsquo; in all elements but the first.
+</li></ul>
+
+<p>No check for the existence of any component (similar to <code class="code">tr</code>
+request) is done.
+</p>
+<p>Examples:
+</p>
+<dl class="table">
+<dt><code class="code">\[A ho]</code></dt>
+<dd><p>&lsquo;<samp class="samp">A</samp>&rsquo; maps to <code class="code">u0041</code>, &lsquo;<samp class="samp">ho</samp>&rsquo; maps to <code class="code">u02DB</code>, thus the
+final glyph name would be <code class="code">u0041_02DB</code>. This is not the expected
+result: the ogonek glyph &lsquo;<samp class="samp">ho</samp>&rsquo; is a spacing ogonek, but for a
+proper composite a non-spacing ogonek (U+0328) is necessary. Looking
+into the file <samp class="file">composite.tmac</samp>, one can find &lsquo;<samp class="samp">.composite&nbsp;ho&nbsp;u0328</samp>&rsquo;<!-- /@w -->, which changes the mapping of &lsquo;<samp class="samp">ho</samp>&rsquo; while a composite glyph
+name is constructed, causing the final glyph name to be
+<code class="code">u0041_0328</code>.
+</p>
+</dd>
+<dt><code class="code">\[^E u0301]</code></dt>
+<dt><code class="code">\[^E aa]</code></dt>
+<dt><code class="code">\[E a^ aa]</code></dt>
+<dt><code class="code">\[E ^ <code class="code">'</code>]</code></dt>
+<dd><p>&lsquo;<samp class="samp">^E</samp>&rsquo; maps to <code class="code">u0045_0302</code>, thus the final glyph name is
+<code class="code">u0045_0302_0301</code> in all forms (assuming proper calls of the
+<code class="code">composite</code> request).
+</p></dd>
+</dl>
+
+<p>It is not possible to define glyphs with names like &lsquo;<samp class="samp">A&nbsp;ho</samp>&rsquo;<!-- /@w -->
+within a <code class="code">groff</code> font file. This is not really a limitation;
+instead, you have to define <code class="code">u0041_0328</code>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cC_0027xxx_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\C<code class="code">'</code></code><span class="r"><i class="slanted">xxx</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cC_0027xxx_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cC"></a>
+<a class="index-entry-id" id="index-named-character-_0028_005cC_0029"></a>
+<a class="index-entry-id" id="index-character_002c-named-_0028_005cC_0029"></a>
+<p>Typeset the glyph of the special character <var class="var">xxx</var>. Normally, it is
+more convenient to use <code class="code">\[<var class="var">xxx</var>]</code>, but <code class="code">\C</code> has some
+advantages: it is compatible with <abbr class="acronym">AT&amp;T</abbr> device-independent
+<code class="code">troff</code> (and therefore available in compatibility
+mode<a class="footnote" id="DOCF79" href="#FOOT79"><sup>79</sup></a>) and can interpolate special
+characters with &lsquo;<samp class="samp">]</samp>&rsquo; in their names. The delimiter need not be
+a neutral apostrophe; see <a class="ref" href="#Delimiters">Delimiters</a>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ecomposite"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.composite</code></strong> <var class="def-var-arguments">id1 id2</var><a class="copiable-link" href='#index-_002ecomposite'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-composite"></a>
+<a class="index-entry-id" id="index-composite_002etmac"></a>
+<p>Map special character name <var class="var">id1</var> to <var class="var">id2</var> if <var class="var">id1</var> is used
+in <code class="code">\[...]</code> with more than one component. See above for examples.
+This is a strict rewriting of the special character name; no check is
+performed for the existence of a glyph for either. A set of default
+mappings for many accents can be found in the file
+<samp class="file">composite.tmac</samp>, loaded by the default <samp class="file">troffrc</samp> at startup.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cN_0027n_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\N<code class="code">'</code></code><span class="r"><i class="slanted">n</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cN_0027n_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cN"></a>
+<a class="index-entry-id" id="index-numbered-glyph-_0028_005cN_0029-1"></a>
+<a class="index-entry-id" id="index-glyph_002c-numbered-_0028_005cN_0029-1"></a>
+<a class="index-entry-id" id="index-char-request_002c-used-with-_005cN"></a>
+<a class="index-entry-id" id="index-Unicode-1"></a>
+<p>Typeset the glyph with code&nbsp;<var class="var">n</var> in the current font
+(<code class="code">n</code>&nbsp;is <em class="emph">not</em> the input character code). The number
+<var class="var">n</var>&nbsp;can be any non-negative decimal integer. Most devices only
+have glyphs with codes between 0 and&nbsp;255; the Unicode output device
+uses codes in the range 0&ndash;65535. If the current font does not contain
+a glyph with that code, special fonts are <em class="emph">not</em> searched. The
+<code class="code">\N</code> escape sequence can be conveniently used in conjunction with
+the <code class="code">char</code> request:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.char \[phone] \f[ZD]\N'37'
+</pre></div></div>
+
+<a class="index-entry-id" id="index-DESC-3"></a>
+<a class="index-entry-id" id="index-unnamed-glyphs"></a>
+<a class="index-entry-id" id="index-glyphs_002c-unnamed"></a>
+<p>The code of each glyph is given in the fourth column in the font
+description file after the <code class="code">charset</code> command. It is possible to
+include unnamed glyphs in the font description file by using a name of
+&lsquo;<samp class="samp">---</samp>&rsquo;; the <code class="code">\N</code> escape sequence is the only way to use these.
+</p>
+<p>No kerning is applied to glyphs accessed with <code class="code">\N</code>. The delimiter
+need not be a neutral apostrophe; see <a class="ref" href="#Delimiters">Delimiters</a>.
+</p></dd></dl>
+
+<p>A few escape sequences are also special characters.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0027-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\<code class="code">'</code></code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0027-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0027"></a>
+<p>An escaped neutral apostrophe is a synonym for <code class="code">\[aa]</code> (acute
+accent).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0060-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\<code class="code">`</code></code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0060-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0060"></a>
+<p>An escaped grave accent is a synonym for <code class="code">\[ga]</code> (grave accent).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002d-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\-</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_002d-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_002d"></a>
+<p>An escaped hyphen-minus is a synonym for <code class="code">\[-]</code> (minus sign).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_005f-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\_</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_005f-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_005f"></a>
+<p>An escaped underscore (&ldquo;low line&rdquo;) is a synonym for <code class="code">\[ul]</code>
+(underrule). On typesetting devices, the underrule is font-invariant
+and drawn lower than the underscore &lsquo;<samp class="samp">_</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ecflags"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.cflags</code></strong> <var class="def-var-arguments">n c1 c2 &hellip;</var><a class="copiable-link" href='#index-_002ecflags'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-cflags"></a>
+<a class="index-entry-id" id="index-glyph-properties-_0028cflags_0029"></a>
+<a class="index-entry-id" id="index-character-properties-_0028cflags_0029"></a>
+<a class="index-entry-id" id="index-properties-of-glyphs-_0028cflags_0029"></a>
+<a class="index-entry-id" id="index-properties-of-characters-_0028cflags_0029"></a>
+<p>Assign properties encoded by the number <var class="var">n</var> to characters <var class="var">c1</var>,
+<var class="var">c2</var>, and so on.
+</p>
+<p>Input characters, including special characters introduced by an escape,
+have certain properties associated with them.<a class="footnote" id="DOCF80" href="#FOOT80"><sup>80</sup></a>
+These properties can be modified with this request. The first argument
+is the sum of the desired flags and the remaining arguments are the
+characters to be assigned those properties. Spaces between the <var class="var">cn</var>
+arguments are optional. Any argument <var class="var">cn</var> can be a character class
+defined with the <code class="code">class</code> request rather than an individual
+character. See <a class="xref" href="#Character-Classes">Character Classes</a>.
+</p>
+<p>The non-negative integer <var class="var">n</var> is the sum of any of the following.
+Some combinations are nonsensical, such as &lsquo;<samp class="samp">33</samp>&rsquo; (1 + 32).
+</p>
+<dl class="table">
+<dt id='index-end_002dof_002dsentence-characters-1'><span><code class="code">1</code><a class="copiable-link" href='#index-end_002dof_002dsentence-characters-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-characters_002c-end_002dof_002dsentence"></a>
+<p>Recognize the character as ending a sentence if followed by a newline
+or two spaces. Initially, characters &lsquo;<samp class="samp">.?!</samp>&rsquo; have this property.
+</p>
+</dd>
+<dt id='index-hyphenating-characters'><span><code class="code">2</code><a class="copiable-link" href='#index-hyphenating-characters'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-characters_002c-hyphenation"></a>
+<p>Enable breaks before the character. A line is not broken at a character
+with this property unless the characters on each side both have non-zero
+hyphenation codes. This exception can be overridden by adding 64.
+Initially, no characters have this property.
+</p>
+</dd>
+<dt id='index-_005c_002d-glyph_002c-and-cflags'><span><code class="code">4</code><a class="copiable-link" href='#index-_005c_002d-glyph_002c-and-cflags'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hy-glyph_002c-and-cflags"></a>
+<a class="index-entry-id" id="index-em-glyph_002c-and-cflags"></a>
+<p>Enable breaks after the character. A line is not broken at a character
+with this property unless the characters on each side both have non-zero
+hyphenation codes. This exception can be overridden by adding 64.
+Initially, characters &lsquo;<samp class="samp">\-\[hy]\[em]</samp>&rsquo; have this property.
+</p>
+</dd>
+<dt id='index-overlapping-characters'><span><code class="code">8</code><a class="copiable-link" href='#index-overlapping-characters'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-characters_002c-overlapping"></a>
+<a class="index-entry-id" id="index-ul-glyph_002c-and-cflags"></a>
+<a class="index-entry-id" id="index-rn-glyph_002c-and-cflags"></a>
+<a class="index-entry-id" id="index-ru-glyph_002c-and-cflags"></a>
+<a class="index-entry-id" id="index-radicalex-glyph_002c-and-cflags"></a>
+<a class="index-entry-id" id="index-sqrtex-glyph_002c-and-cflags"></a>
+<p>Mark the glyph associated with this character as overlapping other
+instances of itself horizontally. Initially, characters
+&lsquo;<samp class="samp">\[ul]\[rn]\[ru]\[radicalex]\[sqrtex]</samp>&rsquo; have this property.
+</p>
+</dd>
+<dt id='index-br-glyph_002c-and-cflags'><span><code class="code">16</code><a class="copiable-link" href='#index-br-glyph_002c-and-cflags'> &para;</a></span></dt>
+<dd><p>Mark the glyph associated with this character as overlapping other
+instances of itself vertically. Initially, the character &lsquo;<samp class="samp">\[br]</samp>&rsquo;
+has this property.
+</p>
+</dd>
+<dt id='index-transparent-characters'><span><code class="code">32</code><a class="copiable-link" href='#index-transparent-characters'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-character_002c-transparent"></a>
+<a class="index-entry-id" id="index-_0022_002c-at-end-of-sentence-1"></a>
+<a class="index-entry-id" id="index-_0027_002c-at-end-of-sentence-1"></a>
+<a class="index-entry-id" id="index-_0029_002c-at-end-of-sentence-1"></a>
+<a class="index-entry-id" id="index-_005d_002c-at-end-of-sentence-1"></a>
+<a class="index-entry-id" id="index-_002a_002c-at-end-of-sentence-1"></a>
+<a class="index-entry-id" id="index-dg-glyph_002c-at-end-of-sentence-1"></a>
+<a class="index-entry-id" id="index-dd-glyph_002c-at-end-of-sentence-1"></a>
+<a class="index-entry-id" id="index-rq-glyph_002c-at-end-of-sentence-1"></a>
+<a class="index-entry-id" id="index-cq-glyph_002c-at-end-of-sentence-1"></a>
+<p>Mark the character as transparent for the purpose of end-of-sentence
+recognition. In other words, an end-of-sentence character followed by
+any number of characters with this property is treated as the end of a
+sentence if followed by a newline or two spaces. This is the same as
+having a zero space factor in TeX. Initially, characters
+&lsquo;<samp class="samp">&quot;')]*\[dg]\[dd]\[rq]\[cq]</samp>&rsquo; have this property.
+</p>
+</dd>
+<dt><code class="code">64</code></dt>
+<dd><p>Ignore hyphenation codes of the surrounding characters. Use this in
+combination with values 2 and&nbsp;4 (initially, no characters have this
+property).
+</p>
+<p>For example, if you need an automatic break point after the en-dash in
+numeric ranges like &ldquo;3000&ndash;5000&rdquo;, insert
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.cflags 68 \[en]
+</pre></div></div>
+
+<p>into your document. However, this practice can lead to bad layout if
+done thoughtlessly; in most situations, a better solution instead of
+changing the <code class="code">cflags</code> value is to insert <code class="code">\:</code> right after the
+hyphen at the places that really need a break point.
+</p></dd>
+</dl>
+
+<p>The remaining values were implemented for East Asian language support;
+those who use alphabetic scripts exclusively can disregard them.
+</p>
+<dl class="table">
+<dt><code class="code">128</code></dt>
+<dd><p>Prohibit a line break before the character, but allow a line break after
+the character. This works only in combination with flags 256 and 512
+and has no effect otherwise. Initially, no characters have this
+property.
+</p>
+</dd>
+<dt><code class="code">256</code></dt>
+<dd><p>Prohibit a line break after the character, but allow a line break before
+the character. This works only in combination with flags 128 and 512
+and has no effect otherwise. Initially, no characters have this
+property.
+</p>
+</dd>
+<dt><code class="code">512</code></dt>
+<dd><p>Allow line break before or after the character. This works only in
+combination with flags 128 and 256 and has no effect otherwise.
+Initially, no characters have this property.
+</p></dd>
+</dl>
+
+<p>In contrast to values 2 and&nbsp;4, the values 128, 256, and 512 work
+pairwise. If, for example, the left character has value 512, and the
+right character 128, no break will be automatically inserted between
+them. If we use value&nbsp;6 instead for the left character, a break
+after the character can&rsquo;t be suppressed since the neighboring character
+on the right doesn&rsquo;t get examined.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002echar"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.char</code></strong> <var class="def-var-arguments">c [<span class="r"><i class="slanted">contents</i></span>]</var><a class="copiable-link" href='#index-_002echar'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-char"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002efchar"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.fchar</code></strong> <var class="def-var-arguments">c [<span class="r"><i class="slanted">contents</i></span>]</var><a class="copiable-link" href='#index-_002efchar'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-fchar"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002efschar"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.fschar</code></strong> <var class="def-var-arguments">f c [<span class="r"><i class="slanted">contents</i></span>]</var><a class="copiable-link" href='#index-_002efschar'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-fschar"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eschar"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.schar</code></strong> <var class="def-var-arguments">c [<span class="r"><i class="slanted">contents</i></span>]</var><a class="copiable-link" href='#index-_002eschar'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-schar"></a>
+<a class="index-entry-id" id="index-defining-character-_0028char_0029"></a>
+<a class="index-entry-id" id="index-defining-fallback-character-_0028fchar_002c-fschar_002c-schar_0029"></a>
+<a class="index-entry-id" id="index-character_002c-defining-_0028char_0029"></a>
+<a class="index-entry-id" id="index-character_002c-defining-fallback-_0028fchar_002c-fschar_002c-schar_0029"></a>
+<a class="index-entry-id" id="index-fallback-character_002c-defining-_0028fchar_002c-fschar_002c-schar_0029"></a>
+<a class="index-entry-id" id="index-creating-new-characters-_0028char_0029"></a>
+<a class="index-entry-id" id="index-defining-symbol-_0028char_0029"></a>
+<a class="index-entry-id" id="index-symbol_002c-defining-_0028char_0029"></a>
+<a class="index-entry-id" id="index-defining-glyph-_0028char_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-defining-_0028char_0029"></a>
+<a class="index-entry-id" id="index-escape-character_002c-while-defining-glyph"></a>
+<a class="index-entry-id" id="index-character_002c-escape_002c-while-defining-glyph"></a>
+<a class="index-entry-id" id="index-tr-request_002c-and-glyph-definitions"></a>
+<a class="index-entry-id" id="index-cp-request_002c-and-glyph-definitions"></a>
+<a class="index-entry-id" id="index-rc-request_002c-and-glyph-definitions"></a>
+<a class="index-entry-id" id="index-lc-request_002c-and-glyph-definitions"></a>
+<a class="index-entry-id" id="index-_005cl_002c-and-glyph-definitions"></a>
+<a class="index-entry-id" id="index-_005cL_002c-and-glyph-definitions"></a>
+<a class="index-entry-id" id="index-_005c_0026_002c-and-glyph-definitions"></a>
+<a class="index-entry-id" id="index-_005ce_002c-and-glyph-definitions"></a>
+<a class="index-entry-id" id="index-hcode-request_002c-and-glyph-definitions"></a>
+<p>Define a new character or glyph&nbsp;<var class="var">c</var> to be <var class="var">contents</var>, which
+can be empty. More precisely, <code class="code">char</code> defines a <code class="code">groff</code> object
+(or redefines an existing one) that is accessed with the
+name&nbsp;<var class="var">c</var> on input, and produces <var class="var">contents</var> on output.
+Every time glyph&nbsp;<var class="var">c</var> needs to be printed, <var class="var">contents</var> is
+processed in a temporary environment and the result is wrapped up into a
+single object. Compatibility mode is turned off and the escape
+character is set to&nbsp;<code class="code">\</code> while <var class="var">contents</var> is processed.
+Any emboldening, constant spacing, or track kerning is applied to this
+object rather than to individual glyphs in <var class="var">contents</var>.
+</p>
+<p>An object defined by these requests can be used just like a normal glyph
+provided by the output device. In particular, other characters can be
+translated to it with the <code class="code">tr</code> or <code class="code">trin</code> requests; it can be
+made the leader character with the <code class="code">lc</code> request; repeated patterns
+can be drawn with it using the <code class="code">\l</code> and <code class="code">\L</code> escape sequences;
+and words containing&nbsp;<var class="var">c</var> can be hyphenated correctly if the
+<code class="code">hcode</code> request is used to give the object a hyphenation code.
+</p>
+<p>There is a special anti-recursion feature: use of the object within its
+own definition is handled like a normal character (not
+defined with <code class="code">char</code>).
+</p>
+<p>The <code class="code">tr</code> and <code class="code">trin</code> requests take precedence if <code class="code">char</code>
+accesses the same symbol.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.tr XY
+X
+ &rArr; Y
+.char X Z
+X
+ &rArr; Y
+.tr XX
+X
+ &rArr; Z
+</pre></div></div>
+
+<p>The <code class="code">fchar</code> request defines a fallback glyph: <code class="code">gtroff</code> only
+checks for glyphs defined with <code class="code">fchar</code> if it cannot find the glyph
+in the current font. <code class="code">gtroff</code> carries out this test before
+checking special fonts.
+</p>
+<p><code class="code">fschar</code> defines a fallback glyph for font&nbsp;<var class="var">f</var>:
+<code class="code">gtroff</code> checks for glyphs defined with <code class="code">fschar</code> after the
+list of fonts declared as font-specific special fonts with the
+<code class="code">fspecial</code> request, but before the list of fonts declared as global
+special fonts with the <code class="code">special</code> request.
+</p>
+<p>Finally, the <code class="code">schar</code> request defines a global fallback glyph:
+<code class="code">gtroff</code> checks for glyphs defined with <code class="code">schar</code> after the list
+of fonts declared as global special fonts with the <code class="code">special</code>
+request, but before the already mounted special fonts.
+</p>
+<p>See <a class="xref" href="#Character-Classes">Character Classes</a>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002erchar"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.rchar</code></strong> <var class="def-var-arguments">c &hellip;</var><a class="copiable-link" href='#index-_002erchar'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rchar"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002erfschar"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.rfschar</code></strong> <var class="def-var-arguments">f c &hellip;</var><a class="copiable-link" href='#index-_002erfschar'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rfschar"></a>
+<a class="index-entry-id" id="index-removing-glyph-definition-_0028rchar_002c-rfschar_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-removing-definition-_0028rchar_002c-rfschar_0029"></a>
+<a class="index-entry-id" id="index-fallback-glyph_002c-removing-definition-_0028rchar_002c-rfschar_0029"></a>
+<p>Remove definition of each ordinary or special character <var class="var">c</var>,
+undoing the effect of a <code class="code">char</code>, <code class="code">fchar</code>, or <code class="code">schar</code>
+request. Those supplied by font description files cannot be removed.
+Spaces and tabs may separate <var class="var">c</var>&nbsp;arguments.
+</p>
+<p>The request <code class="code">rfschar</code> removes glyph definitions defined with
+<code class="code">fschar</code> for font&nbsp;<var class="var">f</var>.
+</p></dd></dl>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Character-Classes">
+<div class="nav-panel">
+<p>
+Next: <a href="#Special-Fonts" accesskey="n" rel="next">Special Fonts</a>, Previous: <a href="#Using-Symbols" accesskey="p" rel="prev">Using Symbols</a>, Up: <a href="#Using-Fonts" accesskey="u" rel="up">Using Fonts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Character-Classes-1">5.19.5 Character Classes</h4>
+<a class="index-entry-id" id="index-character-classes"></a>
+<a class="index-entry-id" id="index-classes_002c-character"></a>
+
+<p>Classes are particularly useful for East Asian languages such as
+Chinese, Japanese, and Korean, where the number of needed characters is
+much larger than in European languages, and where large sets of
+characters share the same properties.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eclass"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.class</code></strong> <var class="def-var-arguments">name c1 c2 &hellip;</var><a class="copiable-link" href='#index-_002eclass'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-class"></a>
+<a class="index-entry-id" id="index-character-class-_0028class_0029"></a>
+<a class="index-entry-id" id="index-defining-character-class-_0028class_0029"></a>
+<a class="index-entry-id" id="index-class-of-characters-_0028class_0029"></a>
+<p>Define a character class (or simply &ldquo;class&rdquo;) <var class="var">name</var> comprising
+the characters <var class="var">c1</var>, <var class="var">c2</var>, and so on.
+</p>
+<p>A class thus defined can then be referred to in lieu of listing all the
+characters within it. Currently, only the <code class="code">cflags</code> request can
+handle references to character classes.
+</p>
+<p>In the request&rsquo;s simplest form, each <var class="var">cn</var> is a character (or special
+character).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.class [quotes] ' \[aq] \[dq] \[oq] \[cq] \[lq] \[rq]
+</pre></div></div>
+
+<p>Since class and glyph names share the same name space, it is recommended
+to start and end the class name with <code class="code">[</code> and <code class="code">]</code>,
+respectively, to avoid collisions with existing character names defined
+by GNU <code class="code">troff</code> or the user (with <code class="code">char</code> and related requests).
+This practice applies the presence of <code class="code">]</code> in the class name to
+prevent the use of the special character escape form
+<code class="code">\[<span class="r">&hellip;</span>]</code>, thus you must use the <code class="code">\C</code> escape to access
+a class with such a name.
+</p>
+<a class="index-entry-id" id="index-GGL-_0028groff-glyph-list_0029-1"></a>
+<a class="index-entry-id" id="index-groff-glyph-list-_0028GGL_0029-1"></a>
+<p>You can also use a character range notation consisting of a
+start character followed by &lsquo;<samp class="samp">-</samp>&rsquo; and then an end character.
+Internally, GNU <code class="code">troff</code> converts these two symbol names to
+Unicode code points (according to the <code class="code">groff</code> glyph list [GGL]),
+which then give the start and end value of the range. If that fails,
+the class definition is skipped.
+</p>
+<p>Furthermore, classes can be nested.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.class [prepunct] , : ; &gt; }
+.class [prepunctx] \C'[prepunct]' \[u2013]-\[u2016]
+</pre></div></div>
+
+<p>The class &lsquo;<samp class="samp">[prepunctx]</samp>&rsquo; thus contains the contents of the class
+<code class="code">[prepunct]</code> as defined above (the set &lsquo;<samp class="samp">, : ; &gt; }</samp>&rsquo;), and
+characters in the range between <code class="code">U+2013</code> and <code class="code">U+2016</code>.
+</p>
+<p>If you want to include &lsquo;<samp class="samp">-</samp>&rsquo; in a class, it must be the first
+character value in the argument list, otherwise it gets misinterpreted
+as part of the range syntax.
+</p>
+<p>It is not possible to use class names as end points of range
+definitions.
+</p>
+<p>A typical use of the <code class="code">class</code> request is to control line-breaking
+and hyphenation rules as defined by the <code class="code">cflags</code> request. For
+example, to inhibit line breaks before the characters belonging to the
+<code class="code">prepunctx</code> class defined in the previous example, you can write
+the following.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.cflags 2 \C'[prepunctx]'
+</pre></div></div>
+
+<p>See the <code class="code">cflags</code> request in <a class="ref" href="#Using-Symbols">Using Symbols</a>, for more details.
+</p></dd></dl>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Special-Fonts">
+<div class="nav-panel">
+<p>
+Next: <a href="#Artificial-Fonts" accesskey="n" rel="next">Artificial Fonts</a>, Previous: <a href="#Character-Classes" accesskey="p" rel="prev">Character Classes</a>, Up: <a href="#Using-Fonts" accesskey="u" rel="up">Using Fonts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Special-Fonts-1">5.19.6 Special Fonts</h4>
+<a class="index-entry-id" id="index-special-fonts-1"></a>
+<a class="index-entry-id" id="index-fonts_002c-special"></a>
+
+<p>Special fonts are those that <code class="code">gtroff</code> searches when it cannot find
+the requested glyph in the current font. The Symbol font is usually a
+special font.
+</p>
+<p><code class="code">gtroff</code> provides the following two requests to add more special
+fonts. See <a class="xref" href="#Using-Symbols">Using Symbols</a>, for a detailed description of the glyph
+searching mechanism in <code class="code">gtroff</code>.
+</p>
+<p>Usually, only non-TTY devices have special fonts.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002especial"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.special</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">s1</i></span> <span class="r"><i class="slanted">s2</i></span> &hellip;]</var><a class="copiable-link" href='#index-_002especial'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-special-2"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002efspecial"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.fspecial</code></strong> <var class="def-var-arguments">f [<span class="r"><i class="slanted">s1</i></span> <span class="r"><i class="slanted">s2</i></span> &hellip;]</var><a class="copiable-link" href='#index-_002efspecial'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-fspecial"></a>
+<a class="index-entry-id" id="index-fonts-1"></a>
+<a class="index-entry-id" id="index-DESC-4"></a>
+<p>Use the <code class="code">special</code> request to define special fonts. Initially, this
+list is empty.
+</p>
+<p>Use the <code class="code">fspecial</code> request to designate special fonts only when
+font&nbsp;<var class="var">f</var> is active. Initially, this list is empty.
+</p>
+<p>Previous calls to <code class="code">special</code> or <code class="code">fspecial</code> are overwritten;
+without arguments, the particular list of special fonts is set to empty.
+Special fonts are searched in the order they appear as arguments.
+</p>
+<p>All fonts that appear in a call to <code class="code">special</code> or <code class="code">fspecial</code>
+are loaded.
+</p>
+<p>See <a class="xref" href="#Using-Symbols">Using Symbols</a>, for the exact search order of glyphs.
+</p></dd></dl>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Artificial-Fonts">
+<div class="nav-panel">
+<p>
+Next: <a href="#Ligatures-and-Kerning" accesskey="n" rel="next">Ligatures and Kerning</a>, Previous: <a href="#Special-Fonts" accesskey="p" rel="prev">Special Fonts</a>, Up: <a href="#Using-Fonts" accesskey="u" rel="up">Using Fonts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Artificial-Fonts-1">5.19.7 Artificial Fonts</h4>
+<a class="index-entry-id" id="index-artificial-fonts"></a>
+<a class="index-entry-id" id="index-fonts_002c-artificial"></a>
+
+<p>There are a number of requests and escape sequences for artificially
+creating fonts. These are largely vestiges of the days when output
+devices did not have a wide variety of fonts, and when <code class="code">nroff</code> and
+<code class="code">troff</code> were separate programs. Most of them are no longer
+necessary in GNU <code class="code">troff</code>. Nevertheless, they are supported.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cH_0027height_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\H<code class="code">'</code></code><span class="r"><i class="slanted">height</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cH_0027height_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cH"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cH_0027_002bheight_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\H<code class="code">'</code></code><span class="r"><i class="slanted"><code class="t">+</code>height</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cH_0027_002bheight_0027'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cH_0027_002dheight_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\H<code class="code">'</code></code><span class="r"><i class="slanted"><code class="t">-</code>height</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cH_0027_002dheight_0027'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eheight_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.height]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eheight_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eheight"></a>
+<a class="index-entry-id" id="index-changing-the-font-height-_0028_005cH_0029"></a>
+<a class="index-entry-id" id="index-font-height_002c-changing-_0028_005cH_0029"></a>
+<a class="index-entry-id" id="index-height_002c-font_002c-changing-_0028_005cH_0029"></a>
+<p>Change (increment, decrement) the height of the current font, but not
+the width. If <var class="var">height</var> is zero, restore the original height.
+Default scaling unit is &lsquo;<samp class="samp">z</samp>&rsquo;.
+</p>
+<p>The read-only register <code class="code">.height</code> contains the font height as set by
+<code class="code">\H</code>.
+</p>
+<p>Currently, only the <samp class="option">-Tps</samp> and <samp class="option">-Tpdf</samp> devices support
+this feature.
+</p>
+<p><code class="code">\H</code> doesn&rsquo;t produce an input token in GNU <code class="code">troff</code>. As a
+consequence, it can be used in requests like <code class="code">mc</code> (which expects
+a single character as an argument) to change the font on the fly:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.mc \H'+5z'x\H'0'
+</pre></div></div>
+
+<p>In compatibility mode, <code class="code">gtroff</code> behaves differently: If an
+increment or decrement is used, it is always taken relative to the
+current type size and not relative to the previously selected font
+height. Thus,
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.cp 1
+\H'+5'test \H'+5'test
+</pre></div></div>
+
+<p>prints the word &lsquo;<samp class="samp">test</samp>&rsquo; twice with the same font height (five points
+larger than the current font size).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cS_0027slant_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\S<code class="code">'</code></code><span class="r"><i class="slanted">slant</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cS_0027slant_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cS"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eslant_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.slant]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eslant_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eslant"></a>
+<a class="index-entry-id" id="index-changing-the-font-slant-_0028_005cS_0029"></a>
+<a class="index-entry-id" id="index-font-slant_002c-changing-_0028_005cS_0029"></a>
+<a class="index-entry-id" id="index-slant_002c-font_002c-changing-_0028_005cS_0029"></a>
+<p>Slant the current font by <var class="var">slant</var> degrees. Positive values slant to
+the right. Only integer values are possible.
+</p>
+<p>The read-only register <code class="code">.slant</code> contains the font slant as set by
+<code class="code">\S</code>.
+</p>
+<p>Currently, only the <samp class="option">-Tps</samp> and <samp class="option">-Tpdf</samp> devices support
+this feature.
+</p>
+<p><code class="code">\S</code> doesn&rsquo;t produce an input token in GNU <code class="code">troff</code>. As a
+consequence, it can be used in requests like <code class="code">mc</code> (which expects
+a single character as an argument) to change the font on the fly:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.mc \S'20'x\S'0'
+</pre></div></div>
+
+<a class="index-entry-id" id="index-CSTR-_002354-errata-3"></a>
+<a class="index-entry-id" id="index-CSTR-_002354-erratum_002c-_005cS-escape"></a>
+<p>This escape is incorrectly documented in the <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code> manual; the slant is always set to an absolute value.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eul"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ul</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">lines</i></span>]</var><a class="copiable-link" href='#index-_002eul'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ul"></a>
+<a class="index-entry-id" id="index-underlining-_0028ul_0029"></a>
+<p>The <code class="code">ul</code> request normally underlines subsequent lines if a TTY
+output device is used. Otherwise, the lines are printed in italics
+(only the term &lsquo;underlined&rsquo; is used in the following). The single
+argument is the quantity of input lines to be underlined; with no
+argument, the next line is underlined. If <var class="var">lines</var> is zero or
+negative, stop the effects of <code class="code">ul</code> (if it was active). Requests
+and empty lines do not count for computing the number of underlined
+input lines, even if they produce some output like <code class="code">tl</code>. Lines
+inserted by macros (e.g., invoked by a trap) do count.
+</p>
+<p>At the beginning of <code class="code">ul</code>, the current font is stored and the
+underline font is activated. Within the span of a <code class="code">ul</code> request, it
+is possible to change fonts, but after the last line affected by
+<code class="code">ul</code> the saved font is restored.
+</p>
+<p>This number of lines still to be underlined is associated with the
+environment (see <a class="pxref" href="#Environments">Environments</a>). The underline font can be changed
+with the <code class="code">uf</code> request.
+</p>
+
+
+<p>The <code class="code">ul</code> request does not underline spaces.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ecu"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.cu</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">lines</i></span>]</var><a class="copiable-link" href='#index-_002ecu'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-cu"></a>
+<a class="index-entry-id" id="index-continuous-underlining-_0028cu_0029"></a>
+<a class="index-entry-id" id="index-underlining_002c-continuous-_0028cu_0029"></a>
+<p>The <code class="code">cu</code> request is similar to <code class="code">ul</code> but underlines spaces as
+well (if a TTY output device is used).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002euf"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.uf</code></strong> <var class="def-var-arguments">font</var><a class="copiable-link" href='#index-_002euf'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-uf"></a>
+<a class="index-entry-id" id="index-underline-font-_0028uf_0029"></a>
+<a class="index-entry-id" id="index-font-for-underlining-_0028uf_0029"></a>
+<p>Set the underline font (globally) used by <code class="code">ul</code> and <code class="code">cu</code>. By
+default, this is the font at position&nbsp;2. <var class="var">font</var> can be either
+a non-negative font position or the name of a font.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ebd"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.bd</code></strong> <var class="def-var-arguments">font [<span class="r"><i class="slanted">offset</i></span>]</var><a class="copiable-link" href='#index-_002ebd'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-bd"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002ebd-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.bd</code></strong> <var class="def-var-arguments">font1 font2 [<span class="r"><i class="slanted">offset</i></span>]</var><a class="copiable-link" href='#index-_002ebd-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eb_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.b]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eb_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eb"></a>
+<a class="index-entry-id" id="index-imitating-boldface-_0028bd_0029"></a>
+<a class="index-entry-id" id="index-boldface_002c-imitating-_0028bd_0029"></a>
+<p>Embolden <var class="var">font</var> by overstriking its glyphs offset by <var class="var">offset</var>
+units minus one.
+</p>
+<p>Two syntax forms are available.
+</p>
+<ul class="itemize mark-bullet">
+<li>Imitate a bold font unconditionally. The first argument specifies the
+font to embolden, and the second is the number of basic units, minus
+one, by which the two glyphs are offset. If the second argument is
+missing, emboldening is turned off.
+
+<p><var class="var">font</var> can be either a non-negative font position or the name of a
+font.
+</p>
+<p><var class="var">offset</var> is available in the <code class="code">.b</code> read-only register if a
+special font is active; in the <code class="code">bd</code> request, its default unit is
+&lsquo;<samp class="samp">u</samp>&rsquo;.
+</p>
+</li><li><a class="index-entry-id" id="index-fspecial-request_002c-and-imitating-bold"></a>
+<a class="index-entry-id" id="index-special"></a>
+<a class="index-entry-id" id="index-embolding-of-special-fonts"></a>
+<a class="index-entry-id" id="index-special-fonts_002c-emboldening"></a>
+Imitate a bold form conditionally. Embolden <var class="var">font1</var> by <var class="var">offset</var>
+only if font <var class="var">font2</var> is the current font. This request can be
+issued repeatedly to set up different emboldening values for different
+current fonts. If the second argument is missing, emboldening is turned
+off for this particular current font.
+
+<p>This affects special fonts only (either set up with the <code class="code">special</code>
+command in font files or with the <code class="code">fspecial</code> request).
+</p></li></ul>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ecs"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.cs</code></strong> <var class="def-var-arguments">font [<span class="r"><i class="slanted">width</i></span> [<span class="r"><i class="slanted">em-size</i></span>]]</var><a class="copiable-link" href='#index-_002ecs'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-cs"></a>
+<a class="index-entry-id" id="index-constant-glyph-space-mode-_0028cs_0029"></a>
+<a class="index-entry-id" id="index-mode-for-constant-glyph-space-_0028cs_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-constant-space"></a>
+<a class="index-entry-id" id="index-ps-request_002c-and-constant-glyph-space-mode"></a>
+<p>Switch to and from <em class="dfn">constant glyph space mode</em>. If activated, the
+width of every glyph is <em class="math"><var class="var">width</var>/36</em> ems. The em size is given
+absolutely by <var class="var">em-size</var>; if this argument is missing, the em value
+is taken from the current font size (as set with the <code class="code">ps</code> request)
+when the font is effectively in use. Without second and third argument,
+constant glyph space mode is deactivated.
+</p>
+<p>Default scaling unit for <var class="var">em-size</var> is &lsquo;<samp class="samp">z</samp>&rsquo;; <var class="var">width</var> is an
+integer.
+</p></dd></dl>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Ligatures-and-Kerning">
+<div class="nav-panel">
+<p>
+Next: <a href="#Dummy-Characters" accesskey="n" rel="next">Dummy Characters</a>, Previous: <a href="#Artificial-Fonts" accesskey="p" rel="prev">Artificial Fonts</a>, Up: <a href="#Using-Fonts" accesskey="u" rel="up">Using Fonts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Ligatures-and-Kerning-1">5.19.8 Ligatures and Kerning</h4>
+<a class="index-entry-id" id="index-ligatures-and-kerning"></a>
+<a class="index-entry-id" id="index-kerning-and-ligatures"></a>
+
+<p>Ligatures are groups of characters that are run together, i.e, producing
+a single glyph. For example, the letters &lsquo;f&rsquo; and &lsquo;i&rsquo; can form a
+ligature &lsquo;fi&rsquo; as in the word &lsquo;file&rsquo;. This produces a cleaner look
+(albeit subtle) to the printed output. Usually, ligatures are not
+available in fonts for TTY output devices.
+</p>
+<p>Most PostScript fonts support the fi and fl ligatures. The C/A/T
+typesetter that was the target of <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> also
+supported &lsquo;ff&rsquo;, &lsquo;ffi&rsquo;, and &lsquo;ffl&rsquo; ligatures. Advanced typesetters or
+&lsquo;expert&rsquo; fonts may include ligatures for &lsquo;ft&rsquo; and &lsquo;ct&rsquo;, although GNU
+<code class="code">troff</code> does not support these (yet).
+</p>
+<p>Only the current font is checked for ligatures and kerns; neither
+special fonts nor special charcters defined with the <code class="code">char</code> request
+(and its siblings) are taken into account.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002elg"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.lg</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">flag</i></span>]</var><a class="copiable-link" href='#index-_002elg'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-lg"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002elg_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.lg]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002elg_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002elg-1"></a>
+<a class="index-entry-id" id="index-activating-ligatures-_0028lg_0029"></a>
+<a class="index-entry-id" id="index-ligatures_002c-activating-_0028lg_0029"></a>
+<a class="index-entry-id" id="index-ligatures-enabled-register-_0028_002elg_0029"></a>
+<p>Switch the ligature mechanism on or off; if the parameter is non-zero or
+missing, ligatures are enabled, otherwise disabled. Default is on. The
+current ligature mode can be found in the read-only register <code class="code">.lg</code>
+(set to 1 or&nbsp;2 if ligatures are enabled, 0&nbsp;otherwise).
+</p>
+<p>Setting the ligature mode to&nbsp;2 enables the two-character ligatures
+(fi, fl, and ff) and disables the three-character ligatures (ffi and
+ffl).
+</p></dd></dl>
+
+<p><em class="dfn">Pairwise kerning</em> is another subtle typesetting mechanism that
+modifies the distance between a glyph pair to improve readability. In
+most cases (but not always) the distance is decreased.
+Typewriter-like fonts and fonts for terminals where all glyphs have the
+same width don&rsquo;t use kerning.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ekern"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.kern</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">flag</i></span>]</var><a class="copiable-link" href='#index-_002ekern'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-kern"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ekern_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.kern]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ekern_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ekern-1"></a>
+<a class="index-entry-id" id="index-activating-kerning-_0028kern_0029"></a>
+<a class="index-entry-id" id="index-kerning_002c-activating-_0028kern_0029"></a>
+<a class="index-entry-id" id="index-kerning-enabled-register-_0028_002ekern_0029"></a>
+<p>Switch kerning on or off. If the parameter is non-zero or missing,
+enable pairwise kerning, otherwise disable it. The read-only register
+<code class="code">.kern</code> is set to&nbsp;1 if pairwise kerning is enabled,
+0&nbsp;otherwise.
+</p>
+<a class="index-entry-id" id="index-dummy-character-_0028_005c_0026_0029_002c-effect-on-kerning"></a>
+<a class="index-entry-id" id="index-character_002c-dummy-_0028_005c_0026_0029_002c-effect-on-kerning"></a>
+<p>If the font description file contains pairwise kerning information,
+glyphs from that font are kerned. Kerning between two glyphs can be
+inhibited by placing <code class="code">\&amp;</code> between them: &lsquo;<samp class="samp">V\&amp;A</samp>&rsquo;.
+</p>
+<p>See <a class="xref" href="#Font-Description-File-Format">Font Description File Format</a>.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-track-kerning"></a>
+<a class="index-entry-id" id="index-kerning_002c-track"></a>
+<p><em class="dfn">Track kerning</em> expands or reduces the space between glyphs. This
+can be handy, for example, if you need to squeeze a long word onto a
+single line or spread some text to fill a narrow column. It must be
+used with great care since it is usually considered bad typography if
+the reader notices the effect.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002etkf"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.tkf</code></strong> <var class="def-var-arguments">f s1 n1 s2 n2</var><a class="copiable-link" href='#index-_002etkf'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-tkf"></a>
+<a class="index-entry-id" id="index-activating-track-kerning-_0028tkf_0029"></a>
+<a class="index-entry-id" id="index-track-kerning_002c-activating-_0028tkf_0029"></a>
+<p>Enable track kerning for font&nbsp;<var class="var">f</var>. If the current font
+is&nbsp;<var class="var">f</var> the width of every glyph is increased by an amount
+between <var class="var">n1</var> and <var class="var">n2</var> (<var class="var">n1</var>, <var class="var">n2</var> can be negative); if
+the current type size is less than or equal to <var class="var">s1</var> the width is
+increased by <var class="var">n1</var>; if it is greater than or equal to <var class="var">s2</var> the
+width is increased by <var class="var">n2</var>; if the type size is greater than or
+equal to <var class="var">s1</var> and less than or equal to <var class="var">s2</var> the increase in
+width is a linear function of the type size.
+</p>
+<p>The default scaling unit is &lsquo;<samp class="samp">z</samp>&rsquo; for <var class="var">s1</var> and <var class="var">s2</var>, &lsquo;<samp class="samp">p</samp>&rsquo;
+for <var class="var">n1</var> and <var class="var">n2</var>.
+</p>
+<p>The track kerning amount is added even to the rightmost glyph in a line;
+for large values it is thus recommended to increase the line length by
+the same amount to compensate.
+</p></dd></dl>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Italic-Corrections">
+<div class="nav-panel">
+<p>
+Next: <a href="#Dummy-Characters" accesskey="n" rel="next">Dummy Characters</a>, Previous: <a href="#Ligatures-and-Kerning" accesskey="p" rel="prev">Ligatures and Kerning</a>, Up: <a href="#Using-Fonts" accesskey="u" rel="up">Using Fonts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Italic-Corrections-1">5.19.9 Italic Corrections</h4>
+
+<p>When typesetting adjacent glyphs from typefaces of different slants, the
+space between them may require adjustment.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002f-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\/</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_002f-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_002f"></a>
+<a class="index-entry-id" id="index-italic-correction-_0028_005c_002f_0029"></a>
+<a class="index-entry-id" id="index-correction_002c-italic-_0028_005c_002f_0029"></a>
+<a class="index-entry-id" id="index-correction-between-oblique-and-upright-glyph-_0028_005c_002f_002c-_005c_002c_0029"></a>
+<a class="index-entry-id" id="index-roman-glyph_002c-correction-after-italic-glyph-_0028_005c_002f_0029"></a>
+<a class="index-entry-id" id="index-upright-glyph_002c-correction-after-oblique-glyph-_0028_005c_002f_0029"></a>
+<p>Apply an <em class="dfn">italic correction</em>: modify the spacing of the preceding
+glyph so that the distance between it and the following glyph is correct
+if the latter is of upright shape. For example, if an
+italic&nbsp;&lsquo;<samp class="samp">f</samp>&rsquo; is followed immediately by a roman right
+parenthesis, then in many fonts the top right portion of
+the&nbsp;&lsquo;<samp class="samp">f</samp>&rsquo; overlaps the top left of the right parenthesis, which
+is ugly. Use this escape sequence whenever an oblique glyph is
+immediately followed by an upright glyph without any intervening space.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002c-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\,</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_002c-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_002c"></a>
+<a class="index-entry-id" id="index-left-italic-correction-_0028_005c_002c_0029"></a>
+<a class="index-entry-id" id="index-correction_002c-left-italic-_0028_005c_002c_0029"></a>
+<a class="index-entry-id" id="index-correction-between-upright-and-oblique-glyph-_0028_005c_002f_002c-_005c_002c_0029"></a>
+<a class="index-entry-id" id="index-roman-glyph_002c-correction-before-italic-glyph-_0028_005c_002c_0029"></a>
+<a class="index-entry-id" id="index-upright-glyph_002c-correction-before-oblique-glyph-_0028_005c_002c_0029"></a>
+<p>Apply a <em class="dfn">left italic correction</em>: modify the spacing of the
+following glyph so that the distance between it and the preceding
+glyph is correct if the latter is of upright shape. For example,
+if a roman left parenthesis is immediately followed by an
+italic&nbsp;&lsquo;<samp class="samp">f</samp>&rsquo;, then in many fonts the bottom left portion of
+the&nbsp;&lsquo;<samp class="samp">f</samp>&rsquo; overlaps the bottom of the left parenthesis, which is
+ugly. Use this escape sequence whenever an upright glyph is followed
+immediately by an oblique glyph without any intervening space.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Dummy-Characters">
+<div class="nav-panel">
+<p>
+Previous: <a href="#Italic-Corrections" accesskey="p" rel="prev">Italic Corrections</a>, Up: <a href="#Using-Fonts" accesskey="u" rel="up">Using Fonts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Dummy-Characters-1">5.19.10 Dummy Characters</h4>
+
+<p>As discussed in <a class="ref" href="#Requests-and-Macros">Requests and Macros</a>, the first character on an
+input line is treated specially. Further, formatting a glyph has many
+consequences on formatter state (see <a class="pxref" href="#Environments">Environments</a>). Occasionally,
+we want to escape this context or embrace some of those consequences
+without actually rendering a glyph to the output.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0026-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\&amp;</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0026-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0026"></a>
+<a class="index-entry-id" id="index-dummy-character-_0028_005c_0026_0029"></a>
+<a class="index-entry-id" id="index-character_002c-dummy-_0028_005c_0026_0029"></a>
+<p>Interpolate a dummy character, which is constitutive of output but
+invisible.<a class="footnote" id="DOCF81" href="#FOOT81"><sup>81</sup></a> Its presence alters the interpretation context of a
+subsequent input character, and enjoys several applications.
+</p>
+<ul class="itemize mark-bullet">
+<li>Prevent insertion of extra space after an end-of-sentence character.
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">Test.
+Test.
+ &rArr; Test. Test.
+Test.\&amp;
+Test.
+ &rArr; Test. Test.
+</pre></div></div>
+
+</li><li>Prevent recognition of a control character.
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">.Test
+ error&rarr; warning: macro 'Test' not defined
+\&amp;.Test
+ &rArr; .Test
+</pre></div></div>
+
+</li><li>Prevent kerning between two glyphs.
+
+
+</li><li>Translate a character to &ldquo;nothing&rdquo;.
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">.tr JIjiK\&amp;k\&amp;UVuv
+Post universitum, alea jacta est, OK?
+ &rArr; Post vniversitvm, alea iacta est, O?
+</pre></div></div>
+</li></ul>
+
+<p>The dummy character escape sequence sees use in macro definitions as a
+means of ensuring that arguments are treated as text even if they begin
+with spaces or control characters.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de HD \&quot; typeset a simple bold heading
+. sp
+. ft B
+\&amp;\\$1 \&quot; exercise: remove the \&amp;
+. ft
+. sp
+..
+.HD .\|.\|.\|surprised?
+</pre></div></div>
+</dd></dl>
+
+<p>One way to think about the dummy character is to imagine placing the
+symbol &lsquo;<samp class="samp">&amp;</samp>&rsquo; in the input at a certain location; if doing so has all
+the side effects on formatting that you desire except for sticking an
+ugly ampersand in the midst of your text, the dummy character is what
+you want in its place.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0029-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\)</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0029-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0029"></a>
+<a class="index-entry-id" id="index-transparent-dummy-character-_0028_005c_0029_0029"></a>
+<a class="index-entry-id" id="index-character_002c-transparent-dummy-_0028_005c_0029_0029"></a>
+<a class="index-entry-id" id="index-dummy-character_002c-transparent-_0028_005c_0029_0029"></a>
+<p>Interpolate a <i class="slanted">transparent</i> dummy character&mdash;one that is
+transparent to end-of-sentence detection. It behaves as <code class="code">\&amp;</code>,
+except that <code class="code">\&amp;</code> is treated as letters and numerals normally are
+after &lsquo;<samp class="samp">.</samp>&rsquo;, &lsquo;<samp class="samp">?</samp>&rsquo; and &lsquo;<samp class="samp">!</samp>&rsquo;; <code class="code">\&amp;</code> cancels end-of-sentence
+detection, and <code class="code">\)</code> does not.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de Suffix-&amp;
+. nop \&amp;\\$1
+..
+.
+.de Suffix-)
+. nop \)\\$1
+..
+.
+Here's a sentence.\c
+.Suffix-&amp; '
+Another one.\c
+.Suffix-) '
+And a third.
+ &rArr; Here's a sentence.' Another one.' And a third.
+</pre></div></div>
+</dd></dl>
+
+
+
+
+<hr>
+</div>
+</div>
+<div class="section-level-extent" id="Manipulating-Type-Size-and-Vertical-Spacing">
+<div class="nav-panel">
+<p>
+Next: <a href="#Colors" accesskey="n" rel="next">Colors</a>, Previous: <a href="#Using-Fonts" accesskey="p" rel="prev">Using Fonts</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Manipulating-Type-Size-and-Vertical-Spacing-1">5.20 Manipulating Type Size and Vertical Spacing</h3>
+<a class="index-entry-id" id="index-manipulating-type-size-and-vertical-spacing"></a>
+
+<a class="index-entry-id" id="index-text-baseline-1"></a>
+<a class="index-entry-id" id="index-baseline_002c-text-1"></a>
+<a class="index-entry-id" id="index-type-size"></a>
+<a class="index-entry-id" id="index-size_002c-size"></a>
+<a class="index-entry-id" id="index-vertical-spacing-1"></a>
+<a class="index-entry-id" id="index-spacing_002c-vertical-1"></a>
+<p>These concepts were introduced in <a class="ref" href="#Page-Geometry">Page Geometry</a>. The height of a
+font&rsquo;s tallest glyph is one em, which is equal to the type size in
+points.<a class="footnote" id="DOCF82" href="#FOOT82"><sup>82</sup></a> A vertical spacing of less than 120% of
+the type size can make a document hard to read. Larger proportions can
+be useful to spread the text for annotations or proofreader&rsquo;s marks. By
+default, GNU <code class="code">troff</code> uses 10&nbsp;point type on 12&nbsp;point
+spacing.
+<a class="index-entry-id" id="index-leading"></a>
+Typographers call the difference between type size and vertical spacing
+<em class="dfn">leading</em>.<a class="footnote" id="DOCF83" href="#FOOT83"><sup>83</sup></a>
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="#Changing-the-Type-Size" accesskey="1">Changing the Type Size</a></li>
+<li><a href="#Changing-the-Vertical-Spacing" accesskey="2">Changing the Vertical Spacing</a></li>
+<li><a href="#Using-Fractional-Type-Sizes" accesskey="3">Using Fractional Type Sizes</a></li>
+</ul>
+<hr>
+<div class="subsection-level-extent" id="Changing-the-Type-Size">
+<div class="nav-panel">
+<p>
+Next: <a href="#Changing-the-Vertical-Spacing" accesskey="n" rel="next">Changing the Vertical Spacing</a>, Previous: <a href="#Manipulating-Type-Size-and-Vertical-Spacing" accesskey="p" rel="prev">Manipulating Type Size and Vertical Spacing</a>, Up: <a href="#Manipulating-Type-Size-and-Vertical-Spacing" accesskey="u" rel="up">Manipulating Type Size and Vertical Spacing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Changing-the-Type-Size-1">5.20.1 Changing the Type Size</h4>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eps"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ps</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">size</i></span>]</var><a class="copiable-link" href='#index-_002eps'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ps"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eps-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ps</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">size</i></span></var><a class="copiable-link" href='#index-_002eps-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002eps-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ps</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">size</i></span></var><a class="copiable-link" href='#index-_002eps-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cssize"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\s</code><span class="r"><i class="slanted">size</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cssize'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cs"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002es_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.s]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002es_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002es"></a>
+<a class="index-entry-id" id="index-changing-type-sizes-_0028ps_002c-_005cs_0029"></a>
+<a class="index-entry-id" id="index-type-sizes_002c-changing-_0028ps_002c-_005cs_0029"></a>
+<a class="index-entry-id" id="index-point-sizes_002c-changing-_0028ps_002c-_005cs_0029"></a>
+<p>Use the <code class="code">ps</code> request or the <code class="code">\s</code> escape sequence to change
+(increase, decrease) the type size (in scaled points). Specify
+<var class="var">size</var> as either an absolute type size, or as a relative change from
+the current size. <code class="code">ps</code> with no argument restores the previous
+size. The <code class="code">ps</code> request&rsquo;s default scaling unit is &lsquo;<samp class="samp">z</samp>&rsquo;. The
+requested size is rounded to the nearest valid size (with ties rounding
+down) within the limits supported by the device. If the requested size
+is non-positive, it is treated as 1<span class="dmn">u</span>.
+</p>
+<a class="index-entry-id" id="index-CSTR-_002354-errata-4"></a>
+<a class="index-entry-id" id="index-CSTR-_002354-erratum_002c-ps-request"></a>
+<a class="index-entry-id" id="index-CSTR-_002354-erratum_002c-_005cs-escape-sequence"></a>
+<p>Type size alteration is incorrectly documented in the <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code> manual, which claims &ldquo;if [the requested size] is invalid,
+the next larger valid size will result, with a maximum of
+36&rdquo;.<a class="footnote" id="DOCF84" href="#FOOT84"><sup>84</sup></a>
+</p>
+<a class="index-entry-id" id="index-type-size-registers-_0028_002es_002c-_002eps_0029"></a>
+<a class="index-entry-id" id="index-point-size-registers-_0028_002es_002c-_002eps_0029"></a>
+<p>The read-only string-valued register <code class="code">.s</code> interpolates the type
+size in points as a decimal fraction; it is associated with the
+environment (see <a class="pxref" href="#Environments">Environments</a>). To obtain the type size in scaled
+points, interpolate the <code class="code">.ps</code> register instead (see <a class="pxref" href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a>).
+</p>
+<p>The <code class="code">\s</code> escape sequence supports a variety of syntax forms.
+</p>
+<dl class="table">
+<dt><code class="code">\s<var class="var">n</var></code></dt>
+<dd><p>Set the type size to <var class="var">n</var>&nbsp;points. <var class="var">n</var>&nbsp;must be a single
+digit. If <var class="var">n</var>&nbsp;is 0, restore the previous size.
+</p>
+</dd>
+<dt><code class="code">\s+<var class="var">n</var></code></dt>
+<dt><code class="code">\s-<var class="var">n</var></code></dt>
+<dd><p>Increase or decrease the type size by <var class="var">n</var>&nbsp;points.
+<var class="var">n</var>&nbsp;must be exactly one digit.
+</p>
+</dd>
+<dt><code class="code">\s(<var class="var">nn</var></code></dt>
+<dd><p>Set the type size to <var class="var">nn</var>&nbsp;points. <var class="var">nn</var> must be exactly two
+digits.
+</p>
+</dd>
+<dt><code class="code">\s+(<var class="var">nn</var></code></dt>
+<dt><code class="code">\s-(<var class="var">nn</var></code></dt>
+<dt><code class="code">\s(+<var class="var">nn</var></code></dt>
+<dt><code class="code">\s(-<var class="var">nn</var></code></dt>
+<dd><p>Alter the type size in points by the two-digit value <var class="var">nn</var>.
+</p></dd>
+</dl>
+
+<p>See <a class="xref" href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a>, for further syntactical forms of the
+<code class="code">\s</code> escape sequence that additionally accept decimal fractions.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">snap, snap,
+.ps +2
+grin, grin,
+.ps +2
+wink, wink, \s+2nudge, nudge,\s+8 say no more!
+.ps 10
+</pre></div></div>
+</dd></dl>
+
+<p>The <code class="code">\s</code> escape sequence affects the environment immediately and
+doesn&rsquo;t produce an input token. Consequently, it can be used in
+requests like <code class="code">mc</code>, which expects a single character as an
+argument, to change the type size on the fly.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.mc \s[20]x\s[0]
+</pre></div></div>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002esizes"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.sizes</code></strong> <var class="def-var-arguments">s1 s2 &hellip; sn [<code class="t">0</code>]</var><a class="copiable-link" href='#index-_002esizes'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-sizes-1"></a>
+<p>The <samp class="file">DESC</samp> file specifies which type sizes are allowed by the
+output device; see <a class="ref" href="#DESC-File-Format"><samp class="file">DESC</samp> File Format</a>. Use the <code class="code">sizes</code> request
+to change this set of permissible sizes. Arguments are in scaled
+points; see <a class="ref" href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a>. Each can be a single
+type size (such as &lsquo;<samp class="samp">12000</samp>&rsquo;), or a range of sizes (such as
+&lsquo;<samp class="samp">4000-72000</samp>&rsquo;). You can optionally end the list with a &lsquo;<samp class="samp">0</samp>&rsquo;.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Changing-the-Vertical-Spacing">
+<div class="nav-panel">
+<p>
+Next: <a href="#Using-Fractional-Type-Sizes" accesskey="n" rel="next">Using Fractional Type Sizes</a>, Previous: <a href="#Changing-the-Type-Size" accesskey="p" rel="prev">Changing the Type Size</a>, Up: <a href="#Manipulating-Type-Size-and-Vertical-Spacing" accesskey="u" rel="up">Manipulating Type Size and Vertical Spacing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Changing-the-Vertical-Spacing-1">5.20.2 Changing the Vertical Spacing</h4>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002evs"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.vs</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">space</i></span>]</var><a class="copiable-link" href='#index-_002evs'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-vs"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002evs-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.vs</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">space</i></span></var><a class="copiable-link" href='#index-_002evs-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002evs-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.vs</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">space</i></span></var><a class="copiable-link" href='#index-_002evs-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ev_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.v]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ev_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ev"></a>
+<a class="index-entry-id" id="index-changing-vertical-line-spacing-_0028vs_0029"></a>
+<a class="index-entry-id" id="index-vertical-line-spacing_002c-changing-_0028vs_0029"></a>
+<a class="index-entry-id" id="index-vertical-line-spacing-register-_0028_002ev_0029"></a>
+<p>Set the vertical spacing to, or alter it by, <var class="var">space</var>. The default
+scaling unit is &lsquo;<samp class="samp">p</samp>&rsquo;. If <code class="code">vs</code> is called without an argument,
+the vertical spacing is reset to the previous value before the last call
+to <code class="code">vs</code>.
+<a class="index-entry-id" id="index-_002eV-register_002c-and-vs"></a>
+GNU <code class="code">troff</code> emits a warning in category &lsquo;<samp class="samp">range</samp>&rsquo; if <var class="var">space</var>
+is negative; the vertical spacing is then set to the smallest possible
+positive value, the vertical motion quantum (as found in the <code class="code">.V</code>
+register).
+</p>
+<p>&lsquo;<samp class="samp">.vs&nbsp;0</samp>&rsquo;<!-- /@w --> isn&rsquo;t saved in a diversion since it doesn&rsquo;t result in
+a vertical motion. You must explicitly issue this request before
+interpolating the diversion.
+</p>
+<p>The read-only register <code class="code">.v</code> contains the vertical spacing; it is
+associated with the environment (see <a class="pxref" href="#Environments">Environments</a>).
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-vertical-line-spacing_002c-effective-value"></a>
+<p>When a break occurs, GNU <code class="code">troff</code> performs the following procedure.
+</p>
+<ul class="itemize mark-bullet">
+<li><a class="index-entry-id" id="index-extra-pre_002dvertical-line-space-_0028_005cx_0029"></a>
+<a class="index-entry-id" id="index-line-space_002c-extra-pre_002dvertical-_0028_005cx_0029"></a>
+Move the drawing position vertically by the <em class="dfn">extra pre-vertical line
+space</em>, the minimum of all negative <code class="code">\x</code> escape sequence arguments
+in the pending output line.
+
+</li><li>Move the drawing position vertically by the vertical line spacing.
+
+</li><li>Write out the pending output line.
+
+</li><li><a class="index-entry-id" id="index-extra-post_002dvertical-line-space-_0028_005cx_0029"></a>
+<a class="index-entry-id" id="index-line-space_002c-extra-post_002dvertical-_0028_005cx_0029"></a>
+Move the drawing position vertically by the <em class="dfn">extra post-vertical line
+space</em>, the maximum of all positive <code class="code">\x</code> escape sequence arguments
+in the line that has just been output.
+
+</li><li><a class="index-entry-id" id="index-post_002dvertical-line-spacing"></a>
+<a class="index-entry-id" id="index-line-spacing_002c-post_002dvertical-_0028pvs_0029"></a>
+Move the drawing position vertically by the <em class="dfn">post-vertical line
+spacing</em> (see below).
+</li></ul>
+
+<a class="index-entry-id" id="index-double_002dspacing-_0028vs_002c-pvs_0029"></a>
+<p>Prefer <code class="code">vs</code> or <code class="code">pvs</code> over <code class="code">ls</code> to produce double-spaced
+documents. <code class="code">vs</code> and <code class="code">pvs</code> have finer granularity than
+<code class="code">ls</code>; moreover, some preprocessors assume single spacing.
+See <a class="xref" href="#Manipulating-Spacing">Manipulating Spacing</a>, regarding the <code class="code">\x</code> escape sequence and
+the <code class="code">ls</code> request.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epvs"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pvs</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">space</i></span>]</var><a class="copiable-link" href='#index-_002epvs'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-pvs"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002epvs-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pvs</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">space</i></span></var><a class="copiable-link" href='#index-_002epvs-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002epvs-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pvs</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">space</i></span></var><a class="copiable-link" href='#index-_002epvs-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002epvs_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.pvs]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002epvs_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002epvs-3"></a>
+<a class="index-entry-id" id="index-ls-request_002c-alternative-to-_0028pvs_0029"></a>
+<a class="index-entry-id" id="index-post_002dvertical-line-spacing_002c-changing-_0028pvs_0029"></a>
+<a class="index-entry-id" id="index-post_002dvertical-line-spacing-register-_0028_002epvs_0029"></a>
+<p>Set the post-vertical spacing to, or alter it by, <var class="var">space</var>. The
+default scaling unit is &lsquo;<samp class="samp">p</samp>&rsquo;. If <code class="code">pvs</code> is called without an
+argument, the post-vertical spacing is reset to the previous value
+before the last call to <code class="code">pvs</code>. GNU <code class="code">troff</code> emits a warning in
+category &lsquo;<samp class="samp">range</samp>&rsquo; if <var class="var">space</var> is negative; the post-vertical
+spacing is then set to zero.
+</p>
+<p>The read-only register <code class="code">.pvs</code> contains the post-vertical spacing;
+it is associated with the environment (see <a class="pxref" href="#Environments">Environments</a>).
+</p></dd></dl>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Using-Fractional-Type-Sizes">
+<div class="nav-panel">
+<p>
+Previous: <a href="#Changing-the-Type-Size" accesskey="p" rel="prev">Changing the Type Size</a>, Up: <a href="#Manipulating-Type-Size-and-Vertical-Spacing" accesskey="u" rel="up">Manipulating Type Size and Vertical Spacing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Using-Fractional-Type-Sizes-1">5.20.3 Using Fractional Type Sizes</h4>
+<a class="index-entry-id" id="index-fractional-type-sizes"></a>
+<a class="index-entry-id" id="index-fractional-point-sizes"></a>
+<a class="index-entry-id" id="index-type-sizes_002c-fractional"></a>
+<a class="index-entry-id" id="index-point-sizes_002c-fractional"></a>
+<a class="index-entry-id" id="index-sizes_002c-fractional-type"></a>
+
+<p>AT&amp;T <code class="code">troff</code> interpreted all type size measurements in points.
+Combined with integer arithmetic, this design choice made it impossible
+to support, for instance, ten and a half-point type. In GNU
+<code class="code">troff</code>, an output device can select a scaling factor that
+subdivides a point into &ldquo;scaled points&rdquo;. A type size expressed in
+scaled points can thus represent a non-integral type size.
+</p>
+<a class="index-entry-id" id="index-s-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-s"></a>
+<a class="index-entry-id" id="index-scaling-unit-s"></a>
+<a class="index-entry-id" id="index-z-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-z"></a>
+<a class="index-entry-id" id="index-scaling-unit-z"></a>
+<a class="index-entry-id" id="index-ps-request_002c-with-fractional-type-sizes"></a>
+<a class="index-entry-id" id="index-cs-request_002c-with-fractional-type-sizes"></a>
+<a class="index-entry-id" id="index-tkf-request_002c-with-fractional-type-sizes"></a>
+<a class="index-entry-id" id="index-_005cH_002c-with-fractional-type-sizes"></a>
+<a class="index-entry-id" id="index-_005cs_002c-with-fractional-type-sizes"></a>
+<p>A <em class="dfn">scaled point</em> is equal to <em class="math">1/<var class="var">sizescale</var></em> points, where
+<var class="var">sizescale</var> is specified in the device description file <samp class="file">DESC</samp>,
+and defaults to&nbsp;1.<a class="footnote" id="DOCF85" href="#FOOT85"><sup>85</sup></a> Requests and escape sequences in GNU <code class="code">troff</code> interpret
+arguments that represent a type size in scaled points, which the
+formatter multiplies by <var class="var">sizescale</var> and converts to an integer.
+Arguments treated in this way comprise those to the escape sequences
+<code class="code">\H</code> and <code class="code">\s</code>, to the request <code class="code">ps</code>, the third argument to
+the <code class="code">cs</code> request, and the second and fourth arguments to the
+<code class="code">tkf</code> request. Scaled points may be specified explicitly with the
+<code class="code">z</code> scaling unit.
+</p>
+<p>For example, if <var class="var">sizescale</var> is&nbsp;1000, then a scaled point is one
+thousandth of a point. The request &lsquo;<samp class="samp">.ps 10.5</samp>&rsquo; is synonymous with
+&lsquo;<samp class="samp">.ps 10.5z</samp>&rsquo; and sets the type size to 10,500&nbsp;scaled points, or
+10.5&nbsp;points. Consequently, in GNU <code class="code">troff</code>, the register
+<code class="code">.s</code> can interpolate a non-integral type size.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002eps_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.ps]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eps_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eps-3"></a>
+<p>This read-only register interpolates the type size in scaled points; it
+is associated with the environment (see <a class="pxref" href="#Environments">Environments</a>).
+</p></dd></dl>
+
+<p>It makes no sense to use the &lsquo;<samp class="samp">z</samp>&rsquo; scaling unit in a numeric
+expression whose default scaling unit is neither &lsquo;<samp class="samp">u</samp>&rsquo; nor &lsquo;<samp class="samp">z</samp>&rsquo;,
+so GNU <code class="code">troff</code> disallows this. Similarly, it is nonsensical to use
+a scaling unit other than &lsquo;<samp class="samp">z</samp>&rsquo; or &lsquo;<samp class="samp">u</samp>&rsquo; in a numeric expression
+whose default scaling unit is &lsquo;<samp class="samp">z</samp>&rsquo;, and so GNU <code class="code">troff</code>
+disallows this as well.
+</p>
+<p>Another GNU <code class="code">troff</code> scaling unit, &lsquo;<samp class="samp">s</samp>&rsquo;, multiplies by the
+number of basic units in a scaled point. Thus, &lsquo;<samp class="samp">\n[.ps]s</samp>&rsquo; is equal
+to &lsquo;<samp class="samp">1m</samp>&rsquo; by definition. Do not confuse the &lsquo;<samp class="samp">s</samp>&rsquo; and &lsquo;<samp class="samp">z</samp>&rsquo;
+scaling units.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002epsr_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.psr]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002epsr_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002epsr"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002esr_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.sr]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002esr_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002esr"></a>
+<a class="index-entry-id" id="index-last_002drequested-type-size-registers-_0028_002epsr_002c-_002esr_0029"></a>
+<a class="index-entry-id" id="index-type-size-registers_002c-last_002drequested-_0028_002epsr_002c-_002esr_0029"></a>
+<a class="index-entry-id" id="index-last_002drequested-point-size-registers-_0028_002epsr_002c-_002esr_0029"></a>
+<a class="index-entry-id" id="index-point-size-registers_002c-last_002drequested-_0028_002epsr_002c-_002esr_0029"></a>
+<a class="index-entry-id" id="index-_002eps-register_002c-in-comparison-with-_002epsr"></a>
+<a class="index-entry-id" id="index-_002es-register_002c-in-comparison-with-_002esr"></a>
+<p>Output devices may be limited in the type sizes they can employ. The
+<code class="code">.s</code> and <code class="code">.ps</code> registers represent the type size selected by
+the output driver as it understands a device&rsquo;s capability. The last
+<em class="emph">requested</em> type size is interpolated in scaled points by the
+read-only register <code class="code">.psr</code> and in points as a decimal fraction by
+the read-only string-valued register <code class="code">.sr</code>. Both are associated
+with the environment (see <a class="pxref" href="#Environments">Environments</a>).
+</p>
+<p>For example, if a type size of 10.95 points is requested, and the
+nearest size permitted by a <code class="code">sizes</code> request (or by the <code class="code">sizes</code>
+or <code class="code">sizescale</code> directives in the device&rsquo;s <samp class="file">DESC</samp> file) is 11
+points, the output driver uses the latter value.
+</p></dd></dl>
+
+<p>The <code class="code">\s</code> escape sequence offers the following syntax forms that
+work with fractional type sizes and accept scaling units. You may of
+course give them integral arguments. The delimited forms need not use
+the neutral apostrophe; see <a class="ref" href="#Delimiters">Delimiters</a>.
+</p>
+<dl class="table">
+<dt><code class="code">\s[<var class="var">n</var>]</code></dt>
+<dt><code class="code">\s'<var class="var">n</var>'</code></dt>
+<dd><p>Set the type size to <var class="var">n</var>&nbsp;scaled points; <var class="var">n</var>&nbsp;is a
+numeric expression with a default scaling unit of &lsquo;<samp class="samp">z</samp>&rsquo;.
+</p>
+</dd>
+<dt><code class="code">\s[+<var class="var">n</var>]</code></dt>
+<dt><code class="code">\s[-<var class="var">n</var>]</code></dt>
+<dt><code class="code">\s+[<var class="var">n</var>]</code></dt>
+<dt><code class="code">\s-[<var class="var">n</var>]</code></dt>
+<dt><code class="code">\s'+<var class="var">n</var>'</code></dt>
+<dt><code class="code">\s'-<var class="var">n</var>'</code></dt>
+<dt><code class="code">\s+'<var class="var">n</var>'</code></dt>
+<dt><code class="code">\s-'<var class="var">n</var>'</code></dt>
+<dd><p>Increase or decrease the type size by <var class="var">n</var>&nbsp;scaled points;
+<var class="var">n</var>&nbsp;is a numeric expression (which may start with a minus sign)
+with a default scaling unit of &lsquo;<samp class="samp">z</samp>&rsquo;.
+</p></dd>
+</dl>
+
+
+
+<hr>
+</div>
+</div>
+<div class="section-level-extent" id="Colors">
+<div class="nav-panel">
+<p>
+Next: <a href="#Strings" accesskey="n" rel="next">Strings</a>, Previous: <a href="#Manipulating-Type-Size-and-Vertical-Spacing" accesskey="p" rel="prev">Manipulating Type Size and Vertical Spacing</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Colors-1">5.21 Colors</h3>
+<a class="index-entry-id" id="index-colors"></a>
+
+<a class="index-entry-id" id="index-stroke-color"></a>
+<a class="index-entry-id" id="index-color_002c-stroke"></a>
+<a class="index-entry-id" id="index-fill-color"></a>
+<a class="index-entry-id" id="index-color_002c-fill"></a>
+<p>GNU <code class="code">troff</code> supports color output with a variety of color spaces
+and up to 16 bits per channel. Some devices, particularly terminals,
+may be more limited. When color support is enabled, two colors are
+current at any given time: the <em class="dfn">stroke color</em>, with which glyphs,
+rules (lines), and geometric objects like circles and polygons are
+drawn, and the <em class="dfn">fill color</em>, which can be used to paint the interior
+of a closed geometric figure.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ecolor"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.color</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">n</i></span>]</var><a class="copiable-link" href='#index-_002ecolor'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-color"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ecolor_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.color]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ecolor_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ecolor-1"></a>
+<p>If <var class="var">n</var> is missing or non-zero, enable the output of color-related
+device-independent output commands (this is the default); otherwise,
+disable them. This request sets a global flag; it does not produce an
+input token (see <a class="pxref" href="#Gtroff-Internals"><code class="code">gtroff</code> Internals</a>).
+</p>
+<p>The read-only register <code class="code">.color</code> is&nbsp;1 if colors are enabled,
+0&nbsp;otherwise.
+</p>
+<p>Color can also be disabled with the <samp class="option">-c</samp> command-line option.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002edefcolor"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.defcolor</code></strong> <var class="def-var-arguments">ident scheme color-component &hellip;</var><a class="copiable-link" href='#index-_002edefcolor'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-defcolor"></a>
+<p>Define a color named <var class="var">ident</var>. <var class="var">scheme</var> selects a color space
+and determines the quantity of required <var class="var">color-component</var>s; it must
+be one of &lsquo;<samp class="samp">rgb</samp>&rsquo; (three components), &lsquo;<samp class="samp">cmy</samp>&rsquo; (three), &lsquo;<samp class="samp">cmyk</samp>&rsquo;
+(four), or &lsquo;<samp class="samp">gray</samp>&rsquo; (one). &lsquo;<samp class="samp">grey</samp>&rsquo; is accepted as a synonym of
+&lsquo;<samp class="samp">gray</samp>&rsquo;. The color components can be encoded as a single
+hexadecimal value starting with &lsquo;<samp class="samp">#</samp>&rsquo; or &lsquo;<samp class="samp">##</samp>&rsquo;. The former
+indicates that each component is in the range 0&ndash;255 (0&ndash;FF), the latter
+the range 0&ndash;65,535 (0&ndash;FFFF).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.defcolor half gray #7f
+.defcolor pink rgb #FFC0CB
+.defcolor magenta rgb ##ffff0000ffff
+</pre></div></div>
+
+<a class="index-entry-id" id="index-f-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-f"></a>
+<a class="index-entry-id" id="index-scaling-unit-f"></a>
+<p>Alternatively, each color component can be specified as a decimal
+fraction in the range 0&ndash;1, interpreted using a default scaling
+unit of&nbsp;<code class="code">f</code>, which multiplies its value by 65,536 (but
+clamps it at 65,535).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.defcolor gray50 rgb 0.5 0.5 0.5
+.defcolor darkgreen rgb 0.1f 0.5f 0.2f
+</pre></div></div>
+</dd></dl>
+
+<a class="index-entry-id" id="index-default-color"></a>
+<a class="index-entry-id" id="index-color_002c-default"></a>
+<p>Each output device has a color named &lsquo;<samp class="samp">default</samp>&rsquo;, which cannot be
+redefined. A device&rsquo;s default stroke and fill colors are not
+necessarily the same. For the <code class="code">dvi</code>, <code class="code">html</code>, <code class="code">pdf</code>,
+<code class="code">ps</code>, and <code class="code">xhtml</code> output devices, GNU <code class="code">troff</code>
+automatically loads a macro file defining many color names at startup.
+By the same mechanism, the devices supported by <code class="code">grotty</code> recognize
+the eight standard ISO&nbsp;6429/EMCA-48 color names.<a class="footnote" id="DOCF86" href="#FOOT86"><sup>86</sup></a>
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002egcolor"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.gcolor</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">color</i></span>]</var><a class="copiable-link" href='#index-_002egcolor'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-gcolor"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cmc"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\m</code><span class="r"><i class="slanted">c</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cmc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cm"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cm_0028co"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\m(</code><span class="r"><i class="slanted">co</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cm_0028co'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cm_005bcolor_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\m[</code><span class="r"><i class="slanted">color</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cm_005bcolor_005d'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002em_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.m]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002em_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002em"></a>
+<p>Set the stroke color to <var class="var">color</var>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.gcolor red
+The next words
+.gcolor
+\m[red]are in red\m[]
+and these words are in the previous color.
+</pre></div></div>
+
+<p>The escape sequence <code class="code">\m[]</code> restores the previous stroke color, as
+does a <code class="code">gcolor</code> request without an argument.
+</p>
+<a class="index-entry-id" id="index-stroke-color-name-register-_0028_002em_0029"></a>
+<a class="index-entry-id" id="index-name_002c-stroke-color_002c-register-_0028_002em_0029"></a>
+<a class="index-entry-id" id="index-color-name_002c-stroke_002c-register-_0028_002em_0029"></a>
+<p>The name of the current stroke color is available in the read-only
+string-valued register &lsquo;<samp class="samp">.m</samp>&rsquo;; it is associated with the environment
+(see <a class="pxref" href="#Environments">Environments</a>). It interpolates nothing when the stroke color
+is the default.
+</p>
+<p><code class="code">\m</code> doesn&rsquo;t produce an input token in GNU <code class="code">troff</code>
+(see <a class="pxref" href="#Gtroff-Internals"><code class="code">gtroff</code> Internals</a>). It therefore can be used in requests like
+<code class="code">mc</code> (which expects a single character as an argument) to change
+the color on the fly:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.mc \m[red]x\m[]
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002efcolor"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.fcolor</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">color</i></span>]</var><a class="copiable-link" href='#index-_002efcolor'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-fcolor"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cMc"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\M</code><span class="r"><i class="slanted">c</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cMc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cM"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cM_0028co"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\M(</code><span class="r"><i class="slanted">co</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cM_0028co'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cM_005bcolor_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\M[</code><span class="r"><i class="slanted">color</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cM_005bcolor_005d'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eM_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.M]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eM_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eM"></a>
+<p>Set the fill color for objects drawn with <code class="code">\D'&hellip;'</code> escape
+sequences. The escape sequence <code class="code">\M[]</code> restores the previous fill
+color, as does an <code class="code">fcolor</code> request without an argument.
+</p>
+<a class="index-entry-id" id="index-background-color-name-register-_0028_002eM_0029"></a>
+<a class="index-entry-id" id="index-name_002c-background-color_002c-register-_0028_002eM_0029"></a>
+<a class="index-entry-id" id="index-color-name_002c-background_002c-register-_0028_002eM_0029"></a>
+<a class="index-entry-id" id="index-fill-color-name-register-_0028_002eM_0029"></a>
+<a class="index-entry-id" id="index-name_002c-fill-color_002c-register-_0028_002eM_0029"></a>
+<a class="index-entry-id" id="index-color-name_002c-fill_002c-register-_0028_002eM_0029"></a>
+<p>The name of the current fill color is available in the read-only
+string-valued register &lsquo;<samp class="samp">.M</samp>&rsquo;; it is associated with the environment
+(see <a class="pxref" href="#Environments">Environments</a>). It interpolates nothing when the fill color
+is the default. <code class="code">\M</code> doesn&rsquo;t produce an input token in GNU
+<code class="code">troff</code>.
+</p>
+<p>Create an ellipse with a red interior as follows.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">\M[red]\h'0.5i'\D'E 2i 1i'\M[]
+</pre></div></div>
+</dd></dl>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Strings">
+<div class="nav-panel">
+<p>
+Next: <a href="#Conditionals-and-Loops" accesskey="n" rel="next">Conditionals and Loops</a>, Previous: <a href="#Colors" accesskey="p" rel="prev">Colors</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Strings-1">5.22 Strings</h3>
+<a class="index-entry-id" id="index-strings"></a>
+
+<p>GNU <code class="code">troff</code> supports strings primarily for user convenience.
+Conventionally, if one would define a macro only to interpolate a small
+amount of text, without invoking requests or calling any other macros,
+one defines a string instead. Only one string is predefined by the
+language.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_002eT_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[.T]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_002eT_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eT"></a>
+<a class="index-entry-id" id="index-_002eT-1"></a>
+<a class="index-entry-id" id="index-output-device-name-string-_0028_002eT_0029-1"></a>
+<p>Contains the name of the output device (for example, &lsquo;<samp class="samp">utf8</samp>&rsquo; or
+&lsquo;<samp class="samp">pdf</samp>&rsquo;).
+</p></dd></dl>
+
+<p>The <code class="code">ds</code> request creates a string with a specified name and
+contents and the <code class="code">\*</code> escape sequence dereferences its name,
+interpolating its contents. If the string named by the <code class="code">\*</code> escape
+sequence does not exist, it is defined as empty, nothing is
+interpolated, and a warning in category &lsquo;<samp class="samp">mac</samp>&rsquo; is emitted.
+See <a class="xref" href="#Warnings">Warnings</a>, for information about the enablement and suppression of
+warnings.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eds-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ds</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">contents</i></span>]</var><a class="copiable-link" href='#index-_002eds-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ds-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eds1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ds1</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">contents</i></span>]</var><a class="copiable-link" href='#index-_002eds1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ds1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002an"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\*</code><span class="r"><i class="slanted">n</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_002an'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_002a"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_0028nm"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\*(</code><span class="r"><i class="slanted">nm</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_002a_0028nm'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bname-_005barg1-arg2-_2026_005d_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\*[</code><span class="r"><i class="slanted">name <span class="sansserif">[</span>arg1 arg2 &hellip;<span class="sansserif">]</span></i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bname-_005barg1-arg2-_2026_005d_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-string-interpolation-_0028_005c_002a_0029"></a>
+<a class="index-entry-id" id="index-string-expansion-_0028_005c_002a_0029"></a>
+<a class="index-entry-id" id="index-interpolation-of-strings-_0028_005c_002a_0029"></a>
+<a class="index-entry-id" id="index-expansion-of-strings-_0028_005c_002a_0029"></a>
+<a class="index-entry-id" id="index-string-arguments"></a>
+<a class="index-entry-id" id="index-arguments_002c-to-strings"></a>
+<p>Define a string called <var class="var">name</var> with contents <var class="var">contents</var>. If
+<var class="var">name</var> already exists as an alias, the target of the alias is
+redefined; see <code class="code">als</code> and <code class="code">rm</code> below. If <code class="code">ds</code> is called
+with only one argument, <var class="var">name</var> is defined as an empty string.
+Otherwise, GNU <code class="code">troff</code> stores <var class="var">contents</var> in copy
+mode.<a class="footnote" id="DOCF87" href="#FOOT87"><sup>87</sup></a>
+</p>
+<p>The <code class="code">\*</code> escape sequence interpolates a previously defined string
+variable <var class="var">name</var> (one-character name&nbsp;<var class="var">n</var>, two-character name
+<var class="var">nm</var>). The bracketed interpolation form accepts arguments that are
+handled as macro arguments are; recall <a class="ref" href="#Calling-Macros">Calling Macros</a>. In
+contrast to macro calls, however, if a closing bracket &lsquo;<samp class="samp">]</samp>&rsquo; occurs
+in a string argument, that argument must be enclosed in double quotes.
+<code class="code">\*</code> is interpreted even in copy mode. When defining strings,
+argument interpolations must be escaped if they are to reference
+parameters from the calling context; See <a class="xref" href="#Parameters">Parameters</a>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds cite (\\$1, \\$2)
+Gray codes are explored in \*[cite Morgan 1998].
+ &rArr; Gray codes are explored in (Morgan, 1998).
+</pre></div></div>
+
+
+<a class="index-entry-id" id="index-trailing-spaces-in-string-definitions-and-appendments"></a>
+<a class="index-entry-id" id="index-comments_002c-with-ds"></a>
+<a class="index-entry-id" id="index-ds-request_002c-and-comments"></a>
+<p><strong class="strong">Caution:</strong> Unlike other requests, the second argument to the
+<code class="code">ds</code> request consumes the remainder of the input line, including
+trailing spaces. This means that comments on a line with such a request
+can introduce unwanted space into a string when they are set off from
+the material they annotate, as is conventional.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds H2O H\v'+.3m'\s'-2'2\v'-.3m'\s0O \&quot; water
+</pre></div></div>
+
+<p>Instead, place the comment on another line or put the comment escape
+sequence immediately adjacent to the last character of the string.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds H2O H\v'+.3m'\s'-2'2\v'-.3m'\s0O\&quot; water
+</pre></div></div>
+
+<p>Ending string definitions (and appendments) with a comment, even an
+empty one, prevents unwanted space from creeping into them during source
+document maintenance.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds author Alice Pleasance Liddell\&quot;
+.ds empty \&quot; might be appended to later with .as
+</pre></div></div>
+
+<a class="index-entry-id" id="index-trailing-double-quotes-in-strings"></a>
+<a class="index-entry-id" id="index-double-quotes_002c-trailing_002c-in-strings"></a>
+<a class="index-entry-id" id="index-ds-request_002c-and-double-quotes"></a>
+<a class="index-entry-id" id="index-leading-spaces-with-ds"></a>
+<a class="index-entry-id" id="index-spaces-with-ds"></a>
+<a class="index-entry-id" id="index-ds-request_002c-and-leading-spaces"></a>
+<p>An initial neutral double quote <code class="code">&quot;</code> in <var class="var">contents</var> is stripped
+to allow embedding of leading spaces. Any other <code class="code">&quot;</code> is interpreted
+literally, but it is wise to use the special character escape sequence
+<code class="code">\[dq]</code> instead if the string might be interpolated as part of a
+macro argument; see <a class="ref" href="#Calling-Macros">Calling Macros</a>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds salutation &quot; Yours in a white wine sauce,\&quot;
+.ds c-var-defn &quot; char mydate[]=\[dq]2020-07-29\[dq];\&quot;
+</pre></div></div>
+
+<a class="index-entry-id" id="index-multi_002dline-strings"></a>
+<a class="index-entry-id" id="index-strings_002c-multi_002dline"></a>
+<a class="index-entry-id" id="index-newline-character_002c-in-strings_002c-escaping"></a>
+<a class="index-entry-id" id="index-escaping-newline-characters_002c-in-strings"></a>
+<p>Strings are not limited to a single input line of text.
+<code class="code">\<kbd class="key">RET</kbd></code> works just as it does elsewhere. The resulting string
+is stored <em class="emph">without</em> the newlines. Care is therefore required when
+interpolating strings while filling is disabled.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds foo This string contains \
+text on multiple lines \
+of input.
+</pre></div></div>
+
+<p>It is not possible to embed a newline in a string that will be
+interpreted as such when the string is interpolated. To achieve that
+effect, use <code class="code">\*</code> to interpolate a macro instead; see <a class="ref" href="#Punning-Names">Punning Names</a>.
+</p>
+<p>Because strings are similar to macros, they too can be defined so as to
+suppress AT&amp;T <code class="code">troff</code> compatibility mode when used; see
+<a class="ref" href="#Writing-Macros">Writing Macros</a> and <a class="ref" href="#Compatibility-Mode">Compatibility Mode</a>. The <code class="code">ds1</code>
+request defines a string such that compatibility mode is off when the
+string is later interpolated. To be more precise, a <em class="dfn">compatibility
+save</em> input token is inserted at the beginning of the string, and a
+<em class="dfn">compatibility restore</em> input token at the end.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr xxx 12345
+.ds aa The value of xxx is \\n[xxx].
+.ds1 bb The value of xxx is \\n[xxx].
+.
+.cp 1
+.
+\*(aa
+ error&rarr; warning: register '[' not defined
+ &rArr; The value of xxx is 0xxx].
+\*(bb
+ &rArr; The value of xxx is 12345.
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eas"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.as</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">contents</i></span>]</var><a class="copiable-link" href='#index-_002eas'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-as"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eas1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.as1</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">contents</i></span>]</var><a class="copiable-link" href='#index-_002eas1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-as1"></a>
+<a class="index-entry-id" id="index-appending-to-a-string-_0028as_0029"></a>
+<a class="index-entry-id" id="index-string_002c-appending-_0028as_0029"></a>
+<p>The <code class="code">as</code> request is similar to <code class="code">ds</code> but appends <var class="var">contents</var>
+to the string stored as <var class="var">name</var> instead of redefining it. If
+<var class="var">name</var> doesn&rsquo;t exist yet, it is created. If <code class="code">as</code> is called
+with only one argument, no operation is performed (beyond dereferencing
+the string).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.as salutation &quot; with shallots, onions and garlic,\&quot;
+</pre></div></div>
+
+<p>The <code class="code">as1</code> request is similar to <code class="code">as</code>, but compatibility mode
+is switched off when the appended portion of the string is later
+interpolated. To be more precise, a <em class="dfn">compatibility save</em> input
+token is inserted at the beginning of the appended string, and a
+<em class="dfn">compatibility restore</em> input token at the end.
+</p></dd></dl>
+
+<p>Several requests exist to perform rudimentary string operations.
+Strings can be queried (<code class="code">length</code>) and modified (<code class="code">chop</code>,
+<code class="code">substring</code>, <code class="code">stringup</code>, <code class="code">stringdown</code>), and their names
+can be manipulated through renaming, removal, and aliasing (<code class="code">rn</code>,
+<code class="code">rm</code>, <code class="code">als</code>).
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002elength"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.length</code></strong> <var class="def-var-arguments">reg anything</var><a class="copiable-link" href='#index-_002elength'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-length"></a>
+<a class="index-entry-id" id="index-length-of-a-string-_0028length_0029"></a>
+<a class="index-entry-id" id="index-string_002c-length-of-_0028length_0029"></a>
+<a class="index-entry-id" id="index-length-request_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-length-request"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-length-request"></a>
+<p>Compute the number of characters of <var class="var">anything</var> and store the count
+in the register <var class="var">reg</var>. If <var class="var">reg</var> doesn&rsquo;t exist, it is created.
+<var class="var">anything</var> is read in copy mode.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds xxx abcd\h'3i'efgh
+.length yyy \*[xxx]
+\n[yyy]
+ &rArr; 14
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002echop"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.chop</code></strong> <var class="def-var-arguments">object</var><a class="copiable-link" href='#index-_002echop'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-chop"></a>
+<p>Remove the last character from the macro, string, or diversion named
+<var class="var">object</var>. This is useful for removing the newline from the end of a
+diversion that is to be interpolated as a string. This request can be
+used repeatedly on the same <var class="var">object</var>; see <a class="ref" href="#Gtroff-Internals"><code class="code">gtroff</code> Internals</a>,
+for details on nodes inserted additionally by GNU <code class="code">troff</code>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002esubstring"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.substring</code></strong> <var class="def-var-arguments">str start [<span class="r"><i class="slanted">end</i></span>]</var><a class="copiable-link" href='#index-_002esubstring'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-substring"></a>
+<a class="index-entry-id" id="index-substring-_0028substring_0029"></a>
+<p>Replace the string named <var class="var">str</var> with its substring bounded by the
+indices <var class="var">start</var> and <var class="var">end</var>, inclusively. The first character in
+the string has index&nbsp;0. If <var class="var">end</var> is omitted, it is implicitly
+set to the largest valid value (the string length minus one). Negative
+indices count backward from the end of the string: the last character
+has index&nbsp;&minus;1, the character before the last has
+index&nbsp;&minus;2, and so on.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds xxx abcdefgh
+.substring xxx 1 -4
+\*[xxx]
+ &rArr; bcde
+.substring xxx 2
+\*[xxx]
+ &rArr; de
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002estringdown"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.stringdown</code></strong> <var class="def-var-arguments">str</var><a class="copiable-link" href='#index-_002estringdown'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-stringdown"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002estringup"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.stringup</code></strong> <var class="def-var-arguments">str</var><a class="copiable-link" href='#index-_002estringup'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-stringup"></a>
+<a class="index-entry-id" id="index-case_002dtransforming-a-string-_0028stringdown_002c-stringup_0029"></a>
+<a class="index-entry-id" id="index-uppercasing-a-string-_0028stringup_0029"></a>
+<a class="index-entry-id" id="index-lowercasing-a-string-_0028stringdown_0029"></a>
+<a class="index-entry-id" id="index-up_002dcasing-a-string-_0028stringup_0029"></a>
+<a class="index-entry-id" id="index-down_002dcasing-a-string-_0028stringdown_0029"></a>
+<p>Alter the string named <var class="var">str</var> by replacing each of its bytes with its
+lowercase (<code class="code">stringdown</code>) or uppercase (<code class="code">stringup</code>) version (if
+one exists). Special characters in the string will often transform in
+the expected way due to the regular naming convention for accented
+characters. When they do not, use substrings and/or catenation.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds resume R\['e]sum\['e]
+\*[resume]
+.stringdown resume
+\*[resume]
+.stringup resume
+\*[resume]
+ &rArr; Résumé résumé RÉSUMÉ
+</pre></div></div>
+</dd></dl>
+
+<p>(In practice, we would end the <code class="code">ds</code> request with a comment escape
+<code class="code">\&quot;</code> to prevent space from creeping into the definition during
+source document maintenance.)
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ern"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.rn</code></strong> <var class="def-var-arguments">old new</var><a class="copiable-link" href='#index-_002ern'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rn"></a>
+<a class="index-entry-id" id="index-renaming-request-_0028rn_0029"></a>
+<a class="index-entry-id" id="index-request_002c-renaming-_0028rn_0029"></a>
+<a class="index-entry-id" id="index-renaming-macro-_0028rn_0029"></a>
+<a class="index-entry-id" id="index-macro_002c-renaming-_0028rn_0029"></a>
+<a class="index-entry-id" id="index-renaming-string-_0028rn_0029"></a>
+<a class="index-entry-id" id="index-string_002c-renaming-_0028rn_0029"></a>
+<a class="index-entry-id" id="index-renaming-diversion-_0028rn_0029"></a>
+<a class="index-entry-id" id="index-diversion_002c-renaming-_0028rn_0029"></a>
+<p>Rename the request, macro, diversion, or string <var class="var">old</var> to <var class="var">new</var>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002erm"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.rm</code></strong> <var class="def-var-arguments">name</var><a class="copiable-link" href='#index-_002erm'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rm"></a>
+<a class="index-entry-id" id="index-removing-request-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-request_002c-removing-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-removing-macro-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-macro_002c-removing-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-removing-string-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-string_002c-removing-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-removing-diversion-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-diversion_002c-removing-_0028rm_0029"></a>
+<p>Remove the request, macro, diversion, or string <var class="var">name</var>. GNU
+<code class="code">troff</code> treats subsequent invocations as if the name had never
+been defined.
+</p></dd></dl>
+
+<a class="anchor" id="als"></a><dl class="first-deffn">
+<dt class="deffn" id="index-_002eals"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.als</code></strong> <var class="def-var-arguments">new old</var><a class="copiable-link" href='#index-_002eals'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-als"></a>
+<a class="index-entry-id" id="index-alias_002c-string_002c-creating-_0028als_0029"></a>
+<a class="index-entry-id" id="index-alias_002c-macro_002c-creating-_0028als_0029"></a>
+<a class="index-entry-id" id="index-alias_002c-diversion_002c-creating-_0028als_0029"></a>
+<a class="index-entry-id" id="index-creating-alias_002c-for-string-_0028als_0029"></a>
+<a class="index-entry-id" id="index-creating-alias_002c-for-macro-_0028als_0029"></a>
+<a class="index-entry-id" id="index-creating-alias_002c-for-diversion-_0028als_0029"></a>
+<a class="index-entry-id" id="index-string_002c-creating-alias-for-_0028als_0029"></a>
+<a class="index-entry-id" id="index-macro_002c-creating-alias-for-_0028als_0029"></a>
+<a class="index-entry-id" id="index-diversion_002c-creating-alias-for-_0028als_0029"></a>
+<p>Create an alias <var class="var">new</var> for the existing request, string, macro, or
+diversion object named <var class="var">old</var>, causing the names to refer to the same
+stored object. If <var class="var">old</var> is undefined, a warning in category
+&lsquo;<samp class="samp">mac</samp>&rsquo; is produced, and the request is ignored. See <a class="xref" href="#Warnings">Warnings</a>,
+for information about the enablement and suppression of warnings.
+</p>
+<p>To understand how the <code class="code">als</code> request works, consider two different
+storage pools: one for objects (macros, strings, etc.), and another
+for names. As soon as an object is defined, GNU <code class="code">troff</code> adds it to
+the object pool, adds its name to the name pool, and creates a link
+between them. When <code class="code">als</code> creates an alias, it adds a new name to
+the name pool that gets linked to the same object as the old name.
+</p>
+<p>Now consider this example.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de foo
+..
+.
+.als bar foo
+.
+.de bar
+. foo
+..
+.
+.bar
+ error&rarr; input stack limit exceeded (probable infinite
+ error&rarr; loop)
+</pre></div></div>
+
+<p>In the above, <code class="code">bar</code> remains an <em class="emph">alias</em>&mdash;another name
+for&mdash;the object referred to by <code class="code">foo</code>, which the second <code class="code">de</code>
+request replaces. Alternatively, imagine that the <code class="code">de</code> request
+<em class="emph">dereferences</em> its argument before replacing it. Either way, the
+result of calling <code class="code">bar</code> is a recursive loop that finally leads to
+an error. See <a class="xref" href="#Writing-Macros">Writing Macros</a>.
+</p>
+<a class="index-entry-id" id="index-alias_002c-string_002c-removing-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-alias_002c-macro_002c-removing-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-alias_002c-diversion_002c-removing-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-removing-alias_002c-for-string-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-removing-alias_002c-for-macro-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-removing-alias_002c-for-diversion-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-string_002c-removing-alias-for-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-macro_002c-removing-alias-for-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-diversion_002c-removing-alias-for-_0028rm_0029"></a>
+<p>To remove an alias, call <code class="code">rm</code> on its name. The object itself is
+not destroyed until it has no more names.
+</p>
+<p>When a request, macro, string, or diversion is aliased, redefinitions
+and appendments &ldquo;write through&rdquo; alias names. To replace an alias with
+a separately defined object, you must use the <code class="code">rm</code> request on its
+name first.
+</p></dd></dl>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Conditionals-and-Loops">
+<div class="nav-panel">
+<p>
+Next: <a href="#Writing-Macros" accesskey="n" rel="next">Writing Macros</a>, Previous: <a href="#Strings" accesskey="p" rel="prev">Strings</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Conditionals-and-Loops-1">5.23 Conditionals and Loops</h3>
+<a class="index-entry-id" id="index-conditionals-and-loops"></a>
+<a class="index-entry-id" id="index-loops-and-conditionals"></a>
+
+<p><code class="code">groff</code> has <code class="code">if</code> and <code class="code">while</code> control structures like
+other languages. However, the syntax for grouping multiple input lines
+in the branches or bodies of these structures is unusual.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="#Operators-in-Conditionals" accesskey="1">Operators in Conditionals</a></li>
+<li><a href="#if_002dthen" accesskey="2">if-then</a></li>
+<li><a href="#if_002delse" accesskey="3">if-else</a></li>
+<li><a href="#Conditional-Blocks" accesskey="4">Conditional Blocks</a></li>
+<li><a href="#while" accesskey="5">while</a></li>
+</ul>
+<hr>
+<div class="subsection-level-extent" id="Operators-in-Conditionals">
+<div class="nav-panel">
+<p>
+Next: <a href="#if_002dthen" accesskey="n" rel="next">if-then</a>, Previous: <a href="#Conditionals-and-Loops" accesskey="p" rel="prev">Conditionals and Loops</a>, Up: <a href="#Conditionals-and-Loops" accesskey="u" rel="up">Conditionals and Loops</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Operators-in-Conditionals-1">5.23.1 Operators in Conditionals</h4>
+
+<a class="index-entry-id" id="index-if-request_002c-operators-to-use-with"></a>
+<a class="index-entry-id" id="index-ie-request_002c-operators-to-use-with"></a>
+<a class="index-entry-id" id="index-while-request_002c-operators-to-use-with"></a>
+<a class="index-entry-id" id="index-conditional-expressions"></a>
+<a class="index-entry-id" id="index-expressions_002c-conditional"></a>
+<p>In <code class="code">if</code>, <code class="code">ie</code>, and <code class="code">while</code> requests, in addition to the
+numeric expressions described in <a class="ref" href="#Numeric-Expressions">Numeric Expressions</a>, several
+Boolean operators are available; the members of this expanded class are
+termed <em class="dfn">conditional expressions</em>.
+</p>
+<dl class="table">
+<dt><code class="code">c <var class="var">glyph</var></code></dt>
+<dd><p>True if <var class="var">glyph</var> is available, where <var class="var">glyph</var> is an ordinary
+character, a special character &lsquo;<samp class="samp">\(<var class="var">xx</var></samp>&rsquo; or &lsquo;<samp class="samp">\[<var class="var">xxx</var>]</samp>&rsquo;,
+&lsquo;<samp class="samp">\N'<var class="var">xxx</var>'</samp>&rsquo;, or has been defined by any of the <code class="code">char</code>,
+<code class="code">fchar</code>, <code class="code">fschar</code>, or <code class="code">schar</code> requests.
+</p>
+</dd>
+<dt><code class="code">d <var class="var">name</var></code></dt>
+<dd><p>True if a string, macro, diversion, or request called <var class="var">name</var> exists.
+</p>
+</dd>
+<dt><code class="code">e</code></dt>
+<dd><p>True if the current page is even-numbered.
+</p>
+</dd>
+<dt><code class="code">F <var class="var">font</var></code></dt>
+<dd><p>True if <var class="var">font</var> exists. <var class="var">font</var> is handled as if it were opened
+with the <code class="code">ft</code> request (that is, font translation and styles are
+applied), without actually mounting it.
+</p>
+</dd>
+<dt><code class="code">m <var class="var">color</var></code></dt>
+<dd><p>True if <var class="var">color</var> is defined.
+</p>
+</dd>
+<dt id='index-conditional-output-for-terminal-_0028TTY_0029'><span><code class="code">n</code><a class="copiable-link" href='#index-conditional-output-for-terminal-_0028TTY_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-TTY_002c-conditional-output-for"></a>
+<a class="index-entry-id" id="index-terminal_002c-conditional-output-for"></a>
+<p>True if the document is being processed in <code class="code">nroff</code> mode.
+See <a class="xref" href="#troff-and-nroff-Modes"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a>.
+</p>
+</dd>
+<dt><code class="code">o</code></dt>
+<dd><p>True if the current page is odd-numbered.
+</p>
+</dd>
+<dt><code class="code">r <var class="var">register</var></code></dt>
+<dd><p>True if <var class="var">register</var> exists.
+</p>
+</dd>
+<dt><code class="code">S <var class="var">style</var></code></dt>
+<dd><p>True if <var class="var">style</var> is available for the current font family. Font
+translation is applied.
+</p>
+</dd>
+<dt><code class="code">t</code></dt>
+<dd><p>True if the document is being processed in <code class="code">troff</code> mode.
+See <a class="xref" href="#troff-and-nroff-Modes"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a>.
+</p>
+<a class="index-entry-id" id="index-vtroff"></a>
+</dd>
+<dt><code class="code">v</code></dt>
+<dd><p>Always false. This condition is recognized only for compatibility with
+certain other <code class="code">troff</code> implementations.<a class="footnote" id="DOCF88" href="#FOOT88"><sup>88</sup></a>
+</p></dd>
+</dl>
+
+<p>If the first argument to an <code class="code">if</code>, <code class="code">ie</code>, or <code class="code">while</code>
+request begins with a non-alphanumeric character apart from <code class="code">!</code>
+(see below); it performs an <i class="slanted">output comparison test</i>.
+<a class="footnote" id="DOCF89" href="#FOOT89"><sup>89</sup></a>
+</p>
+<a class="index-entry-id" id="index-output-comparison-operator"></a>
+<dl class="table">
+<dt><code class="code"><code class="code">'</code><var class="var">xxx</var><code class="code">'</code><var class="var">yyy</var><code class="code">'</code></code></dt>
+<dd><p>True if formatting the comparands <var class="var">xxx</var> and <var class="var">yyy</var> produces the
+same output commands. The delimiter need not be a neutral apostrophe:
+the output comparison operator accepts the same delimiters as most
+escape sequences; see <a class="ref" href="#Delimiters">Delimiters</a>. This <em class="dfn">output comparison
+operator</em> formats <var class="var">xxx</var> and <var class="var">yyy</var> in separate environments;
+after the comparison, the resulting data are discarded.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ie &quot;|&quot;\fR|\fP&quot; true
+.el false
+ &rArr; true
+</pre></div></div>
+
+<p>The resulting glyph properties, including font family, style, size, and
+slant, must match, but not necessarily the requests and/or escape
+sequences used to obtain them. In the previous example, &lsquo;<samp class="samp">|</samp>&rsquo; and
+&lsquo;<samp class="samp">\fR|\fP</samp>&rsquo; result in &lsquo;<samp class="samp">|</samp>&rsquo; glyphs in the same typefaces at the
+same positions, so the comparands are equal. If &lsquo;<samp class="samp">.ft&nbsp;I</samp>&rsquo; had
+been added before the &lsquo;<samp class="samp">.ie</samp>&rsquo;, they would differ: the first &lsquo;<samp class="samp">|</samp>&rsquo;
+would produce an italic &lsquo;<samp class="samp">|</samp>&rsquo;, not a roman one. Motions must match
+in orientation and magnitude to within the applicable horizontal and
+vertical motion quanta of the device, after rounding. &lsquo;<samp class="samp">.if
+&quot;\u\d&quot;\v'0'&quot;</samp>&rsquo; is false even though both comparands result in zero net
+motion, because motions are not interpreted or optimized but sent as-is
+to the output.<a class="footnote" id="DOCF90" href="#FOOT90"><sup>90</sup></a> On the other hand, &lsquo;<samp class="samp">.if &quot;\d&quot;\v'0.5m'&quot;</samp>&rsquo; is true, because
+<code class="code">\d</code> is defined as a downward motion of one-half em.<a class="footnote" id="DOCF91" href="#FOOT91"><sup>91</sup></a>
+</p>
+<a class="index-entry-id" id="index-string-comparison"></a>
+<a class="index-entry-id" id="index-comparison-of-strings"></a>
+<p>Surround the comparands with <code class="code">\?</code> to avoid formatting them; this
+causes them to be compared character by character, as with string
+comparisons in other programming languages.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ie &quot;\?|\?&quot;\?\fR|\fP\?&quot; true
+.el false
+ &rArr; false
+</pre></div></div>
+
+<a class="index-entry-id" id="index-_005c_003f_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-_005c_003f"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-_005c_003f"></a>
+<p>Since comparands protected with <code class="code">\?</code> are read in copy mode
+(see <a class="pxref" href="#Copy-Mode">Copy Mode</a>), they need not even be valid <code class="code">groff</code> syntax.
+The escape character is still lexically recognized, however, and
+consumes the next character.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds a \[
+.ds b \[
+.if '\?\*a\?'\?\*b\?' a and b equivalent
+.if '\?\\?'\?\\?' backslashes equivalent
+ &rArr; a and b equivalent
+</pre></div></div>
+</dd>
+</dl>
+
+<p>The above operators can&rsquo;t be combined with most others, but a leading
+&lsquo;<samp class="samp">!</samp>&rsquo;, not followed immediately by spaces or tabs, complements an
+expression.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr x 1
+.ie !r x register x is not defined
+.el register x is defined
+ &rArr; register x is defined
+</pre></div></div>
+
+<p>Spaces and tabs are optional immediately after the &lsquo;<samp class="samp">c</samp>&rsquo;, &lsquo;<samp class="samp">d</samp>&rsquo;,
+&lsquo;<samp class="samp">F</samp>&rsquo;, &lsquo;<samp class="samp">m</samp>&rsquo;, &lsquo;<samp class="samp">r</samp>&rsquo;, and &lsquo;<samp class="samp">S</samp>&rsquo; operators, but right after
+&lsquo;<samp class="samp">!</samp>&rsquo;, they end the predicate and the conditional evaluates
+true.<a class="footnote" id="DOCF92" href="#FOOT92"><sup>92</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr x 1
+.ie ! r x register x is not defined
+.el register x is defined
+ &rArr; r x register x is not defined
+</pre></div></div>
+
+<p>The unexpected &lsquo;<samp class="samp">r x</samp>&rsquo; in the output is a clue that our conditional
+was not interpreted as we planned, but matters may not always be so
+obvious.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="if_002dthen">
+<div class="nav-panel">
+<p>
+Next: <a href="#if_002delse" accesskey="n" rel="next">if-else</a>, Previous: <a href="#Operators-in-Conditionals" accesskey="p" rel="prev">Operators in Conditionals</a>, Up: <a href="#Conditionals-and-Loops" accesskey="u" rel="up">Conditionals and Loops</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="if_002dthen-1">5.23.2 if-then</h4>
+<a class="index-entry-id" id="index-if_002dthen"></a>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eif"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.if</code></strong> <var class="def-var-arguments">cond-expr anything</var><a class="copiable-link" href='#index-_002eif'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-if"></a>
+<p>Evaluate the conditional expression <var class="var">cond-expr</var>, and if it evaluates
+true (or to a positive value), interpret the remainder of the line
+<var class="var">anything</var> as if it were an input line. Recall from <a class="ref" href="#Invoking-Requests">Invoking Requests</a> that any quantity of spaces between arguments to requests
+serves only to separate them; leading spaces in <var class="var">anything</var> are thus
+not seen. <var class="var">anything</var> effectively <em class="emph">cannot</em> be omitted; if
+<var class="var">cond-expr</var> is true and <var class="var">anything</var> is empty, the newline at the
+end of the control line is interpreted as a blank input line (and
+therefore a blank text line).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">super\c
+tanker
+.nr force-word-break 1
+super\c
+.if ((\n[force-word-break] = 1) &amp; \n[.int])
+tanker
+ &rArr; supertanker super tanker
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enop"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nop</code></strong> <var class="def-var-arguments">anything</var><a class="copiable-link" href='#index-_002enop'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nop"></a>
+<p>Interpret <var class="var">anything</var> as if it were an input line. This is similar
+to &lsquo;<samp class="samp">.if&nbsp;1</samp>&rsquo;. <code class="code">nop</code> is not really &ldquo;no operation&rdquo;; its
+argument <em class="emph">is</em> processed&mdash;unconditionally. It can be used to cause
+text lines to share indentation with surrounding control lines.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.als real-MAC MAC
+.de wrapped-MAC
+. tm MAC: called with arguments \\$@
+. nop \\*[real-MAC]\\
+..
+.als MAC wrapped-MAC
+\# Later...
+.als MAC real-MAC
+</pre></div></div>
+
+<p>In the above, we&rsquo;ve used aliasing, <code class="code">nop</code>, and the interpolation of
+a macro as a string to interpose a wrapper around the macro &lsquo;<samp class="samp">MAC</samp>&rsquo;
+(perhaps to debug it).
+</p></dd></dl>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="if_002delse">
+<div class="nav-panel">
+<p>
+Next: <a href="#while" accesskey="n" rel="next">while</a>, Previous: <a href="#Operators-in-Conditionals" accesskey="p" rel="prev">Operators in Conditionals</a>, Up: <a href="#Conditionals-and-Loops" accesskey="u" rel="up">Conditionals and Loops</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="if_002delse-1">5.23.3 if-else</h4>
+<a class="index-entry-id" id="index-if_002delse"></a>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eie"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ie</code></strong> <var class="def-var-arguments">cond-expr anything</var><a class="copiable-link" href='#index-_002eie'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ie"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eel"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.el</code></strong> <var class="def-var-arguments">anything</var><a class="copiable-link" href='#index-_002eel'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-el"></a>
+<p>Use the <code class="code">ie</code> and <code class="code">el</code> requests to write an if-then-else. The
+first request is the &ldquo;if&rdquo; part and the latter is the &ldquo;else&rdquo; part.
+Unusually among programming languages, any number of non-conditional
+requests may be interposed between the <code class="code">ie</code> branch and the
+<code class="code">el</code> branch.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a 0
+.ie \na a is non-zero.
+.nr a +1
+.el a was not positive but is now \na.
+ &rArr; a was not positive but is now 1.
+</pre></div></div>
+
+<p>Another way in which <code class="code">el</code> is an ordinary request is that it does
+not lexically &ldquo;bind&rdquo; more tightly to its <code class="code">ie</code> counterpart than it
+does to any other request. This fact can surprise C programmers.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a 1
+.nr z 0
+.ie \nz \
+. ie \na a is true
+. el a is false
+.el z is false
+ error&rarr; warning: unbalanced 'el' request
+ &rArr; a is false
+</pre></div></div>
+
+<p>To conveniently nest conditionals, keep reading.
+</p>
+</dd></dl>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Conditional-Blocks">
+<div class="nav-panel">
+<p>
+Next: <a href="#while" accesskey="n" rel="next">while</a>, Previous: <a href="#Operators-in-Conditionals" accesskey="p" rel="prev">Operators in Conditionals</a>, Up: <a href="#Conditionals-and-Loops" accesskey="u" rel="up">Conditionals and Loops</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Conditional-Blocks-1">5.23.4 Conditional Blocks</h4>
+<a class="index-entry-id" id="index-conditional-blocks"></a>
+<a class="index-entry-id" id="index-blocks_002c-conditional"></a>
+
+<p>It is frequently desirable for a control structure to govern more than
+one request, macro call, text line, or a combination of the foregoing.
+The opening and closing brace escape sequences <code class="code">\{</code> and <code class="code">\}</code>
+define such groups. These <em class="dfn">conditional blocks</em> can furthermore be
+nested.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_007b-2"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\{</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_007b-2'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_007b"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_007d-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\}</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_007d-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_007b-1"></a>
+<a class="index-entry-id" id="index-_005c_007d"></a>
+<a class="index-entry-id" id="index-beginning-of-conditional-block-_0028_005c_007b_0029"></a>
+<a class="index-entry-id" id="index-end-of-conditional-block-_0028_005c_007d_0029"></a>
+<a class="index-entry-id" id="index-conditional-block_002c-beginning-_0028_005c_007b_0029"></a>
+<a class="index-entry-id" id="index-conditional-block_002c-end-_0028_005c_007d_0029"></a>
+<a class="index-entry-id" id="index-block_002c-conditional_002c-beginning-_0028_005c_007b_0029"></a>
+<a class="index-entry-id" id="index-block_002c-conditional_002c-end-_0028_005c_007d_0029"></a>
+<a class="index-entry-id" id="index-brace-escape-sequences-_0028_005c_007b_002c-_005c_007d_0029"></a>
+<a class="index-entry-id" id="index-escape-sequences_002c-brace-_0028_005c_007b_002c-_005c_007d_0029"></a>
+<a class="index-entry-id" id="index-opening-brace-escape-sequence-_0028_005c_007d_0029"></a>
+<a class="index-entry-id" id="index-closing-brace-escape-sequence-_0028_005c_007d_0029"></a>
+<a class="index-entry-id" id="index-brace-escape-sequence_002c-opening-_0028_005c_007d_0029"></a>
+<a class="index-entry-id" id="index-brace-escape-sequence_002c-closing-_0028_005c_007d_0029"></a>
+<p><code class="code">\{</code> begins a conditional block; it must appear (after optional
+spaces and tabs) immediately subsequent to the conditional expression of
+an <code class="code">if</code>, <code class="code">ie</code>, or <code class="code">while</code>
+request,<a class="footnote" id="DOCF93" href="#FOOT93"><sup>93</sup></a> or as the argument to an <code class="code">el</code>
+request.
+</p>
+<p><code class="code">\}</code> ends a condition block and should appear on a line with other
+occurrences of itself as necessary to match <code class="code">\{</code> sequences. It
+can be preceded by a control character, spaces, and tabs. Input after
+any quantity of <code class="code">\}</code> sequences on the same line is processed only
+if all of the preceding conditions to which they correspond are true.
+Furthermore, a <code class="code">\}</code> closing the body of a <code class="code">while</code> request
+must be the last such escape sequence on an input line.
+</p>
+<p>Brace escape sequences outside of control structures have no meaning and
+produce no output.
+</p>
+<p><strong class="strong">Caution:</strong> Input lines using <code class="code">\{</code> often end with
+<code class="code">\RET</code>, especially in macros that consist primarily of control
+lines. Forgetting to use <code class="code">\RET</code> on an input line after <code class="code">\{</code>
+is a common source of error.
+</p></dd></dl>
+
+<p>We might write the following in a page header macro. If we delete
+<code class="code">\RET</code>, the header will carry an unwanted extra empty line (except
+on page&nbsp;1).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.if (\\n[%] != 1) \{\
+. ie ((\\n[%] % 2) = 0) .tl \\*[even-numbered-page-title]
+. el .tl \\*[odd-numbered-page-title]
+.\}
+</pre></div></div>
+
+<p>Let us take a closer look at how conditional blocks nest.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">A
+.if 0 \{ B
+C
+D
+\}E
+F
+ &rArr; A F
+</pre></div></div>
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">N
+.if 1 \{ O
+. if 0 \{ P
+Q
+R\} S\} T
+U
+ &rArr; N O U
+</pre></div></div>
+
+<p>The above behavior may challenge the intuition; it was implemented to
+retain compatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>. For clarity, it
+is idiomatic to end input lines with <code class="code">\{</code> (followed by
+<code class="code">\<kbd class="key">RET</kbd></code> if appropriate), and to precede <code class="code">\}</code> on an input
+line with nothing more than a control character, spaces, tabs, and other
+instances of itself.
+</p>
+<p>We can use <code class="code">ie</code>, <code class="code">el</code>, and conditional blocks to simulate the
+multi-way &ldquo;switch&rdquo; or &ldquo;case&rdquo; control structures of other languages.
+The following example is adapted from the <code class="code">groff</code> <samp class="file">man</samp>
+package. Indentation is used to clarify the logic.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.\&quot; Simulate switch/case in roff.
+. ie '\\$2'1' .ds title General Commands\&quot;
+.el \{.ie '\\$2'2' .ds title System Calls\&quot;
+.el \{.ie '\\$2'3' .ds title Library Functions\&quot;
+.el \{.ie '\\$2'4' .ds title Kernel Interfaces\&quot;
+.el \{.ie '\\$2'5' .ds title File Formats\&quot;
+.el \{.ie '\\$2'6' .ds title Games\&quot;
+.el \{.ie '\\$2'7' .ds title Miscellaneous Information\&quot;
+.el \{.ie '\\$2'8' .ds title System Management\&quot;
+.el \{.ie '\\$2'9' .ds title Kernel Development\&quot;
+.el .ds title \&quot; empty
+.\}\}\}\}\}\}\}\}
+</pre></div></div>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="while">
+<div class="nav-panel">
+<p>
+Previous: <a href="#if_002delse" accesskey="p" rel="prev">if-else</a>, Up: <a href="#Conditionals-and-Loops" accesskey="u" rel="up">Conditionals and Loops</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="while-1">5.23.5 while</h4>
+<a class="index-entry-id" id="index-while"></a>
+
+<p><code class="code">groff</code> provides a looping construct: the <code class="code">while</code> request.
+Its syntax matches the <code class="code">if</code> request.
+</p>
+<a class="index-entry-id" id="index-body_002c-of-a-while-request"></a>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ewhile"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.while</code></strong> <var class="def-var-arguments">cond-expr anything</var><a class="copiable-link" href='#index-_002ewhile'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-while-1"></a>
+<p>Evaluate the conditional expression <var class="var">cond-expr</var>, and repeatedly
+execute <var class="var">anything</var> unless and until <var class="var">cond-expr</var> evaluates false.
+<var class="var">anything</var>, which is often a conditional block, is referred to as
+the <code class="code">while</code> request&rsquo;s <em class="dfn">body</em>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a 0 1
+.while (\na &lt; 9) \{\
+\n+a,
+.\}
+\n+a
+ &rArr; 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
+</pre></div></div>
+
+<a class="index-entry-id" id="index-de-request_002c-and-while"></a>
+<p>GNU <code class="code">troff</code> treats the body of a <code class="code">while</code> request similarly to
+that of a <code class="code">de</code> request (albeit one not read in copy
+mode<a class="footnote" id="DOCF94" href="#FOOT94"><sup>94</sup></a>), but stores it under an internal name
+and deletes it when the loop finishes. The operation of a macro
+containing a <code class="code">while</code> request can slow significantly if the
+<code class="code">while</code> body is large. Each time the macro is executed, the
+<code class="code">while</code> body is parsed and stored again.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de xxx
+. nr num 10
+. while (\\n[num] &gt; 0) \{\
+. \&quot; many lines of code
+. nr num -1
+. \}
+..
+</pre></div></div>
+
+<a class="index-entry-id" id="index-recursive-macros"></a>
+<a class="index-entry-id" id="index-macros_002c-recursive"></a>
+<p>An often better solution&mdash;and one that is more portable, since
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> lacked the <code class="code">while</code> request&mdash;is to
+instead write a recursive macro. It will be parsed only
+once.<a class="footnote" id="DOCF95" href="#FOOT95"><sup>95</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de yyy
+. if (\\n[num] &gt; 0) \{\
+. \&quot; many lines of code
+. nr num -1
+. yyy
+. \}
+..
+.
+.de xxx
+. nr num 10
+. yyy
+..
+</pre></div></div>
+
+<p>To prevent infinite loops, the default number of available recursion
+levels is 1,000 or somewhat less.<a class="footnote" id="DOCF96" href="#FOOT96"><sup>96</sup></a> You can
+disable this protective measure, or raise the limit, by setting the
+<code class="code">slimit</code> register. See <a class="xref" href="#Debugging">Debugging</a>.
+</p>
+<p>As noted above, if a <code class="code">while</code> body begins with a conditional block,
+its closing brace must end an input line.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.if 1 \{\
+. nr a 0 1
+. while (\n[a] &lt; 10) \{\
+. nop \n+[a]
+.\}\}
+ error&rarr; unbalanced brace escape sequences
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ebreak"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.break</code></strong><a class="copiable-link" href='#index-_002ebreak'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-break-2"></a>
+<a class="index-entry-id" id="index-while-request_002c-confusing-with-br"></a>
+<a class="index-entry-id" id="index-break-request_002c-in-a-while-loop"></a>
+<a class="index-entry-id" id="index-continue-request_002c-in-a-while-loop"></a>
+<p>Exit a <code class="code">while</code> loop. Do not confuse this request with a
+typographical break or the <code class="code">br</code> request.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002econtinue"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.continue</code></strong><a class="copiable-link" href='#index-_002econtinue'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-continue"></a>
+<p>Skip the remainder of a <code class="code">while</code> loop&rsquo;s body, immediately starting
+the next iteration.
+</p></dd></dl>
+
+
+
+<hr>
+</div>
+</div>
+<div class="section-level-extent" id="Writing-Macros">
+<div class="nav-panel">
+<p>
+Next: <a href="#Page-Motions" accesskey="n" rel="next">Page Motions</a>, Previous: <a href="#Conditionals-and-Loops" accesskey="p" rel="prev">Conditionals and Loops</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Writing-Macros-1">5.24 Writing Macros</h3>
+<a class="index-entry-id" id="index-writing-macros"></a>
+<a class="index-entry-id" id="index-macros_002c-writing"></a>
+
+<p>A <em class="dfn">macro</em> is a stored collection of text and control lines that can
+be interpolated multiple times. Use macros to define common operations.
+Macros are called in the same way that requests are invoked. While
+requests exist for the purpose of creating macros, simply calling an
+undefined macro, or interpolating it as a string, will cause it to be
+defined as empty. See <a class="xref" href="#Identifiers">Identifiers</a>.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ede"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.de</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">end</i></span>]</var><a class="copiable-link" href='#index-_002ede'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-de"></a>
+<p>Define a macro <var class="var">name</var>, replacing the definition of any existing
+request, macro, string, or diversion called <var class="var">name</var>. If
+<var class="var">name</var> already exists as an alias, the target of the alias is
+redefined; recall <a class="ref" href="#Strings">Strings</a>. GNU <code class="code">troff</code> enters copy
+mode,<a class="footnote" id="DOCF97" href="#FOOT97"><sup>97</sup></a> storing subsequent input lines as the
+macro definition. If the optional second argument is not specified, the
+definition ends with the control line &lsquo;<samp class="samp">..</samp>&rsquo; (two dots).
+Alternatively, <var class="var">end</var> identifies a macro whose call syntax at the
+start of a control line ends the definition of <var class="var">name</var>; <var class="var">end</var> is
+then called normally. A macro definition must end in the same
+conditional block (if any) in which it began (see <a class="pxref" href="#Conditional-Blocks">Conditional Blocks</a>). Spaces or tabs are permitted after the control character in
+the line containing this ending token (either &lsquo;<samp class="samp">.</samp>&rsquo; or
+&lsquo;<samp class="samp"><var class="var">end</var></samp>&rsquo;), but a tab immediately after the token prevents its
+recognition as the end of a macro definition. The macro <var class="var">end</var> can
+be called with arguments.<a class="footnote" id="DOCF98" href="#FOOT98"><sup>98</sup></a>
+</p>
+<p>Here is a small example macro called &lsquo;<samp class="samp">P</samp>&rsquo; that causes a break and
+inserts some vertical space. It could be used to separate paragraphs.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de P
+. br
+. sp .8v
+..
+</pre></div></div>
+
+<p>We can define one macro within another. Attempting to nest &lsquo;<samp class="samp">..</samp>&rsquo;
+naïvely will end the outer definition because the inner definition
+isn&rsquo;t interpreted as such until the outer macro is later interpolated.
+We can use an end macro instead. Each level of nesting should use a
+unique end macro.
+</p>
+<p>An end macro need not be defined until it is called. This fact enables
+a nested macro definition to begin inside one macro and end inside
+another. Consider the following example.<a class="footnote" id="DOCF99" href="#FOOT99"><sup>99</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de m1
+. de m2 m3
+you
+..
+.de m3
+Hello,
+Joe.
+..
+.de m4
+do
+..
+.m1
+know?
+. m3
+What
+.m4
+.m2
+ &rArr; Hello, Joe. What do you know?
+</pre></div></div>
+
+<p>A nested macro definition <em class="emph">can</em> be terminated with &lsquo;<samp class="samp">..</samp>&rsquo; and
+nested macros <em class="emph">can</em> reuse end macros, but these control lines must
+be escaped multiple times for each level of nesting. The necessity of
+this escaping and the utility of nested macro definitions will become
+clearer when we employ macro parameters and consider the behavior of
+copy mode in detail.
+</p></dd></dl>
+
+<p><code class="code">de</code> defines a macro that inherits the compatibility mode
+enablement status of its context (see <a class="pxref" href="#Implementation-Differences">Implementation Differences</a>).
+Often it is desirable to make a macro that uses <code class="code">groff</code> features
+callable from contexts where compatibility mode is on; for instance,
+when writing extensions to a historical macro package. To achieve this,
+compatibility mode needs to be switched off while such a macro is
+interpreted&mdash;without disturbing that state when it is finished.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ede1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.de1</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">end</i></span>]</var><a class="copiable-link" href='#index-_002ede1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-de1"></a>
+<p>The <code class="code">de1</code> request defines a macro to be interpreted with
+compatibility mode disabled. When <var class="var">name</var> is called, compatibility
+mode enablement status is saved; it is restored when the call completes.
+Observe the extra backlash before the interpolation of register
+&lsquo;<samp class="samp">xxx</samp>&rsquo;; we&rsquo;ll explore this subject in <a class="ref" href="#Copy-Mode">Copy Mode</a>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr xxx 12345
+.de aa
+The value of xxx is \\n[xxx].
+. br
+..
+.de1 bb
+The value of xxx is \\n[xxx].
+..
+.cp 1
+.aa
+ error&rarr; warning: register '[' not defined
+ &rArr; The value of xxx is 0xxx].
+.bb
+ &rArr; The value of xxx is 12345.
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002edei"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.dei</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">end</i></span>]</var><a class="copiable-link" href='#index-_002edei'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-dei"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002edei1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.dei1</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">end</i></span>]</var><a class="copiable-link" href='#index-_002edei1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-dei1"></a>
+<p>The <code class="code">dei</code> request defines a macro with its name and end
+macro indirected through strings. That is, it interpolates strings
+named <var class="var">name</var> and <var class="var">end</var> before performing the definition.
+</p>
+<p>The following examples are equivalent.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds xx aa
+.ds yy bb
+.dei xx yy
+</pre></div></div>
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de aa bb
+</pre></div></div>
+
+<p>The <code class="code">dei1</code> request bears the same relationship to <code class="code">dei</code> as
+<code class="code">de1</code> does to <code class="code">de</code>; it temporarily turns compatibility mode
+off when <var class="var">name</var> is called.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eam"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.am</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">end</i></span>]</var><a class="copiable-link" href='#index-_002eam'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-am"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eam1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.am1</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">end</i></span>]</var><a class="copiable-link" href='#index-_002eam1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-am1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eami"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ami</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">end</i></span>]</var><a class="copiable-link" href='#index-_002eami'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ami"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eami1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ami1</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">end</i></span>]</var><a class="copiable-link" href='#index-_002eami1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ami1"></a>
+<a class="index-entry-id" id="index-appending-to-a-macro-_0028am_0029"></a>
+<a class="index-entry-id" id="index-macro_002c-appending-to-_0028am_0029"></a>
+<p><code class="code">am</code> appends subsequent input lines to macro <var class="var">name</var>, extending
+its definition, and otherwise working as <code class="code">de</code> does.
+</p>
+<p>To make the previously defined &lsquo;<samp class="samp">P</samp>&rsquo; macro set indented instead of
+block paragraphs, add the necessary code to the existing macro.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.am P
+.ti +5n
+..
+</pre></div></div>
+
+<p>The other requests are analogous to their &lsquo;<samp class="samp">de</samp>&rsquo; counterparts. The
+<code class="code">am1</code> request turns off compatibility mode during interpretation of
+the appendment. The <code class="code">ami</code> request appends indirectly, meaning that
+strings <var class="var">name</var> and <var class="var">end</var> are interpolated with the resulting
+names used before appending. The <code class="code">ami1</code> request is similar to
+<code class="code">ami</code>, disabling compatibility mode during interpretation of the
+appended lines.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-trace_002etmac"></a>
+<p>Using <samp class="file">trace.tmac</samp>, you can trace calls to <code class="code">de</code>,
+<code class="code">de1</code>, <code class="code">am</code>, and <code class="code">am1</code>. You can also use the
+<code class="code">backtrace</code> request at any point desired to troubleshoot tricky
+spots (see <a class="pxref" href="#Debugging">Debugging</a>).
+</p>
+<p>See <a class="xref" href="#Strings">Strings</a>, for the <code class="code">als</code>, <code class="code">rm</code>, and <code class="code">rn</code> requests to
+create an alias of, remove, and rename a macro, respectively.
+</p>
+<a class="index-entry-id" id="index-object-creation"></a>
+<p>Macro identifiers share their name space with requests, strings, and
+diversions; see <a class="ref" href="#Identifiers">Identifiers</a>. The <code class="code">am</code>, <code class="code">as</code>, <code class="code">da</code>,
+<code class="code">de</code>, <code class="code">di</code>, and <code class="code">ds</code> requests (together with their
+variants) create a new object only if the name of the macro, diversion,
+or string is currently undefined or if it is defined as a request;
+normally, they modify the value of an existing object. See <a class="xref" href="#als">the
+description of the <code class="code">als</code> request</a>, for pitfalls when redefining a
+macro that is aliased.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ereturn"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.return</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">anything</i></span>]</var><a class="copiable-link" href='#index-_002ereturn'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-return"></a>
+<p>Exit a macro, immediately returning to the caller. If called with an
+argument <var class="var">anything</var>, exit twice&mdash;the current macro and the macro
+one level higher. This is used to define a wrapper macro for
+<code class="code">return</code> in <samp class="file">trace.tmac</samp>.
+</p></dd></dl>
+
+
+
+<ul class="mini-toc">
+<li><a href="#Parameters" accesskey="1">Parameters</a></li>
+<li><a href="#Copy-Mode" accesskey="2">Copy Mode</a></li>
+</ul>
+<hr>
+<div class="subsection-level-extent" id="Parameters">
+<div class="nav-panel">
+<p>
+Next: <a href="#Copy-Mode" accesskey="n" rel="next">Copy Mode</a>, Previous: <a href="#Writing-Macros" accesskey="p" rel="prev">Writing Macros</a>, Up: <a href="#Writing-Macros" accesskey="u" rel="up">Writing Macros</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Parameters-1">5.24.1 Parameters</h4>
+<a class="index-entry-id" id="index-parameters"></a>
+
+<p>Macro calls and string interpolations optionally accept a list of
+arguments; recall <a class="ref" href="#Calling-Macros">Calling Macros</a>. At the time such an
+interpolation takes place, these <em class="dfn">parameters</em> can be examined using
+a register and a variety of escape sequences starting with &lsquo;<samp class="samp">\$</samp>&rsquo;.
+All such escape sequences are interpreted even in copy mode, a fact we
+shall motivate and explain below (see <a class="pxref" href="#Copy-Mode">Copy Mode</a>).
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002e_0024_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.$]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002e_0024_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002e_0024"></a>
+<a class="index-entry-id" id="index-parameter-count-register-_0028_002e_0024_0029"></a>
+<p>The count of parameters available to a macro or string is kept in this
+read-only register. The <code class="code">shift</code> request can change its value.
+</p></dd></dl>
+
+<p>Any individual parameter can be accessed by its position in the list of
+arguments to the macro call, numbered from left to right starting at 1,
+with one of the following escape sequences.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0024n"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\$</code><span class="r"><i class="slanted">n</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0024n'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0024"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_0024_0028nn"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\$(</code><span class="r"><i class="slanted">nn</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0024_0028nn'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005c_0024_005bnnn_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\$[</code><span class="r"><i class="slanted">nnn</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005c_0024_005bnnn_005d'> &para;</a></span></dt>
+<dd><p>Interpolate the <var class="var">n</var>th, <var class="var">nn</var>th, or <var class="var">nnn</var>th parameter. The
+first form expects only a single digit (1&le;<var class="var">n</var>&le;9)), the
+second two digits (01&le;<var class="var">nn</var>&le;99)), and the third any
+positive integer <var class="var">nnn</var>. Macros and strings accept an unlimited
+number of parameters.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eshift"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.shift</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">n</i></span>]</var><a class="copiable-link" href='#index-_002eshift'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-shift"></a>
+<p>Shift the parameters <var class="var">n</var> places (1&nbsp;by default). This is a
+&ldquo;left shift&rdquo;: what was parameter&nbsp;<var class="var">i</var> becomes parameter
+<em class="math"><var class="var">i</var>-<var class="var">n</var></em>. The parameters formerly in positions 1
+to&nbsp;<var class="var">n</var> are no longer available. Shifting by a non-positive
+amount performs no operation. The register <code class="code">.$</code> is adjusted
+accordingly.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-copy-mode_002c-and-macro-parameters"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-macro-parameters"></a>
+<a class="index-entry-id" id="index-macro_002c-parameters-_0028_005c_0024_0029"></a>
+<a class="index-entry-id" id="index-parameters_002c-macro-_0028_005c_0024_0029"></a>
+<p>In practice, parameter interpolations are usually seen prefixed with an
+extra escape character. This is because the <code class="code">\$</code> family of escape
+sequences is interpreted even in copy mode.<a class="footnote" id="DOCF100" href="#FOOT100"><sup>100</sup></a>
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0024_002a-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\$*</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0024_002a-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0024_002a"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_0024_0040-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\$@</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0024_0040-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0024_0040"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_0024_005e-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\$^</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0024_005e-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0024_005e"></a>
+<p>In some cases it is convenient to interpolate all of the parameters at
+once (to pass them to a request, for instance). The <code class="code">\$*</code> escape
+concatenates the parameters, separating them with spaces. <code class="code">\$@</code>
+is similar, concatenating the parameters, surrounding each with double
+quotes and separating them with spaces. If not in compatibility mode,
+the interpolation depth of double quotes is preserved (see <a class="pxref" href="#Calling-Macros">Calling Macros</a>). <code class="code">\$^</code> interpolates all parameters as if they were
+arguments to the <code class="code">ds</code> request.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de foo
+. tm $1='\\$1'
+. tm $2='\\$2'
+. tm $*='\\$*'
+. tm $@='\\$@'
+. tm $^='\\$^'
+..
+.foo &quot; This is a &quot;test&quot;
+ error&rarr; $1=' This is a '
+ error&rarr; $2='test&quot;'
+ error&rarr; $*=' This is a test&quot;'
+ error&rarr; $@='&quot; This is a &quot; &quot;test&quot;&quot;'
+ error&rarr; $^='&quot; This is a &quot;test&quot;'
+</pre></div></div>
+
+<p><code class="code">\$*</code> is useful when writing a macro that doesn&rsquo;t need to
+distinguish its arguments, or even to not interpret them; examples
+include macros that produce diagnostic messages by wrapping the
+<code class="code">tm</code> or <code class="code">ab</code> requests. Use <code class="code">\$@</code> when writing a macro
+that may need to shift its parameters and/or wrap a macro or request
+that finds the count significant. If in doubt, prefer <code class="code">\$@</code> to
+<code class="code">\$*</code>. An application of <code class="code">\$^</code> is seen in <samp class="file">trace.tmac</samp>,
+which redefines some requests and macros for debugging purposes.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_00240-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\$0</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_00240-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_00240"></a>
+<a class="index-entry-id" id="index-macro-name-register-_0028_005c_00240_0029"></a>
+<a class="index-entry-id" id="index-als-request_002c-and-_005c_00240"></a>
+<p>Interpolate the name by which the macro being interpreted was called.
+The <code class="code">als</code> request can cause a macro to have more than one name.
+Applying string interpolation to a macro does not change this name.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de foo
+. tm \\$0
+..
+.als bar foo
+.
+.de aaa
+. foo
+..
+.de bbb
+. bar
+..
+.de ccc
+\\*[foo]\\
+..
+.de ddd
+\\*[bar]\\
+..
+.
+.aaa
+ error&rarr; foo
+.bbb
+ error&rarr; bar
+.ccc
+ error&rarr; ccc
+.ddd
+ error&rarr; ddd
+</pre></div></div>
+</dd></dl>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Copy-Mode">
+<div class="nav-panel">
+<p>
+Previous: <a href="#Parameters" accesskey="p" rel="prev">Parameters</a>, Up: <a href="#Writing-Macros" accesskey="u" rel="up">Writing Macros</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Copy-Mode-1">5.24.2 Copy Mode</h4>
+<a class="index-entry-id" id="index-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode-1"></a>
+<a class="index-entry-id" id="index-mode_002c-copy"></a>
+<a class="index-entry-id" id="index-mode_002c-copy-1"></a>
+
+<a class="index-entry-id" id="index-_005cn_002c-when-reading-text-for-a-macro"></a>
+<a class="index-entry-id" id="index-_005c_0024_002c-when-reading-text-for-a-macro"></a>
+<a class="index-entry-id" id="index-_005c_002a_002c-when-reading-text-for-a-macro"></a>
+<a class="index-entry-id" id="index-_005cRET_002c-when-reading-text-for-a-macro"></a>
+<p>When GNU <code class="code">troff</code> processes certain requests, most importantly those
+which define or append to a macro or string, it does so in <em class="dfn">copy
+mode</em>: it copies the characters of the definition into a dedicated
+storage region, interpolating the escape sequences <code class="code">\n</code>, <code class="code">\g</code>,
+<code class="code">\$</code>, <code class="code">\*</code>, <code class="code">\V</code>, and <code class="code">\?</code> normally; interpreting
+<code class="code">\<kbd class="key">RET</kbd></code> immediately; discarding comments <code class="code">\&quot;</code> and
+<code class="code">\#</code>; interpolating the current leader, escape, or tab character
+with <code class="code">\a</code>, <code class="code">\e</code>, and <code class="code">\t</code>, respectively; and storing all
+other escape sequences in an encoded form.
+</p>
+<a class="index-entry-id" id="index-interpretation-mode"></a>
+<a class="index-entry-id" id="index-mode_002c-interpretation"></a>
+<p>The complement of copy mode&mdash;a <code class="code">roff</code> formatter&rsquo;s behavior when
+not defining or appending to a macro, string, or diversion&mdash;where all
+macros are interpolated, requests invoked, and valid escape sequences
+processed immediately upon recognition, can be termed
+<em class="dfn">interpretation mode</em>.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_005c-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\\</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_005c-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_005c"></a>
+<p>The escape character, <code class="code">\</code> by default, can escape itself. This
+enables you to control whether a given <code class="code">\n</code>, <code class="code">\g</code>, <code class="code">\$</code>,
+<code class="code">\*</code>, <code class="code">\V</code>, or <code class="code">\?</code> escape sequence is interpreted at the
+time the macro containing it is defined, or later when the macro is
+called.<a class="footnote" id="DOCF101" href="#FOOT101"><sup>101</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr x 20
+.de y
+.nr x 10
+\&amp;\nx
+\&amp;\\nx
+..
+.y
+ &rArr; 20 10
+</pre></div></div>
+
+<p>You can think of <code class="code">\\</code> as a &ldquo;delayed&rdquo; backslash; it is the escape
+character followed by a backslash from which the escape character has
+removed its special meaning. Consequently, &lsquo;<samp class="samp">\\</samp>&rsquo; is not an escape
+sequence in the usual sense. In any escape sequence &lsquo;<samp class="samp">\<var class="var">X</var></samp>&rsquo;
+that GNU <code class="code">troff</code> does not recognize, the escape character is
+ignored and <var class="var">X</var> is output. An unrecognized escape sequence causes
+a warning in category &lsquo;<samp class="samp">escape</samp>&rsquo;, with two exceptions&mdash;&lsquo;<samp class="samp">\\</samp>&rsquo; is
+the first.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-_005c_005c_002c-when-reading-text-for-a-macro"></a>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002e-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\.</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_002e-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_002e"></a>
+<p><code class="code">\.</code> escapes the control character. It is similar to <code class="code">\\</code> in
+that it isn&rsquo;t a true escape sequence. It is used to permit nested macro
+definitions to end without a named macro call to conclude them. Without
+a syntax for escaping the control character, this would not be possible.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de m1
+foo
+.
+. de m2
+bar
+\\..
+.
+..
+.m1
+.m2
+ &rArr; foo bar
+</pre></div></div>
+
+<p>The first backslash is consumed while the macro is read, and the second
+is interpreted when macro <code class="code">m1</code> is called.
+</p></dd></dl>
+
+<p><code class="code">roff</code> documents should not use the <code class="code">\\</code> or <code class="code">\.</code>
+character sequences outside of copy mode; they serve only to obfuscate
+the input. Use <code class="code">\e</code> to represent the escape character,
+<code class="code">\[rs]</code> to obtain a backslash glyph, and <code class="code">\&amp;</code> before &lsquo;<samp class="samp">.</samp>&rsquo;
+and &lsquo;<samp class="samp">'</samp>&rsquo; where GNU <code class="code">troff</code> expects them as control characters
+if you mean to use them literally (recall <a class="ref" href="#Requests-and-Macros">Requests and Macros</a>).
+</p>
+<p>Macro definitions can be nested to arbitrary depth. The mechanics of
+parsing the escape character have significant consequences for this
+practice.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de M1
+\\$1
+. de M2
+\\\\$1
+. de M3
+\\\\\\\\$1
+\\\\..
+. M3 hand.
+\\..
+. M2 of
+..
+This understeer is getting
+.M1 out
+ &rArr; This understeer is getting out of hand.
+</pre></div></div>
+
+<p>Each escape character is interpreted twice&mdash;once in copy mode, when the
+macro is defined, and once in interpretation mode, when the macro is
+called. As seen above, this fact leads to exponential growth in the
+quantity of escape characters required to delay interpolation of
+<code class="code">\n</code>, <code class="code">\g</code>, <code class="code">\$</code>, <code class="code">\*</code>, <code class="code">\V</code>, and <code class="code">\?</code> at
+each nesting level, which can be daunting. GNU <code class="code">troff</code> offers a
+solution.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cE-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\E</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cE-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cE"></a>
+<p><code class="code">\E</code> represents an escape character that is not interpreted in copy
+mode. You can use it to ease the writing of nested macro definitions.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de M1
+. nop \E$1
+. de M2
+. nop \E$1
+. de M3
+. nop \E$1
+\\\\..
+. M3 better.
+\\..
+. M2 bit
+..
+This vehicle handles
+.M1 a
+ &rArr; This vehicle handles a bit better.
+</pre></div></div>
+
+<p>Observe that because <code class="code">\.</code> is not a true escape sequence, we can&rsquo;t
+use <code class="code">\E</code> to keep &lsquo;<samp class="samp">..</samp>&rsquo; from ending a macro definition
+prematurely. If the multiplicity of backslashes complicates
+maintenance, use end macros.
+</p>
+<p><code class="code">\E</code> is also convenient to define strings containing escape
+sequences that need to work when used in copy mode (for example, as
+macro arguments), or which will be interpolated at varying macro nesting
+depths. We might define strings to begin and end superscripting
+as follows.<a class="footnote" id="DOCF102" href="#FOOT102"><sup>102</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds { \v'-.9m\s'\En[.s]*7u/10u'+.7m'
+.ds } \v'-.7m\s0+.9m'
+</pre></div></div>
+
+<p>When the <code class="code">ec</code> request is used to redefine the escape character,
+<code class="code">\E</code> also makes it easier to distinguish the semantics of an escape
+character from the other meaning(s) its character might have. Consider
+the use of an unusual escape character, &lsquo;<samp class="samp">-</samp>&rsquo;.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a 1
+.ec -
+.de xx
+--na
+..
+.xx
+ &rArr; -na
+</pre></div></div>
+
+<p>This result may surprise you; some people expect &lsquo;<samp class="samp">1</samp>&rsquo; to be output
+since register &lsquo;<samp class="samp">a</samp>&rsquo; has clearly been defined with that value. What
+has happened? The robotic replacement of &lsquo;<samp class="samp">\</samp>&rsquo; with &lsquo;<samp class="samp">-</samp>&rsquo; has led
+us astray. You might recognize the sequence &lsquo;<samp class="samp">--</samp>&rsquo; more readily with
+the default escape character as &lsquo;<samp class="samp">\-</samp>&rsquo;, the special character escape
+sequence for the minus sign glyph.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a 1
+.ec -
+.de xx
+-Ena
+..
+.xx
+ &rArr; 1
+</pre></div></div>
+</dd></dl>
+
+
+
+<hr>
+</div>
+</div>
+<div class="section-level-extent" id="Page-Motions">
+<div class="nav-panel">
+<p>
+Next: <a href="#Drawing-Geometric-Objects" accesskey="n" rel="next">Drawing Geometric Objects</a>, Previous: <a href="#Writing-Macros" accesskey="p" rel="prev">Writing Macros</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Page-Motions-1">5.25 Page Motions</h3>
+<a class="index-entry-id" id="index-page-motions"></a>
+<a class="index-entry-id" id="index-motions_002c-page"></a>
+
+<p>See <a class="xref" href="#Manipulating-Spacing">Manipulating Spacing</a>, for a discussion of the most commonly used
+request for vertical motion, <code class="code">sp</code>, which spaces downward by one
+vee.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002emk"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.mk</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">reg</i></span>]</var><a class="copiable-link" href='#index-_002emk'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-mk"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002ert"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.rt</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">dist</i></span>]</var><a class="copiable-link" href='#index-_002ert'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rt"></a>
+<a class="index-entry-id" id="index-marking-vertical-page-location-_0028mk_0029"></a>
+<a class="index-entry-id" id="index-page-location_002c-vertical_002c-marking-_0028mk_0029"></a>
+<a class="index-entry-id" id="index-location_002c-vertical_002c-page_002c-marking-_0028mk_0029"></a>
+<a class="index-entry-id" id="index-vertical-page-location_002c-marking-_0028mk_0029"></a>
+<a class="index-entry-id" id="index-returning-to-marked-vertical-page-location-_0028rt_0029"></a>
+<a class="index-entry-id" id="index-page-location_002c-vertical_002c-returning-to-marked-_0028rt_0029"></a>
+<a class="index-entry-id" id="index-location_002c-vertical_002c-page_002c-returning-to-marked-_0028rt_0029"></a>
+<a class="index-entry-id" id="index-vertical-page-location_002c-returning-to-marked-_0028rt_0029"></a>
+<p>You can <em class="dfn">mark</em> a location on a page for subsequent <em class="dfn">return</em>.
+<code class="code">mk</code> takes an argument, a register name in which to store the
+current page location. If given no argument, it stores the location in
+an internal register. This location can be used later by the <code class="code">rt</code>
+or the <code class="code">sp</code> requests (or the <code class="code">\v</code> escape).
+</p>
+<p>The <code class="code">rt</code> request returns <em class="emph">upward</em> to the location marked with
+the last <code class="code">mk</code> request. If used with an argument, it returns to a
+vertical position&nbsp;<var class="var">dist</var> from the top of the page (no previous
+call to <code class="code">mk</code> is necessary in this case). The default scaling
+unit is &lsquo;<samp class="samp">v</samp>&rsquo;.
+</p>
+<p>If a page break occurs between a <code class="code">mk</code> request and its matching
+<code class="code">rt</code> request, the <code class="code">rt</code> request is silently ignored.
+</p>
+<p>A simple implementation of a macro to set text in two columns follows.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr column-length 1.5i
+.nr column-gap 4m
+.nr bottom-margin 1m
+.
+.de 2c
+. br
+. mk
+. ll \\n[column-length]u
+. wh -\\n[bottom-margin]u 2c-trap
+. nr right-side 0
+..
+.
+.de 2c-trap
+. ie \\n[right-side] \{\
+. nr right-side 0
+. po -(\\n[column-length]u + \\n[column-gap]u)
+. \&quot; remove trap
+. wh -\\n[bottom-margin]u
+. \}
+. el \{\
+. \&quot; switch to right side
+. nr right-side 1
+. po +(\\n[column-length]u + \\n[column-gap]u)
+. rt
+. \}
+..
+</pre></div></div>
+
+<p>Now let us apply our two-column macro.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.pl 1.5i
+.ll 4i
+This is a small test that shows how the
+rt request works in combination with mk.
+
+.2c
+Starting here, text is typeset in two columns.
+Note that this implementation isn't robust
+and thus not suited for a real two-column
+macro.
+ &rArr; This is a small test that shows how the
+ &rArr; rt request works in combination with mk.
+ &rArr;
+ &rArr; Starting here, isn't robust
+ &rArr; text is typeset and thus not
+ &rArr; in two columns. suited for a
+ &rArr; Note that this real two-column
+ &rArr; implementation macro.
+</pre></div></div>
+</dd></dl>
+
+<p>Several escape sequences enable fine control of movement about the page.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cv_0027expr_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\v<code class="code">'</code></code><span class="r"><i class="slanted">expr</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cv_0027expr_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cv"></a>
+<a class="index-entry-id" id="index-vertical-motion-_0028_005cv_0029"></a>
+<a class="index-entry-id" id="index-motion_002c-vertical-_0028_005cv_0029"></a>
+<p>Vertically move the drawing position. <var class="var">expr</var> indicates the
+magnitude of motion: positive is downward and and negative upward. The
+default scaling unit is &lsquo;<samp class="samp">v</samp>&rsquo;. The motion is relative to the current
+drawing position unless <var class="var">expr</var> begins with the boundary-relative
+motion operator &lsquo;<samp class="samp">|</samp>&rsquo;. See <a class="xref" href="#Numeric-Expressions">Numeric Expressions</a>.
+</p>
+<p>Text processing continues at the new drawing position; usually, vertical
+motions should be in balanced pairs to avoid a confusing page layout.
+</p>
+<p><code class="code">\v</code> will not spring a vertical position trap. This can be useful;
+for example, consider a page bottom trap macro that prints a marker in
+the margin to indicate continuation of a footnote. See <a class="xref" href="#Traps">Traps</a>.
+</p></dd></dl>
+
+<p>A few escape sequences that produce vertical motion are unusual. They
+are thought to originate early in AT&amp;T <code class="code">nroff</code> history to achieve
+super- and subscripting by half-line motions on line printers and
+teletypewriters before the phototypesetter made more precise positioning
+available. They are reckoned in ems&mdash;not vees&mdash;to maintain continuity
+with their original purpose of moving relative to the size of the type
+rather than the distance between text baselines (vees).<a class="footnote" id="DOCF103" href="#FOOT103"><sup>103</sup></a>
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cr-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\r</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cr-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cr"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cu-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\u</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cu-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cu"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cd-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\d</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cd-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cd"></a>
+<p>Move upward&nbsp;1<span class="dmn">m</span>, upward&nbsp;.5<span class="dmn">m</span>, and
+downward&nbsp;.5<span class="dmn">m</span>, respectively.
+</p></dd></dl>
+
+<p>Let us see these escape sequences in use.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">Obtain 100 cm\u3\d of \ka\d\092\h'|\nau'\r233\dU.
+</pre></div></div>
+
+<p>In the foregoing we have paired <code class="code">\u</code> and <code class="code">\d</code> to typeset a
+superscript, and later a full em negative (&ldquo;reverse&rdquo;) motion to place
+a superscript above a subscript. A numeral-width horizontal motion
+escape sequence aligns the proton and nucleon numbers, while <code class="code">\k</code>
+marks a horizontal position to which <code class="code">\h</code> returns so that we could
+stack them. (We shall discuss these horizontal motion escape sequences
+presently.) In serious applications, we often want to alter the type
+size of the -scripts and to fine-tune the vertical motions, as the
+<code class="code">groff</code> <samp class="file">ms</samp> package does with its super- and subscripting
+string definitions.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005ch_0027expr_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\h<code class="code">'</code></code><span class="r"><i class="slanted">expr</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005ch_0027expr_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005ch"></a>
+<a class="index-entry-id" id="index-inserting-horizontal-space-_0028_005ch_0029"></a>
+<a class="index-entry-id" id="index-horizontal-space-_0028_005ch_0029"></a>
+<a class="index-entry-id" id="index-space_002c-horizontal-_0028_005ch_0029"></a>
+<a class="index-entry-id" id="index-horizontal-motion-_0028_005ch_0029"></a>
+<a class="index-entry-id" id="index-motion_002c-horizontal-_0028_005ch_0029"></a>
+<p>Horizontally move the drawing position. <var class="var">expr</var> indicates the
+magnitude of motion: positive is rightward and negative leftward. The
+default scaling unit is &lsquo;<samp class="samp">m</samp>&rsquo;. The motion is relative to the current
+drawing position unless <var class="var">expr</var> begins with the boundary-relative
+motion operator &lsquo;<samp class="samp">|</samp>&rsquo;. See <a class="xref" href="#Numeric-Expressions">Numeric Expressions</a>.
+</p></dd></dl>
+
+<p>The following string definition sets the TeX
+logo.<a class="footnote" id="DOCF104" href="#FOOT104"><sup>104</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds TeX T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X\&quot;
+</pre></div></div>
+
+<p>There are a number of special-case escape sequences for horizontal
+motion.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cSP-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\<kbd class="key">SP</kbd></code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cSP-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cSP"></a>
+<a class="index-entry-id" id="index-space_002c-unbreakable-and-unadjustable-_0028_005cSP_0029"></a>
+<a class="index-entry-id" id="index-unbreakable-and-unadjustable-space-_0028_005cSP_0029"></a>
+<a class="index-entry-id" id="index-unadjustable-and-unbreakable-space-_0028_005cSP_0029"></a>
+<a class="index-entry-id" id="index-_005cspace"></a>
+<p>Move right one word space. (The input is a backslash followed by a
+space.) This escape sequence can be thought of as a non-adjustable,
+unbreakable space. Usually you want <code class="code">\~</code> instead; see
+<a class="ref" href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a>.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-thin-space-_0028_005c_007c_0029"></a>
+<a class="index-entry-id" id="index-space_002c-thin-_0028_005c_007c_0029"></a>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_007c-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\|</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_007c-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_007c"></a>
+<p>Move one-sixth <span class="dmn">em</span> to the right on typesetting output devices. If
+a glyph named &lsquo;<samp class="samp">\|</samp>&rsquo; is defined in the current font, its width is
+used instead, even on terminal output devices.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-hair-space-_0028_005c_005e_0029"></a>
+<a class="index-entry-id" id="index-space_002c-hair-_0028_005c_005e_0029"></a>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_005e-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\^</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_005e-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_005e"></a>
+<p>Move one-twelfth <span class="dmn">em</span> to the right on typesetting output devices.
+If a glyph named &lsquo;<samp class="samp">\^</samp>&rsquo; is defined in the current font, its width is
+used instead, even on terminal output devices.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c0-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\0</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c0-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c0"></a>
+<a class="index-entry-id" id="index-space_002c-width-of-a-digit-_0028numeral_0029-_0028_005c0_0029"></a>
+<a class="index-entry-id" id="index-digit_002dwidth-space-_0028_005c0_0029"></a>
+<a class="index-entry-id" id="index-figure-space-_0028_005c0_0029"></a>
+<a class="index-entry-id" id="index-numeral_002dwidth-space-_0028_005c0_0029"></a>
+<p>Move right by the width of a numeral in the current font.
+</p></dd></dl>
+
+<p>Horizontal motions are not discarded at the end of an output line as
+word spaces are. See <a class="xref" href="#Breaking">Breaking</a>.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cw_0027anything_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\w<code class="code">'</code></code><span class="r"><i class="slanted">anything</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cw_0027anything_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cw"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005bst_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[st]</code></strong><a class="copiable-link" href='#index-_005cn_005bst_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-st"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005bsb_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[sb]</code></strong><a class="copiable-link" href='#index-_005cn_005bsb_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-sb"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005brst_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[rst]</code></strong><a class="copiable-link" href='#index-_005cn_005brst_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rst"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005brsb_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[rsb]</code></strong><a class="copiable-link" href='#index-_005cn_005brsb_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rsb"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005bct_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[ct]</code></strong><a class="copiable-link" href='#index-_005cn_005bct_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ct"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005bssc_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[ssc]</code></strong><a class="copiable-link" href='#index-_005cn_005bssc_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ssc"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005bskw_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[skw]</code></strong><a class="copiable-link" href='#index-_005cn_005bskw_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-skw"></a>
+<a class="index-entry-id" id="index-width-escape-_0028_005cw_0029"></a>
+<p>Interpolate the width of <var class="var">anything</var> in basic units. This escape
+sequence allows several properties of formatted output to be measured
+without writing it out.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">The length of the string 'abc' is \w'abc'u.
+ &rArr; The length of the string 'abc' is 72u.
+</pre></div></div>
+
+<a class="index-entry-id" id="index-dummy-environment_002c-used-by-_005cw-escape-sequence"></a>
+<a class="index-entry-id" id="index-environment_002c-dummy_002c-used-by-_005cw-escape-sequence"></a>
+<p><var class="var">anything</var> is processed in a dummy environment: this means that
+font and type size changes, for example, may occur within it without
+affecting subsequent output.
+</p>
+<p>After each use, <code class="code">\w</code> sets several registers.
+</p>
+<a class="index-entry-id" id="index-CSTR-_002354-errata-5"></a>
+<a class="index-entry-id" id="index-CSTR-_002354-erratum_002c-sb-register"></a>
+<a class="index-entry-id" id="index-CSTR-_002354-erratum_002c-st-register"></a>
+<dl class="table">
+<dt><code class="code">st</code></dt>
+<dt><code class="code">sb</code></dt>
+<dd><p>The maximum vertical displacements of the text baseline above and below,
+respectively. The sign convention is opposite that of relative vertical
+motions; that is, depth below the (original) baseline is negative.
+These registers are incorrectly documented in the <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code> manual as &ldquo;the highest and lowest extent of [the argument
+to <code class="code">\w</code>] relative to the baseline&rdquo;.
+</p>
+</dd>
+<dt><code class="code">rst</code></dt>
+<dt><code class="code">rsb</code></dt>
+<dd><p>Like <code class="code">st</code> and <code class="code">sb</code>, but taking account of the heights and
+depths of glyphs. In other words, these registers store the highest and
+lowest vertical positions attained by <var class="var">anything</var>, doing what
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> documented <code class="code">st</code> and <code class="code">sb</code> as doing.
+</p>
+</dd>
+<dt><code class="code">ct</code></dt>
+<dd><p>Characterizes the geometry of glyphs occurring in <var class="var">anything</var>.
+</p>
+<dl class="table">
+<dt>0</dt>
+<dd><p>only short glyphs, no descenders or tall glyphs
+</p>
+</dd>
+<dt>1</dt>
+<dd><p>at least one descender
+</p>
+</dd>
+<dt>2</dt>
+<dd><p>at least one tall glyph
+</p>
+</dd>
+<dt>3</dt>
+<dd><p>at least one each of a descender and a tall glyph
+</p></dd>
+</dl>
+
+</dd>
+<dt><code class="code">ssc</code></dt>
+<dd><p>The amount of horizontal space (possibly negative) that should be added
+to the last glyph before a subscript.
+</p>
+</dd>
+<dt><code class="code">skw</code></dt>
+<dd><p>How far to right of the center of the last glyph in the <code class="code">\w</code>
+argument, the center of an accent from a roman font should be placed
+over that glyph.
+</p></dd>
+</dl>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005ckp"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\k</code><span class="r"><i class="slanted">p</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005ckp'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005ck"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005ck_0028ps"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\k(</code><span class="r"><i class="slanted">ps</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005ck_0028ps'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005ck_005bposition_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\k[</code><span class="r"><i class="slanted">position</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005ck_005bposition_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-saving-horizontal-input-line-position-_0028_005ck_0029"></a>
+<a class="index-entry-id" id="index-horizontal-input-line-position_002c-saving-_0028_005ck_0029"></a>
+<a class="index-entry-id" id="index-input-line-position_002c-horizontal_002c-saving-_0028_005ck_0029"></a>
+<a class="index-entry-id" id="index-position_002c-horizontal-input-line_002c-saving-_0028_005ck_0029"></a>
+<a class="index-entry-id" id="index-line_002c-input_002c-horizontal-position_002c-saving-_0028_005ck_0029"></a>
+<p>Store the current horizontal position in the <em class="emph">input</em> line in a
+register with the name <var class="var">position</var> (one-character name&nbsp;<var class="var">p</var>,
+two-character name <var class="var">ps</var>). Use this, for example, to return to the
+beginning of a string for highlighting or other decoration.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bhp_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[hp]</code></strong><a class="copiable-link" href='#index-_005cn_005bhp_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hp"></a>
+<a class="index-entry-id" id="index-horizontal-input-line-position-register-_0028hp_0029"></a>
+<a class="index-entry-id" id="index-input-line_002c-horizontal-position_002c-register-_0028hp_0029"></a>
+<a class="index-entry-id" id="index-position_002c-horizontal_002c-in-input-line_002c-register-_0028hp_0029"></a>
+<a class="index-entry-id" id="index-line_002c-input_002c-horizontal-position_002c-register-_0028hp_0029"></a>
+<p>The current horizontal position at the input line.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002ek_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.k]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ek_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ek"></a>
+<a class="index-entry-id" id="index-horizontal-output-line-position-register-_0028_002ek_0029"></a>
+<a class="index-entry-id" id="index-output-line_002c-horizontal-position_002c-register-_0028_002ek_0029"></a>
+<a class="index-entry-id" id="index-position_002c-horizontal_002c-in-output-line_002c-register-_0028_002ek_0029"></a>
+<a class="index-entry-id" id="index-line_002c-output_002c-horizontal-position_002c-register-_0028_002ek_0029"></a>
+<p>A read-only register containing the current horizontal output position
+(relative to the current indentation).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005co_0027abc_2026_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\o<code class="code">'</code></code><span class="r"><i class="slanted">abc&hellip;</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005co_0027abc_2026_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005co"></a>
+<a class="index-entry-id" id="index-overstriking-glyphs-_0028_005co_0029"></a>
+<a class="index-entry-id" id="index-glyphs_002c-overstriking-_0028_005co_0029"></a>
+<p>Overstrike the glyphs of characters <var class="var">a</var>, <var class="var">b</var>, <var class="var">c</var>, &hellip;;
+the glyphs are centered, written, and the drawing position advanced by
+the widest of the glyphs.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005czc"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\z</code><span class="r"><i class="slanted">c</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005czc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cz"></a>
+<a class="index-entry-id" id="index-zero_002dwidth-printing-_0028_005cz_002c-_005cZ_0029"></a>
+<a class="index-entry-id" id="index-printing_002c-zero_002dwidth-_0028_005cz_002c-_005cZ_0029"></a>
+<p>Format the character <var class="var">c</var> with zero width; that is, without advancing
+the drawing position. Use <code class="code">\z</code> to overstrike glyphs aligned to
+their left edges, in contrast to <code class="code">\o</code>&rsquo;s centering.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cZ_0027anything_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\Z<code class="code">'</code></code><span class="r"><i class="slanted">anything</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cZ_0027anything_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cZ"></a>
+<a class="index-entry-id" id="index-zero_002dwidth-printing-_0028_005cz_002c-_005cZ_0029-1"></a>
+<a class="index-entry-id" id="index-printing_002c-zero_002dwidth-_0028_005cz_002c-_005cZ_0029-1"></a>
+<p>Save the drawing position, format <var class="var">anything</var>, then restore it. Tabs
+and leaders in the argument are ignored with an error diagnostic.
+</p>
+<p>We might implement a strike-through macro thus.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de ST
+.nr width \w'\\$1'
+\Z@\v'-.25m'\l'\\n[width]u'@\\$1
+..
+.
+This is
+.ST &quot;a test&quot;
+an actual emergency!
+</pre></div></div>
+</dd></dl>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Drawing-Geometric-Objects">
+<div class="nav-panel">
+<p>
+Next: <a href="#Traps" accesskey="n" rel="next">Traps</a>, Previous: <a href="#Page-Motions" accesskey="p" rel="prev">Page Motions</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Drawing-Geometric-Objects-1">5.26 Drawing Geometric Objects</h3>
+<a class="index-entry-id" id="index-drawing-requests"></a>
+<a class="index-entry-id" id="index-requests-for-drawing"></a>
+
+<p>A few of the formatter&rsquo;s escape sequences draw lines and other geometric
+objects. Combined with each other and with page motion commands
+(see <a class="pxref" href="#Page-Motions">Page Motions</a>), a wide variety of figures is possible. For
+complex drawings, these operations can be cumbersome; the preprocessors
+<code class="code">gpic</code> or <code class="code">ggrn</code> are typically used instead.
+</p>
+<p>The <code class="code">\l</code> and <code class="code">\L</code> escape sequences draw horizontal and
+vertical sequences of glyphs, respectively. Even the simplest of
+output devices supports them.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cl_0027l_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\l<code class="code">'</code></code><span class="r"><i class="slanted">l</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cl_0027l_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cl"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cl_0027lc_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\l<code class="code">'</code></code><span class="r"><i class="slanted">lc</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cl_0027lc_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-drawing-horizontal-lines-_0028_005cl_0029"></a>
+<a class="index-entry-id" id="index-horizontal-line_002c-drawing-_0028_005cl_0029"></a>
+<a class="index-entry-id" id="index-line_002c-horizontal_002c-drawing-_0028_005cl_0029"></a>
+<p>Draw a horizontal line of length <var class="var">l</var> from the drawing position.
+Rightward motion is positive. Afterward, the drawing position is at the
+right end of the line. The default scaling unit is &lsquo;<samp class="samp">m</samp>&rsquo;.
+</p>
+<a class="index-entry-id" id="index-baseline-rule-special-character_0028_005c_005bru_005d_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-underscore-_0028_005c_005bru_005d_0029"></a>
+<a class="index-entry-id" id="index-line-drawing-glyph"></a>
+<a class="index-entry-id" id="index-glyph_002c-for-line-drawing"></a>
+<p>The optional second parameter&nbsp;<var class="var">c</var> is a character with which to
+draw the line. The default is the baseline rule special character,
+<code class="code">\[ru]</code>.
+</p>
+<a class="index-entry-id" id="index-dummy-character-_0028_005c_0026_0029_002c-effect-on-_005cl-escape-sequence"></a>
+<a class="index-entry-id" id="index-character_002c-dummy-_0028_005c_0026_0029_002c-effect-on-_005cl-escape-sequence"></a>
+<p>If <var class="var">c</var> is a valid scaling unit, put <code class="code">\&amp;</code> after <var class="var">l</var> to
+disambiguate the input.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de textbox
+\[br]\\$*\[br]\l'|0\[rn]'\l'|0\[ul]'
+..
+</pre></div></div>
+
+<p>The foregoing outputs a box rule (a vertical line), the text
+argument(s), and another box rule. We employ the boundary-relative
+motion operator &lsquo;<samp class="samp">|</samp>&rsquo;. Finally, the line-drawing escape sequences
+draw a radical extender (a form of overline) and an underline from the
+drawing position to the position coresponding to beginning of the
+<em class="emph">input</em> line. The drawing position returns to just after the
+right-hand box rule because the lengths of the drawn lines are negative,
+as noted above.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cL_0027l_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\L<code class="code">'</code></code><span class="r"><i class="slanted">l</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cL_0027l_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cL"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cL_0027lc_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\L<code class="code">'</code></code><span class="r"><i class="slanted">lc</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cL_0027lc_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-drawing-vertical-lines-_0028_005cL_0029"></a>
+<a class="index-entry-id" id="index-vertical-line-drawing-_0028_005cL_0029"></a>
+<a class="index-entry-id" id="index-line_002c-vertical_002c-drawing-_0028_005cL_0029"></a>
+<a class="index-entry-id" id="index-line-drawing-glyph-1"></a>
+<a class="index-entry-id" id="index-glyph-for-line-drawing"></a>
+<a class="index-entry-id" id="index-box-rule-glyph-_0028_005c_005bbr_005d_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-box-rule-_0028_005c_005bbr_005d_0029"></a>
+<p>Draw a vertical line of length <var class="var">l</var> from the drawing position.
+Downward motion is positive. The default scaling unit is &lsquo;<samp class="samp">v</samp>&rsquo;. The
+default character is the box rule, <code class="code">\[br]</code>. As with vertical
+motion escape sequences, text processing continues where the line ends.
+<code class="code">\L</code> is otherwise similar to <code class="code">\l</code>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">$ nroff &lt;&lt;EOF
+This is a \L'3v'test.
+EOF
+ &rArr; This is a
+ &rArr; |
+ &rArr; |
+ &rArr; |test.
+</pre></div></div>
+
+<p>When writing text, the drawing position is at the text baseline; recall
+<a class="ref" href="#Page-Geometry">Page Geometry</a>.
+</p></dd></dl>
+
+<p>The <code class="code">\D</code> escape sequence provides <em class="dfn">drawing commands</em> that
+direct the output device to render geometrical objects rather than
+glyphs. Specific devices may support only a subset, or may feature
+additional ones; consult the man page for the output driver in use.
+Terminal devices in particular implement almost none. See <a class="xref" href="#Graphics-Commands">Graphics Commands</a>.
+</p>
+<p>Rendering starts at the drawing position; when finished, the drawing
+position is left at the rightmost point of the object, even for closed
+figures, except where noted. GNU <code class="code">troff</code> draws stroked (outlined)
+objects with the stroke color, and shades filled ones with the fill
+color. See <a class="xref" href="#Colors">Colors</a>. Coordinates <var class="var">h</var> and <var class="var">v</var> are horizontal
+and vertical motions relative to the drawing position or previous point
+in the command. The default scaling unit for horizontal measurements
+(and diameters of circles) is &lsquo;<samp class="samp">m</samp>&rsquo;; for vertical ones, &lsquo;<samp class="samp">v</samp>&rsquo;.
+</p>
+<p>Circles, ellipses, and polygons can be drawn filled or stroked. These
+are independent properties; if you want a filled, stroked figure, you
+must draw the same figure twice using each drawing command. A filled
+figure is always smaller than an outlined one because the former is
+drawn only within its defined area, whereas strokes have a line
+thickness (set with &lsquo;<samp class="samp">\D't'</samp>&rsquo;).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">\h'1i'\v'1i'\
+\# increase line thickness
+\Z'\D't 5p''\
+\# draw stroked (unfilled) polygon
+\Z'\D'p 3 3 -6 0''\
+\# draw filled (solid) polygon
+\Z'\D'P 3 3 -6 0''
+</pre></div></div>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cD_0027command-argument-_2026_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\D<code class="code">'</code></code><span class="r"><i class="slanted">command argument &hellip;</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cD_0027command-argument-_2026_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cD"></a>
+<p>Drawing command escape sequence parameters begin with an ordinary
+character, <var class="var">command</var>, selecting the type of object to be drawn,
+followed by <var class="var">argument</var>s whose meaning is determined by
+<var class="var">command</var>.
+</p>
+<dl class="table">
+<dt id='index-drawing-a-spline-_0028_005cD_0027_007e-_2026_0027_0029'><span><code class="code">\D'~ <var class="var">h1</var> <var class="var">v1</var> &hellip; <var class="var">hn</var> <var class="var">vn</var>'</code><a class="copiable-link" href='#index-drawing-a-spline-_0028_005cD_0027_007e-_2026_0027_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-spline_002c-drawing-_0028_005cD_0027_007e-_2026_0027_0029"></a>
+<p>Draw a B-spline to each point in sequence, leaving the drawing position
+at (<var class="var">hn</var>, <var class="var">vn</var>).
+</p>
+</dd>
+<dt id='index-arc_002c-drawing-_0028_005cD_0027a-_2026_0027_0029'><span><code class="code">\D'a <var class="var">hc</var> <var class="var">vc</var> <var class="var">h</var> <var class="var">v</var>'</code><a class="copiable-link" href='#index-arc_002c-drawing-_0028_005cD_0027a-_2026_0027_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-drawing-an-arc-_0028_005cD_0027a-_2026_0027_0029"></a>
+<p>Draw a circular arc centered at (<var class="var">hc</var>, <var class="var">vc</var>) counterclockwise
+from the drawing position to a point (<var class="var">h</var>, <var class="var">v</var>) relative to the
+center. <a class="footnote" id="DOCF105" href="#FOOT105"><sup>105</sup></a>
+</p>
+</dd>
+<dt id='index-circle_002c-stroked_002c-drawing-_0028_005cD_0027c-_2026_0027_0029'><span><code class="code">\D'c <var class="var">d</var>'</code><a class="copiable-link" href='#index-circle_002c-stroked_002c-drawing-_0028_005cD_0027c-_2026_0027_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-drawing-a-stroked-circle-_0028_005cD_0027c-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-stroked-circle_002c-drawing-_0028_005cD_0027c-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-circle_002c-outlined_002c-drawing-_0028_005cD_0027c-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-drawing-an-outlined-circle-_0028_005cD_0027c-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-outlined-circle_002c-drawing-_0028_005cD_0027c-_2026_0027_0029"></a>
+<p>Draw a circle of diameter <var class="var">d</var> with its leftmost point at the drawing
+position.
+</p>
+</dd>
+<dt id='index-circle_002c-filled_002c-drawing-_0028_005cD_0027C-_2026_0027_0029'><span><code class="code">\D'C <var class="var">d</var>'</code><a class="copiable-link" href='#index-circle_002c-filled_002c-drawing-_0028_005cD_0027C-_2026_0027_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-drawing-a-filled-circle-_0028_005cD_0027C-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-filled-circle_002c-drawing-_0028_005cD_0027C-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-circle_002c-solid_002c-drawing-_0028_005cD_0027C-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-drawing-a-solid-circle-_0028_005cD_0027C-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-solid-circle_002c-drawing-_0028_005cD_0027C-_2026_0027_0029"></a>
+<p>As &lsquo;<samp class="samp">\D'C <span class="r">&hellip;</span>'</samp>&rsquo;, but the circle is filled.
+</p>
+</dd>
+<dt id='index-ellipse_002c-stroked_002c-drawing-_0028_005cD_0027e-_2026_0027_0029'><span><code class="code">\D'e <var class="var">h</var> <var class="var">v</var>'</code><a class="copiable-link" href='#index-ellipse_002c-stroked_002c-drawing-_0028_005cD_0027e-_2026_0027_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-drawing-a-stroked-ellipse-_0028_005cD_0027e-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-stroked-ellipse_002c-drawing-_0028_005cD_0027e-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-ellipse_002c-outlined_002c-drawing-_0028_005cD_0027e-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-drawing-an-outlined-ellipse-_0028_005cD_0027e-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-outlined-ellipse_002c-drawing-_0028_005cD_0027e-_2026_0027_0029"></a>
+<p>Draw an ellipse of width <var class="var">h</var> and height <var class="var">v</var> with its leftmost
+point at the drawing position.
+</p>
+</dd>
+<dt id='index-ellipse_002c-filled_002c-drawing-_0028_005cD_0027E-_2026_0027_0029'><span><code class="code">\D'E <var class="var">x</var> <var class="var">y</var>'</code><a class="copiable-link" href='#index-ellipse_002c-filled_002c-drawing-_0028_005cD_0027E-_2026_0027_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-drawing-a-filled-ellipse-_0028_005cD_0027E-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-filled-ellipse_002c-drawing-_0028_005cD_0027E-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-ellipse_002c-solid_002c-drawing-_0028_005cD_0027E-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-drawing-a-solid-ellipse-_0028_005cD_0027E-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-solid-ellipse_002c-drawing-_0028_005cD_0027E-_2026_0027_0029"></a>
+<p>As &lsquo;<samp class="samp">\D'e <span class="r">&hellip;</span>'</samp>&rsquo;, but the ellipse is filled.
+</p>
+</dd>
+<dt id='index-line_002c-drawing-_0028_005cD_0027l-_2026_0027_0029'><span><code class="code">\D'l <var class="var">dx</var> <var class="var">dy</var>'</code><a class="copiable-link" href='#index-line_002c-drawing-_0028_005cD_0027l-_2026_0027_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-drawing-a-line-_0028_005cD_0027l-_2026_0027_0029"></a>
+<p>Draw line from the drawing position to (<var class="var">h</var>, <var class="var">v</var>).
+</p>
+<p>The following is a macro for drawing a box around a text argument; for
+simplicity, the box margin is a fixed at 0.2<span class="dmn">m</span>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de TEXTBOX
+. nr @wd \w'\\$1'
+\h'.2m'\
+\h'-.2m'\v'(.2m - \\n[rsb]u)'\
+\D'l 0 -(\\n[rst]u - \\n[rsb]u + .4m)'\
+\D'l (\\n[@wd]u + .4m) 0'\
+\D'l 0 (\\n[rst]u - \\n[rsb]u + .4m)'\
+\D'l -(\\n[@wd]u + .4m) 0'\
+\h'.2m'\v'-(.2m - \\n[rsb]u)'\
+\\$1\
+\h'.2m'
+..
+</pre></div></div>
+
+<p>The argument is measured with the <code class="code">\w</code> escape sequence. Its width
+is stored in register <code class="code">@wd</code>. <code class="code">\w</code> also sets the registers
+<code class="code">rst</code> and <code class="code">rsb</code>; these contain its maximum vertical extents of
+the argument. Then, four lines are drawn to form a box, offset by the
+box margin.
+</p>
+</dd>
+<dt id='index-polygon_002c-stroked_002c-drawing-_0028_005cD_0027p-_2026_0027_0029'><span><code class="code">\D'p <var class="var">h1</var> <var class="var">v1</var> &hellip; <var class="var">hn</var> <var class="var">vn</var>'</code><a class="copiable-link" href='#index-polygon_002c-stroked_002c-drawing-_0028_005cD_0027p-_2026_0027_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-drawing-a-stroked-polygon-_0028_005cD_0027p-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-stroked-polygon_002c-drawing-_0028_005cD_0027p-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-polygon_002c-outlined_002c-drawing-_0028_005cD_0027p-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-drawing-an-outlined-polygon-_0028_005cD_0027p-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-outlined-polygon_002c-drawing-_0028_005cD_0027p-_2026_0027_0029"></a>
+<p>Draw polygon with vertices at drawing position and each point in
+sequence. GNU <code class="code">troff</code> closes the polygon by drawing a line from
+(<var class="var">hn</var>, <var class="var">vn</var>) back to the initial drawing position.
+Afterward, the drawing position is left at (<var class="var">hn</var>, <var class="var">vn</var>).
+</p>
+</dd>
+<dt id='index-polygon_002c-filled_002c-drawing-_0028_005cD_0027P-_2026_0027_0029'><span><code class="code">\D'P <var class="var">dx1</var> <var class="var">dy1</var> <var class="var">dx2</var> <var class="var">dy2</var> &hellip;'</code><a class="copiable-link" href='#index-polygon_002c-filled_002c-drawing-_0028_005cD_0027P-_2026_0027_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-drawing-a-filled-polygon-_0028_005cD_0027P-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-filled-polygon_002c-drawing-_0028_005cD_0027P-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-polygon_002c-solid_002c-drawing-_0028_005cD_0027P-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-drawing-a-solid-polygon-_0028_005cD_0027P-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-solid-polygon_002c-drawing-_0028_005cD_0027P-_2026_0027_0029"></a>
+<p>As &lsquo;<samp class="samp">\D'P <span class="r">&hellip;</span>'</samp>&rsquo;, but the polygon is filled.
+</p>
+<p>The following macro is like the &lsquo;<samp class="samp">\D'l'</samp>&rsquo; example, but shades the
+box. We draw the box before writing the text because colors in GNU
+<code class="code">troff</code> have no transparency; in othe opposite order, the filled
+polygon would occlude the text.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de TEXTBOX
+. nr @wd \w'\\$1'
+\h'.2m'\
+\h'-.2m'\v'(.2m - \\n[rsb]u)'\
+\M[lightcyan]\
+\D'P 0 -(\\n[rst]u - \\n[rsb]u + .4m) \
+ (\\n[@wd]u + .4m) 0 \
+ 0 (\\n[rst]u - \\n[rsb]u + .4m) \
+ -(\\n[@wd]u + .4m) 0'\
+\h'.2m'\v'-(.2m - \\n[rsb]u)'\
+\M[]\
+\\$1\
+\h'.2m'
+..
+</pre></div></div>
+
+</dd>
+<dt id='index-line-thickness-_0028_005cD_0027t-_2026_0027_0029'><span><code class="code">\D't <var class="var">n</var>'</code><a class="copiable-link" href='#index-line-thickness-_0028_005cD_0027t-_2026_0027_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-thickness-of-lines-_0028_005cD_0027t-_2026_0027_0029"></a>
+<p>Set the stroke thickness of geometric objects to <var class="var">n</var> basic units. A
+zero <var class="var">n</var> selects the minimal supported thickness. A negative
+<var class="var">n</var> selects a thickness proportional to the type size; this is the
+default.
+</p></dd>
+</dl>
+</dd></dl>
+
+<p>In a hazy penumbra between text rendering and drawing commands we locate
+the bracket-building escape sequence, <code class="code">\b</code>. It can assemble
+apparently large glyphs by vertically stacking ordinary ones.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cb_0027contents_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\b<code class="code">'</code></code><span class="r"><i class="slanted">contents</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cb_0027contents_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cb"></a>
+<a class="index-entry-id" id="index-pile_002c-glyph-_0028_005cb_0029"></a>
+<a class="index-entry-id" id="index-glyph-pile-_0028_005cb_0029"></a>
+<a class="index-entry-id" id="index-stacking-glyphs-_0028_005cb_0029"></a>
+<p>Pile and center a sequence of glyphs vertically on the output line.
+<em class="dfn">Piling</em> stacks glyphs corresponding to each character in
+<var class="var">contents</var>, read from left to right, and placed from top to bottom.
+GNU <code class="code">troff</code> separates the glyphs vertically by 1<span class="dmn">m</span>, and the
+pile itself is centered 0.5<span class="dmn">m</span> above the text baseline. The
+horizontal drawing position is then advanced by the width of the widest
+glyph in the pile.
+</p>
+<a class="index-entry-id" id="index-_005cb_002c-limitations-of"></a>
+<a class="index-entry-id" id="index-limitations-of-_005cb-escape-sequence"></a>
+<p>This rather inflexible positioning algorithm doesn&rsquo;t work with the
+<code class="code">dvi</code> output device since its bracket pieces vary in height.
+Instead, use the <code class="code">geqn</code> preprocessor.
+</p>
+<p><a class="ref" href="#Manipulating-Spacing">Manipulating Spacing</a> describes how to adjust the vertical spacing
+of the output line with the <code class="code">\x</code> escape sequence.
+</p>
+<p>The application of <code class="code">\b</code> that lends its name is construction of
+brackets, braces, and parentheses when typesetting mathematics. We
+might construct a large opening (left) brace as follows.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">\b'\[lt]\[bv]\[lk]\[bv]\[lb]'
+</pre></div></div>
+
+<p>See <cite class="cite">groff_char<span class="r">(7)</span></cite> for a list of special character
+identifiers.
+</p></dd></dl>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Deferring-Output">
+<div class="nav-panel">
+<p>
+Next: <a href="#Traps" accesskey="n" rel="next">Traps</a>, Previous: <a href="#Drawing-Geometric-Objects" accesskey="p" rel="prev">Drawing Geometric Objects</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Deferring-Output-1">5.27 Deferring Output</h3>
+<a class="index-entry-id" id="index-deferred-output"></a>
+
+<a class="index-entry-id" id="index-environment"></a>
+<a class="index-entry-id" id="index-diversion"></a>
+<a class="index-entry-id" id="index-trap"></a>
+<p>A few <code class="code">roff</code> language elements are generally not used in simple
+documents, but arise as page layouts become more sophisticated and
+demanding. <em class="dfn">Environments</em> collect formatting parameters like line
+length and typeface. A <em class="dfn">diversion</em> stores formatted output for
+later use. A <em class="dfn">trap</em> is a condition on the input or output, tested
+automatically by the formatter, that is associated with a macro, causing
+it to be called when that condition is fulfilled.
+</p>
+<p>Footnote support often exercises all three of the foregoing features. A
+simple implementation might work as follows. A pair of macros is
+defined: one starts a footnote and the other ends it. The author calls
+the first macro where a footnote marker is desired. The macro
+establishes a diversion so that the footnote text is collected at the
+place in the body text where its corresponding marker appears. An
+environment is created for the footnote so that it is set at a smaller
+typeface. The footnote text is formatted in the diversion using that
+environment, but it does not yet appear in the output. The document
+author calls the footnote end macro, which returns to the previous
+environment and ends the diversion. Later, after much more body text in
+the document, a trap, set a small distance above the page bottom, is
+sprung. The macro called by the trap draws a line across the page and
+emits the stored diversion. Thus, the footnote is rendered.
+</p>
+<p>Diversions and traps make the text formatting process non-linear. Let
+us imagine a set of text lines or paragraphs labelled &lsquo;<samp class="samp">A</samp>&rsquo;,
+&lsquo;<samp class="samp">B</samp>&rsquo;, and so on. If we set up a trap that produces text &lsquo;<samp class="samp">T</samp>&rsquo;
+(as a page footer, say), and we also use a diversion to store the
+formatted text &lsquo;<samp class="samp">D</samp>&rsquo;, then a document with input text in the order
+&lsquo;<samp class="samp">A B C D E F</samp>&rsquo; might render as &lsquo;<samp class="samp">A B C E T F</samp>&rsquo;. The diversion
+&lsquo;<samp class="samp">D</samp>&rsquo; will never be output if we do not call for it.
+</p>
+<p>Environments of themselves are not a source of non-linearity in document
+formatting: environment switches have immediate effect. One could
+always write a macro to change as many formatting parameters as desired
+with a single convenient call. But because diversions can be nested and
+macros called by traps that are sprung by other trap-called macros, they
+may be called upon in varying contexts. For example, consider a page
+header that is always to be set in Helvetica. A document that uses
+Times for most of its body text, but Courier for displayed code
+examples, poses a challenge if a page break occurs in the middle of a
+code display; if the header trap assumes that the &ldquo;previous font&rdquo; is
+always Times, the rest of the example will be formatted in the wrong
+typeface. One could carefully save all formatting parameters upon
+entering the trap and restore them upon leaving it, but this is verbose,
+error-prone, and not future-proof as the <code class="code">groff</code> language develops.
+Environments save us considerable effort.
+</p>
+
+<hr>
+</div>
+<div class="section-level-extent" id="Traps">
+<div class="nav-panel">
+<p>
+Next: <a href="#Diversions" accesskey="n" rel="next">Diversions</a>, Previous: <a href="#Deferring-Output" accesskey="p" rel="prev">Deferring Output</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Traps-1">5.28 Traps</h3>
+<a class="index-entry-id" id="index-traps"></a>
+
+<p><em class="dfn">Traps</em> are locations in the output or conditions on the input that,
+when reached or fulfilled, call a specified macro. These traps can
+occur at a given location on the page, at a given location in the
+current diversion (together, these are known as <i class="slanted">vertical
+position traps</i>), at a blank line, at a line with leading space
+characters, after a quantity of input lines, or at the end of input.
+Macros called by traps are passed no arguments.
+<a class="index-entry-id" id="index-planting-a-trap"></a>
+<a class="index-entry-id" id="index-trap_002c-planting"></a>
+Setting a trap is also called <em class="dfn">planting</em> one.
+<a class="index-entry-id" id="index-trap_002c-springing"></a>
+<a class="index-entry-id" id="index-springing-a-trap"></a>
+It is said that a trap is <em class="dfn">sprung</em> if its condition is fulfilled.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="#Vertical-Position-Traps" accesskey="1">Vertical Position Traps</a></li>
+<li><a href="#Input-Line-Traps" accesskey="2">Input Line Traps</a></li>
+<li><a href="#Blank-Line-Traps" accesskey="3">Blank Line Traps</a></li>
+<li><a href="#Leading-Space-Traps" accesskey="4">Leading Space Traps</a></li>
+<li><a href="#End_002dof_002dinput-Traps" accesskey="5">End-of-input Traps</a></li>
+</ul>
+<hr>
+<div class="subsection-level-extent" id="Vertical-Position-Traps">
+<div class="nav-panel">
+<p>
+Next: <a href="#Page-Location-Traps" accesskey="n" rel="next">Page Location Traps</a>, Previous: <a href="#Traps" accesskey="p" rel="prev">Traps</a>, Up: <a href="#Traps" accesskey="u" rel="up">Traps</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Vertical-Position-Traps-1">5.28.1 Vertical Position Traps</h4>
+<a class="index-entry-id" id="index-vertical-position-traps"></a>
+<a class="index-entry-id" id="index-traps_002c-vertical-position"></a>
+
+<p>A <em class="dfn">vertical position trap</em> calls a macro when the formatter&rsquo;s
+vertical drawing position reaches or passes, in the downward direction,
+a certain location on the output page or in a diversion. Its
+applications include setting page headers and footers, body text in
+multiple columns, and footnotes.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002evpt"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.vpt</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">flag</i></span>]</var><a class="copiable-link" href='#index-_002evpt'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-vpt"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002evpt_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.vpt]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002evpt_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002evpt-1"></a>
+<a class="index-entry-id" id="index-enabling-vertical-position-traps-_0028vpt_0029"></a>
+<a class="index-entry-id" id="index-vertical-position-traps_002c-enabling-_0028vpt_0029"></a>
+<a class="index-entry-id" id="index-vertical-position-trap-enable-register-_0028_002evpt_0029"></a>
+<p>Enable vertical position traps if <var class="var">flag</var> is non-zero or absent;
+disable them otherwise. Vertical position traps are those set by the
+<code class="code">wh</code> request or by <code class="code">dt</code> within a diversion. The parameter
+that controls whether vertical position traps are enabled is global.
+Initially, vertical position traps are enabled. The current value is
+stored in the <code class="code">.vpt</code> read-only register.
+</p>
+<a class="index-entry-id" id="index-page-break_002c-prevented-by-vpt"></a>
+<a class="index-entry-id" id="index-break_002c-page_002c-prevented-by-vpt"></a>
+<a class="index-entry-id" id="index-page-ejection_002c-prevented-by-vpt"></a>
+<a class="index-entry-id" id="index-ejection_002c-page_002c-prevented-by-vpt"></a>
+<p>A page can&rsquo;t be ejected if <code class="code">vpt</code> is set to zero; see <a class="ref" href="#The-Implicit-Page-Trap">The Implicit Page Trap</a>.
+</p></dd></dl>
+
+
+
+<ul class="mini-toc">
+<li><a href="#Page-Location-Traps" accesskey="1">Page Location Traps</a></li>
+<li><a href="#The-Implicit-Page-Trap" accesskey="2">The Implicit Page Trap</a></li>
+<li><a href="#Diversion-Traps" accesskey="3">Diversion Traps</a></li>
+</ul>
+<hr>
+<div class="subsubsection-level-extent" id="Page-Location-Traps">
+<div class="nav-panel">
+<p>
+Next: <a href="#The-Implicit-Page-Trap" accesskey="n" rel="next">The Implicit Page Trap</a>, Previous: <a href="#Vertical-Position-Traps" accesskey="p" rel="prev">Vertical Position Traps</a>, Up: <a href="#Vertical-Position-Traps" accesskey="u" rel="up">Vertical Position Traps</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Page-Location-Traps-1">5.28.1.1 Page Location Traps</h4>
+<a class="index-entry-id" id="index-page-location-traps"></a>
+<a class="index-entry-id" id="index-traps_002c-page-location"></a>
+
+<p>A <em class="dfn">page location trap</em> is a vertical position trap that applies to
+the page; that is, to undiverted output. Many can be present; manage
+them with the <code class="code">wh</code> and <code class="code">ch</code> requests.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ewh"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.wh</code></strong> <var class="def-var-arguments">dist [<span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002ewh'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-wh"></a>
+<p>Plant macro <var class="var">name</var> as page location trap at <var class="var">dist</var>. The default
+scaling unit is &lsquo;<samp class="samp">v</samp>&rsquo;. Non-negative values for <var class="var">dist</var> set the
+trap relative to the top of the page; negative values set the trap
+relative to the bottom of the page. It is not possible to plant a trap
+less than one basic unit from the page bottom: a <var class="var">dist</var> of <code class="code">-0</code>
+is interpreted as <code class="code">0</code>, the top of the page.<a class="footnote" id="DOCF106" href="#FOOT106"><sup>106</sup></a> An existing <em class="emph">visible</em> trap (see below) at
+<var class="var">dist</var> is removed; this is <code class="code">wh</code>&rsquo;s sole function if <var class="var">name</var>
+is missing.
+</p>
+<p>A trap is sprung only if it is <em class="dfn">visible</em>, meaning that its location
+is reachable on the page<a class="footnote" id="DOCF107" href="#FOOT107"><sup>107</sup></a> and it
+is not hidden by another trap at the same location already planted
+there.
+</p>
+<a class="index-entry-id" id="index-page-headers"></a>
+<a class="index-entry-id" id="index-page-footers"></a>
+<a class="index-entry-id" id="index-headers-1"></a>
+<a class="index-entry-id" id="index-footers-1"></a>
+<a class="index-entry-id" id="index-top-margin"></a>
+<a class="index-entry-id" id="index-margin_002c-top"></a>
+<a class="index-entry-id" id="index-bottom-margin"></a>
+<a class="index-entry-id" id="index-margin_002c-bottom"></a>
+<p>A macro package might set headers and footers as follows; this example
+configures vertical margins of one inch to the body text, and one
+half-inch to the titles. Observe the use of the no-break control
+character with <code class="code">sp</code> request to position our text baselines,
+and the page number character &lsquo;<samp class="samp">%</samp>&rsquo; used with the <code class="code">tl</code> request.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.\&quot; hdfo.roff
+.de hd \&quot; page header
+' sp .5i
+' tl '\\*(Ti''\\*(Da' \&quot; title and date strings
+' sp .5i
+..
+.de fo \&quot; page footer
+' sp .5i
+. tl ''%''
+. bp
+..
+.wh 0 hd \&quot; trap at top of the page
+.wh -1i fo \&quot; trap 1 inch from bottom
+</pre></div></div>
+
+<p>To use these traps, copy the above (or load it from a file with the
+<code class="code">so</code> or <code class="code">mso</code> requests), then set up the strings it uses.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.so hdfo.roff
+.ds Ti Final Report\&quot;
+.ds Da 21 May 2023\&quot;
+.ti
+On 5 August of last year,
+this committee tasked me with the investigation of the
+CFIT (controlled flight into terrain) incident of
+.\&quot; <i class="i">...and so on...</i>
+</pre></div></div>
+
+<p>A trap above the top or at or below the bottom of the page can be made
+visible by either moving it into the page area or increasing the page
+length so that the trap is on the page. Negative trap values always use
+the <em class="emph">current</em> page length; they are not converted to an absolute
+vertical position.
+<a class="index-entry-id" id="index-page-location-traps_002c-debugging"></a>
+<a class="index-entry-id" id="index-debugging-page-location-traps"></a>
+We can use the <code class="code">ptr</code> request to dump our page location traps to the
+standard error stream (see <a class="pxref" href="#Debugging">Debugging</a>). Their positions are reported
+in basic units; an <code class="code">nroff</code> device example follows.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.pl 5i
+.wh -1i xx
+.ptr
+ error&rarr; xx -240
+.pl 100i
+.ptr
+ error&rarr; xx -240
+</pre></div></div>
+
+<p>It is possible to have more than one trap at the same location (although
+only one at a time can be visible); to achieve this, the traps must be
+defined at different locations, then moved to the same place with the
+<code class="code">ch</code> request. In the following example, the many empty lines
+caused by the <code class="code">bp</code> request are not shown in the output.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de a
+. nop a
+..
+.de b
+. nop b
+..
+.de c
+. nop c
+..
+.
+.wh 1i a
+.wh 2i b
+.wh 3i c
+.bp
+ &rArr; a b c
+</pre></div></div>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ch b 1i
+.ch c 1i
+.bp
+ &rArr; a
+</pre></div></div>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ch a 0.5i
+.bp
+ &rArr; a b
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002et_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.t]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002et_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002et"></a>
+<a class="index-entry-id" id="index-distance-to-next-vertical-position-trap-register-_0028_002et_0029"></a>
+<a class="index-entry-id" id="index-trap_002c-distance-to-next-vertical-position_002c-register-_0028_002et_0029"></a>
+<p>The read-only register <code class="code">.t</code> holds the distance to the next vertical
+position trap. If there are no traps between the current position and
+the bottom of the page, it contains the distance to the page bottom.
+Within a diversion, in the absence of a diversion trap, this distance is
+the largest representable integer in basic units&mdash;effectively infinite.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ech"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ch</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">dist</i></span>]</var><a class="copiable-link" href='#index-_002ech'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ch"></a>
+<a class="index-entry-id" id="index-changing-trap-location-_0028ch_0029"></a>
+<a class="index-entry-id" id="index-trap_002c-changing-location-_0028ch_0029"></a>
+<p>Change the location of a trap by moving macro <var class="var">name</var> to new location
+<var class="var">dist</var>, or by unplanting it altogether if <var class="var">dist</var> is absent. The
+default scaling unit is &lsquo;<samp class="samp">v</samp>&rsquo;. Parameters to <code class="code">ch</code> are specified
+in the opposite order from <code class="code">wh</code>. If <var class="var">name</var> is the earliest
+planted macro of multiple traps at the same location, (re)moving it from
+that location exposes the macro next least recently planted at the same
+place.<a class="footnote" id="DOCF108" href="#FOOT108"><sup>108</sup></a>
+</p>
+<p>Changing a trap&rsquo;s location is useful for building up footnotes in a
+diversion to allow more space at the bottom of the page for them.
+</p>
+
+</dd></dl>
+
+<p>The same macro can be installed simultaneously at multiple locations;
+however, only the earliest-planted instance&mdash;that has not yet been
+deleted with <code class="code">wh</code>&mdash;will be moved by <code class="code">ch</code>. The following
+example (using an <code class="code">nroff</code> device) illustrates this behavior. Blank
+lines have been elided from the output.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de T
+Trap sprung at \\n(nlu.
+.br
+..
+.wh 1i T
+.wh 2i T
+foo
+.sp 11i
+.bp
+.ch T 4i
+bar
+.sp 11i
+.bp
+.ch T 5i
+baz
+.sp 11i
+.bp
+.wh 5i
+.ch T 6i
+qux
+.sp 11i
+</pre></div></div>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; foo
+ &rArr; Trap sprung at 240u.
+ &rArr; Trap sprung at 480u.
+ &rArr; bar
+ &rArr; Trap sprung at 480u.
+ &rArr; Trap sprung at 960u.
+ &rArr; baz
+ &rArr; Trap sprung at 480u.
+ &rArr; Trap sprung at 1200u.
+ &rArr; qux
+ &rArr; Trap sprung at 1440u.
+</pre></div></div>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002ene_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.ne]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ene_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ene-1"></a>
+<p>The read-only register <code class="code">.ne</code> contains the amount of space that was
+needed in the last <code class="code">ne</code> request that caused a trap to be sprung;
+it is useful in conjunction with the <code class="code">.trunc</code> register. See <a class="xref" href="#Page-Control">Page Control</a>. Since the <code class="code">.ne</code> register is set only by traps, it
+doesn&rsquo;t make sense to interpolate it outside of macros called by traps.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002etrunc_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.trunc]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002etrunc_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002etrunc"></a>
+<a class="index-entry-id" id="index-ne-request_002c-and-the-_002etrunc-register"></a>
+<a class="index-entry-id" id="index-truncated-vertical-space-register-_0028_002etrunc_0029"></a>
+<p>A read-only register containing the amount of vertical space truncated
+from an <code class="code">sp</code> request by the most recently sprung vertical
+position trap, or, if the trap was sprung by an <code class="code">ne</code> request,
+minus the amount of vertical motion produced by the <code class="code">ne</code>
+request. In other words, at the point a trap is sprung, it
+represents the difference of what the vertical position would have
+been but for the trap, and what the vertical position actually is.
+Since the <code class="code">.trunc</code> register is set only by traps, it doesn&rsquo;t make
+sense to interpolate it outside of macros called by traps.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002epe_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.pe]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002epe_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002epe"></a>
+<a class="index-entry-id" id="index-bp-request_002c-and-traps-_0028_002epe_0029"></a>
+<a class="index-entry-id" id="index-traps_002c-sprung-by-bp-request-_0028_002epe_0029"></a>
+<a class="index-entry-id" id="index-page-ejection-status-register-_0028_002epe_0029"></a>
+<p>This Boolean-valued, read-only register interpolates&nbsp;1 while a page
+is being ejected, and 0&nbsp;otherwise.
+</p>
+<p>In the following example, we plant the same trap at the top and the
+bottom of the page. We also make the trap report its name and the
+vertical drawing position.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de T
+.tm \\$0: page \\n%, nl=\\n[nl] .pe=\\n[.pe]
+..
+.ll 46n
+.wh 0 T
+.wh -1v T
+Those who can make you believe absurdities can make you
+commit atrocities. \[em] Voltaire
+ error&rarr; T: page 1, nl=0 .pe=0
+ error&rarr; T: page 1, nl=2600 .pe=1
+ &rArr; Those who can make you believe absurdities can
+ &rArr; make you commit atrocities. -- Voltaire
+</pre></div></div>
+</dd></dl>
+
+<a class="index-entry-id" id="index-diversions_002c-and-traps"></a>
+<a class="index-entry-id" id="index-traps_002c-and-diversions"></a>
+<p>When designing macros, keep in mind that diversions and traps do
+normally interact. For example, if a trap calls a header macro (while
+outputting a diversion) that tries to change the font on the current
+page, the effect is not visible before the diversion has completely been
+printed (except for input protected with <code class="code">\!</code> or <code class="code">\?</code>) since
+the data in the diversion is already formatted. In most cases, this is
+not the expected behaviour.
+</p>
+
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="The-Implicit-Page-Trap">
+<div class="nav-panel">
+<p>
+Next: <a href="#Diversion-Traps" accesskey="n" rel="next">Diversion Traps</a>, Previous: <a href="#Page-Location-Traps" accesskey="p" rel="prev">Page Location Traps</a>, Up: <a href="#Vertical-Position-Traps" accesskey="u" rel="up">Vertical Position Traps</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="The-Implicit-Page-Trap-1">5.28.1.2 The Implicit Page Trap</h4>
+<a class="index-entry-id" id="index-implicit-trap"></a>
+<a class="index-entry-id" id="index-trap_002c-implicit"></a>
+
+<a class="index-entry-id" id="index-page-break-2"></a>
+<a class="index-entry-id" id="index-break_002c-page-2"></a>
+<a class="index-entry-id" id="index-page-ejection-2"></a>
+<a class="index-entry-id" id="index-ejection_002c-page-2"></a>
+<p>If, after starting GNU <code class="code">troff</code> without loading a macro package, you
+use the <code class="code">ptr</code> request to dump a list of the active traps to the
+standard error stream,<a class="footnote" id="DOCF109" href="#FOOT109"><sup>109</sup></a> nothing is reported.
+Yet the <code class="code">.t</code> register will report a steadily decreasing value with
+every output line your document produces, and once the value of
+<code class="code">.t</code> gets to within <code class="code">.V</code> of zero, you will notice that
+something trap-like happens&mdash;the page is ejected, a new one begins, and
+the value of <code class="code">.t</code> becomes large once more.
+</p>
+<p>This <em class="dfn">implicit page trap</em> always exists in the top-level
+diversion;<a class="footnote" id="DOCF110" href="#FOOT110"><sup>110</sup></a> it works like a trap in some
+ways but not others. Its purpose is to eject the current page and start
+the next one. It has no name, so it cannot be moved or deleted with
+<code class="code">wh</code> or <code class="code">ch</code> requests. You cannot hide it by placing another
+trap at its location, and can move it only by redefining the page length
+with <code class="code">pl</code>. Its operation is suppressed when vertical page traps
+are disabled with GNU <code class="code">troff</code>&rsquo;s <code class="code">vpt</code> request.
+</p>
+
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="Diversion-Traps">
+<div class="nav-panel">
+<p>
+Next: <a href="#Input-Line-Traps" accesskey="n" rel="next">Input Line Traps</a>, Previous: <a href="#The-Implicit-Page-Trap" accesskey="p" rel="prev">The Implicit Page Trap</a>, Up: <a href="#Vertical-Position-Traps" accesskey="u" rel="up">Vertical Position Traps</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Diversion-Traps-1">5.28.1.3 Diversion Traps</h4>
+<a class="index-entry-id" id="index-diversion-traps"></a>
+<a class="index-entry-id" id="index-traps_002c-diversion"></a>
+
+<p>A diversion is not formatted in the context of a page, so it lacks page
+location traps; instead it can have a <em class="dfn">diversion trap</em>. There can
+exist at most one such vertical position trap per diversion.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002edt"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.dt</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">dist</i></span> <span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002edt'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-dt"></a>
+<a class="index-entry-id" id="index-_002et-register_002c-and-diversions"></a>
+<a class="index-entry-id" id="index-setting-diversion-trap-_0028dt_0029"></a>
+<a class="index-entry-id" id="index-diversion-trap_002c-setting-_0028dt_0029"></a>
+<a class="index-entry-id" id="index-trap_002c-diversion_002c-setting-_0028dt_0029"></a>
+<p>Set a trap <em class="emph">within</em> a diversion at location <var class="var">dist</var>, which is
+interpreted relative to diversion rather than page boundaries. If invoked with
+fewer than two arguments, any diversion trap in the current diversion is
+removed. The register <code class="code">.t</code> works within diversions. It is an
+error to invoke <code class="code">dt</code> in the top-level diversion.
+See <a class="xref" href="#Diversions">Diversions</a>.
+</p></dd></dl>
+
+
+<hr>
+</div>
+</div>
+<div class="subsection-level-extent" id="Input-Line-Traps">
+<div class="nav-panel">
+<p>
+Next: <a href="#Blank-Line-Traps" accesskey="n" rel="next">Blank Line Traps</a>, Previous: <a href="#Diversion-Traps" accesskey="p" rel="prev">Diversion Traps</a>, Up: <a href="#Traps" accesskey="u" rel="up">Traps</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Input-Line-Traps-1">5.28.2 Input Line Traps</h4>
+<a class="index-entry-id" id="index-input-line-traps"></a>
+<a class="index-entry-id" id="index-traps_002c-input-line"></a>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eit"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.it</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">n</i></span> <span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002eit'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-it"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eitc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.itc</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">n</i></span> <span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002eitc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-itc"></a>
+<a class="index-entry-id" id="index-setting-input-line-trap-_0028it_002c-itc_0029"></a>
+<a class="index-entry-id" id="index-input-line-trap_002c-setting-_0028it_002c-itc_0029"></a>
+<a class="index-entry-id" id="index-trap_002c-input-line_002c-setting-_0028it_002c-itc_0029"></a>
+<a class="index-entry-id" id="index-clearing-input-line-trap-_0028it_002c-itc_0029"></a>
+<a class="index-entry-id" id="index-input-line-trap_002c-clearing-_0028it_002c-itc_0029"></a>
+<a class="index-entry-id" id="index-trap_002c-input-line_002c-clearing-_0028it_002c-itc_0029"></a>
+<p>Set an input line trap, calling macro <var class="var">name</var> after processing the
+next <var class="var">n</var>&nbsp;productive input lines (recall <a class="ref" href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a>). Any existing input line trap in the
+environment is replaced. Without arguments, <code class="code">it</code> and <code class="code">itc</code>
+clear any input line trap that has not yet sprung.
+</p>
+<p>Consider a macro &lsquo;<samp class="samp">.ST <var class="var">s n</var></samp>&rsquo; which sets the next
+<var class="var">n</var>&nbsp;input lines in the font style&nbsp;<var class="var">s</var>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de ST \&quot; Use style $1 for next $2 text lines.
+. it \\$2 ES
+. ft \\$1
+..
+.de ES \&quot; end ST
+. ft R
+..
+.ST I 1
+oblique
+face
+.ST I 1
+oblique\c
+face
+ &rArr; <i class="i">oblique</i> face <i class="i">oblique</i>face &nbsp;<span class="r">(second &ldquo;face&rdquo; upright)</span>
+</pre></div></div>
+
+<a class="index-entry-id" id="index-input-line-traps-and-interrupted-lines-_0028itc_0029"></a>
+<a class="index-entry-id" id="index-interrupted-lines-and-input-line-traps-_0028itc_0029"></a>
+<a class="index-entry-id" id="index-traps_002c-input-line_002c-and-interrupted-lines-_0028itc_0029"></a>
+<a class="index-entry-id" id="index-lines_002c-interrupted_002c-and-input-line-traps-_0028itc_0029"></a>
+<p>Unlike the <code class="code">ce</code> and <code class="code">rj</code> requests, <code class="code">it</code> counts lines
+interrupted with the <code class="code">\c</code> escape sequence separately (see <a class="pxref" href="#Line-Continuation">Line Continuation</a>); <code class="code">itc</code> does not. To see the difference, let&rsquo;s
+change the previous example to use <code class="code">itc</code> instead.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"><span class="r">&hellip;</span>
+. itc \\$2 ES
+<span class="r">&hellip;</span>
+ &rArr; <i class="i">oblique</i> face <i class="i">obliqueface</i> &nbsp;<span class="r">(second &ldquo;face&rdquo; oblique)</span>
+</pre></div></div>
+
+<p>You can think of the <code class="code">ce</code> and <code class="code">rj</code> requests as implicitly
+creating an input line trap with <code class="code">itc</code> that schedules a break when
+the trap is sprung.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de BR
+. br
+. <i class="slanted">internal: disable centering-without-filling</i>
+..
+.
+.de ce
+. if \\n[.br] .br
+. itc \\$1 BR
+. <i class="slanted">internal: enable centering-without-filling</i>
+..
+</pre></div></div>
+
+<p>Let us consider in more detail the sorts of input lines that are or are
+not &ldquo;productive&rdquo;.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de Trap
+TRAP SPRUNG
+..
+.de Mac
+.if r a \l'5n'
+..
+.it 2 Trap
+.
+foo
+.Mac
+bar
+baz
+.it 1 Trap
+.sp \&quot; moves, but does not write or draw
+qux
+.itc 1 Trap
+\h'5n'\c \&quot; moves, but does not write or draw
+jat
+</pre></div></div>
+
+<p>When &lsquo;<samp class="samp">Trap</samp>&rsquo; gets called depends on whether the &lsquo;<samp class="samp">a</samp>&rsquo; register is
+defined; the control line with the <code class="code">if</code> request may or may not
+produce written output. We also see that the spacing request <code class="code">sp</code>,
+while certainly affecting the output, does not spring the input line
+trap. Similarly, the horizontal motion escape sequence <code class="code">\h</code> also
+affected the output, but was not &ldquo;written&rdquo;. Observe that we had to
+follow it with <code class="code">\c</code> and use <code class="code">itc</code> to prevent the newline at
+the end of the text line from causing a word break, which, like an
+ordinary space character, counts as written output.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">$ groff -Tascii input-trap-example.groff
+ &rArr; foo bar TRAP SPRUNG baz
+ &rArr;
+ &rArr; qux TRAP SPRUNG jat TRAP SPRUNG
+$ groff -Tascii -ra1 input-trap-example.groff
+ &rArr; foo _____ TRAP SPRUNG bar baz
+ &rArr;
+ &rArr; qux TRAP SPRUNG jat TRAP SPRUNG
+</pre></div></div>
+</dd></dl>
+
+<p>Input line traps are associated with the environment
+(see <a class="pxref" href="#Environments">Environments</a>); switching to another environment suspends the
+current input line trap, and going back resumes it, restoring the count
+of qualifying lines enumerated in that environment.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Blank-Line-Traps">
+<div class="nav-panel">
+<p>
+Next: <a href="#Leading-Space-Traps" accesskey="n" rel="next">Leading Space Traps</a>, Previous: <a href="#Input-Line-Traps" accesskey="p" rel="prev">Input Line Traps</a>, Up: <a href="#Traps" accesskey="u" rel="up">Traps</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Blank-Line-Traps-1">5.28.3 Blank Line Traps</h4>
+<a class="index-entry-id" id="index-blank-line-traps"></a>
+<a class="index-entry-id" id="index-traps_002c-blank-line"></a>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eblm"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.blm</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002eblm'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-blm"></a>
+<a class="index-entry-id" id="index-blank-line-macro-_0028blm_0029-2"></a>
+<p>Set a blank line trap, calling the macro <var class="var">name</var> when GNU
+<code class="code">troff</code> encounters a blank line in an input file, instead of the
+usual behavior (see <a class="pxref" href="#Breaking">Breaking</a>). A line consisting only of spaces is
+also treated as blank and subject to this trap. If no argument is
+supplied, the default blank line behavior is (re-)established.
+</p></dd></dl>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Leading-Space-Traps">
+<div class="nav-panel">
+<p>
+Next: <a href="#End_002dof_002dinput-Traps" accesskey="n" rel="next">End-of-input Traps</a>, Previous: <a href="#Blank-Line-Traps" accesskey="p" rel="prev">Blank Line Traps</a>, Up: <a href="#Traps" accesskey="u" rel="up">Traps</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Leading-Space-Traps-1">5.28.4 Leading Space Traps</h4>
+<a class="index-entry-id" id="index-leading-space-traps"></a>
+<a class="index-entry-id" id="index-traps_002c-leading-space"></a>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002elsm"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.lsm</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002elsm'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-lsm"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005blsn_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[lsn]</code></strong><a class="copiable-link" href='#index-_005cn_005blsn_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-lsn"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005blss_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[lss]</code></strong><a class="copiable-link" href='#index-_005cn_005blss_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-lss"></a>
+<a class="index-entry-id" id="index-leading-spaces-macro-_0028lsm_0029"></a>
+<p>Set a leading space trap, calling the macro <var class="var">name</var> when GNU
+<code class="code">troff</code> encounters leading spaces in an input line; the implicit
+line break that normally happens in this case is suppressed. If no
+argument is supplied, the default leading space behavior is
+(re-)established (see <a class="pxref" href="#Breaking">Breaking</a>).
+</p>
+<p>The count of leading spaces on an input line is stored in register
+<code class="code">lsn</code>, and the amount of corresponding horizontal motion in
+register <code class="code">lss</code>, irrespective of whether a leading space trap is
+set. When it is, the leading spaces are removed from the input line,
+and no motion is produced before calling <var class="var">name</var>.
+</p>
+</dd></dl>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="End_002dof_002dinput-Traps">
+<div class="nav-panel">
+<p>
+Previous: <a href="#Leading-Space-Traps" accesskey="p" rel="prev">Leading Space Traps</a>, Up: <a href="#Traps" accesskey="u" rel="up">Traps</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="End_002dof_002dinput-Traps-1">5.28.5 End-of-input Traps</h4>
+<a class="index-entry-id" id="index-end_002dof_002dinput-traps"></a>
+<a class="index-entry-id" id="index-traps_002c-end_002dof_002dinput"></a>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eem"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.em</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002eem'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-em"></a>
+<a class="index-entry-id" id="index-setting-end_002dof_002dinput-trap-_0028em_0029"></a>
+<a class="index-entry-id" id="index-end_002dof_002dinput-trap_002c-setting-_0028em_0029"></a>
+<a class="index-entry-id" id="index-trap_002c-end_002dof_002dinput_002c-setting-_0028em_0029"></a>
+<a class="index-entry-id" id="index-end_002dof_002dinput-macro-_0028em_0029"></a>
+<a class="index-entry-id" id="index-macro_002c-end_002dof_002dinput-_0028em_0029"></a>
+<p>Set a trap at the end of input, calling macro <var class="var">name</var> after the last
+line of the last input file has been processed. If no argument is
+given, any existing end-of-input trap is removed.
+</p>
+<p>For example, if the document had to have a section at the bottom of the
+last page for someone to approve it, the <code class="code">em</code> request could be
+used.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de approval
+\c
+. ne 3v
+. sp (\\n[.t]u - 3v)
+. in +4i
+. lc _
+. br
+Approved:\t\a
+. sp
+Date:\t\t\a
+..
+.
+.em approval
+</pre></div></div>
+
+<p>The <code class="code">\c</code> in the above example needs explanation. For historical
+reasons (compatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>), the
+end-of-input macro exits as soon as it causes a page break if no
+partially collected line remains.<a class="footnote" id="DOCF111" href="#FOOT111"><sup>111</sup></a>
+</p>
+<a class="index-entry-id" id="index-page-break_002c-final"></a>
+<a class="index-entry-id" id="index-break_002c-page_002c-final"></a>
+<a class="index-entry-id" id="index-page-ejection_002c-of-final-page"></a>
+<a class="index-entry-id" id="index-ejection_002c-page_002c-of-final-page"></a>
+<p>Let us assume that there is no <code class="code">\c</code> in the above <code class="code">approval</code>
+macro, that the page is full, and last output line has been broken with,
+say, a <code class="code">br</code> request. Because there is no more room, a <code class="code">ne</code>
+request at this point causes a page ejection, which in turn makes
+<code class="code">troff</code> exit immediately as just described. In most situations,
+this is not desired; people generally want to format the input after
+<code class="code">ne</code>.
+</p>
+<p>To force processing of the whole end-of-input macro independently of
+this behavior, it is thus advisable to (invisibly) ensure the existence
+of a partially collected line (<code class="code">\c</code>) whenever there is a chance
+that a page break can happen. In the above example, invoking the
+<code class="code">ne</code> request ensures that there is room for the subsequent
+formatted output on the same page, so we need insert <code class="code">\c</code> only
+once.
+</p>
+<p>The next example shows how to append three lines, then start a new page
+unconditionally. Since &lsquo;<samp class="samp">.ne&nbsp;1</samp>&rsquo;<!-- /@w --> doesn&rsquo;t give the desired
+effect&mdash;there is always one line available or we are already at the
+beginning of the next page&mdash;we temporarily increase the page length by
+one line so that we can use &lsquo;<samp class="samp">.ne&nbsp;2</samp>&rsquo;<!-- /@w -->.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de EM
+.pl +1v
+\c
+.ne 2
+line one
+.br
+\c
+.ne 2
+line two
+.br
+\c
+.ne 2
+line three
+.br
+.pl -1v
+\c
+'bp
+..
+.em EM
+</pre></div></div>
+
+<p>This specific feature affects only the first potential page break caused
+by the end-of-input macro; further page breaks emitted by the macro are
+handled normally.
+</p>
+<p>Another possible use of the <code class="code">em</code> request is to make GNU
+<code class="code">troff</code> emit a single large page instead of multiple pages. For
+example, one may want to produce a long plain text file for reading
+in a terminal or emulator without page footers and headers interrupting
+the body of the document. One approach is to set the page length at the
+beginning of the document to a very large value to hold all the
+text,<a class="footnote" id="DOCF112" href="#FOOT112"><sup>112</sup></a> and
+automatically adjust it to the exact height of the document after the
+text has been output.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de adjust-page-length
+. br
+. pl \\n[nl]u \&quot; \n[nl]: current vertical position
+..
+.
+.de single-page-mode
+. pl 99999
+. em adjust-page-length
+..
+.
+.\&quot; Activate the above code if configured.
+.if \n[do-continuous-rendering] \
+. single-page-mode
+</pre></div></div>
+
+<p>Since only one end-of-input trap exists and another macro package may
+already use it, care must be taken not to break the mechanism. A simple
+solution would be to append the above macro to the macro package&rsquo;s
+end-of-input macro using the <code class="code">am</code> request.
+</p></dd></dl>
+
+
+
+<hr>
+</div>
+</div>
+<div class="section-level-extent" id="Diversions">
+<div class="nav-panel">
+<p>
+Next: <a href="#Punning-Names" accesskey="n" rel="next">Punning Names</a>, Previous: <a href="#Traps" accesskey="p" rel="prev">Traps</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Diversions-1">5.29 Diversions</h3>
+<a class="index-entry-id" id="index-diversions"></a>
+
+<p>In <code class="code">roff</code> systems it is possible to format text as if for output,
+but instead of writing it immediately, one can <em class="dfn">divert</em> the
+formatted text into a named storage area. It is retrieved later by
+specifying its name after a control character. The same name space is
+used for such <i class="slanted">diversions</i> as for strings and macros; see
+<a class="ref" href="#Identifiers">Identifiers</a>. Such text is sometimes said to be &ldquo;stored in a
+macro&rdquo;, but this coinage obscures the important distinction between
+macros and strings on one hand and diversions on the other; the former
+store <em class="emph">unformatted</em> input text, and the latter capture
+<em class="emph">formatted</em> output. Diversions also do not interpret arguments.
+Applications of diversions include &ldquo;keeps&rdquo; (preventing a page break
+from occurring at an inconvenient place by forcing a set of output lines
+to be set as a group), footnotes, tables of contents, and indices.
+<a class="index-entry-id" id="index-top_002dlevel-diversion"></a>
+<a class="index-entry-id" id="index-diversion_002c-top_002dlevel"></a>
+For orthogonality it is said that GNU <code class="code">troff</code> is in the
+<em class="dfn">top-level diversion</em> if no diversion is active (that is, formatted
+output is being &ldquo;diverted&rdquo; immediately to the output device).
+</p>
+<p>Dereferencing an undefined diversion will create an empty one of that
+name and cause a warning in category &lsquo;<samp class="samp">mac</samp>&rsquo; to be emitted.
+See <a class="xref" href="#Warnings">Warnings</a>, for information about the enablement and suppression of
+warnings. A diversion does not exist for the purpose of testing with
+the <code class="code">d</code> conditional operator until its initial definition ends
+(see <a class="pxref" href="#Operators-in-Conditionals">Operators in Conditionals</a>). The following requests are used to
+create and alter diversions.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002edi"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.di</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002edi'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-di"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eda"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.da</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002eda'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-da"></a>
+<a class="index-entry-id" id="index-beginning-diversion-_0028di_002c-box_0029"></a>
+<a class="index-entry-id" id="index-diversion_002c-beginning-_0028di_002c-box_0029"></a>
+<a class="index-entry-id" id="index-ending-diversion-_0028di_002c-box_0029"></a>
+<a class="index-entry-id" id="index-diversion_002c-ending-_0028di_002c-box_0029"></a>
+<a class="index-entry-id" id="index-appending-to-a-diversion-_0028da_002c-boxa_0029"></a>
+<a class="index-entry-id" id="index-diversion_002c-appending-to-_0028da_002c-boxa_0029"></a>
+<p>Start collecting formatted output in a diversion called <var class="var">name</var>. The
+<code class="code">da</code> request appends to a diversion called <var class="var">name</var>, creating it
+if necessary. If <var class="var">name</var> already exists as an alias, the target of
+the alias is replaced or appended to; recall <a class="ref" href="#Strings">Strings</a>. The pending
+output line is diverted as well. Switching to another environment (with
+the <code class="code">ev</code> request) before invoking <code class="code">di</code> or <code class="code">da</code> avoids
+including any pending output line in the diversion; see
+<a class="ref" href="#Environments">Environments</a>.
+</p>
+<p>Invoking <code class="code">di</code> or <code class="code">da</code> without an argument stops diverting
+output to the diversion named by the most recent corresponding request.
+If <code class="code">di</code> or <code class="code">da</code> is called without an argument when there is no
+current diversion, a warning in category &lsquo;<samp class="samp">di</samp>&rsquo; is produced.
+See <a class="xref" href="#Warnings">Warnings</a>, for information about the enablement and suppression
+of warnings.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">Before the diversion.
+.di yyy
+In the diversion.
+.br
+.di
+After the diversion.
+.br
+ &rArr; After the diversion.
+.yyy
+ &rArr; Before the diversion. In the diversion.
+</pre></div></div>
+</dd></dl>
+
+<a class="index-entry-id" id="index-box-_0028diversion-operation_0029"></a>
+<p>GNU <code class="code">troff</code> supports <em class="dfn">box</em> requests to exclude a partially
+collected line from a diversion, as this is often desirable.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ebox"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.box</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002ebox'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-box"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eboxa"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.boxa</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002eboxa'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-boxa"></a>
+<p>Divert (or append) output to <var class="var">name</var>, similarly to the <code class="code">di</code> and
+<code class="code">da</code> requests, respectively. Any pending output line is <em class="emph">not</em>
+included in the diversion. Without an argument, stop diverting output;
+any pending output line inside the diversion is discarded.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">Before the box.
+.box xxx
+In the box.
+.br
+Hidden treasure.
+.box
+After the box.
+.br
+ &rArr; Before the box. After the box.
+.xxx
+ &rArr; In the box.
+</pre></div></div>
+</dd></dl>
+
+<p>Apart from pending output line inclusion and the request names that
+populate them, boxes are handled exactly as diversions are. All of the
+following <code class="code">groff</code> language elements can be used with them
+interchangeably.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002ez_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.z]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ez_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ez"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ed_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.d]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ed_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ed"></a>
+<a class="index-entry-id" id="index-nl-register_002c-and-_002ed"></a>
+<a class="index-entry-id" id="index-nested-diversions"></a>
+<a class="index-entry-id" id="index-diversion_002c-nested"></a>
+<a class="index-entry-id" id="index-diversion-name-register-_0028_002ez_0029"></a>
+<a class="index-entry-id" id="index-vertical-position-in-diversion-register-_0028_002ed_0029"></a>
+<a class="index-entry-id" id="index-position_002c-vertical_002c-in-diversion_002c-register-_0028_002ed_0029"></a>
+<a class="index-entry-id" id="index-diversion_002c-vertical-position-in_002c-register-_0028_002ed_0029"></a>
+<p>Diversions may be nested. The read-only string-valued register
+<code class="code">.z</code> contains the name of the current diversion. The read-only
+register <code class="code">.d</code> contains the current vertical place in the diversion.
+If the input text is not being diverted, <code class="code">.d</code> reports the same
+location as the register <code class="code">nl</code>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002eh_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.h]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eh_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eh"></a>
+<a class="index-entry-id" id="index-high_002dwater-mark-register-_0028_002eh_0029"></a>
+<a class="index-entry-id" id="index-mark_002c-high_002dwater_002c-register-_0028_002eh_0029"></a>
+<a class="index-entry-id" id="index-position-of-lowest-text-line-_0028_002eh_0029"></a>
+<a class="index-entry-id" id="index-text-line_002c-position-of-lowest-_0028_002eh_0029"></a>
+<p>The read-only register <code class="code">.h</code> stores the <em class="dfn">high-water mark</em> on the
+current page or in the current diversion. It corresponds to the text
+baseline of the lowest line on the page.<a class="footnote" id="DOCF113" href="#FOOT113"><sup>113</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.tm .h==\n[.h], nl==\n[nl]
+ &rArr; .h==0, nl==-1
+This is a test.
+.br
+.sp 2
+.tm .h==\n[.h], nl==\n[nl]
+ &rArr; .h==40, nl==120
+</pre></div></div>
+
+<a class="index-entry-id" id="index-_002eh-register_002c-difference-from-nl"></a>
+<a class="index-entry-id" id="index-nl-register_002c-difference-from-_002eh"></a>
+<p>As implied by the example, vertical motion does not produce text
+baselines and thus does not increase the value interpolated by
+&lsquo;<samp class="samp">\n[.h]</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bdn_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[dn]</code></strong><a class="copiable-link" href='#index-_005cn_005bdn_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-dn"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005bdl_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[dl]</code></strong><a class="copiable-link" href='#index-_005cn_005bdl_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-dl"></a>
+<a class="index-entry-id" id="index-dn-register_002c-and-da-_0028boxa_0029"></a>
+<a class="index-entry-id" id="index-dl-register_002c-and-da-_0028boxa_0029"></a>
+<a class="index-entry-id" id="index-da-request_002c-and-dn-_0028dl_0029"></a>
+<a class="index-entry-id" id="index-boxa-request_002c-and-dn-_0028dl_0029"></a>
+<p>After completing a diversion, the writable registers <code class="code">dn</code> and
+<code class="code">dl</code> contain its vertical and horizontal sizes. Only the lines
+just processed are counted: for the computation of <code class="code">dn</code> and
+<code class="code">dl</code>, the requests <code class="code">da</code> and <code class="code">boxa</code> are handled as if
+<code class="code">di</code> and <code class="code">box</code> had been used, respectively&mdash;lines that have
+been already stored in the diversion (box) are not taken into account.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.\&quot; Center text both horizontally and vertically.
+.\&quot; Macro .(c starts centering mode; .)c terminates it.
+.
+.\&quot; Disable the escape character with .eo so that we
+.\&quot; don't have to double backslashes on the &quot;\n&quot;s.
+.eo
+.de (c
+. br
+. ev (c
+. evc 0
+. in 0
+. nf
+. di @c
+..
+</pre></div></div>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de )c
+. br
+. ev
+. di
+. nr @s (((\n[.t]u - \n[dn]u) / 2u) - 1v)
+. sp \n[@s]u
+. ce 1000
+. @c
+. ce 0
+. sp \n[@s]u
+. br
+. fi
+. rr @s
+. rm @c
+..
+.ec
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0021anything"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\!</code><span class="r"><i class="slanted">anything</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0021anything'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0021"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_003fanything_005c_003f"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\?</code><span class="r"><i class="slanted">anything</i></span><code class="t">\?</code></strong><a class="copiable-link" href='#index-_005c_003fanything_005c_003f'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_003f"></a>
+<a class="index-entry-id" id="index-transparent-output-_0028_005c_0021_002c-_005c_003f_0029"></a>
+<a class="index-entry-id" id="index-output_002c-transparent-_0028_005c_0021_002c-_005c_003f_0029"></a>
+<p><em class="dfn">Transparently</em> embed <var class="var">anything</var> into the current diversion,
+preventing requests, macro calls, and escape sequences from being
+interpreted when read into a diversion. This is useful for preventing
+them from taking effect until the diverted text is actually output. The
+<code class="code">\!</code> escape sequence transparently embeds input up to and including
+the end of the line. The <code class="code">\?</code> escape sequence transparently embeds
+input until its own next occurrence.
+</p>
+<a class="index-entry-id" id="index-_005c_003f_002c-and-copy-mode-1"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-_005c_003f-1"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-_005c_003f-1"></a>
+<a class="index-entry-id" id="index-_005c_0021_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-_005c_0021"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-_005c_0021"></a>
+<p><var class="var">anything</var> may not contain newlines; use <code class="code">\!</code> by itself to
+embed newlines in a diversion. The escape sequence <code class="code">\?</code> is also
+recognized in copy mode and turned into a single internal code; it is
+this code that terminates <var class="var">anything</var>. Thus the following example
+prints&nbsp;4.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr x 1
+.nf
+.di d
+\?\\?\\\\?\\\\\\\\nx\\\\?\\?\?
+.di
+.nr x 2
+.di e
+.d
+.di
+.nr x 3
+.di f
+.e
+.di
+.nr x 4
+.f
+</pre></div></div>
+
+<p>Both escape sequences read the data in copy mode.
+</p>
+<a class="index-entry-id" id="index-_005c_0021_002c-in-top_002dlevel-diversion"></a>
+<a class="index-entry-id" id="index-top_002dlevel-diversion_002c-and-_005c_0021"></a>
+<a class="index-entry-id" id="index-diversion_002c-top_002dlevel_002c-and-_005c_0021"></a>
+<p>If <code class="code">\!</code> is used in the top-level diversion, its argument is
+directly embedded into GNU <code class="code">troff</code>&rsquo;s intermediate output. This can
+be used, for example, to control a postprocessor that processes the data
+before it is sent to an output driver.
+</p>
+<a class="index-entry-id" id="index-_005c_003f_002c-in-top_002dlevel-diversion"></a>
+<a class="index-entry-id" id="index-top_002dlevel-diversion_002c-and-_005c_003f"></a>
+<a class="index-entry-id" id="index-diversion_002c-top_002dlevel_002c-and-_005c_003f"></a>
+<p>The <code class="code">\?</code> escape used in the top-level diversion produces no output
+at all; its argument is simply ignored.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-_005c_0021_002c-and-output-request"></a>
+<a class="index-entry-id" id="index-output-request_002c-and-_005c_0021"></a>
+<a class="index-entry-id" id="index-output-request_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-output-request"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-output-request"></a>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eoutput"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.output</code></strong> <var class="def-var-arguments">contents</var><a class="copiable-link" href='#index-_002eoutput'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-output"></a>
+<p>Emit <var class="var">contents</var> directly to GNU <code class="code">troff</code>&rsquo;s intermediate output
+(subject to copy mode interpretation); this is similar to <code class="code">\!</code> used
+at the top level. An initial neutral double quote in <var class="var">contents</var> is
+stripped to allow embedding of leading spaces.
+</p>
+<p>This request can&rsquo;t be used before the first page has started&mdash;if you
+get an error, simply insert <code class="code">.br</code> before the <code class="code">output</code> request.
+</p>
+<p>Use with caution! It is normally only needed for mark-up used by a
+postprocessor that does something with the output before sending it to
+the output device, filtering out <var class="var">contents</var> again.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002easciify"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.asciify</code></strong> <var class="def-var-arguments">div</var><a class="copiable-link" href='#index-_002easciify'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-asciify"></a>
+<a class="index-entry-id" id="index-unformatting-diversions-_0028asciify_0029"></a>
+<a class="index-entry-id" id="index-diversion_002c-unformatting-_0028asciify_0029"></a>
+<a class="index-entry-id" id="index-trin-request_002c-and-asciify"></a>
+<p><em class="dfn">Unformat</em> the diversion <var class="var">div</var> in a way such that Unicode basic
+Latin (<abbr class="acronym">ASCII</abbr>) characters, characters translated with the
+<code class="code">trin</code> request, space characters, and some escape sequences, that
+were formatted and diverted into <var class="var">div</var> are treated like ordinary
+input characters when <var class="var">div</var> is reread. Doing so can be useful in
+conjunction with the <code class="code">writem</code> request. <code class="code">asciify</code> can be also
+used for gross hacks; for example, the following sets
+register&nbsp;<code class="code">n</code> to&nbsp;1.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.tr @.
+.di x
+@nr n 1
+.br
+.di
+.tr @@
+.asciify x
+.x
+</pre></div></div>
+
+<p><code class="code">asciify</code> cannot return all items in a diversion to their source
+equivalent: nodes such as those produced by the <code class="code">\N</code> escape
+sequence will remain nodes, so the result cannot be guaranteed to be a
+pure string. See <a class="xref" href="#Copy-Mode">Copy Mode</a>. Glyph parameters such as the type face
+and size are not preserved; use <code class="code">unformat</code> to achieve that.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eunformat"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.unformat</code></strong> <var class="def-var-arguments">div</var><a class="copiable-link" href='#index-_002eunformat'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-unformat"></a>
+<p>Like <code class="code">asciify</code>, unformat the diversion <var class="var">div</var>. However,
+<code class="code">unformat</code> handles only tabs and spaces between words, the latter
+usually arising from spaces or newlines in the input. Tabs are treated
+as input tokens, and spaces become adjustable again. The vertical sizes
+of lines are not preserved, but glyph information (font, type size,
+space width, and so on) is retained.
+</p></dd></dl>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Punning-Names">
+<div class="nav-panel">
+<p>
+Next: <a href="#Environments" accesskey="n" rel="next">Environments</a>, Previous: <a href="#Diversions" accesskey="p" rel="prev">Diversions</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Punning-Names-1">5.30 Punning Names</h3>
+<a class="index-entry-id" id="index-diversions-1"></a>
+
+<p>Macros, strings, and diversions share a name space; recall
+<a class="ref" href="#Identifiers">Identifiers</a>. Internally, the same mechanism is used to store
+them. You can thus call a macro with string interpolation syntax and
+vice versa.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de subject
+Typesetting
+..
+.de predicate
+rewards attention to detail
+..
+\*[subject] \*[predicate].
+Truly.
+ &rArr; Typesetting
+ &rArr; rewards attention to detail Truly.
+</pre></div></div>
+
+<p>What went wrong? Strings don&rsquo;t contain newlines, but macros do. String
+interpolation placed a newline at the end of &lsquo;<samp class="samp">\*[subject]</samp>&rsquo;, and the
+next thing on the input was a space. Then when &lsquo;<samp class="samp">\*[predicate]</samp>&rsquo; was
+interpolated, it was followed by the empty request &lsquo;<samp class="samp">.</samp>&rsquo; on a line by
+itself. If we want to use macros as strings, we must take interpolation
+behavior into account.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de subject
+Typesetting\\
+..
+.de predicate
+rewards attention to detail\\
+..
+\*[subject] \*[predicate].
+Truly.
+ &rArr; Typesetting rewards attention to detail. Truly.
+</pre></div></div>
+
+<p>By ending each text line of the macros with an escaped
+<code class="code">\<kbd class="key">RET</kbd></code>, we get the desired effect (see <a class="pxref" href="#Line-Continuation">Line Continuation</a>).<a class="footnote" id="DOCF114" href="#FOOT114"><sup>114</sup></a>
+What would have happened if we had used only one backslash at a time
+instead?
+</p>
+<p>Interpolating a string does not hide existing macro arguments. We can
+also place the escaped newline outside the string interpolation instead
+of within the string definition. Thus, in a macro, a more efficient way
+of doing
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.xx \\$@
+</pre></div></div>
+
+<p>is
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">\\*[xx]\\
+</pre></div></div>
+
+<p>The latter calling syntax doesn&rsquo;t change the value of <code class="code">\$0</code>, which
+is then inherited from the calling macro (see <a class="pxref" href="#Parameters">Parameters</a>).
+</p>
+<p>Diversions can be also called with string syntax. It is sometimes
+convenient to copy one-line diversions to a string.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.di xx
+the
+.ft I
+interpolation system
+.ft
+.br
+.di
+.ds yy This is a test of \*(xx\c
+\*(yy.
+ &rArr; This is a test of the <i class="i">interpolation system</i>.
+</pre></div></div>
+
+<p>As the previous example shows, it is possible to store formatted output
+in strings. The <code class="code">\c</code> escape sequence prevents the subsequent
+newline from being interpreted as a break (again,
+see <a class="pxref" href="#Line-Continuation">Line Continuation</a>).
+</p>
+<p>Copying multi-output line diversions produces unexpected results.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.di xxx
+a funny
+.br
+test
+.br
+.di
+.ds yyy This is \*[xxx]\c
+\*[yyy].
+ &rArr; test This is a funny.
+</pre></div></div>
+
+<p>Usually, it is not predictable whether a diversion contains one or more
+output lines, so this mechanism should be avoided. With <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code>, this was the only solution to strip off a final newline
+from a diversion. Another disadvantage is that the spaces in the copied
+string are already formatted, preventing their adjustment. This can
+cause ugly results.
+</p>
+<a class="index-entry-id" id="index-stripping-final-newline-in-diversions"></a>
+<a class="index-entry-id" id="index-diversion_002c-stripping-final-newline"></a>
+<a class="index-entry-id" id="index-final-newline_002c-stripping-in-diversions"></a>
+<a class="index-entry-id" id="index-newline_002c-final_002c-stripping-in-diversions"></a>
+<a class="index-entry-id" id="index-horizontal-space_002c-unformatting"></a>
+<a class="index-entry-id" id="index-space_002c-horizontal_002c-unformatting"></a>
+<a class="index-entry-id" id="index-unformatting-horizontal-space"></a>
+<p>A clean solution to this problem is available in GNU <code class="code">troff</code>, using
+the requests <code class="code">chop</code> to remove the final newline of a diversion, and
+<code class="code">unformat</code> to make the horizontal spaces adjustable again.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.box xxx
+a funny
+.br
+test
+.br
+.box
+.chop xxx
+.unformat xxx
+This is \*[xxx].
+ &rArr; This is a funny test.
+</pre></div></div>
+
+<p>See <a class="xref" href="#Gtroff-Internals"><code class="code">gtroff</code> Internals</a>.
+</p>
+
+<hr>
+</div>
+<div class="section-level-extent" id="Environments">
+<div class="nav-panel">
+<p>
+Next: <a href="#Suppressing-Output" accesskey="n" rel="next">Suppressing Output</a>, Previous: <a href="#Diversions" accesskey="p" rel="prev">Diversions</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Environments-1">5.31 Environments</h3>
+<a class="index-entry-id" id="index-environments"></a>
+
+<p>As discussed in <a class="ref" href="#Deferring-Output">Deferring Output</a>, environments store most of the
+parameters that determine the appearance of text. A default environment
+named &lsquo;<samp class="samp">0</samp>&rsquo; exists when GNU <code class="code">troff</code> starts up; it is modified by
+formatting-related requests and escape sequences.
+</p>
+<a class="index-entry-id" id="index-stack"></a>
+<p>You can create new environments and switch among them. Only one is
+current at any given time. Active environments are managed using a
+<em class="dfn">stack</em>, a data structure supporting &ldquo;push&rdquo; and &ldquo;pop&rdquo;
+operations. The current environment is at the top of the stack.
+The same environment name can be pushed onto the stack multiple times,
+possibly interleaved with others. Popping the environment stack does
+not destroy the current environment; it remains accessible by name and
+can be made current again by pushing it at any time. Environments
+cannot be renamed or deleted, and can only be modified when current. To
+inspect the environment stack, use the <code class="code">pev</code> request; see
+<a class="ref" href="#Debugging">Debugging</a>.
+</p>
+<p>Environments store the following information.
+</p>
+<ul class="itemize mark-bullet">
+<li>a partially collected line, if any
+
+</li><li>data about the most recently output glyph and line (registers
+<code class="code">.cdp</code>, <code class="code">.cht</code>, <code class="code">.csk</code>, <code class="code">.n</code>, <code class="code">.w</code>)
+
+</li><li>typeface parameters (size, family, style, height and slant, inter-word
+and inter-sentence space sizes)
+
+</li><li>page parameters (line length, title length, vertical spacing, line
+spacing, indentation, line numbering, centering, right-alignment,
+underlining, hyphenation parameters)
+
+</li><li>filling enablement; adjustment enablement and mode
+
+</li><li>tab stops; tab, leader, escape, control, no-break control, hyphenation,
+and margin characters
+
+</li><li>input line traps
+
+</li><li>stroke and fill colors
+</li></ul>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eev"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ev</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">ident</i></span>]</var><a class="copiable-link" href='#index-_002eev'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ev"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eev_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.ev]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eev_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eev-1"></a>
+<a class="index-entry-id" id="index-switching-environments-_0028ev_0029"></a>
+<a class="index-entry-id" id="index-environment_002c-switching-_0028ev_0029"></a>
+<a class="index-entry-id" id="index-environment-number_002fname-register-_0028_002eev_0029"></a>
+<p>Enter the environment <var class="var">ident</var>, which is created if it does not
+already exist, using the same parameters as for the default environment
+used at startup. With no argument, GNU <code class="code">troff</code> switches to the
+previous environment.
+</p>
+<p>Invoking <code class="code">ev</code> with an argument puts environment <var class="var">ident</var> onto
+the top of the environment stack. (If it isn&rsquo;t already present in the
+stack, this is a proper push.) Without an argument, <code class="code">ev</code> pops the
+environment stack, making the previous environment current. It is an
+error to pop the environment stack with no previous environment
+available. The read-only string-valued register <code class="code">.ev</code> contains the
+name of the current environment&mdash;the one at the top of the stack.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ev footnote-env
+.fam N
+.ps 6
+.vs 8
+.ll -.5i
+.ev
+
+<span class="r">&hellip;</span>
+
+.ev footnote-env
+\[dg] Observe the smaller text and vertical spacing.
+.ev
+</pre></div></div>
+
+<p>We can familiarize ourselves with stack behavior by wrapping the
+<code class="code">ev</code> request with a macro that reports the contents of the
+<code class="code">.ev</code> register to the standard error stream.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de EV
+. ev \\$1
+. tm environment is now \\n[.ev]
+..
+.
+.EV foo
+.EV bar
+.EV
+.EV baz
+.EV
+.EV
+.EV
+</pre></div></div>
+
+<div class="example">
+<div class="group"><pre class="example-preformatted"> error&rarr; environment is now foo
+ error&rarr; environment is now bar
+ error&rarr; environment is now foo
+ error&rarr; environment is now baz
+ error&rarr; environment is now foo
+ error&rarr; environment is now 0
+ error&rarr; error: environment stack underflow
+ error&rarr; environment is now 0
+</pre></div></div>
+
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eevc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.evc</code></strong> <var class="def-var-arguments">environment</var><a class="copiable-link" href='#index-_002eevc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-evc"></a>
+<a class="index-entry-id" id="index-copying-environment-_0028evc_0029"></a>
+<a class="index-entry-id" id="index-environment_002c-copying-_0028evc_0029"></a>
+<p>Copy the contents of <var class="var">environment</var> to the current environment.
+</p>
+<p>The following environment data are not copied.
+</p>
+<ul class="itemize mark-bullet">
+<li>a partially collected line, if present;
+
+</li><li>the interruption status of the previous input line (due to use of the
+<code class="code">\c</code> escape sequence);
+
+</li><li>the count of remaining lines to center, to right-justify, or to
+underline (with or without underlined spaces)&mdash;these are set to zero;
+
+</li><li>the activation status of temporary indentation;
+
+</li><li>input line traps and their associated data;
+
+</li><li>the activation status of line numbering (which can be reactivated with
+&lsquo;<samp class="samp">.nm&nbsp;+0</samp>&rsquo;<!-- /@w -->); and
+
+</li><li>the count of consecutive hyphenated lines (set to zero).
+</li></ul>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002ew_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.w]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ew_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ew"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002echt_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.cht]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002echt_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002echt"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ecdp_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.cdp]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ecdp_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ecdp"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ecsk_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.csk]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ecsk_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ecsk"></a>
+<a class="index-entry-id" id="index-environment_002c-dimensions-of-last-glyph-_0028_002ew_002c-_002echt_002c-_002ecdp_002c-_002ecsk_0029"></a>
+<a class="index-entry-id" id="index-width_002c-of-last-glyph-_0028_002ew_0029"></a>
+<a class="index-entry-id" id="index-height_002c-of-last-glyph-_0028_002echt_0029"></a>
+<a class="index-entry-id" id="index-depth_002c-of-last-glyph-_0028_002ecdp_0029"></a>
+<a class="index-entry-id" id="index-skew_002c-of-last-glyph-_0028_002ecsk_0029"></a>
+<a class="index-entry-id" id="index-last-glyph_002c-dimensions-_0028_002ew_002c-_002echt_002c-_002ecdp_002c-_002ecsk_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-last_002c-dimensions-_0028_002ew_002c-_002echt_002c-_002ecdp_002c-_002ecsk_0029"></a>
+<p>The <code class="code">\n[.w]</code> register contains the width of the last glyph
+formatted in the environment.
+</p>
+<p>The <code class="code">\n[.cht]</code> register contains the height of the last glyph
+formatted in the environment.
+</p>
+<p>The <code class="code">\n[.cdp]</code> register contains the depth of the last glyph
+formatted in the environment. It is positive for glyphs extending below
+the baseline.
+</p>
+<p>The <code class="code">\n[.csk]</code> register contains the <em class="dfn">skew</em> (how far to the
+right of the glyph&rsquo;s center that GNU <code class="code">troff</code> should place an
+accent) of the last glyph formatted in the environment.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002en_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.n]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002en_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002en"></a>
+<a class="index-entry-id" id="index-environment_002c-previous-line-length-_0028_002en_0029"></a>
+<a class="index-entry-id" id="index-line-length_002c-previous-_0028_002en_0029"></a>
+<a class="index-entry-id" id="index-length-of-previous-line-_0028_002en_0029"></a>
+<a class="index-entry-id" id="index-previous-line-length-_0028_002en_0029"></a>
+<p>The <code class="code">\n[.n]</code> register contains the length of the previous output
+line emitted in the environment.
+</p></dd></dl>
+
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Suppressing-Output">
+<div class="nav-panel">
+<p>
+Next: <a href="#Colors" accesskey="n" rel="next">Colors</a>, Previous: <a href="#Environments" accesskey="p" rel="prev">Environments</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Suppressing-Output-1">5.32 Suppressing Output</h3>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cO_005bnum_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\O[</code><span class="r"><i class="slanted">num</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cO_005bnum_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cO"></a>
+<a class="index-entry-id" id="index-suppressing-output-_0028_005cO_0029"></a>
+<a class="index-entry-id" id="index-output_002c-suppressing-_0028_005cO_0029"></a>
+<p>Suppress GNU <code class="code">troff</code> output of glyphs and geometric objects. The
+sequences <code class="code">\O2</code>, <code class="code">\O3</code>, <code class="code">\O4</code>, and <code class="code">\O5</code> are
+intended for internal use by <code class="code">grohtml</code>.
+</p>
+<dl class="table">
+<dt>&lsquo;<samp class="samp">\O0</samp>&rsquo;</dt>
+<dd><p>Disable the emission of glyphs and geometric objects to the output
+driver, provided that this sequence occurs at the outermost suppression
+level (see <code class="code">\O3</code> and <code class="code">\04</code> below). Horizontal motions
+corresponding to non-overstruck glyph widths still occur.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">\O1</samp>&rsquo;</dt>
+<dd><p>Enable the emission of glyphs and geometric objects to the output
+driver, provided that this sequence occurs at the outermost suppression
+level.
+</p></dd>
+</dl>
+
+<a class="index-entry-id" id="index-opminx"></a>
+<a class="index-entry-id" id="index-opminy"></a>
+<a class="index-entry-id" id="index-opmaxx"></a>
+<a class="index-entry-id" id="index-opmaxy"></a>
+<p><code class="code">\O0</code> and <code class="code">\O1</code> also reset the four registers <code class="code">opminx</code>,
+<code class="code">opminy</code>, <code class="code">opmaxx</code>, and <code class="code">opmaxy</code> to &minus;1. These
+four registers mark the top left and bottom right hand corners of a box
+encompassing all written or drawn output.
+</p>
+<dl class="table">
+<dt>&lsquo;<samp class="samp">\O2</samp>&rsquo;</dt>
+<dd><p>At the outermost suppression level, enable emission of glyphs and
+geometric objects, and write to the standard error stream the page
+number and values of the four aforementioned registers encompassing
+glyphs written since the last interpolation of a <code class="code">\O</code> sequence, as
+well as the page offset, line length, image file name (if any),
+horizontal and vertical device motion quanta, and input file name.
+Numeric values are in basic units.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">\O3</samp>&rsquo;</dt>
+<dd><p>Begin a nested suppression level. <code class="command">grohtml</code> uses this mechanism
+to create images of output preprocessed with <code class="command">gpic</code>,
+<code class="command">geqn</code>, and <code class="command">gtbl</code>. At startup, GNU <code class="code">troff</code> is at
+the outermost suppression level. <code class="command">pre-grohtml</code> generates these
+sequences when processing the document, using GNU <code class="command">troff</code> with
+the <code class="code">ps</code> output device, Ghostscript, and the PNM tools to produce
+images in PNG format. They start a new page if the device is not
+<code class="code">html</code> or <code class="code">xhtml</code>, to reduce the number of images crossing a
+page boundary.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">\O4</samp>&rsquo;</dt>
+<dd><p>End a nested suppression level.
+</p></dd>
+</dl>
+
+<dl class="table">
+<dt>&lsquo;<samp class="samp">\O[5<var class="var">P</var><var class="var">file</var>]</samp>&rsquo;</dt>
+<dd><p>At the outermost suppression level, write the name <code class="code">file</code> to the
+standard error stream at position <var class="var">P</var>, which must be one of
+<code class="code">l</code>, <code class="code">r</code>, <code class="code">c</code>, or&nbsp;<code class="code">i</code>, corresponding to left,
+right, centered, and inline alignments within the document,
+respectively. <var class="var">file</var> is a name associated with the production of
+the next image.
+</p></dd>
+</dl>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002eO_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.O]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eO_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eO"></a>
+<a class="index-entry-id" id="index-suppression-nesting-level-register"></a>
+<a class="index-entry-id" id="index-nesting-level_002c-suppression_002c-register"></a>
+<a class="index-entry-id" id="index-level_002c-suppression-nesting_002c-register"></a>
+<p>Output suppression nesting level applied by <code class="code">\O3</code> and <code class="code">\O4</code>
+escape sequences.
+</p></dd></dl>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="I_002fO">
+<div class="nav-panel">
+<p>
+Next: <a href="#Postprocessor-Access" accesskey="n" rel="next">Postprocessor Access</a>, Previous: <a href="#Suppressing-Output" accesskey="p" rel="prev">Suppressing Output</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="I_002fO-1">5.33 I/O</h3>
+<a class="index-entry-id" id="index-i_002fo"></a>
+<a class="index-entry-id" id="index-input-and-output-requests"></a>
+<a class="index-entry-id" id="index-requests-for-input-and-output"></a>
+<a class="index-entry-id" id="index-output-and-input-requests"></a>
+
+<p><code class="code">gtroff</code> has several requests for including files:
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eso"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.so</code></strong> <var class="def-var-arguments">file</var><a class="copiable-link" href='#index-_002eso'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-so"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002esoquiet"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.soquiet</code></strong> <var class="def-var-arguments">file</var><a class="copiable-link" href='#index-_002esoquiet'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-soquiet"></a>
+<a class="index-entry-id" id="index-including-a-file-_0028so_0029"></a>
+<a class="index-entry-id" id="index-file_002c-inclusion-_0028so_0029"></a>
+<p>Replace the <code class="code">so</code> request&rsquo;s control line with the contents of the
+file named by the argument, &ldquo;sourcing&rdquo; it. <var class="var">file</var> is sought in
+the directories specified by <samp class="option">-I</samp> command-line option. If
+<var class="var">file</var> does not exist, a warning in category &lsquo;<samp class="samp">file</samp>&rsquo; is produced
+and the request has no further effect. See <a class="xref" href="#Warnings">Warnings</a>, for
+information about the enablement and suppression of warnings.
+</p>
+<p><code class="code">so</code> can be useful for large documents; e.g., allowing each chapter
+of a book to be kept in a separate file. However, files interpolated
+with <code class="code">so</code> are not preprocessed; to overcome this limitation, see
+the <cite class="cite">gsoelim<span class="r">(1)</span></cite> man page.
+</p>
+<p>Since GNU <code class="code">troff</code> replaces the entire control line with the
+contents of a file, it matters whether <code class="code">file</code> is terminated with a
+newline or not. Assume that file <samp class="file">xxx</samp> contains only the word
+&lsquo;<samp class="samp">foo</samp>&rsquo; without a trailing newline.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">$ printf 'foo' &gt; xxx
+
+The situation is
+.so xxx
+bar.
+ &rArr; The situation is foobar.
+</pre></div></div>
+
+<p><code class="code">soquiet</code> works the same way, except that no warning diagnostic is
+issued if <var class="var">file</var> does not exist.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epso"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pso</code></strong> <var class="def-var-arguments">command</var><a class="copiable-link" href='#index-_002epso'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-pso"></a>
+<p>Read the standard output from the specified <var class="var">command</var> and include
+it in place of the <code class="code">pso</code> request.
+</p>
+<a class="index-entry-id" id="index-safer-mode-3"></a>
+<a class="index-entry-id" id="index-mode_002c-safer-3"></a>
+<a class="index-entry-id" id="index-unsafe-mode-3"></a>
+<a class="index-entry-id" id="index-mode_002c-unsafe-3"></a>
+<p>It is an error to use this request in safer mode, which is the
+default. Invoke GNU <code class="code">troff</code> or a front end with the <samp class="option">-U</samp>
+option to enable unsafe mode.
+</p>
+<p>The comment regarding a final newline for the <code class="code">so</code> request is valid
+for <code class="code">pso</code> also.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002emso"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.mso</code></strong> <var class="def-var-arguments">file</var><a class="copiable-link" href='#index-_002emso'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-mso"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002emsoquiet"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.msoquiet</code></strong> <var class="def-var-arguments">file</var><a class="copiable-link" href='#index-_002emsoquiet'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-msoquiet"></a>
+<p>Identical to the <code class="code">so</code> and <code class="code">soquiet</code> requests, respectively,
+except that <code class="code">gtroff</code> searches for the specified <var class="var">file</var> in the
+same directories as macro files for the <samp class="option">-m</samp> command-line option.
+If the file name to be included has the form <samp class="file"><var class="var">name</var>.tmac</samp> and
+it isn&rsquo;t found, these requests try to include <samp class="file">tmac.<var class="var">name</var></samp> and
+vice versa.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002etrf"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.trf</code></strong> <var class="def-var-arguments">file</var><a class="copiable-link" href='#index-_002etrf'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-trf"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002ecf"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.cf</code></strong> <var class="def-var-arguments">file</var><a class="copiable-link" href='#index-_002ecf'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-cf"></a>
+<a class="index-entry-id" id="index-transparent-output-_0028cf_002c-trf_0029"></a>
+<a class="index-entry-id" id="index-output_002c-transparent-_0028cf_002c-trf_0029"></a>
+<a class="index-entry-id" id="index-cf-request_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-cf-request"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-cf-request"></a>
+<a class="index-entry-id" id="index-trf-request_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-trf-request"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-trf-request"></a>
+<p>Transparently output the contents of <var class="var">file</var>. Each line is output as
+if it were preceded by <code class="code">\!</code>; however, the lines are <em class="emph">not</em>
+subject to copy mode interpretation. If the file does not end with a
+newline, <code class="code">trf</code> adds one. Both requests cause a break.
+</p>
+<p>When used in a diversion, these requests embed a node (see <a class="pxref" href="#Gtroff-Internals"><code class="code">gtroff</code> Internals</a>) in it that, when reread, causes the contents of <var class="var">file</var>
+to be transparently copied to the output. In <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code>, the contents of <var class="var">file</var> are immediately copied to the
+output regardless of whether there is a current diversion; this
+behaviour is so anomalous that it must be considered a bug.
+</p>
+<a class="index-entry-id" id="index-trf-request_002c-and-invalid-characters"></a>
+<a class="index-entry-id" id="index-characters_002c-invalid-for-trf-request"></a>
+<a class="index-entry-id" id="index-invalid-characters-for-trf-request"></a>
+<p>While <code class="code">cf</code> copies the contents of <var class="var">file</var> completely
+unprocessed, <code class="code">trf</code> disallows characters such as NUL that are not
+valid <code class="code">gtroff</code> input characters (see <a class="pxref" href="#Identifiers">Identifiers</a>).
+</p>
+<p>For <code class="code">cf</code>, within a diversion, &ldquo;completely unprocessed&rdquo; means that
+each line of a file to be inserted is handled as if it were preceded by
+<code class="code">\!\\!</code>.
+</p>
+<p>To define a macro&nbsp;<code class="code">x</code> containing the contents of
+file&nbsp;<samp class="file">f</samp>, use
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ev 1
+.di x
+.trf f
+.di
+.ev
+</pre></div></div>
+
+<p>The calls to <code class="code">ev</code> prevent the partially collected output line
+from becoming part of the diversion (see <a class="pxref" href="#Diversions">Diversions</a>).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enx"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nx</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">file</i></span>]</var><a class="copiable-link" href='#index-_002enx'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nx"></a>
+<a class="index-entry-id" id="index-processing-next-file-_0028nx_0029"></a>
+<a class="index-entry-id" id="index-file_002c-processing-next-_0028nx_0029"></a>
+<a class="index-entry-id" id="index-next-file_002c-processing-_0028nx_0029"></a>
+<p>Force <code class="code">gtroff</code> to continue processing of the file specified as an
+argument. If no argument is given, immediately jump to the end of file.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002erd"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.rd</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">prompt</i></span> [<span class="r"><i class="slanted">arg1</i></span> <span class="r"><i class="slanted">arg2</i></span> &hellip;]]</var><a class="copiable-link" href='#index-_002erd'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rd"></a>
+<a class="index-entry-id" id="index-reading-from-standard-input-_0028rd_0029"></a>
+<a class="index-entry-id" id="index-standard-input_002c-reading-from-_0028rd_0029"></a>
+<a class="index-entry-id" id="index-input_002c-standard_002c-reading-from-_0028rd_0029"></a>
+<p>Read from standard input, and include what is read as though it were
+part of the input file. Text is read until a blank line is encountered.
+</p>
+<p>If standard input is a TTY input device (keyboard), write <var class="var">prompt</var>
+to standard error, followed by a colon (or send BEL for a beep if no
+argument is given).
+</p>
+<p>Arguments after <var class="var">prompt</var> are available for the input. For example,
+the line
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.rd data foo bar
+</pre></div></div>
+
+<p>with the input &lsquo;<samp class="samp">This&nbsp;is&nbsp;\$2.</samp>&rsquo;<!-- /@w --> prints
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">This is bar.
+</pre></div></div>
+</dd></dl>
+
+<a class="index-entry-id" id="index-form-letters"></a>
+<a class="index-entry-id" id="index-letters_002c-form"></a>
+<p>Using the <code class="code">nx</code> and <code class="code">rd</code> requests, it is easy to set up form
+letters. The form letter template is constructed like this, putting the
+following lines into a file called <samp class="file">repeat.let</samp>:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ce
+\*(td
+.sp 2
+.nf
+.rd
+.sp
+.rd
+.fi
+Body of letter.
+.bp
+.nx repeat.let
+</pre></div></div>
+
+<a class="index-entry-id" id="index-ex-request_002c-used-with-nx-and-rd"></a>
+<p>When this is run, a file containing the following lines should be
+redirected in. Requests included in this file are executed as though
+they were part of the form letter. The last block of input is the
+<code class="code">ex</code> request, which tells GNU <code class="code">troff</code> to stop processing. If
+this were not there, <code class="code">troff</code> would not know when to stop.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">Trent A. Fisher
+708 NW 19th Av., #202
+Portland, OR 97209
+
+Dear Trent,
+
+Len Adollar
+4315 Sierra Vista
+San Diego, CA 92103
+
+Dear Mr. Adollar,
+
+.ex
+</pre></div></div>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epi"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pi</code></strong> <var class="def-var-arguments">pipe</var><a class="copiable-link" href='#index-_002epi'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-pi"></a>
+<p>Pipe the output of <code class="code">gtroff</code> to the shell command(s) specified by
+<var class="var">pipe</var>. This request must occur before <code class="code">gtroff</code> has a chance
+to print anything.
+</p>
+<a class="index-entry-id" id="index-safer-mode-4"></a>
+<a class="index-entry-id" id="index-mode_002c-safer-4"></a>
+<a class="index-entry-id" id="index-unsafe-mode-4"></a>
+<a class="index-entry-id" id="index-mode_002c-unsafe-4"></a>
+<p>It is an error to use this request in safer mode, which is the
+default. Invoke GNU <code class="code">troff</code> or a front end with the <samp class="option">-U</samp>
+option to enable unsafe mode.
+</p>
+<p>Multiple calls to <code class="code">pi</code> are allowed, acting as a chain. For
+example,
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.pi foo
+.pi bar
+...
+</pre></div></div>
+
+<p>is the same as &lsquo;<samp class="samp">.pi&nbsp;foo&nbsp;|&nbsp;bar</samp>&rsquo;<!-- /@w -->.
+</p>
+<a class="index-entry-id" id="index-groff_002c-and-pi-request"></a>
+<a class="index-entry-id" id="index-pi-request_002c-and-groff"></a>
+<p>The intermediate output format of GNU <code class="code">troff</code> is piped to the
+specified commands. Consequently, calling <code class="code">groff</code> without the
+<samp class="option">-Z</samp> option normally causes a fatal error.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-system-commands_002c-running"></a>
+<a class="index-entry-id" id="index-running-system-commands"></a>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002esy"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.sy</code></strong> <var class="def-var-arguments">cmds</var><a class="copiable-link" href='#index-_002esy'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-sy"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005bsystat_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[systat]</code></strong><a class="copiable-link" href='#index-_005cn_005bsystat_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-systat"></a>
+<p>Execute the shell command(s) specified by <var class="var">cmds</var>. The output is not
+saved anywhere, so it is up to the user to do so.
+</p>
+<a class="index-entry-id" id="index-safer-mode-5"></a>
+<a class="index-entry-id" id="index-mode_002c-safer-5"></a>
+<a class="index-entry-id" id="index-unsafe-mode-5"></a>
+<a class="index-entry-id" id="index-mode_002c-unsafe-5"></a>
+<p>It is an error to use this request in safer mode; this is the default.
+Give GNU <code class="code">troff</code> or a front end program the <samp class="option">-U</samp> option to
+enable unsafe mode.
+</p>
+<p>The following code fragment introduces the current time into a document.
+</p>
+<a class="index-entry-id" id="index-perl"></a>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.sy perl -e 'printf &quot;.nr H %d\\n.nr M %d\\n.nr S %d\\n&quot;,\
+ (localtime(time))[2,1,0]' &gt; /tmp/x\n[$$]
+.so /tmp/x\n[$$]
+.sy rm /tmp/x\n[$$]
+\nH:\nM:\nS
+</pre></div></div>
+
+<p>This works by having the Perl script (run by <code class="code">sy</code>) write
+<code class="code">nr</code> requests that set the registers <code class="code">H</code>, <code class="code">M</code>, and
+<code class="code">S</code> to a temporary file. The <code class="code">roff</code> document then reads the
+temporary file using the <code class="code">so</code> request.
+</p>
+<a class="index-entry-id" id="index-time_002c-formatting"></a>
+<a class="index-entry-id" id="index-formatting-the-time"></a>
+<p>The registers <code class="code">seconds</code>, <code class="code">minutes</code>, and <code class="code">hours</code>,
+initialized at startup of GNU <code class="code">troff</code>, should satisfy most
+requirements. Use the <code class="code">af</code> request to format their values for
+output.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.af hours 00
+.af minutes 00
+.af seconds 00
+\n[hours]:\n[minutes]:\n[seconds]
+ &rArr; 02:17:54
+</pre></div></div>
+
+<a class="index-entry-id" id="index-system_0028_0029-return-value-register-_0028systat_0029"></a>
+<p>The writable register <code class="code">systat</code> contains the return value of the
+<code class="code">system()</code> function executed by the last <code class="code">sy</code> request.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eopen"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.open</code></strong> <var class="def-var-arguments">stream file</var><a class="copiable-link" href='#index-_002eopen'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-open"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eopena"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.opena</code></strong> <var class="def-var-arguments">stream file</var><a class="copiable-link" href='#index-_002eopena'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-opena"></a>
+<a class="index-entry-id" id="index-opening-file-_0028open_0029"></a>
+<a class="index-entry-id" id="index-file_002c-opening-_0028open_0029"></a>
+<a class="index-entry-id" id="index-appending-to-a-file-_0028opena_0029"></a>
+<a class="index-entry-id" id="index-file_002c-appending-to-_0028opena_0029"></a>
+<p>Open the specified <var class="var">file</var> for writing and associates the specified
+<var class="var">stream</var> with it.
+</p>
+<p>The <code class="code">opena</code> request is like <code class="code">open</code>, but if the file exists,
+append to it instead of truncating it.
+</p>
+<a class="index-entry-id" id="index-safer-mode-6"></a>
+<a class="index-entry-id" id="index-mode_002c-safer-6"></a>
+<a class="index-entry-id" id="index-unsafe-mode-6"></a>
+<a class="index-entry-id" id="index-mode_002c-unsafe-6"></a>
+<p>It is an error to use these requests in safer mode; this is the default.
+Give GNU <code class="code">troff</code> or a front end program the <samp class="option">-U</samp> option to
+enable unsafe mode.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ewrite"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.write</code></strong> <var class="def-var-arguments">stream data</var><a class="copiable-link" href='#index-_002ewrite'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-write"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002ewritec"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.writec</code></strong> <var class="def-var-arguments">stream data</var><a class="copiable-link" href='#index-_002ewritec'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-writec"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-write-request"></a>
+<a class="index-entry-id" id="index-write-request_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-write-request"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-writec-request"></a>
+<a class="index-entry-id" id="index-writec-request_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-writec-request"></a>
+<a class="index-entry-id" id="index-writing-to-file-_0028write_002c-writec_0029"></a>
+<a class="index-entry-id" id="index-file_002c-writing-to-_0028write_002c-writec_0029"></a>
+<p>Write to the file associated with the specified <var class="var">stream</var>. The
+stream must previously have been the subject of an open request. The
+remainder of the line is interpreted as the <code class="code">ds</code> request reads its
+second argument: an initial neutral double quote in <var class="var">contents</var> is
+stripped to allow embedding of leading spaces, and it is read in copy
+mode.
+</p>
+<p>The <code class="code">writec</code> request is like <code class="code">write</code>, but only <code class="code">write</code>
+appends a newline to the data.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ewritem"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.writem</code></strong> <var class="def-var-arguments">stream xx</var><a class="copiable-link" href='#index-_002ewritem'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-writem"></a>
+<a class="index-entry-id" id="index-asciify-request_002c-and-writem"></a>
+<p>Write the contents of the macro or string <var class="var">xx</var> to the file
+associated with the specified <var class="var">stream</var>.
+</p>
+<a class="index-entry-id" id="index-writem-request_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-writem-request"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-writem-request"></a>
+<p><var class="var">xx</var> is read in copy mode, i.e., already formatted elements are
+ignored. Consequently, diversions must be unformatted with the
+<code class="code">asciify</code> request before calling <code class="code">writem</code>. Usually, this
+means a loss of information.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eclose"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.close</code></strong> <var class="def-var-arguments">stream</var><a class="copiable-link" href='#index-_002eclose'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-close"></a>
+<a class="index-entry-id" id="index-closing-file-_0028close_0029"></a>
+<a class="index-entry-id" id="index-file_002c-closing-_0028close_0029"></a>
+<p>Close the specified <var class="var">stream</var>; the stream is no longer an acceptable
+argument to the <code class="code">write</code> request.
+</p>
+<p>Here a simple macro to write an index entry.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.open idx test.idx
+.
+.de IX
+. write idx \\n[%] \\$*
+..
+.
+.IX test entry
+.
+.close idx
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cVe"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\V</code><span class="r"><i class="slanted">e</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cVe'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cV"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cV_0028ev"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\V(</code><span class="r"><i class="slanted">ev</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cV_0028ev'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cV_005benv_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\V[</code><span class="r"><i class="slanted">env</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cV_005benv_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cV_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-_005cV"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-_005cV"></a>
+<p>Interpolate the contents of the specified environment variable <var class="var">env</var>
+(one-character name&nbsp;<var class="var">e</var>, two-character name <var class="var">ev</var>) as
+returned by the function <cite class="cite">getenv<span class="r">(3)</span></cite>. <code class="code">\V</code> is interpreted
+even in copy mode (see <a class="pxref" href="#Copy-Mode">Copy Mode</a>).
+</p></dd></dl>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Postprocessor-Access">
+<div class="nav-panel">
+<p>
+Next: <a href="#Miscellaneous" accesskey="n" rel="next">Miscellaneous</a>, Previous: <a href="#I_002fO" accesskey="p" rel="prev">I/O</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Postprocessor-Access-1">5.34 Postprocessor Access</h3>
+<a class="index-entry-id" id="index-postprocessor-access"></a>
+<a class="index-entry-id" id="index-access-to-postprocessor"></a>
+
+<p>Two escape sequences and two requests enable documents to pass
+information directly to a postprocessor. These are useful for
+exercising device-specific capabilities that the <code class="code">groff</code> language
+does not abstract or generalize; examples include the embedding of
+hyperlinks and image files. Device-specific functions are documented in
+each output driver&rsquo;s man page, such as <cite class="cite">gropdf<span class="r">(1)</span></cite>,
+<cite class="cite">grops<span class="r">(1)</span></cite>, or <cite class="cite">grotty<span class="r">(1)</span></cite>.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002edevice"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.device</code></strong> <var class="def-var-arguments">xxx <span class="r">&hellip;</span></var><a class="copiable-link" href='#index-_002edevice'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-device"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cX_0027xxx-_2026_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\X<code class="code">'</code></code><span class="r"><i class="slanted">xxx <span class="r">&hellip;</span></i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cX_0027xxx-_2026_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cX"></a>
+<p>Embed all <var class="var">xxx</var> arguments into GNU <code class="code">troff</code> output as parameters
+to a device control command &lsquo;<samp class="samp">x&nbsp;X</samp>&rsquo;<!-- /@w -->. The meaning and
+interpretation of such parameters is determined by the output driver or
+other postprocessor.
+</p>
+<a class="index-entry-id" id="index-device-request_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-device-request"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-device-request"></a>
+<p>The <code class="code">device</code> request processes its arguments in copy mode
+(see <a class="pxref" href="#Copy-Mode">Copy Mode</a>). An initial neutral double quote in <var class="var">contents</var>
+is stripped to allow embedding of leading spaces.
+<a class="index-entry-id" id="index-_005c_0026_002c-in-_005cX"></a>
+<a class="index-entry-id" id="index-_005c_0029_002c-in-_005cX"></a>
+<a class="index-entry-id" id="index-_005c_0025_002c-in-_005cX"></a>
+<a class="index-entry-id" id="index-_005c_003a_002c-in-_005cX"></a>
+By contrast, within <code class="code">\X</code> arguments, the escape sequences <code class="code">\&amp;</code>,
+<code class="code">\)</code>, <code class="code">\%</code>, and <code class="code">\:</code> are ignored; <code class="code">\<kbd class="key">SP</kbd></code> and
+<code class="code">\~</code> are converted to single space characters; and <code class="code">\\</code> has
+its escape character stripped. So that the basic Latin subset of the
+Unicode character set<a class="footnote" id="DOCF115" href="#FOOT115"><sup>115</sup></a> can be reliably encoded in device control
+commands, seven special character escape sequences (&lsquo;<samp class="samp">\-</samp>&rsquo;,
+&lsquo;<samp class="samp">\[aq]</samp>&rsquo;, &lsquo;<samp class="samp">\[dq]</samp>&rsquo;, &lsquo;<samp class="samp">\[ga]</samp>&rsquo;, &lsquo;<samp class="samp">\[ha]</samp>&rsquo;, &lsquo;<samp class="samp">\[rs]</samp>&rsquo;,
+and &lsquo;<samp class="samp">\[ti]</samp>&rsquo;,) are mapped to basic Latin characters; see the
+<cite class="cite">groff_char<span class="r">(7)</span></cite> man page. For this transformation, character
+translations and special character definitions are
+ignored.<a class="footnote" id="DOCF116" href="#FOOT116"><sup>116</sup></a> The use of any
+other escape sequence in <code class="code">\X</code> parameters is normally an error.
+</p>
+<a class="index-entry-id" id="index-use_005fcharnames_005fin_005fspecial"></a>
+<a class="index-entry-id" id="index-DESC-file_002c-and-use_005fcharnames_005fin_005fspecial-keyword"></a>
+<a class="index-entry-id" id="index-_005cX_002c-and-special-characters"></a>
+<p>If the <code class="code">use_charnames_in_special</code> directive appears in the output
+device&rsquo;s <samp class="file">DESC</samp> file, the use of special character escape sequences
+is <em class="emph">not</em> an error; they are simply output verbatim (with the
+exception of the seven mapped to Unicode basic Latin characters,
+discussed above). <code class="code">use_charnames_in_special</code> is currently employed
+only by <code class="code">grohtml</code>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002edevicem"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.devicem</code></strong> <var class="def-var-arguments">name</var><a class="copiable-link" href='#index-_002edevicem'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-devicem"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cYn"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\Y</code><span class="r"><i class="slanted">n</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cYn'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cY"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cY_0028nm"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\Y(</code><span class="r"><i class="slanted">nm</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cY_0028nm'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cY_005bname_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\Y[</code><span class="r"><i class="slanted">name</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cY_005bname_005d'> &para;</a></span></dt>
+<dd><p>This is approximately equivalent to &lsquo;<samp class="samp">\X'\*[<var class="var">name</var>]'</samp>&rsquo;
+(one-character name&nbsp;<var class="var">n</var>, two-character name <var class="var">nm</var>).
+However, the contents of the string or macro <var class="var">name</var> are not
+interpreted; also it is permitted for <var class="var">name</var> to have been defined as
+a macro and thus contain newlines (it is not permitted for the argument
+to <code class="code">\X</code> to contain newlines). The inclusion of newlines requires
+an extension to the <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> output format, and
+confuses drivers that do not know about this extension (see <a class="pxref" href="#Device-Control-Commands">Device Control Commands</a>).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002etag"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.tag</code></strong> <var class="def-var-arguments">name</var><a class="copiable-link" href='#index-_002etag'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-tag"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002etaga"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.taga</code></strong> <var class="def-var-arguments">name</var><a class="copiable-link" href='#index-_002etaga'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-taga"></a>
+<p>Reserved for internal use.
+</p></dd></dl>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Miscellaneous">
+<div class="nav-panel">
+<p>
+Next: <a href="#Gtroff-Internals" accesskey="n" rel="next"><code class="code">gtroff</code> Internals</a>, Previous: <a href="#Postprocessor-Access" accesskey="p" rel="prev">Postprocessor Access</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Miscellaneous-1">5.35 Miscellaneous</h3>
+
+<p>We document here GNU <code class="code">troff</code> features that fit poorly elsewhere.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enm"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nm</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">start</i></span> [<span class="r"><i class="slanted">increment</i></span> [<span class="r"><i class="slanted">space</i></span> [<span class="r"><i class="slanted">indentation</i></span>]]]]</var><a class="copiable-link" href='#index-_002enm'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nm"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005bln_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[ln]</code></strong><a class="copiable-link" href='#index-_005cn_005bln_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ln"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002enm_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.nm]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002enm_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002enm-1"></a>
+<a class="index-entry-id" id="index-printing-line-numbers-_0028nm_0029"></a>
+<a class="index-entry-id" id="index-line-numbers_002c-printing-_0028nm_0029"></a>
+<a class="index-entry-id" id="index-numbers_002c-line_002c-printing-_0028nm_0029"></a>
+<p>Begin (or, with no arguments, cease) numbering output lines.
+<var class="var">start</var> assigns the number of the <em class="emph">next</em> output line. Only
+line numbers divisible by <var class="var">increment</var> are marked (default:
+&lsquo;<samp class="samp">1</samp>&rsquo;). <var class="var">space</var> configures the horizontal spacing between the
+number and the text (default: &lsquo;<samp class="samp">1</samp>&rsquo;). Any given <var class="var">indentation</var> is
+applied to the numbers (default: &lsquo;<samp class="samp">0</samp>&rsquo;). The third and fourth
+arguments are reckoned in numeral widths (<code class="code">\0</code>). <var class="var">start</var> must
+be non-negative and <var class="var">increment</var> positive.
+</p>
+<p>The formatter aligns the number to the right in a width of three numeral
+spaces plus <var class="var">indentation</var>, then catenates <var class="var">space</var> and the output
+line. The line length is <em class="emph">not</em> reduced. Depending on the value of
+the page offset,<a class="footnote" id="DOCF117" href="#FOOT117"><sup>117</sup></a> numbers wider than
+the allocated space protrude into the left margin, or shift the output
+line to the right.
+</p>
+<p>Line numbering parameters corresponding to missing arguments are not
+altered. After numbering is disabled, &lsquo;<samp class="samp">.nm +0</samp>&rsquo; resumes it using
+the previously active parameters.
+</p>
+<p>The parameters of <code class="code">nm</code> are associated with the environment
+(see <a class="pxref" href="#Environments">Environments</a>).
+</p>
+<a class="index-entry-id" id="index-output-line-number-register-_0028ln_0029"></a>
+<a class="index-entry-id" id="index-line-number_002c-output_002c-register-_0028ln_0029"></a>
+<p>While numbering is enabled, the output line number register <code class="code">ln</code> is
+updated as each line is output, even if no line number is formatted with
+it because it is being skipped (it is not a multiple of <var class="var">increment</var>)
+or because numbering is suppressed (see the <code class="code">nn</code> request below).
+</p>
+<p>The <code class="code">.nm</code> register tracks the enablement status of numbering.
+Temporary suspension of numbering with the <code class="code">nn</code> request does
+<em class="emph">not</em> alter its value.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.po 5n
+.ll 44n
+Programming,
+when stripped of all its circumstantial irrelevancies,
+.nm 999 1 1 -4
+boils down to no more and no less than
+.nm +0 3
+very effective thinking so as to avoid unmastered
+.nn 2
+complexity,
+to very vigorous separation of your many
+different concerns.
+.br
+\(em Edsger Dijkstra
+.sp
+.nm 1 1 1
+This guy's arrogance takes your breath away.
+.br
+\(em John Backus
+ &rArr; Programming, when stripped of all its cir-
+ &rArr; 999 cumstantial irrelevancies, boils down to no
+ &rArr; more and no less than very effective think-
+ &rArr; ing so as to avoid unmastered complexity, to
+ &rArr; very vigorous separation of your many dif-
+ &rArr; ferent concerns.
+ &rArr; 1002 -- Edsger Dijkstra
+ &rArr;
+ &rArr; 1 This guy&rsquo;s arrogance takes your breath away.
+ &rArr; 2 -- John Backus
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enn"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nn</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">skip</i></span>]</var><a class="copiable-link" href='#index-_002enn'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nn"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002enn_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.nn]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002enn_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002enn-1"></a>
+<p>Suppress numbering of the next <var class="var">skip</var> output lines that would
+otherwise be numbered. The default is&nbsp;1. <code class="code">nn</code> can be invoked
+when line numbering is not active; suppression of numbering will take
+effect for <var class="var">skip</var> lines once <code class="code">nm</code> enables it.
+</p>
+<p>The <code class="code">.nn</code> register stores the count of output lines still to have
+their numbering suppressed.
+</p>
+<p>This count is associated with the environment (see <a class="pxref" href="#Environments">Environments</a>).
+</p></dd></dl>
+
+<p>To test whether the current output line will be numbered, you must check
+both the <code class="code">.nm</code> and <code class="code">.nn</code> registers.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> .de is-numbered
+ . nop This line
+ . ie (\\n[.nm] &amp; (1-\\n[.nn])) IS
+ . el ISN'T
+ . nop numbered.
+ . br
+ ..
+ Test line numbering.
+ .is-numbered
+ .nm 1
+ .nn 1
+ .is-numbered
+ .is-numbered
+ .nm
+ .is-numbered
+ &rArr; Test line numbering. This line ISN&rsquo;T numbered.
+ &rArr; This line ISN&rsquo;T numbered.
+ &rArr; 1 This line IS numbered.
+ &rArr; This line ISN&rsquo;T numbered.
+</pre></div></div>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002emc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.mc</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">margin-character</i></span> [<span class="r"><i class="slanted">distance</i></span>]</var><a class="copiable-link" href='#index-_002emc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-mc"></a>
+<a class="index-entry-id" id="index-margin-glyph-_0028mc_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-for-margins-_0028mc_0029"></a>
+<p>Begin (or, with no arguments, cease) writing a <em class="dfn">margin-character</em> to
+the right of each output line. The <var class="var">distance</var> argument separates
+<var class="var">margin-character</var> from the right margin. If absent, the most
+recent value is used; the default is 10&nbsp;points. If an output line
+exceeds the line length, the margin character is appended to it.
+<a class="index-entry-id" id="index-tl-request_002c-and-mc"></a>
+No margin character is written on lines produced by the <code class="code">tl</code>
+request.
+</p>
+<p>The margin character is a property of the output line; the margin
+character last configured when the line is output controls. If the
+margin character is disabled before an output line breaks, none is
+output (but see below).
+</p>
+<p>The margin character is associated with the environment
+(see <a class="pxref" href="#Environments">Environments</a>).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 5i
+.nf
+.mc \[br]
+This paragraph is marked with a margin character.
+.sp
+As seen above, vertical space isn't thus marked.
+\&amp;
+An output line that is present, but empty, is.
+ &rArr; This paragraph is marked with a margin character. |
+ &rArr;
+ &rArr; As seen above, vertical space isn&rsquo;t thus marked. |
+ &rArr; |
+ &rArr; An output line that is present, but empty, is. |
+</pre></div></div>
+</dd></dl>
+
+<p>For compatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>, a call to <code class="code">mc</code>
+to set the margin character can&rsquo;t be undone immediately; at least one
+line gets a margin character.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 10n
+.nf
+.mc |
+.mc *
+.mc
+foo
+bar
+ &rArr; foo *
+ &rArr; bar
+</pre></div></div>
+
+<a class="index-entry-id" id="index-gdiffmk"></a>
+<a class="index-entry-id" id="index-nrchbar"></a>
+<a class="index-entry-id" id="index-changebar"></a>
+<a class="index-entry-id" id="index-diffmk"></a>
+<p>The margin character mechanism is commonly used to annotate changes in
+documents. The <code class="code">groff</code> distribution ships a program,
+<code class="command">gdiffmk</code>, to assist with this task.<a class="footnote" id="DOCF118" href="#FOOT118"><sup>118</sup></a>
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epsbb"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.psbb</code></strong> <var class="def-var-arguments">file</var><a class="copiable-link" href='#index-_002epsbb'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-psbb"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005bllx_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[llx]</code></strong><a class="copiable-link" href='#index-_005cn_005bllx_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-llx"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005blly_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[lly]</code></strong><a class="copiable-link" href='#index-_005cn_005blly_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-lly"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005burx_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[urx]</code></strong><a class="copiable-link" href='#index-_005cn_005burx_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-urx"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005bury_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[ury]</code></strong><a class="copiable-link" href='#index-_005cn_005bury_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ury"></a>
+<a class="index-entry-id" id="index-PostScript_002c-bounding-box"></a>
+<a class="index-entry-id" id="index-bounding-box"></a>
+<p>Retrieve the bounding box of the PostScript image found in <var class="var">file</var>,
+which must conform to Adobe&rsquo;s <em class="dfn">Document Structuring Conventions</em>
+(DSC), locate a <code class="code">%%BoundingBox</code> comment, and store the (upper-,
+lower-, <span class="w-nolinebreak-text">-left</span><!-- /@w -->, <span class="w-nolinebreak-text">-right</span><!-- /@w -->) values into the registers <code class="code">llx</code>,
+<code class="code">lly</code>, <code class="code">urx</code>, and <code class="code">ury</code>. If an error occurs (for
+example, if no <code class="code">%%BoundingBox</code> comment is present), the formatter
+sets these registers to&nbsp;0.
+</p>
+<p>The search path for <var class="var">file</var> can be controlled with the <samp class="option">-I</samp>
+command-line option.
+</p></dd></dl>
+
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Gtroff-Internals">
+<div class="nav-panel">
+<p>
+Next: <a href="#Debugging" accesskey="n" rel="next">Debugging</a>, Previous: <a href="#Miscellaneous" accesskey="p" rel="prev">Miscellaneous</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="gtroff-Internals">5.36 <code class="code">gtroff</code> Internals</h3>
+
+<a class="index-entry-id" id="index-input-token"></a>
+<a class="index-entry-id" id="index-token_002c-input"></a>
+<a class="index-entry-id" id="index-output-node"></a>
+<a class="index-entry-id" id="index-node_002c-output"></a>
+<p><code class="code">gtroff</code> processes input in three steps. One or more input
+characters are converted to an <em class="dfn">input token</em>.<a class="footnote" id="DOCF119" href="#FOOT119"><sup>119</sup></a> Then, one or more input tokens are converted to
+an <em class="dfn">output node</em>. Finally, output nodes are converted to the
+intermediate output language understood by all output devices.
+</p>
+<p>Actually, before step one happens, <code class="code">gtroff</code> converts certain escape
+sequences into reserved input characters (not accessible by the user);
+such reserved characters are used for other internal processing also &ndash;
+this is the very reason why not all characters are valid input.
+See <a class="xref" href="#Identifiers">Identifiers</a>, for more on this topic.
+</p>
+<p>For example, the input string &lsquo;<samp class="samp">fi\[:u]</samp>&rsquo; is converted into a
+character token &lsquo;<samp class="samp">f</samp>&rsquo;, a character token &lsquo;<samp class="samp">i</samp>&rsquo;, and a special
+token &lsquo;<samp class="samp">:u</samp>&rsquo; (representing u&nbsp;umlaut). Later on, the character
+tokens &lsquo;<samp class="samp">f</samp>&rsquo; and &lsquo;<samp class="samp">i</samp>&rsquo; are merged to a single output node
+representing the ligature glyph &lsquo;<samp class="samp">fi</samp>&rsquo; (provided the current font has
+a glyph for this ligature); the same happens with &lsquo;<samp class="samp">:u</samp>&rsquo;. All output
+glyph nodes are &lsquo;processed&rsquo;, which means that they are invariably
+associated with a given font, font size, advance width, etc. During the
+formatting process, <code class="code">gtroff</code> itself adds various nodes to control
+the data flow.
+</p>
+<p>Macros, diversions, and strings collect elements in two chained lists: a
+list of input tokens that have been passed unprocessed, and a list of
+output nodes. Consider the following diversion.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.di xxx
+a
+\!b
+c
+.br
+.di
+</pre></div></div>
+
+<p>It contains these elements.
+</p>
+<table class="multitable">
+<tbody><tr><td>node list</td><td>token list</td><td>element number</td></tr>
+<tr><td><i class="i">line start node</i></td><td>&mdash;</td><td>1</td></tr>
+<tr><td><i class="i">glyph node <code class="code">a</code></i></td><td>&mdash;</td><td>2</td></tr>
+<tr><td><i class="i">word space node</i></td><td>&mdash;</td><td>3</td></tr>
+<tr><td>&mdash;</td><td><code class="code">b</code></td><td>4</td></tr>
+<tr><td>&mdash;</td><td><code class="code">\n</code></td><td>5</td></tr>
+<tr><td><i class="i">glyph node <code class="code">c</code></i></td><td>&mdash;</td><td>6</td></tr>
+<tr><td><i class="i">vertical size node</i></td><td>&mdash;</td><td>7</td></tr>
+<tr><td><i class="i">vertical size node</i></td><td>&mdash;</td><td>8</td></tr>
+<tr><td>&mdash;</td><td><code class="code">\n</code></td><td>9</td></tr>
+</tbody>
+</table>
+
+<a class="index-entry-id" id="index-_005cv_002c-internal-representation"></a>
+<p>Elements 1, 7, and&nbsp;8 are inserted by <code class="code">gtroff</code>; the latter two
+(which are always present) specify the vertical extent of the last line,
+possibly modified by <code class="code">\x</code>. The <code class="code">br</code> request finishes the
+pending output line, inserting a newline input token, which is
+subsequently converted to a space when the diversion is reread. Note
+that the word space node has a fixed width that isn&rsquo;t adjustable
+anymore. To convert horizontal space nodes back to input tokens, use
+the <code class="code">unformat</code> request.
+</p>
+<p>Macros only contain elements in the token list (and the node list is
+empty); diversions and strings can contain elements in both lists.
+</p>
+<p>The <code class="code">chop</code> request simply reduces the number of elements in a
+macro, string, or diversion by one. Exceptions are <em class="dfn">compatibility
+save</em> and <em class="dfn">compatibility ignore</em> input tokens, which are ignored.
+The <code class="code">substring</code> request also ignores those input tokens.
+</p>
+<p>Some requests like <code class="code">tr</code> or <code class="code">cflags</code> work on glyph identifiers
+only; this means that the associated glyph can be changed without
+destroying this association. This can be very helpful for substituting
+glyphs. In the following example, we assume that glyph &lsquo;<samp class="samp">foo</samp>&rsquo; isn&rsquo;t
+available by default, so we provide a substitution using the
+<code class="code">fchar</code> request and map it to input character &lsquo;<samp class="samp">x</samp>&rsquo;.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.fchar \[foo] foo
+.tr x \[foo]
+</pre></div></div>
+
+<p>Now let us assume that we install an additional special font &lsquo;<samp class="samp">bar</samp>&rsquo;
+that has glyph &lsquo;<samp class="samp">foo</samp>&rsquo;.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.special bar
+.rchar \[foo]
+</pre></div></div>
+
+<p>Since glyphs defined with <code class="code">fchar</code> are searched before glyphs in
+special fonts, we must call <code class="code">rchar</code> to remove the definition of the
+fallback glyph. Anyway, the translation is still active; &lsquo;<samp class="samp">x</samp>&rsquo; now
+maps to the real glyph &lsquo;<samp class="samp">foo</samp>&rsquo;.
+</p>
+<a class="index-entry-id" id="index-compatibility-mode_002c-and-parameters"></a>
+<a class="index-entry-id" id="index-mode_002c-compatibility_002c-and-parameters"></a>
+<a class="index-entry-id" id="index-arguments_002c-and-compatibility-mode"></a>
+<a class="index-entry-id" id="index-parameters_002c-and-compatibility-mode"></a>
+<a class="index-entry-id" id="index-macro-arguments_002c-and-compatibility-mode"></a>
+<a class="index-entry-id" id="index-request-arguments_002c-and-compatibility-mode"></a>
+<p>Macro and request arguments preserve compatibility mode enablement.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.cp 1 \&quot; switch to compatibility mode
+.de xx
+\\$1
+..
+.cp 0 \&quot; switch compatibility mode off
+.xx caf\['e]
+ &rArr; café
+</pre></div></div>
+
+<p>Since compatibility mode is enabled while <code class="code">de</code> is invoked, the
+macro <code class="code">xx</code> enables compatibility mode when it is called. Argument
+<code class="code">$1</code> can still be handled properly because it inherits the
+compatibility mode enablement status that was active at the point where
+<code class="code">xx</code> was called.
+</p>
+<p>After interpolation of the parameters, the compatibility save and
+restore tokens are removed.
+</p>
+
+
+
+<hr>
+</div>
+<div class="section-level-extent" id="Debugging">
+<div class="nav-panel">
+<p>
+Next: <a href="#Implementation-Differences" accesskey="n" rel="next">Implementation Differences</a>, Previous: <a href="#Gtroff-Internals" accesskey="p" rel="prev"><code class="code">gtroff</code> Internals</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Debugging-1">5.37 Debugging</h3>
+<a class="index-entry-id" id="index-debugging"></a>
+
+<div class="flushright"><p class="flushright-paragraph"><i class="slanted">Standard troff voodoo, just put a power of two backslashes in
+front of it until it works and if you still have problems add a \c.</i>
+&mdash; Ron Natalie
+</p></div>
+<p>GNU <code class="code">troff</code> is not the easiest language to debug, in part thanks to
+its design features of recursive interpolation and the use of
+multi-stage pipeline processing in the surrounding system. Nevertheless
+there exist several features useful for troubleshooting.
+</p>
+<p>Preprocessors use the <code class="code">lf</code> request to preserve the identity of the
+line numbers and names of input files. GNU <code class="code">troff</code> emits a variety
+of error diagnostics and supports several categories of warning; the
+output of these can be selectively suppressed. A trace of the
+formatter&rsquo;s input processing stack can be emitted when errors or
+warnings occur by means of GNU <code class="code">troff</code>&rsquo;s <samp class="option">-b</samp> option, or
+produced on demand with the <code class="code">backtrace</code> request. The <code class="code">tm</code>
+and related requests can be used to emit customized diagnostic messages
+or for instrumentation while troubleshooting. The <code class="code">ex</code> and
+<code class="code">ab</code> requests cause early termination with successful and error
+exit codes respectively, to halt further processing when continuing
+would be fruitless. Examine the state of the formatter with requests
+that write lists of defined names (macros, strings, and diversions),
+environments, registers, and page location traps to the standard error
+stream.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002elf"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.lf</code></strong> <var class="def-var-arguments">line [<span class="r"><i class="slanted">file</i></span>]</var><a class="copiable-link" href='#index-_002elf'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-lf"></a>
+<a class="index-entry-id" id="index-soelim"></a>
+<a class="index-entry-id" id="index-multi_002dfile-documents"></a>
+<a class="index-entry-id" id="index-documents_002c-multi_002dfile"></a>
+<a class="index-entry-id" id="index-setting-input-line-number-_0028lf_0029"></a>
+<a class="index-entry-id" id="index-input-line-number_002c-setting-_0028lf_0029"></a>
+<a class="index-entry-id" id="index-number_002c-input-line_002c-setting-_0028lf_0029"></a>
+<p>Set the input line number (and, optionally, the file name) GNU
+<code class="code">troff</code> shall use for error and warning messages. <var class="var">line</var> is
+the input line number of the <em class="emph">next</em> line. Without an argument, the
+request is ignored.
+</p>
+<p><code class="code">lf</code>&rsquo;s primary purpose is to aid the debugging of documents that
+undergo preprocessing. Programs like <code class="command">tbl</code> that transform input
+in their own languages into <code class="code">roff</code> requests use it so that any
+diagnostic messages emitted by <code class="code">troff</code> correspond to the source
+document.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002etm"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.tm</code></strong> <var class="def-var-arguments">message</var><a class="copiable-link" href='#index-_002etm'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-tm"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002etm1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.tm1</code></strong> <var class="def-var-arguments">message</var><a class="copiable-link" href='#index-_002etm1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-tm1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002etmc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.tmc</code></strong> <var class="def-var-arguments">message</var><a class="copiable-link" href='#index-_002etmc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-tmc"></a>
+<a class="index-entry-id" id="index-printing-to-stderr-_0028tm_002c-tm1_002c-tmc_0029"></a>
+<a class="index-entry-id" id="index-stderr_002c-printing-to-_0028tm_002c-tm1_002c-tmc_0029"></a>
+<p>Send <var class="var">message</var>, which consumes the remainder of the input line and
+cannot contain special characters, to the standard error stream,
+followed by a newline. Leading spaces in <var class="var">message</var> are ignored.
+</p>
+<p><code class="code">tm1</code> is similar, but recognizes and strips a leading neutral
+double quote from <var class="var">message</var> to allow the embedding of leading
+spaces.
+</p>
+<p><code class="code">tmc</code> works as <code class="code">tm1</code>, but does not append a newline.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eab"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ab</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">message</i></span>]</var><a class="copiable-link" href='#index-_002eab'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ab"></a>
+<a class="index-entry-id" id="index-aborting-_0028ab_0029"></a>
+<p>Write any <var class="var">message</var> to the standard error stream (like <code class="code">tm</code>)
+and then abort GNU <code class="code">troff</code>; that is, stop processing and terminate
+with a failure status.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eex"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ex</code></strong><a class="copiable-link" href='#index-_002eex'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ex"></a>
+<a class="index-entry-id" id="index-ex-request_002c-use-in-debugging"></a>
+<a class="index-entry-id" id="index-exiting-_0028ex_0029"></a>
+<p>Exit GNU <code class="code">troff</code>; that is, stop processing and terminate with a
+successful status. To stop processing only the current file, use the
+<code class="code">nx</code> request; see <a class="ref" href="#I_002fO">I/O</a>.
+</p></dd></dl>
+
+<p>When doing something involved, it is useful to leave the debugging
+statements in the code and have them turned on by a command-line flag.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.if \n[DB] .tm debugging output
+</pre></div></div>
+
+<p>To activate such statements, use the <samp class="option">-r</samp> option to set the
+register.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">groff -rDB=1 <i class="slanted">file</i>
+</pre></div></div>
+
+<p>If it is known in advance that there are many errors and no useful
+output, GNU <code class="code">troff</code> can be forced to suppress formatted output with
+the <samp class="option">-z</samp> option.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epev"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pev</code></strong><a class="copiable-link" href='#index-_002epev'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-pev"></a>
+<a class="index-entry-id" id="index-dumping-environments-_0028pev_0029"></a>
+<a class="index-entry-id" id="index-environments_002c-dumping-_0028pev_0029"></a>
+<p>Report the state of the current environment followed by that of all
+other environments to the standard error stream.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epm"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pm</code></strong><a class="copiable-link" href='#index-_002epm'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-pm"></a>
+<a class="index-entry-id" id="index-dumping-symbol-table-_0028pm_0029"></a>
+<a class="index-entry-id" id="index-symbol-table_002c-dumping-_0028pm_0029"></a>
+<p>Report, to the standard error stream, the names of all defined macros,
+strings, and diversions with their sizes in bytes.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epnr"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pnr</code></strong><a class="copiable-link" href='#index-_002epnr'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-pnr"></a>
+<a class="index-entry-id" id="index-dumping-registers-_0028pnr_0029"></a>
+<a class="index-entry-id" id="index-registers_002c-dumping-_0028pnr_0029"></a>
+<p>Report the names and contents of all currently defined registers to the
+standard error stream.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eptr"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ptr</code></strong><a class="copiable-link" href='#index-_002eptr'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ptr"></a>
+<a class="index-entry-id" id="index-dumping-page-location-traps-_0028ptr_0029"></a>
+<a class="index-entry-id" id="index-listing-page-location-traps-_0028ptr_0029"></a>
+<a class="index-entry-id" id="index-traps_002c-page-location_002c-dumping-_0028ptr_0029"></a>
+<a class="index-entry-id" id="index-traps_002c-page-location_002c-listing-_0028ptr_0029"></a>
+<p>Report the names and positions of all page location traps to the
+standard error stream. Empty slots in the list, where a trap has been
+planted but subsequently (re)moved, are printed as well.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002efl"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.fl</code></strong><a class="copiable-link" href='#index-_002efl'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-fl"></a>
+<a class="index-entry-id" id="index-flush-output-_0028fl_0029"></a>
+<a class="index-entry-id" id="index-output_002c-flush-_0028fl_0029"></a>
+<a class="index-entry-id" id="index-interactive-use-of-gtroff"></a>
+<a class="index-entry-id" id="index-gtroff_002c-interactive-use"></a>
+<p>Instruct <code class="code">gtroff</code> to flush its output immediately. The intent is
+for interactive use, but this behaviour is currently not implemented in
+<code class="code">gtroff</code>. Contrary to Unix <code class="code">troff</code>, TTY output is sent to a
+device driver also (<code class="code">grotty</code>), making it non-trivial to communicate
+interactively.
+</p>
+<p>This request causes a line break.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ebacktrace"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.backtrace</code></strong><a class="copiable-link" href='#index-_002ebacktrace'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-backtrace"></a>
+<a class="index-entry-id" id="index-backtrace-of-input-stack-_0028backtrace_0029"></a>
+<a class="index-entry-id" id="index-input-stack_002c-backtrace-_0028backtrace_0029"></a>
+<p>Write the state of the input stack to the standard error stream.
+</p>
+<p>Consider the following in a file <samp class="file">test</samp>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de xxx
+. backtrace
+..
+.de yyy
+. xxx
+..
+.
+.yyy
+ error&rarr; troff: backtrace: 'test':2: macro 'xxx'
+ error&rarr; troff: backtrace: 'test':5: macro 'yyy'
+ error&rarr; troff: backtrace: file 'test':8
+</pre></div></div>
+
+<p>The <samp class="option">-b</samp> option of GNU <code class="code">troff</code> causes a backtrace to be
+generated on each error or warning. Some warnings have to be enabled;
+See <a class="xref" href="#Warnings">Warnings</a>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bslimit_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[slimit]</code></strong><a class="copiable-link" href='#index-_005cn_005bslimit_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-slimit"></a>
+<a class="index-entry-id" id="index-input-stack_002c-setting-limit"></a>
+<p>If greater than&nbsp;0, sets the maximum quantity of objects on GNU
+<code class="code">troff</code>&rsquo;s internal input stack. If less than or equal to&nbsp;0,
+there is no limit: recursion can continue until program memory is
+exhausted. The default is 1,000.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ewarnscale"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.warnscale</code></strong> <var class="def-var-arguments">su</var><a class="copiable-link" href='#index-_002ewarnscale'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-warnscale"></a>
+<p>Set the scaling unit used in certain warnings to <var class="var">su</var>, which can take the values &lsquo;<samp class="samp">u</samp>&rsquo;, &lsquo;<samp class="samp">i</samp>&rsquo;, &lsquo;<samp class="samp">c</samp>&rsquo;,
+&lsquo;<samp class="samp">p</samp>&rsquo;, and &lsquo;<samp class="samp">P</samp>&rsquo;. The default is &lsquo;<samp class="samp">i</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002espreadwarn"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.spreadwarn</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">limit</i></span>]</var><a class="copiable-link" href='#index-_002espreadwarn'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-spreadwarn"></a>
+<p>Emit a <code class="code">break</code> warning if the additional space inserted for each
+space between words in an output line adjusted to both margins with
+&lsquo;<samp class="samp">.ad&nbsp;b</samp>&rsquo;<!-- /@w --> is larger than or equal to <var class="var">limit</var>. A negative
+value is treated as zero; an absent argument toggles the warning on and
+off without changing <var class="var">limit</var>. The default scaling unit is &lsquo;<samp class="samp">m</samp>&rsquo;.
+At startup, <code class="code">spreadwarn</code> is inactive and <var class="var">limit</var> is 3<span class="dmn">m</span>.
+</p>
+<p>For example,
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.spreadwarn 0.2m
+</pre></div></div>
+
+<p>causes a warning if <code class="code">break</code> warnings are not suppressed and
+<code class="code">gtroff</code> must add 0.2<span class="dmn">m</span> or more for each inter-word space in a
+line. See <a class="xref" href="#Warnings">Warnings</a>.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-warnings"></a>
+<p>GNU <code class="code">troff</code> has command-line options for reporting warnings
+(<samp class="option">-w</samp>) and backtraces (<samp class="option">-b</samp>) when a warning or an error
+occurs.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ewarn"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.warn</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">n</i></span>]</var><a class="copiable-link" href='#index-_002ewarn'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-warn"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ewarn_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.warn]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ewarn_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ewarn-1"></a>
+<a class="index-entry-id" id="index-warning-level-_0028warn_0029"></a>
+<p>Select the categories, or &ldquo;types&rdquo;, of reported warnings.
+<var class="var">n</var>&nbsp;is the sum of the numeric codes associated with each
+warning category that is to be enabled; all other categories are
+disabled. The categories and their associated codes are listed in
+<a class="ref" href="#Warnings">Warnings</a>. For example, &lsquo;<samp class="samp">.warn 0</samp>&rsquo; disables all warnings, and
+&lsquo;<samp class="samp">.warn 1</samp>&rsquo; disables all warnings except those about missing glyphs.
+If no argument is given, all warning categories are enabled.
+</p>
+<p>The read-only register <code class="code">.warn</code> contains the sum of the numeric
+codes of enabled warning categories.
+</p></dd></dl>
+
+
+
+<ul class="mini-toc">
+<li><a href="#Warnings" accesskey="1">Warnings</a></li>
+</ul>
+<hr>
+<div class="subsection-level-extent" id="Warnings">
+<div class="nav-panel">
+<p>
+Previous: <a href="#Debugging" accesskey="p" rel="prev">Debugging</a>, Up: <a href="#Debugging" accesskey="u" rel="up">Debugging</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Warnings-1">5.37.1 Warnings</h4>
+<a class="index-entry-id" id="index-warnings-1"></a>
+
+<p>Warning diagnostics emitted by GNU <code class="code">troff</code> are divided into named,
+numbered categories. The name associated with each warning category is
+used by the <samp class="option">-w</samp> and <samp class="option">-W</samp> options. Each category is also
+assigned a power of two; the sum of enabled category values is used by
+the <code class="code">warn</code> request and the <code class="code">.warn</code> register.
+</p>
+<p>Warnings of each category are produced under the following
+circumstances.
+</p>
+<a class="index-entry-id" id="index-categories_002c-warning"></a>
+<a class="index-entry-id" id="index-warning-categories"></a>
+<dl class="table">
+<dt>&lsquo;<samp class="samp">char</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">1</samp>&rsquo;</dt>
+<dd><p>No mounted font defines a glyph for the requested character. This
+category is enabled by default.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">number</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">2</samp>&rsquo;</dt>
+<dd><p>An invalid numeric expression was encountered. This category is enabled
+by default.
+See <a class="xref" href="#Numeric-Expressions">Numeric Expressions</a>.
+</p>
+</dd>
+<dt id='index-filling_002c-and-break-warnings'><span>&lsquo;<samp class="samp">break</samp>&rsquo;<a class="copiable-link" href='#index-filling_002c-and-break-warnings'> &para;</a></span></dt>
+<dt>&lsquo;<samp class="samp">4</samp>&rsquo;</dt>
+<dd><a class="index-entry-id" id="index-mode_002c-fill_002c-and-break-warnings"></a>
+<p>A filled output line could not be broken such that its length was less
+than the output line length &lsquo;<samp class="samp">\n[.l]</samp>&rsquo;. This category is enabled by
+default.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">delim</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">8</samp>&rsquo;</dt>
+<dd><p>The closing delimiter in an escape sequence was missing or mismatched.
+</p>
+</dd>
+<dt id='index-ie-request_002c-and-warnings'><span>&lsquo;<samp class="samp">el</samp>&rsquo;<a class="copiable-link" href='#index-ie-request_002c-and-warnings'> &para;</a></span></dt>
+<dt>&lsquo;<samp class="samp">16</samp>&rsquo;</dt>
+<dd><a class="index-entry-id" id="index-el-request_002c-and-warnings"></a>
+<p>The <code class="code">el</code> request was encountered with no prior corresponding
+<code class="code">ie</code> request. See <a class="xref" href="#if_002delse">if-else</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">scale</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">32</samp>&rsquo;</dt>
+<dd><p>A scaling unit inappropriate to its context was used in a numeric
+expression.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">range</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">64</samp>&rsquo;</dt>
+<dd><p>A numeric expression was out of range for its context.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">syntax</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">128</samp>&rsquo;</dt>
+<dd><p>A self-contradictory hyphenation mode was requested; an empty or
+incomplete numeric expression was encountered; an operand to a numeric
+operator was missing; an attempt was made to define a recursive, empty,
+or nonsensical character class; or a <code class="code">groff</code> extension conditional
+expression operator was used while in compatibility mode.
+</p>
+</dd>
+<dt id='index-di-request_002c-and-warnings'><span>&lsquo;<samp class="samp">di</samp>&rsquo;<a class="copiable-link" href='#index-di-request_002c-and-warnings'> &para;</a></span></dt>
+<dt>&lsquo;<samp class="samp">256</samp>&rsquo;</dt>
+<dd><a class="index-entry-id" id="index-da-request_002c-and-warnings"></a>
+<a class="index-entry-id" id="index-box-request_002c-and-warnings"></a>
+<a class="index-entry-id" id="index-boxa-request_002c-and-warnings"></a>
+<p>A <code class="code">di</code>, <code class="code">da</code>, <code class="code">box</code>, or <code class="code">boxa</code> request was invoked
+without an argument when there was no current diversion.
+</p>
+</dd>
+<dt id='index-de_002c-de1_002c-dei-requests_002c-and-warnings'><span>&lsquo;<samp class="samp">mac</samp>&rsquo;<a class="copiable-link" href='#index-de_002c-de1_002c-dei-requests_002c-and-warnings'> &para;</a></span></dt>
+<dt>&lsquo;<samp class="samp">512</samp>&rsquo;</dt>
+<dd><a class="index-entry-id" id="index-am_002c-am1_002c-ami-requests_002c-and-warnings"></a>
+<a class="index-entry-id" id="index-ds_002c-ds1-requests_002c-and-warnings"></a>
+<a class="index-entry-id" id="index-as_002c-as1-requests_002c-and-warnings"></a>
+<a class="index-entry-id" id="index-di-request_002c-and-warnings-1"></a>
+<a class="index-entry-id" id="index-da-request_002c-and-warnings-1"></a>
+<a class="index-entry-id" id="index-box_002c-boxa-requests_002c-and-warnings"></a>
+<a class="index-entry-id" id="index-_005c_002a_002c-and-warnings"></a>
+<p>An undefined string, macro, or diversion was used. When such an object
+is dereferenced, an empty one of that name is automatically created.
+So, unless it is later deleted, at most one warning is given for each.
+</p>
+<p>This warning is also emitted upon an attempt to move an unplanted trap
+macro (see <a class="pxref" href="#Page-Location-Traps">Page Location Traps</a>). In such cases, the unplanted macro
+is <em class="emph">not</em> dereferenced, so it is not created if it does not exist.
+</p>
+</dd>
+<dt id='index-nr-request_002c-and-warnings'><span>&lsquo;<samp class="samp">reg</samp>&rsquo;<a class="copiable-link" href='#index-nr-request_002c-and-warnings'> &para;</a></span></dt>
+<dt>&lsquo;<samp class="samp">1024</samp>&rsquo;</dt>
+<dd><a class="index-entry-id" id="index-_005cR_002c-and-warnings"></a>
+<a class="index-entry-id" id="index-_005cn_002c-and-warnings"></a>
+<p>An undefined register was used. When an undefined register is
+dereferenced, it is automatically defined with a value of&nbsp;0. So,
+unless it is later deleted, at most one warning is given for each.
+</p>
+</dd>
+<dt id='index-_005ct_002c-and-warnings'><span>&lsquo;<samp class="samp">tab</samp>&rsquo;<a class="copiable-link" href='#index-_005ct_002c-and-warnings'> &para;</a></span></dt>
+<dt>&lsquo;<samp class="samp">2048</samp>&rsquo;</dt>
+<dd><p>A tab character was encountered where a number was expected, or appeared
+in an unquoted macro argument.
+</p>
+</dd>
+<dt id='index-_005c_007d_002c-and-warnings'><span>&lsquo;<samp class="samp">right-brace</samp>&rsquo;<a class="copiable-link" href='#index-_005c_007d_002c-and-warnings'> &para;</a></span></dt>
+<dt>&lsquo;<samp class="samp">4096</samp>&rsquo;</dt>
+<dd><p>A right brace escape sequence <code class="code">\}</code> was encountered where a number
+was expected.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">missing</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">8192</samp>&rsquo;</dt>
+<dd><p>A request was invoked with a mandatory argument absent.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">input</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">16384</samp>&rsquo;</dt>
+<dd><p>An invalid character occurred on the input stream.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">escape</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">32768</samp>&rsquo;</dt>
+<dd><p>An unsupported escape sequence was encountered.
+</p>
+</dd>
+<dt id='index-compatibility-mode'><span>&lsquo;<samp class="samp">space</samp>&rsquo;<a class="copiable-link" href='#index-compatibility-mode'> &para;</a></span></dt>
+<dt>&lsquo;<samp class="samp">65536</samp>&rsquo;</dt>
+<dd><p>A space was missing between a request or macro and its argument. This
+warning is produced when an undefined name longer than two characters is
+encountered and the first two characters of the name constitute a
+defined name. No request is invoked, no macro called, and an empty
+macro is not defined. This category is enabled by default. It never
+occurs in compatibility mode.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">font</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">131072</samp>&rsquo;</dt>
+<dd><p>A non-existent font was selected, or the selection was ignored because a
+font selection escape sequence was used after the output line
+continuation escape sequence on an input line. This category is enabled
+by default.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">ig</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">262144</samp>&rsquo;</dt>
+<dd><p>An invalid escape sequence occurred in input ignored using the <code class="code">ig</code>
+request. This warning category diagnoses a condition that is an error
+when it occurs in non-ignored input.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">color</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">524288</samp>&rsquo;</dt>
+<dd><p>An undefined color was selected, an attempt was made to define a color
+using an unrecognized color space, an invalid component in a color
+definition was encountered, or an attempt was made to redefine a default
+color.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">file</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">1048576</samp>&rsquo;</dt>
+<dd><p>An attempt was made to load a file that does not exist. This category
+is enabled by default.
+</p></dd>
+</dl>
+
+<p>Two warning names group other warning categories for convenience.
+</p>
+<dl class="table">
+<dt>&lsquo;<samp class="samp">all</samp>&rsquo;</dt>
+<dd><p>All warning categories except &lsquo;<samp class="samp">di</samp>&rsquo;, &lsquo;<samp class="samp">mac</samp>&rsquo; and &lsquo;<samp class="samp">reg</samp>&rsquo;.
+This shorthand is intended to produce all warnings that are useful with
+macro packages written for <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> and its
+descendants, which have less fastidious diagnostics than GNU
+<code class="code">troff</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">w</samp>&rsquo;</dt>
+<dd><p>All warning categories. Authors of documents and macro packages
+targeting <code class="code">groff</code> are encouraged to use this setting.
+</p></dd>
+</dl>
+
+
+<hr>
+</div>
+</div>
+<div class="section-level-extent" id="Implementation-Differences">
+<div class="nav-panel">
+<p>
+Next: <a href="#Safer-Mode" accesskey="n" rel="next">Safer Mode</a>, Previous: <a href="#Debugging" accesskey="p" rel="prev">Debugging</a>, Up: <a href="#GNU-troff-Reference" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Implementation-Differences-1">5.38 Implementation Differences</h3>
+<a class="index-entry-id" id="index-implementation-differences"></a>
+<a class="index-entry-id" id="index-differences-in-implementation"></a>
+<a class="index-entry-id" id="index-incompatibilities-with-AT_0026T-troff"></a>
+
+<p>GNU <code class="code">troff</code> has a number of features that cause incompatibilities
+with documents written for other versions of <code class="code">troff</code>. Some GNU
+extensions to <code class="code">troff</code> have become supported by other
+implementations.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="#Safer-Mode" accesskey="1">Safer Mode</a></li>
+<li><a href="#Compatibility-Mode" accesskey="2">Compatibility Mode</a></li>
+<li><a href="#Other-Differences" accesskey="3">Other Differences</a></li>
+</ul>
+<hr>
+<div class="subsection-level-extent" id="Safer-Mode">
+<div class="nav-panel">
+<p>
+Next: <a href="#Compatibility-Mode" accesskey="n" rel="next">Compatibility Mode</a>, Previous: <a href="#Implementation-Differences" accesskey="p" rel="prev">Implementation Differences</a>, Up: <a href="#Implementation-Differences" accesskey="u" rel="up">Implementation Differences</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Safer-Mode-1">5.38.1 Safer Mode</h4>
+<a class="index-entry-id" id="index-safer-mode-7"></a>
+<a class="index-entry-id" id="index-mode_002c-safer-7"></a>
+
+<a class="index-entry-id" id="index-pi-request_002c-disabled-by-default"></a>
+<a class="index-entry-id" id="index-sy-request_002c-disabled-by-default"></a>
+<p>The formatter operates in &ldquo;safer&rdquo; mode by default; to mitigate risks
+from untrusted input documents, the <code class="code">pi</code> and <code class="code">sy</code> requests are
+disabled. GNU <code class="code">troff</code>&rsquo;s <samp class="option">-U</samp> option enables &ldquo;unsafe
+mode&rdquo;, restoring their function and enabling additional <code class="code">groff</code>
+extension requests, <code class="code">open</code>, <code class="code">opena</code>, and <code class="code">pso</code>.
+See <a class="xref" href="#I_002fO">I/O</a>.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Compatibility-Mode">
+<div class="nav-panel">
+<p>
+Next: <a href="#Safer-Mode" accesskey="n" rel="next">Safer Mode</a>, Previous: <a href="#Other-Differences" accesskey="p" rel="prev">Other Differences</a>, Up: <a href="#Implementation-Differences" accesskey="u" rel="up">Implementation Differences</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Compatibility-Mode-1">5.38.2 Compatibility Mode</h4>
+<a class="index-entry-id" id="index-compatibility-mode-1"></a>
+<a class="index-entry-id" id="index-mode_002c-compatibility"></a>
+
+<a class="index-entry-id" id="index-long-names"></a>
+<a class="index-entry-id" id="index-names_002c-long"></a>
+<a class="index-entry-id" id="index-_005c_002a_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005cn_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>Long identifier names may be GNU <code class="code">troff</code>&rsquo;s most obvious innovation.
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> interprets &lsquo;<samp class="samp">.dsabcd</samp>&rsquo; as defining a
+string &lsquo;<samp class="samp">ab</samp>&rsquo; with contents &lsquo;<samp class="samp">cd</samp>&rsquo;. Normally, GNU <code class="code">troff</code>
+interprets this as a call of a macro named <code class="code">dsabcd</code>.
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> also interprets &lsquo;<samp class="samp">\*[</samp>&rsquo; and &lsquo;<samp class="samp">\n[</samp>&rsquo; as
+an interpolation of a string or register, respectively, named &lsquo;<samp class="samp">[</samp>&rsquo;.
+In GNU <code class="code">troff</code>, however, the &lsquo;<samp class="samp">[</samp>&rsquo; is normally interpreted as
+delimiting a long name. In compatibility mode, GNU <code class="code">troff</code>
+interprets names in the traditional way; they thus can be two characters
+long at most.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ecp"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.cp</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">n</i></span>]</var><a class="copiable-link" href='#index-_002ecp'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-cp"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eC_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.C]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eC_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eC"></a>
+<p>If <var class="var">n</var> is missing or non-zero, turn on compatibility mode;
+otherwise, turn it off.
+</p>
+<p>The read-only register <code class="code">.C</code> is&nbsp;1 if compatibility mode is on,
+0&nbsp;otherwise.
+</p>
+<p>Compatibility mode can be also turned on with the <samp class="option">-C</samp>
+command-line option.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002edo"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.do</code></strong> <var class="def-var-arguments">name</var><a class="copiable-link" href='#index-_002edo'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-do"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ecp_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.cp]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ecp_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ecp-1"></a>
+<p>The <code class="code">do</code> request interprets the string, request, diversion, or
+macro <var class="var">name</var> (along with any further arguments) with compatibility
+mode disabled. Compatibility mode is restored (only if it was active)
+when the <em class="emph">expansion</em> of <var class="var">name</var> is interpreted; that is, the
+restored compatibility state applies to the contents of the macro,
+string, or diversion <var class="var">name</var> as well as data read from files or pipes
+if <var class="var">name</var> is any of the <code class="code">so</code>, <code class="code">soquiet</code>, <code class="code">mso</code>,
+<code class="code">msoquiet</code>, or <code class="code">pso</code> requests.
+</p>
+<p>The following example illustrates several aspects of <code class="code">do</code> behavior.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de mac1
+FOO
+..
+.de1 mac2
+groff
+.mac1
+..
+.de mac3
+compatibility
+.mac1
+..
+.de ma
+\\$1
+..
+.cp 1
+.do mac1
+.do mac2 \&quot; mac2, defined with .de1, calls &quot;mac1&quot;
+.do mac3 \&quot; mac3 calls &quot;ma&quot; with argument &quot;c1&quot;
+.do mac3 \[ti] \&quot; groff syntax accepted in .do arguments
+ &rArr; FOO groff FOO compatibility c1 ~
+</pre></div></div>
+
+<p>The read-only register <code class="code">.cp</code>, meaningful only when dereferenced
+from a <code class="code">do</code> request, is&nbsp;1 if compatibility mode was on when
+the <code class="code">do</code> request was encountered, and 0&nbsp;if it was not. This
+register is specialized and may require a statement of rationale.
+</p>
+<p>When writing macro packages or documents that use GNU <code class="code">troff</code>
+features and which may be mixed with other packages or documents that do
+not&mdash;common scenarios include serial processing of man pages or use of
+the <code class="code">so</code> or <code class="code">mso</code> requests&mdash;you may desire correct operation
+regardless of compatibility mode enablement in the surrounding context.
+It may occur to you to save the existing value of &lsquo;<samp class="samp">\n(.C</samp>&rsquo; into a
+register, say, &lsquo;<samp class="samp">_C</samp>&rsquo;, at the beginning of your file, turn
+compatibility mode off with &lsquo;<samp class="samp">.cp 0</samp>&rsquo;, then restore it from that
+register at the end with &lsquo;<samp class="samp">.cp \n(_C</samp>&rsquo;. At the same time, a modular
+design of a document or macro package may lead you to multiple layers of
+inclusion. You cannot use the same register name everywhere lest you
+&ldquo;clobber&rdquo; the value from a preceding or enclosing context. The
+two-character register name space of <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> is
+confining and mnemonically challenging; you may wish to use the more
+capacious name space of GNU <code class="code">troff</code>. However, attempting &lsquo;<samp class="samp">.nr
+_my_saved_C \n(.C</samp>&rsquo; will not work in compatibility mode; the register
+name is too long. &ldquo;This is exactly what <code class="code">do</code> is for,&rdquo; you think,
+&lsquo;<samp class="samp">.do nr _my_saved_C \n(.C</samp>&rsquo;. The foregoing will always save zero to
+your register, because <code class="code">do</code> turns compatibility mode <em class="emph">off</em>
+while it interprets its argument list.
+</p>
+<p>To robustly save compatibility mode before switching it off, use
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.do nr _my_saved_C \n[.cp]
+.cp 0
+</pre></div></div>
+
+<p>at the beginning of your file, followed by
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.cp \n[_my_saved_C]
+.do rr _my_saved_C
+</pre></div></div>
+
+<p>at the end. As in the C language, we all have to share one big
+name space, so choose a register name that is unlikely to collide with
+other uses.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-input-level-in-delimited-arguments"></a>
+<a class="index-entry-id" id="index-interpolation-depth-in-delimited-arguments"></a>
+<a class="index-entry-id" id="index-delimited-arguments_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>Normally, GNU <code class="code">troff</code> preserves the interpolation depth in
+delimited arguments, but not in compatibility mode.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds xx '
+\w'abc\*(xxdef'
+ &rArr; 168 <span class="r">(normal mode on a terminal device)</span>
+ &rArr; 72def' <span class="r">(compatibility mode on a terminal device)</span>
+</pre></div></div>
+
+<a class="index-entry-id" id="index-_005cf_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005cH_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005cs_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005cS_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>Furthermore, the escape sequences <code class="code">\f</code>, <code class="code">\H</code>, <code class="code">\m</code>,
+<code class="code">\M</code>, <code class="code">\R</code>, <code class="code">\s</code>, and <code class="code">\S</code> are transparent for the
+purpose of recognizing a control character at the beginning of a line
+only in compatibility mode. For example, this code produces bold output
+in both cases, but the text differs.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de xx
+Hello!
+..
+\fB.xx\fP
+ &rArr; .xx <span class="r">(normal mode)</span>
+ &rArr; Hello! <span class="r">(compatibility mode)</span>
+</pre></div></div>
+
+<a class="index-entry-id" id="index-_005cs_002c-incompatibilities-with-AT_0026T-troff-1"></a>
+<p>Normally, the syntax form <code class="code">\s</code><var class="var">n</var> accepts only a single
+character (a digit) for <var class="var">n</var>, consistently with other forms that
+originated in <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>, like <code class="code">\*</code>, <code class="code">\$</code>,
+<code class="code">\f</code>, <code class="code">\g</code>, <code class="code">\k</code>, <code class="code">\n</code>, and <code class="code">\z</code>. In
+compatibility mode only, a non-zero&nbsp;<var class="var">n</var> must be in the range
+4&ndash;39. Legacy documents relying upon this quirk of parsing<a class="footnote" id="DOCF120" href="#FOOT120"><sup>120</sup></a> should be migrated to another
+<code class="code">\s</code> form.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Other-Differences">
+<div class="nav-panel">
+<p>
+Previous: <a href="#Compatibility-Mode" accesskey="p" rel="prev">Compatibility Mode</a>, Up: <a href="#Implementation-Differences" accesskey="u" rel="up">Implementation Differences</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Other-Differences-1">5.38.3 Other Differences</h4>
+
+<p><code class="code">groff</code> request names unrecognized by other <code class="code">troff</code>
+implementations will likely be ignored by them; escape sequences that
+are <code class="code">groff</code> extensions are liable to be interpreted as if the
+escape character were not present.
+<a class="index-entry-id" id="index-_005c_007e_002c-incompatibilities-with-AT_0026T-troff"></a>
+For example, the adjustable, non-breaking escape sequence <code class="code">\~</code>
+is also supported by Heirloom Doctools <code class="code">troff</code> 050915 (September
+2005), <code class="code">mandoc</code> 1.9.5 (2009-09-21), <code class="code">neatroff</code> (commit
+1c6ab0f6e, 2016-09-13), and Plan&nbsp;9 from User Space <code class="code">troff</code>
+(commit 93f8143600, 2022-08-12), but not by Solaris or Documenter&rsquo;s
+Workbench <code class="code">troff</code>s.
+See <a class="xref" href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a>.
+</p>
+<a class="index-entry-id" id="index-_005cA_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_007c_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_005e_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_0026_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_007b_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_007d_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005cSP_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_0027_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_0060_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_002d_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_005f_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_0021_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_0025_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005cc_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>GNU <code class="code">troff</code> does not allow the use of the escape sequences
+<code class="code">\|</code>, <code class="code">\^</code>, <code class="code">\&amp;</code>, <code class="code">\{</code>, <code class="code">\}</code>,
+<code class="code">\<kbd class="key">SP</kbd></code>, <code class="code">\'</code>, <code class="code">\`</code>, <code class="code">\-</code>, <code class="code">\_</code>, <code class="code">\!</code>,
+<code class="code">\%</code>, and <code class="code">\c</code> in identifiers; <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>
+does. The <code class="code">\A</code> escape sequence (see <a class="pxref" href="#Identifiers">Identifiers</a>) may be
+helpful in avoiding use of these escape sequences in names.
+</p>
+<a class="index-entry-id" id="index-adjustment-to-both-margins_002c-difference-from-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-rivers"></a>
+<p>When adjusting to both margins, <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> at first
+adjusts spaces starting from the right; GNU <code class="code">troff</code> begins from
+the left. Both implementations adjust spaces from opposite ends on
+alternating output lines in this adjustment mode to prevent &ldquo;rivers&rdquo;
+in the text.
+</p>
+<a class="index-entry-id" id="index-hyphenation_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>GNU <code class="code">troff</code> does not always hyphenate words as <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code> does. The <abbr class="acronym">AT&amp;T</abbr> implementation uses a set of
+hard-coded rules specific to English, while GNU <code class="code">troff</code> uses
+language-specific hyphenation pattern files derived from TeX.
+Furthermore, in old versions of <code class="code">troff</code> there was a limited amount
+of space to store hyphenation exceptions (arguments to the <code class="code">hw</code>
+request); GNU <code class="code">troff</code> has no such restriction.
+</p>
+<a class="index-entry-id" id="index-output-device-name-string-_0028_002eT_0029_002c-in-other-implementations"></a>
+<p>GNU <code class="code">troff</code> predefines a string <code class="code">.T</code> containing the argument
+given to the <samp class="option">-T</samp> command-line option, namely the current output
+device (for example, &lsquo;<samp class="samp">pdf</samp>&rsquo; or &lsquo;<samp class="samp">utf8</samp>&rsquo;). The existence of this
+string is a common feature of post-CSTR&nbsp;#54
+<code class="code">troff</code>s<a class="footnote" id="DOCF121" href="#FOOT121"><sup>121</sup></a> but valid values are specific
+to each implementation.
+</p>
+<a class="index-entry-id" id="index-removal-of-read_002donly-registers_002c-incompatibility-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-register_002c-read_002donly_002c-removal_002c-incompatibility-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-read_002donly-register-removal_002c-incompatibility-with-AT_0026T-troff"></a>
+<p><abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> ignored attempts to remove read-only
+registers; GNU <code class="code">troff</code> honors such requests. See <a class="xref" href="#Built_002din-Registers">Built-in Registers</a>.
+</p>
+<a class="index-entry-id" id="index-output-device-usage-register-_0028_002eT_0029_002c-incompatibility-with-AT_0026T-troff"></a>
+<p>The (read-only) register <code class="code">.T</code> interpolates&nbsp;1 if GNU
+<code class="code">troff</code> is called with the <samp class="option">-T</samp> command-line option, and
+0&nbsp;otherwise. This behavior differs from AT&amp;T <code class="code">troff</code>, which
+interpolated&nbsp;1 only if <code class="code">nroff</code> was the formatter and was
+called with <samp class="option">-T</samp>.
+</p>
+<a class="index-entry-id" id="index-lf-request_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p><abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> and other implementations handle the
+<code class="code">lf</code> request differently. For them, its <var class="var">line</var> argument
+changes the line number of the <em class="emph">current</em> line.
+</p>
+<a class="index-entry-id" id="index-environment-availability-and-naming_002c-incompatibilities-with"></a>
+<p><abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> had only environments named &lsquo;<samp class="samp">0</samp>&rsquo;,
+&lsquo;<samp class="samp">1</samp>&rsquo;, and &lsquo;<samp class="samp">2</samp>&rsquo;. In GNU <code class="code">troff</code>, any number of environments
+may exist, using any valid identifiers for their names
+(see <a class="pxref" href="#Identifiers">Identifiers</a>.)
+</p>
+<a class="index-entry-id" id="index-fractional-point-sizes-1"></a>
+<a class="index-entry-id" id="index-fractional-type-sizes-1"></a>
+<a class="index-entry-id" id="index-point-sizes_002c-fractional-1"></a>
+<a class="index-entry-id" id="index-type-sizes_002c-fractional-1"></a>
+<a class="index-entry-id" id="index-sizes_002c-fractional"></a>
+<a class="index-entry-id" id="index-ps-request_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>Fractional type sizes cause one noteworthy incompatibility. In
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> the <code class="code">ps</code> request ignores scaling units
+and thus &lsquo;<samp class="samp">.ps 10u</samp>&rsquo; sets the type size to 10&nbsp;points, whereas in
+GNU <code class="code">troff</code> it sets the type size to 10&nbsp;<em class="emph">scaled</em> points.
+See <a class="xref" href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a>.
+</p>
+<a class="index-entry-id" id="index-ab-request_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>The <code class="code">ab</code> request differs from <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>:
+GNU <code class="code">troff</code> writes no message to the standard error stream if no
+arguments are given, and it exits with a failure status instead of a
+successful one.
+</p>
+<a class="index-entry-id" id="index-bp-request_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>The <code class="code">bp</code> request differs from <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>:
+GNU <code class="code">troff</code> does not accept a scaling unit on the argument, a page
+number; the former (somewhat uselessly) does.
+</p>
+<a class="index-entry-id" id="index-pm-request_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>The <code class="code">pm</code> request differs from <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>:
+GNU <code class="code">troff</code> reports the sizes of macros, strings, and diversions in
+bytes and ignores an argument to report only the sum of the sizes.
+</p>
+<a class="index-entry-id" id="index-ss-request_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>Unlike <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>, GNU <code class="code">troff</code> does not ignore the
+<code class="code">ss</code> request if the output is a terminal device; instead, the
+values of minimal inter-word and additional inter-sentence space are
+each rounded down to the nearest multiple of&nbsp;12.
+</p>
+<a class="index-entry-id" id="index-bd-request_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-cs-request_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-tr-request_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-fp-request_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-input-characters-and-output-glyphs_002c-compatibility-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-output-glyphs_002c-and-input-characters_002c-compatibility-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-characters_002c-input_002c-and-output-glyphs_002c-compatibility-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-glyphs_002c-output_002c-and-input-characters_002c-compatibility-with-AT_0026T-troff"></a>
+<p>In GNU <code class="code">troff</code> there is a fundamental difference between
+(unformatted) characters and (formatted) glyphs. Everything that
+affects how a glyph is output is stored with the glyph node; once a
+glyph node has been constructed, it is unaffected by any subsequent
+requests that are executed, including <code class="code">bd</code>, <code class="code">cs</code>, <code class="code">tkf</code>,
+<code class="code">tr</code>, or <code class="code">fp</code> requests. Normally, glyphs are constructed from
+characters immediately before the glyph is added to an output line.
+Macros, diversions, and strings are all, in fact, the same type of
+object; they contain a sequence of intermixed character and glyph nodes.
+Special characters transform from one to the other: before being added
+to the output, they behave as characters; afterward, they are glyphs. A
+glyph node does not behave like a character node when it is processed by
+a macro: it does not inherit any of the special properties that the
+character from which it was constructed might have had. For example,
+the input
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.di x
+\\\\
+.br
+.di
+.x
+</pre></div></div>
+
+<p>produces &lsquo;<samp class="samp">\\</samp>&rsquo; in GNU <code class="code">troff</code>. Each pair of backslashes
+becomes one backslash <em class="emph">glyph</em>; the resulting backslashes are thus
+not interpreted as escape <em class="emph">characters</em> when they are reread as the
+diversion is output. <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> <em class="emph">would</em> interpret
+them as escape characters when rereading them and end up printing one
+&lsquo;<samp class="samp">\</samp>&rsquo;.
+</p>
+<a class="index-entry-id" id="index-printing-backslash-_0028_005c_005c_002c-_005ce_002c-_005cE_002c-_005c_005brs_005d_0029"></a>
+<a class="index-entry-id" id="index-backslash_002c-printing-_0028_005c_005c_002c-_005ce_002c-_005cE_002c-_005c_005brs_005d_0029"></a>
+<a class="index-entry-id" id="index-_005ce_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_0021_002c-incompatibilities-with-AT_0026T-troff-1"></a>
+<a class="index-entry-id" id="index-_005c_003f_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-transparent-output_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-output_002c-transparent_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>One correct way to obtain a printable backslash in most documents is to
+use the <code class="code">\e</code> escape sequence; this always prints a single instance
+of the current escape character,<a class="footnote" id="DOCF122" href="#FOOT122"><sup>122</sup></a> regardless of whether or not it is used in a diversion; it
+also works in both GNU <code class="code">troff</code> and <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>.
+</p>
+<p>The other correct way, appropriate in contexts independent of the
+backslash&rsquo;s common use as a <code class="code">troff</code> escape character&mdash;perhaps in
+discussion of character sets or other programming languages&mdash;is
+the character escape <code class="code">\(rs</code> or <code class="code">\[rs]</code>, for &ldquo;reverse
+solidus&rdquo;, from its name in the <abbr class="acronym">ECMA-6</abbr> (<abbr class="acronym">ISO/IEC</abbr> 646)
+standard.<a class="footnote" id="DOCF123" href="#FOOT123"><sup>123</sup></a>
+</p>
+<p>To store an escape sequence in a diversion that is interpreted when the
+diversion is reread, either use the traditional <code class="code">\!</code> transparent
+output facility, or, if this is unsuitable, the new <code class="code">\?</code> escape
+sequence. See <a class="xref" href="#Diversions">Diversions</a> and <a class="ref" href="#Gtroff-Internals"><code class="code">gtroff</code> Internals</a>.
+</p>
+<p>In the somewhat pathological case where a diversion exists containing a
+partially collected line and a partially collected line at the top-level
+diversion has never existed, <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> will output the
+partially collected line at the end of input; GNU <code class="code">troff</code> will not.
+</p>
+
+
+
+
+<hr>
+</div>
+</div>
+</div>
+<div class="chapter-level-extent" id="File-Formats">
+<div class="nav-panel">
+<p>
+Next: <a href="#Copying-This-Manual" accesskey="n" rel="next">Copying This Manual</a>, Previous: <a href="#GNU-troff-Reference" accesskey="p" rel="prev">GNU <code class="code">troff</code> Reference</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h2 class="chapter" id="File-Formats-1">6 File Formats</h2>
+<a class="index-entry-id" id="index-file-formats"></a>
+<a class="index-entry-id" id="index-formats_002c-file"></a>
+
+<p>All files read and written by <code class="code">gtroff</code> are text files. The
+following two sections describe their format.
+</p>
+
+
+
+
+<ul class="mini-toc">
+<li><a href="#gtroff-Output" accesskey="1"><code class="code">gtroff</code> Output</a></li>
+<li><a href="#Device-and-Font-Description-Files" accesskey="2">Device and Font Description Files</a></li>
+</ul>
+<hr>
+<div class="section-level-extent" id="gtroff-Output">
+<div class="nav-panel">
+<p>
+Next: <a href="#Device-and-Font-Description-Files" accesskey="n" rel="next">Device and Font Description Files</a>, Previous: <a href="#File-Formats" accesskey="p" rel="prev">File Formats</a>, Up: <a href="#File-Formats" accesskey="u" rel="up">File Formats</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="gtroff-Output-1">6.1 <code class="code">gtroff</code> Output</h3>
+<a class="index-entry-id" id="index-gtroff_002c-output"></a>
+<a class="index-entry-id" id="index-output_002c-gtroff"></a>
+
+<p>This section describes the <code class="code">groff</code> intermediate output format
+produced by GNU <code class="code">troff</code>.
+</p>
+<p>As <code class="code">groff</code> is a wrapper program around GNU <code class="code">troff</code> and
+automatically calls an output driver (or &ldquo;postprocessor&rdquo;), this output
+does not show up normally. This is why it is called
+<em class="emph">intermediate</em>. <code class="code">groff</code> provides the option <samp class="option">-Z</samp> to
+inhibit postprocessing such that the produced intermediate output is
+sent to standard output just as it is when calling GNU <code class="code">troff</code>
+directly.
+</p>
+<a class="index-entry-id" id="index-troff-output"></a>
+<a class="index-entry-id" id="index-output_002c-troff"></a>
+<a class="index-entry-id" id="index-intermediate-output"></a>
+<a class="index-entry-id" id="index-output_002c-intermediate"></a>
+<p>Here, the term <em class="dfn">troff output</em> describes what is output by
+GNU <code class="code">troff</code>, while <em class="dfn">intermediate output</em> refers to the language
+that is accepted by the parser that prepares this output for the output
+drivers. This parser handles whitespace more flexibly than
+<abbr class="acronym">AT&amp;T</abbr>&rsquo;s implementation and implements obsolete elements for
+compatibility; otherwise, both formats are the same.<a class="footnote" id="DOCF124" href="#FOOT124"><sup>124</sup></a>
+</p>
+<p>The main purpose of the intermediate output concept is to facilitate the
+development of postprocessors by providing a common programming
+interface for all devices. It has a language of its own that is
+completely different from the <code class="code">gtroff</code> language. While the
+<code class="code">gtroff</code> language is a high-level programming language for text
+processing, the intermediate output language is a kind of low-level
+assembler language by specifying all positions on the page for writing
+and drawing.
+</p>
+<p>The intermediate output produced by <code class="code">gtroff</code> is fairly readable,
+while output from <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> is rather hard to
+understand because of strange habits that are still supported, but not
+used any longer by <code class="code">gtroff</code>.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="#Language-Concepts" accesskey="1">Language Concepts</a></li>
+<li><a href="#Command-Reference" accesskey="2">Command Reference</a></li>
+<li><a href="#Intermediate-Output-Examples" accesskey="3">Intermediate Output Examples</a></li>
+<li><a href="#Output-Language-Compatibility" accesskey="4">Output Language Compatibility</a></li>
+</ul>
+<hr>
+<div class="subsection-level-extent" id="Language-Concepts">
+<div class="nav-panel">
+<p>
+Next: <a href="#Command-Reference" accesskey="n" rel="next">Command Reference</a>, Previous: <a href="#gtroff-Output" accesskey="p" rel="prev"><code class="code">gtroff</code> Output</a>, Up: <a href="#gtroff-Output" accesskey="u" rel="up"><code class="code">gtroff</code> Output</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Language-Concepts-1">6.1.1 Language Concepts</h4>
+
+<p>The fundamental operation of the GNU <code class="code">troff</code> formatter is the
+translation of the <code class="code">groff</code> input language into a device-independent
+form primarily concerned with what has to be written or drawn at
+specific positions on the output device. This language is simple and
+imperative. In the following discussion, the term <em class="dfn">command</em> always
+refers to this intermediate output language, and never to the
+<code class="code">groff</code> language intended for direct use by document authors.
+Intermediate output commands comprise several categories: glyph output;
+font, color, and text size selection; motion of the printing position;
+page advancement; drawing of geometric objects; and device control
+commands, a catch-all for operations not easily classified as any of the
+foregoing, such as directives to start and stop output, identify the
+intended output device, or place URL hyperlinks in supported output
+formats.
+</p>
+
+<ul class="mini-toc">
+<li><a href="#Separation" accesskey="1">Separation</a></li>
+<li><a href="#Argument-Units" accesskey="2">Argument Units</a></li>
+<li><a href="#Document-Parts" accesskey="3">Document Parts</a></li>
+</ul>
+<hr>
+<div class="subsubsection-level-extent" id="Separation">
+<div class="nav-panel">
+<p>
+Next: <a href="#Argument-Units" accesskey="n" rel="next">Argument Units</a>, Previous: <a href="#Language-Concepts" accesskey="p" rel="prev">Language Concepts</a>, Up: <a href="#Language-Concepts" accesskey="u" rel="up">Language Concepts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Separation-1">6.1.1.1 Separation</h4>
+
+<p><abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> output has strange requirements regarding
+whitespace. The <code class="code">gtroff</code> output parser, however, is more tolerant,
+making whitespace maximally optional. Such characters, i.e., the tab,
+space, and newline, always have a syntactical meaning. They are never
+printable because spacing within the output is always done by
+positioning commands.
+</p>
+<p>Any sequence of space or tab characters is treated as a single
+<em class="dfn">syntactical space</em>. It separates commands and arguments, but is
+only required when there would occur a clashing between the command code
+and the arguments without the space. Most often, this happens when
+variable-length command names, arguments, argument lists, or command
+clusters meet. Commands and arguments with a known, fixed length need
+not be separated by syntactical space.
+</p>
+<p>A line break is a syntactical element, too. Every command argument can
+be followed by whitespace, a comment, or a newline character. Thus a
+<em class="dfn">syntactical line break</em> is defined to consist of optional
+syntactical space that is optionally followed by a comment, and a
+newline character.
+</p>
+<p>The normal commands, those for positioning and text, consist of a single
+letter taking a fixed number of arguments. For historical reasons, the
+parser allows stacking of such commands on the same line, but
+fortunately, in <code class="code">gtroff</code>&rsquo;s intermediate output, every command with
+at least one argument is followed by a line break, thus providing
+excellent readability.
+</p>
+<p>The other commands&mdash;those for drawing and device controlling&mdash;have a
+more complicated structure; some recognize long command names, and some
+take a variable number of arguments. So all &lsquo;<samp class="samp">D</samp>&rsquo; and &lsquo;<samp class="samp">x</samp>&rsquo;
+commands were designed to request a syntactical line break after their
+last argument. Only one command, &lsquo;<samp class="samp">x&nbsp;X</samp>&rsquo;<!-- /@w -->, has an argument that
+can span several input lines; all other commands must have all of
+their arguments on the same line as the command, i.e., the arguments may
+not be split by a line break.
+</p>
+<p>Empty lines (these are lines containing only space and/or a comment),
+can occur everywhere. They are just ignored.
+</p>
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="Argument-Units">
+<div class="nav-panel">
+<p>
+Next: <a href="#Document-Parts" accesskey="n" rel="next">Document Parts</a>, Previous: <a href="#Separation" accesskey="p" rel="prev">Separation</a>, Up: <a href="#Language-Concepts" accesskey="u" rel="up">Language Concepts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Argument-Units-1">6.1.1.2 Argument Units</h4>
+
+<p>Some commands take integer arguments that are assumed to represent
+values in a measurement unit, but the letter for the corresponding
+scaling unit is not written with the output command arguments. Most
+commands assume the scaling unit &lsquo;<samp class="samp">u</samp>&rsquo;, the basic unit of the device,
+some use &lsquo;<samp class="samp">z</samp>&rsquo;, the scaled point unit of the device, while others,
+such as the color commands, expect plain integers.
+</p>
+<p>Single characters can have the eighth bit set, as can the names of
+fonts and special characters. The names of characters and fonts can be
+of arbitrary length. A character that is to be printed is always in
+the current font.
+</p>
+<p>A string argument is always terminated by the next whitespace character
+(space, tab, or newline); an embedded &lsquo;<samp class="samp">#</samp>&rsquo; character is regarded as
+part of the argument, not as the beginning of a comment command. An
+integer argument is already terminated by the next non-digit character,
+which then is regarded as the first character of the next argument or
+command.
+</p>
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="Document-Parts">
+<div class="nav-panel">
+<p>
+Previous: <a href="#Argument-Units" accesskey="p" rel="prev">Argument Units</a>, Up: <a href="#Language-Concepts" accesskey="u" rel="up">Language Concepts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Document-Parts-1">6.1.1.3 Document Parts</h4>
+
+<p>A correct intermediate output document consists of two parts, the
+<em class="dfn">prologue</em> and the <em class="dfn">body</em>.
+</p>
+<p>The task of the prologue is to set the general device parameters using
+three exactly specified commands. <code class="code">gtroff</code>&rsquo;s prologue is
+guaranteed to consist of the following three lines (in that order):
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">x T <var class="var">device</var>
+x res <var class="var">n</var> <var class="var">h</var> <var class="var">v</var>
+x init
+</pre></div></div>
+
+<p>with the arguments set as outlined in <a class="ref" href="#Device-Control-Commands">Device Control Commands</a>.
+The parser for the intermediate output format is able to interpret
+additional whitespace and comments as well even in the prologue.
+</p>
+<p>The body is the main section for processing the document data.
+Syntactically, it is a sequence of any commands different from the ones
+used in the prologue. Processing is terminated as soon as the first
+&lsquo;<samp class="samp">x&nbsp;stop</samp>&rsquo;<!-- /@w --> command is encountered; the last line of any
+<code class="code">gtroff</code> intermediate output always contains such a command.
+</p>
+<p>Semantically, the body is page oriented. A new page is started by a
+&lsquo;<samp class="samp">p</samp>&rsquo; command. Positioning, writing, and drawing commands are always
+done within the current page, so they cannot occur before the first
+&lsquo;<samp class="samp">p</samp>&rsquo; command. Absolute positioning (by the &lsquo;<samp class="samp">H</samp>&rsquo; and &lsquo;<samp class="samp">V</samp>&rsquo;
+commands) is done relative to the current page; all other positioning is
+done relative to the current location within this page.
+</p>
+
+<hr>
+</div>
+</div>
+<div class="subsection-level-extent" id="Command-Reference">
+<div class="nav-panel">
+<p>
+Next: <a href="#Intermediate-Output-Examples" accesskey="n" rel="next">Intermediate Output Examples</a>, Previous: <a href="#Language-Concepts" accesskey="p" rel="prev">Language Concepts</a>, Up: <a href="#gtroff-Output" accesskey="u" rel="up"><code class="code">gtroff</code> Output</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Command-Reference-1">6.1.2 Command Reference</h4>
+
+<p>This section describes all intermediate output commands, both from
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> as well as the <code class="code">gtroff</code> extensions.
+</p>
+
+<ul class="mini-toc">
+<li><a href="#Comment-Command" accesskey="1">Comment Command</a></li>
+<li><a href="#Simple-Commands" accesskey="2">Simple Commands</a></li>
+<li><a href="#Graphics-Commands" accesskey="3">Graphics Commands</a></li>
+<li><a href="#Device-Control-Commands" accesskey="4">Device Control Commands</a></li>
+<li><a href="#Obsolete-Command" accesskey="5">Obsolete Command</a></li>
+</ul>
+<hr>
+<div class="subsubsection-level-extent" id="Comment-Command">
+<div class="nav-panel">
+<p>
+Next: <a href="#Simple-Commands" accesskey="n" rel="next">Simple Commands</a>, Previous: <a href="#Command-Reference" accesskey="p" rel="prev">Command Reference</a>, Up: <a href="#Command-Reference" accesskey="u" rel="up">Command Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Comment-Command-1">6.1.2.1 Comment Command</h4>
+
+<dl class="table">
+<dt><code class="code">#<var class="var">anything</var>&lsaquo;<span class="r">end of line</span>&rsaquo;</code></dt>
+<dd><p>A comment. Ignore any characters from the &lsquo;<samp class="samp">#</samp>&rsquo; character up to the
+next newline character.
+</p>
+<p>This command is the only possibility for commenting in the intermediate
+output. Each comment can be preceded by arbitrary syntactical space;
+every command can be terminated by a comment.
+</p></dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="Simple-Commands">
+<div class="nav-panel">
+<p>
+Next: <a href="#Graphics-Commands" accesskey="n" rel="next">Graphics Commands</a>, Previous: <a href="#Comment-Command" accesskey="p" rel="prev">Comment Command</a>, Up: <a href="#Command-Reference" accesskey="u" rel="up">Command Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Simple-Commands-1">6.1.2.2 Simple Commands</h4>
+
+<p>The commands in this subsection have a command code consisting of a
+single character, taking a fixed number of arguments. Most of them are
+commands for positioning and text writing. These commands are tolerant
+of whitespace. Optionally, syntactical space can be inserted before,
+after, and between the command letter and its arguments. All of these
+commands are stackable; i.e., they can be preceded by other simple
+commands or followed by arbitrary other commands on the same line. A
+separating syntactical space is necessary only when two integer
+arguments would clash or if the preceding argument ends with a string
+argument.
+</p>
+<dl class="table">
+<dt><code class="code">C <var class="var">id</var>&lsaquo;<span class="r">whitespace</span>&rsaquo;</code></dt>
+<dd><p>Typeset the glyph of the special character <var class="var">id</var>. Trailing
+syntactical space is necessary to allow special character names of
+arbitrary length. The drawing position is not advanced.
+</p>
+</dd>
+<dt><code class="code">c <var class="var">g</var></code></dt>
+<dd><p>Typeset the glyph of the ordinary character&nbsp;<var class="var">c</var>. The drawing
+position is not advanced.
+</p>
+</dd>
+<dt><code class="code">f <var class="var">n</var></code></dt>
+<dd><p>Select the font mounted at position&nbsp;<var class="var">n</var>. <var class="var">n</var>&nbsp;cannot
+be negative.
+</p>
+</dd>
+<dt><code class="code">H <var class="var">n</var></code></dt>
+<dd><p>Horizontally move the drawing position to <var class="var">n</var>&nbsp;basic units from
+the left edge of the page. <var class="var">n</var>&nbsp;cannot be negative.
+</p>
+</dd>
+<dt><code class="code">h <var class="var">n</var></code></dt>
+<dd><p>Move the drawing position right <var class="var">n</var> basic units. <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code> allowed negative <var class="var">n</var>; GNU <code class="code">troff</code> does not produce
+such values, but <code class="code">groff</code>&rsquo;s output driver library handles them.
+</p>
+</dd>
+<dt><code class="code">m <var class="var">color-scheme</var> <span class="r">[</span><var class="var">component</var> &hellip;<span class="r">]</span></code></dt>
+<dd><p>Select the stroke color using the <var class="var">component</var>s in the color space
+<var class="var">scheme</var>. Each <var class="var">component</var> is an integer between 0 and 65535.
+The quantity of components and their meanings vary with each
+<var class="var">scheme</var>. This command is a <code class="code">groff</code> extension.
+</p>
+<dl class="table">
+<dt><code class="code">mc <var class="var">cyan</var> <var class="var">magenta</var> <var class="var">yellow</var></code></dt>
+<dd><p>Use the CMY color scheme with components cyan, magenta, and yellow.
+</p>
+</dd>
+<dt><code class="code">md</code></dt>
+<dd><p>Use the default color (no components; black in most cases).
+</p>
+</dd>
+<dt><code class="code">mg <var class="var">gray</var></code></dt>
+<dd><p>Use a grayscale color scheme with a component ranging between 0 (black)
+and 65535 (white).
+</p>
+</dd>
+<dt><code class="code">mk <var class="var">cyan</var> <var class="var">magenta</var> <var class="var">yellow</var> <var class="var">black</var></code></dt>
+<dd><p>Use the CMYK color scheme with components cyan, magenta, yellow, and
+black.
+</p>
+</dd>
+<dt><code class="code">mr <var class="var">red</var> <var class="var">green</var> <var class="var">blue</var></code></dt>
+<dd><p>Use the RGB color scheme with components red, green, and blue.
+</p></dd>
+</dl>
+
+</dd>
+<dt><code class="code">N <var class="var">n</var></code></dt>
+<dd><p>Typeset the glyph with index&nbsp;<var class="var">n</var> in the current font.
+<var class="var">n</var>&nbsp;is normally a non-negative integer. The drawing position
+is not advanced. The <code class="code">html</code> and <code class="code">xhtml</code> devices use this
+command with negative&nbsp;<var class="var">n</var> to produce unbreakable space; the
+absolute value of <var class="var">n</var> is taken and interpreted in basic units.
+</p>
+</dd>
+<dt><code class="code">n <var class="var">b</var> <var class="var">a</var></code></dt>
+<dd><p>Indicate a break. No action is performed; the command is present to
+make the output more easily parsed. The integers <var class="var">b</var>
+and&nbsp;<var class="var">a</var> describe the vertical space amounts before and after
+the break, respectively. GNU <code class="code">troff</code> issues this command but
+<code class="code">groff</code>&rsquo;s output driver library ignores it. See <code class="code">v</code> and
+<code class="code">V</code> below.
+</p>
+</dd>
+<dt><code class="code">p <var class="var">n</var></code></dt>
+<dd><p>Begin a new page, setting its number to&nbsp;<var class="var">n</var>. Each page is
+independent, even from those using the same number. The vertical
+drawing position is set to&nbsp;0. All positioning, writing, and
+drawing commands are interpreted in the context of a page, so a
+<code class="code">p</code>&nbsp;command must precede them.
+</p>
+</dd>
+<dt><code class="code">s <var class="var">n</var></code></dt>
+<dd><p>Set type size to <var class="var">n</var> scaled points (unit&nbsp;<code class="code">z</code> in GNU
+<code class="code">troff</code>.
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> used unscaled points <code class="code">p</code> instead;
+see <a class="ref" href="#Output-Language-Compatibility">Output Language Compatibility</a>.
+</p>
+</dd>
+<dt><code class="code">t <var class="var">xyz</var>&lsaquo;<span class="r">whitespace</span>&rsaquo;</code></dt>
+<dt><code class="code">t <var class="var">xyz</var> <var class="var">dummy-arg</var>&lsaquo;<span class="r">whitespace</span>&rsaquo;</code></dt>
+<dd><p>Typeset a word <var class="var">xyz</var>; that is, set a sequence of ordinary glyphs
+named <var class="var">x</var>, <var class="var">y</var>, <var class="var">z</var>, &hellip;, terminated by a space
+character or a line break; an optional second integer argument is
+ignored (this allows the formatter to generate an even number of
+arguments). Each glyph is set at the current drawing position, and the position is
+then advanced horizontally by the glyph&rsquo;s width. A glyph&rsquo;s width is
+read from its metrics in the font description file, scaled to the
+current type size, and rounded to a multiple of the horizontal motion
+quantum. Use the <code class="code">C</code> command to emplace glyphs of special
+characters. The <code class="code">t</code>&nbsp;command is a <code class="code">groff</code> extension and
+is output only for devices whose <samp class="file">DESC</samp> file contains the
+<code class="code">tcommand</code> directive; see <a class="ref" href="#DESC-File-Format"><samp class="file">DESC</samp> File Format</a>.
+</p>
+</dd>
+<dt><code class="code">u <var class="var">n</var> <var class="var">xyz</var>&lsaquo;<span class="r">whitespace</span>&rsaquo;</code></dt>
+<dd><p>Typeset word <var class="var">xyz</var> with track kerning. As <code class="code">t</code>, but after
+placing each glyph, the drawing position is further advanced
+horizontally by&nbsp;<var class="var">n</var> basic units (<code class="code">u</code>). The
+<code class="code">u</code>&nbsp;command is a <code class="code">groff</code> extension and is output only for
+devices whose <samp class="file">DESC</samp> file contains the <code class="code">tcommand</code> directive;
+see <a class="ref" href="#DESC-File-Format"><samp class="file">DESC</samp> File Format</a>.
+</p>
+</dd>
+<dt><code class="code">V <var class="var">n</var></code></dt>
+<dd><p>Vertically move the drawing position to <var class="var">n</var>&nbsp;basic units from
+the top edge of the page. <var class="var">n</var>&nbsp;cannot be negative.
+</p>
+</dd>
+<dt><code class="code">v <var class="var">n</var></code></dt>
+<dd><p>Move the drawing position down <var class="var">n</var> basic units. <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code> allowed negative <var class="var">n</var>; GNU <code class="code">troff</code> does not produce
+such values, but <code class="code">groff</code>&rsquo;s output driver library handles them.
+</p>
+</dd>
+<dt><code class="code">w</code></dt>
+<dd><p>Indicate an inter-word space. No action is performed; the command is
+present to make the output more easily parsed. Only adjustable,
+breakable inter-word spaces are thus described; those resulting from
+<code class="code">\~</code> or horizontal motion escape sequences are not. GNU
+<code class="code">troff</code> issues this command but <code class="code">groff</code>&rsquo;s output driver
+library ignores it. See <code class="code">h</code> and <code class="code">H</code> above.
+</p></dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="Graphics-Commands">
+<div class="nav-panel">
+<p>
+Next: <a href="#Device-Control-Commands" accesskey="n" rel="next">Device Control Commands</a>, Previous: <a href="#Simple-Commands" accesskey="p" rel="prev">Simple Commands</a>, Up: <a href="#Command-Reference" accesskey="u" rel="up">Command Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Graphics-Commands-1">6.1.2.3 Graphics Commands</h4>
+
+<p>Each graphics or drawing command in the intermediate output starts with
+the letter &lsquo;<samp class="samp">D</samp>&rsquo;, followed by one or two characters that specify a
+subcommand; this is followed by a fixed or variable number of integer
+arguments that are separated by a single space character. A &lsquo;<samp class="samp">D</samp>&rsquo;
+command may not be followed by another command on the same line (apart
+from a comment), so each &lsquo;<samp class="samp">D</samp>&rsquo; command is terminated by a syntactical
+line break.
+</p>
+<p><code class="code">gtroff</code> output follows the classical spacing rules (no space
+between command and subcommand, all arguments are preceded by a single
+space character), but the parser allows optional space between the
+command letters and makes the space before the first argument optional.
+As usual, each space can be any sequence of tab and space characters.
+</p>
+<p>Some graphics commands can take a variable number of arguments. In this
+case, they are integers representing a size measured in basic units
+&lsquo;<samp class="samp">u</samp>&rsquo;. The arguments called <var class="var">h1</var>, <var class="var">h2</var>, &hellip;, <var class="var">hn</var>
+stand for horizontal distances where positive means right, negative
+left. The arguments called <var class="var">v1</var>, <var class="var">v2</var>, &hellip;, <var class="var">vn</var> stand
+for vertical distances where positive means down, negative up. All
+these distances are offsets relative to the current location.
+</p>
+<p>Each graphics command directly corresponds to a similar <code class="code">gtroff</code>
+<code class="code">\D</code> escape sequence. See <a class="xref" href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a>.
+</p>
+<p>Unknown &lsquo;<samp class="samp">D</samp>&rsquo; commands are assumed to be device-specific. Its
+arguments are parsed as strings; the whole information is then sent to
+the postprocessor.
+</p>
+<p>In the following command reference, the syntax element &lsaquo;<span class="r">line
+break</span>&rsaquo; means a syntactical line break as defined above.
+</p>
+<dl class="table">
+<dt><code class="code">D~ <var class="var">h1</var> <var class="var">v1</var> <var class="var">h2</var> <var class="var">v2</var> &hellip; <var class="var">hn</var> <var class="var">vn</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Draw B-spline from current position to offset (<var class="var">h1</var>,<var class="var">v1</var>), then
+to offset (<var class="var">h2</var>,<var class="var">v2</var>), if given, etc., up to
+(<var class="var">hn</var>,<var class="var">vn</var>). This command takes a variable number of argument
+pairs; the current position is moved to the terminal point of the drawn
+curve.
+</p>
+</dd>
+<dt><code class="code">Da <var class="var">h1</var> <var class="var">v1</var> <var class="var">h2</var> <var class="var">v2</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Draw arc from current position to
+(<var class="var">h1</var>,<var class="var">v1</var>)<em class="math">+</em>(<var class="var">h2</var>,<var class="var">v2</var>) with center at
+(<var class="var">h1</var>,<var class="var">v1</var>); then move the current position to the final point
+of the arc.
+</p>
+</dd>
+<dt><code class="code">DC <var class="var">d</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dt><code class="code">DC <var class="var">d</var> <var class="var">dummy-arg</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Draw a solid circle using the current fill color with
+diameter&nbsp;<var class="var">d</var> (integer in basic units &lsquo;<samp class="samp">u</samp>&rsquo;) with leftmost
+point at the current position; then move the current position to the
+rightmost point of the circle. An optional second integer argument is
+ignored (this allows the formatter to generate an even number of
+arguments). This command is a <code class="code">gtroff</code> extension.
+</p>
+</dd>
+<dt><code class="code">Dc <var class="var">d</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Draw circle line with diameter&nbsp;<var class="var">d</var> (integer in basic units
+&lsquo;<samp class="samp">u</samp>&rsquo;) with leftmost point at the current position; then move the
+current position to the rightmost point of the circle.
+</p>
+</dd>
+<dt><code class="code">DE <var class="var">h</var> <var class="var">v</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Draw a solid ellipse in the current fill color with a horizontal
+diameter of&nbsp;<var class="var">h</var> and a vertical diameter of&nbsp;<var class="var">v</var> (both
+integers in basic units &lsquo;<samp class="samp">u</samp>&rsquo;) with the leftmost point at the current
+position; then move to the rightmost point of the ellipse. This command
+is a <code class="code">gtroff</code> extension.
+</p>
+</dd>
+<dt><code class="code">De <var class="var">h</var> <var class="var">v</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Draw an outlined ellipse with a horizontal diameter of&nbsp;<var class="var">h</var> and
+a vertical diameter of&nbsp;<var class="var">v</var> (both integers in basic units
+&lsquo;<samp class="samp">u</samp>&rsquo;) with the leftmost point at current position; then move to the
+rightmost point of the ellipse.
+</p>
+</dd>
+<dt><code class="code">DF <var class="var">color-scheme</var> <span class="r">[</span><var class="var">component</var> &hellip;<span class="r">]</span>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Set fill color for solid drawing objects using different color schemes;
+the analogous command for setting the color of text, line graphics, and
+the outline of graphic objects is &lsquo;<samp class="samp">m</samp>&rsquo;. The color components are
+specified as integer arguments between 0 and 65535. The number of color
+components and their meaning vary for the different color schemes.
+These commands are generated by <code class="code">gtroff</code>&rsquo;s escape sequences
+&lsquo;<samp class="samp">\D'F &hellip;'</samp>&rsquo; and <code class="code">\M</code> (with no other corresponding
+graphics commands). No position changing. This command is a
+<code class="code">gtroff</code> extension.
+</p>
+<dl class="table">
+<dt><code class="code">DFc <var class="var">cyan</var> <var class="var">magenta</var> <var class="var">yellow</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Set fill color for solid drawing objects using the CMY color scheme,
+having the 3&nbsp;color components <var class="var">cyan</var>, <var class="var">magenta</var>, and
+<var class="var">yellow</var>.
+</p>
+</dd>
+<dt><code class="code">DFd&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Set fill color for solid drawing objects to the default fill color value
+(black in most cases). No component arguments.
+</p>
+</dd>
+<dt><code class="code">DFg <var class="var">gray</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Set fill color for solid drawing objects to the shade of gray given by
+the argument, an integer between 0 (black) and 65535 (white).
+</p>
+</dd>
+<dt><code class="code">DFk <var class="var">cyan</var> <var class="var">magenta</var> <var class="var">yellow</var> <var class="var">black</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Set fill color for solid drawing objects using the CMYK color scheme,
+having the 4&nbsp;color components <var class="var">cyan</var>, <var class="var">magenta</var>,
+<var class="var">yellow</var>, and <var class="var">black</var>.
+</p>
+</dd>
+<dt><code class="code">DFr <var class="var">red</var> <var class="var">green</var> <var class="var">blue</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Set fill color for solid drawing objects using the RGB color scheme,
+having the 3&nbsp;color components <var class="var">red</var>, <var class="var">green</var>, and
+<var class="var">blue</var>.
+</p></dd>
+</dl>
+
+</dd>
+<dt><code class="code">Df <var class="var">n</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The argument&nbsp;<var class="var">n</var> must be an integer in the range <em class="math">-32767</em>
+to 32767.
+</p>
+<dl class="table">
+<dt><em class="math">0 &le; <var class="var">n</var> &le; 1000</em></dt>
+<dd><p>Set the color for filling solid drawing objects to a shade of gray,
+where 0 corresponds to solid white, 1000 (the default) to solid black,
+and values in between to intermediate shades of gray; this is obsoleted
+by command &lsquo;<samp class="samp">DFg</samp>&rsquo;.
+</p>
+</dd>
+<dt><em class="math"><var class="var">n</var> &lt; 0</em> or <em class="math"><var class="var">n</var> &gt; 1000</em></dt>
+<dd><p>Set the filling color to the color that is currently being used for the
+text and the outline, see command &lsquo;<samp class="samp">m</samp>&rsquo;. For example, the command
+sequence
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">mg 0 0 65535
+Df -1
+</pre></div></div>
+
+<p>sets all colors to blue.
+</p></dd>
+</dl>
+
+<p>No position changing. This command is a <code class="code">gtroff</code> extension.
+</p>
+</dd>
+<dt><code class="code">Dl <var class="var">h</var> <var class="var">v</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Draw line from current position to offset (<var class="var">h</var>,<var class="var">v</var>) (integers in
+basic units &lsquo;<samp class="samp">u</samp>&rsquo;); then set current position to the end of the drawn
+line.
+</p>
+</dd>
+<dt><code class="code">Dp <var class="var">h1</var> <var class="var">v1</var> <var class="var">h2</var> <var class="var">v2</var> &hellip; <var class="var">hn</var> <var class="var">vn</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Draw a polygon line from current position to offset (<var class="var">h1</var>,<var class="var">v1</var>),
+from there to offset (<var class="var">h2</var>,<var class="var">v2</var>), etc., up to offset
+(<var class="var">hn</var>,<var class="var">vn</var>), and from there back to the starting position. For
+historical reasons, the position is changed by adding the sum of all
+arguments with odd index to the actual horizontal position and the even
+ones to the vertical position. Although this doesn&rsquo;t make sense it is
+kept for compatibility.
+This command is a <code class="code">gtroff</code> extension.
+</p>
+</dd>
+<dt><code class="code">DP <var class="var">h1</var> <var class="var">v1</var> <var class="var">h2</var> <var class="var">v2</var> &hellip; <var class="var">hn</var> <var class="var">vn</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Draw a solid polygon in the current fill color rather than an outlined
+polygon, using the same arguments and positioning as the corresponding
+&lsquo;<samp class="samp">Dp</samp>&rsquo; command.
+This command is a <code class="code">gtroff</code> extension.
+</p>
+</dd>
+<dt><code class="code">Dt <var class="var">n</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Set the current line thickness to&nbsp;<var class="var">n</var> (an integer in basic
+units &lsquo;<samp class="samp">u</samp>&rsquo;) if <em class="math"><var class="var">n</var>&gt;0</em>; if <em class="math"><var class="var">n</var>=0</em> select the
+smallest available line thickness; if <em class="math"><var class="var">n</var>&lt;0</em> set the line
+thickness proportional to the type size (this is the default before the
+first &lsquo;<samp class="samp">Dt</samp>&rsquo; command was specified). For historical reasons, the
+horizontal position is changed by adding the argument to the actual
+horizontal position, while the vertical position is not changed.
+Although this doesn&rsquo;t make sense it is kept for compatibility.
+This command is a <code class="code">gtroff</code> extension.
+</p></dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="Device-Control-Commands">
+<div class="nav-panel">
+<p>
+Next: <a href="#Obsolete-Command" accesskey="n" rel="next">Obsolete Command</a>, Previous: <a href="#Graphics-Commands" accesskey="p" rel="prev">Graphics Commands</a>, Up: <a href="#Command-Reference" accesskey="u" rel="up">Command Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Device-Control-Commands-1">6.1.2.4 Device Control Commands</h4>
+
+<p>Each device control command starts with the letter &lsquo;<samp class="samp">x</samp>&rsquo;, followed by
+a space character (optional or arbitrary space or tab in <code class="code">gtroff</code>)
+and a subcommand letter or word; each argument (if any) must be preceded
+by a syntactical space. All &lsquo;<samp class="samp">x</samp>&rsquo; commands are terminated by a
+syntactical line break; no device control command can be followed by
+another command on the same line (except a comment).
+</p>
+<p>The subcommand is basically a single letter, but to increase
+readability, it can be written as a word, i.e., an arbitrary sequence of
+characters terminated by the next tab, space, or newline character. All
+characters of the subcommand word but the first are simply ignored. For
+example, <code class="code">gtroff</code> outputs the initialization command &lsquo;<samp class="samp">x&nbsp;i</samp>&rsquo;<!-- /@w -->
+as &lsquo;<samp class="samp">x&nbsp;init</samp>&rsquo;<!-- /@w --> and the resolution command &lsquo;<samp class="samp">x&nbsp;r</samp>&rsquo;<!-- /@w --> as
+&lsquo;<samp class="samp">x&nbsp;res</samp>&rsquo;<!-- /@w -->.
+</p>
+<p>In the following, the syntax element &lsaquo;<span class="r">line break</span>&rsaquo; means a
+syntactical line break (see <a class="pxref" href="#Separation">Separation</a>).
+</p>
+<dl class="table">
+<dt><code class="code">xF <var class="var">name</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">F</samp>&rsquo; stands for <var class="var">Filename</var>.
+</p>
+<p>Use <var class="var">name</var> as the intended name for the current file in error
+reports. This is useful for remembering the original file name when
+<code class="code">gtroff</code> uses an internal piping mechanism. The input file is not
+changed by this command. This command is a <code class="code">gtroff</code> extension.
+</p>
+</dd>
+<dt><code class="code">xf <var class="var">n</var> <var class="var">s</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">f</samp>&rsquo; stands for <var class="var">font</var>.
+</p>
+<p>Mount font position&nbsp;<var class="var">n</var> (a non-negative integer) with font
+named&nbsp;<var class="var">s</var> (a text word). See <a class="xref" href="#Font-Positions">Font Positions</a>.
+</p>
+</dd>
+<dt><code class="code">xH <var class="var">n</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">H</samp>&rsquo; stands for <var class="var">Height</var>.
+</p>
+<p>Set glyph height to&nbsp;<var class="var">n</var> (a positive integer in scaled points
+&lsquo;<samp class="samp">z</samp>&rsquo;). <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> uses the unit points (&lsquo;<samp class="samp">p</samp>&rsquo;)
+instead. See <a class="xref" href="#Output-Language-Compatibility">Output Language Compatibility</a>.
+</p>
+</dd>
+<dt><code class="code">xi&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">i</samp>&rsquo; stands for <var class="var">init</var>.
+</p>
+<p>Initialize device. This is the third command of the prologue.
+</p>
+</dd>
+<dt><code class="code">xp&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">p</samp>&rsquo; stands for <var class="var">pause</var>.
+</p>
+<p>Parsed but ignored. The <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> manual documents
+this command as
+</p>
+<div class="display">
+<pre class="display-preformatted">pause device, can be restarted
+</pre></div>
+
+<p>but GNU <code class="code">troff</code> output drivers do nothing with this command.
+</p>
+</dd>
+<dt><code class="code">xr <var class="var">n</var> <var class="var">h</var> <var class="var">v</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">r</samp>&rsquo; stands for <var class="var">resolution</var>.
+</p>
+<p>Resolution is&nbsp;<var class="var">n</var>, while <var class="var">h</var> is the minimal horizontal
+motion, and <var class="var">v</var> the minimal vertical motion possible with this
+device; all arguments are positive integers in basic units &lsquo;<samp class="samp">u</samp>&rsquo; per
+inch. This is the second command of the prologue.
+</p>
+</dd>
+<dt><code class="code">xS <var class="var">n</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">S</samp>&rsquo; stands for <var class="var">Slant</var>.
+</p>
+<p>Set slant to&nbsp;<var class="var">n</var> (an integer in basic units &lsquo;<samp class="samp">u</samp>&rsquo;).
+</p>
+</dd>
+<dt><code class="code">xs&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">s</samp>&rsquo; stands for <var class="var">stop</var>.
+</p>
+<p>Terminates the processing of the current file; issued as the last
+command of any intermediate <code class="code">troff</code> output.
+</p>
+</dd>
+<dt><code class="code">xt&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">t</samp>&rsquo; stands for <var class="var">trailer</var>.
+</p>
+<p>Generate trailer information, if any. In GNU <code class="code">troff</code>, this is
+ignored.
+</p>
+</dd>
+<dt><code class="code">xT <var class="var">xxx</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">T</samp>&rsquo; stands for <var class="var">Typesetter</var>.
+</p>
+<p>Set the name of the output driver to <var class="var">xxx</var>, a sequence of
+non-whitespace characters terminated by whitespace. The possible names
+correspond to those of <code class="code">groff</code>&rsquo;s <samp class="option">-T</samp> option. This is the
+first command of the prologue.
+</p>
+</dd>
+<dt><code class="code">xu <var class="var">n</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">u</samp>&rsquo; stands for <var class="var">underline</var>.
+</p>
+<p>Configure underlining of spaces. If <var class="var">n</var> is&nbsp;1, start
+underlining of spaces; if <var class="var">n</var> is&nbsp;0, stop underlining of spaces.
+This is needed for the <code class="code">cu</code> request in <code class="code">nroff</code> mode and is
+ignored otherwise. This command is a <code class="code">gtroff</code> extension.
+</p>
+</dd>
+<dt><code class="code">xX <var class="var">anything</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">x</samp>&rsquo; stands for <var class="var">X-escape</var>.
+</p>
+<p>Send string <var class="var">anything</var> uninterpreted to the device. If the line
+following this command starts with a &lsquo;<samp class="samp">+</samp>&rsquo; character this line is
+interpreted as a continuation line in the following sense. The &lsquo;<samp class="samp">+</samp>&rsquo;
+is ignored, but a newline character is sent instead to the device, the
+rest of the line is sent uninterpreted. The same applies to all
+following lines until the first character of a line is not a &lsquo;<samp class="samp">+</samp>&rsquo;
+character. This command is generated by the <code class="code">gtroff</code> escape
+sequence <code class="code">\X</code>. The line-continuing feature is a <code class="code">gtroff</code>
+extension.
+</p></dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsubsection-level-extent" id="Obsolete-Command">
+<div class="nav-panel">
+<p>
+Previous: <a href="#Device-Control-Commands" accesskey="p" rel="prev">Device Control Commands</a>, Up: <a href="#Command-Reference" accesskey="u" rel="up">Command Reference</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsubsection" id="Obsolete-Command-1">6.1.2.5 Obsolete Command</h4>
+<p>In <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> output, the writing of a single glyph is
+mostly done by a very strange command that combines a horizontal move
+and a single character giving the glyph name. It doesn&rsquo;t have a command
+code, but is represented by a 3-character argument consisting of exactly
+2&nbsp;digits and a character.
+</p>
+<dl class="table">
+<dt><var class="var">dd</var><var class="var">g</var></dt>
+<dd><p>Move right <var class="var">dd</var> (exactly two decimal digits) basic units &lsquo;<samp class="samp">u</samp>&rsquo;,
+then print glyph&nbsp;<var class="var">g</var> (represented as a single character).
+</p>
+<p>In GNU <code class="code">troff</code>, arbitrary syntactical space around and within this
+command is allowed. Only when a preceding command on the same line ends
+with an argument of variable length is a separating space obligatory.
+In <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>, large clusters of these and other
+commands are used, mostly without spaces; this made such output almost
+unreadable.
+</p></dd>
+</dl>
+
+<p>For modern high-resolution devices, this command does not make sense
+because the width of the glyphs can become much larger than two decimal
+digits. In <code class="code">gtroff</code>, this is only used for the devices <code class="code">X75</code>,
+<code class="code">X75-12</code>, <code class="code">X100</code>, and <code class="code">X100-12</code>. For other devices, the
+commands &lsquo;<samp class="samp">t</samp>&rsquo; and &lsquo;<samp class="samp">u</samp>&rsquo; provide a better functionality.
+</p>
+
+<hr>
+</div>
+</div>
+<div class="subsection-level-extent" id="Intermediate-Output-Examples">
+<div class="nav-panel">
+<p>
+Next: <a href="#Output-Language-Compatibility" accesskey="n" rel="next">Output Language Compatibility</a>, Previous: <a href="#Command-Reference" accesskey="p" rel="prev">Command Reference</a>, Up: <a href="#gtroff-Output" accesskey="u" rel="up"><code class="code">gtroff</code> Output</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Intermediate-Output-Examples-1">6.1.3 Intermediate Output Examples</h4>
+
+<p>This section presents the intermediate output generated from the same
+input for three different devices. The input is the sentence &lsquo;<samp class="samp">hell
+world</samp>&rsquo; fed into <code class="code">gtroff</code> on the command line.
+</p>
+<dl class="table">
+<dt>High-resolution device <code class="code">ps</code></dt>
+<dd>
+<p>This is the standard output of <code class="code">gtroff</code> if no <samp class="option">-T</samp> option is
+given.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">shell&gt; echo &quot;hell world&quot; | groff -Z -T ps
+
+x T ps
+x res 72000 1 1
+x init
+</pre></div><pre class="example-preformatted">p1
+x font 5 TR
+f5
+s10000
+V12000
+H72000
+thell
+wh2500
+tw
+H96620
+torld
+n12000 0
+</pre><div class="group"><pre class="example-preformatted">x trailer
+V792000
+x stop
+</pre></div></div>
+
+<p>This output can be fed into <code class="code">grops</code> to get its representation as a
+PostScript file.
+</p>
+</dd>
+<dt>Low-resolution device <code class="code">latin1</code></dt>
+<dd>
+<p>This is similar to the high-resolution device except that the
+positioning is done at a minor scale. Some comments (lines starting
+with &lsquo;<samp class="samp">#</samp>&rsquo;) were added for clarification; they were not generated by
+the formatter.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">shell&gt; echo &quot;hell world&quot; | groff -Z -T latin1
+
+# prologue
+x T latin1
+x res 240 24 40
+x init
+</pre></div><pre class="example-preformatted"># begin a new page
+p1
+# font setup
+x font 1 R
+f1
+s10
+# initial positioning on the page
+V40
+H0
+# write text 'hell'
+thell
+# inform about space, and issue a horizontal jump
+wh24
+# write text 'world'
+tworld
+# announce line break, but do nothing because...
+n40 0
+</pre><div class="group"><pre class="example-preformatted"># ...the end of the document has been reached
+x trailer
+V2640
+x stop
+</pre></div></div>
+
+<p>This output can be fed into <code class="code">grotty</code> to get a formatted text
+document.
+</p>
+</dd>
+<dt><abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> output</dt>
+<dd><p>Since a computer monitor has a much lower resolution than modern
+printers, the intermediate output for X11 devices can use the
+jump-and-write command with its 2-digit displacements.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">shell&gt; echo &quot;hell world&quot; | groff -Z -T X100
+
+x T X100
+x res 100 1 1
+x init
+</pre></div><pre class="example-preformatted">p1
+x font 5 TR
+f5
+s10
+V16
+H100
+# write text with jump-and-write commands
+ch07e07l03lw06w11o07r05l03dh7
+n16 0
+</pre><div class="group"><pre class="example-preformatted">x trailer
+V1100
+x stop
+</pre></div></div>
+
+<p>This output can be fed into <code class="code">xditview</code> or <code class="code">gxditview</code> for
+displaying in&nbsp;X.
+</p>
+<p>Due to the obsolete jump-and-write command, the text clusters in the
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> output are almost unreadable.
+</p></dd>
+</dl>
+
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Output-Language-Compatibility">
+<div class="nav-panel">
+<p>
+Previous: <a href="#Intermediate-Output-Examples" accesskey="p" rel="prev">Intermediate Output Examples</a>, Up: <a href="#gtroff-Output" accesskey="u" rel="up"><code class="code">gtroff</code> Output</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Output-Language-Compatibility-1">6.1.4 Output Language Compatibility</h4>
+
+<p>The intermediate output language of <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> was
+first documented in <cite class="cite">A Typesetter-independent TROFF</cite>, by Brian
+Kernighan, and by 1992 the <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> manual was
+updated to incorprate a description of it.
+</p>
+<p>The GNU <code class="code">troff</code> intermediate output format is compatible with this
+specification except for the following features.
+</p>
+<ul class="itemize mark-bullet">
+<li>The classical quasi-device independence is not yet implemented.
+
+</li><li>The old hardware was very different from what we use today. So the
+<code class="code">groff</code> devices are also fundamentally different from the ones
+in <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>. For example, the <abbr class="acronym">AT&amp;T</abbr>
+PostScript device is called <code class="code">post</code> and has a resolution of only 720
+units per inch, suitable for printers 20 years ago, while <code class="code">groff</code>&rsquo;s
+<code class="code">ps</code> device has a resolution of 72000 units per inch. Maybe, by
+implementing some rescaling mechanism similar to the classical
+quasi-device independence, <code class="code">groff</code> could emulate <abbr class="acronym">AT&amp;T</abbr>&rsquo;s
+<code class="code">post</code> device.
+
+</li><li>The B-spline command &lsquo;<samp class="samp">D~</samp>&rsquo; is correctly handled by the intermediate
+output parser, but the drawing routines aren&rsquo;t implemented in some of
+the postprocessor programs.
+
+</li><li>The argument of the commands &lsquo;<samp class="samp">s</samp>&rsquo; and &lsquo;<samp class="samp">x&nbsp;H</samp>&rsquo;<!-- /@w --> has the
+implicit unit scaled point &lsquo;<samp class="samp">z</samp>&rsquo; in <code class="code">gtroff</code>, while
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> has point (&lsquo;<samp class="samp">p</samp>&rsquo;). This isn&rsquo;t an
+incompatibility but a compatible extension, for both units coincide for
+all devices without a <code class="code">sizescale</code> parameter in the <samp class="file">DESC</samp>
+file, including all postprocessors from <abbr class="acronym">AT&amp;T</abbr> and
+<code class="code">groff</code>&rsquo;s text devices. The few <code class="code">groff</code> devices with a
+<code class="code">sizescale</code> parameter either do not exist for <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code>, have a different name, or seem to have a different
+resolution. So conflicts are very unlikely.
+
+</li><li>The position changing after the commands &lsquo;<samp class="samp">Dp</samp>&rsquo;, &lsquo;<samp class="samp">DP</samp>&rsquo;, and
+&lsquo;<samp class="samp">Dt</samp>&rsquo; is illogical, but as old versions of <code class="code">gtroff</code> used this
+feature it is kept for compatibility reasons.
+
+
+</li></ul>
+
+
+
+<hr>
+</div>
+</div>
+<div class="section-level-extent" id="Device-and-Font-Description-Files">
+<div class="nav-panel">
+<p>
+Previous: <a href="#gtroff-Output" accesskey="p" rel="prev"><code class="code">gtroff</code> Output</a>, Up: <a href="#File-Formats" accesskey="u" rel="up">File Formats</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h3 class="section" id="Device-and-Font-Description-Files-1">6.2 Device and Font Description Files</h3>
+<a class="index-entry-id" id="index-font-files"></a>
+<a class="index-entry-id" id="index-files_002c-font"></a>
+
+<p>The <code class="code">groff</code> font and output device description formats are slight
+extensions of those used by <abbr class="acronym">AT&amp;T</abbr> device-independent
+<code class="code">troff</code>. In distinction to the <abbr class="acronym">AT&amp;T</abbr> implementation,
+<code class="code">groff</code> lacks a binary format; all files are text
+files.<a class="footnote" id="DOCF125" href="#FOOT125"><sup>125</sup></a> The device and font description files for a device <var class="var">name</var>
+are stored in a <samp class="file">dev<var class="var">name</var></samp> directory. The device description
+file is called <samp class="file">DESC</samp>, and, for each font supported by the device,
+a font description file is called&nbsp;<samp class="file"><var class="var">f</var></samp>, where
+<var class="var">f</var>&nbsp;is usually an abbreviation of a font&rsquo;s name and/or style.
+For example, the <code class="code">ps</code> (PostScript) device has <code class="code">groff</code> font
+description files for Times roman (<samp class="file">TR</samp>) and Zapf Chancery Medium
+italic (<samp class="file">ZCMI</samp>), among many others, while the <code class="code">utf8</code> device
+(for terminal emulators) has only font descriptions for the roman,
+italic, bold, and bold-italic styles (<samp class="file">R</samp>, <samp class="file">I</samp>, <samp class="file">B</samp>, and
+<samp class="file">BI</samp>, respectively).
+</p>
+<p>Device and font description files are read both by the formatter, GNU
+<code class="code">troff</code>, and by output drivers. The programs delegate these files&rsquo;
+processing to an internal library, <samp class="file">libgroff</samp>, ensuring their
+consistent interpretation.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="#DESC-File-Format" accesskey="1"><samp class="file">DESC</samp> File Format</a></li>
+<li><a href="#Font-Description-File-Format" accesskey="2">Font Description File Format</a></li>
+</ul>
+<hr>
+<div class="subsection-level-extent" id="DESC-File-Format">
+<div class="nav-panel">
+<p>
+Next: <a href="#Font-Description-File-Format" accesskey="n" rel="next">Font Description File Format</a>, Previous: <a href="#Device-and-Font-Description-Files" accesskey="p" rel="prev">Device and Font Description Files</a>, Up: <a href="#Device-and-Font-Description-Files" accesskey="u" rel="up">Device and Font Description Files</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="DESC-File-Format-1">6.2.1 <samp class="file">DESC</samp> File Format</h4>
+<a class="index-entry-id" id="index-DESC-file-format"></a>
+<a class="index-entry-id" id="index-font-description-file-format"></a>
+<a class="index-entry-id" id="index-format-of-font-description-file"></a>
+
+<p>The <samp class="file">DESC</samp> file contains a series of directives; each begins a
+line. Their order is not important, with two exceptions: (1) the
+<code class="code">res</code> directive must precede any <code class="code">papersize</code> directive; and
+(2) the <code class="code">charset</code> directive must come last (if at all). If a
+directive name is repeated, later entries in the file override previous
+ones (except that the paper dimensions are computed based on the
+<code class="code">res</code> directive last seen when <code class="code">papersize</code> is encountered).
+Spaces and/or tabs separate words and are ignored at line boundaries.
+<a class="index-entry-id" id="index-comments-in-device-description-files"></a>
+<a class="index-entry-id" id="index-device-description-files_002c-comments"></a>
+<a class="index-entry-id" id="index-_0023"></a>
+Comments start with the &lsquo;<samp class="samp">#</samp>&rsquo; character and extend to the end of a
+line. Empty lines are ignored.
+</p>
+<dl class="table">
+<dt id='index-family-1'><span><code class="code">family <var class="var">fam</var></code><a class="copiable-link" href='#index-family-1'> &para;</a></span></dt>
+<dd><p>The default font family is <var class="var">fam</var>.
+</p>
+</dd>
+<dt id='index-fonts-2'><span><code class="code">fonts <var class="var">n</var> <var class="var">F1</var> <span class="r">&hellip;</span> <var class="var">Fn</var></code><a class="copiable-link" href='#index-fonts-2'> &para;</a></span></dt>
+<dd><p>Fonts <var class="var">F1</var>, &hellip;, <var class="var">Fn</var> are mounted at font positions
+<var class="var">m</var>+1, &hellip;, <var class="var">m</var>+<var class="var">n</var> where <var class="var">m</var> is the number of
+<code class="code">styles</code> (see below). This directive may extend over more than one
+line. A font name of&nbsp;<code class="code">0</code> causes no font to be mounted at the
+corresponding position.
+</p>
+</dd>
+<dt id='index-hor'><span><code class="code">hor <var class="var">n</var></code><a class="copiable-link" href='#index-hor'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-horizontal-motion-quantum"></a>
+<a class="index-entry-id" id="index-motion-quantum_002c-horizontal"></a>
+<a class="index-entry-id" id="index-quantum_002c-horizontal-motion"></a>
+<a class="index-entry-id" id="index-horizontal-resolution"></a>
+<a class="index-entry-id" id="index-resolution_002c-horizontal"></a>
+<p>The horizontal motion quantum is <var class="var">n</var>&nbsp;basic units. All
+horizontal quantities are rounded to multiples of&nbsp;<var class="var">n</var>.
+</p>
+</dd>
+<dt id='index-image_005fgenerator'><span><code class="code">image_generator <var class="var">program</var></code><a class="copiable-link" href='#index-image_005fgenerator'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PostScript_002c-PNG-image-generation"></a>
+<a class="index-entry-id" id="index-PNG-image-generation-from-PostScript"></a>
+<p>Use <var class="var">program</var> to generate PNG images from PostScript input. Under
+GNU/Linux, this is usually <code class="code">gs</code>, but under other systems (notably
+Cygwin) it might be set to another name. The <code class="code">grohtml</code> driver uses
+this directive.
+</p>
+</dd>
+<dt id='index-paperlength'><span><code class="code">paperlength <var class="var">n</var></code><a class="copiable-link" href='#index-paperlength'> &para;</a></span></dt>
+<dd><p>The vertical dimension of the output medium is <var class="var">n</var>&nbsp;basic units
+(deprecated: use <code class="code">papersize</code> instead).
+</p>
+</dd>
+<dt id='index-papersize'><span><code class="code">papersize <var class="var">format-or-dimension-pair-or-file-name</var> <span class="r">&hellip;</span></code><a class="copiable-link" href='#index-papersize'> &para;</a></span></dt>
+<dd><p>The dimensions of the output medium are as according to the
+argument, which is either a standard paper format, a pair of dimensions,
+or the name of a plain text file containing either of the foregoing.
+</p>
+<p>Recognized paper formats are the ISO and DIN formats
+<code class="code">A0</code>&ndash;<code class="code">A7</code>, <code class="code">B0</code>&ndash;<code class="code">B7</code>, <code class="code">C0</code>&ndash;<code class="code">C7</code>,
+<code class="code">D0</code>&ndash;<code class="code">D7</code>; the U.S. paper types <code class="code">letter</code>,
+<code class="code">legal</code>, <code class="code">tabloid</code>, <code class="code">ledger</code>, <code class="code">statement</code>, and
+<code class="code">executive</code>; and the envelope formats <code class="code">com10</code>, <code class="code">monarch</code>,
+and <code class="code">DL</code>. Matching is performed without regard for lettercase.
+</p>
+<p>Alternatively, the argument can be a custom paper format in the format
+<code class="code"><var class="var">length</var>,<var class="var">width</var></code> (with no spaces before or after the
+comma). Both <var class="var">length</var> and <var class="var">width</var> must have a unit appended;
+valid units are &lsquo;<samp class="samp">i</samp>&rsquo; for inches, &lsquo;<samp class="samp">c</samp>&rsquo; for centimeters, &lsquo;<samp class="samp">p</samp>&rsquo;
+for points, and &lsquo;<samp class="samp">P</samp>&rsquo; for picas. Example: &lsquo;<samp class="samp">12c,235p</samp>&rsquo;. An
+argument that starts with a digit is always treated as a custom paper
+format.
+</p>
+<p>Finally, the argument can be a file name (e.g., <samp class="file">/etc/papersize</samp>);
+if the file can be opened, the first line is read and a match attempted
+against each of the other forms. No comment syntax is supported.
+</p>
+<p>More than one argument can be specified;
+each is scanned in turn and the first valid paper specification used.
+</p>
+</dd>
+<dt id='index-paperwidth'><span><code class="code">paperwidth <var class="var">n</var></code><a class="copiable-link" href='#index-paperwidth'> &para;</a></span></dt>
+<dd><p>The horizontal dimension of the output medium is <var class="var">n</var>&nbsp;basic
+units (deprecated: use <code class="code">papersize</code> instead).
+</p>
+</dd>
+<dt id='index-pass_005ffilenames'><span><code class="code">pass_filenames</code><a class="copiable-link" href='#index-pass_005ffilenames'> &para;</a></span></dt>
+<dd><p>Direct GNU <code class="code">troff</code> to emit the name of the source file being
+processed. This is achieved with the intermediate output command
+&lsquo;<samp class="samp">x F</samp>&rsquo;, which <code class="code">grohtml</code> interprets.
+</p>
+</dd>
+<dt id='index-postpro'><span><code class="code">postpro <var class="var">program</var></code><a class="copiable-link" href='#index-postpro'> &para;</a></span></dt>
+<dd><p>Use <var class="var">program</var> as the postprocessor.
+</p>
+</dd>
+<dt id='index-prepro'><span><code class="code">prepro <var class="var">program</var></code><a class="copiable-link" href='#index-prepro'> &para;</a></span></dt>
+<dd><p>Use <var class="var">program</var> as a preprocessor. The <code class="code">html</code> and <code class="code">xhtml</code>
+output devices use this directive.
+</p>
+</dd>
+<dt id='index-print'><span><code class="code">print <var class="var">program</var></code><a class="copiable-link" href='#index-print'> &para;</a></span></dt>
+<dd><p>Use <var class="var">program</var> as a spooler program for printing. If omitted, the
+<samp class="option">-l</samp> and <samp class="option">-L</samp> options of <code class="code">groff</code> are ignored.
+</p>
+</dd>
+<dt id='index-res'><span><code class="code">res <var class="var">n</var></code><a class="copiable-link" href='#index-res'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-device-resolution-1"></a>
+<a class="index-entry-id" id="index-resolution_002c-device-1"></a>
+<p>The device resolution is <var class="var">n</var>&nbsp;basic units per inch.
+</p>
+</dd>
+<dt id='index-sizes'><span><code class="code">sizes <var class="var">s1</var> <span class="r">&hellip;</span> <var class="var">sn</var> 0</code><a class="copiable-link" href='#index-sizes'> &para;</a></span></dt>
+<dd><p>The device has fonts at <var class="var">s1</var>, &hellip;, <var class="var">sn</var> scaled points (see
+below). The list of sizes must be terminated by&nbsp;<code class="code">0</code>. Each
+<var class="var">si</var> can also be a range of sizes <var class="var">m</var>&ndash;<var class="var">n</var>. The list can
+extend over more than one line.
+</p>
+</dd>
+<dt id='index-sizescale'><span><code class="code">sizescale <var class="var">n</var></code><a class="copiable-link" href='#index-sizescale'> &para;</a></span></dt>
+<dd><p>A typographical point is subdivided into <var class="var">n</var>&nbsp;scaled points.
+The default is&nbsp;<code class="code">1</code>. See <a class="xref" href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a>.
+</p>
+</dd>
+<dt id='index-styles-2'><span><code class="code">styles <var class="var">S1</var> <span class="r">&hellip;</span> <var class="var">Sm</var></code><a class="copiable-link" href='#index-styles-2'> &para;</a></span></dt>
+<dd><p>The first&nbsp;<var class="var">m</var> mounting positions are associated with styles
+<var class="var">S1</var>, &hellip;, <var class="var">Sm</var>.
+</p>
+</dd>
+<dt id='index-tcommand'><span><code class="code">tcommand</code><a class="copiable-link" href='#index-tcommand'> &para;</a></span></dt>
+<dd><p>The postprocessor can handle the &lsquo;<samp class="samp">t</samp>&rsquo; and &lsquo;<samp class="samp">u</samp>&rsquo; intermediate
+output commands.
+</p>
+</dd>
+<dt id='index-unicode'><span><code class="code">unicode</code><a class="copiable-link" href='#index-unicode'> &para;</a></span></dt>
+<dd><p>The output device supports the complete Unicode repertoire. This
+directive is useful only for devices that produce character entities
+instead of glyphs.
+</p>
+<p>If <code class="code">unicode</code> is present, no <code class="code">charset</code> section is required in
+the font description files since the Unicode handling built into
+<code class="code">groff</code> is used. However, if there are entries in a font
+description file&rsquo;s <code class="code">charset</code> section, they either override the
+default mappings for those particular characters or add new mappings
+(normally for composite characters).
+</p>
+<p>The <code class="code">utf8</code>, <code class="code">html</code>, and <code class="code">xhtml</code> output devices use this
+directive.
+</p>
+</dd>
+<dt id='index-unitwidth'><span><code class="code">unitwidth <var class="var">n</var></code><a class="copiable-link" href='#index-unitwidth'> &para;</a></span></dt>
+<dd><p>Quantities in the font description files are in basic units for fonts
+whose type size is <var class="var">n</var>&nbsp;scaled points.
+</p>
+</dd>
+<dt id='index-unscaled_005fcharwidths'><span><code class="code">unscaled_charwidths</code><a class="copiable-link" href='#index-unscaled_005fcharwidths'> &para;</a></span></dt>
+<dd><p>Make the font handling module always return unscaled character widths.
+The <code class="code">grohtml</code> driver uses this directive.
+</p>
+</dd>
+<dt id='index-use_005fcharnames_005fin_005fspecial-1'><span><code class="code">use_charnames_in_special</code><a class="copiable-link" href='#index-use_005fcharnames_005fin_005fspecial-1'> &para;</a></span></dt>
+<dd><p>GNU <code class="code">troff</code> should encode special characters inside device control
+commands; see <a class="ref" href="#Postprocessor-Access">Postprocessor Access</a>. The <code class="code">grohtml</code> driver
+uses this directive.
+</p>
+</dd>
+<dt id='index-vert'><span><code class="code">vert <var class="var">n</var></code><a class="copiable-link" href='#index-vert'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-vertical-motion-quantum"></a>
+<a class="index-entry-id" id="index-motion-quantum_002c-vertical"></a>
+<a class="index-entry-id" id="index-quantum_002c-vertical-motion"></a>
+<a class="index-entry-id" id="index-vertical-resolution"></a>
+<a class="index-entry-id" id="index-resolution_002c-vertical"></a>
+<p>The vertical motion quantum is <var class="var">n</var>&nbsp;basic units. All vertical
+quantities are rounded to multiples of&nbsp;<var class="var">n</var>.
+</p>
+</dd>
+<dt id='index-charset'><span><code class="code">charset</code><a class="copiable-link" href='#index-charset'> &para;</a></span></dt>
+<dd><p>This line and everything following it in the file are ignored. It is
+recognized for compatibility with other <code class="code">troff</code> implementations.
+In GNU <code class="code">troff</code>, character set repertoire is described on a
+per-font basis.
+</p></dd>
+</dl>
+
+<a class="index-entry-id" id="index-spare1"></a>
+<a class="index-entry-id" id="index-spare2"></a>
+<a class="index-entry-id" id="index-biggestfont"></a>
+<p>GNU <code class="code">troff</code> recognizes but ignores the directives <code class="code">spare1</code>,
+<code class="code">spare2</code>, and <code class="code">biggestfont</code>.
+</p>
+<p>The <code class="code">res</code>, <code class="code">unitwidth</code>, <code class="code">fonts</code>, and <code class="code">sizes</code> lines
+are mandatory. Directives not listed above are ignored by GNU
+<code class="code">troff</code> but may be used by postprocessors to obtain further
+information about the device.
+</p>
+
+<hr>
+</div>
+<div class="subsection-level-extent" id="Font-Description-File-Format">
+<div class="nav-panel">
+<p>
+Previous: <a href="#DESC-File-Format" accesskey="p" rel="prev"><samp class="file">DESC</samp> File Format</a>, Up: <a href="#Device-and-Font-Description-Files" accesskey="u" rel="up">Device and Font Description Files</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="subsection" id="Font-Description-File-Format-1">6.2.2 Font Description File Format</h4>
+<a class="index-entry-id" id="index-font-file_002c-format"></a>
+<a class="index-entry-id" id="index-font-description-file_002c-format"></a>
+<a class="index-entry-id" id="index-format-of-font-files"></a>
+<a class="index-entry-id" id="index-format-of-font-description-files"></a>
+
+<p>On typesetting output devices, each font is typically available at
+multiple sizes. While paper measurements in the device description file
+are in absolute units, measurements applicable to fonts must be
+proportional to the type size. <code class="code">groff</code> achieves this using the
+precedent set by <abbr class="acronym">AT&amp;T</abbr> device-independent <code class="code">troff</code>: one
+font size is chosen as a norm, and all others are scaled linearly
+relative to that basis. The &ldquo;unit width&rdquo; is the number of basic units
+per point when the font is rendered at this nominal size.
+</p>
+<p>For instance, <code class="code">groff</code>&rsquo;s <code class="code">lbp</code> device uses a <code class="code">unitwidth</code>
+of&nbsp;800. Its Times roman font &lsquo;<samp class="samp">TR</samp>&rsquo; has a <code class="code">spacewidth</code>
+of&nbsp;833; this is also the width of its comma, period, centered
+period, and mathematical asterisk, while its &lsquo;<samp class="samp">M</samp>&rsquo; is 2,963 basic
+units. Thus, an &lsquo;<samp class="samp">M</samp>&rsquo; on the <code class="code">lbp</code> device is 2,963 basic units
+wide at a notional type size of 800&nbsp;points.<a class="footnote" id="DOCF126" href="#FOOT126"><sup>126</sup></a>
+</p>
+<p>A font description file has two sections. The first is a sequence of
+directives, and is parsed similarly to the <samp class="file">DESC</samp> file described
+above. Except for the directive names that begin the second section,
+their ordering is immaterial. Later directives of the same name
+override earlier ones, spaces and tabs are handled in the same way,
+<a class="index-entry-id" id="index-comments-in-font-description-files"></a>
+<a class="index-entry-id" id="index-font-description-files_002c-comments"></a>
+<a class="index-entry-id" id="index-_0023-1"></a>
+and the same comment syntax is supported. Empty lines are ignored
+throughout.
+</p>
+<dl class="table">
+<dt id='index-name'><span><code class="code">name <var class="var">f</var></code><a class="copiable-link" href='#index-name'> &para;</a></span></dt>
+<dd><p>The name of the font is&nbsp;<var class="var">f</var>. &lsquo;<samp class="samp">DESC</samp>&rsquo; is an invalid font
+name. Simple integers are valid, but their use is
+discouraged.<a class="footnote" id="DOCF127" href="#FOOT127"><sup>127</sup></a>
+</p>
+</dd>
+<dt id='index-spacewidth'><span><code class="code">spacewidth <var class="var">n</var></code><a class="copiable-link" href='#index-spacewidth'> &para;</a></span></dt>
+<dd><p>The width of an unadjusted inter-word space is <var class="var">n</var>&nbsp;basic units.
+</p></dd>
+</dl>
+
+<p>The directives above must appear in the first section; those below are
+optional.
+</p>
+<dl class="table">
+<dt id='index-slant'><span><code class="code">slant <var class="var">n</var></code><a class="copiable-link" href='#index-slant'> &para;</a></span></dt>
+<dd><p>The font&rsquo;s glyphs have a slant of <var class="var">n</var>&nbsp;degrees; a positive
+<var class="var">n</var> slants in the direction of text flow.
+</p>
+</dd>
+<dt id='index-ligatures'><span><code class="code">ligatures <var class="var">lig1</var> <span class="r">&hellip;</span> <var class="var">lign</var> <span class="r">[</span>0<span class="r">]</span></code><a class="copiable-link" href='#index-ligatures'> &para;</a></span></dt>
+<dd><p>Glyphs <var class="var">lig1</var>, &hellip;, <var class="var">lign</var> are ligatures; possible ligatures
+are &lsquo;<samp class="samp">ff</samp>&rsquo;, &lsquo;<samp class="samp">fi</samp>&rsquo;, &lsquo;<samp class="samp">fl</samp>&rsquo;, &lsquo;<samp class="samp">ffi</samp>&rsquo; and &lsquo;<samp class="samp">ffl</samp>&rsquo;. For
+compatibility with other <code class="code">troff</code> implementations, the list of
+ligatures may be terminated with a&nbsp;<code class="code">0</code>. The list of ligatures
+must not extend over more than one line.
+</p>
+</dd>
+<dt id='index-special-fonts-2'><span><code class="code">special</code><a class="copiable-link" href='#index-special-fonts-2'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-special-1"></a>
+<p>The font is <em class="dfn">special</em>: when a glyph is requested that is not present
+in the current font, it is sought in any mounted fonts that bear this
+property.
+</p></dd>
+</dl>
+
+<p>Other directives in this section are ignored by GNU <code class="code">troff</code>, but
+may be used by postprocessors to obtain further information about the
+font.
+</p>
+<p>The second section contains one or two subsections. These can appear in
+either order; the first one encountered commences the second section.
+Each starts with a directive on a line by itself. A <code class="code">charset</code>
+subsection is mandatory unless the associated <samp class="file">DESC</samp> file contains
+the <code class="code">unicode</code> directive. Another subsection, <code class="code">kernpairs</code>,
+is optional.
+</p>
+<a class="index-entry-id" id="index-charset-1"></a>
+<p>The directive <code class="code">charset</code> starts the character set
+subsection.<a class="footnote" id="DOCF128" href="#FOOT128"><sup>128</sup></a> It precedes a series
+of glyph descriptions, one per line. Each such glyph description
+comprises a set of fields separated by spaces or tabs and organized as
+follows.
+</p>
+<blockquote class="quotation">
+<p><var class="var">name</var> <var class="var">metrics</var> <var class="var">type</var> <var class="var">code</var> [<var class="var">entity-name</var>]
+[<code class="code">--</code> <var class="var">comment</var>]
+</p></blockquote>
+
+<a class="index-entry-id" id="index-8_002dbit-input"></a>
+<a class="index-entry-id" id="index-input_002c-8_002dbit"></a>
+<a class="index-entry-id" id="index-accessing-unnamed-glyphs-with-_005cN"></a>
+<a class="index-entry-id" id="index-unnamed-glyphs_002c-accessing-with-_005cN"></a>
+<a class="index-entry-id" id="index-characters_002c-unnamed_002c-accessing-with-_005cN"></a>
+<a class="index-entry-id" id="index-glyphs_002c-unnamed_002c-accessing-with-_005cN"></a>
+<a class="index-entry-id" id="index-_002d_002d_002d"></a>
+<p><var class="var">name</var> identifies the glyph:
+if <var class="var">name</var> is a printable character&nbsp;<var class="var">c</var>, it corresponds to
+the <code class="code">troff</code> ordinary character&nbsp;<var class="var">c</var>. If <var class="var">name</var> is a
+multi-character sequence not beginning with <code class="code">\</code>, it corresponds to
+the GNU <code class="code">troff</code> special character escape sequence
+&lsquo;<samp class="samp">\[<var class="var">name</var>]</samp>&rsquo;. A name consisting of three minus signs,
+&lsquo;<samp class="samp">---</samp>&rsquo;, is special and indicates that the glyph is unnamed: such
+glyphs can be accessed only by the <code class="code">\N</code> escape sequence in
+<code class="code">troff</code>. A special character named &lsquo;<samp class="samp">---</samp>&rsquo; can still be defined
+using <code class="code">char</code> and similar requests. The <var class="var">name</var> &lsquo;<samp class="samp">\-</samp>&rsquo;
+defines the minus sign glyph. Finally, <var class="var">name</var> can be the
+unbreakable one-sixth and one-twelfth space escape sequences, <code class="code">\|</code>
+and <code class="code">\^</code> (&ldquo;thin&rdquo; and &ldquo;hair&rdquo; spaces, respectively), in which
+case only the width metric described below is interpreted; a font can
+thus customize the widths of these spaces.
+</p>
+<p>The form of the <var class="var">metrics</var> field is as follows.
+</p>
+<div class="display">
+<div class="group"><pre class="display-preformatted"><var class="var">width</var>[<code class="code">,</code>[<var class="var">height</var>[<code class="code">,</code>[<var class="var">depth</var>[<code class="code">,</code>[<var class="var">italic-correction</var>
+ [<code class="code">,</code>[<var class="var">left-italic-correction</var>[<code class="code">,</code>[<var class="var">subscript-correction</var>]]]]]]]]]]
+</pre></div></div>
+
+<p>There must not be any spaces, tabs, or newlines between these
+<em class="dfn">subfields</em> (which have been split here into two lines only for
+better legibility). The subfields are in basic units expressed as
+decimal integers. Unspecified subfields default to&nbsp;<code class="code">0</code>.
+Since there is no associated binary format, these values are not
+required to fit into the C language data type &lsquo;<samp class="samp">char</samp>&rsquo; as they are in
+<abbr class="acronym">AT&amp;T</abbr> device-independent <code class="code">troff</code>.
+</p>
+<p>The <var class="var">width</var> subfield gives the width of the glyph. The <var class="var">height</var>
+subfield gives the height of the glyph (upward is positive); if a glyph
+does not extend above the baseline, it should be given a zero height,
+rather than a negative height. The <var class="var">depth</var> subfield gives the depth
+of the glyph, that is, the distance below the baseline to which the
+glyph extends (downward is positive); if a glyph does not extend below
+the baseline, it should be given a zero depth, rather than a negative
+depth. Italic corrections are relevant to glyphs in italic or oblique
+styles. The <var class="var">italic-correction</var> is the amount of space that should
+be added after an oblique glyph to be followed immediately by an upright
+glyph. The <var class="var">left-italic-correction</var> is the amount of space that
+should be added before an oblique glyph to be preceded immediately by an
+upright glyph. The <var class="var">subscript-correction</var> is the amount of space
+that should be added after an oblique glyph to be followed by a
+subscript; it should be less than the italic correction.
+</p>
+<p>For fonts used with typesetting devices, the <var class="var">type</var> field gives a
+featural description of the glyph: it is a bit mask recording whether
+the glyph is an ascender, descender, both, or neither. When a <code class="code">\w</code>
+escape sequence is interpolated, these values are bitwise or-ed
+together for each glyph and stored in the <code class="code">nr</code> register. In font
+descriptions for terminal devices, all glyphs might have a type of zero,
+regardless of their appearance.
+</p>
+<dl class="table">
+<dt><code class="code">0</code></dt>
+<dd><p>means the glyph lies entirely between the baseline and a horizontal line
+at the &ldquo;x-height&rdquo; of the font; typical examples are &lsquo;<samp class="samp">a</samp>&rsquo;,
+&lsquo;<samp class="samp">c</samp>&rsquo;, and &lsquo;<samp class="samp">x</samp>&rsquo;;
+</p>
+</dd>
+<dt><code class="code">1</code></dt>
+<dd><p>means the glyph descends below the baseline, like &lsquo;<samp class="samp">p</samp>&rsquo;;
+</p>
+</dd>
+<dt><code class="code">2</code></dt>
+<dd><p>means the glyph ascends above the font&rsquo;s x-height, like &lsquo;<samp class="samp">A</samp>&rsquo; or
+&lsquo;<samp class="samp">b</samp>&rsquo;; and
+</p>
+</dd>
+<dt><code class="code">3</code></dt>
+<dd><p>means the glyph is both an ascender and a descender&mdash;this is true of
+parentheses in some fonts.
+</p></dd>
+</dl>
+
+<p>The <var class="var">code</var> field gives a numeric identifier that the postprocessor
+uses to render the glyph. The glyph can be specified to <code class="code">troff</code>
+using this code by means of the <code class="code">\N</code> escape sequence. <var class="var">code</var>
+can be any integer.<a class="footnote" id="DOCF129" href="#FOOT129"><sup>129</sup></a>
+</p>
+<p>The <var class="var">entity-name</var> field defines an identifier for the glyph that the
+postprocessor uses to print the GNU <code class="code">troff</code> glyph <var class="var">name</var>. This
+field is optional; it was introduced so that the <code class="code">grohtml</code> output
+driver could encode its character set. For example, the glyph
+&lsquo;<samp class="samp">\[Po]</samp>&rsquo; is represented by &lsquo;<samp class="samp">&amp;pound;</samp>&rsquo; in <abbr class="acronym">HTML</abbr> 4.0.
+For efficiency, these data are now compiled directly into
+<code class="code">grohtml</code>. <code class="code">grops</code> uses the field to build sub-encoding
+arrays for PostScript fonts containing more than 256 glyphs. Anything
+on the line after the <var class="var">entity-name</var> field or &lsquo;<samp class="samp">--</samp>&rsquo; is ignored.
+</p>
+<p>A line in the <code class="code">charset</code> section can also have the form
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"><var class="var">name</var> &quot;
+</pre></div></div>
+
+<p>identifying <var class="var">name</var> as another name for the glyph mentioned in the
+preceding line. Such aliases can be chained.
+</p>
+<a class="index-entry-id" id="index-kernpairs"></a>
+<p>The directive <code class="code">kernpairs</code> starts a list of kerning adjustments to
+be made to adjacent glyph pairs from this font. It contains a sequence
+of lines formatted as follows.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"><var class="var">g1</var> <var class="var">g2</var> <var class="var">n</var>
+</pre></div></div>
+
+<p>The foregoing means that when glyph <var class="var">g1</var> is typeset immediately
+before <var class="var">g2</var>, the space between them should be increased
+by&nbsp;<var class="var">n</var>. Most kerning pairs should have a negative value
+for&nbsp;<var class="var">n</var>.
+</p>
+
+
+
+
+<hr>
+</div>
+</div>
+</div>
+<div class="appendix-level-extent" id="Copying-This-Manual">
+<div class="nav-panel">
+<p>
+Next: <a href="#Request-Index" accesskey="n" rel="next">Request Index</a>, Previous: <a href="#Font-Description-File-Format" accesskey="p" rel="prev">Font Description File Format</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h2 class="appendix" id="Copying-This-Manual-1">Appendix A Copying This Manual</h2>
+
+<div class="center">Version 1.3, 3 November 2008
+</div>
+
+<div class="display">
+<pre class="display-preformatted">Copyright &copy; 2000-2018 Free Software Foundation, Inc.
+<a class="uref" href="http://fsf.org/">http://fsf.org/</a>
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+</pre></div>
+
+<ol class="enumerate" start="0">
+<li> PREAMBLE
+
+<p>The purpose of this License is to make a manual, textbook, or other
+functional and useful document <em class="dfn">free</em> 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.
+</p>
+<p>This License is a kind of &ldquo;copyleft&rdquo;, 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.
+</p>
+<p>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.
+</p>
+</li><li> APPLICABILITY AND DEFINITIONS
+
+<p>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 &ldquo;Document&rdquo;, below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as &ldquo;you&rdquo;. You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+</p>
+<p>A &ldquo;Modified Version&rdquo; 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.
+</p>
+<p>A &ldquo;Secondary Section&rdquo; 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&rsquo;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.
+</p>
+<p>The &ldquo;Invariant Sections&rdquo; 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.
+</p>
+<p>The &ldquo;Cover Texts&rdquo; 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.
+</p>
+<p>A &ldquo;Transparent&rdquo; 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 &ldquo;Transparent&rdquo; is called &ldquo;Opaque&rdquo;.
+</p>
+<p>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.
+</p>
+<p>The &ldquo;Title Page&rdquo; 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, &ldquo;Title Page&rdquo; means
+the text near the most prominent appearance of the work&rsquo;s title,
+preceding the beginning of the body of the text.
+</p>
+<p>The &ldquo;publisher&rdquo; means any person or entity that distributes copies
+of the Document to the public.
+</p>
+<p>A section &ldquo;Entitled XYZ&rdquo; 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 &ldquo;Acknowledgements&rdquo;,
+&ldquo;Dedications&rdquo;, &ldquo;Endorsements&rdquo;, or &ldquo;History&rdquo;.) To &ldquo;Preserve the Title&rdquo;
+of such a section when you modify the Document means that it remains a
+section &ldquo;Entitled XYZ&rdquo; according to this definition.
+</p>
+<p>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.
+</p>
+</li><li> VERBATIM COPYING
+
+<p>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.
+</p>
+<p>You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+</p>
+</li><li> COPYING IN QUANTITY
+
+<p>If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document&rsquo;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.
+</p>
+<p>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.
+</p>
+<p>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.
+</p>
+<p>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.
+</p>
+</li><li> MODIFICATIONS
+
+<p>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:
+</p>
+<ol class="enumerate" type="A" start="1">
+<li> 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.
+
+</li><li> 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.
+
+</li><li> State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+</li><li> Preserve all the copyright notices of the Document.
+
+</li><li> Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+</li><li> 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.
+
+</li><li> Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document&rsquo;s license notice.
+
+</li><li> Include an unaltered copy of this License.
+
+</li><li> Preserve the section Entitled &ldquo;History&rdquo;, 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 &ldquo;History&rdquo; 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.
+
+</li><li> 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 &ldquo;History&rdquo; 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.
+
+</li><li> For any section Entitled &ldquo;Acknowledgements&rdquo; or &ldquo;Dedications&rdquo;, 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.
+
+</li><li> 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.
+
+</li><li> Delete any section Entitled &ldquo;Endorsements&rdquo;. Such a section
+may not be included in the Modified Version.
+
+</li><li> Do not retitle any existing section to be Entitled &ldquo;Endorsements&rdquo; or
+to conflict in title with any Invariant Section.
+
+</li><li> Preserve any Warranty Disclaimers.
+</li></ol>
+
+<p>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&rsquo;s license notice.
+These titles must be distinct from any other section titles.
+</p>
+<p>You may add a section Entitled &ldquo;Endorsements&rdquo;, provided it contains
+nothing but endorsements of your Modified Version by various
+parties&mdash;for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+</p>
+<p>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.
+</p>
+<p>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.
+</p>
+</li><li> COMBINING DOCUMENTS
+
+<p>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.
+</p>
+<p>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.
+</p>
+<p>In the combination, you must combine any sections Entitled &ldquo;History&rdquo;
+in the various original documents, forming one section Entitled
+&ldquo;History&rdquo;; likewise combine any sections Entitled &ldquo;Acknowledgements&rdquo;,
+and any sections Entitled &ldquo;Dedications&rdquo;. You must delete all
+sections Entitled &ldquo;Endorsements.&rdquo;
+</p>
+</li><li> COLLECTIONS OF DOCUMENTS
+
+<p>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.
+</p>
+<p>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.
+</p>
+</li><li> AGGREGATION WITH INDEPENDENT WORKS
+
+<p>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 &ldquo;aggregate&rdquo; if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation&rsquo;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.
+</p>
+<p>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&rsquo;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.
+</p>
+</li><li> TRANSLATION
+
+<p>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.
+</p>
+<p>If a section in the Document is Entitled &ldquo;Acknowledgements&rdquo;,
+&ldquo;Dedications&rdquo;, or &ldquo;History&rdquo;, the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+</p>
+</li><li> TERMINATION
+
+<p>You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+</p>
+<p>However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+</p>
+<p>Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+</p>
+<p>Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+</p>
+</li><li> FUTURE REVISIONS OF THIS LICENSE
+
+<p>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
+<a class="uref" href="http://www.gnu.org/copyleft/">http://www.gnu.org/copyleft/</a>.
+</p>
+<p>Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License &ldquo;or any later version&rdquo; 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. If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy&rsquo;s public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+</p>
+</li><li> RELICENSING
+
+<p>&ldquo;Massive Multiauthor Collaboration Site&rdquo; (or &ldquo;MMC Site&rdquo;) means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works. A
+public wiki that anybody can edit is an example of such a server. A
+&ldquo;Massive Multiauthor Collaboration&rdquo; (or &ldquo;MMC&rdquo;) contained in the
+site means any set of copyrightable works thus published on the MMC
+site.
+</p>
+<p>&ldquo;CC-BY-SA&rdquo; means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+</p>
+<p>&ldquo;Incorporate&rdquo; means to publish or republish a Document, in whole or
+in part, as part of another Document.
+</p>
+<p>An MMC is &ldquo;eligible for relicensing&rdquo; if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole
+or in part into the MMC, (1) had no cover texts or invariant sections,
+and (2) were thus incorporated prior to November 1, 2008.
+</p>
+<p>The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+</p>
+</li></ol>
+
+<h3 class="heading" id="ADDENDUM_003a-How-to-use-this-License-for-your-documents">ADDENDUM: How to use this License for your documents</h3>
+
+<p>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:
+</p>
+<div class="example smallexample">
+<div class="group"><pre class="example-preformatted"> Copyright (C) <var class="var">year</var> <var class="var">your name</var>.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ 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''.
+</pre></div></div>
+
+<p>If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the &ldquo;with&hellip;Texts.&rdquo; line with this:
+</p>
+<div class="example smallexample">
+<div class="group"><pre class="example-preformatted"> with the Invariant Sections being <var class="var">list their titles</var>, with
+ the Front-Cover Texts being <var class="var">list</var>, and with the Back-Cover Texts
+ being <var class="var">list</var>.
+</pre></div></div>
+
+<p>If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+</p>
+<p>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.
+</p>
+
+
+
+
+
+<hr>
+</div>
+<div class="appendix-level-extent" id="Request-Index">
+<div class="nav-panel">
+<p>
+Next: <a href="#Escape-Sequence-Index" accesskey="n" rel="next">Escape Sequence Index</a>, Previous: <a href="#Copying-This-Manual" accesskey="p" rel="prev">Copying This Manual</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h2 class="appendix" id="Request-Index-1">Appendix B Request Index</h2>
+
+<p>Request names appear without a leading control character; the defaults
+are <code class="code">.</code> for the regular control character and <code class="code">'</code> for the
+no-break control character.
+</p>
+<div class="printindex rq-printindex">
+<table class="rq-letters-header-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Request-Index_rq_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-W"><b>W</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="rq-entries-printindex" border="0">
+<tr><td></td><th class="entries-header-printindex">Index Entry</th><td>&nbsp;</td><th class="sections-header-printindex"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-A">A</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ab"><code>ab</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ad"><code>ad</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-af"><code>af</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Assigning-Register-Formats">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-aln"><code>aln</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Setting-Registers">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-als"><code>als</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-am"><code>am</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Writing-Macros">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-am1"><code>am1</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Writing-Macros">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ami"><code>ami</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Writing-Macros">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ami1"><code>ami1</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Writing-Macros">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-as"><code>as</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-as1"><code>as1</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-asciify"><code>asciify</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-B">B</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-backtrace"><code>backtrace</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-bd"><code>bd</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-blm"><code>blm</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Blank-Line-Traps">Blank Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-box"><code>box</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-boxa"><code>boxa</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-bp"><code>bp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-br"><code>br</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-break-2"><code>break</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#while">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-brp"><code>brp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-c2"><code>c2</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Control-Characters">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-cc"><code>cc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Control-Characters">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ce"><code>ce</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-cf"><code>cf</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-cflags"><code>cflags</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ch"><code>ch</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-char"><code>char</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-chop"><code>chop</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-class"><code>class</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Classes">Character Classes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-close"><code>close</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-color"><code>color</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-composite"><code>composite</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-continue"><code>continue</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#while">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-cp"><code>cp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Compatibility-Mode">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-cs"><code>cs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-cu"><code>cu</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-D">D</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-da"><code>da</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-de"><code>de</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Writing-Macros">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-de1"><code>de1</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Writing-Macros">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-defcolor"><code>defcolor</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dei"><code>dei</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Writing-Macros">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dei1"><code>dei1</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Writing-Macros">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-device"><code>device</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Postprocessor-Access">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-devicem"><code>devicem</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Postprocessor-Access">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-di"><code>di</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-do"><code>do</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Compatibility-Mode">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ds"><code>ds</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ds-1"><code>ds</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ds1"><code>ds1</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dt"><code>dt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversion-Traps">Diversion Traps</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-E">E</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ec"><code>ec</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Escape-Sequences">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ecr"><code>ecr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Escape-Sequences">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ecs"><code>ecs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Escape-Sequences">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-el"><code>el</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#if_002delse">if-else</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-em"><code>em</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#End_002dof_002dinput-Traps">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-eo"><code>eo</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Escape-Sequences">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ev"><code>ev</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-evc"><code>evc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ex"><code>ex</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-F">F</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fam"><code>fam</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fc"><code>fc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Fields">Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fchar"><code>fchar</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fcolor"><code>fcolor</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fi"><code>fi</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fl"><code>fl</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fp"><code>fp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Positions">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fschar"><code>fschar</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fspecial"><code>fspecial</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Special-Fonts">Special Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ft"><code>ft</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ftr"><code>ftr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fzoom"><code>fzoom</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-G">G</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-gcolor"><code>gcolor</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-H">H</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hc"><code>hc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hcode"><code>hcode</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hla"><code>hla</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hlm"><code>hlm</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hpf"><code>hpf</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hpfa"><code>hpfa</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hpfcode"><code>hpfcode</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hw"><code>hw</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hy"><code>hy</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hym"><code>hym</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hys"><code>hys</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-I">I</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ie"><code>ie</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#if_002delse">if-else</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-if"><code>if</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#if_002dthen">if-then</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ig"><code>ig</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Comments">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-in-1"><code>in</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-it"><code>it</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Line-Traps">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-itc"><code>itc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Line-Traps">Input Line Traps</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-K">K</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-kern"><code>kern</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Ligatures-and-Kerning">Ligatures and Kerning</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-L">L</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-lc"><code>lc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Leaders">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-length"><code>length</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-lf"><code>lf</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-lg"><code>lg</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Ligatures-and-Kerning">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-linetabs"><code>linetabs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ll-1"><code>ll</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ls"><code>ls</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Spacing">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-lsm"><code>lsm</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Leading-Space-Traps">Leading Space Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-lt"><code>lt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-M">M</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mc"><code>mc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mk"><code>mk</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mso"><code>mso</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-msoquiet"><code>msoquiet</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-N">N</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-na"><code>na</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ne"><code>ne</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nf"><code>nf</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nh"><code>nh</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nm"><code>nm</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nn"><code>nn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nop"><code>nop</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#if_002dthen">if-then</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nr"><code>nr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nr-1"><code>nr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Setting-Registers">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nr-2"><code>nr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Setting-Registers">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nr-3"><code>nr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Auto_002dincrement">Auto-increment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nroff"><code>nroff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#troff-and-nroff-Modes"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ns"><code>ns</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Spacing">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nx"><code>nx</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-O">O</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-open"><code>open</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-opena"><code>opena</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-os"><code>os</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output"><code>output</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-P">P</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pc"><code>pc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pev"><code>pev</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pi"><code>pi</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pl"><code>pl</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pm"><code>pm</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pn"><code>pn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pnr"><code>pnr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-po-1"><code>po</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ps"><code>ps</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Type-Size">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-psbb"><code>psbb</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pso"><code>pso</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ptr"><code>ptr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pvs"><code>pvs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Vertical-Spacing">Changing the Vertical Spacing</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-rchar"><code>rchar</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-rd"><code>rd</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-return"><code>return</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Writing-Macros">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-rfschar"><code>rfschar</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-rj"><code>rj</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-rm"><code>rm</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-rn"><code>rn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-rnn"><code>rnn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Setting-Registers">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-rr"><code>rr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Setting-Registers">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-rs"><code>rs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Spacing">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-rt"><code>rt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-S">S</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-schar"><code>schar</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-shc"><code>shc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-shift"><code>shift</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Parameters">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sizes-1"><code>sizes</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Type-Size">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-so"><code>so</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-soquiet"><code>soquiet</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sp"><code>sp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Spacing">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-special-2"><code>special</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Special-Fonts">Special Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-spreadwarn"><code>spreadwarn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ss"><code>ss</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-stringdown"><code>stringdown</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-stringup"><code>stringup</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sty"><code>sty</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-substring"><code>substring</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sv"><code>sv</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sy"><code>sy</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-T">T</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ta"><code>ta</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tag"><code>tag</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Postprocessor-Access">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-taga"><code>taga</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Postprocessor-Access">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tc"><code>tc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ti"><code>ti</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tkf"><code>tkf</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Ligatures-and-Kerning">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tl"><code>tl</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tm"><code>tm</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tm1"><code>tm1</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tmc"><code>tmc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tr"><code>tr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-trf"><code>trf</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-trin"><code>trin</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-trnt"><code>trnt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-troff"><code>troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#troff-and-nroff-Modes"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-U">U</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-uf"><code>uf</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ul"><code>ul</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unformat"><code>unformat</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-V">V</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vpt"><code>vpt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Vertical-Position-Traps">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vs"><code>vs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Vertical-Spacing">Changing the Vertical Spacing</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-W">W</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-warn"><code>warn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-warnscale"><code>warnscale</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-wh"><code>wh</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-while-1"><code>while</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#while">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-write"><code>write</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-writec"><code>writec</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-writem"><code>writem</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table class="rq-letters-footer-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Request-Index_rq_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-W"><b>W</b></a>
+ &nbsp;
+</td></tr></table>
+</div>
+
+
+
+
+<hr>
+</div>
+<div class="appendix-level-extent" id="Escape-Sequence-Index">
+<div class="nav-panel">
+<p>
+Next: <a href="#Operator-Index" accesskey="n" rel="next">Operator Index</a>, Previous: <a href="#Request-Index" accesskey="p" rel="prev">Request Index</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h2 class="appendix" id="Escape-Sequence-Index-1">Appendix C Escape Sequence Index</h2>
+
+<p>The escape character, <code class="code">\</code> by default, is always followed by at
+least one more input character, making an escape <em class="emph">sequence</em>. Any
+input token <code class="code">\<var class="var">X</var></code> with <var class="var">X</var> not in the list below emits a
+warning and interpolates glyph <var class="var">X</var>. Note the entries for <code class="code">\.</code>,
+which may be obscured by the leader dots, and for <code class="code">\<kbd class="key">RET</kbd></code> and
+<code class="code">\<kbd class="key">SP</kbd></code>, which are sorted alphabetically, not by code point
+order.
+</p>
+<div class="printindex es-printindex">
+<table class="es-entries-printindex" border="0">
+<tr><td></td><th class="entries-header-printindex">Index Entry</th><td>&nbsp;</td><th class="sections-header-printindex"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Escape-Sequence-Index_es_symbol-1">\</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c"><code>\</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Escape-Sequences">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c-1"><code>\</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0021"><code>\!</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0022"><code>\&quot;</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Comments">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0023"><code>\#</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Comments">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0024"><code>\$</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Parameters">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0024_002a"><code>\$*</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Parameters">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_00240"><code>\$0</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Parameters">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0024_0040"><code>\$@</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Parameters">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0024_005e"><code>\$^</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Parameters">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0025"><code>\%</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0026"><code>\&amp;</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Dummy-Characters">Dummy Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0027"><code>\<code class="code">'</code></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0028"><code>\(</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0029"><code>\)</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Dummy-Characters">Dummy Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_002a"><code>\*</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_002c"><code>\,</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Italic-Corrections">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_002d"><code>\-</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_002e"><code>\.</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Copy-Mode">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_002f"><code>\/</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Italic-Corrections">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c0"><code>\0</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_003a"><code>\:</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_003f"><code>\?</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cA"><code>\A</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Identifiers">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005ca"><code>\a</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Leaders">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cB"><code>\B</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cb"><code>\b</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cc"><code>\c</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cC"><code>\C</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cd"><code>\d</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cD"><code>\D</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005ce"><code>\e</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Escape-Sequences">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cE"><code>\E</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Copy-Mode">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cf"><code>\f</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cF"><code>\F</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cg"><code>\g</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Assigning-Register-Formats">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cH"><code>\H</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005ch"><code>\h</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005ck"><code>\k</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cl"><code>\l</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cL"><code>\L</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cm"><code>\m</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cM"><code>\M</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cn"><code>\n</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Interpolating-Registers">Interpolating Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cn-1"><code>\n</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Auto_002dincrement">Auto-increment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cN"><code>\N</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cnewline"><code>\<i class="slanted">newline</i></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005co"><code>\o</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cO"><code>\O</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Suppressing-Output">Suppressing Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cp"><code>\p</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cR"><code>\R</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Setting-Registers">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cR-1"><code>\R</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Setting-Registers">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cr"><code>\r</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cRET"><code>\<kbd class="key">RET</kbd></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cS"><code>\S</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cs"><code>\s</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Type-Size">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cSP"><code>\<kbd class="key">SP</kbd></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cspace"><code>\<i class="slanted">space</i></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005ct"><code>\t</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cu"><code>\u</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cv"><code>\v</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cV"><code>\V</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cw"><code>\w</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cx"><code>\x</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Spacing">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cX"><code>\X</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Postprocessor-Access">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cY"><code>\Y</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Postprocessor-Access">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cz"><code>\z</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cZ"><code>\Z</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_005b"><code>\[</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_005c"><code>\\</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Copy-Mode">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_005e"><code>\^</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_005f"><code>\_</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0060"><code>\<code class="code">`</code></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_007b"><code>\{</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Conditional-Blocks">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_007b-1"><code>\{</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Conditional-Blocks">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_007c"><code>\|</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_007d"><code>\}</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Conditional-Blocks">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_007e"><code>\~</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+</div>
+
+
+
+
+<hr>
+</div>
+<div class="appendix-level-extent" id="Operator-Index">
+<div class="nav-panel">
+<p>
+Next: <a href="#Register-Index" accesskey="n" rel="next">Register Index</a>, Previous: <a href="#Escape-Sequence-Index" accesskey="p" rel="prev">Escape Sequence Index</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h2 class="appendix" id="Operator-Index-1">Appendix D Operator Index</h2>
+
+<div class="printindex op-printindex">
+<table class="op-letters-header-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Operator-Index_op_symbol-1"><b>!</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-2"><b>%</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-3"><b>&amp;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-4"><b>(</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-5"><b>)</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-6"><b>*</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-7"><b>+</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-8"><b>-</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-9"><b>/</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-10"><b>:</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-11"><b>;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-12"><b>&lt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-13"><b>=</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-14"><b>&gt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-15"><b>|</b></a>
+</td></tr></table>
+<table class="op-entries-printindex" border="0">
+<tr><td></td><th class="entries-header-printindex">Index Entry</th><td>&nbsp;</td><th class="sections-header-printindex"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-1">!</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0021"><code>!</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-2">%</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0025"><code>%</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-3">&amp;</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0026"><code>&amp;</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-4">(</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0028"><code>(</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-5">)</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0029"><code>)</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-6">*</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002a"><code>*</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-7">+</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002b"><code>+</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002b-1"><code>+</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002b-_0028unary_0029"><code>+ <span class="r">(unary)</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-8">-</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002d"><code>-</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002d-1"><code>-</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002d-_0028unary_0029"><code>- <span class="r">(unary)</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-9">/</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002f"><code>/</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-10">:</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_003a"><code>:</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-11">;</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_003b"><code>;</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-12">&lt;</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_003c"><code>&lt;</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_003c_003d"><code>&lt;=</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_003c_003f"><code>&lt;?</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-13">=</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_003d"><code>=</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_003d_003d"><code>==</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-14">&gt;</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_003e"><code>&gt;</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_003e_003d"><code>&gt;=</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_003e_003f"><code>&gt;?</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-15">|</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_007c"><code>|</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table class="op-letters-footer-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Operator-Index_op_symbol-1"><b>!</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-2"><b>%</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-3"><b>&amp;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-4"><b>(</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-5"><b>)</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-6"><b>*</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-7"><b>+</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-8"><b>-</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-9"><b>/</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-10"><b>:</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-11"><b>;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-12"><b>&lt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-13"><b>=</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-14"><b>&gt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-15"><b>|</b></a>
+</td></tr></table>
+</div>
+
+
+
+
+<hr>
+</div>
+<div class="appendix-level-extent" id="Register-Index">
+<div class="nav-panel">
+<p>
+Next: <a href="#Macro-Index" accesskey="n" rel="next">Macro Index</a>, Previous: <a href="#Operator-Index" accesskey="p" rel="prev">Operator Index</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h2 class="appendix" id="Register-Index-1">Appendix E Register Index</h2>
+
+<p>The macro package or program a specific register belongs to is appended
+in brackets.
+</p>
+<p>A register name&nbsp;<code class="code">x</code> consisting of exactly one character can be
+accessed as &lsquo;<samp class="samp">\nx</samp>&rsquo;. A register name <code class="code">xx</code> consisting of exactly
+two characters can be accessed as &lsquo;<samp class="samp">\n(xx</samp>&rsquo;. Register names
+<code class="code">xxx</code> of any length can be accessed as &lsquo;<samp class="samp">\n[xxx]</samp>&rsquo;.
+</p>
+<div class="printindex vr-printindex">
+<table class="vr-letters-header-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Register-Index_vr_symbol-1"><b>$</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_symbol-2"><b>%</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_symbol-3"><b>.</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-Y"><b>Y</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="vr-entries-printindex" border="0">
+<tr><td></td><th class="entries-header-printindex">Index Entry</th><td>&nbsp;</td><th class="sections-header-printindex"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_symbol-1">$</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0024_0024"><code>$$</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_symbol-2">%</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0025-1"><code>%</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0025-2"><code>%</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_symbol-3">.</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002e_0024"><code>.$</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Parameters">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eA"><code>.A</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ea"><code>.a</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Spacing">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eb"><code>.b</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ebr-1"><code>.br</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Control-Characters">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ec"><code>.c</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eC"><code>.C</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Compatibility-Mode">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ecdp"><code>.cdp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ece-1"><code>.ce</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002echt"><code>.cht</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ecolor-1"><code>.color</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ecp-1"><code>.cp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Compatibility-Mode">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ecsk"><code>.csk</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ed"><code>.d</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eev-1"><code>.ev</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eF"><code>.F</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ef"><code>.f</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Positions">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002efam-1"><code>.fam</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002efn"><code>.fn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002efp-1"><code>.fp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Positions">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eg"><code>.g</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eH"><code>.H</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Motion-Quanta">Motion Quanta</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eh"><code>.h</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eheight"><code>.height</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ehla-1"><code>.hla</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ehlc"><code>.hlc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ehlm-1"><code>.hlm</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ehy-1"><code>.hy</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ehym-1"><code>.hym</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ehys-1"><code>.hys</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ei"><code>.i</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ein-3"><code>.in</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eint"><code>.int</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ej"><code>.j</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ek"><code>.k</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ekern-1"><code>.kern</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Ligatures-and-Kerning">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eL"><code>.L</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Spacing">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002el"><code>.l</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002elg-1"><code>.lg</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Ligatures-and-Kerning">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002elinetabs-1"><code>.linetabs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ell-3"><code>.ll</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002elt-3"><code>.lt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002em"><code>.m</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eM"><code>.M</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002en"><code>.n</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ene-1"><code>.ne</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002enm-1"><code>.nm</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002enn-1"><code>.nn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ens-1"><code>.ns</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Spacing">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eo"><code>.o</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eO"><code>.O</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Suppressing-Output">Suppressing Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eP"><code>.P</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ep"><code>.p</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002epe"><code>.pe</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002epn-3"><code>.pn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eps-3"><code>.ps</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002epsr"><code>.psr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002epvs-3"><code>.pvs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Vertical-Spacing">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eR-2"><code>.R</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002erj-1"><code>.rj</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002es"><code>.s</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Type-Size">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eslant"><code>.slant</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002esr"><code>.sr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ess-1"><code>.ss</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002esss"><code>.sss</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002esty-1"><code>.sty</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eT-2"><code>.T</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002et"><code>.t</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002etabs"><code>.tabs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002etrunc"><code>.trunc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eU"><code>.U</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eu"><code>.u</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eV"><code>.V</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Motion-Quanta">Motion Quanta</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ev"><code>.v</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Vertical-Spacing">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002evpt-1"><code>.vpt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Vertical-Position-Traps">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ew"><code>.w</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ewarn-1"><code>.warn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ex"><code>.x</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ey"><code>.y</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eY"><code>.Y</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ez"><code>.z</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002ezoom"><code>.zoom</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-c_002e"><code>c.</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ct"><code>ct</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-D">D</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-DD-_005bms_005d"><code>DD <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-DI-_005bms_005d"><code>DI <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dl"><code>dl</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dn"><code>dn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dw"><code>dw</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dy"><code>dy</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-F">F</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-FF-_005bms_005d"><code>FF <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-FI-_005bms_005d"><code>FI <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-FM-_005bms_005d"><code>FM <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-FPD-_005bms_005d"><code>FPD <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-FPS-_005bms_005d"><code>FPS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-FVS-_005bms_005d"><code>FVS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-G">G</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-GROWPS-_005bms_005d"><code>GROWPS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-GS-_005bms_005d"><code>GS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Differences-from-AT_0026T-ms">Differences from AT&amp;T ms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-H">H</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-HM-_005bms_005d"><code>HM <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-HORPHANS-_005bms_005d"><code>HORPHANS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hours"><code>hours</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hp"><code>hp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-HY-_005bms_005d"><code>HY <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-L">L</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-LL-_005bms_005d"><code>LL <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-llx"><code>llx</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-lly"><code>lly</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ln"><code>ln</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-lsn"><code>lsn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Leading-Space-Traps">Leading Space Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-lss"><code>lss</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Leading-Space-Traps">Leading Space Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-LT-_005bms_005d"><code>LT <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-M">M</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-MINGW-_005bms_005d"><code>MINGW <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-minutes"><code>minutes</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mo"><code>mo</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-N">N</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nl"><code>nl</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-O">O</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-opmaxx"><code>opmaxx</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Suppressing-Output">Suppressing Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-opmaxy"><code>opmaxy</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Suppressing-Output">Suppressing Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-opminx"><code>opminx</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Suppressing-Output">Suppressing Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-opminy"><code>opminy</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Suppressing-Output">Suppressing Output</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-P">P</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-PD-_005bms_005d"><code>PD <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-PI-_005bms_005d"><code>PI <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-PO-_005bms_005d"><code>PO <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-PORPHANS-_005bms_005d"><code>PORPHANS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-PS-_005bms_005d-1"><code>PS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-PSINCR-_005bms_005d"><code>PSINCR <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-Q">Q</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-QI-_005bms_005d"><code>QI <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-rsb"><code>rsb</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-rst"><code>rst</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-S">S</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sb"><code>sb</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-seconds"><code>seconds</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-skw"><code>skw</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-slimit"><code>slimit</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ssc"><code>ssc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-st"><code>st</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-systat"><code>systat</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-T">T</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-TC_002dMARGIN-_005bms_005d"><code>TC-MARGIN <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-U">U</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-urx"><code>urx</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ury"><code>ury</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-V">V</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-VS-_005bms_005d"><code>VS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-Y">Y</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-year"><code>year</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-yr"><code>yr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table class="vr-letters-footer-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Register-Index_vr_symbol-1"><b>$</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_symbol-2"><b>%</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_symbol-3"><b>.</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-Y"><b>Y</b></a>
+ &nbsp;
+</td></tr></table>
+</div>
+
+
+
+
+<hr>
+</div>
+<div class="appendix-level-extent" id="Macro-Index">
+<div class="nav-panel">
+<p>
+Next: <a href="#String-Index" accesskey="n" rel="next">String Index</a>, Previous: <a href="#Register-Index" accesskey="p" rel="prev">Register Index</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h2 class="appendix" id="Macro-Index-1">Appendix F Macro Index</h2>
+
+<p>The macro package a specific macro belongs to is appended in brackets.
+They appear without the leading control character (normally &lsquo;<samp class="samp">.</samp>&rsquo;).
+</p>
+<div class="printindex ma-printindex">
+<table class="ma-letters-header-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Macro-Index_ma_symbol-1"><b>1</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_symbol-2"><b>2</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_symbol-3"><b>[</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_symbol-4"><b>]</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-X"><b>X</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="ma-entries-printindex" border="0">
+<tr><td></td><th class="entries-header-printindex">Index Entry</th><td>&nbsp;</td><th class="sections-header-printindex"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_symbol-1">1</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-1C-_005bms_005d"><code>1C <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Multiple-Columns">ms Multiple Columns</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_symbol-2">2</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-2C-_005bms_005d"><code>2C <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Multiple-Columns">ms Multiple Columns</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_symbol-3">[</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005b-_005bms_005d"><code>[ <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_symbol-4">]</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005d-_005bms_005d"><code>] <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-A">A</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-AB-_005bms_005d"><code>AB <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Description-Macros">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-AE-_005bms_005d"><code>AE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Description-Macros">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-AI-_005bms_005d"><code>AI <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Description-Macros">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-AM-_005bms_005d"><code>AM <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-AU-_005bms_005d"><code>AU <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Description-Macros">ms Document Description Macros</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-B">B</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-B-_005bms_005d"><code>B <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Typeface-and-decoration">Typeface and decoration</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-B1-_005bms_005d"><code>B1 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-keeps-and-displays">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-B2-_005bms_005d"><code>B2 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-keeps-and-displays">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-BD-_005bms_005d"><code>BD <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-keeps-and-displays">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-BI-_005bms_005d"><code>BI <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Typeface-and-decoration">Typeface and decoration</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-BT-_005bman_005d"><code>BT <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-BX-_005bms_005d"><code>BX <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Typeface-and-decoration">Typeface and decoration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-CD-_005bms_005d"><code>CD <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-keeps-and-displays">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-CT-_005bman_005d"><code>CT <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-CW-_005bman_005d"><code>CW <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-CW-_005bms_005d"><code>CW <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Typeface-and-decoration">Typeface and decoration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-D">D</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-DA-_005bms_005d"><code>DA <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Description-Macros">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-De-_005bman_005d"><code>De <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-DE-_005bms_005d"><code>DE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-keeps-and-displays">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-Ds-_005bman_005d"><code>Ds <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-DS-_005bms_005d"><code>DS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-keeps-and-displays">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-DS-_005bms_005d-1"><code>DS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-keeps-and-displays">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-DS-_005bms_005d-2"><code>DS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-keeps-and-displays">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-DS-_005bms_005d-3"><code>DS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-keeps-and-displays">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-DS-_005bms_005d-4"><code>DS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-keeps-and-displays">ms keeps and displays</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-E">E</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-EE-_005bman_005d"><code>EE <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-EF-_005bms_005d"><code>EF <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Headers-and-Footers">ms Headers and Footers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-EH-_005bms_005d"><code>EH <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Headers-and-Footers">ms Headers and Footers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-EN-_005bms_005d"><code>EN <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-EQ-_005bms_005d"><code>EQ <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-EX-_005bman_005d"><code>EX <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-F">F</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-FE-_005bms_005d"><code>FE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Footnotes">ms Footnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-FS-_005bms_005d"><code>FS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Footnotes">ms Footnotes</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-G">G</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-G-_005bman_005d"><code>G <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-GL-_005bman_005d"><code>GL <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-H">H</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-HB-_005bman_005d"><code>HB <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-I">I</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-I-_005bms_005d"><code>I <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Typeface-and-decoration">Typeface and decoration</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ID-_005bms_005d"><code>ID <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-keeps-and-displays">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-IP-_005bms_005d"><code>IP <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Paragraphs-in-ms">Paragraphs in ms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-K">K</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-KE-_005bms_005d"><code>KE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-keeps-and-displays">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-KF-_005bms_005d"><code>KF <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-keeps-and-displays">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-KS-_005bms_005d"><code>KS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-keeps-and-displays">ms keeps and displays</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-L">L</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-LD-_005bms_005d"><code>LD <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-keeps-and-displays">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-LG-_005bms_005d"><code>LG <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Typeface-and-decoration">Typeface and decoration</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-LP-_005bms_005d"><code>LP <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Paragraphs-in-ms">Paragraphs in ms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-M">M</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-MC-_005bms_005d"><code>MC <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Multiple-Columns">ms Multiple Columns</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-MS-_005bman_005d"><code>MS <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-N">N</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ND-_005bms_005d"><code>ND <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Description-Macros">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-NE-_005bman_005d"><code>NE <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-NH-_005bms_005d"><code>NH <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Headings-in-ms">Headings in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-NL-_005bms_005d"><code>NL <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Typeface-and-decoration">Typeface and decoration</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-NT-_005bman_005d"><code>NT <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-O">O</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-OF-_005bms_005d"><code>OF <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Headers-and-Footers">ms Headers and Footers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-OH-_005bms_005d"><code>OH <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Headers-and-Footers">ms Headers and Footers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-P">P</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-P1-_005bms_005d"><code>P1 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Headers-and-Footers">ms Headers and Footers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-PE-_005bms_005d"><code>PE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-PF-_005bms_005d"><code>PF <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-PN-_005bman_005d"><code>PN <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-Pn-_005bman_005d"><code>Pn <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-PP-_005bms_005d"><code>PP <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Paragraphs-in-ms">Paragraphs in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-PS-_005bms_005d"><code>PS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-PT-_005bman_005d"><code>PT <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-PX-_005bms_005d"><code>PX <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-TOC">ms TOC</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-Q">Q</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-QE-_005bms_005d"><code>QE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Paragraphs-in-ms">Paragraphs in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-QP-_005bms_005d"><code>QP <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Paragraphs-in-ms">Paragraphs in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-QS-_005bms_005d"><code>QS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Paragraphs-in-ms">Paragraphs in ms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-R-_005bman_005d"><code>R <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-R-_005bms_005d"><code>R <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Typeface-and-decoration">Typeface and decoration</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-RD-_005bms_005d"><code>RD <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-keeps-and-displays">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-RE-_005bms_005d"><code>RE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Indented-regions-in-ms">Indented regions in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-RN-_005bman_005d"><code>RN <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-RP-_005bms_005d"><code>RP <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Description-Macros">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-RS-_005bms_005d"><code>RS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Indented-regions-in-ms">Indented regions in ms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-S">S</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-SH-_005bms_005d"><code>SH <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Headings-in-ms">Headings in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-SM-_005bms_005d"><code>SM <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Typeface-and-decoration">Typeface and decoration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-T">T</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-TA-_005bms_005d"><code>TA <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tab-Stops-in-ms">Tab Stops in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-TB-_005bman_005d"><code>TB <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-TC-_005bms_005d"><code>TC <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-TOC">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-TE-_005bms_005d"><code>TE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-TL-_005bms_005d"><code>TL <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Description-Macros">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-TS-_005bms_005d"><code>TS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-U">U</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-UL-_005bms_005d"><code>UL <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Typeface-and-decoration">Typeface and decoration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-V">V</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-VE-_005bman_005d"><code>VE <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-VS-_005bman_005d"><code>VS <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-X">X</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-XA-_005bms_005d"><code>XA <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-TOC">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-XE-_005bms_005d"><code>XE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-TOC">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-XH-_005bms_005d"><code>XH <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-TOC">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-XH_002dREPLACEMENT-_005bms_005d"><code>XH-REPLACEMENT <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-TOC">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-XH_002dUPDATE_002dTOC-_005bms_005d"><code>XH-UPDATE-TOC <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-TOC">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-XN-_005bms_005d"><code>XN <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-TOC">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-XN_002dINIT-_005bms_005d"><code>XN-INIT <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-TOC">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-XN_002dREPLACEMENT-_005bms_005d"><code>XN-REPLACEMENT <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-TOC">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-XP-_005bms_005d"><code>XP <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Paragraphs-in-ms">Paragraphs in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-XS-_005bms_005d"><code>XS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-TOC">ms TOC</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table class="ma-letters-footer-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Macro-Index_ma_symbol-1"><b>1</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_symbol-2"><b>2</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_symbol-3"><b>[</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_symbol-4"><b>]</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-X"><b>X</b></a>
+ &nbsp;
+</td></tr></table>
+</div>
+
+
+
+
+<hr>
+</div>
+<div class="appendix-level-extent" id="String-Index">
+<div class="nav-panel">
+<p>
+Next: <a href="#File-Keyword-Index" accesskey="n" rel="next">File Keyword Index</a>, Previous: <a href="#Macro-Index" accesskey="p" rel="prev">Macro Index</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h2 class="appendix" id="String-Index-1">Appendix G String Index</h2>
+
+<p>The macro package or program a that defines or uses each string is
+appended in brackets. (Only one string, <code class="code">.T</code>, is defined by the
+<code class="code">troff</code> formatter itself.) See <a class="xref" href="#Strings">Strings</a>.
+</p>
+
+<div class="printindex st-printindex">
+<table class="st-letters-header-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#String-Index_st_symbol-1"><b>!</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-2"><b>'</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-3"><b>*</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-4"><b>,</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-5"><b>-</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-6"><b>.</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-7"><b>/</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-8"><b>3</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-9"><b>8</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-10"><b>:</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-11"><b>&lt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-12"><b>&gt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-13"><b>?</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-14"><b>^</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-15"><b>_</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-16"><b>`</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-17"><b>{</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-18"><b>}</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-19"><b>~</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter-printindex" href="#String-Index_st_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-V"><b>V</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="st-entries-printindex" border="0">
+<tr><td></td><th class="entries-header-printindex">Index Entry</th><td>&nbsp;</td><th class="sections-header-printindex"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-1">!</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0021-_005bms_005d"><code>! <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-2">'</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0027-_005bms_005d"><code><code class="code">'</code> <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0027-_005bms_005d-1"><code><code class="code">'</code> <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-3">*</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002a-_005bms_005d"><code>* <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Footnotes">ms Footnotes</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-4">,</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002c-_005bms_005d"><code>, <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002c-_005bms_005d-1"><code>, <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-5">-</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002d-_005bms_005d"><code>- <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Typographical-symbols-in-ms">Typographical symbols in ms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-6">.</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002e-_005bms_005d"><code>. <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eT"><code>.T</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eT-1"><code>.T</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-7">/</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002f-_005bms_005d"><code>/ <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-8">3</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-3-_005bms_005d"><code>3 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-9">8</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-8-_005bms_005d"><code>8 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-10">:</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_003a-_005bms_005d"><code>: <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_003a-_005bms_005d-1"><code>: <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-11">&lt;</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_003c-_005bms_005d"><code>&lt; <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Typeface-and-decoration">Typeface and decoration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-12">&gt;</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_003e-_005bms_005d"><code>&gt; <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Typeface-and-decoration">Typeface and decoration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-13">?</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_003f-_005bms_005d"><code>? <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-14">^</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005e-_005bms_005d"><code>^ <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005e-_005bms_005d-1"><code>^ <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-15">_</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005f-_005bms_005d"><code>_ <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-16">`</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0060-_005bms_005d"><code><code class="code">`</code> <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0060-_005bms_005d-1"><code><code class="code">`</code> <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-17">{</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_007b-_005bms_005d"><code>{ <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Typeface-and-decoration">Typeface and decoration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-18">}</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_007d-_005bms_005d"><code>} <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Typeface-and-decoration">Typeface and decoration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-19">~</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_007e-_005bms_005d"><code>~ <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_007e-_005bms_005d-1"><code>~ <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-A">A</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ABSTRACT-_005bms_005d"><code>ABSTRACT <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-language-and-localization">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ae-_005bms_005d"><code>ae <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-Ae-_005bms_005d"><code>Ae <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-C-_005bms_005d"><code>C <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-CF-_005bms_005d"><code>CF <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-CH-_005bms_005d"><code>CH <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-D">D</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-d_002d-_005bms_005d"><code>d- <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-D_002d-_005bms_005d"><code>D- <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-F">F</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-FAM-_005bms_005d"><code>FAM <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-FR-_005bms_005d"><code>FR <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-L">L</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-LF-_005bms_005d"><code>LF <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-LH-_005bms_005d"><code>LH <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-M">M</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-MONTH1-_005bms_005d"><code>MONTH1 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-language-and-localization">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-MONTH10-_005bms_005d"><code>MONTH10 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-language-and-localization">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-MONTH11-_005bms_005d"><code>MONTH11 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-language-and-localization">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-MONTH12-_005bms_005d"><code>MONTH12 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-language-and-localization">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-MONTH2-_005bms_005d"><code>MONTH2 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-language-and-localization">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-MONTH3-_005bms_005d"><code>MONTH3 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-language-and-localization">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-MONTH4-_005bms_005d"><code>MONTH4 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-language-and-localization">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-MONTH5-_005bms_005d"><code>MONTH5 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-language-and-localization">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-MONTH6-_005bms_005d"><code>MONTH6 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-language-and-localization">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-MONTH7-_005bms_005d"><code>MONTH7 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-language-and-localization">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-MONTH8-_005bms_005d"><code>MONTH8 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-language-and-localization">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-MONTH9-_005bms_005d"><code>MONTH9 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-language-and-localization">ms language and localization</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-O">O</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-o-_005bms_005d"><code>o <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-oe-_005bms_005d"><code>oe <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-OE-_005bms_005d"><code>OE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-Q">Q</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-Q-_005bms_005d"><code>Q <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Typographical-symbols-in-ms">Typographical symbols in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-q-_005bms_005d"><code>q <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-REFERENCES-_005bms_005d"><code>REFERENCES <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-language-and-localization">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-RF-_005bms_005d"><code>RF <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-RH-_005bms_005d"><code>RH <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-S">S</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-SN-_005bms_005d"><code>SN <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Headings-in-ms">Headings in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-SN_002dDOT-_005bms_005d"><code>SN-DOT <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Headings-in-ms">Headings in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-SN_002dNO_002dDOT-_005bms_005d"><code>SN-NO-DOT <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Headings-in-ms">Headings in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-SN_002dSTYLE-_005bms_005d"><code>SN-STYLE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-SN_002dSTYLE-_005bms_005d-1"><code>SN-STYLE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Headings-in-ms">Headings in ms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-T">T</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-th-_005bms_005d"><code>th <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-Th-_005bms_005d"><code>Th <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-TOC-_005bms_005d"><code>TOC <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-language-and-localization">ms language and localization</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-U">U</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-U-_005bms_005d"><code>U <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Typographical-symbols-in-ms">Typographical symbols in ms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-V">V</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-v-_005bms_005d"><code>v <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table class="st-letters-footer-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#String-Index_st_symbol-1"><b>!</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-2"><b>'</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-3"><b>*</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-4"><b>,</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-5"><b>-</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-6"><b>.</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-7"><b>/</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-8"><b>3</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-9"><b>8</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-10"><b>:</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-11"><b>&lt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-12"><b>&gt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-13"><b>?</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-14"><b>^</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-15"><b>_</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-16"><b>`</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-17"><b>{</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-18"><b>}</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-19"><b>~</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter-printindex" href="#String-Index_st_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-V"><b>V</b></a>
+ &nbsp;
+</td></tr></table>
+</div>
+
+
+
+
+<hr>
+</div>
+<div class="appendix-level-extent" id="File-Keyword-Index">
+<div class="nav-panel">
+<p>
+Next: <a href="#Program-and-File-Index" accesskey="n" rel="next">Program and File Index</a>, Previous: <a href="#String-Index" accesskey="p" rel="prev">String Index</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h2 class="appendix" id="File-Keyword-Index-1">Appendix H File Keyword Index</h2>
+
+<div class="printindex ky-printindex">
+<table class="ky-letters-header-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#File-Keyword-Index_ky_symbol-1"><b>#</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_symbol-2"><b>-</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-V"><b>V</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="ky-entries-printindex" border="0">
+<tr><td></td><th class="entries-header-printindex">Index Entry</th><td>&nbsp;</td><th class="sections-header-printindex"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_symbol-1">#</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0023"><code>#</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0023-1"><code>#</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_symbol-2">-</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002d_002d_002d"><code>---</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-B">B</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-biggestfont"><code>biggestfont</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-charset"><code>charset</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-charset-1"><code>charset</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-F">F</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-family"><code>family</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-family-1"><code>family</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fonts"><code>fonts</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fonts-1"><code>fonts</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Special-Fonts">Special Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fonts-2"><code>fonts</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-H">H</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hor"><code>hor</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-I">I</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-image_005fgenerator"><code>image_generator</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-K">K</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-kernpairs"><code>kernpairs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-L">L</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ligatures"><code>ligatures</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-N">N</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-name"><code>name</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-P">P</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-paperlength"><code>paperlength</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-papersize"><code>papersize</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-paperwidth"><code>paperwidth</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pass_005ffilenames"><code>pass_filenames</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-postpro"><code>postpro</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-prepro"><code>prepro</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-print"><code>print</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-res"><code>res</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-S">S</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sizes"><code>sizes</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sizescale"><code>sizescale</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-slant"><code>slant</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-spacewidth"><code>spacewidth</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-spare1"><code>spare1</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-spare2"><code>spare2</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-special"><code>special</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-special-1"><code>special</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-styles"><code>styles</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-styles-1"><code>styles</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-styles-2"><code>styles</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-T">T</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tcommand"><code>tcommand</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-U">U</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unicode"><code>unicode</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unitwidth"><code>unitwidth</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unscaled_005fcharwidths"><code>unscaled_charwidths</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-use_005fcharnames_005fin_005fspecial"><code>use_charnames_in_special</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Postprocessor-Access">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-use_005fcharnames_005fin_005fspecial-1"><code>use_charnames_in_special</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-V">V</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vert"><code>vert</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table class="ky-letters-footer-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#File-Keyword-Index_ky_symbol-1"><b>#</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_symbol-2"><b>-</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-V"><b>V</b></a>
+ &nbsp;
+</td></tr></table>
+</div>
+
+
+
+
+<hr>
+</div>
+<div class="appendix-level-extent" id="Program-and-File-Index">
+<div class="nav-panel">
+<p>
+Next: <a href="#Concept-Index" accesskey="n" rel="next">Concept Index</a>, Previous: <a href="#File-Keyword-Index" accesskey="p" rel="prev">File Keyword Index</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h2 class="appendix" id="Program-and-File-Index-1">Appendix I Program and File Index</h2>
+
+<div class="printindex pg-printindex">
+<table class="pg-letters-header-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-J"><b>J</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-Z"><b>Z</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="pg-entries-printindex" border="0">
+<tr><td></td><th class="entries-header-printindex">Index Entry</th><td>&nbsp;</td><th class="sections-header-printindex"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-A">A</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-an_002etmac"><code>an.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#man">man</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-changebar"><code>changebar</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-composite_002etmac"><code>composite.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-cp1047_002etmac"><code>cp1047.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-cs_002etmac"><code>cs.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-D">D</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-de_002etmac"><code>de.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-DESC"><code>DESC</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-DESC-1"><code>DESC</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-DESC-2"><code>DESC</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-DESC-3"><code>DESC</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-DESC-4"><code>DESC</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Special-Fonts">Special Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diffmk"><code>diffmk</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-E">E</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ec_002etmac"><code>ec.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-en_002etmac"><code>en.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-eqn"><code>eqn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-F">F</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fr_002etmac"><code>fr.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-freeeuro_002epfa"><code>freeeuro.pfa</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-G">G</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-gchem"><code>gchem</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-gdiffmk"><code>gdiffmk</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-geqn"><code>geqn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ggrn"><code>ggrn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-gpic"><code>gpic</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-grap"><code>grap</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-grefer"><code>grefer</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-groff"><code>groff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-gsoelim"><code>gsoelim</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-gtbl"><code>gtbl</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-gtroff"><code>gtroff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-I">I</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-it_002etmac"><code>it.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-J">J</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ja_002etmac"><code>ja.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-L">L</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-latin1_002etmac"><code>latin1.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-latin2_002etmac"><code>latin2.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-latin5_002etmac"><code>latin5.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-latin9_002etmac"><code>latin9.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-M">M</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-makeindex"><code>makeindex</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Indexing">Indexing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-man_002elocal"><code>man.local</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-man_002etmac"><code>man.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#man">man</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-man_002eultrix"><code>man.ultrix</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-N">N</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nrchbar"><code>nrchbar</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-P">P</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-papersize_002etmac"><code>papersize.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Paper-Format">Paper Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-perl"><code>perl</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pic"><code>pic</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-post_002dgrohtml"><code>post-grohtml</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pre_002dgrohtml"><code>pre-grohtml</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-preconv"><code>preconv</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-refer"><code>refer</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-S">S</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-soelim"><code>soelim</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sv_002etmac"><code>sv.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-T">T</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tbl"><code>tbl</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-trace_002etmac"><code>trace.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Writing-Macros">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-troffrc"><code>troffrc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-troffrc-1"><code>troffrc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Paper-Format">Paper Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-troffrc-2"><code>troffrc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-troffrc-3"><code>troffrc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-troffrc-4"><code>troffrc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#troff-and-nroff-Modes"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-troffrc_002dend"><code>troffrc-end</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-troffrc_002dend-1"><code>troffrc-end</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-troffrc_002dend-2"><code>troffrc-end</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#troff-and-nroff-Modes"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tty_002etmac"><code>tty.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#troff-and-nroff-Modes"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tty_002etmac-1"><code>tty.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-V">V</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vtroff"><code>vtroff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Operators-in-Conditionals">Operators in Conditionals</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-Z">Z</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-zh_002etmac"><code>zh.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table class="pg-letters-footer-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-J"><b>J</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-Z"><b>Z</b></a>
+ &nbsp;
+</td></tr></table>
+</div>
+
+
+
+
+<hr>
+</div>
+<div class="appendix-level-extent" id="Concept-Index">
+<div class="nav-panel">
+<p>
+Previous: <a href="#Program-and-File-Index" accesskey="p" rel="prev">Program and File Index</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h2 class="appendix" id="Concept-Index-1">Appendix J Concept Index</h2>
+
+<div class="printindex cp-printindex">
+<table class="cp-letters-header-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-1"><b>&quot;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-2"><b>%</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-3"><b>&amp;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-4"><b>'</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-5"><b>(</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-6"><b>)</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-7"><b>*</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-8"><b>+</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-9"><b>-</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-10"><b>.</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-11"><b>/</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-12"><b>8</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-13"><b>:</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-14"><b>&lt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-15"><b>=</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-16"><b>&gt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-17"><b>[</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-18"><b>\</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-19"><b>]</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-20"><b>|</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-J"><b>J</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-W"><b>W</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-Y"><b>Y</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-Z"><b>Z</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="cp-entries-printindex" border="0">
+<tr><td></td><th class="entries-header-printindex">Index Entry</th><td>&nbsp;</td><th class="sections-header-printindex"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-1">&quot;</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0022_002c-as-delimiter"><code class="code">&quot;</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0022_002c-at-end-of-sentence"><code class="code">&quot;</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Sentences">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0022_002c-at-end-of-sentence-1"><code class="code">&quot;</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0022_002c-embedding-in-a-macro-argument"><code class="code">&quot;</code>, embedding in a macro argument</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Calling-Macros">Calling Macros</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-2">%</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0025_002c-as-delimiter"><code class="code">%</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-3">&amp;</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0026_002c-as-delimiter"><code class="code">&amp;</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-4">'</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0027_002c-as-a-comment"><code class="code">'</code>, as a comment</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Comments">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0027_002c-as-delimiter"><code class="code">'</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0027_002c-at-end-of-sentence"><code class="code">'</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Sentences">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0027_002c-at-end-of-sentence-1"><code class="code">'</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-5">(</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0028_002c-as-delimiter"><code class="code">(</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-6">)</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0029_002c-as-delimiter"><code class="code">)</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0029_002c-at-end-of-sentence"><code class="code">)</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Sentences">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_0029_002c-at-end-of-sentence-1"><code class="code">)</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-7">*</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002a_002c-as-delimiter"><code class="code">*</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002a_002c-at-end-of-sentence"><code class="code">*</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Sentences">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002a_002c-at-end-of-sentence-1"><code class="code">*</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-8">+</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002b_002c-and-page-motion"><code class="code">+</code>, and page motion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002b_002c-as-delimiter"><code class="code">+</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-9">-</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002d_002c-and-page-motion"><code class="code">-</code>, and page motion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002d_002c-as-delimiter"><code class="code">-</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-10">.</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002e_002c-as-delimiter"><code class="code">.</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eh-register_002c-difference-from-nl"><code class="code">.h</code> register, difference from <code class="code">nl</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eps-register_002c-in-comparison-with-_002epsr"><code class="code">.ps</code> register, in comparison with <code class="code">.psr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002es-register_002c-in-comparison-with-_002esr"><code class="code">.s</code> register, in comparison with <code class="code">.sr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eS-register_002c-Plan-9-alias-for-_002etabs"><code class="code">.S</code> register, Plan&nbsp;9 alias for <code class="code">.tabs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002et-register_002c-and-diversions"><code class="code">.t</code> register, and diversions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversion-Traps">Diversion Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002etabs-register_002c-Plan-9-alias-_0028_002eS_0029"><code class="code">.tabs</code> register, Plan&nbsp;9 alias (<code class="code">.S</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002eV-register_002c-and-vs"><code class="code">.V</code> register, and <code class="code">vs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Vertical-Spacing">Changing the Vertical Spacing</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-11">/</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_002f_002c-as-delimiter"><code class="code">/</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-12">8</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-8_002dbit-input">8-bit input</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-13">:</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_003a_002c-as-delimiter"><code class="code">:</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-14">&lt;</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_003c_002c-as-delimiter"><code class="code">&lt;</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-15">=</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_003d_002c-as-delimiter"><code class="code">=</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-16">&gt;</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_003e_002c-as-delimiter"><code class="code">&gt;</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-17">[</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005b_002c-macro-names-starting-with_002c-and-refer"><code class="code">[</code>, macro names starting with, and <code class="code">refer</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Identifiers">Identifiers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-18">\</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0021_002c-and-copy-mode"><code class="code">\!</code>, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0021_002c-and-output-request"><code class="code">\!</code>, and <code class="code">output</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0021_002c-and-trnt"><code class="code">\!</code>, and <code class="code">trnt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0021_002c-as-delimiter"><code class="code">\!</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0021_002c-as-delimiter-1"><code class="code">\!</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0021_002c-in-top_002dlevel-diversion"><code class="code">\!</code>, in top-level diversion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0021_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\!</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0021_002c-incompatibilities-with-AT_0026T-troff-1"><code class="code">\!</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0024_002c-when-reading-text-for-a-macro"><code class="code">\$</code>, when reading text for a macro</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Copy-Mode">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0025_002c-and-translations"><code class="code">\%</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0025_002c-as-delimiter"><code class="code">\%</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0025_002c-as-delimiter-1"><code class="code">\%</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0025_002c-following-_005cX-or-_005cY"><code class="code">\%</code>, following <code class="code">\X</code> or <code class="code">\Y</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0025_002c-in-_005cX"><code class="code">\%</code>, in <code class="code">\X</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Postprocessor-Access">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0025_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\%</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0026_002c-and-glyph-definitions"><code class="code">\&amp;</code>, and glyph definitions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0026_002c-and-translations"><code class="code">\&amp;</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0026_002c-as-delimiter"><code class="code">\&amp;</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0026_002c-at-end-of-sentence"><code class="code">\&amp;</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Sentences">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0026_002c-in-_005cX"><code class="code">\&amp;</code>, in <code class="code">\X</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Postprocessor-Access">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0026_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\&amp;</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0027_002c-and-translations"><code class="code">\'</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0027_002c-as-delimiter"><code class="code">\'</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0027_002c-as-delimiter-1"><code class="code">\'</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0027_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\'</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0028_002c-and-translations"><code class="code">\(</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0029_002c-as-delimiter"><code class="code">\)</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0029_002c-in-_005cX"><code class="code">\)</code>, in <code class="code">\X</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Postprocessor-Access">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_002a_002c-and-warnings"><code class="code">\*</code>, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_002a_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\*</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Compatibility-Mode">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_002a_002c-when-reading-text-for-a-macro"><code class="code">\*</code>, when reading text for a macro</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Copy-Mode">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_002c-disabling-_0028eo_0029"><code class="code">\</code>, disabling (<code class="code">eo</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Escape-Sequences">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_002c-embedding-in-a-macro-argument"><code class="code">\</code>, embedding in a macro argument</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Calling-Macros">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_002c_002c-as-delimiter"><code class="code">\,</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_002d-glyph_002c-and-cflags"><code class="code">\-</code> glyph, and <code class="code">cflags</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_002d_002c-and-translations"><code class="code">\-</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_002d_002c-as-delimiter"><code class="code">\-</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_002d_002c-as-delimiter-1"><code class="code">\-</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_002d_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\-</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_002f_002c-as-delimiter"><code class="code">\/</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_002f_002c-as-delimiter-1"><code class="code">\/</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c0_002c-as-delimiter"><code class="code">\0</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_003a_002c-as-delimiter"><code class="code">\:</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_003a_002c-as-delimiter-1"><code class="code">\:</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_003a_002c-in-_005cX"><code class="code">\:</code>, in <code class="code">\X</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Postprocessor-Access">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_003f_002c-and-copy-mode"><code class="code">\?</code>, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Operators-in-Conditionals">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_003f_002c-and-copy-mode-1"><code class="code">\?</code>, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_003f_002c-as-delimiter"><code class="code">\?</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_003f_002c-in-top_002dlevel-diversion"><code class="code">\?</code>, in top-level diversion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_003f_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\?</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005ca_002c-and-copy-mode"><code class="code">\a</code>, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Leaders">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005ca_002c-and-translations"><code class="code">\a</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005ca_002c-as-delimiter"><code class="code">\a</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cA_002c-delimiters-allowed-by"><code class="code">\A</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cA_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\A</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cb_002c-delimiters-allowed-by"><code class="code">\b</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cb_002c-limitations-of"><code class="code">\b</code>, limitations of</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cC_002c-and-translations"><code class="code">\C</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cc_002c-as-delimiter"><code class="code">\c</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cc_002c-as-delimiter-1"><code class="code">\c</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cc_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\c</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cc_002c-when-filling-disabled"><code class="code">\c</code>, when filling disabled</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cc_002c-when-filling-enabled"><code class="code">\c</code>, when filling enabled</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cd_002c-as-delimiter"><code class="code">\d</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cD_002c-delimiters-allowed-by"><code class="code">\D</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005ce_002c-and-glyph-definitions"><code class="code">\e</code>, and glyph definitions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005ce_002c-and-translations"><code class="code">\e</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005ce_002c-as-delimiter"><code class="code">\e</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cE_002c-as-delimiter"><code class="code">\E</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005ce_002c-as-delimiter-1"><code class="code">\e</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005ce_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\e</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cF_002c-and-changing-fonts"><code class="code">\F</code>, and changing fonts</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cf_002c-and-font-translations"><code class="code">\f</code>, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cf_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\f</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Compatibility-Mode">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005ch_002c-delimiters-allowed-by"><code class="code">\h</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cH_002c-delimiters-allowed-by"><code class="code">\H</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cH_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\H</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Compatibility-Mode">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cH_002c-using-_002b-and-_002d-with"><code class="code">\H</code>, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cH_002c-with-fractional-type-sizes"><code class="code">\H</code>, with fractional type sizes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cl_002c-and-glyph-definitions"><code class="code">\l</code>, and glyph definitions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cL_002c-and-glyph-definitions"><code class="code">\L</code>, and glyph definitions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cl_002c-delimiters-allowed-by"><code class="code">\l</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cL_002c-delimiters-allowed-by"><code class="code">\L</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cN_002c-and-translations"><code class="code">\N</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cn_002c-and-warnings"><code class="code">\n</code>, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cN_002c-delimiters-allowed-by"><code class="code">\N</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cn_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\n</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Compatibility-Mode">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cn_002c-when-reading-text-for-a-macro"><code class="code">\n</code>, when reading text for a macro</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Copy-Mode">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005co_002c-delimiters-allowed-by"><code class="code">\o</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cp_002c-as-delimiter"><code class="code">\p</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cp_002c-as-delimiter-1"><code class="code">\p</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cR_002c-after-_005cc"><code class="code">\R</code>, after <code class="code">\c</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cR_002c-and-warnings"><code class="code">\R</code>, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cr_002c-as-delimiter"><code class="code">\r</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cR_002c-delimiters-allowed-by"><code class="code">\R</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cR_002c-difference-from-nr"><code class="code">\R</code>, difference from <code class="code">nr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Auto_002dincrement">Auto-increment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cR_002c-using-_002b-and-_002d-with"><code class="code">\R</code>, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cRET_002c-when-reading-text-for-a-macro">\<kbd class="key">RET</kbd>, when reading text for a macro</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Copy-Mode">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cs_002c-delimiters-allowed-by"><code class="code">\s</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cS_002c-delimiters-allowed-by"><code class="code">\S</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cs_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\s</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Compatibility-Mode">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cS_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\S</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Compatibility-Mode">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cs_002c-incompatibilities-with-AT_0026T-troff-1"><code class="code">\s</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Compatibility-Mode">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cs_002c-using-_002b-and-_002d-with"><code class="code">\s</code>, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cs_002c-with-fractional-type-sizes"><code class="code">\s</code>, with fractional type sizes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cSP_002c-as-delimiter"><code class="code">\<kbd class="key">SP</kbd></code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cSP_002c-difference-from-_005c_007e"><code class="code">\<kbd class="key">SP</kbd></code>, difference from <code class="code">\~</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Calling-Macros">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cSP_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\<kbd class="key">SP</kbd></code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005ct_002c-and-copy-mode"><code class="code">\t</code>, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005ct_002c-and-translations"><code class="code">\t</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005ct_002c-and-warnings"><code class="code">\t</code>, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005ct_002c-as-delimiter"><code class="code">\t</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cu_002c-as-delimiter"><code class="code">\u</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cV_002c-and-copy-mode"><code class="code">\V</code>, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cv_002c-delimiters-allowed-by"><code class="code">\v</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cv_002c-internal-representation"><code class="code">\v</code>, internal representation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Gtroff-Internals">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cw_002c-delimiters-allowed-by"><code class="code">\w</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cX_002c-and-special-characters"><code class="code">\X</code>, and special characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Postprocessor-Access">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cX_002c-delimiters-allowed-by"><code class="code">\X</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cx_002c-delimiters-allowed-by"><code class="code">\x</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cX_002c-followed-by-_005c_0025"><code class="code">\X</code>, followed by <code class="code">\%</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cY_002c-followed-by-_005c_0025"><code class="code">\Y</code>, followed by <code class="code">\%</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005cZ_002c-delimiters-allowed-by"><code class="code">\Z</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_005b_002c-and-translations"><code class="code">\[</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_005c_002c-when-reading-text-for-a-macro"><code class="code">\\</code>, when reading text for a macro</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Copy-Mode">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_005e_002c-as-delimiter"><code class="code">\^</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_005e_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\^</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_005f_002c-and-translations"><code class="code">\_</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_005f_002c-as-delimiter"><code class="code">\_</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_005f_002c-as-delimiter-1"><code class="code">\_</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_005f_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\_</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0060_002c-and-translations"><code class="code">\`</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0060_002c-as-delimiter"><code class="code">\`</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0060_002c-as-delimiter-1"><code class="code">\`</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_0060_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\`</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_007b_002c-as-delimiter"><code class="code">\{</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_007b_002c-as-delimiter-1"><code class="code">\{</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_007b_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\{</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_007c_002c-as-delimiter"><code class="code">\|</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_007c_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\|</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_007d_002c-and-warnings"><code class="code">\}</code>, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_007d_002c-as-delimiter"><code class="code">\}</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_007d_002c-as-delimiter-1"><code class="code">\}</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_007d_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\}</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_007e_002c-and-translations"><code class="code">\~</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_007e_002c-as-delimiter"><code class="code">\~</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_007e_002c-difference-from-_005cSP"><code class="code">\~</code>, difference from <code class="code">\<kbd class="key">SP</kbd></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Calling-Macros">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005c_007e_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\~</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-19">]</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005d_002c-as-part-of-an-identifier"><code class="code">]</code>, as part of an identifier</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Identifiers">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005d_002c-at-end-of-sentence"><code class="code">]</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Sentences">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005d_002c-at-end-of-sentence-1"><code class="code">]</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_005d_002c-macro-names-starting-with_002c-and-refer"><code class="code">]</code>, macro names starting with, and <code class="code">refer</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Identifiers">Identifiers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-20">|</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-_007c_002c-and-page-motion"><code class="code">|</code>, and page motion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-A">A</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ab-request_002c-incompatibilities-with-AT_0026T-troff"><code class="code">ab</code> request, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-aborting-_0028ab_0029">aborting (<code class="code">ab</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-absolute-_0028sic_0029-position-operator-_0028_007c_0029">absolute <i class="slanted">(sic)</i> position operator (<code class="code">|</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-abstract-font-style">abstract font style</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-abstract-font-style_002c-setting-up-_0028sty_0029">abstract font style, setting up (<code class="code">sty</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-accent-marks-_005bms_005d">accent marks [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-access-to-postprocessor">access to postprocessor</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Postprocessor-Access">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-accessing-unnamed-glyphs-with-_005cN">accessing unnamed glyphs with <code class="code">\N</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-activating-kerning-_0028kern_0029">activating kerning (<code class="code">kern</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Ligatures-and-Kerning">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-activating-ligatures-_0028lg_0029">activating ligatures (<code class="code">lg</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Ligatures-and-Kerning">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-activating-track-kerning-_0028tkf_0029">activating track kerning (<code class="code">tkf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Ligatures-and-Kerning">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ad-request_002c-and-hyphenation-margin"><code class="code">ad</code> request, and hyphenation margin</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ad-request_002c-and-hyphenation-space"><code class="code">ad</code> request, and hyphenation space</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-addition">addition</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-additional-inter_002dsentence-space">additional inter-sentence space</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-adjustment-and-filling_002c-manipulating">adjustment and filling, manipulating</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-adjustment-mode-register-_0028_002ej_0029">adjustment mode register (<code class="code">.j</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-adjustment-to-both-margins_002c-difference-from-AT_0026T-troff">adjustment to both margins, difference from <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-Adobe-Glyph-List-_0028AGL_0029">Adobe Glyph List (AGL)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-alias_002c-diversion_002c-creating-_0028als_0029">alias, diversion, creating (<code class="code">als</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-alias_002c-diversion_002c-removing-_0028rm_0029">alias, diversion, removing (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-alias_002c-macro_002c-creating-_0028als_0029">alias, macro, creating (<code class="code">als</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-alias_002c-macro_002c-removing-_0028rm_0029">alias, macro, removing (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-alias_002c-register_002c-creating-_0028aln_0029">alias, register, creating (<code class="code">aln</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Setting-Registers">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-alias_002c-register_002c-removing-_0028rr_0029">alias, register, removing (<code class="code">rr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Setting-Registers">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-alias_002c-string_002c-creating-_0028als_0029">alias, string, creating (<code class="code">als</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-alias_002c-string_002c-removing-_0028rm_0029">alias, string, removing (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-aliasing-fonts-with-third-argument-to-fp-request">aliasing fonts with third argument to <code class="code">fp</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Positions">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-als-request_002c-and-_005c_00240"><code class="code">als</code> request, and <code class="code">\$0</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Parameters">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-am_002c-am1_002c-ami-requests_002c-and-warnings"><code class="code">am</code>, <code class="code">am1</code>, <code class="code">ami</code> requests, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-appending-to-a-diversion-_0028da_002c-boxa_0029">appending to a diversion (<code class="code">da</code>, <code class="code">boxa</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-appending-to-a-file-_0028opena_0029">appending to a file (<code class="code">opena</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-appending-to-a-macro-_0028am_0029">appending to a macro (<code class="code">am</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Writing-Macros">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-appending-to-a-string-_0028as_0029">appending to a string (<code class="code">as</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-approximation-output-register-_0028_002eA_0029">approximation output register (<code class="code">.A</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-arc_002c-drawing-_0028_005cD_0027a-_2026_0027_0029">arc, drawing (&lsquo;<samp class="samp">\D'a &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-argument">argument</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Requests-and-Macros">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-arguments-to-macros">arguments to macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Calling-Macros">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-arguments-to-macros_002c-and-tabs">arguments to macros, and tabs</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Invoking-Requests">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-arguments-to-requests">arguments to requests</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Invoking-Requests">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-arguments-to-requests_002c-and-tabs">arguments to requests, and tabs</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Invoking-Requests">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-arguments_002c-and-compatibility-mode">arguments, and compatibility mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Gtroff-Internals">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-arguments_002c-to-escape-sequences_002c-delimiting">arguments, to escape sequences, delimiting</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-arguments_002c-to-strings">arguments, to strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-arithmetic-operators">arithmetic operators</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-artificial-fonts">artificial fonts</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-as_002c-as1-requests_002c-and-comments"><code class="code">as</code>, <code class="code">as1</code> requests, and comments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Comments">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-as_002c-as1-requests_002c-and-warnings"><code class="code">as</code>, <code class="code">as1</code> requests, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ASCII-output-encoding"><abbr class="acronym">ASCII</abbr> output encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-asciify-request_002c-and-writem"><code class="code">asciify</code> request, and <code class="code">writem</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-assertion-_0028arithmetic-operator_0029">assertion (arithmetic operator)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-assign-number-format-to-register-_0028af_0029">assign number format to register (<code class="code">af</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Assigning-Register-Formats">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-assignments_002c-indirect">assignments, indirect</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Interpolating-Registers">Interpolating Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-assignments_002c-nested">assignments, nested</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Interpolating-Registers">Interpolating Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-AT_0026T-ms_002c-macro-package-differences"><abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp>, macro package differences</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Differences-from-AT_0026T-ms">Differences from AT&amp;T ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-attributes_002c-character-cell">attributes, character cell</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-auto_002dincrementation-of-a-register">auto-incrementation of a register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Auto_002dincrement">Auto-increment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-automatic-font-mounting">automatic font mounting</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-automatic-hyphenation">automatic hyphenation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-automatic-hyphenation-parameters">automatic hyphenation parameters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-auxiliary-macro-package">auxiliary macro package</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Major-Macro-Packages">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-available-glyphs_002c-list-of-_0028groff_005fchar_00287_0029-man-page_0029">available glyphs, list of (<cite class="cite">groff_char<span class="r">(7)</span></cite> man page)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-B">B</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-background">background</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Background">Background</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-background-color-name-register-_0028_002eM_0029">background color name register (<code class="code">.M</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-backslash-glyph_002c-formatting-_0028_005c_005brs_005d_0029">backslash glyph, formatting (<code class="code">\[rs]</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Escape-Sequences">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-backslash_002c-embedding-in-a-macro-argument">backslash, embedding in a macro argument</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Calling-Macros">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-backslash_002c-printing-_0028_005c_005c_002c-_005ce_002c-_005cE_002c-_005c_005brs_005d_0029">backslash, printing (<code class="code">\\</code>, <code class="code">\e</code>, <code class="code">\E</code>, <code class="code">\[rs]</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-backspace-character_002c-and-translations">backspace character, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-backtrace-of-input-stack-_0028backtrace_0029">backtrace of input stack (<code class="code">backtrace</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-baseline-rule-special-character_0028_005c_005bru_005d_0029">baseline rule special character(<code class="code">\[ru]</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-baseline_002c-text">baseline, text</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-baseline_002c-text-1">baseline, text</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Type-Size-and-Vertical-Spacing">Manipulating Type Size and Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-basic-scaling-unit-_0028u_0029">basic scaling unit (<code class="code">u</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-basic-units">basic units</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-basic-units_002c-conversion-to">basic units, conversion to</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-basics-of-macro-package-usage">basics of macro package usage</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Basics">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-bd-request_002c-and-font-styles"><code class="code">bd</code> request, and font styles</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-bd-request_002c-and-font-translations"><code class="code">bd</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-bd-request_002c-incompatibilities-with-AT_0026T-troff"><code class="code">bd</code> request, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-beginning-diversion-_0028di_002c-box_0029">beginning diversion (<code class="code">di</code>, <code class="code">box</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-beginning-of-conditional-block-_0028_005c_007b_0029">beginning of conditional block (<code class="code">\{</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Conditional-Blocks">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-blank-line">blank line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Breaking">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-blank-line-macro-_0028blm_0029">blank line macro (<code class="code">blm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Breaking">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-blank-line-macro-_0028blm_0029-1">blank line macro (<code class="code">blm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Invoking-Requests">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-blank-line-macro-_0028blm_0029-2">blank line macro (<code class="code">blm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Blank-Line-Traps">Blank Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-blank-line-trap-_0028blm_0029">blank line trap (<code class="code">blm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Invoking-Requests">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-blank-line-traps">blank line traps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Blank-Line-Traps">Blank Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-blank-lines_002c-disabling">blank lines, disabling</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Spacing">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-block_002c-conditional_002c-beginning-_0028_005c_007b_0029">block, conditional, beginning (<code class="code">\{</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Conditional-Blocks">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-block_002c-conditional_002c-end-_0028_005c_007d_0029">block, conditional, end (<code class="code">\}</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Conditional-Blocks">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-blocks_002c-conditional">blocks, conditional</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Conditional-Blocks">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-body_002c-of-a-while-request">body, of a while request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#while">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-boldface_002c-imitating-_0028bd_0029">boldface, imitating (<code class="code">bd</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-bottom-margin">bottom margin</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-boundary_002drelative-motion-operator-_0028_007c_0029">boundary-relative motion operator (<code class="code">|</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-bounding-box">bounding box</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-box-_0028diversion-operation_0029">box (diversion operation)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-box-request_002c-and-warnings"><code class="code">box</code> request, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-box-rule-glyph-_0028_005c_005bbr_005d_0029">box rule glyph (<code class="code">\[br]</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-box_002c-boxa-requests_002c-and-warnings"><code class="code">box</code>, <code class="code">boxa</code> requests, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-boxa-request_002c-and-dn-_0028dl_0029"><code class="code">boxa</code> request, and <code class="code">dn</code> (<code class="code">dl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-boxa-request_002c-and-warnings"><code class="code">boxa</code> request, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-boxes-_005bms_005d">boxes [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-keeps-and-displays">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-bp-request_002c-and-top_002dlevel-diversion"><code class="code">bp</code> request, and top-level diversion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-bp-request_002c-and-traps-_0028_002epe_0029"><code class="code">bp</code> request, and traps (<code class="code">.pe</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-bp-request_002c-causing-implicit-break"><code class="code">bp</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-bp-request_002c-incompatibilities-with-AT_0026T-troff"><code class="code">bp</code> request, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-bp-request_002c-using-_002b-and-_002d-with"><code class="code">bp</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-br-glyph_002c-and-cflags"><code class="code">br</code> glyph, and <code class="code">cflags</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-brace-escape-sequence_002c-closing-_0028_005c_007d_0029">brace escape sequence, closing (<code class="code">\})</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Conditional-Blocks">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-brace-escape-sequence_002c-opening-_0028_005c_007d_0029">brace escape sequence, opening (<code class="code">\})</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Conditional-Blocks">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-brace-escape-sequences-_0028_005c_007b_002c-_005c_007d_0029">brace escape sequences (<code class="code">\{</code>, <code class="code">\}</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Conditional-Blocks">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-break">break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Breaking">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-break-1">break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-break-_0028introduction_0029">break (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Basics">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-break-request_002c-in-a-while-loop"><code class="code">break</code> request, in a <code class="code">while</code> loop</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#while">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-break_002c-page">break, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-break_002c-page-1">break, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-break_002c-page-2">break, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#The-Implicit-Page-Trap">The Implicit Page Trap</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-break_002c-page-_0028introduction_0029">break, page (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Basics">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-break_002c-page_002c-final">break, page, final</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#End_002dof_002dinput-Traps">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-break_002c-page_002c-prevented-by-vpt">break, page, prevented by <code class="code">vpt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Vertical-Position-Traps">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-breaking-file-names-_0028_005c_003a_0029">breaking file names (<code class="code">\:</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-breaking-URLs-_0028_005c_003a_0029">breaking URLs (<code class="code">\:</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-breaking-without-hyphens-_0028_005c_003a_0029">breaking without hyphens (<code class="code">\:</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-built_002din-register_002c-removing">built-in register, removing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-built_002din-registers">built-in registers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-bulleted-list_002c-example-markup-_005bms_005d">bulleted list, example markup [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Lists-in-ms">Lists in ms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-c-scaling-unit"><code class="code">c</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-calling-a-macro">calling a macro</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Requests-and-Macros">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-calling-macros">calling macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Calling-Macros">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-capabilities-of-groff">capabilities of <code class="code">groff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#groff-Capabilities"><code class="code">groff</code> Capabilities</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-case_002dtransforming-a-string-_0028stringdown_002c-stringup_0029">case-transforming a string (<code class="code">stringdown</code>, <code class="code">stringup</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-categories_002c-warning">categories, warning</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-CCSID-1047-output-encoding-_0028EBCDIC_0029">CCSID 1047 output encoding (EBCDIC)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ce-request_002c-causing-implicit-break"><code class="code">ce</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ce-request_002c-difference-from-_002ead-c"><code class="code">ce</code> request, difference from &lsquo;<samp class="samp">.ad&nbsp;c</samp>&rsquo;<!-- /@w --></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-cell_002c-character_002c-attributes">cell, character, attributes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-centered-text-_0028filled_0029">centered text (filled)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-centered-text-_0028unfilled_0029">centered text (unfilled)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-centering-lines-_0028ce_0029">centering lines (<code class="code">ce</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-centering-lines-_0028introduction_0029">centering lines (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Basics">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-centimeter-scaling-unit-_0028c_0029">centimeter scaling unit (<code class="code">c</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-cf-request_002c-and-copy-mode"><code class="code">cf</code> request, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-cf-request_002c-causing-implicit-break"><code class="code">cf</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-changing-control-characters">changing control characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Control-Characters">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-changing-font-family-_0028fam_002c-_005cF_0029">changing font family (<code class="code">fam</code>, <code class="code">\F</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-changing-fonts-_0028ft_002c-_005cf_0029">changing fonts (<code class="code">ft</code>, <code class="code">\f</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-changing-format_002c-and-read_002donly-registers">changing format, and read-only registers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Assigning-Register-Formats">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-changing-the-font-height-_0028_005cH_0029">changing the font height (<code class="code">\H</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-changing-the-font-slant-_0028_005cS_0029">changing the font slant (<code class="code">\S</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-changing-the-page-number-character-_0028pc_0029">changing the page number character (<code class="code">pc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-changing-trap-location-_0028ch_0029">changing trap location (<code class="code">ch</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-changing-type-sizes-_0028ps_002c-_005cs_0029">changing type sizes (<code class="code">ps</code>, <code class="code">\s</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Type-Size">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-changing-vertical-line-spacing-_0028vs_0029">changing vertical line spacing (<code class="code">vs</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Vertical-Spacing">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-char-request_002c-and-soft-hyphen-character"><code class="code">char</code> request, and soft hyphen character</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-char-request_002c-and-translations"><code class="code">char</code> request, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-char-request_002c-used-with-_005cN"><code class="code">char</code> request, used with <code class="code">\N</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character">character</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character-cell-attributes">character cell attributes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character-class-_0028class_0029">character class (<code class="code">class</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Classes">Character Classes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character-classes">character classes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Classes">Character Classes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character-properties-_0028cflags_0029">character properties (<code class="code">cflags</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character-translations">character translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-backspace_002c-and-translations">character, backspace, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-control-_0028_002e_0029">character, control (<code class="code">.</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Requests-and-Macros">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-control_002c-changing-_0028cc_0029">character, control, changing (<code class="code">cc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Control-Characters">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-defining-_0028char_0029">character, defining (<code class="code">char</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-defining-fallback-_0028fchar_002c-fschar_002c-schar_0029">character, defining fallback (<code class="code">fchar</code>, <code class="code">fschar</code>, <code class="code">schar</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-distinguished-from-glyph">character, distinguished from glyph</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-dummy-_0028_005c_0026_0029">character, dummy (<code class="code">\&amp;</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Dummy-Characters">Dummy Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-dummy-_0028_005c_0026_0029_002c-as-control-character-suppressor">character, dummy (<code class="code">\&amp;</code>), as control character suppressor</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Requests-and-Macros">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-dummy-_0028_005c_0026_0029_002c-effect-on-kerning">character, dummy (<code class="code">\&amp;</code>), effect on kerning</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Ligatures-and-Kerning">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-dummy-_0028_005c_0026_0029_002c-effect-on-_005cl-escape-sequence">character, dummy (<code class="code">\&amp;</code>), effect on <code class="code">\l</code> escape sequence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-escape_002c-changing-_0028ec_0029">character, escape, changing (<code class="code">ec</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Escape-Sequences">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-escape_002c-while-defining-glyph">character, escape, while defining glyph</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-field-delimiting-_0028fc_0029">character, field delimiting (<code class="code">fc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Fields">Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-field-padding-_0028fc_0029">character, field padding (<code class="code">fc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Fields">Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-horizontal-tab">character, horizontal tab</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Leaders">Tabs and Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-hyphenation-_0028_005c_0025_0029">character, hyphenation (<code class="code">\%</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-leader">character, leader</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Leaders">Tabs and Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-leader-repetition-_0028lc_0029">character, leader repetition (<code class="code">lc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Leaders">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-leader_002c-and-translations">character, leader, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-leader_002c-non_002dinterpreted-_0028_005ca_0029">character, leader, non-interpreted (<code class="code">\a</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Leaders">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-named-_0028_005cC_0029">character, named (<code class="code">\C</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-newline_002c-and-translations">character, newline, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-no_002dbreak-control-_0028_0027_0029">character, no-break control (<code class="code">'</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Requests-and-Macros">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-no_002dbreak-control_002c-changing-_0028c2_0029">character, no-break control, changing (<code class="code">c2</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Control-Characters">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-ordinary">character, ordinary</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Identifiers">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-soft-hyphen_002c-setting-_0028shc_0029">character, soft hyphen, setting (<code class="code">shc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-special">character, special</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-tab-repetition-_0028tc_0029">character, tab repetition (<code class="code">tc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-tab_002c-and-translations">character, tab, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-tab_002c-non_002dinterpreted-_0028_005ct_0029">character, tab, non-interpreted (<code class="code">\t</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-transparent">character, transparent</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-character_002c-transparent-dummy-_0028_005c_0029_0029">character, transparent dummy (<code class="code">\)</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Dummy-Characters">Dummy Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-characters_002c-end_002dof_002dsentence">characters, end-of-sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-characters_002c-end_002dof_002dsentence-transparent">characters, end-of-sentence transparent</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Sentences">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-characters_002c-hyphenation">characters, hyphenation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-characters_002c-input_002c-and-output-glyphs_002c-compatibility-with-AT_0026T-troff">characters, input, and output glyphs, compatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-characters_002c-invalid-for-trf-request">characters, invalid for <code class="code">trf</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-characters_002c-invalid-input">characters, invalid input</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Identifiers">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-characters_002c-overlapping">characters, overlapping</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-characters_002c-special">characters, special</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Sentences">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-characters_002c-special_002c-list-of-_0028groff_005fchar_00287_0029-man-page_0029">characters, special, list of (<cite class="cite">groff_char<span class="r">(7)</span></cite> man page)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-characters_002c-unnamed_002c-accessing-with-_005cN">characters, unnamed, accessing with <code class="code">\N</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-circle_002c-filled_002c-drawing-_0028_005cD_0027C-_2026_0027_0029">circle, filled, drawing (&lsquo;<samp class="samp">\D'C &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-circle_002c-outlined_002c-drawing-_0028_005cD_0027c-_2026_0027_0029">circle, outlined, drawing (&lsquo;<samp class="samp">\D'c &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-circle_002c-solid_002c-drawing-_0028_005cD_0027C-_2026_0027_0029">circle, solid, drawing (&lsquo;<samp class="samp">\D'C &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-circle_002c-stroked_002c-drawing-_0028_005cD_0027c-_2026_0027_0029">circle, stroked, drawing (&lsquo;<samp class="samp">\D'c &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-class-of-characters-_0028class_0029">class of characters (<code class="code">class</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Classes">Character Classes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-classes_002c-character">classes, character</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Classes">Character Classes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-clearing-input-line-trap-_0028it_002c-itc_0029">clearing input line trap (<code class="code">it</code>, <code class="code">itc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Line-Traps">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-closing-brace-escape-sequence-_0028_005c_007d_0029">closing brace escape sequence (<code class="code">\})</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Conditional-Blocks">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-closing-file-_0028close_0029">closing file (<code class="code">close</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-code-page-1047-output-encoding">code page 1047 output encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-code-page-1047_002c-input-encoding">code page 1047, input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-code_002c-hyphenation-_0028hcode_0029">code, hyphenation (<code class="code">hcode</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-color-name_002c-background_002c-register-_0028_002eM_0029">color name, background, register (<code class="code">.M</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-color-name_002c-fill_002c-register-_0028_002eM_0029">color name, fill, register (<code class="code">.M</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-color-name_002c-stroke_002c-register-_0028_002em_0029">color name, stroke, register (<code class="code">.m</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-color_002c-default">color, default</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-color_002c-fill">color, fill</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-color_002c-stroke">color, stroke</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-colors">colors</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-command-prefix">command prefix</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environment">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-command_002dline-options">command-line options</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-comments">comments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Comments">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-comments-in-device-description-files">comments in device description files</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-comments-in-font-description-files">comments in font description files</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-comments_002c-lining-up-with-tabs">comments, lining up with tabs</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Comments">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-comments_002c-with-ds">comments, with <code class="code">ds</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-common-features">common features</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Common-Features">Common Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-common-name-space-of-macros_002c-diversions_002c-and-strings">common name space of macros, diversions, and strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Identifiers">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-comparison-of-strings">comparison of strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Operators-in-Conditionals">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-comparison-operators">comparison operators</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-compatibility-mode">compatibility mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-compatibility-mode-1">compatibility mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Compatibility-Mode">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-compatibility-mode_002c-and-parameters">compatibility mode, and parameters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Gtroff-Internals">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-complementation_002c-logical">complementation, logical</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-composite-glyph-names">composite glyph names</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-conditional-block_002c-beginning-_0028_005c_007b_0029">conditional block, beginning (<code class="code">\{</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Conditional-Blocks">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-conditional-block_002c-end-_0028_005c_007d_0029">conditional block, end (<code class="code">\}</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Conditional-Blocks">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-conditional-blocks">conditional blocks</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Conditional-Blocks">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-conditional-expressions">conditional expressions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Operators-in-Conditionals">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-conditional-output-for-terminal-_0028TTY_0029">conditional output for terminal (TTY)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Operators-in-Conditionals">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-conditional-page-break-_0028ne_0029">conditional page break (<code class="code">ne</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-conditionals-and-loops">conditionals and loops</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Conditionals-and-Loops">Conditionals and Loops</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-configuring-control-characters">configuring control characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Control-Characters">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-configuring-the-page-length-_0028pl_0029">configuring the page length (<code class="code">pl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-consecutive-hyphenated-lines-_0028hlm_0029">consecutive hyphenated lines (<code class="code">hlm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-constant-glyph-space-mode-_0028cs_0029">constant glyph space mode (<code class="code">cs</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-contents_002c-table-of">contents, table of</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Table-of-Contents">Table of Contents</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-contents_002c-table-of-1">contents, table of</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Leaders">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-continuation_002c-input-line-_0028_005cRET_0029">continuation, input line (<code class="code">\<kbd class="key">RET</kbd></code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-continuation_002c-output-line-_0028_005cc_0029">continuation, output line (<code class="code">\c</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-continue-request_002c-in-a-while-loop"><code class="code">continue</code> request, in a <code class="code">while</code> loop</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#while">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-continued-output-line-register-_0028_002eint_0029">continued output line register (<code class="code">.int</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-continuous-underlining-_0028cu_0029">continuous underlining (<code class="code">cu</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-control-character-_0028_002e_0029">control character (<code class="code">.</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Requests-and-Macros">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-control-character_002c-changing-_0028cc_0029">control character, changing (<code class="code">cc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Control-Characters">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-control-character_002c-no_002dbreak-_0028_0027_0029">control character, no-break (<code class="code">'</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Requests-and-Macros">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-control-character_002c-no_002dbreak_002c-changing-_0028c2_0029">control character, no-break, changing (<code class="code">c2</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Control-Characters">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-control-characters">control characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Control-Characters">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-control-line">control line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Requests-and-Macros">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-control_002c-line">control, line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-control_002c-page">control, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-conventions-for-input">conventions for input</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Conventions">Input Conventions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-conversion-to-basic-units">conversion to basic units</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-copy-mode">copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Copy-Mode">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-copy-mode-1">copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Copy-Mode">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-copy-mode_002c-and-cf-request">copy mode, and <code class="code">cf</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-copy-mode_002c-and-device-request">copy mode, and <code class="code">device</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Postprocessor-Access">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-copy-mode_002c-and-length-request">copy mode, and <code class="code">length</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-copy-mode_002c-and-macro-parameters">copy mode, and macro parameters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Parameters">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-copy-mode_002c-and-output-request">copy mode, and <code class="code">output</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-copy-mode_002c-and-trf-request">copy mode, and <code class="code">trf</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-copy-mode_002c-and-write-request">copy mode, and <code class="code">write</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-copy-mode_002c-and-writec-request">copy mode, and <code class="code">writec</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-copy-mode_002c-and-writem-request">copy mode, and <code class="code">writem</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-copy-mode_002c-and-_005c_0021">copy mode, and <code class="code">\!</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-copy-mode_002c-and-_005c_003f">copy mode, and <code class="code">\?</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Operators-in-Conditionals">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-copy-mode_002c-and-_005c_003f-1">copy mode, and <code class="code">\?</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-copy-mode_002c-and-_005ca">copy mode, and <code class="code">\a</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Leaders">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-copy-mode_002c-and-_005ct">copy mode, and <code class="code">\t</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-copy-mode_002c-and-_005cV">copy mode, and <code class="code">\V</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-copying-environment-_0028evc_0029">copying environment (<code class="code">evc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-correction-between-oblique-and-upright-glyph-_0028_005c_002f_002c-_005c_002c_0029">correction between oblique and upright glyph (<code class="code">\/</code>, <code class="code">\,</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Italic-Corrections">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-correction-between-upright-and-oblique-glyph-_0028_005c_002f_002c-_005c_002c_0029">correction between upright and oblique glyph (<code class="code">\/</code>, <code class="code">\,</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Italic-Corrections">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-correction_002c-italic-_0028_005c_002f_0029">correction, italic (<code class="code">\/</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Italic-Corrections">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-correction_002c-left-italic-_0028_005c_002c_0029">correction, left italic (<code class="code">\,</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Italic-Corrections">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-cover-page-in-_005bms_005d_002c-example-markup">cover page in [<samp class="file">ms</samp>], example markup</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Description-Macros">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-cp-request_002c-and-glyph-definitions"><code class="code">cp</code> request, and glyph definitions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-cq-glyph_002c-at-end-of-sentence"><code class="code">cq</code> glyph, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Sentences">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-cq-glyph_002c-at-end-of-sentence-1"><code class="code">cq</code> glyph, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-creating-alias-for-register-_0028aln_0029">creating alias for register (<code class="code">aln</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Setting-Registers">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-creating-alias_002c-for-diversion-_0028als_0029">creating alias, for diversion (<code class="code">als</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-creating-alias_002c-for-macro-_0028als_0029">creating alias, for macro (<code class="code">als</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-creating-alias_002c-for-string-_0028als_0029">creating alias, for string (<code class="code">als</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-creating-new-characters-_0028char_0029">creating new characters (<code class="code">char</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-credits">credits</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Credits">Credits</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-cs-request_002c-and-font-styles"><code class="code">cs</code> request, and font styles</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-cs-request_002c-and-font-translations"><code class="code">cs</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-cs-request_002c-incompatibilities-with-AT_0026T-troff"><code class="code">cs</code> request, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-cs-request_002c-with-fractional-type-sizes"><code class="code">cs</code> request, with fractional type sizes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-CSTR-_002354-errata">CSTR&nbsp;#54 errata</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-CSTR-_002354-errata-1">CSTR&nbsp;#54 errata</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-CSTR-_002354-errata-2">CSTR&nbsp;#54 errata</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-CSTR-_002354-errata-3">CSTR&nbsp;#54 errata</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-CSTR-_002354-errata-4">CSTR&nbsp;#54 errata</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Type-Size">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-CSTR-_002354-errata-5">CSTR&nbsp;#54 errata</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-CSTR-_002354-erratum_002c-bp-request">CSTR&nbsp;#54 erratum, <code class="code">bp</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-CSTR-_002354-erratum_002c-po-request">CSTR&nbsp;#54 erratum, <code class="code">po</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-CSTR-_002354-erratum_002c-ps-request">CSTR&nbsp;#54 erratum, <code class="code">ps</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Type-Size">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-CSTR-_002354-erratum_002c-sb-register">CSTR&nbsp;#54 erratum, <code class="code">sb</code> register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-CSTR-_002354-erratum_002c-st-register">CSTR&nbsp;#54 erratum, <code class="code">st</code> register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-CSTR-_002354-erratum_002c-yr-register">CSTR&nbsp;#54 erratum, <code class="code">yr</code> register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-CSTR-_002354-erratum_002c-_005cS-escape">CSTR&nbsp;#54 erratum, <code class="code">\S</code> escape</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-CSTR-_002354-erratum_002c-_005cs-escape-sequence">CSTR&nbsp;#54 erratum, <code class="code">\s</code> escape sequence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Type-Size">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-current-directory">current directory</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-current-input-file-name-register-_0028_002eF_0029">current input file name register (<code class="code">.F</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-current-page-number-_0028_0025_0029">current page number (<code class="code">%</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-current-time_002c-hours-_0028hours_0029">current time, hours (<code class="code">hours</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-current-time_002c-minutes-_0028minutes_0029">current time, minutes (<code class="code">minutes</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-current-time_002c-seconds-_0028seconds_0029">current time, seconds (<code class="code">seconds</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-D">D</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-da-request_002c-and-dn-_0028dl_0029"><code class="code">da</code> request, and <code class="code">dn</code> (<code class="code">dl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-da-request_002c-and-warnings"><code class="code">da</code> request, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-da-request_002c-and-warnings-1"><code class="code">da</code> request, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-date_002c-day-of-the-month-register-_0028dy_0029">date, day of the month register (<code class="code">dy</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-date_002c-day-of-the-week-register-_0028dw_0029">date, day of the week register (<code class="code">dw</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-date_002c-month-of-the-year-register-_0028mo_0029">date, month of the year register (<code class="code">mo</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-date_002c-year-register-_0028year_002c-yr_0029">date, year register (<code class="code">year</code>, <code class="code">yr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-day-of-the-month-register-_0028dy_0029">day of the month register (<code class="code">dy</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-day-of-the-week-register-_0028dw_0029">day of the week register (<code class="code">dw</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dd-glyph_002c-at-end-of-sentence"><code class="code">dd</code> glyph, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Sentences">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dd-glyph_002c-at-end-of-sentence-1"><code class="code">dd</code> glyph, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-de-request_002c-and-while"><code class="code">de</code> request, and <code class="code">while</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#while">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-de_002c-de1_002c-dei-requests_002c-and-warnings"><code class="code">de</code>, <code class="code">de1</code>, <code class="code">dei</code> requests, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-debugging">debugging</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-debugging-page-location-traps">debugging page location traps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-decimal-point_002c-as-delimiter">decimal point, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-decrementation_002c-automatic_002c-of-a-register">decrementation, automatic, of a register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Auto_002dincrement">Auto-increment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-default-color">default color</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-default-tab-stops">default tab stops</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-default-units">default units</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Default-Units">Default Units</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-deferred-output">deferred output</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Deferring-Output">Deferring Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-defining-character-_0028char_0029">defining character (<code class="code">char</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-defining-character-class-_0028class_0029">defining character class (<code class="code">class</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Classes">Character Classes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-defining-fallback-character-_0028fchar_002c-fschar_002c-schar_0029">defining fallback character (<code class="code">fchar</code>, <code class="code">fschar</code>, <code class="code">schar</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-defining-glyph-_0028char_0029">defining glyph (<code class="code">char</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-defining-symbol-_0028char_0029">defining symbol (<code class="code">char</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-delimited-arguments_002c-incompatibilities-with-AT_0026T-troff">delimited arguments, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Compatibility-Mode">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-delimiters_002c-for-escape-sequence-arguments">delimiters, for escape sequence arguments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-delimiting-character_002c-for-fields-_0028fc_0029">delimiting character, for fields (<code class="code">fc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Fields">Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-delimiting-escape-sequence-arguments">delimiting escape sequence arguments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-depth_002c-interpolation">depth, interpolation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Calling-Macros">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-depth_002c-of-last-glyph-_0028_002ecdp_0029">depth, of last glyph (<code class="code">.cdp</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-DESC-file-format"><samp class="file">DESC</samp> file format</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-DESC-file_002c-and-font-mounting"><samp class="file">DESC</samp> file, and font mounting</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Positions">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-DESC-file_002c-and-use_005fcharnames_005fin_005fspecial-keyword"><samp class="file">DESC</samp> file, and <code class="code">use_charnames_in_special</code> keyword</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Postprocessor-Access">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-description-file_002c-font">description file, font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-device-description-files_002c-comments">device description files, comments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-device-request_002c-and-copy-mode"><code class="code">device</code> request, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Postprocessor-Access">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-device-resolution">device resolution</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-device-resolution-1">device resolution</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-device-resolution_002c-obtaining-in-the-formatter">device resolution, obtaining in the formatter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-devices-for-output">devices for output</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Output-Device-Intro">Output Device Intro</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dg-glyph_002c-at-end-of-sentence"><code class="code">dg</code> glyph, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Sentences">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dg-glyph_002c-at-end-of-sentence-1"><code class="code">dg</code> glyph, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-di-request_002c-and-warnings"><code class="code">di</code> request, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-di-request_002c-and-warnings-1"><code class="code">di</code> request, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-differences-in-implementation">differences in implementation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Implementation-Differences">Implementation Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-digit_002dwidth-space-_0028_005c0_0029">digit-width space (<code class="code">\0</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-digits_002c-as-delimiters">digits, as delimiters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dimensions_002c-line">dimensions, line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-directories-for-fonts">directories for fonts</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Directories">Font Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-directories-for-macros">directories for macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-directory_002c-current">directory, current</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-directory_002c-for-tmac-files">directory, for tmac files</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-directory_002c-home">directory, home</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-directory_002c-platform_002dspecific">directory, platform-specific</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-directory_002c-site_002dlocal">directory, site-local</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-directory_002c-site_002dlocal-1">directory, site-local</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Directories">Font Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-disabling-hyphenation-_0028_005c_0025_0029">disabling hyphenation (<code class="code">\%</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-disabling-_005c-_0028eo_0029">disabling <code class="code">\</code> (<code class="code">eo</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Escape-Sequences">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-discardable-horizontal-space">discardable horizontal space</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-displays">displays</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Displays-and-Keeps">Displays and Keeps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-displays-_005bms_005d">displays [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-keeps-and-displays">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-displays_002c-and-footnotes-_005bms_005d">displays, and footnotes [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Footnotes">ms Footnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-distance-to-next-vertical-position-trap-register-_0028_002et_0029">distance to next vertical position trap register (<code class="code">.t</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversion">diversion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Deferring-Output">Deferring Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversion-name-register-_0028_002ez_0029">diversion name register (<code class="code">.z</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversion-trap_002c-setting-_0028dt_0029">diversion trap, setting (<code class="code">dt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversion-Traps">Diversion Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversion-traps">diversion traps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversion-Traps">Diversion Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversion_002c-appending-to-_0028da_002c-boxa_0029">diversion, appending to (<code class="code">da</code>, <code class="code">boxa</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversion_002c-beginning-_0028di_002c-box_0029">diversion, beginning (<code class="code">di</code>, <code class="code">box</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversion_002c-creating-alias-for-_0028als_0029">diversion, creating alias for (<code class="code">als</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversion_002c-ending-_0028di_002c-box_0029">diversion, ending (<code class="code">di</code>, <code class="code">box</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversion_002c-nested">diversion, nested</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversion_002c-removing-_0028rm_0029">diversion, removing (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversion_002c-removing-alias-for-_0028rm_0029">diversion, removing alias for (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversion_002c-renaming-_0028rn_0029">diversion, renaming (<code class="code">rn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversion_002c-stripping-final-newline">diversion, stripping final newline</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Punning-Names">Punning Names</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversion_002c-top_002dlevel">diversion, top-level</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversion_002c-top_002dlevel_002c-and-bp">diversion, top-level, and <code class="code">bp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversion_002c-top_002dlevel_002c-and-_005c_0021">diversion, top-level, and <code class="code">\!</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversion_002c-top_002dlevel_002c-and-_005c_003f">diversion, top-level, and <code class="code">\?</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversion_002c-unformatting-_0028asciify_0029">diversion, unformatting (<code class="code">asciify</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversion_002c-vertical-position-in_002c-register-_0028_002ed_0029">diversion, vertical position in, register (<code class="code">.d</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversions">diversions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversions-1">diversions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Punning-Names">Punning Names</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversions_002c-and-traps">diversions, and traps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-diversions_002c-shared-name-space-with-macros-and-strings">diversions, shared name space with macros and strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Identifiers">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-division_002c-truncating">division, truncating</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dl-register_002c-and-da-_0028boxa_0029"><code class="code">dl</code> register, and <code class="code">da</code> (<code class="code">boxa</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dn-register_002c-and-da-_0028boxa_0029"><code class="code">dn</code> register, and <code class="code">da</code> (<code class="code">boxa</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-document-description-macros_002c-_005bms_005d">document description macros, [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Description-Macros">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-document-formats">document formats</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Document-Formats">Document Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-documents_002c-multi_002dfile">documents, multi-file</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-documents_002c-structuring-the-source-of">documents, structuring the source of</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Invoking-Requests">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dot_002c-as-delimiter">dot, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-double-quote_002c-embedding-in-a-macro-argument">double quote, embedding in a macro argument</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Calling-Macros">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-double-quotes_002c-trailing_002c-in-strings">double quotes, trailing, in strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-double_002dspacing-_0028ls_0029">double-spacing (<code class="code">ls</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Spacing">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-double_002dspacing-_0028vs_002c-pvs_0029">double-spacing (<code class="code">vs</code>, <code class="code">pvs</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Vertical-Spacing">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-down_002dcasing-a-string-_0028stringdown_0029">down-casing a string (<code class="code">stringdown</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-drawing-a-filled-circle-_0028_005cD_0027C-_2026_0027_0029">drawing a filled circle (&lsquo;<samp class="samp">\D'C &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-drawing-a-filled-ellipse-_0028_005cD_0027E-_2026_0027_0029">drawing a filled ellipse (&lsquo;<samp class="samp">\D'E &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-drawing-a-filled-polygon-_0028_005cD_0027P-_2026_0027_0029">drawing a filled polygon (&lsquo;<samp class="samp">\D'P &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-drawing-a-line-_0028_005cD_0027l-_2026_0027_0029">drawing a line (&lsquo;<samp class="samp">\D'l &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-drawing-a-solid-circle-_0028_005cD_0027C-_2026_0027_0029">drawing a solid circle (&lsquo;<samp class="samp">\D'C &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-drawing-a-solid-ellipse-_0028_005cD_0027E-_2026_0027_0029">drawing a solid ellipse (&lsquo;<samp class="samp">\D'E &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-drawing-a-solid-polygon-_0028_005cD_0027P-_2026_0027_0029">drawing a solid polygon (&lsquo;<samp class="samp">\D'P &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-drawing-a-spline-_0028_005cD_0027_007e-_2026_0027_0029">drawing a spline (&lsquo;<samp class="samp">\D'~ &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-drawing-a-stroked-circle-_0028_005cD_0027c-_2026_0027_0029">drawing a stroked circle (&lsquo;<samp class="samp">\D'c &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-drawing-a-stroked-ellipse-_0028_005cD_0027e-_2026_0027_0029">drawing a stroked ellipse (&lsquo;<samp class="samp">\D'e &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-drawing-a-stroked-polygon-_0028_005cD_0027p-_2026_0027_0029">drawing a stroked polygon (&lsquo;<samp class="samp">\D'p &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-drawing-an-arc-_0028_005cD_0027a-_2026_0027_0029">drawing an arc (&lsquo;<samp class="samp">\D'a &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-drawing-an-outlined-circle-_0028_005cD_0027c-_2026_0027_0029">drawing an outlined circle (&lsquo;<samp class="samp">\D'c &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-drawing-an-outlined-ellipse-_0028_005cD_0027e-_2026_0027_0029">drawing an outlined ellipse (&lsquo;<samp class="samp">\D'e &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-drawing-an-outlined-polygon-_0028_005cD_0027p-_2026_0027_0029">drawing an outlined polygon (&lsquo;<samp class="samp">\D'p &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-drawing-horizontal-lines-_0028_005cl_0029">drawing horizontal lines (<code class="code">\l</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-drawing-position">drawing position</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-drawing-position_002c-vertical-_0028nl_0029">drawing position, vertical (<code class="code">nl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-drawing-requests">drawing requests</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-drawing-vertical-lines-_0028_005cL_0029">drawing vertical lines (<code class="code">\L</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ds-request_002c-and-comments"><code class="code">ds</code> request, and comments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ds-request_002c-and-double-quotes"><code class="code">ds</code> request, and double quotes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ds-request_002c-and-leading-spaces"><code class="code">ds</code> request, and leading spaces</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ds_002c-ds1-requests_002c-and-comments"><code class="code">ds</code>, <code class="code">ds1</code> requests, and comments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Comments">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ds_002c-ds1-requests_002c-and-warnings"><code class="code">ds</code>, <code class="code">ds1</code> requests, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dummy-character-_0028_005c_0026_0029">dummy character (<code class="code">\&amp;</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Dummy-Characters">Dummy Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dummy-character-_0028_005c_0026_0029_002c-as-control-character-suppressor">dummy character (<code class="code">\&amp;</code>), as control character suppressor</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Requests-and-Macros">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dummy-character-_0028_005c_0026_0029_002c-effect-on-kerning">dummy character (<code class="code">\&amp;</code>), effect on kerning</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Ligatures-and-Kerning">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dummy-character-_0028_005c_0026_0029_002c-effect-on-_005cl-escape-sequence">dummy character (<code class="code">\&amp;</code>), effect on <code class="code">\l</code> escape sequence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dummy-character_002c-transparent-_0028_005c_0029_0029">dummy character, transparent (<code class="code">\)</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Dummy-Characters">Dummy Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dummy-environment_002c-used-by-_005cw-escape-sequence">dummy environment, used by <code class="code">\w</code> escape sequence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dumping-environments-_0028pev_0029">dumping environments (<code class="code">pev</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dumping-page-location-traps-_0028ptr_0029">dumping page location traps (<code class="code">ptr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dumping-registers-_0028pnr_0029">dumping registers (<code class="code">pnr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-dumping-symbol-table-_0028pm_0029">dumping symbol table (<code class="code">pm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-E">E</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-EBCDIC-output-encoding"><abbr class="acronym">EBCDIC</abbr> output encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-EBCDIC_002c-input-encoding"><abbr class="acronym">EBCDIC</abbr>, input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ejection_002c-page">ejection, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ejection_002c-page-1">ejection, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ejection_002c-page-2">ejection, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#The-Implicit-Page-Trap">The Implicit Page Trap</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ejection_002c-page_002c-of-final-page">ejection, page, of final page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#End_002dof_002dinput-Traps">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ejection_002c-page_002c-prevented-by-vpt">ejection, page, prevented by <code class="code">vpt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Vertical-Position-Traps">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-el-request_002c-and-warnings"><code class="code">el</code> request, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ellipse_002c-filled_002c-drawing-_0028_005cD_0027E-_2026_0027_0029">ellipse, filled, drawing (&lsquo;<samp class="samp">\D'E &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ellipse_002c-outlined_002c-drawing-_0028_005cD_0027e-_2026_0027_0029">ellipse, outlined, drawing (&lsquo;<samp class="samp">\D'e &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ellipse_002c-solid_002c-drawing-_0028_005cD_0027E-_2026_0027_0029">ellipse, solid, drawing (&lsquo;<samp class="samp">\D'E &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ellipse_002c-stroked_002c-drawing-_0028_005cD_0027e-_2026_0027_0029">ellipse, stroked, drawing (&lsquo;<samp class="samp">\D'e &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-em-glyph_002c-and-cflags"><code class="code">em</code> glyph, and <code class="code">cflags</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-em-scaling-unit-_0028m_0029">em scaling unit (<code class="code">m</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-embolding-of-special-fonts">embolding of special fonts</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-empty-line">empty line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Breaking">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-en-scaling-unit-_0028n_0029">en scaling unit (<code class="code">n</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-enabling-vertical-position-traps-_0028vpt_0029">enabling vertical position traps (<code class="code">vpt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Vertical-Position-Traps">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-encoding_002c-input_002c-code-page-1047">encoding, input, code page 1047</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-encoding_002c-input_002c-EBCDIC">encoding, input, <abbr class="acronym">EBCDIC</abbr></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-encoding_002c-input_002c-Latin_002d1-_0028ISO-8859_002d1_0029">encoding, input, <span class="w-nolinebreak-text">Latin-1</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-1</span><!-- /@w -->)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-encoding_002c-input_002c-Latin_002d2-_0028ISO-8859_002d2_0029">encoding, input, <span class="w-nolinebreak-text">Latin-2</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-2</span><!-- /@w -->)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-encoding_002c-input_002c-Latin_002d5-_0028ISO-8859_002d9_0029">encoding, input, <span class="w-nolinebreak-text">Latin-5</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-9</span><!-- /@w -->)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-encoding_002c-input_002c-Latin_002d9-_0028ISO-8859_002d15_0029">encoding, input, <span class="w-nolinebreak-text">Latin-9</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-15</span><!-- /@w -->)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-encoding_002c-output_002c-ASCII">encoding, output, <abbr class="acronym">ASCII</abbr></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-encoding_002c-output_002c-code-page-1047">encoding, output, code page 1047</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-encoding_002c-output_002c-EBCDIC">encoding, output, <abbr class="acronym">EBCDIC</abbr></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-encoding_002c-output_002c-ISO-646">encoding, output, ISO&nbsp;646</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-encoding_002c-output_002c-Latin_002d1-_0028ISO-8859_002d1_0029">encoding, output, <span class="w-nolinebreak-text">Latin-1</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-1</span><!-- /@w -->)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-encoding_002c-output_002c-UTF_002d8">encoding, output, <span class="w-nolinebreak-text">UTF-8</span><!-- /@w --></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-end-of-conditional-block-_0028_005c_007d_0029">end of conditional block (<code class="code">\}</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Conditional-Blocks">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-end_002dof_002dinput-macro-_0028em_0029">end-of-input macro (<code class="code">em</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#End_002dof_002dinput-Traps">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-end_002dof_002dinput-trap_002c-setting-_0028em_0029">end-of-input trap, setting (<code class="code">em</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#End_002dof_002dinput-Traps">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-end_002dof_002dinput-traps">end-of-input traps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#End_002dof_002dinput-Traps">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-end_002dof_002dsentence-characters">end-of-sentence characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Sentences">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-end_002dof_002dsentence-characters-1">end-of-sentence characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-end_002dof_002dsentence-transparent-characters">end-of-sentence transparent characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Sentences">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ending-diversion-_0028di_002c-box_0029">ending diversion (<code class="code">di</code>, <code class="code">box</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-endnotes">endnotes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Footnotes-and-Endnotes">Footnotes and Endnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-environment">environment</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Deferring-Output">Deferring Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-environment-availability-and-naming_002c-incompatibilities-with">environment availability and naming, incompatibilities with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-environment-number_002fname-register-_0028_002eev_0029">environment number/name register (<code class="code">.ev</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-environment-variables">environment variables</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environment">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-environment_002c-copying-_0028evc_0029">environment, copying (<code class="code">evc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-environment_002c-dimensions-of-last-glyph-_0028_002ew_002c-_002echt_002c-_002ecdp_002c-_002ecsk_0029">environment, dimensions of last glyph (<code class="code">.w</code>, <code class="code">.cht</code>, <code class="code">.cdp</code>, <code class="code">.csk</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-environment_002c-dummy_002c-used-by-_005cw-escape-sequence">environment, dummy, used by <code class="code">\w</code> escape sequence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-environment_002c-previous-line-length-_0028_002en_0029">environment, previous line length (<code class="code">.n</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-environment_002c-switching-_0028ev_0029">environment, switching (<code class="code">ev</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-environments">environments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-environments_002c-dumping-_0028pev_0029">environments, dumping (<code class="code">pev</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-equality-operator">equality operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-equation-example-_005bms_005d">equation example [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-equations-_005bms_005d">equations [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-escape-character_002c-changing-_0028ec_0029">escape character, changing (<code class="code">ec</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Escape-Sequences">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-escape-character_002c-formatting-_0028_005ce_0029">escape character, formatting (<code class="code">\e</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Escape-Sequences">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-escape-character_002c-while-defining-glyph">escape character, while defining glyph</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-escape-sequence">escape sequence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Formatter-Instructions">Formatter Instructions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-escape-sequence-argument-delimiters">escape sequence argument delimiters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-escape-sequences">escape sequences</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Escape-Sequences">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-escape-sequences_002c-brace-_0028_005c_007b_002c-_005c_007d_0029">escape sequences, brace (<code class="code">\{</code>, <code class="code">\}</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Conditional-Blocks">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-escaping-newline-characters_002c-in-strings">escaping newline characters, in strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ex-request_002c-use-in-debugging"><code class="code">ex</code> request, use in debugging</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ex-request_002c-used-with-nx-and-rd"><code class="code">ex</code> request, used with <code class="code">nx</code> and <code class="code">rd</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-example-markup_002c-bulleted-list-_005bms_005d">example markup, bulleted list [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Lists-in-ms">Lists in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-example-markup_002c-cover-page-in-_005bms_005d">example markup, cover page in [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Description-Macros">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-example-markup_002c-glossary_002dstyle-list-_005bms_005d">example markup, glossary-style list [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Lists-in-ms">Lists in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-example-markup_002c-numbered-list-_005bms_005d">example markup, numbered list [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Lists-in-ms">Lists in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-examples-of-invocation">examples of invocation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Invocation-Examples">Invocation Examples</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-exiting-_0028ex_0029">exiting (<code class="code">ex</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-expansion-of-strings-_0028_005c_002a_0029">expansion of strings (<code class="code">\*</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-explicit-hyphen-_0028_005c_0025_0029">explicit hyphen (<code class="code">\%</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-explicit-hyphenation">explicit hyphenation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-expression_002c-limitation-of-logical-not-in">expression, limitation of logical not in</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-expression_002c-order-of-evaluation">expression, order of evaluation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-expressions_002c-and-register-format">expressions, and register format</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Assigning-Register-Formats">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-expressions_002c-and-space-characters">expressions, and space characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-expressions_002c-conditional">expressions, conditional</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Operators-in-Conditionals">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-expressions_002c-numeric">expressions, numeric</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-extra-post_002dvertical-line-space-_0028_005cx_0029">extra post-vertical line space (<code class="code">\x</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Vertical-Spacing">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-extra-post_002dvertical-line-space-register-_0028_002ea_0029">extra post-vertical line space register (<code class="code">.a</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Spacing">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-extra-pre_002dvertical-line-space-_0028_005cx_0029">extra pre-vertical line space (<code class="code">\x</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Vertical-Spacing">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-extra-spaces-between-words">extra spaces between words</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Adjustment">Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-extreme-values-representable-with-Roman-numerals">extreme values representable with Roman numerals</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Assigning-Register-Formats">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-extremum-operators-_0028_003e_003f_002c-_003c_003f_0029">extremum operators (<code class="code">&gt;?</code>, <code class="code">&lt;?</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-F">F</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-f-scaling-unit"><code class="code">f</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-factor_002c-zoom_002c-of-a-font-_0028fzoom_0029">factor, zoom, of a font (<code class="code">fzoom</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fallback-character_002c-defining-_0028fchar_002c-fschar_002c-schar_0029">fallback character, defining (<code class="code">fchar</code>, <code class="code">fschar</code>, <code class="code">schar</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fallback-glyph_002c-removing-definition-_0028rchar_002c-rfschar_0029">fallback glyph, removing definition (<code class="code">rchar</code>, <code class="code">rfschar</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fam-request_002c-and-changing-fonts"><code class="code">fam</code> request, and changing fonts</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-families_002c-font">families, font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-family_002c-font">family, font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-features_002c-common">features, common</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Common-Features">Common Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fi-request_002c-causing-implicit-break"><code class="code">fi</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-field-delimiting-character-_0028fc_0029">field delimiting character (<code class="code">fc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Fields">Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-field-padding-character-_0028fc_0029">field padding character (<code class="code">fc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Fields">Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fields">fields</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Fields">Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fields_002c-and-tabs">fields, and tabs</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-figure-space-_0028_005c0_0029">figure space (<code class="code">\0</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-figures-_005bms_005d">figures [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-file-formats">file formats</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#File-Formats">File Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-file-names_002c-breaking-_0028_005c_003a_0029">file names, breaking (<code class="code">\:</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-file_002c-appending-to-_0028opena_0029">file, appending to (<code class="code">opena</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-file_002c-closing-_0028close_0029">file, closing (<code class="code">close</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-file_002c-font-description">file, font description</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-file_002c-inclusion-_0028so_0029">file, inclusion (<code class="code">so</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-file_002c-macro_002c-search-path">file, macro, search path</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-file_002c-opening-_0028open_0029">file, opening (<code class="code">open</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-file_002c-processing-next-_0028nx_0029">file, processing next (<code class="code">nx</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-file_002c-writing-to-_0028write_002c-writec_0029">file, writing to (<code class="code">write</code>, <code class="code">writec</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-files_002c-font">files, font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Device-and-Font-Description-Files">Device and Font Description Files</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fill-color">fill color</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fill-color-name-register-_0028_002eM_0029">fill color name register (<code class="code">.M</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fill-mode-_0028fi_0029_002c-enabling">fill mode (<code class="code">fi</code>), enabling</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fill-mode_002c-and-_005cc">fill mode, and <code class="code">\c</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fill-mode_002c-disabling">fill mode, disabling</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-filled-circle_002c-drawing-_0028_005cD_0027C-_2026_0027_0029">filled circle, drawing (&lsquo;<samp class="samp">\D'C &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-filled-ellipse_002c-drawing-_0028_005cD_0027E-_2026_0027_0029">filled ellipse, drawing (&lsquo;<samp class="samp">\D'E &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-filled-polygon_002c-drawing-_0028_005cD_0027P-_2026_0027_0029">filled polygon, drawing (&lsquo;<samp class="samp">\D'P &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-filling">filling</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Filling">Filling</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-filling-and-adjustment_002c-manipulating">filling and adjustment, manipulating</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-filling-of-output_002c-disabling-_0028nf_0029">filling of output, disabling (<code class="code">nf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-filling-of-output_002c-enabling-_0028fi_0029">filling of output, enabling (<code class="code">fi</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-filling_002c-and-break-warnings">filling, and <code class="code">break</code> warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-filling_002c-and-inter_002dsentence-space">filling, and inter-sentence space</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-final-newline_002c-stripping-in-diversions">final newline, stripping in diversions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Punning-Names">Punning Names</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fl-request_002c-causing-implicit-break"><code class="code">fl</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-floating-keep">floating keep</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Displays-and-Keeps">Displays and Keeps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-flush-output-_0028fl_0029">flush output (<code class="code">fl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font">font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-aliasing-with-third-argument-to-fp-request">font aliasing with third argument to <code class="code">fp</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Positions">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-description-file">font description file</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-description-file-format">font description file format</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-description-file_002c-format">font description file, format</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-description-files_002c-comments">font description files, comments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-directories">font directories</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Directories">Font Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-families">font families</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-family">font family</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-family_002c-changing-_0028fam_002c-_005cF_0029">font family, changing (<code class="code">fam</code>, <code class="code">\F</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-file_002c-format">font file, format</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-files">font files</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Device-and-Font-Description-Files">Device and Font Description Files</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-for-underlining-_0028uf_0029">font for underlining (<code class="code">uf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-height_002c-changing-_0028_005cH_0029">font height, changing (<code class="code">\H</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-metrics">font metrics</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-mounting_002c-automatic">font mounting, automatic</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-path">font path</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Directories">Font Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-position-register-_0028_002ef_0029">font position register (<code class="code">.f</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Positions">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-positions">font positions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Positions">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-slant_002c-changing-_0028_005cS_0029">font slant, changing (<code class="code">\S</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-style">font style</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-style_002c-abstract">font style, abstract</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-style_002c-abstract_002c-setting-up-_0028sty_0029">font style, abstract, setting up (<code class="code">sty</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-styles">font styles</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font-translation-_0028ftr_0029">font translation (<code class="code">ftr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font_002c-magnification-_0028fzoom_0029">font, magnification (<code class="code">fzoom</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font_002c-mounting-_0028fp_0029">font, mounting (<code class="code">fp</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Positions">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font_002c-optical-size">font, optical size</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font_002c-previous_002c-selecting-_0028_005cf_005b_005d_002c-_005cfP_0029">font, previous, selecting (<code class="code">\f[]</code>, <code class="code">\fP</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font_002c-previous_002c-slecting-_0028ft_0029">font, previous, slecting (<code class="code">ft</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font_002c-selection">font, selection</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font_002c-special">font, special</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font_002c-text">font, text</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font_002c-unstyled">font, unstyled</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-font_002c-zoom-factor-_0028fzoom_0029">font, zoom factor (<code class="code">fzoom</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fonts_002c-artificial">fonts, artificial</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fonts_002c-changing-_0028ft_002c-_005cf_0029">fonts, changing (<code class="code">ft</code>, <code class="code">\f</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fonts_002c-searching">fonts, searching</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Directories">Font Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fonts_002c-special">fonts, special</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Special-Fonts">Special Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-footers">footers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-footers-1">footers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-footers-_005bms_005d">footers [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Headers-and-Footers">ms Headers and Footers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-footnote-marker-_005bms_005d">footnote marker [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Footnotes">ms Footnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-footnotes">footnotes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Footnotes-and-Endnotes">Footnotes and Endnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-footnotes-_005bms_005d">footnotes [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Footnotes">ms Footnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-footnotes_002c-and-displays-_005bms_005d">footnotes, and displays [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Footnotes">ms Footnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-footnotes_002c-and-keeps-_005bms_005d">footnotes, and keeps [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Footnotes">ms Footnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-form-letters">form letters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-format-of-font-description-file">format of font description file</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-format-of-font-description-files">format of font description files</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-format-of-font-files">format of font files</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-format-of-register-_0028_005cg_0029">format of register (<code class="code">\g</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Assigning-Register-Formats">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-format_002c-paper">format, paper</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Paper-Format">Paper Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-formats_002c-file">formats, file</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#File-Formats">File Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-formatter-instructions">formatter instructions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Formatter-Instructions">Formatter Instructions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-formatting-a-backslash-glyph-_0028_005c_005brs_005d_0029">formatting a backslash glyph (<code class="code">\[rs]</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Escape-Sequences">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-formatting-a-title-line-_0028tl_0029">formatting a title line (<code class="code">tl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-formatting-the-escape-character-_0028_005ce_0029">formatting the escape character (<code class="code">\e</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Escape-Sequences">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-formatting-the-time">formatting the time</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fp-request_002c-and-font-translations"><code class="code">fp</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fp-request_002c-incompatibilities-with-AT_0026T-troff"><code class="code">fp</code> request, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fractional-point-sizes">fractional point sizes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fractional-point-sizes-1">fractional point sizes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fractional-type-sizes">fractional type sizes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fractional-type-sizes-1">fractional type sizes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fractional-type-sizes-in-ms-macros">fractional type sizes in <samp class="file">ms</samp> macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Differences-from-AT_0026T-ms">Differences from AT&amp;T ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-French-spacing">French spacing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Sentences">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fspecial-request_002c-and-font-styles"><code class="code">fspecial</code> request, and font styles</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fspecial-request_002c-and-font-translations"><code class="code">fspecial</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fspecial-request_002c-and-glyph-search-order"><code class="code">fspecial</code> request, and glyph search order</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-fspecial-request_002c-and-imitating-bold"><code class="code">fspecial</code> request, and imitating bold</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ft-request_002c-and-font-translations"><code class="code">ft</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-full_002dservice-macro-package">full-service macro package</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Major-Macro-Packages">Major Macro Packages</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-G">G</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-geometry_002c-page">geometry, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-GGL-_0028groff-glyph-list_0029">GGL (<code class="code">groff</code> glyph list)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-GGL-_0028groff-glyph-list_0029-1">GGL (<code class="code">groff</code> glyph list)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Classes">Character Classes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glossary_002dstyle-list_002c-example-markup-_005bms_005d">glossary-style list, example markup [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Lists-in-ms">Lists in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyph">glyph</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyph-for-line-drawing">glyph for line drawing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyph-names_002c-composite">glyph names, composite</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyph-pile-_0028_005cb_0029">glyph pile (<code class="code">\b</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyph-properties-_0028cflags_0029">glyph properties (<code class="code">cflags</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyph_002c-box-rule-_0028_005c_005bbr_005d_0029">glyph, box rule (<code class="code">\[br]</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyph_002c-constant-space">glyph, constant space</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyph_002c-defining-_0028char_0029">glyph, defining (<code class="code">char</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyph_002c-distinguished-from-character">glyph, distinguished from character</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyph_002c-for-line-drawing">glyph, for line drawing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyph_002c-for-margins-_0028mc_0029">glyph, for margins (<code class="code">mc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyph_002c-last_002c-dimensions-_0028_002ew_002c-_002echt_002c-_002ecdp_002c-_002ecsk_0029">glyph, last, dimensions (<code class="code">.w</code>, <code class="code">.cht</code>, <code class="code">.cdp</code>, <code class="code">.csk</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyph_002c-leader-repetition-_0028lc_0029">glyph, leader repetition (<code class="code">lc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Leaders">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyph_002c-numbered-_0028_005cN_0029">glyph, numbered (<code class="code">\N</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyph_002c-numbered-_0028_005cN_0029-1">glyph, numbered (<code class="code">\N</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyph_002c-removing-definition-_0028rchar_002c-rfschar_0029">glyph, removing definition (<code class="code">rchar</code>, <code class="code">rfschar</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyph_002c-soft-hyphen-_0028hy_0029">glyph, soft hyphen (<code class="code">hy</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyph_002c-tab-repetition-_0028tc_0029">glyph, tab repetition (<code class="code">tc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyph_002c-underscore-_0028_005c_005bru_005d_0029">glyph, underscore (<code class="code">\[ru]</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyphs_002c-available_002c-list-of-_0028groff_005fchar_00287_0029-man-page_0029">glyphs, available, list of (<cite class="cite">groff_char<span class="r">(7)</span></cite> man page)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyphs_002c-output_002c-and-input-characters_002c-compatibility-with-AT_0026T-troff">glyphs, output, and input characters, compatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyphs_002c-overstriking-_0028_005co_0029">glyphs, overstriking (<code class="code">\o</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyphs_002c-unnamed">glyphs, unnamed</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-glyphs_002c-unnamed_002c-accessing-with-_005cN">glyphs, unnamed, accessing with <code class="code">\N</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-GNU-troff_002c-identification-register-_0028_002eg_0029">GNU <code class="code">troff</code>, identification register (<code class="code">.g</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-GNU-troff_002c-PID-register-_0028_0024_0024_0029">GNU <code class="code">troff</code>, PID register (<code class="code">$$</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-GNU-troff_002c-process-ID-register-_0028_0024_0024_0029">GNU <code class="code">troff</code>, process ID register (<code class="code">$$</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-GNU_002dspecific-register-_0028_002eg_0029">GNU-specific register (<code class="code">.g</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-graphic-renditions">graphic renditions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-greater-than-_0028or-equal-to_0029-operator">greater than (or equal to) operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-groff-capabilities"><code class="code">groff</code> capabilities</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#groff-Capabilities"><code class="code">groff</code> Capabilities</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-groff-glyph-list-_0028GGL_0029"><code class="code">groff</code> glyph list (GGL)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-groff-glyph-list-_0028GGL_0029-1"><code class="code">groff</code> glyph list (GGL)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Classes">Character Classes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-groff-invocation"><code class="code">groff</code> invocation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Invoking-groff">Invoking groff</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-groff_002c-and-pi-request"><code class="code">groff</code>, and <code class="code">pi</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-groff_002d_002d_002dwhat-is-it_003f"><code class="code">groff</code>&mdash;what is it?</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#What-Is-groff_003f">What Is <code class="code">groff</code>?</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-GROFF_005fBIN_005fPATH_002c-environment-variable"><code>GROFF_BIN_PATH<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environment">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-GROFF_005fCOMMAND_005fPREFIX_002c-environment-variable"><code>GROFF_COMMAND_PREFIX<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environment">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-GROFF_005fENCODING_002c-environment-variable"><code>GROFF_ENCODING<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environment">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-GROFF_005fFONT_005fPATH_002c-environment-variable"><code>GROFF_FONT_PATH<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environment">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-GROFF_005fFONT_005fPATH_002c-environment-variable-1"><code>GROFF_FONT_PATH<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Directories">Font Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-GROFF_005fTMAC_005fPATH_002c-environment-variable"><code>GROFF_TMAC_PATH<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environment">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-GROFF_005fTMAC_005fPATH_002c-environment-variable-1"><code>GROFF_TMAC_PATH<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-GROFF_005fTMPDIR_002c-environment-variable"><code>GROFF_TMPDIR<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environment">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-GROFF_005fTYPESETTER_002c-environment-variable"><code>GROFF_TYPESETTER<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environment">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-grohtml_002c-the-program"><code class="code">grohtml</code>, the program</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-gtroff_002c-interactive-use"><code class="code">gtroff</code>, interactive use</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-gtroff_002c-output"><code class="code">gtroff</code>, output</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#gtroff-Output">gtroff Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-gtroff_002c-reference"><code class="code">gtroff</code>, reference</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#GNU-troff-Reference">GNU troff Reference</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-H">H</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hair-space-_0028_005c_005e_0029">hair space (<code class="code">\^</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hcode-request_002c-and-glyph-definitions"><code class="code">hcode</code> request, and glyph definitions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-headers">headers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-headers-1">headers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-headers-_005bms_005d">headers [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Headers-and-Footers">ms Headers and Footers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-height_002c-font_002c-changing-_0028_005cH_0029">height, font, changing (<code class="code">\H</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-height_002c-of-last-glyph-_0028_002echt_0029">height, of last glyph (<code class="code">.cht</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-high_002dwater-mark-register-_0028_002eh_0029">high-water mark register (<code class="code">.h</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-home-directory">home directory</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-horizontal-discardable-space">horizontal discardable space</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-horizontal-input-line-position-register-_0028hp_0029">horizontal input line position register (<code class="code">hp</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-horizontal-input-line-position_002c-saving-_0028_005ck_0029">horizontal input line position, saving (<code class="code">\k</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-horizontal-line_002c-drawing-_0028_005cl_0029">horizontal line, drawing (<code class="code">\l</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-horizontal-motion-_0028_005ch_0029">horizontal motion (<code class="code">\h</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-horizontal-motion-quantum">horizontal motion quantum</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-horizontal-motion-quantum-register-_0028_002eH_0029">horizontal motion quantum register (<code class="code">.H</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Motion-Quanta">Motion Quanta</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-horizontal-output-line-position-register-_0028_002ek_0029">horizontal output line position register (<code class="code">.k</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-horizontal-resolution">horizontal resolution</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-horizontal-resolution-register-_0028_002eH_0029">horizontal resolution register (<code class="code">.H</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Motion-Quanta">Motion Quanta</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-horizontal-space-_0028_005ch_0029">horizontal space (<code class="code">\h</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-horizontal-space_002c-unformatting">horizontal space, unformatting</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Punning-Names">Punning Names</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-horizontal-tab-character">horizontal tab character</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Leaders">Tabs and Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hours_002c-current-time-_0028hours_0029">hours, current time (<code class="code">hours</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hpf-request_002c-and-hyphenation-language"><code class="code">hpf</code> request, and hyphenation language</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hw-request_002c-and-hy-restrictions"><code class="code">hw</code> request, and <code class="code">hy</code> restrictions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hw-request_002c-and-hyphenation-language"><code class="code">hw</code> request, and hyphenation language</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hy-glyph_002c-and-cflags"><code class="code">hy</code> glyph, and <code class="code">cflags</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphen_002c-explicit-_0028_005c_0025_0029">hyphen, explicit (<code class="code">\%</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenated-lines_002c-consecutive-_0028hlm_0029">hyphenated lines, consecutive (<code class="code">hlm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenating-characters">hyphenating characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation">hyphenation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Hyphenation">Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation-character-_0028_005c_0025_0029">hyphenation character (<code class="code">\%</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation-code-_0028hcode_0029">hyphenation code (<code class="code">hcode</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation-consecutive-line-count-register-_0028_002ehlc_0029">hyphenation consecutive line count register (<code class="code">.hlc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation-consecutive-line-limit-register-_0028_002ehlm_0029">hyphenation consecutive line limit register (<code class="code">.hlm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation-exceptions">hyphenation exceptions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation-language-register-_0028_002ehla_0029">hyphenation language register (<code class="code">.hla</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation-margin-_0028hym_0029">hyphenation margin (<code class="code">hym</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation-margin-register-_0028_002ehym_0029">hyphenation margin register (<code class="code">.hym</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation-mode-register-_0028_002ehy_0029">hyphenation mode register (<code class="code">.hy</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation-parameters_002c-automatic">hyphenation parameters, automatic</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation-pattern-files">hyphenation pattern files</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation-patterns-_0028hpf_0029">hyphenation patterns (<code class="code">hpf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation-space-_0028hys_0029">hyphenation space (<code class="code">hys</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation-space-adjustment-threshold">hyphenation space adjustment threshold</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation-space-adjustment-threshold-register-_0028_002ehys_0029">hyphenation space adjustment threshold register (<code class="code">.hys</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation_002c-automatic">hyphenation, automatic</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation_002c-disabling-_0028_005c_0025_0029">hyphenation, disabling (<code class="code">\%</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation_002c-explicit">hyphenation, explicit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation_002c-incompatibilities-with-AT_0026T-troff">hyphenation, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation_002c-manipulating">hyphenation, manipulating</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-hyphenation_002c-manual">hyphenation, manual</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-I">I</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-i-scaling-unit"><code class="code">i</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-i_002fo">i/o</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-IBM-code-page-1047-input-encoding">IBM code page 1047 input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-IBM-code-page-1047-output-encoding">IBM code page 1047 output encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-identifiers">identifiers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Identifiers">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-identifiers_002c-undefined">identifiers, undefined</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Identifiers">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ie-request_002c-and-font-translations"><code class="code">ie</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ie-request_002c-and-warnings"><code class="code">ie</code> request, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ie-request_002c-operators-to-use-with"><code class="code">ie</code> request, operators to use with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Operators-in-Conditionals">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-if-request_002c-and-font-translations"><code class="code">if</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-if-request_002c-and-the-_0021-operator"><code class="code">if</code> request, and the &lsquo;<samp class="samp">!</samp>&rsquo; operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-if-request_002c-operators-to-use-with"><code class="code">if</code> request, operators to use with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Operators-in-Conditionals">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-if_002delse">if-else</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#if_002delse">if-else</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-if_002dthen">if-then</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#if_002dthen">if-then</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-imitating-boldface-_0028bd_0029">imitating boldface (<code class="code">bd</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-implementation-differences">implementation differences</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Implementation-Differences">Implementation Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-implicit-line-break">implicit line break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Breaking">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-implicit-trap">implicit trap</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#The-Implicit-Page-Trap">The Implicit Page Trap</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-in-request_002c-causing-implicit-break"><code class="code">in</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-in-request_002c-using-_002b-and-_002d-with"><code class="code">in</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-inch-scaling-unit-_0028i_0029">inch scaling unit (<code class="code">i</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-including-a-file-_0028so_0029">including a file (<code class="code">so</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-incompatibilities-with-AT_0026T-troff">incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Implementation-Differences">Implementation Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-increment-value-without-changing-the-register">increment value without changing the register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Auto_002dincrement">Auto-increment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-incrementation_002c-automatic_002c-of-a-register">incrementation, automatic, of a register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Auto_002dincrement">Auto-increment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-indentation-_0028in_0029">indentation (<code class="code">in</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-indentation_002c-of-roff-source-code">indentation, of <code class="code">roff</code> source code</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Invoking-Requests">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-index_002c-in-macro-package">index, in macro package</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Indexing">Indexing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-indicator_002c-scaling">indicator, scaling</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-indirect-assignments">indirect assignments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Interpolating-Registers">Interpolating Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-and-output-requests">input and output requests</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-characters-and-output-glyphs_002c-compatibility-with-AT_0026T-troff">input characters and output glyphs, compatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-characters_002c-invalid">input characters, invalid</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Identifiers">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-conventions">input conventions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Conventions">Input Conventions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-encoding_002c-code-page-1047">input encoding, code page 1047</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-encoding_002c-EBCDIC">input encoding, <abbr class="acronym">EBCDIC</abbr></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-encoding_002c-Latin_002d1-_0028ISO-8859_002d1_0029">input encoding, <span class="w-nolinebreak-text">Latin-1</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-1</span><!-- /@w -->)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-encoding_002c-Latin_002d2-_0028ISO-8859_002d2_0029">input encoding, <span class="w-nolinebreak-text">Latin-2</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-2</span><!-- /@w -->)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-encoding_002c-Latin_002d5-_0028ISO-8859_002d9_0029">input encoding, <span class="w-nolinebreak-text">Latin-5</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-9</span><!-- /@w -->)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-encoding_002c-Latin_002d9-_0028ISO-8859_002d15_0029">input encoding, <span class="w-nolinebreak-text">Latin-9</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-15</span><!-- /@w -->)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-file-name_002c-current_002c-register-_0028_002eF_0029">input file name, current, register (<code class="code">.F</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-level">input level</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Calling-Macros">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-level-in-delimited-arguments">input level in delimited arguments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Compatibility-Mode">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-line-continuation-_0028_005cRET_0029">input line continuation (<code class="code">\<kbd class="key">RET</kbd></code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-line-number-register-_0028_002ec_002c-c_002e_0029">input line number register (<code class="code">.c</code>, <code class="code">c.</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-line-number_002c-setting-_0028lf_0029">input line number, setting (<code class="code">lf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-line-position_002c-horizontal_002c-saving-_0028_005ck_0029">input line position, horizontal, saving (<code class="code">\k</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-line-trap_002c-clearing-_0028it_002c-itc_0029">input line trap, clearing (<code class="code">it</code>, <code class="code">itc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Line-Traps">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-line-trap_002c-setting-_0028it_002c-itc_0029">input line trap, setting (<code class="code">it</code>, <code class="code">itc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Line-Traps">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-line-traps">input line traps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Line-Traps">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-line-traps-and-interrupted-lines-_0028itc_0029">input line traps and interrupted lines (<code class="code">itc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Line-Traps">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-line_002c-horizontal-position_002c-register-_0028hp_0029">input line, horizontal position, register (<code class="code">hp</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-line_002c-productive">input line, productive</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-stack_002c-backtrace-_0028backtrace_0029">input stack, backtrace (<code class="code">backtrace</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-stack_002c-setting-limit">input stack, setting limit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input-token">input token</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Gtroff-Internals">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input_002c-8_002dbit">input, 8-bit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-input_002c-standard_002c-reading-from-_0028rd_0029">input, standard, reading from (<code class="code">rd</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-inserting-horizontal-space-_0028_005ch_0029">inserting horizontal space (<code class="code">\h</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-installation">installation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Installation">Installation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-instructing-the-formatter">instructing the formatter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Formatter-Instructions">Formatter Instructions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-inter_002dsentence-space-size-register-_0028_002esss_0029">inter-sentence space size register (<code class="code">.sss</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-inter_002dsentence-space_002c-additional">inter-sentence space, additional</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-inter_002dword-spacing_002c-minimal">inter-word spacing, minimal</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-interactive-use-of-gtroff">interactive use of <code class="code">gtroff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-intercepting-requests">intercepting requests</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Control-Characters">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-intermediate-output">intermediate output</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#gtroff-Output">gtroff Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-interpolating-registers-_0028_005cn_0029">interpolating registers (<code class="code">\n</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Interpolating-Registers">Interpolating Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-interpolation">interpolation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Requests-and-Macros">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-interpolation-depth">interpolation depth</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Calling-Macros">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-interpolation-depth-in-delimited-arguments">interpolation depth in delimited arguments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Compatibility-Mode">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-interpolation-of-strings-_0028_005c_002a_0029">interpolation of strings (<code class="code">\*</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-interpretation-mode">interpretation mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Copy-Mode">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-interrupted-line">interrupted line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-interrupted-line-register-_0028_002eint_0029">interrupted line register (<code class="code">.int</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-interrupted-lines-and-input-line-traps-_0028itc_0029">interrupted lines and input line traps (<code class="code">itc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Line-Traps">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-introduction">introduction</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-invalid-characters-for-trf-request">invalid characters for <code class="code">trf</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-invalid-input-characters">invalid input characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Identifiers">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-invocation-examples">invocation examples</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Invocation-Examples">Invocation Examples</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-invoking-groff">invoking <code class="code">groff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Invoking-groff">Invoking groff</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-invoking-requests">invoking requests</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Invoking-Requests">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ISO-646-output-encoding">ISO&nbsp;646 output encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ISO-8859_002d1-_0028Latin_002d1_0029-output-encoding">ISO <span class="w-nolinebreak-text">8859-1</span><!-- /@w --> (<span class="w-nolinebreak-text">Latin-1</span><!-- /@w -->) output encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ISO-8859_002d1-_0028Latin_002d1_0029_002c-input-encoding">ISO <span class="w-nolinebreak-text">8859-1</span><!-- /@w --> (<span class="w-nolinebreak-text">Latin-1</span><!-- /@w -->), input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ISO-8859_002d15-_0028Latin_002d9_0029_002c-input-encoding">ISO <span class="w-nolinebreak-text">8859-15</span><!-- /@w --> (<span class="w-nolinebreak-text">Latin-9</span><!-- /@w -->), input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ISO-8859_002d2-_0028Latin_002d2_0029_002c-input-encoding">ISO <span class="w-nolinebreak-text">8859-2</span><!-- /@w --> (<span class="w-nolinebreak-text">Latin-2</span><!-- /@w -->), input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ISO-8859_002d9-_0028Latin_002d5_0029_002c-input-encoding">ISO <span class="w-nolinebreak-text">8859-9</span><!-- /@w --> (<span class="w-nolinebreak-text">Latin-5</span><!-- /@w -->), input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-italic-correction-_0028_005c_002f_0029">italic correction (<code class="code">\/</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Italic-Corrections">Italic Corrections</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-J">J</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-justifying-text">justifying text</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-justifying-text-_0028rj_0029">justifying text (<code class="code">rj</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-K">K</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-keep_002c-floating">keep, floating</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Displays-and-Keeps">Displays and Keeps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-keeps-_0028introduction_0029">keeps (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Displays-and-Keeps">Displays and Keeps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-keeps-_005bms_005d">keeps [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-keeps-and-displays">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-keeps_002c-and-footnotes-_005bms_005d">keeps, and footnotes [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Footnotes">ms Footnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-kerning-and-ligatures">kerning and ligatures</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Ligatures-and-Kerning">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-kerning-enabled-register-_0028_002ekern_0029">kerning enabled register (<code class="code">.kern</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Ligatures-and-Kerning">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-kerning_002c-activating-_0028kern_0029">kerning, activating (<code class="code">kern</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Ligatures-and-Kerning">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-kerning_002c-track">kerning, track</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Ligatures-and-Kerning">Ligatures and Kerning</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-L">L</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-landscape-page-orientation">landscape page orientation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Paper-Format">Paper Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-language-_005bms_005d">language [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-language-and-localization">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-last-glyph_002c-dimensions-_0028_002ew_002c-_002echt_002c-_002ecdp_002c-_002ecsk_0029">last glyph, dimensions (<code class="code">.w</code>, <code class="code">.cht</code>, <code class="code">.cdp</code>, <code class="code">.csk</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-last_002drequested-point-size-registers-_0028_002epsr_002c-_002esr_0029">last-requested point size registers (<code class="code">.psr</code>, <code class="code">.sr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-last_002drequested-type-size-registers-_0028_002epsr_002c-_002esr_0029">last-requested type size registers (<code class="code">.psr</code>, <code class="code">.sr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-Latin_002d1-_0028ISO-8859_002d1_0029-output-encoding"><span class="w-nolinebreak-text">Latin-1</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-1</span><!-- /@w -->) output encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-Latin_002d1-_0028ISO-8859_002d1_0029_002c-input-encoding"><span class="w-nolinebreak-text">Latin-1</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-1</span><!-- /@w -->), input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-Latin_002d2-_0028ISO-8859_002d2_0029_002c-input-encoding"><span class="w-nolinebreak-text">Latin-2</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-2</span><!-- /@w -->), input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-Latin_002d5-_0028ISO-8859_002d9_0029_002c-input-encoding"><span class="w-nolinebreak-text">Latin-5</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-9</span><!-- /@w -->), input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-Latin_002d9-_0028ISO-8859_002d15_0029_002c-input-encoding"><span class="w-nolinebreak-text">Latin-9</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-15</span><!-- /@w -->), input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Encodings">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-layout_002c-line">layout, line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-layout_002c-page">layout, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-lc-request_002c-and-glyph-definitions"><code class="code">lc</code> request, and glyph definitions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-leader-character">leader character</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Leaders">Tabs and Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-leader-character-1">leader character</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Leaders">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-leader-character_002c-and-translations">leader character, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-leader-character_002c-non_002dinterpreted-_0028_005ca_0029">leader character, non-interpreted (<code class="code">\a</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Leaders">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-leader-repetition-character-_0028lc_0029">leader repetition character (<code class="code">lc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Leaders">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-leaders">leaders</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Leaders">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-leading">leading</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Type-Size-and-Vertical-Spacing">Manipulating Type Size and Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-leading-space-macro-_0028lsm_0029">leading space macro (<code class="code">lsm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Breaking">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-leading-space-traps">leading space traps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Leading-Space-Traps">Leading Space Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-leading-spaces">leading spaces</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Breaking">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-leading-spaces-macro-_0028lsm_0029">leading spaces macro (<code class="code">lsm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Leading-Space-Traps">Leading Space Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-leading-spaces-with-ds">leading spaces with <code class="code">ds</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-left-italic-correction-_0028_005c_002c_0029">left italic correction (<code class="code">\,</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Italic-Corrections">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-left-margin-_0028po_0029">left margin (<code class="code">po</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-length-of-a-string-_0028length_0029">length of a string (<code class="code">length</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-length-of-line-_0028ll_0029">length of line (<code class="code">ll</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-length-of-previous-line-_0028_002en_0029">length of previous line (<code class="code">.n</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-length-of-the-page_002c-configuring-_0028pl_0029">length of the page, configuring (<code class="code">pl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-length-of-title-line_002c-configuring-_0028lt_0029">length of title line, configuring (<code class="code">lt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-length-request_002c-and-copy-mode"><code class="code">length</code> request, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-less-than-_0028or-equal-to_0029-operator">less than (or equal to) operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-letters_002c-form">letters, form</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-level_002c-input">level, input</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Calling-Macros">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-level_002c-suppression-nesting_002c-register">level, suppression nesting, register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Suppressing-Output">Suppressing Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-lf-request_002c-incompatibilities-with-AT_0026T-troff"><code class="code">lf</code> request, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ligature">ligature</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ligatures-and-kerning">ligatures and kerning</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Ligatures-and-Kerning">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ligatures-enabled-register-_0028_002elg_0029">ligatures enabled register (<code class="code">.lg</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Ligatures-and-Kerning">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ligatures_002c-activating-_0028lg_0029">ligatures, activating (<code class="code">lg</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Ligatures-and-Kerning">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-limitations-of-_005cb-escape-sequence">limitations of <code class="code">\b</code> escape sequence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line-break">line break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line-break-_0028introduction_0029">line break (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Basics">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line-break_002c-output">line break, output</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Breaking">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line-control">line control</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line-dimensions">line dimensions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line-drawing-glyph">line drawing glyph</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line-drawing-glyph-1">line drawing glyph</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line-indentation-_0028in_0029">line indentation (<code class="code">in</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line-layout">line layout</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line-length-_0028ll_0029">line length (<code class="code">ll</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line-length-register-_0028_002el_0029">line length register (<code class="code">.l</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line-length_002c-previous-_0028_002en_0029">line length, previous (<code class="code">.n</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line-number_002c-input_002c-register-_0028_002ec_002c-c_002e_0029">line number, input, register (<code class="code">.c</code>, <code class="code">c.</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line-number_002c-output_002c-register-_0028ln_0029">line number, output, register (<code class="code">ln</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line-numbers_002c-printing-_0028nm_0029">line numbers, printing (<code class="code">nm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line-space_002c-extra-post_002dvertical-_0028_005cx_0029">line space, extra post-vertical (<code class="code">\x</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Vertical-Spacing">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line-space_002c-extra-pre_002dvertical-_0028_005cx_0029">line space, extra pre-vertical (<code class="code">\x</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Vertical-Spacing">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line-spacing-register-_0028_002eL_0029">line spacing register (<code class="code">.L</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Spacing">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line-spacing_002c-post_002dvertical-_0028pvs_0029">line spacing, post-vertical (<code class="code">pvs</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Vertical-Spacing">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line-thickness-_0028_005cD_0027t-_2026_0027_0029">line thickness (&lsquo;<samp class="samp">\D't &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line_002c-blank">line, blank</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Breaking">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line_002c-drawing-_0028_005cD_0027l-_2026_0027_0029">line, drawing (&lsquo;<samp class="samp">\D'l &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line_002c-horizontal_002c-drawing-_0028_005cl_0029">line, horizontal, drawing (<code class="code">\l</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line_002c-input_002c-continuation-_0028_005cRET_0029">line, input, continuation (<code class="code">\<kbd class="key">RET</kbd></code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line_002c-input_002c-horizontal-position_002c-register-_0028hp_0029">line, input, horizontal position, register (<code class="code">hp</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line_002c-input_002c-horizontal-position_002c-saving-_0028_005ck_0029">line, input, horizontal position, saving (<code class="code">\k</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line_002c-interrupted">line, interrupted</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line_002c-output_002c-continuation-_0028_005cc_0029">line, output, continuation (<code class="code">\c</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line_002c-output_002c-horizontal-position_002c-register-_0028_002ek_0029">line, output, horizontal position, register (<code class="code">.k</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line_002c-productive-input">line, productive input</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line_002c-vertical_002c-drawing-_0028_005cL_0029">line, vertical, drawing (<code class="code">\L</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-line_002dtabs-mode">line-tabs mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-lines_002c-blank_002c-disabling">lines, blank, disabling</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Spacing">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-lines_002c-centering-_0028ce_0029">lines, centering (<code class="code">ce</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-lines_002c-centering-_0028introduction_0029">lines, centering (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Basics">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-lines_002c-consecutive-hyphenated-_0028hlm_0029">lines, consecutive hyphenated (<code class="code">hlm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-lines_002c-interrupted_002c-and-input-line-traps-_0028itc_0029">lines, interrupted, and input line traps (<code class="code">itc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Line-Traps">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-lines_002c-right_002daligning-_0028introduction_0029">lines, right-aligning (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Basics">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-lines_002c-right_002djustifying-_0028introduction_0029">lines, right-justifying (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Basics">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-list-of-special-characters-_0028groff_005fchar_00287_0029-man-page_0029">list of special characters (<cite class="cite">groff_char<span class="r">(7)</span></cite> man page)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-listing-page-location-traps-_0028ptr_0029">listing page location traps (<code class="code">ptr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-lists">lists</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Paragraphs">Paragraphs</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ll-request_002c-using-_002b-and-_002d-with"><code class="code">ll</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-localization">localization</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-localization-_005bms_005d">localization [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-language-and-localization">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-locating-macro-files">locating macro files</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-locating-macro-packages">locating macro packages</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-location_002c-vertical_002c-page_002c-marking-_0028mk_0029">location, vertical, page, marking (<code class="code">mk</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-location_002c-vertical_002c-page_002c-returning-to-marked-_0028rt_0029">location, vertical, page, returning to marked (<code class="code">rt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-logical-_0060_0060and_0027_0027-operator">logical &ldquo;and&rdquo; operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-logical-_0060_0060or_0027_0027-operator">logical &ldquo;or&rdquo; operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-logical-complementation-operator">logical complementation operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-logical-conjunction-operator">logical conjunction operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-logical-disjunction-operator">logical disjunction operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-logical-not_002c-limitation-in-expression">logical not, limitation in expression</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-logical-operators">logical operators</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-long-names">long names</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Compatibility-Mode">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-loops-and-conditionals">loops and conditionals</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Conditionals-and-Loops">Conditionals and Loops</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-lowercasing-a-string-_0028stringdown_0029">lowercasing a string (<code class="code">stringdown</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ls-request_002c-alternative-to-_0028pvs_0029"><code class="code">ls</code> request, alternative to (<code class="code">pvs</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Vertical-Spacing">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-lt-request_002c-using-_002b-and-_002d-with"><code class="code">lt</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-M">M</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-m-scaling-unit"><code class="code">m</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-M-scaling-unit"><code class="code">M</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-machine-units">machine units</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro">macro</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Requests-and-Macros">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro-arguments">macro arguments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Calling-Macros">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro-arguments_002c-and-compatibility-mode">macro arguments, and compatibility mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Gtroff-Internals">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro-arguments_002c-and-tabs">macro arguments, and tabs</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Invoking-Requests">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro-directories">macro directories</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro-file-search-path">macro file search path</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro-name-register-_0028_005c_00240_0029">macro name register (<code class="code">\$0</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Parameters">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro-names_002c-starting-with-_005b-or-_005d_002c-and-refer">macro names, starting with <code class="code">[</code> or <code class="code">]</code>, and <code class="code">refer</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Identifiers">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro-package">macro package</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Packages">Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro-package-search-path">macro package search path</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro-package-usage_002c-basics-of">macro package usage, basics of</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Basics">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro-package_002c-auxiliary">macro package, auxiliary</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Major-Macro-Packages">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro-package_002c-full_002dservice">macro package, full-service</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Major-Macro-Packages">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro-package_002c-introduction">macro package, introduction</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Package-Intro">Macro Package Intro</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro-package_002c-major">macro package, major</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Major-Macro-Packages">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro-package_002c-minor">macro package, minor</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Major-Macro-Packages">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro-package_002c-structuring-the-source-of">macro package, structuring the source of</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Invoking-Requests">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro_002c-appending-to-_0028am_0029">macro, appending to (<code class="code">am</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Writing-Macros">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro_002c-creating-alias-for-_0028als_0029">macro, creating alias for (<code class="code">als</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro_002c-end_002dof_002dinput-_0028em_0029">macro, end-of-input (<code class="code">em</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#End_002dof_002dinput-Traps">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro_002c-parameters-_0028_005c_0024_0029">macro, parameters (<code class="code">\$</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Parameters">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro_002c-removing-_0028rm_0029">macro, removing (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro_002c-removing-alias-for-_0028rm_0029">macro, removing alias for (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macro_002c-renaming-_0028rn_0029">macro, renaming (<code class="code">rn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macros_002c-recursive">macros, recursive</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#while">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macros_002c-searching">macros, searching</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macros_002c-shared-name-space-with-strings-and-diversions">macros, shared name space with strings and diversions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Identifiers">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macros_002c-tutorial-for-users">macros, tutorial for users</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tutorial-for-Macro-Users">Tutorial for Macro Users</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-macros_002c-writing">macros, writing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Writing-Macros">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-magnification-of-a-font-_0028fzoom_0029">magnification of a font (<code class="code">fzoom</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-major-macro-package">major macro package</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Major-Macro-Packages">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-major-version-number-register-_0028_002ex_0029">major version number register (<code class="code">.x</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-man-macros_002c-custom-headers-and-footers"><code class="code">man</code> macros, custom headers and footers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-man-macros_002c-Ultrix_002dspecific"><code class="code">man</code> macros, Ultrix-specific</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-man-pages">man pages</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#man">man</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-manipulating-filling-and-adjustment">manipulating filling and adjustment</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-manipulating-hyphenation">manipulating hyphenation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-manipulating-spacing">manipulating spacing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Spacing">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-manipulating-type-size-and-vertical-spacing">manipulating type size and vertical spacing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Type-Size-and-Vertical-Spacing">Manipulating Type Size and Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-manual-hyphenation">manual hyphenation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-manual-pages">manual pages</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#man">man</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-margin-for-hyphenation-_0028hym_0029">margin for hyphenation (<code class="code">hym</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-margin-glyph-_0028mc_0029">margin glyph (<code class="code">mc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-margin_002c-bottom">margin, bottom</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-margin_002c-left-_0028po_0029">margin, left (<code class="code">po</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-margin_002c-right">margin, right</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-margin_002c-top">margin, top</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mark_002c-high_002dwater_002c-register-_0028_002eh_0029">mark, high-water, register (<code class="code">.h</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-marker_002c-footnote-_005bms_005d">marker, footnote [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Footnotes">ms Footnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-marking-vertical-page-location-_0028mk_0029">marking vertical page location (<code class="code">mk</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-maximum-operator">maximum operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-maximum-value-representable-with-Roman-numerals">maximum value representable with Roman numerals</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Assigning-Register-Formats">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mdoc-macros"><code class="code">mdoc</code> macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#mdoc">mdoc</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-me-macro-package"><code class="code">me</code> macro package</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#me">me</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-measurement-units">measurement units</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-measurements">measurements</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-measurements_002c-specifying-safely">measurements, specifying safely</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Default-Units">Default Units</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-metrics_002c-font">metrics, font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-minimal-inter_002dword-spacing">minimal inter-word spacing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-minimum-operator">minimum operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-minimum-value-representable-with-Roman-numerals">minimum value representable with Roman numerals</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Assigning-Register-Formats">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-minor-macro-package">minor macro package</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Major-Macro-Packages">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-minor-version-number-register-_0028_002ey_0029">minor version number register (<code class="code">.y</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-minutes_002c-current-time-_0028minutes_0029">minutes, current time (<code class="code">minutes</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mm-macro-package"><code class="code">mm</code> macro package</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#mm">mm</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode-for-constant-glyph-space-_0028cs_0029">mode for constant glyph space (<code class="code">cs</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-compatibility">mode, compatibility</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Compatibility-Mode">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-compatibility_002c-and-parameters">mode, compatibility, and parameters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Gtroff-Internals">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-copy">mode, copy</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Copy-Mode">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-copy-1">mode, copy</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Copy-Mode">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-copy_002c-and-cf-request">mode, copy, and <code class="code">cf</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-copy_002c-and-device-request">mode, copy, and <code class="code">device</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Postprocessor-Access">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-copy_002c-and-length-request">mode, copy, and <code class="code">length</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-copy_002c-and-macro-parameters">mode, copy, and macro parameters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Parameters">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-copy_002c-and-output-request">mode, copy, and <code class="code">output</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-copy_002c-and-trf-request">mode, copy, and <code class="code">trf</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-copy_002c-and-write-request">mode, copy, and <code class="code">write</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-copy_002c-and-writec-request">mode, copy, and <code class="code">writec</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-copy_002c-and-writem-request">mode, copy, and <code class="code">writem</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-copy_002c-and-_005c_0021">mode, copy, and <code class="code">\!</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-copy_002c-and-_005c_003f">mode, copy, and <code class="code">\?</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Operators-in-Conditionals">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-copy_002c-and-_005c_003f-1">mode, copy, and <code class="code">\?</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-copy_002c-and-_005ca">mode, copy, and <code class="code">\a</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Leaders">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-copy_002c-and-_005ct">mode, copy, and <code class="code">\t</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-copy_002c-and-_005cV">mode, copy, and <code class="code">\V</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-fill-_0028fi_0029_002c-enabling">mode, fill (<code class="code">fi</code>), enabling</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-fill_002c-and-break-warnings">mode, fill, and <code class="code">break</code> warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-fill_002c-and-inter_002dsentence-space">mode, fill, and inter-sentence space</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-fill_002c-and-_005cc">mode, fill, and <code class="code">\c</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-fill_002c-disabling">mode, fill, disabling</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-interpretation">mode, interpretation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Copy-Mode">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-line_002dtabs">mode, line-tabs</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-no_002dfill">mode, no-fill</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-no_002dfill_002c-and-_005cc">mode, no-fill, and <code class="code">\c</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-no_002dspace-_0028ns_0029">mode, no-space (<code class="code">ns</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Spacing">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-nroff">mode, <code class="code">nroff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#troff-and-nroff-Modes"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-safer">mode, safer</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-safer-1">mode, safer</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-safer-2">mode, safer</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-safer-3">mode, safer</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-safer-4">mode, safer</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-safer-5">mode, safer</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-safer-6">mode, safer</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-safer-7">mode, safer</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Safer-Mode">Safer Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-troff">mode, <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#troff-and-nroff-Modes"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-unsafe">mode, unsafe</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-unsafe-1">mode, unsafe</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-unsafe-2">mode, unsafe</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-unsafe-3">mode, unsafe</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-unsafe-4">mode, unsafe</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-unsafe-5">mode, unsafe</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mode_002c-unsafe-6">mode, unsafe</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-modifying-requests">modifying requests</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Control-Characters">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-modulus">modulus</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mom-macro-package"><code class="code">mom</code> macro package</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#mom">mom</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-month-of-the-year-register-_0028mo_0029">month of the year register (<code class="code">mo</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-motion-operators">motion operators</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-motion-quanta">motion quanta</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Motion-Quanta">Motion Quanta</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-motion-quantum_002c-horizontal">motion quantum, horizontal</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-motion-quantum_002c-horizontal_002c-register-_0028_002eH_0029">motion quantum, horizontal, register (<code class="code">.H</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Motion-Quanta">Motion Quanta</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-motion-quantum_002c-vertical">motion quantum, vertical</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-motion_002c-horizontal-_0028_005ch_0029">motion, horizontal (<code class="code">\h</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-motion_002c-vertical-_0028_005cv_0029">motion, vertical (<code class="code">\v</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-motions_002c-page">motions, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mounting-a-font-_0028fp_0029">mounting a font (<code class="code">fp</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Positions">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mounting-position">mounting position</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mounting-position-1">mounting position</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-mounting_002c-font_002c-automatic">mounting, font, automatic</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros"><samp class="file">ms</samp> macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms">ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-accent-marks"><samp class="file">ms</samp> macros, accent marks</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-body-text"><samp class="file">ms</samp> macros, body text</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Body-Text">ms Body Text</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-creating-table-of-contents"><samp class="file">ms</samp> macros, creating table of contents</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-TOC">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-displays"><samp class="file">ms</samp> macros, displays</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-keeps-and-displays">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-document-control-settings"><samp class="file">ms</samp> macros, document control settings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Control-Settings">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-document-description"><samp class="file">ms</samp> macros, document description</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Description-Macros">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-equations"><samp class="file">ms</samp> macros, equations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-figures"><samp class="file">ms</samp> macros, figures</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-footers"><samp class="file">ms</samp> macros, footers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Headers-and-Footers">ms Headers and Footers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-footnotes"><samp class="file">ms</samp> macros, footnotes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Footnotes">ms Footnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-fractional-type-sizes-in"><samp class="file">ms</samp> macros, fractional type sizes in</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Differences-from-AT_0026T-ms">Differences from AT&amp;T ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-general-structure"><samp class="file">ms</samp> macros, general structure</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Document-Structure">ms Document Structure</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-groff-differences-from-AT_0026T"><samp class="file">ms</samp> macros, <code class="code">groff</code> differences from <abbr class="acronym">AT&amp;T</abbr></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Differences-from-AT_0026T-ms">Differences from AT&amp;T ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-headers"><samp class="file">ms</samp> macros, headers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Headers-and-Footers">ms Headers and Footers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-headings"><samp class="file">ms</samp> macros, headings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Headings-in-ms">Headings in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-keeps"><samp class="file">ms</samp> macros, keeps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-keeps-and-displays">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-language"><samp class="file">ms</samp> macros, language</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-language-and-localization">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-lists"><samp class="file">ms</samp> macros, lists</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Lists-in-ms">Lists in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-localization"><samp class="file">ms</samp> macros, localization</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-language-and-localization">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-margins"><samp class="file">ms</samp> macros, margins</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Margins">ms Margins</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-multiple-columns"><samp class="file">ms</samp> macros, multiple columns</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Multiple-Columns">ms Multiple Columns</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-naming-conventions"><samp class="file">ms</samp> macros, naming conventions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Naming-Conventions">ms Naming Conventions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-nested-lists"><samp class="file">ms</samp> macros, nested lists</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Indented-regions-in-ms">Indented regions in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-obtaining-typographical-symbols"><samp class="file">ms</samp> macros, obtaining typographical symbols</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Typographical-symbols-in-ms">Typographical symbols in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-page-layout"><samp class="file">ms</samp> macros, page layout</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Page-Layout">ms Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-paragraph-handling"><samp class="file">ms</samp> macros, paragraph handling</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Paragraphs-in-ms">Paragraphs in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-references"><samp class="file">ms</samp> macros, references</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-special-characters"><samp class="file">ms</samp> macros, special characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-strings"><samp class="file">ms</samp> macros, strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-tables"><samp class="file">ms</samp> macros, tables</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ms-macros_002c-text-settings"><samp class="file">ms</samp> macros, text settings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Text-settings-in-ms">Text settings in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-multi_002dfile-documents">multi-file documents</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-multi_002dline-strings">multi-line strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-multi_002dpage-table-example-_005bms_005d">multi-page table example [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-multiple-columns-_005bms_005d">multiple columns [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Multiple-Columns">ms Multiple Columns</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-multiplication">multiplication</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-N">N</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-n-scaling-unit"><code class="code">n</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-name-space_002c-common_002c-of-macros_002c-diversions_002c-and-strings">name space, common, of macros, diversions, and strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Identifiers">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-name_002c-background-color_002c-register-_0028_002eM_0029">name, background color, register (<code class="code">.M</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-name_002c-fill-color_002c-register-_0028_002eM_0029">name, fill color, register (<code class="code">.M</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-name_002c-stroke-color_002c-register-_0028_002em_0029">name, stroke color, register (<code class="code">.m</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-named-character-_0028_005cC_0029">named character (<code class="code">\C</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-names_002c-long">names, long</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Compatibility-Mode">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-naming-conventions_002c-ms-macros">naming conventions, <samp class="file">ms</samp> macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Naming-Conventions">ms Naming Conventions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ne-request_002c-and-the-_002etrunc-register"><code class="code">ne</code> request, and the <code class="code">.trunc</code> register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ne-request_002c-comparison-with-sv"><code class="code">ne</code> request, comparison with <code class="code">sv</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-negating-register-values">negating register values</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Setting-Registers">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-negation">negation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nested-assignments">nested assignments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Interpolating-Registers">Interpolating Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nested-diversions">nested diversions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nested-lists-_005bms_005d">nested lists [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Indented-regions-in-ms">Indented regions in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nesting-level_002c-suppression_002c-register">nesting level, suppression, register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Suppressing-Output">Suppressing Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-new-page-_0028bp_0029">new page (<code class="code">bp</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-newline-character_002c-and-translations">newline character, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-newline-character_002c-in-strings_002c-escaping">newline character, in strings, escaping</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-newline_002c-as-delimiter">newline, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-newline_002c-final_002c-stripping-in-diversions">newline, final, stripping in diversions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Punning-Names">Punning Names</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-next-file_002c-processing-_0028nx_0029">next file, processing (<code class="code">nx</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-next-free-font-position-register-_0028_002efp_0029">next free font position register (<code class="code">.fp</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Positions">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-next-page-number-register-_0028_002epn_0029">next page number register (<code class="code">.pn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-next-page-number_002c-configuring-_0028pn_0029">next page number, configuring (<code class="code">pn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nf-request_002c-causing-implicit-break"><code class="code">nf</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nl-register_002c-and-_002ed"><code class="code">nl</code> register, and <code class="code">.d</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nl-register_002c-difference-from-_002eh"><code class="code">nl</code> register, difference from <code class="code">.h</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nm-request_002c-using-_002b-and-_002d-with"><code class="code">nm</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-no_002dbreak-control-character-_0028_0027_0029">no-break control character (<code class="code">'</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Requests-and-Macros">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-no_002dbreak-control-character_002c-changing-_0028c2_0029">no-break control character, changing (<code class="code">c2</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Control-Characters">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-no_002dfill-mode">no-fill mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-no_002dfill-mode_002c-and-_005cc">no-fill mode, and <code class="code">\c</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-no_002dspace-mode-_0028ns_0029">no-space mode (<code class="code">ns</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Spacing">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-node_002c-output">node, output</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Gtroff-Internals">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-non_002dprinting-break-point-_0028_005c_003a_0029">non-printing break point (<code class="code">\:</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nr-request_002c-and-warnings"><code class="code">nr</code> request, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nr-request_002c-using-_002b-and-_002d-with"><code class="code">nr</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-nroff-mode"><code class="code">nroff</code> mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#troff-and-nroff-Modes"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-number-formats_002c-assigning-to-register-_0028af_0029">number formats, assigning to register (<code class="code">af</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Assigning-Register-Formats">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-number-of-registers-register-_0028_002eR_0029">number of registers register (<code class="code">.R</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-number_002c-input-line_002c-setting-_0028lf_0029">number, input line, setting (<code class="code">lf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-number_002c-page_002c-next_002c-configuring-_0028pn_0029">number, page, next, configuring (<code class="code">pn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-numbered-glyph-_0028_005cN_0029">numbered glyph (<code class="code">\N</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-numbered-glyph-_0028_005cN_0029-1">numbered glyph (<code class="code">\N</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-numbered-list_002c-example-markup-_005bms_005d">numbered list, example markup [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Lists-in-ms">Lists in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-numbers_002c-line_002c-printing-_0028nm_0029">numbers, line, printing (<code class="code">nm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-numeral_002dwidth-space-_0028_005c0_0029">numeral-width space (<code class="code">\0</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-numerals_002c-as-delimiters">numerals, as delimiters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-numerals_002c-Roman">numerals, Roman</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Assigning-Register-Formats">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-numeric-expression_002c-valid">numeric expression, valid</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-numeric-expressions">numeric expressions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-O">O</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-object-creation">object creation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Writing-Macros">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-offset_002c-page">offset, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-offset_002c-page-_0028po_0029">offset, page (<code class="code">po</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-open-request_002c-and-safer-mode"><code class="code">open</code> request, and safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-opena-request_002c-and-safer-mode"><code class="code">opena</code> request, and safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-opening-brace-escape-sequence-_0028_005c_007d_0029">opening brace escape sequence (<code class="code">\}</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Conditional-Blocks">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-opening-file-_0028open_0029">opening file (<code class="code">open</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-operator_002c-scaling">operator, scaling</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-operators_002c-arithmetic">operators, arithmetic</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-operators_002c-as-delimiters">operators, as delimiters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-operators_002c-comparison">operators, comparison</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-operators_002c-extremum-_0028_003e_003f_002c-_003c_003f_0029">operators, extremum (<code class="code">&gt;?</code>, <code class="code">&lt;?</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-operators_002c-logical">operators, logical</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-operators_002c-motion">operators, motion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-operators_002c-unary-arithmetic">operators, unary arithmetic</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-optical-size-of-a-font">optical size of a font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-options">options</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-order-of-evaluation-in-expressions">order of evaluation in expressions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ordinary-character">ordinary character</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Identifiers">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-orientation_002c-landscape">orientation, landscape</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Paper-Format">Paper Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-orphan">orphan</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-orphan-lines_002c-preventing-with-ne">orphan lines, preventing with <code class="code">ne</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-os-request_002c-and-no_002dspace-mode"><code class="code">os</code> request, and no-space mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-outlined-circle_002c-drawing-_0028_005cD_0027c-_2026_0027_0029">outlined circle, drawing (&lsquo;<samp class="samp">\D'c &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-outlined-ellipse_002c-drawing-_0028_005cD_0027e-_2026_0027_0029">outlined ellipse, drawing (&lsquo;<samp class="samp">\D'e &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-outlined-polygon_002c-drawing-_0028_005cD_0027p-_2026_0027_0029">outlined polygon, drawing (&lsquo;<samp class="samp">\D'p &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-and-input-requests">output and input requests</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-comparison-operator">output comparison operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Operators-in-Conditionals">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-device-name-string-_0028_002eT_0029">output device name string (<code class="code">.T</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-device-name-string-_0028_002eT_0029-1">output device name string (<code class="code">.T</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-device-name-string-_0028_002eT_0029_002c-in-other-implementations">output device name string (<code class="code">.T</code>), in other implementations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-device-usage-register-_0028_002eT_0029">output device usage register (<code class="code">.T</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-device-usage-register-_0028_002eT_0029_002c-incompatibility-with-AT_0026T-troff">output device usage register (<code class="code">.T</code>), incompatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-devices">output devices</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Output-Device-Intro">Output Device Intro</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-encoding_002c-ASCII">output encoding, <abbr class="acronym">ASCII</abbr></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-encoding_002c-code-page-1047">output encoding, code page 1047</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-encoding_002c-EBCDIC">output encoding, <abbr class="acronym">EBCDIC</abbr></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-encoding_002c-ISO-646">output encoding, ISO&nbsp;646</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-encoding_002c-Latin_002d1-_0028ISO-8859_002d1_0029">output encoding, <span class="w-nolinebreak-text">Latin-1</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-1</span><!-- /@w -->)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-encoding_002c-UTF_002d8">output encoding, <span class="w-nolinebreak-text">UTF-8</span><!-- /@w --></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-glyphs_002c-and-input-characters_002c-compatibility-with-AT_0026T-troff">output glyphs, and input characters, compatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-line-break">output line break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Breaking">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-line-number-register-_0028ln_0029">output line number register (<code class="code">ln</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-line-properties">output line properties</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-line_002c-continuation-_0028_005cc_0029">output line, continuation (<code class="code">\c</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Continuation">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-line_002c-horizontal-position_002c-register-_0028_002ek_0029">output line, horizontal position, register (<code class="code">.k</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-node">output node</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Gtroff-Internals">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-request_002c-and-copy-mode"><code class="code">output</code> request, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output-request_002c-and-_005c_0021"><code class="code">output</code> request, and <code class="code">\!</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output_002c-filling_002c-disablement-of-_0028nf_0029">output, filling, disablement of (<code class="code">nf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output_002c-filling_002c-enablement-of-_0028fi_0029">output, filling, enablement of (<code class="code">fi</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output_002c-flush-_0028fl_0029">output, flush (<code class="code">fl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output_002c-gtroff">output, <code class="code">gtroff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#gtroff-Output">gtroff Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output_002c-intermediate">output, intermediate</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#gtroff-Output">gtroff Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output_002c-suppressing-_0028_005cO_0029">output, suppressing (<code class="code">\O</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Suppressing-Output">Suppressing Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output_002c-transparent-_0028cf_002c-trf_0029">output, transparent (<code class="code">cf</code>, <code class="code">trf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output_002c-transparent-_0028_005c_0021_002c-_005c_003f_0029">output, transparent (<code class="code">\!</code>, <code class="code">\?</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output_002c-transparent_002c-incompatibilities-with-AT_0026T-troff">output, transparent, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-output_002c-troff">output, <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#gtroff-Output">gtroff Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-overlapping-characters">overlapping characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-overstriking-glyphs-_0028_005co_0029">overstriking glyphs (<code class="code">\o</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-P">P</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-p-scaling-unit"><code class="code">p</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-P-scaling-unit"><code class="code">P</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-package_002c-macro">package, macro</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Packages">Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-package_002c-macro_002c-auxiliary">package, macro, auxiliary</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Major-Macro-Packages">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-package_002c-macro_002c-full_002dservice">package, macro, full-service</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Major-Macro-Packages">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-package_002c-macro_002c-introduction">package, macro, introduction</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Package-Intro">Macro Package Intro</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-package_002c-macro_002c-major">package, macro, major</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Major-Macro-Packages">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-package_002c-macro_002c-minor">package, macro, minor</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Major-Macro-Packages">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-package_002c-macro_002c-search-path">package, macro, search path</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-package_002c-package_002c-structuring-the-source-of">package, package, structuring the source of</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Invoking-Requests">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-padding-character_002c-for-fields-_0028fc_0029">padding character, for fields (<code class="code">fc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Fields">Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page">page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-break">page break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-break-1">page break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-break-2">page break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#The-Implicit-Page-Trap">The Implicit Page Trap</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-break-_0028introduction_0029">page break (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Basics">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-break_002c-conditional-_0028ne_0029">page break, conditional (<code class="code">ne</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-break_002c-final">page break, final</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#End_002dof_002dinput-Traps">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-break_002c-prevented-by-vpt">page break, prevented by <code class="code">vpt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Vertical-Position-Traps">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-control">page control</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-ejection">page ejection</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-ejection-1">page ejection</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-ejection-2">page ejection</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#The-Implicit-Page-Trap">The Implicit Page Trap</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-ejection-status-register-_0028_002epe_0029">page ejection status register (<code class="code">.pe</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-ejection_002c-of-final-page">page ejection, of final page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#End_002dof_002dinput-Traps">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-ejection_002c-prevented-by-vpt">page ejection, prevented by <code class="code">vpt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Vertical-Position-Traps">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-footers">page footers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-headers">page headers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-layout">page layout</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-layout-_005bms_005d">page layout [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Page-Layout">ms Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-length-register-_0028_002ep_0029">page length register (<code class="code">.p</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-length_002c-configuring-_0028pl_0029">page length, configuring (<code class="code">pl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-location-traps">page location traps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-location-traps_002c-debugging">page location traps, debugging</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-location_002c-vertical_002c-marking-_0028mk_0029">page location, vertical, marking (<code class="code">mk</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-location_002c-vertical_002c-returning-to-marked-_0028rt_0029">page location, vertical, returning to marked (<code class="code">rt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-motions">page motions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-number-character-_0028_0025_0029">page number character (<code class="code">%</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-number-character_002c-changing-_0028pc_0029">page number character, changing (<code class="code">pc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-number-register-_0028_0025_0029">page number register (<code class="code">%</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-number_002c-configuring-next-_0028pn_0029">page number, configuring next (<code class="code">pn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-number_002c-next_002c-register-_0028_002epn_0029">page number, next, register (<code class="code">.pn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-offset">page offset</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-offset-_0028po_0029">page offset (<code class="code">po</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page-orientation_002c-landscape">page orientation, landscape</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Paper-Format">Paper Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page_002c-geometry-of">page, geometry of</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-page_002c-new-_0028bp_0029">page, new (<code class="code">bp</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-paper-format">paper format</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Paper-Format">Paper Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-paper-size">paper size</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Paper-Format">Paper Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-paragraphs">paragraphs</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Paragraphs">Paragraphs</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-parameter-count-register-_0028_002e_0024_0029">parameter count register (<code class="code">.$</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Parameters">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-parameters">parameters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Parameters">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-parameters_002c-and-compatibility-mode">parameters, and compatibility mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Gtroff-Internals">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-parameters_002c-macro-_0028_005c_0024_0029">parameters, macro (<code class="code">\$</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Parameters">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-parentheses">parentheses</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-partially-collected-line">partially collected line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-path_002c-for-font-files">path, for font files</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Directories">Font Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-path_002c-for-tmac-files">path, for tmac files</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pattern-files_002c-for-hyphenation">pattern files, for hyphenation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-patterns-for-hyphenation-_0028hpf_0029">patterns for hyphenation (<code class="code">hpf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pending-output-line">pending output line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pi-request_002c-and-groff"><code class="code">pi</code> request, and <code class="code">groff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pi-request_002c-and-safer-mode"><code class="code">pi</code> request, and safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pi-request_002c-disabled-by-default"><code class="code">pi</code> request, disabled by default</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Safer-Mode">Safer Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pica-scaling-unit-_0028P_0029">pica scaling unit (<code class="code">P</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-PID-of-GNU-troff-register-_0028_0024_0024_0029">PID of GNU <code class="code">troff</code> register (<code class="code">$$</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pile_002c-glyph-_0028_005cb_0029">pile, glyph (<code class="code">\b</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pl-request_002c-using-_002b-and-_002d-with"><code class="code">pl</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-plain-text-approximation-output-register-_0028_002eA_0029">plain text approximation output register (<code class="code">.A</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-plain-text-approximation-output-register-_0028_002eA_0029-1">plain text approximation output register (<code class="code">.A</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-planting-a-trap">planting a trap</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Traps">Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-platform_002dspecific-directory">platform-specific directory</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pm-request_002c-incompatibilities-with-AT_0026T-troff"><code class="code">pm</code> request, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pn-request_002c-using-_002b-and-_002d-with"><code class="code">pn</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-PNG-image-generation-from-PostScript">PNG image generation from PostScript</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-po-request_002c-using-_002b-and-_002d-with"><code class="code">po</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-point-scaling-unit-_0028p_0029">point scaling unit (<code class="code">p</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-point-size-registers-_0028_002es_002c-_002eps_0029">point size registers (<code class="code">.s</code>, <code class="code">.ps</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Type-Size">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-point-size-registers_002c-last_002drequested-_0028_002epsr_002c-_002esr_0029">point size registers, last-requested (<code class="code">.psr</code>, <code class="code">.sr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-point-sizes_002c-changing-_0028ps_002c-_005cs_0029">point sizes, changing (<code class="code">ps</code>, <code class="code">\s</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Type-Size">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-point-sizes_002c-fractional">point sizes, fractional</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-point-sizes_002c-fractional-1">point sizes, fractional</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-polygon_002c-filled_002c-drawing-_0028_005cD_0027P-_2026_0027_0029">polygon, filled, drawing (&lsquo;<samp class="samp">\D'P &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-polygon_002c-outlined_002c-drawing-_0028_005cD_0027p-_2026_0027_0029">polygon, outlined, drawing (&lsquo;<samp class="samp">\D'p &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-polygon_002c-solid_002c-drawing-_0028_005cD_0027P-_2026_0027_0029">polygon, solid, drawing (&lsquo;<samp class="samp">\D'P &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-polygon_002c-stroked_002c-drawing-_0028_005cD_0027p-_2026_0027_0029">polygon, stroked, drawing (&lsquo;<samp class="samp">\D'p &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-position-of-lowest-text-line-_0028_002eh_0029">position of lowest text line (<code class="code">.h</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-position_002c-absolute-_0028sic_0029-operator-_0028_007c_0029">position, absolute <i class="slanted">(sic)</i> operator (<code class="code">|</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-position_002c-drawing">position, drawing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-position_002c-horizontal-input-line_002c-saving-_0028_005ck_0029">position, horizontal input line, saving (<code class="code">\k</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-position_002c-horizontal_002c-in-input-line_002c-register-_0028hp_0029">position, horizontal, in input line, register (<code class="code">hp</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-position_002c-horizontal_002c-in-output-line_002c-register-_0028_002ek_0029">position, horizontal, in output line, register (<code class="code">.k</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-position_002c-mounting">position, mounting</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-position_002c-vertical_002c-in-diversion_002c-register-_0028_002ed_0029">position, vertical, in diversion, register (<code class="code">.d</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-positions_002c-font">positions, font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Positions">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-post_002dvertical-line-spacing">post-vertical line spacing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Vertical-Spacing">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-post_002dvertical-line-spacing-register-_0028_002epvs_0029">post-vertical line spacing register (<code class="code">.pvs</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Vertical-Spacing">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-post_002dvertical-line-spacing_002c-changing-_0028pvs_0029">post-vertical line spacing, changing (<code class="code">pvs</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Vertical-Spacing">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-postprocessor-access">postprocessor access</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Postprocessor-Access">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-postprocessors">postprocessors</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Output-Device-Intro">Output Device Intro</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-PostScript_002c-bounding-box">PostScript, bounding box</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-PostScript_002c-PNG-image-generation">PostScript, PNG image generation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-prefix_002c-for-commands">prefix, for commands</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environment">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-preprocessors">preprocessors</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Preprocessor-Intro">Preprocessor Intro</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-previous-font_002c-selecting-_0028ft_0029">previous font, selecting (<code class="code">ft</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-previous-font_002c-selecting-_0028_005cf_005b_005d_002c-_005cfP_0029">previous font, selecting (<code class="code">\f[]</code>, <code class="code">\fP</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-previous-line-length-_0028_002en_0029">previous line length (<code class="code">.n</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-print-current-page-register-_0028_002eP_0029">print current page register (<code class="code">.P</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-printing-backslash-_0028_005c_005c_002c-_005ce_002c-_005cE_002c-_005c_005brs_005d_0029">printing backslash (<code class="code">\\</code>, <code class="code">\e</code>, <code class="code">\E</code>, <code class="code">\[rs]</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-printing-line-numbers-_0028nm_0029">printing line numbers (<code class="code">nm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-printing-to-stderr-_0028tm_002c-tm1_002c-tmc_0029">printing to stderr (<code class="code">tm</code>, <code class="code">tm1</code>, <code class="code">tmc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-printing_002c-zero_002dwidth-_0028_005cz_002c-_005cZ_0029">printing, zero-width (<code class="code">\z</code>, <code class="code">\Z</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-printing_002c-zero_002dwidth-_0028_005cz_002c-_005cZ_0029-1">printing, zero-width (<code class="code">\z</code>, <code class="code">\Z</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-process-ID-of-GNU-troff-register-_0028_0024_0024_0029">process ID of GNU <code class="code">troff</code> register (<code class="code">$$</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-processing-next-file-_0028nx_0029">processing next file (<code class="code">nx</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-productive-input-line">productive input line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-properties-of-characters-_0028cflags_0029">properties of characters (<code class="code">cflags</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-properties-of-glyphs-_0028cflags_0029">properties of glyphs (<code class="code">cflags</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-properties-of-output-lines">properties of output lines</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ps-request_002c-and-constant-glyph-space-mode"><code class="code">ps</code> request, and constant glyph space mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ps-request_002c-incompatibilities-with-AT_0026T-troff"><code class="code">ps</code> request, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ps-request_002c-using-_002b-and-_002d-with"><code class="code">ps</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ps-request_002c-with-fractional-type-sizes"><code class="code">ps</code> request, with fractional type sizes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pso-request_002c-and-safer-mode"><code class="code">pso</code> request, and safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-pvs-request_002c-using-_002b-and-_002d-with"><code class="code">pvs</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-Q">Q</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-quanta_002c-motion">quanta, motion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Motion-Quanta">Motion Quanta</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-quantum_002c-horizontal-motion">quantum, horizontal motion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-quantum_002c-vertical-motion">quantum, vertical motion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-radicalex-glyph_002c-and-cflags"><code class="code">radicalex</code> glyph, and <code class="code">cflags</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ragged_002dleft-text">ragged-left text</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ragged_002dright-text">ragged-right text</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-rc-request_002c-and-glyph-definitions"><code class="code">rc</code> request, and glyph definitions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-read_002donly-register-removal_002c-incompatibility-with-AT_0026T-troff">read-only register removal, incompatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-read_002donly-register_002c-changing-format">read-only register, changing format</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Assigning-Register-Formats">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-reading-from-standard-input-_0028rd_0029">reading from standard input (<code class="code">rd</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-recursive-macros">recursive macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#while">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-refer_002c-and-macro-names-starting-with-_005b-or-_005d"><code class="code">refer</code>, and macro names starting with <code class="code">[</code> or <code class="code">]</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Identifiers">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-reference_002c-gtroff">reference, <code class="code">gtroff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#GNU-troff-Reference">GNU troff Reference</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-references-_005bms_005d">references [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-register-format_002c-in-expressions">register format, in expressions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Assigning-Register-Formats">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-register_002c-assigning-number-format-to-_0028af_0029">register, assigning number format to (<code class="code">af</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Assigning-Register-Formats">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-register_002c-built_002din_002c-removing">register, built-in, removing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-register_002c-creating-alias-for-_0028aln_0029">register, creating alias for (<code class="code">aln</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Setting-Registers">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-register_002c-format-_0028_005cg_0029">register, format (<code class="code">\g</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Assigning-Register-Formats">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-register_002c-read_002donly_002c-removal_002c-incompatibility-with-AT_0026T-troff">register, read-only, removal, incompatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-register_002c-removing-_0028rr_0029">register, removing (<code class="code">rr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Setting-Registers">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-register_002c-removing-alias-for-_0028rr_0029">register, removing alias for (<code class="code">rr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Setting-Registers">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-register_002c-renaming-_0028rnn_0029">register, renaming (<code class="code">rnn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Setting-Registers">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-registers">registers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Registers">Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-registers_002c-built_002din">registers, built-in</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-registers_002c-dumping-_0028pnr_0029">registers, dumping (<code class="code">pnr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-registers_002c-interpolating-_0028_005cn_0029">registers, interpolating (<code class="code">\n</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Interpolating-Registers">Interpolating Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-registers_002c-number-of_002c-register-_0028_002eR_0029">registers, number of, register (<code class="code">.R</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-registers_002c-setting-_0028nr_002c-_005cR_0029">registers, setting (<code class="code">nr</code>, <code class="code">\R</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Setting-Registers">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-removal-of-read_002donly-registers_002c-incompatibility-with-AT_0026T-troff">removal of read-only registers, incompatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-removing-a-built_002din-register">removing a built-in register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-removing-a-register-_0028rr_0029">removing a register (<code class="code">rr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Setting-Registers">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-removing-alias-for-register-_0028rr_0029">removing alias for register (<code class="code">rr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Setting-Registers">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-removing-alias_002c-for-diversion-_0028rm_0029">removing alias, for diversion (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-removing-alias_002c-for-macro-_0028rm_0029">removing alias, for macro (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-removing-alias_002c-for-string-_0028rm_0029">removing alias, for string (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-removing-diversion-_0028rm_0029">removing diversion (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-removing-glyph-definition-_0028rchar_002c-rfschar_0029">removing glyph definition (<code class="code">rchar</code>, <code class="code">rfschar</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-removing-macro-_0028rm_0029">removing macro (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-removing-request-_0028rm_0029">removing request (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-removing-string-_0028rm_0029">removing string (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-renaming-a-register-_0028rnn_0029">renaming a register (<code class="code">rnn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Setting-Registers">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-renaming-diversion-_0028rn_0029">renaming diversion (<code class="code">rn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-renaming-macro-_0028rn_0029">renaming macro (<code class="code">rn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-renaming-request-_0028rn_0029">renaming request (<code class="code">rn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-renaming-string-_0028rn_0029">renaming string (<code class="code">rn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-renditions_002c-graphic">renditions, graphic</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-request">request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Requests-and-Macros">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-request-1">request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Formatter-Instructions">Formatter Instructions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-request-arguments">request arguments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Invoking-Requests">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-request-arguments_002c-and-compatibility-mode">request arguments, and compatibility mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Gtroff-Internals">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-request-arguments_002c-and-tabs">request arguments, and tabs</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Invoking-Requests">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-request_002c-removing-_0028rm_0029">request, removing (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-request_002c-renaming-_0028rn_0029">request, renaming (<code class="code">rn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-request_002c-undefined">request, undefined</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Comments">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-requests-for-drawing">requests for drawing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-requests-for-input-and-output">requests for input and output</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-requests_002c-intercepting">requests, intercepting</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Control-Characters">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-requests_002c-invoking">requests, invoking</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Invoking-Requests">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-requests_002c-modifying">requests, modifying</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Control-Characters">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-resolution_002c-device">resolution, device</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-resolution_002c-device-1">resolution, device</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-resolution_002c-device_002c-obtaining-in-the-formatter">resolution, device, obtaining in the formatter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-resolution_002c-horizontal">resolution, horizontal</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-resolution_002c-horizontal_002c-register-_0028_002eH_0029">resolution, horizontal, register (<code class="code">.H</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Motion-Quanta">Motion Quanta</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-resolution_002c-vertical">resolution, vertical</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-returning-to-marked-vertical-page-location-_0028rt_0029">returning to marked vertical page location (<code class="code">rt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-revision-number-register-_0028_002eY_0029">revision number register (<code class="code">.Y</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-right-margin">right margin</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Line-Layout">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-right_002daligning-lines-_0028introduction_0029">right-aligning lines (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Basics">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-right_002djustifying-_0028rj_0029">right-justifying (<code class="code">rj</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-right_002djustifying-lines-_0028introduction_0029">right-justifying lines (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Basics">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-rivers">rivers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-rj-request_002c-causing-implicit-break"><code class="code">rj</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-rn-glyph_002c-and-cflags"><code class="code">rn</code> glyph, and <code class="code">cflags</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-roman-glyph_002c-correction-after-italic-glyph-_0028_005c_002f_0029">roman glyph, correction after italic glyph (<code class="code">\/</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Italic-Corrections">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-roman-glyph_002c-correction-before-italic-glyph-_0028_005c_002c_0029">roman glyph, correction before italic glyph (<code class="code">\,</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Italic-Corrections">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-Roman-numerals">Roman numerals</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Assigning-Register-Formats">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-Roman-numerals_002c-extrema-_0028maximum-and-minimum_0029">Roman numerals, extrema (maximum and minimum)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Assigning-Register-Formats">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-rq-glyph_002c-at-end-of-sentence"><code class="code">rq</code> glyph, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Sentences">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-rq-glyph_002c-at-end-of-sentence-1"><code class="code">rq</code> glyph, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-rt-request_002c-using-_002b-and-_002d-with"><code class="code">rt</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ru-glyph_002c-and-cflags"><code class="code">ru</code> glyph, and <code class="code">cflags</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-running-system-commands">running system commands</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-S">S</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-s-scaling-unit"><code class="code">s</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-safer-mode">safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-safer-mode-1">safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-safer-mode-2">safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-safer-mode-3">safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-safer-mode-4">safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-safer-mode-5">safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-safer-mode-6">safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-safer-mode-7">safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Safer-Mode">Safer Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-saving-horizontal-input-line-position-_0028_005ck_0029">saving horizontal input line position (<code class="code">\k</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-scaling-indicator">scaling indicator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-scaling-operator">scaling operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-scaling-unit-c">scaling unit <code class="code">c</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-scaling-unit-f">scaling unit <code class="code">f</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-scaling-unit-i">scaling unit <code class="code">i</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-scaling-unit-m">scaling unit <code class="code">m</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-scaling-unit-M">scaling unit <code class="code">M</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-scaling-unit-n">scaling unit <code class="code">n</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-scaling-unit-p">scaling unit <code class="code">p</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-scaling-unit-P">scaling unit <code class="code">P</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-scaling-unit-s">scaling unit <code class="code">s</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-scaling-unit-u">scaling unit <code class="code">u</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-scaling-unit-v">scaling unit <code class="code">v</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-scaling-unit-z">scaling unit <code class="code">z</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-searching-fonts">searching fonts</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Directories">Font Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-searching-macros">searching macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-seconds_002c-current-time-_0028seconds_0029">seconds, current time (<code class="code">seconds</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-selecting-the-previous-font-_0028ft_0029">selecting the previous font (<code class="code">ft</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sentence-space">sentence space</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Sentences">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sentence-space-size-register-_0028_002esss_0029">sentence space size register (<code class="code">.sss</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sentences">sentences</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Sentences">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sequence_002c-escape">sequence, escape</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Formatter-Instructions">Formatter Instructions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-setting-diversion-trap-_0028dt_0029">setting diversion trap (<code class="code">dt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversion-Traps">Diversion Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-setting-end_002dof_002dinput-trap-_0028em_0029">setting end-of-input trap (<code class="code">em</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#End_002dof_002dinput-Traps">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-setting-input-line-number-_0028lf_0029">setting input line number (<code class="code">lf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-setting-input-line-trap-_0028it_002c-itc_0029">setting input line trap (<code class="code">it</code>, <code class="code">itc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Line-Traps">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-setting-registers-_0028nr_002c-_005cR_0029">setting registers (<code class="code">nr</code>, <code class="code">\R</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Setting-Registers">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-setting-the-page-length-_0028pl_0029">setting the page length (<code class="code">pl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-setting-up-an-abstract-font-style-_0028sty_0029">setting up an abstract font style (<code class="code">sty</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-shc-request_002c-and-translations"><code class="code">shc</code> request, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-site_002dlocal-directory">site-local directory</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-site_002dlocal-directory-1">site-local directory</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Directories">Font Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-size-of-sentence-space-register-_0028_002esss_0029">size of sentence space register (<code class="code">.sss</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-size-of-word-space-register-_0028_002ess_0029">size of word space register (<code class="code">.ss</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-size_002c-optical_002c-of-a-font">size, optical, of a font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-size_002c-paper">size, paper</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Paper-Format">Paper Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-size_002c-size">size, size</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Type-Size-and-Vertical-Spacing">Manipulating Type Size and Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sizes_002c-fractional">sizes, fractional</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sizes_002c-fractional-type">sizes, fractional type</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-skew_002c-of-last-glyph-_0028_002ecsk_0029">skew, of last glyph (<code class="code">.csk</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-slant_002c-font_002c-changing-_0028_005cS_0029">slant, font, changing (<code class="code">\S</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-soft-hyphen-character_002c-setting-_0028shc_0029">soft hyphen character, setting (<code class="code">shc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-soft-hyphen-glyph-_0028hy_0029">soft hyphen glyph (<code class="code">hy</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-solid-circle_002c-drawing-_0028_005cD_0027C-_2026_0027_0029">solid circle, drawing (&lsquo;<samp class="samp">\D'C &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-solid-ellipse_002c-drawing-_0028_005cD_0027E-_2026_0027_0029">solid ellipse, drawing (&lsquo;<samp class="samp">\D'E &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-solid-polygon_002c-drawing-_0028_005cD_0027P-_2026_0027_0029">solid polygon, drawing (&lsquo;<samp class="samp">\D'P &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-SOURCE_005fDATE_005fEPOCH_002c-environment-variable"><code>SOURCE_DATE_EPOCH<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environment">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sp-request_002c-and-no_002dspace-mode"><code class="code">sp</code> request, and no-space mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Spacing">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sp-request_002c-causing-implicit-break"><code class="code">sp</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-space-between-sentences">space between sentences</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Sentences">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-space-between-sentences-register-_0028_002esss_0029">space between sentences register (<code class="code">.sss</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-space-between-words-register-_0028_002ess_0029">space between words register (<code class="code">.ss</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-space-character_002c-as-delimiter">space character, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-space-characters_002c-in-expressions">space characters, in expressions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-space_002c-between-sentences">space, between sentences</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-space_002c-between-words">space, between words</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-space_002c-discardable_002c-horizontal">space, discardable, horizontal</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-space_002c-hair-_0028_005c_005e_0029">space, hair (<code class="code">\^</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-space_002c-horizontal-_0028_005ch_0029">space, horizontal (<code class="code">\h</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-space_002c-horizontal_002c-unformatting">space, horizontal, unformatting</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Punning-Names">Punning Names</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-space_002c-thin-_0028_005c_007c_0029">space, thin (<code class="code">\|</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-space_002c-unbreakable-_0028_005c_007e_0029">space, unbreakable (<code class="code">\~</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-space_002c-unbreakable-and-unadjustable-_0028_005cSP_0029">space, unbreakable and unadjustable (<code class="code">\<kbd class="key">SP</kbd></code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-space_002c-vertical_002c-unit-_0028v_0029">space, vertical, unit (<code class="code">v</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-space_002c-width-of-a-digit-_0028numeral_0029-_0028_005c0_0029">space, width of a digit (numeral) (<code class="code">\0</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-spaces-with-ds">spaces with <code class="code">ds</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-spaces_002c-in-a-macro-argument">spaces, in a macro argument</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Calling-Macros">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-spaces_002c-leading-and-trailing">spaces, leading and trailing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Breaking">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-spacing-_0028introduction_0029">spacing (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Basics">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-spacing_002c-manipulating">spacing, manipulating</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Spacing">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-spacing_002c-vertical">spacing, vertical</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-spacing_002c-vertical-1">spacing, vertical</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Type-Size-and-Vertical-Spacing">Manipulating Type Size and Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-spacing_002c-vertical-_0028introduction_0029">spacing, vertical (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Basics">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-special-characters">special characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Sentences">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-special-characters-1">special characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-special-characters-_005bms_005d">special characters [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-special-characters_002c-list-of-_0028groff_005fchar_00287_0029-man-page_0029">special characters, list of (<cite class="cite">groff_char<span class="r">(7)</span></cite> man page)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-special-font">special font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-special-fonts">special fonts</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-special-fonts-1">special fonts</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Special-Fonts">Special Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-special-fonts-2">special fonts</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-special-fonts_002c-emboldening">special fonts, emboldening</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-special-request_002c-and-font-translations"><code class="code">special</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-special-request_002c-and-glyph-search-order"><code class="code">special</code> request, and glyph search order</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-spline_002c-drawing-_0028_005cD_0027_007e-_2026_0027_0029">spline, drawing (&lsquo;<samp class="samp">\D'~ &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-springing-a-trap">springing a trap</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Traps">Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sqrtex-glyph_002c-and-cflags"><code class="code">sqrtex</code> glyph, and <code class="code">cflags</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ss-request_002c-incompatibilities-with-AT_0026T-troff"><code class="code">ss</code> request, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-stack">stack</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-stacking-glyphs-_0028_005cb_0029">stacking glyphs (<code class="code">\b</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-standard-input_002c-reading-from-_0028rd_0029">standard input, reading from (<code class="code">rd</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-stderr_002c-printing-to-_0028tm_002c-tm1_002c-tmc_0029">stderr, printing to (<code class="code">tm</code>, <code class="code">tm1</code>, <code class="code">tmc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-stops_002c-tab">stops, tab</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Leaders">Tabs and Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-string-arguments">string arguments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-string-comparison">string comparison</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Operators-in-Conditionals">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-string-expansion-_0028_005c_002a_0029">string expansion (<code class="code">\*</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-string-interpolation-_0028_005c_002a_0029">string interpolation (<code class="code">\*</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-string_002c-appending-_0028as_0029">string, appending (<code class="code">as</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-string_002c-creating-alias-for-_0028als_0029">string, creating alias for (<code class="code">als</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-string_002c-length-of-_0028length_0029">string, length of (<code class="code">length</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-string_002c-removing-_0028rm_0029">string, removing (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-string_002c-removing-alias-for-_0028rm_0029">string, removing alias for (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-string_002c-renaming-_0028rn_0029">string, renaming (<code class="code">rn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-strings">strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-strings-_005bms_005d">strings [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Legacy-Features">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-strings_002c-multi_002dline">strings, multi-line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-strings_002c-shared-name-space-with-macros-and-diversions">strings, shared name space with macros and diversions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Identifiers">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-stripping-final-newline-in-diversions">stripping final newline in diversions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Punning-Names">Punning Names</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-stroke-color">stroke color</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-stroke-color-name-register-_0028_002em_0029">stroke color name register (<code class="code">.m</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-stroked-circle_002c-drawing-_0028_005cD_0027c-_2026_0027_0029">stroked circle, drawing (&lsquo;<samp class="samp">\D'c &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-stroked-ellipse_002c-drawing-_0028_005cD_0027e-_2026_0027_0029">stroked ellipse, drawing (&lsquo;<samp class="samp">\D'e &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-stroked-polygon_002c-drawing-_0028_005cD_0027p-_2026_0027_0029">stroked polygon, drawing (&lsquo;<samp class="samp">\D'p &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-structuring-source-code-of-documents-or-macro-packages">structuring source code of documents or macro packages</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Invoking-Requests">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sty-request_002c-and-changing-fonts"><code class="code">sty</code> request, and changing fonts</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sty-request_002c-and-font-translations"><code class="code">sty</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-style_002c-font">style, font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-style_002c-font_002c-abstract">style, font, abstract</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-style_002c-font_002c-abstract_002c-setting-up-_0028sty_0029">style, font, abstract, setting up (<code class="code">sty</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-styles_002c-font">styles, font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-substring-_0028substring_0029">substring (<code class="code">substring</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-subtraction">subtraction</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-suppressing-output-_0028_005cO_0029">suppressing output (<code class="code">\O</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Suppressing-Output">Suppressing Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-suppression-nesting-level-register">suppression nesting level register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Suppressing-Output">Suppressing Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sv-request_002c-and-no_002dspace-mode"><code class="code">sv</code> request, and no-space mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-switching-environments-_0028ev_0029">switching environments (<code class="code">ev</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sy-request_002c-and-safer-mode"><code class="code">sy</code> request, and safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-sy-request_002c-disabled-by-default"><code class="code">sy</code> request, disabled by default</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Safer-Mode">Safer Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-symbol">symbol</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-symbol-table_002c-dumping-_0028pm_0029">symbol table, dumping (<code class="code">pm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-symbol_002c-defining-_0028char_0029">symbol, defining (<code class="code">char</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-symbols_002c-using">symbols, using</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-system-commands_002c-running">system commands, running</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-system_0028_0029-return-value-register-_0028systat_0029"><code class="code">system()</code> return value register (<code class="code">systat</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-T">T</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tab-character">tab character</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Leaders">Tabs and Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tab-character-encoding">tab character encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tab-character_002c-and-translations">tab character, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tab-character_002c-as-delimiter">tab character, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Delimiters">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tab-character_002c-non_002dinterpreted-_0028_005ct_0029">tab character, non-interpreted (<code class="code">\t</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tab-repetition-character-_0028tc_0029">tab repetition character (<code class="code">tc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tab-stop-settings-register-_0028_002etabs_0029">tab stop settings register (<code class="code">.tabs</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tab-stops">tab stops</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Leaders">Tabs and Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tab-stops_002c-default">tab stops, default</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tab_002c-line_002dtabs-mode">tab, line-tabs mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-table-of-contents">table of contents</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Table-of-Contents">Table of Contents</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-table-of-contents-1">table of contents</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Leaders">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-table-of-contents_002c-creating-_005bms_005d">table of contents, creating [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-TOC">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-table_002c-multi_002dpage_002c-example-_005bms_005d">table, multi-page, example [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tables-_005bms_005d">tables [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#ms-Insertions">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tabs_002c-and-fields">tabs, and fields</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tabs-and-Fields">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tabs_002c-and-macro-arguments">tabs, and macro arguments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Invoking-Requests">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tabs_002c-and-request-arguments">tabs, and request arguments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Invoking-Requests">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tabs_002c-before-comments">tabs, before comments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Comments">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tagged-paragraphs">tagged paragraphs</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Paragraphs">Paragraphs</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tags_002c-paragraph">tags, paragraph</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Paragraphs">Paragraphs</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-terminal_002c-conditional-output-for">terminal, conditional output for</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Operators-in-Conditionals">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-text-baseline">text baseline</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-text-baseline-1">text baseline</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Type-Size-and-Vertical-Spacing">Manipulating Type Size and Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-text-font">text font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-text-line">text line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Requests-and-Macros">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-text-line_002c-position-of-lowest-_0028_002eh_0029">text line, position of lowest (<code class="code">.h</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-text_002c-GNU-troff-processing">text, GNU <code class="code">troff</code> processing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Text">Text</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-text_002c-justifying">text, justifying</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-text_002c-justifying-_0028rj_0029">text, justifying (<code class="code">rj</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-thickness-of-lines-_0028_005cD_0027t-_2026_0027_0029">thickness of lines (&lsquo;<samp class="samp">\D't &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-thin-space-_0028_005c_007c_0029">thin space (<code class="code">\|</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-three_002dpart-title-_0028tl_0029">three-part title (<code class="code">tl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ti-request_002c-causing-implicit-break"><code class="code">ti</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ti-request_002c-using-_002b-and-_002d-with"><code class="code">ti</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-time_002c-current_002c-hours-_0028hours_0029">time, current, hours (<code class="code">hours</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-time_002c-current_002c-minutes-_0028minutes_0029">time, current, minutes (<code class="code">minutes</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-time_002c-current_002c-seconds-_0028seconds_0029">time, current, seconds (<code class="code">seconds</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-time_002c-formatting">time, formatting</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-title-length_002c-configuring-_0028lt_0029">title length, configuring (<code class="code">lt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-title-line-length-register-_0028_002elt_0029">title line length register (<code class="code">.lt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-title-line_002c-formatting-_0028tl_0029">title line, formatting (<code class="code">tl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-titles">titles</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Layout">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tkf-request_002c-and-font-styles"><code class="code">tkf</code> request, and font styles</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tkf-request_002c-and-font-translations"><code class="code">tkf</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tkf-request_002c-with-fractional-type-sizes"><code class="code">tkf</code> request, with fractional type sizes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tl-request_002c-and-mc"><code class="code">tl</code> request, and <code class="code">mc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Miscellaneous">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tmac_002c-directory">tmac, directory</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tmac_002c-path">tmac, path</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-TMPDIR_002c-environment-variable"><code>TMPDIR<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environment">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-token_002c-input">token, input</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Gtroff-Internals">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-top-margin">top margin</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-top_002dlevel-diversion">top-level diversion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-top_002dlevel-diversion_002c-and-bp">top-level diversion, and <code class="code">bp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-top_002dlevel-diversion_002c-and-_005c_0021">top-level diversion, and <code class="code">\!</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-top_002dlevel-diversion_002c-and-_005c_003f">top-level diversion, and <code class="code">\?</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tr-request_002c-and-glyph-definitions"><code class="code">tr</code> request, and glyph definitions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tr-request_002c-and-soft-hyphen-character"><code class="code">tr</code> request, and soft hyphen character</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tr-request_002c-incompatibilities-with-AT_0026T-troff"><code class="code">tr</code> request, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-track-kerning">track kerning</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Ligatures-and-Kerning">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-track-kerning_002c-activating-_0028tkf_0029">track kerning, activating (<code class="code">tkf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Ligatures-and-Kerning">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-trailing-double-quotes-in-strings">trailing double quotes in strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-trailing-spaces-in-string-definitions-and-appendments">trailing spaces in string definitions and appendments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-trailing-spaces-on-text-lines">trailing spaces on text lines</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Breaking">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-translations-of-characters">translations of characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Character-Translations">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-transparent-characters">transparent characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-transparent-dummy-character-_0028_005c_0029_0029">transparent dummy character (<code class="code">\)</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Dummy-Characters">Dummy Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-transparent-output-_0028cf_002c-trf_0029">transparent output (<code class="code">cf</code>, <code class="code">trf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-transparent-output-_0028_005c_0021_002c-_005c_003f_0029">transparent output (<code class="code">\!</code>, <code class="code">\?</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-transparent-output_002c-incompatibilities-with-AT_0026T-troff">transparent output, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-trap">trap</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Deferring-Output">Deferring Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-trap_002c-changing-location-_0028ch_0029">trap, changing location (<code class="code">ch</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-trap_002c-distance-to-next-vertical-position_002c-register-_0028_002et_0029">trap, distance to next vertical position, register (<code class="code">.t</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-trap_002c-diversion_002c-setting-_0028dt_0029">trap, diversion, setting (<code class="code">dt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversion-Traps">Diversion Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-trap_002c-end_002dof_002dinput_002c-setting-_0028em_0029">trap, end-of-input, setting (<code class="code">em</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#End_002dof_002dinput-Traps">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-trap_002c-implicit">trap, implicit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#The-Implicit-Page-Trap">The Implicit Page Trap</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-trap_002c-input-line_002c-clearing-_0028it_002c-itc_0029">trap, input line, clearing (<code class="code">it</code>, <code class="code">itc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Line-Traps">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-trap_002c-input-line_002c-setting-_0028it_002c-itc_0029">trap, input line, setting (<code class="code">it</code>, <code class="code">itc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Line-Traps">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-trap_002c-planting">trap, planting</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Traps">Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-trap_002c-springing">trap, springing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Traps">Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-traps">traps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Traps">Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-traps_002c-and-diversions">traps, and diversions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-traps_002c-blank-line">traps, blank line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Blank-Line-Traps">Blank Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-traps_002c-diversion">traps, diversion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversion-Traps">Diversion Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-traps_002c-end_002dof_002dinput">traps, end-of-input</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#End_002dof_002dinput-Traps">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-traps_002c-input-line">traps, input line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Line-Traps">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-traps_002c-input-line_002c-and-interrupted-lines-_0028itc_0029">traps, input line, and interrupted lines (<code class="code">itc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Input-Line-Traps">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-traps_002c-leading-space">traps, leading space</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Leading-Space-Traps">Leading Space Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-traps_002c-page-location">traps, page location</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-traps_002c-page-location_002c-dumping-_0028ptr_0029">traps, page location, dumping (<code class="code">ptr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-traps_002c-page-location_002c-listing-_0028ptr_0029">traps, page location, listing (<code class="code">ptr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-traps_002c-sprung-by-bp-request-_0028_002epe_0029">traps, sprung by <code class="code">bp</code> request (<code class="code">.pe</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-traps_002c-vertical-position">traps, vertical position</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Vertical-Position-Traps">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-trf-request_002c-and-copy-mode"><code class="code">trf</code> request, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-trf-request_002c-and-invalid-characters"><code class="code">trf</code> request, and invalid characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-trf-request_002c-causing-implicit-break"><code class="code">trf</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-trin-request_002c-and-asciify"><code class="code">trin</code> request, and <code class="code">asciify</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-troff-mode"><code class="code">troff</code> mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#troff-and-nroff-Modes"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-troff-output"><code class="code">troff</code> output</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#gtroff-Output">gtroff Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-truncated-vertical-space-register-_0028_002etrunc_0029">truncated vertical space register (<code class="code">.trunc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Location-Traps">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-truncating-division">truncating division</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-TTY_002c-conditional-output-for">TTY, conditional output for</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Operators-in-Conditionals">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-tutorial-for-macro-users">tutorial for macro users</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tutorial-for-Macro-Users">Tutorial for Macro Users</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-type-size">type size</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Type-Size-and-Vertical-Spacing">Manipulating Type Size and Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-type-size-registers-_0028_002es_002c-_002eps_0029">type size registers (<code class="code">.s</code>, <code class="code">.ps</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Type-Size">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-type-size-registers_002c-last_002drequested-_0028_002epsr_002c-_002esr_0029">type size registers, last-requested (<code class="code">.psr</code>, <code class="code">.sr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-type-sizes_002c-changing-_0028ps_002c-_005cs_0029">type sizes, changing (<code class="code">ps</code>, <code class="code">\s</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Type-Size">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-type-sizes_002c-fractional">type sizes, fractional</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-type-sizes_002c-fractional-1">type sizes, fractional</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Other-Differences">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-typeface">typeface</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-TZ_002c-environment-variable"><code>TZ<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environment">Environment</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-U">U</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-u-scaling-unit"><code class="code">u</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-uf-request_002c-and-font-styles"><code class="code">uf</code> request, and font styles</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Families">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ul-glyph_002c-and-cflags"><code class="code">ul</code> glyph, and <code class="code">cflags</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-ul-request_002c-and-font-translations"><code class="code">ul</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-Ultrix_002dspecific-man-macros">Ultrix-specific <code class="code">man</code> macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Optional-man-extensions">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unadjustable-and-unbreakable-space-_0028_005cSP_0029">unadjustable and unbreakable space (<code class="code">\<kbd class="key">SP</kbd></code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unary-arithmetic-operators">unary arithmetic operators</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unbreakable-and-unadjustable-space-_0028_005cSP_0029">unbreakable and unadjustable space (<code class="code">\<kbd class="key">SP</kbd></code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unbreakable-space-_0028_005c_007e_0029">unbreakable space (<code class="code">\~</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-undefined-identifiers">undefined identifiers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Identifiers">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-undefined-request">undefined request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Comments">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-underline-font-_0028uf_0029">underline font (<code class="code">uf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-underlining-_0028ul_0029">underlining (<code class="code">ul</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-underlining_002c-continuous-_0028cu_0029">underlining, continuous (<code class="code">cu</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Artificial-Fonts">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unformatting-diversions-_0028asciify_0029">unformatting diversions (<code class="code">asciify</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unformatting-horizontal-space">unformatting horizontal space</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Punning-Names">Punning Names</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-Unicode">Unicode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Identifiers">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-Unicode-1">Unicode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unit_002c-scaling_002c-c">unit, scaling, <code class="code">c</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unit_002c-scaling_002c-f">unit, scaling, <code class="code">f</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Colors">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unit_002c-scaling_002c-i">unit, scaling, <code class="code">i</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unit_002c-scaling_002c-m">unit, scaling, <code class="code">m</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unit_002c-scaling_002c-M">unit, scaling, <code class="code">M</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unit_002c-scaling_002c-n">unit, scaling, <code class="code">n</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unit_002c-scaling_002c-p">unit, scaling, <code class="code">p</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unit_002c-scaling_002c-P">unit, scaling, <code class="code">P</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unit_002c-scaling_002c-s">unit, scaling, <code class="code">s</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unit_002c-scaling_002c-u">unit, scaling, <code class="code">u</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unit_002c-scaling_002c-v">unit, scaling, <code class="code">v</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unit_002c-scaling_002c-z">unit, scaling, <code class="code">z</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-units-of-measurement">units of measurement</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-units_002c-basic">units, basic</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-units_002c-basic_002c-conversion-to">units, basic, conversion to</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-units_002c-default">units, default</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Default-Units">Default Units</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-units_002c-machine">units, machine</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unnamed-glyphs">unnamed glyphs</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unnamed-glyphs_002c-accessing-with-_005cN">unnamed glyphs, accessing with <code class="code">\N</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Font-Description-File-Format">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unsafe-mode">unsafe mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unsafe-mode-1">unsafe mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Macro-Directories">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unsafe-mode-2">unsafe mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unsafe-mode-3">unsafe mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unsafe-mode-4">unsafe mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unsafe-mode-5">unsafe mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unsafe-mode-6">unsafe mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-unstyled-font">unstyled font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fonts">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-up_002dcasing-a-string-_0028stringup_0029">up-casing a string (<code class="code">stringup</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-uppercasing-a-string-_0028stringup_0029">uppercasing a string (<code class="code">stringup</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Strings">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-upright-glyph_002c-correction-after-oblique-glyph-_0028_005c_002f_0029">upright glyph, correction after oblique glyph (<code class="code">\/</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Italic-Corrections">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-upright-glyph_002c-correction-before-oblique-glyph-_0028_005c_002c_0029">upright glyph, correction before oblique glyph (<code class="code">\,</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Italic-Corrections">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-URLs_002c-breaking-_0028_005c_003a_0029">URLs, breaking (<code class="code">\:</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Hyphenation">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-user_0027s-macro-tutorial">user&rsquo;s macro tutorial</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tutorial-for-Macro-Users">Tutorial for Macro Users</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-user_0027s-tutorial-for-macros">user&rsquo;s tutorial for macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Tutorial-for-Macro-Users">Tutorial for Macro Users</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-using-escape-sequences">using escape sequences</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Escape-Sequences">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-using-symbols">using symbols</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Symbols">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-UTF_002d8-output-encoding"><span class="w-nolinebreak-text">UTF-8</span><!-- /@w --> output encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Groff-Options">Groff Options</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-V">V</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-v-scaling-unit"><code class="code">v</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-valid-numeric-expression">valid numeric expression</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-value_002c-incrementing-without-changing-the-register">value, incrementing without changing the register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Auto_002dincrement">Auto-increment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-variables-in-environment">variables in environment</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environment">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vee">vee</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vee-scaling-unit-_0028v_0029">vee scaling unit (<code class="code">v</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-version-number_002c-major_002c-register-_0028_002ex_0029">version number, major, register (<code class="code">.x</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-version-number_002c-minor_002c-register-_0028_002ey_0029">version number, minor, register (<code class="code">.y</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vertical-drawing-position-_0028nl_0029">vertical drawing position (<code class="code">nl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vertical-line-drawing-_0028_005cL_0029">vertical line drawing (<code class="code">\L</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vertical-line-spacing-register-_0028_002ev_0029">vertical line spacing register (<code class="code">.v</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Vertical-Spacing">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vertical-line-spacing_002c-changing-_0028vs_0029">vertical line spacing, changing (<code class="code">vs</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Vertical-Spacing">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vertical-line-spacing_002c-effective-value">vertical line spacing, effective value</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Changing-the-Vertical-Spacing">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vertical-motion-_0028_005cv_0029">vertical motion (<code class="code">\v</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vertical-motion-quantum">vertical motion quantum</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vertical-page-location_002c-marking-_0028mk_0029">vertical page location, marking (<code class="code">mk</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vertical-page-location_002c-returning-to-marked-_0028rt_0029">vertical page location, returning to marked (<code class="code">rt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vertical-position-in-diversion-register-_0028_002ed_0029">vertical position in diversion register (<code class="code">.d</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Diversions">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vertical-position-trap-enable-register-_0028_002evpt_0029">vertical position trap enable register (<code class="code">.vpt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Vertical-Position-Traps">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vertical-position-traps">vertical position traps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Vertical-Position-Traps">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vertical-position-traps_002c-enabling-_0028vpt_0029">vertical position traps, enabling (<code class="code">vpt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Vertical-Position-Traps">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vertical-position_002c-drawing-_0028nl_0029">vertical position, drawing (<code class="code">nl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vertical-resolution">vertical resolution</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#DESC-File-Format">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vertical-space-unit-_0028v_0029">vertical space unit (<code class="code">v</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Measurements">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vertical-spacing">vertical spacing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Geometry">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vertical-spacing-1">vertical spacing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Type-Size-and-Vertical-Spacing">Manipulating Type Size and Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-vertical-spacing-_0028introduction_0029">vertical spacing (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Basics">Basics</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-W">W</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-warning-categories">warning categories</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-warning-level-_0028warn_0029">warning level (<code class="code">warn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-warnings">warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-warnings-1">warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Warnings">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-what-is-groff_003f">what is <code class="code">groff</code>?</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#What-Is-groff_003f">What Is <code class="code">groff</code>?</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-while">while</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#while">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-while-request_002c-and-font-translations"><code class="code">while</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-while-request_002c-and-the-_0021-operator"><code class="code">while</code> request, and the &lsquo;<samp class="samp">!</samp>&rsquo; operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Numeric-Expressions">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-while-request_002c-confusing-with-br"><code class="code">while</code> request, confusing with <code class="code">br</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#while">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-while-request_002c-operators-to-use-with"><code class="code">while</code> request, operators to use with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Operators-in-Conditionals">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-widow">widow</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-widow-1">widow</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Control">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-width-escape-_0028_005cw_0029">width escape (<code class="code">\w</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-width_002c-of-last-glyph-_0028_002ew_0029">width, of last glyph (<code class="code">.w</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Environments">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-word-space-size-register-_0028_002ess_0029">word space size register (<code class="code">.ss</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Manipulating-Filling-and-Adjustment">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-word_002c-definition-of">word, definition of</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Filling">Filling</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-write-request_002c-and-copy-mode"><code class="code">write</code> request, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-writec-request_002c-and-copy-mode"><code class="code">writec</code> request, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-writem-request_002c-and-copy-mode"><code class="code">writem</code> request, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-writing-macros">writing macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Writing-Macros">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-writing-to-file-_0028write_002c-writec_0029">writing to file (<code class="code">write</code>, <code class="code">writec</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#I_002fO">I/O</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-Y">Y</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-year_002c-current_002c-register-_0028year_002c-yr_0029">year, current, register (<code class="code">year</code>, <code class="code">yr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Built_002din-Registers">Built-in Registers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-Z">Z</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-z-scaling-unit"><code class="code">z</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Using-Fractional-Type-Sizes">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-zero_002dwidth-printing-_0028_005cz_002c-_005cZ_0029">zero-width printing (<code class="code">\z</code>, <code class="code">\Z</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-zero_002dwidth-printing-_0028_005cz_002c-_005cZ_0029-1">zero-width printing (<code class="code">\z</code>, <code class="code">\Z</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Page-Motions">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="#index-zoom-factor-of-a-font-_0028fzoom_0029">zoom factor of a font (<code class="code">fzoom</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="#Selecting-Fonts">Selecting Fonts</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table class="cp-letters-footer-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-1"><b>&quot;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-2"><b>%</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-3"><b>&amp;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-4"><b>'</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-5"><b>(</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-6"><b>)</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-7"><b>*</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-8"><b>+</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-9"><b>-</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-10"><b>.</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-11"><b>/</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-12"><b>8</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-13"><b>:</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-14"><b>&lt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-15"><b>=</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-16"><b>&gt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-17"><b>[</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-18"><b>\</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-19"><b>]</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-20"><b>|</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-J"><b>J</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-W"><b>W</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-Y"><b>Y</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-Z"><b>Z</b></a>
+ &nbsp;
+</td></tr></table>
+</div>
+
+
+<hr>
+</div>
+</div>
+<div class="element-footnotes" id="SEC_Footnotes">
+<div class="nav-panel">
+<p>
+ &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<h4 class="footnotes-heading">Footnotes</h4>
+
+<h5 class="footnote-body-heading"><a id="FOOT1" href="#DOCF1">(1)</a></h5>
+<p>The &lsquo;<samp class="samp">g</samp>&rsquo; prefix is
+not used on all systems; see <a class="ref" href="#Invoking-groff">Invoking <code class="code">groff</code></a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT2" href="#DOCF2">(2)</a></h5>
+<p>Unix and related operating systems distinguish
+standard output and standard error streams <em class="emph">because</em> of
+<code class="code">troff</code>:
+<a class="uref" href="https://minnie.tuhs.org/pipermail/tuhs/2013-December/006113.html">https://minnie.tuhs.org/pipermail/tuhs/2013-December/006113.html</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT3" href="#DOCF3">(3)</a></h5>
+<p>See <a class="xref" href="#Line-Layout">Line Layout</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT4" href="#DOCF4">(4)</a></h5>
+<p>Besides <code class="code">groff</code>, <code class="code">neatroff</code> is an
+exception.</p>
+<h5 class="footnote-body-heading"><a id="FOOT5" href="#DOCF5">(5)</a></h5>
+<p>The
+<code class="code">mso</code> request does not have these limitations. See <a class="xref" href="#I_002fO">I/O</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT6" href="#DOCF6">(6)</a></h5>
+<p>The remainder of this chapter is based on
+<cite class="cite">Writing Papers with nroff using -me</cite> by Eric&nbsp;P. Allman,
+which is distributed with <code class="code">groff</code> as <samp class="file">meintro.me</samp>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT7" href="#DOCF7">(7)</a></h5>
+<p>While manual <em class="emph">pages</em> are older, early ones used
+macros supplanted by the <samp class="file">man</samp> package of Seventh Edition Unix
+(1979). <samp class="file">ms</samp> shipped with Sixth Edition (1975) and was documented
+by Mike Lesk in a Bell Labs internal memorandum.</p>
+<h5 class="footnote-body-heading"><a id="FOOT8" href="#DOCF8">(8)</a></h5>
+<p>defined in <a class="ref" href="#ms-Footnotes">Footnotes</a></p>
+<h5 class="footnote-body-heading"><a id="FOOT9" href="#DOCF9">(9)</a></h5>
+<p>Distinguish a
+document title from &ldquo;titles&rdquo;, which are what <code class="code">roff</code> systems call
+headers and footers collectively.</p>
+<h5 class="footnote-body-heading"><a id="FOOT10" href="#DOCF10">(10)</a></h5>
+<p>This idiosyncrasy arose through
+feature accretion; for example, the <code class="code">B</code> macro in Version&nbsp;6
+Unix <samp class="file">ms</samp> (1975) accepted only one argument, the text to be set in
+boldface. By Version&nbsp;7 (1979) it recognized a second argument; in
+1990, <code class="code">groff</code> <samp class="file">ms</samp> added a &ldquo;pre&rdquo; argument, placing it third
+to avoid breaking support for older documents.</p>
+<h5 class="footnote-body-heading"><a id="FOOT11" href="#DOCF11">(11)</a></h5>
+<p>&ldquo;Portable Document Format Publishing with GNU
+Troff&rdquo;, <samp class="file">pdfmark.ms</samp> in the <code class="code">groff</code> distribution, uses this
+technique.</p>
+<h5 class="footnote-body-heading"><a id="FOOT12" href="#DOCF12">(12)</a></h5>
+<p>Unix Version&nbsp;7 <samp class="file">ms</samp>, its descendants, and GNU
+<samp class="file">ms</samp> prior to <code class="code">groff</code> version 1.23.0</p>
+<h5 class="footnote-body-heading"><a id="FOOT13" href="#DOCF13">(13)</a></h5>
+<p>You could reset it
+after each call to <code class="code">.1C</code>, <code class="code">.2C</code>, or <code class="code">.MC</code>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT14" href="#DOCF14">(14)</a></h5>
+<p><cite class="cite">Typing Documents on the UNIX System: Using the
+-ms Macros with Troff and Nroff</cite>, M.&nbsp;E. Lesk, Bell Laboratories,
+1978</p>
+<h5 class="footnote-body-heading"><a id="FOOT15" href="#DOCF15">(15)</a></h5>
+<p>Register values are converted to and stored as
+basic units. See <a class="xref" href="#Measurements">Measurements</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT16" href="#DOCF16">(16)</a></h5>
+<p>If you redefine the <samp class="file">ms</samp> <code class="code">PT</code> macro
+and desire special treatment of certain page numbers (like &lsquo;<samp class="samp">1</samp>&rsquo;),
+you may need to handle a non-Arabic page number format, as <code class="code">groff</code>
+<samp class="file">ms</samp>&rsquo;s <code class="code">PT</code> does; see the macro package source. <code class="code">groff</code>
+<samp class="file">ms</samp> aliases the <code class="code">PN</code> register to <code class="code">%</code>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT17" href="#DOCF17">(17)</a></h5>
+<p>The removal beforehand is necessary
+because <code class="code">groff</code> <samp class="file">ms</samp> aliases these macros to a diagnostic
+macro, and you want to redefine the aliased name, not its target.</p>
+<h5 class="footnote-body-heading"><a id="FOOT18" href="#DOCF18">(18)</a></h5>
+<p>See <a class="xref" href="#Device-and-Font-Description-Files">Device and Font Description Files</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT19" href="#DOCF19">(19)</a></h5>
+<p><i class="slanted">Tabs</i> and <i class="slanted">leaders</i> also separate
+words. <i class="slanted">Escape sequences</i> can function as word characters, word
+separators, or neither&mdash;the last simply have no effect on GNU
+<code class="code">troff</code>&rsquo;s idea of whether an input character is within a word.
+We&rsquo;ll discuss all of these in due course.</p>
+<h5 class="footnote-body-heading"><a id="FOOT20" href="#DOCF20">(20)</a></h5>
+<p>A
+well-researched jeremiad appreciated by <code class="code">groff</code> contributors on
+both sides of the sentence-spacing debate can be found at
+<a class="uref" href="https://web.archive.org/web/20171217060354/http://www.heracliteanriver.com/?p=324">https://web.archive.org/web/20171217060354/http://www.heracliteanriver.com/?p=324</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT21" href="#DOCF21">(21)</a></h5>
+<p>This statement oversimplifies; there are
+escape sequences whose purpose is precisely to produce glyphs on the
+output device, and input characters that <em class="emph">aren&rsquo;t</em> part of escape
+sequences can undergo a great deal of processing before getting to the
+output.</p>
+<h5 class="footnote-body-heading"><a id="FOOT22" href="#DOCF22">(22)</a></h5>
+<p>The mnemonics for the special
+characters shown here are &ldquo;dagger&rdquo;, &ldquo;double dagger&rdquo;, &ldquo;right
+(double) quote&rdquo;, and &ldquo;closing (single) quote&rdquo;. See the
+<cite class="cite">groff_char<span class="r">(7)</span></cite> man page.</p>
+<h5 class="footnote-body-heading"><a id="FOOT23" href="#DOCF23">(23)</a></h5>
+<p>&ldquo;Text lines&rdquo; are defined in <a class="ref" href="#Requests-and-Macros">Requests and Macros</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT24" href="#DOCF24">(24)</a></h5>
+<p>&ldquo;Tab&rdquo;
+is short for &ldquo;tabulation&rdquo;, revealing the term&rsquo;s origin as a spacing
+mechanism for table arrangement.</p>
+<h5 class="footnote-body-heading"><a id="FOOT25" href="#DOCF25">(25)</a></h5>
+<p>The <code class="code">\<kbd class="key">RET</kbd></code> escape sequence can alter how an
+input line is classified; see <a class="ref" href="#Line-Continuation">Line Continuation</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT26" href="#DOCF26">(26)</a></h5>
+<p>Argument handling in
+macros is more flexible but also more complex. See <a class="xref" href="#Calling-Macros">Calling Macros</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT27" href="#DOCF27">(27)</a></h5>
+<p>Some escape sequences undergo
+interpolation as well.</p>
+<h5 class="footnote-body-heading"><a id="FOOT28" href="#DOCF28">(28)</a></h5>
+<p>GNU <code class="code">troff</code> offers additional ones. See <a class="xref" href="#Writing-Macros">Writing Macros</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT29" href="#DOCF29">(29)</a></h5>
+<p>Macro files and packages
+frequently define registers and strings as well.</p>
+<h5 class="footnote-body-heading"><a id="FOOT30" href="#DOCF30">(30)</a></h5>
+<p>The
+<em class="emph">semantics</em> of certain punctuation code points have gotten stricter
+with the successive standards, a cause of some frustration among man
+page writers; see the <cite class="cite">groff_char<span class="r">(7)</span></cite> man page.</p>
+<h5 class="footnote-body-heading"><a id="FOOT31" href="#DOCF31">(31)</a></h5>
+<p>The
+DVI output device defaults to using the Computer Modern (CM) fonts;
+<samp class="file">ec.tmac</samp> loads the EC fonts instead, which provide Euro
+&lsquo;<samp class="samp">\[Eu]</samp>&rsquo; and per mille &lsquo;<samp class="samp">\[%0]</samp>&rsquo; glyphs.</p>
+<h5 class="footnote-body-heading"><a id="FOOT32" href="#DOCF32">(32)</a></h5>
+<p>Emacs: <code class="code">fill-column: 72</code>; Vim: <code class="code">textwidth=72</code></p>
+<h5 class="footnote-body-heading"><a id="FOOT33" href="#DOCF33">(33)</a></h5>
+<p><code class="code">groff</code> does not yet support right-to-left
+scripts.</p>
+<h5 class="footnote-body-heading"><a id="FOOT34" href="#DOCF34">(34)</a></h5>
+<p><code class="code">groff</code>&rsquo;s terminal output devices have page
+offsets of zero.</p>
+<h5 class="footnote-body-heading"><a id="FOOT35" href="#DOCF35">(35)</a></h5>
+<p>Provision is made for interpreting and
+reporting decimal fractions in certain cases.</p>
+<h5 class="footnote-body-heading"><a id="FOOT36" href="#DOCF36">(36)</a></h5>
+<p>If that&rsquo;s not enough, see the <cite class="cite">groff_tmac<span class="r">(5)</span></cite>
+man page for the <samp class="file">62bit.tmac</samp> macro package.</p>
+<h5 class="footnote-body-heading"><a id="FOOT37" href="#DOCF37">(37)</a></h5>
+<p>See <a class="xref" href="#Conditionals-and-Loops">Conditionals and Loops</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT38" href="#DOCF38">(38)</a></h5>
+<p>Control structure syntax
+creates an exception to this rule, but is designed to remain useful:
+recalling our example, &lsquo;<samp class="samp">.if 1 .Underline this</samp>&rsquo; would underline only
+&ldquo;this&rdquo;, precisely. See <a class="xref" href="#Conditionals-and-Loops">Conditionals and Loops</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT39" href="#DOCF39">(39)</a></h5>
+<p>See <a class="xref" href="#Diversions">Diversions</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT40" href="#DOCF40">(40)</a></h5>
+<p>Historically, control characters like
+ASCII STX, ETX, and BEL (<kbd class="key">Control+B</kbd>, <kbd class="key">Control+C</kbd>, and
+<kbd class="key">Control+G</kbd>) have been observed in <code class="code">roff</code> documents,
+particularly in macro packages employing them as delimiters with the
+output comparison operator to try to avoid collisions with the content
+of arbitrary user-supplied parameters (see <a class="pxref" href="#Operators-in-Conditionals">Operators in Conditionals</a>). We discourage this expedient; in GNU <code class="code">troff</code> it is
+unnecessary (outside of compatibility mode) because delimited arguments
+are parsed at a different input level than the surrounding context.
+See <a class="xref" href="#Implementation-Differences">Implementation Differences</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT41" href="#DOCF41">(41)</a></h5>
+<p>Consider what happens when a C1 control
+<code class="code">0x80</code>&ndash;<code class="code">0x9F</code> is necessary as a continuation byte in a UTF-8
+sequence.</p>
+<h5 class="footnote-body-heading"><a id="FOOT42" href="#DOCF42">(42)</a></h5>
+<p>Recall <a class="ref" href="#Identifiers">Identifiers</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT43" href="#DOCF43">(43)</a></h5>
+<p>In compatibility
+mode, a space is not necessary after a request or macro name of two
+characters&rsquo; length. Also, Plan&nbsp;9 <code class="code">troff</code> allows tabs to
+separate arguments.</p>
+<h5 class="footnote-body-heading"><a id="FOOT44" href="#DOCF44">(44)</a></h5>
+<p><code class="code">\~</code> is fairly
+portable; see <a class="ref" href="#Other-Differences">Other Differences</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT45" href="#DOCF45">(45)</a></h5>
+<p>Strictly, you can neglect to
+close the last quoted macro argument, relying on the end of the control
+line to do so. We consider this lethargic practice poor style.</p>
+<h5 class="footnote-body-heading"><a id="FOOT46" href="#DOCF46">(46)</a></h5>
+<p>The omission of spaces before the comment
+escape sequences is necessary; see <a class="ref" href="#Strings">Strings</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT47" href="#DOCF47">(47)</a></h5>
+<p>TeX does have such a mechanism.</p>
+<h5 class="footnote-body-heading"><a id="FOOT48" href="#DOCF48">(48)</a></h5>
+<p>This claim may be more aspirational than descriptive.</p>
+<h5 class="footnote-body-heading"><a id="FOOT49" href="#DOCF49">(49)</a></h5>
+<p>See <a class="xref" href="#Conditional-Blocks">Conditional Blocks</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT50" href="#DOCF50">(50)</a></h5>
+<p>Exception: auto-incrementing registers defined outside
+the ignored region <em class="emph">will</em> be modified if interpolated with
+<code class="code">\n±</code> inside it. See <a class="xref" href="#Auto_002dincrement">Auto-increment</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT51" href="#DOCF51">(51)</a></h5>
+<p>A negative auto-increment can be
+considered an &ldquo;auto-decrement&rdquo;.</p>
+<h5 class="footnote-body-heading"><a id="FOOT52" href="#DOCF52">(52)</a></h5>
+<p>GNU <code class="code">troff</code> dynamically allocates memory for
+as many registers as required.</p>
+<h5 class="footnote-body-heading"><a id="FOOT53" href="#DOCF53">(53)</a></h5>
+<p>unless diverted; see <a class="ref" href="#Diversions">Diversions</a></p>
+<h5 class="footnote-body-heading"><a id="FOOT54" href="#DOCF54">(54)</a></h5>
+<p>See <a class="xref" href="#Line-Continuation">Line Continuation</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT55" href="#DOCF55">(55)</a></h5>
+<p>Recall <a class="ref" href="#Filling">Filling</a> and <a class="ref" href="#Sentences">Sentences</a> for the
+definitions of word and sentence boundaries, respectively.</p>
+<h5 class="footnote-body-heading"><a id="FOOT56" href="#DOCF56">(56)</a></h5>
+<p>Whether a perfect algorithm for this application is
+even possible is an unsolved problem in computer science:
+<a class="url" href="https://tug.org/docs/liang/liang-thesis.pdf">https://tug.org/docs/liang/liang-thesis.pdf</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT57" href="#DOCF57">(57)</a></h5>
+<p><code class="code">\%</code> itself stops marking
+hyphenation points but still produces no output glyph.</p>
+<h5 class="footnote-body-heading"><a id="FOOT58" href="#DOCF58">(58)</a></h5>
+<p>&ldquo;Soft&rdquo; because it appears in output
+only where a hyphenation break is performed; a &ldquo;hard&rdquo; hyphen, as in
+&ldquo;long-term&rdquo;, always appears.</p>
+<h5 class="footnote-body-heading"><a id="FOOT59" href="#DOCF59">(59)</a></h5>
+<p>The mode is a vector of Booleans encoded as an integer.
+To a programmer, this fact is easily deduced from the exclusive use of
+powers of two for the configuration parameters; they are computationally
+easy to &ldquo;mask off&rdquo; and compare to zero. To almost everyone else, the
+arrangement seems recondite and unfriendly.</p>
+<h5 class="footnote-body-heading"><a id="FOOT60" href="#DOCF60">(60)</a></h5>
+<p>Hyphenation is
+prevented if the next page location trap is closer to the vertical
+drawing position than the next text baseline would be. See <a class="xref" href="#Page-Location-Traps">Page Location Traps</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT61" href="#DOCF61">(61)</a></h5>
+<p>For more on localization, see the
+<cite class="cite">groff_tmac<span class="r">(5)</span></cite> man page.</p>
+<h5 class="footnote-body-heading"><a id="FOOT62" href="#DOCF62">(62)</a></h5>
+<p>See <a class="xref" href="#Page-Location-Traps">Page Location Traps</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT63" href="#DOCF63">(63)</a></h5>
+<p>See <a class="xref" href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT64" href="#DOCF64">(64)</a></h5>
+<p>or geometric objects; see <a class="ref" href="#Drawing-Geometric-Objects">Drawing Geometric Objects</a></p>
+<h5 class="footnote-body-heading"><a id="FOOT65" href="#DOCF65">(65)</a></h5>
+<p>to the top-level diversion;
+see <a class="ref" href="#Diversions">Diversions</a></p>
+<h5 class="footnote-body-heading"><a id="FOOT66" href="#DOCF66">(66)</a></h5>
+<p>Plan&nbsp;9 <code class="code">troff</code>
+uses the register <code class="code">.S</code> for this purpose.</p>
+<h5 class="footnote-body-heading"><a id="FOOT67" href="#DOCF67">(67)</a></h5>
+<p>This is pronounced to rhyme with &ldquo;feeder&rdquo;, and
+refers to how the glyphs &ldquo;lead&rdquo; the eye across the page to the
+corresponding page number or other datum.</p>
+<h5 class="footnote-body-heading"><a id="FOOT68" href="#DOCF68">(68)</a></h5>
+<p>A
+GNU <code class="command">nroff</code> program is available for convenience; it calls GNU
+<code class="code">troff</code> to perform the formatting.</p>
+<h5 class="footnote-body-heading"><a id="FOOT69" href="#DOCF69">(69)</a></h5>
+<p>Historically, the <code class="code">\c</code>
+escape sequence has proven challenging to characterize. Some sources
+say it &ldquo;connects the next input text&rdquo; (to the input line on which it
+appears); others describe it as &ldquo;interrupting&rdquo; text, on the grounds
+that a text line is interrupted without breaking, perhaps to inject a
+request invocation or macro call.</p>
+<h5 class="footnote-body-heading"><a id="FOOT70" href="#DOCF70">(70)</a></h5>
+<p>See <a class="xref" href="#Traps">Traps</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT71" href="#DOCF71">(71)</a></h5>
+<p>See <a class="xref" href="#Diversions">Diversions</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT72" href="#DOCF72">(72)</a></h5>
+<p>Terminals and some output devices have fonts that render
+at only one or two sizes. As examples of the latter, take the
+<code class="code">groff</code> <code class="code">lj4</code> device&rsquo;s Lineprinter, and <code class="code">lbp</code>&rsquo;s Courier
+and Elite faces.</p>
+<h5 class="footnote-body-heading"><a id="FOOT73" href="#DOCF73">(73)</a></h5>
+<p>Font designers prepare families such that the styles
+share esthetic properties.</p>
+<h5 class="footnote-body-heading"><a id="FOOT74" href="#DOCF74">(74)</a></h5>
+<p>Historically, the fonts
+<code class="code">troff</code>s dealt with were not Free Software or, as with the Graphic
+Systems C/A/T, did not even exist in the digital domain.</p>
+<h5 class="footnote-body-heading"><a id="FOOT75" href="#DOCF75">(75)</a></h5>
+<p>See <a class="xref" href="#Font-Description-File-Format">Font Description File Format</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT76" href="#DOCF76">(76)</a></h5>
+<p>See <a class="xref" href="#DESC-File-Format"><samp class="file">DESC</samp> File Format</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT77" href="#DOCF77">(77)</a></h5>
+<p>Not all versions of the <code class="code">man</code> program
+support the <samp class="option">-T</samp> option; use the subsequent example for an
+alternative.</p>
+<h5 class="footnote-body-heading"><a id="FOOT78" href="#DOCF78">(78)</a></h5>
+<p>This is &ldquo;Normalization Form D&rdquo;
+as documented in Unicode Standard Annex #15
+(<a class="uref" href="https://unicode.org/reports/tr15/">https://unicode.org/reports/tr15/</a>).</p>
+<h5 class="footnote-body-heading"><a id="FOOT79" href="#DOCF79">(79)</a></h5>
+<p>See <a class="xref" href="#Compatibility-Mode">Compatibility Mode</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT80" href="#DOCF80">(80)</a></h5>
+<p>Output glyphs
+don&rsquo;t&mdash;to GNU <code class="code">troff</code>, a glyph is simply a box with an index into
+a font, a given height above and depth below the baseline, and a width.</p>
+<h5 class="footnote-body-heading"><a id="FOOT81" href="#DOCF81">(81)</a></h5>
+<p>Opinions of this escape sequence&rsquo;s name abound.
+&ldquo;Zero-width space&rdquo; is a popular misnomer: <code class="code">roff</code> formatters do
+not treat it like a space. Ossanna called it a &ldquo;non-printing,
+zero-width character&rdquo;, but the character causes <em class="emph">output</em> even
+though it does not &ldquo;print&rdquo;. If no output line is pending, the dummy
+character starts one. Contrast an empty input document with one
+containing only <code class="code">\&amp;</code>. The former produces no output; the latter, a
+blank page.</p>
+<h5 class="footnote-body-heading"><a id="FOOT82" href="#DOCF82">(82)</a></h5>
+<p>In text fonts, the tallest glyphs are typically
+parentheses. Unfortunately, in many cases the actual dimensions of the
+glyphs in a font do not closely match its declared type size! For
+example, in the standard PostScript font families, 10-point Times sets
+better with 9-point Helvetica and 11-point Courier than if all three
+were used at 10&nbsp;points.</p>
+<h5 class="footnote-body-heading"><a id="FOOT83" href="#DOCF83">(83)</a></h5>
+<p>Rhyme with &ldquo;sledding&rdquo;; mechanical typography
+used lead metal (Latin <em class="emph">plumbum</em>).</p>
+<h5 class="footnote-body-heading"><a id="FOOT84" href="#DOCF84">(84)</a></h5>
+<p>The claim appears to have been true of Ossanna
+<code class="code">troff</code> for the C/A/T device; Kernighan made device-independent
+<code class="code">troff</code> more flexible.</p>
+<h5 class="footnote-body-heading"><a id="FOOT85" href="#DOCF85">(85)</a></h5>
+<p>See <a class="xref" href="#Device-and-Font-Description-Files">Device and Font Description Files</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT86" href="#DOCF86">(86)</a></h5>
+<p>also
+known vulgarly as &ldquo;ANSI colors&rdquo;</p>
+<h5 class="footnote-body-heading"><a id="FOOT87" href="#DOCF87">(87)</a></h5>
+<p>See <a class="xref" href="#Copy-Mode">Copy Mode</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT88" href="#DOCF88">(88)</a></h5>
+<p>This refers to
+<code class="code">vtroff</code>, a translator that would convert the C/A/T output from
+early-vintage <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> to a form suitable for
+Versatec and Benson-Varian plotters.</p>
+<h5 class="footnote-body-heading"><a id="FOOT89" href="#DOCF89">(89)</a></h5>
+<p>Strictly, letters not otherwise recognized <em class="emph">are</em> treated
+as output comparison delimiters. For portability, it is wise to avoid
+using letters not in the list above; for example, Plan&nbsp;9
+<code class="code">troff</code> uses &lsquo;<samp class="samp">h</samp>&rsquo; to test a mode it calls <code class="code">htmlroff</code>, and
+GNU <code class="code">troff</code> may provide additional operators in the future.</p>
+<h5 class="footnote-body-heading"><a id="FOOT90" href="#DOCF90">(90)</a></h5>
+<p>Because formatting of the comparands takes place
+in a dummy environment, vertical motions within them cannot spring
+traps.</p>
+<h5 class="footnote-body-heading"><a id="FOOT91" href="#DOCF91">(91)</a></h5>
+<p>All
+of this is to say that the lists of output nodes created by formatting
+<var class="var">xxx</var> and <var class="var">yyy</var> must be identical. See <a class="xref" href="#Gtroff-Internals"><code class="code">gtroff</code> Internals</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT92" href="#DOCF92">(92)</a></h5>
+<p>This bizarre behavior maintains compatibility with
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT93" href="#DOCF93">(93)</a></h5>
+<p>See <a class="xref" href="#while">while</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT94" href="#DOCF94">(94)</a></h5>
+<p>See <a class="xref" href="#Copy-Mode">Copy Mode</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT95" href="#DOCF95">(95)</a></h5>
+<p>unless you redefine it</p>
+<h5 class="footnote-body-heading"><a id="FOOT96" href="#DOCF96">(96)</a></h5>
+<p>&ldquo;somewhat less&rdquo; because
+things other than macro calls can be on the input stack</p>
+<h5 class="footnote-body-heading"><a id="FOOT97" href="#DOCF97">(97)</a></h5>
+<p>See <a class="xref" href="#Copy-Mode">Copy Mode</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT98" href="#DOCF98">(98)</a></h5>
+<p>While it is possible to define and
+call a macro &lsquo;<samp class="samp">.</samp>&rsquo;, you can&rsquo;t use it as an end macro: during a macro
+definition, &lsquo;<samp class="samp">..</samp>&rsquo; is never handled as calling &lsquo;<samp class="samp">.</samp>&rsquo;, even if
+&lsquo;<samp class="samp">.de <var class="var">name</var> .</samp>&rsquo; explicitly precedes it.</p>
+<h5 class="footnote-body-heading"><a id="FOOT99" href="#DOCF99">(99)</a></h5>
+<p>Its structure is
+adapted from, and isomorphic to, part of a solution by Tadziu Hoffman to
+the problem of reflowing text multiple times to find an optimal
+configuration for it.
+<a class="uref" href="https://lists.gnu.org/archive/html/groff/2008-12/msg00006.html">https://lists.gnu.org/archive/html/groff/2008-12/msg00006.html</a></p>
+<h5 class="footnote-body-heading"><a id="FOOT100" href="#DOCF100">(100)</a></h5>
+<p>If they were not,
+parameter interpolations would be similar to command-line
+parameters&mdash;fixed for the entire duration of a <code class="code">roff</code> program&rsquo;s
+run. The advantage of interpolating <code class="code">\$</code> escape sequences even in
+copy mode is that they can interpolate different contents from one call
+to the next, like function parameters in a procedural language. The
+additional escape character is the price of this power.</p>
+<h5 class="footnote-body-heading"><a id="FOOT101" href="#DOCF101">(101)</a></h5>
+<p>Compare this to the <code class="code">\def</code> and <code class="code">\edef</code>
+commands in TeX.</p>
+<h5 class="footnote-body-heading"><a id="FOOT102" href="#DOCF102">(102)</a></h5>
+<p>These are lightly adapted from the <code class="code">groff</code>
+implementation of the <samp class="file">ms</samp> macros.</p>
+<h5 class="footnote-body-heading"><a id="FOOT103" href="#DOCF103">(103)</a></h5>
+<p>At the
+<code class="code">grops</code> defaults of 10-point type on 12-point vertical spacing, the
+difference between half a vee and half an em can be subtle: large
+spacings like &lsquo;<samp class="samp">.vs .5i</samp>&rsquo; make it obvious.</p>
+<h5 class="footnote-body-heading"><a id="FOOT104" href="#DOCF104">(104)</a></h5>
+<p>See <a class="xref" href="#Strings">Strings</a>, for an explanation of the trailing
+&lsquo;<samp class="samp">\&quot;</samp>&rsquo;.</p>
+<h5 class="footnote-body-heading"><a id="FOOT105" href="#DOCF105">(105)</a></h5>
+<p>(<var class="var">hc</var>, <var class="var">vc</var>) is adjusted to the point nearest
+the perpendicular bisector of the arc&rsquo;s chord.</p>
+<h5 class="footnote-body-heading"><a id="FOOT106" href="#DOCF106">(106)</a></h5>
+<p>See <a class="xref" href="#The-Implicit-Page-Trap">The Implicit Page Trap</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT107" href="#DOCF107">(107)</a></h5>
+<p>A trap planted at &lsquo;<samp class="samp">20i</samp>&rsquo; or
+&lsquo;<samp class="samp">-30i</samp>&rsquo; will not be sprung on a page of length &lsquo;<samp class="samp">11i</samp>&rsquo;.</p>
+<h5 class="footnote-body-heading"><a id="FOOT108" href="#DOCF108">(108)</a></h5>
+<p>It may help to think of each trap location as
+maintaining a queue; <code class="code">wh</code> operates on the head of the queue, and
+<code class="code">ch</code> operates on its tail. Only the trap at the head of the queue
+is visible.</p>
+<h5 class="footnote-body-heading"><a id="FOOT109" href="#DOCF109">(109)</a></h5>
+<p>See <a class="xref" href="#Debugging">Debugging</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT110" href="#DOCF110">(110)</a></h5>
+<p>See <a class="xref" href="#Diversions">Diversions</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT111" href="#DOCF111">(111)</a></h5>
+<p>While processing an
+end-of-input macro, the formatter assumes that the next page break must
+be the last; it goes into &ldquo;sudden death overtime&rdquo;.</p>
+<h5 class="footnote-body-heading"><a id="FOOT112" href="#DOCF112">(112)</a></h5>
+<p>Another, taken by the <code class="code">groff</code> <code class="code">man</code> macros, is
+to intercept <code class="code">ne</code> requests and wrap <code class="code">bp</code> ones.</p>
+<h5 class="footnote-body-heading"><a id="FOOT113" href="#DOCF113">(113)</a></h5>
+<p>Thus, the &ldquo;water&rdquo;
+gets &ldquo;higher&rdquo; proceeding <em class="emph">down</em> the page.</p>
+<h5 class="footnote-body-heading"><a id="FOOT114" href="#DOCF114">(114)</a></h5>
+<p>The backslash is doubled. See <a class="xref" href="#Copy-Mode">Copy Mode</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT115" href="#DOCF115">(115)</a></h5>
+<p>that is, ISO&nbsp;646:1991-IRV or,
+popularly, &ldquo;US-ASCII&rdquo;</p>
+<h5 class="footnote-body-heading"><a id="FOOT116" href="#DOCF116">(116)</a></h5>
+<p>They are bypassed because these parameters are not
+rendered as glyphs in the output; instead, they remain abstract
+characters&mdash;in a PDF bookmark or a URL, for example.</p>
+<h5 class="footnote-body-heading"><a id="FOOT117" href="#DOCF117">(117)</a></h5>
+<p>Recall <a class="ref" href="#Line-Layout">Line Layout</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT118" href="#DOCF118">(118)</a></h5>
+<p>Historically,
+tools named <code class="command">nrchbar</code> and <code class="command">changebar</code> were developed for
+marking changes with margin characters and could be found in archives of
+the <code class="code">comp.sources.unix</code> <abbr class="acronym">USENET</abbr> group. Some proprietary
+Unices also offer(ed) a <code class="command">diffmk</code> program.</p>
+<h5 class="footnote-body-heading"><a id="FOOT119" href="#DOCF119">(119)</a></h5>
+<p>Except the
+escape sequences <code class="code">\f</code>, <code class="code">\F</code>, <code class="code">\H</code>, <code class="code">\m</code>, <code class="code">\M</code>,
+<code class="code">\R</code>, <code class="code">\s</code>, and <code class="code">\S</code>, which are processed immediately if
+not in copy mode.</p>
+<h5 class="footnote-body-heading"><a id="FOOT120" href="#DOCF120">(120)</a></h5>
+<p>The
+Graphic Systems C/A/T phototypesetter (the original device target for
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>) supported only a few discrete type sizes
+in the range 6&ndash;36 points, so Ossanna contrived a special case in the
+parser to do what the user must have meant. Kernighan warned of this in
+the 1992 revision of CSTR&nbsp;#54 (§2.3), and more recently, McIlroy
+referred to it as a &ldquo;living fossil&rdquo;.</p>
+<h5 class="footnote-body-heading"><a id="FOOT121" href="#DOCF121">(121)</a></h5>
+<p>DWB&nbsp;3.3, Solaris, Heirloom Doctools, and
+Plan&nbsp;9 <code class="code">troff</code> all support it.</p>
+<h5 class="footnote-body-heading"><a id="FOOT122" href="#DOCF122">(122)</a></h5>
+<p>Naturally, if you&rsquo;ve changed
+the escape character, you need to prefix the <code class="code">e</code> with whatever it
+is&mdash;and you&rsquo;ll likely get something other than a backslash in the
+output.</p>
+<h5 class="footnote-body-heading"><a id="FOOT123" href="#DOCF123">(123)</a></h5>
+<p>The <code class="code">rs</code> special character identifier was not
+defined in <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>&rsquo;s font description files, but is
+in those of its lineal descendant, Heirloom Doctools <code class="code">troff</code>, as of
+the latter&rsquo;s 060716 release (July 2006).</p>
+<h5 class="footnote-body-heading"><a id="FOOT124" href="#DOCF124">(124)</a></h5>
+<p>The parser
+and postprocessor for intermediate output can be found in the file<br>
+<samp class="file"><var class="var">groff-source-dir</var>/src/libs/libdriver/input.cpp</samp>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT125" href="#DOCF125">(125)</a></h5>
+<p>Plan&nbsp;9 <code class="code">troff</code> has also abandoned the binary
+format.</p>
+<h5 class="footnote-body-heading"><a id="FOOT126" href="#DOCF126">(126)</a></h5>
+<p>800-point type
+is not practical for most purposes, but using it enables the quantities
+in the font description files to be expressed as integers.</p>
+<h5 class="footnote-body-heading"><a id="FOOT127" href="#DOCF127">(127)</a></h5>
+<p><code class="code">groff</code> requests and escape sequences
+interpret non-negative font names as mounting positions instead.
+Further, a font named &lsquo;<samp class="samp">0</samp>&rsquo; cannot be automatically mounted by the
+<code class="code">fonts</code> directive of a <samp class="file">DESC</samp> file.</p>
+<h5 class="footnote-body-heading"><a id="FOOT128" href="#DOCF128">(128)</a></h5>
+<p>For typesetter devices, this directive is misnamed
+since it starts a list of glyphs, not characters.</p>
+<h5 class="footnote-body-heading"><a id="FOOT129" href="#DOCF129">(129)</a></h5>
+<p>that is, any integer parsable by the C
+standard library&rsquo;s <cite class="cite">strtol<span class="r">(3)</span></cite> function</p>
+</div>
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Adjustment.html b/doc/groff.html.node/Adjustment.html
new file mode 100644
index 0000000..60b01c4
--- /dev/null
+++ b/doc/groff.html.node/Adjustment.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Adjustment (The GNU Troff Manual)</title>
+
+<meta name="description" content="Adjustment (The GNU Troff Manual)">
+<meta name="keywords" content="Adjustment (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Text.html" rel="up" title="Text">
+<link href="Tabs-and-Leaders.html" rel="next" title="Tabs and Leaders">
+<link href="Breaking.html" rel="prev" title="Breaking">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Adjustment">
+<div class="nav-panel">
+<p>
+Next: <a href="Tabs-and-Leaders.html" accesskey="n" rel="next">Tabs and Leaders</a>, Previous: <a href="Breaking.html" accesskey="p" rel="prev">Breaking</a>, Up: <a href="Text.html" accesskey="u" rel="up">Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Adjustment-1">5.1.5 Adjustment</h4>
+
+<a class="index-entry-id" id="index-extra-spaces-between-words"></a>
+<p>After GNU <code class="code">troff</code> performs an automatic break, it may then
+<em class="dfn">adjust</em> the line, widening inter-word spaces until the text reaches
+the right margin. Extra spaces between words are preserved. Leading
+and trailing spaces are handled as noted above. Text can be aligned to
+the left or right margin only, or centered; see <a class="ref" href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a>.
+</p>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Argument-Units.html b/doc/groff.html.node/Argument-Units.html
new file mode 100644
index 0000000..c7cbb16
--- /dev/null
+++ b/doc/groff.html.node/Argument-Units.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Argument Units (The GNU Troff Manual)</title>
+
+<meta name="description" content="Argument Units (The GNU Troff Manual)">
+<meta name="keywords" content="Argument Units (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Language-Concepts.html" rel="up" title="Language Concepts">
+<link href="Document-Parts.html" rel="next" title="Document Parts">
+<link href="Separation.html" rel="prev" title="Separation">
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="Argument-Units">
+<div class="nav-panel">
+<p>
+Next: <a href="Document-Parts.html" accesskey="n" rel="next">Document Parts</a>, Previous: <a href="Separation.html" accesskey="p" rel="prev">Separation</a>, Up: <a href="Language-Concepts.html" accesskey="u" rel="up">Language Concepts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Argument-Units-1">6.1.1.2 Argument Units</h4>
+
+<p>Some commands take integer arguments that are assumed to represent
+values in a measurement unit, but the letter for the corresponding
+scaling unit is not written with the output command arguments. Most
+commands assume the scaling unit &lsquo;<samp class="samp">u</samp>&rsquo;, the basic unit of the device,
+some use &lsquo;<samp class="samp">z</samp>&rsquo;, the scaled point unit of the device, while others,
+such as the color commands, expect plain integers.
+</p>
+<p>Single characters can have the eighth bit set, as can the names of
+fonts and special characters. The names of characters and fonts can be
+of arbitrary length. A character that is to be printed is always in
+the current font.
+</p>
+<p>A string argument is always terminated by the next whitespace character
+(space, tab, or newline); an embedded &lsquo;<samp class="samp">#</samp>&rsquo; character is regarded as
+part of the argument, not as the beginning of a comment command. An
+integer argument is already terminated by the next non-digit character,
+which then is regarded as the first character of the next argument or
+command.
+</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Artificial-Fonts.html b/doc/groff.html.node/Artificial-Fonts.html
new file mode 100644
index 0000000..6f9d43d
--- /dev/null
+++ b/doc/groff.html.node/Artificial-Fonts.html
@@ -0,0 +1,252 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Artificial Fonts (The GNU Troff Manual)</title>
+
+<meta name="description" content="Artificial Fonts (The GNU Troff Manual)">
+<meta name="keywords" content="Artificial Fonts (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Using-Fonts.html" rel="up" title="Using Fonts">
+<link href="Ligatures-and-Kerning.html" rel="next" title="Ligatures and Kerning">
+<link href="Special-Fonts.html" rel="prev" title="Special Fonts">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+ul.mark-bullet {list-style-type: disc}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Artificial-Fonts">
+<div class="nav-panel">
+<p>
+Next: <a href="Ligatures-and-Kerning.html" accesskey="n" rel="next">Ligatures and Kerning</a>, Previous: <a href="Special-Fonts.html" accesskey="p" rel="prev">Special Fonts</a>, Up: <a href="Using-Fonts.html" accesskey="u" rel="up">Using Fonts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Artificial-Fonts-1">5.19.7 Artificial Fonts</h4>
+<a class="index-entry-id" id="index-artificial-fonts"></a>
+<a class="index-entry-id" id="index-fonts_002c-artificial"></a>
+
+<p>There are a number of requests and escape sequences for artificially
+creating fonts. These are largely vestiges of the days when output
+devices did not have a wide variety of fonts, and when <code class="code">nroff</code> and
+<code class="code">troff</code> were separate programs. Most of them are no longer
+necessary in GNU <code class="code">troff</code>. Nevertheless, they are supported.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cH_0027height_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\H<code class="code">'</code></code><span class="r"><i class="slanted">height</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cH_0027height_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cH"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cH_0027_002bheight_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\H<code class="code">'</code></code><span class="r"><i class="slanted"><code class="t">+</code>height</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cH_0027_002bheight_0027'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cH_0027_002dheight_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\H<code class="code">'</code></code><span class="r"><i class="slanted"><code class="t">-</code>height</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cH_0027_002dheight_0027'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eheight_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.height]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eheight_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eheight"></a>
+<a class="index-entry-id" id="index-changing-the-font-height-_0028_005cH_0029"></a>
+<a class="index-entry-id" id="index-font-height_002c-changing-_0028_005cH_0029"></a>
+<a class="index-entry-id" id="index-height_002c-font_002c-changing-_0028_005cH_0029"></a>
+<p>Change (increment, decrement) the height of the current font, but not
+the width. If <var class="var">height</var> is zero, restore the original height.
+Default scaling unit is &lsquo;<samp class="samp">z</samp>&rsquo;.
+</p>
+<p>The read-only register <code class="code">.height</code> contains the font height as set by
+<code class="code">\H</code>.
+</p>
+<p>Currently, only the <samp class="option">-Tps</samp> and <samp class="option">-Tpdf</samp> devices support
+this feature.
+</p>
+<p><code class="code">\H</code> doesn&rsquo;t produce an input token in GNU <code class="code">troff</code>. As a
+consequence, it can be used in requests like <code class="code">mc</code> (which expects
+a single character as an argument) to change the font on the fly:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.mc \H'+5z'x\H'0'
+</pre></div></div>
+
+<p>In compatibility mode, <code class="code">gtroff</code> behaves differently: If an
+increment or decrement is used, it is always taken relative to the
+current type size and not relative to the previously selected font
+height. Thus,
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.cp 1
+\H'+5'test \H'+5'test
+</pre></div></div>
+
+<p>prints the word &lsquo;<samp class="samp">test</samp>&rsquo; twice with the same font height (five points
+larger than the current font size).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cS_0027slant_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\S<code class="code">'</code></code><span class="r"><i class="slanted">slant</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cS_0027slant_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cS"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eslant_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.slant]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eslant_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eslant"></a>
+<a class="index-entry-id" id="index-changing-the-font-slant-_0028_005cS_0029"></a>
+<a class="index-entry-id" id="index-font-slant_002c-changing-_0028_005cS_0029"></a>
+<a class="index-entry-id" id="index-slant_002c-font_002c-changing-_0028_005cS_0029"></a>
+<p>Slant the current font by <var class="var">slant</var> degrees. Positive values slant to
+the right. Only integer values are possible.
+</p>
+<p>The read-only register <code class="code">.slant</code> contains the font slant as set by
+<code class="code">\S</code>.
+</p>
+<p>Currently, only the <samp class="option">-Tps</samp> and <samp class="option">-Tpdf</samp> devices support
+this feature.
+</p>
+<p><code class="code">\S</code> doesn&rsquo;t produce an input token in GNU <code class="code">troff</code>. As a
+consequence, it can be used in requests like <code class="code">mc</code> (which expects
+a single character as an argument) to change the font on the fly:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.mc \S'20'x\S'0'
+</pre></div></div>
+
+<a class="index-entry-id" id="index-CSTR-_002354-errata-3"></a>
+<a class="index-entry-id" id="index-CSTR-_002354-erratum_002c-_005cS-escape"></a>
+<p>This escape is incorrectly documented in the <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code> manual; the slant is always set to an absolute value.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eul"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ul</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">lines</i></span>]</var><a class="copiable-link" href='#index-_002eul'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ul"></a>
+<a class="index-entry-id" id="index-underlining-_0028ul_0029"></a>
+<p>The <code class="code">ul</code> request normally underlines subsequent lines if a TTY
+output device is used. Otherwise, the lines are printed in italics
+(only the term &lsquo;underlined&rsquo; is used in the following). The single
+argument is the quantity of input lines to be underlined; with no
+argument, the next line is underlined. If <var class="var">lines</var> is zero or
+negative, stop the effects of <code class="code">ul</code> (if it was active). Requests
+and empty lines do not count for computing the number of underlined
+input lines, even if they produce some output like <code class="code">tl</code>. Lines
+inserted by macros (e.g., invoked by a trap) do count.
+</p>
+<p>At the beginning of <code class="code">ul</code>, the current font is stored and the
+underline font is activated. Within the span of a <code class="code">ul</code> request, it
+is possible to change fonts, but after the last line affected by
+<code class="code">ul</code> the saved font is restored.
+</p>
+<p>This number of lines still to be underlined is associated with the
+environment (see <a class="pxref" href="Environments.html">Environments</a>). The underline font can be changed
+with the <code class="code">uf</code> request.
+</p>
+
+
+<p>The <code class="code">ul</code> request does not underline spaces.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ecu"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.cu</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">lines</i></span>]</var><a class="copiable-link" href='#index-_002ecu'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-cu"></a>
+<a class="index-entry-id" id="index-continuous-underlining-_0028cu_0029"></a>
+<a class="index-entry-id" id="index-underlining_002c-continuous-_0028cu_0029"></a>
+<p>The <code class="code">cu</code> request is similar to <code class="code">ul</code> but underlines spaces as
+well (if a TTY output device is used).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002euf"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.uf</code></strong> <var class="def-var-arguments">font</var><a class="copiable-link" href='#index-_002euf'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-uf"></a>
+<a class="index-entry-id" id="index-underline-font-_0028uf_0029"></a>
+<a class="index-entry-id" id="index-font-for-underlining-_0028uf_0029"></a>
+<p>Set the underline font (globally) used by <code class="code">ul</code> and <code class="code">cu</code>. By
+default, this is the font at position&nbsp;2. <var class="var">font</var> can be either
+a non-negative font position or the name of a font.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ebd"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.bd</code></strong> <var class="def-var-arguments">font [<span class="r"><i class="slanted">offset</i></span>]</var><a class="copiable-link" href='#index-_002ebd'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-bd"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002ebd-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.bd</code></strong> <var class="def-var-arguments">font1 font2 [<span class="r"><i class="slanted">offset</i></span>]</var><a class="copiable-link" href='#index-_002ebd-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eb_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.b]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eb_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eb"></a>
+<a class="index-entry-id" id="index-imitating-boldface-_0028bd_0029"></a>
+<a class="index-entry-id" id="index-boldface_002c-imitating-_0028bd_0029"></a>
+<p>Embolden <var class="var">font</var> by overstriking its glyphs offset by <var class="var">offset</var>
+units minus one.
+</p>
+<p>Two syntax forms are available.
+</p>
+<ul class="itemize mark-bullet">
+<li>Imitate a bold font unconditionally. The first argument specifies the
+font to embolden, and the second is the number of basic units, minus
+one, by which the two glyphs are offset. If the second argument is
+missing, emboldening is turned off.
+
+<p><var class="var">font</var> can be either a non-negative font position or the name of a
+font.
+</p>
+<p><var class="var">offset</var> is available in the <code class="code">.b</code> read-only register if a
+special font is active; in the <code class="code">bd</code> request, its default unit is
+&lsquo;<samp class="samp">u</samp>&rsquo;.
+</p>
+</li><li><a class="index-entry-id" id="index-fspecial-request_002c-and-imitating-bold"></a>
+<a class="index-entry-id" id="index-special"></a>
+<a class="index-entry-id" id="index-embolding-of-special-fonts"></a>
+<a class="index-entry-id" id="index-special-fonts_002c-emboldening"></a>
+Imitate a bold form conditionally. Embolden <var class="var">font1</var> by <var class="var">offset</var>
+only if font <var class="var">font2</var> is the current font. This request can be
+issued repeatedly to set up different emboldening values for different
+current fonts. If the second argument is missing, emboldening is turned
+off for this particular current font.
+
+<p>This affects special fonts only (either set up with the <code class="code">special</code>
+command in font files or with the <code class="code">fspecial</code> request).
+</p></li></ul>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ecs"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.cs</code></strong> <var class="def-var-arguments">font [<span class="r"><i class="slanted">width</i></span> [<span class="r"><i class="slanted">em-size</i></span>]]</var><a class="copiable-link" href='#index-_002ecs'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-cs"></a>
+<a class="index-entry-id" id="index-constant-glyph-space-mode-_0028cs_0029"></a>
+<a class="index-entry-id" id="index-mode-for-constant-glyph-space-_0028cs_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-constant-space"></a>
+<a class="index-entry-id" id="index-ps-request_002c-and-constant-glyph-space-mode"></a>
+<p>Switch to and from <em class="dfn">constant glyph space mode</em>. If activated, the
+width of every glyph is <em class="math"><var class="var">width</var>/36</em> ems. The em size is given
+absolutely by <var class="var">em-size</var>; if this argument is missing, the em value
+is taken from the current font size (as set with the <code class="code">ps</code> request)
+when the font is effectively in use. Without second and third argument,
+constant glyph space mode is deactivated.
+</p>
+<p>Default scaling unit for <var class="var">em-size</var> is &lsquo;<samp class="samp">z</samp>&rsquo;; <var class="var">width</var> is an
+integer.
+</p></dd></dl>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Ligatures-and-Kerning.html">Ligatures and Kerning</a>, Previous: <a href="Special-Fonts.html">Special Fonts</a>, Up: <a href="Using-Fonts.html">Using Fonts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Assigning-Register-Formats.html b/doc/groff.html.node/Assigning-Register-Formats.html
new file mode 100644
index 0000000..ff0ddfa
--- /dev/null
+++ b/doc/groff.html.node/Assigning-Register-Formats.html
@@ -0,0 +1,188 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Assigning Register Formats (The GNU Troff Manual)</title>
+
+<meta name="description" content="Assigning Register Formats (The GNU Troff Manual)">
+<meta name="keywords" content="Assigning Register Formats (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Registers.html" rel="up" title="Registers">
+<link href="Built_002din-Registers.html" rel="next" title="Built-in Registers">
+<link href="Auto_002dincrement.html" rel="prev" title="Auto-increment">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Assigning-Register-Formats">
+<div class="nav-panel">
+<p>
+Next: <a href="Built_002din-Registers.html" accesskey="n" rel="next">Built-in Registers</a>, Previous: <a href="Auto_002dincrement.html" accesskey="p" rel="prev">Auto-increment</a>, Up: <a href="Registers.html" accesskey="u" rel="up">Registers</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Assigning-Register-Formats-1">5.8.4 Assigning Register Formats</h4>
+<a class="index-entry-id" id="index-assign-number-format-to-register-_0028af_0029"></a>
+<a class="index-entry-id" id="index-number-formats_002c-assigning-to-register-_0028af_0029"></a>
+<a class="index-entry-id" id="index-register_002c-assigning-number-format-to-_0028af_0029"></a>
+
+<p>A writable register&rsquo;s value can be interpolated in several number
+formats. By default, conventional Arabic numerals are used.
+Other formats see use in sectioning and outlining schemes and
+alternative page numbering arrangements.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eaf"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.af</code></strong> <var class="def-var-arguments">reg fmt</var><a class="copiable-link" href='#index-_002eaf'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-af"></a>
+<p>Use number format <var class="var">fmt</var> when interpolating register <var class="var">reg</var>.
+Valid number formats are as follows.
+</p>
+<dl class="table">
+<dt><code class="code">0<span class="r">&hellip;</span></code></dt>
+<dd><p>Arabic numerals 0, 1, 2, and so on.
+Any decimal digit is equivalent to &lsquo;<samp class="samp">0</samp>&rsquo;; the formatter merely counts
+the digits specified. Multiple Arabic numerals in <var class="var">fmt</var> cause
+interpolations to be zero-padded on the left if necessary to at least as
+many digits as specified (interpolations never truncate a register
+value). A register with format &lsquo;<samp class="samp">00</samp>&rsquo; interpolates values 1, 2, 3 as
+&lsquo;<samp class="samp">01</samp>&rsquo;, &lsquo;<samp class="samp">02</samp>&rsquo;, &lsquo;<samp class="samp">03</samp>&rsquo;. The default format for all writable
+registers is &lsquo;<samp class="samp">0</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-Roman-numerals'><span><code class="code">I</code><a class="copiable-link" href='#index-Roman-numerals'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-numerals_002c-Roman"></a>
+<p>Uppercase Roman numerals: 0, I, II, III, IV,&nbsp;<small class="enddots">...</small>
+</p>
+</dd>
+<dt><code class="code">i</code></dt>
+<dd><p>Lowercase Roman numerals: 0, i, ii, iii, iv,&nbsp;<small class="enddots">...</small>
+</p>
+</dd>
+<dt><code class="code">A</code></dt>
+<dd><p>Uppercase letters: 0, A, B, C, &hellip;,&nbsp;Z, AA, AB,&nbsp;<small class="enddots">...</small>
+</p>
+</dd>
+<dt><code class="code">a</code></dt>
+<dd><p>Lowercase letters: 0, a, b, c, &hellip;,&nbsp;z, aa, ab,&nbsp;<small class="enddots">...</small>
+</p></dd>
+</dl>
+
+<p>Omitting <var class="var">fmt</var> causes a warning in category &lsquo;<samp class="samp">missing</samp>&rsquo;.
+See <a class="xref" href="Warnings.html">Warnings</a>, for information about the enablement and suppression of
+warnings. Specifying an unrecognized format is an error.
+</p>
+<p>Zero values are interpolated as &lsquo;<samp class="samp">0</samp>&rsquo; in non-Arabic formats.
+Negative quantities are prefixed with &lsquo;<samp class="samp">-</samp>&rsquo; irrespective of format.
+In Arabic formats, the sign supplements the field width. If <var class="var">reg</var>
+doesn&rsquo;t exist, it is created with a zero value.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a 10
+.af a 0 \&quot; the default format
+\na,
+.af a I
+\na,
+.af a 321
+.nr a (-\na)
+\na,
+.af a a
+\na
+ &rArr; 10, X, -010, -j
+</pre></div></div>
+
+<a class="index-entry-id" id="index-Roman-numerals_002c-extrema-_0028maximum-and-minimum_0029"></a>
+<a class="index-entry-id" id="index-extreme-values-representable-with-Roman-numerals"></a>
+<a class="index-entry-id" id="index-maximum-value-representable-with-Roman-numerals"></a>
+<a class="index-entry-id" id="index-minimum-value-representable-with-Roman-numerals"></a>
+<p>The representable extrema in the &lsquo;<samp class="samp">i</samp>&rsquo; and &lsquo;<samp class="samp">I</samp>&rsquo; formats
+correspond to Arabic ±39,999. GNU <code class="code">troff</code> uses &lsquo;<samp class="samp">w</samp>&rsquo; and
+&lsquo;<samp class="samp">z</samp>&rsquo; to represent 5,000 and 10,000 in Roman numerals, respectively,
+following the convention of <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>&mdash;currently, the
+correct glyphs for Roman numerals five thousand (<code class="code">U+2181</code>) and ten
+thousand (<code class="code">U+2182</code>) are not used.
+</p>
+<a class="index-entry-id" id="index-read_002donly-register_002c-changing-format"></a>
+<a class="index-entry-id" id="index-changing-format_002c-and-read_002donly-registers"></a>
+<p>Assigning the format of a read-only register is an error. Instead, copy
+the read-only register&rsquo;s value to, and assign the format of, a writable
+register.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cgr"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\g</code><span class="r"><i class="slanted">r</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cgr'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cg"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cg_0028rg"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\g(</code><span class="r"><i class="slanted">rg</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cg_0028rg'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cg_005breg_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\g[</code><span class="r"><i class="slanted">reg</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cg_005breg_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-format-of-register-_0028_005cg_0029"></a>
+<a class="index-entry-id" id="index-register_002c-format-_0028_005cg_0029"></a>
+<p>Interpolate the format of the register <var class="var">reg</var> (one-character
+name&nbsp;<var class="var">r</var>, two-character name <var class="var">rg</var>). Zeroes represent
+Arabic formats. If <var class="var">reg</var> is not defined, <var class="var">reg</var> is not created
+and nothing is interpolated. <code class="code">\g</code> is interpreted even in copy mode
+(see <a class="pxref" href="Copy-Mode.html">Copy Mode</a>).
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-register-format_002c-in-expressions"></a>
+<a class="index-entry-id" id="index-expressions_002c-and-register-format"></a>
+<p>GNU <code class="code">troff</code> interprets only Arabic numerals. The Roman numeral or
+alphabetic formats cannot be used as operands to arithmetic operators in
+expressions (see <a class="pxref" href="Numeric-Expressions.html">Numeric Expressions</a>). For instance, it may be
+desirable to test the page number independently of its format.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.af % i \&quot; front matter
+.de header-trap
+. \&quot; To test the page number, we need it in Arabic.
+. ds saved-page-number-format \\g%\&quot;
+. af % 0
+. nr page-number-in-decimal \\n%
+. af % \\*[saved-page-number-format]
+. ie \\n[page-number-in-decimal]=1 .do-first-page-stuff
+. el \{\
+. ie o .do-odd-numbered-page-stuff
+. el .do-even-numbered-page-stuff
+. \}
+. rm saved-page-number-format
+..
+.wh 0 header-trap
+</pre></div></div>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Built_002din-Registers.html">Built-in Registers</a>, Previous: <a href="Auto_002dincrement.html">Auto-increment</a>, Up: <a href="Registers.html">Registers</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Auto_002dincrement.html b/doc/groff.html.node/Auto_002dincrement.html
new file mode 100644
index 0000000..2680f67
--- /dev/null
+++ b/doc/groff.html.node/Auto_002dincrement.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Auto-increment (The GNU Troff Manual)</title>
+
+<meta name="description" content="Auto-increment (The GNU Troff Manual)">
+<meta name="keywords" content="Auto-increment (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Registers.html" rel="up" title="Registers">
+<link href="Assigning-Register-Formats.html" rel="next" title="Assigning Register Formats">
+<link href="Interpolating-Registers.html" rel="prev" title="Interpolating Registers">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Auto_002dincrement">
+<div class="nav-panel">
+<p>
+Next: <a href="Assigning-Register-Formats.html" accesskey="n" rel="next">Assigning Register Formats</a>, Previous: <a href="Interpolating-Registers.html" accesskey="p" rel="prev">Interpolating Registers</a>, Up: <a href="Registers.html" accesskey="u" rel="up">Registers</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Auto_002dincrement-1">5.8.3 Auto-increment</h4>
+<a class="index-entry-id" id="index-auto_002dincrementation-of-a-register"></a>
+<a class="index-entry-id" id="index-incrementation_002c-automatic_002c-of-a-register"></a>
+<a class="index-entry-id" id="index-decrementation_002c-automatic_002c-of-a-register"></a>
+
+<p>Registers can also be incremented or decremented by a configured amount
+at the time they are interpolated. The value of the increment is
+specified with a third argument to the <code class="code">nr</code> request, and a special
+interpolation syntax is used to alter and then retrieve the register&rsquo;s
+value. Together, these features are called
+<em class="dfn">auto-increment</em>.<a class="footnote" id="DOCF51" href="groff.html_fot.html#FOOT51"><sup>51</sup></a>
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enr-4"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nr</code></strong> <var class="def-var-arguments">ident value incr</var><a class="copiable-link" href='#index-_002enr-4'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nr-3"></a>
+<a class="index-entry-id" id="index-_005cR_002c-difference-from-nr"></a>
+<p>Set register <var class="var">ident</var> to <var class="var">value</var> and its auto-incrementation
+amount to to <var class="var">incr</var>. The <code class="code">\R</code> escape sequence doesn&rsquo;t support
+an <var class="var">incr</var> argument.
+</p></dd></dl>
+
+<p>Auto-incrementation is not <em class="emph">completely</em> automatic; the <code class="code">\n</code>
+escape sequence in its basic form never alters the value of a register.
+To apply auto-incrementation to a register, interpolate it with
+&lsquo;<samp class="samp">\n±</samp>&rsquo;.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_002bi"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\n+</code><span class="r"><i class="slanted">i</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cn_002bi'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cn-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_002di"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\n-</code><span class="r"><i class="slanted">i</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cn_002di'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_002b_0028id"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\n+(</code><span class="r"><i class="slanted">id</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cn_002b_0028id'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_002d_0028id"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\n-(</code><span class="r"><i class="slanted">id</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cn_002d_0028id'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_002b_005bident_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\n+[</code><span class="r"><i class="slanted">ident</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cn_002b_005bident_005d'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_002d_005bident_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\n-[</code><span class="r"><i class="slanted">ident</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cn_002d_005bident_005d'> &para;</a></span></dt>
+<dd><p>Increment or decrement <var class="var">ident</var> (one-character
+name&nbsp;<var class="var">i</var>, two-character name <var class="var">id</var>) by the register&rsquo;s
+auto-incrementation value and then interpolate the new register value.
+If <var class="var">ident</var> has no auto-incrementation value, interpolate as with
+<code class="code">\n</code>.
+</p></dd></dl>
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a 0 1
+.nr xx 0 5
+.nr foo 0 -2
+\n+a, \n+a, \n+a, \n+a, \n+a
+.br
+\n-(xx, \n-(xx, \n-(xx, \n-(xx, \n-(xx
+.br
+\n+[foo], \n+[foo], \n+[foo], \n+[foo], \n+[foo]
+ &rArr; 1, 2, 3, 4, 5
+ &rArr; -5, -10, -15, -20, -25
+ &rArr; -2, -4, -6, -8, -10
+</pre></div></div>
+
+<a class="index-entry-id" id="index-increment-value-without-changing-the-register"></a>
+<a class="index-entry-id" id="index-value_002c-incrementing-without-changing-the-register"></a>
+<p>To change the increment value without changing the value of a register,
+assign the register&rsquo;s value to itself by interpolating it, and specify
+the desired increment normally. Apply an increment of &lsquo;<samp class="samp">0</samp>&rsquo; to
+disable auto-incrementation of the register.
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Assigning-Register-Formats.html">Assigning Register Formats</a>, Previous: <a href="Interpolating-Registers.html">Interpolating Registers</a>, Up: <a href="Registers.html">Registers</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Background.html b/doc/groff.html.node/Background.html
new file mode 100644
index 0000000..1ce4224
--- /dev/null
+++ b/doc/groff.html.node/Background.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Background (The GNU Troff Manual)</title>
+
+<meta name="description" content="Background (The GNU Troff Manual)">
+<meta name="keywords" content="Background (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Introduction.html" rel="up" title="Introduction">
+<link href="What-Is-groff_003f.html" rel="next" title="What Is groff?">
+<link href="Introduction.html" rel="prev" title="Introduction">
+<style type="text/css">
+<!--
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Background">
+<div class="nav-panel">
+<p>
+Next: <a href="What-Is-groff_003f.html" accesskey="n" rel="next">What Is <code class="code">groff</code>?</a>, Previous: <a href="Introduction.html" accesskey="p" rel="prev">Introduction</a>, Up: <a href="Introduction.html" accesskey="u" rel="up">Introduction</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Background-1">1.1 Background</h3>
+<a class="index-entry-id" id="index-background"></a>
+
+<p>M. Douglas McIlroy, formerly of AT&amp;T Bell Laboratories and present at
+the creation of the Unix operating system, offers an authoritative
+historical summary.
+</p>
+<blockquote class="quotation">
+<p>The prime reason for Unix was the desire of Ken [Thompson], Dennis
+[Ritchie], and Joe Ossanna to have a pleasant environment for software
+development. The fig leaf that got the nod from &hellip;
+management was that an early use would be to develop a &ldquo;stand-alone&rdquo;
+word-processing system for use in typing pools and secretarial offices.
+Perhaps they had in mind &ldquo;dedicated&rdquo;, as distinct from
+&ldquo;stand-alone&rdquo;; that&rsquo;s what eventuated in various cases, most notably
+in the legal/patent department and in the AT&amp;T CEO&rsquo;s office.
+</p>
+<p>Both those systems were targets of opportunity, not foreseen from the
+start. When Unix was up and running on the PDP-11, Joe got wind of
+the legal department having installed a commercial word processor.
+He went to pitch Unix as an alternative and clinched a trial by
+promising to make <code class="code">roff</code> able to number lines by tomorrow in order
+to fulfill a patent-office requirement that the commercial system did
+not support.
+</p>
+<p>Modems were installed so legal-department secretaries could try the
+Research machine. They liked it and Joe&rsquo;s superb customer service.
+Soon the legal department got a system of their own. Joe went on to
+create <code class="code">nroff</code> and <code class="code">troff</code>. Document preparation became a
+widespread use of Unix, but no stand-alone word-processing system was
+ever undertaken.
+</p></blockquote>
+
+<p>A history relating <code class="code">groff</code> to its predecessors <code class="code">roff</code>,
+<code class="code">nroff</code>, and <code class="code">troff</code> is available in the <cite class="cite">roff<span class="r">(7)</span></cite>
+man page.
+</p>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="What-Is-groff_003f.html">What Is <code class="code">groff</code>?</a>, Previous: <a href="Introduction.html">Introduction</a>, Up: <a href="Introduction.html">Introduction</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Basics.html b/doc/groff.html.node/Basics.html
new file mode 100644
index 0000000..95db07b
--- /dev/null
+++ b/doc/groff.html.node/Basics.html
@@ -0,0 +1,232 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Basics (The GNU Troff Manual)</title>
+
+<meta name="description" content="Basics (The GNU Troff Manual)">
+<meta name="keywords" content="Basics (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Tutorial-for-Macro-Users.html" rel="up" title="Tutorial for Macro Users">
+<link href="Common-Features.html" rel="next" title="Common Features">
+<link href="Tutorial-for-Macro-Users.html" rel="prev" title="Tutorial for Macro Users">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+span.w-nolinebreak-text {white-space: nowrap}
+ul.mark-bullet {list-style-type: disc}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Basics">
+<div class="nav-panel">
+<p>
+Next: <a href="Common-Features.html" accesskey="n" rel="next">Common Features</a>, Previous: <a href="Tutorial-for-Macro-Users.html" accesskey="p" rel="prev">Tutorial for Macro Users</a>, Up: <a href="Tutorial-for-Macro-Users.html" accesskey="u" rel="up">Tutorial for Macro Users</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Basics-1">3.1 Basics</h3>
+<a class="index-entry-id" id="index-basics-of-macro-package-usage"></a>
+<a class="index-entry-id" id="index-macro-package-usage_002c-basics-of"></a>
+
+<p>Let us first survey some basic concepts necessary to use a macro package
+fruitfully.<a class="footnote" id="DOCF6" href="groff.html_fot.html#FOOT6"><sup>6</sup></a>
+References are made throughout to more detailed information.
+</p>
+<p>GNU <code class="code">troff</code> reads an input file prepared by the user and outputs a
+formatted document suitable for publication or framing. The input
+consists of text, or words to be printed, and embedded commands
+(<i class="slanted">requests</i> and <i class="slanted">escape sequences</i>), which tell GNU
+<code class="code">troff</code> how to format the output. See <a class="xref" href="Formatter-Instructions.html">Formatter Instructions</a>.
+</p>
+<p>The word <i class="slanted">argument</i> is used in this chapter to mean a word or
+number that appears on the same line as a request, and which modifies
+the meaning of that request. For example, the request
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.sp
+</pre></div></div>
+
+<p>spaces one line, but
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.sp 4
+</pre></div></div>
+
+<p>spaces four lines. The number&nbsp;4 is an argument to the <code class="code">sp</code>
+request, which says to space four lines instead of one. Arguments are
+separated from the request and from each other by spaces (<em class="emph">not</em>
+tabs). See <a class="xref" href="Invoking-Requests.html">Invoking Requests</a>.
+</p>
+<p>The primary function of GNU <code class="code">troff</code> is to collect words from input
+lines, fill output lines with those words, adjust the line to the
+right-hand margin by widening spaces, and output the result. For
+example, the input:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">Now is the time
+for all good men
+to come to the aid
+of their party.
+Four score and seven
+years ago, etc.
+</pre></div></div>
+
+<p>is read, packed onto output lines, and justified to produce:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; Now is the time for all good men to come to the aid of
+ &rArr; their party. Four score and seven years ago, etc.
+</pre></div></div>
+
+<p>Sometimes a new output line should be started even though the current
+line is not yet full&mdash;for example, at the end of a paragraph. To do
+this it is possible to force a <i class="slanted">break</i>, starting a new output
+line. Some requests cause a break automatically, as do (normally) blank
+input lines and input lines beginning with a space or tab.
+</p>
+<p>Not all input lines are <i class="slanted">text lines</i>&mdash;words to be formatted.
+Some are <i class="slanted">control lines</i> that tell a macro package (or GNU
+<code class="code">troff</code> directly) how to format the text. Control lines start with
+a dot (&lsquo;<samp class="samp">.</samp>&rsquo;) or an apostrophe (&lsquo;<samp class="samp">'</samp>&rsquo;) as the first character, and
+can be followed by a <i class="slanted">macro call</i>.
+</p>
+<p>The formatter also does more complex things, such as automatically
+numbering pages, skipping over page boundaries, putting footnotes in the
+correct place, and so forth.
+</p>
+<p>Here are a few hints for preparing text for input to GNU <code class="code">troff</code>.
+</p>
+<ul class="itemize mark-bullet">
+<li>First, keep the input lines short. Short input lines are easier to
+edit, and GNU <code class="code">troff</code> packs words onto longer lines anyhow.
+
+</li><li>In keeping with this, it is helpful to begin a new line after every
+comma or phrase, since common corrections are to add or delete sentences
+or phrases.
+
+</li><li>End each sentence with two spaces&mdash;or better, start each sentence on a
+new line. GNU <code class="code">troff</code> recognizes characters that usually end a
+sentence, and inserts inter-sentence space accordingly.
+
+</li><li>Do not hyphenate words at the end of lines&mdash;GNU <code class="code">troff</code> is smart
+enough to hyphenate words as needed, but is not smart enough to take
+hyphens out and join a word back together. Also, words such as
+&ldquo;mother-in-law&rdquo; should not be broken over a line, since then a space
+can occur where not wanted, such as &ldquo;<span class="w-nolinebreak-text">mother-</span>&nbsp;in<!-- /@w -->-law&rdquo;.
+</li></ul>
+
+<p>We offer further advice in <a class="ref" href="Input-Conventions.html">Input Conventions</a>.
+</p>
+<a class="index-entry-id" id="index-vertical-spacing-_0028introduction_0029"></a>
+<a class="index-entry-id" id="index-spacing_002c-vertical-_0028introduction_0029"></a>
+<p>GNU <code class="code">troff</code> permits alteration of the distance between lines of
+text. This is termed <i class="slanted">vertical spacing</i> and is expressed in the
+same units as the type size&mdash;the point. The default is 10-point type
+on 12-point spacing. To get <i class="slanted">double-spaced</i> text you would set
+the vertical spacing to 24 points. Some, but not all, macro packages
+expose a macro or register to configure the vertical spacing.
+</p>
+<p>A number of requests allow you to change the way the output is arranged
+on the page, sometimes called the <i class="slanted">layout</i> of the output page.
+Most macro packages don&rsquo;t supply macros for performing these (at least
+not without performing other actions besides), as they are such basic
+operations. The macro packages for writing man pages, <samp class="file">man</samp> and
+<samp class="file">mdoc</samp>, don&rsquo;t encourage explicit use of these requests at all.
+</p>
+<a class="index-entry-id" id="index-spacing-_0028introduction_0029"></a>
+<p>The request &lsquo;<samp class="samp">.sp&nbsp;<var class="var">N</var></samp>&rsquo;<!-- /@w --> leaves <var class="var">N</var>&nbsp;lines of blank
+space. <var class="var">N</var>&nbsp;can be omitted (skipping a single line) or can
+be of the form <var class="var">N</var>i (for <var class="var">N</var>&nbsp;inches) or <var class="var">N</var>c (for
+<var class="var">N</var>&nbsp;centimeters). For example, the input:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.sp 1.5i
+My thoughts on the subject
+.sp
+</pre></div></div>
+
+<p>leaves one and a half inches of space, followed by the line &ldquo;My
+thoughts on the subject&rdquo;, followed by a single blank line (more
+measurement units are available; see <a class="ref" href="Measurements.html">Measurements</a>).
+</p>
+<p>If you seek precision in spacing, be advised when using a macro package
+that it might not honor <code class="code">sp</code> requests as you expect; it can use a
+formatter feature called <i class="slanted">no-space mode</i> to prevent excess space
+from accumulating. Macro packages typically offer registers to control
+spacing between paragraphs, before section headings, and around displays
+(discussed below); use these facilities preferentially.
+See <a class="xref" href="Manipulating-Spacing.html">Manipulating Spacing</a>.
+</p>
+<a class="index-entry-id" id="index-centering-lines-_0028introduction_0029"></a>
+<a class="index-entry-id" id="index-lines_002c-centering-_0028introduction_0029"></a>
+<p>Text lines can be centered by using the <code class="code">ce</code> request. The line
+after <code class="code">ce</code> is centered (horizontally) on the page. To center more
+than one line, use &lsquo;<samp class="samp">.ce&nbsp;<var class="var">N</var></samp>&rsquo;<!-- /@w --> (where <var class="var">N</var> is the number
+of lines to center), followed by the <var class="var">N</var>&nbsp;lines. To center many
+lines without counting them, type:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ce 1000
+lines to center
+.ce 0
+</pre></div></div>
+
+<p>The &lsquo;<samp class="samp">.ce&nbsp;0</samp>&rsquo;<!-- /@w --> request tells GNU <code class="code">troff</code> to center zero more
+lines, in other words, stop centering.
+</p>
+<a class="index-entry-id" id="index-right_002daligning-lines-_0028introduction_0029"></a>
+<a class="index-entry-id" id="index-lines_002c-right_002daligning-_0028introduction_0029"></a>
+<a class="index-entry-id" id="index-right_002djustifying-lines-_0028introduction_0029"></a>
+<a class="index-entry-id" id="index-lines_002c-right_002djustifying-_0028introduction_0029"></a>
+<p>GNU <code class="code">troff</code> also offers the <code class="code">rj</code> request for right-aligning
+text. It works analogously to <code class="code">ce</code> and is convenient for setting
+epigraphs.
+</p>
+<a class="index-entry-id" id="index-page-break-_0028introduction_0029"></a>
+<a class="index-entry-id" id="index-break_002c-page-_0028introduction_0029"></a>
+<p>The <code class="code">bp</code> request starts a new page; this necessarily implies an
+ordinary (line) break.
+</p>
+<a class="index-entry-id" id="index-break-_0028introduction_0029"></a>
+<a class="index-entry-id" id="index-line-break-_0028introduction_0029"></a>
+<p>All of these requests cause a break; that is, they always start a new
+line. To start a new line without performing any other action, use
+<code class="code">br</code>. If you invoke them with the apostrophe &lsquo;<samp class="samp">'</samp>&rsquo;, the
+<i class="slanted">no-break control character</i>, the (initial) break they normally
+perform is suppressed. &lsquo;<samp class="samp">'br</samp>&rsquo; does nothing.
+</p>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Common-Features.html">Common Features</a>, Previous: <a href="Tutorial-for-Macro-Users.html">Tutorial for Macro Users</a>, Up: <a href="Tutorial-for-Macro-Users.html">Tutorial for Macro Users</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Blank-Line-Traps.html b/doc/groff.html.node/Blank-Line-Traps.html
new file mode 100644
index 0000000..b7b0ae4
--- /dev/null
+++ b/doc/groff.html.node/Blank-Line-Traps.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Blank Line Traps (The GNU Troff Manual)</title>
+
+<meta name="description" content="Blank Line Traps (The GNU Troff Manual)">
+<meta name="keywords" content="Blank Line Traps (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Traps.html" rel="up" title="Traps">
+<link href="Leading-Space-Traps.html" rel="next" title="Leading Space Traps">
+<link href="Input-Line-Traps.html" rel="prev" title="Input Line Traps">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Blank-Line-Traps">
+<div class="nav-panel">
+<p>
+Next: <a href="Leading-Space-Traps.html" accesskey="n" rel="next">Leading Space Traps</a>, Previous: <a href="Input-Line-Traps.html" accesskey="p" rel="prev">Input Line Traps</a>, Up: <a href="Traps.html" accesskey="u" rel="up">Traps</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Blank-Line-Traps-1">5.28.3 Blank Line Traps</h4>
+<a class="index-entry-id" id="index-blank-line-traps"></a>
+<a class="index-entry-id" id="index-traps_002c-blank-line"></a>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eblm"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.blm</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002eblm'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-blm"></a>
+<a class="index-entry-id" id="index-blank-line-macro-_0028blm_0029-2"></a>
+<p>Set a blank line trap, calling the macro <var class="var">name</var> when GNU
+<code class="code">troff</code> encounters a blank line in an input file, instead of the
+usual behavior (see <a class="pxref" href="Breaking.html">Breaking</a>). A line consisting only of spaces is
+also treated as blank and subject to this trap. If no argument is
+supplied, the default blank line behavior is (re-)established.
+</p></dd></dl>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Breaking.html b/doc/groff.html.node/Breaking.html
new file mode 100644
index 0000000..a883e07
--- /dev/null
+++ b/doc/groff.html.node/Breaking.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Breaking (The GNU Troff Manual)</title>
+
+<meta name="description" content="Breaking (The GNU Troff Manual)">
+<meta name="keywords" content="Breaking (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Text.html" rel="up" title="Text">
+<link href="Adjustment.html" rel="next" title="Adjustment">
+<link href="Hyphenation.html" rel="prev" title="Hyphenation">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Breaking">
+<div class="nav-panel">
+<p>
+Next: <a href="Adjustment.html" accesskey="n" rel="next">Adjustment</a>, Previous: <a href="Hyphenation.html" accesskey="p" rel="prev">Hyphenation</a>, Up: <a href="Text.html" accesskey="u" rel="up">Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Breaking-1">5.1.4 Breaking</h4>
+<a class="index-entry-id" id="index-break"></a>
+<a class="index-entry-id" id="index-implicit-line-break"></a>
+<a class="index-entry-id" id="index-line-break_002c-output"></a>
+<a class="index-entry-id" id="index-output-line-break"></a>
+
+<p>Once an output line is full, the next word (or remainder of a hyphenated
+one) is placed on a different output line; this is called a <em class="dfn">break</em>.
+In this manual and in <code class="code">roff</code> discussions generally, a &ldquo;break&rdquo; if
+not further qualified always refers to the termination of an output
+line. When the formatter is filling text, it introduces breaks
+automatically to keep output lines from exceeding the configured line
+length. After an automatic break, GNU <code class="code">troff</code> adjusts the line if
+applicable (see below), and then resumes collecting and filling text on
+the next output line.
+</p>
+<p>Sometimes, a line cannot be broken automatically. This usually does
+not happen with natural language text unless the output line length has
+been manipulated to be extremely short, but it can with specialized
+text like program source code. We can use <code class="code">perl</code> at the shell
+prompt to contrive an example of failure to break the line. We also
+employ the <samp class="option">-z</samp> option to suppress normal output.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">$ perl -e 'print &quot;#&quot; x 80, &quot;\n&quot;;' | nroff -z
+ error&rarr; warning: cannot break line
+</pre></div></div>
+
+<p>The remedy for these cases is to tell GNU <code class="code">troff</code> where the line
+may be broken without hyphens. This is done with the non-printing break
+point escape sequence &lsquo;<samp class="samp">\:</samp>&rsquo;; see <a class="ref" href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a>.
+</p>
+<a class="index-entry-id" id="index-blank-line"></a>
+<a class="index-entry-id" id="index-empty-line"></a>
+<a class="index-entry-id" id="index-line_002c-blank"></a>
+<a class="index-entry-id" id="index-blank-line-macro-_0028blm_0029"></a>
+<p>What if the document author wants to stop filling lines temporarily, for
+instance to start a new paragraph? There are several solutions. A
+blank input line not only causes a break, but by default it also outputs
+a one-line vertical space (effectively a blank output line). This
+behavior can be modified; see <a class="ref" href="Blank-Line-Traps.html">Blank Line Traps</a>. Macro packages
+may discourage or disable the blank line method of paragraphing in favor
+of their own macros.
+</p>
+<a class="index-entry-id" id="index-leading-spaces"></a>
+<a class="index-entry-id" id="index-spaces_002c-leading-and-trailing"></a>
+<a class="index-entry-id" id="index-trailing-spaces-on-text-lines"></a>
+<a class="index-entry-id" id="index-leading-space-macro-_0028lsm_0029"></a>
+<p>A line that begins with one or more spaces causes a break. The spaces
+are output at the beginning of the next line without being
+<em class="emph">adjusted</em> (see below); however, this behavior can be modified
+(see <a class="pxref" href="Leading-Space-Traps.html">Leading Space Traps</a>). Again, macro packages may provide other
+methods of producing indented paragraphs. Trailing spaces on text lines
+are discarded.<a class="footnote" id="DOCF23" href="groff.html_fot.html#FOOT23"><sup>23</sup></a>
+</p>
+<p>What if the file ends before enough words have been collected to fill an
+output line? Or the output line is exactly full but not yet broken, and
+there is no more input? GNU <code class="code">troff</code> interprets the end of input as
+a break. Certain requests also cause breaks, implicitly or explicitly.
+This is discussed in <a class="ref" href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a>.
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Adjustment.html">Adjustment</a>, Previous: <a href="Hyphenation.html">Hyphenation</a>, Up: <a href="Text.html">Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Built_002din-Registers.html b/doc/groff.html.node/Built_002din-Registers.html
new file mode 100644
index 0000000..a1b0530
--- /dev/null
+++ b/doc/groff.html.node/Built_002din-Registers.html
@@ -0,0 +1,253 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Built-in Registers (The GNU Troff Manual)</title>
+
+<meta name="description" content="Built-in Registers (The GNU Troff Manual)">
+<meta name="keywords" content="Built-in Registers (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Registers.html" rel="up" title="Registers">
+<link href="Assigning-Register-Formats.html" rel="prev" title="Assigning Register Formats">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Built_002din-Registers">
+<div class="nav-panel">
+<p>
+Previous: <a href="Assigning-Register-Formats.html" accesskey="p" rel="prev">Assigning Register Formats</a>, Up: <a href="Registers.html" accesskey="u" rel="up">Registers</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Built_002din-Registers-1">5.8.5 Built-in Registers</h4>
+<a class="index-entry-id" id="index-built_002din-registers"></a>
+<a class="index-entry-id" id="index-registers_002c-built_002din"></a>
+
+<p>Predefined registers whose identifiers start with a dot are read-only.
+Many are Boolean-valued, interpolating a true or false value testable
+with the <code class="code">if</code>, <code class="code">ie</code>, or <code class="code">while</code> requests. Some read-only
+registers are string-valued, meaning that they interpolate text.
+</p>
+<a class="index-entry-id" id="index-removing-a-built_002din-register"></a>
+<a class="index-entry-id" id="index-register_002c-built_002din_002c-removing"></a>
+<a class="index-entry-id" id="index-built_002din-register_002c-removing"></a>
+<p><strong class="strong">Caution:</strong> Built-in registers are subject to removal like
+others; once removed, they can be recreated only as normal writable
+registers and will not reflect formatter state.
+</p>
+<p>A register name (without the dot) is often associated with a request of
+the same name. A complete listing of all built-in registers can be
+found in <a class="ref" href="Register-Index.html">Register Index</a>.
+</p>
+<p>We present here a few built-in registers that are not described
+elsewhere in this manual; they have to do with invariant properties of
+GNU <code class="code">troff</code>, or obtain information about the formatter&rsquo;s
+command-line options, processing progress, or the operating environment.
+</p>
+<dl class="table">
+<dt id='index-_002eA'><span><code class="code">\n[.A]</code><a class="copiable-link" href='#index-_002eA'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-approximation-output-register-_0028_002eA_0029"></a>
+<a class="index-entry-id" id="index-plain-text-approximation-output-register-_0028_002eA_0029-1"></a>
+<p>Approximate output is being formatted (Boolean-valued); see
+<code class="command">groff</code> <samp class="option">-a</samp> option (<a class="ref" href="Groff-Options.html">Options</a>).
+</p>
+</dd>
+<dt id='index-c_002e'><span><code class="code">\n[.c]</code><a class="copiable-link" href='#index-c_002e'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ec"></a>
+</dd>
+<dt><code class="code">\n[c.]</code></dt>
+<dd><a class="index-entry-id" id="index-input-line-number-register-_0028_002ec_002c-c_002e_0029"></a>
+<a class="index-entry-id" id="index-line-number_002c-input_002c-register-_0028_002ec_002c-c_002e_0029"></a>
+<p>Input line number. &lsquo;<samp class="samp">c.</samp>&rsquo; is a writable synonym,
+affecting subsequent interpolations of both &lsquo;<samp class="samp">.c</samp>&rsquo; and &lsquo;<samp class="samp">c.</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-current-input-file-name-register-_0028_002eF_0029'><span><code class="code">\n[.F]</code><a class="copiable-link" href='#index-current-input-file-name-register-_0028_002eF_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-input-file-name_002c-current_002c-register-_0028_002eF_0029"></a>
+<a class="index-entry-id" id="index-_002eF"></a>
+<p>Name of input file (string-valued).
+</p>
+</dd>
+<dt id='index-_002eg'><span><code class="code">\n[.g]</code><a class="copiable-link" href='#index-_002eg'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-GNU-troff_002c-identification-register-_0028_002eg_0029"></a>
+<a class="index-entry-id" id="index-GNU_002dspecific-register-_0028_002eg_0029"></a>
+<p>Always true in GNU <code class="code">troff</code> (Boolean-valued). Documents can use
+this to ask the formatter if it claims <code class="code">groff</code> compatibility.
+</p>
+</dd>
+<dt id='index-_002eP'><span><code class="code">\n[.P]</code><a class="copiable-link" href='#index-_002eP'> &para;</a></span></dt>
+<dd><p>Output page selection status (Boolean-valued); see <code class="command">groff</code>
+<samp class="option">-o</samp> option (<a class="ref" href="Groff-Options.html">Options</a>).
+</p>
+</dd>
+<dt id='index-number-of-registers-register-_0028_002eR_0029'><span><code class="code">\n[.R]</code><a class="copiable-link" href='#index-number-of-registers-register-_0028_002eR_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-registers_002c-number-of_002c-register-_0028_002eR_0029"></a>
+<a class="index-entry-id" id="index-_002eR-2"></a>
+<p>Count of available unused registers; always 10,000 in GNU
+<code class="code">troff</code>.<a class="footnote" id="DOCF52" href="groff.html_fot.html#FOOT52"><sup>52</sup></a>
+</p>
+</dd>
+<dt id='index-_002eT-2'><span><code class="code">\n[.T]</code><a class="copiable-link" href='#index-_002eT-2'> &para;</a></span></dt>
+<dd><p>Indicator of output device selection (Boolean-valued); see
+<code class="command">groff</code> <samp class="option">-T</samp> option (<a class="ref" href="Groff-Options.html">Options</a>).
+</p>
+</dd>
+<dt id='index-safer-mode-2'><span><code class="code">\n[.U]</code><a class="copiable-link" href='#index-safer-mode-2'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-mode_002c-safer-2"></a>
+<a class="index-entry-id" id="index-unsafe-mode-2"></a>
+<a class="index-entry-id" id="index-mode_002c-unsafe-2"></a>
+<a class="index-entry-id" id="index-_002eU"></a>
+<p>Unsafe mode enablement status (Boolean-valued); see <code class="command">groff</code>
+<samp class="option">-U</samp> option (<a class="ref" href="Groff-Options.html">Options</a>).
+</p>
+</dd>
+<dt id='index-_002ex'><span><code class="code">\n[.x]</code><a class="copiable-link" href='#index-_002ex'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-major-version-number-register-_0028_002ex_0029"></a>
+<a class="index-entry-id" id="index-version-number_002c-major_002c-register-_0028_002ex_0029"></a>
+<p>Major version number of the running GNU <code class="code">troff</code> formatter. For
+example, if the version number is 1.23.0, then <code class="code">.x</code>
+contains&nbsp;&lsquo;<samp class="samp">1</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-_002ey'><span><code class="code">\n[.y]</code><a class="copiable-link" href='#index-_002ey'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-minor-version-number-register-_0028_002ey_0029"></a>
+<a class="index-entry-id" id="index-version-number_002c-minor_002c-register-_0028_002ey_0029"></a>
+<p>Minor version number of the running GNU <code class="code">troff</code> formatter. For
+example, if the version number is 1.23.0, then <code class="code">.y</code>
+contains&nbsp;&lsquo;<samp class="samp">23</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-_002eY'><span><code class="code">\n[.Y]</code><a class="copiable-link" href='#index-_002eY'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-revision-number-register-_0028_002eY_0029"></a>
+<p>Revision number of the running GNU <code class="code">troff</code> formatter. For example,
+if the version number is 1.23.0, then <code class="code">.Y</code> contains&nbsp;&lsquo;<samp class="samp">0</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-_0024_0024'><span><code class="code">\n[$$]</code><a class="copiable-link" href='#index-_0024_0024'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-process-ID-of-GNU-troff-register-_0028_0024_0024_0029"></a>
+<a class="index-entry-id" id="index-PID-of-GNU-troff-register-_0028_0024_0024_0029"></a>
+<a class="index-entry-id" id="index-GNU-troff_002c-process-ID-register-_0028_0024_0024_0029"></a>
+<a class="index-entry-id" id="index-GNU-troff_002c-PID-register-_0028_0024_0024_0029"></a>
+<p>Process identifier (PID) of the GNU <code class="code">troff</code> program in its
+operating environment.
+</p></dd>
+</dl>
+
+<p>Date- and time-related registers are set per the local time as
+determined by <cite class="cite">localtime<span class="r">(3)</span></cite> when the formatter launches. This
+initialization can be overridden by <code class="env">SOURCE_DATE_EPOCH</code> and
+<code class="env">TZ</code>; see <a class="ref" href="Environment.html">Environment</a>.
+</p>
+<dl class="table">
+<dt id='index-seconds_002c-current-time-_0028seconds_0029'><span><code class="code">\n[seconds]</code><a class="copiable-link" href='#index-seconds_002c-current-time-_0028seconds_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-time_002c-current_002c-seconds-_0028seconds_0029"></a>
+<a class="index-entry-id" id="index-current-time_002c-seconds-_0028seconds_0029"></a>
+<a class="index-entry-id" id="index-seconds"></a>
+<p>Count of seconds elapsed in the minute (0&ndash;60). </p>
+</dd>
+<dt id='index-minutes_002c-current-time-_0028minutes_0029'><span><code class="code">\n[minutes]</code><a class="copiable-link" href='#index-minutes_002c-current-time-_0028minutes_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-time_002c-current_002c-minutes-_0028minutes_0029"></a>
+<a class="index-entry-id" id="index-current-time_002c-minutes-_0028minutes_0029"></a>
+<a class="index-entry-id" id="index-minutes"></a>
+<p>Count of minutes elapsed in the hour (0&ndash;59).
+</p>
+</dd>
+<dt id='index-hours_002c-current-time-_0028hours_0029'><span><code class="code">\n[hours]</code><a class="copiable-link" href='#index-hours_002c-current-time-_0028hours_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-time_002c-current_002c-hours-_0028hours_0029"></a>
+<a class="index-entry-id" id="index-current-time_002c-hours-_0028hours_0029"></a>
+<a class="index-entry-id" id="index-hours"></a>
+<p>Count of hours elapsed since midnight (0&ndash;23).
+</p>
+</dd>
+<dt id='index-day-of-the-week-register-_0028dw_0029'><span><code class="code">\n[dw]</code><a class="copiable-link" href='#index-day-of-the-week-register-_0028dw_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-date_002c-day-of-the-week-register-_0028dw_0029"></a>
+<a class="index-entry-id" id="index-dw"></a>
+<p>Day of the week (1&ndash;7; 1 is Sunday).
+</p>
+</dd>
+<dt id='index-day-of-the-month-register-_0028dy_0029'><span><code class="code">\n[dy]</code><a class="copiable-link" href='#index-day-of-the-month-register-_0028dy_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-date_002c-day-of-the-month-register-_0028dy_0029"></a>
+<a class="index-entry-id" id="index-dy"></a>
+<p>Day of the month (1&ndash;31).
+</p>
+</dd>
+<dt id='index-month-of-the-year-register-_0028mo_0029'><span><code class="code">\n[mo]</code><a class="copiable-link" href='#index-month-of-the-year-register-_0028mo_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-date_002c-month-of-the-year-register-_0028mo_0029"></a>
+<a class="index-entry-id" id="index-mo"></a>
+<p>Month of the year (1&ndash;12).
+</p>
+</dd>
+<dt id='index-date_002c-year-register-_0028year_002c-yr_0029'><span><code class="code">\n[year]</code><a class="copiable-link" href='#index-date_002c-year-register-_0028year_002c-yr_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-year_002c-current_002c-register-_0028year_002c-yr_0029"></a>
+<a class="index-entry-id" id="index-year"></a>
+<p>Gregorian year.
+</p>
+<a class="index-entry-id" id="index-CSTR-_002354-errata"></a>
+<a class="index-entry-id" id="index-CSTR-_002354-erratum_002c-yr-register"></a>
+</dd>
+<dt id='index-yr'><span><code class="code">\n[yr]</code><a class="copiable-link" href='#index-yr'> &para;</a></span></dt>
+<dd><p>Gregorian year minus&nbsp;1900. This register is incorrectly documented
+in the <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> manual as storing the last two digits
+of the current year. That claim stopped being true in 2000. Old
+<code class="code">troff</code> input that looks like:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">'\&quot; The year number is a surprise after 1999.
+This document was formatted in 19\n(yr.
+</pre></div></div>
+
+<p>can be corrected to:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">This document was formatted in \n[year].
+</pre></div></div>
+
+<p>or, for portability across many <code class="code">roff</code> programs, to the following.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr y4 1900+\n(yr
+This document was formatted in \n(y4.
+</pre></div></div>
+</dd>
+</dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Previous: <a href="Assigning-Register-Formats.html">Assigning Register Formats</a>, Up: <a href="Registers.html">Registers</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Calling-Macros.html b/doc/groff.html.node/Calling-Macros.html
new file mode 100644
index 0000000..1e8d81a
--- /dev/null
+++ b/doc/groff.html.node/Calling-Macros.html
@@ -0,0 +1,164 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Calling Macros (The GNU Troff Manual)</title>
+
+<meta name="description" content="Calling Macros (The GNU Troff Manual)">
+<meta name="keywords" content="Calling Macros (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Formatter-Instructions.html" rel="up" title="Formatter Instructions">
+<link href="Using-Escape-Sequences.html" rel="next" title="Using Escape Sequences">
+<link href="Invoking-Requests.html" rel="prev" title="Invoking Requests">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+kbd.key {font-style: normal}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Calling-Macros">
+<div class="nav-panel">
+<p>
+Next: <a href="Using-Escape-Sequences.html" accesskey="n" rel="next">Using Escape Sequences</a>, Previous: <a href="Invoking-Requests.html" accesskey="p" rel="prev">Invoking Requests</a>, Up: <a href="Formatter-Instructions.html" accesskey="u" rel="up">Formatter Instructions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Calling-Macros-1">5.6.3 Calling Macros</h4>
+<a class="index-entry-id" id="index-calling-macros"></a>
+<a class="index-entry-id" id="index-macro-arguments"></a>
+<a class="index-entry-id" id="index-arguments-to-macros"></a>
+
+<p>If a macro of the desired name does not exist when called, it is
+created, assigned an empty definition, and a warning in category
+&lsquo;<samp class="samp">mac</samp>&rsquo; is emitted. Calling an undefined macro <em class="emph">does</em> end a
+macro definition naming it as its end macro (see <a class="pxref" href="Writing-Macros.html">Writing Macros</a>).
+</p>
+<a class="index-entry-id" id="index-spaces_002c-in-a-macro-argument"></a>
+<p>To embed spaces <em class="emph">within</em> a macro argument, enclose the argument in
+neutral double quotes <code class="code">&quot;</code>. Horizontal motion escape sequences are
+sometimes a better choice for arguments to be formatted as text.
+</p>
+<p>Consider calls to a hypothetical section heading macro &lsquo;<samp class="samp">uh</samp>&rsquo;.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.uh The Mouse Problem
+.uh &quot;The Mouse Problem&quot;
+.uh The\~Mouse\~Problem
+.uh The\ Mouse\ Problem
+</pre></div></div>
+
+<a class="index-entry-id" id="index-_005c_007e_002c-difference-from-_005cSP"></a>
+<a class="index-entry-id" id="index-_005cSP_002c-difference-from-_005c_007e"></a>
+<p>The first line calls <code class="code">uh</code> with three arguments: &lsquo;<samp class="samp">The</samp>&rsquo;,
+&lsquo;<samp class="samp">Mouse</samp>&rsquo;, and &lsquo;<samp class="samp">Problem</samp>&rsquo;. The remainder call the <code class="code">uh</code>
+macro with one argument, &lsquo;<samp class="samp">The Mouse Problem</samp>&rsquo;. The last solution,
+using escaped spaces, can be found in documents prepared for
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>. It can cause surprise when text is
+adjusted, because <code class="code">\<kbd class="key">SP</kbd></code> inserts a <em class="emph">fixed-width</em>,
+non-breaking space. GNU <code class="code">troff</code>&rsquo;s <code class="code">\~</code> escape sequence
+inserts an adjustable, non-breaking space.<a class="footnote" id="DOCF44" href="groff.html_fot.html#FOOT44"><sup>44</sup></a>
+</p>
+<a class="index-entry-id" id="index-_0022_002c-embedding-in-a-macro-argument"></a>
+<a class="index-entry-id" id="index-double-quote_002c-embedding-in-a-macro-argument"></a>
+<a class="index-entry-id" id="index-_005c_002c-embedding-in-a-macro-argument"></a>
+<a class="index-entry-id" id="index-backslash_002c-embedding-in-a-macro-argument"></a>
+<p>The foregoing raises the question of how to embed neutral double quotes
+or backslashes in macro arguments when <em class="emph">those</em> characters are
+desired as literals. In GNU <code class="code">troff</code>, the special character escape
+sequence <code class="code">\[rs]</code> produces a backslash and <code class="code">\[dq]</code> a neutral
+double quote.
+</p>
+<p>In GNU <code class="code">troff</code>&rsquo;s <abbr class="acronym">AT&amp;T</abbr> compatibility mode, these
+characters remain available as <code class="code">\(rs</code> and <code class="code">\(dq</code>,
+respectively. <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> did not consistently define
+these special characters,
+but its descendants can be made to support them. See <a class="xref" href="Device-and-Font-Description-Files.html">Device and Font Description Files</a>.
+</p>
+<p>If even that is not feasible, options remain. To obtain a literal
+escape character in a macro argument, you can simply type it if you
+change or disable the escape character first. See <a class="xref" href="Using-Escape-Sequences.html">Using Escape Sequences</a>. Otherwise, you must escape the escape character repeatedly
+to a context-dependent extent. See <a class="xref" href="Copy-Mode.html">Copy Mode</a>.
+</p>
+<p>For the (neutral) double quote, you have recourse to an obscure
+syntactical feature of <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>. Because a double
+quote can begin a macro argument, the formatter keeps track of whether
+the current argument was started thus, and doesn&rsquo;t require a space after
+the double quote that ends it.<a class="footnote" id="DOCF45" href="groff.html_fot.html#FOOT45"><sup>45</sup></a> In
+the argument list to a macro, a double quote that <em class="emph">isn&rsquo;t</em> preceded
+by a space <em class="emph">doesn&rsquo;t</em> start a macro argument. If not preceded by a
+double quote that began an argument, this double quote becomes part of
+the argument. Furthermore, within a quoted argument, a pair of adjacent
+double quotes becomes a literal double quote.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de eq
+. tm arg1:\\$1 arg2:\\$2 arg3:\\$3
+. tm arg4:\\$4 arg5:\\$5 arg6:\\$6
+.. \&quot; 4 backslashes on the next line
+.eq a&quot; &quot;b c&quot; &quot;de&quot;f\\\\g&quot; h&quot;&quot;i &quot;j&quot;&quot;k&quot;
+ error&rarr; arg1:a&quot; arg2:b c arg3:de
+ error&rarr; arg4:f\g&quot; arg5:h&quot;&quot;i arg6:j&quot;k
+</pre></div></div>
+
+<p>Apart from the complexity of the rules, this traditional solution has
+the disadvantage that double quotes don&rsquo;t survive repeated argument
+expansion in <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> or GNU <code class="code">troff</code>&rsquo;s
+compatibility mode. This can frustrate efforts to pass such arguments
+intact through multiple macro calls.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.cp 1
+.de eq
+. tm arg1:\\$1 arg2:\\$2 arg3:\\$3
+. tm arg4:\\$4 arg5:\\$5 arg6:\\$6
+..
+.de xe
+. eq \\$1 \\$2 \\$3 \\$4 \\$5 \\$6
+.. \&quot; 8 backslashes on the next line
+.xe a&quot; &quot;b c&quot; &quot;de&quot;f\\\\\\\\g&quot; h&quot;&quot;i &quot;j&quot;&quot;k&quot;
+ error&rarr; arg1:a&quot; arg2:b arg3:c
+ error&rarr; arg4:de arg5:f\g&quot; arg6:h&quot;&quot;i
+</pre></div></div>
+
+<a class="index-entry-id" id="index-input-level"></a>
+<a class="index-entry-id" id="index-level_002c-input"></a>
+<a class="index-entry-id" id="index-interpolation-depth"></a>
+<a class="index-entry-id" id="index-depth_002c-interpolation"></a>
+<p>Outside of compatibility mode, GNU <code class="code">troff</code> doesn&rsquo;t exhibit this
+problem because it tracks the nesting depth of interpolations.
+See <a class="xref" href="Implementation-Differences.html">Implementation Differences</a>.
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Using-Escape-Sequences.html">Using Escape Sequences</a>, Previous: <a href="Invoking-Requests.html">Invoking Requests</a>, Up: <a href="Formatter-Instructions.html">Formatter Instructions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Changing-the-Type-Size.html b/doc/groff.html.node/Changing-the-Type-Size.html
new file mode 100644
index 0000000..da02d8b
--- /dev/null
+++ b/doc/groff.html.node/Changing-the-Type-Size.html
@@ -0,0 +1,159 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Changing the Type Size (The GNU Troff Manual)</title>
+
+<meta name="description" content="Changing the Type Size (The GNU Troff Manual)">
+<meta name="keywords" content="Changing the Type Size (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Manipulating-Type-Size-and-Vertical-Spacing.html" rel="up" title="Manipulating Type Size and Vertical Spacing">
+<link href="Changing-the-Vertical-Spacing.html" rel="next" title="Changing the Vertical Spacing">
+<link href="Manipulating-Type-Size-and-Vertical-Spacing.html" rel="prev" title="Manipulating Type Size and Vertical Spacing">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Changing-the-Type-Size">
+<div class="nav-panel">
+<p>
+Next: <a href="Changing-the-Vertical-Spacing.html" accesskey="n" rel="next">Changing the Vertical Spacing</a>, Previous: <a href="Manipulating-Type-Size-and-Vertical-Spacing.html" accesskey="p" rel="prev">Manipulating Type Size and Vertical Spacing</a>, Up: <a href="Manipulating-Type-Size-and-Vertical-Spacing.html" accesskey="u" rel="up">Manipulating Type Size and Vertical Spacing</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Changing-the-Type-Size-1">5.20.1 Changing the Type Size</h4>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eps"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ps</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">size</i></span>]</var><a class="copiable-link" href='#index-_002eps'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ps"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eps-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ps</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">size</i></span></var><a class="copiable-link" href='#index-_002eps-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002eps-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ps</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">size</i></span></var><a class="copiable-link" href='#index-_002eps-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cssize"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\s</code><span class="r"><i class="slanted">size</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cssize'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cs"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002es_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.s]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002es_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002es"></a>
+<a class="index-entry-id" id="index-changing-type-sizes-_0028ps_002c-_005cs_0029"></a>
+<a class="index-entry-id" id="index-type-sizes_002c-changing-_0028ps_002c-_005cs_0029"></a>
+<a class="index-entry-id" id="index-point-sizes_002c-changing-_0028ps_002c-_005cs_0029"></a>
+<p>Use the <code class="code">ps</code> request or the <code class="code">\s</code> escape sequence to change
+(increase, decrease) the type size (in scaled points). Specify
+<var class="var">size</var> as either an absolute type size, or as a relative change from
+the current size. <code class="code">ps</code> with no argument restores the previous
+size. The <code class="code">ps</code> request&rsquo;s default scaling unit is &lsquo;<samp class="samp">z</samp>&rsquo;. The
+requested size is rounded to the nearest valid size (with ties rounding
+down) within the limits supported by the device. If the requested size
+is non-positive, it is treated as 1<span class="dmn">u</span>.
+</p>
+<a class="index-entry-id" id="index-CSTR-_002354-errata-4"></a>
+<a class="index-entry-id" id="index-CSTR-_002354-erratum_002c-ps-request"></a>
+<a class="index-entry-id" id="index-CSTR-_002354-erratum_002c-_005cs-escape-sequence"></a>
+<p>Type size alteration is incorrectly documented in the <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code> manual, which claims &ldquo;if [the requested size] is invalid,
+the next larger valid size will result, with a maximum of
+36&rdquo;.<a class="footnote" id="DOCF84" href="groff.html_fot.html#FOOT84"><sup>84</sup></a>
+</p>
+<a class="index-entry-id" id="index-type-size-registers-_0028_002es_002c-_002eps_0029"></a>
+<a class="index-entry-id" id="index-point-size-registers-_0028_002es_002c-_002eps_0029"></a>
+<p>The read-only string-valued register <code class="code">.s</code> interpolates the type
+size in points as a decimal fraction; it is associated with the
+environment (see <a class="pxref" href="Environments.html">Environments</a>). To obtain the type size in scaled
+points, interpolate the <code class="code">.ps</code> register instead (see <a class="pxref" href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a>).
+</p>
+<p>The <code class="code">\s</code> escape sequence supports a variety of syntax forms.
+</p>
+<dl class="table">
+<dt><code class="code">\s<var class="var">n</var></code></dt>
+<dd><p>Set the type size to <var class="var">n</var>&nbsp;points. <var class="var">n</var>&nbsp;must be a single
+digit. If <var class="var">n</var>&nbsp;is 0, restore the previous size.
+</p>
+</dd>
+<dt><code class="code">\s+<var class="var">n</var></code></dt>
+<dt><code class="code">\s-<var class="var">n</var></code></dt>
+<dd><p>Increase or decrease the type size by <var class="var">n</var>&nbsp;points.
+<var class="var">n</var>&nbsp;must be exactly one digit.
+</p>
+</dd>
+<dt><code class="code">\s(<var class="var">nn</var></code></dt>
+<dd><p>Set the type size to <var class="var">nn</var>&nbsp;points. <var class="var">nn</var> must be exactly two
+digits.
+</p>
+</dd>
+<dt><code class="code">\s+(<var class="var">nn</var></code></dt>
+<dt><code class="code">\s-(<var class="var">nn</var></code></dt>
+<dt><code class="code">\s(+<var class="var">nn</var></code></dt>
+<dt><code class="code">\s(-<var class="var">nn</var></code></dt>
+<dd><p>Alter the type size in points by the two-digit value <var class="var">nn</var>.
+</p></dd>
+</dl>
+
+<p>See <a class="xref" href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a>, for further syntactical forms of the
+<code class="code">\s</code> escape sequence that additionally accept decimal fractions.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">snap, snap,
+.ps +2
+grin, grin,
+.ps +2
+wink, wink, \s+2nudge, nudge,\s+8 say no more!
+.ps 10
+</pre></div></div>
+</dd></dl>
+
+<p>The <code class="code">\s</code> escape sequence affects the environment immediately and
+doesn&rsquo;t produce an input token. Consequently, it can be used in
+requests like <code class="code">mc</code>, which expects a single character as an
+argument, to change the type size on the fly.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.mc \s[20]x\s[0]
+</pre></div></div>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002esizes"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.sizes</code></strong> <var class="def-var-arguments">s1 s2 &hellip; sn [<code class="t">0</code>]</var><a class="copiable-link" href='#index-_002esizes'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-sizes-1"></a>
+<p>The <samp class="file">DESC</samp> file specifies which type sizes are allowed by the
+output device; see <a class="ref" href="DESC-File-Format.html"><samp class="file">DESC</samp> File Format</a>. Use the <code class="code">sizes</code> request
+to change this set of permissible sizes. Arguments are in scaled
+points; see <a class="ref" href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a>. Each can be a single
+type size (such as &lsquo;<samp class="samp">12000</samp>&rsquo;), or a range of sizes (such as
+&lsquo;<samp class="samp">4000-72000</samp>&rsquo;). You can optionally end the list with a &lsquo;<samp class="samp">0</samp>&rsquo;.
+</p></dd></dl>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Changing-the-Vertical-Spacing.html">Changing the Vertical Spacing</a>, Previous: <a href="Manipulating-Type-Size-and-Vertical-Spacing.html">Manipulating Type Size and Vertical Spacing</a>, Up: <a href="Manipulating-Type-Size-and-Vertical-Spacing.html">Manipulating Type Size and Vertical Spacing</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Changing-the-Vertical-Spacing.html b/doc/groff.html.node/Changing-the-Vertical-Spacing.html
new file mode 100644
index 0000000..cca1634
--- /dev/null
+++ b/doc/groff.html.node/Changing-the-Vertical-Spacing.html
@@ -0,0 +1,146 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Changing the Vertical Spacing (The GNU Troff Manual)</title>
+
+<meta name="description" content="Changing the Vertical Spacing (The GNU Troff Manual)">
+<meta name="keywords" content="Changing the Vertical Spacing (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Manipulating-Type-Size-and-Vertical-Spacing.html" rel="up" title="Manipulating Type Size and Vertical Spacing">
+<link href="Using-Fractional-Type-Sizes.html" rel="next" title="Using Fractional Type Sizes">
+<link href="Changing-the-Type-Size.html" rel="prev" title="Changing the Type Size">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+ul.mark-bullet {list-style-type: disc}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Changing-the-Vertical-Spacing">
+<div class="nav-panel">
+<p>
+Next: <a href="Using-Fractional-Type-Sizes.html" accesskey="n" rel="next">Using Fractional Type Sizes</a>, Previous: <a href="Changing-the-Type-Size.html" accesskey="p" rel="prev">Changing the Type Size</a>, Up: <a href="Manipulating-Type-Size-and-Vertical-Spacing.html" accesskey="u" rel="up">Manipulating Type Size and Vertical Spacing</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Changing-the-Vertical-Spacing-1">5.20.2 Changing the Vertical Spacing</h4>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002evs"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.vs</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">space</i></span>]</var><a class="copiable-link" href='#index-_002evs'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-vs"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002evs-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.vs</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">space</i></span></var><a class="copiable-link" href='#index-_002evs-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002evs-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.vs</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">space</i></span></var><a class="copiable-link" href='#index-_002evs-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ev_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.v]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ev_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ev"></a>
+<a class="index-entry-id" id="index-changing-vertical-line-spacing-_0028vs_0029"></a>
+<a class="index-entry-id" id="index-vertical-line-spacing_002c-changing-_0028vs_0029"></a>
+<a class="index-entry-id" id="index-vertical-line-spacing-register-_0028_002ev_0029"></a>
+<p>Set the vertical spacing to, or alter it by, <var class="var">space</var>. The default
+scaling unit is &lsquo;<samp class="samp">p</samp>&rsquo;. If <code class="code">vs</code> is called without an argument,
+the vertical spacing is reset to the previous value before the last call
+to <code class="code">vs</code>.
+<a class="index-entry-id" id="index-_002eV-register_002c-and-vs"></a>
+GNU <code class="code">troff</code> emits a warning in category &lsquo;<samp class="samp">range</samp>&rsquo; if <var class="var">space</var>
+is negative; the vertical spacing is then set to the smallest possible
+positive value, the vertical motion quantum (as found in the <code class="code">.V</code>
+register).
+</p>
+<p>&lsquo;<samp class="samp">.vs&nbsp;0</samp>&rsquo;<!-- /@w --> isn&rsquo;t saved in a diversion since it doesn&rsquo;t result in
+a vertical motion. You must explicitly issue this request before
+interpolating the diversion.
+</p>
+<p>The read-only register <code class="code">.v</code> contains the vertical spacing; it is
+associated with the environment (see <a class="pxref" href="Environments.html">Environments</a>).
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-vertical-line-spacing_002c-effective-value"></a>
+<p>When a break occurs, GNU <code class="code">troff</code> performs the following procedure.
+</p>
+<ul class="itemize mark-bullet">
+<li><a class="index-entry-id" id="index-extra-pre_002dvertical-line-space-_0028_005cx_0029"></a>
+<a class="index-entry-id" id="index-line-space_002c-extra-pre_002dvertical-_0028_005cx_0029"></a>
+Move the drawing position vertically by the <em class="dfn">extra pre-vertical line
+space</em>, the minimum of all negative <code class="code">\x</code> escape sequence arguments
+in the pending output line.
+
+</li><li>Move the drawing position vertically by the vertical line spacing.
+
+</li><li>Write out the pending output line.
+
+</li><li><a class="index-entry-id" id="index-extra-post_002dvertical-line-space-_0028_005cx_0029"></a>
+<a class="index-entry-id" id="index-line-space_002c-extra-post_002dvertical-_0028_005cx_0029"></a>
+Move the drawing position vertically by the <em class="dfn">extra post-vertical line
+space</em>, the maximum of all positive <code class="code">\x</code> escape sequence arguments
+in the line that has just been output.
+
+</li><li><a class="index-entry-id" id="index-post_002dvertical-line-spacing"></a>
+<a class="index-entry-id" id="index-line-spacing_002c-post_002dvertical-_0028pvs_0029"></a>
+Move the drawing position vertically by the <em class="dfn">post-vertical line
+spacing</em> (see below).
+</li></ul>
+
+<a class="index-entry-id" id="index-double_002dspacing-_0028vs_002c-pvs_0029"></a>
+<p>Prefer <code class="code">vs</code> or <code class="code">pvs</code> over <code class="code">ls</code> to produce double-spaced
+documents. <code class="code">vs</code> and <code class="code">pvs</code> have finer granularity than
+<code class="code">ls</code>; moreover, some preprocessors assume single spacing.
+See <a class="xref" href="Manipulating-Spacing.html">Manipulating Spacing</a>, regarding the <code class="code">\x</code> escape sequence and
+the <code class="code">ls</code> request.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epvs"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pvs</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">space</i></span>]</var><a class="copiable-link" href='#index-_002epvs'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-pvs"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002epvs-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pvs</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">space</i></span></var><a class="copiable-link" href='#index-_002epvs-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002epvs-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pvs</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">space</i></span></var><a class="copiable-link" href='#index-_002epvs-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002epvs_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.pvs]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002epvs_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002epvs-3"></a>
+<a class="index-entry-id" id="index-ls-request_002c-alternative-to-_0028pvs_0029"></a>
+<a class="index-entry-id" id="index-post_002dvertical-line-spacing_002c-changing-_0028pvs_0029"></a>
+<a class="index-entry-id" id="index-post_002dvertical-line-spacing-register-_0028_002epvs_0029"></a>
+<p>Set the post-vertical spacing to, or alter it by, <var class="var">space</var>. The
+default scaling unit is &lsquo;<samp class="samp">p</samp>&rsquo;. If <code class="code">pvs</code> is called without an
+argument, the post-vertical spacing is reset to the previous value
+before the last call to <code class="code">pvs</code>. GNU <code class="code">troff</code> emits a warning in
+category &lsquo;<samp class="samp">range</samp>&rsquo; if <var class="var">space</var> is negative; the post-vertical
+spacing is then set to zero.
+</p>
+<p>The read-only register <code class="code">.pvs</code> contains the post-vertical spacing;
+it is associated with the environment (see <a class="pxref" href="Environments.html">Environments</a>).
+</p></dd></dl>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a>, Previous: <a href="Changing-the-Type-Size.html">Changing the Type Size</a>, Up: <a href="Manipulating-Type-Size-and-Vertical-Spacing.html">Manipulating Type Size and Vertical Spacing</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Character-Classes.html b/doc/groff.html.node/Character-Classes.html
new file mode 100644
index 0000000..6e315dd
--- /dev/null
+++ b/doc/groff.html.node/Character-Classes.html
@@ -0,0 +1,140 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Character Classes (The GNU Troff Manual)</title>
+
+<meta name="description" content="Character Classes (The GNU Troff Manual)">
+<meta name="keywords" content="Character Classes (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Using-Fonts.html" rel="up" title="Using Fonts">
+<link href="Special-Fonts.html" rel="next" title="Special Fonts">
+<link href="Using-Symbols.html" rel="prev" title="Using Symbols">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Character-Classes">
+<div class="nav-panel">
+<p>
+Next: <a href="Special-Fonts.html" accesskey="n" rel="next">Special Fonts</a>, Previous: <a href="Using-Symbols.html" accesskey="p" rel="prev">Using Symbols</a>, Up: <a href="Using-Fonts.html" accesskey="u" rel="up">Using Fonts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Character-Classes-1">5.19.5 Character Classes</h4>
+<a class="index-entry-id" id="index-character-classes"></a>
+<a class="index-entry-id" id="index-classes_002c-character"></a>
+
+<p>Classes are particularly useful for East Asian languages such as
+Chinese, Japanese, and Korean, where the number of needed characters is
+much larger than in European languages, and where large sets of
+characters share the same properties.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eclass"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.class</code></strong> <var class="def-var-arguments">name c1 c2 &hellip;</var><a class="copiable-link" href='#index-_002eclass'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-class"></a>
+<a class="index-entry-id" id="index-character-class-_0028class_0029"></a>
+<a class="index-entry-id" id="index-defining-character-class-_0028class_0029"></a>
+<a class="index-entry-id" id="index-class-of-characters-_0028class_0029"></a>
+<p>Define a character class (or simply &ldquo;class&rdquo;) <var class="var">name</var> comprising
+the characters <var class="var">c1</var>, <var class="var">c2</var>, and so on.
+</p>
+<p>A class thus defined can then be referred to in lieu of listing all the
+characters within it. Currently, only the <code class="code">cflags</code> request can
+handle references to character classes.
+</p>
+<p>In the request&rsquo;s simplest form, each <var class="var">cn</var> is a character (or special
+character).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.class [quotes] ' \[aq] \[dq] \[oq] \[cq] \[lq] \[rq]
+</pre></div></div>
+
+<p>Since class and glyph names share the same name space, it is recommended
+to start and end the class name with <code class="code">[</code> and <code class="code">]</code>,
+respectively, to avoid collisions with existing character names defined
+by GNU <code class="code">troff</code> or the user (with <code class="code">char</code> and related requests).
+This practice applies the presence of <code class="code">]</code> in the class name to
+prevent the use of the special character escape form
+<code class="code">\[<span class="r">&hellip;</span>]</code>, thus you must use the <code class="code">\C</code> escape to access
+a class with such a name.
+</p>
+<a class="index-entry-id" id="index-GGL-_0028groff-glyph-list_0029-1"></a>
+<a class="index-entry-id" id="index-groff-glyph-list-_0028GGL_0029-1"></a>
+<p>You can also use a character range notation consisting of a
+start character followed by &lsquo;<samp class="samp">-</samp>&rsquo; and then an end character.
+Internally, GNU <code class="code">troff</code> converts these two symbol names to
+Unicode code points (according to the <code class="code">groff</code> glyph list [GGL]),
+which then give the start and end value of the range. If that fails,
+the class definition is skipped.
+</p>
+<p>Furthermore, classes can be nested.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.class [prepunct] , : ; &gt; }
+.class [prepunctx] \C'[prepunct]' \[u2013]-\[u2016]
+</pre></div></div>
+
+<p>The class &lsquo;<samp class="samp">[prepunctx]</samp>&rsquo; thus contains the contents of the class
+<code class="code">[prepunct]</code> as defined above (the set &lsquo;<samp class="samp">, : ; &gt; }</samp>&rsquo;), and
+characters in the range between <code class="code">U+2013</code> and <code class="code">U+2016</code>.
+</p>
+<p>If you want to include &lsquo;<samp class="samp">-</samp>&rsquo; in a class, it must be the first
+character value in the argument list, otherwise it gets misinterpreted
+as part of the range syntax.
+</p>
+<p>It is not possible to use class names as end points of range
+definitions.
+</p>
+<p>A typical use of the <code class="code">class</code> request is to control line-breaking
+and hyphenation rules as defined by the <code class="code">cflags</code> request. For
+example, to inhibit line breaks before the characters belonging to the
+<code class="code">prepunctx</code> class defined in the previous example, you can write
+the following.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.cflags 2 \C'[prepunctx]'
+</pre></div></div>
+
+<p>See the <code class="code">cflags</code> request in <a class="ref" href="Using-Symbols.html">Using Symbols</a>, for more details.
+</p></dd></dl>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Special-Fonts.html">Special Fonts</a>, Previous: <a href="Using-Symbols.html">Using Symbols</a>, Up: <a href="Using-Fonts.html">Using Fonts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Character-Translations.html b/doc/groff.html.node/Character-Translations.html
new file mode 100644
index 0000000..a867be8
--- /dev/null
+++ b/doc/groff.html.node/Character-Translations.html
@@ -0,0 +1,200 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Character Translations (The GNU Troff Manual)</title>
+
+<meta name="description" content="Character Translations (The GNU Troff Manual)">
+<meta name="keywords" content="Character Translations (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="troff-and-nroff-Modes.html" rel="next" title="troff and nroff Modes">
+<link href="Tabs-and-Fields.html" rel="prev" title="Tabs and Fields">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+kbd.key {font-style: normal}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+ul.mark-bullet {list-style-type: disc}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Character-Translations">
+<div class="nav-panel">
+<p>
+Next: <a href="troff-and-nroff-Modes.html" accesskey="n" rel="next"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a>, Previous: <a href="Tabs-and-Fields.html" accesskey="p" rel="prev">Tabs and Fields</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Character-Translations-1">5.13 Character Translations</h3>
+<a class="index-entry-id" id="index-character-translations"></a>
+<a class="index-entry-id" id="index-translations-of-characters"></a>
+
+<p>A <em class="dfn">translation</em> is a mapping of an input character to an output
+glyph. The mapping occurs at output time, i.e., the input character
+gets assigned the metric information of the mapped output character
+right before input tokens are converted to nodes (see <a class="pxref" href="Gtroff-Internals.html"><code class="code">gtroff</code> Internals</a>, for more on this process).
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002etr"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.tr</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">a</i></span><span class="r"><i class="slanted">b</i></span><span class="r"><i class="slanted">c</i></span><span class="r"><i class="slanted">d</i></span>&hellip;</var><a class="copiable-link" href='#index-_002etr'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-tr"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002etrin"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.trin</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">a</i></span><span class="r"><i class="slanted">b</i></span><span class="r"><i class="slanted">c</i></span><span class="r"><i class="slanted">d</i></span>&hellip;</var><a class="copiable-link" href='#index-_002etrin'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-trin"></a>
+<p>Translate character <var class="var">a</var> to glyph&nbsp;<var class="var">b</var>, character <var class="var">c</var> to
+glyph&nbsp;<var class="var">d</var>, and so on. If there is an odd number of characters
+in the argument, the last one is translated to a fixed-width space (the
+same one obtained by the <code class="code">\<kbd class="key">SP</kbd></code> escape sequence).
+</p>
+<p>The <code class="code">trin</code> request is identical to <code class="code">tr</code>, but when you unformat
+a diversion with <code class="code">asciify</code> it ignores the translation.
+See <a class="xref" href="Diversions.html">Diversions</a>, for details about the <code class="code">asciify</code> request.
+</p>
+<p>Some notes:
+</p>
+<ul class="itemize mark-bullet">
+<li><a class="index-entry-id" id="index-_005c_0028_002c-and-translations"></a>
+<a class="index-entry-id" id="index-_005c_005b_002c-and-translations"></a>
+<a class="index-entry-id" id="index-_005c_0027_002c-and-translations"></a>
+<a class="index-entry-id" id="index-_005c_0060_002c-and-translations"></a>
+<a class="index-entry-id" id="index-_005c_002d_002c-and-translations"></a>
+<a class="index-entry-id" id="index-_005c_005f_002c-and-translations"></a>
+<a class="index-entry-id" id="index-_005cC_002c-and-translations"></a>
+<a class="index-entry-id" id="index-_005cN_002c-and-translations"></a>
+<a class="index-entry-id" id="index-char-request_002c-and-translations"></a>
+<a class="index-entry-id" id="index-special-characters-1"></a>
+<a class="index-entry-id" id="index-character_002c-special"></a>
+<a class="index-entry-id" id="index-numbered-glyph-_0028_005cN_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-numbered-_0028_005cN_0029"></a>
+Special characters (<code class="code">\(<var class="var">xx</var></code>, <code class="code">\[<var class="var">xxx</var>]</code>,
+<code class="code">\C'<var class="var">xxx</var>'</code>, <code class="code">\'</code>, <code class="code">\`</code>, <code class="code">\-</code>, <code class="code">\_</code>),
+glyphs defined with the <code class="code">char</code> request, and numbered glyphs
+(<code class="code">\N'<var class="var">xxx</var>'</code>) can be translated also.
+
+</li><li><a class="index-entry-id" id="index-_005ce_002c-and-translations"></a>
+The <code class="code">\e</code> escape can be translated also.
+
+</li><li><a class="index-entry-id" id="index-_005c_0025_002c-and-translations"></a>
+<a class="index-entry-id" id="index-_005c_007e_002c-and-translations"></a>
+Characters can be mapped onto the <code class="code">\%</code> and <code class="code">\~</code> escape
+sequences (but <code class="code">\%</code> and <code class="code">\~</code> can&rsquo;t be mapped onto another
+glyph).
+
+</li><li><a class="index-entry-id" id="index-backspace-character_002c-and-translations"></a>
+<a class="index-entry-id" id="index-character_002c-backspace_002c-and-translations"></a>
+<a class="index-entry-id" id="index-leader-character_002c-and-translations"></a>
+<a class="index-entry-id" id="index-character_002c-leader_002c-and-translations"></a>
+<a class="index-entry-id" id="index-newline-character_002c-and-translations"></a>
+<a class="index-entry-id" id="index-character_002c-newline_002c-and-translations"></a>
+<a class="index-entry-id" id="index-tab-character_002c-and-translations"></a>
+<a class="index-entry-id" id="index-character_002c-tab_002c-and-translations"></a>
+<a class="index-entry-id" id="index-_005ca_002c-and-translations"></a>
+<a class="index-entry-id" id="index-_005ct_002c-and-translations"></a>
+The following characters can&rsquo;t be translated: space (with one exception,
+see below), backspace, newline, leader (and <code class="code">\a</code>), tab (and
+<code class="code">\t</code>).
+
+</li><li><a class="index-entry-id" id="index-shc-request_002c-and-translations"></a>
+Translations are not considered for finding the soft hyphen character
+set with the <code class="code">shc</code> request.
+
+</li><li><a class="index-entry-id" id="index-_005c_0026_002c-and-translations"></a>
+The pair &lsquo;<samp class="samp"><var class="var">c</var>\&amp;</samp>&rsquo; (an arbitrary character&nbsp;<var class="var">c</var> followed
+by the dummy character) maps this character to &ldquo;nothing&rdquo;.
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">.tr a\&amp;
+foo bar
+ &rArr; foo br
+</pre></div></div>
+
+<p>Even the space character can be mapped to the dummy character.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.tr aa \&amp;
+foo bar
+ &rArr; foobar
+</pre></div></div>
+
+<p>As shown in the example, the space character can&rsquo;t be the first
+character/glyph pair as an argument of <code class="code">tr</code>. Additionally, it is
+not possible to map the space character to any other glyph; requests
+like &lsquo;<samp class="samp">.tr&nbsp;aa&nbsp;x</samp>&rsquo;<!-- /@w --> undo &lsquo;<samp class="samp">.tr&nbsp;aa&nbsp;\&amp;</samp>&rsquo;<!-- /@w --> instead.
+</p>
+<p>If justification is active, lines are justified in spite of the &lsquo;empty&rsquo;
+space character (but there is no minimal distance, i.e., the space
+character, between words).
+</p>
+</li><li>After an output glyph has been constructed (this happens at the moment
+immediately before the glyph is appended to an output glyph list, either
+by direct output, in a macro, diversion, or string), it is no longer
+affected by <code class="code">tr</code>.
+
+</li><li>Translating character to glyphs where one of them or both are undefined
+is possible also; <code class="code">tr</code> does not check whether the elements of its
+argument exist.
+
+<p>See <a class="xref" href="Gtroff-Internals.html"><code class="code">gtroff</code> Internals</a>.
+</p>
+</li><li>Without an argument, the <code class="code">tr</code> request is ignored.
+</li></ul>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002etrnt"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.trnt</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">a</i></span><span class="r"><i class="slanted">b</i></span><span class="r"><i class="slanted">c</i></span><span class="r"><i class="slanted">d</i></span>&hellip;</var><a class="copiable-link" href='#index-_002etrnt'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-trnt"></a>
+<a class="index-entry-id" id="index-_005c_0021_002c-and-trnt"></a>
+<p><code class="code">trnt</code> is the same as the <code class="code">tr</code> request except that the
+translations do not apply to text that is transparently throughput into
+a diversion with <code class="code">\!</code>. See <a class="xref" href="Diversions.html">Diversions</a>.
+</p>
+<p>For example,
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.tr ab
+.di x
+\!.tm a
+.di
+.x
+</pre></div></div>
+
+<p>prints &lsquo;<samp class="samp">b</samp>&rsquo; to the standard error stream; if <code class="code">trnt</code> is used
+instead of <code class="code">tr</code> it prints &lsquo;<samp class="samp">a</samp>&rsquo;.
+</p></dd></dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="troff-and-nroff-Modes.html"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a>, Previous: <a href="Tabs-and-Fields.html">Tabs and Fields</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Colors.html b/doc/groff.html.node/Colors.html
new file mode 100644
index 0000000..8c23dcb
--- /dev/null
+++ b/doc/groff.html.node/Colors.html
@@ -0,0 +1,208 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Colors (The GNU Troff Manual)</title>
+
+<meta name="description" content="Colors (The GNU Troff Manual)">
+<meta name="keywords" content="Colors (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Strings.html" rel="next" title="Strings">
+<link href="Manipulating-Type-Size-and-Vertical-Spacing.html" rel="prev" title="Manipulating Type Size and Vertical Spacing">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Colors">
+<div class="nav-panel">
+<p>
+Next: <a href="Strings.html" accesskey="n" rel="next">Strings</a>, Previous: <a href="Manipulating-Type-Size-and-Vertical-Spacing.html" accesskey="p" rel="prev">Manipulating Type Size and Vertical Spacing</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Colors-1">5.21 Colors</h3>
+<a class="index-entry-id" id="index-colors"></a>
+
+<a class="index-entry-id" id="index-stroke-color"></a>
+<a class="index-entry-id" id="index-color_002c-stroke"></a>
+<a class="index-entry-id" id="index-fill-color"></a>
+<a class="index-entry-id" id="index-color_002c-fill"></a>
+<p>GNU <code class="code">troff</code> supports color output with a variety of color spaces
+and up to 16 bits per channel. Some devices, particularly terminals,
+may be more limited. When color support is enabled, two colors are
+current at any given time: the <em class="dfn">stroke color</em>, with which glyphs,
+rules (lines), and geometric objects like circles and polygons are
+drawn, and the <em class="dfn">fill color</em>, which can be used to paint the interior
+of a closed geometric figure.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ecolor"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.color</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">n</i></span>]</var><a class="copiable-link" href='#index-_002ecolor'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-color"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ecolor_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.color]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ecolor_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ecolor-1"></a>
+<p>If <var class="var">n</var> is missing or non-zero, enable the output of color-related
+device-independent output commands (this is the default); otherwise,
+disable them. This request sets a global flag; it does not produce an
+input token (see <a class="pxref" href="Gtroff-Internals.html"><code class="code">gtroff</code> Internals</a>).
+</p>
+<p>The read-only register <code class="code">.color</code> is&nbsp;1 if colors are enabled,
+0&nbsp;otherwise.
+</p>
+<p>Color can also be disabled with the <samp class="option">-c</samp> command-line option.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002edefcolor"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.defcolor</code></strong> <var class="def-var-arguments">ident scheme color-component &hellip;</var><a class="copiable-link" href='#index-_002edefcolor'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-defcolor"></a>
+<p>Define a color named <var class="var">ident</var>. <var class="var">scheme</var> selects a color space
+and determines the quantity of required <var class="var">color-component</var>s; it must
+be one of &lsquo;<samp class="samp">rgb</samp>&rsquo; (three components), &lsquo;<samp class="samp">cmy</samp>&rsquo; (three), &lsquo;<samp class="samp">cmyk</samp>&rsquo;
+(four), or &lsquo;<samp class="samp">gray</samp>&rsquo; (one). &lsquo;<samp class="samp">grey</samp>&rsquo; is accepted as a synonym of
+&lsquo;<samp class="samp">gray</samp>&rsquo;. The color components can be encoded as a single
+hexadecimal value starting with &lsquo;<samp class="samp">#</samp>&rsquo; or &lsquo;<samp class="samp">##</samp>&rsquo;. The former
+indicates that each component is in the range 0&ndash;255 (0&ndash;FF), the latter
+the range 0&ndash;65,535 (0&ndash;FFFF).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.defcolor half gray #7f
+.defcolor pink rgb #FFC0CB
+.defcolor magenta rgb ##ffff0000ffff
+</pre></div></div>
+
+<a class="index-entry-id" id="index-f-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-f"></a>
+<a class="index-entry-id" id="index-scaling-unit-f"></a>
+<p>Alternatively, each color component can be specified as a decimal
+fraction in the range 0&ndash;1, interpreted using a default scaling
+unit of&nbsp;<code class="code">f</code>, which multiplies its value by 65,536 (but
+clamps it at 65,535).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.defcolor gray50 rgb 0.5 0.5 0.5
+.defcolor darkgreen rgb 0.1f 0.5f 0.2f
+</pre></div></div>
+</dd></dl>
+
+<a class="index-entry-id" id="index-default-color"></a>
+<a class="index-entry-id" id="index-color_002c-default"></a>
+<p>Each output device has a color named &lsquo;<samp class="samp">default</samp>&rsquo;, which cannot be
+redefined. A device&rsquo;s default stroke and fill colors are not
+necessarily the same. For the <code class="code">dvi</code>, <code class="code">html</code>, <code class="code">pdf</code>,
+<code class="code">ps</code>, and <code class="code">xhtml</code> output devices, GNU <code class="code">troff</code>
+automatically loads a macro file defining many color names at startup.
+By the same mechanism, the devices supported by <code class="code">grotty</code> recognize
+the eight standard ISO&nbsp;6429/EMCA-48 color names.<a class="footnote" id="DOCF86" href="groff.html_fot.html#FOOT86"><sup>86</sup></a>
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002egcolor"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.gcolor</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">color</i></span>]</var><a class="copiable-link" href='#index-_002egcolor'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-gcolor"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cmc"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\m</code><span class="r"><i class="slanted">c</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cmc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cm"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cm_0028co"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\m(</code><span class="r"><i class="slanted">co</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cm_0028co'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cm_005bcolor_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\m[</code><span class="r"><i class="slanted">color</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cm_005bcolor_005d'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002em_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.m]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002em_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002em"></a>
+<p>Set the stroke color to <var class="var">color</var>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.gcolor red
+The next words
+.gcolor
+\m[red]are in red\m[]
+and these words are in the previous color.
+</pre></div></div>
+
+<p>The escape sequence <code class="code">\m[]</code> restores the previous stroke color, as
+does a <code class="code">gcolor</code> request without an argument.
+</p>
+<a class="index-entry-id" id="index-stroke-color-name-register-_0028_002em_0029"></a>
+<a class="index-entry-id" id="index-name_002c-stroke-color_002c-register-_0028_002em_0029"></a>
+<a class="index-entry-id" id="index-color-name_002c-stroke_002c-register-_0028_002em_0029"></a>
+<p>The name of the current stroke color is available in the read-only
+string-valued register &lsquo;<samp class="samp">.m</samp>&rsquo;; it is associated with the environment
+(see <a class="pxref" href="Environments.html">Environments</a>). It interpolates nothing when the stroke color
+is the default.
+</p>
+<p><code class="code">\m</code> doesn&rsquo;t produce an input token in GNU <code class="code">troff</code>
+(see <a class="pxref" href="Gtroff-Internals.html"><code class="code">gtroff</code> Internals</a>). It therefore can be used in requests like
+<code class="code">mc</code> (which expects a single character as an argument) to change
+the color on the fly:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.mc \m[red]x\m[]
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002efcolor"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.fcolor</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">color</i></span>]</var><a class="copiable-link" href='#index-_002efcolor'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-fcolor"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cMc"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\M</code><span class="r"><i class="slanted">c</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cMc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cM"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cM_0028co"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\M(</code><span class="r"><i class="slanted">co</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cM_0028co'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cM_005bcolor_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\M[</code><span class="r"><i class="slanted">color</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cM_005bcolor_005d'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eM_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.M]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eM_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eM"></a>
+<p>Set the fill color for objects drawn with <code class="code">\D'&hellip;'</code> escape
+sequences. The escape sequence <code class="code">\M[]</code> restores the previous fill
+color, as does an <code class="code">fcolor</code> request without an argument.
+</p>
+<a class="index-entry-id" id="index-background-color-name-register-_0028_002eM_0029"></a>
+<a class="index-entry-id" id="index-name_002c-background-color_002c-register-_0028_002eM_0029"></a>
+<a class="index-entry-id" id="index-color-name_002c-background_002c-register-_0028_002eM_0029"></a>
+<a class="index-entry-id" id="index-fill-color-name-register-_0028_002eM_0029"></a>
+<a class="index-entry-id" id="index-name_002c-fill-color_002c-register-_0028_002eM_0029"></a>
+<a class="index-entry-id" id="index-color-name_002c-fill_002c-register-_0028_002eM_0029"></a>
+<p>The name of the current fill color is available in the read-only
+string-valued register &lsquo;<samp class="samp">.M</samp>&rsquo;; it is associated with the environment
+(see <a class="pxref" href="Environments.html">Environments</a>). It interpolates nothing when the fill color
+is the default. <code class="code">\M</code> doesn&rsquo;t produce an input token in GNU
+<code class="code">troff</code>.
+</p>
+<p>Create an ellipse with a red interior as follows.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">\M[red]\h'0.5i'\D'E 2i 1i'\M[]
+</pre></div></div>
+</dd></dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Strings.html">Strings</a>, Previous: <a href="Manipulating-Type-Size-and-Vertical-Spacing.html">Manipulating Type Size and Vertical Spacing</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Columnation.html b/doc/groff.html.node/Columnation.html
new file mode 100644
index 0000000..7ac057f
--- /dev/null
+++ b/doc/groff.html.node/Columnation.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Columnation (The GNU Troff Manual)</title>
+
+<meta name="description" content="Columnation (The GNU Troff Manual)">
+<meta name="keywords" content="Columnation (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Common-Features.html" rel="up" title="Common Features">
+<link href="Font-and-Size-Changes.html" rel="next" title="Font and Size Changes">
+<link href="Document-Formats.html" rel="prev" title="Document Formats">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Columnation">
+<div class="nav-panel">
+<p>
+Next: <a href="Font-and-Size-Changes.html" accesskey="n" rel="next">Font and Size Changes</a>, Previous: <a href="Document-Formats.html" accesskey="p" rel="prev">Document Formats</a>, Up: <a href="Common-Features.html" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Columnation-1">3.2.10 Columnation</h4>
+
+<p>Macro packages apart from <samp class="file">man</samp> and <samp class="file">mdoc</samp> for man page
+formatting offer a facility for setting multiple columns on the page.
+</p>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Command-Reference.html b/doc/groff.html.node/Command-Reference.html
new file mode 100644
index 0000000..bd5cd9e
--- /dev/null
+++ b/doc/groff.html.node/Command-Reference.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Command Reference (The GNU Troff Manual)</title>
+
+<meta name="description" content="Command Reference (The GNU Troff Manual)">
+<meta name="keywords" content="Command Reference (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="gtroff-Output.html" rel="up" title="gtroff Output">
+<link href="Intermediate-Output-Examples.html" rel="next" title="Intermediate Output Examples">
+<link href="Language-Concepts.html" rel="prev" title="Language Concepts">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Command-Reference">
+<div class="nav-panel">
+<p>
+Next: <a href="Intermediate-Output-Examples.html" accesskey="n" rel="next">Intermediate Output Examples</a>, Previous: <a href="Language-Concepts.html" accesskey="p" rel="prev">Language Concepts</a>, Up: <a href="gtroff-Output.html" accesskey="u" rel="up"><code class="code">gtroff</code> Output</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Command-Reference-1">6.1.2 Command Reference</h4>
+
+<p>This section describes all intermediate output commands, both from
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> as well as the <code class="code">gtroff</code> extensions.
+</p>
+
+<ul class="mini-toc">
+<li><a href="Comment-Command.html" accesskey="1">Comment Command</a></li>
+<li><a href="Simple-Commands.html" accesskey="2">Simple Commands</a></li>
+<li><a href="Graphics-Commands.html" accesskey="3">Graphics Commands</a></li>
+<li><a href="Device-Control-Commands.html" accesskey="4">Device Control Commands</a></li>
+<li><a href="Obsolete-Command.html" accesskey="5">Obsolete Command</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Comment-Command.html b/doc/groff.html.node/Comment-Command.html
new file mode 100644
index 0000000..1ef8d94
--- /dev/null
+++ b/doc/groff.html.node/Comment-Command.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Comment Command (The GNU Troff Manual)</title>
+
+<meta name="description" content="Comment Command (The GNU Troff Manual)">
+<meta name="keywords" content="Comment Command (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Command-Reference.html" rel="up" title="Command Reference">
+<link href="Simple-Commands.html" rel="next" title="Simple Commands">
+<link href="Command-Reference.html" rel="prev" title="Command Reference">
+<style type="text/css">
+<!--
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="Comment-Command">
+<div class="nav-panel">
+<p>
+Next: <a href="Simple-Commands.html" accesskey="n" rel="next">Simple Commands</a>, Previous: <a href="Command-Reference.html" accesskey="p" rel="prev">Command Reference</a>, Up: <a href="Command-Reference.html" accesskey="u" rel="up">Command Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Comment-Command-1">6.1.2.1 Comment Command</h4>
+
+<dl class="table">
+<dt><code class="code">#<var class="var">anything</var>&lsaquo;<span class="r">end of line</span>&rsaquo;</code></dt>
+<dd><p>A comment. Ignore any characters from the &lsquo;<samp class="samp">#</samp>&rsquo; character up to the
+next newline character.
+</p>
+<p>This command is the only possibility for commenting in the intermediate
+output. Each comment can be preceded by arbitrary syntactical space;
+every command can be terminated by a comment.
+</p></dd>
+</dl>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Comments.html b/doc/groff.html.node/Comments.html
new file mode 100644
index 0000000..46b3523
--- /dev/null
+++ b/doc/groff.html.node/Comments.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Comments (The GNU Troff Manual)</title>
+
+<meta name="description" content="Comments (The GNU Troff Manual)">
+<meta name="keywords" content="Comments (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Registers.html" rel="next" title="Registers">
+<link href="Formatter-Instructions.html" rel="prev" title="Formatter Instructions">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Comments">
+<div class="nav-panel">
+<p>
+Next: <a href="Registers.html" accesskey="n" rel="next">Registers</a>, Previous: <a href="Formatter-Instructions.html" accesskey="p" rel="prev">Formatter Instructions</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Comments-1">5.7 Comments</h3>
+<a class="index-entry-id" id="index-comments"></a>
+
+<p>One of the most common forms of escape sequence is the
+comment.<a class="footnote" id="DOCF48" href="groff.html_fot.html#FOOT48"><sup>48</sup></a>
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0022-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\&quot;</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0022-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0022"></a>
+<p>Start a comment. Everything up to the next newline is ignored.
+</p>
+<p>This may sound simple, but it can be tricky to keep the comments from
+interfering with the appearance of the output.
+<a class="index-entry-id" id="index-ds_002c-ds1-requests_002c-and-comments"></a>
+<a class="index-entry-id" id="index-as_002c-as1-requests_002c-and-comments"></a>
+If the escape sequence is to the right of some text or a request, that
+portion of the line is ignored, but spaces preceding it are processed
+normally by GNU <code class="code">troff</code>. This affects only the <code class="code">ds</code> and
+<code class="code">as</code> requests and their variants.
+</p>
+<a class="index-entry-id" id="index-tabs_002c-before-comments"></a>
+<a class="index-entry-id" id="index-comments_002c-lining-up-with-tabs"></a>
+<p>One possibly irritating idiosyncrasy is that tabs should not be used to
+vertically align comments in the source document. Tab characters are
+not treated as separators between a request name and its first argument,
+nor between arguments.
+</p>
+<a class="index-entry-id" id="index-undefined-request"></a>
+<a class="index-entry-id" id="index-request_002c-undefined"></a>
+<p>A comment on a line by itself is treated as a blank line, because after
+eliminating the comment, that is all that remains.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">Test
+\&quot; comment
+Test
+ &rArr; Test
+ &rArr;
+ &rArr; Test
+</pre></div></div>
+
+<p>To avoid this, it is common to combine the empty request with the
+comment escape sequence as &lsquo;<samp class="samp">.\&quot;</samp>&rsquo;, causing the input line to be
+ignored.
+</p>
+<a class="index-entry-id" id="index-_0027_002c-as-a-comment"></a>
+<p>Another commenting scheme sometimes seen is three consecutive single
+quotes (<code class="code">'''</code>) at the beginning of a line. This works, but GNU
+<code class="code">troff</code> emits a warning diagnostic (if enabled) about an undefined
+macro (namely &lsquo;<samp class="samp">''</samp>&rsquo;).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0023-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\#</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0023-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0023"></a>
+<p>Start a comment; everything up to and including the next newline is
+ignored. This <code class="code">groff</code> extension was introduced to avoid the
+problems described above.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">Test
+\# comment
+Test
+ &rArr; Test Test
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eig"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ig</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">end</i></span>]</var><a class="copiable-link" href='#index-_002eig'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ig"></a>
+<p>Ignore input until, in the current conditional block (if
+any),<a class="footnote" id="DOCF49" href="groff.html_fot.html#FOOT49"><sup>49</sup></a> the macro <var class="var">end</var> is called
+at the start of a control line, or the control line &lsquo;<samp class="samp">..</samp>&rsquo; is
+encountered if <var class="var">end</var> is not specified. <code class="code">ig</code> is parsed as if it
+were a macro definition, but its contents are discarded, not
+stored.<a class="footnote" id="DOCF50" href="groff.html_fot.html#FOOT50"><sup>50</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">hand\c
+.de TX
+fasting
+..
+.ig TX
+This is part of a large block of input that has been
+temporarily(?) commented out.
+We can restore it simply by removing the .ig request and
+the call of its end macro.
+.TX
+</pre></div></div>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; handfasting
+</pre></div></div>
+</dd></dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Registers.html">Registers</a>, Previous: <a href="Formatter-Instructions.html">Formatter Instructions</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Common-Features.html b/doc/groff.html.node/Common-Features.html
new file mode 100644
index 0000000..074015e
--- /dev/null
+++ b/doc/groff.html.node/Common-Features.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Common Features (The GNU Troff Manual)</title>
+
+<meta name="description" content="Common Features (The GNU Troff Manual)">
+<meta name="keywords" content="Common Features (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Tutorial-for-Macro-Users.html" rel="up" title="Tutorial for Macro Users">
+<link href="Basics.html" rel="prev" title="Basics">
+<style type="text/css">
+<!--
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Common-Features">
+<div class="nav-panel">
+<p>
+Previous: <a href="Basics.html" accesskey="p" rel="prev">Basics</a>, Up: <a href="Tutorial-for-Macro-Users.html" accesskey="u" rel="up">Tutorial for Macro Users</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Common-Features-1">3.2 Common Features</h3>
+<a class="index-entry-id" id="index-common-features"></a>
+<a class="index-entry-id" id="index-features_002c-common"></a>
+
+<p>GNU <code class="code">troff</code> provides low-level operations for formatting a
+document. Many routine operations are undertaken in nearly all
+documents that require a series of such primitive operations to be
+performed. These common tasks are grouped into <i class="slanted">macros</i>, which
+are then collected into a <i class="slanted">macro package</i>.
+</p>
+<p>Macro packages come in two varieties: &ldquo;major&rdquo; or &ldquo;full-service&rdquo;
+ones that manage page layout, and &ldquo;minor&rdquo; or &ldquo;auxiliary&rdquo; ones that
+do not, instead fulfilling narrow, specific tasks. Find a list in the
+<cite class="cite">groff_tmac<span class="r">(5)</span></cite> man page. Type &lsquo;<samp class="samp">man groff_tmac</samp>&rsquo; at the
+command line to view it.
+</p>
+<p>We survey several capabilities of full-service macro package below.
+Each package employs its own macros to exercise them. For details,
+consult its man page or, for <samp class="file">ms</samp>, see <a class="ref" href="ms.html"><samp class="file">ms</samp></a>.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="Paragraphs.html" accesskey="1">Paragraphs</a></li>
+<li><a href="Sections-and-Chapters.html" accesskey="2">Sections and Chapters</a></li>
+<li><a href="Headers-and-Footers.html" accesskey="3">Headers and Footers</a></li>
+<li><a href="Page-Layout-Adjustment.html" accesskey="4">Page Layout</a></li>
+<li><a href="Displays-and-Keeps.html" accesskey="5">Displays and Keeps</a></li>
+<li><a href="Footnotes-and-Endnotes.html" accesskey="6">Footnotes and Endnotes</a></li>
+<li><a href="Table-of-Contents.html" accesskey="7">Table of Contents</a></li>
+<li><a href="Indexing.html" accesskey="8">Indexing</a></li>
+<li><a href="Document-Formats.html" accesskey="9">Document Formats</a></li>
+<li><a href="Columnation.html">Columnation</a></li>
+<li><a href="Font-and-Size-Changes.html">Font and Size Changes</a></li>
+<li><a href="Predefined-Text.html">Predefined Text</a></li>
+<li><a href="Preprocessor-Support.html">Preprocessor Support</a></li>
+<li><a href="Configuration-and-Customization.html">Configuration and Customization</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Compatibility-Mode.html b/doc/groff.html.node/Compatibility-Mode.html
new file mode 100644
index 0000000..60c376b
--- /dev/null
+++ b/doc/groff.html.node/Compatibility-Mode.html
@@ -0,0 +1,221 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Compatibility Mode (The GNU Troff Manual)</title>
+
+<meta name="description" content="Compatibility Mode (The GNU Troff Manual)">
+<meta name="keywords" content="Compatibility Mode (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Implementation-Differences.html" rel="up" title="Implementation Differences">
+<link href="Safer-Mode.html" rel="next" title="Safer Mode">
+<link href="Other-Differences.html" rel="prev" title="Other Differences">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Compatibility-Mode">
+<div class="nav-panel">
+<p>
+Next: <a href="Safer-Mode.html" accesskey="n" rel="next">Safer Mode</a>, Previous: <a href="Other-Differences.html" accesskey="p" rel="prev">Other Differences</a>, Up: <a href="Implementation-Differences.html" accesskey="u" rel="up">Implementation Differences</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Compatibility-Mode-1">5.38.2 Compatibility Mode</h4>
+<a class="index-entry-id" id="index-compatibility-mode-1"></a>
+<a class="index-entry-id" id="index-mode_002c-compatibility"></a>
+
+<a class="index-entry-id" id="index-long-names"></a>
+<a class="index-entry-id" id="index-names_002c-long"></a>
+<a class="index-entry-id" id="index-_005c_002a_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005cn_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>Long identifier names may be GNU <code class="code">troff</code>&rsquo;s most obvious innovation.
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> interprets &lsquo;<samp class="samp">.dsabcd</samp>&rsquo; as defining a
+string &lsquo;<samp class="samp">ab</samp>&rsquo; with contents &lsquo;<samp class="samp">cd</samp>&rsquo;. Normally, GNU <code class="code">troff</code>
+interprets this as a call of a macro named <code class="code">dsabcd</code>.
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> also interprets &lsquo;<samp class="samp">\*[</samp>&rsquo; and &lsquo;<samp class="samp">\n[</samp>&rsquo; as
+an interpolation of a string or register, respectively, named &lsquo;<samp class="samp">[</samp>&rsquo;.
+In GNU <code class="code">troff</code>, however, the &lsquo;<samp class="samp">[</samp>&rsquo; is normally interpreted as
+delimiting a long name. In compatibility mode, GNU <code class="code">troff</code>
+interprets names in the traditional way; they thus can be two characters
+long at most.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ecp"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.cp</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">n</i></span>]</var><a class="copiable-link" href='#index-_002ecp'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-cp"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eC_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.C]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eC_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eC"></a>
+<p>If <var class="var">n</var> is missing or non-zero, turn on compatibility mode;
+otherwise, turn it off.
+</p>
+<p>The read-only register <code class="code">.C</code> is&nbsp;1 if compatibility mode is on,
+0&nbsp;otherwise.
+</p>
+<p>Compatibility mode can be also turned on with the <samp class="option">-C</samp>
+command-line option.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002edo"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.do</code></strong> <var class="def-var-arguments">name</var><a class="copiable-link" href='#index-_002edo'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-do"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ecp_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.cp]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ecp_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ecp-1"></a>
+<p>The <code class="code">do</code> request interprets the string, request, diversion, or
+macro <var class="var">name</var> (along with any further arguments) with compatibility
+mode disabled. Compatibility mode is restored (only if it was active)
+when the <em class="emph">expansion</em> of <var class="var">name</var> is interpreted; that is, the
+restored compatibility state applies to the contents of the macro,
+string, or diversion <var class="var">name</var> as well as data read from files or pipes
+if <var class="var">name</var> is any of the <code class="code">so</code>, <code class="code">soquiet</code>, <code class="code">mso</code>,
+<code class="code">msoquiet</code>, or <code class="code">pso</code> requests.
+</p>
+<p>The following example illustrates several aspects of <code class="code">do</code> behavior.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de mac1
+FOO
+..
+.de1 mac2
+groff
+.mac1
+..
+.de mac3
+compatibility
+.mac1
+..
+.de ma
+\\$1
+..
+.cp 1
+.do mac1
+.do mac2 \&quot; mac2, defined with .de1, calls &quot;mac1&quot;
+.do mac3 \&quot; mac3 calls &quot;ma&quot; with argument &quot;c1&quot;
+.do mac3 \[ti] \&quot; groff syntax accepted in .do arguments
+ &rArr; FOO groff FOO compatibility c1 ~
+</pre></div></div>
+
+<p>The read-only register <code class="code">.cp</code>, meaningful only when dereferenced
+from a <code class="code">do</code> request, is&nbsp;1 if compatibility mode was on when
+the <code class="code">do</code> request was encountered, and 0&nbsp;if it was not. This
+register is specialized and may require a statement of rationale.
+</p>
+<p>When writing macro packages or documents that use GNU <code class="code">troff</code>
+features and which may be mixed with other packages or documents that do
+not&mdash;common scenarios include serial processing of man pages or use of
+the <code class="code">so</code> or <code class="code">mso</code> requests&mdash;you may desire correct operation
+regardless of compatibility mode enablement in the surrounding context.
+It may occur to you to save the existing value of &lsquo;<samp class="samp">\n(.C</samp>&rsquo; into a
+register, say, &lsquo;<samp class="samp">_C</samp>&rsquo;, at the beginning of your file, turn
+compatibility mode off with &lsquo;<samp class="samp">.cp 0</samp>&rsquo;, then restore it from that
+register at the end with &lsquo;<samp class="samp">.cp \n(_C</samp>&rsquo;. At the same time, a modular
+design of a document or macro package may lead you to multiple layers of
+inclusion. You cannot use the same register name everywhere lest you
+&ldquo;clobber&rdquo; the value from a preceding or enclosing context. The
+two-character register name space of <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> is
+confining and mnemonically challenging; you may wish to use the more
+capacious name space of GNU <code class="code">troff</code>. However, attempting &lsquo;<samp class="samp">.nr
+_my_saved_C \n(.C</samp>&rsquo; will not work in compatibility mode; the register
+name is too long. &ldquo;This is exactly what <code class="code">do</code> is for,&rdquo; you think,
+&lsquo;<samp class="samp">.do nr _my_saved_C \n(.C</samp>&rsquo;. The foregoing will always save zero to
+your register, because <code class="code">do</code> turns compatibility mode <em class="emph">off</em>
+while it interprets its argument list.
+</p>
+<p>To robustly save compatibility mode before switching it off, use
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.do nr _my_saved_C \n[.cp]
+.cp 0
+</pre></div></div>
+
+<p>at the beginning of your file, followed by
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.cp \n[_my_saved_C]
+.do rr _my_saved_C
+</pre></div></div>
+
+<p>at the end. As in the C language, we all have to share one big
+name space, so choose a register name that is unlikely to collide with
+other uses.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-input-level-in-delimited-arguments"></a>
+<a class="index-entry-id" id="index-interpolation-depth-in-delimited-arguments"></a>
+<a class="index-entry-id" id="index-delimited-arguments_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>Normally, GNU <code class="code">troff</code> preserves the interpolation depth in
+delimited arguments, but not in compatibility mode.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds xx '
+\w'abc\*(xxdef'
+ &rArr; 168 <span class="r">(normal mode on a terminal device)</span>
+ &rArr; 72def' <span class="r">(compatibility mode on a terminal device)</span>
+</pre></div></div>
+
+<a class="index-entry-id" id="index-_005cf_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005cH_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005cs_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005cS_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>Furthermore, the escape sequences <code class="code">\f</code>, <code class="code">\H</code>, <code class="code">\m</code>,
+<code class="code">\M</code>, <code class="code">\R</code>, <code class="code">\s</code>, and <code class="code">\S</code> are transparent for the
+purpose of recognizing a control character at the beginning of a line
+only in compatibility mode. For example, this code produces bold output
+in both cases, but the text differs.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de xx
+Hello!
+..
+\fB.xx\fP
+ &rArr; .xx <span class="r">(normal mode)</span>
+ &rArr; Hello! <span class="r">(compatibility mode)</span>
+</pre></div></div>
+
+<a class="index-entry-id" id="index-_005cs_002c-incompatibilities-with-AT_0026T-troff-1"></a>
+<p>Normally, the syntax form <code class="code">\s</code><var class="var">n</var> accepts only a single
+character (a digit) for <var class="var">n</var>, consistently with other forms that
+originated in <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>, like <code class="code">\*</code>, <code class="code">\$</code>,
+<code class="code">\f</code>, <code class="code">\g</code>, <code class="code">\k</code>, <code class="code">\n</code>, and <code class="code">\z</code>. In
+compatibility mode only, a non-zero&nbsp;<var class="var">n</var> must be in the range
+4&ndash;39. Legacy documents relying upon this quirk of parsing<a class="footnote" id="DOCF120" href="groff.html_fot.html#FOOT120"><sup>120</sup></a> should be migrated to another
+<code class="code">\s</code> form.
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Safer-Mode.html">Safer Mode</a>, Previous: <a href="Other-Differences.html">Other Differences</a>, Up: <a href="Implementation-Differences.html">Implementation Differences</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Concept-Index.html b/doc/groff.html.node/Concept-Index.html
new file mode 100644
index 0000000..3adcfcb
--- /dev/null
+++ b/doc/groff.html.node/Concept-Index.html
@@ -0,0 +1,2359 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Concept Index (The GNU Troff Manual)</title>
+
+<meta name="description" content="Concept Index (The GNU Troff Manual)">
+<meta name="keywords" content="Concept Index (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="index.html" rel="up" title="Top">
+<link href="Program-and-File-Index.html" rel="prev" title="Program and File Index">
+<style type="text/css">
+<!--
+a.summary-letter-printindex {text-decoration: none}
+kbd.key {font-style: normal}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span.w-nolinebreak-text {white-space: nowrap}
+td.printindex-index-entry {vertical-align: top}
+td.printindex-index-section {vertical-align: top}
+th.entries-header-printindex {text-align:left}
+th.sections-header-printindex {text-align:left}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="appendix-level-extent" id="Concept-Index">
+<div class="nav-panel">
+<p>
+Previous: <a href="Program-and-File-Index.html" accesskey="p" rel="prev">Program and File Index</a>, Up: <a href="index.html" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h2 class="appendix" id="Concept-Index-1">Appendix J Concept Index</h2>
+
+<div class="printindex cp-printindex">
+<table class="cp-letters-header-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-1"><b>&quot;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-2"><b>%</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-3"><b>&amp;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-4"><b>'</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-5"><b>(</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-6"><b>)</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-7"><b>*</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-8"><b>+</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-9"><b>-</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-10"><b>.</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-11"><b>/</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-12"><b>8</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-13"><b>:</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-14"><b>&lt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-15"><b>=</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-16"><b>&gt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-17"><b>[</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-18"><b>\</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-19"><b>]</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-20"><b>|</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-J"><b>J</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-W"><b>W</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-Y"><b>Y</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-Z"><b>Z</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="cp-entries-printindex" border="0">
+<tr><td></td><th class="entries-header-printindex">Index Entry</th><td>&nbsp;</td><th class="sections-header-printindex"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-1">&quot;</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_0022_002c-as-delimiter"><code class="code">&quot;</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Sentences.html#index-_0022_002c-at-end-of-sentence"><code class="code">&quot;</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Sentences.html">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-_0022_002c-at-end-of-sentence-1"><code class="code">&quot;</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Calling-Macros.html#index-_0022_002c-embedding-in-a-macro-argument"><code class="code">&quot;</code>, embedding in a macro argument</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Calling-Macros.html">Calling Macros</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-2">%</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_0025_002c-as-delimiter"><code class="code">%</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-3">&amp;</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_0026_002c-as-delimiter"><code class="code">&amp;</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-4">'</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Comments.html#index-_0027_002c-as-a-comment"><code class="code">'</code>, as a comment</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Comments.html">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_0027_002c-as-delimiter"><code class="code">'</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Sentences.html#index-_0027_002c-at-end-of-sentence"><code class="code">'</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Sentences.html">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-_0027_002c-at-end-of-sentence-1"><code class="code">'</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-5">(</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_0028_002c-as-delimiter"><code class="code">(</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-6">)</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_0029_002c-as-delimiter"><code class="code">)</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Sentences.html#index-_0029_002c-at-end-of-sentence"><code class="code">)</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Sentences.html">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-_0029_002c-at-end-of-sentence-1"><code class="code">)</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-7">*</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_002a_002c-as-delimiter"><code class="code">*</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Sentences.html#index-_002a_002c-at-end-of-sentence"><code class="code">*</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Sentences.html">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-_002a_002c-at-end-of-sentence-1"><code class="code">*</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-8">+</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_002b_002c-and-page-motion"><code class="code">+</code>, and page motion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_002b_002c-as-delimiter"><code class="code">+</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-9">-</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_002d_002c-and-page-motion"><code class="code">-</code>, and page motion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_002d_002c-as-delimiter"><code class="code">-</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-10">.</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_002e_002c-as-delimiter"><code class="code">.</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-_002eh-register_002c-difference-from-nl"><code class="code">.h</code> register, difference from <code class="code">nl</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-_002eps-register_002c-in-comparison-with-_002epsr"><code class="code">.ps</code> register, in comparison with <code class="code">.psr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-_002es-register_002c-in-comparison-with-_002esr"><code class="code">.s</code> register, in comparison with <code class="code">.sr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-_002eS-register_002c-Plan-9-alias-for-_002etabs"><code class="code">.S</code> register, Plan&nbsp;9 alias for <code class="code">.tabs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversion-Traps.html#index-_002et-register_002c-and-diversions"><code class="code">.t</code> register, and diversions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversion-Traps.html">Diversion Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-_002etabs-register_002c-Plan-9-alias-_0028_002eS_0029"><code class="code">.tabs</code> register, Plan&nbsp;9 alias (<code class="code">.S</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Vertical-Spacing.html#index-_002eV-register_002c-and-vs"><code class="code">.V</code> register, and <code class="code">vs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Vertical-Spacing.html">Changing the Vertical Spacing</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-11">/</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_002f_002c-as-delimiter"><code class="code">/</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-12">8</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-8_002dbit-input">8-bit input</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-13">:</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_003a_002c-as-delimiter"><code class="code">:</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-14">&lt;</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_003c_002c-as-delimiter"><code class="code">&lt;</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-15">=</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_003d_002c-as-delimiter"><code class="code">=</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-16">&gt;</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_003e_002c-as-delimiter"><code class="code">&gt;</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-17">[</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Identifiers.html#index-_005b_002c-macro-names-starting-with_002c-and-refer"><code class="code">[</code>, macro names starting with, and <code class="code">refer</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Identifiers.html">Identifiers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-18">\</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-_005c_0021_002c-and-copy-mode"><code class="code">\!</code>, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-_005c_0021_002c-and-output-request"><code class="code">\!</code>, and <code class="code">output</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-_005c_0021_002c-and-trnt"><code class="code">\!</code>, and <code class="code">trnt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_0021_002c-as-delimiter"><code class="code">\!</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_0021_002c-as-delimiter-1"><code class="code">\!</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-_005c_0021_002c-in-top_002dlevel-diversion"><code class="code">\!</code>, in top-level diversion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-_005c_0021_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\!</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-_005c_0021_002c-incompatibilities-with-AT_0026T-troff-1"><code class="code">\!</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Copy-Mode.html#index-_005c_0024_002c-when-reading-text-for-a-macro"><code class="code">\$</code>, when reading text for a macro</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Copy-Mode.html">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-_005c_0025_002c-and-translations"><code class="code">\%</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_0025_002c-as-delimiter"><code class="code">\%</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_0025_002c-as-delimiter-1"><code class="code">\%</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-_005c_0025_002c-following-_005cX-or-_005cY"><code class="code">\%</code>, following <code class="code">\X</code> or <code class="code">\Y</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Postprocessor-Access.html#index-_005c_0025_002c-in-_005cX"><code class="code">\%</code>, in <code class="code">\X</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Postprocessor-Access.html">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-_005c_0025_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\%</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-_005c_0026_002c-and-glyph-definitions"><code class="code">\&amp;</code>, and glyph definitions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-_005c_0026_002c-and-translations"><code class="code">\&amp;</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_0026_002c-as-delimiter"><code class="code">\&amp;</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Sentences.html#index-_005c_0026_002c-at-end-of-sentence"><code class="code">\&amp;</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Sentences.html">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Postprocessor-Access.html#index-_005c_0026_002c-in-_005cX"><code class="code">\&amp;</code>, in <code class="code">\X</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Postprocessor-Access.html">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-_005c_0026_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\&amp;</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-_005c_0027_002c-and-translations"><code class="code">\'</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_0027_002c-as-delimiter"><code class="code">\'</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_0027_002c-as-delimiter-1"><code class="code">\'</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-_005c_0027_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\'</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-_005c_0028_002c-and-translations"><code class="code">\(</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_0029_002c-as-delimiter"><code class="code">\)</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Postprocessor-Access.html#index-_005c_0029_002c-in-_005cX"><code class="code">\)</code>, in <code class="code">\X</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Postprocessor-Access.html">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-_005c_002a_002c-and-warnings"><code class="code">\*</code>, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Compatibility-Mode.html#index-_005c_002a_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\*</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Compatibility-Mode.html">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Copy-Mode.html#index-_005c_002a_002c-when-reading-text-for-a-macro"><code class="code">\*</code>, when reading text for a macro</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Copy-Mode.html">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Escape-Sequences.html#index-_005c_002c-disabling-_0028eo_0029"><code class="code">\</code>, disabling (<code class="code">eo</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Escape-Sequences.html">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Calling-Macros.html#index-_005c_002c-embedding-in-a-macro-argument"><code class="code">\</code>, embedding in a macro argument</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Calling-Macros.html">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_002c_002c-as-delimiter"><code class="code">\,</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-_005c_002d-glyph_002c-and-cflags"><code class="code">\-</code> glyph, and <code class="code">cflags</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-_005c_002d_002c-and-translations"><code class="code">\-</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_002d_002c-as-delimiter"><code class="code">\-</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_002d_002c-as-delimiter-1"><code class="code">\-</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-_005c_002d_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\-</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_002f_002c-as-delimiter"><code class="code">\/</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_002f_002c-as-delimiter-1"><code class="code">\/</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c0_002c-as-delimiter"><code class="code">\0</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_003a_002c-as-delimiter"><code class="code">\:</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_003a_002c-as-delimiter-1"><code class="code">\:</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Postprocessor-Access.html#index-_005c_003a_002c-in-_005cX"><code class="code">\:</code>, in <code class="code">\X</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Postprocessor-Access.html">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Operators-in-Conditionals.html#index-_005c_003f_002c-and-copy-mode"><code class="code">\?</code>, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Operators-in-Conditionals.html">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-_005c_003f_002c-and-copy-mode-1"><code class="code">\?</code>, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_003f_002c-as-delimiter"><code class="code">\?</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-_005c_003f_002c-in-top_002dlevel-diversion"><code class="code">\?</code>, in top-level diversion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-_005c_003f_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\?</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Leaders.html#index-_005ca_002c-and-copy-mode"><code class="code">\a</code>, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Leaders.html">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-_005ca_002c-and-translations"><code class="code">\a</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005ca_002c-as-delimiter"><code class="code">\a</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cA_002c-delimiters-allowed-by"><code class="code">\A</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-_005cA_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\A</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cb_002c-delimiters-allowed-by"><code class="code">\b</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-_005cb_002c-limitations-of"><code class="code">\b</code>, limitations of</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-_005cC_002c-and-translations"><code class="code">\C</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cc_002c-as-delimiter"><code class="code">\c</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cc_002c-as-delimiter-1"><code class="code">\c</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-_005cc_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\c</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-_005cc_002c-when-filling-disabled"><code class="code">\c</code>, when filling disabled</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-_005cc_002c-when-filling-enabled"><code class="code">\c</code>, when filling enabled</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cd_002c-as-delimiter"><code class="code">\d</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cD_002c-delimiters-allowed-by"><code class="code">\D</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-_005ce_002c-and-glyph-definitions"><code class="code">\e</code>, and glyph definitions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-_005ce_002c-and-translations"><code class="code">\e</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005ce_002c-as-delimiter"><code class="code">\e</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cE_002c-as-delimiter"><code class="code">\E</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005ce_002c-as-delimiter-1"><code class="code">\e</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-_005ce_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\e</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-_005cF_002c-and-changing-fonts"><code class="code">\F</code>, and changing fonts</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-_005cf_002c-and-font-translations"><code class="code">\f</code>, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Compatibility-Mode.html#index-_005cf_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\f</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Compatibility-Mode.html">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005ch_002c-delimiters-allowed-by"><code class="code">\h</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cH_002c-delimiters-allowed-by"><code class="code">\H</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Compatibility-Mode.html#index-_005cH_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\H</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Compatibility-Mode.html">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_005cH_002c-using-_002b-and-_002d-with"><code class="code">\H</code>, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-_005cH_002c-with-fractional-type-sizes"><code class="code">\H</code>, with fractional type sizes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-_005cl_002c-and-glyph-definitions"><code class="code">\l</code>, and glyph definitions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-_005cL_002c-and-glyph-definitions"><code class="code">\L</code>, and glyph definitions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cl_002c-delimiters-allowed-by"><code class="code">\l</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cL_002c-delimiters-allowed-by"><code class="code">\L</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-_005cN_002c-and-translations"><code class="code">\N</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-_005cn_002c-and-warnings"><code class="code">\n</code>, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cN_002c-delimiters-allowed-by"><code class="code">\N</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Compatibility-Mode.html#index-_005cn_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\n</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Compatibility-Mode.html">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Copy-Mode.html#index-_005cn_002c-when-reading-text-for-a-macro"><code class="code">\n</code>, when reading text for a macro</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Copy-Mode.html">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005co_002c-delimiters-allowed-by"><code class="code">\o</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cp_002c-as-delimiter"><code class="code">\p</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cp_002c-as-delimiter-1"><code class="code">\p</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-_005cR_002c-after-_005cc"><code class="code">\R</code>, after <code class="code">\c</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-_005cR_002c-and-warnings"><code class="code">\R</code>, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cr_002c-as-delimiter"><code class="code">\r</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cR_002c-delimiters-allowed-by"><code class="code">\R</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Auto_002dincrement.html#index-_005cR_002c-difference-from-nr"><code class="code">\R</code>, difference from <code class="code">nr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Auto_002dincrement.html">Auto-increment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_005cR_002c-using-_002b-and-_002d-with"><code class="code">\R</code>, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Copy-Mode.html#index-_005cRET_002c-when-reading-text-for-a-macro">\<kbd class="key">RET</kbd>, when reading text for a macro</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Copy-Mode.html">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cs_002c-delimiters-allowed-by"><code class="code">\s</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cS_002c-delimiters-allowed-by"><code class="code">\S</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Compatibility-Mode.html#index-_005cs_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\s</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Compatibility-Mode.html">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Compatibility-Mode.html#index-_005cS_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\S</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Compatibility-Mode.html">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Compatibility-Mode.html#index-_005cs_002c-incompatibilities-with-AT_0026T-troff-1"><code class="code">\s</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Compatibility-Mode.html">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_005cs_002c-using-_002b-and-_002d-with"><code class="code">\s</code>, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-_005cs_002c-with-fractional-type-sizes"><code class="code">\s</code>, with fractional type sizes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cSP_002c-as-delimiter"><code class="code">\<kbd class="key">SP</kbd></code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Calling-Macros.html#index-_005cSP_002c-difference-from-_005c_007e"><code class="code">\<kbd class="key">SP</kbd></code>, difference from <code class="code">\~</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Calling-Macros.html">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-_005cSP_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\<kbd class="key">SP</kbd></code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-_005ct_002c-and-copy-mode"><code class="code">\t</code>, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-_005ct_002c-and-translations"><code class="code">\t</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-_005ct_002c-and-warnings"><code class="code">\t</code>, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005ct_002c-as-delimiter"><code class="code">\t</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cu_002c-as-delimiter"><code class="code">\u</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-_005cV_002c-and-copy-mode"><code class="code">\V</code>, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cv_002c-delimiters-allowed-by"><code class="code">\v</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Gtroff-Internals.html#index-_005cv_002c-internal-representation"><code class="code">\v</code>, internal representation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Gtroff-Internals.html">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cw_002c-delimiters-allowed-by"><code class="code">\w</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Postprocessor-Access.html#index-_005cX_002c-and-special-characters"><code class="code">\X</code>, and special characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Postprocessor-Access.html">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cX_002c-delimiters-allowed-by"><code class="code">\X</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cx_002c-delimiters-allowed-by"><code class="code">\x</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-_005cX_002c-followed-by-_005c_0025"><code class="code">\X</code>, followed by <code class="code">\%</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-_005cY_002c-followed-by-_005c_0025"><code class="code">\Y</code>, followed by <code class="code">\%</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005cZ_002c-delimiters-allowed-by"><code class="code">\Z</code>, delimiters allowed by</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-_005c_005b_002c-and-translations"><code class="code">\[</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Copy-Mode.html#index-_005c_005c_002c-when-reading-text-for-a-macro"><code class="code">\\</code>, when reading text for a macro</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Copy-Mode.html">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_005e_002c-as-delimiter"><code class="code">\^</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-_005c_005e_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\^</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-_005c_005f_002c-and-translations"><code class="code">\_</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_005f_002c-as-delimiter"><code class="code">\_</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_005f_002c-as-delimiter-1"><code class="code">\_</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-_005c_005f_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\_</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-_005c_0060_002c-and-translations"><code class="code">\`</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_0060_002c-as-delimiter"><code class="code">\`</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_0060_002c-as-delimiter-1"><code class="code">\`</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-_005c_0060_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\`</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_007b_002c-as-delimiter"><code class="code">\{</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_007b_002c-as-delimiter-1"><code class="code">\{</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-_005c_007b_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\{</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_007c_002c-as-delimiter"><code class="code">\|</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-_005c_007c_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\|</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-_005c_007d_002c-and-warnings"><code class="code">\}</code>, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_007d_002c-as-delimiter"><code class="code">\}</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_007d_002c-as-delimiter-1"><code class="code">\}</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-_005c_007d_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\}</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-_005c_007e_002c-and-translations"><code class="code">\~</code>, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-_005c_007e_002c-as-delimiter"><code class="code">\~</code>, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Calling-Macros.html#index-_005c_007e_002c-difference-from-_005cSP"><code class="code">\~</code>, difference from <code class="code">\<kbd class="key">SP</kbd></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Calling-Macros.html">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-_005c_007e_002c-incompatibilities-with-AT_0026T-troff"><code class="code">\~</code>, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-19">]</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Identifiers.html#index-_005d_002c-as-part-of-an-identifier"><code class="code">]</code>, as part of an identifier</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Identifiers.html">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Sentences.html#index-_005d_002c-at-end-of-sentence"><code class="code">]</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Sentences.html">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-_005d_002c-at-end-of-sentence-1"><code class="code">]</code>, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Identifiers.html#index-_005d_002c-macro-names-starting-with_002c-and-refer"><code class="code">]</code>, macro names starting with, and <code class="code">refer</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Identifiers.html">Identifiers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_symbol-20">|</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_007c_002c-and-page-motion"><code class="code">|</code>, and page motion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-A">A</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-ab-request_002c-incompatibilities-with-AT_0026T-troff"><code class="code">ab</code> request, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-aborting-_0028ab_0029">aborting (<code class="code">ab</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-absolute-_0028sic_0029-position-operator-_0028_007c_0029">absolute <i class="slanted">(sic)</i> position operator (<code class="code">|</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-abstract-font-style">abstract font style</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-abstract-font-style_002c-setting-up-_0028sty_0029">abstract font style, setting up (<code class="code">sty</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-accent-marks-_005bms_005d">accent marks [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Postprocessor-Access.html#index-access-to-postprocessor">access to postprocessor</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Postprocessor-Access.html">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-accessing-unnamed-glyphs-with-_005cN">accessing unnamed glyphs with <code class="code">\N</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Ligatures-and-Kerning.html#index-activating-kerning-_0028kern_0029">activating kerning (<code class="code">kern</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Ligatures-and-Kerning.html">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Ligatures-and-Kerning.html#index-activating-ligatures-_0028lg_0029">activating ligatures (<code class="code">lg</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Ligatures-and-Kerning.html">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Ligatures-and-Kerning.html#index-activating-track-kerning-_0028tkf_0029">activating track kerning (<code class="code">tkf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Ligatures-and-Kerning.html">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-ad-request_002c-and-hyphenation-margin"><code class="code">ad</code> request, and hyphenation margin</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-ad-request_002c-and-hyphenation-space"><code class="code">ad</code> request, and hyphenation space</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-addition">addition</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-additional-inter_002dsentence-space">additional inter-sentence space</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-adjustment-and-filling_002c-manipulating">adjustment and filling, manipulating</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-adjustment-mode-register-_0028_002ej_0029">adjustment mode register (<code class="code">.j</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-adjustment-to-both-margins_002c-difference-from-AT_0026T-troff">adjustment to both margins, difference from <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-Adobe-Glyph-List-_0028AGL_0029">Adobe Glyph List (AGL)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-alias_002c-diversion_002c-creating-_0028als_0029">alias, diversion, creating (<code class="code">als</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-alias_002c-diversion_002c-removing-_0028rm_0029">alias, diversion, removing (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-alias_002c-macro_002c-creating-_0028als_0029">alias, macro, creating (<code class="code">als</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-alias_002c-macro_002c-removing-_0028rm_0029">alias, macro, removing (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Setting-Registers.html#index-alias_002c-register_002c-creating-_0028aln_0029">alias, register, creating (<code class="code">aln</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Setting-Registers.html">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Setting-Registers.html#index-alias_002c-register_002c-removing-_0028rr_0029">alias, register, removing (<code class="code">rr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Setting-Registers.html">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-alias_002c-string_002c-creating-_0028als_0029">alias, string, creating (<code class="code">als</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-alias_002c-string_002c-removing-_0028rm_0029">alias, string, removing (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Positions.html#index-aliasing-fonts-with-third-argument-to-fp-request">aliasing fonts with third argument to <code class="code">fp</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Positions.html">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Parameters.html#index-als-request_002c-and-_005c_00240"><code class="code">als</code> request, and <code class="code">\$0</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Parameters.html">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-am_002c-am1_002c-ami-requests_002c-and-warnings"><code class="code">am</code>, <code class="code">am1</code>, <code class="code">ami</code> requests, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-appending-to-a-diversion-_0028da_002c-boxa_0029">appending to a diversion (<code class="code">da</code>, <code class="code">boxa</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-appending-to-a-file-_0028opena_0029">appending to a file (<code class="code">opena</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Writing-Macros.html#index-appending-to-a-macro-_0028am_0029">appending to a macro (<code class="code">am</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Writing-Macros.html">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-appending-to-a-string-_0028as_0029">appending to a string (<code class="code">as</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-approximation-output-register-_0028_002eA_0029">approximation output register (<code class="code">.A</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-arc_002c-drawing-_0028_005cD_0027a-_2026_0027_0029">arc, drawing (&lsquo;<samp class="samp">\D'a &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Requests-and-Macros.html#index-argument">argument</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Requests-and-Macros.html">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Calling-Macros.html#index-arguments-to-macros">arguments to macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Calling-Macros.html">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Invoking-Requests.html#index-arguments-to-macros_002c-and-tabs">arguments to macros, and tabs</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Invoking-Requests.html">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Invoking-Requests.html#index-arguments-to-requests">arguments to requests</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Invoking-Requests.html">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Invoking-Requests.html#index-arguments-to-requests_002c-and-tabs">arguments to requests, and tabs</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Invoking-Requests.html">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Gtroff-Internals.html#index-arguments_002c-and-compatibility-mode">arguments, and compatibility mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Gtroff-Internals.html">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-arguments_002c-to-escape-sequences_002c-delimiting">arguments, to escape sequences, delimiting</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-arguments_002c-to-strings">arguments, to strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-arithmetic-operators">arithmetic operators</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-artificial-fonts">artificial fonts</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Comments.html#index-as_002c-as1-requests_002c-and-comments"><code class="code">as</code>, <code class="code">as1</code> requests, and comments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Comments.html">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-as_002c-as1-requests_002c-and-warnings"><code class="code">as</code>, <code class="code">as1</code> requests, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-ASCII-output-encoding"><abbr class="acronym">ASCII</abbr> output encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-asciify-request_002c-and-writem"><code class="code">asciify</code> request, and <code class="code">writem</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-assertion-_0028arithmetic-operator_0029">assertion (arithmetic operator)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Assigning-Register-Formats.html#index-assign-number-format-to-register-_0028af_0029">assign number format to register (<code class="code">af</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Assigning-Register-Formats.html">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Interpolating-Registers.html#index-assignments_002c-indirect">assignments, indirect</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Interpolating-Registers.html">Interpolating Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Interpolating-Registers.html#index-assignments_002c-nested">assignments, nested</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Interpolating-Registers.html">Interpolating Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Differences-from-AT_0026T-ms.html#index-AT_0026T-ms_002c-macro-package-differences"><abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp>, macro package differences</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Differences-from-AT_0026T-ms.html">Differences from AT&amp;T ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-attributes_002c-character-cell">attributes, character cell</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Auto_002dincrement.html#index-auto_002dincrementation-of-a-register">auto-incrementation of a register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Auto_002dincrement.html">Auto-increment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-automatic-font-mounting">automatic font mounting</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-automatic-hyphenation">automatic hyphenation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-automatic-hyphenation-parameters">automatic hyphenation parameters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Major-Macro-Packages.html#index-auxiliary-macro-package">auxiliary macro package</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Major-Macro-Packages.html">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-available-glyphs_002c-list-of-_0028groff_005fchar_00287_0029-man-page_0029">available glyphs, list of (<cite class="cite">groff_char<span class="r">(7)</span></cite> man page)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-B">B</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Background.html#index-background">background</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Background.html">Background</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-background-color-name-register-_0028_002eM_0029">background color name register (<code class="code">.M</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Escape-Sequences.html#index-backslash-glyph_002c-formatting-_0028_005c_005brs_005d_0029">backslash glyph, formatting (<code class="code">\[rs]</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Escape-Sequences.html">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Calling-Macros.html#index-backslash_002c-embedding-in-a-macro-argument">backslash, embedding in a macro argument</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Calling-Macros.html">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-backslash_002c-printing-_0028_005c_005c_002c-_005ce_002c-_005cE_002c-_005c_005brs_005d_0029">backslash, printing (<code class="code">\\</code>, <code class="code">\e</code>, <code class="code">\E</code>, <code class="code">\[rs]</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-backspace-character_002c-and-translations">backspace character, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-backtrace-of-input-stack-_0028backtrace_0029">backtrace of input stack (<code class="code">backtrace</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-baseline-rule-special-character_0028_005c_005bru_005d_0029">baseline rule special character(<code class="code">\[ru]</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-baseline_002c-text">baseline, text</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Type-Size-and-Vertical-Spacing.html#index-baseline_002c-text-1">baseline, text</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Type-Size-and-Vertical-Spacing.html">Manipulating Type Size and Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-basic-scaling-unit-_0028u_0029">basic scaling unit (<code class="code">u</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-basic-units">basic units</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-basic-units_002c-conversion-to">basic units, conversion to</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Basics.html#index-basics-of-macro-package-usage">basics of macro package usage</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Basics.html">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-bd-request_002c-and-font-styles"><code class="code">bd</code> request, and font styles</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-bd-request_002c-and-font-translations"><code class="code">bd</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-bd-request_002c-incompatibilities-with-AT_0026T-troff"><code class="code">bd</code> request, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-beginning-diversion-_0028di_002c-box_0029">beginning diversion (<code class="code">di</code>, <code class="code">box</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Conditional-Blocks.html#index-beginning-of-conditional-block-_0028_005c_007b_0029">beginning of conditional block (<code class="code">\{</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Conditional-Blocks.html">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Breaking.html#index-blank-line">blank line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Breaking.html">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Breaking.html#index-blank-line-macro-_0028blm_0029">blank line macro (<code class="code">blm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Breaking.html">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Invoking-Requests.html#index-blank-line-macro-_0028blm_0029-1">blank line macro (<code class="code">blm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Invoking-Requests.html">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Blank-Line-Traps.html#index-blank-line-macro-_0028blm_0029-2">blank line macro (<code class="code">blm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Blank-Line-Traps.html">Blank Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Invoking-Requests.html#index-blank-line-trap-_0028blm_0029">blank line trap (<code class="code">blm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Invoking-Requests.html">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Blank-Line-Traps.html#index-blank-line-traps">blank line traps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Blank-Line-Traps.html">Blank Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Spacing.html#index-blank-lines_002c-disabling">blank lines, disabling</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Spacing.html">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Conditional-Blocks.html#index-block_002c-conditional_002c-beginning-_0028_005c_007b_0029">block, conditional, beginning (<code class="code">\{</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Conditional-Blocks.html">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Conditional-Blocks.html#index-block_002c-conditional_002c-end-_0028_005c_007d_0029">block, conditional, end (<code class="code">\}</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Conditional-Blocks.html">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Conditional-Blocks.html#index-blocks_002c-conditional">blocks, conditional</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Conditional-Blocks.html">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="while.html#index-body_002c-of-a-while-request">body, of a while request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="while.html">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-boldface_002c-imitating-_0028bd_0029">boldface, imitating (<code class="code">bd</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-bottom-margin">bottom margin</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-boundary_002drelative-motion-operator-_0028_007c_0029">boundary-relative motion operator (<code class="code">|</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-bounding-box">bounding box</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-box-_0028diversion-operation_0029">box (diversion operation)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-box-request_002c-and-warnings"><code class="code">box</code> request, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-box-rule-glyph-_0028_005c_005bbr_005d_0029">box rule glyph (<code class="code">\[br]</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-box_002c-boxa-requests_002c-and-warnings"><code class="code">box</code>, <code class="code">boxa</code> requests, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-boxa-request_002c-and-dn-_0028dl_0029"><code class="code">boxa</code> request, and <code class="code">dn</code> (<code class="code">dl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-boxa-request_002c-and-warnings"><code class="code">boxa</code> request, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-keeps-and-displays.html#index-boxes-_005bms_005d">boxes [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-keeps-and-displays.html">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-bp-request_002c-and-top_002dlevel-diversion"><code class="code">bp</code> request, and top-level diversion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-bp-request_002c-and-traps-_0028_002epe_0029"><code class="code">bp</code> request, and traps (<code class="code">.pe</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-bp-request_002c-causing-implicit-break"><code class="code">bp</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-bp-request_002c-incompatibilities-with-AT_0026T-troff"><code class="code">bp</code> request, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-bp-request_002c-using-_002b-and-_002d-with"><code class="code">bp</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-br-glyph_002c-and-cflags"><code class="code">br</code> glyph, and <code class="code">cflags</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Conditional-Blocks.html#index-brace-escape-sequence_002c-closing-_0028_005c_007d_0029">brace escape sequence, closing (<code class="code">\})</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Conditional-Blocks.html">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Conditional-Blocks.html#index-brace-escape-sequence_002c-opening-_0028_005c_007d_0029">brace escape sequence, opening (<code class="code">\})</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Conditional-Blocks.html">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Conditional-Blocks.html#index-brace-escape-sequences-_0028_005c_007b_002c-_005c_007d_0029">brace escape sequences (<code class="code">\{</code>, <code class="code">\}</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Conditional-Blocks.html">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Breaking.html#index-break">break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Breaking.html">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-break-1">break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Basics.html#index-break-_0028introduction_0029">break (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Basics.html">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="while.html#index-break-request_002c-in-a-while-loop"><code class="code">break</code> request, in a <code class="code">while</code> loop</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="while.html">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-break_002c-page">break, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-break_002c-page-1">break, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="The-Implicit-Page-Trap.html#index-break_002c-page-2">break, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="The-Implicit-Page-Trap.html">The Implicit Page Trap</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Basics.html#index-break_002c-page-_0028introduction_0029">break, page (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Basics.html">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="End_002dof_002dinput-Traps.html#index-break_002c-page_002c-final">break, page, final</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="End_002dof_002dinput-Traps.html">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Vertical-Position-Traps.html#index-break_002c-page_002c-prevented-by-vpt">break, page, prevented by <code class="code">vpt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Vertical-Position-Traps.html">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-breaking-file-names-_0028_005c_003a_0029">breaking file names (<code class="code">\:</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-breaking-URLs-_0028_005c_003a_0029">breaking URLs (<code class="code">\:</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-breaking-without-hyphens-_0028_005c_003a_0029">breaking without hyphens (<code class="code">\:</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-built_002din-register_002c-removing">built-in register, removing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-built_002din-registers">built-in registers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Lists-in-ms.html#index-bulleted-list_002c-example-markup-_005bms_005d">bulleted list, example markup [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Lists-in-ms.html">Lists in ms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-c-scaling-unit"><code class="code">c</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Requests-and-Macros.html#index-calling-a-macro">calling a macro</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Requests-and-Macros.html">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Calling-Macros.html#index-calling-macros">calling macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Calling-Macros.html">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="groff-Capabilities.html#index-capabilities-of-groff">capabilities of <code class="code">groff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="groff-Capabilities.html"><code class="code">groff</code> Capabilities</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-case_002dtransforming-a-string-_0028stringdown_002c-stringup_0029">case-transforming a string (<code class="code">stringdown</code>, <code class="code">stringup</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-categories_002c-warning">categories, warning</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-CCSID-1047-output-encoding-_0028EBCDIC_0029">CCSID 1047 output encoding (EBCDIC)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-ce-request_002c-causing-implicit-break"><code class="code">ce</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-ce-request_002c-difference-from-_002ead-c"><code class="code">ce</code> request, difference from &lsquo;<samp class="samp">.ad&nbsp;c</samp>&rsquo;<!-- /@w --></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-cell_002c-character_002c-attributes">cell, character, attributes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-centered-text-_0028filled_0029">centered text (filled)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-centered-text-_0028unfilled_0029">centered text (unfilled)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-centering-lines-_0028ce_0029">centering lines (<code class="code">ce</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Basics.html#index-centering-lines-_0028introduction_0029">centering lines (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Basics.html">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-centimeter-scaling-unit-_0028c_0029">centimeter scaling unit (<code class="code">c</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-cf-request_002c-and-copy-mode"><code class="code">cf</code> request, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-cf-request_002c-causing-implicit-break"><code class="code">cf</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Control-Characters.html#index-changing-control-characters">changing control characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Control-Characters.html">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-changing-font-family-_0028fam_002c-_005cF_0029">changing font family (<code class="code">fam</code>, <code class="code">\F</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-changing-fonts-_0028ft_002c-_005cf_0029">changing fonts (<code class="code">ft</code>, <code class="code">\f</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Assigning-Register-Formats.html#index-changing-format_002c-and-read_002donly-registers">changing format, and read-only registers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Assigning-Register-Formats.html">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-changing-the-font-height-_0028_005cH_0029">changing the font height (<code class="code">\H</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-changing-the-font-slant-_0028_005cS_0029">changing the font slant (<code class="code">\S</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-changing-the-page-number-character-_0028pc_0029">changing the page number character (<code class="code">pc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-changing-trap-location-_0028ch_0029">changing trap location (<code class="code">ch</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Type-Size.html#index-changing-type-sizes-_0028ps_002c-_005cs_0029">changing type sizes (<code class="code">ps</code>, <code class="code">\s</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Type-Size.html">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Vertical-Spacing.html#index-changing-vertical-line-spacing-_0028vs_0029">changing vertical line spacing (<code class="code">vs</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Vertical-Spacing.html">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-char-request_002c-and-soft-hyphen-character"><code class="code">char</code> request, and soft hyphen character</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-char-request_002c-and-translations"><code class="code">char</code> request, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-char-request_002c-used-with-_005cN"><code class="code">char</code> request, used with <code class="code">\N</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-character">character</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-character-cell-attributes">character cell attributes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Classes.html#index-character-class-_0028class_0029">character class (<code class="code">class</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Classes.html">Character Classes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Classes.html#index-character-classes">character classes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Classes.html">Character Classes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-character-properties-_0028cflags_0029">character properties (<code class="code">cflags</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-character-translations">character translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-character_002c-backspace_002c-and-translations">character, backspace, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Requests-and-Macros.html#index-character_002c-control-_0028_002e_0029">character, control (<code class="code">.</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Requests-and-Macros.html">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Control-Characters.html#index-character_002c-control_002c-changing-_0028cc_0029">character, control, changing (<code class="code">cc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Control-Characters.html">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-character_002c-defining-_0028char_0029">character, defining (<code class="code">char</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-character_002c-defining-fallback-_0028fchar_002c-fschar_002c-schar_0029">character, defining fallback (<code class="code">fchar</code>, <code class="code">fschar</code>, <code class="code">schar</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-character_002c-distinguished-from-glyph">character, distinguished from glyph</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Dummy-Characters.html#index-character_002c-dummy-_0028_005c_0026_0029">character, dummy (<code class="code">\&amp;</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Dummy-Characters.html">Dummy Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Requests-and-Macros.html#index-character_002c-dummy-_0028_005c_0026_0029_002c-as-control-character-suppressor">character, dummy (<code class="code">\&amp;</code>), as control character suppressor</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Requests-and-Macros.html">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Ligatures-and-Kerning.html#index-character_002c-dummy-_0028_005c_0026_0029_002c-effect-on-kerning">character, dummy (<code class="code">\&amp;</code>), effect on kerning</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Ligatures-and-Kerning.html">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-character_002c-dummy-_0028_005c_0026_0029_002c-effect-on-_005cl-escape-sequence">character, dummy (<code class="code">\&amp;</code>), effect on <code class="code">\l</code> escape sequence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Escape-Sequences.html#index-character_002c-escape_002c-changing-_0028ec_0029">character, escape, changing (<code class="code">ec</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Escape-Sequences.html">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-character_002c-escape_002c-while-defining-glyph">character, escape, while defining glyph</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Fields.html#index-character_002c-field-delimiting-_0028fc_0029">character, field delimiting (<code class="code">fc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Fields.html">Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Fields.html#index-character_002c-field-padding-_0028fc_0029">character, field padding (<code class="code">fc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Fields.html">Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Leaders.html#index-character_002c-horizontal-tab">character, horizontal tab</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Leaders.html">Tabs and Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-character_002c-hyphenation-_0028_005c_0025_0029">character, hyphenation (<code class="code">\%</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Leaders.html#index-character_002c-leader">character, leader</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Leaders.html">Tabs and Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Leaders.html#index-character_002c-leader-repetition-_0028lc_0029">character, leader repetition (<code class="code">lc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Leaders.html">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-character_002c-leader_002c-and-translations">character, leader, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Leaders.html#index-character_002c-leader_002c-non_002dinterpreted-_0028_005ca_0029">character, leader, non-interpreted (<code class="code">\a</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Leaders.html">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-character_002c-named-_0028_005cC_0029">character, named (<code class="code">\C</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-character_002c-newline_002c-and-translations">character, newline, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Requests-and-Macros.html#index-character_002c-no_002dbreak-control-_0028_0027_0029">character, no-break control (<code class="code">'</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Requests-and-Macros.html">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Control-Characters.html#index-character_002c-no_002dbreak-control_002c-changing-_0028c2_0029">character, no-break control, changing (<code class="code">c2</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Control-Characters.html">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Identifiers.html#index-character_002c-ordinary">character, ordinary</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Identifiers.html">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-character_002c-soft-hyphen_002c-setting-_0028shc_0029">character, soft hyphen, setting (<code class="code">shc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-character_002c-special">character, special</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-character_002c-tab-repetition-_0028tc_0029">character, tab repetition (<code class="code">tc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-character_002c-tab_002c-and-translations">character, tab, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-character_002c-tab_002c-non_002dinterpreted-_0028_005ct_0029">character, tab, non-interpreted (<code class="code">\t</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-character_002c-transparent">character, transparent</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Dummy-Characters.html#index-character_002c-transparent-dummy-_0028_005c_0029_0029">character, transparent dummy (<code class="code">\)</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Dummy-Characters.html">Dummy Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-characters_002c-end_002dof_002dsentence">characters, end-of-sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Sentences.html#index-characters_002c-end_002dof_002dsentence-transparent">characters, end-of-sentence transparent</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Sentences.html">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-characters_002c-hyphenation">characters, hyphenation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-characters_002c-input_002c-and-output-glyphs_002c-compatibility-with-AT_0026T-troff">characters, input, and output glyphs, compatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-characters_002c-invalid-for-trf-request">characters, invalid for <code class="code">trf</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Identifiers.html#index-characters_002c-invalid-input">characters, invalid input</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Identifiers.html">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-characters_002c-overlapping">characters, overlapping</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Sentences.html#index-characters_002c-special">characters, special</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Sentences.html">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-characters_002c-special_002c-list-of-_0028groff_005fchar_00287_0029-man-page_0029">characters, special, list of (<cite class="cite">groff_char<span class="r">(7)</span></cite> man page)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-characters_002c-unnamed_002c-accessing-with-_005cN">characters, unnamed, accessing with <code class="code">\N</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-circle_002c-filled_002c-drawing-_0028_005cD_0027C-_2026_0027_0029">circle, filled, drawing (&lsquo;<samp class="samp">\D'C &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-circle_002c-outlined_002c-drawing-_0028_005cD_0027c-_2026_0027_0029">circle, outlined, drawing (&lsquo;<samp class="samp">\D'c &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-circle_002c-solid_002c-drawing-_0028_005cD_0027C-_2026_0027_0029">circle, solid, drawing (&lsquo;<samp class="samp">\D'C &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-circle_002c-stroked_002c-drawing-_0028_005cD_0027c-_2026_0027_0029">circle, stroked, drawing (&lsquo;<samp class="samp">\D'c &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Classes.html#index-class-of-characters-_0028class_0029">class of characters (<code class="code">class</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Classes.html">Character Classes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Classes.html#index-classes_002c-character">classes, character</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Classes.html">Character Classes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Line-Traps.html#index-clearing-input-line-trap-_0028it_002c-itc_0029">clearing input line trap (<code class="code">it</code>, <code class="code">itc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Line-Traps.html">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Conditional-Blocks.html#index-closing-brace-escape-sequence-_0028_005c_007d_0029">closing brace escape sequence (<code class="code">\})</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Conditional-Blocks.html">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-closing-file-_0028close_0029">closing file (<code class="code">close</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-code-page-1047-output-encoding">code page 1047 output encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-code-page-1047_002c-input-encoding">code page 1047, input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-code_002c-hyphenation-_0028hcode_0029">code, hyphenation (<code class="code">hcode</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-color-name_002c-background_002c-register-_0028_002eM_0029">color name, background, register (<code class="code">.M</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-color-name_002c-fill_002c-register-_0028_002eM_0029">color name, fill, register (<code class="code">.M</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-color-name_002c-stroke_002c-register-_0028_002em_0029">color name, stroke, register (<code class="code">.m</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-color_002c-default">color, default</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-color_002c-fill">color, fill</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-color_002c-stroke">color, stroke</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-colors">colors</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environment.html#index-command-prefix">command prefix</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environment.html">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-command_002dline-options">command-line options</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Comments.html#index-comments">comments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Comments.html">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-comments-in-device-description-files">comments in device description files</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-comments-in-font-description-files">comments in font description files</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Comments.html#index-comments_002c-lining-up-with-tabs">comments, lining up with tabs</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Comments.html">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-comments_002c-with-ds">comments, with <code class="code">ds</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Common-Features.html#index-common-features">common features</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Common-Features.html">Common Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Identifiers.html#index-common-name-space-of-macros_002c-diversions_002c-and-strings">common name space of macros, diversions, and strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Identifiers.html">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Operators-in-Conditionals.html#index-comparison-of-strings">comparison of strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Operators-in-Conditionals.html">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-comparison-operators">comparison operators</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-compatibility-mode">compatibility mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Compatibility-Mode.html#index-compatibility-mode-1">compatibility mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Compatibility-Mode.html">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Gtroff-Internals.html#index-compatibility-mode_002c-and-parameters">compatibility mode, and parameters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Gtroff-Internals.html">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-complementation_002c-logical">complementation, logical</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-composite-glyph-names">composite glyph names</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Conditional-Blocks.html#index-conditional-block_002c-beginning-_0028_005c_007b_0029">conditional block, beginning (<code class="code">\{</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Conditional-Blocks.html">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Conditional-Blocks.html#index-conditional-block_002c-end-_0028_005c_007d_0029">conditional block, end (<code class="code">\}</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Conditional-Blocks.html">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Conditional-Blocks.html#index-conditional-blocks">conditional blocks</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Conditional-Blocks.html">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Operators-in-Conditionals.html#index-conditional-expressions">conditional expressions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Operators-in-Conditionals.html">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Operators-in-Conditionals.html#index-conditional-output-for-terminal-_0028TTY_0029">conditional output for terminal (TTY)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Operators-in-Conditionals.html">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-conditional-page-break-_0028ne_0029">conditional page break (<code class="code">ne</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Conditionals-and-Loops.html#index-conditionals-and-loops">conditionals and loops</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Conditionals-and-Loops.html">Conditionals and Loops</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Control-Characters.html#index-configuring-control-characters">configuring control characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Control-Characters.html">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-configuring-the-page-length-_0028pl_0029">configuring the page length (<code class="code">pl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-consecutive-hyphenated-lines-_0028hlm_0029">consecutive hyphenated lines (<code class="code">hlm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-constant-glyph-space-mode-_0028cs_0029">constant glyph space mode (<code class="code">cs</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Table-of-Contents.html#index-contents_002c-table-of">contents, table of</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Table-of-Contents.html">Table of Contents</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Leaders.html#index-contents_002c-table-of-1">contents, table of</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Leaders.html">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-continuation_002c-input-line-_0028_005cRET_0029">continuation, input line (<code class="code">\<kbd class="key">RET</kbd></code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-continuation_002c-output-line-_0028_005cc_0029">continuation, output line (<code class="code">\c</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="while.html#index-continue-request_002c-in-a-while-loop"><code class="code">continue</code> request, in a <code class="code">while</code> loop</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="while.html">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-continued-output-line-register-_0028_002eint_0029">continued output line register (<code class="code">.int</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-continuous-underlining-_0028cu_0029">continuous underlining (<code class="code">cu</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Requests-and-Macros.html#index-control-character-_0028_002e_0029">control character (<code class="code">.</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Requests-and-Macros.html">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Control-Characters.html#index-control-character_002c-changing-_0028cc_0029">control character, changing (<code class="code">cc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Control-Characters.html">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Requests-and-Macros.html#index-control-character_002c-no_002dbreak-_0028_0027_0029">control character, no-break (<code class="code">'</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Requests-and-Macros.html">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Control-Characters.html#index-control-character_002c-no_002dbreak_002c-changing-_0028c2_0029">control character, no-break, changing (<code class="code">c2</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Control-Characters.html">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Control-Characters.html#index-control-characters">control characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Control-Characters.html">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Requests-and-Macros.html#index-control-line">control line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Requests-and-Macros.html">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-control_002c-line">control, line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-control_002c-page">control, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Conventions.html#index-conventions-for-input">conventions for input</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Conventions.html">Input Conventions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-conversion-to-basic-units">conversion to basic units</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Copy-Mode.html#index-copy-mode">copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Copy-Mode.html">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Copy-Mode.html#index-copy-mode-1">copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Copy-Mode.html">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-copy-mode_002c-and-cf-request">copy mode, and <code class="code">cf</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Postprocessor-Access.html#index-copy-mode_002c-and-device-request">copy mode, and <code class="code">device</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Postprocessor-Access.html">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-copy-mode_002c-and-length-request">copy mode, and <code class="code">length</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Parameters.html#index-copy-mode_002c-and-macro-parameters">copy mode, and macro parameters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Parameters.html">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-copy-mode_002c-and-output-request">copy mode, and <code class="code">output</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-copy-mode_002c-and-trf-request">copy mode, and <code class="code">trf</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-copy-mode_002c-and-write-request">copy mode, and <code class="code">write</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-copy-mode_002c-and-writec-request">copy mode, and <code class="code">writec</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-copy-mode_002c-and-writem-request">copy mode, and <code class="code">writem</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-copy-mode_002c-and-_005c_0021">copy mode, and <code class="code">\!</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Operators-in-Conditionals.html#index-copy-mode_002c-and-_005c_003f">copy mode, and <code class="code">\?</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Operators-in-Conditionals.html">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-copy-mode_002c-and-_005c_003f-1">copy mode, and <code class="code">\?</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Leaders.html#index-copy-mode_002c-and-_005ca">copy mode, and <code class="code">\a</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Leaders.html">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-copy-mode_002c-and-_005ct">copy mode, and <code class="code">\t</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-copy-mode_002c-and-_005cV">copy mode, and <code class="code">\V</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-copying-environment-_0028evc_0029">copying environment (<code class="code">evc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Italic-Corrections.html#index-correction-between-oblique-and-upright-glyph-_0028_005c_002f_002c-_005c_002c_0029">correction between oblique and upright glyph (<code class="code">\/</code>, <code class="code">\,</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Italic-Corrections.html">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Italic-Corrections.html#index-correction-between-upright-and-oblique-glyph-_0028_005c_002f_002c-_005c_002c_0029">correction between upright and oblique glyph (<code class="code">\/</code>, <code class="code">\,</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Italic-Corrections.html">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Italic-Corrections.html#index-correction_002c-italic-_0028_005c_002f_0029">correction, italic (<code class="code">\/</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Italic-Corrections.html">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Italic-Corrections.html#index-correction_002c-left-italic-_0028_005c_002c_0029">correction, left italic (<code class="code">\,</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Italic-Corrections.html">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Description-Macros.html#index-cover-page-in-_005bms_005d_002c-example-markup">cover page in [<samp class="file">ms</samp>], example markup</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Description-Macros.html">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-cp-request_002c-and-glyph-definitions"><code class="code">cp</code> request, and glyph definitions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Sentences.html#index-cq-glyph_002c-at-end-of-sentence"><code class="code">cq</code> glyph, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Sentences.html">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-cq-glyph_002c-at-end-of-sentence-1"><code class="code">cq</code> glyph, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Setting-Registers.html#index-creating-alias-for-register-_0028aln_0029">creating alias for register (<code class="code">aln</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Setting-Registers.html">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-creating-alias_002c-for-diversion-_0028als_0029">creating alias, for diversion (<code class="code">als</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-creating-alias_002c-for-macro-_0028als_0029">creating alias, for macro (<code class="code">als</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-creating-alias_002c-for-string-_0028als_0029">creating alias, for string (<code class="code">als</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-creating-new-characters-_0028char_0029">creating new characters (<code class="code">char</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Credits.html#index-credits">credits</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Credits.html">Credits</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-cs-request_002c-and-font-styles"><code class="code">cs</code> request, and font styles</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-cs-request_002c-and-font-translations"><code class="code">cs</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-cs-request_002c-incompatibilities-with-AT_0026T-troff"><code class="code">cs</code> request, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-cs-request_002c-with-fractional-type-sizes"><code class="code">cs</code> request, with fractional type sizes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-CSTR-_002354-errata">CSTR&nbsp;#54 errata</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-CSTR-_002354-errata-1">CSTR&nbsp;#54 errata</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-CSTR-_002354-errata-2">CSTR&nbsp;#54 errata</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-CSTR-_002354-errata-3">CSTR&nbsp;#54 errata</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Type-Size.html#index-CSTR-_002354-errata-4">CSTR&nbsp;#54 errata</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Type-Size.html">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-CSTR-_002354-errata-5">CSTR&nbsp;#54 errata</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-CSTR-_002354-erratum_002c-bp-request">CSTR&nbsp;#54 erratum, <code class="code">bp</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-CSTR-_002354-erratum_002c-po-request">CSTR&nbsp;#54 erratum, <code class="code">po</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Type-Size.html#index-CSTR-_002354-erratum_002c-ps-request">CSTR&nbsp;#54 erratum, <code class="code">ps</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Type-Size.html">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-CSTR-_002354-erratum_002c-sb-register">CSTR&nbsp;#54 erratum, <code class="code">sb</code> register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-CSTR-_002354-erratum_002c-st-register">CSTR&nbsp;#54 erratum, <code class="code">st</code> register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-CSTR-_002354-erratum_002c-yr-register">CSTR&nbsp;#54 erratum, <code class="code">yr</code> register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-CSTR-_002354-erratum_002c-_005cS-escape">CSTR&nbsp;#54 erratum, <code class="code">\S</code> escape</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Type-Size.html#index-CSTR-_002354-erratum_002c-_005cs-escape-sequence">CSTR&nbsp;#54 erratum, <code class="code">\s</code> escape sequence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Type-Size.html">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-current-directory">current directory</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-current-input-file-name-register-_0028_002eF_0029">current input file name register (<code class="code">.F</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-current-page-number-_0028_0025_0029">current page number (<code class="code">%</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-current-time_002c-hours-_0028hours_0029">current time, hours (<code class="code">hours</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-current-time_002c-minutes-_0028minutes_0029">current time, minutes (<code class="code">minutes</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-current-time_002c-seconds-_0028seconds_0029">current time, seconds (<code class="code">seconds</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-D">D</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-da-request_002c-and-dn-_0028dl_0029"><code class="code">da</code> request, and <code class="code">dn</code> (<code class="code">dl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-da-request_002c-and-warnings"><code class="code">da</code> request, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-da-request_002c-and-warnings-1"><code class="code">da</code> request, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-date_002c-day-of-the-month-register-_0028dy_0029">date, day of the month register (<code class="code">dy</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-date_002c-day-of-the-week-register-_0028dw_0029">date, day of the week register (<code class="code">dw</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-date_002c-month-of-the-year-register-_0028mo_0029">date, month of the year register (<code class="code">mo</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-date_002c-year-register-_0028year_002c-yr_0029">date, year register (<code class="code">year</code>, <code class="code">yr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-day-of-the-month-register-_0028dy_0029">day of the month register (<code class="code">dy</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-day-of-the-week-register-_0028dw_0029">day of the week register (<code class="code">dw</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Sentences.html#index-dd-glyph_002c-at-end-of-sentence"><code class="code">dd</code> glyph, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Sentences.html">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-dd-glyph_002c-at-end-of-sentence-1"><code class="code">dd</code> glyph, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="while.html#index-de-request_002c-and-while"><code class="code">de</code> request, and <code class="code">while</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="while.html">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-de_002c-de1_002c-dei-requests_002c-and-warnings"><code class="code">de</code>, <code class="code">de1</code>, <code class="code">dei</code> requests, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-debugging">debugging</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-debugging-page-location-traps">debugging page location traps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-decimal-point_002c-as-delimiter">decimal point, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Auto_002dincrement.html#index-decrementation_002c-automatic_002c-of-a-register">decrementation, automatic, of a register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Auto_002dincrement.html">Auto-increment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-default-color">default color</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-default-tab-stops">default tab stops</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Default-Units.html#index-default-units">default units</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Default-Units.html">Default Units</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Deferring-Output.html#index-deferred-output">deferred output</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Deferring-Output.html">Deferring Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-defining-character-_0028char_0029">defining character (<code class="code">char</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Classes.html#index-defining-character-class-_0028class_0029">defining character class (<code class="code">class</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Classes.html">Character Classes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-defining-fallback-character-_0028fchar_002c-fschar_002c-schar_0029">defining fallback character (<code class="code">fchar</code>, <code class="code">fschar</code>, <code class="code">schar</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-defining-glyph-_0028char_0029">defining glyph (<code class="code">char</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-defining-symbol-_0028char_0029">defining symbol (<code class="code">char</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Compatibility-Mode.html#index-delimited-arguments_002c-incompatibilities-with-AT_0026T-troff">delimited arguments, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Compatibility-Mode.html">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-delimiters_002c-for-escape-sequence-arguments">delimiters, for escape sequence arguments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Fields.html#index-delimiting-character_002c-for-fields-_0028fc_0029">delimiting character, for fields (<code class="code">fc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Fields.html">Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-delimiting-escape-sequence-arguments">delimiting escape sequence arguments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Calling-Macros.html#index-depth_002c-interpolation">depth, interpolation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Calling-Macros.html">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-depth_002c-of-last-glyph-_0028_002ecdp_0029">depth, of last glyph (<code class="code">.cdp</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-DESC-file-format"><samp class="file">DESC</samp> file format</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Positions.html#index-DESC-file_002c-and-font-mounting"><samp class="file">DESC</samp> file, and font mounting</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Positions.html">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Postprocessor-Access.html#index-DESC-file_002c-and-use_005fcharnames_005fin_005fspecial-keyword"><samp class="file">DESC</samp> file, and <code class="code">use_charnames_in_special</code> keyword</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Postprocessor-Access.html">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-description-file_002c-font">description file, font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-device-description-files_002c-comments">device description files, comments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Postprocessor-Access.html#index-device-request_002c-and-copy-mode"><code class="code">device</code> request, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Postprocessor-Access.html">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-device-resolution">device resolution</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-device-resolution-1">device resolution</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-device-resolution_002c-obtaining-in-the-formatter">device resolution, obtaining in the formatter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Output-Device-Intro.html#index-devices-for-output">devices for output</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Output-Device-Intro.html">Output Device Intro</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Sentences.html#index-dg-glyph_002c-at-end-of-sentence"><code class="code">dg</code> glyph, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Sentences.html">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-dg-glyph_002c-at-end-of-sentence-1"><code class="code">dg</code> glyph, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-di-request_002c-and-warnings"><code class="code">di</code> request, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-di-request_002c-and-warnings-1"><code class="code">di</code> request, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Implementation-Differences.html#index-differences-in-implementation">differences in implementation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Implementation-Differences.html">Implementation Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-digit_002dwidth-space-_0028_005c0_0029">digit-width space (<code class="code">\0</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-digits_002c-as-delimiters">digits, as delimiters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-dimensions_002c-line">dimensions, line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Directories.html#index-directories-for-fonts">directories for fonts</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Directories.html">Font Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-directories-for-macros">directories for macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-directory_002c-current">directory, current</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-directory_002c-for-tmac-files">directory, for tmac files</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-directory_002c-home">directory, home</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-directory_002c-platform_002dspecific">directory, platform-specific</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-directory_002c-site_002dlocal">directory, site-local</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Directories.html#index-directory_002c-site_002dlocal-1">directory, site-local</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Directories.html">Font Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-disabling-hyphenation-_0028_005c_0025_0029">disabling hyphenation (<code class="code">\%</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Escape-Sequences.html#index-disabling-_005c-_0028eo_0029">disabling <code class="code">\</code> (<code class="code">eo</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Escape-Sequences.html">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-discardable-horizontal-space">discardable horizontal space</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Displays-and-Keeps.html#index-displays">displays</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Displays-and-Keeps.html">Displays and Keeps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-keeps-and-displays.html#index-displays-_005bms_005d">displays [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-keeps-and-displays.html">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Footnotes.html#index-displays_002c-and-footnotes-_005bms_005d">displays, and footnotes [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Footnotes.html">ms Footnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-distance-to-next-vertical-position-trap-register-_0028_002et_0029">distance to next vertical position trap register (<code class="code">.t</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Deferring-Output.html#index-diversion">diversion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Deferring-Output.html">Deferring Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-diversion-name-register-_0028_002ez_0029">diversion name register (<code class="code">.z</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversion-Traps.html#index-diversion-trap_002c-setting-_0028dt_0029">diversion trap, setting (<code class="code">dt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversion-Traps.html">Diversion Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversion-Traps.html#index-diversion-traps">diversion traps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversion-Traps.html">Diversion Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-diversion_002c-appending-to-_0028da_002c-boxa_0029">diversion, appending to (<code class="code">da</code>, <code class="code">boxa</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-diversion_002c-beginning-_0028di_002c-box_0029">diversion, beginning (<code class="code">di</code>, <code class="code">box</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-diversion_002c-creating-alias-for-_0028als_0029">diversion, creating alias for (<code class="code">als</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-diversion_002c-ending-_0028di_002c-box_0029">diversion, ending (<code class="code">di</code>, <code class="code">box</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-diversion_002c-nested">diversion, nested</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-diversion_002c-removing-_0028rm_0029">diversion, removing (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-diversion_002c-removing-alias-for-_0028rm_0029">diversion, removing alias for (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-diversion_002c-renaming-_0028rn_0029">diversion, renaming (<code class="code">rn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Punning-Names.html#index-diversion_002c-stripping-final-newline">diversion, stripping final newline</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Punning-Names.html">Punning Names</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-diversion_002c-top_002dlevel">diversion, top-level</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-diversion_002c-top_002dlevel_002c-and-bp">diversion, top-level, and <code class="code">bp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-diversion_002c-top_002dlevel_002c-and-_005c_0021">diversion, top-level, and <code class="code">\!</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-diversion_002c-top_002dlevel_002c-and-_005c_003f">diversion, top-level, and <code class="code">\?</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-diversion_002c-unformatting-_0028asciify_0029">diversion, unformatting (<code class="code">asciify</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-diversion_002c-vertical-position-in_002c-register-_0028_002ed_0029">diversion, vertical position in, register (<code class="code">.d</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-diversions">diversions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Punning-Names.html#index-diversions-1">diversions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Punning-Names.html">Punning Names</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-diversions_002c-and-traps">diversions, and traps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Identifiers.html#index-diversions_002c-shared-name-space-with-macros-and-strings">diversions, shared name space with macros and strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Identifiers.html">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-division_002c-truncating">division, truncating</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-dl-register_002c-and-da-_0028boxa_0029"><code class="code">dl</code> register, and <code class="code">da</code> (<code class="code">boxa</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-dn-register_002c-and-da-_0028boxa_0029"><code class="code">dn</code> register, and <code class="code">da</code> (<code class="code">boxa</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Description-Macros.html#index-document-description-macros_002c-_005bms_005d">document description macros, [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Description-Macros.html">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Document-Formats.html#index-document-formats">document formats</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Document-Formats.html">Document Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-documents_002c-multi_002dfile">documents, multi-file</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Invoking-Requests.html#index-documents_002c-structuring-the-source-of">documents, structuring the source of</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Invoking-Requests.html">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-dot_002c-as-delimiter">dot, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Calling-Macros.html#index-double-quote_002c-embedding-in-a-macro-argument">double quote, embedding in a macro argument</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Calling-Macros.html">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-double-quotes_002c-trailing_002c-in-strings">double quotes, trailing, in strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Spacing.html#index-double_002dspacing-_0028ls_0029">double-spacing (<code class="code">ls</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Spacing.html">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Vertical-Spacing.html#index-double_002dspacing-_0028vs_002c-pvs_0029">double-spacing (<code class="code">vs</code>, <code class="code">pvs</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Vertical-Spacing.html">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-down_002dcasing-a-string-_0028stringdown_0029">down-casing a string (<code class="code">stringdown</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-drawing-a-filled-circle-_0028_005cD_0027C-_2026_0027_0029">drawing a filled circle (&lsquo;<samp class="samp">\D'C &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-drawing-a-filled-ellipse-_0028_005cD_0027E-_2026_0027_0029">drawing a filled ellipse (&lsquo;<samp class="samp">\D'E &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-drawing-a-filled-polygon-_0028_005cD_0027P-_2026_0027_0029">drawing a filled polygon (&lsquo;<samp class="samp">\D'P &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-drawing-a-line-_0028_005cD_0027l-_2026_0027_0029">drawing a line (&lsquo;<samp class="samp">\D'l &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-drawing-a-solid-circle-_0028_005cD_0027C-_2026_0027_0029">drawing a solid circle (&lsquo;<samp class="samp">\D'C &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-drawing-a-solid-ellipse-_0028_005cD_0027E-_2026_0027_0029">drawing a solid ellipse (&lsquo;<samp class="samp">\D'E &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-drawing-a-solid-polygon-_0028_005cD_0027P-_2026_0027_0029">drawing a solid polygon (&lsquo;<samp class="samp">\D'P &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-drawing-a-spline-_0028_005cD_0027_007e-_2026_0027_0029">drawing a spline (&lsquo;<samp class="samp">\D'~ &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-drawing-a-stroked-circle-_0028_005cD_0027c-_2026_0027_0029">drawing a stroked circle (&lsquo;<samp class="samp">\D'c &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-drawing-a-stroked-ellipse-_0028_005cD_0027e-_2026_0027_0029">drawing a stroked ellipse (&lsquo;<samp class="samp">\D'e &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-drawing-a-stroked-polygon-_0028_005cD_0027p-_2026_0027_0029">drawing a stroked polygon (&lsquo;<samp class="samp">\D'p &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-drawing-an-arc-_0028_005cD_0027a-_2026_0027_0029">drawing an arc (&lsquo;<samp class="samp">\D'a &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-drawing-an-outlined-circle-_0028_005cD_0027c-_2026_0027_0029">drawing an outlined circle (&lsquo;<samp class="samp">\D'c &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-drawing-an-outlined-ellipse-_0028_005cD_0027e-_2026_0027_0029">drawing an outlined ellipse (&lsquo;<samp class="samp">\D'e &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-drawing-an-outlined-polygon-_0028_005cD_0027p-_2026_0027_0029">drawing an outlined polygon (&lsquo;<samp class="samp">\D'p &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-drawing-horizontal-lines-_0028_005cl_0029">drawing horizontal lines (<code class="code">\l</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-drawing-position">drawing position</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-drawing-position_002c-vertical-_0028nl_0029">drawing position, vertical (<code class="code">nl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-drawing-requests">drawing requests</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-drawing-vertical-lines-_0028_005cL_0029">drawing vertical lines (<code class="code">\L</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-ds-request_002c-and-comments"><code class="code">ds</code> request, and comments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-ds-request_002c-and-double-quotes"><code class="code">ds</code> request, and double quotes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-ds-request_002c-and-leading-spaces"><code class="code">ds</code> request, and leading spaces</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Comments.html#index-ds_002c-ds1-requests_002c-and-comments"><code class="code">ds</code>, <code class="code">ds1</code> requests, and comments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Comments.html">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-ds_002c-ds1-requests_002c-and-warnings"><code class="code">ds</code>, <code class="code">ds1</code> requests, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Dummy-Characters.html#index-dummy-character-_0028_005c_0026_0029">dummy character (<code class="code">\&amp;</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Dummy-Characters.html">Dummy Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Requests-and-Macros.html#index-dummy-character-_0028_005c_0026_0029_002c-as-control-character-suppressor">dummy character (<code class="code">\&amp;</code>), as control character suppressor</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Requests-and-Macros.html">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Ligatures-and-Kerning.html#index-dummy-character-_0028_005c_0026_0029_002c-effect-on-kerning">dummy character (<code class="code">\&amp;</code>), effect on kerning</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Ligatures-and-Kerning.html">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-dummy-character-_0028_005c_0026_0029_002c-effect-on-_005cl-escape-sequence">dummy character (<code class="code">\&amp;</code>), effect on <code class="code">\l</code> escape sequence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Dummy-Characters.html#index-dummy-character_002c-transparent-_0028_005c_0029_0029">dummy character, transparent (<code class="code">\)</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Dummy-Characters.html">Dummy Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-dummy-environment_002c-used-by-_005cw-escape-sequence">dummy environment, used by <code class="code">\w</code> escape sequence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-dumping-environments-_0028pev_0029">dumping environments (<code class="code">pev</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-dumping-page-location-traps-_0028ptr_0029">dumping page location traps (<code class="code">ptr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-dumping-registers-_0028pnr_0029">dumping registers (<code class="code">pnr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-dumping-symbol-table-_0028pm_0029">dumping symbol table (<code class="code">pm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-E">E</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-EBCDIC-output-encoding"><abbr class="acronym">EBCDIC</abbr> output encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-EBCDIC_002c-input-encoding"><abbr class="acronym">EBCDIC</abbr>, input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-ejection_002c-page">ejection, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-ejection_002c-page-1">ejection, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="The-Implicit-Page-Trap.html#index-ejection_002c-page-2">ejection, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="The-Implicit-Page-Trap.html">The Implicit Page Trap</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="End_002dof_002dinput-Traps.html#index-ejection_002c-page_002c-of-final-page">ejection, page, of final page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="End_002dof_002dinput-Traps.html">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Vertical-Position-Traps.html#index-ejection_002c-page_002c-prevented-by-vpt">ejection, page, prevented by <code class="code">vpt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Vertical-Position-Traps.html">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-el-request_002c-and-warnings"><code class="code">el</code> request, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-ellipse_002c-filled_002c-drawing-_0028_005cD_0027E-_2026_0027_0029">ellipse, filled, drawing (&lsquo;<samp class="samp">\D'E &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-ellipse_002c-outlined_002c-drawing-_0028_005cD_0027e-_2026_0027_0029">ellipse, outlined, drawing (&lsquo;<samp class="samp">\D'e &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-ellipse_002c-solid_002c-drawing-_0028_005cD_0027E-_2026_0027_0029">ellipse, solid, drawing (&lsquo;<samp class="samp">\D'E &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-ellipse_002c-stroked_002c-drawing-_0028_005cD_0027e-_2026_0027_0029">ellipse, stroked, drawing (&lsquo;<samp class="samp">\D'e &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-em-glyph_002c-and-cflags"><code class="code">em</code> glyph, and <code class="code">cflags</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-em-scaling-unit-_0028m_0029">em scaling unit (<code class="code">m</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-embolding-of-special-fonts">embolding of special fonts</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Breaking.html#index-empty-line">empty line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Breaking.html">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-en-scaling-unit-_0028n_0029">en scaling unit (<code class="code">n</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Vertical-Position-Traps.html#index-enabling-vertical-position-traps-_0028vpt_0029">enabling vertical position traps (<code class="code">vpt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Vertical-Position-Traps.html">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-encoding_002c-input_002c-code-page-1047">encoding, input, code page 1047</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-encoding_002c-input_002c-EBCDIC">encoding, input, <abbr class="acronym">EBCDIC</abbr></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-encoding_002c-input_002c-Latin_002d1-_0028ISO-8859_002d1_0029">encoding, input, <span class="w-nolinebreak-text">Latin-1</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-1</span><!-- /@w -->)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-encoding_002c-input_002c-Latin_002d2-_0028ISO-8859_002d2_0029">encoding, input, <span class="w-nolinebreak-text">Latin-2</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-2</span><!-- /@w -->)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-encoding_002c-input_002c-Latin_002d5-_0028ISO-8859_002d9_0029">encoding, input, <span class="w-nolinebreak-text">Latin-5</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-9</span><!-- /@w -->)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-encoding_002c-input_002c-Latin_002d9-_0028ISO-8859_002d15_0029">encoding, input, <span class="w-nolinebreak-text">Latin-9</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-15</span><!-- /@w -->)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-encoding_002c-output_002c-ASCII">encoding, output, <abbr class="acronym">ASCII</abbr></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-encoding_002c-output_002c-code-page-1047">encoding, output, code page 1047</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-encoding_002c-output_002c-EBCDIC">encoding, output, <abbr class="acronym">EBCDIC</abbr></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-encoding_002c-output_002c-ISO-646">encoding, output, ISO&nbsp;646</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-encoding_002c-output_002c-Latin_002d1-_0028ISO-8859_002d1_0029">encoding, output, <span class="w-nolinebreak-text">Latin-1</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-1</span><!-- /@w -->)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-encoding_002c-output_002c-UTF_002d8">encoding, output, <span class="w-nolinebreak-text">UTF-8</span><!-- /@w --></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Conditional-Blocks.html#index-end-of-conditional-block-_0028_005c_007d_0029">end of conditional block (<code class="code">\}</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Conditional-Blocks.html">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="End_002dof_002dinput-Traps.html#index-end_002dof_002dinput-macro-_0028em_0029">end-of-input macro (<code class="code">em</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="End_002dof_002dinput-Traps.html">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="End_002dof_002dinput-Traps.html#index-end_002dof_002dinput-trap_002c-setting-_0028em_0029">end-of-input trap, setting (<code class="code">em</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="End_002dof_002dinput-Traps.html">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="End_002dof_002dinput-Traps.html#index-end_002dof_002dinput-traps">end-of-input traps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="End_002dof_002dinput-Traps.html">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Sentences.html#index-end_002dof_002dsentence-characters">end-of-sentence characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Sentences.html">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-end_002dof_002dsentence-characters-1">end-of-sentence characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Sentences.html#index-end_002dof_002dsentence-transparent-characters">end-of-sentence transparent characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Sentences.html">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-ending-diversion-_0028di_002c-box_0029">ending diversion (<code class="code">di</code>, <code class="code">box</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Footnotes-and-Endnotes.html#index-endnotes">endnotes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Footnotes-and-Endnotes.html">Footnotes and Endnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Deferring-Output.html#index-environment">environment</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Deferring-Output.html">Deferring Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-environment-availability-and-naming_002c-incompatibilities-with">environment availability and naming, incompatibilities with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-environment-number_002fname-register-_0028_002eev_0029">environment number/name register (<code class="code">.ev</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environment.html#index-environment-variables">environment variables</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environment.html">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-environment_002c-copying-_0028evc_0029">environment, copying (<code class="code">evc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-environment_002c-dimensions-of-last-glyph-_0028_002ew_002c-_002echt_002c-_002ecdp_002c-_002ecsk_0029">environment, dimensions of last glyph (<code class="code">.w</code>, <code class="code">.cht</code>, <code class="code">.cdp</code>, <code class="code">.csk</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-environment_002c-dummy_002c-used-by-_005cw-escape-sequence">environment, dummy, used by <code class="code">\w</code> escape sequence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-environment_002c-previous-line-length-_0028_002en_0029">environment, previous line length (<code class="code">.n</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-environment_002c-switching-_0028ev_0029">environment, switching (<code class="code">ev</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-environments">environments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-environments_002c-dumping-_0028pev_0029">environments, dumping (<code class="code">pev</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-equality-operator">equality operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-equation-example-_005bms_005d">equation example [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-equations-_005bms_005d">equations [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Escape-Sequences.html#index-escape-character_002c-changing-_0028ec_0029">escape character, changing (<code class="code">ec</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Escape-Sequences.html">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Escape-Sequences.html#index-escape-character_002c-formatting-_0028_005ce_0029">escape character, formatting (<code class="code">\e</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Escape-Sequences.html">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-escape-character_002c-while-defining-glyph">escape character, while defining glyph</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Formatter-Instructions.html#index-escape-sequence">escape sequence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Formatter-Instructions.html">Formatter Instructions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-escape-sequence-argument-delimiters">escape sequence argument delimiters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Escape-Sequences.html#index-escape-sequences">escape sequences</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Escape-Sequences.html">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Conditional-Blocks.html#index-escape-sequences_002c-brace-_0028_005c_007b_002c-_005c_007d_0029">escape sequences, brace (<code class="code">\{</code>, <code class="code">\}</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Conditional-Blocks.html">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-escaping-newline-characters_002c-in-strings">escaping newline characters, in strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-ex-request_002c-use-in-debugging"><code class="code">ex</code> request, use in debugging</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-ex-request_002c-used-with-nx-and-rd"><code class="code">ex</code> request, used with <code class="code">nx</code> and <code class="code">rd</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Lists-in-ms.html#index-example-markup_002c-bulleted-list-_005bms_005d">example markup, bulleted list [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Lists-in-ms.html">Lists in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Description-Macros.html#index-example-markup_002c-cover-page-in-_005bms_005d">example markup, cover page in [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Description-Macros.html">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Lists-in-ms.html#index-example-markup_002c-glossary_002dstyle-list-_005bms_005d">example markup, glossary-style list [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Lists-in-ms.html">Lists in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Lists-in-ms.html#index-example-markup_002c-numbered-list-_005bms_005d">example markup, numbered list [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Lists-in-ms.html">Lists in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Invocation-Examples.html#index-examples-of-invocation">examples of invocation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Invocation-Examples.html">Invocation Examples</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-exiting-_0028ex_0029">exiting (<code class="code">ex</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-expansion-of-strings-_0028_005c_002a_0029">expansion of strings (<code class="code">\*</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-explicit-hyphen-_0028_005c_0025_0029">explicit hyphen (<code class="code">\%</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-explicit-hyphenation">explicit hyphenation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-expression_002c-limitation-of-logical-not-in">expression, limitation of logical not in</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-expression_002c-order-of-evaluation">expression, order of evaluation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Assigning-Register-Formats.html#index-expressions_002c-and-register-format">expressions, and register format</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Assigning-Register-Formats.html">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-expressions_002c-and-space-characters">expressions, and space characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Operators-in-Conditionals.html#index-expressions_002c-conditional">expressions, conditional</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Operators-in-Conditionals.html">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-expressions_002c-numeric">expressions, numeric</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Vertical-Spacing.html#index-extra-post_002dvertical-line-space-_0028_005cx_0029">extra post-vertical line space (<code class="code">\x</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Vertical-Spacing.html">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Spacing.html#index-extra-post_002dvertical-line-space-register-_0028_002ea_0029">extra post-vertical line space register (<code class="code">.a</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Spacing.html">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Vertical-Spacing.html#index-extra-pre_002dvertical-line-space-_0028_005cx_0029">extra pre-vertical line space (<code class="code">\x</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Vertical-Spacing.html">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Adjustment.html#index-extra-spaces-between-words">extra spaces between words</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Adjustment.html">Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Assigning-Register-Formats.html#index-extreme-values-representable-with-Roman-numerals">extreme values representable with Roman numerals</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Assigning-Register-Formats.html">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-extremum-operators-_0028_003e_003f_002c-_003c_003f_0029">extremum operators (<code class="code">&gt;?</code>, <code class="code">&lt;?</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-F">F</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-f-scaling-unit"><code class="code">f</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-factor_002c-zoom_002c-of-a-font-_0028fzoom_0029">factor, zoom, of a font (<code class="code">fzoom</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-fallback-character_002c-defining-_0028fchar_002c-fschar_002c-schar_0029">fallback character, defining (<code class="code">fchar</code>, <code class="code">fschar</code>, <code class="code">schar</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-fallback-glyph_002c-removing-definition-_0028rchar_002c-rfschar_0029">fallback glyph, removing definition (<code class="code">rchar</code>, <code class="code">rfschar</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-fam-request_002c-and-changing-fonts"><code class="code">fam</code> request, and changing fonts</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-families_002c-font">families, font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-family_002c-font">family, font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Common-Features.html#index-features_002c-common">features, common</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Common-Features.html">Common Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-fi-request_002c-causing-implicit-break"><code class="code">fi</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Fields.html#index-field-delimiting-character-_0028fc_0029">field delimiting character (<code class="code">fc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Fields.html">Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Fields.html#index-field-padding-character-_0028fc_0029">field padding character (<code class="code">fc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Fields.html">Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Fields.html#index-fields">fields</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Fields.html">Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-fields_002c-and-tabs">fields, and tabs</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-figure-space-_0028_005c0_0029">figure space (<code class="code">\0</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-figures-_005bms_005d">figures [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="File-Formats.html#index-file-formats">file formats</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="File-Formats.html">File Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-file-names_002c-breaking-_0028_005c_003a_0029">file names, breaking (<code class="code">\:</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-file_002c-appending-to-_0028opena_0029">file, appending to (<code class="code">opena</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-file_002c-closing-_0028close_0029">file, closing (<code class="code">close</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-file_002c-font-description">file, font description</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-file_002c-inclusion-_0028so_0029">file, inclusion (<code class="code">so</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-file_002c-macro_002c-search-path">file, macro, search path</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-file_002c-opening-_0028open_0029">file, opening (<code class="code">open</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-file_002c-processing-next-_0028nx_0029">file, processing next (<code class="code">nx</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-file_002c-writing-to-_0028write_002c-writec_0029">file, writing to (<code class="code">write</code>, <code class="code">writec</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Device-and-Font-Description-Files.html#index-files_002c-font">files, font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Device-and-Font-Description-Files.html">Device and Font Description Files</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-fill-color">fill color</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-fill-color-name-register-_0028_002eM_0029">fill color name register (<code class="code">.M</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-fill-mode-_0028fi_0029_002c-enabling">fill mode (<code class="code">fi</code>), enabling</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-fill-mode_002c-and-_005cc">fill mode, and <code class="code">\c</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-fill-mode_002c-disabling">fill mode, disabling</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-filled-circle_002c-drawing-_0028_005cD_0027C-_2026_0027_0029">filled circle, drawing (&lsquo;<samp class="samp">\D'C &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-filled-ellipse_002c-drawing-_0028_005cD_0027E-_2026_0027_0029">filled ellipse, drawing (&lsquo;<samp class="samp">\D'E &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-filled-polygon_002c-drawing-_0028_005cD_0027P-_2026_0027_0029">filled polygon, drawing (&lsquo;<samp class="samp">\D'P &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Filling.html#index-filling">filling</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Filling.html">Filling</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-filling-and-adjustment_002c-manipulating">filling and adjustment, manipulating</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-filling-of-output_002c-disabling-_0028nf_0029">filling of output, disabling (<code class="code">nf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-filling-of-output_002c-enabling-_0028fi_0029">filling of output, enabling (<code class="code">fi</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-filling_002c-and-break-warnings">filling, and <code class="code">break</code> warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-filling_002c-and-inter_002dsentence-space">filling, and inter-sentence space</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Punning-Names.html#index-final-newline_002c-stripping-in-diversions">final newline, stripping in diversions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Punning-Names.html">Punning Names</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-fl-request_002c-causing-implicit-break"><code class="code">fl</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Displays-and-Keeps.html#index-floating-keep">floating keep</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Displays-and-Keeps.html">Displays and Keeps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-flush-output-_0028fl_0029">flush output (<code class="code">fl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-font">font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Positions.html#index-font-aliasing-with-third-argument-to-fp-request">font aliasing with third argument to <code class="code">fp</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Positions.html">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-font-description-file">font description file</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-font-description-file-format">font description file format</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-font-description-file_002c-format">font description file, format</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-font-description-files_002c-comments">font description files, comments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Directories.html#index-font-directories">font directories</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Directories.html">Font Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-font-families">font families</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-font-family">font family</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-font-family_002c-changing-_0028fam_002c-_005cF_0029">font family, changing (<code class="code">fam</code>, <code class="code">\F</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-font-file_002c-format">font file, format</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Device-and-Font-Description-Files.html#index-font-files">font files</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Device-and-Font-Description-Files.html">Device and Font Description Files</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-font-for-underlining-_0028uf_0029">font for underlining (<code class="code">uf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-font-height_002c-changing-_0028_005cH_0029">font height, changing (<code class="code">\H</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-font-metrics">font metrics</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-font-mounting_002c-automatic">font mounting, automatic</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Directories.html#index-font-path">font path</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Directories.html">Font Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Positions.html#index-font-position-register-_0028_002ef_0029">font position register (<code class="code">.f</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Positions.html">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Positions.html#index-font-positions">font positions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Positions.html">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-font-slant_002c-changing-_0028_005cS_0029">font slant, changing (<code class="code">\S</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-font-style">font style</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-font-style_002c-abstract">font style, abstract</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-font-style_002c-abstract_002c-setting-up-_0028sty_0029">font style, abstract, setting up (<code class="code">sty</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-font-styles">font styles</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-font-translation-_0028ftr_0029">font translation (<code class="code">ftr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-font_002c-magnification-_0028fzoom_0029">font, magnification (<code class="code">fzoom</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Positions.html#index-font_002c-mounting-_0028fp_0029">font, mounting (<code class="code">fp</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Positions.html">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-font_002c-optical-size">font, optical size</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-font_002c-previous_002c-selecting-_0028_005cf_005b_005d_002c-_005cfP_0029">font, previous, selecting (<code class="code">\f[]</code>, <code class="code">\fP</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-font_002c-previous_002c-slecting-_0028ft_0029">font, previous, slecting (<code class="code">ft</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-font_002c-selection">font, selection</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-font_002c-special">font, special</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-font_002c-text">font, text</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-font_002c-unstyled">font, unstyled</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-font_002c-zoom-factor-_0028fzoom_0029">font, zoom factor (<code class="code">fzoom</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-fonts_002c-artificial">fonts, artificial</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-fonts_002c-changing-_0028ft_002c-_005cf_0029">fonts, changing (<code class="code">ft</code>, <code class="code">\f</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Directories.html#index-fonts_002c-searching">fonts, searching</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Directories.html">Font Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Special-Fonts.html#index-fonts_002c-special">fonts, special</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Special-Fonts.html">Special Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-footers">footers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-footers-1">footers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Headers-and-Footers.html#index-footers-_005bms_005d">footers [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Headers-and-Footers.html">ms Headers and Footers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Footnotes.html#index-footnote-marker-_005bms_005d">footnote marker [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Footnotes.html">ms Footnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Footnotes-and-Endnotes.html#index-footnotes">footnotes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Footnotes-and-Endnotes.html">Footnotes and Endnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Footnotes.html#index-footnotes-_005bms_005d">footnotes [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Footnotes.html">ms Footnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Footnotes.html#index-footnotes_002c-and-displays-_005bms_005d">footnotes, and displays [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Footnotes.html">ms Footnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Footnotes.html#index-footnotes_002c-and-keeps-_005bms_005d">footnotes, and keeps [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Footnotes.html">ms Footnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-form-letters">form letters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-format-of-font-description-file">format of font description file</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-format-of-font-description-files">format of font description files</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-format-of-font-files">format of font files</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Assigning-Register-Formats.html#index-format-of-register-_0028_005cg_0029">format of register (<code class="code">\g</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Assigning-Register-Formats.html">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Paper-Format.html#index-format_002c-paper">format, paper</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Paper-Format.html">Paper Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="File-Formats.html#index-formats_002c-file">formats, file</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="File-Formats.html">File Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Formatter-Instructions.html#index-formatter-instructions">formatter instructions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Formatter-Instructions.html">Formatter Instructions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Escape-Sequences.html#index-formatting-a-backslash-glyph-_0028_005c_005brs_005d_0029">formatting a backslash glyph (<code class="code">\[rs]</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Escape-Sequences.html">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-formatting-a-title-line-_0028tl_0029">formatting a title line (<code class="code">tl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Escape-Sequences.html#index-formatting-the-escape-character-_0028_005ce_0029">formatting the escape character (<code class="code">\e</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Escape-Sequences.html">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-formatting-the-time">formatting the time</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-fp-request_002c-and-font-translations"><code class="code">fp</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-fp-request_002c-incompatibilities-with-AT_0026T-troff"><code class="code">fp</code> request, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-fractional-point-sizes">fractional point sizes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-fractional-point-sizes-1">fractional point sizes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-fractional-type-sizes">fractional type sizes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-fractional-type-sizes-1">fractional type sizes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Differences-from-AT_0026T-ms.html#index-fractional-type-sizes-in-ms-macros">fractional type sizes in <samp class="file">ms</samp> macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Differences-from-AT_0026T-ms.html">Differences from AT&amp;T ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Sentences.html#index-French-spacing">French spacing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Sentences.html">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-fspecial-request_002c-and-font-styles"><code class="code">fspecial</code> request, and font styles</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-fspecial-request_002c-and-font-translations"><code class="code">fspecial</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-fspecial-request_002c-and-glyph-search-order"><code class="code">fspecial</code> request, and glyph search order</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-fspecial-request_002c-and-imitating-bold"><code class="code">fspecial</code> request, and imitating bold</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-ft-request_002c-and-font-translations"><code class="code">ft</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Major-Macro-Packages.html#index-full_002dservice-macro-package">full-service macro package</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Major-Macro-Packages.html">Major Macro Packages</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-G">G</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-geometry_002c-page">geometry, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-GGL-_0028groff-glyph-list_0029">GGL (<code class="code">groff</code> glyph list)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Classes.html#index-GGL-_0028groff-glyph-list_0029-1">GGL (<code class="code">groff</code> glyph list)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Classes.html">Character Classes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Lists-in-ms.html#index-glossary_002dstyle-list_002c-example-markup-_005bms_005d">glossary-style list, example markup [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Lists-in-ms.html">Lists in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-glyph">glyph</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-glyph-for-line-drawing">glyph for line drawing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-glyph-names_002c-composite">glyph names, composite</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-glyph-pile-_0028_005cb_0029">glyph pile (<code class="code">\b</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-glyph-properties-_0028cflags_0029">glyph properties (<code class="code">cflags</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-glyph_002c-box-rule-_0028_005c_005bbr_005d_0029">glyph, box rule (<code class="code">\[br]</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-glyph_002c-constant-space">glyph, constant space</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-glyph_002c-defining-_0028char_0029">glyph, defining (<code class="code">char</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-glyph_002c-distinguished-from-character">glyph, distinguished from character</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-glyph_002c-for-line-drawing">glyph, for line drawing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-glyph_002c-for-margins-_0028mc_0029">glyph, for margins (<code class="code">mc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-glyph_002c-last_002c-dimensions-_0028_002ew_002c-_002echt_002c-_002ecdp_002c-_002ecsk_0029">glyph, last, dimensions (<code class="code">.w</code>, <code class="code">.cht</code>, <code class="code">.cdp</code>, <code class="code">.csk</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Leaders.html#index-glyph_002c-leader-repetition-_0028lc_0029">glyph, leader repetition (<code class="code">lc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Leaders.html">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-glyph_002c-numbered-_0028_005cN_0029">glyph, numbered (<code class="code">\N</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-glyph_002c-numbered-_0028_005cN_0029-1">glyph, numbered (<code class="code">\N</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-glyph_002c-removing-definition-_0028rchar_002c-rfschar_0029">glyph, removing definition (<code class="code">rchar</code>, <code class="code">rfschar</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-glyph_002c-soft-hyphen-_0028hy_0029">glyph, soft hyphen (<code class="code">hy</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-glyph_002c-tab-repetition-_0028tc_0029">glyph, tab repetition (<code class="code">tc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-glyph_002c-underscore-_0028_005c_005bru_005d_0029">glyph, underscore (<code class="code">\[ru]</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-glyphs_002c-available_002c-list-of-_0028groff_005fchar_00287_0029-man-page_0029">glyphs, available, list of (<cite class="cite">groff_char<span class="r">(7)</span></cite> man page)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-glyphs_002c-output_002c-and-input-characters_002c-compatibility-with-AT_0026T-troff">glyphs, output, and input characters, compatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-glyphs_002c-overstriking-_0028_005co_0029">glyphs, overstriking (<code class="code">\o</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-glyphs_002c-unnamed">glyphs, unnamed</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-glyphs_002c-unnamed_002c-accessing-with-_005cN">glyphs, unnamed, accessing with <code class="code">\N</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-GNU-troff_002c-identification-register-_0028_002eg_0029">GNU <code class="code">troff</code>, identification register (<code class="code">.g</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-GNU-troff_002c-PID-register-_0028_0024_0024_0029">GNU <code class="code">troff</code>, PID register (<code class="code">$$</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-GNU-troff_002c-process-ID-register-_0028_0024_0024_0029">GNU <code class="code">troff</code>, process ID register (<code class="code">$$</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-GNU_002dspecific-register-_0028_002eg_0029">GNU-specific register (<code class="code">.g</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-graphic-renditions">graphic renditions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-greater-than-_0028or-equal-to_0029-operator">greater than (or equal to) operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="groff-Capabilities.html#index-groff-capabilities"><code class="code">groff</code> capabilities</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="groff-Capabilities.html"><code class="code">groff</code> Capabilities</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-groff-glyph-list-_0028GGL_0029"><code class="code">groff</code> glyph list (GGL)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Classes.html#index-groff-glyph-list-_0028GGL_0029-1"><code class="code">groff</code> glyph list (GGL)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Classes.html">Character Classes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Invoking-groff.html#index-groff-invocation"><code class="code">groff</code> invocation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Invoking-groff.html">Invoking groff</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-groff_002c-and-pi-request"><code class="code">groff</code>, and <code class="code">pi</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="What-Is-groff_003f.html#index-groff_002d_002d_002dwhat-is-it_003f"><code class="code">groff</code>&mdash;what is it?</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="What-Is-groff_003f.html">What Is <code class="code">groff</code>?</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environment.html#index-GROFF_005fBIN_005fPATH_002c-environment-variable"><code>GROFF_BIN_PATH<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environment.html">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environment.html#index-GROFF_005fCOMMAND_005fPREFIX_002c-environment-variable"><code>GROFF_COMMAND_PREFIX<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environment.html">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environment.html#index-GROFF_005fENCODING_002c-environment-variable"><code>GROFF_ENCODING<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environment.html">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environment.html#index-GROFF_005fFONT_005fPATH_002c-environment-variable"><code>GROFF_FONT_PATH<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environment.html">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Directories.html#index-GROFF_005fFONT_005fPATH_002c-environment-variable-1"><code>GROFF_FONT_PATH<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Directories.html">Font Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environment.html#index-GROFF_005fTMAC_005fPATH_002c-environment-variable"><code>GROFF_TMAC_PATH<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environment.html">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-GROFF_005fTMAC_005fPATH_002c-environment-variable-1"><code>GROFF_TMAC_PATH<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environment.html#index-GROFF_005fTMPDIR_002c-environment-variable"><code>GROFF_TMPDIR<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environment.html">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environment.html#index-GROFF_005fTYPESETTER_002c-environment-variable"><code>GROFF_TYPESETTER<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environment.html">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-grohtml_002c-the-program"><code class="code">grohtml</code>, the program</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-gtroff_002c-interactive-use"><code class="code">gtroff</code>, interactive use</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="gtroff-Output.html#index-gtroff_002c-output"><code class="code">gtroff</code>, output</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="gtroff-Output.html">gtroff Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="GNU-troff-Reference.html#index-gtroff_002c-reference"><code class="code">gtroff</code>, reference</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="GNU-troff-Reference.html">GNU troff Reference</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-H">H</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-hair-space-_0028_005c_005e_0029">hair space (<code class="code">\^</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-hcode-request_002c-and-glyph-definitions"><code class="code">hcode</code> request, and glyph definitions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-headers">headers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-headers-1">headers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Headers-and-Footers.html#index-headers-_005bms_005d">headers [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Headers-and-Footers.html">ms Headers and Footers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-height_002c-font_002c-changing-_0028_005cH_0029">height, font, changing (<code class="code">\H</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-height_002c-of-last-glyph-_0028_002echt_0029">height, of last glyph (<code class="code">.cht</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-high_002dwater-mark-register-_0028_002eh_0029">high-water mark register (<code class="code">.h</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-home-directory">home directory</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-horizontal-discardable-space">horizontal discardable space</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-horizontal-input-line-position-register-_0028hp_0029">horizontal input line position register (<code class="code">hp</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-horizontal-input-line-position_002c-saving-_0028_005ck_0029">horizontal input line position, saving (<code class="code">\k</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-horizontal-line_002c-drawing-_0028_005cl_0029">horizontal line, drawing (<code class="code">\l</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-horizontal-motion-_0028_005ch_0029">horizontal motion (<code class="code">\h</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-horizontal-motion-quantum">horizontal motion quantum</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Motion-Quanta.html#index-horizontal-motion-quantum-register-_0028_002eH_0029">horizontal motion quantum register (<code class="code">.H</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Motion-Quanta.html">Motion Quanta</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-horizontal-output-line-position-register-_0028_002ek_0029">horizontal output line position register (<code class="code">.k</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-horizontal-resolution">horizontal resolution</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Motion-Quanta.html#index-horizontal-resolution-register-_0028_002eH_0029">horizontal resolution register (<code class="code">.H</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Motion-Quanta.html">Motion Quanta</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-horizontal-space-_0028_005ch_0029">horizontal space (<code class="code">\h</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Punning-Names.html#index-horizontal-space_002c-unformatting">horizontal space, unformatting</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Punning-Names.html">Punning Names</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Leaders.html#index-horizontal-tab-character">horizontal tab character</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Leaders.html">Tabs and Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-hours_002c-current-time-_0028hours_0029">hours, current time (<code class="code">hours</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hpf-request_002c-and-hyphenation-language"><code class="code">hpf</code> request, and hyphenation language</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hw-request_002c-and-hy-restrictions"><code class="code">hw</code> request, and <code class="code">hy</code> restrictions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hw-request_002c-and-hyphenation-language"><code class="code">hw</code> request, and hyphenation language</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-hy-glyph_002c-and-cflags"><code class="code">hy</code> glyph, and <code class="code">cflags</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphen_002c-explicit-_0028_005c_0025_0029">hyphen, explicit (<code class="code">\%</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphenated-lines_002c-consecutive-_0028hlm_0029">hyphenated lines, consecutive (<code class="code">hlm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-hyphenating-characters">hyphenating characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Hyphenation.html#index-hyphenation">hyphenation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Hyphenation.html">Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphenation-character-_0028_005c_0025_0029">hyphenation character (<code class="code">\%</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphenation-code-_0028hcode_0029">hyphenation code (<code class="code">hcode</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphenation-consecutive-line-count-register-_0028_002ehlc_0029">hyphenation consecutive line count register (<code class="code">.hlc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphenation-consecutive-line-limit-register-_0028_002ehlm_0029">hyphenation consecutive line limit register (<code class="code">.hlm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphenation-exceptions">hyphenation exceptions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphenation-language-register-_0028_002ehla_0029">hyphenation language register (<code class="code">.hla</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphenation-margin-_0028hym_0029">hyphenation margin (<code class="code">hym</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphenation-margin-register-_0028_002ehym_0029">hyphenation margin register (<code class="code">.hym</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphenation-mode-register-_0028_002ehy_0029">hyphenation mode register (<code class="code">.hy</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphenation-parameters_002c-automatic">hyphenation parameters, automatic</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphenation-pattern-files">hyphenation pattern files</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphenation-patterns-_0028hpf_0029">hyphenation patterns (<code class="code">hpf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphenation-space-_0028hys_0029">hyphenation space (<code class="code">hys</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphenation-space-adjustment-threshold">hyphenation space adjustment threshold</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphenation-space-adjustment-threshold-register-_0028_002ehys_0029">hyphenation space adjustment threshold register (<code class="code">.hys</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphenation_002c-automatic">hyphenation, automatic</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphenation_002c-disabling-_0028_005c_0025_0029">hyphenation, disabling (<code class="code">\%</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphenation_002c-explicit">hyphenation, explicit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-hyphenation_002c-incompatibilities-with-AT_0026T-troff">hyphenation, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphenation_002c-manipulating">hyphenation, manipulating</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hyphenation_002c-manual">hyphenation, manual</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-I">I</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-i-scaling-unit"><code class="code">i</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-i_002fo">i/o</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-IBM-code-page-1047-input-encoding">IBM code page 1047 input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-IBM-code-page-1047-output-encoding">IBM code page 1047 output encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Identifiers.html#index-identifiers">identifiers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Identifiers.html">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Identifiers.html#index-identifiers_002c-undefined">identifiers, undefined</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Identifiers.html">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-ie-request_002c-and-font-translations"><code class="code">ie</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-ie-request_002c-and-warnings"><code class="code">ie</code> request, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Operators-in-Conditionals.html#index-ie-request_002c-operators-to-use-with"><code class="code">ie</code> request, operators to use with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Operators-in-Conditionals.html">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-if-request_002c-and-font-translations"><code class="code">if</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-if-request_002c-and-the-_0021-operator"><code class="code">if</code> request, and the &lsquo;<samp class="samp">!</samp>&rsquo; operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Operators-in-Conditionals.html#index-if-request_002c-operators-to-use-with"><code class="code">if</code> request, operators to use with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Operators-in-Conditionals.html">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="if_002delse.html#index-if_002delse">if-else</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="if_002delse.html">if-else</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="if_002dthen.html#index-if_002dthen">if-then</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="if_002dthen.html">if-then</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-imitating-boldface-_0028bd_0029">imitating boldface (<code class="code">bd</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Implementation-Differences.html#index-implementation-differences">implementation differences</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Implementation-Differences.html">Implementation Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Breaking.html#index-implicit-line-break">implicit line break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Breaking.html">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="The-Implicit-Page-Trap.html#index-implicit-trap">implicit trap</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="The-Implicit-Page-Trap.html">The Implicit Page Trap</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-in-request_002c-causing-implicit-break"><code class="code">in</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-in-request_002c-using-_002b-and-_002d-with"><code class="code">in</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-inch-scaling-unit-_0028i_0029">inch scaling unit (<code class="code">i</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-including-a-file-_0028so_0029">including a file (<code class="code">so</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Implementation-Differences.html#index-incompatibilities-with-AT_0026T-troff">incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Implementation-Differences.html">Implementation Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Auto_002dincrement.html#index-increment-value-without-changing-the-register">increment value without changing the register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Auto_002dincrement.html">Auto-increment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Auto_002dincrement.html#index-incrementation_002c-automatic_002c-of-a-register">incrementation, automatic, of a register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Auto_002dincrement.html">Auto-increment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-indentation-_0028in_0029">indentation (<code class="code">in</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Invoking-Requests.html#index-indentation_002c-of-roff-source-code">indentation, of <code class="code">roff</code> source code</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Invoking-Requests.html">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Indexing.html#index-index_002c-in-macro-package">index, in macro package</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Indexing.html">Indexing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-indicator_002c-scaling">indicator, scaling</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Interpolating-Registers.html#index-indirect-assignments">indirect assignments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Interpolating-Registers.html">Interpolating Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-input-and-output-requests">input and output requests</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-input-characters-and-output-glyphs_002c-compatibility-with-AT_0026T-troff">input characters and output glyphs, compatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Identifiers.html#index-input-characters_002c-invalid">input characters, invalid</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Identifiers.html">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Conventions.html#index-input-conventions">input conventions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Conventions.html">Input Conventions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-input-encoding_002c-code-page-1047">input encoding, code page 1047</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-input-encoding_002c-EBCDIC">input encoding, <abbr class="acronym">EBCDIC</abbr></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-input-encoding_002c-Latin_002d1-_0028ISO-8859_002d1_0029">input encoding, <span class="w-nolinebreak-text">Latin-1</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-1</span><!-- /@w -->)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-input-encoding_002c-Latin_002d2-_0028ISO-8859_002d2_0029">input encoding, <span class="w-nolinebreak-text">Latin-2</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-2</span><!-- /@w -->)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-input-encoding_002c-Latin_002d5-_0028ISO-8859_002d9_0029">input encoding, <span class="w-nolinebreak-text">Latin-5</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-9</span><!-- /@w -->)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-input-encoding_002c-Latin_002d9-_0028ISO-8859_002d15_0029">input encoding, <span class="w-nolinebreak-text">Latin-9</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-15</span><!-- /@w -->)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-input-file-name_002c-current_002c-register-_0028_002eF_0029">input file name, current, register (<code class="code">.F</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Calling-Macros.html#index-input-level">input level</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Calling-Macros.html">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Compatibility-Mode.html#index-input-level-in-delimited-arguments">input level in delimited arguments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Compatibility-Mode.html">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-input-line-continuation-_0028_005cRET_0029">input line continuation (<code class="code">\<kbd class="key">RET</kbd></code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-input-line-number-register-_0028_002ec_002c-c_002e_0029">input line number register (<code class="code">.c</code>, <code class="code">c.</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-input-line-number_002c-setting-_0028lf_0029">input line number, setting (<code class="code">lf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-input-line-position_002c-horizontal_002c-saving-_0028_005ck_0029">input line position, horizontal, saving (<code class="code">\k</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Line-Traps.html#index-input-line-trap_002c-clearing-_0028it_002c-itc_0029">input line trap, clearing (<code class="code">it</code>, <code class="code">itc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Line-Traps.html">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Line-Traps.html#index-input-line-trap_002c-setting-_0028it_002c-itc_0029">input line trap, setting (<code class="code">it</code>, <code class="code">itc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Line-Traps.html">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Line-Traps.html#index-input-line-traps">input line traps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Line-Traps.html">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Line-Traps.html#index-input-line-traps-and-interrupted-lines-_0028itc_0029">input line traps and interrupted lines (<code class="code">itc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Line-Traps.html">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-input-line_002c-horizontal-position_002c-register-_0028hp_0029">input line, horizontal position, register (<code class="code">hp</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-input-line_002c-productive">input line, productive</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-input-stack_002c-backtrace-_0028backtrace_0029">input stack, backtrace (<code class="code">backtrace</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-input-stack_002c-setting-limit">input stack, setting limit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Gtroff-Internals.html#index-input-token">input token</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Gtroff-Internals.html">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-input_002c-8_002dbit">input, 8-bit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-input_002c-standard_002c-reading-from-_0028rd_0029">input, standard, reading from (<code class="code">rd</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-inserting-horizontal-space-_0028_005ch_0029">inserting horizontal space (<code class="code">\h</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Installation.html#index-installation">installation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Installation.html">Installation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Formatter-Instructions.html#index-instructing-the-formatter">instructing the formatter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Formatter-Instructions.html">Formatter Instructions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-inter_002dsentence-space-size-register-_0028_002esss_0029">inter-sentence space size register (<code class="code">.sss</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-inter_002dsentence-space_002c-additional">inter-sentence space, additional</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-inter_002dword-spacing_002c-minimal">inter-word spacing, minimal</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-interactive-use-of-gtroff">interactive use of <code class="code">gtroff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Control-Characters.html#index-intercepting-requests">intercepting requests</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Control-Characters.html">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="gtroff-Output.html#index-intermediate-output">intermediate output</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="gtroff-Output.html">gtroff Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Interpolating-Registers.html#index-interpolating-registers-_0028_005cn_0029">interpolating registers (<code class="code">\n</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Interpolating-Registers.html">Interpolating Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Requests-and-Macros.html#index-interpolation">interpolation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Requests-and-Macros.html">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Calling-Macros.html#index-interpolation-depth">interpolation depth</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Calling-Macros.html">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Compatibility-Mode.html#index-interpolation-depth-in-delimited-arguments">interpolation depth in delimited arguments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Compatibility-Mode.html">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-interpolation-of-strings-_0028_005c_002a_0029">interpolation of strings (<code class="code">\*</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Copy-Mode.html#index-interpretation-mode">interpretation mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Copy-Mode.html">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-interrupted-line">interrupted line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-interrupted-line-register-_0028_002eint_0029">interrupted line register (<code class="code">.int</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Line-Traps.html#index-interrupted-lines-and-input-line-traps-_0028itc_0029">interrupted lines and input line traps (<code class="code">itc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Line-Traps.html">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Introduction.html#index-introduction">introduction</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Introduction.html">Introduction</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-invalid-characters-for-trf-request">invalid characters for <code class="code">trf</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Identifiers.html#index-invalid-input-characters">invalid input characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Identifiers.html">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Invocation-Examples.html#index-invocation-examples">invocation examples</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Invocation-Examples.html">Invocation Examples</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Invoking-groff.html#index-invoking-groff">invoking <code class="code">groff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Invoking-groff.html">Invoking groff</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Invoking-Requests.html#index-invoking-requests">invoking requests</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Invoking-Requests.html">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-ISO-646-output-encoding">ISO&nbsp;646 output encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-ISO-8859_002d1-_0028Latin_002d1_0029-output-encoding">ISO <span class="w-nolinebreak-text">8859-1</span><!-- /@w --> (<span class="w-nolinebreak-text">Latin-1</span><!-- /@w -->) output encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-ISO-8859_002d1-_0028Latin_002d1_0029_002c-input-encoding">ISO <span class="w-nolinebreak-text">8859-1</span><!-- /@w --> (<span class="w-nolinebreak-text">Latin-1</span><!-- /@w -->), input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-ISO-8859_002d15-_0028Latin_002d9_0029_002c-input-encoding">ISO <span class="w-nolinebreak-text">8859-15</span><!-- /@w --> (<span class="w-nolinebreak-text">Latin-9</span><!-- /@w -->), input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-ISO-8859_002d2-_0028Latin_002d2_0029_002c-input-encoding">ISO <span class="w-nolinebreak-text">8859-2</span><!-- /@w --> (<span class="w-nolinebreak-text">Latin-2</span><!-- /@w -->), input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-ISO-8859_002d9-_0028Latin_002d5_0029_002c-input-encoding">ISO <span class="w-nolinebreak-text">8859-9</span><!-- /@w --> (<span class="w-nolinebreak-text">Latin-5</span><!-- /@w -->), input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Italic-Corrections.html#index-italic-correction-_0028_005c_002f_0029">italic correction (<code class="code">\/</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Italic-Corrections.html">Italic Corrections</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-J">J</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-justifying-text">justifying text</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-justifying-text-_0028rj_0029">justifying text (<code class="code">rj</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-K">K</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Displays-and-Keeps.html#index-keep_002c-floating">keep, floating</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Displays-and-Keeps.html">Displays and Keeps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Displays-and-Keeps.html#index-keeps-_0028introduction_0029">keeps (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Displays-and-Keeps.html">Displays and Keeps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-keeps-and-displays.html#index-keeps-_005bms_005d">keeps [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-keeps-and-displays.html">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Footnotes.html#index-keeps_002c-and-footnotes-_005bms_005d">keeps, and footnotes [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Footnotes.html">ms Footnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Ligatures-and-Kerning.html#index-kerning-and-ligatures">kerning and ligatures</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Ligatures-and-Kerning.html">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Ligatures-and-Kerning.html#index-kerning-enabled-register-_0028_002ekern_0029">kerning enabled register (<code class="code">.kern</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Ligatures-and-Kerning.html">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Ligatures-and-Kerning.html#index-kerning_002c-activating-_0028kern_0029">kerning, activating (<code class="code">kern</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Ligatures-and-Kerning.html">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Ligatures-and-Kerning.html#index-kerning_002c-track">kerning, track</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Ligatures-and-Kerning.html">Ligatures and Kerning</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-L">L</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Paper-Format.html#index-landscape-page-orientation">landscape page orientation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Paper-Format.html">Paper Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-language-and-localization.html#index-language-_005bms_005d">language [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-language-and-localization.html">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-last-glyph_002c-dimensions-_0028_002ew_002c-_002echt_002c-_002ecdp_002c-_002ecsk_0029">last glyph, dimensions (<code class="code">.w</code>, <code class="code">.cht</code>, <code class="code">.cdp</code>, <code class="code">.csk</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-last_002drequested-point-size-registers-_0028_002epsr_002c-_002esr_0029">last-requested point size registers (<code class="code">.psr</code>, <code class="code">.sr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-last_002drequested-type-size-registers-_0028_002epsr_002c-_002esr_0029">last-requested type size registers (<code class="code">.psr</code>, <code class="code">.sr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-Latin_002d1-_0028ISO-8859_002d1_0029-output-encoding"><span class="w-nolinebreak-text">Latin-1</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-1</span><!-- /@w -->) output encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-Latin_002d1-_0028ISO-8859_002d1_0029_002c-input-encoding"><span class="w-nolinebreak-text">Latin-1</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-1</span><!-- /@w -->), input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-Latin_002d2-_0028ISO-8859_002d2_0029_002c-input-encoding"><span class="w-nolinebreak-text">Latin-2</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-2</span><!-- /@w -->), input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-Latin_002d5-_0028ISO-8859_002d9_0029_002c-input-encoding"><span class="w-nolinebreak-text">Latin-5</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-9</span><!-- /@w -->), input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-Latin_002d9-_0028ISO-8859_002d15_0029_002c-input-encoding"><span class="w-nolinebreak-text">Latin-9</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-15</span><!-- /@w -->), input encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-layout_002c-line">layout, line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-layout_002c-page">layout, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-lc-request_002c-and-glyph-definitions"><code class="code">lc</code> request, and glyph definitions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Leaders.html#index-leader-character">leader character</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Leaders.html">Tabs and Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Leaders.html#index-leader-character-1">leader character</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Leaders.html">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-leader-character_002c-and-translations">leader character, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Leaders.html#index-leader-character_002c-non_002dinterpreted-_0028_005ca_0029">leader character, non-interpreted (<code class="code">\a</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Leaders.html">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Leaders.html#index-leader-repetition-character-_0028lc_0029">leader repetition character (<code class="code">lc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Leaders.html">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Leaders.html#index-leaders">leaders</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Leaders.html">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Type-Size-and-Vertical-Spacing.html#index-leading">leading</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Type-Size-and-Vertical-Spacing.html">Manipulating Type Size and Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Breaking.html#index-leading-space-macro-_0028lsm_0029">leading space macro (<code class="code">lsm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Breaking.html">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Leading-Space-Traps.html#index-leading-space-traps">leading space traps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Leading-Space-Traps.html">Leading Space Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Breaking.html#index-leading-spaces">leading spaces</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Breaking.html">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Leading-Space-Traps.html#index-leading-spaces-macro-_0028lsm_0029">leading spaces macro (<code class="code">lsm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Leading-Space-Traps.html">Leading Space Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-leading-spaces-with-ds">leading spaces with <code class="code">ds</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Italic-Corrections.html#index-left-italic-correction-_0028_005c_002c_0029">left italic correction (<code class="code">\,</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Italic-Corrections.html">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-left-margin-_0028po_0029">left margin (<code class="code">po</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-length-of-a-string-_0028length_0029">length of a string (<code class="code">length</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-length-of-line-_0028ll_0029">length of line (<code class="code">ll</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-length-of-previous-line-_0028_002en_0029">length of previous line (<code class="code">.n</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-length-of-the-page_002c-configuring-_0028pl_0029">length of the page, configuring (<code class="code">pl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-length-of-title-line_002c-configuring-_0028lt_0029">length of title line, configuring (<code class="code">lt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-length-request_002c-and-copy-mode"><code class="code">length</code> request, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-less-than-_0028or-equal-to_0029-operator">less than (or equal to) operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-letters_002c-form">letters, form</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Calling-Macros.html#index-level_002c-input">level, input</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Calling-Macros.html">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Suppressing-Output.html#index-level_002c-suppression-nesting_002c-register">level, suppression nesting, register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Suppressing-Output.html">Suppressing Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-lf-request_002c-incompatibilities-with-AT_0026T-troff"><code class="code">lf</code> request, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-ligature">ligature</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Ligatures-and-Kerning.html#index-ligatures-and-kerning">ligatures and kerning</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Ligatures-and-Kerning.html">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Ligatures-and-Kerning.html#index-ligatures-enabled-register-_0028_002elg_0029">ligatures enabled register (<code class="code">.lg</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Ligatures-and-Kerning.html">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Ligatures-and-Kerning.html#index-ligatures_002c-activating-_0028lg_0029">ligatures, activating (<code class="code">lg</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Ligatures-and-Kerning.html">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-limitations-of-_005cb-escape-sequence">limitations of <code class="code">\b</code> escape sequence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-line-break">line break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Basics.html#index-line-break-_0028introduction_0029">line break (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Basics.html">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Breaking.html#index-line-break_002c-output">line break, output</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Breaking.html">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-line-control">line control</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-line-dimensions">line dimensions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-line-drawing-glyph">line drawing glyph</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-line-drawing-glyph-1">line drawing glyph</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-line-indentation-_0028in_0029">line indentation (<code class="code">in</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-line-layout">line layout</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-line-length-_0028ll_0029">line length (<code class="code">ll</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-line-length-register-_0028_002el_0029">line length register (<code class="code">.l</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-line-length_002c-previous-_0028_002en_0029">line length, previous (<code class="code">.n</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-line-number_002c-input_002c-register-_0028_002ec_002c-c_002e_0029">line number, input, register (<code class="code">.c</code>, <code class="code">c.</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-line-number_002c-output_002c-register-_0028ln_0029">line number, output, register (<code class="code">ln</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-line-numbers_002c-printing-_0028nm_0029">line numbers, printing (<code class="code">nm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Vertical-Spacing.html#index-line-space_002c-extra-post_002dvertical-_0028_005cx_0029">line space, extra post-vertical (<code class="code">\x</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Vertical-Spacing.html">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Vertical-Spacing.html#index-line-space_002c-extra-pre_002dvertical-_0028_005cx_0029">line space, extra pre-vertical (<code class="code">\x</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Vertical-Spacing.html">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Spacing.html#index-line-spacing-register-_0028_002eL_0029">line spacing register (<code class="code">.L</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Spacing.html">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Vertical-Spacing.html#index-line-spacing_002c-post_002dvertical-_0028pvs_0029">line spacing, post-vertical (<code class="code">pvs</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Vertical-Spacing.html">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-line-thickness-_0028_005cD_0027t-_2026_0027_0029">line thickness (&lsquo;<samp class="samp">\D't &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Breaking.html#index-line_002c-blank">line, blank</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Breaking.html">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-line_002c-drawing-_0028_005cD_0027l-_2026_0027_0029">line, drawing (&lsquo;<samp class="samp">\D'l &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-line_002c-horizontal_002c-drawing-_0028_005cl_0029">line, horizontal, drawing (<code class="code">\l</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-line_002c-input_002c-continuation-_0028_005cRET_0029">line, input, continuation (<code class="code">\<kbd class="key">RET</kbd></code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-line_002c-input_002c-horizontal-position_002c-register-_0028hp_0029">line, input, horizontal position, register (<code class="code">hp</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-line_002c-input_002c-horizontal-position_002c-saving-_0028_005ck_0029">line, input, horizontal position, saving (<code class="code">\k</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-line_002c-interrupted">line, interrupted</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-line_002c-output_002c-continuation-_0028_005cc_0029">line, output, continuation (<code class="code">\c</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-line_002c-output_002c-horizontal-position_002c-register-_0028_002ek_0029">line, output, horizontal position, register (<code class="code">.k</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-line_002c-productive-input">line, productive input</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-line_002c-vertical_002c-drawing-_0028_005cL_0029">line, vertical, drawing (<code class="code">\L</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-line_002dtabs-mode">line-tabs mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Spacing.html#index-lines_002c-blank_002c-disabling">lines, blank, disabling</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Spacing.html">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-lines_002c-centering-_0028ce_0029">lines, centering (<code class="code">ce</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Basics.html#index-lines_002c-centering-_0028introduction_0029">lines, centering (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Basics.html">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-lines_002c-consecutive-hyphenated-_0028hlm_0029">lines, consecutive hyphenated (<code class="code">hlm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Line-Traps.html#index-lines_002c-interrupted_002c-and-input-line-traps-_0028itc_0029">lines, interrupted, and input line traps (<code class="code">itc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Line-Traps.html">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Basics.html#index-lines_002c-right_002daligning-_0028introduction_0029">lines, right-aligning (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Basics.html">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Basics.html#index-lines_002c-right_002djustifying-_0028introduction_0029">lines, right-justifying (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Basics.html">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-list-of-special-characters-_0028groff_005fchar_00287_0029-man-page_0029">list of special characters (<cite class="cite">groff_char<span class="r">(7)</span></cite> man page)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-listing-page-location-traps-_0028ptr_0029">listing page location traps (<code class="code">ptr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Paragraphs.html#index-lists">lists</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Paragraphs.html">Paragraphs</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-ll-request_002c-using-_002b-and-_002d-with"><code class="code">ll</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-localization">localization</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-language-and-localization.html#index-localization-_005bms_005d">localization [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-language-and-localization.html">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-locating-macro-files">locating macro files</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-locating-macro-packages">locating macro packages</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-location_002c-vertical_002c-page_002c-marking-_0028mk_0029">location, vertical, page, marking (<code class="code">mk</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-location_002c-vertical_002c-page_002c-returning-to-marked-_0028rt_0029">location, vertical, page, returning to marked (<code class="code">rt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-logical-_0060_0060and_0027_0027-operator">logical &ldquo;and&rdquo; operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-logical-_0060_0060or_0027_0027-operator">logical &ldquo;or&rdquo; operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-logical-complementation-operator">logical complementation operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-logical-conjunction-operator">logical conjunction operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-logical-disjunction-operator">logical disjunction operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-logical-not_002c-limitation-in-expression">logical not, limitation in expression</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-logical-operators">logical operators</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Compatibility-Mode.html#index-long-names">long names</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Compatibility-Mode.html">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Conditionals-and-Loops.html#index-loops-and-conditionals">loops and conditionals</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Conditionals-and-Loops.html">Conditionals and Loops</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-lowercasing-a-string-_0028stringdown_0029">lowercasing a string (<code class="code">stringdown</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Vertical-Spacing.html#index-ls-request_002c-alternative-to-_0028pvs_0029"><code class="code">ls</code> request, alternative to (<code class="code">pvs</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Vertical-Spacing.html">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-lt-request_002c-using-_002b-and-_002d-with"><code class="code">lt</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-M">M</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-m-scaling-unit"><code class="code">m</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-M-scaling-unit"><code class="code">M</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-machine-units">machine units</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Requests-and-Macros.html#index-macro">macro</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Requests-and-Macros.html">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Calling-Macros.html#index-macro-arguments">macro arguments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Calling-Macros.html">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Gtroff-Internals.html#index-macro-arguments_002c-and-compatibility-mode">macro arguments, and compatibility mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Gtroff-Internals.html">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Invoking-Requests.html#index-macro-arguments_002c-and-tabs">macro arguments, and tabs</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Invoking-Requests.html">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-macro-directories">macro directories</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-macro-file-search-path">macro file search path</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Parameters.html#index-macro-name-register-_0028_005c_00240_0029">macro name register (<code class="code">\$0</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Parameters.html">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Identifiers.html#index-macro-names_002c-starting-with-_005b-or-_005d_002c-and-refer">macro names, starting with <code class="code">[</code> or <code class="code">]</code>, and <code class="code">refer</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Identifiers.html">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Packages.html#index-macro-package">macro package</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Packages.html">Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-macro-package-search-path">macro package search path</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Basics.html#index-macro-package-usage_002c-basics-of">macro package usage, basics of</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Basics.html">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Major-Macro-Packages.html#index-macro-package_002c-auxiliary">macro package, auxiliary</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Major-Macro-Packages.html">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Major-Macro-Packages.html#index-macro-package_002c-full_002dservice">macro package, full-service</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Major-Macro-Packages.html">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Package-Intro.html#index-macro-package_002c-introduction">macro package, introduction</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Package-Intro.html">Macro Package Intro</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Major-Macro-Packages.html#index-macro-package_002c-major">macro package, major</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Major-Macro-Packages.html">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Major-Macro-Packages.html#index-macro-package_002c-minor">macro package, minor</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Major-Macro-Packages.html">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Invoking-Requests.html#index-macro-package_002c-structuring-the-source-of">macro package, structuring the source of</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Invoking-Requests.html">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Writing-Macros.html#index-macro_002c-appending-to-_0028am_0029">macro, appending to (<code class="code">am</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Writing-Macros.html">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-macro_002c-creating-alias-for-_0028als_0029">macro, creating alias for (<code class="code">als</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="End_002dof_002dinput-Traps.html#index-macro_002c-end_002dof_002dinput-_0028em_0029">macro, end-of-input (<code class="code">em</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="End_002dof_002dinput-Traps.html">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Parameters.html#index-macro_002c-parameters-_0028_005c_0024_0029">macro, parameters (<code class="code">\$</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Parameters.html">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-macro_002c-removing-_0028rm_0029">macro, removing (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-macro_002c-removing-alias-for-_0028rm_0029">macro, removing alias for (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-macro_002c-renaming-_0028rn_0029">macro, renaming (<code class="code">rn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="while.html#index-macros_002c-recursive">macros, recursive</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="while.html">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-macros_002c-searching">macros, searching</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Identifiers.html#index-macros_002c-shared-name-space-with-strings-and-diversions">macros, shared name space with strings and diversions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Identifiers.html">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tutorial-for-Macro-Users.html#index-macros_002c-tutorial-for-users">macros, tutorial for users</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tutorial-for-Macro-Users.html">Tutorial for Macro Users</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Writing-Macros.html#index-macros_002c-writing">macros, writing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Writing-Macros.html">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-magnification-of-a-font-_0028fzoom_0029">magnification of a font (<code class="code">fzoom</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Major-Macro-Packages.html#index-major-macro-package">major macro package</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Major-Macro-Packages.html">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-major-version-number-register-_0028_002ex_0029">major version number register (<code class="code">.x</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-man-macros_002c-custom-headers-and-footers"><code class="code">man</code> macros, custom headers and footers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-man-macros_002c-Ultrix_002dspecific"><code class="code">man</code> macros, Ultrix-specific</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="man.html#index-man-pages">man pages</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="man.html">man</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-manipulating-filling-and-adjustment">manipulating filling and adjustment</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-manipulating-hyphenation">manipulating hyphenation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Spacing.html#index-manipulating-spacing">manipulating spacing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Spacing.html">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Type-Size-and-Vertical-Spacing.html#index-manipulating-type-size-and-vertical-spacing">manipulating type size and vertical spacing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Type-Size-and-Vertical-Spacing.html">Manipulating Type Size and Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-manual-hyphenation">manual hyphenation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="man.html#index-manual-pages">manual pages</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="man.html">man</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-margin-for-hyphenation-_0028hym_0029">margin for hyphenation (<code class="code">hym</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-margin-glyph-_0028mc_0029">margin glyph (<code class="code">mc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-margin_002c-bottom">margin, bottom</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-margin_002c-left-_0028po_0029">margin, left (<code class="code">po</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-margin_002c-right">margin, right</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-margin_002c-top">margin, top</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-mark_002c-high_002dwater_002c-register-_0028_002eh_0029">mark, high-water, register (<code class="code">.h</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Footnotes.html#index-marker_002c-footnote-_005bms_005d">marker, footnote [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Footnotes.html">ms Footnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-marking-vertical-page-location-_0028mk_0029">marking vertical page location (<code class="code">mk</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-maximum-operator">maximum operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Assigning-Register-Formats.html#index-maximum-value-representable-with-Roman-numerals">maximum value representable with Roman numerals</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Assigning-Register-Formats.html">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="mdoc.html#index-mdoc-macros"><code class="code">mdoc</code> macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="mdoc.html">mdoc</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="me.html#index-me-macro-package"><code class="code">me</code> macro package</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="me.html">me</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-measurement-units">measurement units</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-measurements">measurements</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Default-Units.html#index-measurements_002c-specifying-safely">measurements, specifying safely</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Default-Units.html">Default Units</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-metrics_002c-font">metrics, font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-minimal-inter_002dword-spacing">minimal inter-word spacing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-minimum-operator">minimum operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Assigning-Register-Formats.html#index-minimum-value-representable-with-Roman-numerals">minimum value representable with Roman numerals</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Assigning-Register-Formats.html">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Major-Macro-Packages.html#index-minor-macro-package">minor macro package</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Major-Macro-Packages.html">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-minor-version-number-register-_0028_002ey_0029">minor version number register (<code class="code">.y</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-minutes_002c-current-time-_0028minutes_0029">minutes, current time (<code class="code">minutes</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="mm.html#index-mm-macro-package"><code class="code">mm</code> macro package</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="mm.html">mm</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-mode-for-constant-glyph-space-_0028cs_0029">mode for constant glyph space (<code class="code">cs</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Compatibility-Mode.html#index-mode_002c-compatibility">mode, compatibility</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Compatibility-Mode.html">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Gtroff-Internals.html#index-mode_002c-compatibility_002c-and-parameters">mode, compatibility, and parameters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Gtroff-Internals.html">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Copy-Mode.html#index-mode_002c-copy">mode, copy</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Copy-Mode.html">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Copy-Mode.html#index-mode_002c-copy-1">mode, copy</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Copy-Mode.html">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-mode_002c-copy_002c-and-cf-request">mode, copy, and <code class="code">cf</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Postprocessor-Access.html#index-mode_002c-copy_002c-and-device-request">mode, copy, and <code class="code">device</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Postprocessor-Access.html">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-mode_002c-copy_002c-and-length-request">mode, copy, and <code class="code">length</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Parameters.html#index-mode_002c-copy_002c-and-macro-parameters">mode, copy, and macro parameters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Parameters.html">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-mode_002c-copy_002c-and-output-request">mode, copy, and <code class="code">output</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-mode_002c-copy_002c-and-trf-request">mode, copy, and <code class="code">trf</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-mode_002c-copy_002c-and-write-request">mode, copy, and <code class="code">write</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-mode_002c-copy_002c-and-writec-request">mode, copy, and <code class="code">writec</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-mode_002c-copy_002c-and-writem-request">mode, copy, and <code class="code">writem</code> request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-mode_002c-copy_002c-and-_005c_0021">mode, copy, and <code class="code">\!</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Operators-in-Conditionals.html#index-mode_002c-copy_002c-and-_005c_003f">mode, copy, and <code class="code">\?</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Operators-in-Conditionals.html">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-mode_002c-copy_002c-and-_005c_003f-1">mode, copy, and <code class="code">\?</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Leaders.html#index-mode_002c-copy_002c-and-_005ca">mode, copy, and <code class="code">\a</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Leaders.html">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-mode_002c-copy_002c-and-_005ct">mode, copy, and <code class="code">\t</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-mode_002c-copy_002c-and-_005cV">mode, copy, and <code class="code">\V</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-mode_002c-fill-_0028fi_0029_002c-enabling">mode, fill (<code class="code">fi</code>), enabling</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-mode_002c-fill_002c-and-break-warnings">mode, fill, and <code class="code">break</code> warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-mode_002c-fill_002c-and-inter_002dsentence-space">mode, fill, and inter-sentence space</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-mode_002c-fill_002c-and-_005cc">mode, fill, and <code class="code">\c</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-mode_002c-fill_002c-disabling">mode, fill, disabling</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Copy-Mode.html#index-mode_002c-interpretation">mode, interpretation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Copy-Mode.html">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-mode_002c-line_002dtabs">mode, line-tabs</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-mode_002c-no_002dfill">mode, no-fill</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-mode_002c-no_002dfill_002c-and-_005cc">mode, no-fill, and <code class="code">\c</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Spacing.html#index-mode_002c-no_002dspace-_0028ns_0029">mode, no-space (<code class="code">ns</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Spacing.html">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="troff-and-nroff-Modes.html#index-mode_002c-nroff">mode, <code class="code">nroff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="troff-and-nroff-Modes.html"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-mode_002c-safer">mode, safer</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-mode_002c-safer-1">mode, safer</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-mode_002c-safer-2">mode, safer</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-mode_002c-safer-3">mode, safer</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-mode_002c-safer-4">mode, safer</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-mode_002c-safer-5">mode, safer</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-mode_002c-safer-6">mode, safer</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Safer-Mode.html#index-mode_002c-safer-7">mode, safer</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Safer-Mode.html">Safer Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="troff-and-nroff-Modes.html#index-mode_002c-troff">mode, <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="troff-and-nroff-Modes.html"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-mode_002c-unsafe">mode, unsafe</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-mode_002c-unsafe-1">mode, unsafe</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-mode_002c-unsafe-2">mode, unsafe</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-mode_002c-unsafe-3">mode, unsafe</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-mode_002c-unsafe-4">mode, unsafe</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-mode_002c-unsafe-5">mode, unsafe</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-mode_002c-unsafe-6">mode, unsafe</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Control-Characters.html#index-modifying-requests">modifying requests</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Control-Characters.html">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-modulus">modulus</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="mom.html#index-mom-macro-package"><code class="code">mom</code> macro package</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="mom.html">mom</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-month-of-the-year-register-_0028mo_0029">month of the year register (<code class="code">mo</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-motion-operators">motion operators</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Motion-Quanta.html#index-motion-quanta">motion quanta</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Motion-Quanta.html">Motion Quanta</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-motion-quantum_002c-horizontal">motion quantum, horizontal</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Motion-Quanta.html#index-motion-quantum_002c-horizontal_002c-register-_0028_002eH_0029">motion quantum, horizontal, register (<code class="code">.H</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Motion-Quanta.html">Motion Quanta</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-motion-quantum_002c-vertical">motion quantum, vertical</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-motion_002c-horizontal-_0028_005ch_0029">motion, horizontal (<code class="code">\h</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-motion_002c-vertical-_0028_005cv_0029">motion, vertical (<code class="code">\v</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-motions_002c-page">motions, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Positions.html#index-mounting-a-font-_0028fp_0029">mounting a font (<code class="code">fp</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Positions.html">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-mounting-position">mounting position</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-mounting-position-1">mounting position</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-mounting_002c-font_002c-automatic">mounting, font, automatic</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms.html#index-ms-macros"><samp class="file">ms</samp> macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms.html">ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-ms-macros_002c-accent-marks"><samp class="file">ms</samp> macros, accent marks</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Body-Text.html#index-ms-macros_002c-body-text"><samp class="file">ms</samp> macros, body text</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Body-Text.html">ms Body Text</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-TOC.html#index-ms-macros_002c-creating-table-of-contents"><samp class="file">ms</samp> macros, creating table of contents</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-TOC.html">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-keeps-and-displays.html#index-ms-macros_002c-displays"><samp class="file">ms</samp> macros, displays</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-keeps-and-displays.html">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-ms-macros_002c-document-control-settings"><samp class="file">ms</samp> macros, document control settings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Description-Macros.html#index-ms-macros_002c-document-description"><samp class="file">ms</samp> macros, document description</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Description-Macros.html">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-ms-macros_002c-equations"><samp class="file">ms</samp> macros, equations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-ms-macros_002c-figures"><samp class="file">ms</samp> macros, figures</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Headers-and-Footers.html#index-ms-macros_002c-footers"><samp class="file">ms</samp> macros, footers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Headers-and-Footers.html">ms Headers and Footers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Footnotes.html#index-ms-macros_002c-footnotes"><samp class="file">ms</samp> macros, footnotes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Footnotes.html">ms Footnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Differences-from-AT_0026T-ms.html#index-ms-macros_002c-fractional-type-sizes-in"><samp class="file">ms</samp> macros, fractional type sizes in</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Differences-from-AT_0026T-ms.html">Differences from AT&amp;T ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Structure.html#index-ms-macros_002c-general-structure"><samp class="file">ms</samp> macros, general structure</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Structure.html">ms Document Structure</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Differences-from-AT_0026T-ms.html#index-ms-macros_002c-groff-differences-from-AT_0026T"><samp class="file">ms</samp> macros, <code class="code">groff</code> differences from <abbr class="acronym">AT&amp;T</abbr></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Differences-from-AT_0026T-ms.html">Differences from AT&amp;T ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Headers-and-Footers.html#index-ms-macros_002c-headers"><samp class="file">ms</samp> macros, headers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Headers-and-Footers.html">ms Headers and Footers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Headings-in-ms.html#index-ms-macros_002c-headings"><samp class="file">ms</samp> macros, headings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Headings-in-ms.html">Headings in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-keeps-and-displays.html#index-ms-macros_002c-keeps"><samp class="file">ms</samp> macros, keeps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-keeps-and-displays.html">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-language-and-localization.html#index-ms-macros_002c-language"><samp class="file">ms</samp> macros, language</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-language-and-localization.html">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Lists-in-ms.html#index-ms-macros_002c-lists"><samp class="file">ms</samp> macros, lists</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Lists-in-ms.html">Lists in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-language-and-localization.html#index-ms-macros_002c-localization"><samp class="file">ms</samp> macros, localization</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-language-and-localization.html">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Margins.html#index-ms-macros_002c-margins"><samp class="file">ms</samp> macros, margins</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Margins.html">ms Margins</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Multiple-Columns.html#index-ms-macros_002c-multiple-columns"><samp class="file">ms</samp> macros, multiple columns</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Multiple-Columns.html">ms Multiple Columns</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Naming-Conventions.html#index-ms-macros_002c-naming-conventions"><samp class="file">ms</samp> macros, naming conventions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Naming-Conventions.html">ms Naming Conventions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Indented-regions-in-ms.html#index-ms-macros_002c-nested-lists"><samp class="file">ms</samp> macros, nested lists</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Indented-regions-in-ms.html">Indented regions in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Typographical-symbols-in-ms.html#index-ms-macros_002c-obtaining-typographical-symbols"><samp class="file">ms</samp> macros, obtaining typographical symbols</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Typographical-symbols-in-ms.html">Typographical symbols in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Page-Layout.html#index-ms-macros_002c-page-layout"><samp class="file">ms</samp> macros, page layout</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Page-Layout.html">ms Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Paragraphs-in-ms.html#index-ms-macros_002c-paragraph-handling"><samp class="file">ms</samp> macros, paragraph handling</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Paragraphs-in-ms.html">Paragraphs in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-ms-macros_002c-references"><samp class="file">ms</samp> macros, references</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-ms-macros_002c-special-characters"><samp class="file">ms</samp> macros, special characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-ms-macros_002c-strings"><samp class="file">ms</samp> macros, strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-ms-macros_002c-tables"><samp class="file">ms</samp> macros, tables</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Text-settings-in-ms.html#index-ms-macros_002c-text-settings"><samp class="file">ms</samp> macros, text settings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Text-settings-in-ms.html">Text settings in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-multi_002dfile-documents">multi-file documents</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-multi_002dline-strings">multi-line strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-multi_002dpage-table-example-_005bms_005d">multi-page table example [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Multiple-Columns.html#index-multiple-columns-_005bms_005d">multiple columns [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Multiple-Columns.html">ms Multiple Columns</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-multiplication">multiplication</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-N">N</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-n-scaling-unit"><code class="code">n</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Identifiers.html#index-name-space_002c-common_002c-of-macros_002c-diversions_002c-and-strings">name space, common, of macros, diversions, and strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Identifiers.html">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-name_002c-background-color_002c-register-_0028_002eM_0029">name, background color, register (<code class="code">.M</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-name_002c-fill-color_002c-register-_0028_002eM_0029">name, fill color, register (<code class="code">.M</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-name_002c-stroke-color_002c-register-_0028_002em_0029">name, stroke color, register (<code class="code">.m</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-named-character-_0028_005cC_0029">named character (<code class="code">\C</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Compatibility-Mode.html#index-names_002c-long">names, long</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Compatibility-Mode.html">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Naming-Conventions.html#index-naming-conventions_002c-ms-macros">naming conventions, <samp class="file">ms</samp> macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Naming-Conventions.html">ms Naming Conventions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-ne-request_002c-and-the-_002etrunc-register"><code class="code">ne</code> request, and the <code class="code">.trunc</code> register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-ne-request_002c-comparison-with-sv"><code class="code">ne</code> request, comparison with <code class="code">sv</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Setting-Registers.html#index-negating-register-values">negating register values</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Setting-Registers.html">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-negation">negation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Interpolating-Registers.html#index-nested-assignments">nested assignments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Interpolating-Registers.html">Interpolating Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-nested-diversions">nested diversions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Indented-regions-in-ms.html#index-nested-lists-_005bms_005d">nested lists [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Indented-regions-in-ms.html">Indented regions in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Suppressing-Output.html#index-nesting-level_002c-suppression_002c-register">nesting level, suppression, register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Suppressing-Output.html">Suppressing Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-new-page-_0028bp_0029">new page (<code class="code">bp</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-newline-character_002c-and-translations">newline character, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-newline-character_002c-in-strings_002c-escaping">newline character, in strings, escaping</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-newline_002c-as-delimiter">newline, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Punning-Names.html#index-newline_002c-final_002c-stripping-in-diversions">newline, final, stripping in diversions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Punning-Names.html">Punning Names</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-next-file_002c-processing-_0028nx_0029">next file, processing (<code class="code">nx</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Positions.html#index-next-free-font-position-register-_0028_002efp_0029">next free font position register (<code class="code">.fp</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Positions.html">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-next-page-number-register-_0028_002epn_0029">next page number register (<code class="code">.pn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-next-page-number_002c-configuring-_0028pn_0029">next page number, configuring (<code class="code">pn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-nf-request_002c-causing-implicit-break"><code class="code">nf</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-nl-register_002c-and-_002ed"><code class="code">nl</code> register, and <code class="code">.d</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-nl-register_002c-difference-from-_002eh"><code class="code">nl</code> register, difference from <code class="code">.h</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-nm-request_002c-using-_002b-and-_002d-with"><code class="code">nm</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Requests-and-Macros.html#index-no_002dbreak-control-character-_0028_0027_0029">no-break control character (<code class="code">'</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Requests-and-Macros.html">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Control-Characters.html#index-no_002dbreak-control-character_002c-changing-_0028c2_0029">no-break control character, changing (<code class="code">c2</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Control-Characters.html">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-no_002dfill-mode">no-fill mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-no_002dfill-mode_002c-and-_005cc">no-fill mode, and <code class="code">\c</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Spacing.html#index-no_002dspace-mode-_0028ns_0029">no-space mode (<code class="code">ns</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Spacing.html">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Gtroff-Internals.html#index-node_002c-output">node, output</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Gtroff-Internals.html">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-non_002dprinting-break-point-_0028_005c_003a_0029">non-printing break point (<code class="code">\:</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-nr-request_002c-and-warnings"><code class="code">nr</code> request, and warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-nr-request_002c-using-_002b-and-_002d-with"><code class="code">nr</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="troff-and-nroff-Modes.html#index-nroff-mode"><code class="code">nroff</code> mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="troff-and-nroff-Modes.html"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Assigning-Register-Formats.html#index-number-formats_002c-assigning-to-register-_0028af_0029">number formats, assigning to register (<code class="code">af</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Assigning-Register-Formats.html">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-number-of-registers-register-_0028_002eR_0029">number of registers register (<code class="code">.R</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-number_002c-input-line_002c-setting-_0028lf_0029">number, input line, setting (<code class="code">lf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-number_002c-page_002c-next_002c-configuring-_0028pn_0029">number, page, next, configuring (<code class="code">pn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-numbered-glyph-_0028_005cN_0029">numbered glyph (<code class="code">\N</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-numbered-glyph-_0028_005cN_0029-1">numbered glyph (<code class="code">\N</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Lists-in-ms.html#index-numbered-list_002c-example-markup-_005bms_005d">numbered list, example markup [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Lists-in-ms.html">Lists in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-numbers_002c-line_002c-printing-_0028nm_0029">numbers, line, printing (<code class="code">nm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-numeral_002dwidth-space-_0028_005c0_0029">numeral-width space (<code class="code">\0</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-numerals_002c-as-delimiters">numerals, as delimiters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Assigning-Register-Formats.html#index-numerals_002c-Roman">numerals, Roman</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Assigning-Register-Formats.html">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-numeric-expression_002c-valid">numeric expression, valid</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-numeric-expressions">numeric expressions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-O">O</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Writing-Macros.html#index-object-creation">object creation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Writing-Macros.html">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-offset_002c-page">offset, page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-offset_002c-page-_0028po_0029">offset, page (<code class="code">po</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-open-request_002c-and-safer-mode"><code class="code">open</code> request, and safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-opena-request_002c-and-safer-mode"><code class="code">opena</code> request, and safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Conditional-Blocks.html#index-opening-brace-escape-sequence-_0028_005c_007d_0029">opening brace escape sequence (<code class="code">\}</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Conditional-Blocks.html">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-opening-file-_0028open_0029">opening file (<code class="code">open</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-operator_002c-scaling">operator, scaling</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-operators_002c-arithmetic">operators, arithmetic</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-operators_002c-as-delimiters">operators, as delimiters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-operators_002c-comparison">operators, comparison</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-operators_002c-extremum-_0028_003e_003f_002c-_003c_003f_0029">operators, extremum (<code class="code">&gt;?</code>, <code class="code">&lt;?</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-operators_002c-logical">operators, logical</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-operators_002c-motion">operators, motion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-operators_002c-unary-arithmetic">operators, unary arithmetic</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-optical-size-of-a-font">optical size of a font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-options">options</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-order-of-evaluation-in-expressions">order of evaluation in expressions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Identifiers.html#index-ordinary-character">ordinary character</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Identifiers.html">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Paper-Format.html#index-orientation_002c-landscape">orientation, landscape</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Paper-Format.html">Paper Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-orphan">orphan</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-orphan-lines_002c-preventing-with-ne">orphan lines, preventing with <code class="code">ne</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-os-request_002c-and-no_002dspace-mode"><code class="code">os</code> request, and no-space mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-outlined-circle_002c-drawing-_0028_005cD_0027c-_2026_0027_0029">outlined circle, drawing (&lsquo;<samp class="samp">\D'c &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-outlined-ellipse_002c-drawing-_0028_005cD_0027e-_2026_0027_0029">outlined ellipse, drawing (&lsquo;<samp class="samp">\D'e &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-outlined-polygon_002c-drawing-_0028_005cD_0027p-_2026_0027_0029">outlined polygon, drawing (&lsquo;<samp class="samp">\D'p &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-output-and-input-requests">output and input requests</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Operators-in-Conditionals.html#index-output-comparison-operator">output comparison operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Operators-in-Conditionals.html">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-output-device-name-string-_0028_002eT_0029">output device name string (<code class="code">.T</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-output-device-name-string-_0028_002eT_0029-1">output device name string (<code class="code">.T</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-output-device-name-string-_0028_002eT_0029_002c-in-other-implementations">output device name string (<code class="code">.T</code>), in other implementations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-output-device-usage-register-_0028_002eT_0029">output device usage register (<code class="code">.T</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-output-device-usage-register-_0028_002eT_0029_002c-incompatibility-with-AT_0026T-troff">output device usage register (<code class="code">.T</code>), incompatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Output-Device-Intro.html#index-output-devices">output devices</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Output-Device-Intro.html">Output Device Intro</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-output-encoding_002c-ASCII">output encoding, <abbr class="acronym">ASCII</abbr></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-output-encoding_002c-code-page-1047">output encoding, code page 1047</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-output-encoding_002c-EBCDIC">output encoding, <abbr class="acronym">EBCDIC</abbr></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-output-encoding_002c-ISO-646">output encoding, ISO&nbsp;646</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-output-encoding_002c-Latin_002d1-_0028ISO-8859_002d1_0029">output encoding, <span class="w-nolinebreak-text">Latin-1</span><!-- /@w --> (ISO <span class="w-nolinebreak-text">8859-1</span><!-- /@w -->)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-output-encoding_002c-UTF_002d8">output encoding, <span class="w-nolinebreak-text">UTF-8</span><!-- /@w --></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-output-glyphs_002c-and-input-characters_002c-compatibility-with-AT_0026T-troff">output glyphs, and input characters, compatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Breaking.html#index-output-line-break">output line break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Breaking.html">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-output-line-number-register-_0028ln_0029">output line number register (<code class="code">ln</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-output-line-properties">output line properties</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-output-line_002c-continuation-_0028_005cc_0029">output line, continuation (<code class="code">\c</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-output-line_002c-horizontal-position_002c-register-_0028_002ek_0029">output line, horizontal position, register (<code class="code">.k</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Gtroff-Internals.html#index-output-node">output node</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Gtroff-Internals.html">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-output-request_002c-and-copy-mode"><code class="code">output</code> request, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-output-request_002c-and-_005c_0021"><code class="code">output</code> request, and <code class="code">\!</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-output_002c-filling_002c-disablement-of-_0028nf_0029">output, filling, disablement of (<code class="code">nf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-output_002c-filling_002c-enablement-of-_0028fi_0029">output, filling, enablement of (<code class="code">fi</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-output_002c-flush-_0028fl_0029">output, flush (<code class="code">fl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="gtroff-Output.html#index-output_002c-gtroff">output, <code class="code">gtroff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="gtroff-Output.html">gtroff Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="gtroff-Output.html#index-output_002c-intermediate">output, intermediate</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="gtroff-Output.html">gtroff Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Suppressing-Output.html#index-output_002c-suppressing-_0028_005cO_0029">output, suppressing (<code class="code">\O</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Suppressing-Output.html">Suppressing Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-output_002c-transparent-_0028cf_002c-trf_0029">output, transparent (<code class="code">cf</code>, <code class="code">trf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-output_002c-transparent-_0028_005c_0021_002c-_005c_003f_0029">output, transparent (<code class="code">\!</code>, <code class="code">\?</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-output_002c-transparent_002c-incompatibilities-with-AT_0026T-troff">output, transparent, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="gtroff-Output.html#index-output_002c-troff">output, <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="gtroff-Output.html">gtroff Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-overlapping-characters">overlapping characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-overstriking-glyphs-_0028_005co_0029">overstriking glyphs (<code class="code">\o</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-P">P</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-p-scaling-unit"><code class="code">p</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-P-scaling-unit"><code class="code">P</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Packages.html#index-package_002c-macro">package, macro</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Packages.html">Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Major-Macro-Packages.html#index-package_002c-macro_002c-auxiliary">package, macro, auxiliary</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Major-Macro-Packages.html">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Major-Macro-Packages.html#index-package_002c-macro_002c-full_002dservice">package, macro, full-service</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Major-Macro-Packages.html">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Package-Intro.html#index-package_002c-macro_002c-introduction">package, macro, introduction</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Package-Intro.html">Macro Package Intro</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Major-Macro-Packages.html#index-package_002c-macro_002c-major">package, macro, major</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Major-Macro-Packages.html">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Major-Macro-Packages.html#index-package_002c-macro_002c-minor">package, macro, minor</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Major-Macro-Packages.html">Major Macro Packages</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-package_002c-macro_002c-search-path">package, macro, search path</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Invoking-Requests.html#index-package_002c-package_002c-structuring-the-source-of">package, package, structuring the source of</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Invoking-Requests.html">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Fields.html#index-padding-character_002c-for-fields-_0028fc_0029">padding character, for fields (<code class="code">fc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Fields.html">Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-page">page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-page-break">page break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-page-break-1">page break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="The-Implicit-Page-Trap.html#index-page-break-2">page break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="The-Implicit-Page-Trap.html">The Implicit Page Trap</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Basics.html#index-page-break-_0028introduction_0029">page break (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Basics.html">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-page-break_002c-conditional-_0028ne_0029">page break, conditional (<code class="code">ne</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="End_002dof_002dinput-Traps.html#index-page-break_002c-final">page break, final</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="End_002dof_002dinput-Traps.html">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Vertical-Position-Traps.html#index-page-break_002c-prevented-by-vpt">page break, prevented by <code class="code">vpt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Vertical-Position-Traps.html">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-page-control">page control</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-page-ejection">page ejection</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-page-ejection-1">page ejection</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="The-Implicit-Page-Trap.html#index-page-ejection-2">page ejection</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="The-Implicit-Page-Trap.html">The Implicit Page Trap</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-page-ejection-status-register-_0028_002epe_0029">page ejection status register (<code class="code">.pe</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="End_002dof_002dinput-Traps.html#index-page-ejection_002c-of-final-page">page ejection, of final page</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="End_002dof_002dinput-Traps.html">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Vertical-Position-Traps.html#index-page-ejection_002c-prevented-by-vpt">page ejection, prevented by <code class="code">vpt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Vertical-Position-Traps.html">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-page-footers">page footers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-page-headers">page headers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-page-layout">page layout</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Page-Layout.html#index-page-layout-_005bms_005d">page layout [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Page-Layout.html">ms Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-page-length-register-_0028_002ep_0029">page length register (<code class="code">.p</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-page-length_002c-configuring-_0028pl_0029">page length, configuring (<code class="code">pl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-page-location-traps">page location traps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-page-location-traps_002c-debugging">page location traps, debugging</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-page-location_002c-vertical_002c-marking-_0028mk_0029">page location, vertical, marking (<code class="code">mk</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-page-location_002c-vertical_002c-returning-to-marked-_0028rt_0029">page location, vertical, returning to marked (<code class="code">rt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-page-motions">page motions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-page-number-character-_0028_0025_0029">page number character (<code class="code">%</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-page-number-character_002c-changing-_0028pc_0029">page number character, changing (<code class="code">pc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-page-number-register-_0028_0025_0029">page number register (<code class="code">%</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-page-number_002c-configuring-next-_0028pn_0029">page number, configuring next (<code class="code">pn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-page-number_002c-next_002c-register-_0028_002epn_0029">page number, next, register (<code class="code">.pn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-page-offset">page offset</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-page-offset-_0028po_0029">page offset (<code class="code">po</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Paper-Format.html#index-page-orientation_002c-landscape">page orientation, landscape</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Paper-Format.html">Paper Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-page_002c-geometry-of">page, geometry of</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-page_002c-new-_0028bp_0029">page, new (<code class="code">bp</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Paper-Format.html#index-paper-format">paper format</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Paper-Format.html">Paper Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Paper-Format.html#index-paper-size">paper size</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Paper-Format.html">Paper Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Paragraphs.html#index-paragraphs">paragraphs</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Paragraphs.html">Paragraphs</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Parameters.html#index-parameter-count-register-_0028_002e_0024_0029">parameter count register (<code class="code">.$</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Parameters.html">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Parameters.html#index-parameters">parameters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Parameters.html">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Gtroff-Internals.html#index-parameters_002c-and-compatibility-mode">parameters, and compatibility mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Gtroff-Internals.html">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Parameters.html#index-parameters_002c-macro-_0028_005c_0024_0029">parameters, macro (<code class="code">\$</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Parameters.html">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-parentheses">parentheses</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-partially-collected-line">partially collected line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Directories.html#index-path_002c-for-font-files">path, for font files</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Directories.html">Font Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-path_002c-for-tmac-files">path, for tmac files</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-pattern-files_002c-for-hyphenation">pattern files, for hyphenation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-patterns-for-hyphenation-_0028hpf_0029">patterns for hyphenation (<code class="code">hpf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-pending-output-line">pending output line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-pi-request_002c-and-groff"><code class="code">pi</code> request, and <code class="code">groff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-pi-request_002c-and-safer-mode"><code class="code">pi</code> request, and safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Safer-Mode.html#index-pi-request_002c-disabled-by-default"><code class="code">pi</code> request, disabled by default</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Safer-Mode.html">Safer Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-pica-scaling-unit-_0028P_0029">pica scaling unit (<code class="code">P</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-PID-of-GNU-troff-register-_0028_0024_0024_0029">PID of GNU <code class="code">troff</code> register (<code class="code">$$</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-pile_002c-glyph-_0028_005cb_0029">pile, glyph (<code class="code">\b</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-pl-request_002c-using-_002b-and-_002d-with"><code class="code">pl</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-plain-text-approximation-output-register-_0028_002eA_0029">plain text approximation output register (<code class="code">.A</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-plain-text-approximation-output-register-_0028_002eA_0029-1">plain text approximation output register (<code class="code">.A</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Traps.html#index-planting-a-trap">planting a trap</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Traps.html">Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-platform_002dspecific-directory">platform-specific directory</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-pm-request_002c-incompatibilities-with-AT_0026T-troff"><code class="code">pm</code> request, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-pn-request_002c-using-_002b-and-_002d-with"><code class="code">pn</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-PNG-image-generation-from-PostScript">PNG image generation from PostScript</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-po-request_002c-using-_002b-and-_002d-with"><code class="code">po</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-point-scaling-unit-_0028p_0029">point scaling unit (<code class="code">p</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Type-Size.html#index-point-size-registers-_0028_002es_002c-_002eps_0029">point size registers (<code class="code">.s</code>, <code class="code">.ps</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Type-Size.html">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-point-size-registers_002c-last_002drequested-_0028_002epsr_002c-_002esr_0029">point size registers, last-requested (<code class="code">.psr</code>, <code class="code">.sr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Type-Size.html#index-point-sizes_002c-changing-_0028ps_002c-_005cs_0029">point sizes, changing (<code class="code">ps</code>, <code class="code">\s</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Type-Size.html">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-point-sizes_002c-fractional">point sizes, fractional</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-point-sizes_002c-fractional-1">point sizes, fractional</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-polygon_002c-filled_002c-drawing-_0028_005cD_0027P-_2026_0027_0029">polygon, filled, drawing (&lsquo;<samp class="samp">\D'P &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-polygon_002c-outlined_002c-drawing-_0028_005cD_0027p-_2026_0027_0029">polygon, outlined, drawing (&lsquo;<samp class="samp">\D'p &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-polygon_002c-solid_002c-drawing-_0028_005cD_0027P-_2026_0027_0029">polygon, solid, drawing (&lsquo;<samp class="samp">\D'P &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-polygon_002c-stroked_002c-drawing-_0028_005cD_0027p-_2026_0027_0029">polygon, stroked, drawing (&lsquo;<samp class="samp">\D'p &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-position-of-lowest-text-line-_0028_002eh_0029">position of lowest text line (<code class="code">.h</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-position_002c-absolute-_0028sic_0029-operator-_0028_007c_0029">position, absolute <i class="slanted">(sic)</i> operator (<code class="code">|</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-position_002c-drawing">position, drawing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-position_002c-horizontal-input-line_002c-saving-_0028_005ck_0029">position, horizontal input line, saving (<code class="code">\k</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-position_002c-horizontal_002c-in-input-line_002c-register-_0028hp_0029">position, horizontal, in input line, register (<code class="code">hp</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-position_002c-horizontal_002c-in-output-line_002c-register-_0028_002ek_0029">position, horizontal, in output line, register (<code class="code">.k</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-position_002c-mounting">position, mounting</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-position_002c-vertical_002c-in-diversion_002c-register-_0028_002ed_0029">position, vertical, in diversion, register (<code class="code">.d</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Positions.html#index-positions_002c-font">positions, font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Positions.html">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Vertical-Spacing.html#index-post_002dvertical-line-spacing">post-vertical line spacing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Vertical-Spacing.html">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Vertical-Spacing.html#index-post_002dvertical-line-spacing-register-_0028_002epvs_0029">post-vertical line spacing register (<code class="code">.pvs</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Vertical-Spacing.html">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Vertical-Spacing.html#index-post_002dvertical-line-spacing_002c-changing-_0028pvs_0029">post-vertical line spacing, changing (<code class="code">pvs</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Vertical-Spacing.html">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Postprocessor-Access.html#index-postprocessor-access">postprocessor access</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Postprocessor-Access.html">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Output-Device-Intro.html#index-postprocessors">postprocessors</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Output-Device-Intro.html">Output Device Intro</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-PostScript_002c-bounding-box">PostScript, bounding box</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-PostScript_002c-PNG-image-generation">PostScript, PNG image generation</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environment.html#index-prefix_002c-for-commands">prefix, for commands</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environment.html">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Preprocessor-Intro.html#index-preprocessors">preprocessors</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Preprocessor-Intro.html">Preprocessor Intro</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-previous-font_002c-selecting-_0028ft_0029">previous font, selecting (<code class="code">ft</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-previous-font_002c-selecting-_0028_005cf_005b_005d_002c-_005cfP_0029">previous font, selecting (<code class="code">\f[]</code>, <code class="code">\fP</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-previous-line-length-_0028_002en_0029">previous line length (<code class="code">.n</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-print-current-page-register-_0028_002eP_0029">print current page register (<code class="code">.P</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-printing-backslash-_0028_005c_005c_002c-_005ce_002c-_005cE_002c-_005c_005brs_005d_0029">printing backslash (<code class="code">\\</code>, <code class="code">\e</code>, <code class="code">\E</code>, <code class="code">\[rs]</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-printing-line-numbers-_0028nm_0029">printing line numbers (<code class="code">nm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-printing-to-stderr-_0028tm_002c-tm1_002c-tmc_0029">printing to stderr (<code class="code">tm</code>, <code class="code">tm1</code>, <code class="code">tmc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-printing_002c-zero_002dwidth-_0028_005cz_002c-_005cZ_0029">printing, zero-width (<code class="code">\z</code>, <code class="code">\Z</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-printing_002c-zero_002dwidth-_0028_005cz_002c-_005cZ_0029-1">printing, zero-width (<code class="code">\z</code>, <code class="code">\Z</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-process-ID-of-GNU-troff-register-_0028_0024_0024_0029">process ID of GNU <code class="code">troff</code> register (<code class="code">$$</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-processing-next-file-_0028nx_0029">processing next file (<code class="code">nx</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-productive-input-line">productive input line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-properties-of-characters-_0028cflags_0029">properties of characters (<code class="code">cflags</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-properties-of-glyphs-_0028cflags_0029">properties of glyphs (<code class="code">cflags</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-properties-of-output-lines">properties of output lines</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-ps-request_002c-and-constant-glyph-space-mode"><code class="code">ps</code> request, and constant glyph space mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-ps-request_002c-incompatibilities-with-AT_0026T-troff"><code class="code">ps</code> request, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-ps-request_002c-using-_002b-and-_002d-with"><code class="code">ps</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-ps-request_002c-with-fractional-type-sizes"><code class="code">ps</code> request, with fractional type sizes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-pso-request_002c-and-safer-mode"><code class="code">pso</code> request, and safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-pvs-request_002c-using-_002b-and-_002d-with"><code class="code">pvs</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-Q">Q</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Motion-Quanta.html#index-quanta_002c-motion">quanta, motion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Motion-Quanta.html">Motion Quanta</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-quantum_002c-horizontal-motion">quantum, horizontal motion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-quantum_002c-vertical-motion">quantum, vertical motion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-radicalex-glyph_002c-and-cflags"><code class="code">radicalex</code> glyph, and <code class="code">cflags</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-ragged_002dleft-text">ragged-left text</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-ragged_002dright-text">ragged-right text</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-rc-request_002c-and-glyph-definitions"><code class="code">rc</code> request, and glyph definitions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-read_002donly-register-removal_002c-incompatibility-with-AT_0026T-troff">read-only register removal, incompatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Assigning-Register-Formats.html#index-read_002donly-register_002c-changing-format">read-only register, changing format</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Assigning-Register-Formats.html">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-reading-from-standard-input-_0028rd_0029">reading from standard input (<code class="code">rd</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="while.html#index-recursive-macros">recursive macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="while.html">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Identifiers.html#index-refer_002c-and-macro-names-starting-with-_005b-or-_005d"><code class="code">refer</code>, and macro names starting with <code class="code">[</code> or <code class="code">]</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Identifiers.html">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="GNU-troff-Reference.html#index-reference_002c-gtroff">reference, <code class="code">gtroff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="GNU-troff-Reference.html">GNU troff Reference</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-references-_005bms_005d">references [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Assigning-Register-Formats.html#index-register-format_002c-in-expressions">register format, in expressions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Assigning-Register-Formats.html">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Assigning-Register-Formats.html#index-register_002c-assigning-number-format-to-_0028af_0029">register, assigning number format to (<code class="code">af</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Assigning-Register-Formats.html">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-register_002c-built_002din_002c-removing">register, built-in, removing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Setting-Registers.html#index-register_002c-creating-alias-for-_0028aln_0029">register, creating alias for (<code class="code">aln</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Setting-Registers.html">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Assigning-Register-Formats.html#index-register_002c-format-_0028_005cg_0029">register, format (<code class="code">\g</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Assigning-Register-Formats.html">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-register_002c-read_002donly_002c-removal_002c-incompatibility-with-AT_0026T-troff">register, read-only, removal, incompatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Setting-Registers.html#index-register_002c-removing-_0028rr_0029">register, removing (<code class="code">rr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Setting-Registers.html">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Setting-Registers.html#index-register_002c-removing-alias-for-_0028rr_0029">register, removing alias for (<code class="code">rr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Setting-Registers.html">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Setting-Registers.html#index-register_002c-renaming-_0028rnn_0029">register, renaming (<code class="code">rnn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Setting-Registers.html">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Registers.html#index-registers">registers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Registers.html">Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-registers_002c-built_002din">registers, built-in</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-registers_002c-dumping-_0028pnr_0029">registers, dumping (<code class="code">pnr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Interpolating-Registers.html#index-registers_002c-interpolating-_0028_005cn_0029">registers, interpolating (<code class="code">\n</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Interpolating-Registers.html">Interpolating Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-registers_002c-number-of_002c-register-_0028_002eR_0029">registers, number of, register (<code class="code">.R</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Setting-Registers.html#index-registers_002c-setting-_0028nr_002c-_005cR_0029">registers, setting (<code class="code">nr</code>, <code class="code">\R</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Setting-Registers.html">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-removal-of-read_002donly-registers_002c-incompatibility-with-AT_0026T-troff">removal of read-only registers, incompatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-removing-a-built_002din-register">removing a built-in register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Setting-Registers.html#index-removing-a-register-_0028rr_0029">removing a register (<code class="code">rr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Setting-Registers.html">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Setting-Registers.html#index-removing-alias-for-register-_0028rr_0029">removing alias for register (<code class="code">rr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Setting-Registers.html">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-removing-alias_002c-for-diversion-_0028rm_0029">removing alias, for diversion (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-removing-alias_002c-for-macro-_0028rm_0029">removing alias, for macro (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-removing-alias_002c-for-string-_0028rm_0029">removing alias, for string (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-removing-diversion-_0028rm_0029">removing diversion (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-removing-glyph-definition-_0028rchar_002c-rfschar_0029">removing glyph definition (<code class="code">rchar</code>, <code class="code">rfschar</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-removing-macro-_0028rm_0029">removing macro (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-removing-request-_0028rm_0029">removing request (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-removing-string-_0028rm_0029">removing string (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Setting-Registers.html#index-renaming-a-register-_0028rnn_0029">renaming a register (<code class="code">rnn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Setting-Registers.html">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-renaming-diversion-_0028rn_0029">renaming diversion (<code class="code">rn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-renaming-macro-_0028rn_0029">renaming macro (<code class="code">rn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-renaming-request-_0028rn_0029">renaming request (<code class="code">rn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-renaming-string-_0028rn_0029">renaming string (<code class="code">rn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-renditions_002c-graphic">renditions, graphic</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Requests-and-Macros.html#index-request">request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Requests-and-Macros.html">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Formatter-Instructions.html#index-request-1">request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Formatter-Instructions.html">Formatter Instructions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Invoking-Requests.html#index-request-arguments">request arguments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Invoking-Requests.html">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Gtroff-Internals.html#index-request-arguments_002c-and-compatibility-mode">request arguments, and compatibility mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Gtroff-Internals.html">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Invoking-Requests.html#index-request-arguments_002c-and-tabs">request arguments, and tabs</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Invoking-Requests.html">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-request_002c-removing-_0028rm_0029">request, removing (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-request_002c-renaming-_0028rn_0029">request, renaming (<code class="code">rn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Comments.html#index-request_002c-undefined">request, undefined</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Comments.html">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-requests-for-drawing">requests for drawing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-requests-for-input-and-output">requests for input and output</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Control-Characters.html#index-requests_002c-intercepting">requests, intercepting</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Control-Characters.html">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Invoking-Requests.html#index-requests_002c-invoking">requests, invoking</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Invoking-Requests.html">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Control-Characters.html#index-requests_002c-modifying">requests, modifying</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Control-Characters.html">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-resolution_002c-device">resolution, device</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-resolution_002c-device-1">resolution, device</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-resolution_002c-device_002c-obtaining-in-the-formatter">resolution, device, obtaining in the formatter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-resolution_002c-horizontal">resolution, horizontal</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Motion-Quanta.html#index-resolution_002c-horizontal_002c-register-_0028_002eH_0029">resolution, horizontal, register (<code class="code">.H</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Motion-Quanta.html">Motion Quanta</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-resolution_002c-vertical">resolution, vertical</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-returning-to-marked-vertical-page-location-_0028rt_0029">returning to marked vertical page location (<code class="code">rt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-revision-number-register-_0028_002eY_0029">revision number register (<code class="code">.Y</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-right-margin">right margin</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Basics.html#index-right_002daligning-lines-_0028introduction_0029">right-aligning lines (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Basics.html">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-right_002djustifying-_0028rj_0029">right-justifying (<code class="code">rj</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Basics.html#index-right_002djustifying-lines-_0028introduction_0029">right-justifying lines (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Basics.html">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-rivers">rivers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-rj-request_002c-causing-implicit-break"><code class="code">rj</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-rn-glyph_002c-and-cflags"><code class="code">rn</code> glyph, and <code class="code">cflags</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Italic-Corrections.html#index-roman-glyph_002c-correction-after-italic-glyph-_0028_005c_002f_0029">roman glyph, correction after italic glyph (<code class="code">\/</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Italic-Corrections.html">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Italic-Corrections.html#index-roman-glyph_002c-correction-before-italic-glyph-_0028_005c_002c_0029">roman glyph, correction before italic glyph (<code class="code">\,</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Italic-Corrections.html">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Assigning-Register-Formats.html#index-Roman-numerals">Roman numerals</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Assigning-Register-Formats.html">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Assigning-Register-Formats.html#index-Roman-numerals_002c-extrema-_0028maximum-and-minimum_0029">Roman numerals, extrema (maximum and minimum)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Assigning-Register-Formats.html">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Sentences.html#index-rq-glyph_002c-at-end-of-sentence"><code class="code">rq</code> glyph, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Sentences.html">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-rq-glyph_002c-at-end-of-sentence-1"><code class="code">rq</code> glyph, at end of sentence</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-rt-request_002c-using-_002b-and-_002d-with"><code class="code">rt</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-ru-glyph_002c-and-cflags"><code class="code">ru</code> glyph, and <code class="code">cflags</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-running-system-commands">running system commands</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-S">S</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-s-scaling-unit"><code class="code">s</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-safer-mode">safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-safer-mode-1">safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-safer-mode-2">safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-safer-mode-3">safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-safer-mode-4">safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-safer-mode-5">safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-safer-mode-6">safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Safer-Mode.html#index-safer-mode-7">safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Safer-Mode.html">Safer Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-saving-horizontal-input-line-position-_0028_005ck_0029">saving horizontal input line position (<code class="code">\k</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-scaling-indicator">scaling indicator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-scaling-operator">scaling operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-scaling-unit-c">scaling unit <code class="code">c</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-scaling-unit-f">scaling unit <code class="code">f</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-scaling-unit-i">scaling unit <code class="code">i</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-scaling-unit-m">scaling unit <code class="code">m</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-scaling-unit-M">scaling unit <code class="code">M</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-scaling-unit-n">scaling unit <code class="code">n</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-scaling-unit-p">scaling unit <code class="code">p</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-scaling-unit-P">scaling unit <code class="code">P</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-scaling-unit-s">scaling unit <code class="code">s</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-scaling-unit-u">scaling unit <code class="code">u</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-scaling-unit-v">scaling unit <code class="code">v</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-scaling-unit-z">scaling unit <code class="code">z</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Directories.html#index-searching-fonts">searching fonts</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Directories.html">Font Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-searching-macros">searching macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-seconds_002c-current-time-_0028seconds_0029">seconds, current time (<code class="code">seconds</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-selecting-the-previous-font-_0028ft_0029">selecting the previous font (<code class="code">ft</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Sentences.html#index-sentence-space">sentence space</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Sentences.html">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-sentence-space-size-register-_0028_002esss_0029">sentence space size register (<code class="code">.sss</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Sentences.html#index-sentences">sentences</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Sentences.html">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Formatter-Instructions.html#index-sequence_002c-escape">sequence, escape</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Formatter-Instructions.html">Formatter Instructions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversion-Traps.html#index-setting-diversion-trap-_0028dt_0029">setting diversion trap (<code class="code">dt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversion-Traps.html">Diversion Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="End_002dof_002dinput-Traps.html#index-setting-end_002dof_002dinput-trap-_0028em_0029">setting end-of-input trap (<code class="code">em</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="End_002dof_002dinput-Traps.html">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-setting-input-line-number-_0028lf_0029">setting input line number (<code class="code">lf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Line-Traps.html#index-setting-input-line-trap-_0028it_002c-itc_0029">setting input line trap (<code class="code">it</code>, <code class="code">itc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Line-Traps.html">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Setting-Registers.html#index-setting-registers-_0028nr_002c-_005cR_0029">setting registers (<code class="code">nr</code>, <code class="code">\R</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Setting-Registers.html">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-setting-the-page-length-_0028pl_0029">setting the page length (<code class="code">pl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-setting-up-an-abstract-font-style-_0028sty_0029">setting up an abstract font style (<code class="code">sty</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-shc-request_002c-and-translations"><code class="code">shc</code> request, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-site_002dlocal-directory">site-local directory</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Directories.html#index-site_002dlocal-directory-1">site-local directory</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Directories.html">Font Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-size-of-sentence-space-register-_0028_002esss_0029">size of sentence space register (<code class="code">.sss</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-size-of-word-space-register-_0028_002ess_0029">size of word space register (<code class="code">.ss</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-size_002c-optical_002c-of-a-font">size, optical, of a font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Paper-Format.html#index-size_002c-paper">size, paper</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Paper-Format.html">Paper Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Type-Size-and-Vertical-Spacing.html#index-size_002c-size">size, size</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Type-Size-and-Vertical-Spacing.html">Manipulating Type Size and Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-sizes_002c-fractional">sizes, fractional</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-sizes_002c-fractional-type">sizes, fractional type</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-skew_002c-of-last-glyph-_0028_002ecsk_0029">skew, of last glyph (<code class="code">.csk</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-slant_002c-font_002c-changing-_0028_005cS_0029">slant, font, changing (<code class="code">\S</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-soft-hyphen-character_002c-setting-_0028shc_0029">soft hyphen character, setting (<code class="code">shc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-soft-hyphen-glyph-_0028hy_0029">soft hyphen glyph (<code class="code">hy</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-solid-circle_002c-drawing-_0028_005cD_0027C-_2026_0027_0029">solid circle, drawing (&lsquo;<samp class="samp">\D'C &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-solid-ellipse_002c-drawing-_0028_005cD_0027E-_2026_0027_0029">solid ellipse, drawing (&lsquo;<samp class="samp">\D'E &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-solid-polygon_002c-drawing-_0028_005cD_0027P-_2026_0027_0029">solid polygon, drawing (&lsquo;<samp class="samp">\D'P &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environment.html#index-SOURCE_005fDATE_005fEPOCH_002c-environment-variable"><code>SOURCE_DATE_EPOCH<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environment.html">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Spacing.html#index-sp-request_002c-and-no_002dspace-mode"><code class="code">sp</code> request, and no-space mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Spacing.html">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-sp-request_002c-causing-implicit-break"><code class="code">sp</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Sentences.html#index-space-between-sentences">space between sentences</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Sentences.html">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-space-between-sentences-register-_0028_002esss_0029">space between sentences register (<code class="code">.sss</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-space-between-words-register-_0028_002ess_0029">space between words register (<code class="code">.ss</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-space-character_002c-as-delimiter">space character, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-space-characters_002c-in-expressions">space characters, in expressions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-space_002c-between-sentences">space, between sentences</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-space_002c-between-words">space, between words</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-space_002c-discardable_002c-horizontal">space, discardable, horizontal</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-space_002c-hair-_0028_005c_005e_0029">space, hair (<code class="code">\^</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-space_002c-horizontal-_0028_005ch_0029">space, horizontal (<code class="code">\h</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Punning-Names.html#index-space_002c-horizontal_002c-unformatting">space, horizontal, unformatting</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Punning-Names.html">Punning Names</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-space_002c-thin-_0028_005c_007c_0029">space, thin (<code class="code">\|</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-space_002c-unbreakable-_0028_005c_007e_0029">space, unbreakable (<code class="code">\~</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-space_002c-unbreakable-and-unadjustable-_0028_005cSP_0029">space, unbreakable and unadjustable (<code class="code">\<kbd class="key">SP</kbd></code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-space_002c-vertical_002c-unit-_0028v_0029">space, vertical, unit (<code class="code">v</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-space_002c-width-of-a-digit-_0028numeral_0029-_0028_005c0_0029">space, width of a digit (numeral) (<code class="code">\0</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-spaces-with-ds">spaces with <code class="code">ds</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Calling-Macros.html#index-spaces_002c-in-a-macro-argument">spaces, in a macro argument</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Calling-Macros.html">Calling Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Breaking.html#index-spaces_002c-leading-and-trailing">spaces, leading and trailing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Breaking.html">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Basics.html#index-spacing-_0028introduction_0029">spacing (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Basics.html">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Spacing.html#index-spacing_002c-manipulating">spacing, manipulating</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Spacing.html">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-spacing_002c-vertical">spacing, vertical</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Type-Size-and-Vertical-Spacing.html#index-spacing_002c-vertical-1">spacing, vertical</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Type-Size-and-Vertical-Spacing.html">Manipulating Type Size and Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Basics.html#index-spacing_002c-vertical-_0028introduction_0029">spacing, vertical (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Basics.html">Basics</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Sentences.html#index-special-characters">special characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Sentences.html">Sentences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-special-characters-1">special characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-special-characters-_005bms_005d">special characters [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-special-characters_002c-list-of-_0028groff_005fchar_00287_0029-man-page_0029">special characters, list of (<cite class="cite">groff_char<span class="r">(7)</span></cite> man page)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-special-font">special font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-special-fonts">special fonts</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Special-Fonts.html#index-special-fonts-1">special fonts</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Special-Fonts.html">Special Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-special-fonts-2">special fonts</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-special-fonts_002c-emboldening">special fonts, emboldening</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-special-request_002c-and-font-translations"><code class="code">special</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-special-request_002c-and-glyph-search-order"><code class="code">special</code> request, and glyph search order</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-spline_002c-drawing-_0028_005cD_0027_007e-_2026_0027_0029">spline, drawing (&lsquo;<samp class="samp">\D'~ &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Traps.html#index-springing-a-trap">springing a trap</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Traps.html">Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-sqrtex-glyph_002c-and-cflags"><code class="code">sqrtex</code> glyph, and <code class="code">cflags</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-ss-request_002c-incompatibilities-with-AT_0026T-troff"><code class="code">ss</code> request, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-stack">stack</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-stacking-glyphs-_0028_005cb_0029">stacking glyphs (<code class="code">\b</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-standard-input_002c-reading-from-_0028rd_0029">standard input, reading from (<code class="code">rd</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-stderr_002c-printing-to-_0028tm_002c-tm1_002c-tmc_0029">stderr, printing to (<code class="code">tm</code>, <code class="code">tm1</code>, <code class="code">tmc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Leaders.html#index-stops_002c-tab">stops, tab</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Leaders.html">Tabs and Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-string-arguments">string arguments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Operators-in-Conditionals.html#index-string-comparison">string comparison</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Operators-in-Conditionals.html">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-string-expansion-_0028_005c_002a_0029">string expansion (<code class="code">\*</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-string-interpolation-_0028_005c_002a_0029">string interpolation (<code class="code">\*</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-string_002c-appending-_0028as_0029">string, appending (<code class="code">as</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-string_002c-creating-alias-for-_0028als_0029">string, creating alias for (<code class="code">als</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-string_002c-length-of-_0028length_0029">string, length of (<code class="code">length</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-string_002c-removing-_0028rm_0029">string, removing (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-string_002c-removing-alias-for-_0028rm_0029">string, removing alias for (<code class="code">rm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-string_002c-renaming-_0028rn_0029">string, renaming (<code class="code">rn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-strings">strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-strings-_005bms_005d">strings [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-strings_002c-multi_002dline">strings, multi-line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Identifiers.html#index-strings_002c-shared-name-space-with-macros-and-diversions">strings, shared name space with macros and diversions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Identifiers.html">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Punning-Names.html#index-stripping-final-newline-in-diversions">stripping final newline in diversions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Punning-Names.html">Punning Names</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-stroke-color">stroke color</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-stroke-color-name-register-_0028_002em_0029">stroke color name register (<code class="code">.m</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-stroked-circle_002c-drawing-_0028_005cD_0027c-_2026_0027_0029">stroked circle, drawing (&lsquo;<samp class="samp">\D'c &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-stroked-ellipse_002c-drawing-_0028_005cD_0027e-_2026_0027_0029">stroked ellipse, drawing (&lsquo;<samp class="samp">\D'e &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-stroked-polygon_002c-drawing-_0028_005cD_0027p-_2026_0027_0029">stroked polygon, drawing (&lsquo;<samp class="samp">\D'p &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Invoking-Requests.html#index-structuring-source-code-of-documents-or-macro-packages">structuring source code of documents or macro packages</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Invoking-Requests.html">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-sty-request_002c-and-changing-fonts"><code class="code">sty</code> request, and changing fonts</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-sty-request_002c-and-font-translations"><code class="code">sty</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-style_002c-font">style, font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-style_002c-font_002c-abstract">style, font, abstract</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-style_002c-font_002c-abstract_002c-setting-up-_0028sty_0029">style, font, abstract, setting up (<code class="code">sty</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-styles_002c-font">styles, font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-substring-_0028substring_0029">substring (<code class="code">substring</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-subtraction">subtraction</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Suppressing-Output.html#index-suppressing-output-_0028_005cO_0029">suppressing output (<code class="code">\O</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Suppressing-Output.html">Suppressing Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Suppressing-Output.html#index-suppression-nesting-level-register">suppression nesting level register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Suppressing-Output.html">Suppressing Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-sv-request_002c-and-no_002dspace-mode"><code class="code">sv</code> request, and no-space mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-switching-environments-_0028ev_0029">switching environments (<code class="code">ev</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-sy-request_002c-and-safer-mode"><code class="code">sy</code> request, and safer mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Safer-Mode.html#index-sy-request_002c-disabled-by-default"><code class="code">sy</code> request, disabled by default</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Safer-Mode.html">Safer Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-symbol">symbol</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-symbol-table_002c-dumping-_0028pm_0029">symbol table, dumping (<code class="code">pm</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-symbol_002c-defining-_0028char_0029">symbol, defining (<code class="code">char</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-symbols_002c-using">symbols, using</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-system-commands_002c-running">system commands, running</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-system_0028_0029-return-value-register-_0028systat_0029"><code class="code">system()</code> return value register (<code class="code">systat</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-T">T</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Leaders.html#index-tab-character">tab character</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Leaders.html">Tabs and Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-tab-character-encoding">tab character encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-tab-character_002c-and-translations">tab character, and translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Delimiters.html#index-tab-character_002c-as-delimiter">tab character, as delimiter</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Delimiters.html">Delimiters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-tab-character_002c-non_002dinterpreted-_0028_005ct_0029">tab character, non-interpreted (<code class="code">\t</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-tab-repetition-character-_0028tc_0029">tab repetition character (<code class="code">tc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-tab-stop-settings-register-_0028_002etabs_0029">tab stop settings register (<code class="code">.tabs</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Leaders.html#index-tab-stops">tab stops</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Leaders.html">Tabs and Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-tab-stops_002c-default">tab stops, default</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-tab_002c-line_002dtabs-mode">tab, line-tabs mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Table-of-Contents.html#index-table-of-contents">table of contents</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Table-of-Contents.html">Table of Contents</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Leaders.html#index-table-of-contents-1">table of contents</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Leaders.html">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-TOC.html#index-table-of-contents_002c-creating-_005bms_005d">table of contents, creating [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-TOC.html">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-table_002c-multi_002dpage_002c-example-_005bms_005d">table, multi-page, example [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-tables-_005bms_005d">tables [<samp class="file">ms</samp>]</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-tabs_002c-and-fields">tabs, and fields</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Invoking-Requests.html#index-tabs_002c-and-macro-arguments">tabs, and macro arguments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Invoking-Requests.html">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Invoking-Requests.html#index-tabs_002c-and-request-arguments">tabs, and request arguments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Invoking-Requests.html">Invoking Requests</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Comments.html#index-tabs_002c-before-comments">tabs, before comments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Comments.html">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Paragraphs.html#index-tagged-paragraphs">tagged paragraphs</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Paragraphs.html">Paragraphs</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Paragraphs.html#index-tags_002c-paragraph">tags, paragraph</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Paragraphs.html">Paragraphs</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Operators-in-Conditionals.html#index-terminal_002c-conditional-output-for">terminal, conditional output for</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Operators-in-Conditionals.html">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-text-baseline">text baseline</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Type-Size-and-Vertical-Spacing.html#index-text-baseline-1">text baseline</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Type-Size-and-Vertical-Spacing.html">Manipulating Type Size and Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-text-font">text font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Requests-and-Macros.html#index-text-line">text line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Requests-and-Macros.html">Requests and Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-text-line_002c-position-of-lowest-_0028_002eh_0029">text line, position of lowest (<code class="code">.h</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Text.html#index-text_002c-GNU-troff-processing">text, GNU <code class="code">troff</code> processing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Text.html">Text</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-text_002c-justifying">text, justifying</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-text_002c-justifying-_0028rj_0029">text, justifying (<code class="code">rj</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-thickness-of-lines-_0028_005cD_0027t-_2026_0027_0029">thickness of lines (&lsquo;<samp class="samp">\D't &hellip;'</samp>&rsquo;)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-thin-space-_0028_005c_007c_0029">thin space (<code class="code">\|</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-three_002dpart-title-_0028tl_0029">three-part title (<code class="code">tl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-ti-request_002c-causing-implicit-break"><code class="code">ti</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-ti-request_002c-using-_002b-and-_002d-with"><code class="code">ti</code> request, using <code class="code">+</code> and&nbsp;<code class="code">-</code> with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-time_002c-current_002c-hours-_0028hours_0029">time, current, hours (<code class="code">hours</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-time_002c-current_002c-minutes-_0028minutes_0029">time, current, minutes (<code class="code">minutes</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-time_002c-current_002c-seconds-_0028seconds_0029">time, current, seconds (<code class="code">seconds</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-time_002c-formatting">time, formatting</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-title-length_002c-configuring-_0028lt_0029">title length, configuring (<code class="code">lt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-title-line-length-register-_0028_002elt_0029">title line length register (<code class="code">.lt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-title-line_002c-formatting-_0028tl_0029">title line, formatting (<code class="code">tl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-titles">titles</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-tkf-request_002c-and-font-styles"><code class="code">tkf</code> request, and font styles</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-tkf-request_002c-and-font-translations"><code class="code">tkf</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-tkf-request_002c-with-fractional-type-sizes"><code class="code">tkf</code> request, with fractional type sizes</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-tl-request_002c-and-mc"><code class="code">tl</code> request, and <code class="code">mc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-tmac_002c-directory">tmac, directory</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-tmac_002c-path">tmac, path</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environment.html#index-TMPDIR_002c-environment-variable"><code>TMPDIR<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environment.html">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Gtroff-Internals.html#index-token_002c-input">token, input</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Gtroff-Internals.html">Gtroff Internals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-top-margin">top margin</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-top_002dlevel-diversion">top-level diversion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-top_002dlevel-diversion_002c-and-bp">top-level diversion, and <code class="code">bp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-top_002dlevel-diversion_002c-and-_005c_0021">top-level diversion, and <code class="code">\!</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-top_002dlevel-diversion_002c-and-_005c_003f">top-level diversion, and <code class="code">\?</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-tr-request_002c-and-glyph-definitions"><code class="code">tr</code> request, and glyph definitions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-tr-request_002c-and-soft-hyphen-character"><code class="code">tr</code> request, and soft hyphen character</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-tr-request_002c-incompatibilities-with-AT_0026T-troff"><code class="code">tr</code> request, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Ligatures-and-Kerning.html#index-track-kerning">track kerning</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Ligatures-and-Kerning.html">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Ligatures-and-Kerning.html#index-track-kerning_002c-activating-_0028tkf_0029">track kerning, activating (<code class="code">tkf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Ligatures-and-Kerning.html">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-trailing-double-quotes-in-strings">trailing double quotes in strings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-trailing-spaces-in-string-definitions-and-appendments">trailing spaces in string definitions and appendments</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Breaking.html#index-trailing-spaces-on-text-lines">trailing spaces on text lines</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Breaking.html">Breaking</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-translations-of-characters">translations of characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-transparent-characters">transparent characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Dummy-Characters.html#index-transparent-dummy-character-_0028_005c_0029_0029">transparent dummy character (<code class="code">\)</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Dummy-Characters.html">Dummy Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-transparent-output-_0028cf_002c-trf_0029">transparent output (<code class="code">cf</code>, <code class="code">trf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-transparent-output-_0028_005c_0021_002c-_005c_003f_0029">transparent output (<code class="code">\!</code>, <code class="code">\?</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-transparent-output_002c-incompatibilities-with-AT_0026T-troff">transparent output, incompatibilities with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Deferring-Output.html#index-trap">trap</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Deferring-Output.html">Deferring Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-trap_002c-changing-location-_0028ch_0029">trap, changing location (<code class="code">ch</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-trap_002c-distance-to-next-vertical-position_002c-register-_0028_002et_0029">trap, distance to next vertical position, register (<code class="code">.t</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversion-Traps.html#index-trap_002c-diversion_002c-setting-_0028dt_0029">trap, diversion, setting (<code class="code">dt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversion-Traps.html">Diversion Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="End_002dof_002dinput-Traps.html#index-trap_002c-end_002dof_002dinput_002c-setting-_0028em_0029">trap, end-of-input, setting (<code class="code">em</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="End_002dof_002dinput-Traps.html">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="The-Implicit-Page-Trap.html#index-trap_002c-implicit">trap, implicit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="The-Implicit-Page-Trap.html">The Implicit Page Trap</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Line-Traps.html#index-trap_002c-input-line_002c-clearing-_0028it_002c-itc_0029">trap, input line, clearing (<code class="code">it</code>, <code class="code">itc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Line-Traps.html">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Line-Traps.html#index-trap_002c-input-line_002c-setting-_0028it_002c-itc_0029">trap, input line, setting (<code class="code">it</code>, <code class="code">itc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Line-Traps.html">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Traps.html#index-trap_002c-planting">trap, planting</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Traps.html">Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Traps.html#index-trap_002c-springing">trap, springing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Traps.html">Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Traps.html#index-traps">traps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Traps.html">Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-traps_002c-and-diversions">traps, and diversions</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Blank-Line-Traps.html#index-traps_002c-blank-line">traps, blank line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Blank-Line-Traps.html">Blank Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversion-Traps.html#index-traps_002c-diversion">traps, diversion</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversion-Traps.html">Diversion Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="End_002dof_002dinput-Traps.html#index-traps_002c-end_002dof_002dinput">traps, end-of-input</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="End_002dof_002dinput-Traps.html">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Line-Traps.html#index-traps_002c-input-line">traps, input line</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Line-Traps.html">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Line-Traps.html#index-traps_002c-input-line_002c-and-interrupted-lines-_0028itc_0029">traps, input line, and interrupted lines (<code class="code">itc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Line-Traps.html">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Leading-Space-Traps.html#index-traps_002c-leading-space">traps, leading space</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Leading-Space-Traps.html">Leading Space Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-traps_002c-page-location">traps, page location</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-traps_002c-page-location_002c-dumping-_0028ptr_0029">traps, page location, dumping (<code class="code">ptr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-traps_002c-page-location_002c-listing-_0028ptr_0029">traps, page location, listing (<code class="code">ptr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-traps_002c-sprung-by-bp-request-_0028_002epe_0029">traps, sprung by <code class="code">bp</code> request (<code class="code">.pe</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Vertical-Position-Traps.html#index-traps_002c-vertical-position">traps, vertical position</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Vertical-Position-Traps.html">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-trf-request_002c-and-copy-mode"><code class="code">trf</code> request, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-trf-request_002c-and-invalid-characters"><code class="code">trf</code> request, and invalid characters</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-trf-request_002c-causing-implicit-break"><code class="code">trf</code> request, causing implicit break</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-trin-request_002c-and-asciify"><code class="code">trin</code> request, and <code class="code">asciify</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="troff-and-nroff-Modes.html#index-troff-mode"><code class="code">troff</code> mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="troff-and-nroff-Modes.html"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="gtroff-Output.html#index-troff-output"><code class="code">troff</code> output</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="gtroff-Output.html">gtroff Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-truncated-vertical-space-register-_0028_002etrunc_0029">truncated vertical space register (<code class="code">.trunc</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-truncating-division">truncating division</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Operators-in-Conditionals.html#index-TTY_002c-conditional-output-for">TTY, conditional output for</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Operators-in-Conditionals.html">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tutorial-for-Macro-Users.html#index-tutorial-for-macro-users">tutorial for macro users</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tutorial-for-Macro-Users.html">Tutorial for Macro Users</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Type-Size-and-Vertical-Spacing.html#index-type-size">type size</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Type-Size-and-Vertical-Spacing.html">Manipulating Type Size and Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Type-Size.html#index-type-size-registers-_0028_002es_002c-_002eps_0029">type size registers (<code class="code">.s</code>, <code class="code">.ps</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Type-Size.html">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-type-size-registers_002c-last_002drequested-_0028_002epsr_002c-_002esr_0029">type size registers, last-requested (<code class="code">.psr</code>, <code class="code">.sr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Type-Size.html#index-type-sizes_002c-changing-_0028ps_002c-_005cs_0029">type sizes, changing (<code class="code">ps</code>, <code class="code">\s</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Type-Size.html">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-type-sizes_002c-fractional">type sizes, fractional</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Other-Differences.html#index-type-sizes_002c-fractional-1">type sizes, fractional</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Other-Differences.html">Other Differences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-typeface">typeface</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environment.html#index-TZ_002c-environment-variable"><code>TZ<span class="r">, environment variable</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environment.html">Environment</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-U">U</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-u-scaling-unit"><code class="code">u</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-uf-request_002c-and-font-styles"><code class="code">uf</code> request, and font styles</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-ul-glyph_002c-and-cflags"><code class="code">ul</code> glyph, and <code class="code">cflags</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-ul-request_002c-and-font-translations"><code class="code">ul</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-Ultrix_002dspecific-man-macros">Ultrix-specific <code class="code">man</code> macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-unadjustable-and-unbreakable-space-_0028_005cSP_0029">unadjustable and unbreakable space (<code class="code">\<kbd class="key">SP</kbd></code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-unary-arithmetic-operators">unary arithmetic operators</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-unbreakable-and-unadjustable-space-_0028_005cSP_0029">unbreakable and unadjustable space (<code class="code">\<kbd class="key">SP</kbd></code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-unbreakable-space-_0028_005c_007e_0029">unbreakable space (<code class="code">\~</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Identifiers.html#index-undefined-identifiers">undefined identifiers</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Identifiers.html">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Comments.html#index-undefined-request">undefined request</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Comments.html">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-underline-font-_0028uf_0029">underline font (<code class="code">uf</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-underlining-_0028ul_0029">underlining (<code class="code">ul</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-underlining_002c-continuous-_0028cu_0029">underlining, continuous (<code class="code">cu</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-unformatting-diversions-_0028asciify_0029">unformatting diversions (<code class="code">asciify</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Punning-Names.html#index-unformatting-horizontal-space">unformatting horizontal space</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Punning-Names.html">Punning Names</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Identifiers.html#index-Unicode">Unicode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Identifiers.html">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-Unicode-1">Unicode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-unit_002c-scaling_002c-c">unit, scaling, <code class="code">c</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-unit_002c-scaling_002c-f">unit, scaling, <code class="code">f</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-unit_002c-scaling_002c-i">unit, scaling, <code class="code">i</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-unit_002c-scaling_002c-m">unit, scaling, <code class="code">m</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-unit_002c-scaling_002c-M">unit, scaling, <code class="code">M</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-unit_002c-scaling_002c-n">unit, scaling, <code class="code">n</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-unit_002c-scaling_002c-p">unit, scaling, <code class="code">p</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-unit_002c-scaling_002c-P">unit, scaling, <code class="code">P</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-unit_002c-scaling_002c-s">unit, scaling, <code class="code">s</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-unit_002c-scaling_002c-u">unit, scaling, <code class="code">u</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-unit_002c-scaling_002c-v">unit, scaling, <code class="code">v</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-unit_002c-scaling_002c-z">unit, scaling, <code class="code">z</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-units-of-measurement">units of measurement</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-units_002c-basic">units, basic</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-units_002c-basic_002c-conversion-to">units, basic, conversion to</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Default-Units.html#index-units_002c-default">units, default</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Default-Units.html">Default Units</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-units_002c-machine">units, machine</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-unnamed-glyphs">unnamed glyphs</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-unnamed-glyphs_002c-accessing-with-_005cN">unnamed glyphs, accessing with <code class="code">\N</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-unsafe-mode">unsafe mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Macro-Directories.html#index-unsafe-mode-1">unsafe mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Macro-Directories.html">Macro Directories</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-unsafe-mode-2">unsafe mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-unsafe-mode-3">unsafe mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-unsafe-mode-4">unsafe mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-unsafe-mode-5">unsafe mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-unsafe-mode-6">unsafe mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fonts.html#index-unstyled-font">unstyled font</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fonts.html">Using Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-up_002dcasing-a-string-_0028stringup_0029">up-casing a string (<code class="code">stringup</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-uppercasing-a-string-_0028stringup_0029">uppercasing a string (<code class="code">stringup</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Italic-Corrections.html#index-upright-glyph_002c-correction-after-oblique-glyph-_0028_005c_002f_0029">upright glyph, correction after oblique glyph (<code class="code">\/</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Italic-Corrections.html">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Italic-Corrections.html#index-upright-glyph_002c-correction-before-oblique-glyph-_0028_005c_002c_0029">upright glyph, correction before oblique glyph (<code class="code">\,</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Italic-Corrections.html">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-URLs_002c-breaking-_0028_005c_003a_0029">URLs, breaking (<code class="code">\:</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tutorial-for-Macro-Users.html#index-user_0027s-macro-tutorial">user&rsquo;s macro tutorial</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tutorial-for-Macro-Users.html">Tutorial for Macro Users</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tutorial-for-Macro-Users.html#index-user_0027s-tutorial-for-macros">user&rsquo;s tutorial for macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tutorial-for-Macro-Users.html">Tutorial for Macro Users</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Escape-Sequences.html#index-using-escape-sequences">using escape sequences</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Escape-Sequences.html">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-using-symbols">using symbols</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-UTF_002d8-output-encoding"><span class="w-nolinebreak-text">UTF-8</span><!-- /@w --> output encoding</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-V">V</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-v-scaling-unit"><code class="code">v</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-valid-numeric-expression">valid numeric expression</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Auto_002dincrement.html#index-value_002c-incrementing-without-changing-the-register">value, incrementing without changing the register</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Auto_002dincrement.html">Auto-increment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environment.html#index-variables-in-environment">variables in environment</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environment.html">Environment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-vee">vee</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-vee-scaling-unit-_0028v_0029">vee scaling unit (<code class="code">v</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-version-number_002c-major_002c-register-_0028_002ex_0029">version number, major, register (<code class="code">.x</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-version-number_002c-minor_002c-register-_0028_002ey_0029">version number, minor, register (<code class="code">.y</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-vertical-drawing-position-_0028nl_0029">vertical drawing position (<code class="code">nl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-vertical-line-drawing-_0028_005cL_0029">vertical line drawing (<code class="code">\L</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Vertical-Spacing.html#index-vertical-line-spacing-register-_0028_002ev_0029">vertical line spacing register (<code class="code">.v</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Vertical-Spacing.html">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Vertical-Spacing.html#index-vertical-line-spacing_002c-changing-_0028vs_0029">vertical line spacing, changing (<code class="code">vs</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Vertical-Spacing.html">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Vertical-Spacing.html#index-vertical-line-spacing_002c-effective-value">vertical line spacing, effective value</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Vertical-Spacing.html">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-vertical-motion-_0028_005cv_0029">vertical motion (<code class="code">\v</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-vertical-motion-quantum">vertical motion quantum</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-vertical-page-location_002c-marking-_0028mk_0029">vertical page location, marking (<code class="code">mk</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-vertical-page-location_002c-returning-to-marked-_0028rt_0029">vertical page location, returning to marked (<code class="code">rt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-vertical-position-in-diversion-register-_0028_002ed_0029">vertical position in diversion register (<code class="code">.d</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Vertical-Position-Traps.html#index-vertical-position-trap-enable-register-_0028_002evpt_0029">vertical position trap enable register (<code class="code">.vpt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Vertical-Position-Traps.html">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Vertical-Position-Traps.html#index-vertical-position-traps">vertical position traps</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Vertical-Position-Traps.html">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Vertical-Position-Traps.html#index-vertical-position-traps_002c-enabling-_0028vpt_0029">vertical position traps, enabling (<code class="code">vpt</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Vertical-Position-Traps.html">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-vertical-position_002c-drawing-_0028nl_0029">vertical position, drawing (<code class="code">nl</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-vertical-resolution">vertical resolution</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Measurements.html#index-vertical-space-unit-_0028v_0029">vertical space unit (<code class="code">v</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Measurements.html">Measurements</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Geometry.html#index-vertical-spacing">vertical spacing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Geometry.html">Page Geometry</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Type-Size-and-Vertical-Spacing.html#index-vertical-spacing-1">vertical spacing</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Type-Size-and-Vertical-Spacing.html">Manipulating Type Size and Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Basics.html#index-vertical-spacing-_0028introduction_0029">vertical spacing (introduction)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Basics.html">Basics</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-W">W</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-warning-categories">warning categories</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-warning-level-_0028warn_0029">warning level (<code class="code">warn</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-warnings">warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Warnings.html#index-warnings-1">warnings</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Warnings.html">Warnings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="What-Is-groff_003f.html#index-what-is-groff_003f">what is <code class="code">groff</code>?</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="What-Is-groff_003f.html">What Is <code class="code">groff</code>?</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="while.html#index-while">while</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="while.html">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-while-request_002c-and-font-translations"><code class="code">while</code> request, and font translations</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-while-request_002c-and-the-_0021-operator"><code class="code">while</code> request, and the &lsquo;<samp class="samp">!</samp>&rsquo; operator</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="while.html#index-while-request_002c-confusing-with-br"><code class="code">while</code> request, confusing with <code class="code">br</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="while.html">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Operators-in-Conditionals.html#index-while-request_002c-operators-to-use-with"><code class="code">while</code> request, operators to use with</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Operators-in-Conditionals.html">Operators in Conditionals</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-widow">widow</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-widow-1">widow</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-width-escape-_0028_005cw_0029">width escape (<code class="code">\w</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-width_002c-of-last-glyph-_0028_002ew_0029">width, of last glyph (<code class="code">.w</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-word-space-size-register-_0028_002ess_0029">word space size register (<code class="code">.ss</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Filling.html#index-word_002c-definition-of">word, definition of</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Filling.html">Filling</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-write-request_002c-and-copy-mode"><code class="code">write</code> request, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-writec-request_002c-and-copy-mode"><code class="code">writec</code> request, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-writem-request_002c-and-copy-mode"><code class="code">writem</code> request, and copy mode</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Writing-Macros.html#index-writing-macros">writing macros</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Writing-Macros.html">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-writing-to-file-_0028write_002c-writec_0029">writing to file (<code class="code">write</code>, <code class="code">writec</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-Y">Y</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-year_002c-current_002c-register-_0028year_002c-yr_0029">year, current, register (<code class="code">year</code>, <code class="code">yr</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-Z">Z</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-z-scaling-unit"><code class="code">z</code> scaling unit</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-zero_002dwidth-printing-_0028_005cz_002c-_005cZ_0029">zero-width printing (<code class="code">\z</code>, <code class="code">\Z</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-zero_002dwidth-printing-_0028_005cz_002c-_005cZ_0029-1">zero-width printing (<code class="code">\z</code>, <code class="code">\Z</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-zoom-factor-of-a-font-_0028fzoom_0029">zoom factor of a font (<code class="code">fzoom</code>)</a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table class="cp-letters-footer-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-1"><b>&quot;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-2"><b>%</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-3"><b>&amp;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-4"><b>'</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-5"><b>(</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-6"><b>)</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-7"><b>*</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-8"><b>+</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-9"><b>-</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-10"><b>.</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-11"><b>/</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-12"><b>8</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-13"><b>:</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-14"><b>&lt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-15"><b>=</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-16"><b>&gt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-17"><b>[</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-18"><b>\</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-19"><b>]</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_symbol-20"><b>|</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-J"><b>J</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-W"><b>W</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-Y"><b>Y</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Concept-Index_cp_letter-Z"><b>Z</b></a>
+ &nbsp;
+</td></tr></table>
+</div>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Previous: <a href="Program-and-File-Index.html">Program and File Index</a>, Up: <a href="index.html">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Conditional-Blocks.html b/doc/groff.html.node/Conditional-Blocks.html
new file mode 100644
index 0000000..b2b789b
--- /dev/null
+++ b/doc/groff.html.node/Conditional-Blocks.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Conditional Blocks (The GNU Troff Manual)</title>
+
+<meta name="description" content="Conditional Blocks (The GNU Troff Manual)">
+<meta name="keywords" content="Conditional Blocks (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Conditionals-and-Loops.html" rel="up" title="Conditionals and Loops">
+<link href="while.html" rel="next" title="while">
+<link href="Operators-in-Conditionals.html" rel="prev" title="Operators in Conditionals">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+kbd.key {font-style: normal}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Conditional-Blocks">
+<div class="nav-panel">
+<p>
+Next: <a href="while.html" accesskey="n" rel="next">while</a>, Previous: <a href="Operators-in-Conditionals.html" accesskey="p" rel="prev">Operators in Conditionals</a>, Up: <a href="Conditionals-and-Loops.html" accesskey="u" rel="up">Conditionals and Loops</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Conditional-Blocks-1">5.23.4 Conditional Blocks</h4>
+<a class="index-entry-id" id="index-conditional-blocks"></a>
+<a class="index-entry-id" id="index-blocks_002c-conditional"></a>
+
+<p>It is frequently desirable for a control structure to govern more than
+one request, macro call, text line, or a combination of the foregoing.
+The opening and closing brace escape sequences <code class="code">\{</code> and <code class="code">\}</code>
+define such groups. These <em class="dfn">conditional blocks</em> can furthermore be
+nested.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_007b-2"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\{</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_007b-2'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_007b"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_007d-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\}</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_007d-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_007b-1"></a>
+<a class="index-entry-id" id="index-_005c_007d"></a>
+<a class="index-entry-id" id="index-beginning-of-conditional-block-_0028_005c_007b_0029"></a>
+<a class="index-entry-id" id="index-end-of-conditional-block-_0028_005c_007d_0029"></a>
+<a class="index-entry-id" id="index-conditional-block_002c-beginning-_0028_005c_007b_0029"></a>
+<a class="index-entry-id" id="index-conditional-block_002c-end-_0028_005c_007d_0029"></a>
+<a class="index-entry-id" id="index-block_002c-conditional_002c-beginning-_0028_005c_007b_0029"></a>
+<a class="index-entry-id" id="index-block_002c-conditional_002c-end-_0028_005c_007d_0029"></a>
+<a class="index-entry-id" id="index-brace-escape-sequences-_0028_005c_007b_002c-_005c_007d_0029"></a>
+<a class="index-entry-id" id="index-escape-sequences_002c-brace-_0028_005c_007b_002c-_005c_007d_0029"></a>
+<a class="index-entry-id" id="index-opening-brace-escape-sequence-_0028_005c_007d_0029"></a>
+<a class="index-entry-id" id="index-closing-brace-escape-sequence-_0028_005c_007d_0029"></a>
+<a class="index-entry-id" id="index-brace-escape-sequence_002c-opening-_0028_005c_007d_0029"></a>
+<a class="index-entry-id" id="index-brace-escape-sequence_002c-closing-_0028_005c_007d_0029"></a>
+<p><code class="code">\{</code> begins a conditional block; it must appear (after optional
+spaces and tabs) immediately subsequent to the conditional expression of
+an <code class="code">if</code>, <code class="code">ie</code>, or <code class="code">while</code>
+request,<a class="footnote" id="DOCF93" href="groff.html_fot.html#FOOT93"><sup>93</sup></a> or as the argument to an <code class="code">el</code>
+request.
+</p>
+<p><code class="code">\}</code> ends a condition block and should appear on a line with other
+occurrences of itself as necessary to match <code class="code">\{</code> sequences. It
+can be preceded by a control character, spaces, and tabs. Input after
+any quantity of <code class="code">\}</code> sequences on the same line is processed only
+if all of the preceding conditions to which they correspond are true.
+Furthermore, a <code class="code">\}</code> closing the body of a <code class="code">while</code> request
+must be the last such escape sequence on an input line.
+</p>
+<p>Brace escape sequences outside of control structures have no meaning and
+produce no output.
+</p>
+<p><strong class="strong">Caution:</strong> Input lines using <code class="code">\{</code> often end with
+<code class="code">\RET</code>, especially in macros that consist primarily of control
+lines. Forgetting to use <code class="code">\RET</code> on an input line after <code class="code">\{</code>
+is a common source of error.
+</p></dd></dl>
+
+<p>We might write the following in a page header macro. If we delete
+<code class="code">\RET</code>, the header will carry an unwanted extra empty line (except
+on page&nbsp;1).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.if (\\n[%] != 1) \{\
+. ie ((\\n[%] % 2) = 0) .tl \\*[even-numbered-page-title]
+. el .tl \\*[odd-numbered-page-title]
+.\}
+</pre></div></div>
+
+<p>Let us take a closer look at how conditional blocks nest.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">A
+.if 0 \{ B
+C
+D
+\}E
+F
+ &rArr; A F
+</pre></div></div>
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">N
+.if 1 \{ O
+. if 0 \{ P
+Q
+R\} S\} T
+U
+ &rArr; N O U
+</pre></div></div>
+
+<p>The above behavior may challenge the intuition; it was implemented to
+retain compatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>. For clarity, it
+is idiomatic to end input lines with <code class="code">\{</code> (followed by
+<code class="code">\<kbd class="key">RET</kbd></code> if appropriate), and to precede <code class="code">\}</code> on an input
+line with nothing more than a control character, spaces, tabs, and other
+instances of itself.
+</p>
+<p>We can use <code class="code">ie</code>, <code class="code">el</code>, and conditional blocks to simulate the
+multi-way &ldquo;switch&rdquo; or &ldquo;case&rdquo; control structures of other languages.
+The following example is adapted from the <code class="code">groff</code> <samp class="file">man</samp>
+package. Indentation is used to clarify the logic.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.\&quot; Simulate switch/case in roff.
+. ie '\\$2'1' .ds title General Commands\&quot;
+.el \{.ie '\\$2'2' .ds title System Calls\&quot;
+.el \{.ie '\\$2'3' .ds title Library Functions\&quot;
+.el \{.ie '\\$2'4' .ds title Kernel Interfaces\&quot;
+.el \{.ie '\\$2'5' .ds title File Formats\&quot;
+.el \{.ie '\\$2'6' .ds title Games\&quot;
+.el \{.ie '\\$2'7' .ds title Miscellaneous Information\&quot;
+.el \{.ie '\\$2'8' .ds title System Management\&quot;
+.el \{.ie '\\$2'9' .ds title Kernel Development\&quot;
+.el .ds title \&quot; empty
+.\}\}\}\}\}\}\}\}
+</pre></div></div>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="while.html">while</a>, Previous: <a href="Operators-in-Conditionals.html">Operators in Conditionals</a>, Up: <a href="Conditionals-and-Loops.html">Conditionals and Loops</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Conditionals-and-Loops.html b/doc/groff.html.node/Conditionals-and-Loops.html
new file mode 100644
index 0000000..b05ce5d
--- /dev/null
+++ b/doc/groff.html.node/Conditionals-and-Loops.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Conditionals and Loops (The GNU Troff Manual)</title>
+
+<meta name="description" content="Conditionals and Loops (The GNU Troff Manual)">
+<meta name="keywords" content="Conditionals and Loops (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Writing-Macros.html" rel="next" title="Writing Macros">
+<link href="Strings.html" rel="prev" title="Strings">
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Conditionals-and-Loops">
+<div class="nav-panel">
+<p>
+Next: <a href="Writing-Macros.html" accesskey="n" rel="next">Writing Macros</a>, Previous: <a href="Strings.html" accesskey="p" rel="prev">Strings</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Conditionals-and-Loops-1">5.23 Conditionals and Loops</h3>
+<a class="index-entry-id" id="index-conditionals-and-loops"></a>
+<a class="index-entry-id" id="index-loops-and-conditionals"></a>
+
+<p><code class="code">groff</code> has <code class="code">if</code> and <code class="code">while</code> control structures like
+other languages. However, the syntax for grouping multiple input lines
+in the branches or bodies of these structures is unusual.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="Operators-in-Conditionals.html" accesskey="1">Operators in Conditionals</a></li>
+<li><a href="if_002dthen.html" accesskey="2">if-then</a></li>
+<li><a href="if_002delse.html" accesskey="3">if-else</a></li>
+<li><a href="Conditional-Blocks.html" accesskey="4">Conditional Blocks</a></li>
+<li><a href="while.html" accesskey="5">while</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Configuration-and-Customization.html b/doc/groff.html.node/Configuration-and-Customization.html
new file mode 100644
index 0000000..6f76a47
--- /dev/null
+++ b/doc/groff.html.node/Configuration-and-Customization.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Configuration and Customization (The GNU Troff Manual)</title>
+
+<meta name="description" content="Configuration and Customization (The GNU Troff Manual)">
+<meta name="keywords" content="Configuration and Customization (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Common-Features.html" rel="up" title="Common Features">
+<link href="Preprocessor-Support.html" rel="prev" title="Preprocessor Support">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Configuration-and-Customization">
+<div class="nav-panel">
+<p>
+Previous: <a href="Preprocessor-Support.html" accesskey="p" rel="prev">Preprocessor Support</a>, Up: <a href="Common-Features.html" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Configuration-and-Customization-1">3.2.14 Configuration and Customization</h4>
+
+<p>Packages provide means of customizing many of the details of how the
+package behaves. These range from setting the default type size to
+changing the appearance of section headers.
+</p>
+
+
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Control-Characters.html b/doc/groff.html.node/Control-Characters.html
new file mode 100644
index 0000000..13ebe41
--- /dev/null
+++ b/doc/groff.html.node/Control-Characters.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Control Characters (The GNU Troff Manual)</title>
+
+<meta name="description" content="Control Characters (The GNU Troff Manual)">
+<meta name="keywords" content="Control Characters (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Formatter-Instructions.html" rel="up" title="Formatter Instructions">
+<link href="Invoking-Requests.html" rel="next" title="Invoking Requests">
+<link href="Formatter-Instructions.html" rel="prev" title="Formatter Instructions">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Control-Characters">
+<div class="nav-panel">
+<p>
+Next: <a href="Invoking-Requests.html" accesskey="n" rel="next">Invoking Requests</a>, Previous: <a href="Formatter-Instructions.html" accesskey="p" rel="prev">Formatter Instructions</a>, Up: <a href="Formatter-Instructions.html" accesskey="u" rel="up">Formatter Instructions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Control-Characters-1">5.6.1 Control Characters</h4>
+<a class="index-entry-id" id="index-control-characters"></a>
+<a class="index-entry-id" id="index-configuring-control-characters"></a>
+<a class="index-entry-id" id="index-changing-control-characters"></a>
+
+<p>The mechanism of using <code class="code">roff</code>&rsquo;s control characters to invoke
+requests and call macros was introduced in <a class="ref" href="Requests-and-Macros.html">Requests and Macros</a>.
+Control characters are recognized only at the beginning of an input
+line, or at the beginning of the branch of a control structure request;
+see <a class="ref" href="Conditionals-and-Loops.html">Conditionals and Loops</a>.
+</p>
+<p>A few requests cause a break implicitly; use the no-break control
+character to prevent the break. Break suppression is its sole
+behavioral distinction. Employing the no-break control character to
+invoke requests that don&rsquo;t cause breaks is harmless but poor style.
+See <a class="xref" href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a>.
+</p>
+<a class="index-entry-id" id="index-control-character_002c-changing-_0028cc_0029"></a>
+<a class="index-entry-id" id="index-character_002c-control_002c-changing-_0028cc_0029"></a>
+<a class="index-entry-id" id="index-no_002dbreak-control-character_002c-changing-_0028c2_0029"></a>
+<a class="index-entry-id" id="index-character_002c-no_002dbreak-control_002c-changing-_0028c2_0029"></a>
+<a class="index-entry-id" id="index-control-character_002c-no_002dbreak_002c-changing-_0028c2_0029"></a>
+<p>The control &lsquo;<samp class="samp">.</samp>&rsquo; and no-break control &lsquo;<samp class="samp">'</samp>&rsquo; characters can each
+be changed to any ordinary character<a class="footnote" id="DOCF42" href="groff.html_fot.html#FOOT42"><sup>42</sup></a>
+with the <code class="code">cc</code> and <code class="code">c2</code> requests, respectively.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ecc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.cc</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">o</i></span>]</var><a class="copiable-link" href='#index-_002ecc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-cc"></a>
+<p>Recognize the ordinary character&nbsp;<var class="var">o</var> as the control character.
+If&nbsp;<var class="var">o</var> is absent or invalid, the default control character
+&lsquo;<samp class="samp">.</samp>&rsquo; is selected. The identity of the control character is
+associated with the environment (see <a class="pxref" href="Environments.html">Environments</a>).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ec2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.c2</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">o</i></span>]</var><a class="copiable-link" href='#index-_002ec2'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-c2"></a>
+<p>Recognize the ordinary character&nbsp;<var class="var">o</var> as the no-break control
+character. If&nbsp;<var class="var">o</var> is absent or invalid, the default no-break
+control character &lsquo;<samp class="samp">'</samp>&rsquo; is selected. The identity of the no-break
+control character is associated with the environment
+(see <a class="pxref" href="Environments.html">Environments</a>).
+</p></dd></dl>
+
+<p>When writing a macro, you might wish to know which control character was
+used to call it.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002ebr_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.br]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ebr_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ebr-1"></a>
+<p>This read-only register interpolates&nbsp;1 if the currently executing
+macro was called using the normal control character and&nbsp;0
+otherwise. If a macro is interpolated as a string, the <code class="code">.br</code>
+register&rsquo;s value is inherited from the context of the string
+interpolation. See <a class="xref" href="Strings.html">Strings</a>.
+</p>
+<a class="index-entry-id" id="index-intercepting-requests"></a>
+<a class="index-entry-id" id="index-requests_002c-intercepting"></a>
+<a class="index-entry-id" id="index-modifying-requests"></a>
+<a class="index-entry-id" id="index-requests_002c-modifying"></a>
+<p>Use this register to reliably intercept requests that imply breaks.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.als bp*orig bp
+.de bp
+. ie \\n[.br] .bp*orig
+. el 'bp*orig
+..
+</pre></div></div>
+
+<p>Testing the <code class="code">.br</code> register outside of a macro definition makes no
+sense.
+</p></dd></dl>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Invoking-Requests.html">Invoking Requests</a>, Previous: <a href="Formatter-Instructions.html">Formatter Instructions</a>, Up: <a href="Formatter-Instructions.html">Formatter Instructions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Conventions-Used-in-This-Manual.html b/doc/groff.html.node/Conventions-Used-in-This-Manual.html
new file mode 100644
index 0000000..95e85b3
--- /dev/null
+++ b/doc/groff.html.node/Conventions-Used-in-This-Manual.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Conventions Used in This Manual (The GNU Troff Manual)</title>
+
+<meta name="description" content="Conventions Used in This Manual (The GNU Troff Manual)">
+<meta name="keywords" content="Conventions Used in This Manual (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Introduction.html" rel="up" title="Introduction">
+<link href="Credits.html" rel="next" title="Credits">
+<link href="Installation.html" rel="prev" title="Installation">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Conventions-Used-in-This-Manual">
+<div class="nav-panel">
+<p>
+Next: <a href="Credits.html" accesskey="n" rel="next">Credits</a>, Previous: <a href="Installation.html" accesskey="p" rel="prev">Installation</a>, Up: <a href="Introduction.html" accesskey="u" rel="up">Introduction</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Conventions-Used-in-This-Manual-1">1.8 Conventions Used in This Manual</h3>
+
+<p>We apply the term &ldquo;groff&rdquo; to the language documented here, the GNU
+implementation of the overall system, the project that develops that
+system, and the command of that name. In the first sense, <code class="code">groff</code>
+is an extended dialect of the <code class="code">roff</code> language, for which many
+similar implementations exist.
+</p>
+<p>The <code class="code">roff</code> language features several major categories for which
+many items are predefined. Presentations of these items feature the
+form in which the item is most commonly used on the left, and, aligned
+to the right margin, the name of the category in brackets.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bexample_005d"><span class="category-def">Register: </span><span><strong class="def-name">\n[example]</strong><a class="copiable-link" href='#index-_005cn_005bexample_005d'> &para;</a></span></dt>
+<dd><p>The register &lsquo;<samp class="samp">example</samp>&rsquo; is one that that <code class="code">groff</code> <em class="emph">doesn&rsquo;t</em>
+predefine. You can create it yourself, though; see <a class="ref" href="Setting-Registers.html">Setting Registers</a>.
+</p></dd></dl>
+
+<p>To make this document useful as a reference and not merely amiable
+bedtime reading, we tend to present these syntax items in exhaustive
+detail when they arise. References to topics discussed later in the
+text are frequent; skip material you don&rsquo;t understand yet.
+</p>
+<p>We use Texinfo&rsquo;s &ldquo;result&rdquo; (&rArr;) and error&rarr; notations to
+present output written to the standard output and standard error
+streams, respectively. Diagnostic messages from the GNU <code class="code">troff</code>
+formatter and other programs are examples of the latter, but the
+formatter can also be directed to write user-specified messages to the
+standard error stream. The notation then serves to identify the
+output stream and does not necessarily mean that an error has
+occurred.<a class="footnote" id="DOCF2" href="groff.html_fot.html#FOOT2"><sup>2</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">$ echo &quot;Twelve o'clock and&quot; | groff -Tascii | sed '/^$/d'
+ &rArr; Twelve o'clock and
+$ echo '.tm all is well.' | groff &gt; /dev/null
+ error&rarr; all is well.
+</pre></div></div>
+
+<p>Sometimes we use &rArr; somewhat abstractly to represent formatted
+text that you will need to use a PostScript or PDF viewer program (or a
+printer) to observe. While arguably an abuse of notation, we think this
+preferable to requiring the reader to understand the syntax of these
+page description languages.
+</p>
+<p>We also present diagnostic messages in an abbreviated form, often
+omitting the name of the program issuing them, the input file name, and
+line number or other positional information when such data do not serve
+to illuminate the topic under discussion.
+</p>
+<p>Most examples are of <code class="code">roff</code> language input that would be placed in
+a text file. Occasionally, we start an example with a &lsquo;<samp class="samp">$</samp>&rsquo;
+character to indicate a shell prompt, as seen above.
+</p>
+<p>You are encouraged to try the examples yourself, and to alter them to
+better learn <code class="code">groff</code>&rsquo;s behavior. Our examples frequently need to
+direct the formatter to set a line length (with &lsquo;<samp class="samp">.ll</samp>&rsquo;) that will
+fit within the page margins of this manual. We mention this so that you
+know why it is there before we discuss the <code class="code">ll</code> request
+formally.<a class="footnote" id="DOCF3" href="groff.html_fot.html#FOOT3"><sup>3</sup></a>
+</p>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Credits.html">Credits</a>, Previous: <a href="Installation.html">Installation</a>, Up: <a href="Introduction.html">Introduction</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Copy-Mode.html b/doc/groff.html.node/Copy-Mode.html
new file mode 100644
index 0000000..cc7de66
--- /dev/null
+++ b/doc/groff.html.node/Copy-Mode.html
@@ -0,0 +1,256 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Copy Mode (The GNU Troff Manual)</title>
+
+<meta name="description" content="Copy Mode (The GNU Troff Manual)">
+<meta name="keywords" content="Copy Mode (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Writing-Macros.html" rel="up" title="Writing Macros">
+<link href="Parameters.html" rel="prev" title="Parameters">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+kbd.key {font-style: normal}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Copy-Mode">
+<div class="nav-panel">
+<p>
+Previous: <a href="Parameters.html" accesskey="p" rel="prev">Parameters</a>, Up: <a href="Writing-Macros.html" accesskey="u" rel="up">Writing Macros</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Copy-Mode-1">5.24.2 Copy Mode</h4>
+<a class="index-entry-id" id="index-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode-1"></a>
+<a class="index-entry-id" id="index-mode_002c-copy"></a>
+<a class="index-entry-id" id="index-mode_002c-copy-1"></a>
+
+<a class="index-entry-id" id="index-_005cn_002c-when-reading-text-for-a-macro"></a>
+<a class="index-entry-id" id="index-_005c_0024_002c-when-reading-text-for-a-macro"></a>
+<a class="index-entry-id" id="index-_005c_002a_002c-when-reading-text-for-a-macro"></a>
+<a class="index-entry-id" id="index-_005cRET_002c-when-reading-text-for-a-macro"></a>
+<p>When GNU <code class="code">troff</code> processes certain requests, most importantly those
+which define or append to a macro or string, it does so in <em class="dfn">copy
+mode</em>: it copies the characters of the definition into a dedicated
+storage region, interpolating the escape sequences <code class="code">\n</code>, <code class="code">\g</code>,
+<code class="code">\$</code>, <code class="code">\*</code>, <code class="code">\V</code>, and <code class="code">\?</code> normally; interpreting
+<code class="code">\<kbd class="key">RET</kbd></code> immediately; discarding comments <code class="code">\&quot;</code> and
+<code class="code">\#</code>; interpolating the current leader, escape, or tab character
+with <code class="code">\a</code>, <code class="code">\e</code>, and <code class="code">\t</code>, respectively; and storing all
+other escape sequences in an encoded form.
+</p>
+<a class="index-entry-id" id="index-interpretation-mode"></a>
+<a class="index-entry-id" id="index-mode_002c-interpretation"></a>
+<p>The complement of copy mode&mdash;a <code class="code">roff</code> formatter&rsquo;s behavior when
+not defining or appending to a macro, string, or diversion&mdash;where all
+macros are interpolated, requests invoked, and valid escape sequences
+processed immediately upon recognition, can be termed
+<em class="dfn">interpretation mode</em>.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_005c-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\\</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_005c-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_005c"></a>
+<p>The escape character, <code class="code">\</code> by default, can escape itself. This
+enables you to control whether a given <code class="code">\n</code>, <code class="code">\g</code>, <code class="code">\$</code>,
+<code class="code">\*</code>, <code class="code">\V</code>, or <code class="code">\?</code> escape sequence is interpreted at the
+time the macro containing it is defined, or later when the macro is
+called.<a class="footnote" id="DOCF101" href="groff.html_fot.html#FOOT101"><sup>101</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr x 20
+.de y
+.nr x 10
+\&amp;\nx
+\&amp;\\nx
+..
+.y
+ &rArr; 20 10
+</pre></div></div>
+
+<p>You can think of <code class="code">\\</code> as a &ldquo;delayed&rdquo; backslash; it is the escape
+character followed by a backslash from which the escape character has
+removed its special meaning. Consequently, &lsquo;<samp class="samp">\\</samp>&rsquo; is not an escape
+sequence in the usual sense. In any escape sequence &lsquo;<samp class="samp">\<var class="var">X</var></samp>&rsquo;
+that GNU <code class="code">troff</code> does not recognize, the escape character is
+ignored and <var class="var">X</var> is output. An unrecognized escape sequence causes
+a warning in category &lsquo;<samp class="samp">escape</samp>&rsquo;, with two exceptions&mdash;&lsquo;<samp class="samp">\\</samp>&rsquo; is
+the first.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-_005c_005c_002c-when-reading-text-for-a-macro"></a>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002e-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\.</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_002e-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_002e"></a>
+<p><code class="code">\.</code> escapes the control character. It is similar to <code class="code">\\</code> in
+that it isn&rsquo;t a true escape sequence. It is used to permit nested macro
+definitions to end without a named macro call to conclude them. Without
+a syntax for escaping the control character, this would not be possible.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de m1
+foo
+.
+. de m2
+bar
+\\..
+.
+..
+.m1
+.m2
+ &rArr; foo bar
+</pre></div></div>
+
+<p>The first backslash is consumed while the macro is read, and the second
+is interpreted when macro <code class="code">m1</code> is called.
+</p></dd></dl>
+
+<p><code class="code">roff</code> documents should not use the <code class="code">\\</code> or <code class="code">\.</code>
+character sequences outside of copy mode; they serve only to obfuscate
+the input. Use <code class="code">\e</code> to represent the escape character,
+<code class="code">\[rs]</code> to obtain a backslash glyph, and <code class="code">\&amp;</code> before &lsquo;<samp class="samp">.</samp>&rsquo;
+and &lsquo;<samp class="samp">'</samp>&rsquo; where GNU <code class="code">troff</code> expects them as control characters
+if you mean to use them literally (recall <a class="ref" href="Requests-and-Macros.html">Requests and Macros</a>).
+</p>
+<p>Macro definitions can be nested to arbitrary depth. The mechanics of
+parsing the escape character have significant consequences for this
+practice.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de M1
+\\$1
+. de M2
+\\\\$1
+. de M3
+\\\\\\\\$1
+\\\\..
+. M3 hand.
+\\..
+. M2 of
+..
+This understeer is getting
+.M1 out
+ &rArr; This understeer is getting out of hand.
+</pre></div></div>
+
+<p>Each escape character is interpreted twice&mdash;once in copy mode, when the
+macro is defined, and once in interpretation mode, when the macro is
+called. As seen above, this fact leads to exponential growth in the
+quantity of escape characters required to delay interpolation of
+<code class="code">\n</code>, <code class="code">\g</code>, <code class="code">\$</code>, <code class="code">\*</code>, <code class="code">\V</code>, and <code class="code">\?</code> at
+each nesting level, which can be daunting. GNU <code class="code">troff</code> offers a
+solution.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cE-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\E</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cE-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cE"></a>
+<p><code class="code">\E</code> represents an escape character that is not interpreted in copy
+mode. You can use it to ease the writing of nested macro definitions.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de M1
+. nop \E$1
+. de M2
+. nop \E$1
+. de M3
+. nop \E$1
+\\\\..
+. M3 better.
+\\..
+. M2 bit
+..
+This vehicle handles
+.M1 a
+ &rArr; This vehicle handles a bit better.
+</pre></div></div>
+
+<p>Observe that because <code class="code">\.</code> is not a true escape sequence, we can&rsquo;t
+use <code class="code">\E</code> to keep &lsquo;<samp class="samp">..</samp>&rsquo; from ending a macro definition
+prematurely. If the multiplicity of backslashes complicates
+maintenance, use end macros.
+</p>
+<p><code class="code">\E</code> is also convenient to define strings containing escape
+sequences that need to work when used in copy mode (for example, as
+macro arguments), or which will be interpolated at varying macro nesting
+depths. We might define strings to begin and end superscripting
+as follows.<a class="footnote" id="DOCF102" href="groff.html_fot.html#FOOT102"><sup>102</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds { \v'-.9m\s'\En[.s]*7u/10u'+.7m'
+.ds } \v'-.7m\s0+.9m'
+</pre></div></div>
+
+<p>When the <code class="code">ec</code> request is used to redefine the escape character,
+<code class="code">\E</code> also makes it easier to distinguish the semantics of an escape
+character from the other meaning(s) its character might have. Consider
+the use of an unusual escape character, &lsquo;<samp class="samp">-</samp>&rsquo;.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a 1
+.ec -
+.de xx
+--na
+..
+.xx
+ &rArr; -na
+</pre></div></div>
+
+<p>This result may surprise you; some people expect &lsquo;<samp class="samp">1</samp>&rsquo; to be output
+since register &lsquo;<samp class="samp">a</samp>&rsquo; has clearly been defined with that value. What
+has happened? The robotic replacement of &lsquo;<samp class="samp">\</samp>&rsquo; with &lsquo;<samp class="samp">-</samp>&rsquo; has led
+us astray. You might recognize the sequence &lsquo;<samp class="samp">--</samp>&rsquo; more readily with
+the default escape character as &lsquo;<samp class="samp">\-</samp>&rsquo;, the special character escape
+sequence for the minus sign glyph.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a 1
+.ec -
+.de xx
+-Ena
+..
+.xx
+ &rArr; 1
+</pre></div></div>
+</dd></dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Previous: <a href="Parameters.html">Parameters</a>, Up: <a href="Writing-Macros.html">Writing Macros</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Copying-This-Manual.html b/doc/groff.html.node/Copying-This-Manual.html
new file mode 100644
index 0000000..47c4c3e
--- /dev/null
+++ b/doc/groff.html.node/Copying-This-Manual.html
@@ -0,0 +1,534 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Copying This Manual (The GNU Troff Manual)</title>
+
+<meta name="description" content="Copying This Manual (The GNU Troff Manual)">
+<meta name="keywords" content="Copying This Manual (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="index.html" rel="up" title="Top">
+<link href="Request-Index.html" rel="next" title="Request Index">
+<link href="Font-Description-File-Format.html" rel="prev" title="Font Description File Format">
+<style type="text/css">
+<!--
+div.center {text-align:center}
+div.display {margin-left: 3.2em}
+div.example {margin-left: 3.2em}
+pre.display-preformatted {font-family: inherit}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="appendix-level-extent" id="Copying-This-Manual">
+<div class="nav-panel">
+<p>
+Next: <a href="Request-Index.html" accesskey="n" rel="next">Request Index</a>, Previous: <a href="Font-Description-File-Format.html" accesskey="p" rel="prev">Font Description File Format</a>, Up: <a href="index.html" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h2 class="appendix" id="Copying-This-Manual-1">Appendix A Copying This Manual</h2>
+
+<div class="center">Version 1.3, 3 November 2008
+</div>
+
+<div class="display">
+<pre class="display-preformatted">Copyright &copy; 2000-2018 Free Software Foundation, Inc.
+<a class="uref" href="http://fsf.org/">http://fsf.org/</a>
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+</pre></div>
+
+<ol class="enumerate" start="0">
+<li> PREAMBLE
+
+<p>The purpose of this License is to make a manual, textbook, or other
+functional and useful document <em class="dfn">free</em> 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.
+</p>
+<p>This License is a kind of &ldquo;copyleft&rdquo;, 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.
+</p>
+<p>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.
+</p>
+</li><li> APPLICABILITY AND DEFINITIONS
+
+<p>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 &ldquo;Document&rdquo;, below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as &ldquo;you&rdquo;. You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+</p>
+<p>A &ldquo;Modified Version&rdquo; 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.
+</p>
+<p>A &ldquo;Secondary Section&rdquo; 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&rsquo;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.
+</p>
+<p>The &ldquo;Invariant Sections&rdquo; 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.
+</p>
+<p>The &ldquo;Cover Texts&rdquo; 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.
+</p>
+<p>A &ldquo;Transparent&rdquo; 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 &ldquo;Transparent&rdquo; is called &ldquo;Opaque&rdquo;.
+</p>
+<p>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.
+</p>
+<p>The &ldquo;Title Page&rdquo; 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, &ldquo;Title Page&rdquo; means
+the text near the most prominent appearance of the work&rsquo;s title,
+preceding the beginning of the body of the text.
+</p>
+<p>The &ldquo;publisher&rdquo; means any person or entity that distributes copies
+of the Document to the public.
+</p>
+<p>A section &ldquo;Entitled XYZ&rdquo; 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 &ldquo;Acknowledgements&rdquo;,
+&ldquo;Dedications&rdquo;, &ldquo;Endorsements&rdquo;, or &ldquo;History&rdquo;.) To &ldquo;Preserve the Title&rdquo;
+of such a section when you modify the Document means that it remains a
+section &ldquo;Entitled XYZ&rdquo; according to this definition.
+</p>
+<p>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.
+</p>
+</li><li> VERBATIM COPYING
+
+<p>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.
+</p>
+<p>You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+</p>
+</li><li> COPYING IN QUANTITY
+
+<p>If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document&rsquo;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.
+</p>
+<p>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.
+</p>
+<p>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.
+</p>
+<p>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.
+</p>
+</li><li> MODIFICATIONS
+
+<p>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:
+</p>
+<ol class="enumerate" type="A" start="1">
+<li> 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.
+
+</li><li> 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.
+
+</li><li> State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+</li><li> Preserve all the copyright notices of the Document.
+
+</li><li> Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+</li><li> 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.
+
+</li><li> Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document&rsquo;s license notice.
+
+</li><li> Include an unaltered copy of this License.
+
+</li><li> Preserve the section Entitled &ldquo;History&rdquo;, 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 &ldquo;History&rdquo; 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.
+
+</li><li> 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 &ldquo;History&rdquo; 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.
+
+</li><li> For any section Entitled &ldquo;Acknowledgements&rdquo; or &ldquo;Dedications&rdquo;, 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.
+
+</li><li> 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.
+
+</li><li> Delete any section Entitled &ldquo;Endorsements&rdquo;. Such a section
+may not be included in the Modified Version.
+
+</li><li> Do not retitle any existing section to be Entitled &ldquo;Endorsements&rdquo; or
+to conflict in title with any Invariant Section.
+
+</li><li> Preserve any Warranty Disclaimers.
+</li></ol>
+
+<p>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&rsquo;s license notice.
+These titles must be distinct from any other section titles.
+</p>
+<p>You may add a section Entitled &ldquo;Endorsements&rdquo;, provided it contains
+nothing but endorsements of your Modified Version by various
+parties&mdash;for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+</p>
+<p>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.
+</p>
+<p>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.
+</p>
+</li><li> COMBINING DOCUMENTS
+
+<p>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.
+</p>
+<p>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.
+</p>
+<p>In the combination, you must combine any sections Entitled &ldquo;History&rdquo;
+in the various original documents, forming one section Entitled
+&ldquo;History&rdquo;; likewise combine any sections Entitled &ldquo;Acknowledgements&rdquo;,
+and any sections Entitled &ldquo;Dedications&rdquo;. You must delete all
+sections Entitled &ldquo;Endorsements.&rdquo;
+</p>
+</li><li> COLLECTIONS OF DOCUMENTS
+
+<p>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.
+</p>
+<p>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.
+</p>
+</li><li> AGGREGATION WITH INDEPENDENT WORKS
+
+<p>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 &ldquo;aggregate&rdquo; if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation&rsquo;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.
+</p>
+<p>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&rsquo;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.
+</p>
+</li><li> TRANSLATION
+
+<p>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.
+</p>
+<p>If a section in the Document is Entitled &ldquo;Acknowledgements&rdquo;,
+&ldquo;Dedications&rdquo;, or &ldquo;History&rdquo;, the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+</p>
+</li><li> TERMINATION
+
+<p>You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+</p>
+<p>However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+</p>
+<p>Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+</p>
+<p>Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+</p>
+</li><li> FUTURE REVISIONS OF THIS LICENSE
+
+<p>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
+<a class="uref" href="http://www.gnu.org/copyleft/">http://www.gnu.org/copyleft/</a>.
+</p>
+<p>Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License &ldquo;or any later version&rdquo; 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. If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy&rsquo;s public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+</p>
+</li><li> RELICENSING
+
+<p>&ldquo;Massive Multiauthor Collaboration Site&rdquo; (or &ldquo;MMC Site&rdquo;) means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works. A
+public wiki that anybody can edit is an example of such a server. A
+&ldquo;Massive Multiauthor Collaboration&rdquo; (or &ldquo;MMC&rdquo;) contained in the
+site means any set of copyrightable works thus published on the MMC
+site.
+</p>
+<p>&ldquo;CC-BY-SA&rdquo; means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+</p>
+<p>&ldquo;Incorporate&rdquo; means to publish or republish a Document, in whole or
+in part, as part of another Document.
+</p>
+<p>An MMC is &ldquo;eligible for relicensing&rdquo; if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole
+or in part into the MMC, (1) had no cover texts or invariant sections,
+and (2) were thus incorporated prior to November 1, 2008.
+</p>
+<p>The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+</p>
+</li></ol>
+
+<h3 class="heading" id="ADDENDUM_003a-How-to-use-this-License-for-your-documents">ADDENDUM: How to use this License for your documents</h3>
+
+<p>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:
+</p>
+<div class="example smallexample">
+<div class="group"><pre class="example-preformatted"> Copyright (C) <var class="var">year</var> <var class="var">your name</var>.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ 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''.
+</pre></div></div>
+
+<p>If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the &ldquo;with&hellip;Texts.&rdquo; line with this:
+</p>
+<div class="example smallexample">
+<div class="group"><pre class="example-preformatted"> with the Invariant Sections being <var class="var">list their titles</var>, with
+ the Front-Cover Texts being <var class="var">list</var>, and with the Back-Cover Texts
+ being <var class="var">list</var>.
+</pre></div></div>
+
+<p>If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+</p>
+<p>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.
+</p>
+
+
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Request-Index.html">Request Index</a>, Previous: <a href="Font-Description-File-Format.html">Font Description File Format</a>, Up: <a href="index.html">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Credits.html b/doc/groff.html.node/Credits.html
new file mode 100644
index 0000000..4f46327
--- /dev/null
+++ b/doc/groff.html.node/Credits.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Credits (The GNU Troff Manual)</title>
+
+<meta name="description" content="Credits (The GNU Troff Manual)">
+<meta name="keywords" content="Credits (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Introduction.html" rel="up" title="Introduction">
+<link href="Conventions-Used-in-This-Manual.html" rel="prev" title="Conventions Used in This Manual">
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Credits">
+<div class="nav-panel">
+<p>
+Previous: <a href="Conventions-Used-in-This-Manual.html" accesskey="p" rel="prev">Conventions Used in This Manual</a>, Up: <a href="Introduction.html" accesskey="u" rel="up">Introduction</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Credits-1">1.9 Credits</h3>
+<a class="index-entry-id" id="index-credits"></a>
+
+<p>We adapted portions of this manual from existing documents. James
+Clark&rsquo;s man pages were an essential resource; we have updated them in
+parallel with the development of this manual. We based the tutorial for
+macro users on Eric Allman&rsquo;s introduction to his <samp class="file">me</samp> macro package
+(which we also provide, little altered from 4.4BSD). Larry Kollar
+contributed much of the material on the <samp class="file">ms</samp> macro package.
+</p>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/DESC-File-Format.html b/doc/groff.html.node/DESC-File-Format.html
new file mode 100644
index 0000000..11e1b73
--- /dev/null
+++ b/doc/groff.html.node/DESC-File-Format.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>DESC File Format (The GNU Troff Manual)</title>
+
+<meta name="description" content="DESC File Format (The GNU Troff Manual)">
+<meta name="keywords" content="DESC File Format (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Device-and-Font-Description-Files.html" rel="up" title="Device and Font Description Files">
+<link href="Font-Description-File-Format.html" rel="next" title="Font Description File Format">
+<link href="Device-and-Font-Description-Files.html" rel="prev" title="Device and Font Description Files">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="DESC-File-Format">
+<div class="nav-panel">
+<p>
+Next: <a href="Font-Description-File-Format.html" accesskey="n" rel="next">Font Description File Format</a>, Previous: <a href="Device-and-Font-Description-Files.html" accesskey="p" rel="prev">Device and Font Description Files</a>, Up: <a href="Device-and-Font-Description-Files.html" accesskey="u" rel="up">Device and Font Description Files</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="DESC-File-Format-1">6.2.1 <samp class="file">DESC</samp> File Format</h4>
+<a class="index-entry-id" id="index-DESC-file-format"></a>
+<a class="index-entry-id" id="index-font-description-file-format"></a>
+<a class="index-entry-id" id="index-format-of-font-description-file"></a>
+
+<p>The <samp class="file">DESC</samp> file contains a series of directives; each begins a
+line. Their order is not important, with two exceptions: (1) the
+<code class="code">res</code> directive must precede any <code class="code">papersize</code> directive; and
+(2) the <code class="code">charset</code> directive must come last (if at all). If a
+directive name is repeated, later entries in the file override previous
+ones (except that the paper dimensions are computed based on the
+<code class="code">res</code> directive last seen when <code class="code">papersize</code> is encountered).
+Spaces and/or tabs separate words and are ignored at line boundaries.
+<a class="index-entry-id" id="index-comments-in-device-description-files"></a>
+<a class="index-entry-id" id="index-device-description-files_002c-comments"></a>
+<a class="index-entry-id" id="index-_0023"></a>
+Comments start with the &lsquo;<samp class="samp">#</samp>&rsquo; character and extend to the end of a
+line. Empty lines are ignored.
+</p>
+<dl class="table">
+<dt id='index-family-1'><span><code class="code">family <var class="var">fam</var></code><a class="copiable-link" href='#index-family-1'> &para;</a></span></dt>
+<dd><p>The default font family is <var class="var">fam</var>.
+</p>
+</dd>
+<dt id='index-fonts-2'><span><code class="code">fonts <var class="var">n</var> <var class="var">F1</var> <span class="r">&hellip;</span> <var class="var">Fn</var></code><a class="copiable-link" href='#index-fonts-2'> &para;</a></span></dt>
+<dd><p>Fonts <var class="var">F1</var>, &hellip;, <var class="var">Fn</var> are mounted at font positions
+<var class="var">m</var>+1, &hellip;, <var class="var">m</var>+<var class="var">n</var> where <var class="var">m</var> is the number of
+<code class="code">styles</code> (see below). This directive may extend over more than one
+line. A font name of&nbsp;<code class="code">0</code> causes no font to be mounted at the
+corresponding position.
+</p>
+</dd>
+<dt id='index-hor'><span><code class="code">hor <var class="var">n</var></code><a class="copiable-link" href='#index-hor'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-horizontal-motion-quantum"></a>
+<a class="index-entry-id" id="index-motion-quantum_002c-horizontal"></a>
+<a class="index-entry-id" id="index-quantum_002c-horizontal-motion"></a>
+<a class="index-entry-id" id="index-horizontal-resolution"></a>
+<a class="index-entry-id" id="index-resolution_002c-horizontal"></a>
+<p>The horizontal motion quantum is <var class="var">n</var>&nbsp;basic units. All
+horizontal quantities are rounded to multiples of&nbsp;<var class="var">n</var>.
+</p>
+</dd>
+<dt id='index-image_005fgenerator'><span><code class="code">image_generator <var class="var">program</var></code><a class="copiable-link" href='#index-image_005fgenerator'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PostScript_002c-PNG-image-generation"></a>
+<a class="index-entry-id" id="index-PNG-image-generation-from-PostScript"></a>
+<p>Use <var class="var">program</var> to generate PNG images from PostScript input. Under
+GNU/Linux, this is usually <code class="code">gs</code>, but under other systems (notably
+Cygwin) it might be set to another name. The <code class="code">grohtml</code> driver uses
+this directive.
+</p>
+</dd>
+<dt id='index-paperlength'><span><code class="code">paperlength <var class="var">n</var></code><a class="copiable-link" href='#index-paperlength'> &para;</a></span></dt>
+<dd><p>The vertical dimension of the output medium is <var class="var">n</var>&nbsp;basic units
+(deprecated: use <code class="code">papersize</code> instead).
+</p>
+</dd>
+<dt id='index-papersize'><span><code class="code">papersize <var class="var">format-or-dimension-pair-or-file-name</var> <span class="r">&hellip;</span></code><a class="copiable-link" href='#index-papersize'> &para;</a></span></dt>
+<dd><p>The dimensions of the output medium are as according to the
+argument, which is either a standard paper format, a pair of dimensions,
+or the name of a plain text file containing either of the foregoing.
+</p>
+<p>Recognized paper formats are the ISO and DIN formats
+<code class="code">A0</code>&ndash;<code class="code">A7</code>, <code class="code">B0</code>&ndash;<code class="code">B7</code>, <code class="code">C0</code>&ndash;<code class="code">C7</code>,
+<code class="code">D0</code>&ndash;<code class="code">D7</code>; the U.S. paper types <code class="code">letter</code>,
+<code class="code">legal</code>, <code class="code">tabloid</code>, <code class="code">ledger</code>, <code class="code">statement</code>, and
+<code class="code">executive</code>; and the envelope formats <code class="code">com10</code>, <code class="code">monarch</code>,
+and <code class="code">DL</code>. Matching is performed without regard for lettercase.
+</p>
+<p>Alternatively, the argument can be a custom paper format in the format
+<code class="code"><var class="var">length</var>,<var class="var">width</var></code> (with no spaces before or after the
+comma). Both <var class="var">length</var> and <var class="var">width</var> must have a unit appended;
+valid units are &lsquo;<samp class="samp">i</samp>&rsquo; for inches, &lsquo;<samp class="samp">c</samp>&rsquo; for centimeters, &lsquo;<samp class="samp">p</samp>&rsquo;
+for points, and &lsquo;<samp class="samp">P</samp>&rsquo; for picas. Example: &lsquo;<samp class="samp">12c,235p</samp>&rsquo;. An
+argument that starts with a digit is always treated as a custom paper
+format.
+</p>
+<p>Finally, the argument can be a file name (e.g., <samp class="file">/etc/papersize</samp>);
+if the file can be opened, the first line is read and a match attempted
+against each of the other forms. No comment syntax is supported.
+</p>
+<p>More than one argument can be specified;
+each is scanned in turn and the first valid paper specification used.
+</p>
+</dd>
+<dt id='index-paperwidth'><span><code class="code">paperwidth <var class="var">n</var></code><a class="copiable-link" href='#index-paperwidth'> &para;</a></span></dt>
+<dd><p>The horizontal dimension of the output medium is <var class="var">n</var>&nbsp;basic
+units (deprecated: use <code class="code">papersize</code> instead).
+</p>
+</dd>
+<dt id='index-pass_005ffilenames'><span><code class="code">pass_filenames</code><a class="copiable-link" href='#index-pass_005ffilenames'> &para;</a></span></dt>
+<dd><p>Direct GNU <code class="code">troff</code> to emit the name of the source file being
+processed. This is achieved with the intermediate output command
+&lsquo;<samp class="samp">x F</samp>&rsquo;, which <code class="code">grohtml</code> interprets.
+</p>
+</dd>
+<dt id='index-postpro'><span><code class="code">postpro <var class="var">program</var></code><a class="copiable-link" href='#index-postpro'> &para;</a></span></dt>
+<dd><p>Use <var class="var">program</var> as the postprocessor.
+</p>
+</dd>
+<dt id='index-prepro'><span><code class="code">prepro <var class="var">program</var></code><a class="copiable-link" href='#index-prepro'> &para;</a></span></dt>
+<dd><p>Use <var class="var">program</var> as a preprocessor. The <code class="code">html</code> and <code class="code">xhtml</code>
+output devices use this directive.
+</p>
+</dd>
+<dt id='index-print'><span><code class="code">print <var class="var">program</var></code><a class="copiable-link" href='#index-print'> &para;</a></span></dt>
+<dd><p>Use <var class="var">program</var> as a spooler program for printing. If omitted, the
+<samp class="option">-l</samp> and <samp class="option">-L</samp> options of <code class="code">groff</code> are ignored.
+</p>
+</dd>
+<dt id='index-res'><span><code class="code">res <var class="var">n</var></code><a class="copiable-link" href='#index-res'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-device-resolution-1"></a>
+<a class="index-entry-id" id="index-resolution_002c-device-1"></a>
+<p>The device resolution is <var class="var">n</var>&nbsp;basic units per inch.
+</p>
+</dd>
+<dt id='index-sizes'><span><code class="code">sizes <var class="var">s1</var> <span class="r">&hellip;</span> <var class="var">sn</var> 0</code><a class="copiable-link" href='#index-sizes'> &para;</a></span></dt>
+<dd><p>The device has fonts at <var class="var">s1</var>, &hellip;, <var class="var">sn</var> scaled points (see
+below). The list of sizes must be terminated by&nbsp;<code class="code">0</code>. Each
+<var class="var">si</var> can also be a range of sizes <var class="var">m</var>&ndash;<var class="var">n</var>. The list can
+extend over more than one line.
+</p>
+</dd>
+<dt id='index-sizescale'><span><code class="code">sizescale <var class="var">n</var></code><a class="copiable-link" href='#index-sizescale'> &para;</a></span></dt>
+<dd><p>A typographical point is subdivided into <var class="var">n</var>&nbsp;scaled points.
+The default is&nbsp;<code class="code">1</code>. See <a class="xref" href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a>.
+</p>
+</dd>
+<dt id='index-styles-2'><span><code class="code">styles <var class="var">S1</var> <span class="r">&hellip;</span> <var class="var">Sm</var></code><a class="copiable-link" href='#index-styles-2'> &para;</a></span></dt>
+<dd><p>The first&nbsp;<var class="var">m</var> mounting positions are associated with styles
+<var class="var">S1</var>, &hellip;, <var class="var">Sm</var>.
+</p>
+</dd>
+<dt id='index-tcommand'><span><code class="code">tcommand</code><a class="copiable-link" href='#index-tcommand'> &para;</a></span></dt>
+<dd><p>The postprocessor can handle the &lsquo;<samp class="samp">t</samp>&rsquo; and &lsquo;<samp class="samp">u</samp>&rsquo; intermediate
+output commands.
+</p>
+</dd>
+<dt id='index-unicode'><span><code class="code">unicode</code><a class="copiable-link" href='#index-unicode'> &para;</a></span></dt>
+<dd><p>The output device supports the complete Unicode repertoire. This
+directive is useful only for devices that produce character entities
+instead of glyphs.
+</p>
+<p>If <code class="code">unicode</code> is present, no <code class="code">charset</code> section is required in
+the font description files since the Unicode handling built into
+<code class="code">groff</code> is used. However, if there are entries in a font
+description file&rsquo;s <code class="code">charset</code> section, they either override the
+default mappings for those particular characters or add new mappings
+(normally for composite characters).
+</p>
+<p>The <code class="code">utf8</code>, <code class="code">html</code>, and <code class="code">xhtml</code> output devices use this
+directive.
+</p>
+</dd>
+<dt id='index-unitwidth'><span><code class="code">unitwidth <var class="var">n</var></code><a class="copiable-link" href='#index-unitwidth'> &para;</a></span></dt>
+<dd><p>Quantities in the font description files are in basic units for fonts
+whose type size is <var class="var">n</var>&nbsp;scaled points.
+</p>
+</dd>
+<dt id='index-unscaled_005fcharwidths'><span><code class="code">unscaled_charwidths</code><a class="copiable-link" href='#index-unscaled_005fcharwidths'> &para;</a></span></dt>
+<dd><p>Make the font handling module always return unscaled character widths.
+The <code class="code">grohtml</code> driver uses this directive.
+</p>
+</dd>
+<dt id='index-use_005fcharnames_005fin_005fspecial-1'><span><code class="code">use_charnames_in_special</code><a class="copiable-link" href='#index-use_005fcharnames_005fin_005fspecial-1'> &para;</a></span></dt>
+<dd><p>GNU <code class="code">troff</code> should encode special characters inside device control
+commands; see <a class="ref" href="Postprocessor-Access.html">Postprocessor Access</a>. The <code class="code">grohtml</code> driver
+uses this directive.
+</p>
+</dd>
+<dt id='index-vert'><span><code class="code">vert <var class="var">n</var></code><a class="copiable-link" href='#index-vert'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-vertical-motion-quantum"></a>
+<a class="index-entry-id" id="index-motion-quantum_002c-vertical"></a>
+<a class="index-entry-id" id="index-quantum_002c-vertical-motion"></a>
+<a class="index-entry-id" id="index-vertical-resolution"></a>
+<a class="index-entry-id" id="index-resolution_002c-vertical"></a>
+<p>The vertical motion quantum is <var class="var">n</var>&nbsp;basic units. All vertical
+quantities are rounded to multiples of&nbsp;<var class="var">n</var>.
+</p>
+</dd>
+<dt id='index-charset'><span><code class="code">charset</code><a class="copiable-link" href='#index-charset'> &para;</a></span></dt>
+<dd><p>This line and everything following it in the file are ignored. It is
+recognized for compatibility with other <code class="code">troff</code> implementations.
+In GNU <code class="code">troff</code>, character set repertoire is described on a
+per-font basis.
+</p></dd>
+</dl>
+
+<a class="index-entry-id" id="index-spare1"></a>
+<a class="index-entry-id" id="index-spare2"></a>
+<a class="index-entry-id" id="index-biggestfont"></a>
+<p>GNU <code class="code">troff</code> recognizes but ignores the directives <code class="code">spare1</code>,
+<code class="code">spare2</code>, and <code class="code">biggestfont</code>.
+</p>
+<p>The <code class="code">res</code>, <code class="code">unitwidth</code>, <code class="code">fonts</code>, and <code class="code">sizes</code> lines
+are mandatory. Directives not listed above are ignored by GNU
+<code class="code">troff</code> but may be used by postprocessors to obtain further
+information about the device.
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Font-Description-File-Format.html">Font Description File Format</a>, Previous: <a href="Device-and-Font-Description-Files.html">Device and Font Description Files</a>, Up: <a href="Device-and-Font-Description-Files.html">Device and Font Description Files</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Debugging.html b/doc/groff.html.node/Debugging.html
new file mode 100644
index 0000000..594201c
--- /dev/null
+++ b/doc/groff.html.node/Debugging.html
@@ -0,0 +1,317 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Debugging (The GNU Troff Manual)</title>
+
+<meta name="description" content="Debugging (The GNU Troff Manual)">
+<meta name="keywords" content="Debugging (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Implementation-Differences.html" rel="next" title="Implementation Differences">
+<link href="Gtroff-Internals.html" rel="prev" title="Gtroff Internals">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+p.flushright-paragraph {text-align:right}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Debugging">
+<div class="nav-panel">
+<p>
+Next: <a href="Implementation-Differences.html" accesskey="n" rel="next">Implementation Differences</a>, Previous: <a href="Gtroff-Internals.html" accesskey="p" rel="prev"><code class="code">gtroff</code> Internals</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Debugging-1">5.37 Debugging</h3>
+<a class="index-entry-id" id="index-debugging"></a>
+
+<div class="flushright"><p class="flushright-paragraph"><i class="slanted">Standard troff voodoo, just put a power of two backslashes in
+front of it until it works and if you still have problems add a \c.</i>
+&mdash; Ron Natalie
+</p></div>
+<p>GNU <code class="code">troff</code> is not the easiest language to debug, in part thanks to
+its design features of recursive interpolation and the use of
+multi-stage pipeline processing in the surrounding system. Nevertheless
+there exist several features useful for troubleshooting.
+</p>
+<p>Preprocessors use the <code class="code">lf</code> request to preserve the identity of the
+line numbers and names of input files. GNU <code class="code">troff</code> emits a variety
+of error diagnostics and supports several categories of warning; the
+output of these can be selectively suppressed. A trace of the
+formatter&rsquo;s input processing stack can be emitted when errors or
+warnings occur by means of GNU <code class="code">troff</code>&rsquo;s <samp class="option">-b</samp> option, or
+produced on demand with the <code class="code">backtrace</code> request. The <code class="code">tm</code>
+and related requests can be used to emit customized diagnostic messages
+or for instrumentation while troubleshooting. The <code class="code">ex</code> and
+<code class="code">ab</code> requests cause early termination with successful and error
+exit codes respectively, to halt further processing when continuing
+would be fruitless. Examine the state of the formatter with requests
+that write lists of defined names (macros, strings, and diversions),
+environments, registers, and page location traps to the standard error
+stream.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002elf"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.lf</code></strong> <var class="def-var-arguments">line [<span class="r"><i class="slanted">file</i></span>]</var><a class="copiable-link" href='#index-_002elf'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-lf"></a>
+<a class="index-entry-id" id="index-soelim"></a>
+<a class="index-entry-id" id="index-multi_002dfile-documents"></a>
+<a class="index-entry-id" id="index-documents_002c-multi_002dfile"></a>
+<a class="index-entry-id" id="index-setting-input-line-number-_0028lf_0029"></a>
+<a class="index-entry-id" id="index-input-line-number_002c-setting-_0028lf_0029"></a>
+<a class="index-entry-id" id="index-number_002c-input-line_002c-setting-_0028lf_0029"></a>
+<p>Set the input line number (and, optionally, the file name) GNU
+<code class="code">troff</code> shall use for error and warning messages. <var class="var">line</var> is
+the input line number of the <em class="emph">next</em> line. Without an argument, the
+request is ignored.
+</p>
+<p><code class="code">lf</code>&rsquo;s primary purpose is to aid the debugging of documents that
+undergo preprocessing. Programs like <code class="command">tbl</code> that transform input
+in their own languages into <code class="code">roff</code> requests use it so that any
+diagnostic messages emitted by <code class="code">troff</code> correspond to the source
+document.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002etm"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.tm</code></strong> <var class="def-var-arguments">message</var><a class="copiable-link" href='#index-_002etm'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-tm"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002etm1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.tm1</code></strong> <var class="def-var-arguments">message</var><a class="copiable-link" href='#index-_002etm1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-tm1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002etmc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.tmc</code></strong> <var class="def-var-arguments">message</var><a class="copiable-link" href='#index-_002etmc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-tmc"></a>
+<a class="index-entry-id" id="index-printing-to-stderr-_0028tm_002c-tm1_002c-tmc_0029"></a>
+<a class="index-entry-id" id="index-stderr_002c-printing-to-_0028tm_002c-tm1_002c-tmc_0029"></a>
+<p>Send <var class="var">message</var>, which consumes the remainder of the input line and
+cannot contain special characters, to the standard error stream,
+followed by a newline. Leading spaces in <var class="var">message</var> are ignored.
+</p>
+<p><code class="code">tm1</code> is similar, but recognizes and strips a leading neutral
+double quote from <var class="var">message</var> to allow the embedding of leading
+spaces.
+</p>
+<p><code class="code">tmc</code> works as <code class="code">tm1</code>, but does not append a newline.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eab"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ab</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">message</i></span>]</var><a class="copiable-link" href='#index-_002eab'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ab"></a>
+<a class="index-entry-id" id="index-aborting-_0028ab_0029"></a>
+<p>Write any <var class="var">message</var> to the standard error stream (like <code class="code">tm</code>)
+and then abort GNU <code class="code">troff</code>; that is, stop processing and terminate
+with a failure status.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eex"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ex</code></strong><a class="copiable-link" href='#index-_002eex'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ex"></a>
+<a class="index-entry-id" id="index-ex-request_002c-use-in-debugging"></a>
+<a class="index-entry-id" id="index-exiting-_0028ex_0029"></a>
+<p>Exit GNU <code class="code">troff</code>; that is, stop processing and terminate with a
+successful status. To stop processing only the current file, use the
+<code class="code">nx</code> request; see <a class="ref" href="I_002fO.html">I/O</a>.
+</p></dd></dl>
+
+<p>When doing something involved, it is useful to leave the debugging
+statements in the code and have them turned on by a command-line flag.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.if \n[DB] .tm debugging output
+</pre></div></div>
+
+<p>To activate such statements, use the <samp class="option">-r</samp> option to set the
+register.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">groff -rDB=1 <i class="slanted">file</i>
+</pre></div></div>
+
+<p>If it is known in advance that there are many errors and no useful
+output, GNU <code class="code">troff</code> can be forced to suppress formatted output with
+the <samp class="option">-z</samp> option.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epev"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pev</code></strong><a class="copiable-link" href='#index-_002epev'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-pev"></a>
+<a class="index-entry-id" id="index-dumping-environments-_0028pev_0029"></a>
+<a class="index-entry-id" id="index-environments_002c-dumping-_0028pev_0029"></a>
+<p>Report the state of the current environment followed by that of all
+other environments to the standard error stream.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epm"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pm</code></strong><a class="copiable-link" href='#index-_002epm'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-pm"></a>
+<a class="index-entry-id" id="index-dumping-symbol-table-_0028pm_0029"></a>
+<a class="index-entry-id" id="index-symbol-table_002c-dumping-_0028pm_0029"></a>
+<p>Report, to the standard error stream, the names of all defined macros,
+strings, and diversions with their sizes in bytes.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epnr"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pnr</code></strong><a class="copiable-link" href='#index-_002epnr'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-pnr"></a>
+<a class="index-entry-id" id="index-dumping-registers-_0028pnr_0029"></a>
+<a class="index-entry-id" id="index-registers_002c-dumping-_0028pnr_0029"></a>
+<p>Report the names and contents of all currently defined registers to the
+standard error stream.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eptr"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ptr</code></strong><a class="copiable-link" href='#index-_002eptr'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ptr"></a>
+<a class="index-entry-id" id="index-dumping-page-location-traps-_0028ptr_0029"></a>
+<a class="index-entry-id" id="index-listing-page-location-traps-_0028ptr_0029"></a>
+<a class="index-entry-id" id="index-traps_002c-page-location_002c-dumping-_0028ptr_0029"></a>
+<a class="index-entry-id" id="index-traps_002c-page-location_002c-listing-_0028ptr_0029"></a>
+<p>Report the names and positions of all page location traps to the
+standard error stream. Empty slots in the list, where a trap has been
+planted but subsequently (re)moved, are printed as well.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002efl"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.fl</code></strong><a class="copiable-link" href='#index-_002efl'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-fl"></a>
+<a class="index-entry-id" id="index-flush-output-_0028fl_0029"></a>
+<a class="index-entry-id" id="index-output_002c-flush-_0028fl_0029"></a>
+<a class="index-entry-id" id="index-interactive-use-of-gtroff"></a>
+<a class="index-entry-id" id="index-gtroff_002c-interactive-use"></a>
+<p>Instruct <code class="code">gtroff</code> to flush its output immediately. The intent is
+for interactive use, but this behaviour is currently not implemented in
+<code class="code">gtroff</code>. Contrary to Unix <code class="code">troff</code>, TTY output is sent to a
+device driver also (<code class="code">grotty</code>), making it non-trivial to communicate
+interactively.
+</p>
+<p>This request causes a line break.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ebacktrace"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.backtrace</code></strong><a class="copiable-link" href='#index-_002ebacktrace'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-backtrace"></a>
+<a class="index-entry-id" id="index-backtrace-of-input-stack-_0028backtrace_0029"></a>
+<a class="index-entry-id" id="index-input-stack_002c-backtrace-_0028backtrace_0029"></a>
+<p>Write the state of the input stack to the standard error stream.
+</p>
+<p>Consider the following in a file <samp class="file">test</samp>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de xxx
+. backtrace
+..
+.de yyy
+. xxx
+..
+.
+.yyy
+ error&rarr; troff: backtrace: 'test':2: macro 'xxx'
+ error&rarr; troff: backtrace: 'test':5: macro 'yyy'
+ error&rarr; troff: backtrace: file 'test':8
+</pre></div></div>
+
+<p>The <samp class="option">-b</samp> option of GNU <code class="code">troff</code> causes a backtrace to be
+generated on each error or warning. Some warnings have to be enabled;
+See <a class="xref" href="Warnings.html">Warnings</a>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bslimit_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[slimit]</code></strong><a class="copiable-link" href='#index-_005cn_005bslimit_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-slimit"></a>
+<a class="index-entry-id" id="index-input-stack_002c-setting-limit"></a>
+<p>If greater than&nbsp;0, sets the maximum quantity of objects on GNU
+<code class="code">troff</code>&rsquo;s internal input stack. If less than or equal to&nbsp;0,
+there is no limit: recursion can continue until program memory is
+exhausted. The default is 1,000.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ewarnscale"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.warnscale</code></strong> <var class="def-var-arguments">su</var><a class="copiable-link" href='#index-_002ewarnscale'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-warnscale"></a>
+<p>Set the scaling unit used in certain warnings to <var class="var">su</var>, which can take the values &lsquo;<samp class="samp">u</samp>&rsquo;, &lsquo;<samp class="samp">i</samp>&rsquo;, &lsquo;<samp class="samp">c</samp>&rsquo;,
+&lsquo;<samp class="samp">p</samp>&rsquo;, and &lsquo;<samp class="samp">P</samp>&rsquo;. The default is &lsquo;<samp class="samp">i</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002espreadwarn"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.spreadwarn</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">limit</i></span>]</var><a class="copiable-link" href='#index-_002espreadwarn'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-spreadwarn"></a>
+<p>Emit a <code class="code">break</code> warning if the additional space inserted for each
+space between words in an output line adjusted to both margins with
+&lsquo;<samp class="samp">.ad&nbsp;b</samp>&rsquo;<!-- /@w --> is larger than or equal to <var class="var">limit</var>. A negative
+value is treated as zero; an absent argument toggles the warning on and
+off without changing <var class="var">limit</var>. The default scaling unit is &lsquo;<samp class="samp">m</samp>&rsquo;.
+At startup, <code class="code">spreadwarn</code> is inactive and <var class="var">limit</var> is 3<span class="dmn">m</span>.
+</p>
+<p>For example,
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.spreadwarn 0.2m
+</pre></div></div>
+
+<p>causes a warning if <code class="code">break</code> warnings are not suppressed and
+<code class="code">gtroff</code> must add 0.2<span class="dmn">m</span> or more for each inter-word space in a
+line. See <a class="xref" href="Warnings.html">Warnings</a>.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-warnings"></a>
+<p>GNU <code class="code">troff</code> has command-line options for reporting warnings
+(<samp class="option">-w</samp>) and backtraces (<samp class="option">-b</samp>) when a warning or an error
+occurs.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ewarn"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.warn</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">n</i></span>]</var><a class="copiable-link" href='#index-_002ewarn'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-warn"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ewarn_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.warn]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ewarn_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ewarn-1"></a>
+<a class="index-entry-id" id="index-warning-level-_0028warn_0029"></a>
+<p>Select the categories, or &ldquo;types&rdquo;, of reported warnings.
+<var class="var">n</var>&nbsp;is the sum of the numeric codes associated with each
+warning category that is to be enabled; all other categories are
+disabled. The categories and their associated codes are listed in
+<a class="ref" href="Warnings.html">Warnings</a>. For example, &lsquo;<samp class="samp">.warn 0</samp>&rsquo; disables all warnings, and
+&lsquo;<samp class="samp">.warn 1</samp>&rsquo; disables all warnings except those about missing glyphs.
+If no argument is given, all warning categories are enabled.
+</p>
+<p>The read-only register <code class="code">.warn</code> contains the sum of the numeric
+codes of enabled warning categories.
+</p></dd></dl>
+
+
+
+<ul class="mini-toc">
+<li><a href="Warnings.html" accesskey="1">Warnings</a></li>
+</ul>
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Implementation-Differences.html">Implementation Differences</a>, Previous: <a href="Gtroff-Internals.html"><code class="code">gtroff</code> Internals</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Default-Units.html b/doc/groff.html.node/Default-Units.html
new file mode 100644
index 0000000..168c5cc
--- /dev/null
+++ b/doc/groff.html.node/Default-Units.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Default Units (The GNU Troff Manual)</title>
+
+<meta name="description" content="Default Units (The GNU Troff Manual)">
+<meta name="keywords" content="Default Units (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Measurements.html" rel="up" title="Measurements">
+<link href="Motion-Quanta.html" rel="prev" title="Motion Quanta">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Default-Units">
+<div class="nav-panel">
+<p>
+Previous: <a href="Motion-Quanta.html" accesskey="p" rel="prev">Motion Quanta</a>, Up: <a href="Measurements.html" accesskey="u" rel="up">Measurements</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Default-Units-1">5.3.2 Default Units</h4>
+<a class="index-entry-id" id="index-default-units"></a>
+<a class="index-entry-id" id="index-units_002c-default"></a>
+
+<p>A general-purpose register (one created or updated with the <code class="code">nr</code>
+request; see see <a class="pxref" href="Registers.html">Registers</a>) is implicitly dimensionless, or reckoned
+in basic units if interpreted in a measurement context. But it is
+convenient for many requests and escape sequences to infer a scaling
+unit for an argument if none is specified. An explicit scaling unit
+(not after a closing parenthesis) can override an undesirable default.
+Effectively, the default unit is suffixed to the expression if a scaling
+unit is not already present. GNU <code class="code">troff</code>&rsquo;s use of integer
+arithmetic should also be kept in mind (see <a class="pxref" href="Numeric-Expressions.html">Numeric Expressions</a>).
+</p>
+<p>The <code class="code">ll</code> request interprets its argument in ems by default.
+Consider several attempts to set a line length of 3.5&nbsp;inches when
+the type size is 10&nbsp;points on a terminal device with a resolution
+of 240 basic units and horizontal motion quantum of 24. Some
+expressions become zero; the request clamps them to that quantum.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 3.5i \&quot; 3.5i (= 840u)
+.ll 7/2 \&quot; 7u/2u -&gt; 3u -&gt; 3m -&gt; 0, clamped to 24u
+.ll (7 / 2)u \&quot; 7u/2u -&gt; as above
+.ll 7/2i \&quot; 7u/2i -&gt; 7u/480u -&gt; 0 -&gt; as above
+.ll 7i/2 \&quot; 7i/2u -&gt; 1680u/2m -&gt; 1680u/24u -&gt; 35u
+.ll 7i/2u \&quot; 3.5i (= 840u)
+</pre></div></div>
+
+<a class="index-entry-id" id="index-measurements_002c-specifying-safely"></a>
+<p>The safest way to specify measurements is to attach a scaling unit. To
+multiply or divide by a dimensionless quantity, use &lsquo;<samp class="samp">u</samp>&rsquo; as its
+scaling unit.
+</p>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Deferring-Output.html b/doc/groff.html.node/Deferring-Output.html
new file mode 100644
index 0000000..81ab360
--- /dev/null
+++ b/doc/groff.html.node/Deferring-Output.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Deferring Output (The GNU Troff Manual)</title>
+
+<meta name="description" content="Deferring Output (The GNU Troff Manual)">
+<meta name="keywords" content="Deferring Output (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Traps.html" rel="next" title="Traps">
+<link href="Drawing-Geometric-Objects.html" rel="prev" title="Drawing Geometric Objects">
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Deferring-Output">
+<div class="nav-panel">
+<p>
+Next: <a href="Traps.html" accesskey="n" rel="next">Traps</a>, Previous: <a href="Drawing-Geometric-Objects.html" accesskey="p" rel="prev">Drawing Geometric Objects</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Deferring-Output-1">5.27 Deferring Output</h3>
+<a class="index-entry-id" id="index-deferred-output"></a>
+
+<a class="index-entry-id" id="index-environment"></a>
+<a class="index-entry-id" id="index-diversion"></a>
+<a class="index-entry-id" id="index-trap"></a>
+<p>A few <code class="code">roff</code> language elements are generally not used in simple
+documents, but arise as page layouts become more sophisticated and
+demanding. <em class="dfn">Environments</em> collect formatting parameters like line
+length and typeface. A <em class="dfn">diversion</em> stores formatted output for
+later use. A <em class="dfn">trap</em> is a condition on the input or output, tested
+automatically by the formatter, that is associated with a macro, causing
+it to be called when that condition is fulfilled.
+</p>
+<p>Footnote support often exercises all three of the foregoing features. A
+simple implementation might work as follows. A pair of macros is
+defined: one starts a footnote and the other ends it. The author calls
+the first macro where a footnote marker is desired. The macro
+establishes a diversion so that the footnote text is collected at the
+place in the body text where its corresponding marker appears. An
+environment is created for the footnote so that it is set at a smaller
+typeface. The footnote text is formatted in the diversion using that
+environment, but it does not yet appear in the output. The document
+author calls the footnote end macro, which returns to the previous
+environment and ends the diversion. Later, after much more body text in
+the document, a trap, set a small distance above the page bottom, is
+sprung. The macro called by the trap draws a line across the page and
+emits the stored diversion. Thus, the footnote is rendered.
+</p>
+<p>Diversions and traps make the text formatting process non-linear. Let
+us imagine a set of text lines or paragraphs labelled &lsquo;<samp class="samp">A</samp>&rsquo;,
+&lsquo;<samp class="samp">B</samp>&rsquo;, and so on. If we set up a trap that produces text &lsquo;<samp class="samp">T</samp>&rsquo;
+(as a page footer, say), and we also use a diversion to store the
+formatted text &lsquo;<samp class="samp">D</samp>&rsquo;, then a document with input text in the order
+&lsquo;<samp class="samp">A B C D E F</samp>&rsquo; might render as &lsquo;<samp class="samp">A B C E T F</samp>&rsquo;. The diversion
+&lsquo;<samp class="samp">D</samp>&rsquo; will never be output if we do not call for it.
+</p>
+<p>Environments of themselves are not a source of non-linearity in document
+formatting: environment switches have immediate effect. One could
+always write a macro to change as many formatting parameters as desired
+with a single convenient call. But because diversions can be nested and
+macros called by traps that are sprung by other trap-called macros, they
+may be called upon in varying contexts. For example, consider a page
+header that is always to be set in Helvetica. A document that uses
+Times for most of its body text, but Courier for displayed code
+examples, poses a challenge if a page break occurs in the middle of a
+code display; if the header trap assumes that the &ldquo;previous font&rdquo; is
+always Times, the rest of the example will be formatted in the wrong
+typeface. One could carefully save all formatting parameters upon
+entering the trap and restore them upon leaving it, but this is verbose,
+error-prone, and not future-proof as the <code class="code">groff</code> language develops.
+Environments save us considerable effort.
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Traps.html">Traps</a>, Previous: <a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Delimiters.html b/doc/groff.html.node/Delimiters.html
new file mode 100644
index 0000000..fa117db
--- /dev/null
+++ b/doc/groff.html.node/Delimiters.html
@@ -0,0 +1,233 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Delimiters (The GNU Troff Manual)</title>
+
+<meta name="description" content="Delimiters (The GNU Troff Manual)">
+<meta name="keywords" content="Delimiters (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Formatter-Instructions.html" rel="up" title="Formatter Instructions">
+<link href="Using-Escape-Sequences.html" rel="prev" title="Using Escape Sequences">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+kbd.key {font-style: normal}
+ul.mark-bullet {list-style-type: disc}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Delimiters">
+<div class="nav-panel">
+<p>
+Previous: <a href="Using-Escape-Sequences.html" accesskey="p" rel="prev">Using Escape Sequences</a>, Up: <a href="Formatter-Instructions.html" accesskey="u" rel="up">Formatter Instructions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Delimiters-1">5.6.5 Delimiters</h4>
+<a class="index-entry-id" id="index-delimiting-escape-sequence-arguments"></a>
+<a class="index-entry-id" id="index-escape-sequence-argument-delimiters"></a>
+<a class="index-entry-id" id="index-delimiters_002c-for-escape-sequence-arguments"></a>
+<a class="index-entry-id" id="index-arguments_002c-to-escape-sequences_002c-delimiting"></a>
+
+<a class="index-entry-id" id="index-_0027_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_0022_002c-as-delimiter"></a>
+<p>Some escape sequences that require parameters use delimiters. The
+neutral apostrophe <code class="code">'</code> is a popular choice and shown in this
+document. The neutral double quote <code class="code">&quot;</code> is also commonly seen.
+Letters, numerals, and leaders can be used. Punctuation characters
+are likely better choices, except for those defined as infix operators
+in numeric expressions; see below.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">\l'1.5i\[bu]' \&quot; draw 1.5 inches of bullet glyphs
+</pre></div></div>
+
+<a class="index-entry-id" id="index-_005c_0025_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005cSP_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_007c_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_005e_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_007b_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_007d_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_0027_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_0060_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_002d_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_005f_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_0021_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_003f_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_0029_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_002f_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_002c_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_0026_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_003a_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c_007e_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005c0_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005ca_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005cc_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005cd_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005ce_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005cE_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005cp_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005cr_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005ct_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_005cu_002c-as-delimiter"></a>
+<p>The following escape sequences don&rsquo;t take arguments and thus are allowed
+as delimiters:
+<code class="code">\<kbd class="key">SP</kbd></code>, <code class="code">\%</code>, <code class="code">\|</code>, <code class="code">\^</code>, <code class="code">\{</code>,
+<code class="code">\}</code>, <code class="code">\'</code>, <code class="code">\`</code>, <code class="code">\-</code>, <code class="code">\_</code>, <code class="code">\!</code>,
+<code class="code">\?</code>, <code class="code">\)</code>, <code class="code">\/</code>, <code class="code">\,</code>, <code class="code">\&amp;</code>, <code class="code">\:</code>,
+<code class="code">\~</code>, <code class="code">\0</code>, <code class="code">\a</code>, <code class="code">\c</code>, <code class="code">\d</code>, <code class="code">\e</code>,
+<code class="code">\E</code>, <code class="code">\p</code>, <code class="code">\r</code>, <code class="code">\t</code>, and <code class="code">\u</code>. However,
+using them this way is discouraged; they can make the input confusing to
+read.
+</p>
+<a class="index-entry-id" id="index-_005cA_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cb_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005co_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cw_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cX_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cZ_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-newline_002c-as-delimiter"></a>
+<p>A few escape sequences,
+<code class="code">\A</code>,
+<code class="code">\b</code>,
+<code class="code">\o</code>,
+<code class="code">\w</code>,
+<code class="code">\X</code>,
+and <code class="code">\Z</code>, accept a newline as a delimiter. Newlines that serve
+as delimiters continue to be recognized as input line terminators.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">A caf\o
+e\(aa
+in Paris
+ &rArr; A café in Paris
+</pre></div></div>
+
+<p>Use of newlines as delimiters in escape sequences is also discouraged.
+</p>
+<a class="index-entry-id" id="index-_005cD_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005ch_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cH_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cl_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cL_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cN_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cR_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cs_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cS_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cv_002c-delimiters-allowed-by"></a>
+<a class="index-entry-id" id="index-_005cx_002c-delimiters-allowed-by"></a>
+<p>Finally, the escape sequences <code class="code">\D</code>, <code class="code">\h</code>, <code class="code">\H</code>,
+<code class="code">\l</code>, <code class="code">\L</code>, <code class="code">\N</code>, <code class="code">\R</code>, <code class="code">\s</code>, <code class="code">\S</code>,
+<code class="code">\v</code>, and <code class="code">\x</code> prohibit many delimiters.
+</p>
+<ul class="itemize mark-bullet">
+<li><a class="index-entry-id" id="index-numerals_002c-as-delimiters"></a>
+<a class="index-entry-id" id="index-digits_002c-as-delimiters"></a>
+<a class="index-entry-id" id="index-_002e_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-decimal-point_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-dot_002c-as-delimiter"></a>
+the numerals <code class="code">0</code>-<code class="code">9</code> and the decimal point <code class="code">.</code>
+
+</li><li><a class="index-entry-id" id="index-operators_002c-as-delimiters"></a>
+<a class="index-entry-id" id="index-_002b_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_002d_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_002f_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_002a_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_0025_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_003c_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_003e_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_003d_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_0026_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_003a_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_0028_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-_0029_002c-as-delimiter"></a>
+the (single-character) operators &lsquo;<samp class="samp">+-/*%&lt;&gt;=&amp;:()</samp>&rsquo;
+
+</li><li><a class="index-entry-id" id="index-space-character_002c-as-delimiter"></a>
+<a class="index-entry-id" id="index-tab-character_002c-as-delimiter"></a>
+the space and tab characters
+
+</li><li><a class="index-entry-id" id="index-_005c_0025_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005c_003a_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005c_007b_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005c_007d_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005c_0027_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005c_0060_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005c_002d_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005c_005f_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005c_0021_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005c_002f_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005cc_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005ce_002c-as-delimiter-1"></a>
+<a class="index-entry-id" id="index-_005cp_002c-as-delimiter-1"></a>
+any escape sequences other than <code class="code">\%</code>, <code class="code">\:</code>, <code class="code">\{</code>,
+<code class="code">\}</code>, <code class="code">\'</code>, <code class="code">\`</code>, <code class="code">\-</code>, <code class="code">\_</code>, <code class="code">\!</code>,
+<code class="code">\/</code>, <code class="code">\c</code>, <code class="code">\e</code>, and <code class="code">\p</code>
+</li></ul>
+
+<p>Delimiter syntax is complex and flexible primarily for historical
+reasons; the foregoing restrictions need be kept in mind mainly when
+using <code class="code">groff</code> in <abbr class="acronym">AT&amp;T</abbr> compatibility mode. GNU
+<code class="code">troff</code> keeps track of the nesting depth of escape sequence
+interpolations, so the only characters you need to avoid using as
+delimiters are those that appear in the arguments you input, not any
+that result from interpolation. Typically, <code class="code">'</code> works fine.
+See <a class="xref" href="Implementation-Differences.html">Implementation Differences</a>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">$ groff -Tps
+.de Mw
+. nr wd \w'\\$1'
+. tm &quot;\\$1&quot; is \\n(wd units wide.
+..
+.Mw Wet'suwet'en
+.Mw Wet+200i
+.cp 1 \&quot; turn on compatibility mode
+.Mw Wet'suwet'en
+.Mw Wet'
+.Mw Wet+200i
+ error&rarr; &quot;Wet'suwet'en&quot; is 54740 units wide.
+ error&rarr; &quot;Wet'+200i&quot; is 42610 units wide.
+ error&rarr; &quot;Wet'suwet'en&quot; is 15860 units wide.
+ error&rarr; &quot;Wet'&quot; is 15860 units wide.
+ error&rarr; &quot;Wet'+200i&quot; is 14415860 units wide.
+</pre></div></div>
+
+<p>We see here that in compatibility mode, the part of the argument after
+the <code class="code">'</code> delimiter escapes from its context and, if nefariously
+crafted, influences the computation of the <var class="var">wd</var> register&rsquo;s value in
+a surprising way.
+</p>
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Previous: <a href="Using-Escape-Sequences.html">Using Escape Sequences</a>, Up: <a href="Formatter-Instructions.html">Formatter Instructions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Device-Control-Commands.html b/doc/groff.html.node/Device-Control-Commands.html
new file mode 100644
index 0000000..9d56288
--- /dev/null
+++ b/doc/groff.html.node/Device-Control-Commands.html
@@ -0,0 +1,185 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Device Control Commands (The GNU Troff Manual)</title>
+
+<meta name="description" content="Device Control Commands (The GNU Troff Manual)">
+<meta name="keywords" content="Device Control Commands (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Command-Reference.html" rel="up" title="Command Reference">
+<link href="Obsolete-Command.html" rel="next" title="Obsolete Command">
+<link href="Graphics-Commands.html" rel="prev" title="Graphics Commands">
+<style type="text/css">
+<!--
+div.display {margin-left: 3.2em}
+pre.display-preformatted {font-family: inherit}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="Device-Control-Commands">
+<div class="nav-panel">
+<p>
+Next: <a href="Obsolete-Command.html" accesskey="n" rel="next">Obsolete Command</a>, Previous: <a href="Graphics-Commands.html" accesskey="p" rel="prev">Graphics Commands</a>, Up: <a href="Command-Reference.html" accesskey="u" rel="up">Command Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Device-Control-Commands-1">6.1.2.4 Device Control Commands</h4>
+
+<p>Each device control command starts with the letter &lsquo;<samp class="samp">x</samp>&rsquo;, followed by
+a space character (optional or arbitrary space or tab in <code class="code">gtroff</code>)
+and a subcommand letter or word; each argument (if any) must be preceded
+by a syntactical space. All &lsquo;<samp class="samp">x</samp>&rsquo; commands are terminated by a
+syntactical line break; no device control command can be followed by
+another command on the same line (except a comment).
+</p>
+<p>The subcommand is basically a single letter, but to increase
+readability, it can be written as a word, i.e., an arbitrary sequence of
+characters terminated by the next tab, space, or newline character. All
+characters of the subcommand word but the first are simply ignored. For
+example, <code class="code">gtroff</code> outputs the initialization command &lsquo;<samp class="samp">x&nbsp;i</samp>&rsquo;<!-- /@w -->
+as &lsquo;<samp class="samp">x&nbsp;init</samp>&rsquo;<!-- /@w --> and the resolution command &lsquo;<samp class="samp">x&nbsp;r</samp>&rsquo;<!-- /@w --> as
+&lsquo;<samp class="samp">x&nbsp;res</samp>&rsquo;<!-- /@w -->.
+</p>
+<p>In the following, the syntax element &lsaquo;<span class="r">line break</span>&rsaquo; means a
+syntactical line break (see <a class="pxref" href="Separation.html">Separation</a>).
+</p>
+<dl class="table">
+<dt><code class="code">xF <var class="var">name</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">F</samp>&rsquo; stands for <var class="var">Filename</var>.
+</p>
+<p>Use <var class="var">name</var> as the intended name for the current file in error
+reports. This is useful for remembering the original file name when
+<code class="code">gtroff</code> uses an internal piping mechanism. The input file is not
+changed by this command. This command is a <code class="code">gtroff</code> extension.
+</p>
+</dd>
+<dt><code class="code">xf <var class="var">n</var> <var class="var">s</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">f</samp>&rsquo; stands for <var class="var">font</var>.
+</p>
+<p>Mount font position&nbsp;<var class="var">n</var> (a non-negative integer) with font
+named&nbsp;<var class="var">s</var> (a text word). See <a class="xref" href="Font-Positions.html">Font Positions</a>.
+</p>
+</dd>
+<dt><code class="code">xH <var class="var">n</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">H</samp>&rsquo; stands for <var class="var">Height</var>.
+</p>
+<p>Set glyph height to&nbsp;<var class="var">n</var> (a positive integer in scaled points
+&lsquo;<samp class="samp">z</samp>&rsquo;). <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> uses the unit points (&lsquo;<samp class="samp">p</samp>&rsquo;)
+instead. See <a class="xref" href="Output-Language-Compatibility.html">Output Language Compatibility</a>.
+</p>
+</dd>
+<dt><code class="code">xi&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">i</samp>&rsquo; stands for <var class="var">init</var>.
+</p>
+<p>Initialize device. This is the third command of the prologue.
+</p>
+</dd>
+<dt><code class="code">xp&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">p</samp>&rsquo; stands for <var class="var">pause</var>.
+</p>
+<p>Parsed but ignored. The <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> manual documents
+this command as
+</p>
+<div class="display">
+<pre class="display-preformatted">pause device, can be restarted
+</pre></div>
+
+<p>but GNU <code class="code">troff</code> output drivers do nothing with this command.
+</p>
+</dd>
+<dt><code class="code">xr <var class="var">n</var> <var class="var">h</var> <var class="var">v</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">r</samp>&rsquo; stands for <var class="var">resolution</var>.
+</p>
+<p>Resolution is&nbsp;<var class="var">n</var>, while <var class="var">h</var> is the minimal horizontal
+motion, and <var class="var">v</var> the minimal vertical motion possible with this
+device; all arguments are positive integers in basic units &lsquo;<samp class="samp">u</samp>&rsquo; per
+inch. This is the second command of the prologue.
+</p>
+</dd>
+<dt><code class="code">xS <var class="var">n</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">S</samp>&rsquo; stands for <var class="var">Slant</var>.
+</p>
+<p>Set slant to&nbsp;<var class="var">n</var> (an integer in basic units &lsquo;<samp class="samp">u</samp>&rsquo;).
+</p>
+</dd>
+<dt><code class="code">xs&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">s</samp>&rsquo; stands for <var class="var">stop</var>.
+</p>
+<p>Terminates the processing of the current file; issued as the last
+command of any intermediate <code class="code">troff</code> output.
+</p>
+</dd>
+<dt><code class="code">xt&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">t</samp>&rsquo; stands for <var class="var">trailer</var>.
+</p>
+<p>Generate trailer information, if any. In GNU <code class="code">troff</code>, this is
+ignored.
+</p>
+</dd>
+<dt><code class="code">xT <var class="var">xxx</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">T</samp>&rsquo; stands for <var class="var">Typesetter</var>.
+</p>
+<p>Set the name of the output driver to <var class="var">xxx</var>, a sequence of
+non-whitespace characters terminated by whitespace. The possible names
+correspond to those of <code class="code">groff</code>&rsquo;s <samp class="option">-T</samp> option. This is the
+first command of the prologue.
+</p>
+</dd>
+<dt><code class="code">xu <var class="var">n</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">u</samp>&rsquo; stands for <var class="var">underline</var>.
+</p>
+<p>Configure underlining of spaces. If <var class="var">n</var> is&nbsp;1, start
+underlining of spaces; if <var class="var">n</var> is&nbsp;0, stop underlining of spaces.
+This is needed for the <code class="code">cu</code> request in <code class="code">nroff</code> mode and is
+ignored otherwise. This command is a <code class="code">gtroff</code> extension.
+</p>
+</dd>
+<dt><code class="code">xX <var class="var">anything</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The &lsquo;<samp class="samp">x</samp>&rsquo; stands for <var class="var">X-escape</var>.
+</p>
+<p>Send string <var class="var">anything</var> uninterpreted to the device. If the line
+following this command starts with a &lsquo;<samp class="samp">+</samp>&rsquo; character this line is
+interpreted as a continuation line in the following sense. The &lsquo;<samp class="samp">+</samp>&rsquo;
+is ignored, but a newline character is sent instead to the device, the
+rest of the line is sent uninterpreted. The same applies to all
+following lines until the first character of a line is not a &lsquo;<samp class="samp">+</samp>&rsquo;
+character. This command is generated by the <code class="code">gtroff</code> escape
+sequence <code class="code">\X</code>. The line-continuing feature is a <code class="code">gtroff</code>
+extension.
+</p></dd>
+</dl>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Obsolete-Command.html">Obsolete Command</a>, Previous: <a href="Graphics-Commands.html">Graphics Commands</a>, Up: <a href="Command-Reference.html">Command Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Device-and-Font-Description-Files.html b/doc/groff.html.node/Device-and-Font-Description-Files.html
new file mode 100644
index 0000000..b935830
--- /dev/null
+++ b/doc/groff.html.node/Device-and-Font-Description-Files.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Device and Font Description Files (The GNU Troff Manual)</title>
+
+<meta name="description" content="Device and Font Description Files (The GNU Troff Manual)">
+<meta name="keywords" content="Device and Font Description Files (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="File-Formats.html" rel="up" title="File Formats">
+<link href="gtroff-Output.html" rel="prev" title="gtroff Output">
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Device-and-Font-Description-Files">
+<div class="nav-panel">
+<p>
+Previous: <a href="gtroff-Output.html" accesskey="p" rel="prev"><code class="code">gtroff</code> Output</a>, Up: <a href="File-Formats.html" accesskey="u" rel="up">File Formats</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Device-and-Font-Description-Files-1">6.2 Device and Font Description Files</h3>
+<a class="index-entry-id" id="index-font-files"></a>
+<a class="index-entry-id" id="index-files_002c-font"></a>
+
+<p>The <code class="code">groff</code> font and output device description formats are slight
+extensions of those used by <abbr class="acronym">AT&amp;T</abbr> device-independent
+<code class="code">troff</code>. In distinction to the <abbr class="acronym">AT&amp;T</abbr> implementation,
+<code class="code">groff</code> lacks a binary format; all files are text
+files.<a class="footnote" id="DOCF125" href="groff.html_fot.html#FOOT125"><sup>125</sup></a> The device and font description files for a device <var class="var">name</var>
+are stored in a <samp class="file">dev<var class="var">name</var></samp> directory. The device description
+file is called <samp class="file">DESC</samp>, and, for each font supported by the device,
+a font description file is called&nbsp;<samp class="file"><var class="var">f</var></samp>, where
+<var class="var">f</var>&nbsp;is usually an abbreviation of a font&rsquo;s name and/or style.
+For example, the <code class="code">ps</code> (PostScript) device has <code class="code">groff</code> font
+description files for Times roman (<samp class="file">TR</samp>) and Zapf Chancery Medium
+italic (<samp class="file">ZCMI</samp>), among many others, while the <code class="code">utf8</code> device
+(for terminal emulators) has only font descriptions for the roman,
+italic, bold, and bold-italic styles (<samp class="file">R</samp>, <samp class="file">I</samp>, <samp class="file">B</samp>, and
+<samp class="file">BI</samp>, respectively).
+</p>
+<p>Device and font description files are read both by the formatter, GNU
+<code class="code">troff</code>, and by output drivers. The programs delegate these files&rsquo;
+processing to an internal library, <samp class="file">libgroff</samp>, ensuring their
+consistent interpretation.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="DESC-File-Format.html" accesskey="1"><samp class="file">DESC</samp> File Format</a></li>
+<li><a href="Font-Description-File-Format.html" accesskey="2">Font Description File Format</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Differences-from-AT_0026T-ms.html b/doc/groff.html.node/Differences-from-AT_0026T-ms.html
new file mode 100644
index 0000000..6d45741
--- /dev/null
+++ b/doc/groff.html.node/Differences-from-AT_0026T-ms.html
@@ -0,0 +1,171 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Differences from AT&amp;T ms (The GNU Troff Manual)</title>
+
+<meta name="description" content="Differences from AT&amp;T ms (The GNU Troff Manual)">
+<meta name="keywords" content="Differences from AT&amp;T ms (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms.html" rel="up" title="ms">
+<link href="ms-Naming-Conventions.html" rel="next" title="ms Naming Conventions">
+<link href="ms-Page-Layout.html" rel="prev" title="ms Page Layout">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+ul.mark-bullet {list-style-type: disc}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Differences-from-AT_0026T-ms">
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Naming-Conventions.html" accesskey="n" rel="next">Naming Conventions</a>, Previous: <a href="ms-Page-Layout.html" accesskey="p" rel="prev">Page layout</a>, Up: <a href="ms.html" accesskey="u" rel="up"><samp class="file">ms</samp></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Differences-from-AT_0026T-ms-1">4.6.7 Differences from <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp></h4>
+<a class="index-entry-id" id="index-ms-macros_002c-groff-differences-from-AT_0026T"></a>
+<a class="index-entry-id" id="index-AT_0026T-ms_002c-macro-package-differences"></a>
+
+<p>The <code class="code">groff</code> <samp class="file">ms</samp> macros are an independent reimplementation,
+using no <abbr class="acronym">AT&amp;T</abbr> code. Since they take advantage of the extended
+features of <code class="code">groff</code>, they cannot be used with <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code>. <code class="code">groff</code> <samp class="file">ms</samp> supports features described above
+as Berkeley and Tenth Edition Research Unix extensions, and adds several
+of its own.
+</p>
+<ul class="itemize mark-bullet">
+<li>The internals of <code class="code">groff</code> <samp class="file">ms</samp> differ from the internals of
+<abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp>. Documents that depend upon implementation
+details of <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp> may not format properly with
+<code class="code">groff</code> <samp class="file">ms</samp>. Such details include macros whose function was
+not documented in the <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp>
+manual.<a class="footnote" id="DOCF14" href="groff.html_fot.html#FOOT14"><sup>14</sup></a>
+
+</li><li>The error-handling policy of <code class="code">groff</code> <samp class="file">ms</samp> is to detect and
+report errors, rather than to ignore them silently.
+
+</li><li>Tenth Edition Research Unix supported <code class="code">P1</code>/<code class="code">P2</code> macros to bracket code
+examples; <code class="code">groff</code> <samp class="file">ms</samp> does not.
+
+</li><li><code class="code">groff</code> <samp class="file">ms</samp> does not work in GNU <code class="code">troff</code>&rsquo;s
+<abbr class="acronym">AT&amp;T</abbr> compatibility mode. If loaded when that mode is enabled,
+it aborts processing with a diagnostic message.
+
+</li><li>Multiple line spacing is not supported. Use a larger vertical spacing
+instead.
+
+</li><li><code class="code">groff</code> <samp class="file">ms</samp> uses the same header and footer defaults in both
+<code class="code">nroff</code> and <code class="code">troff</code> modes as <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp> does in
+<code class="code">troff</code> mode; <abbr class="acronym">AT&amp;T</abbr>&rsquo;s default in <code class="code">nroff</code> mode is to
+put the date, in U.S. traditional format (e.g., &ldquo;January 1, 2021&rdquo;),
+in the center footer (the <code class="code">CF</code> string).
+
+</li><li>Many <code class="code">groff</code> <samp class="file">ms</samp> macros, including those for paragraphs,
+headings, and displays, cause a reset of paragraph rendering parameters,
+and may change the indentation; they do so not by incrementing or
+decrementing it, but by setting it absolutely. This can cause problems
+for documents that define additional macros of their own that try to
+manipulate indentation. Use the <samp class="file">ms</samp> <code class="code">RS</code> and <code class="code">RE</code>
+macros instead of the <code class="code">in</code> request.
+
+</li><li><a class="index-entry-id" id="index-fractional-type-sizes-in-ms-macros"></a>
+<a class="index-entry-id" id="index-ms-macros_002c-fractional-type-sizes-in"></a>
+<abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp> interpreted the values of the registers
+<code class="code">PS</code> and <code class="code">VS</code> in points, and did not support the use of
+scaling units with them. <code class="code">groff</code> <samp class="file">ms</samp> interprets values of
+the registers <code class="code">PS</code>, <code class="code">VS</code>, <code class="code">FPS</code>, and <code class="code">FVS</code> equal to
+or larger than&nbsp;1,000 (one thousand) as decimal fractions multiplied
+by&nbsp;1,000.<a class="footnote" id="DOCF15" href="groff.html_fot.html#FOOT15"><sup>15</sup></a> This threshold makes use of a
+scaling unit with these parameters practical for high-resolution
+devices while preserving backward compatibility. It also permits
+expression of non-integral type sizes. For example, &lsquo;<samp class="samp">groff
+-rPS=10.5p</samp>&rsquo; at the shell prompt is equivalent to placing &lsquo;<samp class="samp">.nr PS
+10.5p</samp>&rsquo; at the beginning of the document.
+
+</li><li><abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp>&rsquo;s <code class="code">AU</code> macro supported arguments used with
+some document types; <code class="code">groff</code> <samp class="file">ms</samp> does not.
+
+</li><li>Right-aligned displays are available. The <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp>
+manual observes that &ldquo;it is tempting to assume that &lsquo;<samp class="samp">.DS R</samp>&rsquo; will
+right adjust lines, but it doesn&rsquo;t work&rdquo;. In <code class="code">groff</code> <samp class="file">ms</samp>,
+it does.
+
+</li><li>To make <code class="code">groff</code> <samp class="file">ms</samp> use the default page offset (which also
+specifies the left margin), the <code class="code">PO</code> register must stay undefined
+until the first <samp class="file">ms</samp> macro is called.
+
+<p>This implies that &lsquo;<samp class="samp">\n[PO]</samp>&rsquo; should not be used early in the
+document, unless it is changed also: accessing an undefined register
+automatically defines it.
+</p>
+</li><li><code class="code">groff</code> <samp class="file">ms</samp> supports the <code class="code">PN</code> register, but it is not
+necessary; you can access the page number via the usual <code class="code">%</code>
+register and invoke the <code class="code">af</code> request to assign a different format
+to it if desired.<a class="footnote" id="DOCF16" href="groff.html_fot.html#FOOT16"><sup>16</sup></a>
+
+</li><li>The <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp> manual documents registers <code class="code">CW</code> and
+<code class="code">GW</code> as setting the default column width and &ldquo;intercolumn gap&rdquo;,
+respectively, and which applied when <code class="code">MC</code> was called with fewer
+than two arguments. <code class="code">groff</code> <samp class="file">ms</samp> instead treats <code class="code">MC</code>
+without arguments as synonymous with <code class="code">2C</code>; there is thus no
+occasion for a default column width register. Further, the <code class="code">MINGW</code>
+register and the second argument to <code class="code">MC</code> specify a <em class="emph">minimum</em>
+space between columns, not the fixed gutter width of <abbr class="acronym">AT&amp;T</abbr>
+<samp class="file">ms</samp>.
+
+</li><li>The <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp> manual did not document the <code class="code">QI</code>
+register; Berkeley and <code class="code">groff</code> <samp class="file">ms</samp> do.
+</li></ul>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bGS_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[GS]</code></strong><a class="copiable-link" href='#index-_005cn_005bGS_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-GS-_005bms_005d"></a>
+<p>The register <code class="code">GS</code> is set to&nbsp;1 by the <code class="code">groff</code> <samp class="file">ms</samp>
+macros, but is not used by the <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp> package.
+Documents that need to determine whether they are being formatted with
+<code class="code">groff</code> <samp class="file">ms</samp> or another implementation should test this
+register.
+</p></dd></dl>
+
+
+
+<ul class="mini-toc">
+<li><a href="Missing-Unix-Version-7-ms-Macros.html" accesskey="1">Unix Version 7 <samp class="file">ms</samp> macros not implemented by <code class="code">groff</code> <samp class="file">ms</samp></a></li>
+</ul>
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Naming-Conventions.html">Naming Conventions</a>, Previous: <a href="ms-Page-Layout.html">Page layout</a>, Up: <a href="ms.html"><samp class="file">ms</samp></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Displays-and-Keeps.html b/doc/groff.html.node/Displays-and-Keeps.html
new file mode 100644
index 0000000..9d8f2b0
--- /dev/null
+++ b/doc/groff.html.node/Displays-and-Keeps.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Displays and Keeps (The GNU Troff Manual)</title>
+
+<meta name="description" content="Displays and Keeps (The GNU Troff Manual)">
+<meta name="keywords" content="Displays and Keeps (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Common-Features.html" rel="up" title="Common Features">
+<link href="Footnotes-and-Endnotes.html" rel="next" title="Footnotes and Endnotes">
+<link href="Page-Layout-Adjustment.html" rel="prev" title="Page Layout Adjustment">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Displays-and-Keeps">
+<div class="nav-panel">
+<p>
+Next: <a href="Footnotes-and-Endnotes.html" accesskey="n" rel="next">Footnotes and Endnotes</a>, Previous: <a href="Page-Layout-Adjustment.html" accesskey="p" rel="prev">Page Layout</a>, Up: <a href="Common-Features.html" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Displays-and-Keeps-1">3.2.5 Displays and Keeps</h4>
+<a class="index-entry-id" id="index-displays"></a>
+
+<p><i class="slanted">Displays</i> are sections of text set off from the surrounding
+material (typically paragraphs), often differing in indentation, and/or
+spacing. Tables, block quotations, and figures are displayed.
+Equations and code examples, when not much shorter than an output line,
+often are. Lists may or may not be. Packages for setting man pages
+support example displays but not keeps.
+</p>
+<a class="index-entry-id" id="index-keeps-_0028introduction_0029"></a>
+<p>A <i class="slanted">keep</i> is a group of output lines, often a display, that is
+formatted on a single page if possible; it causes a page break to happen
+early so as to not interrupt the kept material.
+</p>
+<a class="index-entry-id" id="index-keep_002c-floating"></a>
+<a class="index-entry-id" id="index-floating-keep"></a>
+<p><i class="slanted">Floating keeps</i> can move, or &ldquo;float&rdquo;, relative to the text
+around them in the input. They are useful for displays that are
+captioned and referred to by name, as with &ldquo;See figure&nbsp;3&rdquo;.
+Depending on the package, a floating keep appears at the bottom of the
+current page if it fits, and at the top of the next otherwise.
+Alternatively, floating keeps might be deferred to the end of a section.
+Using a floating keep can avoid the large vertical spaces that may
+precede a tall keep of the ordinary sort when it won&rsquo;t fit on the page.
+</p>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Diversion-Traps.html b/doc/groff.html.node/Diversion-Traps.html
new file mode 100644
index 0000000..4c924e7
--- /dev/null
+++ b/doc/groff.html.node/Diversion-Traps.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Diversion Traps (The GNU Troff Manual)</title>
+
+<meta name="description" content="Diversion Traps (The GNU Troff Manual)">
+<meta name="keywords" content="Diversion Traps (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Vertical-Position-Traps.html" rel="up" title="Vertical Position Traps">
+<link href="Input-Line-Traps.html" rel="next" title="Input Line Traps">
+<link href="The-Implicit-Page-Trap.html" rel="prev" title="The Implicit Page Trap">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="Diversion-Traps">
+<div class="nav-panel">
+<p>
+Next: <a href="Input-Line-Traps.html" accesskey="n" rel="next">Input Line Traps</a>, Previous: <a href="The-Implicit-Page-Trap.html" accesskey="p" rel="prev">The Implicit Page Trap</a>, Up: <a href="Vertical-Position-Traps.html" accesskey="u" rel="up">Vertical Position Traps</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Diversion-Traps-1">5.28.1.3 Diversion Traps</h4>
+<a class="index-entry-id" id="index-diversion-traps"></a>
+<a class="index-entry-id" id="index-traps_002c-diversion"></a>
+
+<p>A diversion is not formatted in the context of a page, so it lacks page
+location traps; instead it can have a <em class="dfn">diversion trap</em>. There can
+exist at most one such vertical position trap per diversion.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002edt"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.dt</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">dist</i></span> <span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002edt'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-dt"></a>
+<a class="index-entry-id" id="index-_002et-register_002c-and-diversions"></a>
+<a class="index-entry-id" id="index-setting-diversion-trap-_0028dt_0029"></a>
+<a class="index-entry-id" id="index-diversion-trap_002c-setting-_0028dt_0029"></a>
+<a class="index-entry-id" id="index-trap_002c-diversion_002c-setting-_0028dt_0029"></a>
+<p>Set a trap <em class="emph">within</em> a diversion at location <var class="var">dist</var>, which is
+interpreted relative to diversion rather than page boundaries. If invoked with
+fewer than two arguments, any diversion trap in the current diversion is
+removed. The register <code class="code">.t</code> works within diversions. It is an
+error to invoke <code class="code">dt</code> in the top-level diversion.
+See <a class="xref" href="Diversions.html">Diversions</a>.
+</p></dd></dl>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Diversions.html b/doc/groff.html.node/Diversions.html
new file mode 100644
index 0000000..c0dc8e9
--- /dev/null
+++ b/doc/groff.html.node/Diversions.html
@@ -0,0 +1,394 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Diversions (The GNU Troff Manual)</title>
+
+<meta name="description" content="Diversions (The GNU Troff Manual)">
+<meta name="keywords" content="Diversions (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Punning-Names.html" rel="next" title="Punning Names">
+<link href="Traps.html" rel="prev" title="Traps">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Diversions">
+<div class="nav-panel">
+<p>
+Next: <a href="Punning-Names.html" accesskey="n" rel="next">Punning Names</a>, Previous: <a href="Traps.html" accesskey="p" rel="prev">Traps</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Diversions-1">5.29 Diversions</h3>
+<a class="index-entry-id" id="index-diversions"></a>
+
+<p>In <code class="code">roff</code> systems it is possible to format text as if for output,
+but instead of writing it immediately, one can <em class="dfn">divert</em> the
+formatted text into a named storage area. It is retrieved later by
+specifying its name after a control character. The same name space is
+used for such <i class="slanted">diversions</i> as for strings and macros; see
+<a class="ref" href="Identifiers.html">Identifiers</a>. Such text is sometimes said to be &ldquo;stored in a
+macro&rdquo;, but this coinage obscures the important distinction between
+macros and strings on one hand and diversions on the other; the former
+store <em class="emph">unformatted</em> input text, and the latter capture
+<em class="emph">formatted</em> output. Diversions also do not interpret arguments.
+Applications of diversions include &ldquo;keeps&rdquo; (preventing a page break
+from occurring at an inconvenient place by forcing a set of output lines
+to be set as a group), footnotes, tables of contents, and indices.
+<a class="index-entry-id" id="index-top_002dlevel-diversion"></a>
+<a class="index-entry-id" id="index-diversion_002c-top_002dlevel"></a>
+For orthogonality it is said that GNU <code class="code">troff</code> is in the
+<em class="dfn">top-level diversion</em> if no diversion is active (that is, formatted
+output is being &ldquo;diverted&rdquo; immediately to the output device).
+</p>
+<p>Dereferencing an undefined diversion will create an empty one of that
+name and cause a warning in category &lsquo;<samp class="samp">mac</samp>&rsquo; to be emitted.
+See <a class="xref" href="Warnings.html">Warnings</a>, for information about the enablement and suppression of
+warnings. A diversion does not exist for the purpose of testing with
+the <code class="code">d</code> conditional operator until its initial definition ends
+(see <a class="pxref" href="Operators-in-Conditionals.html">Operators in Conditionals</a>). The following requests are used to
+create and alter diversions.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002edi"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.di</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002edi'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-di"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eda"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.da</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002eda'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-da"></a>
+<a class="index-entry-id" id="index-beginning-diversion-_0028di_002c-box_0029"></a>
+<a class="index-entry-id" id="index-diversion_002c-beginning-_0028di_002c-box_0029"></a>
+<a class="index-entry-id" id="index-ending-diversion-_0028di_002c-box_0029"></a>
+<a class="index-entry-id" id="index-diversion_002c-ending-_0028di_002c-box_0029"></a>
+<a class="index-entry-id" id="index-appending-to-a-diversion-_0028da_002c-boxa_0029"></a>
+<a class="index-entry-id" id="index-diversion_002c-appending-to-_0028da_002c-boxa_0029"></a>
+<p>Start collecting formatted output in a diversion called <var class="var">name</var>. The
+<code class="code">da</code> request appends to a diversion called <var class="var">name</var>, creating it
+if necessary. If <var class="var">name</var> already exists as an alias, the target of
+the alias is replaced or appended to; recall <a class="ref" href="Strings.html">Strings</a>. The pending
+output line is diverted as well. Switching to another environment (with
+the <code class="code">ev</code> request) before invoking <code class="code">di</code> or <code class="code">da</code> avoids
+including any pending output line in the diversion; see
+<a class="ref" href="Environments.html">Environments</a>.
+</p>
+<p>Invoking <code class="code">di</code> or <code class="code">da</code> without an argument stops diverting
+output to the diversion named by the most recent corresponding request.
+If <code class="code">di</code> or <code class="code">da</code> is called without an argument when there is no
+current diversion, a warning in category &lsquo;<samp class="samp">di</samp>&rsquo; is produced.
+See <a class="xref" href="Warnings.html">Warnings</a>, for information about the enablement and suppression
+of warnings.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">Before the diversion.
+.di yyy
+In the diversion.
+.br
+.di
+After the diversion.
+.br
+ &rArr; After the diversion.
+.yyy
+ &rArr; Before the diversion. In the diversion.
+</pre></div></div>
+</dd></dl>
+
+<a class="index-entry-id" id="index-box-_0028diversion-operation_0029"></a>
+<p>GNU <code class="code">troff</code> supports <em class="dfn">box</em> requests to exclude a partially
+collected line from a diversion, as this is often desirable.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ebox"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.box</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002ebox'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-box"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eboxa"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.boxa</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002eboxa'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-boxa"></a>
+<p>Divert (or append) output to <var class="var">name</var>, similarly to the <code class="code">di</code> and
+<code class="code">da</code> requests, respectively. Any pending output line is <em class="emph">not</em>
+included in the diversion. Without an argument, stop diverting output;
+any pending output line inside the diversion is discarded.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">Before the box.
+.box xxx
+In the box.
+.br
+Hidden treasure.
+.box
+After the box.
+.br
+ &rArr; Before the box. After the box.
+.xxx
+ &rArr; In the box.
+</pre></div></div>
+</dd></dl>
+
+<p>Apart from pending output line inclusion and the request names that
+populate them, boxes are handled exactly as diversions are. All of the
+following <code class="code">groff</code> language elements can be used with them
+interchangeably.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002ez_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.z]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ez_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ez"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ed_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.d]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ed_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ed"></a>
+<a class="index-entry-id" id="index-nl-register_002c-and-_002ed"></a>
+<a class="index-entry-id" id="index-nested-diversions"></a>
+<a class="index-entry-id" id="index-diversion_002c-nested"></a>
+<a class="index-entry-id" id="index-diversion-name-register-_0028_002ez_0029"></a>
+<a class="index-entry-id" id="index-vertical-position-in-diversion-register-_0028_002ed_0029"></a>
+<a class="index-entry-id" id="index-position_002c-vertical_002c-in-diversion_002c-register-_0028_002ed_0029"></a>
+<a class="index-entry-id" id="index-diversion_002c-vertical-position-in_002c-register-_0028_002ed_0029"></a>
+<p>Diversions may be nested. The read-only string-valued register
+<code class="code">.z</code> contains the name of the current diversion. The read-only
+register <code class="code">.d</code> contains the current vertical place in the diversion.
+If the input text is not being diverted, <code class="code">.d</code> reports the same
+location as the register <code class="code">nl</code>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002eh_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.h]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eh_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eh"></a>
+<a class="index-entry-id" id="index-high_002dwater-mark-register-_0028_002eh_0029"></a>
+<a class="index-entry-id" id="index-mark_002c-high_002dwater_002c-register-_0028_002eh_0029"></a>
+<a class="index-entry-id" id="index-position-of-lowest-text-line-_0028_002eh_0029"></a>
+<a class="index-entry-id" id="index-text-line_002c-position-of-lowest-_0028_002eh_0029"></a>
+<p>The read-only register <code class="code">.h</code> stores the <em class="dfn">high-water mark</em> on the
+current page or in the current diversion. It corresponds to the text
+baseline of the lowest line on the page.<a class="footnote" id="DOCF113" href="groff.html_fot.html#FOOT113"><sup>113</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.tm .h==\n[.h], nl==\n[nl]
+ &rArr; .h==0, nl==-1
+This is a test.
+.br
+.sp 2
+.tm .h==\n[.h], nl==\n[nl]
+ &rArr; .h==40, nl==120
+</pre></div></div>
+
+<a class="index-entry-id" id="index-_002eh-register_002c-difference-from-nl"></a>
+<a class="index-entry-id" id="index-nl-register_002c-difference-from-_002eh"></a>
+<p>As implied by the example, vertical motion does not produce text
+baselines and thus does not increase the value interpolated by
+&lsquo;<samp class="samp">\n[.h]</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bdn_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[dn]</code></strong><a class="copiable-link" href='#index-_005cn_005bdn_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-dn"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005bdl_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[dl]</code></strong><a class="copiable-link" href='#index-_005cn_005bdl_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-dl"></a>
+<a class="index-entry-id" id="index-dn-register_002c-and-da-_0028boxa_0029"></a>
+<a class="index-entry-id" id="index-dl-register_002c-and-da-_0028boxa_0029"></a>
+<a class="index-entry-id" id="index-da-request_002c-and-dn-_0028dl_0029"></a>
+<a class="index-entry-id" id="index-boxa-request_002c-and-dn-_0028dl_0029"></a>
+<p>After completing a diversion, the writable registers <code class="code">dn</code> and
+<code class="code">dl</code> contain its vertical and horizontal sizes. Only the lines
+just processed are counted: for the computation of <code class="code">dn</code> and
+<code class="code">dl</code>, the requests <code class="code">da</code> and <code class="code">boxa</code> are handled as if
+<code class="code">di</code> and <code class="code">box</code> had been used, respectively&mdash;lines that have
+been already stored in the diversion (box) are not taken into account.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.\&quot; Center text both horizontally and vertically.
+.\&quot; Macro .(c starts centering mode; .)c terminates it.
+.
+.\&quot; Disable the escape character with .eo so that we
+.\&quot; don't have to double backslashes on the &quot;\n&quot;s.
+.eo
+.de (c
+. br
+. ev (c
+. evc 0
+. in 0
+. nf
+. di @c
+..
+</pre></div></div>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de )c
+. br
+. ev
+. di
+. nr @s (((\n[.t]u - \n[dn]u) / 2u) - 1v)
+. sp \n[@s]u
+. ce 1000
+. @c
+. ce 0
+. sp \n[@s]u
+. br
+. fi
+. rr @s
+. rm @c
+..
+.ec
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0021anything"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\!</code><span class="r"><i class="slanted">anything</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0021anything'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0021"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_003fanything_005c_003f"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\?</code><span class="r"><i class="slanted">anything</i></span><code class="t">\?</code></strong><a class="copiable-link" href='#index-_005c_003fanything_005c_003f'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_003f"></a>
+<a class="index-entry-id" id="index-transparent-output-_0028_005c_0021_002c-_005c_003f_0029"></a>
+<a class="index-entry-id" id="index-output_002c-transparent-_0028_005c_0021_002c-_005c_003f_0029"></a>
+<p><em class="dfn">Transparently</em> embed <var class="var">anything</var> into the current diversion,
+preventing requests, macro calls, and escape sequences from being
+interpreted when read into a diversion. This is useful for preventing
+them from taking effect until the diverted text is actually output. The
+<code class="code">\!</code> escape sequence transparently embeds input up to and including
+the end of the line. The <code class="code">\?</code> escape sequence transparently embeds
+input until its own next occurrence.
+</p>
+<a class="index-entry-id" id="index-_005c_003f_002c-and-copy-mode-1"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-_005c_003f-1"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-_005c_003f-1"></a>
+<a class="index-entry-id" id="index-_005c_0021_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-_005c_0021"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-_005c_0021"></a>
+<p><var class="var">anything</var> may not contain newlines; use <code class="code">\!</code> by itself to
+embed newlines in a diversion. The escape sequence <code class="code">\?</code> is also
+recognized in copy mode and turned into a single internal code; it is
+this code that terminates <var class="var">anything</var>. Thus the following example
+prints&nbsp;4.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr x 1
+.nf
+.di d
+\?\\?\\\\?\\\\\\\\nx\\\\?\\?\?
+.di
+.nr x 2
+.di e
+.d
+.di
+.nr x 3
+.di f
+.e
+.di
+.nr x 4
+.f
+</pre></div></div>
+
+<p>Both escape sequences read the data in copy mode.
+</p>
+<a class="index-entry-id" id="index-_005c_0021_002c-in-top_002dlevel-diversion"></a>
+<a class="index-entry-id" id="index-top_002dlevel-diversion_002c-and-_005c_0021"></a>
+<a class="index-entry-id" id="index-diversion_002c-top_002dlevel_002c-and-_005c_0021"></a>
+<p>If <code class="code">\!</code> is used in the top-level diversion, its argument is
+directly embedded into GNU <code class="code">troff</code>&rsquo;s intermediate output. This can
+be used, for example, to control a postprocessor that processes the data
+before it is sent to an output driver.
+</p>
+<a class="index-entry-id" id="index-_005c_003f_002c-in-top_002dlevel-diversion"></a>
+<a class="index-entry-id" id="index-top_002dlevel-diversion_002c-and-_005c_003f"></a>
+<a class="index-entry-id" id="index-diversion_002c-top_002dlevel_002c-and-_005c_003f"></a>
+<p>The <code class="code">\?</code> escape used in the top-level diversion produces no output
+at all; its argument is simply ignored.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-_005c_0021_002c-and-output-request"></a>
+<a class="index-entry-id" id="index-output-request_002c-and-_005c_0021"></a>
+<a class="index-entry-id" id="index-output-request_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-output-request"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-output-request"></a>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eoutput"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.output</code></strong> <var class="def-var-arguments">contents</var><a class="copiable-link" href='#index-_002eoutput'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-output"></a>
+<p>Emit <var class="var">contents</var> directly to GNU <code class="code">troff</code>&rsquo;s intermediate output
+(subject to copy mode interpretation); this is similar to <code class="code">\!</code> used
+at the top level. An initial neutral double quote in <var class="var">contents</var> is
+stripped to allow embedding of leading spaces.
+</p>
+<p>This request can&rsquo;t be used before the first page has started&mdash;if you
+get an error, simply insert <code class="code">.br</code> before the <code class="code">output</code> request.
+</p>
+<p>Use with caution! It is normally only needed for mark-up used by a
+postprocessor that does something with the output before sending it to
+the output device, filtering out <var class="var">contents</var> again.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002easciify"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.asciify</code></strong> <var class="def-var-arguments">div</var><a class="copiable-link" href='#index-_002easciify'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-asciify"></a>
+<a class="index-entry-id" id="index-unformatting-diversions-_0028asciify_0029"></a>
+<a class="index-entry-id" id="index-diversion_002c-unformatting-_0028asciify_0029"></a>
+<a class="index-entry-id" id="index-trin-request_002c-and-asciify"></a>
+<p><em class="dfn">Unformat</em> the diversion <var class="var">div</var> in a way such that Unicode basic
+Latin (<abbr class="acronym">ASCII</abbr>) characters, characters translated with the
+<code class="code">trin</code> request, space characters, and some escape sequences, that
+were formatted and diverted into <var class="var">div</var> are treated like ordinary
+input characters when <var class="var">div</var> is reread. Doing so can be useful in
+conjunction with the <code class="code">writem</code> request. <code class="code">asciify</code> can be also
+used for gross hacks; for example, the following sets
+register&nbsp;<code class="code">n</code> to&nbsp;1.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.tr @.
+.di x
+@nr n 1
+.br
+.di
+.tr @@
+.asciify x
+.x
+</pre></div></div>
+
+<p><code class="code">asciify</code> cannot return all items in a diversion to their source
+equivalent: nodes such as those produced by the <code class="code">\N</code> escape
+sequence will remain nodes, so the result cannot be guaranteed to be a
+pure string. See <a class="xref" href="Copy-Mode.html">Copy Mode</a>. Glyph parameters such as the type face
+and size are not preserved; use <code class="code">unformat</code> to achieve that.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eunformat"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.unformat</code></strong> <var class="def-var-arguments">div</var><a class="copiable-link" href='#index-_002eunformat'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-unformat"></a>
+<p>Like <code class="code">asciify</code>, unformat the diversion <var class="var">div</var>. However,
+<code class="code">unformat</code> handles only tabs and spaces between words, the latter
+usually arising from spaces or newlines in the input. Tabs are treated
+as input tokens, and spaces become adjustable again. The vertical sizes
+of lines are not preserved, but glyph information (font, type size,
+space width, and so on) is retained.
+</p></dd></dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Punning-Names.html">Punning Names</a>, Previous: <a href="Traps.html">Traps</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Document-Formats.html b/doc/groff.html.node/Document-Formats.html
new file mode 100644
index 0000000..9079d67
--- /dev/null
+++ b/doc/groff.html.node/Document-Formats.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Document Formats (The GNU Troff Manual)</title>
+
+<meta name="description" content="Document Formats (The GNU Troff Manual)">
+<meta name="keywords" content="Document Formats (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Common-Features.html" rel="up" title="Common Features">
+<link href="Columnation.html" rel="next" title="Columnation">
+<link href="Indexing.html" rel="prev" title="Indexing">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Document-Formats">
+<div class="nav-panel">
+<p>
+Next: <a href="Columnation.html" accesskey="n" rel="next">Columnation</a>, Previous: <a href="Indexing.html" accesskey="p" rel="prev">Indexing</a>, Up: <a href="Common-Features.html" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Document-Formats-1">3.2.9 Document Formats</h4>
+<a class="index-entry-id" id="index-document-formats"></a>
+
+<p>Some macro packages supply stock configurations of certain documents,
+like business letters and memoranda. These often also have provision
+for a <i class="slanted">cover sheet</i>, which may be rigid in its format. With
+these features, it is even more important to use the package&rsquo;s macros in
+preference to the formatter requests presented earlier, where possible.
+</p>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Document-Parts.html b/doc/groff.html.node/Document-Parts.html
new file mode 100644
index 0000000..7b83511
--- /dev/null
+++ b/doc/groff.html.node/Document-Parts.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Document Parts (The GNU Troff Manual)</title>
+
+<meta name="description" content="Document Parts (The GNU Troff Manual)">
+<meta name="keywords" content="Document Parts (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Language-Concepts.html" rel="up" title="Language Concepts">
+<link href="Argument-Units.html" rel="prev" title="Argument Units">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="Document-Parts">
+<div class="nav-panel">
+<p>
+Previous: <a href="Argument-Units.html" accesskey="p" rel="prev">Argument Units</a>, Up: <a href="Language-Concepts.html" accesskey="u" rel="up">Language Concepts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Document-Parts-1">6.1.1.3 Document Parts</h4>
+
+<p>A correct intermediate output document consists of two parts, the
+<em class="dfn">prologue</em> and the <em class="dfn">body</em>.
+</p>
+<p>The task of the prologue is to set the general device parameters using
+three exactly specified commands. <code class="code">gtroff</code>&rsquo;s prologue is
+guaranteed to consist of the following three lines (in that order):
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">x T <var class="var">device</var>
+x res <var class="var">n</var> <var class="var">h</var> <var class="var">v</var>
+x init
+</pre></div></div>
+
+<p>with the arguments set as outlined in <a class="ref" href="Device-Control-Commands.html">Device Control Commands</a>.
+The parser for the intermediate output format is able to interpret
+additional whitespace and comments as well even in the prologue.
+</p>
+<p>The body is the main section for processing the document data.
+Syntactically, it is a sequence of any commands different from the ones
+used in the prologue. Processing is terminated as soon as the first
+&lsquo;<samp class="samp">x&nbsp;stop</samp>&rsquo;<!-- /@w --> command is encountered; the last line of any
+<code class="code">gtroff</code> intermediate output always contains such a command.
+</p>
+<p>Semantically, the body is page oriented. A new page is started by a
+&lsquo;<samp class="samp">p</samp>&rsquo; command. Positioning, writing, and drawing commands are always
+done within the current page, so they cannot occur before the first
+&lsquo;<samp class="samp">p</samp>&rsquo; command. Absolute positioning (by the &lsquo;<samp class="samp">H</samp>&rsquo; and &lsquo;<samp class="samp">V</samp>&rsquo;
+commands) is done relative to the current page; all other positioning is
+done relative to the current location within this page.
+</p>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Drawing-Geometric-Objects.html b/doc/groff.html.node/Drawing-Geometric-Objects.html
new file mode 100644
index 0000000..fa0732f
--- /dev/null
+++ b/doc/groff.html.node/Drawing-Geometric-Objects.html
@@ -0,0 +1,361 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Drawing Geometric Objects (The GNU Troff Manual)</title>
+
+<meta name="description" content="Drawing Geometric Objects (The GNU Troff Manual)">
+<meta name="keywords" content="Drawing Geometric Objects (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Traps.html" rel="next" title="Traps">
+<link href="Page-Motions.html" rel="prev" title="Page Motions">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Drawing-Geometric-Objects">
+<div class="nav-panel">
+<p>
+Next: <a href="Traps.html" accesskey="n" rel="next">Traps</a>, Previous: <a href="Page-Motions.html" accesskey="p" rel="prev">Page Motions</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Drawing-Geometric-Objects-1">5.26 Drawing Geometric Objects</h3>
+<a class="index-entry-id" id="index-drawing-requests"></a>
+<a class="index-entry-id" id="index-requests-for-drawing"></a>
+
+<p>A few of the formatter&rsquo;s escape sequences draw lines and other geometric
+objects. Combined with each other and with page motion commands
+(see <a class="pxref" href="Page-Motions.html">Page Motions</a>), a wide variety of figures is possible. For
+complex drawings, these operations can be cumbersome; the preprocessors
+<code class="code">gpic</code> or <code class="code">ggrn</code> are typically used instead.
+</p>
+<p>The <code class="code">\l</code> and <code class="code">\L</code> escape sequences draw horizontal and
+vertical sequences of glyphs, respectively. Even the simplest of
+output devices supports them.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cl_0027l_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\l<code class="code">'</code></code><span class="r"><i class="slanted">l</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cl_0027l_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cl"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cl_0027lc_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\l<code class="code">'</code></code><span class="r"><i class="slanted">lc</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cl_0027lc_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-drawing-horizontal-lines-_0028_005cl_0029"></a>
+<a class="index-entry-id" id="index-horizontal-line_002c-drawing-_0028_005cl_0029"></a>
+<a class="index-entry-id" id="index-line_002c-horizontal_002c-drawing-_0028_005cl_0029"></a>
+<p>Draw a horizontal line of length <var class="var">l</var> from the drawing position.
+Rightward motion is positive. Afterward, the drawing position is at the
+right end of the line. The default scaling unit is &lsquo;<samp class="samp">m</samp>&rsquo;.
+</p>
+<a class="index-entry-id" id="index-baseline-rule-special-character_0028_005c_005bru_005d_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-underscore-_0028_005c_005bru_005d_0029"></a>
+<a class="index-entry-id" id="index-line-drawing-glyph"></a>
+<a class="index-entry-id" id="index-glyph_002c-for-line-drawing"></a>
+<p>The optional second parameter&nbsp;<var class="var">c</var> is a character with which to
+draw the line. The default is the baseline rule special character,
+<code class="code">\[ru]</code>.
+</p>
+<a class="index-entry-id" id="index-dummy-character-_0028_005c_0026_0029_002c-effect-on-_005cl-escape-sequence"></a>
+<a class="index-entry-id" id="index-character_002c-dummy-_0028_005c_0026_0029_002c-effect-on-_005cl-escape-sequence"></a>
+<p>If <var class="var">c</var> is a valid scaling unit, put <code class="code">\&amp;</code> after <var class="var">l</var> to
+disambiguate the input.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de textbox
+\[br]\\$*\[br]\l'|0\[rn]'\l'|0\[ul]'
+..
+</pre></div></div>
+
+<p>The foregoing outputs a box rule (a vertical line), the text
+argument(s), and another box rule. We employ the boundary-relative
+motion operator &lsquo;<samp class="samp">|</samp>&rsquo;. Finally, the line-drawing escape sequences
+draw a radical extender (a form of overline) and an underline from the
+drawing position to the position coresponding to beginning of the
+<em class="emph">input</em> line. The drawing position returns to just after the
+right-hand box rule because the lengths of the drawn lines are negative,
+as noted above.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cL_0027l_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\L<code class="code">'</code></code><span class="r"><i class="slanted">l</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cL_0027l_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cL"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cL_0027lc_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\L<code class="code">'</code></code><span class="r"><i class="slanted">lc</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cL_0027lc_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-drawing-vertical-lines-_0028_005cL_0029"></a>
+<a class="index-entry-id" id="index-vertical-line-drawing-_0028_005cL_0029"></a>
+<a class="index-entry-id" id="index-line_002c-vertical_002c-drawing-_0028_005cL_0029"></a>
+<a class="index-entry-id" id="index-line-drawing-glyph-1"></a>
+<a class="index-entry-id" id="index-glyph-for-line-drawing"></a>
+<a class="index-entry-id" id="index-box-rule-glyph-_0028_005c_005bbr_005d_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-box-rule-_0028_005c_005bbr_005d_0029"></a>
+<p>Draw a vertical line of length <var class="var">l</var> from the drawing position.
+Downward motion is positive. The default scaling unit is &lsquo;<samp class="samp">v</samp>&rsquo;. The
+default character is the box rule, <code class="code">\[br]</code>. As with vertical
+motion escape sequences, text processing continues where the line ends.
+<code class="code">\L</code> is otherwise similar to <code class="code">\l</code>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">$ nroff &lt;&lt;EOF
+This is a \L'3v'test.
+EOF
+ &rArr; This is a
+ &rArr; |
+ &rArr; |
+ &rArr; |test.
+</pre></div></div>
+
+<p>When writing text, the drawing position is at the text baseline; recall
+<a class="ref" href="Page-Geometry.html">Page Geometry</a>.
+</p></dd></dl>
+
+<p>The <code class="code">\D</code> escape sequence provides <em class="dfn">drawing commands</em> that
+direct the output device to render geometrical objects rather than
+glyphs. Specific devices may support only a subset, or may feature
+additional ones; consult the man page for the output driver in use.
+Terminal devices in particular implement almost none. See <a class="xref" href="Graphics-Commands.html">Graphics Commands</a>.
+</p>
+<p>Rendering starts at the drawing position; when finished, the drawing
+position is left at the rightmost point of the object, even for closed
+figures, except where noted. GNU <code class="code">troff</code> draws stroked (outlined)
+objects with the stroke color, and shades filled ones with the fill
+color. See <a class="xref" href="Colors.html">Colors</a>. Coordinates <var class="var">h</var> and <var class="var">v</var> are horizontal
+and vertical motions relative to the drawing position or previous point
+in the command. The default scaling unit for horizontal measurements
+(and diameters of circles) is &lsquo;<samp class="samp">m</samp>&rsquo;; for vertical ones, &lsquo;<samp class="samp">v</samp>&rsquo;.
+</p>
+<p>Circles, ellipses, and polygons can be drawn filled or stroked. These
+are independent properties; if you want a filled, stroked figure, you
+must draw the same figure twice using each drawing command. A filled
+figure is always smaller than an outlined one because the former is
+drawn only within its defined area, whereas strokes have a line
+thickness (set with &lsquo;<samp class="samp">\D't'</samp>&rsquo;).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">\h'1i'\v'1i'\
+\# increase line thickness
+\Z'\D't 5p''\
+\# draw stroked (unfilled) polygon
+\Z'\D'p 3 3 -6 0''\
+\# draw filled (solid) polygon
+\Z'\D'P 3 3 -6 0''
+</pre></div></div>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cD_0027command-argument-_2026_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\D<code class="code">'</code></code><span class="r"><i class="slanted">command argument &hellip;</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cD_0027command-argument-_2026_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cD"></a>
+<p>Drawing command escape sequence parameters begin with an ordinary
+character, <var class="var">command</var>, selecting the type of object to be drawn,
+followed by <var class="var">argument</var>s whose meaning is determined by
+<var class="var">command</var>.
+</p>
+<dl class="table">
+<dt id='index-drawing-a-spline-_0028_005cD_0027_007e-_2026_0027_0029'><span><code class="code">\D'~ <var class="var">h1</var> <var class="var">v1</var> &hellip; <var class="var">hn</var> <var class="var">vn</var>'</code><a class="copiable-link" href='#index-drawing-a-spline-_0028_005cD_0027_007e-_2026_0027_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-spline_002c-drawing-_0028_005cD_0027_007e-_2026_0027_0029"></a>
+<p>Draw a B-spline to each point in sequence, leaving the drawing position
+at (<var class="var">hn</var>, <var class="var">vn</var>).
+</p>
+</dd>
+<dt id='index-arc_002c-drawing-_0028_005cD_0027a-_2026_0027_0029'><span><code class="code">\D'a <var class="var">hc</var> <var class="var">vc</var> <var class="var">h</var> <var class="var">v</var>'</code><a class="copiable-link" href='#index-arc_002c-drawing-_0028_005cD_0027a-_2026_0027_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-drawing-an-arc-_0028_005cD_0027a-_2026_0027_0029"></a>
+<p>Draw a circular arc centered at (<var class="var">hc</var>, <var class="var">vc</var>) counterclockwise
+from the drawing position to a point (<var class="var">h</var>, <var class="var">v</var>) relative to the
+center. <a class="footnote" id="DOCF105" href="groff.html_fot.html#FOOT105"><sup>105</sup></a>
+</p>
+</dd>
+<dt id='index-circle_002c-stroked_002c-drawing-_0028_005cD_0027c-_2026_0027_0029'><span><code class="code">\D'c <var class="var">d</var>'</code><a class="copiable-link" href='#index-circle_002c-stroked_002c-drawing-_0028_005cD_0027c-_2026_0027_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-drawing-a-stroked-circle-_0028_005cD_0027c-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-stroked-circle_002c-drawing-_0028_005cD_0027c-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-circle_002c-outlined_002c-drawing-_0028_005cD_0027c-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-drawing-an-outlined-circle-_0028_005cD_0027c-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-outlined-circle_002c-drawing-_0028_005cD_0027c-_2026_0027_0029"></a>
+<p>Draw a circle of diameter <var class="var">d</var> with its leftmost point at the drawing
+position.
+</p>
+</dd>
+<dt id='index-circle_002c-filled_002c-drawing-_0028_005cD_0027C-_2026_0027_0029'><span><code class="code">\D'C <var class="var">d</var>'</code><a class="copiable-link" href='#index-circle_002c-filled_002c-drawing-_0028_005cD_0027C-_2026_0027_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-drawing-a-filled-circle-_0028_005cD_0027C-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-filled-circle_002c-drawing-_0028_005cD_0027C-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-circle_002c-solid_002c-drawing-_0028_005cD_0027C-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-drawing-a-solid-circle-_0028_005cD_0027C-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-solid-circle_002c-drawing-_0028_005cD_0027C-_2026_0027_0029"></a>
+<p>As &lsquo;<samp class="samp">\D'C <span class="r">&hellip;</span>'</samp>&rsquo;, but the circle is filled.
+</p>
+</dd>
+<dt id='index-ellipse_002c-stroked_002c-drawing-_0028_005cD_0027e-_2026_0027_0029'><span><code class="code">\D'e <var class="var">h</var> <var class="var">v</var>'</code><a class="copiable-link" href='#index-ellipse_002c-stroked_002c-drawing-_0028_005cD_0027e-_2026_0027_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-drawing-a-stroked-ellipse-_0028_005cD_0027e-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-stroked-ellipse_002c-drawing-_0028_005cD_0027e-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-ellipse_002c-outlined_002c-drawing-_0028_005cD_0027e-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-drawing-an-outlined-ellipse-_0028_005cD_0027e-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-outlined-ellipse_002c-drawing-_0028_005cD_0027e-_2026_0027_0029"></a>
+<p>Draw an ellipse of width <var class="var">h</var> and height <var class="var">v</var> with its leftmost
+point at the drawing position.
+</p>
+</dd>
+<dt id='index-ellipse_002c-filled_002c-drawing-_0028_005cD_0027E-_2026_0027_0029'><span><code class="code">\D'E <var class="var">x</var> <var class="var">y</var>'</code><a class="copiable-link" href='#index-ellipse_002c-filled_002c-drawing-_0028_005cD_0027E-_2026_0027_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-drawing-a-filled-ellipse-_0028_005cD_0027E-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-filled-ellipse_002c-drawing-_0028_005cD_0027E-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-ellipse_002c-solid_002c-drawing-_0028_005cD_0027E-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-drawing-a-solid-ellipse-_0028_005cD_0027E-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-solid-ellipse_002c-drawing-_0028_005cD_0027E-_2026_0027_0029"></a>
+<p>As &lsquo;<samp class="samp">\D'e <span class="r">&hellip;</span>'</samp>&rsquo;, but the ellipse is filled.
+</p>
+</dd>
+<dt id='index-line_002c-drawing-_0028_005cD_0027l-_2026_0027_0029'><span><code class="code">\D'l <var class="var">dx</var> <var class="var">dy</var>'</code><a class="copiable-link" href='#index-line_002c-drawing-_0028_005cD_0027l-_2026_0027_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-drawing-a-line-_0028_005cD_0027l-_2026_0027_0029"></a>
+<p>Draw line from the drawing position to (<var class="var">h</var>, <var class="var">v</var>).
+</p>
+<p>The following is a macro for drawing a box around a text argument; for
+simplicity, the box margin is a fixed at 0.2<span class="dmn">m</span>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de TEXTBOX
+. nr @wd \w'\\$1'
+\h'.2m'\
+\h'-.2m'\v'(.2m - \\n[rsb]u)'\
+\D'l 0 -(\\n[rst]u - \\n[rsb]u + .4m)'\
+\D'l (\\n[@wd]u + .4m) 0'\
+\D'l 0 (\\n[rst]u - \\n[rsb]u + .4m)'\
+\D'l -(\\n[@wd]u + .4m) 0'\
+\h'.2m'\v'-(.2m - \\n[rsb]u)'\
+\\$1\
+\h'.2m'
+..
+</pre></div></div>
+
+<p>The argument is measured with the <code class="code">\w</code> escape sequence. Its width
+is stored in register <code class="code">@wd</code>. <code class="code">\w</code> also sets the registers
+<code class="code">rst</code> and <code class="code">rsb</code>; these contain its maximum vertical extents of
+the argument. Then, four lines are drawn to form a box, offset by the
+box margin.
+</p>
+</dd>
+<dt id='index-polygon_002c-stroked_002c-drawing-_0028_005cD_0027p-_2026_0027_0029'><span><code class="code">\D'p <var class="var">h1</var> <var class="var">v1</var> &hellip; <var class="var">hn</var> <var class="var">vn</var>'</code><a class="copiable-link" href='#index-polygon_002c-stroked_002c-drawing-_0028_005cD_0027p-_2026_0027_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-drawing-a-stroked-polygon-_0028_005cD_0027p-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-stroked-polygon_002c-drawing-_0028_005cD_0027p-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-polygon_002c-outlined_002c-drawing-_0028_005cD_0027p-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-drawing-an-outlined-polygon-_0028_005cD_0027p-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-outlined-polygon_002c-drawing-_0028_005cD_0027p-_2026_0027_0029"></a>
+<p>Draw polygon with vertices at drawing position and each point in
+sequence. GNU <code class="code">troff</code> closes the polygon by drawing a line from
+(<var class="var">hn</var>, <var class="var">vn</var>) back to the initial drawing position.
+Afterward, the drawing position is left at (<var class="var">hn</var>, <var class="var">vn</var>).
+</p>
+</dd>
+<dt id='index-polygon_002c-filled_002c-drawing-_0028_005cD_0027P-_2026_0027_0029'><span><code class="code">\D'P <var class="var">dx1</var> <var class="var">dy1</var> <var class="var">dx2</var> <var class="var">dy2</var> &hellip;'</code><a class="copiable-link" href='#index-polygon_002c-filled_002c-drawing-_0028_005cD_0027P-_2026_0027_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-drawing-a-filled-polygon-_0028_005cD_0027P-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-filled-polygon_002c-drawing-_0028_005cD_0027P-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-polygon_002c-solid_002c-drawing-_0028_005cD_0027P-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-drawing-a-solid-polygon-_0028_005cD_0027P-_2026_0027_0029"></a>
+<a class="index-entry-id" id="index-solid-polygon_002c-drawing-_0028_005cD_0027P-_2026_0027_0029"></a>
+<p>As &lsquo;<samp class="samp">\D'P <span class="r">&hellip;</span>'</samp>&rsquo;, but the polygon is filled.
+</p>
+<p>The following macro is like the &lsquo;<samp class="samp">\D'l'</samp>&rsquo; example, but shades the
+box. We draw the box before writing the text because colors in GNU
+<code class="code">troff</code> have no transparency; in othe opposite order, the filled
+polygon would occlude the text.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de TEXTBOX
+. nr @wd \w'\\$1'
+\h'.2m'\
+\h'-.2m'\v'(.2m - \\n[rsb]u)'\
+\M[lightcyan]\
+\D'P 0 -(\\n[rst]u - \\n[rsb]u + .4m) \
+ (\\n[@wd]u + .4m) 0 \
+ 0 (\\n[rst]u - \\n[rsb]u + .4m) \
+ -(\\n[@wd]u + .4m) 0'\
+\h'.2m'\v'-(.2m - \\n[rsb]u)'\
+\M[]\
+\\$1\
+\h'.2m'
+..
+</pre></div></div>
+
+</dd>
+<dt id='index-line-thickness-_0028_005cD_0027t-_2026_0027_0029'><span><code class="code">\D't <var class="var">n</var>'</code><a class="copiable-link" href='#index-line-thickness-_0028_005cD_0027t-_2026_0027_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-thickness-of-lines-_0028_005cD_0027t-_2026_0027_0029"></a>
+<p>Set the stroke thickness of geometric objects to <var class="var">n</var> basic units. A
+zero <var class="var">n</var> selects the minimal supported thickness. A negative
+<var class="var">n</var> selects a thickness proportional to the type size; this is the
+default.
+</p></dd>
+</dl>
+</dd></dl>
+
+<p>In a hazy penumbra between text rendering and drawing commands we locate
+the bracket-building escape sequence, <code class="code">\b</code>. It can assemble
+apparently large glyphs by vertically stacking ordinary ones.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cb_0027contents_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\b<code class="code">'</code></code><span class="r"><i class="slanted">contents</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cb_0027contents_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cb"></a>
+<a class="index-entry-id" id="index-pile_002c-glyph-_0028_005cb_0029"></a>
+<a class="index-entry-id" id="index-glyph-pile-_0028_005cb_0029"></a>
+<a class="index-entry-id" id="index-stacking-glyphs-_0028_005cb_0029"></a>
+<p>Pile and center a sequence of glyphs vertically on the output line.
+<em class="dfn">Piling</em> stacks glyphs corresponding to each character in
+<var class="var">contents</var>, read from left to right, and placed from top to bottom.
+GNU <code class="code">troff</code> separates the glyphs vertically by 1<span class="dmn">m</span>, and the
+pile itself is centered 0.5<span class="dmn">m</span> above the text baseline. The
+horizontal drawing position is then advanced by the width of the widest
+glyph in the pile.
+</p>
+<a class="index-entry-id" id="index-_005cb_002c-limitations-of"></a>
+<a class="index-entry-id" id="index-limitations-of-_005cb-escape-sequence"></a>
+<p>This rather inflexible positioning algorithm doesn&rsquo;t work with the
+<code class="code">dvi</code> output device since its bracket pieces vary in height.
+Instead, use the <code class="code">geqn</code> preprocessor.
+</p>
+<p><a class="ref" href="Manipulating-Spacing.html">Manipulating Spacing</a> describes how to adjust the vertical spacing
+of the output line with the <code class="code">\x</code> escape sequence.
+</p>
+<p>The application of <code class="code">\b</code> that lends its name is construction of
+brackets, braces, and parentheses when typesetting mathematics. We
+might construct a large opening (left) brace as follows.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">\b'\[lt]\[bv]\[lk]\[bv]\[lb]'
+</pre></div></div>
+
+<p>See <cite class="cite">groff_char<span class="r">(7)</span></cite> for a list of special character
+identifiers.
+</p></dd></dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Traps.html">Traps</a>, Previous: <a href="Page-Motions.html">Page Motions</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Dummy-Characters.html b/doc/groff.html.node/Dummy-Characters.html
new file mode 100644
index 0000000..769574d
--- /dev/null
+++ b/doc/groff.html.node/Dummy-Characters.html
@@ -0,0 +1,166 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Dummy Characters (The GNU Troff Manual)</title>
+
+<meta name="description" content="Dummy Characters (The GNU Troff Manual)">
+<meta name="keywords" content="Dummy Characters (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Using-Fonts.html" rel="up" title="Using Fonts">
+<link href="Italic-Corrections.html" rel="prev" title="Italic Corrections">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+ul.mark-bullet {list-style-type: disc}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Dummy-Characters">
+<div class="nav-panel">
+<p>
+Previous: <a href="Italic-Corrections.html" accesskey="p" rel="prev">Italic Corrections</a>, Up: <a href="Using-Fonts.html" accesskey="u" rel="up">Using Fonts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Dummy-Characters-1">5.19.10 Dummy Characters</h4>
+
+<p>As discussed in <a class="ref" href="Requests-and-Macros.html">Requests and Macros</a>, the first character on an
+input line is treated specially. Further, formatting a glyph has many
+consequences on formatter state (see <a class="pxref" href="Environments.html">Environments</a>). Occasionally,
+we want to escape this context or embrace some of those consequences
+without actually rendering a glyph to the output.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0026-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\&amp;</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0026-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0026"></a>
+<a class="index-entry-id" id="index-dummy-character-_0028_005c_0026_0029"></a>
+<a class="index-entry-id" id="index-character_002c-dummy-_0028_005c_0026_0029"></a>
+<p>Interpolate a dummy character, which is constitutive of output but
+invisible.<a class="footnote" id="DOCF81" href="groff.html_fot.html#FOOT81"><sup>81</sup></a> Its presence alters the interpretation context of a
+subsequent input character, and enjoys several applications.
+</p>
+<ul class="itemize mark-bullet">
+<li>Prevent insertion of extra space after an end-of-sentence character.
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">Test.
+Test.
+ &rArr; Test. Test.
+Test.\&amp;
+Test.
+ &rArr; Test. Test.
+</pre></div></div>
+
+</li><li>Prevent recognition of a control character.
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">.Test
+ error&rarr; warning: macro 'Test' not defined
+\&amp;.Test
+ &rArr; .Test
+</pre></div></div>
+
+</li><li>Prevent kerning between two glyphs.
+
+
+</li><li>Translate a character to &ldquo;nothing&rdquo;.
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">.tr JIjiK\&amp;k\&amp;UVuv
+Post universitum, alea jacta est, OK?
+ &rArr; Post vniversitvm, alea iacta est, O?
+</pre></div></div>
+</li></ul>
+
+<p>The dummy character escape sequence sees use in macro definitions as a
+means of ensuring that arguments are treated as text even if they begin
+with spaces or control characters.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de HD \&quot; typeset a simple bold heading
+. sp
+. ft B
+\&amp;\\$1 \&quot; exercise: remove the \&amp;
+. ft
+. sp
+..
+.HD .\|.\|.\|surprised?
+</pre></div></div>
+</dd></dl>
+
+<p>One way to think about the dummy character is to imagine placing the
+symbol &lsquo;<samp class="samp">&amp;</samp>&rsquo; in the input at a certain location; if doing so has all
+the side effects on formatting that you desire except for sticking an
+ugly ampersand in the midst of your text, the dummy character is what
+you want in its place.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0029-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\)</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0029-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0029"></a>
+<a class="index-entry-id" id="index-transparent-dummy-character-_0028_005c_0029_0029"></a>
+<a class="index-entry-id" id="index-character_002c-transparent-dummy-_0028_005c_0029_0029"></a>
+<a class="index-entry-id" id="index-dummy-character_002c-transparent-_0028_005c_0029_0029"></a>
+<p>Interpolate a <i class="slanted">transparent</i> dummy character&mdash;one that is
+transparent to end-of-sentence detection. It behaves as <code class="code">\&amp;</code>,
+except that <code class="code">\&amp;</code> is treated as letters and numerals normally are
+after &lsquo;<samp class="samp">.</samp>&rsquo;, &lsquo;<samp class="samp">?</samp>&rsquo; and &lsquo;<samp class="samp">!</samp>&rsquo;; <code class="code">\&amp;</code> cancels end-of-sentence
+detection, and <code class="code">\)</code> does not.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de Suffix-&amp;
+. nop \&amp;\\$1
+..
+.
+.de Suffix-)
+. nop \)\\$1
+..
+.
+Here's a sentence.\c
+.Suffix-&amp; '
+Another one.\c
+.Suffix-) '
+And a third.
+ &rArr; Here's a sentence.' Another one.' And a third.
+</pre></div></div>
+</dd></dl>
+
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Previous: <a href="Italic-Corrections.html">Italic Corrections</a>, Up: <a href="Using-Fonts.html">Using Fonts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/End_002dof_002dinput-Traps.html b/doc/groff.html.node/End_002dof_002dinput-Traps.html
new file mode 100644
index 0000000..4dad1f2
--- /dev/null
+++ b/doc/groff.html.node/End_002dof_002dinput-Traps.html
@@ -0,0 +1,187 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>End-of-input Traps (The GNU Troff Manual)</title>
+
+<meta name="description" content="End-of-input Traps (The GNU Troff Manual)">
+<meta name="keywords" content="End-of-input Traps (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Traps.html" rel="up" title="Traps">
+<link href="Leading-Space-Traps.html" rel="prev" title="Leading Space Traps">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="End_002dof_002dinput-Traps">
+<div class="nav-panel">
+<p>
+Previous: <a href="Leading-Space-Traps.html" accesskey="p" rel="prev">Leading Space Traps</a>, Up: <a href="Traps.html" accesskey="u" rel="up">Traps</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="End_002dof_002dinput-Traps-1">5.28.5 End-of-input Traps</h4>
+<a class="index-entry-id" id="index-end_002dof_002dinput-traps"></a>
+<a class="index-entry-id" id="index-traps_002c-end_002dof_002dinput"></a>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eem"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.em</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002eem'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-em"></a>
+<a class="index-entry-id" id="index-setting-end_002dof_002dinput-trap-_0028em_0029"></a>
+<a class="index-entry-id" id="index-end_002dof_002dinput-trap_002c-setting-_0028em_0029"></a>
+<a class="index-entry-id" id="index-trap_002c-end_002dof_002dinput_002c-setting-_0028em_0029"></a>
+<a class="index-entry-id" id="index-end_002dof_002dinput-macro-_0028em_0029"></a>
+<a class="index-entry-id" id="index-macro_002c-end_002dof_002dinput-_0028em_0029"></a>
+<p>Set a trap at the end of input, calling macro <var class="var">name</var> after the last
+line of the last input file has been processed. If no argument is
+given, any existing end-of-input trap is removed.
+</p>
+<p>For example, if the document had to have a section at the bottom of the
+last page for someone to approve it, the <code class="code">em</code> request could be
+used.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de approval
+\c
+. ne 3v
+. sp (\\n[.t]u - 3v)
+. in +4i
+. lc _
+. br
+Approved:\t\a
+. sp
+Date:\t\t\a
+..
+.
+.em approval
+</pre></div></div>
+
+<p>The <code class="code">\c</code> in the above example needs explanation. For historical
+reasons (compatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>), the
+end-of-input macro exits as soon as it causes a page break if no
+partially collected line remains.<a class="footnote" id="DOCF111" href="groff.html_fot.html#FOOT111"><sup>111</sup></a>
+</p>
+<a class="index-entry-id" id="index-page-break_002c-final"></a>
+<a class="index-entry-id" id="index-break_002c-page_002c-final"></a>
+<a class="index-entry-id" id="index-page-ejection_002c-of-final-page"></a>
+<a class="index-entry-id" id="index-ejection_002c-page_002c-of-final-page"></a>
+<p>Let us assume that there is no <code class="code">\c</code> in the above <code class="code">approval</code>
+macro, that the page is full, and last output line has been broken with,
+say, a <code class="code">br</code> request. Because there is no more room, a <code class="code">ne</code>
+request at this point causes a page ejection, which in turn makes
+<code class="code">troff</code> exit immediately as just described. In most situations,
+this is not desired; people generally want to format the input after
+<code class="code">ne</code>.
+</p>
+<p>To force processing of the whole end-of-input macro independently of
+this behavior, it is thus advisable to (invisibly) ensure the existence
+of a partially collected line (<code class="code">\c</code>) whenever there is a chance
+that a page break can happen. In the above example, invoking the
+<code class="code">ne</code> request ensures that there is room for the subsequent
+formatted output on the same page, so we need insert <code class="code">\c</code> only
+once.
+</p>
+<p>The next example shows how to append three lines, then start a new page
+unconditionally. Since &lsquo;<samp class="samp">.ne&nbsp;1</samp>&rsquo;<!-- /@w --> doesn&rsquo;t give the desired
+effect&mdash;there is always one line available or we are already at the
+beginning of the next page&mdash;we temporarily increase the page length by
+one line so that we can use &lsquo;<samp class="samp">.ne&nbsp;2</samp>&rsquo;<!-- /@w -->.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de EM
+.pl +1v
+\c
+.ne 2
+line one
+.br
+\c
+.ne 2
+line two
+.br
+\c
+.ne 2
+line three
+.br
+.pl -1v
+\c
+'bp
+..
+.em EM
+</pre></div></div>
+
+<p>This specific feature affects only the first potential page break caused
+by the end-of-input macro; further page breaks emitted by the macro are
+handled normally.
+</p>
+<p>Another possible use of the <code class="code">em</code> request is to make GNU
+<code class="code">troff</code> emit a single large page instead of multiple pages. For
+example, one may want to produce a long plain text file for reading
+in a terminal or emulator without page footers and headers interrupting
+the body of the document. One approach is to set the page length at the
+beginning of the document to a very large value to hold all the
+text,<a class="footnote" id="DOCF112" href="groff.html_fot.html#FOOT112"><sup>112</sup></a> and
+automatically adjust it to the exact height of the document after the
+text has been output.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de adjust-page-length
+. br
+. pl \\n[nl]u \&quot; \n[nl]: current vertical position
+..
+.
+.de single-page-mode
+. pl 99999
+. em adjust-page-length
+..
+.
+.\&quot; Activate the above code if configured.
+.if \n[do-continuous-rendering] \
+. single-page-mode
+</pre></div></div>
+
+<p>Since only one end-of-input trap exists and another macro package may
+already use it, care must be taken not to break the mechanism. A simple
+solution would be to append the above macro to the macro package&rsquo;s
+end-of-input macro using the <code class="code">am</code> request.
+</p></dd></dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Previous: <a href="Leading-Space-Traps.html">Leading Space Traps</a>, Up: <a href="Traps.html">Traps</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Environment.html b/doc/groff.html.node/Environment.html
new file mode 100644
index 0000000..cd92fd5
--- /dev/null
+++ b/doc/groff.html.node/Environment.html
@@ -0,0 +1,151 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Environment (The GNU Troff Manual)</title>
+
+<meta name="description" content="Environment (The GNU Troff Manual)">
+<meta name="keywords" content="Environment (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Invoking-groff.html" rel="up" title="Invoking groff">
+<link href="Macro-Directories.html" rel="next" title="Macro Directories">
+<link href="Groff-Options.html" rel="prev" title="Groff Options">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Environment">
+<div class="nav-panel">
+<p>
+Next: <a href="Macro-Directories.html" accesskey="n" rel="next">Macro Directories</a>, Previous: <a href="Groff-Options.html" accesskey="p" rel="prev">Options</a>, Up: <a href="Invoking-groff.html" accesskey="u" rel="up">Invoking <code class="code">groff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Environment-1">2.2 Environment</h3>
+<a class="index-entry-id" id="index-environment-variables"></a>
+<a class="index-entry-id" id="index-variables-in-environment"></a>
+
+<p>There are also several environment variables (of the operating system,
+not within <code class="code">gtroff</code>) that can modify the behavior of <code class="code">groff</code>.
+</p>
+<dl class="table">
+<dt id='index-GROFF_005fBIN_005fPATH_002c-environment-variable'><span><code class="code">GROFF_BIN_PATH</code><a class="copiable-link" href='#index-GROFF_005fBIN_005fPATH_002c-environment-variable'> &para;</a></span></dt>
+<dd><p>This search path, followed by <code class="code">PATH</code>, is used for commands executed
+by <code class="code">groff</code>.
+</p>
+</dd>
+<dt id='index-GROFF_005fCOMMAND_005fPREFIX_002c-environment-variable'><span><code class="code">GROFF_COMMAND_PREFIX</code><a class="copiable-link" href='#index-GROFF_005fCOMMAND_005fPREFIX_002c-environment-variable'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-command-prefix"></a>
+<a class="index-entry-id" id="index-prefix_002c-for-commands"></a>
+<p>If this is set to&nbsp;<var class="var">X</var>, then <code class="command">groff</code> runs
+<code class="command"><var class="var">X</var>troff</code> instead of <code class="command">gtroff</code>. This also applies
+to <code class="command">tbl</code>, <code class="command">pic</code>, <code class="command">eqn</code>, <code class="command">grn</code>,
+<code class="command">chem</code>, <code class="command">refer</code>, and <code class="command">soelim</code>. It does not
+apply to <code class="command">grops</code>, <code class="command">grodvi</code>, <code class="command">grotty</code>,
+<code class="command">pre-grohtml</code>, <code class="command">post-grohtml</code>, <code class="command">preconv</code>,
+<code class="command">grolj4</code>, <code class="command">gropdf</code>, and <code class="command">gxditview</code>.
+</p>
+<p>The default command prefix is determined during the installation
+process. If a non-GNU <code class="code">troff</code> system is found, prefix &lsquo;<samp class="samp">g</samp>&rsquo; is
+used, none otherwise.
+</p>
+</dd>
+<dt id='index-GROFF_005fENCODING_002c-environment-variable'><span><code class="code">GROFF_ENCODING</code><a class="copiable-link" href='#index-GROFF_005fENCODING_002c-environment-variable'> &para;</a></span></dt>
+<dd><p>The value of this variable is passed to the <code class="code">preconv</code>
+preprocessor&rsquo;s <samp class="option">-e</samp> option to select the character encoding of
+input files. This variable&rsquo;s existence implies the <code class="code">groff</code> option
+<samp class="option">-k</samp>. If set but empty, <code class="code">groff</code> calls <code class="code">preconv</code>
+without an <samp class="option">-e</samp> option. <code class="code">groff</code>&rsquo;s <samp class="option">-K</samp> option
+overrides <code class="env">GROFF_ENCODING</code>. See the <cite class="cite">preconv<span class="r">(7)</span></cite> man page;
+type &lsquo;<samp class="samp">man preconv</samp>&rsquo; at the command line to view it.
+</p>
+</dd>
+<dt id='index-GROFF_005fFONT_005fPATH_002c-environment-variable'><span><code class="code">GROFF_FONT_PATH</code><a class="copiable-link" href='#index-GROFF_005fFONT_005fPATH_002c-environment-variable'> &para;</a></span></dt>
+<dd><p>A list of directories in which to seek the selected output device&rsquo;s
+directory of device and font description files. GNU <code class="code">troff</code>
+will search directories given as arguments to any specified <samp class="option">-F</samp>
+options before these, and a built-in list of directories after them.
+See <a class="xref" href="Font-Directories.html">Font Directories</a> and the <cite class="cite">troff<span class="r">(1)</span></cite> or
+<cite class="cite">gtroff<span class="r">(1)</span></cite> man pages.
+</p>
+</dd>
+<dt id='index-GROFF_005fTMAC_005fPATH_002c-environment-variable'><span><code class="code">GROFF_TMAC_PATH</code><a class="copiable-link" href='#index-GROFF_005fTMAC_005fPATH_002c-environment-variable'> &para;</a></span></dt>
+<dd><p>A list of directories in which to seek macro files. GNU <code class="code">troff</code>
+will search directories given as arguments to any specified <samp class="option">-M</samp>
+options before these, and a built-in list of directories after them.
+See <a class="xref" href="Macro-Directories.html">Macro Directories</a> and the <cite class="cite">troff<span class="r">(1)</span></cite> or
+<cite class="cite">gtroff<span class="r">(1)</span></cite> man pages.
+</p>
+</dd>
+<dt id='index-GROFF_005fTMPDIR_002c-environment-variable'><span><code class="code">GROFF_TMPDIR</code><a class="copiable-link" href='#index-GROFF_005fTMPDIR_002c-environment-variable'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-TMPDIR_002c-environment-variable"></a>
+<p>The directory in which <code class="code">groff</code> creates temporary files. If this is
+not set and <code class="env">TMPDIR</code> is set, temporary files are created in that
+directory. Otherwise temporary files are created in a system-dependent
+default directory (on Unix and GNU/Linux systems, this is usually
+<samp class="file">/tmp</samp>). <code class="code">grops</code>, <code class="code">grefer</code>, <code class="code">pre-grohtml</code>, and
+<code class="code">post-grohtml</code> can create temporary files in this directory.
+</p>
+</dd>
+<dt id='index-GROFF_005fTYPESETTER_002c-environment-variable'><span><code class="code">GROFF_TYPESETTER</code><a class="copiable-link" href='#index-GROFF_005fTYPESETTER_002c-environment-variable'> &para;</a></span></dt>
+<dd><p>Sets the default output device. If empty or not set, a build-time
+default (often <code class="code">ps</code>) is used. The <samp class="option">-T<var class="var">dev</var></samp> option
+overrides <code class="env">GROFF_TYPESETTER</code>.
+</p>
+</dd>
+<dt id='index-SOURCE_005fDATE_005fEPOCH_002c-environment-variable'><span><code class="code">SOURCE_DATE_EPOCH</code><a class="copiable-link" href='#index-SOURCE_005fDATE_005fEPOCH_002c-environment-variable'> &para;</a></span></dt>
+<dd><p>A timestamp (expressed as seconds since the Unix epoch) to use as the
+output creation timestamp in place of the current time. The time is
+converted to human-readable form using <cite class="cite">localtime<span class="r">(3)</span></cite> when the
+formatter starts up and stored in registers usable by documents and
+macro packages (see <a class="pxref" href="Built_002din-Registers.html">Built-in Registers</a>).
+</p>
+</dd>
+<dt id='index-TZ_002c-environment-variable'><span><code class="code">TZ</code><a class="copiable-link" href='#index-TZ_002c-environment-variable'> &para;</a></span></dt>
+<dd><p>The time zone to use when converting the current time (or value of
+<code class="env">SOURCE_DATE_EPOCH</code>) to human-readable form; see
+<cite class="cite">tzset<span class="r">(3)</span></cite>.
+</p></dd>
+</dl>
+
+<p>MS-DOS and MS-Windows ports of <code class="code">groff</code> use semicolons, rather than
+colons, to separate the directories in the lists described above.
+</p>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Macro-Directories.html">Macro Directories</a>, Previous: <a href="Groff-Options.html">Options</a>, Up: <a href="Invoking-groff.html">Invoking <code class="code">groff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Environments.html b/doc/groff.html.node/Environments.html
new file mode 100644
index 0000000..489ee62
--- /dev/null
+++ b/doc/groff.html.node/Environments.html
@@ -0,0 +1,250 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Environments (The GNU Troff Manual)</title>
+
+<meta name="description" content="Environments (The GNU Troff Manual)">
+<meta name="keywords" content="Environments (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Suppressing-Output.html" rel="next" title="Suppressing Output">
+<link href="Diversions.html" rel="prev" title="Diversions">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+ul.mark-bullet {list-style-type: disc}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Environments">
+<div class="nav-panel">
+<p>
+Next: <a href="Suppressing-Output.html" accesskey="n" rel="next">Suppressing Output</a>, Previous: <a href="Diversions.html" accesskey="p" rel="prev">Diversions</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Environments-1">5.31 Environments</h3>
+<a class="index-entry-id" id="index-environments"></a>
+
+<p>As discussed in <a class="ref" href="Deferring-Output.html">Deferring Output</a>, environments store most of the
+parameters that determine the appearance of text. A default environment
+named &lsquo;<samp class="samp">0</samp>&rsquo; exists when GNU <code class="code">troff</code> starts up; it is modified by
+formatting-related requests and escape sequences.
+</p>
+<a class="index-entry-id" id="index-stack"></a>
+<p>You can create new environments and switch among them. Only one is
+current at any given time. Active environments are managed using a
+<em class="dfn">stack</em>, a data structure supporting &ldquo;push&rdquo; and &ldquo;pop&rdquo;
+operations. The current environment is at the top of the stack.
+The same environment name can be pushed onto the stack multiple times,
+possibly interleaved with others. Popping the environment stack does
+not destroy the current environment; it remains accessible by name and
+can be made current again by pushing it at any time. Environments
+cannot be renamed or deleted, and can only be modified when current. To
+inspect the environment stack, use the <code class="code">pev</code> request; see
+<a class="ref" href="Debugging.html">Debugging</a>.
+</p>
+<p>Environments store the following information.
+</p>
+<ul class="itemize mark-bullet">
+<li>a partially collected line, if any
+
+</li><li>data about the most recently output glyph and line (registers
+<code class="code">.cdp</code>, <code class="code">.cht</code>, <code class="code">.csk</code>, <code class="code">.n</code>, <code class="code">.w</code>)
+
+</li><li>typeface parameters (size, family, style, height and slant, inter-word
+and inter-sentence space sizes)
+
+</li><li>page parameters (line length, title length, vertical spacing, line
+spacing, indentation, line numbering, centering, right-alignment,
+underlining, hyphenation parameters)
+
+</li><li>filling enablement; adjustment enablement and mode
+
+</li><li>tab stops; tab, leader, escape, control, no-break control, hyphenation,
+and margin characters
+
+</li><li>input line traps
+
+</li><li>stroke and fill colors
+</li></ul>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eev"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ev</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">ident</i></span>]</var><a class="copiable-link" href='#index-_002eev'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ev"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eev_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.ev]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eev_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eev-1"></a>
+<a class="index-entry-id" id="index-switching-environments-_0028ev_0029"></a>
+<a class="index-entry-id" id="index-environment_002c-switching-_0028ev_0029"></a>
+<a class="index-entry-id" id="index-environment-number_002fname-register-_0028_002eev_0029"></a>
+<p>Enter the environment <var class="var">ident</var>, which is created if it does not
+already exist, using the same parameters as for the default environment
+used at startup. With no argument, GNU <code class="code">troff</code> switches to the
+previous environment.
+</p>
+<p>Invoking <code class="code">ev</code> with an argument puts environment <var class="var">ident</var> onto
+the top of the environment stack. (If it isn&rsquo;t already present in the
+stack, this is a proper push.) Without an argument, <code class="code">ev</code> pops the
+environment stack, making the previous environment current. It is an
+error to pop the environment stack with no previous environment
+available. The read-only string-valued register <code class="code">.ev</code> contains the
+name of the current environment&mdash;the one at the top of the stack.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ev footnote-env
+.fam N
+.ps 6
+.vs 8
+.ll -.5i
+.ev
+
+<span class="r">&hellip;</span>
+
+.ev footnote-env
+\[dg] Observe the smaller text and vertical spacing.
+.ev
+</pre></div></div>
+
+<p>We can familiarize ourselves with stack behavior by wrapping the
+<code class="code">ev</code> request with a macro that reports the contents of the
+<code class="code">.ev</code> register to the standard error stream.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de EV
+. ev \\$1
+. tm environment is now \\n[.ev]
+..
+.
+.EV foo
+.EV bar
+.EV
+.EV baz
+.EV
+.EV
+.EV
+</pre></div></div>
+
+<div class="example">
+<div class="group"><pre class="example-preformatted"> error&rarr; environment is now foo
+ error&rarr; environment is now bar
+ error&rarr; environment is now foo
+ error&rarr; environment is now baz
+ error&rarr; environment is now foo
+ error&rarr; environment is now 0
+ error&rarr; error: environment stack underflow
+ error&rarr; environment is now 0
+</pre></div></div>
+
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eevc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.evc</code></strong> <var class="def-var-arguments">environment</var><a class="copiable-link" href='#index-_002eevc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-evc"></a>
+<a class="index-entry-id" id="index-copying-environment-_0028evc_0029"></a>
+<a class="index-entry-id" id="index-environment_002c-copying-_0028evc_0029"></a>
+<p>Copy the contents of <var class="var">environment</var> to the current environment.
+</p>
+<p>The following environment data are not copied.
+</p>
+<ul class="itemize mark-bullet">
+<li>a partially collected line, if present;
+
+</li><li>the interruption status of the previous input line (due to use of the
+<code class="code">\c</code> escape sequence);
+
+</li><li>the count of remaining lines to center, to right-justify, or to
+underline (with or without underlined spaces)&mdash;these are set to zero;
+
+</li><li>the activation status of temporary indentation;
+
+</li><li>input line traps and their associated data;
+
+</li><li>the activation status of line numbering (which can be reactivated with
+&lsquo;<samp class="samp">.nm&nbsp;+0</samp>&rsquo;<!-- /@w -->); and
+
+</li><li>the count of consecutive hyphenated lines (set to zero).
+</li></ul>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002ew_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.w]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ew_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ew"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002echt_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.cht]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002echt_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002echt"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ecdp_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.cdp]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ecdp_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ecdp"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ecsk_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.csk]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ecsk_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ecsk"></a>
+<a class="index-entry-id" id="index-environment_002c-dimensions-of-last-glyph-_0028_002ew_002c-_002echt_002c-_002ecdp_002c-_002ecsk_0029"></a>
+<a class="index-entry-id" id="index-width_002c-of-last-glyph-_0028_002ew_0029"></a>
+<a class="index-entry-id" id="index-height_002c-of-last-glyph-_0028_002echt_0029"></a>
+<a class="index-entry-id" id="index-depth_002c-of-last-glyph-_0028_002ecdp_0029"></a>
+<a class="index-entry-id" id="index-skew_002c-of-last-glyph-_0028_002ecsk_0029"></a>
+<a class="index-entry-id" id="index-last-glyph_002c-dimensions-_0028_002ew_002c-_002echt_002c-_002ecdp_002c-_002ecsk_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-last_002c-dimensions-_0028_002ew_002c-_002echt_002c-_002ecdp_002c-_002ecsk_0029"></a>
+<p>The <code class="code">\n[.w]</code> register contains the width of the last glyph
+formatted in the environment.
+</p>
+<p>The <code class="code">\n[.cht]</code> register contains the height of the last glyph
+formatted in the environment.
+</p>
+<p>The <code class="code">\n[.cdp]</code> register contains the depth of the last glyph
+formatted in the environment. It is positive for glyphs extending below
+the baseline.
+</p>
+<p>The <code class="code">\n[.csk]</code> register contains the <em class="dfn">skew</em> (how far to the
+right of the glyph&rsquo;s center that GNU <code class="code">troff</code> should place an
+accent) of the last glyph formatted in the environment.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002en_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.n]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002en_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002en"></a>
+<a class="index-entry-id" id="index-environment_002c-previous-line-length-_0028_002en_0029"></a>
+<a class="index-entry-id" id="index-line-length_002c-previous-_0028_002en_0029"></a>
+<a class="index-entry-id" id="index-length-of-previous-line-_0028_002en_0029"></a>
+<a class="index-entry-id" id="index-previous-line-length-_0028_002en_0029"></a>
+<p>The <code class="code">\n[.n]</code> register contains the length of the previous output
+line emitted in the environment.
+</p></dd></dl>
+
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Suppressing-Output.html">Suppressing Output</a>, Previous: <a href="Diversions.html">Diversions</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Escape-Sequence-Index.html b/doc/groff.html.node/Escape-Sequence-Index.html
new file mode 100644
index 0000000..19e5a61
--- /dev/null
+++ b/doc/groff.html.node/Escape-Sequence-Index.html
@@ -0,0 +1,162 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Escape Sequence Index (The GNU Troff Manual)</title>
+
+<meta name="description" content="Escape Sequence Index (The GNU Troff Manual)">
+<meta name="keywords" content="Escape Sequence Index (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="index.html" rel="up" title="Top">
+<link href="Operator-Index.html" rel="next" title="Operator Index">
+<link href="Request-Index.html" rel="prev" title="Request Index">
+<style type="text/css">
+<!--
+a.summary-letter-printindex {text-decoration: none}
+kbd.key {font-style: normal}
+td.printindex-index-entry {vertical-align: top}
+td.printindex-index-section {vertical-align: top}
+th.entries-header-printindex {text-align:left}
+th.sections-header-printindex {text-align:left}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="appendix-level-extent" id="Escape-Sequence-Index">
+<div class="nav-panel">
+<p>
+Next: <a href="Operator-Index.html" accesskey="n" rel="next">Operator Index</a>, Previous: <a href="Request-Index.html" accesskey="p" rel="prev">Request Index</a>, Up: <a href="index.html" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h2 class="appendix" id="Escape-Sequence-Index-1">Appendix C Escape Sequence Index</h2>
+
+<p>The escape character, <code class="code">\</code> by default, is always followed by at
+least one more input character, making an escape <em class="emph">sequence</em>. Any
+input token <code class="code">\<var class="var">X</var></code> with <var class="var">X</var> not in the list below emits a
+warning and interpolates glyph <var class="var">X</var>. Note the entries for <code class="code">\.</code>,
+which may be obscured by the leader dots, and for <code class="code">\<kbd class="key">RET</kbd></code> and
+<code class="code">\<kbd class="key">SP</kbd></code>, which are sorted alphabetically, not by code point
+order.
+</p>
+<div class="printindex es-printindex">
+<table class="es-entries-printindex" border="0">
+<tr><td></td><th class="entries-header-printindex">Index Entry</th><td>&nbsp;</td><th class="sections-header-printindex"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Escape-Sequence-Index_es_symbol-1">\</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Escape-Sequences.html#index-_005c"><code>\</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Escape-Sequences.html">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-_005c-1"><code>\</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-_005c_0021"><code>\!</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Comments.html#index-_005c_0022"><code>\&quot;</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Comments.html">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Comments.html#index-_005c_0023"><code>\#</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Comments.html">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Parameters.html#index-_005c_0024"><code>\$</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Parameters.html">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Parameters.html#index-_005c_0024_002a"><code>\$*</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Parameters.html">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Parameters.html#index-_005c_00240"><code>\$0</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Parameters.html">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Parameters.html#index-_005c_0024_0040"><code>\$@</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Parameters.html">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Parameters.html#index-_005c_0024_005e"><code>\$^</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Parameters.html">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-_005c_0025"><code>\%</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Dummy-Characters.html#index-_005c_0026"><code>\&amp;</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Dummy-Characters.html">Dummy Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-_005c_0027"><code>\<code class="code">'</code></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-_005c_0028"><code>\(</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Dummy-Characters.html#index-_005c_0029"><code>\)</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Dummy-Characters.html">Dummy Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-_005c_002a"><code>\*</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Italic-Corrections.html#index-_005c_002c"><code>\,</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Italic-Corrections.html">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-_005c_002d"><code>\-</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Copy-Mode.html#index-_005c_002e"><code>\.</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Copy-Mode.html">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Italic-Corrections.html#index-_005c_002f"><code>\/</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Italic-Corrections.html">Italic Corrections</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-_005c0"><code>\0</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-_005c_003a"><code>\:</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-_005c_003f"><code>\?</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Identifiers.html#index-_005cA"><code>\A</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Identifiers.html">Identifiers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Leaders.html#index-_005ca"><code>\a</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Leaders.html">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_005cB"><code>\B</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-_005cb"><code>\b</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-_005cc"><code>\c</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-_005cC"><code>\C</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-_005cd"><code>\d</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-_005cD"><code>\D</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Escape-Sequences.html#index-_005ce"><code>\e</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Escape-Sequences.html">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Copy-Mode.html#index-_005cE"><code>\E</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Copy-Mode.html">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-_005cf"><code>\f</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-_005cF"><code>\F</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Assigning-Register-Formats.html#index-_005cg"><code>\g</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Assigning-Register-Formats.html">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-_005cH"><code>\H</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-_005ch"><code>\h</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-_005ck"><code>\k</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-_005cl"><code>\l</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Drawing-Geometric-Objects.html#index-_005cL"><code>\L</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-_005cm"><code>\m</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-_005cM"><code>\M</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Interpolating-Registers.html#index-_005cn"><code>\n</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Interpolating-Registers.html">Interpolating Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Auto_002dincrement.html#index-_005cn-1"><code>\n</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Auto_002dincrement.html">Auto-increment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-_005cN"><code>\N</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-_005cnewline"><code>\<i class="slanted">newline</i></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-_005co"><code>\o</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Suppressing-Output.html#index-_005cO"><code>\O</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Suppressing-Output.html">Suppressing Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-_005cp"><code>\p</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Setting-Registers.html#index-_005cR"><code>\R</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Setting-Registers.html">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Setting-Registers.html#index-_005cR-1"><code>\R</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Setting-Registers.html">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-_005cr"><code>\r</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-_005cRET"><code>\<kbd class="key">RET</kbd></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-_005cS"><code>\S</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Type-Size.html#index-_005cs"><code>\s</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Type-Size.html">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-_005cSP"><code>\<kbd class="key">SP</kbd></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-_005cspace"><code>\<i class="slanted">space</i></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-_005ct"><code>\t</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-_005cu"><code>\u</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-_005cv"><code>\v</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-_005cV"><code>\V</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-_005cw"><code>\w</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Spacing.html#index-_005cx"><code>\x</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Spacing.html">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Postprocessor-Access.html#index-_005cX"><code>\X</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Postprocessor-Access.html">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Postprocessor-Access.html#index-_005cY"><code>\Y</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Postprocessor-Access.html">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-_005cz"><code>\z</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-_005cZ"><code>\Z</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-_005c_005b"><code>\[</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Copy-Mode.html#index-_005c_005c"><code>\\</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Copy-Mode.html">Copy Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-_005c_005e"><code>\^</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-_005c_005f"><code>\_</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-_005c_0060"><code>\<code class="code">`</code></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Conditional-Blocks.html#index-_005c_007b"><code>\{</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Conditional-Blocks.html">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Conditional-Blocks.html#index-_005c_007b-1"><code>\{</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Conditional-Blocks.html">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-_005c_007c"><code>\|</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Conditional-Blocks.html#index-_005c_007d"><code>\}</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Conditional-Blocks.html">Conditional Blocks</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-_005c_007e"><code>\~</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+</div>
+
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Operator-Index.html">Operator Index</a>, Previous: <a href="Request-Index.html">Request Index</a>, Up: <a href="index.html">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Fields.html b/doc/groff.html.node/Fields.html
new file mode 100644
index 0000000..6e1754a
--- /dev/null
+++ b/doc/groff.html.node/Fields.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Fields (The GNU Troff Manual)</title>
+
+<meta name="description" content="Fields (The GNU Troff Manual)">
+<meta name="keywords" content="Fields (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Tabs-and-Fields.html" rel="up" title="Tabs and Fields">
+<link href="Leaders.html" rel="prev" title="Leaders">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Fields">
+<div class="nav-panel">
+<p>
+Previous: <a href="Leaders.html" accesskey="p" rel="prev">Leaders</a>, Up: <a href="Tabs-and-Fields.html" accesskey="u" rel="up">Tabs and Fields</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Fields-1">5.12.2 Fields</h4>
+<a class="index-entry-id" id="index-fields"></a>
+
+<a class="index-entry-id" id="index-field-delimiting-character-_0028fc_0029"></a>
+<a class="index-entry-id" id="index-delimiting-character_002c-for-fields-_0028fc_0029"></a>
+<a class="index-entry-id" id="index-character_002c-field-delimiting-_0028fc_0029"></a>
+<a class="index-entry-id" id="index-field-padding-character-_0028fc_0029"></a>
+<a class="index-entry-id" id="index-padding-character_002c-for-fields-_0028fc_0029"></a>
+<a class="index-entry-id" id="index-character_002c-field-padding-_0028fc_0029"></a>
+<p><em class="dfn">Fields</em> are a more general way of laying out tabular data. A field
+is defined as the data between a pair of <em class="dfn">delimiting characters</em>.
+It contains substrings that are separated by <em class="dfn">padding characters</em>.
+The width of a field is the distance on the <em class="emph">input</em> line from the
+position where the field starts to the next tab stop. A padding
+character inserts an adjustable space similar to TeX&rsquo;s <code class="code">\hss</code>
+command (thus it can even be negative) to make the sum of all substring
+lengths plus the adjustable space equal to the field width. If more
+than one padding character is inserted, the available space is evenly
+distributed among them.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002efc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.fc</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">delim-char</i></span> [<span class="r"><i class="slanted">padding-char</i></span>]]</var><a class="copiable-link" href='#index-_002efc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-fc"></a>
+<p>Define a delimiting and a padding character for fields. If the latter
+is missing, the padding character defaults to a space character. If
+there is no argument at all, the field mechanism is disabled (which is
+the default). In contrast to, e.g., the tab repetition character,
+delimiting and padding characters are <em class="emph">not</em> associated with the
+environment (see <a class="pxref" href="Environments.html">Environments</a>).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.fc # ^
+.ta T 3i
+#foo^bar^smurf#
+.br
+#foo^^bar^smurf#
+ &rArr; foo bar smurf
+ &rArr; foo bar smurf
+</pre></div></div>
+</dd></dl>
+
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/File-Formats.html b/doc/groff.html.node/File-Formats.html
new file mode 100644
index 0000000..c5d4d54
--- /dev/null
+++ b/doc/groff.html.node/File-Formats.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>File Formats (The GNU Troff Manual)</title>
+
+<meta name="description" content="File Formats (The GNU Troff Manual)">
+<meta name="keywords" content="File Formats (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="index.html" rel="up" title="Top">
+<link href="Copying-This-Manual.html" rel="next" title="Copying This Manual">
+<link href="GNU-troff-Reference.html" rel="prev" title="GNU troff Reference">
+
+
+</head>
+
+<body lang="en">
+<div class="chapter-level-extent" id="File-Formats">
+<div class="nav-panel">
+<p>
+Next: <a href="Copying-This-Manual.html" accesskey="n" rel="next">Copying This Manual</a>, Previous: <a href="GNU-troff-Reference.html" accesskey="p" rel="prev">GNU <code class="code">troff</code> Reference</a>, Up: <a href="index.html" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h2 class="chapter" id="File-Formats-1">6 File Formats</h2>
+<a class="index-entry-id" id="index-file-formats"></a>
+<a class="index-entry-id" id="index-formats_002c-file"></a>
+
+<p>All files read and written by <code class="code">gtroff</code> are text files. The
+following two sections describe their format.
+</p>
+
+
+
+
+<ul class="mini-toc">
+<li><a href="gtroff-Output.html" accesskey="1"><code class="code">gtroff</code> Output</a></li>
+<li><a href="Device-and-Font-Description-Files.html" accesskey="2">Device and Font Description Files</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/File-Keyword-Index.html b/doc/groff.html.node/File-Keyword-Index.html
new file mode 100644
index 0000000..348d292
--- /dev/null
+++ b/doc/groff.html.node/File-Keyword-Index.html
@@ -0,0 +1,215 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>File Keyword Index (The GNU Troff Manual)</title>
+
+<meta name="description" content="File Keyword Index (The GNU Troff Manual)">
+<meta name="keywords" content="File Keyword Index (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="index.html" rel="up" title="Top">
+<link href="Program-and-File-Index.html" rel="next" title="Program and File Index">
+<link href="String-Index.html" rel="prev" title="String Index">
+<style type="text/css">
+<!--
+a.summary-letter-printindex {text-decoration: none}
+td.printindex-index-entry {vertical-align: top}
+td.printindex-index-section {vertical-align: top}
+th.entries-header-printindex {text-align:left}
+th.sections-header-printindex {text-align:left}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="appendix-level-extent" id="File-Keyword-Index">
+<div class="nav-panel">
+<p>
+Next: <a href="Program-and-File-Index.html" accesskey="n" rel="next">Program and File Index</a>, Previous: <a href="String-Index.html" accesskey="p" rel="prev">String Index</a>, Up: <a href="index.html" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h2 class="appendix" id="File-Keyword-Index-1">Appendix H File Keyword Index</h2>
+
+<div class="printindex ky-printindex">
+<table class="ky-letters-header-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#File-Keyword-Index_ky_symbol-1"><b>#</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_symbol-2"><b>-</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-V"><b>V</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="ky-entries-printindex" border="0">
+<tr><td></td><th class="entries-header-printindex">Index Entry</th><td>&nbsp;</td><th class="sections-header-printindex"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_symbol-1">#</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-_0023"><code>#</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-_0023-1"><code>#</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_symbol-2">-</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-_002d_002d_002d"><code>---</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-B">B</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-biggestfont"><code>biggestfont</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-charset"><code>charset</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-charset-1"><code>charset</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-F">F</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-family"><code>family</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-family-1"><code>family</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-fonts"><code>fonts</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Special-Fonts.html#index-fonts-1"><code>fonts</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Special-Fonts.html">Special Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-fonts-2"><code>fonts</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-H">H</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-hor"><code>hor</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-I">I</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-image_005fgenerator"><code>image_generator</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-K">K</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-kernpairs"><code>kernpairs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-L">L</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-ligatures"><code>ligatures</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-N">N</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-name"><code>name</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-P">P</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-paperlength"><code>paperlength</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-papersize"><code>papersize</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-paperwidth"><code>paperwidth</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-pass_005ffilenames"><code>pass_filenames</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-postpro"><code>postpro</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-prepro"><code>prepro</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-print"><code>print</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-res"><code>res</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-S">S</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-sizes"><code>sizes</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-sizescale"><code>sizescale</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-slant"><code>slant</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-spacewidth"><code>spacewidth</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-spare1"><code>spare1</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-spare2"><code>spare2</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-special"><code>special</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Description-File-Format.html#index-special-1"><code>special</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Description-File-Format.html">Font Description File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-styles"><code>styles</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-styles-1"><code>styles</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-styles-2"><code>styles</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-T">T</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-tcommand"><code>tcommand</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-U">U</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-unicode"><code>unicode</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-unitwidth"><code>unitwidth</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-unscaled_005fcharwidths"><code>unscaled_charwidths</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Postprocessor-Access.html#index-use_005fcharnames_005fin_005fspecial"><code>use_charnames_in_special</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Postprocessor-Access.html">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-use_005fcharnames_005fin_005fspecial-1"><code>use_charnames_in_special</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="File-Keyword-Index_ky_letter-V">V</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="DESC-File-Format.html#index-vert"><code>vert</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="DESC-File-Format.html">DESC File Format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table class="ky-letters-footer-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#File-Keyword-Index_ky_symbol-1"><b>#</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_symbol-2"><b>-</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#File-Keyword-Index_ky_letter-V"><b>V</b></a>
+ &nbsp;
+</td></tr></table>
+</div>
+
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Program-and-File-Index.html">Program and File Index</a>, Previous: <a href="String-Index.html">String Index</a>, Up: <a href="index.html">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Filling.html b/doc/groff.html.node/Filling.html
new file mode 100644
index 0000000..f6db6f3
--- /dev/null
+++ b/doc/groff.html.node/Filling.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Filling (The GNU Troff Manual)</title>
+
+<meta name="description" content="Filling (The GNU Troff Manual)">
+<meta name="keywords" content="Filling (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Text.html" rel="up" title="Text">
+<link href="Sentences.html" rel="next" title="Sentences">
+<link href="Text.html" rel="prev" title="Text">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Filling">
+<div class="nav-panel">
+<p>
+Next: <a href="Sentences.html" accesskey="n" rel="next">Sentences</a>, Previous: <a href="Text.html" accesskey="p" rel="prev">Text</a>, Up: <a href="Text.html" accesskey="u" rel="up">Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Filling-1">5.1.1 Filling</h4>
+
+<p>When GNU <code class="code">troff</code> starts up, it obtains information about the device
+for which it is preparing output.<a class="footnote" id="DOCF18" href="groff.html_fot.html#FOOT18"><sup>18</sup></a> An essential property is the length of the output
+line, such as &ldquo;6.5 inches&rdquo;.
+</p>
+<a class="index-entry-id" id="index-word_002c-definition-of"></a>
+<a class="index-entry-id" id="index-filling"></a>
+<p>GNU <code class="code">troff</code> interprets plain text files employing the Unix
+line-ending convention. It reads input a character at a time,
+collecting words as it goes, and fits as many words together on an
+output line as it can&mdash;this is known as <em class="dfn">filling</em>. To GNU
+<code class="code">troff</code>, a <em class="dfn">word</em> is any sequence of one or more characters
+that aren&rsquo;t spaces or newlines. The exceptions separate
+words.<a class="footnote" id="DOCF19" href="groff.html_fot.html#FOOT19"><sup>19</sup></a> To disable filling, see
+<a class="ref" href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">It is a truth universally acknowledged
+that a single man in possession of a
+good fortune must be in want of a wife.
+ &rArr; It is a truth universally acknowledged that a
+ &rArr; single man in possession of a good fortune must
+ &rArr; be in want of a wife.
+</pre></div></div>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Font-Description-File-Format.html b/doc/groff.html.node/Font-Description-File-Format.html
new file mode 100644
index 0000000..a44cf20
--- /dev/null
+++ b/doc/groff.html.node/Font-Description-File-Format.html
@@ -0,0 +1,280 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Font Description File Format (The GNU Troff Manual)</title>
+
+<meta name="description" content="Font Description File Format (The GNU Troff Manual)">
+<meta name="keywords" content="Font Description File Format (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Device-and-Font-Description-Files.html" rel="up" title="Device and Font Description Files">
+<link href="DESC-File-Format.html" rel="prev" title="DESC File Format">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.display {margin-left: 3.2em}
+div.example {margin-left: 3.2em}
+pre.display-preformatted {font-family: inherit}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Font-Description-File-Format">
+<div class="nav-panel">
+<p>
+Previous: <a href="DESC-File-Format.html" accesskey="p" rel="prev"><samp class="file">DESC</samp> File Format</a>, Up: <a href="Device-and-Font-Description-Files.html" accesskey="u" rel="up">Device and Font Description Files</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Font-Description-File-Format-1">6.2.2 Font Description File Format</h4>
+<a class="index-entry-id" id="index-font-file_002c-format"></a>
+<a class="index-entry-id" id="index-font-description-file_002c-format"></a>
+<a class="index-entry-id" id="index-format-of-font-files"></a>
+<a class="index-entry-id" id="index-format-of-font-description-files"></a>
+
+<p>On typesetting output devices, each font is typically available at
+multiple sizes. While paper measurements in the device description file
+are in absolute units, measurements applicable to fonts must be
+proportional to the type size. <code class="code">groff</code> achieves this using the
+precedent set by <abbr class="acronym">AT&amp;T</abbr> device-independent <code class="code">troff</code>: one
+font size is chosen as a norm, and all others are scaled linearly
+relative to that basis. The &ldquo;unit width&rdquo; is the number of basic units
+per point when the font is rendered at this nominal size.
+</p>
+<p>For instance, <code class="code">groff</code>&rsquo;s <code class="code">lbp</code> device uses a <code class="code">unitwidth</code>
+of&nbsp;800. Its Times roman font &lsquo;<samp class="samp">TR</samp>&rsquo; has a <code class="code">spacewidth</code>
+of&nbsp;833; this is also the width of its comma, period, centered
+period, and mathematical asterisk, while its &lsquo;<samp class="samp">M</samp>&rsquo; is 2,963 basic
+units. Thus, an &lsquo;<samp class="samp">M</samp>&rsquo; on the <code class="code">lbp</code> device is 2,963 basic units
+wide at a notional type size of 800&nbsp;points.<a class="footnote" id="DOCF126" href="groff.html_fot.html#FOOT126"><sup>126</sup></a>
+</p>
+<p>A font description file has two sections. The first is a sequence of
+directives, and is parsed similarly to the <samp class="file">DESC</samp> file described
+above. Except for the directive names that begin the second section,
+their ordering is immaterial. Later directives of the same name
+override earlier ones, spaces and tabs are handled in the same way,
+<a class="index-entry-id" id="index-comments-in-font-description-files"></a>
+<a class="index-entry-id" id="index-font-description-files_002c-comments"></a>
+<a class="index-entry-id" id="index-_0023-1"></a>
+and the same comment syntax is supported. Empty lines are ignored
+throughout.
+</p>
+<dl class="table">
+<dt id='index-name'><span><code class="code">name <var class="var">f</var></code><a class="copiable-link" href='#index-name'> &para;</a></span></dt>
+<dd><p>The name of the font is&nbsp;<var class="var">f</var>. &lsquo;<samp class="samp">DESC</samp>&rsquo; is an invalid font
+name. Simple integers are valid, but their use is
+discouraged.<a class="footnote" id="DOCF127" href="groff.html_fot.html#FOOT127"><sup>127</sup></a>
+</p>
+</dd>
+<dt id='index-spacewidth'><span><code class="code">spacewidth <var class="var">n</var></code><a class="copiable-link" href='#index-spacewidth'> &para;</a></span></dt>
+<dd><p>The width of an unadjusted inter-word space is <var class="var">n</var>&nbsp;basic units.
+</p></dd>
+</dl>
+
+<p>The directives above must appear in the first section; those below are
+optional.
+</p>
+<dl class="table">
+<dt id='index-slant'><span><code class="code">slant <var class="var">n</var></code><a class="copiable-link" href='#index-slant'> &para;</a></span></dt>
+<dd><p>The font&rsquo;s glyphs have a slant of <var class="var">n</var>&nbsp;degrees; a positive
+<var class="var">n</var> slants in the direction of text flow.
+</p>
+</dd>
+<dt id='index-ligatures'><span><code class="code">ligatures <var class="var">lig1</var> <span class="r">&hellip;</span> <var class="var">lign</var> <span class="r">[</span>0<span class="r">]</span></code><a class="copiable-link" href='#index-ligatures'> &para;</a></span></dt>
+<dd><p>Glyphs <var class="var">lig1</var>, &hellip;, <var class="var">lign</var> are ligatures; possible ligatures
+are &lsquo;<samp class="samp">ff</samp>&rsquo;, &lsquo;<samp class="samp">fi</samp>&rsquo;, &lsquo;<samp class="samp">fl</samp>&rsquo;, &lsquo;<samp class="samp">ffi</samp>&rsquo; and &lsquo;<samp class="samp">ffl</samp>&rsquo;. For
+compatibility with other <code class="code">troff</code> implementations, the list of
+ligatures may be terminated with a&nbsp;<code class="code">0</code>. The list of ligatures
+must not extend over more than one line.
+</p>
+</dd>
+<dt id='index-special-fonts-2'><span><code class="code">special</code><a class="copiable-link" href='#index-special-fonts-2'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-special-1"></a>
+<p>The font is <em class="dfn">special</em>: when a glyph is requested that is not present
+in the current font, it is sought in any mounted fonts that bear this
+property.
+</p></dd>
+</dl>
+
+<p>Other directives in this section are ignored by GNU <code class="code">troff</code>, but
+may be used by postprocessors to obtain further information about the
+font.
+</p>
+<p>The second section contains one or two subsections. These can appear in
+either order; the first one encountered commences the second section.
+Each starts with a directive on a line by itself. A <code class="code">charset</code>
+subsection is mandatory unless the associated <samp class="file">DESC</samp> file contains
+the <code class="code">unicode</code> directive. Another subsection, <code class="code">kernpairs</code>,
+is optional.
+</p>
+<a class="index-entry-id" id="index-charset-1"></a>
+<p>The directive <code class="code">charset</code> starts the character set
+subsection.<a class="footnote" id="DOCF128" href="groff.html_fot.html#FOOT128"><sup>128</sup></a> It precedes a series
+of glyph descriptions, one per line. Each such glyph description
+comprises a set of fields separated by spaces or tabs and organized as
+follows.
+</p>
+<blockquote class="quotation">
+<p><var class="var">name</var> <var class="var">metrics</var> <var class="var">type</var> <var class="var">code</var> [<var class="var">entity-name</var>]
+[<code class="code">--</code> <var class="var">comment</var>]
+</p></blockquote>
+
+<a class="index-entry-id" id="index-8_002dbit-input"></a>
+<a class="index-entry-id" id="index-input_002c-8_002dbit"></a>
+<a class="index-entry-id" id="index-accessing-unnamed-glyphs-with-_005cN"></a>
+<a class="index-entry-id" id="index-unnamed-glyphs_002c-accessing-with-_005cN"></a>
+<a class="index-entry-id" id="index-characters_002c-unnamed_002c-accessing-with-_005cN"></a>
+<a class="index-entry-id" id="index-glyphs_002c-unnamed_002c-accessing-with-_005cN"></a>
+<a class="index-entry-id" id="index-_002d_002d_002d"></a>
+<p><var class="var">name</var> identifies the glyph:
+if <var class="var">name</var> is a printable character&nbsp;<var class="var">c</var>, it corresponds to
+the <code class="code">troff</code> ordinary character&nbsp;<var class="var">c</var>. If <var class="var">name</var> is a
+multi-character sequence not beginning with <code class="code">\</code>, it corresponds to
+the GNU <code class="code">troff</code> special character escape sequence
+&lsquo;<samp class="samp">\[<var class="var">name</var>]</samp>&rsquo;. A name consisting of three minus signs,
+&lsquo;<samp class="samp">---</samp>&rsquo;, is special and indicates that the glyph is unnamed: such
+glyphs can be accessed only by the <code class="code">\N</code> escape sequence in
+<code class="code">troff</code>. A special character named &lsquo;<samp class="samp">---</samp>&rsquo; can still be defined
+using <code class="code">char</code> and similar requests. The <var class="var">name</var> &lsquo;<samp class="samp">\-</samp>&rsquo;
+defines the minus sign glyph. Finally, <var class="var">name</var> can be the
+unbreakable one-sixth and one-twelfth space escape sequences, <code class="code">\|</code>
+and <code class="code">\^</code> (&ldquo;thin&rdquo; and &ldquo;hair&rdquo; spaces, respectively), in which
+case only the width metric described below is interpreted; a font can
+thus customize the widths of these spaces.
+</p>
+<p>The form of the <var class="var">metrics</var> field is as follows.
+</p>
+<div class="display">
+<div class="group"><pre class="display-preformatted"><var class="var">width</var>[<code class="code">,</code>[<var class="var">height</var>[<code class="code">,</code>[<var class="var">depth</var>[<code class="code">,</code>[<var class="var">italic-correction</var>
+ [<code class="code">,</code>[<var class="var">left-italic-correction</var>[<code class="code">,</code>[<var class="var">subscript-correction</var>]]]]]]]]]]
+</pre></div></div>
+
+<p>There must not be any spaces, tabs, or newlines between these
+<em class="dfn">subfields</em> (which have been split here into two lines only for
+better legibility). The subfields are in basic units expressed as
+decimal integers. Unspecified subfields default to&nbsp;<code class="code">0</code>.
+Since there is no associated binary format, these values are not
+required to fit into the C language data type &lsquo;<samp class="samp">char</samp>&rsquo; as they are in
+<abbr class="acronym">AT&amp;T</abbr> device-independent <code class="code">troff</code>.
+</p>
+<p>The <var class="var">width</var> subfield gives the width of the glyph. The <var class="var">height</var>
+subfield gives the height of the glyph (upward is positive); if a glyph
+does not extend above the baseline, it should be given a zero height,
+rather than a negative height. The <var class="var">depth</var> subfield gives the depth
+of the glyph, that is, the distance below the baseline to which the
+glyph extends (downward is positive); if a glyph does not extend below
+the baseline, it should be given a zero depth, rather than a negative
+depth. Italic corrections are relevant to glyphs in italic or oblique
+styles. The <var class="var">italic-correction</var> is the amount of space that should
+be added after an oblique glyph to be followed immediately by an upright
+glyph. The <var class="var">left-italic-correction</var> is the amount of space that
+should be added before an oblique glyph to be preceded immediately by an
+upright glyph. The <var class="var">subscript-correction</var> is the amount of space
+that should be added after an oblique glyph to be followed by a
+subscript; it should be less than the italic correction.
+</p>
+<p>For fonts used with typesetting devices, the <var class="var">type</var> field gives a
+featural description of the glyph: it is a bit mask recording whether
+the glyph is an ascender, descender, both, or neither. When a <code class="code">\w</code>
+escape sequence is interpolated, these values are bitwise or-ed
+together for each glyph and stored in the <code class="code">nr</code> register. In font
+descriptions for terminal devices, all glyphs might have a type of zero,
+regardless of their appearance.
+</p>
+<dl class="table">
+<dt><code class="code">0</code></dt>
+<dd><p>means the glyph lies entirely between the baseline and a horizontal line
+at the &ldquo;x-height&rdquo; of the font; typical examples are &lsquo;<samp class="samp">a</samp>&rsquo;,
+&lsquo;<samp class="samp">c</samp>&rsquo;, and &lsquo;<samp class="samp">x</samp>&rsquo;;
+</p>
+</dd>
+<dt><code class="code">1</code></dt>
+<dd><p>means the glyph descends below the baseline, like &lsquo;<samp class="samp">p</samp>&rsquo;;
+</p>
+</dd>
+<dt><code class="code">2</code></dt>
+<dd><p>means the glyph ascends above the font&rsquo;s x-height, like &lsquo;<samp class="samp">A</samp>&rsquo; or
+&lsquo;<samp class="samp">b</samp>&rsquo;; and
+</p>
+</dd>
+<dt><code class="code">3</code></dt>
+<dd><p>means the glyph is both an ascender and a descender&mdash;this is true of
+parentheses in some fonts.
+</p></dd>
+</dl>
+
+<p>The <var class="var">code</var> field gives a numeric identifier that the postprocessor
+uses to render the glyph. The glyph can be specified to <code class="code">troff</code>
+using this code by means of the <code class="code">\N</code> escape sequence. <var class="var">code</var>
+can be any integer.<a class="footnote" id="DOCF129" href="groff.html_fot.html#FOOT129"><sup>129</sup></a>
+</p>
+<p>The <var class="var">entity-name</var> field defines an identifier for the glyph that the
+postprocessor uses to print the GNU <code class="code">troff</code> glyph <var class="var">name</var>. This
+field is optional; it was introduced so that the <code class="code">grohtml</code> output
+driver could encode its character set. For example, the glyph
+&lsquo;<samp class="samp">\[Po]</samp>&rsquo; is represented by &lsquo;<samp class="samp">&amp;pound;</samp>&rsquo; in <abbr class="acronym">HTML</abbr> 4.0.
+For efficiency, these data are now compiled directly into
+<code class="code">grohtml</code>. <code class="code">grops</code> uses the field to build sub-encoding
+arrays for PostScript fonts containing more than 256 glyphs. Anything
+on the line after the <var class="var">entity-name</var> field or &lsquo;<samp class="samp">--</samp>&rsquo; is ignored.
+</p>
+<p>A line in the <code class="code">charset</code> section can also have the form
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"><var class="var">name</var> &quot;
+</pre></div></div>
+
+<p>identifying <var class="var">name</var> as another name for the glyph mentioned in the
+preceding line. Such aliases can be chained.
+</p>
+<a class="index-entry-id" id="index-kernpairs"></a>
+<p>The directive <code class="code">kernpairs</code> starts a list of kerning adjustments to
+be made to adjacent glyph pairs from this font. It contains a sequence
+of lines formatted as follows.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"><var class="var">g1</var> <var class="var">g2</var> <var class="var">n</var>
+</pre></div></div>
+
+<p>The foregoing means that when glyph <var class="var">g1</var> is typeset immediately
+before <var class="var">g2</var>, the space between them should be increased
+by&nbsp;<var class="var">n</var>. Most kerning pairs should have a negative value
+for&nbsp;<var class="var">n</var>.
+</p>
+
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Previous: <a href="DESC-File-Format.html"><samp class="file">DESC</samp> File Format</a>, Up: <a href="Device-and-Font-Description-Files.html">Device and Font Description Files</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Font-Directories.html b/doc/groff.html.node/Font-Directories.html
new file mode 100644
index 0000000..89cb39d
--- /dev/null
+++ b/doc/groff.html.node/Font-Directories.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Font Directories (The GNU Troff Manual)</title>
+
+<meta name="description" content="Font Directories (The GNU Troff Manual)">
+<meta name="keywords" content="Font Directories (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Invoking-groff.html" rel="up" title="Invoking groff">
+<link href="Paper-Format.html" rel="next" title="Paper Format">
+<link href="Macro-Directories.html" rel="prev" title="Macro Directories">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+ul.mark-bullet {list-style-type: disc}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Font-Directories">
+<div class="nav-panel">
+<p>
+Next: <a href="Paper-Format.html" accesskey="n" rel="next">Paper Format</a>, Previous: <a href="Macro-Directories.html" accesskey="p" rel="prev">Macro Directories</a>, Up: <a href="Invoking-groff.html" accesskey="u" rel="up">Invoking <code class="code">groff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Font-Directories-1">2.4 Font Directories</h3>
+<a class="index-entry-id" id="index-font-directories"></a>
+<a class="index-entry-id" id="index-directories-for-fonts"></a>
+<a class="index-entry-id" id="index-searching-fonts"></a>
+<a class="index-entry-id" id="index-fonts_002c-searching"></a>
+
+<p><code class="code">groff</code> enforces few restrictions on how font description files are
+named. For its family/style mechanism to work (see <a class="pxref" href="Font-Families.html">Font Families</a>),
+the names of fonts within a family should start with the family name,
+followed by the style. For example, the Times family uses &lsquo;<samp class="samp">T</samp>&rsquo; for
+the family name and &lsquo;<samp class="samp">R</samp>&rsquo;, &lsquo;<samp class="samp">B</samp>&rsquo;, &lsquo;<samp class="samp">I</samp>&rsquo;, and &lsquo;<samp class="samp">BI</samp>&rsquo; to
+indicate the styles &lsquo;roman&rsquo;, &lsquo;bold&rsquo;, &lsquo;italic&rsquo;, and &lsquo;bold italic&rsquo;,
+respectively. Thus the final font names are &lsquo;<samp class="samp">TR</samp>&rsquo;, &lsquo;<samp class="samp">TB</samp>&rsquo;,
+&lsquo;<samp class="samp">TI</samp>&rsquo;, and &lsquo;<samp class="samp">TBI</samp>&rsquo;.
+</p>
+<a class="index-entry-id" id="index-font-path"></a>
+<a class="index-entry-id" id="index-path_002c-for-font-files"></a>
+<p>Font description files are kept in <em class="dfn">font directories</em>, which
+together constitute the <em class="dfn">font path</em>. The search procedure
+always appends the directory <code class="code">dev</code><var class="var">name</var>, where <var class="var">name</var> is
+the name of the output device. Assuming TeX DVI output, and
+<samp class="file">/foo/bar</samp> as a font directory, the font description files for
+<code class="command">grodvi</code> must be in <samp class="file">/foo/bar/devdvi</samp>.
+Each directory in the font path is searched in the following order until
+the desired font description file is found or the list is exhausted.
+</p>
+<ul class="itemize mark-bullet">
+<li>Directories specified with GNU <code class="code">troff</code>&rsquo;s or <code class="code">groff</code>&rsquo;s
+<samp class="option">-f</samp> command-line option. All output drivers (and some
+preprocessors) support this option as well, because they require
+information about the glyphs to be rendered in the document.
+
+</li><li><a class="index-entry-id" id="index-GROFF_005fFONT_005fPATH_002c-environment-variable-1"></a>
+Directories listed in the <code class="env">GROFF_FONT_PATH</code> environment variable.
+
+</li><li><a class="index-entry-id" id="index-site_002dlocal-directory-1"></a>
+<a class="index-entry-id" id="index-directory_002c-site_002dlocal-1"></a>
+A site-local directory and the main font description directory.
+The locations corresponding to your installation are listed in section
+&ldquo;Environment&rdquo; of <cite class="cite">gtroff<span class="r">(1)</span></cite>. If not otherwise configured,
+they are as follows.
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">/usr/local/share/groff/site-font
+/usr/local/share/groff/1.23.0/font
+</pre></div></div>
+
+<p>The foregoing assumes that the version of <code class="code">groff</code> is 1.23.0, and
+that the installation prefix was <samp class="file">/usr/local</samp>. It is possible to
+fine-tune these locations during the source configuration process.
+</p></li></ul>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Paper-Format.html">Paper Format</a>, Previous: <a href="Macro-Directories.html">Macro Directories</a>, Up: <a href="Invoking-groff.html">Invoking <code class="code">groff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Font-Families.html b/doc/groff.html.node/Font-Families.html
new file mode 100644
index 0000000..f631c1a
--- /dev/null
+++ b/doc/groff.html.node/Font-Families.html
@@ -0,0 +1,182 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Font Families (The GNU Troff Manual)</title>
+
+<meta name="description" content="Font Families (The GNU Troff Manual)">
+<meta name="keywords" content="Font Families (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Using-Fonts.html" rel="up" title="Using Fonts">
+<link href="Font-Positions.html" rel="next" title="Font Positions">
+<link href="Selecting-Fonts.html" rel="prev" title="Selecting Fonts">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Font-Families">
+<div class="nav-panel">
+<p>
+Next: <a href="Font-Positions.html" accesskey="n" rel="next">Font Positions</a>, Previous: <a href="Selecting-Fonts.html" accesskey="p" rel="prev">Selecting Fonts</a>, Up: <a href="Using-Fonts.html" accesskey="u" rel="up">Using Fonts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Font-Families-1">5.19.2 Font Families</h4>
+<a class="index-entry-id" id="index-font-families"></a>
+<a class="index-entry-id" id="index-families_002c-font"></a>
+<a class="index-entry-id" id="index-font-styles"></a>
+<a class="index-entry-id" id="index-styles_002c-font"></a>
+
+<p>To accommodate the wide variety of fonts available, GNU <code class="code">troff</code>
+distinguishes <em class="dfn">font families</em> and <em class="dfn">font styles</em>. A resolved
+font name is the catenation of a font family and a style. Selecting an
+abstract style causes GNU <code class="code">troff</code> to combine it with the default
+font family.
+</p>
+<p>You can thus compose a document using abstract styles exclusively for
+its body or running text, selecting a specific family only for titles or
+examples, for instance, and change the default family on the command
+line (recall <a class="ref" href="Groff-Options.html">Options</a>).
+</p>
+<p>Fonts for the devices <code class="code">ps</code>, <code class="code">pdf</code>, <code class="code">dvi</code>, <code class="code">lj4</code>,
+<code class="code">lbp</code>, and the X11 devices support this mechanism. By default,
+GNU <code class="code">troff</code> uses the Times family with the four styles &lsquo;<samp class="samp">R</samp>&rsquo;,
+&lsquo;<samp class="samp">I</samp>&rsquo;, &lsquo;<samp class="samp">B</samp>&rsquo;, and &lsquo;<samp class="samp">BI</samp>&rsquo;.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002efam"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.fam</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">family</i></span>]</var><a class="copiable-link" href='#index-_002efam'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-fam"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002efam_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.fam]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002efam_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002efam-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cFf"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\F</code><span class="r"><i class="slanted">f</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cFf'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cF"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cF_0028fm"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\F(</code><span class="r"><i class="slanted">fm</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cF_0028fm'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cF_005bfamily_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\F[</code><span class="r"><i class="slanted">family</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cF_005bfamily_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-changing-font-family-_0028fam_002c-_005cF_0029"></a>
+<a class="index-entry-id" id="index-font-family_002c-changing-_0028fam_002c-_005cF_0029"></a>
+<p>Set the default font family, used in combination with abstract styles to
+construct a resolved font name, to <var class="var">family</var> (one-character
+name&nbsp;<var class="var">f</var>, two-character name <var class="var">fm</var>). If no argument is
+given, GNU <code class="code">troff</code> selects the previous font family; if there none,
+is it falls back to the device&rsquo;s default<a class="footnote" id="DOCF76" href="groff.html_fot.html#FOOT76"><sup>76</sup></a> or its own (&lsquo;<samp class="samp">T</samp>&rsquo;).
+</p>
+<p>The <code class="code">\F</code> escape sequence works similarly. In disanalogy to
+<code class="code">\f</code>, &lsquo;<samp class="samp">\FP</samp>&rsquo; makes &lsquo;<samp class="samp">P</samp>&rsquo; the default family. Use
+&lsquo;<samp class="samp">\F[]</samp>&rsquo; to select the previous default family. The default font
+family is available in the read-only string-valued register <code class="code">.fam</code>;
+it is associated with the environment (see <a class="pxref" href="Environments.html">Environments</a>).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">spam, \&quot; startup defaults are T (Times) R (roman)
+.fam H \&quot; make Helvetica the default family
+spam, \&quot; family H + style R = HR
+.ft B \&quot; family H + style B = HB
+spam,
+.ft CR \&quot; Courier roman (default family not changed)
+spam,
+.ft \&quot; back to Helvetica bold
+spam,
+.fam T \&quot; make Times the default family
+spam, \&quot; family T + style B = TB
+.ft AR \&quot; font AR (not a style)
+baked beans,
+.ft R \&quot; family T + style R = TR
+and spam.
+</pre></div></div>
+
+<p><code class="code">\F</code> doesn&rsquo;t produce an input token in GNU <code class="code">troff</code>. As a
+consequence, it can be used in requests like <code class="code">mc</code> (which expects
+a single character as an argument) to change the font family on the fly.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.mc \F[P]x\F[]
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002esty"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.sty</code></strong> <var class="def-var-arguments">n style</var><a class="copiable-link" href='#index-_002esty'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-sty"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002esty_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.sty]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002esty_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002esty-1"></a>
+<a class="index-entry-id" id="index-setting-up-an-abstract-font-style-_0028sty_0029"></a>
+<a class="index-entry-id" id="index-abstract-font-style_002c-setting-up-_0028sty_0029"></a>
+<a class="index-entry-id" id="index-font-style_002c-abstract_002c-setting-up-_0028sty_0029"></a>
+<a class="index-entry-id" id="index-style_002c-font_002c-abstract_002c-setting-up-_0028sty_0029"></a>
+<a class="index-entry-id" id="index-cs-request_002c-and-font-styles"></a>
+<a class="index-entry-id" id="index-bd-request_002c-and-font-styles"></a>
+<a class="index-entry-id" id="index-tkf-request_002c-and-font-styles"></a>
+<a class="index-entry-id" id="index-uf-request_002c-and-font-styles"></a>
+<a class="index-entry-id" id="index-fspecial-request_002c-and-font-styles"></a>
+<p>Associate an abstract style <var class="var">style</var> with mounting
+position&nbsp;<var class="var">n</var>, which must be a non-negative integer. If the
+requests <code class="code">cs</code>, <code class="code">bd</code>, <code class="code">tkf</code>, <code class="code">uf</code>, or <code class="code">fspecial</code>
+are applied to an abstract style, they are instead applied to the member
+of the current family corresponding to that style.
+</p>
+<a class="index-entry-id" id="index-DESC-1"></a>
+<a class="index-entry-id" id="index-styles-1"></a>
+<p>The default family can be set with the <samp class="option">-f</samp> option (see <a class="pxref" href="Groff-Options.html">Options</a>). The <code class="code">styles</code> command in the <samp class="file">DESC</samp> file controls
+which font positions (if any) are initially associated with abstract
+styles rather than fonts.
+</p>
+<p><strong class="strong">Caution:</strong> The <var class="var">style</var> argument is not validated.
+Errors may occur later, when the formatter attempts to construct a
+resolved font name, or format a character for output.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr BarPos \n[.fp]
+.sty \n[.fp] Bar
+.fam Foo
+.ft \n[BarPos]
+.tm .f=\n[.f]
+A
+ error&rarr; error: no font family named 'Foo' exists
+ error&rarr; .f=41
+ error&rarr; error: cannot format glyph: no current font
+</pre></div></div>
+
+<p>When an abstract style has been selected, the read-only string-valued
+register &lsquo;<samp class="samp">.sty</samp>&rsquo; interpolates its name; this datum is associated
+with the environment (see <a class="pxref" href="Environments.html">Environments</a>). Otherwise, &lsquo;<samp class="samp">.sty</samp>&rsquo;
+interpolates nothing.
+</p></dd></dl>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Font-Positions.html">Font Positions</a>, Previous: <a href="Selecting-Fonts.html">Selecting Fonts</a>, Up: <a href="Using-Fonts.html">Using Fonts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Font-Positions.html b/doc/groff.html.node/Font-Positions.html
new file mode 100644
index 0000000..387b4bb
--- /dev/null
+++ b/doc/groff.html.node/Font-Positions.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Font Positions (The GNU Troff Manual)</title>
+
+<meta name="description" content="Font Positions (The GNU Troff Manual)">
+<meta name="keywords" content="Font Positions (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Using-Fonts.html" rel="up" title="Using Fonts">
+<link href="Using-Symbols.html" rel="next" title="Using Symbols">
+<link href="Font-Families.html" rel="prev" title="Font Families">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Font-Positions">
+<div class="nav-panel">
+<p>
+Next: <a href="Using-Symbols.html" accesskey="n" rel="next">Using Symbols</a>, Previous: <a href="Font-Families.html" accesskey="p" rel="prev">Font Families</a>, Up: <a href="Using-Fonts.html" accesskey="u" rel="up">Using Fonts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Font-Positions-1">5.19.3 Font Positions</h4>
+<a class="index-entry-id" id="index-font-positions"></a>
+<a class="index-entry-id" id="index-positions_002c-font"></a>
+
+<p>To support typeface indirection through abstract styles, and for
+compatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>, the formatter maintains
+a list of font <em class="dfn">positions</em> at which fonts required by a document are
+<em class="dfn">mounted</em>. An output device&rsquo;s description file <samp class="file">DESC</samp>
+typically configures a set of pre-mounted fonts; see <a class="ref" href="Device-and-Font-Description-Files.html">Device and Font Description Files</a>. A font need not be explicitly mounted before
+it is selected; GNU <code class="code">troff</code> will search <code class="env">GROFF_FONT_PATH</code> for
+it by name and mount it at the first free mounting position on demand.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002efp"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.fp</code></strong> <var class="def-var-arguments">pos id [<span class="r"><i class="slanted">font-description-file-name</i></span>]</var><a class="copiable-link" href='#index-_002efp'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-fp"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ef_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.f]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ef_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ef"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002efp_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.fp]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002efp_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002efp-1"></a>
+<a class="index-entry-id" id="index-mounting-a-font-_0028fp_0029"></a>
+<a class="index-entry-id" id="index-font_002c-mounting-_0028fp_0029"></a>
+<p>Mount a font under the name <var class="var">id</var> at mounting position <var class="var">pos</var>, a
+non-negative integer. When the formatter starts up, it reads the output
+device&rsquo;s description to mount an initial set of faces, and selects font
+position&nbsp;1. Position&nbsp;0 is unused by default. Unless the
+<var class="var">font-description-file-name</var> argument is given, <var class="var">id</var> should be
+the name of a font description file stored in a directory corresponding
+to the selected output device. GNU <code class="code">troff</code> does not traverse
+directories to locate the font description file.
+</p>
+<a class="index-entry-id" id="index-font-aliasing-with-third-argument-to-fp-request"></a>
+<a class="index-entry-id" id="index-aliasing-fonts-with-third-argument-to-fp-request"></a>
+<p>The optional third argument enables font names to be aliased, which can
+be necessary in compatibility mode since AT&amp;T <code class="code">troff</code> syntax
+affords no means of identifying fonts with names longer than two
+characters, like &lsquo;<samp class="samp">TBI</samp>&rsquo; or &lsquo;<samp class="samp">ZCMI</samp>&rsquo;, in a font selection escape
+sequence. See <a class="xref" href="Compatibility-Mode.html">Compatibility Mode</a>. You can also alias fonts on
+mounting for convenience or abstraction. (See below regarding the
+<code class="code">.fp</code> register.)
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.fp \n[.fp] SC ZCMI
+Send a \f(SChand-written\fP thank-you note.
+.fp \n[.fp] Emph TI
+.fp \n[.fp] Strong TB
+Are \f[Emph]these names\f[] \f[Strong]comfortable\f[]?
+</pre></div></div>
+
+<p>&lsquo;<samp class="samp">DESC</samp>&rsquo;, &lsquo;<samp class="samp">P</samp>&rsquo;, and non-negative integers are not usable as font
+identifiers.
+</p>
+<a class="index-entry-id" id="index-font-position-register-_0028_002ef_0029"></a>
+<p>The position of the currently selected font (or abstract style) is
+available in the read-only register &lsquo;<samp class="samp">.f</samp>&rsquo;. It is associated with
+the environment (see <a class="pxref" href="Environments.html">Environments</a>).
+</p>
+<p>You can copy the value of <code class="code">.f</code> to another register to save it for
+later use.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr saved-font \n[.f]
+<span class="r">&hellip; <i class="i">text involving many font changes</i> &hellip;</span>
+.ft \n[saved-font]
+</pre></div></div>
+
+<a class="index-entry-id" id="index-next-free-font-position-register-_0028_002efp_0029"></a>
+<p>The index of the next (non-zero) free font position is available in the
+read-only register &lsquo;<samp class="samp">.fp</samp>&rsquo;.
+<a class="index-entry-id" id="index-DESC-file_002c-and-font-mounting"></a>
+Fonts not listed in the <samp class="file">DESC</samp> file are automatically mounted at
+position &lsquo;<samp class="samp">\n[.fp]</samp>&rsquo; when selected with the <code class="code">ft</code> request or
+<code class="code">\f</code> escape sequence. When mounting a font at a position
+explicitly with the <code class="code">fp</code> request, this same practice should be
+followed, although GNU <code class="code">troff</code> does not enforce this strictly.
+</p></dd></dl>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Using-Symbols.html">Using Symbols</a>, Previous: <a href="Font-Families.html">Font Families</a>, Up: <a href="Using-Fonts.html">Using Fonts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Font-and-Size-Changes.html b/doc/groff.html.node/Font-and-Size-Changes.html
new file mode 100644
index 0000000..d8319bf
--- /dev/null
+++ b/doc/groff.html.node/Font-and-Size-Changes.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Font and Size Changes (The GNU Troff Manual)</title>
+
+<meta name="description" content="Font and Size Changes (The GNU Troff Manual)">
+<meta name="keywords" content="Font and Size Changes (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Common-Features.html" rel="up" title="Common Features">
+<link href="Predefined-Text.html" rel="next" title="Predefined Text">
+<link href="Columnation.html" rel="prev" title="Columnation">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Font-and-Size-Changes">
+<div class="nav-panel">
+<p>
+Next: <a href="Predefined-Text.html" accesskey="n" rel="next">Predefined Text</a>, Previous: <a href="Columnation.html" accesskey="p" rel="prev">Columnation</a>, Up: <a href="Common-Features.html" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Font-and-Size-Changes-1">3.2.11 Font and Size Changes</h4>
+
+<p>The formatter&rsquo;s requests and escape sequences for setting the typeface
+and size are not always intuitive, so all macro packages provide macros
+to make these operations simpler. They also make it more convenient to
+change typefaces in the middle of a word and can handle italic
+corrections automatically. See <a class="xref" href="Italic-Corrections.html">Italic Corrections</a>.
+</p>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Footnotes-and-Endnotes.html b/doc/groff.html.node/Footnotes-and-Endnotes.html
new file mode 100644
index 0000000..82d14e7
--- /dev/null
+++ b/doc/groff.html.node/Footnotes-and-Endnotes.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Footnotes and Endnotes (The GNU Troff Manual)</title>
+
+<meta name="description" content="Footnotes and Endnotes (The GNU Troff Manual)">
+<meta name="keywords" content="Footnotes and Endnotes (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Common-Features.html" rel="up" title="Common Features">
+<link href="Table-of-Contents.html" rel="next" title="Table of Contents">
+<link href="Displays-and-Keeps.html" rel="prev" title="Displays and Keeps">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Footnotes-and-Endnotes">
+<div class="nav-panel">
+<p>
+Next: <a href="Table-of-Contents.html" accesskey="n" rel="next">Table of Contents</a>, Previous: <a href="Displays-and-Keeps.html" accesskey="p" rel="prev">Displays and Keeps</a>, Up: <a href="Common-Features.html" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Footnotes-and-Endnotes-1">3.2.6 Footnotes and Endnotes</h4>
+<a class="index-entry-id" id="index-footnotes"></a>
+<a class="index-entry-id" id="index-endnotes"></a>
+
+<p><i class="slanted">Footnotes</i> and <i class="slanted">endnotes</i> are forms of delayed
+formatting. They are recorded at their points of relevance in
+the input, but not formatted there. Instead, a <i class="slanted">mark</i> cues the
+reader to check the &ldquo;foot&rdquo;, or bottom, of the current page, or in the
+case of endnotes, an annotation list later in the document. Macro
+packages that support these features also supply a means of
+automatically numbering either type of annotation.
+</p>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Formatter-Instructions.html b/doc/groff.html.node/Formatter-Instructions.html
new file mode 100644
index 0000000..b6527ad
--- /dev/null
+++ b/doc/groff.html.node/Formatter-Instructions.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Formatter Instructions (The GNU Troff Manual)</title>
+
+<meta name="description" content="Formatter Instructions (The GNU Troff Manual)">
+<meta name="keywords" content="Formatter Instructions (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Registers.html" rel="next" title="Registers">
+<link href="Identifiers.html" rel="prev" title="Identifiers">
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Formatter-Instructions">
+<div class="nav-panel">
+<p>
+Next: <a href="Registers.html" accesskey="n" rel="next">Registers</a>, Previous: <a href="Identifiers.html" accesskey="p" rel="prev">Identifiers</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Formatter-Instructions-1">5.6 Formatter Instructions</h3>
+<a class="index-entry-id" id="index-formatter-instructions"></a>
+<a class="index-entry-id" id="index-instructing-the-formatter"></a>
+
+<p>To support documents that require more than filling, automatic line
+breaking and hyphenation, adjustment, and supplemental inter-sentence
+space, the <code class="code">roff</code> language offers two means of embedding
+instructions to the formatter.
+</p>
+<a class="index-entry-id" id="index-request-1"></a>
+<p>One is a <em class="dfn">request</em>, which begins with a control character and takes
+up the remainder of the input line. Requests often perform relatively
+large-scale operations such as setting the page length, breaking the
+line, or starting a new page. They also conduct internal operations
+like defining macros.
+</p>
+<a class="index-entry-id" id="index-escape-sequence"></a>
+<a class="index-entry-id" id="index-sequence_002c-escape"></a>
+<p>The other is an <em class="dfn">escape sequence</em>, which begins with the escape
+character and can be embedded anywhere in the input, even in arguments
+to requests and other escape sequences. Escape sequences interpolate
+special characters, strings, or registers, and handle comparatively
+minor formatting tasks like sub- and superscripting.
+</p>
+<p>Some operations, such as font selection and type size alteration, are
+available via both requests and escape sequences.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="Control-Characters.html" accesskey="1">Control Characters</a></li>
+<li><a href="Invoking-Requests.html" accesskey="2">Invoking Requests</a></li>
+<li><a href="Calling-Macros.html" accesskey="3">Calling Macros</a></li>
+<li><a href="Using-Escape-Sequences.html" accesskey="4">Using Escape Sequences</a></li>
+<li><a href="Delimiters.html" accesskey="5">Delimiters</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/GNU-troff-Reference.html b/doc/groff.html.node/GNU-troff-Reference.html
new file mode 100644
index 0000000..396d40a
--- /dev/null
+++ b/doc/groff.html.node/GNU-troff-Reference.html
@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>GNU troff Reference (The GNU Troff Manual)</title>
+
+<meta name="description" content="GNU troff Reference (The GNU Troff Manual)">
+<meta name="keywords" content="GNU troff Reference (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="index.html" rel="up" title="Top">
+<link href="File-Formats.html" rel="next" title="File Formats">
+<link href="Major-Macro-Packages.html" rel="prev" title="Major Macro Packages">
+
+
+</head>
+
+<body lang="en">
+<div class="chapter-level-extent" id="GNU-troff-Reference">
+<div class="nav-panel">
+<p>
+Next: <a href="File-Formats.html" accesskey="n" rel="next">File Formats</a>, Previous: <a href="Major-Macro-Packages.html" accesskey="p" rel="prev">Macro Packages</a>, Up: <a href="index.html" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h2 class="chapter" id="GNU-troff-Reference-1">5 GNU <code class="code">troff</code> Reference</h2>
+<a class="index-entry-id" id="index-reference_002c-gtroff"></a>
+<a class="index-entry-id" id="index-gtroff_002c-reference"></a>
+
+<p>This chapter covers <em class="emph">all</em> of the facilities of the GNU
+<code class="code">troff</code> formatting engine. Users of macro packages may skip it if
+not interested in details.
+</p>
+
+
+
+
+<ul class="mini-toc">
+<li><a href="Text.html" accesskey="1">Text</a></li>
+<li><a href="Page-Geometry.html" accesskey="2">Page Geometry</a></li>
+<li><a href="Measurements.html" accesskey="3">Measurements</a></li>
+<li><a href="Numeric-Expressions.html" accesskey="4">Numeric Expressions</a></li>
+<li><a href="Identifiers.html" accesskey="5">Identifiers</a></li>
+<li><a href="Formatter-Instructions.html" accesskey="6">Formatter Instructions</a></li>
+<li><a href="Comments.html" accesskey="7">Comments</a></li>
+<li><a href="Registers.html" accesskey="8">Registers</a></li>
+<li><a href="Manipulating-Filling-and-Adjustment.html" accesskey="9">Manipulating Filling and Adjustment</a></li>
+<li><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></li>
+<li><a href="Manipulating-Spacing.html">Manipulating Spacing</a></li>
+<li><a href="Tabs-and-Fields.html">Tabs and Fields</a></li>
+<li><a href="Character-Translations.html">Character Translations</a></li>
+<li><a href="troff-and-nroff-Modes.html"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a></li>
+<li><a href="Line-Layout.html">Line Layout</a></li>
+<li><a href="Line-Continuation.html">Line Continuation</a></li>
+<li><a href="Page-Layout.html">Page Layout</a></li>
+<li><a href="Page-Control.html">Page Control</a></li>
+<li><a href="Using-Fonts.html">Using Fonts</a></li>
+<li><a href="Manipulating-Type-Size-and-Vertical-Spacing.html">Manipulating Type Size and Vertical Spacing</a></li>
+<li><a href="Colors.html">Colors</a></li>
+<li><a href="Strings.html">Strings</a></li>
+<li><a href="Conditionals-and-Loops.html">Conditionals and Loops</a></li>
+<li><a href="Writing-Macros.html">Writing Macros</a></li>
+<li><a href="Page-Motions.html">Page Motions</a></li>
+<li><a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></li>
+<li><a href="Deferring-Output.html">Deferring Output</a></li>
+<li><a href="Traps.html">Traps</a></li>
+<li><a href="Diversions.html">Diversions</a></li>
+<li><a href="Punning-Names.html">Punning Names</a></li>
+<li><a href="Environments.html">Environments</a></li>
+<li><a href="Suppressing-Output.html">Suppressing Output</a></li>
+<li><a href="I_002fO.html">I/O</a></li>
+<li><a href="Postprocessor-Access.html">Postprocessor Access</a></li>
+<li><a href="Miscellaneous.html">Miscellaneous</a></li>
+<li><a href="Gtroff-Internals.html"><code class="code">gtroff</code> Internals</a></li>
+<li><a href="Debugging.html">Debugging</a></li>
+<li><a href="Implementation-Differences.html">Implementation Differences</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Graphics-Commands.html b/doc/groff.html.node/Graphics-Commands.html
new file mode 100644
index 0000000..87a856c
--- /dev/null
+++ b/doc/groff.html.node/Graphics-Commands.html
@@ -0,0 +1,247 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Graphics Commands (The GNU Troff Manual)</title>
+
+<meta name="description" content="Graphics Commands (The GNU Troff Manual)">
+<meta name="keywords" content="Graphics Commands (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Command-Reference.html" rel="up" title="Command Reference">
+<link href="Device-Control-Commands.html" rel="next" title="Device Control Commands">
+<link href="Simple-Commands.html" rel="prev" title="Simple Commands">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="Graphics-Commands">
+<div class="nav-panel">
+<p>
+Next: <a href="Device-Control-Commands.html" accesskey="n" rel="next">Device Control Commands</a>, Previous: <a href="Simple-Commands.html" accesskey="p" rel="prev">Simple Commands</a>, Up: <a href="Command-Reference.html" accesskey="u" rel="up">Command Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Graphics-Commands-1">6.1.2.3 Graphics Commands</h4>
+
+<p>Each graphics or drawing command in the intermediate output starts with
+the letter &lsquo;<samp class="samp">D</samp>&rsquo;, followed by one or two characters that specify a
+subcommand; this is followed by a fixed or variable number of integer
+arguments that are separated by a single space character. A &lsquo;<samp class="samp">D</samp>&rsquo;
+command may not be followed by another command on the same line (apart
+from a comment), so each &lsquo;<samp class="samp">D</samp>&rsquo; command is terminated by a syntactical
+line break.
+</p>
+<p><code class="code">gtroff</code> output follows the classical spacing rules (no space
+between command and subcommand, all arguments are preceded by a single
+space character), but the parser allows optional space between the
+command letters and makes the space before the first argument optional.
+As usual, each space can be any sequence of tab and space characters.
+</p>
+<p>Some graphics commands can take a variable number of arguments. In this
+case, they are integers representing a size measured in basic units
+&lsquo;<samp class="samp">u</samp>&rsquo;. The arguments called <var class="var">h1</var>, <var class="var">h2</var>, &hellip;, <var class="var">hn</var>
+stand for horizontal distances where positive means right, negative
+left. The arguments called <var class="var">v1</var>, <var class="var">v2</var>, &hellip;, <var class="var">vn</var> stand
+for vertical distances where positive means down, negative up. All
+these distances are offsets relative to the current location.
+</p>
+<p>Each graphics command directly corresponds to a similar <code class="code">gtroff</code>
+<code class="code">\D</code> escape sequence. See <a class="xref" href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a>.
+</p>
+<p>Unknown &lsquo;<samp class="samp">D</samp>&rsquo; commands are assumed to be device-specific. Its
+arguments are parsed as strings; the whole information is then sent to
+the postprocessor.
+</p>
+<p>In the following command reference, the syntax element &lsaquo;<span class="r">line
+break</span>&rsaquo; means a syntactical line break as defined above.
+</p>
+<dl class="table">
+<dt><code class="code">D~ <var class="var">h1</var> <var class="var">v1</var> <var class="var">h2</var> <var class="var">v2</var> &hellip; <var class="var">hn</var> <var class="var">vn</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Draw B-spline from current position to offset (<var class="var">h1</var>,<var class="var">v1</var>), then
+to offset (<var class="var">h2</var>,<var class="var">v2</var>), if given, etc., up to
+(<var class="var">hn</var>,<var class="var">vn</var>). This command takes a variable number of argument
+pairs; the current position is moved to the terminal point of the drawn
+curve.
+</p>
+</dd>
+<dt><code class="code">Da <var class="var">h1</var> <var class="var">v1</var> <var class="var">h2</var> <var class="var">v2</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Draw arc from current position to
+(<var class="var">h1</var>,<var class="var">v1</var>)<em class="math">+</em>(<var class="var">h2</var>,<var class="var">v2</var>) with center at
+(<var class="var">h1</var>,<var class="var">v1</var>); then move the current position to the final point
+of the arc.
+</p>
+</dd>
+<dt><code class="code">DC <var class="var">d</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dt><code class="code">DC <var class="var">d</var> <var class="var">dummy-arg</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Draw a solid circle using the current fill color with
+diameter&nbsp;<var class="var">d</var> (integer in basic units &lsquo;<samp class="samp">u</samp>&rsquo;) with leftmost
+point at the current position; then move the current position to the
+rightmost point of the circle. An optional second integer argument is
+ignored (this allows the formatter to generate an even number of
+arguments). This command is a <code class="code">gtroff</code> extension.
+</p>
+</dd>
+<dt><code class="code">Dc <var class="var">d</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Draw circle line with diameter&nbsp;<var class="var">d</var> (integer in basic units
+&lsquo;<samp class="samp">u</samp>&rsquo;) with leftmost point at the current position; then move the
+current position to the rightmost point of the circle.
+</p>
+</dd>
+<dt><code class="code">DE <var class="var">h</var> <var class="var">v</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Draw a solid ellipse in the current fill color with a horizontal
+diameter of&nbsp;<var class="var">h</var> and a vertical diameter of&nbsp;<var class="var">v</var> (both
+integers in basic units &lsquo;<samp class="samp">u</samp>&rsquo;) with the leftmost point at the current
+position; then move to the rightmost point of the ellipse. This command
+is a <code class="code">gtroff</code> extension.
+</p>
+</dd>
+<dt><code class="code">De <var class="var">h</var> <var class="var">v</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Draw an outlined ellipse with a horizontal diameter of&nbsp;<var class="var">h</var> and
+a vertical diameter of&nbsp;<var class="var">v</var> (both integers in basic units
+&lsquo;<samp class="samp">u</samp>&rsquo;) with the leftmost point at current position; then move to the
+rightmost point of the ellipse.
+</p>
+</dd>
+<dt><code class="code">DF <var class="var">color-scheme</var> <span class="r">[</span><var class="var">component</var> &hellip;<span class="r">]</span>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Set fill color for solid drawing objects using different color schemes;
+the analogous command for setting the color of text, line graphics, and
+the outline of graphic objects is &lsquo;<samp class="samp">m</samp>&rsquo;. The color components are
+specified as integer arguments between 0 and 65535. The number of color
+components and their meaning vary for the different color schemes.
+These commands are generated by <code class="code">gtroff</code>&rsquo;s escape sequences
+&lsquo;<samp class="samp">\D'F &hellip;'</samp>&rsquo; and <code class="code">\M</code> (with no other corresponding
+graphics commands). No position changing. This command is a
+<code class="code">gtroff</code> extension.
+</p>
+<dl class="table">
+<dt><code class="code">DFc <var class="var">cyan</var> <var class="var">magenta</var> <var class="var">yellow</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Set fill color for solid drawing objects using the CMY color scheme,
+having the 3&nbsp;color components <var class="var">cyan</var>, <var class="var">magenta</var>, and
+<var class="var">yellow</var>.
+</p>
+</dd>
+<dt><code class="code">DFd&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Set fill color for solid drawing objects to the default fill color value
+(black in most cases). No component arguments.
+</p>
+</dd>
+<dt><code class="code">DFg <var class="var">gray</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Set fill color for solid drawing objects to the shade of gray given by
+the argument, an integer between 0 (black) and 65535 (white).
+</p>
+</dd>
+<dt><code class="code">DFk <var class="var">cyan</var> <var class="var">magenta</var> <var class="var">yellow</var> <var class="var">black</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Set fill color for solid drawing objects using the CMYK color scheme,
+having the 4&nbsp;color components <var class="var">cyan</var>, <var class="var">magenta</var>,
+<var class="var">yellow</var>, and <var class="var">black</var>.
+</p>
+</dd>
+<dt><code class="code">DFr <var class="var">red</var> <var class="var">green</var> <var class="var">blue</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Set fill color for solid drawing objects using the RGB color scheme,
+having the 3&nbsp;color components <var class="var">red</var>, <var class="var">green</var>, and
+<var class="var">blue</var>.
+</p></dd>
+</dl>
+
+</dd>
+<dt><code class="code">Df <var class="var">n</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>The argument&nbsp;<var class="var">n</var> must be an integer in the range <em class="math">-32767</em>
+to 32767.
+</p>
+<dl class="table">
+<dt><em class="math">0 &le; <var class="var">n</var> &le; 1000</em></dt>
+<dd><p>Set the color for filling solid drawing objects to a shade of gray,
+where 0 corresponds to solid white, 1000 (the default) to solid black,
+and values in between to intermediate shades of gray; this is obsoleted
+by command &lsquo;<samp class="samp">DFg</samp>&rsquo;.
+</p>
+</dd>
+<dt><em class="math"><var class="var">n</var> &lt; 0</em> or <em class="math"><var class="var">n</var> &gt; 1000</em></dt>
+<dd><p>Set the filling color to the color that is currently being used for the
+text and the outline, see command &lsquo;<samp class="samp">m</samp>&rsquo;. For example, the command
+sequence
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">mg 0 0 65535
+Df -1
+</pre></div></div>
+
+<p>sets all colors to blue.
+</p></dd>
+</dl>
+
+<p>No position changing. This command is a <code class="code">gtroff</code> extension.
+</p>
+</dd>
+<dt><code class="code">Dl <var class="var">h</var> <var class="var">v</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Draw line from current position to offset (<var class="var">h</var>,<var class="var">v</var>) (integers in
+basic units &lsquo;<samp class="samp">u</samp>&rsquo;); then set current position to the end of the drawn
+line.
+</p>
+</dd>
+<dt><code class="code">Dp <var class="var">h1</var> <var class="var">v1</var> <var class="var">h2</var> <var class="var">v2</var> &hellip; <var class="var">hn</var> <var class="var">vn</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Draw a polygon line from current position to offset (<var class="var">h1</var>,<var class="var">v1</var>),
+from there to offset (<var class="var">h2</var>,<var class="var">v2</var>), etc., up to offset
+(<var class="var">hn</var>,<var class="var">vn</var>), and from there back to the starting position. For
+historical reasons, the position is changed by adding the sum of all
+arguments with odd index to the actual horizontal position and the even
+ones to the vertical position. Although this doesn&rsquo;t make sense it is
+kept for compatibility.
+This command is a <code class="code">gtroff</code> extension.
+</p>
+</dd>
+<dt><code class="code">DP <var class="var">h1</var> <var class="var">v1</var> <var class="var">h2</var> <var class="var">v2</var> &hellip; <var class="var">hn</var> <var class="var">vn</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Draw a solid polygon in the current fill color rather than an outlined
+polygon, using the same arguments and positioning as the corresponding
+&lsquo;<samp class="samp">Dp</samp>&rsquo; command.
+This command is a <code class="code">gtroff</code> extension.
+</p>
+</dd>
+<dt><code class="code">Dt <var class="var">n</var>&lsaquo;<span class="r">line break</span>&rsaquo;</code></dt>
+<dd><p>Set the current line thickness to&nbsp;<var class="var">n</var> (an integer in basic
+units &lsquo;<samp class="samp">u</samp>&rsquo;) if <em class="math"><var class="var">n</var>&gt;0</em>; if <em class="math"><var class="var">n</var>=0</em> select the
+smallest available line thickness; if <em class="math"><var class="var">n</var>&lt;0</em> set the line
+thickness proportional to the type size (this is the default before the
+first &lsquo;<samp class="samp">Dt</samp>&rsquo; command was specified). For historical reasons, the
+horizontal position is changed by adding the argument to the actual
+horizontal position, while the vertical position is not changed.
+Although this doesn&rsquo;t make sense it is kept for compatibility.
+This command is a <code class="code">gtroff</code> extension.
+</p></dd>
+</dl>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Device-Control-Commands.html">Device Control Commands</a>, Previous: <a href="Simple-Commands.html">Simple Commands</a>, Up: <a href="Command-Reference.html">Command Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Groff-Options.html b/doc/groff.html.node/Groff-Options.html
new file mode 100644
index 0000000..48ea5e5
--- /dev/null
+++ b/doc/groff.html.node/Groff-Options.html
@@ -0,0 +1,536 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Groff Options (The GNU Troff Manual)</title>
+
+<meta name="description" content="Groff Options (The GNU Troff Manual)">
+<meta name="keywords" content="Groff Options (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Invoking-groff.html" rel="up" title="Invoking groff">
+<link href="Environment.html" rel="next" title="Environment">
+<link href="Invoking-groff.html" rel="prev" title="Invoking groff">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span.w-nolinebreak-text {white-space: nowrap}
+span:hover a.copiable-link {visibility: visible}
+ul.mark-bullet {list-style-type: disc}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Groff-Options">
+<div class="nav-panel">
+<p>
+Next: <a href="Environment.html" accesskey="n" rel="next">Environment</a>, Previous: <a href="Invoking-groff.html" accesskey="p" rel="prev">Invoking <code class="code">groff</code></a>, Up: <a href="Invoking-groff.html" accesskey="u" rel="up">Invoking <code class="code">groff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Options">2.1 Options</h3>
+<a class="index-entry-id" id="index-options"></a>
+
+<a class="index-entry-id" id="index-groff"></a>
+<a class="index-entry-id" id="index-gtroff"></a>
+<a class="index-entry-id" id="index-gpic"></a>
+<a class="index-entry-id" id="index-geqn"></a>
+<a class="index-entry-id" id="index-ggrn"></a>
+<a class="index-entry-id" id="index-grap"></a>
+<a class="index-entry-id" id="index-gtbl"></a>
+<a class="index-entry-id" id="index-gchem"></a>
+<a class="index-entry-id" id="index-grefer"></a>
+<a class="index-entry-id" id="index-gsoelim"></a>
+<a class="index-entry-id" id="index-preconv"></a>
+<p><code class="code">groff</code> normally runs the <code class="code">gtroff</code> program and a
+postprocessor appropriate for the selected device. The default device
+is &lsquo;<samp class="samp">ps</samp>&rsquo; (but it can be changed when <code class="code">groff</code> is configured and
+built). It can optionally preprocess with any of <code class="code">gpic</code>,
+<code class="code">geqn</code>, <code class="code">gtbl</code>, <code class="code">ggrn</code>, <code class="code">grap</code>, <code class="code">gchem</code>,
+<code class="code">grefer</code>, <code class="code">gsoelim</code>, or <code class="code">preconv</code>.
+</p>
+<p>This section documents only options to the <code class="code">groff</code> front end. Many
+of the arguments to <code class="code">groff</code> are passed on to <code class="code">gtroff</code>;
+therefore, those are also included. Arguments to preprocessors and
+output drivers can be found in the man pages <cite class="cite">gpic<span class="r">(1)</span></cite>,
+<cite class="cite">geqn<span class="r">(1)</span></cite>, <cite class="cite">gtbl<span class="r">(1)</span></cite>, <cite class="cite">ggrn<span class="r">(1)</span></cite>,
+<cite class="cite">grefer<span class="r">(1)</span></cite>, <cite class="cite">gchem<span class="r">(1)</span></cite>, <cite class="cite">gsoelim<span class="r">(1)</span></cite>,
+<cite class="cite">preconv<span class="r">(1)</span></cite>, <cite class="cite">grotty<span class="r">(1)</span></cite>, <cite class="cite">grops<span class="r">(1)</span></cite>,
+<cite class="cite">gropdf<span class="r">(1)</span></cite>, <cite class="cite">grohtml<span class="r">(1)</span></cite>, <cite class="cite">grodvi<span class="r">(1)</span></cite>,
+<cite class="cite">grolj4<span class="r">(1)</span></cite>, <cite class="cite">grolbp<span class="r">(1)</span></cite>, and <cite class="cite">gxditview<span class="r">(1)</span></cite>.
+</p>
+<p>The command-line format for <code class="code">groff</code> is:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">groff [ -abceghijklpstvzCEGNRSUVXZ ] [ -d<var class="var">cs</var> ] [ -D<var class="var">arg</var> ]
+ [ -f<var class="var">fam</var> ] [ -F<var class="var">dir</var> ] [ -I<var class="var">dir</var> ] [ -K<var class="var">arg</var> ]
+ [ -L<var class="var">arg</var> ] [ -m<var class="var">name</var> ] [ -M<var class="var">dir</var> ] [ -n<var class="var">num</var> ]
+ [ -o<var class="var">list</var> ] [ -P<var class="var">arg</var> ] [ -r<var class="var">cn</var> ] [ -T<var class="var">dev</var> ]
+ [ -w<var class="var">name</var> ] [ -W<var class="var">name</var> ] [ <var class="var">files</var>&hellip; ]
+</pre></div></div>
+
+<p>The command-line format for <code class="code">gtroff</code> is as follows.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">gtroff [ -abcivzCERU ] [ -d<var class="var">cs</var> ] [ -f<var class="var">fam</var> ] [ -F<var class="var">dir</var> ]
+ [ -m<var class="var">name</var> ] [ -M<var class="var">dir</var> ] [ -n<var class="var">num</var> ] [ -o<var class="var">list</var> ]
+ [ -r<var class="var">cn</var> ] [ -T<var class="var">name</var> ] [ -w<var class="var">name</var> ] [ -W<var class="var">name</var> ]
+ [ <var class="var">files</var>&hellip; ]
+</pre></div></div>
+
+<p>Obviously, many of the options to <code class="code">groff</code> are actually passed on to
+<code class="code">gtroff</code>.
+</p>
+<p>Options without an argument can be grouped behind a
+single&nbsp;<samp class="option">-</samp>. A filename of&nbsp;<samp class="file">-</samp> denotes the
+standard input. Whitespace is permitted between an option and its
+argument.
+</p>
+<p>The <code class="code">grog</code> command can be used to guess the correct <code class="code">groff</code>
+command to format a file. See its man page <cite class="cite">grog<span class="r">(1)</span></cite>; type
+&lsquo;<samp class="samp">man grog</samp>&rsquo; at the command line to view it.
+</p>
+<p><code class="command">groff</code>&rsquo;s command-line options are as follows.
+</p>
+<a class="index-entry-id" id="index-command_002dline-options"></a>
+<dl class="table">
+<dt id='index-plain-text-approximation-output-register-_0028_002eA_0029'><span>&lsquo;<samp class="samp">-a</samp>&rsquo;<a class="copiable-link" href='#index-plain-text-approximation-output-register-_0028_002eA_0029'> &para;</a></span></dt>
+<dd><p>Generate a plain text approximation of the typeset output. The
+read-only register <code class="code">.A</code> is set to&nbsp;1. See <a class="xref" href="Built_002din-Registers.html">Built-in Registers</a>. This option produces a sort of abstract preview of the
+formatted output.
+</p>
+<ul class="itemize mark-bullet">
+<li>Page breaks are marked by a phrase in angle brackets; for example,
+&lsquo;<samp class="samp">&lt;beginning of page&gt;</samp>&rsquo;.
+
+</li><li>Lines are broken where they would be in the formatted output.
+
+</li><li>A horizontal motion of any size is represented as one space. Adjacent
+horizontal motions are not combined. Inter-sentence space nodes (those
+arising from the second argument to the <code class="code">ss</code> request) are not
+represented.
+
+</li><li>Vertical motions are not represented.
+
+</li><li>Special characters are rendered in angle brackets; for example, the
+default soft hyphen character appears as &lsquo;<samp class="samp">&lt;hy&gt;</samp>&rsquo;.
+</li></ul>
+
+<p>The above description should not be considered a specification; the
+details of <samp class="option">-a</samp> output are subject to change.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-b</samp>&rsquo;</dt>
+<dd><p>Write a backtrace reporting the state of <code class="command">gtroff</code>&rsquo;s input parser
+to the standard error stream with each diagnostic message. The line
+numbers given in the backtrace might not always be correct, because
+<code class="command">gtroff</code>&rsquo;s idea of line numbers can be confused by requests that
+append to
+macros.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-c</samp>&rsquo;</dt>
+<dd><p>Start with color output disabled.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-C</samp>&rsquo;</dt>
+<dd><p>Enable AT&amp;T <code class="command">troff</code> compatibility mode; implies <samp class="option">-c</samp>.
+See <a class="xref" href="Implementation-Differences.html">Implementation Differences</a>, for the list of incompatibilities
+between <code class="command">groff</code> and <abbr class="acronym">AT&amp;T</abbr> <code class="command">troff</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-d<var class="var">c</var><var class="var">text</var></samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">-d<var class="var">string</var>=<var class="var">text</var></samp>&rsquo;</dt>
+<dd><p>Define <code class="code">roff</code> string <var class="var">c</var> or <var class="var">string</var> as&nbsp;<var class="var">t</var> or
+<var class="var">text</var>. <var class="var">c</var>&nbsp;must be one character; <var class="var">string</var> can be
+of arbitrary length. Such string assignments happen before any macro
+file is loaded, including the startup file. Due to <code class="code">getopt_long</code>
+limitations, <var class="var">c</var>&nbsp;cannot be, and <var class="var">string</var> cannot contain, an
+equals sign, even though that is a valid character in a <code class="code">roff</code>
+identifier.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-D<var class="var">enc</var></samp>&rsquo;</dt>
+<dd><p>Set fallback input encoding used by <code class="command">preconv</code> to <var class="var">enc</var>;
+implies <samp class="option">-k</samp>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-e</samp>&rsquo;</dt>
+<dd><p>Run <code class="command">geqn</code> preprocessor.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-E</samp>&rsquo;</dt>
+<dd><p>Inhibit <code class="command">gtroff</code> error messages. This option does <em class="emph">not</em>
+suppress messages sent to the standard error stream by documents or
+macro packages using <code class="code">tm</code> or related requests.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-f<var class="var">fam</var></samp>&rsquo;</dt>
+<dd><p>Use <var class="var">fam</var> as the default font family. See <a class="xref" href="Font-Families.html">Font Families</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-F<var class="var">dir</var></samp>&rsquo;</dt>
+<dd><p>Search in directory <samp class="file"><var class="var">dir</var></samp> for the selected output device&rsquo;s
+directory of device and font description files. See the description of
+<code class="env">GROFF_FONT_PATH</code> in <a class="ref" href="Environment.html">Environment</a> below for the default search
+locations and ordering.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-g</samp>&rsquo;</dt>
+<dd><p>Run <code class="command">ggrn</code> preprocessor.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-G</samp>&rsquo;</dt>
+<dd><p>Run <code class="command">grap</code> preprocessor; implies <samp class="option">-p</samp>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-h</samp>&rsquo;</dt>
+<dd><p>Display a usage message and exit.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-i</samp>&rsquo;</dt>
+<dd><p>Read the standard input after all the named input files have been
+processed.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-I<var class="var">dir</var></samp>&rsquo;</dt>
+<dd><p>Search the directory <var class="var">dir</var> for files named in several contexts;
+implies <samp class="option">-g</samp> and <samp class="option">-s</samp>.
+</p>
+<ul class="itemize mark-bullet">
+<li><code class="command">gsoelim</code> replaces <code class="code">so</code> requests with the contents of their
+file name arguments.
+
+</li><li><code class="command">gtroff</code> searches for files named as operands in its command
+line and as arguments to <code class="code">psbb</code>, <code class="code">so</code>, and <code class="code">soquiet</code>
+requests.
+
+</li><li>Output drivers may search for files; for instance, <code class="command">grops</code> looks
+for files named in &lsquo;<samp class="samp">\X'ps: import <span class="r">&hellip;</span>'</samp>&rsquo;, &lsquo;<samp class="samp">\X'ps: file
+<span class="r">&hellip;</span>'</samp>&rsquo;, and &lsquo;<samp class="samp">\X'pdf: pdfpic <span class="r">&hellip;</span>'</samp>&rsquo; device control
+escape sequences.
+</li></ul>
+
+<p>This option may be specified more than once; the directories are
+searched in the order specified. If you want to search the current
+directory before others, add &lsquo;<samp class="samp">-I .</samp>&rsquo; at the desired place. The
+current working directory is otherwise searched last. <samp class="option">-I</samp> works
+similarly to, and is named for, the &ldquo;include&rdquo; option of Unix C
+compilers.
+</p>
+<p><samp class="option">-I</samp> options are passed to <code class="command">gsoelim</code>, <code class="command">gtroff</code>,
+and output drivers; with the flag letter changed to <samp class="option">-M</samp>, they
+are also passed to <code class="command">ggrn</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-j</samp>&rsquo;</dt>
+<dd><p>Run <code class="command">gchem</code> preprocessor. Implies <samp class="option">-p</samp>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-k</samp>&rsquo;</dt>
+<dd><p>Run <code class="command">preconv</code> preprocessor. Refer to its man page for its
+behavior if neither of <code class="command">groff</code>&rsquo;s <samp class="option">-K</samp> or <samp class="option">-D</samp>
+options is also specified.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-K<var class="var">enc</var></samp>&rsquo;</dt>
+<dd><p>Set input encoding used by <code class="command">preconv</code> to <var class="var">enc</var>; implies
+<samp class="option">-k</samp>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-l</samp>&rsquo;</dt>
+<dd><p>Send the output to a spooler for printing. The <code class="code">print</code> directive
+in the device description file specifies the default command to be used;
+see <a class="ref" href="Device-and-Font-Description-Files.html">Device and Font Description Files</a>.
+See options <samp class="option">-L</samp> and <samp class="option">-X</samp>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-L<var class="var">arg</var></samp>&rsquo;</dt>
+<dd><p>Pass <var class="var">arg</var> to the print spooler program. If multiple <var class="var">arg</var>s are
+required, pass each with a separate <samp class="option">-L</samp> option. <code class="command">groff</code>
+does not prefix an option dash to <var class="var">arg</var> before passing it to the
+spooler program.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-m<var class="var">name</var></samp>&rsquo;</dt>
+<dd><p>Process the file <samp class="file"><var class="var">name</var>.tmac</samp> prior to any input files.
+If not found, <samp class="file">tmac.<var class="var">name</var></samp> is attempted. <var class="var">name</var>
+(in both arrangements) is presumed to be a macro file; see the
+description of <code class="env">GROFF_TMAC_PATH</code> in <a class="ref" href="Environment.html">Environment</a> below for the
+default search locations and ordering. This option and its argument are
+also passed to <code class="command">geqn</code>, <code class="command">grap</code>, and <code class="command">ggrn</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-M<var class="var">dir</var></samp>&rsquo;</dt>
+<dd><p>Search directory <samp class="file"><var class="var">dir</var></samp> for macro files; see the description
+of <code class="env">GROFF_TMAC_PATH</code> in <a class="ref" href="Environment.html">Environment</a> below for the default
+search locations and ordering. This option and its argument are also
+passed to <code class="command">geqn</code>, <code class="command">grap</code>, and <code class="command">ggrn</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-n<var class="var">num</var></samp>&rsquo;</dt>
+<dd><p>Number the first page <var class="var">num</var>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-N</samp>&rsquo;</dt>
+<dd><p>Prohibit newlines between <code class="code">eqn</code> delimiters: pass <samp class="option">-N</samp> to
+<code class="command">geqn</code>.
+</p>
+</dd>
+<dt id='index-print-current-page-register-_0028_002eP_0029'><span>&lsquo;<samp class="samp">-o<var class="var">list</var></samp>&rsquo;<a class="copiable-link" href='#index-print-current-page-register-_0028_002eP_0029'> &para;</a></span></dt>
+<dd><p>Output only pages in <var class="var">list</var>, which is a comma-separated list of page
+ranges; &lsquo;<samp class="samp"><var class="var">n</var></samp>&rsquo; means page&nbsp;<var class="var">n</var>, &lsquo;<samp class="samp"><var class="var">m</var>-<var class="var">n</var></samp>&rsquo;
+means every page between <var class="var">m</var> and&nbsp;<var class="var">n</var>, &lsquo;<samp class="samp">-<var class="var">n</var></samp>&rsquo; means
+every page up to&nbsp;<var class="var">n</var>, &lsquo;<samp class="samp"><var class="var">n</var>-</samp>&rsquo; means every page from
+<var class="var">n</var>&nbsp;on. <code class="command">gtroff</code> stops processing and exits after
+formatting the last page enumerated in <var class="var">list</var>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-p</samp>&rsquo;</dt>
+<dd><p>Run <code class="command">gpic</code> preprocessor.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-P<var class="var">arg</var></samp>&rsquo;</dt>
+<dd><p>Pass <var class="var">arg</var> to the postprocessor. If multiple <var class="var">arg</var>s are
+required, pass each with a separate <samp class="option">-P</samp> option. <code class="command">groff</code>
+does not prefix an option dash to <var class="var">arg</var> before passing it to the
+postprocessor.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-r<var class="var">c</var><var class="var">numeric-expression</var></samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">-r<var class="var">register</var>=<var class="var">expr</var></samp>&rsquo;</dt>
+<dd><p>Set <code class="code">roff</code> register&nbsp;<var class="var">c</var> or <var class="var">register</var> to the value
+<var class="var">numeric-expression</var> (see <a class="pxref" href="Numeric-Expressions.html">Numeric Expressions</a>).
+<var class="var">c</var>&nbsp;must be one character; <var class="var">register</var> can be of arbitrary
+length. Such register assignments happen before any macro file is
+loaded, including the startup file. Due to <code class="code">getopt_long</code>
+limitations, <var class="var">c</var>&nbsp;cannot be, and <var class="var">register</var> cannot contain,
+an equals sign, even though that is a valid character in a <code class="code">roff</code>
+identifier.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-R</samp>&rsquo;</dt>
+<dd><p>Run <code class="command">grefer</code> preprocessor. No mechanism is provided for passing
+arguments to <code class="command">grefer</code> because most <code class="command">grefer</code> options have
+equivalent language elements that can be specified within the document.
+</p>
+<a class="index-entry-id" id="index-troffrc"></a>
+<a class="index-entry-id" id="index-troffrc_002dend"></a>
+<p><code class="command">gtroff</code> also accepts a <samp class="option">-R</samp> option, which is not
+accessible via <code class="command">groff</code>. This option prevents the loading of the
+<samp class="file">troffrc</samp> and <samp class="file">troffrc-end</samp> files.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-s</samp>&rsquo;</dt>
+<dd><p>Run <code class="command">gsoelim</code> preprocessor.
+</p>
+</dd>
+<dt id='index-open-request_002c-and-safer-mode'><span>&lsquo;<samp class="samp">-S</samp>&rsquo;<a class="copiable-link" href='#index-open-request_002c-and-safer-mode'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-opena-request_002c-and-safer-mode"></a>
+<a class="index-entry-id" id="index-pso-request_002c-and-safer-mode"></a>
+<a class="index-entry-id" id="index-sy-request_002c-and-safer-mode"></a>
+<a class="index-entry-id" id="index-pi-request_002c-and-safer-mode"></a>
+<a class="index-entry-id" id="index-safer-mode"></a>
+<a class="index-entry-id" id="index-mode_002c-safer"></a>
+<p>Operate in &ldquo;safer&rdquo; mode; see <samp class="option">-U</samp> below for its opposite. For
+security reasons, safer mode is enabled by default.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-t</samp>&rsquo;</dt>
+<dd><p>Run <code class="command">gtbl</code> preprocessor.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-T<var class="var">dev</var></samp>&rsquo;</dt>
+<dd><p>Direct <code class="command">gtroff</code> to format the input for the output device
+<var class="var">dev</var>. <code class="command">groff</code> then calls an output driver to convert
+<code class="command">gtroff</code>&rsquo;s output to a form appropriate for <var class="var">dev</var>. The
+following output devices are available.
+</p>
+<dl class="table">
+<dt><code class="code">ps</code></dt>
+<dd><p>For PostScript printers and previewers.
+</p>
+</dd>
+<dt><code class="code">pdf</code></dt>
+<dd><p>For <abbr class="acronym">PDF</abbr> viewers or printers.
+</p>
+</dd>
+<dt><code class="code">dvi</code></dt>
+<dd><p>For TeX DVI format.
+</p>
+</dd>
+<dt><code class="code">X75</code></dt>
+<dd><p>For a 75<span class="dmn">dpi</span> X11 previewer.
+</p>
+</dd>
+<dt><code class="code">X75-12</code></dt>
+<dd><p>For a 75<span class="dmn">dpi</span> X11 previewer with a 12-point base font in the
+document.
+</p>
+</dd>
+<dt><code class="code">X100</code></dt>
+<dd><p>For a 100<span class="dmn">dpi</span> X11 previewer.
+</p>
+</dd>
+<dt><code class="code">X100-12</code></dt>
+<dd><p>For a 100<span class="dmn">dpi</span> X11 previewer with a 12-point base font in the
+document.
+</p>
+</dd>
+<dt id='index-encoding_002c-output_002c-ASCII'><span><code class="code">ascii</code><a class="copiable-link" href='#index-encoding_002c-output_002c-ASCII'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-encoding_002c-output_002c-ISO-646"></a>
+<a class="index-entry-id" id="index-ASCII-output-encoding"></a>
+<a class="index-entry-id" id="index-ISO-646-output-encoding"></a>
+<a class="index-entry-id" id="index-output-encoding_002c-ASCII"></a>
+<a class="index-entry-id" id="index-output-encoding_002c-ISO-646"></a>
+<p>For typewriter-like devices using the (7-bit) <abbr class="acronym">ASCII</abbr>
+(ISO&nbsp;646) character set.
+</p>
+</dd>
+<dt id='index-encoding_002c-output_002c-Latin_002d1-_0028ISO-8859_002d1_0029'><span><code class="code">latin1</code><a class="copiable-link" href='#index-encoding_002c-output_002c-Latin_002d1-_0028ISO-8859_002d1_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-Latin_002d1-_0028ISO-8859_002d1_0029-output-encoding"></a>
+<a class="index-entry-id" id="index-ISO-8859_002d1-_0028Latin_002d1_0029-output-encoding"></a>
+<a class="index-entry-id" id="index-output-encoding_002c-Latin_002d1-_0028ISO-8859_002d1_0029"></a>
+<p>For typewriter-like devices that support the <span class="w-nolinebreak-text">Latin-1</span><!-- /@w -->
+(ISO&nbsp;<span class="w-nolinebreak-text">8859-1</span><!-- /@w -->) character set.
+</p>
+</dd>
+<dt id='index-encoding_002c-output_002c-UTF_002d8'><span><code class="code">utf8</code><a class="copiable-link" href='#index-encoding_002c-output_002c-UTF_002d8'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-UTF_002d8-output-encoding"></a>
+<a class="index-entry-id" id="index-output-encoding_002c-UTF_002d8"></a>
+<p>For typewriter-like devices that use the Unicode (ISO&nbsp;10646)
+character set with <span class="w-nolinebreak-text">UTF-8</span><!-- /@w --> encoding.
+</p>
+</dd>
+<dt id='index-encoding_002c-output_002c-EBCDIC'><span><code class="code">cp1047</code><a class="copiable-link" href='#index-encoding_002c-output_002c-EBCDIC'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-EBCDIC-output-encoding"></a>
+<a class="index-entry-id" id="index-output-encoding_002c-EBCDIC"></a>
+<a class="index-entry-id" id="index-encoding_002c-output_002c-code-page-1047"></a>
+<a class="index-entry-id" id="index-code-page-1047-output-encoding"></a>
+<a class="index-entry-id" id="index-output-encoding_002c-code-page-1047"></a>
+<a class="index-entry-id" id="index-IBM-code-page-1047-output-encoding"></a>
+<a class="index-entry-id" id="index-CCSID-1047-output-encoding-_0028EBCDIC_0029"></a>
+<p>For typewriter-like devices that use the <abbr class="acronym">EBCDIC</abbr> encoding IBM
+code page 1047.
+</p>
+</dd>
+<dt><code class="code">lj4</code></dt>
+<dd><p>For HP LaserJet4-compatible (or other PCL5-compatible) printers.
+</p>
+</dd>
+<dt><code class="code">lbp</code></dt>
+<dd><p>For Canon <abbr class="acronym">CaPSL</abbr> printers (<span class="w-nolinebreak-text">LBP-4</span><!-- /@w --> and <span class="w-nolinebreak-text">LBP-8</span><!-- /@w --> series laser
+printers).
+</p>
+<a class="index-entry-id" id="index-pre_002dgrohtml"></a>
+<a class="index-entry-id" id="index-post_002dgrohtml"></a>
+<a class="index-entry-id" id="index-grohtml_002c-the-program"></a>
+</dd>
+<dt><code class="code">html</code></dt>
+<dt><code class="code">xhtml</code></dt>
+<dd><p>To produce <abbr class="acronym">HTML</abbr> and <abbr class="acronym">XHTML</abbr> output, respectively.
+This driver consists of two parts, a preprocessor
+(<code class="command">pre-grohtml</code>) and a postprocessor (<code class="command">post-grohtml</code>).
+</p></dd>
+</dl>
+
+<a class="index-entry-id" id="index-output-device-name-string-_0028_002eT_0029"></a>
+<a class="index-entry-id" id="index-output-device-usage-register-_0028_002eT_0029"></a>
+<p>The predefined GNU <code class="code">troff</code> string <code class="code">.T</code> contains the name of
+the output device; the read-only register <code class="code">.T</code> is set to&nbsp;1 if
+this option is used (which is always true if <code class="command">groff</code> is used to
+call GNU <code class="command">troff</code>). See <a class="xref" href="Built_002din-Registers.html">Built-in Registers</a>.
+</p>
+<p>The postprocessor to be used for a device is specified by the
+<code class="code">postpro</code> command in the device description file. (See <a class="xref" href="Device-and-Font-Description-Files.html">Device and Font Description Files</a>.) This can be overridden with the
+<samp class="option">-X</samp> option.
+</p>
+</dd>
+<dt id='index-mode_002c-unsafe'><span>&lsquo;<samp class="samp">-U</samp>&rsquo;<a class="copiable-link" href='#index-mode_002c-unsafe'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-unsafe-mode"></a>
+<p>Operate in <em class="dfn">unsafe mode</em>, which enables the <code class="code">open</code>,
+<code class="code">opena</code>, <code class="code">pi</code>, <code class="code">pso</code>, and <code class="code">sy</code> requests. These
+requests are disabled by default because they allow an untrusted input
+document to write to arbitrary file names and run arbitrary commands.
+This option also adds the current directory to the macro package search
+path; see the <samp class="option">-m</samp> option above. <samp class="option">-U</samp> is passed to
+<code class="command">gpic</code> and <code class="command">gtroff</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-v</samp>&rsquo;</dt>
+<dd><p>Write version information for <code class="command">groff</code> and all programs run by it
+to the standard output stream; that is, the given command line is
+processed in the usual way, passing <samp class="option">-v</samp> to the formatter and any
+pre- or postprocessors invoked.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-V</samp>&rsquo;</dt>
+<dd><p>Output the pipeline that would be run by <code class="command">groff</code>
+(as a wrapper program) to the standard output stream, but do not execute
+it. If given more than once, the pipeline is both written to the
+standard error stream and run.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-w<var class="var">category</var></samp>&rsquo;</dt>
+<dd><p>Enable warnings in <var class="var">category</var>. Categories are listed in
+<a class="ref" href="Warnings.html">Warnings</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-W<var class="var">category</var></samp>&rsquo;</dt>
+<dd><p>Inhibit warnings in <var class="var">category</var>. Categories are listed in
+<a class="ref" href="Warnings.html">Warnings</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-X</samp>&rsquo;</dt>
+<dd><p>Use <code class="command">gxditview</code> instead of the usual postprocessor to (pre)view
+a document on an X11 display. Combining this option with
+<samp class="option">-Tps</samp> uses the font metrics of the PostScript device, whereas
+the <samp class="option">-TX75</samp> and <samp class="option">-TX100</samp> options use the metrics of X11
+fonts.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-z</samp>&rsquo;</dt>
+<dd><p>Suppress formatted output from <code class="command">gtroff</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">-Z</samp>&rsquo;</dt>
+<dd><p>Disable postprocessing. <code class="command">gtroff</code> output will appear on the
+standard output stream (unless suppressed with <samp class="option">-z</samp>; see
+<a class="ref" href="gtroff-Output.html"><code class="code">gtroff</code> Output</a> for a description of this format.
+</p></dd>
+</dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Environment.html">Environment</a>, Previous: <a href="Invoking-groff.html">Invoking <code class="code">groff</code></a>, Up: <a href="Invoking-groff.html">Invoking <code class="code">groff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Gtroff-Internals.html b/doc/groff.html.node/Gtroff-Internals.html
new file mode 100644
index 0000000..2e38fe7
--- /dev/null
+++ b/doc/groff.html.node/Gtroff-Internals.html
@@ -0,0 +1,187 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Gtroff Internals (The GNU Troff Manual)</title>
+
+<meta name="description" content="Gtroff Internals (The GNU Troff Manual)">
+<meta name="keywords" content="Gtroff Internals (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Debugging.html" rel="next" title="Debugging">
+<link href="Miscellaneous.html" rel="prev" title="Miscellaneous">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Gtroff-Internals">
+<div class="nav-panel">
+<p>
+Next: <a href="Debugging.html" accesskey="n" rel="next">Debugging</a>, Previous: <a href="Miscellaneous.html" accesskey="p" rel="prev">Miscellaneous</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="gtroff-Internals">5.36 <code class="code">gtroff</code> Internals</h3>
+
+<a class="index-entry-id" id="index-input-token"></a>
+<a class="index-entry-id" id="index-token_002c-input"></a>
+<a class="index-entry-id" id="index-output-node"></a>
+<a class="index-entry-id" id="index-node_002c-output"></a>
+<p><code class="code">gtroff</code> processes input in three steps. One or more input
+characters are converted to an <em class="dfn">input token</em>.<a class="footnote" id="DOCF119" href="groff.html_fot.html#FOOT119"><sup>119</sup></a> Then, one or more input tokens are converted to
+an <em class="dfn">output node</em>. Finally, output nodes are converted to the
+intermediate output language understood by all output devices.
+</p>
+<p>Actually, before step one happens, <code class="code">gtroff</code> converts certain escape
+sequences into reserved input characters (not accessible by the user);
+such reserved characters are used for other internal processing also &ndash;
+this is the very reason why not all characters are valid input.
+See <a class="xref" href="Identifiers.html">Identifiers</a>, for more on this topic.
+</p>
+<p>For example, the input string &lsquo;<samp class="samp">fi\[:u]</samp>&rsquo; is converted into a
+character token &lsquo;<samp class="samp">f</samp>&rsquo;, a character token &lsquo;<samp class="samp">i</samp>&rsquo;, and a special
+token &lsquo;<samp class="samp">:u</samp>&rsquo; (representing u&nbsp;umlaut). Later on, the character
+tokens &lsquo;<samp class="samp">f</samp>&rsquo; and &lsquo;<samp class="samp">i</samp>&rsquo; are merged to a single output node
+representing the ligature glyph &lsquo;<samp class="samp">fi</samp>&rsquo; (provided the current font has
+a glyph for this ligature); the same happens with &lsquo;<samp class="samp">:u</samp>&rsquo;. All output
+glyph nodes are &lsquo;processed&rsquo;, which means that they are invariably
+associated with a given font, font size, advance width, etc. During the
+formatting process, <code class="code">gtroff</code> itself adds various nodes to control
+the data flow.
+</p>
+<p>Macros, diversions, and strings collect elements in two chained lists: a
+list of input tokens that have been passed unprocessed, and a list of
+output nodes. Consider the following diversion.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.di xxx
+a
+\!b
+c
+.br
+.di
+</pre></div></div>
+
+<p>It contains these elements.
+</p>
+<table class="multitable">
+<tbody><tr><td>node list</td><td>token list</td><td>element number</td></tr>
+<tr><td><i class="i">line start node</i></td><td>&mdash;</td><td>1</td></tr>
+<tr><td><i class="i">glyph node <code class="code">a</code></i></td><td>&mdash;</td><td>2</td></tr>
+<tr><td><i class="i">word space node</i></td><td>&mdash;</td><td>3</td></tr>
+<tr><td>&mdash;</td><td><code class="code">b</code></td><td>4</td></tr>
+<tr><td>&mdash;</td><td><code class="code">\n</code></td><td>5</td></tr>
+<tr><td><i class="i">glyph node <code class="code">c</code></i></td><td>&mdash;</td><td>6</td></tr>
+<tr><td><i class="i">vertical size node</i></td><td>&mdash;</td><td>7</td></tr>
+<tr><td><i class="i">vertical size node</i></td><td>&mdash;</td><td>8</td></tr>
+<tr><td>&mdash;</td><td><code class="code">\n</code></td><td>9</td></tr>
+</tbody>
+</table>
+
+<a class="index-entry-id" id="index-_005cv_002c-internal-representation"></a>
+<p>Elements 1, 7, and&nbsp;8 are inserted by <code class="code">gtroff</code>; the latter two
+(which are always present) specify the vertical extent of the last line,
+possibly modified by <code class="code">\x</code>. The <code class="code">br</code> request finishes the
+pending output line, inserting a newline input token, which is
+subsequently converted to a space when the diversion is reread. Note
+that the word space node has a fixed width that isn&rsquo;t adjustable
+anymore. To convert horizontal space nodes back to input tokens, use
+the <code class="code">unformat</code> request.
+</p>
+<p>Macros only contain elements in the token list (and the node list is
+empty); diversions and strings can contain elements in both lists.
+</p>
+<p>The <code class="code">chop</code> request simply reduces the number of elements in a
+macro, string, or diversion by one. Exceptions are <em class="dfn">compatibility
+save</em> and <em class="dfn">compatibility ignore</em> input tokens, which are ignored.
+The <code class="code">substring</code> request also ignores those input tokens.
+</p>
+<p>Some requests like <code class="code">tr</code> or <code class="code">cflags</code> work on glyph identifiers
+only; this means that the associated glyph can be changed without
+destroying this association. This can be very helpful for substituting
+glyphs. In the following example, we assume that glyph &lsquo;<samp class="samp">foo</samp>&rsquo; isn&rsquo;t
+available by default, so we provide a substitution using the
+<code class="code">fchar</code> request and map it to input character &lsquo;<samp class="samp">x</samp>&rsquo;.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.fchar \[foo] foo
+.tr x \[foo]
+</pre></div></div>
+
+<p>Now let us assume that we install an additional special font &lsquo;<samp class="samp">bar</samp>&rsquo;
+that has glyph &lsquo;<samp class="samp">foo</samp>&rsquo;.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.special bar
+.rchar \[foo]
+</pre></div></div>
+
+<p>Since glyphs defined with <code class="code">fchar</code> are searched before glyphs in
+special fonts, we must call <code class="code">rchar</code> to remove the definition of the
+fallback glyph. Anyway, the translation is still active; &lsquo;<samp class="samp">x</samp>&rsquo; now
+maps to the real glyph &lsquo;<samp class="samp">foo</samp>&rsquo;.
+</p>
+<a class="index-entry-id" id="index-compatibility-mode_002c-and-parameters"></a>
+<a class="index-entry-id" id="index-mode_002c-compatibility_002c-and-parameters"></a>
+<a class="index-entry-id" id="index-arguments_002c-and-compatibility-mode"></a>
+<a class="index-entry-id" id="index-parameters_002c-and-compatibility-mode"></a>
+<a class="index-entry-id" id="index-macro-arguments_002c-and-compatibility-mode"></a>
+<a class="index-entry-id" id="index-request-arguments_002c-and-compatibility-mode"></a>
+<p>Macro and request arguments preserve compatibility mode enablement.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.cp 1 \&quot; switch to compatibility mode
+.de xx
+\\$1
+..
+.cp 0 \&quot; switch compatibility mode off
+.xx caf\['e]
+ &rArr; café
+</pre></div></div>
+
+<p>Since compatibility mode is enabled while <code class="code">de</code> is invoked, the
+macro <code class="code">xx</code> enables compatibility mode when it is called. Argument
+<code class="code">$1</code> can still be handled properly because it inherits the
+compatibility mode enablement status that was active at the point where
+<code class="code">xx</code> was called.
+</p>
+<p>After interpolation of the parameters, the compatibility save and
+restore tokens are removed.
+</p>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Debugging.html">Debugging</a>, Previous: <a href="Miscellaneous.html">Miscellaneous</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Headers-and-Footers.html b/doc/groff.html.node/Headers-and-Footers.html
new file mode 100644
index 0000000..5d1c50a
--- /dev/null
+++ b/doc/groff.html.node/Headers-and-Footers.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Headers and Footers (The GNU Troff Manual)</title>
+
+<meta name="description" content="Headers and Footers (The GNU Troff Manual)">
+<meta name="keywords" content="Headers and Footers (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Common-Features.html" rel="up" title="Common Features">
+<link href="Page-Layout-Adjustment.html" rel="next" title="Page Layout Adjustment">
+<link href="Sections-and-Chapters.html" rel="prev" title="Sections and Chapters">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Headers-and-Footers">
+<div class="nav-panel">
+<p>
+Next: <a href="Page-Layout-Adjustment.html" accesskey="n" rel="next">Page Layout</a>, Previous: <a href="Sections-and-Chapters.html" accesskey="p" rel="prev">Sections and Chapters</a>, Up: <a href="Common-Features.html" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Headers-and-Footers-1">3.2.3 Headers and Footers</h4>
+
+<p><i class="slanted">Headers</i> and <i class="slanted">footers</i> occupy the top and bottom of
+each page, respectively, and contain data like the page number and the
+article or chapter title. Their appearance is not affected by the
+running text. Some packages allow for different titles on even- and
+odd-numbered pages (for printed, bound material).
+</p>
+<p>Headers and footers are together called <i class="slanted">titles</i>, and comprise
+three parts: left-aligned, centered, and right-aligned. A &lsquo;<samp class="samp">%</samp>&rsquo;
+character appearing anywhere in a title is automatically replaced by the
+page number. See <a class="xref" href="Page-Layout.html">Page Layout</a>.
+</p>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Headings-in-ms.html b/doc/groff.html.node/Headings-in-ms.html
new file mode 100644
index 0000000..a5d0cc7
--- /dev/null
+++ b/doc/groff.html.node/Headings-in-ms.html
@@ -0,0 +1,214 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Headings in ms (The GNU Troff Manual)</title>
+
+<meta name="description" content="Headings in ms (The GNU Troff Manual)">
+<meta name="keywords" content="Headings in ms (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms-Body-Text.html" rel="up" title="ms Body Text">
+<link href="Typeface-and-decoration.html" rel="next" title="Typeface and decoration">
+<link href="Paragraphs-in-ms.html" rel="prev" title="Paragraphs in ms">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="Headings-in-ms">
+<div class="nav-panel">
+<p>
+Next: <a href="Typeface-and-decoration.html" accesskey="n" rel="next">Typeface and decoration</a>, Previous: <a href="Paragraphs-in-ms.html" accesskey="p" rel="prev">Paragraphs</a>, Up: <a href="ms-Body-Text.html" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Headings">4.6.5.4 Headings</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-headings"></a>
+
+<p>Use headings to create a sequential or hierarchical structure for your
+document. The <samp class="file">ms</samp> macros print headings in <strong class="strong">bold</strong> using
+the same font family and, by default, type size as the body text.
+Headings are available with and without automatic numbering. Text on
+input lines following the macro call becomes the heading&rsquo;s title. Call
+a paragraphing macro to end the heading text and start the section&rsquo;s
+content.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eNH"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.NH</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">depth</i></span>]</var><a class="copiable-link" href='#index-_002eNH'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-NH-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eNH-1"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.NH</code></strong> <var class="def-var-arguments"><code class="t">S</code> <span class="r"><i class="slanted">heading-depth-index</i></span> &hellip;</var><a class="copiable-link" href='#index-_002eNH-1'> &para;</a></span></dt>
+<dd><p>Set an automatically numbered heading.
+</p>
+<p><samp class="file">ms</samp> produces a numbered heading the form <var class="var">a.b.c&hellip;</var>, to
+any depth desired, with the numbering of each depth increasing
+automatically and being reset to zero when a more significant level is
+increased. &ldquo;1&rdquo;&nbsp;is the most significant or coarsest division of
+the document. Only non-zero values are output. If <var class="var">depth</var> is
+omitted, it is taken to be &lsquo;<samp class="samp">1</samp>&rsquo;.
+</p>
+<p>If you specify <var class="var">depth</var> such that an ascending gap occurs relative to
+the previous <code class="code">NH</code> call&mdash;that is, you &ldquo;skip a depth&rdquo;, as by
+&lsquo;<samp class="samp">.NH 1</samp>&rsquo; and then &lsquo;<samp class="samp">.NH 3</samp>&rsquo;&mdash;<code class="code">groff</code> <samp class="file">ms</samp> emits a
+warning on the standard error stream.
+</p>
+<p>Alternatively, you can give <code class="code">NH</code> a first argument of&nbsp;<code class="code">S</code>,
+followed by integers to number the heading depths explicitly. Further
+automatic numbering, if used, resumes using the specified indices as
+their predecessors.
+This feature is a Berkeley extension.
+</p></dd></dl>
+
+<p>An example may be illustrative.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.NH 1
+Animalia
+.NH 2
+Arthropoda
+.NH 3
+Crustacea
+.NH 2
+Chordata
+.NH S 6 6 6
+Daimonia
+.NH 1
+Plantae
+</pre></div>
+</td></tr></table>
+
+<p>The above results in numbering as follows; the vertical space that
+normally precedes each heading is omitted.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">1. Animalia
+1.1. Arthropoda
+1.1.1. Crustacea
+1.2. Chordata
+6.6.6. Daimonia
+7. Plantae
+</pre></div></div>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bSN_002dSTYLE_005d-1"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[SN-STYLE]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bSN_002dSTYLE_005d-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-SN_002dSTYLE-_005bms_005d-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bSN_002dDOT_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[SN-DOT]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bSN_002dDOT_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-SN_002dDOT-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bSN_002dNO_002dDOT_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[SN-NO-DOT]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bSN_002dNO_002dDOT_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-SN_002dNO_002dDOT-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bSN_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[SN]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bSN_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-SN-_005bms_005d"></a>
+<p>After <code class="code">NH</code> is called, the assigned number is made available in the
+strings <code class="code">SN-DOT</code> (as it appears in a printed heading with default
+formatting, followed by a terminating period) and <code class="code">SN-NO-DOT</code> (with
+the terminating period omitted). These are GNU extensions.
+</p>
+<p>You can control the style used to print numbered headings by defining an
+appropriate alias for the string <code class="code">SN-STYLE</code>. By default,
+<code class="code">SN-STYLE</code> is aliased to <code class="code">SN-DOT</code>. If you prefer to omit the
+terminating period from numbers appearing in numbered headings, you may
+define the alias as follows.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.als SN-STYLE SN-NO-DOT
+</pre></div></div>
+
+<p>Any such change in numbering style becomes effective from the next use
+of <code class="code">NH</code> following redefinition of the alias for <code class="code">SN-STYLE</code>.
+The formatted number of the current heading is available in the
+<code class="code">SN</code> string (a feature first documented by Berkeley), which
+facilitates its inclusion in, for example, table captions, equation
+labels, and <code class="code">XS</code>/<code class="code">XA</code>/<code class="code">XE</code> table of contents entries.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eSH"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.SH</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">depth</i></span>]</var><a class="copiable-link" href='#index-_002eSH'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-SH-_005bms_005d"></a>
+<p>Set an unnumbered heading.
+</p>
+<p>The optional <var class="var">depth</var> argument is a GNU extension indicating the
+heading depth corresponding to the <var class="var">depth</var> argument of <code class="code">NH</code>.
+It matches the type size at which the heading is set to that of a
+numbered heading at the same depth when the <code class="code">GROWPS</code> and
+<code class="code">PSINCR</code> heading size adjustment mechanism is in effect.
+</p></dd></dl>
+
+<p>If the <code class="code">GROWPS</code> register is set to a value greater than the
+<var class="var">level</var> argument to <code class="code">NH</code> or <code class="code">SH</code>, the type size of a
+heading produced by these macros increases by <code class="code">PSINCR</code> units over
+the size specified by <code class="code">PS</code> multiplied by the difference of
+<code class="code">GROWPS</code> and <var class="var">level</var>. The value stored in <code class="code">PSINCR</code> is
+interpreted in <code class="code">groff</code> basic units; the <code class="code">p</code> scaling unit
+should be employed when assigning a value specified in points. For
+example, the sequence
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.nr PS 10
+.nr GROWPS 3
+.nr PSINCR 1.5p
+.NH 1
+Carnivora
+.NH 2
+Felinae
+.NH 3
+Felis catus
+.SH 2
+Machairodontinae
+</pre></div>
+</td></tr></table>
+
+<p>will cause &ldquo;1. Carnivora&rdquo; to be printed in 13-point text, followed by
+&ldquo;1.1. Felinae&rdquo; in 11.5-point text, while &ldquo;1.1.1. Felis catus&rdquo; and
+all more deeply nested heading levels will remain in the 10-point text
+specified by the <code class="code">PS</code> register. &ldquo;Machairodontinae&rdquo; is printed at
+11.5 points, since it corresponds to heading level&nbsp;2.
+</p>
+<p>The <code class="code">HORPHANS</code> register operates in conjunction with the <code class="code">NH</code>
+and <code class="code">SH</code> macros to inhibit the printing of isolated headings at the
+bottom of a page; it specifies the minimum number of lines of an
+immediately subsequent paragraph that must be kept on the same page as
+the heading. If insufficient space remains on the current page to
+accommodate the heading and this number of lines of paragraph text, a
+page break is forced before the heading is printed. Any display macro
+call or <code class="code">tbl</code>, <code class="code">pic</code>, or <code class="code">eqn</code> region between the heading
+and the subsequent paragraph suppresses this grouping. See <a class="xref" href="ms-keeps-and-displays.html">Keeps, boxed keeps, and displays</a> and <a class="ref" href="ms-Insertions.html">Tables, figures, equations, and references</a>.
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Typeface-and-decoration.html">Typeface and decoration</a>, Previous: <a href="Paragraphs-in-ms.html">Paragraphs</a>, Up: <a href="ms-Body-Text.html">Body Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Hyphenation.html b/doc/groff.html.node/Hyphenation.html
new file mode 100644
index 0000000..ec22419
--- /dev/null
+++ b/doc/groff.html.node/Hyphenation.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Hyphenation (The GNU Troff Manual)</title>
+
+<meta name="description" content="Hyphenation (The GNU Troff Manual)">
+<meta name="keywords" content="Hyphenation (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Text.html" rel="up" title="Text">
+<link href="Breaking.html" rel="next" title="Breaking">
+<link href="Sentences.html" rel="prev" title="Sentences">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Hyphenation">
+<div class="nav-panel">
+<p>
+Next: <a href="Breaking.html" accesskey="n" rel="next">Breaking</a>, Previous: <a href="Sentences.html" accesskey="p" rel="prev">Sentences</a>, Up: <a href="Text.html" accesskey="u" rel="up">Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Hyphenation-1">5.1.3 Hyphenation</h4>
+<a class="index-entry-id" id="index-hyphenation"></a>
+
+<p>When an output line is nearly full, it is uncommon for the next word
+collected from the input to exactly fill it&mdash;typically, there is room
+left over only for part of the next word. The process of splitting a
+word so that it appears partially on one line (with a hyphen to indicate
+to the reader that the word has been broken) with its remainder on the
+next is <em class="dfn">hyphenation</em>. Hyphenation points can be manually
+specified; GNU <code class="code">troff</code> also uses a hyphenation algorithm and
+language-specific pattern files (based on those used in TeX) to
+decide which words can be hyphenated and where.
+</p>
+<p>Hyphenation does not always occur even when the hyphenation rules for a
+word allow it; it can be disabled, and when not disabled there are
+several parameters that can prevent it in certain circumstances.
+See <a class="xref" href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a>.
+</p>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/I_002fO.html b/doc/groff.html.node/I_002fO.html
new file mode 100644
index 0000000..92a7fc0
--- /dev/null
+++ b/doc/groff.html.node/I_002fO.html
@@ -0,0 +1,457 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>I/O (The GNU Troff Manual)</title>
+
+<meta name="description" content="I/O (The GNU Troff Manual)">
+<meta name="keywords" content="I/O (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Postprocessor-Access.html" rel="next" title="Postprocessor Access">
+<link href="Suppressing-Output.html" rel="prev" title="Suppressing Output">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="I_002fO">
+<div class="nav-panel">
+<p>
+Next: <a href="Postprocessor-Access.html" accesskey="n" rel="next">Postprocessor Access</a>, Previous: <a href="Suppressing-Output.html" accesskey="p" rel="prev">Suppressing Output</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="I_002fO-1">5.33 I/O</h3>
+<a class="index-entry-id" id="index-i_002fo"></a>
+<a class="index-entry-id" id="index-input-and-output-requests"></a>
+<a class="index-entry-id" id="index-requests-for-input-and-output"></a>
+<a class="index-entry-id" id="index-output-and-input-requests"></a>
+
+<p><code class="code">gtroff</code> has several requests for including files:
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eso"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.so</code></strong> <var class="def-var-arguments">file</var><a class="copiable-link" href='#index-_002eso'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-so"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002esoquiet"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.soquiet</code></strong> <var class="def-var-arguments">file</var><a class="copiable-link" href='#index-_002esoquiet'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-soquiet"></a>
+<a class="index-entry-id" id="index-including-a-file-_0028so_0029"></a>
+<a class="index-entry-id" id="index-file_002c-inclusion-_0028so_0029"></a>
+<p>Replace the <code class="code">so</code> request&rsquo;s control line with the contents of the
+file named by the argument, &ldquo;sourcing&rdquo; it. <var class="var">file</var> is sought in
+the directories specified by <samp class="option">-I</samp> command-line option. If
+<var class="var">file</var> does not exist, a warning in category &lsquo;<samp class="samp">file</samp>&rsquo; is produced
+and the request has no further effect. See <a class="xref" href="Warnings.html">Warnings</a>, for
+information about the enablement and suppression of warnings.
+</p>
+<p><code class="code">so</code> can be useful for large documents; e.g., allowing each chapter
+of a book to be kept in a separate file. However, files interpolated
+with <code class="code">so</code> are not preprocessed; to overcome this limitation, see
+the <cite class="cite">gsoelim<span class="r">(1)</span></cite> man page.
+</p>
+<p>Since GNU <code class="code">troff</code> replaces the entire control line with the
+contents of a file, it matters whether <code class="code">file</code> is terminated with a
+newline or not. Assume that file <samp class="file">xxx</samp> contains only the word
+&lsquo;<samp class="samp">foo</samp>&rsquo; without a trailing newline.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">$ printf 'foo' &gt; xxx
+
+The situation is
+.so xxx
+bar.
+ &rArr; The situation is foobar.
+</pre></div></div>
+
+<p><code class="code">soquiet</code> works the same way, except that no warning diagnostic is
+issued if <var class="var">file</var> does not exist.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epso"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pso</code></strong> <var class="def-var-arguments">command</var><a class="copiable-link" href='#index-_002epso'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-pso"></a>
+<p>Read the standard output from the specified <var class="var">command</var> and include
+it in place of the <code class="code">pso</code> request.
+</p>
+<a class="index-entry-id" id="index-safer-mode-3"></a>
+<a class="index-entry-id" id="index-mode_002c-safer-3"></a>
+<a class="index-entry-id" id="index-unsafe-mode-3"></a>
+<a class="index-entry-id" id="index-mode_002c-unsafe-3"></a>
+<p>It is an error to use this request in safer mode, which is the
+default. Invoke GNU <code class="code">troff</code> or a front end with the <samp class="option">-U</samp>
+option to enable unsafe mode.
+</p>
+<p>The comment regarding a final newline for the <code class="code">so</code> request is valid
+for <code class="code">pso</code> also.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002emso"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.mso</code></strong> <var class="def-var-arguments">file</var><a class="copiable-link" href='#index-_002emso'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-mso"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002emsoquiet"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.msoquiet</code></strong> <var class="def-var-arguments">file</var><a class="copiable-link" href='#index-_002emsoquiet'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-msoquiet"></a>
+<p>Identical to the <code class="code">so</code> and <code class="code">soquiet</code> requests, respectively,
+except that <code class="code">gtroff</code> searches for the specified <var class="var">file</var> in the
+same directories as macro files for the <samp class="option">-m</samp> command-line option.
+If the file name to be included has the form <samp class="file"><var class="var">name</var>.tmac</samp> and
+it isn&rsquo;t found, these requests try to include <samp class="file">tmac.<var class="var">name</var></samp> and
+vice versa.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002etrf"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.trf</code></strong> <var class="def-var-arguments">file</var><a class="copiable-link" href='#index-_002etrf'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-trf"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002ecf"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.cf</code></strong> <var class="def-var-arguments">file</var><a class="copiable-link" href='#index-_002ecf'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-cf"></a>
+<a class="index-entry-id" id="index-transparent-output-_0028cf_002c-trf_0029"></a>
+<a class="index-entry-id" id="index-output_002c-transparent-_0028cf_002c-trf_0029"></a>
+<a class="index-entry-id" id="index-cf-request_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-cf-request"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-cf-request"></a>
+<a class="index-entry-id" id="index-trf-request_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-trf-request"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-trf-request"></a>
+<p>Transparently output the contents of <var class="var">file</var>. Each line is output as
+if it were preceded by <code class="code">\!</code>; however, the lines are <em class="emph">not</em>
+subject to copy mode interpretation. If the file does not end with a
+newline, <code class="code">trf</code> adds one. Both requests cause a break.
+</p>
+<p>When used in a diversion, these requests embed a node (see <a class="pxref" href="Gtroff-Internals.html"><code class="code">gtroff</code> Internals</a>) in it that, when reread, causes the contents of <var class="var">file</var>
+to be transparently copied to the output. In <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code>, the contents of <var class="var">file</var> are immediately copied to the
+output regardless of whether there is a current diversion; this
+behaviour is so anomalous that it must be considered a bug.
+</p>
+<a class="index-entry-id" id="index-trf-request_002c-and-invalid-characters"></a>
+<a class="index-entry-id" id="index-characters_002c-invalid-for-trf-request"></a>
+<a class="index-entry-id" id="index-invalid-characters-for-trf-request"></a>
+<p>While <code class="code">cf</code> copies the contents of <var class="var">file</var> completely
+unprocessed, <code class="code">trf</code> disallows characters such as NUL that are not
+valid <code class="code">gtroff</code> input characters (see <a class="pxref" href="Identifiers.html">Identifiers</a>).
+</p>
+<p>For <code class="code">cf</code>, within a diversion, &ldquo;completely unprocessed&rdquo; means that
+each line of a file to be inserted is handled as if it were preceded by
+<code class="code">\!\\!</code>.
+</p>
+<p>To define a macro&nbsp;<code class="code">x</code> containing the contents of
+file&nbsp;<samp class="file">f</samp>, use
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ev 1
+.di x
+.trf f
+.di
+.ev
+</pre></div></div>
+
+<p>The calls to <code class="code">ev</code> prevent the partially collected output line
+from becoming part of the diversion (see <a class="pxref" href="Diversions.html">Diversions</a>).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enx"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nx</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">file</i></span>]</var><a class="copiable-link" href='#index-_002enx'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nx"></a>
+<a class="index-entry-id" id="index-processing-next-file-_0028nx_0029"></a>
+<a class="index-entry-id" id="index-file_002c-processing-next-_0028nx_0029"></a>
+<a class="index-entry-id" id="index-next-file_002c-processing-_0028nx_0029"></a>
+<p>Force <code class="code">gtroff</code> to continue processing of the file specified as an
+argument. If no argument is given, immediately jump to the end of file.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002erd"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.rd</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">prompt</i></span> [<span class="r"><i class="slanted">arg1</i></span> <span class="r"><i class="slanted">arg2</i></span> &hellip;]]</var><a class="copiable-link" href='#index-_002erd'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rd"></a>
+<a class="index-entry-id" id="index-reading-from-standard-input-_0028rd_0029"></a>
+<a class="index-entry-id" id="index-standard-input_002c-reading-from-_0028rd_0029"></a>
+<a class="index-entry-id" id="index-input_002c-standard_002c-reading-from-_0028rd_0029"></a>
+<p>Read from standard input, and include what is read as though it were
+part of the input file. Text is read until a blank line is encountered.
+</p>
+<p>If standard input is a TTY input device (keyboard), write <var class="var">prompt</var>
+to standard error, followed by a colon (or send BEL for a beep if no
+argument is given).
+</p>
+<p>Arguments after <var class="var">prompt</var> are available for the input. For example,
+the line
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.rd data foo bar
+</pre></div></div>
+
+<p>with the input &lsquo;<samp class="samp">This&nbsp;is&nbsp;\$2.</samp>&rsquo;<!-- /@w --> prints
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">This is bar.
+</pre></div></div>
+</dd></dl>
+
+<a class="index-entry-id" id="index-form-letters"></a>
+<a class="index-entry-id" id="index-letters_002c-form"></a>
+<p>Using the <code class="code">nx</code> and <code class="code">rd</code> requests, it is easy to set up form
+letters. The form letter template is constructed like this, putting the
+following lines into a file called <samp class="file">repeat.let</samp>:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ce
+\*(td
+.sp 2
+.nf
+.rd
+.sp
+.rd
+.fi
+Body of letter.
+.bp
+.nx repeat.let
+</pre></div></div>
+
+<a class="index-entry-id" id="index-ex-request_002c-used-with-nx-and-rd"></a>
+<p>When this is run, a file containing the following lines should be
+redirected in. Requests included in this file are executed as though
+they were part of the form letter. The last block of input is the
+<code class="code">ex</code> request, which tells GNU <code class="code">troff</code> to stop processing. If
+this were not there, <code class="code">troff</code> would not know when to stop.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">Trent A. Fisher
+708 NW 19th Av., #202
+Portland, OR 97209
+
+Dear Trent,
+
+Len Adollar
+4315 Sierra Vista
+San Diego, CA 92103
+
+Dear Mr. Adollar,
+
+.ex
+</pre></div></div>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epi"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pi</code></strong> <var class="def-var-arguments">pipe</var><a class="copiable-link" href='#index-_002epi'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-pi"></a>
+<p>Pipe the output of <code class="code">gtroff</code> to the shell command(s) specified by
+<var class="var">pipe</var>. This request must occur before <code class="code">gtroff</code> has a chance
+to print anything.
+</p>
+<a class="index-entry-id" id="index-safer-mode-4"></a>
+<a class="index-entry-id" id="index-mode_002c-safer-4"></a>
+<a class="index-entry-id" id="index-unsafe-mode-4"></a>
+<a class="index-entry-id" id="index-mode_002c-unsafe-4"></a>
+<p>It is an error to use this request in safer mode, which is the
+default. Invoke GNU <code class="code">troff</code> or a front end with the <samp class="option">-U</samp>
+option to enable unsafe mode.
+</p>
+<p>Multiple calls to <code class="code">pi</code> are allowed, acting as a chain. For
+example,
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.pi foo
+.pi bar
+...
+</pre></div></div>
+
+<p>is the same as &lsquo;<samp class="samp">.pi&nbsp;foo&nbsp;|&nbsp;bar</samp>&rsquo;<!-- /@w -->.
+</p>
+<a class="index-entry-id" id="index-groff_002c-and-pi-request"></a>
+<a class="index-entry-id" id="index-pi-request_002c-and-groff"></a>
+<p>The intermediate output format of GNU <code class="code">troff</code> is piped to the
+specified commands. Consequently, calling <code class="code">groff</code> without the
+<samp class="option">-Z</samp> option normally causes a fatal error.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-system-commands_002c-running"></a>
+<a class="index-entry-id" id="index-running-system-commands"></a>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002esy"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.sy</code></strong> <var class="def-var-arguments">cmds</var><a class="copiable-link" href='#index-_002esy'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-sy"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005bsystat_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[systat]</code></strong><a class="copiable-link" href='#index-_005cn_005bsystat_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-systat"></a>
+<p>Execute the shell command(s) specified by <var class="var">cmds</var>. The output is not
+saved anywhere, so it is up to the user to do so.
+</p>
+<a class="index-entry-id" id="index-safer-mode-5"></a>
+<a class="index-entry-id" id="index-mode_002c-safer-5"></a>
+<a class="index-entry-id" id="index-unsafe-mode-5"></a>
+<a class="index-entry-id" id="index-mode_002c-unsafe-5"></a>
+<p>It is an error to use this request in safer mode; this is the default.
+Give GNU <code class="code">troff</code> or a front end program the <samp class="option">-U</samp> option to
+enable unsafe mode.
+</p>
+<p>The following code fragment introduces the current time into a document.
+</p>
+<a class="index-entry-id" id="index-perl"></a>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.sy perl -e 'printf &quot;.nr H %d\\n.nr M %d\\n.nr S %d\\n&quot;,\
+ (localtime(time))[2,1,0]' &gt; /tmp/x\n[$$]
+.so /tmp/x\n[$$]
+.sy rm /tmp/x\n[$$]
+\nH:\nM:\nS
+</pre></div></div>
+
+<p>This works by having the Perl script (run by <code class="code">sy</code>) write
+<code class="code">nr</code> requests that set the registers <code class="code">H</code>, <code class="code">M</code>, and
+<code class="code">S</code> to a temporary file. The <code class="code">roff</code> document then reads the
+temporary file using the <code class="code">so</code> request.
+</p>
+<a class="index-entry-id" id="index-time_002c-formatting"></a>
+<a class="index-entry-id" id="index-formatting-the-time"></a>
+<p>The registers <code class="code">seconds</code>, <code class="code">minutes</code>, and <code class="code">hours</code>,
+initialized at startup of GNU <code class="code">troff</code>, should satisfy most
+requirements. Use the <code class="code">af</code> request to format their values for
+output.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.af hours 00
+.af minutes 00
+.af seconds 00
+\n[hours]:\n[minutes]:\n[seconds]
+ &rArr; 02:17:54
+</pre></div></div>
+
+<a class="index-entry-id" id="index-system_0028_0029-return-value-register-_0028systat_0029"></a>
+<p>The writable register <code class="code">systat</code> contains the return value of the
+<code class="code">system()</code> function executed by the last <code class="code">sy</code> request.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eopen"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.open</code></strong> <var class="def-var-arguments">stream file</var><a class="copiable-link" href='#index-_002eopen'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-open"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eopena"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.opena</code></strong> <var class="def-var-arguments">stream file</var><a class="copiable-link" href='#index-_002eopena'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-opena"></a>
+<a class="index-entry-id" id="index-opening-file-_0028open_0029"></a>
+<a class="index-entry-id" id="index-file_002c-opening-_0028open_0029"></a>
+<a class="index-entry-id" id="index-appending-to-a-file-_0028opena_0029"></a>
+<a class="index-entry-id" id="index-file_002c-appending-to-_0028opena_0029"></a>
+<p>Open the specified <var class="var">file</var> for writing and associates the specified
+<var class="var">stream</var> with it.
+</p>
+<p>The <code class="code">opena</code> request is like <code class="code">open</code>, but if the file exists,
+append to it instead of truncating it.
+</p>
+<a class="index-entry-id" id="index-safer-mode-6"></a>
+<a class="index-entry-id" id="index-mode_002c-safer-6"></a>
+<a class="index-entry-id" id="index-unsafe-mode-6"></a>
+<a class="index-entry-id" id="index-mode_002c-unsafe-6"></a>
+<p>It is an error to use these requests in safer mode; this is the default.
+Give GNU <code class="code">troff</code> or a front end program the <samp class="option">-U</samp> option to
+enable unsafe mode.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ewrite"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.write</code></strong> <var class="def-var-arguments">stream data</var><a class="copiable-link" href='#index-_002ewrite'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-write"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002ewritec"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.writec</code></strong> <var class="def-var-arguments">stream data</var><a class="copiable-link" href='#index-_002ewritec'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-writec"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-write-request"></a>
+<a class="index-entry-id" id="index-write-request_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-write-request"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-writec-request"></a>
+<a class="index-entry-id" id="index-writec-request_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-writec-request"></a>
+<a class="index-entry-id" id="index-writing-to-file-_0028write_002c-writec_0029"></a>
+<a class="index-entry-id" id="index-file_002c-writing-to-_0028write_002c-writec_0029"></a>
+<p>Write to the file associated with the specified <var class="var">stream</var>. The
+stream must previously have been the subject of an open request. The
+remainder of the line is interpreted as the <code class="code">ds</code> request reads its
+second argument: an initial neutral double quote in <var class="var">contents</var> is
+stripped to allow embedding of leading spaces, and it is read in copy
+mode.
+</p>
+<p>The <code class="code">writec</code> request is like <code class="code">write</code>, but only <code class="code">write</code>
+appends a newline to the data.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ewritem"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.writem</code></strong> <var class="def-var-arguments">stream xx</var><a class="copiable-link" href='#index-_002ewritem'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-writem"></a>
+<a class="index-entry-id" id="index-asciify-request_002c-and-writem"></a>
+<p>Write the contents of the macro or string <var class="var">xx</var> to the file
+associated with the specified <var class="var">stream</var>.
+</p>
+<a class="index-entry-id" id="index-writem-request_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-writem-request"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-writem-request"></a>
+<p><var class="var">xx</var> is read in copy mode, i.e., already formatted elements are
+ignored. Consequently, diversions must be unformatted with the
+<code class="code">asciify</code> request before calling <code class="code">writem</code>. Usually, this
+means a loss of information.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eclose"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.close</code></strong> <var class="def-var-arguments">stream</var><a class="copiable-link" href='#index-_002eclose'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-close"></a>
+<a class="index-entry-id" id="index-closing-file-_0028close_0029"></a>
+<a class="index-entry-id" id="index-file_002c-closing-_0028close_0029"></a>
+<p>Close the specified <var class="var">stream</var>; the stream is no longer an acceptable
+argument to the <code class="code">write</code> request.
+</p>
+<p>Here a simple macro to write an index entry.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.open idx test.idx
+.
+.de IX
+. write idx \\n[%] \\$*
+..
+.
+.IX test entry
+.
+.close idx
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cVe"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\V</code><span class="r"><i class="slanted">e</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cVe'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cV"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cV_0028ev"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\V(</code><span class="r"><i class="slanted">ev</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cV_0028ev'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cV_005benv_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\V[</code><span class="r"><i class="slanted">env</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cV_005benv_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cV_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-_005cV"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-_005cV"></a>
+<p>Interpolate the contents of the specified environment variable <var class="var">env</var>
+(one-character name&nbsp;<var class="var">e</var>, two-character name <var class="var">ev</var>) as
+returned by the function <cite class="cite">getenv<span class="r">(3)</span></cite>. <code class="code">\V</code> is interpreted
+even in copy mode (see <a class="pxref" href="Copy-Mode.html">Copy Mode</a>).
+</p></dd></dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Postprocessor-Access.html">Postprocessor Access</a>, Previous: <a href="Suppressing-Output.html">Suppressing Output</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Identifiers.html b/doc/groff.html.node/Identifiers.html
new file mode 100644
index 0000000..5734bb5
--- /dev/null
+++ b/doc/groff.html.node/Identifiers.html
@@ -0,0 +1,210 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Identifiers (The GNU Troff Manual)</title>
+
+<meta name="description" content="Identifiers (The GNU Troff Manual)">
+<meta name="keywords" content="Identifiers (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Formatter-Instructions.html" rel="next" title="Formatter Instructions">
+<link href="Numeric-Expressions.html" rel="prev" title="Numeric Expressions">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Identifiers">
+<div class="nav-panel">
+<p>
+Next: <a href="Formatter-Instructions.html" accesskey="n" rel="next">Formatter Instructions</a>, Previous: <a href="Numeric-Expressions.html" accesskey="p" rel="prev">Numeric Expressions</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Identifiers-1">5.5 Identifiers</h3>
+<a class="index-entry-id" id="index-identifiers"></a>
+
+<p>An <em class="dfn">identifier</em> labels a GNU <code class="code">troff</code> datum such as a register,
+name (macro, string, or diversion), typeface, color, special character,
+character class, environment, or stream. Valid identifiers consist of
+one or more ordinary characters.
+<a class="index-entry-id" id="index-ordinary-character"></a>
+<a class="index-entry-id" id="index-character_002c-ordinary"></a>
+An <i class="slanted">ordinary character</i> is an input character that is not the
+escape character, a leader, tab, newline, or invalid as GNU <code class="code">troff</code>
+input.
+</p>
+<a class="index-entry-id" id="index-invalid-input-characters"></a>
+<a class="index-entry-id" id="index-input-characters_002c-invalid"></a>
+<a class="index-entry-id" id="index-characters_002c-invalid-input"></a>
+<a class="index-entry-id" id="index-Unicode"></a>
+<p>Invalid input characters are a subset of control characters (from the
+sets &ldquo;C0 Controls&rdquo; and &ldquo;C1 Controls&rdquo; as Unicode describes them).
+When GNU <code class="code">troff</code> encounters one in an identifier, it produces a
+warning in category &lsquo;<samp class="samp">input</samp>&rsquo; (see <a class="pxref" href="Warnings.html">Warnings</a>). They are removed
+during interpretation: an identifier &lsquo;<samp class="samp">foo</samp>&rsquo;, followed by an invalid
+character and then &lsquo;<samp class="samp">bar</samp>&rsquo;, is processed as &lsquo;<samp class="samp">foobar</samp>&rsquo;.
+</p>
+<p>On a machine using the ISO 646, 8859, or 10646 character encodings,
+invalid input characters are <code class="code">0x00</code>, <code class="code">0x08</code>, <code class="code">0x0B</code>,
+<code class="code">0x0D</code>&ndash;<code class="code">0x1F</code>, and <code class="code">0x80</code>&ndash;<code class="code">0x9F</code>. On an
+<abbr class="acronym">EBCDIC</abbr> host, they are <code class="code">0x00</code>&ndash;<code class="code">0x01</code>, <code class="code">0x08</code>,
+<code class="code">0x09</code>, <code class="code">0x0B</code>, <code class="code">0x0D</code>&ndash;<code class="code">0x14</code>,
+<code class="code">0x17</code>&ndash;<code class="code">0x1F</code>, and
+<code class="code">0x30</code>&ndash;<code class="code">0x3F</code>.<a class="footnote" id="DOCF40" href="groff.html_fot.html#FOOT40"><sup>40</sup></a> Some of these code points are used
+by GNU <code class="code">troff</code> internally, making it non-trivial to extend the
+program to accept UTF-8 or other encodings that use characters from
+these ranges.<a class="footnote" id="DOCF41" href="groff.html_fot.html#FOOT41"><sup>41</sup></a>
+</p>
+<p>Thus, the identifiers &lsquo;<samp class="samp">br</samp>&rsquo;, &lsquo;<samp class="samp">PP</samp>&rsquo;, &lsquo;<samp class="samp">end-list</samp>&rsquo;,
+&lsquo;<samp class="samp">ref*normal-print</samp>&rsquo;, &lsquo;<samp class="samp">|</samp>&rsquo;, &lsquo;<samp class="samp">@_</samp>&rsquo;, and &lsquo;<samp class="samp">!&quot;#$%'()*+,-./</samp>&rsquo;
+are all valid. Discretion should be exercised to prevent confusion.
+Identifiers starting with &lsquo;<samp class="samp">(</samp>&rsquo; or &lsquo;<samp class="samp">[</samp>&rsquo; require care.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr x 9
+.nr y 1
+.nr (x 2
+.nr [y 3
+.nr sum1 (\n(x + \n[y])
+ error&rarr; a space character is not allowed in an escape
+ error&rarr; sequence parameter
+A:2+3=\n[sum1]
+.nr sum2 (\n((x + \n[[y])
+B:2+3=\n[sum2]
+.nr sum3 (\n[(x] + \n([y)
+C:2+3=\n[sum3]
+ &rArr; A:2+3=1 B:2+3=5 C:2+3=5
+</pre></div></div>
+
+<a class="index-entry-id" id="index-_005d_002c-as-part-of-an-identifier"></a>
+<p>An identifier with a closing bracket (&lsquo;<samp class="samp">]</samp>&rsquo;) in its name can&rsquo;t be
+accessed with bracket-form escape sequences that expect an identifier as
+a parameter. For example, &lsquo;<samp class="samp">\[foo]]</samp>&rsquo; accesses the glyph &lsquo;<samp class="samp">foo</samp>&rsquo;,
+followed by &lsquo;<samp class="samp">]</samp>&rsquo; in whatever the surrounding context is, whereas
+&lsquo;<samp class="samp">\C'foo]'</samp>&rsquo; formats a glyph named &lsquo;<samp class="samp">foo]</samp>&rsquo;. Similarly, the
+identifier &lsquo;<samp class="samp">(</samp>&rsquo; can&rsquo;t be interpolated <em class="emph">except</em> with bracket
+forms.
+</p>
+<a class="index-entry-id" id="index-refer_002c-and-macro-names-starting-with-_005b-or-_005d"></a>
+<a class="index-entry-id" id="index-_005b_002c-macro-names-starting-with_002c-and-refer"></a>
+<a class="index-entry-id" id="index-_005d_002c-macro-names-starting-with_002c-and-refer"></a>
+<a class="index-entry-id" id="index-macro-names_002c-starting-with-_005b-or-_005d_002c-and-refer"></a>
+<p>If you begin a macro, string, or diversion name with either of the
+characters &lsquo;<samp class="samp">[</samp>&rsquo; or &lsquo;<samp class="samp">]</samp>&rsquo;, you foreclose use of the <code class="code">grefer</code>
+preprocessor, which recognizes &lsquo;<samp class="samp">.[</samp>&rsquo; and &lsquo;<samp class="samp">.]</samp>&rsquo; as bibliographic
+reference delimiters.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cA_0027anything_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\A<code class="code">'</code></code><span class="r"><i class="slanted">anything</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cA_0027anything_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cA"></a>
+<p>Interpolate&nbsp;1 if <var class="var">anything</var> is a valid identifier, and&nbsp;0
+otherwise. The delimiter need not be a neutral apostrophe; see
+<a class="ref" href="Delimiters.html">Delimiters</a>. Because invalid input characters are removed (see
+above), invalid identifiers are empty or contain spaces, tabs, or
+newlines.
+</p>
+<p>You can employ <code class="code">\A</code> to validate a macro argument before using it to
+construct another escape sequence or identifier.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.\&quot; usage: .init-coordinate-pair name val1 val2
+.\&quot; Create a coordinate pair where name!x=val1 and
+.\&quot; name!y=val2.
+.de init-coordinate-pair
+. if \A'\\$1' \{\
+. if \B'\\$2' .nr \\$1!x \\$2
+. if \B'\\$3' .nr \\$1!y \\$3
+. \}
+..
+.init-coordinate-pair center 5 10
+The center is at (\n[center!x], \n[center!y]).
+.init-coordinate-pair &quot;poi&rarr;nt&quot; trash garbage \&quot; ignored
+.init-coordinate-pair point trash garbage \&quot; ignored
+ &rArr; The center is at (5, 10).
+</pre></div></div>
+
+<p>In this example, we also validated the numeric arguments; the registers
+&lsquo;<samp class="samp">point!x</samp>&rsquo; and &lsquo;<samp class="samp">point!y</samp>&rsquo; remain undefined. See <a class="xref" href="Numeric-Expressions.html">Numeric Expressions</a> for the <code class="code">\B</code> escape sequence.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-undefined-identifiers"></a>
+<a class="index-entry-id" id="index-identifiers_002c-undefined"></a>
+<p>How GNU <code class="code">troff</code> handles the interpretation of an undefined
+identifier depends on the context. There is no way to invoke an
+undefined request; such syntax is interpreted as a macro call instead.
+If the identifier is interpreted as a string, macro, or diversion, GNU
+<code class="code">troff</code> emits a warning in category &lsquo;<samp class="samp">mac</samp>&rsquo;, defines it as
+empty, and interpolates nothing. If the identifier is interpreted as a
+register, GNU <code class="code">troff</code> emits a warning in category &lsquo;<samp class="samp">reg</samp>&rsquo;,
+initializes it to zero, and interpolates that value. See <a class="xref" href="Warnings.html">Warnings</a>,
+<a class="ref" href="Interpolating-Registers.html">Interpolating Registers</a>, and <a class="ref" href="Strings.html">Strings</a>. Attempting to use an
+undefined typeface, special character, color, character class,
+environment, or stream generally provokes an error diagnostic.
+</p>
+<a class="index-entry-id" id="index-name-space_002c-common_002c-of-macros_002c-diversions_002c-and-strings"></a>
+<a class="index-entry-id" id="index-common-name-space-of-macros_002c-diversions_002c-and-strings"></a>
+<a class="index-entry-id" id="index-macros_002c-shared-name-space-with-strings-and-diversions"></a>
+<a class="index-entry-id" id="index-strings_002c-shared-name-space-with-macros-and-diversions"></a>
+<a class="index-entry-id" id="index-diversions_002c-shared-name-space-with-macros-and-strings"></a>
+<p>Identifiers for requests, macros, strings, and diversions share one name
+space; special characters and character classes another. No other
+object types do.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de xxx
+. nop foo
+..
+.di xxx
+bar
+.br
+.di
+.
+.xxx
+ &rArr; bar
+</pre></div></div>
+
+<p>The foregoing example shows that GNU <code class="code">troff</code> reuses the identifier
+&lsquo;<samp class="samp">xxx</samp>&rsquo;, changing it from a macro to a diversion. No warning is
+emitted, and the previous contents of &lsquo;<samp class="samp">xxx</samp>&rsquo; are lost.
+</p>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Formatter-Instructions.html">Formatter Instructions</a>, Previous: <a href="Numeric-Expressions.html">Numeric Expressions</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Implementation-Differences.html b/doc/groff.html.node/Implementation-Differences.html
new file mode 100644
index 0000000..4645778
--- /dev/null
+++ b/doc/groff.html.node/Implementation-Differences.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Implementation Differences (The GNU Troff Manual)</title>
+
+<meta name="description" content="Implementation Differences (The GNU Troff Manual)">
+<meta name="keywords" content="Implementation Differences (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Safer-Mode.html" rel="next" title="Safer Mode">
+<link href="Debugging.html" rel="prev" title="Debugging">
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Implementation-Differences">
+<div class="nav-panel">
+<p>
+Next: <a href="Safer-Mode.html" accesskey="n" rel="next">Safer Mode</a>, Previous: <a href="Debugging.html" accesskey="p" rel="prev">Debugging</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Implementation-Differences-1">5.38 Implementation Differences</h3>
+<a class="index-entry-id" id="index-implementation-differences"></a>
+<a class="index-entry-id" id="index-differences-in-implementation"></a>
+<a class="index-entry-id" id="index-incompatibilities-with-AT_0026T-troff"></a>
+
+<p>GNU <code class="code">troff</code> has a number of features that cause incompatibilities
+with documents written for other versions of <code class="code">troff</code>. Some GNU
+extensions to <code class="code">troff</code> have become supported by other
+implementations.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="Safer-Mode.html" accesskey="1">Safer Mode</a></li>
+<li><a href="Compatibility-Mode.html" accesskey="2">Compatibility Mode</a></li>
+<li><a href="Other-Differences.html" accesskey="3">Other Differences</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Indented-regions-in-ms.html b/doc/groff.html.node/Indented-regions-in-ms.html
new file mode 100644
index 0000000..44c648f
--- /dev/null
+++ b/doc/groff.html.node/Indented-regions-in-ms.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Indented regions in ms (The GNU Troff Manual)</title>
+
+<meta name="description" content="Indented regions in ms (The GNU Troff Manual)">
+<meta name="keywords" content="Indented regions in ms (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms-Body-Text.html" rel="up" title="ms Body Text">
+<link href="ms-keeps-and-displays.html" rel="next" title="ms keeps and displays">
+<link href="Lists-in-ms.html" rel="prev" title="Lists in ms">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="Indented-regions-in-ms">
+<div class="nav-panel">
+<p>
+Next: <a href="ms-keeps-and-displays.html" accesskey="n" rel="next">Keeps, boxed keeps, and displays</a>, Previous: <a href="Lists-in-ms.html" accesskey="p" rel="prev">Lists</a>, Up: <a href="ms-Body-Text.html" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Indented-regions">4.6.5.7 Indented regions</h4>
+
+<p>You may need to indent a region of text while otherwise formatting it
+normally. Indented regions can be nested; you can change <code class="code">\n[PI]</code>
+before each call to vary the amount of inset.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eRS"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.RS</code></strong><a class="copiable-link" href='#index-_002eRS'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-RS-_005bms_005d"></a>
+<p>Begin a region where headings, paragraphs, and displays are indented
+(further) by the amount stored in the <code class="code">PI</code> register.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eRE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.RE</code></strong><a class="copiable-link" href='#index-_002eRE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-RE-_005bms_005d"></a>
+<p>End the (next) most recent indented region.
+</p></dd></dl>
+
+<p>This feature enables you to easily line up text under hanging and
+indented paragraphs.
+<a class="index-entry-id" id="index-ms-macros_002c-nested-lists"></a>
+<a class="index-entry-id" id="index-nested-lists-_005bms_005d"></a>
+For example, you may wish to structure lists hierarchically.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.IP \[bu] 2
+Lawyers:
+.RS
+.IP \[bu]
+Dewey,
+.IP \[bu]
+Cheatham,
+and
+.IP \[bu]
+and Howe.
+.RE
+.IP \[bu]
+Guns
+</pre></div>
+</td></tr></table>
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">&bull; Lawyers:
+
+ &bull; Dewey,
+
+ &bull; Cheatham, and
+
+ &bull; Howe.
+
+&bull; Guns
+</pre></div></div>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Indexing.html b/doc/groff.html.node/Indexing.html
new file mode 100644
index 0000000..26895ca
--- /dev/null
+++ b/doc/groff.html.node/Indexing.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Indexing (The GNU Troff Manual)</title>
+
+<meta name="description" content="Indexing (The GNU Troff Manual)">
+<meta name="keywords" content="Indexing (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Common-Features.html" rel="up" title="Common Features">
+<link href="Document-Formats.html" rel="next" title="Document Formats">
+<link href="Table-of-Contents.html" rel="prev" title="Table of Contents">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Indexing">
+<div class="nav-panel">
+<p>
+Next: <a href="Document-Formats.html" accesskey="n" rel="next">Document Formats</a>, Previous: <a href="Table-of-Contents.html" accesskey="p" rel="prev">Table of Contents</a>, Up: <a href="Common-Features.html" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Indexing-1">3.2.8 Indexing</h4>
+<a class="index-entry-id" id="index-index_002c-in-macro-package"></a>
+
+<a class="index-entry-id" id="index-makeindex"></a>
+<p>An index is similar to a table of contents, in that entry labels and
+locations must be collected, but poses a greater challenge because it
+needs to be sorted before it is output. Here, processing the document
+in multiple passes is inescapable, and tools like the <code class="code">makeindex</code>
+program are necessary.
+</p>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Input-Conventions.html b/doc/groff.html.node/Input-Conventions.html
new file mode 100644
index 0000000..35005bd
--- /dev/null
+++ b/doc/groff.html.node/Input-Conventions.html
@@ -0,0 +1,171 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Input Conventions (The GNU Troff Manual)</title>
+
+<meta name="description" content="Input Conventions (The GNU Troff Manual)">
+<meta name="keywords" content="Input Conventions (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Text.html" rel="up" title="Text">
+<link href="Input-Encodings.html" rel="prev" title="Input Encodings">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+ul.mark-bullet {list-style-type: disc}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Input-Conventions">
+<div class="nav-panel">
+<p>
+Previous: <a href="Input-Encodings.html" accesskey="p" rel="prev">Input Encodings</a>, Up: <a href="Text.html" accesskey="u" rel="up">Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Input-Conventions-1">5.1.10 Input Conventions</h4>
+<a class="index-entry-id" id="index-input-conventions"></a>
+<a class="index-entry-id" id="index-conventions-for-input"></a>
+
+<p>Since GNU <code class="code">troff</code> fills text automatically, it is common practice
+in the <code class="code">roff</code> language to avoid visual composition of text in input
+files: the esthetic appeal of the formatted output is what matters.
+Therefore, <code class="code">roff</code> input should be arranged such that it is easy for
+authors and maintainers to compose and develop the document, understand
+the syntax of <code class="code">roff</code> requests, macro calls, and preprocessor
+languages used, and predict the behavior of the formatter. Several
+traditions have accrued in service of these goals.
+</p>
+<ul class="itemize mark-bullet">
+<li>Follow sentence endings in the input with newlines to ease their
+recognition (see <a class="pxref" href="Sentences.html">Sentences</a>). It is frequently convenient to end
+text lines after colons and semicolons as well, as these typically
+precede independent clauses. Consider doing so after commas; they often
+occur in lists that become easy to scan when itemized by line, or
+constitute supplements to the sentence that are added, deleted, or
+updated to clarify it. Parenthetical and quoted phrases are also good
+candidates for placement on text lines by themselves.
+
+</li><li>Set your text editor&rsquo;s line length to 72 characters or
+fewer.<a class="footnote" id="DOCF32" href="groff.html_fot.html#FOOT32"><sup>32</sup></a>
+This limit, combined with the previous item of advice, makes it less
+common that an input line will wrap in your text editor, and thus will
+help you perceive excessively long constructions in your text. Recall
+that natural languages originate in speech, not writing, and that
+punctuation is correlated with pauses for breathing and changes in
+prosody.
+
+</li><li>Use <code class="code">\&amp;</code> after &lsquo;<samp class="samp">!</samp>&rsquo;, &lsquo;<samp class="samp">?</samp>&rsquo;, and &lsquo;<samp class="samp">.</samp>&rsquo; if they are
+followed by space, tab, or newline characters and don&rsquo;t end a sentence.
+
+</li><li>In filled text lines, use <code class="code">\&amp;</code> before &lsquo;<samp class="samp">.</samp>&rsquo; and &lsquo;<samp class="samp">'</samp>&rsquo; if they
+are preceded by space, so that reflowing the input doesn&rsquo;t turn them
+into control lines.
+
+</li><li>Do not use spaces to perform indentation or align columns of a table.
+Leading spaces are reliable when text is not being filled.
+
+</li><li>Comment your document. It is never too soon to apply comments to
+record information of use to future document maintainers (including your
+future self). We thus introduce another escape sequence, <code class="code">\&quot;</code>,
+which causes GNU <code class="code">troff</code> to ignore the remainder of the input line.
+
+</li><li>Use the empty request&mdash;a control character followed immediately by a
+newline&mdash;to visually manage separation of material in input files.
+Many of the <code class="code">groff</code> project&rsquo;s own documents use an empty request
+between sentences, after macro definitions, and where a break is
+expected, and two empty requests between paragraphs or other requests or
+macro calls that will introduce vertical space into the document.
+
+<p>You can combine the empty request with the comment escape sequence to
+include whole-line comments in your document, and even &ldquo;comment out&rdquo;
+sections of it.
+</p></li></ul>
+
+<p>We conclude this section with an example sufficiently long to illustrate
+most of the above suggestions in practice. For the purpose of fitting
+the example between the margins of this manual with the font used for
+its typeset version, we have shortened the input line length to 56
+columns. As before, an arrow &rarr; indicates a tab character.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.\&quot; nroff this_file.roff | less
+.\&quot; groff -T ps this_file.roff &gt; this_file.ps
+&rarr;The theory of relativity is intimately connected with
+the theory of space and time.
+.
+I shall therefore begin with a brief investigation of
+the origin of our ideas of space and time,
+although in doing so I know that I introduce a
+controversial subject. \&quot; remainder of paragraph elided
+.
+.
+
+&rarr;The experiences of an individual appear to us arranged
+in a series of events;
+in this series the single events which we remember
+appear to be ordered according to the criterion of
+\[lq]earlier\[rq] and \[lq]later\[rq], \&quot; punct swapped
+which cannot be analysed further.
+.
+There exists,
+therefore,
+for the individual,
+an I-time,
+or subjective time.
+.
+This itself is not measurable.
+.
+I can,
+indeed,
+associate numbers with the events,
+in such a way that the greater number is associated with
+the later event than with an earlier one;
+but the nature of this association may be quite
+arbitrary.
+.
+This association I can define by means of a clock by
+comparing the order of events furnished by the clock
+with the order of a given series of events.
+.
+We understand by a clock something which provides a
+series of events which can be counted,
+and which has other properties of which we shall speak
+later.
+.\&quot; Albert Einstein, _The Meaning of Relativity_, 1922
+</pre></div>
+</td></tr></table>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Previous: <a href="Input-Encodings.html">Input Encodings</a>, Up: <a href="Text.html">Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Input-Encodings.html b/doc/groff.html.node/Input-Encodings.html
new file mode 100644
index 0000000..f9ef79d
--- /dev/null
+++ b/doc/groff.html.node/Input-Encodings.html
@@ -0,0 +1,154 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Input Encodings (The GNU Troff Manual)</title>
+
+<meta name="description" content="Input Encodings (The GNU Troff Manual)">
+<meta name="keywords" content="Input Encodings (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Text.html" rel="up" title="Text">
+<link href="Input-Conventions.html" rel="next" title="Input Conventions">
+<link href="Macro-Packages.html" rel="prev" title="Macro Packages">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span.w-nolinebreak-text {white-space: nowrap}
+span:hover a.copiable-link {visibility: visible}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Input-Encodings">
+<div class="nav-panel">
+<p>
+Next: <a href="Input-Conventions.html" accesskey="n" rel="next">Input Conventions</a>, Previous: <a href="Macro-Packages.html" accesskey="p" rel="prev">Macro Packages</a>, Up: <a href="Text.html" accesskey="u" rel="up">Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Input-Encodings-1">5.1.9 Input Encodings</h4>
+
+<p>The <code class="command">groff</code> command&rsquo;s <samp class="option">-k</samp> option calls the
+<code class="command">preconv</code> preprocessor to perform input character encoding
+conversions. Input to the GNU <code class="code">troff</code> formatter itself, on the
+other hand, must be in one of two encodings it can recognize.
+</p>
+<dl class="table">
+<dt id='index-encoding_002c-input_002c-EBCDIC'><span><code class="code">cp1047</code><a class="copiable-link" href='#index-encoding_002c-input_002c-EBCDIC'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-EBCDIC_002c-input-encoding"></a>
+<a class="index-entry-id" id="index-input-encoding_002c-EBCDIC"></a>
+<a class="index-entry-id" id="index-encoding_002c-input_002c-code-page-1047"></a>
+<a class="index-entry-id" id="index-code-page-1047_002c-input-encoding"></a>
+<a class="index-entry-id" id="index-input-encoding_002c-code-page-1047"></a>
+<a class="index-entry-id" id="index-IBM-code-page-1047-input-encoding"></a>
+<a class="index-entry-id" id="index-cp1047_002etmac"></a>
+<p>The code page 1047 input encoding works only on <abbr class="acronym">EBCDIC</abbr>
+platforms (and conversely, the other input encodings don&rsquo;t work with
+<abbr class="acronym">EBCDIC</abbr>); the file <samp class="file">cp1047.tmac</samp> is loaded at startup.
+</p>
+</dd>
+<dt id='index-encoding_002c-input_002c-Latin_002d1-_0028ISO-8859_002d1_0029'><span><code class="code">latin1</code><a class="copiable-link" href='#index-encoding_002c-input_002c-Latin_002d1-_0028ISO-8859_002d1_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-Latin_002d1-_0028ISO-8859_002d1_0029_002c-input-encoding"></a>
+<a class="index-entry-id" id="index-ISO-8859_002d1-_0028Latin_002d1_0029_002c-input-encoding"></a>
+<a class="index-entry-id" id="index-input-encoding_002c-Latin_002d1-_0028ISO-8859_002d1_0029"></a>
+<a class="index-entry-id" id="index-latin1_002etmac"></a>
+<p>ISO <span class="w-nolinebreak-text">Latin-1</span><!-- /@w -->, an encoding for Western European languages, is the
+default input encoding on non-<abbr class="acronym">EBCDIC</abbr> platforms; the file
+<samp class="file">latin1.tmac</samp> is loaded at startup.
+</p></dd>
+</dl>
+
+<p>Any document that is encoded in ISO 646:1991 (a descendant of USAS
+<span class="w-nolinebreak-text">X3.4-1968</span><!-- /@w --> or &ldquo;US-ASCII&rdquo;), or, equivalently, uses only code points
+from the &ldquo;C0 Controls&rdquo; and &ldquo;Basic Latin&rdquo; parts of the Unicode
+character set is also a valid ISO <span class="w-nolinebreak-text">Latin-1</span><!-- /@w --> document; the standards
+are interchangeable in their first 128 code points.<a class="footnote" id="DOCF30" href="groff.html_fot.html#FOOT30"><sup>30</sup></a>
+</p>
+<p>Other encodings are supported by means of macro packages.
+</p>
+<dl class="table">
+<dt id='index-encoding_002c-input_002c-Latin_002d2-_0028ISO-8859_002d2_0029'><span><code class="code">latin2</code><a class="copiable-link" href='#index-encoding_002c-input_002c-Latin_002d2-_0028ISO-8859_002d2_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-Latin_002d2-_0028ISO-8859_002d2_0029_002c-input-encoding"></a>
+<a class="index-entry-id" id="index-ISO-8859_002d2-_0028Latin_002d2_0029_002c-input-encoding"></a>
+<a class="index-entry-id" id="index-input-encoding_002c-Latin_002d2-_0028ISO-8859_002d2_0029"></a>
+<a class="index-entry-id" id="index-latin2_002etmac"></a>
+<p>To use ISO <span class="w-nolinebreak-text">Latin-2</span><!-- /@w -->, an encoding for Central and Eastern European
+languages, invoke &lsquo;<samp class="samp">.mso&nbsp;latin2.tmac</samp>&rsquo;<!-- /@w --> at the beginning of your
+document or supply &lsquo;<samp class="samp">-mlatin2</samp>&rsquo; as a command-line argument to
+<code class="code">groff</code>.
+</p>
+</dd>
+<dt id='index-encoding_002c-input_002c-Latin_002d5-_0028ISO-8859_002d9_0029'><span><code class="code">latin5</code><a class="copiable-link" href='#index-encoding_002c-input_002c-Latin_002d5-_0028ISO-8859_002d9_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-Latin_002d5-_0028ISO-8859_002d9_0029_002c-input-encoding"></a>
+<a class="index-entry-id" id="index-ISO-8859_002d9-_0028Latin_002d5_0029_002c-input-encoding"></a>
+<a class="index-entry-id" id="index-input-encoding_002c-Latin_002d5-_0028ISO-8859_002d9_0029"></a>
+<a class="index-entry-id" id="index-latin5_002etmac"></a>
+<p>To use ISO <span class="w-nolinebreak-text">Latin-5</span><!-- /@w -->, an encoding for the Turkish language, invoke
+&lsquo;<samp class="samp">.mso&nbsp;latin5.tmac</samp>&rsquo;<!-- /@w --> at the beginning of your document or
+supply &lsquo;<samp class="samp">-mlatin5</samp>&rsquo; as a command-line argument to <code class="code">groff</code>.
+</p>
+</dd>
+<dt id='index-encoding_002c-input_002c-Latin_002d9-_0028ISO-8859_002d15_0029'><span><code class="code">latin9</code><a class="copiable-link" href='#index-encoding_002c-input_002c-Latin_002d9-_0028ISO-8859_002d15_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-Latin_002d9-_0028ISO-8859_002d15_0029_002c-input-encoding"></a>
+<a class="index-entry-id" id="index-ISO-8859_002d15-_0028Latin_002d9_0029_002c-input-encoding"></a>
+<a class="index-entry-id" id="index-input-encoding_002c-Latin_002d9-_0028ISO-8859_002d15_0029"></a>
+<a class="index-entry-id" id="index-latin9_002etmac"></a>
+<p>ISO <span class="w-nolinebreak-text">Latin-9</span><!-- /@w --> succeeds <span class="w-nolinebreak-text">Latin-1</span><!-- /@w -->; it includes a Euro sign and better
+glyph coverage for French. To use this encoding, invoke &lsquo;<samp class="samp">.mso&nbsp;latin9.tmac</samp>&rsquo;<!-- /@w --> at the beginning of your document or supply
+&lsquo;<samp class="samp">-mlatin9</samp>&rsquo; as a command-line argument to <code class="code">groff</code>.
+</p></dd>
+</dl>
+
+<p>Some characters from an input encoding may not be available with a
+particular output driver, or their glyphs may not have representation in
+the font used. For terminal devices, fallbacks are defined, like
+&lsquo;<samp class="samp">EUR</samp>&rsquo; for the Euro sign and &lsquo;<samp class="samp">(C)</samp>&rsquo; for the copyright sign. For
+typesetter devices, you may need to &ldquo;mount&rdquo; fonts that support glyphs
+required by the document. See <a class="xref" href="Font-Positions.html">Font Positions</a>.
+</p>
+<a class="index-entry-id" id="index-freeeuro_002epfa"></a>
+<a class="index-entry-id" id="index-ec_002etmac"></a>
+<p>Because a Euro glyph was not historically defined in PostScript fonts,
+<code class="code">groff</code> comes with a font called <samp class="file">freeeuro.pfa</samp> that provides
+the Euro in several styles. Standard PostScript fonts contain the
+glyphs from <span class="w-nolinebreak-text">Latin-5</span><!-- /@w --> and <span class="w-nolinebreak-text">Latin-9</span><!-- /@w --> that <span class="w-nolinebreak-text">Latin-1</span><!-- /@w --> lacks, so these
+encodings are supported for the <samp class="option">ps</samp> and <samp class="option">pdf</samp> output
+devices as <code class="code">groff</code> ships, while <span class="w-nolinebreak-text">Latin-2</span><!-- /@w --> is not.
+</p>
+<p>Unicode supports characters from all other input encodings; the
+<samp class="option">utf8</samp> output driver for terminals therefore does as well. The
+DVI output driver supports the <span class="w-nolinebreak-text">Latin-2</span><!-- /@w --> and <span class="w-nolinebreak-text">Latin-9</span><!-- /@w --> encodings if
+the command-line option <samp class="option">-mec</samp> is used as well. <a class="footnote" id="DOCF31" href="groff.html_fot.html#FOOT31"><sup>31</sup></a>
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Input-Conventions.html">Input Conventions</a>, Previous: <a href="Macro-Packages.html">Macro Packages</a>, Up: <a href="Text.html">Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Input-Line-Traps.html b/doc/groff.html.node/Input-Line-Traps.html
new file mode 100644
index 0000000..f0d7fef
--- /dev/null
+++ b/doc/groff.html.node/Input-Line-Traps.html
@@ -0,0 +1,185 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Input Line Traps (The GNU Troff Manual)</title>
+
+<meta name="description" content="Input Line Traps (The GNU Troff Manual)">
+<meta name="keywords" content="Input Line Traps (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Traps.html" rel="up" title="Traps">
+<link href="Blank-Line-Traps.html" rel="next" title="Blank Line Traps">
+<link href="Diversion-Traps.html" rel="prev" title="Diversion Traps">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Input-Line-Traps">
+<div class="nav-panel">
+<p>
+Next: <a href="Blank-Line-Traps.html" accesskey="n" rel="next">Blank Line Traps</a>, Previous: <a href="Diversion-Traps.html" accesskey="p" rel="prev">Diversion Traps</a>, Up: <a href="Traps.html" accesskey="u" rel="up">Traps</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Input-Line-Traps-1">5.28.2 Input Line Traps</h4>
+<a class="index-entry-id" id="index-input-line-traps"></a>
+<a class="index-entry-id" id="index-traps_002c-input-line"></a>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eit"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.it</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">n</i></span> <span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002eit'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-it"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eitc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.itc</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">n</i></span> <span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002eitc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-itc"></a>
+<a class="index-entry-id" id="index-setting-input-line-trap-_0028it_002c-itc_0029"></a>
+<a class="index-entry-id" id="index-input-line-trap_002c-setting-_0028it_002c-itc_0029"></a>
+<a class="index-entry-id" id="index-trap_002c-input-line_002c-setting-_0028it_002c-itc_0029"></a>
+<a class="index-entry-id" id="index-clearing-input-line-trap-_0028it_002c-itc_0029"></a>
+<a class="index-entry-id" id="index-input-line-trap_002c-clearing-_0028it_002c-itc_0029"></a>
+<a class="index-entry-id" id="index-trap_002c-input-line_002c-clearing-_0028it_002c-itc_0029"></a>
+<p>Set an input line trap, calling macro <var class="var">name</var> after processing the
+next <var class="var">n</var>&nbsp;productive input lines (recall <a class="ref" href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a>). Any existing input line trap in the
+environment is replaced. Without arguments, <code class="code">it</code> and <code class="code">itc</code>
+clear any input line trap that has not yet sprung.
+</p>
+<p>Consider a macro &lsquo;<samp class="samp">.ST <var class="var">s n</var></samp>&rsquo; which sets the next
+<var class="var">n</var>&nbsp;input lines in the font style&nbsp;<var class="var">s</var>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de ST \&quot; Use style $1 for next $2 text lines.
+. it \\$2 ES
+. ft \\$1
+..
+.de ES \&quot; end ST
+. ft R
+..
+.ST I 1
+oblique
+face
+.ST I 1
+oblique\c
+face
+ &rArr; <i class="i">oblique</i> face <i class="i">oblique</i>face &nbsp;<span class="r">(second &ldquo;face&rdquo; upright)</span>
+</pre></div></div>
+
+<a class="index-entry-id" id="index-input-line-traps-and-interrupted-lines-_0028itc_0029"></a>
+<a class="index-entry-id" id="index-interrupted-lines-and-input-line-traps-_0028itc_0029"></a>
+<a class="index-entry-id" id="index-traps_002c-input-line_002c-and-interrupted-lines-_0028itc_0029"></a>
+<a class="index-entry-id" id="index-lines_002c-interrupted_002c-and-input-line-traps-_0028itc_0029"></a>
+<p>Unlike the <code class="code">ce</code> and <code class="code">rj</code> requests, <code class="code">it</code> counts lines
+interrupted with the <code class="code">\c</code> escape sequence separately (see <a class="pxref" href="Line-Continuation.html">Line Continuation</a>); <code class="code">itc</code> does not. To see the difference, let&rsquo;s
+change the previous example to use <code class="code">itc</code> instead.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"><span class="r">&hellip;</span>
+. itc \\$2 ES
+<span class="r">&hellip;</span>
+ &rArr; <i class="i">oblique</i> face <i class="i">obliqueface</i> &nbsp;<span class="r">(second &ldquo;face&rdquo; oblique)</span>
+</pre></div></div>
+
+<p>You can think of the <code class="code">ce</code> and <code class="code">rj</code> requests as implicitly
+creating an input line trap with <code class="code">itc</code> that schedules a break when
+the trap is sprung.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de BR
+. br
+. <i class="slanted">internal: disable centering-without-filling</i>
+..
+.
+.de ce
+. if \\n[.br] .br
+. itc \\$1 BR
+. <i class="slanted">internal: enable centering-without-filling</i>
+..
+</pre></div></div>
+
+<p>Let us consider in more detail the sorts of input lines that are or are
+not &ldquo;productive&rdquo;.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de Trap
+TRAP SPRUNG
+..
+.de Mac
+.if r a \l'5n'
+..
+.it 2 Trap
+.
+foo
+.Mac
+bar
+baz
+.it 1 Trap
+.sp \&quot; moves, but does not write or draw
+qux
+.itc 1 Trap
+\h'5n'\c \&quot; moves, but does not write or draw
+jat
+</pre></div></div>
+
+<p>When &lsquo;<samp class="samp">Trap</samp>&rsquo; gets called depends on whether the &lsquo;<samp class="samp">a</samp>&rsquo; register is
+defined; the control line with the <code class="code">if</code> request may or may not
+produce written output. We also see that the spacing request <code class="code">sp</code>,
+while certainly affecting the output, does not spring the input line
+trap. Similarly, the horizontal motion escape sequence <code class="code">\h</code> also
+affected the output, but was not &ldquo;written&rdquo;. Observe that we had to
+follow it with <code class="code">\c</code> and use <code class="code">itc</code> to prevent the newline at
+the end of the text line from causing a word break, which, like an
+ordinary space character, counts as written output.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">$ groff -Tascii input-trap-example.groff
+ &rArr; foo bar TRAP SPRUNG baz
+ &rArr;
+ &rArr; qux TRAP SPRUNG jat TRAP SPRUNG
+$ groff -Tascii -ra1 input-trap-example.groff
+ &rArr; foo _____ TRAP SPRUNG bar baz
+ &rArr;
+ &rArr; qux TRAP SPRUNG jat TRAP SPRUNG
+</pre></div></div>
+</dd></dl>
+
+<p>Input line traps are associated with the environment
+(see <a class="pxref" href="Environments.html">Environments</a>); switching to another environment suspends the
+current input line trap, and going back resumes it, restoring the count
+of qualifying lines enumerated in that environment.
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Blank-Line-Traps.html">Blank Line Traps</a>, Previous: <a href="Diversion-Traps.html">Diversion Traps</a>, Up: <a href="Traps.html">Traps</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Installation.html b/doc/groff.html.node/Installation.html
new file mode 100644
index 0000000..659fdce
--- /dev/null
+++ b/doc/groff.html.node/Installation.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Installation (The GNU Troff Manual)</title>
+
+<meta name="description" content="Installation (The GNU Troff Manual)">
+<meta name="keywords" content="Installation (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Introduction.html" rel="up" title="Introduction">
+<link href="Conventions-Used-in-This-Manual.html" rel="next" title="Conventions Used in This Manual">
+<link href="Output-Device-Intro.html" rel="prev" title="Output Device Intro">
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Installation">
+<div class="nav-panel">
+<p>
+Next: <a href="Conventions-Used-in-This-Manual.html" accesskey="n" rel="next">Conventions Used in This Manual</a>, Previous: <a href="Output-Device-Intro.html" accesskey="p" rel="prev">Output Devices</a>, Up: <a href="Introduction.html" accesskey="u" rel="up">Introduction</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Installation-1">1.7 Installation</h3>
+<a class="index-entry-id" id="index-installation"></a>
+
+<p>Locate installation instructions in the files <samp class="file">INSTALL</samp>,
+<samp class="file">INSTALL.extra</samp>, and <samp class="file">INSTALL.REPO</samp> in the <code class="code">groff</code> source
+distribution. Being a GNU project, <code class="code">groff</code> supports the familiar
+&lsquo;<samp class="samp">./configure &amp;&amp; make</samp>&rsquo; command sequence.
+</p>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Intermediate-Output-Examples.html b/doc/groff.html.node/Intermediate-Output-Examples.html
new file mode 100644
index 0000000..0947e86
--- /dev/null
+++ b/doc/groff.html.node/Intermediate-Output-Examples.html
@@ -0,0 +1,171 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Intermediate Output Examples (The GNU Troff Manual)</title>
+
+<meta name="description" content="Intermediate Output Examples (The GNU Troff Manual)">
+<meta name="keywords" content="Intermediate Output Examples (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="gtroff-Output.html" rel="up" title="gtroff Output">
+<link href="Output-Language-Compatibility.html" rel="next" title="Output Language Compatibility">
+<link href="Command-Reference.html" rel="prev" title="Command Reference">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Intermediate-Output-Examples">
+<div class="nav-panel">
+<p>
+Next: <a href="Output-Language-Compatibility.html" accesskey="n" rel="next">Output Language Compatibility</a>, Previous: <a href="Command-Reference.html" accesskey="p" rel="prev">Command Reference</a>, Up: <a href="gtroff-Output.html" accesskey="u" rel="up"><code class="code">gtroff</code> Output</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Intermediate-Output-Examples-1">6.1.3 Intermediate Output Examples</h4>
+
+<p>This section presents the intermediate output generated from the same
+input for three different devices. The input is the sentence &lsquo;<samp class="samp">hell
+world</samp>&rsquo; fed into <code class="code">gtroff</code> on the command line.
+</p>
+<dl class="table">
+<dt>High-resolution device <code class="code">ps</code></dt>
+<dd>
+<p>This is the standard output of <code class="code">gtroff</code> if no <samp class="option">-T</samp> option is
+given.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">shell&gt; echo &quot;hell world&quot; | groff -Z -T ps
+
+x T ps
+x res 72000 1 1
+x init
+</pre></div><pre class="example-preformatted">p1
+x font 5 TR
+f5
+s10000
+V12000
+H72000
+thell
+wh2500
+tw
+H96620
+torld
+n12000 0
+</pre><div class="group"><pre class="example-preformatted">x trailer
+V792000
+x stop
+</pre></div></div>
+
+<p>This output can be fed into <code class="code">grops</code> to get its representation as a
+PostScript file.
+</p>
+</dd>
+<dt>Low-resolution device <code class="code">latin1</code></dt>
+<dd>
+<p>This is similar to the high-resolution device except that the
+positioning is done at a minor scale. Some comments (lines starting
+with &lsquo;<samp class="samp">#</samp>&rsquo;) were added for clarification; they were not generated by
+the formatter.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">shell&gt; echo &quot;hell world&quot; | groff -Z -T latin1
+
+# prologue
+x T latin1
+x res 240 24 40
+x init
+</pre></div><pre class="example-preformatted"># begin a new page
+p1
+# font setup
+x font 1 R
+f1
+s10
+# initial positioning on the page
+V40
+H0
+# write text 'hell'
+thell
+# inform about space, and issue a horizontal jump
+wh24
+# write text 'world'
+tworld
+# announce line break, but do nothing because...
+n40 0
+</pre><div class="group"><pre class="example-preformatted"># ...the end of the document has been reached
+x trailer
+V2640
+x stop
+</pre></div></div>
+
+<p>This output can be fed into <code class="code">grotty</code> to get a formatted text
+document.
+</p>
+</dd>
+<dt><abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> output</dt>
+<dd><p>Since a computer monitor has a much lower resolution than modern
+printers, the intermediate output for X11 devices can use the
+jump-and-write command with its 2-digit displacements.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">shell&gt; echo &quot;hell world&quot; | groff -Z -T X100
+
+x T X100
+x res 100 1 1
+x init
+</pre></div><pre class="example-preformatted">p1
+x font 5 TR
+f5
+s10
+V16
+H100
+# write text with jump-and-write commands
+ch07e07l03lw06w11o07r05l03dh7
+n16 0
+</pre><div class="group"><pre class="example-preformatted">x trailer
+V1100
+x stop
+</pre></div></div>
+
+<p>This output can be fed into <code class="code">xditview</code> or <code class="code">gxditview</code> for
+displaying in&nbsp;X.
+</p>
+<p>Due to the obsolete jump-and-write command, the text clusters in the
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> output are almost unreadable.
+</p></dd>
+</dl>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Output-Language-Compatibility.html">Output Language Compatibility</a>, Previous: <a href="Command-Reference.html">Command Reference</a>, Up: <a href="gtroff-Output.html"><code class="code">gtroff</code> Output</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Interpolating-Registers.html b/doc/groff.html.node/Interpolating-Registers.html
new file mode 100644
index 0000000..21d01f8
--- /dev/null
+++ b/doc/groff.html.node/Interpolating-Registers.html
@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Interpolating Registers (The GNU Troff Manual)</title>
+
+<meta name="description" content="Interpolating Registers (The GNU Troff Manual)">
+<meta name="keywords" content="Interpolating Registers (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Registers.html" rel="up" title="Registers">
+<link href="Auto_002dincrement.html" rel="next" title="Auto-increment">
+<link href="Setting-Registers.html" rel="prev" title="Setting Registers">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Interpolating-Registers">
+<div class="nav-panel">
+<p>
+Next: <a href="Auto_002dincrement.html" accesskey="n" rel="next">Auto-increment</a>, Previous: <a href="Setting-Registers.html" accesskey="p" rel="prev">Setting Registers</a>, Up: <a href="Registers.html" accesskey="u" rel="up">Registers</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Interpolating-Registers-1">5.8.2 Interpolating Registers</h4>
+<a class="index-entry-id" id="index-interpolating-registers-_0028_005cn_0029"></a>
+<a class="index-entry-id" id="index-registers_002c-interpolating-_0028_005cn_0029"></a>
+
+<p>Register contents are interpolated with the <code class="code">\n</code> escape sequence.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cni"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\n</code><span class="r"><i class="slanted">i</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cni'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cn"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_0028id"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\n(</code><span class="r"><i class="slanted">id</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cn_0028id'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005bident_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\n[</code><span class="r"><i class="slanted">ident</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cn_005bident_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nested-assignments"></a>
+<a class="index-entry-id" id="index-assignments_002c-nested"></a>
+<a class="index-entry-id" id="index-indirect-assignments"></a>
+<a class="index-entry-id" id="index-assignments_002c-indirect"></a>
+<p>Interpolate register with name <var class="var">ident</var> (one-character
+name&nbsp;<var class="var">i</var>, two-character name <var class="var">id</var>). <code class="code">\n</code> is
+interpreted even in copy mode (see <a class="pxref" href="Copy-Mode.html">Copy Mode</a>). If the register is
+undefined, it is created and assigned a value of&nbsp;&lsquo;<samp class="samp">0</samp>&rsquo;, that
+value is interpolated, and a warning in category &lsquo;<samp class="samp">reg</samp>&rsquo; is emitted.
+See <a class="xref" href="Warnings.html">Warnings</a>, for information about the enablement and suppression of
+warnings.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a 5
+.nr as \na+\na
+\n(as
+ &rArr; 10
+</pre></div></div>
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a1 5
+.nr ab 6
+.ds str b
+.ds num 1
+\n[a\n[num]]
+ &rArr; 5
+\n[a\*[str]]
+ &rArr; 6
+</pre></div></div>
+</dd></dl>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Introduction.html b/doc/groff.html.node/Introduction.html
new file mode 100644
index 0000000..65499fc
--- /dev/null
+++ b/doc/groff.html.node/Introduction.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Introduction (The GNU Troff Manual)</title>
+
+<meta name="description" content="Introduction (The GNU Troff Manual)">
+<meta name="keywords" content="Introduction (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="index.html" rel="up" title="Top">
+<link href="Invoking-groff.html" rel="next" title="Invoking groff">
+<link href="index.html" rel="prev" title="Top">
+
+
+</head>
+
+<body lang="en">
+<div class="chapter-level-extent" id="Introduction">
+<div class="nav-panel">
+<p>
+Next: <a href="Invoking-groff.html" accesskey="n" rel="next">Invoking <code class="code">groff</code></a>, Previous: <a href="index.html" accesskey="p" rel="prev">GNU <code class="code">troff</code></a>, Up: <a href="index.html" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h2 class="chapter" id="Introduction-1">1 Introduction</h2>
+<a class="index-entry-id" id="index-introduction"></a>
+
+<p>GNU <code class="code">roff</code> (or <code class="code">groff</code>) is a programming system for
+typesetting documents. It is highly flexible and has been used
+extensively for over thirty years.
+</p>
+
+
+
+<ul class="mini-toc">
+<li><a href="Background.html" accesskey="1">Background</a></li>
+<li><a href="What-Is-groff_003f.html" accesskey="2">What Is <code class="code">groff</code>?</a></li>
+<li><a href="groff-Capabilities.html" accesskey="3"><code class="code">groff</code> Capabilities</a></li>
+<li><a href="Macro-Package-Intro.html" accesskey="4">Macro Packages</a></li>
+<li><a href="Preprocessor-Intro.html" accesskey="5">Preprocessors</a></li>
+<li><a href="Output-Device-Intro.html" accesskey="6">Output Devices</a></li>
+<li><a href="Installation.html" accesskey="7">Installation</a></li>
+<li><a href="Conventions-Used-in-This-Manual.html" accesskey="8">Conventions Used in This Manual</a></li>
+<li><a href="Credits.html" accesskey="9">Credits</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Invocation-Examples.html b/doc/groff.html.node/Invocation-Examples.html
new file mode 100644
index 0000000..c72781d
--- /dev/null
+++ b/doc/groff.html.node/Invocation-Examples.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Invocation Examples (The GNU Troff Manual)</title>
+
+<meta name="description" content="Invocation Examples (The GNU Troff Manual)">
+<meta name="keywords" content="Invocation Examples (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Invoking-groff.html" rel="up" title="Invoking groff">
+<link href="Paper-Format.html" rel="prev" title="Paper Format">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Invocation-Examples">
+<div class="nav-panel">
+<p>
+Previous: <a href="Paper-Format.html" accesskey="p" rel="prev">Paper Format</a>, Up: <a href="Invoking-groff.html" accesskey="u" rel="up">Invoking <code class="code">groff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Invocation-Examples-1">2.6 Invocation Examples</h3>
+<a class="index-entry-id" id="index-invocation-examples"></a>
+<a class="index-entry-id" id="index-examples-of-invocation"></a>
+
+<p><code class="code">roff</code> systems are best known for formatting man pages. Once a
+<code class="command">man</code> librarian program has located a man page, it may execute
+a <code class="code">groff</code> command much like the following.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">groff -t -man -Tutf8 /usr/share/man/man1/groff.1
+</pre></div></div>
+
+<p>The librarian will also pipe the output through a pager, which might not
+interpret the SGR terminal escape sequences <code class="command">groff</code> emits for
+boldface, underlining, or italics; see the <cite class="cite">grotty<span class="r">(1)</span></cite> man page
+for a discussion.
+</p>
+<p>To process a <code class="code">roff</code> input file using the preprocessors
+<code class="command">gtbl</code> and <code class="command">gpic</code> and the <samp class="file">me</samp> macro package in the
+way to which AT&amp;T <code class="code">troff</code> users were accustomed, one would type (or
+script) a pipeline.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">gpic foo.me | gtbl | gtroff -me -Tutf8 | grotty
+</pre></div></div>
+
+<p>Using <code class="command">groff</code>, this pipe can be shortened to an equivalent
+command.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">groff -p -t -me -T utf8 foo.me
+</pre></div></div>
+
+<p>An even easier way to do this is to use <code class="command">grog</code> to guess the
+preprocessor and macro options and execute the result by using the
+command substitution feature of the shell.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">$(grog -Tutf8 foo.me)
+</pre></div></div>
+
+<p>Each command-line option to a postprocessor must be specified with any
+required leading dashes &lsquo;<samp class="samp">-</samp>&rsquo;
+because <code class="command">groff</code> passes the arguments as-is to the postprocessor;
+this permits arbitrary arguments to be transmitted. For example, to
+pass a title to the <code class="command">gxditview</code> postprocessor,
+the shell commands
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">groff -X -P -title -P 'trial run' mydoc.t
+</pre></div></div>
+
+<p>and
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">groff -X -Z mydoc.t | gxditview -title 'trial run' -
+</pre></div></div>
+
+<p>are equivalent.
+</p>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Previous: <a href="Paper-Format.html">Paper Format</a>, Up: <a href="Invoking-groff.html">Invoking <code class="code">groff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Invoking-Requests.html b/doc/groff.html.node/Invoking-Requests.html
new file mode 100644
index 0000000..1864553
--- /dev/null
+++ b/doc/groff.html.node/Invoking-Requests.html
@@ -0,0 +1,143 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Invoking Requests (The GNU Troff Manual)</title>
+
+<meta name="description" content="Invoking Requests (The GNU Troff Manual)">
+<meta name="keywords" content="Invoking Requests (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Formatter-Instructions.html" rel="up" title="Formatter Instructions">
+<link href="Calling-Macros.html" rel="next" title="Calling Macros">
+<link href="Control-Characters.html" rel="prev" title="Control Characters">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Invoking-Requests">
+<div class="nav-panel">
+<p>
+Next: <a href="Calling-Macros.html" accesskey="n" rel="next">Calling Macros</a>, Previous: <a href="Control-Characters.html" accesskey="p" rel="prev">Control Characters</a>, Up: <a href="Formatter-Instructions.html" accesskey="u" rel="up">Formatter Instructions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Invoking-Requests-1">5.6.2 Invoking Requests</h4>
+<a class="index-entry-id" id="index-invoking-requests"></a>
+<a class="index-entry-id" id="index-requests_002c-invoking"></a>
+
+<p>A control character is optionally followed by tabs and/or spaces and
+then an identifier naming a request or macro. The invocation of an
+unrecognized request is interpreted as a macro call. Defining a macro
+with the same name as a request replaces the request. Deleting a
+request name with the <code class="code">rm</code> request makes it unavailable. The
+<code class="code">als</code> request can alias requests, permitting them to be wrapped or
+non-destructively replaced. See <a class="xref" href="Strings.html">Strings</a>.
+</p>
+<a class="index-entry-id" id="index-request-arguments"></a>
+<a class="index-entry-id" id="index-arguments-to-requests"></a>
+<a class="index-entry-id" id="index-tabs_002c-and-macro-arguments"></a>
+<a class="index-entry-id" id="index-macro-arguments_002c-and-tabs"></a>
+<a class="index-entry-id" id="index-arguments-to-macros_002c-and-tabs"></a>
+<a class="index-entry-id" id="index-tabs_002c-and-request-arguments"></a>
+<a class="index-entry-id" id="index-request-arguments_002c-and-tabs"></a>
+<a class="index-entry-id" id="index-arguments-to-requests_002c-and-tabs"></a>
+<p>There is no inherent limit on argument length or quantity. Most
+requests take one or more arguments, and ignore any they do not expect.
+A request may be separated from its arguments by tabs or spaces, but
+only spaces can separate an argument from its successor. Only one
+between arguments is necessary; any excess is ignored. GNU <code class="code">troff</code>
+does not allow tabs for argument separation.<a class="footnote" id="DOCF43" href="groff.html_fot.html#FOOT43"><sup>43</sup></a>
+</p>
+<p>Generally, a space <em class="emph">within</em> a request argument is not relevant, not
+meaningful, or is supported by bespoke provisions, as with the <code class="code">tl</code>
+request&rsquo;s delimiters (see <a class="pxref" href="Page-Layout.html">Page Layout</a>). Some requests, like
+<code class="code">ds</code>, interpret the remainder of the control line as a single
+argument. See <a class="xref" href="Strings.html">Strings</a>.
+</p>
+<a class="index-entry-id" id="index-structuring-source-code-of-documents-or-macro-packages"></a>
+<a class="index-entry-id" id="index-documents_002c-structuring-the-source-of"></a>
+<a class="index-entry-id" id="index-macro-package_002c-structuring-the-source-of"></a>
+<a class="index-entry-id" id="index-package_002c-package_002c-structuring-the-source-of"></a>
+<a class="index-entry-id" id="index-indentation_002c-of-roff-source-code"></a>
+<p>Spaces and tabs immediately after a control character are ignored.
+Commonly, authors structure the source of documents or macro files with
+them.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de center
+. if \\n[.br] \
+. br
+. ce \\$1
+..
+.
+.
+.de right-align
+.&rarr;if \\n[.br] \
+.&rarr;&rarr;br
+.&rarr;rj \\$1
+..
+</pre></div></div>
+
+<a class="index-entry-id" id="index-blank-line-trap-_0028blm_0029"></a>
+<a class="index-entry-id" id="index-blank-line-macro-_0028blm_0029-1"></a>
+<p>If you assign an empty blank line trap, you can separate macro
+definitions (or any input lines) with blank lines.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de do-nothing
+..
+.blm do-nothing \&quot; activate blank line trap
+
+.de center
+. if \\n[.br] \
+. br
+. ce \\$1
+..
+
+
+.de right-align
+.&rarr;if \\n[.br] \
+.&rarr;&rarr;br
+.&rarr;rj \\$1
+..
+
+.blm \&quot; deactivate blank line trap
+</pre></div></div>
+
+<p>See <a class="xref" href="Blank-Line-Traps.html">Blank Line Traps</a>.
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Calling-Macros.html">Calling Macros</a>, Previous: <a href="Control-Characters.html">Control Characters</a>, Up: <a href="Formatter-Instructions.html">Formatter Instructions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Invoking-groff.html b/doc/groff.html.node/Invoking-groff.html
new file mode 100644
index 0000000..a302025
--- /dev/null
+++ b/doc/groff.html.node/Invoking-groff.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Invoking groff (The GNU Troff Manual)</title>
+
+<meta name="description" content="Invoking groff (The GNU Troff Manual)">
+<meta name="keywords" content="Invoking groff (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="index.html" rel="up" title="Top">
+<link href="Tutorial-for-Macro-Users.html" rel="next" title="Tutorial for Macro Users">
+<link href="Introduction.html" rel="prev" title="Introduction">
+
+
+</head>
+
+<body lang="en">
+<div class="chapter-level-extent" id="Invoking-groff">
+<div class="nav-panel">
+<p>
+Next: <a href="Tutorial-for-Macro-Users.html" accesskey="n" rel="next">Tutorial for Macro Users</a>, Previous: <a href="Introduction.html" accesskey="p" rel="prev">Introduction</a>, Up: <a href="index.html" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h2 class="chapter" id="Invoking-groff-1">2 Invoking <code class="code">groff</code></h2>
+<a class="index-entry-id" id="index-invoking-groff"></a>
+<a class="index-entry-id" id="index-groff-invocation"></a>
+
+<p>This chapter focuses on how to invoke the <code class="code">groff</code> front end. This
+front end takes care of the details of constructing the pipeline among
+the preprocessors, <code class="code">gtroff</code> and the postprocessor.
+</p>
+<p>It has become a tradition that GNU programs get the prefix &lsquo;<samp class="samp">g</samp>&rsquo; to
+distinguish them from their original counterparts provided by the host
+(see <a class="pxref" href="Environment.html">Environment</a>). Thus, for example, <code class="code">geqn</code> is GNU
+<code class="code">eqn</code>. On operating systems like GNU/Linux or the Hurd, which
+don&rsquo;t contain proprietary versions of <code class="code">troff</code>, and on
+MS-DOS/MS-Windows, where <code class="code">troff</code> and associated programs are not
+available at all, this prefix is omitted since GNU <code class="code">troff</code> is the
+only incarnation of <code class="code">troff</code> used. Exception: &lsquo;<samp class="samp">groff</samp>&rsquo; is never
+replaced by &lsquo;<samp class="samp">roff</samp>&rsquo;.
+</p>
+<p>In this document, we consequently say &lsquo;<samp class="samp">gtroff</samp>&rsquo; when talking about
+the GNU <code class="code">troff</code> program. All other implementations of <code class="code">troff</code> are called <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code>, which is the common origin of almost all <code class="code">troff</code>
+implementations<a class="footnote" id="DOCF4" href="groff.html_fot.html#FOOT4"><sup>4</sup></a> (with more or less compatible changes). Similarly, we say
+&lsquo;<samp class="samp">gpic</samp>&rsquo;, &lsquo;<samp class="samp">geqn</samp>&rsquo;, and so on.
+</p>
+
+
+
+<ul class="mini-toc">
+<li><a href="Groff-Options.html" accesskey="1">Options</a></li>
+<li><a href="Environment.html" accesskey="2">Environment</a></li>
+<li><a href="Macro-Directories.html" accesskey="3">Macro Directories</a></li>
+<li><a href="Font-Directories.html" accesskey="4">Font Directories</a></li>
+<li><a href="Paper-Format.html" accesskey="5">Paper Format</a></li>
+<li><a href="Invocation-Examples.html" accesskey="6">Invocation Examples</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Italic-Corrections.html b/doc/groff.html.node/Italic-Corrections.html
new file mode 100644
index 0000000..42620d8
--- /dev/null
+++ b/doc/groff.html.node/Italic-Corrections.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Italic Corrections (The GNU Troff Manual)</title>
+
+<meta name="description" content="Italic Corrections (The GNU Troff Manual)">
+<meta name="keywords" content="Italic Corrections (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Using-Fonts.html" rel="up" title="Using Fonts">
+<link href="Dummy-Characters.html" rel="next" title="Dummy Characters">
+<link href="Ligatures-and-Kerning.html" rel="prev" title="Ligatures and Kerning">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Italic-Corrections">
+<div class="nav-panel">
+<p>
+Next: <a href="Dummy-Characters.html" accesskey="n" rel="next">Dummy Characters</a>, Previous: <a href="Ligatures-and-Kerning.html" accesskey="p" rel="prev">Ligatures and Kerning</a>, Up: <a href="Using-Fonts.html" accesskey="u" rel="up">Using Fonts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Italic-Corrections-1">5.19.9 Italic Corrections</h4>
+
+<p>When typesetting adjacent glyphs from typefaces of different slants, the
+space between them may require adjustment.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002f-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\/</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_002f-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_002f"></a>
+<a class="index-entry-id" id="index-italic-correction-_0028_005c_002f_0029"></a>
+<a class="index-entry-id" id="index-correction_002c-italic-_0028_005c_002f_0029"></a>
+<a class="index-entry-id" id="index-correction-between-oblique-and-upright-glyph-_0028_005c_002f_002c-_005c_002c_0029"></a>
+<a class="index-entry-id" id="index-roman-glyph_002c-correction-after-italic-glyph-_0028_005c_002f_0029"></a>
+<a class="index-entry-id" id="index-upright-glyph_002c-correction-after-oblique-glyph-_0028_005c_002f_0029"></a>
+<p>Apply an <em class="dfn">italic correction</em>: modify the spacing of the preceding
+glyph so that the distance between it and the following glyph is correct
+if the latter is of upright shape. For example, if an
+italic&nbsp;&lsquo;<samp class="samp">f</samp>&rsquo; is followed immediately by a roman right
+parenthesis, then in many fonts the top right portion of
+the&nbsp;&lsquo;<samp class="samp">f</samp>&rsquo; overlaps the top left of the right parenthesis, which
+is ugly. Use this escape sequence whenever an oblique glyph is
+immediately followed by an upright glyph without any intervening space.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002c-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\,</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_002c-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_002c"></a>
+<a class="index-entry-id" id="index-left-italic-correction-_0028_005c_002c_0029"></a>
+<a class="index-entry-id" id="index-correction_002c-left-italic-_0028_005c_002c_0029"></a>
+<a class="index-entry-id" id="index-correction-between-upright-and-oblique-glyph-_0028_005c_002f_002c-_005c_002c_0029"></a>
+<a class="index-entry-id" id="index-roman-glyph_002c-correction-before-italic-glyph-_0028_005c_002c_0029"></a>
+<a class="index-entry-id" id="index-upright-glyph_002c-correction-before-oblique-glyph-_0028_005c_002c_0029"></a>
+<p>Apply a <em class="dfn">left italic correction</em>: modify the spacing of the
+following glyph so that the distance between it and the preceding
+glyph is correct if the latter is of upright shape. For example,
+if a roman left parenthesis is immediately followed by an
+italic&nbsp;&lsquo;<samp class="samp">f</samp>&rsquo;, then in many fonts the bottom left portion of
+the&nbsp;&lsquo;<samp class="samp">f</samp>&rsquo; overlaps the bottom of the left parenthesis, which is
+ugly. Use this escape sequence whenever an upright glyph is followed
+immediately by an oblique glyph without any intervening space.
+</p></dd></dl>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Language-Concepts.html b/doc/groff.html.node/Language-Concepts.html
new file mode 100644
index 0000000..16badc5
--- /dev/null
+++ b/doc/groff.html.node/Language-Concepts.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Language Concepts (The GNU Troff Manual)</title>
+
+<meta name="description" content="Language Concepts (The GNU Troff Manual)">
+<meta name="keywords" content="Language Concepts (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="gtroff-Output.html" rel="up" title="gtroff Output">
+<link href="Command-Reference.html" rel="next" title="Command Reference">
+<link href="gtroff-Output.html" rel="prev" title="gtroff Output">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Language-Concepts">
+<div class="nav-panel">
+<p>
+Next: <a href="Command-Reference.html" accesskey="n" rel="next">Command Reference</a>, Previous: <a href="gtroff-Output.html" accesskey="p" rel="prev"><code class="code">gtroff</code> Output</a>, Up: <a href="gtroff-Output.html" accesskey="u" rel="up"><code class="code">gtroff</code> Output</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Language-Concepts-1">6.1.1 Language Concepts</h4>
+
+<p>The fundamental operation of the GNU <code class="code">troff</code> formatter is the
+translation of the <code class="code">groff</code> input language into a device-independent
+form primarily concerned with what has to be written or drawn at
+specific positions on the output device. This language is simple and
+imperative. In the following discussion, the term <em class="dfn">command</em> always
+refers to this intermediate output language, and never to the
+<code class="code">groff</code> language intended for direct use by document authors.
+Intermediate output commands comprise several categories: glyph output;
+font, color, and text size selection; motion of the printing position;
+page advancement; drawing of geometric objects; and device control
+commands, a catch-all for operations not easily classified as any of the
+foregoing, such as directives to start and stop output, identify the
+intended output device, or place URL hyperlinks in supported output
+formats.
+</p>
+
+<ul class="mini-toc">
+<li><a href="Separation.html" accesskey="1">Separation</a></li>
+<li><a href="Argument-Units.html" accesskey="2">Argument Units</a></li>
+<li><a href="Document-Parts.html" accesskey="3">Document Parts</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Leaders.html b/doc/groff.html.node/Leaders.html
new file mode 100644
index 0000000..1a590e8
--- /dev/null
+++ b/doc/groff.html.node/Leaders.html
@@ -0,0 +1,126 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Leaders (The GNU Troff Manual)</title>
+
+<meta name="description" content="Leaders (The GNU Troff Manual)">
+<meta name="keywords" content="Leaders (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Tabs-and-Fields.html" rel="up" title="Tabs and Fields">
+<link href="Fields.html" rel="next" title="Fields">
+<link href="Tabs-and-Fields.html" rel="prev" title="Tabs and Fields">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Leaders">
+<div class="nav-panel">
+<p>
+Next: <a href="Fields.html" accesskey="n" rel="next">Fields</a>, Previous: <a href="Tabs-and-Fields.html" accesskey="p" rel="prev">Tabs and Fields</a>, Up: <a href="Tabs-and-Fields.html" accesskey="u" rel="up">Tabs and Fields</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Leaders-1">5.12.1 Leaders</h4>
+<a class="index-entry-id" id="index-leaders"></a>
+
+<p>Sometimes it is desirable to fill a tab stop with a given glyph,
+but also use tab stops normally on the same output line. An example is
+a table of contents entry that uses dots to bridge the entry name with
+its page number, which is itself aligned between tab stops. The
+<code class="code">roff</code> language provides <em class="dfn">leaders</em> for this
+purpose.<a class="footnote" id="DOCF67" href="groff.html_fot.html#FOOT67"><sup>67</sup></a>
+</p>
+<a class="index-entry-id" id="index-leader-character-1"></a>
+<p>A leader character (<abbr class="acronym">ISO</abbr> and <abbr class="acronym">EBCDIC</abbr> code
+point&nbsp;1, also known as <abbr class="acronym">SOH</abbr> or &ldquo;start of heading&rdquo;),
+behaves similarly to a tab character: it moves to the next tab stop.
+The difference is that for this movement, the default fill character is
+a period &lsquo;<samp class="samp">.</samp>&rsquo;.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005ca-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\a</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005ca-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005ca"></a>
+<a class="index-entry-id" id="index-leader-character_002c-non_002dinterpreted-_0028_005ca_0029"></a>
+<a class="index-entry-id" id="index-character_002c-leader_002c-non_002dinterpreted-_0028_005ca_0029"></a>
+<a class="index-entry-id" id="index-_005ca_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-_005ca"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-_005ca"></a>
+<p>Interpolate a leader in copy mode; see <a class="ref" href="Copy-Mode.html">Copy Mode</a>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002elc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.lc</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">c</i></span>]</var><a class="copiable-link" href='#index-_002elc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-lc"></a>
+<a class="index-entry-id" id="index-leader-repetition-character-_0028lc_0029"></a>
+<a class="index-entry-id" id="index-character_002c-leader-repetition-_0028lc_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-leader-repetition-_0028lc_0029"></a>
+<p>Set the leader repetition character to the ordinary or special character
+<var class="var">c</var>. Recall <a class="ref" href="Tabs-and-Leaders.html">Tabs and Leaders</a>: when encountering a leader
+character in the input, the formatter writes as many dots &lsquo;<samp class="samp">.</samp>&rsquo; as
+are necessary until
+reaching the next tab stop; this is the <em class="dfn">leader definition
+character</em>. Omitting <var class="var">c</var> unsets the leader
+character. With no argument, GNU <code class="code">troff</code> treats leaders the same
+as tabs. The leader repetition character is associated with the
+environment (see <a class="pxref" href="Environments.html">Environments</a>). Only a single <var class="var">c</var> is
+recognized; any excess is ignored.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-table-of-contents-1"></a>
+<a class="index-entry-id" id="index-contents_002c-table-of-1"></a>
+<p>A table of contents, for example, may define tab stops after a section
+number, a title, and a gap to be filled with leader dots. The page
+number follows the leader, after a right-aligned final tab stop wide
+enough to house the largest page number occurring in the document.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds entry1 19.\tThe Prophet\a\t98
+.ds entry2 20.\tAll Astir\a\t101
+.ta .5i 4.5i +.5iR
+.nf
+\*[entry1]
+\*[entry2]
+ &rArr; 19. The Prophet............................. 98
+ &rArr; 20. All Astir............................... 101
+</pre></div></div>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Fields.html">Fields</a>, Previous: <a href="Tabs-and-Fields.html">Tabs and Fields</a>, Up: <a href="Tabs-and-Fields.html">Tabs and Fields</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Leading-Space-Traps.html b/doc/groff.html.node/Leading-Space-Traps.html
new file mode 100644
index 0000000..b107793
--- /dev/null
+++ b/doc/groff.html.node/Leading-Space-Traps.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Leading Space Traps (The GNU Troff Manual)</title>
+
+<meta name="description" content="Leading Space Traps (The GNU Troff Manual)">
+<meta name="keywords" content="Leading Space Traps (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Traps.html" rel="up" title="Traps">
+<link href="End_002dof_002dinput-Traps.html" rel="next" title="End-of-input Traps">
+<link href="Blank-Line-Traps.html" rel="prev" title="Blank Line Traps">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Leading-Space-Traps">
+<div class="nav-panel">
+<p>
+Next: <a href="End_002dof_002dinput-Traps.html" accesskey="n" rel="next">End-of-input Traps</a>, Previous: <a href="Blank-Line-Traps.html" accesskey="p" rel="prev">Blank Line Traps</a>, Up: <a href="Traps.html" accesskey="u" rel="up">Traps</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Leading-Space-Traps-1">5.28.4 Leading Space Traps</h4>
+<a class="index-entry-id" id="index-leading-space-traps"></a>
+<a class="index-entry-id" id="index-traps_002c-leading-space"></a>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002elsm"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.lsm</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002elsm'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-lsm"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005blsn_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[lsn]</code></strong><a class="copiable-link" href='#index-_005cn_005blsn_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-lsn"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005blss_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[lss]</code></strong><a class="copiable-link" href='#index-_005cn_005blss_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-lss"></a>
+<a class="index-entry-id" id="index-leading-spaces-macro-_0028lsm_0029"></a>
+<p>Set a leading space trap, calling the macro <var class="var">name</var> when GNU
+<code class="code">troff</code> encounters leading spaces in an input line; the implicit
+line break that normally happens in this case is suppressed. If no
+argument is supplied, the default leading space behavior is
+(re-)established (see <a class="pxref" href="Breaking.html">Breaking</a>).
+</p>
+<p>The count of leading spaces on an input line is stored in register
+<code class="code">lsn</code>, and the amount of corresponding horizontal motion in
+register <code class="code">lss</code>, irrespective of whether a leading space trap is
+set. When it is, the leading spaces are removed from the input line,
+and no motion is produced before calling <var class="var">name</var>.
+</p>
+</dd></dl>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Ligatures-and-Kerning.html b/doc/groff.html.node/Ligatures-and-Kerning.html
new file mode 100644
index 0000000..b00ed74
--- /dev/null
+++ b/doc/groff.html.node/Ligatures-and-Kerning.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Ligatures and Kerning (The GNU Troff Manual)</title>
+
+<meta name="description" content="Ligatures and Kerning (The GNU Troff Manual)">
+<meta name="keywords" content="Ligatures and Kerning (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Using-Fonts.html" rel="up" title="Using Fonts">
+<link href="Dummy-Characters.html" rel="next" title="Dummy Characters">
+<link href="Artificial-Fonts.html" rel="prev" title="Artificial Fonts">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Ligatures-and-Kerning">
+<div class="nav-panel">
+<p>
+Next: <a href="Dummy-Characters.html" accesskey="n" rel="next">Dummy Characters</a>, Previous: <a href="Artificial-Fonts.html" accesskey="p" rel="prev">Artificial Fonts</a>, Up: <a href="Using-Fonts.html" accesskey="u" rel="up">Using Fonts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Ligatures-and-Kerning-1">5.19.8 Ligatures and Kerning</h4>
+<a class="index-entry-id" id="index-ligatures-and-kerning"></a>
+<a class="index-entry-id" id="index-kerning-and-ligatures"></a>
+
+<p>Ligatures are groups of characters that are run together, i.e, producing
+a single glyph. For example, the letters &lsquo;f&rsquo; and &lsquo;i&rsquo; can form a
+ligature &lsquo;fi&rsquo; as in the word &lsquo;file&rsquo;. This produces a cleaner look
+(albeit subtle) to the printed output. Usually, ligatures are not
+available in fonts for TTY output devices.
+</p>
+<p>Most PostScript fonts support the fi and fl ligatures. The C/A/T
+typesetter that was the target of <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> also
+supported &lsquo;ff&rsquo;, &lsquo;ffi&rsquo;, and &lsquo;ffl&rsquo; ligatures. Advanced typesetters or
+&lsquo;expert&rsquo; fonts may include ligatures for &lsquo;ft&rsquo; and &lsquo;ct&rsquo;, although GNU
+<code class="code">troff</code> does not support these (yet).
+</p>
+<p>Only the current font is checked for ligatures and kerns; neither
+special fonts nor special charcters defined with the <code class="code">char</code> request
+(and its siblings) are taken into account.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002elg"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.lg</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">flag</i></span>]</var><a class="copiable-link" href='#index-_002elg'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-lg"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002elg_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.lg]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002elg_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002elg-1"></a>
+<a class="index-entry-id" id="index-activating-ligatures-_0028lg_0029"></a>
+<a class="index-entry-id" id="index-ligatures_002c-activating-_0028lg_0029"></a>
+<a class="index-entry-id" id="index-ligatures-enabled-register-_0028_002elg_0029"></a>
+<p>Switch the ligature mechanism on or off; if the parameter is non-zero or
+missing, ligatures are enabled, otherwise disabled. Default is on. The
+current ligature mode can be found in the read-only register <code class="code">.lg</code>
+(set to 1 or&nbsp;2 if ligatures are enabled, 0&nbsp;otherwise).
+</p>
+<p>Setting the ligature mode to&nbsp;2 enables the two-character ligatures
+(fi, fl, and ff) and disables the three-character ligatures (ffi and
+ffl).
+</p></dd></dl>
+
+<p><em class="dfn">Pairwise kerning</em> is another subtle typesetting mechanism that
+modifies the distance between a glyph pair to improve readability. In
+most cases (but not always) the distance is decreased.
+Typewriter-like fonts and fonts for terminals where all glyphs have the
+same width don&rsquo;t use kerning.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ekern"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.kern</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">flag</i></span>]</var><a class="copiable-link" href='#index-_002ekern'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-kern"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ekern_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.kern]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ekern_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ekern-1"></a>
+<a class="index-entry-id" id="index-activating-kerning-_0028kern_0029"></a>
+<a class="index-entry-id" id="index-kerning_002c-activating-_0028kern_0029"></a>
+<a class="index-entry-id" id="index-kerning-enabled-register-_0028_002ekern_0029"></a>
+<p>Switch kerning on or off. If the parameter is non-zero or missing,
+enable pairwise kerning, otherwise disable it. The read-only register
+<code class="code">.kern</code> is set to&nbsp;1 if pairwise kerning is enabled,
+0&nbsp;otherwise.
+</p>
+<a class="index-entry-id" id="index-dummy-character-_0028_005c_0026_0029_002c-effect-on-kerning"></a>
+<a class="index-entry-id" id="index-character_002c-dummy-_0028_005c_0026_0029_002c-effect-on-kerning"></a>
+<p>If the font description file contains pairwise kerning information,
+glyphs from that font are kerned. Kerning between two glyphs can be
+inhibited by placing <code class="code">\&amp;</code> between them: &lsquo;<samp class="samp">V\&amp;A</samp>&rsquo;.
+</p>
+<p>See <a class="xref" href="Font-Description-File-Format.html">Font Description File Format</a>.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-track-kerning"></a>
+<a class="index-entry-id" id="index-kerning_002c-track"></a>
+<p><em class="dfn">Track kerning</em> expands or reduces the space between glyphs. This
+can be handy, for example, if you need to squeeze a long word onto a
+single line or spread some text to fill a narrow column. It must be
+used with great care since it is usually considered bad typography if
+the reader notices the effect.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002etkf"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.tkf</code></strong> <var class="def-var-arguments">f s1 n1 s2 n2</var><a class="copiable-link" href='#index-_002etkf'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-tkf"></a>
+<a class="index-entry-id" id="index-activating-track-kerning-_0028tkf_0029"></a>
+<a class="index-entry-id" id="index-track-kerning_002c-activating-_0028tkf_0029"></a>
+<p>Enable track kerning for font&nbsp;<var class="var">f</var>. If the current font
+is&nbsp;<var class="var">f</var> the width of every glyph is increased by an amount
+between <var class="var">n1</var> and <var class="var">n2</var> (<var class="var">n1</var>, <var class="var">n2</var> can be negative); if
+the current type size is less than or equal to <var class="var">s1</var> the width is
+increased by <var class="var">n1</var>; if it is greater than or equal to <var class="var">s2</var> the
+width is increased by <var class="var">n2</var>; if the type size is greater than or
+equal to <var class="var">s1</var> and less than or equal to <var class="var">s2</var> the increase in
+width is a linear function of the type size.
+</p>
+<p>The default scaling unit is &lsquo;<samp class="samp">z</samp>&rsquo; for <var class="var">s1</var> and <var class="var">s2</var>, &lsquo;<samp class="samp">p</samp>&rsquo;
+for <var class="var">n1</var> and <var class="var">n2</var>.
+</p>
+<p>The track kerning amount is added even to the rightmost glyph in a line;
+for large values it is thus recommended to increase the line length by
+the same amount to compensate.
+</p></dd></dl>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Dummy-Characters.html">Dummy Characters</a>, Previous: <a href="Artificial-Fonts.html">Artificial Fonts</a>, Up: <a href="Using-Fonts.html">Using Fonts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Line-Continuation.html b/doc/groff.html.node/Line-Continuation.html
new file mode 100644
index 0000000..f818cd9
--- /dev/null
+++ b/doc/groff.html.node/Line-Continuation.html
@@ -0,0 +1,166 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Line Continuation (The GNU Troff Manual)</title>
+
+<meta name="description" content="Line Continuation (The GNU Troff Manual)">
+<meta name="keywords" content="Line Continuation (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Page-Layout.html" rel="next" title="Page Layout">
+<link href="Line-Layout.html" rel="prev" title="Line Layout">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+kbd.key {font-style: normal}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+ul.mark-bullet {list-style-type: disc}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Line-Continuation">
+<div class="nav-panel">
+<p>
+Next: <a href="Page-Layout.html" accesskey="n" rel="next">Page Layout</a>, Previous: <a href="Line-Layout.html" accesskey="p" rel="prev">Line Layout</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Line-Continuation-1">5.16 Line Continuation</h3>
+<a class="index-entry-id" id="index-line-control"></a>
+<a class="index-entry-id" id="index-control_002c-line"></a>
+
+<p>When filling is enabled, input and output line breaks generally do not
+correspond. The <code class="code">roff</code> language therefore distinguishes input and
+output line continuation.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cRET-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\<kbd class="key">RET</kbd></code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cRET-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cRET"></a>
+<a class="index-entry-id" id="index-input-line-continuation-_0028_005cRET_0029"></a>
+<a class="index-entry-id" id="index-line_002c-input_002c-continuation-_0028_005cRET_0029"></a>
+<a class="index-entry-id" id="index-continuation_002c-input-line-_0028_005cRET_0029"></a>
+<a class="index-entry-id" id="index-_005cnewline"></a>
+<p><code class="code">\<kbd class="key">RET</kbd></code> (a backslash immediately followed by a newline)
+suppresses the effects of that newline in the input. The next input
+line thus retains the classification of its predecessor as a control or
+text line. <code class="code">\<kbd class="key">RET</kbd></code> is useful for managing line lengths in the
+input during document maintenance; you can break an input line in the
+middle of a request invocation, macro call, or escape sequence. Input
+line continuation is invisible to the formatter, with two exceptions:
+the <code class="code">|</code> operator recognizes the new input line
+(see <a class="pxref" href="Numeric-Expressions.html">Numeric Expressions</a>), and the input line counter register
+<code class="code">.c</code> is incremented.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 50n
+.de I
+. ft I
+. nop \\$*
+. ft
+..
+Our film class watched
+.I The Effect of Gamma Rays on Man-in-the-Moon
+Marigolds. \&quot; whoops, the input line wrapped
+.br
+.I My own opus begins on line \n[.c] \
+and ends on line \n[.c].
+</pre></div></div>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; Our film class watched <i class="i">The Effect of Gamma Rays on</i>
+ &rArr; <i class="i">Man-in-the-Moon</i> Marigolds.
+ &rArr; <i class="i">My own opus begins on line 11 and ends on line 12.</i>
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cc-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\c</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cc-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cc"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eint_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.int]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eint_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eint"></a>
+<a class="index-entry-id" id="index-output-line_002c-continuation-_0028_005cc_0029"></a>
+<a class="index-entry-id" id="index-line_002c-output_002c-continuation-_0028_005cc_0029"></a>
+<a class="index-entry-id" id="index-continuation_002c-output-line-_0028_005cc_0029"></a>
+<a class="index-entry-id" id="index-interrupted-line"></a>
+<a class="index-entry-id" id="index-line_002c-interrupted"></a>
+<a class="index-entry-id" id="index-_005cR_002c-after-_005cc"></a>
+<p><code class="code">\c</code> continues an output line. Nothing after it on the input line
+is formatted. In contrast to <code class="code">\<kbd class="key">RET</kbd></code>, a line after <code class="code">\c</code>
+remains a new input line, so a control character is recognized at its
+beginning. The visual results depend on whether filling is enabled; see
+<a class="ref" href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a>.
+</p>
+<ul class="itemize mark-bullet">
+<li><a class="index-entry-id" id="index-_005cc_002c-when-filling-enabled"></a>
+<a class="index-entry-id" id="index-fill-mode_002c-and-_005cc"></a>
+<a class="index-entry-id" id="index-mode_002c-fill_002c-and-_005cc"></a>
+If filling is enabled, a word interrupted with <code class="code">\c</code> is continued
+with the text on the next input text line, without an intervening space.
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">This is a te\c
+st.
+ &rArr; This is a test.
+</pre></div></div>
+
+</li><li><a class="index-entry-id" id="index-_005cc_002c-when-filling-disabled"></a>
+<a class="index-entry-id" id="index-no_002dfill-mode_002c-and-_005cc"></a>
+<a class="index-entry-id" id="index-mode_002c-no_002dfill_002c-and-_005cc"></a>
+If filling is disabled, the next input text line after <code class="code">\c</code> is
+handled as a continuation of the same input text line.
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nf
+This is a \c
+test.
+ &rArr; This is a test.
+</pre></div></div>
+</li></ul>
+
+<p>An intervening control line that causes a break overrides <code class="code">\c</code>,
+flushing out the pending output line in the usual way.
+</p>
+<a class="index-entry-id" id="index-interrupted-line-register-_0028_002eint_0029"></a>
+<a class="index-entry-id" id="index-continued-output-line-register-_0028_002eint_0029"></a>
+<p>The <code class="code">.int</code> register contains a positive value if the last output
+line was continued with <code class="code">\c</code>; this datum is associated with the
+environment (see <a class="pxref" href="Environments.html">Environments</a>).<a class="footnote" id="DOCF69" href="groff.html_fot.html#FOOT69"><sup>69</sup></a>
+</p></dd></dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Page-Layout.html">Page Layout</a>, Previous: <a href="Line-Layout.html">Line Layout</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Line-Layout.html b/doc/groff.html.node/Line-Layout.html
new file mode 100644
index 0000000..4cfed5f
--- /dev/null
+++ b/doc/groff.html.node/Line-Layout.html
@@ -0,0 +1,267 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Line Layout (The GNU Troff Manual)</title>
+
+<meta name="description" content="Line Layout (The GNU Troff Manual)">
+<meta name="keywords" content="Line Layout (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Line-Continuation.html" rel="next" title="Line Continuation">
+<link href="troff-and-nroff-Modes.html" rel="prev" title="troff and nroff Modes">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Line-Layout">
+<div class="nav-panel">
+<p>
+Next: <a href="Line-Continuation.html" accesskey="n" rel="next">Line Continuation</a>, Previous: <a href="troff-and-nroff-Modes.html" accesskey="p" rel="prev"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Line-Layout-1">5.15 Line Layout</h3>
+<a class="index-entry-id" id="index-line-layout"></a>
+<a class="index-entry-id" id="index-layout_002c-line"></a>
+
+<a class="index-entry-id" id="index-dimensions_002c-line"></a>
+<a class="index-entry-id" id="index-line-dimensions"></a>
+<p>The following drawing shows the dimensions that <code class="code">gtroff</code> uses for
+placing a line of output onto the page. They are labeled with the
+request that manipulates each dimension.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> --&gt;| in |&lt;--
+ |&lt;-----------ll------------&gt;|
+ +----+----+----------------------+----+
+ | : : : |
+ +----+----+----------------------+----+
+--&gt;| po |&lt;--
+ |&lt;--------paper width----------------&gt;|
+</pre></div></div>
+
+<p>These dimensions are:
+</p>
+<dl class="ftable">
+<dt id='index-po'><span><code class="code">po</code><a class="copiable-link" href='#index-po'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-left-margin-_0028po_0029"></a>
+<a class="index-entry-id" id="index-margin_002c-left-_0028po_0029"></a>
+<a class="index-entry-id" id="index-page-offset-_0028po_0029"></a>
+<a class="index-entry-id" id="index-offset_002c-page-_0028po_0029"></a>
+<p><em class="dfn">Page offset</em>&mdash;this is the leftmost position of text on the final
+output, defining the <em class="dfn">left margin</em>.
+</p>
+</dd>
+<dt id='index-in'><span><code class="code">in</code><a class="copiable-link" href='#index-in'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-indentation-_0028in_0029"></a>
+<a class="index-entry-id" id="index-line-indentation-_0028in_0029"></a>
+<p><em class="dfn">Indentation</em>&mdash;this is the distance from the left margin where
+text is printed.
+</p>
+</dd>
+<dt id='index-ll'><span><code class="code">ll</code><a class="copiable-link" href='#index-ll'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-line-length-_0028ll_0029"></a>
+<a class="index-entry-id" id="index-length-of-line-_0028ll_0029"></a>
+<p><em class="dfn">Line length</em>&mdash;this is the distance from the left margin to right
+margin.
+</p></dd>
+</dl>
+
+<a class="index-entry-id" id="index-margin_002c-right"></a>
+<a class="index-entry-id" id="index-right-margin"></a>
+<p>The right margin is not explicitly configured; the combination of page
+offset and line length provides the information necessary to derive it.
+</p>
+<p>A simple demonstration:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 3i
+This is text without indentation.
+The line length has been set to 3\~inches.
+.in +.5i
+.ll -.5i
+Now the left and right margins are both increased.
+.in
+.ll
+Calling .in and .ll without parameters restores
+the previous values.
+</pre></div></div>
+
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; This is text without indenta-
+ &rArr; tion. The line length has
+ &rArr; been set to 3 inches.
+ &rArr; Now the left and
+ &rArr; right margins are
+ &rArr; both increased.
+ &rArr; Calling .in and .ll without
+ &rArr; parameters restores the previ-
+ &rArr; ous values.
+</pre></div></div>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epo"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.po</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">offset</i></span>]</var><a class="copiable-link" href='#index-_002epo'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-po-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002epo-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.po</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">offset</i></span></var><a class="copiable-link" href='#index-_002epo-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002epo-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.po</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">offset</i></span></var><a class="copiable-link" href='#index-_002epo-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eo_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.o]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eo_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eo"></a>
+<a class="index-entry-id" id="index-tty_002etmac-1"></a>
+<p>Set page offset to <var class="var">offset</var> (or increment or decrement its current
+value by <var class="var">offset</var>). If invoked without an argument, the page offset
+is restored to the value before the previous <code class="code">po</code> request.
+This request does not cause a break; the page offset in effect when an
+output line is broken prevails (see <a class="pxref" href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a>). The initial value is 1<span class="dmn">i</span> and the default scaling
+unit is &lsquo;<samp class="samp">m</samp>&rsquo;. On terminal devices, the page offset is set to zero
+by a driver-specific macro file, <samp class="file">tty.tmac</samp>. The current page
+offset can be found in the read-only register &lsquo;<samp class="samp">.o</samp>&rsquo;.
+<a class="index-entry-id" id="index-CSTR-_002354-errata-1"></a>
+<a class="index-entry-id" id="index-CSTR-_002354-erratum_002c-po-request"></a>
+This request is incorrectly documented in the <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code> manual as using a default scaling unit of &lsquo;<samp class="samp">v</samp>&rsquo;.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.po 3i
+\n[.o]
+ &rArr; 720
+.po -1i
+\n[.o]
+ &rArr; 480
+.po
+\n[.o]
+ &rArr; 720
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ein"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.in</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">indent</i></span>]</var><a class="copiable-link" href='#index-_002ein'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-in-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002ein-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.in</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">indent</i></span></var><a class="copiable-link" href='#index-_002ein-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002ein-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.in</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">indent</i></span></var><a class="copiable-link" href='#index-_002ein-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ei_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.i]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ei_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ei"></a>
+<p>Set indentation to <var class="var">indent</var> (or increment or decrement the current
+value by <var class="var">indent</var>). This request causes a break. Initially, there
+is no indentation.
+</p>
+<p>If <code class="code">in</code> is called without an argument, the indentation is reset to
+the previous value before the last call to <code class="code">in</code>. The default
+scaling unit is &lsquo;<samp class="samp">m</samp>&rsquo;.
+</p>
+<p>If a negative indentation value is specified (which is not allowed),
+<code class="code">gtroff</code> emits a warning in category &lsquo;<samp class="samp">range</samp>&rsquo; and sets the
+indentation to zero.
+</p>
+<p>The effect of <code class="code">in</code> is delayed until a partially collected line (if
+it exists) is output. A temporary indentation value is reset to zero
+also.
+</p>
+<p>The current indentation (as set by <code class="code">in</code>) can be found in the
+read-only register &lsquo;<samp class="samp">.i</samp>&rsquo;. The indentation is associated with the
+environment (see <a class="pxref" href="Environments.html">Environments</a>).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eti"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ti</code></strong> <var class="def-var-arguments">offset</var><a class="copiable-link" href='#index-_002eti'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ti"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eti-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ti</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">offset</i></span></var><a class="copiable-link" href='#index-_002eti-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002eti-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ti</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">offset</i></span></var><a class="copiable-link" href='#index-_002eti-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ein_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.in]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ein_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ein-3"></a>
+<p>Temporarily indent the next output line by <var class="var">offset</var>. If an
+increment or decrement value is specified, adjust the temporary
+indentation relative to the value set by the <code class="code">in</code> request.
+</p>
+<p>This request causes a break; its value is associated with the
+environment (see <a class="pxref" href="Environments.html">Environments</a>). The default scaling unit is
+&lsquo;<samp class="samp">m</samp>&rsquo;. A call of <code class="code">ti</code> without an argument is ignored.
+</p>
+<p>If the total indentation value is negative (which is not allowed),
+<code class="code">gtroff</code> emits a warning in category &lsquo;<samp class="samp">range</samp>&rsquo; and sets the
+temporary indentation to zero. &lsquo;Total indentation&rsquo; is either
+<var class="var">offset</var> if specified as an absolute value, or the temporary plus
+normal indentation, if <var class="var">offset</var> is given as a relative value.
+</p>
+<p>The effect of <code class="code">ti</code> is delayed until a partially collected line (if
+it exists) is output.
+</p>
+<p>The read-only register <code class="code">.in</code> is the indentation that applies to the
+current output line.
+</p>
+<p>The difference between <code class="code">.i</code> and <code class="code">.in</code> is that the latter takes
+into account whether a partially collected line still uses the old
+indentation value or a temporary indentation value is active.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ell"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ll</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">length</i></span>]</var><a class="copiable-link" href='#index-_002ell'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ll-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002ell-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ll</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">length</i></span></var><a class="copiable-link" href='#index-_002ell-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002ell-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ll</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">length</i></span></var><a class="copiable-link" href='#index-_002ell-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002el_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.l]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002el_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002el"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ell_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.ll]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ell_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ell-3"></a>
+<p>Set the line length to <var class="var">length</var> (or increment or decrement the
+current value by <var class="var">length</var>). Initially, the line length is set to
+6.5<span class="dmn">i</span>. The effect of <code class="code">ll</code> is delayed until a partially
+collected line (if it exists) is output. The default scaling unit is
+&lsquo;<samp class="samp">m</samp>&rsquo;.
+</p>
+<p>If <code class="code">ll</code> is called without an argument, the line length is reset to
+the previous value before the last call to <code class="code">ll</code>. If a negative
+line length is specified (which is not allowed), <code class="code">gtroff</code> emits a
+warning in category &lsquo;<samp class="samp">range</samp>&rsquo; and sets the line length to zero. The
+line length is associated with the environment (see <a class="pxref" href="Environments.html">Environments</a>).
+</p>
+<a class="index-entry-id" id="index-line-length-register-_0028_002el_0029"></a>
+<p>The current line length (as set by <code class="code">ll</code>) can be found in the
+read-only register &lsquo;<samp class="samp">.l</samp>&rsquo;. The read-only register <code class="code">.ll</code> is the
+line length that applies to the current output line.
+</p>
+<p>Similar to <code class="code">.i</code> and <code class="code">.in</code>, the difference between <code class="code">.l</code>
+and <code class="code">.ll</code> is that the latter takes into account whether a partially
+collected line still uses the old line length value.
+</p></dd></dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Line-Continuation.html">Line Continuation</a>, Previous: <a href="troff-and-nroff-Modes.html"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Lists-in-ms.html b/doc/groff.html.node/Lists-in-ms.html
new file mode 100644
index 0000000..bde2b7c
--- /dev/null
+++ b/doc/groff.html.node/Lists-in-ms.html
@@ -0,0 +1,216 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Lists in ms (The GNU Troff Manual)</title>
+
+<meta name="description" content="Lists in ms (The GNU Troff Manual)">
+<meta name="keywords" content="Lists in ms (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms-Body-Text.html" rel="up" title="ms Body Text">
+<link href="Indented-regions-in-ms.html" rel="next" title="Indented regions in ms">
+<link href="Typeface-and-decoration.html" rel="prev" title="Typeface and decoration">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="Lists-in-ms">
+<div class="nav-panel">
+<p>
+Next: <a href="Indented-regions-in-ms.html" accesskey="n" rel="next">Indented regions</a>, Previous: <a href="Typeface-and-decoration.html" accesskey="p" rel="prev">Typeface and decoration</a>, Up: <a href="ms-Body-Text.html" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Lists">4.6.5.6 Lists</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-lists"></a>
+
+<p>The <var class="var">marker</var> argument to the <code class="code">IP</code> macro can be employed to
+present a variety of lists; for instance, you can use a bullet glyph
+(<code class="code">\[bu]</code>) for unordered lists, a number (or auto-incrementing
+register) for numbered lists, or a word or phrase for glossary-style or
+definition lists. If you set the paragraph indentation register
+<code class="code">PI</code> before calling <code class="code">IP</code>, you can later reorder the items in
+the list without having to ensure that a <var class="var">width</var> argument remains
+affixed to the first call.
+</p>
+<p>The following is an example of a bulleted list.
+<a class="index-entry-id" id="index-example-markup_002c-bulleted-list-_005bms_005d"></a>
+<a class="index-entry-id" id="index-bulleted-list_002c-example-markup-_005bms_005d"></a>
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.nr PI 2n
+A bulleted list:
+.IP \[bu]
+lawyers
+.IP \[bu]
+guns
+.IP \[bu]
+money
+</pre></div>
+</td></tr></table>
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">A bulleted list:
+
+&bull; lawyers
+
+&bull; guns
+
+&bull; money
+</pre></div></div>
+
+<p>The following is an example of a numbered list.
+<a class="index-entry-id" id="index-example-markup_002c-numbered-list-_005bms_005d"></a>
+<a class="index-entry-id" id="index-numbered-list_002c-example-markup-_005bms_005d"></a>
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.nr step 0 1
+.nr PI 3n
+A numbered list:
+.IP \n+[step]
+lawyers
+.IP \n+[step]
+guns
+.IP \n+[step]
+money
+</pre></div>
+</td></tr></table>
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">A numbered list:
+
+1. lawyers
+
+2. guns
+
+3. money
+</pre></div></div>
+
+<p>Here we have employed the <code class="code">nr</code> request to create a register of our
+own, &lsquo;<samp class="samp">step</samp>&rsquo;. We initialized it to zero and assigned it an
+auto-increment of 1. Each time we use the escape sequence
+&lsquo;<samp class="samp">\n+[PI]</samp>&rsquo; (note the plus sign), the formatter applies the increment
+just before interpolating the register&rsquo;s value. Preparing the <code class="code">PI</code>
+register as well enables us to rearrange the list without the tedium of
+updating macro calls.
+</p>
+<p>The next example illustrates a glossary-style list.
+<a class="index-entry-id" id="index-example-markup_002c-glossary_002dstyle-list-_005bms_005d"></a>
+<a class="index-entry-id" id="index-glossary_002dstyle-list_002c-example-markup-_005bms_005d"></a>
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">A glossary-style list:
+.IP lawyers 0.4i
+Two or more attorneys.
+.IP guns
+Firearms,
+preferably large-caliber.
+.IP money
+Gotta pay for those
+lawyers and guns!
+</pre></div>
+</td></tr></table>
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">A glossary-style list:
+
+lawyers
+ Two or more attorneys.
+
+guns Firearms, preferably large-caliber.
+
+money
+ Gotta pay for those lawyers and guns!
+</pre></div></div>
+
+<p>In the previous example, observe how the <code class="code">IP</code> macro places the
+definition on the same line as the term if it has enough space. If this
+is not what you want, there are a few workarounds we will illustrate by
+modifying the example. First, you can use a <code class="code">br</code> request to force
+a break after printing the term or label.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.IP guns
+.br
+Firearms,
+</pre></div>
+</td></tr></table>
+
+<p>Second, you could apply the <code class="code">\p</code> escape sequence to force a break.
+The space following the escape sequence is important; if you omit it,
+<code class="code">groff</code> prints the first word of the paragraph text on the same
+line as the term or label (if it fits) <em class="emph">then</em> breaks the line.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.IP guns
+\p Firearms,
+</pre></div>
+</td></tr></table>
+
+<p>Finally, you may append a horizontal motion to the marker with the
+<code class="code">\h</code> escape sequence; using the same amount as the indentation will
+ensure that the marker is too wide for <code class="code">groff</code> to treat it as
+&ldquo;fitting&rdquo; on the same line as the paragraph text.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.IP guns\h'0.4i'
+Firearms,
+</pre></div>
+</td></tr></table>
+
+<p>In each case, the result is the same.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">A glossary-style list:
+
+lawyers
+ Two or more attorneys.
+
+guns
+ Firearms, preferably large-caliber.
+
+money
+ Gotta pay for those lawyers and guns!
+</pre></div></div>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Indented-regions-in-ms.html">Indented regions</a>, Previous: <a href="Typeface-and-decoration.html">Typeface and decoration</a>, Up: <a href="ms-Body-Text.html">Body Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Macro-Directories.html b/doc/groff.html.node/Macro-Directories.html
new file mode 100644
index 0000000..c1557bd
--- /dev/null
+++ b/doc/groff.html.node/Macro-Directories.html
@@ -0,0 +1,125 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Macro Directories (The GNU Troff Manual)</title>
+
+<meta name="description" content="Macro Directories (The GNU Troff Manual)">
+<meta name="keywords" content="Macro Directories (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Invoking-groff.html" rel="up" title="Invoking groff">
+<link href="Font-Directories.html" rel="next" title="Font Directories">
+<link href="Environment.html" rel="prev" title="Environment">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+ul.mark-bullet {list-style-type: disc}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Macro-Directories">
+<div class="nav-panel">
+<p>
+Next: <a href="Font-Directories.html" accesskey="n" rel="next">Font Directories</a>, Previous: <a href="Environment.html" accesskey="p" rel="prev">Environment</a>, Up: <a href="Invoking-groff.html" accesskey="u" rel="up">Invoking <code class="code">groff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Macro-Directories-1">2.3 Macro Directories</h3>
+<a class="index-entry-id" id="index-macro-directories"></a>
+<a class="index-entry-id" id="index-directories-for-macros"></a>
+<a class="index-entry-id" id="index-searching-macros"></a>
+<a class="index-entry-id" id="index-macros_002c-searching"></a>
+
+<p>A macro file must have a name in the form <code class="code"><var class="var">name</var>.tmac</code> or
+<code class="code">tmac.<var class="var">name</var></code> and be placed in a <em class="dfn">tmac directory</em> to be
+found by the <samp class="option">-m<var class="var">name</var></samp> command-line option.<a class="footnote" id="DOCF5" href="groff.html_fot.html#FOOT5"><sup>5</sup></a>
+<a class="index-entry-id" id="index-tmac_002c-directory"></a>
+<a class="index-entry-id" id="index-directory_002c-for-tmac-files"></a>
+<a class="index-entry-id" id="index-tmac_002c-path"></a>
+<a class="index-entry-id" id="index-path_002c-for-tmac-files"></a>
+<a class="index-entry-id" id="index-locating-macro-files"></a>
+<a class="index-entry-id" id="index-macro-file-search-path"></a>
+<a class="index-entry-id" id="index-file_002c-macro_002c-search-path"></a>
+<a class="index-entry-id" id="index-locating-macro-packages"></a>
+<a class="index-entry-id" id="index-macro-package-search-path"></a>
+<a class="index-entry-id" id="index-package_002c-macro_002c-search-path"></a>
+Together, these directories constitute the <em class="dfn">tmac path</em>. Each
+directory is searched in the following order until the desired macro
+file is found or the list is exhausted.
+</p>
+<ul class="itemize mark-bullet">
+<li>Directories specified with GNU <code class="code">troff</code>&rsquo;s or <code class="code">groff</code>&rsquo;s
+<samp class="option">-M</samp> command-line option.
+
+</li><li><a class="index-entry-id" id="index-GROFF_005fTMAC_005fPATH_002c-environment-variable-1"></a>
+Directories listed in the <code class="env">GROFF_TMAC_PATH</code> environment variable.
+
+</li><li><a class="index-entry-id" id="index-safer-mode-1"></a>
+<a class="index-entry-id" id="index-mode_002c-safer-1"></a>
+<a class="index-entry-id" id="index-unsafe-mode-1"></a>
+<a class="index-entry-id" id="index-mode_002c-unsafe-1"></a>
+<a class="index-entry-id" id="index-current-directory"></a>
+<a class="index-entry-id" id="index-directory_002c-current"></a>
+The current working directory (only if in unsafe mode using the
+<samp class="option">-U</samp> command-line option).
+
+</li><li><a class="index-entry-id" id="index-home-directory"></a>
+<a class="index-entry-id" id="index-directory_002c-home"></a>
+The user&rsquo;s home directory, <code class="env">HOME</code>.
+
+</li><li><a class="index-entry-id" id="index-site_002dlocal-directory"></a>
+<a class="index-entry-id" id="index-directory_002c-site_002dlocal"></a>
+<a class="index-entry-id" id="index-platform_002dspecific-directory"></a>
+<a class="index-entry-id" id="index-directory_002c-platform_002dspecific"></a>
+A platform-dependent directory, a site-local (platform-independent)
+directory, and the main <i class="slanted">tmac</i> directory. The locations
+corresponding to your installation are listed in section &ldquo;Environment&rdquo;
+of <cite class="cite">gtroff<span class="r">(1)</span></cite>. If not otherwise configured, they are as
+follows.
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">/usr/local/lib/groff/site-tmac
+/usr/local/share/groff/site-tmac
+/usr/local/share/groff/1.23.0/tmac
+</pre></div></div>
+
+<p>The foregoing assumes that the version of <code class="code">groff</code> is 1.23.0, and
+that the installation prefix was <samp class="file">/usr/local</samp>. It is possible to
+fine-tune these locations during the source configuration process.
+</p></li></ul>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Font-Directories.html">Font Directories</a>, Previous: <a href="Environment.html">Environment</a>, Up: <a href="Invoking-groff.html">Invoking <code class="code">groff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Macro-Index.html b/doc/groff.html.node/Macro-Index.html
new file mode 100644
index 0000000..c727a85
--- /dev/null
+++ b/doc/groff.html.node/Macro-Index.html
@@ -0,0 +1,335 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Macro Index (The GNU Troff Manual)</title>
+
+<meta name="description" content="Macro Index (The GNU Troff Manual)">
+<meta name="keywords" content="Macro Index (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="index.html" rel="up" title="Top">
+<link href="String-Index.html" rel="next" title="String Index">
+<link href="Register-Index.html" rel="prev" title="Register Index">
+<style type="text/css">
+<!--
+a.summary-letter-printindex {text-decoration: none}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+td.printindex-index-entry {vertical-align: top}
+td.printindex-index-section {vertical-align: top}
+th.entries-header-printindex {text-align:left}
+th.sections-header-printindex {text-align:left}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="appendix-level-extent" id="Macro-Index">
+<div class="nav-panel">
+<p>
+Next: <a href="String-Index.html" accesskey="n" rel="next">String Index</a>, Previous: <a href="Register-Index.html" accesskey="p" rel="prev">Register Index</a>, Up: <a href="index.html" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h2 class="appendix" id="Macro-Index-1">Appendix F Macro Index</h2>
+
+<p>The macro package a specific macro belongs to is appended in brackets.
+They appear without the leading control character (normally &lsquo;<samp class="samp">.</samp>&rsquo;).
+</p>
+<div class="printindex ma-printindex">
+<table class="ma-letters-header-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Macro-Index_ma_symbol-1"><b>1</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_symbol-2"><b>2</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_symbol-3"><b>[</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_symbol-4"><b>]</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-X"><b>X</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="ma-entries-printindex" border="0">
+<tr><td></td><th class="entries-header-printindex">Index Entry</th><td>&nbsp;</td><th class="sections-header-printindex"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_symbol-1">1</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Multiple-Columns.html#index-1C-_005bms_005d"><code>1C <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Multiple-Columns.html">ms Multiple Columns</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_symbol-2">2</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Multiple-Columns.html#index-2C-_005bms_005d"><code>2C <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Multiple-Columns.html">ms Multiple Columns</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_symbol-3">[</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-_005b-_005bms_005d"><code>[ <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_symbol-4">]</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-_005d-_005bms_005d"><code>] <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-A">A</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Description-Macros.html#index-AB-_005bms_005d"><code>AB <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Description-Macros.html">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Description-Macros.html#index-AE-_005bms_005d"><code>AE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Description-Macros.html">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Description-Macros.html#index-AI-_005bms_005d"><code>AI <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Description-Macros.html">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-AM-_005bms_005d"><code>AM <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Description-Macros.html#index-AU-_005bms_005d"><code>AU <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Description-Macros.html">ms Document Description Macros</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-B">B</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Typeface-and-decoration.html#index-B-_005bms_005d"><code>B <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Typeface-and-decoration.html">Typeface and decoration</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-keeps-and-displays.html#index-B1-_005bms_005d"><code>B1 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-keeps-and-displays.html">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-keeps-and-displays.html#index-B2-_005bms_005d"><code>B2 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-keeps-and-displays.html">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-keeps-and-displays.html#index-BD-_005bms_005d"><code>BD <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-keeps-and-displays.html">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Typeface-and-decoration.html#index-BI-_005bms_005d"><code>BI <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Typeface-and-decoration.html">Typeface and decoration</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-BT-_005bman_005d"><code>BT <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Typeface-and-decoration.html#index-BX-_005bms_005d"><code>BX <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Typeface-and-decoration.html">Typeface and decoration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-keeps-and-displays.html#index-CD-_005bms_005d"><code>CD <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-keeps-and-displays.html">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-CT-_005bman_005d"><code>CT <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-CW-_005bman_005d"><code>CW <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Typeface-and-decoration.html#index-CW-_005bms_005d"><code>CW <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Typeface-and-decoration.html">Typeface and decoration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-D">D</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Description-Macros.html#index-DA-_005bms_005d"><code>DA <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Description-Macros.html">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-De-_005bman_005d"><code>De <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-keeps-and-displays.html#index-DE-_005bms_005d"><code>DE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-keeps-and-displays.html">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-Ds-_005bman_005d"><code>Ds <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-keeps-and-displays.html#index-DS-_005bms_005d"><code>DS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-keeps-and-displays.html">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-keeps-and-displays.html#index-DS-_005bms_005d-1"><code>DS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-keeps-and-displays.html">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-keeps-and-displays.html#index-DS-_005bms_005d-2"><code>DS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-keeps-and-displays.html">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-keeps-and-displays.html#index-DS-_005bms_005d-3"><code>DS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-keeps-and-displays.html">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-keeps-and-displays.html#index-DS-_005bms_005d-4"><code>DS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-keeps-and-displays.html">ms keeps and displays</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-E">E</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-EE-_005bman_005d"><code>EE <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Headers-and-Footers.html#index-EF-_005bms_005d"><code>EF <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Headers-and-Footers.html">ms Headers and Footers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Headers-and-Footers.html#index-EH-_005bms_005d"><code>EH <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Headers-and-Footers.html">ms Headers and Footers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-EN-_005bms_005d"><code>EN <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-EQ-_005bms_005d"><code>EQ <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-EX-_005bman_005d"><code>EX <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-F">F</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Footnotes.html#index-FE-_005bms_005d"><code>FE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Footnotes.html">ms Footnotes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Footnotes.html#index-FS-_005bms_005d"><code>FS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Footnotes.html">ms Footnotes</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-G">G</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-G-_005bman_005d"><code>G <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-GL-_005bman_005d"><code>GL <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-H">H</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-HB-_005bman_005d"><code>HB <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-I">I</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Typeface-and-decoration.html#index-I-_005bms_005d"><code>I <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Typeface-and-decoration.html">Typeface and decoration</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-keeps-and-displays.html#index-ID-_005bms_005d"><code>ID <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-keeps-and-displays.html">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Paragraphs-in-ms.html#index-IP-_005bms_005d"><code>IP <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Paragraphs-in-ms.html">Paragraphs in ms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-K">K</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-keeps-and-displays.html#index-KE-_005bms_005d"><code>KE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-keeps-and-displays.html">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-keeps-and-displays.html#index-KF-_005bms_005d"><code>KF <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-keeps-and-displays.html">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-keeps-and-displays.html#index-KS-_005bms_005d"><code>KS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-keeps-and-displays.html">ms keeps and displays</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-L">L</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-keeps-and-displays.html#index-LD-_005bms_005d"><code>LD <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-keeps-and-displays.html">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Typeface-and-decoration.html#index-LG-_005bms_005d"><code>LG <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Typeface-and-decoration.html">Typeface and decoration</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Paragraphs-in-ms.html#index-LP-_005bms_005d"><code>LP <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Paragraphs-in-ms.html">Paragraphs in ms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-M">M</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Multiple-Columns.html#index-MC-_005bms_005d"><code>MC <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Multiple-Columns.html">ms Multiple Columns</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-MS-_005bman_005d"><code>MS <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-N">N</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Description-Macros.html#index-ND-_005bms_005d"><code>ND <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Description-Macros.html">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-NE-_005bman_005d"><code>NE <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Headings-in-ms.html#index-NH-_005bms_005d"><code>NH <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Headings-in-ms.html">Headings in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Typeface-and-decoration.html#index-NL-_005bms_005d"><code>NL <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Typeface-and-decoration.html">Typeface and decoration</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-NT-_005bman_005d"><code>NT <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-O">O</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Headers-and-Footers.html#index-OF-_005bms_005d"><code>OF <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Headers-and-Footers.html">ms Headers and Footers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Headers-and-Footers.html#index-OH-_005bms_005d"><code>OH <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Headers-and-Footers.html">ms Headers and Footers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-P">P</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Headers-and-Footers.html#index-P1-_005bms_005d"><code>P1 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Headers-and-Footers.html">ms Headers and Footers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-PE-_005bms_005d"><code>PE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-PF-_005bms_005d"><code>PF <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-PN-_005bman_005d"><code>PN <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-Pn-_005bman_005d"><code>Pn <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Paragraphs-in-ms.html#index-PP-_005bms_005d"><code>PP <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Paragraphs-in-ms.html">Paragraphs in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-PS-_005bms_005d"><code>PS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-PT-_005bman_005d"><code>PT <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-TOC.html#index-PX-_005bms_005d"><code>PX <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-TOC.html">ms TOC</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-Q">Q</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Paragraphs-in-ms.html#index-QE-_005bms_005d"><code>QE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Paragraphs-in-ms.html">Paragraphs in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Paragraphs-in-ms.html#index-QP-_005bms_005d"><code>QP <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Paragraphs-in-ms.html">Paragraphs in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Paragraphs-in-ms.html#index-QS-_005bms_005d"><code>QS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Paragraphs-in-ms.html">Paragraphs in ms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-R-_005bman_005d"><code>R <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Typeface-and-decoration.html#index-R-_005bms_005d"><code>R <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Typeface-and-decoration.html">Typeface and decoration</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-keeps-and-displays.html#index-RD-_005bms_005d"><code>RD <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-keeps-and-displays.html">ms keeps and displays</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Indented-regions-in-ms.html#index-RE-_005bms_005d"><code>RE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Indented-regions-in-ms.html">Indented regions in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-RN-_005bman_005d"><code>RN <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Description-Macros.html#index-RP-_005bms_005d"><code>RP <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Description-Macros.html">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Indented-regions-in-ms.html#index-RS-_005bms_005d"><code>RS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Indented-regions-in-ms.html">Indented regions in ms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-S">S</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Headings-in-ms.html#index-SH-_005bms_005d"><code>SH <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Headings-in-ms.html">Headings in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Typeface-and-decoration.html#index-SM-_005bms_005d"><code>SM <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Typeface-and-decoration.html">Typeface and decoration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-T">T</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tab-Stops-in-ms.html#index-TA-_005bms_005d"><code>TA <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tab-Stops-in-ms.html">Tab Stops in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-TB-_005bman_005d"><code>TB <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-TOC.html#index-TC-_005bms_005d"><code>TC <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-TOC.html">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-TE-_005bms_005d"><code>TE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Description-Macros.html#index-TL-_005bms_005d"><code>TL <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Description-Macros.html">ms Document Description Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-TS-_005bms_005d"><code>TS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-U">U</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Typeface-and-decoration.html#index-UL-_005bms_005d"><code>UL <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Typeface-and-decoration.html">Typeface and decoration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-V">V</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-VE-_005bman_005d"><code>VE <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-VS-_005bman_005d"><code>VS <span class="r">[</span>man<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-Index_ma_letter-X">X</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-TOC.html#index-XA-_005bms_005d"><code>XA <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-TOC.html">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-TOC.html#index-XE-_005bms_005d"><code>XE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-TOC.html">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-TOC.html#index-XH-_005bms_005d"><code>XH <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-TOC.html">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-TOC.html#index-XH_002dREPLACEMENT-_005bms_005d"><code>XH-REPLACEMENT <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-TOC.html">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-TOC.html#index-XH_002dUPDATE_002dTOC-_005bms_005d"><code>XH-UPDATE-TOC <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-TOC.html">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-TOC.html#index-XN-_005bms_005d"><code>XN <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-TOC.html">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-TOC.html#index-XN_002dINIT-_005bms_005d"><code>XN-INIT <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-TOC.html">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-TOC.html#index-XN_002dREPLACEMENT-_005bms_005d"><code>XN-REPLACEMENT <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-TOC.html">ms TOC</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Paragraphs-in-ms.html#index-XP-_005bms_005d"><code>XP <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Paragraphs-in-ms.html">Paragraphs in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-TOC.html#index-XS-_005bms_005d"><code>XS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-TOC.html">ms TOC</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table class="ma-letters-footer-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Macro-Index_ma_symbol-1"><b>1</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_symbol-2"><b>2</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_symbol-3"><b>[</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_symbol-4"><b>]</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Macro-Index_ma_letter-X"><b>X</b></a>
+ &nbsp;
+</td></tr></table>
+</div>
+
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="String-Index.html">String Index</a>, Previous: <a href="Register-Index.html">Register Index</a>, Up: <a href="index.html">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Macro-Package-Intro.html b/doc/groff.html.node/Macro-Package-Intro.html
new file mode 100644
index 0000000..77f2036
--- /dev/null
+++ b/doc/groff.html.node/Macro-Package-Intro.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Macro Package Intro (The GNU Troff Manual)</title>
+
+<meta name="description" content="Macro Package Intro (The GNU Troff Manual)">
+<meta name="keywords" content="Macro Package Intro (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Introduction.html" rel="up" title="Introduction">
+<link href="Preprocessor-Intro.html" rel="next" title="Preprocessor Intro">
+<link href="groff-Capabilities.html" rel="prev" title="groff Capabilities">
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Macro-Package-Intro">
+<div class="nav-panel">
+<p>
+Next: <a href="Preprocessor-Intro.html" accesskey="n" rel="next">Preprocessors</a>, Previous: <a href="groff-Capabilities.html" accesskey="p" rel="prev"><code class="code">groff</code> Capabilities</a>, Up: <a href="Introduction.html" accesskey="u" rel="up">Introduction</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Macro-Packages-1">1.4 Macro Packages</h3>
+<a class="index-entry-id" id="index-macro-package_002c-introduction"></a>
+<a class="index-entry-id" id="index-package_002c-macro_002c-introduction"></a>
+
+<p>Elemental typesetting functions can be be challenging to use directly
+with complex documents. A <em class="dfn">macro</em> facility specifies how certain
+routine operations, such as starting paragraphs, or printing headers and
+footers, should be performed in terms of those low-level instructions.
+Macros can be specific to one document or collected together into a
+<em class="dfn">macro package</em> for use by many. Several macro packages available;
+the most widely used are provided with <code class="code">groff</code>. They are
+<samp class="file">man</samp>, <samp class="file">mdoc</samp>, <samp class="file">me</samp>, <samp class="file">mm</samp>, <samp class="file">mom</samp>, and
+<samp class="file">ms</samp>.
+</p>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Macro-Packages.html b/doc/groff.html.node/Macro-Packages.html
new file mode 100644
index 0000000..762ea31
--- /dev/null
+++ b/doc/groff.html.node/Macro-Packages.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Macro Packages (The GNU Troff Manual)</title>
+
+<meta name="description" content="Macro Packages (The GNU Troff Manual)">
+<meta name="keywords" content="Macro Packages (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Text.html" rel="up" title="Text">
+<link href="Input-Encodings.html" rel="next" title="Input Encodings">
+<link href="Requests-and-Macros.html" rel="prev" title="Requests and Macros">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Macro-Packages">
+<div class="nav-panel">
+<p>
+Next: <a href="Input-Encodings.html" accesskey="n" rel="next">Input Encodings</a>, Previous: <a href="Requests-and-Macros.html" accesskey="p" rel="prev">Requests and Macros</a>, Up: <a href="Text.html" accesskey="u" rel="up">Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Macro-Packages-3">5.1.8 Macro Packages</h4>
+<a class="index-entry-id" id="index-macro-package"></a>
+<a class="index-entry-id" id="index-package_002c-macro"></a>
+
+<p>Macro definitions can be collected into <em class="dfn">macro files</em>, <code class="code">roff</code>
+input files designed to produce no output themselves but instead ease
+the preparation of other <code class="code">roff</code> documents. There is no syntactical
+difference between a macro file and any other <code class="code">roff</code> document; only
+its purpose distinguishes it. When a macro file is installed at a
+standard location and suitable for use by a general audience, it is
+often termed a <em class="dfn">macro package</em>.<a class="footnote" id="DOCF29" href="groff.html_fot.html#FOOT29"><sup>29</sup></a> Macro packages can be
+loaded by supplying the <samp class="option">-m</samp> option to GNU <code class="command">troff</code> or a
+<code class="code">groff</code> front end. Alternatively, a document requiring a macro
+package can load it with the <code class="code">mso</code> (&ldquo;macro source&rdquo;) request.
+</p>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Major-Macro-Packages.html b/doc/groff.html.node/Major-Macro-Packages.html
new file mode 100644
index 0000000..414994f
--- /dev/null
+++ b/doc/groff.html.node/Major-Macro-Packages.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Major Macro Packages (The GNU Troff Manual)</title>
+
+<meta name="description" content="Major Macro Packages (The GNU Troff Manual)">
+<meta name="keywords" content="Major Macro Packages (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="index.html" rel="up" title="Top">
+<link href="GNU-troff-Reference.html" rel="next" title="GNU troff Reference">
+<link href="Tutorial-for-Macro-Users.html" rel="prev" title="Tutorial for Macro Users">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="chapter-level-extent" id="Major-Macro-Packages">
+<div class="nav-panel">
+<p>
+Next: <a href="GNU-troff-Reference.html" accesskey="n" rel="next">GNU <code class="code">troff</code> Reference</a>, Previous: <a href="Tutorial-for-Macro-Users.html" accesskey="p" rel="prev">Tutorial for Macro Users</a>, Up: <a href="index.html" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h2 class="chapter" id="Macro-Packages-2">4 Macro Packages</h2>
+<a class="index-entry-id" id="index-major-macro-package"></a>
+<a class="index-entry-id" id="index-package_002c-macro_002c-major"></a>
+<a class="index-entry-id" id="index-macro-package_002c-major"></a>
+
+<p>This chapter surveys the &ldquo;major&rdquo; macro packages that come with
+<code class="code">groff</code>. One, <samp class="file">ms</samp>, is presented in detail.
+</p>
+<a class="index-entry-id" id="index-full_002dservice-macro-package"></a>
+<a class="index-entry-id" id="index-package_002c-macro_002c-full_002dservice"></a>
+<a class="index-entry-id" id="index-macro-package_002c-full_002dservice"></a>
+<p>Major macro packages are also sometimes described as <em class="dfn">full-service</em>
+due to the breadth of features they provide and because more than one
+cannot be used by the same document; for example
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">groff -m man foo.man -m ms bar.doc
+</pre></div></div>
+
+<p>doesn&rsquo;t work. Option arguments are processed before non-option
+arguments; the above (failing) sample is thus reordered to
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">groff -m man -m ms foo.man bar.doc
+</pre></div></div>
+
+<a class="index-entry-id" id="index-minor-macro-package"></a>
+<a class="index-entry-id" id="index-package_002c-macro_002c-minor"></a>
+<a class="index-entry-id" id="index-macro-package_002c-minor"></a>
+<a class="index-entry-id" id="index-auxiliary-macro-package"></a>
+<a class="index-entry-id" id="index-package_002c-macro_002c-auxiliary"></a>
+<a class="index-entry-id" id="index-macro-package_002c-auxiliary"></a>
+<p>Many auxiliary, or &ldquo;minor&rdquo;, macro packages are also available. They
+may in general be used with any full-service macro package and handle a
+variety of tasks from character encoding selection, to language
+localization, to inlining of raster images. See the
+<cite class="cite">groff_tmac<span class="r">(5)</span></cite> man page for a list. Type &lsquo;<samp class="samp">man
+groff_tmac</samp>&rsquo; at the command line to view it.
+</p>
+
+
+
+<ul class="mini-toc">
+<li><a href="man.html" accesskey="1"><samp class="file">man</samp></a></li>
+<li><a href="mdoc.html" accesskey="2"><samp class="file">mdoc</samp></a></li>
+<li><a href="me.html" accesskey="3"><samp class="file">me</samp></a></li>
+<li><a href="mm.html" accesskey="4"><samp class="file">mm</samp></a></li>
+<li><a href="mom.html" accesskey="5"><samp class="file">mom</samp></a></li>
+<li><a href="ms.html" accesskey="6"><samp class="file">ms</samp></a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Manipulating-Filling-and-Adjustment.html b/doc/groff.html.node/Manipulating-Filling-and-Adjustment.html
new file mode 100644
index 0000000..632aade
--- /dev/null
+++ b/doc/groff.html.node/Manipulating-Filling-and-Adjustment.html
@@ -0,0 +1,501 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Manipulating Filling and Adjustment (The GNU Troff Manual)</title>
+
+<meta name="description" content="Manipulating Filling and Adjustment (The GNU Troff Manual)">
+<meta name="keywords" content="Manipulating Filling and Adjustment (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Manipulating-Hyphenation.html" rel="next" title="Manipulating Hyphenation">
+<link href="Registers.html" rel="prev" title="Registers">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Manipulating-Filling-and-Adjustment">
+<div class="nav-panel">
+<p>
+Next: <a href="Manipulating-Hyphenation.html" accesskey="n" rel="next">Manipulating Hyphenation</a>, Previous: <a href="Registers.html" accesskey="p" rel="prev">Registers</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Manipulating-Filling-and-Adjustment-1">5.9 Manipulating Filling and Adjustment</h3>
+<a class="index-entry-id" id="index-manipulating-filling-and-adjustment"></a>
+<a class="index-entry-id" id="index-filling-and-adjustment_002c-manipulating"></a>
+<a class="index-entry-id" id="index-adjustment-and-filling_002c-manipulating"></a>
+<a class="index-entry-id" id="index-justifying-text"></a>
+<a class="index-entry-id" id="index-text_002c-justifying"></a>
+
+<a class="index-entry-id" id="index-break-1"></a>
+<a class="index-entry-id" id="index-line-break"></a>
+<a class="index-entry-id" id="index-bp-request_002c-causing-implicit-break"></a>
+<a class="index-entry-id" id="index-ce-request_002c-causing-implicit-break"></a>
+<a class="index-entry-id" id="index-cf-request_002c-causing-implicit-break"></a>
+<a class="index-entry-id" id="index-fi-request_002c-causing-implicit-break"></a>
+<a class="index-entry-id" id="index-fl-request_002c-causing-implicit-break"></a>
+<a class="index-entry-id" id="index-in-request_002c-causing-implicit-break"></a>
+<a class="index-entry-id" id="index-nf-request_002c-causing-implicit-break"></a>
+<a class="index-entry-id" id="index-rj-request_002c-causing-implicit-break"></a>
+<a class="index-entry-id" id="index-sp-request_002c-causing-implicit-break"></a>
+<a class="index-entry-id" id="index-ti-request_002c-causing-implicit-break"></a>
+<a class="index-entry-id" id="index-trf-request_002c-causing-implicit-break"></a>
+<p>When an output line is pending (see below), a break moves the drawing
+position to the beginning of the next text baseline, interrupting
+filling. Various ways of causing breaks were shown in <a class="ref" href="Breaking.html">Breaking</a>.
+The <code class="code">br</code> request likewise causes a break. Several other requests
+imply breaks: <code class="code">bp</code>, <code class="code">ce</code>, <code class="code">cf</code>, <code class="code">fi</code>, <code class="code">fl</code>,
+<code class="code">in</code>, <code class="code">nf</code>, <code class="code">rj</code>, <code class="code">sp</code>, <code class="code">ti</code>, and <code class="code">trf</code>.
+If the no-break control character is used with any of these requests,
+GNU <code class="code">troff</code> suppresses the break; instead the requested operation
+takes effect at the next break. &lsquo;<samp class="samp">'br</samp>&rsquo; does nothing.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 55n
+This line is normally filled and adjusted.
+.br
+A line's alignment is decided
+'ce \&quot; Center the next input line (no break).
+when it is output.
+This line returns to normal filling and adjustment.
+ &rArr; This line is normally filled and adjusted.
+ &rArr; A line's alignment is decided when it is output.
+ &rArr; This line returns to normal filling and adjustment.
+</pre></div></div>
+
+<a class="index-entry-id" id="index-pending-output-line"></a>
+<a class="index-entry-id" id="index-partially-collected-line"></a>
+<a class="index-entry-id" id="index-output-line-properties"></a>
+<a class="index-entry-id" id="index-properties-of-output-lines"></a>
+<p>Output line properties like page offset, indentation, adjustment, and
+even the location of its text baseline, are not determined until the
+line has been broken. An output line is said to be <em class="dfn">pending</em> if
+some input has been collected but an output line corresponding to it has
+not yet been written; such an output line is also termed <em class="dfn">partially
+collected</em>. If no output line is pending, it is as if a break has
+already happened; additional breaks, whether explicit or implicit, have
+no effect. If the vertical drawing position is negative&mdash;as it is when
+the formatter starts up&mdash;a break starts a new page (even if no output
+line is pending) unless an end-of-input macro is being interpreted.
+See <a class="xref" href="End_002dof_002dinput-Traps.html">End-of-input Traps</a>.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ebr"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.br</code></strong><a class="copiable-link" href='#index-_002ebr'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-br"></a>
+<p>Break the line: emit any pending output line without adjustment.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">foo bar
+.br
+baz
+'br
+qux
+ &rArr; foo bar
+ &rArr; baz qux
+</pre></div></div>
+</dd></dl>
+
+<p>Sometimes you want to prevent a break within a phrase or between a
+quantity and its units.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_007e-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\~</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_007e-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_007e"></a>
+<a class="index-entry-id" id="index-unbreakable-space-_0028_005c_007e_0029"></a>
+<a class="index-entry-id" id="index-space_002c-unbreakable-_0028_005c_007e_0029"></a>
+<p>Insert an unbreakable space that is adjustable like an ordinary space.
+It is discarded from the end of an output line if a break is forced.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">Set the output speed to\~1.
+There are 1,024\~bytes in 1\~KiB.
+J.\~F.\~Ossanna wrote the original CSTR\~#54.
+</pre></div></div>
+</dd></dl>
+
+<p>By default, GNU <code class="code">troff</code> fills text and adjusts it to reach the
+output line length. The <code class="code">nf</code> request disables filling; the
+<code class="code">fi</code> request reënables it.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002efi"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.fi</code></strong><a class="copiable-link" href='#index-_002efi'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-fi"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eu_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.u]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eu_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eu"></a>
+<a class="index-entry-id" id="index-filling-of-output_002c-enabling-_0028fi_0029"></a>
+<a class="index-entry-id" id="index-output_002c-filling_002c-enablement-of-_0028fi_0029"></a>
+<a class="index-entry-id" id="index-fill-mode-_0028fi_0029_002c-enabling"></a>
+<a class="index-entry-id" id="index-mode_002c-fill-_0028fi_0029_002c-enabling"></a>
+<p>Enable filling of output lines; a pending output line is broken. The
+read-only register <code class="code">.u</code> is set to&nbsp;1. The filling enablement
+status, sometimes called <em class="dfn">fill mode</em>, is associated with the
+environment (see <a class="pxref" href="Environments.html">Environments</a>). See <a class="xref" href="Line-Continuation.html">Line Continuation</a>, for
+interaction with the <code class="code">\c</code> escape sequence.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enf"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nf</code></strong><a class="copiable-link" href='#index-_002enf'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nf"></a>
+<a class="index-entry-id" id="index-filling-of-output_002c-disabling-_0028nf_0029"></a>
+<a class="index-entry-id" id="index-output_002c-filling_002c-disablement-of-_0028nf_0029"></a>
+<a class="index-entry-id" id="index-no_002dfill-mode"></a>
+<a class="index-entry-id" id="index-mode_002c-no_002dfill"></a>
+<a class="index-entry-id" id="index-fill-mode_002c-disabling"></a>
+<a class="index-entry-id" id="index-mode_002c-fill_002c-disabling"></a>
+<p>Disable filling of output lines: the output line length (see <a class="pxref" href="Line-Layout.html">Line Layout</a>) is ignored and output lines are broken where the input lines
+are. A pending output line is broken and adjustment is suppressed. The
+read-only register <code class="code">.u</code> is set to&nbsp;0. The filling enablement
+status is associated with the environment (see <a class="pxref" href="Environments.html">Environments</a>). See
+<a class="ref" href="Line-Continuation.html">Line Continuation</a>, for interaction with the <code class="code">\c</code> escape
+sequence.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ead"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ad</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">mode</i></span>]</var><a class="copiable-link" href='#index-_002ead'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ad"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ej_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.j]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ej_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ej"></a>
+<p>Enable output line adjustment in <var class="var">mode</var>, taking effect when the
+pending (or next) output line is broken. Adjustment is suppressed when
+filling is. <var class="var">mode</var> can have one of the following values.
+</p>
+<dl class="table">
+<dt><code class="code">b</code></dt>
+<dt><code class="code">n</code></dt>
+<dd><p>Adjust &ldquo;normally&rdquo;: if the output line does not consume the distance
+between the indentation and the configured output line length, GNU
+<code class="code">troff</code> stretches adjustable spaces within the line until that
+length is reached. When the indentation is zero, this mode spreads the
+line to both the left and right margins. This is the GNU <code class="code">troff</code>
+default.
+</p>
+</dd>
+<dt id='index-centered-text-_0028filled_0029'><span><code class="code">c</code><a class="copiable-link" href='#index-centered-text-_0028filled_0029'> &para;</a></span></dt>
+<dd><p>Center filled text. Contrast with the <code class="code">ce</code> request, which centers
+text <em class="emph">without</em> filling it.
+</p>
+</dd>
+<dt id='index-ragged_002dright-text'><span><code class="code">l</code><a class="copiable-link" href='#index-ragged_002dright-text'> &para;</a></span></dt>
+<dd><p>Align text to the left without adjusting it.
+</p>
+</dd>
+<dt id='index-ragged_002dleft-text'><span><code class="code">r</code><a class="copiable-link" href='#index-ragged_002dleft-text'> &para;</a></span></dt>
+<dd><p>Align text to the right without adjusting it.
+</p></dd>
+</dl>
+
+<p><var class="var">mode</var> can also be a value previously stored in the <code class="code">.j</code>
+register. Using <code class="code">ad</code> without an argument is the same as &lsquo;<samp class="samp">.ad
+\n[.j]</samp>&rsquo;; unless filling is disabled, GNU <code class="code">troff</code> resumes adjusting
+lines in the same way it did before adjustment was disabled by
+invocation of the <code class="code">na</code> request.
+</p>
+<a class="index-entry-id" id="index-adjustment-mode-register-_0028_002ej_0029"></a>
+<p>The adjustment mode and enablement status are encoded in the read-only
+register <code class="code">.j</code>. These parameters are associated with the
+environment (see <a class="pxref" href="Environments.html">Environments</a>).
+</p>
+<p>The value of <code class="code">.j</code> for any adjustment mode is an implementation
+detail and should not be relied upon as a programmer&rsquo;s interface. Do
+not write logic to interpret or perform arithmetic on it.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 48n
+.de AD
+. br
+. ad \\$1
+..
+.de NA
+. br
+. na
+..
+left
+.AD r
+.nr ad \n(.j
+right
+.AD c
+center
+.NA
+left
+.AD
+center
+.AD \n(ad
+right
+</pre></div></div>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; left
+ &rArr; right
+ &rArr; center
+ &rArr; left
+ &rArr; center
+ &rArr; right
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ena"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.na</code></strong><a class="copiable-link" href='#index-_002ena'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-na"></a>
+<p>Disable output line adjustment. This produces the same output as
+left-alignment, but the value of the adjustment mode register <code class="code">.j</code>
+is altered differently. The adjustment mode and enablement status are
+associated with the environment (see <a class="pxref" href="Environments.html">Environments</a>).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ebrp"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.brp</code></strong><a class="copiable-link" href='#index-_002ebrp'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-brp"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cp-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\p</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cp-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cp"></a>
+<p>Break, adjusting the line per the current adjustment mode. <code class="code">\p</code>
+schedules a break with adjustment at the next word boundary. The escape
+sequence is itself neither a break nor a space of any kind; it can thus
+be placed in the middle of a word to cause a break at the end of that
+word.
+</p>
+<p>Breaking with immediate adjustment can produce ugly results since GNU
+<code class="code">troff</code> doesn&rsquo;t have a sophisticated paragraph-building algorithm,
+as TeX has, for example. Instead, GNU <code class="code">troff</code> fills and adjusts
+a paragraph line by line.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 4.5i
+This is an uninteresting sentence.
+This is an uninteresting sentence.\p
+This is an uninteresting sentence.
+</pre></div></div>
+
+<p>is formatted as follows.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">This is an uninteresting sentence. This is
+an uninteresting sentence.
+This is an uninteresting sentence.
+</pre></div></div>
+</dd></dl>
+
+<a class="index-entry-id" id="index-productive-input-line"></a>
+<a class="index-entry-id" id="index-input-line_002c-productive"></a>
+<a class="index-entry-id" id="index-line_002c-productive-input"></a>
+<p>To clearly present the next couple of requests, we must introduce the
+concept of &ldquo;productive&rdquo; input lines. A <em class="dfn">productive input line</em> is
+one that directly produces formatted output. Text lines produce
+output,<a class="footnote" id="DOCF53" href="groff.html_fot.html#FOOT53"><sup>53</sup></a> as do control
+lines containing requests like <code class="code">tl</code> or escape sequences like
+<code class="code">\D</code>. Macro calls are not <em class="emph">directly</em> productive, and thus not
+counted, but their interpolated contents can be. Empty requests, and
+requests and escape sequences that define registers or strings or alter
+the formatting environment (as with changes to the size, face, height,
+slant, or color of the type) are not productive. We will also preview
+the output line continuation escape sequence, <code class="code">\c</code>, which
+&ldquo;connects&rdquo; two input lines that would otherwise be counted separately.
+<a class="footnote" id="DOCF54" href="groff.html_fot.html#FOOT54"><sup>54</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de hello
+Hello, world!
+..
+.ce \&quot; center output of next productive input line
+.
+.nr junk-reg 1
+.ft I
+Chorus: \c
+.ft
+.hello
+Went the day well?
+ &rArr; <i class="slanted">Chorus:</i> Hello, world!
+ &rArr; Went the day well?
+</pre></div></div>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ece"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ce</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">n</i></span>]</var><a class="copiable-link" href='#index-_002ece'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ce"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ece_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.ce]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ece_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ece-1"></a>
+<a class="index-entry-id" id="index-centered-text-_0028unfilled_0029"></a>
+<a class="index-entry-id" id="index-centering-lines-_0028ce_0029"></a>
+<a class="index-entry-id" id="index-lines_002c-centering-_0028ce_0029"></a>
+<p>Break (unless the no-break control character is used), center the output
+of the next <var class="var">n</var> productive input lines with respect to the line
+length and indentation without filling, then break again regardless of
+the invoking control character.
+If the argument is not positive, centering is disabled. Omitting the
+argument implies an <var class="var">n</var> of &lsquo;<samp class="samp">1</samp>&rsquo;. The count of lines remaining
+to be centered is stored in the read-only register <code class="code">.ce</code> and is
+associated with the environment (see <a class="pxref" href="Environments.html">Environments</a>).
+</p>
+<a class="index-entry-id" id="index-ce-request_002c-difference-from-_002ead-c"></a>
+<p>While the &lsquo;<samp class="samp">.ad&nbsp;c</samp>&rsquo;<!-- /@w --> request also centers text, it fills the text
+as well.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de FR
+This is a small text fragment that shows the differences
+between the `.ce' and the `.ad c' requests.
+..
+.ll 4i
+.ce 1000
+.FR
+.ce 0
+
+.ad c
+.FR
+ &rArr; This is a small text fragment that shows
+ &rArr; the differences
+ &rArr; between the &lsquo;.ce&rsquo; and the &lsquo;.ad c&rsquo; requests.
+ &rArr;
+ &rArr; This is a small text fragment that shows
+ &rArr; the differences between the &lsquo;.ce&rsquo; and
+ &rArr; the &lsquo;.ad c&rsquo; requests.
+</pre></div></div>
+
+<p>The previous example illustrates a common idiom of turning centering on
+for a quantity of lines far in excess of what is required, and off again
+after the text to be centered. This technique relieves humans of
+counting lines for requests that take a count of input lines as an
+argument.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002erj"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.rj</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">n</i></span>]</var><a class="copiable-link" href='#index-_002erj'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rj"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002erj_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.rj]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002erj_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002erj-1"></a>
+<a class="index-entry-id" id="index-justifying-text-_0028rj_0029"></a>
+<a class="index-entry-id" id="index-text_002c-justifying-_0028rj_0029"></a>
+<a class="index-entry-id" id="index-right_002djustifying-_0028rj_0029"></a>
+<p>Break (unless the no-break control character is used), align the output
+of the next <var class="var">n</var> productive input lines to the right margin without
+filling, then break again regardless of the control character.
+If the argument is not positive, right-alignment is disabled. Omitting
+the argument implies an <var class="var">n</var> of &lsquo;<samp class="samp">1</samp>&rsquo;. The count of lines
+remaining to be right-aligned is stored in the read-only register
+<code class="code">.rj</code> and is associated with the environment
+(see <a class="pxref" href="Environments.html">Environments</a>).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 49n
+.rj 3
+At first I hoped that such a technically unsound
+project would collapse but I soon realized it was
+doomed to success. \[em] C. A. R. Hoare
+ &rArr; At first I hoped that such a technically unsound
+ &rArr; project would collapse but I soon realized it was
+ &rArr; doomed to success. -- C. A. R. Hoare
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ess"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ss</code></strong> <var class="def-var-arguments">word-space-size [<span class="r"><i class="slanted">additional-sentence-space-size</i></span>]</var><a class="copiable-link" href='#index-_002ess'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ss"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ess_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.ss]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ess_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ess-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002esss_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.sss]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002esss_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002esss"></a>
+<a class="index-entry-id" id="index-word-space-size-register-_0028_002ess_0029"></a>
+<a class="index-entry-id" id="index-size-of-word-space-register-_0028_002ess_0029"></a>
+<a class="index-entry-id" id="index-space-between-words-register-_0028_002ess_0029"></a>
+<a class="index-entry-id" id="index-inter_002dsentence-space-size-register-_0028_002esss_0029"></a>
+<a class="index-entry-id" id="index-sentence-space-size-register-_0028_002esss_0029"></a>
+<a class="index-entry-id" id="index-size-of-sentence-space-register-_0028_002esss_0029"></a>
+<a class="index-entry-id" id="index-space-between-sentences-register-_0028_002esss_0029"></a>
+<p>Set the sizes of spaces between words and
+sentences<a class="footnote" id="DOCF55" href="groff.html_fot.html#FOOT55"><sup>55</sup></a> in twelfths
+of font&rsquo;s space width (typically one-fourth to one-third em for Western
+scripts). The default for both parameters is&nbsp;12. Negative values
+are erroneous.
+<a class="index-entry-id" id="index-inter_002dword-spacing_002c-minimal"></a>
+<a class="index-entry-id" id="index-minimal-inter_002dword-spacing"></a>
+<a class="index-entry-id" id="index-space_002c-between-words"></a>
+The first argument is a minimum; if an output line undergoes adjustment,
+such spaces may increase in width.
+<a class="index-entry-id" id="index-inter_002dsentence-space_002c-additional"></a>
+<a class="index-entry-id" id="index-additional-inter_002dsentence-space"></a>
+<a class="index-entry-id" id="index-space_002c-between-sentences"></a>
+The optional second argument sets the amount of additional space
+separating sentences on the same output line. If omitted, this amount
+is set to <var class="var">word-space-size</var>. The request is ignored if there are no
+parameters.
+</p>
+<a class="index-entry-id" id="index-filling_002c-and-inter_002dsentence-space"></a>
+<a class="index-entry-id" id="index-mode_002c-fill_002c-and-inter_002dsentence-space"></a>
+<p>Additional inter-sentence space is used only if the output line is not
+full when the end of a sentence occurs in the input. If a sentence ends
+at the end of an input line, then both an inter-word space and an
+inter-sentence space are added to the output; if two spaces follow the
+end of a sentence in the middle of an input line, then the second space
+becomes an inter-sentence space in the output. Additional
+inter-sentence space is not adjusted, but the inter-word space that
+always precedes it may be. Further input spaces after the second, if
+present, are adjusted as normal.
+</p>
+<p>The read-only registers <code class="code">.ss</code> and <code class="code">.sss</code> hold the minimal
+inter-word space and additional inter-sentence space amounts,
+respectively. These parameters are part of the environment
+(see <a class="pxref" href="Environments.html">Environments</a>), and rounded down to the nearest multiple
+of&nbsp;12 on terminals.
+</p>
+<a class="index-entry-id" id="index-discardable-horizontal-space"></a>
+<a class="index-entry-id" id="index-space_002c-discardable_002c-horizontal"></a>
+<a class="index-entry-id" id="index-horizontal-discardable-space"></a>
+<p>The <code class="code">ss</code> request can insert discardable horizontal space; that is,
+space that is discarded at a break. For example, some footnote styles
+collect the notes into a single paragraph with large gaps between
+each note.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 48n
+1.\~J. Fict. Ch. Soc. 6 (2020), 3\[en]14.
+.ss 12 48 \&quot; applies to next sentence ending
+Reprints no longer available through FCS.
+.ss 12 \&quot; go back to normal
+2.\~Better known for other work.
+ &rArr; 1. J. Fict. Ch. Soc. 6 (2020), 3-14. Reprints
+ &rArr; no longer available through FCS. 2. Better
+ &rArr; known for other work.
+</pre></div></div>
+
+<p>If <em class="emph">undiscardable</em> space is required, use the <code class="code">\h</code> escape
+sequence.
+</p></dd></dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a>, Previous: <a href="Registers.html">Registers</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Manipulating-Hyphenation.html b/doc/groff.html.node/Manipulating-Hyphenation.html
new file mode 100644
index 0000000..6d88ea8
--- /dev/null
+++ b/doc/groff.html.node/Manipulating-Hyphenation.html
@@ -0,0 +1,580 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Manipulating Hyphenation (The GNU Troff Manual)</title>
+
+<meta name="description" content="Manipulating Hyphenation (The GNU Troff Manual)">
+<meta name="keywords" content="Manipulating Hyphenation (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Manipulating-Spacing.html" rel="next" title="Manipulating Spacing">
+<link href="Manipulating-Filling-and-Adjustment.html" rel="prev" title="Manipulating Filling and Adjustment">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+ul.mark-bullet {list-style-type: disc}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Manipulating-Hyphenation">
+<div class="nav-panel">
+<p>
+Next: <a href="Manipulating-Spacing.html" accesskey="n" rel="next">Manipulating Spacing</a>, Previous: <a href="Manipulating-Filling-and-Adjustment.html" accesskey="p" rel="prev">Manipulating Filling and Adjustment</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Manipulating-Hyphenation-1">5.10 Manipulating Hyphenation</h3>
+<a class="index-entry-id" id="index-manipulating-hyphenation"></a>
+<a class="index-entry-id" id="index-hyphenation_002c-manipulating"></a>
+
+<a class="index-entry-id" id="index-hyphenation_002c-automatic"></a>
+<a class="index-entry-id" id="index-automatic-hyphenation"></a>
+<p>When filling, GNU <code class="code">troff</code> hyphenates words as needed at
+user-specified and automatically determined hyphenation points. The
+machine-driven determination of hyphenation points in words requires
+algorithms and data, and is susceptible to conventions and preferences.
+Before tackling such <em class="dfn">automatic hyphenation</em>, let us consider how
+hyphenation points can be set explicitly.
+</p>
+<a class="index-entry-id" id="index-hyphenation_002c-explicit"></a>
+<a class="index-entry-id" id="index-explicit-hyphenation"></a>
+<a class="index-entry-id" id="index-hyphenation_002c-manual"></a>
+<a class="index-entry-id" id="index-manual-hyphenation"></a>
+<p>Explicitly hyphenated words such as &ldquo;mother-in-law&rdquo; are eligible for
+breaking after each of their hyphens. Relatively few words in a
+language offer such obvious break points, however, and automatic
+detection of syllabic (or phonetic) boundaries for hyphenation is not
+perfect,<a class="footnote" id="DOCF56" href="groff.html_fot.html#FOOT56"><sup>56</sup></a> particularly for
+unusual words found in technical literature. We can instruct GNU
+<code class="code">troff</code> how to hyphenate specific words if the need arises.
+</p>
+<a class="index-entry-id" id="index-hyphenation-exceptions"></a>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ehw"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hw</code></strong> <var class="def-var-arguments">word &hellip;</var><a class="copiable-link" href='#index-_002ehw'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hw"></a>
+<p>Define each <em class="dfn">hyphenation exception</em> <var class="var">word</var> with each hyphen &lsquo;-&rsquo;
+in the word indicating a hyphenation point. For example, the request
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.hw in-sa-lub-rious alpha
+</pre></div></div>
+
+<p>marks potential hyphenation points in &ldquo;insalubrious&rdquo;, and prevents
+&ldquo;alpha&rdquo; from being hyphenated at all.
+</p>
+<p>Besides the space character, any character whose hyphenation code is
+zero can be used to separate the arguments of <code class="code">hw</code> (see the
+<code class="code">hcode</code> request below). In addition, this request can be used more
+than once.
+</p>
+<a class="index-entry-id" id="index-hw-request_002c-and-hy-restrictions"></a>
+<p>Hyphenation points specified with <code class="code">hw</code> are not subject to the
+within-word placement restrictions imposed by the <code class="code">hy</code> request (see
+below).
+</p>
+<p>Hyphenation exceptions specified with the <code class="code">hw</code> request are
+associated with the hyphenation language (see the <code class="code">hla</code> request
+below) and environment (see <a class="pxref" href="Environments.html">Environments</a>); invoking the <code class="code">hw</code>
+request in the absence of a hyphenation language is an error.
+</p>
+<p>The request is ignored if there are no parameters.
+</p></dd></dl>
+
+<p>These are known as hyphenation <i class="slanted">exceptions</i> in the expectation
+that most users will avail themselves of automatic hyphenation; these
+exceptions override any rules that would normally apply to a word
+matching a hyphenation exception defined with <code class="code">hw</code>.
+</p>
+<p>Situations also arise when only a specific occurrence of a word needs
+its hyphenation altered or suppressed, or when a URL or similar string
+needs to be breakable in sensible places without hyphenation.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0025-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\%</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0025-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0025"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_003a-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\:</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_003a-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_003a"></a>
+<a class="index-entry-id" id="index-hyphenation-character-_0028_005c_0025_0029"></a>
+<a class="index-entry-id" id="index-character_002c-hyphenation-_0028_005c_0025_0029"></a>
+<a class="index-entry-id" id="index-disabling-hyphenation-_0028_005c_0025_0029"></a>
+<a class="index-entry-id" id="index-hyphenation_002c-disabling-_0028_005c_0025_0029"></a>
+<p>To tell GNU <code class="code">troff</code> how to hyphenate words as they occur in input,
+use the <code class="code">\%</code> escape sequence; it is the default <em class="dfn">hyphenation
+character</em>. Each instance within a word indicates to GNU <code class="code">troff</code>
+that the word may be hyphenated at that point, while prefixing a word
+with this escape sequence prevents it from being otherwise hyphenated.
+This mechanism affects only that occurrence of the word; to change the
+hyphenation of a word for the remainder of input processing, use the
+<code class="code">hw</code> request.
+</p>
+<a class="index-entry-id" id="index-_005cX_002c-followed-by-_005c_0025"></a>
+<a class="index-entry-id" id="index-_005cY_002c-followed-by-_005c_0025"></a>
+<a class="index-entry-id" id="index-_005c_0025_002c-following-_005cX-or-_005cY"></a>
+<p>GNU <code class="code">troff</code> regards the escape sequences <code class="code">\X</code> and <code class="code">\Y</code> as
+starting a word; that is, the <code class="code">\%</code> escape sequence in, say,
+&lsquo;<samp class="samp">\X'...'\%foobar</samp>&rsquo;<!-- /@w --> or &lsquo;<samp class="samp">\Y'...'\%foobar</samp>&rsquo;<!-- /@w --> no longer
+prevents hyphenation of &lsquo;<samp class="samp">foobar</samp>&rsquo; but inserts a hyphenation point
+just prior to it; most likely this isn&rsquo;t what you want.
+See <a class="xref" href="Postprocessor-Access.html">Postprocessor Access</a>.
+</p>
+<a class="index-entry-id" id="index-non_002dprinting-break-point-_0028_005c_003a_0029"></a>
+<a class="index-entry-id" id="index-breaking-without-hyphens-_0028_005c_003a_0029"></a>
+<a class="index-entry-id" id="index-file-names_002c-breaking-_0028_005c_003a_0029"></a>
+<a class="index-entry-id" id="index-breaking-file-names-_0028_005c_003a_0029"></a>
+<a class="index-entry-id" id="index-URLs_002c-breaking-_0028_005c_003a_0029"></a>
+<a class="index-entry-id" id="index-breaking-URLs-_0028_005c_003a_0029"></a>
+<p><code class="code">\:</code> inserts a non-printing break point; that is, a word can break
+there, but the soft hyphen glyph (see below) is not written to the
+output if it does. This escape sequence is an input word boundary, so
+the remainder of the word is subject to hyphenation as normal.
+</p>
+<p>You can combine <code class="code">\:</code> and <code class="code">\%</code> to control breaking of a file
+name or URL, or to permit hyphenation only after certain explicit
+hyphens within a word.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">The \%Lethbridge-Stewart-\:\%Sackville-Baggins divorce
+was, in retrospect, inevitable once the contents of
+\%/var/log/\:\%httpd/\:\%access_log on the family web
+server came to light, revealing visitors from Hogwarts.
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ehc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hc</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">char</i></span>]</var><a class="copiable-link" href='#index-_002ehc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hc"></a>
+<p>Change the hyphenation character to <var class="var">char</var>. This character then
+works as the <code class="code">\%</code> escape sequence normally does, and thus no longer
+appears in the output.<a class="footnote" id="DOCF57" href="groff.html_fot.html#FOOT57"><sup>57</sup></a> Without an
+argument, <code class="code">hc</code> resets the hyphenation character to <code class="code">\%</code> (the
+default). The hyphenation character is associated with the environment
+(see <a class="pxref" href="Environments.html">Environments</a>).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eshc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.shc</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">c</i></span>]</var><a class="copiable-link" href='#index-_002eshc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-shc"></a>
+<a class="index-entry-id" id="index-soft-hyphen-character_002c-setting-_0028shc_0029"></a>
+<a class="index-entry-id" id="index-character_002c-soft-hyphen_002c-setting-_0028shc_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-soft-hyphen-_0028hy_0029"></a>
+<a class="index-entry-id" id="index-soft-hyphen-glyph-_0028hy_0029"></a>
+<a class="index-entry-id" id="index-char-request_002c-and-soft-hyphen-character"></a>
+<a class="index-entry-id" id="index-tr-request_002c-and-soft-hyphen-character"></a>
+<p>Set the <em class="dfn">soft hyphen character</em>, inserted when a word is hyphenated
+automatically or at a hyphenation character, to the ordinary or special
+character&nbsp;<var class="var">c</var>.<a class="footnote" id="DOCF58" href="groff.html_fot.html#FOOT58"><sup>58</sup></a> If the argument is omitted, the soft
+hyphen character is set to the default, <code class="code">\[hy]</code>. If no glyph for
+<var class="var">c</var> exists in the font in use at a potential hyphenation point, then
+the line is not broken there. Neither character definitions (specified
+with the <code class="code">char</code> and similar requests) nor translations (specified
+with the <code class="code">tr</code> request) are applied to <var class="var">c</var>.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-hyphenation-parameters_002c-automatic"></a>
+<a class="index-entry-id" id="index-automatic-hyphenation-parameters"></a>
+<p>Several requests influence automatic hyphenation. Because conventions
+vary, a variety of hyphenation modes is available to the <code class="code">hy</code>
+request; these determine whether hyphenation will apply to a
+word prior to breaking a line at the end of a page (more or less; see
+below for details), and at which positions within that word
+automatically determined hyphenation points are permissible. The places
+within a word that are eligible for hyphenation are determined by
+language-specific data and lettercase relationships. Furthermore,
+hyphenation of a word might be suppressed due to a limit on
+consecutive hyphenated lines (<code class="code">hlm</code>), a minimum line length
+threshold (<code class="code">hym</code>), or because the line can instead be adjusted with
+additional inter-word space (<code class="code">hys</code>).
+</p>
+<a class="index-entry-id" id="index-hyphenation-mode-register-_0028_002ehy_0029"></a>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ehy"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hy</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">mode</i></span>]</var><a class="copiable-link" href='#index-_002ehy'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hy"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ehy_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.hy]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ehy_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ehy-1"></a>
+<p>Set automatic hyphenation mode to <var class="var">mode</var>, an integer encoding
+conditions for hyphenation; if omitted, &lsquo;<samp class="samp">1</samp>&rsquo; is implied. The
+hyphenation mode is available in the read-only register &lsquo;<samp class="samp">.hy</samp>&rsquo;; it
+is associated with the environment (see <a class="pxref" href="Environments.html">Environments</a>). The default
+hyphenation mode depends on the localization file loaded when GNU
+<code class="code">troff</code> starts up; see the <code class="code">hpf</code> request below.
+</p>
+<p>Typesetting practice generally does not avail itself of every
+opportunity for hyphenation, but the details differ by language and site
+mandates. The hyphenation modes of <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> were
+implemented with English-language publishing practices of the 1970s in
+mind, not a scrupulous enumeration of conceivable parameters. GNU
+<code class="code">troff</code> extends those modes such that finer-grained control is
+possible, favoring compatibility with older implementations over a more
+intuitive arrangement. The means of hyphenation mode control is a set
+of numbers that can be added up to encode the behavior
+sought.<a class="footnote" id="DOCF59" href="groff.html_fot.html#FOOT59"><sup>59</sup></a> The entries in the
+following table are termed <em class="dfn">values</em>; the sum of the desired
+values is the <em class="dfn">mode</em>.
+</p>
+<dl class="table">
+<dt><code class="code">0</code></dt>
+<dd><p>disables hyphenation.
+</p>
+</dd>
+<dt><code class="code">1</code></dt>
+<dd><p>enables hyphenation except after the first and before the last character
+of a word.
+</p></dd>
+</dl>
+
+<p>The remaining values &ldquo;imply&rdquo; 1; that is, they enable hyphenation
+under the same conditions as &lsquo;<samp class="samp">.hy 1</samp>&rsquo;, and then apply or lift
+restrictions relative to that basis.
+</p>
+<dl class="table">
+<dt><code class="code">2</code></dt>
+<dd><p>disables hyphenation of the last word on a page,<a class="footnote" id="DOCF60" href="groff.html_fot.html#FOOT60"><sup>60</sup></a> even for explicitly hyphenated words.
+</p>
+</dd>
+<dt><code class="code">4</code></dt>
+<dd><p>disables hyphenation before the last two characters of a word.
+</p>
+</dd>
+<dt><code class="code">8</code></dt>
+<dd><p>disables hyphenation after the first two characters of a word.
+</p>
+</dd>
+<dt><code class="code">16</code></dt>
+<dd><p>enables hyphenation before the last character of a word.
+</p>
+</dd>
+<dt><code class="code">32</code></dt>
+<dd><p>enables hyphenation after the first character of a word.
+</p></dd>
+</dl>
+
+<p>Apart from value&nbsp;2, restrictions imposed by the hyphenation mode
+are <em class="emph">not</em> respected for words whose hyphenations have been
+specified with the hyphenation character (&lsquo;<samp class="samp">\%</samp>&rsquo; by default) or the
+<code class="code">hw</code> request.
+</p>
+<p>Nonzero values in the previous table are additive. For example,
+mode&nbsp;12 causes GNU <code class="code">troff</code> to hyphenate neither the last two
+nor the first two characters of a word. Some values cannot be used
+together because they contradict; for instance, values 4 and&nbsp;16,
+and values 8 and&nbsp;32. As noted, it is superfluous to add 1 to any
+non-zero even mode.
+</p>
+<a class="index-entry-id" id="index-hyphenation-pattern-files"></a>
+<a class="index-entry-id" id="index-pattern-files_002c-for-hyphenation"></a>
+<p>The automatic placement of hyphens in words is determined by
+<em class="dfn">pattern files</em>, which are derived from TeX and available for
+several languages. The number of characters at the beginning of a word
+after which the first hyphenation point should be inserted is determined
+by the patterns themselves; it can&rsquo;t be reduced further without
+introducing additional, invalid hyphenation points (unfortunately, this
+information is not part of a pattern file&mdash;you have to know it in
+advance). The same is true for the number of characters at the end of
+a word before the last hyphenation point should be inserted. For
+example, you can supply the following input to &lsquo;<samp class="samp">echo $(nroff)</samp>&rsquo;.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 1
+.hy 48
+splitting
+</pre></div></div>
+
+<p>You will get
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">s- plit- t- in- g
+</pre></div></div>
+
+<p>instead of the correct &lsquo;split- ting&rsquo;. English patterns as distributed
+with GNU <code class="code">troff</code> need two characters at the beginning and three
+characters at the end; this means that value&nbsp;4 of <code class="code">hy</code> is
+mandatory. Value&nbsp;8 is possible as an additional restriction, but
+values&nbsp;16 and&nbsp;32 should be avoided, as should mode&nbsp;1.
+Modes&nbsp;4 and&nbsp;6 are typical.
+</p>
+<p>A table of left and right minimum character counts for hyphenation as
+needed by the patterns distributed with GNU <code class="code">troff</code> follows; see
+the <cite class="cite">groff_tmac<span class="r">(5)</span></cite> man page for more information on GNU
+<code class="code">troff</code>&rsquo;s language macro files.
+</p>
+<table class="multitable">
+<thead><tr><th>language</th><th>pattern name</th><th>left min</th><th>right min</th></tr></thead>
+<tbody><tr><td>Czech</td><td>cs</td><td>2</td><td>2</td></tr>
+<tr><td>English</td><td>en</td><td>2</td><td>3</td></tr>
+<tr><td>French</td><td>fr</td><td>2</td><td>3</td></tr>
+<tr><td>German traditional</td><td>det</td><td>2</td><td>2</td></tr>
+<tr><td>German reformed</td><td>den</td><td>2</td><td>2</td></tr>
+<tr><td>Italian</td><td>it</td><td>2</td><td>2</td></tr>
+<tr><td>Swedish</td><td>sv</td><td>1</td><td>2</td></tr>
+</tbody>
+</table>
+
+<p>Hyphenation exceptions within pattern files (i.e., the words within a
+TeX <code class="code">\hyphenation</code> group) obey the hyphenation restrictions
+given by <code class="code">hy</code>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enh"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nh</code></strong><a class="copiable-link" href='#index-_002enh'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nh"></a>
+<p>Disable automatic hyphenation; i.e., set the hyphenation mode to&nbsp;0
+(see above). The hyphenation mode of the last call to <code class="code">hy</code> is not
+remembered.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ehpf"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hpf</code></strong> <var class="def-var-arguments">pattern-file</var><a class="copiable-link" href='#index-_002ehpf'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hpf"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002ehpfa"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hpfa</code></strong> <var class="def-var-arguments">pattern-file</var><a class="copiable-link" href='#index-_002ehpfa'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hpfa"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002ehpfcode"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hpfcode</code></strong> <var class="def-var-arguments">a b [c d] &hellip;</var><a class="copiable-link" href='#index-_002ehpfcode'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hpfcode"></a>
+<a class="index-entry-id" id="index-hyphenation-patterns-_0028hpf_0029"></a>
+<a class="index-entry-id" id="index-patterns-for-hyphenation-_0028hpf_0029"></a>
+<p>Read hyphenation patterns from <var class="var">pattern-file</var>, which is sought
+in the same way that macro files are with the <code class="code">mso</code> request or the
+<samp class="option">-m<var class="var">name</var></samp> command-line option to <code class="code">groff</code>. The
+<var class="var">pattern-file</var> should have the same format as (simple) TeX
+pattern files. More specifically, the following scanning rules are
+implemented.
+</p>
+<ul class="itemize mark-bullet">
+<li>A percent sign starts a comment (up to the end of the line) even if
+preceded by a backslash.
+
+</li><li>&ldquo;Digraphs&rdquo; like <code class="code">\$</code> are not supported.
+
+</li><li><code class="code">^^<var class="var">xx</var></code> (where each <var class="var">x</var> is 0&ndash;9 or a&ndash;f) and
+<code class="code">^^<var class="var">c</var></code> (character <var class="var">c</var> in the code point range 0&ndash;127
+decimal) are recognized; other uses of <code class="code">^</code> cause an error.
+
+</li><li>No macro expansion is performed.
+
+</li><li><code class="code">hpf</code> checks for the expression <code class="code">\patterns{&hellip;}</code>
+(possibly with whitespace before or after the braces). Everything
+between the braces is taken as hyphenation patterns. Consequently,
+<code class="code">{</code> and <code class="code">}</code> are not allowed in patterns.
+
+</li><li>Similarly, <code class="code">\hyphenation{&hellip;}</code> gives a list of hyphenation
+exceptions.
+
+</li><li><code class="code">\endinput</code> is recognized also.
+
+</li><li>For backward compatibility, if <code class="code">\patterns</code> is missing, the whole
+file is treated as a list of hyphenation patterns (except that the
+<code class="code">%</code> character is recognized as the start of a comment).
+</li></ul>
+
+<p>The <code class="code">hpfa</code> request appends a file of patterns to the current list.
+</p>
+<p>The <code class="code">hpfcode</code> request defines mapping values for character codes in
+pattern files. It is an older mechanism no longer used by GNU
+<code class="code">troff</code>&rsquo;s own macro files; for its successor, see <code class="code">hcode</code>
+below. <code class="code">hpf</code> or <code class="code">hpfa</code> apply the mapping after reading the
+patterns but before replacing or appending to the active list of
+patterns. Its arguments are pairs of character codes&mdash;integers from 0
+to&nbsp;255. The request maps character code&nbsp;<var class="var">a</var> to
+code&nbsp;<var class="var">b</var>, code&nbsp;<var class="var">c</var> to code&nbsp;<var class="var">d</var>, and so on.
+Character codes that would otherwise be invalid in GNU <code class="code">troff</code> can
+be used. By default, every code maps to itself except those for letters
+&lsquo;A&rsquo; to &lsquo;Z&rsquo;, which map to those for &lsquo;a&rsquo; to &lsquo;z&rsquo;.
+</p>
+<a class="index-entry-id" id="index-localization"></a>
+<a class="index-entry-id" id="index-troffrc-2"></a>
+<a class="index-entry-id" id="index-cs_002etmac"></a>
+<a class="index-entry-id" id="index-de_002etmac"></a>
+<a class="index-entry-id" id="index-en_002etmac"></a>
+<a class="index-entry-id" id="index-fr_002etmac"></a>
+<a class="index-entry-id" id="index-it_002etmac"></a>
+<a class="index-entry-id" id="index-ja_002etmac"></a>
+<a class="index-entry-id" id="index-sv_002etmac"></a>
+<a class="index-entry-id" id="index-zh_002etmac"></a>
+<p>The set of hyphenation patterns is associated with the language set by
+the <code class="code">hla</code> request (see below). The <code class="code">hpf</code> request is usually
+invoked by a localization file loaded by the <samp class="file">troffrc</samp>
+file.<a class="footnote" id="DOCF61" href="groff.html_fot.html#FOOT61"><sup>61</sup></a>
+</p>
+<p>A second call to <code class="code">hpf</code> (for the same language) replaces the
+hyphenation patterns with the new ones. Invoking <code class="code">hpf</code> or
+<code class="code">hpfa</code> causes an error if there is no hyphenation language. If no
+<code class="code">hpf</code> request is specified (either in the document, in a file
+loaded at startup, or in a macro package), GNU <code class="code">troff</code> won&rsquo;t
+automatically hyphenate at all.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ehcode"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hcode</code></strong> <var class="def-var-arguments">c1 code1 [c2 code2] &hellip;</var><a class="copiable-link" href='#index-_002ehcode'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hcode"></a>
+<a class="index-entry-id" id="index-hyphenation-code-_0028hcode_0029"></a>
+<a class="index-entry-id" id="index-code_002c-hyphenation-_0028hcode_0029"></a>
+<p>Set the hyphenation code of character <var class="var">c1</var> to <var class="var">code1</var>, that of
+<var class="var">c2</var> to <var class="var">code2</var>, and so on. A hyphenation code must be an
+ordinary character (not a special character escape sequence) other than
+a digit or a space. The request is ignored if given no arguments.
+</p>
+<p>For hyphenation to work, hyphenation codes must be set up. At
+startup, GNU <code class="code">troff</code> assigns hyphenation codes to the letters
+&lsquo;<samp class="samp">a</samp>&rsquo;&ndash;&lsquo;<samp class="samp">z</samp>&rsquo; (mapped to themselves), to the letters
+&lsquo;<samp class="samp">A</samp>&rsquo;&ndash;&lsquo;<samp class="samp">Z</samp>&rsquo; (mapped to &lsquo;<samp class="samp">a</samp>&rsquo;&ndash;&lsquo;<samp class="samp">z</samp>&rsquo;), and zero to all other
+characters. Normally, hyphenation patterns contain only lowercase
+letters which should be applied regardless of case. In other words,
+they assume that the words &lsquo;FOO&rsquo; and &lsquo;Foo&rsquo; should be hyphenated exactly
+as &lsquo;foo&rsquo; is. The <code class="code">hcode</code> request extends this principle to letters
+outside the Unicode basic Latin alphabet; without it, words containing
+such letters won&rsquo;t be hyphenated properly even if the corresponding
+hyphenation patterns contain them.
+</p>
+<p>For example, the following <code class="code">hcode</code> requests are necessary to assign
+hyphenation codes to the letters &lsquo;<samp class="samp">ÄäÖöÜüß</samp>&rsquo;, needed for German.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.hcode ä ä Ä ä
+.hcode ö ö Ö ö
+.hcode ü ü Ü ü
+.hcode ß ß
+</pre></div></div>
+
+<p>Without these assignments, GNU <code class="code">troff</code> treats the German word
+&lsquo;Kindergärten&rsquo;<!-- /@w --> (the plural form of &lsquo;kindergarten&rsquo;) as two words
+&lsquo;kinderg&rsquo;<!-- /@w --> and &lsquo;rten&rsquo;<!-- /@w --> because the hyphenation code of the
+umlaut&nbsp;a is zero by default, just like a space. There is a German
+hyphenation pattern that covers &lsquo;kinder&rsquo;<!-- /@w -->, so GNU <code class="code">troff</code> finds
+the hyphenation &lsquo;kin-der&rsquo;. The other two hyphenation points
+(&lsquo;kin-der-gär-ten&rsquo;) are missed.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ehla"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hla</code></strong> <var class="def-var-arguments">lang</var><a class="copiable-link" href='#index-_002ehla'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hla"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ehla_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.hla]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ehla_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ehla-1"></a>
+<a class="index-entry-id" id="index-hpf-request_002c-and-hyphenation-language"></a>
+<a class="index-entry-id" id="index-hw-request_002c-and-hyphenation-language"></a>
+<a class="index-entry-id" id="index-troffrc-3"></a>
+<a class="index-entry-id" id="index-troffrc_002dend-1"></a>
+<p>Set the hyphenation language to <var class="var">lang</var>. Hyphenation exceptions
+specified with the <code class="code">hw</code> request and hyphenation patterns and
+exceptions specified with the <code class="code">hpf</code> and <code class="code">hpfa</code> requests are
+associated with the hyphenation language. The <code class="code">hla</code> request is
+usually invoked by a localization file, which is turn loaded by the
+<samp class="file">troffrc</samp> or <samp class="file">troffrc-end</samp> file; see the <code class="code">hpf</code> request
+above.
+</p>
+<a class="index-entry-id" id="index-hyphenation-language-register-_0028_002ehla_0029"></a>
+<p>The hyphenation language is available in the read-only string-valued
+register &lsquo;<samp class="samp">.hla</samp>&rsquo;; it is associated with the environment
+(see <a class="pxref" href="Environments.html">Environments</a>).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ehlm"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hlm</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">n</i></span>]</var><a class="copiable-link" href='#index-_002ehlm'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hlm"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ehlm_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.hlm]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ehlm_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ehlm-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ehlc_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.hlc]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ehlc_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ehlc"></a>
+<a class="index-entry-id" id="index-explicit-hyphen-_0028_005c_0025_0029"></a>
+<a class="index-entry-id" id="index-hyphen_002c-explicit-_0028_005c_0025_0029"></a>
+<a class="index-entry-id" id="index-consecutive-hyphenated-lines-_0028hlm_0029"></a>
+<a class="index-entry-id" id="index-lines_002c-consecutive-hyphenated-_0028hlm_0029"></a>
+<a class="index-entry-id" id="index-hyphenated-lines_002c-consecutive-_0028hlm_0029"></a>
+<p>Set the maximum quantity of consecutive hyphenated lines to <var class="var">n</var>. If
+<var class="var">n</var> is negative, there is no maximum. If omitted, <var class="var">n</var>
+is&nbsp;&minus;1. This value is associated with the environment
+(see <a class="pxref" href="Environments.html">Environments</a>). Only lines output from a given environment
+count toward the maximum associated with that environment. Hyphens
+resulting from <code class="code">\%</code> are counted; explicit hyphens are not.
+</p>
+<a class="index-entry-id" id="index-hyphenation-consecutive-line-limit-register-_0028_002ehlm_0029"></a>
+<a class="index-entry-id" id="index-hyphenation-consecutive-line-count-register-_0028_002ehlc_0029"></a>
+<p>The <code class="code">.hlm</code> read-only register stores this maximum. The count of
+immediately preceding consecutive hyphenated lines is available in the
+read-only register <code class="code">.hlc</code>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ehym"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hym</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">length</i></span>]</var><a class="copiable-link" href='#index-_002ehym'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hym"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ehym_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.hym]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ehym_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ehym-1"></a>
+<a class="index-entry-id" id="index-hyphenation-margin-_0028hym_0029"></a>
+<a class="index-entry-id" id="index-margin-for-hyphenation-_0028hym_0029"></a>
+<a class="index-entry-id" id="index-ad-request_002c-and-hyphenation-margin"></a>
+<p>Set the (right) hyphenation margin to <var class="var">length</var>. If the adjustment
+mode is not &lsquo;<samp class="samp">b</samp>&rsquo; or &lsquo;<samp class="samp">n</samp>&rsquo;, the line is not hyphenated if it is
+shorter than <var class="var">length</var>. Without an argument, the hyphenation margin
+is reset to its default value, 0. The default scaling unit is &lsquo;<samp class="samp">m</samp>&rsquo;.
+The hyphenation margin is associated with the environment
+(see <a class="pxref" href="Environments.html">Environments</a>).
+</p>
+<p>A negative argument resets the hyphenation margin to zero, emitting a
+warning in category &lsquo;<samp class="samp">range</samp>&rsquo;.
+</p>
+<a class="index-entry-id" id="index-hyphenation-margin-register-_0028_002ehym_0029"></a>
+<p>The hyphenation margin is available in the <code class="code">.hym</code> read-only
+register.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ehys"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.hys</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">hyphenation-space</i></span>]</var><a class="copiable-link" href='#index-_002ehys'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hys"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ehys_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.hys]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ehys_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ehys-1"></a>
+<a class="index-entry-id" id="index-hyphenation-space-_0028hys_0029"></a>
+<a class="index-entry-id" id="index-hyphenation-space-adjustment-threshold"></a>
+<a class="index-entry-id" id="index-ad-request_002c-and-hyphenation-space"></a>
+<p>Suppress hyphenation of the line in adjustment modes &lsquo;<samp class="samp">b</samp>&rsquo; or
+&lsquo;<samp class="samp">n</samp>&rsquo; if it can be justified by adding no more than
+<var class="var">hyphenation-space</var> extra space to each inter-word space. Without
+an argument, the hyphenation space adjustment threshold is set to its
+default value, 0. The default scaling unit is &lsquo;<samp class="samp">m</samp>&rsquo;. The
+hyphenation space adjustment threshold is associated with the
+environment (see <a class="pxref" href="Environments.html">Environments</a>).
+</p>
+<p>A negative argument resets the hyphenation space adjustment threshold to
+zero, emitting a warning in category &lsquo;<samp class="samp">range</samp>&rsquo;.
+</p>
+<a class="index-entry-id" id="index-hyphenation-space-adjustment-threshold-register-_0028_002ehys_0029"></a>
+<p>The hyphenation space adjustment threshold is available in the
+<code class="code">.hys</code> read-only register.
+</p></dd></dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Manipulating-Spacing.html">Manipulating Spacing</a>, Previous: <a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Manipulating-Spacing.html b/doc/groff.html.node/Manipulating-Spacing.html
new file mode 100644
index 0000000..6b45b8a
--- /dev/null
+++ b/doc/groff.html.node/Manipulating-Spacing.html
@@ -0,0 +1,220 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Manipulating Spacing (The GNU Troff Manual)</title>
+
+<meta name="description" content="Manipulating Spacing (The GNU Troff Manual)">
+<meta name="keywords" content="Manipulating Spacing (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Tabs-and-Fields.html" rel="next" title="Tabs and Fields">
+<link href="Manipulating-Hyphenation.html" rel="prev" title="Manipulating Hyphenation">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Manipulating-Spacing">
+<div class="nav-panel">
+<p>
+Next: <a href="Tabs-and-Fields.html" accesskey="n" rel="next">Tabs and Fields</a>, Previous: <a href="Manipulating-Hyphenation.html" accesskey="p" rel="prev">Manipulating Hyphenation</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Manipulating-Spacing-1">5.11 Manipulating Spacing</h3>
+<a class="index-entry-id" id="index-manipulating-spacing"></a>
+<a class="index-entry-id" id="index-spacing_002c-manipulating"></a>
+
+<p>A break causes the formatter to update the vertical drawing position at
+which the new text baseline is aligned. You can alter this location.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002esp"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.sp</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">distance</i></span>]</var><a class="copiable-link" href='#index-_002esp'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-sp"></a>
+<p>Break and move the next text baseline down by <var class="var">distance</var>, or until
+springing a page location trap.<a class="footnote" id="DOCF62" href="groff.html_fot.html#FOOT62"><sup>62</sup></a>
+If invoked with the no-break control character, <code class="code">sp</code> moves the
+pending output line&rsquo;s text baseline by <var class="var">distance</var>. A negative
+<var class="var">distance</var> will not reduce the position of the text baseline below
+zero. Inside a diversion, any <var class="var">distance</var> argument is ignored. The
+default scaling unit is &lsquo;<samp class="samp">v</samp>&rsquo;. If <var class="var">distance</var> is not specified,
+&lsquo;<samp class="samp">1v</samp>&rsquo; is assumed.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.pl 5v \&quot; Set page length to 5 vees.
+.de xx
+\-\-\-
+. br
+..
+.wh 0 xx \&quot; Set a trap at the top of the page.
+foo on page \n%
+.sp 2v
+bar on page \n%
+.sp 50v \&quot; This will cause a page break.
+baz on page \n%
+.pl \n(nlu \&quot; Truncate page to current position.
+ &rArr; ---
+ &rArr; foo on page 1
+ &rArr;
+ &rArr;
+ &rArr; bar on page 1
+ &rArr; ---
+ &rArr; baz on page 2
+</pre></div></div>
+
+<p>You might use the following macros to set the baseline of the next
+output text at a given distance from the top or the bottom of the page.
+We subtract one line height (<code class="code">\n[.v]</code>) because the <code class="code">|</code>
+operator moves to one vee below the page top (recall <a class="ref" href="Numeric-Expressions.html">Numeric Expressions</a>).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de y-from-top-down
+. sp |\\$1-\\n[.v]u
+..
+.
+.de y-from-bot-up
+. sp |\\n[.p]u-\\$1-\\n[.v]u
+..
+</pre></div></div>
+
+<p>A call to &lsquo;<samp class="samp">.y-from-bot-up 10c</samp>&rsquo; means that the next text baseline
+will be 10&nbsp;cm from the bottom edge of the paper.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002els"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ls</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">count</i></span>]</var><a class="copiable-link" href='#index-_002els'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ls"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eL_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.L]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eL_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eL"></a>
+<a class="index-entry-id" id="index-double_002dspacing-_0028ls_0029"></a>
+<p>Set the line spacing; add <var class="var">count</var>&minus;1<!-- /@w --> blank lines after each
+line of text. With no argument, GNU <code class="code">troff</code> uses the previous
+value before the last <code class="code">ls</code> call. The default is <code class="code">1</code>.
+</p>
+
+<a class="index-entry-id" id="index-line-spacing-register-_0028_002eL_0029"></a>
+<p>The read-only register <code class="code">.L</code> contains the current line spacing; it
+is associated with the environment (see <a class="pxref" href="Environments.html">Environments</a>).
+</p></dd></dl>
+
+<p>The <code class="code">ls</code> request is a coarse mechanism. See <a class="xref" href="Changing-the-Type-Size.html">Changing the Type Size</a>, for the requests <code class="code">vs</code> and <code class="code">pvs</code> as alternatives to
+<code class="code">ls</code>.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cx_0027spacing_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\x<code class="code">'</code></code><span class="r"><i class="slanted">spacing</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cx_0027spacing_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cx"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ea_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.a]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ea_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ea"></a>
+<p>Sometimes, an output line requires additional vertical spacing, for
+instance to allow room for a tall construct like an inline equation with
+exponents or subscripts (particularly if they are iterated). The
+<code class="code">\x</code> escape sequence takes a delimited measurement (like
+&lsquo;<samp class="samp">\x'3p'</samp>&rsquo;) to increase the vertical spacing of the pending output
+line. The default scaling unit is &lsquo;<samp class="samp">v</samp>&rsquo;. If the measurement is
+positive, extra vertical space is inserted below the current line; a
+negative measurement adds space above. If <code class="code">\x</code> is applied to the
+pending output line multiple times, the maxima of the positive and
+negative adjustments are separately applied. The delimiter need not be
+a neutral apostrophe; see <a class="ref" href="Delimiters.html">Delimiters</a>.
+</p>
+<a class="index-entry-id" id="index-extra-post_002dvertical-line-space-register-_0028_002ea_0029"></a>
+<p>The <code class="code">.a</code> read-only register contains the extra vertical spacing
+<em class="emph">after</em> the text baseline of the most recently emitted output line.
+(In other words, it is the largest positive argument to <code class="code">\x</code>
+encountered on that line.) This quantity is exposed via a register
+because if an output line requires this &ldquo;extra post-vertical line
+spacing&rdquo;, and the subsequent output line requires &ldquo;extra pre-vertical
+line spacing&rdquo; (a negative argument to <code class="code">\x</code>), then applying both
+can lead to excessive spacing between the output lines. Text that is
+piling high on line <var class="var">n</var> might not require (as much) extra
+pre-vertical line spacing if line <var class="var">n</var>&minus;1 carries extra
+post-vertical line spacing.
+</p>
+<p>Use of <code class="code">\x</code> can be necessary in combination with the
+bracket-building escape sequence <code class="code">\b</code>,<a class="footnote" id="DOCF63" href="groff.html_fot.html#FOOT63"><sup>63</sup></a> as the following example shows.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nf
+This is a test of \[rs]b (1).
+This is a test of \[rs]b (2).
+This is a test of \b'xyz'\x'-1m'\x'1m' (3).
+This is a test of \[rs]b (4).
+This is a test of \[rs]b (5).
+ &rArr; This is a test of \b (1).
+ &rArr; This is a test of \b (2).
+ &rArr; x
+ &rArr; This is a test of y (3).
+ &rArr; z
+ &rArr; This is a test of \b (4).
+ &rArr; This is a test of \b (5).
+</pre></div></div>
+</dd></dl>
+
+<p>Without <code class="code">\x</code>, the backslashes on the lines marked &lsquo;<samp class="samp">(2)</samp>&rsquo; and
+&lsquo;<samp class="samp">(4)</samp>&rsquo; would be overprinted.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ens"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ns</code></strong><a class="copiable-link" href='#index-_002ens'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ns"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002ers"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.rs</code></strong><a class="copiable-link" href='#index-_002ers'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rs"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ens_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.ns]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ens_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ens-1"></a>
+<a class="index-entry-id" id="index-sp-request_002c-and-no_002dspace-mode"></a>
+<a class="index-entry-id" id="index-no_002dspace-mode-_0028ns_0029"></a>
+<a class="index-entry-id" id="index-mode_002c-no_002dspace-_0028ns_0029"></a>
+<a class="index-entry-id" id="index-blank-lines_002c-disabling"></a>
+<a class="index-entry-id" id="index-lines_002c-blank_002c-disabling"></a>
+<p>Enable <em class="dfn">no-space mode</em>. Vertical spacing, whether by <code class="code">sp</code>
+requests or blank input lines, is disabled. The <code class="code">bp</code> request to
+advance to the next page is also disabled, unless it is accompanied by a
+page number (see <a class="pxref" href="Page-Control.html">Page Control</a>). No-space mode ends automatically
+when text<a class="footnote" id="DOCF64" href="groff.html_fot.html#FOOT64"><sup>64</sup></a> is formatted for output <a class="footnote" id="DOCF65" href="groff.html_fot.html#FOOT65"><sup>65</sup></a> or the <code class="code">rs</code> request is invoked, which ends
+no-space mode. The read-only register <code class="code">.ns</code> interpolates a Boolean
+value indicating the enablement of no-space mode.
+</p>
+<p>A paragraphing macro might ordinarily insert vertical space to separate
+paragraphs. A section heading macro could invoke <code class="code">ns</code> to suppress
+this spacing for the first paragraph in a section.
+</p></dd></dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Tabs-and-Fields.html">Tabs and Fields</a>, Previous: <a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Manipulating-Type-Size-and-Vertical-Spacing.html b/doc/groff.html.node/Manipulating-Type-Size-and-Vertical-Spacing.html
new file mode 100644
index 0000000..e566ad7
--- /dev/null
+++ b/doc/groff.html.node/Manipulating-Type-Size-and-Vertical-Spacing.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Manipulating Type Size and Vertical Spacing (The GNU Troff Manual)</title>
+
+<meta name="description" content="Manipulating Type Size and Vertical Spacing (The GNU Troff Manual)">
+<meta name="keywords" content="Manipulating Type Size and Vertical Spacing (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Colors.html" rel="next" title="Colors">
+<link href="Using-Fonts.html" rel="prev" title="Using Fonts">
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Manipulating-Type-Size-and-Vertical-Spacing">
+<div class="nav-panel">
+<p>
+Next: <a href="Colors.html" accesskey="n" rel="next">Colors</a>, Previous: <a href="Using-Fonts.html" accesskey="p" rel="prev">Using Fonts</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Manipulating-Type-Size-and-Vertical-Spacing-1">5.20 Manipulating Type Size and Vertical Spacing</h3>
+<a class="index-entry-id" id="index-manipulating-type-size-and-vertical-spacing"></a>
+
+<a class="index-entry-id" id="index-text-baseline-1"></a>
+<a class="index-entry-id" id="index-baseline_002c-text-1"></a>
+<a class="index-entry-id" id="index-type-size"></a>
+<a class="index-entry-id" id="index-size_002c-size"></a>
+<a class="index-entry-id" id="index-vertical-spacing-1"></a>
+<a class="index-entry-id" id="index-spacing_002c-vertical-1"></a>
+<p>These concepts were introduced in <a class="ref" href="Page-Geometry.html">Page Geometry</a>. The height of a
+font&rsquo;s tallest glyph is one em, which is equal to the type size in
+points.<a class="footnote" id="DOCF82" href="groff.html_fot.html#FOOT82"><sup>82</sup></a> A vertical spacing of less than 120% of
+the type size can make a document hard to read. Larger proportions can
+be useful to spread the text for annotations or proofreader&rsquo;s marks. By
+default, GNU <code class="code">troff</code> uses 10&nbsp;point type on 12&nbsp;point
+spacing.
+<a class="index-entry-id" id="index-leading"></a>
+Typographers call the difference between type size and vertical spacing
+<em class="dfn">leading</em>.<a class="footnote" id="DOCF83" href="groff.html_fot.html#FOOT83"><sup>83</sup></a>
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="Changing-the-Type-Size.html" accesskey="1">Changing the Type Size</a></li>
+<li><a href="Changing-the-Vertical-Spacing.html" accesskey="2">Changing the Vertical Spacing</a></li>
+<li><a href="Using-Fractional-Type-Sizes.html" accesskey="3">Using Fractional Type Sizes</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Measurements.html b/doc/groff.html.node/Measurements.html
new file mode 100644
index 0000000..a4f1c82
--- /dev/null
+++ b/doc/groff.html.node/Measurements.html
@@ -0,0 +1,177 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Measurements (The GNU Troff Manual)</title>
+
+<meta name="description" content="Measurements (The GNU Troff Manual)">
+<meta name="keywords" content="Measurements (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Numeric-Expressions.html" rel="next" title="Numeric Expressions">
+<link href="Text.html" rel="prev" title="Text">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span:hover a.copiable-link {visibility: visible}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Measurements">
+<div class="nav-panel">
+<p>
+Next: <a href="Numeric-Expressions.html" accesskey="n" rel="next">Numeric Expressions</a>, Previous: <a href="Text.html" accesskey="p" rel="prev">Text</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Measurements-1">5.3 Measurements</h3>
+<a class="index-entry-id" id="index-measurements"></a>
+<a class="index-entry-id" id="index-scaling-indicator"></a>
+<a class="index-entry-id" id="index-indicator_002c-scaling"></a>
+
+<a class="index-entry-id" id="index-units-of-measurement"></a>
+<a class="index-entry-id" id="index-measurement-units"></a>
+<p>The formatter sometimes requires the input of numeric parameters to
+specify measurements. These are specified as integers or decimal
+fractions with an optional <em class="dfn">scaling unit</em> suffixed. A scaling unit
+is a letter that immediately follows the last digit of a number. Digits
+after the decimal point are optional. Measurement expressions include
+&lsquo;<samp class="samp">10.5p</samp>&rsquo;, &lsquo;<samp class="samp">11i</samp>&rsquo;, and &lsquo;<samp class="samp">3.c</samp>&rsquo;.
+</p>
+<a class="index-entry-id" id="index-basic-units_002c-conversion-to"></a>
+<a class="index-entry-id" id="index-units_002c-basic_002c-conversion-to"></a>
+<a class="index-entry-id" id="index-conversion-to-basic-units"></a>
+<p>Measurements are scaled by the scaling unit and stored internally (with
+any fractional part discarded) in basic units.
+<a class="index-entry-id" id="index-device-resolution_002c-obtaining-in-the-formatter"></a>
+<a class="index-entry-id" id="index-resolution_002c-device_002c-obtaining-in-the-formatter"></a>
+The device resolution can therefore be obtained by storing a value of
+&lsquo;<samp class="samp">1i</samp>&rsquo; to a register. The only constraint on the basic unit is that
+it is at least as small as any other unit.
+</p>
+<dl class="table">
+<dd><a class="index-entry-id" id="index-basic-scaling-unit-_0028u_0029"></a>
+<a class="index-entry-id" id="index-u-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-u"></a>
+<a class="index-entry-id" id="index-scaling-unit-u"></a>
+</dd>
+<dt><code class="code">u</code></dt>
+<dd><p>Basic unit.
+</p>
+</dd>
+<dt id='index-inch-scaling-unit-_0028i_0029'><span><code class="code">i</code><a class="copiable-link" href='#index-inch-scaling-unit-_0028i_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-i-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-i"></a>
+<a class="index-entry-id" id="index-scaling-unit-i"></a>
+<p>Inch; defined as 2.54&nbsp;centimeters.
+</p>
+</dd>
+<dt id='index-centimeter-scaling-unit-_0028c_0029'><span><code class="code">c</code><a class="copiable-link" href='#index-centimeter-scaling-unit-_0028c_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-c-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-c"></a>
+<a class="index-entry-id" id="index-scaling-unit-c"></a>
+<p>Centimeter; a centimeter is about 0.3937&nbsp;inches.
+</p>
+</dd>
+<dt id='index-point-scaling-unit-_0028p_0029'><span><code class="code">p</code><a class="copiable-link" href='#index-point-scaling-unit-_0028p_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-p-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-p"></a>
+<a class="index-entry-id" id="index-scaling-unit-p"></a>
+<p>Point; a typesetter&rsquo;s unit used for measuring type size.
+There are 72&nbsp;points to an inch.
+</p>
+</dd>
+<dt id='index-pica-scaling-unit-_0028P_0029'><span><code class="code">P</code><a class="copiable-link" href='#index-pica-scaling-unit-_0028P_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-P-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-P"></a>
+<a class="index-entry-id" id="index-scaling-unit-P"></a>
+<p>Pica; another typesetter&rsquo;s unit. There are 6&nbsp;picas to an inch and
+12&nbsp;points to a pica.
+</p>
+</dd>
+<dt><code class="code">s</code></dt>
+<dt><code class="code">z</code></dt>
+<dd><p>See <a class="xref" href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a>, for a discussion of these units.
+</p>
+</dd>
+<dt><code class="code">f</code></dt>
+<dd><p>GNU <code class="code">troff</code> defines this unit to scale decimal fractions in the
+interval [0, 1] to 16-bit unsigned integers. It multiplies a quantity
+by 65,536. See <a class="xref" href="Colors.html">Colors</a>, for usage.
+</p></dd>
+</dl>
+
+<p>The magnitudes of other scaling units depend on the text formatting
+parameters in effect. These are useful when specifying measurements
+that need to scale with the typeface or vertical spacing.
+</p>
+<dl class="table">
+<dt id='index-em-scaling-unit-_0028m_0029'><span><code class="code">m</code><a class="copiable-link" href='#index-em-scaling-unit-_0028m_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-m-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-m"></a>
+<a class="index-entry-id" id="index-scaling-unit-m"></a>
+<p>Em; an em is equal to the current type size in points. It is named thus
+because it is approximately the width of the letter&nbsp;&lsquo;<samp class="samp">M</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-en-scaling-unit-_0028n_0029'><span><code class="code">n</code><a class="copiable-link" href='#index-en-scaling-unit-_0028n_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-n-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-n"></a>
+<a class="index-entry-id" id="index-scaling-unit-n"></a>
+<p>En; an en is one-half em.
+</p>
+</dd>
+<dt id='index-vertical-space-unit-_0028v_0029'><span><code class="code">v</code><a class="copiable-link" href='#index-vertical-space-unit-_0028v_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-space_002c-vertical_002c-unit-_0028v_0029"></a>
+<a class="index-entry-id" id="index-vee-scaling-unit-_0028v_0029"></a>
+<a class="index-entry-id" id="index-v-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-v"></a>
+<a class="index-entry-id" id="index-scaling-unit-v"></a>
+<p>Vee; recall <a class="ref" href="Page-Geometry.html">Page Geometry</a>.
+</p>
+</dd>
+<dt id='index-M-scaling-unit'><span><code class="code">M</code><a class="copiable-link" href='#index-M-scaling-unit'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-unit_002c-scaling_002c-M"></a>
+<a class="index-entry-id" id="index-scaling-unit-M"></a>
+<p>Hundredth of an em.
+</p></dd>
+</dl>
+
+
+
+<ul class="mini-toc">
+<li><a href="Motion-Quanta.html" accesskey="1">Motion Quanta</a></li>
+<li><a href="Default-Units.html" accesskey="2">Default Units</a></li>
+</ul>
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Numeric-Expressions.html">Numeric Expressions</a>, Previous: <a href="Text.html">Text</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Miscellaneous.html b/doc/groff.html.node/Miscellaneous.html
new file mode 100644
index 0000000..db1eef3
--- /dev/null
+++ b/doc/groff.html.node/Miscellaneous.html
@@ -0,0 +1,275 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Miscellaneous (The GNU Troff Manual)</title>
+
+<meta name="description" content="Miscellaneous (The GNU Troff Manual)">
+<meta name="keywords" content="Miscellaneous (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Gtroff-Internals.html" rel="next" title="Gtroff Internals">
+<link href="Postprocessor-Access.html" rel="prev" title="Postprocessor Access">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span.w-nolinebreak-text {white-space: nowrap}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Miscellaneous">
+<div class="nav-panel">
+<p>
+Next: <a href="Gtroff-Internals.html" accesskey="n" rel="next"><code class="code">gtroff</code> Internals</a>, Previous: <a href="Postprocessor-Access.html" accesskey="p" rel="prev">Postprocessor Access</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Miscellaneous-1">5.35 Miscellaneous</h3>
+
+<p>We document here GNU <code class="code">troff</code> features that fit poorly elsewhere.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enm"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nm</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">start</i></span> [<span class="r"><i class="slanted">increment</i></span> [<span class="r"><i class="slanted">space</i></span> [<span class="r"><i class="slanted">indentation</i></span>]]]]</var><a class="copiable-link" href='#index-_002enm'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nm"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005bln_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[ln]</code></strong><a class="copiable-link" href='#index-_005cn_005bln_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ln"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002enm_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.nm]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002enm_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002enm-1"></a>
+<a class="index-entry-id" id="index-printing-line-numbers-_0028nm_0029"></a>
+<a class="index-entry-id" id="index-line-numbers_002c-printing-_0028nm_0029"></a>
+<a class="index-entry-id" id="index-numbers_002c-line_002c-printing-_0028nm_0029"></a>
+<p>Begin (or, with no arguments, cease) numbering output lines.
+<var class="var">start</var> assigns the number of the <em class="emph">next</em> output line. Only
+line numbers divisible by <var class="var">increment</var> are marked (default:
+&lsquo;<samp class="samp">1</samp>&rsquo;). <var class="var">space</var> configures the horizontal spacing between the
+number and the text (default: &lsquo;<samp class="samp">1</samp>&rsquo;). Any given <var class="var">indentation</var> is
+applied to the numbers (default: &lsquo;<samp class="samp">0</samp>&rsquo;). The third and fourth
+arguments are reckoned in numeral widths (<code class="code">\0</code>). <var class="var">start</var> must
+be non-negative and <var class="var">increment</var> positive.
+</p>
+<p>The formatter aligns the number to the right in a width of three numeral
+spaces plus <var class="var">indentation</var>, then catenates <var class="var">space</var> and the output
+line. The line length is <em class="emph">not</em> reduced. Depending on the value of
+the page offset,<a class="footnote" id="DOCF117" href="groff.html_fot.html#FOOT117"><sup>117</sup></a> numbers wider than
+the allocated space protrude into the left margin, or shift the output
+line to the right.
+</p>
+<p>Line numbering parameters corresponding to missing arguments are not
+altered. After numbering is disabled, &lsquo;<samp class="samp">.nm +0</samp>&rsquo; resumes it using
+the previously active parameters.
+</p>
+<p>The parameters of <code class="code">nm</code> are associated with the environment
+(see <a class="pxref" href="Environments.html">Environments</a>).
+</p>
+<a class="index-entry-id" id="index-output-line-number-register-_0028ln_0029"></a>
+<a class="index-entry-id" id="index-line-number_002c-output_002c-register-_0028ln_0029"></a>
+<p>While numbering is enabled, the output line number register <code class="code">ln</code> is
+updated as each line is output, even if no line number is formatted with
+it because it is being skipped (it is not a multiple of <var class="var">increment</var>)
+or because numbering is suppressed (see the <code class="code">nn</code> request below).
+</p>
+<p>The <code class="code">.nm</code> register tracks the enablement status of numbering.
+Temporary suspension of numbering with the <code class="code">nn</code> request does
+<em class="emph">not</em> alter its value.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.po 5n
+.ll 44n
+Programming,
+when stripped of all its circumstantial irrelevancies,
+.nm 999 1 1 -4
+boils down to no more and no less than
+.nm +0 3
+very effective thinking so as to avoid unmastered
+.nn 2
+complexity,
+to very vigorous separation of your many
+different concerns.
+.br
+\(em Edsger Dijkstra
+.sp
+.nm 1 1 1
+This guy's arrogance takes your breath away.
+.br
+\(em John Backus
+ &rArr; Programming, when stripped of all its cir-
+ &rArr; 999 cumstantial irrelevancies, boils down to no
+ &rArr; more and no less than very effective think-
+ &rArr; ing so as to avoid unmastered complexity, to
+ &rArr; very vigorous separation of your many dif-
+ &rArr; ferent concerns.
+ &rArr; 1002 -- Edsger Dijkstra
+ &rArr;
+ &rArr; 1 This guy&rsquo;s arrogance takes your breath away.
+ &rArr; 2 -- John Backus
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enn"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nn</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">skip</i></span>]</var><a class="copiable-link" href='#index-_002enn'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nn"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002enn_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.nn]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002enn_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002enn-1"></a>
+<p>Suppress numbering of the next <var class="var">skip</var> output lines that would
+otherwise be numbered. The default is&nbsp;1. <code class="code">nn</code> can be invoked
+when line numbering is not active; suppression of numbering will take
+effect for <var class="var">skip</var> lines once <code class="code">nm</code> enables it.
+</p>
+<p>The <code class="code">.nn</code> register stores the count of output lines still to have
+their numbering suppressed.
+</p>
+<p>This count is associated with the environment (see <a class="pxref" href="Environments.html">Environments</a>).
+</p></dd></dl>
+
+<p>To test whether the current output line will be numbered, you must check
+both the <code class="code">.nm</code> and <code class="code">.nn</code> registers.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> .de is-numbered
+ . nop This line
+ . ie (\\n[.nm] &amp; (1-\\n[.nn])) IS
+ . el ISN'T
+ . nop numbered.
+ . br
+ ..
+ Test line numbering.
+ .is-numbered
+ .nm 1
+ .nn 1
+ .is-numbered
+ .is-numbered
+ .nm
+ .is-numbered
+ &rArr; Test line numbering. This line ISN&rsquo;T numbered.
+ &rArr; This line ISN&rsquo;T numbered.
+ &rArr; 1 This line IS numbered.
+ &rArr; This line ISN&rsquo;T numbered.
+</pre></div></div>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002emc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.mc</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">margin-character</i></span> [<span class="r"><i class="slanted">distance</i></span>]</var><a class="copiable-link" href='#index-_002emc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-mc"></a>
+<a class="index-entry-id" id="index-margin-glyph-_0028mc_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-for-margins-_0028mc_0029"></a>
+<p>Begin (or, with no arguments, cease) writing a <em class="dfn">margin-character</em> to
+the right of each output line. The <var class="var">distance</var> argument separates
+<var class="var">margin-character</var> from the right margin. If absent, the most
+recent value is used; the default is 10&nbsp;points. If an output line
+exceeds the line length, the margin character is appended to it.
+<a class="index-entry-id" id="index-tl-request_002c-and-mc"></a>
+No margin character is written on lines produced by the <code class="code">tl</code>
+request.
+</p>
+<p>The margin character is a property of the output line; the margin
+character last configured when the line is output controls. If the
+margin character is disabled before an output line breaks, none is
+output (but see below).
+</p>
+<p>The margin character is associated with the environment
+(see <a class="pxref" href="Environments.html">Environments</a>).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 5i
+.nf
+.mc \[br]
+This paragraph is marked with a margin character.
+.sp
+As seen above, vertical space isn't thus marked.
+\&amp;
+An output line that is present, but empty, is.
+ &rArr; This paragraph is marked with a margin character. |
+ &rArr;
+ &rArr; As seen above, vertical space isn&rsquo;t thus marked. |
+ &rArr; |
+ &rArr; An output line that is present, but empty, is. |
+</pre></div></div>
+</dd></dl>
+
+<p>For compatibility with <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>, a call to <code class="code">mc</code>
+to set the margin character can&rsquo;t be undone immediately; at least one
+line gets a margin character.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 10n
+.nf
+.mc |
+.mc *
+.mc
+foo
+bar
+ &rArr; foo *
+ &rArr; bar
+</pre></div></div>
+
+<a class="index-entry-id" id="index-gdiffmk"></a>
+<a class="index-entry-id" id="index-nrchbar"></a>
+<a class="index-entry-id" id="index-changebar"></a>
+<a class="index-entry-id" id="index-diffmk"></a>
+<p>The margin character mechanism is commonly used to annotate changes in
+documents. The <code class="code">groff</code> distribution ships a program,
+<code class="command">gdiffmk</code>, to assist with this task.<a class="footnote" id="DOCF118" href="groff.html_fot.html#FOOT118"><sup>118</sup></a>
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epsbb"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.psbb</code></strong> <var class="def-var-arguments">file</var><a class="copiable-link" href='#index-_002epsbb'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-psbb"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005bllx_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[llx]</code></strong><a class="copiable-link" href='#index-_005cn_005bllx_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-llx"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005blly_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[lly]</code></strong><a class="copiable-link" href='#index-_005cn_005blly_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-lly"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005burx_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[urx]</code></strong><a class="copiable-link" href='#index-_005cn_005burx_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-urx"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005bury_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[ury]</code></strong><a class="copiable-link" href='#index-_005cn_005bury_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ury"></a>
+<a class="index-entry-id" id="index-PostScript_002c-bounding-box"></a>
+<a class="index-entry-id" id="index-bounding-box"></a>
+<p>Retrieve the bounding box of the PostScript image found in <var class="var">file</var>,
+which must conform to Adobe&rsquo;s <em class="dfn">Document Structuring Conventions</em>
+(DSC), locate a <code class="code">%%BoundingBox</code> comment, and store the (upper-,
+lower-, <span class="w-nolinebreak-text">-left</span><!-- /@w -->, <span class="w-nolinebreak-text">-right</span><!-- /@w -->) values into the registers <code class="code">llx</code>,
+<code class="code">lly</code>, <code class="code">urx</code>, and <code class="code">ury</code>. If an error occurs (for
+example, if no <code class="code">%%BoundingBox</code> comment is present), the formatter
+sets these registers to&nbsp;0.
+</p>
+<p>The search path for <var class="var">file</var> can be controlled with the <samp class="option">-I</samp>
+command-line option.
+</p></dd></dl>
+
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Gtroff-Internals.html"><code class="code">gtroff</code> Internals</a>, Previous: <a href="Postprocessor-Access.html">Postprocessor Access</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Missing-Unix-Version-7-ms-Macros.html b/doc/groff.html.node/Missing-Unix-Version-7-ms-Macros.html
new file mode 100644
index 0000000..99f7b62
--- /dev/null
+++ b/doc/groff.html.node/Missing-Unix-Version-7-ms-Macros.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Missing Unix Version 7 ms Macros (The GNU Troff Manual)</title>
+
+<meta name="description" content="Missing Unix Version 7 ms Macros (The GNU Troff Manual)">
+<meta name="keywords" content="Missing Unix Version 7 ms Macros (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Differences-from-AT_0026T-ms.html" rel="up" title="Differences from AT&amp;T ms">
+<link href="Differences-from-AT_0026T-ms.html" rel="prev" title="Differences from AT&amp;T ms">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="Missing-Unix-Version-7-ms-Macros">
+<div class="nav-panel">
+<p>
+Previous: <a href="Differences-from-AT_0026T-ms.html" accesskey="p" rel="prev">Differences from <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp></a>, Up: <a href="Differences-from-AT_0026T-ms.html" accesskey="u" rel="up">Differences from <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Unix-Version-7-ms-macros-not-implemented-by-groff-ms">4.6.7.1 Unix Version 7 <samp class="file">ms</samp> macros not implemented by <code class="code">groff</code> <samp class="file">ms</samp></h4>
+
+<p>Several macros described in the Unix Version&nbsp;7 <samp class="file">ms</samp>
+documentation are unimplemented by <code class="code">groff</code> <samp class="file">ms</samp> because they
+are specific to the requirements of documents produced internally by
+Bell Laboratories, some of which also require a glyph for the Bell
+System logo that <code class="code">groff</code> does not support. These macros
+implemented several document type formats
+(<code class="code">EG</code>, <code class="code">IM</code>, <code class="code">MF</code>, <code class="code">MR</code>, <code class="code">TM</code>, <code class="code">TR</code>), were meaningful only in conjunction with the use of certain document
+types
+(<code class="code">AT</code>, <code class="code">CS</code>, <code class="code">CT</code>, <code class="code">OK</code>, <code class="code">SG</code>), stored the postal addresses of Bell Labs sites
+(<code class="code">HO</code>, <code class="code">IH</code>, <code class="code">MH</code>, <code class="code">PY</code>, <code class="code">WH</code>), or lacked a stable definition over time
+(<code class="code">UX</code>). To compatibly render historical <samp class="file">ms</samp> documents using these macros,
+we advise your documents to invoke the <code class="code">rm</code> request to remove any
+such macros it uses and then define replacements with an authentically
+typeset original at hand.<a class="footnote" id="DOCF17" href="groff.html_fot.html#FOOT17"><sup>17</sup></a> For
+informal purposes, a simple definition of <code class="code">UX</code> should maintain the
+readability of the document&rsquo;s substance.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.rm UX
+.ds UX Unix\&quot;
+</pre></div>
+</td></tr></table>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Motion-Quanta.html b/doc/groff.html.node/Motion-Quanta.html
new file mode 100644
index 0000000..5df1c72
--- /dev/null
+++ b/doc/groff.html.node/Motion-Quanta.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Motion Quanta (The GNU Troff Manual)</title>
+
+<meta name="description" content="Motion Quanta (The GNU Troff Manual)">
+<meta name="keywords" content="Motion Quanta (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Measurements.html" rel="up" title="Measurements">
+<link href="Default-Units.html" rel="next" title="Default Units">
+<link href="Measurements.html" rel="prev" title="Measurements">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Motion-Quanta">
+<div class="nav-panel">
+<p>
+Next: <a href="Default-Units.html" accesskey="n" rel="next">Default Units</a>, Previous: <a href="Measurements.html" accesskey="p" rel="prev">Measurements</a>, Up: <a href="Measurements.html" accesskey="u" rel="up">Measurements</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Motion-Quanta-1">5.3.1 Motion Quanta</h4>
+<a class="index-entry-id" id="index-motion-quanta"></a>
+<a class="index-entry-id" id="index-quanta_002c-motion"></a>
+
+<p>An output device&rsquo;s basic unit <code class="code">u</code> is not necessarily its smallest
+addressable length; <code class="code">u</code> can be smaller to avoid problems with
+integer roundoff. The minimum distances that a device can work with in
+the horizontal and vertical directions are termed its <em class="dfn">motion
+quanta</em>. Measurements are rounded to applicable motion quanta.
+Half-quantum fractions round toward zero.
+</p>
+<a class="index-entry-id" id="index-horizontal-motion-quantum-register-_0028_002eH_0029"></a>
+<a class="index-entry-id" id="index-motion-quantum_002c-horizontal_002c-register-_0028_002eH_0029"></a>
+<a class="index-entry-id" id="index-horizontal-resolution-register-_0028_002eH_0029"></a>
+<a class="index-entry-id" id="index-resolution_002c-horizontal_002c-register-_0028_002eH_0029"></a>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002eH_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.H]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eH_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eH"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002eV_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.V]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eV_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eV"></a>
+<p>These read-only registers interpolate the horizontal and vertical motion
+quanta, respectively, of the output device in basic units.
+</p></dd></dl>
+
+<p>For example, we might draw short baseline rules on a terminal device as
+follows. See <a class="xref" href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.tm \n[.H]
+ error&rarr; 24
+.nf
+\l'36u' 36u
+\l'37u' 37u
+ &rArr; _ 36u
+ &rArr; __ 37u
+</pre></div></div>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Numeric-Expressions.html b/doc/groff.html.node/Numeric-Expressions.html
new file mode 100644
index 0000000..7da6bd3
--- /dev/null
+++ b/doc/groff.html.node/Numeric-Expressions.html
@@ -0,0 +1,395 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Numeric Expressions (The GNU Troff Manual)</title>
+
+<meta name="description" content="Numeric Expressions (The GNU Troff Manual)">
+<meta name="keywords" content="Numeric Expressions (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Identifiers.html" rel="next" title="Identifiers">
+<link href="Measurements.html" rel="prev" title="Measurements">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Numeric-Expressions">
+<div class="nav-panel">
+<p>
+Next: <a href="Identifiers.html" accesskey="n" rel="next">Identifiers</a>, Previous: <a href="Measurements.html" accesskey="p" rel="prev">Measurements</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Numeric-Expressions-1">5.4 Numeric Expressions</h3>
+<a class="index-entry-id" id="index-numeric-expressions"></a>
+<a class="index-entry-id" id="index-expressions_002c-numeric"></a>
+
+<p>A <em class="dfn">numeric expression</em> evaluates to an integer: it can be as
+simple as a literal &lsquo;<samp class="samp">0</samp>&rsquo; or it can be a complex sequence of register
+and string interpolations interleaved with measurements and operators.
+</p>
+<p>GNU <code class="code">troff</code> provides a set of mathematical and logical operators
+familiar to programmers&mdash;as well as some unusual ones&mdash;but supports
+only integer arithmetic.<a class="footnote" id="DOCF35" href="groff.html_fot.html#FOOT35"><sup>35</sup></a> The internal data type
+used for computing results is usually a 32-bit signed integer, which
+suffices to represent magnitudes within a range of ±2
+billion.<a class="footnote" id="DOCF36" href="groff.html_fot.html#FOOT36"><sup>36</sup></a>
+</p>
+<a class="index-entry-id" id="index-arithmetic-operators"></a>
+<a class="index-entry-id" id="index-operators_002c-arithmetic"></a>
+<a class="index-entry-id" id="index-truncating-division"></a>
+<a class="index-entry-id" id="index-addition"></a>
+<a class="index-entry-id" id="index-subtraction"></a>
+<a class="index-entry-id" id="index-multiplication"></a>
+<a class="index-entry-id" id="index-division_002c-truncating"></a>
+<a class="index-entry-id" id="index-modulus"></a>
+<a class="index-entry-id" id="index-_002b"></a>
+<a class="index-entry-id" id="index-_002d"></a>
+<a class="index-entry-id" id="index-_002a"></a>
+<a class="index-entry-id" id="index-_002f"></a>
+<a class="index-entry-id" id="index-_0025"></a>
+<p>Arithmetic infix operators perform a function on the numeric expressions
+to their left and right; they are <code class="code">+</code> (addition), <code class="code">-</code>
+(subtraction), <code class="code">*</code> (multiplication), <code class="code">/</code> (truncating
+division), and <code class="code">%</code> (modulus). <em class="dfn">Truncating division</em> rounds to
+the integer nearer to zero, no matter how large the fractional portion.
+Overflow and division (or modulus) by zero are errors and abort
+evaluation of a numeric expression.
+<a class="index-entry-id" id="index-unary-arithmetic-operators"></a>
+<a class="index-entry-id" id="index-operators_002c-unary-arithmetic"></a>
+<a class="index-entry-id" id="index-negation"></a>
+<a class="index-entry-id" id="index-assertion-_0028arithmetic-operator_0029"></a>
+<a class="index-entry-id" id="index-_002d-1"></a>
+<a class="index-entry-id" id="index-_002b-1"></a>
+<a class="index-entry-id" id="index-if-request_002c-and-the-_0021-operator"></a>
+<a class="index-entry-id" id="index-while-request_002c-and-the-_0021-operator"></a>
+</p>
+<p>Arithmetic unary operators operate on the numeric expression to their
+right; they are <code class="code">-</code> (negation) and <code class="code">+</code> (assertion&mdash;for
+completeness; it does nothing). The unary minus must often be used
+with parentheses to avoid confusion with the decrementation operator,
+discussed below.
+</p>
+<p>Observe the rounding behavior and effect of negative operands on the
+modulus and truncating division operators.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr T 199/100
+.nr U 5/2
+.nr V (-5)/2
+.nr W 5/-2
+.nr X 5%2
+.nr Y (-5)%2
+.nr Z 5%-2
+T=\n[T] U=\n[U] V=\n[V] W=\n[W] X=\n[X] Y=\n[Y] Z=\n[Z]
+ &rArr; T=1 U=2 V=-2 W=-2 X=1 Y=-1 Z=1
+</pre></div></div>
+
+<p>The sign of the modulus of operands of mixed signs is determined by the
+sign of the first. Division and modulus operators satisfy the following
+property: given a dividend&nbsp;<var class="var">a</var> and a divisor&nbsp;<var class="var">b</var>, a
+quotient&nbsp;<var class="var">q</var> formed by &lsquo;<samp class="samp">(a / b)</samp>&rsquo; and a
+remainder&nbsp;<var class="var">r</var> by &lsquo;<samp class="samp">(a % b)</samp>&rsquo;, then <em class="math">qb + r = a</em>.
+</p>
+<a class="index-entry-id" id="index-scaling-operator"></a>
+<a class="index-entry-id" id="index-operator_002c-scaling"></a>
+<a class="index-entry-id" id="index-_003b"></a>
+<p>GNU <code class="code">troff</code>&rsquo;s scaling operator, used with parentheses as
+<code class="code">(<var class="var">c</var>;<var class="var">e</var>)</code>, evaluates a numeric expression&nbsp;<var class="var">e</var>
+using&nbsp;<var class="var">c</var> as the default scaling unit. If <var class="var">c</var> is omitted,
+scaling units are ignored in the evaluation of&nbsp;<var class="var">e</var>. This
+operator can save typing by avoiding the attachment of scaling units to
+every operand out of caution. Your macros can select a sensible default
+unit in case the user neglects to supply one.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.\&quot; Indent by amount given in first argument; assume ens.
+.de Indent
+. in (n;\\$1)
+..
+</pre></div></div>
+
+<p>Without the scaling operator, the foregoing macro would, if called with
+a unitless argument, cause indentation by the <code class="code">in</code> request&rsquo;s
+default scaling unit (ems). The result would be twice as much
+indentation as expected.
+</p>
+<a class="index-entry-id" id="index-extremum-operators-_0028_003e_003f_002c-_003c_003f_0029"></a>
+<a class="index-entry-id" id="index-operators_002c-extremum-_0028_003e_003f_002c-_003c_003f_0029"></a>
+<a class="index-entry-id" id="index-maximum-operator"></a>
+<a class="index-entry-id" id="index-minimum-operator"></a>
+<a class="index-entry-id" id="index-_003e_003f"></a>
+<a class="index-entry-id" id="index-_003c_003f"></a>
+<p>GNU <code class="code">troff</code> also provides a pair of operators to compute the
+extrema of two operands: <code class="code">&gt;?</code> (maximum) and <code class="code">&lt;?</code> (minimum).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr slots 5
+.nr candidates 3
+.nr salaries (\n[slots] &lt;? \n[candidates])
+Looks like we'll end up paying \n[salaries] salaries.
+ &rArr; Looks like we'll end up paying 3 salaries.
+</pre></div></div>
+
+<a class="index-entry-id" id="index-comparison-operators"></a>
+<a class="index-entry-id" id="index-operators_002c-comparison"></a>
+<a class="index-entry-id" id="index-greater-than-_0028or-equal-to_0029-operator"></a>
+<a class="index-entry-id" id="index-less-than-_0028or-equal-to_0029-operator"></a>
+<a class="index-entry-id" id="index-equality-operator"></a>
+<a class="index-entry-id" id="index-_003c"></a>
+<a class="index-entry-id" id="index-_003e"></a>
+<a class="index-entry-id" id="index-_003e_003d"></a>
+<a class="index-entry-id" id="index-_003c_003d"></a>
+<a class="index-entry-id" id="index-_003d"></a>
+<a class="index-entry-id" id="index-_003d_003d"></a>
+<p>Comparison operators comprise <code class="code">&lt;</code> (less than), <code class="code">&gt;</code> (greater
+than), <code class="code">&lt;=</code> (less than or equal), <code class="code">&gt;=</code> (greater than or
+equal), and <code class="code">=</code> (equal). <code class="code">==</code> is a synonym for <code class="code">=</code>.
+When evaluated, a comparison is replaced with &lsquo;<samp class="samp">0</samp>&rsquo; if it is false
+and &lsquo;<samp class="samp">1</samp>&rsquo; if true. In the <code class="code">roff</code> language, positive values are
+true, others false.
+</p>
+<a class="index-entry-id" id="index-logical-operators"></a>
+<a class="index-entry-id" id="index-operators_002c-logical"></a>
+<a class="index-entry-id" id="index-logical-_0060_0060and_0027_0027-operator"></a>
+<a class="index-entry-id" id="index-logical-conjunction-operator"></a>
+<a class="index-entry-id" id="index-logical-_0060_0060or_0027_0027-operator"></a>
+<a class="index-entry-id" id="index-logical-disjunction-operator"></a>
+<a class="index-entry-id" id="index-_0026"></a>
+<a class="index-entry-id" id="index-_003a"></a>
+<p>We can operate on truth values with the logical operators <code class="code">&amp;</code>
+(logical conjunction or &ldquo;and&rdquo;) and <code class="code">:</code> (logical disjunction or
+&ldquo;or&rdquo;). They evaluate as comparison operators do.
+</p>
+<a class="index-entry-id" id="index-_0021"></a>
+<a class="index-entry-id" id="index-complementation_002c-logical"></a>
+<a class="index-entry-id" id="index-logical-complementation-operator"></a>
+<a class="index-entry-id" id="index-logical-not_002c-limitation-in-expression"></a>
+<a class="index-entry-id" id="index-expression_002c-limitation-of-logical-not-in"></a>
+<p>A logical complementation (&ldquo;not&rdquo;) operator, <code class="code">!</code>, works only
+within <code class="code">if</code>, <code class="code">ie</code>, and <code class="code">while</code> requests.
+Furthermore, <code class="code">!</code> is recognized only at the beginning of a numeric
+expression not contained by another numeric expression. In other words,
+it must be the &ldquo;outermost&rdquo; operator. Including it elsewhere in the
+expression produces a warning in the &lsquo;<samp class="samp">number</samp>&rsquo; category
+(see <a class="pxref" href="Warnings.html">Warnings</a>), and its expression evaluates false. This
+unfortunate limitation maintains compatibility with <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code>. Test a numeric expression for falsity by
+comparing it to a false value.<a class="footnote" id="DOCF37" href="groff.html_fot.html#FOOT37"><sup>37</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr X 1
+.nr Y 0
+.\&quot; This does not work as expected.
+.if (\n[X])&amp;(!\n[Y]) .nop A: X is true, Y is false
+.
+.\&quot; Use this construct instead.
+.if (\n[X])&amp;(\n[Y]&lt;=0) .nop B: X is true, Y is false
+ error&rarr; warning: expected numeric expression, got '!'
+ &rArr; B: X is true, Y is false
+</pre></div></div>
+
+<a class="index-entry-id" id="index-parentheses"></a>
+<a class="index-entry-id" id="index-order-of-evaluation-in-expressions"></a>
+<a class="index-entry-id" id="index-expression_002c-order-of-evaluation"></a>
+<a class="index-entry-id" id="index-_0028"></a>
+<a class="index-entry-id" id="index-_0029"></a>
+<p>The <code class="code">roff</code> language has no operator precedence: expressions are
+evaluated strictly from left to right, in contrast to schoolhouse
+arithmetic. Use parentheses <code class="code">(</code> <code class="code">)</code> to impose a desired
+precedence upon subexpressions.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr X 3+5*4
+.nr Y (3+5)*4
+.nr Z 3+(5*4)
+X=\n[X] Y=\n[Y] Z=\n[Z]
+ &rArr; X=32 Y=32 Z=23
+</pre></div></div>
+
+<a class="index-entry-id" id="index-_002b_002c-and-page-motion"></a>
+<a class="index-entry-id" id="index-_002d_002c-and-page-motion"></a>
+<a class="index-entry-id" id="index-motion-operators"></a>
+<a class="index-entry-id" id="index-operators_002c-motion"></a>
+<a class="index-entry-id" id="index-_002b-_0028unary_0029"></a>
+<a class="index-entry-id" id="index-_002d-_0028unary_0029"></a>
+<p>For many requests and escape sequences that cause motion on the page,
+the unary operators <code class="code">+</code> and <code class="code">-</code> work differently when leading
+a numeric expression. They then indicate a motion relative to the
+drawing position: positive is down in vertical contexts, right in
+horizontal ones.
+</p>
+<a class="index-entry-id" id="index-bp-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-in-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-ll-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-lt-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-nm-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-nr-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-pl-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-pn-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-po-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-ps-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-pvs-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-rt-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-ti-request_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-_005cH_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-_005cR_002c-using-_002b-and-_002d-with"></a>
+<a class="index-entry-id" id="index-_005cs_002c-using-_002b-and-_002d-with"></a>
+<p><code class="code">+</code> and <code class="code">-</code> are also treated differently by the following
+requests and escape sequences: <code class="code">bp</code>, <code class="code">in</code>, <code class="code">ll</code>,
+<code class="code">lt</code>, <code class="code">nm</code>, <code class="code">nr</code>, <code class="code">pl</code>, <code class="code">pn</code>, <code class="code">po</code>,
+<code class="code">ps</code>, <code class="code">pvs</code>, <code class="code">rt</code>, <code class="code">ti</code>, <code class="code">\H</code>, <code class="code">\R</code>, and
+<code class="code">\s</code>. Here, leading plus and minus signs serve as incrementation
+and decrementation operators, respectively. To negate an expression,
+subtract it from zero or include the unary minus in parentheses with its
+argument. See <a class="xref" href="Setting-Registers.html">Setting Registers</a>, for examples.
+</p>
+<a class="index-entry-id" id="index-_007c"></a>
+<a class="index-entry-id" id="index-_007c_002c-and-page-motion"></a>
+<a class="index-entry-id" id="index-absolute-_0028sic_0029-position-operator-_0028_007c_0029"></a>
+<a class="index-entry-id" id="index-position_002c-absolute-_0028sic_0029-operator-_0028_007c_0029"></a>
+<a class="index-entry-id" id="index-boundary_002drelative-motion-operator-_0028_007c_0029"></a>
+<p>A leading <code class="code">|</code> operator indicates a motion relative not to the
+drawing position but to a boundary. For horizontal motions, the
+measurement specifies a distance relative to a drawing position
+corresponding to the beginning of the <em class="emph">input</em> line. By default,
+tab stops reckon movements in this way. Most escape sequences do not;
+<code class="code">|</code> tells them to do so.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">Mind the \h'1.2i'gap.
+.br
+Mind the \h'|1.2i'gap.
+.br
+Mind the
+\h'|1.2i'gap.
+ &rArr; Mind the gap.
+ &rArr; Mind the gap.
+ &rArr; Mind the gap.
+</pre></div></div>
+
+<p>One use of this feature is to define macros whose scope is limited to
+the output they format.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.\&quot; underline word $1 with trailing punctuation $2
+.de Underline
+. nop \\$1\l'|0\[ul]'\\$2
+..
+Typographical emphasis is best used
+.Underline sparingly .
+</pre></div></div>
+
+<p>In the above example, &lsquo;<samp class="samp">|0</samp>&rsquo; specifies a negative motion from the
+current position (at the end of the argument just emitted, <code class="code">\$1</code>)
+to the beginning of the input line. Thus, the <code class="code">\l</code> escape sequence
+in this case draws a line from right to left. A macro call occurs at
+the beginning of an input line;<a class="footnote" id="DOCF38" href="groff.html_fot.html#FOOT38"><sup>38</sup></a> if the <code class="code">|</code>
+operator were omitted, then the underline would be drawn at zero
+distance from the current position, producing device-dependent, and
+likely undesirable, results. On the &lsquo;<samp class="samp">ps</samp>&rsquo; output device, it
+underlines the period.
+</p>
+<p>For vertical motions, the <code class="code">|</code> operator specifies a distance from
+the first text baseline on the page or in the current
+diversion,<a class="footnote" id="DOCF39" href="groff.html_fot.html#FOOT39"><sup>39</sup></a> using the current vertical
+spacing.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">A
+.br
+B \Z'C'\v'|0'D
+ &rArr; A D
+ &rArr; B C
+</pre></div></div>
+
+<p>In the foregoing example, we&rsquo;ve used the <code class="code">\Z</code> escape sequence
+(see <a class="pxref" href="Page-Motions.html">Page Motions</a>) to restore the drawing position after formatting
+&lsquo;<samp class="samp">C</samp>&rsquo;, then moved vertically to the first text baseline on the page.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cB_0027anything_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\B<code class="code">'</code></code><span class="r"><i class="slanted">anything</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cB_0027anything_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cB"></a>
+<a class="index-entry-id" id="index-numeric-expression_002c-valid"></a>
+<a class="index-entry-id" id="index-valid-numeric-expression"></a>
+<p>Interpolate&nbsp;1 if <var class="var">anything</var> is a valid numeric expression,
+and&nbsp;0 otherwise. The delimiter need not be a neutral apostrophe;
+see <a class="ref" href="Delimiters.html">Delimiters</a>.
+</p></dd></dl>
+
+<p>You might use <code class="code">\B</code> along with the <code class="code">if</code> request to filter out
+invalid macro or string arguments. See <a class="xref" href="Conditionals-and-Loops.html">Conditionals and Loops</a>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.\&quot; Indent by amount given in first argument; assume ens.
+.de Indent
+. if \B'\\$1' .in (n;\\$1)
+..
+</pre></div></div>
+
+<p>A register interpolated as an operand in a numeric expression must have
+an Arabic format; luckily, this is the default. See <a class="xref" href="Assigning-Register-Formats.html">Assigning Register Formats</a>.
+</p>
+<a class="index-entry-id" id="index-space-characters_002c-in-expressions"></a>
+<a class="index-entry-id" id="index-expressions_002c-and-space-characters"></a>
+<p>Because spaces separate arguments to requests, spaces are not allowed in
+numeric expressions unless the (sub)expression containing them is
+surrounded by parentheses. See <a class="xref" href="Invoking-Requests.html">Invoking Requests</a>, and
+<a class="ref" href="Conditionals-and-Loops.html">Conditionals and Loops</a>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nf
+.nr a 1+2 + 2+1
+\na
+ error&rarr; expected numeric expression, got a space
+ &rArr; 3
+.nr a 1+(2 + 2)+1
+\na
+ &rArr; 6
+</pre></div></div>
+
+<p>The <code class="code">nr</code> request (see <a class="pxref" href="Setting-Registers.html">Setting Registers</a>) expects its second and
+optional third arguments to be numeric expressions; a bare <code class="code">+</code> does
+not qualify, so our first attempt got a warning.
+</p>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Identifiers.html">Identifiers</a>, Previous: <a href="Measurements.html">Measurements</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Obsolete-Command.html b/doc/groff.html.node/Obsolete-Command.html
new file mode 100644
index 0000000..b656c38
--- /dev/null
+++ b/doc/groff.html.node/Obsolete-Command.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Obsolete Command (The GNU Troff Manual)</title>
+
+<meta name="description" content="Obsolete Command (The GNU Troff Manual)">
+<meta name="keywords" content="Obsolete Command (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Command-Reference.html" rel="up" title="Command Reference">
+<link href="Device-Control-Commands.html" rel="prev" title="Device Control Commands">
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="Obsolete-Command">
+<div class="nav-panel">
+<p>
+Previous: <a href="Device-Control-Commands.html" accesskey="p" rel="prev">Device Control Commands</a>, Up: <a href="Command-Reference.html" accesskey="u" rel="up">Command Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Obsolete-Command-1">6.1.2.5 Obsolete Command</h4>
+<p>In <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> output, the writing of a single glyph is
+mostly done by a very strange command that combines a horizontal move
+and a single character giving the glyph name. It doesn&rsquo;t have a command
+code, but is represented by a 3-character argument consisting of exactly
+2&nbsp;digits and a character.
+</p>
+<dl class="table">
+<dt><var class="var">dd</var><var class="var">g</var></dt>
+<dd><p>Move right <var class="var">dd</var> (exactly two decimal digits) basic units &lsquo;<samp class="samp">u</samp>&rsquo;,
+then print glyph&nbsp;<var class="var">g</var> (represented as a single character).
+</p>
+<p>In GNU <code class="code">troff</code>, arbitrary syntactical space around and within this
+command is allowed. Only when a preceding command on the same line ends
+with an argument of variable length is a separating space obligatory.
+In <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>, large clusters of these and other
+commands are used, mostly without spaces; this made such output almost
+unreadable.
+</p></dd>
+</dl>
+
+<p>For modern high-resolution devices, this command does not make sense
+because the width of the glyphs can become much larger than two decimal
+digits. In <code class="code">gtroff</code>, this is only used for the devices <code class="code">X75</code>,
+<code class="code">X75-12</code>, <code class="code">X100</code>, and <code class="code">X100-12</code>. For other devices, the
+commands &lsquo;<samp class="samp">t</samp>&rsquo; and &lsquo;<samp class="samp">u</samp>&rsquo; provide a better functionality.
+</p>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Operator-Index.html b/doc/groff.html.node/Operator-Index.html
new file mode 100644
index 0000000..b70458f
--- /dev/null
+++ b/doc/groff.html.node/Operator-Index.html
@@ -0,0 +1,188 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Operator Index (The GNU Troff Manual)</title>
+
+<meta name="description" content="Operator Index (The GNU Troff Manual)">
+<meta name="keywords" content="Operator Index (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="index.html" rel="up" title="Top">
+<link href="Register-Index.html" rel="next" title="Register Index">
+<link href="Escape-Sequence-Index.html" rel="prev" title="Escape Sequence Index">
+<style type="text/css">
+<!--
+a.summary-letter-printindex {text-decoration: none}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+td.printindex-index-entry {vertical-align: top}
+td.printindex-index-section {vertical-align: top}
+th.entries-header-printindex {text-align:left}
+th.sections-header-printindex {text-align:left}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="appendix-level-extent" id="Operator-Index">
+<div class="nav-panel">
+<p>
+Next: <a href="Register-Index.html" accesskey="n" rel="next">Register Index</a>, Previous: <a href="Escape-Sequence-Index.html" accesskey="p" rel="prev">Escape Sequence Index</a>, Up: <a href="index.html" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h2 class="appendix" id="Operator-Index-1">Appendix D Operator Index</h2>
+
+<div class="printindex op-printindex">
+<table class="op-letters-header-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Operator-Index_op_symbol-1"><b>!</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-2"><b>%</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-3"><b>&amp;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-4"><b>(</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-5"><b>)</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-6"><b>*</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-7"><b>+</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-8"><b>-</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-9"><b>/</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-10"><b>:</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-11"><b>;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-12"><b>&lt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-13"><b>=</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-14"><b>&gt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-15"><b>|</b></a>
+</td></tr></table>
+<table class="op-entries-printindex" border="0">
+<tr><td></td><th class="entries-header-printindex">Index Entry</th><td>&nbsp;</td><th class="sections-header-printindex"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-1">!</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_0021"><code>!</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-2">%</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_0025"><code>%</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-3">&amp;</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_0026"><code>&amp;</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-4">(</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_0028"><code>(</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-5">)</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_0029"><code>)</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-6">*</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_002a"><code>*</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-7">+</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_002b"><code>+</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_002b-1"><code>+</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_002b-_0028unary_0029"><code>+ <span class="r">(unary)</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-8">-</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_002d"><code>-</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_002d-1"><code>-</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_002d-_0028unary_0029"><code>- <span class="r">(unary)</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-9">/</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_002f"><code>/</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-10">:</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_003a"><code>:</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-11">;</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_003b"><code>;</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-12">&lt;</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_003c"><code>&lt;</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_003c_003d"><code>&lt;=</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_003c_003f"><code>&lt;?</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-13">=</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_003d"><code>=</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_003d_003d"><code>==</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-14">&gt;</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_003e"><code>&gt;</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_003e_003d"><code>&gt;=</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_003e_003f"><code>&gt;?</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Operator-Index_op_symbol-15">|</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Numeric-Expressions.html#index-_007c"><code>|</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Numeric-Expressions.html">Numeric Expressions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table class="op-letters-footer-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Operator-Index_op_symbol-1"><b>!</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-2"><b>%</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-3"><b>&amp;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-4"><b>(</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-5"><b>)</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-6"><b>*</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-7"><b>+</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-8"><b>-</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-9"><b>/</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-10"><b>:</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-11"><b>;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-12"><b>&lt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-13"><b>=</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-14"><b>&gt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Operator-Index_op_symbol-15"><b>|</b></a>
+</td></tr></table>
+</div>
+
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Register-Index.html">Register Index</a>, Previous: <a href="Escape-Sequence-Index.html">Escape Sequence Index</a>, Up: <a href="index.html">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Operators-in-Conditionals.html b/doc/groff.html.node/Operators-in-Conditionals.html
new file mode 100644
index 0000000..a04b761
--- /dev/null
+++ b/doc/groff.html.node/Operators-in-Conditionals.html
@@ -0,0 +1,222 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Operators in Conditionals (The GNU Troff Manual)</title>
+
+<meta name="description" content="Operators in Conditionals (The GNU Troff Manual)">
+<meta name="keywords" content="Operators in Conditionals (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Conditionals-and-Loops.html" rel="up" title="Conditionals and Loops">
+<link href="if_002dthen.html" rel="next" title="if-then">
+<link href="Conditionals-and-Loops.html" rel="prev" title="Conditionals and Loops">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span:hover a.copiable-link {visibility: visible}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Operators-in-Conditionals">
+<div class="nav-panel">
+<p>
+Next: <a href="if_002dthen.html" accesskey="n" rel="next">if-then</a>, Previous: <a href="Conditionals-and-Loops.html" accesskey="p" rel="prev">Conditionals and Loops</a>, Up: <a href="Conditionals-and-Loops.html" accesskey="u" rel="up">Conditionals and Loops</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Operators-in-Conditionals-1">5.23.1 Operators in Conditionals</h4>
+
+<a class="index-entry-id" id="index-if-request_002c-operators-to-use-with"></a>
+<a class="index-entry-id" id="index-ie-request_002c-operators-to-use-with"></a>
+<a class="index-entry-id" id="index-while-request_002c-operators-to-use-with"></a>
+<a class="index-entry-id" id="index-conditional-expressions"></a>
+<a class="index-entry-id" id="index-expressions_002c-conditional"></a>
+<p>In <code class="code">if</code>, <code class="code">ie</code>, and <code class="code">while</code> requests, in addition to the
+numeric expressions described in <a class="ref" href="Numeric-Expressions.html">Numeric Expressions</a>, several
+Boolean operators are available; the members of this expanded class are
+termed <em class="dfn">conditional expressions</em>.
+</p>
+<dl class="table">
+<dt><code class="code">c <var class="var">glyph</var></code></dt>
+<dd><p>True if <var class="var">glyph</var> is available, where <var class="var">glyph</var> is an ordinary
+character, a special character &lsquo;<samp class="samp">\(<var class="var">xx</var></samp>&rsquo; or &lsquo;<samp class="samp">\[<var class="var">xxx</var>]</samp>&rsquo;,
+&lsquo;<samp class="samp">\N'<var class="var">xxx</var>'</samp>&rsquo;, or has been defined by any of the <code class="code">char</code>,
+<code class="code">fchar</code>, <code class="code">fschar</code>, or <code class="code">schar</code> requests.
+</p>
+</dd>
+<dt><code class="code">d <var class="var">name</var></code></dt>
+<dd><p>True if a string, macro, diversion, or request called <var class="var">name</var> exists.
+</p>
+</dd>
+<dt><code class="code">e</code></dt>
+<dd><p>True if the current page is even-numbered.
+</p>
+</dd>
+<dt><code class="code">F <var class="var">font</var></code></dt>
+<dd><p>True if <var class="var">font</var> exists. <var class="var">font</var> is handled as if it were opened
+with the <code class="code">ft</code> request (that is, font translation and styles are
+applied), without actually mounting it.
+</p>
+</dd>
+<dt><code class="code">m <var class="var">color</var></code></dt>
+<dd><p>True if <var class="var">color</var> is defined.
+</p>
+</dd>
+<dt id='index-conditional-output-for-terminal-_0028TTY_0029'><span><code class="code">n</code><a class="copiable-link" href='#index-conditional-output-for-terminal-_0028TTY_0029'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-TTY_002c-conditional-output-for"></a>
+<a class="index-entry-id" id="index-terminal_002c-conditional-output-for"></a>
+<p>True if the document is being processed in <code class="code">nroff</code> mode.
+See <a class="xref" href="troff-and-nroff-Modes.html"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a>.
+</p>
+</dd>
+<dt><code class="code">o</code></dt>
+<dd><p>True if the current page is odd-numbered.
+</p>
+</dd>
+<dt><code class="code">r <var class="var">register</var></code></dt>
+<dd><p>True if <var class="var">register</var> exists.
+</p>
+</dd>
+<dt><code class="code">S <var class="var">style</var></code></dt>
+<dd><p>True if <var class="var">style</var> is available for the current font family. Font
+translation is applied.
+</p>
+</dd>
+<dt><code class="code">t</code></dt>
+<dd><p>True if the document is being processed in <code class="code">troff</code> mode.
+See <a class="xref" href="troff-and-nroff-Modes.html"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a>.
+</p>
+<a class="index-entry-id" id="index-vtroff"></a>
+</dd>
+<dt><code class="code">v</code></dt>
+<dd><p>Always false. This condition is recognized only for compatibility with
+certain other <code class="code">troff</code> implementations.<a class="footnote" id="DOCF88" href="groff.html_fot.html#FOOT88"><sup>88</sup></a>
+</p></dd>
+</dl>
+
+<p>If the first argument to an <code class="code">if</code>, <code class="code">ie</code>, or <code class="code">while</code>
+request begins with a non-alphanumeric character apart from <code class="code">!</code>
+(see below); it performs an <i class="slanted">output comparison test</i>.
+<a class="footnote" id="DOCF89" href="groff.html_fot.html#FOOT89"><sup>89</sup></a>
+</p>
+<a class="index-entry-id" id="index-output-comparison-operator"></a>
+<dl class="table">
+<dt><code class="code"><code class="code">'</code><var class="var">xxx</var><code class="code">'</code><var class="var">yyy</var><code class="code">'</code></code></dt>
+<dd><p>True if formatting the comparands <var class="var">xxx</var> and <var class="var">yyy</var> produces the
+same output commands. The delimiter need not be a neutral apostrophe:
+the output comparison operator accepts the same delimiters as most
+escape sequences; see <a class="ref" href="Delimiters.html">Delimiters</a>. This <em class="dfn">output comparison
+operator</em> formats <var class="var">xxx</var> and <var class="var">yyy</var> in separate environments;
+after the comparison, the resulting data are discarded.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ie &quot;|&quot;\fR|\fP&quot; true
+.el false
+ &rArr; true
+</pre></div></div>
+
+<p>The resulting glyph properties, including font family, style, size, and
+slant, must match, but not necessarily the requests and/or escape
+sequences used to obtain them. In the previous example, &lsquo;<samp class="samp">|</samp>&rsquo; and
+&lsquo;<samp class="samp">\fR|\fP</samp>&rsquo; result in &lsquo;<samp class="samp">|</samp>&rsquo; glyphs in the same typefaces at the
+same positions, so the comparands are equal. If &lsquo;<samp class="samp">.ft&nbsp;I</samp>&rsquo; had
+been added before the &lsquo;<samp class="samp">.ie</samp>&rsquo;, they would differ: the first &lsquo;<samp class="samp">|</samp>&rsquo;
+would produce an italic &lsquo;<samp class="samp">|</samp>&rsquo;, not a roman one. Motions must match
+in orientation and magnitude to within the applicable horizontal and
+vertical motion quanta of the device, after rounding. &lsquo;<samp class="samp">.if
+&quot;\u\d&quot;\v'0'&quot;</samp>&rsquo; is false even though both comparands result in zero net
+motion, because motions are not interpreted or optimized but sent as-is
+to the output.<a class="footnote" id="DOCF90" href="groff.html_fot.html#FOOT90"><sup>90</sup></a> On the other hand, &lsquo;<samp class="samp">.if &quot;\d&quot;\v'0.5m'&quot;</samp>&rsquo; is true, because
+<code class="code">\d</code> is defined as a downward motion of one-half em.<a class="footnote" id="DOCF91" href="groff.html_fot.html#FOOT91"><sup>91</sup></a>
+</p>
+<a class="index-entry-id" id="index-string-comparison"></a>
+<a class="index-entry-id" id="index-comparison-of-strings"></a>
+<p>Surround the comparands with <code class="code">\?</code> to avoid formatting them; this
+causes them to be compared character by character, as with string
+comparisons in other programming languages.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ie &quot;\?|\?&quot;\?\fR|\fP\?&quot; true
+.el false
+ &rArr; false
+</pre></div></div>
+
+<a class="index-entry-id" id="index-_005c_003f_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-_005c_003f"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-_005c_003f"></a>
+<p>Since comparands protected with <code class="code">\?</code> are read in copy mode
+(see <a class="pxref" href="Copy-Mode.html">Copy Mode</a>), they need not even be valid <code class="code">groff</code> syntax.
+The escape character is still lexically recognized, however, and
+consumes the next character.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds a \[
+.ds b \[
+.if '\?\*a\?'\?\*b\?' a and b equivalent
+.if '\?\\?'\?\\?' backslashes equivalent
+ &rArr; a and b equivalent
+</pre></div></div>
+</dd>
+</dl>
+
+<p>The above operators can&rsquo;t be combined with most others, but a leading
+&lsquo;<samp class="samp">!</samp>&rsquo;, not followed immediately by spaces or tabs, complements an
+expression.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr x 1
+.ie !r x register x is not defined
+.el register x is defined
+ &rArr; register x is defined
+</pre></div></div>
+
+<p>Spaces and tabs are optional immediately after the &lsquo;<samp class="samp">c</samp>&rsquo;, &lsquo;<samp class="samp">d</samp>&rsquo;,
+&lsquo;<samp class="samp">F</samp>&rsquo;, &lsquo;<samp class="samp">m</samp>&rsquo;, &lsquo;<samp class="samp">r</samp>&rsquo;, and &lsquo;<samp class="samp">S</samp>&rsquo; operators, but right after
+&lsquo;<samp class="samp">!</samp>&rsquo;, they end the predicate and the conditional evaluates
+true.<a class="footnote" id="DOCF92" href="groff.html_fot.html#FOOT92"><sup>92</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr x 1
+.ie ! r x register x is not defined
+.el register x is defined
+ &rArr; r x register x is not defined
+</pre></div></div>
+
+<p>The unexpected &lsquo;<samp class="samp">r x</samp>&rsquo; in the output is a clue that our conditional
+was not interpreted as we planned, but matters may not always be so
+obvious.
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="if_002dthen.html">if-then</a>, Previous: <a href="Conditionals-and-Loops.html">Conditionals and Loops</a>, Up: <a href="Conditionals-and-Loops.html">Conditionals and Loops</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Optional-man-extensions.html b/doc/groff.html.node/Optional-man-extensions.html
new file mode 100644
index 0000000..035f410
--- /dev/null
+++ b/doc/groff.html.node/Optional-man-extensions.html
@@ -0,0 +1,264 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Optional man extensions (The GNU Troff Manual)</title>
+
+<meta name="description" content="Optional man extensions (The GNU Troff Manual)">
+<meta name="keywords" content="Optional man extensions (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="man.html" rel="up" title="man">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Optional-man-extensions">
+<div class="nav-panel">
+<p>
+Up: <a href="man.html" accesskey="u" rel="up"><samp class="file">man</samp></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Optional-man-extensions-1">4.1.1 Optional <samp class="file">man</samp> extensions</h4>
+
+<a class="index-entry-id" id="index-man_002elocal"></a>
+<p>Use the file <samp class="file">man.local</samp> for local extensions to the <code class="code">man</code>
+macros or for style changes.
+</p>
+<ul class="mini-toc">
+<li><a href="#Custom-headers-and-footers" accesskey="1">Custom headers and footers</a></li>
+<li><a href="#Ultrix_002dspecific-man-macros" accesskey="2">Ultrix-specific man macros</a></li>
+<li><a href="#Simple-example" accesskey="3">Simple example</a></li>
+</ul>
+<div class="unnumberedsubsubsec-level-extent" id="Custom-headers-and-footers">
+<h4 class="unnumberedsubsubsec">Custom headers and footers</h4>
+<a class="index-entry-id" id="index-man-macros_002c-custom-headers-and-footers"></a>
+
+<p>In <code class="code">groff</code> versions 1.18.2 and later, you can specify custom
+headers and footers by redefining the following macros in
+<samp class="file">man.local</samp>.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002ePT"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.PT</code></strong><a class="copiable-link" href='#index-_002ePT'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PT-_005bman_005d"></a>
+<p>Control the content of the headers. Normally, the header prints the
+command name and section number on either side, and the optional fifth
+argument to <code class="code">TH</code> in the center.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eBT"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.BT</code></strong><a class="copiable-link" href='#index-_002eBT'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-BT-_005bman_005d"></a>
+<p>Control the content of the footers. Normally, the footer prints the
+page number and the third and fourth arguments to <code class="code">TH</code>.
+</p>
+<p>Use the <code class="code">FT</code> register to specify the footer position. The default
+is &minus;0.5<span class="dmn">i</span>.
+</p></dd></dl>
+
+</div>
+<div class="unnumberedsubsubsec-level-extent" id="Ultrix_002dspecific-man-macros">
+<h4 class="unnumberedsubsubsec">Ultrix-specific man macros</h4>
+<a class="index-entry-id" id="index-Ultrix_002dspecific-man-macros"></a>
+<a class="index-entry-id" id="index-man-macros_002c-Ultrix_002dspecific"></a>
+
+<a class="index-entry-id" id="index-man_002eultrix"></a>
+<p>The <code class="code">groff</code> source distribution includes a file named
+<samp class="file">man.ultrix</samp>, containing macros compatible with the Ultrix variant
+of <code class="code">man</code>. Copy this file into <samp class="file">man.local</samp> (or use the
+<code class="code">mso</code> request to load it) to enable the following macros.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eCT"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.CT</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">key</i></span></var><a class="copiable-link" href='#index-_002eCT'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-CT-_005bman_005d"></a>
+<p>Print &lsquo;<samp class="samp">&lt;CTRL/<var class="var">key</var>&gt;</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eCW"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.CW</code></strong><a class="copiable-link" href='#index-_002eCW'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-CW-_005bman_005d"></a>
+<p>Print subsequent text using a &ldquo;constant-width&rdquo; (monospaced) typeface
+(Courier roman).
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eDs"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.Ds</code></strong><a class="copiable-link" href='#index-_002eDs'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-Ds-_005bman_005d"></a>
+<p>Begin a non-filled display.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eDe"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.De</code></strong><a class="copiable-link" href='#index-_002eDe'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-De-_005bman_005d"></a>
+<p>End a non-filled display started with <code class="code">Ds</code>.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eEX"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.EX</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">indent</i></span>]</var><a class="copiable-link" href='#index-_002eEX'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-EX-_005bman_005d"></a>
+<p>Begin a non-filled display using a monospaced typeface (Courier roman).
+Use the optional <var class="var">indent</var> argument to indent the display.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eEE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.EE</code></strong><a class="copiable-link" href='#index-_002eEE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-EE-_005bman_005d"></a>
+<p>End a non-filled display started with <code class="code">EX</code>.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eG"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.G</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span>]</var><a class="copiable-link" href='#index-_002eG'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-G-_005bman_005d"></a>
+<p>Set <var class="var">text</var> in Helvetica. If no text is present on the line where
+the macro is called, then the text of the next line appears in
+Helvetica.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eGL"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.GL</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span>]</var><a class="copiable-link" href='#index-_002eGL'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-GL-_005bman_005d"></a>
+<p>Set <var class="var">text</var> in Helvetica oblique. If no text is present on the line
+where the macro is called, then the text of the next line appears in
+Helvetica Oblique.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eHB"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.HB</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span>]</var><a class="copiable-link" href='#index-_002eHB'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-HB-_005bman_005d"></a>
+<p>Set <var class="var">text</var> in Helvetica bold. If no text is present on the line
+where the macro is called, then all text up to the next <code class="code">HB</code>
+appears in Helvetica bold.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eTB"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.TB</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span>]</var><a class="copiable-link" href='#index-_002eTB'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-TB-_005bman_005d"></a>
+<p>Identical to <code class="code">HB</code>.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eMS"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.MS</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">title</i></span> <span class="r"><i class="slanted">sect</i></span> [<span class="r"><i class="slanted">punct</i></span>]</var><a class="copiable-link" href='#index-_002eMS'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MS-_005bman_005d"></a>
+<p>Set a man page reference in Ultrix format. The <var class="var">title</var> is in
+Courier instead of italic. Optional punctuation follows the section
+number without an intervening space.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eNT"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.NT</code></strong> <var class="def-var-arguments">[<code class="code">C</code>] [<span class="r"><i class="slanted">title</i></span>]</var><a class="copiable-link" href='#index-_002eNT'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-NT-_005bman_005d"></a>
+<p>Begin a note. Print the optional <span class="r"><i class="slanted">title</i></span>, or the word &ldquo;Note&rdquo;,
+centered on the page. Text following the macro makes up the body of the
+note, and is indented on both sides. If the first argument is <code class="code">C</code>,
+the body of the note is printed centered (the second argument replaces
+the word &ldquo;Note&rdquo; if specified).
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eNE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.NE</code></strong><a class="copiable-link" href='#index-_002eNE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-NE-_005bman_005d"></a>
+<p>End a note begun with <code class="code">NT</code>.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002ePN"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.PN</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">path</i></span> [<span class="r"><i class="slanted">punct</i></span>]</var><a class="copiable-link" href='#index-_002ePN'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PN-_005bman_005d"></a>
+<p>Set the path name in a monospaced typeface (Courier roman), followed by
+optional punctuation.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002ePn"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.Pn</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">punct</i></span>] <span class="r"><i class="slanted">path</i></span> [<span class="r"><i class="slanted">punct</i></span>]</var><a class="copiable-link" href='#index-_002ePn'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-Pn-_005bman_005d"></a>
+<p>If called with two arguments, identical to <code class="code">PN</code>. If called with
+three arguments, set the second argument in a monospaced typeface
+(Courier roman), bracketed by the first and third arguments in the
+current font.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eR"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.R</code></strong><a class="copiable-link" href='#index-_002eR'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-R-_005bman_005d"></a>
+<p>Switch to roman font and turn off any underlining in effect.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eRN"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.RN</code></strong><a class="copiable-link" href='#index-_002eRN'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-RN-_005bman_005d"></a>
+<p>Print the string &lsquo;<samp class="samp">&lt;RETURN&gt;</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eVS"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.VS</code></strong> <var class="def-var-arguments">[<code class="code">4</code>]</var><a class="copiable-link" href='#index-_002eVS'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-VS-_005bman_005d"></a>
+<p>Start printing a change bar in the margin if the number&nbsp;<code class="code">4</code> is
+specified. Otherwise, this macro does nothing.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eVE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.VE</code></strong><a class="copiable-link" href='#index-_002eVE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-VE-_005bman_005d"></a>
+<p>End printing the change bar begun by <code class="code">VS</code>.
+</p></dd></dl>
+
+</div>
+<div class="unnumberedsubsubsec-level-extent" id="Simple-example">
+<h4 class="unnumberedsubsubsec">Simple example</h4>
+
+<p>The following example <samp class="file">man.local</samp> file alters the <code class="code">SH</code> macro
+to add some extra vertical space before printing the heading. Headings
+are printed in Helvetica bold.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.\&quot; Make the heading fonts Helvetica
+.ds HF HB
+.
+.\&quot; Put more space in front of headings.
+.rn SH SH-orig
+.de SH
+. if t .sp (u;\\n[PD]*2)
+. SH-orig \\$*
+..
+</pre></div></div>
+
+
+
+</div>
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Up: <a href="man.html"><samp class="file">man</samp></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Other-Differences.html b/doc/groff.html.node/Other-Differences.html
new file mode 100644
index 0000000..6a92cad
--- /dev/null
+++ b/doc/groff.html.node/Other-Differences.html
@@ -0,0 +1,248 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Other Differences (The GNU Troff Manual)</title>
+
+<meta name="description" content="Other Differences (The GNU Troff Manual)">
+<meta name="keywords" content="Other Differences (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Implementation-Differences.html" rel="up" title="Implementation Differences">
+<link href="Compatibility-Mode.html" rel="prev" title="Compatibility Mode">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+kbd.key {font-style: normal}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Other-Differences">
+<div class="nav-panel">
+<p>
+Previous: <a href="Compatibility-Mode.html" accesskey="p" rel="prev">Compatibility Mode</a>, Up: <a href="Implementation-Differences.html" accesskey="u" rel="up">Implementation Differences</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Other-Differences-1">5.38.3 Other Differences</h4>
+
+<p><code class="code">groff</code> request names unrecognized by other <code class="code">troff</code>
+implementations will likely be ignored by them; escape sequences that
+are <code class="code">groff</code> extensions are liable to be interpreted as if the
+escape character were not present.
+<a class="index-entry-id" id="index-_005c_007e_002c-incompatibilities-with-AT_0026T-troff"></a>
+For example, the adjustable, non-breaking escape sequence <code class="code">\~</code>
+is also supported by Heirloom Doctools <code class="code">troff</code> 050915 (September
+2005), <code class="code">mandoc</code> 1.9.5 (2009-09-21), <code class="code">neatroff</code> (commit
+1c6ab0f6e, 2016-09-13), and Plan&nbsp;9 from User Space <code class="code">troff</code>
+(commit 93f8143600, 2022-08-12), but not by Solaris or Documenter&rsquo;s
+Workbench <code class="code">troff</code>s.
+See <a class="xref" href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a>.
+</p>
+<a class="index-entry-id" id="index-_005cA_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_007c_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_005e_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_0026_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_007b_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_007d_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005cSP_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_0027_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_0060_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_002d_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_005f_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_0021_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_0025_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005cc_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>GNU <code class="code">troff</code> does not allow the use of the escape sequences
+<code class="code">\|</code>, <code class="code">\^</code>, <code class="code">\&amp;</code>, <code class="code">\{</code>, <code class="code">\}</code>,
+<code class="code">\<kbd class="key">SP</kbd></code>, <code class="code">\'</code>, <code class="code">\`</code>, <code class="code">\-</code>, <code class="code">\_</code>, <code class="code">\!</code>,
+<code class="code">\%</code>, and <code class="code">\c</code> in identifiers; <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>
+does. The <code class="code">\A</code> escape sequence (see <a class="pxref" href="Identifiers.html">Identifiers</a>) may be
+helpful in avoiding use of these escape sequences in names.
+</p>
+<a class="index-entry-id" id="index-adjustment-to-both-margins_002c-difference-from-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-rivers"></a>
+<p>When adjusting to both margins, <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> at first
+adjusts spaces starting from the right; GNU <code class="code">troff</code> begins from
+the left. Both implementations adjust spaces from opposite ends on
+alternating output lines in this adjustment mode to prevent &ldquo;rivers&rdquo;
+in the text.
+</p>
+<a class="index-entry-id" id="index-hyphenation_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>GNU <code class="code">troff</code> does not always hyphenate words as <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code> does. The <abbr class="acronym">AT&amp;T</abbr> implementation uses a set of
+hard-coded rules specific to English, while GNU <code class="code">troff</code> uses
+language-specific hyphenation pattern files derived from TeX.
+Furthermore, in old versions of <code class="code">troff</code> there was a limited amount
+of space to store hyphenation exceptions (arguments to the <code class="code">hw</code>
+request); GNU <code class="code">troff</code> has no such restriction.
+</p>
+<a class="index-entry-id" id="index-output-device-name-string-_0028_002eT_0029_002c-in-other-implementations"></a>
+<p>GNU <code class="code">troff</code> predefines a string <code class="code">.T</code> containing the argument
+given to the <samp class="option">-T</samp> command-line option, namely the current output
+device (for example, &lsquo;<samp class="samp">pdf</samp>&rsquo; or &lsquo;<samp class="samp">utf8</samp>&rsquo;). The existence of this
+string is a common feature of post-CSTR&nbsp;#54
+<code class="code">troff</code>s<a class="footnote" id="DOCF121" href="groff.html_fot.html#FOOT121"><sup>121</sup></a> but valid values are specific
+to each implementation.
+</p>
+<a class="index-entry-id" id="index-removal-of-read_002donly-registers_002c-incompatibility-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-register_002c-read_002donly_002c-removal_002c-incompatibility-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-read_002donly-register-removal_002c-incompatibility-with-AT_0026T-troff"></a>
+<p><abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> ignored attempts to remove read-only
+registers; GNU <code class="code">troff</code> honors such requests. See <a class="xref" href="Built_002din-Registers.html">Built-in Registers</a>.
+</p>
+<a class="index-entry-id" id="index-output-device-usage-register-_0028_002eT_0029_002c-incompatibility-with-AT_0026T-troff"></a>
+<p>The (read-only) register <code class="code">.T</code> interpolates&nbsp;1 if GNU
+<code class="code">troff</code> is called with the <samp class="option">-T</samp> command-line option, and
+0&nbsp;otherwise. This behavior differs from AT&amp;T <code class="code">troff</code>, which
+interpolated&nbsp;1 only if <code class="code">nroff</code> was the formatter and was
+called with <samp class="option">-T</samp>.
+</p>
+<a class="index-entry-id" id="index-lf-request_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p><abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> and other implementations handle the
+<code class="code">lf</code> request differently. For them, its <var class="var">line</var> argument
+changes the line number of the <em class="emph">current</em> line.
+</p>
+<a class="index-entry-id" id="index-environment-availability-and-naming_002c-incompatibilities-with"></a>
+<p><abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> had only environments named &lsquo;<samp class="samp">0</samp>&rsquo;,
+&lsquo;<samp class="samp">1</samp>&rsquo;, and &lsquo;<samp class="samp">2</samp>&rsquo;. In GNU <code class="code">troff</code>, any number of environments
+may exist, using any valid identifiers for their names
+(see <a class="pxref" href="Identifiers.html">Identifiers</a>.)
+</p>
+<a class="index-entry-id" id="index-fractional-point-sizes-1"></a>
+<a class="index-entry-id" id="index-fractional-type-sizes-1"></a>
+<a class="index-entry-id" id="index-point-sizes_002c-fractional-1"></a>
+<a class="index-entry-id" id="index-type-sizes_002c-fractional-1"></a>
+<a class="index-entry-id" id="index-sizes_002c-fractional"></a>
+<a class="index-entry-id" id="index-ps-request_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>Fractional type sizes cause one noteworthy incompatibility. In
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> the <code class="code">ps</code> request ignores scaling units
+and thus &lsquo;<samp class="samp">.ps 10u</samp>&rsquo; sets the type size to 10&nbsp;points, whereas in
+GNU <code class="code">troff</code> it sets the type size to 10&nbsp;<em class="emph">scaled</em> points.
+See <a class="xref" href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a>.
+</p>
+<a class="index-entry-id" id="index-ab-request_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>The <code class="code">ab</code> request differs from <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>:
+GNU <code class="code">troff</code> writes no message to the standard error stream if no
+arguments are given, and it exits with a failure status instead of a
+successful one.
+</p>
+<a class="index-entry-id" id="index-bp-request_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>The <code class="code">bp</code> request differs from <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>:
+GNU <code class="code">troff</code> does not accept a scaling unit on the argument, a page
+number; the former (somewhat uselessly) does.
+</p>
+<a class="index-entry-id" id="index-pm-request_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>The <code class="code">pm</code> request differs from <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>:
+GNU <code class="code">troff</code> reports the sizes of macros, strings, and diversions in
+bytes and ignores an argument to report only the sum of the sizes.
+</p>
+<a class="index-entry-id" id="index-ss-request_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>Unlike <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>, GNU <code class="code">troff</code> does not ignore the
+<code class="code">ss</code> request if the output is a terminal device; instead, the
+values of minimal inter-word and additional inter-sentence space are
+each rounded down to the nearest multiple of&nbsp;12.
+</p>
+<a class="index-entry-id" id="index-bd-request_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-cs-request_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-tr-request_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-fp-request_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-input-characters-and-output-glyphs_002c-compatibility-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-output-glyphs_002c-and-input-characters_002c-compatibility-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-characters_002c-input_002c-and-output-glyphs_002c-compatibility-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-glyphs_002c-output_002c-and-input-characters_002c-compatibility-with-AT_0026T-troff"></a>
+<p>In GNU <code class="code">troff</code> there is a fundamental difference between
+(unformatted) characters and (formatted) glyphs. Everything that
+affects how a glyph is output is stored with the glyph node; once a
+glyph node has been constructed, it is unaffected by any subsequent
+requests that are executed, including <code class="code">bd</code>, <code class="code">cs</code>, <code class="code">tkf</code>,
+<code class="code">tr</code>, or <code class="code">fp</code> requests. Normally, glyphs are constructed from
+characters immediately before the glyph is added to an output line.
+Macros, diversions, and strings are all, in fact, the same type of
+object; they contain a sequence of intermixed character and glyph nodes.
+Special characters transform from one to the other: before being added
+to the output, they behave as characters; afterward, they are glyphs. A
+glyph node does not behave like a character node when it is processed by
+a macro: it does not inherit any of the special properties that the
+character from which it was constructed might have had. For example,
+the input
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.di x
+\\\\
+.br
+.di
+.x
+</pre></div></div>
+
+<p>produces &lsquo;<samp class="samp">\\</samp>&rsquo; in GNU <code class="code">troff</code>. Each pair of backslashes
+becomes one backslash <em class="emph">glyph</em>; the resulting backslashes are thus
+not interpreted as escape <em class="emph">characters</em> when they are reread as the
+diversion is output. <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> <em class="emph">would</em> interpret
+them as escape characters when rereading them and end up printing one
+&lsquo;<samp class="samp">\</samp>&rsquo;.
+</p>
+<a class="index-entry-id" id="index-printing-backslash-_0028_005c_005c_002c-_005ce_002c-_005cE_002c-_005c_005brs_005d_0029"></a>
+<a class="index-entry-id" id="index-backslash_002c-printing-_0028_005c_005c_002c-_005ce_002c-_005cE_002c-_005c_005brs_005d_0029"></a>
+<a class="index-entry-id" id="index-_005ce_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-_005c_0021_002c-incompatibilities-with-AT_0026T-troff-1"></a>
+<a class="index-entry-id" id="index-_005c_003f_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-transparent-output_002c-incompatibilities-with-AT_0026T-troff"></a>
+<a class="index-entry-id" id="index-output_002c-transparent_002c-incompatibilities-with-AT_0026T-troff"></a>
+<p>One correct way to obtain a printable backslash in most documents is to
+use the <code class="code">\e</code> escape sequence; this always prints a single instance
+of the current escape character,<a class="footnote" id="DOCF122" href="groff.html_fot.html#FOOT122"><sup>122</sup></a> regardless of whether or not it is used in a diversion; it
+also works in both GNU <code class="code">troff</code> and <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>.
+</p>
+<p>The other correct way, appropriate in contexts independent of the
+backslash&rsquo;s common use as a <code class="code">troff</code> escape character&mdash;perhaps in
+discussion of character sets or other programming languages&mdash;is
+the character escape <code class="code">\(rs</code> or <code class="code">\[rs]</code>, for &ldquo;reverse
+solidus&rdquo;, from its name in the <abbr class="acronym">ECMA-6</abbr> (<abbr class="acronym">ISO/IEC</abbr> 646)
+standard.<a class="footnote" id="DOCF123" href="groff.html_fot.html#FOOT123"><sup>123</sup></a>
+</p>
+<p>To store an escape sequence in a diversion that is interpreted when the
+diversion is reread, either use the traditional <code class="code">\!</code> transparent
+output facility, or, if this is unsuitable, the new <code class="code">\?</code> escape
+sequence. See <a class="xref" href="Diversions.html">Diversions</a> and <a class="ref" href="Gtroff-Internals.html"><code class="code">gtroff</code> Internals</a>.
+</p>
+<p>In the somewhat pathological case where a diversion exists containing a
+partially collected line and a partially collected line at the top-level
+diversion has never existed, <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> will output the
+partially collected line at the end of input; GNU <code class="code">troff</code> will not.
+</p>
+
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Previous: <a href="Compatibility-Mode.html">Compatibility Mode</a>, Up: <a href="Implementation-Differences.html">Implementation Differences</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Output-Device-Intro.html b/doc/groff.html.node/Output-Device-Intro.html
new file mode 100644
index 0000000..815a509
--- /dev/null
+++ b/doc/groff.html.node/Output-Device-Intro.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Output Device Intro (The GNU Troff Manual)</title>
+
+<meta name="description" content="Output Device Intro (The GNU Troff Manual)">
+<meta name="keywords" content="Output Device Intro (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Introduction.html" rel="up" title="Introduction">
+<link href="Installation.html" rel="next" title="Installation">
+<link href="Preprocessor-Intro.html" rel="prev" title="Preprocessor Intro">
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Output-Device-Intro">
+<div class="nav-panel">
+<p>
+Next: <a href="Installation.html" accesskey="n" rel="next">Installation</a>, Previous: <a href="Preprocessor-Intro.html" accesskey="p" rel="prev">Preprocessors</a>, Up: <a href="Introduction.html" accesskey="u" rel="up">Introduction</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Output-Devices">1.6 Output Devices</h3>
+<a class="index-entry-id" id="index-postprocessors"></a>
+<a class="index-entry-id" id="index-output-devices"></a>
+<a class="index-entry-id" id="index-devices-for-output"></a>
+
+<p>GNU <code class="code">troff</code>&rsquo;s output is in a device-independent page description
+language, which is then read by an <em class="dfn">output driver</em> that translates
+this language into a file format or byte stream that a piece of
+(possibly emulated) hardware understands. <code class="code">groff</code> features output
+drivers for PostScript devices, terminal emulators (and other simple
+typewriter-like machines), X11 (for previewing), TeX DVI, HP
+LaserJet&nbsp;4/PCL5 and Canon LBP printers (which use <abbr class="acronym">CaPSL</abbr>),
+<abbr class="acronym">HTML</abbr>, <abbr class="acronym">XHTML</abbr>, and <abbr class="acronym">PDF</abbr>.
+</p>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Output-Language-Compatibility.html b/doc/groff.html.node/Output-Language-Compatibility.html
new file mode 100644
index 0000000..4ad971f
--- /dev/null
+++ b/doc/groff.html.node/Output-Language-Compatibility.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Output Language Compatibility (The GNU Troff Manual)</title>
+
+<meta name="description" content="Output Language Compatibility (The GNU Troff Manual)">
+<meta name="keywords" content="Output Language Compatibility (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="gtroff-Output.html" rel="up" title="gtroff Output">
+<link href="Intermediate-Output-Examples.html" rel="prev" title="Intermediate Output Examples">
+<style type="text/css">
+<!--
+ul.mark-bullet {list-style-type: disc}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Output-Language-Compatibility">
+<div class="nav-panel">
+<p>
+Previous: <a href="Intermediate-Output-Examples.html" accesskey="p" rel="prev">Intermediate Output Examples</a>, Up: <a href="gtroff-Output.html" accesskey="u" rel="up"><code class="code">gtroff</code> Output</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Output-Language-Compatibility-1">6.1.4 Output Language Compatibility</h4>
+
+<p>The intermediate output language of <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> was
+first documented in <cite class="cite">A Typesetter-independent TROFF</cite>, by Brian
+Kernighan, and by 1992 the <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> manual was
+updated to incorprate a description of it.
+</p>
+<p>The GNU <code class="code">troff</code> intermediate output format is compatible with this
+specification except for the following features.
+</p>
+<ul class="itemize mark-bullet">
+<li>The classical quasi-device independence is not yet implemented.
+
+</li><li>The old hardware was very different from what we use today. So the
+<code class="code">groff</code> devices are also fundamentally different from the ones
+in <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>. For example, the <abbr class="acronym">AT&amp;T</abbr>
+PostScript device is called <code class="code">post</code> and has a resolution of only 720
+units per inch, suitable for printers 20 years ago, while <code class="code">groff</code>&rsquo;s
+<code class="code">ps</code> device has a resolution of 72000 units per inch. Maybe, by
+implementing some rescaling mechanism similar to the classical
+quasi-device independence, <code class="code">groff</code> could emulate <abbr class="acronym">AT&amp;T</abbr>&rsquo;s
+<code class="code">post</code> device.
+
+</li><li>The B-spline command &lsquo;<samp class="samp">D~</samp>&rsquo; is correctly handled by the intermediate
+output parser, but the drawing routines aren&rsquo;t implemented in some of
+the postprocessor programs.
+
+</li><li>The argument of the commands &lsquo;<samp class="samp">s</samp>&rsquo; and &lsquo;<samp class="samp">x&nbsp;H</samp>&rsquo;<!-- /@w --> has the
+implicit unit scaled point &lsquo;<samp class="samp">z</samp>&rsquo; in <code class="code">gtroff</code>, while
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> has point (&lsquo;<samp class="samp">p</samp>&rsquo;). This isn&rsquo;t an
+incompatibility but a compatible extension, for both units coincide for
+all devices without a <code class="code">sizescale</code> parameter in the <samp class="file">DESC</samp>
+file, including all postprocessors from <abbr class="acronym">AT&amp;T</abbr> and
+<code class="code">groff</code>&rsquo;s text devices. The few <code class="code">groff</code> devices with a
+<code class="code">sizescale</code> parameter either do not exist for <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code>, have a different name, or seem to have a different
+resolution. So conflicts are very unlikely.
+
+</li><li>The position changing after the commands &lsquo;<samp class="samp">Dp</samp>&rsquo;, &lsquo;<samp class="samp">DP</samp>&rsquo;, and
+&lsquo;<samp class="samp">Dt</samp>&rsquo; is illogical, but as old versions of <code class="code">gtroff</code> used this
+feature it is kept for compatibility reasons.
+
+
+</li></ul>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Previous: <a href="Intermediate-Output-Examples.html">Intermediate Output Examples</a>, Up: <a href="gtroff-Output.html"><code class="code">gtroff</code> Output</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Page-Control.html b/doc/groff.html.node/Page-Control.html
new file mode 100644
index 0000000..da2edc3
--- /dev/null
+++ b/doc/groff.html.node/Page-Control.html
@@ -0,0 +1,218 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Page Control (The GNU Troff Manual)</title>
+
+<meta name="description" content="Page Control (The GNU Troff Manual)">
+<meta name="keywords" content="Page Control (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Using-Fonts.html" rel="next" title="Using Fonts">
+<link href="Page-Layout.html" rel="prev" title="Page Layout">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Page-Control">
+<div class="nav-panel">
+<p>
+Next: <a href="Using-Fonts.html" accesskey="n" rel="next">Using Fonts</a>, Previous: <a href="Page-Layout.html" accesskey="p" rel="prev">Page Layout</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Page-Control-1">5.18 Page Control</h3>
+<a class="index-entry-id" id="index-page-control"></a>
+<a class="index-entry-id" id="index-control_002c-page"></a>
+
+<a class="index-entry-id" id="index-page-break-1"></a>
+<a class="index-entry-id" id="index-break_002c-page-1"></a>
+<a class="index-entry-id" id="index-page-ejection-1"></a>
+<a class="index-entry-id" id="index-ejection_002c-page-1"></a>
+<p>Discretionary page breaks can prevent the unwanted separation of
+content. A new page number takes effect during page ejection; see
+<a class="ref" href="The-Implicit-Page-Trap.html">The Implicit Page Trap</a>.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ebp"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.bp</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">page-number</i></span>]</var><a class="copiable-link" href='#index-_002ebp'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-bp"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002ebp-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.bp</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">page-number</i></span></var><a class="copiable-link" href='#index-_002ebp-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002ebp-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.bp</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">page-number</i></span></var><a class="copiable-link" href='#index-_002ebp-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_0025_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[%]</code></strong><a class="copiable-link" href='#index-_005cn_005b_0025_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_0025-2"></a>
+<a class="index-entry-id" id="index-new-page-_0028bp_0029"></a>
+<a class="index-entry-id" id="index-page_002c-new-_0028bp_0029"></a>
+<p>Break the page and change (increase or decrease) the next page number
+per the numeric expression <var class="var">page-number</var>. If <var class="var">page-number</var> is
+invalid, GNU <code class="code">troff</code> emits a warning in category &lsquo;<samp class="samp">number</samp>&rsquo; and
+ignores the argument. This request causes a break. A page break
+advances the vertical drawing position to the bottom of the page,
+springing traps. See <a class="xref" href="Page-Location-Traps.html">Page Location Traps</a>.
+<a class="index-entry-id" id="index-bp-request_002c-and-top_002dlevel-diversion"></a>
+<a class="index-entry-id" id="index-top_002dlevel-diversion_002c-and-bp"></a>
+<a class="index-entry-id" id="index-diversion_002c-top_002dlevel_002c-and-bp"></a>
+<code class="code">bp</code> has effect only if invoked within the top-level
+diversion.<a class="footnote" id="DOCF71" href="groff.html_fot.html#FOOT71"><sup>71</sup></a>
+<a class="index-entry-id" id="index-CSTR-_002354-errata-2"></a>
+<a class="index-entry-id" id="index-CSTR-_002354-erratum_002c-bp-request"></a>
+This request is incorrectly documented in the <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code> manual as having a default scaling unit of &lsquo;<samp class="samp">v</samp>&rsquo;.
+</p>
+<a class="index-entry-id" id="index-page-number-register-_0028_0025_0029"></a>
+<a class="index-entry-id" id="index-current-page-number-_0028_0025_0029"></a>
+<p>The register <code class="code">%</code> interpolates the current page number.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de BP
+' bp \&quot; schedule page break once current line is output
+..
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ene"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ne</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">space</i></span>]</var><a class="copiable-link" href='#index-_002ene'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ne"></a>
+<a class="index-entry-id" id="index-orphan-lines_002c-preventing-with-ne"></a>
+<a class="index-entry-id" id="index-conditional-page-break-_0028ne_0029"></a>
+<a class="index-entry-id" id="index-page-break_002c-conditional-_0028ne_0029"></a>
+<p>Force a page break if insufficient vertical space is available (assert
+&ldquo;needed&rdquo; space). <code class="code">ne</code> tests the distance to the next page
+location trap; see <a class="ref" href="Page-Location-Traps.html">Page Location Traps</a>, and breaks the page if
+that amount is less than <var class="var">space</var>. The default scaling unit is
+&lsquo;<samp class="samp">v</samp>&rsquo;. If <var class="var">space</var> is invalid, GNU <code class="code">troff</code> emits a warning
+in category &lsquo;<samp class="samp">number</samp>&rsquo; and ignores the argument. If <var class="var">space</var> is
+not specified, &lsquo;<samp class="samp">1v</samp>&rsquo; is assumed.
+</p>
+<a class="index-entry-id" id="index-widow"></a>
+<p>We can require space for at least the first two output lines of a
+paragraph, preventing its first line from being <i class="slanted">widowed</i> at the
+page bottom.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ne 2v
+Considering how common illness is,
+how tremendous the spiritual change that it brings,
+how astonishing,
+when the lights of health go down,
+the undiscovered countries that are then disclosed,
+what wastes and deserts of the soul a slight attack
+of influenza brings to view,
+</pre></div></div>
+
+<p>This method is reliable only if no output line is pending when <code class="code">ne</code>
+is invoked. When macro packages are used, this is often not the case:
+their paragraphing macros perform the break. You may need to experiment
+with placing the <code class="code">ne</code> after the paragraphing macro, or <code class="code">br</code>
+and <code class="code">ne</code> before it.
+</p>
+<a class="index-entry-id" id="index-orphan"></a>
+<a class="index-entry-id" id="index-widow-1"></a>
+<p><code class="code">ne</code> is also useful to force grouping of section headings with
+their subsequent paragraphs, or tables with their captions and/or
+explanations. Macro packages often use <code class="code">ne</code> with diversions to
+implement keeps and displays; see <a class="ref" href="Diversions.html">Diversions</a>. They may also offer
+parameters for widow and orphan management.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002esv"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.sv</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">space</i></span>]</var><a class="copiable-link" href='#index-_002esv'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-sv"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eos"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.os</code></strong><a class="copiable-link" href='#index-_002eos'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-os"></a>
+<a class="index-entry-id" id="index-ne-request_002c-comparison-with-sv"></a>
+<p>Require vertical space as <code class="code">ne</code> does, but also <i class="slanted">save</i> it for
+later output by the <code class="code">os</code> request. If <var class="var">space</var> is available
+before the next page location trap, it is output immediately. Both
+requests ignore a partially collected line, taking effect at the next
+break.
+<a class="index-entry-id" id="index-sv-request_002c-and-no_002dspace-mode"></a>
+<a class="index-entry-id" id="index-os-request_002c-and-no_002dspace-mode"></a>
+<code class="code">sv</code> and <code class="code">os</code> ignore no-space mode (recall <a class="ref" href="Manipulating-Spacing.html">Manipulating Spacing</a>). While the <code class="code">sv</code> request allows negative values for
+<var class="var">space</var>, <code class="code">os</code> ignores them. The default scaling unit is
+&lsquo;<samp class="samp">v</samp>&rsquo;. If <var class="var">space</var> is not specified, &lsquo;<samp class="samp">1v</samp>&rsquo; is assumed.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bnl_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[nl]</code></strong><a class="copiable-link" href='#index-_005cn_005bnl_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nl"></a>
+<a class="index-entry-id" id="index-vertical-drawing-position-_0028nl_0029"></a>
+<a class="index-entry-id" id="index-vertical-position_002c-drawing-_0028nl_0029"></a>
+<a class="index-entry-id" id="index-drawing-position_002c-vertical-_0028nl_0029"></a>
+<p><code class="code">nl</code> interpolates or sets the vertical drawing position. When the
+formatter starts, the first page transition hasn&rsquo;t happened yet, and
+<code class="code">nl</code> is negative. If a header trap has been planted on the page
+(typically at vertical position <code class="code">0</code>), you can assign a negative
+value to <code class="code">nl</code> to spring it if that page has already started
+(see <a class="pxref" href="Page-Location-Traps.html">Page Location Traps</a>).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de HD
+. sp
+. tl ''Goldbach Solution''
+. sp
+..
+.
+First page.
+.bp
+.wh 0 HD \&quot; plant header trap at top of page
+.nr nl (-1)
+Second page.
+ &rArr; First page.
+ &rArr;
+ &rArr; <span class="r"><i class="i">(blank lines elided)</i></span>
+ &rArr;
+ &rArr; Goldbach Solution
+ &rArr;
+ &rArr; <span class="r"><i class="i">(blank lines elided)</i></span>
+ &rArr;
+ &rArr; Second page.
+</pre></div></div>
+
+<p>Without resetting <code class="code">nl</code> to a negative value, the trap just planted
+would be active beginning with the <em class="emph">next</em> page, not the current
+one.
+</p>
+<p>See <a class="xref" href="Diversions.html">Diversions</a>, for a comparison of <code class="code">nl</code> with the <code class="code">.h</code> and
+<code class="code">.d</code> registers.
+</p></dd></dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Using-Fonts.html">Using Fonts</a>, Previous: <a href="Page-Layout.html">Page Layout</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Page-Geometry.html b/doc/groff.html.node/Page-Geometry.html
new file mode 100644
index 0000000..1486533
--- /dev/null
+++ b/doc/groff.html.node/Page-Geometry.html
@@ -0,0 +1,140 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Page Geometry (The GNU Troff Manual)</title>
+
+<meta name="description" content="Page Geometry (The GNU Troff Manual)">
+<meta name="keywords" content="Page Geometry (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Measurements.html" rel="next" title="Measurements">
+<link href="Text.html" rel="prev" title="Text">
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Page-Geometry">
+<div class="nav-panel">
+<p>
+Next: <a href="Measurements.html" accesskey="n" rel="next">Measurements</a>, Previous: <a href="Text.html" accesskey="p" rel="prev">Text</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Page-Geometry-1">5.2 Page Geometry</h3>
+<a class="index-entry-id" id="index-page_002c-geometry-of"></a>
+<a class="index-entry-id" id="index-geometry_002c-page"></a>
+
+<p><code class="code">roff</code> systems format text under certain assumptions about the size
+of the output medium, or page. For the formatter to correctly break a
+line it is filling, it must know the line length, which it derives from
+the page width (see <a class="pxref" href="Line-Layout.html">Line Layout</a>). For it to decide whether to write
+an output line to the current page or wait until the next one, it must
+know the page length (see <a class="pxref" href="Page-Layout.html">Page Layout</a>).
+</p>
+<a class="index-entry-id" id="index-device-resolution"></a>
+<a class="index-entry-id" id="index-resolution_002c-device"></a>
+<a class="index-entry-id" id="index-basic-units"></a>
+<a class="index-entry-id" id="index-units_002c-basic"></a>
+<a class="index-entry-id" id="index-machine-units"></a>
+<a class="index-entry-id" id="index-units_002c-machine"></a>
+<p>A device&rsquo;s <em class="dfn">resolution</em> converts practical units like inches or
+centimeters to <em class="dfn">basic units</em>, a convenient length measure for the
+output device or file format. The formatter and output driver use basic
+units to reckon page measurements. The device description file defines
+its resolution and page dimensions (see <a class="pxref" href="DESC-File-Format.html"><samp class="file">DESC</samp> File Format</a>).
+</p>
+<a class="index-entry-id" id="index-page"></a>
+<p>A <em class="dfn">page</em> is a two-dimensional structure upon which a <code class="code">roff</code>
+system imposes a rectangular coordinate system with its upper left
+corner as the origin. Coordinate values are in basic units and increase
+down and to the right. Useful ones are therefore always positive and
+within numeric ranges corresponding to the page boundaries.
+</p>
+<a class="index-entry-id" id="index-drawing-position"></a>
+<a class="index-entry-id" id="index-position_002c-drawing"></a>
+<p>While the formatter (and, later, output driver) is processing a page, it
+keeps track of its <em class="dfn">drawing position</em>, which is the location at
+which the next glyph will be written, from which the next motion will be
+measured, or where a geometric object will commence rendering.
+<a class="index-entry-id" id="index-text-baseline"></a>
+<a class="index-entry-id" id="index-baseline_002c-text"></a>
+Notionally, glyphs are drawn from the text baseline upward and to the
+right.<a class="footnote" id="DOCF33" href="groff.html_fot.html#FOOT33"><sup>33</sup></a> The <em class="dfn">text baseline</em> is a (usually invisible) line upon
+which the glyphs of a typeface are aligned. A glyph therefore
+&ldquo;starts&rdquo; at its bottom-left corner. If drawn at the origin, a typical
+letter glyph would lie partially or wholly off the page, depending on
+whether, like &ldquo;g&rdquo;, it features a descender below the baseline.
+</p>
+<a class="index-entry-id" id="index-page-offset"></a>
+<a class="index-entry-id" id="index-offset_002c-page"></a>
+<p>Such a situation is nearly always undesirable. It is furthermore
+conventional not to write or draw at the extreme edges of the page.
+Therefore the initial drawing position of a <code class="code">roff</code> formatter is not
+at the origin, but below and to the right of it. This rightward shift
+from the left edge is known as the <em class="dfn">page
+offset</em>.<a class="footnote" id="DOCF34" href="groff.html_fot.html#FOOT34"><sup>34</sup></a> The downward shift leaves room for a text output
+line.
+</p>
+<p>Text is arranged on a one-dimensional lattice of text baselines from the
+top to the bottom of the page.
+<a class="index-entry-id" id="index-vertical-spacing"></a>
+<a class="index-entry-id" id="index-spacing_002c-vertical"></a>
+<a class="index-entry-id" id="index-vee"></a>
+<em class="dfn">Vertical spacing</em> is the distance between adjacent text baselines.
+Typographic tradition sets this quantity to 120% of the type size. The
+initial drawing position is one unit of vertical spacing below the page
+top. Typographers term this unit a <i class="slanted">vee</i>.
+</p>
+<a class="index-entry-id" id="index-page-break"></a>
+<a class="index-entry-id" id="index-break_002c-page"></a>
+<a class="index-entry-id" id="index-page-ejection"></a>
+<a class="index-entry-id" id="index-ejection_002c-page"></a>
+<p>Vertical spacing has an impact on page-breaking decisions. Generally,
+when a break occurs, the formatter moves the drawing position to the
+next text baseline automatically. If the formatter were already writing
+to the last line that would fit on the page, advancing by one vee would
+place the next text baseline off the page. Rather than let that happen,
+<code class="code">roff</code> formatters instruct the output driver to eject the page,
+start a new one, and again set the drawing position to one vee below the
+page top; this is a <em class="dfn">page break</em>.
+</p>
+<p>When the last line of input text corresponds to the last output line
+that fits on the page, the break caused by the end of input will also
+break the page, producing a useless blank one. Macro packages keep
+users from having to confront this difficulty by setting &ldquo;traps&rdquo;
+(see <a class="pxref" href="Traps.html">Traps</a>); moreover, all but the simplest page layouts tend to
+have headers and footers, or at least bear vertical margins larger than
+one vee.
+</p>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Measurements.html">Measurements</a>, Previous: <a href="Text.html">Text</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Page-Layout-Adjustment.html b/doc/groff.html.node/Page-Layout-Adjustment.html
new file mode 100644
index 0000000..7570214
--- /dev/null
+++ b/doc/groff.html.node/Page-Layout-Adjustment.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Page Layout Adjustment (The GNU Troff Manual)</title>
+
+<meta name="description" content="Page Layout Adjustment (The GNU Troff Manual)">
+<meta name="keywords" content="Page Layout Adjustment (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Common-Features.html" rel="up" title="Common Features">
+<link href="Displays-and-Keeps.html" rel="next" title="Displays and Keeps">
+<link href="Headers-and-Footers.html" rel="prev" title="Headers and Footers">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Page-Layout-Adjustment">
+<div class="nav-panel">
+<p>
+Next: <a href="Displays-and-Keeps.html" accesskey="n" rel="next">Displays and Keeps</a>, Previous: <a href="Headers-and-Footers.html" accesskey="p" rel="prev">Headers and Footers</a>, Up: <a href="Common-Features.html" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Page-Layout-1">3.2.4 Page Layout</h4>
+
+<p>Most macro packages let the user specify the size of the page margins.
+The top and bottom margins are typically handled differently than the
+left and right margins; the latter two are derived from the
+<i class="slanted">page offset</i>, <i class="slanted">indentation</i>, and <i class="slanted">line length</i>.
+See <a class="xref" href="Line-Layout.html">Line Layout</a>. Commonly, packages support registers to tune these
+values.
+</p>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Page-Layout.html b/doc/groff.html.node/Page-Layout.html
new file mode 100644
index 0000000..8a6a4ad
--- /dev/null
+++ b/doc/groff.html.node/Page-Layout.html
@@ -0,0 +1,188 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Page Layout (The GNU Troff Manual)</title>
+
+<meta name="description" content="Page Layout (The GNU Troff Manual)">
+<meta name="keywords" content="Page Layout (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Page-Control.html" rel="next" title="Page Control">
+<link href="Line-Continuation.html" rel="prev" title="Line Continuation">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Page-Layout">
+<div class="nav-panel">
+<p>
+Next: <a href="Page-Control.html" accesskey="n" rel="next">Page Control</a>, Previous: <a href="Line-Continuation.html" accesskey="p" rel="prev">Line Continuation</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Page-Layout-2">5.17 Page Layout</h3>
+<a class="index-entry-id" id="index-page-layout"></a>
+<a class="index-entry-id" id="index-layout_002c-page"></a>
+
+<p>The formatter permits configuration of the page length and page number.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epl"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pl</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">length</i></span>]</var><a class="copiable-link" href='#index-_002epl'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-pl"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002epl-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pl</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">length</i></span></var><a class="copiable-link" href='#index-_002epl-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002epl-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pl</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">length</i></span></var><a class="copiable-link" href='#index-_002epl-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ep_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.p]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ep_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ep"></a>
+<a class="index-entry-id" id="index-page-length_002c-configuring-_0028pl_0029"></a>
+<a class="index-entry-id" id="index-length-of-the-page_002c-configuring-_0028pl_0029"></a>
+<a class="index-entry-id" id="index-configuring-the-page-length-_0028pl_0029"></a>
+<a class="index-entry-id" id="index-setting-the-page-length-_0028pl_0029"></a>
+<p>Change (increase or decrease) the page length per the numeric expression
+<var class="var">length</var>. The default scaling unit is &lsquo;<samp class="samp">v</samp>&rsquo;. A negative
+<var class="var">length</var> is valid, but an uncommon application: it prevents page
+location traps from being sprung,<a class="footnote" id="DOCF70" href="groff.html_fot.html#FOOT70"><sup>70</sup></a> and each
+output line is placed on a new page. If <var class="var">length</var> is invalid, GNU
+<code class="code">troff</code> emits a warning in category &lsquo;<samp class="samp">number</samp>&rsquo;. If <var class="var">length</var>
+is absent or invalid, &lsquo;<samp class="samp">11i</samp>&rsquo; is assumed.
+</p>
+<a class="index-entry-id" id="index-page-length-register-_0028_002ep_0029"></a>
+<p>The read-only register &lsquo;<samp class="samp">.p</samp>&rsquo; interpolates the current page length.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epn"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pn</code></strong> <var class="def-var-arguments">num</var><a class="copiable-link" href='#index-_002epn'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-pn"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002epn-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pn</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">num</i></span></var><a class="copiable-link" href='#index-_002epn-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002epn-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pn</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">num</i></span></var><a class="copiable-link" href='#index-_002epn-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002epn_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.pn]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002epn_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002epn-3"></a>
+<a class="index-entry-id" id="index-page-number_002c-configuring-next-_0028pn_0029"></a>
+<a class="index-entry-id" id="index-next-page-number_002c-configuring-_0028pn_0029"></a>
+<a class="index-entry-id" id="index-number_002c-page_002c-next_002c-configuring-_0028pn_0029"></a>
+<p>Change (increase or decrease) the page number of the <em class="emph">next</em> page
+per the numeric expression <var class="var">num</var>. If <var class="var">num</var> is invalid, GNU
+<code class="code">troff</code> emits a warning in category &lsquo;<samp class="samp">number</samp>&rsquo; and ignores the
+request. Without an argument, <code class="code">pn</code> is ignored.
+</p>
+<a class="index-entry-id" id="index-next-page-number-register-_0028_002epn_0029"></a>
+<a class="index-entry-id" id="index-page-number_002c-next_002c-register-_0028_002epn_0029"></a>
+<p>The read-only register <code class="code">.pn</code> interpolates <var class="var">num</var> if set by
+<code class="code">pn</code> on the current page, or the current page number plus&nbsp;1.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-headers"></a>
+<a class="index-entry-id" id="index-footers"></a>
+<a class="index-entry-id" id="index-titles"></a>
+<p>The formatter offers special support for typesetting headers and
+footers, collectively termed <em class="dfn">titles</em>. Titles have an independent
+line length, and their placement on the page is not restricted.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002etl"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.tl</code></strong> <var class="def-var-arguments"><code class="code">'</code><span class="r"><i class="slanted">left</i></span><code class="code">'</code><span class="r"><i class="slanted">center</i></span><code class="code">'</code><span class="r"><i class="slanted">right</i></span><code class="code">'</code></var><a class="copiable-link" href='#index-_002etl'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-tl"></a>
+<a class="index-entry-id" id="index-title-line_002c-formatting-_0028tl_0029"></a>
+<a class="index-entry-id" id="index-formatting-a-title-line-_0028tl_0029"></a>
+<a class="index-entry-id" id="index-three_002dpart-title-_0028tl_0029"></a>
+<a class="index-entry-id" id="index-page-number-character-_0028_0025_0029"></a>
+<p>Format an output line as a title consisting of <var class="var">left</var>, <var class="var">center</var>,
+and <var class="var">right</var>, each aligned accordingly. The delimiter need not be a
+neutral apostrophe: <code class="code">tl</code> accepts the same delimiters as most escape
+sequences; see <a class="ref" href="Delimiters.html">Delimiters</a>. If not used as the delimiter, any
+<em class="dfn">page number character</em> character is replaced with the current page
+number; the default is &lsquo;<samp class="samp">%</samp>&rsquo;; see the the <code class="code">pc</code> request below.
+Without an argument, <code class="code">tl</code> is ignored. <code class="code">tl</code> writes the title
+line immediately, ignoring any partially collected line.
+</p>
+<p>It is not an error to omit delimiters after the first. For example,
+&lsquo;<samp class="samp">.tl&nbsp;/Thesis</samp>&rsquo;<!-- /@w --> is interpreted as &lsquo;<samp class="samp">.tl&nbsp;/Thesis///</samp>&rsquo;<!-- /@w -->: it
+sets a title line comprising only the left-aligned word &lsquo;<samp class="samp">Thesis</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002elt"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.lt</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">length</i></span>]</var><a class="copiable-link" href='#index-_002elt'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-lt"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002elt-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.lt</code></strong> <var class="def-var-arguments"><code class="t">+</code><span class="r"><i class="slanted">length</i></span></var><a class="copiable-link" href='#index-_002elt-1'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_002elt-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.lt</code></strong> <var class="def-var-arguments"><code class="t">-</code><span class="r"><i class="slanted">length</i></span></var><a class="copiable-link" href='#index-_002elt-2'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002elt_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.lt]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002elt_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002elt-3"></a>
+<a class="index-entry-id" id="index-length-of-title-line_002c-configuring-_0028lt_0029"></a>
+<a class="index-entry-id" id="index-title-length_002c-configuring-_0028lt_0029"></a>
+<p>Change (increase or decrease) the line length used by titles per the
+numeric expression <var class="var">length</var>. The default scaling unit is &lsquo;<samp class="samp">m</samp>&rsquo;.
+If <var class="var">length</var> is negative, GNU emits a warning in category
+&lsquo;<samp class="samp">range</samp>&rsquo; and treats <var class="var">length</var> as &lsquo;<samp class="samp">0</samp>&rsquo;. If <var class="var">length</var> is
+invalid, GNU <code class="code">troff</code> emits a warning in category &lsquo;<samp class="samp">number</samp>&rsquo; and
+ignores the request. The formatter&rsquo;s default title length is
+&lsquo;<samp class="samp">6.5i</samp>&rsquo;. With no argument, the title length is restored to the
+previous value. The title length is is associated with the environment
+(see <a class="pxref" href="Environments.html">Environments</a>).
+</p>
+<a class="index-entry-id" id="index-title-line-length-register-_0028_002elt_0029"></a>
+<p>The read-only register &lsquo;<samp class="samp">.lt</samp>&rsquo; interpolates the title line length.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002epc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.pc</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">char</i></span>]</var><a class="copiable-link" href='#index-_002epc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-pc"></a>
+<a class="index-entry-id" id="index-changing-the-page-number-character-_0028pc_0029"></a>
+<a class="index-entry-id" id="index-page-number-character_002c-changing-_0028pc_0029"></a>
+<a class="index-entry-id" id="index-_0025-1"></a>
+<p>Set the page number character to <var class="var">char</var>. With no argument, the page
+number character is disabled. <code class="code">pc</code> does not affect the
+register&nbsp;<code class="code">%</code>.
+</p></dd></dl>
+
+<p>The following example exercises title features.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.lt 50n
+This is my partially collected
+.tl 'Isomers 2023'%'Dextrose Edition'
+line.
+ &rArr; Isomers 2023 1 Dextrose Edition
+ &rArr; This is my partially collected line.
+</pre></div></div>
+
+<p>We most often see titles used in page header and footer traps.
+See <a class="xref" href="Traps.html">Traps</a>.
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Page-Control.html">Page Control</a>, Previous: <a href="Line-Continuation.html">Line Continuation</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Page-Location-Traps.html b/doc/groff.html.node/Page-Location-Traps.html
new file mode 100644
index 0000000..3d388bf
--- /dev/null
+++ b/doc/groff.html.node/Page-Location-Traps.html
@@ -0,0 +1,326 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Page Location Traps (The GNU Troff Manual)</title>
+
+<meta name="description" content="Page Location Traps (The GNU Troff Manual)">
+<meta name="keywords" content="Page Location Traps (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Vertical-Position-Traps.html" rel="up" title="Vertical Position Traps">
+<link href="The-Implicit-Page-Trap.html" rel="next" title="The Implicit Page Trap">
+<link href="Vertical-Position-Traps.html" rel="prev" title="Vertical Position Traps">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="Page-Location-Traps">
+<div class="nav-panel">
+<p>
+Next: <a href="The-Implicit-Page-Trap.html" accesskey="n" rel="next">The Implicit Page Trap</a>, Previous: <a href="Vertical-Position-Traps.html" accesskey="p" rel="prev">Vertical Position Traps</a>, Up: <a href="Vertical-Position-Traps.html" accesskey="u" rel="up">Vertical Position Traps</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Page-Location-Traps-1">5.28.1.1 Page Location Traps</h4>
+<a class="index-entry-id" id="index-page-location-traps"></a>
+<a class="index-entry-id" id="index-traps_002c-page-location"></a>
+
+<p>A <em class="dfn">page location trap</em> is a vertical position trap that applies to
+the page; that is, to undiverted output. Many can be present; manage
+them with the <code class="code">wh</code> and <code class="code">ch</code> requests.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ewh"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.wh</code></strong> <var class="def-var-arguments">dist [<span class="r"><i class="slanted">name</i></span>]</var><a class="copiable-link" href='#index-_002ewh'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-wh"></a>
+<p>Plant macro <var class="var">name</var> as page location trap at <var class="var">dist</var>. The default
+scaling unit is &lsquo;<samp class="samp">v</samp>&rsquo;. Non-negative values for <var class="var">dist</var> set the
+trap relative to the top of the page; negative values set the trap
+relative to the bottom of the page. It is not possible to plant a trap
+less than one basic unit from the page bottom: a <var class="var">dist</var> of <code class="code">-0</code>
+is interpreted as <code class="code">0</code>, the top of the page.<a class="footnote" id="DOCF106" href="groff.html_fot.html#FOOT106"><sup>106</sup></a> An existing <em class="emph">visible</em> trap (see below) at
+<var class="var">dist</var> is removed; this is <code class="code">wh</code>&rsquo;s sole function if <var class="var">name</var>
+is missing.
+</p>
+<p>A trap is sprung only if it is <em class="dfn">visible</em>, meaning that its location
+is reachable on the page<a class="footnote" id="DOCF107" href="groff.html_fot.html#FOOT107"><sup>107</sup></a> and it
+is not hidden by another trap at the same location already planted
+there.
+</p>
+<a class="index-entry-id" id="index-page-headers"></a>
+<a class="index-entry-id" id="index-page-footers"></a>
+<a class="index-entry-id" id="index-headers-1"></a>
+<a class="index-entry-id" id="index-footers-1"></a>
+<a class="index-entry-id" id="index-top-margin"></a>
+<a class="index-entry-id" id="index-margin_002c-top"></a>
+<a class="index-entry-id" id="index-bottom-margin"></a>
+<a class="index-entry-id" id="index-margin_002c-bottom"></a>
+<p>A macro package might set headers and footers as follows; this example
+configures vertical margins of one inch to the body text, and one
+half-inch to the titles. Observe the use of the no-break control
+character with <code class="code">sp</code> request to position our text baselines,
+and the page number character &lsquo;<samp class="samp">%</samp>&rsquo; used with the <code class="code">tl</code> request.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.\&quot; hdfo.roff
+.de hd \&quot; page header
+' sp .5i
+' tl '\\*(Ti''\\*(Da' \&quot; title and date strings
+' sp .5i
+..
+.de fo \&quot; page footer
+' sp .5i
+. tl ''%''
+. bp
+..
+.wh 0 hd \&quot; trap at top of the page
+.wh -1i fo \&quot; trap 1 inch from bottom
+</pre></div></div>
+
+<p>To use these traps, copy the above (or load it from a file with the
+<code class="code">so</code> or <code class="code">mso</code> requests), then set up the strings it uses.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.so hdfo.roff
+.ds Ti Final Report\&quot;
+.ds Da 21 May 2023\&quot;
+.ti
+On 5 August of last year,
+this committee tasked me with the investigation of the
+CFIT (controlled flight into terrain) incident of
+.\&quot; <i class="i">...and so on...</i>
+</pre></div></div>
+
+<p>A trap above the top or at or below the bottom of the page can be made
+visible by either moving it into the page area or increasing the page
+length so that the trap is on the page. Negative trap values always use
+the <em class="emph">current</em> page length; they are not converted to an absolute
+vertical position.
+<a class="index-entry-id" id="index-page-location-traps_002c-debugging"></a>
+<a class="index-entry-id" id="index-debugging-page-location-traps"></a>
+We can use the <code class="code">ptr</code> request to dump our page location traps to the
+standard error stream (see <a class="pxref" href="Debugging.html">Debugging</a>). Their positions are reported
+in basic units; an <code class="code">nroff</code> device example follows.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.pl 5i
+.wh -1i xx
+.ptr
+ error&rarr; xx -240
+.pl 100i
+.ptr
+ error&rarr; xx -240
+</pre></div></div>
+
+<p>It is possible to have more than one trap at the same location (although
+only one at a time can be visible); to achieve this, the traps must be
+defined at different locations, then moved to the same place with the
+<code class="code">ch</code> request. In the following example, the many empty lines
+caused by the <code class="code">bp</code> request are not shown in the output.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de a
+. nop a
+..
+.de b
+. nop b
+..
+.de c
+. nop c
+..
+.
+.wh 1i a
+.wh 2i b
+.wh 3i c
+.bp
+ &rArr; a b c
+</pre></div></div>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ch b 1i
+.ch c 1i
+.bp
+ &rArr; a
+</pre></div></div>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ch a 0.5i
+.bp
+ &rArr; a b
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002et_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.t]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002et_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002et"></a>
+<a class="index-entry-id" id="index-distance-to-next-vertical-position-trap-register-_0028_002et_0029"></a>
+<a class="index-entry-id" id="index-trap_002c-distance-to-next-vertical-position_002c-register-_0028_002et_0029"></a>
+<p>The read-only register <code class="code">.t</code> holds the distance to the next vertical
+position trap. If there are no traps between the current position and
+the bottom of the page, it contains the distance to the page bottom.
+Within a diversion, in the absence of a diversion trap, this distance is
+the largest representable integer in basic units&mdash;effectively infinite.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ech"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ch</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">dist</i></span>]</var><a class="copiable-link" href='#index-_002ech'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ch"></a>
+<a class="index-entry-id" id="index-changing-trap-location-_0028ch_0029"></a>
+<a class="index-entry-id" id="index-trap_002c-changing-location-_0028ch_0029"></a>
+<p>Change the location of a trap by moving macro <var class="var">name</var> to new location
+<var class="var">dist</var>, or by unplanting it altogether if <var class="var">dist</var> is absent. The
+default scaling unit is &lsquo;<samp class="samp">v</samp>&rsquo;. Parameters to <code class="code">ch</code> are specified
+in the opposite order from <code class="code">wh</code>. If <var class="var">name</var> is the earliest
+planted macro of multiple traps at the same location, (re)moving it from
+that location exposes the macro next least recently planted at the same
+place.<a class="footnote" id="DOCF108" href="groff.html_fot.html#FOOT108"><sup>108</sup></a>
+</p>
+<p>Changing a trap&rsquo;s location is useful for building up footnotes in a
+diversion to allow more space at the bottom of the page for them.
+</p>
+
+</dd></dl>
+
+<p>The same macro can be installed simultaneously at multiple locations;
+however, only the earliest-planted instance&mdash;that has not yet been
+deleted with <code class="code">wh</code>&mdash;will be moved by <code class="code">ch</code>. The following
+example (using an <code class="code">nroff</code> device) illustrates this behavior. Blank
+lines have been elided from the output.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de T
+Trap sprung at \\n(nlu.
+.br
+..
+.wh 1i T
+.wh 2i T
+foo
+.sp 11i
+.bp
+.ch T 4i
+bar
+.sp 11i
+.bp
+.ch T 5i
+baz
+.sp 11i
+.bp
+.wh 5i
+.ch T 6i
+qux
+.sp 11i
+</pre></div></div>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; foo
+ &rArr; Trap sprung at 240u.
+ &rArr; Trap sprung at 480u.
+ &rArr; bar
+ &rArr; Trap sprung at 480u.
+ &rArr; Trap sprung at 960u.
+ &rArr; baz
+ &rArr; Trap sprung at 480u.
+ &rArr; Trap sprung at 1200u.
+ &rArr; qux
+ &rArr; Trap sprung at 1440u.
+</pre></div></div>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002ene_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.ne]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ene_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ene-1"></a>
+<p>The read-only register <code class="code">.ne</code> contains the amount of space that was
+needed in the last <code class="code">ne</code> request that caused a trap to be sprung;
+it is useful in conjunction with the <code class="code">.trunc</code> register. See <a class="xref" href="Page-Control.html">Page Control</a>. Since the <code class="code">.ne</code> register is set only by traps, it
+doesn&rsquo;t make sense to interpolate it outside of macros called by traps.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002etrunc_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.trunc]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002etrunc_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002etrunc"></a>
+<a class="index-entry-id" id="index-ne-request_002c-and-the-_002etrunc-register"></a>
+<a class="index-entry-id" id="index-truncated-vertical-space-register-_0028_002etrunc_0029"></a>
+<p>A read-only register containing the amount of vertical space truncated
+from an <code class="code">sp</code> request by the most recently sprung vertical
+position trap, or, if the trap was sprung by an <code class="code">ne</code> request,
+minus the amount of vertical motion produced by the <code class="code">ne</code>
+request. In other words, at the point a trap is sprung, it
+represents the difference of what the vertical position would have
+been but for the trap, and what the vertical position actually is.
+Since the <code class="code">.trunc</code> register is set only by traps, it doesn&rsquo;t make
+sense to interpolate it outside of macros called by traps.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002epe_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.pe]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002epe_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002epe"></a>
+<a class="index-entry-id" id="index-bp-request_002c-and-traps-_0028_002epe_0029"></a>
+<a class="index-entry-id" id="index-traps_002c-sprung-by-bp-request-_0028_002epe_0029"></a>
+<a class="index-entry-id" id="index-page-ejection-status-register-_0028_002epe_0029"></a>
+<p>This Boolean-valued, read-only register interpolates&nbsp;1 while a page
+is being ejected, and 0&nbsp;otherwise.
+</p>
+<p>In the following example, we plant the same trap at the top and the
+bottom of the page. We also make the trap report its name and the
+vertical drawing position.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de T
+.tm \\$0: page \\n%, nl=\\n[nl] .pe=\\n[.pe]
+..
+.ll 46n
+.wh 0 T
+.wh -1v T
+Those who can make you believe absurdities can make you
+commit atrocities. \[em] Voltaire
+ error&rarr; T: page 1, nl=0 .pe=0
+ error&rarr; T: page 1, nl=2600 .pe=1
+ &rArr; Those who can make you believe absurdities can
+ &rArr; make you commit atrocities. -- Voltaire
+</pre></div></div>
+</dd></dl>
+
+<a class="index-entry-id" id="index-diversions_002c-and-traps"></a>
+<a class="index-entry-id" id="index-traps_002c-and-diversions"></a>
+<p>When designing macros, keep in mind that diversions and traps do
+normally interact. For example, if a trap calls a header macro (while
+outputting a diversion) that tries to change the font on the current
+page, the effect is not visible before the diversion has completely been
+printed (except for input protected with <code class="code">\!</code> or <code class="code">\?</code>) since
+the data in the diversion is already formatted. In most cases, this is
+not the expected behaviour.
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="The-Implicit-Page-Trap.html">The Implicit Page Trap</a>, Previous: <a href="Vertical-Position-Traps.html">Vertical Position Traps</a>, Up: <a href="Vertical-Position-Traps.html">Vertical Position Traps</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Page-Motions.html b/doc/groff.html.node/Page-Motions.html
new file mode 100644
index 0000000..bb94bdb
--- /dev/null
+++ b/doc/groff.html.node/Page-Motions.html
@@ -0,0 +1,454 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Page Motions (The GNU Troff Manual)</title>
+
+<meta name="description" content="Page Motions (The GNU Troff Manual)">
+<meta name="keywords" content="Page Motions (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Drawing-Geometric-Objects.html" rel="next" title="Drawing Geometric Objects">
+<link href="Writing-Macros.html" rel="prev" title="Writing Macros">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+kbd.key {font-style: normal}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Page-Motions">
+<div class="nav-panel">
+<p>
+Next: <a href="Drawing-Geometric-Objects.html" accesskey="n" rel="next">Drawing Geometric Objects</a>, Previous: <a href="Writing-Macros.html" accesskey="p" rel="prev">Writing Macros</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Page-Motions-1">5.25 Page Motions</h3>
+<a class="index-entry-id" id="index-page-motions"></a>
+<a class="index-entry-id" id="index-motions_002c-page"></a>
+
+<p>See <a class="xref" href="Manipulating-Spacing.html">Manipulating Spacing</a>, for a discussion of the most commonly used
+request for vertical motion, <code class="code">sp</code>, which spaces downward by one
+vee.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002emk"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.mk</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">reg</i></span>]</var><a class="copiable-link" href='#index-_002emk'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-mk"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002ert"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.rt</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">dist</i></span>]</var><a class="copiable-link" href='#index-_002ert'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rt"></a>
+<a class="index-entry-id" id="index-marking-vertical-page-location-_0028mk_0029"></a>
+<a class="index-entry-id" id="index-page-location_002c-vertical_002c-marking-_0028mk_0029"></a>
+<a class="index-entry-id" id="index-location_002c-vertical_002c-page_002c-marking-_0028mk_0029"></a>
+<a class="index-entry-id" id="index-vertical-page-location_002c-marking-_0028mk_0029"></a>
+<a class="index-entry-id" id="index-returning-to-marked-vertical-page-location-_0028rt_0029"></a>
+<a class="index-entry-id" id="index-page-location_002c-vertical_002c-returning-to-marked-_0028rt_0029"></a>
+<a class="index-entry-id" id="index-location_002c-vertical_002c-page_002c-returning-to-marked-_0028rt_0029"></a>
+<a class="index-entry-id" id="index-vertical-page-location_002c-returning-to-marked-_0028rt_0029"></a>
+<p>You can <em class="dfn">mark</em> a location on a page for subsequent <em class="dfn">return</em>.
+<code class="code">mk</code> takes an argument, a register name in which to store the
+current page location. If given no argument, it stores the location in
+an internal register. This location can be used later by the <code class="code">rt</code>
+or the <code class="code">sp</code> requests (or the <code class="code">\v</code> escape).
+</p>
+<p>The <code class="code">rt</code> request returns <em class="emph">upward</em> to the location marked with
+the last <code class="code">mk</code> request. If used with an argument, it returns to a
+vertical position&nbsp;<var class="var">dist</var> from the top of the page (no previous
+call to <code class="code">mk</code> is necessary in this case). The default scaling
+unit is &lsquo;<samp class="samp">v</samp>&rsquo;.
+</p>
+<p>If a page break occurs between a <code class="code">mk</code> request and its matching
+<code class="code">rt</code> request, the <code class="code">rt</code> request is silently ignored.
+</p>
+<p>A simple implementation of a macro to set text in two columns follows.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr column-length 1.5i
+.nr column-gap 4m
+.nr bottom-margin 1m
+.
+.de 2c
+. br
+. mk
+. ll \\n[column-length]u
+. wh -\\n[bottom-margin]u 2c-trap
+. nr right-side 0
+..
+.
+.de 2c-trap
+. ie \\n[right-side] \{\
+. nr right-side 0
+. po -(\\n[column-length]u + \\n[column-gap]u)
+. \&quot; remove trap
+. wh -\\n[bottom-margin]u
+. \}
+. el \{\
+. \&quot; switch to right side
+. nr right-side 1
+. po +(\\n[column-length]u + \\n[column-gap]u)
+. rt
+. \}
+..
+</pre></div></div>
+
+<p>Now let us apply our two-column macro.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.pl 1.5i
+.ll 4i
+This is a small test that shows how the
+rt request works in combination with mk.
+
+.2c
+Starting here, text is typeset in two columns.
+Note that this implementation isn't robust
+and thus not suited for a real two-column
+macro.
+ &rArr; This is a small test that shows how the
+ &rArr; rt request works in combination with mk.
+ &rArr;
+ &rArr; Starting here, isn't robust
+ &rArr; text is typeset and thus not
+ &rArr; in two columns. suited for a
+ &rArr; Note that this real two-column
+ &rArr; implementation macro.
+</pre></div></div>
+</dd></dl>
+
+<p>Several escape sequences enable fine control of movement about the page.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cv_0027expr_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\v<code class="code">'</code></code><span class="r"><i class="slanted">expr</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cv_0027expr_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cv"></a>
+<a class="index-entry-id" id="index-vertical-motion-_0028_005cv_0029"></a>
+<a class="index-entry-id" id="index-motion_002c-vertical-_0028_005cv_0029"></a>
+<p>Vertically move the drawing position. <var class="var">expr</var> indicates the
+magnitude of motion: positive is downward and and negative upward. The
+default scaling unit is &lsquo;<samp class="samp">v</samp>&rsquo;. The motion is relative to the current
+drawing position unless <var class="var">expr</var> begins with the boundary-relative
+motion operator &lsquo;<samp class="samp">|</samp>&rsquo;. See <a class="xref" href="Numeric-Expressions.html">Numeric Expressions</a>.
+</p>
+<p>Text processing continues at the new drawing position; usually, vertical
+motions should be in balanced pairs to avoid a confusing page layout.
+</p>
+<p><code class="code">\v</code> will not spring a vertical position trap. This can be useful;
+for example, consider a page bottom trap macro that prints a marker in
+the margin to indicate continuation of a footnote. See <a class="xref" href="Traps.html">Traps</a>.
+</p></dd></dl>
+
+<p>A few escape sequences that produce vertical motion are unusual. They
+are thought to originate early in AT&amp;T <code class="code">nroff</code> history to achieve
+super- and subscripting by half-line motions on line printers and
+teletypewriters before the phototypesetter made more precise positioning
+available. They are reckoned in ems&mdash;not vees&mdash;to maintain continuity
+with their original purpose of moving relative to the size of the type
+rather than the distance between text baselines (vees).<a class="footnote" id="DOCF103" href="groff.html_fot.html#FOOT103"><sup>103</sup></a>
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cr-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\r</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cr-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cr"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cu-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\u</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cu-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cu"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cd-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\d</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cd-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cd"></a>
+<p>Move upward&nbsp;1<span class="dmn">m</span>, upward&nbsp;.5<span class="dmn">m</span>, and
+downward&nbsp;.5<span class="dmn">m</span>, respectively.
+</p></dd></dl>
+
+<p>Let us see these escape sequences in use.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">Obtain 100 cm\u3\d of \ka\d\092\h'|\nau'\r233\dU.
+</pre></div></div>
+
+<p>In the foregoing we have paired <code class="code">\u</code> and <code class="code">\d</code> to typeset a
+superscript, and later a full em negative (&ldquo;reverse&rdquo;) motion to place
+a superscript above a subscript. A numeral-width horizontal motion
+escape sequence aligns the proton and nucleon numbers, while <code class="code">\k</code>
+marks a horizontal position to which <code class="code">\h</code> returns so that we could
+stack them. (We shall discuss these horizontal motion escape sequences
+presently.) In serious applications, we often want to alter the type
+size of the -scripts and to fine-tune the vertical motions, as the
+<code class="code">groff</code> <samp class="file">ms</samp> package does with its super- and subscripting
+string definitions.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005ch_0027expr_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\h<code class="code">'</code></code><span class="r"><i class="slanted">expr</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005ch_0027expr_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005ch"></a>
+<a class="index-entry-id" id="index-inserting-horizontal-space-_0028_005ch_0029"></a>
+<a class="index-entry-id" id="index-horizontal-space-_0028_005ch_0029"></a>
+<a class="index-entry-id" id="index-space_002c-horizontal-_0028_005ch_0029"></a>
+<a class="index-entry-id" id="index-horizontal-motion-_0028_005ch_0029"></a>
+<a class="index-entry-id" id="index-motion_002c-horizontal-_0028_005ch_0029"></a>
+<p>Horizontally move the drawing position. <var class="var">expr</var> indicates the
+magnitude of motion: positive is rightward and negative leftward. The
+default scaling unit is &lsquo;<samp class="samp">m</samp>&rsquo;. The motion is relative to the current
+drawing position unless <var class="var">expr</var> begins with the boundary-relative
+motion operator &lsquo;<samp class="samp">|</samp>&rsquo;. See <a class="xref" href="Numeric-Expressions.html">Numeric Expressions</a>.
+</p></dd></dl>
+
+<p>The following string definition sets the TeX
+logo.<a class="footnote" id="DOCF104" href="groff.html_fot.html#FOOT104"><sup>104</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds TeX T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X\&quot;
+</pre></div></div>
+
+<p>There are a number of special-case escape sequences for horizontal
+motion.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cSP-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\<kbd class="key">SP</kbd></code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cSP-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cSP"></a>
+<a class="index-entry-id" id="index-space_002c-unbreakable-and-unadjustable-_0028_005cSP_0029"></a>
+<a class="index-entry-id" id="index-unbreakable-and-unadjustable-space-_0028_005cSP_0029"></a>
+<a class="index-entry-id" id="index-unadjustable-and-unbreakable-space-_0028_005cSP_0029"></a>
+<a class="index-entry-id" id="index-_005cspace"></a>
+<p>Move right one word space. (The input is a backslash followed by a
+space.) This escape sequence can be thought of as a non-adjustable,
+unbreakable space. Usually you want <code class="code">\~</code> instead; see
+<a class="ref" href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a>.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-thin-space-_0028_005c_007c_0029"></a>
+<a class="index-entry-id" id="index-space_002c-thin-_0028_005c_007c_0029"></a>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_007c-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\|</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_007c-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_007c"></a>
+<p>Move one-sixth <span class="dmn">em</span> to the right on typesetting output devices. If
+a glyph named &lsquo;<samp class="samp">\|</samp>&rsquo; is defined in the current font, its width is
+used instead, even on terminal output devices.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-hair-space-_0028_005c_005e_0029"></a>
+<a class="index-entry-id" id="index-space_002c-hair-_0028_005c_005e_0029"></a>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_005e-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\^</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_005e-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_005e"></a>
+<p>Move one-twelfth <span class="dmn">em</span> to the right on typesetting output devices.
+If a glyph named &lsquo;<samp class="samp">\^</samp>&rsquo; is defined in the current font, its width is
+used instead, even on terminal output devices.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c0-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\0</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c0-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c0"></a>
+<a class="index-entry-id" id="index-space_002c-width-of-a-digit-_0028numeral_0029-_0028_005c0_0029"></a>
+<a class="index-entry-id" id="index-digit_002dwidth-space-_0028_005c0_0029"></a>
+<a class="index-entry-id" id="index-figure-space-_0028_005c0_0029"></a>
+<a class="index-entry-id" id="index-numeral_002dwidth-space-_0028_005c0_0029"></a>
+<p>Move right by the width of a numeral in the current font.
+</p></dd></dl>
+
+<p>Horizontal motions are not discarded at the end of an output line as
+word spaces are. See <a class="xref" href="Breaking.html">Breaking</a>.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cw_0027anything_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\w<code class="code">'</code></code><span class="r"><i class="slanted">anything</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cw_0027anything_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cw"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005bst_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[st]</code></strong><a class="copiable-link" href='#index-_005cn_005bst_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-st"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005bsb_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[sb]</code></strong><a class="copiable-link" href='#index-_005cn_005bsb_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-sb"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005brst_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[rst]</code></strong><a class="copiable-link" href='#index-_005cn_005brst_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rst"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005brsb_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[rsb]</code></strong><a class="copiable-link" href='#index-_005cn_005brsb_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rsb"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005bct_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[ct]</code></strong><a class="copiable-link" href='#index-_005cn_005bct_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ct"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005bssc_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[ssc]</code></strong><a class="copiable-link" href='#index-_005cn_005bssc_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ssc"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005bskw_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[skw]</code></strong><a class="copiable-link" href='#index-_005cn_005bskw_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-skw"></a>
+<a class="index-entry-id" id="index-width-escape-_0028_005cw_0029"></a>
+<p>Interpolate the width of <var class="var">anything</var> in basic units. This escape
+sequence allows several properties of formatted output to be measured
+without writing it out.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">The length of the string 'abc' is \w'abc'u.
+ &rArr; The length of the string 'abc' is 72u.
+</pre></div></div>
+
+<a class="index-entry-id" id="index-dummy-environment_002c-used-by-_005cw-escape-sequence"></a>
+<a class="index-entry-id" id="index-environment_002c-dummy_002c-used-by-_005cw-escape-sequence"></a>
+<p><var class="var">anything</var> is processed in a dummy environment: this means that
+font and type size changes, for example, may occur within it without
+affecting subsequent output.
+</p>
+<p>After each use, <code class="code">\w</code> sets several registers.
+</p>
+<a class="index-entry-id" id="index-CSTR-_002354-errata-5"></a>
+<a class="index-entry-id" id="index-CSTR-_002354-erratum_002c-sb-register"></a>
+<a class="index-entry-id" id="index-CSTR-_002354-erratum_002c-st-register"></a>
+<dl class="table">
+<dt><code class="code">st</code></dt>
+<dt><code class="code">sb</code></dt>
+<dd><p>The maximum vertical displacements of the text baseline above and below,
+respectively. The sign convention is opposite that of relative vertical
+motions; that is, depth below the (original) baseline is negative.
+These registers are incorrectly documented in the <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code> manual as &ldquo;the highest and lowest extent of [the argument
+to <code class="code">\w</code>] relative to the baseline&rdquo;.
+</p>
+</dd>
+<dt><code class="code">rst</code></dt>
+<dt><code class="code">rsb</code></dt>
+<dd><p>Like <code class="code">st</code> and <code class="code">sb</code>, but taking account of the heights and
+depths of glyphs. In other words, these registers store the highest and
+lowest vertical positions attained by <var class="var">anything</var>, doing what
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> documented <code class="code">st</code> and <code class="code">sb</code> as doing.
+</p>
+</dd>
+<dt><code class="code">ct</code></dt>
+<dd><p>Characterizes the geometry of glyphs occurring in <var class="var">anything</var>.
+</p>
+<dl class="table">
+<dt>0</dt>
+<dd><p>only short glyphs, no descenders or tall glyphs
+</p>
+</dd>
+<dt>1</dt>
+<dd><p>at least one descender
+</p>
+</dd>
+<dt>2</dt>
+<dd><p>at least one tall glyph
+</p>
+</dd>
+<dt>3</dt>
+<dd><p>at least one each of a descender and a tall glyph
+</p></dd>
+</dl>
+
+</dd>
+<dt><code class="code">ssc</code></dt>
+<dd><p>The amount of horizontal space (possibly negative) that should be added
+to the last glyph before a subscript.
+</p>
+</dd>
+<dt><code class="code">skw</code></dt>
+<dd><p>How far to right of the center of the last glyph in the <code class="code">\w</code>
+argument, the center of an accent from a roman font should be placed
+over that glyph.
+</p></dd>
+</dl>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005ckp"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\k</code><span class="r"><i class="slanted">p</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005ckp'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005ck"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005ck_0028ps"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\k(</code><span class="r"><i class="slanted">ps</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005ck_0028ps'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005ck_005bposition_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\k[</code><span class="r"><i class="slanted">position</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005ck_005bposition_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-saving-horizontal-input-line-position-_0028_005ck_0029"></a>
+<a class="index-entry-id" id="index-horizontal-input-line-position_002c-saving-_0028_005ck_0029"></a>
+<a class="index-entry-id" id="index-input-line-position_002c-horizontal_002c-saving-_0028_005ck_0029"></a>
+<a class="index-entry-id" id="index-position_002c-horizontal-input-line_002c-saving-_0028_005ck_0029"></a>
+<a class="index-entry-id" id="index-line_002c-input_002c-horizontal-position_002c-saving-_0028_005ck_0029"></a>
+<p>Store the current horizontal position in the <em class="emph">input</em> line in a
+register with the name <var class="var">position</var> (one-character name&nbsp;<var class="var">p</var>,
+two-character name <var class="var">ps</var>). Use this, for example, to return to the
+beginning of a string for highlighting or other decoration.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bhp_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[hp]</code></strong><a class="copiable-link" href='#index-_005cn_005bhp_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hp"></a>
+<a class="index-entry-id" id="index-horizontal-input-line-position-register-_0028hp_0029"></a>
+<a class="index-entry-id" id="index-input-line_002c-horizontal-position_002c-register-_0028hp_0029"></a>
+<a class="index-entry-id" id="index-position_002c-horizontal_002c-in-input-line_002c-register-_0028hp_0029"></a>
+<a class="index-entry-id" id="index-line_002c-input_002c-horizontal-position_002c-register-_0028hp_0029"></a>
+<p>The current horizontal position at the input line.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002ek_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.k]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ek_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ek"></a>
+<a class="index-entry-id" id="index-horizontal-output-line-position-register-_0028_002ek_0029"></a>
+<a class="index-entry-id" id="index-output-line_002c-horizontal-position_002c-register-_0028_002ek_0029"></a>
+<a class="index-entry-id" id="index-position_002c-horizontal_002c-in-output-line_002c-register-_0028_002ek_0029"></a>
+<a class="index-entry-id" id="index-line_002c-output_002c-horizontal-position_002c-register-_0028_002ek_0029"></a>
+<p>A read-only register containing the current horizontal output position
+(relative to the current indentation).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005co_0027abc_2026_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\o<code class="code">'</code></code><span class="r"><i class="slanted">abc&hellip;</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005co_0027abc_2026_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005co"></a>
+<a class="index-entry-id" id="index-overstriking-glyphs-_0028_005co_0029"></a>
+<a class="index-entry-id" id="index-glyphs_002c-overstriking-_0028_005co_0029"></a>
+<p>Overstrike the glyphs of characters <var class="var">a</var>, <var class="var">b</var>, <var class="var">c</var>, &hellip;;
+the glyphs are centered, written, and the drawing position advanced by
+the widest of the glyphs.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005czc"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\z</code><span class="r"><i class="slanted">c</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005czc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cz"></a>
+<a class="index-entry-id" id="index-zero_002dwidth-printing-_0028_005cz_002c-_005cZ_0029"></a>
+<a class="index-entry-id" id="index-printing_002c-zero_002dwidth-_0028_005cz_002c-_005cZ_0029"></a>
+<p>Format the character <var class="var">c</var> with zero width; that is, without advancing
+the drawing position. Use <code class="code">\z</code> to overstrike glyphs aligned to
+their left edges, in contrast to <code class="code">\o</code>&rsquo;s centering.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cZ_0027anything_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\Z<code class="code">'</code></code><span class="r"><i class="slanted">anything</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cZ_0027anything_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cZ"></a>
+<a class="index-entry-id" id="index-zero_002dwidth-printing-_0028_005cz_002c-_005cZ_0029-1"></a>
+<a class="index-entry-id" id="index-printing_002c-zero_002dwidth-_0028_005cz_002c-_005cZ_0029-1"></a>
+<p>Save the drawing position, format <var class="var">anything</var>, then restore it. Tabs
+and leaders in the argument are ignored with an error diagnostic.
+</p>
+<p>We might implement a strike-through macro thus.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de ST
+.nr width \w'\\$1'
+\Z@\v'-.25m'\l'\\n[width]u'@\\$1
+..
+.
+This is
+.ST &quot;a test&quot;
+an actual emergency!
+</pre></div></div>
+</dd></dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a>, Previous: <a href="Writing-Macros.html">Writing Macros</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Paper-Format.html b/doc/groff.html.node/Paper-Format.html
new file mode 100644
index 0000000..f6f9e72
--- /dev/null
+++ b/doc/groff.html.node/Paper-Format.html
@@ -0,0 +1,101 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Paper Format (The GNU Troff Manual)</title>
+
+<meta name="description" content="Paper Format (The GNU Troff Manual)">
+<meta name="keywords" content="Paper Format (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Invoking-groff.html" rel="up" title="Invoking groff">
+<link href="Invocation-Examples.html" rel="next" title="Invocation Examples">
+<link href="Font-Directories.html" rel="prev" title="Font Directories">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Paper-Format">
+<div class="nav-panel">
+<p>
+Next: <a href="Invocation-Examples.html" accesskey="n" rel="next">Invocation Examples</a>, Previous: <a href="Font-Directories.html" accesskey="p" rel="prev">Font Directories</a>, Up: <a href="Invoking-groff.html" accesskey="u" rel="up">Invoking <code class="code">groff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Paper-Format-1">2.5 Paper Format</h3>
+<a class="index-entry-id" id="index-paper-format"></a>
+<a class="index-entry-id" id="index-format_002c-paper"></a>
+<a class="index-entry-id" id="index-paper-size"></a>
+<a class="index-entry-id" id="index-size_002c-paper"></a>
+<a class="index-entry-id" id="index-landscape-page-orientation"></a>
+<a class="index-entry-id" id="index-orientation_002c-landscape"></a>
+<a class="index-entry-id" id="index-page-orientation_002c-landscape"></a>
+
+<p>In <code class="code">groff</code>, the page dimensions for the formatter GNU <code class="code">troff</code>
+and for output devices are handled separately. See <a class="xref" href="Page-Layout.html">Page Layout</a>, for
+vertical manipulation of the page size, and See <a class="xref" href="Line-Layout.html">Line Layout</a>, for
+horizontal changes.
+<a class="index-entry-id" id="index-papersize_002etmac"></a>
+<a class="index-entry-id" id="index-troffrc-1"></a>
+The <samp class="file">papersize</samp> macro package, normally loaded by <samp class="file">troffrc</samp> at
+startup, provides an interface for configuring page dimensions by
+convenient names, like &lsquo;<samp class="samp">letter</samp>&rsquo; or &lsquo;<samp class="samp">a4</samp>&rsquo;; see
+<cite class="cite">groff_tmac<span class="r">(5)</span></cite>. The default used by the formatter depends on
+its build configuration, but is usually one of the foregoing, as
+geographically appropriate.
+</p>
+<p>It is up to each macro package to respect the page dimensions configured
+in this way.
+</p>
+<p>For each output device, the size of the output medium can be set in its
+<samp class="file">DESC</samp> file. Most output drivers also recognize a command-line
+option <samp class="option">-p</samp> to override the default dimensions and an option
+<samp class="option">-l</samp> to use landscape orientation. See <a class="xref" href="DESC-File-Format.html"><samp class="file">DESC</samp> File Format</a>, for
+a description of the <code class="code">papersize</code> keyword, which takes an argument
+of the same form as <samp class="option">-p</samp>. The output driver&rsquo;s man page, such as
+<cite class="cite">grops<span class="r">(1)</span></cite>, may also be helpful.
+</p>
+<p><code class="code">groff</code> uses the command-line option <samp class="option">-P</samp> to pass options to
+postprocessors; for example, use the following for PostScript output on
+A4 paper in landscape orientation.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">groff -Tps -dpaper=a4l -P-pa4 -P-l -ms foo.ms &gt; foo.ps
+</pre></div></div>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Invocation-Examples.html">Invocation Examples</a>, Previous: <a href="Font-Directories.html">Font Directories</a>, Up: <a href="Invoking-groff.html">Invoking <code class="code">groff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Paragraphs-in-ms.html b/doc/groff.html.node/Paragraphs-in-ms.html
new file mode 100644
index 0000000..e6c3a28
--- /dev/null
+++ b/doc/groff.html.node/Paragraphs-in-ms.html
@@ -0,0 +1,160 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Paragraphs in ms (The GNU Troff Manual)</title>
+
+<meta name="description" content="Paragraphs in ms (The GNU Troff Manual)">
+<meta name="keywords" content="Paragraphs in ms (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms-Body-Text.html" rel="up" title="ms Body Text">
+<link href="Headings-in-ms.html" rel="next" title="Headings in ms">
+<link href="Typographical-symbols-in-ms.html" rel="prev" title="Typographical symbols in ms">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="Paragraphs-in-ms">
+<div class="nav-panel">
+<p>
+Next: <a href="Headings-in-ms.html" accesskey="n" rel="next">Headings</a>, Previous: <a href="Typographical-symbols-in-ms.html" accesskey="p" rel="prev">Typographical symbols</a>, Up: <a href="ms-Body-Text.html" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Paragraphs-2">4.6.5.3 Paragraphs</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-paragraph-handling"></a>
+
+<p>Paragraphing macros <em class="dfn">break</em>, or terminate, any pending output line
+so that a new paragraph can begin. Several paragraph types are
+available, differing in how indentation applies to them: to left, right,
+or both margins; to the first output line of the paragraph, all output
+lines, or all but the first. All paragraphing macro calls cause the
+insertion of vertical space in the amount stored in the <code class="code">PD</code>
+register, except at page or column breaks. Alternatively, a blank input
+line breaks the output line and vertically spaces by one vee.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eLP"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.LP</code></strong><a class="copiable-link" href='#index-_002eLP'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-LP-_005bms_005d"></a>
+<p>Set a paragraph without any (additional) indentation.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002ePP"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.PP</code></strong><a class="copiable-link" href='#index-_002ePP'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PP-_005bms_005d"></a>
+<p>Set a paragraph with a first-line left indentation in the amount stored
+in the <code class="code">PI</code> register.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eIP"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.IP</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">marker</i></span> [<span class="r"><i class="slanted">width</i></span>]]</var><a class="copiable-link" href='#index-_002eIP'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-IP-_005bms_005d"></a>
+<p>Set a paragraph with a left indentation. The optional <var class="var">marker</var> is
+not indented and is empty by default. It has several applications;
+see <a class="ref" href="Lists-in-ms.html">Lists</a>. <var class="var">width</var> overrides the indentation amount
+stored in the <code class="code">PI</code> register; its default unit is &lsquo;<samp class="samp">n</samp>&rsquo;. Once
+specified, <var class="var">width</var> applies to further <code class="code">IP</code> calls until
+specified again or a heading or different paragraphing macro is called.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eQP"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.QP</code></strong><a class="copiable-link" href='#index-_002eQP'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-QP-_005bms_005d"></a>
+<p>Set a paragraph indented from both left and right margins by the amount
+stored in the <code class="code">QI</code> register.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eQS"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.QS</code></strong><a class="copiable-link" href='#index-_002eQS'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-QS-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eQE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.QE</code></strong><a class="copiable-link" href='#index-_002eQE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-QE-_005bms_005d"></a>
+<p>Begin (<code class="code">QS</code>) and end (<code class="code">QE</code>) a region where each paragraph is
+indented from both margins by the amount stored in the <code class="code">QI</code>
+register. The text between <code class="code">QS</code> and <code class="code">QE</code> can be structured
+further by use of other paragraphing macros.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eXP"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.XP</code></strong><a class="copiable-link" href='#index-_002eXP'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-XP-_005bms_005d"></a>
+<p>Set an &ldquo;exdented&rdquo; paragraph&mdash;one with a left indentation in the
+amount stored in the <code class="code">PI</code> register on every line <em class="emph">except</em> the
+first (also known as a hanging indent). This is a Berkeley extension.
+</p></dd></dl>
+
+<p>The following example illustrates the use of paragraphing macros.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.NH 2
+Cases used in the 2001 study
+.LP
+Two software releases were considered for this report.
+.PP
+The first is commercial software;
+the second is free.
+.IP \[bu]
+Microsoft Word for Windows,
+starting with version 1.0 through the current version
+(Word 2000).
+.IP \[bu]
+GNU Emacs,
+from its first appearance as a standalone editor through
+the current version (v20).
+See [Bloggs 2002] for details.
+.QP
+Franklin's Law applied to software:
+software expands to outgrow both RAM and disk space over
+time.
+.SH
+Bibliography
+.XP
+Bloggs, Joseph R.,
+.I &quot;Everyone's a Critic&quot; ,
+Underground Press, March 2002.
+A definitive work that answers all questions and
+criticisms about the quality and usability of free
+software.
+</pre></div>
+</td></tr></table>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Headings-in-ms.html">Headings</a>, Previous: <a href="Typographical-symbols-in-ms.html">Typographical symbols</a>, Up: <a href="ms-Body-Text.html">Body Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Paragraphs.html b/doc/groff.html.node/Paragraphs.html
new file mode 100644
index 0000000..a230bcd
--- /dev/null
+++ b/doc/groff.html.node/Paragraphs.html
@@ -0,0 +1,109 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Paragraphs (The GNU Troff Manual)</title>
+
+<meta name="description" content="Paragraphs (The GNU Troff Manual)">
+<meta name="keywords" content="Paragraphs (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Common-Features.html" rel="up" title="Common Features">
+<link href="Sections-and-Chapters.html" rel="next" title="Sections and Chapters">
+<link href="Common-Features.html" rel="prev" title="Common Features">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Paragraphs">
+<div class="nav-panel">
+<p>
+Next: <a href="Sections-and-Chapters.html" accesskey="n" rel="next">Sections and Chapters</a>, Previous: <a href="Common-Features.html" accesskey="p" rel="prev">Common Features</a>, Up: <a href="Common-Features.html" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Paragraphs-1">3.2.1 Paragraphs</h4>
+<a class="index-entry-id" id="index-paragraphs"></a>
+
+<p>Paragraphs can be separated and indented in various ways. Some start
+with a blank line and have a first-line indentation, like most of the
+ones in this manual. Block paragraphs omit the indentation.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; Some men look at constitutions with sanctimonious
+ &rArr; reverence, and deem them like the ark of the
+ &rArr; covenant, too sacred to be touched.
+</pre></div></div>
+
+<a class="index-entry-id" id="index-tags_002c-paragraph"></a>
+<a class="index-entry-id" id="index-tagged-paragraphs"></a>
+<a class="index-entry-id" id="index-lists"></a>
+<p>We also frequently encounter <i class="slanted">tagged</i> paragraphs, which begin
+with a tag or label at the left margin and indent the remaining text.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; one This is the first paragraph. Notice how the
+ &rArr; first line of the resulting paragraph lines
+ &rArr; up with the other lines in the paragraph.
+</pre></div></div>
+
+<p>If the tag is too wide for the indentation, the line is broken.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; longlabel
+ &rArr; The label does not align with the subsequent
+ &rArr; lines, but they align with each other.
+</pre></div></div>
+
+<p>A variation of the tagged paragraph is the itemized or enumerated
+paragraph, which might use punctuation or a digit for a tag,
+respectively. These are frequently used to construct lists.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; o This list item starts with a bullet. When
+ &rArr; producing output for a device using the ASCII
+ &rArr; character set, an 'o' is formatted instead.
+</pre></div></div>
+
+<p>Often, use of the same macro without a tag continues such a discussion.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted"> &rArr; -xyz This option is recognized but ignored.
+ &rArr;
+ &rArr; It had a security hole that we don't discuss.
+</pre></div></div>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Sections-and-Chapters.html">Sections and Chapters</a>, Previous: <a href="Common-Features.html">Common Features</a>, Up: <a href="Common-Features.html">Common Features</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Parameters.html b/doc/groff.html.node/Parameters.html
new file mode 100644
index 0000000..ddf31cf
--- /dev/null
+++ b/doc/groff.html.node/Parameters.html
@@ -0,0 +1,195 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Parameters (The GNU Troff Manual)</title>
+
+<meta name="description" content="Parameters (The GNU Troff Manual)">
+<meta name="keywords" content="Parameters (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Writing-Macros.html" rel="up" title="Writing Macros">
+<link href="Copy-Mode.html" rel="next" title="Copy Mode">
+<link href="Writing-Macros.html" rel="prev" title="Writing Macros">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Parameters">
+<div class="nav-panel">
+<p>
+Next: <a href="Copy-Mode.html" accesskey="n" rel="next">Copy Mode</a>, Previous: <a href="Writing-Macros.html" accesskey="p" rel="prev">Writing Macros</a>, Up: <a href="Writing-Macros.html" accesskey="u" rel="up">Writing Macros</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Parameters-1">5.24.1 Parameters</h4>
+<a class="index-entry-id" id="index-parameters"></a>
+
+<p>Macro calls and string interpolations optionally accept a list of
+arguments; recall <a class="ref" href="Calling-Macros.html">Calling Macros</a>. At the time such an
+interpolation takes place, these <em class="dfn">parameters</em> can be examined using
+a register and a variety of escape sequences starting with &lsquo;<samp class="samp">\$</samp>&rsquo;.
+All such escape sequences are interpreted even in copy mode, a fact we
+shall motivate and explain below (see <a class="pxref" href="Copy-Mode.html">Copy Mode</a>).
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002e_0024_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.$]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002e_0024_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002e_0024"></a>
+<a class="index-entry-id" id="index-parameter-count-register-_0028_002e_0024_0029"></a>
+<p>The count of parameters available to a macro or string is kept in this
+read-only register. The <code class="code">shift</code> request can change its value.
+</p></dd></dl>
+
+<p>Any individual parameter can be accessed by its position in the list of
+arguments to the macro call, numbered from left to right starting at 1,
+with one of the following escape sequences.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0024n"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\$</code><span class="r"><i class="slanted">n</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0024n'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0024"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_0024_0028nn"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\$(</code><span class="r"><i class="slanted">nn</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0024_0028nn'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005c_0024_005bnnn_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\$[</code><span class="r"><i class="slanted">nnn</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005c_0024_005bnnn_005d'> &para;</a></span></dt>
+<dd><p>Interpolate the <var class="var">n</var>th, <var class="var">nn</var>th, or <var class="var">nnn</var>th parameter. The
+first form expects only a single digit (1&le;<var class="var">n</var>&le;9)), the
+second two digits (01&le;<var class="var">nn</var>&le;99)), and the third any
+positive integer <var class="var">nnn</var>. Macros and strings accept an unlimited
+number of parameters.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eshift"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.shift</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">n</i></span>]</var><a class="copiable-link" href='#index-_002eshift'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-shift"></a>
+<p>Shift the parameters <var class="var">n</var> places (1&nbsp;by default). This is a
+&ldquo;left shift&rdquo;: what was parameter&nbsp;<var class="var">i</var> becomes parameter
+<em class="math"><var class="var">i</var>-<var class="var">n</var></em>. The parameters formerly in positions 1
+to&nbsp;<var class="var">n</var> are no longer available. Shifting by a non-positive
+amount performs no operation. The register <code class="code">.$</code> is adjusted
+accordingly.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-copy-mode_002c-and-macro-parameters"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-macro-parameters"></a>
+<a class="index-entry-id" id="index-macro_002c-parameters-_0028_005c_0024_0029"></a>
+<a class="index-entry-id" id="index-parameters_002c-macro-_0028_005c_0024_0029"></a>
+<p>In practice, parameter interpolations are usually seen prefixed with an
+extra escape character. This is because the <code class="code">\$</code> family of escape
+sequences is interpreted even in copy mode.<a class="footnote" id="DOCF100" href="groff.html_fot.html#FOOT100"><sup>100</sup></a>
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0024_002a-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\$*</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0024_002a-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0024_002a"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_0024_0040-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\$@</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0024_0040-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0024_0040"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_0024_005e-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\$^</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0024_005e-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0024_005e"></a>
+<p>In some cases it is convenient to interpolate all of the parameters at
+once (to pass them to a request, for instance). The <code class="code">\$*</code> escape
+concatenates the parameters, separating them with spaces. <code class="code">\$@</code>
+is similar, concatenating the parameters, surrounding each with double
+quotes and separating them with spaces. If not in compatibility mode,
+the interpolation depth of double quotes is preserved (see <a class="pxref" href="Calling-Macros.html">Calling Macros</a>). <code class="code">\$^</code> interpolates all parameters as if they were
+arguments to the <code class="code">ds</code> request.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de foo
+. tm $1='\\$1'
+. tm $2='\\$2'
+. tm $*='\\$*'
+. tm $@='\\$@'
+. tm $^='\\$^'
+..
+.foo &quot; This is a &quot;test&quot;
+ error&rarr; $1=' This is a '
+ error&rarr; $2='test&quot;'
+ error&rarr; $*=' This is a test&quot;'
+ error&rarr; $@='&quot; This is a &quot; &quot;test&quot;&quot;'
+ error&rarr; $^='&quot; This is a &quot;test&quot;'
+</pre></div></div>
+
+<p><code class="code">\$*</code> is useful when writing a macro that doesn&rsquo;t need to
+distinguish its arguments, or even to not interpret them; examples
+include macros that produce diagnostic messages by wrapping the
+<code class="code">tm</code> or <code class="code">ab</code> requests. Use <code class="code">\$@</code> when writing a macro
+that may need to shift its parameters and/or wrap a macro or request
+that finds the count significant. If in doubt, prefer <code class="code">\$@</code> to
+<code class="code">\$*</code>. An application of <code class="code">\$^</code> is seen in <samp class="file">trace.tmac</samp>,
+which redefines some requests and macros for debugging purposes.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_00240-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\$0</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_00240-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_00240"></a>
+<a class="index-entry-id" id="index-macro-name-register-_0028_005c_00240_0029"></a>
+<a class="index-entry-id" id="index-als-request_002c-and-_005c_00240"></a>
+<p>Interpolate the name by which the macro being interpreted was called.
+The <code class="code">als</code> request can cause a macro to have more than one name.
+Applying string interpolation to a macro does not change this name.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de foo
+. tm \\$0
+..
+.als bar foo
+.
+.de aaa
+. foo
+..
+.de bbb
+. bar
+..
+.de ccc
+\\*[foo]\\
+..
+.de ddd
+\\*[bar]\\
+..
+.
+.aaa
+ error&rarr; foo
+.bbb
+ error&rarr; bar
+.ccc
+ error&rarr; ccc
+.ddd
+ error&rarr; ddd
+</pre></div></div>
+</dd></dl>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Copy-Mode.html">Copy Mode</a>, Previous: <a href="Writing-Macros.html">Writing Macros</a>, Up: <a href="Writing-Macros.html">Writing Macros</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Postprocessor-Access.html b/doc/groff.html.node/Postprocessor-Access.html
new file mode 100644
index 0000000..3b06a80
--- /dev/null
+++ b/doc/groff.html.node/Postprocessor-Access.html
@@ -0,0 +1,144 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Postprocessor Access (The GNU Troff Manual)</title>
+
+<meta name="description" content="Postprocessor Access (The GNU Troff Manual)">
+<meta name="keywords" content="Postprocessor Access (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Miscellaneous.html" rel="next" title="Miscellaneous">
+<link href="I_002fO.html" rel="prev" title="I/O">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+kbd.key {font-style: normal}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Postprocessor-Access">
+<div class="nav-panel">
+<p>
+Next: <a href="Miscellaneous.html" accesskey="n" rel="next">Miscellaneous</a>, Previous: <a href="I_002fO.html" accesskey="p" rel="prev">I/O</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Postprocessor-Access-1">5.34 Postprocessor Access</h3>
+<a class="index-entry-id" id="index-postprocessor-access"></a>
+<a class="index-entry-id" id="index-access-to-postprocessor"></a>
+
+<p>Two escape sequences and two requests enable documents to pass
+information directly to a postprocessor. These are useful for
+exercising device-specific capabilities that the <code class="code">groff</code> language
+does not abstract or generalize; examples include the embedding of
+hyperlinks and image files. Device-specific functions are documented in
+each output driver&rsquo;s man page, such as <cite class="cite">gropdf<span class="r">(1)</span></cite>,
+<cite class="cite">grops<span class="r">(1)</span></cite>, or <cite class="cite">grotty<span class="r">(1)</span></cite>.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002edevice"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.device</code></strong> <var class="def-var-arguments">xxx <span class="r">&hellip;</span></var><a class="copiable-link" href='#index-_002edevice'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-device"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cX_0027xxx-_2026_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\X<code class="code">'</code></code><span class="r"><i class="slanted">xxx <span class="r">&hellip;</span></i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cX_0027xxx-_2026_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cX"></a>
+<p>Embed all <var class="var">xxx</var> arguments into GNU <code class="code">troff</code> output as parameters
+to a device control command &lsquo;<samp class="samp">x&nbsp;X</samp>&rsquo;<!-- /@w -->. The meaning and
+interpretation of such parameters is determined by the output driver or
+other postprocessor.
+</p>
+<a class="index-entry-id" id="index-device-request_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-device-request"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-device-request"></a>
+<p>The <code class="code">device</code> request processes its arguments in copy mode
+(see <a class="pxref" href="Copy-Mode.html">Copy Mode</a>). An initial neutral double quote in <var class="var">contents</var>
+is stripped to allow embedding of leading spaces.
+<a class="index-entry-id" id="index-_005c_0026_002c-in-_005cX"></a>
+<a class="index-entry-id" id="index-_005c_0029_002c-in-_005cX"></a>
+<a class="index-entry-id" id="index-_005c_0025_002c-in-_005cX"></a>
+<a class="index-entry-id" id="index-_005c_003a_002c-in-_005cX"></a>
+By contrast, within <code class="code">\X</code> arguments, the escape sequences <code class="code">\&amp;</code>,
+<code class="code">\)</code>, <code class="code">\%</code>, and <code class="code">\:</code> are ignored; <code class="code">\<kbd class="key">SP</kbd></code> and
+<code class="code">\~</code> are converted to single space characters; and <code class="code">\\</code> has
+its escape character stripped. So that the basic Latin subset of the
+Unicode character set<a class="footnote" id="DOCF115" href="groff.html_fot.html#FOOT115"><sup>115</sup></a> can be reliably encoded in device control
+commands, seven special character escape sequences (&lsquo;<samp class="samp">\-</samp>&rsquo;,
+&lsquo;<samp class="samp">\[aq]</samp>&rsquo;, &lsquo;<samp class="samp">\[dq]</samp>&rsquo;, &lsquo;<samp class="samp">\[ga]</samp>&rsquo;, &lsquo;<samp class="samp">\[ha]</samp>&rsquo;, &lsquo;<samp class="samp">\[rs]</samp>&rsquo;,
+and &lsquo;<samp class="samp">\[ti]</samp>&rsquo;,) are mapped to basic Latin characters; see the
+<cite class="cite">groff_char<span class="r">(7)</span></cite> man page. For this transformation, character
+translations and special character definitions are
+ignored.<a class="footnote" id="DOCF116" href="groff.html_fot.html#FOOT116"><sup>116</sup></a> The use of any
+other escape sequence in <code class="code">\X</code> parameters is normally an error.
+</p>
+<a class="index-entry-id" id="index-use_005fcharnames_005fin_005fspecial"></a>
+<a class="index-entry-id" id="index-DESC-file_002c-and-use_005fcharnames_005fin_005fspecial-keyword"></a>
+<a class="index-entry-id" id="index-_005cX_002c-and-special-characters"></a>
+<p>If the <code class="code">use_charnames_in_special</code> directive appears in the output
+device&rsquo;s <samp class="file">DESC</samp> file, the use of special character escape sequences
+is <em class="emph">not</em> an error; they are simply output verbatim (with the
+exception of the seven mapped to Unicode basic Latin characters,
+discussed above). <code class="code">use_charnames_in_special</code> is currently employed
+only by <code class="code">grohtml</code>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002edevicem"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.devicem</code></strong> <var class="def-var-arguments">name</var><a class="copiable-link" href='#index-_002edevicem'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-devicem"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cYn"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\Y</code><span class="r"><i class="slanted">n</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cYn'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cY"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cY_0028nm"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\Y(</code><span class="r"><i class="slanted">nm</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cY_0028nm'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cY_005bname_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\Y[</code><span class="r"><i class="slanted">name</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cY_005bname_005d'> &para;</a></span></dt>
+<dd><p>This is approximately equivalent to &lsquo;<samp class="samp">\X'\*[<var class="var">name</var>]'</samp>&rsquo;
+(one-character name&nbsp;<var class="var">n</var>, two-character name <var class="var">nm</var>).
+However, the contents of the string or macro <var class="var">name</var> are not
+interpreted; also it is permitted for <var class="var">name</var> to have been defined as
+a macro and thus contain newlines (it is not permitted for the argument
+to <code class="code">\X</code> to contain newlines). The inclusion of newlines requires
+an extension to the <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> output format, and
+confuses drivers that do not know about this extension (see <a class="pxref" href="Device-Control-Commands.html">Device Control Commands</a>).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002etag"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.tag</code></strong> <var class="def-var-arguments">name</var><a class="copiable-link" href='#index-_002etag'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-tag"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002etaga"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.taga</code></strong> <var class="def-var-arguments">name</var><a class="copiable-link" href='#index-_002etaga'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-taga"></a>
+<p>Reserved for internal use.
+</p></dd></dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Miscellaneous.html">Miscellaneous</a>, Previous: <a href="I_002fO.html">I/O</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Predefined-Text.html b/doc/groff.html.node/Predefined-Text.html
new file mode 100644
index 0000000..8b03b1f
--- /dev/null
+++ b/doc/groff.html.node/Predefined-Text.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Predefined Text (The GNU Troff Manual)</title>
+
+<meta name="description" content="Predefined Text (The GNU Troff Manual)">
+<meta name="keywords" content="Predefined Text (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Common-Features.html" rel="up" title="Common Features">
+<link href="Preprocessor-Support.html" rel="next" title="Preprocessor Support">
+<link href="Font-and-Size-Changes.html" rel="prev" title="Font and Size Changes">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Predefined-Text">
+<div class="nav-panel">
+<p>
+Next: <a href="Preprocessor-Support.html" accesskey="n" rel="next">Preprocessor Support</a>, Previous: <a href="Font-and-Size-Changes.html" accesskey="p" rel="prev">Font and Size Changes</a>, Up: <a href="Common-Features.html" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Predefined-Text-1">3.2.12 Predefined Text</h4>
+
+<p>Most macro packages supply predefined strings to set prepared text like
+the date, or to perform operations like super- and subscripting.
+</p>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Preprocessor-Intro.html b/doc/groff.html.node/Preprocessor-Intro.html
new file mode 100644
index 0000000..7bb43a7
--- /dev/null
+++ b/doc/groff.html.node/Preprocessor-Intro.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Preprocessor Intro (The GNU Troff Manual)</title>
+
+<meta name="description" content="Preprocessor Intro (The GNU Troff Manual)">
+<meta name="keywords" content="Preprocessor Intro (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Introduction.html" rel="up" title="Introduction">
+<link href="Output-Device-Intro.html" rel="next" title="Output Device Intro">
+<link href="Macro-Package-Intro.html" rel="prev" title="Macro Package Intro">
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Preprocessor-Intro">
+<div class="nav-panel">
+<p>
+Next: <a href="Output-Device-Intro.html" accesskey="n" rel="next">Output Devices</a>, Previous: <a href="Macro-Package-Intro.html" accesskey="p" rel="prev">Macro Packages</a>, Up: <a href="Introduction.html" accesskey="u" rel="up">Introduction</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Preprocessors">1.5 Preprocessors</h3>
+<a class="index-entry-id" id="index-preprocessors"></a>
+
+<p>An alternative approach to complexity management, particularly when
+constructing tables, setting mathematics, or drawing diagrams, lies in
+preprocessing. A <em class="dfn">preprocessor</em> employs a domian-specific language
+to ease the generation of tables, equations, and so forth in terms that
+are convenient for human entry. Each preprocessor reads a document and
+translates the parts of it that apply to it into GNU <code class="code">troff</code> input.
+Command-line options to <code class="command">groff</code> tell it which preprocessors to
+use.
+</p>
+<p><code class="code">groff</code> provides preprocessors for laying out tables
+(<code class="command">gtbl</code>), typesetting equations (<code class="command">geqn</code>), drawing
+diagrams (<code class="command">gpic</code> and <code class="command">ggrn</code>), inserting bibliographic
+references (<code class="command">grefer</code>), and drawing chemical structures
+(<code class="command">gchem</code>). An associated program that is useful when dealing
+with preprocessors is <code class="command">gsoelim</code>.<a class="footnote" id="DOCF1" href="groff.html_fot.html#FOOT1"><sup>1</sup></a>
+</p>
+<p><code class="code">groff</code> also supports <code class="code">grap</code>, a preprocessor for drawing
+graphs. A free implementation of it can be obtained separately.
+</p>
+<p>Unique to <code class="code">groff</code> is the <code class="code">preconv</code> preprocessor that enables
+<code class="code">groff</code> to handle documents in a variety of input encodings.
+</p>
+<p>Other preprocessors exist, but no free implementations
+are known. An example is <code class="command">ideal</code>, which draws diagrams using a
+mathematical constraint language.
+</p>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Preprocessor-Support.html b/doc/groff.html.node/Preprocessor-Support.html
new file mode 100644
index 0000000..43e961c
--- /dev/null
+++ b/doc/groff.html.node/Preprocessor-Support.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Preprocessor Support (The GNU Troff Manual)</title>
+
+<meta name="description" content="Preprocessor Support (The GNU Troff Manual)">
+<meta name="keywords" content="Preprocessor Support (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Common-Features.html" rel="up" title="Common Features">
+<link href="Configuration-and-Customization.html" rel="next" title="Configuration and Customization">
+<link href="Predefined-Text.html" rel="prev" title="Predefined Text">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Preprocessor-Support">
+<div class="nav-panel">
+<p>
+Next: <a href="Configuration-and-Customization.html" accesskey="n" rel="next">Configuration and Customization</a>, Previous: <a href="Predefined-Text.html" accesskey="p" rel="prev">Predefined Text</a>, Up: <a href="Common-Features.html" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Preprocessor-Support-1">3.2.13 Preprocessor Support</h4>
+
+<p>All macro packages provide support for various preprocessors and may
+extend their functionality by defining macros to set their contents in
+displays. Examples include <code class="code">TS</code> and <code class="code">TE</code> for <code class="command">gtbl</code>,
+<code class="code">EQ</code> and <code class="code">EN</code> for <code class="command">geqn</code>, and <code class="code">PS</code> and <code class="code">PE</code>
+for <code class="command">gpic</code>.
+</p>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Program-and-File-Index.html b/doc/groff.html.node/Program-and-File-Index.html
new file mode 100644
index 0000000..ecc30ec
--- /dev/null
+++ b/doc/groff.html.node/Program-and-File-Index.html
@@ -0,0 +1,239 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Program and File Index (The GNU Troff Manual)</title>
+
+<meta name="description" content="Program and File Index (The GNU Troff Manual)">
+<meta name="keywords" content="Program and File Index (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="index.html" rel="up" title="Top">
+<link href="Concept-Index.html" rel="next" title="Concept Index">
+<link href="File-Keyword-Index.html" rel="prev" title="File Keyword Index">
+<style type="text/css">
+<!--
+a.summary-letter-printindex {text-decoration: none}
+td.printindex-index-entry {vertical-align: top}
+td.printindex-index-section {vertical-align: top}
+th.entries-header-printindex {text-align:left}
+th.sections-header-printindex {text-align:left}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="appendix-level-extent" id="Program-and-File-Index">
+<div class="nav-panel">
+<p>
+Next: <a href="Concept-Index.html" accesskey="n" rel="next">Concept Index</a>, Previous: <a href="File-Keyword-Index.html" accesskey="p" rel="prev">File Keyword Index</a>, Up: <a href="index.html" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h2 class="appendix" id="Program-and-File-Index-1">Appendix I Program and File Index</h2>
+
+<div class="printindex pg-printindex">
+<table class="pg-letters-header-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-J"><b>J</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-Z"><b>Z</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="pg-entries-printindex" border="0">
+<tr><td></td><th class="entries-header-printindex">Index Entry</th><td>&nbsp;</td><th class="sections-header-printindex"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-A">A</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="man.html#index-an_002etmac"><code>an.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="man.html">man</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-changebar"><code>changebar</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-composite_002etmac"><code>composite.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-cp1047_002etmac"><code>cp1047.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-cs_002etmac"><code>cs.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-D">D</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-de_002etmac"><code>de.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-DESC"><code>DESC</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-DESC-1"><code>DESC</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-DESC-2"><code>DESC</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-DESC-3"><code>DESC</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Special-Fonts.html#index-DESC-4"><code>DESC</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Special-Fonts.html">Special Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-diffmk"><code>diffmk</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-E">E</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-ec_002etmac"><code>ec.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-en_002etmac"><code>en.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-eqn"><code>eqn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-F">F</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-fr_002etmac"><code>fr.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-freeeuro_002epfa"><code>freeeuro.pfa</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-G">G</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-gchem"><code>gchem</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-gdiffmk"><code>gdiffmk</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-geqn"><code>geqn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-ggrn"><code>ggrn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-gpic"><code>gpic</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-grap"><code>grap</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-grefer"><code>grefer</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-groff"><code>groff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-gsoelim"><code>gsoelim</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-gtbl"><code>gtbl</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-gtroff"><code>gtroff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-I">I</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-it_002etmac"><code>it.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-J">J</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-ja_002etmac"><code>ja.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-L">L</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-latin1_002etmac"><code>latin1.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-latin2_002etmac"><code>latin2.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-latin5_002etmac"><code>latin5.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Encodings.html#index-latin9_002etmac"><code>latin9.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Encodings.html">Input Encodings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-M">M</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Indexing.html#index-makeindex"><code>makeindex</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Indexing.html">Indexing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-man_002elocal"><code>man.local</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="man.html#index-man_002etmac"><code>man.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="man.html">man</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Optional-man-extensions.html#index-man_002eultrix"><code>man.ultrix</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Optional-man-extensions.html">Optional man extensions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-N">N</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-nrchbar"><code>nrchbar</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-P">P</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Paper-Format.html#index-papersize_002etmac"><code>papersize.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Paper-Format.html">Paper Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-perl"><code>perl</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-pic"><code>pic</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-post_002dgrohtml"><code>post-grohtml</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-pre_002dgrohtml"><code>pre-grohtml</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-preconv"><code>preconv</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-refer"><code>refer</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-S">S</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-soelim"><code>soelim</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-sv_002etmac"><code>sv.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-T">T</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Insertions.html#index-tbl"><code>tbl</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Insertions.html">ms Insertions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Writing-Macros.html#index-trace_002etmac"><code>trace.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Writing-Macros.html">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-troffrc"><code>troffrc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Paper-Format.html#index-troffrc-1"><code>troffrc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Paper-Format.html">Paper Format</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-troffrc-2"><code>troffrc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-troffrc-3"><code>troffrc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="troff-and-nroff-Modes.html#index-troffrc-4"><code>troffrc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="troff-and-nroff-Modes.html"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Groff-Options.html#index-troffrc_002dend"><code>troffrc-end</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Groff-Options.html">Groff Options</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-troffrc_002dend-1"><code>troffrc-end</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="troff-and-nroff-Modes.html#index-troffrc_002dend-2"><code>troffrc-end</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="troff-and-nroff-Modes.html"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="troff-and-nroff-Modes.html#index-tty_002etmac"><code>tty.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="troff-and-nroff-Modes.html"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-tty_002etmac-1"><code>tty.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-V">V</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Operators-in-Conditionals.html#index-vtroff"><code>vtroff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Operators-in-Conditionals.html">Operators in Conditionals</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Program-and-File-Index_pg_letter-Z">Z</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-zh_002etmac"><code>zh.tmac</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table class="pg-letters-footer-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-J"><b>J</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Program-and-File-Index_pg_letter-Z"><b>Z</b></a>
+ &nbsp;
+</td></tr></table>
+</div>
+
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Concept-Index.html">Concept Index</a>, Previous: <a href="File-Keyword-Index.html">File Keyword Index</a>, Up: <a href="index.html">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Punning-Names.html b/doc/groff.html.node/Punning-Names.html
new file mode 100644
index 0000000..dde1a20
--- /dev/null
+++ b/doc/groff.html.node/Punning-Names.html
@@ -0,0 +1,190 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Punning Names (The GNU Troff Manual)</title>
+
+<meta name="description" content="Punning Names (The GNU Troff Manual)">
+<meta name="keywords" content="Punning Names (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Environments.html" rel="next" title="Environments">
+<link href="Diversions.html" rel="prev" title="Diversions">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+kbd.key {font-style: normal}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Punning-Names">
+<div class="nav-panel">
+<p>
+Next: <a href="Environments.html" accesskey="n" rel="next">Environments</a>, Previous: <a href="Diversions.html" accesskey="p" rel="prev">Diversions</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Punning-Names-1">5.30 Punning Names</h3>
+<a class="index-entry-id" id="index-diversions-1"></a>
+
+<p>Macros, strings, and diversions share a name space; recall
+<a class="ref" href="Identifiers.html">Identifiers</a>. Internally, the same mechanism is used to store
+them. You can thus call a macro with string interpolation syntax and
+vice versa.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de subject
+Typesetting
+..
+.de predicate
+rewards attention to detail
+..
+\*[subject] \*[predicate].
+Truly.
+ &rArr; Typesetting
+ &rArr; rewards attention to detail Truly.
+</pre></div></div>
+
+<p>What went wrong? Strings don&rsquo;t contain newlines, but macros do. String
+interpolation placed a newline at the end of &lsquo;<samp class="samp">\*[subject]</samp>&rsquo;, and the
+next thing on the input was a space. Then when &lsquo;<samp class="samp">\*[predicate]</samp>&rsquo; was
+interpolated, it was followed by the empty request &lsquo;<samp class="samp">.</samp>&rsquo; on a line by
+itself. If we want to use macros as strings, we must take interpolation
+behavior into account.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de subject
+Typesetting\\
+..
+.de predicate
+rewards attention to detail\\
+..
+\*[subject] \*[predicate].
+Truly.
+ &rArr; Typesetting rewards attention to detail. Truly.
+</pre></div></div>
+
+<p>By ending each text line of the macros with an escaped
+<code class="code">\<kbd class="key">RET</kbd></code>, we get the desired effect (see <a class="pxref" href="Line-Continuation.html">Line Continuation</a>).<a class="footnote" id="DOCF114" href="groff.html_fot.html#FOOT114"><sup>114</sup></a>
+What would have happened if we had used only one backslash at a time
+instead?
+</p>
+<p>Interpolating a string does not hide existing macro arguments. We can
+also place the escaped newline outside the string interpolation instead
+of within the string definition. Thus, in a macro, a more efficient way
+of doing
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.xx \\$@
+</pre></div></div>
+
+<p>is
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">\\*[xx]\\
+</pre></div></div>
+
+<p>The latter calling syntax doesn&rsquo;t change the value of <code class="code">\$0</code>, which
+is then inherited from the calling macro (see <a class="pxref" href="Parameters.html">Parameters</a>).
+</p>
+<p>Diversions can be also called with string syntax. It is sometimes
+convenient to copy one-line diversions to a string.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.di xx
+the
+.ft I
+interpolation system
+.ft
+.br
+.di
+.ds yy This is a test of \*(xx\c
+\*(yy.
+ &rArr; This is a test of the <i class="i">interpolation system</i>.
+</pre></div></div>
+
+<p>As the previous example shows, it is possible to store formatted output
+in strings. The <code class="code">\c</code> escape sequence prevents the subsequent
+newline from being interpreted as a break (again,
+see <a class="pxref" href="Line-Continuation.html">Line Continuation</a>).
+</p>
+<p>Copying multi-output line diversions produces unexpected results.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.di xxx
+a funny
+.br
+test
+.br
+.di
+.ds yyy This is \*[xxx]\c
+\*[yyy].
+ &rArr; test This is a funny.
+</pre></div></div>
+
+<p>Usually, it is not predictable whether a diversion contains one or more
+output lines, so this mechanism should be avoided. With <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code>, this was the only solution to strip off a final newline
+from a diversion. Another disadvantage is that the spaces in the copied
+string are already formatted, preventing their adjustment. This can
+cause ugly results.
+</p>
+<a class="index-entry-id" id="index-stripping-final-newline-in-diversions"></a>
+<a class="index-entry-id" id="index-diversion_002c-stripping-final-newline"></a>
+<a class="index-entry-id" id="index-final-newline_002c-stripping-in-diversions"></a>
+<a class="index-entry-id" id="index-newline_002c-final_002c-stripping-in-diversions"></a>
+<a class="index-entry-id" id="index-horizontal-space_002c-unformatting"></a>
+<a class="index-entry-id" id="index-space_002c-horizontal_002c-unformatting"></a>
+<a class="index-entry-id" id="index-unformatting-horizontal-space"></a>
+<p>A clean solution to this problem is available in GNU <code class="code">troff</code>, using
+the requests <code class="code">chop</code> to remove the final newline of a diversion, and
+<code class="code">unformat</code> to make the horizontal spaces adjustable again.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.box xxx
+a funny
+.br
+test
+.br
+.box
+.chop xxx
+.unformat xxx
+This is \*[xxx].
+ &rArr; This is a funny test.
+</pre></div></div>
+
+<p>See <a class="xref" href="Gtroff-Internals.html"><code class="code">gtroff</code> Internals</a>.
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Environments.html">Environments</a>, Previous: <a href="Diversions.html">Diversions</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Register-Index.html b/doc/groff.html.node/Register-Index.html
new file mode 100644
index 0000000..979a346
--- /dev/null
+++ b/doc/groff.html.node/Register-Index.html
@@ -0,0 +1,349 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Register Index (The GNU Troff Manual)</title>
+
+<meta name="description" content="Register Index (The GNU Troff Manual)">
+<meta name="keywords" content="Register Index (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="index.html" rel="up" title="Top">
+<link href="Macro-Index.html" rel="next" title="Macro Index">
+<link href="Operator-Index.html" rel="prev" title="Operator Index">
+<style type="text/css">
+<!--
+a.summary-letter-printindex {text-decoration: none}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+td.printindex-index-entry {vertical-align: top}
+td.printindex-index-section {vertical-align: top}
+th.entries-header-printindex {text-align:left}
+th.sections-header-printindex {text-align:left}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="appendix-level-extent" id="Register-Index">
+<div class="nav-panel">
+<p>
+Next: <a href="Macro-Index.html" accesskey="n" rel="next">Macro Index</a>, Previous: <a href="Operator-Index.html" accesskey="p" rel="prev">Operator Index</a>, Up: <a href="index.html" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h2 class="appendix" id="Register-Index-1">Appendix E Register Index</h2>
+
+<p>The macro package or program a specific register belongs to is appended
+in brackets.
+</p>
+<p>A register name&nbsp;<code class="code">x</code> consisting of exactly one character can be
+accessed as &lsquo;<samp class="samp">\nx</samp>&rsquo;. A register name <code class="code">xx</code> consisting of exactly
+two characters can be accessed as &lsquo;<samp class="samp">\n(xx</samp>&rsquo;. Register names
+<code class="code">xxx</code> of any length can be accessed as &lsquo;<samp class="samp">\n[xxx]</samp>&rsquo;.
+</p>
+<div class="printindex vr-printindex">
+<table class="vr-letters-header-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Register-Index_vr_symbol-1"><b>$</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_symbol-2"><b>%</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_symbol-3"><b>.</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-Y"><b>Y</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="vr-entries-printindex" border="0">
+<tr><td></td><th class="entries-header-printindex">Index Entry</th><td>&nbsp;</td><th class="sections-header-printindex"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_symbol-1">$</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-_0024_0024"><code>$$</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_symbol-2">%</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-_0025-1"><code>%</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-_0025-2"><code>%</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_symbol-3">.</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Parameters.html#index-_002e_0024"><code>.$</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Parameters.html">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-_002eA"><code>.A</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Spacing.html#index-_002ea"><code>.a</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Spacing.html">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-_002eb"><code>.b</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Control-Characters.html#index-_002ebr-1"><code>.br</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Control-Characters.html">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-_002ec"><code>.c</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Compatibility-Mode.html#index-_002eC"><code>.C</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Compatibility-Mode.html">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-_002ecdp"><code>.cdp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-_002ece-1"><code>.ce</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-_002echt"><code>.cht</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-_002ecolor-1"><code>.color</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Compatibility-Mode.html#index-_002ecp-1"><code>.cp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Compatibility-Mode.html">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-_002ecsk"><code>.csk</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-_002ed"><code>.d</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-_002eev-1"><code>.ev</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-_002eF"><code>.F</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Positions.html#index-_002ef"><code>.f</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Positions.html">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-_002efam-1"><code>.fam</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-_002efn"><code>.fn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Positions.html#index-_002efp-1"><code>.fp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Positions.html">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-_002eg"><code>.g</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Motion-Quanta.html#index-_002eH"><code>.H</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Motion-Quanta.html">Motion Quanta</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-_002eh"><code>.h</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-_002eheight"><code>.height</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-_002ehla-1"><code>.hla</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-_002ehlc"><code>.hlc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-_002ehlm-1"><code>.hlm</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-_002ehy-1"><code>.hy</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-_002ehym-1"><code>.hym</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-_002ehys-1"><code>.hys</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-_002ei"><code>.i</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-_002ein-3"><code>.in</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Continuation.html#index-_002eint"><code>.int</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Continuation.html">Line Continuation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-_002ej"><code>.j</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-_002ek"><code>.k</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Ligatures-and-Kerning.html#index-_002ekern-1"><code>.kern</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Ligatures-and-Kerning.html">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Spacing.html#index-_002eL"><code>.L</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Spacing.html">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-_002el"><code>.l</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Ligatures-and-Kerning.html#index-_002elg-1"><code>.lg</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Ligatures-and-Kerning.html">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-_002elinetabs-1"><code>.linetabs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-_002ell-3"><code>.ll</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-_002elt-3"><code>.lt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-_002em"><code>.m</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-_002eM"><code>.M</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-_002en"><code>.n</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-_002ene-1"><code>.ne</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-_002enm-1"><code>.nm</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-_002enn-1"><code>.nn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Spacing.html#index-_002ens-1"><code>.ns</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Spacing.html">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-_002eo"><code>.o</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Suppressing-Output.html#index-_002eO"><code>.O</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Suppressing-Output.html">Suppressing Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-_002eP"><code>.P</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-_002ep"><code>.p</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-_002epe"><code>.pe</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-_002epn-3"><code>.pn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-_002eps-3"><code>.ps</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-_002epsr"><code>.psr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Vertical-Spacing.html#index-_002epvs-3"><code>.pvs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Vertical-Spacing.html">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-_002eR-2"><code>.R</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-_002erj-1"><code>.rj</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Type-Size.html#index-_002es"><code>.s</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Type-Size.html">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-_002eslant"><code>.slant</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Fractional-Type-Sizes.html#index-_002esr"><code>.sr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Fractional-Type-Sizes.html">Using Fractional Type Sizes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-_002ess-1"><code>.ss</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-_002esss"><code>.sss</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-_002esty-1"><code>.sty</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-_002eT-2"><code>.T</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-_002et"><code>.t</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-_002etabs"><code>.tabs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-_002etrunc"><code>.trunc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-_002eU"><code>.U</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-_002eu"><code>.u</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Motion-Quanta.html#index-_002eV"><code>.V</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Motion-Quanta.html">Motion Quanta</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Vertical-Spacing.html#index-_002ev"><code>.v</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Vertical-Spacing.html">Changing the Vertical Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Vertical-Position-Traps.html#index-_002evpt-1"><code>.vpt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Vertical-Position-Traps.html">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-_002ew"><code>.w</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-_002ewarn-1"><code>.warn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-_002ex"><code>.x</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-_002ey"><code>.y</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-_002eY"><code>.Y</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-_002ez"><code>.z</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-_002ezoom"><code>.zoom</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-c_002e"><code>c.</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-ct"><code>ct</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-D">D</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-DD-_005bms_005d"><code>DD <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-DI-_005bms_005d"><code>DI <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-dl"><code>dl</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-dn"><code>dn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-dw"><code>dw</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-dy"><code>dy</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-F">F</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-FF-_005bms_005d"><code>FF <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-FI-_005bms_005d"><code>FI <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-FM-_005bms_005d"><code>FM <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-FPD-_005bms_005d"><code>FPD <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-FPS-_005bms_005d"><code>FPS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-FVS-_005bms_005d"><code>FVS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-G">G</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-GROWPS-_005bms_005d"><code>GROWPS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Differences-from-AT_0026T-ms.html#index-GS-_005bms_005d"><code>GS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Differences-from-AT_0026T-ms.html">Differences from AT&amp;T ms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-H">H</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-HM-_005bms_005d"><code>HM <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-HORPHANS-_005bms_005d"><code>HORPHANS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-hours"><code>hours</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-hp"><code>hp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-HY-_005bms_005d"><code>HY <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-L">L</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-LL-_005bms_005d"><code>LL <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-llx"><code>llx</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-lly"><code>lly</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-ln"><code>ln</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Leading-Space-Traps.html#index-lsn"><code>lsn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Leading-Space-Traps.html">Leading Space Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Leading-Space-Traps.html#index-lss"><code>lss</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Leading-Space-Traps.html">Leading Space Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-LT-_005bms_005d"><code>LT <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-M">M</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-MINGW-_005bms_005d"><code>MINGW <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-minutes"><code>minutes</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-mo"><code>mo</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-N">N</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-nl"><code>nl</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-O">O</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Suppressing-Output.html#index-opmaxx"><code>opmaxx</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Suppressing-Output.html">Suppressing Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Suppressing-Output.html#index-opmaxy"><code>opmaxy</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Suppressing-Output.html">Suppressing Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Suppressing-Output.html#index-opminx"><code>opminx</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Suppressing-Output.html">Suppressing Output</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Suppressing-Output.html#index-opminy"><code>opminy</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Suppressing-Output.html">Suppressing Output</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-P">P</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-PD-_005bms_005d"><code>PD <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-PI-_005bms_005d"><code>PI <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-PO-_005bms_005d"><code>PO <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-PORPHANS-_005bms_005d"><code>PORPHANS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-PS-_005bms_005d-1"><code>PS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-PSINCR-_005bms_005d"><code>PSINCR <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-Q">Q</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-QI-_005bms_005d"><code>QI <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-rsb"><code>rsb</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-rst"><code>rst</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-S">S</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-sb"><code>sb</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-seconds"><code>seconds</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-skw"><code>skw</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-slimit"><code>slimit</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-ssc"><code>ssc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-st"><code>st</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-systat"><code>systat</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-T">T</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-TC_002dMARGIN-_005bms_005d"><code>TC-MARGIN <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-U">U</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-urx"><code>urx</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-ury"><code>ury</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-V">V</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-VS-_005bms_005d"><code>VS <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Register-Index_vr_letter-Y">Y</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-year"><code>year</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Built_002din-Registers.html#index-yr"><code>yr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Built_002din-Registers.html">Built-in Registers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table class="vr-letters-footer-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Register-Index_vr_symbol-1"><b>$</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_symbol-2"><b>%</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_symbol-3"><b>.</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Register-Index_vr_letter-Y"><b>Y</b></a>
+ &nbsp;
+</td></tr></table>
+</div>
+
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Macro-Index.html">Macro Index</a>, Previous: <a href="Operator-Index.html">Operator Index</a>, Up: <a href="index.html">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Registers.html b/doc/groff.html.node/Registers.html
new file mode 100644
index 0000000..6f33d51
--- /dev/null
+++ b/doc/groff.html.node/Registers.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Registers (The GNU Troff Manual)</title>
+
+<meta name="description" content="Registers (The GNU Troff Manual)">
+<meta name="keywords" content="Registers (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Manipulating-Filling-and-Adjustment.html" rel="next" title="Manipulating Filling and Adjustment">
+<link href="Formatter-Instructions.html" rel="prev" title="Formatter Instructions">
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Registers">
+<div class="nav-panel">
+<p>
+Next: <a href="Manipulating-Filling-and-Adjustment.html" accesskey="n" rel="next">Manipulating Filling and Adjustment</a>, Previous: <a href="Formatter-Instructions.html" accesskey="p" rel="prev">Formatter Instructions</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Registers-1">5.8 Registers</h3>
+<a class="index-entry-id" id="index-registers"></a>
+
+<p>In the <code class="code">roff</code> language, numbers can be stored in <em class="dfn">registers</em>.
+Many built-in registers exist, supplying anything from the date to
+details of formatting parameters. You can also define your own.
+See <a class="xref" href="Identifiers.html">Identifiers</a>, for information on constructing a valid name for a
+register.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="Setting-Registers.html" accesskey="1">Setting Registers</a></li>
+<li><a href="Interpolating-Registers.html" accesskey="2">Interpolating Registers</a></li>
+<li><a href="Auto_002dincrement.html" accesskey="3">Auto-increment</a></li>
+<li><a href="Assigning-Register-Formats.html" accesskey="4">Assigning Register Formats</a></li>
+<li><a href="Built_002din-Registers.html" accesskey="5">Built-in Registers</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Request-Index.html b/doc/groff.html.node/Request-Index.html
new file mode 100644
index 0000000..dc328f2
--- /dev/null
+++ b/doc/groff.html.node/Request-Index.html
@@ -0,0 +1,394 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Request Index (The GNU Troff Manual)</title>
+
+<meta name="description" content="Request Index (The GNU Troff Manual)">
+<meta name="keywords" content="Request Index (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="#Request-Index" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="index.html" rel="up" title="Top">
+<link href="Escape-Sequence-Index.html" rel="next" title="Escape Sequence Index">
+<link href="Copying-This-Manual.html" rel="prev" title="Copying This Manual">
+<style type="text/css">
+<!--
+a.summary-letter-printindex {text-decoration: none}
+td.printindex-index-entry {vertical-align: top}
+td.printindex-index-section {vertical-align: top}
+th.entries-header-printindex {text-align:left}
+th.sections-header-printindex {text-align:left}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="appendix-level-extent" id="Request-Index">
+<div class="nav-panel">
+<p>
+Next: <a href="Escape-Sequence-Index.html" accesskey="n" rel="next">Escape Sequence Index</a>, Previous: <a href="Copying-This-Manual.html" accesskey="p" rel="prev">Copying This Manual</a>, Up: <a href="index.html" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h2 class="appendix" id="Request-Index-1">Appendix B Request Index</h2>
+
+<p>Request names appear without a leading control character; the defaults
+are <code class="code">.</code> for the regular control character and <code class="code">'</code> for the
+no-break control character.
+</p>
+<div class="printindex rq-printindex">
+<table class="rq-letters-header-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Request-Index_rq_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-W"><b>W</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="rq-entries-printindex" border="0">
+<tr><td></td><th class="entries-header-printindex">Index Entry</th><td>&nbsp;</td><th class="sections-header-printindex"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-A">A</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-ab"><code>ab</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-ad"><code>ad</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Assigning-Register-Formats.html#index-af"><code>af</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Assigning-Register-Formats.html">Assigning Register Formats</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Setting-Registers.html#index-aln"><code>aln</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Setting-Registers.html">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-als"><code>als</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Writing-Macros.html#index-am"><code>am</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Writing-Macros.html">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Writing-Macros.html#index-am1"><code>am1</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Writing-Macros.html">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Writing-Macros.html#index-ami"><code>ami</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Writing-Macros.html">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Writing-Macros.html#index-ami1"><code>ami1</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Writing-Macros.html">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-as"><code>as</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-as1"><code>as1</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-asciify"><code>asciify</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-B">B</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-backtrace"><code>backtrace</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-bd"><code>bd</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Blank-Line-Traps.html#index-blm"><code>blm</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Blank-Line-Traps.html">Blank Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-box"><code>box</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-boxa"><code>boxa</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-bp"><code>bp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-br"><code>br</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="while.html#index-break-2"><code>break</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="while.html">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-brp"><code>brp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Control-Characters.html#index-c2"><code>c2</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Control-Characters.html">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Control-Characters.html#index-cc"><code>cc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Control-Characters.html">Control Characters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-ce"><code>ce</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-cf"><code>cf</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-cflags"><code>cflags</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-ch"><code>ch</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-char"><code>char</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-chop"><code>chop</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Classes.html#index-class"><code>class</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Classes.html">Character Classes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-close"><code>close</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-color"><code>color</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-composite"><code>composite</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="while.html#index-continue"><code>continue</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="while.html">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Compatibility-Mode.html#index-cp"><code>cp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Compatibility-Mode.html">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-cs"><code>cs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-cu"><code>cu</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-D">D</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-da"><code>da</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Writing-Macros.html#index-de"><code>de</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Writing-Macros.html">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Writing-Macros.html#index-de1"><code>de1</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Writing-Macros.html">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-defcolor"><code>defcolor</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Writing-Macros.html#index-dei"><code>dei</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Writing-Macros.html">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Writing-Macros.html#index-dei1"><code>dei1</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Writing-Macros.html">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Postprocessor-Access.html#index-device"><code>device</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Postprocessor-Access.html">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Postprocessor-Access.html#index-devicem"><code>devicem</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Postprocessor-Access.html">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-di"><code>di</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Compatibility-Mode.html#index-do"><code>do</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Compatibility-Mode.html">Compatibility Mode</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-ds"><code>ds</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-ds-1"><code>ds</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-ds1"><code>ds1</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversion-Traps.html#index-dt"><code>dt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversion-Traps.html">Diversion Traps</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-E">E</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Escape-Sequences.html#index-ec"><code>ec</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Escape-Sequences.html">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Escape-Sequences.html#index-ecr"><code>ecr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Escape-Sequences.html">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Escape-Sequences.html#index-ecs"><code>ecs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Escape-Sequences.html">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="if_002delse.html#index-el"><code>el</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="if_002delse.html">if-else</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="End_002dof_002dinput-Traps.html#index-em"><code>em</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="End_002dof_002dinput-Traps.html">End-of-input Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Escape-Sequences.html#index-eo"><code>eo</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Escape-Sequences.html">Using Escape Sequences</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-ev"><code>ev</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Environments.html#index-evc"><code>evc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Environments.html">Environments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-ex"><code>ex</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-F">F</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-fam"><code>fam</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Fields.html#index-fc"><code>fc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Fields.html">Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-fchar"><code>fchar</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-fcolor"><code>fcolor</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-fi"><code>fi</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-fl"><code>fl</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Positions.html#index-fp"><code>fp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Positions.html">Font Positions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-fschar"><code>fschar</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Special-Fonts.html#index-fspecial"><code>fspecial</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Special-Fonts.html">Special Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-ft"><code>ft</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-ftr"><code>ftr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Selecting-Fonts.html#index-fzoom"><code>fzoom</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Selecting-Fonts.html">Selecting Fonts</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-G">G</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Colors.html#index-gcolor"><code>gcolor</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Colors.html">Colors</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-H">H</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hc"><code>hc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hcode"><code>hcode</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hla"><code>hla</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hlm"><code>hlm</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hpf"><code>hpf</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hpfa"><code>hpfa</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hpfcode"><code>hpfcode</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hw"><code>hw</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hy"><code>hy</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hym"><code>hym</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-hys"><code>hys</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-I">I</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="if_002delse.html#index-ie"><code>ie</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="if_002delse.html">if-else</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="if_002dthen.html#index-if"><code>if</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="if_002dthen.html">if-then</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Comments.html#index-ig"><code>ig</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Comments.html">Comments</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-in-1"><code>in</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Line-Traps.html#index-it"><code>it</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Line-Traps.html">Input Line Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Input-Line-Traps.html#index-itc"><code>itc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Input-Line-Traps.html">Input Line Traps</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-K">K</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Ligatures-and-Kerning.html#index-kern"><code>kern</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Ligatures-and-Kerning.html">Ligatures and Kerning</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-L">L</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Leaders.html#index-lc"><code>lc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Leaders.html">Leaders</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-length"><code>length</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-lf"><code>lf</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Ligatures-and-Kerning.html#index-lg"><code>lg</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Ligatures-and-Kerning.html">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-linetabs"><code>linetabs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-ll-1"><code>ll</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Spacing.html#index-ls"><code>ls</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Spacing.html">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Leading-Space-Traps.html#index-lsm"><code>lsm</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Leading-Space-Traps.html">Leading Space Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-lt"><code>lt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-M">M</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-mc"><code>mc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-mk"><code>mk</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-mso"><code>mso</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-msoquiet"><code>msoquiet</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-N">N</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-na"><code>na</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-ne"><code>ne</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-nf"><code>nf</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-nh"><code>nh</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-nm"><code>nm</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-nn"><code>nn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="if_002dthen.html#index-nop"><code>nop</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="if_002dthen.html">if-then</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-nr"><code>nr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Setting-Registers.html#index-nr-1"><code>nr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Setting-Registers.html">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Setting-Registers.html#index-nr-2"><code>nr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Setting-Registers.html">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Auto_002dincrement.html#index-nr-3"><code>nr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Auto_002dincrement.html">Auto-increment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="troff-and-nroff-Modes.html#index-nroff"><code>nroff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="troff-and-nroff-Modes.html"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Spacing.html#index-ns"><code>ns</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Spacing.html">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-nx"><code>nx</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-O">O</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-open"><code>open</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-opena"><code>opena</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-os"><code>os</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-output"><code>output</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-P">P</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-pc"><code>pc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-pev"><code>pev</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-pi"><code>pi</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-pl"><code>pl</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-pm"><code>pm</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-pn"><code>pn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-pnr"><code>pnr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-po-1"><code>po</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Type-Size.html#index-ps"><code>ps</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Type-Size.html">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Miscellaneous.html#index-psbb"><code>psbb</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Miscellaneous.html">Miscellaneous</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-pso"><code>pso</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-ptr"><code>ptr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Vertical-Spacing.html#index-pvs"><code>pvs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Vertical-Spacing.html">Changing the Vertical Spacing</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-rchar"><code>rchar</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-rd"><code>rd</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Writing-Macros.html#index-return"><code>return</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Writing-Macros.html">Writing Macros</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-rfschar"><code>rfschar</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-rj"><code>rj</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-rm"><code>rm</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-rn"><code>rn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Setting-Registers.html#index-rnn"><code>rnn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Setting-Registers.html">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Setting-Registers.html#index-rr"><code>rr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Setting-Registers.html">Setting Registers</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Spacing.html#index-rs"><code>rs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Spacing.html">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Motions.html#index-rt"><code>rt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Motions.html">Page Motions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-S">S</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Using-Symbols.html#index-schar"><code>schar</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Using-Symbols.html">Using Symbols</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Hyphenation.html#index-shc"><code>shc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Hyphenation.html">Manipulating Hyphenation</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Parameters.html#index-shift"><code>shift</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Parameters.html">Parameters</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Type-Size.html#index-sizes-1"><code>sizes</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Type-Size.html">Changing the Type Size</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-so"><code>so</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-soquiet"><code>soquiet</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Spacing.html#index-sp"><code>sp</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Spacing.html">Manipulating Spacing</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Special-Fonts.html#index-special-2"><code>special</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Special-Fonts.html">Special Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-spreadwarn"><code>spreadwarn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Manipulating-Filling-and-Adjustment.html#index-ss"><code>ss</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-stringdown"><code>stringdown</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-stringup"><code>stringup</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Font-Families.html#index-sty"><code>sty</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Font-Families.html">Font Families</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-substring"><code>substring</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Control.html#index-sv"><code>sv</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Control.html">Page Control</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-sy"><code>sy</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-T">T</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-ta"><code>ta</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Postprocessor-Access.html#index-tag"><code>tag</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Postprocessor-Access.html">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Postprocessor-Access.html#index-taga"><code>taga</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Postprocessor-Access.html">Postprocessor Access</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Tabs-and-Fields.html#index-tc"><code>tc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Tabs-and-Fields.html">Tabs and Fields</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Line-Layout.html#index-ti"><code>ti</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Line-Layout.html">Line Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Ligatures-and-Kerning.html#index-tkf"><code>tkf</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Ligatures-and-Kerning.html">Ligatures and Kerning</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Layout.html#index-tl"><code>tl</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Layout.html">Page Layout</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-tm"><code>tm</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-tm1"><code>tm1</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-tmc"><code>tmc</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-tr"><code>tr</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-trf"><code>trf</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-trin"><code>trin</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Character-Translations.html#index-trnt"><code>trnt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Character-Translations.html">Character Translations</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="troff-and-nroff-Modes.html#index-troff"><code>troff</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="troff-and-nroff-Modes.html"><code class="code">troff</code> and <code class="code">nroff</code> Modes</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-U">U</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-uf"><code>uf</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Artificial-Fonts.html#index-ul"><code>ul</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Artificial-Fonts.html">Artificial Fonts</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Diversions.html#index-unformat"><code>unformat</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Diversions.html">Diversions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-V">V</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Vertical-Position-Traps.html#index-vpt"><code>vpt</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Vertical-Position-Traps.html">Vertical Position Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Changing-the-Vertical-Spacing.html#index-vs"><code>vs</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Changing-the-Vertical-Spacing.html">Changing the Vertical Spacing</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Request-Index_rq_letter-W">W</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-warn"><code>warn</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Debugging.html#index-warnscale"><code>warnscale</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Debugging.html">Debugging</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Page-Location-Traps.html#index-wh"><code>wh</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Page-Location-Traps.html">Page Location Traps</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="while.html#index-while-1"><code>while</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="while.html">while</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-write"><code>write</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-writec"><code>writec</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="I_002fO.html#index-writem"><code>writem</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="I_002fO.html">I/O</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table class="rq-letters-footer-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#Request-Index_rq_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#Request-Index_rq_letter-W"><b>W</b></a>
+ &nbsp;
+</td></tr></table>
+</div>
+
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Escape-Sequence-Index.html">Escape Sequence Index</a>, Previous: <a href="Copying-This-Manual.html">Copying This Manual</a>, Up: <a href="index.html">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Request-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Requests-and-Macros.html b/doc/groff.html.node/Requests-and-Macros.html
new file mode 100644
index 0000000..8a009b3
--- /dev/null
+++ b/doc/groff.html.node/Requests-and-Macros.html
@@ -0,0 +1,221 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Requests and Macros (The GNU Troff Manual)</title>
+
+<meta name="description" content="Requests and Macros (The GNU Troff Manual)">
+<meta name="keywords" content="Requests and Macros (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Text.html" rel="up" title="Text">
+<link href="Macro-Packages.html" rel="next" title="Macro Packages">
+<link href="Tabs-and-Leaders.html" rel="prev" title="Tabs and Leaders">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Requests-and-Macros">
+<div class="nav-panel">
+<p>
+Next: <a href="Macro-Packages.html" accesskey="n" rel="next">Macro Packages</a>, Previous: <a href="Tabs-and-Leaders.html" accesskey="p" rel="prev">Tabs and Leaders</a>, Up: <a href="Text.html" accesskey="u" rel="up">Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Requests-and-Macros-1">5.1.7 Requests and Macros</h4>
+
+<p>We have now encountered almost all of the syntax there is in the
+<code class="code">roff</code> language, with an exception already noted in passing.
+<a class="index-entry-id" id="index-request"></a>
+<a class="index-entry-id" id="index-control-character-_0028_002e_0029"></a>
+<a class="index-entry-id" id="index-character_002c-control-_0028_002e_0029"></a>
+<a class="index-entry-id" id="index-no_002dbreak-control-character-_0028_0027_0029"></a>
+<a class="index-entry-id" id="index-character_002c-no_002dbreak-control-_0028_0027_0029"></a>
+<a class="index-entry-id" id="index-control-character_002c-no_002dbreak-_0028_0027_0029"></a>
+A <em class="dfn">request</em> is an instruction to the formatter that occurs after a
+<em class="dfn">control character</em>, which is recognized at the beginning of an
+input line. The regular control character is a dot (<code class="code">.</code>). Its
+counterpart, the <em class="dfn">no-break control character</em>, a neutral apostrophe
+(<code class="code">'</code>), suppresses the break that is implied by some requests.
+These characters were chosen because it is uncommon for lines of text in
+natural languages to begin with them.
+<a class="index-entry-id" id="index-dummy-character-_0028_005c_0026_0029_002c-as-control-character-suppressor"></a>
+<a class="index-entry-id" id="index-character_002c-dummy-_0028_005c_0026_0029_002c-as-control-character-suppressor"></a>
+If you require a formatted period or apostrophe (closing single
+quotation mark) where GNU <code class="code">troff</code> is expecting a control character,
+prefix the dot or neutral apostrophe with the dummy character escape
+sequence, &lsquo;<samp class="samp">\&amp;</samp>&rsquo;.
+</p>
+<a class="index-entry-id" id="index-control-line"></a>
+<p>An input line beginning with a control character is called a
+<em class="dfn">control line</em>.
+<a class="index-entry-id" id="index-text-line"></a>
+Every line of input that is not a control line is a <em class="dfn">text
+line</em>.<a class="footnote" id="DOCF25" href="groff.html_fot.html#FOOT25"><sup>25</sup></a>
+</p>
+<a class="index-entry-id" id="index-argument"></a>
+<p>Requests often take <em class="dfn">arguments</em>, words (separated from the request
+name and each other by spaces) that specify details of the action GNU
+<code class="code">troff</code> is expected to perform. If a request is meaningless
+without arguments, it is typically ignored.
+</p>
+<p>GNU <code class="code">troff</code>&rsquo;s requests and escape sequences comprise the control
+language of the formatter. Of key importance are the requests that
+define macros. Macros are invoked like requests, enabling the request
+repertoire to be extended or overridden.<a class="footnote" id="DOCF26" href="groff.html_fot.html#FOOT26"><sup>26</sup></a>
+</p>
+<a class="index-entry-id" id="index-macro"></a>
+<a class="index-entry-id" id="index-calling-a-macro"></a>
+<a class="index-entry-id" id="index-interpolation"></a>
+<p>A <em class="dfn">macro</em> can be thought of as an abbreviation you can define for a
+collection of control and text lines. When the macro is <em class="dfn">called</em> by
+giving its name after a control character, it is replaced with what it
+stands for. The process of textual replacement is known as
+<em class="dfn">interpolation</em>.<a class="footnote" id="DOCF27" href="groff.html_fot.html#FOOT27"><sup>27</sup></a> Interpolations are handled as soon as they are
+recognized, and once performed, a <code class="code">roff</code> formatter scans the
+replacement for further requests, macro calls, and escape sequences.
+</p>
+<p>In <code class="code">roff</code> systems, the <code class="code">de</code> request defines a
+macro.<a class="footnote" id="DOCF28" href="groff.html_fot.html#FOOT28"><sup>28</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de DATE
+2020-11-14
+..
+</pre></div></div>
+
+<p>The foregoing input produces no output by itself; all we have done is
+store some information. Observe the pair of dots that ends the macro
+definition. This is a default; you can specify your own terminator for
+the macro definition as the second argument to the <code class="code">de</code> request.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de NAME ENDNAME
+Heywood Jabuzzoff
+.ENDNAME
+</pre></div></div>
+
+<p>In fact, the ending marker is itself the name of a macro to be
+called, or a request to be invoked, if it is defined at the time its
+control line is read.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de END
+Big Rip
+..
+.de START END
+Big Bang
+.END
+.START
+ &rArr; Big Rip Big Bang
+</pre></div></div>
+
+<p>In the foregoing example, &ldquo;Big Rip&rdquo; printed before &ldquo;Big Bang&rdquo;
+because its macro was <em class="emph">called</em> first. Consider what would happen
+if we dropped <code class="code">END</code> from the &lsquo;<samp class="samp">.de START</samp>&rsquo; line and added
+<code class="code">..</code> after <code class="code">.END</code>. Would the order change?
+</p>
+<p>Let us consider a more elaborate example.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de DATE
+2020-10-05
+..
+.
+.de BOSS
+D.\&amp; Kruger,
+J.\&amp; Peterman
+..
+.
+.de NOTICE
+Approved:
+.DATE
+by
+.BOSS
+..
+.
+Insert tedious regulatory compliance paragraph here.
+
+.NOTICE
+
+Insert tedious liability disclaimer paragraph here.
+
+.NOTICE
+ &rArr; Insert tedious regulatory compliance paragraph here.
+ &rArr;
+ &rArr; Approved: 2020-10-05 by D. Kruger, J. Peterman
+ &rArr;
+ &rArr; Insert tedious liability disclaimer paragraph here.
+ &rArr;
+ &rArr; Approved: 2020-10-05 by D. Kruger, J. Peterman
+</pre></div></div>
+
+<p>The above document started with a series of control lines. Three macros
+were defined, with a <code class="code">de</code> request declaring each macro&rsquo;s name, and
+the &ldquo;body&rdquo; of the macro starting on the next line and continuing until
+a line with two dots &lsquo;<samp class="samp"><code class="code">..</code></samp>&rsquo; marked its end. The text proper
+began only after the macros were defined; this is a common pattern.
+Only the <code class="code">NOTICE</code> macro was called &ldquo;directly&rdquo; by the document;
+<code class="code">DATE</code> and <code class="code">BOSS</code> were called only by <code class="code">NOTICE</code> itself.
+Escape sequences were used in <code class="code">BOSS</code>, two levels of macro
+interpolation deep.
+</p>
+<p>The advantage in typing and maintenance economy may not be obvious from
+such a short example, but imagine a much longer document with dozens of
+such paragraphs, each requiring a notice of managerial approval.
+Consider what must happen if you are in charge of generating a new
+version of such a document with a different date, for a different boss.
+With well-chosen macros, you only have to change each datum in one
+place.
+</p>
+<p>In practice, we would probably use strings (see <a class="pxref" href="Strings.html">Strings</a>) instead of
+macros for such simple interpolations; what is important here is to
+glimpse the potential of macros and the power of recursive
+interpolation.
+</p>
+<p>We could have defined <code class="code">DATE</code> and <code class="code">BOSS</code> in the opposite order;
+perhaps less obviously, we could also have defined them <em class="emph">after</em>
+<code class="code">NOTICE</code>. &ldquo;Forward references&rdquo; like this are acceptable because
+the body of a macro definition is not (completely) interpreted, but
+stored instead (see <a class="pxref" href="Copy-Mode.html">Copy Mode</a>). While a macro is being defined (or
+appended to), requests are not interpreted and macros not interpolated,
+whereas some commonly used escape sequences <em class="emph">are</em> interpreted.
+<code class="code">roff</code> systems also support recursive macro calls, as long as you
+have a way to break the recursion (see <a class="pxref" href="Conditionals-and-Loops.html">Conditionals and Loops</a>).
+Maintainable <code class="code">roff</code> documents tend to arrange macro definitions to
+minimize forward references.
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Macro-Packages.html">Macro Packages</a>, Previous: <a href="Tabs-and-Leaders.html">Tabs and Leaders</a>, Up: <a href="Text.html">Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Safer-Mode.html b/doc/groff.html.node/Safer-Mode.html
new file mode 100644
index 0000000..eca3efd
--- /dev/null
+++ b/doc/groff.html.node/Safer-Mode.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Safer Mode (The GNU Troff Manual)</title>
+
+<meta name="description" content="Safer Mode (The GNU Troff Manual)">
+<meta name="keywords" content="Safer Mode (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Implementation-Differences.html" rel="up" title="Implementation Differences">
+<link href="Compatibility-Mode.html" rel="next" title="Compatibility Mode">
+<link href="Implementation-Differences.html" rel="prev" title="Implementation Differences">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Safer-Mode">
+<div class="nav-panel">
+<p>
+Next: <a href="Compatibility-Mode.html" accesskey="n" rel="next">Compatibility Mode</a>, Previous: <a href="Implementation-Differences.html" accesskey="p" rel="prev">Implementation Differences</a>, Up: <a href="Implementation-Differences.html" accesskey="u" rel="up">Implementation Differences</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Safer-Mode-1">5.38.1 Safer Mode</h4>
+<a class="index-entry-id" id="index-safer-mode-7"></a>
+<a class="index-entry-id" id="index-mode_002c-safer-7"></a>
+
+<a class="index-entry-id" id="index-pi-request_002c-disabled-by-default"></a>
+<a class="index-entry-id" id="index-sy-request_002c-disabled-by-default"></a>
+<p>The formatter operates in &ldquo;safer&rdquo; mode by default; to mitigate risks
+from untrusted input documents, the <code class="code">pi</code> and <code class="code">sy</code> requests are
+disabled. GNU <code class="code">troff</code>&rsquo;s <samp class="option">-U</samp> option enables &ldquo;unsafe
+mode&rdquo;, restoring their function and enabling additional <code class="code">groff</code>
+extension requests, <code class="code">open</code>, <code class="code">opena</code>, and <code class="code">pso</code>.
+See <a class="xref" href="I_002fO.html">I/O</a>.
+</p>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Sections-and-Chapters.html b/doc/groff.html.node/Sections-and-Chapters.html
new file mode 100644
index 0000000..b94de73
--- /dev/null
+++ b/doc/groff.html.node/Sections-and-Chapters.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Sections and Chapters (The GNU Troff Manual)</title>
+
+<meta name="description" content="Sections and Chapters (The GNU Troff Manual)">
+<meta name="keywords" content="Sections and Chapters (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Common-Features.html" rel="up" title="Common Features">
+<link href="Headers-and-Footers.html" rel="next" title="Headers and Footers">
+<link href="Paragraphs.html" rel="prev" title="Paragraphs">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Sections-and-Chapters">
+<div class="nav-panel">
+<p>
+Next: <a href="Headers-and-Footers.html" accesskey="n" rel="next">Headers and Footers</a>, Previous: <a href="Paragraphs.html" accesskey="p" rel="prev">Paragraphs</a>, Up: <a href="Common-Features.html" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Sections-and-Chapters-1">3.2.2 Sections and Chapters</h4>
+
+<p>The simplest kind of section heading is unnumbered, set in a bold or
+italic style, and occupies a line by itself. Others possess
+automatically numbered multi-level headings and/or different typeface
+styles or sizes at different levels. More sophisticated macro packages
+supply macros for designating chapters and appendices.
+</p>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Selecting-Fonts.html b/doc/groff.html.node/Selecting-Fonts.html
new file mode 100644
index 0000000..d6a59e7
--- /dev/null
+++ b/doc/groff.html.node/Selecting-Fonts.html
@@ -0,0 +1,227 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Selecting Fonts (The GNU Troff Manual)</title>
+
+<meta name="description" content="Selecting Fonts (The GNU Troff Manual)">
+<meta name="keywords" content="Selecting Fonts (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Using-Fonts.html" rel="up" title="Using Fonts">
+<link href="Font-Families.html" rel="next" title="Font Families">
+<link href="Using-Fonts.html" rel="prev" title="Using Fonts">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Selecting-Fonts">
+<div class="nav-panel">
+<p>
+Next: <a href="Font-Families.html" accesskey="n" rel="next">Font Families</a>, Previous: <a href="Using-Fonts.html" accesskey="p" rel="prev">Using Fonts</a>, Up: <a href="Using-Fonts.html" accesskey="u" rel="up">Using Fonts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Selecting-Fonts-1">5.19.1 Selecting Fonts</h4>
+<a class="index-entry-id" id="index-font_002c-selection"></a>
+
+<p>We use <em class="dfn">font</em> to refer to any of several means of identifying a
+font: by mounting position (&lsquo;<samp class="samp">3</samp>&rsquo;), by abstract style (&lsquo;<samp class="samp">B</samp>&rsquo;), or
+by its identifier (&lsquo;<samp class="samp">TB</samp>&rsquo;).
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eft"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ft</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">font</i></span>]</var><a class="copiable-link" href='#index-_002eft'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ft"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cff"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\f</code><span class="r"><i class="slanted">f</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cff'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cf"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cf_0028fn"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\f(</code><span class="r"><i class="slanted">fn</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005cf_0028fn'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cf_005bfont_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\f[</code><span class="r"><i class="slanted">font</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cf_005bfont_005d'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002efn_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.fn]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002efn_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002efn"></a>
+<a class="index-entry-id" id="index-changing-fonts-_0028ft_002c-_005cf_0029"></a>
+<a class="index-entry-id" id="index-fonts_002c-changing-_0028ft_002c-_005cf_0029"></a>
+<a class="index-entry-id" id="index-sty-request_002c-and-changing-fonts"></a>
+<a class="index-entry-id" id="index-fam-request_002c-and-changing-fonts"></a>
+<a class="index-entry-id" id="index-_005cF_002c-and-changing-fonts"></a>
+<a class="index-entry-id" id="index-styles"></a>
+<a class="index-entry-id" id="index-family"></a>
+<a class="index-entry-id" id="index-DESC"></a>
+<a class="index-entry-id" id="index-selecting-the-previous-font-_0028ft_0029"></a>
+<a class="index-entry-id" id="index-previous-font_002c-selecting-_0028ft_0029"></a>
+<a class="index-entry-id" id="index-font_002c-previous_002c-slecting-_0028ft_0029"></a>
+<p>The <code class="code">ft</code> request selects the typeface <var class="var">font</var>. If the argument
+is absent or &lsquo;<samp class="samp">P</samp>&rsquo;, it selects the previously chosen font. If
+<var class="var">font</var> is a non-negative integer, it is interpreted as mounting
+position; the font mounted there is selected. If that position refers
+to an abstract style, it is combined with the default family (see
+<code class="code">fam</code> and <code class="code">\F</code> below) to make a resolved font name. If the
+mounting position is not a style and no font is mounted there, GNU
+<code class="code">troff</code> emits a warning in category &lsquo;<samp class="samp">font</samp>&rsquo; and ignores the
+request.
+</p>
+<p>If <var class="var">font</var> matches a style name, it is combined with the current
+family to make a resolved font name. Otherwise, <var class="var">font</var> is assumed
+to already be a resolved font name.
+</p>
+<a class="index-entry-id" id="index-automatic-font-mounting"></a>
+<a class="index-entry-id" id="index-font-mounting_002c-automatic"></a>
+<a class="index-entry-id" id="index-mounting_002c-font_002c-automatic"></a>
+<p>The resolved font name is subject to translation (see request <code class="code">ftr</code>
+below). Next, the (possibly translated) font name&rsquo;s mounting position
+is looked up; if not mounted, <var class="var">font</var> is sought on the file system as
+a font description file and, if located, automatically mounted at the
+next available position (see register <code class="code">.fp</code> below). If the font
+was mounted using an identifier different from its font description file
+name (see request <code class="code">fp</code> below), that file name is then looked up.
+If a font description file for the resolved font name is not found, GNU
+<code class="code">troff</code> emits a warning in category &lsquo;<samp class="samp">font</samp>&rsquo; and ignores the
+request.
+</p>
+<p>The <code class="code">\f</code> escape sequence is similar, using one-character name (or
+mounting position) <var class="var">f</var>, two-character name <var class="var">fn</var>, or a name
+<var class="var">font</var> of arbitrary length.
+<a class="index-entry-id" id="index-previous-font_002c-selecting-_0028_005cf_005b_005d_002c-_005cfP_0029"></a>
+<a class="index-entry-id" id="index-font_002c-previous_002c-selecting-_0028_005cf_005b_005d_002c-_005cfP_0029"></a>
+&lsquo;<samp class="samp">\f[]</samp>&rsquo; selects the previous font. The syntax form &lsquo;<samp class="samp">\fP</samp>&rsquo; is
+supported for backward compatibility, and &lsquo;<samp class="samp">\f[P]</samp>&rsquo; for consistency.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">eggs, bacon,
+.ft I
+spam,
+.ft
+and sausage.
+.br
+eggs, bacon, \fIspam,\fP and sausage.
+ &rArr; eggs, bacon, <i class="slanted">spam,</i> and sausage
+ &rArr; eggs, bacon, <i class="slanted">spam,</i> and sausage
+</pre></div></div>
+
+<p>The current and previously selected fonts are properties of the
+environment (see <a class="pxref" href="Environments.html">Environments</a>).
+</p>
+<p>The read-only string-valued register <code class="code">.fn</code> contains the resolved
+font name of the selected font.
+</p>
+<p><code class="code">\f</code> doesn&rsquo;t produce an input token in GNU <code class="code">troff</code>; it thus
+can be used in requests that expect a single-character argument. We can
+assign a font to a margin character as follows (see <a class="pxref" href="Miscellaneous.html">Miscellaneous</a>).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.mc \f[I]x\f[]
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eftr"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ftr</code></strong> <var class="def-var-arguments">f [<span class="r"><i class="slanted">g</i></span>]</var><a class="copiable-link" href='#index-_002eftr'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ftr"></a>
+<a class="index-entry-id" id="index-font-translation-_0028ftr_0029"></a>
+<a class="index-entry-id" id="index-ft-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-ul-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-bd-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-_005cf_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-cs-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-tkf-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-special-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-fspecial-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-fp-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-sty-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-if-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-ie-request_002c-and-font-translations"></a>
+<a class="index-entry-id" id="index-while-request_002c-and-font-translations"></a>
+<p>Translate font&nbsp;<var class="var">f</var> to font&nbsp;<var class="var">g</var>. Whenever a font
+named&nbsp;<var class="var">f</var> is referred to in a <code class="code">\f</code> escape sequence, in the
+<code class="code">F</code> and <code class="code">S</code> conditional operators, or in the <code class="code">ft</code>,
+<code class="code">ul</code>, <code class="code">bd</code>, <code class="code">cs</code>, <code class="code">tkf</code>, <code class="code">special</code>,
+<code class="code">fspecial</code>, <code class="code">fp</code>, or <code class="code">sty</code> requests, font&nbsp;<var class="var">g</var> is
+used. If <var class="var">g</var> is missing or equal to&nbsp;<var class="var">f</var> the translation is
+undone.
+</p>
+<p>Font translations cannot be chained.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ftr XXX TR
+.ftr XXX YYY
+.ft XXX
+ error&rarr; warning: can't find font 'XXX'
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002efzoom"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.fzoom</code></strong> <var class="def-var-arguments">f [<span class="r"><i class="slanted">zoom</i></span>]</var><a class="copiable-link" href='#index-_002efzoom'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-fzoom"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002ezoom_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.zoom]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002ezoom_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002ezoom"></a>
+<a class="index-entry-id" id="index-magnification-of-a-font-_0028fzoom_0029"></a>
+<a class="index-entry-id" id="index-font_002c-magnification-_0028fzoom_0029"></a>
+<a class="index-entry-id" id="index-zoom-factor-of-a-font-_0028fzoom_0029"></a>
+<a class="index-entry-id" id="index-factor_002c-zoom_002c-of-a-font-_0028fzoom_0029"></a>
+<a class="index-entry-id" id="index-font_002c-zoom-factor-_0028fzoom_0029"></a>
+<a class="index-entry-id" id="index-optical-size-of-a-font"></a>
+<a class="index-entry-id" id="index-font_002c-optical-size"></a>
+<a class="index-entry-id" id="index-size_002c-optical_002c-of-a-font"></a>
+<p>Set magnification of font&nbsp;<var class="var">f</var> to factor <var class="var">zoom</var>, which must
+be a non-negative integer multiple of 1/1000th. This request is useful
+to adjust the optical size of a font in relation to the others. In the
+example below, font <code class="code">CR</code> is magnified by 10% (the zoom factor is
+thus 1.1).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.fam P
+.fzoom CR 1100
+.ps 12
+Palatino and \f[CR]Courier\f[]
+</pre></div></div>
+
+<p>A missing or zero value of <var class="var">zoom</var> is the same as a value of 1000,
+which means no magnification. <var class="var">f</var>&nbsp;must be a resolved font
+name, not an abstract style.
+</p>
+<p>The magnification of a font is completely transparent to GNU
+<code class="code">troff</code>; a change of the zoom factor doesn&rsquo;t cause any effect
+except that the dimensions of glyphs, (word) spaces, kerns, etc., of the
+affected font are adjusted accordingly.
+</p>
+<p>The zoom factor of the current font is available in the read-only
+register &lsquo;<samp class="samp">.zoom</samp>&rsquo;, in multiples of 1/1000th. It returns zero if
+there is no magnification.
+</p></dd></dl>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Font-Families.html">Font Families</a>, Previous: <a href="Using-Fonts.html">Using Fonts</a>, Up: <a href="Using-Fonts.html">Using Fonts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Sentences.html b/doc/groff.html.node/Sentences.html
new file mode 100644
index 0000000..47d7462
--- /dev/null
+++ b/doc/groff.html.node/Sentences.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Sentences (The GNU Troff Manual)</title>
+
+<meta name="description" content="Sentences (The GNU Troff Manual)">
+<meta name="keywords" content="Sentences (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Text.html" rel="up" title="Text">
+<link href="Hyphenation.html" rel="next" title="Hyphenation">
+<link href="Filling.html" rel="prev" title="Filling">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Sentences">
+<div class="nav-panel">
+<p>
+Next: <a href="Hyphenation.html" accesskey="n" rel="next">Hyphenation</a>, Previous: <a href="Filling.html" accesskey="p" rel="prev">Filling</a>, Up: <a href="Text.html" accesskey="u" rel="up">Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Sentences-1">5.1.2 Sentences</h4>
+<a class="index-entry-id" id="index-sentences"></a>
+
+<p>A passionate debate has raged for decades among writers of the English
+language over whether more space should appear between adjacent
+sentences than between words within a sentence, and if so, how much, and
+what other circumstances should influence this spacing.<a class="footnote" id="DOCF20" href="groff.html_fot.html#FOOT20"><sup>20</sup></a>
+GNU <code class="code">troff</code> follows the example of <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>;
+it attempts to detect the boundaries between sentences, and supplies
+additional inter-sentence space between them.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">Hello, world!
+Welcome to groff.
+ &rArr; Hello, world! Welcome to groff.
+</pre></div></div>
+
+<a class="index-entry-id" id="index-end_002dof_002dsentence-characters"></a>
+<a class="index-entry-id" id="index-sentence-space"></a>
+<a class="index-entry-id" id="index-space-between-sentences"></a>
+<a class="index-entry-id" id="index-French-spacing"></a>
+<p>GNU <code class="code">troff</code> flags certain characters (normally &lsquo;<samp class="samp">!</samp>&rsquo;, &lsquo;<samp class="samp">?</samp>&rsquo;,
+and &lsquo;<samp class="samp">.</samp>&rsquo;) as potentially ending a sentence. When GNU <code class="code">troff</code>
+encounters one of these <em class="dfn">end-of-sentence characters</em> at the end of
+an input line, or one of them is followed by two (unescaped) spaces on
+the same input line, it appends an inter-word space followed by an
+inter-sentence space in the output.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">R. Harper subscribes to a maxim of P. T. Barnum.
+ &rArr; R. Harper subscribes to a maxim of P. T. Barnum.
+</pre></div></div>
+
+<p>In the above example, inter-sentence space is not added after &lsquo;<samp class="samp">P.</samp>&rsquo;
+or &lsquo;<samp class="samp">T.</samp>&rsquo; because the periods do not occur at the end of an input
+line, nor are they followed by two or more spaces. Let&rsquo;s imagine that
+we&rsquo;ve heard something about defamation from Mr. Harper&rsquo;s attorney,
+recast the sentence, and reflowed it in our text editor.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">I submit that R. Harper subscribes to a maxim of P. T.
+Barnum.
+ &rArr; I submit that R. Harper subscribes to a maxim of
+ &rArr; P. T. Barnum.
+</pre></div></div>
+
+<p>&ldquo;Barnum&rdquo; doesn&rsquo;t begin a sentence! What to do? Let us meet our first
+<em class="dfn">escape sequence</em>, a series of input characters that give
+instructions to GNU <code class="code">troff</code> instead of being used to construct
+output device glyphs.<a class="footnote" id="DOCF21" href="groff.html_fot.html#FOOT21"><sup>21</sup></a> An escape sequence begins with the backslash character <code class="code">\</code>
+by default, an uncommon character in natural language text, and is
+<em class="emph">always</em> followed by at least one other character, hence the term
+&ldquo;sequence&rdquo;.
+</p>
+<a class="index-entry-id" id="index-_005c_0026_002c-at-end-of-sentence"></a>
+<p>The dummy character escape sequence <code class="code">\&amp;</code> can be used after an
+end-of-sentence character to defeat end-of-sentence detection on a
+per-instance basis. We can therefore rewrite our input more
+defensively.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">I submit that R.\&amp; Harper subscribes to a maxim of P.\&amp;
+T.\&amp; Barnum.
+ &rArr; I submit that R. Harper subscribes to a maxim of
+ &rArr; P. T. Barnum.
+</pre></div></div>
+
+<p>Adding text caused our input to wrap; now, we don&rsquo;t need <code class="code">\&amp;</code> after
+&lsquo;<samp class="samp">T.</samp>&rsquo; but we do after &lsquo;<samp class="samp">P.</samp>&rsquo;. Consistent use of the escape
+sequence ensures that potential sentence boundaries are robust to
+editing activities. Further advice along these lines will follow in
+<a class="ref" href="Input-Conventions.html">Input Conventions</a>.
+</p>
+<a class="index-entry-id" id="index-end_002dof_002dsentence-transparent-characters"></a>
+<a class="index-entry-id" id="index-characters_002c-end_002dof_002dsentence-transparent"></a>
+<a class="index-entry-id" id="index-dg-glyph_002c-at-end-of-sentence"></a>
+<a class="index-entry-id" id="index-dd-glyph_002c-at-end-of-sentence"></a>
+<a class="index-entry-id" id="index-rq-glyph_002c-at-end-of-sentence"></a>
+<a class="index-entry-id" id="index-cq-glyph_002c-at-end-of-sentence"></a>
+<a class="index-entry-id" id="index-_0022_002c-at-end-of-sentence"></a>
+<a class="index-entry-id" id="index-_0027_002c-at-end-of-sentence"></a>
+<a class="index-entry-id" id="index-_0029_002c-at-end-of-sentence"></a>
+<a class="index-entry-id" id="index-_005d_002c-at-end-of-sentence"></a>
+<a class="index-entry-id" id="index-_002a_002c-at-end-of-sentence"></a>
+<a class="index-entry-id" id="index-special-characters"></a>
+<a class="index-entry-id" id="index-characters_002c-special"></a>
+<p>Normally, the occurrence of a visible non-end-of-sentence character (as
+opposed to a space or tab) immediately after an end-of-sentence
+character cancels detection of the end of a sentence. For example, it
+would be incorrect for GNU <code class="code">troff</code> to infer the end of a sentence
+after the dot in &lsquo;<samp class="samp">3.14159</samp>&rsquo;. However, several characters are
+treated <em class="emph">transparently</em> after the occurrence of an end-of-sentence
+character. That is, GNU <code class="code">troff</code> does not cancel end-of-sentence
+detection when it processes them. This is because such characters are
+often used as footnote markers or to close quotations and
+parentheticals. The default set is &lsquo;<samp class="samp">&quot;</samp>&rsquo;, &lsquo;<samp class="samp">'</samp>&rsquo;, &lsquo;<samp class="samp">)</samp>&rsquo;,
+&lsquo;<samp class="samp">]</samp>&rsquo;, &lsquo;<samp class="samp">*</samp>&rsquo;, <code class="code">\[dg]</code>, <code class="code">\[dd]</code>, <code class="code">\[rq]</code>, and
+<code class="code">\[cq]</code>. The last four are examples of <em class="dfn">special characters</em>,
+escape sequences whose purpose is to obtain glyphs that are not easily
+typed at the keyboard, or which have special meaning to GNU <code class="code">troff</code>
+(like <code class="code">\</code> itself).<a class="footnote" id="DOCF22" href="groff.html_fot.html#FOOT22"><sup>22</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">\[lq]The idea that the poor should have leisure has always
+been shocking to the rich.\[rq]
+(Bertrand Russell, 1935)
+ &rArr; &quot;The idea that the poor should have
+ &rArr; leisure has always been shocking to
+ &rArr; the rich.&quot; (Bertrand Russell, 1935)
+</pre></div></div>
+
+<p>The sets of characters that potentially end sentences or are transparent
+to sentence endings are configurable. See the <code class="code">cflags</code> request in
+<a class="ref" href="Using-Symbols.html">Using Symbols</a>. To change the additional inter-sentence space
+amount&mdash;even to remove it entirely&mdash;see <a class="ref" href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a>.
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Hyphenation.html">Hyphenation</a>, Previous: <a href="Filling.html">Filling</a>, Up: <a href="Text.html">Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Separation.html b/doc/groff.html.node/Separation.html
new file mode 100644
index 0000000..d7dfe3e
--- /dev/null
+++ b/doc/groff.html.node/Separation.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Separation (The GNU Troff Manual)</title>
+
+<meta name="description" content="Separation (The GNU Troff Manual)">
+<meta name="keywords" content="Separation (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Language-Concepts.html" rel="up" title="Language Concepts">
+<link href="Argument-Units.html" rel="next" title="Argument Units">
+<link href="Language-Concepts.html" rel="prev" title="Language Concepts">
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="Separation">
+<div class="nav-panel">
+<p>
+Next: <a href="Argument-Units.html" accesskey="n" rel="next">Argument Units</a>, Previous: <a href="Language-Concepts.html" accesskey="p" rel="prev">Language Concepts</a>, Up: <a href="Language-Concepts.html" accesskey="u" rel="up">Language Concepts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Separation-1">6.1.1.1 Separation</h4>
+
+<p><abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> output has strange requirements regarding
+whitespace. The <code class="code">gtroff</code> output parser, however, is more tolerant,
+making whitespace maximally optional. Such characters, i.e., the tab,
+space, and newline, always have a syntactical meaning. They are never
+printable because spacing within the output is always done by
+positioning commands.
+</p>
+<p>Any sequence of space or tab characters is treated as a single
+<em class="dfn">syntactical space</em>. It separates commands and arguments, but is
+only required when there would occur a clashing between the command code
+and the arguments without the space. Most often, this happens when
+variable-length command names, arguments, argument lists, or command
+clusters meet. Commands and arguments with a known, fixed length need
+not be separated by syntactical space.
+</p>
+<p>A line break is a syntactical element, too. Every command argument can
+be followed by whitespace, a comment, or a newline character. Thus a
+<em class="dfn">syntactical line break</em> is defined to consist of optional
+syntactical space that is optionally followed by a comment, and a
+newline character.
+</p>
+<p>The normal commands, those for positioning and text, consist of a single
+letter taking a fixed number of arguments. For historical reasons, the
+parser allows stacking of such commands on the same line, but
+fortunately, in <code class="code">gtroff</code>&rsquo;s intermediate output, every command with
+at least one argument is followed by a line break, thus providing
+excellent readability.
+</p>
+<p>The other commands&mdash;those for drawing and device controlling&mdash;have a
+more complicated structure; some recognize long command names, and some
+take a variable number of arguments. So all &lsquo;<samp class="samp">D</samp>&rsquo; and &lsquo;<samp class="samp">x</samp>&rsquo;
+commands were designed to request a syntactical line break after their
+last argument. Only one command, &lsquo;<samp class="samp">x&nbsp;X</samp>&rsquo;<!-- /@w -->, has an argument that
+can span several input lines; all other commands must have all of
+their arguments on the same line as the command, i.e., the arguments may
+not be split by a line break.
+</p>
+<p>Empty lines (these are lines containing only space and/or a comment),
+can occur everywhere. They are just ignored.
+</p>
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Argument-Units.html">Argument Units</a>, Previous: <a href="Language-Concepts.html">Language Concepts</a>, Up: <a href="Language-Concepts.html">Language Concepts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Setting-Registers.html b/doc/groff.html.node/Setting-Registers.html
new file mode 100644
index 0000000..6fdf746
--- /dev/null
+++ b/doc/groff.html.node/Setting-Registers.html
@@ -0,0 +1,215 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Setting Registers (The GNU Troff Manual)</title>
+
+<meta name="description" content="Setting Registers (The GNU Troff Manual)">
+<meta name="keywords" content="Setting Registers (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Registers.html" rel="up" title="Registers">
+<link href="Interpolating-Registers.html" rel="next" title="Interpolating Registers">
+<link href="Registers.html" rel="prev" title="Registers">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Setting-Registers">
+<div class="nav-panel">
+<p>
+Next: <a href="Interpolating-Registers.html" accesskey="n" rel="next">Interpolating Registers</a>, Previous: <a href="Registers.html" accesskey="p" rel="prev">Registers</a>, Up: <a href="Registers.html" accesskey="u" rel="up">Registers</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Setting-Registers-1">5.8.1 Setting Registers</h4>
+<a class="index-entry-id" id="index-setting-registers-_0028nr_002c-_005cR_0029"></a>
+<a class="index-entry-id" id="index-registers_002c-setting-_0028nr_002c-_005cR_0029"></a>
+
+<p>Define registers and update their values with the <code class="code">nr</code> request or
+the <code class="code">\R</code> escape sequence.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enr-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nr</code></strong> <var class="def-var-arguments">ident value</var><a class="copiable-link" href='#index-_002enr-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nr-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cR_0027ident-value_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\R<code class="code">'</code></code><span class="r"><i class="slanted">ident value</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cR_0027ident-value_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cR"></a>
+<p>Set register <var class="var">ident</var> to <var class="var">value</var>. If <var class="var">ident</var> doesn&rsquo;t exist,
+GNU <code class="code">troff</code> creates it. In the <code class="code">\R</code> escape sequence, the
+delimiter need not be a neutral apostrophe; see <a class="ref" href="Delimiters.html">Delimiters</a>. It
+also does not produce an input token in GNU <code class="code">troff</code>. See <a class="xref" href="Gtroff-Internals.html"><code class="code">gtroff</code> Internals</a>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a (((17 + (3 * 4))) % 4)
+\n[a]
+.\R'a (((17 + (3 * 4))) % 4)'
+\n[a]
+ &rArr; 1 1
+</pre></div></div>
+
+<p>(Later, we will discuss additional forms of <code class="code">nr</code> and <code class="code">\R</code> that
+can change a register&rsquo;s value after it is dereferenced but before it is
+interpolated. See <a class="xref" href="Auto_002dincrement.html">Auto-increment</a>.)
+</p>
+<p>The complete transparency of <code class="code">\R</code> can cause surprising effects if
+you use registers like <code class="code">.k</code>, which get evaluated at the time they
+are accessed.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 1.6i
+.
+aaa bbb ccc ddd eee fff ggg hhh\R':k \n[.k]'
+.tm :k == \n[:k]
+ &rArr; :k == 126950
+.
+.br
+.
+aaa bbb ccc ddd eee fff ggg hhh\h'0'\R':k \n[.k]'
+.tm :k == \n[:k]
+ &rArr; :k == 15000
+</pre></div></div>
+
+<p>If you process this with the PostScript device (<code class="code">-Tps</code>), there will
+be a line break eventually after <code class="code">ggg</code> in both input lines.
+However, after processing the space after <code class="code">ggg</code>, the partially
+collected line is not overfull yet, so GNU <code class="code">troff</code> continues to
+collect input until it sees the space (or in this case, the newline)
+after <code class="code">hhh</code>. At this point, the line is longer than the line
+length, and the line gets broken.
+</p>
+<p>In the first input line, since the <code class="code">\R</code> escape sequence leaves no
+traces, the check for the overfull line hasn&rsquo;t been done yet at the
+point where <code class="code">\R</code> gets handled, and you get a value for the
+<code class="code">.k</code> register that is even greater than the current line length.
+</p>
+<p>In the second input line, the insertion of <code class="code">\h'0'</code> to cause a
+zero-width motion forces GNU <code class="code">troff</code> to check the line length,
+which in turn causes the start of a new output line. Now <code class="code">.k</code>
+returns the expected value.
+</p></dd></dl>
+
+<p><code class="code">nr</code> and <code class="code">\R</code> each have two additional special forms to
+increment or decrement a register.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enr-2"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nr</code></strong> <var class="def-var-arguments">ident <code class="t">+</code><span class="r"><i class="slanted">value</i></span></var><a class="copiable-link" href='#index-_002enr-2'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nr-2"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002enr-3"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nr</code></strong> <var class="def-var-arguments">ident <code class="t">-</code><span class="r"><i class="slanted">value</i></span></var><a class="copiable-link" href='#index-_002enr-3'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005cR_0027ident-_002bvalue_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\R<code class="code">'</code></code><span class="r"><i class="slanted">ident <code class="t">+</code>value</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cR_0027ident-_002bvalue_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cR-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cR_0027ident-_002dvalue_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\R<code class="code">'</code></code><span class="r"><i class="slanted">ident <code class="t">-</code>value</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cR_0027ident-_002dvalue_0027'> &para;</a></span></dt>
+<dd><p>Increment (decrement) register <var class="var">ident</var> by <var class="var">value</var>. In the
+<code class="code">\R</code> escape sequence, the delimiter need not be a neutral
+apostrophe; see <a class="ref" href="Delimiters.html">Delimiters</a>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a 1
+.nr a +1
+\na
+ &rArr; 2
+</pre></div></div>
+
+<a class="index-entry-id" id="index-negating-register-values"></a>
+<p>A leading minus sign in <var class="var">value</var> is always interpreted as a
+decrementation operator, not an algebraic sign. To assign a register a
+negative value or the negated value of another register, you can
+force GNU <code class="code">troff</code> to interpret &lsquo;<samp class="samp">-</samp>&rsquo; as a negation or minus,
+rather than decrementation, operator: enclose it with its operand in
+parentheses or subtract it from zero.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a 7
+.nr b 3
+.nr a -\nb
+\na
+ &rArr; 4
+.nr a (-\nb)
+\na
+ &rArr; -3
+.nr a 0-\nb
+\na
+ &rArr; -3
+</pre></div></div>
+
+<p>If a register&rsquo;s prior value does not exist (the register was undefined),
+an increment or decrement is applied as if to&nbsp;0.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002err"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.rr</code></strong> <var class="def-var-arguments">ident</var><a class="copiable-link" href='#index-_002err'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rr"></a>
+<a class="index-entry-id" id="index-removing-a-register-_0028rr_0029"></a>
+<a class="index-entry-id" id="index-register_002c-removing-_0028rr_0029"></a>
+<p>Remove register <var class="var">ident</var>. If <var class="var">ident</var> doesn&rsquo;t exist, the request
+is ignored. Technically, only the name is removed; the register&rsquo;s
+contents are still accessible under aliases created with <code class="code">aln</code>, if
+any.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ernn"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.rnn</code></strong> <var class="def-var-arguments">ident1 ident2</var><a class="copiable-link" href='#index-_002ernn'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rnn"></a>
+<a class="index-entry-id" id="index-renaming-a-register-_0028rnn_0029"></a>
+<a class="index-entry-id" id="index-register_002c-renaming-_0028rnn_0029"></a>
+<p>Rename register <var class="var">ident1</var> to <var class="var">ident2</var>. If <var class="var">ident1</var> doesn&rsquo;t
+exist, the request is ignored. Renaming a built-in register does not
+otherwise alter its properties.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ealn"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.aln</code></strong> <var class="def-var-arguments">new old</var><a class="copiable-link" href='#index-_002ealn'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-aln"></a>
+<a class="index-entry-id" id="index-alias_002c-register_002c-creating-_0028aln_0029"></a>
+<a class="index-entry-id" id="index-creating-alias-for-register-_0028aln_0029"></a>
+<a class="index-entry-id" id="index-register_002c-creating-alias-for-_0028aln_0029"></a>
+<p>Create an alias <var class="var">new</var> for an existing register <var class="var">old</var>, causing
+the names to refer to the same stored object. If <var class="var">old</var> is
+undefined, a warning in category &lsquo;<samp class="samp">reg</samp>&rsquo; is produced and the request
+is ignored. See <a class="xref" href="Warnings.html">Warnings</a>, for information about the enablement and
+suppression of warnings.
+</p>
+<a class="index-entry-id" id="index-alias_002c-register_002c-removing-_0028rr_0029"></a>
+<a class="index-entry-id" id="index-removing-alias-for-register-_0028rr_0029"></a>
+<a class="index-entry-id" id="index-register_002c-removing-alias-for-_0028rr_0029"></a>
+<p>To remove a register alias, invoke <code class="code">rr</code> on its name. A register&rsquo;s
+contents do not become inaccessible until it has no more names.
+</p></dd></dl>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Interpolating-Registers.html">Interpolating Registers</a>, Previous: <a href="Registers.html">Registers</a>, Up: <a href="Registers.html">Registers</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Simple-Commands.html b/doc/groff.html.node/Simple-Commands.html
new file mode 100644
index 0000000..b76b0a6
--- /dev/null
+++ b/doc/groff.html.node/Simple-Commands.html
@@ -0,0 +1,207 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Simple Commands (The GNU Troff Manual)</title>
+
+<meta name="description" content="Simple Commands (The GNU Troff Manual)">
+<meta name="keywords" content="Simple Commands (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Command-Reference.html" rel="up" title="Command Reference">
+<link href="Graphics-Commands.html" rel="next" title="Graphics Commands">
+<link href="Comment-Command.html" rel="prev" title="Comment Command">
+<style type="text/css">
+<!--
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="Simple-Commands">
+<div class="nav-panel">
+<p>
+Next: <a href="Graphics-Commands.html" accesskey="n" rel="next">Graphics Commands</a>, Previous: <a href="Comment-Command.html" accesskey="p" rel="prev">Comment Command</a>, Up: <a href="Command-Reference.html" accesskey="u" rel="up">Command Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Simple-Commands-1">6.1.2.2 Simple Commands</h4>
+
+<p>The commands in this subsection have a command code consisting of a
+single character, taking a fixed number of arguments. Most of them are
+commands for positioning and text writing. These commands are tolerant
+of whitespace. Optionally, syntactical space can be inserted before,
+after, and between the command letter and its arguments. All of these
+commands are stackable; i.e., they can be preceded by other simple
+commands or followed by arbitrary other commands on the same line. A
+separating syntactical space is necessary only when two integer
+arguments would clash or if the preceding argument ends with a string
+argument.
+</p>
+<dl class="table">
+<dt><code class="code">C <var class="var">id</var>&lsaquo;<span class="r">whitespace</span>&rsaquo;</code></dt>
+<dd><p>Typeset the glyph of the special character <var class="var">id</var>. Trailing
+syntactical space is necessary to allow special character names of
+arbitrary length. The drawing position is not advanced.
+</p>
+</dd>
+<dt><code class="code">c <var class="var">g</var></code></dt>
+<dd><p>Typeset the glyph of the ordinary character&nbsp;<var class="var">c</var>. The drawing
+position is not advanced.
+</p>
+</dd>
+<dt><code class="code">f <var class="var">n</var></code></dt>
+<dd><p>Select the font mounted at position&nbsp;<var class="var">n</var>. <var class="var">n</var>&nbsp;cannot
+be negative.
+</p>
+</dd>
+<dt><code class="code">H <var class="var">n</var></code></dt>
+<dd><p>Horizontally move the drawing position to <var class="var">n</var>&nbsp;basic units from
+the left edge of the page. <var class="var">n</var>&nbsp;cannot be negative.
+</p>
+</dd>
+<dt><code class="code">h <var class="var">n</var></code></dt>
+<dd><p>Move the drawing position right <var class="var">n</var> basic units. <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code> allowed negative <var class="var">n</var>; GNU <code class="code">troff</code> does not produce
+such values, but <code class="code">groff</code>&rsquo;s output driver library handles them.
+</p>
+</dd>
+<dt><code class="code">m <var class="var">color-scheme</var> <span class="r">[</span><var class="var">component</var> &hellip;<span class="r">]</span></code></dt>
+<dd><p>Select the stroke color using the <var class="var">component</var>s in the color space
+<var class="var">scheme</var>. Each <var class="var">component</var> is an integer between 0 and 65535.
+The quantity of components and their meanings vary with each
+<var class="var">scheme</var>. This command is a <code class="code">groff</code> extension.
+</p>
+<dl class="table">
+<dt><code class="code">mc <var class="var">cyan</var> <var class="var">magenta</var> <var class="var">yellow</var></code></dt>
+<dd><p>Use the CMY color scheme with components cyan, magenta, and yellow.
+</p>
+</dd>
+<dt><code class="code">md</code></dt>
+<dd><p>Use the default color (no components; black in most cases).
+</p>
+</dd>
+<dt><code class="code">mg <var class="var">gray</var></code></dt>
+<dd><p>Use a grayscale color scheme with a component ranging between 0 (black)
+and 65535 (white).
+</p>
+</dd>
+<dt><code class="code">mk <var class="var">cyan</var> <var class="var">magenta</var> <var class="var">yellow</var> <var class="var">black</var></code></dt>
+<dd><p>Use the CMYK color scheme with components cyan, magenta, yellow, and
+black.
+</p>
+</dd>
+<dt><code class="code">mr <var class="var">red</var> <var class="var">green</var> <var class="var">blue</var></code></dt>
+<dd><p>Use the RGB color scheme with components red, green, and blue.
+</p></dd>
+</dl>
+
+</dd>
+<dt><code class="code">N <var class="var">n</var></code></dt>
+<dd><p>Typeset the glyph with index&nbsp;<var class="var">n</var> in the current font.
+<var class="var">n</var>&nbsp;is normally a non-negative integer. The drawing position
+is not advanced. The <code class="code">html</code> and <code class="code">xhtml</code> devices use this
+command with negative&nbsp;<var class="var">n</var> to produce unbreakable space; the
+absolute value of <var class="var">n</var> is taken and interpreted in basic units.
+</p>
+</dd>
+<dt><code class="code">n <var class="var">b</var> <var class="var">a</var></code></dt>
+<dd><p>Indicate a break. No action is performed; the command is present to
+make the output more easily parsed. The integers <var class="var">b</var>
+and&nbsp;<var class="var">a</var> describe the vertical space amounts before and after
+the break, respectively. GNU <code class="code">troff</code> issues this command but
+<code class="code">groff</code>&rsquo;s output driver library ignores it. See <code class="code">v</code> and
+<code class="code">V</code> below.
+</p>
+</dd>
+<dt><code class="code">p <var class="var">n</var></code></dt>
+<dd><p>Begin a new page, setting its number to&nbsp;<var class="var">n</var>. Each page is
+independent, even from those using the same number. The vertical
+drawing position is set to&nbsp;0. All positioning, writing, and
+drawing commands are interpreted in the context of a page, so a
+<code class="code">p</code>&nbsp;command must precede them.
+</p>
+</dd>
+<dt><code class="code">s <var class="var">n</var></code></dt>
+<dd><p>Set type size to <var class="var">n</var> scaled points (unit&nbsp;<code class="code">z</code> in GNU
+<code class="code">troff</code>.
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> used unscaled points <code class="code">p</code> instead;
+see <a class="ref" href="Output-Language-Compatibility.html">Output Language Compatibility</a>.
+</p>
+</dd>
+<dt><code class="code">t <var class="var">xyz</var>&lsaquo;<span class="r">whitespace</span>&rsaquo;</code></dt>
+<dt><code class="code">t <var class="var">xyz</var> <var class="var">dummy-arg</var>&lsaquo;<span class="r">whitespace</span>&rsaquo;</code></dt>
+<dd><p>Typeset a word <var class="var">xyz</var>; that is, set a sequence of ordinary glyphs
+named <var class="var">x</var>, <var class="var">y</var>, <var class="var">z</var>, &hellip;, terminated by a space
+character or a line break; an optional second integer argument is
+ignored (this allows the formatter to generate an even number of
+arguments). Each glyph is set at the current drawing position, and the position is
+then advanced horizontally by the glyph&rsquo;s width. A glyph&rsquo;s width is
+read from its metrics in the font description file, scaled to the
+current type size, and rounded to a multiple of the horizontal motion
+quantum. Use the <code class="code">C</code> command to emplace glyphs of special
+characters. The <code class="code">t</code>&nbsp;command is a <code class="code">groff</code> extension and
+is output only for devices whose <samp class="file">DESC</samp> file contains the
+<code class="code">tcommand</code> directive; see <a class="ref" href="DESC-File-Format.html"><samp class="file">DESC</samp> File Format</a>.
+</p>
+</dd>
+<dt><code class="code">u <var class="var">n</var> <var class="var">xyz</var>&lsaquo;<span class="r">whitespace</span>&rsaquo;</code></dt>
+<dd><p>Typeset word <var class="var">xyz</var> with track kerning. As <code class="code">t</code>, but after
+placing each glyph, the drawing position is further advanced
+horizontally by&nbsp;<var class="var">n</var> basic units (<code class="code">u</code>). The
+<code class="code">u</code>&nbsp;command is a <code class="code">groff</code> extension and is output only for
+devices whose <samp class="file">DESC</samp> file contains the <code class="code">tcommand</code> directive;
+see <a class="ref" href="DESC-File-Format.html"><samp class="file">DESC</samp> File Format</a>.
+</p>
+</dd>
+<dt><code class="code">V <var class="var">n</var></code></dt>
+<dd><p>Vertically move the drawing position to <var class="var">n</var>&nbsp;basic units from
+the top edge of the page. <var class="var">n</var>&nbsp;cannot be negative.
+</p>
+</dd>
+<dt><code class="code">v <var class="var">n</var></code></dt>
+<dd><p>Move the drawing position down <var class="var">n</var> basic units. <abbr class="acronym">AT&amp;T</abbr>
+<code class="code">troff</code> allowed negative <var class="var">n</var>; GNU <code class="code">troff</code> does not produce
+such values, but <code class="code">groff</code>&rsquo;s output driver library handles them.
+</p>
+</dd>
+<dt><code class="code">w</code></dt>
+<dd><p>Indicate an inter-word space. No action is performed; the command is
+present to make the output more easily parsed. Only adjustable,
+breakable inter-word spaces are thus described; those resulting from
+<code class="code">\~</code> or horizontal motion escape sequences are not. GNU
+<code class="code">troff</code> issues this command but <code class="code">groff</code>&rsquo;s output driver
+library ignores it. See <code class="code">h</code> and <code class="code">H</code> above.
+</p></dd>
+</dl>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Graphics-Commands.html">Graphics Commands</a>, Previous: <a href="Comment-Command.html">Comment Command</a>, Up: <a href="Command-Reference.html">Command Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Special-Fonts.html b/doc/groff.html.node/Special-Fonts.html
new file mode 100644
index 0000000..214c74e
--- /dev/null
+++ b/doc/groff.html.node/Special-Fonts.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Special Fonts (The GNU Troff Manual)</title>
+
+<meta name="description" content="Special Fonts (The GNU Troff Manual)">
+<meta name="keywords" content="Special Fonts (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Using-Fonts.html" rel="up" title="Using Fonts">
+<link href="Artificial-Fonts.html" rel="next" title="Artificial Fonts">
+<link href="Character-Classes.html" rel="prev" title="Character Classes">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Special-Fonts">
+<div class="nav-panel">
+<p>
+Next: <a href="Artificial-Fonts.html" accesskey="n" rel="next">Artificial Fonts</a>, Previous: <a href="Character-Classes.html" accesskey="p" rel="prev">Character Classes</a>, Up: <a href="Using-Fonts.html" accesskey="u" rel="up">Using Fonts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Special-Fonts-1">5.19.6 Special Fonts</h4>
+<a class="index-entry-id" id="index-special-fonts-1"></a>
+<a class="index-entry-id" id="index-fonts_002c-special"></a>
+
+<p>Special fonts are those that <code class="code">gtroff</code> searches when it cannot find
+the requested glyph in the current font. The Symbol font is usually a
+special font.
+</p>
+<p><code class="code">gtroff</code> provides the following two requests to add more special
+fonts. See <a class="xref" href="Using-Symbols.html">Using Symbols</a>, for a detailed description of the glyph
+searching mechanism in <code class="code">gtroff</code>.
+</p>
+<p>Usually, only non-TTY devices have special fonts.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002especial"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.special</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">s1</i></span> <span class="r"><i class="slanted">s2</i></span> &hellip;]</var><a class="copiable-link" href='#index-_002especial'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-special-2"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002efspecial"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.fspecial</code></strong> <var class="def-var-arguments">f [<span class="r"><i class="slanted">s1</i></span> <span class="r"><i class="slanted">s2</i></span> &hellip;]</var><a class="copiable-link" href='#index-_002efspecial'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-fspecial"></a>
+<a class="index-entry-id" id="index-fonts-1"></a>
+<a class="index-entry-id" id="index-DESC-4"></a>
+<p>Use the <code class="code">special</code> request to define special fonts. Initially, this
+list is empty.
+</p>
+<p>Use the <code class="code">fspecial</code> request to designate special fonts only when
+font&nbsp;<var class="var">f</var> is active. Initially, this list is empty.
+</p>
+<p>Previous calls to <code class="code">special</code> or <code class="code">fspecial</code> are overwritten;
+without arguments, the particular list of special fonts is set to empty.
+Special fonts are searched in the order they appear as arguments.
+</p>
+<p>All fonts that appear in a call to <code class="code">special</code> or <code class="code">fspecial</code>
+are loaded.
+</p>
+<p>See <a class="xref" href="Using-Symbols.html">Using Symbols</a>, for the exact search order of glyphs.
+</p></dd></dl>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/String-Index.html b/doc/groff.html.node/String-Index.html
new file mode 100644
index 0000000..335d2b8
--- /dev/null
+++ b/doc/groff.html.node/String-Index.html
@@ -0,0 +1,344 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>String Index (The GNU Troff Manual)</title>
+
+<meta name="description" content="String Index (The GNU Troff Manual)">
+<meta name="keywords" content="String Index (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="index.html" rel="up" title="Top">
+<link href="File-Keyword-Index.html" rel="next" title="File Keyword Index">
+<link href="Macro-Index.html" rel="prev" title="Macro Index">
+<style type="text/css">
+<!--
+a.summary-letter-printindex {text-decoration: none}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+td.printindex-index-entry {vertical-align: top}
+td.printindex-index-section {vertical-align: top}
+th.entries-header-printindex {text-align:left}
+th.sections-header-printindex {text-align:left}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="appendix-level-extent" id="String-Index">
+<div class="nav-panel">
+<p>
+Next: <a href="File-Keyword-Index.html" accesskey="n" rel="next">File Keyword Index</a>, Previous: <a href="Macro-Index.html" accesskey="p" rel="prev">Macro Index</a>, Up: <a href="index.html" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h2 class="appendix" id="String-Index-1">Appendix G String Index</h2>
+
+<p>The macro package or program a that defines or uses each string is
+appended in brackets. (Only one string, <code class="code">.T</code>, is defined by the
+<code class="code">troff</code> formatter itself.) See <a class="xref" href="Strings.html">Strings</a>.
+</p>
+
+<div class="printindex st-printindex">
+<table class="st-letters-header-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#String-Index_st_symbol-1"><b>!</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-2"><b>'</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-3"><b>*</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-4"><b>,</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-5"><b>-</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-6"><b>.</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-7"><b>/</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-8"><b>3</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-9"><b>8</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-10"><b>:</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-11"><b>&lt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-12"><b>&gt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-13"><b>?</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-14"><b>^</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-15"><b>_</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-16"><b>`</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-17"><b>{</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-18"><b>}</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-19"><b>~</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter-printindex" href="#String-Index_st_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-V"><b>V</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="st-entries-printindex" border="0">
+<tr><td></td><th class="entries-header-printindex">Index Entry</th><td>&nbsp;</td><th class="sections-header-printindex"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-1">!</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-_0021-_005bms_005d"><code>! <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-2">'</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-_0027-_005bms_005d"><code><code class="code">'</code> <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-_0027-_005bms_005d-1"><code><code class="code">'</code> <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-3">*</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Footnotes.html#index-_002a-_005bms_005d"><code>* <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Footnotes.html">ms Footnotes</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-4">,</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-_002c-_005bms_005d"><code>, <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-_002c-_005bms_005d-1"><code>, <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-5">-</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Typographical-symbols-in-ms.html#index-_002d-_005bms_005d"><code>- <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Typographical-symbols-in-ms.html">Typographical symbols in ms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-6">.</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-_002e-_005bms_005d"><code>. <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-_002eT"><code>.T</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Strings.html#index-_002eT-1"><code>.T</code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Strings.html">Strings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-7">/</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-_002f-_005bms_005d"><code>/ <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-8">3</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-3-_005bms_005d"><code>3 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-9">8</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-8-_005bms_005d"><code>8 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-10">:</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-_003a-_005bms_005d"><code>: <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-_003a-_005bms_005d-1"><code>: <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-11">&lt;</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Typeface-and-decoration.html#index-_003c-_005bms_005d"><code>&lt; <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Typeface-and-decoration.html">Typeface and decoration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-12">&gt;</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Typeface-and-decoration.html#index-_003e-_005bms_005d"><code>&gt; <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Typeface-and-decoration.html">Typeface and decoration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-13">?</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-_003f-_005bms_005d"><code>? <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-14">^</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-_005e-_005bms_005d"><code>^ <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-_005e-_005bms_005d-1"><code>^ <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-15">_</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-_005f-_005bms_005d"><code>_ <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-16">`</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-_0060-_005bms_005d"><code><code class="code">`</code> <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-_0060-_005bms_005d-1"><code><code class="code">`</code> <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-17">{</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Typeface-and-decoration.html#index-_007b-_005bms_005d"><code>{ <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Typeface-and-decoration.html">Typeface and decoration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-18">}</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Typeface-and-decoration.html#index-_007d-_005bms_005d"><code>} <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Typeface-and-decoration.html">Typeface and decoration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_symbol-19">~</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-_007e-_005bms_005d"><code>~ <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-_007e-_005bms_005d-1"><code>~ <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-A">A</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-language-and-localization.html#index-ABSTRACT-_005bms_005d"><code>ABSTRACT <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-language-and-localization.html">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-ae-_005bms_005d"><code>ae <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-Ae-_005bms_005d"><code>Ae <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-C-_005bms_005d"><code>C <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-CF-_005bms_005d"><code>CF <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-CH-_005bms_005d"><code>CH <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-D">D</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-d_002d-_005bms_005d"><code>d- <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-D_002d-_005bms_005d"><code>D- <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-F">F</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-FAM-_005bms_005d"><code>FAM <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-FR-_005bms_005d"><code>FR <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-L">L</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-LF-_005bms_005d"><code>LF <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-LH-_005bms_005d"><code>LH <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-M">M</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-language-and-localization.html#index-MONTH1-_005bms_005d"><code>MONTH1 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-language-and-localization.html">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-language-and-localization.html#index-MONTH10-_005bms_005d"><code>MONTH10 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-language-and-localization.html">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-language-and-localization.html#index-MONTH11-_005bms_005d"><code>MONTH11 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-language-and-localization.html">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-language-and-localization.html#index-MONTH12-_005bms_005d"><code>MONTH12 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-language-and-localization.html">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-language-and-localization.html#index-MONTH2-_005bms_005d"><code>MONTH2 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-language-and-localization.html">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-language-and-localization.html#index-MONTH3-_005bms_005d"><code>MONTH3 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-language-and-localization.html">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-language-and-localization.html#index-MONTH4-_005bms_005d"><code>MONTH4 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-language-and-localization.html">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-language-and-localization.html#index-MONTH5-_005bms_005d"><code>MONTH5 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-language-and-localization.html">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-language-and-localization.html#index-MONTH6-_005bms_005d"><code>MONTH6 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-language-and-localization.html">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-language-and-localization.html#index-MONTH7-_005bms_005d"><code>MONTH7 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-language-and-localization.html">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-language-and-localization.html#index-MONTH8-_005bms_005d"><code>MONTH8 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-language-and-localization.html">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-language-and-localization.html#index-MONTH9-_005bms_005d"><code>MONTH9 <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-language-and-localization.html">ms language and localization</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-O">O</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-o-_005bms_005d"><code>o <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-oe-_005bms_005d"><code>oe <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-OE-_005bms_005d"><code>OE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-Q">Q</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Typographical-symbols-in-ms.html#index-Q-_005bms_005d"><code>Q <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Typographical-symbols-in-ms.html">Typographical symbols in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-q-_005bms_005d"><code>q <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-language-and-localization.html#index-REFERENCES-_005bms_005d"><code>REFERENCES <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-language-and-localization.html">ms language and localization</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-RF-_005bms_005d"><code>RF <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-RH-_005bms_005d"><code>RH <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-S">S</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Headings-in-ms.html#index-SN-_005bms_005d"><code>SN <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Headings-in-ms.html">Headings in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Headings-in-ms.html#index-SN_002dDOT-_005bms_005d"><code>SN-DOT <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Headings-in-ms.html">Headings in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Headings-in-ms.html#index-SN_002dNO_002dDOT-_005bms_005d"><code>SN-NO-DOT <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Headings-in-ms.html">Headings in ms</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Document-Control-Settings.html#index-SN_002dSTYLE-_005bms_005d"><code>SN-STYLE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Document-Control-Settings.html">ms Document Control Settings</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Headings-in-ms.html#index-SN_002dSTYLE-_005bms_005d-1"><code>SN-STYLE <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Headings-in-ms.html">Headings in ms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-T">T</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-th-_005bms_005d"><code>th <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-Th-_005bms_005d"><code>Th <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-language-and-localization.html#index-TOC-_005bms_005d"><code>TOC <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-language-and-localization.html">ms language and localization</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-U">U</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="Typographical-symbols-in-ms.html#index-U-_005bms_005d"><code>U <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="Typographical-symbols-in-ms.html">Typographical symbols in ms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="String-Index_st_letter-V">V</th><td></td><td></td></tr>
+<tr><td></td><td class="printindex-index-entry"><a href="ms-Legacy-Features.html#index-v-_005bms_005d"><code>v <span class="r">[</span>ms<span class="r">]</span></code></a>:</td><td>&nbsp;</td><td class="printindex-index-section"><a href="ms-Legacy-Features.html">ms Legacy Features</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table class="st-letters-footer-printindex"><tr><th>Jump to: &nbsp; </th><td><a class="summary-letter-printindex" href="#String-Index_st_symbol-1"><b>!</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-2"><b>'</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-3"><b>*</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-4"><b>,</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-5"><b>-</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-6"><b>.</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-7"><b>/</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-8"><b>3</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-9"><b>8</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-10"><b>:</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-11"><b>&lt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-12"><b>&gt;</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-13"><b>?</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-14"><b>^</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-15"><b>_</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-16"><b>`</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-17"><b>{</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-18"><b>}</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_symbol-19"><b>~</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter-printindex" href="#String-Index_st_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter-printindex" href="#String-Index_st_letter-V"><b>V</b></a>
+ &nbsp;
+</td></tr></table>
+</div>
+
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="File-Keyword-Index.html">File Keyword Index</a>, Previous: <a href="Macro-Index.html">Macro Index</a>, Up: <a href="index.html">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Strings.html b/doc/groff.html.node/Strings.html
new file mode 100644
index 0000000..726e0b0
--- /dev/null
+++ b/doc/groff.html.node/Strings.html
@@ -0,0 +1,429 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Strings (The GNU Troff Manual)</title>
+
+<meta name="description" content="Strings (The GNU Troff Manual)">
+<meta name="keywords" content="Strings (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Conditionals-and-Loops.html" rel="next" title="Conditionals and Loops">
+<link href="Colors.html" rel="prev" title="Colors">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+kbd.key {font-style: normal}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span.sansserif {font-family: sans-serif; font-weight: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Strings">
+<div class="nav-panel">
+<p>
+Next: <a href="Conditionals-and-Loops.html" accesskey="n" rel="next">Conditionals and Loops</a>, Previous: <a href="Colors.html" accesskey="p" rel="prev">Colors</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Strings-1">5.22 Strings</h3>
+<a class="index-entry-id" id="index-strings"></a>
+
+<p>GNU <code class="code">troff</code> supports strings primarily for user convenience.
+Conventionally, if one would define a macro only to interpolate a small
+amount of text, without invoking requests or calling any other macros,
+one defines a string instead. Only one string is predefined by the
+language.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_002eT_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[.T]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_002eT_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eT"></a>
+<a class="index-entry-id" id="index-_002eT-1"></a>
+<a class="index-entry-id" id="index-output-device-name-string-_0028_002eT_0029-1"></a>
+<p>Contains the name of the output device (for example, &lsquo;<samp class="samp">utf8</samp>&rsquo; or
+&lsquo;<samp class="samp">pdf</samp>&rsquo;).
+</p></dd></dl>
+
+<p>The <code class="code">ds</code> request creates a string with a specified name and
+contents and the <code class="code">\*</code> escape sequence dereferences its name,
+interpolating its contents. If the string named by the <code class="code">\*</code> escape
+sequence does not exist, it is defined as empty, nothing is
+interpolated, and a warning in category &lsquo;<samp class="samp">mac</samp>&rsquo; is emitted.
+See <a class="xref" href="Warnings.html">Warnings</a>, for information about the enablement and suppression of
+warnings.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eds-1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ds</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">contents</i></span>]</var><a class="copiable-link" href='#index-_002eds-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ds-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eds1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ds1</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">contents</i></span>]</var><a class="copiable-link" href='#index-_002eds1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ds1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002an"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\*</code><span class="r"><i class="slanted">n</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_002an'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_002a"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_0028nm"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\*(</code><span class="r"><i class="slanted">nm</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_002a_0028nm'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bname-_005barg1-arg2-_2026_005d_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\*[</code><span class="r"><i class="slanted">name <span class="sansserif">[</span>arg1 arg2 &hellip;<span class="sansserif">]</span></i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bname-_005barg1-arg2-_2026_005d_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-string-interpolation-_0028_005c_002a_0029"></a>
+<a class="index-entry-id" id="index-string-expansion-_0028_005c_002a_0029"></a>
+<a class="index-entry-id" id="index-interpolation-of-strings-_0028_005c_002a_0029"></a>
+<a class="index-entry-id" id="index-expansion-of-strings-_0028_005c_002a_0029"></a>
+<a class="index-entry-id" id="index-string-arguments"></a>
+<a class="index-entry-id" id="index-arguments_002c-to-strings"></a>
+<p>Define a string called <var class="var">name</var> with contents <var class="var">contents</var>. If
+<var class="var">name</var> already exists as an alias, the target of the alias is
+redefined; see <code class="code">als</code> and <code class="code">rm</code> below. If <code class="code">ds</code> is called
+with only one argument, <var class="var">name</var> is defined as an empty string.
+Otherwise, GNU <code class="code">troff</code> stores <var class="var">contents</var> in copy
+mode.<a class="footnote" id="DOCF87" href="groff.html_fot.html#FOOT87"><sup>87</sup></a>
+</p>
+<p>The <code class="code">\*</code> escape sequence interpolates a previously defined string
+variable <var class="var">name</var> (one-character name&nbsp;<var class="var">n</var>, two-character name
+<var class="var">nm</var>). The bracketed interpolation form accepts arguments that are
+handled as macro arguments are; recall <a class="ref" href="Calling-Macros.html">Calling Macros</a>. In
+contrast to macro calls, however, if a closing bracket &lsquo;<samp class="samp">]</samp>&rsquo; occurs
+in a string argument, that argument must be enclosed in double quotes.
+<code class="code">\*</code> is interpreted even in copy mode. When defining strings,
+argument interpolations must be escaped if they are to reference
+parameters from the calling context; See <a class="xref" href="Parameters.html">Parameters</a>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds cite (\\$1, \\$2)
+Gray codes are explored in \*[cite Morgan 1998].
+ &rArr; Gray codes are explored in (Morgan, 1998).
+</pre></div></div>
+
+
+<a class="index-entry-id" id="index-trailing-spaces-in-string-definitions-and-appendments"></a>
+<a class="index-entry-id" id="index-comments_002c-with-ds"></a>
+<a class="index-entry-id" id="index-ds-request_002c-and-comments"></a>
+<p><strong class="strong">Caution:</strong> Unlike other requests, the second argument to the
+<code class="code">ds</code> request consumes the remainder of the input line, including
+trailing spaces. This means that comments on a line with such a request
+can introduce unwanted space into a string when they are set off from
+the material they annotate, as is conventional.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds H2O H\v'+.3m'\s'-2'2\v'-.3m'\s0O \&quot; water
+</pre></div></div>
+
+<p>Instead, place the comment on another line or put the comment escape
+sequence immediately adjacent to the last character of the string.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds H2O H\v'+.3m'\s'-2'2\v'-.3m'\s0O\&quot; water
+</pre></div></div>
+
+<p>Ending string definitions (and appendments) with a comment, even an
+empty one, prevents unwanted space from creeping into them during source
+document maintenance.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds author Alice Pleasance Liddell\&quot;
+.ds empty \&quot; might be appended to later with .as
+</pre></div></div>
+
+<a class="index-entry-id" id="index-trailing-double-quotes-in-strings"></a>
+<a class="index-entry-id" id="index-double-quotes_002c-trailing_002c-in-strings"></a>
+<a class="index-entry-id" id="index-ds-request_002c-and-double-quotes"></a>
+<a class="index-entry-id" id="index-leading-spaces-with-ds"></a>
+<a class="index-entry-id" id="index-spaces-with-ds"></a>
+<a class="index-entry-id" id="index-ds-request_002c-and-leading-spaces"></a>
+<p>An initial neutral double quote <code class="code">&quot;</code> in <var class="var">contents</var> is stripped
+to allow embedding of leading spaces. Any other <code class="code">&quot;</code> is interpreted
+literally, but it is wise to use the special character escape sequence
+<code class="code">\[dq]</code> instead if the string might be interpolated as part of a
+macro argument; see <a class="ref" href="Calling-Macros.html">Calling Macros</a>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds salutation &quot; Yours in a white wine sauce,\&quot;
+.ds c-var-defn &quot; char mydate[]=\[dq]2020-07-29\[dq];\&quot;
+</pre></div></div>
+
+<a class="index-entry-id" id="index-multi_002dline-strings"></a>
+<a class="index-entry-id" id="index-strings_002c-multi_002dline"></a>
+<a class="index-entry-id" id="index-newline-character_002c-in-strings_002c-escaping"></a>
+<a class="index-entry-id" id="index-escaping-newline-characters_002c-in-strings"></a>
+<p>Strings are not limited to a single input line of text.
+<code class="code">\<kbd class="key">RET</kbd></code> works just as it does elsewhere. The resulting string
+is stored <em class="emph">without</em> the newlines. Care is therefore required when
+interpolating strings while filling is disabled.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds foo This string contains \
+text on multiple lines \
+of input.
+</pre></div></div>
+
+<p>It is not possible to embed a newline in a string that will be
+interpreted as such when the string is interpolated. To achieve that
+effect, use <code class="code">\*</code> to interpolate a macro instead; see <a class="ref" href="Punning-Names.html">Punning Names</a>.
+</p>
+<p>Because strings are similar to macros, they too can be defined so as to
+suppress AT&amp;T <code class="code">troff</code> compatibility mode when used; see
+<a class="ref" href="Writing-Macros.html">Writing Macros</a> and <a class="ref" href="Compatibility-Mode.html">Compatibility Mode</a>. The <code class="code">ds1</code>
+request defines a string such that compatibility mode is off when the
+string is later interpolated. To be more precise, a <em class="dfn">compatibility
+save</em> input token is inserted at the beginning of the string, and a
+<em class="dfn">compatibility restore</em> input token at the end.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr xxx 12345
+.ds aa The value of xxx is \\n[xxx].
+.ds1 bb The value of xxx is \\n[xxx].
+.
+.cp 1
+.
+\*(aa
+ error&rarr; warning: register '[' not defined
+ &rArr; The value of xxx is 0xxx].
+\*(bb
+ &rArr; The value of xxx is 12345.
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eas"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.as</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">contents</i></span>]</var><a class="copiable-link" href='#index-_002eas'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-as"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eas1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.as1</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">contents</i></span>]</var><a class="copiable-link" href='#index-_002eas1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-as1"></a>
+<a class="index-entry-id" id="index-appending-to-a-string-_0028as_0029"></a>
+<a class="index-entry-id" id="index-string_002c-appending-_0028as_0029"></a>
+<p>The <code class="code">as</code> request is similar to <code class="code">ds</code> but appends <var class="var">contents</var>
+to the string stored as <var class="var">name</var> instead of redefining it. If
+<var class="var">name</var> doesn&rsquo;t exist yet, it is created. If <code class="code">as</code> is called
+with only one argument, no operation is performed (beyond dereferencing
+the string).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.as salutation &quot; with shallots, onions and garlic,\&quot;
+</pre></div></div>
+
+<p>The <code class="code">as1</code> request is similar to <code class="code">as</code>, but compatibility mode
+is switched off when the appended portion of the string is later
+interpolated. To be more precise, a <em class="dfn">compatibility save</em> input
+token is inserted at the beginning of the appended string, and a
+<em class="dfn">compatibility restore</em> input token at the end.
+</p></dd></dl>
+
+<p>Several requests exist to perform rudimentary string operations.
+Strings can be queried (<code class="code">length</code>) and modified (<code class="code">chop</code>,
+<code class="code">substring</code>, <code class="code">stringup</code>, <code class="code">stringdown</code>), and their names
+can be manipulated through renaming, removal, and aliasing (<code class="code">rn</code>,
+<code class="code">rm</code>, <code class="code">als</code>).
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002elength"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.length</code></strong> <var class="def-var-arguments">reg anything</var><a class="copiable-link" href='#index-_002elength'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-length"></a>
+<a class="index-entry-id" id="index-length-of-a-string-_0028length_0029"></a>
+<a class="index-entry-id" id="index-string_002c-length-of-_0028length_0029"></a>
+<a class="index-entry-id" id="index-length-request_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-length-request"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-length-request"></a>
+<p>Compute the number of characters of <var class="var">anything</var> and store the count
+in the register <var class="var">reg</var>. If <var class="var">reg</var> doesn&rsquo;t exist, it is created.
+<var class="var">anything</var> is read in copy mode.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds xxx abcd\h'3i'efgh
+.length yyy \*[xxx]
+\n[yyy]
+ &rArr; 14
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002echop"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.chop</code></strong> <var class="def-var-arguments">object</var><a class="copiable-link" href='#index-_002echop'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-chop"></a>
+<p>Remove the last character from the macro, string, or diversion named
+<var class="var">object</var>. This is useful for removing the newline from the end of a
+diversion that is to be interpolated as a string. This request can be
+used repeatedly on the same <var class="var">object</var>; see <a class="ref" href="Gtroff-Internals.html"><code class="code">gtroff</code> Internals</a>,
+for details on nodes inserted additionally by GNU <code class="code">troff</code>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002esubstring"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.substring</code></strong> <var class="def-var-arguments">str start [<span class="r"><i class="slanted">end</i></span>]</var><a class="copiable-link" href='#index-_002esubstring'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-substring"></a>
+<a class="index-entry-id" id="index-substring-_0028substring_0029"></a>
+<p>Replace the string named <var class="var">str</var> with its substring bounded by the
+indices <var class="var">start</var> and <var class="var">end</var>, inclusively. The first character in
+the string has index&nbsp;0. If <var class="var">end</var> is omitted, it is implicitly
+set to the largest valid value (the string length minus one). Negative
+indices count backward from the end of the string: the last character
+has index&nbsp;&minus;1, the character before the last has
+index&nbsp;&minus;2, and so on.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds xxx abcdefgh
+.substring xxx 1 -4
+\*[xxx]
+ &rArr; bcde
+.substring xxx 2
+\*[xxx]
+ &rArr; de
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002estringdown"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.stringdown</code></strong> <var class="def-var-arguments">str</var><a class="copiable-link" href='#index-_002estringdown'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-stringdown"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002estringup"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.stringup</code></strong> <var class="def-var-arguments">str</var><a class="copiable-link" href='#index-_002estringup'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-stringup"></a>
+<a class="index-entry-id" id="index-case_002dtransforming-a-string-_0028stringdown_002c-stringup_0029"></a>
+<a class="index-entry-id" id="index-uppercasing-a-string-_0028stringup_0029"></a>
+<a class="index-entry-id" id="index-lowercasing-a-string-_0028stringdown_0029"></a>
+<a class="index-entry-id" id="index-up_002dcasing-a-string-_0028stringup_0029"></a>
+<a class="index-entry-id" id="index-down_002dcasing-a-string-_0028stringdown_0029"></a>
+<p>Alter the string named <var class="var">str</var> by replacing each of its bytes with its
+lowercase (<code class="code">stringdown</code>) or uppercase (<code class="code">stringup</code>) version (if
+one exists). Special characters in the string will often transform in
+the expected way due to the regular naming convention for accented
+characters. When they do not, use substrings and/or catenation.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds resume R\['e]sum\['e]
+\*[resume]
+.stringdown resume
+\*[resume]
+.stringup resume
+\*[resume]
+ &rArr; Résumé résumé RÉSUMÉ
+</pre></div></div>
+</dd></dl>
+
+<p>(In practice, we would end the <code class="code">ds</code> request with a comment escape
+<code class="code">\&quot;</code> to prevent space from creeping into the definition during
+source document maintenance.)
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ern"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.rn</code></strong> <var class="def-var-arguments">old new</var><a class="copiable-link" href='#index-_002ern'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rn"></a>
+<a class="index-entry-id" id="index-renaming-request-_0028rn_0029"></a>
+<a class="index-entry-id" id="index-request_002c-renaming-_0028rn_0029"></a>
+<a class="index-entry-id" id="index-renaming-macro-_0028rn_0029"></a>
+<a class="index-entry-id" id="index-macro_002c-renaming-_0028rn_0029"></a>
+<a class="index-entry-id" id="index-renaming-string-_0028rn_0029"></a>
+<a class="index-entry-id" id="index-string_002c-renaming-_0028rn_0029"></a>
+<a class="index-entry-id" id="index-renaming-diversion-_0028rn_0029"></a>
+<a class="index-entry-id" id="index-diversion_002c-renaming-_0028rn_0029"></a>
+<p>Rename the request, macro, diversion, or string <var class="var">old</var> to <var class="var">new</var>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002erm"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.rm</code></strong> <var class="def-var-arguments">name</var><a class="copiable-link" href='#index-_002erm'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rm"></a>
+<a class="index-entry-id" id="index-removing-request-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-request_002c-removing-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-removing-macro-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-macro_002c-removing-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-removing-string-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-string_002c-removing-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-removing-diversion-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-diversion_002c-removing-_0028rm_0029"></a>
+<p>Remove the request, macro, diversion, or string <var class="var">name</var>. GNU
+<code class="code">troff</code> treats subsequent invocations as if the name had never
+been defined.
+</p></dd></dl>
+
+<a class="anchor" id="als"></a><dl class="first-deffn">
+<dt class="deffn" id="index-_002eals"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.als</code></strong> <var class="def-var-arguments">new old</var><a class="copiable-link" href='#index-_002eals'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-als"></a>
+<a class="index-entry-id" id="index-alias_002c-string_002c-creating-_0028als_0029"></a>
+<a class="index-entry-id" id="index-alias_002c-macro_002c-creating-_0028als_0029"></a>
+<a class="index-entry-id" id="index-alias_002c-diversion_002c-creating-_0028als_0029"></a>
+<a class="index-entry-id" id="index-creating-alias_002c-for-string-_0028als_0029"></a>
+<a class="index-entry-id" id="index-creating-alias_002c-for-macro-_0028als_0029"></a>
+<a class="index-entry-id" id="index-creating-alias_002c-for-diversion-_0028als_0029"></a>
+<a class="index-entry-id" id="index-string_002c-creating-alias-for-_0028als_0029"></a>
+<a class="index-entry-id" id="index-macro_002c-creating-alias-for-_0028als_0029"></a>
+<a class="index-entry-id" id="index-diversion_002c-creating-alias-for-_0028als_0029"></a>
+<p>Create an alias <var class="var">new</var> for the existing request, string, macro, or
+diversion object named <var class="var">old</var>, causing the names to refer to the same
+stored object. If <var class="var">old</var> is undefined, a warning in category
+&lsquo;<samp class="samp">mac</samp>&rsquo; is produced, and the request is ignored. See <a class="xref" href="Warnings.html">Warnings</a>,
+for information about the enablement and suppression of warnings.
+</p>
+<p>To understand how the <code class="code">als</code> request works, consider two different
+storage pools: one for objects (macros, strings, etc.), and another
+for names. As soon as an object is defined, GNU <code class="code">troff</code> adds it to
+the object pool, adds its name to the name pool, and creates a link
+between them. When <code class="code">als</code> creates an alias, it adds a new name to
+the name pool that gets linked to the same object as the old name.
+</p>
+<p>Now consider this example.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de foo
+..
+.
+.als bar foo
+.
+.de bar
+. foo
+..
+.
+.bar
+ error&rarr; input stack limit exceeded (probable infinite
+ error&rarr; loop)
+</pre></div></div>
+
+<p>In the above, <code class="code">bar</code> remains an <em class="emph">alias</em>&mdash;another name
+for&mdash;the object referred to by <code class="code">foo</code>, which the second <code class="code">de</code>
+request replaces. Alternatively, imagine that the <code class="code">de</code> request
+<em class="emph">dereferences</em> its argument before replacing it. Either way, the
+result of calling <code class="code">bar</code> is a recursive loop that finally leads to
+an error. See <a class="xref" href="Writing-Macros.html">Writing Macros</a>.
+</p>
+<a class="index-entry-id" id="index-alias_002c-string_002c-removing-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-alias_002c-macro_002c-removing-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-alias_002c-diversion_002c-removing-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-removing-alias_002c-for-string-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-removing-alias_002c-for-macro-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-removing-alias_002c-for-diversion-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-string_002c-removing-alias-for-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-macro_002c-removing-alias-for-_0028rm_0029"></a>
+<a class="index-entry-id" id="index-diversion_002c-removing-alias-for-_0028rm_0029"></a>
+<p>To remove an alias, call <code class="code">rm</code> on its name. The object itself is
+not destroyed until it has no more names.
+</p>
+<p>When a request, macro, string, or diversion is aliased, redefinitions
+and appendments &ldquo;write through&rdquo; alias names. To replace an alias with
+a separately defined object, you must use the <code class="code">rm</code> request on its
+name first.
+</p></dd></dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Conditionals-and-Loops.html">Conditionals and Loops</a>, Previous: <a href="Colors.html">Colors</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Suppressing-Output.html b/doc/groff.html.node/Suppressing-Output.html
new file mode 100644
index 0000000..bd32161
--- /dev/null
+++ b/doc/groff.html.node/Suppressing-Output.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Suppressing Output (The GNU Troff Manual)</title>
+
+<meta name="description" content="Suppressing Output (The GNU Troff Manual)">
+<meta name="keywords" content="Suppressing Output (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Colors.html" rel="next" title="Colors">
+<link href="Environments.html" rel="prev" title="Environments">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Suppressing-Output">
+<div class="nav-panel">
+<p>
+Next: <a href="Colors.html" accesskey="n" rel="next">Colors</a>, Previous: <a href="Environments.html" accesskey="p" rel="prev">Environments</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Suppressing-Output-1">5.32 Suppressing Output</h3>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cO_005bnum_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\O[</code><span class="r"><i class="slanted">num</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005cO_005bnum_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cO"></a>
+<a class="index-entry-id" id="index-suppressing-output-_0028_005cO_0029"></a>
+<a class="index-entry-id" id="index-output_002c-suppressing-_0028_005cO_0029"></a>
+<p>Suppress GNU <code class="code">troff</code> output of glyphs and geometric objects. The
+sequences <code class="code">\O2</code>, <code class="code">\O3</code>, <code class="code">\O4</code>, and <code class="code">\O5</code> are
+intended for internal use by <code class="code">grohtml</code>.
+</p>
+<dl class="table">
+<dt>&lsquo;<samp class="samp">\O0</samp>&rsquo;</dt>
+<dd><p>Disable the emission of glyphs and geometric objects to the output
+driver, provided that this sequence occurs at the outermost suppression
+level (see <code class="code">\O3</code> and <code class="code">\04</code> below). Horizontal motions
+corresponding to non-overstruck glyph widths still occur.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">\O1</samp>&rsquo;</dt>
+<dd><p>Enable the emission of glyphs and geometric objects to the output
+driver, provided that this sequence occurs at the outermost suppression
+level.
+</p></dd>
+</dl>
+
+<a class="index-entry-id" id="index-opminx"></a>
+<a class="index-entry-id" id="index-opminy"></a>
+<a class="index-entry-id" id="index-opmaxx"></a>
+<a class="index-entry-id" id="index-opmaxy"></a>
+<p><code class="code">\O0</code> and <code class="code">\O1</code> also reset the four registers <code class="code">opminx</code>,
+<code class="code">opminy</code>, <code class="code">opmaxx</code>, and <code class="code">opmaxy</code> to &minus;1. These
+four registers mark the top left and bottom right hand corners of a box
+encompassing all written or drawn output.
+</p>
+<dl class="table">
+<dt>&lsquo;<samp class="samp">\O2</samp>&rsquo;</dt>
+<dd><p>At the outermost suppression level, enable emission of glyphs and
+geometric objects, and write to the standard error stream the page
+number and values of the four aforementioned registers encompassing
+glyphs written since the last interpolation of a <code class="code">\O</code> sequence, as
+well as the page offset, line length, image file name (if any),
+horizontal and vertical device motion quanta, and input file name.
+Numeric values are in basic units.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">\O3</samp>&rsquo;</dt>
+<dd><p>Begin a nested suppression level. <code class="command">grohtml</code> uses this mechanism
+to create images of output preprocessed with <code class="command">gpic</code>,
+<code class="command">geqn</code>, and <code class="command">gtbl</code>. At startup, GNU <code class="code">troff</code> is at
+the outermost suppression level. <code class="command">pre-grohtml</code> generates these
+sequences when processing the document, using GNU <code class="command">troff</code> with
+the <code class="code">ps</code> output device, Ghostscript, and the PNM tools to produce
+images in PNG format. They start a new page if the device is not
+<code class="code">html</code> or <code class="code">xhtml</code>, to reduce the number of images crossing a
+page boundary.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">\O4</samp>&rsquo;</dt>
+<dd><p>End a nested suppression level.
+</p></dd>
+</dl>
+
+<dl class="table">
+<dt>&lsquo;<samp class="samp">\O[5<var class="var">P</var><var class="var">file</var>]</samp>&rsquo;</dt>
+<dd><p>At the outermost suppression level, write the name <code class="code">file</code> to the
+standard error stream at position <var class="var">P</var>, which must be one of
+<code class="code">l</code>, <code class="code">r</code>, <code class="code">c</code>, or&nbsp;<code class="code">i</code>, corresponding to left,
+right, centered, and inline alignments within the document,
+respectively. <var class="var">file</var> is a name associated with the production of
+the next image.
+</p></dd>
+</dl>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002eO_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.O]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eO_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eO"></a>
+<a class="index-entry-id" id="index-suppression-nesting-level-register"></a>
+<a class="index-entry-id" id="index-nesting-level_002c-suppression_002c-register"></a>
+<a class="index-entry-id" id="index-level_002c-suppression-nesting_002c-register"></a>
+<p>Output suppression nesting level applied by <code class="code">\O3</code> and <code class="code">\O4</code>
+escape sequences.
+</p></dd></dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Colors.html">Colors</a>, Previous: <a href="Environments.html">Environments</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Tab-Stops-in-ms.html b/doc/groff.html.node/Tab-Stops-in-ms.html
new file mode 100644
index 0000000..3302ce5
--- /dev/null
+++ b/doc/groff.html.node/Tab-Stops-in-ms.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Tab Stops in ms (The GNU Troff Manual)</title>
+
+<meta name="description" content="Tab Stops in ms (The GNU Troff Manual)">
+<meta name="keywords" content="Tab Stops in ms (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms-Page-Layout.html" rel="up" title="ms Page Layout">
+<link href="ms-Margins.html" rel="next" title="ms Margins">
+<link href="ms-Headers-and-Footers.html" rel="prev" title="ms Headers and Footers">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="Tab-Stops-in-ms">
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Margins.html" accesskey="n" rel="next">Margins</a>, Previous: <a href="ms-Headers-and-Footers.html" accesskey="p" rel="prev">Headers and footers</a>, Up: <a href="ms-Page-Layout.html" accesskey="u" rel="up">Page layout</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Tab-stops">4.6.6.2 Tab stops</h4>
+
+<p>Use the <code class="code">ta</code> request to define tab stops as needed. See <a class="xref" href="Tabs-and-Fields.html">Tabs and Fields</a>.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eTA"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.TA</code></strong><a class="copiable-link" href='#index-_002eTA'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-TA-_005bms_005d"></a>
+<p>Reset the tab stops to the <samp class="file">ms</samp> default (every 5 ens).
+Redefine this macro to create a different set of default tab stops.
+</p></dd></dl>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Table-of-Contents.html b/doc/groff.html.node/Table-of-Contents.html
new file mode 100644
index 0000000..4d169cd
--- /dev/null
+++ b/doc/groff.html.node/Table-of-Contents.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Table of Contents (The GNU Troff Manual)</title>
+
+<meta name="description" content="Table of Contents (The GNU Troff Manual)">
+<meta name="keywords" content="Table of Contents (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Common-Features.html" rel="up" title="Common Features">
+<link href="Indexing.html" rel="next" title="Indexing">
+<link href="Footnotes-and-Endnotes.html" rel="prev" title="Footnotes and Endnotes">
+<style type="text/css">
+<!--
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Table-of-Contents">
+<div class="nav-panel">
+<p>
+Next: <a href="Indexing.html" accesskey="n" rel="next">Indexing</a>, Previous: <a href="Footnotes-and-Endnotes.html" accesskey="p" rel="prev">Footnotes and Endnotes</a>, Up: <a href="Common-Features.html" accesskey="u" rel="up">Common Features</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Table-of-Contents-1">3.2.7 Table of Contents</h4>
+<a class="index-entry-id" id="index-table-of-contents"></a>
+<a class="index-entry-id" id="index-contents_002c-table-of"></a>
+
+<p>A package may handle a <i class="slanted">table of contents</i> by directing section
+heading macros to save section heading text and the page number where it
+occurs for use in a later <i class="slanted">entry</i> for a table of contents. It
+writes the collected entries at the end of the document, once all are
+known, upon request. A row of dots (a <i class="slanted">leader</i>) bridges the
+text on the left with its location on the right. Other collections
+might work in this manner, providing lists of figures or tables.
+</p>
+<p>A table of contents is often found at the end of a GNU <code class="code">troff</code>
+document because the formatter processes the document in a single pass.
+The <code class="command">gropdf</code> output driver supports a PDF feature that relocates
+pages at the time the document is rendered; see the <cite class="cite">gropdf<span class="r">(1)</span></cite>
+man page. Type &lsquo;<samp class="samp">man gropdf</samp>&rsquo; at the command line to view it.
+</p>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Tabs-and-Fields.html b/doc/groff.html.node/Tabs-and-Fields.html
new file mode 100644
index 0000000..83c156e
--- /dev/null
+++ b/doc/groff.html.node/Tabs-and-Fields.html
@@ -0,0 +1,276 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Tabs and Fields (The GNU Troff Manual)</title>
+
+<meta name="description" content="Tabs and Fields (The GNU Troff Manual)">
+<meta name="keywords" content="Tabs and Fields (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Character-Translations.html" rel="next" title="Character Translations">
+<link href="Manipulating-Spacing.html" rel="prev" title="Manipulating Spacing">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Tabs-and-Fields">
+<div class="nav-panel">
+<p>
+Next: <a href="Character-Translations.html" accesskey="n" rel="next">Character Translations</a>, Previous: <a href="Manipulating-Spacing.html" accesskey="p" rel="prev">Manipulating Spacing</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Tabs-and-Fields-1">5.12 Tabs and Fields</h3>
+<a class="index-entry-id" id="index-tabs_002c-and-fields"></a>
+<a class="index-entry-id" id="index-fields_002c-and-tabs"></a>
+
+<a class="index-entry-id" id="index-tab-character-encoding"></a>
+<p>A tab character (<abbr class="acronym">ISO</abbr> code point&nbsp;9, <abbr class="acronym">EBCDIC</abbr>
+code point&nbsp;5) causes a horizontal movement to the next tab stop, if
+any.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005ct-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\t</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005ct-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005ct"></a>
+<a class="index-entry-id" id="index-tab-character_002c-non_002dinterpreted-_0028_005ct_0029"></a>
+<a class="index-entry-id" id="index-character_002c-tab_002c-non_002dinterpreted-_0028_005ct_0029"></a>
+<a class="index-entry-id" id="index-_005ct_002c-and-copy-mode"></a>
+<a class="index-entry-id" id="index-copy-mode_002c-and-_005ct"></a>
+<a class="index-entry-id" id="index-mode_002c-copy_002c-and-_005ct"></a>
+<p>Interpolate a tab in copy mode; see <a class="ref" href="Copy-Mode.html">Copy Mode</a>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eta"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ta</code></strong> <var class="def-var-arguments">[[<span class="r"><i class="slanted">n1</i></span> <span class="r"><i class="slanted">n2</i></span> &hellip; <span class="r"><i class="slanted">nn</i></span> ]<code class="t">T</code> <span class="r"><i class="slanted">r1</i></span> <span class="r"><i class="slanted">r2</i></span> &hellip; <span class="r"><i class="slanted">rn</i></span>]</var><a class="copiable-link" href='#index-_002eta'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ta"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002etabs_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.tabs]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002etabs_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002etabs"></a>
+<p>Change tab stop positions. This request takes a series of tab
+specifiers as arguments (optionally divided into two groups with the
+letter &lsquo;<samp class="samp">T</samp>&rsquo;) that indicate where each tab stop is to be, overriding
+any previous settings. The default scaling unit is &lsquo;<samp class="samp">m</samp>&rsquo;. Invoking
+<code class="code">ta</code> without an argument removes all tab stops.
+<a class="index-entry-id" id="index-default-tab-stops"></a>
+<a class="index-entry-id" id="index-tab-stops_002c-default"></a>
+GNU <code class="code">troff</code>&rsquo;s startup value is &lsquo;<samp class="samp">T&nbsp;0.5i</samp>&rsquo;<!-- /@w -->.
+</p>
+<p>Tab stops can be specified absolutely&mdash;as distances from the left
+margin. The following example sets six tab stops, one every inch.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ta 1i 2i 3i 4i 5i 6i
+</pre></div></div>
+
+<p>Tab stops can also be specified using a leading &lsquo;<samp class="samp">+</samp>&rsquo;, which means
+that the specified tab stop is set relative to the previous tab stop.
+For example, the following is equivalent to the previous example.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ta 1i +1i +1i +1i +1i +1i
+</pre></div></div>
+
+<p>GNU <code class="code">troff</code> supports an extended syntax to specify repeating tab
+stops. These stops appear after a &lsquo;<samp class="samp">T</samp>&rsquo; argument. Their values are
+always taken as distances relative to the previous tab stop. This is
+the idiomatic way to specify tab stops at equal intervals in
+<code class="code">groff</code>. The following is, yet again, the same as the previous
+examples. It does more, in fact, since it defines an infinite number of
+tab stops at one-inch intervals.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ta T 1i
+</pre></div></div>
+
+<p>Now we are ready to interpret the full syntax given above. The
+<code class="code">ta</code> request sets tabs at positions <var class="var">n1</var>, <var class="var">n2</var>, &hellip;,
+<var class="var">nn</var>, then at <var class="var">nn</var>+<var class="var">r1</var>, <var class="var">nn</var>+<var class="var">r2</var>, &hellip;,
+<var class="var">nn</var>+<var class="var">rn</var>, then at <var class="var">nn</var>+<var class="var">rn</var>+<var class="var">r1</var>,
+<var class="var">nn</var>+<var class="var">rn</var>+<var class="var">r2</var>, &hellip;, <var class="var">nn</var>+<var class="var">rn</var>+<var class="var">rn</var>, and so
+on.
+</p>
+<p>For example, &lsquo;<samp class="samp">4c +6c T 3c 5c 2c</samp>&rsquo; is equivalent to &lsquo;<samp class="samp">4c 10c 13c
+18c 20c 23c 28c 30c &hellip;</samp>&rsquo;.
+</p>
+<p>Text written to a tab column (i.e., between two tab stops, or between a
+tab stop and an output line boundary) may be aligned to the right or
+left, or centered in the column. This alignment is determined by
+appending &lsquo;<samp class="samp">R</samp>&rsquo;, &lsquo;<samp class="samp">L</samp>&rsquo;, or &lsquo;<samp class="samp">C</samp>&rsquo; to the tab specifier. The
+default is &lsquo;<samp class="samp">L</samp>&rsquo;.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ta 1i 2iC 3iR
+</pre></div></div>
+
+<p>The beginning of an output line is not a tab stop; the text that begins
+an output line is placed according to the configured alignment and
+indentation; see <a class="ref" href="Manipulating-Filling-and-Adjustment.html">Manipulating Filling and Adjustment</a> and <a class="ref" href="Line-Layout.html">Line Layout</a>.
+</p>
+<p>A tab stop is converted into a non-breakable horizontal movement that
+cannot be adjusted.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 2i
+.ds foo a\tb\tc
+.ta T 1i
+\*[foo]
+ error&rarr; warning: cannot break line
+ &rArr; a b c
+</pre></div></div>
+
+<p>The above creates a single output line that is a bit longer than two
+inches (we use a string to show exactly where the tab stops are).
+Now consider the following.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ll 2i
+.ds bar a\tb c\td
+.ta T 1i
+\*[bar]
+ error&rarr; warning: cannot adjust line
+ &rArr; a b
+ &rArr; c d
+</pre></div></div>
+
+<p>GNU <code class="code">troff</code> first converts the line&rsquo;s tab stops into unbreakable
+horizontal movements, then breaks after &lsquo;<samp class="samp">b</samp>&rsquo;. This usually isn&rsquo;t
+what you want.
+</p>
+<p>Superfluous tab characters&mdash;those that do not correspond to a tab
+stop&mdash;are ignored except for the first, which delimits the characters
+belonging to the last tab stop for right-alignment or centering.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds Z foo\tbar\tbaz
+.ds ZZ foo\tbar\tbazqux
+.ds ZZZ foo\tbar\tbaz\tqux
+.ta 2i 4iR
+\*[Z]
+.br
+\*[ZZ]
+.br
+\*[ZZZ]
+.br
+ &rArr; foo bar baz
+ &rArr; foo bar bazqux
+ &rArr; foo bar bazqux
+</pre></div></div>
+
+<p>The first line right-aligns &ldquo;baz&rdquo; within the second tab stop. The
+second line right-aligns &ldquo;bazqux&rdquo; within it. The third line
+right-aligns only &ldquo;baz&rdquo; because of the additional tab character, which
+marks the end of the text occupying the last tab stop defined.
+</p>
+<p>Tab stops are associated with the environment (see <a class="pxref" href="Environments.html">Environments</a>).
+</p>
+<a class="index-entry-id" id="index-tab-stop-settings-register-_0028_002etabs_0029"></a>
+<a class="index-entry-id" id="index-_002eS-register_002c-Plan-9-alias-for-_002etabs"></a>
+<a class="index-entry-id" id="index-_002etabs-register_002c-Plan-9-alias-_0028_002eS_0029"></a>
+<p>The read-only register <code class="code">.tabs</code> contains a string
+representation of the current tab settings suitable for use as an
+argument to the <code class="code">ta</code> request.<a class="footnote" id="DOCF66" href="groff.html_fot.html#FOOT66"><sup>66</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds tab-string \n[.tabs]
+\*[tab-string]
+ &rArr; T120u
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002etc"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.tc</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">c</i></span>]</var><a class="copiable-link" href='#index-_002etc'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-tc"></a>
+<a class="index-entry-id" id="index-tab-repetition-character-_0028tc_0029"></a>
+<a class="index-entry-id" id="index-character_002c-tab-repetition-_0028tc_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-tab-repetition-_0028tc_0029"></a>
+<p>Set the tab repetition character to the ordinary or special character
+<var class="var">c</var>; normally, no glyph is written when moving to a tab stop (and
+some output devices may output space characters to achieve this motion).
+A <em class="dfn">tab repetition character</em> causes the formatter to write as many
+instances of <var class="var">c</var> as are necessary to occupy the interval from the
+horizontal drawing position to the next tab stop. With no argument, GNU
+<code class="code">troff</code> reverts to the default behavior. The tab repetition
+character is associated with the environment (see <a class="pxref" href="Environments.html">Environments</a>).
+Only a single character of <var class="var">c</var> is recognized; any excess is ignored.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002elinetabs"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.linetabs</code></strong> <var class="def-var-arguments">n</var><a class="copiable-link" href='#index-_002elinetabs'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-linetabs"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002elinetabs_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.linetabs]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002elinetabs_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002elinetabs-1"></a>
+<a class="index-entry-id" id="index-tab_002c-line_002dtabs-mode"></a>
+<a class="index-entry-id" id="index-line_002dtabs-mode"></a>
+<a class="index-entry-id" id="index-mode_002c-line_002dtabs"></a>
+<p>If <var class="var">n</var> is missing or non-zero, activate <em class="dfn">line-tabs</em>; deactivate
+it otherwise (the default). Active line-tabs cause GNU <code class="code">troff</code>
+to compute tab distances relative to the start of the output line
+instead of the input line.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de Tabs
+. ds x a\t\c
+. ds y b\t\c
+. ds z c
+. ta 1i 3i
+\\*x
+\\*y
+\\*z
+..
+.Tabs
+.br
+.linetabs
+.Tabs
+ &rArr; a b c
+ &rArr; a b c
+</pre></div></div>
+
+<p>Line-tabs activation is associated with the environment
+(see <a class="pxref" href="Environments.html">Environments</a>). The read-only register <code class="code">.linetabs</code>
+interpolates&nbsp;1 if line-tabs are active, and 0 otherwise.
+</p></dd></dl>
+
+
+
+<ul class="mini-toc">
+<li><a href="Leaders.html" accesskey="1">Leaders</a></li>
+<li><a href="Fields.html" accesskey="2">Fields</a></li>
+</ul>
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Character-Translations.html">Character Translations</a>, Previous: <a href="Manipulating-Spacing.html">Manipulating Spacing</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Tabs-and-Leaders.html b/doc/groff.html.node/Tabs-and-Leaders.html
new file mode 100644
index 0000000..c8298a1
--- /dev/null
+++ b/doc/groff.html.node/Tabs-and-Leaders.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Tabs and Leaders (The GNU Troff Manual)</title>
+
+<meta name="description" content="Tabs and Leaders (The GNU Troff Manual)">
+<meta name="keywords" content="Tabs and Leaders (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Text.html" rel="up" title="Text">
+<link href="Input-Conventions.html" rel="next" title="Input Conventions">
+<link href="Adjustment.html" rel="prev" title="Adjustment">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+kbd.key {font-style: normal}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Tabs-and-Leaders">
+<div class="nav-panel">
+<p>
+Next: <a href="Input-Conventions.html" accesskey="n" rel="next">Input Conventions</a>, Previous: <a href="Adjustment.html" accesskey="p" rel="prev">Adjustment</a>, Up: <a href="Text.html" accesskey="u" rel="up">Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Tabs-and-Leaders-1">5.1.6 Tabs and Leaders</h4>
+
+<a class="index-entry-id" id="index-horizontal-tab-character"></a>
+<a class="index-entry-id" id="index-tab-character"></a>
+<a class="index-entry-id" id="index-character_002c-horizontal-tab"></a>
+<a class="index-entry-id" id="index-leader-character"></a>
+<a class="index-entry-id" id="index-character_002c-leader"></a>
+<a class="index-entry-id" id="index-tab-stops"></a>
+<a class="index-entry-id" id="index-stops_002c-tab"></a>
+<p>GNU <code class="code">troff</code> translates input horizontal tab characters (&ldquo;tabs&rdquo;)
+and <kbd class="key">Control+A</kbd> characters (&ldquo;leaders&rdquo;) into movements to the next
+tab stop. Tabs simply move to the next tab stop; leaders place enough
+periods to fill the space. Tab stops are by default located every half
+inch measured from the drawing position corresponding to the beginning
+of the input line; see <a class="ref" href="Page-Geometry.html">Page Geometry</a>. Tabs and leaders do not
+cause breaks and therefore do not interrupt filling. Below, we use
+arrows &rarr; and bullets &bull; to indicate input tabs and
+leaders, respectively.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">1
+&rarr; 2 &rarr; 3 &bull; 4
+&rarr; &bull; 5
+&rArr; 1 2 3.......4 ........5
+</pre></div></div>
+
+<p>Tabs and leaders lend themselves to table construction.<a class="footnote" id="DOCF24" href="groff.html_fot.html#FOOT24"><sup>24</sup></a> The tab and leader glyphs can be
+configured, and further facilities for sophisticated table composition
+are available; see <a class="ref" href="Tabs-and-Fields.html">Tabs and Fields</a>. There are many details to
+track when using such low-level features, so most users turn to the
+<cite class="cite">tbl<span class="r">(1)</span></cite> preprocessor to lay out tables.
+</p>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Text-settings-in-ms.html b/doc/groff.html.node/Text-settings-in-ms.html
new file mode 100644
index 0000000..f13be1e
--- /dev/null
+++ b/doc/groff.html.node/Text-settings-in-ms.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Text settings in ms (The GNU Troff Manual)</title>
+
+<meta name="description" content="Text settings in ms (The GNU Troff Manual)">
+<meta name="keywords" content="Text settings in ms (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms-Body-Text.html" rel="up" title="ms Body Text">
+<link href="Typographical-symbols-in-ms.html" rel="next" title="Typographical symbols in ms">
+<link href="ms-Body-Text.html" rel="prev" title="ms Body Text">
+<style type="text/css">
+<!--
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="Text-settings-in-ms">
+<div class="nav-panel">
+<p>
+Next: <a href="Typographical-symbols-in-ms.html" accesskey="n" rel="next">Typographical symbols</a>, Previous: <a href="ms-Body-Text.html" accesskey="p" rel="prev">Body Text</a>, Up: <a href="ms-Body-Text.html" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Text-settings-1">4.6.5.1 Text settings</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-text-settings"></a>
+
+<p>The <code class="code">FAM</code> string, a GNU extension, sets the font family for body
+text; the default is &lsquo;<samp class="samp">T</samp>&rsquo;. The <code class="code">PS</code> and <code class="code">VS</code> registers
+set the type size and vertical spacing (distance between text
+baselines), respectively. The font family and type size are ignored on
+terminal devices. Setting these parameters before the first call of a
+heading, paragraphing, or (non-date) document description macro also
+applies them to headers, footers, and (for <code class="code">FAM</code>) footnotes.
+</p>
+<p>Which font families are available depends on the output device; as a
+convention, <code class="code">T</code> selects a serif family (&ldquo;Times&rdquo;), <code class="code">H</code> a
+sans-serif family (&ldquo;Helvetica&rdquo;), and <code class="code">C</code> a monospaced family
+(&ldquo;Courier&rdquo;). The man page for the output driver documents its font
+repertoire. Consult the <cite class="cite">groff<span class="r">(1)</span></cite> man page for lists of
+available output devices and their drivers.
+</p>
+<p>The hyphenation mode (as used by the <code class="code">hy</code> request) is set from the
+<code class="code">HY</code> register. Setting <code class="code">HY</code> to &lsquo;<samp class="samp">0</samp>&rsquo; is equivalent to
+using the <code class="code">nh</code> request. This is a Tenth Edition Research Unix
+extension.
+</p>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Text.html b/doc/groff.html.node/Text.html
new file mode 100644
index 0000000..16a1d83
--- /dev/null
+++ b/doc/groff.html.node/Text.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Text (The GNU Troff Manual)</title>
+
+<meta name="description" content="Text (The GNU Troff Manual)">
+<meta name="keywords" content="Text (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Measurements.html" rel="next" title="Measurements">
+<link href="GNU-troff-Reference.html" rel="prev" title="GNU troff Reference">
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Text">
+<div class="nav-panel">
+<p>
+Next: <a href="Measurements.html" accesskey="n" rel="next">Measurements</a>, Previous: <a href="GNU-troff-Reference.html" accesskey="p" rel="prev">GNU <code class="code">troff</code> Reference</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Text-1">5.1 Text</h3>
+<a class="index-entry-id" id="index-text_002c-GNU-troff-processing"></a>
+
+<p><abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> was designed to take input as it would be
+composed on a typewriter, including the teletypewriters used as early
+computer terminals, and relieve the user drafting a document of concern
+with details like line length, hyphenation breaking, and the achievement
+of straight margins. Early in its development, the program gained the
+ability to prepare output for a phototypesetter; a document could then
+be prepared for output to either a teletypewriter, a phototypesetter, or
+both. GNU <code class="code">troff</code> continues this tradition of permitting an author
+to compose a single master version of a document which can then be
+rendered for a variety of output formats or devices.
+</p>
+<p><code class="code">roff</code> input files contain text interspersed with instructions to
+control the formatter. Even in the absence of such instructions, GNU
+<code class="code">troff</code> still processes its input in several ways, by filling,
+hyphenating, breaking, and adjusting it, and supplementing it with
+inter-sentence space.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="Filling.html" accesskey="1">Filling</a></li>
+<li><a href="Sentences.html" accesskey="2">Sentences</a></li>
+<li><a href="Hyphenation.html" accesskey="3">Hyphenation</a></li>
+<li><a href="Breaking.html" accesskey="4">Breaking</a></li>
+<li><a href="Adjustment.html" accesskey="5">Adjustment</a></li>
+<li><a href="Tabs-and-Leaders.html" accesskey="6">Tabs and Leaders</a></li>
+<li><a href="Requests-and-Macros.html" accesskey="7">Requests and Macros</a></li>
+<li><a href="Macro-Packages.html" accesskey="8">Macro Packages</a></li>
+<li><a href="Input-Encodings.html" accesskey="9">Input Encodings</a></li>
+<li><a href="Input-Conventions.html">Input Conventions</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/The-Implicit-Page-Trap.html b/doc/groff.html.node/The-Implicit-Page-Trap.html
new file mode 100644
index 0000000..82d1a6b
--- /dev/null
+++ b/doc/groff.html.node/The-Implicit-Page-Trap.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>The Implicit Page Trap (The GNU Troff Manual)</title>
+
+<meta name="description" content="The Implicit Page Trap (The GNU Troff Manual)">
+<meta name="keywords" content="The Implicit Page Trap (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Vertical-Position-Traps.html" rel="up" title="Vertical Position Traps">
+<link href="Diversion-Traps.html" rel="next" title="Diversion Traps">
+<link href="Page-Location-Traps.html" rel="prev" title="Page Location Traps">
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="The-Implicit-Page-Trap">
+<div class="nav-panel">
+<p>
+Next: <a href="Diversion-Traps.html" accesskey="n" rel="next">Diversion Traps</a>, Previous: <a href="Page-Location-Traps.html" accesskey="p" rel="prev">Page Location Traps</a>, Up: <a href="Vertical-Position-Traps.html" accesskey="u" rel="up">Vertical Position Traps</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="The-Implicit-Page-Trap-1">5.28.1.2 The Implicit Page Trap</h4>
+<a class="index-entry-id" id="index-implicit-trap"></a>
+<a class="index-entry-id" id="index-trap_002c-implicit"></a>
+
+<a class="index-entry-id" id="index-page-break-2"></a>
+<a class="index-entry-id" id="index-break_002c-page-2"></a>
+<a class="index-entry-id" id="index-page-ejection-2"></a>
+<a class="index-entry-id" id="index-ejection_002c-page-2"></a>
+<p>If, after starting GNU <code class="code">troff</code> without loading a macro package, you
+use the <code class="code">ptr</code> request to dump a list of the active traps to the
+standard error stream,<a class="footnote" id="DOCF109" href="groff.html_fot.html#FOOT109"><sup>109</sup></a> nothing is reported.
+Yet the <code class="code">.t</code> register will report a steadily decreasing value with
+every output line your document produces, and once the value of
+<code class="code">.t</code> gets to within <code class="code">.V</code> of zero, you will notice that
+something trap-like happens&mdash;the page is ejected, a new one begins, and
+the value of <code class="code">.t</code> becomes large once more.
+</p>
+<p>This <em class="dfn">implicit page trap</em> always exists in the top-level
+diversion;<a class="footnote" id="DOCF110" href="groff.html_fot.html#FOOT110"><sup>110</sup></a> it works like a trap in some
+ways but not others. Its purpose is to eject the current page and start
+the next one. It has no name, so it cannot be moved or deleted with
+<code class="code">wh</code> or <code class="code">ch</code> requests. You cannot hide it by placing another
+trap at its location, and can move it only by redefining the page length
+with <code class="code">pl</code>. Its operation is suppressed when vertical page traps
+are disabled with GNU <code class="code">troff</code>&rsquo;s <code class="code">vpt</code> request.
+</p>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Traps.html b/doc/groff.html.node/Traps.html
new file mode 100644
index 0000000..3386bdb
--- /dev/null
+++ b/doc/groff.html.node/Traps.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Traps (The GNU Troff Manual)</title>
+
+<meta name="description" content="Traps (The GNU Troff Manual)">
+<meta name="keywords" content="Traps (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Diversions.html" rel="next" title="Diversions">
+<link href="Deferring-Output.html" rel="prev" title="Deferring Output">
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Traps">
+<div class="nav-panel">
+<p>
+Next: <a href="Diversions.html" accesskey="n" rel="next">Diversions</a>, Previous: <a href="Deferring-Output.html" accesskey="p" rel="prev">Deferring Output</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Traps-1">5.28 Traps</h3>
+<a class="index-entry-id" id="index-traps"></a>
+
+<p><em class="dfn">Traps</em> are locations in the output or conditions on the input that,
+when reached or fulfilled, call a specified macro. These traps can
+occur at a given location on the page, at a given location in the
+current diversion (together, these are known as <i class="slanted">vertical
+position traps</i>), at a blank line, at a line with leading space
+characters, after a quantity of input lines, or at the end of input.
+Macros called by traps are passed no arguments.
+<a class="index-entry-id" id="index-planting-a-trap"></a>
+<a class="index-entry-id" id="index-trap_002c-planting"></a>
+Setting a trap is also called <em class="dfn">planting</em> one.
+<a class="index-entry-id" id="index-trap_002c-springing"></a>
+<a class="index-entry-id" id="index-springing-a-trap"></a>
+It is said that a trap is <em class="dfn">sprung</em> if its condition is fulfilled.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="Vertical-Position-Traps.html" accesskey="1">Vertical Position Traps</a></li>
+<li><a href="Input-Line-Traps.html" accesskey="2">Input Line Traps</a></li>
+<li><a href="Blank-Line-Traps.html" accesskey="3">Blank Line Traps</a></li>
+<li><a href="Leading-Space-Traps.html" accesskey="4">Leading Space Traps</a></li>
+<li><a href="End_002dof_002dinput-Traps.html" accesskey="5">End-of-input Traps</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Tutorial-for-Macro-Users.html b/doc/groff.html.node/Tutorial-for-Macro-Users.html
new file mode 100644
index 0000000..3fc9bce
--- /dev/null
+++ b/doc/groff.html.node/Tutorial-for-Macro-Users.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Tutorial for Macro Users (The GNU Troff Manual)</title>
+
+<meta name="description" content="Tutorial for Macro Users (The GNU Troff Manual)">
+<meta name="keywords" content="Tutorial for Macro Users (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="index.html" rel="up" title="Top">
+<link href="Major-Macro-Packages.html" rel="next" title="Major Macro Packages">
+<link href="Invoking-groff.html" rel="prev" title="Invoking groff">
+
+
+</head>
+
+<body lang="en">
+<div class="chapter-level-extent" id="Tutorial-for-Macro-Users">
+<div class="nav-panel">
+<p>
+Next: <a href="Major-Macro-Packages.html" accesskey="n" rel="next">Macro Packages</a>, Previous: <a href="Invoking-groff.html" accesskey="p" rel="prev">Invoking <code class="code">groff</code></a>, Up: <a href="index.html" accesskey="u" rel="up">GNU <code class="code">troff</code></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h2 class="chapter" id="Tutorial-for-Macro-Users-1">3 Tutorial for Macro Users</h2>
+<a class="index-entry-id" id="index-tutorial-for-macro-users"></a>
+<a class="index-entry-id" id="index-macros_002c-tutorial-for-users"></a>
+<a class="index-entry-id" id="index-user_0027s-tutorial-for-macros"></a>
+<a class="index-entry-id" id="index-user_0027s-macro-tutorial"></a>
+
+<p>Most users of the <code class="code">roff</code> language employ a macro package to format
+their documents. Successful macro packages ease the composition
+process; their users need not have mastered the full formatting
+language, nor understand features like diversions, traps, and
+environments. This chapter aims to familiarize you with basic concepts
+and mechanisms common to many macro packages (like &ldquo;displays&rdquo;). If
+you prefer a meticulous and comprehensive presentation, try <a class="ref" href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> instead.
+</p>
+
+
+
+<ul class="mini-toc">
+<li><a href="Basics.html" accesskey="1">Basics</a></li>
+<li><a href="Common-Features.html" accesskey="2">Common Features</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Typeface-and-decoration.html b/doc/groff.html.node/Typeface-and-decoration.html
new file mode 100644
index 0000000..759a761
--- /dev/null
+++ b/doc/groff.html.node/Typeface-and-decoration.html
@@ -0,0 +1,212 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Typeface and decoration (The GNU Troff Manual)</title>
+
+<meta name="description" content="Typeface and decoration (The GNU Troff Manual)">
+<meta name="keywords" content="Typeface and decoration (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms-Body-Text.html" rel="up" title="ms Body Text">
+<link href="Lists-in-ms.html" rel="next" title="Lists in ms">
+<link href="Headings-in-ms.html" rel="prev" title="Headings in ms">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+kbd.key {font-style: normal}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="Typeface-and-decoration">
+<div class="nav-panel">
+<p>
+Next: <a href="Lists-in-ms.html" accesskey="n" rel="next">Lists</a>, Previous: <a href="Headings-in-ms.html" accesskey="p" rel="prev">Headings</a>, Up: <a href="ms-Body-Text.html" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Typeface-and-decoration-1">4.6.5.5 Typeface and decoration</h4>
+
+<p>The <samp class="file">ms</samp> macros provide a variety of ways to style text.
+Attend closely to the ordering of arguments labeled <var class="var">pre</var> and
+<var class="var">post</var>, which is not intuitive. Support for <var class="var">pre</var>
+arguments is a GNU extension.<a class="footnote" id="DOCF10" href="groff.html_fot.html#FOOT10"><sup>10</sup></a>
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eB"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.B</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span> [<span class="r"><i class="slanted">post</i></span> [<span class="r"><i class="slanted">pre</i></span>]]]</var><a class="copiable-link" href='#index-_002eB'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-B-_005bms_005d"></a>
+<p>Style <var class="var">text</var> in <b class="b">bold</b>, followed by <var class="var">post</var> in the previous
+font style without intervening space, and preceded by <var class="var">pre</var>
+similarly. Without arguments, <samp class="file">ms</samp> styles subsequent text in bold
+until the next paragraphing, heading, or no-argument typeface macro
+call.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eR-1"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.R</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span> [<span class="r"><i class="slanted">post</i></span> [<span class="r"><i class="slanted">pre</i></span>]]]</var><a class="copiable-link" href='#index-_002eR-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-R-_005bms_005d"></a>
+<p>As <code class="code">B</code>, but use the roman style (upright text of normal weight)
+instead of bold. Argument recognition is a GNU extension.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eI"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.I</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span> [<span class="r"><i class="slanted">post</i></span> [<span class="r"><i class="slanted">pre</i></span>]]]</var><a class="copiable-link" href='#index-_002eI'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-I-_005bms_005d"></a>
+<p>As <code class="code">B</code>, but use an <i class="i">italic</i> or oblique style instead of bold.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eBI"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.BI</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span> [<span class="r"><i class="slanted">post</i></span> [<span class="r"><i class="slanted">pre</i></span>]]]</var><a class="copiable-link" href='#index-_002eBI'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-BI-_005bms_005d"></a>
+<p>As <code class="code">B</code>, but use a bold italic or bold oblique style instead of
+upright bold. This is a Tenth Edition Research Unix extension.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eCW-1"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.CW</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span> [<span class="r"><i class="slanted">post</i></span> [<span class="r"><i class="slanted">pre</i></span>]]]</var><a class="copiable-link" href='#index-_002eCW-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-CW-_005bms_005d"></a>
+<p>As <code class="code">B</code>, but use a <code class="t">constant-width</code> (monospaced) roman typeface
+instead of bold. This is a Tenth Edition Research Unix extension.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eBX"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.BX</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span>]</var><a class="copiable-link" href='#index-_002eBX'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-BX-_005bms_005d"></a>
+<p>Typeset <var class="var">text</var> and draw a box around it. On terminal devices,
+reverse video is used instead. If you want <var class="var">text</var> to contain space,
+use unbreakable space or horizontal motion escape sequences (<code class="code">\~</code>,
+<code class="code">\<kbd class="key">SP</kbd></code>, <code class="code">\^</code>, <code class="code">\|</code>, <code class="code">\0</code> or <code class="code">\h</code>).
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eUL"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.UL</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">text</i></span> [<span class="r"><i class="slanted">post</i></span>]]</var><a class="copiable-link" href='#index-_002eUL'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-UL-_005bms_005d"></a>
+<p>Typeset <var class="var">text</var> with an underline. <var class="var">post</var>, if present, is set
+after <var class="var">text</var> with no intervening space.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eLG"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.LG</code></strong><a class="copiable-link" href='#index-_002eLG'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-LG-_005bms_005d"></a>
+<p>Set subsequent text in larger type (two points larger than the
+current size) until the next type size, paragraphing, or heading macro
+call. You can specify this macro multiple times to enlarge the type
+size as needed.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eSM"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.SM</code></strong><a class="copiable-link" href='#index-_002eSM'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-SM-_005bms_005d"></a>
+<p>Set subsequent text in smaller type (two points smaller than the current
+size) until the next type size, paragraphing, or heading macro call.
+You can specify this macro multiple times to reduce the type size as
+needed.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eNL"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.NL</code></strong><a class="copiable-link" href='#index-_002eNL'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-NL-_005bms_005d"></a>
+<p>Set subsequent text at the normal type size (the amount in the <code class="code">PS</code>
+register).
+</p></dd></dl>
+
+<p><var class="var">pre</var> and <var class="var">post</var> arguments are typically used to simplify the
+attachment of punctuation to styled words. When <var class="var">pre</var> is used,
+a hyphenation control escape sequence <code class="code">\%</code> that would ordinarily
+start <var class="var">text</var> must start <var class="var">pre</var> instead to have the desired
+effect.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">The CS course's students found one C language keyword
+.CW static ) \%(
+most troublesome.
+</pre></div>
+</td></tr></table>
+
+<p>The foregoing example produces output as follows.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted"><span class="r">The CS course&rsquo;s students found one C language keyword (<code class="t">static</code>)
+most troublesome.</span>
+</pre></div>
+</td></tr></table>
+
+<p>You can use the output line continuation escape sequence <code class="code">\c</code> to
+achieve the same result (see <a class="pxref" href="Line-Continuation.html">Line Continuation</a>). It is also
+portable to older <samp class="file">ms</samp> implementations.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">The CS course's students found one C language keyword
+\%(\c
+.CW \%static )
+most troublesome.
+</pre></div>
+</td></tr></table>
+
+<p><code class="code">groff</code> <samp class="file">ms</samp> also offers strings to begin and end super- and
+subscripting. These are GNU extensions.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_007b_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[{]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_007b_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_007b-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005b_007d_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[}]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_007d_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_007d-_005bms_005d"></a>
+<p>Begin and end superscripting, respectively.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_003c_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[&lt;]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_003c_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_003c-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005b_003e_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[&gt;]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_003e_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_003e-_005bms_005d"></a>
+<p>Begin and end subscripting, respectively.
+</p></dd></dl>
+
+<p>Rather than calling the <code class="code">CW</code> macro, in <code class="code">groff</code> <samp class="file">ms</samp> you
+might prefer to change the font family to Courier by setting the
+<code class="code">FAM</code> string to &lsquo;<samp class="samp">C</samp>&rsquo;. You can then use all four style macros
+above, returning to the default family (Times) with &lsquo;<samp class="samp">.ds FAM T</samp>&rsquo;.
+Because changes to <code class="code">FAM</code> take effect only at the next paragraph,
+<code class="code">CW</code> remains useful to &ldquo;inline&rdquo; a change to the font family,
+similarly to the practice of this document in noting syntactical
+elements of <samp class="file">ms</samp> and <code class="code">groff</code>.
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Lists-in-ms.html">Lists</a>, Previous: <a href="Headings-in-ms.html">Headings</a>, Up: <a href="ms-Body-Text.html">Body Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Typographical-symbols-in-ms.html b/doc/groff.html.node/Typographical-symbols-in-ms.html
new file mode 100644
index 0000000..3323bcd
--- /dev/null
+++ b/doc/groff.html.node/Typographical-symbols-in-ms.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Typographical symbols in ms (The GNU Troff Manual)</title>
+
+<meta name="description" content="Typographical symbols in ms (The GNU Troff Manual)">
+<meta name="keywords" content="Typographical symbols in ms (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms-Body-Text.html" rel="up" title="ms Body Text">
+<link href="Paragraphs-in-ms.html" rel="next" title="Paragraphs in ms">
+<link href="Text-settings-in-ms.html" rel="prev" title="Text settings in ms">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="Typographical-symbols-in-ms">
+<div class="nav-panel">
+<p>
+Next: <a href="Paragraphs-in-ms.html" accesskey="n" rel="next">Paragraphs</a>, Previous: <a href="Text-settings-in-ms.html" accesskey="p" rel="prev">Text settings</a>, Up: <a href="ms-Body-Text.html" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Typographical-symbols">4.6.5.2 Typographical symbols</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-obtaining-typographical-symbols"></a>
+
+<p><samp class="file">ms</samp> provides a few strings to obtain typographical symbols not
+easily entered with the keyboard. These and many others are available
+as special character escape sequences&mdash;see the <cite class="cite">groff_char<span class="r">(7)</span></cite>
+man page.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_002d_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[-]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_002d_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002d-_005bms_005d"></a>
+<p>Interpolate an em dash.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bQ_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[Q]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bQ_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-Q-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bU_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[U]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bU_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-U-_005bms_005d"></a>
+<p>Interpolate typographer&rsquo;s quotation marks where available, and neutral
+double quotes otherwise. <code class="code">\*Q</code> is the left quote and <code class="code">\*U</code>
+the right.
+</p></dd></dl>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Using-Escape-Sequences.html b/doc/groff.html.node/Using-Escape-Sequences.html
new file mode 100644
index 0000000..9eabad1
--- /dev/null
+++ b/doc/groff.html.node/Using-Escape-Sequences.html
@@ -0,0 +1,206 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Using Escape Sequences (The GNU Troff Manual)</title>
+
+<meta name="description" content="Using Escape Sequences (The GNU Troff Manual)">
+<meta name="keywords" content="Using Escape Sequences (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Formatter-Instructions.html" rel="up" title="Formatter Instructions">
+<link href="Delimiters.html" rel="next" title="Delimiters">
+<link href="Calling-Macros.html" rel="prev" title="Calling Macros">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Using-Escape-Sequences">
+<div class="nav-panel">
+<p>
+Next: <a href="Delimiters.html" accesskey="n" rel="next">Delimiters</a>, Previous: <a href="Calling-Macros.html" accesskey="p" rel="prev">Calling Macros</a>, Up: <a href="Formatter-Instructions.html" accesskey="u" rel="up">Formatter Instructions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Using-Escape-Sequences-1">5.6.4 Using Escape Sequences</h4>
+<a class="index-entry-id" id="index-using-escape-sequences"></a>
+<a class="index-entry-id" id="index-escape-sequences"></a>
+
+<p>Whereas requests must occur on control lines, escape sequences can occur
+intermixed with text and may appear in arguments to requests, macros,
+and other escape sequences.
+<a class="index-entry-id" id="index-_005c"></a>
+An escape sequence is introduced by the escape character, a backslash
+<code class="code">\</code> (but see the <code class="code">ec</code> request below). The next character
+selects the escape&rsquo;s function.
+</p>
+<p>Escape sequences vary in length. Some take an argument, and of those,
+some have different syntactical forms for a one-character,
+two-character, or arbitrary-length argument. Others accept <em class="emph">only</em>
+an arbitrary-length argument. In the former scheme, a one-character
+argument follows the function character immediately, an opening
+parenthesis &lsquo;<samp class="samp">(</samp>&rsquo; introduces a two-character argument (no closing
+parenthesis is used), and an argument of arbitrary length is enclosed in
+brackets &lsquo;<samp class="samp">[]</samp>&rsquo;. In the latter scheme, the user selects a delimiter
+character. A few escape sequences are idiosyncratic, and support both
+of the foregoing conventions (<code class="code">\s</code>), designate their own
+termination sequence (<code class="code">\?</code>), consume input until the next newline
+(<code class="code">\!</code>, <code class="code">\&quot;</code>, <code class="code">\#</code>), or support an additional modifier
+character (<code class="code">\s</code> again, and <code class="code">\n</code>). As with requests, use of
+some escape sequences in source documents may interact poorly with a
+macro package you use; consult its documentation to learn of &ldquo;safe&rdquo;
+sequences or alternative facilities it provides to achieve the desired
+result.
+</p>
+<p>If an escape character is followed by a character that does not
+identify a defined operation, the escape character is ignored (producing
+a diagnostic of the &lsquo;<samp class="samp">escape</samp>&rsquo; warning category, which is not enabled
+by default) and the following character is processed normally.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">$ groff -Tps -ww
+.nr N 12
+.ds co white
+.ds animal elephant
+I have \fI\nN \*(co \*[animal]s,\f[]
+said \P.\&amp;\~Pseudo Pachyderm.
+ error&rarr; warning: escape character ignored before 'P'
+ &rArr; I have <i class="slanted">12 white elephants,</i> said P. Pseudo Pachyderm.
+</pre></div></div>
+
+<p>Escape sequence interpolation is of higher precedence than escape
+sequence argument interpretation. This rule affords flexibility in
+using escape sequences to construct parameters to other escape
+sequences.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds family C\&quot; Courier
+.ds style I\&quot; oblique
+Choice a typeface \f(\*[family]\*[style]wisely.
+ &rArr; Choose a typeface <i class="slanted">wisely.</i>
+</pre></div></div>
+
+<p>In the above, the syntax form &lsquo;<samp class="samp">\f(</samp>&rsquo; accepts only two characters for
+an argument; the example works because the subsequent escape sequences
+are interpolated before the selection escape sequence argument is
+processed, and strings <code class="code">family</code> and <code class="code">style</code> interpolate one
+character each.<a class="footnote" id="DOCF46" href="groff.html_fot.html#FOOT46"><sup>46</sup></a>
+</p>
+<p>The escape character is nearly always interpreted when encountered; it
+is therefore desirable to have a way to interpolate it, disable it, or
+change it.
+</p>
+<a class="index-entry-id" id="index-formatting-the-escape-character-_0028_005ce_0029"></a>
+<a class="index-entry-id" id="index-escape-character_002c-formatting-_0028_005ce_0029"></a>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005ce-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\e</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005ce-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005ce"></a>
+<p>Interpolate the escape character.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-formatting-a-backslash-glyph-_0028_005c_005brs_005d_0029"></a>
+<a class="index-entry-id" id="index-backslash-glyph_002c-formatting-_0028_005c_005brs_005d_0029"></a>
+<p>The <code class="code">\[rs]</code> special character escape sequence formats a backslash
+glyph. In macro and string definitions, the input sequences <code class="code">\\</code>
+and <code class="code">\E</code> defer interpretation of escape sequences. See <a class="xref" href="Copy-Mode.html">Copy Mode</a>.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eeo"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.eo</code></strong><a class="copiable-link" href='#index-_002eeo'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-eo"></a>
+<a class="index-entry-id" id="index-disabling-_005c-_0028eo_0029"></a>
+<a class="index-entry-id" id="index-_005c_002c-disabling-_0028eo_0029"></a>
+<p>Disable the escape mechanism except in copy mode. Once this request is
+invoked, no input character is recognized as starting an escape
+sequence in interpretation mode.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eec"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ec</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">o</i></span>]</var><a class="copiable-link" href='#index-_002eec'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ec"></a>
+<a class="index-entry-id" id="index-escape-character_002c-changing-_0028ec_0029"></a>
+<a class="index-entry-id" id="index-character_002c-escape_002c-changing-_0028ec_0029"></a>
+<p>Recognize the ordinary character&nbsp;<var class="var">o</var> as the escape character.
+If&nbsp;<var class="var">o</var> is absent or invalid, the default escape character
+&lsquo;<samp class="samp">\</samp>&rsquo; is selected.
+</p></dd></dl>
+
+<p>Switching escape sequence interpretation off to define a macro and back
+on afterward can obviate the need to double the escape character within
+the definition. See <a class="xref" href="Writing-Macros.html">Writing Macros</a>. This technique is not available
+if your macro needs to interpolate values at the time it is
+<em class="emph">defined</em>&mdash;but many do not.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.\&quot; simplified `BR` macro from the man(7) macro package
+.eo
+.de BR
+. ds result \&amp;
+. while (\n[.$] &gt;= 2) \{\
+. as result \fB\$1\fR\$2\&quot;
+. shift 2
+. \}
+. if \n[.$] .as result \fB\$1\&quot;
+\*[result]
+. rm result
+. ft R
+..
+.ec
+</pre></div></div>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eecs"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ecs</code></strong><a class="copiable-link" href='#index-_002eecs'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ecs"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eecr"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ecr</code></strong><a class="copiable-link" href='#index-_002eecr'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ecr"></a>
+<p>The <code class="code">ecs</code> request stores the escape character for recall with
+<code class="code">ecr</code>. <code class="code">ecr</code> sets the escape character to &lsquo;<samp class="samp">\</samp>&rsquo; if none
+has been saved.
+</p>
+<p>Use these requests together to temporarily change the escape character.
+</p></dd></dl>
+
+<p>Using a different escape character, or disabling it, when calling macros
+not under your control will likely cause errors, since GNU <code class="code">troff</code>
+has no mechanism to &ldquo;intern&rdquo; macros&mdash;that is, to convert a macro
+definition into a form independent of its
+representation.<a class="footnote" id="DOCF47" href="groff.html_fot.html#FOOT47"><sup>47</sup></a> When a
+macro is called, its contents are interpreted literally.
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Delimiters.html">Delimiters</a>, Previous: <a href="Calling-Macros.html">Calling Macros</a>, Up: <a href="Formatter-Instructions.html">Formatter Instructions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Using-Fonts.html b/doc/groff.html.node/Using-Fonts.html
new file mode 100644
index 0000000..81f48e6
--- /dev/null
+++ b/doc/groff.html.node/Using-Fonts.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Using Fonts (The GNU Troff Manual)</title>
+
+<meta name="description" content="Using Fonts (The GNU Troff Manual)">
+<meta name="keywords" content="Using Fonts (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Manipulating-Type-Size-and-Vertical-Spacing.html" rel="next" title="Manipulating Type Size and Vertical Spacing">
+<link href="Page-Control.html" rel="prev" title="Page Control">
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Using-Fonts">
+<div class="nav-panel">
+<p>
+Next: <a href="Manipulating-Type-Size-and-Vertical-Spacing.html" accesskey="n" rel="next">Manipulating Type Size and Vertical Spacing</a>, Previous: <a href="Page-Control.html" accesskey="p" rel="prev">Page Control</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Using-Fonts-1">5.19 Using Fonts</h3>
+<a class="index-entry-id" id="index-font"></a>
+
+<a class="index-entry-id" id="index-typeface"></a>
+<a class="index-entry-id" id="index-font-family"></a>
+<a class="index-entry-id" id="index-font-style"></a>
+<a class="index-entry-id" id="index-style_002c-font"></a>
+<a class="index-entry-id" id="index-family_002c-font"></a>
+<a class="index-entry-id" id="index-text-font"></a>
+<a class="index-entry-id" id="index-special-font"></a>
+<a class="index-entry-id" id="index-unstyled-font"></a>
+<a class="index-entry-id" id="index-font_002c-text"></a>
+<a class="index-entry-id" id="index-font_002c-special"></a>
+<a class="index-entry-id" id="index-font_002c-unstyled"></a>
+<p>In digital typography, a <em class="dfn">font</em> is a collection of characters in a
+specific typeface that a device can render as glyphs at a desired
+size.<a class="footnote" id="DOCF72" href="groff.html_fot.html#FOOT72"><sup>72</sup></a> A <code class="code">roff</code> formatter can change typefaces at any
+point in the text. The basic faces are a set of <em class="dfn">styles</em> combining
+upright and slanted shapes with normal and heavy stroke weights:
+&lsquo;<samp class="samp">R</samp>&rsquo;, &lsquo;<samp class="samp">I</samp>&rsquo;, &lsquo;<samp class="samp">B</samp>&rsquo;, and &lsquo;<samp class="samp">BI</samp>&rsquo;&mdash;these stand for
+<i class="slanted">roman</i>, <i class="slanted">italic</i>, <i class="slanted">bold</i>, and
+<i class="slanted">bold-italic</i>. For linguistic text, GNU <code class="code">troff</code> groups
+typefaces into <em class="dfn">families</em> containing each of these
+styles.<a class="footnote" id="DOCF73" href="groff.html_fot.html#FOOT73"><sup>73</sup></a> A <em class="dfn">text font</em> is thus often a family
+combined with a style, but it need not be: consider the <code class="code">ps</code> and
+<code class="code">pdf</code> devices&rsquo; <code class="code">ZCMI</code> (Zapf Chancery Medium italic)&mdash;often,
+no other style of Zapf Chancery Medium is provided. On typesetting
+devices, at least one <em class="dfn">special font</em> is available, comprising
+<em class="dfn">unstyled</em> glyphs for mathematical operators and other purposes.
+</p>
+<a class="index-entry-id" id="index-font-description-file"></a>
+<a class="index-entry-id" id="index-description-file_002c-font"></a>
+<a class="index-entry-id" id="index-file_002c-font-description"></a>
+<a class="index-entry-id" id="index-font-metrics"></a>
+<a class="index-entry-id" id="index-metrics_002c-font"></a>
+<a class="index-entry-id" id="index-mounting-position"></a>
+<a class="index-entry-id" id="index-mounting-position-1"></a>
+<a class="index-entry-id" id="index-position_002c-mounting"></a>
+<p>Like <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>, GNU <code class="code">troff</code> does not itself load
+or manipulate a digital font file;<a class="footnote" id="DOCF74" href="groff.html_fot.html#FOOT74"><sup>74</sup></a> instead it
+works with a <em class="dfn">font description file</em> that characterizes it,
+including its glyph repertoire and the <em class="dfn">metrics</em> (dimensions) of
+each glyph.<a class="footnote" id="DOCF75" href="groff.html_fot.html#FOOT75"><sup>75</sup></a> This
+information permits the formatter to accurately place glyphs with
+respect to each other. Before using a font description, the formatter
+associates it with a <em class="dfn">mounting position</em>, a place in an ordered list
+of available typefaces.
+<a class="index-entry-id" id="index-abstract-font-style"></a>
+<a class="index-entry-id" id="index-font-style_002c-abstract"></a>
+<a class="index-entry-id" id="index-style_002c-font_002c-abstract"></a>
+So that a document need not be strongly coupled to a specific font
+family, in GNU <code class="code">troff</code> an output device can associate a style in
+the abstract sense with a mounting position. Thus the default family
+can be combined with a style dynamically, producing a <em class="dfn">resolved font
+name</em>.
+</p>
+<p>Fonts often have trademarked names, and even Free Software fonts can
+require renaming upon modification. <code class="code">groff</code> maintains a
+convention that a device&rsquo;s serif font family is given the name &lsquo;<samp class="samp">T</samp>&rsquo;
+(&ldquo;Times&rdquo;), its sans-serif family &lsquo;<samp class="samp">H</samp>&rsquo; (&ldquo;Helvetica&rdquo;), and its
+monospaced family &lsquo;<samp class="samp">C</samp>&rsquo; (&ldquo;Courier&rdquo;). Historical inertia has driven
+<code class="code">groff</code>&rsquo;s font identifiers to short uppercase abbreviations of font
+names, as with &lsquo;<samp class="samp">TR</samp>&rsquo;, &lsquo;<samp class="samp">TI</samp>&rsquo;, &lsquo;<samp class="samp">TB</samp>&rsquo;, &lsquo;<samp class="samp">TBI</samp>&rsquo;, and a
+special font &lsquo;<samp class="samp">S</samp>&rsquo;.
+</p>
+<p>The default family used with abstract styles can be changed at any time;
+initially, it is &lsquo;<samp class="samp">T</samp>&rsquo;. Typically, abstract styles are arranged in
+the first four mounting positions in the order shown above. The default
+mounting position, and therefore style, is always &lsquo;<samp class="samp">1</samp>&rsquo; (&lsquo;<samp class="samp">R</samp>&rsquo;).
+By issuing appropriate formatter instructions, you can override these
+defaults before your document writes its first glyph.
+</p>
+<a class="index-entry-id" id="index-graphic-renditions"></a>
+<a class="index-entry-id" id="index-renditions_002c-graphic"></a>
+<a class="index-entry-id" id="index-character-cell-attributes"></a>
+<a class="index-entry-id" id="index-attributes_002c-character-cell"></a>
+<a class="index-entry-id" id="index-cell_002c-character_002c-attributes"></a>
+<p>Terminal output devices cannot change font families and lack special
+fonts. They support style changes by overstriking, or by altering
+ISO&nbsp;6429/ECMA-48 <em class="dfn">graphic renditions</em> (character cell
+attributes).
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="Selecting-Fonts.html" accesskey="1">Selecting Fonts</a></li>
+<li><a href="Font-Families.html" accesskey="2">Font Families</a></li>
+<li><a href="Font-Positions.html" accesskey="3">Font Positions</a></li>
+<li><a href="Using-Symbols.html" accesskey="4">Using Symbols</a></li>
+<li><a href="Character-Classes.html" accesskey="5">Character Classes</a></li>
+<li><a href="Special-Fonts.html" accesskey="6">Special Fonts</a></li>
+<li><a href="Artificial-Fonts.html" accesskey="7">Artificial Fonts</a></li>
+<li><a href="Ligatures-and-Kerning.html" accesskey="8">Ligatures and Kerning</a></li>
+<li><a href="Italic-Corrections.html" accesskey="9">Italic Corrections</a></li>
+<li><a href="Dummy-Characters.html">Dummy Characters</a></li>
+</ul>
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Manipulating-Type-Size-and-Vertical-Spacing.html">Manipulating Type Size and Vertical Spacing</a>, Previous: <a href="Page-Control.html">Page Control</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Using-Fractional-Type-Sizes.html b/doc/groff.html.node/Using-Fractional-Type-Sizes.html
new file mode 100644
index 0000000..7445fc5
--- /dev/null
+++ b/doc/groff.html.node/Using-Fractional-Type-Sizes.html
@@ -0,0 +1,172 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Using Fractional Type Sizes (The GNU Troff Manual)</title>
+
+<meta name="description" content="Using Fractional Type Sizes (The GNU Troff Manual)">
+<meta name="keywords" content="Using Fractional Type Sizes (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Manipulating-Type-Size-and-Vertical-Spacing.html" rel="up" title="Manipulating Type Size and Vertical Spacing">
+<link href="Changing-the-Type-Size.html" rel="prev" title="Changing the Type Size">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Using-Fractional-Type-Sizes">
+<div class="nav-panel">
+<p>
+Previous: <a href="Changing-the-Type-Size.html" accesskey="p" rel="prev">Changing the Type Size</a>, Up: <a href="Manipulating-Type-Size-and-Vertical-Spacing.html" accesskey="u" rel="up">Manipulating Type Size and Vertical Spacing</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Using-Fractional-Type-Sizes-1">5.20.3 Using Fractional Type Sizes</h4>
+<a class="index-entry-id" id="index-fractional-type-sizes"></a>
+<a class="index-entry-id" id="index-fractional-point-sizes"></a>
+<a class="index-entry-id" id="index-type-sizes_002c-fractional"></a>
+<a class="index-entry-id" id="index-point-sizes_002c-fractional"></a>
+<a class="index-entry-id" id="index-sizes_002c-fractional-type"></a>
+
+<p>AT&amp;T <code class="code">troff</code> interpreted all type size measurements in points.
+Combined with integer arithmetic, this design choice made it impossible
+to support, for instance, ten and a half-point type. In GNU
+<code class="code">troff</code>, an output device can select a scaling factor that
+subdivides a point into &ldquo;scaled points&rdquo;. A type size expressed in
+scaled points can thus represent a non-integral type size.
+</p>
+<a class="index-entry-id" id="index-s-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-s"></a>
+<a class="index-entry-id" id="index-scaling-unit-s"></a>
+<a class="index-entry-id" id="index-z-scaling-unit"></a>
+<a class="index-entry-id" id="index-unit_002c-scaling_002c-z"></a>
+<a class="index-entry-id" id="index-scaling-unit-z"></a>
+<a class="index-entry-id" id="index-ps-request_002c-with-fractional-type-sizes"></a>
+<a class="index-entry-id" id="index-cs-request_002c-with-fractional-type-sizes"></a>
+<a class="index-entry-id" id="index-tkf-request_002c-with-fractional-type-sizes"></a>
+<a class="index-entry-id" id="index-_005cH_002c-with-fractional-type-sizes"></a>
+<a class="index-entry-id" id="index-_005cs_002c-with-fractional-type-sizes"></a>
+<p>A <em class="dfn">scaled point</em> is equal to <em class="math">1/<var class="var">sizescale</var></em> points, where
+<var class="var">sizescale</var> is specified in the device description file <samp class="file">DESC</samp>,
+and defaults to&nbsp;1.<a class="footnote" id="DOCF85" href="groff.html_fot.html#FOOT85"><sup>85</sup></a> Requests and escape sequences in GNU <code class="code">troff</code> interpret
+arguments that represent a type size in scaled points, which the
+formatter multiplies by <var class="var">sizescale</var> and converts to an integer.
+Arguments treated in this way comprise those to the escape sequences
+<code class="code">\H</code> and <code class="code">\s</code>, to the request <code class="code">ps</code>, the third argument to
+the <code class="code">cs</code> request, and the second and fourth arguments to the
+<code class="code">tkf</code> request. Scaled points may be specified explicitly with the
+<code class="code">z</code> scaling unit.
+</p>
+<p>For example, if <var class="var">sizescale</var> is&nbsp;1000, then a scaled point is one
+thousandth of a point. The request &lsquo;<samp class="samp">.ps 10.5</samp>&rsquo; is synonymous with
+&lsquo;<samp class="samp">.ps 10.5z</samp>&rsquo; and sets the type size to 10,500&nbsp;scaled points, or
+10.5&nbsp;points. Consequently, in GNU <code class="code">troff</code>, the register
+<code class="code">.s</code> can interpolate a non-integral type size.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002eps_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.ps]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002eps_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002eps-3"></a>
+<p>This read-only register interpolates the type size in scaled points; it
+is associated with the environment (see <a class="pxref" href="Environments.html">Environments</a>).
+</p></dd></dl>
+
+<p>It makes no sense to use the &lsquo;<samp class="samp">z</samp>&rsquo; scaling unit in a numeric
+expression whose default scaling unit is neither &lsquo;<samp class="samp">u</samp>&rsquo; nor &lsquo;<samp class="samp">z</samp>&rsquo;,
+so GNU <code class="code">troff</code> disallows this. Similarly, it is nonsensical to use
+a scaling unit other than &lsquo;<samp class="samp">z</samp>&rsquo; or &lsquo;<samp class="samp">u</samp>&rsquo; in a numeric expression
+whose default scaling unit is &lsquo;<samp class="samp">z</samp>&rsquo;, and so GNU <code class="code">troff</code>
+disallows this as well.
+</p>
+<p>Another GNU <code class="code">troff</code> scaling unit, &lsquo;<samp class="samp">s</samp>&rsquo;, multiplies by the
+number of basic units in a scaled point. Thus, &lsquo;<samp class="samp">\n[.ps]s</samp>&rsquo; is equal
+to &lsquo;<samp class="samp">1m</samp>&rsquo; by definition. Do not confuse the &lsquo;<samp class="samp">s</samp>&rsquo; and &lsquo;<samp class="samp">z</samp>&rsquo;
+scaling units.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005b_002epsr_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.psr]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002epsr_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002epsr"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002esr_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.sr]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002esr_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002esr"></a>
+<a class="index-entry-id" id="index-last_002drequested-type-size-registers-_0028_002epsr_002c-_002esr_0029"></a>
+<a class="index-entry-id" id="index-type-size-registers_002c-last_002drequested-_0028_002epsr_002c-_002esr_0029"></a>
+<a class="index-entry-id" id="index-last_002drequested-point-size-registers-_0028_002epsr_002c-_002esr_0029"></a>
+<a class="index-entry-id" id="index-point-size-registers_002c-last_002drequested-_0028_002epsr_002c-_002esr_0029"></a>
+<a class="index-entry-id" id="index-_002eps-register_002c-in-comparison-with-_002epsr"></a>
+<a class="index-entry-id" id="index-_002es-register_002c-in-comparison-with-_002esr"></a>
+<p>Output devices may be limited in the type sizes they can employ. The
+<code class="code">.s</code> and <code class="code">.ps</code> registers represent the type size selected by
+the output driver as it understands a device&rsquo;s capability. The last
+<em class="emph">requested</em> type size is interpolated in scaled points by the
+read-only register <code class="code">.psr</code> and in points as a decimal fraction by
+the read-only string-valued register <code class="code">.sr</code>. Both are associated
+with the environment (see <a class="pxref" href="Environments.html">Environments</a>).
+</p>
+<p>For example, if a type size of 10.95 points is requested, and the
+nearest size permitted by a <code class="code">sizes</code> request (or by the <code class="code">sizes</code>
+or <code class="code">sizescale</code> directives in the device&rsquo;s <samp class="file">DESC</samp> file) is 11
+points, the output driver uses the latter value.
+</p></dd></dl>
+
+<p>The <code class="code">\s</code> escape sequence offers the following syntax forms that
+work with fractional type sizes and accept scaling units. You may of
+course give them integral arguments. The delimited forms need not use
+the neutral apostrophe; see <a class="ref" href="Delimiters.html">Delimiters</a>.
+</p>
+<dl class="table">
+<dt><code class="code">\s[<var class="var">n</var>]</code></dt>
+<dt><code class="code">\s'<var class="var">n</var>'</code></dt>
+<dd><p>Set the type size to <var class="var">n</var>&nbsp;scaled points; <var class="var">n</var>&nbsp;is a
+numeric expression with a default scaling unit of &lsquo;<samp class="samp">z</samp>&rsquo;.
+</p>
+</dd>
+<dt><code class="code">\s[+<var class="var">n</var>]</code></dt>
+<dt><code class="code">\s[-<var class="var">n</var>]</code></dt>
+<dt><code class="code">\s+[<var class="var">n</var>]</code></dt>
+<dt><code class="code">\s-[<var class="var">n</var>]</code></dt>
+<dt><code class="code">\s'+<var class="var">n</var>'</code></dt>
+<dt><code class="code">\s'-<var class="var">n</var>'</code></dt>
+<dt><code class="code">\s+'<var class="var">n</var>'</code></dt>
+<dt><code class="code">\s-'<var class="var">n</var>'</code></dt>
+<dd><p>Increase or decrease the type size by <var class="var">n</var>&nbsp;scaled points;
+<var class="var">n</var>&nbsp;is a numeric expression (which may start with a minus sign)
+with a default scaling unit of &lsquo;<samp class="samp">z</samp>&rsquo;.
+</p></dd>
+</dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Previous: <a href="Changing-the-Type-Size.html">Changing the Type Size</a>, Up: <a href="Manipulating-Type-Size-and-Vertical-Spacing.html">Manipulating Type Size and Vertical Spacing</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Using-Symbols.html b/doc/groff.html.node/Using-Symbols.html
new file mode 100644
index 0000000..af4a7cf
--- /dev/null
+++ b/doc/groff.html.node/Using-Symbols.html
@@ -0,0 +1,632 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Using Symbols (The GNU Troff Manual)</title>
+
+<meta name="description" content="Using Symbols (The GNU Troff Manual)">
+<meta name="keywords" content="Using Symbols (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Using-Fonts.html" rel="up" title="Using Fonts">
+<link href="Character-Classes.html" rel="next" title="Character Classes">
+<link href="Font-Positions.html" rel="prev" title="Font Positions">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.display {margin-left: 3.2em}
+div.example {margin-left: 3.2em}
+pre.display-preformatted {font-family: inherit}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+ul.mark-bullet {list-style-type: disc}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Using-Symbols">
+<div class="nav-panel">
+<p>
+Next: <a href="Character-Classes.html" accesskey="n" rel="next">Character Classes</a>, Previous: <a href="Font-Positions.html" accesskey="p" rel="prev">Font Positions</a>, Up: <a href="Using-Fonts.html" accesskey="u" rel="up">Using Fonts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Using-Symbols-1">5.19.4 Using Symbols</h4>
+<a class="index-entry-id" id="index-using-symbols"></a>
+<a class="index-entry-id" id="index-symbols_002c-using"></a>
+
+<a class="index-entry-id" id="index-glyph"></a>
+<a class="index-entry-id" id="index-character"></a>
+<a class="index-entry-id" id="index-glyph_002c-distinguished-from-character"></a>
+<a class="index-entry-id" id="index-character_002c-distinguished-from-glyph"></a>
+<a class="index-entry-id" id="index-ligature"></a>
+<p>A <em class="dfn">glyph</em> is a graphical representation of a <em class="dfn">character</em>. While
+a character is an abstraction of semantic information, a glyph is
+something that can be seen on screen or paper. A character has many
+possible representation forms (for example, the character &lsquo;A&rsquo; can be
+written in an upright or slanted typeface, producing distinct
+glyphs). Sometimes, a sequence of characters map to a single glyph:
+this is a <em class="dfn">ligature</em>&mdash;the most common is &lsquo;fi&rsquo;.
+</p>
+<p>Space characters never become glyphs in GNU <code class="code">troff</code>. If not
+discarded (as when trailing on text lines), they are represented by
+horizontal motions in the output.
+</p>
+<a class="index-entry-id" id="index-symbol"></a>
+<a class="index-entry-id" id="index-special-fonts"></a>
+<a class="index-entry-id" id="index-fonts"></a>
+<a class="index-entry-id" id="index-DESC-2"></a>
+<a class="index-entry-id" id="index-special-request_002c-and-glyph-search-order"></a>
+<a class="index-entry-id" id="index-fspecial-request_002c-and-glyph-search-order"></a>
+<p>A <em class="dfn">symbol</em> is simply a named glyph. Within <code class="code">gtroff</code>, all glyph
+names of a particular font are defined in its font file. If the user
+requests a glyph not available in this font, <code class="code">gtroff</code> looks up an
+ordered list of <em class="dfn">special fonts</em>. By default, the PostScript output
+device supports the two special fonts &lsquo;<samp class="samp">SS</samp>&rsquo; (slanted symbols) and
+&lsquo;<samp class="samp">S</samp>&rsquo; (symbols) (the former is looked up before the latter). Other
+output devices use different names for special fonts. Fonts mounted
+with the <code class="code">fonts</code> keyword in the <samp class="file">DESC</samp> file are globally
+available. To install additional special fonts locally (i.e., for a
+particular font), use the <code class="code">fspecial</code> request.
+</p>
+<p>Here are the exact rules how <code class="code">gtroff</code> searches a given symbol:
+</p>
+<ul class="itemize mark-bullet">
+<li>If the symbol has been defined with the <code class="code">char</code> request, use it.
+This hides a symbol with the same name in the current font.
+
+</li><li>Check the current font.
+
+</li><li>If the symbol has been defined with the <code class="code">fchar</code> request, use it.
+
+</li><li>Check whether the current font has a font-specific list of special
+fonts; test all fonts in the order of appearance in the last
+<code class="code">fspecial</code> call if appropriate.
+
+</li><li>If the symbol has been defined with the <code class="code">fschar</code> request for the
+current font, use it.
+
+</li><li>Check all fonts in the order of appearance in the last <code class="code">special</code>
+call.
+
+</li><li>If the symbol has been defined with the <code class="code">schar</code> request, use it.
+
+</li><li>As a last resort, consult all fonts loaded up to now for special fonts
+and check them, starting with the lowest font number. This can
+sometimes lead to surprising results since the <code class="code">fonts</code> line in
+the <samp class="file">DESC</samp> file often contains empty positions, which are filled
+later on. For example, consider the following:
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">fonts 3 0 0 FOO
+</pre></div></div>
+
+<p>This mounts font <code class="code">foo</code> at font position&nbsp;3. We assume that
+<code class="code">FOO</code> is a special font, containing glyph <code class="code">foo</code>, and that no
+font has been loaded yet. The line
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.fspecial BAR BAZ
+</pre></div></div>
+
+<p>makes font <code class="code">BAZ</code> special only if font <code class="code">BAR</code> is active. We
+further assume that <code class="code">BAZ</code> is really a special font, i.e., the font
+description file contains the <code class="code">special</code> keyword, and that it also
+contains glyph <code class="code">foo</code> with a special shape fitting to font
+<code class="code">BAR</code>. After executing <code class="code">fspecial</code>, font <code class="code">BAR</code> is loaded
+at font position&nbsp;1, and <code class="code">BAZ</code> at position&nbsp;2.
+</p>
+<p>We now switch to a new font <code class="code">XXX</code>, trying to access glyph
+<code class="code">foo</code> that is assumed to be missing. There are neither
+font-specific special fonts for <code class="code">XXX</code> nor any other fonts made
+special with the <code class="code">special</code> request, so <code class="code">gtroff</code> starts the
+search for special fonts in the list of already mounted fonts, with
+increasing font positions. Consequently, it finds <code class="code">BAZ</code> before
+<code class="code">FOO</code> even for <code class="code">XXX</code>, which is not the intended behaviour.
+</p></li></ul>
+
+<p>See <a class="xref" href="Device-and-Font-Description-Files.html">Device and Font Description Files</a>, and <a class="ref" href="Special-Fonts.html">Special Fonts</a>, for
+more details.
+</p>
+<a class="index-entry-id" id="index-list-of-special-characters-_0028groff_005fchar_00287_0029-man-page_0029"></a>
+<a class="index-entry-id" id="index-special-characters_002c-list-of-_0028groff_005fchar_00287_0029-man-page_0029"></a>
+<a class="index-entry-id" id="index-characters_002c-special_002c-list-of-_0028groff_005fchar_00287_0029-man-page_0029"></a>
+<a class="index-entry-id" id="index-available-glyphs_002c-list-of-_0028groff_005fchar_00287_0029-man-page_0029"></a>
+<a class="index-entry-id" id="index-glyphs_002c-available_002c-list-of-_0028groff_005fchar_00287_0029-man-page_0029"></a>
+<p>The <cite class="cite">groff_char<span class="r">(7)</span></cite> man page houses a complete list of
+predefined special character names, but the availability of any as a
+glyph is device- and font-dependent. For example, say
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">man -Tdvi groff_char &gt; groff_char.dvi
+</pre></div></div>
+
+<p>to obtain those available with the DVI device and default font
+configuration.<a class="footnote" id="DOCF77" href="groff.html_fot.html#FOOT77"><sup>77</sup></a> If you want to use an additional macro package to change
+the fonts used, <code class="code">groff</code> (or <code class="code">gtroff</code>) must be run directly.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">groff -Tdvi -mec -man groff_char.7 &gt; groff_char.dvi
+</pre></div></div>
+
+<a class="index-entry-id" id="index-composite-glyph-names"></a>
+<a class="index-entry-id" id="index-glyph-names_002c-composite"></a>
+<a class="index-entry-id" id="index-groff-glyph-list-_0028GGL_0029"></a>
+<a class="index-entry-id" id="index-GGL-_0028groff-glyph-list_0029"></a>
+<a class="index-entry-id" id="index-Adobe-Glyph-List-_0028AGL_0029"></a>
+<p>Special character names not listed in <cite class="cite">groff_char<span class="r">(7)</span></cite> are
+derived algorithmically, using a simplified version of the Adobe Glyph
+List (AGL) algorithm, which is described in
+<a class="uref" href="https://github.com/adobe-type-tools/agl-aglfn">https://github.com/adobe-type-tools/agl-aglfn</a>. The (frozen)
+set of names that can&rsquo;t be derived algorithmically is called the
+<em class="dfn"><code class="code">groff</code> glyph list (GGL)</em>.
+</p>
+<ul class="itemize mark-bullet">
+<li>A glyph for Unicode character U+<var class="var">XXXX</var>[<var class="var">X</var>[<var class="var">X</var>]], which is
+not a composite character is named
+<code class="code">u<var class="var">XXXX</var><span class="r">[</span><var class="var">X</var><span class="r">[</span><var class="var">X</var><span class="r">]]</span></code>. <var class="var">X</var> must be an
+uppercase hexadecimal digit. Examples: <code class="code">u1234</code>, <code class="code">u008E</code>,
+<code class="code">u12DB8</code>. The largest Unicode value is 0x10FFFF. There must be at
+least four <code class="code">X</code> digits; if necessary, add leading zeroes (after the
+&lsquo;<samp class="samp">u</samp>&rsquo;). No zero padding is allowed for character codes greater than
+0xFFFF. Surrogates (i.e., Unicode values greater than 0xFFFF
+represented with character codes from the surrogate area U+D800-U+DFFF)
+are not allowed either.
+
+</li><li>A glyph representing more than a single input character is named
+
+<div class="display">
+<pre class="display-preformatted">&lsquo;<samp class="samp">u</samp>&rsquo; <var class="var">component1</var> &lsquo;<samp class="samp">_</samp>&rsquo; <var class="var">component2</var> &lsquo;<samp class="samp">_</samp>&rsquo; <var class="var">component3</var> &hellip;
+</pre></div>
+
+<p>Example: <code class="code">u0045_0302_0301</code>.
+</p>
+<p>For simplicity, all Unicode characters that are composites must be
+maximally decomposed to NFD;<a class="footnote" id="DOCF78" href="groff.html_fot.html#FOOT78"><sup>78</sup></a> for example,
+<code class="code">u00CA_0301</code> is not a valid glyph name since U+00CA (<small class="sc">LATIN
+CAPITAL LETTER E WITH CIRCUMFLEX</small>) can be further decomposed into U+0045
+(<small class="sc">LATIN CAPITAL LETTER E</small>) and U+0302 (<small class="sc">COMBINING CIRCUMFLEX
+ACCENT</small>). <code class="code">u0045_0302_0301</code> is thus the glyph name for U+1EBE,
+<small class="sc">LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE</small>.
+</p>
+</li><li>groff maintains a table to decompose all algorithmically derived glyph
+names that are composites itself. For example, <code class="code">u0100</code> (<small class="sc">LATIN
+LETTER A WITH MACRON</small>) is automatically decomposed into
+<code class="code">u0041_0304</code>. Additionally, a glyph name of the GGL is preferred
+to an algorithmically derived glyph name; <code class="code">groff</code> also
+automatically does the mapping. Example: The glyph <code class="code">u0045_0302</code> is
+mapped to <code class="code">^E</code>.
+
+</li><li>glyph names of the GGL can&rsquo;t be used in composite glyph names; for
+example, <code class="code">^E_u0301</code> is invalid.
+</li></ul>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0028nm"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\(</code><span class="r"><i class="slanted">nm</i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0028nm'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c-1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_005bname_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\[</code><span class="r"><i class="slanted">name</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005c_005bname_005d'> &para;</a></span></dt>
+<dt class="deffnx def-cmd-deffn" id="index-_005c_005bbase_002dglyph-combining_002dcomponent-_2026_005d"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\[</code><span class="r"><i class="slanted">base-glyph combining-component &hellip;</i></span><code class="t">]</code></strong><a class="copiable-link" href='#index-_005c_005bbase_002dglyph-combining_002dcomponent-_2026_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0028"></a>
+<a class="index-entry-id" id="index-_005c_005b"></a>
+<p>Typeset a special character <var class="var">name</var> (two-character name <var class="var">nm</var>) or
+a composite glyph consisting of <var class="var">base-glyph</var> overlaid with one or
+more <var class="var">combining-component</var>s. For example, &lsquo;<samp class="samp">\[A ho]</samp>&rsquo; is a
+capital letter &ldquo;A&rdquo; with a &ldquo;hook accent&rdquo; (ogonek).
+</p>
+<p>There is no special syntax for one-character names&mdash;the analogous form
+&lsquo;<samp class="samp">\<var class="var">n</var></samp>&rsquo; would collide with other escape sequences. However, the
+four escape sequences <code class="code">\'</code>, <code class="code">\-</code>, <code class="code">\_</code>, and <code class="code">\`</code>,
+are translated on input to the special character escape sequences
+<code class="code">\[aa]</code>, <code class="code">\[-]</code>, <code class="code">\[ul]</code>, and <code class="code">\[ga]</code>, respectively.
+</p>
+<p>A special character name of length one is not the same thing as an
+ordinary character: that is, the character <code class="code">a</code> is not the same as
+<code class="code">\[a]</code>.
+</p>
+<p>If <var class="var">name</var> is undefined, a warning in category &lsquo;<samp class="samp">char</samp>&rsquo; is
+produced and the escape is ignored. See <a class="xref" href="Warnings.html">Warnings</a>, for information
+about the enablement and suppression of warnings.
+</p>
+<p>GNU <code class="code">troff</code> resolves <code class="code">\[<span class="r">&hellip;</span>]</code> with more than a single
+component as follows:
+</p>
+<ul class="itemize mark-bullet">
+<li>Any component that is found in the GGL is converted to the
+<code class="code">u<var class="var">XXXX</var></code> form.
+
+</li><li>Any component <code class="code">u<var class="var">XXXX</var></code> that is found in the list of
+decomposable glyphs is decomposed.
+
+</li><li>The resulting elements are then concatenated with &lsquo;<samp class="samp">_</samp>&rsquo; in between,
+dropping the leading &lsquo;<samp class="samp">u</samp>&rsquo; in all elements but the first.
+</li></ul>
+
+<p>No check for the existence of any component (similar to <code class="code">tr</code>
+request) is done.
+</p>
+<p>Examples:
+</p>
+<dl class="table">
+<dt><code class="code">\[A ho]</code></dt>
+<dd><p>&lsquo;<samp class="samp">A</samp>&rsquo; maps to <code class="code">u0041</code>, &lsquo;<samp class="samp">ho</samp>&rsquo; maps to <code class="code">u02DB</code>, thus the
+final glyph name would be <code class="code">u0041_02DB</code>. This is not the expected
+result: the ogonek glyph &lsquo;<samp class="samp">ho</samp>&rsquo; is a spacing ogonek, but for a
+proper composite a non-spacing ogonek (U+0328) is necessary. Looking
+into the file <samp class="file">composite.tmac</samp>, one can find &lsquo;<samp class="samp">.composite&nbsp;ho&nbsp;u0328</samp>&rsquo;<!-- /@w -->, which changes the mapping of &lsquo;<samp class="samp">ho</samp>&rsquo; while a composite glyph
+name is constructed, causing the final glyph name to be
+<code class="code">u0041_0328</code>.
+</p>
+</dd>
+<dt><code class="code">\[^E u0301]</code></dt>
+<dt><code class="code">\[^E aa]</code></dt>
+<dt><code class="code">\[E a^ aa]</code></dt>
+<dt><code class="code">\[E ^ <code class="code">'</code>]</code></dt>
+<dd><p>&lsquo;<samp class="samp">^E</samp>&rsquo; maps to <code class="code">u0045_0302</code>, thus the final glyph name is
+<code class="code">u0045_0302_0301</code> in all forms (assuming proper calls of the
+<code class="code">composite</code> request).
+</p></dd>
+</dl>
+
+<p>It is not possible to define glyphs with names like &lsquo;<samp class="samp">A&nbsp;ho</samp>&rsquo;<!-- /@w -->
+within a <code class="code">groff</code> font file. This is not really a limitation;
+instead, you have to define <code class="code">u0041_0328</code>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cC_0027xxx_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\C<code class="code">'</code></code><span class="r"><i class="slanted">xxx</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cC_0027xxx_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cC"></a>
+<a class="index-entry-id" id="index-named-character-_0028_005cC_0029"></a>
+<a class="index-entry-id" id="index-character_002c-named-_0028_005cC_0029"></a>
+<p>Typeset the glyph of the special character <var class="var">xxx</var>. Normally, it is
+more convenient to use <code class="code">\[<var class="var">xxx</var>]</code>, but <code class="code">\C</code> has some
+advantages: it is compatible with <abbr class="acronym">AT&amp;T</abbr> device-independent
+<code class="code">troff</code> (and therefore available in compatibility
+mode<a class="footnote" id="DOCF79" href="groff.html_fot.html#FOOT79"><sup>79</sup></a>) and can interpolate special
+characters with &lsquo;<samp class="samp">]</samp>&rsquo; in their names. The delimiter need not be
+a neutral apostrophe; see <a class="ref" href="Delimiters.html">Delimiters</a>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ecomposite"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.composite</code></strong> <var class="def-var-arguments">id1 id2</var><a class="copiable-link" href='#index-_002ecomposite'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-composite"></a>
+<a class="index-entry-id" id="index-composite_002etmac"></a>
+<p>Map special character name <var class="var">id1</var> to <var class="var">id2</var> if <var class="var">id1</var> is used
+in <code class="code">\[...]</code> with more than one component. See above for examples.
+This is a strict rewriting of the special character name; no check is
+performed for the existence of a glyph for either. A set of default
+mappings for many accents can be found in the file
+<samp class="file">composite.tmac</samp>, loaded by the default <samp class="file">troffrc</samp> at startup.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cN_0027n_0027"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\N<code class="code">'</code></code><span class="r"><i class="slanted">n</i></span><code class="t"><code class="code">'</code></code></strong><a class="copiable-link" href='#index-_005cN_0027n_0027'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005cN"></a>
+<a class="index-entry-id" id="index-numbered-glyph-_0028_005cN_0029-1"></a>
+<a class="index-entry-id" id="index-glyph_002c-numbered-_0028_005cN_0029-1"></a>
+<a class="index-entry-id" id="index-char-request_002c-used-with-_005cN"></a>
+<a class="index-entry-id" id="index-Unicode-1"></a>
+<p>Typeset the glyph with code&nbsp;<var class="var">n</var> in the current font
+(<code class="code">n</code>&nbsp;is <em class="emph">not</em> the input character code). The number
+<var class="var">n</var>&nbsp;can be any non-negative decimal integer. Most devices only
+have glyphs with codes between 0 and&nbsp;255; the Unicode output device
+uses codes in the range 0&ndash;65535. If the current font does not contain
+a glyph with that code, special fonts are <em class="emph">not</em> searched. The
+<code class="code">\N</code> escape sequence can be conveniently used in conjunction with
+the <code class="code">char</code> request:
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.char \[phone] \f[ZD]\N'37'
+</pre></div></div>
+
+<a class="index-entry-id" id="index-DESC-3"></a>
+<a class="index-entry-id" id="index-unnamed-glyphs"></a>
+<a class="index-entry-id" id="index-glyphs_002c-unnamed"></a>
+<p>The code of each glyph is given in the fourth column in the font
+description file after the <code class="code">charset</code> command. It is possible to
+include unnamed glyphs in the font description file by using a name of
+&lsquo;<samp class="samp">---</samp>&rsquo;; the <code class="code">\N</code> escape sequence is the only way to use these.
+</p>
+<p>No kerning is applied to glyphs accessed with <code class="code">\N</code>. The delimiter
+need not be a neutral apostrophe; see <a class="ref" href="Delimiters.html">Delimiters</a>.
+</p></dd></dl>
+
+<p>A few escape sequences are also special characters.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0027-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\<code class="code">'</code></code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0027-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0027"></a>
+<p>An escaped neutral apostrophe is a synonym for <code class="code">\[aa]</code> (acute
+accent).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_0060-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\<code class="code">`</code></code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_0060-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_0060"></a>
+<p>An escaped grave accent is a synonym for <code class="code">\[ga]</code> (grave accent).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002d-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\-</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_002d-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_002d"></a>
+<p>An escaped hyphen-minus is a synonym for <code class="code">\[-]</code> (minus sign).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_005f-1"><span class="category-def">Escape&nbsp;sequence: </span><span><strong class="def-name"><code class="t">\_</code><span class="r"><i class="slanted"></i></span><code class="t"></code></strong><a class="copiable-link" href='#index-_005c_005f-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005c_005f"></a>
+<p>An escaped underscore (&ldquo;low line&rdquo;) is a synonym for <code class="code">\[ul]</code>
+(underrule). On typesetting devices, the underrule is font-invariant
+and drawn lower than the underscore &lsquo;<samp class="samp">_</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ecflags"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.cflags</code></strong> <var class="def-var-arguments">n c1 c2 &hellip;</var><a class="copiable-link" href='#index-_002ecflags'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-cflags"></a>
+<a class="index-entry-id" id="index-glyph-properties-_0028cflags_0029"></a>
+<a class="index-entry-id" id="index-character-properties-_0028cflags_0029"></a>
+<a class="index-entry-id" id="index-properties-of-glyphs-_0028cflags_0029"></a>
+<a class="index-entry-id" id="index-properties-of-characters-_0028cflags_0029"></a>
+<p>Assign properties encoded by the number <var class="var">n</var> to characters <var class="var">c1</var>,
+<var class="var">c2</var>, and so on.
+</p>
+<p>Input characters, including special characters introduced by an escape,
+have certain properties associated with them.<a class="footnote" id="DOCF80" href="groff.html_fot.html#FOOT80"><sup>80</sup></a>
+These properties can be modified with this request. The first argument
+is the sum of the desired flags and the remaining arguments are the
+characters to be assigned those properties. Spaces between the <var class="var">cn</var>
+arguments are optional. Any argument <var class="var">cn</var> can be a character class
+defined with the <code class="code">class</code> request rather than an individual
+character. See <a class="xref" href="Character-Classes.html">Character Classes</a>.
+</p>
+<p>The non-negative integer <var class="var">n</var> is the sum of any of the following.
+Some combinations are nonsensical, such as &lsquo;<samp class="samp">33</samp>&rsquo; (1 + 32).
+</p>
+<dl class="table">
+<dt id='index-end_002dof_002dsentence-characters-1'><span><code class="code">1</code><a class="copiable-link" href='#index-end_002dof_002dsentence-characters-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-characters_002c-end_002dof_002dsentence"></a>
+<p>Recognize the character as ending a sentence if followed by a newline
+or two spaces. Initially, characters &lsquo;<samp class="samp">.?!</samp>&rsquo; have this property.
+</p>
+</dd>
+<dt id='index-hyphenating-characters'><span><code class="code">2</code><a class="copiable-link" href='#index-hyphenating-characters'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-characters_002c-hyphenation"></a>
+<p>Enable breaks before the character. A line is not broken at a character
+with this property unless the characters on each side both have non-zero
+hyphenation codes. This exception can be overridden by adding 64.
+Initially, no characters have this property.
+</p>
+</dd>
+<dt id='index-_005c_002d-glyph_002c-and-cflags'><span><code class="code">4</code><a class="copiable-link" href='#index-_005c_002d-glyph_002c-and-cflags'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-hy-glyph_002c-and-cflags"></a>
+<a class="index-entry-id" id="index-em-glyph_002c-and-cflags"></a>
+<p>Enable breaks after the character. A line is not broken at a character
+with this property unless the characters on each side both have non-zero
+hyphenation codes. This exception can be overridden by adding 64.
+Initially, characters &lsquo;<samp class="samp">\-\[hy]\[em]</samp>&rsquo; have this property.
+</p>
+</dd>
+<dt id='index-overlapping-characters'><span><code class="code">8</code><a class="copiable-link" href='#index-overlapping-characters'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-characters_002c-overlapping"></a>
+<a class="index-entry-id" id="index-ul-glyph_002c-and-cflags"></a>
+<a class="index-entry-id" id="index-rn-glyph_002c-and-cflags"></a>
+<a class="index-entry-id" id="index-ru-glyph_002c-and-cflags"></a>
+<a class="index-entry-id" id="index-radicalex-glyph_002c-and-cflags"></a>
+<a class="index-entry-id" id="index-sqrtex-glyph_002c-and-cflags"></a>
+<p>Mark the glyph associated with this character as overlapping other
+instances of itself horizontally. Initially, characters
+&lsquo;<samp class="samp">\[ul]\[rn]\[ru]\[radicalex]\[sqrtex]</samp>&rsquo; have this property.
+</p>
+</dd>
+<dt id='index-br-glyph_002c-and-cflags'><span><code class="code">16</code><a class="copiable-link" href='#index-br-glyph_002c-and-cflags'> &para;</a></span></dt>
+<dd><p>Mark the glyph associated with this character as overlapping other
+instances of itself vertically. Initially, the character &lsquo;<samp class="samp">\[br]</samp>&rsquo;
+has this property.
+</p>
+</dd>
+<dt id='index-transparent-characters'><span><code class="code">32</code><a class="copiable-link" href='#index-transparent-characters'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-character_002c-transparent"></a>
+<a class="index-entry-id" id="index-_0022_002c-at-end-of-sentence-1"></a>
+<a class="index-entry-id" id="index-_0027_002c-at-end-of-sentence-1"></a>
+<a class="index-entry-id" id="index-_0029_002c-at-end-of-sentence-1"></a>
+<a class="index-entry-id" id="index-_005d_002c-at-end-of-sentence-1"></a>
+<a class="index-entry-id" id="index-_002a_002c-at-end-of-sentence-1"></a>
+<a class="index-entry-id" id="index-dg-glyph_002c-at-end-of-sentence-1"></a>
+<a class="index-entry-id" id="index-dd-glyph_002c-at-end-of-sentence-1"></a>
+<a class="index-entry-id" id="index-rq-glyph_002c-at-end-of-sentence-1"></a>
+<a class="index-entry-id" id="index-cq-glyph_002c-at-end-of-sentence-1"></a>
+<p>Mark the character as transparent for the purpose of end-of-sentence
+recognition. In other words, an end-of-sentence character followed by
+any number of characters with this property is treated as the end of a
+sentence if followed by a newline or two spaces. This is the same as
+having a zero space factor in TeX. Initially, characters
+&lsquo;<samp class="samp">&quot;')]*\[dg]\[dd]\[rq]\[cq]</samp>&rsquo; have this property.
+</p>
+</dd>
+<dt><code class="code">64</code></dt>
+<dd><p>Ignore hyphenation codes of the surrounding characters. Use this in
+combination with values 2 and&nbsp;4 (initially, no characters have this
+property).
+</p>
+<p>For example, if you need an automatic break point after the en-dash in
+numeric ranges like &ldquo;3000&ndash;5000&rdquo;, insert
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.cflags 68 \[en]
+</pre></div></div>
+
+<p>into your document. However, this practice can lead to bad layout if
+done thoughtlessly; in most situations, a better solution instead of
+changing the <code class="code">cflags</code> value is to insert <code class="code">\:</code> right after the
+hyphen at the places that really need a break point.
+</p></dd>
+</dl>
+
+<p>The remaining values were implemented for East Asian language support;
+those who use alphabetic scripts exclusively can disregard them.
+</p>
+<dl class="table">
+<dt><code class="code">128</code></dt>
+<dd><p>Prohibit a line break before the character, but allow a line break after
+the character. This works only in combination with flags 256 and 512
+and has no effect otherwise. Initially, no characters have this
+property.
+</p>
+</dd>
+<dt><code class="code">256</code></dt>
+<dd><p>Prohibit a line break after the character, but allow a line break before
+the character. This works only in combination with flags 128 and 512
+and has no effect otherwise. Initially, no characters have this
+property.
+</p>
+</dd>
+<dt><code class="code">512</code></dt>
+<dd><p>Allow line break before or after the character. This works only in
+combination with flags 128 and 256 and has no effect otherwise.
+Initially, no characters have this property.
+</p></dd>
+</dl>
+
+<p>In contrast to values 2 and&nbsp;4, the values 128, 256, and 512 work
+pairwise. If, for example, the left character has value 512, and the
+right character 128, no break will be automatically inserted between
+them. If we use value&nbsp;6 instead for the left character, a break
+after the character can&rsquo;t be suppressed since the neighboring character
+on the right doesn&rsquo;t get examined.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002echar"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.char</code></strong> <var class="def-var-arguments">c [<span class="r"><i class="slanted">contents</i></span>]</var><a class="copiable-link" href='#index-_002echar'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-char"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002efchar"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.fchar</code></strong> <var class="def-var-arguments">c [<span class="r"><i class="slanted">contents</i></span>]</var><a class="copiable-link" href='#index-_002efchar'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-fchar"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002efschar"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.fschar</code></strong> <var class="def-var-arguments">f c [<span class="r"><i class="slanted">contents</i></span>]</var><a class="copiable-link" href='#index-_002efschar'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-fschar"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eschar"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.schar</code></strong> <var class="def-var-arguments">c [<span class="r"><i class="slanted">contents</i></span>]</var><a class="copiable-link" href='#index-_002eschar'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-schar"></a>
+<a class="index-entry-id" id="index-defining-character-_0028char_0029"></a>
+<a class="index-entry-id" id="index-defining-fallback-character-_0028fchar_002c-fschar_002c-schar_0029"></a>
+<a class="index-entry-id" id="index-character_002c-defining-_0028char_0029"></a>
+<a class="index-entry-id" id="index-character_002c-defining-fallback-_0028fchar_002c-fschar_002c-schar_0029"></a>
+<a class="index-entry-id" id="index-fallback-character_002c-defining-_0028fchar_002c-fschar_002c-schar_0029"></a>
+<a class="index-entry-id" id="index-creating-new-characters-_0028char_0029"></a>
+<a class="index-entry-id" id="index-defining-symbol-_0028char_0029"></a>
+<a class="index-entry-id" id="index-symbol_002c-defining-_0028char_0029"></a>
+<a class="index-entry-id" id="index-defining-glyph-_0028char_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-defining-_0028char_0029"></a>
+<a class="index-entry-id" id="index-escape-character_002c-while-defining-glyph"></a>
+<a class="index-entry-id" id="index-character_002c-escape_002c-while-defining-glyph"></a>
+<a class="index-entry-id" id="index-tr-request_002c-and-glyph-definitions"></a>
+<a class="index-entry-id" id="index-cp-request_002c-and-glyph-definitions"></a>
+<a class="index-entry-id" id="index-rc-request_002c-and-glyph-definitions"></a>
+<a class="index-entry-id" id="index-lc-request_002c-and-glyph-definitions"></a>
+<a class="index-entry-id" id="index-_005cl_002c-and-glyph-definitions"></a>
+<a class="index-entry-id" id="index-_005cL_002c-and-glyph-definitions"></a>
+<a class="index-entry-id" id="index-_005c_0026_002c-and-glyph-definitions"></a>
+<a class="index-entry-id" id="index-_005ce_002c-and-glyph-definitions"></a>
+<a class="index-entry-id" id="index-hcode-request_002c-and-glyph-definitions"></a>
+<p>Define a new character or glyph&nbsp;<var class="var">c</var> to be <var class="var">contents</var>, which
+can be empty. More precisely, <code class="code">char</code> defines a <code class="code">groff</code> object
+(or redefines an existing one) that is accessed with the
+name&nbsp;<var class="var">c</var> on input, and produces <var class="var">contents</var> on output.
+Every time glyph&nbsp;<var class="var">c</var> needs to be printed, <var class="var">contents</var> is
+processed in a temporary environment and the result is wrapped up into a
+single object. Compatibility mode is turned off and the escape
+character is set to&nbsp;<code class="code">\</code> while <var class="var">contents</var> is processed.
+Any emboldening, constant spacing, or track kerning is applied to this
+object rather than to individual glyphs in <var class="var">contents</var>.
+</p>
+<p>An object defined by these requests can be used just like a normal glyph
+provided by the output device. In particular, other characters can be
+translated to it with the <code class="code">tr</code> or <code class="code">trin</code> requests; it can be
+made the leader character with the <code class="code">lc</code> request; repeated patterns
+can be drawn with it using the <code class="code">\l</code> and <code class="code">\L</code> escape sequences;
+and words containing&nbsp;<var class="var">c</var> can be hyphenated correctly if the
+<code class="code">hcode</code> request is used to give the object a hyphenation code.
+</p>
+<p>There is a special anti-recursion feature: use of the object within its
+own definition is handled like a normal character (not
+defined with <code class="code">char</code>).
+</p>
+<p>The <code class="code">tr</code> and <code class="code">trin</code> requests take precedence if <code class="code">char</code>
+accesses the same symbol.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.tr XY
+X
+ &rArr; Y
+.char X Z
+X
+ &rArr; Y
+.tr XX
+X
+ &rArr; Z
+</pre></div></div>
+
+<p>The <code class="code">fchar</code> request defines a fallback glyph: <code class="code">gtroff</code> only
+checks for glyphs defined with <code class="code">fchar</code> if it cannot find the glyph
+in the current font. <code class="code">gtroff</code> carries out this test before
+checking special fonts.
+</p>
+<p><code class="code">fschar</code> defines a fallback glyph for font&nbsp;<var class="var">f</var>:
+<code class="code">gtroff</code> checks for glyphs defined with <code class="code">fschar</code> after the
+list of fonts declared as font-specific special fonts with the
+<code class="code">fspecial</code> request, but before the list of fonts declared as global
+special fonts with the <code class="code">special</code> request.
+</p>
+<p>Finally, the <code class="code">schar</code> request defines a global fallback glyph:
+<code class="code">gtroff</code> checks for glyphs defined with <code class="code">schar</code> after the list
+of fonts declared as global special fonts with the <code class="code">special</code>
+request, but before the already mounted special fonts.
+</p>
+<p>See <a class="xref" href="Character-Classes.html">Character Classes</a>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002erchar"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.rchar</code></strong> <var class="def-var-arguments">c &hellip;</var><a class="copiable-link" href='#index-_002erchar'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rchar"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002erfschar"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.rfschar</code></strong> <var class="def-var-arguments">f c &hellip;</var><a class="copiable-link" href='#index-_002erfschar'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-rfschar"></a>
+<a class="index-entry-id" id="index-removing-glyph-definition-_0028rchar_002c-rfschar_0029"></a>
+<a class="index-entry-id" id="index-glyph_002c-removing-definition-_0028rchar_002c-rfschar_0029"></a>
+<a class="index-entry-id" id="index-fallback-glyph_002c-removing-definition-_0028rchar_002c-rfschar_0029"></a>
+<p>Remove definition of each ordinary or special character <var class="var">c</var>,
+undoing the effect of a <code class="code">char</code>, <code class="code">fchar</code>, or <code class="code">schar</code>
+request. Those supplied by font description files cannot be removed.
+Spaces and tabs may separate <var class="var">c</var>&nbsp;arguments.
+</p>
+<p>The request <code class="code">rfschar</code> removes glyph definitions defined with
+<code class="code">fschar</code> for font&nbsp;<var class="var">f</var>.
+</p></dd></dl>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Character-Classes.html">Character Classes</a>, Previous: <a href="Font-Positions.html">Font Positions</a>, Up: <a href="Using-Fonts.html">Using Fonts</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Vertical-Position-Traps.html b/doc/groff.html.node/Vertical-Position-Traps.html
new file mode 100644
index 0000000..d12f564
--- /dev/null
+++ b/doc/groff.html.node/Vertical-Position-Traps.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Vertical Position Traps (The GNU Troff Manual)</title>
+
+<meta name="description" content="Vertical Position Traps (The GNU Troff Manual)">
+<meta name="keywords" content="Vertical Position Traps (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Traps.html" rel="up" title="Traps">
+<link href="Page-Location-Traps.html" rel="next" title="Page Location Traps">
+<link href="Traps.html" rel="prev" title="Traps">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Vertical-Position-Traps">
+<div class="nav-panel">
+<p>
+Next: <a href="Page-Location-Traps.html" accesskey="n" rel="next">Page Location Traps</a>, Previous: <a href="Traps.html" accesskey="p" rel="prev">Traps</a>, Up: <a href="Traps.html" accesskey="u" rel="up">Traps</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Vertical-Position-Traps-1">5.28.1 Vertical Position Traps</h4>
+<a class="index-entry-id" id="index-vertical-position-traps"></a>
+<a class="index-entry-id" id="index-traps_002c-vertical-position"></a>
+
+<p>A <em class="dfn">vertical position trap</em> calls a macro when the formatter&rsquo;s
+vertical drawing position reaches or passes, in the downward direction,
+a certain location on the output page or in a diversion. Its
+applications include setting page headers and footers, body text in
+multiple columns, and footnotes.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002evpt"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.vpt</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">flag</i></span>]</var><a class="copiable-link" href='#index-_002evpt'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-vpt"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005cn_005b_002evpt_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[.vpt]</code></strong><a class="copiable-link" href='#index-_005cn_005b_002evpt_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002evpt-1"></a>
+<a class="index-entry-id" id="index-enabling-vertical-position-traps-_0028vpt_0029"></a>
+<a class="index-entry-id" id="index-vertical-position-traps_002c-enabling-_0028vpt_0029"></a>
+<a class="index-entry-id" id="index-vertical-position-trap-enable-register-_0028_002evpt_0029"></a>
+<p>Enable vertical position traps if <var class="var">flag</var> is non-zero or absent;
+disable them otherwise. Vertical position traps are those set by the
+<code class="code">wh</code> request or by <code class="code">dt</code> within a diversion. The parameter
+that controls whether vertical position traps are enabled is global.
+Initially, vertical position traps are enabled. The current value is
+stored in the <code class="code">.vpt</code> read-only register.
+</p>
+<a class="index-entry-id" id="index-page-break_002c-prevented-by-vpt"></a>
+<a class="index-entry-id" id="index-break_002c-page_002c-prevented-by-vpt"></a>
+<a class="index-entry-id" id="index-page-ejection_002c-prevented-by-vpt"></a>
+<a class="index-entry-id" id="index-ejection_002c-page_002c-prevented-by-vpt"></a>
+<p>A page can&rsquo;t be ejected if <code class="code">vpt</code> is set to zero; see <a class="ref" href="The-Implicit-Page-Trap.html">The Implicit Page Trap</a>.
+</p></dd></dl>
+
+
+
+<ul class="mini-toc">
+<li><a href="Page-Location-Traps.html" accesskey="1">Page Location Traps</a></li>
+<li><a href="The-Implicit-Page-Trap.html" accesskey="2">The Implicit Page Trap</a></li>
+<li><a href="Diversion-Traps.html" accesskey="3">Diversion Traps</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Warnings.html b/doc/groff.html.node/Warnings.html
new file mode 100644
index 0000000..b61ec3a
--- /dev/null
+++ b/doc/groff.html.node/Warnings.html
@@ -0,0 +1,246 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Warnings (The GNU Troff Manual)</title>
+
+<meta name="description" content="Warnings (The GNU Troff Manual)">
+<meta name="keywords" content="Warnings (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Debugging.html" rel="up" title="Debugging">
+<link href="Debugging.html" rel="prev" title="Debugging">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span:hover a.copiable-link {visibility: visible}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="Warnings">
+<div class="nav-panel">
+<p>
+Previous: <a href="Debugging.html" accesskey="p" rel="prev">Debugging</a>, Up: <a href="Debugging.html" accesskey="u" rel="up">Debugging</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Warnings-1">5.37.1 Warnings</h4>
+<a class="index-entry-id" id="index-warnings-1"></a>
+
+<p>Warning diagnostics emitted by GNU <code class="code">troff</code> are divided into named,
+numbered categories. The name associated with each warning category is
+used by the <samp class="option">-w</samp> and <samp class="option">-W</samp> options. Each category is also
+assigned a power of two; the sum of enabled category values is used by
+the <code class="code">warn</code> request and the <code class="code">.warn</code> register.
+</p>
+<p>Warnings of each category are produced under the following
+circumstances.
+</p>
+<a class="index-entry-id" id="index-categories_002c-warning"></a>
+<a class="index-entry-id" id="index-warning-categories"></a>
+<dl class="table">
+<dt>&lsquo;<samp class="samp">char</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">1</samp>&rsquo;</dt>
+<dd><p>No mounted font defines a glyph for the requested character. This
+category is enabled by default.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">number</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">2</samp>&rsquo;</dt>
+<dd><p>An invalid numeric expression was encountered. This category is enabled
+by default.
+See <a class="xref" href="Numeric-Expressions.html">Numeric Expressions</a>.
+</p>
+</dd>
+<dt id='index-filling_002c-and-break-warnings'><span>&lsquo;<samp class="samp">break</samp>&rsquo;<a class="copiable-link" href='#index-filling_002c-and-break-warnings'> &para;</a></span></dt>
+<dt>&lsquo;<samp class="samp">4</samp>&rsquo;</dt>
+<dd><a class="index-entry-id" id="index-mode_002c-fill_002c-and-break-warnings"></a>
+<p>A filled output line could not be broken such that its length was less
+than the output line length &lsquo;<samp class="samp">\n[.l]</samp>&rsquo;. This category is enabled by
+default.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">delim</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">8</samp>&rsquo;</dt>
+<dd><p>The closing delimiter in an escape sequence was missing or mismatched.
+</p>
+</dd>
+<dt id='index-ie-request_002c-and-warnings'><span>&lsquo;<samp class="samp">el</samp>&rsquo;<a class="copiable-link" href='#index-ie-request_002c-and-warnings'> &para;</a></span></dt>
+<dt>&lsquo;<samp class="samp">16</samp>&rsquo;</dt>
+<dd><a class="index-entry-id" id="index-el-request_002c-and-warnings"></a>
+<p>The <code class="code">el</code> request was encountered with no prior corresponding
+<code class="code">ie</code> request. See <a class="xref" href="if_002delse.html">if-else</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">scale</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">32</samp>&rsquo;</dt>
+<dd><p>A scaling unit inappropriate to its context was used in a numeric
+expression.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">range</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">64</samp>&rsquo;</dt>
+<dd><p>A numeric expression was out of range for its context.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">syntax</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">128</samp>&rsquo;</dt>
+<dd><p>A self-contradictory hyphenation mode was requested; an empty or
+incomplete numeric expression was encountered; an operand to a numeric
+operator was missing; an attempt was made to define a recursive, empty,
+or nonsensical character class; or a <code class="code">groff</code> extension conditional
+expression operator was used while in compatibility mode.
+</p>
+</dd>
+<dt id='index-di-request_002c-and-warnings'><span>&lsquo;<samp class="samp">di</samp>&rsquo;<a class="copiable-link" href='#index-di-request_002c-and-warnings'> &para;</a></span></dt>
+<dt>&lsquo;<samp class="samp">256</samp>&rsquo;</dt>
+<dd><a class="index-entry-id" id="index-da-request_002c-and-warnings"></a>
+<a class="index-entry-id" id="index-box-request_002c-and-warnings"></a>
+<a class="index-entry-id" id="index-boxa-request_002c-and-warnings"></a>
+<p>A <code class="code">di</code>, <code class="code">da</code>, <code class="code">box</code>, or <code class="code">boxa</code> request was invoked
+without an argument when there was no current diversion.
+</p>
+</dd>
+<dt id='index-de_002c-de1_002c-dei-requests_002c-and-warnings'><span>&lsquo;<samp class="samp">mac</samp>&rsquo;<a class="copiable-link" href='#index-de_002c-de1_002c-dei-requests_002c-and-warnings'> &para;</a></span></dt>
+<dt>&lsquo;<samp class="samp">512</samp>&rsquo;</dt>
+<dd><a class="index-entry-id" id="index-am_002c-am1_002c-ami-requests_002c-and-warnings"></a>
+<a class="index-entry-id" id="index-ds_002c-ds1-requests_002c-and-warnings"></a>
+<a class="index-entry-id" id="index-as_002c-as1-requests_002c-and-warnings"></a>
+<a class="index-entry-id" id="index-di-request_002c-and-warnings-1"></a>
+<a class="index-entry-id" id="index-da-request_002c-and-warnings-1"></a>
+<a class="index-entry-id" id="index-box_002c-boxa-requests_002c-and-warnings"></a>
+<a class="index-entry-id" id="index-_005c_002a_002c-and-warnings"></a>
+<p>An undefined string, macro, or diversion was used. When such an object
+is dereferenced, an empty one of that name is automatically created.
+So, unless it is later deleted, at most one warning is given for each.
+</p>
+<p>This warning is also emitted upon an attempt to move an unplanted trap
+macro (see <a class="pxref" href="Page-Location-Traps.html">Page Location Traps</a>). In such cases, the unplanted macro
+is <em class="emph">not</em> dereferenced, so it is not created if it does not exist.
+</p>
+</dd>
+<dt id='index-nr-request_002c-and-warnings'><span>&lsquo;<samp class="samp">reg</samp>&rsquo;<a class="copiable-link" href='#index-nr-request_002c-and-warnings'> &para;</a></span></dt>
+<dt>&lsquo;<samp class="samp">1024</samp>&rsquo;</dt>
+<dd><a class="index-entry-id" id="index-_005cR_002c-and-warnings"></a>
+<a class="index-entry-id" id="index-_005cn_002c-and-warnings"></a>
+<p>An undefined register was used. When an undefined register is
+dereferenced, it is automatically defined with a value of&nbsp;0. So,
+unless it is later deleted, at most one warning is given for each.
+</p>
+</dd>
+<dt id='index-_005ct_002c-and-warnings'><span>&lsquo;<samp class="samp">tab</samp>&rsquo;<a class="copiable-link" href='#index-_005ct_002c-and-warnings'> &para;</a></span></dt>
+<dt>&lsquo;<samp class="samp">2048</samp>&rsquo;</dt>
+<dd><p>A tab character was encountered where a number was expected, or appeared
+in an unquoted macro argument.
+</p>
+</dd>
+<dt id='index-_005c_007d_002c-and-warnings'><span>&lsquo;<samp class="samp">right-brace</samp>&rsquo;<a class="copiable-link" href='#index-_005c_007d_002c-and-warnings'> &para;</a></span></dt>
+<dt>&lsquo;<samp class="samp">4096</samp>&rsquo;</dt>
+<dd><p>A right brace escape sequence <code class="code">\}</code> was encountered where a number
+was expected.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">missing</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">8192</samp>&rsquo;</dt>
+<dd><p>A request was invoked with a mandatory argument absent.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">input</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">16384</samp>&rsquo;</dt>
+<dd><p>An invalid character occurred on the input stream.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">escape</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">32768</samp>&rsquo;</dt>
+<dd><p>An unsupported escape sequence was encountered.
+</p>
+</dd>
+<dt id='index-compatibility-mode'><span>&lsquo;<samp class="samp">space</samp>&rsquo;<a class="copiable-link" href='#index-compatibility-mode'> &para;</a></span></dt>
+<dt>&lsquo;<samp class="samp">65536</samp>&rsquo;</dt>
+<dd><p>A space was missing between a request or macro and its argument. This
+warning is produced when an undefined name longer than two characters is
+encountered and the first two characters of the name constitute a
+defined name. No request is invoked, no macro called, and an empty
+macro is not defined. This category is enabled by default. It never
+occurs in compatibility mode.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">font</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">131072</samp>&rsquo;</dt>
+<dd><p>A non-existent font was selected, or the selection was ignored because a
+font selection escape sequence was used after the output line
+continuation escape sequence on an input line. This category is enabled
+by default.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">ig</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">262144</samp>&rsquo;</dt>
+<dd><p>An invalid escape sequence occurred in input ignored using the <code class="code">ig</code>
+request. This warning category diagnoses a condition that is an error
+when it occurs in non-ignored input.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">color</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">524288</samp>&rsquo;</dt>
+<dd><p>An undefined color was selected, an attempt was made to define a color
+using an unrecognized color space, an invalid component in a color
+definition was encountered, or an attempt was made to redefine a default
+color.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">file</samp>&rsquo;</dt>
+<dt>&lsquo;<samp class="samp">1048576</samp>&rsquo;</dt>
+<dd><p>An attempt was made to load a file that does not exist. This category
+is enabled by default.
+</p></dd>
+</dl>
+
+<p>Two warning names group other warning categories for convenience.
+</p>
+<dl class="table">
+<dt>&lsquo;<samp class="samp">all</samp>&rsquo;</dt>
+<dd><p>All warning categories except &lsquo;<samp class="samp">di</samp>&rsquo;, &lsquo;<samp class="samp">mac</samp>&rsquo; and &lsquo;<samp class="samp">reg</samp>&rsquo;.
+This shorthand is intended to produce all warnings that are useful with
+macro packages written for <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> and its
+descendants, which have less fastidious diagnostics than GNU
+<code class="code">troff</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp class="samp">w</samp>&rsquo;</dt>
+<dd><p>All warning categories. Authors of documents and macro packages
+targeting <code class="code">groff</code> are encouraged to use this setting.
+</p></dd>
+</dl>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Previous: <a href="Debugging.html">Debugging</a>, Up: <a href="Debugging.html">Debugging</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/What-Is-groff_003f.html b/doc/groff.html.node/What-Is-groff_003f.html
new file mode 100644
index 0000000..99939ea
--- /dev/null
+++ b/doc/groff.html.node/What-Is-groff_003f.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>What Is groff? (The GNU Troff Manual)</title>
+
+<meta name="description" content="What Is groff? (The GNU Troff Manual)">
+<meta name="keywords" content="What Is groff? (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Introduction.html" rel="up" title="Introduction">
+<link href="groff-Capabilities.html" rel="next" title="groff Capabilities">
+<link href="Introduction.html" rel="prev" title="Introduction">
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="What-Is-groff_003f">
+<div class="nav-panel">
+<p>
+Next: <a href="groff-Capabilities.html" accesskey="n" rel="next"><code class="code">groff</code> Capabilities</a>, Previous: <a href="Introduction.html" accesskey="p" rel="prev">Introduction</a>, Up: <a href="Introduction.html" accesskey="u" rel="up">Introduction</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="What-Is-groff_003f-1">1.2 What Is <code class="code">groff</code>?</h3>
+<a class="index-entry-id" id="index-what-is-groff_003f"></a>
+<a class="index-entry-id" id="index-groff_002d_002d_002dwhat-is-it_003f"></a>
+
+<p><code class="code">groff</code> (GNU <code class="code">roff</code>) is a typesetting system that reads plain
+text input files that include formatting commands to produce output in
+PostScript, PDF, HTML, DVI, or other formats, or for display to a
+terminal. Formatting commands can be low-level typesetting primitives,
+macros from a supplied package, or user-defined macros. All three
+approaches can be combined.
+</p>
+<p>A reimplementation and extension of the typesetter from <abbr class="acronym">AT&amp;T</abbr>
+Unix, <code class="code">groff</code> is present on most <abbr class="acronym">POSIX</abbr> systems owing to
+its long association with Unix manuals (including man pages). It and
+its predecessor are notable for their production of several best-selling
+software engineering texts. <code class="code">groff</code> is capable of producing
+typographically sophisticated documents while consuming minimal system
+resources.
+</p>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/Writing-Macros.html b/doc/groff.html.node/Writing-Macros.html
new file mode 100644
index 0000000..e08b9fa
--- /dev/null
+++ b/doc/groff.html.node/Writing-Macros.html
@@ -0,0 +1,267 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Writing Macros (The GNU Troff Manual)</title>
+
+<meta name="description" content="Writing Macros (The GNU Troff Manual)">
+<meta name="keywords" content="Writing Macros (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Page-Motions.html" rel="next" title="Page Motions">
+<link href="Conditionals-and-Loops.html" rel="prev" title="Conditionals and Loops">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="Writing-Macros">
+<div class="nav-panel">
+<p>
+Next: <a href="Page-Motions.html" accesskey="n" rel="next">Page Motions</a>, Previous: <a href="Conditionals-and-Loops.html" accesskey="p" rel="prev">Conditionals and Loops</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="Writing-Macros-1">5.24 Writing Macros</h3>
+<a class="index-entry-id" id="index-writing-macros"></a>
+<a class="index-entry-id" id="index-macros_002c-writing"></a>
+
+<p>A <em class="dfn">macro</em> is a stored collection of text and control lines that can
+be interpolated multiple times. Use macros to define common operations.
+Macros are called in the same way that requests are invoked. While
+requests exist for the purpose of creating macros, simply calling an
+undefined macro, or interpolating it as a string, will cause it to be
+defined as empty. See <a class="xref" href="Identifiers.html">Identifiers</a>.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ede"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.de</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">end</i></span>]</var><a class="copiable-link" href='#index-_002ede'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-de"></a>
+<p>Define a macro <var class="var">name</var>, replacing the definition of any existing
+request, macro, string, or diversion called <var class="var">name</var>. If
+<var class="var">name</var> already exists as an alias, the target of the alias is
+redefined; recall <a class="ref" href="Strings.html">Strings</a>. GNU <code class="code">troff</code> enters copy
+mode,<a class="footnote" id="DOCF97" href="groff.html_fot.html#FOOT97"><sup>97</sup></a> storing subsequent input lines as the
+macro definition. If the optional second argument is not specified, the
+definition ends with the control line &lsquo;<samp class="samp">..</samp>&rsquo; (two dots).
+Alternatively, <var class="var">end</var> identifies a macro whose call syntax at the
+start of a control line ends the definition of <var class="var">name</var>; <var class="var">end</var> is
+then called normally. A macro definition must end in the same
+conditional block (if any) in which it began (see <a class="pxref" href="Conditional-Blocks.html">Conditional Blocks</a>). Spaces or tabs are permitted after the control character in
+the line containing this ending token (either &lsquo;<samp class="samp">.</samp>&rsquo; or
+&lsquo;<samp class="samp"><var class="var">end</var></samp>&rsquo;), but a tab immediately after the token prevents its
+recognition as the end of a macro definition. The macro <var class="var">end</var> can
+be called with arguments.<a class="footnote" id="DOCF98" href="groff.html_fot.html#FOOT98"><sup>98</sup></a>
+</p>
+<p>Here is a small example macro called &lsquo;<samp class="samp">P</samp>&rsquo; that causes a break and
+inserts some vertical space. It could be used to separate paragraphs.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de P
+. br
+. sp .8v
+..
+</pre></div></div>
+
+<p>We can define one macro within another. Attempting to nest &lsquo;<samp class="samp">..</samp>&rsquo;
+naïvely will end the outer definition because the inner definition
+isn&rsquo;t interpreted as such until the outer macro is later interpolated.
+We can use an end macro instead. Each level of nesting should use a
+unique end macro.
+</p>
+<p>An end macro need not be defined until it is called. This fact enables
+a nested macro definition to begin inside one macro and end inside
+another. Consider the following example.<a class="footnote" id="DOCF99" href="groff.html_fot.html#FOOT99"><sup>99</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de m1
+. de m2 m3
+you
+..
+.de m3
+Hello,
+Joe.
+..
+.de m4
+do
+..
+.m1
+know?
+. m3
+What
+.m4
+.m2
+ &rArr; Hello, Joe. What do you know?
+</pre></div></div>
+
+<p>A nested macro definition <em class="emph">can</em> be terminated with &lsquo;<samp class="samp">..</samp>&rsquo; and
+nested macros <em class="emph">can</em> reuse end macros, but these control lines must
+be escaped multiple times for each level of nesting. The necessity of
+this escaping and the utility of nested macro definitions will become
+clearer when we employ macro parameters and consider the behavior of
+copy mode in detail.
+</p></dd></dl>
+
+<p><code class="code">de</code> defines a macro that inherits the compatibility mode
+enablement status of its context (see <a class="pxref" href="Implementation-Differences.html">Implementation Differences</a>).
+Often it is desirable to make a macro that uses <code class="code">groff</code> features
+callable from contexts where compatibility mode is on; for instance,
+when writing extensions to a historical macro package. To achieve this,
+compatibility mode needs to be switched off while such a macro is
+interpreted&mdash;without disturbing that state when it is finished.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ede1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.de1</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">end</i></span>]</var><a class="copiable-link" href='#index-_002ede1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-de1"></a>
+<p>The <code class="code">de1</code> request defines a macro to be interpreted with
+compatibility mode disabled. When <var class="var">name</var> is called, compatibility
+mode enablement status is saved; it is restored when the call completes.
+Observe the extra backlash before the interpolation of register
+&lsquo;<samp class="samp">xxx</samp>&rsquo;; we&rsquo;ll explore this subject in <a class="ref" href="Copy-Mode.html">Copy Mode</a>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr xxx 12345
+.de aa
+The value of xxx is \\n[xxx].
+. br
+..
+.de1 bb
+The value of xxx is \\n[xxx].
+..
+.cp 1
+.aa
+ error&rarr; warning: register '[' not defined
+ &rArr; The value of xxx is 0xxx].
+.bb
+ &rArr; The value of xxx is 12345.
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002edei"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.dei</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">end</i></span>]</var><a class="copiable-link" href='#index-_002edei'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-dei"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002edei1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.dei1</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">end</i></span>]</var><a class="copiable-link" href='#index-_002edei1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-dei1"></a>
+<p>The <code class="code">dei</code> request defines a macro with its name and end
+macro indirected through strings. That is, it interpolates strings
+named <var class="var">name</var> and <var class="var">end</var> before performing the definition.
+</p>
+<p>The following examples are equivalent.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds xx aa
+.ds yy bb
+.dei xx yy
+</pre></div></div>
+
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de aa bb
+</pre></div></div>
+
+<p>The <code class="code">dei1</code> request bears the same relationship to <code class="code">dei</code> as
+<code class="code">de1</code> does to <code class="code">de</code>; it temporarily turns compatibility mode
+off when <var class="var">name</var> is called.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eam"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.am</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">end</i></span>]</var><a class="copiable-link" href='#index-_002eam'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-am"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eam1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.am1</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">end</i></span>]</var><a class="copiable-link" href='#index-_002eam1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-am1"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eami"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ami</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">end</i></span>]</var><a class="copiable-link" href='#index-_002eami'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ami"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eami1"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ami1</code></strong> <var class="def-var-arguments">name [<span class="r"><i class="slanted">end</i></span>]</var><a class="copiable-link" href='#index-_002eami1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ami1"></a>
+<a class="index-entry-id" id="index-appending-to-a-macro-_0028am_0029"></a>
+<a class="index-entry-id" id="index-macro_002c-appending-to-_0028am_0029"></a>
+<p><code class="code">am</code> appends subsequent input lines to macro <var class="var">name</var>, extending
+its definition, and otherwise working as <code class="code">de</code> does.
+</p>
+<p>To make the previously defined &lsquo;<samp class="samp">P</samp>&rsquo; macro set indented instead of
+block paragraphs, add the necessary code to the existing macro.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.am P
+.ti +5n
+..
+</pre></div></div>
+
+<p>The other requests are analogous to their &lsquo;<samp class="samp">de</samp>&rsquo; counterparts. The
+<code class="code">am1</code> request turns off compatibility mode during interpretation of
+the appendment. The <code class="code">ami</code> request appends indirectly, meaning that
+strings <var class="var">name</var> and <var class="var">end</var> are interpolated with the resulting
+names used before appending. The <code class="code">ami1</code> request is similar to
+<code class="code">ami</code>, disabling compatibility mode during interpretation of the
+appended lines.
+</p></dd></dl>
+
+<a class="index-entry-id" id="index-trace_002etmac"></a>
+<p>Using <samp class="file">trace.tmac</samp>, you can trace calls to <code class="code">de</code>,
+<code class="code">de1</code>, <code class="code">am</code>, and <code class="code">am1</code>. You can also use the
+<code class="code">backtrace</code> request at any point desired to troubleshoot tricky
+spots (see <a class="pxref" href="Debugging.html">Debugging</a>).
+</p>
+<p>See <a class="xref" href="Strings.html">Strings</a>, for the <code class="code">als</code>, <code class="code">rm</code>, and <code class="code">rn</code> requests to
+create an alias of, remove, and rename a macro, respectively.
+</p>
+<a class="index-entry-id" id="index-object-creation"></a>
+<p>Macro identifiers share their name space with requests, strings, and
+diversions; see <a class="ref" href="Identifiers.html">Identifiers</a>. The <code class="code">am</code>, <code class="code">as</code>, <code class="code">da</code>,
+<code class="code">de</code>, <code class="code">di</code>, and <code class="code">ds</code> requests (together with their
+variants) create a new object only if the name of the macro, diversion,
+or string is currently undefined or if it is defined as a request;
+normally, they modify the value of an existing object. See <a class="xref" href="Strings.html#als">the
+description of the <code class="code">als</code> request</a>, for pitfalls when redefining a
+macro that is aliased.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ereturn"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.return</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">anything</i></span>]</var><a class="copiable-link" href='#index-_002ereturn'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-return"></a>
+<p>Exit a macro, immediately returning to the caller. If called with an
+argument <var class="var">anything</var>, exit twice&mdash;the current macro and the macro
+one level higher. This is used to define a wrapper macro for
+<code class="code">return</code> in <samp class="file">trace.tmac</samp>.
+</p></dd></dl>
+
+
+
+<ul class="mini-toc">
+<li><a href="Parameters.html" accesskey="1">Parameters</a></li>
+<li><a href="Copy-Mode.html" accesskey="2">Copy Mode</a></li>
+</ul>
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Page-Motions.html">Page Motions</a>, Previous: <a href="Conditionals-and-Loops.html">Conditionals and Loops</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/als.html b/doc/groff.html.node/als.html
new file mode 100644
index 0000000..711bc84
--- /dev/null
+++ b/doc/groff.html.node/als.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<!-- This file redirects to the location of a node or anchor -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>als (The GNU Troff Manual)</title>
+
+<meta name="description" content="als (The GNU Troff Manual)">
+<meta name="keywords" content="als (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+
+<meta http-equiv="Refresh" content="0; url=Strings.html#als">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+</head>
+
+<body lang="en">
+
+<p>The node you are looking for is at <a href="Strings.html#als">als</a>.</p>
+</body>
diff --git a/doc/groff.html.node/groff-Capabilities.html b/doc/groff.html.node/groff-Capabilities.html
new file mode 100644
index 0000000..424779a
--- /dev/null
+++ b/doc/groff.html.node/groff-Capabilities.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>groff Capabilities (The GNU Troff Manual)</title>
+
+<meta name="description" content="groff Capabilities (The GNU Troff Manual)">
+<meta name="keywords" content="groff Capabilities (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Introduction.html" rel="up" title="Introduction">
+<link href="Macro-Package-Intro.html" rel="next" title="Macro Package Intro">
+<link href="What-Is-groff_003f.html" rel="prev" title="What Is groff?">
+<style type="text/css">
+<!--
+ul.mark-bullet {list-style-type: disc}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="groff-Capabilities">
+<div class="nav-panel">
+<p>
+Next: <a href="Macro-Package-Intro.html" accesskey="n" rel="next">Macro Packages</a>, Previous: <a href="What-Is-groff_003f.html" accesskey="p" rel="prev">What Is <code class="code">groff</code>?</a>, Up: <a href="Introduction.html" accesskey="u" rel="up">Introduction</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="groff-Capabilities-1">1.3 <code class="code">groff</code> Capabilities</h3>
+<a class="index-entry-id" id="index-groff-capabilities"></a>
+<a class="index-entry-id" id="index-capabilities-of-groff"></a>
+
+<p>GNU <code class="code">troff</code> is a typesetting document formatter; it provides a wide
+range of low-level text and page operations within the framework of a
+programming language. These operations compose to generate footnotes,
+tables of contents, mathematical equations, diagrams, multi-column text,
+and other elements of typeset works. Here is a survey of formatter
+features; all are under precise user control.
+</p>
+<ul class="itemize mark-bullet">
+<li>text filling, breaking, alignment to the left or right margin; centering
+
+</li><li>adjustment of inter-word space size to justify text, and of
+inter-sentence space size to suit local style conventions
+
+</li><li>automatic and manual determination of hyphenation break points
+
+</li><li>pagination
+
+</li><li>selection of any font available to the output device
+
+</li><li>adjustment of type size and vertical spacing (or &ldquo;leading&rdquo;)
+
+</li><li>configuration of line length and indentation amounts; columnation
+
+</li><li>drawing of geometric primitives (lines, arcs, polygons, circles,
+&hellip;)
+
+</li><li>setup of stroke and fill colors (where supported by the output
+device)
+
+</li><li>embedding of hyperlinks, images, document metadata, and other inclusions
+(where supported by the output device)
+</li></ul>
+
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/groff.html_fot.html b/doc/groff.html.node/groff.html_fot.html
new file mode 100644
index 0000000..1230044
--- /dev/null
+++ b/doc/groff.html.node/groff.html_fot.html
@@ -0,0 +1,525 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Footnotes (The GNU Troff Manual)</title>
+
+<meta name="description" content="Footnotes (The GNU Troff Manual)">
+<meta name="keywords" content="Footnotes (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<style type="text/css">
+<!--
+kbd.key {font-style: normal}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="element-footnotes" id="SEC_Footnotes">
+<div class="nav-panel">
+<p>
+ &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="footnotes-heading">Footnotes</h4>
+
+<h5 class="footnote-body-heading"><a id="FOOT1" href="Preprocessor-Intro.html#DOCF1">(1)</a></h5>
+<p>The &lsquo;<samp class="samp">g</samp>&rsquo; prefix is
+not used on all systems; see <a class="ref" href="Invoking-groff.html">Invoking <code class="code">groff</code></a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT2" href="Conventions-Used-in-This-Manual.html#DOCF2">(2)</a></h5>
+<p>Unix and related operating systems distinguish
+standard output and standard error streams <em class="emph">because</em> of
+<code class="code">troff</code>:
+<a class="uref" href="https://minnie.tuhs.org/pipermail/tuhs/2013-December/006113.html">https://minnie.tuhs.org/pipermail/tuhs/2013-December/006113.html</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT3" href="Conventions-Used-in-This-Manual.html#DOCF3">(3)</a></h5>
+<p>See <a class="xref" href="Line-Layout.html">Line Layout</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT4" href="Invoking-groff.html#DOCF4">(4)</a></h5>
+<p>Besides <code class="code">groff</code>, <code class="code">neatroff</code> is an
+exception.</p>
+<h5 class="footnote-body-heading"><a id="FOOT5" href="Macro-Directories.html#DOCF5">(5)</a></h5>
+<p>The
+<code class="code">mso</code> request does not have these limitations. See <a class="xref" href="I_002fO.html">I/O</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT6" href="Basics.html#DOCF6">(6)</a></h5>
+<p>The remainder of this chapter is based on
+<cite class="cite">Writing Papers with nroff using -me</cite> by Eric&nbsp;P. Allman,
+which is distributed with <code class="code">groff</code> as <samp class="file">meintro.me</samp>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT7" href="ms-Introduction.html#DOCF7">(7)</a></h5>
+<p>While manual <em class="emph">pages</em> are older, early ones used
+macros supplanted by the <samp class="file">man</samp> package of Seventh Edition Unix
+(1979). <samp class="file">ms</samp> shipped with Sixth Edition (1975) and was documented
+by Mike Lesk in a Bell Labs internal memorandum.</p>
+<h5 class="footnote-body-heading"><a id="FOOT8" href="ms-Document-Control-Settings.html#DOCF8">(8)</a></h5>
+<p>defined in <a class="ref" href="ms-Footnotes.html">Footnotes</a></p>
+<h5 class="footnote-body-heading"><a id="FOOT9" href="ms-Document-Description-Macros.html#DOCF9">(9)</a></h5>
+<p>Distinguish a
+document title from &ldquo;titles&rdquo;, which are what <code class="code">roff</code> systems call
+headers and footers collectively.</p>
+<h5 class="footnote-body-heading"><a id="FOOT10" href="Typeface-and-decoration.html#DOCF10">(10)</a></h5>
+<p>This idiosyncrasy arose through
+feature accretion; for example, the <code class="code">B</code> macro in Version&nbsp;6
+Unix <samp class="file">ms</samp> (1975) accepted only one argument, the text to be set in
+boldface. By Version&nbsp;7 (1979) it recognized a second argument; in
+1990, <code class="code">groff</code> <samp class="file">ms</samp> added a &ldquo;pre&rdquo; argument, placing it third
+to avoid breaking support for older documents.</p>
+<h5 class="footnote-body-heading"><a id="FOOT11" href="ms-Footnotes.html#DOCF11">(11)</a></h5>
+<p>&ldquo;Portable Document Format Publishing with GNU
+Troff&rdquo;, <samp class="file">pdfmark.ms</samp> in the <code class="code">groff</code> distribution, uses this
+technique.</p>
+<h5 class="footnote-body-heading"><a id="FOOT12" href="ms-Footnotes.html#DOCF12">(12)</a></h5>
+<p>Unix Version&nbsp;7 <samp class="file">ms</samp>, its descendants, and GNU
+<samp class="file">ms</samp> prior to <code class="code">groff</code> version 1.23.0</p>
+<h5 class="footnote-body-heading"><a id="FOOT13" href="ms-Footnotes.html#DOCF13">(13)</a></h5>
+<p>You could reset it
+after each call to <code class="code">.1C</code>, <code class="code">.2C</code>, or <code class="code">.MC</code>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT14" href="Differences-from-AT_0026T-ms.html#DOCF14">(14)</a></h5>
+<p><cite class="cite">Typing Documents on the UNIX System: Using the
+-ms Macros with Troff and Nroff</cite>, M.&nbsp;E. Lesk, Bell Laboratories,
+1978</p>
+<h5 class="footnote-body-heading"><a id="FOOT15" href="Differences-from-AT_0026T-ms.html#DOCF15">(15)</a></h5>
+<p>Register values are converted to and stored as
+basic units. See <a class="xref" href="Measurements.html">Measurements</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT16" href="Differences-from-AT_0026T-ms.html#DOCF16">(16)</a></h5>
+<p>If you redefine the <samp class="file">ms</samp> <code class="code">PT</code> macro
+and desire special treatment of certain page numbers (like &lsquo;<samp class="samp">1</samp>&rsquo;),
+you may need to handle a non-Arabic page number format, as <code class="code">groff</code>
+<samp class="file">ms</samp>&rsquo;s <code class="code">PT</code> does; see the macro package source. <code class="code">groff</code>
+<samp class="file">ms</samp> aliases the <code class="code">PN</code> register to <code class="code">%</code>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT17" href="Missing-Unix-Version-7-ms-Macros.html#DOCF17">(17)</a></h5>
+<p>The removal beforehand is necessary
+because <code class="code">groff</code> <samp class="file">ms</samp> aliases these macros to a diagnostic
+macro, and you want to redefine the aliased name, not its target.</p>
+<h5 class="footnote-body-heading"><a id="FOOT18" href="Filling.html#DOCF18">(18)</a></h5>
+<p>See <a class="xref" href="Device-and-Font-Description-Files.html">Device and Font Description Files</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT19" href="Filling.html#DOCF19">(19)</a></h5>
+<p><i class="slanted">Tabs</i> and <i class="slanted">leaders</i> also separate
+words. <i class="slanted">Escape sequences</i> can function as word characters, word
+separators, or neither&mdash;the last simply have no effect on GNU
+<code class="code">troff</code>&rsquo;s idea of whether an input character is within a word.
+We&rsquo;ll discuss all of these in due course.</p>
+<h5 class="footnote-body-heading"><a id="FOOT20" href="Sentences.html#DOCF20">(20)</a></h5>
+<p>A
+well-researched jeremiad appreciated by <code class="code">groff</code> contributors on
+both sides of the sentence-spacing debate can be found at
+<a class="uref" href="https://web.archive.org/web/20171217060354/http://www.heracliteanriver.com/?p=324">https://web.archive.org/web/20171217060354/http://www.heracliteanriver.com/?p=324</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT21" href="Sentences.html#DOCF21">(21)</a></h5>
+<p>This statement oversimplifies; there are
+escape sequences whose purpose is precisely to produce glyphs on the
+output device, and input characters that <em class="emph">aren&rsquo;t</em> part of escape
+sequences can undergo a great deal of processing before getting to the
+output.</p>
+<h5 class="footnote-body-heading"><a id="FOOT22" href="Sentences.html#DOCF22">(22)</a></h5>
+<p>The mnemonics for the special
+characters shown here are &ldquo;dagger&rdquo;, &ldquo;double dagger&rdquo;, &ldquo;right
+(double) quote&rdquo;, and &ldquo;closing (single) quote&rdquo;. See the
+<cite class="cite">groff_char<span class="r">(7)</span></cite> man page.</p>
+<h5 class="footnote-body-heading"><a id="FOOT23" href="Breaking.html#DOCF23">(23)</a></h5>
+<p>&ldquo;Text lines&rdquo; are defined in <a class="ref" href="Requests-and-Macros.html">Requests and Macros</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT24" href="Tabs-and-Leaders.html#DOCF24">(24)</a></h5>
+<p>&ldquo;Tab&rdquo;
+is short for &ldquo;tabulation&rdquo;, revealing the term&rsquo;s origin as a spacing
+mechanism for table arrangement.</p>
+<h5 class="footnote-body-heading"><a id="FOOT25" href="Requests-and-Macros.html#DOCF25">(25)</a></h5>
+<p>The <code class="code">\<kbd class="key">RET</kbd></code> escape sequence can alter how an
+input line is classified; see <a class="ref" href="Line-Continuation.html">Line Continuation</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT26" href="Requests-and-Macros.html#DOCF26">(26)</a></h5>
+<p>Argument handling in
+macros is more flexible but also more complex. See <a class="xref" href="Calling-Macros.html">Calling Macros</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT27" href="Requests-and-Macros.html#DOCF27">(27)</a></h5>
+<p>Some escape sequences undergo
+interpolation as well.</p>
+<h5 class="footnote-body-heading"><a id="FOOT28" href="Requests-and-Macros.html#DOCF28">(28)</a></h5>
+<p>GNU <code class="code">troff</code> offers additional ones. See <a class="xref" href="Writing-Macros.html">Writing Macros</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT29" href="Macro-Packages.html#DOCF29">(29)</a></h5>
+<p>Macro files and packages
+frequently define registers and strings as well.</p>
+<h5 class="footnote-body-heading"><a id="FOOT30" href="Input-Encodings.html#DOCF30">(30)</a></h5>
+<p>The
+<em class="emph">semantics</em> of certain punctuation code points have gotten stricter
+with the successive standards, a cause of some frustration among man
+page writers; see the <cite class="cite">groff_char<span class="r">(7)</span></cite> man page.</p>
+<h5 class="footnote-body-heading"><a id="FOOT31" href="Input-Encodings.html#DOCF31">(31)</a></h5>
+<p>The
+DVI output device defaults to using the Computer Modern (CM) fonts;
+<samp class="file">ec.tmac</samp> loads the EC fonts instead, which provide Euro
+&lsquo;<samp class="samp">\[Eu]</samp>&rsquo; and per mille &lsquo;<samp class="samp">\[%0]</samp>&rsquo; glyphs.</p>
+<h5 class="footnote-body-heading"><a id="FOOT32" href="Input-Conventions.html#DOCF32">(32)</a></h5>
+<p>Emacs: <code class="code">fill-column: 72</code>; Vim: <code class="code">textwidth=72</code></p>
+<h5 class="footnote-body-heading"><a id="FOOT33" href="Page-Geometry.html#DOCF33">(33)</a></h5>
+<p><code class="code">groff</code> does not yet support right-to-left
+scripts.</p>
+<h5 class="footnote-body-heading"><a id="FOOT34" href="Page-Geometry.html#DOCF34">(34)</a></h5>
+<p><code class="code">groff</code>&rsquo;s terminal output devices have page
+offsets of zero.</p>
+<h5 class="footnote-body-heading"><a id="FOOT35" href="Numeric-Expressions.html#DOCF35">(35)</a></h5>
+<p>Provision is made for interpreting and
+reporting decimal fractions in certain cases.</p>
+<h5 class="footnote-body-heading"><a id="FOOT36" href="Numeric-Expressions.html#DOCF36">(36)</a></h5>
+<p>If that&rsquo;s not enough, see the <cite class="cite">groff_tmac<span class="r">(5)</span></cite>
+man page for the <samp class="file">62bit.tmac</samp> macro package.</p>
+<h5 class="footnote-body-heading"><a id="FOOT37" href="Numeric-Expressions.html#DOCF37">(37)</a></h5>
+<p>See <a class="xref" href="Conditionals-and-Loops.html">Conditionals and Loops</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT38" href="Numeric-Expressions.html#DOCF38">(38)</a></h5>
+<p>Control structure syntax
+creates an exception to this rule, but is designed to remain useful:
+recalling our example, &lsquo;<samp class="samp">.if 1 .Underline this</samp>&rsquo; would underline only
+&ldquo;this&rdquo;, precisely. See <a class="xref" href="Conditionals-and-Loops.html">Conditionals and Loops</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT39" href="Numeric-Expressions.html#DOCF39">(39)</a></h5>
+<p>See <a class="xref" href="Diversions.html">Diversions</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT40" href="Identifiers.html#DOCF40">(40)</a></h5>
+<p>Historically, control characters like
+ASCII STX, ETX, and BEL (<kbd class="key">Control+B</kbd>, <kbd class="key">Control+C</kbd>, and
+<kbd class="key">Control+G</kbd>) have been observed in <code class="code">roff</code> documents,
+particularly in macro packages employing them as delimiters with the
+output comparison operator to try to avoid collisions with the content
+of arbitrary user-supplied parameters (see <a class="pxref" href="Operators-in-Conditionals.html">Operators in Conditionals</a>). We discourage this expedient; in GNU <code class="code">troff</code> it is
+unnecessary (outside of compatibility mode) because delimited arguments
+are parsed at a different input level than the surrounding context.
+See <a class="xref" href="Implementation-Differences.html">Implementation Differences</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT41" href="Identifiers.html#DOCF41">(41)</a></h5>
+<p>Consider what happens when a C1 control
+<code class="code">0x80</code>&ndash;<code class="code">0x9F</code> is necessary as a continuation byte in a UTF-8
+sequence.</p>
+<h5 class="footnote-body-heading"><a id="FOOT42" href="Control-Characters.html#DOCF42">(42)</a></h5>
+<p>Recall <a class="ref" href="Identifiers.html">Identifiers</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT43" href="Invoking-Requests.html#DOCF43">(43)</a></h5>
+<p>In compatibility
+mode, a space is not necessary after a request or macro name of two
+characters&rsquo; length. Also, Plan&nbsp;9 <code class="code">troff</code> allows tabs to
+separate arguments.</p>
+<h5 class="footnote-body-heading"><a id="FOOT44" href="Calling-Macros.html#DOCF44">(44)</a></h5>
+<p><code class="code">\~</code> is fairly
+portable; see <a class="ref" href="Other-Differences.html">Other Differences</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT45" href="Calling-Macros.html#DOCF45">(45)</a></h5>
+<p>Strictly, you can neglect to
+close the last quoted macro argument, relying on the end of the control
+line to do so. We consider this lethargic practice poor style.</p>
+<h5 class="footnote-body-heading"><a id="FOOT46" href="Using-Escape-Sequences.html#DOCF46">(46)</a></h5>
+<p>The omission of spaces before the comment
+escape sequences is necessary; see <a class="ref" href="Strings.html">Strings</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT47" href="Using-Escape-Sequences.html#DOCF47">(47)</a></h5>
+<p>TeX does have such a mechanism.</p>
+<h5 class="footnote-body-heading"><a id="FOOT48" href="Comments.html#DOCF48">(48)</a></h5>
+<p>This claim may be more aspirational than descriptive.</p>
+<h5 class="footnote-body-heading"><a id="FOOT49" href="Comments.html#DOCF49">(49)</a></h5>
+<p>See <a class="xref" href="Conditional-Blocks.html">Conditional Blocks</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT50" href="Comments.html#DOCF50">(50)</a></h5>
+<p>Exception: auto-incrementing registers defined outside
+the ignored region <em class="emph">will</em> be modified if interpolated with
+<code class="code">\n±</code> inside it. See <a class="xref" href="Auto_002dincrement.html">Auto-increment</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT51" href="Auto_002dincrement.html#DOCF51">(51)</a></h5>
+<p>A negative auto-increment can be
+considered an &ldquo;auto-decrement&rdquo;.</p>
+<h5 class="footnote-body-heading"><a id="FOOT52" href="Built_002din-Registers.html#DOCF52">(52)</a></h5>
+<p>GNU <code class="code">troff</code> dynamically allocates memory for
+as many registers as required.</p>
+<h5 class="footnote-body-heading"><a id="FOOT53" href="Manipulating-Filling-and-Adjustment.html#DOCF53">(53)</a></h5>
+<p>unless diverted; see <a class="ref" href="Diversions.html">Diversions</a></p>
+<h5 class="footnote-body-heading"><a id="FOOT54" href="Manipulating-Filling-and-Adjustment.html#DOCF54">(54)</a></h5>
+<p>See <a class="xref" href="Line-Continuation.html">Line Continuation</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT55" href="Manipulating-Filling-and-Adjustment.html#DOCF55">(55)</a></h5>
+<p>Recall <a class="ref" href="Filling.html">Filling</a> and <a class="ref" href="Sentences.html">Sentences</a> for the
+definitions of word and sentence boundaries, respectively.</p>
+<h5 class="footnote-body-heading"><a id="FOOT56" href="Manipulating-Hyphenation.html#DOCF56">(56)</a></h5>
+<p>Whether a perfect algorithm for this application is
+even possible is an unsolved problem in computer science:
+<a class="url" href="https://tug.org/docs/liang/liang-thesis.pdf">https://tug.org/docs/liang/liang-thesis.pdf</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT57" href="Manipulating-Hyphenation.html#DOCF57">(57)</a></h5>
+<p><code class="code">\%</code> itself stops marking
+hyphenation points but still produces no output glyph.</p>
+<h5 class="footnote-body-heading"><a id="FOOT58" href="Manipulating-Hyphenation.html#DOCF58">(58)</a></h5>
+<p>&ldquo;Soft&rdquo; because it appears in output
+only where a hyphenation break is performed; a &ldquo;hard&rdquo; hyphen, as in
+&ldquo;long-term&rdquo;, always appears.</p>
+<h5 class="footnote-body-heading"><a id="FOOT59" href="Manipulating-Hyphenation.html#DOCF59">(59)</a></h5>
+<p>The mode is a vector of Booleans encoded as an integer.
+To a programmer, this fact is easily deduced from the exclusive use of
+powers of two for the configuration parameters; they are computationally
+easy to &ldquo;mask off&rdquo; and compare to zero. To almost everyone else, the
+arrangement seems recondite and unfriendly.</p>
+<h5 class="footnote-body-heading"><a id="FOOT60" href="Manipulating-Hyphenation.html#DOCF60">(60)</a></h5>
+<p>Hyphenation is
+prevented if the next page location trap is closer to the vertical
+drawing position than the next text baseline would be. See <a class="xref" href="Page-Location-Traps.html">Page Location Traps</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT61" href="Manipulating-Hyphenation.html#DOCF61">(61)</a></h5>
+<p>For more on localization, see the
+<cite class="cite">groff_tmac<span class="r">(5)</span></cite> man page.</p>
+<h5 class="footnote-body-heading"><a id="FOOT62" href="Manipulating-Spacing.html#DOCF62">(62)</a></h5>
+<p>See <a class="xref" href="Page-Location-Traps.html">Page Location Traps</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT63" href="Manipulating-Spacing.html#DOCF63">(63)</a></h5>
+<p>See <a class="xref" href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT64" href="Manipulating-Spacing.html#DOCF64">(64)</a></h5>
+<p>or geometric objects; see <a class="ref" href="Drawing-Geometric-Objects.html">Drawing Geometric Objects</a></p>
+<h5 class="footnote-body-heading"><a id="FOOT65" href="Manipulating-Spacing.html#DOCF65">(65)</a></h5>
+<p>to the top-level diversion;
+see <a class="ref" href="Diversions.html">Diversions</a></p>
+<h5 class="footnote-body-heading"><a id="FOOT66" href="Tabs-and-Fields.html#DOCF66">(66)</a></h5>
+<p>Plan&nbsp;9 <code class="code">troff</code>
+uses the register <code class="code">.S</code> for this purpose.</p>
+<h5 class="footnote-body-heading"><a id="FOOT67" href="Leaders.html#DOCF67">(67)</a></h5>
+<p>This is pronounced to rhyme with &ldquo;feeder&rdquo;, and
+refers to how the glyphs &ldquo;lead&rdquo; the eye across the page to the
+corresponding page number or other datum.</p>
+<h5 class="footnote-body-heading"><a id="FOOT68" href="troff-and-nroff-Modes.html#DOCF68">(68)</a></h5>
+<p>A
+GNU <code class="command">nroff</code> program is available for convenience; it calls GNU
+<code class="code">troff</code> to perform the formatting.</p>
+<h5 class="footnote-body-heading"><a id="FOOT69" href="Line-Continuation.html#DOCF69">(69)</a></h5>
+<p>Historically, the <code class="code">\c</code>
+escape sequence has proven challenging to characterize. Some sources
+say it &ldquo;connects the next input text&rdquo; (to the input line on which it
+appears); others describe it as &ldquo;interrupting&rdquo; text, on the grounds
+that a text line is interrupted without breaking, perhaps to inject a
+request invocation or macro call.</p>
+<h5 class="footnote-body-heading"><a id="FOOT70" href="Page-Layout.html#DOCF70">(70)</a></h5>
+<p>See <a class="xref" href="Traps.html">Traps</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT71" href="Page-Control.html#DOCF71">(71)</a></h5>
+<p>See <a class="xref" href="Diversions.html">Diversions</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT72" href="Using-Fonts.html#DOCF72">(72)</a></h5>
+<p>Terminals and some output devices have fonts that render
+at only one or two sizes. As examples of the latter, take the
+<code class="code">groff</code> <code class="code">lj4</code> device&rsquo;s Lineprinter, and <code class="code">lbp</code>&rsquo;s Courier
+and Elite faces.</p>
+<h5 class="footnote-body-heading"><a id="FOOT73" href="Using-Fonts.html#DOCF73">(73)</a></h5>
+<p>Font designers prepare families such that the styles
+share esthetic properties.</p>
+<h5 class="footnote-body-heading"><a id="FOOT74" href="Using-Fonts.html#DOCF74">(74)</a></h5>
+<p>Historically, the fonts
+<code class="code">troff</code>s dealt with were not Free Software or, as with the Graphic
+Systems C/A/T, did not even exist in the digital domain.</p>
+<h5 class="footnote-body-heading"><a id="FOOT75" href="Using-Fonts.html#DOCF75">(75)</a></h5>
+<p>See <a class="xref" href="Font-Description-File-Format.html">Font Description File Format</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT76" href="Font-Families.html#DOCF76">(76)</a></h5>
+<p>See <a class="xref" href="DESC-File-Format.html"><samp class="file">DESC</samp> File Format</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT77" href="Using-Symbols.html#DOCF77">(77)</a></h5>
+<p>Not all versions of the <code class="code">man</code> program
+support the <samp class="option">-T</samp> option; use the subsequent example for an
+alternative.</p>
+<h5 class="footnote-body-heading"><a id="FOOT78" href="Using-Symbols.html#DOCF78">(78)</a></h5>
+<p>This is &ldquo;Normalization Form D&rdquo;
+as documented in Unicode Standard Annex #15
+(<a class="uref" href="https://unicode.org/reports/tr15/">https://unicode.org/reports/tr15/</a>).</p>
+<h5 class="footnote-body-heading"><a id="FOOT79" href="Using-Symbols.html#DOCF79">(79)</a></h5>
+<p>See <a class="xref" href="Compatibility-Mode.html">Compatibility Mode</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT80" href="Using-Symbols.html#DOCF80">(80)</a></h5>
+<p>Output glyphs
+don&rsquo;t&mdash;to GNU <code class="code">troff</code>, a glyph is simply a box with an index into
+a font, a given height above and depth below the baseline, and a width.</p>
+<h5 class="footnote-body-heading"><a id="FOOT81" href="Dummy-Characters.html#DOCF81">(81)</a></h5>
+<p>Opinions of this escape sequence&rsquo;s name abound.
+&ldquo;Zero-width space&rdquo; is a popular misnomer: <code class="code">roff</code> formatters do
+not treat it like a space. Ossanna called it a &ldquo;non-printing,
+zero-width character&rdquo;, but the character causes <em class="emph">output</em> even
+though it does not &ldquo;print&rdquo;. If no output line is pending, the dummy
+character starts one. Contrast an empty input document with one
+containing only <code class="code">\&amp;</code>. The former produces no output; the latter, a
+blank page.</p>
+<h5 class="footnote-body-heading"><a id="FOOT82" href="Manipulating-Type-Size-and-Vertical-Spacing.html#DOCF82">(82)</a></h5>
+<p>In text fonts, the tallest glyphs are typically
+parentheses. Unfortunately, in many cases the actual dimensions of the
+glyphs in a font do not closely match its declared type size! For
+example, in the standard PostScript font families, 10-point Times sets
+better with 9-point Helvetica and 11-point Courier than if all three
+were used at 10&nbsp;points.</p>
+<h5 class="footnote-body-heading"><a id="FOOT83" href="Manipulating-Type-Size-and-Vertical-Spacing.html#DOCF83">(83)</a></h5>
+<p>Rhyme with &ldquo;sledding&rdquo;; mechanical typography
+used lead metal (Latin <em class="emph">plumbum</em>).</p>
+<h5 class="footnote-body-heading"><a id="FOOT84" href="Changing-the-Type-Size.html#DOCF84">(84)</a></h5>
+<p>The claim appears to have been true of Ossanna
+<code class="code">troff</code> for the C/A/T device; Kernighan made device-independent
+<code class="code">troff</code> more flexible.</p>
+<h5 class="footnote-body-heading"><a id="FOOT85" href="Using-Fractional-Type-Sizes.html#DOCF85">(85)</a></h5>
+<p>See <a class="xref" href="Device-and-Font-Description-Files.html">Device and Font Description Files</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT86" href="Colors.html#DOCF86">(86)</a></h5>
+<p>also
+known vulgarly as &ldquo;ANSI colors&rdquo;</p>
+<h5 class="footnote-body-heading"><a id="FOOT87" href="Strings.html#DOCF87">(87)</a></h5>
+<p>See <a class="xref" href="Copy-Mode.html">Copy Mode</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT88" href="Operators-in-Conditionals.html#DOCF88">(88)</a></h5>
+<p>This refers to
+<code class="code">vtroff</code>, a translator that would convert the C/A/T output from
+early-vintage <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> to a form suitable for
+Versatec and Benson-Varian plotters.</p>
+<h5 class="footnote-body-heading"><a id="FOOT89" href="Operators-in-Conditionals.html#DOCF89">(89)</a></h5>
+<p>Strictly, letters not otherwise recognized <em class="emph">are</em> treated
+as output comparison delimiters. For portability, it is wise to avoid
+using letters not in the list above; for example, Plan&nbsp;9
+<code class="code">troff</code> uses &lsquo;<samp class="samp">h</samp>&rsquo; to test a mode it calls <code class="code">htmlroff</code>, and
+GNU <code class="code">troff</code> may provide additional operators in the future.</p>
+<h5 class="footnote-body-heading"><a id="FOOT90" href="Operators-in-Conditionals.html#DOCF90">(90)</a></h5>
+<p>Because formatting of the comparands takes place
+in a dummy environment, vertical motions within them cannot spring
+traps.</p>
+<h5 class="footnote-body-heading"><a id="FOOT91" href="Operators-in-Conditionals.html#DOCF91">(91)</a></h5>
+<p>All
+of this is to say that the lists of output nodes created by formatting
+<var class="var">xxx</var> and <var class="var">yyy</var> must be identical. See <a class="xref" href="Gtroff-Internals.html"><code class="code">gtroff</code> Internals</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT92" href="Operators-in-Conditionals.html#DOCF92">(92)</a></h5>
+<p>This bizarre behavior maintains compatibility with
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT93" href="Conditional-Blocks.html#DOCF93">(93)</a></h5>
+<p>See <a class="xref" href="while.html">while</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT94" href="while.html#DOCF94">(94)</a></h5>
+<p>See <a class="xref" href="Copy-Mode.html">Copy Mode</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT95" href="while.html#DOCF95">(95)</a></h5>
+<p>unless you redefine it</p>
+<h5 class="footnote-body-heading"><a id="FOOT96" href="while.html#DOCF96">(96)</a></h5>
+<p>&ldquo;somewhat less&rdquo; because
+things other than macro calls can be on the input stack</p>
+<h5 class="footnote-body-heading"><a id="FOOT97" href="Writing-Macros.html#DOCF97">(97)</a></h5>
+<p>See <a class="xref" href="Copy-Mode.html">Copy Mode</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT98" href="Writing-Macros.html#DOCF98">(98)</a></h5>
+<p>While it is possible to define and
+call a macro &lsquo;<samp class="samp">.</samp>&rsquo;, you can&rsquo;t use it as an end macro: during a macro
+definition, &lsquo;<samp class="samp">..</samp>&rsquo; is never handled as calling &lsquo;<samp class="samp">.</samp>&rsquo;, even if
+&lsquo;<samp class="samp">.de <var class="var">name</var> .</samp>&rsquo; explicitly precedes it.</p>
+<h5 class="footnote-body-heading"><a id="FOOT99" href="Writing-Macros.html#DOCF99">(99)</a></h5>
+<p>Its structure is
+adapted from, and isomorphic to, part of a solution by Tadziu Hoffman to
+the problem of reflowing text multiple times to find an optimal
+configuration for it.
+<a class="uref" href="https://lists.gnu.org/archive/html/groff/2008-12/msg00006.html">https://lists.gnu.org/archive/html/groff/2008-12/msg00006.html</a></p>
+<h5 class="footnote-body-heading"><a id="FOOT100" href="Parameters.html#DOCF100">(100)</a></h5>
+<p>If they were not,
+parameter interpolations would be similar to command-line
+parameters&mdash;fixed for the entire duration of a <code class="code">roff</code> program&rsquo;s
+run. The advantage of interpolating <code class="code">\$</code> escape sequences even in
+copy mode is that they can interpolate different contents from one call
+to the next, like function parameters in a procedural language. The
+additional escape character is the price of this power.</p>
+<h5 class="footnote-body-heading"><a id="FOOT101" href="Copy-Mode.html#DOCF101">(101)</a></h5>
+<p>Compare this to the <code class="code">\def</code> and <code class="code">\edef</code>
+commands in TeX.</p>
+<h5 class="footnote-body-heading"><a id="FOOT102" href="Copy-Mode.html#DOCF102">(102)</a></h5>
+<p>These are lightly adapted from the <code class="code">groff</code>
+implementation of the <samp class="file">ms</samp> macros.</p>
+<h5 class="footnote-body-heading"><a id="FOOT103" href="Page-Motions.html#DOCF103">(103)</a></h5>
+<p>At the
+<code class="code">grops</code> defaults of 10-point type on 12-point vertical spacing, the
+difference between half a vee and half an em can be subtle: large
+spacings like &lsquo;<samp class="samp">.vs .5i</samp>&rsquo; make it obvious.</p>
+<h5 class="footnote-body-heading"><a id="FOOT104" href="Page-Motions.html#DOCF104">(104)</a></h5>
+<p>See <a class="xref" href="Strings.html">Strings</a>, for an explanation of the trailing
+&lsquo;<samp class="samp">\&quot;</samp>&rsquo;.</p>
+<h5 class="footnote-body-heading"><a id="FOOT105" href="Drawing-Geometric-Objects.html#DOCF105">(105)</a></h5>
+<p>(<var class="var">hc</var>, <var class="var">vc</var>) is adjusted to the point nearest
+the perpendicular bisector of the arc&rsquo;s chord.</p>
+<h5 class="footnote-body-heading"><a id="FOOT106" href="Page-Location-Traps.html#DOCF106">(106)</a></h5>
+<p>See <a class="xref" href="The-Implicit-Page-Trap.html">The Implicit Page Trap</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT107" href="Page-Location-Traps.html#DOCF107">(107)</a></h5>
+<p>A trap planted at &lsquo;<samp class="samp">20i</samp>&rsquo; or
+&lsquo;<samp class="samp">-30i</samp>&rsquo; will not be sprung on a page of length &lsquo;<samp class="samp">11i</samp>&rsquo;.</p>
+<h5 class="footnote-body-heading"><a id="FOOT108" href="Page-Location-Traps.html#DOCF108">(108)</a></h5>
+<p>It may help to think of each trap location as
+maintaining a queue; <code class="code">wh</code> operates on the head of the queue, and
+<code class="code">ch</code> operates on its tail. Only the trap at the head of the queue
+is visible.</p>
+<h5 class="footnote-body-heading"><a id="FOOT109" href="The-Implicit-Page-Trap.html#DOCF109">(109)</a></h5>
+<p>See <a class="xref" href="Debugging.html">Debugging</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT110" href="The-Implicit-Page-Trap.html#DOCF110">(110)</a></h5>
+<p>See <a class="xref" href="Diversions.html">Diversions</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT111" href="End_002dof_002dinput-Traps.html#DOCF111">(111)</a></h5>
+<p>While processing an
+end-of-input macro, the formatter assumes that the next page break must
+be the last; it goes into &ldquo;sudden death overtime&rdquo;.</p>
+<h5 class="footnote-body-heading"><a id="FOOT112" href="End_002dof_002dinput-Traps.html#DOCF112">(112)</a></h5>
+<p>Another, taken by the <code class="code">groff</code> <code class="code">man</code> macros, is
+to intercept <code class="code">ne</code> requests and wrap <code class="code">bp</code> ones.</p>
+<h5 class="footnote-body-heading"><a id="FOOT113" href="Diversions.html#DOCF113">(113)</a></h5>
+<p>Thus, the &ldquo;water&rdquo;
+gets &ldquo;higher&rdquo; proceeding <em class="emph">down</em> the page.</p>
+<h5 class="footnote-body-heading"><a id="FOOT114" href="Punning-Names.html#DOCF114">(114)</a></h5>
+<p>The backslash is doubled. See <a class="xref" href="Copy-Mode.html">Copy Mode</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT115" href="Postprocessor-Access.html#DOCF115">(115)</a></h5>
+<p>that is, ISO&nbsp;646:1991-IRV or,
+popularly, &ldquo;US-ASCII&rdquo;</p>
+<h5 class="footnote-body-heading"><a id="FOOT116" href="Postprocessor-Access.html#DOCF116">(116)</a></h5>
+<p>They are bypassed because these parameters are not
+rendered as glyphs in the output; instead, they remain abstract
+characters&mdash;in a PDF bookmark or a URL, for example.</p>
+<h5 class="footnote-body-heading"><a id="FOOT117" href="Miscellaneous.html#DOCF117">(117)</a></h5>
+<p>Recall <a class="ref" href="Line-Layout.html">Line Layout</a>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT118" href="Miscellaneous.html#DOCF118">(118)</a></h5>
+<p>Historically,
+tools named <code class="command">nrchbar</code> and <code class="command">changebar</code> were developed for
+marking changes with margin characters and could be found in archives of
+the <code class="code">comp.sources.unix</code> <abbr class="acronym">USENET</abbr> group. Some proprietary
+Unices also offer(ed) a <code class="command">diffmk</code> program.</p>
+<h5 class="footnote-body-heading"><a id="FOOT119" href="Gtroff-Internals.html#DOCF119">(119)</a></h5>
+<p>Except the
+escape sequences <code class="code">\f</code>, <code class="code">\F</code>, <code class="code">\H</code>, <code class="code">\m</code>, <code class="code">\M</code>,
+<code class="code">\R</code>, <code class="code">\s</code>, and <code class="code">\S</code>, which are processed immediately if
+not in copy mode.</p>
+<h5 class="footnote-body-heading"><a id="FOOT120" href="Compatibility-Mode.html#DOCF120">(120)</a></h5>
+<p>The
+Graphic Systems C/A/T phototypesetter (the original device target for
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>) supported only a few discrete type sizes
+in the range 6&ndash;36 points, so Ossanna contrived a special case in the
+parser to do what the user must have meant. Kernighan warned of this in
+the 1992 revision of CSTR&nbsp;#54 (§2.3), and more recently, McIlroy
+referred to it as a &ldquo;living fossil&rdquo;.</p>
+<h5 class="footnote-body-heading"><a id="FOOT121" href="Other-Differences.html#DOCF121">(121)</a></h5>
+<p>DWB&nbsp;3.3, Solaris, Heirloom Doctools, and
+Plan&nbsp;9 <code class="code">troff</code> all support it.</p>
+<h5 class="footnote-body-heading"><a id="FOOT122" href="Other-Differences.html#DOCF122">(122)</a></h5>
+<p>Naturally, if you&rsquo;ve changed
+the escape character, you need to prefix the <code class="code">e</code> with whatever it
+is&mdash;and you&rsquo;ll likely get something other than a backslash in the
+output.</p>
+<h5 class="footnote-body-heading"><a id="FOOT123" href="Other-Differences.html#DOCF123">(123)</a></h5>
+<p>The <code class="code">rs</code> special character identifier was not
+defined in <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>&rsquo;s font description files, but is
+in those of its lineal descendant, Heirloom Doctools <code class="code">troff</code>, as of
+the latter&rsquo;s 060716 release (July 2006).</p>
+<h5 class="footnote-body-heading"><a id="FOOT124" href="gtroff-Output.html#DOCF124">(124)</a></h5>
+<p>The parser
+and postprocessor for intermediate output can be found in the file<br>
+<samp class="file"><var class="var">groff-source-dir</var>/src/libs/libdriver/input.cpp</samp>.</p>
+<h5 class="footnote-body-heading"><a id="FOOT125" href="Device-and-Font-Description-Files.html#DOCF125">(125)</a></h5>
+<p>Plan&nbsp;9 <code class="code">troff</code> has also abandoned the binary
+format.</p>
+<h5 class="footnote-body-heading"><a id="FOOT126" href="Font-Description-File-Format.html#DOCF126">(126)</a></h5>
+<p>800-point type
+is not practical for most purposes, but using it enables the quantities
+in the font description files to be expressed as integers.</p>
+<h5 class="footnote-body-heading"><a id="FOOT127" href="Font-Description-File-Format.html#DOCF127">(127)</a></h5>
+<p><code class="code">groff</code> requests and escape sequences
+interpret non-negative font names as mounting positions instead.
+Further, a font named &lsquo;<samp class="samp">0</samp>&rsquo; cannot be automatically mounted by the
+<code class="code">fonts</code> directive of a <samp class="file">DESC</samp> file.</p>
+<h5 class="footnote-body-heading"><a id="FOOT128" href="Font-Description-File-Format.html#DOCF128">(128)</a></h5>
+<p>For typesetter devices, this directive is misnamed
+since it starts a list of glyphs, not characters.</p>
+<h5 class="footnote-body-heading"><a id="FOOT129" href="Font-Description-File-Format.html#DOCF129">(129)</a></h5>
+<p>that is, any integer parsable by the C
+standard library&rsquo;s <cite class="cite">strtol<span class="r">(3)</span></cite> function</p>
+</div><hr>
+<div class="nav-panel">
+<p>
+ &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/gtroff-Output.html b/doc/groff.html.node/gtroff-Output.html
new file mode 100644
index 0000000..cab0daf
--- /dev/null
+++ b/doc/groff.html.node/gtroff-Output.html
@@ -0,0 +1,100 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>gtroff Output (The GNU Troff Manual)</title>
+
+<meta name="description" content="gtroff Output (The GNU Troff Manual)">
+<meta name="keywords" content="gtroff Output (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="File-Formats.html" rel="up" title="File Formats">
+<link href="Device-and-Font-Description-Files.html" rel="next" title="Device and Font Description Files">
+<link href="File-Formats.html" rel="prev" title="File Formats">
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="gtroff-Output">
+<div class="nav-panel">
+<p>
+Next: <a href="Device-and-Font-Description-Files.html" accesskey="n" rel="next">Device and Font Description Files</a>, Previous: <a href="File-Formats.html" accesskey="p" rel="prev">File Formats</a>, Up: <a href="File-Formats.html" accesskey="u" rel="up">File Formats</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="gtroff-Output-1">6.1 <code class="code">gtroff</code> Output</h3>
+<a class="index-entry-id" id="index-gtroff_002c-output"></a>
+<a class="index-entry-id" id="index-output_002c-gtroff"></a>
+
+<p>This section describes the <code class="code">groff</code> intermediate output format
+produced by GNU <code class="code">troff</code>.
+</p>
+<p>As <code class="code">groff</code> is a wrapper program around GNU <code class="code">troff</code> and
+automatically calls an output driver (or &ldquo;postprocessor&rdquo;), this output
+does not show up normally. This is why it is called
+<em class="emph">intermediate</em>. <code class="code">groff</code> provides the option <samp class="option">-Z</samp> to
+inhibit postprocessing such that the produced intermediate output is
+sent to standard output just as it is when calling GNU <code class="code">troff</code>
+directly.
+</p>
+<a class="index-entry-id" id="index-troff-output"></a>
+<a class="index-entry-id" id="index-output_002c-troff"></a>
+<a class="index-entry-id" id="index-intermediate-output"></a>
+<a class="index-entry-id" id="index-output_002c-intermediate"></a>
+<p>Here, the term <em class="dfn">troff output</em> describes what is output by
+GNU <code class="code">troff</code>, while <em class="dfn">intermediate output</em> refers to the language
+that is accepted by the parser that prepares this output for the output
+drivers. This parser handles whitespace more flexibly than
+<abbr class="acronym">AT&amp;T</abbr>&rsquo;s implementation and implements obsolete elements for
+compatibility; otherwise, both formats are the same.<a class="footnote" id="DOCF124" href="groff.html_fot.html#FOOT124"><sup>124</sup></a>
+</p>
+<p>The main purpose of the intermediate output concept is to facilitate the
+development of postprocessors by providing a common programming
+interface for all devices. It has a language of its own that is
+completely different from the <code class="code">gtroff</code> language. While the
+<code class="code">gtroff</code> language is a high-level programming language for text
+processing, the intermediate output language is a kind of low-level
+assembler language by specifying all positions on the page for writing
+and drawing.
+</p>
+<p>The intermediate output produced by <code class="code">gtroff</code> is fairly readable,
+while output from <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> is rather hard to
+understand because of strange habits that are still supported, but not
+used any longer by <code class="code">gtroff</code>.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="Language-Concepts.html" accesskey="1">Language Concepts</a></li>
+<li><a href="Command-Reference.html" accesskey="2">Command Reference</a></li>
+<li><a href="Intermediate-Output-Examples.html" accesskey="3">Intermediate Output Examples</a></li>
+<li><a href="Output-Language-Compatibility.html" accesskey="4">Output Language Compatibility</a></li>
+</ul>
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Device-and-Font-Description-Files.html">Device and Font Description Files</a>, Previous: <a href="File-Formats.html">File Formats</a>, Up: <a href="File-Formats.html">File Formats</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/if_002delse.html b/doc/groff.html.node/if_002delse.html
new file mode 100644
index 0000000..3c67fa9
--- /dev/null
+++ b/doc/groff.html.node/if_002delse.html
@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>if-else (The GNU Troff Manual)</title>
+
+<meta name="description" content="if-else (The GNU Troff Manual)">
+<meta name="keywords" content="if-else (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Conditionals-and-Loops.html" rel="up" title="Conditionals and Loops">
+<link href="while.html" rel="next" title="while">
+<link href="Operators-in-Conditionals.html" rel="prev" title="Operators in Conditionals">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="if_002delse">
+<div class="nav-panel">
+<p>
+Next: <a href="while.html" accesskey="n" rel="next">while</a>, Previous: <a href="Operators-in-Conditionals.html" accesskey="p" rel="prev">Operators in Conditionals</a>, Up: <a href="Conditionals-and-Loops.html" accesskey="u" rel="up">Conditionals and Loops</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="if_002delse-1">5.23.3 if-else</h4>
+<a class="index-entry-id" id="index-if_002delse"></a>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eie"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ie</code></strong> <var class="def-var-arguments">cond-expr anything</var><a class="copiable-link" href='#index-_002eie'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ie"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_002eel"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.el</code></strong> <var class="def-var-arguments">anything</var><a class="copiable-link" href='#index-_002eel'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-el"></a>
+<p>Use the <code class="code">ie</code> and <code class="code">el</code> requests to write an if-then-else. The
+first request is the &ldquo;if&rdquo; part and the latter is the &ldquo;else&rdquo; part.
+Unusually among programming languages, any number of non-conditional
+requests may be interposed between the <code class="code">ie</code> branch and the
+<code class="code">el</code> branch.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a 0
+.ie \na a is non-zero.
+.nr a +1
+.el a was not positive but is now \na.
+ &rArr; a was not positive but is now 1.
+</pre></div></div>
+
+<p>Another way in which <code class="code">el</code> is an ordinary request is that it does
+not lexically &ldquo;bind&rdquo; more tightly to its <code class="code">ie</code> counterpart than it
+does to any other request. This fact can surprise C programmers.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a 1
+.nr z 0
+.ie \nz \
+. ie \na a is true
+. el a is false
+.el z is false
+ error&rarr; warning: unbalanced 'el' request
+ &rArr; a is false
+</pre></div></div>
+
+<p>To conveniently nest conditionals, keep reading.
+</p>
+</dd></dl>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/if_002dthen.html b/doc/groff.html.node/if_002dthen.html
new file mode 100644
index 0000000..e2fba2b
--- /dev/null
+++ b/doc/groff.html.node/if_002dthen.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>if-then (The GNU Troff Manual)</title>
+
+<meta name="description" content="if-then (The GNU Troff Manual)">
+<meta name="keywords" content="if-then (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Conditionals-and-Loops.html" rel="up" title="Conditionals and Loops">
+<link href="if_002delse.html" rel="next" title="if-else">
+<link href="Operators-in-Conditionals.html" rel="prev" title="Operators in Conditionals">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="if_002dthen">
+<div class="nav-panel">
+<p>
+Next: <a href="if_002delse.html" accesskey="n" rel="next">if-else</a>, Previous: <a href="Operators-in-Conditionals.html" accesskey="p" rel="prev">Operators in Conditionals</a>, Up: <a href="Conditionals-and-Loops.html" accesskey="u" rel="up">Conditionals and Loops</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="if_002dthen-1">5.23.2 if-then</h4>
+<a class="index-entry-id" id="index-if_002dthen"></a>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eif"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.if</code></strong> <var class="def-var-arguments">cond-expr anything</var><a class="copiable-link" href='#index-_002eif'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-if"></a>
+<p>Evaluate the conditional expression <var class="var">cond-expr</var>, and if it evaluates
+true (or to a positive value), interpret the remainder of the line
+<var class="var">anything</var> as if it were an input line. Recall from <a class="ref" href="Invoking-Requests.html">Invoking Requests</a> that any quantity of spaces between arguments to requests
+serves only to separate them; leading spaces in <var class="var">anything</var> are thus
+not seen. <var class="var">anything</var> effectively <em class="emph">cannot</em> be omitted; if
+<var class="var">cond-expr</var> is true and <var class="var">anything</var> is empty, the newline at the
+end of the control line is interpreted as a blank input line (and
+therefore a blank text line).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">super\c
+tanker
+.nr force-word-break 1
+super\c
+.if ((\n[force-word-break] = 1) &amp; \n[.int])
+tanker
+ &rArr; supertanker super tanker
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enop"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nop</code></strong> <var class="def-var-arguments">anything</var><a class="copiable-link" href='#index-_002enop'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nop"></a>
+<p>Interpret <var class="var">anything</var> as if it were an input line. This is similar
+to &lsquo;<samp class="samp">.if&nbsp;1</samp>&rsquo;. <code class="code">nop</code> is not really &ldquo;no operation&rdquo;; its
+argument <em class="emph">is</em> processed&mdash;unconditionally. It can be used to cause
+text lines to share indentation with surrounding control lines.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.als real-MAC MAC
+.de wrapped-MAC
+. tm MAC: called with arguments \\$@
+. nop \\*[real-MAC]\\
+..
+.als MAC wrapped-MAC
+\# Later...
+.als MAC real-MAC
+</pre></div></div>
+
+<p>In the above, we&rsquo;ve used aliasing, <code class="code">nop</code>, and the interpolation of
+a macro as a string to interpose a wrapper around the macro &lsquo;<samp class="samp">MAC</samp>&rsquo;
+(perhaps to debug it).
+</p></dd></dl>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="if_002delse.html">if-else</a>, Previous: <a href="Operators-in-Conditionals.html">Operators in Conditionals</a>, Up: <a href="Conditionals-and-Loops.html">Conditionals and Loops</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/index.html b/doc/groff.html.node/index.html
new file mode 100644
index 0000000..d1b9973
--- /dev/null
+++ b/doc/groff.html.node/index.html
@@ -0,0 +1,453 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>Top (The GNU Troff Manual)</title>
+
+<meta name="description" content="Top (The GNU Troff Manual)">
+<meta name="keywords" content="Top (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="#Top" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="../dir_html/index.html" rel="up" title="(dir)">
+<link href="Introduction.html" rel="next" title="Introduction">
+<link href="../dir_html/index.html" rel="prev" title="(dir)">
+<style type="text/css">
+<!--
+ul.toc-numbered-mark {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<div class="top-level-extent" id="Top">
+<div class="nav-panel">
+<p>
+Next: <a href="Introduction.html" accesskey="n" rel="next">Introduction</a>, Previous: <a href="../dir_html/index.html" accesskey="p" rel="prev">(dir)</a>, Up: <a href="../dir_html/index.html" accesskey="u" rel="up">(dir)</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h1 class="top" id="GNU-troff">GNU <code class="code">troff</code></h1>
+
+
+<p>This manual documents GNU <code class="code">troff</code> version 1.23.0.
+</p>
+<p>Copyright &copy; 1994&ndash;2023 Free Software Foundation, Inc.
+</p>
+<blockquote class="quotation">
+<p>Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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 &ldquo;GNU Free
+Documentation License&rdquo;.
+</p></blockquote>
+
+
+
+
+
+<div class="element-contents" id="SEC_Contents">
+<h2 class="contents-heading">Table of Contents</h2>
+
+<div class="contents">
+
+<ul class="toc-numbered-mark">
+ <li><a id="toc-Introduction-1" href="Introduction.html">1 Introduction</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Background-1" href="Background.html">1.1 Background</a></li>
+ <li><a id="toc-What-Is-groff_003f-1" href="What-Is-groff_003f.html">1.2 What Is <code class="code">groff</code>?</a></li>
+ <li><a id="toc-groff-Capabilities-1" href="groff-Capabilities.html">1.3 <code class="code">groff</code> Capabilities</a></li>
+ <li><a id="toc-Macro-Packages-1" href="Macro-Package-Intro.html">1.4 Macro Packages</a></li>
+ <li><a id="toc-Preprocessors" href="Preprocessor-Intro.html">1.5 Preprocessors</a></li>
+ <li><a id="toc-Output-Devices" href="Output-Device-Intro.html">1.6 Output Devices</a></li>
+ <li><a id="toc-Installation-1" href="Installation.html">1.7 Installation</a></li>
+ <li><a id="toc-Conventions-Used-in-This-Manual-1" href="Conventions-Used-in-This-Manual.html">1.8 Conventions Used in This Manual</a></li>
+ <li><a id="toc-Credits-1" href="Credits.html">1.9 Credits</a></li>
+ </ul></li>
+ <li><a id="toc-Invoking-groff-1" href="Invoking-groff.html">2 Invoking <code class="code">groff</code></a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Options" href="Groff-Options.html">2.1 Options</a></li>
+ <li><a id="toc-Environment-1" href="Environment.html">2.2 Environment</a></li>
+ <li><a id="toc-Macro-Directories-1" href="Macro-Directories.html">2.3 Macro Directories</a></li>
+ <li><a id="toc-Font-Directories-1" href="Font-Directories.html">2.4 Font Directories</a></li>
+ <li><a id="toc-Paper-Format-1" href="Paper-Format.html">2.5 Paper Format</a></li>
+ <li><a id="toc-Invocation-Examples-1" href="Invocation-Examples.html">2.6 Invocation Examples</a></li>
+ </ul></li>
+ <li><a id="toc-Tutorial-for-Macro-Users-1" href="Tutorial-for-Macro-Users.html">3 Tutorial for Macro Users</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Basics-1" href="Basics.html">3.1 Basics</a></li>
+ <li><a id="toc-Common-Features-1" href="Common-Features.html">3.2 Common Features</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Paragraphs-1" href="Paragraphs.html">3.2.1 Paragraphs</a></li>
+ <li><a id="toc-Sections-and-Chapters-1" href="Sections-and-Chapters.html">3.2.2 Sections and Chapters</a></li>
+ <li><a id="toc-Headers-and-Footers-1" href="Headers-and-Footers.html">3.2.3 Headers and Footers</a></li>
+ <li><a id="toc-Page-Layout-1" href="Page-Layout-Adjustment.html">3.2.4 Page Layout</a></li>
+ <li><a id="toc-Displays-and-Keeps-1" href="Displays-and-Keeps.html">3.2.5 Displays and Keeps</a></li>
+ <li><a id="toc-Footnotes-and-Endnotes-1" href="Footnotes-and-Endnotes.html">3.2.6 Footnotes and Endnotes</a></li>
+ <li><a id="toc-Table-of-Contents-1" href="Table-of-Contents.html">3.2.7 Table of Contents</a></li>
+ <li><a id="toc-Indexing-1" href="Indexing.html">3.2.8 Indexing</a></li>
+ <li><a id="toc-Document-Formats-1" href="Document-Formats.html">3.2.9 Document Formats</a></li>
+ <li><a id="toc-Columnation-1" href="Columnation.html">3.2.10 Columnation</a></li>
+ <li><a id="toc-Font-and-Size-Changes-1" href="Font-and-Size-Changes.html">3.2.11 Font and Size Changes</a></li>
+ <li><a id="toc-Predefined-Text-1" href="Predefined-Text.html">3.2.12 Predefined Text</a></li>
+ <li><a id="toc-Preprocessor-Support-1" href="Preprocessor-Support.html">3.2.13 Preprocessor Support</a></li>
+ <li><a id="toc-Configuration-and-Customization-1" href="Configuration-and-Customization.html">3.2.14 Configuration and Customization</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="toc-Macro-Packages-2" href="Major-Macro-Packages.html">4 Macro Packages</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-man-1" href="man.html">4.1 <samp class="file">man</samp></a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Optional-man-extensions-1" href="Optional-man-extensions.html">4.1.1 Optional <samp class="file">man</samp> extensions</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Custom-headers-and-footers" href="Optional-man-extensions.html#Custom-headers-and-footers">Custom headers and footers</a></li>
+ <li><a id="toc-Ultrix_002dspecific-man-macros" href="Optional-man-extensions.html#Ultrix_002dspecific-man-macros">Ultrix-specific man macros</a></li>
+ <li><a id="toc-Simple-example" href="Optional-man-extensions.html#Simple-example">Simple example</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="toc-mdoc-1" href="mdoc.html">4.2 <samp class="file">mdoc</samp></a></li>
+ <li><a id="toc-me-1" href="me.html">4.3 <samp class="file">me</samp></a></li>
+ <li><a id="toc-mm-1" href="mm.html">4.4 <samp class="file">mm</samp></a></li>
+ <li><a id="toc-mom-1" href="mom.html">4.5 <samp class="file">mom</samp></a></li>
+ <li><a id="toc-ms-1" href="ms.html">4.6 <samp class="file">ms</samp></a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Introduction-2" href="ms-Introduction.html">4.6.1 Introduction</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Basic-information" href="ms-basic-information.html">4.6.1.1 Basic information</a></li>
+ </ul></li>
+ <li><a id="toc-Document-Structure" href="ms-Document-Structure.html">4.6.2 Document Structure</a></li>
+ <li><a id="toc-Document-Control-Settings" href="ms-Document-Control-Settings.html">4.6.3 Document Control Settings</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Margin-settings" href="ms-Document-Control-Settings.html#Margin-settings">Margin settings</a></li>
+ <li><a id="toc-Titles-_0028headers_002c-footers_0029" href="ms-Document-Control-Settings.html#Titles-_0028headers_002c-footers_0029">Titles (headers, footers)</a></li>
+ <li><a id="toc-Text-settings" href="ms-Document-Control-Settings.html#Text-settings">Text settings</a></li>
+ <li><a id="toc-Paragraph-settings" href="ms-Document-Control-Settings.html#Paragraph-settings">Paragraph settings</a></li>
+ <li><a id="toc-Heading-settings" href="ms-Document-Control-Settings.html#Heading-settings">Heading settings</a></li>
+ <li><a id="toc-Footnote-settings" href="ms-Document-Control-Settings.html#Footnote-settings">Footnote settings</a></li>
+ <li><a id="toc-Display-settings" href="ms-Document-Control-Settings.html#Display-settings">Display settings</a></li>
+ <li><a id="toc-Other-settings" href="ms-Document-Control-Settings.html#Other-settings">Other settings</a></li>
+ </ul></li>
+ <li><a id="toc-Document-Description-Macros" href="ms-Document-Description-Macros.html">4.6.4 Document Description Macros</a></li>
+ <li><a id="toc-Body-Text" href="ms-Body-Text.html">4.6.5 Body Text</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Text-settings-1" href="Text-settings-in-ms.html">4.6.5.1 Text settings</a></li>
+ <li><a id="toc-Typographical-symbols" href="Typographical-symbols-in-ms.html">4.6.5.2 Typographical symbols</a></li>
+ <li><a id="toc-Paragraphs-2" href="Paragraphs-in-ms.html">4.6.5.3 Paragraphs</a></li>
+ <li><a id="toc-Headings" href="Headings-in-ms.html">4.6.5.4 Headings</a></li>
+ <li><a id="toc-Typeface-and-decoration-1" href="Typeface-and-decoration.html">4.6.5.5 Typeface and decoration</a></li>
+ <li><a id="toc-Lists" href="Lists-in-ms.html">4.6.5.6 Lists</a></li>
+ <li><a id="toc-Indented-regions" href="Indented-regions-in-ms.html">4.6.5.7 Indented regions</a></li>
+ <li><a id="toc-Keeps_002c-boxed-keeps_002c-and-displays" href="ms-keeps-and-displays.html">4.6.5.8 Keeps, boxed keeps, and displays</a></li>
+ <li><a id="toc-Tables_002c-figures_002c-equations_002c-and-references" href="ms-Insertions.html">4.6.5.9 Tables, figures, equations, and references</a></li>
+ <li><a id="toc-Footnotes" href="ms-Footnotes.html">4.6.5.10 Footnotes</a></li>
+ <li><a id="toc-Language-and-localization" href="ms-language-and-localization.html">4.6.5.11 Language and localization</a></li>
+ </ul></li>
+ <li><a id="toc-Page-layout" href="ms-Page-Layout.html">4.6.6 Page layout</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Headers-and-footers" href="ms-Headers-and-Footers.html">4.6.6.1 Headers and footers</a></li>
+ <li><a id="toc-Tab-stops" href="Tab-Stops-in-ms.html">4.6.6.2 Tab stops</a></li>
+ <li><a id="toc-Margins" href="ms-Margins.html">4.6.6.3 Margins</a></li>
+ <li><a id="toc-Multiple-columns" href="ms-Multiple-Columns.html">4.6.6.4 Multiple columns</a></li>
+ <li><a id="toc-Creating-a-table-of-contents" href="ms-TOC.html">4.6.6.5 Creating a table of contents</a></li>
+ </ul></li>
+ <li><a id="toc-Differences-from-AT_0026T-ms-1" href="Differences-from-AT_0026T-ms.html">4.6.7 Differences from <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp></a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Unix-Version-7-ms-macros-not-implemented-by-groff-ms" href="Missing-Unix-Version-7-ms-Macros.html">4.6.7.1 Unix Version 7 <samp class="file">ms</samp> macros not implemented by <code class="code">groff</code> <samp class="file">ms</samp></a></li>
+ </ul></li>
+ <li><a id="toc-Legacy-Features" href="ms-Legacy-Features.html">4.6.8 Legacy Features</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-AT_0026T-accent-mark-strings" href="ms-Legacy-Features.html#AT_0026T-accent-mark-strings">AT&amp;T accent mark strings</a></li>
+ <li><a id="toc-Berkeley-accent-mark-and-glyph-strings" href="ms-Legacy-Features.html#Berkeley-accent-mark-and-glyph-strings">Berkeley accent mark and glyph strings</a></li>
+ </ul></li>
+ <li><a id="toc-Naming-Conventions" href="ms-Naming-Conventions.html">4.6.9 Naming Conventions</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="toc-GNU-troff-Reference-1" href="GNU-troff-Reference.html">5 GNU <code class="code">troff</code> Reference</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Text-1" href="Text.html">5.1 Text</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Filling-1" href="Filling.html">5.1.1 Filling</a></li>
+ <li><a id="toc-Sentences-1" href="Sentences.html">5.1.2 Sentences</a></li>
+ <li><a id="toc-Hyphenation-1" href="Hyphenation.html">5.1.3 Hyphenation</a></li>
+ <li><a id="toc-Breaking-1" href="Breaking.html">5.1.4 Breaking</a></li>
+ <li><a id="toc-Adjustment-1" href="Adjustment.html">5.1.5 Adjustment</a></li>
+ <li><a id="toc-Tabs-and-Leaders-1" href="Tabs-and-Leaders.html">5.1.6 Tabs and Leaders</a></li>
+ <li><a id="toc-Requests-and-Macros-1" href="Requests-and-Macros.html">5.1.7 Requests and Macros</a></li>
+ <li><a id="toc-Macro-Packages-3" href="Macro-Packages.html">5.1.8 Macro Packages</a></li>
+ <li><a id="toc-Input-Encodings-1" href="Input-Encodings.html">5.1.9 Input Encodings</a></li>
+ <li><a id="toc-Input-Conventions-1" href="Input-Conventions.html">5.1.10 Input Conventions</a></li>
+ </ul></li>
+ <li><a id="toc-Page-Geometry-1" href="Page-Geometry.html">5.2 Page Geometry</a></li>
+ <li><a id="toc-Measurements-1" href="Measurements.html">5.3 Measurements</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Motion-Quanta-1" href="Motion-Quanta.html">5.3.1 Motion Quanta</a></li>
+ <li><a id="toc-Default-Units-1" href="Default-Units.html">5.3.2 Default Units</a></li>
+ </ul></li>
+ <li><a id="toc-Numeric-Expressions-1" href="Numeric-Expressions.html">5.4 Numeric Expressions</a></li>
+ <li><a id="toc-Identifiers-1" href="Identifiers.html">5.5 Identifiers</a></li>
+ <li><a id="toc-Formatter-Instructions-1" href="Formatter-Instructions.html">5.6 Formatter Instructions</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Control-Characters-1" href="Control-Characters.html">5.6.1 Control Characters</a></li>
+ <li><a id="toc-Invoking-Requests-1" href="Invoking-Requests.html">5.6.2 Invoking Requests</a></li>
+ <li><a id="toc-Calling-Macros-1" href="Calling-Macros.html">5.6.3 Calling Macros</a></li>
+ <li><a id="toc-Using-Escape-Sequences-1" href="Using-Escape-Sequences.html">5.6.4 Using Escape Sequences</a></li>
+ <li><a id="toc-Delimiters-1" href="Delimiters.html">5.6.5 Delimiters</a></li>
+ </ul></li>
+ <li><a id="toc-Comments-1" href="Comments.html">5.7 Comments</a></li>
+ <li><a id="toc-Registers-1" href="Registers.html">5.8 Registers</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Setting-Registers-1" href="Setting-Registers.html">5.8.1 Setting Registers</a></li>
+ <li><a id="toc-Interpolating-Registers-1" href="Interpolating-Registers.html">5.8.2 Interpolating Registers</a></li>
+ <li><a id="toc-Auto_002dincrement-1" href="Auto_002dincrement.html">5.8.3 Auto-increment</a></li>
+ <li><a id="toc-Assigning-Register-Formats-1" href="Assigning-Register-Formats.html">5.8.4 Assigning Register Formats</a></li>
+ <li><a id="toc-Built_002din-Registers-1" href="Built_002din-Registers.html">5.8.5 Built-in Registers</a></li>
+ </ul></li>
+ <li><a id="toc-Manipulating-Filling-and-Adjustment-1" href="Manipulating-Filling-and-Adjustment.html">5.9 Manipulating Filling and Adjustment</a></li>
+ <li><a id="toc-Manipulating-Hyphenation-1" href="Manipulating-Hyphenation.html">5.10 Manipulating Hyphenation</a></li>
+ <li><a id="toc-Manipulating-Spacing-1" href="Manipulating-Spacing.html">5.11 Manipulating Spacing</a></li>
+ <li><a id="toc-Tabs-and-Fields-1" href="Tabs-and-Fields.html">5.12 Tabs and Fields</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Leaders-1" href="Leaders.html">5.12.1 Leaders</a></li>
+ <li><a id="toc-Fields-1" href="Fields.html">5.12.2 Fields</a></li>
+ </ul></li>
+ <li><a id="toc-Character-Translations-1" href="Character-Translations.html">5.13 Character Translations</a></li>
+ <li><a id="toc-troff-and-nroff-Modes-1" href="troff-and-nroff-Modes.html">5.14 <code class="code">troff</code> and <code class="code">nroff</code> Modes</a></li>
+ <li><a id="toc-Line-Layout-1" href="Line-Layout.html">5.15 Line Layout</a></li>
+ <li><a id="toc-Line-Continuation-1" href="Line-Continuation.html">5.16 Line Continuation</a></li>
+ <li><a id="toc-Page-Layout-2" href="Page-Layout.html">5.17 Page Layout</a></li>
+ <li><a id="toc-Page-Control-1" href="Page-Control.html">5.18 Page Control</a></li>
+ <li><a id="toc-Using-Fonts-1" href="Using-Fonts.html">5.19 Using Fonts</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Selecting-Fonts-1" href="Selecting-Fonts.html">5.19.1 Selecting Fonts</a></li>
+ <li><a id="toc-Font-Families-1" href="Font-Families.html">5.19.2 Font Families</a></li>
+ <li><a id="toc-Font-Positions-1" href="Font-Positions.html">5.19.3 Font Positions</a></li>
+ <li><a id="toc-Using-Symbols-1" href="Using-Symbols.html">5.19.4 Using Symbols</a></li>
+ <li><a id="toc-Character-Classes-1" href="Character-Classes.html">5.19.5 Character Classes</a></li>
+ <li><a id="toc-Special-Fonts-1" href="Special-Fonts.html">5.19.6 Special Fonts</a></li>
+ <li><a id="toc-Artificial-Fonts-1" href="Artificial-Fonts.html">5.19.7 Artificial Fonts</a></li>
+ <li><a id="toc-Ligatures-and-Kerning-1" href="Ligatures-and-Kerning.html">5.19.8 Ligatures and Kerning</a></li>
+ <li><a id="toc-Italic-Corrections-1" href="Italic-Corrections.html">5.19.9 Italic Corrections</a></li>
+ <li><a id="toc-Dummy-Characters-1" href="Dummy-Characters.html">5.19.10 Dummy Characters</a></li>
+ </ul></li>
+ <li><a id="toc-Manipulating-Type-Size-and-Vertical-Spacing-1" href="Manipulating-Type-Size-and-Vertical-Spacing.html">5.20 Manipulating Type Size and Vertical Spacing</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Changing-the-Type-Size-1" href="Changing-the-Type-Size.html">5.20.1 Changing the Type Size</a></li>
+ <li><a id="toc-Changing-the-Vertical-Spacing-1" href="Changing-the-Vertical-Spacing.html">5.20.2 Changing the Vertical Spacing</a></li>
+ <li><a id="toc-Using-Fractional-Type-Sizes-1" href="Using-Fractional-Type-Sizes.html">5.20.3 Using Fractional Type Sizes</a></li>
+ </ul></li>
+ <li><a id="toc-Colors-1" href="Colors.html">5.21 Colors</a></li>
+ <li><a id="toc-Strings-1" href="Strings.html">5.22 Strings</a></li>
+ <li><a id="toc-Conditionals-and-Loops-1" href="Conditionals-and-Loops.html">5.23 Conditionals and Loops</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Operators-in-Conditionals-1" href="Operators-in-Conditionals.html">5.23.1 Operators in Conditionals</a></li>
+ <li><a id="toc-if_002dthen-1" href="if_002dthen.html">5.23.2 if-then</a></li>
+ <li><a id="toc-if_002delse-1" href="if_002delse.html">5.23.3 if-else</a></li>
+ <li><a id="toc-Conditional-Blocks-1" href="Conditional-Blocks.html">5.23.4 Conditional Blocks</a></li>
+ <li><a id="toc-while-1" href="while.html">5.23.5 while</a></li>
+ </ul></li>
+ <li><a id="toc-Writing-Macros-1" href="Writing-Macros.html">5.24 Writing Macros</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Parameters-1" href="Parameters.html">5.24.1 Parameters</a></li>
+ <li><a id="toc-Copy-Mode-1" href="Copy-Mode.html">5.24.2 Copy Mode</a></li>
+ </ul></li>
+ <li><a id="toc-Page-Motions-1" href="Page-Motions.html">5.25 Page Motions</a></li>
+ <li><a id="toc-Drawing-Geometric-Objects-1" href="Drawing-Geometric-Objects.html">5.26 Drawing Geometric Objects</a></li>
+ <li><a id="toc-Deferring-Output-1" href="Deferring-Output.html">5.27 Deferring Output</a></li>
+ <li><a id="toc-Traps-1" href="Traps.html">5.28 Traps</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Vertical-Position-Traps-1" href="Vertical-Position-Traps.html">5.28.1 Vertical Position Traps</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Page-Location-Traps-1" href="Page-Location-Traps.html">5.28.1.1 Page Location Traps</a></li>
+ <li><a id="toc-The-Implicit-Page-Trap-1" href="The-Implicit-Page-Trap.html">5.28.1.2 The Implicit Page Trap</a></li>
+ <li><a id="toc-Diversion-Traps-1" href="Diversion-Traps.html">5.28.1.3 Diversion Traps</a></li>
+ </ul></li>
+ <li><a id="toc-Input-Line-Traps-1" href="Input-Line-Traps.html">5.28.2 Input Line Traps</a></li>
+ <li><a id="toc-Blank-Line-Traps-1" href="Blank-Line-Traps.html">5.28.3 Blank Line Traps</a></li>
+ <li><a id="toc-Leading-Space-Traps-1" href="Leading-Space-Traps.html">5.28.4 Leading Space Traps</a></li>
+ <li><a id="toc-End_002dof_002dinput-Traps-1" href="End_002dof_002dinput-Traps.html">5.28.5 End-of-input Traps</a></li>
+ </ul></li>
+ <li><a id="toc-Diversions-1" href="Diversions.html">5.29 Diversions</a></li>
+ <li><a id="toc-Punning-Names-1" href="Punning-Names.html">5.30 Punning Names</a></li>
+ <li><a id="toc-Environments-1" href="Environments.html">5.31 Environments</a></li>
+ <li><a id="toc-Suppressing-Output-1" href="Suppressing-Output.html">5.32 Suppressing Output</a></li>
+ <li><a id="toc-I_002fO-1" href="I_002fO.html">5.33 I/O</a></li>
+ <li><a id="toc-Postprocessor-Access-1" href="Postprocessor-Access.html">5.34 Postprocessor Access</a></li>
+ <li><a id="toc-Miscellaneous-1" href="Miscellaneous.html">5.35 Miscellaneous</a></li>
+ <li><a id="toc-gtroff-Internals" href="Gtroff-Internals.html">5.36 <code class="code">gtroff</code> Internals</a></li>
+ <li><a id="toc-Debugging-1" href="Debugging.html">5.37 Debugging</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Warnings-1" href="Warnings.html">5.37.1 Warnings</a></li>
+ </ul></li>
+ <li><a id="toc-Implementation-Differences-1" href="Implementation-Differences.html">5.38 Implementation Differences</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Safer-Mode-1" href="Safer-Mode.html">5.38.1 Safer Mode</a></li>
+ <li><a id="toc-Compatibility-Mode-1" href="Compatibility-Mode.html">5.38.2 Compatibility Mode</a></li>
+ <li><a id="toc-Other-Differences-1" href="Other-Differences.html">5.38.3 Other Differences</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="toc-File-Formats-1" href="File-Formats.html">6 File Formats</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-gtroff-Output-1" href="gtroff-Output.html">6.1 <code class="code">gtroff</code> Output</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Language-Concepts-1" href="Language-Concepts.html">6.1.1 Language Concepts</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Separation-1" href="Separation.html">6.1.1.1 Separation</a></li>
+ <li><a id="toc-Argument-Units-1" href="Argument-Units.html">6.1.1.2 Argument Units</a></li>
+ <li><a id="toc-Document-Parts-1" href="Document-Parts.html">6.1.1.3 Document Parts</a></li>
+ </ul></li>
+ <li><a id="toc-Command-Reference-1" href="Command-Reference.html">6.1.2 Command Reference</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-Comment-Command-1" href="Comment-Command.html">6.1.2.1 Comment Command</a></li>
+ <li><a id="toc-Simple-Commands-1" href="Simple-Commands.html">6.1.2.2 Simple Commands</a></li>
+ <li><a id="toc-Graphics-Commands-1" href="Graphics-Commands.html">6.1.2.3 Graphics Commands</a></li>
+ <li><a id="toc-Device-Control-Commands-1" href="Device-Control-Commands.html">6.1.2.4 Device Control Commands</a></li>
+ <li><a id="toc-Obsolete-Command-1" href="Obsolete-Command.html">6.1.2.5 Obsolete Command</a></li>
+ </ul></li>
+ <li><a id="toc-Intermediate-Output-Examples-1" href="Intermediate-Output-Examples.html">6.1.3 Intermediate Output Examples</a></li>
+ <li><a id="toc-Output-Language-Compatibility-1" href="Output-Language-Compatibility.html">6.1.4 Output Language Compatibility</a></li>
+ </ul></li>
+ <li><a id="toc-Device-and-Font-Description-Files-1" href="Device-and-Font-Description-Files.html">6.2 Device and Font Description Files</a>
+ <ul class="toc-numbered-mark">
+ <li><a id="toc-DESC-File-Format-1" href="DESC-File-Format.html">6.2.1 <samp class="file">DESC</samp> File Format</a></li>
+ <li><a id="toc-Font-Description-File-Format-1" href="Font-Description-File-Format.html">6.2.2 Font Description File Format</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="toc-Copying-This-Manual-1" href="Copying-This-Manual.html">Appendix A Copying This Manual</a></li>
+ <li><a id="toc-Request-Index-1" href="Request-Index.html" rel="index">Appendix B Request Index</a></li>
+ <li><a id="toc-Escape-Sequence-Index-1" href="Escape-Sequence-Index.html" rel="index">Appendix C Escape Sequence Index</a></li>
+ <li><a id="toc-Operator-Index-1" href="Operator-Index.html" rel="index">Appendix D Operator Index</a></li>
+ <li><a id="toc-Register-Index-1" href="Register-Index.html" rel="index">Appendix E Register Index</a></li>
+ <li><a id="toc-Macro-Index-1" href="Macro-Index.html" rel="index">Appendix F Macro Index</a></li>
+ <li><a id="toc-String-Index-1" href="String-Index.html" rel="index">Appendix G String Index</a></li>
+ <li><a id="toc-File-Keyword-Index-1" href="File-Keyword-Index.html" rel="index">Appendix H File Keyword Index</a></li>
+ <li><a id="toc-Program-and-File-Index-1" href="Program-and-File-Index.html" rel="index">Appendix I Program and File Index</a></li>
+ <li><a id="toc-Concept-Index-1" href="Concept-Index.html" rel="index">Appendix J Concept Index</a></li>
+</ul>
+</div>
+</div>
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Introduction.html" accesskey="n" rel="next">Introduction</a>, Previous: <a href="../dir_html/index.html" accesskey="p" rel="prev">(dir)</a>, Up: <a href="../dir_html/index.html" accesskey="u" rel="up">(dir)</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/man.html b/doc/groff.html.node/man.html
new file mode 100644
index 0000000..93ec854
--- /dev/null
+++ b/doc/groff.html.node/man.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>man (The GNU Troff Manual)</title>
+
+<meta name="description" content="man (The GNU Troff Manual)">
+<meta name="keywords" content="man (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Major-Macro-Packages.html" rel="up" title="Major Macro Packages">
+<link href="mdoc.html" rel="next" title="mdoc">
+<link href="Major-Macro-Packages.html" rel="prev" title="Major Macro Packages">
+<style type="text/css">
+<!--
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="man">
+<div class="nav-panel">
+<p>
+Next: <a href="mdoc.html" accesskey="n" rel="next"><samp class="file">mdoc</samp></a>, Previous: <a href="Major-Macro-Packages.html" accesskey="p" rel="prev">Macro Packages</a>, Up: <a href="Major-Macro-Packages.html" accesskey="u" rel="up">Macro Packages</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="man-1">4.1 <samp class="file">man</samp></h3>
+<a class="index-entry-id" id="index-manual-pages"></a>
+<a class="index-entry-id" id="index-man-pages"></a>
+<a class="index-entry-id" id="index-an_002etmac"></a>
+<a class="index-entry-id" id="index-man_002etmac"></a>
+
+<p>The <code class="code">man</code> macro package is the most widely used and probably the
+most important ever developed for <code class="code">troff</code>. It is easy to use, and
+a vast majority of manual pages (&ldquo;man pages&rdquo;) are written in it.
+</p>
+<p><code class="code">groff</code>&rsquo;s implementation is documented in the
+<cite class="cite">groff_man<span class="r">(7)</span></cite> man page. Type &lsquo;<samp class="samp">man groff_man</samp>&rsquo; at the
+command line to view it.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="Optional-man-extensions.html" accesskey="1">Optional <samp class="file">man</samp> extensions</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/mdoc.html b/doc/groff.html.node/mdoc.html
new file mode 100644
index 0000000..d752098
--- /dev/null
+++ b/doc/groff.html.node/mdoc.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>mdoc (The GNU Troff Manual)</title>
+
+<meta name="description" content="mdoc (The GNU Troff Manual)">
+<meta name="keywords" content="mdoc (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Major-Macro-Packages.html" rel="up" title="Major Macro Packages">
+<link href="me.html" rel="next" title="me">
+<link href="man.html" rel="prev" title="man">
+<style type="text/css">
+<!--
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="mdoc">
+<div class="nav-panel">
+<p>
+Next: <a href="me.html" accesskey="n" rel="next"><samp class="file">me</samp></a>, Previous: <a href="man.html" accesskey="p" rel="prev"><samp class="file">man</samp></a>, Up: <a href="Major-Macro-Packages.html" accesskey="u" rel="up">Macro Packages</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="mdoc-1">4.2 <samp class="file">mdoc</samp></h3>
+<a class="index-entry-id" id="index-mdoc-macros"></a>
+
+<p><code class="code">groff</code>&rsquo;s implementation of the BSD <samp class="file">doc</samp> package for man
+pages is documented in the <cite class="cite">groff_mdoc<span class="r">(7)</span></cite> man page. Type
+&lsquo;<samp class="samp">man groff_mdoc</samp>&rsquo; at the command line to view it.
+</p>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/me.html b/doc/groff.html.node/me.html
new file mode 100644
index 0000000..35da9f2
--- /dev/null
+++ b/doc/groff.html.node/me.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>me (The GNU Troff Manual)</title>
+
+<meta name="description" content="me (The GNU Troff Manual)">
+<meta name="keywords" content="me (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Major-Macro-Packages.html" rel="up" title="Major Macro Packages">
+<link href="mm.html" rel="next" title="mm">
+<link href="mdoc.html" rel="prev" title="mdoc">
+<style type="text/css">
+<!--
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="me">
+<div class="nav-panel">
+<p>
+Next: <a href="mm.html" accesskey="n" rel="next"><samp class="file">mm</samp></a>, Previous: <a href="mdoc.html" accesskey="p" rel="prev"><samp class="file">mdoc</samp></a>, Up: <a href="Major-Macro-Packages.html" accesskey="u" rel="up">Macro Packages</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="me-1">4.3 <samp class="file">me</samp></h3>
+<a class="index-entry-id" id="index-me-macro-package"></a>
+
+<p><code class="code">groff</code>&rsquo;s implementation of the BSD <samp class="file">me</samp> macro package is
+documented using itself. A tutorial, <samp class="file">meintro.me</samp>, and reference,
+<samp class="file">meref.me</samp>, are available in <code class="code">groff</code>&rsquo;s documentation
+directory. A <cite class="cite">groff_me<span class="r">(7)</span></cite> man page is also available and
+identifies the installation path for these documents. Type &lsquo;<samp class="samp">man
+groff_me</samp>&rsquo; at the command line to view it.
+</p>
+<p>A French translation of the tutorial is available as
+<samp class="file">meintro_fr.me</samp> and installed parallel to the English version.
+</p>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/mm.html b/doc/groff.html.node/mm.html
new file mode 100644
index 0000000..38dc3b9
--- /dev/null
+++ b/doc/groff.html.node/mm.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>mm (The GNU Troff Manual)</title>
+
+<meta name="description" content="mm (The GNU Troff Manual)">
+<meta name="keywords" content="mm (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Major-Macro-Packages.html" rel="up" title="Major Macro Packages">
+<link href="mom.html" rel="next" title="mom">
+<link href="me.html" rel="prev" title="me">
+<style type="text/css">
+<!--
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="mm">
+<div class="nav-panel">
+<p>
+Next: <a href="mom.html" accesskey="n" rel="next"><samp class="file">mom</samp></a>, Previous: <a href="me.html" accesskey="p" rel="prev"><samp class="file">me</samp></a>, Up: <a href="Major-Macro-Packages.html" accesskey="u" rel="up">Macro Packages</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="mm-1">4.4 <samp class="file">mm</samp></h3>
+<a class="index-entry-id" id="index-mm-macro-package"></a>
+
+<p><code class="code">groff</code>&rsquo;s implementation of the <abbr class="acronym">AT&amp;T</abbr> memorandum macro
+package is documented in the <cite class="cite">groff_mm<span class="r">(7)</span></cite> man page. Type
+&lsquo;<samp class="samp">man groff_mm</samp>&rsquo; at the command line) to view it.
+</p>
+<p>A Swedish localization of <samp class="file">mm</samp> is also available; see
+<cite class="cite">groff_mmse<span class="r">(7)</span></cite>.
+</p>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/mom.html b/doc/groff.html.node/mom.html
new file mode 100644
index 0000000..6d0840d
--- /dev/null
+++ b/doc/groff.html.node/mom.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>mom (The GNU Troff Manual)</title>
+
+<meta name="description" content="mom (The GNU Troff Manual)">
+<meta name="keywords" content="mom (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Major-Macro-Packages.html" rel="up" title="Major Macro Packages">
+<link href="ms.html" rel="next" title="ms">
+<link href="mm.html" rel="prev" title="mm">
+<style type="text/css">
+<!--
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+ul.mark-bullet {list-style-type: disc}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="mom">
+<div class="nav-panel">
+<p>
+Next: <a href="ms.html" accesskey="n" rel="next"><samp class="file">ms</samp></a>, Previous: <a href="mm.html" accesskey="p" rel="prev"><samp class="file">mm</samp></a>, Up: <a href="Major-Macro-Packages.html" accesskey="u" rel="up">Macro Packages</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="mom-1">4.5 <samp class="file">mom</samp></h3>
+<a class="index-entry-id" id="index-mom-macro-package"></a>
+
+<p>The main documentation files for the <samp class="file">mom</samp> macros are in
+<abbr class="acronym">HTML</abbr> format. Additional, useful documentation is in
+<abbr class="acronym">PDF</abbr> format. See the <cite class="cite">groff<span class="r">(1)</span></cite> man page, section
+&ldquo;Installation Directories&rdquo;, for their location.
+</p>
+<ul class="itemize mark-bullet">
+<li><samp class="file">toc.html</samp>
+Entry point to the full mom manual.
+
+</li><li><samp class="file">macrolist.html</samp>
+Hyperlinked index of macros with brief descriptions, arranged by
+category.
+
+</li><li><samp class="file">mom-pdf.pdf</samp>
+<abbr class="acronym">PDF</abbr> features and usage.
+</li></ul>
+
+<p>The mom macros are in active development between <code class="code">groff</code> releases.
+The most recent version, along with up-to-date documentation, is
+available at <a class="uref" href="http://www.schaffter.ca/mom/mom-05.html">http://www.schaffter.ca/mom/mom-05.html</a>.
+</p>
+<p>The <cite class="cite">groff_mom<span class="r">(7)</span></cite> man page (type &lsquo;<samp class="samp">man groff_mom</samp>&rsquo; at
+the command line) contains a partial list of available macros, however
+their usage is best understood by consulting the <abbr class="acronym">HTML</abbr>
+documentation.
+</p>
+
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/ms-Body-Text.html b/doc/groff.html.node/ms-Body-Text.html
new file mode 100644
index 0000000..f2d370b
--- /dev/null
+++ b/doc/groff.html.node/ms-Body-Text.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>ms Body Text (The GNU Troff Manual)</title>
+
+<meta name="description" content="ms Body Text (The GNU Troff Manual)">
+<meta name="keywords" content="ms Body Text (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms.html" rel="up" title="ms">
+<link href="ms-Page-Layout.html" rel="next" title="ms Page Layout">
+<link href="ms-Document-Description-Macros.html" rel="prev" title="ms Document Description Macros">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="ms-Body-Text">
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Page-Layout.html" accesskey="n" rel="next">Page layout</a>, Previous: <a href="ms-Document-Description-Macros.html" accesskey="p" rel="prev">Document Description Macros</a>, Up: <a href="ms.html" accesskey="u" rel="up"><samp class="file">ms</samp></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Body-Text">4.6.5 Body Text</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-body-text"></a>
+
+<p>A variety of macros, registers, and strings can be used to structure and
+style the body of your document. They organize your text into
+paragraphs, headings, footnotes, and inclusions of material such as
+tables and figures.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="Text-settings-in-ms.html" accesskey="1">Text settings</a></li>
+<li><a href="Typographical-symbols-in-ms.html" accesskey="2">Typographical symbols</a></li>
+<li><a href="Paragraphs-in-ms.html" accesskey="3">Paragraphs</a></li>
+<li><a href="Headings-in-ms.html" accesskey="4">Headings</a></li>
+<li><a href="Typeface-and-decoration.html" accesskey="5">Typeface and decoration</a></li>
+<li><a href="Lists-in-ms.html" accesskey="6">Lists</a></li>
+<li><a href="Indented-regions-in-ms.html" accesskey="7">Indented regions</a></li>
+<li><a href="ms-keeps-and-displays.html" accesskey="8">Keeps, boxed keeps, and displays</a></li>
+<li><a href="ms-Insertions.html" accesskey="9">Tables, figures, equations, and references</a></li>
+<li><a href="ms-Footnotes.html">Footnotes</a></li>
+<li><a href="ms-language-and-localization.html">Language and localization</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/ms-Document-Control-Settings.html b/doc/groff.html.node/ms-Document-Control-Settings.html
new file mode 100644
index 0000000..ef8f2a4
--- /dev/null
+++ b/doc/groff.html.node/ms-Document-Control-Settings.html
@@ -0,0 +1,524 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>ms Document Control Settings (The GNU Troff Manual)</title>
+
+<meta name="description" content="ms Document Control Settings (The GNU Troff Manual)">
+<meta name="keywords" content="ms Document Control Settings (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms.html" rel="up" title="ms">
+<link href="ms-Document-Description-Macros.html" rel="next" title="ms Document Description Macros">
+<link href="ms-Document-Structure.html" rel="prev" title="ms Document Structure">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="ms-Document-Control-Settings">
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Document-Description-Macros.html" accesskey="n" rel="next">Document Description Macros</a>, Previous: <a href="ms-Document-Structure.html" accesskey="p" rel="prev">Document Structure</a>, Up: <a href="ms.html" accesskey="u" rel="up"><samp class="file">ms</samp></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Document-Control-Settings">4.6.3 Document Control Settings</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-document-control-settings"></a>
+
+<p><samp class="file">ms</samp> exposes many aspects of document layout to user control via
+<code class="code">groff</code> requests. To use them, you must understand how to define
+registers and strings.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enr"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nr</code></strong> <var class="def-var-arguments">reg value</var><a class="copiable-link" href='#index-_002enr'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nr"></a>
+<p>Set register <var class="var">reg</var> to <var class="var">value</var>. If <var class="var">reg</var> doesn&rsquo;t exist, GNU
+<code class="code">troff</code> creates it.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002eds"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.ds</code></strong> <var class="def-var-arguments">name contents</var><a class="copiable-link" href='#index-_002eds'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ds"></a>
+<p>Set string <var class="var">name</var> to <var class="var">contents</var>.
+</p></dd></dl>
+
+<p>A list of document control registers and strings follows. For any
+parameter whose default is unsatisfactory, define its register or string
+before calling any <samp class="file">ms</samp> macro other than <code class="code">RP</code>.
+</p>
+<ul class="mini-toc">
+<li><a href="#Margin-settings" accesskey="1">Margin settings</a></li>
+<li><a href="#Titles-_0028headers_002c-footers_0029" accesskey="2">Titles (headers, footers)</a></li>
+<li><a href="#Text-settings" accesskey="3">Text settings</a></li>
+<li><a href="#Paragraph-settings" accesskey="4">Paragraph settings</a></li>
+<li><a href="#Heading-settings" accesskey="5">Heading settings</a></li>
+<li><a href="#Footnote-settings" accesskey="6">Footnote settings</a></li>
+<li><a href="#Display-settings" accesskey="7">Display settings</a></li>
+<li><a href="#Other-settings" accesskey="8">Other settings</a></li>
+</ul>
+<div class="unnumberedsubsubsec-level-extent" id="Margin-settings">
+<h4 class="unnumberedsubsubsec">Margin settings</h4>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bPO_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[PO]</code></strong><a class="copiable-link" href='#index-_005cn_005bPO_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PO-_005bms_005d"></a>
+<p>Defines the page offset (i.e., the left margin).
+</p>
+<p>Effective: next page.
+</p>
+<p>Default: Varies by output device and paper format; 1<span class="dmn">i</span> is used for
+typesetters using U.S. letter paper, and zero for terminals.
+See <a class="xref" href="Paper-Format.html">Paper Format</a>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bLL_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[LL]</code></strong><a class="copiable-link" href='#index-_005cn_005bLL_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-LL-_005bms_005d"></a>
+<p>Defines the line length (i.e., the width of the body text).
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: Varies by output device and paper format; 6.5<span class="dmn">i</span> is used
+for typesetters using U.S. letter paper (see <a class="pxref" href="Paper-Format.html">Paper Format</a>) and
+65<span class="dmn">n</span> on terminals.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bLT_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[LT]</code></strong><a class="copiable-link" href='#index-_005cn_005bLT_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-LT-_005bms_005d"></a>
+<p>Defines the title line length (i.e., the header and footer width). This
+is usually the same as <code class="code">LL</code>, but need not be.
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: Varies by output device and paper format; 6.5<span class="dmn">i</span> is used
+for typesetters using U.S. letter paper (see <a class="pxref" href="Paper-Format.html">Paper Format</a>) and
+65<span class="dmn">n</span> on terminals.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bHM_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[HM]</code></strong><a class="copiable-link" href='#index-_005cn_005bHM_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-HM-_005bms_005d"></a>
+<p>Defines the header margin height at the top of the page.
+</p>
+<p>Effective: next page.
+</p>
+<p>Default: 1<span class="dmn">i</span>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bFM_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[FM]</code></strong><a class="copiable-link" href='#index-_005cn_005bFM_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-FM-_005bms_005d"></a>
+<p>Defines the footer margin height at the bottom of the page.
+</p>
+<p>Effective: next page.
+</p>
+<p>Default: 1<span class="dmn">i</span>.
+</p></dd></dl>
+
+</div>
+<div class="unnumberedsubsubsec-level-extent" id="Titles-_0028headers_002c-footers_0029">
+<h4 class="unnumberedsubsubsec">Titles (headers, footers)</h4>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bLH_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[LH]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bLH_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-LH-_005bms_005d"></a>
+<p>Defines the text displayed in the left header position.
+</p>
+<p>Effective: next header.
+</p>
+<p>Default: empty.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bCH_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[CH]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bCH_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-CH-_005bms_005d"></a>
+<p>Defines the text displayed in the center header position.
+</p>
+<p>Effective: next header.
+</p>
+<p>Default: &lsquo;<samp class="samp">-\n[%]-</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bRH_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[RH]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bRH_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-RH-_005bms_005d"></a>
+<p>Defines the text displayed in the right header position.
+</p>
+<p>Effective: next header.
+</p>
+<p>Default: empty.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bLF_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[LF]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bLF_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-LF-_005bms_005d"></a>
+<p>Defines the text displayed in the left footer position.
+</p>
+<p>Effective: next footer.
+</p>
+<p>Default: empty.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bCF_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[CF]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bCF_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-CF-_005bms_005d"></a>
+<p>Defines the text displayed in the center footer position.
+</p>
+<p>Effective: next footer.
+</p>
+<p>Default: empty.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bRF_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[RF]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bRF_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-RF-_005bms_005d"></a>
+<p>Defines the text displayed in the right footer position.
+</p>
+<p>Effective: next footer.
+</p>
+<p>Default: empty.
+</p></dd></dl>
+
+</div>
+<div class="unnumberedsubsubsec-level-extent" id="Text-settings">
+<h4 class="unnumberedsubsubsec">Text settings</h4>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bPS_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[PS]</code></strong><a class="copiable-link" href='#index-_005cn_005bPS_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PS-_005bms_005d-1"></a>
+<p>Defines the type size of the body text.
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: 10<span class="dmn">p</span>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bVS_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[VS]</code></strong><a class="copiable-link" href='#index-_005cn_005bVS_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-VS-_005bms_005d"></a>
+<p>Defines the vertical spacing (type size plus leading).
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: 12<span class="dmn">p</span>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bHY_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[HY]</code></strong><a class="copiable-link" href='#index-_005cn_005bHY_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-HY-_005bms_005d"></a>
+<p>Defines the automatic hyphenation mode used with the <code class="code">hy</code> request.
+Setting <code class="code">HY</code> to&nbsp;0 is equivalent to using the <code class="code">nh</code>
+request. This is a Tenth Edition Research Unix extension.
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: 6.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bFAM_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[FAM]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bFAM_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-FAM-_005bms_005d"></a>
+<p>Defines the font family used to typeset the document. This is a GNU
+extension.
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: defined by the output device; often &lsquo;<samp class="samp">T</samp>&rsquo; (see <a class="pxref" href="ms-Body-Text.html">Body Text</a>)
+</p></dd></dl>
+
+</div>
+<div class="unnumberedsubsubsec-level-extent" id="Paragraph-settings">
+<h4 class="unnumberedsubsubsec">Paragraph settings</h4>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bPI_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[PI]</code></strong><a class="copiable-link" href='#index-_005cn_005bPI_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PI-_005bms_005d"></a>
+<p>Defines the indentation amount used by the <code class="code">PP</code>, <code class="code">IP</code> (unless
+overridden by an optional argument), <code class="code">XP</code>, and <code class="code">RS</code> macros.
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: 5<span class="dmn">n</span>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bPD_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[PD]</code></strong><a class="copiable-link" href='#index-_005cn_005bPD_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PD-_005bms_005d"></a>
+<p>Defines the space between paragraphs.
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: 0.3<span class="dmn">v</span> (1<span class="dmn">v</span> on low-resolution devices).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bQI_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[QI]</code></strong><a class="copiable-link" href='#index-_005cn_005bQI_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-QI-_005bms_005d"></a>
+<p>Defines the indentation amount used on both sides of a paragraph set
+with the <code class="code">QP</code> or between the <code class="code">QS</code> and <code class="code">QE</code> macros.
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: 5<span class="dmn">n</span>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bPORPHANS_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[PORPHANS]</code></strong><a class="copiable-link" href='#index-_005cn_005bPORPHANS_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PORPHANS-_005bms_005d"></a>
+<p>Defines the minimum number of initial lines of any paragraph that must
+be kept together to avoid isolated lines at the bottom of a page. If a
+new paragraph is started close to the bottom of a page, and there is
+insufficient space to accommodate <code class="code">PORPHANS</code> lines before an
+automatic page break, then a page break is forced before the start of
+the paragraph. This is a GNU extension.
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: 1.
+</p></dd></dl>
+
+</div>
+<div class="unnumberedsubsubsec-level-extent" id="Heading-settings">
+<h4 class="unnumberedsubsubsec">Heading settings</h4>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bPSINCR_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[PSINCR]</code></strong><a class="copiable-link" href='#index-_005cn_005bPSINCR_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PSINCR-_005bms_005d"></a>
+<p>Defines an increment in type size to be applied to a heading at a
+lesser depth than that specified in <code class="code">GROWPS</code>. The value of
+<code class="code">PSINCR</code> should be specified in points with the <span class="dmn">p</span> scaling
+unit and may include a fractional component; for example, &lsquo;<samp class="samp">.nr&nbsp;PSINCR&nbsp;1.5p</samp>&rsquo;<!-- /@w --> sets a type size increment of 1.5<span class="dmn">p</span>. This is a GNU
+extension.
+</p>
+<p>Effective: next heading.
+</p>
+<p>Default: 1<span class="dmn">p</span>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bGROWPS_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[GROWPS]</code></strong><a class="copiable-link" href='#index-_005cn_005bGROWPS_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-GROWPS-_005bms_005d"></a>
+<p>Defines the heading depth above which the type size increment set by
+<code class="code">PSINCR</code> becomes effective. For each heading depth less than the
+value of <code class="code">GROWPS</code>, the type size is increased by <code class="code">PSINCR</code>.
+Setting <code class="code">GROWPS</code> to any value less than&nbsp;2 disables the
+incremental heading size feature. This is a GNU extension.
+</p>
+<p>Effective: next heading.
+</p>
+<p>Default: 0.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bHORPHANS_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[HORPHANS]</code></strong><a class="copiable-link" href='#index-_005cn_005bHORPHANS_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-HORPHANS-_005bms_005d"></a>
+<p>Defines the minimum number of lines of an immediately succeeding
+paragraph that should be kept together with any heading introduced by
+the <code class="code">NH</code> or <code class="code">SH</code> macros. If a heading is placed close to the
+bottom of a page, and there is insufficient space to accommodate both
+the heading and at least <code class="code">HORPHANS</code> lines of the following
+paragraph, before an automatic page break, then the page break is forced
+before the heading. This is a GNU extension.
+</p>
+<p>Effective: next paragraph.
+</p>
+<p>Default: 1.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bSN_002dSTYLE_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[SN-STYLE]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bSN_002dSTYLE_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-SN_002dSTYLE-_005bms_005d"></a>
+<p>Defines the style used to print numbered headings. See <a class="xref" href="Headings-in-ms.html">Headings</a>. This is a GNU extension.
+</p>
+<p>Effective: next heading.
+</p>
+<p>Default: alias of <code class="code">SN-DOT</code>
+</p></dd></dl>
+
+</div>
+<div class="unnumberedsubsubsec-level-extent" id="Footnote-settings">
+<h4 class="unnumberedsubsubsec">Footnote settings</h4>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bFI_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[FI]</code></strong><a class="copiable-link" href='#index-_005cn_005bFI_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-FI-_005bms_005d"></a>
+<p>Defines the footnote indentation. This is a Berkeley extension.
+</p>
+<p>Effective: next footnote.
+</p>
+<p>Default: 2<span class="dmn">n</span>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bFF_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[FF]</code></strong><a class="copiable-link" href='#index-_005cn_005bFF_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-FF-_005bms_005d"></a>
+<p>Defines the format of automatically numbered footnotes,
+and those for which the <code class="code">FS</code> request is given a marker argument, at
+the bottom of a column or page. This is a Berkeley extension.
+</p><dl class="table">
+<dt><code class="code">0</code></dt>
+<dd><p>Set an automatic number<a class="footnote" id="DOCF8" href="groff.html_fot.html#FOOT8"><sup>8</sup></a> as a
+superscript (on typesetter devices) or surrounded by square brackets (on
+terminals). The footnote paragraph is indented as with <code class="code">PP</code> if
+there is an <code class="code">FS</code> argument or an automatic number, and as with
+<code class="code">LP</code> otherwise. This is the default.
+</p>
+</dd>
+<dt><code class="code">1</code></dt>
+<dd><p>As <code class="code">0</code>, but set the marker as regular text and follow an
+automatic number with a period.
+</p>
+</dd>
+<dt><code class="code">2</code></dt>
+<dd><p>As <code class="code">1</code>, but without indentation (like <code class="code">LP</code>).
+</p>
+</dd>
+<dt><code class="code">3</code></dt>
+<dd><p>As <code class="code">1</code>, but set the footnote paragraph with the marker hanging
+(like <code class="code">IP</code>).
+</p></dd>
+</dl>
+
+<p>Effective: next footnote.
+</p>
+<p>Default: 0.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bFPS_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[FPS]</code></strong><a class="copiable-link" href='#index-_005cn_005bFPS_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-FPS-_005bms_005d"></a>
+<p>Defines the footnote type size.
+</p>
+<p>Effective: next footnote.
+</p>
+<p>Default: <code class="code">\n[PS] - 2p</code>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bFVS_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[FVS]</code></strong><a class="copiable-link" href='#index-_005cn_005bFVS_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-FVS-_005bms_005d"></a>
+<p>Defines the footnote vertical spacing.
+</p>
+<p>Effective: next footnote.
+</p>
+<p>Default: <code class="code">\n[FPS] + 2p</code>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bFPD_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[FPD]</code></strong><a class="copiable-link" href='#index-_005cn_005bFPD_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-FPD-_005bms_005d"></a>
+<p>Defines the footnote paragraph spacing. This is a GNU extension.
+</p>
+<p>Effective: next footnote.
+</p>
+<p>Default: <code class="code">\n[PD] / 2</code>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bFR_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[FR]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bFR_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-FR-_005bms_005d"></a>
+<p>Defines the ratio of the footnote line length to the current line
+length. This is a GNU extension.
+</p>
+<p>Effective: next footnote in single-column arrangements, next page
+otherwise.
+</p>
+<p>Default: <code class="code">11/12</code>.
+</p></dd></dl>
+
+</div>
+<div class="unnumberedsubsubsec-level-extent" id="Display-settings">
+<h4 class="unnumberedsubsubsec">Display settings</h4>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bDD_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[DD]</code></strong><a class="copiable-link" href='#index-_005cn_005bDD_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-DD-_005bms_005d"></a>
+<p>Sets the display distance&mdash;the vertical spacing before and after a
+display, a <code class="code">tbl</code> table, an <code class="code">eqn</code> equation, or a <code class="code">pic</code>
+image. This is a Berkeley extension.
+</p>
+<p>Effective: next display boundary.
+</p>
+<p>Default: 0.5<span class="dmn">v</span> (1<span class="dmn">v</span> on low-resolution devices).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bDI_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[DI]</code></strong><a class="copiable-link" href='#index-_005cn_005bDI_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-DI-_005bms_005d"></a>
+<p>Sets the default amount by which to indent a display started with
+<code class="code">DS</code> and <code class="code">ID</code> without arguments, to &lsquo;<samp class="samp">.DS&nbsp;I</samp>&rsquo; without
+an indentation argument, and to equations set with &lsquo;<samp class="samp">.EQ&nbsp;I</samp>&rsquo;.
+This is a GNU extension.
+</p>
+<p>Effective: next indented display.
+</p>
+<p>Default: 0.5<span class="dmn">i</span>.
+</p></dd></dl>
+
+</div>
+<div class="unnumberedsubsubsec-level-extent" id="Other-settings">
+<h4 class="unnumberedsubsubsec">Other settings</h4>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bMINGW_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[MINGW]</code></strong><a class="copiable-link" href='#index-_005cn_005bMINGW_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MINGW-_005bms_005d"></a>
+<p>Defines the default minimum width between columns in a multi-column
+document. This is a GNU extension.
+</p>
+<p>Effective: next page.
+</p>
+<p>Default: 2<span class="dmn">n</span>.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005cn_005bTC_002dMARGIN_005d"><span class="category-def">Register: </span><span><strong class="def-name"><code class="t">\n[TC-MARGIN]</code></strong><a class="copiable-link" href='#index-_005cn_005bTC_002dMARGIN_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-TC_002dMARGIN-_005bms_005d"></a>
+<p>Defines the width of the field in which page numbers are set in a table
+of contents entry; the right margin thus moves inboard by this amount.
+This is a GNU extension.
+</p>
+<p>Effective: next <code class="code">PX</code> call.
+</p>
+<p>Default: <code class="code">\w'000'</code>
+</p></dd></dl>
+
+
+
+</div>
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Document-Description-Macros.html">Document Description Macros</a>, Previous: <a href="ms-Document-Structure.html">Document Structure</a>, Up: <a href="ms.html"><samp class="file">ms</samp></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/ms-Document-Description-Macros.html b/doc/groff.html.node/ms-Document-Description-Macros.html
new file mode 100644
index 0000000..4801e47
--- /dev/null
+++ b/doc/groff.html.node/ms-Document-Description-Macros.html
@@ -0,0 +1,189 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>ms Document Description Macros (The GNU Troff Manual)</title>
+
+<meta name="description" content="ms Document Description Macros (The GNU Troff Manual)">
+<meta name="keywords" content="ms Document Description Macros (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms.html" rel="up" title="ms">
+<link href="ms-Body-Text.html" rel="next" title="ms Body Text">
+<link href="ms-Document-Control-Settings.html" rel="prev" title="ms Document Control Settings">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="ms-Document-Description-Macros">
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Body-Text.html" accesskey="n" rel="next">Body Text</a>, Previous: <a href="ms-Document-Control-Settings.html" accesskey="p" rel="prev">Document Control Settings</a>, Up: <a href="ms.html" accesskey="u" rel="up"><samp class="file">ms</samp></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Document-Description-Macros">4.6.4 Document Description Macros</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-document-description"></a>
+<a class="index-entry-id" id="index-document-description-macros_002c-_005bms_005d"></a>
+
+<p>Only the simplest document lacks a title.<a class="footnote" id="DOCF9" href="groff.html_fot.html#FOOT9"><sup>9</sup></a> As its level of sophistication (or
+complexity) increases, it tends to acquire a date of revision,
+explicitly identified authors, sponsoring institutions for authors, and,
+at the rarefied heights, an abstract of its content. Define these
+data by calling the macros below in the order shown; <code class="code">DA</code> or
+<code class="code">ND</code> can be called to set the document date (or other identifier)
+at any time before (a) the abstract, if present, or (b) its information
+is required in a header or footer. Use of these macros is optional,
+except that <code class="code">TL</code> is mandatory if any of <code class="code">RP</code>, <code class="code">AU</code>,
+<code class="code">AI</code>, or <code class="code">AB</code> is called, and <code class="code">AE</code> is mandatory if
+<code class="code">AB</code> is called.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eRP"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.RP</code></strong> <var class="def-var-arguments">[<code class="code">no-repeat-info</code>] [<code class="code">no-renumber</code>]</var><a class="copiable-link" href='#index-_002eRP'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-RP-_005bms_005d"></a>
+<p>Use the &ldquo;report&rdquo; (<abbr class="acronym">AT&amp;T</abbr>: &ldquo;released paper&rdquo;) format for your
+document, creating a separate cover page. The default arrangement is to
+place most of the document description (title, author names and
+institutions, and abstract, but not the date) at the top of the first
+page. If the optional <code class="code">no-repeat-info</code> argument is given,
+<samp class="file">ms</samp> produces a cover page but does not repeat any of its
+information subsequently (but see the <code class="code">DA</code> macro below regarding
+the date). Normally, <code class="code">RP</code> sets the page number following the cover
+page to&nbsp;1. Specifying the optional <code class="code">no-renumber</code> argument
+suppresses this alteration. Optional arguments can occur in any order.
+<code class="code">no</code> is recognized as a synonym of <code class="code">no-repeat-info</code> for
+<code class="code">AT&amp;T</code> compatibility.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eTL"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.TL</code></strong><a class="copiable-link" href='#index-_002eTL'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-TL-_005bms_005d"></a>
+<p>Specify the document title. <samp class="file">ms</samp> collects text on input lines
+following this call into the title until reaching <code class="code">AU</code>, <code class="code">AB</code>,
+or a heading or paragraphing macro call.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eAU"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.AU</code></strong><a class="copiable-link" href='#index-_002eAU'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-AU-_005bms_005d"></a>
+<p>Specify an author&rsquo;s name. <samp class="file">ms</samp> collects text on input lines
+following this call into the author&rsquo;s name until reaching <code class="code">AI</code>,
+<code class="code">AB</code>, another <code class="code">AU</code>, or a heading or paragraphing macro call.
+Call it repeatedly to specify multiple authors.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eAI"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.AI</code></strong><a class="copiable-link" href='#index-_002eAI'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-AI-_005bms_005d"></a>
+<p>Specify the preceding author&rsquo;s institution. An <code class="code">AU</code> call is
+usefully followed by at most one <code class="code">AI</code> call; if there are more, the
+last <code class="code">AI</code> call controls. <samp class="file">ms</samp> collects text on input lines
+following this call into the author&rsquo;s institution until reaching
+<code class="code">AU</code>, <code class="code">AB</code>, or a heading or paragraphing macro call.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eDA"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.DA</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">x</i></span> &hellip;]</var><a class="copiable-link" href='#index-_002eDA'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-DA-_005bms_005d"></a>
+<p>Typeset the current date, or any arguments <var class="var">x</var>, in the center
+footer, and, if <code class="code">RP</code> is also called, left-aligned at the end of the
+description information on the cover page.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eND"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.ND</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">x</i></span> &hellip;]</var><a class="copiable-link" href='#index-_002eND'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ND-_005bms_005d"></a>
+<p>Typeset the current date, or any arguments <var class="var">x</var>, if <code class="code">RP</code> is also
+called, left-aligned at the end of the document description on the cover
+page. This is <code class="code">groff</code> <samp class="file">ms</samp>&rsquo;s default.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eAB"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.AB</code></strong> <var class="def-var-arguments">[<code class="code">no</code>]</var><a class="copiable-link" href='#index-_002eAB'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-AB-_005bms_005d"></a>
+<p>Begin the abstract. <samp class="file">ms</samp> collects text on input lines following
+this call into the abstract until reaching an <code class="code">AE</code> call. By
+default, <samp class="file">ms</samp> places the word &ldquo;ABSTRACT&rdquo; centered and in italics
+above the text of the abstract. The optional argument <code class="code">no</code>
+suppresses this heading.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eAE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.AE</code></strong><a class="copiable-link" href='#index-_002eAE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-AE-_005bms_005d"></a>
+<p>End the abstract.
+</p></dd></dl>
+
+<p>An example document description, using a cover page, follows.
+<a class="index-entry-id" id="index-cover-page-in-_005bms_005d_002c-example-markup"></a>
+<a class="index-entry-id" id="index-example-markup_002c-cover-page-in-_005bms_005d"></a>
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.RP
+.TL
+The Inevitability of Code Bloat
+in Commercial and Free Software
+.AU
+J.\&amp; Random Luser
+.AI
+University of West Bumblefuzz
+.AB
+This report examines the long-term growth of the code
+bases in two large,
+popular software packages;
+the free Emacs and the commercial Microsoft Word.
+While differences appear in the type or order of
+features added,
+due to the different methodologies used,
+the results are the same in the end.
+.PP
+The free software approach is shown to be superior in
+that while free software can become as bloated as
+commercial offerings,
+free software tends to have fewer serious bugs and the
+added features are more in line with user demand.
+.AE
+
+<span class="r">&hellip;the rest of the paper&hellip;</span>
+</pre></div>
+</td></tr></table>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Body-Text.html">Body Text</a>, Previous: <a href="ms-Document-Control-Settings.html">Document Control Settings</a>, Up: <a href="ms.html"><samp class="file">ms</samp></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/ms-Document-Structure.html b/doc/groff.html.node/ms-Document-Structure.html
new file mode 100644
index 0000000..de4be0e
--- /dev/null
+++ b/doc/groff.html.node/ms-Document-Structure.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>ms Document Structure (The GNU Troff Manual)</title>
+
+<meta name="description" content="ms Document Structure (The GNU Troff Manual)">
+<meta name="keywords" content="ms Document Structure (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms.html" rel="up" title="ms">
+<link href="ms-Document-Control-Settings.html" rel="next" title="ms Document Control Settings">
+<link href="ms-Introduction.html" rel="prev" title="ms Introduction">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="ms-Document-Structure">
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Document-Control-Settings.html" accesskey="n" rel="next">Document Control Settings</a>, Previous: <a href="ms-Introduction.html" accesskey="p" rel="prev">Introduction</a>, Up: <a href="ms.html" accesskey="u" rel="up"><samp class="file">ms</samp></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Document-Structure">4.6.2 Document Structure</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-general-structure"></a>
+
+<p>The <samp class="file">ms</samp> macro package expects a certain amount of structure:
+a well-formed document contains at least one paragraphing or heading
+macro call. Longer documents have a structure as follows.
+</p>
+<dl class="table">
+<dt><strong class="strong">Document type</strong></dt>
+<dd><p>Calling the <code class="code">RP</code> macro at the beginning of your document puts the
+document description (see below) on a cover page. Otherwise, <samp class="file">ms</samp>
+places the information (if any) on the first page, followed immediately
+by the body text. Some document types found in other <samp class="file">ms</samp>
+implementations are specific to <abbr class="acronym">AT&amp;T</abbr> or Berkeley, and are not
+supported by <code class="code">groff</code> <samp class="file">ms</samp>.
+</p>
+</dd>
+<dt><strong class="strong">Format and layout</strong></dt>
+<dd><p>By setting registers and strings, you can configure your document&rsquo;s
+typeface, margins, spacing, headers and footers, and footnote
+arrangement. See <a class="xref" href="ms-Document-Control-Settings.html">Document Control Settings</a>.
+</p>
+</dd>
+<dt><strong class="strong">Document description</strong></dt>
+<dd><p>A document description consists of any of: a title, one or more authors&rsquo;
+names and affiliated institutions, an abstract, and a date or other
+identifier. See <a class="xref" href="ms-Document-Description-Macros.html">Document Description Macros</a>.
+</p>
+</dd>
+<dt><strong class="strong">Body text</strong></dt>
+<dd><p>The main matter of your document follows its description (if any).
+<samp class="file">ms</samp> supports highly structured text consisting of paragraphs
+interspersed with multi-level headings (chapters, sections, subsections,
+and so forth) and augmented by lists, footnotes, tables, diagrams, and
+similar material. See <a class="xref" href="ms-Body-Text.html">Body Text</a>.
+</p>
+</dd>
+<dt><strong class="strong">Tables of contents</strong></dt>
+<dd><p>Macros enable the collection of entries for a table of contents (or
+index) as the material they discuss appears in the document. You then
+call a macro to emit the table of contents at the end of your document.
+The table of contents must necessarily follow the rest of the text since
+GNU <code class="code">troff</code> is a single-pass formatter; it thus cannot determine
+the page number of a division of the text until it has been set and
+output. Since <samp class="file">ms</samp> was designed for the production of hard copy,
+the traditional procedure was to manually relocate the pages containing
+the table of contents between the cover page and the body text. Today,
+page resequencing is more often done in the digital domain. An index
+works similarly, but because it typically needs to be sorted after
+collection, its preparation requires separate processing.
+</p></dd>
+</dl>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Document-Control-Settings.html">Document Control Settings</a>, Previous: <a href="ms-Introduction.html">Introduction</a>, Up: <a href="ms.html"><samp class="file">ms</samp></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/ms-Footnotes.html b/doc/groff.html.node/ms-Footnotes.html
new file mode 100644
index 0000000..8c5f1f5
--- /dev/null
+++ b/doc/groff.html.node/ms-Footnotes.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>ms Footnotes (The GNU Troff Manual)</title>
+
+<meta name="description" content="ms Footnotes (The GNU Troff Manual)">
+<meta name="keywords" content="ms Footnotes (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms-Body-Text.html" rel="up" title="ms Body Text">
+<link href="ms-Insertions.html" rel="prev" title="ms Insertions">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="ms-Footnotes">
+<div class="nav-panel">
+<p>
+Previous: <a href="ms-Insertions.html" accesskey="p" rel="prev">Tables, figures, equations, and references</a>, Up: <a href="ms-Body-Text.html" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Footnotes">4.6.5.10 Footnotes</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-footnotes"></a>
+<a class="index-entry-id" id="index-footnotes-_005bms_005d"></a>
+
+<a class="index-entry-id" id="index-footnote-marker-_005bms_005d"></a>
+<a class="index-entry-id" id="index-marker_002c-footnote-_005bms_005d"></a>
+<p>A footnote is typically anchored to a place in the text with a
+<em class="dfn">marker</em>, which is a small integer, a symbol such as a dagger, or
+arbitrary user-specified text.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_002a_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[*]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_002a_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002a-_005bms_005d"></a>
+<p>Place an <em class="dfn">automatic number</em>, an automatically generated numeric
+footnote marker, in the text. Each time this string is interpolated,
+the number it produces increments by one. Automatic numbers start at 1.
+This is a Berkeley extension.
+</p></dd></dl>
+
+<p>Enclose the footnote text in <code class="code">FS</code> and <code class="code">FE</code> macro calls to set
+it at the nearest available &ldquo;foot&rdquo;, or bottom, of a text column or
+page.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eFS"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.FS</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">marker</i></span>]</var><a class="copiable-link" href='#index-_002eFS'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-FS-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eFE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.FE</code></strong><a class="copiable-link" href='#index-_002eFE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-FE-_005bms_005d"></a>
+<p>Begin (<code class="code">FS</code>) and end (<code class="code">FE</code>) a footnote. <code class="code">FS</code> calls
+<code class="code">FS-MARK</code> with any supplied <var class="var">marker</var> argument, which is then
+also placed at the beginning of the footnote text. If <var class="var">marker</var> is
+omitted, the next pending automatic footnote number enqueued by
+interpolation of the <code class="code">*</code> string is used, and if none exists,
+nothing is prefixed.
+</p></dd></dl>
+
+<p>You may not desire automatically numbered footnotes in spite of their
+convenience. You can indicate a footnote with a symbol or other text by
+specifying its marker at the appropriate place (for example, by using
+<code class="code">\[dg]</code> for the dagger glyph) <em class="emph">and</em> as an argument to the
+<code class="code">FS</code> macro. Such manual marks should be repeated as arguments to
+<code class="code">FS</code> or as part of the footnote text to disambiguate their
+correspondence. You may wish to use <code class="code">\*{</code> and <code class="code">\*}</code> to
+superscript the marker at the anchor point, in the footnote text, or
+both.
+</p>
+<p><code class="code">groff</code> <samp class="file">ms</samp> provides a hook macro, <code class="code">FS-MARK</code>, for
+user-determined operations to be performed when the <code class="code">FS</code> macro is
+called. It is passed the same arguments as <code class="code">FS</code> itself. An
+application of <code class="code">FS-MARK</code> is anchor placement for a hyperlink
+reference, so that a footnote can link back to its referential
+context.<a class="footnote" id="DOCF11" href="groff.html_fot.html#FOOT11"><sup>11</sup></a> By default, this macro has an empty definition.
+<code class="code">FS-MARK</code> is a GNU extension.
+</p>
+<a class="index-entry-id" id="index-footnotes_002c-and-keeps-_005bms_005d"></a>
+<a class="index-entry-id" id="index-keeps_002c-and-footnotes-_005bms_005d"></a>
+<a class="index-entry-id" id="index-footnotes_002c-and-displays-_005bms_005d"></a>
+<a class="index-entry-id" id="index-displays_002c-and-footnotes-_005bms_005d"></a>
+<p>Footnotes can be safely used within keeps and displays, but you should
+avoid using automatically numbered footnotes within floating keeps. You
+can place a second <code class="code">\**</code> interpolation between a <code class="code">\**</code> and its
+corresponding <code class="code">FS</code> call as long as each <code class="code">FS</code> call occurs
+<em class="emph">after</em> the corresponding <code class="code">\**</code> and occurrences of <code class="code">FS</code>
+are in the same order as corresponding occurrences of <code class="code">\**</code>.
+</p>
+<p>Footnote text is formatted as paragraphs are, using analogous
+parameters. The registers <code class="code">FI</code>, <code class="code">FPD</code>, <code class="code">FPS</code>, and
+<code class="code">FVS</code> correspond to <code class="code">PI</code>, <code class="code">PD</code>, <code class="code">PS</code>, and <code class="code">CS</code>,
+respectively; <code class="code">FPD</code>, <code class="code">FPS</code>, and <code class="code">FVS</code> are GNU extensions.
+</p>
+<p>The <code class="code">FF</code> register controls the formatting of automatically numbered
+footnote paragraphs and those for which <code class="code">FS</code> is given a marker
+argument. See <a class="xref" href="ms-Document-Control-Settings.html">Document Control Settings</a>.
+</p>
+<p>The default footnote line length is 11/12ths of the normal line length
+for compatibility with the expectations of historical <samp class="file">ms</samp>
+documents; you may wish to set the <code class="code">FR</code> string to &lsquo;<samp class="samp">1</samp>&rsquo; to align
+with contemporary typesetting practices. In the
+past,<a class="footnote" id="DOCF12" href="groff.html_fot.html#FOOT12"><sup>12</sup></a> an <code class="code">FL</code> register
+was used for the line length in footnotes; however, setting this
+register at document initialization time had no effect on the footnote
+line length in multi-column arrangements.<a class="footnote" id="DOCF13" href="groff.html_fot.html#FOOT13"><sup>13</sup></a>
+</p>
+<p><code class="code">FR</code> should be used in preference to the old <code class="code">FL</code> register in
+contemporary documents. The footnote line length is effectively
+computed as &lsquo;<samp class="samp"><i class="slanted">column-width</i> * \*[FR]</samp>&rsquo;. If an absolute
+footnote line length is required, recall that arithmetic expressions in
+<code class="code">roff</code> input are evaluated strictly from left to right, with no
+operator precedence (parentheses are honored).
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.ds FR 0+3i \&quot; Set footnote line length to 3 inches.
+</pre></div></div>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Previous: <a href="ms-Insertions.html">Tables, figures, equations, and references</a>, Up: <a href="ms-Body-Text.html">Body Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/ms-Headers-and-Footers.html b/doc/groff.html.node/ms-Headers-and-Footers.html
new file mode 100644
index 0000000..472f19c
--- /dev/null
+++ b/doc/groff.html.node/ms-Headers-and-Footers.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>ms Headers and Footers (The GNU Troff Manual)</title>
+
+<meta name="description" content="ms Headers and Footers (The GNU Troff Manual)">
+<meta name="keywords" content="ms Headers and Footers (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms-Page-Layout.html" rel="up" title="ms Page Layout">
+<link href="Tab-Stops-in-ms.html" rel="next" title="Tab Stops in ms">
+<link href="ms-Page-Layout.html" rel="prev" title="ms Page Layout">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="ms-Headers-and-Footers">
+<div class="nav-panel">
+<p>
+Next: <a href="Tab-Stops-in-ms.html" accesskey="n" rel="next">Tab stops</a>, Previous: <a href="ms-Page-Layout.html" accesskey="p" rel="prev">Page layout</a>, Up: <a href="ms-Page-Layout.html" accesskey="u" rel="up">Page layout</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Headers-and-footers">4.6.6.1 Headers and footers</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-headers"></a>
+<a class="index-entry-id" id="index-ms-macros_002c-footers"></a>
+<a class="index-entry-id" id="index-headers-_005bms_005d"></a>
+<a class="index-entry-id" id="index-footers-_005bms_005d"></a>
+
+<p>There are multiple ways to produce headers and footers. One is to
+define the strings <code class="code">LH</code>, <code class="code">CH</code>, and <code class="code">RH</code> to set the left,
+center, and right headers, respectively; and <code class="code">LF</code>, <code class="code">CF</code>, and
+<code class="code">RF</code> to set the left, center, and right footers. This approach
+suffices for documents that do not distinguish odd- and even-numbered
+pages.
+</p>
+<p>Another method is to call macros that set headers or footers for odd- or
+even-numbered pages. Each such macro takes a delimited argument
+separating the left, center, and right header or footer texts from each
+other. You can replace the neutral apostrophes (<code class="code">'</code>) shown below
+with any character not appearing in the header or footer text. These
+macros are Berkeley extensions.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eOH"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.OH</code></strong> <var class="def-var-arguments"><code class="code">'</code><span class="r"><i class="slanted">left</i></span><code class="code">'</code><span class="r"><i class="slanted">center</i></span><code class="code">'</code><span class="r"><i class="slanted">right</i></span><code class="code">'</code></var><a class="copiable-link" href='#index-_002eOH'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-OH-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eEH"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.EH</code></strong> <var class="def-var-arguments"><code class="code">'</code><span class="r"><i class="slanted">left</i></span><code class="code">'</code><span class="r"><i class="slanted">center</i></span><code class="code">'</code><span class="r"><i class="slanted">right</i></span><code class="code">'</code></var><a class="copiable-link" href='#index-_002eEH'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-EH-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eOF"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.OF</code></strong> <var class="def-var-arguments"><code class="code">'</code><span class="r"><i class="slanted">left</i></span><code class="code">'</code><span class="r"><i class="slanted">center</i></span><code class="code">'</code><span class="r"><i class="slanted">right</i></span><code class="code">'</code></var><a class="copiable-link" href='#index-_002eOF'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-OF-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eEF"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.EF</code></strong> <var class="def-var-arguments"><code class="code">'</code><span class="r"><i class="slanted">left</i></span><code class="code">'</code><span class="r"><i class="slanted">center</i></span><code class="code">'</code><span class="r"><i class="slanted">right</i></span><code class="code">'</code></var><a class="copiable-link" href='#index-_002eEF'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-EF-_005bms_005d"></a>
+<p>The <code class="code">OH</code> and <code class="code">EH</code> macros define headers for odd- (recto)
+and even-numbered (verso) pages, respectively; the <code class="code">OF</code> and
+<code class="code">EF</code> macros define footers for them.
+</p></dd></dl>
+
+<p>With either method, a percent sign <code class="code">%</code> in header or footer text is
+replaced by the current page number. By default, <samp class="file">ms</samp> places no
+header on a page numbered &ldquo;1&rdquo; (regardless of its number format).
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eP1"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.P1</code></strong><a class="copiable-link" href='#index-_002eP1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-P1-_005bms_005d"></a>
+<p>Typeset the header even on page&nbsp;1. To be effective, this macro
+must be called before the header trap is sprung on any page numbered
+&ldquo;1&rdquo;; in practice, unless your page numbering is unusual, this means
+that you should call it early, before <code class="code">TL</code> or any heading or
+paragraphing macro. This is a Berkeley extension.
+</p></dd></dl>
+
+<p>For even greater flexibility, <samp class="file">ms</samp> is designed to permit the
+redefinition of the macros that are called when the <code class="code">groff</code> traps
+that ordinarily cause the headers and footers to be output are sprung.
+<code class="code">PT</code> (&ldquo;page trap&rdquo;) is called by <samp class="file">ms</samp> when the header is to
+be written, and <code class="code">BT</code> (&ldquo;bottom trap&rdquo;) when the footer is to be.
+The <code class="code">groff</code> page location trap that <samp class="file">ms</samp> sets up to format the
+header also calls the (normally undefined) <code class="code">HD</code> macro after
+<code class="code">PT</code>; you can define <code class="code">HD</code> if you need additional processing
+after setting the header (for example, to draw a line below it).
+The <code class="code">HD</code> hook is a Berkeley extension. Any such macros you
+(re)define must implement any desired specialization for odd-, even-, or
+first numbered pages.
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Tab-Stops-in-ms.html">Tab stops</a>, Previous: <a href="ms-Page-Layout.html">Page layout</a>, Up: <a href="ms-Page-Layout.html">Page layout</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/ms-Insertions.html b/doc/groff.html.node/ms-Insertions.html
new file mode 100644
index 0000000..bb58a90
--- /dev/null
+++ b/doc/groff.html.node/ms-Insertions.html
@@ -0,0 +1,181 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>ms Insertions (The GNU Troff Manual)</title>
+
+<meta name="description" content="ms Insertions (The GNU Troff Manual)">
+<meta name="keywords" content="ms Insertions (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms-Body-Text.html" rel="up" title="ms Body Text">
+<link href="ms-Footnotes.html" rel="next" title="ms Footnotes">
+<link href="ms-keeps-and-displays.html" rel="prev" title="ms keeps and displays">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="ms-Insertions">
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Footnotes.html" accesskey="n" rel="next">Footnotes</a>, Previous: <a href="ms-keeps-and-displays.html" accesskey="p" rel="prev">Keeps, boxed keeps, and displays</a>, Up: <a href="ms-Body-Text.html" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Tables_002c-figures_002c-equations_002c-and-references">4.6.5.9 Tables, figures, equations, and references</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-tables"></a>
+<a class="index-entry-id" id="index-ms-macros_002c-figures"></a>
+<a class="index-entry-id" id="index-ms-macros_002c-equations"></a>
+<a class="index-entry-id" id="index-ms-macros_002c-references"></a>
+<a class="index-entry-id" id="index-tables-_005bms_005d"></a>
+<a class="index-entry-id" id="index-figures-_005bms_005d"></a>
+<a class="index-entry-id" id="index-equations-_005bms_005d"></a>
+<a class="index-entry-id" id="index-references-_005bms_005d"></a>
+
+<p>The <samp class="file">ms</samp> package is often used with the <code class="code">tbl</code>, <code class="code">pic</code>,
+<code class="code">eqn</code>, and <code class="code">refer</code> preprocessors.
+<a class="index-entry-id" id="index-tbl"></a>
+<a class="index-entry-id" id="index-pic"></a>
+<a class="index-entry-id" id="index-eqn"></a>
+<a class="index-entry-id" id="index-refer"></a>
+Mark text meant for preprocessors by enclosing it in pairs of tokens
+as follows, with nothing between the dot and the macro name. The
+preprocessors match these tokens only at the start of an input line.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eTS"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.TS</code></strong> <var class="def-var-arguments">[<code class="code">H</code>]</var><a class="copiable-link" href='#index-_002eTS'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-TS-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eTE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.TE</code></strong><a class="copiable-link" href='#index-_002eTE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-TE-_005bms_005d"></a>
+<p>Demarcate a table to be processed by the <code class="code">tbl</code> preprocessor. The
+optional argument&nbsp;<code class="code">H</code> to <code class="code">TS</code> instructs <samp class="file">ms</samp> to
+repeat table rows (often column headings) at the top of each new page
+the table spans, if applicable; calling the <code class="code">TH</code> macro marks the
+end of such rows. The GNU <cite class="cite">tbl<span class="r">(1)</span></cite> man page provides a
+comprehensive reference to the preprocessor and offers examples of its
+use.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002ePS"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.PS</code></strong><a class="copiable-link" href='#index-_002ePS'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PS-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002ePE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.PE</code></strong><a class="copiable-link" href='#index-_002ePE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PE-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002ePF"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.PF</code></strong><a class="copiable-link" href='#index-_002ePF'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PF-_005bms_005d"></a>
+<p><code class="code">PS</code> begins a picture to be processed by the <code class="command">gpic</code>
+preprocessor; either of <code class="code">PE</code> or <code class="code">PF</code> ends it, the latter with
+&ldquo;flyback&rdquo; to the vertical position at its top. You can create
+<code class="code">pic</code> input manually or with a program such as <code class="code">xfig</code>.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eEQ"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.EQ</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">align</i></span> [<span class="r"><i class="slanted">label</i></span>]]</var><a class="copiable-link" href='#index-_002eEQ'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-EQ-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eEN"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.EN</code></strong><a class="copiable-link" href='#index-_002eEN'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-EN-_005bms_005d"></a>
+<p>Demarcate an equation to be processed by the <code class="code">eqn</code> preprocessor.
+The equation is centered by default; <var class="var">align</var> can be &lsquo;<samp class="samp">C</samp>&rsquo;,
+&lsquo;<samp class="samp">L</samp>&rsquo;, or &lsquo;<samp class="samp">I</samp>&rsquo; to (explicitly) center, left-align, or indent it
+by the amount stored in the <code class="code">DI</code> register, respectively. If
+specified, <var class="var">label</var> is set right-aligned.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002e_005b"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.[</code></strong><a class="copiable-link" href='#index-_002e_005b'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005b-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002e_005d"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.]</code></strong><a class="copiable-link" href='#index-_002e_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005d-_005bms_005d"></a>
+<p>Demarcate a bibliographic citation to be processed by the <code class="code">refer</code>
+preprocessor. The GNU <cite class="cite">refer<span class="r">(1)</span></cite> man page provides a
+comprehensive reference to the preprocessor and the format of its
+bibliographic database. Type &lsquo;<samp class="samp">man refer</samp>&rsquo; at the command line to
+view it.
+</p></dd></dl>
+
+<p>When <code class="code">refer</code> emits collected references (as might be done on a
+&ldquo;Works Cited&rdquo; page), it interpolates the <code class="code">REFERENCES</code> string as
+an unnumbered heading (<code class="code">SH</code>).
+</p>
+<a class="index-entry-id" id="index-table_002c-multi_002dpage_002c-example-_005bms_005d"></a>
+<a class="index-entry-id" id="index-multi_002dpage-table-example-_005bms_005d"></a>
+<p>The following is an example of how to set up a table that may print
+across two or more pages.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.TS H
+allbox;
+Cb | Cb .
+Part&rarr;Description
+_
+.TH
+.T&amp;
+GH-1978&rarr;Fribulating gonkulator
+<span class="r">&hellip;the rest of the table follows&hellip;</span>
+.TE
+</pre></div>
+</td></tr></table>
+
+<p>Attempting to place a multi-page table inside a keep can lead to
+unpleasant results, particularly if the <code class="code">tbl</code> <code class="code">allbox</code> option
+is used.
+</p>
+<a class="index-entry-id" id="index-equation-example-_005bms_005d"></a>
+<p>Mathematics can be typeset using the language of the <code class="code">eqn</code>
+preprocessor.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.EQ C (\*[SN-NO-DOT]a)
+p ~ = ~ q sqrt { ( 1 + ~ ( x / q sup 2 ) }
+.EN
+</pre></div>
+</td></tr></table>
+
+<p>This input formats a labelled equation. We used the <code class="code">SN-NO-DOT</code>
+string to base the equation label on the current heading number, giving
+us more flexibility to reorganize the document.
+</p>
+<p>Use <code class="command">groff</code> options to run preprocessors on the input:
+<samp class="option">-e</samp> for <code class="command">geqn</code>, <samp class="option">-p</samp> for <code class="command">gpic</code>,
+<samp class="option">-R</samp> for <code class="command">grefer</code>, and <samp class="option">-t</samp> for <code class="command">gtbl</code>.
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Footnotes.html">Footnotes</a>, Previous: <a href="ms-keeps-and-displays.html">Keeps, boxed keeps, and displays</a>, Up: <a href="ms-Body-Text.html">Body Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/ms-Introduction.html b/doc/groff.html.node/ms-Introduction.html
new file mode 100644
index 0000000..4069ac7
--- /dev/null
+++ b/doc/groff.html.node/ms-Introduction.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>ms Introduction (The GNU Troff Manual)</title>
+
+<meta name="description" content="ms Introduction (The GNU Troff Manual)">
+<meta name="keywords" content="ms Introduction (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms.html" rel="up" title="ms">
+<link href="ms-Document-Structure.html" rel="next" title="ms Document Structure">
+<link href="ms.html" rel="prev" title="ms">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="ms-Introduction">
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Document-Structure.html" accesskey="n" rel="next">Document Structure</a>, Previous: <a href="ms.html" accesskey="p" rel="prev"><samp class="file">ms</samp></a>, Up: <a href="ms.html" accesskey="u" rel="up"><samp class="file">ms</samp></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Introduction-2">4.6.1 Introduction</h4>
+
+<p>The <samp class="file">ms</samp> macros are the oldest surviving package for <code class="code">roff</code>
+systems.<a class="footnote" id="DOCF7" href="groff.html_fot.html#FOOT7"><sup>7</sup></a> While the <samp class="file">man</samp>
+package was designed for brief reference documents, the <samp class="file">ms</samp> macros
+are also suitable for longer works intended for printing and possible
+publication.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="ms-basic-information.html" accesskey="1">Basic information</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/ms-Legacy-Features.html b/doc/groff.html.node/ms-Legacy-Features.html
new file mode 100644
index 0000000..2f24f41
--- /dev/null
+++ b/doc/groff.html.node/ms-Legacy-Features.html
@@ -0,0 +1,285 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>ms Legacy Features (The GNU Troff Manual)</title>
+
+<meta name="description" content="ms Legacy Features (The GNU Troff Manual)">
+<meta name="keywords" content="ms Legacy Features (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms.html" rel="up" title="ms">
+<link href="ms-Naming-Conventions.html" rel="next" title="ms Naming Conventions">
+<link href="Differences-from-AT_0026T-ms.html" rel="prev" title="Differences from AT&amp;T ms">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="ms-Legacy-Features">
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Naming-Conventions.html" accesskey="n" rel="next">Naming Conventions</a>, Previous: <a href="Differences-from-AT_0026T-ms.html" accesskey="p" rel="prev">Differences from <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp></a>, Up: <a href="ms.html" accesskey="u" rel="up"><samp class="file">ms</samp></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Legacy-Features">4.6.8 Legacy Features</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-strings"></a>
+<a class="index-entry-id" id="index-ms-macros_002c-special-characters"></a>
+<a class="index-entry-id" id="index-ms-macros_002c-accent-marks"></a>
+<a class="index-entry-id" id="index-accent-marks-_005bms_005d"></a>
+<a class="index-entry-id" id="index-special-characters-_005bms_005d"></a>
+<a class="index-entry-id" id="index-strings-_005bms_005d"></a>
+
+<p><code class="code">groff</code> <samp class="file">ms</samp> retains some legacy features solely to support
+formatting of historical documents; contemporary ones should not use
+them because they can render poorly. See the <cite class="cite">groff_char<span class="r">(7)</span></cite>
+man page.
+</p>
+<ul class="mini-toc">
+<li><a href="#AT_0026T-accent-mark-strings" accesskey="1">AT&amp;T accent mark strings</a></li>
+<li><a href="#Berkeley-accent-mark-and-glyph-strings" accesskey="2">Berkeley accent mark and glyph strings</a></li>
+</ul>
+<div class="unnumberedsubsubsec-level-extent" id="AT_0026T-accent-mark-strings">
+<h4 class="unnumberedsubsubsec">AT&amp;T accent mark strings</h4>
+
+<p>AT&amp;T <samp class="file">ms</samp> defined accent mark strings as follows.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_0027_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[<code class="code">'</code>]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_0027_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_0027-_005bms_005d"></a>
+<p>Apply acute accent to subsequent glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_0060_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[<code class="code">`</code>]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_0060_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_0060-_005bms_005d"></a>
+<p>Apply grave accent to subsequent glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_003a_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[:]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_003a_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_003a-_005bms_005d"></a>
+<p>Apply dieresis (umlaut) to subsequent glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_005e_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[^]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_005e_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005e-_005bms_005d"></a>
+<p>Apply circumflex accent to subsequent glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_007e_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[~]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_007e_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_007e-_005bms_005d"></a>
+<p>Apply tilde accent to subsequent glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bC_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[C]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bC_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-C-_005bms_005d"></a>
+<p>Apply caron to subsequent glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_002c_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[,]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_002c_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002c-_005bms_005d"></a>
+<p>Apply cedilla to subsequent glyph.
+</p></dd></dl>
+
+</div>
+<div class="unnumberedsubsubsec-level-extent" id="Berkeley-accent-mark-and-glyph-strings">
+<h4 class="unnumberedsubsubsec">Berkeley accent mark and glyph strings</h4>
+
+<p>Berkeley <samp class="file">ms</samp> offered an <code class="code">AM</code> macro; calling it redefined the
+AT&amp;T accent mark strings (except for &lsquo;<samp class="samp">\*C</samp>&rsquo;), applied them to the
+<em class="emph">preceding</em> glyph, and defined additional strings, some for spacing
+glyphs.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eAM"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.AM</code></strong><a class="copiable-link" href='#index-_002eAM'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-AM-_005bms_005d"></a>
+<p>Enable alternative accent mark and glyph-producing strings.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_0027_005d-1"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[<code class="code">'</code>]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_0027_005d-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_0027-_005bms_005d-1"></a>
+<p>Apply acute accent to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_0060_005d-1"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[<code class="code">`</code>]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_0060_005d-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_0060-_005bms_005d-1"></a>
+<p>Apply grave accent to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_003a_005d-1"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[:]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_003a_005d-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_003a-_005bms_005d-1"></a>
+<p>Apply dieresis (umlaut) to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_005e_005d-1"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[^]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_005e_005d-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005e-_005bms_005d-1"></a>
+<p>Apply circumflex accent to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_007e_005d-1"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[~]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_007e_005d-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_007e-_005bms_005d-1"></a>
+<p>Apply tilde accent to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_002c_005d-1"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[,]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_002c_005d-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002c-_005bms_005d-1"></a>
+<p>Apply cedilla to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_002f_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[/]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_002f_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002f-_005bms_005d"></a>
+<p>Apply stroke (slash) to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bv_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[v]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bv_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-v-_005bms_005d"></a>
+<p>Apply caron to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_005f_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[_]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_005f_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_005f-_005bms_005d"></a>
+<p>Apply macron to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_002e_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[.]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_002e_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_002e-_005bms_005d"></a>
+<p>Apply underdot to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bo_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[o]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bo_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-o-_005bms_005d"></a>
+<p>Apply ring accent to preceding glyph.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_003f_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[?]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_003f_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_003f-_005bms_005d"></a>
+<p>Interpolate inverted question mark.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b_0021_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[!]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b_0021_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-_0021-_005bms_005d"></a>
+<p>Interpolate inverted exclamation mark.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b8_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[8]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b8_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-8-_005bms_005d"></a>
+<p>Interpolate small letter sharp s.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bq_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[q]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bq_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-q-_005bms_005d"></a>
+<p>Interpolate small letter o with hook accent (ogonek).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005b3_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[3]</code></strong><a class="copiable-link" href='#index-_005c_002a_005b3_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-3-_005bms_005d"></a>
+<p>Interpolate small letter yogh.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bd_002d_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[d-]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bd_002d_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-d_002d-_005bms_005d"></a>
+<p>Interpolate small letter eth.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bD_002d_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[D-]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bD_002d_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-D_002d-_005bms_005d"></a>
+<p>Interpolate capital letter eth.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bth_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[th]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bth_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-th-_005bms_005d"></a>
+<p>Interpolate small letter thorn.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bTh_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[Th]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bTh_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-Th-_005bms_005d"></a>
+<p>Interpolate capital letter thorn.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bae_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[ae]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bae_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ae-_005bms_005d"></a>
+<p>Interpolate small æ ligature.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bAe_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[Ae]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bAe_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-Ae-_005bms_005d"></a>
+<p>Interpolate capital Æ ligature.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005boe_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[oe]</code></strong><a class="copiable-link" href='#index-_005c_002a_005boe_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-oe-_005bms_005d"></a>
+<p>Interpolate small oe ligature.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bOE_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[OE]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bOE_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-OE-_005bms_005d"></a>
+<p>Interpolate capital OE ligature.
+</p></dd></dl>
+
+
+</div>
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Naming-Conventions.html">Naming Conventions</a>, Previous: <a href="Differences-from-AT_0026T-ms.html">Differences from <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp></a>, Up: <a href="ms.html"><samp class="file">ms</samp></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/ms-Margins.html b/doc/groff.html.node/ms-Margins.html
new file mode 100644
index 0000000..f47f698
--- /dev/null
+++ b/doc/groff.html.node/ms-Margins.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>ms Margins (The GNU Troff Manual)</title>
+
+<meta name="description" content="ms Margins (The GNU Troff Manual)">
+<meta name="keywords" content="ms Margins (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms-Page-Layout.html" rel="up" title="ms Page Layout">
+<link href="ms-Multiple-Columns.html" rel="next" title="ms Multiple Columns">
+<link href="Tab-Stops-in-ms.html" rel="prev" title="Tab Stops in ms">
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="ms-Margins">
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Multiple-Columns.html" accesskey="n" rel="next">Multiple columns</a>, Previous: <a href="Tab-Stops-in-ms.html" accesskey="p" rel="prev">Tab stops</a>, Up: <a href="ms-Page-Layout.html" accesskey="u" rel="up">Page layout</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Margins">4.6.6.3 Margins</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-margins"></a>
+
+<p>Control margins using the registers summarized in &ldquo;Margin settings&rdquo; in
+<a class="ref" href="ms-Document-Control-Settings.html">Document Control Settings</a> above. There is no setting for the
+right margin; the combination of page offset <code class="code">\n[PO]</code> and line
+length <code class="code">\n[LL]</code> determines it.
+</p>
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/ms-Multiple-Columns.html b/doc/groff.html.node/ms-Multiple-Columns.html
new file mode 100644
index 0000000..c95792f
--- /dev/null
+++ b/doc/groff.html.node/ms-Multiple-Columns.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>ms Multiple Columns (The GNU Troff Manual)</title>
+
+<meta name="description" content="ms Multiple Columns (The GNU Troff Manual)">
+<meta name="keywords" content="ms Multiple Columns (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms-Page-Layout.html" rel="up" title="ms Page Layout">
+<link href="ms-TOC.html" rel="next" title="ms TOC">
+<link href="ms-Margins.html" rel="prev" title="ms Margins">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="ms-Multiple-Columns">
+<div class="nav-panel">
+<p>
+Next: <a href="ms-TOC.html" accesskey="n" rel="next">Creating a table of contents</a>, Previous: <a href="ms-Margins.html" accesskey="p" rel="prev">Margins</a>, Up: <a href="ms-Page-Layout.html" accesskey="u" rel="up">Page layout</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Multiple-columns">4.6.6.4 Multiple columns</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-multiple-columns"></a>
+<a class="index-entry-id" id="index-multiple-columns-_005bms_005d"></a>
+
+<p><samp class="file">ms</samp> can set text in as many columns as reasonably fit on the page.
+The following macros force a page break if a multi-column layout is
+active when they are called. The <code class="code">MINGW</code> register stores the
+default minimum gutter width; it is a GNU extension. When multiple
+columns are in use, keeps and the <code class="code">HORPHANS</code> and <code class="code">PORPHANS</code>
+registers work with respect to column breaks instead of page breaks.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002e1C"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.1C</code></strong><a class="copiable-link" href='#index-_002e1C'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-1C-_005bms_005d"></a>
+<p>Arrange page text in a single column (the default).
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002e2C"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.2C</code></strong><a class="copiable-link" href='#index-_002e2C'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-2C-_005bms_005d"></a>
+<p>Arrange page text in two columns.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eMC"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.MC</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">column-width</i></span> [<span class="r"><i class="slanted">gutter-width</i></span>]]</var><a class="copiable-link" href='#index-_002eMC'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MC-_005bms_005d"></a>
+<p>Arrange page text in multiple columns. If you specify no arguments, it
+is equivalent to the <code class="code">2C</code> macro. Otherwise, <var class="var">column-width</var> is
+the width of each column and <var class="var">gutter-width</var> is the minimum distance
+between columns.
+</p></dd></dl>
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/ms-Naming-Conventions.html b/doc/groff.html.node/ms-Naming-Conventions.html
new file mode 100644
index 0000000..db31955
--- /dev/null
+++ b/doc/groff.html.node/ms-Naming-Conventions.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>ms Naming Conventions (The GNU Troff Manual)</title>
+
+<meta name="description" content="ms Naming Conventions (The GNU Troff Manual)">
+<meta name="keywords" content="ms Naming Conventions (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms.html" rel="up" title="ms">
+<link href="ms-Legacy-Features.html" rel="prev" title="ms Legacy Features">
+<style type="text/css">
+<!--
+ul.mark-bullet {list-style-type: disc}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="ms-Naming-Conventions">
+<div class="nav-panel">
+<p>
+Previous: <a href="ms-Legacy-Features.html" accesskey="p" rel="prev">Legacy Features</a>, Up: <a href="ms.html" accesskey="u" rel="up"><samp class="file">ms</samp></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Naming-Conventions">4.6.9 Naming Conventions</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-naming-conventions"></a>
+<a class="index-entry-id" id="index-naming-conventions_002c-ms-macros"></a>
+
+<p>The following conventions are used for names of macros, strings, and
+registers. External names available to documents that use the
+<code class="code">groff</code> <samp class="file">ms</samp> macros contain only uppercase letters and digits.
+</p>
+<p>Internally, the macros are divided into modules. Conventions for
+identifier names are as follows.
+</p>
+<ul class="itemize mark-bullet">
+<li>Names used only within one module are of the form
+<var class="var">module</var><code class="code">*</code><var class="var">name</var>.
+
+</li><li>Names used outside the module in which they are defined are of the form
+<var class="var">module</var><code class="code">@</code><var class="var">name</var>.
+
+</li><li>Names associated with a particular environment are of the form
+<var class="var">environment</var><code class="code">:</code><var class="var">name</var>; these are used only within the
+<code class="code">par</code> module.
+
+</li><li><var class="var">name</var> does not have a module prefix.
+
+</li><li>Constructed names used to implement arrays are of the form
+<var class="var">array</var><code class="code">!</code><var class="var">index</var>.
+</li></ul>
+
+<p>Thus the <code class="code">groff</code> <samp class="file">ms</samp> macros reserve the following names.
+</p>
+<ul class="itemize mark-bullet">
+<li>Names containing the characters <code class="code">*</code>, <code class="code">@</code>, and&nbsp;<code class="code">:</code>.
+
+</li><li>Names containing only uppercase letters and digits.
+</li></ul>
+
+
+
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/ms-Page-Layout.html b/doc/groff.html.node/ms-Page-Layout.html
new file mode 100644
index 0000000..7bea36d
--- /dev/null
+++ b/doc/groff.html.node/ms-Page-Layout.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>ms Page Layout (The GNU Troff Manual)</title>
+
+<meta name="description" content="ms Page Layout (The GNU Troff Manual)">
+<meta name="keywords" content="ms Page Layout (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms.html" rel="up" title="ms">
+<link href="Differences-from-AT_0026T-ms.html" rel="next" title="Differences from AT&amp;T ms">
+<link href="ms-Body-Text.html" rel="prev" title="ms Body Text">
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="ms-Page-Layout">
+<div class="nav-panel">
+<p>
+Next: <a href="Differences-from-AT_0026T-ms.html" accesskey="n" rel="next">Differences from <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp></a>, Previous: <a href="ms-Body-Text.html" accesskey="p" rel="prev">Body Text</a>, Up: <a href="ms.html" accesskey="u" rel="up"><samp class="file">ms</samp></a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="Page-layout">4.6.6 Page layout</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-page-layout"></a>
+<a class="index-entry-id" id="index-page-layout-_005bms_005d"></a>
+
+<p><samp class="file">ms</samp>&rsquo;s default page layout arranges text in a single column with
+the page number between hyphens centered in a header on each page except
+the first, and produces no footers. You can customize this arrangement.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="ms-Headers-and-Footers.html" accesskey="1">Headers and footers</a></li>
+<li><a href="Tab-Stops-in-ms.html" accesskey="2">Tab stops</a></li>
+<li><a href="ms-Margins.html" accesskey="3">Margins</a></li>
+<li><a href="ms-Multiple-Columns.html" accesskey="4">Multiple columns</a></li>
+<li><a href="ms-TOC.html" accesskey="5">Creating a table of contents</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/ms-TOC.html b/doc/groff.html.node/ms-TOC.html
new file mode 100644
index 0000000..96a2f76
--- /dev/null
+++ b/doc/groff.html.node/ms-TOC.html
@@ -0,0 +1,242 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>ms TOC (The GNU Troff Manual)</title>
+
+<meta name="description" content="ms TOC (The GNU Troff Manual)">
+<meta name="keywords" content="ms TOC (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms-Page-Layout.html" rel="up" title="ms Page Layout">
+<link href="Differences-from-AT_0026T-ms.html" rel="next" title="Differences from AT&amp;T ms">
+<link href="ms-Multiple-Columns.html" rel="prev" title="ms Multiple Columns">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="ms-TOC">
+<div class="nav-panel">
+<p>
+Next: <a href="Differences-from-AT_0026T-ms.html" accesskey="n" rel="next">Differences from <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp></a>, Previous: <a href="ms-Multiple-Columns.html" accesskey="p" rel="prev">Multiple columns</a>, Up: <a href="ms-Page-Layout.html" accesskey="u" rel="up">Page layout</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Creating-a-table-of-contents">4.6.6.5 Creating a table of contents</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-creating-table-of-contents"></a>
+<a class="index-entry-id" id="index-table-of-contents_002c-creating-_005bms_005d"></a>
+
+<p>Because <code class="code">roff</code> formatters process their input in a single pass,
+material on page 50, for example, cannot influence what appears on
+page&nbsp;1&mdash;this poses a challenge for a table of contents at its
+traditional location in front matter, if you wish to avoid manually
+maintaining it. <samp class="file">ms</samp> enables the collection of material to be
+presented in the table of contents as it appears, saving its page number
+along with it, and then emitting the collected contents on demand toward
+the end of the document. The table of contents can then be resequenced
+to its desired location by physically rearranging the pages of a printed
+document, or as part of post-processing&mdash;with a <cite class="cite">sed<span class="r">(1)</span></cite>
+script to reorder the pages in <code class="command">troff</code>&rsquo;s output, with
+<cite class="cite">pdfjam<span class="r">(1)</span></cite>, or with <cite class="cite">gropdf<span class="r">(1)</span></cite>&rsquo;s
+&lsquo;<samp class="samp">.pdfswitchtopage</samp>&rsquo; feature, for example.
+</p>
+<p>Define an entry to appear in the table of contents by bracketing its
+text between calls to the <code class="code">XS</code> and <code class="code">XE</code> macros. A typical
+application is to call them immediately after <code class="code">NH</code> or <code class="code">SH</code> and
+repeat the heading text within them. The <code class="code">XA</code> macro, used within
+&lsquo;<samp class="samp">.XS</samp>&rsquo;/&lsquo;<samp class="samp">.XE</samp>&rsquo; pairs, supplements an entry&mdash;for instance, when
+it requires multiple output lines, whether because a heading is too long
+to fit or because style dictates that page numbers not be repeated. You
+may wish to indent the text thus wrapped to correspond to its heading
+depth; this can be done in the entry text by prefixing it with tabs or
+horizontal motion escape sequences, or by providing a second argument to
+the <code class="code">XA</code> macro. <code class="code">XS</code> and <code class="code">XA</code> automatically associate
+the page number where they are called with the text following them, but
+they accept arguments to override this behavior. At the end of the
+document, call <code class="code">TC</code> or <code class="code">PX</code> to emit the table of contents;
+<code class="code">TC</code> resets the page number to &lsquo;<samp class="samp">i</samp>&rsquo; (Roman numeral one), and
+then calls <code class="code">PX</code>. All of these macros are Berkeley extensions.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eXS"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.XS</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">page-number</i></span>]</var><a class="copiable-link" href='#index-_002eXS'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-XS-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eXA"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.XA</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">page-number</i></span> [<span class="r"><i class="slanted">indentation</i></span>]]</var><a class="copiable-link" href='#index-_002eXA'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-XA-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eXE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.XE</code></strong><a class="copiable-link" href='#index-_002eXE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-XE-_005bms_005d"></a>
+<p>Begin, supplement, and end a table of contents entry. Each entry is
+associated with <var class="var">page-number</var> (otherwise the current page number); a
+<var class="var">page-number</var> of &lsquo;<samp class="samp">no</samp>&rsquo; prevents a leader and page number from
+being emitted for that entry. Use of <code class="code">XA</code> within
+<code class="code">XS</code>/<code class="code">XE</code> is optional; it can be repeated. If
+<var class="var">indentation</var> is present, a supplemental entry is indented by that
+amount; ens are assumed if no unit is indicated. Text on input lines
+between <code class="code">XS</code> and <code class="code">XE</code> is stored for later recall by <code class="code">PX</code>.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002ePX"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.PX</code></strong> <var class="def-var-arguments">[<code class="code">no</code>]</var><a class="copiable-link" href='#index-_002ePX'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-PX-_005bms_005d"></a>
+<p>Switch to single-column layout. Unless <code class="code">no</code> is specified, center
+and interpolate the <code class="code">TOC</code> string in bold and two points larger than
+the body text. Emit the table of contents entries.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eTC"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.TC</code></strong> <var class="def-var-arguments">[<code class="code">no</code>]</var><a class="copiable-link" href='#index-_002eTC'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-TC-_005bms_005d"></a>
+<p>Set the page number to&nbsp;1, the page number format to lowercase Roman
+numerals, and call <code class="code">PX</code> (with a <code class="code">no</code> argument, if present).
+</p></dd></dl>
+
+<p>Here&rsquo;s an example of typical <samp class="file">ms</samp> table of contents preparation.
+We employ horizontal escape sequences <code class="code">\h</code> to indent the entries by
+sectioning depth.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.NH 1
+Introduction
+.XS
+Introduction
+.XE
+<span class="r">&hellip;</span>
+.NH 2
+Methodology
+.XS
+\h'2n'Methodology
+.XA
+\h'4n'Fassbinder's Approach
+\h'4n'Kahiu's Approach
+.XE
+<span class="r">&hellip;</span>
+.NH 1
+Findings
+.XS
+Findings
+.XE
+<span class="r">&hellip;</span>
+.TC
+</pre></div>
+</td></tr></table>
+
+<p>The remaining features in this subsubsection are GNU extensions.
+<code class="code">groff</code> <samp class="file">ms</samp> obviates the need to repeat heading text after
+<code class="code">XS</code> calls. Call <code class="code">XN</code> and <code class="code">XH</code> after <code class="code">NH</code> and
+<code class="code">SH</code>, respectively.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eXN"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.XN</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">heading-text</i></span></var><a class="copiable-link" href='#index-_002eXN'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-XN-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eXH"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.XH</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">depth</i></span> <span class="r"><i class="slanted">heading-text</i></span></var><a class="copiable-link" href='#index-_002eXH'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-XH-_005bms_005d"></a>
+<p>Format <var class="var">heading-text</var> and create a corresponding table of contents
+entry. <code class="code">XN</code> computes the indentation from the depth of the
+preceding <code class="code">NH</code> call; <code class="code">XH</code> requires a <var class="var">depth</var> argument to
+do so.
+</p></dd></dl>
+
+<p><code class="code">groff</code> <samp class="file">ms</samp> encourages customization of table of contents
+entry production.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eXN_002dREPLACEMENT"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.XN-REPLACEMENT</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">heading-text</i></span></var><a class="copiable-link" href='#index-_002eXN_002dREPLACEMENT'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-XN_002dREPLACEMENT-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eXH_002dREPLACEMENT"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.XH-REPLACEMENT</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">depth</i></span> <span class="r"><i class="slanted">heading-text</i></span></var><a class="copiable-link" href='#index-_002eXH_002dREPLACEMENT'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-XH_002dREPLACEMENT-_005bms_005d"></a>
+<p>These hook macros implement <code class="code">XN</code> and <code class="code">XH</code>, respectively.
+They call <code class="code">XN-INIT</code> and pass their <var class="var">heading-text</var> arguments to
+<code class="code">XH-UPDATE-TOC</code>.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eXN_002dINIT"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.XN-INIT</code></strong><a class="copiable-link" href='#index-_002eXN_002dINIT'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-XN_002dINIT-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eXH_002dUPDATE_002dTOC"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.XH-UPDATE-TOC</code></strong> <var class="def-var-arguments"><span class="r"><i class="slanted">depth</i></span> <span class="r"><i class="slanted">heading-text</i></span></var><a class="copiable-link" href='#index-_002eXH_002dUPDATE_002dTOC'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-XH_002dUPDATE_002dTOC-_005bms_005d"></a>
+<p>The <code class="code">XN-INIT</code> hook macro does nothing by default.
+<code class="code">XH-UPDATE-TOC</code> brackets <var class="var">heading-text</var> with <code class="code">XS</code> and
+<code class="code">XE</code> calls, indenting it by 2 ens per level of <var class="var">depth</var> beyond
+the first.
+</p></dd></dl>
+
+<p>We could therefore produce a table of contents similar to that in the
+previous example with fewer macro calls. (The difference is that this
+input follows the &ldquo;Approach&rdquo; entries with leaders and page numbers.)
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.NH 1
+.XN Introduction
+<span class="r">&hellip;</span>
+.NH 2
+.XN Methodology
+.XH 3 &quot;Fassbinder's Approach&quot;
+.XH 3 &quot;Kahiu's Approach&quot;
+<span class="r">&hellip;</span>
+.NH 1
+.XN Findings
+<span class="r">&hellip;</span>
+</pre></div>
+</td></tr></table>
+
+<p>To get the section number of the numbered headings into the table of
+contents entries, we might define <code class="code">XN-REPLACEMENT</code> as follows.
+(We obtain the heading depth from <code class="code">groff</code> <samp class="file">ms</samp>&rsquo;s internal
+register <code class="code">nh*hl</code>.)
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.de XN-REPLACEMENT
+.XN-INIT
+.XH-UPDATE-TOC \\n[nh*hl] \\$@
+\&amp;\\*[SN] \\$*
+..
+</pre></div>
+</td></tr></table>
+
+<p>You can change the style of the leader that bridges each table of
+contents entry with its page number; define the <code class="code">TC-LEADER</code> special
+character by using the <code class="code">char</code> request. A typical leader combines
+the dot glyph &lsquo;<samp class="samp">.</samp>&rsquo; with a horizontal motion escape sequence to
+spread the dots. The width of the page number field is stored in the
+<code class="code">TC-MARGIN</code> register.
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Differences-from-AT_0026T-ms.html">Differences from <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp></a>, Previous: <a href="ms-Multiple-Columns.html">Multiple columns</a>, Up: <a href="ms-Page-Layout.html">Page layout</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/ms-basic-information.html b/doc/groff.html.node/ms-basic-information.html
new file mode 100644
index 0000000..cc87b0b
--- /dev/null
+++ b/doc/groff.html.node/ms-basic-information.html
@@ -0,0 +1,211 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>ms basic information (The GNU Troff Manual)</title>
+
+<meta name="description" content="ms basic information (The GNU Troff Manual)">
+<meta name="keywords" content="ms basic information (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms-Introduction.html" rel="up" title="ms Introduction">
+<link href="ms-Document-Structure.html" rel="next" title="ms Document Structure">
+<link href="ms-Introduction.html" rel="prev" title="ms Introduction">
+<style type="text/css">
+<!--
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="ms-basic-information">
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Document-Structure.html" accesskey="n" rel="next">Document Structure</a>, Previous: <a href="ms-Introduction.html" accesskey="p" rel="prev">Introduction</a>, Up: <a href="ms-Introduction.html" accesskey="u" rel="up">Introduction</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Basic-information">4.6.1.1 Basic information</h4>
+
+<p><samp class="file">ms</samp> documents are plain text files; prepare them with your
+preferred text editor. If you&rsquo;re in a hurry to start, know that
+<samp class="file">ms</samp> needs one of its macros called at the beginning of a document
+so that it can initialize. A <em class="dfn">macro</em> is a formatting instruction to
+<samp class="file">ms</samp>. Put a macro call on a line by itself. Use &lsquo;<samp class="samp">.PP</samp>&rsquo; if you
+want your paragraph&rsquo;s first line to be indented, or &lsquo;<samp class="samp">.LP</samp>&rsquo; if you
+don&rsquo;t.
+</p>
+<p>After that, start typing normally. It is a good practice to start each
+sentence on a new line, or to put two spaces after sentence-ending
+punctuation, so that the formatter knows where the sentence boundaries
+are. You can separate paragraphs with further paragraphing macros, or
+with blank lines, and you can indent with tabs. When you need one of
+the features mentioned earlier (see <a class="pxref" href="ms.html"><samp class="file">ms</samp></a>), return to this part of the
+manual.
+</p>
+<p>Format the document with the <code class="command">groff</code> command. <code class="command">nroff</code>
+can be useful for previewing.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">$ editor radical.ms
+$ nroff -ww -z -ms radical.ms # check for errors
+$ nroff -ms radical.ms | less -R
+$ groff -T ps -ms radical.ms &gt; radical.ps
+$ see radical.ps
+</pre></div>
+</td></tr></table>
+
+<p>Our <samp class="file">radical.ms</samp> document might look like this.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.LP
+Radical novelties are so disturbing that they tend to be
+suppressed or ignored, to the extent that even the
+possibility of their existence in general is more often
+denied than admitted.
+
+&rarr;That's what Dijkstra said, anyway.
+</pre></div>
+</td></tr></table>
+
+<p><samp class="file">ms</samp> exposes many aspects of document layout to user control via
+<code class="code">groff</code>&rsquo;s <em class="dfn">registers</em> and <em class="dfn">strings</em>, which store numbers
+and text, respectively. Measurements in <code class="code">groff</code> are expressed with
+a suffix called a <em class="dfn">scaling unit</em>.
+</p>
+<dl class="table">
+<dt><code class="code">i</code></dt>
+<dd><p>inches
+</p>
+</dd>
+<dt><code class="code">c</code></dt>
+<dd><p>centimeters
+</p>
+</dd>
+<dt><code class="code">p</code></dt>
+<dd><p>points (1/72 inch)
+</p>
+</dd>
+<dt><code class="code">P</code></dt>
+<dd><p>picas (1/6 inch)
+</p>
+</dd>
+<dt><code class="code">v</code></dt>
+<dd><p>vees; current vertical spacing
+</p>
+</dd>
+<dt><code class="code">m</code></dt>
+<dd><p>ems; width of an &ldquo;M&rdquo; in the current font
+</p>
+</dd>
+<dt><code class="code">n</code></dt>
+<dd><p>ens; one-half em
+</p></dd>
+</dl>
+
+<p>Set registers with the <code class="code">nr</code> request and strings with the <code class="code">ds</code>
+request. <em class="dfn">Requests</em> are like macro calls; they go on lines by
+themselves and start with the <em class="dfn">control character</em>, a dot (<code class="code">.</code>).
+The difference is that they directly instruct the formatter program,
+rather than the macro package. We&rsquo;ll discuss a few as applicable. It
+is wise to specify a scaling unit when setting any register that
+represents a length, size, or distance.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.nr PS 10.5p \&quot; Use 10.5-point type.
+.ds FAM P \&quot; Use Palatino font family.
+</pre></div>
+</td></tr></table>
+
+<p>In the foregoing, we see that <code class="code">\&quot;</code> begins a comment. This is an
+example of an <em class="dfn">escape sequence</em>, the other kind of formatting
+instruction. Escape sequences can appear anywhere. They begin with the
+escape character (<code class="code">\</code>) and are followed by at least one more
+character. <samp class="file">ms</samp> documents
+tend to use only a few of <code class="code">groff</code>&rsquo;s many requests and escape
+sequences; see <a class="ref" href="Request-Index.html">Request Index</a> and <a class="ref" href="Escape-Sequence-Index.html">Escape Sequence Index</a> or
+the <cite class="cite">groff<span class="r">(7)</span></cite> man page for complete lists.
+</p>
+<dl class="table">
+<dt><code class="code">\&quot;</code></dt>
+<dd><p>Begin comment; ignore remainder of line.
+</p>
+</dd>
+<dt><code class="code">\n[<var class="var">reg</var>]</code></dt>
+<dd><p>Interpolate value of register <var class="var">reg</var>.
+</p>
+</dd>
+<dt><code class="code">\*[<var class="var">str</var>]</code></dt>
+<dd><p>Interpolate contents of string <var class="var">str</var>.
+</p>
+</dd>
+<dt><code class="code">\*<var class="var">s</var></code></dt>
+<dd><p>abbreviation of <code class="code">\*[<var class="var">s</var>]</code>; the name <var class="var">s</var> must be only one
+character
+</p>
+</dd>
+<dt><code class="code">\[<var class="var">char</var>]</code></dt>
+<dd><p>Interpolate glyph of special character named <var class="var">char</var>.
+</p>
+</dd>
+<dt><code class="code">\&amp;</code></dt>
+<dd><p>dummy character
+</p>
+</dd>
+<dt><code class="code">\~</code></dt>
+<dd><p>Insert an unbreakable space that is adjustable like a normal space.
+</p>
+</dd>
+<dt><code class="code">\|</code></dt>
+<dd><p>Move horizontally by one-sixth em (&ldquo;thin space&rdquo;).
+</p></dd>
+</dl>
+
+<p>Prefix any words that start with a dot &lsquo;<samp class="samp">.</samp>&rsquo; or neutral apostrophe
+&lsquo;<samp class="samp">'</samp>&rsquo; with <code class="code">\&amp;</code> if they are at the beginning of an input line
+(or might become that way in editing) to prevent them from being
+interpreted as macro calls or requests. Suffix &lsquo;<samp class="samp">.</samp>&rsquo;, &lsquo;<samp class="samp">?</samp>&rsquo;, and
+&lsquo;<samp class="samp">!</samp>&rsquo; with <code class="code">\&amp;</code> when needed to cancel end-of-sentence detection.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">My exposure was \&amp;.5 to \&amp;.6 Sv of neutrons, said Dr.\&amp;
+Wallace after the criticality incident.
+</pre></div>
+</td></tr></table>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Document-Structure.html">Document Structure</a>, Previous: <a href="ms-Introduction.html">Introduction</a>, Up: <a href="ms-Introduction.html">Introduction</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/ms-keeps-and-displays.html b/doc/groff.html.node/ms-keeps-and-displays.html
new file mode 100644
index 0000000..47088aa
--- /dev/null
+++ b/doc/groff.html.node/ms-keeps-and-displays.html
@@ -0,0 +1,207 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>ms keeps and displays (The GNU Troff Manual)</title>
+
+<meta name="description" content="ms keeps and displays (The GNU Troff Manual)">
+<meta name="keywords" content="ms keeps and displays (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms-Body-Text.html" rel="up" title="ms Body Text">
+<link href="ms-Insertions.html" rel="next" title="ms Insertions">
+<link href="Indented-regions-in-ms.html" rel="prev" title="Indented regions in ms">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="ms-keeps-and-displays">
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Insertions.html" accesskey="n" rel="next">Tables, figures, equations, and references</a>, Previous: <a href="Indented-regions-in-ms.html" accesskey="p" rel="prev">Indented regions</a>, Up: <a href="ms-Body-Text.html" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Keeps_002c-boxed-keeps_002c-and-displays">4.6.5.8 Keeps, boxed keeps, and displays</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-displays"></a>
+<a class="index-entry-id" id="index-ms-macros_002c-keeps"></a>
+<a class="index-entry-id" id="index-keeps-_005bms_005d"></a>
+
+<p>On occasion, you may want to <em class="dfn">keep</em> several lines of text, or a
+region of a document, together on a single page, preventing an automatic
+page break within certain boundaries. This can cause a page break to
+occur earlier than it normally would. For example, you may want to keep
+two paragraphs together, or a paragraph that refers to a table, list, or
+figure adjacent to the item it discusses. <samp class="file">ms</samp> provides the
+<code class="code">KS</code> and <code class="code">KE</code> macros for this purpose.
+</p>
+<p>You can alternatively specify a <em class="dfn">floating keep</em>: if a keep cannot
+fit on the current page, <samp class="file">ms</samp> holds its contents and
+allows material following the keep (in the source document) to fill the
+remainder of the current page. When the page breaks, whether by
+reaching the end or <code class="code">bp</code> request, <samp class="file">ms</samp> puts the floating keep
+at the beginning of the next page. This is useful for placing large
+graphics or tables that do not need to appear exactly where they occur
+in the source document.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eKS"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.KS</code></strong><a class="copiable-link" href='#index-_002eKS'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-KS-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eKF"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.KF</code></strong><a class="copiable-link" href='#index-_002eKF'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-KF-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eKE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.KE</code></strong><a class="copiable-link" href='#index-_002eKE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-KE-_005bms_005d"></a>
+<p><code class="code">KS</code> begins a keep, <code class="code">KF</code> a floating keep, and <code class="code">KE</code> ends a
+keep of either kind.
+</p></dd></dl>
+
+<p>As an alternative to the keep mechanism, the <code class="code">ne</code> request forces a
+page break if there is not at least the amount of vertical space
+specified in its argument remaining on the page (see <a class="pxref" href="Page-Control.html">Page Control</a>).
+One application of <code class="code">ne</code> is to reserve space on the page for a
+figure or illustration to be included later.
+</p>
+<a class="index-entry-id" id="index-boxes-_005bms_005d"></a>
+<p>A <em class="dfn">boxed keep</em> has a frame drawn around it.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eB1"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.B1</code></strong><a class="copiable-link" href='#index-_002eB1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-B1-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eB2"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.B2</code></strong><a class="copiable-link" href='#index-_002eB2'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-B2-_005bms_005d"></a>
+<p><code class="code">B1</code> begins a keep with a box drawn around it. <code class="code">B2</code> ends a
+boxed keep.
+</p></dd></dl>
+
+<p>Boxed keep macros cause breaks; if you need to box a word or phrase
+within a line, see the <code class="code">BX</code> macro in <a class="ref" href="Typeface-and-decoration.html">Typeface and decoration</a>.
+Box lines are drawn as close as possible to the text they enclose so
+that they are usable within paragraphs. If you wish to box one or more
+paragraphs, you may improve the appearance by calling <code class="code">B1</code> after
+the first paragraphing macro, and by adding a small amount of vertical
+space before calling <code class="code">B2</code>.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">.LP
+.B1
+.I Warning:
+Happy Fun Ball may suddenly accelerate to dangerous
+speeds.
+.sp \n[PD]/2 \&quot; space by half the inter-paragraph distance
+.B2
+</pre></div>
+</td></tr></table>
+
+<p>If you want a boxed keep to float, you will need to enclose the
+<code class="code">B1</code> and <code class="code">B2</code> calls within a pair of <code class="code">KF</code> and <code class="code">KE</code>
+calls.
+</p>
+<a class="index-entry-id" id="index-displays-_005bms_005d"></a>
+<p><em class="dfn">Displays</em> turn off filling; lines of verse or program code are
+shown with their lines broken as in the source document without
+requiring <code class="code">br</code> requests between lines. Displays can be kept on a
+single page or allowed to break across pages. The <code class="code">DS</code> macro
+begins a kept display of the layout specified in its first argument;
+non-kept displays are begun with dedicated macros corresponding to their
+layout.
+</p>
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eDS"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.DS</code></strong> <var class="def-var-arguments"><code class="t">L</code></var><a class="copiable-link" href='#index-_002eDS'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-DS-_005bms_005d"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eLD"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.LD</code></strong><a class="copiable-link" href='#index-_002eLD'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-LD-_005bms_005d"></a>
+<p>Begin (<code class="code">DS</code>: kept) left-aligned display.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eDS-1"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.DS</code></strong> <var class="def-var-arguments">[<code class="t">I</code> [<span class="r"><i class="slanted">indent</i></span>]]</var><a class="copiable-link" href='#index-_002eDS-1'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-DS-_005bms_005d-1"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eID"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.ID</code></strong> <var class="def-var-arguments">[<span class="r"><i class="slanted">indent</i></span>]</var><a class="copiable-link" href='#index-_002eID'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ID-_005bms_005d"></a>
+<p>Begin (<code class="code">DS</code>: kept) display indented by <var class="var">indent</var> if specified,
+and by the amount of the <code class="code">DI</code> register otherwise.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eDS-2"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.DS</code></strong> <var class="def-var-arguments"><code class="t">B</code></var><a class="copiable-link" href='#index-_002eDS-2'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-DS-_005bms_005d-2"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eBD"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.BD</code></strong><a class="copiable-link" href='#index-_002eBD'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-BD-_005bms_005d"></a>
+<p>Begin a (<code class="code">DS</code>: kept) a block display: the entire display is
+left-aligned, but indented such that the longest line in the display
+is centered on the page.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eDS-3"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.DS</code></strong> <var class="def-var-arguments"><code class="t">C</code></var><a class="copiable-link" href='#index-_002eDS-3'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-DS-_005bms_005d-3"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eCD"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.CD</code></strong><a class="copiable-link" href='#index-_002eCD'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-CD-_005bms_005d"></a>
+<p>Begin a (<code class="code">DS</code>: kept) centered display: each line in the display
+is centered.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eDS-4"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.DS</code></strong> <var class="def-var-arguments"><code class="t">R</code></var><a class="copiable-link" href='#index-_002eDS-4'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-DS-_005bms_005d-4"></a>
+</dd><dt class="deffnx defmacx-alias-deffnx def-cmd-deffn" id="index-_002eRD"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.RD</code></strong><a class="copiable-link" href='#index-_002eRD'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-RD-_005bms_005d"></a>
+<p>Begin a (<code class="code">DS</code>: kept) right-aligned display. This is a GNU
+extension.
+</p></dd></dl>
+
+<dl class="first-deffn first-defmac-alias-first-deffn">
+<dt class="deffn defmac-alias-deffn" id="index-_002eDE"><span class="category-def">Macro: </span><span><strong class="def-name"><code class="t">.DE</code></strong><a class="copiable-link" href='#index-_002eDE'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-DE-_005bms_005d"></a>
+<p>End any display.
+</p></dd></dl>
+
+<p>The distance stored in the <code class="code">DD</code> register is inserted before and
+after each pair of display macros; this is a Berkeley extension. In
+<code class="code">groff</code> <samp class="file">ms</samp>, this distance replaces any adjacent
+inter-paragraph distance or subsequent spacing prior to a section
+heading. The <code class="code">DI</code> register is a GNU extension; its value is an
+indentation applied to displays created with &lsquo;<samp class="samp">.DS</samp>&rsquo; and &lsquo;<samp class="samp">.ID</samp>&rsquo;
+without arguments, to &lsquo;<samp class="samp">.DS I</samp>&rsquo; without an indentation argument, and
+to indented equations set with &lsquo;<samp class="samp">.EQ</samp>&rsquo;. Changes to either register
+take effect at the next display boundary.
+</p>
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Insertions.html">Tables, figures, equations, and references</a>, Previous: <a href="Indented-regions-in-ms.html">Indented regions</a>, Up: <a href="ms-Body-Text.html">Body Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/ms-language-and-localization.html b/doc/groff.html.node/ms-language-and-localization.html
new file mode 100644
index 0000000..032b4a0
--- /dev/null
+++ b/doc/groff.html.node/ms-language-and-localization.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>ms language and localization (The GNU Troff Manual)</title>
+
+<meta name="description" content="ms language and localization (The GNU Troff Manual)">
+<meta name="keywords" content="ms language and localization (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="ms-Body-Text.html" rel="up" title="ms Body Text">
+<link href="ms-Page-Layout.html" rel="next" title="ms Page Layout">
+<link href="ms-Footnotes.html" rel="prev" title="ms Footnotes">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span.r {font-family: initial; font-weight: normal; font-style: normal}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsubsection-level-extent" id="ms-language-and-localization">
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Page-Layout.html" accesskey="n" rel="next">Page layout</a>, Previous: <a href="ms-Footnotes.html" accesskey="p" rel="prev">Footnotes</a>, Up: <a href="ms-Body-Text.html" accesskey="u" rel="up">Body Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsubsection" id="Language-and-localization">4.6.5.11 Language and localization</h4>
+<a class="index-entry-id" id="index-ms-macros_002c-language"></a>
+<a class="index-entry-id" id="index-ms-macros_002c-localization"></a>
+<a class="index-entry-id" id="index-language-_005bms_005d"></a>
+<a class="index-entry-id" id="index-localization-_005bms_005d"></a>
+
+<p><code class="code">groff</code> <samp class="file">ms</samp> provides several strings that you can customize
+for your own purposes, or redefine to adapt the macro package to
+languages other than English. It is already localized for
+Czech, German, French, Italian, and Swedish. Load the desired
+localization macro package after <samp class="file">ms</samp>; see the
+<cite class="cite">groff_tmac<span class="r">(5)</span></cite> man page.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<div class="example">
+<pre class="example-preformatted">$ groff -ms -mfr bienvenue.ms
+</pre></div>
+</td></tr></table>
+
+<p>The following strings are available.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bREFERENCES_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[REFERENCES]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bREFERENCES_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-REFERENCES-_005bms_005d"></a>
+<p>Contains the string printed at the beginning of a references
+(bibliography) page produced with GNU <cite class="cite">refer<span class="r">(1)</span></cite>. The default
+is &lsquo;<samp class="samp">References</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bABSTRACT_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[ABSTRACT]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bABSTRACT_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-ABSTRACT-_005bms_005d"></a>
+<p>Contains the string printed at the beginning of the abstract. The
+default is &lsquo;<samp class="samp">\f[I]ABSTRACT\f[]</samp>&rsquo;; it includes font selection escape
+sequences to set the word in italics.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bTOC_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[TOC]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bTOC_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-TOC-_005bms_005d"></a>
+<p>Contains the string printed at the beginning of the table of contents.
+The default is &lsquo;<samp class="samp">Table of Contents</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_005c_002a_005bMONTH1_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH1]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH1_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH1-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH2_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH2]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH2_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH2-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH3_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH3]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH3_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH3-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH4_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH4]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH4_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH4-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH5_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH5]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH5_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH5-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH6_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH6]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH6_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH6-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH7_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH7]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH7_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH7-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH8_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH8]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH8_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH8-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH9_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH9]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH9_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH9-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH10_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH10]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH10_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH10-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH11_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH11]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH11_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH11-_005bms_005d"></a>
+</dd><dt class="deffnx def-cmd-deffn" id="index-_005c_002a_005bMONTH12_005d"><span class="category-def">String: </span><span><strong class="def-name"><code class="t">\*[MONTH12]</code></strong><a class="copiable-link" href='#index-_005c_002a_005bMONTH12_005d'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-MONTH12-_005bms_005d"></a>
+<p>Contain the full names of the calendar months. The defaults are in
+English: &lsquo;<samp class="samp">January</samp>&rsquo;, &lsquo;<samp class="samp">February</samp>&rsquo;, and so on.
+</p></dd></dl>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="ms-Page-Layout.html">Page layout</a>, Previous: <a href="ms-Footnotes.html">Footnotes</a>, Up: <a href="ms-Body-Text.html">Body Text</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/ms.html b/doc/groff.html.node/ms.html
new file mode 100644
index 0000000..aaf7bf1
--- /dev/null
+++ b/doc/groff.html.node/ms.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>ms (The GNU Troff Manual)</title>
+
+<meta name="description" content="ms (The GNU Troff Manual)">
+<meta name="keywords" content="ms (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Major-Macro-Packages.html" rel="up" title="Major Macro Packages">
+<link href="mom.html" rel="prev" title="mom">
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="ms">
+<div class="nav-panel">
+<p>
+Previous: <a href="mom.html" accesskey="p" rel="prev"><samp class="file">mom</samp></a>, Up: <a href="Major-Macro-Packages.html" accesskey="u" rel="up">Macro Packages</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="ms-1">4.6 <samp class="file">ms</samp></h3>
+<a class="index-entry-id" id="index-ms-macros"></a>
+
+<p>The <samp class="file">ms</samp> (&ldquo;manuscript&rdquo;) package is suitable for the preparation
+of letters, memoranda, reports, and books. These <code class="code">groff</code>
+macros feature cover page and table of contents generation,
+automatically numbered headings, several paragraph styles, a variety of
+text styling options, footnotes, and multi-column page layouts.
+<samp class="file">ms</samp> supports the <code class="command">tbl</code>, <code class="command">eqn</code>, <code class="command">pic</code>, and
+<code class="command">refer</code> preprocessors for inclusion of tables, mathematical
+equations, diagrams, and standardized bibliographic citations. This
+implementation is mostly compatible with the documented interface and
+behavior of AT&amp;T Unix Version&nbsp;7 <samp class="file">ms</samp>. Many extensions from
+4.2BSD (Berkeley)
+and Tenth Edition Research Unix have been recreated.
+</p>
+
+
+<ul class="mini-toc">
+<li><a href="ms-Introduction.html" accesskey="1">Introduction</a></li>
+<li><a href="ms-Document-Structure.html" accesskey="2">Document Structure</a></li>
+<li><a href="ms-Document-Control-Settings.html" accesskey="3">Document Control Settings</a></li>
+<li><a href="ms-Document-Description-Macros.html" accesskey="4">Document Description Macros</a></li>
+<li><a href="ms-Body-Text.html" accesskey="5">Body Text</a></li>
+<li><a href="ms-Page-Layout.html" accesskey="6">Page layout</a></li>
+<li><a href="Differences-from-AT_0026T-ms.html" accesskey="7">Differences from <abbr class="acronym">AT&amp;T</abbr> <samp class="file">ms</samp></a></li>
+<li><a href="ms-Legacy-Features.html" accesskey="8">Legacy Features</a></li>
+<li><a href="ms-Naming-Conventions.html" accesskey="9">Naming Conventions</a></li>
+</ul>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/troff-and-nroff-Modes.html b/doc/groff.html.node/troff-and-nroff-Modes.html
new file mode 100644
index 0000000..257d36e
--- /dev/null
+++ b/doc/groff.html.node/troff-and-nroff-Modes.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>troff and nroff Modes (The GNU Troff Manual)</title>
+
+<meta name="description" content="troff and nroff Modes (The GNU Troff Manual)">
+<meta name="keywords" content="troff and nroff Modes (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="GNU-troff-Reference.html" rel="up" title="GNU troff Reference">
+<link href="Line-Layout.html" rel="next" title="Line Layout">
+<link href="Character-Translations.html" rel="prev" title="Character Translations">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="section-level-extent" id="troff-and-nroff-Modes">
+<div class="nav-panel">
+<p>
+Next: <a href="Line-Layout.html" accesskey="n" rel="next">Line Layout</a>, Previous: <a href="Character-Translations.html" accesskey="p" rel="prev">Character Translations</a>, Up: <a href="GNU-troff-Reference.html" accesskey="u" rel="up">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h3 class="section" id="troff-and-nroff-Modes-1">5.14 <code class="code">troff</code> and <code class="code">nroff</code> Modes</h3>
+<a class="index-entry-id" id="index-troff-mode"></a>
+<a class="index-entry-id" id="index-mode_002c-troff"></a>
+<a class="index-entry-id" id="index-nroff-mode"></a>
+<a class="index-entry-id" id="index-mode_002c-nroff"></a>
+
+<p>Historically, <code class="code">nroff</code> and <code class="code">troff</code> were two separate programs;
+the former for terminal output, the latter for typesetters. GNU
+<code class="code">troff</code> merges both functions into one executable<a class="footnote" id="DOCF68" href="groff.html_fot.html#FOOT68"><sup>68</sup></a> that sends its output to a
+device driver (<code class="code">grotty</code> for terminal devices, <code class="code">grops</code> for
+PostScript, and so on) which interprets this intermediate output format.
+When discussing <abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code>, it makes sense to talk
+about <em class="dfn"><code class="code">nroff</code> mode</em> and <em class="dfn"><code class="code">troff</code> mode</em> since the
+differences are hard-coded. GNU <code class="code">troff</code> takes information from
+device and font description files without handling requests specially if
+a terminal output device is used, so such a strong distinction is
+unnecessary.
+</p>
+<p>Usually, a macro package can be used with all output devices.
+Nevertheless, it is sometimes necessary to make a distinction between
+terminal and non-terminal devices: GNU <code class="code">troff</code> provides two
+built-in conditions &lsquo;<samp class="samp">n</samp>&rsquo; and &lsquo;<samp class="samp">t</samp>&rsquo; for the <code class="code">if</code>, <code class="code">ie</code>,
+and <code class="code">while</code> requests to decide whether GNU <code class="code">troff</code> shall
+behave like <code class="code">nroff</code> or like <code class="code">troff</code>.
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002etroff"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.troff</code></strong><a class="copiable-link" href='#index-_002etroff'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-troff"></a>
+<a class="index-entry-id" id="index-troffrc-4"></a>
+<a class="index-entry-id" id="index-troffrc_002dend-2"></a>
+<p>Make the &lsquo;<samp class="samp">t</samp>&rsquo; built-in condition true (and the &lsquo;<samp class="samp">n</samp>&rsquo; built-in
+condition false) for <code class="code">if</code>, <code class="code">ie</code>, and <code class="code">while</code> conditional
+requests. This is the default if GNU <code class="code">troff</code> (<em class="emph">not</em>
+<code class="code">groff</code>) is started with the <samp class="option">-R</samp> switch to avoid loading of
+the startup files <samp class="file">troffrc</samp> and <samp class="file">troffrc-end</samp>. Without
+<samp class="option">-R</samp>, GNU <code class="code">troff</code> stays in <code class="code">troff</code> mode if the output
+device is not a terminal (e.g., &lsquo;ps&rsquo;).
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002enroff"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.nroff</code></strong><a class="copiable-link" href='#index-_002enroff'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-nroff"></a>
+<a class="index-entry-id" id="index-tty_002etmac"></a>
+<p>Make the &lsquo;<samp class="samp">n</samp>&rsquo; built-in condition true (and the &lsquo;<samp class="samp">t</samp>&rsquo; built-in
+condition false) for <code class="code">if</code>, <code class="code">ie</code>, and <code class="code">while</code> conditional
+requests. This is the default if GNU <code class="code">troff</code> uses a terminal
+output device; the code for switching to <code class="code">nroff</code> mode is in the
+file <samp class="file">tty.tmac</samp>, which is loaded by the startup file
+<code class="code">troffrc</code>.
+</p></dd></dl>
+
+<p>See <a class="xref" href="Conditionals-and-Loops.html">Conditionals and Loops</a>, for more details on built-in conditions.
+</p>
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="Line-Layout.html">Line Layout</a>, Previous: <a href="Character-Translations.html">Character Translations</a>, Up: <a href="GNU-troff-Reference.html">GNU <code class="code">troff</code> Reference</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.html.node/while.html b/doc/groff.html.node/while.html
new file mode 100644
index 0000000..f9a0bae
--- /dev/null
+++ b/doc/groff.html.node/while.html
@@ -0,0 +1,161 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<!-- This manual documents GNU troff version 1.23.0.
+
+Copyright © 1994-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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". -->
+<title>while (The GNU Troff Manual)</title>
+
+<meta name="description" content="while (The GNU Troff Manual)">
+<meta name="keywords" content="while (The GNU Troff Manual)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="Request-Index.html" rel="index" title="Request Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Conditionals-and-Loops.html" rel="up" title="Conditionals and Loops">
+<link href="if_002delse.html" rel="prev" title="if-else">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+div.example {margin-left: 3.2em}
+span:hover a.copiable-link {visibility: visible}
+strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="subsection-level-extent" id="while">
+<div class="nav-panel">
+<p>
+Previous: <a href="if_002delse.html" accesskey="p" rel="prev">if-else</a>, Up: <a href="Conditionals-and-Loops.html" accesskey="u" rel="up">Conditionals and Loops</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<h4 class="subsection" id="while-1">5.23.5 while</h4>
+<a class="index-entry-id" id="index-while"></a>
+
+<p><code class="code">groff</code> provides a looping construct: the <code class="code">while</code> request.
+Its syntax matches the <code class="code">if</code> request.
+</p>
+<a class="index-entry-id" id="index-body_002c-of-a-while-request"></a>
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ewhile"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.while</code></strong> <var class="def-var-arguments">cond-expr anything</var><a class="copiable-link" href='#index-_002ewhile'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-while-1"></a>
+<p>Evaluate the conditional expression <var class="var">cond-expr</var>, and repeatedly
+execute <var class="var">anything</var> unless and until <var class="var">cond-expr</var> evaluates false.
+<var class="var">anything</var>, which is often a conditional block, is referred to as
+the <code class="code">while</code> request&rsquo;s <em class="dfn">body</em>.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.nr a 0 1
+.while (\na &lt; 9) \{\
+\n+a,
+.\}
+\n+a
+ &rArr; 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
+</pre></div></div>
+
+<a class="index-entry-id" id="index-de-request_002c-and-while"></a>
+<p>GNU <code class="code">troff</code> treats the body of a <code class="code">while</code> request similarly to
+that of a <code class="code">de</code> request (albeit one not read in copy
+mode<a class="footnote" id="DOCF94" href="groff.html_fot.html#FOOT94"><sup>94</sup></a>), but stores it under an internal name
+and deletes it when the loop finishes. The operation of a macro
+containing a <code class="code">while</code> request can slow significantly if the
+<code class="code">while</code> body is large. Each time the macro is executed, the
+<code class="code">while</code> body is parsed and stored again.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de xxx
+. nr num 10
+. while (\\n[num] &gt; 0) \{\
+. \&quot; many lines of code
+. nr num -1
+. \}
+..
+</pre></div></div>
+
+<a class="index-entry-id" id="index-recursive-macros"></a>
+<a class="index-entry-id" id="index-macros_002c-recursive"></a>
+<p>An often better solution&mdash;and one that is more portable, since
+<abbr class="acronym">AT&amp;T</abbr> <code class="code">troff</code> lacked the <code class="code">while</code> request&mdash;is to
+instead write a recursive macro. It will be parsed only
+once.<a class="footnote" id="DOCF95" href="groff.html_fot.html#FOOT95"><sup>95</sup></a>
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.de yyy
+. if (\\n[num] &gt; 0) \{\
+. \&quot; many lines of code
+. nr num -1
+. yyy
+. \}
+..
+.
+.de xxx
+. nr num 10
+. yyy
+..
+</pre></div></div>
+
+<p>To prevent infinite loops, the default number of available recursion
+levels is 1,000 or somewhat less.<a class="footnote" id="DOCF96" href="groff.html_fot.html#FOOT96"><sup>96</sup></a> You can
+disable this protective measure, or raise the limit, by setting the
+<code class="code">slimit</code> register. See <a class="xref" href="Debugging.html">Debugging</a>.
+</p>
+<p>As noted above, if a <code class="code">while</code> body begins with a conditional block,
+its closing brace must end an input line.
+</p>
+<div class="example">
+<div class="group"><pre class="example-preformatted">.if 1 \{\
+. nr a 0 1
+. while (\n[a] &lt; 10) \{\
+. nop \n+[a]
+.\}\}
+ error&rarr; unbalanced brace escape sequences
+</pre></div></div>
+</dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002ebreak"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.break</code></strong><a class="copiable-link" href='#index-_002ebreak'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-break-2"></a>
+<a class="index-entry-id" id="index-while-request_002c-confusing-with-br"></a>
+<a class="index-entry-id" id="index-break-request_002c-in-a-while-loop"></a>
+<a class="index-entry-id" id="index-continue-request_002c-in-a-while-loop"></a>
+<p>Exit a <code class="code">while</code> loop. Do not confuse this request with a
+typographical break or the <code class="code">br</code> request.
+</p></dd></dl>
+
+<dl class="first-deffn">
+<dt class="deffn" id="index-_002econtinue"><span class="category-def">Request: </span><span><strong class="def-name"><code class="t">.continue</code></strong><a class="copiable-link" href='#index-_002econtinue'> &para;</a></span></dt>
+<dd><a class="index-entry-id" id="index-continue"></a>
+<p>Skip the remainder of a <code class="code">while</code> loop&rsquo;s body, immediately starting
+the next iteration.
+</p></dd></dl>
+
+
+
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Previous: <a href="if_002delse.html">if-else</a>, Up: <a href="Conditionals-and-Loops.html">Conditionals and Loops</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Request-Index.html" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/groff.info b/doc/groff.info
new file mode 100644
index 0000000..0b36c23
--- /dev/null
+++ b/doc/groff.info
@@ -0,0 +1,423 @@
+This is groff.info, produced by makeinfo version 7.0.3 from groff.texi.
+
+This manual documents GNU 'troff' version 1.23.0.
+
+ Copyright © 1994-2023 Free Software Foundation, Inc.
+
+ Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU Free Documentation License,
+ Version 1.3 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".
+INFO-DIR-SECTION Typesetting
+START-INFO-DIR-ENTRY
+* Groff: (groff). The GNU roff document formatting system.
+END-INFO-DIR-ENTRY
+
+
+Indirect:
+groff.info-1: 723
+groff.info-2: 303755
+groff.info-3: 616581
+
+Tag Table:
+(Indirect)
+Node: Top723
+Node: Introduction1683
+Node: Background2155
+Node: What Is groff?3968
+Node: groff Capabilities4894
+Node: Macro Package Intro6241
+Node: Preprocessor Intro6920
+Node: Preprocessor Intro-Footnotes8331
+Ref: Preprocessor Intro-Footnote-18413
+Node: Output Device Intro8492
+Node: Installation9120
+Node: Conventions Used in This Manual9504
+Node: Conventions Used in This Manual-Footnotes12548
+Ref: Conventions Used in This Manual-Footnote-112656
+Ref: Conventions Used in This Manual-Footnote-212844
+Node: Credits12873
+Node: Invoking groff13398
+Node: Invoking groff-Footnotes14739
+Ref: Invoking groff-Footnote-114813
+Node: Groff Options14866
+Node: Environment27526
+Node: Macro Directories30791
+Node: Macro Directories-Footnotes32254
+Ref: Macro Directories-Footnote-132334
+Node: Font Directories32407
+Node: Paper Format34380
+Node: Invocation Examples35840
+Node: Tutorial for Macro Users37422
+Node: Basics38129
+Node: Basics-Footnotes44199
+Ref: Basics-Footnote-144257
+Node: Common Features44415
+Node: Paragraphs45648
+Node: Sections and Chapters47257
+Node: Headers and Footers47761
+Node: Page Layout Adjustment48487
+Node: Displays and Keeps48979
+Node: Footnotes and Endnotes50257
+Node: Table of Contents50860
+Node: Indexing51812
+Node: Document Formats52253
+Node: Columnation52749
+Node: Font and Size Changes53032
+Node: Predefined Text53542
+Node: Preprocessor Support53852
+Node: Configuration and Customization54295
+Node: Major Macro Packages54667
+Node: man55737
+Node: Optional man extensions56224
+Node: mdoc60222
+Node: me60495
+Node: mm61061
+Node: mom61398
+Node: ms62297
+Node: ms Introduction63317
+Node: ms Introduction-Footnotes63762
+Ref: ms Introduction-Footnote-163838
+Node: ms basic information64073
+Node: ms Document Structure67998
+Node: ms Document Control Settings70473
+Node: ms Document Control Settings-Footnotes79653
+Ref: ms Document Control Settings-Footnote-179755
+Node: ms Document Description Macros79795
+Node: ms Document Description Macros-Footnotes84030
+Ref: ms Document Description Macros-Footnote-184136
+Node: ms Body Text84257
+Node: Text settings in ms84898
+Node: Typographical symbols in ms86081
+Node: Paragraphs in ms86721
+Node: Headings in ms89617
+Node: Typeface and decoration94721
+Node: Typeface and decoration-Footnotes98631
+Ref: Typeface and decoration-Footnote-198723
+Node: Lists in ms99063
+Node: Indented regions in ms102246
+Node: ms keeps and displays103228
+Node: ms Insertions107422
+Node: ms Footnotes110390
+Node: ms Footnotes-Footnotes114176
+Ref: ms Footnotes-Footnote-1114246
+Ref: ms Footnotes-Footnote-2114371
+Ref: ms Footnotes-Footnote-3114462
+Node: ms language and localization114532
+Node: ms Page Layout116058
+Node: ms Headers and Footers116520
+Node: Tab Stops in ms119000
+Node: ms Margins119381
+Node: ms Multiple Columns119765
+Node: ms TOC120726
+Node: Differences from AT&T ms126332
+Node: Differences from AT&T ms-Footnotes131038
+Ref: Differences from AT&T ms-Footnote-1131132
+Ref: Differences from AT&T ms-Footnote-2131258
+Ref: Differences from AT&T ms-Footnote-3131348
+Node: Missing Unix Version 7 ms Macros131620
+Node: Missing Unix Version 7 ms Macros-Footnotes132934
+Ref: Missing Unix Version 7 ms Macros-Footnote-1133044
+Node: ms Legacy Features133212
+Node: ms Naming Conventions135940
+Node: GNU troff Reference136988
+Node: Text138082
+Node: Filling139361
+Node: Filling-Footnotes140444
+Ref: Filling-Footnote-1140504
+Ref: Filling-Footnote-2140555
+Node: Sentences140825
+Node: Sentences-Footnotes145108
+Ref: Sentences-Footnote-1145172
+Ref: Sentences-Footnote-2145389
+Ref: Sentences-Footnote-3145651
+Node: Hyphenation145830
+Node: Breaking146782
+Node: Breaking-Footnotes149367
+Ref: Breaking-Footnote-1149429
+Node: Adjustment149494
+Node: Tabs and Leaders149985
+Node: Tabs and Leaders-Footnotes151169
+Ref: Tabs and Leaders-Footnote-1151247
+Node: Requests and Macros151362
+Node: Requests and Macros-Footnotes157082
+Ref: Requests and Macros-Footnote-1157166
+Ref: Requests and Macros-Footnote-2157277
+Ref: Requests and Macros-Footnote-3157378
+Ref: Requests and Macros-Footnote-4157439
+Node: Macro Packages157508
+Node: Macro Packages-Footnotes158336
+Ref: Macro Packages-Footnote-1158410
+Node: Input Encodings158492
+Node: Input Encodings-Footnotes161415
+Ref: Input Encodings-Footnote-1161491
+Ref: Input Encodings-Footnote-2161688
+Node: Input Conventions161863
+Node: Input Conventions-Footnotes166824
+Ref: Input Conventions-Footnote-1166904
+Node: Page Geometry166958
+Node: Page Geometry-Footnotes170630
+Ref: Page Geometry-Footnote-1170702
+Ref: Page Geometry-Footnote-2170762
+Node: Measurements170831
+Node: Motion Quanta172770
+Node: Default Units173707
+Node: Numeric Expressions175213
+Node: Numeric Expressions-Footnotes183975
+Ref: Numeric Expressions-Footnote-1184059
+Ref: Numeric Expressions-Footnote-2184152
+Ref: Numeric Expressions-Footnote-3184251
+Ref: Numeric Expressions-Footnote-4184291
+Ref: Numeric Expressions-Footnote-5184513
+Node: Identifiers184541
+Node: Identifiers-Footnotes189589
+Ref: Identifiers-Footnote-1189657
+Ref: Identifiers-Footnote-2190254
+Node: Formatter Instructions190373
+Node: Control Characters191643
+Node: Control Characters-Footnotes193934
+Ref: Control Characters-Footnote-1194016
+Node: Invoking Requests194052
+Node: Invoking Requests-Footnotes196161
+Ref: Invoking Requests-Footnote-1196241
+Node: Calling Macros196411
+Node: Calling Macros-Footnotes200319
+Ref: Calling Macros-Footnote-1200393
+Ref: Calling Macros-Footnote-2200457
+Node: Using Escape Sequences200630
+Node: Using Escape Sequences-Footnotes205504
+Ref: Using Escape Sequences-Footnote-1205594
+Ref: Using Escape Sequences-Footnote-2205696
+Node: Delimiters205736
+Node: Comments208561
+Node: Comments-Footnotes211181
+Ref: Comments-Footnote-1211243
+Ref: Comments-Footnote-2211305
+Ref: Comments-Footnote-3211341
+Node: Registers211504
+Node: Setting Registers212084
+Node: Interpolating Registers216559
+Node: Auto-increment217536
+Node: Auto-increment-Footnotes219451
+Ref: Auto-increment-Footnote-1219525
+Node: Assigning Register Formats219598
+Node: Built-in Registers223328
+Node: Built-in Registers-Footnotes227032
+Ref: Built-in Registers-Footnote-1227114
+Node: Manipulating Filling and Adjustment227198
+Node: Manipulating Filling and Adjustment-Footnotes240315
+Ref: Manipulating Filling and Adjustment-Footnote-1240431
+Ref: Manipulating Filling and Adjustment-Footnote-2240479
+Ref: Manipulating Filling and Adjustment-Footnote-3240514
+Node: Manipulating Hyphenation240634
+Node: Manipulating Hyphenation-Footnotes258827
+Ref: Manipulating Hyphenation-Footnote-1258921
+Ref: Manipulating Hyphenation-Footnote-2259086
+Ref: Manipulating Hyphenation-Footnote-3259175
+Ref: Manipulating Hyphenation-Footnote-4259316
+Ref: Manipulating Hyphenation-Footnote-5259639
+Ref: Manipulating Hyphenation-Footnote-6259813
+Node: Manipulating Spacing259881
+Node: Manipulating Spacing-Footnotes265594
+Ref: Manipulating Spacing-Footnote-1265680
+Ref: Manipulating Spacing-Footnote-2265717
+Ref: Manipulating Spacing-Footnote-3265760
+Ref: Manipulating Spacing-Footnote-4265828
+Node: Tabs and Fields265887
+Node: Tabs and Fields-Footnotes272139
+Ref: Tabs and Fields-Footnote-1272215
+Node: Leaders272279
+Node: Leaders-Footnotes274266
+Ref: Leaders-Footnote-1274326
+Node: Fields274486
+Node: Character Translations275876
+Node: troff and nroff Modes279395
+Node: troff and nroff Modes-Footnotes281486
+Ref: troff and nroff Modes-Footnote-1281574
+Node: Line Layout281682
+Node: Line Continuation287718
+Node: Line Continuation-Footnotes290503
+Ref: Line Continuation-Footnote-1290583
+Node: Page Layout290925
+Node: Page Layout-Footnotes294492
+Ref: Page Layout-Footnote-1294560
+Node: Page Control294583
+Node: Page Control-Footnotes299166
+Ref: Page Control-Footnote-1299236
+Node: Using Fonts299264
+Node: Using Fonts-Footnotes302473
+Ref: Using Fonts-Footnote-1302541
+Ref: Using Fonts-Footnote-2302742
+Ref: Using Fonts-Footnote-3302830
+Ref: Using Fonts-Footnote-4302986
+Node: Selecting Fonts303755
+Node: Font Families308177
+Node: Font Families-Footnotes312061
+Ref: Font Families-Footnote-1312133
+Node: Font Positions312167
+Node: Using Symbols315056
+Node: Using Symbols-Footnotes333721
+Ref: Using Symbols-Footnote-1333793
+Ref: Using Symbols-Footnote-2333911
+Ref: Using Symbols-Footnote-3334033
+Ref: Using Symbols-Footnote-4334069
+Node: Character Classes334229
+Node: Special Fonts337008
+Node: Artificial Fonts338195
+Node: Ligatures and Kerning343712
+Node: Italic Corrections347081
+Node: Dummy Characters348505
+Node: Dummy Characters-Footnotes351282
+Ref: Dummy Characters-Footnote-1351360
+Node: Manipulating Type Size and Vertical Spacing351819
+Node: Manipulating Type Size and Vertical Spacing-Footnotes352771
+Ref: Manipulating Type Size and Vertical Spacing-Footnote-1352903
+Ref: Manipulating Type Size and Vertical Spacing-Footnote-2353261
+Node: Changing the Type Size353349
+Node: Changing the Type Size-Footnotes356390
+Ref: Changing the Type Size-Footnote-1356480
+Node: Changing the Vertical Spacing356622
+Node: Using Fractional Type Sizes359239
+Node: Using Fractional Type Sizes-Footnotes362878
+Ref: Using Fractional Type Sizes-Footnote-1362978
+Node: Colors363029
+Node: Colors-Footnotes367195
+Ref: Colors-Footnote-1367253
+Node: Strings367298
+Ref: als375644
+Node: Strings-Footnotes377468
+Ref: Strings-Footnote-1377528
+Node: Conditionals and Loops377555
+Node: Operators in Conditionals378008
+Node: Operators in Conditionals-Footnotes382841
+Ref: Operators in Conditionals-Footnote-1382937
+Ref: Operators in Conditionals-Footnote-2383111
+Ref: Operators in Conditionals-Footnote-3383421
+Ref: Operators in Conditionals-Footnote-4383552
+Ref: Operators in Conditionals-Footnote-5383693
+Node: if-then383766
+Node: if-else385440
+Node: Conditional Blocks386605
+Node: Conditional Blocks-Footnotes389892
+Ref: Conditional Blocks-Footnote-1389974
+Node: while389997
+Node: while-Footnotes392531
+Ref: while-Footnote-1392587
+Ref: while-Footnote-2392614
+Ref: while-Footnote-3392645
+Node: Writing Macros392733
+Node: Writing Macros-Footnotes399609
+Ref: Writing Macros-Footnote-1399683
+Ref: Writing Macros-Footnote-2399710
+Ref: Writing Macros-Footnote-3399915
+Node: Parameters400164
+Node: Parameters-Footnotes404230
+Ref: Parameters-Footnote-1404296
+Node: Copy Mode404707
+Node: Copy Mode-Footnotes410433
+Ref: Copy Mode-Footnote-1410497
+Ref: Copy Mode-Footnote-2410561
+Node: Page Motions410647
+Node: Page Motions-Footnotes420569
+Ref: Page Motions-Footnote-1420639
+Ref: Page Motions-Footnote-2420829
+Node: Drawing Geometric Objects420895
+Node: Drawing Geometric Objects-Footnotes429469
+Ref: Drawing Geometric Objects-Footnote-1429565
+Node: Deferring Output429662
+Node: Traps432701
+Node: Vertical Position Traps433531
+Node: Page Location Traps434625
+Node: Page Location Traps-Footnotes442638
+Ref: Page Location Traps-Footnote-1442722
+Ref: Page Location Traps-Footnote-2442762
+Ref: Page Location Traps-Footnote-3442850
+Node: The Implicit Page Trap443048
+Node: The Implicit Page Trap-Footnotes444309
+Ref: The Implicit Page Trap-Footnote-1444399
+Ref: The Implicit Page Trap-Footnote-2444426
+Node: Diversion Traps444454
+Node: Input Line Traps445241
+Node: Blank Line Traps448690
+Node: Leading Space Traps449222
+Node: End-of-input Traps450106
+Node: End-of-input Traps-Footnotes454067
+Ref: End-of-input Traps-Footnote-1454149
+Ref: End-of-input Traps-Footnote-2454300
+Node: Diversions454402
+Node: Diversions-Footnotes463874
+Ref: Diversions-Footnote-1463940
+Node: Punning Names464008
+Node: Punning Names-Footnotes467295
+Ref: Punning Names-Footnote-1467367
+Node: Environments467421
+Node: Suppressing Output472573
+Node: I/O475340
+Node: Postprocessor Access484470
+Node: Postprocessor Access-Footnotes487454
+Ref: Postprocessor Access-Footnote-1487540
+Ref: Postprocessor Access-Footnote-2487600
+Node: Miscellaneous487776
+Node: Miscellaneous-Footnotes494416
+Ref: Miscellaneous-Footnote-1494488
+Ref: Miscellaneous-Footnote-2494524
+Node: Gtroff Internals494774
+Node: Gtroff Internals-Footnotes499136
+Ref: Gtroff Internals-Footnote-1499214
+Node: Debugging499355
+Node: Warnings506281
+Node: Implementation Differences511010
+Node: Safer Mode511464
+Node: Compatibility Mode511946
+Node: Compatibility Mode-Footnotes517233
+Ref: Compatibility Mode-Footnote-1517315
+Node: Other Differences517696
+Node: Other Differences-Footnotes524092
+Ref: Other Differences-Footnote-1524172
+Ref: Other Differences-Footnote-2524252
+Ref: Other Differences-Footnote-3524429
+Node: File Formats524649
+Node: gtroff Output524960
+Node: gtroff Output-Footnotes526820
+Ref: gtroff Output-Footnote-1526892
+Node: Language Concepts527027
+Node: Separation528140
+Node: Argument Units530374
+Node: Document Parts531511
+Node: Command Reference532909
+Node: Comment Command533325
+Node: Simple Commands533823
+Node: Graphics Commands539265
+Node: Device Control Commands546605
+Node: Obsolete Command550738
+Node: Intermediate Output Examples552015
+Node: Output Language Compatibility554799
+Node: Device and Font Description Files556878
+Node: Device and Font Description Files-Footnotes558261
+Ref: Device and Font Description Files-Footnote-1558373
+Node: DESC File Format558434
+Node: Font Description File Format564511
+Node: Font Description File Format-Footnotes572537
+Ref: Font Description File Format-Footnote-1572639
+Ref: Font Description File Format-Footnote-2572793
+Ref: Font Description File Format-Footnote-3573006
+Ref: Font Description File Format-Footnote-4573115
+Node: Copying This Manual573202
+Node: Request Index598317
+Node: Escape Sequence Index616581
+Node: Operator Index623925
+Node: Register Index625858
+Node: Macro Index640236
+Node: String Index651800
+Node: File Keyword Index659362
+Node: Program and File Index663322
+Node: Concept Index669178
+
+End Tag Table
+
+
+Local Variables:
+coding: iso-8859-1
+End:
diff --git a/doc/groff.info-1 b/doc/groff.info-1
new file mode 100644
index 0000000..e2db4ec
--- /dev/null
+++ b/doc/groff.info-1
@@ -0,0 +1,7824 @@
+This is groff.info, produced by makeinfo version 7.0.3 from groff.texi.
+
+This manual documents GNU 'troff' version 1.23.0.
+
+ Copyright © 1994-2023 Free Software Foundation, Inc.
+
+ Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU Free Documentation License,
+ Version 1.3 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".
+INFO-DIR-SECTION Typesetting
+START-INFO-DIR-ENTRY
+* Groff: (groff). The GNU roff document formatting system.
+END-INFO-DIR-ENTRY
+
+
+File: groff.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir)
+
+GNU 'troff'
+***********
+
+* Menu:
+
+* Introduction::
+* Invoking groff::
+* Tutorial for Macro Users::
+* Major Macro Packages::
+* GNU troff Reference::
+* File Formats::
+* Copying This Manual::
+* Request Index::
+* Escape Sequence Index::
+* Operator Index::
+* Register Index::
+* Macro Index::
+* String Index::
+* File Keyword Index::
+* Program and File Index::
+* Concept Index::
+
+This manual documents GNU 'troff' version 1.23.0.
+
+ Copyright © 1994-2023 Free Software Foundation, Inc.
+
+ Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU Free Documentation License,
+ Version 1.3 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".
+
+
+File: groff.info, Node: Introduction, Next: Invoking groff, Prev: Top, Up: Top
+
+1 Introduction
+**************
+
+GNU 'roff' (or 'groff') is a programming system for typesetting
+documents. It is highly flexible and has been used extensively for over
+thirty years.
+
+* Menu:
+
+* Background::
+* What Is groff?::
+* groff Capabilities::
+* Macro Package Intro::
+* Preprocessor Intro::
+* Output Device Intro::
+* Conventions Used in This Manual::
+* Installation::
+* Credits::
+
+
+File: groff.info, Node: Background, Next: What Is groff?, Prev: Introduction, Up: Introduction
+
+1.1 Background
+==============
+
+M. Douglas McIlroy, formerly of AT&T Bell Laboratories and present at
+the creation of the Unix operating system, offers an authoritative
+historical summary.
+
+ The prime reason for Unix was the desire of Ken [Thompson], Dennis
+ [Ritchie], and Joe Ossanna to have a pleasant environment for
+ software development. The fig leaf that got the nod from ...
+ management was that an early use would be to develop a
+ "stand-alone" word-processing system for use in typing pools and
+ secretarial offices. Perhaps they had in mind "dedicated", as
+ distinct from "stand-alone"; that's what eventuated in various
+ cases, most notably in the legal/patent department and in the AT&T
+ CEO's office.
+
+ Both those systems were targets of opportunity, not foreseen from
+ the start. When Unix was up and running on the PDP-11, Joe got
+ wind of the legal department having installed a commercial word
+ processor. He went to pitch Unix as an alternative and clinched a
+ trial by promising to make 'roff' able to number lines by tomorrow
+ in order to fulfill a patent-office requirement that the commercial
+ system did not support.
+
+ Modems were installed so legal-department secretaries could try the
+ Research machine. They liked it and Joe's superb customer service.
+ Soon the legal department got a system of their own. Joe went on
+ to create 'nroff' and 'troff'. Document preparation became a
+ widespread use of Unix, but no stand-alone word-processing system
+ was ever undertaken.
+
+ A history relating 'groff' to its predecessors 'roff', 'nroff', and
+'troff' is available in the 'roff(7)' man page.
+
+
+File: groff.info, Node: What Is groff?, Next: groff Capabilities, Prev: Introduction, Up: Introduction
+
+1.2 What Is 'groff'?
+====================
+
+'groff' (GNU 'roff') is a typesetting system that reads plain text input
+files that include formatting commands to produce output in PostScript,
+PDF, HTML, DVI, or other formats, or for display to a terminal.
+Formatting commands can be low-level typesetting primitives, macros from
+a supplied package, or user-defined macros. All three approaches can be
+combined.
+
+ A reimplementation and extension of the typesetter from AT&T Unix,
+'groff' is present on most POSIX systems owing to its long association
+with Unix manuals (including man pages). It and its predecessor are
+notable for their production of several best-selling software
+engineering texts. 'groff' is capable of producing typographically
+sophisticated documents while consuming minimal system resources.
+
+
+File: groff.info, Node: groff Capabilities, Next: Macro Package Intro, Prev: What Is groff?, Up: Introduction
+
+1.3 'groff' Capabilities
+========================
+
+GNU 'troff' is a typesetting document formatter; it provides a wide
+range of low-level text and page operations within the framework of a
+programming language. These operations compose to generate footnotes,
+tables of contents, mathematical equations, diagrams, multi-column text,
+and other elements of typeset works. Here is a survey of formatter
+features; all are under precise user control.
+
+ * text filling, breaking, alignment to the left or right margin;
+ centering
+
+ * adjustment of inter-word space size to justify text, and of
+ inter-sentence space size to suit local style conventions
+
+ * automatic and manual determination of hyphenation break points
+
+ * pagination
+
+ * selection of any font available to the output device
+
+ * adjustment of type size and vertical spacing (or "leading")
+
+ * configuration of line length and indentation amounts; columnation
+
+ * drawing of geometric primitives (lines, arcs, polygons, circles,
+ ...)
+
+ * setup of stroke and fill colors (where supported by the output
+ device)
+
+ * embedding of hyperlinks, images, document metadata, and other
+ inclusions (where supported by the output device)
+
+
+File: groff.info, Node: Macro Package Intro, Next: Preprocessor Intro, Prev: groff Capabilities, Up: Introduction
+
+1.4 Macro Packages
+==================
+
+Elemental typesetting functions can be be challenging to use directly
+with complex documents. A "macro" facility specifies how certain
+routine operations, such as starting paragraphs, or printing headers and
+footers, should be performed in terms of those low-level instructions.
+Macros can be specific to one document or collected together into a
+"macro package" for use by many. Several macro packages available; the
+most widely used are provided with 'groff'. They are 'man', 'mdoc',
+'me', 'mm', 'mom', and 'ms'.
+
+
+File: groff.info, Node: Preprocessor Intro, Next: Output Device Intro, Prev: Macro Package Intro, Up: Introduction
+
+1.5 Preprocessors
+=================
+
+An alternative approach to complexity management, particularly when
+constructing tables, setting mathematics, or drawing diagrams, lies in
+preprocessing. A "preprocessor" employs a domian-specific language to
+ease the generation of tables, equations, and so forth in terms that are
+convenient for human entry. Each preprocessor reads a document and
+translates the parts of it that apply to it into GNU 'troff' input.
+Command-line options to 'groff' tell it which preprocessors to use.
+
+ 'groff' provides preprocessors for laying out tables ('gtbl'),
+typesetting equations ('geqn'), drawing diagrams ('gpic' and 'ggrn'),
+inserting bibliographic references ('grefer'), and drawing chemical
+structures ('gchem'). An associated program that is useful when dealing
+with preprocessors is 'gsoelim'.(1) (*note Preprocessor
+Intro-Footnote-1::)
+
+ 'groff' also supports 'grap', a preprocessor for drawing graphs. A
+free implementation of it can be obtained separately.
+
+ Unique to 'groff' is the 'preconv' preprocessor that enables 'groff'
+to handle documents in a variety of input encodings.
+
+ Other preprocessors exist, but no free implementations are known. An
+example is 'ideal', which draws diagrams using a mathematical constraint
+language.
+
+
+File: groff.info, Node: Preprocessor Intro-Footnotes, Up: Preprocessor Intro
+
+ (1) The 'g' prefix is not used on all systems; see *note Invoking
+groff::.
+
+
+File: groff.info, Node: Output Device Intro, Next: Installation, Prev: Preprocessor Intro, Up: Introduction
+
+1.6 Output Devices
+==================
+
+GNU 'troff''s output is in a device-independent page description
+language, which is then read by an "output driver" that translates this
+language into a file format or byte stream that a piece of (possibly
+emulated) hardware understands. 'groff' features output drivers for
+PostScript devices, terminal emulators (and other simple typewriter-like
+machines), X11 (for previewing), TeX DVI, HP LaserJet 4/PCL5 and Canon
+LBP printers (which use CaPSL), HTML, XHTML, and PDF.
+
+
+File: groff.info, Node: Installation, Next: Conventions Used in This Manual, Prev: Output Device Intro, Up: Introduction
+
+1.7 Installation
+================
+
+Locate installation instructions in the files 'INSTALL',
+'INSTALL.extra', and 'INSTALL.REPO' in the 'groff' source distribution.
+Being a GNU project, 'groff' supports the familiar './configure && make'
+command sequence.
+
+
+File: groff.info, Node: Conventions Used in This Manual, Next: Credits, Prev: Installation, Up: Introduction
+
+1.8 Conventions Used in This Manual
+===================================
+
+We apply the term "groff" to the language documented here, the GNU
+implementation of the overall system, the project that develops that
+system, and the command of that name. In the first sense, 'groff' is an
+extended dialect of the 'roff' language, for which many similar
+implementations exist.
+
+ The 'roff' language features several major categories for which many
+items are predefined. Presentations of these items feature the form in
+which the item is most commonly used on the left, and, aligned to the
+right margin, the name of the category in brackets.
+
+ -- Register: \n[example]
+ The register 'example' is one that that 'groff' _doesn't_
+ predefine. You can create it yourself, though; see *note Setting
+ Registers::.
+
+ To make this document useful as a reference and not merely amiable
+bedtime reading, we tend to present these syntax items in exhaustive
+detail when they arise. References to topics discussed later in the
+text are frequent; skip material you don't understand yet.
+
+ We use Texinfo's "result" (=>) and error-> notations to present
+output written to the standard output and standard error streams,
+respectively. Diagnostic messages from the GNU 'troff' formatter and
+other programs are examples of the latter, but the formatter can also be
+directed to write user-specified messages to the standard error stream.
+The notation then serves to identify the output stream and does not
+necessarily mean that an error has occurred.(1) (*note Conventions Used
+in This Manual-Footnote-1::)
+
+ $ echo "Twelve o'clock and" | groff -Tascii | sed '/^$/d'
+ => Twelve o'clock and
+ $ echo '.tm all is well.' | groff > /dev/null
+ error-> all is well.
+
+ Sometimes we use => somewhat abstractly to represent formatted text
+that you will need to use a PostScript or PDF viewer program (or a
+printer) to observe. While arguably an abuse of notation, we think this
+preferable to requiring the reader to understand the syntax of these
+page description languages.
+
+ We also present diagnostic messages in an abbreviated form, often
+omitting the name of the program issuing them, the input file name, and
+line number or other positional information when such data do not serve
+to illuminate the topic under discussion.
+
+ Most examples are of 'roff' language input that would be placed in a
+text file. Occasionally, we start an example with a '$' character to
+indicate a shell prompt, as seen above.
+
+ You are encouraged to try the examples yourself, and to alter them to
+better learn 'groff''s behavior. Our examples frequently need to direct
+the formatter to set a line length (with '.ll') that will fit within the
+page margins of this manual. We mention this so that you know why it is
+there before we discuss the 'll' request formally.(2) (*note
+Conventions Used in This Manual-Footnote-2::)
+
+
+File: groff.info, Node: Conventions Used in This Manual-Footnotes, Up: Conventions Used in This Manual
+
+ (1) Unix and related operating systems distinguish standard output
+and standard error streams _because_ of 'troff':
+<https://minnie.tuhs.org/pipermail/tuhs/2013-December/006113.html>.
+
+ (2) *Note Line Layout::.
+
+
+File: groff.info, Node: Credits, Prev: Conventions Used in This Manual, Up: Introduction
+
+1.9 Credits
+===========
+
+We adapted portions of this manual from existing documents. James
+Clark's man pages were an essential resource; we have updated them in
+parallel with the development of this manual. We based the tutorial for
+macro users on Eric Allman's introduction to his 'me' macro package
+(which we also provide, little altered from 4.4BSD). Larry Kollar
+contributed much of the material on the 'ms' macro package.
+
+
+File: groff.info, Node: Invoking groff, Next: Tutorial for Macro Users, Prev: Introduction, Up: Top
+
+2 Invoking 'groff'
+******************
+
+This chapter focuses on how to invoke the 'groff' front end. This front
+end takes care of the details of constructing the pipeline among the
+preprocessors, 'gtroff' and the postprocessor.
+
+ It has become a tradition that GNU programs get the prefix 'g' to
+distinguish them from their original counterparts provided by the host
+(*note Environment::). Thus, for example, 'geqn' is GNU 'eqn'. On
+operating systems like GNU/Linux or the Hurd, which don't contain
+proprietary versions of 'troff', and on MS-DOS/MS-Windows, where 'troff'
+and associated programs are not available at all, this prefix is omitted
+since GNU 'troff' is the only incarnation of 'troff' used. Exception:
+'groff' is never replaced by 'roff'.
+
+ In this document, we consequently say 'gtroff' when talking about the
+GNU 'troff' program. All other implementations of 'troff' are called
+AT&T 'troff', which is the common origin of almost all 'troff'
+implementations(1) (*note Invoking groff-Footnote-1::) (with more or
+less compatible changes). Similarly, we say 'gpic', 'geqn', and so on.
+
+* Menu:
+
+* Groff Options::
+* Environment::
+* Macro Directories::
+* Font Directories::
+* Paper Format::
+* Invocation Examples::
+
+
+File: groff.info, Node: Invoking groff-Footnotes, Up: Invoking groff
+
+ (1) Besides 'groff', 'neatroff' is an exception.
+
+
+File: groff.info, Node: Groff Options, Next: Environment, Prev: Invoking groff, Up: Invoking groff
+
+2.1 Options
+===========
+
+'groff' normally runs the 'gtroff' program and a postprocessor
+appropriate for the selected device. The default device is 'ps' (but it
+can be changed when 'groff' is configured and built). It can optionally
+preprocess with any of 'gpic', 'geqn', 'gtbl', 'ggrn', 'grap', 'gchem',
+'grefer', 'gsoelim', or 'preconv'.
+
+ This section documents only options to the 'groff' front end. Many
+of the arguments to 'groff' are passed on to 'gtroff'; therefore, those
+are also included. Arguments to preprocessors and output drivers can be
+found in the man pages 'gpic(1)', 'geqn(1)', 'gtbl(1)', 'ggrn(1)',
+'grefer(1)', 'gchem(1)', 'gsoelim(1)', 'preconv(1)', 'grotty(1)',
+'grops(1)', 'gropdf(1)', 'grohtml(1)', 'grodvi(1)', 'grolj4(1)',
+'grolbp(1)', and 'gxditview(1)'.
+
+ The command-line format for 'groff' is:
+
+ groff [ -abceghijklpstvzCEGNRSUVXZ ] [ -dCS ] [ -DARG ]
+ [ -fFAM ] [ -FDIR ] [ -IDIR ] [ -KARG ]
+ [ -LARG ] [ -mNAME ] [ -MDIR ] [ -nNUM ]
+ [ -oLIST ] [ -PARG ] [ -rCN ] [ -TDEV ]
+ [ -wNAME ] [ -WNAME ] [ FILES... ]
+
+ The command-line format for 'gtroff' is as follows.
+
+ gtroff [ -abcivzCERU ] [ -dCS ] [ -fFAM ] [ -FDIR ]
+ [ -mNAME ] [ -MDIR ] [ -nNUM ] [ -oLIST ]
+ [ -rCN ] [ -TNAME ] [ -wNAME ] [ -WNAME ]
+ [ FILES... ]
+
+Obviously, many of the options to 'groff' are actually passed on to
+'gtroff'.
+
+ Options without an argument can be grouped behind a single '-'. A
+filename of '-' denotes the standard input. Whitespace is permitted
+between an option and its argument.
+
+ The 'grog' command can be used to guess the correct 'groff' command
+to format a file. See its man page 'grog(1)'; type 'man grog' at the
+command line to view it.
+
+ 'groff''s command-line options are as follows.
+
+'-a'
+ Generate a plain text approximation of the typeset output. The
+ read-only register '.A' is set to 1. *Note Built-in Registers::.
+ This option produces a sort of abstract preview of the formatted
+ output.
+
+ * Page breaks are marked by a phrase in angle brackets; for
+ example, '<beginning of page>'.
+
+ * Lines are broken where they would be in the formatted output.
+
+ * A horizontal motion of any size is represented as one space.
+ Adjacent horizontal motions are not combined. Inter-sentence
+ space nodes (those arising from the second argument to the
+ 'ss' request) are not represented.
+
+ * Vertical motions are not represented.
+
+ * Special characters are rendered in angle brackets; for
+ example, the default soft hyphen character appears as '<hy>'.
+
+ The above description should not be considered a specification; the
+ details of '-a' output are subject to change.
+
+'-b'
+ Write a backtrace reporting the state of 'gtroff''s input parser to
+ the standard error stream with each diagnostic message. The line
+ numbers given in the backtrace might not always be correct, because
+ 'gtroff''s idea of line numbers can be confused by requests that
+ append to macros.
+
+'-c'
+ Start with color output disabled.
+
+'-C'
+ Enable AT&T 'troff' compatibility mode; implies '-c'. *Note
+ Implementation Differences::, for the list of incompatibilities
+ between 'groff' and AT&T 'troff'.
+
+'-dCTEXT'
+'-dSTRING=TEXT'
+ Define 'roff' string C or STRING as T or TEXT. C must be one
+ character; STRING can be of arbitrary length. Such string
+ assignments happen before any macro file is loaded, including the
+ startup file. Due to 'getopt_long' limitations, C cannot be, and
+ STRING cannot contain, an equals sign, even though that is a valid
+ character in a 'roff' identifier.
+
+'-DENC'
+ Set fallback input encoding used by 'preconv' to ENC; implies '-k'.
+
+'-e'
+ Run 'geqn' preprocessor.
+
+'-E'
+ Inhibit 'gtroff' error messages. This option does _not_ suppress
+ messages sent to the standard error stream by documents or macro
+ packages using 'tm' or related requests.
+
+'-fFAM'
+ Use FAM as the default font family. *Note Font Families::.
+
+'-FDIR'
+ Search in directory 'DIR' for the selected output device's
+ directory of device and font description files. See the
+ description of 'GROFF_FONT_PATH' in *note Environment:: below for
+ the default search locations and ordering.
+
+'-g'
+ Run 'ggrn' preprocessor.
+
+'-G'
+ Run 'grap' preprocessor; implies '-p'.
+
+'-h'
+ Display a usage message and exit.
+
+'-i'
+ Read the standard input after all the named input files have been
+ processed.
+
+'-IDIR'
+ Search the directory DIR for files named in several contexts;
+ implies '-g' and '-s'.
+
+ * 'gsoelim' replaces 'so' requests with the contents of their
+ file name arguments.
+
+ * 'gtroff' searches for files named as operands in its command
+ line and as arguments to 'psbb', 'so', and 'soquiet' requests.
+
+ * Output drivers may search for files; for instance, 'grops'
+ looks for files named in '\X'ps: import ...'', '\X'ps: file
+ ...'', and '\X'pdf: pdfpic ...'' device control escape
+ sequences.
+
+ This option may be specified more than once; the directories are
+ searched in the order specified. If you want to search the current
+ directory before others, add '-I .' at the desired place. The
+ current working directory is otherwise searched last. '-I' works
+ similarly to, and is named for, the "include" option of Unix C
+ compilers.
+
+ '-I' options are passed to 'gsoelim', 'gtroff', and output drivers;
+ with the flag letter changed to '-M', they are also passed to
+ 'ggrn'.
+
+'-j'
+ Run 'gchem' preprocessor. Implies '-p'.
+
+'-k'
+ Run 'preconv' preprocessor. Refer to its man page for its behavior
+ if neither of 'groff''s '-K' or '-D' options is also specified.
+
+'-KENC'
+ Set input encoding used by 'preconv' to ENC; implies '-k'.
+
+'-l'
+ Send the output to a spooler for printing. The 'print' directive
+ in the device description file specifies the default command to be
+ used; see *note Device and Font Description Files::. See options
+ '-L' and '-X'.
+
+'-LARG'
+ Pass ARG to the print spooler program. If multiple ARGs are
+ required, pass each with a separate '-L' option. 'groff' does not
+ prefix an option dash to ARG before passing it to the spooler
+ program.
+
+'-mNAME'
+ Process the file 'NAME.tmac' prior to any input files. If not
+ found, 'tmac.NAME' is attempted. NAME (in both arrangements) is
+ presumed to be a macro file; see the description of
+ 'GROFF_TMAC_PATH' in *note Environment:: below for the default
+ search locations and ordering. This option and its argument are
+ also passed to 'geqn', 'grap', and 'ggrn'.
+
+'-MDIR'
+ Search directory 'DIR' for macro files; see the description of
+ 'GROFF_TMAC_PATH' in *note Environment:: below for the default
+ search locations and ordering. This option and its argument are
+ also passed to 'geqn', 'grap', and 'ggrn'.
+
+'-nNUM'
+ Number the first page NUM.
+
+'-N'
+ Prohibit newlines between 'eqn' delimiters: pass '-N' to 'geqn'.
+
+'-oLIST'
+ Output only pages in LIST, which is a comma-separated list of page
+ ranges; 'N' means page N, 'M-N' means every page between M and N,
+ '-N' means every page up to N, 'N-' means every page from N on.
+ 'gtroff' stops processing and exits after formatting the last page
+ enumerated in LIST.
+
+'-p'
+ Run 'gpic' preprocessor.
+
+'-PARG'
+ Pass ARG to the postprocessor. If multiple ARGs are required, pass
+ each with a separate '-P' option. 'groff' does not prefix an
+ option dash to ARG before passing it to the postprocessor.
+
+'-rCNUMERIC-EXPRESSION'
+'-rREGISTER=EXPR'
+ Set 'roff' register C or REGISTER to the value NUMERIC-EXPRESSION
+ (*note Numeric Expressions::). C must be one character; REGISTER
+ can be of arbitrary length. Such register assignments happen
+ before any macro file is loaded, including the startup file. Due
+ to 'getopt_long' limitations, C cannot be, and REGISTER cannot
+ contain, an equals sign, even though that is a valid character in a
+ 'roff' identifier.
+
+'-R'
+ Run 'grefer' preprocessor. No mechanism is provided for passing
+ arguments to 'grefer' because most 'grefer' options have equivalent
+ language elements that can be specified within the document.
+
+ 'gtroff' also accepts a '-R' option, which is not accessible via
+ 'groff'. This option prevents the loading of the 'troffrc' and
+ 'troffrc-end' files.
+
+'-s'
+ Run 'gsoelim' preprocessor.
+
+'-S'
+ Operate in "safer" mode; see '-U' below for its opposite. For
+ security reasons, safer mode is enabled by default.
+
+'-t'
+ Run 'gtbl' preprocessor.
+
+'-TDEV'
+ Direct 'gtroff' to format the input for the output device DEV.
+ 'groff' then calls an output driver to convert 'gtroff''s output to
+ a form appropriate for DEV. The following output devices are
+ available.
+
+ 'ps'
+ For PostScript printers and previewers.
+
+ 'pdf'
+ For PDF viewers or printers.
+
+ 'dvi'
+ For TeX DVI format.
+
+ 'X75'
+ For a 75dpi X11 previewer.
+
+ 'X75-12'
+ For a 75dpi X11 previewer with a 12-point base font in the
+ document.
+
+ 'X100'
+ For a 100dpi X11 previewer.
+
+ 'X100-12'
+ For a 100dpi X11 previewer with a 12-point base font in the
+ document.
+
+ 'ascii'
+ For typewriter-like devices using the (7-bit) ASCII (ISO 646)
+ character set.
+
+ 'latin1'
+ For typewriter-like devices that support the Latin-1
+ (ISO 8859-1) character set.
+
+ 'utf8'
+ For typewriter-like devices that use the Unicode (ISO 10646)
+ character set with UTF-8 encoding.
+
+ 'cp1047'
+ For typewriter-like devices that use the EBCDIC encoding IBM
+ code page 1047.
+
+ 'lj4'
+ For HP LaserJet4-compatible (or other PCL5-compatible)
+ printers.
+
+ 'lbp'
+ For Canon CaPSL printers (LBP-4 and LBP-8 series laser
+ printers).
+
+ 'html'
+ 'xhtml'
+ To produce HTML and XHTML output, respectively. This driver
+ consists of two parts, a preprocessor ('pre-grohtml') and a
+ postprocessor ('post-grohtml').
+
+ The predefined GNU 'troff' string '.T' contains the name of the
+ output device; the read-only register '.T' is set to 1 if this
+ option is used (which is always true if 'groff' is used to call GNU
+ 'troff'). *Note Built-in Registers::.
+
+ The postprocessor to be used for a device is specified by the
+ 'postpro' command in the device description file. (*Note Device
+ and Font Description Files::.) This can be overridden with the
+ '-X' option.
+
+'-U'
+ Operate in "unsafe mode", which enables the 'open', 'opena', 'pi',
+ 'pso', and 'sy' requests. These requests are disabled by default
+ because they allow an untrusted input document to write to
+ arbitrary file names and run arbitrary commands. This option also
+ adds the current directory to the macro package search path; see
+ the '-m' option above. '-U' is passed to 'gpic' and 'gtroff'.
+
+'-v'
+ Write version information for 'groff' and all programs run by it to
+ the standard output stream; that is, the given command line is
+ processed in the usual way, passing '-v' to the formatter and any
+ pre- or postprocessors invoked.
+
+'-V'
+ Output the pipeline that would be run by 'groff' (as a wrapper
+ program) to the standard output stream, but do not execute it. If
+ given more than once, the pipeline is both written to the standard
+ error stream and run.
+
+'-wCATEGORY'
+ Enable warnings in CATEGORY. Categories are listed in *note
+ Warnings::.
+
+'-WCATEGORY'
+ Inhibit warnings in CATEGORY. Categories are listed in *note
+ Warnings::.
+
+'-X'
+ Use 'gxditview' instead of the usual postprocessor to (pre)view a
+ document on an X11 display. Combining this option with '-Tps' uses
+ the font metrics of the PostScript device, whereas the '-TX75' and
+ '-TX100' options use the metrics of X11 fonts.
+
+'-z'
+ Suppress formatted output from 'gtroff'.
+
+'-Z'
+ Disable postprocessing. 'gtroff' output will appear on the
+ standard output stream (unless suppressed with '-z'; see *note
+ gtroff Output:: for a description of this format.
+
+
+File: groff.info, Node: Environment, Next: Macro Directories, Prev: Groff Options, Up: Invoking groff
+
+2.2 Environment
+===============
+
+There are also several environment variables (of the operating system,
+not within 'gtroff') that can modify the behavior of 'groff'.
+
+'GROFF_BIN_PATH'
+ This search path, followed by 'PATH', is used for commands executed
+ by 'groff'.
+
+'GROFF_COMMAND_PREFIX'
+ If this is set to X, then 'groff' runs 'Xtroff' instead of
+ 'gtroff'. This also applies to 'tbl', 'pic', 'eqn', 'grn', 'chem',
+ 'refer', and 'soelim'. It does not apply to 'grops', 'grodvi',
+ 'grotty', 'pre-grohtml', 'post-grohtml', 'preconv', 'grolj4',
+ 'gropdf', and 'gxditview'.
+
+ The default command prefix is determined during the installation
+ process. If a non-GNU 'troff' system is found, prefix 'g' is used,
+ none otherwise.
+
+'GROFF_ENCODING'
+ The value of this variable is passed to the 'preconv'
+ preprocessor's '-e' option to select the character encoding of
+ input files. This variable's existence implies the 'groff' option
+ '-k'. If set but empty, 'groff' calls 'preconv' without an '-e'
+ option. 'groff''s '-K' option overrides 'GROFF_ENCODING'. See the
+ 'preconv(7)' man page; type 'man preconv' at the command line to
+ view it.
+
+'GROFF_FONT_PATH'
+ A list of directories in which to seek the selected output device's
+ directory of device and font description files. GNU 'troff' will
+ search directories given as arguments to any specified '-F' options
+ before these, and a built-in list of directories after them. *Note
+ Font Directories:: and the 'troff(1)' or 'gtroff(1)' man pages.
+
+'GROFF_TMAC_PATH'
+ A list of directories in which to seek macro files. GNU 'troff'
+ will search directories given as arguments to any specified '-M'
+ options before these, and a built-in list of directories after
+ them. *Note Macro Directories:: and the 'troff(1)' or 'gtroff(1)'
+ man pages.
+
+'GROFF_TMPDIR'
+ The directory in which 'groff' creates temporary files. If this is
+ not set and 'TMPDIR' is set, temporary files are created in that
+ directory. Otherwise temporary files are created in a
+ system-dependent default directory (on Unix and GNU/Linux systems,
+ this is usually '/tmp'). 'grops', 'grefer', 'pre-grohtml', and
+ 'post-grohtml' can create temporary files in this directory.
+
+'GROFF_TYPESETTER'
+ Sets the default output device. If empty or not set, a build-time
+ default (often 'ps') is used. The '-TDEV' option overrides
+ 'GROFF_TYPESETTER'.
+
+'SOURCE_DATE_EPOCH'
+ A timestamp (expressed as seconds since the Unix epoch) to use as
+ the output creation timestamp in place of the current time. The
+ time is converted to human-readable form using 'localtime(3)' when
+ the formatter starts up and stored in registers usable by documents
+ and macro packages (*note Built-in Registers::).
+
+'TZ'
+ The time zone to use when converting the current time (or value of
+ 'SOURCE_DATE_EPOCH') to human-readable form; see 'tzset(3)'.
+
+ MS-DOS and MS-Windows ports of 'groff' use semicolons, rather than
+colons, to separate the directories in the lists described above.
+
+
+File: groff.info, Node: Macro Directories, Next: Font Directories, Prev: Environment, Up: Invoking groff
+
+2.3 Macro Directories
+=====================
+
+A macro file must have a name in the form 'NAME.tmac' or 'tmac.NAME' and
+be placed in a "tmac directory" to be found by the '-mNAME' command-line
+option.(1) (*note Macro Directories-Footnote-1::) Together, these
+directories constitute the "tmac path". Each directory is searched in
+the following order until the desired macro file is found or the list is
+exhausted.
+
+ * Directories specified with GNU 'troff''s or 'groff''s '-M'
+ command-line option.
+
+ * Directories listed in the 'GROFF_TMAC_PATH' environment variable.
+
+ * The current working directory (only if in unsafe mode using the
+ '-U' command-line option).
+
+ * The user's home directory, 'HOME'.
+
+ * A platform-dependent directory, a site-local (platform-independent)
+ directory, and the main tmac directory. The locations
+ corresponding to your installation are listed in section
+ "Environment" of 'gtroff(1)'. If not otherwise configured, they
+ are as follows.
+
+ /usr/local/lib/groff/site-tmac
+ /usr/local/share/groff/site-tmac
+ /usr/local/share/groff/1.23.0/tmac
+
+ The foregoing assumes that the version of 'groff' is 1.23.0, and
+ that the installation prefix was '/usr/local'. It is possible to
+ fine-tune these locations during the source configuration process.
+
+
+File: groff.info, Node: Macro Directories-Footnotes, Up: Macro Directories
+
+ (1) The 'mso' request does not have these limitations. *Note I/O::.
+
+
+File: groff.info, Node: Font Directories, Next: Paper Format, Prev: Macro Directories, Up: Invoking groff
+
+2.4 Font Directories
+====================
+
+'groff' enforces few restrictions on how font description files are
+named. For its family/style mechanism to work (*note Font Families::),
+the names of fonts within a family should start with the family name,
+followed by the style. For example, the Times family uses 'T' for the
+family name and 'R', 'B', 'I', and 'BI' to indicate the styles 'roman',
+'bold', 'italic', and 'bold italic', respectively. Thus the final font
+names are 'TR', 'TB', 'TI', and 'TBI'.
+
+ Font description files are kept in "font directories", which together
+constitute the "font path". The search procedure always appends the
+directory 'dev'NAME, where NAME is the name of the output device.
+Assuming TeX DVI output, and '/foo/bar' as a font directory, the font
+description files for 'grodvi' must be in '/foo/bar/devdvi'. Each
+directory in the font path is searched in the following order until the
+desired font description file is found or the list is exhausted.
+
+ * Directories specified with GNU 'troff''s or 'groff''s '-f'
+ command-line option. All output drivers (and some preprocessors)
+ support this option as well, because they require information about
+ the glyphs to be rendered in the document.
+
+ * Directories listed in the 'GROFF_FONT_PATH' environment variable.
+
+ * A site-local directory and the main font description directory.
+ The locations corresponding to your installation are listed in
+ section "Environment" of 'gtroff(1)'. If not otherwise configured,
+ they are as follows.
+
+ /usr/local/share/groff/site-font
+ /usr/local/share/groff/1.23.0/font
+
+ The foregoing assumes that the version of 'groff' is 1.23.0, and
+ that the installation prefix was '/usr/local'. It is possible to
+ fine-tune these locations during the source configuration process.
+
+
+File: groff.info, Node: Paper Format, Next: Invocation Examples, Prev: Font Directories, Up: Invoking groff
+
+2.5 Paper Format
+================
+
+In 'groff', the page dimensions for the formatter GNU 'troff' and for
+output devices are handled separately. *Note Page Layout::, for
+vertical manipulation of the page size, and *Note Line Layout::, for
+horizontal changes. The 'papersize' macro package, normally loaded by
+'troffrc' at startup, provides an interface for configuring page
+dimensions by convenient names, like 'letter' or 'a4'; see
+'groff_tmac(5)'. The default used by the formatter depends on its build
+configuration, but is usually one of the foregoing, as geographically
+appropriate.
+
+ It is up to each macro package to respect the page dimensions
+configured in this way.
+
+ For each output device, the size of the output medium can be set in
+its 'DESC' file. Most output drivers also recognize a command-line
+option '-p' to override the default dimensions and an option '-l' to use
+landscape orientation. *Note DESC File Format::, for a description of
+the 'papersize' keyword, which takes an argument of the same form as
+'-p'. The output driver's man page, such as 'grops(1)', may also be
+helpful.
+
+ 'groff' uses the command-line option '-P' to pass options to
+postprocessors; for example, use the following for PostScript output on
+A4 paper in landscape orientation.
+
+ groff -Tps -dpaper=a4l -P-pa4 -P-l -ms foo.ms > foo.ps
+
+
+File: groff.info, Node: Invocation Examples, Prev: Paper Format, Up: Invoking groff
+
+2.6 Invocation Examples
+=======================
+
+'roff' systems are best known for formatting man pages. Once a 'man'
+librarian program has located a man page, it may execute a 'groff'
+command much like the following.
+
+ groff -t -man -Tutf8 /usr/share/man/man1/groff.1
+
+ The librarian will also pipe the output through a pager, which might
+not interpret the SGR terminal escape sequences 'groff' emits for
+boldface, underlining, or italics; see the 'grotty(1)' man page for a
+discussion.
+
+ To process a 'roff' input file using the preprocessors 'gtbl' and
+'gpic' and the 'me' macro package in the way to which AT&T 'troff' users
+were accustomed, one would type (or script) a pipeline.
+
+ gpic foo.me | gtbl | gtroff -me -Tutf8 | grotty
+
+ Using 'groff', this pipe can be shortened to an equivalent command.
+
+ groff -p -t -me -T utf8 foo.me
+
+ An even easier way to do this is to use 'grog' to guess the
+preprocessor and macro options and execute the result by using the
+command substitution feature of the shell.
+
+ $(grog -Tutf8 foo.me)
+
+ Each command-line option to a postprocessor must be specified with
+any required leading dashes '-' because 'groff' passes the arguments
+as-is to the postprocessor; this permits arbitrary arguments to be
+transmitted. For example, to pass a title to the 'gxditview'
+postprocessor, the shell commands
+
+ groff -X -P -title -P 'trial run' mydoc.t
+
+and
+
+ groff -X -Z mydoc.t | gxditview -title 'trial run' -
+
+are equivalent.
+
+
+File: groff.info, Node: Tutorial for Macro Users, Next: Major Macro Packages, Prev: Invoking groff, Up: Top
+
+3 Tutorial for Macro Users
+**************************
+
+Most users of the 'roff' language employ a macro package to format their
+documents. Successful macro packages ease the composition process;
+their users need not have mastered the full formatting language, nor
+understand features like diversions, traps, and environments. This
+chapter aims to familiarize you with basic concepts and mechanisms
+common to many macro packages (like "displays"). If you prefer a
+meticulous and comprehensive presentation, try *note GNU troff
+Reference:: instead.
+
+* Menu:
+
+* Basics::
+* Common Features::
+
+
+File: groff.info, Node: Basics, Next: Common Features, Prev: Tutorial for Macro Users, Up: Tutorial for Macro Users
+
+3.1 Basics
+==========
+
+Let us first survey some basic concepts necessary to use a macro package
+fruitfully.(1) (*note Basics-Footnote-1::) References are made
+throughout to more detailed information.
+
+ GNU 'troff' reads an input file prepared by the user and outputs a
+formatted document suitable for publication or framing. The input
+consists of text, or words to be printed, and embedded commands
+(requests and escape sequences), which tell GNU 'troff' how to format
+the output. *Note Formatter Instructions::.
+
+ The word argument is used in this chapter to mean a word or number
+that appears on the same line as a request, and which modifies the
+meaning of that request. For example, the request
+
+ .sp
+
+spaces one line, but
+
+ .sp 4
+
+spaces four lines. The number 4 is an argument to the 'sp' request,
+which says to space four lines instead of one. Arguments are separated
+from the request and from each other by spaces (_not_ tabs). *Note
+Invoking Requests::.
+
+ The primary function of GNU 'troff' is to collect words from input
+lines, fill output lines with those words, adjust the line to the
+right-hand margin by widening spaces, and output the result. For
+example, the input:
+
+ Now is the time
+ for all good men
+ to come to the aid
+ of their party.
+ Four score and seven
+ years ago, etc.
+
+is read, packed onto output lines, and justified to produce:
+
+ => Now is the time for all good men to come to the aid of
+ => their party. Four score and seven years ago, etc.
+
+ Sometimes a new output line should be started even though the current
+line is not yet full--for example, at the end of a paragraph. To do
+this it is possible to force a break, starting a new output line. Some
+requests cause a break automatically, as do (normally) blank input lines
+and input lines beginning with a space or tab.
+
+ Not all input lines are text lines--words to be formatted. Some are
+control lines that tell a macro package (or GNU 'troff' directly) how to
+format the text. Control lines start with a dot ('.') or an apostrophe
+(''') as the first character, and can be followed by a macro call.
+
+ The formatter also does more complex things, such as automatically
+numbering pages, skipping over page boundaries, putting footnotes in the
+correct place, and so forth.
+
+ Here are a few hints for preparing text for input to GNU 'troff'.
+
+ * First, keep the input lines short. Short input lines are easier to
+ edit, and GNU 'troff' packs words onto longer lines anyhow.
+
+ * In keeping with this, it is helpful to begin a new line after every
+ comma or phrase, since common corrections are to add or delete
+ sentences or phrases.
+
+ * End each sentence with two spaces--or better, start each sentence
+ on a new line. GNU 'troff' recognizes characters that usually end
+ a sentence, and inserts inter-sentence space accordingly.
+
+ * Do not hyphenate words at the end of lines--GNU 'troff' is smart
+ enough to hyphenate words as needed, but is not smart enough to
+ take hyphens out and join a word back together. Also, words such
+ as "mother-in-law" should not be broken over a line, since then a
+ space can occur where not wanted, such as "mother- in-law".
+
+ We offer further advice in *note Input Conventions::.
+
+ GNU 'troff' permits alteration of the distance between lines of text.
+This is termed vertical spacing and is expressed in the same units as
+the type size--the point. The default is 10-point type on 12-point
+spacing. To get double-spaced text you would set the vertical spacing
+to 24 points. Some, but not all, macro packages expose a macro or
+register to configure the vertical spacing.
+
+ A number of requests allow you to change the way the output is
+arranged on the page, sometimes called the layout of the output page.
+Most macro packages don't supply macros for performing these (at least
+not without performing other actions besides), as they are such basic
+operations. The macro packages for writing man pages, 'man' and 'mdoc',
+don't encourage explicit use of these requests at all.
+
+ The request '.sp N' leaves N lines of blank space. N can be omitted
+(skipping a single line) or can be of the form Ni (for N inches) or Nc
+(for N centimeters). For example, the input:
+
+ .sp 1.5i
+ My thoughts on the subject
+ .sp
+
+leaves one and a half inches of space, followed by the line "My thoughts
+on the subject", followed by a single blank line (more measurement units
+are available; see *note Measurements::).
+
+ If you seek precision in spacing, be advised when using a macro
+package that it might not honor 'sp' requests as you expect; it can use
+a formatter feature called no-space mode to prevent excess space from
+accumulating. Macro packages typically offer registers to control
+spacing between paragraphs, before section headings, and around displays
+(discussed below); use these facilities preferentially. *Note
+Manipulating Spacing::.
+
+ Text lines can be centered by using the 'ce' request. The line after
+'ce' is centered (horizontally) on the page. To center more than one
+line, use '.ce N' (where N is the number of lines to center), followed
+by the N lines. To center many lines without counting them, type:
+
+ .ce 1000
+ lines to center
+ .ce 0
+
+The '.ce 0' request tells GNU 'troff' to center zero more lines, in
+other words, stop centering.
+
+ GNU 'troff' also offers the 'rj' request for right-aligning text. It
+works analogously to 'ce' and is convenient for setting epigraphs.
+
+ The 'bp' request starts a new page; this necessarily implies an
+ordinary (line) break.
+
+ All of these requests cause a break; that is, they always start a new
+line. To start a new line without performing any other action, use
+'br'. If you invoke them with the apostrophe ''', the no-break control
+character, the (initial) break they normally perform is suppressed.
+''br' does nothing.
+
+
+File: groff.info, Node: Basics-Footnotes, Up: Basics
+
+ (1) The remainder of this chapter is based on 'Writing Papers with
+nroff using -me' by Eric P. Allman, which is distributed with 'groff' as
+'meintro.me'.
+
+
+File: groff.info, Node: Common Features, Prev: Basics, Up: Tutorial for Macro Users
+
+3.2 Common Features
+===================
+
+GNU 'troff' provides low-level operations for formatting a document.
+Many routine operations are undertaken in nearly all documents that
+require a series of such primitive operations to be performed. These
+common tasks are grouped into macros, which are then collected into a
+macro package.
+
+ Macro packages come in two varieties: "major" or "full-service" ones
+that manage page layout, and "minor" or "auxiliary" ones that do not,
+instead fulfilling narrow, specific tasks. Find a list in the
+'groff_tmac(5)' man page. Type 'man groff_tmac' at the command line to
+view it.
+
+ We survey several capabilities of full-service macro package below.
+Each package employs its own macros to exercise them. For details,
+consult its man page or, for 'ms', see *note ms::.
+
+* Menu:
+
+* Paragraphs::
+* Sections and Chapters::
+* Headers and Footers::
+* Page Layout Adjustment::
+* Displays and Keeps::
+* Footnotes and Endnotes::
+* Table of Contents::
+* Indexing::
+* Document Formats::
+* Columnation::
+* Font and Size Changes::
+* Predefined Text::
+* Preprocessor Support::
+* Configuration and Customization::
+
+
+File: groff.info, Node: Paragraphs, Next: Sections and Chapters, Prev: Common Features, Up: Common Features
+
+3.2.1 Paragraphs
+----------------
+
+Paragraphs can be separated and indented in various ways. Some start
+with a blank line and have a first-line indentation, like most of the
+ones in this manual. Block paragraphs omit the indentation.
+
+ => Some men look at constitutions with sanctimonious
+ => reverence, and deem them like the ark of the
+ => covenant, too sacred to be touched.
+
+We also frequently encounter tagged paragraphs, which begin with a tag
+or label at the left margin and indent the remaining text.
+
+ => one This is the first paragraph. Notice how the
+ => first line of the resulting paragraph lines
+ => up with the other lines in the paragraph.
+
+If the tag is too wide for the indentation, the line is broken.
+
+ => longlabel
+ => The label does not align with the subsequent
+ => lines, but they align with each other.
+
+A variation of the tagged paragraph is the itemized or enumerated
+paragraph, which might use punctuation or a digit for a tag,
+respectively. These are frequently used to construct lists.
+
+ => o This list item starts with a bullet. When
+ => producing output for a device using the ASCII
+ => character set, an 'o' is formatted instead.
+
+Often, use of the same macro without a tag continues such a discussion.
+
+ => -xyz This option is recognized but ignored.
+ =>
+ => It had a security hole that we don't discuss.
+
+
+File: groff.info, Node: Sections and Chapters, Next: Headers and Footers, Prev: Paragraphs, Up: Common Features
+
+3.2.2 Sections and Chapters
+---------------------------
+
+The simplest kind of section heading is unnumbered, set in a bold or
+italic style, and occupies a line by itself. Others possess
+automatically numbered multi-level headings and/or different typeface
+styles or sizes at different levels. More sophisticated macro packages
+supply macros for designating chapters and appendices.
+
+
+File: groff.info, Node: Headers and Footers, Next: Page Layout Adjustment, Prev: Sections and Chapters, Up: Common Features
+
+3.2.3 Headers and Footers
+-------------------------
+
+Headers and footers occupy the top and bottom of each page,
+respectively, and contain data like the page number and the article or
+chapter title. Their appearance is not affected by the running text.
+Some packages allow for different titles on even- and odd-numbered pages
+(for printed, bound material).
+
+ Headers and footers are together called titles, and comprise three
+parts: left-aligned, centered, and right-aligned. A '%' character
+appearing anywhere in a title is automatically replaced by the page
+number. *Note Page Layout::.
+
+
+File: groff.info, Node: Page Layout Adjustment, Next: Displays and Keeps, Prev: Headers and Footers, Up: Common Features
+
+3.2.4 Page Layout
+-----------------
+
+Most macro packages let the user specify the size of the page margins.
+The top and bottom margins are typically handled differently than the
+left and right margins; the latter two are derived from the page offset,
+indentation, and line length. *Note Line Layout::. Commonly, packages
+support registers to tune these values.
+
+
+File: groff.info, Node: Displays and Keeps, Next: Footnotes and Endnotes, Prev: Page Layout Adjustment, Up: Common Features
+
+3.2.5 Displays and Keeps
+------------------------
+
+Displays are sections of text set off from the surrounding material
+(typically paragraphs), often differing in indentation, and/or spacing.
+Tables, block quotations, and figures are displayed. Equations and code
+examples, when not much shorter than an output line, often are. Lists
+may or may not be. Packages for setting man pages support example
+displays but not keeps.
+
+ A keep is a group of output lines, often a display, that is formatted
+on a single page if possible; it causes a page break to happen early so
+as to not interrupt the kept material.
+
+ Floating keeps can move, or "float", relative to the text around them
+in the input. They are useful for displays that are captioned and
+referred to by name, as with "See figure 3". Depending on the package,
+a floating keep appears at the bottom of the current page if it fits,
+and at the top of the next otherwise. Alternatively, floating keeps
+might be deferred to the end of a section. Using a floating keep can
+avoid the large vertical spaces that may precede a tall keep of the
+ordinary sort when it won't fit on the page.
+
+
+File: groff.info, Node: Footnotes and Endnotes, Next: Table of Contents, Prev: Displays and Keeps, Up: Common Features
+
+3.2.6 Footnotes and Endnotes
+----------------------------
+
+Footnotes and endnotes are forms of delayed formatting. They are
+recorded at their points of relevance in the input, but not formatted
+there. Instead, a mark cues the reader to check the "foot", or bottom,
+of the current page, or in the case of endnotes, an annotation list
+later in the document. Macro packages that support these features also
+supply a means of automatically numbering either type of annotation.
+
+
+File: groff.info, Node: Table of Contents, Next: Indexing, Prev: Footnotes and Endnotes, Up: Common Features
+
+3.2.7 Table of Contents
+-----------------------
+
+A package may handle a table of contents by directing section heading
+macros to save section heading text and the page number where it occurs
+for use in a later entry for a table of contents. It writes the
+collected entries at the end of the document, once all are known, upon
+request. A row of dots (a leader) bridges the text on the left with its
+location on the right. Other collections might work in this manner,
+providing lists of figures or tables.
+
+ A table of contents is often found at the end of a GNU 'troff'
+document because the formatter processes the document in a single pass.
+The 'gropdf' output driver supports a PDF feature that relocates pages
+at the time the document is rendered; see the 'gropdf(1)' man page.
+Type 'man gropdf' at the command line to view it.
+
+
+File: groff.info, Node: Indexing, Next: Document Formats, Prev: Table of Contents, Up: Common Features
+
+3.2.8 Indexing
+--------------
+
+An index is similar to a table of contents, in that entry labels and
+locations must be collected, but poses a greater challenge because it
+needs to be sorted before it is output. Here, processing the document
+in multiple passes is inescapable, and tools like the 'makeindex'
+program are necessary.
+
+
+File: groff.info, Node: Document Formats, Next: Columnation, Prev: Indexing, Up: Common Features
+
+3.2.9 Document Formats
+----------------------
+
+Some macro packages supply stock configurations of certain documents,
+like business letters and memoranda. These often also have provision
+for a cover sheet, which may be rigid in its format. With these
+features, it is even more important to use the package's macros in
+preference to the formatter requests presented earlier, where possible.
+
+
+File: groff.info, Node: Columnation, Next: Font and Size Changes, Prev: Document Formats, Up: Common Features
+
+3.2.10 Columnation
+------------------
+
+Macro packages apart from 'man' and 'mdoc' for man page formatting offer
+a facility for setting multiple columns on the page.
+
+
+File: groff.info, Node: Font and Size Changes, Next: Predefined Text, Prev: Columnation, Up: Common Features
+
+3.2.11 Font and Size Changes
+----------------------------
+
+The formatter's requests and escape sequences for setting the typeface
+and size are not always intuitive, so all macro packages provide macros
+to make these operations simpler. They also make it more convenient to
+change typefaces in the middle of a word and can handle italic
+corrections automatically. *Note Italic Corrections::.
+
+
+File: groff.info, Node: Predefined Text, Next: Preprocessor Support, Prev: Font and Size Changes, Up: Common Features
+
+3.2.12 Predefined Text
+----------------------
+
+Most macro packages supply predefined strings to set prepared text like
+the date, or to perform operations like super- and subscripting.
+
+
+File: groff.info, Node: Preprocessor Support, Next: Configuration and Customization, Prev: Predefined Text, Up: Common Features
+
+3.2.13 Preprocessor Support
+---------------------------
+
+All macro packages provide support for various preprocessors and may
+extend their functionality by defining macros to set their contents in
+displays. Examples include 'TS' and 'TE' for 'gtbl', 'EQ' and 'EN' for
+'geqn', and 'PS' and 'PE' for 'gpic'.
+
+
+File: groff.info, Node: Configuration and Customization, Prev: Preprocessor Support, Up: Common Features
+
+3.2.14 Configuration and Customization
+--------------------------------------
+
+Packages provide means of customizing many of the details of how the
+package behaves. These range from setting the default type size to
+changing the appearance of section headers.
+
+
+File: groff.info, Node: Major Macro Packages, Next: GNU troff Reference, Prev: Tutorial for Macro Users, Up: Top
+
+4 Macro Packages
+****************
+
+This chapter surveys the "major" macro packages that come with 'groff'.
+One, 'ms', is presented in detail.
+
+ Major macro packages are also sometimes described as "full-service"
+due to the breadth of features they provide and because more than one
+cannot be used by the same document; for example
+
+ groff -m man foo.man -m ms bar.doc
+
+doesn't work. Option arguments are processed before non-option
+arguments; the above (failing) sample is thus reordered to
+
+ groff -m man -m ms foo.man bar.doc
+
+ Many auxiliary, or "minor", macro packages are also available. They
+may in general be used with any full-service macro package and handle a
+variety of tasks from character encoding selection, to language
+localization, to inlining of raster images. See the 'groff_tmac(5)' man
+page for a list. Type 'man groff_tmac' at the command line to view it.
+
+* Menu:
+
+* man::
+* mdoc::
+* me::
+* mm::
+* mom::
+* ms::
+
+
+File: groff.info, Node: man, Next: mdoc, Prev: Major Macro Packages, Up: Major Macro Packages
+
+4.1 'man'
+=========
+
+The 'man' macro package is the most widely used and probably the most
+important ever developed for 'troff'. It is easy to use, and a vast
+majority of manual pages ("man pages") are written in it.
+
+ 'groff''s implementation is documented in the 'groff_man(7)' man
+page. Type 'man groff_man' at the command line to view it.
+
+* Menu:
+
+* Optional man extensions::
+
+
+File: groff.info, Node: Optional man extensions, Up: man
+
+4.1.1 Optional 'man' extensions
+-------------------------------
+
+Use the file 'man.local' for local extensions to the 'man' macros or for
+style changes.
+
+Custom headers and footers
+..........................
+
+In 'groff' versions 1.18.2 and later, you can specify custom headers and
+footers by redefining the following macros in 'man.local'.
+
+ -- Macro: .PT
+ Control the content of the headers. Normally, the header prints
+ the command name and section number on either side, and the
+ optional fifth argument to 'TH' in the center.
+
+ -- Macro: .BT
+ Control the content of the footers. Normally, the footer prints
+ the page number and the third and fourth arguments to 'TH'.
+
+ Use the 'FT' register to specify the footer position. The default
+ is -0.5i.
+
+Ultrix-specific man macros
+..........................
+
+The 'groff' source distribution includes a file named 'man.ultrix',
+containing macros compatible with the Ultrix variant of 'man'. Copy
+this file into 'man.local' (or use the 'mso' request to load it) to
+enable the following macros.
+
+ -- Macro: .CT key
+ Print '<CTRL/KEY>'.
+
+ -- Macro: .CW
+ Print subsequent text using a "constant-width" (monospaced)
+ typeface (Courier roman).
+
+ -- Macro: .Ds
+ Begin a non-filled display.
+
+ -- Macro: .De
+ End a non-filled display started with 'Ds'.
+
+ -- Macro: .EX [indent]
+ Begin a non-filled display using a monospaced typeface (Courier
+ roman). Use the optional INDENT argument to indent the display.
+
+ -- Macro: .EE
+ End a non-filled display started with 'EX'.
+
+ -- Macro: .G [text]
+ Set TEXT in Helvetica. If no text is present on the line where the
+ macro is called, then the text of the next line appears in
+ Helvetica.
+
+ -- Macro: .GL [text]
+ Set TEXT in Helvetica oblique. If no text is present on the line
+ where the macro is called, then the text of the next line appears
+ in Helvetica Oblique.
+
+ -- Macro: .HB [text]
+ Set TEXT in Helvetica bold. If no text is present on the line
+ where the macro is called, then all text up to the next 'HB'
+ appears in Helvetica bold.
+
+ -- Macro: .TB [text]
+ Identical to 'HB'.
+
+ -- Macro: .MS title sect [punct]
+ Set a man page reference in Ultrix format. The TITLE is in Courier
+ instead of italic. Optional punctuation follows the section number
+ without an intervening space.
+
+ -- Macro: .NT [C] [title]
+ Begin a note. Print the optional title, or the word "Note",
+ centered on the page. Text following the macro makes up the body
+ of the note, and is indented on both sides. If the first argument
+ is 'C', the body of the note is printed centered (the second
+ argument replaces the word "Note" if specified).
+
+ -- Macro: .NE
+ End a note begun with 'NT'.
+
+ -- Macro: .PN path [punct]
+ Set the path name in a monospaced typeface (Courier roman),
+ followed by optional punctuation.
+
+ -- Macro: .Pn [punct] path [punct]
+ If called with two arguments, identical to 'PN'. If called with
+ three arguments, set the second argument in a monospaced typeface
+ (Courier roman), bracketed by the first and third arguments in the
+ current font.
+
+ -- Macro: .R
+ Switch to roman font and turn off any underlining in effect.
+
+ -- Macro: .RN
+ Print the string '<RETURN>'.
+
+ -- Macro: .VS [4]
+ Start printing a change bar in the margin if the number '4' is
+ specified. Otherwise, this macro does nothing.
+
+ -- Macro: .VE
+ End printing the change bar begun by 'VS'.
+
+Simple example
+..............
+
+The following example 'man.local' file alters the 'SH' macro to add some
+extra vertical space before printing the heading. Headings are printed
+in Helvetica bold.
+
+ .\" Make the heading fonts Helvetica
+ .ds HF HB
+ .
+ .\" Put more space in front of headings.
+ .rn SH SH-orig
+ .de SH
+ . if t .sp (u;\\n[PD]*2)
+ . SH-orig \\$*
+ ..
+
+
+File: groff.info, Node: mdoc, Next: me, Prev: man, Up: Major Macro Packages
+
+4.2 'mdoc'
+==========
+
+'groff''s implementation of the BSD 'doc' package for man pages is
+documented in the 'groff_mdoc(7)' man page. Type 'man groff_mdoc' at
+the command line to view it.
+
+
+File: groff.info, Node: me, Next: mm, Prev: mdoc, Up: Major Macro Packages
+
+4.3 'me'
+========
+
+'groff''s implementation of the BSD 'me' macro package is documented
+using itself. A tutorial, 'meintro.me', and reference, 'meref.me', are
+available in 'groff''s documentation directory. A 'groff_me(7)' man
+page is also available and identifies the installation path for these
+documents. Type 'man groff_me' at the command line to view it.
+
+ A French translation of the tutorial is available as 'meintro_fr.me'
+and installed parallel to the English version.
+
+
+File: groff.info, Node: mm, Next: mom, Prev: me, Up: Major Macro Packages
+
+4.4 'mm'
+========
+
+'groff''s implementation of the AT&T memorandum macro package is
+documented in the 'groff_mm(7)' man page. Type 'man groff_mm' at the
+command line) to view it.
+
+ A Swedish localization of 'mm' is also available; see
+'groff_mmse(7)'.
+
+
+File: groff.info, Node: mom, Next: ms, Prev: mm, Up: Major Macro Packages
+
+4.5 'mom'
+=========
+
+The main documentation files for the 'mom' macros are in HTML format.
+Additional, useful documentation is in PDF format. See the 'groff(1)'
+man page, section "Installation Directories", for their location.
+
+ * 'toc.html' Entry point to the full mom manual.
+
+ * 'macrolist.html' Hyperlinked index of macros with brief
+ descriptions, arranged by category.
+
+ * 'mom-pdf.pdf' PDF features and usage.
+
+ The mom macros are in active development between 'groff' releases.
+The most recent version, along with up-to-date documentation, is
+available at <http://www.schaffter.ca/mom/mom-05.html>.
+
+ The 'groff_mom(7)' man page (type 'man groff_mom' at the command
+line) contains a partial list of available macros, however their usage
+is best understood by consulting the HTML documentation.
+
+
+File: groff.info, Node: ms, Prev: mom, Up: Major Macro Packages
+
+4.6 'ms'
+========
+
+The 'ms' ("manuscript") package is suitable for the preparation of
+letters, memoranda, reports, and books. These 'groff' macros feature
+cover page and table of contents generation, automatically numbered
+headings, several paragraph styles, a variety of text styling options,
+footnotes, and multi-column page layouts. 'ms' supports the 'tbl',
+'eqn', 'pic', and 'refer' preprocessors for inclusion of tables,
+mathematical equations, diagrams, and standardized bibliographic
+citations. This implementation is mostly compatible with the documented
+interface and behavior of AT&T Unix Version 7 'ms'. Many extensions
+from 4.2BSD (Berkeley) and Tenth Edition Research Unix have been
+recreated.
+
+* Menu:
+
+* ms Introduction::
+* ms Document Structure::
+* ms Document Control Settings::
+* ms Document Description Macros::
+* ms Body Text::
+* ms Page Layout::
+* Differences from AT&T ms::
+* ms Legacy Features::
+* ms Naming Conventions::
+
+
+File: groff.info, Node: ms Introduction, Next: ms Document Structure, Prev: ms, Up: ms
+
+4.6.1 Introduction
+------------------
+
+The 'ms' macros are the oldest surviving package for 'roff' systems.(1)
+(*note ms Introduction-Footnote-1::) While the 'man' package was
+designed for brief reference documents, the 'ms' macros are also
+suitable for longer works intended for printing and possible
+publication.
+
+* Menu:
+
+* ms basic information::
+
+
+File: groff.info, Node: ms Introduction-Footnotes, Up: ms Introduction
+
+ (1) While manual _pages_ are older, early ones used macros supplanted
+by the 'man' package of Seventh Edition Unix (1979). 'ms' shipped with
+Sixth Edition (1975) and was documented by Mike Lesk in a Bell Labs
+internal memorandum.
+
+
+File: groff.info, Node: ms basic information, Next: ms Document Structure, Prev: ms Introduction, Up: ms Introduction
+
+4.6.1.1 Basic information
+.........................
+
+'ms' documents are plain text files; prepare them with your preferred
+text editor. If you're in a hurry to start, know that 'ms' needs one of
+its macros called at the beginning of a document so that it can
+initialize. A "macro" is a formatting instruction to 'ms'. Put a macro
+call on a line by itself. Use '.PP' if you want your paragraph's first
+line to be indented, or '.LP' if you don't.
+
+ After that, start typing normally. It is a good practice to start
+each sentence on a new line, or to put two spaces after sentence-ending
+punctuation, so that the formatter knows where the sentence boundaries
+are. You can separate paragraphs with further paragraphing macros, or
+with blank lines, and you can indent with tabs. When you need one of
+the features mentioned earlier (*note ms::), return to this part of the
+manual.
+
+ Format the document with the 'groff' command. 'nroff' can be useful
+for previewing.
+
+ $ editor radical.ms
+ $ nroff -ww -z -ms radical.ms # check for errors
+ $ nroff -ms radical.ms | less -R
+ $ groff -T ps -ms radical.ms > radical.ps
+ $ see radical.ps
+
+ Our 'radical.ms' document might look like this.
+
+ .LP
+ Radical novelties are so disturbing that they tend to be
+ suppressed or ignored, to the extent that even the
+ possibility of their existence in general is more often
+ denied than admitted.
+
+ ->That's what Dijkstra said, anyway.
+
+ 'ms' exposes many aspects of document layout to user control via
+'groff''s "registers" and "strings", which store numbers and text,
+respectively. Measurements in 'groff' are expressed with a suffix
+called a "scaling unit".
+
+'i'
+ inches
+
+'c'
+ centimeters
+
+'p'
+ points (1/72 inch)
+
+'P'
+ picas (1/6 inch)
+
+'v'
+ vees; current vertical spacing
+
+'m'
+ ems; width of an "M" in the current font
+
+'n'
+ ens; one-half em
+
+ Set registers with the 'nr' request and strings with the 'ds'
+request. "Requests" are like macro calls; they go on lines by
+themselves and start with the "control character", a dot ('.'). The
+difference is that they directly instruct the formatter program, rather
+than the macro package. We'll discuss a few as applicable. It is wise
+to specify a scaling unit when setting any register that represents a
+length, size, or distance.
+
+ .nr PS 10.5p \" Use 10.5-point type.
+ .ds FAM P \" Use Palatino font family.
+
+In the foregoing, we see that '\"' begins a comment. This is an example
+of an "escape sequence", the other kind of formatting instruction.
+Escape sequences can appear anywhere. They begin with the escape
+character ('\') and are followed by at least one more character. 'ms'
+documents tend to use only a few of 'groff''s many requests and escape
+sequences; see *note Request Index:: and *note Escape Sequence Index::
+or the 'groff(7)' man page for complete lists.
+
+'\"'
+ Begin comment; ignore remainder of line.
+
+'\n[REG]'
+ Interpolate value of register REG.
+
+'\*[STR]'
+ Interpolate contents of string STR.
+
+'\*S'
+ abbreviation of '\*[S]'; the name S must be only one character
+
+'\[CHAR]'
+ Interpolate glyph of special character named CHAR.
+
+'\&'
+ dummy character
+
+'\~'
+ Insert an unbreakable space that is adjustable like a normal space.
+
+'\|'
+ Move horizontally by one-sixth em ("thin space").
+
+ Prefix any words that start with a dot '.' or neutral apostrophe '''
+with '\&' if they are at the beginning of an input line (or might become
+that way in editing) to prevent them from being interpreted as macro
+calls or requests. Suffix '.', '?', and '!' with '\&' when needed to
+cancel end-of-sentence detection.
+
+ My exposure was \&.5 to \&.6 Sv of neutrons, said Dr.\&
+ Wallace after the criticality incident.
+
+
+File: groff.info, Node: ms Document Structure, Next: ms Document Control Settings, Prev: ms Introduction, Up: ms
+
+4.6.2 Document Structure
+------------------------
+
+The 'ms' macro package expects a certain amount of structure: a
+well-formed document contains at least one paragraphing or heading macro
+call. Longer documents have a structure as follows.
+
+*Document type*
+ Calling the 'RP' macro at the beginning of your document puts the
+ document description (see below) on a cover page. Otherwise, 'ms'
+ places the information (if any) on the first page, followed
+ immediately by the body text. Some document types found in other
+ 'ms' implementations are specific to AT&T or Berkeley, and are not
+ supported by 'groff' 'ms'.
+
+*Format and layout*
+ By setting registers and strings, you can configure your document's
+ typeface, margins, spacing, headers and footers, and footnote
+ arrangement. *Note ms Document Control Settings::.
+
+*Document description*
+ A document description consists of any of: a title, one or more
+ authors' names and affiliated institutions, an abstract, and a date
+ or other identifier. *Note ms Document Description Macros::.
+
+*Body text*
+ The main matter of your document follows its description (if any).
+ 'ms' supports highly structured text consisting of paragraphs
+ interspersed with multi-level headings (chapters, sections,
+ subsections, and so forth) and augmented by lists, footnotes,
+ tables, diagrams, and similar material. *Note ms Body Text::.
+
+*Tables of contents*
+ Macros enable the collection of entries for a table of contents (or
+ index) as the material they discuss appears in the document. You
+ then call a macro to emit the table of contents at the end of your
+ document. The table of contents must necessarily follow the rest
+ of the text since GNU 'troff' is a single-pass formatter; it thus
+ cannot determine the page number of a division of the text until it
+ has been set and output. Since 'ms' was designed for the
+ production of hard copy, the traditional procedure was to manually
+ relocate the pages containing the table of contents between the
+ cover page and the body text. Today, page resequencing is more
+ often done in the digital domain. An index works similarly, but
+ because it typically needs to be sorted after collection, its
+ preparation requires separate processing.
+
+
+File: groff.info, Node: ms Document Control Settings, Next: ms Document Description Macros, Prev: ms Document Structure, Up: ms
+
+4.6.3 Document Control Settings
+-------------------------------
+
+'ms' exposes many aspects of document layout to user control via 'groff'
+requests. To use them, you must understand how to define registers and
+strings.
+
+ -- Request: .nr reg value
+ Set register REG to VALUE. If REG doesn't exist, GNU 'troff'
+ creates it.
+
+ -- Request: .ds name contents
+ Set string NAME to CONTENTS.
+
+ A list of document control registers and strings follows. For any
+parameter whose default is unsatisfactory, define its register or string
+before calling any 'ms' macro other than 'RP'.
+
+Margin settings
+...............
+
+ -- Register: \n[PO]
+ Defines the page offset (i.e., the left margin).
+
+ Effective: next page.
+
+ Default: Varies by output device and paper format; 1i is used for
+ typesetters using U.S. letter paper, and zero for terminals. *Note
+ Paper Format::.
+
+ -- Register: \n[LL]
+ Defines the line length (i.e., the width of the body text).
+
+ Effective: next paragraph.
+
+ Default: Varies by output device and paper format; 6.5i is used for
+ typesetters using U.S. letter paper (*note Paper Format::) and 65n
+ on terminals.
+
+ -- Register: \n[LT]
+ Defines the title line length (i.e., the header and footer width).
+ This is usually the same as 'LL', but need not be.
+
+ Effective: next paragraph.
+
+ Default: Varies by output device and paper format; 6.5i is used for
+ typesetters using U.S. letter paper (*note Paper Format::) and 65n
+ on terminals.
+
+ -- Register: \n[HM]
+ Defines the header margin height at the top of the page.
+
+ Effective: next page.
+
+ Default: 1i.
+
+ -- Register: \n[FM]
+ Defines the footer margin height at the bottom of the page.
+
+ Effective: next page.
+
+ Default: 1i.
+
+Titles (headers, footers)
+.........................
+
+ -- String: \*[LH]
+ Defines the text displayed in the left header position.
+
+ Effective: next header.
+
+ Default: empty.
+
+ -- String: \*[CH]
+ Defines the text displayed in the center header position.
+
+ Effective: next header.
+
+ Default: '-\n[%]-'.
+
+ -- String: \*[RH]
+ Defines the text displayed in the right header position.
+
+ Effective: next header.
+
+ Default: empty.
+
+ -- String: \*[LF]
+ Defines the text displayed in the left footer position.
+
+ Effective: next footer.
+
+ Default: empty.
+
+ -- String: \*[CF]
+ Defines the text displayed in the center footer position.
+
+ Effective: next footer.
+
+ Default: empty.
+
+ -- String: \*[RF]
+ Defines the text displayed in the right footer position.
+
+ Effective: next footer.
+
+ Default: empty.
+
+Text settings
+.............
+
+ -- Register: \n[PS]
+ Defines the type size of the body text.
+
+ Effective: next paragraph.
+
+ Default: 10p.
+
+ -- Register: \n[VS]
+ Defines the vertical spacing (type size plus leading).
+
+ Effective: next paragraph.
+
+ Default: 12p.
+
+ -- Register: \n[HY]
+ Defines the automatic hyphenation mode used with the 'hy' request.
+ Setting 'HY' to 0 is equivalent to using the 'nh' request. This is
+ a Tenth Edition Research Unix extension.
+
+ Effective: next paragraph.
+
+ Default: 6.
+
+ -- String: \*[FAM]
+ Defines the font family used to typeset the document. This is a
+ GNU extension.
+
+ Effective: next paragraph.
+
+ Default: defined by the output device; often 'T' (*note ms Body
+ Text::)
+
+Paragraph settings
+..................
+
+ -- Register: \n[PI]
+ Defines the indentation amount used by the 'PP', 'IP' (unless
+ overridden by an optional argument), 'XP', and 'RS' macros.
+
+ Effective: next paragraph.
+
+ Default: 5n.
+
+ -- Register: \n[PD]
+ Defines the space between paragraphs.
+
+ Effective: next paragraph.
+
+ Default: 0.3v (1v on low-resolution devices).
+
+ -- Register: \n[QI]
+ Defines the indentation amount used on both sides of a paragraph
+ set with the 'QP' or between the 'QS' and 'QE' macros.
+
+ Effective: next paragraph.
+
+ Default: 5n.
+
+ -- Register: \n[PORPHANS]
+ Defines the minimum number of initial lines of any paragraph that
+ must be kept together to avoid isolated lines at the bottom of a
+ page. If a new paragraph is started close to the bottom of a page,
+ and there is insufficient space to accommodate 'PORPHANS' lines
+ before an automatic page break, then a page break is forced before
+ the start of the paragraph. This is a GNU extension.
+
+ Effective: next paragraph.
+
+ Default: 1.
+
+Heading settings
+................
+
+ -- Register: \n[PSINCR]
+ Defines an increment in type size to be applied to a heading at a
+ lesser depth than that specified in 'GROWPS'. The value of
+ 'PSINCR' should be specified in points with the p scaling unit and
+ may include a fractional component; for example, '.nr PSINCR 1.5p'
+ sets a type size increment of 1.5p. This is a GNU extension.
+
+ Effective: next heading.
+
+ Default: 1p.
+
+ -- Register: \n[GROWPS]
+ Defines the heading depth above which the type size increment set
+ by 'PSINCR' becomes effective. For each heading depth less than
+ the value of 'GROWPS', the type size is increased by 'PSINCR'.
+ Setting 'GROWPS' to any value less than 2 disables the incremental
+ heading size feature. This is a GNU extension.
+
+ Effective: next heading.
+
+ Default: 0.
+
+ -- Register: \n[HORPHANS]
+ Defines the minimum number of lines of an immediately succeeding
+ paragraph that should be kept together with any heading introduced
+ by the 'NH' or 'SH' macros. If a heading is placed close to the
+ bottom of a page, and there is insufficient space to accommodate
+ both the heading and at least 'HORPHANS' lines of the following
+ paragraph, before an automatic page break, then the page break is
+ forced before the heading. This is a GNU extension.
+
+ Effective: next paragraph.
+
+ Default: 1.
+
+ -- String: \*[SN-STYLE]
+ Defines the style used to print numbered headings. *Note Headings
+ in ms::. This is a GNU extension.
+
+ Effective: next heading.
+
+ Default: alias of 'SN-DOT'
+
+Footnote settings
+.................
+
+ -- Register: \n[FI]
+ Defines the footnote indentation. This is a Berkeley extension.
+
+ Effective: next footnote.
+
+ Default: 2n.
+
+ -- Register: \n[FF]
+ Defines the format of automatically numbered footnotes, and those
+ for which the 'FS' request is given a marker argument, at the
+ bottom of a column or page. This is a Berkeley extension.
+ '0'
+ Set an automatic number(1) (*note ms Document Control
+ Settings-Footnote-1::) as a superscript (on typesetter
+ devices) or surrounded by square brackets (on terminals). The
+ footnote paragraph is indented as with 'PP' if there is an
+ 'FS' argument or an automatic number, and as with 'LP'
+ otherwise. This is the default.
+
+ '1'
+ As '0', but set the marker as regular text and follow an
+ automatic number with a period.
+
+ '2'
+ As '1', but without indentation (like 'LP').
+
+ '3'
+ As '1', but set the footnote paragraph with the marker hanging
+ (like 'IP').
+
+ Effective: next footnote.
+
+ Default: 0.
+
+ -- Register: \n[FPS]
+ Defines the footnote type size.
+
+ Effective: next footnote.
+
+ Default: '\n[PS] - 2p'.
+
+ -- Register: \n[FVS]
+ Defines the footnote vertical spacing.
+
+ Effective: next footnote.
+
+ Default: '\n[FPS] + 2p'.
+
+ -- Register: \n[FPD]
+ Defines the footnote paragraph spacing. This is a GNU extension.
+
+ Effective: next footnote.
+
+ Default: '\n[PD] / 2'.
+
+ -- String: \*[FR]
+ Defines the ratio of the footnote line length to the current line
+ length. This is a GNU extension.
+
+ Effective: next footnote in single-column arrangements, next page
+ otherwise.
+
+ Default: '11/12'.
+
+Display settings
+................
+
+ -- Register: \n[DD]
+ Sets the display distance--the vertical spacing before and after a
+ display, a 'tbl' table, an 'eqn' equation, or a 'pic' image. This
+ is a Berkeley extension.
+
+ Effective: next display boundary.
+
+ Default: 0.5v (1v on low-resolution devices).
+
+ -- Register: \n[DI]
+ Sets the default amount by which to indent a display started with
+ 'DS' and 'ID' without arguments, to '.DS I' without an indentation
+ argument, and to equations set with '.EQ I'. This is a GNU
+ extension.
+
+ Effective: next indented display.
+
+ Default: 0.5i.
+
+Other settings
+..............
+
+ -- Register: \n[MINGW]
+ Defines the default minimum width between columns in a multi-column
+ document. This is a GNU extension.
+
+ Effective: next page.
+
+ Default: 2n.
+
+ -- Register: \n[TC-MARGIN]
+ Defines the width of the field in which page numbers are set in a
+ table of contents entry; the right margin thus moves inboard by
+ this amount. This is a GNU extension.
+
+ Effective: next 'PX' call.
+
+ Default: '\w'000''
+
+
+File: groff.info, Node: ms Document Control Settings-Footnotes, Up: ms Document Control Settings
+
+ (1) defined in *note ms Footnotes::
+
+
+File: groff.info, Node: ms Document Description Macros, Next: ms Body Text, Prev: ms Document Control Settings, Up: ms
+
+4.6.4 Document Description Macros
+---------------------------------
+
+Only the simplest document lacks a title.(1) (*note ms Document
+Description Macros-Footnote-1::) As its level of sophistication (or
+complexity) increases, it tends to acquire a date of revision,
+explicitly identified authors, sponsoring institutions for authors, and,
+at the rarefied heights, an abstract of its content. Define these data
+by calling the macros below in the order shown; 'DA' or 'ND' can be
+called to set the document date (or other identifier) at any time before
+(a) the abstract, if present, or (b) its information is required in a
+header or footer. Use of these macros is optional, except that 'TL' is
+mandatory if any of 'RP', 'AU', 'AI', or 'AB' is called, and 'AE' is
+mandatory if 'AB' is called.
+
+ -- Macro: .RP [no-repeat-info] [no-renumber]
+ Use the "report" (AT&T: "released paper") format for your document,
+ creating a separate cover page. The default arrangement is to
+ place most of the document description (title, author names and
+ institutions, and abstract, but not the date) at the top of the
+ first page. If the optional 'no-repeat-info' argument is given,
+ 'ms' produces a cover page but does not repeat any of its
+ information subsequently (but see the 'DA' macro below regarding
+ the date). Normally, 'RP' sets the page number following the cover
+ page to 1. Specifying the optional 'no-renumber' argument
+ suppresses this alteration. Optional arguments can occur in any
+ order. 'no' is recognized as a synonym of 'no-repeat-info' for
+ 'AT&T' compatibility.
+
+ -- Macro: .TL
+ Specify the document title. 'ms' collects text on input lines
+ following this call into the title until reaching 'AU', 'AB', or a
+ heading or paragraphing macro call.
+
+ -- Macro: .AU
+ Specify an author's name. 'ms' collects text on input lines
+ following this call into the author's name until reaching 'AI',
+ 'AB', another 'AU', or a heading or paragraphing macro call. Call
+ it repeatedly to specify multiple authors.
+
+ -- Macro: .AI
+ Specify the preceding author's institution. An 'AU' call is
+ usefully followed by at most one 'AI' call; if there are more, the
+ last 'AI' call controls. 'ms' collects text on input lines
+ following this call into the author's institution until reaching
+ 'AU', 'AB', or a heading or paragraphing macro call.
+
+ -- Macro: .DA [x ...]
+ Typeset the current date, or any arguments X, in the center footer,
+ and, if 'RP' is also called, left-aligned at the end of the
+ description information on the cover page.
+
+ -- Macro: .ND [x ...]
+ Typeset the current date, or any arguments X, if 'RP' is also
+ called, left-aligned at the end of the document description on the
+ cover page. This is 'groff' 'ms''s default.
+
+ -- Macro: .AB [no]
+ Begin the abstract. 'ms' collects text on input lines following
+ this call into the abstract until reaching an 'AE' call. By
+ default, 'ms' places the word "ABSTRACT" centered and in italics
+ above the text of the abstract. The optional argument 'no'
+ suppresses this heading.
+
+ -- Macro: .AE
+ End the abstract.
+
+ An example document description, using a cover page, follows.
+
+ .RP
+ .TL
+ The Inevitability of Code Bloat
+ in Commercial and Free Software
+ .AU
+ J.\& Random Luser
+ .AI
+ University of West Bumblefuzz
+ .AB
+ This report examines the long-term growth of the code
+ bases in two large,
+ popular software packages;
+ the free Emacs and the commercial Microsoft Word.
+ While differences appear in the type or order of
+ features added,
+ due to the different methodologies used,
+ the results are the same in the end.
+ .PP
+ The free software approach is shown to be superior in
+ that while free software can become as bloated as
+ commercial offerings,
+ free software tends to have fewer serious bugs and the
+ added features are more in line with user demand.
+ .AE
+
+ ...the rest of the paper...
+
+
+File: groff.info, Node: ms Document Description Macros-Footnotes, Up: ms Document Description Macros
+
+ (1) Distinguish a document title from "titles", which are what 'roff'
+systems call headers and footers collectively.
+
+
+File: groff.info, Node: ms Body Text, Next: ms Page Layout, Prev: ms Document Description Macros, Up: ms
+
+4.6.5 Body Text
+---------------
+
+A variety of macros, registers, and strings can be used to structure and
+style the body of your document. They organize your text into
+paragraphs, headings, footnotes, and inclusions of material such as
+tables and figures.
+
+* Menu:
+
+* Text settings in ms::
+* Typographical symbols in ms::
+* Paragraphs in ms::
+* Headings in ms::
+* Typeface and decoration::
+* Lists in ms::
+* Indented regions in ms::
+* ms keeps and displays::
+* ms Insertions::
+* ms Footnotes::
+* ms language and localization::
+
+
+File: groff.info, Node: Text settings in ms, Next: Typographical symbols in ms, Prev: ms Body Text, Up: ms Body Text
+
+4.6.5.1 Text settings
+.....................
+
+The 'FAM' string, a GNU extension, sets the font family for body text;
+the default is 'T'. The 'PS' and 'VS' registers set the type size and
+vertical spacing (distance between text baselines), respectively. The
+font family and type size are ignored on terminal devices. Setting
+these parameters before the first call of a heading, paragraphing, or
+(non-date) document description macro also applies them to headers,
+footers, and (for 'FAM') footnotes.
+
+ Which font families are available depends on the output device; as a
+convention, 'T' selects a serif family ("Times"), 'H' a sans-serif
+family ("Helvetica"), and 'C' a monospaced family ("Courier"). The man
+page for the output driver documents its font repertoire. Consult the
+'groff(1)' man page for lists of available output devices and their
+drivers.
+
+ The hyphenation mode (as used by the 'hy' request) is set from the
+'HY' register. Setting 'HY' to '0' is equivalent to using the 'nh'
+request. This is a Tenth Edition Research Unix extension.
+
+
+File: groff.info, Node: Typographical symbols in ms, Next: Paragraphs in ms, Prev: Text settings in ms, Up: ms Body Text
+
+4.6.5.2 Typographical symbols
+.............................
+
+'ms' provides a few strings to obtain typographical symbols not easily
+entered with the keyboard. These and many others are available as
+special character escape sequences--see the 'groff_char(7)' man page.
+
+ -- String: \*[-]
+ Interpolate an em dash.
+
+ -- String: \*[Q]
+ -- String: \*[U]
+ Interpolate typographer's quotation marks where available, and
+ neutral double quotes otherwise. '\*Q' is the left quote and '\*U'
+ the right.
+
+
+File: groff.info, Node: Paragraphs in ms, Next: Headings in ms, Prev: Typographical symbols in ms, Up: ms Body Text
+
+4.6.5.3 Paragraphs
+..................
+
+Paragraphing macros "break", or terminate, any pending output line so
+that a new paragraph can begin. Several paragraph types are available,
+differing in how indentation applies to them: to left, right, or both
+margins; to the first output line of the paragraph, all output lines, or
+all but the first. All paragraphing macro calls cause the insertion of
+vertical space in the amount stored in the 'PD' register, except at page
+or column breaks. Alternatively, a blank input line breaks the output
+line and vertically spaces by one vee.
+
+ -- Macro: .LP
+ Set a paragraph without any (additional) indentation.
+
+ -- Macro: .PP
+ Set a paragraph with a first-line left indentation in the amount
+ stored in the 'PI' register.
+
+ -- Macro: .IP [marker [width]]
+ Set a paragraph with a left indentation. The optional MARKER is
+ not indented and is empty by default. It has several applications;
+ see *note Lists in ms::. WIDTH overrides the indentation amount
+ stored in the 'PI' register; its default unit is 'n'. Once
+ specified, WIDTH applies to further 'IP' calls until specified
+ again or a heading or different paragraphing macro is called.
+
+ -- Macro: .QP
+ Set a paragraph indented from both left and right margins by the
+ amount stored in the 'QI' register.
+
+ -- Macro: .QS
+ -- Macro: .QE
+ Begin ('QS') and end ('QE') a region where each paragraph is
+ indented from both margins by the amount stored in the 'QI'
+ register. The text between 'QS' and 'QE' can be structured further
+ by use of other paragraphing macros.
+
+ -- Macro: .XP
+ Set an "exdented" paragraph--one with a left indentation in the
+ amount stored in the 'PI' register on every line _except_ the first
+ (also known as a hanging indent). This is a Berkeley extension.
+
+ The following example illustrates the use of paragraphing macros.
+
+ .NH 2
+ Cases used in the 2001 study
+ .LP
+ Two software releases were considered for this report.
+ .PP
+ The first is commercial software;
+ the second is free.
+ .IP \[bu]
+ Microsoft Word for Windows,
+ starting with version 1.0 through the current version
+ (Word 2000).
+ .IP \[bu]
+ GNU Emacs,
+ from its first appearance as a standalone editor through
+ the current version (v20).
+ See [Bloggs 2002] for details.
+ .QP
+ Franklin's Law applied to software:
+ software expands to outgrow both RAM and disk space over
+ time.
+ .SH
+ Bibliography
+ .XP
+ Bloggs, Joseph R.,
+ .I "Everyone's a Critic" ,
+ Underground Press, March 2002.
+ A definitive work that answers all questions and
+ criticisms about the quality and usability of free
+ software.
+
+
+File: groff.info, Node: Headings in ms, Next: Typeface and decoration, Prev: Paragraphs in ms, Up: ms Body Text
+
+4.6.5.4 Headings
+................
+
+Use headings to create a sequential or hierarchical structure for your
+document. The 'ms' macros print headings in *bold* using the same font
+family and, by default, type size as the body text. Headings are
+available with and without automatic numbering. Text on input lines
+following the macro call becomes the heading's title. Call a
+paragraphing macro to end the heading text and start the section's
+content.
+
+ -- Macro: .NH [depth]
+ -- Macro: .NH S heading-depth-index ...
+ Set an automatically numbered heading.
+
+ 'ms' produces a numbered heading the form A.B.C..., to any depth
+ desired, with the numbering of each depth increasing automatically
+ and being reset to zero when a more significant level is increased.
+ "1" is the most significant or coarsest division of the document.
+ Only non-zero values are output. If DEPTH is omitted, it is taken
+ to be '1'.
+
+ If you specify DEPTH such that an ascending gap occurs relative to
+ the previous 'NH' call--that is, you "skip a depth", as by '.NH 1'
+ and then '.NH 3'--'groff' 'ms' emits a warning on the standard
+ error stream.
+
+ Alternatively, you can give 'NH' a first argument of 'S', followed
+ by integers to number the heading depths explicitly. Further
+ automatic numbering, if used, resumes using the specified indices
+ as their predecessors. This feature is a Berkeley extension.
+
+ An example may be illustrative.
+
+ .NH 1
+ Animalia
+ .NH 2
+ Arthropoda
+ .NH 3
+ Crustacea
+ .NH 2
+ Chordata
+ .NH S 6 6 6
+ Daimonia
+ .NH 1
+ Plantae
+
+ The above results in numbering as follows; the vertical space that
+normally precedes each heading is omitted.
+
+ 1. Animalia
+ 1.1. Arthropoda
+ 1.1.1. Crustacea
+ 1.2. Chordata
+ 6.6.6. Daimonia
+ 7. Plantae
+
+ -- String: \*[SN-STYLE]
+ -- String: \*[SN-DOT]
+ -- String: \*[SN-NO-DOT]
+ -- String: \*[SN]
+ After 'NH' is called, the assigned number is made available in the
+ strings 'SN-DOT' (as it appears in a printed heading with default
+ formatting, followed by a terminating period) and 'SN-NO-DOT' (with
+ the terminating period omitted). These are GNU extensions.
+
+ You can control the style used to print numbered headings by
+ defining an appropriate alias for the string 'SN-STYLE'. By
+ default, 'SN-STYLE' is aliased to 'SN-DOT'. If you prefer to omit
+ the terminating period from numbers appearing in numbered headings,
+ you may define the alias as follows.
+
+ .als SN-STYLE SN-NO-DOT
+
+ Any such change in numbering style becomes effective from the next
+ use of 'NH' following redefinition of the alias for 'SN-STYLE'.
+ The formatted number of the current heading is available in the
+ 'SN' string (a feature first documented by Berkeley), which
+ facilitates its inclusion in, for example, table captions, equation
+ labels, and 'XS'/'XA'/'XE' table of contents entries.
+
+ -- Macro: .SH [depth]
+ Set an unnumbered heading.
+
+ The optional DEPTH argument is a GNU extension indicating the
+ heading depth corresponding to the DEPTH argument of 'NH'. It
+ matches the type size at which the heading is set to that of a
+ numbered heading at the same depth when the 'GROWPS' and 'PSINCR'
+ heading size adjustment mechanism is in effect.
+
+ If the 'GROWPS' register is set to a value greater than the LEVEL
+argument to 'NH' or 'SH', the type size of a heading produced by these
+macros increases by 'PSINCR' units over the size specified by 'PS'
+multiplied by the difference of 'GROWPS' and LEVEL. The value stored in
+'PSINCR' is interpreted in 'groff' basic units; the 'p' scaling unit
+should be employed when assigning a value specified in points. For
+example, the sequence
+
+ .nr PS 10
+ .nr GROWPS 3
+ .nr PSINCR 1.5p
+ .NH 1
+ Carnivora
+ .NH 2
+ Felinae
+ .NH 3
+ Felis catus
+ .SH 2
+ Machairodontinae
+
+will cause "1. Carnivora" to be printed in 13-point text, followed by
+"1.1. Felinae" in 11.5-point text, while "1.1.1. Felis catus" and all
+more deeply nested heading levels will remain in the 10-point text
+specified by the 'PS' register. "Machairodontinae" is printed at 11.5
+points, since it corresponds to heading level 2.
+
+ The 'HORPHANS' register operates in conjunction with the 'NH' and
+'SH' macros to inhibit the printing of isolated headings at the bottom
+of a page; it specifies the minimum number of lines of an immediately
+subsequent paragraph that must be kept on the same page as the heading.
+If insufficient space remains on the current page to accommodate the
+heading and this number of lines of paragraph text, a page break is
+forced before the heading is printed. Any display macro call or 'tbl',
+'pic', or 'eqn' region between the heading and the subsequent paragraph
+suppresses this grouping. *Note ms keeps and displays:: and *note ms
+Insertions::.
+
+
+File: groff.info, Node: Typeface and decoration, Next: Lists in ms, Prev: Headings in ms, Up: ms Body Text
+
+4.6.5.5 Typeface and decoration
+...............................
+
+The 'ms' macros provide a variety of ways to style text. Attend closely
+to the ordering of arguments labeled PRE and POST, which is not
+intuitive. Support for PRE arguments is a GNU extension.(1) (*note
+Typeface and decoration-Footnote-1::)
+
+ -- Macro: .B [text [post [pre]]]
+ Style TEXT in bold, followed by POST in the previous font style
+ without intervening space, and preceded by PRE similarly. Without
+ arguments, 'ms' styles subsequent text in bold until the next
+ paragraphing, heading, or no-argument typeface macro call.
+
+ -- Macro: .R [text [post [pre]]]
+ As 'B', but use the roman style (upright text of normal weight)
+ instead of bold. Argument recognition is a GNU extension.
+
+ -- Macro: .I [text [post [pre]]]
+ As 'B', but use an italic or oblique style instead of bold.
+
+ -- Macro: .BI [text [post [pre]]]
+ As 'B', but use a bold italic or bold oblique style instead of
+ upright bold. This is a Tenth Edition Research Unix extension.
+
+ -- Macro: .CW [text [post [pre]]]
+ As 'B', but use a constant-width (monospaced) roman typeface
+ instead of bold. This is a Tenth Edition Research Unix extension.
+
+ -- Macro: .BX [text]
+ Typeset TEXT and draw a box around it. On terminal devices,
+ reverse video is used instead. If you want TEXT to contain space,
+ use unbreakable space or horizontal motion escape sequences ('\~',
+ '\<SP>', '\^', '\|', '\0' or '\h').
+
+ -- Macro: .UL [text [post]]
+ Typeset TEXT with an underline. POST, if present, is set after
+ TEXT with no intervening space.
+
+ -- Macro: .LG
+ Set subsequent text in larger type (two points larger than the
+ current size) until the next type size, paragraphing, or heading
+ macro call. You can specify this macro multiple times to enlarge
+ the type size as needed.
+
+ -- Macro: .SM
+ Set subsequent text in smaller type (two points smaller than the
+ current size) until the next type size, paragraphing, or heading
+ macro call. You can specify this macro multiple times to reduce
+ the type size as needed.
+
+ -- Macro: .NL
+ Set subsequent text at the normal type size (the amount in the 'PS'
+ register).
+
+ PRE and POST arguments are typically used to simplify the attachment
+of punctuation to styled words. When PRE is used, a hyphenation control
+escape sequence '\%' that would ordinarily start TEXT must start PRE
+instead to have the desired effect.
+
+ The CS course's students found one C language keyword
+ .CW static ) \%(
+ most troublesome.
+
+ The foregoing example produces output as follows.
+
+ The CS course's students found one C language keyword (static)
+ most troublesome.
+
+ You can use the output line continuation escape sequence '\c' to
+achieve the same result (*note Line Continuation::). It is also
+portable to older 'ms' implementations.
+
+ The CS course's students found one C language keyword
+ \%(\c
+ .CW \%static )
+ most troublesome.
+
+ 'groff' 'ms' also offers strings to begin and end super- and
+subscripting. These are GNU extensions.
+
+ -- String: \*[{]
+ -- String: \*[}]
+ Begin and end superscripting, respectively.
+
+ -- String: \*[<]
+ -- String: \*[>]
+ Begin and end subscripting, respectively.
+
+ Rather than calling the 'CW' macro, in 'groff' 'ms' you might prefer
+to change the font family to Courier by setting the 'FAM' string to 'C'.
+You can then use all four style macros above, returning to the default
+family (Times) with '.ds FAM T'. Because changes to 'FAM' take effect
+only at the next paragraph, 'CW' remains useful to "inline" a change to
+the font family, similarly to the practice of this document in noting
+syntactical elements of 'ms' and 'groff'.
+
+
+File: groff.info, Node: Typeface and decoration-Footnotes, Up: Typeface and decoration
+
+ (1) This idiosyncrasy arose through feature accretion; for example,
+the 'B' macro in Version 6 Unix 'ms' (1975) accepted only one argument,
+the text to be set in boldface. By Version 7 (1979) it recognized a
+second argument; in 1990, 'groff' 'ms' added a "pre" argument, placing
+it third to avoid breaking support for older documents.
+
+
+File: groff.info, Node: Lists in ms, Next: Indented regions in ms, Prev: Typeface and decoration, Up: ms Body Text
+
+4.6.5.6 Lists
+.............
+
+The MARKER argument to the 'IP' macro can be employed to present a
+variety of lists; for instance, you can use a bullet glyph ('\[bu]') for
+unordered lists, a number (or auto-incrementing register) for numbered
+lists, or a word or phrase for glossary-style or definition lists. If
+you set the paragraph indentation register 'PI' before calling 'IP', you
+can later reorder the items in the list without having to ensure that a
+WIDTH argument remains affixed to the first call.
+
+ The following is an example of a bulleted list.
+
+ .nr PI 2n
+ A bulleted list:
+ .IP \[bu]
+ lawyers
+ .IP \[bu]
+ guns
+ .IP \[bu]
+ money
+
+ A bulleted list:
+
+ * lawyers
+
+ * guns
+
+ * money
+
+ The following is an example of a numbered list.
+
+ .nr step 0 1
+ .nr PI 3n
+ A numbered list:
+ .IP \n+[step]
+ lawyers
+ .IP \n+[step]
+ guns
+ .IP \n+[step]
+ money
+
+ A numbered list:
+
+ 1. lawyers
+
+ 2. guns
+
+ 3. money
+
+ Here we have employed the 'nr' request to create a register of our
+own, 'step'. We initialized it to zero and assigned it an
+auto-increment of 1. Each time we use the escape sequence '\n+[PI]'
+(note the plus sign), the formatter applies the increment just before
+interpolating the register's value. Preparing the 'PI' register as well
+enables us to rearrange the list without the tedium of updating macro
+calls.
+
+ The next example illustrates a glossary-style list.
+
+ A glossary-style list:
+ .IP lawyers 0.4i
+ Two or more attorneys.
+ .IP guns
+ Firearms,
+ preferably large-caliber.
+ .IP money
+ Gotta pay for those
+ lawyers and guns!
+
+ A glossary-style list:
+
+ lawyers
+ Two or more attorneys.
+
+ guns Firearms, preferably large-caliber.
+
+ money
+ Gotta pay for those lawyers and guns!
+
+ In the previous example, observe how the 'IP' macro places the
+definition on the same line as the term if it has enough space. If this
+is not what you want, there are a few workarounds we will illustrate by
+modifying the example. First, you can use a 'br' request to force a
+break after printing the term or label.
+
+ .IP guns
+ .br
+ Firearms,
+
+ Second, you could apply the '\p' escape sequence to force a break.
+The space following the escape sequence is important; if you omit it,
+'groff' prints the first word of the paragraph text on the same line as
+the term or label (if it fits) _then_ breaks the line.
+
+ .IP guns
+ \p Firearms,
+
+ Finally, you may append a horizontal motion to the marker with the
+'\h' escape sequence; using the same amount as the indentation will
+ensure that the marker is too wide for 'groff' to treat it as "fitting"
+on the same line as the paragraph text.
+
+ .IP guns\h'0.4i'
+ Firearms,
+
+ In each case, the result is the same.
+
+ A glossary-style list:
+
+ lawyers
+ Two or more attorneys.
+
+ guns
+ Firearms, preferably large-caliber.
+
+ money
+ Gotta pay for those lawyers and guns!
+
+
+File: groff.info, Node: Indented regions in ms, Next: ms keeps and displays, Prev: Lists in ms, Up: ms Body Text
+
+4.6.5.7 Indented regions
+........................
+
+You may need to indent a region of text while otherwise formatting it
+normally. Indented regions can be nested; you can change '\n[PI]'
+before each call to vary the amount of inset.
+
+ -- Macro: .RS
+ Begin a region where headings, paragraphs, and displays are
+ indented (further) by the amount stored in the 'PI' register.
+
+ -- Macro: .RE
+ End the (next) most recent indented region.
+
+ This feature enables you to easily line up text under hanging and
+indented paragraphs. For example, you may wish to structure lists
+hierarchically.
+
+ .IP \[bu] 2
+ Lawyers:
+ .RS
+ .IP \[bu]
+ Dewey,
+ .IP \[bu]
+ Cheatham,
+ and
+ .IP \[bu]
+ and Howe.
+ .RE
+ .IP \[bu]
+ Guns
+
+ * Lawyers:
+
+ * Dewey,
+
+ * Cheatham, and
+
+ * Howe.
+
+ * Guns
+
+
+File: groff.info, Node: ms keeps and displays, Next: ms Insertions, Prev: Indented regions in ms, Up: ms Body Text
+
+4.6.5.8 Keeps, boxed keeps, and displays
+........................................
+
+On occasion, you may want to "keep" several lines of text, or a region
+of a document, together on a single page, preventing an automatic page
+break within certain boundaries. This can cause a page break to occur
+earlier than it normally would. For example, you may want to keep two
+paragraphs together, or a paragraph that refers to a table, list, or
+figure adjacent to the item it discusses. 'ms' provides the 'KS' and
+'KE' macros for this purpose.
+
+ You can alternatively specify a "floating keep": if a keep cannot fit
+on the current page, 'ms' holds its contents and allows material
+following the keep (in the source document) to fill the remainder of the
+current page. When the page breaks, whether by reaching the end or 'bp'
+request, 'ms' puts the floating keep at the beginning of the next page.
+This is useful for placing large graphics or tables that do not need to
+appear exactly where they occur in the source document.
+
+ -- Macro: .KS
+ -- Macro: .KF
+ -- Macro: .KE
+ 'KS' begins a keep, 'KF' a floating keep, and 'KE' ends a keep of
+ either kind.
+
+ As an alternative to the keep mechanism, the 'ne' request forces a
+page break if there is not at least the amount of vertical space
+specified in its argument remaining on the page (*note Page Control::).
+One application of 'ne' is to reserve space on the page for a figure or
+illustration to be included later.
+
+ A "boxed keep" has a frame drawn around it.
+
+ -- Macro: .B1
+ -- Macro: .B2
+ 'B1' begins a keep with a box drawn around it. 'B2' ends a boxed
+ keep.
+
+ Boxed keep macros cause breaks; if you need to box a word or phrase
+within a line, see the 'BX' macro in *note Typeface and decoration::.
+Box lines are drawn as close as possible to the text they enclose so
+that they are usable within paragraphs. If you wish to box one or more
+paragraphs, you may improve the appearance by calling 'B1' after the
+first paragraphing macro, and by adding a small amount of vertical space
+before calling 'B2'.
+
+ .LP
+ .B1
+ .I Warning:
+ Happy Fun Ball may suddenly accelerate to dangerous
+ speeds.
+ .sp \n[PD]/2 \" space by half the inter-paragraph distance
+ .B2
+
+ If you want a boxed keep to float, you will need to enclose the 'B1'
+and 'B2' calls within a pair of 'KF' and 'KE' calls.
+
+ "Displays" turn off filling; lines of verse or program code are shown
+with their lines broken as in the source document without requiring 'br'
+requests between lines. Displays can be kept on a single page or
+allowed to break across pages. The 'DS' macro begins a kept display of
+the layout specified in its first argument; non-kept displays are begun
+with dedicated macros corresponding to their layout.
+
+ -- Macro: .DS L
+ -- Macro: .LD
+ Begin ('DS': kept) left-aligned display.
+
+ -- Macro: .DS [I [indent]]
+ -- Macro: .ID [indent]
+ Begin ('DS': kept) display indented by INDENT if specified, and by
+ the amount of the 'DI' register otherwise.
+
+ -- Macro: .DS B
+ -- Macro: .BD
+ Begin a ('DS': kept) a block display: the entire display is
+ left-aligned, but indented such that the longest line in the
+ display is centered on the page.
+
+ -- Macro: .DS C
+ -- Macro: .CD
+ Begin a ('DS': kept) centered display: each line in the display is
+ centered.
+
+ -- Macro: .DS R
+ -- Macro: .RD
+ Begin a ('DS': kept) right-aligned display. This is a GNU
+ extension.
+
+ -- Macro: .DE
+ End any display.
+
+ The distance stored in the 'DD' register is inserted before and after
+each pair of display macros; this is a Berkeley extension. In 'groff'
+'ms', this distance replaces any adjacent inter-paragraph distance or
+subsequent spacing prior to a section heading. The 'DI' register is a
+GNU extension; its value is an indentation applied to displays created
+with '.DS' and '.ID' without arguments, to '.DS I' without an
+indentation argument, and to indented equations set with '.EQ'. Changes
+to either register take effect at the next display boundary.
+
+
+File: groff.info, Node: ms Insertions, Next: ms Footnotes, Prev: ms keeps and displays, Up: ms Body Text
+
+4.6.5.9 Tables, figures, equations, and references
+..................................................
+
+The 'ms' package is often used with the 'tbl', 'pic', 'eqn', and 'refer'
+preprocessors. Mark text meant for preprocessors by enclosing it in
+pairs of tokens as follows, with nothing between the dot and the macro
+name. The preprocessors match these tokens only at the start of an
+input line.
+
+ -- Macro: .TS [H]
+ -- Macro: .TE
+ Demarcate a table to be processed by the 'tbl' preprocessor. The
+ optional argument 'H' to 'TS' instructs 'ms' to repeat table rows
+ (often column headings) at the top of each new page the table
+ spans, if applicable; calling the 'TH' macro marks the end of such
+ rows. The GNU 'tbl(1)' man page provides a comprehensive reference
+ to the preprocessor and offers examples of its use.
+
+ -- Macro: .PS
+ -- Macro: .PE
+ -- Macro: .PF
+ 'PS' begins a picture to be processed by the 'gpic' preprocessor;
+ either of 'PE' or 'PF' ends it, the latter with "flyback" to the
+ vertical position at its top. You can create 'pic' input manually
+ or with a program such as 'xfig'.
+
+ -- Macro: .EQ [align [label]]
+ -- Macro: .EN
+ Demarcate an equation to be processed by the 'eqn' preprocessor.
+ The equation is centered by default; ALIGN can be 'C', 'L', or 'I'
+ to (explicitly) center, left-align, or indent it by the amount
+ stored in the 'DI' register, respectively. If specified, LABEL is
+ set right-aligned.
+
+ -- Macro: .[
+ -- Macro: .]
+ Demarcate a bibliographic citation to be processed by the 'refer'
+ preprocessor. The GNU 'refer(1)' man page provides a comprehensive
+ reference to the preprocessor and the format of its bibliographic
+ database. Type 'man refer' at the command line to view it.
+
+ When 'refer' emits collected references (as might be done on a "Works
+Cited" page), it interpolates the 'REFERENCES' string as an unnumbered
+heading ('SH').
+
+ The following is an example of how to set up a table that may print
+across two or more pages.
+
+ .TS H
+ allbox;
+ Cb | Cb .
+ Part->Description
+ _
+ .TH
+ .T&
+ GH-1978->Fribulating gonkulator
+ ...the rest of the table follows...
+ .TE
+
+Attempting to place a multi-page table inside a keep can lead to
+unpleasant results, particularly if the 'tbl' 'allbox' option is used.
+
+ Mathematics can be typeset using the language of the 'eqn'
+preprocessor.
+
+ .EQ C (\*[SN-NO-DOT]a)
+ p ~ = ~ q sqrt { ( 1 + ~ ( x / q sup 2 ) }
+ .EN
+
+This input formats a labelled equation. We used the 'SN-NO-DOT' string
+to base the equation label on the current heading number, giving us more
+flexibility to reorganize the document.
+
+ Use 'groff' options to run preprocessors on the input: '-e' for
+'geqn', '-p' for 'gpic', '-R' for 'grefer', and '-t' for 'gtbl'.
+
+
+File: groff.info, Node: ms Footnotes, Prev: ms Insertions, Up: ms Body Text
+
+4.6.5.10 Footnotes
+..................
+
+A footnote is typically anchored to a place in the text with a "marker",
+which is a small integer, a symbol such as a dagger, or arbitrary
+user-specified text.
+
+ -- String: \*[*]
+ Place an "automatic number", an automatically generated numeric
+ footnote marker, in the text. Each time this string is
+ interpolated, the number it produces increments by one. Automatic
+ numbers start at 1. This is a Berkeley extension.
+
+ Enclose the footnote text in 'FS' and 'FE' macro calls to set it at
+the nearest available "foot", or bottom, of a text column or page.
+
+ -- Macro: .FS [marker]
+ -- Macro: .FE
+ Begin ('FS') and end ('FE') a footnote. 'FS' calls 'FS-MARK' with
+ any supplied MARKER argument, which is then also placed at the
+ beginning of the footnote text. If MARKER is omitted, the next
+ pending automatic footnote number enqueued by interpolation of the
+ '*' string is used, and if none exists, nothing is prefixed.
+
+ You may not desire automatically numbered footnotes in spite of their
+convenience. You can indicate a footnote with a symbol or other text by
+specifying its marker at the appropriate place (for example, by using
+'\[dg]' for the dagger glyph) _and_ as an argument to the 'FS' macro.
+Such manual marks should be repeated as arguments to 'FS' or as part of
+the footnote text to disambiguate their correspondence. You may wish to
+use '\*{' and '\*}' to superscript the marker at the anchor point, in
+the footnote text, or both.
+
+ 'groff' 'ms' provides a hook macro, 'FS-MARK', for user-determined
+operations to be performed when the 'FS' macro is called. It is passed
+the same arguments as 'FS' itself. An application of 'FS-MARK' is
+anchor placement for a hyperlink reference, so that a footnote can link
+back to its referential context.(1) (*note ms Footnotes-Footnote-1::)
+By default, this macro has an empty definition. 'FS-MARK' is a GNU
+extension.
+
+ Footnotes can be safely used within keeps and displays, but you
+should avoid using automatically numbered footnotes within floating
+keeps. You can place a second '\**' interpolation between a '\**' and
+its corresponding 'FS' call as long as each 'FS' call occurs _after_ the
+corresponding '\**' and occurrences of 'FS' are in the same order as
+corresponding occurrences of '\**'.
+
+ Footnote text is formatted as paragraphs are, using analogous
+parameters. The registers 'FI', 'FPD', 'FPS', and 'FVS' correspond to
+'PI', 'PD', 'PS', and 'CS', respectively; 'FPD', 'FPS', and 'FVS' are
+GNU extensions.
+
+ The 'FF' register controls the formatting of automatically numbered
+footnote paragraphs and those for which 'FS' is given a marker argument.
+*Note ms Document Control Settings::.
+
+ The default footnote line length is 11/12ths of the normal line
+length for compatibility with the expectations of historical 'ms'
+documents; you may wish to set the 'FR' string to '1' to align with
+contemporary typesetting practices. In the past,(2) (*note ms
+Footnotes-Footnote-2::) an 'FL' register was used for the line length in
+footnotes; however, setting this register at document initialization
+time had no effect on the footnote line length in multi-column
+arrangements.(3) (*note ms Footnotes-Footnote-3::)
+
+ 'FR' should be used in preference to the old 'FL' register in
+contemporary documents. The footnote line length is effectively
+computed as 'column-width * \*[FR]'. If an absolute footnote line
+length is required, recall that arithmetic expressions in 'roff' input
+are evaluated strictly from left to right, with no operator precedence
+(parentheses are honored).
+
+ .ds FR 0+3i \" Set footnote line length to 3 inches.
+
+
+File: groff.info, Node: ms Footnotes-Footnotes, Up: ms Footnotes
+
+ (1) "Portable Document Format Publishing with GNU Troff",
+'pdfmark.ms' in the 'groff' distribution, uses this technique.
+
+ (2) Unix Version 7 'ms', its descendants, and GNU 'ms' prior to
+'groff' version 1.23.0
+
+ (3) You could reset it after each call to '.1C', '.2C', or '.MC'.
+
+
+File: groff.info, Node: ms language and localization, Next: ms Page Layout, Prev: ms Footnotes, Up: ms Body Text
+
+4.6.5.11 Language and localization
+..................................
+
+'groff' 'ms' provides several strings that you can customize for your
+own purposes, or redefine to adapt the macro package to languages other
+than English. It is already localized for Czech, German, French,
+Italian, and Swedish. Load the desired localization macro package after
+'ms'; see the 'groff_tmac(5)' man page.
+
+ $ groff -ms -mfr bienvenue.ms
+
+ The following strings are available.
+
+ -- String: \*[REFERENCES]
+ Contains the string printed at the beginning of a references
+ (bibliography) page produced with GNU 'refer(1)'. The default is
+ 'References'.
+
+ -- String: \*[ABSTRACT]
+ Contains the string printed at the beginning of the abstract. The
+ default is '\f[I]ABSTRACT\f[]'; it includes font selection escape
+ sequences to set the word in italics.
+
+ -- String: \*[TOC]
+ Contains the string printed at the beginning of the table of
+ contents. The default is 'Table of Contents'.
+
+ -- String: \*[MONTH1]
+ -- String: \*[MONTH2]
+ -- String: \*[MONTH3]
+ -- String: \*[MONTH4]
+ -- String: \*[MONTH5]
+ -- String: \*[MONTH6]
+ -- String: \*[MONTH7]
+ -- String: \*[MONTH8]
+ -- String: \*[MONTH9]
+ -- String: \*[MONTH10]
+ -- String: \*[MONTH11]
+ -- String: \*[MONTH12]
+ Contain the full names of the calendar months. The defaults are in
+ English: 'January', 'February', and so on.
+
+
+File: groff.info, Node: ms Page Layout, Next: Differences from AT&T ms, Prev: ms Body Text, Up: ms
+
+4.6.6 Page layout
+-----------------
+
+'ms''s default page layout arranges text in a single column with the
+page number between hyphens centered in a header on each page except the
+first, and produces no footers. You can customize this arrangement.
+
+* Menu:
+
+* ms Headers and Footers::
+* Tab Stops in ms::
+* ms Margins::
+* ms Multiple Columns::
+* ms TOC::
+
+
+File: groff.info, Node: ms Headers and Footers, Next: Tab Stops in ms, Prev: ms Page Layout, Up: ms Page Layout
+
+4.6.6.1 Headers and footers
+...........................
+
+There are multiple ways to produce headers and footers. One is to
+define the strings 'LH', 'CH', and 'RH' to set the left, center, and
+right headers, respectively; and 'LF', 'CF', and 'RF' to set the left,
+center, and right footers. This approach suffices for documents that do
+not distinguish odd- and even-numbered pages.
+
+ Another method is to call macros that set headers or footers for odd-
+or even-numbered pages. Each such macro takes a delimited argument
+separating the left, center, and right header or footer texts from each
+other. You can replace the neutral apostrophes (''') shown below with
+any character not appearing in the header or footer text. These macros
+are Berkeley extensions.
+
+ -- Macro: .OH 'left'center'right'
+ -- Macro: .EH 'left'center'right'
+ -- Macro: .OF 'left'center'right'
+ -- Macro: .EF 'left'center'right'
+ The 'OH' and 'EH' macros define headers for odd- (recto) and
+ even-numbered (verso) pages, respectively; the 'OF' and 'EF' macros
+ define footers for them.
+
+ With either method, a percent sign '%' in header or footer text is
+replaced by the current page number. By default, 'ms' places no header
+on a page numbered "1" (regardless of its number format).
+
+ -- Macro: .P1
+ Typeset the header even on page 1. To be effective, this macro
+ must be called before the header trap is sprung on any page
+ numbered "1"; in practice, unless your page numbering is unusual,
+ this means that you should call it early, before 'TL' or any
+ heading or paragraphing macro. This is a Berkeley extension.
+
+ For even greater flexibility, 'ms' is designed to permit the
+redefinition of the macros that are called when the 'groff' traps that
+ordinarily cause the headers and footers to be output are sprung. 'PT'
+("page trap") is called by 'ms' when the header is to be written, and
+'BT' ("bottom trap") when the footer is to be. The 'groff' page
+location trap that 'ms' sets up to format the header also calls the
+(normally undefined) 'HD' macro after 'PT'; you can define 'HD' if you
+need additional processing after setting the header (for example, to
+draw a line below it). The 'HD' hook is a Berkeley extension. Any such
+macros you (re)define must implement any desired specialization for
+odd-, even-, or first numbered pages.
+
+
+File: groff.info, Node: Tab Stops in ms, Next: ms Margins, Prev: ms Headers and Footers, Up: ms Page Layout
+
+4.6.6.2 Tab stops
+.................
+
+Use the 'ta' request to define tab stops as needed. *Note Tabs and
+Fields::.
+
+ -- Macro: .TA
+ Reset the tab stops to the 'ms' default (every 5 ens). Redefine
+ this macro to create a different set of default tab stops.
+
+
+File: groff.info, Node: ms Margins, Next: ms Multiple Columns, Prev: Tab Stops in ms, Up: ms Page Layout
+
+4.6.6.3 Margins
+...............
+
+Control margins using the registers summarized in "Margin settings" in
+*note ms Document Control Settings:: above. There is no setting for the
+right margin; the combination of page offset '\n[PO]' and line length
+'\n[LL]' determines it.
+
+
+File: groff.info, Node: ms Multiple Columns, Next: ms TOC, Prev: ms Margins, Up: ms Page Layout
+
+4.6.6.4 Multiple columns
+........................
+
+'ms' can set text in as many columns as reasonably fit on the page. The
+following macros force a page break if a multi-column layout is active
+when they are called. The 'MINGW' register stores the default minimum
+gutter width; it is a GNU extension. When multiple columns are in use,
+keeps and the 'HORPHANS' and 'PORPHANS' registers work with respect to
+column breaks instead of page breaks.
+
+ -- Macro: .1C
+ Arrange page text in a single column (the default).
+
+ -- Macro: .2C
+ Arrange page text in two columns.
+
+ -- Macro: .MC [column-width [gutter-width]]
+ Arrange page text in multiple columns. If you specify no
+ arguments, it is equivalent to the '2C' macro. Otherwise,
+ COLUMN-WIDTH is the width of each column and GUTTER-WIDTH is the
+ minimum distance between columns.
+
+
+File: groff.info, Node: ms TOC, Next: Differences from AT&T ms, Prev: ms Multiple Columns, Up: ms Page Layout
+
+4.6.6.5 Creating a table of contents
+....................................
+
+Because 'roff' formatters process their input in a single pass, material
+on page 50, for example, cannot influence what appears on page 1--this
+poses a challenge for a table of contents at its traditional location in
+front matter, if you wish to avoid manually maintaining it. 'ms'
+enables the collection of material to be presented in the table of
+contents as it appears, saving its page number along with it, and then
+emitting the collected contents on demand toward the end of the
+document. The table of contents can then be resequenced to its desired
+location by physically rearranging the pages of a printed document, or
+as part of post-processing--with a 'sed(1)' script to reorder the pages
+in 'troff''s output, with 'pdfjam(1)', or with 'gropdf(1)''s
+'.pdfswitchtopage' feature, for example.
+
+ Define an entry to appear in the table of contents by bracketing its
+text between calls to the 'XS' and 'XE' macros. A typical application
+is to call them immediately after 'NH' or 'SH' and repeat the heading
+text within them. The 'XA' macro, used within '.XS'/'.XE' pairs,
+supplements an entry--for instance, when it requires multiple output
+lines, whether because a heading is too long to fit or because style
+dictates that page numbers not be repeated. You may wish to indent the
+text thus wrapped to correspond to its heading depth; this can be done
+in the entry text by prefixing it with tabs or horizontal motion escape
+sequences, or by providing a second argument to the 'XA' macro. 'XS'
+and 'XA' automatically associate the page number where they are called
+with the text following them, but they accept arguments to override this
+behavior. At the end of the document, call 'TC' or 'PX' to emit the
+table of contents; 'TC' resets the page number to 'i' (Roman numeral
+one), and then calls 'PX'. All of these macros are Berkeley extensions.
+
+ -- Macro: .XS [page-number]
+ -- Macro: .XA [page-number [indentation]]
+ -- Macro: .XE
+ Begin, supplement, and end a table of contents entry. Each entry
+ is associated with PAGE-NUMBER (otherwise the current page number);
+ a PAGE-NUMBER of 'no' prevents a leader and page number from being
+ emitted for that entry. Use of 'XA' within 'XS'/'XE' is optional;
+ it can be repeated. If INDENTATION is present, a supplemental
+ entry is indented by that amount; ens are assumed if no unit is
+ indicated. Text on input lines between 'XS' and 'XE' is stored for
+ later recall by 'PX'.
+
+ -- Macro: .PX [no]
+ Switch to single-column layout. Unless 'no' is specified, center
+ and interpolate the 'TOC' string in bold and two points larger than
+ the body text. Emit the table of contents entries.
+
+ -- Macro: .TC [no]
+ Set the page number to 1, the page number format to lowercase Roman
+ numerals, and call 'PX' (with a 'no' argument, if present).
+
+ Here's an example of typical 'ms' table of contents preparation. We
+employ horizontal escape sequences '\h' to indent the entries by
+sectioning depth.
+
+ .NH 1
+ Introduction
+ .XS
+ Introduction
+ .XE
+ ...
+ .NH 2
+ Methodology
+ .XS
+ \h'2n'Methodology
+ .XA
+ \h'4n'Fassbinder's Approach
+ \h'4n'Kahiu's Approach
+ .XE
+ ...
+ .NH 1
+ Findings
+ .XS
+ Findings
+ .XE
+ ...
+ .TC
+
+ The remaining features in this subsubsection are GNU extensions.
+'groff' 'ms' obviates the need to repeat heading text after 'XS' calls.
+Call 'XN' and 'XH' after 'NH' and 'SH', respectively.
+
+ -- Macro: .XN heading-text
+ -- Macro: .XH depth heading-text
+ Format HEADING-TEXT and create a corresponding table of contents
+ entry. 'XN' computes the indentation from the depth of the
+ preceding 'NH' call; 'XH' requires a DEPTH argument to do so.
+
+ 'groff' 'ms' encourages customization of table of contents entry
+production.
+
+ -- Macro: .XN-REPLACEMENT heading-text
+ -- Macro: .XH-REPLACEMENT depth heading-text
+ These hook macros implement 'XN' and 'XH', respectively. They call
+ 'XN-INIT' and pass their HEADING-TEXT arguments to 'XH-UPDATE-TOC'.
+
+ -- Macro: .XN-INIT
+ -- Macro: .XH-UPDATE-TOC depth heading-text
+ The 'XN-INIT' hook macro does nothing by default. 'XH-UPDATE-TOC'
+ brackets HEADING-TEXT with 'XS' and 'XE' calls, indenting it by 2
+ ens per level of DEPTH beyond the first.
+
+ We could therefore produce a table of contents similar to that in the
+previous example with fewer macro calls. (The difference is that this
+input follows the "Approach" entries with leaders and page numbers.)
+
+ .NH 1
+ .XN Introduction
+ ...
+ .NH 2
+ .XN Methodology
+ .XH 3 "Fassbinder's Approach"
+ .XH 3 "Kahiu's Approach"
+ ...
+ .NH 1
+ .XN Findings
+ ...
+
+ To get the section number of the numbered headings into the table of
+contents entries, we might define 'XN-REPLACEMENT' as follows. (We
+obtain the heading depth from 'groff' 'ms''s internal register 'nh*hl'.)
+
+ .de XN-REPLACEMENT
+ .XN-INIT
+ .XH-UPDATE-TOC \\n[nh*hl] \\$@
+ \&\\*[SN] \\$*
+ ..
+
+ You can change the style of the leader that bridges each table of
+contents entry with its page number; define the 'TC-LEADER' special
+character by using the 'char' request. A typical leader combines the
+dot glyph '.' with a horizontal motion escape sequence to spread the
+dots. The width of the page number field is stored in the 'TC-MARGIN'
+register.
+
+
+File: groff.info, Node: Differences from AT&T ms, Next: ms Naming Conventions, Prev: ms Page Layout, Up: ms
+
+4.6.7 Differences from AT&T 'ms'
+--------------------------------
+
+The 'groff' 'ms' macros are an independent reimplementation, using no
+AT&T code. Since they take advantage of the extended features of
+'groff', they cannot be used with AT&T 'troff'. 'groff' 'ms' supports
+features described above as Berkeley and Tenth Edition Research Unix
+extensions, and adds several of its own.
+
+ * The internals of 'groff' 'ms' differ from the internals of AT&T
+ 'ms'. Documents that depend upon implementation details of AT&T
+ 'ms' may not format properly with 'groff' 'ms'. Such details
+ include macros whose function was not documented in the AT&T 'ms'
+ manual.(1) (*note Differences from AT&T ms-Footnote-1::)
+
+ * The error-handling policy of 'groff' 'ms' is to detect and report
+ errors, rather than to ignore them silently.
+
+ * Tenth Edition Research Unix supported 'P1'/'P2' macros to bracket
+ code examples; 'groff' 'ms' does not.
+
+ * 'groff' 'ms' does not work in GNU 'troff''s AT&T compatibility
+ mode. If loaded when that mode is enabled, it aborts processing
+ with a diagnostic message.
+
+ * Multiple line spacing is not supported. Use a larger vertical
+ spacing instead.
+
+ * 'groff' 'ms' uses the same header and footer defaults in both
+ 'nroff' and 'troff' modes as AT&T 'ms' does in 'troff' mode; AT&T's
+ default in 'nroff' mode is to put the date, in U.S. traditional
+ format (e.g., "January 1, 2021"), in the center footer (the 'CF'
+ string).
+
+ * Many 'groff' 'ms' macros, including those for paragraphs, headings,
+ and displays, cause a reset of paragraph rendering parameters, and
+ may change the indentation; they do so not by incrementing or
+ decrementing it, but by setting it absolutely. This can cause
+ problems for documents that define additional macros of their own
+ that try to manipulate indentation. Use the 'ms' 'RS' and 'RE'
+ macros instead of the 'in' request.
+
+ * AT&T 'ms' interpreted the values of the registers 'PS' and 'VS' in
+ points, and did not support the use of scaling units with them.
+ 'groff' 'ms' interprets values of the registers 'PS', 'VS', 'FPS',
+ and 'FVS' equal to or larger than 1,000 (one thousand) as decimal
+ fractions multiplied by 1,000.(2) (*note Differences from AT&T
+ ms-Footnote-2::) This threshold makes use of a scaling unit with
+ these parameters practical for high-resolution devices while
+ preserving backward compatibility. It also permits expression of
+ non-integral type sizes. For example, 'groff -rPS=10.5p' at the
+ shell prompt is equivalent to placing '.nr PS 10.5p' at the
+ beginning of the document.
+
+ * AT&T 'ms''s 'AU' macro supported arguments used with some document
+ types; 'groff' 'ms' does not.
+
+ * Right-aligned displays are available. The AT&T 'ms' manual
+ observes that "it is tempting to assume that '.DS R' will right
+ adjust lines, but it doesn't work". In 'groff' 'ms', it does.
+
+ * To make 'groff' 'ms' use the default page offset (which also
+ specifies the left margin), the 'PO' register must stay undefined
+ until the first 'ms' macro is called.
+
+ This implies that '\n[PO]' should not be used early in the
+ document, unless it is changed also: accessing an undefined
+ register automatically defines it.
+
+ * 'groff' 'ms' supports the 'PN' register, but it is not necessary;
+ you can access the page number via the usual '%' register and
+ invoke the 'af' request to assign a different format to it if
+ desired.(3) (*note Differences from AT&T ms-Footnote-3::)
+
+ * The AT&T 'ms' manual documents registers 'CW' and 'GW' as setting
+ the default column width and "intercolumn gap", respectively, and
+ which applied when 'MC' was called with fewer than two arguments.
+ 'groff' 'ms' instead treats 'MC' without arguments as synonymous
+ with '2C'; there is thus no occasion for a default column width
+ register. Further, the 'MINGW' register and the second argument to
+ 'MC' specify a _minimum_ space between columns, not the fixed
+ gutter width of AT&T 'ms'.
+
+ * The AT&T 'ms' manual did not document the 'QI' register; Berkeley
+ and 'groff' 'ms' do.
+
+ -- Register: \n[GS]
+ The register 'GS' is set to 1 by the 'groff' 'ms' macros, but is
+ not used by the AT&T 'ms' package. Documents that need to
+ determine whether they are being formatted with 'groff' 'ms' or
+ another implementation should test this register.
+
+* Menu:
+
+* Missing Unix Version 7 ms Macros::
+
+
+File: groff.info, Node: Differences from AT&T ms-Footnotes, Up: Differences from AT&T ms
+
+ (1) 'Typing Documents on the UNIX System: Using the -ms Macros with
+Troff and Nroff', M. E. Lesk, Bell Laboratories, 1978
+
+ (2) Register values are converted to and stored as basic units.
+*Note Measurements::.
+
+ (3) If you redefine the 'ms' 'PT' macro and desire special treatment
+of certain page numbers (like '1'), you may need to handle a non-Arabic
+page number format, as 'groff' 'ms''s 'PT' does; see the macro package
+source. 'groff' 'ms' aliases the 'PN' register to '%'.
+
+
+File: groff.info, Node: Missing Unix Version 7 ms Macros, Prev: Differences from AT&T ms, Up: Differences from AT&T ms
+
+4.6.7.1 Unix Version 7 'ms' macros not implemented by 'groff' 'ms'
+..................................................................
+
+Several macros described in the Unix Version 7 'ms' documentation are
+unimplemented by 'groff' 'ms' because they are specific to the
+requirements of documents produced internally by Bell Laboratories, some
+of which also require a glyph for the Bell System logo that 'groff' does
+not support. These macros implemented several document type formats
+('EG', 'IM', 'MF', 'MR', 'TM', 'TR'), were meaningful only in
+conjunction with the use of certain document types ('AT', 'CS', 'CT',
+'OK', 'SG'), stored the postal addresses of Bell Labs sites ('HO', 'IH',
+'MH', 'PY', 'WH'), or lacked a stable definition over time ('UX'). To
+compatibly render historical 'ms' documents using these macros, we
+advise your documents to invoke the 'rm' request to remove any such
+macros it uses and then define replacements with an authentically
+typeset original at hand.(1) (*note Missing Unix Version 7 ms
+Macros-Footnote-1::) For informal purposes, a simple definition of 'UX'
+should maintain the readability of the document's substance.
+
+ .rm UX
+ .ds UX Unix\"
+
+
+File: groff.info, Node: Missing Unix Version 7 ms Macros-Footnotes, Up: Missing Unix Version 7 ms Macros
+
+ (1) The removal beforehand is necessary because 'groff' 'ms' aliases
+these macros to a diagnostic macro, and you want to redefine the aliased
+name, not its target.
+
+
+File: groff.info, Node: ms Legacy Features, Next: ms Naming Conventions, Prev: Differences from AT&T ms, Up: ms
+
+4.6.8 Legacy Features
+---------------------
+
+'groff' 'ms' retains some legacy features solely to support formatting
+of historical documents; contemporary ones should not use them because
+they can render poorly. See the 'groff_char(7)' man page.
+
+AT&T accent mark strings
+........................
+
+AT&T 'ms' defined accent mark strings as follows.
+
+ -- String: \*[']
+ Apply acute accent to subsequent glyph.
+
+ -- String: \*[`]
+ Apply grave accent to subsequent glyph.
+
+ -- String: \*[:]
+ Apply dieresis (umlaut) to subsequent glyph.
+
+ -- String: \*[^]
+ Apply circumflex accent to subsequent glyph.
+
+ -- String: \*[~]
+ Apply tilde accent to subsequent glyph.
+
+ -- String: \*[C]
+ Apply caron to subsequent glyph.
+
+ -- String: \*[,]
+ Apply cedilla to subsequent glyph.
+
+Berkeley accent mark and glyph strings
+......................................
+
+Berkeley 'ms' offered an 'AM' macro; calling it redefined the AT&T
+accent mark strings (except for '\*C'), applied them to the _preceding_
+glyph, and defined additional strings, some for spacing glyphs.
+
+ -- Macro: .AM
+ Enable alternative accent mark and glyph-producing strings.
+
+ -- String: \*[']
+ Apply acute accent to preceding glyph.
+
+ -- String: \*[`]
+ Apply grave accent to preceding glyph.
+
+ -- String: \*[:]
+ Apply dieresis (umlaut) to preceding glyph.
+
+ -- String: \*[^]
+ Apply circumflex accent to preceding glyph.
+
+ -- String: \*[~]
+ Apply tilde accent to preceding glyph.
+
+ -- String: \*[,]
+ Apply cedilla to preceding glyph.
+
+ -- String: \*[/]
+ Apply stroke (slash) to preceding glyph.
+
+ -- String: \*[v]
+ Apply caron to preceding glyph.
+
+ -- String: \*[_]
+ Apply macron to preceding glyph.
+
+ -- String: \*[.]
+ Apply underdot to preceding glyph.
+
+ -- String: \*[o]
+ Apply ring accent to preceding glyph.
+
+ -- String: \*[?]
+ Interpolate inverted question mark.
+
+ -- String: \*[!]
+ Interpolate inverted exclamation mark.
+
+ -- String: \*[8]
+ Interpolate small letter sharp s.
+
+ -- String: \*[q]
+ Interpolate small letter o with hook accent (ogonek).
+
+ -- String: \*[3]
+ Interpolate small letter yogh.
+
+ -- String: \*[d-]
+ Interpolate small letter eth.
+
+ -- String: \*[D-]
+ Interpolate capital letter eth.
+
+ -- String: \*[th]
+ Interpolate small letter thorn.
+
+ -- String: \*[Th]
+ Interpolate capital letter thorn.
+
+ -- String: \*[ae]
+ Interpolate small æ ligature.
+
+ -- String: \*[Ae]
+ Interpolate capital Æ ligature.
+
+ -- String: \*[oe]
+ Interpolate small oe ligature.
+
+ -- String: \*[OE]
+ Interpolate capital OE ligature.
+
+
+File: groff.info, Node: ms Naming Conventions, Prev: ms Legacy Features, Up: ms
+
+4.6.9 Naming Conventions
+------------------------
+
+The following conventions are used for names of macros, strings, and
+registers. External names available to documents that use the 'groff'
+'ms' macros contain only uppercase letters and digits.
+
+ Internally, the macros are divided into modules. Conventions for
+identifier names are as follows.
+
+ * Names used only within one module are of the form MODULE'*'NAME.
+
+ * Names used outside the module in which they are defined are of the
+ form MODULE'@'NAME.
+
+ * Names associated with a particular environment are of the form
+ ENVIRONMENT':'NAME; these are used only within the 'par' module.
+
+ * NAME does not have a module prefix.
+
+ * Constructed names used to implement arrays are of the form
+ ARRAY'!'INDEX.
+
+ Thus the 'groff' 'ms' macros reserve the following names.
+
+ * Names containing the characters '*', '@', and ':'.
+
+ * Names containing only uppercase letters and digits.
+
+
+File: groff.info, Node: GNU troff Reference, Next: File Formats, Prev: Major Macro Packages, Up: Top
+
+5 GNU 'troff' Reference
+***********************
+
+This chapter covers _all_ of the facilities of the GNU 'troff'
+formatting engine. Users of macro packages may skip it if not
+interested in details.
+
+* Menu:
+
+* Text::
+* Page Geometry::
+* Measurements::
+* Numeric Expressions::
+* Identifiers::
+* Formatter Instructions::
+* Comments::
+* Registers::
+* Manipulating Filling and Adjustment::
+* Manipulating Hyphenation::
+* Manipulating Spacing::
+* Tabs and Fields::
+* Character Translations::
+* troff and nroff Modes::
+* Line Layout::
+* Line Continuation::
+* Page Layout::
+* Page Control::
+* Using Fonts::
+* Manipulating Type Size and Vertical Spacing::
+* Colors::
+* Strings::
+* Conditionals and Loops::
+* Writing Macros::
+* Page Motions::
+* Drawing Geometric Objects::
+* Deferring Output::
+* Traps::
+* Diversions::
+* Punning Names::
+* Environments::
+* Suppressing Output::
+* I/O::
+* Postprocessor Access::
+* Miscellaneous::
+* Gtroff Internals::
+* Debugging::
+* Implementation Differences::
+
+
+File: groff.info, Node: Text, Next: Measurements, Prev: GNU troff Reference, Up: GNU troff Reference
+
+5.1 Text
+========
+
+AT&T 'troff' was designed to take input as it would be composed on a
+typewriter, including the teletypewriters used as early computer
+terminals, and relieve the user drafting a document of concern with
+details like line length, hyphenation breaking, and the achievement of
+straight margins. Early in its development, the program gained the
+ability to prepare output for a phototypesetter; a document could then
+be prepared for output to either a teletypewriter, a phototypesetter, or
+both. GNU 'troff' continues this tradition of permitting an author to
+compose a single master version of a document which can then be rendered
+for a variety of output formats or devices.
+
+ 'roff' input files contain text interspersed with instructions to
+control the formatter. Even in the absence of such instructions, GNU
+'troff' still processes its input in several ways, by filling,
+hyphenating, breaking, and adjusting it, and supplementing it with
+inter-sentence space.
+
+* Menu:
+
+* Filling::
+* Hyphenation::
+* Sentences::
+* Breaking::
+* Adjustment::
+* Tabs and Leaders::
+* Requests and Macros::
+* Macro Packages::
+* Input Encodings::
+* Input Conventions::
+
+
+File: groff.info, Node: Filling, Next: Sentences, Prev: Text, Up: Text
+
+5.1.1 Filling
+-------------
+
+When GNU 'troff' starts up, it obtains information about the device for
+which it is preparing output.(1) (*note Filling-Footnote-1::) An
+essential property is the length of the output line, such as "6.5
+inches".
+
+ GNU 'troff' interprets plain text files employing the Unix
+line-ending convention. It reads input a character at a time,
+collecting words as it goes, and fits as many words together on an
+output line as it can--this is known as "filling". To GNU 'troff', a
+"word" is any sequence of one or more characters that aren't spaces or
+newlines. The exceptions separate words.(2) (*note
+Filling-Footnote-2::) To disable filling, see *note Manipulating Filling
+and Adjustment::.
+
+ It is a truth universally acknowledged
+ that a single man in possession of a
+ good fortune must be in want of a wife.
+ => It is a truth universally acknowledged that a
+ => single man in possession of a good fortune must
+ => be in want of a wife.
+
+
+File: groff.info, Node: Filling-Footnotes, Up: Filling
+
+ (1) *Note Device and Font Description Files::.
+
+ (2) Tabs and leaders also separate words. Escape sequences can
+function as word characters, word separators, or neither--the last
+simply have no effect on GNU 'troff''s idea of whether an input
+character is within a word. We'll discuss all of these in due course.
+
+
+File: groff.info, Node: Sentences, Next: Hyphenation, Prev: Filling, Up: Text
+
+5.1.2 Sentences
+---------------
+
+A passionate debate has raged for decades among writers of the English
+language over whether more space should appear between adjacent
+sentences than between words within a sentence, and if so, how much, and
+what other circumstances should influence this spacing.(1) (*note
+Sentences-Footnote-1::) GNU 'troff' follows the example of AT&T 'troff';
+it attempts to detect the boundaries between sentences, and supplies
+additional inter-sentence space between them.
+
+ Hello, world!
+ Welcome to groff.
+ => Hello, world! Welcome to groff.
+
+ GNU 'troff' flags certain characters (normally '!', '?', and '.') as
+potentially ending a sentence. When GNU 'troff' encounters one of these
+"end-of-sentence characters" at the end of an input line, or one of them
+is followed by two (unescaped) spaces on the same input line, it appends
+an inter-word space followed by an inter-sentence space in the output.
+
+ R. Harper subscribes to a maxim of P. T. Barnum.
+ => R. Harper subscribes to a maxim of P. T. Barnum.
+
+ In the above example, inter-sentence space is not added after 'P.' or
+'T.' because the periods do not occur at the end of an input line, nor
+are they followed by two or more spaces. Let's imagine that we've heard
+something about defamation from Mr. Harper's attorney, recast the
+sentence, and reflowed it in our text editor.
+
+ I submit that R. Harper subscribes to a maxim of P. T.
+ Barnum.
+ => I submit that R. Harper subscribes to a maxim of
+ => P. T. Barnum.
+
+ "Barnum" doesn't begin a sentence! What to do? Let us meet our
+first "escape sequence", a series of input characters that give
+instructions to GNU 'troff' instead of being used to construct output
+device glyphs.(2) (*note Sentences-Footnote-2::) An escape sequence
+begins with the backslash character '\' by default, an uncommon
+character in natural language text, and is _always_ followed by at least
+one other character, hence the term "sequence".
+
+ The dummy character escape sequence '\&' can be used after an
+end-of-sentence character to defeat end-of-sentence detection on a
+per-instance basis. We can therefore rewrite our input more
+defensively.
+
+ I submit that R.\& Harper subscribes to a maxim of P.\&
+ T.\& Barnum.
+ => I submit that R. Harper subscribes to a maxim of
+ => P. T. Barnum.
+
+ Adding text caused our input to wrap; now, we don't need '\&' after
+'T.' but we do after 'P.'. Consistent use of the escape sequence
+ensures that potential sentence boundaries are robust to editing
+activities. Further advice along these lines will follow in *note Input
+Conventions::.
+
+ Normally, the occurrence of a visible non-end-of-sentence character
+(as opposed to a space or tab) immediately after an end-of-sentence
+character cancels detection of the end of a sentence. For example, it
+would be incorrect for GNU 'troff' to infer the end of a sentence after
+the dot in '3.14159'. However, several characters are treated
+_transparently_ after the occurrence of an end-of-sentence character.
+That is, GNU 'troff' does not cancel end-of-sentence detection when it
+processes them. This is because such characters are often used as
+footnote markers or to close quotations and parentheticals. The default
+set is '"', ''', ')', ']', '*', '\[dg]', '\[dd]', '\[rq]', and '\[cq]'.
+The last four are examples of "special characters", escape sequences
+whose purpose is to obtain glyphs that are not easily typed at the
+keyboard, or which have special meaning to GNU 'troff' (like '\'
+itself).(3) (*note Sentences-Footnote-3::)
+
+ \[lq]The idea that the poor should have leisure has always
+ been shocking to the rich.\[rq]
+ (Bertrand Russell, 1935)
+ => "The idea that the poor should have
+ => leisure has always been shocking to
+ => the rich." (Bertrand Russell, 1935)
+
+ The sets of characters that potentially end sentences or are
+transparent to sentence endings are configurable. See the 'cflags'
+request in *note Using Symbols::. To change the additional
+inter-sentence space amount--even to remove it entirely--see *note
+Manipulating Filling and Adjustment::.
+
+
+File: groff.info, Node: Sentences-Footnotes, Up: Sentences
+
+ (1) A well-researched jeremiad appreciated by 'groff' contributors on
+both sides of the sentence-spacing debate can be found at
+<https://web.archive.org/web/20171217060354/http://www.heracliteanriver.com/?p=324>.
+
+ (2) This statement oversimplifies; there are escape sequences whose
+purpose is precisely to produce glyphs on the output device, and input
+characters that _aren't_ part of escape sequences can undergo a great
+deal of processing before getting to the output.
+
+ (3) The mnemonics for the special characters shown here are "dagger",
+"double dagger", "right (double) quote", and "closing (single) quote".
+See the 'groff_char(7)' man page.
+
+
+File: groff.info, Node: Hyphenation, Next: Breaking, Prev: Sentences, Up: Text
+
+5.1.3 Hyphenation
+-----------------
+
+When an output line is nearly full, it is uncommon for the next word
+collected from the input to exactly fill it--typically, there is room
+left over only for part of the next word. The process of splitting a
+word so that it appears partially on one line (with a hyphen to indicate
+to the reader that the word has been broken) with its remainder on the
+next is "hyphenation". Hyphenation points can be manually specified;
+GNU 'troff' also uses a hyphenation algorithm and language-specific
+pattern files (based on those used in TeX) to decide which words can be
+hyphenated and where.
+
+ Hyphenation does not always occur even when the hyphenation rules for
+a word allow it; it can be disabled, and when not disabled there are
+several parameters that can prevent it in certain circumstances. *Note
+Manipulating Hyphenation::.
+
+
+File: groff.info, Node: Breaking, Next: Adjustment, Prev: Hyphenation, Up: Text
+
+5.1.4 Breaking
+--------------
+
+Once an output line is full, the next word (or remainder of a hyphenated
+one) is placed on a different output line; this is called a "break". In
+this manual and in 'roff' discussions generally, a "break" if not
+further qualified always refers to the termination of an output line.
+When the formatter is filling text, it introduces breaks automatically
+to keep output lines from exceeding the configured line length. After
+an automatic break, GNU 'troff' adjusts the line if applicable (see
+below), and then resumes collecting and filling text on the next output
+line.
+
+ Sometimes, a line cannot be broken automatically. This usually does
+not happen with natural language text unless the output line length has
+been manipulated to be extremely short, but it can with specialized text
+like program source code. We can use 'perl' at the shell prompt to
+contrive an example of failure to break the line. We also employ the
+'-z' option to suppress normal output.
+
+ $ perl -e 'print "#" x 80, "\n";' | nroff -z
+ error-> warning: cannot break line
+
+ The remedy for these cases is to tell GNU 'troff' where the line may
+be broken without hyphens. This is done with the non-printing break
+point escape sequence '\:'; see *note Manipulating Hyphenation::.
+
+ What if the document author wants to stop filling lines temporarily,
+for instance to start a new paragraph? There are several solutions. A
+blank input line not only causes a break, but by default it also outputs
+a one-line vertical space (effectively a blank output line). This
+behavior can be modified; see *note Blank Line Traps::. Macro packages
+may discourage or disable the blank line method of paragraphing in favor
+of their own macros.
+
+ A line that begins with one or more spaces causes a break. The
+spaces are output at the beginning of the next line without being
+_adjusted_ (see below); however, this behavior can be modified (*note
+Leading Space Traps::). Again, macro packages may provide other methods
+of producing indented paragraphs. Trailing spaces on text lines are
+discarded.(1) (*note Breaking-Footnote-1::)
+
+ What if the file ends before enough words have been collected to fill
+an output line? Or the output line is exactly full but not yet broken,
+and there is no more input? GNU 'troff' interprets the end of input as
+a break. Certain requests also cause breaks, implicitly or explicitly.
+This is discussed in *note Manipulating Filling and Adjustment::.
+
+
+File: groff.info, Node: Breaking-Footnotes, Up: Breaking
+
+ (1) "Text lines" are defined in *note Requests and Macros::.
+
+
+File: groff.info, Node: Adjustment, Next: Tabs and Leaders, Prev: Breaking, Up: Text
+
+5.1.5 Adjustment
+----------------
+
+After GNU 'troff' performs an automatic break, it may then "adjust" the
+line, widening inter-word spaces until the text reaches the right
+margin. Extra spaces between words are preserved. Leading and trailing
+spaces are handled as noted above. Text can be aligned to the left or
+right margin only, or centered; see *note Manipulating Filling and
+Adjustment::.
+
+
+File: groff.info, Node: Tabs and Leaders, Next: Input Conventions, Prev: Adjustment, Up: Text
+
+5.1.6 Tabs and Leaders
+----------------------
+
+GNU 'troff' translates input horizontal tab characters ("tabs") and
+<Control+A> characters ("leaders") into movements to the next tab stop.
+Tabs simply move to the next tab stop; leaders place enough periods to
+fill the space. Tab stops are by default located every half inch
+measured from the drawing position corresponding to the beginning of the
+input line; see *note Page Geometry::. Tabs and leaders do not cause
+breaks and therefore do not interrupt filling. Below, we use arrows ->
+and bullets * to indicate input tabs and leaders, respectively.
+
+ 1
+ -> 2 -> 3 * 4
+ -> * 5
+ => 1 2 3.......4 ........5
+
+ Tabs and leaders lend themselves to table construction.(1) (*note
+Tabs and Leaders-Footnote-1::) The tab and leader glyphs can be
+configured, and further facilities for sophisticated table composition
+are available; see *note Tabs and Fields::. There are many details to
+track when using such low-level features, so most users turn to the
+'tbl(1)' preprocessor to lay out tables.
+
+
+File: groff.info, Node: Tabs and Leaders-Footnotes, Up: Tabs and Leaders
+
+ (1) "Tab" is short for "tabulation", revealing the term's origin as a
+spacing mechanism for table arrangement.
+
+
+File: groff.info, Node: Requests and Macros, Next: Macro Packages, Prev: Tabs and Leaders, Up: Text
+
+5.1.7 Requests and Macros
+-------------------------
+
+We have now encountered almost all of the syntax there is in the 'roff'
+language, with an exception already noted in passing. A "request" is an
+instruction to the formatter that occurs after a "control character",
+which is recognized at the beginning of an input line. The regular
+control character is a dot ('.'). Its counterpart, the "no-break
+control character", a neutral apostrophe ('''), suppresses the break
+that is implied by some requests. These characters were chosen because
+it is uncommon for lines of text in natural languages to begin with
+them. If you require a formatted period or apostrophe (closing single
+quotation mark) where GNU 'troff' is expecting a control character,
+prefix the dot or neutral apostrophe with the dummy character escape
+sequence, '\&'.
+
+ An input line beginning with a control character is called a "control
+line". Every line of input that is not a control line is a "text
+line".(1) (*note Requests and Macros-Footnote-1::)
+
+ Requests often take "arguments", words (separated from the request
+name and each other by spaces) that specify details of the action GNU
+'troff' is expected to perform. If a request is meaningless without
+arguments, it is typically ignored.
+
+ GNU 'troff''s requests and escape sequences comprise the control
+language of the formatter. Of key importance are the requests that
+define macros. Macros are invoked like requests, enabling the request
+repertoire to be extended or overridden.(2) (*note Requests and
+Macros-Footnote-2::)
+
+ A "macro" can be thought of as an abbreviation you can define for a
+collection of control and text lines. When the macro is "called" by
+giving its name after a control character, it is replaced with what it
+stands for. The process of textual replacement is known as
+"interpolation".(3) (*note Requests and Macros-Footnote-3::)
+Interpolations are handled as soon as they are recognized, and once
+performed, a 'roff' formatter scans the replacement for further
+requests, macro calls, and escape sequences.
+
+ In 'roff' systems, the 'de' request defines a macro.(4) (*note
+Requests and Macros-Footnote-4::)
+
+ .de DATE
+ 2020-11-14
+ ..
+
+The foregoing input produces no output by itself; all we have done is
+store some information. Observe the pair of dots that ends the macro
+definition. This is a default; you can specify your own terminator for
+the macro definition as the second argument to the 'de' request.
+
+ .de NAME ENDNAME
+ Heywood Jabuzzoff
+ .ENDNAME
+
+ In fact, the ending marker is itself the name of a macro to be
+called, or a request to be invoked, if it is defined at the time its
+control line is read.
+
+ .de END
+ Big Rip
+ ..
+ .de START END
+ Big Bang
+ .END
+ .START
+ => Big Rip Big Bang
+
+In the foregoing example, "Big Rip" printed before "Big Bang" because
+its macro was _called_ first. Consider what would happen if we dropped
+'END' from the '.de START' line and added '..' after '.END'. Would the
+order change?
+
+ Let us consider a more elaborate example.
+
+ .de DATE
+ 2020-10-05
+ ..
+ .
+ .de BOSS
+ D.\& Kruger,
+ J.\& Peterman
+ ..
+ .
+ .de NOTICE
+ Approved:
+ .DATE
+ by
+ .BOSS
+ ..
+ .
+ Insert tedious regulatory compliance paragraph here.
+
+ .NOTICE
+
+ Insert tedious liability disclaimer paragraph here.
+
+ .NOTICE
+ => Insert tedious regulatory compliance paragraph here.
+ =>
+ => Approved: 2020-10-05 by D. Kruger, J. Peterman
+ =>
+ => Insert tedious liability disclaimer paragraph here.
+ =>
+ => Approved: 2020-10-05 by D. Kruger, J. Peterman
+
+The above document started with a series of control lines. Three macros
+were defined, with a 'de' request declaring each macro's name, and the
+"body" of the macro starting on the next line and continuing until a
+line with two dots ''..'' marked its end. The text proper began only
+after the macros were defined; this is a common pattern. Only the
+'NOTICE' macro was called "directly" by the document; 'DATE' and 'BOSS'
+were called only by 'NOTICE' itself. Escape sequences were used in
+'BOSS', two levels of macro interpolation deep.
+
+ The advantage in typing and maintenance economy may not be obvious
+from such a short example, but imagine a much longer document with
+dozens of such paragraphs, each requiring a notice of managerial
+approval. Consider what must happen if you are in charge of generating
+a new version of such a document with a different date, for a different
+boss. With well-chosen macros, you only have to change each datum in
+one place.
+
+ In practice, we would probably use strings (*note Strings::) instead
+of macros for such simple interpolations; what is important here is to
+glimpse the potential of macros and the power of recursive
+interpolation.
+
+ We could have defined 'DATE' and 'BOSS' in the opposite order;
+perhaps less obviously, we could also have defined them _after_
+'NOTICE'. "Forward references" like this are acceptable because the
+body of a macro definition is not (completely) interpreted, but stored
+instead (*note Copy Mode::). While a macro is being defined (or
+appended to), requests are not interpreted and macros not interpolated,
+whereas some commonly used escape sequences _are_ interpreted. 'roff'
+systems also support recursive macro calls, as long as you have a way to
+break the recursion (*note Conditionals and Loops::). Maintainable
+'roff' documents tend to arrange macro definitions to minimize forward
+references.
+
+
+File: groff.info, Node: Requests and Macros-Footnotes, Up: Requests and Macros
+
+ (1) The '\<RET>' escape sequence can alter how an input line is
+classified; see *note Line Continuation::.
+
+ (2) Argument handling in macros is more flexible but also more
+complex. *Note Calling Macros::.
+
+ (3) Some escape sequences undergo interpolation as well.
+
+ (4) GNU 'troff' offers additional ones. *Note Writing Macros::.
+
+
+File: groff.info, Node: Macro Packages, Next: Input Encodings, Prev: Requests and Macros, Up: Text
+
+5.1.8 Macro Packages
+--------------------
+
+Macro definitions can be collected into "macro files", 'roff' input
+files designed to produce no output themselves but instead ease the
+preparation of other 'roff' documents. There is no syntactical
+difference between a macro file and any other 'roff' document; only its
+purpose distinguishes it. When a macro file is installed at a standard
+location and suitable for use by a general audience, it is often termed
+a "macro package".(1) (*note Macro Packages-Footnote-1::) Macro
+packages can be loaded by supplying the '-m' option to GNU 'troff' or a
+'groff' front end. Alternatively, a document requiring a macro package
+can load it with the 'mso' ("macro source") request.
+
+
+File: groff.info, Node: Macro Packages-Footnotes, Up: Macro Packages
+
+ (1) Macro files and packages frequently define registers and strings
+as well.
+
+
+File: groff.info, Node: Input Encodings, Next: Input Conventions, Prev: Macro Packages, Up: Text
+
+5.1.9 Input Encodings
+---------------------
+
+The 'groff' command's '-k' option calls the 'preconv' preprocessor to
+perform input character encoding conversions. Input to the GNU 'troff'
+formatter itself, on the other hand, must be in one of two encodings it
+can recognize.
+
+'cp1047'
+ The code page 1047 input encoding works only on EBCDIC platforms
+ (and conversely, the other input encodings don't work with EBCDIC);
+ the file 'cp1047.tmac' is loaded at startup.
+
+'latin1'
+ ISO Latin-1, an encoding for Western European languages, is the
+ default input encoding on non-EBCDIC platforms; the file
+ 'latin1.tmac' is loaded at startup.
+
+Any document that is encoded in ISO 646:1991 (a descendant of USAS
+X3.4-1968 or "US-ASCII"), or, equivalently, uses only code points from
+the "C0 Controls" and "Basic Latin" parts of the Unicode character set
+is also a valid ISO Latin-1 document; the standards are interchangeable
+in their first 128 code points.(1) (*note Input Encodings-Footnote-1::)
+
+ Other encodings are supported by means of macro packages.
+
+'latin2'
+ To use ISO Latin-2, an encoding for Central and Eastern European
+ languages, invoke '.mso latin2.tmac' at the beginning of your
+ document or supply '-mlatin2' as a command-line argument to
+ 'groff'.
+
+'latin5'
+ To use ISO Latin-5, an encoding for the Turkish language, invoke
+ '.mso latin5.tmac' at the beginning of your document or supply
+ '-mlatin5' as a command-line argument to 'groff'.
+
+'latin9'
+ ISO Latin-9 succeeds Latin-1; it includes a Euro sign and better
+ glyph coverage for French. To use this encoding, invoke
+ '.mso latin9.tmac' at the beginning of your document or supply
+ '-mlatin9' as a command-line argument to 'groff'.
+
+ Some characters from an input encoding may not be available with a
+particular output driver, or their glyphs may not have representation in
+the font used. For terminal devices, fallbacks are defined, like 'EUR'
+for the Euro sign and '(C)' for the copyright sign. For typesetter
+devices, you may need to "mount" fonts that support glyphs required by
+the document. *Note Font Positions::.
+
+ Because a Euro glyph was not historically defined in PostScript
+fonts, 'groff' comes with a font called 'freeeuro.pfa' that provides the
+Euro in several styles. Standard PostScript fonts contain the glyphs
+from Latin-5 and Latin-9 that Latin-1 lacks, so these encodings are
+supported for the 'ps' and 'pdf' output devices as 'groff' ships, while
+Latin-2 is not.
+
+ Unicode supports characters from all other input encodings; the
+'utf8' output driver for terminals therefore does as well. The DVI
+output driver supports the Latin-2 and Latin-9 encodings if the
+command-line option '-mec' is used as well. (2) (*note Input
+Encodings-Footnote-2::)
+
+
+File: groff.info, Node: Input Encodings-Footnotes, Up: Input Encodings
+
+ (1) The _semantics_ of certain punctuation code points have gotten
+stricter with the successive standards, a cause of some frustration
+among man page writers; see the 'groff_char(7)' man page.
+
+ (2) The DVI output device defaults to using the Computer Modern (CM)
+fonts; 'ec.tmac' loads the EC fonts instead, which provide Euro '\[Eu]'
+and per mille '\[%0]' glyphs.
+
+
+File: groff.info, Node: Input Conventions, Prev: Input Encodings, Up: Text
+
+5.1.10 Input Conventions
+------------------------
+
+Since GNU 'troff' fills text automatically, it is common practice in the
+'roff' language to avoid visual composition of text in input files: the
+esthetic appeal of the formatted output is what matters. Therefore,
+'roff' input should be arranged such that it is easy for authors and
+maintainers to compose and develop the document, understand the syntax
+of 'roff' requests, macro calls, and preprocessor languages used, and
+predict the behavior of the formatter. Several traditions have accrued
+in service of these goals.
+
+ * Follow sentence endings in the input with newlines to ease their
+ recognition (*note Sentences::). It is frequently convenient to
+ end text lines after colons and semicolons as well, as these
+ typically precede independent clauses. Consider doing so after
+ commas; they often occur in lists that become easy to scan when
+ itemized by line, or constitute supplements to the sentence that
+ are added, deleted, or updated to clarify it. Parenthetical and
+ quoted phrases are also good candidates for placement on text lines
+ by themselves.
+
+ * Set your text editor's line length to 72 characters or fewer.(1)
+ (*note Input Conventions-Footnote-1::) This limit, combined with
+ the previous item of advice, makes it less common that an input
+ line will wrap in your text editor, and thus will help you perceive
+ excessively long constructions in your text. Recall that natural
+ languages originate in speech, not writing, and that punctuation is
+ correlated with pauses for breathing and changes in prosody.
+
+ * Use '\&' after '!', '?', and '.' if they are followed by space,
+ tab, or newline characters and don't end a sentence.
+
+ * In filled text lines, use '\&' before '.' and ''' if they are
+ preceded by space, so that reflowing the input doesn't turn them
+ into control lines.
+
+ * Do not use spaces to perform indentation or align columns of a
+ table. Leading spaces are reliable when text is not being filled.
+
+ * Comment your document. It is never too soon to apply comments to
+ record information of use to future document maintainers (including
+ your future self). We thus introduce another escape sequence,
+ '\"', which causes GNU 'troff' to ignore the remainder of the input
+ line.
+
+ * Use the empty request--a control character followed immediately by
+ a newline--to visually manage separation of material in input
+ files. Many of the 'groff' project's own documents use an empty
+ request between sentences, after macro definitions, and where a
+ break is expected, and two empty requests between paragraphs or
+ other requests or macro calls that will introduce vertical space
+ into the document.
+
+ You can combine the empty request with the comment escape sequence
+ to include whole-line comments in your document, and even "comment
+ out" sections of it.
+
+ We conclude this section with an example sufficiently long to
+illustrate most of the above suggestions in practice. For the purpose
+of fitting the example between the margins of this manual with the font
+used for its typeset version, we have shortened the input line length to
+56 columns. As before, an arrow -> indicates a tab character.
+
+ .\" nroff this_file.roff | less
+ .\" groff -T ps this_file.roff > this_file.ps
+ ->The theory of relativity is intimately connected with
+ the theory of space and time.
+ .
+ I shall therefore begin with a brief investigation of
+ the origin of our ideas of space and time,
+ although in doing so I know that I introduce a
+ controversial subject. \" remainder of paragraph elided
+ .
+ .
+
+ ->The experiences of an individual appear to us arranged
+ in a series of events;
+ in this series the single events which we remember
+ appear to be ordered according to the criterion of
+ \[lq]earlier\[rq] and \[lq]later\[rq], \" punct swapped
+ which cannot be analysed further.
+ .
+ There exists,
+ therefore,
+ for the individual,
+ an I-time,
+ or subjective time.
+ .
+ This itself is not measurable.
+ .
+ I can,
+ indeed,
+ associate numbers with the events,
+ in such a way that the greater number is associated with
+ the later event than with an earlier one;
+ but the nature of this association may be quite
+ arbitrary.
+ .
+ This association I can define by means of a clock by
+ comparing the order of events furnished by the clock
+ with the order of a given series of events.
+ .
+ We understand by a clock something which provides a
+ series of events which can be counted,
+ and which has other properties of which we shall speak
+ later.
+ .\" Albert Einstein, _The Meaning of Relativity_, 1922
+
+
+File: groff.info, Node: Input Conventions-Footnotes, Up: Input Conventions
+
+ (1) Emacs: 'fill-column: 72'; Vim: 'textwidth=72'
+
+
+File: groff.info, Node: Page Geometry, Next: Measurements, Prev: Text, Up: GNU troff Reference
+
+5.2 Page Geometry
+=================
+
+'roff' systems format text under certain assumptions about the size of
+the output medium, or page. For the formatter to correctly break a line
+it is filling, it must know the line length, which it derives from the
+page width (*note Line Layout::). For it to decide whether to write an
+output line to the current page or wait until the next one, it must know
+the page length (*note Page Layout::).
+
+ A device's "resolution" converts practical units like inches or
+centimeters to "basic units", a convenient length measure for the output
+device or file format. The formatter and output driver use basic units
+to reckon page measurements. The device description file defines its
+resolution and page dimensions (*note DESC File Format::).
+
+ A "page" is a two-dimensional structure upon which a 'roff' system
+imposes a rectangular coordinate system with its upper left corner as
+the origin. Coordinate values are in basic units and increase down and
+to the right. Useful ones are therefore always positive and within
+numeric ranges corresponding to the page boundaries.
+
+ While the formatter (and, later, output driver) is processing a page,
+it keeps track of its "drawing position", which is the location at which
+the next glyph will be written, from which the next motion will be
+measured, or where a geometric object will commence rendering.
+Notionally, glyphs are drawn from the text baseline upward and to the
+right.(1) (*note Page Geometry-Footnote-1::) The "text baseline" is a
+(usually invisible) line upon which the glyphs of a typeface are
+aligned. A glyph therefore "starts" at its bottom-left corner. If
+drawn at the origin, a typical letter glyph would lie partially or
+wholly off the page, depending on whether, like "g", it features a
+descender below the baseline.
+
+ Such a situation is nearly always undesirable. It is furthermore
+conventional not to write or draw at the extreme edges of the page.
+Therefore the initial drawing position of a 'roff' formatter is not at
+the origin, but below and to the right of it. This rightward shift from
+the left edge is known as the "page offset".(2) (*note Page
+Geometry-Footnote-2::) The downward shift leaves room for a text output
+line.
+
+ Text is arranged on a one-dimensional lattice of text baselines from
+the top to the bottom of the page. "Vertical spacing" is the distance
+between adjacent text baselines. Typographic tradition sets this
+quantity to 120% of the type size. The initial drawing position is one
+unit of vertical spacing below the page top. Typographers term this
+unit a vee.
+
+ Vertical spacing has an impact on page-breaking decisions.
+Generally, when a break occurs, the formatter moves the drawing position
+to the next text baseline automatically. If the formatter were already
+writing to the last line that would fit on the page, advancing by one
+vee would place the next text baseline off the page. Rather than let
+that happen, 'roff' formatters instruct the output driver to eject the
+page, start a new one, and again set the drawing position to one vee
+below the page top; this is a "page break".
+
+ When the last line of input text corresponds to the last output line
+that fits on the page, the break caused by the end of input will also
+break the page, producing a useless blank one. Macro packages keep
+users from having to confront this difficulty by setting "traps" (*note
+Traps::); moreover, all but the simplest page layouts tend to have
+headers and footers, or at least bear vertical margins larger than one
+vee.
+
+
+File: groff.info, Node: Page Geometry-Footnotes, Up: Page Geometry
+
+ (1) 'groff' does not yet support right-to-left scripts.
+
+ (2) 'groff''s terminal output devices have page offsets of zero.
+
+
+File: groff.info, Node: Measurements, Next: Numeric Expressions, Prev: Text, Up: GNU troff Reference
+
+5.3 Measurements
+================
+
+The formatter sometimes requires the input of numeric parameters to
+specify measurements. These are specified as integers or decimal
+fractions with an optional "scaling unit" suffixed. A scaling unit is a
+letter that immediately follows the last digit of a number. Digits
+after the decimal point are optional. Measurement expressions include
+'10.5p', '11i', and '3.c'.
+
+ Measurements are scaled by the scaling unit and stored internally
+(with any fractional part discarded) in basic units. The device
+resolution can therefore be obtained by storing a value of '1i' to a
+register. The only constraint on the basic unit is that it is at least
+as small as any other unit.
+
+'u'
+ Basic unit.
+
+'i'
+ Inch; defined as 2.54 centimeters.
+
+'c'
+ Centimeter; a centimeter is about 0.3937 inches.
+
+'p'
+ Point; a typesetter's unit used for measuring type size. There are
+ 72 points to an inch.
+
+'P'
+ Pica; another typesetter's unit. There are 6 picas to an inch and
+ 12 points to a pica.
+
+'s'
+'z'
+ *Note Using Fractional Type Sizes::, for a discussion of these
+ units.
+
+'f'
+ GNU 'troff' defines this unit to scale decimal fractions in the
+ interval [0, 1] to 16-bit unsigned integers. It multiplies a
+ quantity by 65,536. *Note Colors::, for usage.
+
+ The magnitudes of other scaling units depend on the text formatting
+parameters in effect. These are useful when specifying measurements
+that need to scale with the typeface or vertical spacing.
+
+'m'
+ Em; an em is equal to the current type size in points. It is named
+ thus because it is approximately the width of the letter 'M'.
+
+'n'
+ En; an en is one-half em.
+
+'v'
+ Vee; recall *note Page Geometry::.
+
+'M'
+ Hundredth of an em.
+
+* Menu:
+
+* Motion Quanta::
+* Default Units::
+
+
+File: groff.info, Node: Motion Quanta, Next: Default Units, Prev: Measurements, Up: Measurements
+
+5.3.1 Motion Quanta
+-------------------
+
+An output device's basic unit 'u' is not necessarily its smallest
+addressable length; 'u' can be smaller to avoid problems with integer
+roundoff. The minimum distances that a device can work with in the
+horizontal and vertical directions are termed its "motion quanta".
+Measurements are rounded to applicable motion quanta. Half-quantum
+fractions round toward zero.
+
+ -- Register: \n[.H]
+ -- Register: \n[.V]
+ These read-only registers interpolate the horizontal and vertical
+ motion quanta, respectively, of the output device in basic units.
+
+ For example, we might draw short baseline rules on a terminal device
+as follows. *Note Drawing Geometric Objects::.
+
+ .tm \n[.H]
+ error-> 24
+ .nf
+ \l'36u' 36u
+ \l'37u' 37u
+ => _ 36u
+ => __ 37u
+
+
+File: groff.info, Node: Default Units, Prev: Motion Quanta, Up: Measurements
+
+5.3.2 Default Units
+-------------------
+
+A general-purpose register (one created or updated with the 'nr'
+request; see *note Registers::) is implicitly dimensionless, or reckoned
+in basic units if interpreted in a measurement context. But it is
+convenient for many requests and escape sequences to infer a scaling
+unit for an argument if none is specified. An explicit scaling unit
+(not after a closing parenthesis) can override an undesirable default.
+Effectively, the default unit is suffixed to the expression if a scaling
+unit is not already present. GNU 'troff''s use of integer arithmetic
+should also be kept in mind (*note Numeric Expressions::).
+
+ The 'll' request interprets its argument in ems by default. Consider
+several attempts to set a line length of 3.5 inches when the type size
+is 10 points on a terminal device with a resolution of 240 basic units
+and horizontal motion quantum of 24. Some expressions become zero; the
+request clamps them to that quantum.
+
+ .ll 3.5i \" 3.5i (= 840u)
+ .ll 7/2 \" 7u/2u -> 3u -> 3m -> 0, clamped to 24u
+ .ll (7 / 2)u \" 7u/2u -> as above
+ .ll 7/2i \" 7u/2i -> 7u/480u -> 0 -> as above
+ .ll 7i/2 \" 7i/2u -> 1680u/2m -> 1680u/24u -> 35u
+ .ll 7i/2u \" 3.5i (= 840u)
+
+The safest way to specify measurements is to attach a scaling unit. To
+multiply or divide by a dimensionless quantity, use 'u' as its scaling
+unit.
+
+
+File: groff.info, Node: Numeric Expressions, Next: Identifiers, Prev: Measurements, Up: GNU troff Reference
+
+5.4 Numeric Expressions
+=======================
+
+A "numeric expression" evaluates to an integer: it can be as simple as a
+literal '0' or it can be a complex sequence of register and string
+interpolations interleaved with measurements and operators.
+
+ GNU 'troff' provides a set of mathematical and logical operators
+familiar to programmers--as well as some unusual ones--but supports only
+integer arithmetic.(1) (*note Numeric Expressions-Footnote-1::) The
+internal data type used for computing results is usually a 32-bit signed
+integer, which suffices to represent magnitudes within a range of ±2
+billion.(2) (*note Numeric Expressions-Footnote-2::)
+
+ Arithmetic infix operators perform a function on the numeric
+expressions to their left and right; they are '+' (addition), '-'
+(subtraction), '*' (multiplication), '/' (truncating division), and '%'
+(modulus). "Truncating division" rounds to the integer nearer to zero,
+no matter how large the fractional portion. Overflow and division (or
+modulus) by zero are errors and abort evaluation of a numeric
+expression.
+
+ Arithmetic unary operators operate on the numeric expression to their
+right; they are '-' (negation) and '+' (assertion--for completeness; it
+does nothing). The unary minus must often be used with parentheses to
+avoid confusion with the decrementation operator, discussed below.
+
+ Observe the rounding behavior and effect of negative operands on the
+modulus and truncating division operators.
+
+ .nr T 199/100
+ .nr U 5/2
+ .nr V (-5)/2
+ .nr W 5/-2
+ .nr X 5%2
+ .nr Y (-5)%2
+ .nr Z 5%-2
+ T=\n[T] U=\n[U] V=\n[V] W=\n[W] X=\n[X] Y=\n[Y] Z=\n[Z]
+ => T=1 U=2 V=-2 W=-2 X=1 Y=-1 Z=1
+
+The sign of the modulus of operands of mixed signs is determined by the
+sign of the first. Division and modulus operators satisfy the following
+property: given a dividend A and a divisor B, a quotient Q formed by '(a
+/ b)' and a remainder R by '(a % b)', then qb + r = a.
+
+ GNU 'troff''s scaling operator, used with parentheses as '(C;E)',
+evaluates a numeric expression E using C as the default scaling unit.
+If C is omitted, scaling units are ignored in the evaluation of E. This
+operator can save typing by avoiding the attachment of scaling units to
+every operand out of caution. Your macros can select a sensible default
+unit in case the user neglects to supply one.
+
+ .\" Indent by amount given in first argument; assume ens.
+ .de Indent
+ . in (n;\\$1)
+ ..
+
+Without the scaling operator, the foregoing macro would, if called with
+a unitless argument, cause indentation by the 'in' request's default
+scaling unit (ems). The result would be twice as much indentation as
+expected.
+
+ GNU 'troff' also provides a pair of operators to compute the extrema
+of two operands: '>?' (maximum) and '<?' (minimum).
+
+ .nr slots 5
+ .nr candidates 3
+ .nr salaries (\n[slots] <? \n[candidates])
+ Looks like we'll end up paying \n[salaries] salaries.
+ => Looks like we'll end up paying 3 salaries.
+
+ Comparison operators comprise '<' (less than), '>' (greater than),
+'<=' (less than or equal), '>=' (greater than or equal), and '='
+(equal). '==' is a synonym for '='. When evaluated, a comparison is
+replaced with '0' if it is false and '1' if true. In the 'roff'
+language, positive values are true, others false.
+
+ We can operate on truth values with the logical operators '&'
+(logical conjunction or "and") and ':' (logical disjunction or "or").
+They evaluate as comparison operators do.
+
+ A logical complementation ("not") operator, '!', works only within
+'if', 'ie', and 'while' requests. Furthermore, '!' is recognized only
+at the beginning of a numeric expression not contained by another
+numeric expression. In other words, it must be the "outermost"
+operator. Including it elsewhere in the expression produces a warning
+in the 'number' category (*note Warnings::), and its expression
+evaluates false. This unfortunate limitation maintains compatibility
+with AT&T 'troff'. Test a numeric expression for falsity by comparing
+it to a false value.(3) (*note Numeric Expressions-Footnote-3::)
+
+ .nr X 1
+ .nr Y 0
+ .\" This does not work as expected.
+ .if (\n[X])&(!\n[Y]) .nop A: X is true, Y is false
+ .
+ .\" Use this construct instead.
+ .if (\n[X])&(\n[Y]<=0) .nop B: X is true, Y is false
+ error-> warning: expected numeric expression, got '!'
+ => B: X is true, Y is false
+
+ The 'roff' language has no operator precedence: expressions are
+evaluated strictly from left to right, in contrast to schoolhouse
+arithmetic. Use parentheses '(' ')' to impose a desired precedence upon
+subexpressions.
+
+ .nr X 3+5*4
+ .nr Y (3+5)*4
+ .nr Z 3+(5*4)
+ X=\n[X] Y=\n[Y] Z=\n[Z]
+ => X=32 Y=32 Z=23
+
+ For many requests and escape sequences that cause motion on the page,
+the unary operators '+' and '-' work differently when leading a numeric
+expression. They then indicate a motion relative to the drawing
+position: positive is down in vertical contexts, right in horizontal
+ones.
+
+ '+' and '-' are also treated differently by the following requests
+and escape sequences: 'bp', 'in', 'll', 'lt', 'nm', 'nr', 'pl', 'pn',
+'po', 'ps', 'pvs', 'rt', 'ti', '\H', '\R', and '\s'. Here, leading plus
+and minus signs serve as incrementation and decrementation operators,
+respectively. To negate an expression, subtract it from zero or include
+the unary minus in parentheses with its argument. *Note Setting
+Registers::, for examples.
+
+ A leading '|' operator indicates a motion relative not to the drawing
+position but to a boundary. For horizontal motions, the measurement
+specifies a distance relative to a drawing position corresponding to the
+beginning of the _input_ line. By default, tab stops reckon movements
+in this way. Most escape sequences do not; '|' tells them to do so.
+
+ Mind the \h'1.2i'gap.
+ .br
+ Mind the \h'|1.2i'gap.
+ .br
+ Mind the
+ \h'|1.2i'gap.
+ => Mind the gap.
+ => Mind the gap.
+ => Mind the gap.
+
+ One use of this feature is to define macros whose scope is limited to
+the output they format.
+
+ .\" underline word $1 with trailing punctuation $2
+ .de Underline
+ . nop \\$1\l'|0\[ul]'\\$2
+ ..
+ Typographical emphasis is best used
+ .Underline sparingly .
+
+In the above example, '|0' specifies a negative motion from the current
+position (at the end of the argument just emitted, '\$1') to the
+beginning of the input line. Thus, the '\l' escape sequence in this
+case draws a line from right to left. A macro call occurs at the
+beginning of an input line;(4) (*note Numeric Expressions-Footnote-4::)
+if the '|' operator were omitted, then the underline would be drawn at
+zero distance from the current position, producing device-dependent, and
+likely undesirable, results. On the 'ps' output device, it underlines
+the period.
+
+ For vertical motions, the '|' operator specifies a distance from the
+first text baseline on the page or in the current diversion,(5) (*note
+Numeric Expressions-Footnote-5::) using the current vertical spacing.
+
+ A
+ .br
+ B \Z'C'\v'|0'D
+ => A D
+ => B C
+
+ In the foregoing example, we've used the '\Z' escape sequence (*note
+Page Motions::) to restore the drawing position after formatting 'C',
+then moved vertically to the first text baseline on the page.
+
+ -- Escape sequence: \B'anything'
+ Interpolate 1 if ANYTHING is a valid numeric expression, and 0
+ otherwise. The delimiter need not be a neutral apostrophe; see
+ *note Delimiters::.
+
+ You might use '\B' along with the 'if' request to filter out invalid
+macro or string arguments. *Note Conditionals and Loops::.
+
+ .\" Indent by amount given in first argument; assume ens.
+ .de Indent
+ . if \B'\\$1' .in (n;\\$1)
+ ..
+
+ A register interpolated as an operand in a numeric expression must
+have an Arabic format; luckily, this is the default. *Note Assigning
+Register Formats::.
+
+ Because spaces separate arguments to requests, spaces are not allowed
+in numeric expressions unless the (sub)expression containing them is
+surrounded by parentheses. *Note Invoking Requests::, and *note
+Conditionals and Loops::.
+
+ .nf
+ .nr a 1+2 + 2+1
+ \na
+ error-> expected numeric expression, got a space
+ => 3
+ .nr a 1+(2 + 2)+1
+ \na
+ => 6
+
+ The 'nr' request (*note Setting Registers::) expects its second and
+optional third arguments to be numeric expressions; a bare '+' does not
+qualify, so our first attempt got a warning.
+
+
+File: groff.info, Node: Numeric Expressions-Footnotes, Up: Numeric Expressions
+
+ (1) Provision is made for interpreting and reporting decimal
+fractions in certain cases.
+
+ (2) If that's not enough, see the 'groff_tmac(5)' man page for the
+'62bit.tmac' macro package.
+
+ (3) *Note Conditionals and Loops::.
+
+ (4) Control structure syntax creates an exception to this rule, but
+is designed to remain useful: recalling our example, '.if 1 .Underline
+this' would underline only "this", precisely. *Note Conditionals and
+Loops::.
+
+ (5) *Note Diversions::.
+
+
+File: groff.info, Node: Identifiers, Next: Formatter Instructions, Prev: Numeric Expressions, Up: GNU troff Reference
+
+5.5 Identifiers
+===============
+
+An "identifier" labels a GNU 'troff' datum such as a register, name
+(macro, string, or diversion), typeface, color, special character,
+character class, environment, or stream. Valid identifiers consist of
+one or more ordinary characters. An ordinary character is an input
+character that is not the escape character, a leader, tab, newline, or
+invalid as GNU 'troff' input.
+
+ Invalid input characters are a subset of control characters (from the
+sets "C0 Controls" and "C1 Controls" as Unicode describes them). When
+GNU 'troff' encounters one in an identifier, it produces a warning in
+category 'input' (*note Warnings::). They are removed during
+interpretation: an identifier 'foo', followed by an invalid character
+and then 'bar', is processed as 'foobar'.
+
+ On a machine using the ISO 646, 8859, or 10646 character encodings,
+invalid input characters are '0x00', '0x08', '0x0B', '0x0D'-'0x1F', and
+'0x80'-'0x9F'. On an EBCDIC host, they are '0x00'-'0x01', '0x08',
+'0x09', '0x0B', '0x0D'-'0x14', '0x17'-'0x1F', and '0x30'-'0x3F'.(1)
+(*note Identifiers-Footnote-1::) Some of these code points are used by
+GNU 'troff' internally, making it non-trivial to extend the program to
+accept UTF-8 or other encodings that use characters from these
+ranges.(2) (*note Identifiers-Footnote-2::)
+
+ Thus, the identifiers 'br', 'PP', 'end-list', 'ref*normal-print',
+'|', '@_', and '!"#$%'()*+,-./' are all valid. Discretion should be
+exercised to prevent confusion. Identifiers starting with '(' or '['
+require care.
+
+ .nr x 9
+ .nr y 1
+ .nr (x 2
+ .nr [y 3
+ .nr sum1 (\n(x + \n[y])
+ error-> a space character is not allowed in an escape
+ error-> sequence parameter
+ A:2+3=\n[sum1]
+ .nr sum2 (\n((x + \n[[y])
+ B:2+3=\n[sum2]
+ .nr sum3 (\n[(x] + \n([y)
+ C:2+3=\n[sum3]
+ => A:2+3=1 B:2+3=5 C:2+3=5
+
+An identifier with a closing bracket (']') in its name can't be accessed
+with bracket-form escape sequences that expect an identifier as a
+parameter. For example, '\[foo]]' accesses the glyph 'foo', followed by
+']' in whatever the surrounding context is, whereas '\C'foo]'' formats a
+glyph named 'foo]'. Similarly, the identifier '(' can't be interpolated
+_except_ with bracket forms.
+
+ If you begin a macro, string, or diversion name with either of the
+characters '[' or ']', you foreclose use of the 'grefer' preprocessor,
+which recognizes '.[' and '.]' as bibliographic reference delimiters.
+
+ -- Escape sequence: \A'anything'
+ Interpolate 1 if ANYTHING is a valid identifier, and 0 otherwise.
+ The delimiter need not be a neutral apostrophe; see *note
+ Delimiters::. Because invalid input characters are removed (see
+ above), invalid identifiers are empty or contain spaces, tabs, or
+ newlines.
+
+ You can employ '\A' to validate a macro argument before using it to
+ construct another escape sequence or identifier.
+
+ .\" usage: .init-coordinate-pair name val1 val2
+ .\" Create a coordinate pair where name!x=val1 and
+ .\" name!y=val2.
+ .de init-coordinate-pair
+ . if \A'\\$1' \{\
+ . if \B'\\$2' .nr \\$1!x \\$2
+ . if \B'\\$3' .nr \\$1!y \\$3
+ . \}
+ ..
+ .init-coordinate-pair center 5 10
+ The center is at (\n[center!x], \n[center!y]).
+ .init-coordinate-pair "poi->nt" trash garbage \" ignored
+ .init-coordinate-pair point trash garbage \" ignored
+ => The center is at (5, 10).
+
+ In this example, we also validated the numeric arguments; the
+ registers 'point!x' and 'point!y' remain undefined. *Note Numeric
+ Expressions:: for the '\B' escape sequence.
+
+ How GNU 'troff' handles the interpretation of an undefined identifier
+depends on the context. There is no way to invoke an undefined request;
+such syntax is interpreted as a macro call instead. If the identifier
+is interpreted as a string, macro, or diversion, GNU 'troff' emits a
+warning in category 'mac', defines it as empty, and interpolates
+nothing. If the identifier is interpreted as a register, GNU 'troff'
+emits a warning in category 'reg', initializes it to zero, and
+interpolates that value. *Note Warnings::, *note Interpolating
+Registers::, and *note Strings::. Attempting to use an undefined
+typeface, special character, color, character class, environment, or
+stream generally provokes an error diagnostic.
+
+ Identifiers for requests, macros, strings, and diversions share one
+name space; special characters and character classes another. No other
+object types do.
+
+ .de xxx
+ . nop foo
+ ..
+ .di xxx
+ bar
+ .br
+ .di
+ .
+ .xxx
+ => bar
+
+The foregoing example shows that GNU 'troff' reuses the identifier
+'xxx', changing it from a macro to a diversion. No warning is emitted,
+and the previous contents of 'xxx' are lost.
+
+
+File: groff.info, Node: Identifiers-Footnotes, Up: Identifiers
+
+ (1) Historically, control characters like ASCII STX, ETX, and BEL
+(<Control+B>, <Control+C>, and <Control+G>) have been observed in 'roff'
+documents, particularly in macro packages employing them as delimiters
+with the output comparison operator to try to avoid collisions with the
+content of arbitrary user-supplied parameters (*note Operators in
+Conditionals::). We discourage this expedient; in GNU 'troff' it is
+unnecessary (outside of compatibility mode) because delimited arguments
+are parsed at a different input level than the surrounding context.
+*Note Implementation Differences::.
+
+ (2) Consider what happens when a C1 control '0x80'-'0x9F' is
+necessary as a continuation byte in a UTF-8 sequence.
+
+
+File: groff.info, Node: Formatter Instructions, Next: Registers, Prev: Identifiers, Up: GNU troff Reference
+
+5.6 Formatter Instructions
+==========================
+
+To support documents that require more than filling, automatic line
+breaking and hyphenation, adjustment, and supplemental inter-sentence
+space, the 'roff' language offers two means of embedding instructions to
+the formatter.
+
+ One is a "request", which begins with a control character and takes
+up the remainder of the input line. Requests often perform relatively
+large-scale operations such as setting the page length, breaking the
+line, or starting a new page. They also conduct internal operations
+like defining macros.
+
+ The other is an "escape sequence", which begins with the escape
+character and can be embedded anywhere in the input, even in arguments
+to requests and other escape sequences. Escape sequences interpolate
+special characters, strings, or registers, and handle comparatively
+minor formatting tasks like sub- and superscripting.
+
+ Some operations, such as font selection and type size alteration, are
+available via both requests and escape sequences.
+
+* Menu:
+
+* Control Characters::
+* Invoking Requests::
+* Calling Macros::
+* Using Escape Sequences::
+* Delimiters::
+
+
+File: groff.info, Node: Control Characters, Next: Invoking Requests, Prev: Formatter Instructions, Up: Formatter Instructions
+
+5.6.1 Control Characters
+------------------------
+
+The mechanism of using 'roff''s control characters to invoke requests
+and call macros was introduced in *note Requests and Macros::. Control
+characters are recognized only at the beginning of an input line, or at
+the beginning of the branch of a control structure request; see *note
+Conditionals and Loops::.
+
+ A few requests cause a break implicitly; use the no-break control
+character to prevent the break. Break suppression is its sole
+behavioral distinction. Employing the no-break control character to
+invoke requests that don't cause breaks is harmless but poor style.
+*Note Manipulating Filling and Adjustment::.
+
+ The control '.' and no-break control ''' characters can each be
+changed to any ordinary character(1) (*note Control
+Characters-Footnote-1::) with the 'cc' and 'c2' requests, respectively.
+
+ -- Request: .cc [o]
+ Recognize the ordinary character O as the control character. If O
+ is absent or invalid, the default control character '.' is
+ selected. The identity of the control character is associated with
+ the environment (*note Environments::).
+
+ -- Request: .c2 [o]
+ Recognize the ordinary character O as the no-break control
+ character. If O is absent or invalid, the default no-break control
+ character ''' is selected. The identity of the no-break control
+ character is associated with the environment (*note
+ Environments::).
+
+ When writing a macro, you might wish to know which control character
+was used to call it.
+
+ -- Register: \n[.br]
+ This read-only register interpolates 1 if the currently executing
+ macro was called using the normal control character and 0
+ otherwise. If a macro is interpolated as a string, the '.br'
+ register's value is inherited from the context of the string
+ interpolation. *Note Strings::.
+
+ Use this register to reliably intercept requests that imply breaks.
+
+ .als bp*orig bp
+ .de bp
+ . ie \\n[.br] .bp*orig
+ . el 'bp*orig
+ ..
+
+ Testing the '.br' register outside of a macro definition makes no
+ sense.
+
+
+File: groff.info, Node: Control Characters-Footnotes, Up: Control Characters
+
+ (1) Recall *note Identifiers::.
+
+
+File: groff.info, Node: Invoking Requests, Next: Calling Macros, Prev: Control Characters, Up: Formatter Instructions
+
+5.6.2 Invoking Requests
+-----------------------
+
+A control character is optionally followed by tabs and/or spaces and
+then an identifier naming a request or macro. The invocation of an
+unrecognized request is interpreted as a macro call. Defining a macro
+with the same name as a request replaces the request. Deleting a
+request name with the 'rm' request makes it unavailable. The 'als'
+request can alias requests, permitting them to be wrapped or
+non-destructively replaced. *Note Strings::.
+
+ There is no inherent limit on argument length or quantity. Most
+requests take one or more arguments, and ignore any they do not expect.
+A request may be separated from its arguments by tabs or spaces, but
+only spaces can separate an argument from its successor. Only one
+between arguments is necessary; any excess is ignored. GNU 'troff' does
+not allow tabs for argument separation.(1) (*note Invoking
+Requests-Footnote-1::)
+
+ Generally, a space _within_ a request argument is not relevant, not
+meaningful, or is supported by bespoke provisions, as with the 'tl'
+request's delimiters (*note Page Layout::). Some requests, like 'ds',
+interpret the remainder of the control line as a single argument. *Note
+Strings::.
+
+ Spaces and tabs immediately after a control character are ignored.
+Commonly, authors structure the source of documents or macro files with
+them.
+
+ .de center
+ . if \\n[.br] \
+ . br
+ . ce \\$1
+ ..
+ .
+ .
+ .de right-align
+ .->if \\n[.br] \
+ .->->br
+ .->rj \\$1
+ ..
+
+ If you assign an empty blank line trap, you can separate macro
+definitions (or any input lines) with blank lines.
+
+ .de do-nothing
+ ..
+ .blm do-nothing \" activate blank line trap
+
+ .de center
+ . if \\n[.br] \
+ . br
+ . ce \\$1
+ ..
+
+
+ .de right-align
+ .->if \\n[.br] \
+ .->->br
+ .->rj \\$1
+ ..
+
+ .blm \" deactivate blank line trap
+
+ *Note Blank Line Traps::.
+
+
+File: groff.info, Node: Invoking Requests-Footnotes, Up: Invoking Requests
+
+ (1) In compatibility mode, a space is not necessary after a request
+or macro name of two characters' length. Also, Plan 9 'troff' allows
+tabs to separate arguments.
+
+
+File: groff.info, Node: Calling Macros, Next: Using Escape Sequences, Prev: Invoking Requests, Up: Formatter Instructions
+
+5.6.3 Calling Macros
+--------------------
+
+If a macro of the desired name does not exist when called, it is
+created, assigned an empty definition, and a warning in category 'mac'
+is emitted. Calling an undefined macro _does_ end a macro definition
+naming it as its end macro (*note Writing Macros::).
+
+ To embed spaces _within_ a macro argument, enclose the argument in
+neutral double quotes '"'. Horizontal motion escape sequences are
+sometimes a better choice for arguments to be formatted as text.
+
+ Consider calls to a hypothetical section heading macro 'uh'.
+
+ .uh The Mouse Problem
+ .uh "The Mouse Problem"
+ .uh The\~Mouse\~Problem
+ .uh The\ Mouse\ Problem
+
+The first line calls 'uh' with three arguments: 'The', 'Mouse', and
+'Problem'. The remainder call the 'uh' macro with one argument, 'The
+Mouse Problem'. The last solution, using escaped spaces, can be found
+in documents prepared for AT&T 'troff'. It can cause surprise when text
+is adjusted, because '\<SP>' inserts a _fixed-width_, non-breaking
+space. GNU 'troff''s '\~' escape sequence inserts an adjustable,
+non-breaking space.(1) (*note Calling Macros-Footnote-1::)
+
+ The foregoing raises the question of how to embed neutral double
+quotes or backslashes in macro arguments when _those_ characters are
+desired as literals. In GNU 'troff', the special character escape
+sequence '\[rs]' produces a backslash and '\[dq]' a neutral double
+quote.
+
+ In GNU 'troff''s AT&T compatibility mode, these characters remain
+available as '\(rs' and '\(dq', respectively. AT&T 'troff' did not
+consistently define these special characters, but its descendants can be
+made to support them. *Note Device and Font Description Files::.
+
+ If even that is not feasible, options remain. To obtain a literal
+escape character in a macro argument, you can simply type it if you
+change or disable the escape character first. *Note Using Escape
+Sequences::. Otherwise, you must escape the escape character repeatedly
+to a context-dependent extent. *Note Copy Mode::.
+
+ For the (neutral) double quote, you have recourse to an obscure
+syntactical feature of AT&T 'troff'. Because a double quote can begin a
+macro argument, the formatter keeps track of whether the current
+argument was started thus, and doesn't require a space after the double
+quote that ends it.(2) (*note Calling Macros-Footnote-2::) In the
+argument list to a macro, a double quote that _isn't_ preceded by a
+space _doesn't_ start a macro argument. If not preceded by a double
+quote that began an argument, this double quote becomes part of the
+argument. Furthermore, within a quoted argument, a pair of adjacent
+double quotes becomes a literal double quote.
+
+ .de eq
+ . tm arg1:\\$1 arg2:\\$2 arg3:\\$3
+ . tm arg4:\\$4 arg5:\\$5 arg6:\\$6
+ .. \" 4 backslashes on the next line
+ .eq a" "b c" "de"f\\\\g" h""i "j""k"
+ error-> arg1:a" arg2:b c arg3:de
+ error-> arg4:f\g" arg5:h""i arg6:j"k
+
+ Apart from the complexity of the rules, this traditional solution has
+the disadvantage that double quotes don't survive repeated argument
+expansion in AT&T 'troff' or GNU 'troff''s compatibility mode. This can
+frustrate efforts to pass such arguments intact through multiple macro
+calls.
+
+ .cp 1
+ .de eq
+ . tm arg1:\\$1 arg2:\\$2 arg3:\\$3
+ . tm arg4:\\$4 arg5:\\$5 arg6:\\$6
+ ..
+ .de xe
+ . eq \\$1 \\$2 \\$3 \\$4 \\$5 \\$6
+ .. \" 8 backslashes on the next line
+ .xe a" "b c" "de"f\\\\\\\\g" h""i "j""k"
+ error-> arg1:a" arg2:b arg3:c
+ error-> arg4:de arg5:f\g" arg6:h""i
+
+ Outside of compatibility mode, GNU 'troff' doesn't exhibit this
+problem because it tracks the nesting depth of interpolations. *Note
+Implementation Differences::.
+
+
+File: groff.info, Node: Calling Macros-Footnotes, Up: Calling Macros
+
+ (1) '\~' is fairly portable; see *note Other Differences::.
+
+ (2) Strictly, you can neglect to close the last quoted macro
+argument, relying on the end of the control line to do so. We consider
+this lethargic practice poor style.
+
+
+File: groff.info, Node: Using Escape Sequences, Next: Delimiters, Prev: Calling Macros, Up: Formatter Instructions
+
+5.6.4 Using Escape Sequences
+----------------------------
+
+Whereas requests must occur on control lines, escape sequences can occur
+intermixed with text and may appear in arguments to requests, macros,
+and other escape sequences. An escape sequence is introduced by the
+escape character, a backslash '\' (but see the 'ec' request below). The
+next character selects the escape's function.
+
+ Escape sequences vary in length. Some take an argument, and of
+those, some have different syntactical forms for a one-character,
+two-character, or arbitrary-length argument. Others accept _only_ an
+arbitrary-length argument. In the former scheme, a one-character
+argument follows the function character immediately, an opening
+parenthesis '(' introduces a two-character argument (no closing
+parenthesis is used), and an argument of arbitrary length is enclosed in
+brackets '[]'. In the latter scheme, the user selects a delimiter
+character. A few escape sequences are idiosyncratic, and support both
+of the foregoing conventions ('\s'), designate their own termination
+sequence ('\?'), consume input until the next newline ('\!', '\"',
+'\#'), or support an additional modifier character ('\s' again, and
+'\n'). As with requests, use of some escape sequences in source
+documents may interact poorly with a macro package you use; consult its
+documentation to learn of "safe" sequences or alternative facilities it
+provides to achieve the desired result.
+
+ If an escape character is followed by a character that does not
+identify a defined operation, the escape character is ignored (producing
+a diagnostic of the 'escape' warning category, which is not enabled by
+default) and the following character is processed normally.
+
+ $ groff -Tps -ww
+ .nr N 12
+ .ds co white
+ .ds animal elephant
+ I have \fI\nN \*(co \*[animal]s,\f[]
+ said \P.\&\~Pseudo Pachyderm.
+ error-> warning: escape character ignored before 'P'
+ => I have 12 white elephants, said P. Pseudo Pachyderm.
+
+ Escape sequence interpolation is of higher precedence than escape
+sequence argument interpretation. This rule affords flexibility in
+using escape sequences to construct parameters to other escape
+sequences.
+
+ .ds family C\" Courier
+ .ds style I\" oblique
+ Choice a typeface \f(\*[family]\*[style]wisely.
+ => Choose a typeface wisely.
+
+In the above, the syntax form '\f(' accepts only two characters for an
+argument; the example works because the subsequent escape sequences are
+interpolated before the selection escape sequence argument is processed,
+and strings 'family' and 'style' interpolate one character each.(1)
+(*note Using Escape Sequences-Footnote-1::)
+
+ The escape character is nearly always interpreted when encountered;
+it is therefore desirable to have a way to interpolate it, disable it,
+or change it.
+
+ -- Escape sequence: \e
+ Interpolate the escape character.
+
+ The '\[rs]' special character escape sequence formats a backslash
+glyph. In macro and string definitions, the input sequences '\\' and
+'\E' defer interpretation of escape sequences. *Note Copy Mode::.
+
+ -- Request: .eo
+ Disable the escape mechanism except in copy mode. Once this
+ request is invoked, no input character is recognized as starting an
+ escape sequence in interpretation mode.
+
+ -- Request: .ec [o]
+ Recognize the ordinary character O as the escape character. If O
+ is absent or invalid, the default escape character '\' is selected.
+
+ Switching escape sequence interpretation off to define a macro and
+back on afterward can obviate the need to double the escape character
+within the definition. *Note Writing Macros::. This technique is not
+available if your macro needs to interpolate values at the time it is
+_defined_--but many do not.
+
+ .\" simplified `BR` macro from the man(7) macro package
+ .eo
+ .de BR
+ . ds result \&
+ . while (\n[.$] >= 2) \{\
+ . as result \fB\$1\fR\$2\"
+ . shift 2
+ . \}
+ . if \n[.$] .as result \fB\$1\"
+ \*[result]
+ . rm result
+ . ft R
+ ..
+ .ec
+
+ -- Request: .ecs
+ -- Request: .ecr
+ The 'ecs' request stores the escape character for recall with
+ 'ecr'. 'ecr' sets the escape character to '\' if none has been
+ saved.
+
+ Use these requests together to temporarily change the escape
+ character.
+
+ Using a different escape character, or disabling it, when calling
+macros not under your control will likely cause errors, since GNU
+'troff' has no mechanism to "intern" macros--that is, to convert a macro
+definition into a form independent of its representation.(2) (*note
+Using Escape Sequences-Footnote-2::) When a macro is called, its
+contents are interpreted literally.
+
+
+File: groff.info, Node: Using Escape Sequences-Footnotes, Up: Using Escape Sequences
+
+ (1) The omission of spaces before the comment escape sequences is
+necessary; see *note Strings::.
+
+ (2) TeX does have such a mechanism.
+
+
+File: groff.info, Node: Delimiters, Prev: Using Escape Sequences, Up: Formatter Instructions
+
+5.6.5 Delimiters
+----------------
+
+Some escape sequences that require parameters use delimiters. The
+neutral apostrophe ''' is a popular choice and shown in this document.
+The neutral double quote '"' is also commonly seen. Letters, numerals,
+and leaders can be used. Punctuation characters are likely better
+choices, except for those defined as infix operators in numeric
+expressions; see below.
+
+ \l'1.5i\[bu]' \" draw 1.5 inches of bullet glyphs
+
+ The following escape sequences don't take arguments and thus are
+allowed as delimiters: '\<SP>', '\%', '\|', '\^', '\{', '\}', '\'',
+'\`', '\-', '\_', '\!', '\?', '\)', '\/', '\,', '\&', '\:', '\~', '\0',
+'\a', '\c', '\d', '\e', '\E', '\p', '\r', '\t', and '\u'. However,
+using them this way is discouraged; they can make the input confusing to
+read.
+
+ A few escape sequences, '\A', '\b', '\o', '\w', '\X', and '\Z',
+accept a newline as a delimiter. Newlines that serve as delimiters
+continue to be recognized as input line terminators.
+
+ A caf\o
+ e\(aa
+ in Paris
+ => A café in Paris
+
+Use of newlines as delimiters in escape sequences is also discouraged.
+
+ Finally, the escape sequences '\D', '\h', '\H', '\l', '\L', '\N',
+'\R', '\s', '\S', '\v', and '\x' prohibit many delimiters.
+
+ * the numerals '0'-'9' and the decimal point '.'
+
+ * the (single-character) operators '+-/*%<>=&:()'
+
+ * the space and tab characters
+
+ * any escape sequences other than '\%', '\:', '\{', '\}', '\'', '\`',
+ '\-', '\_', '\!', '\/', '\c', '\e', and '\p'
+
+ Delimiter syntax is complex and flexible primarily for historical
+reasons; the foregoing restrictions need be kept in mind mainly when
+using 'groff' in AT&T compatibility mode. GNU 'troff' keeps track of
+the nesting depth of escape sequence interpolations, so the only
+characters you need to avoid using as delimiters are those that appear
+in the arguments you input, not any that result from interpolation.
+Typically, ''' works fine. *Note Implementation Differences::.
+
+ $ groff -Tps
+ .de Mw
+ . nr wd \w'\\$1'
+ . tm "\\$1" is \\n(wd units wide.
+ ..
+ .Mw Wet'suwet'en
+ .Mw Wet+200i
+ .cp 1 \" turn on compatibility mode
+ .Mw Wet'suwet'en
+ .Mw Wet'
+ .Mw Wet+200i
+ error-> "Wet'suwet'en" is 54740 units wide.
+ error-> "Wet'+200i" is 42610 units wide.
+ error-> "Wet'suwet'en" is 15860 units wide.
+ error-> "Wet'" is 15860 units wide.
+ error-> "Wet'+200i" is 14415860 units wide.
+
+ We see here that in compatibility mode, the part of the argument
+after the ''' delimiter escapes from its context and, if nefariously
+crafted, influences the computation of the WD register's value in a
+surprising way.
+
+
+File: groff.info, Node: Comments, Next: Registers, Prev: Formatter Instructions, Up: GNU troff Reference
+
+5.7 Comments
+============
+
+One of the most common forms of escape sequence is the comment.(1)
+(*note Comments-Footnote-1::)
+
+ -- Escape sequence: \"
+ Start a comment. Everything up to the next newline is ignored.
+
+ This may sound simple, but it can be tricky to keep the comments
+ from interfering with the appearance of the output. If the escape
+ sequence is to the right of some text or a request, that portion of
+ the line is ignored, but spaces preceding it are processed normally
+ by GNU 'troff'. This affects only the 'ds' and 'as' requests and
+ their variants.
+
+ One possibly irritating idiosyncrasy is that tabs should not be
+ used to vertically align comments in the source document. Tab
+ characters are not treated as separators between a request name and
+ its first argument, nor between arguments.
+
+ A comment on a line by itself is treated as a blank line, because
+ after eliminating the comment, that is all that remains.
+
+ Test
+ \" comment
+ Test
+ => Test
+ =>
+ => Test
+
+ To avoid this, it is common to combine the empty request with the
+ comment escape sequence as '.\"', causing the input line to be
+ ignored.
+
+ Another commenting scheme sometimes seen is three consecutive
+ single quotes (''''') at the beginning of a line. This works, but
+ GNU 'troff' emits a warning diagnostic (if enabled) about an
+ undefined macro (namely '''').
+
+ -- Escape sequence: \#
+ Start a comment; everything up to and including the next newline is
+ ignored. This 'groff' extension was introduced to avoid the
+ problems described above.
+
+ Test
+ \# comment
+ Test
+ => Test Test
+
+ -- Request: .ig [end]
+ Ignore input until, in the current conditional block (if any),(2)
+ (*note Comments-Footnote-2::) the macro END is called at the start
+ of a control line, or the control line '..' is encountered if END
+ is not specified. 'ig' is parsed as if it were a macro definition,
+ but its contents are discarded, not stored.(3) (*note
+ Comments-Footnote-3::)
+
+ hand\c
+ .de TX
+ fasting
+ ..
+ .ig TX
+ This is part of a large block of input that has been
+ temporarily(?) commented out.
+ We can restore it simply by removing the .ig request and
+ the call of its end macro.
+ .TX
+ => handfasting
+
+
+File: groff.info, Node: Comments-Footnotes, Up: Comments
+
+ (1) This claim may be more aspirational than descriptive.
+
+ (2) *Note Conditional Blocks::.
+
+ (3) Exception: auto-incrementing registers defined outside the
+ignored region _will_ be modified if interpolated with '\n±' inside it.
+*Note Auto-increment::.
+
+
+File: groff.info, Node: Registers, Next: Manipulating Filling and Adjustment, Prev: Formatter Instructions, Up: GNU troff Reference
+
+5.8 Registers
+=============
+
+In the 'roff' language, numbers can be stored in "registers". Many
+built-in registers exist, supplying anything from the date to details of
+formatting parameters. You can also define your own. *Note
+Identifiers::, for information on constructing a valid name for a
+register.
+
+* Menu:
+
+* Setting Registers::
+* Interpolating Registers::
+* Auto-increment::
+* Assigning Register Formats::
+* Built-in Registers::
+
+
+File: groff.info, Node: Setting Registers, Next: Interpolating Registers, Prev: Registers, Up: Registers
+
+5.8.1 Setting Registers
+-----------------------
+
+Define registers and update their values with the 'nr' request or the
+'\R' escape sequence.
+
+ -- Request: .nr ident value
+ -- Escape sequence: \R'ident value'
+ Set register IDENT to VALUE. If IDENT doesn't exist, GNU 'troff'
+ creates it. In the '\R' escape sequence, the delimiter need not be
+ a neutral apostrophe; see *note Delimiters::. It also does not
+ produce an input token in GNU 'troff'. *Note Gtroff Internals::.
+
+ .nr a (((17 + (3 * 4))) % 4)
+ \n[a]
+ .\R'a (((17 + (3 * 4))) % 4)'
+ \n[a]
+ => 1 1
+
+ (Later, we will discuss additional forms of 'nr' and '\R' that can
+ change a register's value after it is dereferenced but before it is
+ interpolated. *Note Auto-increment::.)
+
+ The complete transparency of '\R' can cause surprising effects if
+ you use registers like '.k', which get evaluated at the time they
+ are accessed.
+
+ .ll 1.6i
+ .
+ aaa bbb ccc ddd eee fff ggg hhh\R':k \n[.k]'
+ .tm :k == \n[:k]
+ => :k == 126950
+ .
+ .br
+ .
+ aaa bbb ccc ddd eee fff ggg hhh\h'0'\R':k \n[.k]'
+ .tm :k == \n[:k]
+ => :k == 15000
+
+ If you process this with the PostScript device ('-Tps'), there will
+ be a line break eventually after 'ggg' in both input lines.
+ However, after processing the space after 'ggg', the partially
+ collected line is not overfull yet, so GNU 'troff' continues to
+ collect input until it sees the space (or in this case, the
+ newline) after 'hhh'. At this point, the line is longer than the
+ line length, and the line gets broken.
+
+ In the first input line, since the '\R' escape sequence leaves no
+ traces, the check for the overfull line hasn't been done yet at the
+ point where '\R' gets handled, and you get a value for the '.k'
+ register that is even greater than the current line length.
+
+ In the second input line, the insertion of '\h'0'' to cause a
+ zero-width motion forces GNU 'troff' to check the line length,
+ which in turn causes the start of a new output line. Now '.k'
+ returns the expected value.
+
+ 'nr' and '\R' each have two additional special forms to increment or
+decrement a register.
+
+ -- Request: .nr ident +value
+ -- Request: .nr ident -value
+ -- Escape sequence: \R'ident +value'
+ -- Escape sequence: \R'ident -value'
+ Increment (decrement) register IDENT by VALUE. In the '\R' escape
+ sequence, the delimiter need not be a neutral apostrophe; see *note
+ Delimiters::.
+
+ .nr a 1
+ .nr a +1
+ \na
+ => 2
+
+ A leading minus sign in VALUE is always interpreted as a
+ decrementation operator, not an algebraic sign. To assign a
+ register a negative value or the negated value of another register,
+ you can force GNU 'troff' to interpret '-' as a negation or minus,
+ rather than decrementation, operator: enclose it with its operand
+ in parentheses or subtract it from zero.
+
+ .nr a 7
+ .nr b 3
+ .nr a -\nb
+ \na
+ => 4
+ .nr a (-\nb)
+ \na
+ => -3
+ .nr a 0-\nb
+ \na
+ => -3
+
+ If a register's prior value does not exist (the register was
+ undefined), an increment or decrement is applied as if to 0.
+
+ -- Request: .rr ident
+ Remove register IDENT. If IDENT doesn't exist, the request is
+ ignored. Technically, only the name is removed; the register's
+ contents are still accessible under aliases created with 'aln', if
+ any.
+
+ -- Request: .rnn ident1 ident2
+ Rename register IDENT1 to IDENT2. If IDENT1 doesn't exist, the
+ request is ignored. Renaming a built-in register does not
+ otherwise alter its properties.
+
+ -- Request: .aln new old
+ Create an alias NEW for an existing register OLD, causing the names
+ to refer to the same stored object. If OLD is undefined, a warning
+ in category 'reg' is produced and the request is ignored. *Note
+ Warnings::, for information about the enablement and suppression of
+ warnings.
+
+ To remove a register alias, invoke 'rr' on its name. A register's
+ contents do not become inaccessible until it has no more names.
+
+
+File: groff.info, Node: Interpolating Registers, Next: Auto-increment, Prev: Setting Registers, Up: Registers
+
+5.8.2 Interpolating Registers
+-----------------------------
+
+Register contents are interpolated with the '\n' escape sequence.
+
+ -- Escape sequence: \ni
+ -- Escape sequence: \n(id
+ -- Escape sequence: \n[ident]
+ Interpolate register with name IDENT (one-character name I,
+ two-character name ID). '\n' is interpreted even in copy mode
+ (*note Copy Mode::). If the register is undefined, it is created
+ and assigned a value of '0', that value is interpolated, and a
+ warning in category 'reg' is emitted. *Note Warnings::, for
+ information about the enablement and suppression of warnings.
+
+ .nr a 5
+ .nr as \na+\na
+ \n(as
+ => 10
+
+ .nr a1 5
+ .nr ab 6
+ .ds str b
+ .ds num 1
+ \n[a\n[num]]
+ => 5
+ \n[a\*[str]]
+ => 6
+
+
+File: groff.info, Node: Auto-increment, Next: Assigning Register Formats, Prev: Interpolating Registers, Up: Registers
+
+5.8.3 Auto-increment
+--------------------
+
+Registers can also be incremented or decremented by a configured amount
+at the time they are interpolated. The value of the increment is
+specified with a third argument to the 'nr' request, and a special
+interpolation syntax is used to alter and then retrieve the register's
+value. Together, these features are called "auto-increment".(1) (*note
+Auto-increment-Footnote-1::)
+
+ -- Request: .nr ident value incr
+ Set register IDENT to VALUE and its auto-incrementation amount to
+ to INCR. The '\R' escape sequence doesn't support an INCR
+ argument.
+
+ Auto-incrementation is not _completely_ automatic; the '\n' escape
+sequence in its basic form never alters the value of a register. To
+apply auto-incrementation to a register, interpolate it with '\n±'.
+
+ -- Escape sequence: \n+i
+ -- Escape sequence: \n-i
+ -- Escape sequence: \n+(id
+ -- Escape sequence: \n-(id
+ -- Escape sequence: \n+[ident]
+ -- Escape sequence: \n-[ident]
+ Increment or decrement IDENT (one-character name I, two-character
+ name ID) by the register's auto-incrementation value and then
+ interpolate the new register value. If IDENT has no
+ auto-incrementation value, interpolate as with '\n'.
+
+ .nr a 0 1
+ .nr xx 0 5
+ .nr foo 0 -2
+ \n+a, \n+a, \n+a, \n+a, \n+a
+ .br
+ \n-(xx, \n-(xx, \n-(xx, \n-(xx, \n-(xx
+ .br
+ \n+[foo], \n+[foo], \n+[foo], \n+[foo], \n+[foo]
+ => 1, 2, 3, 4, 5
+ => -5, -10, -15, -20, -25
+ => -2, -4, -6, -8, -10
+
+ To change the increment value without changing the value of a
+register, assign the register's value to itself by interpolating it, and
+specify the desired increment normally. Apply an increment of '0' to
+disable auto-incrementation of the register.
+
+
+File: groff.info, Node: Auto-increment-Footnotes, Up: Auto-increment
+
+ (1) A negative auto-increment can be considered an "auto-decrement".
+
+
+File: groff.info, Node: Assigning Register Formats, Next: Built-in Registers, Prev: Auto-increment, Up: Registers
+
+5.8.4 Assigning Register Formats
+--------------------------------
+
+A writable register's value can be interpolated in several number
+formats. By default, conventional Arabic numerals are used. Other
+formats see use in sectioning and outlining schemes and alternative page
+numbering arrangements.
+
+ -- Request: .af reg fmt
+ Use number format FMT when interpolating register REG. Valid
+ number formats are as follows.
+
+ '0...'
+ Arabic numerals 0, 1, 2, and so on. Any decimal digit is
+ equivalent to '0'; the formatter merely counts the digits
+ specified. Multiple Arabic numerals in FMT cause
+ interpolations to be zero-padded on the left if necessary to
+ at least as many digits as specified (interpolations never
+ truncate a register value). A register with format '00'
+ interpolates values 1, 2, 3 as '01', '02', '03'. The default
+ format for all writable registers is '0'.
+
+ 'I'
+ Uppercase Roman numerals: 0, I, II, III, IV, ...
+
+ 'i'
+ Lowercase Roman numerals: 0, i, ii, iii, iv, ...
+
+ 'A'
+ Uppercase letters: 0, A, B, C, ..., Z, AA, AB, ...
+
+ 'a'
+ Lowercase letters: 0, a, b, c, ..., z, aa, ab, ...
+
+ Omitting FMT causes a warning in category 'missing'. *Note
+ Warnings::, for information about the enablement and suppression of
+ warnings. Specifying an unrecognized format is an error.
+
+ Zero values are interpolated as '0' in non-Arabic formats.
+ Negative quantities are prefixed with '-' irrespective of format.
+ In Arabic formats, the sign supplements the field width. If REG
+ doesn't exist, it is created with a zero value.
+
+ .nr a 10
+ .af a 0 \" the default format
+ \na,
+ .af a I
+ \na,
+ .af a 321
+ .nr a (-\na)
+ \na,
+ .af a a
+ \na
+ => 10, X, -010, -j
+
+ The representable extrema in the 'i' and 'I' formats correspond to
+ Arabic ±39,999. GNU 'troff' uses 'w' and 'z' to represent 5,000
+ and 10,000 in Roman numerals, respectively, following the
+ convention of AT&T 'troff'--currently, the correct glyphs for Roman
+ numerals five thousand ('U+2181') and ten thousand ('U+2182') are
+ not used.
+
+ Assigning the format of a read-only register is an error. Instead,
+ copy the read-only register's value to, and assign the format of, a
+ writable register.
+
+ -- Escape sequence: \gr
+ -- Escape sequence: \g(rg
+ -- Escape sequence: \g[reg]
+ Interpolate the format of the register REG (one-character name R,
+ two-character name RG). Zeroes represent Arabic formats. If REG
+ is not defined, REG is not created and nothing is interpolated.
+ '\g' is interpreted even in copy mode (*note Copy Mode::).
+
+ GNU 'troff' interprets only Arabic numerals. The Roman numeral or
+alphabetic formats cannot be used as operands to arithmetic operators in
+expressions (*note Numeric Expressions::). For instance, it may be
+desirable to test the page number independently of its format.
+
+ .af % i \" front matter
+ .de header-trap
+ . \" To test the page number, we need it in Arabic.
+ . ds saved-page-number-format \\g%\"
+ . af % 0
+ . nr page-number-in-decimal \\n%
+ . af % \\*[saved-page-number-format]
+ . ie \\n[page-number-in-decimal]=1 .do-first-page-stuff
+ . el \{\
+ . ie o .do-odd-numbered-page-stuff
+ . el .do-even-numbered-page-stuff
+ . \}
+ . rm saved-page-number-format
+ ..
+ .wh 0 header-trap
+
+
+File: groff.info, Node: Built-in Registers, Prev: Assigning Register Formats, Up: Registers
+
+5.8.5 Built-in Registers
+------------------------
+
+Predefined registers whose identifiers start with a dot are read-only.
+Many are Boolean-valued, interpolating a true or false value testable
+with the 'if', 'ie', or 'while' requests. Some read-only registers are
+string-valued, meaning that they interpolate text.
+
+ *Caution:* Built-in registers are subject to removal like others;
+once removed, they can be recreated only as normal writable registers
+and will not reflect formatter state.
+
+ A register name (without the dot) is often associated with a request
+of the same name. A complete listing of all built-in registers can be
+found in *note Register Index::.
+
+ We present here a few built-in registers that are not described
+elsewhere in this manual; they have to do with invariant properties of
+GNU 'troff', or obtain information about the formatter's command-line
+options, processing progress, or the operating environment.
+
+'\n[.A]'
+ Approximate output is being formatted (Boolean-valued); see 'groff'
+ '-a' option (*note Groff Options::).
+
+'\n[.c]'
+'\n[c.]'
+ Input line number. 'c.' is a writable synonym, affecting
+ subsequent interpolations of both '.c' and 'c.'.
+
+'\n[.F]'
+ Name of input file (string-valued).
+
+'\n[.g]'
+ Always true in GNU 'troff' (Boolean-valued). Documents can use
+ this to ask the formatter if it claims 'groff' compatibility.
+
+'\n[.P]'
+ Output page selection status (Boolean-valued); see 'groff' '-o'
+ option (*note Groff Options::).
+
+'\n[.R]'
+ Count of available unused registers; always 10,000 in GNU
+ 'troff'.(1) (*note Built-in Registers-Footnote-1::)
+
+'\n[.T]'
+ Indicator of output device selection (Boolean-valued); see 'groff'
+ '-T' option (*note Groff Options::).
+
+'\n[.U]'
+ Unsafe mode enablement status (Boolean-valued); see 'groff' '-U'
+ option (*note Groff Options::).
+
+'\n[.x]'
+ Major version number of the running GNU 'troff' formatter. For
+ example, if the version number is 1.23.0, then '.x' contains '1'.
+
+'\n[.y]'
+ Minor version number of the running GNU 'troff' formatter. For
+ example, if the version number is 1.23.0, then '.y' contains '23'.
+
+'\n[.Y]'
+ Revision number of the running GNU 'troff' formatter. For example,
+ if the version number is 1.23.0, then '.Y' contains '0'.
+
+'\n[$$]'
+ Process identifier (PID) of the GNU 'troff' program in its
+ operating environment.
+
+ Date- and time-related registers are set per the local time as
+determined by 'localtime(3)' when the formatter launches. This
+initialization can be overridden by 'SOURCE_DATE_EPOCH' and 'TZ'; see
+*note Environment::.
+
+'\n[seconds]'
+ Count of seconds elapsed in the minute (0-60).
+
+'\n[minutes]'
+ Count of minutes elapsed in the hour (0-59).
+
+'\n[hours]'
+ Count of hours elapsed since midnight (0-23).
+
+'\n[dw]'
+ Day of the week (1-7; 1 is Sunday).
+
+'\n[dy]'
+ Day of the month (1-31).
+
+'\n[mo]'
+ Month of the year (1-12).
+
+'\n[year]'
+ Gregorian year.
+
+'\n[yr]'
+ Gregorian year minus 1900. This register is incorrectly documented
+ in the AT&T 'troff' manual as storing the last two digits of the
+ current year. That claim stopped being true in 2000. Old 'troff'
+ input that looks like:
+
+ '\" The year number is a surprise after 1999.
+ This document was formatted in 19\n(yr.
+
+ can be corrected to:
+
+ This document was formatted in \n[year].
+
+ or, for portability across many 'roff' programs, to the following.
+
+ .nr y4 1900+\n(yr
+ This document was formatted in \n(y4.
+
+
+File: groff.info, Node: Built-in Registers-Footnotes, Up: Built-in Registers
+
+ (1) GNU 'troff' dynamically allocates memory for as many registers as
+required.
+
+
+File: groff.info, Node: Manipulating Filling and Adjustment, Next: Manipulating Hyphenation, Prev: Registers, Up: GNU troff Reference
+
+5.9 Manipulating Filling and Adjustment
+=======================================
+
+When an output line is pending (see below), a break moves the drawing
+position to the beginning of the next text baseline, interrupting
+filling. Various ways of causing breaks were shown in *note Breaking::.
+The 'br' request likewise causes a break. Several other requests imply
+breaks: 'bp', 'ce', 'cf', 'fi', 'fl', 'in', 'nf', 'rj', 'sp', 'ti', and
+'trf'. If the no-break control character is used with any of these
+requests, GNU 'troff' suppresses the break; instead the requested
+operation takes effect at the next break. ''br' does nothing.
+
+ .ll 55n
+ This line is normally filled and adjusted.
+ .br
+ A line's alignment is decided
+ 'ce \" Center the next input line (no break).
+ when it is output.
+ This line returns to normal filling and adjustment.
+ => This line is normally filled and adjusted.
+ => A line's alignment is decided when it is output.
+ => This line returns to normal filling and adjustment.
+
+Output line properties like page offset, indentation, adjustment, and
+even the location of its text baseline, are not determined until the
+line has been broken. An output line is said to be "pending" if some
+input has been collected but an output line corresponding to it has not
+yet been written; such an output line is also termed "partially
+collected". If no output line is pending, it is as if a break has
+already happened; additional breaks, whether explicit or implicit, have
+no effect. If the vertical drawing position is negative--as it is when
+the formatter starts up--a break starts a new page (even if no output
+line is pending) unless an end-of-input macro is being interpreted.
+*Note End-of-input Traps::.
+
+ -- Request: .br
+ Break the line: emit any pending output line without adjustment.
+
+ foo bar
+ .br
+ baz
+ 'br
+ qux
+ => foo bar
+ => baz qux
+
+ Sometimes you want to prevent a break within a phrase or between a
+quantity and its units.
+
+ -- Escape sequence: \~
+ Insert an unbreakable space that is adjustable like an ordinary
+ space. It is discarded from the end of an output line if a break
+ is forced.
+
+ Set the output speed to\~1.
+ There are 1,024\~bytes in 1\~KiB.
+ J.\~F.\~Ossanna wrote the original CSTR\~#54.
+
+ By default, GNU 'troff' fills text and adjusts it to reach the output
+line length. The 'nf' request disables filling; the 'fi' request
+reënables it.
+
+ -- Request: .fi
+ -- Register: \n[.u]
+ Enable filling of output lines; a pending output line is broken.
+ The read-only register '.u' is set to 1. The filling enablement
+ status, sometimes called "fill mode", is associated with the
+ environment (*note Environments::). *Note Line Continuation::, for
+ interaction with the '\c' escape sequence.
+
+ -- Request: .nf
+ Disable filling of output lines: the output line length (*note Line
+ Layout::) is ignored and output lines are broken where the input
+ lines are. A pending output line is broken and adjustment is
+ suppressed. The read-only register '.u' is set to 0. The filling
+ enablement status is associated with the environment (*note
+ Environments::). See *note Line Continuation::, for interaction
+ with the '\c' escape sequence.
+
+ -- Request: .ad [mode]
+ -- Register: \n[.j]
+ Enable output line adjustment in MODE, taking effect when the
+ pending (or next) output line is broken. Adjustment is suppressed
+ when filling is. MODE can have one of the following values.
+
+ 'b'
+ 'n'
+ Adjust "normally": if the output line does not consume the
+ distance between the indentation and the configured output
+ line length, GNU 'troff' stretches adjustable spaces within
+ the line until that length is reached. When the indentation
+ is zero, this mode spreads the line to both the left and right
+ margins. This is the GNU 'troff' default.
+
+ 'c'
+ Center filled text. Contrast with the 'ce' request, which
+ centers text _without_ filling it.
+
+ 'l'
+ Align text to the left without adjusting it.
+
+ 'r'
+ Align text to the right without adjusting it.
+
+ MODE can also be a value previously stored in the '.j' register.
+ Using 'ad' without an argument is the same as '.ad \n[.j]'; unless
+ filling is disabled, GNU 'troff' resumes adjusting lines in the
+ same way it did before adjustment was disabled by invocation of the
+ 'na' request.
+
+ The adjustment mode and enablement status are encoded in the
+ read-only register '.j'. These parameters are associated with the
+ environment (*note Environments::).
+
+ The value of '.j' for any adjustment mode is an implementation
+ detail and should not be relied upon as a programmer's interface.
+ Do not write logic to interpret or perform arithmetic on it.
+
+ .ll 48n
+ .de AD
+ . br
+ . ad \\$1
+ ..
+ .de NA
+ . br
+ . na
+ ..
+ left
+ .AD r
+ .nr ad \n(.j
+ right
+ .AD c
+ center
+ .NA
+ left
+ .AD
+ center
+ .AD \n(ad
+ right
+ => left
+ => right
+ => center
+ => left
+ => center
+ => right
+
+ -- Request: .na
+ Disable output line adjustment. This produces the same output as
+ left-alignment, but the value of the adjustment mode register '.j'
+ is altered differently. The adjustment mode and enablement status
+ are associated with the environment (*note Environments::).
+
+ -- Request: .brp
+ -- Escape sequence: \p
+ Break, adjusting the line per the current adjustment mode. '\p'
+ schedules a break with adjustment at the next word boundary. The
+ escape sequence is itself neither a break nor a space of any kind;
+ it can thus be placed in the middle of a word to cause a break at
+ the end of that word.
+
+ Breaking with immediate adjustment can produce ugly results since
+ GNU 'troff' doesn't have a sophisticated paragraph-building
+ algorithm, as TeX has, for example. Instead, GNU 'troff' fills and
+ adjusts a paragraph line by line.
+
+ .ll 4.5i
+ This is an uninteresting sentence.
+ This is an uninteresting sentence.\p
+ This is an uninteresting sentence.
+
+ is formatted as follows.
+
+ This is an uninteresting sentence. This is
+ an uninteresting sentence.
+ This is an uninteresting sentence.
+
+ To clearly present the next couple of requests, we must introduce the
+concept of "productive" input lines. A "productive input line" is one
+that directly produces formatted output. Text lines produce output,(1)
+(*note Manipulating Filling and Adjustment-Footnote-1::) as do control
+lines containing requests like 'tl' or escape sequences like '\D'.
+Macro calls are not _directly_ productive, and thus not counted, but
+their interpolated contents can be. Empty requests, and requests and
+escape sequences that define registers or strings or alter the
+formatting environment (as with changes to the size, face, height,
+slant, or color of the type) are not productive. We will also preview
+the output line continuation escape sequence, '\c', which "connects" two
+input lines that would otherwise be counted separately. (2) (*note
+Manipulating Filling and Adjustment-Footnote-2::)
+
+ .de hello
+ Hello, world!
+ ..
+ .ce \" center output of next productive input line
+ .
+ .nr junk-reg 1
+ .ft I
+ Chorus: \c
+ .ft
+ .hello
+ Went the day well?
+ => Chorus: Hello, world!
+ => Went the day well?
+
+ -- Request: .ce [n]
+ -- Register: \n[.ce]
+ Break (unless the no-break control character is used), center the
+ output of the next N productive input lines with respect to the
+ line length and indentation without filling, then break again
+ regardless of the invoking control character. If the argument is
+ not positive, centering is disabled. Omitting the argument implies
+ an N of '1'. The count of lines remaining to be centered is stored
+ in the read-only register '.ce' and is associated with the
+ environment (*note Environments::).
+
+ While the '.ad c' request also centers text, it fills the text as
+ well.
+
+ .de FR
+ This is a small text fragment that shows the differences
+ between the `.ce' and the `.ad c' requests.
+ ..
+ .ll 4i
+ .ce 1000
+ .FR
+ .ce 0
+
+ .ad c
+ .FR
+ => This is a small text fragment that shows
+ => the differences
+ => between the `.ce' and the `.ad c' requests.
+ =>
+ => This is a small text fragment that shows
+ => the differences between the `.ce' and
+ => the `.ad c' requests.
+
+ The previous example illustrates a common idiom of turning
+ centering on for a quantity of lines far in excess of what is
+ required, and off again after the text to be centered. This
+ technique relieves humans of counting lines for requests that take
+ a count of input lines as an argument.
+
+ -- Request: .rj [n]
+ -- Register: \n[.rj]
+ Break (unless the no-break control character is used), align the
+ output of the next N productive input lines to the right margin
+ without filling, then break again regardless of the control
+ character. If the argument is not positive, right-alignment is
+ disabled. Omitting the argument implies an N of '1'. The count of
+ lines remaining to be right-aligned is stored in the read-only
+ register '.rj' and is associated with the environment (*note
+ Environments::).
+
+ .ll 49n
+ .rj 3
+ At first I hoped that such a technically unsound
+ project would collapse but I soon realized it was
+ doomed to success. \[em] C. A. R. Hoare
+ => At first I hoped that such a technically unsound
+ => project would collapse but I soon realized it was
+ => doomed to success. -- C. A. R. Hoare
+
+ -- Request: .ss word-space-size [additional-sentence-space-size]
+ -- Register: \n[.ss]
+ -- Register: \n[.sss]
+ Set the sizes of spaces between words and sentences(3) (*note
+ Manipulating Filling and Adjustment-Footnote-3::) in twelfths of
+ font's space width (typically one-fourth to one-third em for
+ Western scripts). The default for both parameters is 12. Negative
+ values are erroneous. The first argument is a minimum; if an
+ output line undergoes adjustment, such spaces may increase in
+ width. The optional second argument sets the amount of additional
+ space separating sentences on the same output line. If omitted,
+ this amount is set to WORD-SPACE-SIZE. The request is ignored if
+ there are no parameters.
+
+ Additional inter-sentence space is used only if the output line is
+ not full when the end of a sentence occurs in the input. If a
+ sentence ends at the end of an input line, then both an inter-word
+ space and an inter-sentence space are added to the output; if two
+ spaces follow the end of a sentence in the middle of an input line,
+ then the second space becomes an inter-sentence space in the
+ output. Additional inter-sentence space is not adjusted, but the
+ inter-word space that always precedes it may be. Further input
+ spaces after the second, if present, are adjusted as normal.
+
+ The read-only registers '.ss' and '.sss' hold the minimal
+ inter-word space and additional inter-sentence space amounts,
+ respectively. These parameters are part of the environment (*note
+ Environments::), and rounded down to the nearest multiple of 12 on
+ terminals.
+
+ The 'ss' request can insert discardable horizontal space; that is,
+ space that is discarded at a break. For example, some footnote
+ styles collect the notes into a single paragraph with large gaps
+ between each note.
+
+ .ll 48n
+ 1.\~J. Fict. Ch. Soc. 6 (2020), 3\[en]14.
+ .ss 12 48 \" applies to next sentence ending
+ Reprints no longer available through FCS.
+ .ss 12 \" go back to normal
+ 2.\~Better known for other work.
+ => 1. J. Fict. Ch. Soc. 6 (2020), 3-14. Reprints
+ => no longer available through FCS. 2. Better
+ => known for other work.
+
+ If _undiscardable_ space is required, use the '\h' escape sequence.
+
+
+File: groff.info, Node: Manipulating Filling and Adjustment-Footnotes, Up: Manipulating Filling and Adjustment
+
+ (1) unless diverted; see *note Diversions::
+
+ (2) *Note Line Continuation::.
+
+ (3) Recall *note Filling:: and *note Sentences:: for the definitions
+of word and sentence boundaries, respectively.
+
+
+File: groff.info, Node: Manipulating Hyphenation, Next: Manipulating Spacing, Prev: Manipulating Filling and Adjustment, Up: GNU troff Reference
+
+5.10 Manipulating Hyphenation
+=============================
+
+When filling, GNU 'troff' hyphenates words as needed at user-specified
+and automatically determined hyphenation points. The machine-driven
+determination of hyphenation points in words requires algorithms and
+data, and is susceptible to conventions and preferences. Before
+tackling such "automatic hyphenation", let us consider how hyphenation
+points can be set explicitly.
+
+ Explicitly hyphenated words such as "mother-in-law" are eligible for
+breaking after each of their hyphens. Relatively few words in a
+language offer such obvious break points, however, and automatic
+detection of syllabic (or phonetic) boundaries for hyphenation is not
+perfect,(1) (*note Manipulating Hyphenation-Footnote-1::) particularly
+for unusual words found in technical literature. We can instruct GNU
+'troff' how to hyphenate specific words if the need arises.
+
+ -- Request: .hw word ...
+ Define each "hyphenation exception" WORD with each hyphen '-' in
+ the word indicating a hyphenation point. For example, the request
+
+ .hw in-sa-lub-rious alpha
+
+ marks potential hyphenation points in "insalubrious", and prevents
+ "alpha" from being hyphenated at all.
+
+ Besides the space character, any character whose hyphenation code
+ is zero can be used to separate the arguments of 'hw' (see the
+ 'hcode' request below). In addition, this request can be used more
+ than once.
+
+ Hyphenation points specified with 'hw' are not subject to the
+ within-word placement restrictions imposed by the 'hy' request (see
+ below).
+
+ Hyphenation exceptions specified with the 'hw' request are
+ associated with the hyphenation language (see the 'hla' request
+ below) and environment (*note Environments::); invoking the 'hw'
+ request in the absence of a hyphenation language is an error.
+
+ The request is ignored if there are no parameters.
+
+ These are known as hyphenation exceptions in the expectation that
+most users will avail themselves of automatic hyphenation; these
+exceptions override any rules that would normally apply to a word
+matching a hyphenation exception defined with 'hw'.
+
+ Situations also arise when only a specific occurrence of a word needs
+its hyphenation altered or suppressed, or when a URL or similar string
+needs to be breakable in sensible places without hyphenation.
+
+ -- Escape sequence: \%
+ -- Escape sequence: \:
+ To tell GNU 'troff' how to hyphenate words as they occur in input,
+ use the '\%' escape sequence; it is the default "hyphenation
+ character". Each instance within a word indicates to GNU 'troff'
+ that the word may be hyphenated at that point, while prefixing a
+ word with this escape sequence prevents it from being otherwise
+ hyphenated. This mechanism affects only that occurrence of the
+ word; to change the hyphenation of a word for the remainder of
+ input processing, use the 'hw' request.
+
+ GNU 'troff' regards the escape sequences '\X' and '\Y' as starting
+ a word; that is, the '\%' escape sequence in, say,
+ '\X'...'\%foobar' or '\Y'...'\%foobar' no longer prevents
+ hyphenation of 'foobar' but inserts a hyphenation point just prior
+ to it; most likely this isn't what you want. *Note Postprocessor
+ Access::.
+
+ '\:' inserts a non-printing break point; that is, a word can break
+ there, but the soft hyphen glyph (see below) is not written to the
+ output if it does. This escape sequence is an input word boundary,
+ so the remainder of the word is subject to hyphenation as normal.
+
+ You can combine '\:' and '\%' to control breaking of a file name or
+ URL, or to permit hyphenation only after certain explicit hyphens
+ within a word.
+
+ The \%Lethbridge-Stewart-\:\%Sackville-Baggins divorce
+ was, in retrospect, inevitable once the contents of
+ \%/var/log/\:\%httpd/\:\%access_log on the family web
+ server came to light, revealing visitors from Hogwarts.
+
+ -- Request: .hc [char]
+ Change the hyphenation character to CHAR. This character then
+ works as the '\%' escape sequence normally does, and thus no longer
+ appears in the output.(2) (*note Manipulating
+ Hyphenation-Footnote-2::) Without an argument, 'hc' resets the
+ hyphenation character to '\%' (the default). The hyphenation
+ character is associated with the environment (*note
+ Environments::).
+
+ -- Request: .shc [c]
+ Set the "soft hyphen character", inserted when a word is hyphenated
+ automatically or at a hyphenation character, to the ordinary or
+ special character C.(3) (*note Manipulating
+ Hyphenation-Footnote-3::) If the argument is omitted, the soft
+ hyphen character is set to the default, '\[hy]'. If no glyph for C
+ exists in the font in use at a potential hyphenation point, then
+ the line is not broken there. Neither character definitions
+ (specified with the 'char' and similar requests) nor translations
+ (specified with the 'tr' request) are applied to C.
+
+ Several requests influence automatic hyphenation. Because
+conventions vary, a variety of hyphenation modes is available to the
+'hy' request; these determine whether hyphenation will apply to a word
+prior to breaking a line at the end of a page (more or less; see below
+for details), and at which positions within that word automatically
+determined hyphenation points are permissible. The places within a word
+that are eligible for hyphenation are determined by language-specific
+data and lettercase relationships. Furthermore, hyphenation of a word
+might be suppressed due to a limit on consecutive hyphenated lines
+('hlm'), a minimum line length threshold ('hym'), or because the line
+can instead be adjusted with additional inter-word space ('hys').
+
+ -- Request: .hy [mode]
+ -- Register: \n[.hy]
+ Set automatic hyphenation mode to MODE, an integer encoding
+ conditions for hyphenation; if omitted, '1' is implied. The
+ hyphenation mode is available in the read-only register '.hy'; it
+ is associated with the environment (*note Environments::). The
+ default hyphenation mode depends on the localization file loaded
+ when GNU 'troff' starts up; see the 'hpf' request below.
+
+ Typesetting practice generally does not avail itself of every
+ opportunity for hyphenation, but the details differ by language and
+ site mandates. The hyphenation modes of AT&T 'troff' were
+ implemented with English-language publishing practices of the 1970s
+ in mind, not a scrupulous enumeration of conceivable parameters.
+ GNU 'troff' extends those modes such that finer-grained control is
+ possible, favoring compatibility with older implementations over a
+ more intuitive arrangement. The means of hyphenation mode control
+ is a set of numbers that can be added up to encode the behavior
+ sought.(4) (*note Manipulating Hyphenation-Footnote-4::) The
+ entries in the following table are termed "values"; the sum of the
+ desired values is the "mode".
+
+ '0'
+ disables hyphenation.
+
+ '1'
+ enables hyphenation except after the first and before the last
+ character of a word.
+
+ The remaining values "imply" 1; that is, they enable hyphenation
+ under the same conditions as '.hy 1', and then apply or lift
+ restrictions relative to that basis.
+
+ '2'
+ disables hyphenation of the last word on a page,(5) (*note
+ Manipulating Hyphenation-Footnote-5::) even for explicitly
+ hyphenated words.
+
+ '4'
+ disables hyphenation before the last two characters of a word.
+
+ '8'
+ disables hyphenation after the first two characters of a word.
+
+ '16'
+ enables hyphenation before the last character of a word.
+
+ '32'
+ enables hyphenation after the first character of a word.
+
+ Apart from value 2, restrictions imposed by the hyphenation mode
+ are _not_ respected for words whose hyphenations have been
+ specified with the hyphenation character ('\%' by default) or the
+ 'hw' request.
+
+ Nonzero values in the previous table are additive. For example,
+ mode 12 causes GNU 'troff' to hyphenate neither the last two nor
+ the first two characters of a word. Some values cannot be used
+ together because they contradict; for instance, values 4 and 16,
+ and values 8 and 32. As noted, it is superfluous to add 1 to any
+ non-zero even mode.
+
+ The automatic placement of hyphens in words is determined by
+ "pattern files", which are derived from TeX and available for
+ several languages. The number of characters at the beginning of a
+ word after which the first hyphenation point should be inserted is
+ determined by the patterns themselves; it can't be reduced further
+ without introducing additional, invalid hyphenation points
+ (unfortunately, this information is not part of a pattern file--you
+ have to know it in advance). The same is true for the number of
+ characters at the end of a word before the last hyphenation point
+ should be inserted. For example, you can supply the following
+ input to 'echo $(nroff)'.
+
+ .ll 1
+ .hy 48
+ splitting
+
+ You will get
+
+ s- plit- t- in- g
+
+ instead of the correct 'split- ting'. English patterns as
+ distributed with GNU 'troff' need two characters at the beginning
+ and three characters at the end; this means that value 4 of 'hy' is
+ mandatory. Value 8 is possible as an additional restriction, but
+ values 16 and 32 should be avoided, as should mode 1. Modes 4
+ and 6 are typical.
+
+ A table of left and right minimum character counts for hyphenation
+ as needed by the patterns distributed with GNU 'troff' follows; see
+ the 'groff_tmac(5)' man page for more information on GNU 'troff''s
+ language macro files.
+
+ language pattern name left min right min
+ -----------------------------------------------------------
+ Czech cs 2 2
+ English en 2 3
+ French fr 2 3
+ German traditional det 2 2
+ German reformed den 2 2
+ Italian it 2 2
+ Swedish sv 1 2
+
+ Hyphenation exceptions within pattern files (i.e., the words within
+ a TeX '\hyphenation' group) obey the hyphenation restrictions given
+ by 'hy'.
+
+ -- Request: .nh
+ Disable automatic hyphenation; i.e., set the hyphenation mode to 0
+ (see above). The hyphenation mode of the last call to 'hy' is not
+ remembered.
+
+ -- Request: .hpf pattern-file
+ -- Request: .hpfa pattern-file
+ -- Request: .hpfcode a b [c d] ...
+ Read hyphenation patterns from PATTERN-FILE, which is sought in the
+ same way that macro files are with the 'mso' request or the
+ '-mNAME' command-line option to 'groff'. The PATTERN-FILE should
+ have the same format as (simple) TeX pattern files. More
+ specifically, the following scanning rules are implemented.
+
+ * A percent sign starts a comment (up to the end of the line)
+ even if preceded by a backslash.
+
+ * "Digraphs" like '\$' are not supported.
+
+ * '^^XX' (where each X is 0-9 or a-f) and '^^C' (character C in
+ the code point range 0-127 decimal) are recognized; other uses
+ of '^' cause an error.
+
+ * No macro expansion is performed.
+
+ * 'hpf' checks for the expression '\patterns{...}' (possibly
+ with whitespace before or after the braces). Everything
+ between the braces is taken as hyphenation patterns.
+ Consequently, '{' and '}' are not allowed in patterns.
+
+ * Similarly, '\hyphenation{...}' gives a list of hyphenation
+ exceptions.
+
+ * '\endinput' is recognized also.
+
+ * For backward compatibility, if '\patterns' is missing, the
+ whole file is treated as a list of hyphenation patterns
+ (except that the '%' character is recognized as the start of a
+ comment).
+
+ The 'hpfa' request appends a file of patterns to the current list.
+
+ The 'hpfcode' request defines mapping values for character codes in
+ pattern files. It is an older mechanism no longer used by GNU
+ 'troff''s own macro files; for its successor, see 'hcode' below.
+ 'hpf' or 'hpfa' apply the mapping after reading the patterns but
+ before replacing or appending to the active list of patterns. Its
+ arguments are pairs of character codes--integers from 0 to 255.
+ The request maps character code A to code B, code C to code D, and
+ so on. Character codes that would otherwise be invalid in GNU
+ 'troff' can be used. By default, every code maps to itself except
+ those for letters 'A' to 'Z', which map to those for 'a' to 'z'.
+
+ The set of hyphenation patterns is associated with the language set
+ by the 'hla' request (see below). The 'hpf' request is usually
+ invoked by a localization file loaded by the 'troffrc' file.(6)
+ (*note Manipulating Hyphenation-Footnote-6::)
+
+ A second call to 'hpf' (for the same language) replaces the
+ hyphenation patterns with the new ones. Invoking 'hpf' or 'hpfa'
+ causes an error if there is no hyphenation language. If no 'hpf'
+ request is specified (either in the document, in a file loaded at
+ startup, or in a macro package), GNU 'troff' won't automatically
+ hyphenate at all.
+
+ -- Request: .hcode c1 code1 [c2 code2] ...
+ Set the hyphenation code of character C1 to CODE1, that of C2 to
+ CODE2, and so on. A hyphenation code must be an ordinary character
+ (not a special character escape sequence) other than a digit or a
+ space. The request is ignored if given no arguments.
+
+ For hyphenation to work, hyphenation codes must be set up. At
+ startup, GNU 'troff' assigns hyphenation codes to the letters
+ 'a'-'z' (mapped to themselves), to the letters 'A'-'Z' (mapped to
+ 'a'-'z'), and zero to all other characters. Normally, hyphenation
+ patterns contain only lowercase letters which should be applied
+ regardless of case. In other words, they assume that the words
+ 'FOO' and 'Foo' should be hyphenated exactly as 'foo' is. The
+ 'hcode' request extends this principle to letters outside the
+ Unicode basic Latin alphabet; without it, words containing such
+ letters won't be hyphenated properly even if the corresponding
+ hyphenation patterns contain them.
+
+ For example, the following 'hcode' requests are necessary to assign
+ hyphenation codes to the letters 'ÄäÖöÜüß', needed for German.
+
+ .hcode ä ä Ä ä
+ .hcode ö ö Ö ö
+ .hcode ü ü Ü ü
+ .hcode ß ß
+
+ Without these assignments, GNU 'troff' treats the German word
+ 'Kindergärten' (the plural form of 'kindergarten') as two words
+ 'kinderg' and 'rten' because the hyphenation code of the umlaut a
+ is zero by default, just like a space. There is a German
+ hyphenation pattern that covers 'kinder', so GNU 'troff' finds the
+ hyphenation 'kin-der'. The other two hyphenation points
+ ('kin-der-gär-ten') are missed.
+
+ -- Request: .hla lang
+ -- Register: \n[.hla]
+ Set the hyphenation language to LANG. Hyphenation exceptions
+ specified with the 'hw' request and hyphenation patterns and
+ exceptions specified with the 'hpf' and 'hpfa' requests are
+ associated with the hyphenation language. The 'hla' request is
+ usually invoked by a localization file, which is turn loaded by the
+ 'troffrc' or 'troffrc-end' file; see the 'hpf' request above.
+
+ The hyphenation language is available in the read-only
+ string-valued register '.hla'; it is associated with the
+ environment (*note Environments::).
+
+ -- Request: .hlm [n]
+ -- Register: \n[.hlm]
+ -- Register: \n[.hlc]
+ Set the maximum quantity of consecutive hyphenated lines to N. If
+ N is negative, there is no maximum. If omitted, N is -1. This
+ value is associated with the environment (*note Environments::).
+ Only lines output from a given environment count toward the maximum
+ associated with that environment. Hyphens resulting from '\%' are
+ counted; explicit hyphens are not.
+
+ The '.hlm' read-only register stores this maximum. The count of
+ immediately preceding consecutive hyphenated lines is available in
+ the read-only register '.hlc'.
+
+ -- Request: .hym [length]
+ -- Register: \n[.hym]
+ Set the (right) hyphenation margin to LENGTH. If the adjustment
+ mode is not 'b' or 'n', the line is not hyphenated if it is shorter
+ than LENGTH. Without an argument, the hyphenation margin is reset
+ to its default value, 0. The default scaling unit is 'm'. The
+ hyphenation margin is associated with the environment (*note
+ Environments::).
+
+ A negative argument resets the hyphenation margin to zero, emitting
+ a warning in category 'range'.
+
+ The hyphenation margin is available in the '.hym' read-only
+ register.
+
+ -- Request: .hys [hyphenation-space]
+ -- Register: \n[.hys]
+ Suppress hyphenation of the line in adjustment modes 'b' or 'n' if
+ it can be justified by adding no more than HYPHENATION-SPACE extra
+ space to each inter-word space. Without an argument, the
+ hyphenation space adjustment threshold is set to its default value,
+ 0. The default scaling unit is 'm'. The hyphenation space
+ adjustment threshold is associated with the environment (*note
+ Environments::).
+
+ A negative argument resets the hyphenation space adjustment
+ threshold to zero, emitting a warning in category 'range'.
+
+ The hyphenation space adjustment threshold is available in the
+ '.hys' read-only register.
+
+
+File: groff.info, Node: Manipulating Hyphenation-Footnotes, Up: Manipulating Hyphenation
+
+ (1) Whether a perfect algorithm for this application is even possible
+is an unsolved problem in computer science:
+<https://tug.org/docs/liang/liang-thesis.pdf>.
+
+ (2) '\%' itself stops marking hyphenation points but still produces
+no output glyph.
+
+ (3) "Soft" because it appears in output only where a hyphenation
+break is performed; a "hard" hyphen, as in "long-term", always appears.
+
+ (4) The mode is a vector of Booleans encoded as an integer. To a
+programmer, this fact is easily deduced from the exclusive use of powers
+of two for the configuration parameters; they are computationally easy
+to "mask off" and compare to zero. To almost everyone else, the
+arrangement seems recondite and unfriendly.
+
+ (5) Hyphenation is prevented if the next page location trap is closer
+to the vertical drawing position than the next text baseline would be.
+*Note Page Location Traps::.
+
+ (6) For more on localization, see the 'groff_tmac(5)' man page.
+
+
+File: groff.info, Node: Manipulating Spacing, Next: Tabs and Fields, Prev: Manipulating Hyphenation, Up: GNU troff Reference
+
+5.11 Manipulating Spacing
+=========================
+
+A break causes the formatter to update the vertical drawing position at
+which the new text baseline is aligned. You can alter this location.
+
+ -- Request: .sp [distance]
+ Break and move the next text baseline down by DISTANCE, or until
+ springing a page location trap.(1) (*note Manipulating
+ Spacing-Footnote-1::) If invoked with the no-break control
+ character, 'sp' moves the pending output line's text baseline by
+ DISTANCE. A negative DISTANCE will not reduce the position of the
+ text baseline below zero. Inside a diversion, any DISTANCE
+ argument is ignored. The default scaling unit is 'v'. If DISTANCE
+ is not specified, '1v' is assumed.
+
+ .pl 5v \" Set page length to 5 vees.
+ .de xx
+ \-\-\-
+ . br
+ ..
+ .wh 0 xx \" Set a trap at the top of the page.
+ foo on page \n%
+ .sp 2v
+ bar on page \n%
+ .sp 50v \" This will cause a page break.
+ baz on page \n%
+ .pl \n(nlu \" Truncate page to current position.
+ => ---
+ => foo on page 1
+ =>
+ =>
+ => bar on page 1
+ => ---
+ => baz on page 2
+
+ You might use the following macros to set the baseline of the next
+ output text at a given distance from the top or the bottom of the
+ page. We subtract one line height ('\n[.v]') because the '|'
+ operator moves to one vee below the page top (recall *note Numeric
+ Expressions::).
+
+ .de y-from-top-down
+ . sp |\\$1-\\n[.v]u
+ ..
+ .
+ .de y-from-bot-up
+ . sp |\\n[.p]u-\\$1-\\n[.v]u
+ ..
+
+ A call to '.y-from-bot-up 10c' means that the next text baseline
+ will be 10 cm from the bottom edge of the paper.
+
+ -- Request: .ls [count]
+ -- Register: \n[.L]
+ Set the line spacing; add COUNT-1 blank lines after each line of
+ text. With no argument, GNU 'troff' uses the previous value before
+ the last 'ls' call. The default is '1'.
+
+ The read-only register '.L' contains the current line spacing; it
+ is associated with the environment (*note Environments::).
+
+ The 'ls' request is a coarse mechanism. *Note Changing the Type
+Size::, for the requests 'vs' and 'pvs' as alternatives to 'ls'.
+
+ -- Escape sequence: \x'spacing'
+ -- Register: \n[.a]
+ Sometimes, an output line requires additional vertical spacing, for
+ instance to allow room for a tall construct like an inline equation
+ with exponents or subscripts (particularly if they are iterated).
+ The '\x' escape sequence takes a delimited measurement (like
+ '\x'3p'') to increase the vertical spacing of the pending output
+ line. The default scaling unit is 'v'. If the measurement is
+ positive, extra vertical space is inserted below the current line;
+ a negative measurement adds space above. If '\x' is applied to the
+ pending output line multiple times, the maxima of the positive and
+ negative adjustments are separately applied. The delimiter need
+ not be a neutral apostrophe; see *note Delimiters::.
+
+ The '.a' read-only register contains the extra vertical spacing
+ _after_ the text baseline of the most recently emitted output line.
+ (In other words, it is the largest positive argument to '\x'
+ encountered on that line.) This quantity is exposed via a register
+ because if an output line requires this "extra post-vertical line
+ spacing", and the subsequent output line requires "extra
+ pre-vertical line spacing" (a negative argument to '\x'), then
+ applying both can lead to excessive spacing between the output
+ lines. Text that is piling high on line N might not require (as
+ much) extra pre-vertical line spacing if line N-1 carries extra
+ post-vertical line spacing.
+
+ Use of '\x' can be necessary in combination with the
+ bracket-building escape sequence '\b',(2) (*note Manipulating
+ Spacing-Footnote-2::) as the following example shows.
+
+ .nf
+ This is a test of \[rs]b (1).
+ This is a test of \[rs]b (2).
+ This is a test of \b'xyz'\x'-1m'\x'1m' (3).
+ This is a test of \[rs]b (4).
+ This is a test of \[rs]b (5).
+ => This is a test of \b (1).
+ => This is a test of \b (2).
+ => x
+ => This is a test of y (3).
+ => z
+ => This is a test of \b (4).
+ => This is a test of \b (5).
+
+Without '\x', the backslashes on the lines marked '(2)' and '(4)' would
+be overprinted.
+
+ -- Request: .ns
+ -- Request: .rs
+ -- Register: \n[.ns]
+ Enable "no-space mode". Vertical spacing, whether by 'sp' requests
+ or blank input lines, is disabled. The 'bp' request to advance to
+ the next page is also disabled, unless it is accompanied by a page
+ number (*note Page Control::). No-space mode ends automatically
+ when text(3) (*note Manipulating Spacing-Footnote-3::) is formatted
+ for output (4) (*note Manipulating Spacing-Footnote-4::) or the
+ 'rs' request is invoked, which ends no-space mode. The read-only
+ register '.ns' interpolates a Boolean value indicating the
+ enablement of no-space mode.
+
+ A paragraphing macro might ordinarily insert vertical space to
+ separate paragraphs. A section heading macro could invoke 'ns' to
+ suppress this spacing for the first paragraph in a section.
+
+
+File: groff.info, Node: Manipulating Spacing-Footnotes, Up: Manipulating Spacing
+
+ (1) *Note Page Location Traps::.
+
+ (2) *Note Drawing Geometric Objects::.
+
+ (3) or geometric objects; see *note Drawing Geometric Objects::
+
+ (4) to the top-level diversion; see *note Diversions::
+
+
+File: groff.info, Node: Tabs and Fields, Next: Character Translations, Prev: Manipulating Spacing, Up: GNU troff Reference
+
+5.12 Tabs and Fields
+====================
+
+A tab character (ISO code point 9, EBCDIC code point 5) causes a
+horizontal movement to the next tab stop, if any.
+
+ -- Escape sequence: \t
+ Interpolate a tab in copy mode; see *note Copy Mode::.
+
+ -- Request: .ta [[n1 n2 ... nn ]T r1 r2 ... rn]
+ -- Register: \n[.tabs]
+ Change tab stop positions. This request takes a series of tab
+ specifiers as arguments (optionally divided into two groups with
+ the letter 'T') that indicate where each tab stop is to be,
+ overriding any previous settings. The default scaling unit is 'm'.
+ Invoking 'ta' without an argument removes all tab stops. GNU
+ 'troff''s startup value is 'T 0.5i'.
+
+ Tab stops can be specified absolutely--as distances from the left
+ margin. The following example sets six tab stops, one every inch.
+
+ .ta 1i 2i 3i 4i 5i 6i
+
+ Tab stops can also be specified using a leading '+', which means
+ that the specified tab stop is set relative to the previous tab
+ stop. For example, the following is equivalent to the previous
+ example.
+
+ .ta 1i +1i +1i +1i +1i +1i
+
+ GNU 'troff' supports an extended syntax to specify repeating tab
+ stops. These stops appear after a 'T' argument. Their values are
+ always taken as distances relative to the previous tab stop. This
+ is the idiomatic way to specify tab stops at equal intervals in
+ 'groff'. The following is, yet again, the same as the previous
+ examples. It does more, in fact, since it defines an infinite
+ number of tab stops at one-inch intervals.
+
+ .ta T 1i
+
+ Now we are ready to interpret the full syntax given above. The
+ 'ta' request sets tabs at positions N1, N2, ..., NN, then at NN+R1,
+ NN+R2, ..., NN+RN, then at NN+RN+R1, NN+RN+R2, ..., NN+RN+RN, and
+ so on.
+
+ For example, '4c +6c T 3c 5c 2c' is equivalent to '4c 10c 13c 18c
+ 20c 23c 28c 30c ...'.
+
+ Text written to a tab column (i.e., between two tab stops, or
+ between a tab stop and an output line boundary) may be aligned to
+ the right or left, or centered in the column. This alignment is
+ determined by appending 'R', 'L', or 'C' to the tab specifier. The
+ default is 'L'.
+
+ .ta 1i 2iC 3iR
+
+ The beginning of an output line is not a tab stop; the text that
+ begins an output line is placed according to the configured
+ alignment and indentation; see *note Manipulating Filling and
+ Adjustment:: and *note Line Layout::.
+
+ A tab stop is converted into a non-breakable horizontal movement
+ that cannot be adjusted.
+
+ .ll 2i
+ .ds foo a\tb\tc
+ .ta T 1i
+ \*[foo]
+ error-> warning: cannot break line
+ => a b c
+
+ The above creates a single output line that is a bit longer than
+ two inches (we use a string to show exactly where the tab stops
+ are). Now consider the following.
+
+ .ll 2i
+ .ds bar a\tb c\td
+ .ta T 1i
+ \*[bar]
+ error-> warning: cannot adjust line
+ => a b
+ => c d
+
+ GNU 'troff' first converts the line's tab stops into unbreakable
+ horizontal movements, then breaks after 'b'. This usually isn't
+ what you want.
+
+ Superfluous tab characters--those that do not correspond to a tab
+ stop--are ignored except for the first, which delimits the
+ characters belonging to the last tab stop for right-alignment or
+ centering.
+
+ .ds Z foo\tbar\tbaz
+ .ds ZZ foo\tbar\tbazqux
+ .ds ZZZ foo\tbar\tbaz\tqux
+ .ta 2i 4iR
+ \*[Z]
+ .br
+ \*[ZZ]
+ .br
+ \*[ZZZ]
+ .br
+ => foo bar baz
+ => foo bar bazqux
+ => foo bar bazqux
+
+ The first line right-aligns "baz" within the second tab stop. The
+ second line right-aligns "bazqux" within it. The third line
+ right-aligns only "baz" because of the additional tab character,
+ which marks the end of the text occupying the last tab stop
+ defined.
+
+ Tab stops are associated with the environment (*note
+ Environments::).
+
+ The read-only register '.tabs' contains a string representation of
+ the current tab settings suitable for use as an argument to the
+ 'ta' request.(1) (*note Tabs and Fields-Footnote-1::)
+
+ .ds tab-string \n[.tabs]
+ \*[tab-string]
+ => T120u
+
+ -- Request: .tc [c]
+ Set the tab repetition character to the ordinary or special
+ character C; normally, no glyph is written when moving to a tab
+ stop (and some output devices may output space characters to
+ achieve this motion). A "tab repetition character" causes the
+ formatter to write as many instances of C as are necessary to
+ occupy the interval from the horizontal drawing position to the
+ next tab stop. With no argument, GNU 'troff' reverts to the
+ default behavior. The tab repetition character is associated with
+ the environment (*note Environments::). Only a single character of
+ C is recognized; any excess is ignored.
+
+ -- Request: .linetabs n
+ -- Register: \n[.linetabs]
+ If N is missing or non-zero, activate "line-tabs"; deactivate it
+ otherwise (the default). Active line-tabs cause GNU 'troff' to
+ compute tab distances relative to the start of the output line
+ instead of the input line.
+
+ .de Tabs
+ . ds x a\t\c
+ . ds y b\t\c
+ . ds z c
+ . ta 1i 3i
+ \\*x
+ \\*y
+ \\*z
+ ..
+ .Tabs
+ .br
+ .linetabs
+ .Tabs
+ => a b c
+ => a b c
+
+ Line-tabs activation is associated with the environment (*note
+ Environments::). The read-only register '.linetabs' interpolates 1
+ if line-tabs are active, and 0 otherwise.
+
+* Menu:
+
+* Leaders::
+* Fields::
+
+
+File: groff.info, Node: Tabs and Fields-Footnotes, Up: Tabs and Fields
+
+ (1) Plan 9 'troff' uses the register '.S' for this purpose.
+
+
+File: groff.info, Node: Leaders, Next: Fields, Prev: Tabs and Fields, Up: Tabs and Fields
+
+5.12.1 Leaders
+--------------
+
+Sometimes it is desirable to fill a tab stop with a given glyph, but
+also use tab stops normally on the same output line. An example is a
+table of contents entry that uses dots to bridge the entry name with its
+page number, which is itself aligned between tab stops. The 'roff'
+language provides "leaders" for this purpose.(1) (*note
+Leaders-Footnote-1::)
+
+ A leader character (ISO and EBCDIC code point 1, also known as SOH or
+"start of heading"), behaves similarly to a tab character: it moves to
+the next tab stop. The difference is that for this movement, the
+default fill character is a period '.'.
+
+ -- Escape sequence: \a
+ Interpolate a leader in copy mode; see *note Copy Mode::.
+
+ -- Request: .lc [c]
+ Set the leader repetition character to the ordinary or special
+ character C. Recall *note Tabs and Leaders::: when encountering a
+ leader character in the input, the formatter writes as many dots
+ '.' as are necessary until reaching the next tab stop; this is the
+ "leader definition character". Omitting C unsets the leader
+ character. With no argument, GNU 'troff' treats leaders the same
+ as tabs. The leader repetition character is associated with the
+ environment (*note Environments::). Only a single C is recognized;
+ any excess is ignored.
+
+ A table of contents, for example, may define tab stops after a
+section number, a title, and a gap to be filled with leader dots. The
+page number follows the leader, after a right-aligned final tab stop
+wide enough to house the largest page number occurring in the document.
+
+ .ds entry1 19.\tThe Prophet\a\t98
+ .ds entry2 20.\tAll Astir\a\t101
+ .ta .5i 4.5i +.5iR
+ .nf
+ \*[entry1]
+ \*[entry2]
+ => 19. The Prophet............................. 98
+ => 20. All Astir............................... 101
+
+
+File: groff.info, Node: Leaders-Footnotes, Up: Leaders
+
+ (1) This is pronounced to rhyme with "feeder", and refers to how the
+glyphs "lead" the eye across the page to the corresponding page number
+or other datum.
+
+
+File: groff.info, Node: Fields, Prev: Leaders, Up: Tabs and Fields
+
+5.12.2 Fields
+-------------
+
+"Fields" are a more general way of laying out tabular data. A field is
+defined as the data between a pair of "delimiting characters". It
+contains substrings that are separated by "padding characters". The
+width of a field is the distance on the _input_ line from the position
+where the field starts to the next tab stop. A padding character
+inserts an adjustable space similar to TeX's '\hss' command (thus it can
+even be negative) to make the sum of all substring lengths plus the
+adjustable space equal to the field width. If more than one padding
+character is inserted, the available space is evenly distributed among
+them.
+
+ -- Request: .fc [delim-char [padding-char]]
+ Define a delimiting and a padding character for fields. If the
+ latter is missing, the padding character defaults to a space
+ character. If there is no argument at all, the field mechanism is
+ disabled (which is the default). In contrast to, e.g., the tab
+ repetition character, delimiting and padding characters are _not_
+ associated with the environment (*note Environments::).
+
+ .fc # ^
+ .ta T 3i
+ #foo^bar^smurf#
+ .br
+ #foo^^bar^smurf#
+ => foo bar smurf
+ => foo bar smurf
+
+
+File: groff.info, Node: Character Translations, Next: troff and nroff Modes, Prev: Tabs and Fields, Up: GNU troff Reference
+
+5.13 Character Translations
+===========================
+
+A "translation" is a mapping of an input character to an output glyph.
+The mapping occurs at output time, i.e., the input character gets
+assigned the metric information of the mapped output character right
+before input tokens are converted to nodes (*note Gtroff Internals::,
+for more on this process).
+
+ -- Request: .tr abcd...
+ -- Request: .trin abcd...
+ Translate character A to glyph B, character C to glyph D, and so
+ on. If there is an odd number of characters in the argument, the
+ last one is translated to a fixed-width space (the same one
+ obtained by the '\<SP>' escape sequence).
+
+ The 'trin' request is identical to 'tr', but when you unformat a
+ diversion with 'asciify' it ignores the translation. *Note
+ Diversions::, for details about the 'asciify' request.
+
+ Some notes:
+
+ * Special characters ('\(XX', '\[XXX]', '\C'XXX'', '\'', '\`',
+ '\-', '\_'), glyphs defined with the 'char' request, and
+ numbered glyphs ('\N'XXX'') can be translated also.
+
+ * The '\e' escape can be translated also.
+
+ * Characters can be mapped onto the '\%' and '\~' escape
+ sequences (but '\%' and '\~' can't be mapped onto another
+ glyph).
+
+ * The following characters can't be translated: space (with one
+ exception, see below), backspace, newline, leader (and '\a'),
+ tab (and '\t').
+
+ * Translations are not considered for finding the soft hyphen
+ character set with the 'shc' request.
+
+ * The pair 'C\&' (an arbitrary character C followed by the dummy
+ character) maps this character to "nothing".
+
+ .tr a\&
+ foo bar
+ => foo br
+
+ Even the space character can be mapped to the dummy character.
+
+ .tr aa \&
+ foo bar
+ => foobar
+
+ As shown in the example, the space character can't be the
+ first character/glyph pair as an argument of 'tr'.
+ Additionally, it is not possible to map the space character to
+ any other glyph; requests like '.tr aa x' undo '.tr aa \&'
+ instead.
+
+ If justification is active, lines are justified in spite of
+ the 'empty' space character (but there is no minimal distance,
+ i.e., the space character, between words).
+
+ * After an output glyph has been constructed (this happens at
+ the moment immediately before the glyph is appended to an
+ output glyph list, either by direct output, in a macro,
+ diversion, or string), it is no longer affected by 'tr'.
+
+ * Translating character to glyphs where one of them or both are
+ undefined is possible also; 'tr' does not check whether the
+ elements of its argument exist.
+
+ *Note Gtroff Internals::.
+
+ * Without an argument, the 'tr' request is ignored.
+
+ -- Request: .trnt abcd...
+ 'trnt' is the same as the 'tr' request except that the translations
+ do not apply to text that is transparently throughput into a
+ diversion with '\!'. *Note Diversions::.
+
+ For example,
+
+ .tr ab
+ .di x
+ \!.tm a
+ .di
+ .x
+
+ prints 'b' to the standard error stream; if 'trnt' is used instead
+ of 'tr' it prints 'a'.
+
+
+File: groff.info, Node: troff and nroff Modes, Next: Line Layout, Prev: Character Translations, Up: GNU troff Reference
+
+5.14 'troff' and 'nroff' Modes
+==============================
+
+Historically, 'nroff' and 'troff' were two separate programs; the former
+for terminal output, the latter for typesetters. GNU 'troff' merges
+both functions into one executable(1) (*note troff and nroff
+Modes-Footnote-1::) that sends its output to a device driver ('grotty'
+for terminal devices, 'grops' for PostScript, and so on) which
+interprets this intermediate output format. When discussing AT&T
+'troff', it makes sense to talk about "'nroff' mode" and "'troff' mode"
+since the differences are hard-coded. GNU 'troff' takes information
+from device and font description files without handling requests
+specially if a terminal output device is used, so such a strong
+distinction is unnecessary.
+
+ Usually, a macro package can be used with all output devices.
+Nevertheless, it is sometimes necessary to make a distinction between
+terminal and non-terminal devices: GNU 'troff' provides two built-in
+conditions 'n' and 't' for the 'if', 'ie', and 'while' requests to
+decide whether GNU 'troff' shall behave like 'nroff' or like 'troff'.
+
+ -- Request: .troff
+ Make the 't' built-in condition true (and the 'n' built-in
+ condition false) for 'if', 'ie', and 'while' conditional requests.
+ This is the default if GNU 'troff' (_not_ 'groff') is started with
+ the '-R' switch to avoid loading of the startup files 'troffrc' and
+ 'troffrc-end'. Without '-R', GNU 'troff' stays in 'troff' mode if
+ the output device is not a terminal (e.g., 'ps').
+
+ -- Request: .nroff
+ Make the 'n' built-in condition true (and the 't' built-in
+ condition false) for 'if', 'ie', and 'while' conditional requests.
+ This is the default if GNU 'troff' uses a terminal output device;
+ the code for switching to 'nroff' mode is in the file 'tty.tmac',
+ which is loaded by the startup file 'troffrc'.
+
+ *Note Conditionals and Loops::, for more details on built-in
+conditions.
+
+
+File: groff.info, Node: troff and nroff Modes-Footnotes, Up: troff and nroff Modes
+
+ (1) A GNU 'nroff' program is available for convenience; it calls GNU
+'troff' to perform the formatting.
+
+
+File: groff.info, Node: Line Layout, Next: Line Continuation, Prev: troff and nroff Modes, Up: GNU troff Reference
+
+5.15 Line Layout
+================
+
+The following drawing shows the dimensions that 'gtroff' uses for
+placing a line of output onto the page. They are labeled with the
+request that manipulates each dimension.
+
+ -->| in |<--
+ |<-----------ll------------>|
+ +----+----+----------------------+----+
+ | : : : |
+ +----+----+----------------------+----+
+ -->| po |<--
+ |<--------paper width---------------->|
+
+These dimensions are:
+
+'po'
+ "Page offset"--this is the leftmost position of text on the final
+ output, defining the "left margin".
+
+'in'
+ "Indentation"--this is the distance from the left margin where text
+ is printed.
+
+'ll'
+ "Line length"--this is the distance from the left margin to right
+ margin.
+
+ The right margin is not explicitly configured; the combination of
+page offset and line length provides the information necessary to derive
+it.
+
+ A simple demonstration:
+
+ .ll 3i
+ This is text without indentation.
+ The line length has been set to 3\~inches.
+ .in +.5i
+ .ll -.5i
+ Now the left and right margins are both increased.
+ .in
+ .ll
+ Calling .in and .ll without parameters restores
+ the previous values.
+
+ => This is text without indenta-
+ => tion. The line length has
+ => been set to 3 inches.
+ => Now the left and
+ => right margins are
+ => both increased.
+ => Calling .in and .ll without
+ => parameters restores the previ-
+ => ous values.
+
+ -- Request: .po [offset]
+ -- Request: .po +offset
+ -- Request: .po -offset
+ -- Register: \n[.o]
+ Set page offset to OFFSET (or increment or decrement its current
+ value by OFFSET). If invoked without an argument, the page offset
+ is restored to the value before the previous 'po' request. This
+ request does not cause a break; the page offset in effect when an
+ output line is broken prevails (*note Manipulating Filling and
+ Adjustment::). The initial value is 1i and the default scaling
+ unit is 'm'. On terminal devices, the page offset is set to zero
+ by a driver-specific macro file, 'tty.tmac'. The current page
+ offset can be found in the read-only register '.o'. This request
+ is incorrectly documented in the AT&T 'troff' manual as using a
+ default scaling unit of 'v'.
+
+ .po 3i
+ \n[.o]
+ => 720
+ .po -1i
+ \n[.o]
+ => 480
+ .po
+ \n[.o]
+ => 720
+
+ -- Request: .in [indent]
+ -- Request: .in +indent
+ -- Request: .in -indent
+ -- Register: \n[.i]
+ Set indentation to INDENT (or increment or decrement the current
+ value by INDENT). This request causes a break. Initially, there
+ is no indentation.
+
+ If 'in' is called without an argument, the indentation is reset to
+ the previous value before the last call to 'in'. The default
+ scaling unit is 'm'.
+
+ If a negative indentation value is specified (which is not
+ allowed), 'gtroff' emits a warning in category 'range' and sets the
+ indentation to zero.
+
+ The effect of 'in' is delayed until a partially collected line (if
+ it exists) is output. A temporary indentation value is reset to
+ zero also.
+
+ The current indentation (as set by 'in') can be found in the
+ read-only register '.i'. The indentation is associated with the
+ environment (*note Environments::).
+
+ -- Request: .ti offset
+ -- Request: .ti +offset
+ -- Request: .ti -offset
+ -- Register: \n[.in]
+ Temporarily indent the next output line by OFFSET. If an increment
+ or decrement value is specified, adjust the temporary indentation
+ relative to the value set by the 'in' request.
+
+ This request causes a break; its value is associated with the
+ environment (*note Environments::). The default scaling unit is
+ 'm'. A call of 'ti' without an argument is ignored.
+
+ If the total indentation value is negative (which is not allowed),
+ 'gtroff' emits a warning in category 'range' and sets the temporary
+ indentation to zero. 'Total indentation' is either OFFSET if
+ specified as an absolute value, or the temporary plus normal
+ indentation, if OFFSET is given as a relative value.
+
+ The effect of 'ti' is delayed until a partially collected line (if
+ it exists) is output.
+
+ The read-only register '.in' is the indentation that applies to the
+ current output line.
+
+ The difference between '.i' and '.in' is that the latter takes into
+ account whether a partially collected line still uses the old
+ indentation value or a temporary indentation value is active.
+
+ -- Request: .ll [length]
+ -- Request: .ll +length
+ -- Request: .ll -length
+ -- Register: \n[.l]
+ -- Register: \n[.ll]
+ Set the line length to LENGTH (or increment or decrement the
+ current value by LENGTH). Initially, the line length is set to
+ 6.5i. The effect of 'll' is delayed until a partially collected
+ line (if it exists) is output. The default scaling unit is 'm'.
+
+ If 'll' is called without an argument, the line length is reset to
+ the previous value before the last call to 'll'. If a negative
+ line length is specified (which is not allowed), 'gtroff' emits a
+ warning in category 'range' and sets the line length to zero. The
+ line length is associated with the environment (*note
+ Environments::).
+
+ The current line length (as set by 'll') can be found in the
+ read-only register '.l'. The read-only register '.ll' is the line
+ length that applies to the current output line.
+
+ Similar to '.i' and '.in', the difference between '.l' and '.ll' is
+ that the latter takes into account whether a partially collected
+ line still uses the old line length value.
+
+
+File: groff.info, Node: Line Continuation, Next: Page Layout, Prev: Line Layout, Up: GNU troff Reference
+
+5.16 Line Continuation
+======================
+
+When filling is enabled, input and output line breaks generally do not
+correspond. The 'roff' language therefore distinguishes input and
+output line continuation.
+
+ -- Escape sequence: \<RET>
+ '\<RET>' (a backslash immediately followed by a newline) suppresses
+ the effects of that newline in the input. The next input line thus
+ retains the classification of its predecessor as a control or text
+ line. '\<RET>' is useful for managing line lengths in the input
+ during document maintenance; you can break an input line in the
+ middle of a request invocation, macro call, or escape sequence.
+ Input line continuation is invisible to the formatter, with two
+ exceptions: the '|' operator recognizes the new input line (*note
+ Numeric Expressions::), and the input line counter register '.c' is
+ incremented.
+
+ .ll 50n
+ .de I
+ . ft I
+ . nop \\$*
+ . ft
+ ..
+ Our film class watched
+ .I The Effect of Gamma Rays on Man-in-the-Moon
+ Marigolds. \" whoops, the input line wrapped
+ .br
+ .I My own opus begins on line \n[.c] \
+ and ends on line \n[.c].
+ => Our film class watched The Effect of Gamma Rays on
+ => Man-in-the-Moon Marigolds.
+ => My own opus begins on line 11 and ends on line 12.
+
+ -- Escape sequence: \c
+ -- Register: \n[.int]
+ '\c' continues an output line. Nothing after it on the input line
+ is formatted. In contrast to '\<RET>', a line after '\c' remains a
+ new input line, so a control character is recognized at its
+ beginning. The visual results depend on whether filling is
+ enabled; see *note Manipulating Filling and Adjustment::.
+
+ * If filling is enabled, a word interrupted with '\c' is
+ continued with the text on the next input text line, without
+ an intervening space.
+
+ This is a te\c
+ st.
+ => This is a test.
+
+ * If filling is disabled, the next input text line after '\c' is
+ handled as a continuation of the same input text line.
+
+ .nf
+ This is a \c
+ test.
+ => This is a test.
+
+ An intervening control line that causes a break overrides '\c',
+ flushing out the pending output line in the usual way.
+
+ The '.int' register contains a positive value if the last output
+ line was continued with '\c'; this datum is associated with the
+ environment (*note Environments::).(1) (*note Line
+ Continuation-Footnote-1::)
+
+
+File: groff.info, Node: Line Continuation-Footnotes, Up: Line Continuation
+
+ (1) Historically, the '\c' escape sequence has proven challenging to
+characterize. Some sources say it "connects the next input text" (to
+the input line on which it appears); others describe it as
+"interrupting" text, on the grounds that a text line is interrupted
+without breaking, perhaps to inject a request invocation or macro call.
+
+
+File: groff.info, Node: Page Layout, Next: Page Control, Prev: Line Continuation, Up: GNU troff Reference
+
+5.17 Page Layout
+================
+
+The formatter permits configuration of the page length and page number.
+
+ -- Request: .pl [length]
+ -- Request: .pl +length
+ -- Request: .pl -length
+ -- Register: \n[.p]
+ Change (increase or decrease) the page length per the numeric
+ expression LENGTH. The default scaling unit is 'v'. A negative
+ LENGTH is valid, but an uncommon application: it prevents page
+ location traps from being sprung,(1) (*note Page
+ Layout-Footnote-1::) and each output line is placed on a new page.
+ If LENGTH is invalid, GNU 'troff' emits a warning in category
+ 'number'. If LENGTH is absent or invalid, '11i' is assumed.
+
+ The read-only register '.p' interpolates the current page length.
+
+ -- Request: .pn num
+ -- Request: .pn +num
+ -- Request: .pn -num
+ -- Register: \n[.pn]
+ Change (increase or decrease) the page number of the _next_ page
+ per the numeric expression NUM. If NUM is invalid, GNU 'troff'
+ emits a warning in category 'number' and ignores the request.
+ Without an argument, 'pn' is ignored.
+
+ The read-only register '.pn' interpolates NUM if set by 'pn' on the
+ current page, or the current page number plus 1.
+
+ The formatter offers special support for typesetting headers and
+footers, collectively termed "titles". Titles have an independent line
+length, and their placement on the page is not restricted.
+
+ -- Request: .tl 'left'center'right'
+ Format an output line as a title consisting of LEFT, CENTER, and
+ RIGHT, each aligned accordingly. The delimiter need not be a
+ neutral apostrophe: 'tl' accepts the same delimiters as most escape
+ sequences; see *note Delimiters::. If not used as the delimiter,
+ any "page number character" character is replaced with the current
+ page number; the default is '%'; see the the 'pc' request below.
+ Without an argument, 'tl' is ignored. 'tl' writes the title line
+ immediately, ignoring any partially collected line.
+
+ It is not an error to omit delimiters after the first. For
+ example, '.tl /Thesis' is interpreted as '.tl /Thesis///': it sets
+ a title line comprising only the left-aligned word 'Thesis'.
+
+ -- Request: .lt [length]
+ -- Request: .lt +length
+ -- Request: .lt -length
+ -- Register: \n[.lt]
+ Change (increase or decrease) the line length used by titles per
+ the numeric expression LENGTH. The default scaling unit is 'm'.
+ If LENGTH is negative, GNU emits a warning in category 'range' and
+ treats LENGTH as '0'. If LENGTH is invalid, GNU 'troff' emits a
+ warning in category 'number' and ignores the request. The
+ formatter's default title length is '6.5i'. With no argument, the
+ title length is restored to the previous value. The title length
+ is is associated with the environment (*note Environments::).
+
+ The read-only register '.lt' interpolates the title line length.
+
+ -- Request: .pc [char]
+ Set the page number character to CHAR. With no argument, the page
+ number character is disabled. 'pc' does not affect the
+ register '%'.
+
+ The following example exercises title features.
+
+ .lt 50n
+ This is my partially collected
+ .tl 'Isomers 2023'%'Dextrose Edition'
+ line.
+ => Isomers 2023 1 Dextrose Edition
+ => This is my partially collected line.
+
+ We most often see titles used in page header and footer traps. *Note
+Traps::.
+
+
+File: groff.info, Node: Page Layout-Footnotes, Up: Page Layout
+
+ (1) *Note Traps::.
+
+
+File: groff.info, Node: Page Control, Next: Using Fonts, Prev: Page Layout, Up: GNU troff Reference
+
+5.18 Page Control
+=================
+
+Discretionary page breaks can prevent the unwanted separation of
+content. A new page number takes effect during page ejection; see *note
+The Implicit Page Trap::.
+
+ -- Request: .bp [page-number]
+ -- Request: .bp +page-number
+ -- Request: .bp -page-number
+ -- Register: \n[%]
+ Break the page and change (increase or decrease) the next page
+ number per the numeric expression PAGE-NUMBER. If PAGE-NUMBER is
+ invalid, GNU 'troff' emits a warning in category 'number' and
+ ignores the argument. This request causes a break. A page break
+ advances the vertical drawing position to the bottom of the page,
+ springing traps. *Note Page Location Traps::. 'bp' has effect
+ only if invoked within the top-level diversion.(1) (*note Page
+ Control-Footnote-1::) This request is incorrectly documented in the
+ AT&T 'troff' manual as having a default scaling unit of 'v'.
+
+ The register '%' interpolates the current page number.
+
+ .de BP
+ ' bp \" schedule page break once current line is output
+ ..
+
+ -- Request: .ne [space]
+ Force a page break if insufficient vertical space is available
+ (assert "needed" space). 'ne' tests the distance to the next page
+ location trap; see *note Page Location Traps::, and breaks the page
+ if that amount is less than SPACE. The default scaling unit is
+ 'v'. If SPACE is invalid, GNU 'troff' emits a warning in category
+ 'number' and ignores the argument. If SPACE is not specified, '1v'
+ is assumed.
+
+ We can require space for at least the first two output lines of a
+ paragraph, preventing its first line from being widowed at the page
+ bottom.
+
+ .ne 2v
+ Considering how common illness is,
+ how tremendous the spiritual change that it brings,
+ how astonishing,
+ when the lights of health go down,
+ the undiscovered countries that are then disclosed,
+ what wastes and deserts of the soul a slight attack
+ of influenza brings to view,
+
+ This method is reliable only if no output line is pending when 'ne'
+ is invoked. When macro packages are used, this is often not the
+ case: their paragraphing macros perform the break. You may need to
+ experiment with placing the 'ne' after the paragraphing macro, or
+ 'br' and 'ne' before it.
+
+ 'ne' is also useful to force grouping of section headings with
+ their subsequent paragraphs, or tables with their captions and/or
+ explanations. Macro packages often use 'ne' with diversions to
+ implement keeps and displays; see *note Diversions::. They may
+ also offer parameters for widow and orphan management.
+
+ -- Request: .sv [space]
+ -- Request: .os
+ Require vertical space as 'ne' does, but also save it for later
+ output by the 'os' request. If SPACE is available before the next
+ page location trap, it is output immediately. Both requests ignore
+ a partially collected line, taking effect at the next break. 'sv'
+ and 'os' ignore no-space mode (recall *note Manipulating
+ Spacing::). While the 'sv' request allows negative values for
+ SPACE, 'os' ignores them. The default scaling unit is 'v'. If
+ SPACE is not specified, '1v' is assumed.
+
+ -- Register: \n[nl]
+ 'nl' interpolates or sets the vertical drawing position. When the
+ formatter starts, the first page transition hasn't happened yet,
+ and 'nl' is negative. If a header trap has been planted on the
+ page (typically at vertical position '0'), you can assign a
+ negative value to 'nl' to spring it if that page has already
+ started (*note Page Location Traps::).
+
+ .de HD
+ . sp
+ . tl ''Goldbach Solution''
+ . sp
+ ..
+ .
+ First page.
+ .bp
+ .wh 0 HD \" plant header trap at top of page
+ .nr nl (-1)
+ Second page.
+ => First page.
+ =>
+ => (blank lines elided)
+ =>
+ => Goldbach Solution
+ =>
+ => (blank lines elided)
+ =>
+ => Second page.
+
+ Without resetting 'nl' to a negative value, the trap just planted
+ would be active beginning with the _next_ page, not the current
+ one.
+
+ *Note Diversions::, for a comparison of 'nl' with the '.h' and '.d'
+ registers.
+
+
+File: groff.info, Node: Page Control-Footnotes, Up: Page Control
+
+ (1) *Note Diversions::.
+
+
+File: groff.info, Node: Using Fonts, Next: Manipulating Type Size and Vertical Spacing, Prev: Page Control, Up: GNU troff Reference
+
+5.19 Using Fonts
+================
+
+In digital typography, a "font" is a collection of characters in a
+specific typeface that a device can render as glyphs at a desired
+size.(1) (*note Using Fonts-Footnote-1::) A 'roff' formatter can change
+typefaces at any point in the text. The basic faces are a set of
+"styles" combining upright and slanted shapes with normal and heavy
+stroke weights: 'R', 'I', 'B', and 'BI'--these stand for roman, italic,
+bold, and bold-italic. For linguistic text, GNU 'troff' groups
+typefaces into "families" containing each of these styles.(2) (*note
+Using Fonts-Footnote-2::) A "text font" is thus often a family combined
+with a style, but it need not be: consider the 'ps' and 'pdf' devices'
+'ZCMI' (Zapf Chancery Medium italic)--often, no other style of Zapf
+Chancery Medium is provided. On typesetting devices, at least one
+"special font" is available, comprising "unstyled" glyphs for
+mathematical operators and other purposes.
+
+ Like AT&T 'troff', GNU 'troff' does not itself load or manipulate a
+digital font file;(3) (*note Using Fonts-Footnote-3::) instead it works
+with a "font description file" that characterizes it, including its
+glyph repertoire and the "metrics" (dimensions) of each glyph.(4)
+(*note Using Fonts-Footnote-4::) This information permits the formatter
+to accurately place glyphs with respect to each other. Before using a
+font description, the formatter associates it with a "mounting
+position", a place in an ordered list of available typefaces. So that a
+document need not be strongly coupled to a specific font family, in GNU
+'troff' an output device can associate a style in the abstract sense
+with a mounting position. Thus the default family can be combined with
+a style dynamically, producing a "resolved font name".
+
+ Fonts often have trademarked names, and even Free Software fonts can
+require renaming upon modification. 'groff' maintains a convention that
+a device's serif font family is given the name 'T' ("Times"), its
+sans-serif family 'H' ("Helvetica"), and its monospaced family 'C'
+("Courier"). Historical inertia has driven 'groff''s font identifiers
+to short uppercase abbreviations of font names, as with 'TR', 'TI',
+'TB', 'TBI', and a special font 'S'.
+
+ The default family used with abstract styles can be changed at any
+time; initially, it is 'T'. Typically, abstract styles are arranged in
+the first four mounting positions in the order shown above. The default
+mounting position, and therefore style, is always '1' ('R'). By issuing
+appropriate formatter instructions, you can override these defaults
+before your document writes its first glyph.
+
+ Terminal output devices cannot change font families and lack special
+fonts. They support style changes by overstriking, or by altering
+ISO 6429/ECMA-48 "graphic renditions" (character cell attributes).
+
+* Menu:
+
+* Selecting Fonts::
+* Font Families::
+* Font Positions::
+* Using Symbols::
+* Character Classes::
+* Special Fonts::
+* Artificial Fonts::
+* Ligatures and Kerning::
+* Italic Corrections::
+* Dummy Characters::
+
+
+File: groff.info, Node: Using Fonts-Footnotes, Up: Using Fonts
+
+ (1) Terminals and some output devices have fonts that render at only
+one or two sizes. As examples of the latter, take the 'groff' 'lj4'
+device's Lineprinter, and 'lbp''s Courier and Elite faces.
+
+ (2) Font designers prepare families such that the styles share
+esthetic properties.
+
+ (3) Historically, the fonts 'troff's dealt with were not Free
+Software or, as with the Graphic Systems C/A/T, did not even exist in
+the digital domain.
+
+ (4) *Note Font Description File Format::.
+
diff --git a/doc/groff.info-2 b/doc/groff.info-2
new file mode 100644
index 0000000..44572a0
--- /dev/null
+++ b/doc/groff.info-2
@@ -0,0 +1,7529 @@
+This is groff.info, produced by makeinfo version 7.0.3 from groff.texi.
+
+This manual documents GNU 'troff' version 1.23.0.
+
+ Copyright © 1994-2023 Free Software Foundation, Inc.
+
+ Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU Free Documentation License,
+ Version 1.3 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".
+INFO-DIR-SECTION Typesetting
+START-INFO-DIR-ENTRY
+* Groff: (groff). The GNU roff document formatting system.
+END-INFO-DIR-ENTRY
+
+
+File: groff.info, Node: Selecting Fonts, Next: Font Families, Prev: Using Fonts, Up: Using Fonts
+
+5.19.1 Selecting Fonts
+----------------------
+
+We use "font" to refer to any of several means of identifying a font: by
+mounting position ('3'), by abstract style ('B'), or by its identifier
+('TB').
+
+ -- Request: .ft [font]
+ -- Escape sequence: \ff
+ -- Escape sequence: \f(fn
+ -- Escape sequence: \f[font]
+ -- Register: \n[.fn]
+ The 'ft' request selects the typeface FONT. If the argument is
+ absent or 'P', it selects the previously chosen font. If FONT is a
+ non-negative integer, it is interpreted as mounting position; the
+ font mounted there is selected. If that position refers to an
+ abstract style, it is combined with the default family (see 'fam'
+ and '\F' below) to make a resolved font name. If the mounting
+ position is not a style and no font is mounted there, GNU 'troff'
+ emits a warning in category 'font' and ignores the request.
+
+ If FONT matches a style name, it is combined with the current
+ family to make a resolved font name. Otherwise, FONT is assumed to
+ already be a resolved font name.
+
+ The resolved font name is subject to translation (see request 'ftr'
+ below). Next, the (possibly translated) font name's mounting
+ position is looked up; if not mounted, FONT is sought on the file
+ system as a font description file and, if located, automatically
+ mounted at the next available position (see register '.fp' below).
+ If the font was mounted using an identifier different from its font
+ description file name (see request 'fp' below), that file name is
+ then looked up. If a font description file for the resolved font
+ name is not found, GNU 'troff' emits a warning in category 'font'
+ and ignores the request.
+
+ The '\f' escape sequence is similar, using one-character name (or
+ mounting position) F, two-character name FN, or a name FONT of
+ arbitrary length. '\f[]' selects the previous font. The syntax
+ form '\fP' is supported for backward compatibility, and '\f[P]' for
+ consistency.
+
+ eggs, bacon,
+ .ft I
+ spam,
+ .ft
+ and sausage.
+ .br
+ eggs, bacon, \fIspam,\fP and sausage.
+ => eggs, bacon, spam, and sausage
+ => eggs, bacon, spam, and sausage
+
+ The current and previously selected fonts are properties of the
+ environment (*note Environments::).
+
+ The read-only string-valued register '.fn' contains the resolved
+ font name of the selected font.
+
+ '\f' doesn't produce an input token in GNU 'troff'; it thus can be
+ used in requests that expect a single-character argument. We can
+ assign a font to a margin character as follows (*note
+ Miscellaneous::).
+
+ .mc \f[I]x\f[]
+
+ -- Request: .ftr f [g]
+ Translate font F to font G. Whenever a font named F is referred to
+ in a '\f' escape sequence, in the 'F' and 'S' conditional
+ operators, or in the 'ft', 'ul', 'bd', 'cs', 'tkf', 'special',
+ 'fspecial', 'fp', or 'sty' requests, font G is used. If G is
+ missing or equal to F the translation is undone.
+
+ Font translations cannot be chained.
+
+ .ftr XXX TR
+ .ftr XXX YYY
+ .ft XXX
+ error-> warning: can't find font 'XXX'
+
+ -- Request: .fzoom f [zoom]
+ -- Register: \n[.zoom]
+ Set magnification of font F to factor ZOOM, which must be a
+ non-negative integer multiple of 1/1000th. This request is useful
+ to adjust the optical size of a font in relation to the others. In
+ the example below, font 'CR' is magnified by 10% (the zoom factor
+ is thus 1.1).
+
+ .fam P
+ .fzoom CR 1100
+ .ps 12
+ Palatino and \f[CR]Courier\f[]
+
+ A missing or zero value of ZOOM is the same as a value of 1000,
+ which means no magnification. F must be a resolved font name, not
+ an abstract style.
+
+ The magnification of a font is completely transparent to GNU
+ 'troff'; a change of the zoom factor doesn't cause any effect
+ except that the dimensions of glyphs, (word) spaces, kerns, etc.,
+ of the affected font are adjusted accordingly.
+
+ The zoom factor of the current font is available in the read-only
+ register '.zoom', in multiples of 1/1000th. It returns zero if
+ there is no magnification.
+
+
+File: groff.info, Node: Font Families, Next: Font Positions, Prev: Selecting Fonts, Up: Using Fonts
+
+5.19.2 Font Families
+--------------------
+
+To accommodate the wide variety of fonts available, GNU 'troff'
+distinguishes "font families" and "font styles". A resolved font name
+is the catenation of a font family and a style. Selecting an abstract
+style causes GNU 'troff' to combine it with the default font family.
+
+ You can thus compose a document using abstract styles exclusively for
+its body or running text, selecting a specific family only for titles or
+examples, for instance, and change the default family on the command
+line (recall *note Groff Options::).
+
+ Fonts for the devices 'ps', 'pdf', 'dvi', 'lj4', 'lbp', and the X11
+devices support this mechanism. By default, GNU 'troff' uses the Times
+family with the four styles 'R', 'I', 'B', and 'BI'.
+
+ -- Request: .fam [family]
+ -- Register: \n[.fam]
+ -- Escape sequence: \Ff
+ -- Escape sequence: \F(fm
+ -- Escape sequence: \F[family]
+ Set the default font family, used in combination with abstract
+ styles to construct a resolved font name, to FAMILY (one-character
+ name F, two-character name FM). If no argument is given, GNU
+ 'troff' selects the previous font family; if there none, is it
+ falls back to the device's default(1) (*note Font
+ Families-Footnote-1::) or its own ('T').
+
+ The '\F' escape sequence works similarly. In disanalogy to '\f',
+ '\FP' makes 'P' the default family. Use '\F[]' to select the
+ previous default family. The default font family is available in
+ the read-only string-valued register '.fam'; it is associated with
+ the environment (*note Environments::).
+
+ spam, \" startup defaults are T (Times) R (roman)
+ .fam H \" make Helvetica the default family
+ spam, \" family H + style R = HR
+ .ft B \" family H + style B = HB
+ spam,
+ .ft CR \" Courier roman (default family not changed)
+ spam,
+ .ft \" back to Helvetica bold
+ spam,
+ .fam T \" make Times the default family
+ spam, \" family T + style B = TB
+ .ft AR \" font AR (not a style)
+ baked beans,
+ .ft R \" family T + style R = TR
+ and spam.
+
+ '\F' doesn't produce an input token in GNU 'troff'. As a
+ consequence, it can be used in requests like 'mc' (which expects a
+ single character as an argument) to change the font family on the
+ fly.
+
+ .mc \F[P]x\F[]
+
+ -- Request: .sty n style
+ -- Register: \n[.sty]
+ Associate an abstract style STYLE with mounting position N, which
+ must be a non-negative integer. If the requests 'cs', 'bd', 'tkf',
+ 'uf', or 'fspecial' are applied to an abstract style, they are
+ instead applied to the member of the current family corresponding
+ to that style.
+
+ The default family can be set with the '-f' option (*note Groff
+ Options::). The 'styles' command in the 'DESC' file controls which
+ font positions (if any) are initially associated with abstract
+ styles rather than fonts.
+
+ *Caution:* The STYLE argument is not validated. Errors may occur
+ later, when the formatter attempts to construct a resolved font
+ name, or format a character for output.
+
+ .nr BarPos \n[.fp]
+ .sty \n[.fp] Bar
+ .fam Foo
+ .ft \n[BarPos]
+ .tm .f=\n[.f]
+ A
+ error-> error: no font family named 'Foo' exists
+ error-> .f=41
+ error-> error: cannot format glyph: no current font
+
+ When an abstract style has been selected, the read-only
+ string-valued register '.sty' interpolates its name; this datum is
+ associated with the environment (*note Environments::). Otherwise,
+ '.sty' interpolates nothing.
+
+
+File: groff.info, Node: Font Families-Footnotes, Up: Font Families
+
+ (1) *Note DESC File Format::.
+
+
+File: groff.info, Node: Font Positions, Next: Using Symbols, Prev: Font Families, Up: Using Fonts
+
+5.19.3 Font Positions
+---------------------
+
+To support typeface indirection through abstract styles, and for
+compatibility with AT&T 'troff', the formatter maintains a list of font
+"positions" at which fonts required by a document are "mounted". An
+output device's description file 'DESC' typically configures a set of
+pre-mounted fonts; see *note Device and Font Description Files::. A
+font need not be explicitly mounted before it is selected; GNU 'troff'
+will search 'GROFF_FONT_PATH' for it by name and mount it at the first
+free mounting position on demand.
+
+ -- Request: .fp pos id [font-description-file-name]
+ -- Register: \n[.f]
+ -- Register: \n[.fp]
+ Mount a font under the name ID at mounting position POS, a
+ non-negative integer. When the formatter starts up, it reads the
+ output device's description to mount an initial set of faces, and
+ selects font position 1. Position 0 is unused by default. Unless
+ the FONT-DESCRIPTION-FILE-NAME argument is given, ID should be the
+ name of a font description file stored in a directory corresponding
+ to the selected output device. GNU 'troff' does not traverse
+ directories to locate the font description file.
+
+ The optional third argument enables font names to be aliased, which
+ can be necessary in compatibility mode since AT&T 'troff' syntax
+ affords no means of identifying fonts with names longer than two
+ characters, like 'TBI' or 'ZCMI', in a font selection escape
+ sequence. *Note Compatibility Mode::. You can also alias fonts on
+ mounting for convenience or abstraction. (See below regarding the
+ '.fp' register.)
+
+ .fp \n[.fp] SC ZCMI
+ Send a \f(SChand-written\fP thank-you note.
+ .fp \n[.fp] Emph TI
+ .fp \n[.fp] Strong TB
+ Are \f[Emph]these names\f[] \f[Strong]comfortable\f[]?
+
+ 'DESC', 'P', and non-negative integers are not usable as font
+ identifiers.
+
+ The position of the currently selected font (or abstract style) is
+ available in the read-only register '.f'. It is associated with
+ the environment (*note Environments::).
+
+ You can copy the value of '.f' to another register to save it for
+ later use.
+
+ .nr saved-font \n[.f]
+ ... text involving many font changes ...
+ .ft \n[saved-font]
+
+ The index of the next (non-zero) free font position is available in
+ the read-only register '.fp'. Fonts not listed in the 'DESC' file
+ are automatically mounted at position '\n[.fp]' when selected with
+ the 'ft' request or '\f' escape sequence. When mounting a font at
+ a position explicitly with the 'fp' request, this same practice
+ should be followed, although GNU 'troff' does not enforce this
+ strictly.
+
+
+File: groff.info, Node: Using Symbols, Next: Character Classes, Prev: Font Positions, Up: Using Fonts
+
+5.19.4 Using Symbols
+--------------------
+
+A "glyph" is a graphical representation of a "character". While a
+character is an abstraction of semantic information, a glyph is
+something that can be seen on screen or paper. A character has many
+possible representation forms (for example, the character 'A' can be
+written in an upright or slanted typeface, producing distinct glyphs).
+Sometimes, a sequence of characters map to a single glyph: this is a
+"ligature"--the most common is 'fi'.
+
+ Space characters never become glyphs in GNU 'troff'. If not
+discarded (as when trailing on text lines), they are represented by
+horizontal motions in the output.
+
+ A "symbol" is simply a named glyph. Within 'gtroff', all glyph names
+of a particular font are defined in its font file. If the user requests
+a glyph not available in this font, 'gtroff' looks up an ordered list of
+"special fonts". By default, the PostScript output device supports the
+two special fonts 'SS' (slanted symbols) and 'S' (symbols) (the former
+is looked up before the latter). Other output devices use different
+names for special fonts. Fonts mounted with the 'fonts' keyword in the
+'DESC' file are globally available. To install additional special fonts
+locally (i.e., for a particular font), use the 'fspecial' request.
+
+ Here are the exact rules how 'gtroff' searches a given symbol:
+
+ * If the symbol has been defined with the 'char' request, use it.
+ This hides a symbol with the same name in the current font.
+
+ * Check the current font.
+
+ * If the symbol has been defined with the 'fchar' request, use it.
+
+ * Check whether the current font has a font-specific list of special
+ fonts; test all fonts in the order of appearance in the last
+ 'fspecial' call if appropriate.
+
+ * If the symbol has been defined with the 'fschar' request for the
+ current font, use it.
+
+ * Check all fonts in the order of appearance in the last 'special'
+ call.
+
+ * If the symbol has been defined with the 'schar' request, use it.
+
+ * As a last resort, consult all fonts loaded up to now for special
+ fonts and check them, starting with the lowest font number. This
+ can sometimes lead to surprising results since the 'fonts' line in
+ the 'DESC' file often contains empty positions, which are filled
+ later on. For example, consider the following:
+
+ fonts 3 0 0 FOO
+
+ This mounts font 'foo' at font position 3. We assume that 'FOO' is
+ a special font, containing glyph 'foo', and that no font has been
+ loaded yet. The line
+
+ .fspecial BAR BAZ
+
+ makes font 'BAZ' special only if font 'BAR' is active. We further
+ assume that 'BAZ' is really a special font, i.e., the font
+ description file contains the 'special' keyword, and that it also
+ contains glyph 'foo' with a special shape fitting to font 'BAR'.
+ After executing 'fspecial', font 'BAR' is loaded at font
+ position 1, and 'BAZ' at position 2.
+
+ We now switch to a new font 'XXX', trying to access glyph 'foo'
+ that is assumed to be missing. There are neither font-specific
+ special fonts for 'XXX' nor any other fonts made special with the
+ 'special' request, so 'gtroff' starts the search for special fonts
+ in the list of already mounted fonts, with increasing font
+ positions. Consequently, it finds 'BAZ' before 'FOO' even for
+ 'XXX', which is not the intended behaviour.
+
+ *Note Device and Font Description Files::, and *note Special Fonts::,
+for more details.
+
+ The 'groff_char(7)' man page houses a complete list of predefined
+special character names, but the availability of any as a glyph is
+device- and font-dependent. For example, say
+
+ man -Tdvi groff_char > groff_char.dvi
+
+to obtain those available with the DVI device and default font
+configuration.(1) (*note Using Symbols-Footnote-1::) If you want to use
+an additional macro package to change the fonts used, 'groff' (or
+'gtroff') must be run directly.
+
+ groff -Tdvi -mec -man groff_char.7 > groff_char.dvi
+
+ Special character names not listed in 'groff_char(7)' are derived
+algorithmically, using a simplified version of the Adobe Glyph List
+(AGL) algorithm, which is described in
+<https://github.com/adobe-type-tools/agl-aglfn>. The (frozen) set of
+names that can't be derived algorithmically is called the "'groff' glyph
+list (GGL)".
+
+ * A glyph for Unicode character U+XXXX[X[X]], which is not a
+ composite character is named 'uXXXX[X[X]]'. X must be an uppercase
+ hexadecimal digit. Examples: 'u1234', 'u008E', 'u12DB8'. The
+ largest Unicode value is 0x10FFFF. There must be at least four 'X'
+ digits; if necessary, add leading zeroes (after the 'u'). No zero
+ padding is allowed for character codes greater than 0xFFFF.
+ Surrogates (i.e., Unicode values greater than 0xFFFF represented
+ with character codes from the surrogate area U+D800-U+DFFF) are not
+ allowed either.
+
+ * A glyph representing more than a single input character is named
+
+ 'u' COMPONENT1 '_' COMPONENT2 '_' COMPONENT3 ...
+
+ Example: 'u0045_0302_0301'.
+
+ For simplicity, all Unicode characters that are composites must be
+ maximally decomposed to NFD;(2) (*note Using Symbols-Footnote-2::)
+ for example, 'u00CA_0301' is not a valid glyph name since U+00CA
+ (LATIN CAPITAL LETTER E WITH CIRCUMFLEX) can be further decomposed
+ into U+0045 (LATIN CAPITAL LETTER E) and U+0302 (COMBINING
+ CIRCUMFLEX ACCENT). 'u0045_0302_0301' is thus the glyph name for
+ U+1EBE, LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE.
+
+ * groff maintains a table to decompose all algorithmically derived
+ glyph names that are composites itself. For example, 'u0100'
+ (LATIN LETTER A WITH MACRON) is automatically decomposed into
+ 'u0041_0304'. Additionally, a glyph name of the GGL is preferred
+ to an algorithmically derived glyph name; 'groff' also
+ automatically does the mapping. Example: The glyph 'u0045_0302' is
+ mapped to '^E'.
+
+ * glyph names of the GGL can't be used in composite glyph names; for
+ example, '^E_u0301' is invalid.
+
+ -- Escape sequence: \(nm
+ -- Escape sequence: \[name]
+ -- Escape sequence: \[base-glyph combining-component ...]
+ Typeset a special character NAME (two-character name NM) or a
+ composite glyph consisting of BASE-GLYPH overlaid with one or more
+ COMBINING-COMPONENTs. For example, '\[A ho]' is a capital letter
+ "A" with a "hook accent" (ogonek).
+
+ There is no special syntax for one-character names--the analogous
+ form '\N' would collide with other escape sequences. However, the
+ four escape sequences '\'', '\-', '\_', and '\`', are translated on
+ input to the special character escape sequences '\[aa]', '\[-]',
+ '\[ul]', and '\[ga]', respectively.
+
+ A special character name of length one is not the same thing as an
+ ordinary character: that is, the character 'a' is not the same as
+ '\[a]'.
+
+ If NAME is undefined, a warning in category 'char' is produced and
+ the escape is ignored. *Note Warnings::, for information about the
+ enablement and suppression of warnings.
+
+ GNU 'troff' resolves '\[...]' with more than a single component as
+ follows:
+
+ * Any component that is found in the GGL is converted to the
+ 'uXXXX' form.
+
+ * Any component 'uXXXX' that is found in the list of
+ decomposable glyphs is decomposed.
+
+ * The resulting elements are then concatenated with '_' in
+ between, dropping the leading 'u' in all elements but the
+ first.
+
+ No check for the existence of any component (similar to 'tr'
+ request) is done.
+
+ Examples:
+
+ '\[A ho]'
+ 'A' maps to 'u0041', 'ho' maps to 'u02DB', thus the final
+ glyph name would be 'u0041_02DB'. This is not the expected
+ result: the ogonek glyph 'ho' is a spacing ogonek, but for a
+ proper composite a non-spacing ogonek (U+0328) is necessary.
+ Looking into the file 'composite.tmac', one can find
+ '.composite ho u0328', which changes the mapping of 'ho' while
+ a composite glyph name is constructed, causing the final glyph
+ name to be 'u0041_0328'.
+
+ '\[^E u0301]'
+ '\[^E aa]'
+ '\[E a^ aa]'
+ '\[E ^ ']'
+ '^E' maps to 'u0045_0302', thus the final glyph name is
+ 'u0045_0302_0301' in all forms (assuming proper calls of the
+ 'composite' request).
+
+ It is not possible to define glyphs with names like 'A ho' within a
+ 'groff' font file. This is not really a limitation; instead, you
+ have to define 'u0041_0328'.
+
+ -- Escape sequence: \C'xxx'
+ Typeset the glyph of the special character XXX. Normally, it is
+ more convenient to use '\[XXX]', but '\C' has some advantages: it
+ is compatible with AT&T device-independent 'troff' (and therefore
+ available in compatibility mode(3) (*note Using
+ Symbols-Footnote-3::)) and can interpolate special characters with
+ ']' in their names. The delimiter need not be a neutral
+ apostrophe; see *note Delimiters::.
+
+ -- Request: .composite id1 id2
+ Map special character name ID1 to ID2 if ID1 is used in '\[...]'
+ with more than one component. See above for examples. This is a
+ strict rewriting of the special character name; no check is
+ performed for the existence of a glyph for either. A set of
+ default mappings for many accents can be found in the file
+ 'composite.tmac', loaded by the default 'troffrc' at startup.
+
+ -- Escape sequence: \N'n'
+ Typeset the glyph with code N in the current font ('n' is _not_ the
+ input character code). The number N can be any non-negative
+ decimal integer. Most devices only have glyphs with codes between
+ 0 and 255; the Unicode output device uses codes in the range
+ 0-65535. If the current font does not contain a glyph with that
+ code, special fonts are _not_ searched. The '\N' escape sequence
+ can be conveniently used in conjunction with the 'char' request:
+
+ .char \[phone] \f[ZD]\N'37'
+
+ The code of each glyph is given in the fourth column in the font
+ description file after the 'charset' command. It is possible to
+ include unnamed glyphs in the font description file by using a name
+ of '---'; the '\N' escape sequence is the only way to use these.
+
+ No kerning is applied to glyphs accessed with '\N'. The delimiter
+ need not be a neutral apostrophe; see *note Delimiters::.
+
+ A few escape sequences are also special characters.
+
+ -- Escape sequence: \'
+ An escaped neutral apostrophe is a synonym for '\[aa]' (acute
+ accent).
+
+ -- Escape sequence: \`
+ An escaped grave accent is a synonym for '\[ga]' (grave accent).
+
+ -- Escape sequence: \-
+ An escaped hyphen-minus is a synonym for '\[-]' (minus sign).
+
+ -- Escape sequence: \_
+ An escaped underscore ("low line") is a synonym for '\[ul]'
+ (underrule). On typesetting devices, the underrule is
+ font-invariant and drawn lower than the underscore '_'.
+
+ -- Request: .cflags n c1 c2 ...
+ Assign properties encoded by the number N to characters C1, C2, and
+ so on.
+
+ Input characters, including special characters introduced by an
+ escape, have certain properties associated with them.(4) (*note
+ Using Symbols-Footnote-4::) These properties can be modified with
+ this request. The first argument is the sum of the desired flags
+ and the remaining arguments are the characters to be assigned those
+ properties. Spaces between the CN arguments are optional. Any
+ argument CN can be a character class defined with the 'class'
+ request rather than an individual character. *Note Character
+ Classes::.
+
+ The non-negative integer N is the sum of any of the following.
+ Some combinations are nonsensical, such as '33' (1 + 32).
+
+ '1'
+ Recognize the character as ending a sentence if followed by a
+ newline or two spaces. Initially, characters '.?!' have this
+ property.
+
+ '2'
+ Enable breaks before the character. A line is not broken at a
+ character with this property unless the characters on each
+ side both have non-zero hyphenation codes. This exception can
+ be overridden by adding 64. Initially, no characters have
+ this property.
+
+ '4'
+ Enable breaks after the character. A line is not broken at a
+ character with this property unless the characters on each
+ side both have non-zero hyphenation codes. This exception can
+ be overridden by adding 64. Initially, characters
+ '\-\[hy]\[em]' have this property.
+
+ '8'
+ Mark the glyph associated with this character as overlapping
+ other instances of itself horizontally. Initially, characters
+ '\[ul]\[rn]\[ru]\[radicalex]\[sqrtex]' have this property.
+
+ '16'
+ Mark the glyph associated with this character as overlapping
+ other instances of itself vertically. Initially, the
+ character '\[br]' has this property.
+
+ '32'
+ Mark the character as transparent for the purpose of
+ end-of-sentence recognition. In other words, an
+ end-of-sentence character followed by any number of characters
+ with this property is treated as the end of a sentence if
+ followed by a newline or two spaces. This is the same as
+ having a zero space factor in TeX. Initially, characters
+ '"')]*\[dg]\[dd]\[rq]\[cq]' have this property.
+
+ '64'
+ Ignore hyphenation codes of the surrounding characters. Use
+ this in combination with values 2 and 4 (initially, no
+ characters have this property).
+
+ For example, if you need an automatic break point after the
+ en-dash in numeric ranges like "3000-5000", insert
+
+ .cflags 68 \[en]
+
+ into your document. However, this practice can lead to bad
+ layout if done thoughtlessly; in most situations, a better
+ solution instead of changing the 'cflags' value is to insert
+ '\:' right after the hyphen at the places that really need a
+ break point.
+
+ The remaining values were implemented for East Asian language
+ support; those who use alphabetic scripts exclusively can disregard
+ them.
+
+ '128'
+ Prohibit a line break before the character, but allow a line
+ break after the character. This works only in combination
+ with flags 256 and 512 and has no effect otherwise.
+ Initially, no characters have this property.
+
+ '256'
+ Prohibit a line break after the character, but allow a line
+ break before the character. This works only in combination
+ with flags 128 and 512 and has no effect otherwise.
+ Initially, no characters have this property.
+
+ '512'
+ Allow line break before or after the character. This works
+ only in combination with flags 128 and 256 and has no effect
+ otherwise. Initially, no characters have this property.
+
+ In contrast to values 2 and 4, the values 128, 256, and 512 work
+ pairwise. If, for example, the left character has value 512, and
+ the right character 128, no break will be automatically inserted
+ between them. If we use value 6 instead for the left character, a
+ break after the character can't be suppressed since the neighboring
+ character on the right doesn't get examined.
+
+ -- Request: .char c [contents]
+ -- Request: .fchar c [contents]
+ -- Request: .fschar f c [contents]
+ -- Request: .schar c [contents]
+ Define a new character or glyph C to be CONTENTS, which can be
+ empty. More precisely, 'char' defines a 'groff' object (or
+ redefines an existing one) that is accessed with the name C on
+ input, and produces CONTENTS on output. Every time glyph C needs
+ to be printed, CONTENTS is processed in a temporary environment and
+ the result is wrapped up into a single object. Compatibility mode
+ is turned off and the escape character is set to '\' while CONTENTS
+ is processed. Any emboldening, constant spacing, or track kerning
+ is applied to this object rather than to individual glyphs in
+ CONTENTS.
+
+ An object defined by these requests can be used just like a normal
+ glyph provided by the output device. In particular, other
+ characters can be translated to it with the 'tr' or 'trin'
+ requests; it can be made the leader character with the 'lc'
+ request; repeated patterns can be drawn with it using the '\l' and
+ '\L' escape sequences; and words containing C can be hyphenated
+ correctly if the 'hcode' request is used to give the object a
+ hyphenation code.
+
+ There is a special anti-recursion feature: use of the object within
+ its own definition is handled like a normal character (not defined
+ with 'char').
+
+ The 'tr' and 'trin' requests take precedence if 'char' accesses the
+ same symbol.
+
+ .tr XY
+ X
+ => Y
+ .char X Z
+ X
+ => Y
+ .tr XX
+ X
+ => Z
+
+ The 'fchar' request defines a fallback glyph: 'gtroff' only checks
+ for glyphs defined with 'fchar' if it cannot find the glyph in the
+ current font. 'gtroff' carries out this test before checking
+ special fonts.
+
+ 'fschar' defines a fallback glyph for font F: 'gtroff' checks for
+ glyphs defined with 'fschar' after the list of fonts declared as
+ font-specific special fonts with the 'fspecial' request, but before
+ the list of fonts declared as global special fonts with the
+ 'special' request.
+
+ Finally, the 'schar' request defines a global fallback glyph:
+ 'gtroff' checks for glyphs defined with 'schar' after the list of
+ fonts declared as global special fonts with the 'special' request,
+ but before the already mounted special fonts.
+
+ *Note Character Classes::.
+
+ -- Request: .rchar c ...
+ -- Request: .rfschar f c ...
+ Remove definition of each ordinary or special character C, undoing
+ the effect of a 'char', 'fchar', or 'schar' request. Those
+ supplied by font description files cannot be removed. Spaces and
+ tabs may separate C arguments.
+
+ The request 'rfschar' removes glyph definitions defined with
+ 'fschar' for font F.
+
+
+File: groff.info, Node: Using Symbols-Footnotes, Up: Using Symbols
+
+ (1) Not all versions of the 'man' program support the '-T' option;
+use the subsequent example for an alternative.
+
+ (2) This is "Normalization Form D" as documented in Unicode Standard
+Annex #15 (<https://unicode.org/reports/tr15/>).
+
+ (3) *Note Compatibility Mode::.
+
+ (4) Output glyphs don't--to GNU 'troff', a glyph is simply a box with
+an index into a font, a given height above and depth below the baseline,
+and a width.
+
+
+File: groff.info, Node: Character Classes, Next: Special Fonts, Prev: Using Symbols, Up: Using Fonts
+
+5.19.5 Character Classes
+------------------------
+
+Classes are particularly useful for East Asian languages such as
+Chinese, Japanese, and Korean, where the number of needed characters is
+much larger than in European languages, and where large sets of
+characters share the same properties.
+
+ -- Request: .class name c1 c2 ...
+ Define a character class (or simply "class") NAME comprising the
+ characters C1, C2, and so on.
+
+ A class thus defined can then be referred to in lieu of listing all
+ the characters within it. Currently, only the 'cflags' request can
+ handle references to character classes.
+
+ In the request's simplest form, each CN is a character (or special
+ character).
+
+ .class [quotes] ' \[aq] \[dq] \[oq] \[cq] \[lq] \[rq]
+
+ Since class and glyph names share the same name space, it is
+ recommended to start and end the class name with '[' and ']',
+ respectively, to avoid collisions with existing character names
+ defined by GNU 'troff' or the user (with 'char' and related
+ requests). This practice applies the presence of ']' in the class
+ name to prevent the use of the special character escape form
+ '\[...]', thus you must use the '\C' escape to access a class with
+ such a name.
+
+ You can also use a character range notation consisting of a start
+ character followed by '-' and then an end character. Internally,
+ GNU 'troff' converts these two symbol names to Unicode code points
+ (according to the 'groff' glyph list [GGL]), which then give the
+ start and end value of the range. If that fails, the class
+ definition is skipped.
+
+ Furthermore, classes can be nested.
+
+ .class [prepunct] , : ; > }
+ .class [prepunctx] \C'[prepunct]' \[u2013]-\[u2016]
+
+ The class '[prepunctx]' thus contains the contents of the class
+ '[prepunct]' as defined above (the set ', : ; > }'), and characters
+ in the range between 'U+2013' and 'U+2016'.
+
+ If you want to include '-' in a class, it must be the first
+ character value in the argument list, otherwise it gets
+ misinterpreted as part of the range syntax.
+
+ It is not possible to use class names as end points of range
+ definitions.
+
+ A typical use of the 'class' request is to control line-breaking
+ and hyphenation rules as defined by the 'cflags' request. For
+ example, to inhibit line breaks before the characters belonging to
+ the 'prepunctx' class defined in the previous example, you can
+ write the following.
+
+ .cflags 2 \C'[prepunctx]'
+
+ See the 'cflags' request in *note Using Symbols::, for more
+ details.
+
+
+File: groff.info, Node: Special Fonts, Next: Artificial Fonts, Prev: Character Classes, Up: Using Fonts
+
+5.19.6 Special Fonts
+--------------------
+
+Special fonts are those that 'gtroff' searches when it cannot find the
+requested glyph in the current font. The Symbol font is usually a
+special font.
+
+ 'gtroff' provides the following two requests to add more special
+fonts. *Note Using Symbols::, for a detailed description of the glyph
+searching mechanism in 'gtroff'.
+
+ Usually, only non-TTY devices have special fonts.
+
+ -- Request: .special [s1 s2 ...]
+ -- Request: .fspecial f [s1 s2 ...]
+ Use the 'special' request to define special fonts. Initially, this
+ list is empty.
+
+ Use the 'fspecial' request to designate special fonts only when
+ font F is active. Initially, this list is empty.
+
+ Previous calls to 'special' or 'fspecial' are overwritten; without
+ arguments, the particular list of special fonts is set to empty.
+ Special fonts are searched in the order they appear as arguments.
+
+ All fonts that appear in a call to 'special' or 'fspecial' are
+ loaded.
+
+ *Note Using Symbols::, for the exact search order of glyphs.
+
+
+File: groff.info, Node: Artificial Fonts, Next: Ligatures and Kerning, Prev: Special Fonts, Up: Using Fonts
+
+5.19.7 Artificial Fonts
+-----------------------
+
+There are a number of requests and escape sequences for artificially
+creating fonts. These are largely vestiges of the days when output
+devices did not have a wide variety of fonts, and when 'nroff' and
+'troff' were separate programs. Most of them are no longer necessary in
+GNU 'troff'. Nevertheless, they are supported.
+
+ -- Escape sequence: \H'height'
+ -- Escape sequence: \H'+height'
+ -- Escape sequence: \H'-height'
+ -- Register: \n[.height]
+ Change (increment, decrement) the height of the current font, but
+ not the width. If HEIGHT is zero, restore the original height.
+ Default scaling unit is 'z'.
+
+ The read-only register '.height' contains the font height as set by
+ '\H'.
+
+ Currently, only the '-Tps' and '-Tpdf' devices support this
+ feature.
+
+ '\H' doesn't produce an input token in GNU 'troff'. As a
+ consequence, it can be used in requests like 'mc' (which expects a
+ single character as an argument) to change the font on the fly:
+
+ .mc \H'+5z'x\H'0'
+
+ In compatibility mode, 'gtroff' behaves differently: If an
+ increment or decrement is used, it is always taken relative to the
+ current type size and not relative to the previously selected font
+ height. Thus,
+
+ .cp 1
+ \H'+5'test \H'+5'test
+
+ prints the word 'test' twice with the same font height (five points
+ larger than the current font size).
+
+ -- Escape sequence: \S'slant'
+ -- Register: \n[.slant]
+ Slant the current font by SLANT degrees. Positive values slant to
+ the right. Only integer values are possible.
+
+ The read-only register '.slant' contains the font slant as set by
+ '\S'.
+
+ Currently, only the '-Tps' and '-Tpdf' devices support this
+ feature.
+
+ '\S' doesn't produce an input token in GNU 'troff'. As a
+ consequence, it can be used in requests like 'mc' (which expects a
+ single character as an argument) to change the font on the fly:
+
+ .mc \S'20'x\S'0'
+
+ This escape is incorrectly documented in the AT&T 'troff' manual;
+ the slant is always set to an absolute value.
+
+ -- Request: .ul [lines]
+ The 'ul' request normally underlines subsequent lines if a TTY
+ output device is used. Otherwise, the lines are printed in italics
+ (only the term 'underlined' is used in the following). The single
+ argument is the quantity of input lines to be underlined; with no
+ argument, the next line is underlined. If LINES is zero or
+ negative, stop the effects of 'ul' (if it was active). Requests
+ and empty lines do not count for computing the number of underlined
+ input lines, even if they produce some output like 'tl'. Lines
+ inserted by macros (e.g., invoked by a trap) do count.
+
+ At the beginning of 'ul', the current font is stored and the
+ underline font is activated. Within the span of a 'ul' request, it
+ is possible to change fonts, but after the last line affected by
+ 'ul' the saved font is restored.
+
+ This number of lines still to be underlined is associated with the
+ environment (*note Environments::). The underline font can be
+ changed with the 'uf' request.
+
+ The 'ul' request does not underline spaces.
+
+ -- Request: .cu [lines]
+ The 'cu' request is similar to 'ul' but underlines spaces as well
+ (if a TTY output device is used).
+
+ -- Request: .uf font
+ Set the underline font (globally) used by 'ul' and 'cu'. By
+ default, this is the font at position 2. FONT can be either a
+ non-negative font position or the name of a font.
+
+ -- Request: .bd font [offset]
+ -- Request: .bd font1 font2 [offset]
+ -- Register: \n[.b]
+ Embolden FONT by overstriking its glyphs offset by OFFSET units
+ minus one.
+
+ Two syntax forms are available.
+
+ * Imitate a bold font unconditionally. The first argument
+ specifies the font to embolden, and the second is the number
+ of basic units, minus one, by which the two glyphs are offset.
+ If the second argument is missing, emboldening is turned off.
+
+ FONT can be either a non-negative font position or the name of
+ a font.
+
+ OFFSET is available in the '.b' read-only register if a
+ special font is active; in the 'bd' request, its default unit
+ is 'u'.
+
+ * Imitate a bold form conditionally. Embolden FONT1 by OFFSET
+ only if font FONT2 is the current font. This request can be
+ issued repeatedly to set up different emboldening values for
+ different current fonts. If the second argument is missing,
+ emboldening is turned off for this particular current font.
+
+ This affects special fonts only (either set up with the
+ 'special' command in font files or with the 'fspecial'
+ request).
+
+ -- Request: .cs font [width [em-size]]
+ Switch to and from "constant glyph space mode". If activated, the
+ width of every glyph is WIDTH/36 ems. The em size is given
+ absolutely by EM-SIZE; if this argument is missing, the em value is
+ taken from the current font size (as set with the 'ps' request)
+ when the font is effectively in use. Without second and third
+ argument, constant glyph space mode is deactivated.
+
+ Default scaling unit for EM-SIZE is 'z'; WIDTH is an integer.
+
+
+File: groff.info, Node: Ligatures and Kerning, Next: Dummy Characters, Prev: Artificial Fonts, Up: Using Fonts
+
+5.19.8 Ligatures and Kerning
+----------------------------
+
+Ligatures are groups of characters that are run together, i.e, producing
+a single glyph. For example, the letters 'f' and 'i' can form a
+ligature 'fi' as in the word 'file'. This produces a cleaner look
+(albeit subtle) to the printed output. Usually, ligatures are not
+available in fonts for TTY output devices.
+
+ Most PostScript fonts support the fi and fl ligatures. The C/A/T
+typesetter that was the target of AT&T 'troff' also supported 'ff',
+'ffi', and 'ffl' ligatures. Advanced typesetters or 'expert' fonts may
+include ligatures for 'ft' and 'ct', although GNU 'troff' does not
+support these (yet).
+
+ Only the current font is checked for ligatures and kerns; neither
+special fonts nor special charcters defined with the 'char' request (and
+its siblings) are taken into account.
+
+ -- Request: .lg [flag]
+ -- Register: \n[.lg]
+ Switch the ligature mechanism on or off; if the parameter is
+ non-zero or missing, ligatures are enabled, otherwise disabled.
+ Default is on. The current ligature mode can be found in the
+ read-only register '.lg' (set to 1 or 2 if ligatures are enabled,
+ 0 otherwise).
+
+ Setting the ligature mode to 2 enables the two-character ligatures
+ (fi, fl, and ff) and disables the three-character ligatures (ffi
+ and ffl).
+
+ "Pairwise kerning" is another subtle typesetting mechanism that
+modifies the distance between a glyph pair to improve readability. In
+most cases (but not always) the distance is decreased. Typewriter-like
+fonts and fonts for terminals where all glyphs have the same width don't
+use kerning.
+
+ -- Request: .kern [flag]
+ -- Register: \n[.kern]
+ Switch kerning on or off. If the parameter is non-zero or missing,
+ enable pairwise kerning, otherwise disable it. The read-only
+ register '.kern' is set to 1 if pairwise kerning is enabled,
+ 0 otherwise.
+
+ If the font description file contains pairwise kerning information,
+ glyphs from that font are kerned. Kerning between two glyphs can
+ be inhibited by placing '\&' between them: 'V\&A'.
+
+ *Note Font Description File Format::.
+
+ "Track kerning" expands or reduces the space between glyphs. This
+can be handy, for example, if you need to squeeze a long word onto a
+single line or spread some text to fill a narrow column. It must be
+used with great care since it is usually considered bad typography if
+the reader notices the effect.
+
+ -- Request: .tkf f s1 n1 s2 n2
+ Enable track kerning for font F. If the current font is F the
+ width of every glyph is increased by an amount between N1 and N2
+ (N1, N2 can be negative); if the current type size is less than or
+ equal to S1 the width is increased by N1; if it is greater than or
+ equal to S2 the width is increased by N2; if the type size is
+ greater than or equal to S1 and less than or equal to S2 the
+ increase in width is a linear function of the type size.
+
+ The default scaling unit is 'z' for S1 and S2, 'p' for N1 and N2.
+
+ The track kerning amount is added even to the rightmost glyph in a
+ line; for large values it is thus recommended to increase the line
+ length by the same amount to compensate.
+
+
+File: groff.info, Node: Italic Corrections, Next: Dummy Characters, Prev: Ligatures and Kerning, Up: Using Fonts
+
+5.19.9 Italic Corrections
+-------------------------
+
+When typesetting adjacent glyphs from typefaces of different slants, the
+space between them may require adjustment.
+
+ -- Escape sequence: \/
+ Apply an "italic correction": modify the spacing of the preceding
+ glyph so that the distance between it and the following glyph is
+ correct if the latter is of upright shape. For example, if an
+ italic 'f' is followed immediately by a roman right parenthesis,
+ then in many fonts the top right portion of the 'f' overlaps the
+ top left of the right parenthesis, which is ugly. Use this escape
+ sequence whenever an oblique glyph is immediately followed by an
+ upright glyph without any intervening space.
+
+ -- Escape sequence: \,
+ Apply a "left italic correction": modify the spacing of the
+ following glyph so that the distance between it and the preceding
+ glyph is correct if the latter is of upright shape. For example,
+ if a roman left parenthesis is immediately followed by an
+ italic 'f', then in many fonts the bottom left portion of the 'f'
+ overlaps the bottom of the left parenthesis, which is ugly. Use
+ this escape sequence whenever an upright glyph is followed
+ immediately by an oblique glyph without any intervening space.
+
+
+File: groff.info, Node: Dummy Characters, Prev: Italic Corrections, Up: Using Fonts
+
+5.19.10 Dummy Characters
+------------------------
+
+As discussed in *note Requests and Macros::, the first character on an
+input line is treated specially. Further, formatting a glyph has many
+consequences on formatter state (*note Environments::). Occasionally,
+we want to escape this context or embrace some of those consequences
+without actually rendering a glyph to the output.
+
+ -- Escape sequence: \&
+ Interpolate a dummy character, which is constitutive of output but
+ invisible.(1) (*note Dummy Characters-Footnote-1::) Its presence
+ alters the interpretation context of a subsequent input character,
+ and enjoys several applications.
+
+ * Prevent insertion of extra space after an end-of-sentence
+ character.
+
+ Test.
+ Test.
+ => Test. Test.
+ Test.\&
+ Test.
+ => Test. Test.
+
+ * Prevent recognition of a control character.
+
+ .Test
+ error-> warning: macro 'Test' not defined
+ \&.Test
+ => .Test
+
+ * Prevent kerning between two glyphs.
+
+ * Translate a character to "nothing".
+
+ .tr JIjiK\&k\&UVuv
+ Post universitum, alea jacta est, OK?
+ => Post vniversitvm, alea iacta est, O?
+
+ The dummy character escape sequence sees use in macro definitions
+ as a means of ensuring that arguments are treated as text even if
+ they begin with spaces or control characters.
+
+ .de HD \" typeset a simple bold heading
+ . sp
+ . ft B
+ \&\\$1 \" exercise: remove the \&
+ . ft
+ . sp
+ ..
+ .HD .\|.\|.\|surprised?
+
+ One way to think about the dummy character is to imagine placing the
+symbol '&' in the input at a certain location; if doing so has all the
+side effects on formatting that you desire except for sticking an ugly
+ampersand in the midst of your text, the dummy character is what you
+want in its place.
+
+ -- Escape sequence: \)
+ Interpolate a transparent dummy character--one that is transparent
+ to end-of-sentence detection. It behaves as '\&', except that '\&'
+ is treated as letters and numerals normally are after '.', '?' and
+ '!'; '\&' cancels end-of-sentence detection, and '\)' does not.
+
+ .de Suffix-&
+ . nop \&\\$1
+ ..
+ .
+ .de Suffix-)
+ . nop \)\\$1
+ ..
+ .
+ Here's a sentence.\c
+ .Suffix-& '
+ Another one.\c
+ .Suffix-) '
+ And a third.
+ => Here's a sentence.' Another one.' And a third.
+
+
+File: groff.info, Node: Dummy Characters-Footnotes, Up: Dummy Characters
+
+ (1) Opinions of this escape sequence's name abound. "Zero-width
+space" is a popular misnomer: 'roff' formatters do not treat it like a
+space. Ossanna called it a "non-printing, zero-width character", but
+the character causes _output_ even though it does not "print". If no
+output line is pending, the dummy character starts one. Contrast an
+empty input document with one containing only '\&'. The former produces
+no output; the latter, a blank page.
+
+
+File: groff.info, Node: Manipulating Type Size and Vertical Spacing, Next: Colors, Prev: Using Fonts, Up: GNU troff Reference
+
+5.20 Manipulating Type Size and Vertical Spacing
+================================================
+
+These concepts were introduced in *note Page Geometry::. The height of
+a font's tallest glyph is one em, which is equal to the type size in
+points.(1) (*note Manipulating Type Size and Vertical
+Spacing-Footnote-1::) A vertical spacing of less than 120% of the type
+size can make a document hard to read. Larger proportions can be useful
+to spread the text for annotations or proofreader's marks. By default,
+GNU 'troff' uses 10 point type on 12 point spacing. Typographers call
+the difference between type size and vertical spacing "leading".(2)
+(*note Manipulating Type Size and Vertical Spacing-Footnote-2::)
+
+* Menu:
+
+* Changing the Type Size::
+* Changing the Vertical Spacing::
+* Using Fractional Type Sizes::
+
+
+File: groff.info, Node: Manipulating Type Size and Vertical Spacing-Footnotes, Up: Manipulating Type Size and Vertical Spacing
+
+ (1) In text fonts, the tallest glyphs are typically parentheses.
+Unfortunately, in many cases the actual dimensions of the glyphs in a
+font do not closely match its declared type size! For example, in the
+standard PostScript font families, 10-point Times sets better with
+9-point Helvetica and 11-point Courier than if all three were used at
+10 points.
+
+ (2) Rhyme with "sledding"; mechanical typography used lead metal
+(Latin _plumbum_).
+
+
+File: groff.info, Node: Changing the Type Size, Next: Changing the Vertical Spacing, Prev: Manipulating Type Size and Vertical Spacing, Up: Manipulating Type Size and Vertical Spacing
+
+5.20.1 Changing the Type Size
+-----------------------------
+
+ -- Request: .ps [size]
+ -- Request: .ps +size
+ -- Request: .ps -size
+ -- Escape sequence: \ssize
+ -- Register: \n[.s]
+ Use the 'ps' request or the '\s' escape sequence to change
+ (increase, decrease) the type size (in scaled points). Specify
+ SIZE as either an absolute type size, or as a relative change from
+ the current size. 'ps' with no argument restores the previous
+ size. The 'ps' request's default scaling unit is 'z'. The
+ requested size is rounded to the nearest valid size (with ties
+ rounding down) within the limits supported by the device. If the
+ requested size is non-positive, it is treated as 1u.
+
+ Type size alteration is incorrectly documented in the AT&T 'troff'
+ manual, which claims "if [the requested size] is invalid, the next
+ larger valid size will result, with a maximum of 36".(1) (*note
+ Changing the Type Size-Footnote-1::)
+
+ The read-only string-valued register '.s' interpolates the type
+ size in points as a decimal fraction; it is associated with the
+ environment (*note Environments::). To obtain the type size in
+ scaled points, interpolate the '.ps' register instead (*note Using
+ Fractional Type Sizes::).
+
+ The '\s' escape sequence supports a variety of syntax forms.
+
+ '\sN'
+ Set the type size to N points. N must be a single digit. If
+ N is 0, restore the previous size.
+
+ '\s+N'
+ '\s-N'
+ Increase or decrease the type size by N points. N must be
+ exactly one digit.
+
+ '\s(NN'
+ Set the type size to NN points. NN must be exactly two
+ digits.
+
+ '\s+(NN'
+ '\s-(NN'
+ '\s(+NN'
+ '\s(-NN'
+ Alter the type size in points by the two-digit value NN.
+
+ *Note Using Fractional Type Sizes::, for further syntactical forms
+ of the '\s' escape sequence that additionally accept decimal
+ fractions.
+
+ snap, snap,
+ .ps +2
+ grin, grin,
+ .ps +2
+ wink, wink, \s+2nudge, nudge,\s+8 say no more!
+ .ps 10
+
+ The '\s' escape sequence affects the environment immediately and
+doesn't produce an input token. Consequently, it can be used in
+requests like 'mc', which expects a single character as an argument, to
+change the type size on the fly.
+
+ .mc \s[20]x\s[0]
+
+ -- Request: .sizes s1 s2 ... sn [0]
+ The 'DESC' file specifies which type sizes are allowed by the
+ output device; see *note DESC File Format::. Use the 'sizes'
+ request to change this set of permissible sizes. Arguments are in
+ scaled points; see *note Using Fractional Type Sizes::. Each can
+ be a single type size (such as '12000'), or a range of sizes (such
+ as '4000-72000'). You can optionally end the list with a '0'.
+
+
+File: groff.info, Node: Changing the Type Size-Footnotes, Up: Changing the Type Size
+
+ (1) The claim appears to have been true of Ossanna 'troff' for the
+C/A/T device; Kernighan made device-independent 'troff' more flexible.
+
+
+File: groff.info, Node: Changing the Vertical Spacing, Next: Using Fractional Type Sizes, Prev: Changing the Type Size, Up: Manipulating Type Size and Vertical Spacing
+
+5.20.2 Changing the Vertical Spacing
+------------------------------------
+
+ -- Request: .vs [space]
+ -- Request: .vs +space
+ -- Request: .vs -space
+ -- Register: \n[.v]
+ Set the vertical spacing to, or alter it by, SPACE. The default
+ scaling unit is 'p'. If 'vs' is called without an argument, the
+ vertical spacing is reset to the previous value before the last
+ call to 'vs'. GNU 'troff' emits a warning in category 'range' if
+ SPACE is negative; the vertical spacing is then set to the smallest
+ possible positive value, the vertical motion quantum (as found in
+ the '.V' register).
+
+ '.vs 0' isn't saved in a diversion since it doesn't result in a
+ vertical motion. You must explicitly issue this request before
+ interpolating the diversion.
+
+ The read-only register '.v' contains the vertical spacing; it is
+ associated with the environment (*note Environments::).
+
+When a break occurs, GNU 'troff' performs the following procedure.
+
+ * Move the drawing position vertically by the "extra pre-vertical
+ line space", the minimum of all negative '\x' escape sequence
+ arguments in the pending output line.
+
+ * Move the drawing position vertically by the vertical line spacing.
+
+ * Write out the pending output line.
+
+ * Move the drawing position vertically by the "extra post-vertical
+ line space", the maximum of all positive '\x' escape sequence
+ arguments in the line that has just been output.
+
+ * Move the drawing position vertically by the "post-vertical line
+ spacing" (see below).
+
+ Prefer 'vs' or 'pvs' over 'ls' to produce double-spaced documents.
+'vs' and 'pvs' have finer granularity than 'ls'; moreover, some
+preprocessors assume single spacing. *Note Manipulating Spacing::,
+regarding the '\x' escape sequence and the 'ls' request.
+
+ -- Request: .pvs [space]
+ -- Request: .pvs +space
+ -- Request: .pvs -space
+ -- Register: \n[.pvs]
+ Set the post-vertical spacing to, or alter it by, SPACE. The
+ default scaling unit is 'p'. If 'pvs' is called without an
+ argument, the post-vertical spacing is reset to the previous value
+ before the last call to 'pvs'. GNU 'troff' emits a warning in
+ category 'range' if SPACE is negative; the post-vertical spacing is
+ then set to zero.
+
+ The read-only register '.pvs' contains the post-vertical spacing;
+ it is associated with the environment (*note Environments::).
+
+
+File: groff.info, Node: Using Fractional Type Sizes, Prev: Changing the Type Size, Up: Manipulating Type Size and Vertical Spacing
+
+5.20.3 Using Fractional Type Sizes
+----------------------------------
+
+AT&T 'troff' interpreted all type size measurements in points. Combined
+with integer arithmetic, this design choice made it impossible to
+support, for instance, ten and a half-point type. In GNU 'troff', an
+output device can select a scaling factor that subdivides a point into
+"scaled points". A type size expressed in scaled points can thus
+represent a non-integral type size.
+
+ A "scaled point" is equal to 1/SIZESCALE points, where SIZESCALE is
+specified in the device description file 'DESC', and defaults to 1.(1)
+(*note Using Fractional Type Sizes-Footnote-1::) Requests and escape
+sequences in GNU 'troff' interpret arguments that represent a type size
+in scaled points, which the formatter multiplies by SIZESCALE and
+converts to an integer. Arguments treated in this way comprise those to
+the escape sequences '\H' and '\s', to the request 'ps', the third
+argument to the 'cs' request, and the second and fourth arguments to the
+'tkf' request. Scaled points may be specified explicitly with the 'z'
+scaling unit.
+
+ For example, if SIZESCALE is 1000, then a scaled point is one
+thousandth of a point. The request '.ps 10.5' is synonymous with '.ps
+10.5z' and sets the type size to 10,500 scaled points, or 10.5 points.
+Consequently, in GNU 'troff', the register '.s' can interpolate a
+non-integral type size.
+
+ -- Register: \n[.ps]
+ This read-only register interpolates the type size in scaled
+ points; it is associated with the environment (*note
+ Environments::).
+
+ It makes no sense to use the 'z' scaling unit in a numeric expression
+whose default scaling unit is neither 'u' nor 'z', so GNU 'troff'
+disallows this. Similarly, it is nonsensical to use a scaling unit
+other than 'z' or 'u' in a numeric expression whose default scaling unit
+is 'z', and so GNU 'troff' disallows this as well.
+
+ Another GNU 'troff' scaling unit, 's', multiplies by the number of
+basic units in a scaled point. Thus, '\n[.ps]s' is equal to '1m' by
+definition. Do not confuse the 's' and 'z' scaling units.
+
+ -- Register: \n[.psr]
+ -- Register: \n[.sr]
+ Output devices may be limited in the type sizes they can employ.
+ The '.s' and '.ps' registers represent the type size selected by
+ the output driver as it understands a device's capability. The
+ last _requested_ type size is interpolated in scaled points by the
+ read-only register '.psr' and in points as a decimal fraction by
+ the read-only string-valued register '.sr'. Both are associated
+ with the environment (*note Environments::).
+
+ For example, if a type size of 10.95 points is requested, and the
+ nearest size permitted by a 'sizes' request (or by the 'sizes' or
+ 'sizescale' directives in the device's 'DESC' file) is 11 points,
+ the output driver uses the latter value.
+
+ The '\s' escape sequence offers the following syntax forms that work
+with fractional type sizes and accept scaling units. You may of course
+give them integral arguments. The delimited forms need not use the
+neutral apostrophe; see *note Delimiters::.
+
+'\s[N]'
+'\s'N''
+ Set the type size to N scaled points; N is a numeric expression
+ with a default scaling unit of 'z'.
+
+'\s[+N]'
+'\s[-N]'
+'\s+[N]'
+'\s-[N]'
+'\s'+N''
+'\s'-N''
+'\s+'N''
+'\s-'N''
+ Increase or decrease the type size by N scaled points; N is a
+ numeric expression (which may start with a minus sign) with a
+ default scaling unit of 'z'.
+
+
+File: groff.info, Node: Using Fractional Type Sizes-Footnotes, Up: Using Fractional Type Sizes
+
+ (1) *Note Device and Font Description Files::.
+
+
+File: groff.info, Node: Colors, Next: Strings, Prev: Manipulating Type Size and Vertical Spacing, Up: GNU troff Reference
+
+5.21 Colors
+===========
+
+GNU 'troff' supports color output with a variety of color spaces and up
+to 16 bits per channel. Some devices, particularly terminals, may be
+more limited. When color support is enabled, two colors are current at
+any given time: the "stroke color", with which glyphs, rules (lines),
+and geometric objects like circles and polygons are drawn, and the "fill
+color", which can be used to paint the interior of a closed geometric
+figure.
+
+ -- Request: .color [n]
+ -- Register: \n[.color]
+ If N is missing or non-zero, enable the output of color-related
+ device-independent output commands (this is the default);
+ otherwise, disable them. This request sets a global flag; it does
+ not produce an input token (*note Gtroff Internals::).
+
+ The read-only register '.color' is 1 if colors are enabled,
+ 0 otherwise.
+
+ Color can also be disabled with the '-c' command-line option.
+
+ -- Request: .defcolor ident scheme color-component ...
+ Define a color named IDENT. SCHEME selects a color space and
+ determines the quantity of required COLOR-COMPONENTs; it must be
+ one of 'rgb' (three components), 'cmy' (three), 'cmyk' (four), or
+ 'gray' (one). 'grey' is accepted as a synonym of 'gray'. The
+ color components can be encoded as a single hexadecimal value
+ starting with '#' or '##'. The former indicates that each
+ component is in the range 0-255 (0-FF), the latter the range
+ 0-65,535 (0-FFFF).
+
+ .defcolor half gray #7f
+ .defcolor pink rgb #FFC0CB
+ .defcolor magenta rgb ##ffff0000ffff
+
+ Alternatively, each color component can be specified as a decimal
+ fraction in the range 0-1, interpreted using a default scaling unit
+ of 'f', which multiplies its value by 65,536 (but clamps it at
+ 65,535).
+
+ .defcolor gray50 rgb 0.5 0.5 0.5
+ .defcolor darkgreen rgb 0.1f 0.5f 0.2f
+
+ Each output device has a color named 'default', which cannot be
+redefined. A device's default stroke and fill colors are not
+necessarily the same. For the 'dvi', 'html', 'pdf', 'ps', and 'xhtml'
+output devices, GNU 'troff' automatically loads a macro file defining
+many color names at startup. By the same mechanism, the devices
+supported by 'grotty' recognize the eight standard ISO 6429/EMCA-48
+color names.(1) (*note Colors-Footnote-1::)
+
+ -- Request: .gcolor [color]
+ -- Escape sequence: \mc
+ -- Escape sequence: \m(co
+ -- Escape sequence: \m[color]
+ -- Register: \n[.m]
+ Set the stroke color to COLOR.
+
+ .gcolor red
+ The next words
+ .gcolor
+ \m[red]are in red\m[]
+ and these words are in the previous color.
+
+ The escape sequence '\m[]' restores the previous stroke color, as
+ does a 'gcolor' request without an argument.
+
+ The name of the current stroke color is available in the read-only
+ string-valued register '.m'; it is associated with the environment
+ (*note Environments::). It interpolates nothing when the stroke
+ color is the default.
+
+ '\m' doesn't produce an input token in GNU 'troff' (*note Gtroff
+ Internals::). It therefore can be used in requests like 'mc'
+ (which expects a single character as an argument) to change the
+ color on the fly:
+
+ .mc \m[red]x\m[]
+
+ -- Request: .fcolor [color]
+ -- Escape sequence: \Mc
+ -- Escape sequence: \M(co
+ -- Escape sequence: \M[color]
+ -- Register: \n[.M]
+ Set the fill color for objects drawn with '\D'...'' escape
+ sequences. The escape sequence '\M[]' restores the previous fill
+ color, as does an 'fcolor' request without an argument.
+
+ The name of the current fill color is available in the read-only
+ string-valued register '.M'; it is associated with the environment
+ (*note Environments::). It interpolates nothing when the fill
+ color is the default. '\M' doesn't produce an input token in GNU
+ 'troff'.
+
+ Create an ellipse with a red interior as follows.
+
+ \M[red]\h'0.5i'\D'E 2i 1i'\M[]
+
+
+File: groff.info, Node: Colors-Footnotes, Up: Colors
+
+ (1) also known vulgarly as "ANSI colors"
+
+
+File: groff.info, Node: Strings, Next: Conditionals and Loops, Prev: Colors, Up: GNU troff Reference
+
+5.22 Strings
+============
+
+GNU 'troff' supports strings primarily for user convenience.
+Conventionally, if one would define a macro only to interpolate a small
+amount of text, without invoking requests or calling any other macros,
+one defines a string instead. Only one string is predefined by the
+language.
+
+ -- String: \*[.T]
+ Contains the name of the output device (for example, 'utf8' or
+ 'pdf').
+
+ The 'ds' request creates a string with a specified name and contents
+and the '\*' escape sequence dereferences its name, interpolating its
+contents. If the string named by the '\*' escape sequence does not
+exist, it is defined as empty, nothing is interpolated, and a warning in
+category 'mac' is emitted. *Note Warnings::, for information about the
+enablement and suppression of warnings.
+
+ -- Request: .ds name [contents]
+ -- Request: .ds1 name [contents]
+ -- Escape sequence: \*n
+ -- Escape sequence: \*(nm
+ -- Escape sequence: \*[name [arg1 arg2 ...]]
+ Define a string called NAME with contents CONTENTS. If NAME
+ already exists as an alias, the target of the alias is redefined;
+ see 'als' and 'rm' below. If 'ds' is called with only one
+ argument, NAME is defined as an empty string. Otherwise, GNU
+ 'troff' stores CONTENTS in copy mode.(1) (*note
+ Strings-Footnote-1::)
+
+ The '\*' escape sequence interpolates a previously defined string
+ variable NAME (one-character name N, two-character name NM). The
+ bracketed interpolation form accepts arguments that are handled as
+ macro arguments are; recall *note Calling Macros::. In contrast to
+ macro calls, however, if a closing bracket ']' occurs in a string
+ argument, that argument must be enclosed in double quotes. '\*' is
+ interpreted even in copy mode. When defining strings, argument
+ interpolations must be escaped if they are to reference parameters
+ from the calling context; *Note Parameters::.
+
+ .ds cite (\\$1, \\$2)
+ Gray codes are explored in \*[cite Morgan 1998].
+ => Gray codes are explored in (Morgan, 1998).
+
+ *Caution:* Unlike other requests, the second argument to the 'ds'
+ request consumes the remainder of the input line, including
+ trailing spaces. This means that comments on a line with such a
+ request can introduce unwanted space into a string when they are
+ set off from the material they annotate, as is conventional.
+
+ .ds H2O H\v'+.3m'\s'-2'2\v'-.3m'\s0O \" water
+
+ Instead, place the comment on another line or put the comment
+ escape sequence immediately adjacent to the last character of the
+ string.
+
+ .ds H2O H\v'+.3m'\s'-2'2\v'-.3m'\s0O\" water
+
+ Ending string definitions (and appendments) with a comment, even an
+ empty one, prevents unwanted space from creeping into them during
+ source document maintenance.
+
+ .ds author Alice Pleasance Liddell\"
+ .ds empty \" might be appended to later with .as
+
+ An initial neutral double quote '"' in CONTENTS is stripped to
+ allow embedding of leading spaces. Any other '"' is interpreted
+ literally, but it is wise to use the special character escape
+ sequence '\[dq]' instead if the string might be interpolated as
+ part of a macro argument; see *note Calling Macros::.
+
+ .ds salutation " Yours in a white wine sauce,\"
+ .ds c-var-defn " char mydate[]=\[dq]2020-07-29\[dq];\"
+
+ Strings are not limited to a single input line of text. '\<RET>'
+ works just as it does elsewhere. The resulting string is stored
+ _without_ the newlines. Care is therefore required when
+ interpolating strings while filling is disabled.
+
+ .ds foo This string contains \
+ text on multiple lines \
+ of input.
+
+ It is not possible to embed a newline in a string that will be
+ interpreted as such when the string is interpolated. To achieve
+ that effect, use '\*' to interpolate a macro instead; see *note
+ Punning Names::.
+
+ Because strings are similar to macros, they too can be defined so
+ as to suppress AT&T 'troff' compatibility mode when used; see *note
+ Writing Macros:: and *note Compatibility Mode::. The 'ds1' request
+ defines a string such that compatibility mode is off when the
+ string is later interpolated. To be more precise, a "compatibility
+ save" input token is inserted at the beginning of the string, and a
+ "compatibility restore" input token at the end.
+
+ .nr xxx 12345
+ .ds aa The value of xxx is \\n[xxx].
+ .ds1 bb The value of xxx is \\n[xxx].
+ .
+ .cp 1
+ .
+ \*(aa
+ error-> warning: register '[' not defined
+ => The value of xxx is 0xxx].
+ \*(bb
+ => The value of xxx is 12345.
+
+ -- Request: .as name [contents]
+ -- Request: .as1 name [contents]
+ The 'as' request is similar to 'ds' but appends CONTENTS to the
+ string stored as NAME instead of redefining it. If NAME doesn't
+ exist yet, it is created. If 'as' is called with only one
+ argument, no operation is performed (beyond dereferencing the
+ string).
+
+ .as salutation " with shallots, onions and garlic,\"
+
+ The 'as1' request is similar to 'as', but compatibility mode is
+ switched off when the appended portion of the string is later
+ interpolated. To be more precise, a "compatibility save" input
+ token is inserted at the beginning of the appended string, and a
+ "compatibility restore" input token at the end.
+
+ Several requests exist to perform rudimentary string operations.
+Strings can be queried ('length') and modified ('chop', 'substring',
+'stringup', 'stringdown'), and their names can be manipulated through
+renaming, removal, and aliasing ('rn', 'rm', 'als').
+
+ -- Request: .length reg anything
+ Compute the number of characters of ANYTHING and store the count in
+ the register REG. If REG doesn't exist, it is created. ANYTHING
+ is read in copy mode.
+
+ .ds xxx abcd\h'3i'efgh
+ .length yyy \*[xxx]
+ \n[yyy]
+ => 14
+
+ -- Request: .chop object
+ Remove the last character from the macro, string, or diversion
+ named OBJECT. This is useful for removing the newline from the end
+ of a diversion that is to be interpolated as a string. This
+ request can be used repeatedly on the same OBJECT; see *note Gtroff
+ Internals::, for details on nodes inserted additionally by GNU
+ 'troff'.
+
+ -- Request: .substring str start [end]
+ Replace the string named STR with its substring bounded by the
+ indices START and END, inclusively. The first character in the
+ string has index 0. If END is omitted, it is implicitly set to the
+ largest valid value (the string length minus one). Negative
+ indices count backward from the end of the string: the last
+ character has index -1, the character before the last has index -2,
+ and so on.
+
+ .ds xxx abcdefgh
+ .substring xxx 1 -4
+ \*[xxx]
+ => bcde
+ .substring xxx 2
+ \*[xxx]
+ => de
+
+ -- Request: .stringdown str
+ -- Request: .stringup str
+ Alter the string named STR by replacing each of its bytes with its
+ lowercase ('stringdown') or uppercase ('stringup') version (if one
+ exists). Special characters in the string will often transform in
+ the expected way due to the regular naming convention for accented
+ characters. When they do not, use substrings and/or catenation.
+
+ .ds resume R\['e]sum\['e]
+ \*[resume]
+ .stringdown resume
+ \*[resume]
+ .stringup resume
+ \*[resume]
+ => Résumé résumé RÉSUMÉ
+
+ (In practice, we would end the 'ds' request with a comment escape
+'\"' to prevent space from creeping into the definition during source
+document maintenance.)
+
+ -- Request: .rn old new
+ Rename the request, macro, diversion, or string OLD to NEW.
+
+ -- Request: .rm name
+ Remove the request, macro, diversion, or string NAME. GNU 'troff'
+ treats subsequent invocations as if the name had never been
+ defined.
+
+ -- Request: .als new old
+ Create an alias NEW for the existing request, string, macro, or
+ diversion object named OLD, causing the names to refer to the same
+ stored object. If OLD is undefined, a warning in category 'mac' is
+ produced, and the request is ignored. *Note Warnings::, for
+ information about the enablement and suppression of warnings.
+
+ To understand how the 'als' request works, consider two different
+ storage pools: one for objects (macros, strings, etc.), and another
+ for names. As soon as an object is defined, GNU 'troff' adds it to
+ the object pool, adds its name to the name pool, and creates a link
+ between them. When 'als' creates an alias, it adds a new name to
+ the name pool that gets linked to the same object as the old name.
+
+ Now consider this example.
+
+ .de foo
+ ..
+ .
+ .als bar foo
+ .
+ .de bar
+ . foo
+ ..
+ .
+ .bar
+ error-> input stack limit exceeded (probable infinite
+ error-> loop)
+
+ In the above, 'bar' remains an _alias_--another name for--the
+ object referred to by 'foo', which the second 'de' request
+ replaces. Alternatively, imagine that the 'de' request
+ _dereferences_ its argument before replacing it. Either way, the
+ result of calling 'bar' is a recursive loop that finally leads to
+ an error. *Note Writing Macros::.
+
+ To remove an alias, call 'rm' on its name. The object itself is
+ not destroyed until it has no more names.
+
+ When a request, macro, string, or diversion is aliased,
+ redefinitions and appendments "write through" alias names. To
+ replace an alias with a separately defined object, you must use the
+ 'rm' request on its name first.
+
+
+File: groff.info, Node: Strings-Footnotes, Up: Strings
+
+ (1) *Note Copy Mode::.
+
+
+File: groff.info, Node: Conditionals and Loops, Next: Writing Macros, Prev: Strings, Up: GNU troff Reference
+
+5.23 Conditionals and Loops
+===========================
+
+'groff' has 'if' and 'while' control structures like other languages.
+However, the syntax for grouping multiple input lines in the branches or
+bodies of these structures is unusual.
+
+* Menu:
+
+* Operators in Conditionals::
+* if-then::
+* if-else::
+* Conditional Blocks::
+* while::
+
+
+File: groff.info, Node: Operators in Conditionals, Next: if-then, Prev: Conditionals and Loops, Up: Conditionals and Loops
+
+5.23.1 Operators in Conditionals
+--------------------------------
+
+In 'if', 'ie', and 'while' requests, in addition to the numeric
+expressions described in *note Numeric Expressions::, several Boolean
+operators are available; the members of this expanded class are termed
+"conditional expressions".
+
+'c GLYPH'
+ True if GLYPH is available, where GLYPH is an ordinary character, a
+ special character '\(XX' or '\[XXX]', '\N'XXX'', or has been
+ defined by any of the 'char', 'fchar', 'fschar', or 'schar'
+ requests.
+
+'d NAME'
+ True if a string, macro, diversion, or request called NAME exists.
+
+'e'
+ True if the current page is even-numbered.
+
+'F FONT'
+ True if FONT exists. FONT is handled as if it were opened with the
+ 'ft' request (that is, font translation and styles are applied),
+ without actually mounting it.
+
+'m COLOR'
+ True if COLOR is defined.
+
+'n'
+ True if the document is being processed in 'nroff' mode. *Note
+ troff and nroff Modes::.
+
+'o'
+ True if the current page is odd-numbered.
+
+'r REGISTER'
+ True if REGISTER exists.
+
+'S STYLE'
+ True if STYLE is available for the current font family. Font
+ translation is applied.
+
+'t'
+ True if the document is being processed in 'troff' mode. *Note
+ troff and nroff Modes::.
+
+'v'
+ Always false. This condition is recognized only for compatibility
+ with certain other 'troff' implementations.(1) (*note Operators in
+ Conditionals-Footnote-1::)
+
+ If the first argument to an 'if', 'ie', or 'while' request begins
+with a non-alphanumeric character apart from '!' (see below); it
+performs an output comparison test. (2) (*note Operators in
+Conditionals-Footnote-2::)
+
+''XXX'YYY''
+ True if formatting the comparands XXX and YYY produces the same
+ output commands. The delimiter need not be a neutral apostrophe:
+ the output comparison operator accepts the same delimiters as most
+ escape sequences; see *note Delimiters::. This "output comparison
+ operator" formats XXX and YYY in separate environments; after the
+ comparison, the resulting data are discarded.
+
+ .ie "|"\fR|\fP" true
+ .el false
+ => true
+
+ The resulting glyph properties, including font family, style, size,
+ and slant, must match, but not necessarily the requests and/or
+ escape sequences used to obtain them. In the previous example, '|'
+ and '\fR|\fP' result in '|' glyphs in the same typefaces at the
+ same positions, so the comparands are equal. If '.ft I' had been
+ added before the '.ie', they would differ: the first '|' would
+ produce an italic '|', not a roman one. Motions must match in
+ orientation and magnitude to within the applicable horizontal and
+ vertical motion quanta of the device, after rounding. '.if
+ "\u\d"\v'0'"' is false even though both comparands result in zero
+ net motion, because motions are not interpreted or optimized but
+ sent as-is to the output.(3) (*note Operators in
+ Conditionals-Footnote-3::) On the other hand, '.if "\d"\v'0.5m'"'
+ is true, because '\d' is defined as a downward motion of one-half
+ em.(4) (*note Operators in Conditionals-Footnote-4::)
+
+ Surround the comparands with '\?' to avoid formatting them; this
+ causes them to be compared character by character, as with string
+ comparisons in other programming languages.
+
+ .ie "\?|\?"\?\fR|\fP\?" true
+ .el false
+ => false
+
+ Since comparands protected with '\?' are read in copy mode (*note
+ Copy Mode::), they need not even be valid 'groff' syntax. The
+ escape character is still lexically recognized, however, and
+ consumes the next character.
+
+ .ds a \[
+ .ds b \[
+ .if '\?\*a\?'\?\*b\?' a and b equivalent
+ .if '\?\\?'\?\\?' backslashes equivalent
+ => a and b equivalent
+
+ The above operators can't be combined with most others, but a leading
+'!', not followed immediately by spaces or tabs, complements an
+expression.
+
+ .nr x 1
+ .ie !r x register x is not defined
+ .el register x is defined
+ => register x is defined
+
+ Spaces and tabs are optional immediately after the 'c', 'd', 'F',
+'m', 'r', and 'S' operators, but right after '!', they end the predicate
+and the conditional evaluates true.(5) (*note Operators in
+Conditionals-Footnote-5::)
+
+ .nr x 1
+ .ie ! r x register x is not defined
+ .el register x is defined
+ => r x register x is not defined
+
+The unexpected 'r x' in the output is a clue that our conditional was
+not interpreted as we planned, but matters may not always be so obvious.
+
+
+File: groff.info, Node: Operators in Conditionals-Footnotes, Up: Operators in Conditionals
+
+ (1) This refers to 'vtroff', a translator that would convert the
+C/A/T output from early-vintage AT&T 'troff' to a form suitable for
+Versatec and Benson-Varian plotters.
+
+ (2) Strictly, letters not otherwise recognized _are_ treated as
+output comparison delimiters. For portability, it is wise to avoid
+using letters not in the list above; for example, Plan 9 'troff' uses
+'h' to test a mode it calls 'htmlroff', and GNU 'troff' may provide
+additional operators in the future.
+
+ (3) Because formatting of the comparands takes place in a dummy
+environment, vertical motions within them cannot spring traps.
+
+ (4) All of this is to say that the lists of output nodes created by
+formatting XXX and YYY must be identical. *Note Gtroff Internals::.
+
+ (5) This bizarre behavior maintains compatibility with AT&T 'troff'.
+
+
+File: groff.info, Node: if-then, Next: if-else, Prev: Operators in Conditionals, Up: Conditionals and Loops
+
+5.23.2 if-then
+--------------
+
+ -- Request: .if cond-expr anything
+ Evaluate the conditional expression COND-EXPR, and if it evaluates
+ true (or to a positive value), interpret the remainder of the line
+ ANYTHING as if it were an input line. Recall from *note Invoking
+ Requests:: that any quantity of spaces between arguments to
+ requests serves only to separate them; leading spaces in ANYTHING
+ are thus not seen. ANYTHING effectively _cannot_ be omitted; if
+ COND-EXPR is true and ANYTHING is empty, the newline at the end of
+ the control line is interpreted as a blank input line (and
+ therefore a blank text line).
+
+ super\c
+ tanker
+ .nr force-word-break 1
+ super\c
+ .if ((\n[force-word-break] = 1) & \n[.int])
+ tanker
+ => supertanker super tanker
+
+ -- Request: .nop anything
+ Interpret ANYTHING as if it were an input line. This is similar to
+ '.if 1'. 'nop' is not really "no operation"; its argument _is_
+ processed--unconditionally. It can be used to cause text lines to
+ share indentation with surrounding control lines.
+
+ .als real-MAC MAC
+ .de wrapped-MAC
+ . tm MAC: called with arguments \\$@
+ . nop \\*[real-MAC]\\
+ ..
+ .als MAC wrapped-MAC
+ \# Later...
+ .als MAC real-MAC
+
+ In the above, we've used aliasing, 'nop', and the interpolation of
+ a macro as a string to interpose a wrapper around the macro 'MAC'
+ (perhaps to debug it).
+
+
+File: groff.info, Node: if-else, Next: while, Prev: Operators in Conditionals, Up: Conditionals and Loops
+
+5.23.3 if-else
+--------------
+
+ -- Request: .ie cond-expr anything
+ -- Request: .el anything
+ Use the 'ie' and 'el' requests to write an if-then-else. The first
+ request is the "if" part and the latter is the "else" part.
+ Unusually among programming languages, any number of
+ non-conditional requests may be interposed between the 'ie' branch
+ and the 'el' branch.
+
+ .nr a 0
+ .ie \na a is non-zero.
+ .nr a +1
+ .el a was not positive but is now \na.
+ => a was not positive but is now 1.
+
+ Another way in which 'el' is an ordinary request is that it does
+ not lexically "bind" more tightly to its 'ie' counterpart than it
+ does to any other request. This fact can surprise C programmers.
+
+ .nr a 1
+ .nr z 0
+ .ie \nz \
+ . ie \na a is true
+ . el a is false
+ .el z is false
+ error-> warning: unbalanced 'el' request
+ => a is false
+
+ To conveniently nest conditionals, keep reading.
+
+
+File: groff.info, Node: Conditional Blocks, Next: while, Prev: Operators in Conditionals, Up: Conditionals and Loops
+
+5.23.4 Conditional Blocks
+-------------------------
+
+It is frequently desirable for a control structure to govern more than
+one request, macro call, text line, or a combination of the foregoing.
+The opening and closing brace escape sequences '\{' and '\}' define such
+groups. These "conditional blocks" can furthermore be nested.
+
+ -- Escape sequence: \{
+ -- Escape sequence: \}
+ '\{' begins a conditional block; it must appear (after optional
+ spaces and tabs) immediately subsequent to the conditional
+ expression of an 'if', 'ie', or 'while' request,(1) (*note
+ Conditional Blocks-Footnote-1::) or as the argument to an 'el'
+ request.
+
+ '\}' ends a condition block and should appear on a line with other
+ occurrences of itself as necessary to match '\{' sequences. It can
+ be preceded by a control character, spaces, and tabs. Input after
+ any quantity of '\}' sequences on the same line is processed only
+ if all of the preceding conditions to which they correspond are
+ true. Furthermore, a '\}' closing the body of a 'while' request
+ must be the last such escape sequence on an input line.
+
+ Brace escape sequences outside of control structures have no
+ meaning and produce no output.
+
+ *Caution:* Input lines using '\{' often end with '\RET', especially
+ in macros that consist primarily of control lines. Forgetting to
+ use '\RET' on an input line after '\{' is a common source of error.
+
+ We might write the following in a page header macro. If we delete
+'\RET', the header will carry an unwanted extra empty line (except on
+page 1).
+
+ .if (\\n[%] != 1) \{\
+ . ie ((\\n[%] % 2) = 0) .tl \\*[even-numbered-page-title]
+ . el .tl \\*[odd-numbered-page-title]
+ .\}
+
+ Let us take a closer look at how conditional blocks nest.
+
+ A
+ .if 0 \{ B
+ C
+ D
+ \}E
+ F
+ => A F
+
+ N
+ .if 1 \{ O
+ . if 0 \{ P
+ Q
+ R\} S\} T
+ U
+ => N O U
+
+ The above behavior may challenge the intuition; it was implemented to
+retain compatibility with AT&T 'troff'. For clarity, it is idiomatic to
+end input lines with '\{' (followed by '\<RET>' if appropriate), and to
+precede '\}' on an input line with nothing more than a control
+character, spaces, tabs, and other instances of itself.
+
+ We can use 'ie', 'el', and conditional blocks to simulate the
+multi-way "switch" or "case" control structures of other languages. The
+following example is adapted from the 'groff' 'man' package.
+Indentation is used to clarify the logic.
+
+ .\" Simulate switch/case in roff.
+ . ie '\\$2'1' .ds title General Commands\"
+ .el \{.ie '\\$2'2' .ds title System Calls\"
+ .el \{.ie '\\$2'3' .ds title Library Functions\"
+ .el \{.ie '\\$2'4' .ds title Kernel Interfaces\"
+ .el \{.ie '\\$2'5' .ds title File Formats\"
+ .el \{.ie '\\$2'6' .ds title Games\"
+ .el \{.ie '\\$2'7' .ds title Miscellaneous Information\"
+ .el \{.ie '\\$2'8' .ds title System Management\"
+ .el \{.ie '\\$2'9' .ds title Kernel Development\"
+ .el .ds title \" empty
+ .\}\}\}\}\}\}\}\}
+
+
+File: groff.info, Node: Conditional Blocks-Footnotes, Up: Conditional Blocks
+
+ (1) *Note while::.
+
+
+File: groff.info, Node: while, Prev: if-else, Up: Conditionals and Loops
+
+5.23.5 while
+------------
+
+'groff' provides a looping construct: the 'while' request. Its syntax
+matches the 'if' request.
+
+ -- Request: .while cond-expr anything
+ Evaluate the conditional expression COND-EXPR, and repeatedly
+ execute ANYTHING unless and until COND-EXPR evaluates false.
+ ANYTHING, which is often a conditional block, is referred to as the
+ 'while' request's "body".
+
+ .nr a 0 1
+ .while (\na < 9) \{\
+ \n+a,
+ .\}
+ \n+a
+ => 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
+
+ GNU 'troff' treats the body of a 'while' request similarly to that
+ of a 'de' request (albeit one not read in copy mode(1) (*note
+ while-Footnote-1::)), but stores it under an internal name and
+ deletes it when the loop finishes. The operation of a macro
+ containing a 'while' request can slow significantly if the 'while'
+ body is large. Each time the macro is executed, the 'while' body
+ is parsed and stored again.
+
+ .de xxx
+ . nr num 10
+ . while (\\n[num] > 0) \{\
+ . \" many lines of code
+ . nr num -1
+ . \}
+ ..
+
+ An often better solution--and one that is more portable, since AT&T
+ 'troff' lacked the 'while' request--is to instead write a recursive
+ macro. It will be parsed only once.(2) (*note while-Footnote-2::)
+
+ .de yyy
+ . if (\\n[num] > 0) \{\
+ . \" many lines of code
+ . nr num -1
+ . yyy
+ . \}
+ ..
+ .
+ .de xxx
+ . nr num 10
+ . yyy
+ ..
+
+ To prevent infinite loops, the default number of available
+ recursion levels is 1,000 or somewhat less.(3) (*note
+ while-Footnote-3::) You can disable this protective measure, or
+ raise the limit, by setting the 'slimit' register. *Note
+ Debugging::.
+
+ As noted above, if a 'while' body begins with a conditional block,
+ its closing brace must end an input line.
+
+ .if 1 \{\
+ . nr a 0 1
+ . while (\n[a] < 10) \{\
+ . nop \n+[a]
+ .\}\}
+ error-> unbalanced brace escape sequences
+
+ -- Request: .break
+ Exit a 'while' loop. Do not confuse this request with a
+ typographical break or the 'br' request.
+
+ -- Request: .continue
+ Skip the remainder of a 'while' loop's body, immediately starting
+ the next iteration.
+
+
+File: groff.info, Node: while-Footnotes, Up: while
+
+ (1) *Note Copy Mode::.
+
+ (2) unless you redefine it
+
+ (3) "somewhat less" because things other than macro calls can be on
+the input stack
+
+
+File: groff.info, Node: Writing Macros, Next: Page Motions, Prev: Conditionals and Loops, Up: GNU troff Reference
+
+5.24 Writing Macros
+===================
+
+A "macro" is a stored collection of text and control lines that can be
+interpolated multiple times. Use macros to define common operations.
+Macros are called in the same way that requests are invoked. While
+requests exist for the purpose of creating macros, simply calling an
+undefined macro, or interpolating it as a string, will cause it to be
+defined as empty. *Note Identifiers::.
+
+ -- Request: .de name [end]
+ Define a macro NAME, replacing the definition of any existing
+ request, macro, string, or diversion called NAME. If NAME already
+ exists as an alias, the target of the alias is redefined; recall
+ *note Strings::. GNU 'troff' enters copy mode,(1) (*note Writing
+ Macros-Footnote-1::) storing subsequent input lines as the macro
+ definition. If the optional second argument is not specified, the
+ definition ends with the control line '..' (two dots).
+ Alternatively, END identifies a macro whose call syntax at the
+ start of a control line ends the definition of NAME; END is then
+ called normally. A macro definition must end in the same
+ conditional block (if any) in which it began (*note Conditional
+ Blocks::). Spaces or tabs are permitted after the control
+ character in the line containing this ending token (either '.' or
+ 'END'), but a tab immediately after the token prevents its
+ recognition as the end of a macro definition. The macro END can be
+ called with arguments.(2) (*note Writing Macros-Footnote-2::)
+
+ Here is a small example macro called 'P' that causes a break and
+ inserts some vertical space. It could be used to separate
+ paragraphs.
+
+ .de P
+ . br
+ . sp .8v
+ ..
+
+ We can define one macro within another. Attempting to nest '..'
+ naïvely will end the outer definition because the inner definition
+ isn't interpreted as such until the outer macro is later
+ interpolated. We can use an end macro instead. Each level of
+ nesting should use a unique end macro.
+
+ An end macro need not be defined until it is called. This fact
+ enables a nested macro definition to begin inside one macro and end
+ inside another. Consider the following example.(3) (*note Writing
+ Macros-Footnote-3::)
+
+ .de m1
+ . de m2 m3
+ you
+ ..
+ .de m3
+ Hello,
+ Joe.
+ ..
+ .de m4
+ do
+ ..
+ .m1
+ know?
+ . m3
+ What
+ .m4
+ .m2
+ => Hello, Joe. What do you know?
+
+ A nested macro definition _can_ be terminated with '..' and nested
+ macros _can_ reuse end macros, but these control lines must be
+ escaped multiple times for each level of nesting. The necessity of
+ this escaping and the utility of nested macro definitions will
+ become clearer when we employ macro parameters and consider the
+ behavior of copy mode in detail.
+
+ 'de' defines a macro that inherits the compatibility mode enablement
+status of its context (*note Implementation Differences::). Often it is
+desirable to make a macro that uses 'groff' features callable from
+contexts where compatibility mode is on; for instance, when writing
+extensions to a historical macro package. To achieve this,
+compatibility mode needs to be switched off while such a macro is
+interpreted--without disturbing that state when it is finished.
+
+ -- Request: .de1 name [end]
+ The 'de1' request defines a macro to be interpreted with
+ compatibility mode disabled. When NAME is called, compatibility
+ mode enablement status is saved; it is restored when the call
+ completes. Observe the extra backlash before the interpolation of
+ register 'xxx'; we'll explore this subject in *note Copy Mode::.
+
+ .nr xxx 12345
+ .de aa
+ The value of xxx is \\n[xxx].
+ . br
+ ..
+ .de1 bb
+ The value of xxx is \\n[xxx].
+ ..
+ .cp 1
+ .aa
+ error-> warning: register '[' not defined
+ => The value of xxx is 0xxx].
+ .bb
+ => The value of xxx is 12345.
+
+ -- Request: .dei name [end]
+ -- Request: .dei1 name [end]
+ The 'dei' request defines a macro with its name and end macro
+ indirected through strings. That is, it interpolates strings named
+ NAME and END before performing the definition.
+
+ The following examples are equivalent.
+
+ .ds xx aa
+ .ds yy bb
+ .dei xx yy
+
+ .de aa bb
+
+ The 'dei1' request bears the same relationship to 'dei' as 'de1'
+ does to 'de'; it temporarily turns compatibility mode off when NAME
+ is called.
+
+ -- Request: .am name [end]
+ -- Request: .am1 name [end]
+ -- Request: .ami name [end]
+ -- Request: .ami1 name [end]
+ 'am' appends subsequent input lines to macro NAME, extending its
+ definition, and otherwise working as 'de' does.
+
+ To make the previously defined 'P' macro set indented instead of
+ block paragraphs, add the necessary code to the existing macro.
+
+ .am P
+ .ti +5n
+ ..
+
+ The other requests are analogous to their 'de' counterparts. The
+ 'am1' request turns off compatibility mode during interpretation of
+ the appendment. The 'ami' request appends indirectly, meaning that
+ strings NAME and END are interpolated with the resulting names used
+ before appending. The 'ami1' request is similar to 'ami',
+ disabling compatibility mode during interpretation of the appended
+ lines.
+
+ Using 'trace.tmac', you can trace calls to 'de', 'de1', 'am', and
+'am1'. You can also use the 'backtrace' request at any point desired to
+troubleshoot tricky spots (*note Debugging::).
+
+ *Note Strings::, for the 'als', 'rm', and 'rn' requests to create an
+alias of, remove, and rename a macro, respectively.
+
+ Macro identifiers share their name space with requests, strings, and
+diversions; see *note Identifiers::. The 'am', 'as', 'da', 'de', 'di',
+and 'ds' requests (together with their variants) create a new object
+only if the name of the macro, diversion, or string is currently
+undefined or if it is defined as a request; normally, they modify the
+value of an existing object. *Note the description of the 'als'
+request: als, for pitfalls when redefining a macro that is aliased.
+
+ -- Request: .return [anything]
+ Exit a macro, immediately returning to the caller. If called with
+ an argument ANYTHING, exit twice--the current macro and the macro
+ one level higher. This is used to define a wrapper macro for
+ 'return' in 'trace.tmac'.
+
+* Menu:
+
+* Parameters::
+* Copy Mode::
+
+
+File: groff.info, Node: Writing Macros-Footnotes, Up: Writing Macros
+
+ (1) *Note Copy Mode::.
+
+ (2) While it is possible to define and call a macro '.', you can't
+use it as an end macro: during a macro definition, '..' is never handled
+as calling '.', even if '.de NAME .' explicitly precedes it.
+
+ (3) Its structure is adapted from, and isomorphic to, part of a
+solution by Tadziu Hoffman to the problem of reflowing text multiple
+times to find an optimal configuration for it.
+<https://lists.gnu.org/archive/html/groff/2008-12/msg00006.html>
+
+
+File: groff.info, Node: Parameters, Next: Copy Mode, Prev: Writing Macros, Up: Writing Macros
+
+5.24.1 Parameters
+-----------------
+
+Macro calls and string interpolations optionally accept a list of
+arguments; recall *note Calling Macros::. At the time such an
+interpolation takes place, these "parameters" can be examined using a
+register and a variety of escape sequences starting with '\$'. All such
+escape sequences are interpreted even in copy mode, a fact we shall
+motivate and explain below (*note Copy Mode::).
+
+ -- Register: \n[.$]
+ The count of parameters available to a macro or string is kept in
+ this read-only register. The 'shift' request can change its value.
+
+ Any individual parameter can be accessed by its position in the list
+of arguments to the macro call, numbered from left to right starting at
+1, with one of the following escape sequences.
+
+ -- Escape sequence: \$n
+ -- Escape sequence: \$(nn
+ -- Escape sequence: \$[nnn]
+ Interpolate the Nth, NNth, or NNNth parameter. The first form
+ expects only a single digit (1<=N<=9)), the second two digits
+ (01<=NN<=99)), and the third any positive integer NNN. Macros and
+ strings accept an unlimited number of parameters.
+
+ -- Request: .shift [n]
+ Shift the parameters N places (1 by default). This is a "left
+ shift": what was parameter I becomes parameter I-N. The parameters
+ formerly in positions 1 to N are no longer available. Shifting by
+ a non-positive amount performs no operation. The register '.$' is
+ adjusted accordingly.
+
+ In practice, parameter interpolations are usually seen prefixed with
+an extra escape character. This is because the '\$' family of escape
+sequences is interpreted even in copy mode.(1) (*note
+Parameters-Footnote-1::)
+
+ -- Escape sequence: \$*
+ -- Escape sequence: \$@
+ -- Escape sequence: \$^
+ In some cases it is convenient to interpolate all of the parameters
+ at once (to pass them to a request, for instance). The '\$*'
+ escape concatenates the parameters, separating them with spaces.
+ '\$@' is similar, concatenating the parameters, surrounding each
+ with double quotes and separating them with spaces. If not in
+ compatibility mode, the interpolation depth of double quotes is
+ preserved (*note Calling Macros::). '\$^' interpolates all
+ parameters as if they were arguments to the 'ds' request.
+
+ .de foo
+ . tm $1='\\$1'
+ . tm $2='\\$2'
+ . tm $*='\\$*'
+ . tm $@='\\$@'
+ . tm $^='\\$^'
+ ..
+ .foo " This is a "test"
+ error-> $1=' This is a '
+ error-> $2='test"'
+ error-> $*=' This is a test"'
+ error-> $@='" This is a " "test""'
+ error-> $^='" This is a "test"'
+
+ '\$*' is useful when writing a macro that doesn't need to
+ distinguish its arguments, or even to not interpret them; examples
+ include macros that produce diagnostic messages by wrapping the
+ 'tm' or 'ab' requests. Use '\$@' when writing a macro that may
+ need to shift its parameters and/or wrap a macro or request that
+ finds the count significant. If in doubt, prefer '\$@' to '\$*'.
+ An application of '\$^' is seen in 'trace.tmac', which redefines
+ some requests and macros for debugging purposes.
+
+ -- Escape sequence: \$0
+ Interpolate the name by which the macro being interpreted was
+ called. The 'als' request can cause a macro to have more than one
+ name. Applying string interpolation to a macro does not change
+ this name.
+
+ .de foo
+ . tm \\$0
+ ..
+ .als bar foo
+ .
+ .de aaa
+ . foo
+ ..
+ .de bbb
+ . bar
+ ..
+ .de ccc
+ \\*[foo]\\
+ ..
+ .de ddd
+ \\*[bar]\\
+ ..
+ .
+ .aaa
+ error-> foo
+ .bbb
+ error-> bar
+ .ccc
+ error-> ccc
+ .ddd
+ error-> ddd
+
+
+File: groff.info, Node: Parameters-Footnotes, Up: Parameters
+
+ (1) If they were not, parameter interpolations would be similar to
+command-line parameters--fixed for the entire duration of a 'roff'
+program's run. The advantage of interpolating '\$' escape sequences
+even in copy mode is that they can interpolate different contents from
+one call to the next, like function parameters in a procedural language.
+The additional escape character is the price of this power.
+
+
+File: groff.info, Node: Copy Mode, Prev: Parameters, Up: Writing Macros
+
+5.24.2 Copy Mode
+----------------
+
+When GNU 'troff' processes certain requests, most importantly those
+which define or append to a macro or string, it does so in "copy mode":
+it copies the characters of the definition into a dedicated storage
+region, interpolating the escape sequences '\n', '\g', '\$', '\*', '\V',
+and '\?' normally; interpreting '\<RET>' immediately; discarding
+comments '\"' and '\#'; interpolating the current leader, escape, or tab
+character with '\a', '\e', and '\t', respectively; and storing all other
+escape sequences in an encoded form.
+
+ The complement of copy mode--a 'roff' formatter's behavior when not
+defining or appending to a macro, string, or diversion--where all macros
+are interpolated, requests invoked, and valid escape sequences processed
+immediately upon recognition, can be termed "interpretation mode".
+
+ -- Escape sequence: \\
+ The escape character, '\' by default, can escape itself. This
+ enables you to control whether a given '\n', '\g', '\$', '\*',
+ '\V', or '\?' escape sequence is interpreted at the time the macro
+ containing it is defined, or later when the macro is called.(1)
+ (*note Copy Mode-Footnote-1::)
+
+ .nr x 20
+ .de y
+ .nr x 10
+ \&\nx
+ \&\\nx
+ ..
+ .y
+ => 20 10
+
+ You can think of '\\' as a "delayed" backslash; it is the escape
+ character followed by a backslash from which the escape character
+ has removed its special meaning. Consequently, '\\' is not an
+ escape sequence in the usual sense. In any escape sequence '\X'
+ that GNU 'troff' does not recognize, the escape character is
+ ignored and X is output. An unrecognized escape sequence causes a
+ warning in category 'escape', with two exceptions--'\\' is the
+ first.
+
+ -- Escape sequence: \.
+ '\.' escapes the control character. It is similar to '\\' in that
+ it isn't a true escape sequence. It is used to permit nested macro
+ definitions to end without a named macro call to conclude them.
+ Without a syntax for escaping the control character, this would not
+ be possible.
+
+ .de m1
+ foo
+ .
+ . de m2
+ bar
+ \\..
+ .
+ ..
+ .m1
+ .m2
+ => foo bar
+
+ The first backslash is consumed while the macro is read, and the
+ second is interpreted when macro 'm1' is called.
+
+ 'roff' documents should not use the '\\' or '\.' character sequences
+outside of copy mode; they serve only to obfuscate the input. Use '\e'
+to represent the escape character, '\[rs]' to obtain a backslash glyph,
+and '\&' before '.' and ''' where GNU 'troff' expects them as control
+characters if you mean to use them literally (recall *note Requests and
+Macros::).
+
+ Macro definitions can be nested to arbitrary depth. The mechanics of
+parsing the escape character have significant consequences for this
+practice.
+
+ .de M1
+ \\$1
+ . de M2
+ \\\\$1
+ . de M3
+ \\\\\\\\$1
+ \\\\..
+ . M3 hand.
+ \\..
+ . M2 of
+ ..
+ This understeer is getting
+ .M1 out
+ => This understeer is getting out of hand.
+
+ Each escape character is interpreted twice--once in copy mode, when
+the macro is defined, and once in interpretation mode, when the macro is
+called. As seen above, this fact leads to exponential growth in the
+quantity of escape characters required to delay interpolation of '\n',
+'\g', '\$', '\*', '\V', and '\?' at each nesting level, which can be
+daunting. GNU 'troff' offers a solution.
+
+ -- Escape sequence: \E
+ '\E' represents an escape character that is not interpreted in copy
+ mode. You can use it to ease the writing of nested macro
+ definitions.
+
+ .de M1
+ . nop \E$1
+ . de M2
+ . nop \E$1
+ . de M3
+ . nop \E$1
+ \\\\..
+ . M3 better.
+ \\..
+ . M2 bit
+ ..
+ This vehicle handles
+ .M1 a
+ => This vehicle handles a bit better.
+
+ Observe that because '\.' is not a true escape sequence, we can't
+ use '\E' to keep '..' from ending a macro definition prematurely.
+ If the multiplicity of backslashes complicates maintenance, use end
+ macros.
+
+ '\E' is also convenient to define strings containing escape
+ sequences that need to work when used in copy mode (for example, as
+ macro arguments), or which will be interpolated at varying macro
+ nesting depths. We might define strings to begin and end
+ superscripting as follows.(2) (*note Copy Mode-Footnote-2::)
+
+ .ds { \v'-.9m\s'\En[.s]*7u/10u'+.7m'
+ .ds } \v'-.7m\s0+.9m'
+
+ When the 'ec' request is used to redefine the escape character,
+ '\E' also makes it easier to distinguish the semantics of an escape
+ character from the other meaning(s) its character might have.
+ Consider the use of an unusual escape character, '-'.
+
+ .nr a 1
+ .ec -
+ .de xx
+ --na
+ ..
+ .xx
+ => -na
+
+ This result may surprise you; some people expect '1' to be output
+ since register 'a' has clearly been defined with that value. What
+ has happened? The robotic replacement of '\' with '-' has led us
+ astray. You might recognize the sequence '--' more readily with
+ the default escape character as '\-', the special character escape
+ sequence for the minus sign glyph.
+
+ .nr a 1
+ .ec -
+ .de xx
+ -Ena
+ ..
+ .xx
+ => 1
+
+
+File: groff.info, Node: Copy Mode-Footnotes, Up: Copy Mode
+
+ (1) Compare this to the '\def' and '\edef' commands in TeX.
+
+ (2) These are lightly adapted from the 'groff' implementation of the
+'ms' macros.
+
+
+File: groff.info, Node: Page Motions, Next: Drawing Geometric Objects, Prev: Writing Macros, Up: GNU troff Reference
+
+5.25 Page Motions
+=================
+
+*Note Manipulating Spacing::, for a discussion of the most commonly used
+request for vertical motion, 'sp', which spaces downward by one vee.
+
+ -- Request: .mk [reg]
+ -- Request: .rt [dist]
+ You can "mark" a location on a page for subsequent "return". 'mk'
+ takes an argument, a register name in which to store the current
+ page location. If given no argument, it stores the location in an
+ internal register. This location can be used later by the 'rt' or
+ the 'sp' requests (or the '\v' escape).
+
+ The 'rt' request returns _upward_ to the location marked with the
+ last 'mk' request. If used with an argument, it returns to a
+ vertical position DIST from the top of the page (no previous call
+ to 'mk' is necessary in this case). The default scaling unit is
+ 'v'.
+
+ If a page break occurs between a 'mk' request and its matching 'rt'
+ request, the 'rt' request is silently ignored.
+
+ A simple implementation of a macro to set text in two columns
+ follows.
+
+ .nr column-length 1.5i
+ .nr column-gap 4m
+ .nr bottom-margin 1m
+ .
+ .de 2c
+ . br
+ . mk
+ . ll \\n[column-length]u
+ . wh -\\n[bottom-margin]u 2c-trap
+ . nr right-side 0
+ ..
+ .
+ .de 2c-trap
+ . ie \\n[right-side] \{\
+ . nr right-side 0
+ . po -(\\n[column-length]u + \\n[column-gap]u)
+ . \" remove trap
+ . wh -\\n[bottom-margin]u
+ . \}
+ . el \{\
+ . \" switch to right side
+ . nr right-side 1
+ . po +(\\n[column-length]u + \\n[column-gap]u)
+ . rt
+ . \}
+ ..
+
+ Now let us apply our two-column macro.
+
+ .pl 1.5i
+ .ll 4i
+ This is a small test that shows how the
+ rt request works in combination with mk.
+
+ .2c
+ Starting here, text is typeset in two columns.
+ Note that this implementation isn't robust
+ and thus not suited for a real two-column
+ macro.
+ => This is a small test that shows how the
+ => rt request works in combination with mk.
+ =>
+ => Starting here, isn't robust
+ => text is typeset and thus not
+ => in two columns. suited for a
+ => Note that this real two-column
+ => implementation macro.
+
+ Several escape sequences enable fine control of movement about the
+page.
+
+ -- Escape sequence: \v'expr'
+ Vertically move the drawing position. EXPR indicates the magnitude
+ of motion: positive is downward and and negative upward. The
+ default scaling unit is 'v'. The motion is relative to the current
+ drawing position unless EXPR begins with the boundary-relative
+ motion operator '|'. *Note Numeric Expressions::.
+
+ Text processing continues at the new drawing position; usually,
+ vertical motions should be in balanced pairs to avoid a confusing
+ page layout.
+
+ '\v' will not spring a vertical position trap. This can be useful;
+ for example, consider a page bottom trap macro that prints a marker
+ in the margin to indicate continuation of a footnote. *Note
+ Traps::.
+
+ A few escape sequences that produce vertical motion are unusual.
+They are thought to originate early in AT&T 'nroff' history to achieve
+super- and subscripting by half-line motions on line printers and
+teletypewriters before the phototypesetter made more precise positioning
+available. They are reckoned in ems--not vees--to maintain continuity
+with their original purpose of moving relative to the size of the type
+rather than the distance between text baselines (vees).(1) (*note Page
+Motions-Footnote-1::)
+
+ -- Escape sequence: \r
+ -- Escape sequence: \u
+ -- Escape sequence: \d
+ Move upward 1m, upward .5m, and downward .5m, respectively.
+
+Let us see these escape sequences in use.
+
+ Obtain 100 cm\u3\d of \ka\d\092\h'|\nau'\r233\dU.
+
+ In the foregoing we have paired '\u' and '\d' to typeset a
+superscript, and later a full em negative ("reverse") motion to place a
+superscript above a subscript. A numeral-width horizontal motion escape
+sequence aligns the proton and nucleon numbers, while '\k' marks a
+horizontal position to which '\h' returns so that we could stack them.
+(We shall discuss these horizontal motion escape sequences presently.)
+In serious applications, we often want to alter the type size of the
+-scripts and to fine-tune the vertical motions, as the 'groff' 'ms'
+package does with its super- and subscripting string definitions.
+
+ -- Escape sequence: \h'expr'
+ Horizontally move the drawing position. EXPR indicates the
+ magnitude of motion: positive is rightward and negative leftward.
+ The default scaling unit is 'm'. The motion is relative to the
+ current drawing position unless EXPR begins with the
+ boundary-relative motion operator '|'. *Note Numeric
+ Expressions::.
+
+ The following string definition sets the TeX logo.(2) (*note Page
+Motions-Footnote-2::)
+
+ .ds TeX T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X\"
+
+ There are a number of special-case escape sequences for horizontal
+motion.
+
+ -- Escape sequence: \<SP>
+ Move right one word space. (The input is a backslash followed by a
+ space.) This escape sequence can be thought of as a
+ non-adjustable, unbreakable space. Usually you want '\~' instead;
+ see *note Manipulating Filling and Adjustment::.
+
+ -- Escape sequence: \|
+ Move one-sixth em to the right on typesetting output devices. If a
+ glyph named '\|' is defined in the current font, its width is used
+ instead, even on terminal output devices.
+
+ -- Escape sequence: \^
+ Move one-twelfth em to the right on typesetting output devices. If
+ a glyph named '\^' is defined in the current font, its width is
+ used instead, even on terminal output devices.
+
+ -- Escape sequence: \0
+ Move right by the width of a numeral in the current font.
+
+ Horizontal motions are not discarded at the end of an output line as
+word spaces are. *Note Breaking::.
+
+ -- Escape sequence: \w'anything'
+ -- Register: \n[st]
+ -- Register: \n[sb]
+ -- Register: \n[rst]
+ -- Register: \n[rsb]
+ -- Register: \n[ct]
+ -- Register: \n[ssc]
+ -- Register: \n[skw]
+ Interpolate the width of ANYTHING in basic units. This escape
+ sequence allows several properties of formatted output to be
+ measured without writing it out.
+
+ The length of the string 'abc' is \w'abc'u.
+ => The length of the string 'abc' is 72u.
+
+ ANYTHING is processed in a dummy environment: this means that font
+ and type size changes, for example, may occur within it without
+ affecting subsequent output.
+
+ After each use, '\w' sets several registers.
+
+ 'st'
+ 'sb'
+ The maximum vertical displacements of the text baseline above
+ and below, respectively. The sign convention is opposite that
+ of relative vertical motions; that is, depth below the
+ (original) baseline is negative. These registers are
+ incorrectly documented in the AT&T 'troff' manual as "the
+ highest and lowest extent of [the argument to '\w'] relative
+ to the baseline".
+
+ 'rst'
+ 'rsb'
+ Like 'st' and 'sb', but taking account of the heights and
+ depths of glyphs. In other words, these registers store the
+ highest and lowest vertical positions attained by ANYTHING,
+ doing what AT&T 'troff' documented 'st' and 'sb' as doing.
+
+ 'ct'
+ Characterizes the geometry of glyphs occurring in ANYTHING.
+
+ 0
+ only short glyphs, no descenders or tall glyphs
+
+ 1
+ at least one descender
+
+ 2
+ at least one tall glyph
+
+ 3
+ at least one each of a descender and a tall glyph
+
+ 'ssc'
+ The amount of horizontal space (possibly negative) that should
+ be added to the last glyph before a subscript.
+
+ 'skw'
+ How far to right of the center of the last glyph in the '\w'
+ argument, the center of an accent from a roman font should be
+ placed over that glyph.
+
+ -- Escape sequence: \kp
+ -- Escape sequence: \k(ps
+ -- Escape sequence: \k[position]
+ Store the current horizontal position in the _input_ line in a
+ register with the name POSITION (one-character name P,
+ two-character name PS). Use this, for example, to return to the
+ beginning of a string for highlighting or other decoration.
+
+ -- Register: \n[hp]
+ The current horizontal position at the input line.
+
+ -- Register: \n[.k]
+ A read-only register containing the current horizontal output
+ position (relative to the current indentation).
+
+ -- Escape sequence: \o'abc...'
+ Overstrike the glyphs of characters A, B, C, ...; the glyphs are
+ centered, written, and the drawing position advanced by the widest
+ of the glyphs.
+
+ -- Escape sequence: \zc
+ Format the character C with zero width; that is, without advancing
+ the drawing position. Use '\z' to overstrike glyphs aligned to
+ their left edges, in contrast to '\o''s centering.
+
+ -- Escape sequence: \Z'anything'
+ Save the drawing position, format ANYTHING, then restore it. Tabs
+ and leaders in the argument are ignored with an error diagnostic.
+
+ We might implement a strike-through macro thus.
+
+ .de ST
+ .nr width \w'\\$1'
+ \Z@\v'-.25m'\l'\\n[width]u'@\\$1
+ ..
+ .
+ This is
+ .ST "a test"
+ an actual emergency!
+
+
+File: groff.info, Node: Page Motions-Footnotes, Up: Page Motions
+
+ (1) At the 'grops' defaults of 10-point type on 12-point vertical
+spacing, the difference between half a vee and half an em can be subtle:
+large spacings like '.vs .5i' make it obvious.
+
+ (2) *Note Strings::, for an explanation of the trailing '\"'.
+
+
+File: groff.info, Node: Drawing Geometric Objects, Next: Traps, Prev: Page Motions, Up: GNU troff Reference
+
+5.26 Drawing Geometric Objects
+==============================
+
+A few of the formatter's escape sequences draw lines and other geometric
+objects. Combined with each other and with page motion commands (*note
+Page Motions::), a wide variety of figures is possible. For complex
+drawings, these operations can be cumbersome; the preprocessors 'gpic'
+or 'ggrn' are typically used instead.
+
+ The '\l' and '\L' escape sequences draw horizontal and vertical
+sequences of glyphs, respectively. Even the simplest of output devices
+supports them.
+
+ -- Escape sequence: \l'l'
+ -- Escape sequence: \l'lc'
+ Draw a horizontal line of length L from the drawing position.
+ Rightward motion is positive. Afterward, the drawing position is
+ at the right end of the line. The default scaling unit is 'm'.
+
+ The optional second parameter C is a character with which to draw
+ the line. The default is the baseline rule special character,
+ '\[ru]'.
+
+ If C is a valid scaling unit, put '\&' after L to disambiguate the
+ input.
+
+ .de textbox
+ \[br]\\$*\[br]\l'|0\[rn]'\l'|0\[ul]'
+ ..
+
+ The foregoing outputs a box rule (a vertical line), the text
+ argument(s), and another box rule. We employ the boundary-relative
+ motion operator '|'. Finally, the line-drawing escape sequences
+ draw a radical extender (a form of overline) and an underline from
+ the drawing position to the position coresponding to beginning of
+ the _input_ line. The drawing position returns to just after the
+ right-hand box rule because the lengths of the drawn lines are
+ negative, as noted above.
+
+ -- Escape sequence: \L'l'
+ -- Escape sequence: \L'lc'
+ Draw a vertical line of length L from the drawing position.
+ Downward motion is positive. The default scaling unit is 'v'. The
+ default character is the box rule, '\[br]'. As with vertical
+ motion escape sequences, text processing continues where the line
+ ends. '\L' is otherwise similar to '\l'.
+
+ $ nroff <<EOF
+ This is a \L'3v'test.
+ EOF
+ => This is a
+ => |
+ => |
+ => |test.
+
+ When writing text, the drawing position is at the text baseline;
+ recall *note Page Geometry::.
+
+ The '\D' escape sequence provides "drawing commands" that direct the
+output device to render geometrical objects rather than glyphs.
+Specific devices may support only a subset, or may feature additional
+ones; consult the man page for the output driver in use. Terminal
+devices in particular implement almost none. *Note Graphics Commands::.
+
+ Rendering starts at the drawing position; when finished, the drawing
+position is left at the rightmost point of the object, even for closed
+figures, except where noted. GNU 'troff' draws stroked (outlined)
+objects with the stroke color, and shades filled ones with the fill
+color. *Note Colors::. Coordinates H and V are horizontal and vertical
+motions relative to the drawing position or previous point in the
+command. The default scaling unit for horizontal measurements (and
+diameters of circles) is 'm'; for vertical ones, 'v'.
+
+ Circles, ellipses, and polygons can be drawn filled or stroked.
+These are independent properties; if you want a filled, stroked figure,
+you must draw the same figure twice using each drawing command. A
+filled figure is always smaller than an outlined one because the former
+is drawn only within its defined area, whereas strokes have a line
+thickness (set with '\D't'').
+
+ \h'1i'\v'1i'\
+ \# increase line thickness
+ \Z'\D't 5p''\
+ \# draw stroked (unfilled) polygon
+ \Z'\D'p 3 3 -6 0''\
+ \# draw filled (solid) polygon
+ \Z'\D'P 3 3 -6 0''
+
+ -- Escape sequence: \D'command argument ...'
+ Drawing command escape sequence parameters begin with an ordinary
+ character, COMMAND, selecting the type of object to be drawn,
+ followed by ARGUMENTs whose meaning is determined by COMMAND.
+
+ '\D'~ H1 V1 ... HN VN''
+ Draw a B-spline to each point in sequence, leaving the drawing
+ position at (HN, VN).
+
+ '\D'a HC VC H V''
+ Draw a circular arc centered at (HC, VC) counterclockwise from
+ the drawing position to a point (H, V) relative to the center.
+ (1) (*note Drawing Geometric Objects-Footnote-1::)
+
+ '\D'c D''
+ Draw a circle of diameter D with its leftmost point at the
+ drawing position.
+
+ '\D'C D''
+ As '\D'C ...'', but the circle is filled.
+
+ '\D'e H V''
+ Draw an ellipse of width H and height V with its leftmost
+ point at the drawing position.
+
+ '\D'E X Y''
+ As '\D'e ...'', but the ellipse is filled.
+
+ '\D'l DX DY''
+ Draw line from the drawing position to (H, V).
+
+ The following is a macro for drawing a box around a text
+ argument; for simplicity, the box margin is a fixed at 0.2m.
+
+ .de TEXTBOX
+ . nr @wd \w'\\$1'
+ \h'.2m'\
+ \h'-.2m'\v'(.2m - \\n[rsb]u)'\
+ \D'l 0 -(\\n[rst]u - \\n[rsb]u + .4m)'\
+ \D'l (\\n[@wd]u + .4m) 0'\
+ \D'l 0 (\\n[rst]u - \\n[rsb]u + .4m)'\
+ \D'l -(\\n[@wd]u + .4m) 0'\
+ \h'.2m'\v'-(.2m - \\n[rsb]u)'\
+ \\$1\
+ \h'.2m'
+ ..
+
+ The argument is measured with the '\w' escape sequence. Its
+ width is stored in register '@wd'. '\w' also sets the
+ registers 'rst' and 'rsb'; these contain its maximum vertical
+ extents of the argument. Then, four lines are drawn to form a
+ box, offset by the box margin.
+
+ '\D'p H1 V1 ... HN VN''
+ Draw polygon with vertices at drawing position and each point
+ in sequence. GNU 'troff' closes the polygon by drawing a line
+ from (HN, VN) back to the initial drawing position.
+ Afterward, the drawing position is left at (HN, VN).
+
+ '\D'P DX1 DY1 DX2 DY2 ...''
+ As '\D'P ...'', but the polygon is filled.
+
+ The following macro is like the '\D'l'' example, but shades
+ the box. We draw the box before writing the text because
+ colors in GNU 'troff' have no transparency; in othe opposite
+ order, the filled polygon would occlude the text.
+
+ .de TEXTBOX
+ . nr @wd \w'\\$1'
+ \h'.2m'\
+ \h'-.2m'\v'(.2m - \\n[rsb]u)'\
+ \M[lightcyan]\
+ \D'P 0 -(\\n[rst]u - \\n[rsb]u + .4m) \
+ (\\n[@wd]u + .4m) 0 \
+ 0 (\\n[rst]u - \\n[rsb]u + .4m) \
+ -(\\n[@wd]u + .4m) 0'\
+ \h'.2m'\v'-(.2m - \\n[rsb]u)'\
+ \M[]\
+ \\$1\
+ \h'.2m'
+ ..
+
+ '\D't N''
+ Set the stroke thickness of geometric objects to N basic
+ units. A zero N selects the minimal supported thickness. A
+ negative N selects a thickness proportional to the type size;
+ this is the default.
+
+ In a hazy penumbra between text rendering and drawing commands we
+locate the bracket-building escape sequence, '\b'. It can assemble
+apparently large glyphs by vertically stacking ordinary ones.
+
+ -- Escape sequence: \b'contents'
+ Pile and center a sequence of glyphs vertically on the output line.
+ "Piling" stacks glyphs corresponding to each character in CONTENTS,
+ read from left to right, and placed from top to bottom. GNU
+ 'troff' separates the glyphs vertically by 1m, and the pile itself
+ is centered 0.5m above the text baseline. The horizontal drawing
+ position is then advanced by the width of the widest glyph in the
+ pile.
+
+ This rather inflexible positioning algorithm doesn't work with the
+ 'dvi' output device since its bracket pieces vary in height.
+ Instead, use the 'geqn' preprocessor.
+
+ *note Manipulating Spacing:: describes how to adjust the vertical
+ spacing of the output line with the '\x' escape sequence.
+
+ The application of '\b' that lends its name is construction of
+ brackets, braces, and parentheses when typesetting mathematics. We
+ might construct a large opening (left) brace as follows.
+
+ \b'\[lt]\[bv]\[lk]\[bv]\[lb]'
+
+ See 'groff_char(7)' for a list of special character identifiers.
+
+
+File: groff.info, Node: Drawing Geometric Objects-Footnotes, Up: Drawing Geometric Objects
+
+ (1) (HC, VC) is adjusted to the point nearest the perpendicular
+bisector of the arc's chord.
+
+
+File: groff.info, Node: Deferring Output, Next: Traps, Prev: Drawing Geometric Objects, Up: GNU troff Reference
+
+5.27 Deferring Output
+=====================
+
+A few 'roff' language elements are generally not used in simple
+documents, but arise as page layouts become more sophisticated and
+demanding. "Environments" collect formatting parameters like line
+length and typeface. A "diversion" stores formatted output for later
+use. A "trap" is a condition on the input or output, tested
+automatically by the formatter, that is associated with a macro, causing
+it to be called when that condition is fulfilled.
+
+ Footnote support often exercises all three of the foregoing features.
+A simple implementation might work as follows. A pair of macros is
+defined: one starts a footnote and the other ends it. The author calls
+the first macro where a footnote marker is desired. The macro
+establishes a diversion so that the footnote text is collected at the
+place in the body text where its corresponding marker appears. An
+environment is created for the footnote so that it is set at a smaller
+typeface. The footnote text is formatted in the diversion using that
+environment, but it does not yet appear in the output. The document
+author calls the footnote end macro, which returns to the previous
+environment and ends the diversion. Later, after much more body text in
+the document, a trap, set a small distance above the page bottom, is
+sprung. The macro called by the trap draws a line across the page and
+emits the stored diversion. Thus, the footnote is rendered.
+
+ Diversions and traps make the text formatting process non-linear.
+Let us imagine a set of text lines or paragraphs labelled 'A', 'B', and
+so on. If we set up a trap that produces text 'T' (as a page footer,
+say), and we also use a diversion to store the formatted text 'D', then
+a document with input text in the order 'A B C D E F' might render as 'A
+B C E T F'. The diversion 'D' will never be output if we do not call
+for it.
+
+ Environments of themselves are not a source of non-linearity in
+document formatting: environment switches have immediate effect. One
+could always write a macro to change as many formatting parameters as
+desired with a single convenient call. But because diversions can be
+nested and macros called by traps that are sprung by other trap-called
+macros, they may be called upon in varying contexts. For example,
+consider a page header that is always to be set in Helvetica. A
+document that uses Times for most of its body text, but Courier for
+displayed code examples, poses a challenge if a page break occurs in the
+middle of a code display; if the header trap assumes that the "previous
+font" is always Times, the rest of the example will be formatted in the
+wrong typeface. One could carefully save all formatting parameters upon
+entering the trap and restore them upon leaving it, but this is verbose,
+error-prone, and not future-proof as the 'groff' language develops.
+Environments save us considerable effort.
+
+
+File: groff.info, Node: Traps, Next: Diversions, Prev: Deferring Output, Up: GNU troff Reference
+
+5.28 Traps
+==========
+
+"Traps" are locations in the output or conditions on the input that,
+when reached or fulfilled, call a specified macro. These traps can
+occur at a given location on the page, at a given location in the
+current diversion (together, these are known as vertical position
+traps), at a blank line, at a line with leading space characters, after
+a quantity of input lines, or at the end of input. Macros called by
+traps are passed no arguments. Setting a trap is also called "planting"
+one. It is said that a trap is "sprung" if its condition is fulfilled.
+
+* Menu:
+
+* Vertical Position Traps::
+* Diversion Traps::
+* Input Line Traps::
+* Blank Line Traps::
+* Leading Space Traps::
+* End-of-input Traps::
+
+
+File: groff.info, Node: Vertical Position Traps, Next: Page Location Traps, Prev: Traps, Up: Traps
+
+5.28.1 Vertical Position Traps
+------------------------------
+
+A "vertical position trap" calls a macro when the formatter's vertical
+drawing position reaches or passes, in the downward direction, a certain
+location on the output page or in a diversion. Its applications include
+setting page headers and footers, body text in multiple columns, and
+footnotes.
+
+ -- Request: .vpt [flag]
+ -- Register: \n[.vpt]
+ Enable vertical position traps if FLAG is non-zero or absent;
+ disable them otherwise. Vertical position traps are those set by
+ the 'wh' request or by 'dt' within a diversion. The parameter that
+ controls whether vertical position traps are enabled is global.
+ Initially, vertical position traps are enabled. The current value
+ is stored in the '.vpt' read-only register.
+
+ A page can't be ejected if 'vpt' is set to zero; see *note The
+ Implicit Page Trap::.
+
+* Menu:
+
+* Page Location Traps::
+* The Implicit Page Trap::
+* Diversion Traps::
+
+
+File: groff.info, Node: Page Location Traps, Next: The Implicit Page Trap, Prev: Vertical Position Traps, Up: Vertical Position Traps
+
+5.28.1.1 Page Location Traps
+............................
+
+A "page location trap" is a vertical position trap that applies to the
+page; that is, to undiverted output. Many can be present; manage them
+with the 'wh' and 'ch' requests.
+
+ -- Request: .wh dist [name]
+ Plant macro NAME as page location trap at DIST. The default
+ scaling unit is 'v'. Non-negative values for DIST set the trap
+ relative to the top of the page; negative values set the trap
+ relative to the bottom of the page. It is not possible to plant a
+ trap less than one basic unit from the page bottom: a DIST of '-0'
+ is interpreted as '0', the top of the page.(1) (*note Page
+ Location Traps-Footnote-1::) An existing _visible_ trap (see below)
+ at DIST is removed; this is 'wh''s sole function if NAME is
+ missing.
+
+ A trap is sprung only if it is "visible", meaning that its location
+ is reachable on the page(2) (*note Page Location
+ Traps-Footnote-2::) and it is not hidden by another trap at the
+ same location already planted there.
+
+ A macro package might set headers and footers as follows; this
+ example configures vertical margins of one inch to the body text,
+ and one half-inch to the titles. Observe the use of the no-break
+ control character with 'sp' request to position our text baselines,
+ and the page number character '%' used with the 'tl' request.
+
+ .\" hdfo.roff
+ .de hd \" page header
+ ' sp .5i
+ ' tl '\\*(Ti''\\*(Da' \" title and date strings
+ ' sp .5i
+ ..
+ .de fo \" page footer
+ ' sp .5i
+ . tl ''%''
+ . bp
+ ..
+ .wh 0 hd \" trap at top of the page
+ .wh -1i fo \" trap 1 inch from bottom
+
+ To use these traps, copy the above (or load it from a file with the
+ 'so' or 'mso' requests), then set up the strings it uses.
+
+ .so hdfo.roff
+ .ds Ti Final Report\"
+ .ds Da 21 May 2023\"
+ .ti
+ On 5 August of last year,
+ this committee tasked me with the investigation of the
+ CFIT (controlled flight into terrain) incident of
+ .\" ...and so on...
+
+ A trap above the top or at or below the bottom of the page can be
+ made visible by either moving it into the page area or increasing
+ the page length so that the trap is on the page. Negative trap
+ values always use the _current_ page length; they are not converted
+ to an absolute vertical position. We can use the 'ptr' request to
+ dump our page location traps to the standard error stream (*note
+ Debugging::). Their positions are reported in basic units; an
+ 'nroff' device example follows.
+
+ .pl 5i
+ .wh -1i xx
+ .ptr
+ error-> xx -240
+ .pl 100i
+ .ptr
+ error-> xx -240
+
+ It is possible to have more than one trap at the same location
+ (although only one at a time can be visible); to achieve this, the
+ traps must be defined at different locations, then moved to the
+ same place with the 'ch' request. In the following example, the
+ many empty lines caused by the 'bp' request are not shown in the
+ output.
+
+ .de a
+ . nop a
+ ..
+ .de b
+ . nop b
+ ..
+ .de c
+ . nop c
+ ..
+ .
+ .wh 1i a
+ .wh 2i b
+ .wh 3i c
+ .bp
+ => a b c
+ .ch b 1i
+ .ch c 1i
+ .bp
+ => a
+ .ch a 0.5i
+ .bp
+ => a b
+
+ -- Register: \n[.t]
+ The read-only register '.t' holds the distance to the next vertical
+ position trap. If there are no traps between the current position
+ and the bottom of the page, it contains the distance to the page
+ bottom. Within a diversion, in the absence of a diversion trap,
+ this distance is the largest representable integer in basic
+ units--effectively infinite.
+
+ -- Request: .ch name [dist]
+ Change the location of a trap by moving macro NAME to new location
+ DIST, or by unplanting it altogether if DIST is absent. The
+ default scaling unit is 'v'. Parameters to 'ch' are specified in
+ the opposite order from 'wh'. If NAME is the earliest planted
+ macro of multiple traps at the same location, (re)moving it from
+ that location exposes the macro next least recently planted at the
+ same place.(3) (*note Page Location Traps-Footnote-3::)
+
+ Changing a trap's location is useful for building up footnotes in a
+ diversion to allow more space at the bottom of the page for them.
+
+ The same macro can be installed simultaneously at multiple locations;
+however, only the earliest-planted instance--that has not yet been
+deleted with 'wh'--will be moved by 'ch'. The following example (using
+an 'nroff' device) illustrates this behavior. Blank lines have been
+elided from the output.
+
+ .de T
+ Trap sprung at \\n(nlu.
+ .br
+ ..
+ .wh 1i T
+ .wh 2i T
+ foo
+ .sp 11i
+ .bp
+ .ch T 4i
+ bar
+ .sp 11i
+ .bp
+ .ch T 5i
+ baz
+ .sp 11i
+ .bp
+ .wh 5i
+ .ch T 6i
+ qux
+ .sp 11i
+ => foo
+ => Trap sprung at 240u.
+ => Trap sprung at 480u.
+ => bar
+ => Trap sprung at 480u.
+ => Trap sprung at 960u.
+ => baz
+ => Trap sprung at 480u.
+ => Trap sprung at 1200u.
+ => qux
+ => Trap sprung at 1440u.
+
+ -- Register: \n[.ne]
+ The read-only register '.ne' contains the amount of space that was
+ needed in the last 'ne' request that caused a trap to be sprung; it
+ is useful in conjunction with the '.trunc' register. *Note Page
+ Control::. Since the '.ne' register is set only by traps, it
+ doesn't make sense to interpolate it outside of macros called by
+ traps.
+
+ -- Register: \n[.trunc]
+ A read-only register containing the amount of vertical space
+ truncated from an 'sp' request by the most recently sprung vertical
+ position trap, or, if the trap was sprung by an 'ne' request, minus
+ the amount of vertical motion produced by the 'ne' request. In
+ other words, at the point a trap is sprung, it represents the
+ difference of what the vertical position would have been but for
+ the trap, and what the vertical position actually is. Since the
+ '.trunc' register is set only by traps, it doesn't make sense to
+ interpolate it outside of macros called by traps.
+
+ -- Register: \n[.pe]
+ This Boolean-valued, read-only register interpolates 1 while a page
+ is being ejected, and 0 otherwise.
+
+ In the following example, we plant the same trap at the top and the
+ bottom of the page. We also make the trap report its name and the
+ vertical drawing position.
+
+ .de T
+ .tm \\$0: page \\n%, nl=\\n[nl] .pe=\\n[.pe]
+ ..
+ .ll 46n
+ .wh 0 T
+ .wh -1v T
+ Those who can make you believe absurdities can make you
+ commit atrocities. \[em] Voltaire
+ error-> T: page 1, nl=0 .pe=0
+ error-> T: page 1, nl=2600 .pe=1
+ => Those who can make you believe absurdities can
+ => make you commit atrocities. -- Voltaire
+
+ When designing macros, keep in mind that diversions and traps do
+normally interact. For example, if a trap calls a header macro (while
+outputting a diversion) that tries to change the font on the current
+page, the effect is not visible before the diversion has completely been
+printed (except for input protected with '\!' or '\?') since the data in
+the diversion is already formatted. In most cases, this is not the
+expected behaviour.
+
+
+File: groff.info, Node: Page Location Traps-Footnotes, Up: Page Location Traps
+
+ (1) *Note The Implicit Page Trap::.
+
+ (2) A trap planted at '20i' or '-30i' will not be sprung on a page of
+length '11i'.
+
+ (3) It may help to think of each trap location as maintaining a
+queue; 'wh' operates on the head of the queue, and 'ch' operates on its
+tail. Only the trap at the head of the queue is visible.
+
+
+File: groff.info, Node: The Implicit Page Trap, Next: Diversion Traps, Prev: Page Location Traps, Up: Vertical Position Traps
+
+5.28.1.2 The Implicit Page Trap
+...............................
+
+If, after starting GNU 'troff' without loading a macro package, you use
+the 'ptr' request to dump a list of the active traps to the standard
+error stream,(1) (*note The Implicit Page Trap-Footnote-1::) nothing is
+reported. Yet the '.t' register will report a steadily decreasing value
+with every output line your document produces, and once the value of
+'.t' gets to within '.V' of zero, you will notice that something
+trap-like happens--the page is ejected, a new one begins, and the value
+of '.t' becomes large once more.
+
+ This "implicit page trap" always exists in the top-level
+diversion;(2) (*note The Implicit Page Trap-Footnote-2::) it works like
+a trap in some ways but not others. Its purpose is to eject the current
+page and start the next one. It has no name, so it cannot be moved or
+deleted with 'wh' or 'ch' requests. You cannot hide it by placing
+another trap at its location, and can move it only by redefining the
+page length with 'pl'. Its operation is suppressed when vertical page
+traps are disabled with GNU 'troff''s 'vpt' request.
+
+
+File: groff.info, Node: The Implicit Page Trap-Footnotes, Up: The Implicit Page Trap
+
+ (1) *Note Debugging::.
+
+ (2) *Note Diversions::.
+
+
+File: groff.info, Node: Diversion Traps, Next: Input Line Traps, Prev: The Implicit Page Trap, Up: Vertical Position Traps
+
+5.28.1.3 Diversion Traps
+........................
+
+A diversion is not formatted in the context of a page, so it lacks page
+location traps; instead it can have a "diversion trap". There can exist
+at most one such vertical position trap per diversion.
+
+ -- Request: .dt [dist name]
+ Set a trap _within_ a diversion at location DIST, which is
+ interpreted relative to diversion rather than page boundaries. If
+ invoked with fewer than two arguments, any diversion trap in the
+ current diversion is removed. The register '.t' works within
+ diversions. It is an error to invoke 'dt' in the top-level
+ diversion. *Note Diversions::.
+
+
+File: groff.info, Node: Input Line Traps, Next: Blank Line Traps, Prev: Diversion Traps, Up: Traps
+
+5.28.2 Input Line Traps
+-----------------------
+
+ -- Request: .it [n name]
+ -- Request: .itc [n name]
+ Set an input line trap, calling macro NAME after processing the
+ next N productive input lines (recall *note Manipulating Filling
+ and Adjustment::). Any existing input line trap in the environment
+ is replaced. Without arguments, 'it' and 'itc' clear any input
+ line trap that has not yet sprung.
+
+ Consider a macro '.ST S N' which sets the next N input lines in the
+ font style S.
+
+ .de ST \" Use style $1 for next $2 text lines.
+ . it \\$2 ES
+ . ft \\$1
+ ..
+ .de ES \" end ST
+ . ft R
+ ..
+ .ST I 1
+ oblique
+ face
+ .ST I 1
+ oblique\c
+ face
+ => oblique face obliqueface (second "face" upright)
+
+ Unlike the 'ce' and 'rj' requests, 'it' counts lines interrupted
+ with the '\c' escape sequence separately (*note Line
+ Continuation::); 'itc' does not. To see the difference, let's
+ change the previous example to use 'itc' instead.
+
+ ...
+ . itc \\$2 ES
+ ...
+ => oblique face obliqueface (second "face" oblique)
+
+ You can think of the 'ce' and 'rj' requests as implicitly creating
+ an input line trap with 'itc' that schedules a break when the trap
+ is sprung.
+
+ .de BR
+ . br
+ . internal: disable centering-without-filling
+ ..
+ .
+ .de ce
+ . if \\n[.br] .br
+ . itc \\$1 BR
+ . internal: enable centering-without-filling
+ ..
+
+ Let us consider in more detail the sorts of input lines that are or
+ are not "productive".
+
+ .de Trap
+ TRAP SPRUNG
+ ..
+ .de Mac
+ .if r a \l'5n'
+ ..
+ .it 2 Trap
+ .
+ foo
+ .Mac
+ bar
+ baz
+ .it 1 Trap
+ .sp \" moves, but does not write or draw
+ qux
+ .itc 1 Trap
+ \h'5n'\c \" moves, but does not write or draw
+ jat
+
+ When 'Trap' gets called depends on whether the 'a' register is
+ defined; the control line with the 'if' request may or may not
+ produce written output. We also see that the spacing request 'sp',
+ while certainly affecting the output, does not spring the input
+ line trap. Similarly, the horizontal motion escape sequence '\h'
+ also affected the output, but was not "written". Observe that we
+ had to follow it with '\c' and use 'itc' to prevent the newline at
+ the end of the text line from causing a word break, which, like an
+ ordinary space character, counts as written output.
+
+ $ groff -Tascii input-trap-example.groff
+ => foo bar TRAP SPRUNG baz
+ =>
+ => qux TRAP SPRUNG jat TRAP SPRUNG
+ $ groff -Tascii -ra1 input-trap-example.groff
+ => foo _____ TRAP SPRUNG bar baz
+ =>
+ => qux TRAP SPRUNG jat TRAP SPRUNG
+
+ Input line traps are associated with the environment (*note
+Environments::); switching to another environment suspends the current
+input line trap, and going back resumes it, restoring the count of
+qualifying lines enumerated in that environment.
+
+
+File: groff.info, Node: Blank Line Traps, Next: Leading Space Traps, Prev: Input Line Traps, Up: Traps
+
+5.28.3 Blank Line Traps
+-----------------------
+
+ -- Request: .blm [name]
+ Set a blank line trap, calling the macro NAME when GNU 'troff'
+ encounters a blank line in an input file, instead of the usual
+ behavior (*note Breaking::). A line consisting only of spaces is
+ also treated as blank and subject to this trap. If no argument is
+ supplied, the default blank line behavior is (re-)established.
+
+
+File: groff.info, Node: Leading Space Traps, Next: End-of-input Traps, Prev: Blank Line Traps, Up: Traps
+
+5.28.4 Leading Space Traps
+--------------------------
+
+ -- Request: .lsm [name]
+ -- Register: \n[lsn]
+ -- Register: \n[lss]
+ Set a leading space trap, calling the macro NAME when GNU 'troff'
+ encounters leading spaces in an input line; the implicit line break
+ that normally happens in this case is suppressed. If no argument
+ is supplied, the default leading space behavior is (re-)established
+ (*note Breaking::).
+
+ The count of leading spaces on an input line is stored in register
+ 'lsn', and the amount of corresponding horizontal motion in
+ register 'lss', irrespective of whether a leading space trap is
+ set. When it is, the leading spaces are removed from the input
+ line, and no motion is produced before calling NAME.
+
+
+File: groff.info, Node: End-of-input Traps, Prev: Leading Space Traps, Up: Traps
+
+5.28.5 End-of-input Traps
+-------------------------
+
+ -- Request: .em [name]
+ Set a trap at the end of input, calling macro NAME after the last
+ line of the last input file has been processed. If no argument is
+ given, any existing end-of-input trap is removed.
+
+ For example, if the document had to have a section at the bottom of
+ the last page for someone to approve it, the 'em' request could be
+ used.
+
+ .de approval
+ \c
+ . ne 3v
+ . sp (\\n[.t]u - 3v)
+ . in +4i
+ . lc _
+ . br
+ Approved:\t\a
+ . sp
+ Date:\t\t\a
+ ..
+ .
+ .em approval
+
+ The '\c' in the above example needs explanation. For historical
+ reasons (compatibility with AT&T 'troff'), the end-of-input macro
+ exits as soon as it causes a page break if no partially collected
+ line remains.(1) (*note End-of-input Traps-Footnote-1::)
+
+ Let us assume that there is no '\c' in the above 'approval' macro,
+ that the page is full, and last output line has been broken with,
+ say, a 'br' request. Because there is no more room, a 'ne' request
+ at this point causes a page ejection, which in turn makes 'troff'
+ exit immediately as just described. In most situations, this is
+ not desired; people generally want to format the input after 'ne'.
+
+ To force processing of the whole end-of-input macro independently
+ of this behavior, it is thus advisable to (invisibly) ensure the
+ existence of a partially collected line ('\c') whenever there is a
+ chance that a page break can happen. In the above example,
+ invoking the 'ne' request ensures that there is room for the
+ subsequent formatted output on the same page, so we need insert
+ '\c' only once.
+
+ The next example shows how to append three lines, then start a new
+ page unconditionally. Since '.ne 1' doesn't give the desired
+ effect--there is always one line available or we are already at the
+ beginning of the next page--we temporarily increase the page length
+ by one line so that we can use '.ne 2'.
+
+ .de EM
+ .pl +1v
+ \c
+ .ne 2
+ line one
+ .br
+ \c
+ .ne 2
+ line two
+ .br
+ \c
+ .ne 2
+ line three
+ .br
+ .pl -1v
+ \c
+ 'bp
+ ..
+ .em EM
+
+ This specific feature affects only the first potential page break
+ caused by the end-of-input macro; further page breaks emitted by
+ the macro are handled normally.
+
+ Another possible use of the 'em' request is to make GNU 'troff'
+ emit a single large page instead of multiple pages. For example,
+ one may want to produce a long plain text file for reading in a
+ terminal or emulator without page footers and headers interrupting
+ the body of the document. One approach is to set the page length
+ at the beginning of the document to a very large value to hold all
+ the text,(2) (*note End-of-input Traps-Footnote-2::) and
+ automatically adjust it to the exact height of the document after
+ the text has been output.
+
+ .de adjust-page-length
+ . br
+ . pl \\n[nl]u \" \n[nl]: current vertical position
+ ..
+ .
+ .de single-page-mode
+ . pl 99999
+ . em adjust-page-length
+ ..
+ .
+ .\" Activate the above code if configured.
+ .if \n[do-continuous-rendering] \
+ . single-page-mode
+
+ Since only one end-of-input trap exists and another macro package
+ may already use it, care must be taken not to break the mechanism.
+ A simple solution would be to append the above macro to the macro
+ package's end-of-input macro using the 'am' request.
+
+
+File: groff.info, Node: End-of-input Traps-Footnotes, Up: End-of-input Traps
+
+ (1) While processing an end-of-input macro, the formatter assumes
+that the next page break must be the last; it goes into "sudden death
+overtime".
+
+ (2) Another, taken by the 'groff' 'man' macros, is to intercept 'ne'
+requests and wrap 'bp' ones.
+
+
+File: groff.info, Node: Diversions, Next: Punning Names, Prev: Traps, Up: GNU troff Reference
+
+5.29 Diversions
+===============
+
+In 'roff' systems it is possible to format text as if for output, but
+instead of writing it immediately, one can "divert" the formatted text
+into a named storage area. It is retrieved later by specifying its name
+after a control character. The same name space is used for such
+diversions as for strings and macros; see *note Identifiers::. Such
+text is sometimes said to be "stored in a macro", but this coinage
+obscures the important distinction between macros and strings on one
+hand and diversions on the other; the former store _unformatted_ input
+text, and the latter capture _formatted_ output. Diversions also do not
+interpret arguments. Applications of diversions include "keeps"
+(preventing a page break from occurring at an inconvenient place by
+forcing a set of output lines to be set as a group), footnotes, tables
+of contents, and indices. For orthogonality it is said that GNU 'troff'
+is in the "top-level diversion" if no diversion is active (that is,
+formatted output is being "diverted" immediately to the output device).
+
+ Dereferencing an undefined diversion will create an empty one of that
+name and cause a warning in category 'mac' to be emitted. *Note
+Warnings::, for information about the enablement and suppression of
+warnings. A diversion does not exist for the purpose of testing with
+the 'd' conditional operator until its initial definition ends (*note
+Operators in Conditionals::). The following requests are used to create
+and alter diversions.
+
+ -- Request: .di [name]
+ -- Request: .da [name]
+ Start collecting formatted output in a diversion called NAME. The
+ 'da' request appends to a diversion called NAME, creating it if
+ necessary. If NAME already exists as an alias, the target of the
+ alias is replaced or appended to; recall *note Strings::. The
+ pending output line is diverted as well. Switching to another
+ environment (with the 'ev' request) before invoking 'di' or 'da'
+ avoids including any pending output line in the diversion; see
+ *note Environments::.
+
+ Invoking 'di' or 'da' without an argument stops diverting output to
+ the diversion named by the most recent corresponding request. If
+ 'di' or 'da' is called without an argument when there is no current
+ diversion, a warning in category 'di' is produced. *Note
+ Warnings::, for information about the enablement and suppression of
+ warnings.
+
+ Before the diversion.
+ .di yyy
+ In the diversion.
+ .br
+ .di
+ After the diversion.
+ .br
+ => After the diversion.
+ .yyy
+ => Before the diversion. In the diversion.
+
+ GNU 'troff' supports "box" requests to exclude a partially collected
+line from a diversion, as this is often desirable.
+
+ -- Request: .box [name]
+ -- Request: .boxa [name]
+ Divert (or append) output to NAME, similarly to the 'di' and 'da'
+ requests, respectively. Any pending output line is _not_ included
+ in the diversion. Without an argument, stop diverting output; any
+ pending output line inside the diversion is discarded.
+
+ Before the box.
+ .box xxx
+ In the box.
+ .br
+ Hidden treasure.
+ .box
+ After the box.
+ .br
+ => Before the box. After the box.
+ .xxx
+ => In the box.
+
+ Apart from pending output line inclusion and the request names that
+populate them, boxes are handled exactly as diversions are. All of the
+following 'groff' language elements can be used with them
+interchangeably.
+
+ -- Register: \n[.z]
+ -- Register: \n[.d]
+ Diversions may be nested. The read-only string-valued register
+ '.z' contains the name of the current diversion. The read-only
+ register '.d' contains the current vertical place in the diversion.
+ If the input text is not being diverted, '.d' reports the same
+ location as the register 'nl'.
+
+ -- Register: \n[.h]
+ The read-only register '.h' stores the "high-water mark" on the
+ current page or in the current diversion. It corresponds to the
+ text baseline of the lowest line on the page.(1) (*note
+ Diversions-Footnote-1::)
+
+ .tm .h==\n[.h], nl==\n[nl]
+ => .h==0, nl==-1
+ This is a test.
+ .br
+ .sp 2
+ .tm .h==\n[.h], nl==\n[nl]
+ => .h==40, nl==120
+
+ As implied by the example, vertical motion does not produce text
+ baselines and thus does not increase the value interpolated by
+ '\n[.h]'.
+
+ -- Register: \n[dn]
+ -- Register: \n[dl]
+ After completing a diversion, the writable registers 'dn' and 'dl'
+ contain its vertical and horizontal sizes. Only the lines just
+ processed are counted: for the computation of 'dn' and 'dl', the
+ requests 'da' and 'boxa' are handled as if 'di' and 'box' had been
+ used, respectively--lines that have been already stored in the
+ diversion (box) are not taken into account.
+
+ .\" Center text both horizontally and vertically.
+ .\" Macro .(c starts centering mode; .)c terminates it.
+ .
+ .\" Disable the escape character with .eo so that we
+ .\" don't have to double backslashes on the "\n"s.
+ .eo
+ .de (c
+ . br
+ . ev (c
+ . evc 0
+ . in 0
+ . nf
+ . di @c
+ ..
+ .de )c
+ . br
+ . ev
+ . di
+ . nr @s (((\n[.t]u - \n[dn]u) / 2u) - 1v)
+ . sp \n[@s]u
+ . ce 1000
+ . @c
+ . ce 0
+ . sp \n[@s]u
+ . br
+ . fi
+ . rr @s
+ . rm @c
+ ..
+ .ec
+
+ -- Escape sequence: \!anything
+ -- Escape sequence: \?anything\?
+ "Transparently" embed ANYTHING into the current diversion,
+ preventing requests, macro calls, and escape sequences from being
+ interpreted when read into a diversion. This is useful for
+ preventing them from taking effect until the diverted text is
+ actually output. The '\!' escape sequence transparently embeds
+ input up to and including the end of the line. The '\?' escape
+ sequence transparently embeds input until its own next occurrence.
+
+ ANYTHING may not contain newlines; use '\!' by itself to embed
+ newlines in a diversion. The escape sequence '\?' is also
+ recognized in copy mode and turned into a single internal code; it
+ is this code that terminates ANYTHING. Thus the following example
+ prints 4.
+
+ .nr x 1
+ .nf
+ .di d
+ \?\\?\\\\?\\\\\\\\nx\\\\?\\?\?
+ .di
+ .nr x 2
+ .di e
+ .d
+ .di
+ .nr x 3
+ .di f
+ .e
+ .di
+ .nr x 4
+ .f
+
+ Both escape sequences read the data in copy mode.
+
+ If '\!' is used in the top-level diversion, its argument is
+ directly embedded into GNU 'troff''s intermediate output. This can
+ be used, for example, to control a postprocessor that processes the
+ data before it is sent to an output driver.
+
+ The '\?' escape used in the top-level diversion produces no output
+ at all; its argument is simply ignored.
+
+ -- Request: .output contents
+ Emit CONTENTS directly to GNU 'troff''s intermediate output
+ (subject to copy mode interpretation); this is similar to '\!' used
+ at the top level. An initial neutral double quote in CONTENTS is
+ stripped to allow embedding of leading spaces.
+
+ This request can't be used before the first page has started--if
+ you get an error, simply insert '.br' before the 'output' request.
+
+ Use with caution! It is normally only needed for mark-up used by a
+ postprocessor that does something with the output before sending it
+ to the output device, filtering out CONTENTS again.
+
+ -- Request: .asciify div
+ "Unformat" the diversion DIV in a way such that Unicode basic Latin
+ (ASCII) characters, characters translated with the 'trin' request,
+ space characters, and some escape sequences, that were formatted
+ and diverted into DIV are treated like ordinary input characters
+ when DIV is reread. Doing so can be useful in conjunction with the
+ 'writem' request. 'asciify' can be also used for gross hacks; for
+ example, the following sets register 'n' to 1.
+
+ .tr @.
+ .di x
+ @nr n 1
+ .br
+ .di
+ .tr @@
+ .asciify x
+ .x
+
+ 'asciify' cannot return all items in a diversion to their source
+ equivalent: nodes such as those produced by the '\N' escape
+ sequence will remain nodes, so the result cannot be guaranteed to
+ be a pure string. *Note Copy Mode::. Glyph parameters such as the
+ type face and size are not preserved; use 'unformat' to achieve
+ that.
+
+ -- Request: .unformat div
+ Like 'asciify', unformat the diversion DIV. However, 'unformat'
+ handles only tabs and spaces between words, the latter usually
+ arising from spaces or newlines in the input. Tabs are treated as
+ input tokens, and spaces become adjustable again. The vertical
+ sizes of lines are not preserved, but glyph information (font, type
+ size, space width, and so on) is retained.
+
+
+File: groff.info, Node: Diversions-Footnotes, Up: Diversions
+
+ (1) Thus, the "water" gets "higher" proceeding _down_ the page.
+
+
+File: groff.info, Node: Punning Names, Next: Environments, Prev: Diversions, Up: GNU troff Reference
+
+5.30 Punning Names
+==================
+
+Macros, strings, and diversions share a name space; recall *note
+Identifiers::. Internally, the same mechanism is used to store them.
+You can thus call a macro with string interpolation syntax and vice
+versa.
+
+ .de subject
+ Typesetting
+ ..
+ .de predicate
+ rewards attention to detail
+ ..
+ \*[subject] \*[predicate].
+ Truly.
+ => Typesetting
+ => rewards attention to detail Truly.
+
+What went wrong? Strings don't contain newlines, but macros do. String
+interpolation placed a newline at the end of '\*[subject]', and the next
+thing on the input was a space. Then when '\*[predicate]' was
+interpolated, it was followed by the empty request '.' on a line by
+itself. If we want to use macros as strings, we must take interpolation
+behavior into account.
+
+ .de subject
+ Typesetting\\
+ ..
+ .de predicate
+ rewards attention to detail\\
+ ..
+ \*[subject] \*[predicate].
+ Truly.
+ => Typesetting rewards attention to detail. Truly.
+
+By ending each text line of the macros with an escaped '\<RET>', we get
+the desired effect (*note Line Continuation::).(1) (*note Punning
+Names-Footnote-1::) What would have happened if we had used only one
+backslash at a time instead?
+
+ Interpolating a string does not hide existing macro arguments. We
+can also place the escaped newline outside the string interpolation
+instead of within the string definition. Thus, in a macro, a more
+efficient way of doing
+
+ .xx \\$@
+
+is
+
+ \\*[xx]\\
+
+The latter calling syntax doesn't change the value of '\$0', which is
+then inherited from the calling macro (*note Parameters::).
+
+ Diversions can be also called with string syntax. It is sometimes
+convenient to copy one-line diversions to a string.
+
+ .di xx
+ the
+ .ft I
+ interpolation system
+ .ft
+ .br
+ .di
+ .ds yy This is a test of \*(xx\c
+ \*(yy.
+ => This is a test of the interpolation system.
+
+As the previous example shows, it is possible to store formatted output
+in strings. The '\c' escape sequence prevents the subsequent newline
+from being interpreted as a break (again, *note Line Continuation::).
+
+ Copying multi-output line diversions produces unexpected results.
+
+ .di xxx
+ a funny
+ .br
+ test
+ .br
+ .di
+ .ds yyy This is \*[xxx]\c
+ \*[yyy].
+ => test This is a funny.
+
+ Usually, it is not predictable whether a diversion contains one or
+more output lines, so this mechanism should be avoided. With AT&T
+'troff', this was the only solution to strip off a final newline from a
+diversion. Another disadvantage is that the spaces in the copied string
+are already formatted, preventing their adjustment. This can cause ugly
+results.
+
+ A clean solution to this problem is available in GNU 'troff', using
+the requests 'chop' to remove the final newline of a diversion, and
+'unformat' to make the horizontal spaces adjustable again.
+
+ .box xxx
+ a funny
+ .br
+ test
+ .br
+ .box
+ .chop xxx
+ .unformat xxx
+ This is \*[xxx].
+ => This is a funny test.
+
+ *Note Gtroff Internals::.
+
+
+File: groff.info, Node: Punning Names-Footnotes, Up: Punning Names
+
+ (1) The backslash is doubled. *Note Copy Mode::.
+
+
+File: groff.info, Node: Environments, Next: Suppressing Output, Prev: Diversions, Up: GNU troff Reference
+
+5.31 Environments
+=================
+
+As discussed in *note Deferring Output::, environments store most of the
+parameters that determine the appearance of text. A default environment
+named '0' exists when GNU 'troff' starts up; it is modified by
+formatting-related requests and escape sequences.
+
+ You can create new environments and switch among them. Only one is
+current at any given time. Active environments are managed using a
+"stack", a data structure supporting "push" and "pop" operations. The
+current environment is at the top of the stack. The same environment
+name can be pushed onto the stack multiple times, possibly interleaved
+with others. Popping the environment stack does not destroy the current
+environment; it remains accessible by name and can be made current again
+by pushing it at any time. Environments cannot be renamed or deleted,
+and can only be modified when current. To inspect the environment
+stack, use the 'pev' request; see *note Debugging::.
+
+ Environments store the following information.
+
+ * a partially collected line, if any
+
+ * data about the most recently output glyph and line (registers
+ '.cdp', '.cht', '.csk', '.n', '.w')
+
+ * typeface parameters (size, family, style, height and slant,
+ inter-word and inter-sentence space sizes)
+
+ * page parameters (line length, title length, vertical spacing, line
+ spacing, indentation, line numbering, centering, right-alignment,
+ underlining, hyphenation parameters)
+
+ * filling enablement; adjustment enablement and mode
+
+ * tab stops; tab, leader, escape, control, no-break control,
+ hyphenation, and margin characters
+
+ * input line traps
+
+ * stroke and fill colors
+
+ -- Request: .ev [ident]
+ -- Register: \n[.ev]
+ Enter the environment IDENT, which is created if it does not
+ already exist, using the same parameters as for the default
+ environment used at startup. With no argument, GNU 'troff'
+ switches to the previous environment.
+
+ Invoking 'ev' with an argument puts environment IDENT onto the top
+ of the environment stack. (If it isn't already present in the
+ stack, this is a proper push.) Without an argument, 'ev' pops the
+ environment stack, making the previous environment current. It is
+ an error to pop the environment stack with no previous environment
+ available. The read-only string-valued register '.ev' contains the
+ name of the current environment--the one at the top of the stack.
+
+ .ev footnote-env
+ .fam N
+ .ps 6
+ .vs 8
+ .ll -.5i
+ .ev
+
+ ...
+
+ .ev footnote-env
+ \[dg] Observe the smaller text and vertical spacing.
+ .ev
+
+ We can familiarize ourselves with stack behavior by wrapping the
+ 'ev' request with a macro that reports the contents of the '.ev'
+ register to the standard error stream.
+
+ .de EV
+ . ev \\$1
+ . tm environment is now \\n[.ev]
+ ..
+ .
+ .EV foo
+ .EV bar
+ .EV
+ .EV baz
+ .EV
+ .EV
+ .EV
+
+ error-> environment is now foo
+ error-> environment is now bar
+ error-> environment is now foo
+ error-> environment is now baz
+ error-> environment is now foo
+ error-> environment is now 0
+ error-> error: environment stack underflow
+ error-> environment is now 0
+
+ -- Request: .evc environment
+ Copy the contents of ENVIRONMENT to the current environment.
+
+ The following environment data are not copied.
+
+ * a partially collected line, if present;
+
+ * the interruption status of the previous input line (due to use
+ of the '\c' escape sequence);
+
+ * the count of remaining lines to center, to right-justify, or
+ to underline (with or without underlined spaces)--these are
+ set to zero;
+
+ * the activation status of temporary indentation;
+
+ * input line traps and their associated data;
+
+ * the activation status of line numbering (which can be
+ reactivated with '.nm +0'); and
+
+ * the count of consecutive hyphenated lines (set to zero).
+
+ -- Register: \n[.w]
+ -- Register: \n[.cht]
+ -- Register: \n[.cdp]
+ -- Register: \n[.csk]
+ The '\n[.w]' register contains the width of the last glyph
+ formatted in the environment.
+
+ The '\n[.cht]' register contains the height of the last glyph
+ formatted in the environment.
+
+ The '\n[.cdp]' register contains the depth of the last glyph
+ formatted in the environment. It is positive for glyphs extending
+ below the baseline.
+
+ The '\n[.csk]' register contains the "skew" (how far to the right
+ of the glyph's center that GNU 'troff' should place an accent) of
+ the last glyph formatted in the environment.
+
+ -- Register: \n[.n]
+ The '\n[.n]' register contains the length of the previous output
+ line emitted in the environment.
+
+
+File: groff.info, Node: Suppressing Output, Next: Colors, Prev: Environments, Up: GNU troff Reference
+
+5.32 Suppressing Output
+=======================
+
+ -- Escape sequence: \O[num]
+ Suppress GNU 'troff' output of glyphs and geometric objects. The
+ sequences '\O2', '\O3', '\O4', and '\O5' are intended for internal
+ use by 'grohtml'.
+
+ '\O0'
+ Disable the emission of glyphs and geometric objects to the
+ output driver, provided that this sequence occurs at the
+ outermost suppression level (see '\O3' and '\04' below).
+ Horizontal motions corresponding to non-overstruck glyph
+ widths still occur.
+
+ '\O1'
+ Enable the emission of glyphs and geometric objects to the
+ output driver, provided that this sequence occurs at the
+ outermost suppression level.
+
+ '\O0' and '\O1' also reset the four registers 'opminx', 'opminy',
+ 'opmaxx', and 'opmaxy' to -1. These four registers mark the top
+ left and bottom right hand corners of a box encompassing all
+ written or drawn output.
+
+ '\O2'
+ At the outermost suppression level, enable emission of glyphs
+ and geometric objects, and write to the standard error stream
+ the page number and values of the four aforementioned
+ registers encompassing glyphs written since the last
+ interpolation of a '\O' sequence, as well as the page offset,
+ line length, image file name (if any), horizontal and vertical
+ device motion quanta, and input file name. Numeric values are
+ in basic units.
+
+ '\O3'
+ Begin a nested suppression level. 'grohtml' uses this
+ mechanism to create images of output preprocessed with 'gpic',
+ 'geqn', and 'gtbl'. At startup, GNU 'troff' is at the
+ outermost suppression level. 'pre-grohtml' generates these
+ sequences when processing the document, using GNU 'troff' with
+ the 'ps' output device, Ghostscript, and the PNM tools to
+ produce images in PNG format. They start a new page if the
+ device is not 'html' or 'xhtml', to reduce the number of
+ images crossing a page boundary.
+
+ '\O4'
+ End a nested suppression level.
+
+ '\O[5PFILE]'
+ At the outermost suppression level, write the name 'file' to
+ the standard error stream at position P, which must be one of
+ 'l', 'r', 'c', or 'i', corresponding to left, right, centered,
+ and inline alignments within the document, respectively. FILE
+ is a name associated with the production of the next image.
+
+ -- Register: \n[.O]
+ Output suppression nesting level applied by '\O3' and '\O4' escape
+ sequences.
+
+
+File: groff.info, Node: I/O, Next: Postprocessor Access, Prev: Suppressing Output, Up: GNU troff Reference
+
+5.33 I/O
+========
+
+'gtroff' has several requests for including files:
+
+ -- Request: .so file
+ -- Request: .soquiet file
+ Replace the 'so' request's control line with the contents of the
+ file named by the argument, "sourcing" it. FILE is sought in the
+ directories specified by '-I' command-line option. If FILE does
+ not exist, a warning in category 'file' is produced and the request
+ has no further effect. *Note Warnings::, for information about the
+ enablement and suppression of warnings.
+
+ 'so' can be useful for large documents; e.g., allowing each chapter
+ of a book to be kept in a separate file. However, files
+ interpolated with 'so' are not preprocessed; to overcome this
+ limitation, see the 'gsoelim(1)' man page.
+
+ Since GNU 'troff' replaces the entire control line with the
+ contents of a file, it matters whether 'file' is terminated with a
+ newline or not. Assume that file 'xxx' contains only the word
+ 'foo' without a trailing newline.
+
+ $ printf 'foo' > xxx
+
+ The situation is
+ .so xxx
+ bar.
+ => The situation is foobar.
+
+ 'soquiet' works the same way, except that no warning diagnostic is
+ issued if FILE does not exist.
+
+ -- Request: .pso command
+ Read the standard output from the specified COMMAND and include it
+ in place of the 'pso' request.
+
+ It is an error to use this request in safer mode, which is the
+ default. Invoke GNU 'troff' or a front end with the '-U' option to
+ enable unsafe mode.
+
+ The comment regarding a final newline for the 'so' request is valid
+ for 'pso' also.
+
+ -- Request: .mso file
+ -- Request: .msoquiet file
+ Identical to the 'so' and 'soquiet' requests, respectively, except
+ that 'gtroff' searches for the specified FILE in the same
+ directories as macro files for the '-m' command-line option. If
+ the file name to be included has the form 'NAME.tmac' and it isn't
+ found, these requests try to include 'tmac.NAME' and vice versa.
+
+ -- Request: .trf file
+ -- Request: .cf file
+ Transparently output the contents of FILE. Each line is output as
+ if it were preceded by '\!'; however, the lines are _not_ subject
+ to copy mode interpretation. If the file does not end with a
+ newline, 'trf' adds one. Both requests cause a break.
+
+ When used in a diversion, these requests embed a node (*note Gtroff
+ Internals::) in it that, when reread, causes the contents of FILE
+ to be transparently copied to the output. In AT&T 'troff', the
+ contents of FILE are immediately copied to the output regardless of
+ whether there is a current diversion; this behaviour is so
+ anomalous that it must be considered a bug.
+
+ While 'cf' copies the contents of FILE completely unprocessed,
+ 'trf' disallows characters such as NUL that are not valid 'gtroff'
+ input characters (*note Identifiers::).
+
+ For 'cf', within a diversion, "completely unprocessed" means that
+ each line of a file to be inserted is handled as if it were
+ preceded by '\!\\!'.
+
+ To define a macro 'x' containing the contents of file 'f', use
+
+ .ev 1
+ .di x
+ .trf f
+ .di
+ .ev
+
+ The calls to 'ev' prevent the partially collected output line from
+ becoming part of the diversion (*note Diversions::).
+
+ -- Request: .nx [file]
+ Force 'gtroff' to continue processing of the file specified as an
+ argument. If no argument is given, immediately jump to the end of
+ file.
+
+ -- Request: .rd [prompt [arg1 arg2 ...]]
+ Read from standard input, and include what is read as though it
+ were part of the input file. Text is read until a blank line is
+ encountered.
+
+ If standard input is a TTY input device (keyboard), write PROMPT to
+ standard error, followed by a colon (or send BEL for a beep if no
+ argument is given).
+
+ Arguments after PROMPT are available for the input. For example,
+ the line
+
+ .rd data foo bar
+
+ with the input 'This is \$2.' prints
+
+ This is bar.
+
+ Using the 'nx' and 'rd' requests, it is easy to set up form letters.
+The form letter template is constructed like this, putting the following
+lines into a file called 'repeat.let':
+
+ .ce
+ \*(td
+ .sp 2
+ .nf
+ .rd
+ .sp
+ .rd
+ .fi
+ Body of letter.
+ .bp
+ .nx repeat.let
+
+When this is run, a file containing the following lines should be
+redirected in. Requests included in this file are executed as though
+they were part of the form letter. The last block of input is the 'ex'
+request, which tells GNU 'troff' to stop processing. If this were not
+there, 'troff' would not know when to stop.
+
+ Trent A. Fisher
+ 708 NW 19th Av., #202
+ Portland, OR 97209
+
+ Dear Trent,
+
+ Len Adollar
+ 4315 Sierra Vista
+ San Diego, CA 92103
+
+ Dear Mr. Adollar,
+
+ .ex
+
+ -- Request: .pi pipe
+ Pipe the output of 'gtroff' to the shell command(s) specified by
+ PIPE. This request must occur before 'gtroff' has a chance to
+ print anything.
+
+ It is an error to use this request in safer mode, which is the
+ default. Invoke GNU 'troff' or a front end with the '-U' option to
+ enable unsafe mode.
+
+ Multiple calls to 'pi' are allowed, acting as a chain. For
+ example,
+
+ .pi foo
+ .pi bar
+ ...
+
+ is the same as '.pi foo | bar'.
+
+ The intermediate output format of GNU 'troff' is piped to the
+ specified commands. Consequently, calling 'groff' without the '-Z'
+ option normally causes a fatal error.
+
+ -- Request: .sy cmds
+ -- Register: \n[systat]
+ Execute the shell command(s) specified by CMDS. The output is not
+ saved anywhere, so it is up to the user to do so.
+
+ It is an error to use this request in safer mode; this is the
+ default. Give GNU 'troff' or a front end program the '-U' option
+ to enable unsafe mode.
+
+ The following code fragment introduces the current time into a
+ document.
+
+ .sy perl -e 'printf ".nr H %d\\n.nr M %d\\n.nr S %d\\n",\
+ (localtime(time))[2,1,0]' > /tmp/x\n[$$]
+ .so /tmp/x\n[$$]
+ .sy rm /tmp/x\n[$$]
+ \nH:\nM:\nS
+
+ This works by having the Perl script (run by 'sy') write 'nr'
+ requests that set the registers 'H', 'M', and 'S' to a temporary
+ file. The 'roff' document then reads the temporary file using the
+ 'so' request.
+
+ The registers 'seconds', 'minutes', and 'hours', initialized at
+ startup of GNU 'troff', should satisfy most requirements. Use the
+ 'af' request to format their values for output.
+
+ .af hours 00
+ .af minutes 00
+ .af seconds 00
+ \n[hours]:\n[minutes]:\n[seconds]
+ => 02:17:54
+
+ The writable register 'systat' contains the return value of the
+ 'system()' function executed by the last 'sy' request.
+
+ -- Request: .open stream file
+ -- Request: .opena stream file
+ Open the specified FILE for writing and associates the specified
+ STREAM with it.
+
+ The 'opena' request is like 'open', but if the file exists, append
+ to it instead of truncating it.
+
+ It is an error to use these requests in safer mode; this is the
+ default. Give GNU 'troff' or a front end program the '-U' option
+ to enable unsafe mode.
+
+ -- Request: .write stream data
+ -- Request: .writec stream data
+ Write to the file associated with the specified STREAM. The stream
+ must previously have been the subject of an open request. The
+ remainder of the line is interpreted as the 'ds' request reads its
+ second argument: an initial neutral double quote in CONTENTS is
+ stripped to allow embedding of leading spaces, and it is read in
+ copy mode.
+
+ The 'writec' request is like 'write', but only 'write' appends a
+ newline to the data.
+
+ -- Request: .writem stream xx
+ Write the contents of the macro or string XX to the file associated
+ with the specified STREAM.
+
+ XX is read in copy mode, i.e., already formatted elements are
+ ignored. Consequently, diversions must be unformatted with the
+ 'asciify' request before calling 'writem'. Usually, this means a
+ loss of information.
+
+ -- Request: .close stream
+ Close the specified STREAM; the stream is no longer an acceptable
+ argument to the 'write' request.
+
+ Here a simple macro to write an index entry.
+
+ .open idx test.idx
+ .
+ .de IX
+ . write idx \\n[%] \\$*
+ ..
+ .
+ .IX test entry
+ .
+ .close idx
+
+ -- Escape sequence: \Ve
+ -- Escape sequence: \V(ev
+ -- Escape sequence: \V[env]
+ Interpolate the contents of the specified environment variable ENV
+ (one-character name E, two-character name EV) as returned by the
+ function 'getenv(3)'. '\V' is interpreted even in copy mode (*note
+ Copy Mode::).
+
+
+File: groff.info, Node: Postprocessor Access, Next: Miscellaneous, Prev: I/O, Up: GNU troff Reference
+
+5.34 Postprocessor Access
+=========================
+
+Two escape sequences and two requests enable documents to pass
+information directly to a postprocessor. These are useful for
+exercising device-specific capabilities that the 'groff' language does
+not abstract or generalize; examples include the embedding of hyperlinks
+and image files. Device-specific functions are documented in each
+output driver's man page, such as 'gropdf(1)', 'grops(1)', or
+'grotty(1)'.
+
+ -- Request: .device xxx ...
+ -- Escape sequence: \X'xxx ...'
+ Embed all XXX arguments into GNU 'troff' output as parameters to a
+ device control command 'x X'. The meaning and interpretation of
+ such parameters is determined by the output driver or other
+ postprocessor.
+
+ The 'device' request processes its arguments in copy mode (*note
+ Copy Mode::). An initial neutral double quote in CONTENTS is
+ stripped to allow embedding of leading spaces. By contrast, within
+ '\X' arguments, the escape sequences '\&', '\)', '\%', and '\:' are
+ ignored; '\<SP>' and '\~' are converted to single space characters;
+ and '\\' has its escape character stripped. So that the basic
+ Latin subset of the Unicode character set(1) (*note Postprocessor
+ Access-Footnote-1::) can be reliably encoded in device control
+ commands, seven special character escape sequences ('\-', '\[aq]',
+ '\[dq]', '\[ga]', '\[ha]', '\[rs]', and '\[ti]',) are mapped to
+ basic Latin characters; see the 'groff_char(7)' man page. For this
+ transformation, character translations and special character
+ definitions are ignored.(2) (*note Postprocessor
+ Access-Footnote-2::) The use of any other escape sequence in '\X'
+ parameters is normally an error.
+
+ If the 'use_charnames_in_special' directive appears in the output
+ device's 'DESC' file, the use of special character escape sequences
+ is _not_ an error; they are simply output verbatim (with the
+ exception of the seven mapped to Unicode basic Latin characters,
+ discussed above). 'use_charnames_in_special' is currently employed
+ only by 'grohtml'.
+
+ -- Request: .devicem name
+ -- Escape sequence: \Yn
+ -- Escape sequence: \Y(nm
+ -- Escape sequence: \Y[name]
+ This is approximately equivalent to '\X'\*[NAME]'' (one-character
+ name N, two-character name NM). However, the contents of the
+ string or macro NAME are not interpreted; also it is permitted for
+ NAME to have been defined as a macro and thus contain newlines (it
+ is not permitted for the argument to '\X' to contain newlines).
+ The inclusion of newlines requires an extension to the AT&T 'troff'
+ output format, and confuses drivers that do not know about this
+ extension (*note Device Control Commands::).
+
+ -- Request: .tag name
+ -- Request: .taga name
+ Reserved for internal use.
+
+
+File: groff.info, Node: Postprocessor Access-Footnotes, Up: Postprocessor Access
+
+ (1) that is, ISO 646:1991-IRV or, popularly, "US-ASCII"
+
+ (2) They are bypassed because these parameters are not rendered as
+glyphs in the output; instead, they remain abstract characters--in a PDF
+bookmark or a URL, for example.
+
+
+File: groff.info, Node: Miscellaneous, Next: Gtroff Internals, Prev: Postprocessor Access, Up: GNU troff Reference
+
+5.35 Miscellaneous
+==================
+
+We document here GNU 'troff' features that fit poorly elsewhere.
+
+ -- Request: .nm [start [increment [space [indentation]]]]
+ -- Register: \n[ln]
+ -- Register: \n[.nm]
+ Begin (or, with no arguments, cease) numbering output lines. START
+ assigns the number of the _next_ output line. Only line numbers
+ divisible by INCREMENT are marked (default: '1'). SPACE configures
+ the horizontal spacing between the number and the text (default:
+ '1'). Any given INDENTATION is applied to the numbers (default:
+ '0'). The third and fourth arguments are reckoned in numeral
+ widths ('\0'). START must be non-negative and INCREMENT positive.
+
+ The formatter aligns the number to the right in a width of three
+ numeral spaces plus INDENTATION, then catenates SPACE and the
+ output line. The line length is _not_ reduced. Depending on the
+ value of the page offset,(1) (*note Miscellaneous-Footnote-1::)
+ numbers wider than the allocated space protrude into the left
+ margin, or shift the output line to the right.
+
+ Line numbering parameters corresponding to missing arguments are
+ not altered. After numbering is disabled, '.nm +0' resumes it
+ using the previously active parameters.
+
+ The parameters of 'nm' are associated with the environment (*note
+ Environments::).
+
+ While numbering is enabled, the output line number register 'ln' is
+ updated as each line is output, even if no line number is formatted
+ with it because it is being skipped (it is not a multiple of
+ INCREMENT) or because numbering is suppressed (see the 'nn' request
+ below).
+
+ The '.nm' register tracks the enablement status of numbering.
+ Temporary suspension of numbering with the 'nn' request does _not_
+ alter its value.
+
+ .po 5n
+ .ll 44n
+ Programming,
+ when stripped of all its circumstantial irrelevancies,
+ .nm 999 1 1 -4
+ boils down to no more and no less than
+ .nm +0 3
+ very effective thinking so as to avoid unmastered
+ .nn 2
+ complexity,
+ to very vigorous separation of your many
+ different concerns.
+ .br
+ \(em Edsger Dijkstra
+ .sp
+ .nm 1 1 1
+ This guy's arrogance takes your breath away.
+ .br
+ \(em John Backus
+ => Programming, when stripped of all its cir-
+ => 999 cumstantial irrelevancies, boils down to no
+ => more and no less than very effective think-
+ => ing so as to avoid unmastered complexity, to
+ => very vigorous separation of your many dif-
+ => ferent concerns.
+ => 1002 -- Edsger Dijkstra
+ =>
+ => 1 This guy's arrogance takes your breath away.
+ => 2 -- John Backus
+
+ -- Request: .nn [skip]
+ -- Register: \n[.nn]
+ Suppress numbering of the next SKIP output lines that would
+ otherwise be numbered. The default is 1. 'nn' can be invoked when
+ line numbering is not active; suppression of numbering will take
+ effect for SKIP lines once 'nm' enables it.
+
+ The '.nn' register stores the count of output lines still to have
+ their numbering suppressed.
+
+ This count is associated with the environment (*note
+ Environments::).
+
+ To test whether the current output line will be numbered, you must
+check both the '.nm' and '.nn' registers.
+
+ .de is-numbered
+ . nop This line
+ . ie (\\n[.nm] & (1-\\n[.nn])) IS
+ . el ISN'T
+ . nop numbered.
+ . br
+ ..
+ Test line numbering.
+ .is-numbered
+ .nm 1
+ .nn 1
+ .is-numbered
+ .is-numbered
+ .nm
+ .is-numbered
+ => Test line numbering. This line ISN'T numbered.
+ => This line ISN'T numbered.
+ => 1 This line IS numbered.
+ => This line ISN'T numbered.
+
+ -- Request: .mc [margin-character [distance]
+ Begin (or, with no arguments, cease) writing a "margin-character"
+ to the right of each output line. The DISTANCE argument separates
+ MARGIN-CHARACTER from the right margin. If absent, the most recent
+ value is used; the default is 10 points. If an output line exceeds
+ the line length, the margin character is appended to it. No margin
+ character is written on lines produced by the 'tl' request.
+
+ The margin character is a property of the output line; the margin
+ character last configured when the line is output controls. If the
+ margin character is disabled before an output line breaks, none is
+ output (but see below).
+
+ The margin character is associated with the environment (*note
+ Environments::).
+
+ .ll 5i
+ .nf
+ .mc \[br]
+ This paragraph is marked with a margin character.
+ .sp
+ As seen above, vertical space isn't thus marked.
+ \&
+ An output line that is present, but empty, is.
+ => This paragraph is marked with a margin character. |
+ =>
+ => As seen above, vertical space isn't thus marked. |
+ => |
+ => An output line that is present, but empty, is. |
+
+ For compatibility with AT&T 'troff', a call to 'mc' to set the margin
+character can't be undone immediately; at least one line gets a margin
+character.
+
+ .ll 10n
+ .nf
+ .mc |
+ .mc *
+ .mc
+ foo
+ bar
+ => foo *
+ => bar
+
+ The margin character mechanism is commonly used to annotate changes
+in documents. The 'groff' distribution ships a program, 'gdiffmk', to
+assist with this task.(2) (*note Miscellaneous-Footnote-2::)
+
+ -- Request: .psbb file
+ -- Register: \n[llx]
+ -- Register: \n[lly]
+ -- Register: \n[urx]
+ -- Register: \n[ury]
+ Retrieve the bounding box of the PostScript image found in FILE,
+ which must conform to Adobe's "Document Structuring Conventions"
+ (DSC), locate a '%%BoundingBox' comment, and store the (upper-,
+ lower-, -left, -right) values into the registers 'llx', 'lly',
+ 'urx', and 'ury'. If an error occurs (for example, if no
+ '%%BoundingBox' comment is present), the formatter sets these
+ registers to 0.
+
+ The search path for FILE can be controlled with the '-I'
+ command-line option.
+
+
+File: groff.info, Node: Miscellaneous-Footnotes, Up: Miscellaneous
+
+ (1) Recall *note Line Layout::.
+
+ (2) Historically, tools named 'nrchbar' and 'changebar' were
+developed for marking changes with margin characters and could be found
+in archives of the 'comp.sources.unix' USENET group. Some proprietary
+Unices also offer(ed) a 'diffmk' program.
+
+
+File: groff.info, Node: Gtroff Internals, Next: Debugging, Prev: Miscellaneous, Up: GNU troff Reference
+
+5.36 'gtroff' Internals
+=======================
+
+'gtroff' processes input in three steps. One or more input characters
+are converted to an "input token".(1) (*note Gtroff
+Internals-Footnote-1::) Then, one or more input tokens are converted to
+an "output node". Finally, output nodes are converted to the
+intermediate output language understood by all output devices.
+
+ Actually, before step one happens, 'gtroff' converts certain escape
+sequences into reserved input characters (not accessible by the user);
+such reserved characters are used for other internal processing also -
+this is the very reason why not all characters are valid input. *Note
+Identifiers::, for more on this topic.
+
+ For example, the input string 'fi\[:u]' is converted into a character
+token 'f', a character token 'i', and a special token ':u' (representing
+u umlaut). Later on, the character tokens 'f' and 'i' are merged to a
+single output node representing the ligature glyph 'fi' (provided the
+current font has a glyph for this ligature); the same happens with ':u'.
+All output glyph nodes are 'processed', which means that they are
+invariably associated with a given font, font size, advance width, etc.
+During the formatting process, 'gtroff' itself adds various nodes to
+control the data flow.
+
+ Macros, diversions, and strings collect elements in two chained
+lists: a list of input tokens that have been passed unprocessed, and a
+list of output nodes. Consider the following diversion.
+
+ .di xxx
+ a
+ \!b
+ c
+ .br
+ .di
+
+It contains these elements.
+
+node list token list element number
+
+line start node -- 1
+glyph node 'a' -- 2
+word space node -- 3
+-- 'b' 4
+-- '\n' 5
+glyph node 'c' -- 6
+vertical size node -- 7
+vertical size node -- 8
+-- '\n' 9
+
+Elements 1, 7, and 8 are inserted by 'gtroff'; the latter two (which are
+always present) specify the vertical extent of the last line, possibly
+modified by '\x'. The 'br' request finishes the pending output line,
+inserting a newline input token, which is subsequently converted to a
+space when the diversion is reread. Note that the word space node has a
+fixed width that isn't adjustable anymore. To convert horizontal space
+nodes back to input tokens, use the 'unformat' request.
+
+ Macros only contain elements in the token list (and the node list is
+empty); diversions and strings can contain elements in both lists.
+
+ The 'chop' request simply reduces the number of elements in a macro,
+string, or diversion by one. Exceptions are "compatibility save" and
+"compatibility ignore" input tokens, which are ignored. The 'substring'
+request also ignores those input tokens.
+
+ Some requests like 'tr' or 'cflags' work on glyph identifiers only;
+this means that the associated glyph can be changed without destroying
+this association. This can be very helpful for substituting glyphs. In
+the following example, we assume that glyph 'foo' isn't available by
+default, so we provide a substitution using the 'fchar' request and map
+it to input character 'x'.
+
+ .fchar \[foo] foo
+ .tr x \[foo]
+
+Now let us assume that we install an additional special font 'bar' that
+has glyph 'foo'.
+
+ .special bar
+ .rchar \[foo]
+
+Since glyphs defined with 'fchar' are searched before glyphs in special
+fonts, we must call 'rchar' to remove the definition of the fallback
+glyph. Anyway, the translation is still active; 'x' now maps to the
+real glyph 'foo'.
+
+ Macro and request arguments preserve compatibility mode enablement.
+
+ .cp 1 \" switch to compatibility mode
+ .de xx
+ \\$1
+ ..
+ .cp 0 \" switch compatibility mode off
+ .xx caf\['e]
+ => café
+
+Since compatibility mode is enabled while 'de' is invoked, the macro
+'xx' enables compatibility mode when it is called. Argument '$1' can
+still be handled properly because it inherits the compatibility mode
+enablement status that was active at the point where 'xx' was called.
+
+ After interpolation of the parameters, the compatibility save and
+restore tokens are removed.
+
+
+File: groff.info, Node: Gtroff Internals-Footnotes, Up: Gtroff Internals
+
+ (1) Except the escape sequences '\f', '\F', '\H', '\m', '\M', '\R',
+'\s', and '\S', which are processed immediately if not in copy mode.
+
+
+File: groff.info, Node: Debugging, Next: Implementation Differences, Prev: Gtroff Internals, Up: GNU troff Reference
+
+5.37 Debugging
+==============
+
+ Standard troff voodoo, just put a power of two backslashes in
+ front of it until it works and if you still have problems add a \c.
+ -- Ron Natalie
+
+ GNU 'troff' is not the easiest language to debug, in part thanks to
+its design features of recursive interpolation and the use of
+multi-stage pipeline processing in the surrounding system. Nevertheless
+there exist several features useful for troubleshooting.
+
+ Preprocessors use the 'lf' request to preserve the identity of the
+line numbers and names of input files. GNU 'troff' emits a variety of
+error diagnostics and supports several categories of warning; the output
+of these can be selectively suppressed. A trace of the formatter's
+input processing stack can be emitted when errors or warnings occur by
+means of GNU 'troff''s '-b' option, or produced on demand with the
+'backtrace' request. The 'tm' and related requests can be used to emit
+customized diagnostic messages or for instrumentation while
+troubleshooting. The 'ex' and 'ab' requests cause early termination
+with successful and error exit codes respectively, to halt further
+processing when continuing would be fruitless. Examine the state of the
+formatter with requests that write lists of defined names (macros,
+strings, and diversions), environments, registers, and page location
+traps to the standard error stream.
+
+ -- Request: .lf line [file]
+ Set the input line number (and, optionally, the file name) GNU
+ 'troff' shall use for error and warning messages. LINE is the
+ input line number of the _next_ line. Without an argument, the
+ request is ignored.
+
+ 'lf''s primary purpose is to aid the debugging of documents that
+ undergo preprocessing. Programs like 'tbl' that transform input in
+ their own languages into 'roff' requests use it so that any
+ diagnostic messages emitted by 'troff' correspond to the source
+ document.
+
+ -- Request: .tm message
+ -- Request: .tm1 message
+ -- Request: .tmc message
+ Send MESSAGE, which consumes the remainder of the input line and
+ cannot contain special characters, to the standard error stream,
+ followed by a newline. Leading spaces in MESSAGE are ignored.
+
+ 'tm1' is similar, but recognizes and strips a leading neutral
+ double quote from MESSAGE to allow the embedding of leading spaces.
+
+ 'tmc' works as 'tm1', but does not append a newline.
+
+ -- Request: .ab [message]
+ Write any MESSAGE to the standard error stream (like 'tm') and then
+ abort GNU 'troff'; that is, stop processing and terminate with a
+ failure status.
+
+ -- Request: .ex
+ Exit GNU 'troff'; that is, stop processing and terminate with a
+ successful status. To stop processing only the current file, use
+ the 'nx' request; see *note I/O::.
+
+ When doing something involved, it is useful to leave the debugging
+statements in the code and have them turned on by a command-line flag.
+
+ .if \n[DB] .tm debugging output
+
+To activate such statements, use the '-r' option to set the register.
+
+ groff -rDB=1 file
+
+ If it is known in advance that there are many errors and no useful
+output, GNU 'troff' can be forced to suppress formatted output with the
+'-z' option.
+
+ -- Request: .pev
+ Report the state of the current environment followed by that of all
+ other environments to the standard error stream.
+
+ -- Request: .pm
+ Report, to the standard error stream, the names of all defined
+ macros, strings, and diversions with their sizes in bytes.
+
+ -- Request: .pnr
+ Report the names and contents of all currently defined registers to
+ the standard error stream.
+
+ -- Request: .ptr
+ Report the names and positions of all page location traps to the
+ standard error stream. Empty slots in the list, where a trap has
+ been planted but subsequently (re)moved, are printed as well.
+
+ -- Request: .fl
+ Instruct 'gtroff' to flush its output immediately. The intent is
+ for interactive use, but this behaviour is currently not
+ implemented in 'gtroff'. Contrary to Unix 'troff', TTY output is
+ sent to a device driver also ('grotty'), making it non-trivial to
+ communicate interactively.
+
+ This request causes a line break.
+
+ -- Request: .backtrace
+ Write the state of the input stack to the standard error stream.
+
+ Consider the following in a file 'test'.
+
+ .de xxx
+ . backtrace
+ ..
+ .de yyy
+ . xxx
+ ..
+ .
+ .yyy
+ error-> troff: backtrace: 'test':2: macro 'xxx'
+ error-> troff: backtrace: 'test':5: macro 'yyy'
+ error-> troff: backtrace: file 'test':8
+
+ The '-b' option of GNU 'troff' causes a backtrace to be generated
+ on each error or warning. Some warnings have to be enabled; *Note
+ Warnings::.
+
+ -- Register: \n[slimit]
+ If greater than 0, sets the maximum quantity of objects on GNU
+ 'troff''s internal input stack. If less than or equal to 0, there
+ is no limit: recursion can continue until program memory is
+ exhausted. The default is 1,000.
+
+ -- Request: .warnscale su
+ Set the scaling unit used in certain warnings to SU, which can take
+ the values 'u', 'i', 'c', 'p', and 'P'. The default is 'i'.
+
+ -- Request: .spreadwarn [limit]
+ Emit a 'break' warning if the additional space inserted for each
+ space between words in an output line adjusted to both margins with
+ '.ad b' is larger than or equal to LIMIT. A negative value is
+ treated as zero; an absent argument toggles the warning on and off
+ without changing LIMIT. The default scaling unit is 'm'. At
+ startup, 'spreadwarn' is inactive and LIMIT is 3m.
+
+ For example,
+
+ .spreadwarn 0.2m
+
+ causes a warning if 'break' warnings are not suppressed and
+ 'gtroff' must add 0.2m or more for each inter-word space in a line.
+ *Note Warnings::.
+
+ GNU 'troff' has command-line options for reporting warnings ('-w')
+and backtraces ('-b') when a warning or an error occurs.
+
+ -- Request: .warn [n]
+ -- Register: \n[.warn]
+ Select the categories, or "types", of reported warnings. N is the
+ sum of the numeric codes associated with each warning category that
+ is to be enabled; all other categories are disabled. The
+ categories and their associated codes are listed in *note
+ Warnings::. For example, '.warn 0' disables all warnings, and
+ '.warn 1' disables all warnings except those about missing glyphs.
+ If no argument is given, all warning categories are enabled.
+
+ The read-only register '.warn' contains the sum of the numeric
+ codes of enabled warning categories.
+
+* Menu:
+
+* Warnings::
+
+
+File: groff.info, Node: Warnings, Prev: Debugging, Up: Debugging
+
+5.37.1 Warnings
+---------------
+
+Warning diagnostics emitted by GNU 'troff' are divided into named,
+numbered categories. The name associated with each warning category is
+used by the '-w' and '-W' options. Each category is also assigned a
+power of two; the sum of enabled category values is used by the 'warn'
+request and the '.warn' register.
+
+ Warnings of each category are produced under the following
+circumstances.
+
+'char'
+'1'
+ No mounted font defines a glyph for the requested character. This
+ category is enabled by default.
+
+'number'
+'2'
+ An invalid numeric expression was encountered. This category is
+ enabled by default. *Note Numeric Expressions::.
+
+'break'
+'4'
+ A filled output line could not be broken such that its length was
+ less than the output line length '\n[.l]'. This category is
+ enabled by default.
+
+'delim'
+'8'
+ The closing delimiter in an escape sequence was missing or
+ mismatched.
+
+'el'
+'16'
+ The 'el' request was encountered with no prior corresponding 'ie'
+ request. *Note if-else::.
+
+'scale'
+'32'
+ A scaling unit inappropriate to its context was used in a numeric
+ expression.
+
+'range'
+'64'
+ A numeric expression was out of range for its context.
+
+'syntax'
+'128'
+ A self-contradictory hyphenation mode was requested; an empty or
+ incomplete numeric expression was encountered; an operand to a
+ numeric operator was missing; an attempt was made to define a
+ recursive, empty, or nonsensical character class; or a 'groff'
+ extension conditional expression operator was used while in
+ compatibility mode.
+
+'di'
+'256'
+ A 'di', 'da', 'box', or 'boxa' request was invoked without an
+ argument when there was no current diversion.
+
+'mac'
+'512'
+ An undefined string, macro, or diversion was used. When such an
+ object is dereferenced, an empty one of that name is automatically
+ created. So, unless it is later deleted, at most one warning is
+ given for each.
+
+ This warning is also emitted upon an attempt to move an unplanted
+ trap macro (*note Page Location Traps::). In such cases, the
+ unplanted macro is _not_ dereferenced, so it is not created if it
+ does not exist.
+
+'reg'
+'1024'
+ An undefined register was used. When an undefined register is
+ dereferenced, it is automatically defined with a value of 0. So,
+ unless it is later deleted, at most one warning is given for each.
+
+'tab'
+'2048'
+ A tab character was encountered where a number was expected, or
+ appeared in an unquoted macro argument.
+
+'right-brace'
+'4096'
+ A right brace escape sequence '\}' was encountered where a number
+ was expected.
+
+'missing'
+'8192'
+ A request was invoked with a mandatory argument absent.
+
+'input'
+'16384'
+ An invalid character occurred on the input stream.
+
+'escape'
+'32768'
+ An unsupported escape sequence was encountered.
+
+'space'
+'65536'
+ A space was missing between a request or macro and its argument.
+ This warning is produced when an undefined name longer than two
+ characters is encountered and the first two characters of the name
+ constitute a defined name. No request is invoked, no macro called,
+ and an empty macro is not defined. This category is enabled by
+ default. It never occurs in compatibility mode.
+
+'font'
+'131072'
+ A non-existent font was selected, or the selection was ignored
+ because a font selection escape sequence was used after the output
+ line continuation escape sequence on an input line. This category
+ is enabled by default.
+
+'ig'
+'262144'
+ An invalid escape sequence occurred in input ignored using the 'ig'
+ request. This warning category diagnoses a condition that is an
+ error when it occurs in non-ignored input.
+
+'color'
+'524288'
+ An undefined color was selected, an attempt was made to define a
+ color using an unrecognized color space, an invalid component in a
+ color definition was encountered, or an attempt was made to
+ redefine a default color.
+
+'file'
+'1048576'
+ An attempt was made to load a file that does not exist. This
+ category is enabled by default.
+
+ Two warning names group other warning categories for convenience.
+
+'all'
+ All warning categories except 'di', 'mac' and 'reg'. This
+ shorthand is intended to produce all warnings that are useful with
+ macro packages written for AT&T 'troff' and its descendants, which
+ have less fastidious diagnostics than GNU 'troff'.
+
+'w'
+ All warning categories. Authors of documents and macro packages
+ targeting 'groff' are encouraged to use this setting.
+
+
+File: groff.info, Node: Implementation Differences, Next: Safer Mode, Prev: Debugging, Up: GNU troff Reference
+
+5.38 Implementation Differences
+===============================
+
+GNU 'troff' has a number of features that cause incompatibilities with
+documents written for other versions of 'troff'. Some GNU extensions to
+'troff' have become supported by other implementations.
+
+* Menu:
+
+* Safer Mode::
+* Compatibility Mode::
+* Other Differences::
+
+
+File: groff.info, Node: Safer Mode, Next: Compatibility Mode, Prev: Implementation Differences, Up: Implementation Differences
+
+5.38.1 Safer Mode
+-----------------
+
+The formatter operates in "safer" mode by default; to mitigate risks
+from untrusted input documents, the 'pi' and 'sy' requests are disabled.
+GNU 'troff''s '-U' option enables "unsafe mode", restoring their
+function and enabling additional 'groff' extension requests, 'open',
+'opena', and 'pso'. *Note I/O::.
+
+
+File: groff.info, Node: Compatibility Mode, Next: Safer Mode, Prev: Other Differences, Up: Implementation Differences
+
+5.38.2 Compatibility Mode
+-------------------------
+
+Long identifier names may be GNU 'troff''s most obvious innovation.
+AT&T 'troff' interprets '.dsabcd' as defining a string 'ab' with
+contents 'cd'. Normally, GNU 'troff' interprets this as a call of a
+macro named 'dsabcd'. AT&T 'troff' also interprets '\*[' and '\n[' as
+an interpolation of a string or register, respectively, named '['. In
+GNU 'troff', however, the '[' is normally interpreted as delimiting a
+long name. In compatibility mode, GNU 'troff' interprets names in the
+traditional way; they thus can be two characters long at most.
+
+ -- Request: .cp [n]
+ -- Register: \n[.C]
+ If N is missing or non-zero, turn on compatibility mode; otherwise,
+ turn it off.
+
+ The read-only register '.C' is 1 if compatibility mode is on,
+ 0 otherwise.
+
+ Compatibility mode can be also turned on with the '-C' command-line
+ option.
+
+ -- Request: .do name
+ -- Register: \n[.cp]
+ The 'do' request interprets the string, request, diversion, or
+ macro NAME (along with any further arguments) with compatibility
+ mode disabled. Compatibility mode is restored (only if it was
+ active) when the _expansion_ of NAME is interpreted; that is, the
+ restored compatibility state applies to the contents of the macro,
+ string, or diversion NAME as well as data read from files or pipes
+ if NAME is any of the 'so', 'soquiet', 'mso', 'msoquiet', or 'pso'
+ requests.
+
+ The following example illustrates several aspects of 'do' behavior.
+
+ .de mac1
+ FOO
+ ..
+ .de1 mac2
+ groff
+ .mac1
+ ..
+ .de mac3
+ compatibility
+ .mac1
+ ..
+ .de ma
+ \\$1
+ ..
+ .cp 1
+ .do mac1
+ .do mac2 \" mac2, defined with .de1, calls "mac1"
+ .do mac3 \" mac3 calls "ma" with argument "c1"
+ .do mac3 \[ti] \" groff syntax accepted in .do arguments
+ => FOO groff FOO compatibility c1 ~
+
+ The read-only register '.cp', meaningful only when dereferenced
+ from a 'do' request, is 1 if compatibility mode was on when the
+ 'do' request was encountered, and 0 if it was not. This register
+ is specialized and may require a statement of rationale.
+
+ When writing macro packages or documents that use GNU 'troff'
+ features and which may be mixed with other packages or documents
+ that do not--common scenarios include serial processing of man
+ pages or use of the 'so' or 'mso' requests--you may desire correct
+ operation regardless of compatibility mode enablement in the
+ surrounding context. It may occur to you to save the existing
+ value of '\n(.C' into a register, say, '_C', at the beginning of
+ your file, turn compatibility mode off with '.cp 0', then restore
+ it from that register at the end with '.cp \n(_C'. At the same
+ time, a modular design of a document or macro package may lead you
+ to multiple layers of inclusion. You cannot use the same register
+ name everywhere lest you "clobber" the value from a preceding or
+ enclosing context. The two-character register name space of AT&T
+ 'troff' is confining and mnemonically challenging; you may wish to
+ use the more capacious name space of GNU 'troff'. However,
+ attempting '.nr _my_saved_C \n(.C' will not work in compatibility
+ mode; the register name is too long. "This is exactly what 'do' is
+ for," you think, '.do nr _my_saved_C \n(.C'. The foregoing will
+ always save zero to your register, because 'do' turns compatibility
+ mode _off_ while it interprets its argument list.
+
+ To robustly save compatibility mode before switching it off, use
+
+ .do nr _my_saved_C \n[.cp]
+ .cp 0
+
+ at the beginning of your file, followed by
+
+ .cp \n[_my_saved_C]
+ .do rr _my_saved_C
+
+ at the end. As in the C language, we all have to share one big
+ name space, so choose a register name that is unlikely to collide
+ with other uses.
+
+ Normally, GNU 'troff' preserves the interpolation depth in delimited
+arguments, but not in compatibility mode.
+
+ .ds xx '
+ \w'abc\*(xxdef'
+ => 168 (normal mode on a terminal device)
+ => 72def' (compatibility mode on a terminal device)
+
+ Furthermore, the escape sequences '\f', '\H', '\m', '\M', '\R', '\s',
+and '\S' are transparent for the purpose of recognizing a control
+character at the beginning of a line only in compatibility mode. For
+example, this code produces bold output in both cases, but the text
+differs.
+
+ .de xx
+ Hello!
+ ..
+ \fB.xx\fP
+ => .xx (normal mode)
+ => Hello! (compatibility mode)
+
+ Normally, the syntax form '\s'N accepts only a single character (a
+digit) for N, consistently with other forms that originated in AT&T
+'troff', like '\*', '\$', '\f', '\g', '\k', '\n', and '\z'. In
+compatibility mode only, a non-zero N must be in the range 4-39. Legacy
+documents relying upon this quirk of parsing(1) (*note Compatibility
+Mode-Footnote-1::) should be migrated to another '\s' form.
+
+
+File: groff.info, Node: Compatibility Mode-Footnotes, Up: Compatibility Mode
+
+ (1) The Graphic Systems C/A/T phototypesetter (the original device
+target for AT&T 'troff') supported only a few discrete type sizes in the
+range 6-36 points, so Ossanna contrived a special case in the parser to
+do what the user must have meant. Kernighan warned of this in the 1992
+revision of CSTR #54 (§2.3), and more recently, McIlroy referred to it
+as a "living fossil".
+
+
+File: groff.info, Node: Other Differences, Prev: Compatibility Mode, Up: Implementation Differences
+
+5.38.3 Other Differences
+------------------------
+
+'groff' request names unrecognized by other 'troff' implementations will
+likely be ignored by them; escape sequences that are 'groff' extensions
+are liable to be interpreted as if the escape character were not
+present. For example, the adjustable, non-breaking escape sequence '\~'
+is also supported by Heirloom Doctools 'troff' 050915 (September 2005),
+'mandoc' 1.9.5 (2009-09-21), 'neatroff' (commit 1c6ab0f6e, 2016-09-13),
+and Plan 9 from User Space 'troff' (commit 93f8143600, 2022-08-12), but
+not by Solaris or Documenter's Workbench 'troff's. *Note Manipulating
+Filling and Adjustment::.
+
+ GNU 'troff' does not allow the use of the escape sequences '\|',
+'\^', '\&', '\{', '\}', '\<SP>', '\'', '\`', '\-', '\_', '\!', '\%', and
+'\c' in identifiers; AT&T 'troff' does. The '\A' escape sequence (*note
+Identifiers::) may be helpful in avoiding use of these escape sequences
+in names.
+
+ When adjusting to both margins, AT&T 'troff' at first adjusts spaces
+starting from the right; GNU 'troff' begins from the left. Both
+implementations adjust spaces from opposite ends on alternating output
+lines in this adjustment mode to prevent "rivers" in the text.
+
+ GNU 'troff' does not always hyphenate words as AT&T 'troff' does.
+The AT&T implementation uses a set of hard-coded rules specific to
+English, while GNU 'troff' uses language-specific hyphenation pattern
+files derived from TeX. Furthermore, in old versions of 'troff' there
+was a limited amount of space to store hyphenation exceptions (arguments
+to the 'hw' request); GNU 'troff' has no such restriction.
+
+ GNU 'troff' predefines a string '.T' containing the argument given to
+the '-T' command-line option, namely the current output device (for
+example, 'pdf' or 'utf8'). The existence of this string is a common
+feature of post-CSTR #54 'troff's(1) (*note Other
+Differences-Footnote-1::) but valid values are specific to each
+implementation.
+
+ AT&T 'troff' ignored attempts to remove read-only registers; GNU
+'troff' honors such requests. *Note Built-in Registers::.
+
+ The (read-only) register '.T' interpolates 1 if GNU 'troff' is called
+with the '-T' command-line option, and 0 otherwise. This behavior
+differs from AT&T 'troff', which interpolated 1 only if 'nroff' was the
+formatter and was called with '-T'.
+
+ AT&T 'troff' and other implementations handle the 'lf' request
+differently. For them, its LINE argument changes the line number of the
+_current_ line.
+
+ AT&T 'troff' had only environments named '0', '1', and '2'. In GNU
+'troff', any number of environments may exist, using any valid
+identifiers for their names (*note Identifiers::.)
+
+ Fractional type sizes cause one noteworthy incompatibility. In AT&T
+'troff' the 'ps' request ignores scaling units and thus '.ps 10u' sets
+the type size to 10 points, whereas in GNU 'troff' it sets the type size
+to 10 _scaled_ points. *Note Using Fractional Type Sizes::.
+
+ The 'ab' request differs from AT&T 'troff': GNU 'troff' writes no
+message to the standard error stream if no arguments are given, and it
+exits with a failure status instead of a successful one.
+
+ The 'bp' request differs from AT&T 'troff': GNU 'troff' does not
+accept a scaling unit on the argument, a page number; the former
+(somewhat uselessly) does.
+
+ The 'pm' request differs from AT&T 'troff': GNU 'troff' reports the
+sizes of macros, strings, and diversions in bytes and ignores an
+argument to report only the sum of the sizes.
+
+ Unlike AT&T 'troff', GNU 'troff' does not ignore the 'ss' request if
+the output is a terminal device; instead, the values of minimal
+inter-word and additional inter-sentence space are each rounded down to
+the nearest multiple of 12.
+
+ In GNU 'troff' there is a fundamental difference between
+(unformatted) characters and (formatted) glyphs. Everything that
+affects how a glyph is output is stored with the glyph node; once a
+glyph node has been constructed, it is unaffected by any subsequent
+requests that are executed, including 'bd', 'cs', 'tkf', 'tr', or 'fp'
+requests. Normally, glyphs are constructed from characters immediately
+before the glyph is added to an output line. Macros, diversions, and
+strings are all, in fact, the same type of object; they contain a
+sequence of intermixed character and glyph nodes. Special characters
+transform from one to the other: before being added to the output, they
+behave as characters; afterward, they are glyphs. A glyph node does not
+behave like a character node when it is processed by a macro: it does
+not inherit any of the special properties that the character from which
+it was constructed might have had. For example, the input
+
+ .di x
+ \\\\
+ .br
+ .di
+ .x
+
+produces '\\' in GNU 'troff'. Each pair of backslashes becomes one
+backslash _glyph_; the resulting backslashes are thus not interpreted as
+escape _characters_ when they are reread as the diversion is output.
+AT&T 'troff' _would_ interpret them as escape characters when rereading
+them and end up printing one '\'.
+
+ One correct way to obtain a printable backslash in most documents is
+to use the '\e' escape sequence; this always prints a single instance of
+the current escape character,(2) (*note Other Differences-Footnote-2::)
+regardless of whether or not it is used in a diversion; it also works in
+both GNU 'troff' and AT&T 'troff'.
+
+ The other correct way, appropriate in contexts independent of the
+backslash's common use as a 'troff' escape character--perhaps in
+discussion of character sets or other programming languages--is the
+character escape '\(rs' or '\[rs]', for "reverse solidus", from its name
+in the ECMA-6 (ISO/IEC 646) standard.(3) (*note Other
+Differences-Footnote-3::)
+
+ To store an escape sequence in a diversion that is interpreted when
+the diversion is reread, either use the traditional '\!' transparent
+output facility, or, if this is unsuitable, the new '\?' escape
+sequence. *Note Diversions:: and *note Gtroff Internals::.
+
+ In the somewhat pathological case where a diversion exists containing
+a partially collected line and a partially collected line at the
+top-level diversion has never existed, AT&T 'troff' will output the
+partially collected line at the end of input; GNU 'troff' will not.
+
+
+File: groff.info, Node: Other Differences-Footnotes, Up: Other Differences
+
+ (1) DWB 3.3, Solaris, Heirloom Doctools, and Plan 9 'troff' all
+support it.
+
+ (2) Naturally, if you've changed the escape character, you need to
+prefix the 'e' with whatever it is--and you'll likely get something
+other than a backslash in the output.
+
+ (3) The 'rs' special character identifier was not defined in AT&T
+'troff''s font description files, but is in those of its lineal
+descendant, Heirloom Doctools 'troff', as of the latter's 060716 release
+(July 2006).
+
+
+File: groff.info, Node: File Formats, Next: Copying This Manual, Prev: GNU troff Reference, Up: Top
+
+6 File Formats
+**************
+
+All files read and written by 'gtroff' are text files. The following
+two sections describe their format.
+
+* Menu:
+
+* gtroff Output::
+* Device and Font Description Files::
+
+
+File: groff.info, Node: gtroff Output, Next: Device and Font Description Files, Prev: File Formats, Up: File Formats
+
+6.1 'gtroff' Output
+===================
+
+This section describes the 'groff' intermediate output format produced
+by GNU 'troff'.
+
+ As 'groff' is a wrapper program around GNU 'troff' and automatically
+calls an output driver (or "postprocessor"), this output does not show
+up normally. This is why it is called _intermediate_. 'groff' provides
+the option '-Z' to inhibit postprocessing such that the produced
+intermediate output is sent to standard output just as it is when
+calling GNU 'troff' directly.
+
+ Here, the term "troff output" describes what is output by GNU
+'troff', while "intermediate output" refers to the language that is
+accepted by the parser that prepares this output for the output drivers.
+This parser handles whitespace more flexibly than AT&T's implementation
+and implements obsolete elements for compatibility; otherwise, both
+formats are the same.(1) (*note gtroff Output-Footnote-1::)
+
+ The main purpose of the intermediate output concept is to facilitate
+the development of postprocessors by providing a common programming
+interface for all devices. It has a language of its own that is
+completely different from the 'gtroff' language. While the 'gtroff'
+language is a high-level programming language for text processing, the
+intermediate output language is a kind of low-level assembler language
+by specifying all positions on the page for writing and drawing.
+
+ The intermediate output produced by 'gtroff' is fairly readable,
+while output from AT&T 'troff' is rather hard to understand because of
+strange habits that are still supported, but not used any longer by
+'gtroff'.
+
+* Menu:
+
+* Language Concepts::
+* Command Reference::
+* Intermediate Output Examples::
+* Output Language Compatibility::
+
+
+File: groff.info, Node: gtroff Output-Footnotes, Up: gtroff Output
+
+ (1) The parser and postprocessor for intermediate output can be found
+in the file
+'GROFF-SOURCE-DIR/src/libs/libdriver/input.cpp'.
+
+
+File: groff.info, Node: Language Concepts, Next: Command Reference, Prev: gtroff Output, Up: gtroff Output
+
+6.1.1 Language Concepts
+-----------------------
+
+The fundamental operation of the GNU 'troff' formatter is the
+translation of the 'groff' input language into a device-independent form
+primarily concerned with what has to be written or drawn at specific
+positions on the output device. This language is simple and imperative.
+In the following discussion, the term "command" always refers to this
+intermediate output language, and never to the 'groff' language intended
+for direct use by document authors. Intermediate output commands
+comprise several categories: glyph output; font, color, and text size
+selection; motion of the printing position; page advancement; drawing of
+geometric objects; and device control commands, a catch-all for
+operations not easily classified as any of the foregoing, such as
+directives to start and stop output, identify the intended output
+device, or place URL hyperlinks in supported output formats.
+
+* Menu:
+
+* Separation::
+* Argument Units::
+* Document Parts::
+
+
+File: groff.info, Node: Separation, Next: Argument Units, Prev: Language Concepts, Up: Language Concepts
+
+6.1.1.1 Separation
+..................
+
+AT&T 'troff' output has strange requirements regarding whitespace. The
+'gtroff' output parser, however, is more tolerant, making whitespace
+maximally optional. Such characters, i.e., the tab, space, and newline,
+always have a syntactical meaning. They are never printable because
+spacing within the output is always done by positioning commands.
+
+ Any sequence of space or tab characters is treated as a single
+"syntactical space". It separates commands and arguments, but is only
+required when there would occur a clashing between the command code and
+the arguments without the space. Most often, this happens when
+variable-length command names, arguments, argument lists, or command
+clusters meet. Commands and arguments with a known, fixed length need
+not be separated by syntactical space.
+
+ A line break is a syntactical element, too. Every command argument
+can be followed by whitespace, a comment, or a newline character. Thus
+a "syntactical line break" is defined to consist of optional syntactical
+space that is optionally followed by a comment, and a newline character.
+
+ The normal commands, those for positioning and text, consist of a
+single letter taking a fixed number of arguments. For historical
+reasons, the parser allows stacking of such commands on the same line,
+but fortunately, in 'gtroff''s intermediate output, every command with
+at least one argument is followed by a line break, thus providing
+excellent readability.
+
+ The other commands--those for drawing and device controlling--have a
+more complicated structure; some recognize long command names, and some
+take a variable number of arguments. So all 'D' and 'x' commands were
+designed to request a syntactical line break after their last argument.
+Only one command, 'x X', has an argument that can span several input
+lines; all other commands must have all of their arguments on the same
+line as the command, i.e., the arguments may not be split by a line
+break.
+
+ Empty lines (these are lines containing only space and/or a comment),
+can occur everywhere. They are just ignored.
+
+
+File: groff.info, Node: Argument Units, Next: Document Parts, Prev: Separation, Up: Language Concepts
+
+6.1.1.2 Argument Units
+......................
+
+Some commands take integer arguments that are assumed to represent
+values in a measurement unit, but the letter for the corresponding
+scaling unit is not written with the output command arguments. Most
+commands assume the scaling unit 'u', the basic unit of the device, some
+use 'z', the scaled point unit of the device, while others, such as the
+color commands, expect plain integers.
+
+ Single characters can have the eighth bit set, as can the names of
+fonts and special characters. The names of characters and fonts can be
+of arbitrary length. A character that is to be printed is always in the
+current font.
+
+ A string argument is always terminated by the next whitespace
+character (space, tab, or newline); an embedded '#' character is
+regarded as part of the argument, not as the beginning of a comment
+command. An integer argument is already terminated by the next
+non-digit character, which then is regarded as the first character of
+the next argument or command.
+
+
+File: groff.info, Node: Document Parts, Prev: Argument Units, Up: Language Concepts
+
+6.1.1.3 Document Parts
+......................
+
+A correct intermediate output document consists of two parts, the
+"prologue" and the "body".
+
+ The task of the prologue is to set the general device parameters
+using three exactly specified commands. 'gtroff''s prologue is
+guaranteed to consist of the following three lines (in that order):
+
+ x T DEVICE
+ x res N H V
+ x init
+
+with the arguments set as outlined in *note Device Control Commands::.
+The parser for the intermediate output format is able to interpret
+additional whitespace and comments as well even in the prologue.
+
+ The body is the main section for processing the document data.
+Syntactically, it is a sequence of any commands different from the ones
+used in the prologue. Processing is terminated as soon as the first
+'x stop' command is encountered; the last line of any 'gtroff'
+intermediate output always contains such a command.
+
+ Semantically, the body is page oriented. A new page is started by a
+'p' command. Positioning, writing, and drawing commands are always done
+within the current page, so they cannot occur before the first 'p'
+command. Absolute positioning (by the 'H' and 'V' commands) is done
+relative to the current page; all other positioning is done relative to
+the current location within this page.
+
+
+File: groff.info, Node: Command Reference, Next: Intermediate Output Examples, Prev: Language Concepts, Up: gtroff Output
+
+6.1.2 Command Reference
+-----------------------
+
+This section describes all intermediate output commands, both from AT&T
+'troff' as well as the 'gtroff' extensions.
+
+* Menu:
+
+* Comment Command::
+* Simple Commands::
+* Graphics Commands::
+* Device Control Commands::
+* Obsolete Command::
+
+
+File: groff.info, Node: Comment Command, Next: Simple Commands, Prev: Command Reference, Up: Command Reference
+
+6.1.2.1 Comment Command
+.......................
+
+'#ANYTHING<end of line>'
+ A comment. Ignore any characters from the '#' character up to the
+ next newline character.
+
+ This command is the only possibility for commenting in the
+ intermediate output. Each comment can be preceded by arbitrary
+ syntactical space; every command can be terminated by a comment.
+
+
+File: groff.info, Node: Simple Commands, Next: Graphics Commands, Prev: Comment Command, Up: Command Reference
+
+6.1.2.2 Simple Commands
+.......................
+
+The commands in this subsection have a command code consisting of a
+single character, taking a fixed number of arguments. Most of them are
+commands for positioning and text writing. These commands are tolerant
+of whitespace. Optionally, syntactical space can be inserted before,
+after, and between the command letter and its arguments. All of these
+commands are stackable; i.e., they can be preceded by other simple
+commands or followed by arbitrary other commands on the same line. A
+separating syntactical space is necessary only when two integer
+arguments would clash or if the preceding argument ends with a string
+argument.
+
+'C ID<whitespace>'
+ Typeset the glyph of the special character ID. Trailing
+ syntactical space is necessary to allow special character names of
+ arbitrary length. The drawing position is not advanced.
+
+'c G'
+ Typeset the glyph of the ordinary character C. The drawing
+ position is not advanced.
+
+'f N'
+ Select the font mounted at position N. N cannot be negative.
+
+'H N'
+ Horizontally move the drawing position to N basic units from the
+ left edge of the page. N cannot be negative.
+
+'h N'
+ Move the drawing position right N basic units. AT&T 'troff'
+ allowed negative N; GNU 'troff' does not produce such values, but
+ 'groff''s output driver library handles them.
+
+'m COLOR-SCHEME [COMPONENT ...]'
+ Select the stroke color using the COMPONENTs in the color space
+ SCHEME. Each COMPONENT is an integer between 0 and 65535. The
+ quantity of components and their meanings vary with each SCHEME.
+ This command is a 'groff' extension.
+
+ 'mc CYAN MAGENTA YELLOW'
+ Use the CMY color scheme with components cyan, magenta, and
+ yellow.
+
+ 'md'
+ Use the default color (no components; black in most cases).
+
+ 'mg GRAY'
+ Use a grayscale color scheme with a component ranging between
+ 0 (black) and 65535 (white).
+
+ 'mk CYAN MAGENTA YELLOW BLACK'
+ Use the CMYK color scheme with components cyan, magenta,
+ yellow, and black.
+
+ 'mr RED GREEN BLUE'
+ Use the RGB color scheme with components red, green, and blue.
+
+'N N'
+ Typeset the glyph with index N in the current font. N is normally
+ a non-negative integer. The drawing position is not advanced. The
+ 'html' and 'xhtml' devices use this command with negative N to
+ produce unbreakable space; the absolute value of N is taken and
+ interpreted in basic units.
+
+'n B A'
+ Indicate a break. No action is performed; the command is present
+ to make the output more easily parsed. The integers B and A
+ describe the vertical space amounts before and after the break,
+ respectively. GNU 'troff' issues this command but 'groff''s output
+ driver library ignores it. See 'v' and 'V' below.
+
+'p N'
+ Begin a new page, setting its number to N. Each page is
+ independent, even from those using the same number. The vertical
+ drawing position is set to 0. All positioning, writing, and
+ drawing commands are interpreted in the context of a page, so a
+ 'p' command must precede them.
+
+'s N'
+ Set type size to N scaled points (unit 'z' in GNU 'troff'. AT&T
+ 'troff' used unscaled points 'p' instead; see *note Output Language
+ Compatibility::.
+
+'t XYZ<whitespace>'
+'t XYZ DUMMY-ARG<whitespace>'
+ Typeset a word XYZ; that is, set a sequence of ordinary glyphs
+ named X, Y, Z, ..., terminated by a space character or a line
+ break; an optional second integer argument is ignored (this allows
+ the formatter to generate an even number of arguments). Each glyph
+ is set at the current drawing position, and the position is then
+ advanced horizontally by the glyph's width. A glyph's width is
+ read from its metrics in the font description file, scaled to the
+ current type size, and rounded to a multiple of the horizontal
+ motion quantum. Use the 'C' command to emplace glyphs of special
+ characters. The 't' command is a 'groff' extension and is output
+ only for devices whose 'DESC' file contains the 'tcommand'
+ directive; see *note DESC File Format::.
+
+'u N XYZ<whitespace>'
+ Typeset word XYZ with track kerning. As 't', but after placing
+ each glyph, the drawing position is further advanced horizontally
+ by N basic units ('u'). The 'u' command is a 'groff' extension and
+ is output only for devices whose 'DESC' file contains the
+ 'tcommand' directive; see *note DESC File Format::.
+
+'V N'
+ Vertically move the drawing position to N basic units from the top
+ edge of the page. N cannot be negative.
+
+'v N'
+ Move the drawing position down N basic units. AT&T 'troff' allowed
+ negative N; GNU 'troff' does not produce such values, but 'groff''s
+ output driver library handles them.
+
+'w'
+ Indicate an inter-word space. No action is performed; the command
+ is present to make the output more easily parsed. Only adjustable,
+ breakable inter-word spaces are thus described; those resulting
+ from '\~' or horizontal motion escape sequences are not. GNU
+ 'troff' issues this command but 'groff''s output driver library
+ ignores it. See 'h' and 'H' above.
+
+
+File: groff.info, Node: Graphics Commands, Next: Device Control Commands, Prev: Simple Commands, Up: Command Reference
+
+6.1.2.3 Graphics Commands
+.........................
+
+Each graphics or drawing command in the intermediate output starts with
+the letter 'D', followed by one or two characters that specify a
+subcommand; this is followed by a fixed or variable number of integer
+arguments that are separated by a single space character. A 'D' command
+may not be followed by another command on the same line (apart from a
+comment), so each 'D' command is terminated by a syntactical line break.
+
+ 'gtroff' output follows the classical spacing rules (no space between
+command and subcommand, all arguments are preceded by a single space
+character), but the parser allows optional space between the command
+letters and makes the space before the first argument optional. As
+usual, each space can be any sequence of tab and space characters.
+
+ Some graphics commands can take a variable number of arguments. In
+this case, they are integers representing a size measured in basic units
+'u'. The arguments called H1, H2, ..., HN stand for horizontal
+distances where positive means right, negative left. The arguments
+called V1, V2, ..., VN stand for vertical distances where positive means
+down, negative up. All these distances are offsets relative to the
+current location.
+
+ Each graphics command directly corresponds to a similar 'gtroff' '\D'
+escape sequence. *Note Drawing Geometric Objects::.
+
+ Unknown 'D' commands are assumed to be device-specific. Its
+arguments are parsed as strings; the whole information is then sent to
+the postprocessor.
+
+ In the following command reference, the syntax element <line break>
+means a syntactical line break as defined above.
+
+'D~ H1 V1 H2 V2 ... HN VN<line break>'
+ Draw B-spline from current position to offset (H1,V1), then to
+ offset (H2,V2), if given, etc., up to (HN,VN). This command takes
+ a variable number of argument pairs; the current position is moved
+ to the terminal point of the drawn curve.
+
+'Da H1 V1 H2 V2<line break>'
+ Draw arc from current position to (H1,V1)+(H2,V2) with center at
+ (H1,V1); then move the current position to the final point of the
+ arc.
+
+'DC D<line break>'
+'DC D DUMMY-ARG<line break>'
+ Draw a solid circle using the current fill color with diameter D
+ (integer in basic units 'u') with leftmost point at the current
+ position; then move the current position to the rightmost point of
+ the circle. An optional second integer argument is ignored (this
+ allows the formatter to generate an even number of arguments).
+ This command is a 'gtroff' extension.
+
+'Dc D<line break>'
+ Draw circle line with diameter D (integer in basic units 'u') with
+ leftmost point at the current position; then move the current
+ position to the rightmost point of the circle.
+
+'DE H V<line break>'
+ Draw a solid ellipse in the current fill color with a horizontal
+ diameter of H and a vertical diameter of V (both integers in basic
+ units 'u') with the leftmost point at the current position; then
+ move to the rightmost point of the ellipse. This command is a
+ 'gtroff' extension.
+
+'De H V<line break>'
+ Draw an outlined ellipse with a horizontal diameter of H and a
+ vertical diameter of V (both integers in basic units 'u') with the
+ leftmost point at current position; then move to the rightmost
+ point of the ellipse.
+
+'DF COLOR-SCHEME [COMPONENT ...]<line break>'
+ Set fill color for solid drawing objects using different color
+ schemes; the analogous command for setting the color of text, line
+ graphics, and the outline of graphic objects is 'm'. The color
+ components are specified as integer arguments between 0 and 65535.
+ The number of color components and their meaning vary for the
+ different color schemes. These commands are generated by
+ 'gtroff''s escape sequences '\D'F ...'' and '\M' (with no other
+ corresponding graphics commands). No position changing. This
+ command is a 'gtroff' extension.
+
+ 'DFc CYAN MAGENTA YELLOW<line break>'
+ Set fill color for solid drawing objects using the CMY color
+ scheme, having the 3 color components CYAN, MAGENTA, and
+ YELLOW.
+
+ 'DFd<line break>'
+ Set fill color for solid drawing objects to the default fill
+ color value (black in most cases). No component arguments.
+
+ 'DFg GRAY<line break>'
+ Set fill color for solid drawing objects to the shade of gray
+ given by the argument, an integer between 0 (black) and 65535
+ (white).
+
+ 'DFk CYAN MAGENTA YELLOW BLACK<line break>'
+ Set fill color for solid drawing objects using the CMYK color
+ scheme, having the 4 color components CYAN, MAGENTA, YELLOW,
+ and BLACK.
+
+ 'DFr RED GREEN BLUE<line break>'
+ Set fill color for solid drawing objects using the RGB color
+ scheme, having the 3 color components RED, GREEN, and BLUE.
+
+'Df N<line break>'
+ The argument N must be an integer in the range -32767 to 32767.
+
+ 0 <= N <= 1000
+ Set the color for filling solid drawing objects to a shade of
+ gray, where 0 corresponds to solid white, 1000 (the default)
+ to solid black, and values in between to intermediate shades
+ of gray; this is obsoleted by command 'DFg'.
+
+ N < 0 or N > 1000
+ Set the filling color to the color that is currently being
+ used for the text and the outline, see command 'm'. For
+ example, the command sequence
+
+ mg 0 0 65535
+ Df -1
+
+ sets all colors to blue.
+
+ No position changing. This command is a 'gtroff' extension.
+
+'Dl H V<line break>'
+ Draw line from current position to offset (H,V) (integers in basic
+ units 'u'); then set current position to the end of the drawn line.
+
+'Dp H1 V1 H2 V2 ... HN VN<line break>'
+ Draw a polygon line from current position to offset (H1,V1), from
+ there to offset (H2,V2), etc., up to offset (HN,VN), and from there
+ back to the starting position. For historical reasons, the
+ position is changed by adding the sum of all arguments with odd
+ index to the actual horizontal position and the even ones to the
+ vertical position. Although this doesn't make sense it is kept for
+ compatibility. This command is a 'gtroff' extension.
+
+'DP H1 V1 H2 V2 ... HN VN<line break>'
+ Draw a solid polygon in the current fill color rather than an
+ outlined polygon, using the same arguments and positioning as the
+ corresponding 'Dp' command. This command is a 'gtroff' extension.
+
+'Dt N<line break>'
+ Set the current line thickness to N (an integer in basic units 'u')
+ if N>0; if N=0 select the smallest available line thickness; if N<0
+ set the line thickness proportional to the type size (this is the
+ default before the first 'Dt' command was specified). For
+ historical reasons, the horizontal position is changed by adding
+ the argument to the actual horizontal position, while the vertical
+ position is not changed. Although this doesn't make sense it is
+ kept for compatibility. This command is a 'gtroff' extension.
+
+
+File: groff.info, Node: Device Control Commands, Next: Obsolete Command, Prev: Graphics Commands, Up: Command Reference
+
+6.1.2.4 Device Control Commands
+...............................
+
+Each device control command starts with the letter 'x', followed by a
+space character (optional or arbitrary space or tab in 'gtroff') and a
+subcommand letter or word; each argument (if any) must be preceded by a
+syntactical space. All 'x' commands are terminated by a syntactical
+line break; no device control command can be followed by another command
+on the same line (except a comment).
+
+ The subcommand is basically a single letter, but to increase
+readability, it can be written as a word, i.e., an arbitrary sequence of
+characters terminated by the next tab, space, or newline character. All
+characters of the subcommand word but the first are simply ignored. For
+example, 'gtroff' outputs the initialization command 'x i' as 'x init'
+and the resolution command 'x r' as 'x res'.
+
+ In the following, the syntax element <line break> means a syntactical
+line break (*note Separation::).
+
+'xF NAME<line break>'
+ The 'F' stands for FILENAME.
+
+ Use NAME as the intended name for the current file in error
+ reports. This is useful for remembering the original file name
+ when 'gtroff' uses an internal piping mechanism. The input file is
+ not changed by this command. This command is a 'gtroff' extension.
+
+'xf N S<line break>'
+ The 'f' stands for FONT.
+
+ Mount font position N (a non-negative integer) with font named S (a
+ text word). *Note Font Positions::.
+
+'xH N<line break>'
+ The 'H' stands for HEIGHT.
+
+ Set glyph height to N (a positive integer in scaled points 'z').
+ AT&T 'troff' uses the unit points ('p') instead. *Note Output
+ Language Compatibility::.
+
+'xi<line break>'
+ The 'i' stands for INIT.
+
+ Initialize device. This is the third command of the prologue.
+
+'xp<line break>'
+ The 'p' stands for PAUSE.
+
+ Parsed but ignored. The AT&T 'troff' manual documents this command
+ as
+
+ pause device, can be restarted
+
+ but GNU 'troff' output drivers do nothing with this command.
+
+'xr N H V<line break>'
+ The 'r' stands for RESOLUTION.
+
+ Resolution is N, while H is the minimal horizontal motion, and V
+ the minimal vertical motion possible with this device; all
+ arguments are positive integers in basic units 'u' per inch. This
+ is the second command of the prologue.
+
+'xS N<line break>'
+ The 'S' stands for SLANT.
+
+ Set slant to N (an integer in basic units 'u').
+
+'xs<line break>'
+ The 's' stands for STOP.
+
+ Terminates the processing of the current file; issued as the last
+ command of any intermediate 'troff' output.
+
+'xt<line break>'
+ The 't' stands for TRAILER.
+
+ Generate trailer information, if any. In GNU 'troff', this is
+ ignored.
+
+'xT XXX<line break>'
+ The 'T' stands for TYPESETTER.
+
+ Set the name of the output driver to XXX, a sequence of
+ non-whitespace characters terminated by whitespace. The possible
+ names correspond to those of 'groff''s '-T' option. This is the
+ first command of the prologue.
+
+'xu N<line break>'
+ The 'u' stands for UNDERLINE.
+
+ Configure underlining of spaces. If N is 1, start underlining of
+ spaces; if N is 0, stop underlining of spaces. This is needed for
+ the 'cu' request in 'nroff' mode and is ignored otherwise. This
+ command is a 'gtroff' extension.
+
+'xX ANYTHING<line break>'
+ The 'x' stands for X-ESCAPE.
+
+ Send string ANYTHING uninterpreted to the device. If the line
+ following this command starts with a '+' character this line is
+ interpreted as a continuation line in the following sense. The '+'
+ is ignored, but a newline character is sent instead to the device,
+ the rest of the line is sent uninterpreted. The same applies to
+ all following lines until the first character of a line is not a
+ '+' character. This command is generated by the 'gtroff' escape
+ sequence '\X'. The line-continuing feature is a 'gtroff'
+ extension.
+
+
+File: groff.info, Node: Obsolete Command, Prev: Device Control Commands, Up: Command Reference
+
+6.1.2.5 Obsolete Command
+........................
+
+In AT&T 'troff' output, the writing of a single glyph is mostly done by
+a very strange command that combines a horizontal move and a single
+character giving the glyph name. It doesn't have a command code, but is
+represented by a 3-character argument consisting of exactly 2 digits and
+a character.
+
+DDG
+ Move right DD (exactly two decimal digits) basic units 'u', then
+ print glyph G (represented as a single character).
+
+ In GNU 'troff', arbitrary syntactical space around and within this
+ command is allowed. Only when a preceding command on the same line
+ ends with an argument of variable length is a separating space
+ obligatory. In AT&T 'troff', large clusters of these and other
+ commands are used, mostly without spaces; this made such output
+ almost unreadable.
+
+ For modern high-resolution devices, this command does not make sense
+because the width of the glyphs can become much larger than two decimal
+digits. In 'gtroff', this is only used for the devices 'X75', 'X75-12',
+'X100', and 'X100-12'. For other devices, the commands 't' and 'u'
+provide a better functionality.
+
+
+File: groff.info, Node: Intermediate Output Examples, Next: Output Language Compatibility, Prev: Command Reference, Up: gtroff Output
+
+6.1.3 Intermediate Output Examples
+----------------------------------
+
+This section presents the intermediate output generated from the same
+input for three different devices. The input is the sentence 'hell
+world' fed into 'gtroff' on the command line.
+
+High-resolution device 'ps'
+
+ This is the standard output of 'gtroff' if no '-T' option is given.
+
+ shell> echo "hell world" | groff -Z -T ps
+
+ x T ps
+ x res 72000 1 1
+ x init
+ p1
+ x font 5 TR
+ f5
+ s10000
+ V12000
+ H72000
+ thell
+ wh2500
+ tw
+ H96620
+ torld
+ n12000 0
+ x trailer
+ V792000
+ x stop
+
+ This output can be fed into 'grops' to get its representation as a
+ PostScript file.
+
+Low-resolution device 'latin1'
+
+ This is similar to the high-resolution device except that the
+ positioning is done at a minor scale. Some comments (lines
+ starting with '#') were added for clarification; they were not
+ generated by the formatter.
+
+ shell> echo "hell world" | groff -Z -T latin1
+
+ # prologue
+ x T latin1
+ x res 240 24 40
+ x init
+ # begin a new page
+ p1
+ # font setup
+ x font 1 R
+ f1
+ s10
+ # initial positioning on the page
+ V40
+ H0
+ # write text 'hell'
+ thell
+ # inform about space, and issue a horizontal jump
+ wh24
+ # write text 'world'
+ tworld
+ # announce line break, but do nothing because...
+ n40 0
+ # ...the end of the document has been reached
+ x trailer
+ V2640
+ x stop
+
+ This output can be fed into 'grotty' to get a formatted text
+ document.
+
+AT&T 'troff' output
+ Since a computer monitor has a much lower resolution than modern
+ printers, the intermediate output for X11 devices can use the
+ jump-and-write command with its 2-digit displacements.
+
+ shell> echo "hell world" | groff -Z -T X100
+
+ x T X100
+ x res 100 1 1
+ x init
+ p1
+ x font 5 TR
+ f5
+ s10
+ V16
+ H100
+ # write text with jump-and-write commands
+ ch07e07l03lw06w11o07r05l03dh7
+ n16 0
+ x trailer
+ V1100
+ x stop
+
+ This output can be fed into 'xditview' or 'gxditview' for
+ displaying in X.
+
+ Due to the obsolete jump-and-write command, the text clusters in
+ the AT&T 'troff' output are almost unreadable.
+
+
+File: groff.info, Node: Output Language Compatibility, Prev: Intermediate Output Examples, Up: gtroff Output
+
+6.1.4 Output Language Compatibility
+-----------------------------------
+
+The intermediate output language of AT&T 'troff' was first documented in
+'A Typesetter-independent TROFF', by Brian Kernighan, and by 1992 the
+AT&T 'troff' manual was updated to incorprate a description of it.
+
+ The GNU 'troff' intermediate output format is compatible with this
+specification except for the following features.
+
+ * The classical quasi-device independence is not yet implemented.
+
+ * The old hardware was very different from what we use today. So the
+ 'groff' devices are also fundamentally different from the ones in
+ AT&T 'troff'. For example, the AT&T PostScript device is called
+ 'post' and has a resolution of only 720 units per inch, suitable
+ for printers 20 years ago, while 'groff''s 'ps' device has a
+ resolution of 72000 units per inch. Maybe, by implementing some
+ rescaling mechanism similar to the classical quasi-device
+ independence, 'groff' could emulate AT&T's 'post' device.
+
+ * The B-spline command 'D~' is correctly handled by the intermediate
+ output parser, but the drawing routines aren't implemented in some
+ of the postprocessor programs.
+
+ * The argument of the commands 's' and 'x H' has the implicit unit
+ scaled point 'z' in 'gtroff', while AT&T 'troff' has point ('p').
+ This isn't an incompatibility but a compatible extension, for both
+ units coincide for all devices without a 'sizescale' parameter in
+ the 'DESC' file, including all postprocessors from AT&T and
+ 'groff''s text devices. The few 'groff' devices with a 'sizescale'
+ parameter either do not exist for AT&T 'troff', have a different
+ name, or seem to have a different resolution. So conflicts are
+ very unlikely.
+
+ * The position changing after the commands 'Dp', 'DP', and 'Dt' is
+ illogical, but as old versions of 'gtroff' used this feature it is
+ kept for compatibility reasons.
+
+
+File: groff.info, Node: Device and Font Description Files, Prev: gtroff Output, Up: File Formats
+
+6.2 Device and Font Description Files
+=====================================
+
+The 'groff' font and output device description formats are slight
+extensions of those used by AT&T device-independent 'troff'. In
+distinction to the AT&T implementation, 'groff' lacks a binary format;
+all files are text files.(1) (*note Device and Font Description
+Files-Footnote-1::) The device and font description files for a device
+NAME are stored in a 'devNAME' directory. The device description file
+is called 'DESC', and, for each font supported by the device, a font
+description file is called 'F', where F is usually an abbreviation of a
+font's name and/or style. For example, the 'ps' (PostScript) device has
+'groff' font description files for Times roman ('TR') and Zapf Chancery
+Medium italic ('ZCMI'), among many others, while the 'utf8' device (for
+terminal emulators) has only font descriptions for the roman, italic,
+bold, and bold-italic styles ('R', 'I', 'B', and 'BI', respectively).
+
+ Device and font description files are read both by the formatter, GNU
+'troff', and by output drivers. The programs delegate these files'
+processing to an internal library, 'libgroff', ensuring their consistent
+interpretation.
+
+* Menu:
+
+* DESC File Format::
+* Font Description File Format::
+
+
+File: groff.info, Node: Device and Font Description Files-Footnotes, Up: Device and Font Description Files
+
+ (1) Plan 9 'troff' has also abandoned the binary format.
+
+
+File: groff.info, Node: DESC File Format, Next: Font Description File Format, Prev: Device and Font Description Files, Up: Device and Font Description Files
+
+6.2.1 'DESC' File Format
+------------------------
+
+The 'DESC' file contains a series of directives; each begins a line.
+Their order is not important, with two exceptions: (1) the 'res'
+directive must precede any 'papersize' directive; and (2) the 'charset'
+directive must come last (if at all). If a directive name is repeated,
+later entries in the file override previous ones (except that the paper
+dimensions are computed based on the 'res' directive last seen when
+'papersize' is encountered). Spaces and/or tabs separate words and are
+ignored at line boundaries. Comments start with the '#' character and
+extend to the end of a line. Empty lines are ignored.
+
+'family FAM'
+ The default font family is FAM.
+
+'fonts N F1 ... FN'
+ Fonts F1, ..., FN are mounted at font positions M+1, ..., M+N where
+ M is the number of 'styles' (see below). This directive may extend
+ over more than one line. A font name of '0' causes no font to be
+ mounted at the corresponding position.
+
+'hor N'
+ The horizontal motion quantum is N basic units. All horizontal
+ quantities are rounded to multiples of N.
+
+'image_generator PROGRAM'
+ Use PROGRAM to generate PNG images from PostScript input. Under
+ GNU/Linux, this is usually 'gs', but under other systems (notably
+ Cygwin) it might be set to another name. The 'grohtml' driver uses
+ this directive.
+
+'paperlength N'
+ The vertical dimension of the output medium is N basic units
+ (deprecated: use 'papersize' instead).
+
+'papersize FORMAT-OR-DIMENSION-PAIR-OR-FILE-NAME ...'
+ The dimensions of the output medium are as according to the
+ argument, which is either a standard paper format, a pair of
+ dimensions, or the name of a plain text file containing either of
+ the foregoing.
+
+ Recognized paper formats are the ISO and DIN formats 'A0'-'A7',
+ 'B0'-'B7', 'C0'-'C7', 'D0'-'D7'; the U.S. paper types 'letter',
+ 'legal', 'tabloid', 'ledger', 'statement', and 'executive'; and the
+ envelope formats 'com10', 'monarch', and 'DL'. Matching is
+ performed without regard for lettercase.
+
+ Alternatively, the argument can be a custom paper format in the
+ format 'LENGTH,WIDTH' (with no spaces before or after the comma).
+ Both LENGTH and WIDTH must have a unit appended; valid units are
+ 'i' for inches, 'c' for centimeters, 'p' for points, and 'P' for
+ picas. Example: '12c,235p'. An argument that starts with a digit
+ is always treated as a custom paper format.
+
+ Finally, the argument can be a file name (e.g., '/etc/papersize');
+ if the file can be opened, the first line is read and a match
+ attempted against each of the other forms. No comment syntax is
+ supported.
+
+ More than one argument can be specified; each is scanned in turn
+ and the first valid paper specification used.
+
+'paperwidth N'
+ The horizontal dimension of the output medium is N basic units
+ (deprecated: use 'papersize' instead).
+
+'pass_filenames'
+ Direct GNU 'troff' to emit the name of the source file being
+ processed. This is achieved with the intermediate output command
+ 'x F', which 'grohtml' interprets.
+
+'postpro PROGRAM'
+ Use PROGRAM as the postprocessor.
+
+'prepro PROGRAM'
+ Use PROGRAM as a preprocessor. The 'html' and 'xhtml' output
+ devices use this directive.
+
+'print PROGRAM'
+ Use PROGRAM as a spooler program for printing. If omitted, the
+ '-l' and '-L' options of 'groff' are ignored.
+
+'res N'
+ The device resolution is N basic units per inch.
+
+'sizes S1 ... SN 0'
+ The device has fonts at S1, ..., SN scaled points (see below). The
+ list of sizes must be terminated by '0'. Each SI can also be a
+ range of sizes M-N. The list can extend over more than one line.
+
+'sizescale N'
+ A typographical point is subdivided into N scaled points. The
+ default is '1'. *Note Using Fractional Type Sizes::.
+
+'styles S1 ... SM'
+ The first M mounting positions are associated with styles S1, ...,
+ SM.
+
+'tcommand'
+ The postprocessor can handle the 't' and 'u' intermediate output
+ commands.
+
+'unicode'
+ The output device supports the complete Unicode repertoire. This
+ directive is useful only for devices that produce character
+ entities instead of glyphs.
+
+ If 'unicode' is present, no 'charset' section is required in the
+ font description files since the Unicode handling built into
+ 'groff' is used. However, if there are entries in a font
+ description file's 'charset' section, they either override the
+ default mappings for those particular characters or add new
+ mappings (normally for composite characters).
+
+ The 'utf8', 'html', and 'xhtml' output devices use this directive.
+
+'unitwidth N'
+ Quantities in the font description files are in basic units for
+ fonts whose type size is N scaled points.
+
+'unscaled_charwidths'
+ Make the font handling module always return unscaled character
+ widths. The 'grohtml' driver uses this directive.
+
+'use_charnames_in_special'
+ GNU 'troff' should encode special characters inside device control
+ commands; see *note Postprocessor Access::. The 'grohtml' driver
+ uses this directive.
+
+'vert N'
+ The vertical motion quantum is N basic units. All vertical
+ quantities are rounded to multiples of N.
+
+'charset'
+ This line and everything following it in the file are ignored. It
+ is recognized for compatibility with other 'troff' implementations.
+ In GNU 'troff', character set repertoire is described on a per-font
+ basis.
+
+ GNU 'troff' recognizes but ignores the directives 'spare1', 'spare2',
+and 'biggestfont'.
+
+ The 'res', 'unitwidth', 'fonts', and 'sizes' lines are mandatory.
+Directives not listed above are ignored by GNU 'troff' but may be used
+by postprocessors to obtain further information about the device.
+
+
+File: groff.info, Node: Font Description File Format, Prev: DESC File Format, Up: Device and Font Description Files
+
+6.2.2 Font Description File Format
+----------------------------------
+
+On typesetting output devices, each font is typically available at
+multiple sizes. While paper measurements in the device description file
+are in absolute units, measurements applicable to fonts must be
+proportional to the type size. 'groff' achieves this using the
+precedent set by AT&T device-independent 'troff': one font size is
+chosen as a norm, and all others are scaled linearly relative to that
+basis. The "unit width" is the number of basic units per point when the
+font is rendered at this nominal size.
+
+ For instance, 'groff''s 'lbp' device uses a 'unitwidth' of 800. Its
+Times roman font 'TR' has a 'spacewidth' of 833; this is also the width
+of its comma, period, centered period, and mathematical asterisk, while
+its 'M' is 2,963 basic units. Thus, an 'M' on the 'lbp' device is 2,963
+basic units wide at a notional type size of 800 points.(1) (*note Font
+Description File Format-Footnote-1::)
+
+ A font description file has two sections. The first is a sequence of
+directives, and is parsed similarly to the 'DESC' file described above.
+Except for the directive names that begin the second section, their
+ordering is immaterial. Later directives of the same name override
+earlier ones, spaces and tabs are handled in the same way, and the same
+comment syntax is supported. Empty lines are ignored throughout.
+
+'name F'
+ The name of the font is F. 'DESC' is an invalid font name. Simple
+ integers are valid, but their use is discouraged.(2) (*note Font
+ Description File Format-Footnote-2::)
+
+'spacewidth N'
+ The width of an unadjusted inter-word space is N basic units.
+
+ The directives above must appear in the first section; those below
+are optional.
+
+'slant N'
+ The font's glyphs have a slant of N degrees; a positive N slants in
+ the direction of text flow.
+
+'ligatures LIG1 ... LIGN [0]'
+ Glyphs LIG1, ..., LIGN are ligatures; possible ligatures are 'ff',
+ 'fi', 'fl', 'ffi' and 'ffl'. For compatibility with other 'troff'
+ implementations, the list of ligatures may be terminated with
+ a '0'. The list of ligatures must not extend over more than one
+ line.
+
+'special'
+ The font is "special": when a glyph is requested that is not
+ present in the current font, it is sought in any mounted fonts that
+ bear this property.
+
+ Other directives in this section are ignored by GNU 'troff', but may
+be used by postprocessors to obtain further information about the font.
+
+ The second section contains one or two subsections. These can appear
+in either order; the first one encountered commences the second section.
+Each starts with a directive on a line by itself. A 'charset'
+subsection is mandatory unless the associated 'DESC' file contains the
+'unicode' directive. Another subsection, 'kernpairs', is optional.
+
+ The directive 'charset' starts the character set subsection.(3)
+(*note Font Description File Format-Footnote-3::) It precedes a series
+of glyph descriptions, one per line. Each such glyph description
+comprises a set of fields separated by spaces or tabs and organized as
+follows.
+
+ NAME METRICS TYPE CODE [ENTITY-NAME] ['--' COMMENT]
+
+NAME identifies the glyph: if NAME is a printable character C, it
+corresponds to the 'troff' ordinary character C. If NAME is a
+multi-character sequence not beginning with '\', it corresponds to the
+GNU 'troff' special character escape sequence '\[NAME]'. A name
+consisting of three minus signs, '---', is special and indicates that
+the glyph is unnamed: such glyphs can be accessed only by the '\N'
+escape sequence in 'troff'. A special character named '---' can still
+be defined using 'char' and similar requests. The NAME '\-' defines the
+minus sign glyph. Finally, NAME can be the unbreakable one-sixth and
+one-twelfth space escape sequences, '\|' and '\^' ("thin" and "hair"
+spaces, respectively), in which case only the width metric described
+below is interpreted; a font can thus customize the widths of these
+spaces.
+
+ The form of the METRICS field is as follows.
+
+ WIDTH[','[HEIGHT[','[DEPTH[','[ITALIC-CORRECTION
+ [','[LEFT-ITALIC-CORRECTION[','[SUBSCRIPT-CORRECTION]]]]]]]]]]
+
+There must not be any spaces, tabs, or newlines between these
+"subfields" (which have been split here into two lines only for better
+legibility). The subfields are in basic units expressed as decimal
+integers. Unspecified subfields default to '0'. Since there is no
+associated binary format, these values are not required to fit into the
+C language data type 'char' as they are in AT&T device-independent
+'troff'.
+
+ The WIDTH subfield gives the width of the glyph. The HEIGHT subfield
+gives the height of the glyph (upward is positive); if a glyph does not
+extend above the baseline, it should be given a zero height, rather than
+a negative height. The DEPTH subfield gives the depth of the glyph,
+that is, the distance below the baseline to which the glyph extends
+(downward is positive); if a glyph does not extend below the baseline,
+it should be given a zero depth, rather than a negative depth. Italic
+corrections are relevant to glyphs in italic or oblique styles. The
+ITALIC-CORRECTION is the amount of space that should be added after an
+oblique glyph to be followed immediately by an upright glyph. The
+LEFT-ITALIC-CORRECTION is the amount of space that should be added
+before an oblique glyph to be preceded immediately by an upright glyph.
+The SUBSCRIPT-CORRECTION is the amount of space that should be added
+after an oblique glyph to be followed by a subscript; it should be less
+than the italic correction.
+
+ For fonts used with typesetting devices, the TYPE field gives a
+featural description of the glyph: it is a bit mask recording whether
+the glyph is an ascender, descender, both, or neither. When a '\w'
+escape sequence is interpolated, these values are bitwise or-ed together
+for each glyph and stored in the 'nr' register. In font descriptions
+for terminal devices, all glyphs might have a type of zero, regardless
+of their appearance.
+
+'0'
+ means the glyph lies entirely between the baseline and a horizontal
+ line at the "x-height" of the font; typical examples are 'a', 'c',
+ and 'x';
+
+'1'
+ means the glyph descends below the baseline, like 'p';
+
+'2'
+ means the glyph ascends above the font's x-height, like 'A' or 'b';
+ and
+
+'3'
+ means the glyph is both an ascender and a descender--this is true
+ of parentheses in some fonts.
+
+ The CODE field gives a numeric identifier that the postprocessor uses
+to render the glyph. The glyph can be specified to 'troff' using this
+code by means of the '\N' escape sequence. CODE can be any integer.(4)
+(*note Font Description File Format-Footnote-4::)
+
+ The ENTITY-NAME field defines an identifier for the glyph that the
+postprocessor uses to print the GNU 'troff' glyph NAME. This field is
+optional; it was introduced so that the 'grohtml' output driver could
+encode its character set. For example, the glyph '\[Po]' is represented
+by '&pound;' in HTML 4.0. For efficiency, these data are now compiled
+directly into 'grohtml'. 'grops' uses the field to build sub-encoding
+arrays for PostScript fonts containing more than 256 glyphs. Anything
+on the line after the ENTITY-NAME field or '--' is ignored.
+
+ A line in the 'charset' section can also have the form
+
+ NAME "
+
+identifying NAME as another name for the glyph mentioned in the
+preceding line. Such aliases can be chained.
+
+ The directive 'kernpairs' starts a list of kerning adjustments to be
+made to adjacent glyph pairs from this font. It contains a sequence of
+lines formatted as follows.
+
+ G1 G2 N
+
+The foregoing means that when glyph G1 is typeset immediately before G2,
+the space between them should be increased by N. Most kerning pairs
+should have a negative value for N.
+
+
+File: groff.info, Node: Font Description File Format-Footnotes, Up: Font Description File Format
+
+ (1) 800-point type is not practical for most purposes, but using it
+enables the quantities in the font description files to be expressed as
+integers.
+
+ (2) 'groff' requests and escape sequences interpret non-negative font
+names as mounting positions instead. Further, a font named '0' cannot
+be automatically mounted by the 'fonts' directive of a 'DESC' file.
+
+ (3) For typesetter devices, this directive is misnamed since it
+starts a list of glyphs, not characters.
+
+ (4) that is, any integer parsable by the C standard library's
+'strtol(3)' function
+
+
+File: groff.info, Node: Copying This Manual, Next: Request Index, Prev: Font Description File Format, Up: Top
+
+Appendix A Copying This Manual
+******************************
+
+ Version 1.3, 3 November 2008
+
+ Copyright © 2000-2018 Free Software Foundation, Inc.
+ <http://fsf.org/>
+
+ 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.
+
+ The "publisher" means any person or entity that distributes copies
+ of the Document to the public.
+
+ 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 under this License. Any attempt
+ otherwise to copy, modify, sublicense, or distribute it is void,
+ and will automatically terminate your rights under this License.
+
+ However, if you cease all violation of this License, then your
+ license from a particular copyright holder is reinstated (a)
+ provisionally, unless and until the copyright holder explicitly and
+ finally terminates your license, and (b) permanently, if the
+ copyright holder fails to notify you of the violation by some
+ reasonable means prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+ reinstated permanently if the copyright holder notifies you of the
+ violation by some reasonable means, this is the first time you have
+ received notice of violation of this License (for any work) from
+ that copyright holder, and you cure the violation prior to 30 days
+ after your receipt of the notice.
+
+ Termination of your rights under this section does not terminate
+ the licenses of parties who have received copies or rights from you
+ under this License. If your rights have been terminated and not
+ permanently reinstated, receipt of a copy of some or all of the
+ same material does not give you any rights to use it.
+
+ 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. If the Document specifies that a proxy can
+ decide which future versions of this License can be used, that
+ proxy's public statement of acceptance of a version permanently
+ authorizes you to choose that version for the Document.
+
+ 11. RELICENSING
+
+ "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
+ World Wide Web server that publishes copyrightable works and also
+ provides prominent facilities for anybody to edit those works. A
+ public wiki that anybody can edit is an example of such a server.
+ A "Massive Multiauthor Collaboration" (or "MMC") contained in the
+ site means any set of copyrightable works thus published on the MMC
+ site.
+
+ "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
+ license published by Creative Commons Corporation, a not-for-profit
+ corporation with a principal place of business in San Francisco,
+ California, as well as future copyleft versions of that license
+ published by that same organization.
+
+ "Incorporate" means to publish or republish a Document, in whole or
+ in part, as part of another Document.
+
+ An MMC is "eligible for relicensing" if it is licensed under this
+ License, and if all works that were first published under this
+ License somewhere other than this MMC, and subsequently
+ incorporated in whole or in part into the MMC, (1) had no cover
+ texts or invariant sections, and (2) were thus incorporated prior
+ to November 1, 2008.
+
+ The operator of an MMC Site may republish an MMC contained in the
+ site under CC-BY-SA on the same site at any time before August 1,
+ 2009, provided the MMC is eligible for relicensing.
+
+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.3
+ 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.
+
+
+File: groff.info, Node: Request Index, Next: Escape Sequence Index, Prev: Copying This Manual, Up: Top
+
+Appendix B Request Index
+************************
+
+Request names appear without a leading control character; the defaults
+are '.' for the regular control character and ''' for the no-break
+control character.
+
+
+* Menu:
+
+* ab: Debugging. (line 55)
+* ad: Manipulating Filling and Adjustment.
+ (line 83)
+* af: Assigning Register Formats.
+ (line 12)
+* aln: Setting Registers. (line 110)
+* als: Strings. (line 198)
+* am: Writing Macros. (line 126)
+* am1: Writing Macros. (line 127)
+* ami: Writing Macros. (line 128)
+* ami1: Writing Macros. (line 129)
+* as: Strings. (line 114)
+* as1: Strings. (line 115)
+* asciify: Diversions. (line 208)
+* backtrace: Debugging. (line 104)
+* bd: Artificial Fonts. (line 95)
+* blm: Blank Line Traps. (line 7)
+* box: Diversions. (line 63)
+* boxa: Diversions. (line 64)
+* bp: Page Control. (line 11)
+* br: Manipulating Filling and Adjustment.
+ (line 39)
+* break: while. (line 72)
+* brp: Manipulating Filling and Adjustment.
+ (line 156)
+* c2: Control Characters. (line 29)
+* cc: Control Characters. (line 23)
+* ce: Manipulating Filling and Adjustment.
+ (line 208)
+* cf: I/O. (line 58)
+* cflags: Using Symbols. (line 252)
+* ch: Page Location Traps. (line 114)
+* char: Using Symbols. (line 351)
+* chop: Strings. (line 145)
+* class: Character Classes. (line 12)
+* close: I/O. (line 240)
+* color: Colors. (line 15)
+* composite: Using Symbols. (line 208)
+* continue: while. (line 76)
+* cp: Compatibility Mode. (line 16)
+* cs: Artificial Fonts. (line 125)
+* cu: Artificial Fonts. (line 86)
+* da: Diversions. (line 32)
+* de: Writing Macros. (line 14)
+* de1: Writing Macros. (line 86)
+* defcolor: Colors. (line 27)
+* dei: Writing Macros. (line 108)
+* dei1: Writing Macros. (line 109)
+* device: Postprocessor Access.
+ (line 15)
+* devicem: Postprocessor Access.
+ (line 45)
+* di: Diversions. (line 31)
+* do: Compatibility Mode. (line 27)
+* ds: ms Document Control Settings.
+ (line 15)
+* ds <1>: Strings. (line 24)
+* ds1: Strings. (line 25)
+* dt: Diversion Traps. (line 11)
+* ec: Using Escape Sequences.
+ (line 76)
+* ecr: Using Escape Sequences.
+ (line 102)
+* ecs: Using Escape Sequences.
+ (line 101)
+* el: if-else. (line 8)
+* em: End-of-input Traps. (line 7)
+* eo: Using Escape Sequences.
+ (line 71)
+* ev: Environments. (line 46)
+* evc: Environments. (line 100)
+* ex: Debugging. (line 60)
+* fam: Font Families. (line 21)
+* fc: Fields. (line 18)
+* fchar: Using Symbols. (line 352)
+* fcolor: Colors. (line 85)
+* fi: Manipulating Filling and Adjustment.
+ (line 66)
+* fl: Debugging. (line 95)
+* fp: Font Positions. (line 16)
+* fschar: Using Symbols. (line 353)
+* fspecial: Special Fonts. (line 18)
+* ft: Selecting Fonts. (line 11)
+* ftr: Selecting Fonts. (line 69)
+* fzoom: Selecting Fonts. (line 83)
+* gcolor: Colors. (line 57)
+* hc: Manipulating Hyphenation.
+ (line 88)
+* hcode: Manipulating Hyphenation.
+ (line 293)
+* hla: Manipulating Hyphenation.
+ (line 327)
+* hlm: Manipulating Hyphenation.
+ (line 340)
+* hpf: Manipulating Hyphenation.
+ (line 233)
+* hpfa: Manipulating Hyphenation.
+ (line 234)
+* hpfcode: Manipulating Hyphenation.
+ (line 235)
+* hw: Manipulating Hyphenation.
+ (line 22)
+* hy: Manipulating Hyphenation.
+ (line 120)
+* hym: Manipulating Hyphenation.
+ (line 354)
+* hys: Manipulating Hyphenation.
+ (line 369)
+* ie: if-else. (line 7)
+* if: if-then. (line 7)
+* ig: Comments. (line 54)
+* in: Line Layout. (line 86)
+* it: Input Line Traps. (line 7)
+* itc: Input Line Traps. (line 8)
+* kern: Ligatures and Kerning.
+ (line 41)
+* lc: Leaders. (line 22)
+* length: Strings. (line 135)
+* lf: Debugging. (line 31)
+* lg: Ligatures and Kerning.
+ (line 23)
+* linetabs: Tabs and Fields. (line 139)
+* ll: Line Layout. (line 138)
+* ls: Manipulating Spacing.
+ (line 57)
+* lsm: Leading Space Traps. (line 7)
+* lt: Page Layout. (line 53)
+* mc: Miscellaneous. (line 110)
+* mk: Page Motions. (line 10)
+* mso: I/O. (line 49)
+* msoquiet: I/O. (line 50)
+* na: Manipulating Filling and Adjustment.
+ (line 150)
+* ne: Page Control. (line 31)
+* nf: Manipulating Filling and Adjustment.
+ (line 74)
+* nh: Manipulating Hyphenation.
+ (line 228)
+* nm: Miscellaneous. (line 9)
+* nn: Miscellaneous. (line 74)
+* nop: if-then. (line 26)
+* nr: ms Document Control Settings.
+ (line 11)
+* nr <1>: Setting Registers. (line 10)
+* nr <2>: Setting Registers. (line 64)
+* nr <3>: Auto-increment. (line 14)
+* nroff: troff and nroff Modes.
+ (line 33)
+* ns: Manipulating Spacing.
+ (line 116)
+* nx: I/O. (line 90)
+* open: I/O. (line 207)
+* opena: I/O. (line 208)
+* os: Page Control. (line 66)
+* output: Diversions. (line 195)
+* pc: Page Layout. (line 68)
+* pev: Debugging. (line 78)
+* pi: I/O. (line 149)
+* pl: Page Layout. (line 9)
+* pm: Debugging. (line 82)
+* pn: Page Layout. (line 23)
+* pnr: Debugging. (line 86)
+* po: Line Layout. (line 60)
+* ps: Changing the Type Size.
+ (line 7)
+* psbb: Miscellaneous. (line 158)
+* pso: I/O. (line 38)
+* ptr: Debugging. (line 90)
+* pvs: Changing the Vertical Spacing.
+ (line 48)
+* rchar: Using Symbols. (line 410)
+* rd: I/O. (line 95)
+* return: Writing Macros. (line 163)
+* rfschar: Using Symbols. (line 411)
+* rj: Manipulating Filling and Adjustment.
+ (line 247)
+* rm: Strings. (line 193)
+* rn: Strings. (line 190)
+* rnn: Setting Registers. (line 105)
+* rr: Setting Registers. (line 99)
+* rs: Manipulating Spacing.
+ (line 117)
+* rt: Page Motions. (line 11)
+* schar: Using Symbols. (line 354)
+* shc: Manipulating Hyphenation.
+ (line 97)
+* shift: Parameters. (line 30)
+* sizes: Changing the Type Size.
+ (line 71)
+* so: I/O. (line 9)
+* soquiet: I/O. (line 10)
+* sp: Manipulating Spacing.
+ (line 10)
+* special: Special Fonts. (line 17)
+* spreadwarn: Debugging. (line 135)
+* ss: Manipulating Filling and Adjustment.
+ (line 267)
+* stringdown: Strings. (line 170)
+* stringup: Strings. (line 171)
+* sty: Font Families. (line 62)
+* substring: Strings. (line 153)
+* sv: Page Control. (line 65)
+* sy: I/O. (line 171)
+* ta: Tabs and Fields. (line 13)
+* tag: Postprocessor Access.
+ (line 58)
+* taga: Postprocessor Access.
+ (line 59)
+* tc: Tabs and Fields. (line 127)
+* ti: Line Layout. (line 110)
+* tkf: Ligatures and Kerning.
+ (line 60)
+* tl: Page Layout. (line 39)
+* tm: Debugging. (line 43)
+* tm1: Debugging. (line 44)
+* tmc: Debugging. (line 45)
+* tr: Character Translations.
+ (line 13)
+* trf: I/O. (line 57)
+* trin: Character Translations.
+ (line 14)
+* trnt: Character Translations.
+ (line 79)
+* troff: troff and nroff Modes.
+ (line 25)
+* uf: Artificial Fonts. (line 90)
+* ul: Artificial Fonts. (line 64)
+* unformat: Diversions. (line 233)
+* vpt: Vertical Position Traps.
+ (line 13)
+* vs: Changing the Vertical Spacing.
+ (line 7)
+* warn: Debugging. (line 154)
+* warnscale: Debugging. (line 131)
+* wh: Page Location Traps. (line 11)
+* while: while. (line 10)
+* write: I/O. (line 219)
+* writec: I/O. (line 220)
+* writem: I/O. (line 231)
+
diff --git a/doc/groff.info-3 b/doc/groff.info-3
new file mode 100644
index 0000000..151c796
--- /dev/null
+++ b/doc/groff.info-3
Binary files differ
diff --git a/doc/groff.pdf b/doc/groff.pdf
new file mode 100644
index 0000000..84e8422
--- /dev/null
+++ b/doc/groff.pdf
Binary files differ
diff --git a/doc/groff.texi b/doc/groff.texi
new file mode 100644
index 0000000..2a6635e
--- /dev/null
+++ b/doc/groff.texi
@@ -0,0 +1,18927 @@
+\input texinfo
+
+@c
+@c Please convert this manual with `texi2dvi -e groff.texi' due to
+@c problems in texinfo regarding expansion of user-defined macros.
+@c
+@c You need texinfo 5.0 or newer to format this document!
+@c
+
+@c %**start of header (This is for running Texinfo on a region.)
+@setfilename groff.info
+@settitle The GNU Troff Manual
+@setchapternewpage odd
+@footnotestyle separate
+@c %**end of header (This is for running Texinfo on a region.)
+
+@documentlanguage en
+@documentencoding ISO-8859-1
+
+
+@smallbook
+
+@finalout
+
+
+@copying
+This manual documents GNU @code{troff} version 1.23.0.
+
+Copyright @copyright{} 1994--2023 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 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''.
+@end quotation
+@end copying
+
+
+@c We use the following indices:
+@c
+@c cindex: concepts
+@c rqindex: requests
+@c esindex: escape sequences
+@c vindex: registers
+@c kindex: commands in font files
+@c pindex: programs and files
+@c tindex: environment variables
+@c maindex: macros
+@c stindex: strings
+@c opindex: operators
+@c
+@c tindex and cindex are merged.
+
+@defcodeindex rq
+@defcodeindex es
+@defcodeindex ma
+@defcodeindex st
+@defcodeindex op
+@syncodeindex tp cp
+
+
+@c To avoid uppercasing in @deffn while converting to info, we define
+@c our special @Var{}.
+
+@macro Var{arg}
+@r{@slanted{\arg\}}
+@end macro
+
+
+@c To assure correct HTML translation, some ugly hacks are necessary.
+@c While processing a @def... request, the HTML translator looks at the
+@c next line to decide whether to start indentation, and if the line
+@c starts with @def... (e.g. @deffnx), indentation is started. We must
+@c therefore ensure that a @def... is seen, during macro expansion.
+@c
+@c The following macros have to be used:
+@c
+@c One item:
+@c
+@c @Def...
+@c
+@c Two items:
+@c
+@c @Def...List
+@c @Def...ListEnd
+@c
+@c More than two:
+@c
+@c @Def...List
+@c @Def...Item
+@c @Def...Item
+@c ...
+@c @Def...ListEnd
+@c
+@c The definition block must end with
+@c
+@c @endDef...
+@c
+@c The above is valid for texinfo 4.0f and above.
+@c
+@c By default, only the first item generates an index entry. To
+@c override this, use a variant with a trailing `x' (like
+@c `@DefmacItemx').
+
+
+@c a dummy macro to assure the `@def...'
+
+@macro defdummy
+@c
+@end macro
+
+
+@c definition of requests
+
+@macro Defreq{name, arg}
+@deffn Request @t{.\name\} \arg\
+@rqindex \name\
+@c
+@end macro
+
+@macro DefreqList{name, arg}
+@deffn Request @t{.\name\} \arg\
+@defdummy
+@rqindex \name\
+@c
+@end macro
+
+@macro DefreqItem{name, arg}
+@deffnx Request @t{.\name\} \arg\
+@defdummy
+@c
+@end macro
+
+@macro DefreqItemx{name, arg}
+@deffnx Request @t{.\name\} \arg\
+@defdummy
+@rqindex \name\
+@c
+@end macro
+
+@macro DefreqListEnd{name, arg}
+@deffnx Request @t{.\name\} \arg\
+@c
+@end macro
+
+@macro DefreqListEndx{name, arg}
+@deffnx Request @t{.\name\} \arg\
+@rqindex \name\
+@c
+@end macro
+
+@macro endDefreq
+@end deffn
+@end macro
+
+
+@c definition of escape sequences
+
+@macro Defesc{name, delimI, arg, delimII}
+@deffn Escape@tie{}sequence @t{\name\\delimI\}@Var{\arg\}@t{\delimII\}
+@esindex \name\
+@c
+@end macro
+
+@macro DefescList{name, delimI, arg, delimII}
+@deffn Escape@tie{}sequence @t{\name\\delimI\}@Var{\arg\}@t{\delimII\}
+@defdummy
+@esindex \name\
+@c
+@end macro
+
+@macro DefescItem{name, delimI, arg, delimII}
+@deffnx Escape@tie{}sequence @t{\name\\delimI\}@Var{\arg\}@t{\delimII\}
+@defdummy
+@c
+@end macro
+
+@macro DefescItemx{name, delimI, arg, delimII}
+@deffnx Escape@tie{}sequence @t{\name\\delimI\}@Var{\arg\}@t{\delimII\}
+@defdummy
+@esindex \name\
+@c
+@end macro
+
+@macro DefescListEnd{name, delimI, arg, delimII}
+@deffnx Escape@tie{}sequence @t{\name\\delimI\}@Var{\arg\}@t{\delimII\}
+@c
+@end macro
+
+@macro DefescListEndx{name, delimI, arg, delimII}
+@deffnx Escape@tie{}sequence @t{\name\\delimI\}@Var{\arg\}@t{\delimII\}
+@esindex \name\
+@c
+@end macro
+
+@macro endDefesc
+@end deffn
+@end macro
+
+
+@c definition of registers (built in to GNU troff)
+
+@macro Defreg{name}
+@deffn Register @t{\\n[\name\]}
+@vindex \name\
+@c
+@end macro
+
+@macro DefregList{name}
+@deffn Register @t{\\n[\name\]}
+@defdummy
+@vindex \name\
+@c
+@end macro
+
+@macro DefregItem{name}
+@deffnx Register @t{\\n[\name\]}
+@defdummy
+@c
+@end macro
+
+@macro DefregItemx{name}
+@deffnx Register @t{\\n[\name\]}
+@defdummy
+@vindex \name\
+@c
+@end macro
+
+@macro DefregListEnd{name}
+@deffnx Register @t{\\n[\name\]}
+@c
+@end macro
+
+@macro DefregListEndx{name}
+@deffnx Register @t{\\n[\name\]}
+@vindex \name\
+@c
+@end macro
+
+@macro endDefreg
+@end deffn
+@end macro
+
+
+@c string definitions (built in to GNU troff)
+
+@macro Defstr{name}
+@deffn String @t{\\*[\name\]}
+@stindex \name\
+@c
+@end macro
+
+@macro DefstrList{name}
+@deffn String @t{\\*[\name\]}
+@defdummy
+@stindex \name\
+@c
+@end macro
+
+@macro DefstrItem{name}
+@deffnx String @t{\\*[\name\]}
+@defdummy
+@c
+@end macro
+
+@macro DefstrItemx{name}
+@deffnx String @t{\\*[\name\]}
+@defdummy
+@stindex \name\
+@c
+@end macro
+
+@macro DefstrListEnd{name}
+@deffnx String @t{\\*[\name\]}
+@c
+@end macro
+
+@macro DefstrListEndx{name}
+@deffnx String @t{\\*[\name\]}
+@stindex \name\
+@c
+@end macro
+
+@macro endDefstr
+@end deffn
+@end macro
+
+
+@c register definitions specific to macro packages, preprocessors, ...
+
+@macro Defmpreg{name, package}
+@deffn Register @t{\\n[\name\]}
+@vindex \name\ @r{[}\package\@r{]}
+@c
+@end macro
+
+@macro DefmpregList{name, package}
+@deffn Register @t{\\n[\name\]}
+@defdummy
+@vindex \name\ @r{[}\package\@r{]}
+@c
+@end macro
+
+@macro DefmpregItem{name, package}
+@deffnx Register @t{\\n[\name\]}
+@defdummy
+@c
+@end macro
+
+@macro DefmpregItemx{name, package}
+@deffnx Register @t{\\n[\name\]}
+@defdummy
+@vindex \name\ @r{[}\package\@r{]}
+@c
+@end macro
+
+@macro DefmpregListEnd{name, package}
+@deffnx Register @t{\\n[\name\]}
+@c
+@end macro
+
+@macro DefmpregListEndx{name, package}
+@deffnx Register @t{\\n[\name\]}
+@vindex \name\ @r{[}\package\@r{]}
+@c
+@end macro
+
+@macro endDefmpreg
+@end deffn
+@end macro
+
+
+@c definition of macros
+
+@macro Defmac{name, arg, package}
+@defmac @t{.\name\} \arg\
+@maindex \name\ @r{[}\package\@r{]}
+@c
+@end macro
+
+@macro DefmacList{name, arg, package}
+@defmac @t{.\name\} \arg\
+@defdummy
+@maindex \name\ @r{[}\package\@r{]}
+@c
+@end macro
+
+@macro DefmacItem{name, arg, package}
+@defmacx @t{.\name\} \arg\
+@defdummy
+@c
+@end macro
+
+@macro DefmacItemx{name, arg, package}
+@defmacx @t{.\name\} \arg\
+@defdummy
+@maindex \name\ @r{[}\package\@r{]}
+@c
+@end macro
+
+@macro DefmacListEnd{name, arg, package}
+@defmacx @t{.\name\} \arg\
+@c
+@end macro
+
+@macro DefmacListEndx{name, arg, package}
+@defmacx @t{.\name\} \arg\
+@maindex \name\ @r{[}\package\@r{]}
+@c
+@end macro
+
+@macro endDefmac
+@end defmac
+@end macro
+
+
+@c string definitions specific to macro packages, preprocessors, ...
+
+@macro Defmpstr{name, package}
+@deffn String @t{\\*[\name\]}
+@stindex \name\ @r{[}\package\@r{]}
+@c
+@end macro
+
+@macro DefmpstrList{name, package}
+@deffn String @t{\\*[\name\]}
+@defdummy
+@stindex \name\ @r{[}\package\@r{]}
+@c
+@end macro
+
+@macro DefmpstrItem{name, package}
+@deffnx String @t{\\*[\name\]}
+@defdummy
+@c
+@end macro
+
+@macro DefmpstrItemx{name, package}
+@deffnx String @t{\\*[\name\]}
+@defdummy
+@stindex \name\ @r{[}\package\@r{]}
+@c
+@end macro
+
+@macro DefmpstrListEnd{name, package}
+@deffnx String @t{\\*[\name\]}
+@c
+@end macro
+
+@macro DefmpstrListEndx{name, package}
+@deffnx String @t{\\*[\name\]}
+@stindex \name\ @r{[}\package\@r{]}
+@c
+@end macro
+
+@macro endDefmpstr
+@end deffn
+@end macro
+
+
+@c our example macros
+
+@macro Example
+@example
+@group
+@end macro
+
+@macro endExample
+@end group
+@end example
+@end macro
+
+@macro CartoucheExample
+@cartouche
+@example
+@end macro
+
+@macro endCartoucheExample
+@end example
+@end cartouche
+@end macro
+
+
+@c Render text with angle brackets around it, as in <text>.
+
+@macro angles{text}
+@guilsinglleft{}@r{\text\}@guilsinglright{}
+@end macro
+
+
+@c Note: We say `Roman numerals' but `roman font'.
+
+
+@dircategory Typesetting
+@direntry
+* Groff: (groff). The GNU roff document formatting system.
+@end direntry
+
+
+@titlepage
+@title groff
+@subtitle The GNU implementation of @code{troff}
+@subtitle Edition 1.23.0
+@subtitle June 2023
+@author Trent@tie{}A.@: Fisher
+@author Werner Lemberg
+@author G.@tie{}Branden Robinson
+
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top, Introduction, (dir), (dir)
+@top GNU @code{troff}
+@end ifnottex
+
+@menu
+* Introduction::
+* Invoking groff::
+* Tutorial for Macro Users::
+* Major Macro Packages::
+* GNU troff Reference::
+* File Formats::
+* Copying This Manual::
+* Request Index::
+* Escape Sequence Index::
+* Operator Index::
+* Register Index::
+* Macro Index::
+* String Index::
+* File Keyword Index::
+* Program and File Index::
+* Concept Index::
+@end menu
+
+@ifnottex
+@insertcopying
+@end ifnottex
+
+
+
+@c =====================================================================
+@c =====================================================================
+
+@codequotebacktick on
+@codequoteundirected on
+
+@node Introduction, Invoking groff, Top, Top
+@chapter Introduction
+@cindex introduction
+
+GNU @code{roff} (or @code{groff}) is a programming system for
+typesetting documents. It is highly flexible and has been used
+extensively for over thirty years.
+
+@menu
+* Background::
+* What Is @code{groff}?::
+* @code{groff} Capabilities::
+* Macro Package Intro::
+* Preprocessor Intro::
+* Output Device Intro::
+* Conventions Used in This Manual::
+* Installation::
+* Credits::
+@end menu
+
+
+@c =====================================================================
+
+@node Background, What Is @code{groff}?, Introduction, Introduction
+@section Background
+@cindex background
+
+M.@: Douglas McIlroy, formerly of AT&T Bell Laboratories and present at
+the creation of the Unix operating system, offers an authoritative
+historical summary.
+
+@quotation
+The prime reason for Unix was the desire of Ken [Thompson], Dennis
+[Ritchie], and Joe Ossanna to have a pleasant environment for software
+development. The fig leaf that got the nod from @dots{}
+management was that an early use would be to develop a ``stand-alone''
+word-processing system for use in typing pools and secretarial offices.
+Perhaps they had in mind ``dedicated'', as distinct from
+``stand-alone''; that's what eventuated in various cases, most notably
+in the legal/patent department and in the AT&T CEO's office.
+
+Both those systems were targets of opportunity, not foreseen from the
+start. When Unix was up and running on the PDP-11, Joe got wind of
+the legal department having installed a commercial word processor.
+He went to pitch Unix as an alternative and clinched a trial by
+promising to make @code{roff} able to number lines by tomorrow in order
+to fulfill a patent-office requirement that the commercial system did
+not support.
+
+Modems were installed so legal-department secretaries could try the
+Research machine. They liked it and Joe's superb customer service.
+Soon the legal department got a system of their own. Joe went on to
+create @code{nroff} and @code{troff}. Document preparation became a
+widespread use of Unix, but no stand-alone word-processing system was
+ever undertaken.
+@end quotation
+@c https://minnie.tuhs.org/pipermail/tuhs/2022-March/025535.html
+
+A history relating @code{groff} to its predecessors @code{roff},
+@code{nroff}, and @code{troff} is available in the @cite{roff@r{(7)}}
+man page.
+
+
+@c =====================================================================
+
+@node What Is @code{groff}?, @code{groff} Capabilities, Introduction, Introduction
+@section What Is @code{groff}?
+@cindex what is @code{groff}?
+@cindex @code{groff}---what is it?
+
+@c BEGIN Keep parallel with groff(1), section "Description" (after the
+@c first sentence).
+@c This language is slightly expanded from that in the "ANNOUNCE" file
+@c and on the groff home page.
+@code{groff} (GNU @code{roff}) is a typesetting system that reads plain
+text input files that include formatting commands to produce output in
+PostScript, PDF, HTML, DVI, or other formats, or for display to a
+terminal. Formatting commands can be low-level typesetting primitives,
+macros from a supplied package, or user-defined macros. All three
+approaches can be combined.
+
+A reimplementation and extension of the typesetter from @acronym{AT&T}
+Unix, @code{groff} is present on most @acronym{POSIX} systems owing to
+its long association with Unix manuals (including man pages). It and
+its predecessor are notable for their production of several best-selling
+software engineering texts. @code{groff} is capable of producing
+typographically sophisticated documents while consuming minimal system
+resources.
+@c END Keep parallel with groff(1), section "Description" (after the
+@c first sentence).
+
+
+@c =====================================================================
+
+@node @code{groff} Capabilities, Macro Package Intro, What Is @code{groff}?, Introduction
+@section @code{groff} Capabilities
+@cindex @code{groff} capabilities
+@cindex capabilities of @code{groff}
+
+GNU @code{troff} is a typesetting document formatter; it provides a wide
+range of low-level text and page operations within the framework of a
+programming language. These operations compose to generate footnotes,
+tables of contents, mathematical equations, diagrams, multi-column text,
+and other elements of typeset works. Here is a survey of formatter
+features; all are under precise user control.
+
+@itemize @bullet
+@item
+text filling, breaking, alignment to the left or right margin; centering
+
+@item
+adjustment of inter-word space size to justify text, and of
+inter-sentence space size to suit local style conventions
+
+@item
+automatic and manual determination of hyphenation break points
+
+@item
+pagination
+
+@item
+selection of any font available to the output device
+
+@item
+adjustment of type size and vertical spacing (or ``leading'')
+
+@item
+configuration of line length and indentation amounts; columnation
+
+@item
+drawing of geometric primitives (lines, arcs, polygons, circles,
+@dots{})
+
+@item
+setup of stroke and fill colors (where supported by the output
+device)
+
+@item
+embedding of hyperlinks, images, document metadata, and other inclusions
+(where supported by the output device)
+@end itemize
+
+
+@c =====================================================================
+
+@node Macro Package Intro, Preprocessor Intro, @code{groff} Capabilities, Introduction
+@section Macro Packages
+@cindex macro package, introduction
+@cindex package, macro, introduction
+
+Elemental typesetting functions can be be challenging to use directly
+with complex documents. A @dfn{macro} facility specifies how certain
+routine operations, such as starting paragraphs, or printing headers and
+footers, should be performed in terms of those low-level instructions.
+Macros can be specific to one document or collected together into a
+@dfn{macro package} for use by many. Several macro packages available;
+the most widely used are provided with @code{groff}. They are
+@file{man}, @file{mdoc}, @file{me}, @file{mm}, @file{mom}, and
+@file{ms}.
+
+
+@c =====================================================================
+
+@node Preprocessor Intro, Output Device Intro, Macro Package Intro, Introduction
+@section Preprocessors
+@cindex preprocessors
+
+An alternative approach to complexity management, particularly when
+constructing tables, setting mathematics, or drawing diagrams, lies in
+preprocessing. A @dfn{preprocessor} employs a domian-specific language
+to ease the generation of tables, equations, and so forth in terms that
+are convenient for human entry. Each preprocessor reads a document and
+translates the parts of it that apply to it into GNU @code{troff} input.
+Command-line options to @command{groff} tell it which preprocessors to
+use.
+
+@code{groff} provides preprocessors for laying out tables
+(@command{gtbl}), typesetting equations (@command{geqn}), drawing
+diagrams (@command{gpic} and @command{ggrn}), inserting bibliographic
+references (@command{grefer}), and drawing chemical structures
+(@command{gchem}). An associated program that is useful when dealing
+with preprocessors is @command{gsoelim}.@footnote{The @samp{g} prefix is
+not used on all systems; see @ref{Invoking groff}.}
+
+@code{groff} also supports @code{grap}, a preprocessor for drawing
+graphs. A free implementation of it can be obtained separately.
+
+Unique to @code{groff} is the @code{preconv} preprocessor that enables
+@code{groff} to handle documents in a variety of input encodings.
+
+Other preprocessors exist, but no free implementations
+are known. An example is @command{ideal}, which draws diagrams using a
+mathematical constraint language.
+
+
+@c =====================================================================
+
+@node Output Device Intro, Installation, Preprocessor Intro, Introduction
+@section Output Devices
+@cindex postprocessors
+@cindex output devices
+@cindex devices for output
+
+GNU @code{troff}'s output is in a device-independent page description
+language, which is then read by an @dfn{output driver} that translates
+this language into a file format or byte stream that a piece of
+(possibly emulated) hardware understands. @code{groff} features output
+drivers for PostScript devices, terminal emulators (and other simple
+typewriter-like machines), X11 (for previewing), @TeX{} DVI, HP
+LaserJet@tie{}4/PCL5 and Canon LBP printers (which use @acronym{CaPSL}),
+@acronym{HTML}, @acronym{XHTML}, and @acronym{PDF}.
+
+
+@c =====================================================================
+
+@node Installation, Conventions Used in This Manual, Output Device Intro, Introduction
+@section Installation
+@cindex installation
+
+Locate installation instructions in the files @file{INSTALL},
+@file{INSTALL.extra}, and @file{INSTALL.REPO} in the @code{groff} source
+distribution. Being a GNU project, @code{groff} supports the familiar
+@samp{./configure && make} command sequence.
+
+
+@c =====================================================================
+
+@node Conventions Used in This Manual, Credits, Installation, Introduction
+@section Conventions Used in This Manual
+
+We apply the term ``groff'' to the language documented here, the GNU
+implementation of the overall system, the project that develops that
+system, and the command of that name. In the first sense, @code{groff}
+is an extended dialect of the @code{roff} language, for which many
+similar implementations exist.
+
+The @code{roff} language features several major categories for which
+many items are predefined. Presentations of these items feature the
+form in which the item is most commonly used on the left, and, aligned
+to the right margin, the name of the category in brackets.
+
+@deffn Register \n[example]
+The register @samp{example} is one that that @code{groff} @emph{doesn't}
+predefine. You can create it yourself, though; see @ref{Setting
+Registers}.
+@end deffn
+
+To make this document useful as a reference and not merely amiable
+bedtime reading, we tend to present these syntax items in exhaustive
+detail when they arise. References to topics discussed later in the
+text are frequent; skip material you don't understand yet.
+
+We use Texinfo's ``result'' (@result{}) and @error{} notations to
+present output written to the standard output and standard error
+streams, respectively. Diagnostic messages from the GNU @code{troff}
+formatter and other programs are examples of the latter, but the
+formatter can also be directed to write user-specified messages to the
+standard error stream. The notation then serves to identify the
+output stream and does not necessarily mean that an error has
+occurred.@footnote{Unix and related operating systems distinguish
+standard output and standard error streams @emph{because} of
+@code{troff}:@:
+@uref{https://minnie.tuhs.org/pipermail/tuhs/2013-December/006113.html}.}
+
+@Example
+$ echo "Twelve o'clock and" | groff -Tascii | sed '/^$/d'
+ @result{} Twelve o'clock and
+$ echo '.tm all is well.' | groff > /dev/null
+ @error{} all is well.
+@endExample
+
+Sometimes we use @result{} somewhat abstractly to represent formatted
+text that you will need to use a PostScript or PDF viewer program (or a
+printer) to observe. While arguably an abuse of notation, we think this
+preferable to requiring the reader to understand the syntax of these
+page description languages.
+
+We also present diagnostic messages in an abbreviated form, often
+omitting the name of the program issuing them, the input file name, and
+line number or other positional information when such data do not serve
+to illuminate the topic under discussion.
+
+Most examples are of @code{roff} language input that would be placed in
+a text file. Occasionally, we start an example with a @samp{$}
+character to indicate a shell prompt, as seen above.
+
+You are encouraged to try the examples yourself, and to alter them to
+better learn @code{groff}'s behavior. Our examples frequently need to
+direct the formatter to set a line length (with @samp{.ll}) that will
+fit within the page margins of this manual. We mention this so that you
+know why it is there before we discuss the @code{ll} request
+formally.@footnote{@xref{Line Layout}.}
+
+
+@c =====================================================================
+
+@node Credits, , Conventions Used in This Manual, Introduction
+@section Credits
+@cindex credits
+
+We adapted portions of this manual from existing documents. James
+Clark's man pages were an essential resource; we have updated them in
+parallel with the development of this manual. We based the tutorial for
+macro users on Eric Allman's introduction to his @file{me} macro package
+(which we also provide, little altered from 4.4BSD). Larry Kollar
+contributed much of the material on the @file{ms} macro package.
+
+
+@c =====================================================================
+@c =====================================================================
+
+@node Invoking groff, Tutorial for Macro Users, Introduction, Top
+@chapter Invoking @code{groff}
+@cindex invoking @code{groff}
+@cindex @code{groff} invocation
+
+This chapter focuses on how to invoke the @code{groff} front end. This
+front end takes care of the details of constructing the pipeline among
+the preprocessors, @code{gtroff} and the postprocessor.
+
+It has become a tradition that GNU programs get the prefix @samp{g} to
+distinguish them from their original counterparts provided by the host
+(@pxref{Environment}). Thus, for example, @code{geqn} is GNU
+@code{eqn}. On operating systems like GNU/Linux or the Hurd, which
+don't contain proprietary versions of @code{troff}, and on
+MS-DOS/MS-Windows, where @code{troff} and associated programs are not
+available at all, this prefix is omitted since GNU @code{troff} is the
+only incarnation of @code{troff} used. Exception: @samp{groff} is never
+replaced by @samp{roff}.
+
+In this document, we consequently say @samp{gtroff} when talking about
+the GNU @code{troff} program. @c XXX: Not for much longer... -- GBR
+All other implementations of @code{troff} are called @acronym{AT&T}
+@code{troff}, which is the common origin of almost all @code{troff}
+implementations@footnote{Besides @code{groff}, @code{neatroff} is an
+exception.} (with more or less compatible changes). Similarly, we say
+@samp{gpic}, @samp{geqn}, and so on.
+
+@menu
+* Groff Options::
+* Environment::
+* Macro Directories::
+* Font Directories::
+* Paper Format::
+* Invocation Examples::
+@end menu
+
+
+@c =====================================================================
+
+@node Groff Options, Environment, Invoking groff, Invoking groff
+@section Options
+@cindex options
+
+@pindex groff
+@pindex gtroff
+@pindex gpic
+@pindex geqn
+@pindex ggrn
+@pindex grap
+@pindex gtbl
+@pindex gchem
+@pindex grefer
+@pindex gsoelim
+@pindex preconv
+@code{groff} normally runs the @code{gtroff} program and a
+postprocessor appropriate for the selected device. The default device
+is @samp{ps} (but it can be changed when @code{groff} is configured and
+built). It can optionally preprocess with any of @code{gpic},
+@code{geqn}, @code{gtbl}, @code{ggrn}, @code{grap}, @code{gchem},
+@code{grefer}, @code{gsoelim}, or @code{preconv}.
+
+This section documents only options to the @code{groff} front end. Many
+of the arguments to @code{groff} are passed on to @code{gtroff};
+therefore, those are also included. Arguments to preprocessors and
+output drivers can be found in the man pages @cite{gpic@r{(1)}},
+@cite{geqn@r{(1)}}, @cite{gtbl@r{(1)}}, @cite{ggrn@r{(1)}},
+@cite{grefer@r{(1)}}, @cite{gchem@r{(1)}}, @cite{gsoelim@r{(1)}},
+@cite{preconv@r{(1)}}, @cite{grotty@r{(1)}}, @cite{grops@r{(1)}},
+@cite{gropdf@r{(1)}}, @cite{grohtml@r{(1)}}, @cite{grodvi@r{(1)}},
+@cite{grolj4@r{(1)}}, @cite{grolbp@r{(1)}}, and @cite{gxditview@r{(1)}}.
+
+The command-line format for @code{groff} is:
+
+@Example
+groff [ -abceghijklpstvzCEGNRSUVXZ ] [ -d@var{cs} ] [ -D@var{arg} ]
+ [ -f@var{fam} ] [ -F@var{dir} ] [ -I@var{dir} ] [ -K@var{arg} ]
+ [ -L@var{arg} ] [ -m@var{name} ] [ -M@var{dir} ] [ -n@var{num} ]
+ [ -o@var{list} ] [ -P@var{arg} ] [ -r@var{cn} ] [ -T@var{dev} ]
+ [ -w@var{name} ] [ -W@var{name} ] [ @var{files}@dots{} ]
+@endExample
+
+The command-line format for @code{gtroff} is as follows.
+
+@Example
+gtroff [ -abcivzCERU ] [ -d@var{cs} ] [ -f@var{fam} ] [ -F@var{dir} ]
+ [ -m@var{name} ] [ -M@var{dir} ] [ -n@var{num} ] [ -o@var{list} ]
+ [ -r@var{cn} ] [ -T@var{name} ] [ -w@var{name} ] [ -W@var{name} ]
+ [ @var{files}@dots{} ]
+@endExample
+
+@noindent
+Obviously, many of the options to @code{groff} are actually passed on to
+@code{gtroff}.
+
+Options without an argument can be grouped behind a
+single@tie{}@option{-}. A filename of@tie{}@file{-} denotes the
+standard input. Whitespace is permitted between an option and its
+argument.
+
+The @code{grog} command can be used to guess the correct @code{groff}
+command to format a file. See its man page @cite{grog@r{(1)}}; type
+@samp{man grog} at the command line to view it.
+
+@command{groff}'s command-line options are as follows.
+
+@cindex command-line options
+@table @samp
+@item -a
+@cindex plain text approximation output register (@code{.A})
+Generate a plain text approximation of the typeset output. The
+read-only register @code{.A} is set to@tie{}1. @xref{Built-in
+Registers}. This option produces a sort of abstract preview of the
+formatted output.
+
+@itemize @bullet
+@item
+Page breaks are marked by a phrase in angle brackets; for example,
+@samp{<beginning of page>}.
+
+@item
+Lines are broken where they would be in the formatted output.
+
+@item
+A horizontal motion of any size is represented as one space. Adjacent
+horizontal motions are not combined. Inter-sentence space nodes (those
+arising from the second argument to the @code{ss} request) are not
+represented.
+
+@item
+Vertical motions are not represented.
+
+@item
+Special characters are rendered in angle brackets; for example, the
+default soft hyphen character appears as @samp{<hy>}.
+@end itemize
+
+The above description should not be considered a specification; the
+details of @option{-a} output are subject to change.
+
+@item -b
+Write a backtrace reporting the state of @command{gtroff}'s input parser
+to the standard error stream with each diagnostic message. The line
+numbers given in the backtrace might not always be correct, because
+@command{gtroff}'s idea of line numbers can be confused by requests that
+append to
+@c XXX: strings or (??? strings never contain newlines)
+macros.
+
+@item -c
+Start with color output disabled.
+
+@item -C
+Enable AT&T @command{troff} compatibility mode; implies @option{-c}.
+@xref{Implementation Differences}, for the list of incompatibilities
+between @command{groff} and @acronym{AT&T} @command{troff}.
+
+@item -d@var{c}@var{text}
+@itemx -d@var{string}=@var{text}
+Define @code{roff} string @var{c} or @var{string} as@tie{}@var{t} or
+@var{text}. @var{c}@tie{}must be one character; @var{string} can be
+of arbitrary length. Such string assignments happen before any macro
+file is loaded, including the startup file. Due to @code{getopt_long}
+limitations, @var{c}@tie{}cannot be, and @var{string} cannot contain, an
+equals sign, even though that is a valid character in a @code{roff}
+identifier.
+
+@item -D@var{enc}
+Set fallback input encoding used by @command{preconv} to @var{enc};
+implies @option{-k}.
+
+@item -e
+Run @command{geqn} preprocessor.
+
+@item -E
+Inhibit @command{gtroff} error messages. This option does @emph{not}
+suppress messages sent to the standard error stream by documents or
+macro packages using @code{tm} or related requests.
+
+@item -f@var{fam}
+Use @var{fam} as the default font family. @xref{Font Families}.
+
+@item -F@var{dir}
+Search in directory @file{@var{dir}} for the selected output device's
+directory of device and font description files. See the description of
+@env{GROFF_FONT_PATH} in @ref{Environment} below for the default search
+locations and ordering.
+
+@item -g
+Run @command{ggrn} preprocessor.
+
+@item -G
+Run @command{grap} preprocessor; implies @option{-p}.
+
+@item -h
+Display a usage message and exit.
+
+@item -i
+Read the standard input after all the named input files have been
+processed.
+
+@item -I@var{dir}
+Search the directory @var{dir} for files named in several contexts;
+implies @option{-g} and @option{-s}.
+
+@itemize
+@item
+@command{gsoelim} replaces @code{so} requests with the contents of their
+file name arguments.
+
+@item
+@command{gtroff} searches for files named as operands in its command
+line and as arguments to @code{psbb}, @code{so}, and @code{soquiet}
+requests.
+
+@item
+Output drivers may search for files; for instance, @command{grops} looks
+for files named in @samp{\X'ps: import @r{@dots{}}'}, @samp{\X'ps: file
+@r{@dots{}}'}, and @samp{\X'pdf: pdfpic @r{@dots{}}'} device control
+escape sequences.
+@end itemize
+
+This option may be specified more than once; the directories are
+searched in the order specified. If you want to search the current
+directory before others, add @samp{-I .} at the desired place. The
+current working directory is otherwise searched last. @option{-I} works
+similarly to, and is named for, the ``include'' option of Unix C
+compilers.
+
+@option{-I} options are passed to @command{gsoelim}, @command{gtroff},
+and output drivers; with the flag letter changed to @option{-M}, they
+are also passed to @command{ggrn}.
+
+@item -j
+Run @command{gchem} preprocessor. Implies @option{-p}.
+
+@item -k
+Run @command{preconv} preprocessor. Refer to its man page for its
+behavior if neither of @command{groff}'s @option{-K} or @option{-D}
+options is also specified.
+
+@item -K@var{enc}
+Set input encoding used by @command{preconv} to @var{enc}; implies
+@option{-k}.
+
+@item -l
+Send the output to a spooler for printing. The @code{print} directive
+in the device description file specifies the default command to be used;
+see @ref{Device and Font Description Files}.
+@c XXX: This document is not parameterized in configuration variables.
+@c If no such directive is present for the output device,
+@c .ie '@PSPRINT@'' \{\
+@c this option is ignored.
+@c .\}
+@c .el \{\
+@c output is piped to
+@c .MR @PSPRINT@ 1 .
+@c .\}
+See options @option{-L} and @option{-X}.
+
+@item -L@var{arg}
+Pass @var{arg} to the print spooler program. If multiple @var{arg}s are
+required, pass each with a separate @option{-L} option. @command{groff}
+does not prefix an option dash to @var{arg} before passing it to the
+spooler program.
+
+@item -m@var{name}
+Process the file @file{@var{name}.tmac} prior to any input files.
+If not found, @file{tmac.@var{name}} is attempted. @var{name}
+(in both arrangements) is presumed to be a macro file; see the
+description of @env{GROFF_TMAC_PATH} in @ref{Environment} below for the
+default search locations and ordering. This option and its argument are
+also passed to @command{geqn}, @command{grap}, and @command{ggrn}.
+
+@item -M@var{dir}
+Search directory @file{@var{dir}} for macro files; see the description
+of @env{GROFF_TMAC_PATH} in @ref{Environment} below for the default
+search locations and ordering. This option and its argument are also
+passed to @command{geqn}, @command{grap}, and @command{ggrn}.
+
+@item -n@var{num}
+Number the first page @var{num}.
+
+@item -N
+Prohibit newlines between @code{eqn} delimiters:@: pass @option{-N} to
+@command{geqn}.
+
+@item -o@var{list}
+@cindex print current page register (@code{.P})
+Output only pages in @var{list}, which is a comma-separated list of page
+ranges; @samp{@var{n}} means page@tie{}@var{n}, @samp{@var{m}-@var{n}}
+means every page between @var{m} and@tie{}@var{n}, @samp{-@var{n}} means
+every page up to@tie{}@var{n}, @samp{@var{n}-} means every page from
+@var{n}@tie{}on. @command{gtroff} stops processing and exits after
+formatting the last page enumerated in @var{list}.
+
+@item -p
+Run @command{gpic} preprocessor.
+
+@item -P@var{arg}
+Pass @var{arg} to the postprocessor. If multiple @var{arg}s are
+required, pass each with a separate @option{-P} option. @command{groff}
+does not prefix an option dash to @var{arg} before passing it to the
+postprocessor.
+
+@item -r@var{c}@var{numeric-expression}
+@itemx -r@var{register}=@var{expr}
+Set @code{roff} register@tie{}@var{c} or @var{register} to the value
+@var{numeric-expression} (@pxref{Numeric Expressions}).
+@var{c}@tie{}must be one character; @var{register} can be of arbitrary
+length. Such register assignments happen before any macro file is
+loaded, including the startup file. Due to @code{getopt_long}
+limitations, @var{c}@tie{}cannot be, and @var{register} cannot contain,
+an equals sign, even though that is a valid character in a @code{roff}
+identifier.
+
+@item -R
+Run @command{grefer} preprocessor. No mechanism is provided for passing
+arguments to @command{grefer} because most @command{grefer} options have
+equivalent language elements that can be specified within the document.
+
+@pindex troffrc
+@pindex troffrc-end
+@command{gtroff} also accepts a @option{-R} option, which is not
+accessible via @command{groff}. This option prevents the loading of the
+@file{troffrc} and @file{troffrc-end} files.
+
+@item -s
+Run @command{gsoelim} preprocessor.
+
+@item -S
+@cindex @code{open} request, and safer mode
+@cindex @code{opena} request, and safer mode
+@cindex @code{pso} request, and safer mode
+@cindex @code{sy} request, and safer mode
+@cindex @code{pi} request, and safer mode
+@cindex safer mode
+@cindex mode, safer
+Operate in ``safer'' mode; see @option{-U} below for its opposite. For
+security reasons, safer mode is enabled by default.
+
+@item -t
+Run @command{gtbl} preprocessor.
+
+@item -T@var{dev}
+Direct @command{gtroff} to format the input for the output device
+@var{dev}. @command{groff} then calls an output driver to convert
+@command{gtroff}'s output to a form appropriate for @var{dev}. The
+following output devices are available.
+
+@table @code
+@item ps
+For PostScript printers and previewers.
+
+@item pdf
+For @acronym{PDF} viewers or printers.
+
+@item dvi
+For @TeX{} DVI format.
+
+@item X75
+For a 75@dmn{dpi} X11 previewer.
+
+@item X75-12
+For a 75@dmn{dpi} X11 previewer with a 12-point base font in the
+document.
+
+@item X100
+For a 100@dmn{dpi} X11 previewer.
+
+@item X100-12
+For a 100@dmn{dpi} X11 previewer with a 12-point base font in the
+document.
+
+@item ascii
+@cindex encoding, output, @acronym{ASCII}
+@cindex encoding, output, ISO@tie{}646
+@cindex @acronym{ASCII} output encoding
+@cindex ISO@tie{}646 output encoding
+@cindex output encoding, @acronym{ASCII}
+@cindex output encoding, ISO@tie{}646
+For typewriter-like devices using the (7-bit) @acronym{ASCII}
+(ISO@tie{}646) character set.
+
+@item latin1
+@cindex encoding, output, @w{Latin-1} (ISO @w{8859-1})
+@cindex @w{Latin-1} (ISO @w{8859-1}) output encoding
+@cindex ISO @w{8859-1} (@w{Latin-1}) output encoding
+@cindex output encoding, @w{Latin-1} (ISO @w{8859-1})
+For typewriter-like devices that support the @w{Latin-1}
+(ISO@tie{}@w{8859-1}) character set.
+
+@item utf8
+@cindex encoding, output, @w{UTF-8}
+@cindex @w{UTF-8} output encoding
+@cindex output encoding, @w{UTF-8}
+For typewriter-like devices that use the Unicode (ISO@tie{}10646)
+character set with @w{UTF-8} encoding.
+
+@item cp1047
+@cindex encoding, output, @acronym{EBCDIC}
+@cindex @acronym{EBCDIC} output encoding
+@cindex output encoding, @acronym{EBCDIC}
+@cindex encoding, output, code page 1047
+@cindex code page 1047 output encoding
+@cindex output encoding, code page 1047
+@cindex IBM code page 1047 output encoding
+@cindex CCSID 1047 output encoding (EBCDIC)
+For typewriter-like devices that use the @acronym{EBCDIC} encoding IBM
+code page 1047.
+
+@item lj4
+For HP LaserJet4-compatible (or other PCL5-compatible) printers.
+
+@item lbp
+For Canon @acronym{CaPSL} printers (@w{LBP-4} and @w{LBP-8} series laser
+printers).
+
+@pindex pre-grohtml
+@pindex post-grohtml
+@cindex @code{grohtml}, the program
+@item html
+@itemx xhtml
+To produce @acronym{HTML} and @acronym{XHTML} output, respectively.
+This driver consists of two parts, a preprocessor
+(@command{pre-grohtml}) and a postprocessor (@command{post-grohtml}).
+@end table
+
+@cindex output device name string (@code{.T})
+@cindex output device usage register (@code{.T})
+The predefined GNU @code{troff} string @code{.T} contains the name of
+the output device; the read-only register @code{.T} is set to@tie{}1 if
+this option is used (which is always true if @command{groff} is used to
+call GNU @command{troff}). @xref{Built-in Registers}.
+
+The postprocessor to be used for a device is specified by the
+@code{postpro} command in the device description file. (@xref{Device
+and Font Description Files}.) This can be overridden with the
+@option{-X} option.
+
+@item -U
+@cindex mode, unsafe
+@cindex unsafe mode
+Operate in @dfn{unsafe mode}, which enables the @code{open},
+@code{opena}, @code{pi}, @code{pso}, and @code{sy} requests. These
+requests are disabled by default because they allow an untrusted input
+document to write to arbitrary file names and run arbitrary commands.
+This option also adds the current directory to the macro package search
+path; see the @option{-m} option above. @option{-U} is passed to
+@command{gpic} and @command{gtroff}.
+
+@item -v
+Write version information for @command{groff} and all programs run by it
+to the standard output stream; that is, the given command line is
+processed in the usual way, passing @option{-v} to the formatter and any
+pre- or postprocessors invoked.
+
+@item -V
+Output the pipeline that would be run by @command{groff}
+(as a wrapper program) to the standard output stream, but do not execute
+it. If given more than once, the pipeline is both written to the
+standard error stream and run.
+
+@item -w@var{category}
+Enable warnings in @var{category}. Categories are listed in
+@ref{Warnings}.
+
+@item -W@var{category}
+Inhibit warnings in @var{category}. Categories are listed in
+@ref{Warnings}.
+
+@item -X
+Use @command{gxditview} instead of the usual postprocessor to (pre)view
+a document on an X11 display. Combining this option with
+@option{-Tps} uses the font metrics of the PostScript device, whereas
+the @option{-TX75} and @option{-TX100} options use the metrics of X11
+fonts.
+
+@item -z
+Suppress formatted output from @command{gtroff}.
+
+@item -Z
+Disable postprocessing. @command{gtroff} output will appear on the
+standard output stream (unless suppressed with @option{-z}; see
+@ref{gtroff Output} for a description of this format.
+@end table
+
+
+@c =====================================================================
+
+@node Environment, Macro Directories, Groff Options, Invoking groff
+@section Environment
+@cindex environment variables
+@cindex variables in environment
+
+There are also several environment variables (of the operating system,
+not within @code{gtroff}) that can modify the behavior of @code{groff}.
+
+@table @code
+@item GROFF_BIN_PATH
+@tindex GROFF_BIN_PATH@r{, environment variable}
+This search path, followed by @code{PATH}, is used for commands executed
+by @code{groff}.
+
+@item GROFF_COMMAND_PREFIX
+@tindex GROFF_COMMAND_PREFIX@r{, environment variable}
+@cindex command prefix
+@cindex prefix, for commands
+If this is set to@tie{}@var{X}, then @command{groff} runs
+@command{@var{X}troff} instead of @command{gtroff}. This also applies
+to @command{tbl}, @command{pic}, @command{eqn}, @command{grn},
+@command{chem}, @command{refer}, and @command{soelim}. It does not
+apply to @command{grops}, @command{grodvi}, @command{grotty},
+@command{pre-grohtml}, @command{post-grohtml}, @command{preconv},
+@command{grolj4}, @command{gropdf}, and @command{gxditview}.
+
+The default command prefix is determined during the installation
+process. If a non-GNU @code{troff} system is found, prefix @samp{g} is
+used, none otherwise.
+
+@item GROFF_ENCODING
+@tindex GROFF_ENCODING@r{, environment variable}
+The value of this variable is passed to the @code{preconv}
+preprocessor's @option{-e} option to select the character encoding of
+input files. This variable's existence implies the @code{groff} option
+@option{-k}. If set but empty, @code{groff} calls @code{preconv}
+without an @option{-e} option. @code{groff}'s @option{-K} option
+overrides @env{GROFF_ENCODING}. See the @cite{preconv@r{(7)}} man page;
+type @samp{man preconv} at the command line to view it.
+
+@item GROFF_FONT_PATH
+@tindex GROFF_FONT_PATH@r{, environment variable}
+A list of directories in which to seek the selected output device's
+directory of device and font description files. GNU @code{troff}
+will search directories given as arguments to any specified @option{-F}
+options before these, and a built-in list of directories after them.
+@xref{Font Directories} and the @cite{troff@r{(1)}} or
+@cite{gtroff@r{(1)}} man pages.
+
+@item GROFF_TMAC_PATH
+@tindex GROFF_TMAC_PATH@r{, environment variable}
+A list of directories in which to seek macro files. GNU @code{troff}
+will search directories given as arguments to any specified @option{-M}
+options before these, and a built-in list of directories after them.
+@xref{Macro Directories} and the @cite{troff@r{(1)}} or
+@cite{gtroff@r{(1)}} man pages.
+
+@item GROFF_TMPDIR
+@tindex GROFF_TMPDIR@r{, environment variable}
+@tindex TMPDIR@r{, environment variable}
+The directory in which @code{groff} creates temporary files. If this is
+not set and @env{TMPDIR} is set, temporary files are created in that
+directory. Otherwise temporary files are created in a system-dependent
+default directory (on Unix and GNU/Linux systems, this is usually
+@file{/tmp}). @code{grops}, @code{grefer}, @code{pre-grohtml}, and
+@code{post-grohtml} can create temporary files in this directory.
+
+@item GROFF_TYPESETTER
+@tindex GROFF_TYPESETTER@r{, environment variable}
+Sets the default output device. If empty or not set, a build-time
+default (often @code{ps}) is used. The @option{-T@var{dev}} option
+overrides @env{GROFF_TYPESETTER}.
+
+@item SOURCE_DATE_EPOCH
+@tindex SOURCE_DATE_EPOCH@r{, environment variable}
+A timestamp (expressed as seconds since the Unix epoch) to use as the
+output creation timestamp in place of the current time. The time is
+converted to human-readable form using @cite{localtime@r{(3)}} when the
+formatter starts up and stored in registers usable by documents and
+macro packages (@pxref{Built-in Registers}).
+
+@item TZ
+@tindex TZ@r{, environment variable}
+The time zone to use when converting the current time (or value of
+@env{SOURCE_DATE_EPOCH}) to human-readable form; see
+@cite{tzset@r{(3)}}.
+@end table
+
+MS-DOS and MS-Windows ports of @code{groff} use semicolons, rather than
+colons, to separate the directories in the lists described above.
+
+
+@c =====================================================================
+
+@node Macro Directories, Font Directories, Environment, Invoking groff
+@section Macro Directories
+@cindex macro directories
+@cindex directories for macros
+@cindex searching macros
+@cindex macros, searching
+
+A macro file must have a name in the form @code{@var{name}.tmac} or
+@code{tmac.@var{name}} and be placed in a @dfn{tmac directory} to be
+found by the @option{-m@var{name}} command-line option.@footnote{The
+@code{mso} request does not have these limitations. @xref{I/O}.}
+@cindex tmac, directory
+@cindex directory, for tmac files
+@cindex tmac, path
+@cindex path, for tmac files
+@cindex locating macro files
+@cindex macro file search path
+@cindex file, macro, search path
+@cindex locating macro packages
+@cindex macro package search path
+@cindex package, macro, search path
+Together, these directories constitute the @dfn{tmac path}. Each
+directory is searched in the following order until the desired macro
+file is found or the list is exhausted.
+
+@itemize @bullet
+@item
+Directories specified with GNU @code{troff}'s or @code{groff}'s
+@option{-M} command-line option.
+
+@item
+@tindex GROFF_TMAC_PATH@r{, environment variable}
+Directories listed in the @env{GROFF_TMAC_PATH} environment variable.
+
+@item
+@cindex safer mode
+@cindex mode, safer
+@cindex unsafe mode
+@cindex mode, unsafe
+@cindex current directory
+@cindex directory, current
+The current working directory (only if in unsafe mode using the
+@option{-U} command-line option).
+
+@item
+@cindex home directory
+@cindex directory, home
+The user's home directory, @env{HOME}.
+
+@item
+@cindex site-local directory
+@cindex directory, site-local
+@cindex platform-specific directory
+@cindex directory, platform-specific
+A platform-dependent directory, a site-local (platform-independent)
+directory, and the main @slanted{tmac} directory. The locations
+corresponding to your installation are listed in section ``Environment''
+of @cite{gtroff@r{(1)}}. If not otherwise configured, they are as
+follows.
+
+@Example
+/usr/local/lib/groff/site-tmac
+/usr/local/share/groff/site-tmac
+/usr/local/share/groff/1.23.0/tmac
+@endExample
+
+@noindent
+The foregoing assumes that the version of @code{groff} is 1.23.0, and
+that the installation prefix was @file{/usr/local}. It is possible to
+fine-tune these locations during the source configuration process.
+@end itemize
+
+
+@c =====================================================================
+
+@node Font Directories, Paper Format, Macro Directories, Invoking groff
+@section Font Directories
+@cindex font directories
+@cindex directories for fonts
+@cindex searching fonts
+@cindex fonts, searching
+
+@code{groff} enforces few restrictions on how font description files are
+named. For its family/style mechanism to work (@pxref{Font Families}),
+the names of fonts within a family should start with the family name,
+followed by the style. For example, the Times family uses @samp{T} for
+the family name and @samp{R}, @samp{B}, @samp{I}, and @samp{BI} to
+indicate the styles `roman', `bold', `italic', and `bold italic',
+respectively. Thus the final font names are @samp{TR}, @samp{TB},
+@samp{TI}, and @samp{TBI}.
+
+@cindex font path
+@cindex path, for font files
+Font description files are kept in @dfn{font directories}, which
+together constitute the @dfn{font path}. The search procedure
+always appends the directory @code{dev}@var{name}, where @var{name} is
+the name of the output device. Assuming @TeX{} DVI output, and
+@file{/foo/bar} as a font directory, the font description files for
+@command{grodvi} must be in @file{/foo/bar/devdvi}.
+Each directory in the font path is searched in the following order until
+the desired font description file is found or the list is exhausted.
+
+@itemize @bullet
+@item
+Directories specified with GNU @code{troff}'s or @code{groff}'s
+@option{-f} command-line option. All output drivers (and some
+preprocessors) support this option as well, because they require
+information about the glyphs to be rendered in the document.
+
+@item
+@tindex GROFF_FONT_PATH@r{, environment variable}
+Directories listed in the @env{GROFF_FONT_PATH} environment variable.
+
+@item
+@cindex site-local directory
+@cindex directory, site-local
+A site-local directory and the main font description directory.
+The locations corresponding to your installation are listed in section
+``Environment'' of @cite{gtroff@r{(1)}}. If not otherwise configured,
+they are as follows.
+
+@Example
+/usr/local/share/groff/site-font
+/usr/local/share/groff/1.23.0/font
+@endExample
+
+@noindent
+The foregoing assumes that the version of @code{groff} is 1.23.0, and
+that the installation prefix was @file{/usr/local}. It is possible to
+fine-tune these locations during the source configuration process.
+@end itemize
+
+
+@c =====================================================================
+
+@node Paper Format, Invocation Examples, Font Directories, Invoking groff
+@section Paper Format
+@cindex paper format
+@cindex format, paper
+@cindex paper size
+@cindex size, paper
+@cindex landscape page orientation
+@cindex orientation, landscape
+@cindex page orientation, landscape
+
+In @code{groff}, the page dimensions for the formatter GNU @code{troff}
+and for output devices are handled separately. @xref{Page Layout}, for
+vertical manipulation of the page size, and @xref{Line Layout}, for
+horizontal changes.
+@pindex papersize.tmac
+@pindex troffrc
+The @file{papersize} macro package, normally loaded by @file{troffrc} at
+startup, provides an interface for configuring page dimensions by
+convenient names, like @samp{letter} or @samp{a4}; see
+@cite{groff_tmac@r{(5)}}. The default used by the formatter depends on
+its build configuration, but is usually one of the foregoing, as
+geographically appropriate.
+@c groff(1), being generated, says what the default is.
+
+It is up to each macro package to respect the page dimensions configured
+in this way.
+
+For each output device, the size of the output medium can be set in its
+@file{DESC} file. Most output drivers also recognize a command-line
+option @option{-p} to override the default dimensions and an option
+@option{-l} to use landscape orientation. @xref{DESC File Format}, for
+a description of the @code{papersize} keyword, which takes an argument
+of the same form as @option{-p}. The output driver's man page, such as
+@cite{grops@r{(1)}}, may also be helpful.
+
+@code{groff} uses the command-line option @option{-P} to pass options to
+postprocessors; for example, use the following for PostScript output on
+A4 paper in landscape orientation.
+
+@Example
+groff -Tps -dpaper=a4l -P-pa4 -P-l -ms foo.ms > foo.ps
+@endExample
+
+
+@c =====================================================================
+
+@c BEGIN Keep parallel with groff(1), section "Examples".
+@node Invocation Examples, , Paper Format, Invoking groff
+@section Invocation Examples
+@cindex invocation examples
+@cindex examples of invocation
+
+@code{roff} systems are best known for formatting man pages. Once a
+@command{man} librarian program has located a man page, it may execute
+a @code{groff} command much like the following.
+
+@Example
+groff -t -man -Tutf8 /usr/share/man/man1/groff.1
+@endExample
+
+The librarian will also pipe the output through a pager, which might not
+interpret the SGR terminal escape sequences @command{groff} emits for
+boldface, underlining, or italics; see the @cite{grotty@r{(1)}} man page
+for a discussion.
+
+To process a @code{roff} input file using the preprocessors
+@command{gtbl} and @command{gpic} and the @file{me} macro package in the
+way to which AT&T @code{troff} users were accustomed, one would type (or
+script) a pipeline.
+
+@Example
+gpic foo.me | gtbl | gtroff -me -Tutf8 | grotty
+@endExample
+
+Using @command{groff}, this pipe can be shortened to an equivalent
+command.
+
+@Example
+groff -p -t -me -T utf8 foo.me
+@endExample
+
+An even easier way to do this is to use @command{grog} to guess the
+preprocessor and macro options and execute the result by using the
+command substitution feature of the shell.
+
+@Example
+$(grog -Tutf8 foo.me)
+@endExample
+
+Each command-line option to a postprocessor must be specified with any
+required leading dashes @samp{-}
+@c No GNU roff postprocessor uses long options for anything except
+@c --help or --version.
+@c or @samp{--}
+@c XXX: grolbp does.
+because @command{groff} passes the arguments as-is to the postprocessor;
+this permits arbitrary arguments to be transmitted. For example, to
+pass a title to the @command{gxditview} postprocessor,
+the shell commands
+
+@Example
+groff -X -P -title -P 'trial run' mydoc.t
+@endExample
+
+@noindent
+and
+
+@Example
+groff -X -Z mydoc.t | gxditview -title 'trial run' -
+@endExample
+
+@noindent
+are equivalent.
+@c END Keep parallel with groff(1), section "Examples".
+
+
+
+@c =====================================================================
+@c =====================================================================
+
+@node Tutorial for Macro Users, Major Macro Packages, Invoking groff, Top
+@chapter Tutorial for Macro Users
+@cindex tutorial for macro users
+@cindex macros, tutorial for users
+@cindex user's tutorial for macros
+@cindex user's macro tutorial
+
+Most users of the @code{roff} language employ a macro package to format
+their documents. Successful macro packages ease the composition
+process; their users need not have mastered the full formatting
+language, nor understand features like diversions, traps, and
+environments. This chapter aims to familiarize you with basic concepts
+and mechanisms common to many macro packages (like ``displays''). If
+you prefer a meticulous and comprehensive presentation, try @ref{GNU
+troff Reference} instead.
+
+@menu
+* Basics::
+* Common Features::
+@end menu
+
+
+@c =====================================================================
+
+@node Basics, Common Features, Tutorial for Macro Users, Tutorial for Macro Users
+@section Basics
+@cindex basics of macro package usage
+@cindex macro package usage, basics of
+
+Let us first survey some basic concepts necessary to use a macro package
+fruitfully.@footnote{The remainder of this chapter is based on
+@cite{Writing Papers with nroff using -me} by Eric@tie{}P.@: Allman,
+which is distributed with @code{groff} as @file{meintro.me}.}
+References are made throughout to more detailed information.
+
+GNU @code{troff} reads an input file prepared by the user and outputs a
+formatted document suitable for publication or framing. The input
+consists of text, or words to be printed, and embedded commands
+(@slanted{requests} and @slanted{escape sequences}), which tell GNU
+@code{troff} how to format the output. @xref{Formatter Instructions}.
+
+The word @slanted{argument} is used in this chapter to mean a word or
+number that appears on the same line as a request, and which modifies
+the meaning of that request. For example, the request
+
+@Example
+.sp
+@endExample
+
+@noindent
+spaces one line, but
+
+@Example
+.sp 4
+@endExample
+
+@noindent
+spaces four lines. The number@tie{}4 is an argument to the @code{sp}
+request, which says to space four lines instead of one. Arguments are
+separated from the request and from each other by spaces (@emph{not}
+tabs). @xref{Invoking Requests}.
+
+The primary function of GNU @code{troff} is to collect words from input
+lines, fill output lines with those words, adjust the line to the
+right-hand margin by widening spaces, and output the result. For
+example, the input:
+
+@Example
+Now is the time
+for all good men
+to come to the aid
+of their party.
+Four score and seven
+years ago, etc.
+@endExample
+
+@noindent
+is read, packed onto output lines, and justified to produce:
+
+@Example
+ @result{} Now is the time for all good men to come to the aid of
+ @result{} their party. Four score and seven years ago, etc.
+@endExample
+
+Sometimes a new output line should be started even though the current
+line is not yet full---for example, at the end of a paragraph. To do
+this it is possible to force a @slanted{break}, starting a new output
+line. Some requests cause a break automatically, as do (normally) blank
+input lines and input lines beginning with a space or tab.
+
+Not all input lines are @slanted{text lines}---words to be formatted.
+Some are @slanted{control lines} that tell a macro package (or GNU
+@code{troff} directly) how to format the text. Control lines start with
+a dot (@samp{.}) or an apostrophe (@samp{'}) as the first character, and
+can be followed by a @slanted{macro call}.
+
+The formatter also does more complex things, such as automatically
+numbering pages, skipping over page boundaries, putting footnotes in the
+correct place, and so forth.
+
+Here are a few hints for preparing text for input to GNU @code{troff}.
+
+@itemize @bullet
+@item
+First, keep the input lines short. Short input lines are easier to
+edit, and GNU @code{troff} packs words onto longer lines anyhow.
+
+@item
+In keeping with this, it is helpful to begin a new line after every
+comma or phrase, since common corrections are to add or delete sentences
+or phrases.
+
+@item
+End each sentence with two spaces---or better, start each sentence on a
+new line. GNU @code{troff} recognizes characters that usually end a
+sentence, and inserts inter-sentence space accordingly.
+
+@item
+Do not hyphenate words at the end of lines---GNU @code{troff} is smart
+enough to hyphenate words as needed, but is not smart enough to take
+hyphens out and join a word back together. Also, words such as
+``mother-in-law'' should not be broken over a line, since then a space
+can occur where not wanted, such as ``@w{mother- in}-law''.
+@end itemize
+
+We offer further advice in @ref{Input Conventions}.
+
+@cindex vertical spacing (introduction)
+@cindex spacing, vertical (introduction)
+GNU @code{troff} permits alteration of the distance between lines of
+text. This is termed @slanted{vertical spacing} and is expressed in the
+same units as the type size---the point. The default is 10-point type
+on 12-point spacing. To get @slanted{double-spaced} text you would set
+the vertical spacing to 24 points. Some, but not all, macro packages
+expose a macro or register to configure the vertical spacing.
+
+A number of requests allow you to change the way the output is arranged
+on the page, sometimes called the @slanted{layout} of the output page.
+Most macro packages don't supply macros for performing these (at least
+not without performing other actions besides), as they are such basic
+operations. The macro packages for writing man pages, @file{man} and
+@file{mdoc}, don't encourage explicit use of these requests at all.
+
+@cindex spacing (introduction)
+The request @w{@samp{.sp @var{N}}} leaves @var{N}@tie{}lines of blank
+space. @var{N}@tie{}can be omitted (skipping a single line) or can
+be of the form @var{N}i (for @var{N}@tie{}inches) or @var{N}c (for
+@var{N}@tie{}centimeters). For example, the input:
+
+@Example
+.sp 1.5i
+My thoughts on the subject
+.sp
+@endExample
+
+@noindent
+leaves one and a half inches of space, followed by the line ``My
+thoughts on the subject'', followed by a single blank line (more
+measurement units are available; see @ref{Measurements}).
+
+If you seek precision in spacing, be advised when using a macro package
+that it might not honor @code{sp} requests as you expect; it can use a
+formatter feature called @slanted{no-space mode} to prevent excess space
+from accumulating. Macro packages typically offer registers to control
+spacing between paragraphs, before section headings, and around displays
+(discussed below); use these facilities preferentially.
+@xref{Manipulating Spacing}.
+
+@cindex centering lines (introduction)
+@cindex lines, centering (introduction)
+Text lines can be centered by using the @code{ce} request. The line
+after @code{ce} is centered (horizontally) on the page. To center more
+than one line, use @w{@samp{.ce @var{N}}} (where @var{N} is the number
+of lines to center), followed by the @var{N}@tie{}lines. To center many
+lines without counting them, type:
+
+@Example
+.ce 1000
+lines to center
+.ce 0
+@endExample
+
+@noindent
+The @w{@samp{.ce 0}} request tells GNU @code{troff} to center zero more
+lines, in other words, stop centering.
+
+@cindex right-aligning lines (introduction)
+@cindex lines, right-aligning (introduction)
+@cindex right-justifying lines (introduction)
+@cindex lines, right-justifying (introduction)
+GNU @code{troff} also offers the @code{rj} request for right-aligning
+text. It works analogously to @code{ce} and is convenient for setting
+epigraphs.
+
+@cindex page break (introduction)
+@cindex break, page (introduction)
+The @code{bp} request starts a new page; this necessarily implies an
+ordinary (line) break.
+
+@cindex break (introduction)
+@cindex line break (introduction)
+All of these requests cause a break; that is, they always start a new
+line. To start a new line without performing any other action, use
+@code{br}. If you invoke them with the apostrophe @samp{'}, the
+@slanted{no-break control character}, the (initial) break they normally
+perform is suppressed. @samp{'br} does nothing.
+
+
+@c =====================================================================
+
+@node Common Features, , Basics, Tutorial for Macro Users
+@section Common Features
+@cindex common features
+@cindex features, common
+
+GNU @code{troff} provides low-level operations for formatting a
+document. Many routine operations are undertaken in nearly all
+documents that require a series of such primitive operations to be
+performed. These common tasks are grouped into @slanted{macros}, which
+are then collected into a @slanted{macro package}.
+
+Macro packages come in two varieties:@: ``major'' or ``full-service''
+ones that manage page layout, and ``minor'' or ``auxiliary'' ones that
+do not, instead fulfilling narrow, specific tasks. Find a list in the
+@cite{groff_tmac@r{(5)}} man page. Type @samp{man groff_tmac} at the
+command line to view it.
+
+We survey several capabilities of full-service macro package below.
+Each package employs its own macros to exercise them. For details,
+consult its man page or, for @file{ms}, see @ref{ms}.
+
+@menu
+* Paragraphs::
+* Sections and Chapters::
+* Headers and Footers::
+* Page Layout Adjustment::
+* Displays and Keeps::
+* Footnotes and Endnotes::
+* Table of Contents::
+* Indexing::
+* Document Formats::
+* Columnation::
+* Font and Size Changes::
+* Predefined Text::
+* Preprocessor Support::
+* Configuration and Customization::
+@end menu
+
+@c ---------------------------------------------------------------------
+
+@node Paragraphs, Sections and Chapters, Common Features, Common Features
+@subsection Paragraphs
+@cindex paragraphs
+
+Paragraphs can be separated and indented in various ways. Some start
+with a blank line and have a first-line indentation, like most of the
+ones in this manual. Block paragraphs omit the indentation.
+
+@Example
+ @result{} Some men look at constitutions with sanctimonious
+ @result{} reverence, and deem them like the ark of the
+ @result{} covenant, too sacred to be touched.
+@endExample
+
+@cindex tags, paragraph
+@cindex tagged paragraphs
+@cindex lists
+@noindent
+We also frequently encounter @slanted{tagged} paragraphs, which begin
+with a tag or label at the left margin and indent the remaining text.
+
+@Example
+ @result{} one This is the first paragraph. Notice how the
+ @result{} first line of the resulting paragraph lines
+ @result{} up with the other lines in the paragraph.
+@endExample
+
+@noindent
+If the tag is too wide for the indentation, the line is broken.
+
+@Example
+ @result{} longlabel
+ @result{} The label does not align with the subsequent
+ @result{} lines, but they align with each other.
+@endExample
+
+@noindent
+A variation of the tagged paragraph is the itemized or enumerated
+paragraph, which might use punctuation or a digit for a tag,
+respectively. These are frequently used to construct lists.
+
+@Example
+ @result{} o This list item starts with a bullet. When
+ @result{} producing output for a device using the ASCII
+ @result{} character set, an 'o' is formatted instead.
+@endExample
+
+@noindent
+Often, use of the same macro without a tag continues such a discussion.
+
+@Example
+ @result{} -xyz This option is recognized but ignored.
+ @result{}
+ @result{} It had a security hole that we don't discuss.
+@endExample
+
+@c ---------------------------------------------------------------------
+
+@node Sections and Chapters, Headers and Footers, Paragraphs, Common Features
+@subsection Sections and Chapters
+
+The simplest kind of section heading is unnumbered, set in a bold or
+italic style, and occupies a line by itself. Others possess
+automatically numbered multi-level headings and/or different typeface
+styles or sizes at different levels. More sophisticated macro packages
+supply macros for designating chapters and appendices.
+
+@c ---------------------------------------------------------------------
+
+@node Headers and Footers, Page Layout Adjustment, Sections and Chapters, Common Features
+@subsection Headers and Footers
+
+@slanted{Headers} and @slanted{footers} occupy the top and bottom of
+each page, respectively, and contain data like the page number and the
+article or chapter title. Their appearance is not affected by the
+running text. Some packages allow for different titles on even- and
+odd-numbered pages (for printed, bound material).
+
+Headers and footers are together called @slanted{titles}, and comprise
+three parts:@: left-aligned, centered, and right-aligned. A @samp{%}
+character appearing anywhere in a title is automatically replaced by the
+page number. @xref{Page Layout}.
+
+@c ---------------------------------------------------------------------
+
+@node Page Layout Adjustment, Displays and Keeps, Headers and Footers, Common Features
+@subsection Page Layout
+
+Most macro packages let the user specify the size of the page margins.
+The top and bottom margins are typically handled differently than the
+left and right margins; the latter two are derived from the
+@slanted{page offset}, @slanted{indentation}, and @slanted{line length}.
+@xref{Line Layout}. Commonly, packages support registers to tune these
+values.
+
+@c ---------------------------------------------------------------------
+
+@node Displays and Keeps, Footnotes and Endnotes, Page Layout Adjustment, Common Features
+@subsection Displays and Keeps
+@cindex displays
+
+@slanted{Displays} are sections of text set off from the surrounding
+material (typically paragraphs), often differing in indentation, and/or
+spacing. Tables, block quotations, and figures are displayed.
+Equations and code examples, when not much shorter than an output line,
+often are. Lists may or may not be. Packages for setting man pages
+support example displays but not keeps.
+@c XXX: man, mdoc keep support planned
+
+@cindex keeps (introduction)
+A @slanted{keep} is a group of output lines, often a display, that is
+formatted on a single page if possible; it causes a page break to happen
+early so as to not interrupt the kept material.
+
+@cindex keep, floating
+@cindex floating keep
+@slanted{Floating keeps} can move, or ``float'', relative to the text
+around them in the input. They are useful for displays that are
+captioned and referred to by name, as with ``See figure@tie{}3''.
+Depending on the package, a floating keep appears at the bottom of the
+current page if it fits, and at the top of the next otherwise.
+Alternatively, floating keeps might be deferred to the end of a section.
+Using a floating keep can avoid the large vertical spaces that may
+precede a tall keep of the ordinary sort when it won't fit on the page.
+
+@c ---------------------------------------------------------------------
+
+@node Footnotes and Endnotes, Table of Contents, Displays and Keeps, Common Features
+@subsection Footnotes and Endnotes
+@cindex footnotes
+@cindex endnotes
+
+@slanted{Footnotes} and @slanted{endnotes} are forms of delayed
+formatting. They are recorded at their points of relevance in
+the input, but not formatted there. Instead, a @slanted{mark} cues the
+reader to check the ``foot'', or bottom, of the current page, or in the
+case of endnotes, an annotation list later in the document. Macro
+packages that support these features also supply a means of
+automatically numbering either type of annotation.
+
+@c ---------------------------------------------------------------------
+
+@node Table of Contents, Indexing, Footnotes and Endnotes, Common Features
+@subsection Table of Contents
+@cindex table of contents
+@cindex contents, table of
+
+A package may handle a @slanted{table of contents} by directing section
+heading macros to save section heading text and the page number where it
+occurs for use in a later @slanted{entry} for a table of contents. It
+writes the collected entries at the end of the document, once all are
+known, upon request. A row of dots (a @slanted{leader}) bridges the
+text on the left with its location on the right. Other collections
+might work in this manner, providing lists of figures or tables.
+
+A table of contents is often found at the end of a GNU @code{troff}
+document because the formatter processes the document in a single pass.
+The @command{gropdf} output driver supports a PDF feature that relocates
+pages at the time the document is rendered; see the @cite{gropdf@r{(1)}}
+man page. Type @samp{man gropdf} at the command line to view it.
+
+@c ---------------------------------------------------------------------
+
+@node Indexing, Document Formats, Table of Contents, Common Features
+@subsection Indexing
+@cindex index, in macro package
+
+@pindex makeindex
+An index is similar to a table of contents, in that entry labels and
+locations must be collected, but poses a greater challenge because it
+needs to be sorted before it is output. Here, processing the document
+in multiple passes is inescapable, and tools like the @code{makeindex}
+program are necessary.
+
+@c ---------------------------------------------------------------------
+
+@node Document Formats, Columnation, Indexing, Common Features
+@subsection Document Formats
+@cindex document formats
+
+Some macro packages supply stock configurations of certain documents,
+like business letters and memoranda. These often also have provision
+for a @slanted{cover sheet}, which may be rigid in its format. With
+these features, it is even more important to use the package's macros in
+preference to the formatter requests presented earlier, where possible.
+
+@c ---------------------------------------------------------------------
+
+@node Columnation, Font and Size Changes, Document Formats, Common Features
+@subsection Columnation
+
+Macro packages apart from @file{man} and @file{mdoc} for man page
+formatting offer a facility for setting multiple columns on the page.
+
+@c ---------------------------------------------------------------------
+
+@node Font and Size Changes, Predefined Text, Columnation, Common Features
+@subsection Font and Size Changes
+
+The formatter's requests and escape sequences for setting the typeface
+and size are not always intuitive, so all macro packages provide macros
+to make these operations simpler. They also make it more convenient to
+change typefaces in the middle of a word and can handle italic
+corrections automatically. @xref{Italic Corrections}.
+
+@c ---------------------------------------------------------------------
+
+@node Predefined Text, Preprocessor Support, Font and Size Changes, Common Features
+@subsection Predefined Text
+
+Most macro packages supply predefined strings to set prepared text like
+the date, or to perform operations like super- and subscripting.
+
+@c ---------------------------------------------------------------------
+
+@node Preprocessor Support, Configuration and Customization, Predefined Text, Common Features
+@subsection Preprocessor Support
+
+All macro packages provide support for various preprocessors and may
+extend their functionality by defining macros to set their contents in
+displays. Examples include @code{TS} and @code{TE} for @command{gtbl},
+@code{EQ} and @code{EN} for @command{geqn}, and @code{PS} and @code{PE}
+for @command{gpic}.
+
+@c ---------------------------------------------------------------------
+
+@node Configuration and Customization, , Preprocessor Support, Common Features
+@subsection Configuration and Customization
+
+Packages provide means of customizing many of the details of how the
+package behaves. These range from setting the default type size to
+changing the appearance of section headers.
+
+@codequotebacktick off
+@codequoteundirected off
+
+
+
+@c =====================================================================
+@c =====================================================================
+
+@node Major Macro Packages, GNU troff Reference, Tutorial for Macro Users, Top
+@chapter Macro Packages
+@cindex major macro package
+@cindex package, macro, major
+@cindex macro package, major
+
+This chapter surveys the ``major'' macro packages that come with
+@code{groff}. One, @file{ms}, is presented in detail.
+
+@cindex full-service macro package
+@cindex package, macro, full-service
+@cindex macro package, full-service
+Major macro packages are also sometimes described as @dfn{full-service}
+due to the breadth of features they provide and because more than one
+cannot be used by the same document; for example
+
+@Example
+groff -m man foo.man -m ms bar.doc
+@endExample
+
+@noindent
+doesn't work. Option arguments are processed before non-option
+arguments; the above (failing) sample is thus reordered to
+
+@Example
+groff -m man -m ms foo.man bar.doc
+@endExample
+
+@cindex minor macro package
+@cindex package, macro, minor
+@cindex macro package, minor
+@cindex auxiliary macro package
+@cindex package, macro, auxiliary
+@cindex macro package, auxiliary
+Many auxiliary, or ``minor'', macro packages are also available. They
+may in general be used with any full-service macro package and handle a
+variety of tasks from character encoding selection, to language
+localization, to inlining of raster images. See the
+@cite{groff_tmac@r{(5)}} man page for a list. Type @samp{man
+groff_tmac} at the command line to view it.
+
+@menu
+* man::
+* mdoc::
+* me::
+* mm::
+* mom::
+* ms::
+@end menu
+
+
+@c =====================================================================
+
+@node man, mdoc, Major Macro Packages, Major Macro Packages
+@section @file{man}
+@cindex manual pages
+@cindex man pages
+@pindex an.tmac
+@pindex man.tmac
+
+The @code{man} macro package is the most widely used and probably the
+most important ever developed for @code{troff}. It is easy to use, and
+a vast majority of manual pages (``man pages'') are written in it.
+
+@code{groff}'s implementation is documented in the
+@cite{groff_man@r{(7)}} man page. Type @samp{man groff_man} at the
+command line to view it.
+
+@menu
+* Optional man extensions::
+@end menu
+
+@c ---------------------------------------------------------------------
+
+@node Optional man extensions, , , man
+@subsection Optional @file{man} extensions
+
+@pindex man.local
+Use the file @file{man.local} for local extensions to the @code{man}
+macros or for style changes.
+
+@unnumberedsubsubsec Custom headers and footers
+@cindex @code{man} macros, custom headers and footers
+
+In @code{groff} versions 1.18.2 and later, you can specify custom
+headers and footers by redefining the following macros in
+@file{man.local}.
+
+@Defmac {PT, , man}
+Control the content of the headers. Normally, the header prints the
+command name and section number on either side, and the optional fifth
+argument to @code{TH} in the center.
+@endDefmac
+
+@Defmac {BT, , man}
+Control the content of the footers. Normally, the footer prints the
+page number and the third and fourth arguments to @code{TH}.
+
+Use the @code{FT} register to specify the footer position. The default
+is @minus{}0.5@dmn{i}.
+@endDefmac
+
+@unnumberedsubsubsec Ultrix-specific man macros
+@cindex Ultrix-specific @code{man} macros
+@cindex @code{man} macros, Ultrix-specific
+
+@pindex man.ultrix
+The @code{groff} source distribution includes a file named
+@file{man.ultrix}, containing macros compatible with the Ultrix variant
+of @code{man}. Copy this file into @file{man.local} (or use the
+@code{mso} request to load it) to enable the following macros.
+
+@Defmac {CT, @Var{key}, man}
+Print @samp{<CTRL/@var{key}>}.
+@endDefmac
+
+@Defmac {CW, , man}
+Print subsequent text using a ``constant-width'' (monospaced) typeface
+(Courier roman).
+@endDefmac
+
+@Defmac {Ds, , man}
+Begin a non-filled display.
+@endDefmac
+
+@Defmac {De, , man}
+End a non-filled display started with @code{Ds}.
+@endDefmac
+
+@Defmac {EX, [@Var{indent}], man}
+Begin a non-filled display using a monospaced typeface (Courier roman).
+Use the optional @var{indent} argument to indent the display.
+@endDefmac
+
+@Defmac {EE, , man}
+End a non-filled display started with @code{EX}.
+@endDefmac
+
+@Defmac {G, [@Var{text}], man}
+Set @var{text} in Helvetica. If no text is present on the line where
+the macro is called, then the text of the next line appears in
+Helvetica.
+@endDefmac
+
+@Defmac {GL, [@Var{text}], man}
+Set @var{text} in Helvetica oblique. If no text is present on the line
+where the macro is called, then the text of the next line appears in
+Helvetica Oblique.
+@endDefmac
+
+@Defmac {HB, [@Var{text}], man}
+Set @var{text} in Helvetica bold. If no text is present on the line
+where the macro is called, then all text up to the next @code{HB}
+appears in Helvetica bold.
+@endDefmac
+
+@Defmac {TB, [@Var{text}], man}
+Identical to @code{HB}.
+@endDefmac
+
+@Defmac {MS, @Var{title} @Var{sect} [@Var{punct}], man}
+Set a man page reference in Ultrix format. The @var{title} is in
+Courier instead of italic. Optional punctuation follows the section
+number without an intervening space.
+@endDefmac
+
+@Defmac {NT, [@code{C}] [@Var{title}], man}
+Begin a note. Print the optional @Var{title}, or the word ``Note'',
+centered on the page. Text following the macro makes up the body of the
+note, and is indented on both sides. If the first argument is @code{C},
+the body of the note is printed centered (the second argument replaces
+the word ``Note'' if specified).
+@endDefmac
+
+@Defmac {NE, , man}
+End a note begun with @code{NT}.
+@endDefmac
+
+@Defmac {PN, @Var{path} [@Var{punct}], man}
+Set the path name in a monospaced typeface (Courier roman), followed by
+optional punctuation.
+@endDefmac
+
+@Defmac {Pn, [@Var{punct}] @Var{path} [@Var{punct}], man}
+If called with two arguments, identical to @code{PN}. If called with
+three arguments, set the second argument in a monospaced typeface
+(Courier roman), bracketed by the first and third arguments in the
+current font.
+@endDefmac
+
+@Defmac {R, , man}
+Switch to roman font and turn off any underlining in effect.
+@endDefmac
+
+@Defmac {RN, , man}
+Print the string @samp{<RETURN>}.
+@endDefmac
+
+@Defmac {VS, [@code{4}], man}
+Start printing a change bar in the margin if the number@tie{}@code{4} is
+specified. Otherwise, this macro does nothing.
+@endDefmac
+
+@Defmac {VE, , man}
+End printing the change bar begun by @code{VS}.
+@endDefmac
+
+@unnumberedsubsubsec Simple example
+
+The following example @file{man.local} file alters the @code{SH} macro
+to add some extra vertical space before printing the heading. Headings
+are printed in Helvetica bold.
+
+@Example
+.\" Make the heading fonts Helvetica
+.ds HF HB
+.
+.\" Put more space in front of headings.
+.rn SH SH-orig
+.de SH
+. if t .sp (u;\\n[PD]*2)
+. SH-orig \\$*
+..
+@endExample
+
+
+@c =====================================================================
+
+@node mdoc, me, man, Major Macro Packages
+@section @file{mdoc}
+@cindex @code{mdoc} macros
+
+@code{groff}'s implementation of the BSD @file{doc} package for man
+pages is documented in the @cite{groff_mdoc@r{(7)}} man page. Type
+@samp{man groff_mdoc} at the command line to view it.
+
+
+@c =====================================================================
+
+@node me, mm, mdoc, Major Macro Packages
+@section @file{me}
+@cindex @code{me} macro package
+
+@code{groff}'s implementation of the BSD @file{me} macro package is
+documented using itself. A tutorial, @file{meintro.me}, and reference,
+@file{meref.me}, are available in @code{groff}'s documentation
+directory. A @cite{groff_me@r{(7)}} man page is also available and
+identifies the installation path for these documents. Type @samp{man
+groff_me} at the command line to view it.
+
+A French translation of the tutorial is available as
+@file{meintro_fr.me} and installed parallel to the English version.
+
+
+@c =====================================================================
+
+@node mm, mom, me, Major Macro Packages
+@section @file{mm}
+@cindex @code{mm} macro package
+
+@code{groff}'s implementation of the @acronym{AT&T} memorandum macro
+package is documented in the @cite{groff_mm@r{(7)}} man page. Type
+@samp{man groff_mm} at the command line) to view it.
+
+A Swedish localization of @file{mm} is also available; see
+@cite{groff_mmse@r{(7)}}.
+
+
+@c =====================================================================
+
+@node mom, ms, mm, Major Macro Packages
+@section @file{mom}
+@cindex @code{mom} macro package
+
+The main documentation files for the @file{mom} macros are in
+@acronym{HTML} format. Additional, useful documentation is in
+@acronym{PDF} format. See the @cite{groff@r{(1)}} man page, section
+``Installation Directories'', for their location.
+
+@itemize @bullet
+@item
+@file{toc.html}
+@noindent
+Entry point to the full mom manual.
+
+@item
+@file{macrolist.html}
+@noindent
+Hyperlinked index of macros with brief descriptions, arranged by
+category.
+
+@item
+@file{mom-pdf.pdf}
+@noindent
+@acronym{PDF} features and usage.
+@end itemize
+
+The mom macros are in active development between @code{groff} releases.
+The most recent version, along with up-to-date documentation, is
+available at @uref{http://www.schaffter.ca/mom/mom-05.html}.
+
+The @cite{groff_mom@r{(7)}} man page (type @samp{man groff_mom} at
+the command line) contains a partial list of available macros, however
+their usage is best understood by consulting the @acronym{HTML}
+documentation.
+
+
+@c =====================================================================
+
+@codequotebacktick on
+@codequoteundirected on
+
+@node ms, , mom, Major Macro Packages
+@section @file{ms}
+@cindex @file{ms} macros
+
+The @file{ms} (``manuscript'') package is suitable for the preparation
+of letters, memoranda, reports, and books. These @code{groff}
+macros feature cover page and table of contents generation,
+automatically numbered headings, several paragraph styles, a variety of
+text styling options, footnotes, and multi-column page layouts.
+@file{ms} supports the @command{tbl}, @command{eqn}, @command{pic}, and
+@command{refer} preprocessors for inclusion of tables, mathematical
+equations, diagrams, and standardized bibliographic citations. This
+implementation is mostly compatible with the documented interface and
+behavior of AT&T Unix Version@tie{}7 @file{ms}. Many extensions from
+4.2BSD (Berkeley)
+@c Few changes were made in 4.3, Tahoe, Reno, or 4.4.
+and Tenth Edition Research Unix have been recreated.
+
+@menu
+* ms Introduction::
+* ms Document Structure::
+* ms Document Control Settings::
+* ms Document Description Macros::
+* ms Body Text::
+* ms Page Layout::
+* Differences from AT&T ms::
+* ms Legacy Features::
+* ms Naming Conventions::
+@end menu
+
+@c ---------------------------------------------------------------------
+
+@node ms Introduction, ms Document Structure, ms, ms
+@subsection Introduction
+
+The @file{ms} macros are the oldest surviving package for @code{roff}
+systems.@footnote{While manual @emph{pages} are older, early ones used
+macros supplanted by the @file{man} package of Seventh Edition Unix
+(1979). @file{ms} shipped with Sixth Edition (1975) and was documented
+by Mike Lesk in a Bell Labs internal memorandum.} While the @file{man}
+package was designed for brief reference documents, the @file{ms} macros
+are also suitable for longer works intended for printing and possible
+publication.
+
+@menu
+* ms basic information::
+@end menu
+
+@c ---------------------------------------------------------------------
+
+@node ms basic information, ms Document Structure, ms Introduction, ms Introduction
+@subsubsection Basic information
+
+@file{ms} documents are plain text files; prepare them with your
+preferred text editor. If you're in a hurry to start, know that
+@file{ms} needs one of its macros called at the beginning of a document
+so that it can initialize. A @dfn{macro} is a formatting instruction to
+@file{ms}. Put a macro call on a line by itself. Use @samp{.PP} if you
+want your paragraph's first line to be indented, or @samp{.LP} if you
+don't.
+
+After that, start typing normally. It is a good practice to start each
+sentence on a new line, or to put two spaces after sentence-ending
+punctuation, so that the formatter knows where the sentence boundaries
+are. You can separate paragraphs with further paragraphing macros, or
+with blank lines, and you can indent with tabs. When you need one of
+the features mentioned earlier (@pxref{ms}), return to this part of the
+manual.
+
+Format the document with the @command{groff} command. @command{nroff}
+can be useful for previewing.
+
+@CartoucheExample
+$ editor radical.ms
+$ nroff -ww -z -ms radical.ms # check for errors
+$ nroff -ms radical.ms | less -R
+$ groff -T ps -ms radical.ms > radical.ps
+$ see radical.ps
+@endCartoucheExample
+
+Our @file{radical.ms} document might look like this.
+
+@CartoucheExample
+.LP
+Radical novelties are so disturbing that they tend to be
+suppressed or ignored, to the extent that even the
+possibility of their existence in general is more often
+denied than admitted.
+
+@arrow{}That's what Dijkstra said, anyway.
+@endCartoucheExample
+
+@file{ms} exposes many aspects of document layout to user control via
+@code{groff}'s @dfn{registers} and @dfn{strings}, which store numbers
+and text, respectively. Measurements in @code{groff} are expressed with
+a suffix called a @dfn{scaling unit}.
+
+@table @code
+@item i
+inches
+
+@item c
+centimeters
+
+@item p
+points (1/72 inch)
+
+@item P
+picas (1/6 inch)
+
+@item v
+vees; current vertical spacing
+
+@item m
+ems; width of an ``M'' in the current font
+
+@item n
+ens; one-half em
+@end table
+
+Set registers with the @code{nr} request and strings with the @code{ds}
+request. @dfn{Requests} are like macro calls; they go on lines by
+themselves and start with the @dfn{control character}, a dot (@code{.}).
+The difference is that they directly instruct the formatter program,
+rather than the macro package. We'll discuss a few as applicable. It
+is wise to specify a scaling unit when setting any register that
+represents a length, size, or distance.
+
+@CartoucheExample
+.nr PS 10.5p \" Use 10.5-point type.
+.ds FAM P \" Use Palatino font family.
+@endCartoucheExample
+
+@noindent
+In the foregoing, we see that @code{\"} begins a comment. This is an
+example of an @dfn{escape sequence}, the other kind of formatting
+instruction. Escape sequences can appear anywhere. They begin with the
+escape character (@code{\}) and are followed by at least one more
+character. @file{ms} documents
+@c like this one
+tend to use only a few of @code{groff}'s many requests and escape
+sequences; see @ref{Request Index} and @ref{Escape Sequence Index} or
+the @cite{groff@r{(7)}} man page for complete lists.
+
+@table @code
+@item \"
+Begin comment; ignore remainder of line.
+
+@item \n[@var{reg}]
+Interpolate value of register @var{reg}.
+
+@item \*[@var{str}]
+Interpolate contents of string @var{str}.
+
+@item \*@var{s}
+abbreviation of @code{\*[@var{s}]}; the name @var{s} must be only one
+character
+
+@item \[@var{char}]
+Interpolate glyph of special character named @var{char}.
+
+@item \&
+dummy character
+
+@item \~
+Insert an unbreakable space that is adjustable like a normal space.
+
+@item \|
+Move horizontally by one-sixth em (``thin space'').
+@end table
+
+Prefix any words that start with a dot @samp{.} or neutral apostrophe
+@samp{'} with @code{\&} if they are at the beginning of an input line
+(or might become that way in editing) to prevent them from being
+interpreted as macro calls or requests. Suffix @samp{.}, @samp{?}, and
+@samp{!} with @code{\&} when needed to cancel end-of-sentence detection.
+
+@CartoucheExample
+My exposure was \&.5 to \&.6 Sv of neutrons, said Dr.\&
+Wallace after the criticality incident.
+@endCartoucheExample
+
+@c ---------------------------------------------------------------------
+
+@node ms Document Structure, ms Document Control Settings, ms Introduction, ms
+@subsection Document Structure
+@cindex @file{ms} macros, general structure
+
+The @file{ms} macro package expects a certain amount of structure:
+a well-formed document contains at least one paragraphing or heading
+macro call. Longer documents have a structure as follows.
+
+@table @strong
+@item Document type
+Calling the @code{RP} macro at the beginning of your document puts the
+document description (see below) on a cover page. Otherwise, @file{ms}
+places the information (if any) on the first page, followed immediately
+by the body text. Some document types found in other @file{ms}
+implementations are specific to @acronym{AT&T} or Berkeley, and are not
+supported by @code{groff} @file{ms}.
+
+@item Format and layout
+By setting registers and strings, you can configure your document's
+typeface, margins, spacing, headers and footers, and footnote
+arrangement. @xref{ms Document Control Settings}.
+
+@item Document description
+A document description consists of any of: a title, one or more authors'
+names and affiliated institutions, an abstract, and a date or other
+identifier. @xref{ms Document Description Macros}.
+
+@item Body text
+The main matter of your document follows its description (if any).
+@file{ms} supports highly structured text consisting of paragraphs
+interspersed with multi-level headings (chapters, sections, subsections,
+and so forth) and augmented by lists, footnotes, tables, diagrams, and
+similar material. @xref{ms Body Text}.
+
+@item Tables of contents
+Macros enable the collection of entries for a table of contents (or
+index) as the material they discuss appears in the document. You then
+call a macro to emit the table of contents at the end of your document.
+The table of contents must necessarily follow the rest of the text since
+GNU @code{troff} is a single-pass formatter; it thus cannot determine
+the page number of a division of the text until it has been set and
+output. Since @file{ms} was designed for the production of hard copy,
+the traditional procedure was to manually relocate the pages containing
+the table of contents between the cover page and the body text. Today,
+page resequencing is more often done in the digital domain. An index
+works similarly, but because it typically needs to be sorted after
+collection, its preparation requires separate processing.
+@end table
+
+@c ---------------------------------------------------------------------
+
+@node ms Document Control Settings, ms Document Description Macros, ms Document Structure, ms
+@subsection Document Control Settings
+@cindex @file{ms} macros, document control settings
+
+@file{ms} exposes many aspects of document layout to user control via
+@code{groff} requests. To use them, you must understand how to define
+registers and strings.
+
+@Defreq {nr, reg value}
+Set register @var{reg} to @var{value}. If @var{reg} doesn't exist, GNU
+@code{troff} creates it.
+@endDefreq
+
+@Defreq {ds, name contents}
+Set string @var{name} to @var{contents}.
+@endDefreq
+
+A list of document control registers and strings follows. For any
+parameter whose default is unsatisfactory, define its register or string
+before calling any @file{ms} macro other than @code{RP}.
+
+@unnumberedsubsubsec Margin settings
+
+@Defmpreg {PO, ms}
+Defines the page offset (i.e., the left margin).
+@c not in V6
+
+Effective: next page.
+
+Default: Varies by output device and paper format; 1@dmn{i} is used for
+typesetters using U.S.@: letter paper, and zero for terminals.
+@xref{Paper Format}.
+@endDefmpreg
+
+@Defmpreg {LL, ms}
+Defines the line length (i.e., the width of the body text).
+
+Effective: next paragraph.
+
+Default: Varies by output device and paper format; 6.5@dmn{i} is used
+for typesetters using U.S.@: letter paper (@pxref{Paper Format}) and
+65@dmn{n} on terminals.
+@endDefmpreg
+
+@Defmpreg {LT, ms}
+Defines the title line length (i.e., the header and footer width). This
+is usually the same as @code{LL}, but need not be.
+
+Effective: next paragraph.
+
+Default: Varies by output device and paper format; 6.5@dmn{i} is used
+for typesetters using U.S.@: letter paper (@pxref{Paper Format}) and
+65@dmn{n} on terminals.
+@endDefmpreg
+
+@Defmpreg {HM, ms}
+Defines the header margin height at the top of the page.
+@c not in V6
+
+Effective: next page.
+
+Default: 1@dmn{i}.
+@endDefmpreg
+
+@Defmpreg {FM, ms}
+Defines the footer margin height at the bottom of the page.
+@c not in V6
+
+Effective: next page.
+
+Default: 1@dmn{i}.
+@endDefmpreg
+
+@unnumberedsubsubsec Titles (headers, footers)
+
+@Defmpstr {LH, ms}
+Defines the text displayed in the left header position.
+
+Effective: next header.
+
+Default: empty.
+@endDefmpstr
+
+@Defmpstr {CH, ms}
+Defines the text displayed in the center header position.
+
+Effective: next header.
+
+Default: @samp{-\n[%]-}.
+@endDefmpstr
+
+@Defmpstr {RH, ms}
+Defines the text displayed in the right header position.
+
+Effective: next header.
+
+Default: empty.
+@endDefmpstr
+
+@Defmpstr {LF, ms}
+Defines the text displayed in the left footer position.
+
+Effective: next footer.
+
+Default: empty.
+@endDefmpstr
+
+@Defmpstr {CF, ms}
+Defines the text displayed in the center footer position.
+
+Effective: next footer.
+
+Default: empty.
+@endDefmpstr
+
+@Defmpstr {RF, ms}
+Defines the text displayed in the right footer position.
+
+Effective: next footer.
+
+Default: empty.
+@endDefmpstr
+
+@unnumberedsubsubsec Text settings
+
+@Defmpreg {PS, ms}
+Defines the type size of the body text.
+
+Effective: next paragraph.
+
+Default: 10@dmn{p}.
+@endDefmpreg
+
+@Defmpreg {VS, ms}
+Defines the vertical spacing (type size plus leading).
+
+Effective: next paragraph.
+
+Default: 12@dmn{p}.
+@endDefmpreg
+
+@Defmpreg {HY, ms}
+Defines the automatic hyphenation mode used with the @code{hy} request.
+Setting @code{HY} to@tie{}0 is equivalent to using the @code{nh}
+request. This is a Tenth Edition Research Unix extension.
+@c possibly 9th, but definitely not Berkeley
+
+Effective: next paragraph.
+
+Default: 6.
+@endDefmpreg
+
+@Defmpstr {FAM, ms}
+Defines the font family used to typeset the document. This is a GNU
+extension.
+
+Effective: next paragraph.
+
+Default: defined by the output device; often @samp{T} (@pxref{ms Body
+Text})
+@endDefmpstr
+
+@unnumberedsubsubsec Paragraph settings
+
+@Defmpreg {PI, ms}
+Defines the indentation amount used by the @code{PP}, @code{IP} (unless
+overridden by an optional argument), @code{XP}, and @code{RS} macros.
+@c not in V6
+
+Effective: next paragraph.
+
+Default: 5@dmn{n}.
+@endDefmpreg
+
+@Defmpreg {PD, ms}
+Defines the space between paragraphs.
+@c not in V6
+
+Effective: next paragraph.
+
+Default: 0.3@dmn{v} (1@dmn{v} on low-resolution devices).
+@endDefmpreg
+
+@Defmpreg {QI, ms}
+Defines the indentation amount used on both sides of a paragraph set
+with the @code{QP} or between the @code{QS} and @code{QE} macros.
+
+Effective: next paragraph.
+
+Default: 5@dmn{n}.
+@endDefmpreg
+
+@Defmpreg {PORPHANS, ms}
+Defines the minimum number of initial lines of any paragraph that must
+be kept together to avoid isolated lines at the bottom of a page. If a
+new paragraph is started close to the bottom of a page, and there is
+insufficient space to accommodate @code{PORPHANS} lines before an
+automatic page break, then a page break is forced before the start of
+the paragraph. This is a GNU extension.
+
+Effective: next paragraph.
+
+Default: 1.
+@endDefmpreg
+
+@unnumberedsubsubsec Heading settings
+
+@Defmpreg {PSINCR, ms}
+Defines an increment in type size to be applied to a heading at a
+lesser depth than that specified in @code{GROWPS}. The value of
+@code{PSINCR} should be specified in points with the @dmn{p} scaling
+unit and may include a fractional component; for example, @w{@samp{.nr
+PSINCR 1.5p}} sets a type size increment of 1.5@dmn{p}. This is a GNU
+extension.
+
+Effective: next heading.
+
+Default: 1@dmn{p}.
+@endDefmpreg
+
+@Defmpreg {GROWPS, ms}
+Defines the heading depth above which the type size increment set by
+@code{PSINCR} becomes effective. For each heading depth less than the
+value of @code{GROWPS}, the type size is increased by @code{PSINCR}.
+Setting @code{GROWPS} to any value less than@tie{}2 disables the
+incremental heading size feature. This is a GNU extension.
+
+Effective: next heading.
+
+Default: 0.
+@endDefmpreg
+
+@Defmpreg {HORPHANS, ms}
+Defines the minimum number of lines of an immediately succeeding
+paragraph that should be kept together with any heading introduced by
+the @code{NH} or @code{SH} macros. If a heading is placed close to the
+bottom of a page, and there is insufficient space to accommodate both
+the heading and at least @code{HORPHANS} lines of the following
+paragraph, before an automatic page break, then the page break is forced
+before the heading. This is a GNU extension.
+
+Effective: next paragraph.
+
+Default: 1.
+@endDefmpreg
+
+@Defmpstr {SN-STYLE, ms}
+Defines the style used to print numbered headings. @xref{Headings in
+ms}. This is a GNU extension.
+
+Effective: next heading.
+
+Default: alias of @code{SN-DOT}
+@endDefmpstr
+
+@unnumberedsubsubsec Footnote settings
+
+@Defmpreg {FI, ms}
+Defines the footnote indentation. This is a Berkeley extension.
+
+Effective: next footnote.
+
+Default: 2@dmn{n}.
+@endDefmpreg
+
+@Defmpreg {FF, ms}
+Defines the format of automatically numbered footnotes,
+and those for which the @code{FS} request is given a marker argument, at
+the bottom of a column or page. This is a Berkeley extension.
+@table @code
+@item 0
+Set an automatic number@footnote{defined in @ref{ms Footnotes}} as a
+superscript (on typesetter devices) or surrounded by square brackets (on
+terminals). The footnote paragraph is indented as with @code{PP} if
+there is an @code{FS} argument or an automatic number, and as with
+@code{LP} otherwise. This is the default.
+
+@item 1
+As @code{0}, but set the marker as regular text and follow an
+automatic number with a period.
+
+@item 2
+As @code{1}, but without indentation (like @code{LP}).
+
+@item 3
+As @code{1}, but set the footnote paragraph with the marker hanging
+(like @code{IP}).
+@end table
+
+Effective: next footnote.
+
+Default: 0.
+@endDefmpreg
+
+@Defmpreg {FPS, ms}
+Defines the footnote type size.
+
+Effective: next footnote.
+
+Default: @code{\n[PS] - 2p}.
+@endDefmpreg
+
+@Defmpreg {FVS, ms}
+Defines the footnote vertical spacing.
+
+Effective: next footnote.
+
+Default: @code{\n[FPS] + 2p}.
+@endDefmpreg
+
+@Defmpreg {FPD, ms}
+Defines the footnote paragraph spacing. This is a GNU extension.
+
+Effective: next footnote.
+
+Default: @code{\n[PD] / 2}.
+@endDefmpreg
+
+@Defmpstr {FR, ms}
+Defines the ratio of the footnote line length to the current line
+length. This is a GNU extension.
+
+Effective: next footnote in single-column arrangements, next page
+otherwise.
+
+Default: @code{11/12}.
+@endDefmpstr
+
+@unnumberedsubsubsec Display settings
+
+@Defmpreg {DD, ms}
+Sets the display distance---the vertical spacing before and after a
+display, a @code{tbl} table, an @code{eqn} equation, or a @code{pic}
+image. This is a Berkeley extension.
+
+Effective: next display boundary.
+
+Default: 0.5@dmn{v} (1@dmn{v} on low-resolution devices).
+@endDefmpreg
+
+@Defmpreg {DI, ms}
+Sets the default amount by which to indent a display started with
+@code{DS} and @code{ID} without arguments, to @samp{.DS@tie{}I} without
+an indentation argument, and to equations set with @samp{.EQ@tie{}I}.
+This is a GNU extension.
+
+Effective: next indented display.
+
+Default: 0.5@dmn{i}.
+@endDefmpreg
+
+@unnumberedsubsubsec Other settings
+
+@Defmpreg {MINGW, ms}
+Defines the default minimum width between columns in a multi-column
+document. This is a GNU extension.
+
+Effective: next page.
+
+Default: 2@dmn{n}.
+@endDefmpreg
+
+@Defmpreg {TC-MARGIN, ms}
+Defines the width of the field in which page numbers are set in a table
+of contents entry; the right margin thus moves inboard by this amount.
+This is a GNU extension.
+
+Effective: next @code{PX} call.
+
+Default: @code{\w'000'}
+@endDefmpreg
+
+@c XXX: Normally we'd have an entry for TC-LEADER here, but it's a
+@c special character and we have no custom Texinfo macros for defining
+@c (and indexing) these. There would be little point in an index for
+@c one item, and the plan is to drop this entire @section from this
+@c manual once doc/ms.ms is ready. See Savannah #60061.
+
+@c ---------------------------------------------------------------------
+
+@node ms Document Description Macros, ms Body Text, ms Document Control Settings, ms
+@subsection Document Description Macros
+@cindex @file{ms} macros, document description
+@cindex document description macros, [@file{ms}]
+
+Only the simplest document lacks a title.@footnote{Distinguish a
+document title from ``titles'', which are what @code{roff} systems call
+headers and footers collectively.} As its level of sophistication (or
+complexity) increases, it tends to acquire a date of revision,
+explicitly identified authors, sponsoring institutions for authors, and,
+at the rarefied heights, an abstract of its content. Define these
+data by calling the macros below in the order shown; @code{DA} or
+@code{ND} can be called to set the document date (or other identifier)
+at any time before (a) the abstract, if present, or (b) its information
+is required in a header or footer. Use of these macros is optional,
+except that @code{TL} is mandatory if any of @code{RP}, @code{AU},
+@code{AI}, or @code{AB} is called, and @code{AE} is mandatory if
+@code{AB} is called.
+
+@Defmac {RP, [@code{no-repeat-info}] [@code{no-renumber}], ms}
+Use the ``report'' (@acronym{AT&T}: ``released paper'') format for your
+document, creating a separate cover page. The default arrangement is to
+place most of the document description (title, author names and
+institutions, and abstract, but not the date) at the top of the first
+page. If the optional @code{no-repeat-info} argument is given,
+@file{ms} produces a cover page but does not repeat any of its
+information subsequently (but see the @code{DA} macro below regarding
+the date). Normally, @code{RP} sets the page number following the cover
+page to@tie{}1. Specifying the optional @code{no-renumber} argument
+suppresses this alteration. Optional arguments can occur in any order.
+@code{no} is recognized as a synonym of @code{no-repeat-info} for
+@code{AT&T} compatibility.
+@endDefmac
+
+@Defmac {TL, , ms}
+Specify the document title. @file{ms} collects text on input lines
+following this call into the title until reaching @code{AU}, @code{AB},
+or a heading or paragraphing macro call.
+@endDefmac
+
+@Defmac {AU, , ms}
+Specify an author's name. @file{ms} collects text on input lines
+following this call into the author's name until reaching @code{AI},
+@code{AB}, another @code{AU}, or a heading or paragraphing macro call.
+Call it repeatedly to specify multiple authors.
+@endDefmac
+
+@Defmac {AI, , ms}
+Specify the preceding author's institution. An @code{AU} call is
+usefully followed by at most one @code{AI} call; if there are more, the
+last @code{AI} call controls. @file{ms} collects text on input lines
+following this call into the author's institution until reaching
+@code{AU}, @code{AB}, or a heading or paragraphing macro call.
+@endDefmac
+
+@Defmac {DA, [@Var{x} @dots{}], ms}
+Typeset the current date, or any arguments @var{x}, in the center
+footer, and, if @code{RP} is also called, left-aligned at the end of the
+description information on the cover page.
+@endDefmac
+
+@Defmac {ND, [@Var{x} @dots{}], ms}
+Typeset the current date, or any arguments @var{x}, if @code{RP} is also
+called, left-aligned at the end of the document description on the cover
+page. This is @code{groff} @file{ms}'s default.
+@endDefmac
+
+@Defmac {AB, [@code{no}], ms}
+Begin the abstract. @file{ms} collects text on input lines following
+this call into the abstract until reaching an @code{AE} call. By
+default, @file{ms} places the word ``ABSTRACT'' centered and in italics
+above the text of the abstract. The optional argument @code{no}
+suppresses this heading.
+@endDefmac
+
+@Defmac {AE, , ms}
+End the abstract.
+@endDefmac
+
+An example document description, using a cover page, follows.
+@cindex cover page in [@file{ms}], example markup
+@cindex example markup, cover page in [@file{ms}]
+
+@CartoucheExample
+.RP
+.TL
+The Inevitability of Code Bloat
+in Commercial and Free Software
+.AU
+J.\& Random Luser
+.AI
+University of West Bumblefuzz
+.AB
+This report examines the long-term growth of the code
+bases in two large,
+popular software packages;
+the free Emacs and the commercial Microsoft Word.
+While differences appear in the type or order of
+features added,
+due to the different methodologies used,
+the results are the same in the end.
+.PP
+The free software approach is shown to be superior in
+that while free software can become as bloated as
+commercial offerings,
+free software tends to have fewer serious bugs and the
+added features are more in line with user demand.
+.AE
+
+@r{@dots{}the rest of the paper@dots{}}
+@endCartoucheExample
+
+@c ---------------------------------------------------------------------
+
+@node ms Body Text, ms Page Layout, ms Document Description Macros, ms
+@subsection Body Text
+@cindex @file{ms} macros, body text
+
+A variety of macros, registers, and strings can be used to structure and
+style the body of your document. They organize your text into
+paragraphs, headings, footnotes, and inclusions of material such as
+tables and figures.
+
+@menu
+* Text settings in ms::
+* Typographical symbols in ms::
+* Paragraphs in ms::
+* Headings in ms::
+* Typeface and decoration::
+* Lists in ms::
+* Indented regions in ms::
+* ms keeps and displays::
+* ms Insertions::
+* ms Footnotes::
+* ms language and localization::
+@end menu
+
+@c ---------------------------------------------------------------------
+
+@node Text settings in ms, Typographical symbols in ms, ms Body Text, ms Body Text
+@subsubsection Text settings
+@cindex @file{ms} macros, text settings
+
+The @code{FAM} string, a GNU extension, sets the font family for body
+text; the default is @samp{T}. The @code{PS} and @code{VS} registers
+set the type size and vertical spacing (distance between text
+baselines), respectively. The font family and type size are ignored on
+terminal devices. Setting these parameters before the first call of a
+heading, paragraphing, or (non-date) document description macro also
+applies them to headers, footers, and (for @code{FAM}) footnotes.
+
+Which font families are available depends on the output device; as a
+convention, @code{T} selects a serif family (``Times''), @code{H} a
+sans-serif family (``Helvetica''), and @code{C} a monospaced family
+(``Courier''). The man page for the output driver documents its font
+repertoire. Consult the @cite{groff@r{(1)}} man page for lists of
+available output devices and their drivers.
+
+The hyphenation mode (as used by the @code{hy} request) is set from the
+@code{HY} register. Setting @code{HY} to @samp{0} is equivalent to
+using the @code{nh} request. This is a Tenth Edition Research Unix
+extension.
+
+@c ---------------------------------------------------------------------
+
+@node Typographical symbols in ms, Paragraphs in ms, Text settings in ms, ms Body Text
+@subsubsection Typographical symbols
+@cindex @file{ms} macros, obtaining typographical symbols
+
+@file{ms} provides a few strings to obtain typographical symbols not
+easily entered with the keyboard. These and many others are available
+as special character escape sequences---see the @cite{groff_char@r{(7)}}
+man page.
+
+@Defmpstr {-, ms}
+Interpolate an em dash.
+@endDefmpstr
+
+@DefmpstrList {Q, ms}
+@DefmpstrListEndx {U, ms}
+Interpolate typographer's quotation marks where available, and neutral
+double quotes otherwise. @code{\*Q} is the left quote and @code{\*U}
+the right.
+@endDefmpstr
+
+@c ---------------------------------------------------------------------
+
+@node Paragraphs in ms, Headings in ms, Typographical symbols in ms, ms Body Text
+@subsubsection Paragraphs
+@cindex @file{ms} macros, paragraph handling
+
+Paragraphing macros @dfn{break}, or terminate, any pending output line
+so that a new paragraph can begin. Several paragraph types are
+available, differing in how indentation applies to them: to left, right,
+or both margins; to the first output line of the paragraph, all output
+lines, or all but the first. All paragraphing macro calls cause the
+insertion of vertical space in the amount stored in the @code{PD}
+register, except at page or column breaks. Alternatively, a blank input
+line breaks the output line and vertically spaces by one vee.
+
+@Defmac {LP, , ms}
+Set a paragraph without any (additional) indentation.
+@endDefmac
+
+@Defmac {PP, , ms}
+Set a paragraph with a first-line left indentation in the amount stored
+in the @code{PI} register.
+@endDefmac
+
+@Defmac {IP, [@Var{marker} [@Var{width}]], ms}
+Set a paragraph with a left indentation. The optional @var{marker} is
+not indented and is empty by default. It has several applications;
+see @ref{Lists in ms}. @var{width} overrides the indentation amount
+stored in the @code{PI} register; its default unit is @samp{n}. Once
+specified, @var{width} applies to further @code{IP} calls until
+specified again or a heading or different paragraphing macro is called.
+@endDefmac
+
+@Defmac {QP, , ms}
+Set a paragraph indented from both left and right margins by the amount
+stored in the @code{QI} register.
+@endDefmac
+
+@DefmacList {QS, , ms}
+@DefmacListEndx {QE, , ms}
+Begin (@code{QS}) and end (@code{QE}) a region where each paragraph is
+indented from both margins by the amount stored in the @code{QI}
+register. The text between @code{QS} and @code{QE} can be structured
+further by use of other paragraphing macros.
+@endDefmac
+
+@Defmac {XP, , ms}
+Set an ``exdented'' paragraph---one with a left indentation in the
+amount stored in the @code{PI} register on every line @emph{except} the
+first (also known as a hanging indent). This is a Berkeley extension.
+@endDefmac
+
+The following example illustrates the use of paragraphing macros.
+
+@CartoucheExample
+.NH 2
+Cases used in the 2001 study
+.LP
+Two software releases were considered for this report.
+.PP
+The first is commercial software;
+the second is free.
+.IP \[bu]
+Microsoft Word for Windows,
+starting with version 1.0 through the current version
+(Word 2000).
+.IP \[bu]
+GNU Emacs,
+from its first appearance as a standalone editor through
+the current version (v20).
+See [Bloggs 2002] for details.
+.QP
+Franklin's Law applied to software:
+software expands to outgrow both RAM and disk space over
+time.
+.SH
+Bibliography
+.XP
+Bloggs, Joseph R.,
+.I "Everyone's a Critic" ,
+Underground Press, March 2002.
+A definitive work that answers all questions and
+criticisms about the quality and usability of free
+software.
+@endCartoucheExample
+
+@c ---------------------------------------------------------------------
+
+@node Headings in ms, Typeface and decoration, Paragraphs in ms, ms Body Text
+@subsubsection Headings
+@cindex @file{ms} macros, headings
+
+Use headings to create a sequential or hierarchical structure for your
+document. The @file{ms} macros print headings in @strong{bold} using
+the same font family and, by default, type size as the body text.
+Headings are available with and without automatic numbering. Text on
+input lines following the macro call becomes the heading's title. Call
+a paragraphing macro to end the heading text and start the section's
+content.
+
+@DefmacList {NH, [@Var{depth}], ms}
+@DefmacListEnd {NH, @t{S} @Var{heading-depth-index} @dots{}, ms}
+Set an automatically numbered heading.
+
+@file{ms} produces a numbered heading the form @var{a.b.c@dots{}}, to
+any depth desired, with the numbering of each depth increasing
+automatically and being reset to zero when a more significant level is
+increased. ``1''@tie{}is the most significant or coarsest division of
+the document. Only non-zero values are output. If @var{depth} is
+omitted, it is taken to be @samp{1}.
+
+If you specify @var{depth} such that an ascending gap occurs relative to
+the previous @code{NH} call---that is, you ``skip a depth'', as by
+@samp{.NH 1} and then @samp{.NH 3}---@code{groff} @file{ms} emits a
+warning on the standard error stream.
+
+Alternatively, you can give @code{NH} a first argument of@tie{}@code{S},
+followed by integers to number the heading depths explicitly. Further
+automatic numbering, if used, resumes using the specified indices as
+their predecessors.
+@c Although undocumented in Tuthill's 4.2BSD ms.diffs paper...
+This feature is a Berkeley extension.
+@endDefmac
+
+An example may be illustrative.
+
+@CartoucheExample
+.NH 1
+Animalia
+.NH 2
+Arthropoda
+.NH 3
+Crustacea
+.NH 2
+Chordata
+.NH S 6 6 6
+Daimonia
+.NH 1
+Plantae
+@endCartoucheExample
+
+The above results in numbering as follows; the vertical space that
+normally precedes each heading is omitted.
+
+@Example
+1. Animalia
+1.1. Arthropoda
+1.1.1. Crustacea
+1.2. Chordata
+6.6.6. Daimonia
+7. Plantae
+@endExample
+
+@DefmpstrList {SN-STYLE, ms}
+@DefmpstrItemx {SN-DOT, ms}
+@DefmpstrItemx {SN-NO-DOT, ms}
+@DefmpstrListEndx {SN, ms}
+After @code{NH} is called, the assigned number is made available in the
+strings @code{SN-DOT} (as it appears in a printed heading with default
+formatting, followed by a terminating period) and @code{SN-NO-DOT} (with
+the terminating period omitted). These are GNU extensions.
+
+You can control the style used to print numbered headings by defining an
+appropriate alias for the string @code{SN-STYLE}. By default,
+@code{SN-STYLE} is aliased to @code{SN-DOT}. If you prefer to omit the
+terminating period from numbers appearing in numbered headings, you may
+define the alias as follows.
+
+@Example
+.als SN-STYLE SN-NO-DOT
+@endExample
+
+@noindent
+Any such change in numbering style becomes effective from the next use
+of @code{NH} following redefinition of the alias for @code{SN-STYLE}.
+The formatted number of the current heading is available in the
+@code{SN} string (a feature first documented by Berkeley), which
+facilitates its inclusion in, for example, table captions, equation
+labels, and @code{XS}/@code{XA}/@code{XE} table of contents entries.
+@endDefmpstr
+
+@Defmac {SH, [@Var{depth}], ms}
+Set an unnumbered heading.
+
+The optional @var{depth} argument is a GNU extension indicating the
+heading depth corresponding to the @var{depth} argument of @code{NH}.
+It matches the type size at which the heading is set to that of a
+numbered heading at the same depth when the @code{GROWPS} and
+@code{PSINCR} heading size adjustment mechanism is in effect.
+@endDefmac
+
+If the @code{GROWPS} register is set to a value greater than the
+@var{level} argument to @code{NH} or @code{SH}, the type size of a
+heading produced by these macros increases by @code{PSINCR} units over
+the size specified by @code{PS} multiplied by the difference of
+@code{GROWPS} and @var{level}. The value stored in @code{PSINCR} is
+interpreted in @code{groff} basic units; the @code{p} scaling unit
+should be employed when assigning a value specified in points. For
+example, the sequence
+
+@CartoucheExample
+.nr PS 10
+.nr GROWPS 3
+.nr PSINCR 1.5p
+.NH 1
+Carnivora
+.NH 2
+Felinae
+.NH 3
+Felis catus
+.SH 2
+Machairodontinae
+@endCartoucheExample
+
+@noindent
+will cause ``1. Carnivora'' to be printed in 13-point text, followed by
+``1.1. Felinae'' in 11.5-point text, while ``1.1.1. Felis catus'' and
+all more deeply nested heading levels will remain in the 10-point text
+specified by the @code{PS} register. ``Machairodontinae'' is printed at
+11.5 points, since it corresponds to heading level@tie{}2.
+
+The @code{HORPHANS} register operates in conjunction with the @code{NH}
+and @code{SH} macros to inhibit the printing of isolated headings at the
+bottom of a page; it specifies the minimum number of lines of an
+immediately subsequent paragraph that must be kept on the same page as
+the heading. If insufficient space remains on the current page to
+accommodate the heading and this number of lines of paragraph text, a
+page break is forced before the heading is printed. Any display macro
+call or @code{tbl}, @code{pic}, or @code{eqn} region between the heading
+and the subsequent paragraph suppresses this grouping. @xref{ms keeps
+and displays} and @ref{ms Insertions}.
+
+@c ---------------------------------------------------------------------
+
+@node Typeface and decoration, Lists in ms, Headings in ms, ms Body Text
+@subsubsection Typeface and decoration
+
+The @file{ms} macros provide a variety of ways to style text.
+Attend closely to the ordering of arguments labeled @var{pre} and
+@var{post}, which is not intuitive. Support for @var{pre}
+arguments is a GNU extension.@footnote{This idiosyncrasy arose through
+feature accretion; for example, the @code{B} macro in Version@tie{}6
+Unix @file{ms} (1975) accepted only one argument, the text to be set in
+boldface. By Version@tie{}7 (1979) it recognized a second argument; in
+1990, @code{groff} @file{ms} added a ``pre'' argument, placing it third
+to avoid breaking support for older documents.}
+
+@Defmac {B, [@Var{text} [@Var{post} [@Var{pre}]]], ms}
+Style @var{text} in @b{bold}, followed by @var{post} in the previous
+font style without intervening space, and preceded by @var{pre}
+similarly. Without arguments, @file{ms} styles subsequent text in bold
+until the next paragraphing, heading, or no-argument typeface macro
+call.
+@endDefmac
+
+@Defmac {R, [@Var{text} [@Var{post} [@Var{pre}]]], ms}
+As @code{B}, but use the roman style (upright text of normal weight)
+instead of bold. Argument recognition is a GNU extension.
+@endDefmac
+
+@Defmac {I, [@Var{text} [@Var{post} [@Var{pre}]]], ms}
+As @code{B}, but use an @i{italic} or oblique style instead of bold.
+@endDefmac
+
+@Defmac {BI, [@Var{text} [@Var{post} [@Var{pre}]]], ms}
+As @code{B}, but use a bold italic or bold oblique style instead of
+upright bold. This is a Tenth Edition Research Unix extension.
+@c possibly 9th, but definitely not Berkeley
+@endDefmac
+
+@Defmac {CW, [@Var{text} [@Var{post} [@Var{pre}]]], ms}
+As @code{B}, but use a @t{constant-width} (monospaced) roman typeface
+instead of bold. This is a Tenth Edition Research Unix extension.
+@c possibly 9th, but definitely not Berkeley
+@endDefmac
+
+@Defmac {BX, [@Var{text}], ms}
+Typeset @var{text} and draw a box around it. On terminal devices,
+reverse video is used instead. If you want @var{text} to contain space,
+use unbreakable space or horizontal motion escape sequences (@code{\~},
+@code{\@key{SP}}, @code{\^}, @code{\|}, @code{\0} or @code{\h}).
+@endDefmac
+
+@Defmac {UL, [@Var{text} [@Var{post}]], ms}
+Typeset @var{text} with an underline. @var{post}, if present, is set
+after @var{text} with no intervening space.
+@endDefmac
+
+@Defmac {LG, , ms}
+Set subsequent text in larger type (two points larger than the
+current size) until the next type size, paragraphing, or heading macro
+call. You can specify this macro multiple times to enlarge the type
+size as needed.
+@endDefmac
+
+@Defmac {SM, , ms}
+Set subsequent text in smaller type (two points smaller than the current
+size) until the next type size, paragraphing, or heading macro call.
+You can specify this macro multiple times to reduce the type size as
+needed.
+@endDefmac
+
+@Defmac {NL, , ms}
+Set subsequent text at the normal type size (the amount in the @code{PS}
+register).
+@endDefmac
+
+@var{pre} and @var{post} arguments are typically used to simplify the
+attachment of punctuation to styled words. When @var{pre} is used,
+a hyphenation control escape sequence @code{\%} that would ordinarily
+start @var{text} must start @var{pre} instead to have the desired
+effect.
+
+@CartoucheExample
+The CS course's students found one C language keyword
+.CW static ) \%(
+most troublesome.
+@endCartoucheExample
+
+The foregoing example produces output as follows.
+
+@CartoucheExample
+@r{The CS course's students found one C language keyword (@t{static})
+most troublesome.}
+@endCartoucheExample
+
+You can use the output line continuation escape sequence @code{\c} to
+achieve the same result (@pxref{Line Continuation}). It is also
+portable to older @file{ms} implementations.
+
+@CartoucheExample
+The CS course's students found one C language keyword
+\%(\c
+.CW \%static )
+most troublesome.
+@endCartoucheExample
+
+@code{groff} @file{ms} also offers strings to begin and end super- and
+subscripting. These are GNU extensions.
+
+@DefmpstrList {@lbracechar{}, ms}
+@DefmpstrListEndx {@rbracechar{}, ms}
+Begin and end superscripting, respectively.
+@endDefmpstr
+
+@DefmpstrList {<, ms}
+@DefmpstrListEndx {>, ms}
+Begin and end subscripting, respectively.
+@endDefmpstr
+
+Rather than calling the @code{CW} macro, in @code{groff} @file{ms} you
+might prefer to change the font family to Courier by setting the
+@code{FAM} string to @samp{C}. You can then use all four style macros
+above, returning to the default family (Times) with @samp{.ds FAM T}.
+Because changes to @code{FAM} take effect only at the next paragraph,
+@code{CW} remains useful to ``inline'' a change to the font family,
+similarly to the practice of this document in noting syntactical
+elements of @file{ms} and @code{groff}.
+
+@c ---------------------------------------------------------------------
+
+@node Lists in ms, Indented regions in ms, Typeface and decoration, ms Body Text
+@subsubsection Lists
+@cindex @file{ms} macros, lists
+
+The @var{marker} argument to the @code{IP} macro can be employed to
+present a variety of lists; for instance, you can use a bullet glyph
+(@code{\[bu]}) for unordered lists, a number (or auto-incrementing
+register) for numbered lists, or a word or phrase for glossary-style or
+definition lists. If you set the paragraph indentation register
+@code{PI} before calling @code{IP}, you can later reorder the items in
+the list without having to ensure that a @var{width} argument remains
+affixed to the first call.
+
+The following is an example of a bulleted list.
+@cindex example markup, bulleted list [@file{ms}]
+@cindex bulleted list, example markup [@file{ms}]
+
+@CartoucheExample
+.nr PI 2n
+A bulleted list:
+.IP \[bu]
+lawyers
+.IP \[bu]
+guns
+.IP \[bu]
+money
+@endCartoucheExample
+
+@Example
+A bulleted list:
+
+@bullet{} lawyers
+
+@bullet{} guns
+
+@bullet{} money
+@endExample
+
+The following is an example of a numbered list.
+@cindex example markup, numbered list [@file{ms}]
+@cindex numbered list, example markup [@file{ms}]
+
+@CartoucheExample
+.nr step 0 1
+.nr PI 3n
+A numbered list:
+.IP \n+[step]
+lawyers
+.IP \n+[step]
+guns
+.IP \n+[step]
+money
+@endCartoucheExample
+
+@Example
+A numbered list:
+
+1. lawyers
+
+2. guns
+
+3. money
+@endExample
+
+Here we have employed the @code{nr} request to create a register of our
+own, @samp{step}. We initialized it to zero and assigned it an
+auto-increment of 1. Each time we use the escape sequence
+@samp{\n+[PI]} (note the plus sign), the formatter applies the increment
+just before interpolating the register's value. Preparing the @code{PI}
+register as well enables us to rearrange the list without the tedium of
+updating macro calls.
+
+The next example illustrates a glossary-style list.
+@cindex example markup, glossary-style list [@file{ms}]
+@cindex glossary-style list, example markup [@file{ms}]
+
+@CartoucheExample
+A glossary-style list:
+.IP lawyers 0.4i
+Two or more attorneys.
+.IP guns
+Firearms,
+preferably large-caliber.
+.IP money
+Gotta pay for those
+lawyers and guns!
+@endCartoucheExample
+
+@Example
+A glossary-style list:
+
+lawyers
+ Two or more attorneys.
+
+guns Firearms, preferably large-caliber.
+
+money
+ Gotta pay for those lawyers and guns!
+@endExample
+
+In the previous example, observe how the @code{IP} macro places the
+definition on the same line as the term if it has enough space. If this
+is not what you want, there are a few workarounds we will illustrate by
+modifying the example. First, you can use a @code{br} request to force
+a break after printing the term or label.
+
+@CartoucheExample
+.IP guns
+.br
+Firearms,
+@endCartoucheExample
+
+Second, you could apply the @code{\p} escape sequence to force a break.
+The space following the escape sequence is important; if you omit it,
+@code{groff} prints the first word of the paragraph text on the same
+line as the term or label (if it fits) @emph{then} breaks the line.
+
+@CartoucheExample
+.IP guns
+\p Firearms,
+@endCartoucheExample
+
+Finally, you may append a horizontal motion to the marker with the
+@code{\h} escape sequence; using the same amount as the indentation will
+ensure that the marker is too wide for @code{groff} to treat it as
+``fitting'' on the same line as the paragraph text.
+
+@CartoucheExample
+.IP guns\h'0.4i'
+Firearms,
+@endCartoucheExample
+
+In each case, the result is the same.
+
+@Example
+A glossary-style list:
+
+lawyers
+ Two or more attorneys.
+
+guns
+ Firearms, preferably large-caliber.
+
+money
+ Gotta pay for those lawyers and guns!
+@endExample
+
+@c ---------------------------------------------------------------------
+
+@node Indented regions in ms, ms keeps and displays, Lists in ms, ms Body Text
+@subsubsection Indented regions
+
+You may need to indent a region of text while otherwise formatting it
+normally. Indented regions can be nested; you can change @code{\n[PI]}
+before each call to vary the amount of inset.
+
+@Defmac {RS, , ms}
+Begin a region where headings, paragraphs, and displays are indented
+(further) by the amount stored in the @code{PI} register.
+@endDefmac
+
+@Defmac {RE, , ms}
+End the (next) most recent indented region.
+@endDefmac
+
+This feature enables you to easily line up text under hanging and
+indented paragraphs.
+@cindex @file{ms} macros, nested lists
+@cindex nested lists [@file{ms}]
+For example, you may wish to structure lists hierarchically.
+
+@CartoucheExample
+.IP \[bu] 2
+Lawyers:
+.RS
+.IP \[bu]
+Dewey,
+.IP \[bu]
+Cheatham,
+and
+.IP \[bu]
+and Howe.
+.RE
+.IP \[bu]
+Guns
+@endCartoucheExample
+
+@Example
+@bullet{} Lawyers:
+
+ @bullet{} Dewey,
+
+ @bullet{} Cheatham, and
+
+ @bullet{} Howe.
+
+@bullet{} Guns
+@endExample
+
+@c ---------------------------------------------------------------------
+
+@node ms keeps and displays, ms Insertions, Indented regions in ms, ms Body Text
+@subsubsection Keeps, boxed keeps, and displays
+@cindex @file{ms} macros, displays
+@cindex @file{ms} macros, keeps
+@cindex keeps [@file{ms}]
+
+On occasion, you may want to @dfn{keep} several lines of text, or a
+region of a document, together on a single page, preventing an automatic
+page break within certain boundaries. This can cause a page break to
+occur earlier than it normally would. For example, you may want to keep
+two paragraphs together, or a paragraph that refers to a table, list, or
+figure adjacent to the item it discusses. @file{ms} provides the
+@code{KS} and @code{KE} macros for this purpose.
+
+You can alternatively specify a @dfn{floating keep}:@: if a keep cannot
+fit on the current page, @file{ms} holds its contents and
+allows material following the keep (in the source document) to fill the
+remainder of the current page. When the page breaks, whether by
+reaching the end or @code{bp} request, @file{ms} puts the floating keep
+at the beginning of the next page. This is useful for placing large
+graphics or tables that do not need to appear exactly where they occur
+in the source document.
+
+@DefmacList {KS, , ms}
+@DefmacItemx {KF, , ms}
+@DefmacListEndx {KE, , ms}
+@code{KS} begins a keep, @code{KF} a floating keep, and @code{KE} ends a
+keep of either kind.
+@endDefmac
+
+As an alternative to the keep mechanism, the @code{ne} request forces a
+page break if there is not at least the amount of vertical space
+specified in its argument remaining on the page (@pxref{Page Control}).
+One application of @code{ne} is to reserve space on the page for a
+figure or illustration to be included later.
+
+@cindex boxes [@file{ms}]
+A @dfn{boxed keep} has a frame drawn around it.
+
+@DefmacList {B1, , ms}
+@DefmacListEndx {B2, , ms}
+@code{B1} begins a keep with a box drawn around it. @code{B2} ends a
+boxed keep.
+@endDefmac
+
+Boxed keep macros cause breaks; if you need to box a word or phrase
+within a line, see the @code{BX} macro in @ref{Typeface and decoration}.
+Box lines are drawn as close as possible to the text they enclose so
+that they are usable within paragraphs. If you wish to box one or more
+paragraphs, you may improve the appearance by calling @code{B1} after
+the first paragraphing macro, and by adding a small amount of vertical
+space before calling @code{B2}.
+
+@c Wrap example at 58 columns.
+@CartoucheExample
+.LP
+.B1
+.I Warning:
+Happy Fun Ball may suddenly accelerate to dangerous
+speeds.
+.sp \n[PD]/2 \" space by half the inter-paragraph distance
+.B2
+@endCartoucheExample
+
+If you want a boxed keep to float, you will need to enclose the
+@code{B1} and @code{B2} calls within a pair of @code{KF} and @code{KE}
+calls.
+
+@cindex displays [@file{ms}]
+@dfn{Displays} turn off filling; lines of verse or program code are
+shown with their lines broken as in the source document without
+requiring @code{br} requests between lines. Displays can be kept on a
+single page or allowed to break across pages. The @code{DS} macro
+begins a kept display of the layout specified in its first argument;
+non-kept displays are begun with dedicated macros corresponding to their
+layout.
+
+@DefmacList {DS, @t{L}, ms}
+@DefmacListEndx {LD, , ms}
+Begin (@code{DS}:@: kept) left-aligned display.
+@endDefmac
+
+@DefmacList {DS, [@t{I} [@Var{indent}]], ms}
+@DefmacListEndx {ID, [@Var{indent}], ms}
+Begin (@code{DS}:@: kept) display indented by @var{indent} if specified,
+and by the amount of the @code{DI} register otherwise.
+@endDefmac
+
+@DefmacList {DS, @t{B}, ms}
+@DefmacListEndx {BD, , ms}
+Begin a (@code{DS}:@: kept) a block display:@: the entire display is
+left-aligned, but indented such that the longest line in the display
+is centered on the page.
+@endDefmac
+
+@DefmacList {DS, @t{C}, ms}
+@DefmacListEndx {CD, , ms}
+Begin a (@code{DS}:@: kept) centered display:@: each line in the display
+is centered.
+@endDefmac
+
+@DefmacList {DS, @t{R}, ms}
+@DefmacListEndx {RD, , ms}
+Begin a (@code{DS}:@: kept) right-aligned display. This is a GNU
+extension.
+@endDefmac
+
+@Defmac {DE, , ms}
+End any display.
+@endDefmac
+
+The distance stored in the @code{DD} register is inserted before and
+after each pair of display macros; this is a Berkeley extension. In
+@code{groff} @file{ms}, this distance replaces any adjacent
+inter-paragraph distance or subsequent spacing prior to a section
+heading. The @code{DI} register is a GNU extension; its value is an
+indentation applied to displays created with @samp{.DS} and @samp{.ID}
+without arguments, to @samp{.DS I} without an indentation argument, and
+to indented equations set with @samp{.EQ}. Changes to either register
+take effect at the next display boundary.
+
+@c ---------------------------------------------------------------------
+
+@node ms Insertions, ms Footnotes, ms keeps and displays, ms Body Text
+@subsubsection Tables, figures, equations, and references
+@cindex @file{ms} macros, tables
+@cindex @file{ms} macros, figures
+@cindex @file{ms} macros, equations
+@cindex @file{ms} macros, references
+@cindex tables [@file{ms}]
+@cindex figures [@file{ms}]
+@cindex equations [@file{ms}]
+@cindex references [@file{ms}]
+
+The @file{ms} package is often used with the @code{tbl}, @code{pic},
+@code{eqn}, and @code{refer} preprocessors.
+@pindex tbl
+@pindex pic
+@pindex eqn
+@pindex refer
+Mark text meant for preprocessors by enclosing it in pairs of tokens
+as follows, with nothing between the dot and the macro name. The
+preprocessors match these tokens only at the start of an input line.
+
+@DefmacList {TS, [@code{H}], ms}
+@DefmacListEndx {TE, , ms}
+Demarcate a table to be processed by the @code{tbl} preprocessor. The
+optional argument@tie{}@code{H} to @code{TS} instructs @file{ms} to
+repeat table rows (often column headings) at the top of each new page
+the table spans, if applicable; calling the @code{TH} macro marks the
+end of such rows. The GNU @cite{tbl@r{(1)}} man page provides a
+comprehensive reference to the preprocessor and offers examples of its
+use.
+@endDefmac
+
+@DefmacList {PS, , ms}
+@DefmacItemx {PE, , ms}
+@DefmacListEndx {PF, , ms}
+@code{PS} begins a picture to be processed by the @command{gpic}
+preprocessor; either of @code{PE} or @code{PF} ends it, the latter with
+``flyback'' to the vertical position at its top. You can create
+@code{pic} input manually or with a program such as @code{xfig}.
+@endDefmac
+
+@DefmacList {EQ, [@Var{align} [@Var{label}]], ms}
+@DefmacListEndx {EN, , ms}
+Demarcate an equation to be processed by the @code{eqn} preprocessor.
+The equation is centered by default; @var{align} can be @samp{C},
+@samp{L}, or @samp{I} to (explicitly) center, left-align, or indent it
+by the amount stored in the @code{DI} register, respectively. If
+specified, @var{label} is set right-aligned.
+@endDefmac
+
+@DefmacList {[, , ms}
+@DefmacListEndx {], , ms}
+Demarcate a bibliographic citation to be processed by the @code{refer}
+preprocessor. The GNU @cite{refer@r{(1)}} man page provides a
+comprehensive reference to the preprocessor and the format of its
+bibliographic database. Type @samp{man refer} at the command line to
+view it.
+@endDefmac
+
+When @code{refer} emits collected references (as might be done on a
+``Works Cited'' page), it interpolates the @code{REFERENCES} string as
+an unnumbered heading (@code{SH}).
+
+@cindex table, multi-page, example [@file{ms}]
+@cindex multi-page table example [@file{ms}]
+The following is an example of how to set up a table that may print
+across two or more pages.
+
+@CartoucheExample
+.TS H
+allbox;
+Cb | Cb .
+Part@arrow{}Description
+_
+.TH
+.T&
+GH-1978@arrow{}Fribulating gonkulator
+@r{@dots{}the rest of the table follows@dots{}}
+.TE
+@endCartoucheExample
+
+@noindent
+Attempting to place a multi-page table inside a keep can lead to
+unpleasant results, particularly if the @code{tbl} @code{allbox} option
+is used.
+
+@cindex equation example [@file{ms}]
+Mathematics can be typeset using the language of the @code{eqn}
+preprocessor.
+
+@CartoucheExample
+.EQ C (\*[SN-NO-DOT]a)
+p ~ = ~ q sqrt @{ ( 1 + ~ ( x / q sup 2 ) @}
+.EN
+@endCartoucheExample
+
+@noindent
+This input formats a labelled equation. We used the @code{SN-NO-DOT}
+string to base the equation label on the current heading number, giving
+us more flexibility to reorganize the document.
+
+Use @command{groff} options to run preprocessors on the input:@:
+@option{-e} for @command{geqn}, @option{-p} for @command{gpic},
+@option{-R} for @command{grefer}, and @option{-t} for @command{gtbl}.
+
+@c ---------------------------------------------------------------------
+
+@node ms Footnotes, , ms Insertions, ms Body Text
+@subsubsection Footnotes
+@cindex @file{ms} macros, footnotes
+@cindex footnotes [@file{ms}]
+
+@cindex footnote marker [@file{ms}]
+@cindex marker, footnote [@file{ms}]
+A footnote is typically anchored to a place in the text with a
+@dfn{marker}, which is a small integer, a symbol such as a dagger, or
+arbitrary user-specified text.
+
+@Defmpstr {*, ms}
+Place an @dfn{automatic number}, an automatically generated numeric
+footnote marker, in the text. Each time this string is interpolated,
+the number it produces increments by one. Automatic numbers start at 1.
+This is a Berkeley extension.
+@endDefesc
+
+Enclose the footnote text in @code{FS} and @code{FE} macro calls to set
+it at the nearest available ``foot'', or bottom, of a text column or
+page.
+
+@DefmacList {FS, [@Var{marker}], ms}
+@DefmacListEndx {FE, , ms}
+Begin (@code{FS}) and end (@code{FE}) a footnote. @code{FS} calls
+@code{FS-MARK} with any supplied @var{marker} argument, which is then
+also placed at the beginning of the footnote text. If @var{marker} is
+omitted, the next pending automatic footnote number enqueued by
+interpolation of the @code{*} string is used, and if none exists,
+nothing is prefixed.
+@endDefmac
+
+You may not desire automatically numbered footnotes in spite of their
+convenience. You can indicate a footnote with a symbol or other text by
+specifying its marker at the appropriate place (for example, by using
+@code{\[dg]} for the dagger glyph) @emph{and} as an argument to the
+@code{FS} macro. Such manual marks should be repeated as arguments to
+@code{FS} or as part of the footnote text to disambiguate their
+correspondence. You may wish to use @code{\*@{} and @code{\*@}} to
+superscript the marker at the anchor point, in the footnote text, or
+both.
+
+@code{groff} @file{ms} provides a hook macro, @code{FS-MARK}, for
+user-determined operations to be performed when the @code{FS} macro is
+called. It is passed the same arguments as @code{FS} itself. An
+application of @code{FS-MARK} is anchor placement for a hyperlink
+reference, so that a footnote can link back to its referential
+context.@footnote{``Portable Document Format Publishing with GNU
+Troff'', @file{pdfmark.ms} in the @code{groff} distribution, uses this
+technique.} By default, this macro has an empty definition.
+@code{FS-MARK} is a GNU extension.
+
+@cindex footnotes, and keeps [@file{ms}]
+@cindex keeps, and footnotes [@file{ms}]
+@cindex footnotes, and displays [@file{ms}]
+@cindex displays, and footnotes [@file{ms}]
+Footnotes can be safely used within keeps and displays, but you should
+avoid using automatically numbered footnotes within floating keeps. You
+can place a second @code{\**} interpolation between a @code{\**} and its
+corresponding @code{FS} call as long as each @code{FS} call occurs
+@emph{after} the corresponding @code{\**} and occurrences of @code{FS}
+are in the same order as corresponding occurrences of @code{\**}.
+
+Footnote text is formatted as paragraphs are, using analogous
+parameters. The registers @code{FI}, @code{FPD}, @code{FPS}, and
+@code{FVS} correspond to @code{PI}, @code{PD}, @code{PS}, and @code{CS},
+respectively; @code{FPD}, @code{FPS}, and @code{FVS} are GNU extensions.
+
+The @code{FF} register controls the formatting of automatically numbered
+footnote paragraphs and those for which @code{FS} is given a marker
+argument. @xref{ms Document Control Settings}.
+
+The default footnote line length is 11/12ths of the normal line length
+for compatibility with the expectations of historical @file{ms}
+documents; you may wish to set the @code{FR} string to @samp{1} to align
+with contemporary typesetting practices. In the
+past,@footnote{Unix Version@tie{}7 @file{ms}, its descendants, and GNU
+@file{ms} prior to @code{groff} version 1.23.0} an @code{FL} register
+was used for the line length in footnotes; however, setting this
+register at document initialization time had no effect on the footnote
+line length in multi-column arrangements.@footnote{You could reset it
+after each call to @code{.1C}, @code{.2C}, or @code{.MC}.}
+
+@code{FR} should be used in preference to the old @code{FL} register in
+contemporary documents. The footnote line length is effectively
+computed as @samp{@slanted{column-width} * \*[FR]}. If an absolute
+footnote line length is required, recall that arithmetic expressions in
+@code{roff} input are evaluated strictly from left to right, with no
+operator precedence (parentheses are honored).
+
+@Example
+.ds FR 0+3i \" Set footnote line length to 3 inches.
+@endExample
+
+@c ---------------------------------------------------------------------
+
+@node ms language and localization, ms Page Layout, ms Footnotes, ms Body Text
+@subsubsection Language and localization
+@cindex @file{ms} macros, language
+@cindex @file{ms} macros, localization
+@cindex language [@file{ms}]
+@cindex localization [@file{ms}]
+
+@code{groff} @file{ms} provides several strings that you can customize
+for your own purposes, or redefine to adapt the macro package to
+languages other than English. It is already localized for
+@c cs, de, fr, it, sv
+Czech, German, French, Italian, and Swedish. Load the desired
+localization macro package after @file{ms}; see the
+@cite{groff_tmac@r{(5)}} man page.
+
+@CartoucheExample
+$ groff -ms -mfr bienvenue.ms
+@endCartoucheExample
+
+The following strings are available.
+
+@Defmpstr {REFERENCES, ms}
+Contains the string printed at the beginning of a references
+(bibliography) page produced with GNU @cite{refer@r{(1)}}. The default
+is @samp{References}.
+@c XXX: Use of refer(1) with ms is insufficiently documented.
+@endDefmpstr
+
+@Defmpstr {ABSTRACT, ms}
+Contains the string printed at the beginning of the abstract. The
+default is @samp{\f[I]ABSTRACT\f[]}; it includes font selection escape
+sequences to set the word in italics.
+@endDefmpstr
+
+@Defmpstr {TOC, ms}
+Contains the string printed at the beginning of the table of contents.
+The default is @samp{Table of Contents}.
+@endDefmpstr
+
+@DefmpstrList {MONTH1, ms}
+@DefmpstrItemx {MONTH2, ms}
+@DefmpstrItemx {MONTH3, ms}
+@DefmpstrItemx {MONTH4, ms}
+@DefmpstrItemx {MONTH5, ms}
+@DefmpstrItemx {MONTH6, ms}
+@DefmpstrItemx {MONTH7, ms}
+@DefmpstrItemx {MONTH8, ms}
+@DefmpstrItemx {MONTH9, ms}
+@DefmpstrItemx {MONTH10, ms}
+@DefmpstrItemx {MONTH11, ms}
+@DefmpstrListEndx {MONTH12, ms}
+Contain the full names of the calendar months. The defaults are in
+English: @samp{January}, @samp{February}, and so on.
+@endDefmpstr
+
+@c ---------------------------------------------------------------------
+
+@node ms Page Layout, Differences from AT&T ms, ms Body Text, ms
+@subsection Page layout
+@cindex @file{ms} macros, page layout
+@cindex page layout [@file{ms}]
+
+@file{ms}'s default page layout arranges text in a single column with
+the page number between hyphens centered in a header on each page except
+the first, and produces no footers. You can customize this arrangement.
+
+@menu
+* ms Headers and Footers::
+* Tab Stops in ms::
+* ms Margins::
+* ms Multiple Columns::
+* ms TOC::
+@end menu
+
+@c ---------------------------------------------------------------------
+
+@node ms Headers and Footers, Tab Stops in ms, ms Page Layout, ms Page Layout
+@subsubsection Headers and footers
+@cindex @file{ms} macros, headers
+@cindex @file{ms} macros, footers
+@cindex headers [@file{ms}]
+@cindex footers [@file{ms}]
+
+There are multiple ways to produce headers and footers. One is to
+define the strings @code{LH}, @code{CH}, and @code{RH} to set the left,
+center, and right headers, respectively; and @code{LF}, @code{CF}, and
+@code{RF} to set the left, center, and right footers. This approach
+suffices for documents that do not distinguish odd- and even-numbered
+pages.
+
+Another method is to call macros that set headers or footers for odd- or
+even-numbered pages. Each such macro takes a delimited argument
+separating the left, center, and right header or footer texts from each
+other. You can replace the neutral apostrophes (@code{'}) shown below
+with any character not appearing in the header or footer text. These
+macros are Berkeley extensions.
+
+@DefmacList {OH, @code{'}@Var{left}@code{'}@Var{center}@code{'}@Var{right}@code{'}, ms}
+@DefmacItemx {EH, @code{'}@Var{left}@code{'}@Var{center}@code{'}@Var{right}@code{'}, ms}
+@DefmacItemx {OF, @code{'}@Var{left}@code{'}@Var{center}@code{'}@Var{right}@code{'}, ms}
+@DefmacListEndx {EF, @code{'}@Var{left}@code{'}@Var{center}@code{'}@Var{right}@code{'}, ms}
+The @code{OH} and @code{EH} macros define headers for odd- (recto)
+and even-numbered (verso) pages, respectively; the @code{OF} and
+@code{EF} macros define footers for them.
+@endDefmac
+
+With either method, a percent sign @code{%} in header or footer text is
+replaced by the current page number. By default, @file{ms} places no
+header on a page numbered ``1'' (regardless of its number format).
+
+@Defmac {P1, , ms}
+Typeset the header even on page@tie{}1. To be effective, this macro
+must be called before the header trap is sprung on any page numbered
+``1''; in practice, unless your page numbering is unusual, this means
+that you should call it early, before @code{TL} or any heading or
+paragraphing macro. This is a Berkeley extension.
+@endDefmac
+
+For even greater flexibility, @file{ms} is designed to permit the
+redefinition of the macros that are called when the @code{groff} traps
+that ordinarily cause the headers and footers to be output are sprung.
+@code{PT} (``page trap'') is called by @file{ms} when the header is to
+be written, and @code{BT} (``bottom trap'') when the footer is to be.
+The @code{groff} page location trap that @file{ms} sets up to format the
+header also calls the (normally undefined) @code{HD} macro after
+@code{PT}; you can define @code{HD} if you need additional processing
+after setting the header (for example, to draw a line below it).
+@c Although undocumented in Tuthill's 4.2BSD ms.diffs paper...
+The @code{HD} hook is a Berkeley extension. Any such macros you
+(re)define must implement any desired specialization for odd-, even-, or
+first numbered pages.
+
+@c ---------------------------------------------------------------------
+
+@node Tab Stops in ms, ms Margins, ms Headers and Footers, ms Page Layout
+@subsubsection Tab stops
+
+Use the @code{ta} request to define tab stops as needed. @xref{Tabs and
+Fields}.
+
+@Defmac {TA, , ms}
+Reset the tab stops to the @file{ms} default (every 5 ens).
+Redefine this macro to create a different set of default tab stops.
+@endDefmac
+
+@c ---------------------------------------------------------------------
+
+@node ms Margins, ms Multiple Columns, Tab Stops in ms, ms Page Layout
+@subsubsection Margins
+@cindex @file{ms} macros, margins
+
+Control margins using the registers summarized in ``Margin settings'' in
+@ref{ms Document Control Settings} above. There is no setting for the
+right margin; the combination of page offset @code{\n[PO]} and line
+length @code{\n[LL]} determines it.
+
+@c ---------------------------------------------------------------------
+
+@node ms Multiple Columns, ms TOC, ms Margins, ms Page Layout
+@subsubsection Multiple columns
+@cindex @file{ms} macros, multiple columns
+@cindex multiple columns [@file{ms}]
+
+@file{ms} can set text in as many columns as reasonably fit on the page.
+The following macros force a page break if a multi-column layout is
+active when they are called. The @code{MINGW} register stores the
+default minimum gutter width; it is a GNU extension. When multiple
+columns are in use, keeps and the @code{HORPHANS} and @code{PORPHANS}
+registers work with respect to column breaks instead of page breaks.
+
+@Defmac {1C, , ms}
+Arrange page text in a single column (the default).
+@endDefmac
+
+@Defmac {2C, , ms}
+Arrange page text in two columns.
+@endDefmac
+
+@Defmac {MC, [@Var{column-width} [@Var{gutter-width}]], ms}
+Arrange page text in multiple columns. If you specify no arguments, it
+is equivalent to the @code{2C} macro. Otherwise, @var{column-width} is
+the width of each column and @var{gutter-width} is the minimum distance
+between columns.
+@endDefmac
+
+@c ---------------------------------------------------------------------
+
+@node ms TOC, Differences from AT&T ms, ms Multiple Columns, ms Page Layout
+@subsubsection Creating a table of contents
+@cindex @file{ms} macros, creating table of contents
+@cindex table of contents, creating [@file{ms}]
+
+Because @code{roff} formatters process their input in a single pass,
+material on page 50, for example, cannot influence what appears on
+page@tie{}1---this poses a challenge for a table of contents at its
+traditional location in front matter, if you wish to avoid manually
+maintaining it. @file{ms} enables the collection of material to be
+presented in the table of contents as it appears, saving its page number
+along with it, and then emitting the collected contents on demand toward
+the end of the document. The table of contents can then be resequenced
+to its desired location by physically rearranging the pages of a printed
+document, or as part of post-processing---with a @cite{sed@r{(1)}}
+script to reorder the pages in @command{troff}'s output, with
+@cite{pdfjam@r{(1)}}, or with @cite{gropdf@r{(1)}}'s
+@samp{.pdfswitchtopage} feature, for example.
+
+Define an entry to appear in the table of contents by bracketing its
+text between calls to the @code{XS} and @code{XE} macros. A typical
+application is to call them immediately after @code{NH} or @code{SH} and
+repeat the heading text within them. The @code{XA} macro, used within
+@samp{.XS}/@samp{.XE} pairs, supplements an entry---for instance, when
+it requires multiple output lines, whether because a heading is too long
+to fit or because style dictates that page numbers not be repeated. You
+may wish to indent the text thus wrapped to correspond to its heading
+depth; this can be done in the entry text by prefixing it with tabs or
+horizontal motion escape sequences, or by providing a second argument to
+the @code{XA} macro. @code{XS} and @code{XA} automatically associate
+the page number where they are called with the text following them, but
+they accept arguments to override this behavior. At the end of the
+document, call @code{TC} or @code{PX} to emit the table of contents;
+@code{TC} resets the page number to @samp{i} (Roman numeral one), and
+then calls @code{PX}. All of these macros are Berkeley extensions.
+
+@DefmacList {XS, [@Var{page-number}], ms}
+@DefmacItemx {XA, [@Var{page-number} [@Var{indentation}]], ms}
+@DefmacListEndx {XE, , ms}
+Begin, supplement, and end a table of contents entry. Each entry is
+associated with @var{page-number} (otherwise the current page number); a
+@var{page-number} of @samp{no} prevents a leader and page number from
+being emitted for that entry. Use of @code{XA} within
+@code{XS}/@code{XE} is optional; it can be repeated. If
+@var{indentation} is present, a supplemental entry is indented by that
+amount; ens are assumed if no unit is indicated. Text on input lines
+between @code{XS} and @code{XE} is stored for later recall by @code{PX}.
+@endDefmac
+
+@Defmac {PX, [@code{no}], ms}
+Switch to single-column layout. Unless @code{no} is specified, center
+and interpolate the @code{TOC} string in bold and two points larger than
+the body text. Emit the table of contents entries.
+@endDefmac
+
+@Defmac {TC, [@code{no}], ms}
+Set the page number to@tie{}1, the page number format to lowercase Roman
+numerals, and call @code{PX} (with a @code{no} argument, if present).
+@endDefmac
+
+Here's an example of typical @file{ms} table of contents preparation.
+We employ horizontal escape sequences @code{\h} to indent the entries by
+sectioning depth.
+
+@CartoucheExample
+.NH 1
+Introduction
+.XS
+Introduction
+.XE
+@r{@dots{}}
+.NH 2
+Methodology
+.XS
+\h'2n'Methodology
+.XA
+\h'4n'Fassbinder's Approach
+\h'4n'Kahiu's Approach
+.XE
+@r{@dots{}}
+.NH 1
+Findings
+.XS
+Findings
+.XE
+@r{@dots{}}
+.TC
+@endCartoucheExample
+
+The remaining features in this subsubsection are GNU extensions.
+@code{groff} @file{ms} obviates the need to repeat heading text after
+@code{XS} calls. Call @code{XN} and @code{XH} after @code{NH} and
+@code{SH}, respectively.
+
+@DefmacList {XN, @Var{heading-text}, ms}
+@DefmacListEndx {XH, @Var{depth} @Var{heading-text}, ms}
+Format @var{heading-text} and create a corresponding table of contents
+entry. @code{XN} computes the indentation from the depth of the
+preceding @code{NH} call; @code{XH} requires a @var{depth} argument to
+do so.
+@endDefmac
+
+@code{groff} @file{ms} encourages customization of table of contents
+entry production.
+
+@DefmacList {XN-REPLACEMENT, @Var{heading-text}, ms}
+@DefmacListEndx {XH-REPLACEMENT, @Var{depth} @Var{heading-text}, ms}
+These hook macros implement @code{XN} and @code{XH}, respectively.
+They call @code{XN-INIT} and pass their @var{heading-text} arguments to
+@code{XH-UPDATE-TOC}.
+@endDefmac
+
+@DefmacList {XN-INIT, , ms}
+@DefmacListEndx {XH-UPDATE-TOC, @Var{depth} @Var{heading-text}, ms}
+The @code{XN-INIT} hook macro does nothing by default.
+@code{XH-UPDATE-TOC} brackets @var{heading-text} with @code{XS} and
+@code{XE} calls, indenting it by 2 ens per level of @var{depth} beyond
+the first.
+@endDefmac
+
+We could therefore produce a table of contents similar to that in the
+previous example with fewer macro calls. (The difference is that this
+input follows the ``Approach'' entries with leaders and page numbers.)
+
+@CartoucheExample
+.NH 1
+.XN Introduction
+@r{@dots{}}
+.NH 2
+.XN Methodology
+.XH 3 "Fassbinder's Approach"
+.XH 3 "Kahiu's Approach"
+@r{@dots{}}
+.NH 1
+.XN Findings
+@r{@dots{}}
+@endCartoucheExample
+
+To get the section number of the numbered headings into the table of
+contents entries, we might define @code{XN-REPLACEMENT} as follows.
+(We obtain the heading depth from @code{groff} @file{ms}'s internal
+register @code{nh*hl}.)
+
+@CartoucheExample
+.de XN-REPLACEMENT
+.XN-INIT
+.XH-UPDATE-TOC \\n[nh*hl] \\$@@
+\&\\*[SN] \\$*
+..
+@endCartoucheExample
+
+You can change the style of the leader that bridges each table of
+contents entry with its page number; define the @code{TC-LEADER} special
+character by using the @code{char} request. A typical leader combines
+the dot glyph @samp{.} with a horizontal motion escape sequence to
+spread the dots. The width of the page number field is stored in the
+@code{TC-MARGIN} register.
+
+@c ---------------------------------------------------------------------
+
+@node Differences from AT&T ms, ms Naming Conventions, ms Page Layout, ms
+@subsection Differences from @acronym{AT&T} @file{ms}
+@cindex @file{ms} macros, @code{groff} differences from @acronym{AT&T}
+@cindex @acronym{AT&T} @file{ms}, macro package differences
+
+The @code{groff} @file{ms} macros are an independent reimplementation,
+using no @acronym{AT&T} code. Since they take advantage of the extended
+features of @code{groff}, they cannot be used with @acronym{AT&T}
+@code{troff}. @code{groff} @file{ms} supports features described above
+as Berkeley and Tenth Edition Research Unix extensions, and adds several
+of its own.
+
+@itemize @bullet
+@item
+The internals of @code{groff} @file{ms} differ from the internals of
+@acronym{AT&T} @file{ms}. Documents that depend upon implementation
+details of @acronym{AT&T} @file{ms} may not format properly with
+@code{groff} @file{ms}. Such details include macros whose function was
+not documented in the @acronym{AT&T} @file{ms}
+manual.@footnote{@cite{Typing Documents on the UNIX System: Using the
+-ms Macros with Troff and Nroff}, M.@tie{}E.@: Lesk, Bell Laboratories,
+1978}
+@c XXX: We support RT anyway; maybe we should stop?
+
+@item
+The error-handling policy of @code{groff} @file{ms} is to detect and
+report errors, rather than to ignore them silently.
+
+@item
+Tenth Edition @c possibly 9th
+Research Unix supported @code{P1}/@code{P2} macros to bracket code
+examples; @code{groff} @file{ms} does not.
+
+@item
+@code{groff} @file{ms} does not work in GNU @code{troff}'s
+@acronym{AT&T} compatibility mode. If loaded when that mode is enabled,
+it aborts processing with a diagnostic message.
+
+@item
+Multiple line spacing is not supported. Use a larger vertical spacing
+instead.
+
+@item
+@code{groff} @file{ms} uses the same header and footer defaults in both
+@code{nroff} and @code{troff} modes as @acronym{AT&T} @file{ms} does in
+@code{troff} mode; @acronym{AT&T}'s default in @code{nroff} mode is to
+put the date, in U.S.@: traditional format (e.g., ``January 1, 2021''),
+in the center footer (the @code{CF} string).
+
+@item
+Many @code{groff} @file{ms} macros, including those for paragraphs,
+headings, and displays, cause a reset of paragraph rendering parameters,
+and may change the indentation; they do so not by incrementing or
+decrementing it, but by setting it absolutely. This can cause problems
+for documents that define additional macros of their own that try to
+manipulate indentation. Use the @file{ms} @code{RS} and @code{RE}
+macros instead of the @code{in} request.
+
+@item
+@cindex fractional type sizes in @file{ms} macros
+@cindex @file{ms} macros, fractional type sizes in
+@acronym{AT&T} @file{ms} interpreted the values of the registers
+@code{PS} and @code{VS} in points, and did not support the use of
+scaling units with them. @code{groff} @file{ms} interprets values of
+the registers @code{PS}, @code{VS}, @code{FPS}, and @code{FVS} equal to
+or larger than@tie{}1,000 (one thousand) as decimal fractions multiplied
+by@tie{}1,000.@footnote{Register values are converted to and stored as
+basic units. @xref{Measurements}.} This threshold makes use of a
+scaling unit with these parameters practical for high-resolution
+devices while preserving backward compatibility. It also permits
+expression of non-integral type sizes. For example, @samp{groff
+-rPS=10.5p} at the shell prompt is equivalent to placing @samp{.nr PS
+10.5p} at the beginning of the document.
+
+@item
+@acronym{AT&T} @file{ms}'s @code{AU} macro supported arguments used with
+some document types; @code{groff} @file{ms} does not.
+
+@item
+Right-aligned displays are available. The @acronym{AT&T} @file{ms}
+manual observes that ``it is tempting to assume that @samp{.DS R} will
+right adjust lines, but it doesn't work''. In @code{groff} @file{ms},
+it does.
+
+@item
+To make @code{groff} @file{ms} use the default page offset (which also
+specifies the left margin), the @code{PO} register must stay undefined
+until the first @file{ms} macro is called.
+
+This implies that @samp{\n[PO]} should not be used early in the
+document, unless it is changed also: accessing an undefined register
+automatically defines it.
+
+@item
+@code{groff} @file{ms} supports the @code{PN} register, but it is not
+necessary; you can access the page number via the usual @code{%}
+register and invoke the @code{af} request to assign a different format
+to it if desired.@footnote{If you redefine the @file{ms} @code{PT} macro
+@c I wouldn't mention that, but Lesk 1978 encourages doing so. :-/
+and desire special treatment of certain page numbers (like @samp{1}),
+you may need to handle a non-Arabic page number format, as @code{groff}
+@file{ms}'s @code{PT} does; see the macro package source. @code{groff}
+@file{ms} aliases the @code{PN} register to @code{%}.}
+
+@item
+The @acronym{AT&T} @file{ms} manual documents registers @code{CW} and
+@code{GW} as setting the default column width and ``intercolumn gap'',
+respectively, and which applied when @code{MC} was called with fewer
+than two arguments. @code{groff} @file{ms} instead treats @code{MC}
+without arguments as synonymous with @code{2C}; there is thus no
+occasion for a default column width register. Further, the @code{MINGW}
+register and the second argument to @code{MC} specify a @emph{minimum}
+space between columns, not the fixed gutter width of @acronym{AT&T}
+@file{ms}.
+
+@item
+The @acronym{AT&T} @file{ms} manual did not document the @code{QI}
+register; Berkeley and @code{groff} @file{ms} do.
+@end itemize
+
+@Defmpreg {GS, ms}
+The register @code{GS} is set to@tie{}1 by the @code{groff} @file{ms}
+macros, but is not used by the @acronym{AT&T} @file{ms} package.
+Documents that need to determine whether they are being formatted with
+@code{groff} @file{ms} or another implementation should test this
+register.
+@endDefmpreg
+
+@menu
+* Missing Unix Version 7 ms Macros::
+@end menu
+
+@c ---------------------------------------------------------------------
+
+@node Missing Unix Version 7 ms Macros, , Differences from AT&T ms, Differences from AT&T ms
+@subsubsection Unix Version 7 @file{ms} macros not implemented by @code{groff} @file{ms}
+
+Several macros described in the Unix Version@tie{}7 @file{ms}
+documentation are unimplemented by @code{groff} @file{ms} because they
+are specific to the requirements of documents produced internally by
+Bell Laboratories, some of which also require a glyph for the Bell
+System logo that @code{groff} does not support. These macros
+implemented several document type formats
+(@code{EG}, @c engineer's notes
+@code{IM}, @c internal memorandum
+@code{MF}, @c memorandum for file
+@code{MR}, @c memorandum for record
+@code{TM}, @c technical memorandum
+@code{TR}), @c technical report
+were meaningful only in conjunction with the use of certain document
+types
+(@code{AT}, @c attachments
+@code{CS}, @c cover sheet info for `TM` documents
+@code{CT}, @c copies to
+@code{OK}, @c "other keywords" for `TM` documents
+@code{SG}), @c signatures for `TM` documents
+stored the postal addresses of Bell Labs sites
+(@code{HO}, @c Holmdel
+@code{IH}, @c Naperville
+@code{MH}, @c Murray Hill
+@code{PY}, @c Piscataway
+@code{WH}), @c Whippany
+or lacked a stable definition over time
+(@code{UX}). @c Unix; on 1st use, add footnote id'ing trademark owner
+To compatibly render historical @file{ms} documents using these macros,
+we advise your documents to invoke the @code{rm} request to remove any
+such macros it uses and then define replacements with an authentically
+typeset original at hand.@footnote{The removal beforehand is necessary
+because @code{groff} @file{ms} aliases these macros to a diagnostic
+macro, and you want to redefine the aliased name, not its target.} For
+informal purposes, a simple definition of @code{UX} should maintain the
+readability of the document's substance.
+
+@CartoucheExample
+.rm UX
+.ds UX Unix\"
+@endCartoucheExample
+
+@c ---------------------------------------------------------------------
+
+@node ms Legacy Features, ms Naming Conventions, Differences from AT&T ms, ms
+@subsection Legacy Features
+@cindex @file{ms} macros, strings
+@cindex @file{ms} macros, special characters
+@cindex @file{ms} macros, accent marks
+@cindex accent marks [@file{ms}]
+@cindex special characters [@file{ms}]
+@cindex strings [@file{ms}]
+
+@code{groff} @file{ms} retains some legacy features solely to support
+formatting of historical documents; contemporary ones should not use
+them because they can render poorly. See the @cite{groff_char@r{(7)}}
+man page.
+
+@unnumberedsubsubsec AT&T accent mark strings
+
+AT&T @file{ms} defined accent mark strings as follows.
+
+@Defmpstr {@code{'}, ms}
+Apply acute accent to subsequent glyph.
+@endDefmpstr
+
+@Defmpstr {@code{`}, ms}
+Apply grave accent to subsequent glyph.
+@endDefmpstr
+
+@Defmpstr {:, ms}
+Apply dieresis (umlaut) to subsequent glyph.
+@endDefmpstr
+
+@Defmpstr {^, ms}
+Apply circumflex accent to subsequent glyph.
+@endDefmpstr
+
+@Defmpstr {~, ms}
+Apply tilde accent to subsequent glyph.
+@endDefmpstr
+
+@Defmpstr {C, ms}
+Apply caron to subsequent glyph.
+@endDefmpstr
+
+@Defmpstr {\,, ms}
+Apply cedilla to subsequent glyph.
+@endDefmpstr
+
+@unnumberedsubsubsec Berkeley accent mark and glyph strings
+
+Berkeley @file{ms} offered an @code{AM} macro; calling it redefined the
+AT&T accent mark strings (except for @samp{\*C}), applied them to the
+@emph{preceding} glyph, and defined additional strings, some for spacing
+glyphs.
+
+@Defmac {AM, , ms}
+Enable alternative accent mark and glyph-producing strings.
+@endDefmac
+
+@Defmpstr {@code{'}, ms}
+Apply acute accent to preceding glyph.
+@endDefmpstr
+
+@Defmpstr {@code{`}, ms}
+Apply grave accent to preceding glyph.
+@endDefmpstr
+
+@Defmpstr {:, ms}
+Apply dieresis (umlaut) to preceding glyph.
+@endDefmpstr
+
+@Defmpstr {^, ms}
+Apply circumflex accent to preceding glyph.
+@endDefmpstr
+
+@Defmpstr {~, ms}
+Apply tilde accent to preceding glyph.
+@endDefmpstr
+
+@Defmpstr {\,, ms}
+Apply cedilla to preceding glyph.
+@endDefmpstr
+
+@Defmpstr {/, ms}
+Apply stroke (slash) to preceding glyph.
+@endDefmpstr
+
+@Defmpstr {v, ms}
+Apply caron to preceding glyph.
+@endDefmpstr
+
+@Defmpstr {_, ms}
+Apply macron to preceding glyph.
+@endDefmpstr
+
+@Defmpstr {., ms}
+Apply underdot to preceding glyph.
+@endDefmpstr
+
+@Defmpstr {o, ms}
+Apply ring accent to preceding glyph.
+@endDefmpstr
+
+@Defmpstr {?, ms}
+Interpolate inverted question mark.
+@endDefmpstr
+
+@Defmpstr {!, ms}
+Interpolate inverted exclamation mark.
+@endDefmpstr
+
+@Defmpstr {8, ms}
+Interpolate small letter sharp s.
+@endDefmpstr
+
+@Defmpstr {q, ms}
+Interpolate small letter o with hook accent (ogonek).
+@endDefmpstr
+
+@Defmpstr {3, ms}
+Interpolate small letter yogh.
+@endDefmpstr
+
+@Defmpstr {d-, ms}
+Interpolate small letter eth.
+@endDefmpstr
+
+@Defmpstr {D-, ms}
+Interpolate capital letter eth.
+@endDefmpstr
+
+@Defmpstr {th, ms}
+Interpolate small letter thorn.
+@endDefmpstr
+
+@Defmpstr {Th, ms}
+Interpolate capital letter thorn.
+@endDefmpstr
+
+@Defmpstr {ae, ms}
+Interpolate small æ ligature.
+@endDefmpstr
+
+@Defmpstr {Ae, ms}
+Interpolate capital Æ ligature.
+@endDefmpstr
+
+@Defmpstr {oe, ms}
+Interpolate small oe ligature.
+@endDefmpstr
+
+@Defmpstr {OE, ms}
+Interpolate capital OE ligature.
+@endDefmpstr
+
+@c ---------------------------------------------------------------------
+
+@node ms Naming Conventions, , ms Legacy Features, ms
+@subsection Naming Conventions
+@cindex @file{ms} macros, naming conventions
+@cindex naming conventions, @file{ms} macros
+
+The following conventions are used for names of macros, strings, and
+registers. External names available to documents that use the
+@code{groff} @file{ms} macros contain only uppercase letters and digits.
+
+Internally, the macros are divided into modules. Conventions for
+identifier names are as follows.
+
+@itemize @bullet
+@item
+Names used only within one module are of the form
+@var{module}@code{*}@var{name}.
+
+@item
+Names used outside the module in which they are defined are of the form
+@var{module}@code{@@}@var{name}.
+
+@item
+Names associated with a particular environment are of the form
+@var{environment}@code{:}@var{name}; these are used only within the
+@code{par} module.
+
+@item
+@var{name} does not have a module prefix.
+
+@item
+Constructed names used to implement arrays are of the form
+@var{array}@code{!}@var{index}.
+@end itemize
+
+Thus the @code{groff} @file{ms} macros reserve the following names.
+
+@itemize @bullet
+@item
+Names containing the characters @code{*}, @code{@@}, and@tie{}@code{:}.
+
+@item
+Names containing only uppercase letters and digits.
+@end itemize
+
+
+@c =====================================================================
+@c =====================================================================
+
+@node GNU troff Reference, File Formats, Major Macro Packages, Top
+@chapter GNU @code{troff} Reference
+@cindex reference, @code{gtroff}
+@cindex @code{gtroff}, reference
+
+This chapter covers @emph{all} of the facilities of the GNU
+@code{troff} formatting engine. Users of macro packages may skip it if
+not interested in details.
+
+
+@menu
+* Text::
+* Page Geometry::
+* Measurements::
+* Numeric Expressions::
+* Identifiers::
+* Formatter Instructions::
+* Comments::
+* Registers::
+* Manipulating Filling and Adjustment::
+* Manipulating Hyphenation::
+* Manipulating Spacing::
+* Tabs and Fields::
+* Character Translations::
+* @code{troff} and @code{nroff} Modes::
+* Line Layout::
+* Line Continuation::
+* Page Layout::
+* Page Control::
+* Using Fonts::
+* Manipulating Type Size and Vertical Spacing::
+* Colors::
+* Strings::
+* Conditionals and Loops::
+* Writing Macros::
+* Page Motions::
+* Drawing Geometric Objects::
+* Deferring Output::
+* Traps::
+* Diversions::
+* Punning Names::
+* Environments::
+* Suppressing Output::
+* I/O::
+* Postprocessor Access::
+* Miscellaneous::
+* Gtroff Internals::
+* Debugging::
+* Implementation Differences::
+@end menu
+
+
+@c =====================================================================
+
+@c BEGIN Keep roughly parallel with roff(7) section "Concepts".
+@node Text, Measurements, GNU troff Reference, GNU troff Reference
+@section Text
+@cindex text, GNU @code{troff} processing
+
+@acronym{AT&T} @code{troff} was designed to take input as it would be
+composed on a typewriter, including the teletypewriters used as early
+computer terminals, and relieve the user drafting a document of concern
+with details like line length, hyphenation breaking, and the achievement
+of straight margins. Early in its development, the program gained the
+ability to prepare output for a phototypesetter; a document could then
+be prepared for output to either a teletypewriter, a phototypesetter, or
+both. GNU @code{troff} continues this tradition of permitting an author
+to compose a single master version of a document which can then be
+rendered for a variety of output formats or devices.
+
+@code{roff} input files contain text interspersed with instructions to
+control the formatter. Even in the absence of such instructions, GNU
+@code{troff} still processes its input in several ways, by filling,
+hyphenating, breaking, and adjusting it, and supplementing it with
+inter-sentence space.
+
+@menu
+* Filling::
+* Hyphenation::
+* Sentences::
+* Breaking::
+* Adjustment::
+* Tabs and Leaders::
+* Requests and Macros::
+* Macro Packages::
+* Input Encodings::
+* Input Conventions::
+@end menu
+
+@c ---------------------------------------------------------------------
+
+@node Filling, Sentences, Text, Text
+@subsection Filling
+
+When GNU @code{troff} starts up, it obtains information about the device
+for which it is preparing output.@footnote{@xref{Device and Font
+Description Files}.} An essential property is the length of the output
+line, such as ``6.5 inches''.
+
+@cindex word, definition of
+@cindex filling
+GNU @code{troff} interprets plain text files employing the Unix
+line-ending convention. It reads input a character at a time,
+collecting words as it goes, and fits as many words together on an
+output line as it can---this is known as @dfn{filling}. To GNU
+@code{troff}, a @dfn{word} is any sequence of one or more characters
+that aren't spaces or newlines. The exceptions separate
+words.@footnote{@slanted{Tabs} and @slanted{leaders} also separate
+words. @slanted{Escape sequences} can function as word characters, word
+separators, or neither---the last simply have no effect on GNU
+@code{troff}'s idea of whether an input character is within a word.
+We'll discuss all of these in due course.} To disable filling, see
+@ref{Manipulating Filling and Adjustment}.
+
+@Example
+It is a truth universally acknowledged
+that a single man in possession of a
+good fortune must be in want of a wife.
+ @result{} It is a truth universally acknowledged that a
+ @result{} single man in possession of a good fortune must
+ @result{} be in want of a wife.
+@endExample
+
+@c ---------------------------------------------------------------------
+
+@node Sentences, Hyphenation, Filling, Text
+@subsection Sentences
+@cindex sentences
+
+A passionate debate has raged for decades among writers of the English
+language over whether more space should appear between adjacent
+sentences than between words within a sentence, and if so, how much, and
+what other circumstances should influence this spacing.@footnote{A
+well-researched jeremiad appreciated by @code{groff} contributors on
+both sides of the sentence-spacing debate can be found at
+@uref{https://web.archive.org@//web@//20171217060354@//http://www.heracliteanriver.com@//?p=324}.}
+GNU @code{troff} follows the example of @acronym{AT&T} @code{troff};
+it attempts to detect the boundaries between sentences, and supplies
+additional inter-sentence space between them.
+
+@Example
+Hello, world!
+Welcome to groff.
+ @result{} Hello, world! Welcome to groff.
+@endExample
+
+@cindex end-of-sentence characters
+@cindex sentence space
+@cindex space between sentences
+@cindex French spacing
+GNU @code{troff} flags certain characters (normally @samp{!}, @samp{?},
+and @samp{.}) as potentially ending a sentence. When GNU @code{troff}
+encounters one of these @dfn{end-of-sentence characters} at the end of
+an input line, or one of them is followed by two (unescaped) spaces on
+the same input line, it appends an inter-word space followed by an
+inter-sentence space in the output.
+
+@Example
+R. Harper subscribes to a maxim of P. T. Barnum.
+ @result{} R. Harper subscribes to a maxim of P. T. Barnum.
+@endExample
+
+In the above example, inter-sentence space is not added after @samp{P.}
+or @samp{T.} because the periods do not occur at the end of an input
+line, nor are they followed by two or more spaces. Let's imagine that
+we've heard something about defamation from Mr.@: Harper's attorney,
+recast the sentence, and reflowed it in our text editor.
+
+@Example
+I submit that R. Harper subscribes to a maxim of P. T.
+Barnum.
+ @result{} I submit that R. Harper subscribes to a maxim of
+ @result{} P. T. Barnum.
+@endExample
+
+``Barnum'' doesn't begin a sentence! What to do? Let us meet our first
+@dfn{escape sequence}, a series of input characters that give
+instructions to GNU @code{troff} instead of being used to construct
+output device glyphs.@footnote{This statement oversimplifies; there are
+escape sequences whose purpose is precisely to produce glyphs on the
+output device, and input characters that @emph{aren't} part of escape
+sequences can undergo a great deal of processing before getting to the
+output.} An escape sequence begins with the backslash character @code{\}
+by default, an uncommon character in natural language text, and is
+@emph{always} followed by at least one other character, hence the term
+``sequence''.
+
+@cindex @code{\&}, at end of sentence
+The dummy character escape sequence @code{\&} can be used after an
+end-of-sentence character to defeat end-of-sentence detection on a
+per-instance basis. We can therefore rewrite our input more
+defensively.
+
+@Example
+I submit that R.\& Harper subscribes to a maxim of P.\&
+T.\& Barnum.
+ @result{} I submit that R. Harper subscribes to a maxim of
+ @result{} P. T. Barnum.
+@endExample
+
+Adding text caused our input to wrap; now, we don't need @code{\&} after
+@samp{T.} but we do after @samp{P.}. Consistent use of the escape
+sequence ensures that potential sentence boundaries are robust to
+editing activities. Further advice along these lines will follow in
+@ref{Input Conventions}.
+
+@cindex end-of-sentence transparent characters
+@cindex characters, end-of-sentence transparent
+@cindex @code{dg} glyph, at end of sentence
+@cindex @code{dd} glyph, at end of sentence
+@cindex @code{rq} glyph, at end of sentence
+@cindex @code{cq} glyph, at end of sentence
+@cindex @code{"}, at end of sentence
+@cindex @code{'}, at end of sentence
+@cindex @code{)}, at end of sentence
+@cindex @code{]}, at end of sentence
+@cindex @code{*}, at end of sentence
+@cindex special characters
+@cindex characters, special
+Normally, the occurrence of a visible non-end-of-sentence character (as
+opposed to a space or tab) immediately after an end-of-sentence
+character cancels detection of the end of a sentence. For example, it
+would be incorrect for GNU @code{troff} to infer the end of a sentence
+after the dot in @samp{3.14159}. However, several characters are
+treated @emph{transparently} after the occurrence of an end-of-sentence
+character. That is, GNU @code{troff} does not cancel end-of-sentence
+detection when it processes them. This is because such characters are
+often used as footnote markers or to close quotations and
+parentheticals. The default set is @samp{"}, @samp{'}, @samp{)},
+@samp{]}, @samp{*}, @code{\[dg]}, @code{\[dd]}, @code{\[rq]}, and
+@code{\[cq]}. The last four are examples of @dfn{special characters},
+escape sequences whose purpose is to obtain glyphs that are not easily
+typed at the keyboard, or which have special meaning to GNU @code{troff}
+(like @code{\} itself).@footnote{The mnemonics for the special
+characters shown here are ``dagger'', ``double dagger'', ``right
+(double) quote'', and ``closing (single) quote''. See the
+@cite{groff_char@r{(7)}} man page.}
+
+@Example
+\[lq]The idea that the poor should have leisure has always
+been shocking to the rich.\[rq]
+(Bertrand Russell, 1935)
+@c XXX: @iftex puts a blank line on the output. This seems like a bug.
+@c @newline works around it. But we need a weird inverse indent.
+@iftex @
+ @result{} @quotedblleft{}The idea that the poor should have
+ @result{} leisure has always been shocking to
+ @result{} the rich.@quotedblright{} (Bertrand Russell, 1935)
+@end iftex
+@ifnottex
+ @result{} "The idea that the poor should have
+ @result{} leisure has always been shocking to
+ @result{} the rich." (Bertrand Russell, 1935)
+@end ifnottex
+@endExample
+
+The sets of characters that potentially end sentences or are transparent
+to sentence endings are configurable. See the @code{cflags} request in
+@ref{Using Symbols}. To change the additional inter-sentence space
+amount---even to remove it entirely---see @ref{Manipulating Filling and
+Adjustment}.
+
+@c ---------------------------------------------------------------------
+
+@node Hyphenation, Breaking, Sentences, Text
+@subsection Hyphenation
+@cindex hyphenation
+
+When an output line is nearly full, it is uncommon for the next word
+collected from the input to exactly fill it---typically, there is room
+left over only for part of the next word. The process of splitting a
+word so that it appears partially on one line (with a hyphen to indicate
+to the reader that the word has been broken) with its remainder on the
+next is @dfn{hyphenation}. Hyphenation points can be manually
+specified; GNU @code{troff} also uses a hyphenation algorithm and
+language-specific pattern files (based on those used in @TeX{}) to
+decide which words can be hyphenated and where.
+
+Hyphenation does not always occur even when the hyphenation rules for a
+word allow it; it can be disabled, and when not disabled there are
+several parameters that can prevent it in certain circumstances.
+@xref{Manipulating Hyphenation}.
+
+@c ---------------------------------------------------------------------
+
+@node Breaking, Adjustment, Hyphenation, Text
+@subsection Breaking
+@cindex break
+@cindex implicit line break
+@cindex line break, output
+@cindex output line break
+
+Once an output line is full, the next word (or remainder of a hyphenated
+one) is placed on a different output line; this is called a @dfn{break}.
+In this manual and in @code{roff} discussions generally, a ``break'' if
+not further qualified always refers to the termination of an output
+line. When the formatter is filling text, it introduces breaks
+automatically to keep output lines from exceeding the configured line
+length. After an automatic break, GNU @code{troff} adjusts the line if
+applicable (see below), and then resumes collecting and filling text on
+the next output line.
+
+Sometimes, a line cannot be broken automatically. This usually does
+not happen with natural language text unless the output line length has
+been manipulated to be extremely short, but it can with specialized
+text like program source code. We can use @code{perl} at the shell
+prompt to contrive an example of failure to break the line. We also
+employ the @option{-z} option to suppress normal output.
+
+@Example
+$ perl -e 'print "#" x 80, "\n";' | nroff -z
+ @error{} warning: cannot break line
+@endExample
+
+The remedy for these cases is to tell GNU @code{troff} where the line
+may be broken without hyphens. This is done with the non-printing break
+point escape sequence @samp{\:}; see @ref{Manipulating Hyphenation}.
+
+@cindex blank line
+@cindex empty line
+@cindex line, blank
+@cindex blank line macro (@code{blm})
+What if the document author wants to stop filling lines temporarily, for
+instance to start a new paragraph? There are several solutions. A
+blank input line not only causes a break, but by default it also outputs
+a one-line vertical space (effectively a blank output line). This
+behavior can be modified; see @ref{Blank Line Traps}. Macro packages
+may discourage or disable the blank line method of paragraphing in favor
+of their own macros.
+
+@cindex leading spaces
+@cindex spaces, leading and trailing
+@cindex trailing spaces on text lines
+@cindex leading space macro (@code{lsm})
+A line that begins with one or more spaces causes a break. The spaces
+are output at the beginning of the next line without being
+@emph{adjusted} (see below); however, this behavior can be modified
+(@pxref{Leading Space Traps}). Again, macro packages may provide other
+methods of producing indented paragraphs. Trailing spaces on text lines
+are discarded.@footnote{``Text lines'' are defined in @ref{Requests and
+Macros}.}
+
+What if the file ends before enough words have been collected to fill an
+output line? Or the output line is exactly full but not yet broken, and
+there is no more input? GNU @code{troff} interprets the end of input as
+a break. Certain requests also cause breaks, implicitly or explicitly.
+This is discussed in @ref{Manipulating Filling and Adjustment}.
+
+@c ---------------------------------------------------------------------
+
+@node Adjustment, Tabs and Leaders, Breaking, Text
+@subsection Adjustment
+
+@cindex extra spaces between words
+After GNU @code{troff} performs an automatic break, it may then
+@dfn{adjust} the line, widening inter-word spaces until the text reaches
+the right margin. Extra spaces between words are preserved. Leading
+and trailing spaces are handled as noted above. Text can be aligned to
+the left or right margin only, or centered; see @ref{Manipulating
+Filling and Adjustment}.
+@c END Keep roughly parallel with roff(7) section "Concepts".
+
+@c ---------------------------------------------------------------------
+
+@node Tabs and Leaders, Input Conventions, Adjustment, Text
+@subsection Tabs and Leaders
+
+@cindex horizontal tab character
+@cindex tab character
+@cindex character, horizontal tab
+@cindex leader character
+@cindex character, leader
+@cindex tab stops
+@cindex stops, tab
+GNU @code{troff} translates input horizontal tab characters (``tabs'')
+and @key{Control+A} characters (``leaders'') into movements to the next
+tab stop. Tabs simply move to the next tab stop; leaders place enough
+periods to fill the space. Tab stops are by default located every half
+inch measured from the drawing position corresponding to the beginning
+of the input line; see @ref{Page Geometry}. Tabs and leaders do not
+cause breaks and therefore do not interrupt filling. Below, we use
+arrows @arrow{} and bullets @bullet{} to indicate input tabs and
+leaders, respectively.
+
+@Example
+1
+@arrow{} 2 @arrow{} 3 @bullet{} 4
+@arrow{} @bullet{} 5
+@result{} 1 2 3.......4 ........5
+@endExample
+
+Tabs and leaders lend themselves to table construction.@footnote{``Tab''
+is short for ``tabulation'', revealing the term's origin as a spacing
+mechanism for table arrangement.} The tab and leader glyphs can be
+configured, and further facilities for sophisticated table composition
+are available; see @ref{Tabs and Fields}. There are many details to
+track when using such low-level features, so most users turn to the
+@cite{tbl@r{(1)}} preprocessor to lay out tables.
+
+@c ---------------------------------------------------------------------
+
+@node Requests and Macros, Macro Packages, Tabs and Leaders, Text
+@subsection Requests and Macros
+
+We have now encountered almost all of the syntax there is in the
+@code{roff} language, with an exception already noted in passing.
+@cindex request
+@cindex control character (@code{.})
+@cindex character, control (@code{.})
+@cindex no-break control character (@code{'})
+@cindex character, no-break control (@code{'})
+@cindex control character, no-break (@code{'})
+A @dfn{request} is an instruction to the formatter that occurs after a
+@dfn{control character}, which is recognized at the beginning of an
+input line. The regular control character is a dot (@code{.}). Its
+counterpart, the @dfn{no-break control character}, a neutral apostrophe
+(@code{'}), suppresses the break that is implied by some requests.
+These characters were chosen because it is uncommon for lines of text in
+natural languages to begin with them.
+@cindex dummy character (@code{\&}), as control character suppressor
+@cindex character, dummy (@code{\&}), as control character suppressor
+If you require a formatted period or apostrophe (closing single
+quotation mark) where GNU @code{troff} is expecting a control character,
+prefix the dot or neutral apostrophe with the dummy character escape
+sequence, @samp{\&}.
+
+@cindex control line
+An input line beginning with a control character is called a
+@dfn{control line}.
+@cindex text line
+Every line of input that is not a control line is a @dfn{text
+line}.@footnote{The @code{\@key{RET}} escape sequence can alter how an
+input line is classified; see @ref{Line Continuation}.}
+
+@cindex argument
+Requests often take @dfn{arguments}, words (separated from the request
+name and each other by spaces) that specify details of the action GNU
+@code{troff} is expected to perform. If a request is meaningless
+without arguments, it is typically ignored.
+
+GNU @code{troff}'s requests and escape sequences comprise the control
+language of the formatter. Of key importance are the requests that
+define macros. Macros are invoked like requests, enabling the request
+repertoire to be extended or overridden.@footnote{Argument handling in
+macros is more flexible but also more complex. @xref{Calling Macros}.}
+
+@cindex macro
+@cindex calling a macro
+@cindex interpolation
+A @dfn{macro} can be thought of as an abbreviation you can define for a
+collection of control and text lines. When the macro is @dfn{called} by
+giving its name after a control character, it is replaced with what it
+stands for. The process of textual replacement is known as
+@dfn{interpolation}.@footnote{Some escape sequences undergo
+interpolation as well.} Interpolations are handled as soon as they are
+recognized, and once performed, a @code{roff} formatter scans the
+replacement for further requests, macro calls, and escape sequences.
+
+In @code{roff} systems, the @code{de} request defines a
+macro.@footnote{GNU @code{troff} offers additional ones. @xref{Writing
+Macros}.}
+
+@Example
+.de DATE
+2020-11-14
+..
+@endExample
+
+@noindent
+The foregoing input produces no output by itself; all we have done is
+store some information. Observe the pair of dots that ends the macro
+definition. This is a default; you can specify your own terminator for
+the macro definition as the second argument to the @code{de} request.
+
+@Example
+.de NAME ENDNAME
+Heywood Jabuzzoff
+.ENDNAME
+@endExample
+
+In fact, the ending marker is itself the name of a macro to be
+called, or a request to be invoked, if it is defined at the time its
+control line is read.
+
+@Example
+.de END
+Big Rip
+..
+.de START END
+Big Bang
+.END
+.START
+ @result{} Big Rip Big Bang
+@endExample
+
+@noindent
+In the foregoing example, ``Big Rip'' printed before ``Big Bang''
+because its macro was @emph{called} first. Consider what would happen
+if we dropped @code{END} from the @samp{.de START} line and added
+@code{..} after @code{.END}. Would the order change?
+
+Let us consider a more elaborate example.
+
+@Example
+.de DATE
+2020-10-05
+..
+.
+.de BOSS
+D.\& Kruger,
+J.\& Peterman
+..
+.
+.de NOTICE
+Approved:
+.DATE
+by
+.BOSS
+..
+.
+Insert tedious regulatory compliance paragraph here.
+
+.NOTICE
+
+Insert tedious liability disclaimer paragraph here.
+
+.NOTICE
+ @result{} Insert tedious regulatory compliance paragraph here.
+ @result{}
+ @result{} Approved: 2020-10-05 by D. Kruger, J. Peterman
+ @result{}
+ @result{} Insert tedious liability disclaimer paragraph here.
+ @result{}
+ @result{} Approved: 2020-10-05 by D. Kruger, J. Peterman
+@endExample
+
+@noindent
+The above document started with a series of control lines. Three macros
+were defined, with a @code{de} request declaring each macro's name, and
+the ``body'' of the macro starting on the next line and continuing until
+a line with two dots @samp{@code{..}} marked its end. The text proper
+began only after the macros were defined; this is a common pattern.
+Only the @code{NOTICE} macro was called ``directly'' by the document;
+@code{DATE} and @code{BOSS} were called only by @code{NOTICE} itself.
+Escape sequences were used in @code{BOSS}, two levels of macro
+interpolation deep.
+
+The advantage in typing and maintenance economy may not be obvious from
+such a short example, but imagine a much longer document with dozens of
+such paragraphs, each requiring a notice of managerial approval.
+Consider what must happen if you are in charge of generating a new
+version of such a document with a different date, for a different boss.
+With well-chosen macros, you only have to change each datum in one
+place.
+
+In practice, we would probably use strings (@pxref{Strings}) instead of
+macros for such simple interpolations; what is important here is to
+glimpse the potential of macros and the power of recursive
+interpolation.
+
+We could have defined @code{DATE} and @code{BOSS} in the opposite order;
+perhaps less obviously, we could also have defined them @emph{after}
+@code{NOTICE}. ``Forward references'' like this are acceptable because
+the body of a macro definition is not (completely) interpreted, but
+stored instead (@pxref{Copy Mode}). While a macro is being defined (or
+appended to), requests are not interpreted and macros not interpolated,
+whereas some commonly used escape sequences @emph{are} interpreted.
+@code{roff} systems also support recursive macro calls, as long as you
+have a way to break the recursion (@pxref{Conditionals and Loops}).
+Maintainable @code{roff} documents tend to arrange macro definitions to
+minimize forward references.
+
+@c ---------------------------------------------------------------------
+
+@node Macro Packages, Input Encodings, Requests and Macros, Text
+@subsection Macro Packages
+@cindex macro package
+@cindex package, macro
+
+@c TODO: Consider parallelizing with groff_tmac(5) "Description".
+Macro definitions can be collected into @dfn{macro files}, @code{roff}
+input files designed to produce no output themselves but instead ease
+the preparation of other @code{roff} documents. There is no syntactical
+difference between a macro file and any other @code{roff} document; only
+its purpose distinguishes it. When a macro file is installed at a
+standard location and suitable for use by a general audience, it is
+often termed a @dfn{macro package}.@footnote{Macro files and packages
+frequently define registers and strings as well.} Macro packages can be
+loaded by supplying the @option{-m} option to GNU @command{troff} or a
+@code{groff} front end. Alternatively, a document requiring a macro
+package can load it with the @code{mso} (``macro source'') request.
+
+@c ---------------------------------------------------------------------
+
+@c TODO: Move a lot of this node to the "Invoking groff" chapter. Some
+@c of the discussion is better placed in discussion of output drivers
+@c (e.g., what character encodings _they_ support for output and their
+@c responsibility for converting to them) as well.
+
+@node Input Encodings, Input Conventions, Macro Packages, Text
+@subsection Input Encodings
+
+The @command{groff} command's @option{-k} option calls the
+@command{preconv} preprocessor to perform input character encoding
+conversions. Input to the GNU @code{troff} formatter itself, on the
+other hand, must be in one of two encodings it can recognize.
+
+@table @code
+@item cp1047
+@cindex encoding, input, @acronym{EBCDIC}
+@cindex @acronym{EBCDIC}, input encoding
+@cindex input encoding, @acronym{EBCDIC}
+@cindex encoding, input, code page 1047
+@cindex code page 1047, input encoding
+@cindex input encoding, code page 1047
+@cindex IBM code page 1047 input encoding
+@pindex cp1047.tmac
+The code page 1047 input encoding works only on @acronym{EBCDIC}
+platforms (and conversely, the other input encodings don't work with
+@acronym{EBCDIC}); the file @file{cp1047.tmac} is loaded at startup.
+
+@item latin1
+@cindex encoding, input, @w{Latin-1} (ISO @w{8859-1})
+@cindex @w{Latin-1} (ISO @w{8859-1}), input encoding
+@cindex ISO @w{8859-1} (@w{Latin-1}), input encoding
+@cindex input encoding, @w{Latin-1} (ISO @w{8859-1})
+@pindex latin1.tmac
+ISO @w{Latin-1}, an encoding for Western European languages, is the
+default input encoding on non-@acronym{EBCDIC} platforms; the file
+@file{latin1.tmac} is loaded at startup.
+@end table
+
+@noindent
+Any document that is encoded in ISO 646:1991 (a descendant of USAS
+@w{X3.4-1968} or ``US-ASCII''), or, equivalently, uses only code points
+from the ``C0 Controls'' and ``Basic Latin'' parts of the Unicode
+character set is also a valid ISO @w{Latin-1} document; the standards
+are interchangeable in their first 128 code points.@footnote{The
+@emph{semantics} of certain punctuation code points have gotten stricter
+with the successive standards, a cause of some frustration among man
+page writers; see the @cite{groff_char@r{(7)}} man page.}
+
+Other encodings are supported by means of macro packages.
+
+@table @code
+@item latin2
+@cindex encoding, input, @w{Latin-2} (ISO @w{8859-2})
+@cindex @w{Latin-2} (ISO @w{8859-2}), input encoding
+@cindex ISO @w{8859-2} (@w{Latin-2}), input encoding
+@cindex input encoding, @w{Latin-2} (ISO @w{8859-2})
+@pindex latin2.tmac
+To use ISO @w{Latin-2}, an encoding for Central and Eastern European
+languages, invoke @w{@samp{.mso latin2.tmac}} at the beginning of your
+document or supply @samp{-mlatin2} as a command-line argument to
+@code{groff}.
+
+@item latin5
+@cindex encoding, input, @w{Latin-5} (ISO @w{8859-9})
+@cindex @w{Latin-5} (ISO @w{8859-9}), input encoding
+@cindex ISO @w{8859-9} (@w{Latin-5}), input encoding
+@cindex input encoding, @w{Latin-5} (ISO @w{8859-9})
+@pindex latin5.tmac
+To use ISO @w{Latin-5}, an encoding for the Turkish language, invoke
+@w{@samp{.mso latin5.tmac}} at the beginning of your document or
+supply @samp{-mlatin5} as a command-line argument to @code{groff}.
+
+@item latin9
+@cindex encoding, input, @w{Latin-9} (ISO @w{8859-15})
+@cindex @w{Latin-9} (ISO @w{8859-15}), input encoding
+@cindex ISO @w{8859-15} (@w{Latin-9}), input encoding
+@cindex input encoding, @w{Latin-9} (ISO @w{8859-15})
+@pindex latin9.tmac
+ISO @w{Latin-9} succeeds @w{Latin-1}; it includes a Euro sign and better
+glyph coverage for French. To use this encoding, invoke @w{@samp{.mso
+latin9.tmac}} at the beginning of your document or supply
+@samp{-mlatin9} as a command-line argument to @code{groff}.
+@end table
+
+Some characters from an input encoding may not be available with a
+particular output driver, or their glyphs may not have representation in
+the font used. For terminal devices, fallbacks are defined, like
+@samp{EUR} for the Euro sign and @samp{(C)} for the copyright sign. For
+typesetter devices, you may need to ``mount'' fonts that support glyphs
+required by the document. @xref{Font Positions}.
+
+@pindex freeeuro.pfa
+@pindex ec.tmac
+Because a Euro glyph was not historically defined in PostScript fonts,
+@code{groff} comes with a font called @file{freeeuro.pfa} that provides
+the Euro in several styles. Standard PostScript fonts contain the
+glyphs from @w{Latin-5} and @w{Latin-9} that @w{Latin-1} lacks, so these
+encodings are supported for the @option{ps} and @option{pdf} output
+devices as @code{groff} ships, while @w{Latin-2} is not.
+
+Unicode supports characters from all other input encodings; the
+@option{utf8} output driver for terminals therefore does as well. The
+DVI output driver supports the @w{Latin-2} and @w{Latin-9} encodings if
+the command-line option @option{-mec} is used as well. @footnote{The
+DVI output device defaults to using the Computer Modern (CM) fonts;
+@file{ec.tmac} loads the EC fonts instead, which provide Euro
+@samp{\[Eu]} and per mille @samp{\[%0]} glyphs.}
+
+@c ---------------------------------------------------------------------
+
+@node Input Conventions, , Input Encodings, Text
+@subsection Input Conventions
+@cindex input conventions
+@cindex conventions for input
+
+Since GNU @code{troff} fills text automatically, it is common practice
+in the @code{roff} language to avoid visual composition of text in input
+files: the esthetic appeal of the formatted output is what matters.
+Therefore, @code{roff} input should be arranged such that it is easy for
+authors and maintainers to compose and develop the document, understand
+the syntax of @code{roff} requests, macro calls, and preprocessor
+languages used, and predict the behavior of the formatter. Several
+traditions have accrued in service of these goals.
+
+@itemize @bullet
+@item
+Follow sentence endings in the input with newlines to ease their
+recognition (@pxref{Sentences}). It is frequently convenient to end
+text lines after colons and semicolons as well, as these typically
+precede independent clauses. Consider doing so after commas; they often
+occur in lists that become easy to scan when itemized by line, or
+constitute supplements to the sentence that are added, deleted, or
+updated to clarify it. Parenthetical and quoted phrases are also good
+candidates for placement on text lines by themselves.
+
+@item
+Set your text editor's line length to 72 characters or
+fewer.@footnote{Emacs: @code{fill-column: 72}; Vim: @code{textwidth=72}}
+This limit, combined with the previous item of advice, makes it less
+common that an input line will wrap in your text editor, and thus will
+help you perceive excessively long constructions in your text. Recall
+that natural languages originate in speech, not writing, and that
+punctuation is correlated with pauses for breathing and changes in
+prosody.
+
+@item
+Use @code{\&} after @samp{!}, @samp{?}, and @samp{.} if they are
+followed by space, tab, or newline characters and don't end a sentence.
+
+@item
+In filled text lines, use @code{\&} before @samp{.} and @samp{'} if they
+are preceded by space, so that reflowing the input doesn't turn them
+into control lines.
+
+@item
+Do not use spaces to perform indentation or align columns of a table.
+Leading spaces are reliable when text is not being filled.
+
+@item
+Comment your document. It is never too soon to apply comments to
+record information of use to future document maintainers (including your
+future self). We thus introduce another escape sequence, @code{\"},
+which causes GNU @code{troff} to ignore the remainder of the input line.
+
+@item
+Use the empty request---a control character followed immediately by a
+newline---to visually manage separation of material in input files.
+Many of the @code{groff} project's own documents use an empty request
+between sentences, after macro definitions, and where a break is
+expected, and two empty requests between paragraphs or other requests or
+macro calls that will introduce vertical space into the document.
+
+You can combine the empty request with the comment escape sequence to
+include whole-line comments in your document, and even ``comment out''
+sections of it.
+@end itemize
+
+We conclude this section with an example sufficiently long to illustrate
+most of the above suggestions in practice. For the purpose of fitting
+the example between the margins of this manual with the font used for
+its typeset version, we have shortened the input line length to 56
+columns. As before, an arrow @arrow{} indicates a tab character.
+
+@c Wrap example at 56 columns (not counting @arrow{}).
+@CartoucheExample
+.\" nroff this_file.roff | less
+.\" groff -T ps this_file.roff > this_file.ps
+@arrow{}The theory of relativity is intimately connected with
+the theory of space and time.
+.
+I shall therefore begin with a brief investigation of
+the origin of our ideas of space and time,
+although in doing so I know that I introduce a
+controversial subject. \" remainder of paragraph elided
+.
+.
+
+@arrow{}The experiences of an individual appear to us arranged
+in a series of events;
+in this series the single events which we remember
+appear to be ordered according to the criterion of
+\[lq]earlier\[rq] and \[lq]later\[rq], \" punct swapped
+which cannot be analysed further.
+.
+There exists,
+therefore,
+for the individual,
+an I-time,
+or subjective time.
+.
+This itself is not measurable.
+.
+I can,
+indeed,
+associate numbers with the events,
+in such a way that the greater number is associated with
+the later event than with an earlier one;
+but the nature of this association may be quite
+arbitrary.
+.
+This association I can define by means of a clock by
+comparing the order of events furnished by the clock
+with the order of a given series of events.
+.
+We understand by a clock something which provides a
+series of events which can be counted,
+and which has other properties of which we shall speak
+later.
+.\" Albert Einstein, _The Meaning of Relativity_, 1922
+@endCartoucheExample
+
+@node Page Geometry, Measurements, Text, GNU troff Reference
+@section Page Geometry
+@cindex page, geometry of
+@cindex geometry, page
+
+@code{roff} systems format text under certain assumptions about the size
+of the output medium, or page. For the formatter to correctly break a
+line it is filling, it must know the line length, which it derives from
+the page width (@pxref{Line Layout}). For it to decide whether to write
+an output line to the current page or wait until the next one, it must
+know the page length (@pxref{Page Layout}).
+
+@cindex device resolution
+@cindex resolution, device
+@cindex basic units
+@cindex units, basic
+@cindex machine units
+@cindex units, machine
+A device's @dfn{resolution} converts practical units like inches or
+centimeters to @dfn{basic units}, a convenient length measure for the
+output device or file format. The formatter and output driver use basic
+units to reckon page measurements. The device description file defines
+its resolution and page dimensions (@pxref{DESC File Format}).
+
+@cindex page
+A @dfn{page} is a two-dimensional structure upon which a @code{roff}
+system imposes a rectangular coordinate system with its upper left
+corner as the origin. Coordinate values are in basic units and increase
+down and to the right. Useful ones are therefore always positive and
+within numeric ranges corresponding to the page boundaries.
+
+@cindex drawing position
+@cindex position, drawing
+While the formatter (and, later, output driver) is processing a page, it
+keeps track of its @dfn{drawing position}, which is the location at
+which the next glyph will be written, from which the next motion will be
+measured, or where a geometric object will commence rendering.
+@cindex text baseline
+@cindex baseline, text
+Notionally, glyphs are drawn from the text baseline upward and to the
+right.@footnote{@code{groff} does not yet support right-to-left
+scripts.} The @dfn{text baseline} is a (usually invisible) line upon
+which the glyphs of a typeface are aligned. A glyph therefore
+``starts'' at its bottom-left corner. If drawn at the origin, a typical
+letter glyph would lie partially or wholly off the page, depending on
+whether, like ``g'', it features a descender below the baseline.
+
+@cindex page offset
+@cindex offset, page
+Such a situation is nearly always undesirable. It is furthermore
+conventional not to write or draw at the extreme edges of the page.
+Therefore the initial drawing position of a @code{roff} formatter is not
+at the origin, but below and to the right of it. This rightward shift
+from the left edge is known as the @dfn{page
+offset}.@footnote{@code{groff}'s terminal output devices have page
+offsets of zero.} The downward shift leaves room for a text output
+line.
+
+Text is arranged on a one-dimensional lattice of text baselines from the
+top to the bottom of the page.
+@cindex vertical spacing
+@cindex spacing, vertical
+@cindex vee
+@dfn{Vertical spacing} is the distance between adjacent text baselines.
+Typographic tradition sets this quantity to 120% of the type size. The
+initial drawing position is one unit of vertical spacing below the page
+top. Typographers term this unit a @slanted{vee}.
+
+@cindex page break
+@cindex break, page
+@cindex page ejection
+@cindex ejection, page
+Vertical spacing has an impact on page-breaking decisions. Generally,
+when a break occurs, the formatter moves the drawing position to the
+next text baseline automatically. If the formatter were already writing
+to the last line that would fit on the page, advancing by one vee would
+place the next text baseline off the page. Rather than let that happen,
+@code{roff} formatters instruct the output driver to eject the page,
+start a new one, and again set the drawing position to one vee below the
+page top; this is a @dfn{page break}.
+
+When the last line of input text corresponds to the last output line
+that fits on the page, the break caused by the end of input will also
+break the page, producing a useless blank one. Macro packages keep
+users from having to confront this difficulty by setting ``traps''
+(@pxref{Traps}); moreover, all but the simplest page layouts tend to
+have headers and footers, or at least bear vertical margins larger than
+one vee.
+
+
+@c =====================================================================
+@c TODO: Add a section here about interpolations and input processing.
+@c
+@c We need to level up the reader's macro brain from reasoning about
+@c interpolation at the scope of input lines to interpolations _within_
+@c lines. It is also a good time to introduce the \n and \* escape
+@c sequences to avoid painful, "WTF"-producing forward references later.
+@c Some materal from groff_mm(7) might be adaptable to this purpose.
+@c
+@c Earlier material from @Defesc{\\n}:
+@c "This means that the value of the register is expanded in place while
+@c GNU @code{troff} is parsing the input line. Nested assignments (also
+@c called indirect assignments) are possible."
+@c
+@c We can probably drop the term "indirect assignments"; there's nothing
+@c special about these--they are a consequence of *roffs' left-to-right
+@c parsing and they apply to escape sequences in general.
+@c =====================================================================
+
+@c BEGIN Keep (roughly) parallel with section "Measurements" of
+@c groff(7).
+@node Measurements, Numeric Expressions, Text, GNU troff Reference
+@section Measurements
+@cindex measurements
+@cindex scaling indicator
+@cindex indicator, scaling
+
+@cindex units of measurement
+@cindex measurement units
+The formatter sometimes requires the input of numeric parameters to
+specify measurements. These are specified as integers or decimal
+fractions with an optional @dfn{scaling unit} suffixed. A scaling unit
+is a letter that immediately follows the last digit of a number. Digits
+after the decimal point are optional. Measurement expressions include
+@samp{10.5p}, @samp{11i}, and @samp{3.c}.
+
+@cindex basic units, conversion to
+@cindex units, basic, conversion to
+@cindex conversion to basic units
+Measurements are scaled by the scaling unit and stored internally (with
+any fractional part discarded) in basic units.
+@cindex device resolution, obtaining in the formatter
+@cindex resolution, device, obtaining in the formatter
+The device resolution can therefore be obtained by storing a value of
+@samp{1i} to a register. The only constraint on the basic unit is that
+it is at least as small as any other unit.
+@c That's a fib. A device resolution of around 2^31 would surely also
+@c cause problems. But nobody does that.
+
+@table @code
+@cindex basic scaling unit (@code{u})
+@cindex @code{u} scaling unit
+@cindex unit, scaling, @code{u}
+@cindex scaling unit @code{u}
+@item u
+Basic unit.
+
+@item i
+@cindex inch scaling unit (@code{i})
+@cindex @code{i} scaling unit
+@cindex unit, scaling, @code{i}
+@cindex scaling unit @code{i}
+Inch; defined as 2.54@tie{}centimeters.
+
+@item c
+@cindex centimeter scaling unit (@code{c})
+@cindex @code{c} scaling unit
+@cindex unit, scaling, @code{c}
+@cindex scaling unit @code{c}
+Centimeter; a centimeter is about 0.3937@tie{}inches.
+
+@item p
+@cindex point scaling unit (@code{p})
+@cindex @code{p} scaling unit
+@cindex unit, scaling, @code{p}
+@cindex scaling unit @code{p}
+Point; a typesetter's unit used for measuring type size.
+There are 72@tie{}points to an inch.
+
+@item P
+@cindex pica scaling unit (@code{P})
+@cindex @code{P} scaling unit
+@cindex unit, scaling, @code{P}
+@cindex scaling unit @code{P}
+Pica; another typesetter's unit. There are 6@tie{}picas to an inch and
+12@tie{}points to a pica.
+
+@item s
+@itemx z
+@xref{Using Fractional Type Sizes}, for a discussion of these units.
+
+@item f
+GNU @code{troff} defines this unit to scale decimal fractions in the
+interval [0, 1] to 16-bit unsigned integers. It multiplies a quantity
+by 65,536. @xref{Colors}, for usage.
+@end table
+
+The magnitudes of other scaling units depend on the text formatting
+parameters in effect. These are useful when specifying measurements
+that need to scale with the typeface or vertical spacing.
+
+@table @code
+@item m
+@cindex em scaling unit (@code{m})
+@cindex @code{m} scaling unit
+@cindex unit, scaling, @code{m}
+@cindex scaling unit @code{m}
+Em; an em is equal to the current type size in points. It is named thus
+because it is approximately the width of the letter@tie{}@samp{M}.
+
+@item n
+@cindex en scaling unit (@code{n})
+@cindex @code{n} scaling unit
+@cindex unit, scaling, @code{n}
+@cindex scaling unit @code{n}
+En; an en is one-half em.
+
+@item v
+@cindex vertical space unit (@code{v})
+@cindex space, vertical, unit (@code{v})
+@cindex vee scaling unit (@code{v})
+@cindex @code{v} scaling unit
+@cindex unit, scaling, @code{v}
+@cindex scaling unit @code{v}
+Vee; recall @ref{Page Geometry}.
+
+@item M
+@cindex @code{M} scaling unit
+@cindex unit, scaling, @code{M}
+@cindex scaling unit @code{M}
+Hundredth of an em.
+@end table
+
+@menu
+* Motion Quanta::
+* Default Units::
+@end menu
+@c END Keep (roughly) parallel with section "Measurements" of groff(7).
+
+@c ---------------------------------------------------------------------
+
+@node Motion Quanta, Default Units, Measurements, Measurements
+@subsection Motion Quanta
+@cindex motion quanta
+@cindex quanta, motion
+
+@c BEGIN Keep (roughly) parallel with subsection "Motion quanta" of
+@c groff(7).
+An output device's basic unit @code{u} is not necessarily its smallest
+addressable length; @code{u} can be smaller to avoid problems with
+integer roundoff. The minimum distances that a device can work with in
+the horizontal and vertical directions are termed its @dfn{motion
+quanta}. Measurements are rounded to applicable motion quanta.
+Half-quantum fractions round toward zero.
+
+@cindex horizontal motion quantum register (@code{.H})
+@cindex motion quantum, horizontal, register (@code{.H})
+@cindex horizontal resolution register (@code{.H})
+@cindex resolution, horizontal, register (@code{.H})
+@DefregList {.H}
+@DefregListEndx {.V}
+These read-only registers interpolate the horizontal and vertical motion
+quanta, respectively, of the output device in basic units.
+@endDefreg
+
+For example, we might draw short baseline rules on a terminal device as
+follows. @xref{Drawing Geometric Objects}.
+
+@Example
+.tm \n[.H]
+ @error{} 24
+.nf
+\l'36u' 36u
+\l'37u' 37u
+ @result{} _ 36u
+ @result{} __ 37u
+@endExample
+@c END Keep (roughly) parallel with subsection "Motion quanta" of
+@c groff(7).
+
+@c ---------------------------------------------------------------------
+
+@node Default Units, , Motion Quanta, Measurements
+@subsection Default Units
+@cindex default units
+@cindex units, default
+
+@c BEGIN Keep (roughly) parallel with subsection "Default units" of
+@c groff(7).
+A general-purpose register (one created or updated with the @code{nr}
+request; see @pxref{Registers}) is implicitly dimensionless, or reckoned
+in basic units if interpreted in a measurement context. But it is
+convenient for many requests and escape sequences to infer a scaling
+unit for an argument if none is specified. An explicit scaling unit
+(not after a closing parenthesis) can override an undesirable default.
+Effectively, the default unit is suffixed to the expression if a scaling
+unit is not already present. GNU @code{troff}'s use of integer
+arithmetic should also be kept in mind (@pxref{Numeric Expressions}).
+
+The @code{ll} request interprets its argument in ems by default.
+Consider several attempts to set a line length of 3.5@tie{}inches when
+the type size is 10@tie{}points on a terminal device with a resolution
+of 240 basic units and horizontal motion quantum of 24. Some
+expressions become zero; the request clamps them to that quantum.
+
+@Example
+.ll 3.5i \" 3.5i (= 840u)
+.ll 7/2 \" 7u/2u -> 3u -> 3m -> 0, clamped to 24u
+.ll (7 / 2)u \" 7u/2u -> as above
+.ll 7/2i \" 7u/2i -> 7u/480u -> 0 -> as above
+.ll 7i/2 \" 7i/2u -> 1680u/2m -> 1680u/24u -> 35u
+.ll 7i/2u \" 3.5i (= 840u)
+@endExample
+
+@noindent
+@cindex measurements, specifying safely
+The safest way to specify measurements is to attach a scaling unit. To
+multiply or divide by a dimensionless quantity, use @samp{u} as its
+scaling unit.
+@c END Keep (roughly) parallel with subsection "Default units" of
+@c groff(7).
+
+
+@c =====================================================================
+
+@c BEGIN Keep (roughly) parallel with section "Numeric expressions" of
+@c groff(7).
+@node Numeric Expressions, Identifiers, Measurements, GNU troff Reference
+@section Numeric Expressions
+@cindex numeric expressions
+@cindex expressions, numeric
+
+A @dfn{numeric expression} evaluates to an integer:@: it can be as
+simple as a literal @samp{0} or it can be a complex sequence of register
+and string interpolations interleaved with measurements and operators.
+
+GNU @code{troff} provides a set of mathematical and logical operators
+familiar to programmers---as well as some unusual ones---but supports
+only integer arithmetic.@footnote{Provision is made for interpreting and
+reporting decimal fractions in certain cases.} The internal data type
+used for computing results is usually a 32-bit signed integer, which
+suffices to represent magnitudes within a range of ±2
+billion.@footnote{If that's not enough, see the @cite{groff_tmac@r{(5)}}
+man page for the @file{62bit.tmac} macro package.}
+
+@cindex arithmetic operators
+@cindex operators, arithmetic
+@cindex truncating division
+@cindex addition
+@cindex subtraction
+@cindex multiplication
+@cindex division, truncating
+@cindex modulus
+@opindex +
+@opindex -
+@opindex *
+@opindex /
+@opindex %
+Arithmetic infix operators perform a function on the numeric expressions
+to their left and right; they are @code{+} (addition), @code{-}
+(subtraction), @code{*} (multiplication), @code{/} (truncating
+division), and @code{%} (modulus). @dfn{Truncating division} rounds to
+the integer nearer to zero, no matter how large the fractional portion.
+Overflow and division (or modulus) by zero are errors and abort
+evaluation of a numeric expression.
+@cindex unary arithmetic operators
+@cindex operators, unary arithmetic
+@cindex negation
+@cindex assertion (arithmetic operator)
+@opindex -
+@opindex +
+@cindex @code{if} request, and the @samp{!} operator
+@cindex @code{while} request, and the @samp{!} operator
+
+Arithmetic unary operators operate on the numeric expression to their
+right; they are @code{-} (negation) and @code{+} (assertion---for
+completeness; it does nothing). The unary minus must often be used
+with parentheses to avoid confusion with the decrementation operator,
+discussed below.
+
+Observe the rounding behavior and effect of negative operands on the
+modulus and truncating division operators.
+
+@Example
+.nr T 199/100
+.nr U 5/2
+.nr V (-5)/2
+.nr W 5/-2
+.nr X 5%2
+.nr Y (-5)%2
+.nr Z 5%-2
+T=\n[T] U=\n[U] V=\n[V] W=\n[W] X=\n[X] Y=\n[Y] Z=\n[Z]
+ @result{} T=1 U=2 V=-2 W=-2 X=1 Y=-1 Z=1
+@endExample
+
+@noindent
+The sign of the modulus of operands of mixed signs is determined by the
+sign of the first. Division and modulus operators satisfy the following
+property:@: given a dividend@tie{}@var{a} and a divisor@tie{}@var{b}, a
+quotient@tie{}@var{q} formed by @samp{(a / b)} and a
+remainder@tie{}@var{r} by @samp{(a % b)}, then @math{qb + r = a}.
+
+@cindex scaling operator
+@cindex operator, scaling
+@opindex ;
+GNU @code{troff}'s scaling operator, used with parentheses as
+@code{(@var{c};@var{e})}, evaluates a numeric expression@tie{}@var{e}
+using@tie{}@var{c} as the default scaling unit. If @var{c} is omitted,
+scaling units are ignored in the evaluation of@tie{}@var{e}. This
+operator can save typing by avoiding the attachment of scaling units to
+every operand out of caution. Your macros can select a sensible default
+unit in case the user neglects to supply one.
+
+@Example
+.\" Indent by amount given in first argument; assume ens.
+.de Indent
+. in (n;\\$1)
+..
+@endExample
+
+@noindent
+Without the scaling operator, the foregoing macro would, if called with
+a unitless argument, cause indentation by the @code{in} request's
+default scaling unit (ems). The result would be twice as much
+indentation as expected.
+
+@cindex extremum operators (@code{>?}, @code{<?})
+@cindex operators, extremum (@code{>?}, @code{<?})
+@cindex maximum operator
+@cindex minimum operator
+@opindex >?
+@opindex <?
+GNU @code{troff} also provides a pair of operators to compute the
+extrema of two operands: @code{>?} (maximum) and @code{<?} (minimum).
+
+@Example
+.nr slots 5
+.nr candidates 3
+.nr salaries (\n[slots] <? \n[candidates])
+Looks like we'll end up paying \n[salaries] salaries.
+ @result{} Looks like we'll end up paying 3 salaries.
+@endExample
+
+@cindex comparison operators
+@cindex operators, comparison
+@cindex greater than (or equal to) operator
+@cindex less than (or equal to) operator
+@cindex equality operator
+@opindex <
+@opindex >
+@opindex >=
+@opindex <=
+@opindex =
+@opindex ==
+Comparison operators comprise @code{<} (less than), @code{>} (greater
+than), @code{<=} (less than or equal), @code{>=} (greater than or
+equal), and @code{=} (equal). @code{==} is a synonym for @code{=}.
+When evaluated, a comparison is replaced with @samp{0} if it is false
+and @samp{1} if true. In the @code{roff} language, positive values are
+true, others false.
+
+@cindex logical operators
+@cindex operators, logical
+@cindex logical ``and'' operator
+@cindex logical conjunction operator
+@cindex logical ``or'' operator
+@cindex logical disjunction operator
+@opindex &
+@ifnotinfo
+@opindex :
+@end ifnotinfo
+@ifinfo
+@opindex @r{<colon>}
+@end ifinfo
+We can operate on truth values with the logical operators @code{&}
+(logical conjunction or ``and'') and @code{:} (logical disjunction or
+``or''). They evaluate as comparison operators do.
+
+@opindex !
+@cindex complementation, logical
+@cindex logical complementation operator
+@cindex logical not, limitation in expression
+@cindex expression, limitation of logical not in
+A logical complementation (``not'') operator, @code{!}, works only
+within @code{if}, @code{ie}, and @code{while} requests.
+@c This is worded to avoid implying that the operator doesn't apply
+@c to conditional expressions in general, albeit without mentioning them
+@c because they're out of scope.
+Furthermore, @code{!} is recognized only at the beginning of a numeric
+expression not contained by another numeric expression. In other words,
+it must be the ``outermost'' operator. Including it elsewhere in the
+expression produces a warning in the @samp{number} category
+(@pxref{Warnings}), and its expression evaluates false. This
+unfortunate limitation maintains compatibility with @acronym{AT&T}
+@code{troff}. Test a numeric expression for falsity by
+comparing it to a false value.@footnote{@xref{Conditionals and Loops}.}
+
+@Example
+.nr X 1
+.nr Y 0
+.\" This does not work as expected.
+.if (\n[X])&(!\n[Y]) .nop A: X is true, Y is false
+.
+.\" Use this construct instead.
+.if (\n[X])&(\n[Y]<=0) .nop B: X is true, Y is false
+ @error{} warning: expected numeric expression, got '!'
+ @result{} B: X is true, Y is false
+@endExample
+
+@cindex parentheses
+@cindex order of evaluation in expressions
+@cindex expression, order of evaluation
+@opindex (
+@opindex )
+The @code{roff} language has no operator precedence:@: expressions are
+evaluated strictly from left to right, in contrast to schoolhouse
+arithmetic. Use parentheses @code{(} @code{)} to impose a desired
+precedence upon subexpressions.
+
+@Example
+.nr X 3+5*4
+.nr Y (3+5)*4
+.nr Z 3+(5*4)
+X=\n[X] Y=\n[Y] Z=\n[Z]
+ @result{} X=32 Y=32 Z=23
+@endExample
+
+@cindex @code{+}, and page motion
+@cindex @code{-}, and page motion
+@cindex motion operators
+@cindex operators, motion
+@opindex + @r{(unary)}
+@opindex - @r{(unary)}
+For many requests and escape sequences that cause motion on the page,
+the unary operators @code{+} and @code{-} work differently when leading
+a numeric expression. They then indicate a motion relative to the
+drawing position:@: positive is down in vertical contexts, right in
+horizontal ones.
+
+@cindex @code{bp} request, using @code{+} and@tie{}@code{-} with
+@cindex @code{in} request, using @code{+} and@tie{}@code{-} with
+@cindex @code{ll} request, using @code{+} and@tie{}@code{-} with
+@cindex @code{lt} request, using @code{+} and@tie{}@code{-} with
+@cindex @code{nm} request, using @code{+} and@tie{}@code{-} with
+@cindex @code{nr} request, using @code{+} and@tie{}@code{-} with
+@cindex @code{pl} request, using @code{+} and@tie{}@code{-} with
+@cindex @code{pn} request, using @code{+} and@tie{}@code{-} with
+@cindex @code{po} request, using @code{+} and@tie{}@code{-} with
+@cindex @code{ps} request, using @code{+} and@tie{}@code{-} with
+@cindex @code{pvs} request, using @code{+} and@tie{}@code{-} with
+@cindex @code{rt} request, using @code{+} and@tie{}@code{-} with
+@cindex @code{ti} request, using @code{+} and@tie{}@code{-} with
+@cindex @code{\H}, using @code{+} and@tie{}@code{-} with
+@cindex @code{\R}, using @code{+} and@tie{}@code{-} with
+@cindex @code{\s}, using @code{+} and@tie{}@code{-} with
+@code{+} and @code{-} are also treated differently by the following
+requests and escape sequences:@: @code{bp}, @code{in}, @code{ll},
+@code{lt}, @code{nm}, @code{nr}, @code{pl}, @code{pn}, @code{po},
+@code{ps}, @code{pvs}, @code{rt}, @code{ti}, @code{\H}, @code{\R}, and
+@code{\s}. Here, leading plus and minus signs serve as incrementation
+and decrementation operators, respectively. To negate an expression,
+subtract it from zero or include the unary minus in parentheses with its
+argument. @xref{Setting Registers}, for examples.
+
+@opindex |
+@cindex @code{|}, and page motion
+@cindex absolute @slanted{(sic)} position operator (@code{|})
+@cindex position, absolute @slanted{(sic)} operator (@code{|})
+@cindex boundary-relative motion operator (@code{|})
+@c "motion" and "operators" already indexed above
+A leading @code{|} operator indicates a motion relative not to the
+drawing position but to a boundary. For horizontal motions, the
+measurement specifies a distance relative to a drawing position
+corresponding to the beginning of the @emph{input} line. By default,
+tab stops reckon movements in this way. Most escape sequences do not;
+@c XXX: Which ones do?
+@code{|} tells them to do so.
+
+@Example
+Mind the \h'1.2i'gap.
+.br
+Mind the \h'|1.2i'gap.
+.br
+Mind the
+\h'|1.2i'gap.
+@c 13 spaces, 4 spaces, 13 spaces
+ @result{} Mind the gap.
+ @result{} Mind the gap.
+ @result{} Mind the gap.
+@endExample
+
+One use of this feature is to define macros whose scope is limited to
+the output they format.
+
+@Example
+.\" underline word $1 with trailing punctuation $2
+.de Underline
+. nop \\$1\l'|0\[ul]'\\$2
+..
+Typographical emphasis is best used
+.Underline sparingly .
+@endExample
+
+@noindent
+In the above example, @samp{|0} specifies a negative motion from the
+current position (at the end of the argument just emitted, @code{\$1})
+to the beginning of the input line. Thus, the @code{\l} escape sequence
+in this case draws a line from right to left. A macro call occurs at
+the beginning of an input line;@footnote{Control structure syntax
+creates an exception to this rule, but is designed to remain useful:@:
+recalling our example, @samp{.if 1 .Underline this} would underline only
+``this'', precisely. @xref{Conditionals and Loops}.} if the @code{|}
+operator were omitted, then the underline would be drawn at zero
+distance from the current position, producing device-dependent, and
+likely undesirable, results. On the @samp{ps} output device, it
+underlines the period.
+
+For vertical motions, the @code{|} operator specifies a distance from
+the first text baseline on the page or in the current
+diversion,@footnote{@xref{Diversions}.} using the current vertical
+spacing.
+
+@Example
+A
+.br
+B \Z'C'\v'|0'D
+ @result{} A D
+ @result{} B C
+@endExample
+
+In the foregoing example, we've used the @code{\Z} escape sequence
+(@pxref{Page Motions}) to restore the drawing position after formatting
+@samp{C}, then moved vertically to the first text baseline on the page.
+
+@Defesc {\\B, @code{'}, anything, @code{'}}
+@cindex numeric expression, valid
+@cindex valid numeric expression
+Interpolate@tie{}1 if @var{anything} is a valid numeric expression,
+and@tie{}0 otherwise. The delimiter need not be a neutral apostrophe;
+see @ref{Delimiters}.
+@endDefesc
+
+You might use @code{\B} along with the @code{if} request to filter out
+invalid macro or string arguments. @xref{Conditionals and Loops}.
+
+@Example
+.\" Indent by amount given in first argument; assume ens.
+.de Indent
+. if \B'\\$1' .in (n;\\$1)
+..
+@endExample
+
+A register interpolated as an operand in a numeric expression must have
+an Arabic format; luckily, this is the default. @xref{Assigning
+Register Formats}.
+
+@cindex space characters, in expressions
+@cindex expressions, and space characters
+Because spaces separate arguments to requests, spaces are not allowed in
+numeric expressions unless the (sub)expression containing them is
+surrounded by parentheses. @xref{Invoking Requests}, and
+@ref{Conditionals and Loops}.
+
+@Example
+.nf
+.nr a 1+2 + 2+1
+\na
+ @error{} expected numeric expression, got a space
+ @result{} 3
+.nr a 1+(2 + 2)+1
+\na
+ @result{} 6
+@endExample
+
+The @code{nr} request (@pxref{Setting Registers}) expects its second and
+optional third arguments to be numeric expressions; a bare @code{+} does
+not qualify, so our first attempt got a warning.
+@c END Keep (roughly) parallel with section "Numeric expressions" of
+@c groff(7).
+
+
+@c =====================================================================
+
+@c BEGIN Keep (roughly) parallel with section "Identifiers" of groff(7).
+@node Identifiers, Formatter Instructions, Numeric Expressions, GNU troff Reference
+@section Identifiers
+@cindex identifiers
+
+An @dfn{identifier} labels a GNU @code{troff} datum such as a register,
+name (macro, string, or diversion), typeface, color, special character,
+character class, environment, or stream. Valid identifiers consist of
+one or more ordinary characters.
+@cindex ordinary character
+@cindex character, ordinary
+An @slanted{ordinary character} is an input character that is not the
+escape character, a leader, tab, newline, or invalid as GNU @code{troff}
+input.
+
+@c XXX: We might move this discussion earlier since it is applicable to
+@c troff input in general, and include a reference to the `trin`
+@c request.
+@cindex invalid input characters
+@cindex input characters, invalid
+@cindex characters, invalid input
+@cindex Unicode
+Invalid input characters are a subset of control characters (from the
+sets ``C0 Controls'' and ``C1 Controls'' as Unicode describes them).
+When GNU @code{troff} encounters one in an identifier, it produces a
+warning in category @samp{input} (@pxref{Warnings}). They are removed
+during interpretation: an identifier @samp{foo}, followed by an invalid
+character and then @samp{bar}, is processed as @samp{foobar}.
+
+On a machine using the ISO 646, 8859, or 10646 character encodings,
+invalid input characters are @code{0x00}, @code{0x08}, @code{0x0B},
+@code{0x0D}--@code{0x1F}, and @code{0x80}--@code{0x9F}. On an
+@acronym{EBCDIC} host, they are @code{0x00}--@code{0x01}, @code{0x08},
+@code{0x09}, @code{0x0B}, @code{0x0D}--@code{0x14},
+@code{0x17}--@code{0x1F}, and
+@code{0x30}--@code{0x3F}.@footnote{Historically, control characters like
+ASCII STX, ETX, and BEL (@key{Control+B}, @key{Control+C}, and
+@key{Control+G}) have been observed in @code{roff} documents,
+particularly in macro packages employing them as delimiters with the
+output comparison operator to try to avoid collisions with the content
+of arbitrary user-supplied parameters (@pxref{Operators in
+Conditionals}). We discourage this expedient; in GNU @code{troff} it is
+unnecessary (outside of compatibility mode) because delimited arguments
+are parsed at a different input level than the surrounding context.
+@xref{Implementation Differences}.} Some of these code points are used
+by GNU @code{troff} internally, making it non-trivial to extend the
+program to accept UTF-8 or other encodings that use characters from
+these ranges.@footnote{Consider what happens when a C1 control
+@code{0x80}--@code{0x9F} is necessary as a continuation byte in a UTF-8
+sequence.}
+
+Thus, the identifiers @samp{br}, @samp{PP}, @samp{end-list},
+@samp{ref*normal-print}, @samp{|}, @samp{@@_}, and @samp{!"#$%'()*+,-./}
+are all valid. Discretion should be exercised to prevent confusion.
+Identifiers starting with @samp{(} or @samp{[} require care.
+
+@Example
+.nr x 9
+.nr y 1
+.nr (x 2
+.nr [y 3
+.nr sum1 (\n(x + \n[y])
+ @error{} a space character is not allowed in an escape
+ @error{} sequence parameter
+A:2+3=\n[sum1]
+.nr sum2 (\n((x + \n[[y])
+B:2+3=\n[sum2]
+.nr sum3 (\n[(x] + \n([y)
+C:2+3=\n[sum3]
+ @result{} A:2+3=1 B:2+3=5 C:2+3=5
+@endExample
+
+@cindex @code{]}, as part of an identifier
+@noindent
+An identifier with a closing bracket (@samp{]}) in its name can't be
+accessed with bracket-form escape sequences that expect an identifier as
+a parameter. For example, @samp{\[foo]]} accesses the glyph @samp{foo},
+followed by @samp{]} in whatever the surrounding context is, whereas
+@samp{\C'foo]'} formats a glyph named @samp{foo]}. Similarly, the
+identifier @samp{(} can't be interpolated @emph{except} with bracket
+forms.
+
+@cindex @code{refer}, and macro names starting with @code{[} or @code{]}
+@cindex @code{[}, macro names starting with, and @code{refer}
+@cindex @code{]}, macro names starting with, and @code{refer}
+@cindex macro names, starting with @code{[} or @code{]}, and @code{refer}
+If you begin a macro, string, or diversion name with either of the
+characters @samp{[} or @samp{]}, you foreclose use of the @code{grefer}
+preprocessor, which recognizes @samp{.[} and @samp{.]} as bibliographic
+reference delimiters.
+
+@Defesc {\\A, @code{'}, anything, @code{'}}
+Interpolate@tie{}1 if @var{anything} is a valid identifier, and@tie{}0
+otherwise. The delimiter need not be a neutral apostrophe; see
+@ref{Delimiters}. Because invalid input characters are removed (see
+above), invalid identifiers are empty or contain spaces, tabs, or
+newlines.
+
+You can employ @code{\A} to validate a macro argument before using it to
+construct another escape sequence or identifier.
+
+@Example
+.\" usage: .init-coordinate-pair name val1 val2
+.\" Create a coordinate pair where name!x=val1 and
+.\" name!y=val2.
+.de init-coordinate-pair
+. if \A'\\$1' \@{\
+. if \B'\\$2' .nr \\$1!x \\$2
+. if \B'\\$3' .nr \\$1!y \\$3
+. \@}
+..
+.init-coordinate-pair center 5 10
+The center is at (\n[center!x], \n[center!y]).
+.init-coordinate-pair "poi@arrow{}nt" trash garbage \" ignored
+.init-coordinate-pair point trash garbage \" ignored
+ @result{} The center is at (5, 10).
+@endExample
+
+@noindent
+In this example, we also validated the numeric arguments; the registers
+@samp{point!x} and @samp{point!y} remain undefined. @xref{Numeric
+Expressions} for the @code{\B} escape sequence.
+@endDefesc
+
+@cindex undefined identifiers
+@cindex identifiers, undefined
+How GNU @code{troff} handles the interpretation of an undefined
+identifier depends on the context. There is no way to invoke an
+undefined request; such syntax is interpreted as a macro call instead.
+If the identifier is interpreted as a string, macro, or diversion, GNU
+@code{troff} emits a warning in category @samp{mac}, defines it as
+empty, and interpolates nothing. If the identifier is interpreted as a
+register, GNU @code{troff} emits a warning in category @samp{reg},
+initializes it to zero, and interpolates that value. @xref{Warnings},
+@ref{Interpolating Registers}, and @ref{Strings}. Attempting to use an
+undefined typeface, special character, color, character class,
+environment, or stream generally provokes an error diagnostic.
+
+@need 1000
+@cindex name space, common, of macros, diversions, and strings
+@cindex common name space of macros, diversions, and strings
+@cindex macros, shared name space with strings and diversions
+@cindex strings, shared name space with macros and diversions
+@cindex diversions, shared name space with macros and strings
+Identifiers for requests, macros, strings, and diversions share one name
+space; special characters and character classes another. No other
+object types do.
+
+@Example
+.de xxx
+. nop foo
+..
+@c . slack line for pagination management
+.di xxx
+bar
+.br
+.di
+.
+.xxx
+ @result{} bar
+@endExample
+
+@noindent
+The foregoing example shows that GNU @code{troff} reuses the identifier
+@samp{xxx}, changing it from a macro to a diversion. No warning is
+emitted, and the previous contents of @samp{xxx} are lost.
+@c END Keep (roughly) parallel with section "Identifiers" of groff(7).
+
+
+@c =====================================================================
+
+@node Formatter Instructions, Registers, Identifiers, GNU troff Reference
+@section Formatter Instructions
+@cindex formatter instructions
+@cindex instructing the formatter
+
+To support documents that require more than filling, automatic line
+breaking and hyphenation, adjustment, and supplemental inter-sentence
+space, the @code{roff} language offers two means of embedding
+instructions to the formatter.
+
+@cindex request
+One is a @dfn{request}, which begins with a control character and takes
+up the remainder of the input line. Requests often perform relatively
+large-scale operations such as setting the page length, breaking the
+line, or starting a new page. They also conduct internal operations
+like defining macros.
+
+@cindex escape sequence
+@cindex sequence, escape
+The other is an @dfn{escape sequence}, which begins with the escape
+character and can be embedded anywhere in the input, even in arguments
+to requests and other escape sequences. Escape sequences interpolate
+special characters, strings, or registers, and handle comparatively
+minor formatting tasks like sub- and superscripting.
+
+Some operations, such as font selection and type size alteration, are
+available via both requests and escape sequences.
+
+@menu
+* Control Characters::
+* Invoking Requests::
+* Calling Macros::
+* Using Escape Sequences::
+* Delimiters::
+@end menu
+
+@c ---------------------------------------------------------------------
+
+@node Control Characters, Invoking Requests, Formatter Instructions, Formatter Instructions
+@subsection Control Characters
+@cindex control characters
+@cindex configuring control characters
+@cindex changing control characters
+
+The mechanism of using @code{roff}'s control characters to invoke
+requests and call macros was introduced in @ref{Requests and Macros}.
+Control characters are recognized only at the beginning of an input
+line, or at the beginning of the branch of a control structure request;
+see @ref{Conditionals and Loops}.
+
+A few requests cause a break implicitly; use the no-break control
+character to prevent the break. Break suppression is its sole
+behavioral distinction. Employing the no-break control character to
+invoke requests that don't cause breaks is harmless but poor style.
+@xref{Manipulating Filling and Adjustment}.
+
+@cindex control character, changing (@code{cc})
+@cindex character, control, changing (@code{cc})
+@cindex no-break control character, changing (@code{c2})
+@cindex character, no-break control, changing (@code{c2})
+@cindex control character, no-break, changing (@code{c2})
+The control @samp{.} and no-break control @samp{'} characters can each
+be changed to any ordinary character@footnote{Recall @ref{Identifiers}.}
+with the @code{cc} and @code{c2} requests, respectively.
+
+@Defreq {cc, [@Var{o}]}
+Recognize the ordinary character@tie{}@var{o} as the control character.
+If@tie{}@var{o} is absent or invalid, the default control character
+@samp{.} is selected. The identity of the control character is
+associated with the environment (@pxref{Environments}).
+@endDefreq
+
+@Defreq {c2, [@Var{o}]}
+Recognize the ordinary character@tie{}@var{o} as the no-break control
+character. If@tie{}@var{o} is absent or invalid, the default no-break
+control character @samp{'} is selected. The identity of the no-break
+control character is associated with the environment
+(@pxref{Environments}).
+@endDefreq
+
+When writing a macro, you might wish to know which control character was
+used to call it.
+
+@Defreg {.br}
+This read-only register interpolates@tie{}1 if the currently executing
+macro was called using the normal control character and@tie{}0
+otherwise. If a macro is interpolated as a string, the @code{.br}
+register's value is inherited from the context of the string
+interpolation. @xref{Strings}.
+
+@cindex intercepting requests
+@cindex requests, intercepting
+@cindex modifying requests
+@cindex requests, modifying
+Use this register to reliably intercept requests that imply breaks.
+
+@Example
+.als bp*orig bp
+.de bp
+. ie \\n[.br] .bp*orig
+. el 'bp*orig
+..
+@endExample
+
+Testing the @code{.br} register outside of a macro definition makes no
+sense.
+@endDefreg
+
+@c ---------------------------------------------------------------------
+
+@c BEGIN Keep (roughly) parallel with section "Requests" of groff(7).
+@node Invoking Requests, Calling Macros, Control Characters, Formatter Instructions
+@subsection Invoking Requests
+@cindex invoking requests
+@cindex requests, invoking
+
+A control character is optionally followed by tabs and/or spaces and
+then an identifier naming a request or macro. The invocation of an
+unrecognized request is interpreted as a macro call. Defining a macro
+with the same name as a request replaces the request. Deleting a
+request name with the @code{rm} request makes it unavailable. The
+@code{als} request can alias requests, permitting them to be wrapped or
+non-destructively replaced. @xref{Strings}.
+
+@cindex request arguments
+@cindex arguments to requests
+@cindex tabs, and macro arguments
+@cindex macro arguments, and tabs
+@cindex arguments to macros, and tabs
+@cindex tabs, and request arguments
+@cindex request arguments, and tabs
+@cindex arguments to requests, and tabs
+There is no inherent limit on argument length or quantity. Most
+requests take one or more arguments, and ignore any they do not expect.
+A request may be separated from its arguments by tabs or spaces, but
+only spaces can separate an argument from its successor. Only one
+between arguments is necessary; any excess is ignored. GNU @code{troff}
+does not allow tabs for argument separation.@footnote{In compatibility
+mode, a space is not necessary after a request or macro name of two
+characters' length. Also, Plan@tie{}9 @code{troff} allows tabs to
+separate arguments.}
+
+Generally, a space @emph{within} a request argument is not relevant, not
+meaningful, or is supported by bespoke provisions, as with the @code{tl}
+request's delimiters (@pxref{Page Layout}). Some requests, like
+@code{ds}, interpret the remainder of the control line as a single
+argument. @xref{Strings}.
+
+@need 1000
+@cindex structuring source code of documents or macro packages
+@cindex documents, structuring the source of
+@cindex macro package, structuring the source of
+@cindex package, package, structuring the source of
+@cindex indentation, of @code{roff} source code
+Spaces and tabs immediately after a control character are ignored.
+Commonly, authors structure the source of documents or macro files with
+them.
+
+@Example
+.de center
+. if \\n[.br] \
+. br
+. ce \\$1
+..
+.
+.
+.de right-align
+.@arrow{}if \\n[.br] \
+.@arrow{}@arrow{}br
+.@arrow{}rj \\$1
+..
+@endExample
+
+@cindex blank line trap (@code{blm})
+@cindex blank line macro (@code{blm})
+If you assign an empty blank line trap, you can separate macro
+definitions (or any input lines) with blank lines.
+
+@Example
+.de do-nothing
+..
+.blm do-nothing \" activate blank line trap
+
+.de center
+. if \\n[.br] \
+. br
+. ce \\$1
+..
+
+
+.de right-align
+.@arrow{}if \\n[.br] \
+.@arrow{}@arrow{}br
+.@arrow{}rj \\$1
+..
+
+.blm \" deactivate blank line trap
+@endExample
+
+@xref{Blank Line Traps}.
+@c END Keep (roughly) parallel with section "Requests" of groff(7).
+
+@c ---------------------------------------------------------------------
+
+@need 1000
+@node Calling Macros, Using Escape Sequences, Invoking Requests, Formatter Instructions
+@subsection Calling Macros
+@cindex calling macros
+@cindex macro arguments
+@cindex arguments to macros
+
+If a macro of the desired name does not exist when called, it is
+created, assigned an empty definition, and a warning in category
+@samp{mac} is emitted. Calling an undefined macro @emph{does} end a
+macro definition naming it as its end macro (@pxref{Writing Macros}).
+
+@cindex spaces, in a macro argument
+To embed spaces @emph{within} a macro argument, enclose the argument in
+neutral double quotes @code{"}. Horizontal motion escape sequences are
+sometimes a better choice for arguments to be formatted as text.
+
+Consider calls to a hypothetical section heading macro @samp{uh}.
+
+@Example
+.uh The Mouse Problem
+.uh "The Mouse Problem"
+.uh The\~Mouse\~Problem
+.uh The\ Mouse\ Problem
+@endExample
+
+@cindex @code{\~}, difference from @code{\@key{SP}}
+@cindex @code{\@key{SP}}, difference from @code{\~}
+@noindent
+The first line calls @code{uh} with three arguments: @samp{The},
+@samp{Mouse}, and @samp{Problem}. The remainder call the @code{uh}
+macro with one argument, @samp{The Mouse Problem}. The last solution,
+using escaped spaces, can be found in documents prepared for
+@acronym{AT&T} @code{troff}. It can cause surprise when text is
+adjusted, because @code{\@key{SP}} inserts a @emph{fixed-width},
+non-breaking space. GNU @code{troff}'s @code{\~} escape sequence
+inserts an adjustable, non-breaking space.@footnote{@code{\~} is fairly
+portable; see @ref{Other Differences}.}
+
+@cindex @code{"}, embedding in a macro argument
+@cindex double quote, embedding in a macro argument
+@cindex @code{\}, embedding in a macro argument
+@cindex backslash, embedding in a macro argument
+The foregoing raises the question of how to embed neutral double quotes
+or backslashes in macro arguments when @emph{those} characters are
+desired as literals. In GNU @code{troff}, the special character escape
+sequence @code{\[rs]} produces a backslash and @code{\[dq]} a neutral
+double quote.
+
+In GNU @code{troff}'s @acronym{AT&T} compatibility mode, these
+characters remain available as @code{\(rs} and @code{\(dq},
+respectively. @acronym{AT&T} @code{troff} did not consistently define
+these special characters,
+@c It seems that AT&T troff never recognized \(rs, though DWB 3.3
+@c defined \(bs as an alias of "\" on its "Latin1" device, in
+@c deliberate(?) collision with the Bell System logo identifier. It
+@c also defined \(dq for several devices (pcl, Latin1, nroff, ...) along
+@c with \(aq.
+but its descendants can be made to support them. @xref{Device and Font
+Description Files}.
+
+If even that is not feasible, options remain. To obtain a literal
+escape character in a macro argument, you can simply type it if you
+change or disable the escape character first. @xref{Using Escape
+Sequences}. Otherwise, you must escape the escape character repeatedly
+to a context-dependent extent. @xref{Copy Mode}.
+
+For the (neutral) double quote, you have recourse to an obscure
+syntactical feature of @acronym{AT&T} @code{troff}. Because a double
+quote can begin a macro argument, the formatter keeps track of whether
+the current argument was started thus, and doesn't require a space after
+the double quote that ends it.@footnote{Strictly, you can neglect to
+close the last quoted macro argument, relying on the end of the control
+line to do so. We consider this lethargic practice poor style.} In
+the argument list to a macro, a double quote that @emph{isn't} preceded
+by a space @emph{doesn't} start a macro argument. If not preceded by a
+double quote that began an argument, this double quote becomes part of
+the argument. Furthermore, within a quoted argument, a pair of adjacent
+double quotes becomes a literal double quote.
+
+@Example
+.de eq
+. tm arg1:\\$1 arg2:\\$2 arg3:\\$3
+. tm arg4:\\$4 arg5:\\$5 arg6:\\$6
+.. \" 4 backslashes on the next line
+.eq a" "b c" "de"f\\\\g" h""i "j""k"
+ @error{} arg1:a" arg2:b c arg3:de
+ @error{} arg4:f\g" arg5:h""i arg6:j"k
+@endExample
+
+Apart from the complexity of the rules, this traditional solution has
+the disadvantage that double quotes don't survive repeated argument
+expansion in @acronym{AT&T} @code{troff} or GNU @code{troff}'s
+compatibility mode. This can frustrate efforts to pass such arguments
+intact through multiple macro calls.
+
+@Example
+.cp 1
+.de eq
+. tm arg1:\\$1 arg2:\\$2 arg3:\\$3
+. tm arg4:\\$4 arg5:\\$5 arg6:\\$6
+..
+.de xe
+. eq \\$1 \\$2 \\$3 \\$4 \\$5 \\$6
+.. \" 8 backslashes on the next line
+.xe a" "b c" "de"f\\\\\\\\g" h""i "j""k"
+ @error{} arg1:a" arg2:b arg3:c
+ @error{} arg4:de arg5:f\g" arg6:h""i
+@endExample
+
+@cindex input level
+@cindex level, input
+@cindex interpolation depth
+@cindex depth, interpolation
+Outside of compatibility mode, GNU @code{troff} doesn't exhibit this
+problem because it tracks the nesting depth of interpolations.
+@xref{Implementation Differences}.
+
+@c ---------------------------------------------------------------------
+
+@c BEGIN Keep (roughly) parallel with section "Using escape sequences"
+@c of groff(7).
+@node Using Escape Sequences, Delimiters, Calling Macros, Formatter Instructions
+@subsection Using Escape Sequences
+@cindex using escape sequences
+@cindex escape sequences
+
+Whereas requests must occur on control lines, escape sequences can occur
+intermixed with text and may appear in arguments to requests, macros,
+and other escape sequences.
+@esindex \
+An escape sequence is introduced by the escape character, a backslash
+@code{\} (but see the @code{ec} request below). The next character
+selects the escape's function.
+
+Escape sequences vary in length. Some take an argument, and of those,
+some have different syntactical forms for a one-character,
+two-character, or arbitrary-length argument. Others accept @emph{only}
+an arbitrary-length argument. In the former scheme, a one-character
+argument follows the function character immediately, an opening
+parenthesis @samp{(} introduces a two-character argument (no closing
+parenthesis is used), and an argument of arbitrary length is enclosed in
+brackets @samp{[]}. In the latter scheme, the user selects a delimiter
+character. A few escape sequences are idiosyncratic, and support both
+of the foregoing conventions (@code{\s}), designate their own
+termination sequence (@code{\?}), consume input until the next newline
+(@code{\!}, @code{\"}, @code{\#}), or support an additional modifier
+character (@code{\s} again, and @code{\n}). As with requests, use of
+some escape sequences in source documents may interact poorly with a
+macro package you use; consult its documentation to learn of ``safe''
+sequences or alternative facilities it provides to achieve the desired
+result.
+
+If an escape character is followed by a character that does not
+identify a defined operation, the escape character is ignored (producing
+a diagnostic of the @samp{escape} warning category, which is not enabled
+by default) and the following character is processed normally.
+
+@Example
+$ groff -Tps -ww
+.nr N 12
+.ds co white
+.ds animal elephant
+I have \fI\nN \*(co \*[animal]s,\f[]
+said \P.\&\~Pseudo Pachyderm.
+ @error{} warning: escape character ignored before 'P'
+ @result{} I have @slanted{12 white elephants,} said P. Pseudo Pachyderm.
+@endExample
+
+Escape sequence interpolation is of higher precedence than escape
+sequence argument interpretation. This rule affords flexibility in
+using escape sequences to construct parameters to other escape
+sequences.
+@c END Keep (roughly) parallel with section "Escape sequences" of
+@c groff(7).
+
+@Example
+.ds family C\" Courier
+.ds style I\" oblique
+Choice a typeface \f(\*[family]\*[style]wisely.
+ @result{} Choose a typeface @slanted{wisely.}
+@endExample
+
+@noindent
+In the above, the syntax form @samp{\f(} accepts only two characters for
+an argument; the example works because the subsequent escape sequences
+are interpolated before the selection escape sequence argument is
+processed, and strings @code{family} and @code{style} interpolate one
+character each.@footnote{The omission of spaces before the comment
+escape sequences is necessary; see @ref{Strings}.}
+
+@c @need 1000
+The escape character is nearly always interpreted when encountered; it
+is therefore desirable to have a way to interpolate it, disable it, or
+change it.
+
+@cindex formatting the escape character (@code{\e})
+@cindex escape character, formatting (@code{\e})
+@Defesc {\\e, , , }
+Interpolate the escape character.
+@endDefesc
+
+@cindex formatting a backslash glyph (@code{\[rs]})
+@cindex backslash glyph, formatting (@code{\[rs]})
+The @code{\[rs]} special character escape sequence formats a backslash
+glyph. In macro and string definitions, the input sequences @code{\\}
+and @code{\E} defer interpretation of escape sequences. @xref{Copy
+Mode}.
+
+@Defreq {eo, }
+@cindex disabling @code{\} (@code{eo})
+@cindex @code{\}, disabling (@code{eo})
+Disable the escape mechanism except in copy mode. Once this request is
+invoked, no input character is recognized as starting an escape
+sequence in interpretation mode.
+@endDefreq
+
+@Defreq {ec, [@Var{o}]}
+@cindex escape character, changing (@code{ec})
+@cindex character, escape, changing (@code{ec})
+Recognize the ordinary character@tie{}@var{o} as the escape character.
+If@tie{}@var{o} is absent or invalid, the default escape character
+@samp{\} is selected.
+@endDefreq
+
+Switching escape sequence interpretation off to define a macro and back
+on afterward can obviate the need to double the escape character within
+the definition. @xref{Writing Macros}. This technique is not available
+if your macro needs to interpolate values at the time it is
+@emph{defined}---but many do not.
+
+@Example
+.\" simplified `BR` macro from the man(7) macro package
+.eo
+.de BR
+. ds result \&
+. while (\n[.$] >= 2) \@{\
+. as result \fB\$1\fR\$2\"
+. shift 2
+. \@}
+. if \n[.$] .as result \fB\$1\"
+\*[result]
+. rm result
+. ft R
+..
+.ec
+@endExample
+
+@DefreqList {ecs, }
+@DefreqListEndx {ecr, }
+The @code{ecs} request stores the escape character for recall with
+@code{ecr}. @code{ecr} sets the escape character to @samp{\} if none
+has been saved.
+
+Use these requests together to temporarily change the escape character.
+@endDefreq
+
+Using a different escape character, or disabling it, when calling macros
+not under your control will likely cause errors, since GNU @code{troff}
+has no mechanism to ``intern'' macros---that is, to convert a macro
+definition into a form independent of its
+representation.@footnote{@TeX{} does have such a mechanism.} When a
+macro is called, its contents are interpreted literally.
+@c XXX: all that stuff mapped into the C0 and C1 controls seems pretty
+@c close to an interning mechanism to me, though... --GBR
+
+@c XXX: Motivation? Why are we directing the reader to these?
+@c @xref{Diversions}, and @ref{Identifiers}.
+
+@c BEGIN Keep (roughly) parallel with subsection "Delimiters" of
+@c groff(7).
+@node Delimiters, , Using Escape Sequences, Formatter Instructions
+@subsection Delimiters
+@cindex delimiting escape sequence arguments
+@cindex escape sequence argument delimiters
+@cindex delimiters, for escape sequence arguments
+@cindex arguments, to escape sequences, delimiting
+
+@cindex @code{'}, as delimiter
+@cindex @code{"}, as delimiter
+Some escape sequences that require parameters use delimiters. The
+neutral apostrophe @code{'} is a popular choice and shown in this
+document. The neutral double quote @code{"} is also commonly seen.
+Letters, numerals, and leaders can be used. Punctuation characters
+are likely better choices, except for those defined as infix operators
+in numeric expressions; see below.
+
+@Example
+\l'1.5i\[bu]' \" draw 1.5 inches of bullet glyphs
+@endExample
+
+@cindex @code{\%}, as delimiter
+@cindex @code{\@key{SP}}, as delimiter
+@cindex @code{\|}, as delimiter
+@cindex @code{\^}, as delimiter
+@cindex @code{\@{}, as delimiter
+@cindex @code{\@}}, as delimiter
+@cindex @code{\'}, as delimiter
+@cindex @code{\`}, as delimiter
+@cindex @code{\-}, as delimiter
+@cindex @code{\_}, as delimiter
+@cindex @code{\!}, as delimiter
+@cindex @code{\?}, as delimiter
+@cindex @code{\)}, as delimiter
+@cindex @code{\/}, as delimiter
+@cindex @code{\,}, as delimiter
+@cindex @code{\&}, as delimiter
+@cindex @code{\:}, as delimiter
+@cindex @code{\~}, as delimiter
+@cindex @code{\0}, as delimiter
+@cindex @code{\a}, as delimiter
+@cindex @code{\c}, as delimiter
+@cindex @code{\d}, as delimiter
+@cindex @code{\e}, as delimiter
+@cindex @code{\E}, as delimiter
+@cindex @code{\p}, as delimiter
+@cindex @code{\r}, as delimiter
+@cindex @code{\t}, as delimiter
+@cindex @code{\u}, as delimiter
+The following escape sequences don't take arguments and thus are allowed
+as delimiters:
+@code{\@key{SP}}, @code{\%}, @code{\|}, @code{\^}, @code{\@{},
+@code{\@}}, @code{\'}, @code{\`}, @code{\-}, @code{\_}, @code{\!},
+@code{\?}, @code{\)}, @code{\/}, @code{\,}, @code{\&}, @code{\:},
+@code{\~}, @code{\0}, @code{\a}, @code{\c}, @code{\d}, @code{\e},
+@code{\E}, @code{\p}, @code{\r}, @code{\t}, and @code{\u}. However,
+using them this way is discouraged; they can make the input confusing to
+read.
+
+@cindex @code{\A}, delimiters allowed by
+@cindex @code{\b}, delimiters allowed by
+@cindex @code{\o}, delimiters allowed by
+@cindex @code{\w}, delimiters allowed by
+@cindex @code{\X}, delimiters allowed by
+@cindex @code{\Z}, delimiters allowed by
+@cindex newline, as delimiter
+A few escape sequences,
+@code{\A},
+@code{\b},
+@code{\o},
+@code{\w},
+@code{\X},
+and @code{\Z}, accept a newline as a delimiter. Newlines that serve
+as delimiters continue to be recognized as input line terminators.
+
+@Example
+A caf\o
+e\(aa
+in Paris
+ @result{} A café in Paris
+@endExample
+
+@noindent
+Use of newlines as delimiters in escape sequences is also discouraged.
+
+@cindex @code{\D}, delimiters allowed by
+@cindex @code{\h}, delimiters allowed by
+@cindex @code{\H}, delimiters allowed by
+@cindex @code{\l}, delimiters allowed by
+@cindex @code{\L}, delimiters allowed by
+@cindex @code{\N}, delimiters allowed by
+@cindex @code{\R}, delimiters allowed by
+@cindex @code{\s}, delimiters allowed by
+@cindex @code{\S}, delimiters allowed by
+@cindex @code{\v}, delimiters allowed by
+@cindex @code{\x}, delimiters allowed by
+Finally, the escape sequences @code{\D}, @code{\h}, @code{\H},
+@code{\l}, @code{\L}, @code{\N}, @code{\R}, @code{\s}, @code{\S},
+@code{\v}, and @code{\x} prohibit many delimiters.
+
+@itemize @bullet
+@item
+@cindex numerals, as delimiters
+@cindex digits, as delimiters
+@cindex @code{.}, as delimiter
+@cindex decimal point, as delimiter
+@cindex dot, as delimiter
+the numerals @code{0}-@code{9} and the decimal point @code{.}
+
+@item
+@cindex operators, as delimiters
+@cindex @code{+}, as delimiter
+@cindex @code{-}, as delimiter
+@cindex @code{/}, as delimiter
+@cindex @code{*}, as delimiter
+@cindex @code{%}, as delimiter
+@cindex @code{<}, as delimiter
+@cindex @code{>}, as delimiter
+@cindex @code{=}, as delimiter
+@cindex @code{&}, as delimiter
+@ifnotinfo
+@cindex @code{:}, as delimiter
+@end ifnotinfo
+@ifinfo
+@cindex <colon>, as delimiter
+@end ifinfo
+@cindex @code{(}, as delimiter
+@cindex @code{)}, as delimiter
+the (single-character) operators @samp{+-/*%<>=&:()}
+
+@item
+@cindex space character, as delimiter
+@cindex tab character, as delimiter
+the space and tab characters
+
+@item
+@cindex @code{\%}, as delimiter
+@cindex @code{\:}, as delimiter
+@cindex @code{\@{}, as delimiter
+@cindex @code{\@}}, as delimiter
+@cindex @code{\'}, as delimiter
+@cindex @code{\`}, as delimiter
+@cindex @code{\-}, as delimiter
+@cindex @code{\_}, as delimiter
+@cindex @code{\!}, as delimiter
+@cindex @code{\/}, as delimiter
+@cindex @code{\c}, as delimiter
+@cindex @code{\e}, as delimiter
+@cindex @code{\p}, as delimiter
+any escape sequences other than @code{\%}, @code{\:}, @code{\@{},
+@code{\@}}, @code{\'}, @code{\`}, @code{\-}, @code{\_}, @code{\!},
+@code{\/}, @code{\c}, @code{\e}, and @code{\p}
+@end itemize
+
+Delimiter syntax is complex and flexible primarily for historical
+reasons; the foregoing restrictions need be kept in mind mainly when
+using @code{groff} in @acronym{AT&T} compatibility mode. GNU
+@code{troff} keeps track of the nesting depth of escape sequence
+interpolations, so the only characters you need to avoid using as
+delimiters are those that appear in the arguments you input, not any
+that result from interpolation. Typically, @code{'} works fine.
+@xref{Implementation Differences}.
+
+@Example
+$ groff -Tps
+.de Mw
+. nr wd \w'\\$1'
+. tm "\\$1" is \\n(wd units wide.
+..
+.Mw Wet'suwet'en
+.Mw Wet+200i
+.cp 1 \" turn on compatibility mode
+.Mw Wet'suwet'en
+.Mw Wet'
+.Mw Wet+200i
+ @error{} "Wet'suwet'en" is 54740 units wide.
+ @error{} "Wet'+200i" is 42610 units wide.
+ @error{} "Wet'suwet'en" is 15860 units wide.
+ @error{} "Wet'" is 15860 units wide.
+ @error{} "Wet'+200i" is 14415860 units wide.
+@endExample
+
+We see here that in compatibility mode, the part of the argument after
+the @code{'} delimiter escapes from its context and, if nefariously
+crafted, influences the computation of the @var{wd} register's value in
+a surprising way.
+@c END Keep (roughly) parallel with subsection " Delimiters" of
+@c groff(7).
+
+@node Comments, Registers, Formatter Instructions, GNU troff Reference
+@section Comments
+@cindex comments
+
+One of the most common forms of escape sequence is the
+comment.@footnote{This claim may be more aspirational than descriptive.}
+
+@Defesc {\\", , , }
+Start a comment. Everything up to the next newline is ignored.
+
+This may sound simple, but it can be tricky to keep the comments from
+interfering with the appearance of the output.
+@cindex @code{ds}, @code{ds1} requests, and comments
+@cindex @code{as}, @code{as1} requests, and comments
+If the escape sequence is to the right of some text or a request, that
+portion of the line is ignored, but spaces preceding it are processed
+normally by GNU @code{troff}. This affects only the @code{ds} and
+@code{as} requests and their variants.
+
+@cindex tabs, before comments
+@cindex comments, lining up with tabs
+One possibly irritating idiosyncrasy is that tabs should not be used to
+vertically align comments in the source document. Tab characters are
+not treated as separators between a request name and its first argument,
+nor between arguments.
+
+@cindex undefined request
+@cindex request, undefined
+A comment on a line by itself is treated as a blank line, because after
+eliminating the comment, that is all that remains.
+
+@Example
+Test
+\" comment
+Test
+ @result{} Test
+ @result{}
+ @result{} Test
+@endExample
+
+To avoid this, it is common to combine the empty request with the
+comment escape sequence as @samp{.\"}, causing the input line to be
+ignored.
+
+@cindex @code{'}, as a comment
+Another commenting scheme sometimes seen is three consecutive single
+quotes (@code{'''}) at the beginning of a line. This works, but GNU
+@code{troff} emits a warning diagnostic (if enabled) about an undefined
+macro (namely @samp{''}).
+@endDefesc
+
+@Defesc {\\#, , , }
+Start a comment; everything up to and including the next newline is
+ignored. This @code{groff} extension was introduced to avoid the
+problems described above.
+
+@Example
+Test
+\# comment
+Test
+ @result{} Test Test
+@endExample
+@endDefesc
+
+@Defreq {ig, [@Var{end}]}
+Ignore input until, in the current conditional block (if
+any),@footnote{@xref{Conditional Blocks}.} the macro @var{end} is called
+at the start of a control line, or the control line @samp{..} is
+encountered if @var{end} is not specified. @code{ig} is parsed as if it
+were a macro definition, but its contents are discarded, not
+stored.@footnote{Exception: auto-incrementing registers defined outside
+the ignored region @emph{will} be modified if interpolated with
+@code{\n±} inside it. @xref{Auto-increment}.}
+
+@c Wrap example at 56 columns.
+@Example
+hand\c
+.de TX
+fasting
+..
+.ig TX
+This is part of a large block of input that has been
+temporarily(?) commented out.
+We can restore it simply by removing the .ig request and
+the call of its end macro.
+.TX
+@endExample
+@Example
+ @result{} handfasting
+@endExample
+@endDefreq
+
+
+@c =====================================================================
+
+@c BEGIN Keep (roughly) parallel with subsection "Registers" of
+@c groff(7).
+@node Registers, Manipulating Filling and Adjustment, Formatter Instructions, GNU troff Reference
+@section Registers
+@cindex registers
+
+In the @code{roff} language, numbers can be stored in @dfn{registers}.
+Many built-in registers exist, supplying anything from the date to
+details of formatting parameters. You can also define your own.
+@xref{Identifiers}, for information on constructing a valid name for a
+register.
+
+@menu
+* Setting Registers::
+* Interpolating Registers::
+* Auto-increment::
+* Assigning Register Formats::
+* Built-in Registers::
+@end menu
+
+@c ---------------------------------------------------------------------
+
+@node Setting Registers, Interpolating Registers, Registers, Registers
+@subsection Setting Registers
+@cindex setting registers (@code{nr}, @code{\R})
+@cindex registers, setting (@code{nr}, @code{\R})
+
+Define registers and update their values with the @code{nr} request or
+the @code{\R} escape sequence.
+
+@DefreqList {nr, ident value}
+@DefescListEndx {\\R, @code{'}, ident value, @code{'}}
+Set register @var{ident} to @var{value}. If @var{ident} doesn't exist,
+GNU @code{troff} creates it. In the @code{\R} escape sequence, the
+delimiter need not be a neutral apostrophe; see @ref{Delimiters}. It
+also does not produce an input token in GNU @code{troff}. @xref{Gtroff
+Internals}.
+
+@Example
+.nr a (((17 + (3 * 4))) % 4)
+\n[a]
+.\R'a (((17 + (3 * 4))) % 4)'
+\n[a]
+ @result{} 1 1
+@endExample
+
+(Later, we will discuss additional forms of @code{nr} and @code{\R} that
+can change a register's value after it is dereferenced but before it is
+interpolated. @xref{Auto-increment}.)
+
+The complete transparency of @code{\R} can cause surprising effects if
+you use registers like @code{.k}, which get evaluated at the time they
+are accessed.
+
+@Example
+.ll 1.6i
+.
+aaa bbb ccc ddd eee fff ggg hhh\R':k \n[.k]'
+.tm :k == \n[:k]
+ @result{} :k == 126950
+.
+.br
+.
+aaa bbb ccc ddd eee fff ggg hhh\h'0'\R':k \n[.k]'
+.tm :k == \n[:k]
+ @result{} :k == 15000
+@endExample
+
+If you process this with the PostScript device (@code{-Tps}), there will
+be a line break eventually after @code{ggg} in both input lines.
+However, after processing the space after @code{ggg}, the partially
+collected line is not overfull yet, so GNU @code{troff} continues to
+collect input until it sees the space (or in this case, the newline)
+after @code{hhh}. At this point, the line is longer than the line
+length, and the line gets broken.
+
+In the first input line, since the @code{\R} escape sequence leaves no
+traces, the check for the overfull line hasn't been done yet at the
+point where @code{\R} gets handled, and you get a value for the
+@code{.k} register that is even greater than the current line length.
+
+In the second input line, the insertion of @code{\h'0'} to cause a
+zero-width motion forces GNU @code{troff} to check the line length,
+which in turn causes the start of a new output line. Now @code{.k}
+returns the expected value.
+@endDefreq
+
+@code{nr} and @code{\R} each have two additional special forms to
+increment or decrement a register.
+
+@DefreqList {nr, ident @t{+}@Var{value}}
+@DefreqItem {nr, ident @t{-}@Var{value}}
+@DefescItemx {\\R, @code{'}, ident @t{+}value, @code{'}}
+@DefescListEnd {\\R, @code{'}, ident @t{-}value, @code{'}}
+Increment (decrement) register @var{ident} by @var{value}. In the
+@code{\R} escape sequence, the delimiter need not be a neutral
+apostrophe; see @ref{Delimiters}.
+
+@Example
+.nr a 1
+.nr a +1
+\na
+ @result{} 2
+@endExample
+
+@cindex negating register values
+A leading minus sign in @var{value} is always interpreted as a
+decrementation operator, not an algebraic sign. To assign a register a
+negative value or the negated value of another register, you can
+force GNU @code{troff} to interpret @samp{-} as a negation or minus,
+rather than decrementation, operator: enclose it with its operand in
+parentheses or subtract it from zero.
+
+@Example
+.nr a 7
+.nr b 3
+.nr a -\nb
+\na
+ @result{} 4
+.nr a (-\nb)
+\na
+ @result{} -3
+.nr a 0-\nb
+\na
+ @result{} -3
+@endExample
+
+If a register's prior value does not exist (the register was undefined),
+an increment or decrement is applied as if to@tie{}0.
+@endDefreq
+
+@Defreq {rr, ident}
+@cindex removing a register (@code{rr})
+@cindex register, removing (@code{rr})
+Remove register @var{ident}. If @var{ident} doesn't exist, the request
+is ignored. Technically, only the name is removed; the register's
+contents are still accessible under aliases created with @code{aln}, if
+any.
+@endDefreq
+
+@Defreq {rnn, ident1 ident2}
+@cindex renaming a register (@code{rnn})
+@cindex register, renaming (@code{rnn})
+Rename register @var{ident1} to @var{ident2}. If @var{ident1} doesn't
+exist, the request is ignored. Renaming a built-in register does not
+otherwise alter its properties.
+@endDefreq
+
+@Defreq {aln, new old}
+@cindex alias, register, creating (@code{aln})
+@cindex creating alias for register (@code{aln})
+@cindex register, creating alias for (@code{aln})
+Create an alias @var{new} for an existing register @var{old}, causing
+the names to refer to the same stored object. If @var{old} is
+undefined, a warning in category @samp{reg} is produced and the request
+is ignored. @xref{Warnings}, for information about the enablement and
+suppression of warnings.
+
+@cindex alias, register, removing (@code{rr})
+@cindex removing alias for register (@code{rr})
+@cindex register, removing alias for (@code{rr})
+To remove a register alias, invoke @code{rr} on its name. A register's
+contents do not become inaccessible until it has no more names.
+@endDefreq
+@c END Keep (roughly) parallel with subsection "Registers" of groff(7).
+
+@c ---------------------------------------------------------------------
+
+@node Interpolating Registers, Auto-increment, Setting Registers, Registers
+@subsection Interpolating Registers
+@cindex interpolating registers (@code{\n})
+@cindex registers, interpolating (@code{\n})
+
+Register contents are interpolated with the @code{\n} escape sequence.
+
+@DefescList {\\n, , i, }
+@DefescItem {\\n, (, id, }
+@DefescListEnd {\\n, [, ident, ]}
+@cindex nested assignments
+@cindex assignments, nested
+@cindex indirect assignments
+@cindex assignments, indirect
+Interpolate register with name @var{ident} (one-character
+name@tie{}@var{i}, two-character name @var{id}). @code{\n} is
+interpreted even in copy mode (@pxref{Copy Mode}). If the register is
+undefined, it is created and assigned a value of@tie{}@samp{0}, that
+value is interpolated, and a warning in category @samp{reg} is emitted.
+@xref{Warnings}, for information about the enablement and suppression of
+warnings.
+
+@Example
+.nr a 5
+.nr as \na+\na
+\n(as
+ @result{} 10
+@endExample
+
+@Example
+.nr a1 5
+.nr ab 6
+.ds str b
+.ds num 1
+\n[a\n[num]]
+ @result{} 5
+\n[a\*[str]]
+ @result{} 6
+@endExample
+@endDefesc
+
+@c ---------------------------------------------------------------------
+
+@node Auto-increment, Assigning Register Formats, Interpolating Registers, Registers
+@subsection Auto-increment
+@cindex auto-incrementation of a register
+@cindex incrementation, automatic, of a register
+@cindex decrementation, automatic, of a register
+
+Registers can also be incremented or decremented by a configured amount
+at the time they are interpolated. The value of the increment is
+specified with a third argument to the @code{nr} request, and a special
+interpolation syntax is used to alter and then retrieve the register's
+value. Together, these features are called
+@dfn{auto-increment}.@footnote{A negative auto-increment can be
+considered an ``auto-decrement''.}
+
+@Defreq {nr, ident value incr}
+@cindex @code{\R}, difference from @code{nr}
+Set register @var{ident} to @var{value} and its auto-incrementation
+amount to to @var{incr}. The @code{\R} escape sequence doesn't support
+an @var{incr} argument.
+@endDefreq
+
+Auto-incrementation is not @emph{completely} automatic; the @code{\n}
+escape sequence in its basic form never alters the value of a register.
+To apply auto-incrementation to a register, interpolate it with
+@samp{\n±}.
+
+@DefescList {\\n, +, i, }
+@DefescItem {\\n, -, i, }
+@DefescItem {\\n, +(, id, }
+@DefescItem {\\n, -(, id, }
+@DefescItem {\\n, +[, ident, ]}
+@DefescListEnd {\\n, -[, ident, ]}
+Increment or decrement @var{ident} (one-character
+name@tie{}@var{i}, two-character name @var{id}) by the register's
+auto-incrementation value and then interpolate the new register value.
+If @var{ident} has no auto-incrementation value, interpolate as with
+@code{\n}.
+@endDefesc
+
+@need 1000
+@Example
+.nr a 0 1
+.nr xx 0 5
+.nr foo 0 -2
+\n+a, \n+a, \n+a, \n+a, \n+a
+.br
+\n-(xx, \n-(xx, \n-(xx, \n-(xx, \n-(xx
+.br
+\n+[foo], \n+[foo], \n+[foo], \n+[foo], \n+[foo]
+ @result{} 1, 2, 3, 4, 5
+ @result{} -5, -10, -15, -20, -25
+ @result{} -2, -4, -6, -8, -10
+@endExample
+
+@cindex increment value without changing the register
+@cindex value, incrementing without changing the register
+To change the increment value without changing the value of a register,
+assign the register's value to itself by interpolating it, and specify
+the desired increment normally. Apply an increment of @samp{0} to
+disable auto-incrementation of the register.
+
+@c ---------------------------------------------------------------------
+
+@node Assigning Register Formats, Built-in Registers, Auto-increment, Registers
+@subsection Assigning Register Formats
+@cindex assign number format to register (@code{af})
+@cindex number formats, assigning to register (@code{af})
+@cindex register, assigning number format to (@code{af})
+
+A writable register's value can be interpolated in several number
+formats. By default, conventional Arabic numerals are used.
+Other formats see use in sectioning and outlining schemes and
+alternative page numbering arrangements.
+
+@Defreq {af, reg fmt}
+Use number format @var{fmt} when interpolating register @var{reg}.
+Valid number formats are as follows.
+
+@table @code
+@item 0@r{@dots{}}
+Arabic numerals 0, 1, 2, and so on.
+Any decimal digit is equivalent to @samp{0}; the formatter merely counts
+the digits specified. Multiple Arabic numerals in @var{fmt} cause
+interpolations to be zero-padded on the left if necessary to at least as
+many digits as specified (interpolations never truncate a register
+value). A register with format @samp{00} interpolates values 1, 2, 3 as
+@samp{01}, @samp{02}, @samp{03}. The default format for all writable
+registers is @samp{0}.
+
+@item I
+@cindex Roman numerals
+@cindex numerals, Roman
+Uppercase Roman numerals: 0, I, II, III, IV,@tie{}@enddots{}
+
+@item i
+Lowercase Roman numerals: 0, i, ii, iii, iv,@tie{}@enddots{}
+
+@item A
+Uppercase letters: 0, A, B, C, @dots{},@tie{}Z, AA, AB,@tie{}@enddots{}
+
+@item a
+Lowercase letters: 0, a, b, c, @dots{},@tie{}z, aa, ab,@tie{}@enddots{}
+@end table
+
+Omitting @var{fmt} causes a warning in category @samp{missing}.
+@xref{Warnings}, for information about the enablement and suppression of
+warnings. Specifying an unrecognized format is an error.
+
+Zero values are interpolated as @samp{0} in non-Arabic formats.
+Negative quantities are prefixed with @samp{-} irrespective of format.
+In Arabic formats, the sign supplements the field width. If @var{reg}
+doesn't exist, it is created with a zero value.
+
+@Example
+.nr a 10
+.af a 0 \" the default format
+\na,
+.af a I
+\na,
+.af a 321
+.nr a (-\na)
+\na,
+.af a a
+\na
+ @result{} 10, X, -010, -j
+@endExample
+
+@cindex Roman numerals, extrema (maximum and minimum)
+@cindex extreme values representable with Roman numerals
+@cindex maximum value representable with Roman numerals
+@cindex minimum value representable with Roman numerals
+The representable extrema in the @samp{i} and @samp{I} formats
+correspond to Arabic ±39,999. GNU @code{troff} uses @samp{w} and
+@samp{z} to represent 5,000 and 10,000 in Roman numerals, respectively,
+following the convention of @acronym{AT&T} @code{troff}---currently, the
+correct glyphs for Roman numerals five thousand (@code{U+2181}) and ten
+thousand (@code{U+2182}) are not used.
+
+@cindex read-only register, changing format
+@cindex changing format, and read-only registers
+Assigning the format of a read-only register is an error. Instead, copy
+the read-only register's value to, and assign the format of, a writable
+register.
+@endDefreq
+
+@DefescList {\\g, , r, }
+@DefescItem {\\g, (, rg, }
+@DefescListEnd {\\g, [, reg, ]}
+@cindex format of register (@code{\g})
+@cindex register, format (@code{\g})
+Interpolate the format of the register @var{reg} (one-character
+name@tie{}@var{r}, two-character name @var{rg}). Zeroes represent
+Arabic formats. If @var{reg} is not defined, @var{reg} is not created
+and nothing is interpolated. @code{\g} is interpreted even in copy mode
+(@pxref{Copy Mode}).
+@endDefesc
+
+@cindex register format, in expressions
+@cindex expressions, and register format
+GNU @code{troff} interprets only Arabic numerals. The Roman numeral or
+alphabetic formats cannot be used as operands to arithmetic operators in
+expressions (@pxref{Numeric Expressions}). For instance, it may be
+desirable to test the page number independently of its format.
+
+@Example
+.af % i \" front matter
+.de header-trap
+. \" To test the page number, we need it in Arabic.
+. ds saved-page-number-format \\g%\"
+. af % 0
+. nr page-number-in-decimal \\n%
+. af % \\*[saved-page-number-format]
+. ie \\n[page-number-in-decimal]=1 .do-first-page-stuff
+. el \@{\
+. ie o .do-odd-numbered-page-stuff
+. el .do-even-numbered-page-stuff
+. \@}
+. rm saved-page-number-format
+..
+.wh 0 header-trap
+@endExample
+
+@c ---------------------------------------------------------------------
+
+@node Built-in Registers, , Assigning Register Formats, Registers
+@subsection Built-in Registers
+@cindex built-in registers
+@cindex registers, built-in
+
+Predefined registers whose identifiers start with a dot are read-only.
+Many are Boolean-valued, interpolating a true or false value testable
+with the @code{if}, @code{ie}, or @code{while} requests. Some read-only
+registers are string-valued, meaning that they interpolate text.
+
+@cindex removing a built-in register
+@cindex register, built-in, removing
+@cindex built-in register, removing
+@strong{Caution:@:} Built-in registers are subject to removal like
+others; once removed, they can be recreated only as normal writable
+registers and will not reflect formatter state.
+
+A register name (without the dot) is often associated with a request of
+the same name. A complete listing of all built-in registers can be
+found in @ref{Register Index}.
+
+We present here a few built-in registers that are not described
+elsewhere in this manual; they have to do with invariant properties of
+GNU @code{troff}, or obtain information about the formatter's
+command-line options, processing progress, or the operating environment.
+
+@table @code
+@item \n[.A]
+@vindex .A
+@cindex approximation output register (@code{.A})
+@cindex plain text approximation output register (@code{.A})
+Approximate output is being formatted (Boolean-valued); see
+@command{groff} @option{-a} option (@ref{Groff Options}).
+
+@item \n[.c]
+@vindex .c
+@itemx \n[c.]
+@vindex c.
+@cindex input line number register (@code{.c}, @code{c.})
+@cindex line number, input, register (@code{.c}, @code{c.})
+Input line number. @samp{c.} is a writable synonym,
+@c introduced in AT&T device-independent troff (CSTR #54, 1981-01)
+affecting subsequent interpolations of both @samp{.c} and @samp{c.}.
+
+@item \n[.F]
+@cindex current input file name register (@code{.F})
+@cindex input file name, current, register (@code{.F})
+@vindex .F
+Name of input file (string-valued).
+
+@item \n[.g]
+@vindex .g
+@cindex GNU @code{troff}, identification register (@code{.g})
+@cindex GNU-specific register (@code{.g})
+Always true in GNU @code{troff} (Boolean-valued). Documents can use
+this to ask the formatter if it claims @code{groff} compatibility.
+
+@item \n[.P]
+@vindex .P
+Output page selection status (Boolean-valued); see @command{groff}
+@option{-o} option (@ref{Groff Options}).
+
+@item \n[.R]
+@cindex number of registers register (@code{.R})
+@cindex registers, number of, register (@code{.R})
+@vindex .R
+Count of available unused registers; always 10,000 in GNU
+@code{troff}.@footnote{GNU @code{troff} dynamically allocates memory for
+as many registers as required.}
+
+@item \n[.T]
+@vindex .T
+Indicator of output device selection (Boolean-valued); see
+@command{groff} @option{-T} option (@ref{Groff Options}).
+
+@item \n[.U]
+@cindex safer mode
+@cindex mode, safer
+@cindex unsafe mode
+@cindex mode, unsafe
+@vindex .U
+Unsafe mode enablement status (Boolean-valued); see @command{groff}
+@option{-U} option (@ref{Groff Options}).
+
+@item \n[.x]
+@vindex .x
+@cindex major version number register (@code{.x})
+@cindex version number, major, register (@code{.x})
+Major version number of the running GNU @code{troff} formatter. For
+example, if the version number is 1.23.0, then @code{.x}
+contains@tie{}@samp{1}.
+
+@item \n[.y]
+@vindex .y
+@cindex minor version number register (@code{.y})
+@cindex version number, minor, register (@code{.y})
+Minor version number of the running GNU @code{troff} formatter. For
+example, if the version number is 1.23.0, then @code{.y}
+contains@tie{}@samp{23}.
+
+@item \n[.Y]
+@vindex .Y
+@cindex revision number register (@code{.Y})
+Revision number of the running GNU @code{troff} formatter. For example,
+if the version number is 1.23.0, then @code{.Y} contains@tie{}@samp{0}.
+
+@item \n[$$]
+@vindex $$
+@cindex process ID of GNU @code{troff} register (@code{$$})
+@cindex PID of GNU @code{troff} register (@code{$$})
+@cindex GNU @code{troff}, process ID register (@code{$$})
+@cindex GNU @code{troff}, PID register (@code{$$})
+Process identifier (PID) of the GNU @code{troff} program in its
+operating environment.
+@end table
+
+Date- and time-related registers are set per the local time as
+determined by @cite{localtime@r{(3)}} when the formatter launches. This
+initialization can be overridden by @env{SOURCE_DATE_EPOCH} and
+@env{TZ}; see @ref{Environment}.
+
+@table @code
+@item \n[seconds]
+@cindex seconds, current time (@code{seconds})
+@cindex time, current, seconds (@code{seconds})
+@cindex current time, seconds (@code{seconds})
+@vindex seconds
+Count of seconds elapsed in the minute (0--60). @c not 59; see POSIX
+
+@item \n[minutes]
+@cindex minutes, current time (@code{minutes})
+@cindex time, current, minutes (@code{minutes})
+@cindex current time, minutes (@code{minutes})
+@vindex minutes
+Count of minutes elapsed in the hour (0--59).
+
+@item \n[hours]
+@cindex hours, current time (@code{hours})
+@cindex time, current, hours (@code{hours})
+@cindex current time, hours (@code{hours})
+@vindex hours
+Count of hours elapsed since midnight (0--23).
+
+@item \n[dw]
+@cindex day of the week register (@code{dw})
+@cindex date, day of the week register (@code{dw})
+@vindex dw
+Day of the week (1--7; 1 is Sunday).
+
+@item \n[dy]
+@cindex day of the month register (@code{dy})
+@cindex date, day of the month register (@code{dy})
+@vindex dy
+Day of the month (1--31).
+
+@item \n[mo]
+@cindex month of the year register (@code{mo})
+@cindex date, month of the year register (@code{mo})
+@vindex mo
+Month of the year (1--12).
+
+@item \n[year]
+@cindex date, year register (@code{year}, @code{yr})
+@cindex year, current, register (@code{year}, @code{yr})
+@vindex year
+Gregorian year.
+
+@cindex CSTR@tie{}#54 errata
+@cindex CSTR@tie{}#54 erratum, @code{yr} register
+@item \n[yr]
+@vindex yr
+Gregorian year minus@tie{}1900. This register is incorrectly documented
+in the @acronym{AT&T} @code{troff} manual as storing the last two digits
+of the current year. That claim stopped being true in 2000. Old
+@code{troff} input that looks like:
+
+@Example
+'\" The year number is a surprise after 1999.
+This document was formatted in 19\n(yr.
+@endExample
+
+@noindent
+can be corrected to:
+
+@Example
+This document was formatted in \n[year].
+@endExample
+
+@noindent
+or, for portability across many @code{roff} programs, to the following.
+
+@Example
+.nr y4 1900+\n(yr
+This document was formatted in \n(y4.
+@endExample
+@end table
+
+
+@c =====================================================================
+
+@node Manipulating Filling and Adjustment, Manipulating Hyphenation, Registers, GNU troff Reference
+@section Manipulating Filling and Adjustment
+@cindex manipulating filling and adjustment
+@cindex filling and adjustment, manipulating
+@cindex adjustment and filling, manipulating
+@cindex justifying text
+@cindex text, justifying
+
+@cindex break
+@cindex line break
+@cindex @code{bp} request, causing implicit break
+@cindex @code{ce} request, causing implicit break
+@cindex @code{cf} request, causing implicit break
+@cindex @code{fi} request, causing implicit break
+@cindex @code{fl} request, causing implicit break
+@cindex @code{in} request, causing implicit break
+@cindex @code{nf} request, causing implicit break
+@cindex @code{rj} request, causing implicit break
+@cindex @code{sp} request, causing implicit break
+@cindex @code{ti} request, causing implicit break
+@cindex @code{trf} request, causing implicit break
+When an output line is pending (see below), a break moves the drawing
+position to the beginning of the next text baseline, interrupting
+filling. Various ways of causing breaks were shown in @ref{Breaking}.
+The @code{br} request likewise causes a break. Several other requests
+imply breaks:@: @code{bp}, @code{ce}, @code{cf}, @code{fi}, @code{fl},
+@code{in}, @code{nf}, @code{rj}, @code{sp}, @code{ti}, and @code{trf}.
+If the no-break control character is used with any of these requests,
+GNU @code{troff} suppresses the break; instead the requested operation
+takes effect at the next break. @samp{'br} does nothing.
+
+@Example
+.ll 55n
+This line is normally filled and adjusted.
+.br
+A line's alignment is decided
+'ce \" Center the next input line (no break).
+when it is output.
+This line returns to normal filling and adjustment.
+ @result{} This line is normally filled and adjusted.
+ @result{} A line's alignment is decided when it is output.
+ @result{} This line returns to normal filling and adjustment.
+@endExample
+
+@noindent
+@cindex pending output line
+@cindex partially collected line
+@cindex output line properties
+@cindex properties of output lines
+Output line properties like page offset, indentation, adjustment, and
+even the location of its text baseline, are not determined until the
+line has been broken. An output line is said to be @dfn{pending} if
+some input has been collected but an output line corresponding to it has
+not yet been written; such an output line is also termed @dfn{partially
+collected}. If no output line is pending, it is as if a break has
+already happened; additional breaks, whether explicit or implicit, have
+no effect. If the vertical drawing position is negative---as it is when
+the formatter starts up---a break starts a new page (even if no output
+line is pending) unless an end-of-input macro is being interpreted.
+@xref{End-of-input Traps}.
+
+@Defreq {br, }
+Break the line: emit any pending output line without adjustment.
+
+@Example
+foo bar
+.br
+baz
+'br
+qux
+ @result{} foo bar
+ @result{} baz qux
+@endExample
+@endDefreq
+
+Sometimes you want to prevent a break within a phrase or between a
+quantity and its units.
+
+@Defesc {\\~, , , }
+@cindex unbreakable space (@code{\~})
+@cindex space, unbreakable (@code{\~})
+Insert an unbreakable space that is adjustable like an ordinary space.
+It is discarded from the end of an output line if a break is forced.
+
+@Example
+Set the output speed to\~1.
+There are 1,024\~bytes in 1\~KiB.
+J.\~F.\~Ossanna wrote the original CSTR\~#54.
+@endExample
+@endDefesc
+
+By default, GNU @code{troff} fills text and adjusts it to reach the
+output line length. The @code{nf} request disables filling; the
+@code{fi} request reënables it.
+
+@DefreqList {fi, }
+@DefregListEndx {.u}
+@cindex filling of output, enabling (@code{fi})
+@cindex output, filling, enablement of (@code{fi})
+@cindex fill mode (@code{fi}), enabling
+@cindex mode, fill (@code{fi}), enabling
+Enable filling of output lines; a pending output line is broken. The
+read-only register @code{.u} is set to@tie{}1. The filling enablement
+status, sometimes called @dfn{fill mode}, is associated with the
+environment (@pxref{Environments}). @xref{Line Continuation}, for
+interaction with the @code{\c} escape sequence.
+@endDefreq
+
+@Defreq {nf, }
+@cindex filling of output, disabling (@code{nf})
+@cindex output, filling, disablement of (@code{nf})
+@cindex no-fill mode
+@cindex mode, no-fill
+@cindex fill mode, disabling
+@cindex mode, fill, disabling
+Disable filling of output lines: the output line length (@pxref{Line
+Layout}) is ignored and output lines are broken where the input lines
+are. A pending output line is broken and adjustment is suppressed. The
+read-only register @code{.u} is set to@tie{}0. The filling enablement
+status is associated with the environment (@pxref{Environments}). See
+@ref{Line Continuation}, for interaction with the @code{\c} escape
+sequence.
+@endDefreq
+
+@DefreqList {ad, [@Var{mode}]}
+@DefregListEndx {.j}
+Enable output line adjustment in @var{mode}, taking effect when the
+pending (or next) output line is broken. Adjustment is suppressed when
+filling is. @var{mode} can have one of the following values.
+
+@table @code
+@item b
+@itemx n
+Adjust ``normally'':@: if the output line does not consume the distance
+between the indentation and the configured output line length, GNU
+@code{troff} stretches adjustable spaces within the line until that
+length is reached. When the indentation is zero, this mode spreads the
+line to both the left and right margins. This is the GNU @code{troff}
+default.
+
+@item c
+@cindex centered text (filled)
+Center filled text. Contrast with the @code{ce} request, which centers
+text @emph{without} filling it.
+
+@item l
+@cindex ragged-right text
+Align text to the left without adjusting it.
+
+@item r
+@cindex ragged-left text
+Align text to the right without adjusting it.
+@end table
+
+@var{mode} can also be a value previously stored in the @code{.j}
+register. Using @code{ad} without an argument is the same as @samp{.ad
+\n[.j]}; unless filling is disabled, GNU @code{troff} resumes adjusting
+lines in the same way it did before adjustment was disabled by
+invocation of the @code{na} request.
+
+@cindex adjustment mode register (@code{.j})
+The adjustment mode and enablement status are encoded in the read-only
+register @code{.j}. These parameters are associated with the
+environment (@pxref{Environments}).
+
+The value of @code{.j} for any adjustment mode is an implementation
+detail and should not be relied upon as a programmer's interface. Do
+not write logic to interpret or perform arithmetic on it.
+
+@Example
+.ll 48n
+.de AD
+. br
+. ad \\$1
+..
+@c . @c XXX: Restore this line when the page has room for it.
+.de NA
+. br
+. na
+..
+@c . @c XXX: Restore this line when the page has room for it.
+left
+.AD r
+.nr ad \n(.j
+right
+.AD c
+center
+.NA
+left
+.AD
+center
+.AD \n(ad
+right
+@endExample
+@Example
+ @result{} left
+ @result{} right
+ @result{} center
+ @result{} left
+ @result{} center
+ @result{} right
+@endExample
+@endDefreq
+
+@Defreq {na, }
+Disable output line adjustment. This produces the same output as
+left-alignment, but the value of the adjustment mode register @code{.j}
+is altered differently. The adjustment mode and enablement status are
+associated with the environment (@pxref{Environments}).
+@endDefreq
+
+@DefreqList {brp, }
+@DefescListEndx {\\p, , , }
+Break, adjusting the line per the current adjustment mode. @code{\p}
+schedules a break with adjustment at the next word boundary. The escape
+sequence is itself neither a break nor a space of any kind; it can thus
+be placed in the middle of a word to cause a break at the end of that
+word.
+
+Breaking with immediate adjustment can produce ugly results since GNU
+@code{troff} doesn't have a sophisticated paragraph-building algorithm,
+as @TeX{} has, for example. Instead, GNU @code{troff} fills and adjusts
+a paragraph line by line.
+
+@Example
+.ll 4.5i
+This is an uninteresting sentence.
+This is an uninteresting sentence.\p
+This is an uninteresting sentence.
+@endExample
+
+@noindent
+is formatted as follows.
+
+@Example
+This is an uninteresting sentence. This is
+an uninteresting sentence.
+This is an uninteresting sentence.
+@endExample
+@endDefreq
+
+@cindex productive input line
+@cindex input line, productive
+@cindex line, productive input
+To clearly present the next couple of requests, we must introduce the
+concept of ``productive'' input lines. A @dfn{productive input line} is
+one that directly produces formatted output. Text lines produce
+output,@footnote{unless diverted; see @ref{Diversions}} as do control
+lines containing requests like @code{tl} or escape sequences like
+@code{\D}. Macro calls are not @emph{directly} productive, and thus not
+counted, but their interpolated contents can be. Empty requests, and
+requests and escape sequences that define registers or strings or alter
+the formatting environment (as with changes to the size, face, height,
+slant, or color of the type) are not productive. We will also preview
+the output line continuation escape sequence, @code{\c}, which
+``connects'' two input lines that would otherwise be counted separately.
+@footnote{@xref{Line Continuation}.}
+
+@Example
+@c .ll 56n
+.de hello
+Hello, world!
+..
+.ce \" center output of next productive input line
+.
+.nr junk-reg 1
+.ft I
+Chorus: \c
+.ft
+.hello
+Went the day well?
+ @result{} @slanted{Chorus:} Hello, world!
+ @result{} Went the day well?
+@endExample
+
+@DefreqList {ce, [@Var{n}]}
+@DefregListEndx {.ce}
+@cindex centered text (unfilled)
+@cindex centering lines (@code{ce})
+@cindex lines, centering (@code{ce})
+Break (unless the no-break control character is used), center the output
+of the next @var{n} productive input lines with respect to the line
+length and indentation without filling, then break again regardless of
+the invoking control character.
+@c Temporary indentation is ignored.
+If the argument is not positive, centering is disabled. Omitting the
+argument implies an @var{n} of @samp{1}. The count of lines remaining
+to be centered is stored in the read-only register @code{.ce} and is
+associated with the environment (@pxref{Environments}).
+
+@cindex @code{ce} request, difference from @w{@samp{.ad c}}
+While the @w{@samp{.ad c}} request also centers text, it fills the text
+as well.
+
+@c Wrap example at 56 columns.
+@Example
+.de FR
+This is a small text fragment that shows the differences
+between the `.ce' and the `.ad c' requests.
+..
+.ll 4i
+.ce 1000
+.FR
+.ce 0
+
+.ad c
+.FR
+ @result{} This is a small text fragment that shows
+ @result{} the differences
+ @result{} between the @quoteleft{}.ce@quoteright{} and the @quoteleft{}.ad c@quoteright{} requests.
+ @result{}
+ @result{} This is a small text fragment that shows
+ @result{} the differences between the @quoteleft{}.ce@quoteright{} and
+ @result{} the @quoteleft{}.ad c@quoteright{} requests.
+@endExample
+
+The previous example illustrates a common idiom of turning centering on
+for a quantity of lines far in excess of what is required, and off again
+after the text to be centered. This technique relieves humans of
+counting lines for requests that take a count of input lines as an
+argument.
+@endDefreq
+
+@DefreqList {rj, [@Var{n}]}
+@DefregListEndx {.rj}
+@cindex justifying text (@code{rj})
+@cindex text, justifying (@code{rj})
+@cindex right-justifying (@code{rj})
+Break (unless the no-break control character is used), align the output
+of the next @var{n} productive input lines to the right margin without
+filling, then break again regardless of the control character.
+@c Temporary indentation is ignored.
+If the argument is not positive, right-alignment is disabled. Omitting
+the argument implies an @var{n} of @samp{1}. The count of lines
+remaining to be right-aligned is stored in the read-only register
+@code{.rj} and is associated with the environment
+(@pxref{Environments}).
+
+@Example
+.ll 49n
+.rj 3
+At first I hoped that such a technically unsound
+project would collapse but I soon realized it was
+doomed to success. \[em] C. A. R. Hoare
+ @result{} At first I hoped that such a technically unsound
+ @result{} project would collapse but I soon realized it was
+ @result{} doomed to success. -- C. A. R. Hoare
+@endExample
+@endDefreq
+
+@need 2000
+@DefreqList {ss, word-space-size [@Var{additional-sentence-space-size}]}
+@DefregItemx {.ss}
+@DefregListEndx {.sss}
+@cindex word space size register (@code{.ss})
+@cindex size of word space register (@code{.ss})
+@cindex space between words register (@code{.ss})
+@cindex inter-sentence space size register (@code{.sss})
+@cindex sentence space size register (@code{.sss})
+@cindex size of sentence space register (@code{.sss})
+@cindex space between sentences register (@code{.sss})
+Set the sizes of spaces between words and
+sentences@footnote{Recall @ref{Filling} and @ref{Sentences} for the
+definitions of word and sentence boundaries, respectively.} in twelfths
+of font's space width (typically one-fourth to one-third em for Western
+scripts). The default for both parameters is@tie{}12. Negative values
+are erroneous.
+@cindex inter-word spacing, minimal
+@cindex minimal inter-word spacing
+@cindex space, between words
+The first argument is a minimum; if an output line undergoes adjustment,
+such spaces may increase in width.
+@cindex inter-sentence space, additional
+@cindex additional inter-sentence space
+@cindex space, between sentences
+The optional second argument sets the amount of additional space
+separating sentences on the same output line. If omitted, this amount
+is set to @var{word-space-size}. The request is ignored if there are no
+parameters.
+
+@cindex filling, and inter-sentence space
+@cindex mode, fill, and inter-sentence space
+Additional inter-sentence space is used only if the output line is not
+full when the end of a sentence occurs in the input. If a sentence ends
+at the end of an input line, then both an inter-word space and an
+inter-sentence space are added to the output; if two spaces follow the
+end of a sentence in the middle of an input line, then the second space
+becomes an inter-sentence space in the output. Additional
+inter-sentence space is not adjusted, but the inter-word space that
+always precedes it may be. Further input spaces after the second, if
+present, are adjusted as normal.
+
+The read-only registers @code{.ss} and @code{.sss} hold the minimal
+inter-word space and additional inter-sentence space amounts,
+respectively. These parameters are part of the environment
+(@pxref{Environments}), and rounded down to the nearest multiple
+of@tie{}12 on terminals.
+
+@cindex discardable horizontal space
+@cindex space, discardable, horizontal
+@cindex horizontal discardable space
+The @code{ss} request can insert discardable horizontal space; that is,
+space that is discarded at a break. For example, some footnote styles
+collect the notes into a single paragraph with large gaps between
+each note.
+
+@Example
+.ll 48n
+1.\~J. Fict. Ch. Soc. 6 (2020), 3\[en]14.
+.ss 12 48 \" applies to next sentence ending
+Reprints no longer available through FCS.
+.ss 12 \" go back to normal
+2.\~Better known for other work.
+ @result{} 1. J. Fict. Ch. Soc. 6 (2020), 3-14. Reprints
+ @result{} no longer available through FCS. 2. Better
+ @result{} known for other work.
+@endExample
+
+@noindent
+If @emph{undiscardable} space is required, use the @code{\h} escape
+sequence.
+@endDefreq
+
+
+@c =====================================================================
+
+@node Manipulating Hyphenation, Manipulating Spacing, Manipulating Filling and Adjustment, GNU troff Reference
+@section Manipulating Hyphenation
+@cindex manipulating hyphenation
+@cindex hyphenation, manipulating
+
+@cindex hyphenation, automatic
+@cindex automatic hyphenation
+When filling, GNU @code{troff} hyphenates words as needed at
+user-specified and automatically determined hyphenation points. The
+machine-driven determination of hyphenation points in words requires
+algorithms and data, and is susceptible to conventions and preferences.
+Before tackling such @dfn{automatic hyphenation}, let us consider how
+hyphenation points can be set explicitly.
+
+@cindex hyphenation, explicit
+@cindex explicit hyphenation
+@cindex hyphenation, manual
+@cindex manual hyphenation
+Explicitly hyphenated words such as ``mother-in-law'' are eligible for
+breaking after each of their hyphens. Relatively few words in a
+language offer such obvious break points, however, and automatic
+detection of syllabic (or phonetic) boundaries for hyphenation is not
+perfect,@footnote{Whether a perfect algorithm for this application is
+even possible is an unsolved problem in computer science:@:
+@url{https://tug.org/docs/liang/liang-thesis.pdf}.} particularly for
+unusual words found in technical literature. We can instruct GNU
+@code{troff} how to hyphenate specific words if the need arises.
+
+@cindex hyphenation exceptions
+@Defreq {hw, word @dots{}}
+Define each @dfn{hyphenation exception} @var{word} with each hyphen `-'
+in the word indicating a hyphenation point. For example, the request
+
+@Example
+.hw in-sa-lub-rious alpha
+@endExample
+
+@c Serendipitously, in PDF output, the "alpha" below gets hyphenated.
+@c Try to preserve this felicity in future edits.
+marks potential hyphenation points in ``insalubrious'', and prevents
+``alpha'' from being hyphenated at all.
+
+Besides the space character, any character whose hyphenation code is
+zero can be used to separate the arguments of @code{hw} (see the
+@code{hcode} request below). In addition, this request can be used more
+than once.
+
+@cindex @code{hw} request, and @code{hy} restrictions
+Hyphenation points specified with @code{hw} are not subject to the
+within-word placement restrictions imposed by the @code{hy} request (see
+below).
+
+Hyphenation exceptions specified with the @code{hw} request are
+associated with the hyphenation language (see the @code{hla} request
+below) and environment (@pxref{Environments}); invoking the @code{hw}
+request in the absence of a hyphenation language is an error.
+
+The request is ignored if there are no parameters.
+@endDefreq
+
+These are known as hyphenation @slanted{exceptions} in the expectation
+that most users will avail themselves of automatic hyphenation; these
+exceptions override any rules that would normally apply to a word
+matching a hyphenation exception defined with @code{hw}.
+
+Situations also arise when only a specific occurrence of a word needs
+its hyphenation altered or suppressed, or when a URL or similar string
+needs to be breakable in sensible places without hyphenation.
+
+@DefescList {\\%, , , }
+@DefescListEndx {\:, , , }
+@cindex hyphenation character (@code{\%})
+@cindex character, hyphenation (@code{\%})
+@cindex disabling hyphenation (@code{\%})
+@cindex hyphenation, disabling (@code{\%})
+To tell GNU @code{troff} how to hyphenate words as they occur in input,
+use the @code{\%} escape sequence; it is the default @dfn{hyphenation
+character}. Each instance within a word indicates to GNU @code{troff}
+that the word may be hyphenated at that point, while prefixing a word
+with this escape sequence prevents it from being otherwise hyphenated.
+This mechanism affects only that occurrence of the word; to change the
+hyphenation of a word for the remainder of input processing, use the
+@code{hw} request.
+
+@cindex @code{\X}, followed by @code{\%}
+@cindex @code{\Y}, followed by @code{\%}
+@cindex @code{\%}, following @code{\X} or @code{\Y}
+GNU @code{troff} regards the escape sequences @code{\X} and @code{\Y} as
+starting a word; that is, the @code{\%} escape sequence in, say,
+@w{@samp{\X'...'\%foobar}} or @w{@samp{\Y'...'\%foobar}} no longer
+prevents hyphenation of @samp{foobar} but inserts a hyphenation point
+just prior to it; most likely this isn't what you want.
+@xref{Postprocessor Access}.
+
+@cindex non-printing break point (@code{\:})
+@cindex breaking without hyphens (@code{\:})
+@cindex file names, breaking (@code{\:})
+@cindex breaking file names (@code{\:})
+@cindex URLs, breaking (@code{\:})
+@cindex breaking URLs (@code{\:})
+@code{\:} inserts a non-printing break point; that is, a word can break
+there, but the soft hyphen glyph (see below) is not written to the
+output if it does. This escape sequence is an input word boundary, so
+the remainder of the word is subject to hyphenation as normal.
+
+You can combine @code{\:} and @code{\%} to control breaking of a file
+name or URL, or to permit hyphenation only after certain explicit
+hyphens within a word.
+
+@Example
+@c Wrap example at 56 columns.
+The \%Lethbridge-Stewart-\:\%Sackville-Baggins divorce
+was, in retrospect, inevitable once the contents of
+\%/var/log/\:\%httpd/\:\%access_log on the family web
+server came to light, revealing visitors from Hogwarts.
+@endExample
+@endDefesc
+
+@Defreq {hc, [@Var{char}]}
+Change the hyphenation character to @var{char}. This character then
+works as the @code{\%} escape sequence normally does, and thus no longer
+appears in the output.@footnote{@code{\%} itself stops marking
+hyphenation points but still produces no output glyph.} Without an
+argument, @code{hc} resets the hyphenation character to @code{\%} (the
+default). The hyphenation character is associated with the environment
+(@pxref{Environments}).
+@endDefreq
+
+@Defreq {shc, [@Var{c}]}
+@cindex soft hyphen character, setting (@code{shc})
+@cindex character, soft hyphen, setting (@code{shc})
+@cindex glyph, soft hyphen (@code{hy})
+@cindex soft hyphen glyph (@code{hy})
+@cindex @code{char} request, and soft hyphen character
+@cindex @code{tr} request, and soft hyphen character
+Set the @dfn{soft hyphen character}, inserted when a word is hyphenated
+automatically or at a hyphenation character, to the ordinary or special
+character@tie{}@var{c}.@footnote{``Soft'' because it appears in output
+only where a hyphenation break is performed; a ``hard'' hyphen, as in
+``long-term'', always appears.} If the argument is omitted, the soft
+hyphen character is set to the default, @code{\[hy]}. If no glyph for
+@var{c} exists in the font in use at a potential hyphenation point, then
+the line is not broken there. Neither character definitions (specified
+with the @code{char} and similar requests) nor translations (specified
+with the @code{tr} request) are applied to @var{c}.
+@endDefreq
+
+@cindex hyphenation parameters, automatic
+@cindex automatic hyphenation parameters
+Several requests influence automatic hyphenation. Because conventions
+vary, a variety of hyphenation modes is available to the @code{hy}
+request; these determine whether hyphenation will apply to a
+word prior to breaking a line at the end of a page (more or less; see
+below for details), and at which positions within that word
+automatically determined hyphenation points are permissible. The places
+within a word that are eligible for hyphenation are determined by
+language-specific data and lettercase relationships. Furthermore,
+hyphenation of a word might be suppressed due to a limit on
+consecutive hyphenated lines (@code{hlm}), a minimum line length
+threshold (@code{hym}), or because the line can instead be adjusted with
+additional inter-word space (@code{hys}).
+
+@cindex hyphenation mode register (@code{.hy})
+@DefreqList {hy, [@Var{mode}]}
+@DefregListEndx {.hy}
+Set automatic hyphenation mode to @var{mode}, an integer encoding
+conditions for hyphenation; if omitted, @samp{1} is implied. The
+hyphenation mode is available in the read-only register @samp{.hy}; it
+is associated with the environment (@pxref{Environments}). The default
+hyphenation mode depends on the localization file loaded when GNU
+@code{troff} starts up; see the @code{hpf} request below.
+
+Typesetting practice generally does not avail itself of every
+opportunity for hyphenation, but the details differ by language and site
+mandates. The hyphenation modes of @acronym{AT&T} @code{troff} were
+implemented with English-language publishing practices of the 1970s in
+mind, not a scrupulous enumeration of conceivable parameters. GNU
+@code{troff} extends those modes such that finer-grained control is
+possible, favoring compatibility with older implementations over a more
+intuitive arrangement. The means of hyphenation mode control is a set
+of numbers that can be added up to encode the behavior
+sought.@footnote{The mode is a vector of Booleans encoded as an integer.
+To a programmer, this fact is easily deduced from the exclusive use of
+powers of two for the configuration parameters; they are computationally
+easy to ``mask off'' and compare to zero. To almost everyone else, the
+arrangement seems recondite and unfriendly.} The entries in the
+following table are termed @dfn{values}; the sum of the desired
+values is the @dfn{mode}.
+
+@table @code
+@item 0
+disables hyphenation.
+
+@item 1
+enables hyphenation except after the first and before the last character
+of a word.
+@end table
+
+The remaining values ``imply'' 1; that is, they enable hyphenation
+under the same conditions as @samp{.hy 1}, and then apply or lift
+restrictions relative to that basis.
+
+@table @code
+@item 2
+disables hyphenation of the last word on a page,@footnote{Hyphenation is
+prevented if the next page location trap is closer to the vertical
+drawing position than the next text baseline would be. @xref{Page
+Location Traps}.} even for explicitly hyphenated words.
+
+@item 4
+disables hyphenation before the last two characters of a word.
+
+@item 8
+disables hyphenation after the first two characters of a word.
+
+@item 16
+enables hyphenation before the last character of a word.
+
+@item 32
+enables hyphenation after the first character of a word.
+@end table
+
+Apart from value@tie{}2, restrictions imposed by the hyphenation mode
+are @emph{not} respected for words whose hyphenations have been
+specified with the hyphenation character (@samp{\%} by default) or the
+@code{hw} request.
+
+Nonzero values in the previous table are additive. For example,
+mode@tie{}12 causes GNU @code{troff} to hyphenate neither the last two
+nor the first two characters of a word. Some values cannot be used
+together because they contradict; for instance, values 4 and@tie{}16,
+and values 8 and@tie{}32. As noted, it is superfluous to add 1 to any
+non-zero even mode.
+
+@cindex hyphenation pattern files
+@cindex pattern files, for hyphenation
+The automatic placement of hyphens in words is determined by
+@dfn{pattern files}, which are derived from @TeX{} and available for
+several languages. The number of characters at the beginning of a word
+after which the first hyphenation point should be inserted is determined
+by the patterns themselves; it can't be reduced further without
+introducing additional, invalid hyphenation points (unfortunately, this
+information is not part of a pattern file---you have to know it in
+advance). The same is true for the number of characters at the end of
+a word before the last hyphenation point should be inserted. For
+example, you can supply the following input to @samp{echo $(nroff)}.
+
+@Example
+.ll 1
+.hy 48
+splitting
+@endExample
+
+@noindent
+You will get
+
+@Example
+s- plit- t- in- g
+@endExample
+
+@noindent
+instead of the correct `split- ting'. English patterns as distributed
+with GNU @code{troff} need two characters at the beginning and three
+characters at the end; this means that value@tie{}4 of @code{hy} is
+mandatory. Value@tie{}8 is possible as an additional restriction, but
+values@tie{}16 and@tie{}32 should be avoided, as should mode@tie{}1.
+Modes@tie{}4 and@tie{}6 are typical.
+
+A table of left and right minimum character counts for hyphenation as
+needed by the patterns distributed with GNU @code{troff} follows; see
+the @cite{groff_tmac@r{(5)}} man page for more information on GNU
+@code{troff}'s language macro files.
+
+@multitable {German traditional} {pattern name} {left min} {right min}
+@headitem language @tab pattern name @tab left min @tab right min
+@item Czech @tab cs @tab 2 @tab 2
+@item English @tab en @tab 2 @tab 3
+@item French @tab fr @tab 2 @tab 3
+@item German traditional @tab det @tab 2 @tab 2
+@item German reformed @tab den @tab 2 @tab 2
+@item Italian @tab it @tab 2 @tab 2
+@item Swedish @tab sv @tab 1 @tab 2
+@end multitable
+
+Hyphenation exceptions within pattern files (i.e., the words within a
+@TeX{} @code{\hyphenation} group) obey the hyphenation restrictions
+given by @code{hy}.
+@endDefreq
+
+@Defreq {nh, }
+Disable automatic hyphenation; i.e., set the hyphenation mode to@tie{}0
+(see above). The hyphenation mode of the last call to @code{hy} is not
+remembered.
+@endDefreq
+
+@need 200
+@DefreqList {hpf, pattern-file}
+@DefreqItemx {hpfa, pattern-file}
+@DefreqListEndx {hpfcode, a b [c d] @dots{}}
+@cindex hyphenation patterns (@code{hpf})
+@cindex patterns for hyphenation (@code{hpf})
+Read hyphenation patterns from @var{pattern-file}, which is sought
+in the same way that macro files are with the @code{mso} request or the
+@option{-m@var{name}} command-line option to @code{groff}. The
+@var{pattern-file} should have the same format as (simple) @TeX{}
+pattern files. More specifically, the following scanning rules are
+implemented.
+
+@itemize @bullet
+@item
+A percent sign starts a comment (up to the end of the line) even if
+preceded by a backslash.
+
+@item
+``Digraphs'' like @code{\$} are not supported.
+
+@item
+@code{^^@var{xx}} (where each @var{x} is 0--9 or a--f) and
+@code{^^@var{c}} (character @var{c} in the code point range 0--127
+decimal) are recognized; other uses of @code{^} cause an error.
+
+@item
+No macro expansion is performed.
+
+@item
+@code{hpf} checks for the expression @code{\patterns@{@dots{}@}}
+(possibly with whitespace before or after the braces). Everything
+between the braces is taken as hyphenation patterns. Consequently,
+@code{@{} and @code{@}} are not allowed in patterns.
+
+@item
+Similarly, @code{\hyphenation@{@dots{}@}} gives a list of hyphenation
+exceptions.
+
+@item
+@code{\endinput} is recognized also.
+
+@item
+For backward compatibility, if @code{\patterns} is missing, the whole
+file is treated as a list of hyphenation patterns (except that the
+@code{%} character is recognized as the start of a comment).
+@end itemize
+
+The @code{hpfa} request appends a file of patterns to the current list.
+
+The @code{hpfcode} request defines mapping values for character codes in
+pattern files. It is an older mechanism no longer used by GNU
+@code{troff}'s own macro files; for its successor, see @code{hcode}
+below. @code{hpf} or @code{hpfa} apply the mapping after reading the
+patterns but before replacing or appending to the active list of
+patterns. Its arguments are pairs of character codes---integers from 0
+to@tie{}255. The request maps character code@tie{}@var{a} to
+code@tie{}@var{b}, code@tie{}@var{c} to code@tie{}@var{d}, and so on.
+Character codes that would otherwise be invalid in GNU @code{troff} can
+be used. By default, every code maps to itself except those for letters
+`A' to `Z', which map to those for `a' to `z'.
+
+@cindex localization
+@pindex troffrc
+@pindex cs.tmac
+@pindex de.tmac
+@pindex en.tmac
+@pindex fr.tmac
+@pindex it.tmac
+@pindex ja.tmac
+@pindex sv.tmac
+@pindex zh.tmac
+The set of hyphenation patterns is associated with the language set by
+the @code{hla} request (see below). The @code{hpf} request is usually
+invoked by a localization file loaded by the @file{troffrc}
+file.@footnote{For more on localization, see the
+@cite{groff_tmac@r{(5)}} man page.}
+
+A second call to @code{hpf} (for the same language) replaces the
+hyphenation patterns with the new ones. Invoking @code{hpf} or
+@code{hpfa} causes an error if there is no hyphenation language. If no
+@code{hpf} request is specified (either in the document, in a file
+loaded at startup, or in a macro package), GNU @code{troff} won't
+automatically hyphenate at all.
+@endDefreq
+
+@Defreq {hcode, c1 code1 [c2 code2] @dots{}}
+@cindex hyphenation code (@code{hcode})
+@cindex code, hyphenation (@code{hcode})
+Set the hyphenation code of character @var{c1} to @var{code1}, that of
+@var{c2} to @var{code2}, and so on. A hyphenation code must be an
+ordinary character (not a special character escape sequence) other than
+a digit or a space. The request is ignored if given no arguments.
+
+For hyphenation to work, hyphenation codes must be set up. At
+startup, GNU @code{troff} assigns hyphenation codes to the letters
+@samp{a}--@samp{z} (mapped to themselves), to the letters
+@samp{A}--@samp{Z} (mapped to @samp{a}--@samp{z}), and zero to all other
+characters. Normally, hyphenation patterns contain only lowercase
+letters which should be applied regardless of case. In other words,
+they assume that the words `FOO' and `Foo' should be hyphenated exactly
+as `foo' is. The @code{hcode} request extends this principle to letters
+outside the Unicode basic Latin alphabet; without it, words containing
+such letters won't be hyphenated properly even if the corresponding
+hyphenation patterns contain them.
+
+For example, the following @code{hcode} requests are necessary to assign
+hyphenation codes to the letters @samp{ÄäÖöÜüß}, needed for German.
+
+@Example
+.hcode ä ä Ä ä
+.hcode ö ö Ö ö
+.hcode ü ü Ü ü
+.hcode ß ß
+@endExample
+
+Without these assignments, GNU @code{troff} treats the German word
+@w{`Kindergärten'} (the plural form of `kindergarten') as two words
+@w{`kinderg'} and @w{`rten'} because the hyphenation code of the
+umlaut@tie{}a is zero by default, just like a space. There is a German
+hyphenation pattern that covers @w{`kinder'}, so GNU @code{troff} finds
+the hyphenation `kin-der'. The other two hyphenation points
+(`kin-der-gär-ten') are missed.
+@endDefreq
+
+@DefreqList {hla, lang}
+@DefregListEndx {.hla}
+@cindex @code{hpf} request, and hyphenation language
+@cindex @code{hw} request, and hyphenation language
+@pindex troffrc
+@pindex troffrc-end
+Set the hyphenation language to @var{lang}. Hyphenation exceptions
+specified with the @code{hw} request and hyphenation patterns and
+exceptions specified with the @code{hpf} and @code{hpfa} requests are
+associated with the hyphenation language. The @code{hla} request is
+usually invoked by a localization file, which is turn loaded by the
+@file{troffrc} or @file{troffrc-end} file; see the @code{hpf} request
+above.
+
+@cindex hyphenation language register (@code{.hla})
+The hyphenation language is available in the read-only string-valued
+register @samp{.hla}; it is associated with the environment
+(@pxref{Environments}).
+@endDefreq
+
+@DefreqList {hlm, [@Var{n}]}
+@DefregItemx {.hlm}
+@DefregListEndx {.hlc}
+@cindex explicit hyphen (@code{\%})
+@cindex hyphen, explicit (@code{\%})
+@cindex consecutive hyphenated lines (@code{hlm})
+@cindex lines, consecutive hyphenated (@code{hlm})
+@cindex hyphenated lines, consecutive (@code{hlm})
+Set the maximum quantity of consecutive hyphenated lines to @var{n}. If
+@var{n} is negative, there is no maximum. If omitted, @var{n}
+is@tie{}@minus{}1. This value is associated with the environment
+(@pxref{Environments}). Only lines output from a given environment
+count toward the maximum associated with that environment. Hyphens
+resulting from @code{\%} are counted; explicit hyphens are not.
+
+@cindex hyphenation consecutive line limit register (@code{.hlm})
+@cindex hyphenation consecutive line count register (@code{.hlc})
+The @code{.hlm} read-only register stores this maximum. The count of
+immediately preceding consecutive hyphenated lines is available in the
+read-only register @code{.hlc}.
+@endDefreq
+
+@DefreqList {hym, [@Var{length}]}
+@DefregListEndx {.hym}
+@cindex hyphenation margin (@code{hym})
+@cindex margin for hyphenation (@code{hym})
+@cindex @code{ad} request, and hyphenation margin
+Set the (right) hyphenation margin to @var{length}. If the adjustment
+mode is not @samp{b} or @samp{n}, the line is not hyphenated if it is
+shorter than @var{length}. Without an argument, the hyphenation margin
+is reset to its default value, 0. The default scaling unit is @samp{m}.
+The hyphenation margin is associated with the environment
+(@pxref{Environments}).
+
+A negative argument resets the hyphenation margin to zero, emitting a
+warning in category @samp{range}.
+
+@cindex hyphenation margin register (@code{.hym})
+The hyphenation margin is available in the @code{.hym} read-only
+register.
+@endDefreq
+
+@DefreqList {hys, [@Var{hyphenation-space}]}
+@DefregListEndx {.hys}
+@cindex hyphenation space (@code{hys})
+@cindex hyphenation space adjustment threshold
+@cindex @code{ad} request, and hyphenation space
+Suppress hyphenation of the line in adjustment modes @samp{b} or
+@samp{n} if it can be justified by adding no more than
+@var{hyphenation-space} extra space to each inter-word space. Without
+an argument, the hyphenation space adjustment threshold is set to its
+default value, 0. The default scaling unit is @samp{m}. The
+hyphenation space adjustment threshold is associated with the
+environment (@pxref{Environments}).
+
+A negative argument resets the hyphenation space adjustment threshold to
+zero, emitting a warning in category @samp{range}.
+
+@cindex hyphenation space adjustment threshold register (@code{.hys})
+The hyphenation space adjustment threshold is available in the
+@code{.hys} read-only register.
+@endDefreq
+
+
+@c =====================================================================
+
+@node Manipulating Spacing, Tabs and Fields, Manipulating Hyphenation, GNU troff Reference
+@section Manipulating Spacing
+@cindex manipulating spacing
+@cindex spacing, manipulating
+
+A break causes the formatter to update the vertical drawing position at
+which the new text baseline is aligned. You can alter this location.
+
+@Defreq {sp, [@Var{distance}]}
+Break and move the next text baseline down by @var{distance}, or until
+springing a page location trap.@footnote{@xref{Page Location Traps}.}
+If invoked with the no-break control character, @code{sp} moves the
+pending output line's text baseline by @var{distance}. A negative
+@var{distance} will not reduce the position of the text baseline below
+zero. Inside a diversion, any @var{distance} argument is ignored. The
+default scaling unit is @samp{v}. If @var{distance} is not specified,
+@samp{1v} is assumed.
+
+@Example
+.pl 5v \" Set page length to 5 vees.
+.de xx
+\-\-\-
+. br
+..
+.wh 0 xx \" Set a trap at the top of the page.
+foo on page \n%
+.sp 2v
+bar on page \n%
+.sp 50v \" This will cause a page break.
+baz on page \n%
+.pl \n(nlu \" Truncate page to current position.
+ @result{} ---
+ @result{} foo on page 1
+ @result{}
+ @result{}
+ @result{} bar on page 1
+ @result{} ---
+ @result{} baz on page 2
+@endExample
+
+You might use the following macros to set the baseline of the next
+output text at a given distance from the top or the bottom of the page.
+We subtract one line height (@code{\n[.v]}) because the @code{|}
+operator moves to one vee below the page top (recall @ref{Numeric
+Expressions}).
+
+@Example
+.de y-from-top-down
+. sp |\\$1-\\n[.v]u
+..
+.
+.de y-from-bot-up
+. sp |\\n[.p]u-\\$1-\\n[.v]u
+..
+@endExample
+
+@noindent
+A call to @samp{.y-from-bot-up 10c} means that the next text baseline
+will be 10@tie{}cm from the bottom edge of the paper.
+@endDefreq
+
+@DefreqList {ls, [@Var{count}]}
+@DefregListEndx {.L}
+@cindex double-spacing (@code{ls})
+Set the line spacing; add @w{@var{count}@minus{}1} blank lines after each
+line of text. With no argument, GNU @code{troff} uses the previous
+value before the last @code{ls} call. The default is @code{1}.
+
+@c This example is fairly obvious, doesn't realistically reflect the
+@c fact that formatted text would occur between each of these requests,
+@c and doesn't fit well on the (PDF) page as of this writing.
+@c @Example
+@c .ls 2 \" begin double-spaced output
+@c .ls 3 \" begin triple-spaced output
+@c .ls \" return to double-spaced output
+@c @endExample
+
+@cindex line spacing register (@code{.L})
+The read-only register @code{.L} contains the current line spacing; it
+is associated with the environment (@pxref{Environments}).
+@endDefreq
+
+The @code{ls} request is a coarse mechanism. @xref{Changing the Type
+Size}, for the requests @code{vs} and @code{pvs} as alternatives to
+@code{ls}.
+
+@DefescList {\\x, @code{'}, spacing, @code{'}}
+@DefregListEndx {.a}
+Sometimes, an output line requires additional vertical spacing, for
+instance to allow room for a tall construct like an inline equation with
+exponents or subscripts (particularly if they are iterated). The
+@code{\x} escape sequence takes a delimited measurement (like
+@samp{\x'3p'}) to increase the vertical spacing of the pending output
+line. The default scaling unit is @samp{v}. If the measurement is
+positive, extra vertical space is inserted below the current line; a
+negative measurement adds space above. If @code{\x} is applied to the
+pending output line multiple times, the maxima of the positive and
+negative adjustments are separately applied. The delimiter need not be
+a neutral apostrophe; see @ref{Delimiters}.
+
+@cindex extra post-vertical line space register (@code{.a})
+The @code{.a} read-only register contains the extra vertical spacing
+@emph{after} the text baseline of the most recently emitted output line.
+(In other words, it is the largest positive argument to @code{\x}
+encountered on that line.) This quantity is exposed via a register
+because if an output line requires this ``extra post-vertical line
+spacing'', and the subsequent output line requires ``extra pre-vertical
+line spacing'' (a negative argument to @code{\x}), then applying both
+can lead to excessive spacing between the output lines. Text that is
+piling high on line @var{n} might not require (as much) extra
+pre-vertical line spacing if line @var{n}@minus{}1 carries extra
+post-vertical line spacing.
+
+Use of @code{\x} can be necessary in combination with the
+bracket-building escape sequence @code{\b},@footnote{@xref{Drawing
+Geometric Objects}.} as the following example shows.
+
+@Example
+.nf
+This is a test of \[rs]b (1).
+This is a test of \[rs]b (2).
+This is a test of \b'xyz'\x'-1m'\x'1m' (3).
+This is a test of \[rs]b (4).
+This is a test of \[rs]b (5).
+ @result{} This is a test of \b (1).
+ @result{} This is a test of \b (2).
+ @result{} x
+ @result{} This is a test of y (3).
+ @result{} z
+ @result{} This is a test of \b (4).
+ @result{} This is a test of \b (5).
+@endExample
+@endDefesc
+
+@noindent
+Without @code{\x}, the backslashes on the lines marked @samp{(2)} and
+@samp{(4)} would be overprinted.
+
+@need 1000
+@DefreqList {ns, }
+@DefreqItemx {rs, }
+@DefregListEndx {.ns}
+@cindex @code{sp} request, and no-space mode
+@cindex no-space mode (@code{ns})
+@cindex mode, no-space (@code{ns})
+@cindex blank lines, disabling
+@cindex lines, blank, disabling
+Enable @dfn{no-space mode}. Vertical spacing, whether by @code{sp}
+requests or blank input lines, is disabled. The @code{bp} request to
+advance to the next page is also disabled, unless it is accompanied by a
+page number (@pxref{Page Control}). No-space mode ends automatically
+when text@footnote{or geometric objects; see @ref{Drawing Geometric
+Objects}} is formatted for output @footnote{to the top-level diversion;
+see @ref{Diversions}} or the @code{rs} request is invoked, which ends
+no-space mode. The read-only register @code{.ns} interpolates a Boolean
+value indicating the enablement of no-space mode.
+
+A paragraphing macro might ordinarily insert vertical space to separate
+paragraphs. A section heading macro could invoke @code{ns} to suppress
+this spacing for the first paragraph in a section.
+@endDefreq
+
+
+@c =====================================================================
+
+@node Tabs and Fields, Character Translations, Manipulating Spacing, GNU troff Reference
+@section Tabs and Fields
+@cindex tabs, and fields
+@cindex fields, and tabs
+
+@cindex tab character encoding
+A tab character (@acronym{ISO} code point@tie{}9, @acronym{EBCDIC}
+code point@tie{}5) causes a horizontal movement to the next tab stop, if
+any.
+
+@Defesc {\\t, , , }
+@cindex tab character, non-interpreted (@code{\t})
+@cindex character, tab, non-interpreted (@code{\t})
+@cindex @code{\t}, and copy mode
+@cindex copy mode, and @code{\t}
+@cindex mode, copy, and @code{\t}
+Interpolate a tab in copy mode; see @ref{Copy Mode}.
+@endDefesc
+
+@DefreqList {ta, [[@Var{n1} @Var{n2} @dots{} @Var{nn} ]@t{T} @Var{r1} @
+ @Var{r2} @dots{} @Var{rn}]}
+@DefregListEndx {.tabs}
+Change tab stop positions. This request takes a series of tab
+specifiers as arguments (optionally divided into two groups with the
+letter @samp{T}) that indicate where each tab stop is to be, overriding
+any previous settings. The default scaling unit is @samp{m}. Invoking
+@code{ta} without an argument removes all tab stops.
+@cindex default tab stops
+@cindex tab stops, default
+GNU @code{troff}'s startup value is @w{@samp{T 0.5i}}.
+
+Tab stops can be specified absolutely---as distances from the left
+margin. The following example sets six tab stops, one every inch.
+
+@Example
+.ta 1i 2i 3i 4i 5i 6i
+@endExample
+
+Tab stops can also be specified using a leading @samp{+}, which means
+that the specified tab stop is set relative to the previous tab stop.
+For example, the following is equivalent to the previous example.
+
+@Example
+.ta 1i +1i +1i +1i +1i +1i
+@endExample
+
+GNU @code{troff} supports an extended syntax to specify repeating tab
+stops. These stops appear after a @samp{T} argument. Their values are
+always taken as distances relative to the previous tab stop. This is
+the idiomatic way to specify tab stops at equal intervals in
+@code{groff}. The following is, yet again, the same as the previous
+examples. It does more, in fact, since it defines an infinite number of
+tab stops at one-inch intervals.
+
+@Example
+.ta T 1i
+@endExample
+
+Now we are ready to interpret the full syntax given above. The
+@code{ta} request sets tabs at positions @var{n1}, @var{n2}, @dots{},
+@var{nn}, then at @var{nn}+@var{r1}, @var{nn}+@var{r2}, @dots{},
+@var{nn}+@var{rn}, then at @var{nn}+@var{rn}+@var{r1},
+@var{nn}+@var{rn}+@var{r2}, @dots{}, @var{nn}+@var{rn}+@var{rn}, and so
+on.
+
+For example, @samp{4c +6c T 3c 5c 2c} is equivalent to @samp{4c 10c 13c
+18c 20c 23c 28c 30c @dots{}}.
+
+Text written to a tab column (i.e., between two tab stops, or between a
+tab stop and an output line boundary) may be aligned to the right or
+left, or centered in the column. This alignment is determined by
+appending @samp{R}, @samp{L}, or @samp{C} to the tab specifier. The
+default is @samp{L}.
+
+@Example
+.ta 1i 2iC 3iR
+@endExample
+
+The beginning of an output line is not a tab stop; the text that begins
+an output line is placed according to the configured alignment and
+indentation; see @ref{Manipulating Filling and Adjustment} and @ref{Line
+Layout}.
+
+A tab stop is converted into a non-breakable horizontal movement that
+cannot be adjusted.
+
+@Example
+.ll 2i
+.ds foo a\tb\tc
+.ta T 1i
+\*[foo]
+ @error{} warning: cannot break line
+ @result{} a b c
+@endExample
+
+@noindent
+The above creates a single output line that is a bit longer than two
+inches (we use a string to show exactly where the tab stops are).
+Now consider the following.
+
+@Example
+.ll 2i
+.ds bar a\tb c\td
+.ta T 1i
+\*[bar]
+ @error{} warning: cannot adjust line
+ @result{} a b
+ @result{} c d
+@endExample
+
+@noindent
+GNU @code{troff} first converts the line's tab stops into unbreakable
+horizontal movements, then breaks after @samp{b}. This usually isn't
+what you want.
+
+Superfluous tab characters---those that do not correspond to a tab
+stop---are ignored except for the first, which delimits the characters
+belonging to the last tab stop for right-alignment or centering.
+
+@Example
+.ds Z foo\tbar\tbaz
+.ds ZZ foo\tbar\tbazqux
+.ds ZZZ foo\tbar\tbaz\tqux
+.ta 2i 4iR
+\*[Z]
+.br
+\*[ZZ]
+.br
+\*[ZZZ]
+.br
+ @result{} foo bar baz
+ @result{} foo bar bazqux
+ @result{} foo bar bazqux
+@endExample
+
+@noindent
+The first line right-aligns ``baz'' within the second tab stop. The
+second line right-aligns ``bazqux'' within it. The third line
+right-aligns only ``baz'' because of the additional tab character, which
+marks the end of the text occupying the last tab stop defined.
+
+Tab stops are associated with the environment (@pxref{Environments}).
+
+@cindex tab stop settings register (@code{.tabs})
+@cindex @code{.S} register, Plan@tie{}9 alias for @code{.tabs}
+@cindex @code{.tabs} register, Plan@tie{}9 alias (@code{.S})
+The read-only register @code{.tabs} contains a string
+representation of the current tab settings suitable for use as an
+argument to the @code{ta} request.@footnote{Plan@tie{}9 @code{troff}
+uses the register @code{.S} for this purpose.}
+
+@Example
+.ds tab-string \n[.tabs]
+\*[tab-string]
+ @result{} T120u
+@endExample
+@endDefreq
+
+@Defreq {tc, [@Var{c}]}
+@cindex tab repetition character (@code{tc})
+@cindex character, tab repetition (@code{tc})
+@cindex glyph, tab repetition (@code{tc})
+Set the tab repetition character to the ordinary or special character
+@var{c}; normally, no glyph is written when moving to a tab stop (and
+some output devices may output space characters to achieve this motion).
+A @dfn{tab repetition character} causes the formatter to write as many
+instances of @var{c} as are necessary to occupy the interval from the
+horizontal drawing position to the next tab stop. With no argument, GNU
+@code{troff} reverts to the default behavior. The tab repetition
+character is associated with the environment (@pxref{Environments}).
+Only a single character of @var{c} is recognized; any excess is ignored.
+@endDefreq
+
+@DefreqList {linetabs, n}
+@DefregListEndx {.linetabs}
+@cindex tab, line-tabs mode
+@cindex line-tabs mode
+@cindex mode, line-tabs
+If @var{n} is missing or non-zero, activate @dfn{line-tabs}; deactivate
+it otherwise (the default). Active line-tabs cause GNU @code{troff}
+to compute tab distances relative to the start of the output line
+instead of the input line.
+
+@Example
+.de Tabs
+. ds x a\t\c
+. ds y b\t\c
+. ds z c
+. ta 1i 3i
+\\*x
+\\*y
+\\*z
+..
+.Tabs
+.br
+.linetabs
+.Tabs
+ @result{} a b c
+ @result{} a b c
+@endExample
+
+Line-tabs activation is associated with the environment
+(@pxref{Environments}). The read-only register @code{.linetabs}
+interpolates@tie{}1 if line-tabs are active, and 0 otherwise.
+@endDefreq
+
+@menu
+* Leaders::
+* Fields::
+@end menu
+
+@c ---------------------------------------------------------------------
+
+@node Leaders, Fields, Tabs and Fields, Tabs and Fields
+@subsection Leaders
+@cindex leaders
+
+Sometimes it is desirable to fill a tab stop with a given glyph,
+but also use tab stops normally on the same output line. An example is
+a table of contents entry that uses dots to bridge the entry name with
+its page number, which is itself aligned between tab stops. The
+@code{roff} language provides @dfn{leaders} for this
+purpose.@footnote{This is pronounced to rhyme with ``feeder'', and
+refers to how the glyphs ``lead'' the eye across the page to the
+corresponding page number or other datum.}
+
+@cindex leader character
+A leader character (@acronym{ISO} and @acronym{EBCDIC} code
+point@tie{}1, also known as @acronym{SOH} or ``start of heading''),
+behaves similarly to a tab character:@: it moves to the next tab stop.
+The difference is that for this movement, the default fill character is
+a period @samp{.}.
+
+@Defesc {\\a, , , }
+@cindex leader character, non-interpreted (@code{\a})
+@cindex character, leader, non-interpreted (@code{\a})
+@cindex @code{\a}, and copy mode
+@cindex copy mode, and @code{\a}
+@cindex mode, copy, and @code{\a}
+Interpolate a leader in copy mode; see @ref{Copy Mode}.
+@endDefesc
+
+@Defreq {lc, [@Var{c}]}
+@cindex leader repetition character (@code{lc})
+@cindex character, leader repetition (@code{lc})
+@cindex glyph, leader repetition (@code{lc})
+Set the leader repetition character to the ordinary or special character
+@var{c}. Recall @ref{Tabs and Leaders}:@: when encountering a leader
+character in the input, the formatter writes as many dots @samp{.} as
+are necessary until
+reaching the next tab stop; this is the @dfn{leader definition
+character}. Omitting @var{c} unsets the leader
+character. With no argument, GNU @code{troff} treats leaders the same
+as tabs. The leader repetition character is associated with the
+environment (@pxref{Environments}). Only a single @var{c} is
+recognized; any excess is ignored.
+@endDefreq
+
+@cindex table of contents
+@cindex contents, table of
+A table of contents, for example, may define tab stops after a section
+number, a title, and a gap to be filled with leader dots. The page
+number follows the leader, after a right-aligned final tab stop wide
+enough to house the largest page number occurring in the document.
+
+@Example
+.ds entry1 19.\tThe Prophet\a\t98
+.ds entry2 20.\tAll Astir\a\t101
+.ta .5i 4.5i +.5iR
+.nf
+\*[entry1]
+\*[entry2]
+ @result{} 19. The Prophet............................. 98
+ @result{} 20. All Astir............................... 101
+@endExample
+
+@c ---------------------------------------------------------------------
+
+@node Fields, , Leaders, Tabs and Fields
+@subsection Fields
+@cindex fields
+
+@cindex field delimiting character (@code{fc})
+@cindex delimiting character, for fields (@code{fc})
+@cindex character, field delimiting (@code{fc})
+@cindex field padding character (@code{fc})
+@cindex padding character, for fields (@code{fc})
+@cindex character, field padding (@code{fc})
+@dfn{Fields} are a more general way of laying out tabular data. A field
+is defined as the data between a pair of @dfn{delimiting characters}.
+It contains substrings that are separated by @dfn{padding characters}.
+The width of a field is the distance on the @emph{input} line from the
+position where the field starts to the next tab stop. A padding
+character inserts an adjustable space similar to @TeX{}'s @code{\hss}
+command (thus it can even be negative) to make the sum of all substring
+lengths plus the adjustable space equal to the field width. If more
+than one padding character is inserted, the available space is evenly
+distributed among them.
+
+@Defreq {fc, [@Var{delim-char} [@Var{padding-char}]]}
+Define a delimiting and a padding character for fields. If the latter
+is missing, the padding character defaults to a space character. If
+there is no argument at all, the field mechanism is disabled (which is
+the default). In contrast to, e.g., the tab repetition character,
+delimiting and padding characters are @emph{not} associated with the
+environment (@pxref{Environments}).
+
+@Example
+.fc # ^
+.ta T 3i
+#foo^bar^smurf#
+.br
+#foo^^bar^smurf#
+ @result{} foo bar smurf
+ @result{} foo bar smurf
+@endExample
+@endDefreq
+
+
+@c =====================================================================
+
+@node Character Translations, @code{troff} and @code{nroff} Modes, Tabs and Fields, GNU troff Reference
+@section Character Translations
+@cindex character translations
+@cindex translations of characters
+
+A @dfn{translation} is a mapping of an input character to an output
+glyph. The mapping occurs at output time, i.e., the input character
+gets assigned the metric information of the mapped output character
+right before input tokens are converted to nodes (@pxref{Gtroff
+Internals}, for more on this process).
+
+@DefreqList {tr, @Var{a}@Var{b}@Var{c}@Var{d}@dots{}}
+@DefreqListEndx {trin, @Var{a}@Var{b}@Var{c}@Var{d}@dots{}}
+Translate character @var{a} to glyph@tie{}@var{b}, character @var{c} to
+glyph@tie{}@var{d}, and so on. If there is an odd number of characters
+in the argument, the last one is translated to a fixed-width space (the
+same one obtained by the @code{\@key{SP}} escape sequence).
+
+The @code{trin} request is identical to @code{tr}, but when you unformat
+a diversion with @code{asciify} it ignores the translation.
+@xref{Diversions}, for details about the @code{asciify} request.
+
+Some notes:
+
+@itemize @bullet
+@item
+@cindex @code{\(}, and translations
+@cindex @code{\[}, and translations
+@cindex @code{\'}, and translations
+@cindex @code{\`}, and translations
+@cindex @code{\-}, and translations
+@cindex @code{\_}, and translations
+@cindex @code{\C}, and translations
+@cindex @code{\N}, and translations
+@cindex @code{char} request, and translations
+@cindex special characters
+@cindex character, special
+@cindex numbered glyph (@code{\N})
+@cindex glyph, numbered (@code{\N})
+Special characters (@code{\(@var{xx}}, @code{\[@var{xxx}]},
+@code{\C'@var{xxx}'}, @code{\'}, @code{\`}, @code{\-}, @code{\_}),
+glyphs defined with the @code{char} request, and numbered glyphs
+(@code{\N'@var{xxx}'}) can be translated also.
+
+@item
+@cindex @code{\e}, and translations
+The @code{\e} escape can be translated also.
+
+@item
+@cindex @code{\%}, and translations
+@cindex @code{\~}, and translations
+Characters can be mapped onto the @code{\%} and @code{\~} escape
+sequences (but @code{\%} and @code{\~} can't be mapped onto another
+glyph).
+
+@item
+@cindex backspace character, and translations
+@cindex character, backspace, and translations
+@cindex leader character, and translations
+@cindex character, leader, and translations
+@cindex newline character, and translations
+@cindex character, newline, and translations
+@cindex tab character, and translations
+@cindex character, tab, and translations
+@cindex @code{\a}, and translations
+@cindex @code{\t}, and translations
+The following characters can't be translated: space (with one exception,
+see below), backspace, newline, leader (and @code{\a}), tab (and
+@code{\t}).
+
+@item
+@cindex @code{shc} request, and translations
+Translations are not considered for finding the soft hyphen character
+set with the @code{shc} request.
+
+@item
+@cindex @code{\&}, and translations
+The pair @samp{@var{c}\&} (an arbitrary character@tie{}@var{c} followed
+by the dummy character) maps this character to ``nothing''.
+
+@Example
+.tr a\&
+foo bar
+ @result{} foo br
+@endExample
+
+@noindent
+Even the space character can be mapped to the dummy character.
+
+@Example
+.tr aa \&
+foo bar
+ @result{} foobar
+@endExample
+
+@noindent
+As shown in the example, the space character can't be the first
+character/glyph pair as an argument of @code{tr}. Additionally, it is
+not possible to map the space character to any other glyph; requests
+like @w{@samp{.tr aa x}} undo @w{@samp{.tr aa \&}} instead.
+
+If justification is active, lines are justified in spite of the `empty'
+space character (but there is no minimal distance, i.e., the space
+character, between words).
+
+@item
+After an output glyph has been constructed (this happens at the moment
+immediately before the glyph is appended to an output glyph list, either
+by direct output, in a macro, diversion, or string), it is no longer
+affected by @code{tr}.
+
+@item
+Translating character to glyphs where one of them or both are undefined
+is possible also; @code{tr} does not check whether the elements of its
+argument exist.
+
+@xref{Gtroff Internals}.
+
+@item
+Without an argument, the @code{tr} request is ignored.
+@end itemize
+@endDefreq
+
+@Defreq {trnt, @Var{a}@Var{b}@Var{c}@Var{d}@dots{}}
+@cindex @code{\!}, and @code{trnt}
+@code{trnt} is the same as the @code{tr} request except that the
+translations do not apply to text that is transparently throughput into
+a diversion with @code{\!}. @xref{Diversions}.
+
+For example,
+
+@Example
+.tr ab
+.di x
+\!.tm a
+.di
+.x
+@endExample
+
+@noindent
+prints @samp{b} to the standard error stream; if @code{trnt} is used
+instead of @code{tr} it prints @samp{a}.
+@endDefreq
+
+
+@c =====================================================================
+
+@node @code{troff} and @code{nroff} Modes, Line Layout, Character Translations, GNU troff Reference
+@section @code{troff} and @code{nroff} Modes
+@cindex @code{troff} mode
+@cindex mode, @code{troff}
+@cindex @code{nroff} mode
+@cindex mode, @code{nroff}
+
+Historically, @code{nroff} and @code{troff} were two separate programs;
+the former for terminal output, the latter for typesetters. GNU
+@code{troff} merges both functions into one executable@footnote{A
+GNU @command{nroff} program is available for convenience; it calls GNU
+@code{troff} to perform the formatting.} that sends its output to a
+device driver (@code{grotty} for terminal devices, @code{grops} for
+PostScript, and so on) which interprets this intermediate output format.
+When discussing @acronym{AT&T} @code{troff}, it makes sense to talk
+about @dfn{@code{nroff} mode} and @dfn{@code{troff} mode} since the
+differences are hard-coded. GNU @code{troff} takes information from
+device and font description files without handling requests specially if
+a terminal output device is used, so such a strong distinction is
+unnecessary.
+
+Usually, a macro package can be used with all output devices.
+Nevertheless, it is sometimes necessary to make a distinction between
+terminal and non-terminal devices: GNU @code{troff} provides two
+built-in conditions @samp{n} and @samp{t} for the @code{if}, @code{ie},
+and @code{while} requests to decide whether GNU @code{troff} shall
+behave like @code{nroff} or like @code{troff}.
+
+@Defreq {troff, }
+@pindex troffrc
+@pindex troffrc-end
+Make the @samp{t} built-in condition true (and the @samp{n} built-in
+condition false) for @code{if}, @code{ie}, and @code{while} conditional
+requests. This is the default if GNU @code{troff} (@emph{not}
+@code{groff}) is started with the @option{-R} switch to avoid loading of
+the startup files @file{troffrc} and @file{troffrc-end}. Without
+@option{-R}, GNU @code{troff} stays in @code{troff} mode if the output
+device is not a terminal (e.g., `ps').
+@endDefreq
+
+@Defreq {nroff, }
+@pindex tty.tmac
+Make the @samp{n} built-in condition true (and the @samp{t} built-in
+condition false) for @code{if}, @code{ie}, and @code{while} conditional
+requests. This is the default if GNU @code{troff} uses a terminal
+output device; the code for switching to @code{nroff} mode is in the
+file @file{tty.tmac}, which is loaded by the startup file
+@code{troffrc}.
+@endDefreq
+
+@xref{Conditionals and Loops}, for more details on built-in conditions.
+
+
+@c =====================================================================
+
+@node Line Layout, Line Continuation, @code{troff} and @code{nroff} Modes, GNU troff Reference
+@section Line Layout
+@cindex line layout
+@cindex layout, line
+
+@cindex dimensions, line
+@cindex line dimensions
+The following drawing shows the dimensions that @code{gtroff} uses for
+placing a line of output onto the page. They are labeled with the
+request that manipulates each dimension.
+
+@Example
+ -->| in |<--
+ |<-----------ll------------>|
+ +----+----+----------------------+----+
+ | : : : |
+ +----+----+----------------------+----+
+-->| po |<--
+ |<--------paper width---------------->|
+@endExample
+
+@noindent
+These dimensions are:
+
+@ftable @code
+@item po
+@cindex left margin (@code{po})
+@cindex margin, left (@code{po})
+@cindex page offset (@code{po})
+@cindex offset, page (@code{po})
+@dfn{Page offset}---this is the leftmost position of text on the final
+output, defining the @dfn{left margin}.
+
+@item in
+@cindex indentation (@code{in})
+@cindex line indentation (@code{in})
+@dfn{Indentation}---this is the distance from the left margin where
+text is printed.
+
+@item ll
+@cindex line length (@code{ll})
+@cindex length of line (@code{ll})
+@dfn{Line length}---this is the distance from the left margin to right
+margin.
+@end ftable
+
+@cindex margin, right
+@cindex right margin
+The right margin is not explicitly configured; the combination of page
+offset and line length provides the information necessary to derive it.
+
+A simple demonstration:
+
+@Example
+.ll 3i
+This is text without indentation.
+The line length has been set to 3\~inches.
+.in +.5i
+.ll -.5i
+Now the left and right margins are both increased.
+.in
+.ll
+Calling .in and .ll without parameters restores
+the previous values.
+@endExample
+
+@Example
+ @result{} This is text without indenta-
+ @result{} tion. The line length has
+ @result{} been set to 3 inches.
+ @result{} Now the left and
+ @result{} right margins are
+ @result{} both increased.
+ @result{} Calling .in and .ll without
+ @result{} parameters restores the previ-
+ @result{} ous values.
+@endExample
+
+@DefreqList {po, [@Var{offset}]}
+@DefreqItem {po, @t{+}@Var{offset}}
+@DefreqItem {po, @t{-}@Var{offset}}
+@DefregListEndx {.o}
+@pindex tty.tmac
+Set page offset to @var{offset} (or increment or decrement its current
+value by @var{offset}). If invoked without an argument, the page offset
+is restored to the value before the previous @code{po} request.
+This request does not cause a break; the page offset in effect when an
+output line is broken prevails (@pxref{Manipulating Filling and
+Adjustment}). The initial value is 1@dmn{i} and the default scaling
+unit is @samp{m}. On terminal devices, the page offset is set to zero
+by a driver-specific macro file, @file{tty.tmac}. The current page
+offset can be found in the read-only register @samp{.o}.
+@cindex CSTR@tie{}#54 errata
+@cindex CSTR@tie{}#54 erratum, @code{po} request
+This request is incorrectly documented in the @acronym{AT&T}
+@code{troff} manual as using a default scaling unit of @samp{v}.
+
+@Example
+.po 3i
+\n[.o]
+ @result{} 720
+.po -1i
+\n[.o]
+ @result{} 480
+.po
+\n[.o]
+ @result{} 720
+@endExample
+@endDefreq
+
+@DefreqList {in, [@Var{indent}]}
+@DefreqItem {in, @t{+}@Var{indent}}
+@DefreqItem {in, @t{-}@Var{indent}}
+@DefregListEndx {.i}
+Set indentation to @var{indent} (or increment or decrement the current
+value by @var{indent}). This request causes a break. Initially, there
+is no indentation.
+
+If @code{in} is called without an argument, the indentation is reset to
+the previous value before the last call to @code{in}. The default
+scaling unit is @samp{m}.
+
+If a negative indentation value is specified (which is not allowed),
+@code{gtroff} emits a warning in category @samp{range} and sets the
+indentation to zero.
+
+The effect of @code{in} is delayed until a partially collected line (if
+it exists) is output. A temporary indentation value is reset to zero
+also.
+
+The current indentation (as set by @code{in}) can be found in the
+read-only register @samp{.i}. The indentation is associated with the
+environment (@pxref{Environments}).
+@endDefreq
+
+@DefreqList {ti, offset}
+@DefreqItem {ti, @t{+}@Var{offset}}
+@DefreqItem {ti, @t{-}@Var{offset}}
+@DefregListEndx {.in}
+Temporarily indent the next output line by @var{offset}. If an
+increment or decrement value is specified, adjust the temporary
+indentation relative to the value set by the @code{in} request.
+
+This request causes a break; its value is associated with the
+environment (@pxref{Environments}). The default scaling unit is
+@samp{m}. A call of @code{ti} without an argument is ignored.
+
+If the total indentation value is negative (which is not allowed),
+@code{gtroff} emits a warning in category @samp{range} and sets the
+temporary indentation to zero. `Total indentation' is either
+@var{offset} if specified as an absolute value, or the temporary plus
+normal indentation, if @var{offset} is given as a relative value.
+
+The effect of @code{ti} is delayed until a partially collected line (if
+it exists) is output.
+
+The read-only register @code{.in} is the indentation that applies to the
+current output line.
+
+The difference between @code{.i} and @code{.in} is that the latter takes
+into account whether a partially collected line still uses the old
+indentation value or a temporary indentation value is active.
+@endDefreq
+
+@DefreqList {ll, [@Var{length}]}
+@DefreqItem {ll, @t{+}@Var{length}}
+@DefreqItem {ll, @t{-}@Var{length}}
+@DefregItemx {.l}
+@DefregListEndx {.ll}
+Set the line length to @var{length} (or increment or decrement the
+current value by @var{length}). Initially, the line length is set to
+6.5@dmn{i}. The effect of @code{ll} is delayed until a partially
+collected line (if it exists) is output. The default scaling unit is
+@samp{m}.
+
+If @code{ll} is called without an argument, the line length is reset to
+the previous value before the last call to @code{ll}. If a negative
+line length is specified (which is not allowed), @code{gtroff} emits a
+warning in category @samp{range} and sets the line length to zero. The
+line length is associated with the environment (@pxref{Environments}).
+
+@cindex line length register (@code{.l})
+The current line length (as set by @code{ll}) can be found in the
+read-only register @samp{.l}. The read-only register @code{.ll} is the
+line length that applies to the current output line.
+
+Similar to @code{.i} and @code{.in}, the difference between @code{.l}
+and @code{.ll} is that the latter takes into account whether a partially
+collected line still uses the old line length value.
+@endDefreq
+
+
+@c =====================================================================
+
+@node Line Continuation, Page Layout, Line Layout, GNU troff Reference
+@section Line Continuation
+@cindex line control
+@cindex control, line
+
+When filling is enabled, input and output line breaks generally do not
+correspond. The @code{roff} language therefore distinguishes input and
+output line continuation.
+
+@Defesc {\\@key{RET}, , ,}
+@cindex input line continuation (@code{\@key{RET}})
+@cindex line, input, continuation (@code{\@key{RET}})
+@cindex continuation, input line (@code{\@key{RET}})
+@c We use the following notation in our man pages; Texinfo is bound to
+@c the GNU Emacs dialect.
+@esindex \@slanted{newline}
+@code{\@key{RET}} (a backslash immediately followed by a newline)
+suppresses the effects of that newline in the input. The next input
+line thus retains the classification of its predecessor as a control or
+text line. @code{\@key{RET}} is useful for managing line lengths in the
+input during document maintenance; you can break an input line in the
+middle of a request invocation, macro call, or escape sequence. Input
+line continuation is invisible to the formatter, with two exceptions:
+the @code{|} operator recognizes the new input line
+(@pxref{Numeric Expressions}), and the input line counter register
+@code{.c} is incremented.
+
+@c Wrap example at 56 columns (on the _output_). We use 50n in the
+@c groff input to avoid line adjustment.
+@Example
+.ll 50n
+.de I
+. ft I
+. nop \\$*
+. ft
+..
+Our film class watched
+.I The Effect of Gamma Rays on Man-in-the-Moon
+Marigolds. \" whoops, the input line wrapped
+.br
+.I My own opus begins on line \n[.c] \
+and ends on line \n[.c].
+@endExample
+@Example
+ @result{} Our film class watched @i{The Effect of Gamma Rays on}
+ @result{} @i{Man-in-the-Moon} Marigolds.
+ @result{} @i{My own opus begins on line 11 and ends on line 12.}
+@endExample
+@endDefesc
+
+@DefescList {\\c, , ,}
+@DefregListEndx {.int}
+@cindex output line, continuation (@code{\c})
+@cindex line, output, continuation (@code{\c})
+@cindex continuation, output line (@code{\c})
+@cindex interrupted line
+@cindex line, interrupted
+@cindex @code{\R}, after @code{\c}
+@code{\c} continues an output line. Nothing after it on the input line
+is formatted. In contrast to @code{\@key{RET}}, a line after @code{\c}
+remains a new input line, so a control character is recognized at its
+beginning. The visual results depend on whether filling is enabled; see
+@ref{Manipulating Filling and Adjustment}.
+
+@itemize @bullet
+@item
+@cindex @code{\c}, when filling enabled
+@cindex fill mode, and @code{\c}
+@cindex mode, fill, and @code{\c}
+If filling is enabled, a word interrupted with @code{\c} is continued
+with the text on the next input text line, without an intervening space.
+
+@Example
+This is a te\c
+st.
+ @result{} This is a test.
+@endExample
+
+@item
+@cindex @code{\c}, when filling disabled
+@cindex no-fill mode, and @code{\c}
+@cindex mode, no-fill, and @code{\c}
+If filling is disabled, the next input text line after @code{\c} is
+handled as a continuation of the same input text line.
+
+@Example
+.nf
+This is a \c
+test.
+ @result{} This is a test.
+@endExample
+@end itemize
+
+An intervening control line that causes a break overrides @code{\c},
+flushing out the pending output line in the usual way.
+
+@cindex interrupted line register (@code{.int})
+@cindex continued output line register (@code{.int})
+The @code{.int} register contains a positive value if the last output
+line was continued with @code{\c}; this datum is associated with the
+environment (@pxref{Environments}).@footnote{Historically, the @code{\c}
+escape sequence has proven challenging to characterize. Some sources
+say it ``connects the next input text'' (to the input line on which it
+appears); others describe it as ``interrupting'' text, on the grounds
+that a text line is interrupted without breaking, perhaps to inject a
+request invocation or macro call.}
+@endDefesc
+
+
+@c =====================================================================
+
+@node Page Layout, Page Control, Line Continuation, GNU troff Reference
+@section Page Layout
+@cindex page layout
+@cindex layout, page
+
+The formatter permits configuration of the page length and page number.
+
+@DefreqList {pl, [@Var{length}]}
+@DefreqItem {pl, @t{+}@Var{length}}
+@DefreqItem {pl, @t{-}@Var{length}}
+@DefregListEndx {.p}
+@cindex page length, configuring (@code{pl})
+@cindex length of the page, configuring (@code{pl})
+@cindex configuring the page length (@code{pl})
+@cindex setting the page length (@code{pl})
+Change (increase or decrease) the page length per the numeric expression
+@var{length}. The default scaling unit is @samp{v}. A negative
+@var{length} is valid, but an uncommon application:@: it prevents page
+location traps from being sprung,@footnote{@xref{Traps}.} and each
+output line is placed on a new page. If @var{length} is invalid, GNU
+@code{troff} emits a warning in category @samp{number}. If @var{length}
+is absent or invalid, @samp{11i} is assumed.
+
+@cindex page length register (@code{.p})
+The read-only register @samp{.p} interpolates the current page length.
+@endDefreq
+
+@DefreqList {pn, num}
+@DefreqItem {pn, @t{+}@Var{num}}
+@DefreqItem {pn, @t{-}@Var{num}}
+@DefregListEndx {.pn}
+@cindex page number, configuring next (@code{pn})
+@cindex next page number, configuring (@code{pn})
+@cindex number, page, next, configuring (@code{pn})
+Change (increase or decrease) the page number of the @emph{next} page
+per the numeric expression @var{num}. If @var{num} is invalid, GNU
+@code{troff} emits a warning in category @samp{number} and ignores the
+request. Without an argument, @code{pn} is ignored.
+
+@cindex next page number register (@code{.pn})
+@cindex page number, next, register (@code{.pn})
+The read-only register @code{.pn} interpolates @var{num} if set by
+@code{pn} on the current page, or the current page number plus@tie{}1.
+@endDefreq
+
+@cindex headers
+@cindex footers
+@cindex titles
+The formatter offers special support for typesetting headers and
+footers, collectively termed @dfn{titles}. Titles have an independent
+line length, and their placement on the page is not restricted.
+
+@Defreq {tl, @code{'}@Var{left}@code{'}@Var{center}@code{'}@Var{right}@code{'}}
+@cindex title line, formatting (@code{tl})
+@cindex formatting a title line (@code{tl})
+@cindex three-part title (@code{tl})
+@cindex page number character (@code{%})
+Format an output line as a title consisting of @var{left}, @var{center},
+and @var{right}, each aligned accordingly. The delimiter need not be a
+neutral apostrophe: @code{tl} accepts the same delimiters as most escape
+sequences; see @ref{Delimiters}. If not used as the delimiter, any
+@dfn{page number character} character is replaced with the current page
+number; the default is @samp{%}; see the the @code{pc} request below.
+Without an argument, @code{tl} is ignored. @code{tl} writes the title
+line immediately, ignoring any partially collected line.
+
+It is not an error to omit delimiters after the first. For example,
+@w{@samp{.tl /Thesis}} is interpreted as @w{@samp{.tl /Thesis///}}:@: it
+sets a title line comprising only the left-aligned word @samp{Thesis}.
+@endDefreq
+
+@DefreqList {lt, [@Var{length}]}
+@DefreqItem {lt, @t{+}@Var{length}}
+@DefreqItem {lt, @t{-}@Var{length}}
+@DefregListEndx {.lt}
+@cindex length of title line, configuring (@code{lt})
+@cindex title length, configuring (@code{lt})
+Change (increase or decrease) the line length used by titles per the
+numeric expression @var{length}. The default scaling unit is @samp{m}.
+If @var{length} is negative, GNU emits a warning in category
+@samp{range} and treats @var{length} as @samp{0}. If @var{length} is
+invalid, GNU @code{troff} emits a warning in category @samp{number} and
+ignores the request. The formatter's default title length is
+@samp{6.5i}. With no argument, the title length is restored to the
+previous value. The title length is is associated with the environment
+(@pxref{Environments}).
+
+@cindex title line length register (@code{.lt})
+The read-only register @samp{.lt} interpolates the title line length.
+@endDefreq
+
+@Defreq {pc, [@Var{char}]}
+@cindex changing the page number character (@code{pc})
+@cindex page number character, changing (@code{pc})
+@vindex %
+Set the page number character to @var{char}. With no argument, the page
+number character is disabled. @code{pc} does not affect the
+register@tie{}@code{%}.
+@endDefreq
+
+The following example exercises title features.
+
+@Example
+.lt 50n
+This is my partially collected
+.tl 'Isomers 2023'%'Dextrose Edition'
+line.
+ @result{} Isomers 2023 1 Dextrose Edition
+ @result{} This is my partially collected line.
+@endExample
+
+We most often see titles used in page header and footer traps.
+@xref{Traps}.
+
+@c =====================================================================
+
+@node Page Control, Using Fonts, Page Layout, GNU troff Reference
+@section Page Control
+@cindex page control
+@cindex control, page
+
+@cindex page break
+@cindex break, page
+@cindex page ejection
+@cindex ejection, page
+Discretionary page breaks can prevent the unwanted separation of
+content. A new page number takes effect during page ejection; see
+@ref{The Implicit Page Trap}.
+
+@DefreqList {bp, [@Var{page-number}]}
+@DefreqItem {bp, @t{+}@Var{page-number}}
+@DefreqItem {bp, @t{-}@Var{page-number}}
+@DefregListEndx {%}
+@cindex new page (@code{bp})
+@cindex page, new (@code{bp})
+Break the page and change (increase or decrease) the next page number
+per the numeric expression @var{page-number}. If @var{page-number} is
+invalid, GNU @code{troff} emits a warning in category @samp{number} and
+ignores the argument. This request causes a break. A page break
+advances the vertical drawing position to the bottom of the page,
+springing traps. @xref{Page Location Traps}.
+@cindex @code{bp} request, and top-level diversion
+@cindex top-level diversion, and @code{bp}
+@cindex diversion, top-level, and @code{bp}
+@code{bp} has effect only if invoked within the top-level
+diversion.@footnote{@xref{Diversions}.}
+@cindex CSTR@tie{}#54 errata
+@cindex CSTR@tie{}#54 erratum, @code{bp} request
+This request is incorrectly documented in the @acronym{AT&T}
+@code{troff} manual as having a default scaling unit of @samp{v}.
+
+@cindex page number register (@code{%})
+@cindex current page number (@code{%})
+The register @code{%} interpolates the current page number.
+
+@Example
+.de BP
+' bp \" schedule page break once current line is output
+..
+@endExample
+@endDefreq
+
+@Defreq {ne, [@Var{space}]}
+@cindex orphan lines, preventing with @code{ne}
+@cindex conditional page break (@code{ne})
+@cindex page break, conditional (@code{ne})
+Force a page break if insufficient vertical space is available (assert
+``needed'' space). @code{ne} tests the distance to the next page
+location trap; see @ref{Page Location Traps}, and breaks the page if
+that amount is less than @var{space}. The default scaling unit is
+@samp{v}. If @var{space} is invalid, GNU @code{troff} emits a warning
+in category @samp{number} and ignores the argument. If @var{space} is
+not specified, @samp{1v} is assumed.
+
+@cindex widow
+We can require space for at least the first two output lines of a
+paragraph, preventing its first line from being @slanted{widowed} at the
+page bottom.
+
+@Example
+.ne 2v
+Considering how common illness is,
+how tremendous the spiritual change that it brings,
+how astonishing,
+when the lights of health go down,
+the undiscovered countries that are then disclosed,
+what wastes and deserts of the soul a slight attack
+of influenza brings to view,
+@c -- Virgina Woolf, "On Being Ill", 1926
+@endExample
+
+@c XXX: Some of this might be better placed in a revised Chapter 3.
+This method is reliable only if no output line is pending when @code{ne}
+is invoked. When macro packages are used, this is often not the case:@:
+their paragraphing macros perform the break. You may need to experiment
+with placing the @code{ne} after the paragraphing macro, or @code{br}
+and @code{ne} before it.
+
+@cindex orphan
+@cindex widow
+@code{ne} is also useful to force grouping of section headings with
+their subsequent paragraphs, or tables with their captions and/or
+explanations. Macro packages often use @code{ne} with diversions to
+implement keeps and displays; see @ref{Diversions}. They may also offer
+parameters for widow and orphan management.
+@endDefreq
+
+@DefreqList {sv, [@Var{space}]}
+@DefreqListEndx {os, }
+@cindex @code{ne} request, comparison with @code{sv}
+Require vertical space as @code{ne} does, but also @slanted{save} it for
+later output by the @code{os} request. If @var{space} is available
+before the next page location trap, it is output immediately. Both
+requests ignore a partially collected line, taking effect at the next
+break.
+@cindex @code{sv} request, and no-space mode
+@cindex @code{os} request, and no-space mode
+@code{sv} and @code{os} ignore no-space mode (recall @ref{Manipulating
+Spacing}). While the @code{sv} request allows negative values for
+@var{space}, @code{os} ignores them. The default scaling unit is
+@samp{v}. If @var{space} is not specified, @samp{1v} is assumed.
+@endDefreq
+
+@Defreg {nl}
+@cindex vertical drawing position (@code{nl})
+@cindex vertical position, drawing (@code{nl})
+@cindex drawing position, vertical (@code{nl})
+@c TODO: We should talk somewhere prior to this point about how the
+@c formatter doesn't start a page until it has to.
+@code{nl} interpolates or sets the vertical drawing position. When the
+formatter starts, the first page transition hasn't happened yet, and
+@code{nl} is negative. If a header trap has been planted on the page
+(typically at vertical position @code{0}), you can assign a negative
+value to @code{nl} to spring it if that page has already started
+(@pxref{Page Location Traps}).
+
+@Example
+.de HD
+. sp
+. tl ''Goldbach Solution''
+. sp
+..
+.
+First page.
+.bp
+.wh 0 HD \" plant header trap at top of page
+.nr nl (-1)
+Second page.
+ @result{} First page.
+ @result{}
+ @result{} @r{@i{(blank lines elided)}}
+ @result{}
+ @result{} Goldbach Solution
+ @result{}
+ @result{} @r{@i{(blank lines elided)}}
+ @result{}
+ @result{} Second page.
+@endExample
+
+@noindent
+Without resetting @code{nl} to a negative value, the trap just planted
+would be active beginning with the @emph{next} page, not the current
+one.
+
+@xref{Diversions}, for a comparison of @code{nl} with the @code{.h} and
+@code{.d} registers.
+@endDefreg
+
+
+@c =====================================================================
+
+@c BEGIN Keep (roughly) parallel with section "Using fonts" of groff(7).
+@node Using Fonts, Manipulating Type Size and Vertical Spacing, Page Control, GNU troff Reference
+@section Using Fonts
+@cindex font
+
+@cindex typeface
+@cindex font family
+@cindex font style
+@cindex style, font
+@cindex family, font
+@cindex text font
+@cindex special font
+@cindex unstyled font
+@cindex font, text
+@cindex font, special
+@cindex font, unstyled
+In digital typography, a @dfn{font} is a collection of characters in a
+specific typeface that a device can render as glyphs at a desired
+size.@footnote{Terminals and some output devices have fonts that render
+at only one or two sizes. As examples of the latter, take the
+@code{groff} @code{lj4} device's Lineprinter, and @code{lbp}'s Courier
+and Elite faces.} A @code{roff} formatter can change typefaces at any
+point in the text. The basic faces are a set of @dfn{styles} combining
+upright and slanted shapes with normal and heavy stroke weights:
+@samp{R}, @samp{I}, @samp{B}, and @samp{BI}---these stand for
+@slanted{roman}, @slanted{italic}, @slanted{bold}, and
+@slanted{bold-italic}. For linguistic text, GNU @code{troff} groups
+typefaces into @dfn{families} containing each of these
+styles.@footnote{Font designers prepare families such that the styles
+share esthetic properties.} A @dfn{text font} is thus often a family
+combined with a style, but it need not be:@: consider the @code{ps} and
+@code{pdf} devices' @code{ZCMI} (Zapf Chancery Medium italic)---often,
+no other style of Zapf Chancery Medium is provided. On typesetting
+devices, at least one @dfn{special font} is available, comprising
+@dfn{unstyled} glyphs for mathematical operators and other purposes.
+
+@cindex font description file
+@cindex description file, font
+@cindex file, font description
+@cindex font metrics
+@cindex metrics, font
+@cindex mounting position
+@cindex mounting position
+@cindex position, mounting
+Like @acronym{AT&T} @code{troff}, GNU @code{troff} does not itself load
+or manipulate a digital font file;@footnote{Historically, the fonts
+@code{troff}s dealt with were not Free Software or, as with the Graphic
+Systems C/A/T, did not even exist in the digital domain.} instead it
+works with a @dfn{font description file} that characterizes it,
+including its glyph repertoire and the @dfn{metrics} (dimensions) of
+each glyph.@footnote{@xref{Font Description File Format}.} This
+information permits the formatter to accurately place glyphs with
+respect to each other. Before using a font description, the formatter
+associates it with a @dfn{mounting position}, a place in an ordered list
+of available typefaces.
+@cindex abstract font style
+@cindex font style, abstract
+@cindex style, font, abstract
+So that a document need not be strongly coupled to a specific font
+family, in GNU @code{troff} an output device can associate a style in
+the abstract sense with a mounting position. Thus the default family
+can be combined with a style dynamically, producing a @dfn{resolved font
+name}.
+
+Fonts often have trademarked names, and even Free Software fonts can
+require renaming upon modification. @code{groff} maintains a
+convention that a device's serif font family is given the name @samp{T}
+(``Times''), its sans-serif family @samp{H} (``Helvetica''), and its
+monospaced family @samp{C} (``Courier''). Historical inertia has driven
+@code{groff}'s font identifiers to short uppercase abbreviations of font
+names, as with @samp{TR}, @samp{TI}, @samp{TB}, @samp{TBI}, and a
+special font @samp{S}.
+
+The default family used with abstract styles can be changed at any time;
+initially, it is @samp{T}. Typically, abstract styles are arranged in
+the first four mounting positions in the order shown above. The default
+mounting position, and therefore style, is always @samp{1} (@samp{R}).
+By issuing appropriate formatter instructions, you can override these
+defaults before your document writes its first glyph.
+
+@cindex graphic renditions
+@cindex renditions, graphic
+@cindex character cell attributes
+@cindex attributes, character cell
+@cindex cell, character, attributes
+Terminal output devices cannot change font families and lack special
+fonts. They support style changes by overstriking, or by altering
+ISO@tie{}6429/ECMA-48 @dfn{graphic renditions} (character cell
+attributes).
+@c END Keep (roughly) parallel with section "Using fonts" of groff(7).
+
+@menu
+* Selecting Fonts::
+* Font Families::
+* Font Positions::
+* Using Symbols::
+* Character Classes::
+* Special Fonts::
+* Artificial Fonts::
+* Ligatures and Kerning::
+* Italic Corrections::
+* Dummy Characters::
+@end menu
+
+@c ---------------------------------------------------------------------
+
+@node Selecting Fonts, Font Families, Using Fonts, Using Fonts
+@subsection Selecting Fonts
+@cindex font, selection
+
+We use @dfn{font} to refer to any of several means of identifying a
+font: by mounting position (@samp{3}), by abstract style (@samp{B}), or
+by its identifier (@samp{TB}).
+
+@DefreqList {ft, [@Var{font}]}
+@DefescItemx {\\f, , f, }
+@DefescItem {\\f, (, fn, }
+@DefescItem {\\f, [, font, ]}
+@DefregListEndx {.fn}
+@cindex changing fonts (@code{ft}, @code{\f})
+@cindex fonts, changing (@code{ft}, @code{\f})
+@cindex @code{sty} request, and changing fonts
+@cindex @code{fam} request, and changing fonts
+@cindex @code{\F}, and changing fonts
+@kindex styles
+@kindex family
+@pindex DESC
+@cindex selecting the previous font (@code{ft})
+@cindex previous font, selecting (@code{ft})
+@cindex font, previous, slecting (@code{ft})
+The @code{ft} request selects the typeface @var{font}. If the argument
+is absent or @samp{P}, it selects the previously chosen font. If
+@var{font} is a non-negative integer, it is interpreted as mounting
+position; the font mounted there is selected. If that position refers
+to an abstract style, it is combined with the default family (see
+@code{fam} and @code{\F} below) to make a resolved font name. If the
+mounting position is not a style and no font is mounted there, GNU
+@code{troff} emits a warning in category @samp{font} and ignores the
+request.
+
+If @var{font} matches a style name, it is combined with the current
+family to make a resolved font name. Otherwise, @var{font} is assumed
+to already be a resolved font name.
+
+@cindex automatic font mounting
+@cindex font mounting, automatic
+@cindex mounting, font, automatic
+The resolved font name is subject to translation (see request @code{ftr}
+below). Next, the (possibly translated) font name's mounting position
+is looked up; if not mounted, @var{font} is sought on the file system as
+a font description file and, if located, automatically mounted at the
+next available position (see register @code{.fp} below). If the font
+was mounted using an identifier different from its font description file
+name (see request @code{fp} below), that file name is then looked up.
+If a font description file for the resolved font name is not found, GNU
+@code{troff} emits a warning in category @samp{font} and ignores the
+request.
+
+The @code{\f} escape sequence is similar, using one-character name (or
+mounting position) @var{f}, two-character name @var{fn}, or a name
+@var{font} of arbitrary length.
+@cindex previous font, selecting (@code{\f[]}, @code{\fP})
+@cindex font, previous, selecting (@code{\f[]}, @code{\fP})
+@samp{\f[]} selects the previous font. The syntax form @samp{\fP} is
+supported for backward compatibility, and @samp{\f[P]} for consistency.
+
+@Example
+eggs, bacon,
+.ft I
+spam,
+.ft
+and sausage.
+.br
+eggs, bacon, \fIspam,\fP and sausage.
+ @result{} eggs, bacon, @slanted{spam,} and sausage
+ @result{} eggs, bacon, @slanted{spam,} and sausage
+@endExample
+
+The current and previously selected fonts are properties of the
+environment (@pxref{Environments}).
+
+The read-only string-valued register @code{.fn} contains the resolved
+font name of the selected font.
+
+@code{\f} doesn't produce an input token in GNU @code{troff}; it thus
+can be used in requests that expect a single-character argument. We can
+assign a font to a margin character as follows (@pxref{Miscellaneous}).
+
+@Example
+.mc \f[I]x\f[]
+@endExample
+@endDefreq
+
+@Defreq {ftr, f [@Var{g}]}
+@cindex font translation (@code{ftr})
+@cindex @code{ft} request, and font translations
+@cindex @code{ul} request, and font translations
+@cindex @code{bd} request, and font translations
+@cindex @code{\f}, and font translations
+@cindex @code{cs} request, and font translations
+@cindex @code{tkf} request, and font translations
+@cindex @code{special} request, and font translations
+@cindex @code{fspecial} request, and font translations
+@cindex @code{fp} request, and font translations
+@cindex @code{sty} request, and font translations
+@cindex @code{if} request, and font translations
+@cindex @code{ie} request, and font translations
+@cindex @code{while} request, and font translations
+Translate font@tie{}@var{f} to font@tie{}@var{g}. Whenever a font
+named@tie{}@var{f} is referred to in a @code{\f} escape sequence, in the
+@code{F} and @code{S} conditional operators, or in the @code{ft},
+@code{ul}, @code{bd}, @code{cs}, @code{tkf}, @code{special},
+@code{fspecial}, @code{fp}, or @code{sty} requests, font@tie{}@var{g} is
+used. If @var{g} is missing or equal to@tie{}@var{f} the translation is
+undone.
+@c XXX: Do font translations work on mounting positions? Abstract
+@c styles?
+
+Font translations cannot be chained.
+
+@Example
+.ftr XXX TR
+.ftr XXX YYY
+.ft XXX
+ @error{} warning: can't find font 'XXX'
+@endExample
+@endDefreq
+
+@DefreqList {fzoom, f [@Var{zoom}]}
+@DefregListEndx {.zoom}
+@cindex magnification of a font (@code{fzoom})
+@cindex font, magnification (@code{fzoom})
+@cindex zoom factor of a font (@code{fzoom})
+@cindex factor, zoom, of a font (@code{fzoom})
+@cindex font, zoom factor (@code{fzoom})
+@cindex optical size of a font
+@cindex font, optical size
+@cindex size, optical, of a font
+Set magnification of font@tie{}@var{f} to factor @var{zoom}, which must
+be a non-negative integer multiple of 1/1000th. This request is useful
+to adjust the optical size of a font in relation to the others. In the
+example below, font @code{CR} is magnified by 10% (the zoom factor is
+thus 1.1).
+
+@Example
+.fam P
+.fzoom CR 1100
+.ps 12
+Palatino and \f[CR]Courier\f[]
+@endExample
+
+A missing or zero value of @var{zoom} is the same as a value of 1000,
+which means no magnification. @var{f}@tie{}must be a resolved font
+name, not an abstract style.
+@c XXX: What about a mounting position? It's not rejected...
+
+The magnification of a font is completely transparent to GNU
+@code{troff}; a change of the zoom factor doesn't cause any effect
+except that the dimensions of glyphs, (word) spaces, kerns, etc., of the
+affected font are adjusted accordingly.
+
+The zoom factor of the current font is available in the read-only
+register @samp{.zoom}, in multiples of 1/1000th. It returns zero if
+there is no magnification.
+@endDefreq
+
+@c ---------------------------------------------------------------------
+
+@node Font Families, Font Positions, Selecting Fonts, Using Fonts
+@subsection Font Families
+@cindex font families
+@cindex families, font
+@cindex font styles
+@cindex styles, font
+
+To accommodate the wide variety of fonts available, GNU @code{troff}
+distinguishes @dfn{font families} and @dfn{font styles}. A resolved
+font name is the catenation of a font family and a style. Selecting an
+abstract style causes GNU @code{troff} to combine it with the default
+font family.
+
+You can thus compose a document using abstract styles exclusively for
+its body or running text, selecting a specific family only for titles or
+examples, for instance, and change the default family on the command
+line (recall @ref{Groff Options}).
+
+Fonts for the devices @code{ps}, @code{pdf}, @code{dvi}, @code{lj4},
+@code{lbp}, and the X11 devices support this mechanism. By default,
+GNU @code{troff} uses the Times family with the four styles @samp{R},
+@samp{I}, @samp{B}, and @samp{BI}.
+
+@DefreqList {fam, [@Var{family}]}
+@DefregItemx {.fam}
+@DefescItemx {\\F, , f, }
+@DefescItem {\\F, (, fm, }
+@DefescListEnd {\\F, [, family, ]}
+@cindex changing font family (@code{fam}, @code{\F})
+@cindex font family, changing (@code{fam}, @code{\F})
+Set the default font family, used in combination with abstract styles to
+construct a resolved font name, to @var{family} (one-character
+name@tie{}@var{f}, two-character name @var{fm}). If no argument is
+given, GNU @code{troff} selects the previous font family; if there none,
+is it falls back to the device's default@footnote{@xref{DESC File
+Format}.} or its own (@samp{T}).
+
+The @code{\F} escape sequence works similarly. In disanalogy to
+@code{\f}, @samp{\FP} makes @samp{P} the default family. Use
+@samp{\F[]} to select the previous default family. The default font
+family is available in the read-only string-valued register @code{.fam};
+it is associated with the environment (@pxref{Environments}).
+
+@Example
+spam, \" startup defaults are T (Times) R (roman)
+.fam H \" make Helvetica the default family
+spam, \" family H + style R = HR
+.ft B \" family H + style B = HB
+spam,
+.ft CR \" Courier roman (default family not changed)
+spam,
+.ft \" back to Helvetica bold
+spam,
+.fam T \" make Times the default family
+spam, \" family T + style B = TB
+.ft AR \" font AR (not a style)
+baked beans,
+.ft R \" family T + style R = TR
+and spam.
+@endExample
+
+@code{\F} doesn't produce an input token in GNU @code{troff}. As a
+consequence, it can be used in requests like @code{mc} (which expects
+a single character as an argument) to change the font family on the fly.
+
+@Example
+.mc \F[P]x\F[]
+@endExample
+@endDefreq
+
+@need 1000
+@DefreqList {sty, n style}
+@DefregListEndx {.sty}
+@cindex setting up an abstract font style (@code{sty})
+@cindex abstract font style, setting up (@code{sty})
+@cindex font style, abstract, setting up (@code{sty})
+@cindex style, font, abstract, setting up (@code{sty})
+@cindex @code{cs} request, and font styles
+@cindex @code{bd} request, and font styles
+@cindex @code{tkf} request, and font styles
+@cindex @code{uf} request, and font styles
+@cindex @code{fspecial} request, and font styles
+Associate an abstract style @var{style} with mounting
+position@tie{}@var{n}, which must be a non-negative integer. If the
+requests @code{cs}, @code{bd}, @code{tkf}, @code{uf}, or @code{fspecial}
+are applied to an abstract style, they are instead applied to the member
+of the current family corresponding to that style.
+
+@pindex DESC
+@kindex styles
+The default family can be set with the @option{-f} option (@pxref{Groff
+Options}). The @code{styles} command in the @file{DESC} file controls
+which font positions (if any) are initially associated with abstract
+styles rather than fonts.
+
+@strong{Caution:@:} The @var{style} argument is not validated.
+@c XXX: This would be a really good thing to fix.
+Errors may occur later, when the formatter attempts to construct a
+resolved font name, or format a character for output.
+
+@Example
+.nr BarPos \n[.fp]
+.sty \n[.fp] Bar
+.fam Foo
+.ft \n[BarPos]
+.tm .f=\n[.f]
+A
+ @error{} error: no font family named 'Foo' exists
+ @error{} .f=41
+ @error{} error: cannot format glyph: no current font
+@endExample
+
+When an abstract style has been selected, the read-only string-valued
+register @samp{.sty} interpolates its name; this datum is associated
+with the environment (@pxref{Environments}). Otherwise, @samp{.sty}
+interpolates nothing.
+@endDefreq
+
+@c ---------------------------------------------------------------------
+
+@node Font Positions, Using Symbols, Font Families, Using Fonts
+@subsection Font Positions
+@cindex font positions
+@cindex positions, font
+
+To support typeface indirection through abstract styles, and for
+compatibility with @acronym{AT&T} @code{troff}, the formatter maintains
+a list of font @dfn{positions} at which fonts required by a document are
+@dfn{mounted}. An output device's description file @file{DESC}
+typically configures a set of pre-mounted fonts; see @ref{Device and
+Font Description Files}. A font need not be explicitly mounted before
+it is selected; GNU @code{troff} will search @env{GROFF_FONT_PATH} for
+it by name and mount it at the first free mounting position on demand.
+
+@need 500
+@DefreqList {fp, pos id [@Var{font-description-file-name}]}
+@DefregItemx {.f}
+@DefregListEndx {.fp}
+@cindex mounting a font (@code{fp})
+@cindex font, mounting (@code{fp})
+Mount a font under the name @var{id} at mounting position @var{pos}, a
+non-negative integer. When the formatter starts up, it reads the output
+device's description to mount an initial set of faces, and selects font
+position@tie{}1. Position@tie{}0 is unused by default. Unless the
+@var{font-description-file-name} argument is given, @var{id} should be
+the name of a font description file stored in a directory corresponding
+to the selected output device. GNU @code{troff} does not traverse
+directories to locate the font description file.
+
+@c The third argument was a late revision to device-independent troff.
+@c It wasn't in the "Unix 4.0" version of CSTR #54 (January 1981), which
+@c featured Kernighan's device-independent rewrite, but appeared by the
+@c time of its 1992 revision.
+@cindex font aliasing with third argument to @code{fp} request
+@cindex aliasing fonts with third argument to @code{fp} request
+The optional third argument enables font names to be aliased, which can
+be necessary in compatibility mode since AT&T @code{troff} syntax
+affords no means of identifying fonts with names longer than two
+characters, like @samp{TBI} or @samp{ZCMI}, in a font selection escape
+sequence. @xref{Compatibility Mode}. You can also alias fonts on
+mounting for convenience or abstraction. (See below regarding the
+@code{.fp} register.)
+
+@Example
+.fp \n[.fp] SC ZCMI
+Send a \f(SChand-written\fP thank-you note.
+.fp \n[.fp] Emph TI
+.fp \n[.fp] Strong TB
+Are \f[Emph]these names\f[] \f[Strong]comfortable\f[]?
+@endExample
+
+@samp{DESC}, @samp{P}, and non-negative integers are not usable as font
+identifiers.
+@c XXX: TODO: Catch the DESC case earlier and throw an error for it.
+@c XXX: This identifier could be used as a style name, but no one's
+@c exercised this freedom in 30+ years, and we should consider
+@c prohibiting it. --GBR
+
+@cindex font position register (@code{.f})
+The position of the currently selected font (or abstract style) is
+available in the read-only register @samp{.f}. It is associated with
+the environment (@pxref{Environments}).
+
+You can copy the value of @code{.f} to another register to save it for
+later use.
+
+@Example
+.nr saved-font \n[.f]
+@r{@dots{} @i{text involving many font changes} @dots{}}
+.ft \n[saved-font]
+@endExample
+
+@cindex next free font position register (@code{.fp})
+The index of the next (non-zero) free font position is available in the
+read-only register @samp{.fp}.
+@cindex @file{DESC} file, and font mounting
+Fonts not listed in the @file{DESC} file are automatically mounted at
+position @samp{\n[.fp]} when selected with the @code{ft} request or
+@code{\f} escape sequence. When mounting a font at a position
+explicitly with the @code{fp} request, this same practice should be
+followed, although GNU @code{troff} does not enforce this strictly.
+@endDefreq
+
+@c ---------------------------------------------------------------------
+
+@node Using Symbols, Character Classes, Font Positions, Using Fonts
+@subsection Using Symbols
+@cindex using symbols
+@cindex symbols, using
+
+@cindex glyph
+@cindex character
+@cindex glyph, distinguished from character
+@cindex character, distinguished from glyph
+@cindex ligature
+A @dfn{glyph} is a graphical representation of a @dfn{character}. While
+a character is an abstraction of semantic information, a glyph is
+something that can be seen on screen or paper. A character has many
+possible representation forms (for example, the character `A' can be
+written in an upright or slanted typeface, producing distinct
+glyphs). Sometimes, a sequence of characters map to a single glyph:@:
+this is a @dfn{ligature}---the most common is `fi'.
+
+Space characters never become glyphs in GNU @code{troff}. If not
+discarded (as when trailing on text lines), they are represented by
+horizontal motions in the output.
+
+@cindex symbol
+@cindex special fonts
+@kindex fonts
+@pindex DESC
+@cindex @code{special} request, and glyph search order
+@cindex @code{fspecial} request, and glyph search order
+A @dfn{symbol} is simply a named glyph. Within @code{gtroff}, all glyph
+names of a particular font are defined in its font file. If the user
+requests a glyph not available in this font, @code{gtroff} looks up an
+ordered list of @dfn{special fonts}. By default, the PostScript output
+device supports the two special fonts @samp{SS} (slanted symbols) and
+@samp{S} (symbols) (the former is looked up before the latter). Other
+output devices use different names for special fonts. Fonts mounted
+with the @code{fonts} keyword in the @file{DESC} file are globally
+available. To install additional special fonts locally (i.e., for a
+particular font), use the @code{fspecial} request.
+
+Here are the exact rules how @code{gtroff} searches a given symbol:
+
+@itemize @bullet
+@item
+If the symbol has been defined with the @code{char} request, use it.
+This hides a symbol with the same name in the current font.
+
+@item
+Check the current font.
+
+@item
+If the symbol has been defined with the @code{fchar} request, use it.
+
+@item
+Check whether the current font has a font-specific list of special
+fonts; test all fonts in the order of appearance in the last
+@code{fspecial} call if appropriate.
+
+@item
+If the symbol has been defined with the @code{fschar} request for the
+current font, use it.
+
+@item
+Check all fonts in the order of appearance in the last @code{special}
+call.
+
+@item
+If the symbol has been defined with the @code{schar} request, use it.
+
+@item
+As a last resort, consult all fonts loaded up to now for special fonts
+and check them, starting with the lowest font number. This can
+sometimes lead to surprising results since the @code{fonts} line in
+the @file{DESC} file often contains empty positions, which are filled
+later on. For example, consider the following:
+
+@Example
+fonts 3 0 0 FOO
+@endExample
+
+@noindent
+This mounts font @code{foo} at font position@tie{}3. We assume that
+@code{FOO} is a special font, containing glyph @code{foo}, and that no
+font has been loaded yet. The line
+
+@Example
+.fspecial BAR BAZ
+@endExample
+
+@noindent
+makes font @code{BAZ} special only if font @code{BAR} is active. We
+further assume that @code{BAZ} is really a special font, i.e., the font
+description file contains the @code{special} keyword, and that it also
+contains glyph @code{foo} with a special shape fitting to font
+@code{BAR}. After executing @code{fspecial}, font @code{BAR} is loaded
+at font position@tie{}1, and @code{BAZ} at position@tie{}2.
+
+We now switch to a new font @code{XXX}, trying to access glyph
+@code{foo} that is assumed to be missing. There are neither
+font-specific special fonts for @code{XXX} nor any other fonts made
+special with the @code{special} request, so @code{gtroff} starts the
+search for special fonts in the list of already mounted fonts, with
+increasing font positions. Consequently, it finds @code{BAZ} before
+@code{FOO} even for @code{XXX}, which is not the intended behaviour.
+@end itemize
+
+@xref{Device and Font Description Files}, and @ref{Special Fonts}, for
+more details.
+
+@cindex list of special characters (@cite{groff_char@r{(7)}} man page)
+@cindex special characters, list of (@cite{groff_char@r{(7)}} man page)
+@cindex characters, special, list of (@cite{groff_char@r{(7)}} man page)
+@cindex available glyphs, list of (@cite{groff_char@r{(7)}} man page)
+@cindex glyphs, available, list of (@cite{groff_char@r{(7)}} man page)
+The @cite{groff_char@r{(7)}} man page houses a complete list of
+predefined special character names, but the availability of any as a
+glyph is device- and font-dependent. For example, say
+
+@Example
+man -Tdvi groff_char > groff_char.dvi
+@endExample
+
+@noindent
+to obtain those available with the DVI device and default font
+configuration.@footnote{Not all versions of the @code{man} program
+support the @option{-T} option; use the subsequent example for an
+alternative.} If you want to use an additional macro package to change
+the fonts used, @code{groff} (or @code{gtroff}) must be run directly.
+
+@Example
+groff -Tdvi -mec -man groff_char.7 > groff_char.dvi
+@endExample
+
+@cindex composite glyph names
+@cindex glyph names, composite
+@cindex @code{groff} glyph list (GGL)
+@cindex GGL (@code{groff} glyph list)
+@cindex Adobe Glyph List (AGL)
+Special character names not listed in @cite{groff_char@r{(7)}} are
+derived algorithmically, using a simplified version of the Adobe Glyph
+List (AGL) algorithm, which is described in
+@uref{https://github.com@//adobe-type-tools@//agl-aglfn}. The (frozen)
+set of names that can't be derived algorithmically is called the
+@dfn{@code{groff} glyph list (GGL)}.
+
+@itemize @bullet
+@item
+A glyph for Unicode character U+@var{XXXX}[@var{X}[@var{X}]], which is
+not a composite character is named
+@code{u@var{XXXX}@r{[}@var{X}@r{[}@var{X}@r{]]}}. @var{X} must be an
+uppercase hexadecimal digit. Examples: @code{u1234}, @code{u008E},
+@code{u12DB8}. The largest Unicode value is 0x10FFFF. There must be at
+least four @code{X} digits; if necessary, add leading zeroes (after the
+@samp{u}). No zero padding is allowed for character codes greater than
+0xFFFF. Surrogates (i.e., Unicode values greater than 0xFFFF
+represented with character codes from the surrogate area U+D800-U+DFFF)
+are not allowed either.
+
+@item
+A glyph representing more than a single input character is named
+
+@display
+@samp{u} @var{component1} @samp{_} @var{component2} @samp{_} @var{component3} @dots{}
+@end display
+
+@noindent
+Example: @code{u0045_0302_0301}.
+
+For simplicity, all Unicode characters that are composites must be
+maximally decomposed to NFD;@footnote{This is ``Normalization Form D''
+as documented in Unicode Standard Annex #15
+(@uref{https://unicode.org@//reports@//tr15/}).} for example,
+@code{u00CA_0301} is not a valid glyph name since U+00CA (@sc{latin
+capital letter e with circumflex}) can be further decomposed into U+0045
+(@sc{latin capital letter e}) and U+0302 (@sc{combining circumflex
+accent}). @code{u0045_0302_0301} is thus the glyph name for U+1EBE,
+@sc{latin capital letter e with circumflex and acute}.
+
+@item
+groff maintains a table to decompose all algorithmically derived glyph
+names that are composites itself. For example, @code{u0100} (@sc{latin
+letter a with macron}) is automatically decomposed into
+@code{u0041_0304}. Additionally, a glyph name of the GGL is preferred
+to an algorithmically derived glyph name; @code{groff} also
+automatically does the mapping. Example: The glyph @code{u0045_0302} is
+mapped to @code{^E}.
+
+@item
+glyph names of the GGL can't be used in composite glyph names; for
+example, @code{^E_u0301} is invalid.
+@end itemize
+
+@DefescList {\\, (, nm, }
+@DefescItem {\\, [, name, ]}
+@DefescListEnd {\\, [, base-glyph combining-component @dots{}, ]}
+@esindex \(
+@esindex \[
+Typeset a special character @var{name} (two-character name @var{nm}) or
+a composite glyph consisting of @var{base-glyph} overlaid with one or
+more @var{combining-component}s. For example, @samp{\[A ho]} is a
+capital letter ``A'' with a ``hook accent'' (ogonek).
+
+There is no special syntax for one-character names---the analogous form
+@samp{\@var{n}} would collide with other escape sequences. However, the
+four escape sequences @code{\'}, @code{\-}, @code{\_}, and @code{\`},
+are translated on input to the special character escape sequences
+@code{\[aa]}, @code{\[-]}, @code{\[ul]}, and @code{\[ga]}, respectively.
+
+A special character name of length one is not the same thing as an
+ordinary character: that is, the character @code{a} is not the same as
+@code{\[a]}.
+
+If @var{name} is undefined, a warning in category @samp{char} is
+produced and the escape is ignored. @xref{Warnings}, for information
+about the enablement and suppression of warnings.
+
+GNU @code{troff} resolves @code{\[@r{@dots{}}]} with more than a single
+component as follows:
+
+@itemize @bullet
+@item
+Any component that is found in the GGL is converted to the
+@code{u@var{XXXX}} form.
+
+@item
+Any component @code{u@var{XXXX}} that is found in the list of
+decomposable glyphs is decomposed.
+
+@item
+The resulting elements are then concatenated with @samp{_} in between,
+dropping the leading @samp{u} in all elements but the first.
+@end itemize
+
+No check for the existence of any component (similar to @code{tr}
+request) is done.
+
+Examples:
+
+@table @code
+@item \[A ho]
+@samp{A} maps to @code{u0041}, @samp{ho} maps to @code{u02DB}, thus the
+final glyph name would be @code{u0041_02DB}. This is not the expected
+result:@: the ogonek glyph @samp{ho} is a spacing ogonek, but for a
+proper composite a non-spacing ogonek (U+0328) is necessary. Looking
+into the file @file{composite.tmac}, one can find @w{@samp{.composite ho
+u0328}}, which changes the mapping of @samp{ho} while a composite glyph
+name is constructed, causing the final glyph name to be
+@code{u0041_0328}.
+
+@item \[^E u0301]
+@itemx \[^E aa]
+@itemx \[E a^ aa]
+@itemx \[E ^ @code{'}]
+@samp{^E} maps to @code{u0045_0302}, thus the final glyph name is
+@code{u0045_0302_0301} in all forms (assuming proper calls of the
+@code{composite} request).
+@end table
+
+It is not possible to define glyphs with names like @w{@samp{A ho}}
+within a @code{groff} font file. This is not really a limitation;
+instead, you have to define @code{u0041_0328}.
+@endDefesc
+
+@Defesc {\\C, @code{'}, xxx, @code{'}}
+@cindex named character (@code{\C})
+@cindex character, named (@code{\C})
+Typeset the glyph of the special character @var{xxx}. Normally, it is
+more convenient to use @code{\[@var{xxx}]}, but @code{\C} has some
+advantages: it is compatible with @acronym{AT&T} device-independent
+@code{troff} (and therefore available in compatibility
+mode@footnote{@xref{Compatibility Mode}.}) and can interpolate special
+characters with @samp{]} in their names. The delimiter need not be
+a neutral apostrophe; see @ref{Delimiters}.
+@endDefesc
+
+@Defreq {composite, id1 id2}
+@pindex composite.tmac
+Map special character name @var{id1} to @var{id2} if @var{id1} is used
+in @code{\[...]} with more than one component. See above for examples.
+This is a strict rewriting of the special character name; no check is
+performed for the existence of a glyph for either. A set of default
+mappings for many accents can be found in the file
+@file{composite.tmac}, loaded by the default @file{troffrc} at startup.
+@endDefreq
+
+@Defesc {\\N, @code{'}, n, @code{'}}
+@cindex numbered glyph (@code{\N})
+@cindex glyph, numbered (@code{\N})
+@cindex @code{char} request, used with @code{\N}
+@cindex Unicode
+Typeset the glyph with code@tie{}@var{n} in the current font
+(@code{n}@tie{}is @emph{not} the input character code). The number
+@var{n}@tie{}can be any non-negative decimal integer. Most devices only
+have glyphs with codes between 0 and@tie{}255; the Unicode output device
+uses codes in the range 0--65535. If the current font does not contain
+a glyph with that code, special fonts are @emph{not} searched. The
+@code{\N} escape sequence can be conveniently used in conjunction with
+the @code{char} request:
+
+@Example
+.char \[phone] \f[ZD]\N'37'
+@endExample
+
+@noindent
+@pindex DESC
+@cindex unnamed glyphs
+@cindex glyphs, unnamed
+The code of each glyph is given in the fourth column in the font
+description file after the @code{charset} command. It is possible to
+include unnamed glyphs in the font description file by using a name of
+@samp{---}; the @code{\N} escape sequence is the only way to use these.
+
+No kerning is applied to glyphs accessed with @code{\N}. The delimiter
+need not be a neutral apostrophe; see @ref{Delimiters}.
+@endDefesc
+
+A few escape sequences are also special characters.
+
+@Defesc {\@code{'}, , , }
+An escaped neutral apostrophe is a synonym for @code{\[aa]} (acute
+accent).
+@endDefesc
+
+@Defesc {\@code{`}, , , }
+An escaped grave accent is a synonym for @code{\[ga]} (grave accent).
+@endDefesc
+
+@Defesc {\\-, , , }
+An escaped hyphen-minus is a synonym for @code{\[-]} (minus sign).
+@endDefesc
+
+@Defesc {\\_, , , }
+An escaped underscore (``low line'') is a synonym for @code{\[ul]}
+(underrule). On typesetting devices, the underrule is font-invariant
+and drawn lower than the underscore @samp{_}.
+@endDefesc
+
+@Defreq {cflags, n c1 c2 @dots{}}
+@cindex glyph properties (@code{cflags})
+@cindex character properties (@code{cflags})
+@cindex properties of glyphs (@code{cflags})
+@cindex properties of characters (@code{cflags})
+Assign properties encoded by the number @var{n} to characters @var{c1},
+@var{c2}, and so on.
+
+Input characters, including special characters introduced by an escape,
+have certain properties associated with them.@footnote{Output glyphs
+don't---to GNU @code{troff}, a glyph is simply a box with an index into
+a font, a given height above and depth below the baseline, and a width.}
+These properties can be modified with this request. The first argument
+is the sum of the desired flags and the remaining arguments are the
+characters to be assigned those properties. Spaces between the @var{cn}
+arguments are optional. Any argument @var{cn} can be a character class
+defined with the @code{class} request rather than an individual
+character. @xref{Character Classes}.
+
+The non-negative integer @var{n} is the sum of any of the following.
+Some combinations are nonsensical, such as @samp{33} (1 + 32).
+
+@table @code
+@item 1
+@cindex end-of-sentence characters
+@cindex characters, end-of-sentence
+Recognize the character as ending a sentence if followed by a newline
+or two spaces. Initially, characters @samp{.?!} have this property.
+
+@item 2
+@cindex hyphenating characters
+@cindex characters, hyphenation
+Enable breaks before the character. A line is not broken at a character
+with this property unless the characters on each side both have non-zero
+hyphenation codes. This exception can be overridden by adding 64.
+Initially, no characters have this property.
+
+@item 4
+@cindex @code{\-} glyph, and @code{cflags}
+@cindex @code{hy} glyph, and @code{cflags}
+@cindex @code{em} glyph, and @code{cflags}
+Enable breaks after the character. A line is not broken at a character
+with this property unless the characters on each side both have non-zero
+hyphenation codes. This exception can be overridden by adding 64.
+Initially, characters @samp{\-\[hy]\[em]} have this property.
+
+@item 8
+@cindex overlapping characters
+@cindex characters, overlapping
+@cindex @code{ul} glyph, and @code{cflags}
+@cindex @code{rn} glyph, and @code{cflags}
+@cindex @code{ru} glyph, and @code{cflags}
+@cindex @code{radicalex} glyph, and @code{cflags}
+@cindex @code{sqrtex} glyph, and @code{cflags}
+Mark the glyph associated with this character as overlapping other
+instances of itself horizontally. Initially, characters
+@samp{\[ul]\[rn]\[ru]\[radicalex]\[sqrtex]} have this property.
+
+@item 16
+@cindex @code{br} glyph, and @code{cflags}
+Mark the glyph associated with this character as overlapping other
+instances of itself vertically. Initially, the character @samp{\[br]}
+has this property.
+
+@item 32
+@cindex transparent characters
+@cindex character, transparent
+@cindex @code{"}, at end of sentence
+@cindex @code{'}, at end of sentence
+@cindex @code{)}, at end of sentence
+@cindex @code{]}, at end of sentence
+@cindex @code{*}, at end of sentence
+@cindex @code{dg} glyph, at end of sentence
+@cindex @code{dd} glyph, at end of sentence
+@cindex @code{rq} glyph, at end of sentence
+@cindex @code{cq} glyph, at end of sentence
+Mark the character as transparent for the purpose of end-of-sentence
+recognition. In other words, an end-of-sentence character followed by
+any number of characters with this property is treated as the end of a
+sentence if followed by a newline or two spaces. This is the same as
+having a zero space factor in @TeX{}. Initially, characters
+@samp{"')]*\[dg]\[dd]\[rq]\[cq]} have this property.
+
+@item 64
+Ignore hyphenation codes of the surrounding characters. Use this in
+combination with values 2 and@tie{}4 (initially, no characters have this
+property).
+
+For example, if you need an automatic break point after the en-dash in
+numeric ranges like ``3000--5000'', insert
+
+@Example
+.cflags 68 \[en]
+@endExample
+
+@noindent
+into your document. However, this practice can lead to bad layout if
+done thoughtlessly; in most situations, a better solution instead of
+changing the @code{cflags} value is to insert @code{\:} right after the
+hyphen at the places that really need a break point.
+@end table
+
+The remaining values were implemented for East Asian language support;
+those who use alphabetic scripts exclusively can disregard them.
+
+@table @code
+@item 128
+Prohibit a line break before the character, but allow a line break after
+the character. This works only in combination with flags 256 and 512
+and has no effect otherwise. Initially, no characters have this
+property.
+
+@item 256
+Prohibit a line break after the character, but allow a line break before
+the character. This works only in combination with flags 128 and 512
+and has no effect otherwise. Initially, no characters have this
+property.
+
+@item 512
+Allow line break before or after the character. This works only in
+combination with flags 128 and 256 and has no effect otherwise.
+Initially, no characters have this property.
+@end table
+
+In contrast to values 2 and@tie{}4, the values 128, 256, and 512 work
+pairwise. If, for example, the left character has value 512, and the
+right character 128, no break will be automatically inserted between
+them. If we use value@tie{}6 instead for the left character, a break
+after the character can't be suppressed since the neighboring character
+on the right doesn't get examined.
+@endDefreq
+
+@DefreqList {char, c [@Var{contents}]}
+@DefreqItemx {fchar, c [@Var{contents}]}
+@DefreqItemx {fschar, f c [@Var{contents}]}
+@DefreqListEndx {schar, c [@Var{contents}]}
+@cindex defining character (@code{char})
+@cindex defining fallback character (@code{fchar}, @code{fschar}, @code{schar})
+@cindex character, defining (@code{char})
+@cindex character, defining fallback (@code{fchar}, @code{fschar}, @code{schar})
+@cindex fallback character, defining (@code{fchar}, @code{fschar}, @code{schar})
+@cindex creating new characters (@code{char})
+@cindex defining symbol (@code{char})
+@cindex symbol, defining (@code{char})
+@cindex defining glyph (@code{char})
+@cindex glyph, defining (@code{char})
+@cindex escape character, while defining glyph
+@cindex character, escape, while defining glyph
+@cindex @code{tr} request, and glyph definitions
+@cindex @code{cp} request, and glyph definitions
+@cindex @code{rc} request, and glyph definitions
+@cindex @code{lc} request, and glyph definitions
+@cindex @code{\l}, and glyph definitions
+@cindex @code{\L}, and glyph definitions
+@cindex @code{\&}, and glyph definitions
+@cindex @code{\e}, and glyph definitions
+@cindex @code{hcode} request, and glyph definitions
+Define a new character or glyph@tie{}@var{c} to be @var{contents}, which
+can be empty. More precisely, @code{char} defines a @code{groff} object
+(or redefines an existing one) that is accessed with the
+name@tie{}@var{c} on input, and produces @var{contents} on output.
+Every time glyph@tie{}@var{c} needs to be printed, @var{contents} is
+processed in a temporary environment and the result is wrapped up into a
+single object. Compatibility mode is turned off and the escape
+character is set to@tie{}@code{\} while @var{contents} is processed.
+Any emboldening, constant spacing, or track kerning is applied to this
+object rather than to individual glyphs in @var{contents}.
+
+An object defined by these requests can be used just like a normal glyph
+provided by the output device. In particular, other characters can be
+translated to it with the @code{tr} or @code{trin} requests; it can be
+made the leader character with the @code{lc} request; repeated patterns
+can be drawn with it using the @code{\l} and @code{\L} escape sequences;
+and words containing@tie{}@var{c} can be hyphenated correctly if the
+@code{hcode} request is used to give the object a hyphenation code.
+
+There is a special anti-recursion feature: use of the object within its
+own definition is handled like a normal character (not
+defined with @code{char}).
+
+The @code{tr} and @code{trin} requests take precedence if @code{char}
+accesses the same symbol.
+
+@Example
+.tr XY
+X
+ @result{} Y
+.char X Z
+X
+ @result{} Y
+.tr XX
+X
+ @result{} Z
+@endExample
+
+The @code{fchar} request defines a fallback glyph: @code{gtroff} only
+checks for glyphs defined with @code{fchar} if it cannot find the glyph
+in the current font. @code{gtroff} carries out this test before
+checking special fonts.
+
+@code{fschar} defines a fallback glyph for font@tie{}@var{f}:
+@code{gtroff} checks for glyphs defined with @code{fschar} after the
+list of fonts declared as font-specific special fonts with the
+@code{fspecial} request, but before the list of fonts declared as global
+special fonts with the @code{special} request.
+
+Finally, the @code{schar} request defines a global fallback glyph:
+@code{gtroff} checks for glyphs defined with @code{schar} after the list
+of fonts declared as global special fonts with the @code{special}
+request, but before the already mounted special fonts.
+
+@xref{Character Classes}.
+@endDefreq
+
+@DefreqList {rchar, c @dots{}}
+@DefreqListEndx {rfschar, f c @dots{}}
+@cindex removing glyph definition (@code{rchar}, @code{rfschar})
+@cindex glyph, removing definition (@code{rchar}, @code{rfschar})
+@cindex fallback glyph, removing definition (@code{rchar}, @code{rfschar})
+Remove definition of each ordinary or special character @var{c},
+undoing the effect of a @code{char}, @code{fchar}, or @code{schar}
+request. Those supplied by font description files cannot be removed.
+Spaces and tabs may separate @var{c}@tie{}arguments.
+
+The request @code{rfschar} removes glyph definitions defined with
+@code{fschar} for font@tie{}@var{f}.
+@endDefreq
+
+@c ---------------------------------------------------------------------
+
+@node Character Classes, Special Fonts, Using Symbols, Using Fonts
+@subsection Character Classes
+@cindex character classes
+@cindex classes, character
+
+Classes are particularly useful for East Asian languages such as
+Chinese, Japanese, and Korean, where the number of needed characters is
+much larger than in European languages, and where large sets of
+characters share the same properties.
+
+@Defreq {class, name c1 c2 @dots{}}
+@cindex character class (@code{class})
+@cindex defining character class (@code{class})
+@cindex class of characters (@code{class})
+Define a character class (or simply ``class'') @var{name} comprising
+the characters @var{c1}, @var{c2}, and so on.
+
+A class thus defined can then be referred to in lieu of listing all the
+characters within it. Currently, only the @code{cflags} request can
+handle references to character classes.
+
+In the request's simplest form, each @var{cn} is a character (or special
+character).
+
+@Example
+.class [quotes] ' \[aq] \[dq] \[oq] \[cq] \[lq] \[rq]
+@endExample
+
+Since class and glyph names share the same name space, it is recommended
+to start and end the class name with @code{[} and @code{]},
+respectively, to avoid collisions with existing character names defined
+by GNU @code{troff} or the user (with @code{char} and related requests).
+This practice applies the presence of @code{]} in the class name to
+prevent the use of the special character escape form
+@code{\[@r{@dots{}}]}, thus you must use the @code{\C} escape to access
+a class with such a name.
+
+@cindex GGL (@code{groff} glyph list)
+@cindex @code{groff} glyph list (GGL)
+You can also use a character range notation consisting of a
+start character followed by @samp{-} and then an end character.
+Internally, GNU @code{troff} converts these two symbol names to
+Unicode code points (according to the @code{groff} glyph list [GGL]),
+which then give the start and end value of the range. If that fails,
+the class definition is skipped.
+
+Furthermore, classes can be nested.
+
+@Example
+.class [prepunct] , : ; > @}
+.class [prepunctx] \C'[prepunct]' \[u2013]-\[u2016]
+@endExample
+
+@noindent
+The class @samp{[prepunctx]} thus contains the contents of the class
+@code{[prepunct]} as defined above (the set @samp{, : ; > @}}), and
+characters in the range between @code{U+2013} and @code{U+2016}.
+
+If you want to include @samp{-} in a class, it must be the first
+character value in the argument list, otherwise it gets misinterpreted
+as part of the range syntax.
+
+It is not possible to use class names as end points of range
+definitions.
+
+A typical use of the @code{class} request is to control line-breaking
+and hyphenation rules as defined by the @code{cflags} request. For
+example, to inhibit line breaks before the characters belonging to the
+@code{prepunctx} class defined in the previous example, you can write
+the following.
+
+@Example
+.cflags 2 \C'[prepunctx]'
+@endExample
+
+@noindent
+See the @code{cflags} request in @ref{Using Symbols}, for more details.
+@endDefreq
+
+@c ---------------------------------------------------------------------
+
+@node Special Fonts, Artificial Fonts, Character Classes, Using Fonts
+@subsection Special Fonts
+@cindex special fonts
+@cindex fonts, special
+
+Special fonts are those that @code{gtroff} searches when it cannot find
+the requested glyph in the current font. The Symbol font is usually a
+special font.
+
+@code{gtroff} provides the following two requests to add more special
+fonts. @xref{Using Symbols}, for a detailed description of the glyph
+searching mechanism in @code{gtroff}.
+
+Usually, only non-TTY devices have special fonts.
+
+@DefreqList {special, [@Var{s1} @Var{s2} @dots{}]}
+@DefreqListEndx {fspecial, f [@Var{s1} @Var{s2} @dots{}]}
+@kindex fonts
+@pindex DESC
+Use the @code{special} request to define special fonts. Initially, this
+list is empty.
+
+Use the @code{fspecial} request to designate special fonts only when
+font@tie{}@var{f} is active. Initially, this list is empty.
+
+Previous calls to @code{special} or @code{fspecial} are overwritten;
+without arguments, the particular list of special fonts is set to empty.
+Special fonts are searched in the order they appear as arguments.
+
+All fonts that appear in a call to @code{special} or @code{fspecial}
+are loaded.
+
+@xref{Using Symbols}, for the exact search order of glyphs.
+@endDefreq
+
+@c ---------------------------------------------------------------------
+
+@node Artificial Fonts, Ligatures and Kerning, Special Fonts, Using Fonts
+@subsection Artificial Fonts
+@cindex artificial fonts
+@cindex fonts, artificial
+
+There are a number of requests and escape sequences for artificially
+creating fonts. These are largely vestiges of the days when output
+devices did not have a wide variety of fonts, and when @code{nroff} and
+@code{troff} were separate programs. Most of them are no longer
+necessary in GNU @code{troff}. Nevertheless, they are supported.
+
+@DefescList {\\H, @code{'}, height, @code{'}}
+@DefescItem {\\H, @code{'}, @t{+}height, @code{'}}
+@DefescItem {\\H, @code{'}, @t{-}height, @code{'}}
+@DefregListEndx {.height}
+@cindex changing the font height (@code{\H})
+@cindex font height, changing (@code{\H})
+@cindex height, font, changing (@code{\H})
+Change (increment, decrement) the height of the current font, but not
+the width. If @var{height} is zero, restore the original height.
+Default scaling unit is @samp{z}.
+
+The read-only register @code{.height} contains the font height as set by
+@code{\H}.
+
+Currently, only the @option{-Tps} and @option{-Tpdf} devices support
+this feature.
+
+@code{\H} doesn't produce an input token in GNU @code{troff}. As a
+consequence, it can be used in requests like @code{mc} (which expects
+a single character as an argument) to change the font on the fly:
+
+@Example
+.mc \H'+5z'x\H'0'
+@endExample
+
+In compatibility mode, @code{gtroff} behaves differently: If an
+increment or decrement is used, it is always taken relative to the
+current type size and not relative to the previously selected font
+height. Thus,
+
+@Example
+.cp 1
+\H'+5'test \H'+5'test
+@endExample
+
+@noindent
+prints the word @samp{test} twice with the same font height (five points
+larger than the current font size).
+@endDefesc
+
+@DefescList {\\S, @code{'}, slant, @code{'}}
+@DefregListEndx {.slant}
+@cindex changing the font slant (@code{\S})
+@cindex font slant, changing (@code{\S})
+@cindex slant, font, changing (@code{\S})
+Slant the current font by @var{slant} degrees. Positive values slant to
+the right. Only integer values are possible.
+
+The read-only register @code{.slant} contains the font slant as set by
+@code{\S}.
+
+Currently, only the @option{-Tps} and @option{-Tpdf} devices support
+this feature.
+
+@code{\S} doesn't produce an input token in GNU @code{troff}. As a
+consequence, it can be used in requests like @code{mc} (which expects
+a single character as an argument) to change the font on the fly:
+
+@Example
+.mc \S'20'x\S'0'
+@endExample
+
+@cindex CSTR@tie{}#54 errata
+@cindex CSTR@tie{}#54 erratum, @code{\S} escape
+This escape is incorrectly documented in the @acronym{AT&T}
+@code{troff} manual; the slant is always set to an absolute value.
+@endDefesc
+
+@Defreq {ul, [@Var{lines}]}
+@cindex underlining (@code{ul})
+The @code{ul} request normally underlines subsequent lines if a TTY
+output device is used. Otherwise, the lines are printed in italics
+(only the term `underlined' is used in the following). The single
+argument is the quantity of input lines to be underlined; with no
+argument, the next line is underlined. If @var{lines} is zero or
+negative, stop the effects of @code{ul} (if it was active). Requests
+and empty lines do not count for computing the number of underlined
+input lines, even if they produce some output like @code{tl}. Lines
+inserted by macros (e.g., invoked by a trap) do count.
+
+At the beginning of @code{ul}, the current font is stored and the
+underline font is activated. Within the span of a @code{ul} request, it
+is possible to change fonts, but after the last line affected by
+@code{ul} the saved font is restored.
+
+This number of lines still to be underlined is associated with the
+environment (@pxref{Environments}). The underline font can be changed
+with the @code{uf} request.
+
+@c XXX @xref should be changed to grotty
+
+@c @xref{@code{troff} and @code{nroff} Modes}, for a discussion of how
+@c underlining is implemented for terminal output devices, and what
+@c problems can arise.
+
+The @code{ul} request does not underline spaces.
+@endDefreq
+
+@Defreq {cu, [@Var{lines}]}
+@cindex continuous underlining (@code{cu})
+@cindex underlining, continuous (@code{cu})
+The @code{cu} request is similar to @code{ul} but underlines spaces as
+well (if a TTY output device is used).
+@endDefreq
+
+@Defreq {uf, font}
+@cindex underline font (@code{uf})
+@cindex font for underlining (@code{uf})
+Set the underline font (globally) used by @code{ul} and @code{cu}. By
+default, this is the font at position@tie{}2. @var{font} can be either
+a non-negative font position or the name of a font.
+@endDefreq
+
+@DefreqList {bd, font [@Var{offset}]}
+@DefreqItem {bd, font1 font2 [@Var{offset}]}
+@DefregListEndx {.b}
+@cindex imitating boldface (@code{bd})
+@cindex boldface, imitating (@code{bd})
+Embolden @var{font} by overstriking its glyphs offset by @var{offset}
+units minus one.
+
+Two syntax forms are available.
+
+@itemize @bullet
+@item
+Imitate a bold font unconditionally. The first argument specifies the
+font to embolden, and the second is the number of basic units, minus
+one, by which the two glyphs are offset. If the second argument is
+missing, emboldening is turned off.
+
+@var{font} can be either a non-negative font position or the name of a
+font.
+
+@var{offset} is available in the @code{.b} read-only register if a
+special font is active; in the @code{bd} request, its default unit is
+@samp{u}.
+
+@cindex @code{fspecial} request, and imitating bold
+@kindex special
+@cindex embolding of special fonts
+@cindex special fonts, emboldening
+@item
+Imitate a bold form conditionally. Embolden @var{font1} by @var{offset}
+only if font @var{font2} is the current font. This request can be
+issued repeatedly to set up different emboldening values for different
+current fonts. If the second argument is missing, emboldening is turned
+off for this particular current font.
+
+This affects special fonts only (either set up with the @code{special}
+command in font files or with the @code{fspecial} request).
+@end itemize
+@endDefreq
+
+@Defreq {cs, font [@Var{width} [@Var{em-size}]]}
+@cindex constant glyph space mode (@code{cs})
+@cindex mode for constant glyph space (@code{cs})
+@cindex glyph, constant space
+@cindex @code{ps} request, and constant glyph space mode
+Switch to and from @dfn{constant glyph space mode}. If activated, the
+width of every glyph is @math{@var{width}/36} ems. The em size is given
+absolutely by @var{em-size}; if this argument is missing, the em value
+is taken from the current font size (as set with the @code{ps} request)
+when the font is effectively in use. Without second and third argument,
+constant glyph space mode is deactivated.
+
+Default scaling unit for @var{em-size} is @samp{z}; @var{width} is an
+integer.
+@endDefreq
+
+@c ---------------------------------------------------------------------
+
+@node Ligatures and Kerning, Dummy Characters, Artificial Fonts, Using Fonts
+@subsection Ligatures and Kerning
+@cindex ligatures and kerning
+@cindex kerning and ligatures
+
+Ligatures are groups of characters that are run together, i.e, producing
+a single glyph. For example, the letters `f' and `i' can form a
+ligature `fi' as in the word `file'. This produces a cleaner look
+(albeit subtle) to the printed output. Usually, ligatures are not
+available in fonts for TTY output devices.
+
+Most PostScript fonts support the fi and fl ligatures. The C/A/T
+typesetter that was the target of @acronym{AT&T} @code{troff} also
+supported `ff', `ffi', and `ffl' ligatures. Advanced typesetters or
+`expert' fonts may include ligatures for `ft' and `ct', although GNU
+@code{troff} does not support these (yet).
+
+Only the current font is checked for ligatures and kerns; neither
+special fonts nor special charcters defined with the @code{char} request
+(and its siblings) are taken into account.
+
+@DefreqList {lg, [@Var{flag}]}
+@DefregListEndx {.lg}
+@cindex activating ligatures (@code{lg})
+@cindex ligatures, activating (@code{lg})
+@cindex ligatures enabled register (@code{.lg})
+Switch the ligature mechanism on or off; if the parameter is non-zero or
+missing, ligatures are enabled, otherwise disabled. Default is on. The
+current ligature mode can be found in the read-only register @code{.lg}
+(set to 1 or@tie{}2 if ligatures are enabled, 0@tie{}otherwise).
+
+Setting the ligature mode to@tie{}2 enables the two-character ligatures
+(fi, fl, and ff) and disables the three-character ligatures (ffi and
+ffl).
+@endDefreq
+
+@dfn{Pairwise kerning} is another subtle typesetting mechanism that
+modifies the distance between a glyph pair to improve readability. In
+most cases (but not always) the distance is decreased.
+@iftex
+For example, compare the combination of the letters `V' and `A'. With
+kerning, `VA' is printed. Without kerning it appears as `V@w{}A'.
+@end iftex
+Typewriter-like fonts and fonts for terminals where all glyphs have the
+same width don't use kerning.
+
+@DefreqList {kern, [@Var{flag}]}
+@DefregListEndx {.kern}
+@cindex activating kerning (@code{kern})
+@cindex kerning, activating (@code{kern})
+@cindex kerning enabled register (@code{.kern})
+Switch kerning on or off. If the parameter is non-zero or missing,
+enable pairwise kerning, otherwise disable it. The read-only register
+@code{.kern} is set to@tie{}1 if pairwise kerning is enabled,
+0@tie{}otherwise.
+
+@cindex dummy character (@code{\&}), effect on kerning
+@cindex character, dummy (@code{\&}), effect on kerning
+If the font description file contains pairwise kerning information,
+glyphs from that font are kerned. Kerning between two glyphs can be
+inhibited by placing @code{\&} between them: @samp{V\&A}.
+
+@xref{Font Description File Format}.
+@endDefreq
+
+@cindex track kerning
+@cindex kerning, track
+@dfn{Track kerning} expands or reduces the space between glyphs. This
+can be handy, for example, if you need to squeeze a long word onto a
+single line or spread some text to fill a narrow column. It must be
+used with great care since it is usually considered bad typography if
+the reader notices the effect.
+
+@Defreq {tkf, f s1 n1 s2 n2}
+@cindex activating track kerning (@code{tkf})
+@cindex track kerning, activating (@code{tkf})
+Enable track kerning for font@tie{}@var{f}. If the current font
+is@tie{}@var{f} the width of every glyph is increased by an amount
+between @var{n1} and @var{n2} (@var{n1}, @var{n2} can be negative); if
+the current type size is less than or equal to @var{s1} the width is
+increased by @var{n1}; if it is greater than or equal to @var{s2} the
+width is increased by @var{n2}; if the type size is greater than or
+equal to @var{s1} and less than or equal to @var{s2} the increase in
+width is a linear function of the type size.
+
+The default scaling unit is @samp{z} for @var{s1} and @var{s2}, @samp{p}
+for @var{n1} and @var{n2}.
+
+The track kerning amount is added even to the rightmost glyph in a line;
+for large values it is thus recommended to increase the line length by
+the same amount to compensate.
+@endDefreq
+
+@c ---------------------------------------------------------------------
+
+@node Italic Corrections, Dummy Characters, Ligatures and Kerning, Using Fonts
+@subsection Italic Corrections
+
+When typesetting adjacent glyphs from typefaces of different slants, the
+space between them may require adjustment.
+
+@Defesc {\\/, , , }
+@cindex italic correction (@code{\/})
+@cindex correction, italic (@code{\/})
+@cindex correction between oblique and upright glyph (@code{\/}, @code{\,})
+@cindex roman glyph, correction after italic glyph (@code{\/})
+@cindex upright glyph, correction after oblique glyph (@code{\/})
+Apply an @dfn{italic correction}:@: modify the spacing of the preceding
+glyph so that the distance between it and the following glyph is correct
+if the latter is of upright shape. For example, if an
+italic@tie{}@samp{f} is followed immediately by a roman right
+parenthesis, then in many fonts the top right portion of
+the@tie{}@samp{f} overlaps the top left of the right parenthesis, which
+is ugly. Use this escape sequence whenever an oblique glyph is
+immediately followed by an upright glyph without any intervening space.
+@endDefesc
+
+@Defesc {\\\,, , , }
+@cindex left italic correction (@code{\,})
+@cindex correction, left italic (@code{\,})
+@cindex correction between upright and oblique glyph (@code{\/}, @code{\,})
+@cindex roman glyph, correction before italic glyph (@code{\,})
+@cindex upright glyph, correction before oblique glyph (@code{\,})
+Apply a @dfn{left italic correction}:@: modify the spacing of the
+following glyph so that the distance between it and the preceding
+glyph is correct if the latter is of upright shape. For example,
+if a roman left parenthesis is immediately followed by an
+italic@tie{}@samp{f}, then in many fonts the bottom left portion of
+the@tie{}@samp{f} overlaps the bottom of the left parenthesis, which is
+ugly. Use this escape sequence whenever an upright glyph is followed
+immediately by an oblique glyph without any intervening space.
+@endDefesc
+
+@c XXX: Can we move this node earlier in the text? Should it come
+@c before some of the dummy character's multifarious effects?
+@need 1000
+@node Dummy Characters, , Italic Corrections, Using Fonts
+@subsection Dummy Characters
+
+As discussed in @ref{Requests and Macros}, the first character on an
+input line is treated specially. Further, formatting a glyph has many
+consequences on formatter state (@pxref{Environments}). Occasionally,
+we want to escape this context or embrace some of those consequences
+without actually rendering a glyph to the output.
+
+@Defesc {\\&, , , }
+@cindex dummy character (@code{\&})
+@cindex character, dummy (@code{\&})
+Interpolate a dummy character, which is constitutive of output but
+invisible.@footnote{Opinions of this escape sequence's name abound.
+``Zero-width space'' is a popular misnomer:@: @code{roff} formatters do
+not treat it like a space. Ossanna called it a ``non-printing,
+zero-width character'', but the character causes @emph{output} even
+though it does not ``print''. If no output line is pending, the dummy
+character starts one. Contrast an empty input document with one
+containing only @code{\&}. The former produces no output; the latter, a
+blank page.} Its presence alters the interpretation context of a
+subsequent input character, and enjoys several applications.
+
+@itemize @bullet
+@item
+Prevent insertion of extra space after an end-of-sentence character.
+
+@Example
+Test.
+Test.
+ @result{} Test. Test.
+Test.\&
+Test.
+ @result{} Test. Test.
+@endExample
+
+@item
+Prevent recognition of a control character.
+
+@Example
+.Test
+ @error{} warning: macro 'Test' not defined
+\&.Test
+ @result{} .Test
+@endExample
+
+@item
+Prevent kerning between two glyphs.
+
+@iftex
+@c can't use @Example...@endExample here
+@example
+@group
+VA
+ @result{} @r{VA}
+V\&A
+ @result{} @r{V@w{}A}
+@end group
+@end example
+@end iftex
+
+@item
+Translate a character to ``nothing''.
+
+@Example
+.tr JIjiK\&k\&UVuv
+@c XXX: I might have the wrong noun declension in "university" here.
+Post universitum, alea jacta est, OK?
+ @result{} Post vniversitvm, alea iacta est, O?
+@endExample
+@end itemize
+
+The dummy character escape sequence sees use in macro definitions as a
+means of ensuring that arguments are treated as text even if they begin
+with spaces or control characters.
+
+@Example
+.de HD \" typeset a simple bold heading
+. sp
+. ft B
+\&\\$1 \" exercise: remove the \&
+. ft
+. sp
+..
+.HD .\|.\|.\|surprised?
+@endExample
+@endDefesc
+
+One way to think about the dummy character is to imagine placing the
+symbol @samp{&} in the input at a certain location; if doing so has all
+the side effects on formatting that you desire except for sticking an
+ugly ampersand in the midst of your text, the dummy character is what
+you want in its place.
+
+@c XXX: This feature seems nearly impossible to motivate. The _only_
+@c use of it in the groff source tree is for the mdoc package, for which
+@c it seems to be special pleading for that package's unique approach to
+@c macro argument reprocessing, which also involves an idiosyncratic
+@c approach to punctuation characters in macro argument lists.
+@Defesc {\\), , , }
+@cindex transparent dummy character (@code{\)})
+@cindex character, transparent dummy (@code{\)})
+@cindex dummy character, transparent (@code{\)})
+Interpolate a @slanted{transparent} dummy character---one that is
+transparent to end-of-sentence detection. It behaves as @code{\&},
+except that @code{\&} is treated as letters and numerals normally are
+after @samp{.}, @samp{?} and @samp{!}; @code{\&} cancels end-of-sentence
+detection, and @code{\)} does not.
+@c This feature seems too weak to me; see Savannah #60571. -- GBR
+
+@Example
+.de Suffix-&
+. nop \&\\$1
+..
+.
+.de Suffix-)
+. nop \)\\$1
+..
+.
+Here's a sentence.\c
+.Suffix-& '
+Another one.\c
+.Suffix-) '
+And a third.
+ @result{} Here's a sentence.' Another one.' And a third.
+@endExample
+@endDefesc
+
+
+@c =====================================================================
+
+@c TODO: Move the troff and nroff mode stuff here. Try to keep stuff
+@c that isn't ignored in nroff above this point, and stuff for
+@c typesetters below, until we hit the programming/advanced concepts.
+@c XXX: Thorny issue: nroff/terminal devices ignore type size but
+@c _honor_ vertical spacing (to within their crude vertical motion
+@c quanta).
+
+@need 2000
+@node Manipulating Type Size and Vertical Spacing, Colors, Using Fonts, GNU troff Reference
+@section Manipulating Type Size and Vertical Spacing
+@cindex manipulating type size and vertical spacing
+
+@cindex text baseline
+@cindex baseline, text
+@cindex type size
+@cindex size, size
+@cindex vertical spacing
+@cindex spacing, vertical
+These concepts were introduced in @ref{Page Geometry}. The height of a
+font's tallest glyph is one em, which is equal to the type size in
+points.@footnote{In text fonts, the tallest glyphs are typically
+parentheses. Unfortunately, in many cases the actual dimensions of the
+glyphs in a font do not closely match its declared type size! For
+example, in the standard PostScript font families, 10-point Times sets
+better with 9-point Helvetica and 11-point Courier than if all three
+were used at 10@tie{}points.} A vertical spacing of less than 120% of
+the type size can make a document hard to read. Larger proportions can
+be useful to spread the text for annotations or proofreader's marks. By
+default, GNU @code{troff} uses 10@tie{}point type on 12@tie{}point
+spacing.
+@cindex leading
+Typographers call the difference between type size and vertical spacing
+@dfn{leading}.@footnote{Rhyme with ``sledding''; mechanical typography
+used lead metal (Latin @emph{plumbum}).}
+
+@menu
+* Changing the Type Size::
+* Changing the Vertical Spacing::
+* Using Fractional Type Sizes::
+@end menu
+
+@c ---------------------------------------------------------------------
+
+@node Changing the Type Size, Changing the Vertical Spacing, Manipulating Type Size and Vertical Spacing, Manipulating Type Size and Vertical Spacing
+@subsection Changing the Type Size
+
+@DefreqList {ps, [@Var{size}]}
+@DefreqItem {ps, @t{+}@Var{size}}
+@DefreqItem {ps, @t{-}@Var{size}}
+@DefescItemx {\\s, , size, }
+@DefregListEndx {.s}
+@cindex changing type sizes (@code{ps}, @code{\s})
+@cindex type sizes, changing (@code{ps}, @code{\s})
+@cindex point sizes, changing (@code{ps}, @code{\s})
+Use the @code{ps} request or the @code{\s} escape sequence to change
+(increase, decrease) the type size (in scaled points). Specify
+@var{size} as either an absolute type size, or as a relative change from
+the current size. @code{ps} with no argument restores the previous
+size. The @code{ps} request's default scaling unit is @samp{z}. The
+requested size is rounded to the nearest valid size (with ties rounding
+down) within the limits supported by the device. If the requested size
+is non-positive, it is treated as 1@dmn{u}.
+
+@cindex CSTR@tie{}#54 errata
+@cindex CSTR@tie{}#54 erratum, @code{ps} request
+@cindex CSTR@tie{}#54 erratum, @code{\s} escape sequence
+Type size alteration is incorrectly documented in the @acronym{AT&T}
+@code{troff} manual, which claims ``if [the requested size] is invalid,
+the next larger valid size will result, with a maximum of
+36''.@footnote{The claim appears to have been true of Ossanna
+@code{troff} for the C/A/T device; Kernighan made device-independent
+@code{troff} more flexible.}
+
+@cindex type size registers (@code{.s}, @code{.ps})
+@cindex point size registers (@code{.s}, @code{.ps})
+The read-only string-valued register @code{.s} interpolates the type
+size in points as a decimal fraction; it is associated with the
+environment (@pxref{Environments}). To obtain the type size in scaled
+points, interpolate the @code{.ps} register instead (@pxref{Using
+Fractional Type Sizes}).
+
+The @code{\s} escape sequence supports a variety of syntax forms.
+
+@table @code
+@item \s@var{n}
+Set the type size to @var{n}@tie{}points. @var{n}@tie{}must be a single
+digit. If @var{n}@tie{}is 0, restore the previous size.
+
+@item \s+@var{n}
+@itemx \s-@var{n}
+Increase or decrease the type size by @var{n}@tie{}points.
+@var{n}@tie{}must be exactly one digit.
+
+@item \s(@var{nn}
+Set the type size to @var{nn}@tie{}points. @var{nn} must be exactly two
+digits.
+
+@item \s+(@var{nn}
+@itemx \s-(@var{nn}
+@itemx \s(+@var{nn}
+@itemx \s(-@var{nn}
+Alter the type size in points by the two-digit value @var{nn}.
+@end table
+
+@xref{Using Fractional Type Sizes}, for further syntactical forms of the
+@code{\s} escape sequence that additionally accept decimal fractions.
+
+@Example
+snap, snap,
+.ps +2
+grin, grin,
+.ps +2
+wink, wink, \s+2nudge, nudge,\s+8 say no more!
+.ps 10
+@endExample
+@endDefreq
+
+The @code{\s} escape sequence affects the environment immediately and
+doesn't produce an input token. Consequently, it can be used in
+requests like @code{mc}, which expects a single character as an
+argument, to change the type size on the fly.
+
+@Example
+.mc \s[20]x\s[0]
+@endExample
+
+@Defreq {sizes, s1 s2 @dots{} sn [@t{0}]}
+The @file{DESC} file specifies which type sizes are allowed by the
+output device; see @ref{DESC File Format}. Use the @code{sizes} request
+to change this set of permissible sizes. Arguments are in scaled
+points; see @ref{Using Fractional Type Sizes}. Each can be a single
+type size (such as @samp{12000}), or a range of sizes (such as
+@samp{4000-72000}). You can optionally end the list with a @samp{0}.
+@endDefreq
+
+@need 1000
+@node Changing the Vertical Spacing, Using Fractional Type Sizes, Changing the Type Size, Manipulating Type Size and Vertical Spacing
+@subsection Changing the Vertical Spacing
+
+@DefreqList {vs, [@Var{space}]}
+@DefreqItem {vs, @t{+}@Var{space}}
+@DefreqItem {vs, @t{-}@Var{space}}
+@DefregListEndx {.v}
+@cindex changing vertical line spacing (@code{vs})
+@cindex vertical line spacing, changing (@code{vs})
+@cindex vertical line spacing register (@code{.v})
+Set the vertical spacing to, or alter it by, @var{space}. The default
+scaling unit is @samp{p}. If @code{vs} is called without an argument,
+the vertical spacing is reset to the previous value before the last call
+to @code{vs}.
+@cindex @code{.V} register, and @code{vs}
+GNU @code{troff} emits a warning in category @samp{range} if @var{space}
+is negative; the vertical spacing is then set to the smallest possible
+positive value, the vertical motion quantum (as found in the @code{.V}
+register).
+
+@w{@samp{.vs 0}} isn't saved in a diversion since it doesn't result in
+a vertical motion. You must explicitly issue this request before
+interpolating the diversion.
+
+The read-only register @code{.v} contains the vertical spacing; it is
+associated with the environment (@pxref{Environments}).
+@endDefreq
+
+@cindex vertical line spacing, effective value
+@noindent
+When a break occurs, GNU @code{troff} performs the following procedure.
+
+@itemize @bullet
+@item
+@cindex extra pre-vertical line space (@code{\x})
+@cindex line space, extra pre-vertical (@code{\x})
+Move the drawing position vertically by the @dfn{extra pre-vertical line
+space}, the minimum of all negative @code{\x} escape sequence arguments
+in the pending output line.
+
+@item
+Move the drawing position vertically by the vertical line spacing.
+
+@item
+Write out the pending output line.
+
+@item
+@cindex extra post-vertical line space (@code{\x})
+@cindex line space, extra post-vertical (@code{\x})
+Move the drawing position vertically by the @dfn{extra post-vertical line
+space}, the maximum of all positive @code{\x} escape sequence arguments
+in the line that has just been output.
+
+@item
+@cindex post-vertical line spacing
+@cindex line spacing, post-vertical (@code{pvs})
+Move the drawing position vertically by the @dfn{post-vertical line
+spacing} (see below).
+@end itemize
+
+@cindex double-spacing (@code{vs}, @code{pvs})
+Prefer @code{vs} or @code{pvs} over @code{ls} to produce double-spaced
+documents. @code{vs} and @code{pvs} have finer granularity than
+@code{ls}; moreover, some preprocessors assume single spacing.
+@xref{Manipulating Spacing}, regarding the @code{\x} escape sequence and
+the @code{ls} request.
+
+@DefreqList {pvs, [@Var{space}]}
+@DefreqItem {pvs, @t{+}@Var{space}}
+@DefreqItem {pvs, @t{-}@Var{space}}
+@DefregListEndx {.pvs}
+@cindex @code{ls} request, alternative to (@code{pvs})
+@cindex post-vertical line spacing, changing (@code{pvs})
+@cindex post-vertical line spacing register (@code{.pvs})
+Set the post-vertical spacing to, or alter it by, @var{space}. The
+default scaling unit is @samp{p}. If @code{pvs} is called without an
+argument, the post-vertical spacing is reset to the previous value
+before the last call to @code{pvs}. GNU @code{troff} emits a warning in
+category @samp{range} if @var{space} is negative; the post-vertical
+spacing is then set to zero.
+
+The read-only register @code{.pvs} contains the post-vertical spacing;
+it is associated with the environment (@pxref{Environments}).
+@endDefreq
+
+@c ---------------------------------------------------------------------
+
+@c BEGIN Keep (roughly) parallel with subsection "Fractional type sizes
+@c and new scaling units" of groff_diff(7).
+@node Using Fractional Type Sizes, , Changing the Type Size, Manipulating Type Size and Vertical Spacing
+@subsection Using Fractional Type Sizes
+@cindex fractional type sizes
+@cindex fractional point sizes
+@cindex type sizes, fractional
+@cindex point sizes, fractional
+@cindex sizes, fractional type
+
+AT&T @code{troff} interpreted all type size measurements in points.
+Combined with integer arithmetic, this design choice made it impossible
+to support, for instance, ten and a half-point type. In GNU
+@code{troff}, an output device can select a scaling factor that
+subdivides a point into ``scaled points''. A type size expressed in
+scaled points can thus represent a non-integral type size.
+
+@cindex @code{s} scaling unit
+@cindex unit, scaling, @code{s}
+@cindex scaling unit @code{s}
+@cindex @code{z} scaling unit
+@cindex unit, scaling, @code{z}
+@cindex scaling unit @code{z}
+@cindex @code{ps} request, with fractional type sizes
+@cindex @code{cs} request, with fractional type sizes
+@cindex @code{tkf} request, with fractional type sizes
+@cindex @code{\H}, with fractional type sizes
+@cindex @code{\s}, with fractional type sizes
+A @dfn{scaled point} is equal to @math{1/@var{sizescale}} points, where
+@var{sizescale} is specified in the device description file @file{DESC},
+and defaults to@tie{}1.@footnote{@xref{Device and Font Description
+Files}.} Requests and escape sequences in GNU @code{troff} interpret
+arguments that represent a type size in scaled points, which the
+formatter multiplies by @var{sizescale} and converts to an integer.
+Arguments treated in this way comprise those to the escape sequences
+@code{\H} and @code{\s}, to the request @code{ps}, the third argument to
+the @code{cs} request, and the second and fourth arguments to the
+@code{tkf} request. Scaled points may be specified explicitly with the
+@code{z} scaling unit.
+
+For example, if @var{sizescale} is@tie{}1000, then a scaled point is one
+thousandth of a point. The request @samp{.ps 10.5} is synonymous with
+@samp{.ps 10.5z} and sets the type size to 10,500@tie{}scaled points, or
+10.5@tie{}points. Consequently, in GNU @code{troff}, the register
+@code{.s} can interpolate a non-integral type size.
+
+@Defreg {.ps}
+This read-only register interpolates the type size in scaled points; it
+is associated with the environment (@pxref{Environments}).
+@endDefreg
+
+It makes no sense to use the @samp{z} scaling unit in a numeric
+expression whose default scaling unit is neither @samp{u} nor @samp{z},
+so GNU @code{troff} disallows this. Similarly, it is nonsensical to use
+a scaling unit other than @samp{z} or @samp{u} in a numeric expression
+whose default scaling unit is @samp{z}, and so GNU @code{troff}
+disallows this as well.
+
+Another GNU @code{troff} scaling unit, @samp{s}, multiplies by the
+number of basic units in a scaled point. Thus, @samp{\n[.ps]s} is equal
+to @samp{1m} by definition. Do not confuse the @samp{s} and @samp{z}
+scaling units.
+@c END Keep (roughly) parallel with subsection "Fractional type sizes
+@c and new scaling units" of groff_diff(7).
+
+@DefregList {.psr}
+@DefregListEndx {.sr}
+@cindex last-requested type size registers (@code{.psr}, @code{.sr})
+@cindex type size registers, last-requested (@code{.psr}, @code{.sr})
+@cindex last-requested point size registers (@code{.psr}, @code{.sr})
+@cindex point size registers, last-requested (@code{.psr}, @code{.sr})
+@cindex @code{.ps} register, in comparison with @code{.psr}
+@cindex @code{.s} register, in comparison with @code{.sr}
+Output devices may be limited in the type sizes they can employ. The
+@code{.s} and @code{.ps} registers represent the type size selected by
+the output driver as it understands a device's capability. The last
+@emph{requested} type size is interpolated in scaled points by the
+read-only register @code{.psr} and in points as a decimal fraction by
+the read-only string-valued register @code{.sr}. Both are associated
+with the environment (@pxref{Environments}).
+
+For example, if a type size of 10.95 points is requested, and the
+nearest size permitted by a @code{sizes} request (or by the @code{sizes}
+or @code{sizescale} directives in the device's @file{DESC} file) is 11
+points, the output driver uses the latter value.
+@endDefreg
+
+The @code{\s} escape sequence offers the following syntax forms that
+work with fractional type sizes and accept scaling units. You may of
+course give them integral arguments. The delimited forms need not use
+the neutral apostrophe; see @ref{Delimiters}.
+
+@table @code
+@item \s[@var{n}]
+@itemx \s'@var{n}'
+Set the type size to @var{n}@tie{}scaled points; @var{n}@tie{}is a
+numeric expression with a default scaling unit of @samp{z}.
+
+@item \s[+@var{n}]
+@itemx \s[-@var{n}]
+@itemx \s+[@var{n}]
+@itemx \s-[@var{n}]
+@itemx \s'+@var{n}'
+@itemx \s'-@var{n}'
+@itemx \s+'@var{n}'
+@itemx \s-'@var{n}'
+Increase or decrease the type size by @var{n}@tie{}scaled points;
+@var{n}@tie{}is a numeric expression (which may start with a minus sign)
+with a default scaling unit of @samp{z}.
+@end table
+
+
+@c =====================================================================
+
+@c BEGIN Keep (roughly) parallel with section "Colors" of groff(7).
+@node Colors, Strings, Manipulating Type Size and Vertical Spacing, GNU troff Reference
+@section Colors
+@cindex colors
+
+@cindex stroke color
+@cindex color, stroke
+@cindex fill color
+@cindex color, fill
+GNU @code{troff} supports color output with a variety of color spaces
+and up to 16 bits per channel. Some devices, particularly terminals,
+may be more limited. When color support is enabled, two colors are
+current at any given time: the @dfn{stroke color}, with which glyphs,
+rules (lines), and geometric objects like circles and polygons are
+drawn, and the @dfn{fill color}, which can be used to paint the interior
+of a closed geometric figure.
+
+@DefreqList {color, [@Var{n}]}
+@DefregListEndx {.color}
+If @var{n} is missing or non-zero, enable the output of color-related
+device-independent output commands (this is the default); otherwise,
+disable them. This request sets a global flag; it does not produce an
+input token (@pxref{Gtroff Internals}).
+
+The read-only register @code{.color} is@tie{}1 if colors are enabled,
+0@tie{}otherwise.
+
+Color can also be disabled with the @option{-c} command-line option.
+@endDefreq
+
+@Defreq {defcolor, ident scheme color-component @dots{}}
+Define a color named @var{ident}. @var{scheme} selects a color space
+and determines the quantity of required @var{color-component}s; it must
+be one of @samp{rgb} (three components), @samp{cmy} (three), @samp{cmyk}
+(four), or @samp{gray} (one). @samp{grey} is accepted as a synonym of
+@samp{gray}. The color components can be encoded as a single
+hexadecimal value starting with @samp{#} or @samp{##}. The former
+indicates that each component is in the range 0--255 (0--FF), the latter
+the range 0--65,535 (0--FFFF).
+
+@Example
+.defcolor half gray #7f
+.defcolor pink rgb #FFC0CB
+.defcolor magenta rgb ##ffff0000ffff
+@endExample
+
+@cindex @code{f} scaling unit
+@cindex unit, scaling, @code{f}
+@cindex scaling unit @code{f}
+Alternatively, each color component can be specified as a decimal
+fraction in the range 0--1, interpreted using a default scaling
+unit of@tie{}@code{f}, which multiplies its value by 65,536 (but
+clamps it at 65,535).
+
+@Example
+.defcolor gray50 rgb 0.5 0.5 0.5
+.defcolor darkgreen rgb 0.1f 0.5f 0.2f
+@endExample
+@endDefreq
+
+@cindex default color
+@cindex color, default
+Each output device has a color named @samp{default}, which cannot be
+redefined. A device's default stroke and fill colors are not
+necessarily the same. For the @code{dvi}, @code{html}, @code{pdf},
+@code{ps}, and @code{xhtml} output devices, GNU @code{troff}
+automatically loads a macro file defining many color names at startup.
+By the same mechanism, the devices supported by @code{grotty} recognize
+the eight standard ISO@tie{}6429/EMCA-48 color names.@footnote{also
+known vulgarly as ``ANSI colors''}
+
+@DefreqList {gcolor, [@Var{color}]}
+@DefescItemx {\\m, , c, }
+@DefescItem {\\m, (, co, }
+@DefescItem {\\m, [, color, ]}
+@DefregListEndx {.m}
+Set the stroke color to @var{color}.
+
+@Example
+.gcolor red
+The next words
+.gcolor
+\m[red]are in red\m[]
+and these words are in the previous color.
+@endExample
+
+The escape sequence @code{\m[]} restores the previous stroke color, as
+does a @code{gcolor} request without an argument.
+
+@cindex stroke color name register (@code{.m})
+@cindex name, stroke color, register (@code{.m})
+@cindex color name, stroke, register (@code{.m})
+The name of the current stroke color is available in the read-only
+string-valued register @samp{.m}; it is associated with the environment
+(@pxref{Environments}). It interpolates nothing when the stroke color
+is the default.
+
+@code{\m} doesn't produce an input token in GNU @code{troff}
+(@pxref{Gtroff Internals}). It therefore can be used in requests like
+@code{mc} (which expects a single character as an argument) to change
+the color on the fly:
+
+@Example
+.mc \m[red]x\m[]
+@endExample
+@endDefesc
+
+@DefreqList {fcolor, [@Var{color}]}
+@DefescItemx {\\M, , c, }
+@DefescItem {\\M, (, co, }
+@DefescItem {\\M, [, color, ]}
+@DefregListEndx {.M}
+Set the fill color for objects drawn with @code{\D'@dots{}'} escape
+sequences. The escape sequence @code{\M[]} restores the previous fill
+color, as does an @code{fcolor} request without an argument.
+
+@cindex background color name register (@code{.M})
+@cindex name, background color, register (@code{.M})
+@cindex color name, background, register (@code{.M})
+@cindex fill color name register (@code{.M})
+@cindex name, fill color, register (@code{.M})
+@cindex color name, fill, register (@code{.M})
+The name of the current fill color is available in the read-only
+string-valued register @samp{.M}; it is associated with the environment
+(@pxref{Environments}). It interpolates nothing when the fill color
+is the default. @code{\M} doesn't produce an input token in GNU
+@code{troff}.
+
+Create an ellipse with a red interior as follows.
+
+@Example
+\M[red]\h'0.5i'\D'E 2i 1i'\M[]
+@endExample
+@endDefesc
+@c END Keep (roughly) parallel with section "Colors" of groff(7).
+
+
+@c =====================================================================
+
+@c BEGIN Keep (roughly) parallel with section "Strings" of groff(7).
+@node Strings, Conditionals and Loops, Colors, GNU troff Reference
+@section Strings
+@cindex strings
+
+GNU @code{troff} supports strings primarily for user convenience.
+Conventionally, if one would define a macro only to interpolate a small
+amount of text, without invoking requests or calling any other macros,
+one defines a string instead. Only one string is predefined by the
+language.
+
+@Defstr {.T}
+@stindex .T
+@cindex output device name string (@code{.T})
+Contains the name of the output device (for example, @samp{utf8} or
+@samp{pdf}).
+@endDefmpstr
+
+The @code{ds} request creates a string with a specified name and
+contents and the @code{\*} escape sequence dereferences its name,
+interpolating its contents. If the string named by the @code{\*} escape
+sequence does not exist, it is defined as empty, nothing is
+interpolated, and a warning in category @samp{mac} is emitted.
+@xref{Warnings}, for information about the enablement and suppression of
+warnings.
+
+@DefreqList {ds, name [@Var{contents}]}
+@DefreqItemx {ds1, name [@Var{contents}]}
+@DefescItemx {\\*, , n, }
+@DefescItem {\\*, (, nm, }
+@c XXX: Can't mark the parameters with @Var because @Var gets called
+@c recursively if we do.
+@c @DefescListEnd {\\*, [, name [@Var{arg1} @Var{arg2} @dots{}], ]}
+@DefescListEnd {\\*, [, name @sansserif{[}arg1 arg2 @dots{}@sansserif{]}, ]}
+@cindex string interpolation (@code{\*})
+@cindex string expansion (@code{\*})
+@cindex interpolation of strings (@code{\*})
+@cindex expansion of strings (@code{\*})
+@cindex string arguments
+@cindex arguments, to strings
+Define a string called @var{name} with contents @var{contents}. If
+@var{name} already exists as an alias, the target of the alias is
+redefined; see @code{als} and @code{rm} below. If @code{ds} is called
+with only one argument, @var{name} is defined as an empty string.
+Otherwise, GNU @code{troff} stores @var{contents} in copy
+mode.@footnote{@xref{Copy Mode}.}
+
+The @code{\*} escape sequence interpolates a previously defined string
+variable @var{name} (one-character name@tie{}@var{n}, two-character name
+@var{nm}). The bracketed interpolation form accepts arguments that are
+handled as macro arguments are; recall @ref{Calling Macros}. In
+contrast to macro calls, however, if a closing bracket @samp{]} occurs
+in a string argument, that argument must be enclosed in double quotes.
+@code{\*} is interpreted even in copy mode. When defining strings,
+argument interpolations must be escaped if they are to reference
+parameters from the calling context; @xref{Parameters}.
+
+@Example
+.ds cite (\\$1, \\$2)
+Gray codes are explored in \*[cite Morgan 1998].
+ @result{} Gray codes are explored in (Morgan, 1998).
+@endExample
+
+@c TODO: Consider examples of recursive string calls, particularly where
+@c one interpolation is constructed from the argument of an enclosing
+@c macro, to illustrate ".ds a \$1 \\$1".
+@c
+@c @Example
+@c .ds a \\$1 wildebeest
+@c .ds b big, \*[a hairy]
+@c I see a \*[b].
+@c @result{} I see a big, hairy wildebeest.
+@c @endExample
+
+@cindex trailing spaces in string definitions and appendments
+@cindex comments, with @code{ds}
+@cindex @code{ds} request, and comments
+@strong{Caution:@:} Unlike other requests, the second argument to the
+@code{ds} request consumes the remainder of the input line, including
+trailing spaces. This means that comments on a line with such a request
+can introduce unwanted space into a string when they are set off from
+the material they annotate, as is conventional.
+
+@Example
+.ds H2O H\v'+.3m'\s'-2'2\v'-.3m'\s0O \" water
+@endExample
+
+@noindent
+Instead, place the comment on another line or put the comment escape
+sequence immediately adjacent to the last character of the string.
+
+@Example
+.ds H2O H\v'+.3m'\s'-2'2\v'-.3m'\s0O\" water
+@endExample
+
+Ending string definitions (and appendments) with a comment, even an
+empty one, prevents unwanted space from creeping into them during source
+document maintenance.
+
+@Example
+.ds author Alice Pleasance Liddell\"
+.ds empty \" might be appended to later with .as
+@endExample
+
+@cindex trailing double quotes in strings
+@cindex double quotes, trailing, in strings
+@cindex @code{ds} request, and double quotes
+@cindex leading spaces with @code{ds}
+@cindex spaces with @code{ds}
+@cindex @code{ds} request, and leading spaces
+An initial neutral double quote @code{"} in @var{contents} is stripped
+to allow embedding of leading spaces. Any other @code{"} is interpreted
+literally, but it is wise to use the special character escape sequence
+@code{\[dq]} instead if the string might be interpolated as part of a
+macro argument; see @ref{Calling Macros}.
+
+@c Examples should be more accessible than Unix nerd stuff like this,
+@c but in general document authors shouldn't want to use "straight"
+@c double quotes for ordinary prose anyway. Also, 56 chars is as fat
+@c as these examples can get and not overrun the right margin in PDF.
+@Example
+.ds salutation " Yours in a white wine sauce,\"
+.ds c-var-defn " char mydate[]=\[dq]2020-07-29\[dq];\"
+@endExample
+
+@cindex multi-line strings
+@cindex strings, multi-line
+@cindex newline character, in strings, escaping
+@cindex escaping newline characters, in strings
+Strings are not limited to a single input line of text.
+@code{\@key{RET}} works just as it does elsewhere. The resulting string
+is stored @emph{without} the newlines. Care is therefore required when
+interpolating strings while filling is disabled.
+
+@Example
+.ds foo This string contains \
+text on multiple lines \
+of input.
+@endExample
+
+It is not possible to embed a newline in a string that will be
+interpreted as such when the string is interpolated. To achieve that
+effect, use @code{\*} to interpolate a macro instead; see @ref{Punning
+Names}.
+
+Because strings are similar to macros, they too can be defined so as to
+suppress AT&T @code{troff} compatibility mode when used; see
+@ref{Writing Macros} and @ref{Compatibility Mode}. The @code{ds1}
+request defines a string such that compatibility mode is off when the
+string is later interpolated. To be more precise, a @dfn{compatibility
+save} input token is inserted at the beginning of the string, and a
+@dfn{compatibility restore} input token at the end.
+
+@Example
+.nr xxx 12345
+.ds aa The value of xxx is \\n[xxx].
+.ds1 bb The value of xxx is \\n[xxx].
+.
+.cp 1
+.
+\*(aa
+ @error{} warning: register '[' not defined
+ @result{} The value of xxx is 0xxx].
+\*(bb
+ @result{} The value of xxx is 12345.
+@endExample
+@endDefreq
+
+@DefreqList {as, name [@Var{contents}]}
+@DefreqListEndx {as1, name [@Var{contents}]}
+@cindex appending to a string (@code{as})
+@cindex string, appending (@code{as})
+The @code{as} request is similar to @code{ds} but appends @var{contents}
+to the string stored as @var{name} instead of redefining it. If
+@var{name} doesn't exist yet, it is created. If @code{as} is called
+with only one argument, no operation is performed (beyond dereferencing
+the string).
+
+@Example
+.as salutation " with shallots, onions and garlic,\"
+@endExample
+
+The @code{as1} request is similar to @code{as}, but compatibility mode
+is switched off when the appended portion of the string is later
+interpolated. To be more precise, a @dfn{compatibility save} input
+token is inserted at the beginning of the appended string, and a
+@dfn{compatibility restore} input token at the end.
+@endDefreq
+
+Several requests exist to perform rudimentary string operations.
+Strings can be queried (@code{length}) and modified (@code{chop},
+@code{substring}, @code{stringup}, @code{stringdown}), and their names
+can be manipulated through renaming, removal, and aliasing (@code{rn},
+@code{rm}, @code{als}).
+
+@Defreq {length, reg anything}
+@cindex length of a string (@code{length})
+@cindex string, length of (@code{length})
+@cindex @code{length} request, and copy mode
+@cindex copy mode, and @code{length} request
+@cindex mode, copy, and @code{length} request
+Compute the number of characters of @var{anything} and store the count
+in the register @var{reg}. If @var{reg} doesn't exist, it is created.
+@var{anything} is read in copy mode.
+
+@Example
+.ds xxx abcd\h'3i'efgh
+.length yyy \*[xxx]
+\n[yyy]
+ @result{} 14
+@endExample
+@endDefreq
+
+@Defreq {chop, object}
+Remove the last character from the macro, string, or diversion named
+@var{object}. This is useful for removing the newline from the end of a
+diversion that is to be interpolated as a string. This request can be
+used repeatedly on the same @var{object}; see @ref{Gtroff Internals},
+for details on nodes inserted additionally by GNU @code{troff}.
+@endDefreq
+
+@Defreq {substring, str start [@Var{end}]}
+@cindex substring (@code{substring})
+Replace the string named @var{str} with its substring bounded by the
+indices @var{start} and @var{end}, inclusively. The first character in
+the string has index@tie{}0. If @var{end} is omitted, it is implicitly
+set to the largest valid value (the string length minus one). Negative
+indices count backward from the end of the string:@: the last character
+has index@tie{}@minus{}1, the character before the last has
+index@tie{}@minus{}2, and so on.
+
+@Example
+.ds xxx abcdefgh
+.substring xxx 1 -4
+\*[xxx]
+ @result{} bcde
+.substring xxx 2
+\*[xxx]
+ @result{} de
+@endExample
+@endDefreq
+
+@DefreqList {stringdown, str}
+@DefreqListEndx {stringup, str}
+@cindex case-transforming a string (@code{stringdown}, @code{stringup})
+@cindex uppercasing a string (@code{stringup})
+@cindex lowercasing a string (@code{stringdown})
+@cindex up-casing a string (@code{stringup})
+@cindex down-casing a string (@code{stringdown})
+Alter the string named @var{str} by replacing each of its bytes with its
+lowercase (@code{stringdown}) or uppercase (@code{stringup}) version (if
+one exists). Special characters in the string will often transform in
+the expected way due to the regular naming convention for accented
+characters. When they do not, use substrings and/or catenation.
+
+@Example
+.ds resume R\['e]sum\['e]
+\*[resume]
+.stringdown resume
+\*[resume]
+.stringup resume
+\*[resume]
+ @result{} Résumé résumé RÉSUMÉ
+@endExample
+@endDefreq
+
+(In practice, we would end the @code{ds} request with a comment escape
+@code{\"} to prevent space from creeping into the definition during
+source document maintenance.)
+
+@Defreq {rn, old new}
+@cindex renaming request (@code{rn})
+@cindex request, renaming (@code{rn})
+@cindex renaming macro (@code{rn})
+@cindex macro, renaming (@code{rn})
+@cindex renaming string (@code{rn})
+@cindex string, renaming (@code{rn})
+@cindex renaming diversion (@code{rn})
+@cindex diversion, renaming (@code{rn})
+Rename the request, macro, diversion, or string @var{old} to @var{new}.
+@endDefreq
+
+@Defreq {rm, name}
+@cindex removing request (@code{rm})
+@cindex request, removing (@code{rm})
+@cindex removing macro (@code{rm})
+@cindex macro, removing (@code{rm})
+@cindex removing string (@code{rm})
+@cindex string, removing (@code{rm})
+@cindex removing diversion (@code{rm})
+@cindex diversion, removing (@code{rm})
+Remove the request, macro, diversion, or string @var{name}. GNU
+@code{troff} treats subsequent invocations as if the name had never
+been defined.
+@endDefreq
+
+@anchor{als}
+@Defreq {als, new old}
+@cindex alias, string, creating (@code{als})
+@cindex alias, macro, creating (@code{als})
+@cindex alias, diversion, creating (@code{als})
+@cindex creating alias, for string (@code{als})
+@cindex creating alias, for macro (@code{als})
+@cindex creating alias, for diversion (@code{als})
+@cindex string, creating alias for (@code{als})
+@cindex macro, creating alias for (@code{als})
+@cindex diversion, creating alias for (@code{als})
+Create an alias @var{new} for the existing request, string, macro, or
+diversion object named @var{old}, causing the names to refer to the same
+stored object. If @var{old} is undefined, a warning in category
+@samp{mac} is produced, and the request is ignored. @xref{Warnings},
+for information about the enablement and suppression of warnings.
+
+To understand how the @code{als} request works, consider two different
+storage pools:@: one for objects (macros, strings, etc.), and another
+for names. As soon as an object is defined, GNU @code{troff} adds it to
+the object pool, adds its name to the name pool, and creates a link
+between them. When @code{als} creates an alias, it adds a new name to
+the name pool that gets linked to the same object as the old name.
+
+Now consider this example.
+
+@Example
+.de foo
+..
+.
+.als bar foo
+.
+.de bar
+. foo
+..
+.
+.bar
+ @error{} input stack limit exceeded (probable infinite
+ @error{} loop)
+@endExample
+
+@noindent
+In the above, @code{bar} remains an @emph{alias}---another name
+for---the object referred to by @code{foo}, which the second @code{de}
+request replaces. Alternatively, imagine that the @code{de} request
+@emph{dereferences} its argument before replacing it. Either way, the
+result of calling @code{bar} is a recursive loop that finally leads to
+an error. @xref{Writing Macros}.
+
+@cindex alias, string, removing (@code{rm})
+@cindex alias, macro, removing (@code{rm})
+@cindex alias, diversion, removing (@code{rm})
+@cindex removing alias, for string (@code{rm})
+@cindex removing alias, for macro (@code{rm})
+@cindex removing alias, for diversion (@code{rm})
+@cindex string, removing alias for (@code{rm})
+@cindex macro, removing alias for (@code{rm})
+@cindex diversion, removing alias for (@code{rm})
+To remove an alias, call @code{rm} on its name. The object itself is
+not destroyed until it has no more names.
+
+When a request, macro, string, or diversion is aliased, redefinitions
+and appendments ``write through'' alias names. To replace an alias with
+a separately defined object, you must use the @code{rm} request on its
+name first.
+@endDefreq
+@c END Keep (roughly) parallel with section "Strings" of groff(7).
+
+
+@c =====================================================================
+
+@node Conditionals and Loops, Writing Macros, Strings, GNU troff Reference
+@section Conditionals and Loops
+@cindex conditionals and loops
+@cindex loops and conditionals
+
+@code{groff} has @code{if} and @code{while} control structures like
+other languages. However, the syntax for grouping multiple input lines
+in the branches or bodies of these structures is unusual.
+
+@menu
+* Operators in Conditionals::
+* if-then::
+* if-else::
+* Conditional Blocks::
+* while::
+@end menu
+
+@c ---------------------------------------------------------------------
+
+@c BEGIN Keep (roughly) parallel with subsection "Conditional
+@c expressions" of groff(7).
+@node Operators in Conditionals, if-then, Conditionals and Loops, Conditionals and Loops
+@subsection Operators in Conditionals
+
+@cindex @code{if} request, operators to use with
+@cindex @code{ie} request, operators to use with
+@cindex @code{while} request, operators to use with
+@cindex conditional expressions
+@cindex expressions, conditional
+In @code{if}, @code{ie}, and @code{while} requests, in addition to the
+numeric expressions described in @ref{Numeric Expressions}, several
+Boolean operators are available; the members of this expanded class are
+termed @dfn{conditional expressions}.
+
+@table @code
+@item c @var{glyph}
+True if @var{glyph} is available, where @var{glyph} is an ordinary
+character, a special character @samp{\(@var{xx}} or @samp{\[@var{xxx}]},
+@samp{\N'@var{xxx}'}, or has been defined by any of the @code{char},
+@code{fchar}, @code{fschar}, or @code{schar} requests.
+
+@item d @var{name}
+True if a string, macro, diversion, or request called @var{name} exists.
+
+@item e
+True if the current page is even-numbered.
+
+@item F @var{font}
+True if @var{font} exists. @var{font} is handled as if it were opened
+with the @code{ft} request (that is, font translation and styles are
+applied), without actually mounting it.
+
+@item m @var{color}
+True if @var{color} is defined.
+
+@item n
+@cindex conditional output for terminal (TTY)
+@cindex TTY, conditional output for
+@cindex terminal, conditional output for
+True if the document is being processed in @code{nroff} mode.
+@xref{@code{troff} and @code{nroff} Modes}.
+
+@item o
+True if the current page is odd-numbered.
+
+@item r @var{register}
+True if @var{register} exists.
+
+@item S @var{style}
+True if @var{style} is available for the current font family. Font
+translation is applied.
+
+@item t
+True if the document is being processed in @code{troff} mode.
+@xref{@code{troff} and @code{nroff} Modes}.
+
+@pindex vtroff
+@item v
+Always false. This condition is recognized only for compatibility with
+certain other @code{troff} implementations.@footnote{This refers to
+@code{vtroff}, a translator that would convert the C/A/T output from
+early-vintage @acronym{AT&T} @code{troff} to a form suitable for
+Versatec and Benson-Varian plotters.}
+@end table
+
+If the first argument to an @code{if}, @code{ie}, or @code{while}
+request begins with a non-alphanumeric character apart from @code{!}
+(see below); it performs an @slanted{output comparison test}.
+@footnote{Strictly, letters not otherwise recognized @emph{are} treated
+as output comparison delimiters. For portability, it is wise to avoid
+using letters not in the list above; for example, Plan@tie{}9
+@code{troff} uses @samp{h} to test a mode it calls @code{htmlroff}, and
+GNU @code{troff} may provide additional operators in the future.}
+
+@cindex output comparison operator
+@table @code
+@item @code{'}@var{xxx}@code{'}@var{yyy}@code{'}
+True if formatting the comparands @var{xxx} and @var{yyy} produces the
+same output commands. The delimiter need not be a neutral apostrophe:
+the output comparison operator accepts the same delimiters as most
+escape sequences; see @ref{Delimiters}. This @dfn{output comparison
+operator} formats @var{xxx} and @var{yyy} in separate environments;
+after the comparison, the resulting data are discarded.
+
+@Example
+.ie "|"\fR|\fP" true
+.el false
+ @result{} true
+@endExample
+
+@noindent
+The resulting glyph properties, including font family, style, size, and
+slant, must match, but not necessarily the requests and/or escape
+sequences used to obtain them. In the previous example, @samp{|} and
+@samp{\fR|\fP} result in @samp{|} glyphs in the same typefaces at the
+same positions, so the comparands are equal. If @samp{.ft@tie{}I} had
+been added before the @samp{.ie}, they would differ: the first @samp{|}
+would produce an italic @samp{|}, not a roman one. Motions must match
+in orientation and magnitude to within the applicable horizontal and
+vertical motion quanta of the device, after rounding. @samp{.if
+"\u\d"\v'0'"} is false even though both comparands result in zero net
+motion, because motions are not interpreted or optimized but sent as-is
+to the output.@footnote{Because formatting of the comparands takes place
+in a dummy environment, vertical motions within them cannot spring
+traps.} On the other hand, @samp{.if "\d"\v'0.5m'"} is true, because
+@code{\d} is defined as a downward motion of one-half em.@footnote{All
+of this is to say that the lists of output nodes created by formatting
+@var{xxx} and @var{yyy} must be identical. @xref{Gtroff Internals}.}
+
+@cindex string comparison
+@cindex comparison of strings
+Surround the comparands with @code{\?} to avoid formatting them; this
+causes them to be compared character by character, as with string
+comparisons in other programming languages.
+
+@Example
+.ie "\?|\?"\?\fR|\fP\?" true
+.el false
+ @result{} false
+@endExample
+
+@cindex @code{\?}, and copy mode
+@cindex copy mode, and @code{\?}
+@cindex mode, copy, and @code{\?}
+@noindent
+Since comparands protected with @code{\?} are read in copy mode
+(@pxref{Copy Mode}), they need not even be valid @code{groff} syntax.
+The escape character is still lexically recognized, however, and
+consumes the next character.
+
+@Example
+.ds a \[
+.ds b \[
+.if '\?\*a\?'\?\*b\?' a and b equivalent
+.if '\?\\?'\?\\?' backslashes equivalent
+ @result{} a and b equivalent
+@c slack lines for pagination control
+@c @error{} warning: missing closing delimiter in
+@c @error{} conditional expression (got newline)
+@endExample
+@end table
+
+The above operators can't be combined with most others, but a leading
+@samp{!}, not followed immediately by spaces or tabs, complements an
+expression.
+
+@Example
+.nr x 1
+.ie !r x register x is not defined
+.el register x is defined
+ @result{} register x is defined
+@endExample
+
+Spaces and tabs are optional immediately after the @samp{c}, @samp{d},
+@samp{F}, @samp{m}, @samp{r}, and @samp{S} operators, but right after
+@samp{!}, they end the predicate and the conditional evaluates
+true.@footnote{This bizarre behavior maintains compatibility with
+@acronym{AT&T} @code{troff}.}
+
+@Example
+.nr x 1
+.ie ! r x register x is not defined
+.el register x is defined
+ @result{} r x register x is not defined
+@endExample
+
+@noindent
+The unexpected @samp{r x} in the output is a clue that our conditional
+was not interpreted as we planned, but matters may not always be so
+obvious.
+@c END Keep (roughly) parallel with subsection "Conditional expressions"
+@c of groff(7).
+
+@c ---------------------------------------------------------------------
+
+@node if-then, if-else, Operators in Conditionals, Conditionals and Loops
+@subsection if-then
+@cindex if-then
+
+@Defreq {if, cond-expr anything}
+Evaluate the conditional expression @var{cond-expr}, and if it evaluates
+true (or to a positive value), interpret the remainder of the line
+@var{anything} as if it were an input line. Recall from @ref{Invoking
+Requests} that any quantity of spaces between arguments to requests
+serves only to separate them; leading spaces in @var{anything} are thus
+not seen. @var{anything} effectively @emph{cannot} be omitted; if
+@var{cond-expr} is true and @var{anything} is empty, the newline at the
+end of the control line is interpreted as a blank input line (and
+therefore a blank text line).
+
+@Example
+super\c
+tanker
+.nr force-word-break 1
+super\c
+.if ((\n[force-word-break] = 1) & \n[.int])
+tanker
+ @result{} supertanker super tanker
+@endExample
+@endDefreq
+
+@Defreq {nop, anything}
+Interpret @var{anything} as if it were an input line. This is similar
+to @samp{.if@tie{}1}. @code{nop} is not really ``no operation''; its
+argument @emph{is} processed---unconditionally. It can be used to cause
+text lines to share indentation with surrounding control lines.
+
+@Example
+.als real-MAC MAC
+.de wrapped-MAC
+. tm MAC: called with arguments \\$@@
+. nop \\*[real-MAC]\\
+..
+.als MAC wrapped-MAC
+\# Later...
+.als MAC real-MAC
+@endExample
+
+In the above, we've used aliasing, @code{nop}, and the interpolation of
+a macro as a string to interpose a wrapper around the macro @samp{MAC}
+(perhaps to debug it).
+@endDefreq
+
+@c ---------------------------------------------------------------------
+
+@node if-else, while, Operators in Conditionals, Conditionals and Loops
+@subsection if-else
+@cindex if-else
+
+@DefreqList {ie, cond-expr anything}
+@DefreqListEndx {el, anything}
+Use the @code{ie} and @code{el} requests to write an if-then-else. The
+first request is the ``if'' part and the latter is the ``else'' part.
+Unusually among programming languages, any number of non-conditional
+requests may be interposed between the @code{ie} branch and the
+@code{el} branch.
+
+@Example
+.nr a 0
+.ie \na a is non-zero.
+.nr a +1
+.el a was not positive but is now \na.
+ @result{} a was not positive but is now 1.
+@endExample
+
+Another way in which @code{el} is an ordinary request is that it does
+not lexically ``bind'' more tightly to its @code{ie} counterpart than it
+does to any other request. This fact can surprise C programmers.
+
+@Example
+.nr a 1
+.nr z 0
+.ie \nz \
+. ie \na a is true
+. el a is false
+.el z is false
+ @error{} warning: unbalanced 'el' request
+ @result{} a is false
+@endExample
+
+@c Turn the following into a proper @{x,}ref if the conditional blocks
+@c node is relocated elsewhere--but consider if it is wise to do so.
+To conveniently nest conditionals, keep reading.
+
+@endDefreq
+
+@c ---------------------------------------------------------------------
+
+@node Conditional Blocks, while, Operators in Conditionals, Conditionals and Loops
+@subsection Conditional Blocks
+@cindex conditional blocks
+@cindex blocks, conditional
+
+It is frequently desirable for a control structure to govern more than
+one request, macro call, text line, or a combination of the foregoing.
+The opening and closing brace escape sequences @code{\@{} and @code{\@}}
+define such groups. These @dfn{conditional blocks} can furthermore be
+nested.
+
+@DefescList {\@\{, , , }
+@DefescListEnd {\@\}, , , }
+@esindex \@{
+@esindex \@}
+@cindex beginning of conditional block (@code{\@{})
+@cindex end of conditional block (@code{\@}})
+@cindex conditional block, beginning (@code{\@{})
+@cindex conditional block, end (@code{\@}})
+@cindex block, conditional, beginning (@code{\@{})
+@cindex block, conditional, end (@code{\@}})
+@cindex brace escape sequences (@code{\@{}, @code{\@}})
+@cindex escape sequences, brace (@code{\@{}, @code{\@}})
+@cindex opening brace escape sequence (@code{\@}})
+@cindex closing brace escape sequence (@code{\@})}
+@cindex brace escape sequence, opening (@code{\@})}
+@cindex brace escape sequence, closing (@code{\@})}
+@code{\@{} begins a conditional block; it must appear (after optional
+spaces and tabs) immediately subsequent to the conditional expression of
+an @code{if}, @code{ie}, or @code{while}
+request,@footnote{@xref{while}.} or as the argument to an @code{el}
+request.
+
+@code{\@}} ends a condition block and should appear on a line with other
+occurrences of itself as necessary to match @code{\@{} sequences. It
+can be preceded by a control character, spaces, and tabs. Input after
+any quantity of @code{\@}} sequences on the same line is processed only
+if all of the preceding conditions to which they correspond are true.
+Furthermore, a @code{\@}} closing the body of a @code{while} request
+must be the last such escape sequence on an input line.
+
+Brace escape sequences outside of control structures have no meaning and
+produce no output.
+
+@strong{Caution:@:} Input lines using @code{\@{} often end with
+@code{\RET}, especially in macros that consist primarily of control
+lines. Forgetting to use @code{\RET} on an input line after @code{\@{}
+is a common source of error.
+@endDefesc
+
+@need 1000
+We might write the following in a page header macro. If we delete
+@code{\RET}, the header will carry an unwanted extra empty line (except
+on page@tie{}1).
+
+@Example
+.if (\\n[%] != 1) \@{\
+. ie ((\\n[%] % 2) = 0) .tl \\*[even-numbered-page-title]
+. el .tl \\*[odd-numbered-page-title]
+.\@}
+@endExample
+
+Let us take a closer look at how conditional blocks nest.
+
+@Example
+A
+.if 0 \@{ B
+C
+D
+\@}E
+F
+ @result{} A F
+@endExample
+
+@Example
+N
+.if 1 \@{ O
+. if 0 \@{ P
+Q
+R\@} S\@} T
+U
+ @result{} N O U
+@endExample
+
+The above behavior may challenge the intuition; it was implemented to
+retain compatibility with @acronym{AT&T} @code{troff}. For clarity, it
+is idiomatic to end input lines with @code{\@{} (followed by
+@code{\@key{RET}} if appropriate), and to precede @code{\@}} on an input
+line with nothing more than a control character, spaces, tabs, and other
+instances of itself.
+
+We can use @code{ie}, @code{el}, and conditional blocks to simulate the
+multi-way ``switch'' or ``case'' control structures of other languages.
+The following example is adapted from the @code{groff} @file{man}
+package. Indentation is used to clarify the logic.
+
+@Example
+.\" Simulate switch/case in roff.
+. ie '\\$2'1' .ds title General Commands\"
+.el \@{.ie '\\$2'2' .ds title System Calls\"
+.el \@{.ie '\\$2'3' .ds title Library Functions\"
+.el \@{.ie '\\$2'4' .ds title Kernel Interfaces\"
+.el \@{.ie '\\$2'5' .ds title File Formats\"
+.el \@{.ie '\\$2'6' .ds title Games\"
+.el \@{.ie '\\$2'7' .ds title Miscellaneous Information\"
+.el \@{.ie '\\$2'8' .ds title System Management\"
+.el \@{.ie '\\$2'9' .ds title Kernel Development\"
+.el .ds title \" empty
+.\@}\@}\@}\@}\@}\@}\@}\@}
+@endExample
+
+@c ---------------------------------------------------------------------
+
+@node while, , if-else, Conditionals and Loops
+@subsection while
+@cindex while
+
+@code{groff} provides a looping construct:@: the @code{while} request.
+Its syntax matches the @code{if} request.
+
+@cindex body, of a while request
+@Defreq {while, cond-expr anything}
+Evaluate the conditional expression @var{cond-expr}, and repeatedly
+execute @var{anything} unless and until @var{cond-expr} evaluates false.
+@var{anything}, which is often a conditional block, is referred to as
+the @code{while} request's @dfn{body}.
+
+@Example
+.nr a 0 1
+.while (\na < 9) \@{\
+\n+a,
+.\@}
+\n+a
+ @result{} 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
+@endExample
+
+@cindex @code{de} request, and @code{while}
+GNU @code{troff} treats the body of a @code{while} request similarly to
+that of a @code{de} request (albeit one not read in copy
+mode@footnote{@xref{Copy Mode}.}), but stores it under an internal name
+and deletes it when the loop finishes. The operation of a macro
+containing a @code{while} request can slow significantly if the
+@code{while} body is large. Each time the macro is executed, the
+@code{while} body is parsed and stored again.
+
+@Example
+.de xxx
+. nr num 10
+. while (\\n[num] > 0) \@{\
+. \" many lines of code
+. nr num -1
+. \@}
+..
+@endExample
+
+@cindex recursive macros
+@cindex macros, recursive
+@noindent
+An often better solution---and one that is more portable, since
+@acronym{AT&T} @code{troff} lacked the @code{while} request---is to
+instead write a recursive macro. It will be parsed only
+once.@footnote{unless you redefine it}
+
+@Example
+.de yyy
+. if (\\n[num] > 0) \@{\
+. \" many lines of code
+. nr num -1
+. yyy
+. \@}
+..
+.
+.de xxx
+. nr num 10
+. yyy
+..
+@endExample
+
+@noindent
+To prevent infinite loops, the default number of available recursion
+levels is 1,000 or somewhat less.@footnote{``somewhat less'' because
+things other than macro calls can be on the input stack} You can
+disable this protective measure, or raise the limit, by setting the
+@code{slimit} register. @xref{Debugging}.
+
+As noted above, if a @code{while} body begins with a conditional block,
+its closing brace must end an input line.
+
+@Example
+.if 1 \@{\
+. nr a 0 1
+. while (\n[a] < 10) \@{\
+. nop \n+[a]
+.\@}\@}
+ @error{} unbalanced brace escape sequences
+@endExample
+@endDefreq
+
+@Defreq {break, }
+@cindex @code{while} request, confusing with @code{br}
+@cindex @code{break} request, in a @code{while} loop
+@cindex @code{continue} request, in a @code{while} loop
+Exit a @code{while} loop. Do not confuse this request with a
+typographical break or the @code{br} request.
+@endDefreq
+
+@Defreq {continue, }
+Skip the remainder of a @code{while} loop's body, immediately starting
+the next iteration.
+@endDefreq
+
+
+@c =====================================================================
+
+@node Writing Macros, Page Motions, Conditionals and Loops, GNU troff Reference
+@section Writing Macros
+@cindex writing macros
+@cindex macros, writing
+
+A @dfn{macro} is a stored collection of text and control lines that can
+be interpolated multiple times. Use macros to define common operations.
+Macros are called in the same way that requests are invoked. While
+requests exist for the purpose of creating macros, simply calling an
+undefined macro, or interpolating it as a string, will cause it to be
+defined as empty. @xref{Identifiers}.
+
+@Defreq {de, name [@Var{end}]}
+Define a macro @var{name}, replacing the definition of any existing
+request, macro, string, or diversion called @var{name}. If
+@var{name} already exists as an alias, the target of the alias is
+redefined; recall @ref{Strings}. GNU @code{troff} enters copy
+mode,@footnote{@xref{Copy Mode}.} storing subsequent input lines as the
+macro definition. If the optional second argument is not specified, the
+definition ends with the control line @samp{..} (two dots).
+Alternatively, @var{end} identifies a macro whose call syntax at the
+start of a control line ends the definition of @var{name}; @var{end} is
+then called normally. A macro definition must end in the same
+conditional block (if any) in which it began (@pxref{Conditional
+Blocks}). Spaces or tabs are permitted after the control character in
+the line containing this ending token (either @samp{.} or
+@samp{@var{end}}), but a tab immediately after the token prevents its
+recognition as the end of a macro definition. The macro @var{end} can
+be called with arguments.@footnote{While it is possible to define and
+call a macro @samp{.}, you can't use it as an end macro: during a macro
+definition, @samp{..} is never handled as calling @samp{.}, even if
+@samp{.de @var{name} .} explicitly precedes it.}
+@c
+@c @Example
+@c .de .
+@c (dot macro)
+@c ..
+@c .
+@c .. \" This calls macro '.'!
+@c .de m1 .
+@c (m1 macro)
+@c .. \" This does not.
+@c .m1
+@c @result{} (dot macro) (m1 macro)
+@c @endExample
+
+Here is a small example macro called @samp{P} that causes a break and
+inserts some vertical space. It could be used to separate paragraphs.
+
+@Example
+.de P
+. br
+. sp .8v
+..
+@endExample
+
+We can define one macro within another. Attempting to nest @samp{..}
+naïvely will end the outer definition because the inner definition
+isn't interpreted as such until the outer macro is later interpolated.
+We can use an end macro instead. Each level of nesting should use a
+unique end macro.
+
+An end macro need not be defined until it is called. This fact enables
+a nested macro definition to begin inside one macro and end inside
+another. Consider the following example.@footnote{Its structure is
+adapted from, and isomorphic to, part of a solution by Tadziu Hoffman to
+the problem of reflowing text multiple times to find an optimal
+configuration for it.
+@uref{https://lists.gnu.org/archive/html/groff/2008-12/msg00006.html}}
+
+@Example
+.de m1
+. de m2 m3
+you
+..
+.de m3
+Hello,
+Joe.
+..
+.de m4
+do
+..
+.m1
+know?
+. m3
+What
+.m4
+.m2
+ @result{} Hello, Joe. What do you know?
+@endExample
+
+@noindent
+A nested macro definition @emph{can} be terminated with @samp{..} and
+nested macros @emph{can} reuse end macros, but these control lines must
+be escaped multiple times for each level of nesting. The necessity of
+this escaping and the utility of nested macro definitions will become
+clearer when we employ macro parameters and consider the behavior of
+copy mode in detail.
+@endDefreq
+
+@code{de} defines a macro that inherits the compatibility mode
+enablement status of its context (@pxref{Implementation Differences}).
+Often it is desirable to make a macro that uses @code{groff} features
+callable from contexts where compatibility mode is on; for instance,
+when writing extensions to a historical macro package. To achieve this,
+compatibility mode needs to be switched off while such a macro is
+interpreted---without disturbing that state when it is finished.
+
+@Defreq {de1, name [@Var{end}]}
+The @code{de1} request defines a macro to be interpreted with
+compatibility mode disabled. When @var{name} is called, compatibility
+mode enablement status is saved; it is restored when the call completes.
+Observe the extra backlash before the interpolation of register
+@samp{xxx}; we'll explore this subject in @ref{Copy Mode}.
+
+@Example
+.nr xxx 12345
+.de aa
+The value of xxx is \\n[xxx].
+. br
+..
+.de1 bb
+The value of xxx is \\n[xxx].
+..
+.cp 1
+.aa
+ @error{} warning: register '[' not defined
+ @result{} The value of xxx is 0xxx].
+.bb
+ @result{} The value of xxx is 12345.
+@endExample
+@endDefreq
+
+@DefreqList {dei, name [@Var{end}]}
+@DefreqListEndx {dei1, name [@Var{end}]}
+The @code{dei} request defines a macro with its name and end
+macro indirected through strings. That is, it interpolates strings
+named @var{name} and @var{end} before performing the definition.
+
+The following examples are equivalent.
+
+@Example
+.ds xx aa
+.ds yy bb
+.dei xx yy
+@endExample
+
+@Example
+.de aa bb
+@endExample
+
+The @code{dei1} request bears the same relationship to @code{dei} as
+@code{de1} does to @code{de}; it temporarily turns compatibility mode
+off when @var{name} is called.
+@endDefreq
+
+@DefreqList {am, name [@Var{end}]}
+@DefreqItemx {am1, name [@Var{end}]}
+@DefreqItemx {ami, name [@Var{end}]}
+@DefreqListEndx {ami1, name [@Var{end}]}
+@cindex appending to a macro (@code{am})
+@cindex macro, appending to (@code{am})
+@code{am} appends subsequent input lines to macro @var{name}, extending
+its definition, and otherwise working as @code{de} does.
+
+To make the previously defined @samp{P} macro set indented instead of
+block paragraphs, add the necessary code to the existing macro.
+
+@Example
+.am P
+.ti +5n
+..
+@endExample
+
+The other requests are analogous to their @samp{de} counterparts. The
+@code{am1} request turns off compatibility mode during interpretation of
+the appendment. The @code{ami} request appends indirectly, meaning that
+strings @var{name} and @var{end} are interpolated with the resulting
+names used before appending. The @code{ami1} request is similar to
+@code{ami}, disabling compatibility mode during interpretation of the
+appended lines.
+@endDefreq
+
+@pindex trace.tmac
+Using @file{trace.tmac}, you can trace calls to @code{de},
+@code{de1}, @code{am}, and @code{am1}. You can also use the
+@code{backtrace} request at any point desired to troubleshoot tricky
+spots (@pxref{Debugging}).
+
+@xref{Strings}, for the @code{als}, @code{rm}, and @code{rn} requests to
+create an alias of, remove, and rename a macro, respectively.
+
+@cindex object creation
+Macro identifiers share their name space with requests, strings, and
+diversions; see @ref{Identifiers}. The @code{am}, @code{as}, @code{da},
+@code{de}, @code{di}, and @code{ds} requests (together with their
+variants) create a new object only if the name of the macro, diversion,
+or string is currently undefined or if it is defined as a request;
+normally, they modify the value of an existing object. @xref{als,,the
+description of the @code{als} request}, for pitfalls when redefining a
+macro that is aliased.
+
+@Defreq {return, [@Var{anything}]}
+Exit a macro, immediately returning to the caller. If called with an
+argument @var{anything}, exit twice---the current macro and the macro
+one level higher. This is used to define a wrapper macro for
+@code{return} in @file{trace.tmac}.
+@endDefreq
+
+@menu
+* Parameters::
+* Copy Mode::
+@end menu
+
+@c ---------------------------------------------------------------------
+
+@node Parameters, Copy Mode, Writing Macros, Writing Macros
+@subsection Parameters
+@cindex parameters
+
+Macro calls and string interpolations optionally accept a list of
+arguments; recall @ref{Calling Macros}. At the time such an
+interpolation takes place, these @dfn{parameters} can be examined using
+a register and a variety of escape sequences starting with @samp{\$}.
+All such escape sequences are interpreted even in copy mode, a fact we
+shall motivate and explain below (@pxref{Copy Mode}).
+
+@Defreg {.$}
+@cindex parameter count register (@code{.$})
+The count of parameters available to a macro or string is kept in this
+read-only register. The @code{shift} request can change its value.
+@endDefreg
+
+Any individual parameter can be accessed by its position in the list of
+arguments to the macro call, numbered from left to right starting at 1,
+with one of the following escape sequences.
+
+@DefescList {\\$, , n, }
+@DefescItem {\\$, (, nn, }
+@DefescListEnd {\\$, [, nnn, ]}
+Interpolate the @var{n}th, @var{nn}th, or @var{nnn}th parameter. The
+first form expects only a single digit (1@leq{}@var{n}@leq{}9)), the
+second two digits (01@leq{}@var{nn}@leq{}99)), and the third any
+positive integer @var{nnn}. Macros and strings accept an unlimited
+number of parameters.
+@endDefesc
+
+@Defreq {shift, [@Var{n}]}
+Shift the parameters @var{n} places (1@tie{}by default). This is a
+``left shift'': what was parameter@tie{}@var{i} becomes parameter
+@math{@var{i}-@var{n}}. The parameters formerly in positions 1
+to@tie{}@var{n} are no longer available. Shifting by a non-positive
+amount performs no operation. The register @code{.$} is adjusted
+accordingly.
+@endDefreq
+
+@cindex copy mode, and macro parameters
+@cindex mode, copy, and macro parameters
+@cindex macro, parameters (@code{\$})
+@cindex parameters, macro (@code{\$})
+In practice, parameter interpolations are usually seen prefixed with an
+extra escape character. This is because the @code{\$} family of escape
+sequences is interpreted even in copy mode.@footnote{If they were not,
+parameter interpolations would be similar to command-line
+parameters---fixed for the entire duration of a @code{roff} program's
+run. The advantage of interpolating @code{\$} escape sequences even in
+copy mode is that they can interpolate different contents from one call
+to the next, like function parameters in a procedural language. The
+additional escape character is the price of this power.}
+
+@DefescList {\\$*, , , }
+@DefescItemx {\\$@@, , , }
+@DefescListEndx {\\$^, , , }
+In some cases it is convenient to interpolate all of the parameters at
+once (to pass them to a request, for instance). The @code{\$*} escape
+concatenates the parameters, separating them with spaces. @code{\$@@}
+is similar, concatenating the parameters, surrounding each with double
+quotes and separating them with spaces. If not in compatibility mode,
+the interpolation depth of double quotes is preserved (@pxref{Calling
+Macros}). @code{\$^} interpolates all parameters as if they were
+arguments to the @code{ds} request.
+
+@Example
+.de foo
+. tm $1='\\$1'
+. tm $2='\\$2'
+. tm $*='\\$*'
+. tm $@@='\\$@@'
+. tm $^='\\$^'
+..
+.foo " This is a "test"
+ @error{} $1=' This is a '
+ @error{} $2='test"'
+ @error{} $*=' This is a test"'
+ @error{} $@@='" This is a " "test""'
+ @error{} $^='" This is a "test"'
+@endExample
+
+@code{\$*} is useful when writing a macro that doesn't need to
+distinguish its arguments, or even to not interpret them; examples
+include macros that produce diagnostic messages by wrapping the
+@code{tm} or @code{ab} requests. Use @code{\$@@} when writing a macro
+that may need to shift its parameters and/or wrap a macro or request
+that finds the count significant. If in doubt, prefer @code{\$@@} to
+@code{\$*}. An application of @code{\$^} is seen in @file{trace.tmac},
+which redefines some requests and macros for debugging purposes.
+@endDefesc
+
+@Defesc {\\$0, , , }
+@cindex macro name register (@code{\$0})
+@cindex @code{als} request, and @code{\$0}
+Interpolate the name by which the macro being interpreted was called.
+The @code{als} request can cause a macro to have more than one name.
+Applying string interpolation to a macro does not change this name.
+
+@Example
+.de foo
+. tm \\$0
+..
+.als bar foo
+.
+.de aaa
+. foo
+..
+.de bbb
+. bar
+..
+.de ccc
+\\*[foo]\\
+..
+.de ddd
+\\*[bar]\\
+..
+.
+.aaa
+ @error{} foo
+.bbb
+ @error{} bar
+.ccc
+ @error{} ccc
+.ddd
+ @error{} ddd
+@endExample
+@endDefesc
+
+@c ---------------------------------------------------------------------
+
+@node Copy Mode, , Parameters, Writing Macros
+@subsection Copy Mode
+@cindex copy mode
+@cindex copy mode
+@cindex mode, copy
+@cindex mode, copy
+
+@cindex @code{\n}, when reading text for a macro
+@cindex @code{\$}, when reading text for a macro
+@cindex @code{\*}, when reading text for a macro
+@cindex \@key{RET}, when reading text for a macro
+When GNU @code{troff} processes certain requests, most importantly those
+which define or append to a macro or string, it does so in @dfn{copy
+mode}: it copies the characters of the definition into a dedicated
+storage region, interpolating the escape sequences @code{\n}, @code{\g},
+@code{\$}, @code{\*}, @code{\V}, and @code{\?} normally; interpreting
+@code{\@key{RET}} immediately; discarding comments @code{\"} and
+@code{\#}; interpolating the current leader, escape, or tab character
+with @code{\a}, @code{\e}, and @code{\t}, respectively; and storing all
+other escape sequences in an encoded form.
+
+@cindex interpretation mode
+@cindex mode, interpretation
+The complement of copy mode---a @code{roff} formatter's behavior when
+not defining or appending to a macro, string, or diversion---where all
+macros are interpolated, requests invoked, and valid escape sequences
+processed immediately upon recognition, can be termed
+@dfn{interpretation mode}.
+
+@Defesc {\\\\, , , }
+The escape character, @code{\} by default, can escape itself. This
+enables you to control whether a given @code{\n}, @code{\g}, @code{\$},
+@code{\*}, @code{\V}, or @code{\?} escape sequence is interpreted at the
+time the macro containing it is defined, or later when the macro is
+called.@footnote{Compare this to the @code{\def} and @code{\edef}
+commands in @TeX{}.}
+
+@Example
+.nr x 20
+.de y
+.nr x 10
+\&\nx
+\&\\nx
+..
+.y
+ @result{} 20 10
+@endExample
+
+You can think of @code{\\} as a ``delayed'' backslash; it is the escape
+character followed by a backslash from which the escape character has
+removed its special meaning. Consequently, @samp{\\} is not an escape
+sequence in the usual sense. In any escape sequence @samp{\@var{X}}
+that GNU @code{troff} does not recognize, the escape character is
+ignored and @var{X} is output. An unrecognized escape sequence causes
+a warning in category @samp{escape}, with two exceptions---@samp{\\} is
+the first.
+@endDefesc
+
+@cindex @code{\\}, when reading text for a macro
+@Defesc {\\., , , }
+@code{\.} escapes the control character. It is similar to @code{\\} in
+that it isn't a true escape sequence. It is used to permit nested macro
+definitions to end without a named macro call to conclude them. Without
+a syntax for escaping the control character, this would not be possible.
+
+@Example
+.de m1
+foo
+.
+. de m2
+bar
+\\..
+.
+..
+.m1
+.m2
+ @result{} foo bar
+@endExample
+
+@noindent
+The first backslash is consumed while the macro is read, and the second
+is interpreted when macro @code{m1} is called.
+@endDefesc
+
+@code{roff} documents should not use the @code{\\} or @code{\.}
+character sequences outside of copy mode; they serve only to obfuscate
+the input. Use @code{\e} to represent the escape character,
+@code{\[rs]} to obtain a backslash glyph, and @code{\&} before @samp{.}
+and @samp{'} where GNU @code{troff} expects them as control characters
+if you mean to use them literally (recall @ref{Requests and Macros}).
+
+Macro definitions can be nested to arbitrary depth. The mechanics of
+parsing the escape character have significant consequences for this
+practice.
+
+@Example
+.de M1
+\\$1
+. de M2
+\\\\$1
+. de M3
+\\\\\\\\$1
+\\\\..
+. M3 hand.
+\\..
+. M2 of
+..
+This understeer is getting
+.M1 out
+ @result{} This understeer is getting out of hand.
+@endExample
+
+Each escape character is interpreted twice---once in copy mode, when the
+macro is defined, and once in interpretation mode, when the macro is
+called. As seen above, this fact leads to exponential growth in the
+quantity of escape characters required to delay interpolation of
+@code{\n}, @code{\g}, @code{\$}, @code{\*}, @code{\V}, and @code{\?} at
+each nesting level, which can be daunting. GNU @code{troff} offers a
+solution.
+
+@Defesc {\\E, , , }
+@code{\E} represents an escape character that is not interpreted in copy
+mode. You can use it to ease the writing of nested macro definitions.
+
+@Example
+.de M1
+. nop \E$1
+. de M2
+. nop \E$1
+. de M3
+. nop \E$1
+\\\\..
+. M3 better.
+\\..
+. M2 bit
+..
+This vehicle handles
+.M1 a
+ @result{} This vehicle handles a bit better.
+@endExample
+
+Observe that because @code{\.} is not a true escape sequence, we can't
+use @code{\E} to keep @samp{..} from ending a macro definition
+prematurely. If the multiplicity of backslashes complicates
+maintenance, use end macros.
+
+@code{\E} is also convenient to define strings containing escape
+sequences that need to work when used in copy mode (for example, as
+macro arguments), or which will be interpolated at varying macro nesting
+depths. We might define strings to begin and end superscripting
+as follows.@footnote{These are lightly adapted from the @code{groff}
+implementation of the @file{ms} macros.}
+
+@Example
+.ds @{ \v'-.9m\s'\En[.s]*7u/10u'+.7m'
+.ds @} \v'-.7m\s0+.9m'
+@endExample
+
+When the @code{ec} request is used to redefine the escape character,
+@code{\E} also makes it easier to distinguish the semantics of an escape
+character from the other meaning(s) its character might have. Consider
+the use of an unusual escape character, @samp{-}.
+
+@Example
+.nr a 1
+.ec -
+.de xx
+--na
+..
+.xx
+ @result{} -na
+@endExample
+
+@noindent
+This result may surprise you; some people expect @samp{1} to be output
+since register @samp{a} has clearly been defined with that value. What
+has happened? The robotic replacement of @samp{\} with @samp{-} has led
+us astray. You might recognize the sequence @samp{--} more readily with
+the default escape character as @samp{\-}, the special character escape
+sequence for the minus sign glyph.
+
+@Example
+.nr a 1
+.ec -
+.de xx
+-Ena
+..
+.xx
+ @result{} 1
+@endExample
+@endDefesc
+
+
+@c =====================================================================
+
+@node Page Motions, Drawing Geometric Objects, Writing Macros, GNU troff Reference
+@section Page Motions
+@cindex page motions
+@cindex motions, page
+
+@xref{Manipulating Spacing}, for a discussion of the most commonly used
+request for vertical motion, @code{sp}, which spaces downward by one
+vee.
+
+@DefreqList {mk, [@Var{reg}]}
+@DefreqListEndx {rt, [@Var{dist}]}
+@cindex marking vertical page location (@code{mk})
+@cindex page location, vertical, marking (@code{mk})
+@cindex location, vertical, page, marking (@code{mk})
+@cindex vertical page location, marking (@code{mk})
+@cindex returning to marked vertical page location (@code{rt})
+@cindex page location, vertical, returning to marked (@code{rt})
+@cindex location, vertical, page, returning to marked (@code{rt})
+@cindex vertical page location, returning to marked (@code{rt})
+You can @dfn{mark} a location on a page for subsequent @dfn{return}.
+@code{mk} takes an argument, a register name in which to store the
+current page location. If given no argument, it stores the location in
+an internal register. This location can be used later by the @code{rt}
+or the @code{sp} requests (or the @code{\v} escape).
+
+The @code{rt} request returns @emph{upward} to the location marked with
+the last @code{mk} request. If used with an argument, it returns to a
+vertical position@tie{}@var{dist} from the top of the page (no previous
+call to @code{mk} is necessary in this case). The default scaling
+unit is @samp{v}.
+
+If a page break occurs between a @code{mk} request and its matching
+@code{rt} request, the @code{rt} request is silently ignored.
+
+A simple implementation of a macro to set text in two columns follows.
+
+@Example
+.nr column-length 1.5i
+.nr column-gap 4m
+.nr bottom-margin 1m
+.
+.de 2c
+. br
+. mk
+. ll \\n[column-length]u
+. wh -\\n[bottom-margin]u 2c-trap
+. nr right-side 0
+..
+.
+.de 2c-trap
+. ie \\n[right-side] \@{\
+. nr right-side 0
+. po -(\\n[column-length]u + \\n[column-gap]u)
+. \" remove trap
+. wh -\\n[bottom-margin]u
+. \@}
+. el \@{\
+. \" switch to right side
+. nr right-side 1
+. po +(\\n[column-length]u + \\n[column-gap]u)
+. rt
+. \@}
+..
+@endExample
+
+Now let us apply our two-column macro.
+
+@Example
+.pl 1.5i
+.ll 4i
+This is a small test that shows how the
+rt request works in combination with mk.
+
+.2c
+Starting here, text is typeset in two columns.
+Note that this implementation isn't robust
+and thus not suited for a real two-column
+macro.
+ @result{} This is a small test that shows how the
+ @result{} rt request works in combination with mk.
+ @result{}
+ @result{} Starting here, isn't robust
+ @result{} text is typeset and thus not
+ @result{} in two columns. suited for a
+ @result{} Note that this real two-column
+ @result{} implementation macro.
+@endExample
+@endDefreq
+
+Several escape sequences enable fine control of movement about the page.
+
+@Defesc {\\v, @code{'}, expr, @code{'}}
+@cindex vertical motion (@code{\v})
+@cindex motion, vertical (@code{\v})
+Vertically move the drawing position. @var{expr} indicates the
+magnitude of motion: positive is downward and and negative upward. The
+default scaling unit is @samp{v}. The motion is relative to the current
+drawing position unless @var{expr} begins with the boundary-relative
+motion operator @samp{|}. @xref{Numeric Expressions}.
+
+Text processing continues at the new drawing position; usually, vertical
+motions should be in balanced pairs to avoid a confusing page layout.
+
+@code{\v} will not spring a vertical position trap. This can be useful;
+for example, consider a page bottom trap macro that prints a marker in
+the margin to indicate continuation of a footnote. @xref{Traps}.
+@endDefesc
+
+A few escape sequences that produce vertical motion are unusual. They
+are thought to originate early in AT&T @code{nroff} history to achieve
+super- and subscripting by half-line motions on line printers and
+teletypewriters before the phototypesetter made more precise positioning
+available. They are reckoned in ems---not vees---to maintain continuity
+with their original purpose of moving relative to the size of the type
+rather than the distance between text baselines (vees).@footnote{At the
+@code{grops} defaults of 10-point type on 12-point vertical spacing, the
+difference between half a vee and half an em can be subtle:@: large
+spacings like @samp{.vs .5i} make it obvious.}
+
+@DefescList {\\r, , , }
+@DefescItemx {\\u, , , }
+@DefescListEndx {\\d, , , }
+Move upward@tie{}1@dmn{m}, upward@tie{}.5@dmn{m}, and
+downward@tie{}.5@dmn{m}, respectively.
+@endDefesc
+
+@noindent
+Let us see these escape sequences in use.
+
+@Example
+Obtain 100 cm\u3\d of \ka\d\092\h'|\nau'\r233\dU.
+@endExample
+
+In the foregoing we have paired @code{\u} and @code{\d} to typeset a
+superscript, and later a full em negative (``reverse'') motion to place
+a superscript above a subscript. A numeral-width horizontal motion
+escape sequence aligns the proton and nucleon numbers, while @code{\k}
+marks a horizontal position to which @code{\h} returns so that we could
+stack them. (We shall discuss these horizontal motion escape sequences
+presently.) In serious applications, we often want to alter the type
+size of the -scripts and to fine-tune the vertical motions, as the
+@code{groff} @file{ms} package does with its super- and subscripting
+string definitions.
+
+@Defesc {\\h, @code{'}, expr, @code{'}}
+@cindex inserting horizontal space (@code{\h})
+@cindex horizontal space (@code{\h})
+@cindex space, horizontal (@code{\h})
+@cindex horizontal motion (@code{\h})
+@cindex motion, horizontal (@code{\h})
+Horizontally move the drawing position. @var{expr} indicates the
+magnitude of motion: positive is rightward and negative leftward. The
+default scaling unit is @samp{m}. The motion is relative to the current
+drawing position unless @var{expr} begins with the boundary-relative
+motion operator @samp{|}. @xref{Numeric Expressions}.
+@endDefesc
+
+The following string definition sets the @TeX{}
+logo.@footnote{@xref{Strings}, for an explanation of the trailing
+@samp{\"}.}
+
+@Example
+.ds TeX T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X\"
+@endExample
+
+There are a number of special-case escape sequences for horizontal
+motion.
+
+@Defesc {\\@key{SP}, , , }
+@cindex space, unbreakable and unadjustable (@code{\@key{SP}})
+@cindex unbreakable and unadjustable space (@code{\@key{SP}})
+@cindex unadjustable and unbreakable space (@code{\@key{SP}})
+@c We use the following notation in our man pages; Texinfo is bound to
+@c the GNU Emacs dialect.
+@esindex \@slanted{space}
+Move right one word space. (The input is a backslash followed by a
+space.) This escape sequence can be thought of as a non-adjustable,
+unbreakable space. Usually you want @code{\~} instead; see
+@ref{Manipulating Filling and Adjustment}.
+@endDefesc
+
+@cindex thin space (@code{\|})
+@cindex space, thin (@code{\|})
+@Defesc {\\|, , , }
+Move one-sixth @dmn{em} to the right on typesetting output devices. If
+a glyph named @samp{\|} is defined in the current font, its width is
+used instead, even on terminal output devices.
+@endDefesc
+
+@cindex hair space (@code{\^})
+@cindex space, hair (@code{\^})
+@Defesc {\\^, , , }
+Move one-twelfth @dmn{em} to the right on typesetting output devices.
+If a glyph named @samp{\^} is defined in the current font, its width is
+used instead, even on terminal output devices.
+@endDefesc
+
+@Defesc {\\0, , , }
+@cindex space, width of a digit (numeral) (@code{\0})
+@cindex digit-width space (@code{\0})
+@cindex figure space (@code{\0})
+@cindex numeral-width space (@code{\0})
+Move right by the width of a numeral in the current font.
+@endDefesc
+
+Horizontal motions are not discarded at the end of an output line as
+word spaces are. @xref{Breaking}.
+
+@DefescList {\\w, @code{'}, anything, @code{'}}
+@DefregItemx {st}
+@DefregItemx {sb}
+@DefregItemx {rst}
+@DefregItemx {rsb}
+@DefregItemx {ct}
+@DefregItemx {ssc}
+@DefregListEndx {skw}
+@cindex width escape (@code{\w})
+Interpolate the width of @var{anything} in basic units. This escape
+sequence allows several properties of formatted output to be measured
+without writing it out.
+
+@Example
+The length of the string 'abc' is \w'abc'u.
+ @result{} The length of the string 'abc' is 72u.
+@endExample
+
+@cindex dummy environment, used by @code{\w} escape sequence
+@cindex environment, dummy, used by @code{\w} escape sequence
+@var{anything} is processed in a dummy environment:@: this means that
+font and type size changes, for example, may occur within it without
+affecting subsequent output.
+
+@need 500
+After each use, @code{\w} sets several registers.
+
+@cindex CSTR@tie{}#54 errata
+@cindex CSTR@tie{}#54 erratum, @code{sb} register
+@cindex CSTR@tie{}#54 erratum, @code{st} register
+@table @code
+@item st
+@itemx sb
+The maximum vertical displacements of the text baseline above and below,
+respectively. The sign convention is opposite that of relative vertical
+motions; that is, depth below the (original) baseline is negative.
+These registers are incorrectly documented in the @acronym{AT&T}
+@code{troff} manual as ``the highest and lowest extent of [the argument
+to @code{\w}] relative to the baseline''.
+
+@item rst
+@itemx rsb
+Like @code{st} and @code{sb}, but taking account of the heights and
+depths of glyphs. In other words, these registers store the highest and
+lowest vertical positions attained by @var{anything}, doing what
+@acronym{AT&T} @code{troff} documented @code{st} and @code{sb} as doing.
+
+@item ct
+Characterizes the geometry of glyphs occurring in @var{anything}.
+
+@table @asis
+@item 0
+only short glyphs, no descenders or tall glyphs
+
+@item 1
+at least one descender
+
+@item 2
+at least one tall glyph
+
+@item 3
+at least one each of a descender and a tall glyph
+@end table
+
+@item ssc
+The amount of horizontal space (possibly negative) that should be added
+to the last glyph before a subscript.
+
+@item skw
+How far to right of the center of the last glyph in the @code{\w}
+argument, the center of an accent from a roman font should be placed
+over that glyph.
+@end table
+@endDefesc
+
+@DefescList {\\k, , p, }
+@DefescItem {\\k, (, ps, }
+@DefescListEnd {\\k, [, position, ]}
+@cindex saving horizontal input line position (@code{\k})
+@cindex horizontal input line position, saving (@code{\k})
+@cindex input line position, horizontal, saving (@code{\k})
+@cindex position, horizontal input line, saving (@code{\k})
+@cindex line, input, horizontal position, saving (@code{\k})
+Store the current horizontal position in the @emph{input} line in a
+register with the name @var{position} (one-character name@tie{}@var{p},
+two-character name @var{ps}). Use this, for example, to return to the
+beginning of a string for highlighting or other decoration.
+@endDefesc
+
+@Defreg {hp}
+@cindex horizontal input line position register (@code{hp})
+@cindex input line, horizontal position, register (@code{hp})
+@cindex position, horizontal, in input line, register (@code{hp})
+@cindex line, input, horizontal position, register (@code{hp})
+The current horizontal position at the input line.
+@endDefreg
+
+@Defreg {.k}
+@cindex horizontal output line position register (@code{.k})
+@cindex output line, horizontal position, register (@code{.k})
+@cindex position, horizontal, in output line, register (@code{.k})
+@cindex line, output, horizontal position, register (@code{.k})
+A read-only register containing the current horizontal output position
+(relative to the current indentation).
+@endDefreg
+
+@Defesc {\\o, @code{'}, abc@dots{}, @code{'}}
+@cindex overstriking glyphs (@code{\o})
+@cindex glyphs, overstriking (@code{\o})
+Overstrike the glyphs of characters @var{a}, @var{b}, @var{c}, @dots{};
+the glyphs are centered, written, and the drawing position advanced by
+the widest of the glyphs.
+@endDefesc
+
+@Defesc {\\z, , c, }
+@cindex zero-width printing (@code{\z}, @code{\Z})
+@cindex printing, zero-width (@code{\z}, @code{\Z})
+Format the character @var{c} with zero width; that is, without advancing
+the drawing position. Use @code{\z} to overstrike glyphs aligned to
+their left edges, in contrast to @code{\o}'s centering.
+@endDefesc
+
+@Defesc {\\Z, @code{'}, anything, @code{'}}
+@cindex zero-width printing (@code{\z}, @code{\Z})
+@cindex printing, zero-width (@code{\z}, @code{\Z})
+Save the drawing position, format @var{anything}, then restore it. Tabs
+and leaders in the argument are ignored with an error diagnostic.
+
+We might implement a strike-through macro thus.
+
+@Example
+.de ST
+.nr width \w'\\$1'
+\Z@@\v'-.25m'\l'\\n[width]u'@@\\$1
+..
+.
+This is
+.ST "a test"
+an actual emergency!
+@endExample
+@endDefesc
+
+
+@c =====================================================================
+
+@node Drawing Geometric Objects, Traps, Page Motions, GNU troff Reference
+@section Drawing Geometric Objects
+@cindex drawing requests
+@cindex requests for drawing
+
+A few of the formatter's escape sequences draw lines and other geometric
+objects. Combined with each other and with page motion commands
+(@pxref{Page Motions}), a wide variety of figures is possible. For
+complex drawings, these operations can be cumbersome; the preprocessors
+@code{gpic} or @code{ggrn} are typically used instead.
+
+The @code{\l} and @code{\L} escape sequences draw horizontal and
+vertical sequences of glyphs, respectively. Even the simplest of
+output devices supports them.
+
+@DefescList {\\l, @code{'}, l, @code{'}}
+@DefescListEnd {\\l, @code{'}, lc, @code{'}}
+@cindex drawing horizontal lines (@code{\l})
+@cindex horizontal line, drawing (@code{\l})
+@cindex line, horizontal, drawing (@code{\l})
+Draw a horizontal line of length @var{l} from the drawing position.
+Rightward motion is positive. Afterward, the drawing position is at the
+right end of the line. The default scaling unit is @samp{m}.
+
+@cindex baseline rule special character(@code{\[ru]})
+@cindex glyph, underscore (@code{\[ru]})
+@cindex line drawing glyph
+@cindex glyph, for line drawing
+The optional second parameter@tie{}@var{c} is a character with which to
+draw the line. The default is the baseline rule special character,
+@code{\[ru]}.
+
+@cindex dummy character (@code{\&}), effect on @code{\l} escape sequence
+@cindex character, dummy (@code{\&}), effect on @code{\l} escape sequence
+If @var{c} is a valid scaling unit, put @code{\&} after @var{l} to
+disambiguate the input.
+
+@Example
+.de textbox
+\[br]\\$*\[br]\l'|0\[rn]'\l'|0\[ul]'
+..
+@endExample
+
+@noindent
+The foregoing outputs a box rule (a vertical line), the text
+argument(s), and another box rule. We employ the boundary-relative
+motion operator @samp{|}. Finally, the line-drawing escape sequences
+draw a radical extender (a form of overline) and an underline from the
+drawing position to the position coresponding to beginning of the
+@emph{input} line. The drawing position returns to just after the
+right-hand box rule because the lengths of the drawn lines are negative,
+as noted above.
+@endDefesc
+
+@DefescList {\\L, @code{'}, l, @code{'}}
+@DefescListEnd {\\L, @code{'}, lc, @code{'}}
+@cindex drawing vertical lines (@code{\L})
+@cindex vertical line drawing (@code{\L})
+@cindex line, vertical, drawing (@code{\L})
+@cindex line drawing glyph
+@cindex glyph for line drawing
+@cindex box rule glyph (@code{\[br]})
+@cindex glyph, box rule (@code{\[br]})
+Draw a vertical line of length @var{l} from the drawing position.
+Downward motion is positive. The default scaling unit is @samp{v}. The
+default character is the box rule, @code{\[br]}. As with vertical
+motion escape sequences, text processing continues where the line ends.
+@code{\L} is otherwise similar to @code{\l}.
+
+@Example
+$ nroff <<EOF
+This is a \L'3v'test.
+EOF
+ @result{} This is a
+ @result{} |
+ @result{} |
+ @result{} |test.
+@endExample
+
+@noindent
+When writing text, the drawing position is at the text baseline; recall
+@ref{Page Geometry}.
+@endDefesc
+
+@c BEGIN Keep (roughly) parallel with subsection "Drawing commands" of
+@c groff(7).
+The @code{\D} escape sequence provides @dfn{drawing commands} that
+direct the output device to render geometrical objects rather than
+glyphs. Specific devices may support only a subset, or may feature
+additional ones; consult the man page for the output driver in use.
+Terminal devices in particular implement almost none. @xref{Graphics
+Commands}.
+
+Rendering starts at the drawing position; when finished, the drawing
+position is left at the rightmost point of the object, even for closed
+figures, except where noted. GNU @code{troff} draws stroked (outlined)
+objects with the stroke color, and shades filled ones with the fill
+color. @xref{Colors}. Coordinates @var{h} and @var{v} are horizontal
+and vertical motions relative to the drawing position or previous point
+in the command. The default scaling unit for horizontal measurements
+(and diameters of circles) is @samp{m}; for vertical ones, @samp{v}.
+
+Circles, ellipses, and polygons can be drawn filled or stroked. These
+are independent properties; if you want a filled, stroked figure, you
+must draw the same figure twice using each drawing command. A filled
+figure is always smaller than an outlined one because the former is
+drawn only within its defined area, whereas strokes have a line
+thickness (set with @samp{\D't'}).
+
+@Example
+\h'1i'\v'1i'\
+\# increase line thickness
+\Z'\D't 5p''\
+\# draw stroked (unfilled) polygon
+\Z'\D'p 3 3 -6 0''\
+\# draw filled (solid) polygon
+\Z'\D'P 3 3 -6 0''
+@endExample
+
+@need 500
+@Defesc {\\D, @code{'}, command argument @dots{}, @code{'}}
+Drawing command escape sequence parameters begin with an ordinary
+character, @var{command}, selecting the type of object to be drawn,
+followed by @var{argument}s whose meaning is determined by
+@var{command}.
+
+@table @code
+@item \D'~ @var{h1} @var{v1} @dots{} @var{hn} @var{vn}'
+@cindex drawing a spline (@samp{\D'~ @dots{}'})
+@cindex spline, drawing (@samp{\D'~ @dots{}'})
+Draw a B-spline to each point in sequence, leaving the drawing position
+at (@var{hn}, @var{vn}).
+
+@item \D'a @var{hc} @var{vc} @var{h} @var{v}'
+@cindex arc, drawing (@samp{\D'a @dots{}'})
+@cindex drawing an arc (@samp{\D'a @dots{}'})
+Draw a circular arc centered at (@var{hc}, @var{vc}) counterclockwise
+from the drawing position to a point (@var{h}, @var{v}) relative to the
+center. @footnote{(@var{hc}, @var{vc}) is adjusted to the point nearest
+the perpendicular bisector of the arc's chord.}
+
+@item \D'c @var{d}'
+@cindex circle, stroked, drawing (@samp{\D'c @dots{}'})
+@cindex drawing a stroked circle (@samp{\D'c @dots{}'})
+@cindex stroked circle, drawing (@samp{\D'c @dots{}'})
+@cindex circle, outlined, drawing (@samp{\D'c @dots{}'})
+@cindex drawing an outlined circle (@samp{\D'c @dots{}'})
+@cindex outlined circle, drawing (@samp{\D'c @dots{}'})
+Draw a circle of diameter @var{d} with its leftmost point at the drawing
+position.
+
+@item \D'C @var{d}'
+@cindex circle, filled, drawing (@samp{\D'C @dots{}'})
+@cindex drawing a filled circle (@samp{\D'C @dots{}'})
+@cindex filled circle, drawing (@samp{\D'C @dots{}'})
+@cindex circle, solid, drawing (@samp{\D'C @dots{}'})
+@cindex drawing a solid circle (@samp{\D'C @dots{}'})
+@cindex solid circle, drawing (@samp{\D'C @dots{}'})
+As @samp{\D'C @r{@dots{}}'}, but the circle is filled.
+
+@item \D'e @var{h} @var{v}'
+@cindex ellipse, stroked, drawing (@samp{\D'e @dots{}'})
+@cindex drawing a stroked ellipse (@samp{\D'e @dots{}'})
+@cindex stroked ellipse, drawing (@samp{\D'e @dots{}'})
+@cindex ellipse, outlined, drawing (@samp{\D'e @dots{}'})
+@cindex drawing an outlined ellipse (@samp{\D'e @dots{}'})
+@cindex outlined ellipse, drawing (@samp{\D'e @dots{}'})
+Draw an ellipse of width @var{h} and height @var{v} with its leftmost
+point at the drawing position.
+
+@item \D'E @var{x} @var{y}'
+@cindex ellipse, filled, drawing (@samp{\D'E @dots{}'})
+@cindex drawing a filled ellipse (@samp{\D'E @dots{}'})
+@cindex filled ellipse, drawing (@samp{\D'E @dots{}'})
+@cindex ellipse, solid, drawing (@samp{\D'E @dots{}'})
+@cindex drawing a solid ellipse (@samp{\D'E @dots{}'})
+@cindex solid ellipse, drawing (@samp{\D'E @dots{}'})
+As @samp{\D'e @r{@dots{}}'}, but the ellipse is filled.
+
+@item \D'l @var{dx} @var{dy}'
+@cindex line, drawing (@samp{\D'l @dots{}'})
+@cindex drawing a line (@samp{\D'l @dots{}'})
+Draw line from the drawing position to (@var{h}, @var{v}).
+
+The following is a macro for drawing a box around a text argument; for
+simplicity, the box margin is a fixed at 0.2@dmn{m}.
+
+@Example
+.de TEXTBOX
+. nr @@wd \w'\\$1'
+\h'.2m'\
+\h'-.2m'\v'(.2m - \\n[rsb]u)'\
+\D'l 0 -(\\n[rst]u - \\n[rsb]u + .4m)'\
+\D'l (\\n[@@wd]u + .4m) 0'\
+\D'l 0 (\\n[rst]u - \\n[rsb]u + .4m)'\
+\D'l -(\\n[@@wd]u + .4m) 0'\
+\h'.2m'\v'-(.2m - \\n[rsb]u)'\
+\\$1\
+\h'.2m'
+..
+@endExample
+
+@noindent
+The argument is measured with the @code{\w} escape sequence. Its width
+is stored in register @code{@@wd}. @code{\w} also sets the registers
+@code{rst} and @code{rsb}; these contain its maximum vertical extents of
+the argument. Then, four lines are drawn to form a box, offset by the
+box margin.
+
+@item \D'p @var{h1} @var{v1} @dots{} @var{hn} @var{vn}'
+@cindex polygon, stroked, drawing (@samp{\D'p @dots{}'})
+@cindex drawing a stroked polygon (@samp{\D'p @dots{}'})
+@cindex stroked polygon, drawing (@samp{\D'p @dots{}'})
+@cindex polygon, outlined, drawing (@samp{\D'p @dots{}'})
+@cindex drawing an outlined polygon (@samp{\D'p @dots{}'})
+@cindex outlined polygon, drawing (@samp{\D'p @dots{}'})
+Draw polygon with vertices at drawing position and each point in
+sequence. GNU @code{troff} closes the polygon by drawing a line from
+(@var{hn}, @var{vn}) back to the initial drawing position.
+@c XXX: This would be the "STUPID_DRAWING_POSITIONING" complained of in
+@c src/libs/libdriver/input.cpp. It is neither the rightmost point
+@c of the figure nor the initial drawing position that GNU troff
+@c automatically returned to to close the figure.
+Afterward, the drawing position is left at (@var{hn}, @var{vn}).
+
+@item \D'P @var{dx1} @var{dy1} @var{dx2} @var{dy2} @dots{}'
+@cindex polygon, filled, drawing (@samp{\D'P @dots{}'})
+@cindex drawing a filled polygon (@samp{\D'P @dots{}'})
+@cindex filled polygon, drawing (@samp{\D'P @dots{}'})
+@cindex polygon, solid, drawing (@samp{\D'P @dots{}'})
+@cindex drawing a solid polygon (@samp{\D'P @dots{}'})
+@cindex solid polygon, drawing (@samp{\D'P @dots{}'})
+As @samp{\D'P @r{@dots{}}'}, but the polygon is filled.
+
+The following macro is like the @samp{\D'l'} example, but shades the
+box. We draw the box before writing the text because colors in GNU
+@code{troff} have no transparency; in othe opposite order, the filled
+polygon would occlude the text.
+
+@Example
+.de TEXTBOX
+. nr @@wd \w'\\$1'
+\h'.2m'\
+\h'-.2m'\v'(.2m - \\n[rsb]u)'\
+\M[lightcyan]\
+\D'P 0 -(\\n[rst]u - \\n[rsb]u + .4m) \
+ (\\n[@@wd]u + .4m) 0 \
+ 0 (\\n[rst]u - \\n[rsb]u + .4m) \
+ -(\\n[@@wd]u + .4m) 0'\
+\h'.2m'\v'-(.2m - \\n[rsb]u)'\
+\M[]\
+\\$1\
+\h'.2m'
+..
+@endExample
+
+@item \D't @var{n}'
+@cindex line thickness (@samp{\D't @dots{}'})
+@cindex thickness of lines (@samp{\D't @dots{}'})
+Set the stroke thickness of geometric objects to @var{n} basic units. A
+zero @var{n} selects the minimal supported thickness. A negative
+@var{n} selects a thickness proportional to the type size; this is the
+default.
+@end table
+@endDefesc
+@c END Keep (roughly) parallel with subsection "Drawing commands" of
+@c groff(7).
+
+In a hazy penumbra between text rendering and drawing commands we locate
+the bracket-building escape sequence, @code{\b}. It can assemble
+apparently large glyphs by vertically stacking ordinary ones.
+
+@Defesc {\\b, @code{'}, contents, @code{'}}
+@cindex pile, glyph (@code{\b})
+@cindex glyph pile (@code{\b})
+@cindex stacking glyphs (@code{\b})
+Pile and center a sequence of glyphs vertically on the output line.
+@dfn{Piling} stacks glyphs corresponding to each character in
+@var{contents}, read from left to right, and placed from top to bottom.
+GNU @code{troff} separates the glyphs vertically by 1@dmn{m}, and the
+pile itself is centered 0.5@dmn{m} above the text baseline. The
+horizontal drawing position is then advanced by the width of the widest
+glyph in the pile.
+
+@cindex @code{\b}, limitations of
+@cindex limitations of @code{\b} escape sequence
+This rather inflexible positioning algorithm doesn't work with the
+@code{dvi} output device since its bracket pieces vary in height.
+Instead, use the @code{geqn} preprocessor.
+
+@ref{Manipulating Spacing} describes how to adjust the vertical spacing
+of the output line with the @code{\x} escape sequence.
+
+The application of @code{\b} that lends its name is construction of
+brackets, braces, and parentheses when typesetting mathematics. We
+might construct a large opening (left) brace as follows.
+
+@Example
+\b'\[lt]\[bv]\[lk]\[bv]\[lb]'
+@endExample
+
+See @cite{groff_char@r{(7)}} for a list of special character
+identifiers.
+@endDefesc
+
+
+@c =====================================================================
+
+@node Deferring Output, Traps, Drawing Geometric Objects, GNU troff Reference
+@section Deferring Output
+@cindex deferred output
+
+@cindex environment
+@cindex diversion
+@cindex trap
+A few @code{roff} language elements are generally not used in simple
+documents, but arise as page layouts become more sophisticated and
+demanding. @dfn{Environments} collect formatting parameters like line
+length and typeface. A @dfn{diversion} stores formatted output for
+later use. A @dfn{trap} is a condition on the input or output, tested
+automatically by the formatter, that is associated with a macro, causing
+it to be called when that condition is fulfilled.
+
+Footnote support often exercises all three of the foregoing features. A
+simple implementation might work as follows. A pair of macros is
+defined: one starts a footnote and the other ends it. The author calls
+the first macro where a footnote marker is desired. The macro
+establishes a diversion so that the footnote text is collected at the
+place in the body text where its corresponding marker appears. An
+environment is created for the footnote so that it is set at a smaller
+typeface. The footnote text is formatted in the diversion using that
+environment, but it does not yet appear in the output. The document
+author calls the footnote end macro, which returns to the previous
+environment and ends the diversion. Later, after much more body text in
+the document, a trap, set a small distance above the page bottom, is
+sprung. The macro called by the trap draws a line across the page and
+emits the stored diversion. Thus, the footnote is rendered.
+
+Diversions and traps make the text formatting process non-linear. Let
+us imagine a set of text lines or paragraphs labelled @samp{A},
+@samp{B}, and so on. If we set up a trap that produces text @samp{T}
+(as a page footer, say), and we also use a diversion to store the
+formatted text @samp{D}, then a document with input text in the order
+@samp{A B C D E F} might render as @samp{A B C E T F}. The diversion
+@samp{D} will never be output if we do not call for it.
+
+Environments of themselves are not a source of non-linearity in document
+formatting:@: environment switches have immediate effect. One could
+always write a macro to change as many formatting parameters as desired
+with a single convenient call. But because diversions can be nested and
+macros called by traps that are sprung by other trap-called macros, they
+may be called upon in varying contexts. For example, consider a page
+header that is always to be set in Helvetica. A document that uses
+Times for most of its body text, but Courier for displayed code
+examples, poses a challenge if a page break occurs in the middle of a
+code display; if the header trap assumes that the ``previous font'' is
+always Times, the rest of the example will be formatted in the wrong
+typeface. One could carefully save all formatting parameters upon
+entering the trap and restore them upon leaving it, but this is verbose,
+error-prone, and not future-proof as the @code{groff} language develops.
+Environments save us considerable effort.
+
+@c =====================================================================
+
+@need 1000
+@c BEGIN Keep (roughly) parallel with subsection "Traps" of groff(7).
+@node Traps, Diversions, Deferring Output, GNU troff Reference
+@section Traps
+@cindex traps
+
+@dfn{Traps} are locations in the output or conditions on the input that,
+when reached or fulfilled, call a specified macro. These traps can
+occur at a given location on the page, at a given location in the
+current diversion (together, these are known as @slanted{vertical
+position traps}), at a blank line, at a line with leading space
+characters, after a quantity of input lines, or at the end of input.
+Macros called by traps are passed no arguments.
+@cindex planting a trap
+@cindex trap, planting
+Setting a trap is also called @dfn{planting} one.
+@cindex trap, springing
+@cindex springing a trap
+It is said that a trap is @dfn{sprung} if its condition is fulfilled.
+@c END Keep (roughly) parallel with subsection "Traps" of groff(7).
+
+@menu
+* Vertical Position Traps::
+* Diversion Traps::
+* Input Line Traps::
+* Blank Line Traps::
+* Leading Space Traps::
+* End-of-input Traps::
+@end menu
+
+@c ---------------------------------------------------------------------
+
+@node Vertical Position Traps, Page Location Traps, Traps, Traps
+@subsection Vertical Position Traps
+@cindex vertical position traps
+@cindex traps, vertical position
+
+A @dfn{vertical position trap} calls a macro when the formatter's
+vertical drawing position reaches or passes, in the downward direction,
+a certain location on the output page or in a diversion. Its
+applications include setting page headers and footers, body text in
+multiple columns, and footnotes.
+
+@DefreqList {vpt, [@Var{flag}]}
+@DefregListEndx {.vpt}
+@cindex enabling vertical position traps (@code{vpt})
+@cindex vertical position traps, enabling (@code{vpt})
+@cindex vertical position trap enable register (@code{.vpt})
+Enable vertical position traps if @var{flag} is non-zero or absent;
+disable them otherwise. Vertical position traps are those set by the
+@code{wh} request or by @code{dt} within a diversion. The parameter
+that controls whether vertical position traps are enabled is global.
+Initially, vertical position traps are enabled. The current value is
+stored in the @code{.vpt} read-only register.
+
+@cindex page break, prevented by @code{vpt}
+@cindex break, page, prevented by @code{vpt}
+@cindex page ejection, prevented by @code{vpt}
+@cindex ejection, page, prevented by @code{vpt}
+A page can't be ejected if @code{vpt} is set to zero; see @ref{The
+Implicit Page Trap}.
+@endDefreq
+
+@menu
+* Page Location Traps::
+* The Implicit Page Trap::
+* Diversion Traps::
+@end menu
+
+@c ---------------------------------------------------------------------
+
+@node Page Location Traps, The Implicit Page Trap, Vertical Position Traps, Vertical Position Traps
+@subsubsection Page Location Traps
+@cindex page location traps
+@cindex traps, page location
+
+A @dfn{page location trap} is a vertical position trap that applies to
+the page; that is, to undiverted output. Many can be present; manage
+them with the @code{wh} and @code{ch} requests.
+
+@Defreq {wh, dist [@Var{name}]}
+Plant macro @var{name} as page location trap at @var{dist}. The default
+scaling unit is @samp{v}. Non-negative values for @var{dist} set the
+trap relative to the top of the page; negative values set the trap
+relative to the bottom of the page. It is not possible to plant a trap
+less than one basic unit from the page bottom: a @var{dist} of @code{-0}
+is interpreted as @code{0}, the top of the page.@footnote{@xref{The
+Implicit Page Trap}.} An existing @emph{visible} trap (see below) at
+@var{dist} is removed; this is @code{wh}'s sole function if @var{name}
+is missing.
+
+A trap is sprung only if it is @dfn{visible}, meaning that its location
+is reachable on the page@footnote{A trap planted at @samp{20i} or
+@samp{-30i} will not be sprung on a page of length @samp{11i}.} and it
+is not hidden by another trap at the same location already planted
+there.
+
+@need 1000
+@cindex page headers
+@cindex page footers
+@cindex headers
+@cindex footers
+@cindex top margin
+@cindex margin, top
+@cindex bottom margin
+@cindex margin, bottom
+A macro package might set headers and footers as follows; this example
+configures vertical margins of one inch to the body text, and one
+half-inch to the titles. Observe the use of the no-break control
+character with @code{sp} request to position our text baselines,
+and the page number character @samp{%} used with the @code{tl} request.
+
+@Example
+.\" hdfo.roff
+.de hd \" page header
+' sp .5i
+' tl '\\*(Ti''\\*(Da' \" title and date strings
+' sp .5i
+..
+.de fo \" page footer
+' sp .5i
+. tl ''%''
+. bp
+..
+.wh 0 hd \" trap at top of the page
+.wh -1i fo \" trap 1 inch from bottom
+@endExample
+
+To use these traps, copy the above (or load it from a file with the
+@code{so} or @code{mso} requests), then set up the strings it uses.
+
+@Example
+.so hdfo.roff
+.ds Ti Final Report\"
+.ds Da 21 May 2023\"
+.ti
+On 5 August of last year,
+this committee tasked me with the investigation of the
+CFIT (controlled flight into terrain) incident of
+.\" @i{...and so on...}
+@endExample
+
+A trap above the top or at or below the bottom of the page can be made
+visible by either moving it into the page area or increasing the page
+length so that the trap is on the page. Negative trap values always use
+the @emph{current} page length; they are not converted to an absolute
+vertical position.
+@cindex page location traps, debugging
+@cindex debugging page location traps
+We can use the @code{ptr} request to dump our page location traps to the
+standard error stream (@pxref{Debugging}). Their positions are reported
+in basic units; an @code{nroff} device example follows.
+
+@Example
+.pl 5i
+.wh -1i xx
+.ptr
+ @error{} xx -240
+.pl 100i
+.ptr
+ @error{} xx -240
+@endExample
+
+It is possible to have more than one trap at the same location (although
+only one at a time can be visible); to achieve this, the traps must be
+defined at different locations, then moved to the same place with the
+@code{ch} request. In the following example, the many empty lines
+caused by the @code{bp} request are not shown in the output.
+
+@Example
+.de a
+. nop a
+..
+.de b
+. nop b
+..
+.de c
+. nop c
+..
+.
+.wh 1i a
+.wh 2i b
+.wh 3i c
+.bp
+ @result{} a b c
+@endExample
+@Example
+.ch b 1i
+.ch c 1i
+.bp
+ @result{} a
+@endExample
+@Example
+.ch a 0.5i
+.bp
+ @result{} a b
+@endExample
+@endDefreq
+
+@Defreg {.t}
+@cindex distance to next vertical position trap register (@code{.t})
+@cindex trap, distance to next vertical position, register (@code{.t})
+The read-only register @code{.t} holds the distance to the next vertical
+position trap. If there are no traps between the current position and
+the bottom of the page, it contains the distance to the page bottom.
+Within a diversion, in the absence of a diversion trap, this distance is
+the largest representable integer in basic units---effectively infinite.
+@endDefreg
+
+@Defreq {ch, name [@Var{dist}]}
+@cindex changing trap location (@code{ch})
+@cindex trap, changing location (@code{ch})
+Change the location of a trap by moving macro @var{name} to new location
+@var{dist}, or by unplanting it altogether if @var{dist} is absent. The
+default scaling unit is @samp{v}. Parameters to @code{ch} are specified
+in the opposite order from @code{wh}. If @var{name} is the earliest
+planted macro of multiple traps at the same location, (re)moving it from
+that location exposes the macro next least recently planted at the same
+place.@footnote{It may help to think of each trap location as
+maintaining a queue; @code{wh} operates on the head of the queue, and
+@code{ch} operates on its tail. Only the trap at the head of the queue
+is visible.}
+
+Changing a trap's location is useful for building up footnotes in a
+diversion to allow more space at the bottom of the page for them.
+
+@c XXX
+
+@ignore
+@Example
+... (simplified) footnote example ...
+@endExample
+@end ignore
+@endDefreq
+
+The same macro can be installed simultaneously at multiple locations;
+however, only the earliest-planted instance---that has not yet been
+deleted with @code{wh}---will be moved by @code{ch}. The following
+example (using an @code{nroff} device) illustrates this behavior. Blank
+lines have been elided from the output.
+
+@Example
+.de T
+Trap sprung at \\n(nlu.
+.br
+..
+.wh 1i T
+.wh 2i T
+foo
+.sp 11i
+.bp
+.ch T 4i
+bar
+.sp 11i
+.bp
+.ch T 5i
+baz
+.sp 11i
+.bp
+.wh 5i
+.ch T 6i
+qux
+.sp 11i
+@endExample
+@Example
+ @result{} foo
+ @result{} Trap sprung at 240u.
+ @result{} Trap sprung at 480u.
+ @result{} bar
+ @result{} Trap sprung at 480u.
+ @result{} Trap sprung at 960u.
+ @result{} baz
+ @result{} Trap sprung at 480u.
+ @result{} Trap sprung at 1200u.
+ @result{} qux
+ @result{} Trap sprung at 1440u.
+@endExample
+
+@Defreg {.ne}
+The read-only register @code{.ne} contains the amount of space that was
+needed in the last @code{ne} request that caused a trap to be sprung;
+it is useful in conjunction with the @code{.trunc} register. @xref{Page
+Control}. Since the @code{.ne} register is set only by traps, it
+doesn't make sense to interpolate it outside of macros called by traps.
+@endDefreg
+
+@Defreg {.trunc}
+@cindex @code{ne} request, and the @code{.trunc} register
+@cindex truncated vertical space register (@code{.trunc})
+A read-only register containing the amount of vertical space truncated
+from an @code{sp} request by the most recently sprung vertical
+position trap, or, if the trap was sprung by an @code{ne} request,
+minus the amount of vertical motion produced by the @code{ne}
+request. In other words, at the point a trap is sprung, it
+represents the difference of what the vertical position would have
+been but for the trap, and what the vertical position actually is.
+Since the @code{.trunc} register is set only by traps, it doesn't make
+sense to interpolate it outside of macros called by traps.
+@endDefreg
+
+@Defreg {.pe}
+@cindex @code{bp} request, and traps (@code{.pe})
+@cindex traps, sprung by @code{bp} request (@code{.pe})
+@cindex page ejection status register (@code{.pe})
+This Boolean-valued, read-only register interpolates@tie{}1 while a page
+is being ejected, and 0@tie{}otherwise.
+
+In the following example, we plant the same trap at the top and the
+bottom of the page. We also make the trap report its name and the
+vertical drawing position.
+
+@Example
+.de T
+.tm \\$0: page \\n%, nl=\\n[nl] .pe=\\n[.pe]
+..
+.ll 46n
+.wh 0 T
+.wh -1v T
+Those who can make you believe absurdities can make you
+commit atrocities. \[em] Voltaire
+ @error{} T: page 1, nl=0 .pe=0
+ @error{} T: page 1, nl=2600 .pe=1
+ @result{} Those who can make you believe absurdities can
+ @result{} make you commit atrocities. -- Voltaire
+@endExample
+@endDefreg
+
+@cindex diversions, and traps
+@cindex traps, and diversions
+When designing macros, keep in mind that diversions and traps do
+normally interact. For example, if a trap calls a header macro (while
+outputting a diversion) that tries to change the font on the current
+page, the effect is not visible before the diversion has completely been
+printed (except for input protected with @code{\!} or @code{\?}) since
+the data in the diversion is already formatted. In most cases, this is
+not the expected behaviour.
+
+@c ---------------------------------------------------------------------
+
+@c BEGIN Keep (roughly) parallel with subsection "The implicit page
+@c trap" of groff(7).
+@node The Implicit Page Trap, Diversion Traps, Page Location Traps, Vertical Position Traps
+@subsubsection The Implicit Page Trap
+@cindex implicit trap
+@cindex trap, implicit
+
+@cindex page break
+@cindex break, page
+@cindex page ejection
+@cindex ejection, page
+If, after starting GNU @code{troff} without loading a macro package, you
+use the @code{ptr} request to dump a list of the active traps to the
+standard error stream,@footnote{@xref{Debugging}.} nothing is reported.
+Yet the @code{.t} register will report a steadily decreasing value with
+every output line your document produces, and once the value of
+@code{.t} gets to within @code{.V} of zero, you will notice that
+something trap-like happens---the page is ejected, a new one begins, and
+the value of @code{.t} becomes large once more.
+
+This @dfn{implicit page trap} always exists in the top-level
+diversion;@footnote{@xref{Diversions}.} it works like a trap in some
+ways but not others. Its purpose is to eject the current page and start
+the next one. It has no name, so it cannot be moved or deleted with
+@code{wh} or @code{ch} requests. You cannot hide it by placing another
+trap at its location, and can move it only by redefining the page length
+with @code{pl}. Its operation is suppressed when vertical page traps
+are disabled with GNU @code{troff}'s @code{vpt} request.
+@c END Keep (roughly) parallel with subsection "The implicit trap" of
+@c groff(7).
+
+@c ---------------------------------------------------------------------
+
+@node Diversion Traps, Input Line Traps, The Implicit Page Trap, Vertical Position Traps
+@subsubsection Diversion Traps
+@cindex diversion traps
+@cindex traps, diversion
+
+A diversion is not formatted in the context of a page, so it lacks page
+location traps; instead it can have a @dfn{diversion trap}. There can
+exist at most one such vertical position trap per diversion.
+
+@Defreq {dt, [@Var{dist} @Var{name}]}
+@cindex @code{.t} register, and diversions
+@cindex setting diversion trap (@code{dt})
+@cindex diversion trap, setting (@code{dt})
+@cindex trap, diversion, setting (@code{dt})
+Set a trap @emph{within} a diversion at location @var{dist}, which is
+interpreted relative to diversion rather than page boundaries. If invoked with
+fewer than two arguments, any diversion trap in the current diversion is
+removed. The register @code{.t} works within diversions. It is an
+error to invoke @code{dt} in the top-level diversion.
+@xref{Diversions}.
+@endDefreq
+
+@c ---------------------------------------------------------------------
+
+@node Input Line Traps, Blank Line Traps, Diversion Traps, Traps
+@subsection Input Line Traps
+@cindex input line traps
+@cindex traps, input line
+
+@DefreqList {it, [@Var{n} @Var{name}]}
+@DefreqListEndx {itc, [@Var{n} @Var{name}]}
+@cindex setting input line trap (@code{it}, @code{itc})
+@cindex input line trap, setting (@code{it}, @code{itc})
+@cindex trap, input line, setting (@code{it}, @code{itc})
+@cindex clearing input line trap (@code{it}, @code{itc})
+@cindex input line trap, clearing (@code{it}, @code{itc})
+@cindex trap, input line, clearing (@code{it}, @code{itc})
+Set an input line trap, calling macro @var{name} after processing the
+next @var{n}@tie{}productive input lines (recall @ref{Manipulating
+Filling and Adjustment}). Any existing input line trap in the
+environment is replaced. Without arguments, @code{it} and @code{itc}
+clear any input line trap that has not yet sprung.
+
+Consider a macro @samp{.ST @var{s n}} which sets the next
+@var{n}@tie{}input lines in the font style@tie{}@var{s}.
+
+@Example
+.de ST \" Use style $1 for next $2 text lines.
+. it \\$2 ES
+. ft \\$1
+..
+.de ES \" end ST
+. ft R
+..
+.ST I 1
+oblique
+face
+.ST I 1
+oblique\c
+face
+ @result{} @i{oblique} face @i{oblique}face @
+@r{(second ``face'' upright)}
+@endExample
+
+@cindex input line traps and interrupted lines (@code{itc})
+@cindex interrupted lines and input line traps (@code{itc})
+@cindex traps, input line, and interrupted lines (@code{itc})
+@cindex lines, interrupted, and input line traps (@code{itc})
+Unlike the @code{ce} and @code{rj} requests, @code{it} counts lines
+interrupted with the @code{\c} escape sequence separately (@pxref{Line
+Continuation}); @code{itc} does not. To see the difference, let's
+change the previous example to use @code{itc} instead.
+
+@Example
+@r{@dots{}}
+. itc \\$2 ES
+@r{@dots{}}
+ @result{} @i{oblique} face @i{obliqueface} @
+@r{(second ``face'' oblique)}
+@endExample
+
+You can think of the @code{ce} and @code{rj} requests as implicitly
+creating an input line trap with @code{itc} that schedules a break when
+the trap is sprung.
+
+@Example
+.de BR
+. br
+. @slanted{internal: disable centering-without-filling}
+..
+.
+.de ce
+. if \\n[.br] .br
+. itc \\$1 BR
+. @slanted{internal: enable centering-without-filling}
+..
+@endExample
+
+@need 500
+Let us consider in more detail the sorts of input lines that are or are
+not ``productive''.
+
+@Example
+.de Trap
+TRAP SPRUNG
+..
+.de Mac
+.if r a \l'5n'
+..
+.it 2 Trap
+.
+foo
+.Mac
+bar
+baz
+.it 1 Trap
+.sp \" moves, but does not write or draw
+qux
+.itc 1 Trap
+\h'5n'\c \" moves, but does not write or draw
+jat
+@endExample
+
+@noindent
+When @samp{Trap} gets called depends on whether the @samp{a} register is
+defined; the control line with the @code{if} request may or may not
+produce written output. We also see that the spacing request @code{sp},
+while certainly affecting the output, does not spring the input line
+trap. Similarly, the horizontal motion escape sequence @code{\h} also
+affected the output, but was not ``written''. Observe that we had to
+follow it with @code{\c} and use @code{itc} to prevent the newline at
+the end of the text line from causing a word break, which, like an
+ordinary space character, counts as written output.
+
+@Example
+$ groff -Tascii input-trap-example.groff
+ @result{} foo bar TRAP SPRUNG baz
+ @result{}
+ @result{} qux TRAP SPRUNG jat TRAP SPRUNG
+$ groff -Tascii -ra1 input-trap-example.groff
+ @result{} foo _____ TRAP SPRUNG bar baz
+ @result{}
+ @result{} qux TRAP SPRUNG jat TRAP SPRUNG
+@endExample
+@endDefreq
+
+Input line traps are associated with the environment
+(@pxref{Environments}); switching to another environment suspends the
+current input line trap, and going back resumes it, restoring the count
+of qualifying lines enumerated in that environment.
+
+@c ---------------------------------------------------------------------
+
+@node Blank Line Traps, Leading Space Traps, Input Line Traps, Traps
+@subsection Blank Line Traps
+@cindex blank line traps
+@cindex traps, blank line
+
+@Defreq {blm, [@Var{name}]}
+@cindex blank line macro (@code{blm})
+Set a blank line trap, calling the macro @var{name} when GNU
+@code{troff} encounters a blank line in an input file, instead of the
+usual behavior (@pxref{Breaking}). A line consisting only of spaces is
+also treated as blank and subject to this trap. If no argument is
+supplied, the default blank line behavior is (re-)established.
+@endDefreq
+
+@c ---------------------------------------------------------------------
+
+@node Leading Space Traps, End-of-input Traps, Blank Line Traps, Traps
+@subsection Leading Space Traps
+@cindex leading space traps
+@cindex traps, leading space
+
+@DefreqList {lsm, [@Var{name}]}
+@DefregItemx {lsn}
+@DefregListEndx {lss}
+@cindex leading spaces macro (@code{lsm})
+Set a leading space trap, calling the macro @var{name} when GNU
+@code{troff} encounters leading spaces in an input line; the implicit
+line break that normally happens in this case is suppressed. If no
+argument is supplied, the default leading space behavior is
+(re-)established (@pxref{Breaking}).
+
+The count of leading spaces on an input line is stored in register
+@code{lsn}, and the amount of corresponding horizontal motion in
+register @code{lss}, irrespective of whether a leading space trap is
+set. When it is, the leading spaces are removed from the input line,
+and no motion is produced before calling @var{name}.
+
+@c XXX The following discussion does not seem to be correct; leading
+@c space traps don't "see" _any_ input tokens. Nothing on the line is
+@c passed to it as arguments, and tokens after leading spaces are
+@c processed normally after the designated macro is interpolated. XXX
+@c
+@c The first thing a leading space macro sees is a token. However, some
+@c escape sequences, like @code{\f} and @code{\m}, are handled on the
+@c fly (@pxref{Gtroff Internals} for a complete list) without creating a
+@c token at all. Consider a line that starts with two spaces followed
+@c by @samp{\fIfoo}. After skipping the spaces, @samp{\fI} is handled
+@c as well such that @code{groff}'s current font is set to @code{I}, but
+@c the leading space macro sees only @samp{foo} without the preceding
+@c @samp{\fI}. If the macro should see the font escape, you have to
+@c ``protect'' it with something that creates a token, like the
+@c dummy character; for example, @samp{\&\fIfoo}.
+@endDefreq
+
+@c ---------------------------------------------------------------------
+
+@node End-of-input Traps, , Leading Space Traps, Traps
+@subsection End-of-input Traps
+@cindex end-of-input traps
+@cindex traps, end-of-input
+
+@Defreq {em, [@Var{name}]}
+@cindex setting end-of-input trap (@code{em})
+@cindex end-of-input trap, setting (@code{em})
+@cindex trap, end-of-input, setting (@code{em})
+@cindex end-of-input macro (@code{em})
+@cindex macro, end-of-input (@code{em})
+Set a trap at the end of input, calling macro @var{name} after the last
+line of the last input file has been processed. If no argument is
+given, any existing end-of-input trap is removed.
+
+For example, if the document had to have a section at the bottom of the
+last page for someone to approve it, the @code{em} request could be
+used.
+
+@Example
+.de approval
+\c
+. ne 3v
+. sp (\\n[.t]u - 3v)
+. in +4i
+. lc _
+. br
+Approved:\t\a
+. sp
+Date:\t\t\a
+..
+.
+.em approval
+@endExample
+
+The @code{\c} in the above example needs explanation. For historical
+reasons (compatibility with @acronym{AT&T} @code{troff}), the
+end-of-input macro exits as soon as it causes a page break if no
+partially collected line remains.@footnote{While processing an
+end-of-input macro, the formatter assumes that the next page break must
+be the last; it goes into ``sudden death overtime''.}
+
+@cindex page break, final
+@cindex break, page, final
+@cindex page ejection, of final page
+@cindex ejection, page, of final page
+Let us assume that there is no @code{\c} in the above @code{approval}
+macro, that the page is full, and last output line has been broken with,
+say, a @code{br} request. Because there is no more room, a @code{ne}
+request at this point causes a page ejection, which in turn makes
+@code{troff} exit immediately as just described. In most situations,
+this is not desired; people generally want to format the input after
+@code{ne}.
+
+To force processing of the whole end-of-input macro independently of
+this behavior, it is thus advisable to (invisibly) ensure the existence
+of a partially collected line (@code{\c}) whenever there is a chance
+that a page break can happen. In the above example, invoking the
+@code{ne} request ensures that there is room for the subsequent
+formatted output on the same page, so we need insert @code{\c} only
+once.
+
+The next example shows how to append three lines, then start a new page
+unconditionally. Since @w{@samp{.ne 1}} doesn't give the desired
+effect---there is always one line available or we are already at the
+beginning of the next page---we temporarily increase the page length by
+one line so that we can use @w{@samp{.ne 2}}.
+
+@Example
+.de EM
+.pl +1v
+\c
+.ne 2
+line one
+.br
+\c
+.ne 2
+line two
+.br
+\c
+.ne 2
+line three
+.br
+.pl -1v
+\c
+'bp
+..
+.em EM
+@endExample
+
+This specific feature affects only the first potential page break caused
+by the end-of-input macro; further page breaks emitted by the macro are
+handled normally.
+
+Another possible use of the @code{em} request is to make GNU
+@code{troff} emit a single large page instead of multiple pages. For
+example, one may want to produce a long plain text file for reading
+in a terminal or emulator without page footers and headers interrupting
+the body of the document. One approach is to set the page length at the
+beginning of the document to a very large value to hold all the
+text,@footnote{Another, taken by the @code{groff} @code{man} macros, is
+to intercept @code{ne} requests and wrap @code{bp} ones.} and
+automatically adjust it to the exact height of the document after the
+text has been output.
+
+@Example
+.de adjust-page-length
+. br
+. pl \\n[nl]u \" \n[nl]: current vertical position
+..
+.
+.de single-page-mode
+. pl 99999
+. em adjust-page-length
+..
+.
+.\" Activate the above code if configured.
+.if \n[do-continuous-rendering] \
+. single-page-mode
+@endExample
+
+Since only one end-of-input trap exists and another macro package may
+already use it, care must be taken not to break the mechanism. A simple
+solution would be to append the above macro to the macro package's
+end-of-input macro using the @code{am} request.
+@endDefreq
+
+
+@c =====================================================================
+
+@c BEGIN Keep (roughly) parallel with subsection "Diversions" of
+@c groff(7).
+@node Diversions, Punning Names, Traps, GNU troff Reference
+@section Diversions
+@cindex diversions
+
+In @code{roff} systems it is possible to format text as if for output,
+but instead of writing it immediately, one can @dfn{divert} the
+formatted text into a named storage area. It is retrieved later by
+specifying its name after a control character. The same name space is
+used for such @slanted{diversions} as for strings and macros; see
+@ref{Identifiers}. Such text is sometimes said to be ``stored in a
+macro'', but this coinage obscures the important distinction between
+macros and strings on one hand and diversions on the other; the former
+store @emph{unformatted} input text, and the latter capture
+@emph{formatted} output. Diversions also do not interpret arguments.
+Applications of diversions include ``keeps'' (preventing a page break
+from occurring at an inconvenient place by forcing a set of output lines
+to be set as a group), footnotes, tables of contents, and indices.
+@cindex top-level diversion
+@cindex diversion, top-level
+For orthogonality it is said that GNU @code{troff} is in the
+@dfn{top-level diversion} if no diversion is active (that is, formatted
+output is being ``diverted'' immediately to the output device).
+
+Dereferencing an undefined diversion will create an empty one of that
+name and cause a warning in category @samp{mac} to be emitted.
+@xref{Warnings}, for information about the enablement and suppression of
+warnings. A diversion does not exist for the purpose of testing with
+the @code{d} conditional operator until its initial definition ends
+(@pxref{Operators in Conditionals}). The following requests are used to
+create and alter diversions.
+@c END Keep (roughly) parallel with subsection "Diversions" of groff(7).
+
+@DefreqList {di, [@Var{name}]}
+@DefreqListEndx {da, [@Var{name}]}
+@cindex beginning diversion (@code{di}, @code{box})
+@cindex diversion, beginning (@code{di}, @code{box})
+@cindex ending diversion (@code{di}, @code{box})
+@cindex diversion, ending (@code{di}, @code{box})
+@cindex appending to a diversion (@code{da}, @code{boxa})
+@cindex diversion, appending to (@code{da}, @code{boxa})
+Start collecting formatted output in a diversion called @var{name}. The
+@code{da} request appends to a diversion called @var{name}, creating it
+if necessary. If @var{name} already exists as an alias, the target of
+the alias is replaced or appended to; recall @ref{Strings}. The pending
+output line is diverted as well. Switching to another environment (with
+the @code{ev} request) before invoking @code{di} or @code{da} avoids
+including any pending output line in the diversion; see
+@ref{Environments}.
+
+Invoking @code{di} or @code{da} without an argument stops diverting
+output to the diversion named by the most recent corresponding request.
+If @code{di} or @code{da} is called without an argument when there is no
+current diversion, a warning in category @samp{di} is produced.
+@xref{Warnings}, for information about the enablement and suppression
+of warnings.
+
+@Example
+Before the diversion.
+.di yyy
+In the diversion.
+.br
+.di
+After the diversion.
+.br
+ @result{} After the diversion.
+.yyy
+ @result{} Before the diversion. In the diversion.
+@endExample
+@endDefreq
+
+@cindex box (diversion operation)
+GNU @code{troff} supports @dfn{box} requests to exclude a partially
+collected line from a diversion, as this is often desirable.
+
+@DefreqList {box, [@Var{name}]}
+@DefreqListEndx {boxa, [@Var{name}]}
+Divert (or append) output to @var{name}, similarly to the @code{di} and
+@code{da} requests, respectively. Any pending output line is @emph{not}
+included in the diversion. Without an argument, stop diverting output;
+any pending output line inside the diversion is discarded.
+
+@Example
+Before the box.
+.box xxx
+In the box.
+.br
+Hidden treasure.
+.box
+After the box.
+.br
+ @result{} Before the box. After the box.
+.xxx
+ @result{} In the box.
+@endExample
+@endDefreq
+
+Apart from pending output line inclusion and the request names that
+populate them, boxes are handled exactly as diversions are. All of the
+following @code{groff} language elements can be used with them
+interchangeably.
+
+@DefregList {.z}
+@DefregListEndx {.d}
+@cindex @code{nl} register, and @code{.d}
+@cindex nested diversions
+@cindex diversion, nested
+@cindex diversion name register (@code{.z})
+@cindex vertical position in diversion register (@code{.d})
+@cindex position, vertical, in diversion, register (@code{.d})
+@cindex diversion, vertical position in, register (@code{.d})
+Diversions may be nested. The read-only string-valued register
+@code{.z} contains the name of the current diversion. The read-only
+register @code{.d} contains the current vertical place in the diversion.
+If the input text is not being diverted, @code{.d} reports the same
+location as the register @code{nl}.
+@endDefreg
+
+@Defreg {.h}
+@cindex high-water mark register (@code{.h})
+@cindex mark, high-water, register (@code{.h})
+@cindex position of lowest text line (@code{.h})
+@cindex text line, position of lowest (@code{.h})
+The read-only register @code{.h} stores the @dfn{high-water mark} on the
+current page or in the current diversion. It corresponds to the text
+baseline of the lowest line on the page.@footnote{Thus, the ``water''
+gets ``higher'' proceeding @emph{down} the page.}
+
+@Example
+.tm .h==\n[.h], nl==\n[nl]
+ @result{} .h==0, nl==-1
+This is a test.
+.br
+.sp 2
+.tm .h==\n[.h], nl==\n[nl]
+ @result{} .h==40, nl==120
+@endExample
+
+@cindex @code{.h} register, difference from @code{nl}
+@cindex @code{nl} register, difference from @code{.h}
+@noindent
+As implied by the example, vertical motion does not produce text
+baselines and thus does not increase the value interpolated by
+@samp{\n[.h]}.
+@endDefreg
+
+@DefregList {dn}
+@DefregListEndx {dl}
+@cindex @code{dn} register, and @code{da} (@code{boxa})
+@cindex @code{dl} register, and @code{da} (@code{boxa})
+@cindex @code{da} request, and @code{dn} (@code{dl})
+@cindex @code{boxa} request, and @code{dn} (@code{dl})
+After completing a diversion, the writable registers @code{dn} and
+@code{dl} contain its vertical and horizontal sizes. Only the lines
+just processed are counted: for the computation of @code{dn} and
+@code{dl}, the requests @code{da} and @code{boxa} are handled as if
+@code{di} and @code{box} had been used, respectively---lines that have
+been already stored in the diversion (box) are not taken into account.
+
+@Example
+.\" Center text both horizontally and vertically.
+.\" Macro .(c starts centering mode; .)c terminates it.
+.
+.\" Disable the escape character with .eo so that we
+.\" don't have to double backslashes on the "\n"s.
+.eo
+.de (c
+. br
+. ev (c
+. evc 0
+. in 0
+. nf
+. di @@c
+..
+@endExample
+@Example
+.de )c
+. br
+. ev
+. di
+. nr @@s (((\n[.t]u - \n[dn]u) / 2u) - 1v)
+. sp \n[@@s]u
+. ce 1000
+. @@c
+. ce 0
+. sp \n[@@s]u
+. br
+. fi
+. rr @@s
+. rm @@c
+..
+.ec
+@endExample
+@endDefreg
+
+@DefescList {\\!, , anything, }
+@DefescListEndx {\\?, , anything, \\?}
+@cindex transparent output (@code{\!}, @code{\?})
+@cindex output, transparent (@code{\!}, @code{\?})
+@dfn{Transparently} embed @var{anything} into the current diversion,
+preventing requests, macro calls, and escape sequences from being
+interpreted when read into a diversion. This is useful for preventing
+them from taking effect until the diverted text is actually output. The
+@code{\!} escape sequence transparently embeds input up to and including
+the end of the line. The @code{\?} escape sequence transparently embeds
+input until its own next occurrence.
+
+@cindex @code{\?}, and copy mode
+@cindex copy mode, and @code{\?}
+@cindex mode, copy, and @code{\?}
+@cindex @code{\!}, and copy mode
+@cindex copy mode, and @code{\!}
+@cindex mode, copy, and @code{\!}
+@noindent
+@var{anything} may not contain newlines; use @code{\!} by itself to
+embed newlines in a diversion. The escape sequence @code{\?} is also
+recognized in copy mode and turned into a single internal code; it is
+this code that terminates @var{anything}. Thus the following example
+prints@tie{}4.
+
+@Example
+.nr x 1
+.nf
+.di d
+\?\\?\\\\?\\\\\\\\nx\\\\?\\?\?
+.di
+.nr x 2
+.di e
+.d
+.di
+.nr x 3
+.di f
+.e
+.di
+.nr x 4
+.f
+@endExample
+
+Both escape sequences read the data in copy mode.
+
+@cindex @code{\!}, in top-level diversion
+@cindex top-level diversion, and @code{\!}
+@cindex diversion, top-level, and @code{\!}
+If @code{\!} is used in the top-level diversion, its argument is
+directly embedded into GNU @code{troff}'s intermediate output. This can
+be used, for example, to control a postprocessor that processes the data
+before it is sent to an output driver.
+
+@cindex @code{\?}, in top-level diversion
+@cindex top-level diversion, and @code{\?}
+@cindex diversion, top-level, and @code{\?}
+The @code{\?} escape used in the top-level diversion produces no output
+at all; its argument is simply ignored.
+@endDefesc
+
+@cindex @code{\!}, and @code{output} request
+@cindex @code{output} request, and @code{\!}
+@cindex @code{output} request, and copy mode
+@cindex copy mode, and @code{output} request
+@cindex mode, copy, and @code{output} request
+@Defreq {output, contents}
+Emit @var{contents} directly to GNU @code{troff}'s intermediate output
+(subject to copy mode interpretation); this is similar to @code{\!} used
+at the top level. An initial neutral double quote in @var{contents} is
+stripped to allow embedding of leading spaces.
+
+This request can't be used before the first page has started---if you
+get an error, simply insert @code{.br} before the @code{output} request.
+
+Use with caution! It is normally only needed for mark-up used by a
+postprocessor that does something with the output before sending it to
+the output device, filtering out @var{contents} again.
+@endDefreq
+
+@Defreq {asciify, div}
+@cindex unformatting diversions (@code{asciify})
+@cindex diversion, unformatting (@code{asciify})
+@cindex @code{trin} request, and @code{asciify}
+@dfn{Unformat} the diversion @var{div} in a way such that Unicode basic
+Latin (@acronym{ASCII}) characters, characters translated with the
+@code{trin} request, space characters, and some escape sequences, that
+were formatted and diverted into @var{div} are treated like ordinary
+input characters when @var{div} is reread. Doing so can be useful in
+conjunction with the @code{writem} request. @code{asciify} can be also
+used for gross hacks; for example, the following sets
+register@tie{}@code{n} to@tie{}1.
+
+@Example
+.tr @@.
+.di x
+@@nr n 1
+.br
+.di
+.tr @@@@
+.asciify x
+.x
+@endExample
+
+@code{asciify} cannot return all items in a diversion to their source
+equivalent: nodes such as those produced by the @code{\N} escape
+sequence will remain nodes, so the result cannot be guaranteed to be a
+pure string. @xref{Copy Mode}. Glyph parameters such as the type face
+and size are not preserved; use @code{unformat} to achieve that.
+@endDefreq
+
+@Defreq {unformat, div}
+Like @code{asciify}, unformat the diversion @var{div}. However,
+@code{unformat} handles only tabs and spaces between words, the latter
+usually arising from spaces or newlines in the input. Tabs are treated
+as input tokens, and spaces become adjustable again. The vertical sizes
+of lines are not preserved, but glyph information (font, type size,
+space width, and so on) is retained.
+@endDefreq
+
+
+@c =====================================================================
+
+@node Punning Names, Environments, Diversions, GNU troff Reference
+@section Punning Names
+@cindex diversions
+
+Macros, strings, and diversions share a name space; recall
+@ref{Identifiers}. Internally, the same mechanism is used to store
+them. You can thus call a macro with string interpolation syntax and
+vice versa.
+
+@Example
+.de subject
+Typesetting
+..
+.de predicate
+rewards attention to detail
+..
+\*[subject] \*[predicate].
+Truly.
+ @result{} Typesetting
+ @result{} rewards attention to detail Truly.
+@endExample
+
+@noindent
+What went wrong? Strings don't contain newlines, but macros do. String
+interpolation placed a newline at the end of @samp{\*[subject]}, and the
+next thing on the input was a space. Then when @samp{\*[predicate]} was
+interpolated, it was followed by the empty request @samp{.} on a line by
+itself. If we want to use macros as strings, we must take interpolation
+behavior into account.
+
+@Example
+.de subject
+Typesetting\\
+..
+.de predicate
+rewards attention to detail\\
+..
+\*[subject] \*[predicate].
+Truly.
+ @result{} Typesetting rewards attention to detail. Truly.
+@endExample
+
+@noindent
+By ending each text line of the macros with an escaped
+@code{\@key{RET}}, we get the desired effect (@pxref{Line
+Continuation}).@footnote{The backslash is doubled. @xref{Copy Mode}.}
+What would have happened if we had used only one backslash at a time
+instead?
+
+Interpolating a string does not hide existing macro arguments. We can
+also place the escaped newline outside the string interpolation instead
+of within the string definition. Thus, in a macro, a more efficient way
+of doing
+
+@Example
+.xx \\$@@
+@endExample
+
+@noindent
+is
+
+@Example
+\\*[xx]\\
+@endExample
+
+@noindent
+The latter calling syntax doesn't change the value of @code{\$0}, which
+is then inherited from the calling macro (@pxref{Parameters}).
+
+Diversions can be also called with string syntax. It is sometimes
+convenient to copy one-line diversions to a string.
+
+@Example
+.di xx
+the
+.ft I
+interpolation system
+.ft
+.br
+.di
+.ds yy This is a test of \*(xx\c
+\*(yy.
+ @result{} This is a test of the @i{interpolation system}.
+@endExample
+
+@noindent
+As the previous example shows, it is possible to store formatted output
+in strings. The @code{\c} escape sequence prevents the subsequent
+newline from being interpreted as a break (again,
+@pxref{Line Continuation}).
+
+Copying multi-output line diversions produces unexpected results.
+
+@Example
+.di xxx
+a funny
+.br
+test
+.br
+.di
+.ds yyy This is \*[xxx]\c
+\*[yyy].
+ @result{} test This is a funny.
+@endExample
+
+Usually, it is not predictable whether a diversion contains one or more
+output lines, so this mechanism should be avoided. With @acronym{AT&T}
+@code{troff}, this was the only solution to strip off a final newline
+from a diversion. Another disadvantage is that the spaces in the copied
+string are already formatted, preventing their adjustment. This can
+cause ugly results.
+
+@cindex stripping final newline in diversions
+@cindex diversion, stripping final newline
+@cindex final newline, stripping in diversions
+@cindex newline, final, stripping in diversions
+@cindex horizontal space, unformatting
+@cindex space, horizontal, unformatting
+@cindex unformatting horizontal space
+A clean solution to this problem is available in GNU @code{troff}, using
+the requests @code{chop} to remove the final newline of a diversion, and
+@code{unformat} to make the horizontal spaces adjustable again.
+
+@Example
+.box xxx
+a funny
+.br
+test
+.br
+.box
+.chop xxx
+.unformat xxx
+This is \*[xxx].
+ @result{} This is a funny test.
+@endExample
+
+@xref{Gtroff Internals}.
+
+@c =====================================================================
+
+@c BEGIN Keep parallel with section "Environments" of groff(7).
+@node Environments, Suppressing Output, Diversions, GNU troff Reference
+@section Environments
+@cindex environments
+
+As discussed in @ref{Deferring Output}, environments store most of the
+parameters that determine the appearance of text. A default environment
+named @samp{0} exists when GNU @code{troff} starts up; it is modified by
+formatting-related requests and escape sequences.
+
+@cindex stack
+You can create new environments and switch among them. Only one is
+current at any given time. Active environments are managed using a
+@dfn{stack}, a data structure supporting ``push'' and ``pop''
+operations. The current environment is at the top of the stack.
+The same environment name can be pushed onto the stack multiple times,
+possibly interleaved with others. Popping the environment stack does
+not destroy the current environment; it remains accessible by name and
+can be made current again by pushing it at any time. Environments
+cannot be renamed or deleted, and can only be modified when current. To
+inspect the environment stack, use the @code{pev} request; see
+@ref{Debugging}.
+
+Environments store the following information.
+
+@itemize @bullet
+@item
+a partially collected line, if any
+
+@item
+data about the most recently output glyph and line (registers
+@code{.cdp}, @code{.cht}, @code{.csk}, @code{.n}, @code{.w})
+
+@item
+typeface parameters (size, family, style, height and slant, inter-word
+and inter-sentence space sizes)
+
+@item
+page parameters (line length, title length, vertical spacing, line
+spacing, indentation, line numbering, centering, right-alignment,
+underlining, hyphenation parameters)
+
+@item
+filling enablement; adjustment enablement and mode
+
+@item
+tab stops; tab, leader, escape, control, no-break control, hyphenation,
+and margin characters
+
+@item
+input line traps
+
+@item
+stroke and fill colors
+@end itemize
+@c END Keep parallel with section "Environments" of groff(7).
+
+@DefreqList {ev, [@Var{ident}]}
+@DefregListEndx {.ev}
+@cindex switching environments (@code{ev})
+@cindex environment, switching (@code{ev})
+@cindex environment number/name register (@code{.ev})
+Enter the environment @var{ident}, which is created if it does not
+already exist, using the same parameters as for the default environment
+used at startup. With no argument, GNU @code{troff} switches to the
+previous environment.
+
+Invoking @code{ev} with an argument puts environment @var{ident} onto
+the top of the environment stack. (If it isn't already present in the
+stack, this is a proper push.) Without an argument, @code{ev} pops the
+environment stack, making the previous environment current. It is an
+error to pop the environment stack with no previous environment
+available. The read-only string-valued register @code{.ev} contains the
+name of the current environment---the one at the top of the stack.
+
+@Example
+.ev footnote-env
+.fam N
+.ps 6
+.vs 8
+.ll -.5i
+.ev
+
+@r{@dots{}}
+
+.ev footnote-env
+\[dg] Observe the smaller text and vertical spacing.
+.ev
+@endExample
+
+We can familiarize ourselves with stack behavior by wrapping the
+@code{ev} request with a macro that reports the contents of the
+@code{.ev} register to the standard error stream.
+
+@Example
+.de EV
+. ev \\$1
+. tm environment is now \\n[.ev]
+..
+.
+.EV foo
+.EV bar
+.EV
+.EV baz
+.EV
+.EV
+.EV
+@endExample
+
+@Example
+ @error{} environment is now foo
+ @error{} environment is now bar
+ @error{} environment is now foo
+ @error{} environment is now baz
+ @error{} environment is now foo
+ @error{} environment is now 0
+ @error{} error: environment stack underflow
+ @error{} environment is now 0
+@endExample
+
+@endDefreq
+
+@Defreq {evc, environment}
+@cindex copying environment (@code{evc})
+@cindex environment, copying (@code{evc})
+Copy the contents of @var{environment} to the current environment.
+
+The following environment data are not copied.
+
+@itemize @bullet
+@item
+a partially collected line, if present;
+
+@item
+the interruption status of the previous input line (due to use of the
+@code{\c} escape sequence);
+
+@item
+the count of remaining lines to center, to right-justify, or to
+underline (with or without underlined spaces)---these are set to zero;
+
+@item
+the activation status of temporary indentation;
+
+@item
+input line traps and their associated data;
+
+@item
+the activation status of line numbering (which can be reactivated with
+@w{@samp{.nm +0}}); and
+
+@item
+the count of consecutive hyphenated lines (set to zero).
+@end itemize
+@endDefreq
+
+@DefregList {.w}
+@DefregItemx {.cht}
+@DefregItemx {.cdp}
+@DefregListEndx {.csk}
+@cindex environment, dimensions of last glyph (@code{.w}, @code{.cht}, @code{.cdp}, @code{.csk})
+@cindex width, of last glyph (@code{.w})
+@cindex height, of last glyph (@code{.cht})
+@cindex depth, of last glyph (@code{.cdp})
+@cindex skew, of last glyph (@code{.csk})
+@cindex last glyph, dimensions (@code{.w}, @code{.cht}, @code{.cdp}, @code{.csk})
+@cindex glyph, last, dimensions (@code{.w}, @code{.cht}, @code{.cdp}, @code{.csk})
+The @code{\n[.w]} register contains the width of the last glyph
+formatted in the environment.
+
+The @code{\n[.cht]} register contains the height of the last glyph
+formatted in the environment.
+
+The @code{\n[.cdp]} register contains the depth of the last glyph
+formatted in the environment. It is positive for glyphs extending below
+the baseline.
+
+The @code{\n[.csk]} register contains the @dfn{skew} (how far to the
+right of the glyph's center that GNU @code{troff} should place an
+accent) of the last glyph formatted in the environment.
+@endDefreg
+
+@Defreg {.n}
+@cindex environment, previous line length (@code{.n})
+@cindex line length, previous (@code{.n})
+@cindex length of previous line (@code{.n})
+@cindex previous line length (@code{.n})
+The @code{\n[.n]} register contains the length of the previous output
+line emitted in the environment.
+@endDefreg
+
+@codequotebacktick off
+@codequoteundirected off
+
+
+@c =====================================================================
+
+@node Suppressing Output, Colors, Environments, GNU troff Reference
+@section Suppressing Output
+
+@Defesc {\\O, [, num, ]}
+@cindex suppressing output (@code{\O})
+@cindex output, suppressing (@code{\O})
+Suppress GNU @code{troff} output of glyphs and geometric objects. The
+sequences @code{\O2}, @code{\O3}, @code{\O4}, and @code{\O5} are
+intended for internal use by @code{grohtml}.
+
+@table @samp
+@item \O0
+Disable the emission of glyphs and geometric objects to the output
+driver, provided that this sequence occurs at the outermost suppression
+level (see @code{\O3} and @code{\04} below). Horizontal motions
+corresponding to non-overstruck glyph widths still occur.
+
+@item \O1
+Enable the emission of glyphs and geometric objects to the output
+driver, provided that this sequence occurs at the outermost suppression
+level.
+@end table
+
+@vindex opminx
+@vindex opminy
+@vindex opmaxx
+@vindex opmaxy
+@code{\O0} and @code{\O1} also reset the four registers @code{opminx},
+@code{opminy}, @code{opmaxx}, and @code{opmaxy} to @minus{}1. These
+four registers mark the top left and bottom right hand corners of a box
+encompassing all written or drawn output.
+
+@table @samp
+@item \O2
+At the outermost suppression level, enable emission of glyphs and
+geometric objects, and write to the standard error stream the page
+number and values of the four aforementioned registers encompassing
+glyphs written since the last interpolation of a @code{\O} sequence, as
+well as the page offset, line length, image file name (if any),
+horizontal and vertical device motion quanta, and input file name.
+Numeric values are in basic units.
+
+@item \O3
+Begin a nested suppression level. @command{grohtml} uses this mechanism
+to create images of output preprocessed with @command{gpic},
+@command{geqn}, and @command{gtbl}. At startup, GNU @code{troff} is at
+the outermost suppression level. @command{pre-grohtml} generates these
+sequences when processing the document, using GNU @command{troff} with
+the @code{ps} output device, Ghostscript, and the PNM tools to produce
+images in PNG format. They start a new page if the device is not
+@code{html} or @code{xhtml}, to reduce the number of images crossing a
+page boundary.
+
+@item \O4
+End a nested suppression level.
+@end table
+
+@table @samp
+@item \O[5@var{P}@var{file}]
+At the outermost suppression level, write the name @code{file} to the
+standard error stream at position @var{P}, which must be one of
+@code{l}, @code{r}, @code{c}, or@tie{}@code{i}, corresponding to left,
+right, centered, and inline alignments within the document,
+respectively. @var{file} is a name associated with the production of
+the next image.
+@end table
+@endDefesc
+
+@Defreg {.O}
+@cindex suppression nesting level register
+@cindex nesting level, suppression, register
+@cindex level, suppression nesting, register
+Output suppression nesting level applied by @code{\O3} and @code{\O4}
+escape sequences.
+@endDefreg
+
+@c =====================================================================
+
+@codequotebacktick on
+@codequoteundirected on
+
+@c TODO: Rename this node to "Operating Environment Access" or similar,
+@c and move the date/time, process ID, etc., read-only registers here.
+@node I/O, Postprocessor Access, Suppressing Output, GNU troff Reference
+@section I/O
+@cindex i/o
+@cindex input and output requests
+@cindex requests for input and output
+@cindex output and input requests
+
+@code{gtroff} has several requests for including files:
+
+@DefreqList {so, file}
+@DefreqListEndx {soquiet, file}
+@cindex including a file (@code{so})
+@cindex file, inclusion (@code{so})
+Replace the @code{so} request's control line with the contents of the
+file named by the argument, ``sourcing'' it. @var{file} is sought in
+the directories specified by @option{-I} command-line option. If
+@var{file} does not exist, a warning in category @samp{file} is produced
+and the request has no further effect. @xref{Warnings}, for
+information about the enablement and suppression of warnings.
+
+@code{so} can be useful for large documents; e.g., allowing each chapter
+of a book to be kept in a separate file. However, files interpolated
+with @code{so} are not preprocessed; to overcome this limitation, see
+the @cite{gsoelim@r{(1)}} man page.
+
+Since GNU @code{troff} replaces the entire control line with the
+contents of a file, it matters whether @code{file} is terminated with a
+newline or not. Assume that file @file{xxx} contains only the word
+@samp{foo} without a trailing newline.
+
+@Example
+$ printf 'foo' > xxx
+
+The situation is
+.so xxx
+bar.
+ @result{} The situation is foobar.
+@endExample
+
+@code{soquiet} works the same way, except that no warning diagnostic is
+issued if @var{file} does not exist.
+@endDefreq
+
+@Defreq {pso, command}
+Read the standard output from the specified @var{command} and include
+it in place of the @code{pso} request.
+
+@cindex safer mode
+@cindex mode, safer
+@cindex unsafe mode
+@cindex mode, unsafe
+It is an error to use this request in safer mode, which is the
+default. Invoke GNU @code{troff} or a front end with the @option{-U}
+option to enable unsafe mode.
+
+The comment regarding a final newline for the @code{so} request is valid
+for @code{pso} also.
+@endDefreq
+
+@DefreqList {mso, file}
+@DefreqListEndx {msoquiet, file}
+Identical to the @code{so} and @code{soquiet} requests, respectively,
+except that @code{gtroff} searches for the specified @var{file} in the
+same directories as macro files for the @option{-m} command-line option.
+If the file name to be included has the form @file{@var{name}.tmac} and
+it isn't found, these requests try to include @file{tmac.@var{name}} and
+vice versa.
+@endDefreq
+
+@DefreqList {trf, file}
+@DefreqListEndx {cf, file}
+@cindex transparent output (@code{cf}, @code{trf})
+@cindex output, transparent (@code{cf}, @code{trf})
+@cindex @code{cf} request, and copy mode
+@cindex copy mode, and @code{cf} request
+@cindex mode, copy, and @code{cf} request
+@cindex @code{trf} request, and copy mode
+@cindex copy mode, and @code{trf} request
+@cindex mode, copy, and @code{trf} request
+Transparently output the contents of @var{file}. Each line is output as
+if it were preceded by @code{\!}; however, the lines are @emph{not}
+subject to copy mode interpretation. If the file does not end with a
+newline, @code{trf} adds one. Both requests cause a break.
+
+When used in a diversion, these requests embed a node (@pxref{Gtroff
+Internals}) in it that, when reread, causes the contents of @var{file}
+to be transparently copied to the output. In @acronym{AT&T}
+@code{troff}, the contents of @var{file} are immediately copied to the
+output regardless of whether there is a current diversion; this
+behaviour is so anomalous that it must be considered a bug.
+
+@cindex @code{trf} request, and invalid characters
+@cindex characters, invalid for @code{trf} request
+@cindex invalid characters for @code{trf} request
+While @code{cf} copies the contents of @var{file} completely
+unprocessed, @code{trf} disallows characters such as NUL that are not
+valid @code{gtroff} input characters (@pxref{Identifiers}).
+
+For @code{cf}, within a diversion, ``completely unprocessed'' means that
+each line of a file to be inserted is handled as if it were preceded by
+@code{\!\\!}.
+
+To define a macro@tie{}@code{x} containing the contents of
+file@tie{}@file{f}, use
+
+@Example
+.ev 1
+.di x
+.trf f
+.di
+.ev
+@endExample
+
+@noindent
+The calls to @code{ev} prevent the partially collected output line
+from becoming part of the diversion (@pxref{Diversions}).
+@endDefreq
+
+@Defreq {nx, [@Var{file}]}
+@cindex processing next file (@code{nx})
+@cindex file, processing next (@code{nx})
+@cindex next file, processing (@code{nx})
+Force @code{gtroff} to continue processing of the file specified as an
+argument. If no argument is given, immediately jump to the end of file.
+@endDefreq
+
+@Defreq {rd, [@Var{prompt} [@Var{arg1} @Var{arg2} @dots{}]]}
+@cindex reading from standard input (@code{rd})
+@cindex standard input, reading from (@code{rd})
+@cindex input, standard, reading from (@code{rd})
+Read from standard input, and include what is read as though it were
+part of the input file. Text is read until a blank line is encountered.
+
+If standard input is a TTY input device (keyboard), write @var{prompt}
+to standard error, followed by a colon (or send BEL for a beep if no
+argument is given).
+
+Arguments after @var{prompt} are available for the input. For example,
+the line
+
+@Example
+.rd data foo bar
+@endExample
+
+with the input @w{@samp{This is \$2.}} prints
+
+@Example
+This is bar.
+@endExample
+@endDefreq
+
+@cindex form letters
+@cindex letters, form
+Using the @code{nx} and @code{rd} requests, it is easy to set up form
+letters. The form letter template is constructed like this, putting the
+following lines into a file called @file{repeat.let}:
+
+@Example
+.ce
+\*(td
+.sp 2
+.nf
+.rd
+.sp
+.rd
+.fi
+Body of letter.
+.bp
+.nx repeat.let
+@endExample
+
+@cindex @code{ex} request, used with @code{nx} and @code{rd}
+@noindent
+When this is run, a file containing the following lines should be
+redirected in. Requests included in this file are executed as though
+they were part of the form letter. The last block of input is the
+@code{ex} request, which tells GNU @code{troff} to stop processing. If
+this were not there, @code{troff} would not know when to stop.
+
+@Example
+Trent A. Fisher
+708 NW 19th Av., #202
+Portland, OR 97209
+
+Dear Trent,
+
+Len Adollar
+4315 Sierra Vista
+San Diego, CA 92103
+
+Dear Mr. Adollar,
+
+.ex
+@endExample
+
+@Defreq {pi, pipe}
+Pipe the output of @code{gtroff} to the shell command(s) specified by
+@var{pipe}. This request must occur before @code{gtroff} has a chance
+to print anything.
+
+@cindex safer mode
+@cindex mode, safer
+@cindex unsafe mode
+@cindex mode, unsafe
+It is an error to use this request in safer mode, which is the
+default. Invoke GNU @code{troff} or a front end with the @option{-U}
+option to enable unsafe mode.
+
+Multiple calls to @code{pi} are allowed, acting as a chain. For
+example,
+
+@Example
+.pi foo
+.pi bar
+...
+@endExample
+
+is the same as @w{@samp{.pi foo | bar}}.
+
+@cindex @code{groff}, and @code{pi} request
+@cindex @code{pi} request, and @code{groff}
+The intermediate output format of GNU @code{troff} is piped to the
+specified commands. Consequently, calling @code{groff} without the
+@option{-Z} option normally causes a fatal error.
+@endDefreq
+
+@cindex system commands, running
+@cindex running system commands
+@DefreqList {sy, cmds}
+@DefregListEndx {systat}
+Execute the shell command(s) specified by @var{cmds}. The output is not
+saved anywhere, so it is up to the user to do so.
+
+@cindex safer mode
+@cindex mode, safer
+@cindex unsafe mode
+@cindex mode, unsafe
+It is an error to use this request in safer mode; this is the default.
+Give GNU @code{troff} or a front end program the @option{-U} option to
+enable unsafe mode.
+
+The following code fragment introduces the current time into a document.
+
+@pindex perl
+@Example
+.sy perl -e 'printf ".nr H %d\\n.nr M %d\\n.nr S %d\\n",\
+ (localtime(time))[2,1,0]' > /tmp/x\n[$$]
+.so /tmp/x\n[$$]
+.sy rm /tmp/x\n[$$]
+\nH:\nM:\nS
+@endExample
+
+@noindent
+This works by having the Perl script (run by @code{sy}) write
+@code{nr} requests that set the registers @code{H}, @code{M}, and
+@code{S} to a temporary file. The @code{roff} document then reads the
+temporary file using the @code{so} request.
+
+@cindex time, formatting
+@cindex formatting the time
+The registers @code{seconds}, @code{minutes}, and @code{hours},
+initialized at startup of GNU @code{troff}, should satisfy most
+requirements. Use the @code{af} request to format their values for
+output.
+
+@Example
+.af hours 00
+.af minutes 00
+.af seconds 00
+\n[hours]:\n[minutes]:\n[seconds]
+ @result{} 02:17:54
+@endExample
+
+@cindex @code{system()} return value register (@code{systat})
+The writable register @code{systat} contains the return value of the
+@code{system()} function executed by the last @code{sy} request.
+@endDefreq
+
+@DefreqList {open, stream file}
+@DefreqListEndx {opena, stream file}
+@cindex opening file (@code{open})
+@cindex file, opening (@code{open})
+@cindex appending to a file (@code{opena})
+@cindex file, appending to (@code{opena})
+Open the specified @var{file} for writing and associates the specified
+@var{stream} with it.
+
+The @code{opena} request is like @code{open}, but if the file exists,
+append to it instead of truncating it.
+
+@cindex safer mode
+@cindex mode, safer
+@cindex unsafe mode
+@cindex mode, unsafe
+It is an error to use these requests in safer mode; this is the default.
+Give GNU @code{troff} or a front end program the @option{-U} option to
+enable unsafe mode.
+@endDefreq
+
+@DefreqList {write, stream data}
+@DefreqListEndx {writec, stream data}
+@cindex copy mode, and @code{write} request
+@cindex @code{write} request, and copy mode
+@cindex mode, copy, and @code{write} request
+@cindex copy mode, and @code{writec} request
+@cindex @code{writec} request, and copy mode
+@cindex mode, copy, and @code{writec} request
+@cindex writing to file (@code{write}, @code{writec})
+@cindex file, writing to (@code{write}, @code{writec})
+Write to the file associated with the specified @var{stream}. The
+stream must previously have been the subject of an open request. The
+remainder of the line is interpreted as the @code{ds} request reads its
+second argument: an initial neutral double quote in @var{contents} is
+stripped to allow embedding of leading spaces, and it is read in copy
+mode.
+
+The @code{writec} request is like @code{write}, but only @code{write}
+appends a newline to the data.
+@endDefreq
+
+@Defreq {writem, stream xx}
+@cindex @code{asciify} request, and @code{writem}
+Write the contents of the macro or string @var{xx} to the file
+associated with the specified @var{stream}.
+
+@cindex @code{writem} request, and copy mode
+@cindex copy mode, and @code{writem} request
+@cindex mode, copy, and @code{writem} request
+@var{xx} is read in copy mode, i.e., already formatted elements are
+ignored. Consequently, diversions must be unformatted with the
+@code{asciify} request before calling @code{writem}. Usually, this
+means a loss of information.
+@endDefreq
+
+@Defreq {close, stream}
+@cindex closing file (@code{close})
+@cindex file, closing (@code{close})
+Close the specified @var{stream}; the stream is no longer an acceptable
+argument to the @code{write} request.
+
+Here a simple macro to write an index entry.
+
+@Example
+.open idx test.idx
+.
+.de IX
+. write idx \\n[%] \\$*
+..
+.
+.IX test entry
+.
+.close idx
+@endExample
+@endDefreq
+
+@DefescList {\\V, , e, }
+@DefescItem {\\V, (, ev, }
+@DefescListEnd {\\V, [, env, ]}
+@cindex @code{\V}, and copy mode
+@cindex copy mode, and @code{\V}
+@cindex mode, copy, and @code{\V}
+Interpolate the contents of the specified environment variable @var{env}
+(one-character name@tie{}@var{e}, two-character name @var{ev}) as
+returned by the function @cite{getenv@r{(3)}}. @code{\V} is interpreted
+even in copy mode (@pxref{Copy Mode}).
+@endDefesc
+
+
+@c =====================================================================
+
+@node Postprocessor Access, Miscellaneous, I/O, GNU troff Reference
+@section Postprocessor Access
+@cindex postprocessor access
+@cindex access to postprocessor
+
+Two escape sequences and two requests enable documents to pass
+information directly to a postprocessor. These are useful for
+exercising device-specific capabilities that the @code{groff} language
+does not abstract or generalize; examples include the embedding of
+hyperlinks and image files. Device-specific functions are documented in
+each output driver's man page, such as @cite{gropdf@r{(1)}},
+@cite{grops@r{(1)}}, or @cite{grotty@r{(1)}}.
+
+@DefreqList {device, xxx @r{@dots{}}}
+@DefescListEndx {\\X, @code{'}, xxx @r{@dots{}}, @code{'}}
+Embed all @var{xxx} arguments into GNU @code{troff} output as parameters
+to a device control command @w{@samp{x X}}. The meaning and
+interpretation of such parameters is determined by the output driver or
+other postprocessor.
+
+@cindex @code{device} request, and copy mode
+@cindex copy mode, and @code{device} request
+@cindex mode, copy, and @code{device} request
+The @code{device} request processes its arguments in copy mode
+(@pxref{Copy Mode}). An initial neutral double quote in @var{contents}
+is stripped to allow embedding of leading spaces.
+@cindex @code{\&}, in @code{\X}
+@cindex @code{\)}, in @code{\X}
+@cindex @code{\%}, in @code{\X}
+@ifnotinfo
+@cindex @code{\:}, in @code{\X}
+@end ifnotinfo
+@ifinfo
+@cindex @code{\@r{<colon>}}, in @code{\X}
+@end ifinfo
+By contrast, within @code{\X} arguments, the escape sequences @code{\&},
+@code{\)}, @code{\%}, and @code{\:} are ignored; @code{\@key{SP}} and
+@code{\~} are converted to single space characters; and @code{\\} has
+its escape character stripped. So that the basic Latin subset of the
+Unicode character set@footnote{that is, ISO@tie{}646:1991-IRV or,
+popularly, ``US-ASCII''} can be reliably encoded in device control
+commands, seven special character escape sequences (@samp{\-},
+@samp{\[aq]}, @samp{\[dq]}, @samp{\[ga]}, @samp{\[ha]}, @samp{\[rs]},
+and @samp{\[ti]},) are mapped to basic Latin characters; see the
+@cite{groff_char@r{(7)}} man page. For this transformation, character
+translations and special character definitions are
+ignored.@footnote{They are bypassed because these parameters are not
+rendered as glyphs in the output; instead, they remain abstract
+characters---in a PDF bookmark or a URL, for example.} The use of any
+other escape sequence in @code{\X} parameters is normally an error.
+
+@kindex use_charnames_in_special
+@cindex @file{DESC} file, and @code{use_charnames_in_special} keyword
+@cindex @code{\X}, and special characters
+If the @code{use_charnames_in_special} directive appears in the output
+device's @file{DESC} file, the use of special character escape sequences
+is @emph{not} an error; they are simply output verbatim (with the
+exception of the seven mapped to Unicode basic Latin characters,
+discussed above). @code{use_charnames_in_special} is currently employed
+only by @code{grohtml}.
+@endDefesc
+
+@DefreqList {devicem, name}
+@DefescItemx {\\Y, , n, }
+@DefescItem {\\Y, (, nm, }
+@DefescListEnd {\\Y, [, name, ]}
+This is approximately equivalent to @samp{\X'\*[@var{name}]'}
+(one-character name@tie{}@var{n}, two-character name @var{nm}).
+However, the contents of the string or macro @var{name} are not
+interpreted; also it is permitted for @var{name} to have been defined as
+a macro and thus contain newlines (it is not permitted for the argument
+to @code{\X} to contain newlines). The inclusion of newlines requires
+an extension to the @acronym{AT&T} @code{troff} output format, and
+confuses drivers that do not know about this extension (@pxref{Device
+Control Commands}).
+@endDefesc
+
+@DefreqList {tag, name}
+@DefreqListEndx {taga, name}
+Reserved for internal use.
+@endDefreq
+
+
+@c =====================================================================
+
+@node Miscellaneous, Gtroff Internals, Postprocessor Access, GNU troff Reference
+@section Miscellaneous
+
+We document here GNU @code{troff} features that fit poorly elsewhere.
+
+@DefreqList {nm, [@Var{start} [@Var{increment} [@Var{space} [@Var{indentation}]]]]}
+@DefregItemx {ln}
+@DefregListEndx {.nm}
+@cindex printing line numbers (@code{nm})
+@cindex line numbers, printing (@code{nm})
+@cindex numbers, line, printing (@code{nm})
+Begin (or, with no arguments, cease) numbering output lines.
+@var{start} assigns the number of the @emph{next} output line. Only
+line numbers divisible by @var{increment} are marked (default:
+@samp{1}). @var{space} configures the horizontal spacing between the
+number and the text (default: @samp{1}). Any given @var{indentation} is
+applied to the numbers (default: @samp{0}). The third and fourth
+arguments are reckoned in numeral widths (@code{\0}). @var{start} must
+be non-negative and @var{increment} positive.
+
+The formatter aligns the number to the right in a width of three numeral
+spaces plus @var{indentation}, then catenates @var{space} and the output
+line. The line length is @emph{not} reduced. Depending on the value of
+the page offset,@footnote{Recall @ref{Line Layout}.} numbers wider than
+the allocated space protrude into the left margin, or shift the output
+line to the right.
+
+Line numbering parameters corresponding to missing arguments are not
+altered. After numbering is disabled, @samp{.nm +0} resumes it using
+the previously active parameters.
+
+The parameters of @code{nm} are associated with the environment
+(@pxref{Environments}).
+
+@cindex output line number register (@code{ln})
+@cindex line number, output, register (@code{ln})
+While numbering is enabled, the output line number register @code{ln} is
+updated as each line is output, even if no line number is formatted with
+it because it is being skipped (it is not a multiple of @var{increment})
+or because numbering is suppressed (see the @code{nn} request below).
+
+The @code{.nm} register tracks the enablement status of numbering.
+Temporary suspension of numbering with the @code{nn} request does
+@emph{not} alter its value.
+
+@Example
+.po 5n
+.ll 44n
+Programming,
+when stripped of all its circumstantial irrelevancies,
+.nm 999 1 1 -4
+boils down to no more and no less than
+.nm +0 3
+very effective thinking so as to avoid unmastered
+.nn 2
+complexity,
+to very vigorous separation of your many
+different concerns.
+.br
+\(em Edsger Dijkstra
+.sp
+.nm 1 1 1
+This guy's arrogance takes your breath away.
+.br
+\(em John Backus
+ @result{} Programming, when stripped of all its cir-
+ @result{} 999 cumstantial irrelevancies, boils down to no
+ @result{} more and no less than very effective think-
+ @result{} ing so as to avoid unmastered complexity, to
+ @result{} very vigorous separation of your many dif-
+ @result{} ferent concerns.
+ @result{} 1002 -- Edsger Dijkstra
+ @result{}
+ @result{} 1 This guy@quoteright{}s arrogance takes your breath away.
+ @result{} 2 -- John Backus
+@endExample
+@endDefreq
+
+@DefreqList {nn, [@Var{skip}]}
+@DefregListEndx {.nn}
+Suppress numbering of the next @var{skip} output lines that would
+otherwise be numbered. The default is@tie{}1. @code{nn} can be invoked
+when line numbering is not active; suppression of numbering will take
+effect for @var{skip} lines once @code{nm} enables it.
+
+The @code{.nn} register stores the count of output lines still to have
+their numbering suppressed.
+
+This count is associated with the environment (@pxref{Environments}).
+@endDefreq
+
+@need 1000
+To test whether the current output line will be numbered, you must check
+both the @code{.nm} and @code{.nn} registers.
+
+@Example
+ .de is-numbered
+ . nop This line
+ . ie (\\n[.nm] & (1-\\n[.nn])) IS
+ . el ISN'T
+ . nop numbered.
+ . br
+ ..
+ Test line numbering.
+ .is-numbered
+ .nm 1
+ .nn 1
+ .is-numbered
+ .is-numbered
+ .nm
+ .is-numbered
+ @result{} Test line numbering. This line ISN@quoteright{}T numbered.
+ @result{} This line ISN@quoteright{}T numbered.
+ @result{} 1 This line IS numbered.
+ @result{} This line ISN@quoteright{}T numbered.
+@endExample
+
+@Defreq {mc, [@Var{margin-character} [@Var{distance}]}
+@cindex margin glyph (@code{mc})
+@cindex glyph, for margins (@code{mc})
+Begin (or, with no arguments, cease) writing a @dfn{margin-character} to
+the right of each output line. The @var{distance} argument separates
+@var{margin-character} from the right margin. If absent, the most
+recent value is used; the default is 10@tie{}points. If an output line
+exceeds the line length, the margin character is appended to it.
+@cindex @code{tl} request, and @code{mc}
+No margin character is written on lines produced by the @code{tl}
+request.
+
+The margin character is a property of the output line; the margin
+character last configured when the line is output controls. If the
+margin character is disabled before an output line breaks, none is
+output (but see below).
+
+The margin character is associated with the environment
+(@pxref{Environments}).
+
+@Example
+.ll 5i
+.nf
+.mc \[br]
+This paragraph is marked with a margin character.
+.sp
+As seen above, vertical space isn't thus marked.
+\&
+An output line that is present, but empty, is.
+@c We deliberately overset these lines to mimic `mc`'s behavior.
+ @result{} This paragraph is marked with a margin character. |
+ @result{}
+ @result{} As seen above, vertical space isn@quoteright{}t thus marked. |
+ @result{} |
+ @result{} An output line that is present, but empty, is. |
+@endExample
+@endDefreq
+
+For compatibility with @acronym{AT&T} @code{troff}, a call to @code{mc}
+to set the margin character can't be undone immediately; at least one
+line gets a margin character.
+
+@Example
+.ll 10n
+.nf
+.mc |
+.mc *
+.mc
+foo
+bar
+ @result{} foo *
+ @result{} bar
+@endExample
+
+@pindex gdiffmk
+@pindex nrchbar
+@pindex changebar
+@pindex diffmk
+The margin character mechanism is commonly used to annotate changes in
+documents. The @code{groff} distribution ships a program,
+@command{gdiffmk}, to assist with this task.@footnote{Historically,
+tools named @command{nrchbar} and @command{changebar} were developed for
+marking changes with margin characters and could be found in archives of
+the @code{comp.sources.unix} @acronym{USENET} group. Some proprietary
+Unices also offer(ed) a @command{diffmk} program.}
+
+@DefreqList {psbb, file}
+@DefregItemx {llx}
+@DefregItemx {lly}
+@DefregItemx {urx}
+@DefregListEndx {ury}
+@cindex PostScript, bounding box
+@cindex bounding box
+Retrieve the bounding box of the PostScript image found in @var{file},
+which must conform to Adobe's @dfn{Document Structuring Conventions}
+(DSC), locate a @code{%%BoundingBox} comment, and store the (upper-,
+lower-, @w{-left}, @w{-right}) values into the registers @code{llx},
+@code{lly}, @code{urx}, and @code{ury}. If an error occurs (for
+example, if no @code{%%BoundingBox} comment is present), the formatter
+sets these registers to@tie{}0.
+
+The search path for @var{file} can be controlled with the @option{-I}
+command-line option.
+@endDefreq
+
+@codequotebacktick off
+@codequoteundirected off
+
+
+@c =====================================================================
+
+@node Gtroff Internals, Debugging, Miscellaneous, GNU troff Reference
+@section @code{gtroff} Internals
+
+@cindex input token
+@cindex token, input
+@cindex output node
+@cindex node, output
+@code{gtroff} processes input in three steps. One or more input
+characters are converted to an @dfn{input token}.@footnote{Except the
+escape sequences @code{\f}, @code{\F}, @code{\H}, @code{\m}, @code{\M},
+@code{\R}, @code{\s}, and @code{\S}, which are processed immediately if
+not in copy mode.} Then, one or more input tokens are converted to
+an @dfn{output node}. Finally, output nodes are converted to the
+intermediate output language understood by all output devices.
+
+Actually, before step one happens, @code{gtroff} converts certain escape
+sequences into reserved input characters (not accessible by the user);
+such reserved characters are used for other internal processing also --
+this is the very reason why not all characters are valid input.
+@xref{Identifiers}, for more on this topic.
+
+For example, the input string @samp{fi\[:u]} is converted into a
+character token @samp{f}, a character token @samp{i}, and a special
+token @samp{:u} (representing u@tie{}umlaut). Later on, the character
+tokens @samp{f} and @samp{i} are merged to a single output node
+representing the ligature glyph @samp{fi} (provided the current font has
+a glyph for this ligature); the same happens with @samp{:u}. All output
+glyph nodes are `processed', which means that they are invariably
+associated with a given font, font size, advance width, etc. During the
+formatting process, @code{gtroff} itself adds various nodes to control
+the data flow.
+
+Macros, diversions, and strings collect elements in two chained lists: a
+list of input tokens that have been passed unprocessed, and a list of
+output nodes. Consider the following diversion.
+
+@Example
+.di xxx
+a
+\!b
+c
+.br
+.di
+@endExample
+
+@noindent
+It contains these elements.
+
+@multitable {@i{vertical size node}} {token list} {element number}
+@item node list @tab token list @tab element number
+
+@item @i{line start node} @tab --- @tab 1
+@item @i{glyph node @code{a}} @tab --- @tab 2
+@item @i{word space node} @tab --- @tab 3
+@item --- @tab @code{b} @tab 4
+@item --- @tab @code{\n} @tab 5
+@item @i{glyph node @code{c}} @tab --- @tab 6
+@item @i{vertical size node} @tab --- @tab 7
+@item @i{vertical size node} @tab --- @tab 8
+@item --- @tab @code{\n} @tab 9
+@end multitable
+
+@cindex @code{\v}, internal representation
+@noindent
+Elements 1, 7, and@tie{}8 are inserted by @code{gtroff}; the latter two
+(which are always present) specify the vertical extent of the last line,
+possibly modified by @code{\x}. The @code{br} request finishes the
+pending output line, inserting a newline input token, which is
+subsequently converted to a space when the diversion is reread. Note
+that the word space node has a fixed width that isn't adjustable
+anymore. To convert horizontal space nodes back to input tokens, use
+the @code{unformat} request.
+
+Macros only contain elements in the token list (and the node list is
+empty); diversions and strings can contain elements in both lists.
+
+The @code{chop} request simply reduces the number of elements in a
+macro, string, or diversion by one. Exceptions are @dfn{compatibility
+save} and @dfn{compatibility ignore} input tokens, which are ignored.
+The @code{substring} request also ignores those input tokens.
+
+Some requests like @code{tr} or @code{cflags} work on glyph identifiers
+only; this means that the associated glyph can be changed without
+destroying this association. This can be very helpful for substituting
+glyphs. In the following example, we assume that glyph @samp{foo} isn't
+available by default, so we provide a substitution using the
+@code{fchar} request and map it to input character @samp{x}.
+
+@Example
+.fchar \[foo] foo
+.tr x \[foo]
+@endExample
+
+@noindent
+Now let us assume that we install an additional special font @samp{bar}
+that has glyph @samp{foo}.
+
+@Example
+.special bar
+.rchar \[foo]
+@endExample
+
+@noindent
+Since glyphs defined with @code{fchar} are searched before glyphs in
+special fonts, we must call @code{rchar} to remove the definition of the
+fallback glyph. Anyway, the translation is still active; @samp{x} now
+maps to the real glyph @samp{foo}.
+
+@cindex compatibility mode, and parameters
+@cindex mode, compatibility, and parameters
+@cindex arguments, and compatibility mode
+@cindex parameters, and compatibility mode
+@cindex macro arguments, and compatibility mode
+@cindex request arguments, and compatibility mode
+Macro and request arguments preserve compatibility mode enablement.
+
+@Example
+.cp 1 \" switch to compatibility mode
+.de xx
+\\$1
+..
+.cp 0 \" switch compatibility mode off
+.xx caf\['e]
+ @result{} café
+@endExample
+
+@noindent
+Since compatibility mode is enabled while @code{de} is invoked, the
+macro @code{xx} enables compatibility mode when it is called. Argument
+@code{$1} can still be handled properly because it inherits the
+compatibility mode enablement status that was active at the point where
+@code{xx} was called.
+
+After interpolation of the parameters, the compatibility save and
+restore tokens are removed.
+
+
+@c =====================================================================
+
+@codequotebacktick on
+@codequoteundirected on
+
+@need 1000
+@c BEGIN Keep parallel with section "Debugging" of groff(7).
+@node Debugging, Implementation Differences, Gtroff Internals, GNU troff Reference
+@section Debugging
+@cindex debugging
+
+@flushright
+@slanted{Standard troff voodoo, just put a power of two backslashes in
+front of it until it works and if you still have problems add a \c.}
+--- Ron Natalie
+@c https://minnie.tuhs.org/pipermail/tuhs/2021-February/023137.html
+@end flushright
+
+GNU @code{troff} is not the easiest language to debug, in part thanks to
+its design features of recursive interpolation and the use of
+multi-stage pipeline processing in the surrounding system. Nevertheless
+there exist several features useful for troubleshooting.
+
+Preprocessors use the @code{lf} request to preserve the identity of the
+line numbers and names of input files. GNU @code{troff} emits a variety
+of error diagnostics and supports several categories of warning; the
+output of these can be selectively suppressed. A trace of the
+formatter's input processing stack can be emitted when errors or
+warnings occur by means of GNU @code{troff}'s @option{-b} option, or
+produced on demand with the @code{backtrace} request. The @code{tm}
+and related requests can be used to emit customized diagnostic messages
+or for instrumentation while troubleshooting. The @code{ex} and
+@code{ab} requests cause early termination with successful and error
+exit codes respectively, to halt further processing when continuing
+would be fruitless. Examine the state of the formatter with requests
+that write lists of defined names (macros, strings, and diversions),
+environments, registers, and page location traps to the standard error
+stream.
+@c END Keep parallel with section "Debugging" of groff(7).
+
+@Defreq {lf, line [@Var{file}]}
+@pindex soelim
+@cindex multi-file documents
+@cindex documents, multi-file
+@cindex setting input line number (@code{lf})
+@cindex input line number, setting (@code{lf})
+@cindex number, input line, setting (@code{lf})
+Set the input line number (and, optionally, the file name) GNU
+@code{troff} shall use for error and warning messages. @var{line} is
+the input line number of the @emph{next} line. Without an argument, the
+request is ignored.
+
+@code{lf}'s primary purpose is to aid the debugging of documents that
+undergo preprocessing. Programs like @command{tbl} that transform input
+in their own languages into @code{roff} requests use it so that any
+diagnostic messages emitted by @code{troff} correspond to the source
+document.
+@endDefreq
+
+@DefreqList {tm, message}
+@DefreqItemx {tm1, message}
+@DefreqListEndx {tmc, message}
+@cindex printing to stderr (@code{tm}, @code{tm1}, @code{tmc})
+@cindex stderr, printing to (@code{tm}, @code{tm1}, @code{tmc})
+Send @var{message}, which consumes the remainder of the input line and
+cannot contain special characters, to the standard error stream,
+followed by a newline. Leading spaces in @var{message} are ignored.
+
+@code{tm1} is similar, but recognizes and strips a leading neutral
+double quote from @var{message} to allow the embedding of leading
+spaces.
+
+@code{tmc} works as @code{tm1}, but does not append a newline.
+@endDefreq
+
+@Defreq {ab, [@Var{message}]}
+@cindex aborting (@code{ab})
+Write any @var{message} to the standard error stream (like @code{tm})
+and then abort GNU @code{troff}; that is, stop processing and terminate
+with a failure status.
+@endDefreq
+
+@Defreq {ex, }
+@cindex @code{ex} request, use in debugging
+@cindex exiting (@code{ex})
+Exit GNU @code{troff}; that is, stop processing and terminate with a
+successful status. To stop processing only the current file, use the
+@code{nx} request; see @ref{I/O}.
+@endDefreq
+
+When doing something involved, it is useful to leave the debugging
+statements in the code and have them turned on by a command-line flag.
+
+@Example
+.if \n[DB] .tm debugging output
+@endExample
+
+@noindent
+To activate such statements, use the @option{-r} option to set the
+register.
+
+@Example
+groff -rDB=1 @slanted{file}
+@endExample
+
+If it is known in advance that there are many errors and no useful
+output, GNU @code{troff} can be forced to suppress formatted output with
+the @option{-z} option.
+
+@Defreq {pev, }
+@cindex dumping environments (@code{pev})
+@cindex environments, dumping (@code{pev})
+Report the state of the current environment followed by that of all
+other environments to the standard error stream.
+@endDefreq
+
+@Defreq {pm, }
+@cindex dumping symbol table (@code{pm})
+@cindex symbol table, dumping (@code{pm})
+Report, to the standard error stream, the names of all defined macros,
+strings, and diversions with their sizes in bytes.
+@endDefreq
+
+@Defreq {pnr, }
+@cindex dumping registers (@code{pnr})
+@cindex registers, dumping (@code{pnr})
+Report the names and contents of all currently defined registers to the
+standard error stream.
+@endDefreq
+
+@Defreq {ptr, }
+@cindex dumping page location traps (@code{ptr})
+@cindex listing page location traps (@code{ptr})
+@cindex traps, page location, dumping (@code{ptr})
+@cindex traps, page location, listing (@code{ptr})
+Report the names and positions of all page location traps to the
+standard error stream. Empty slots in the list, where a trap has been
+planted but subsequently (re)moved, are printed as well.
+@c "because they can affect the priority of subsequently planted traps."
+@c XXX Is that right? It's useful to print the empty slots, I think,
+@c but a trap planted in an "empty" slot with .wh will become active.
+@c The slot seems to act as an immobile dummy list head, but does not
+@c change the basic list semantics. .wh plants a trap at the head of
+@c the trap list at a location, and .ch plants a trap at the tail.
+@endDefreq
+
+@Defreq {fl, }
+@cindex flush output (@code{fl})
+@cindex output, flush (@code{fl})
+@cindex interactive use of @code{gtroff}
+@cindex @code{gtroff}, interactive use
+Instruct @code{gtroff} to flush its output immediately. The intent is
+for interactive use, but this behaviour is currently not implemented in
+@code{gtroff}. Contrary to Unix @code{troff}, TTY output is sent to a
+device driver also (@code{grotty}), making it non-trivial to communicate
+interactively.
+
+This request causes a line break.
+@endDefreq
+
+@Defreq {backtrace, }
+@cindex backtrace of input stack (@code{backtrace})
+@cindex input stack, backtrace (@code{backtrace})
+Write the state of the input stack to the standard error stream.
+
+Consider the following in a file @file{test}.
+
+@Example
+.de xxx
+. backtrace
+..
+.de yyy
+. xxx
+..
+.
+.yyy
+ @error{} troff: backtrace: 'test':2: macro 'xxx'
+ @error{} troff: backtrace: 'test':5: macro 'yyy'
+ @error{} troff: backtrace: file 'test':8
+@endExample
+
+The @option{-b} option of GNU @code{troff} causes a backtrace to be
+generated on each error or warning. Some warnings have to be enabled;
+@xref{Warnings}.
+@endDefreq
+
+@Defreg {slimit}
+@cindex input stack, setting limit
+If greater than@tie{}0, sets the maximum quantity of objects on GNU
+@code{troff}'s internal input stack. If less than or equal to@tie{}0,
+there is no limit: recursion can continue until program memory is
+exhausted. The default is 1,000.
+@endDefreg
+
+@Defreq {warnscale, su}
+Set the scaling unit used in certain warnings @c `output_warning()`
+to @var{su}, which can take the values @samp{u}, @samp{i}, @samp{c},
+@samp{p}, and @samp{P}. The default is @samp{i}.
+@endDefreq
+
+@Defreq {spreadwarn, [@Var{limit}]}
+Emit a @code{break} warning if the additional space inserted for each
+space between words in an output line adjusted to both margins with
+@w{@samp{.ad b}} is larger than or equal to @var{limit}. A negative
+value is treated as zero; an absent argument toggles the warning on and
+off without changing @var{limit}. The default scaling unit is @samp{m}.
+At startup, @code{spreadwarn} is inactive and @var{limit} is 3@dmn{m}.
+
+For example,
+
+@Example
+.spreadwarn 0.2m
+@endExample
+
+@noindent
+causes a warning if @code{break} warnings are not suppressed and
+@code{gtroff} must add 0.2@dmn{m} or more for each inter-word space in a
+line. @xref{Warnings}.
+@endDefreq
+
+@cindex warnings
+GNU @code{troff} has command-line options for reporting warnings
+(@option{-w}) and backtraces (@option{-b}) when a warning or an error
+occurs.
+
+@DefreqList {warn, [@Var{n}]}
+@DefregListEndx {.warn}
+@cindex warning level (@code{warn})
+Select the categories, or ``types'', of reported warnings.
+@var{n}@tie{}is the sum of the numeric codes associated with each
+warning category that is to be enabled; all other categories are
+disabled. The categories and their associated codes are listed in
+@ref{Warnings}. For example, @samp{.warn 0} disables all warnings, and
+@samp{.warn 1} disables all warnings except those about missing glyphs.
+If no argument is given, all warning categories are enabled.
+
+The read-only register @code{.warn} contains the sum of the numeric
+codes of enabled warning categories.
+@endDefreq
+
+@menu
+* Warnings::
+@end menu
+
+@c ---------------------------------------------------------------------
+
+@c BEGIN Keep parallel with section "Warnings" of troff(1).
+@c Caveat: the man page sorts them by name, not number.
+@node Warnings, , Debugging, Debugging
+@subsection Warnings
+@cindex warnings
+
+Warning diagnostics emitted by GNU @code{troff} are divided into named,
+numbered categories. The name associated with each warning category is
+used by the @option{-w} and @option{-W} options. Each category is also
+assigned a power of two; the sum of enabled category values is used by
+the @code{warn} request and the @code{.warn} register.
+
+Warnings of each category are produced under the following
+circumstances.
+
+@cindex categories, warning
+@cindex warning categories
+@table @samp
+@item char
+@itemx 1
+No mounted font defines a glyph for the requested character. This
+category is enabled by default.
+
+@item number
+@itemx 2
+An invalid numeric expression was encountered. This category is enabled
+by default.
+@xref{Numeric Expressions}.
+
+@item break
+@itemx 4
+@cindex filling, and @code{break} warnings
+@cindex mode, fill, and @code{break} warnings
+A filled output line could not be broken such that its length was less
+than the output line length @samp{\n[.l]}. This category is enabled by
+default.
+
+@item delim
+@itemx 8
+The closing delimiter in an escape sequence was missing or mismatched.
+
+@item el
+@itemx 16
+@cindex @code{ie} request, and warnings
+@cindex @code{el} request, and warnings
+The @code{el} request was encountered with no prior corresponding
+@code{ie} request. @xref{if-else}.
+
+@item scale
+@itemx 32
+A scaling unit inappropriate to its context was used in a numeric
+expression.
+
+@item range
+@itemx 64
+A numeric expression was out of range for its context.
+
+@item syntax
+@itemx 128
+A self-contradictory hyphenation mode was requested; an empty or
+incomplete numeric expression was encountered; an operand to a numeric
+operator was missing; an attempt was made to define a recursive, empty,
+or nonsensical character class; or a @code{groff} extension conditional
+expression operator was used while in compatibility mode.
+
+@item di
+@itemx 256
+@cindex @code{di} request, and warnings
+@cindex @code{da} request, and warnings
+@cindex @code{box} request, and warnings
+@cindex @code{boxa} request, and warnings
+A @code{di}, @code{da}, @code{box}, or @code{boxa} request was invoked
+without an argument when there was no current diversion.
+
+@item mac
+@itemx 512
+@cindex @code{de}, @code{de1}, @code{dei} requests, and warnings
+@cindex @code{am}, @code{am1}, @code{ami} requests, and warnings
+@cindex @code{ds}, @code{ds1} requests, and warnings
+@cindex @code{as}, @code{as1} requests, and warnings
+@cindex @code{di} request, and warnings
+@cindex @code{da} request, and warnings
+@cindex @code{box}, @code{boxa} requests, and warnings
+@cindex @code{\*}, and warnings
+An undefined string, macro, or diversion was used. When such an object
+is dereferenced, an empty one of that name is automatically created.
+So, unless it is later deleted, at most one warning is given for each.
+
+This warning is also emitted upon an attempt to move an unplanted trap
+macro (@pxref{Page Location Traps}). In such cases, the unplanted macro
+is @emph{not} dereferenced, so it is not created if it does not exist.
+
+@item reg
+@itemx 1024
+@cindex @code{nr} request, and warnings
+@cindex @code{\R}, and warnings
+@cindex @code{\n}, and warnings
+An undefined register was used. When an undefined register is
+dereferenced, it is automatically defined with a value of@tie{}0. So,
+unless it is later deleted, at most one warning is given for each.
+
+@item tab
+@itemx 2048
+@cindex @code{\t}, and warnings
+A tab character was encountered where a number was expected, or appeared
+in an unquoted macro argument.
+
+@item right-brace
+@itemx 4096
+@cindex @code{\@}}, and warnings
+A right brace escape sequence @code{\@}} was encountered where a number
+was expected.
+
+@item missing
+@itemx 8192
+A request was invoked with a mandatory argument absent.
+
+@item input
+@itemx 16384
+An invalid character occurred on the input stream.
+
+@item escape
+@itemx 32768
+An unsupported escape sequence was encountered.
+
+@item space
+@itemx 65536
+@cindex compatibility mode
+A space was missing between a request or macro and its argument. This
+warning is produced when an undefined name longer than two characters is
+encountered and the first two characters of the name constitute a
+defined name. No request is invoked, no macro called, and an empty
+macro is not defined. This category is enabled by default. It never
+occurs in compatibility mode.
+
+@item font
+@itemx 131072
+A non-existent font was selected, or the selection was ignored because a
+font selection escape sequence was used after the output line
+continuation escape sequence on an input line. This category is enabled
+by default.
+
+@item ig
+@itemx 262144
+An invalid escape sequence occurred in input ignored using the @code{ig}
+request. This warning category diagnoses a condition that is an error
+when it occurs in non-ignored input.
+
+@item color
+@itemx 524288
+An undefined color was selected, an attempt was made to define a color
+using an unrecognized color space, an invalid component in a color
+definition was encountered, or an attempt was made to redefine a default
+color.
+
+@item file
+@itemx 1048576
+An attempt was made to load a file that does not exist. This category
+is enabled by default.
+@end table
+
+Two warning names group other warning categories for convenience.
+
+@table @samp
+@item all
+All warning categories except @samp{di}, @samp{mac} and @samp{reg}.
+This shorthand is intended to produce all warnings that are useful with
+macro packages written for @acronym{AT&T} @code{troff} and its
+descendants, which have less fastidious diagnostics than GNU
+@code{troff}.
+
+@item w
+All warning categories. Authors of documents and macro packages
+targeting @code{groff} are encouraged to use this setting.
+@end table
+@c END Keep parallel with section "Warnings" of troff(1).
+
+@c =====================================================================
+
+@node Implementation Differences, Safer Mode, Debugging, GNU troff Reference
+@section Implementation Differences
+@cindex implementation differences
+@cindex differences in implementation
+@cindex incompatibilities with @acronym{AT&T} @code{troff}
+
+GNU @code{troff} has a number of features that cause incompatibilities
+with documents written for other versions of @code{troff}. Some GNU
+extensions to @code{troff} have become supported by other
+implementations.
+
+@menu
+* Safer Mode::
+* Compatibility Mode::
+* Other Differences::
+@end menu
+
+@c ---------------------------------------------------------------------
+
+@node Safer Mode, Compatibility Mode, Implementation Differences, Implementation Differences
+@subsection Safer Mode
+@cindex safer mode
+@cindex mode, safer
+
+@cindex @code{pi} request, disabled by default
+@cindex @code{sy} request, disabled by default
+The formatter operates in ``safer'' mode by default; to mitigate risks
+from untrusted input documents, the @code{pi} and @code{sy} requests are
+disabled. GNU @code{troff}'s @option{-U} option enables ``unsafe
+mode'', restoring their function and enabling additional @code{groff}
+extension requests, @code{open}, @code{opena}, and @code{pso}.
+@xref{I/O}.
+
+@c ---------------------------------------------------------------------
+
+@node Compatibility Mode, Safer Mode, Other Differences, Implementation Differences
+@subsection Compatibility Mode
+@cindex compatibility mode
+@cindex mode, compatibility
+
+@cindex long names
+@cindex names, long
+@cindex @code{\*}, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{\n}, incompatibilities with @acronym{AT&T} @code{troff}
+Long identifier names may be GNU @code{troff}'s most obvious innovation.
+@acronym{AT&T} @code{troff} interprets @samp{.dsabcd} as defining a
+string @samp{ab} with contents @samp{cd}. Normally, GNU @code{troff}
+interprets this as a call of a macro named @code{dsabcd}.
+@acronym{AT&T} @code{troff} also interprets @samp{\*[} and @samp{\n[} as
+an interpolation of a string or register, respectively, named @samp{[}.
+In GNU @code{troff}, however, the @samp{[} is normally interpreted as
+delimiting a long name. In compatibility mode, GNU @code{troff}
+interprets names in the traditional way; they thus can be two characters
+long at most.
+
+@DefreqList {cp, [@Var{n}]}
+@DefregListEndx {.C}
+If @var{n} is missing or non-zero, turn on compatibility mode;
+otherwise, turn it off.
+
+The read-only register @code{.C} is@tie{}1 if compatibility mode is on,
+0@tie{}otherwise.
+
+Compatibility mode can be also turned on with the @option{-C}
+command-line option.
+@endDefreq
+
+@DefreqList {do, name}
+@DefregListEndx {.cp}
+The @code{do} request interprets the string, request, diversion, or
+macro @var{name} (along with any further arguments) with compatibility
+mode disabled. Compatibility mode is restored (only if it was active)
+when the @emph{expansion} of @var{name} is interpreted; that is, the
+restored compatibility state applies to the contents of the macro,
+string, or diversion @var{name} as well as data read from files or pipes
+if @var{name} is any of the @code{so}, @code{soquiet}, @code{mso},
+@code{msoquiet}, or @code{pso} requests.
+
+The following example illustrates several aspects of @code{do} behavior.
+
+@Example
+.de mac1
+FOO
+..
+.de1 mac2
+groff
+.mac1
+..
+.de mac3
+compatibility
+.mac1
+..
+.de ma
+\\$1
+..
+.cp 1
+.do mac1
+.do mac2 \" mac2, defined with .de1, calls "mac1"
+.do mac3 \" mac3 calls "ma" with argument "c1"
+.do mac3 \[ti] \" groff syntax accepted in .do arguments
+ @result{} FOO groff FOO compatibility c1 ~
+@endExample
+
+The read-only register @code{.cp}, meaningful only when dereferenced
+from a @code{do} request, is@tie{}1 if compatibility mode was on when
+the @code{do} request was encountered, and 0@tie{}if it was not. This
+register is specialized and may require a statement of rationale.
+
+When writing macro packages or documents that use GNU @code{troff}
+features and which may be mixed with other packages or documents that do
+not---common scenarios include serial processing of man pages or use of
+the @code{so} or @code{mso} requests---you may desire correct operation
+regardless of compatibility mode enablement in the surrounding context.
+It may occur to you to save the existing value of @samp{\n(.C} into a
+register, say, @samp{_C}, at the beginning of your file, turn
+compatibility mode off with @samp{.cp 0}, then restore it from that
+register at the end with @samp{.cp \n(_C}. At the same time, a modular
+design of a document or macro package may lead you to multiple layers of
+inclusion. You cannot use the same register name everywhere lest you
+``clobber'' the value from a preceding or enclosing context. The
+two-character register name space of @acronym{AT&T} @code{troff} is
+confining and mnemonically challenging; you may wish to use the more
+capacious name space of GNU @code{troff}. However, attempting @samp{.nr
+_my_saved_C \n(.C} will not work in compatibility mode; the register
+name is too long. ``This is exactly what @code{do} is for,'' you think,
+@samp{.do nr _my_saved_C \n(.C}. The foregoing will always save zero to
+your register, because @code{do} turns compatibility mode @emph{off}
+while it interprets its argument list.
+
+@need 375 @c 250 < x < 500
+To robustly save compatibility mode before switching it off, use
+
+@Example
+.do nr _my_saved_C \n[.cp]
+.cp 0
+@endExample
+
+at the beginning of your file, followed by
+
+@Example
+.cp \n[_my_saved_C]
+.do rr _my_saved_C
+@endExample
+
+at the end. As in the C language, we all have to share one big
+name space, so choose a register name that is unlikely to collide with
+other uses.
+@endDefreq
+
+@cindex input level in delimited arguments
+@cindex interpolation depth in delimited arguments
+@cindex delimited arguments, incompatibilities with @acronym{AT&T} @code{troff}
+Normally, GNU @code{troff} preserves the interpolation depth in
+delimited arguments, but not in compatibility mode.
+
+@Example
+.ds xx '
+\w'abc\*(xxdef'
+ @result{} 168 @r{(normal mode on a terminal device)}
+ @result{} 72def' @r{(compatibility mode on a terminal device)}
+@endExample
+
+@cindex @code{\f}, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{\H}, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{\s}, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{\S}, incompatibilities with @acronym{AT&T} @code{troff}
+Furthermore, the escape sequences @code{\f}, @code{\H}, @code{\m},
+@code{\M}, @code{\R}, @code{\s}, and @code{\S} are transparent for the
+purpose of recognizing a control character at the beginning of a line
+only in compatibility mode. For example, this code produces bold output
+in both cases, but the text differs.
+
+@Example
+.de xx
+Hello!
+..
+\fB.xx\fP
+ @result{} .xx @r{(normal mode)}
+ @result{} Hello! @r{(compatibility mode)}
+@endExample
+
+@cindex @code{\s}, incompatibilities with @acronym{AT&T} @code{troff}
+Normally, the syntax form @code{\s}@var{n} accepts only a single
+character (a digit) for @var{n}, consistently with other forms that
+originated in @acronym{AT&T} @code{troff}, like @code{\*}, @code{\$},
+@code{\f}, @code{\g}, @code{\k}, @code{\n}, and @code{\z}. In
+compatibility mode only, a non-zero@tie{}@var{n} must be in the range
+4--39. Legacy documents relying upon this quirk of parsing@footnote{The
+Graphic Systems C/A/T phototypesetter (the original device target for
+@acronym{AT&T} @code{troff}) supported only a few discrete type sizes
+in the range 6--36 points, so Ossanna contrived a special case in the
+parser to do what the user must have meant. Kernighan warned of this in
+the 1992 revision of CSTR@tie{}#54 (§2.3), and more recently, McIlroy
+referred to it as a ``living fossil''.} should be migrated to another
+@code{\s} form.
+
+@c ---------------------------------------------------------------------
+
+@node Other Differences, , Compatibility Mode, Implementation Differences
+@subsection Other Differences
+
+@code{groff} request names unrecognized by other @code{troff}
+implementations will likely be ignored by them; escape sequences that
+are @code{groff} extensions are liable to be interpreted as if the
+escape character were not present.
+@cindex @code{\~}, incompatibilities with @acronym{AT&T} @code{troff}
+For example, the adjustable, non-breaking escape sequence @code{\~}
+@c BEGIN Keep in sync with groff_diff(7) and groff_man_style(7).
+is also supported by Heirloom Doctools @code{troff} 050915 (September
+2005), @code{mandoc} 1.9.5 (2009-09-21), @code{neatroff} (commit
+1c6ab0f6e, 2016-09-13), and Plan@tie{}9 from User Space @code{troff}
+(commit 93f8143600, 2022-08-12), but not by Solaris or Documenter's
+Workbench @code{troff}s.
+@c as of this writing, 2022-08-13
+@c END Keep in sync with groff_diff(7) and groff_man_style(7).
+@xref{Manipulating Filling and Adjustment}.
+
+@cindex @code{\A}, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{\|}, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{\^}, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{\&}, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{\@{}, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{\@}}, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{\@key{SP}}, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{\'}, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{\`}, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{\-}, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{\_}, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{\!}, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{\%}, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{\c}, incompatibilities with @acronym{AT&T} @code{troff}
+GNU @code{troff} does not allow the use of the escape sequences
+@code{\|}, @code{\^}, @code{\&}, @code{\@{}, @code{\@}},
+@code{\@key{SP}}, @code{\'}, @code{\`}, @code{\-}, @code{\_}, @code{\!},
+@code{\%}, and @code{\c} in identifiers; @acronym{AT&T} @code{troff}
+does. The @code{\A} escape sequence (@pxref{Identifiers}) may be
+helpful in avoiding use of these escape sequences in names.
+
+@cindex adjustment to both margins, difference from @acronym{AT&T} @code{troff}
+@cindex rivers
+When adjusting to both margins, @acronym{AT&T} @code{troff} at first
+adjusts spaces starting from the right; GNU @code{troff} begins from
+the left. Both implementations adjust spaces from opposite ends on
+alternating output lines in this adjustment mode to prevent ``rivers''
+in the text.
+
+@cindex hyphenation, incompatibilities with @acronym{AT&T} @code{troff}
+GNU @code{troff} does not always hyphenate words as @acronym{AT&T}
+@code{troff} does. The @acronym{AT&T} implementation uses a set of
+hard-coded rules specific to English, while GNU @code{troff} uses
+language-specific hyphenation pattern files derived from @TeX{}.
+Furthermore, in old versions of @code{troff} there was a limited amount
+of space to store hyphenation exceptions (arguments to the @code{hw}
+request); GNU @code{troff} has no such restriction.
+
+@cindex output device name string (@code{.T}), in other implementations
+GNU @code{troff} predefines a string @code{.T} containing the argument
+given to the @option{-T} command-line option, namely the current output
+device (for example, @samp{pdf} or @samp{utf8}). The existence of this
+string is a common feature of post-CSTR@tie{}#54
+@code{troff}s@footnote{DWB@tie{}3.3, Solaris, Heirloom Doctools, and
+Plan@tie{}9 @code{troff} all support it.} but valid values are specific
+to each implementation.
+
+@cindex removal of read-only registers, incompatibility with @acronym{AT&T} @code{troff}
+@cindex register, read-only, removal, incompatibility with @acronym{AT&T} @code{troff}
+@cindex read-only register removal, incompatibility with @acronym{AT&T} @code{troff}
+@acronym{AT&T} @code{troff} ignored attempts to remove read-only
+registers; GNU @code{troff} honors such requests. @xref{Built-in
+Registers}.
+
+@cindex output device usage register (@code{.T}), incompatibility with @acronym{AT&T} @code{troff}
+The (read-only) register @code{.T} interpolates@tie{}1 if GNU
+@code{troff} is called with the @option{-T} command-line option, and
+0@tie{}otherwise. This behavior differs from AT&T @code{troff}, which
+interpolated@tie{}1 only if @code{nroff} was the formatter and was
+called with @option{-T}.
+
+@cindex @code{lf} request, incompatibilities with @acronym{AT&T} @code{troff}
+@acronym{AT&T} @code{troff} and other implementations handle the
+@code{lf} request differently. For them, its @var{line} argument
+changes the line number of the @emph{current} line.
+
+@cindex environment availability and naming, incompatibilities with
+@acronym{AT&T} @code{troff} had only environments named @samp{0},
+@samp{1}, and @samp{2}. In GNU @code{troff}, any number of environments
+may exist, using any valid identifiers for their names
+(@pxref{Identifiers}.)
+
+@cindex fractional point sizes
+@cindex fractional type sizes
+@cindex point sizes, fractional
+@cindex type sizes, fractional
+@cindex sizes, fractional
+@cindex @code{ps} request, incompatibilities with @acronym{AT&T} @code{troff}
+Fractional type sizes cause one noteworthy incompatibility. In
+@acronym{AT&T} @code{troff} the @code{ps} request ignores scaling units
+and thus @samp{.ps 10u} sets the type size to 10@tie{}points, whereas in
+GNU @code{troff} it sets the type size to 10@tie{}@emph{scaled} points.
+@xref{Using Fractional Type Sizes}.
+
+@cindex @code{ab} request, incompatibilities with @acronym{AT&T} @code{troff}
+The @code{ab} request differs from @acronym{AT&T} @code{troff}:
+GNU @code{troff} writes no message to the standard error stream if no
+arguments are given, and it exits with a failure status instead of a
+successful one.
+
+@cindex @code{bp} request, incompatibilities with @acronym{AT&T} @code{troff}
+The @code{bp} request differs from @acronym{AT&T} @code{troff}:
+GNU @code{troff} does not accept a scaling unit on the argument, a page
+number; the former (somewhat uselessly) does.
+
+@cindex @code{pm} request, incompatibilities with @acronym{AT&T} @code{troff}
+The @code{pm} request differs from @acronym{AT&T} @code{troff}:
+GNU @code{troff} reports the sizes of macros, strings, and diversions in
+bytes and ignores an argument to report only the sum of the sizes.
+
+@cindex @code{ss} request, incompatibilities with @acronym{AT&T} @code{troff}
+Unlike @acronym{AT&T} @code{troff}, GNU @code{troff} does not ignore the
+@code{ss} request if the output is a terminal device; instead, the
+values of minimal inter-word and additional inter-sentence space are
+each rounded down to the nearest multiple of@tie{}12.
+
+@cindex @code{bd} request, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{cs} request, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{tr} request, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{fp} request, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex input characters and output glyphs, compatibility with @acronym{AT&T} @code{troff}
+@cindex output glyphs, and input characters, compatibility with @acronym{AT&T} @code{troff}
+@cindex characters, input, and output glyphs, compatibility with @acronym{AT&T} @code{troff}
+@cindex glyphs, output, and input characters, compatibility with @acronym{AT&T} @code{troff}
+In GNU @code{troff} there is a fundamental difference between
+(unformatted) characters and (formatted) glyphs. Everything that
+affects how a glyph is output is stored with the glyph node; once a
+glyph node has been constructed, it is unaffected by any subsequent
+requests that are executed, including @code{bd}, @code{cs}, @code{tkf},
+@code{tr}, or @code{fp} requests. Normally, glyphs are constructed from
+characters immediately before the glyph is added to an output line.
+Macros, diversions, and strings are all, in fact, the same type of
+object; they contain a sequence of intermixed character and glyph nodes.
+Special characters transform from one to the other:@: before being added
+to the output, they behave as characters; afterward, they are glyphs. A
+glyph node does not behave like a character node when it is processed by
+a macro:@: it does not inherit any of the special properties that the
+character from which it was constructed might have had. For example,
+the input
+
+@Example
+.di x
+\\\\
+.br
+.di
+.x
+@endExample
+
+@noindent
+produces @samp{\\} in GNU @code{troff}. Each pair of backslashes
+becomes one backslash @emph{glyph}; the resulting backslashes are thus
+not interpreted as escape @emph{characters} when they are reread as the
+diversion is output. @acronym{AT&T} @code{troff} @emph{would} interpret
+them as escape characters when rereading them and end up printing one
+@samp{\}.
+
+@cindex printing backslash (@code{\\}, @code{\e}, @code{\E}, @code{\[rs]})
+@cindex backslash, printing (@code{\\}, @code{\e}, @code{\E}, @code{\[rs]})
+@cindex @code{\e}, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{\!}, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex @code{\?}, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex transparent output, incompatibilities with @acronym{AT&T} @code{troff}
+@cindex output, transparent, incompatibilities with @acronym{AT&T} @code{troff}
+One correct way to obtain a printable backslash in most documents is to
+use the @code{\e} escape sequence; this always prints a single instance
+of the current escape character,@footnote{Naturally, if you've changed
+the escape character, you need to prefix the @code{e} with whatever it
+is---and you'll likely get something other than a backslash in the
+output.} regardless of whether or not it is used in a diversion; it
+also works in both GNU @code{troff} and @acronym{AT&T} @code{troff}.
+
+The other correct way, appropriate in contexts independent of the
+backslash's common use as a @code{troff} escape character---perhaps in
+discussion of character sets or other programming languages---is
+the character escape @code{\(rs} or @code{\[rs]}, for ``reverse
+solidus'', from its name in the @acronym{ECMA-6} (@acronym{ISO/IEC} 646)
+standard.@footnote{The @code{rs} special character identifier was not
+defined in @acronym{AT&T} @code{troff}'s font description files, but is
+in those of its lineal descendant, Heirloom Doctools @code{troff}, as of
+the latter's 060716 release (July 2006).}
+
+To store an escape sequence in a diversion that is interpreted when the
+diversion is reread, either use the traditional @code{\!} transparent
+output facility, or, if this is unsuitable, the new @code{\?} escape
+sequence. @xref{Diversions} and @ref{Gtroff Internals}.
+
+In the somewhat pathological case where a diversion exists containing a
+partially collected line and a partially collected line at the top-level
+diversion has never existed, @acronym{AT&T} @code{troff} will output the
+partially collected line at the end of input; GNU @code{troff} will not.
+
+@codequotebacktick off
+@codequoteundirected off
+
+
+
+@c =====================================================================
+@c =====================================================================
+
+@node File Formats, Copying This Manual, GNU troff Reference, Top
+@chapter File Formats
+@cindex file formats
+@cindex formats, file
+
+All files read and written by @code{gtroff} are text files. The
+following two sections describe their format.
+
+@menu
+* gtroff Output::
+* Device and Font Description Files::
+@end menu
+
+
+@c =====================================================================
+
+@codequotebacktick on
+@codequoteundirected on
+
+@c BEGIN TODO: Make parallel with groff_out(5).
+@node gtroff Output, Device and Font Description Files, File Formats, File Formats
+@section @code{gtroff} Output
+@cindex @code{gtroff}, output
+@cindex output, @code{gtroff}
+
+This section describes the @code{groff} intermediate output format
+produced by GNU @code{troff}.
+
+As @code{groff} is a wrapper program around GNU @code{troff} and
+automatically calls an output driver (or ``postprocessor''), this output
+does not show up normally. This is why it is called
+@emph{intermediate}. @code{groff} provides the option @option{-Z} to
+inhibit postprocessing such that the produced intermediate output is
+sent to standard output just as it is when calling GNU @code{troff}
+directly.
+
+@cindex @code{troff} output
+@cindex output, @code{troff}
+@cindex intermediate output
+@cindex output, intermediate
+Here, the term @dfn{troff output} describes what is output by
+GNU @code{troff}, while @dfn{intermediate output} refers to the language
+that is accepted by the parser that prepares this output for the output
+drivers. This parser handles whitespace more flexibly than
+@acronym{AT&T}'s implementation and implements obsolete elements for
+compatibility; otherwise, both formats are the same.@footnote{The parser
+and postprocessor for intermediate output can be found in the file@*
+@file{@var{groff-source-dir}/src/libs/libdriver/input.cpp}.}
+
+The main purpose of the intermediate output concept is to facilitate the
+development of postprocessors by providing a common programming
+interface for all devices. It has a language of its own that is
+completely different from the @code{gtroff} language. While the
+@code{gtroff} language is a high-level programming language for text
+processing, the intermediate output language is a kind of low-level
+assembler language by specifying all positions on the page for writing
+and drawing.
+
+The intermediate output produced by @code{gtroff} is fairly readable,
+while output from @acronym{AT&T} @code{troff} is rather hard to
+understand because of strange habits that are still supported, but not
+used any longer by @code{gtroff}.
+
+@menu
+* Language Concepts::
+* Command Reference::
+* Intermediate Output Examples::
+* Output Language Compatibility::
+@end menu
+
+@c ---------------------------------------------------------------------
+
+@node Language Concepts, Command Reference, gtroff Output, gtroff Output
+@subsection Language Concepts
+
+The fundamental operation of the GNU @code{troff} formatter is the
+translation of the @code{groff} input language into a device-independent
+form primarily concerned with what has to be written or drawn at
+specific positions on the output device. This language is simple and
+imperative. In the following discussion, the term @dfn{command} always
+refers to this intermediate output language, and never to the
+@code{groff} language intended for direct use by document authors.
+Intermediate output commands comprise several categories: glyph output;
+font, color, and text size selection; motion of the printing position;
+page advancement; drawing of geometric objects; and device control
+commands, a catch-all for operations not easily classified as any of the
+foregoing, such as directives to start and stop output, identify the
+intended output device, or place URL hyperlinks in supported output
+formats.
+
+@menu
+* Separation::
+* Argument Units::
+* Document Parts::
+@end menu
+
+@node Separation, Argument Units, Language Concepts, Language Concepts
+@subsubsection Separation
+
+@acronym{AT&T} @code{troff} output has strange requirements regarding
+whitespace. The @code{gtroff} output parser, however, is more tolerant,
+making whitespace maximally optional. Such characters, i.e., the tab,
+space, and newline, always have a syntactical meaning. They are never
+printable because spacing within the output is always done by
+positioning commands.
+
+Any sequence of space or tab characters is treated as a single
+@dfn{syntactical space}. It separates commands and arguments, but is
+only required when there would occur a clashing between the command code
+and the arguments without the space. Most often, this happens when
+variable-length command names, arguments, argument lists, or command
+clusters meet. Commands and arguments with a known, fixed length need
+not be separated by syntactical space.
+
+A line break is a syntactical element, too. Every command argument can
+be followed by whitespace, a comment, or a newline character. Thus a
+@dfn{syntactical line break} is defined to consist of optional
+syntactical space that is optionally followed by a comment, and a
+newline character.
+
+The normal commands, those for positioning and text, consist of a single
+letter taking a fixed number of arguments. For historical reasons, the
+parser allows stacking of such commands on the same line, but
+fortunately, in @code{gtroff}'s intermediate output, every command with
+at least one argument is followed by a line break, thus providing
+excellent readability.
+
+The other commands---those for drawing and device controlling---have a
+more complicated structure; some recognize long command names, and some
+take a variable number of arguments. So all @samp{D} and @samp{x}
+commands were designed to request a syntactical line break after their
+last argument. Only one command, @w{@samp{x X}}, has an argument that
+can span several input lines; all other commands must have all of
+their arguments on the same line as the command, i.e., the arguments may
+not be split by a line break.
+
+Empty lines (these are lines containing only space and/or a comment),
+can occur everywhere. They are just ignored.
+
+@node Argument Units, Document Parts, Separation, Language Concepts
+@subsubsection Argument Units
+
+Some commands take integer arguments that are assumed to represent
+values in a measurement unit, but the letter for the corresponding
+scaling unit is not written with the output command arguments. Most
+commands assume the scaling unit @samp{u}, the basic unit of the device,
+some use @samp{z}, the scaled point unit of the device, while others,
+such as the color commands, expect plain integers.
+
+Single characters can have the eighth bit set, as can the names of
+fonts and special characters. The names of characters and fonts can be
+of arbitrary length. A character that is to be printed is always in
+the current font.
+
+A string argument is always terminated by the next whitespace character
+(space, tab, or newline); an embedded @samp{#} character is regarded as
+part of the argument, not as the beginning of a comment command. An
+integer argument is already terminated by the next non-digit character,
+which then is regarded as the first character of the next argument or
+command.
+
+@node Document Parts, , Argument Units, Language Concepts
+@subsubsection Document Parts
+
+A correct intermediate output document consists of two parts, the
+@dfn{prologue} and the @dfn{body}.
+
+The task of the prologue is to set the general device parameters using
+three exactly specified commands. @code{gtroff}'s prologue is
+guaranteed to consist of the following three lines (in that order):
+
+@Example
+x T @var{device}
+x res @var{n} @var{h} @var{v}
+x init
+@endExample
+
+@noindent
+with the arguments set as outlined in @ref{Device Control Commands}.
+The parser for the intermediate output format is able to interpret
+additional whitespace and comments as well even in the prologue.
+
+The body is the main section for processing the document data.
+Syntactically, it is a sequence of any commands different from the ones
+used in the prologue. Processing is terminated as soon as the first
+@w{@samp{x stop}} command is encountered; the last line of any
+@code{gtroff} intermediate output always contains such a command.
+
+Semantically, the body is page oriented. A new page is started by a
+@samp{p} command. Positioning, writing, and drawing commands are always
+done within the current page, so they cannot occur before the first
+@samp{p} command. Absolute positioning (by the @samp{H} and @samp{V}
+commands) is done relative to the current page; all other positioning is
+done relative to the current location within this page.
+
+@c ---------------------------------------------------------------------
+
+@node Command Reference, Intermediate Output Examples, Language Concepts, gtroff Output
+@subsection Command Reference
+
+This section describes all intermediate output commands, both from
+@acronym{AT&T} @code{troff} as well as the @code{gtroff} extensions.
+
+@menu
+* Comment Command::
+* Simple Commands::
+* Graphics Commands::
+* Device Control Commands::
+* Obsolete Command::
+@end menu
+
+@node Comment Command, Simple Commands, Command Reference, Command Reference
+@subsubsection Comment Command
+
+@table @code
+@item #@var{anything}@angles{end of line}
+A comment. Ignore any characters from the @samp{#} character up to the
+next newline character.
+
+This command is the only possibility for commenting in the intermediate
+output. Each comment can be preceded by arbitrary syntactical space;
+every command can be terminated by a comment.
+@end table
+
+@node Simple Commands, Graphics Commands, Comment Command, Command Reference
+@subsubsection Simple Commands
+
+The commands in this subsection have a command code consisting of a
+single character, taking a fixed number of arguments. Most of them are
+commands for positioning and text writing. These commands are tolerant
+of whitespace. Optionally, syntactical space can be inserted before,
+after, and between the command letter and its arguments. All of these
+commands are stackable; i.e., they can be preceded by other simple
+commands or followed by arbitrary other commands on the same line. A
+separating syntactical space is necessary only when two integer
+arguments would clash or if the preceding argument ends with a string
+argument.
+
+@table @code
+@ignore
+.if (\n[@USE_ENV_STACK] == 1) \{\
+.command {
+Open a new environment by copying the actual device configuration data
+to the environment stack.
+.
+The current environment is setup by the device specification and
+manipulated by the setting commands.
+.
+.
+.command }
+Close the actual environment (opened by a preceding
+.BR { \~command)
+and restore the previous environment from the environment
+stack as the actual device configuration data.
+.
+\} \" endif @USE_ENV_STACK
+@end ignore
+
+@item C @var{id}@angles{whitespace}
+Typeset the glyph of the special character @var{id}. Trailing
+syntactical space is necessary to allow special character names of
+arbitrary length. The drawing position is not advanced.
+
+@item c @var{g}
+Typeset the glyph of the ordinary character@tie{}@var{c}. The drawing
+position is not advanced.
+
+@item f @var{n}
+Select the font mounted at position@tie{}@var{n}. @var{n}@tie{}cannot
+be negative.
+
+@item H @var{n}
+Horizontally move the drawing position to @var{n}@tie{}basic units from
+the left edge of the page. @var{n}@tie{}cannot be negative.
+
+@item h @var{n}
+Move the drawing position right @var{n} basic units. @acronym{AT&T}
+@code{troff} allowed negative @var{n}; GNU @code{troff} does not produce
+such values, but @code{groff}'s output driver library handles them.
+
+@item m @var{color-scheme} @r{[}@var{component} @dots{}@r{]}
+Select the stroke color using the @var{component}s in the color space
+@var{scheme}. Each @var{component} is an integer between 0 and 65535.
+The quantity of components and their meanings vary with each
+@var{scheme}. This command is a @code{groff} extension.
+
+@table @code
+@item mc @var{cyan} @var{magenta} @var{yellow}
+Use the CMY color scheme with components cyan, magenta, and yellow.
+
+@item md
+Use the default color (no components; black in most cases).
+
+@item mg @var{gray}
+Use a grayscale color scheme with a component ranging between 0 (black)
+and 65535 (white).
+
+@item mk @var{cyan} @var{magenta} @var{yellow} @var{black}
+Use the CMYK color scheme with components cyan, magenta, yellow, and
+black.
+
+@item mr @var{red} @var{green} @var{blue}
+Use the RGB color scheme with components red, green, and blue.
+@end table
+
+@item N @var{n}
+Typeset the glyph with index@tie{}@var{n} in the current font.
+@var{n}@tie{}is normally a non-negative integer. The drawing position
+is not advanced. The @code{html} and @code{xhtml} devices use this
+command with negative@tie{}@var{n} to produce unbreakable space; the
+absolute value of @var{n} is taken and interpreted in basic units.
+
+@item n @var{b} @var{a}
+Indicate a break. No action is performed; the command is present to
+make the output more easily parsed. The integers @var{b}
+and@tie{}@var{a} describe the vertical space amounts before and after
+the break, respectively. GNU @code{troff} issues this command but
+@code{groff}'s output driver library ignores it. See @code{v} and
+@code{V} below.
+
+@item p @var{n}
+Begin a new page, setting its number to@tie{}@var{n}. Each page is
+independent, even from those using the same number. The vertical
+drawing position is set to@tie{}0. All positioning, writing, and
+drawing commands are interpreted in the context of a page, so a
+@code{p}@tie{}command must precede them.
+
+@item s @var{n}
+Set type size to @var{n} scaled points (unit@tie{}@code{z} in GNU
+@code{troff}.
+@acronym{AT&T} @code{troff} used unscaled points @code{p} instead;
+see @ref{Output Language Compatibility}.
+
+@item t @var{xyz}@angles{whitespace}
+@itemx t @var{xyz} @var{dummy-arg}@angles{whitespace}
+Typeset a word @var{xyz}; that is, set a sequence of ordinary glyphs
+named @var{x}, @var{y}, @var{z}, @dots{}, terminated by a space
+character or a line break; an optional second integer argument is
+ignored (this allows the formatter to generate an even number of
+arguments). @c XXX: Why?
+Each glyph is set at the current drawing position, and the position is
+then advanced horizontally by the glyph's width. A glyph's width is
+read from its metrics in the font description file, scaled to the
+current type size, and rounded to a multiple of the horizontal motion
+quantum. Use the @code{C} command to emplace glyphs of special
+characters. The @code{t}@tie{}command is a @code{groff} extension and
+is output only for devices whose @file{DESC} file contains the
+@code{tcommand} directive; see @ref{DESC File Format}.
+
+@item u @var{n} @var{xyz}@angles{whitespace}
+Typeset word @var{xyz} with track kerning. As @code{t}, but after
+placing each glyph, the drawing position is further advanced
+horizontally by@tie{}@var{n} basic units (@code{u}). The
+@code{u}@tie{}command is a @code{groff} extension and is output only for
+devices whose @file{DESC} file contains the @code{tcommand} directive;
+see @ref{DESC File Format}.
+
+@item V @var{n}
+Vertically move the drawing position to @var{n}@tie{}basic units from
+the top edge of the page. @var{n}@tie{}cannot be negative.
+
+@item v @var{n}
+Move the drawing position down @var{n} basic units. @acronym{AT&T}
+@code{troff} allowed negative @var{n}; GNU @code{troff} does not produce
+such values, but @code{groff}'s output driver library handles them.
+
+@item w
+Indicate an inter-word space. No action is performed; the command is
+present to make the output more easily parsed. Only adjustable,
+breakable inter-word spaces are thus described; those resulting from
+@code{\~} or horizontal motion escape sequences are not. GNU
+@code{troff} issues this command but @code{groff}'s output driver
+library ignores it. See @code{h} and @code{H} above.
+@end table
+
+@node Graphics Commands, Device Control Commands, Simple Commands, Command Reference
+@subsubsection Graphics Commands
+
+Each graphics or drawing command in the intermediate output starts with
+the letter @samp{D}, followed by one or two characters that specify a
+subcommand; this is followed by a fixed or variable number of integer
+arguments that are separated by a single space character. A @samp{D}
+command may not be followed by another command on the same line (apart
+from a comment), so each @samp{D} command is terminated by a syntactical
+line break.
+
+@code{gtroff} output follows the classical spacing rules (no space
+between command and subcommand, all arguments are preceded by a single
+space character), but the parser allows optional space between the
+command letters and makes the space before the first argument optional.
+As usual, each space can be any sequence of tab and space characters.
+
+Some graphics commands can take a variable number of arguments. In this
+case, they are integers representing a size measured in basic units
+@samp{u}. The arguments called @var{h1}, @var{h2}, @dots{}, @var{hn}
+stand for horizontal distances where positive means right, negative
+left. The arguments called @var{v1}, @var{v2}, @dots{}, @var{vn} stand
+for vertical distances where positive means down, negative up. All
+these distances are offsets relative to the current location.
+
+Each graphics command directly corresponds to a similar @code{gtroff}
+@code{\D} escape sequence. @xref{Drawing Geometric Objects}.
+
+Unknown @samp{D} commands are assumed to be device-specific. Its
+arguments are parsed as strings; the whole information is then sent to
+the postprocessor.
+
+In the following command reference, the syntax element @angles{line
+break} means a syntactical line break as defined above.
+
+@table @code
+@item D~ @var{h1} @var{v1} @var{h2} @var{v2} @dots{} @var{hn} @var{vn}@angles{line break}
+Draw B-spline from current position to offset (@var{h1},@var{v1}), then
+to offset (@var{h2},@var{v2}), if given, etc., up to
+(@var{hn},@var{vn}). This command takes a variable number of argument
+pairs; the current position is moved to the terminal point of the drawn
+curve.
+
+@item Da @var{h1} @var{v1} @var{h2} @var{v2}@angles{line break}
+Draw arc from current position to
+(@var{h1},@var{v1})@math{+}(@var{h2},@var{v2}) with center at
+(@var{h1},@var{v1}); then move the current position to the final point
+of the arc.
+
+@item DC @var{d}@angles{line break}
+@itemx DC @var{d} @var{dummy-arg}@angles{line break}
+Draw a solid circle using the current fill color with
+diameter@tie{}@var{d} (integer in basic units @samp{u}) with leftmost
+point at the current position; then move the current position to the
+rightmost point of the circle. An optional second integer argument is
+ignored (this allows the formatter to generate an even number of
+arguments). This command is a @code{gtroff} extension.
+
+@item Dc @var{d}@angles{line break}
+Draw circle line with diameter@tie{}@var{d} (integer in basic units
+@samp{u}) with leftmost point at the current position; then move the
+current position to the rightmost point of the circle.
+
+@item DE @var{h} @var{v}@angles{line break}
+Draw a solid ellipse in the current fill color with a horizontal
+diameter of@tie{}@var{h} and a vertical diameter of@tie{}@var{v} (both
+integers in basic units @samp{u}) with the leftmost point at the current
+position; then move to the rightmost point of the ellipse. This command
+is a @code{gtroff} extension.
+
+@item De @var{h} @var{v}@angles{line break}
+Draw an outlined ellipse with a horizontal diameter of@tie{}@var{h} and
+a vertical diameter of@tie{}@var{v} (both integers in basic units
+@samp{u}) with the leftmost point at current position; then move to the
+rightmost point of the ellipse.
+
+@item DF @var{color-scheme} @r{[}@var{component} @dots{}@r{]}@angles{line break}
+Set fill color for solid drawing objects using different color schemes;
+the analogous command for setting the color of text, line graphics, and
+the outline of graphic objects is @samp{m}. The color components are
+specified as integer arguments between 0 and 65535. The number of color
+components and their meaning vary for the different color schemes.
+These commands are generated by @code{gtroff}'s escape sequences
+@samp{\D'F @dots{}'} and @code{\M} (with no other corresponding
+graphics commands). No position changing. This command is a
+@code{gtroff} extension.
+
+@table @code
+@item DFc @var{cyan} @var{magenta} @var{yellow}@angles{line break}
+Set fill color for solid drawing objects using the CMY color scheme,
+having the 3@tie{}color components @var{cyan}, @var{magenta}, and
+@var{yellow}.
+
+@item DFd@angles{line break}
+Set fill color for solid drawing objects to the default fill color value
+(black in most cases). No component arguments.
+
+@item DFg @var{gray}@angles{line break}
+Set fill color for solid drawing objects to the shade of gray given by
+the argument, an integer between 0 (black) and 65535 (white).
+
+@item DFk @var{cyan} @var{magenta} @var{yellow} @var{black}@angles{line break}
+Set fill color for solid drawing objects using the CMYK color scheme,
+having the 4@tie{}color components @var{cyan}, @var{magenta},
+@var{yellow}, and @var{black}.
+
+@item DFr @var{red} @var{green} @var{blue}@angles{line break}
+Set fill color for solid drawing objects using the RGB color scheme,
+having the 3@tie{}color components @var{red}, @var{green}, and
+@var{blue}.
+@end table
+
+@item Df @var{n}@angles{line break}
+The argument@tie{}@var{n} must be an integer in the range @math{-32767}
+to 32767.
+
+@table @asis
+@item @math{0 @leq{} @var{n} @leq{} 1000}
+Set the color for filling solid drawing objects to a shade of gray,
+where 0 corresponds to solid white, 1000 (the default) to solid black,
+and values in between to intermediate shades of gray; this is obsoleted
+by command @samp{DFg}.
+
+@item @math{@var{n} < 0} or @math{@var{n} > 1000}
+Set the filling color to the color that is currently being used for the
+text and the outline, see command @samp{m}. For example, the command
+sequence
+
+@Example
+mg 0 0 65535
+Df -1
+@endExample
+
+@noindent
+sets all colors to blue.
+@end table
+
+@noindent
+No position changing. This command is a @code{gtroff} extension.
+
+@item Dl @var{h} @var{v}@angles{line break}
+Draw line from current position to offset (@var{h},@var{v}) (integers in
+basic units @samp{u}); then set current position to the end of the drawn
+line.
+
+@item Dp @var{h1} @var{v1} @var{h2} @var{v2} @dots{} @var{hn} @var{vn}@angles{line break}
+Draw a polygon line from current position to offset (@var{h1},@var{v1}),
+from there to offset (@var{h2},@var{v2}), etc., up to offset
+(@var{hn},@var{vn}), and from there back to the starting position. For
+historical reasons, the position is changed by adding the sum of all
+arguments with odd index to the actual horizontal position and the even
+ones to the vertical position. Although this doesn't make sense it is
+kept for compatibility.
+@ignore
+As the polygon is closed, the end of drawing is the starting point, so
+the position doesn't change.
+@end ignore
+This command is a @code{gtroff} extension.
+
+@item DP @var{h1} @var{v1} @var{h2} @var{v2} @dots{} @var{hn} @var{vn}@angles{line break}
+Draw a solid polygon in the current fill color rather than an outlined
+polygon, using the same arguments and positioning as the corresponding
+@samp{Dp} command.
+@ignore
+No position changing.
+@end ignore
+This command is a @code{gtroff} extension.
+
+@item Dt @var{n}@angles{line break}
+Set the current line thickness to@tie{}@var{n} (an integer in basic
+units @samp{u}) if @math{@var{n}>0}; if @math{@var{n}=0} select the
+smallest available line thickness; if @math{@var{n}<0} set the line
+thickness proportional to the type size (this is the default before the
+first @samp{Dt} command was specified). For historical reasons, the
+horizontal position is changed by adding the argument to the actual
+horizontal position, while the vertical position is not changed.
+Although this doesn't make sense it is kept for compatibility.
+@ignore
+No position changing.
+@end ignore
+This command is a @code{gtroff} extension.
+@end table
+
+@node Device Control Commands, Obsolete Command, Graphics Commands, Command Reference
+@subsubsection Device Control Commands
+
+Each device control command starts with the letter @samp{x}, followed by
+a space character (optional or arbitrary space or tab in @code{gtroff})
+and a subcommand letter or word; each argument (if any) must be preceded
+by a syntactical space. All @samp{x} commands are terminated by a
+syntactical line break; no device control command can be followed by
+another command on the same line (except a comment).
+
+The subcommand is basically a single letter, but to increase
+readability, it can be written as a word, i.e., an arbitrary sequence of
+characters terminated by the next tab, space, or newline character. All
+characters of the subcommand word but the first are simply ignored. For
+example, @code{gtroff} outputs the initialization command @w{@samp{x i}}
+as @w{@samp{x init}} and the resolution command @w{@samp{x r}} as
+@w{@samp{x res}}.
+
+In the following, the syntax element @angles{line break} means a
+syntactical line break (@pxref{Separation}).
+
+@table @code
+@item xF @var{name}@angles{line break}
+The @samp{F} stands for @var{Filename}.
+
+Use @var{name} as the intended name for the current file in error
+reports. This is useful for remembering the original file name when
+@code{gtroff} uses an internal piping mechanism. The input file is not
+changed by this command. This command is a @code{gtroff} extension.
+
+@item xf @var{n} @var{s}@angles{line break}
+The @samp{f} stands for @var{font}.
+
+Mount font position@tie{}@var{n} (a non-negative integer) with font
+named@tie{}@var{s} (a text word). @xref{Font Positions}.
+
+@item xH @var{n}@angles{line break}
+The @samp{H} stands for @var{Height}.
+
+Set glyph height to@tie{}@var{n} (a positive integer in scaled points
+@samp{z}). @acronym{AT&T} @code{troff} uses the unit points (@samp{p})
+instead. @xref{Output Language Compatibility}.
+
+@item xi@angles{line break}
+The @samp{i} stands for @var{init}.
+
+Initialize device. This is the third command of the prologue.
+
+@item xp@angles{line break}
+The @samp{p} stands for @var{pause}.
+
+Parsed but ignored. The @acronym{AT&T} @code{troff} manual documents
+this command as
+
+@display
+pause device, can be restarted
+@end display
+
+but GNU @code{troff} output drivers do nothing with this command.
+
+@item xr @var{n} @var{h} @var{v}@angles{line break}
+The @samp{r} stands for @var{resolution}.
+
+Resolution is@tie{}@var{n}, while @var{h} is the minimal horizontal
+motion, and @var{v} the minimal vertical motion possible with this
+device; all arguments are positive integers in basic units @samp{u} per
+inch. This is the second command of the prologue.
+
+@item xS @var{n}@angles{line break}
+The @samp{S} stands for @var{Slant}.
+
+Set slant to@tie{}@var{n} (an integer in basic units @samp{u}).
+
+@item xs@angles{line break}
+The @samp{s} stands for @var{stop}.
+
+Terminates the processing of the current file; issued as the last
+command of any intermediate @code{troff} output.
+
+@item xt@angles{line break}
+The @samp{t} stands for @var{trailer}.
+
+Generate trailer information, if any. In GNU @code{troff}, this is
+ignored.
+
+@item xT @var{xxx}@angles{line break}
+The @samp{T} stands for @var{Typesetter}.
+
+Set the name of the output driver to @var{xxx}, a sequence of
+non-whitespace characters terminated by whitespace. The possible names
+correspond to those of @code{groff}'s @option{-T} option. This is the
+first command of the prologue.
+
+@item xu @var{n}@angles{line break}
+The @samp{u} stands for @var{underline}.
+
+Configure underlining of spaces. If @var{n} is@tie{}1, start
+underlining of spaces; if @var{n} is@tie{}0, stop underlining of spaces.
+This is needed for the @code{cu} request in @code{nroff} mode and is
+ignored otherwise. This command is a @code{gtroff} extension.
+
+@item xX @var{anything}@angles{line break}
+The @samp{x} stands for @var{X-escape}.
+
+Send string @var{anything} uninterpreted to the device. If the line
+following this command starts with a @samp{+} character this line is
+interpreted as a continuation line in the following sense. The @samp{+}
+is ignored, but a newline character is sent instead to the device, the
+rest of the line is sent uninterpreted. The same applies to all
+following lines until the first character of a line is not a @samp{+}
+character. This command is generated by the @code{gtroff} escape
+sequence @code{\X}. The line-continuing feature is a @code{gtroff}
+extension.
+@end table
+
+@node Obsolete Command, , Device Control Commands, Command Reference
+@subsubsection Obsolete Command
+In @acronym{AT&T} @code{troff} output, the writing of a single glyph is
+mostly done by a very strange command that combines a horizontal move
+and a single character giving the glyph name. It doesn't have a command
+code, but is represented by a 3-character argument consisting of exactly
+2@tie{}digits and a character.
+
+@table @asis
+@item @var{dd}@var{g}
+Move right @var{dd} (exactly two decimal digits) basic units @samp{u},
+then print glyph@tie{}@var{g} (represented as a single character).
+
+In GNU @code{troff}, arbitrary syntactical space around and within this
+command is allowed. Only when a preceding command on the same line ends
+with an argument of variable length is a separating space obligatory.
+In @acronym{AT&T} @code{troff}, large clusters of these and other
+commands are used, mostly without spaces; this made such output almost
+unreadable.
+@end table
+
+For modern high-resolution devices, this command does not make sense
+because the width of the glyphs can become much larger than two decimal
+digits. In @code{gtroff}, this is only used for the devices @code{X75},
+@code{X75-12}, @code{X100}, and @code{X100-12}. For other devices, the
+commands @samp{t} and @samp{u} provide a better functionality.
+
+@c ---------------------------------------------------------------------
+
+@node Intermediate Output Examples, Output Language Compatibility, Command Reference, gtroff Output
+@subsection Intermediate Output Examples
+
+This section presents the intermediate output generated from the same
+input for three different devices. The input is the sentence @samp{hell
+world} fed into @code{gtroff} on the command line.
+
+@table @asis
+@item High-resolution device @code{ps}
+
+This is the standard output of @code{gtroff} if no @option{-T} option is
+given.
+
+@example
+@group
+shell> echo "hell world" | groff -Z -T ps
+
+x T ps
+x res 72000 1 1
+x init
+@end group
+p1
+x font 5 TR
+f5
+s10000
+V12000
+H72000
+thell
+wh2500
+tw
+H96620
+torld
+n12000 0
+@group
+x trailer
+V792000
+x stop
+@end group
+@end example
+
+@noindent
+This output can be fed into @code{grops} to get its representation as a
+PostScript file.
+
+@item Low-resolution device @code{latin1}
+
+This is similar to the high-resolution device except that the
+positioning is done at a minor scale. Some comments (lines starting
+with @samp{#}) were added for clarification; they were not generated by
+the formatter.
+
+@example
+@group
+shell> echo "hell world" | groff -Z -T latin1
+
+# prologue
+x T latin1
+x res 240 24 40
+x init
+@end group
+# begin a new page
+p1
+# font setup
+x font 1 R
+f1
+s10
+# initial positioning on the page
+V40
+H0
+# write text 'hell'
+thell
+# inform about space, and issue a horizontal jump
+wh24
+# write text 'world'
+tworld
+# announce line break, but do nothing because...
+n40 0
+@group
+# ...the end of the document has been reached
+x trailer
+V2640
+x stop
+@end group
+@end example
+
+@noindent
+This output can be fed into @code{grotty} to get a formatted text
+document.
+
+@item @acronym{AT&T} @code{troff} output
+Since a computer monitor has a much lower resolution than modern
+printers, the intermediate output for X11 devices can use the
+jump-and-write command with its 2-digit displacements.
+
+@example
+@group
+shell> echo "hell world" | groff -Z -T X100
+
+x T X100
+x res 100 1 1
+x init
+@end group
+p1
+x font 5 TR
+f5
+s10
+V16
+H100
+# write text with jump-and-write commands
+ch07e07l03lw06w11o07r05l03dh7
+n16 0
+@group
+x trailer
+V1100
+x stop
+@end group
+@end example
+
+@noindent
+This output can be fed into @code{xditview} or @code{gxditview} for
+displaying in@tie{}X.
+
+Due to the obsolete jump-and-write command, the text clusters in the
+@acronym{AT&T} @code{troff} output are almost unreadable.
+@end table
+
+@c ---------------------------------------------------------------------
+
+@node Output Language Compatibility, , Intermediate Output Examples, gtroff Output
+@subsection Output Language Compatibility
+
+The intermediate output language of @acronym{AT&T} @code{troff} was
+first documented in @cite{A Typesetter-independent TROFF}, by Brian
+Kernighan, and by 1992 the @acronym{AT&T} @code{troff} manual was
+updated to incorprate a description of it.
+
+The GNU @code{troff} intermediate output format is compatible with this
+specification except for the following features.
+
+@itemize @bullet
+@item
+The classical quasi-device independence is not yet implemented.
+
+@item
+The old hardware was very different from what we use today. So the
+@code{groff} devices are also fundamentally different from the ones
+in @acronym{AT&T} @code{troff}. For example, the @acronym{AT&T}
+PostScript device is called @code{post} and has a resolution of only 720
+units per inch, suitable for printers 20 years ago, while @code{groff}'s
+@code{ps} device has a resolution of 72000 units per inch. Maybe, by
+implementing some rescaling mechanism similar to the classical
+quasi-device independence, @code{groff} could emulate @acronym{AT&T}'s
+@code{post} device.
+
+@item
+The B-spline command @samp{D~} is correctly handled by the intermediate
+output parser, but the drawing routines aren't implemented in some of
+the postprocessor programs.
+
+@item
+The argument of the commands @samp{s} and @w{@samp{x H}} has the
+implicit unit scaled point @samp{z} in @code{gtroff}, while
+@acronym{AT&T} @code{troff} has point (@samp{p}). This isn't an
+incompatibility but a compatible extension, for both units coincide for
+all devices without a @code{sizescale} parameter in the @file{DESC}
+file, including all postprocessors from @acronym{AT&T} and
+@code{groff}'s text devices. The few @code{groff} devices with a
+@code{sizescale} parameter either do not exist for @acronym{AT&T}
+@code{troff}, have a different name, or seem to have a different
+resolution. So conflicts are very unlikely.
+
+@item
+The position changing after the commands @samp{Dp}, @samp{DP}, and
+@samp{Dt} is illogical, but as old versions of @code{gtroff} used this
+feature it is kept for compatibility reasons.
+
+@ignore
+Temporarily, there existed some confusion on the positioning after the
+@samp{D} commands that are @code{groff} extensions. This has been
+clarified by establishing the classical rule for all @code{groff}
+drawing commands:
+
+@itemize
+@item
+The position after a graphic object has been drawn is at its end; for
+circles and ellipses, the `end' is at the right side.
+
+@item
+From this, the positionings specified for the drawing commands above
+follow quite naturally.
+@end itemize
+@end ignore
+
+@end itemize
+@c END TODO: Make parallel with groff_out(5).
+
+
+@c =====================================================================
+
+@c BEGIN Keep parallel with groff_font(5).
+@node Device and Font Description Files, , gtroff Output, File Formats
+@section Device and Font Description Files
+@cindex font files
+@cindex files, font
+
+The @code{groff} font and output device description formats are slight
+extensions of those used by @acronym{AT&T} device-independent
+@code{troff}. In distinction to the @acronym{AT&T} implementation,
+@code{groff} lacks a binary format; all files are text
+files.@footnote{Plan@tie{}9 @code{troff} has also abandoned the binary
+format.} The device and font description files for a device @var{name}
+are stored in a @file{dev@var{name}} directory. The device description
+file is called @file{DESC}, and, for each font supported by the device,
+a font description file is called@tie{}@file{@var{f}}, where
+@var{f}@tie{}is usually an abbreviation of a font's name and/or style.
+For example, the @code{ps} (PostScript) device has @code{groff} font
+description files for Times roman (@file{TR}) and Zapf Chancery Medium
+italic (@file{ZCMI}), among many others, while the @code{utf8} device
+(for terminal emulators) has only font descriptions for the roman,
+italic, bold, and bold-italic styles (@file{R}, @file{I}, @file{B}, and
+@file{BI}, respectively).
+
+Device and font description files are read both by the formatter, GNU
+@code{troff}, and by output drivers. The programs delegate these files'
+processing to an internal library, @file{libgroff}, ensuring their
+consistent interpretation.
+
+@menu
+* DESC File Format::
+* Font Description File Format::
+@end menu
+
+@c ---------------------------------------------------------------------
+
+@node DESC File Format, Font Description File Format, Device and Font Description Files, Device and Font Description Files
+@subsection @file{DESC} File Format
+@cindex @file{DESC} file format
+@cindex font description file format
+@cindex format of font description file
+
+The @file{DESC} file contains a series of directives; each begins a
+line. Their order is not important, with two exceptions: (1) the
+@code{res} directive must precede any @code{papersize} directive; and
+(2) the @code{charset} directive must come last (if at all). If a
+directive name is repeated, later entries in the file override previous
+ones (except that the paper dimensions are computed based on the
+@code{res} directive last seen when @code{papersize} is encountered).
+Spaces and/or tabs separate words and are ignored at line boundaries.
+@cindex comments in device description files
+@cindex device description files, comments
+@kindex #
+Comments start with the @samp{#} character and extend to the end of a
+line. Empty lines are ignored.
+
+@table @code
+@item family @var{fam}
+@kindex family
+The default font family is @var{fam}.
+
+@item fonts @var{n} @var{F1} @r{@dots{}} @var{Fn}
+@kindex fonts
+Fonts @var{F1}, @dots{}, @var{Fn} are mounted at font positions
+@var{m}+1, @dots{}, @var{m}+@var{n} where @var{m} is the number of
+@code{styles} (see below). This directive may extend over more than one
+line. A font name of@tie{}@code{0} causes no font to be mounted at the
+corresponding position.
+
+@item hor @var{n}
+@kindex hor
+@cindex horizontal motion quantum
+@cindex motion quantum, horizontal
+@cindex quantum, horizontal motion
+@cindex horizontal resolution
+@cindex resolution, horizontal
+The horizontal motion quantum is @var{n}@tie{}basic units. All
+horizontal quantities are rounded to multiples of@tie{}@var{n}.
+
+@item image_generator @var{program}
+@kindex image_generator
+@cindex PostScript, PNG image generation
+@cindex PNG image generation from PostScript
+Use @var{program} to generate PNG images from PostScript input. Under
+GNU/Linux, this is usually @code{gs}, but under other systems (notably
+Cygwin) it might be set to another name. The @code{grohtml} driver uses
+this directive.
+
+@item paperlength @var{n}
+@kindex paperlength
+The vertical dimension of the output medium is @var{n}@tie{}basic units
+(deprecated: use @code{papersize} instead).
+
+@item papersize @var{format-or-dimension-pair-or-file-name} @r{@dots{}}
+@kindex papersize
+The dimensions of the output medium are as according to the
+argument, which is either a standard paper format, a pair of dimensions,
+or the name of a plain text file containing either of the foregoing.
+
+Recognized paper formats are the ISO and DIN formats
+@code{A0}--@code{A7}, @code{B0}--@code{B7}, @code{C0}--@code{C7},
+@code{D0}--@code{D7}; the U.S.@: paper types @code{letter},
+@code{legal}, @code{tabloid}, @code{ledger}, @code{statement}, and
+@code{executive}; and the envelope formats @code{com10}, @code{monarch},
+and @code{DL}. Matching is performed without regard for lettercase.
+
+Alternatively, the argument can be a custom paper format in the format
+@code{@var{length},@var{width}} (with no spaces before or after the
+comma). Both @var{length} and @var{width} must have a unit appended;
+valid units are @samp{i} for inches, @samp{c} for centimeters, @samp{p}
+for points, and @samp{P} for picas. Example: @samp{12c,235p}. An
+argument that starts with a digit is always treated as a custom paper
+format.
+
+Finally, the argument can be a file name (e.g., @file{/etc/papersize});
+if the file can be opened, the first line is read and a match attempted
+against each of the other forms. No comment syntax is supported.
+
+More than one argument can be specified;
+each is scanned in turn and the first valid paper specification used.
+
+@item paperwidth @var{n}
+@kindex paperwidth
+The horizontal dimension of the output medium is @var{n}@tie{}basic
+units (deprecated: use @code{papersize} instead).
+
+@item pass_filenames
+@kindex pass_filenames
+Direct GNU @code{troff} to emit the name of the source file being
+processed. This is achieved with the intermediate output command
+@samp{x F}, which @code{grohtml} interprets.
+
+@item postpro @var{program}
+@kindex postpro
+Use @var{program} as the postprocessor.
+
+@item prepro @var{program}
+@kindex prepro
+Use @var{program} as a preprocessor. The @code{html} and @code{xhtml}
+output devices use this directive.
+
+@item print @var{program}
+@kindex print
+Use @var{program} as a spooler program for printing. If omitted, the
+@option{-l} and @option{-L} options of @code{groff} are ignored.
+
+@item res @var{n}
+@kindex res
+@cindex device resolution
+@cindex resolution, device
+The device resolution is @var{n}@tie{}basic units per inch.
+
+@item sizes @var{s1} @r{@dots{}} @var{sn} 0
+@kindex sizes
+The device has fonts at @var{s1}, @dots{}, @var{sn} scaled points (see
+below). The list of sizes must be terminated by@tie{}@code{0}. Each
+@var{si} can also be a range of sizes @var{m}--@var{n}. The list can
+extend over more than one line.
+
+@item sizescale @var{n}
+@kindex sizescale
+A typographical point is subdivided into @var{n}@tie{}scaled points.
+The default is@tie{}@code{1}. @xref{Using Fractional Type Sizes}.
+
+@item styles @var{S1} @r{@dots{}} @var{Sm}
+@kindex styles
+The first@tie{}@var{m} mounting positions are associated with styles
+@var{S1}, @dots{}, @var{Sm}.
+
+@item tcommand
+@kindex tcommand
+The postprocessor can handle the @samp{t} and @samp{u} intermediate
+output commands.
+
+@item unicode
+@kindex unicode
+The output device supports the complete Unicode repertoire. This
+directive is useful only for devices that produce character entities
+instead of glyphs.
+
+If @code{unicode} is present, no @code{charset} section is required in
+the font description files since the Unicode handling built into
+@code{groff} is used. However, if there are entries in a font
+description file's @code{charset} section, they either override the
+default mappings for those particular characters or add new mappings
+(normally for composite characters).
+
+The @code{utf8}, @code{html}, and @code{xhtml} output devices use this
+directive.
+
+@item unitwidth @var{n}
+@kindex unitwidth
+Quantities in the font description files are in basic units for fonts
+whose type size is @var{n}@tie{}scaled points.
+
+@item unscaled_charwidths
+@kindex unscaled_charwidths
+Make the font handling module always return unscaled character widths.
+The @code{grohtml} driver uses this directive.
+
+@item use_charnames_in_special
+@kindex use_charnames_in_special
+GNU @code{troff} should encode special characters inside device control
+commands; see @ref{Postprocessor Access}. The @code{grohtml} driver
+uses this directive.
+
+@item vert @var{n}
+@kindex vert
+@cindex vertical motion quantum
+@cindex motion quantum, vertical
+@cindex quantum, vertical motion
+@cindex vertical resolution
+@cindex resolution, vertical
+The vertical motion quantum is @var{n}@tie{}basic units. All vertical
+quantities are rounded to multiples of@tie{}@var{n}.
+
+@item charset
+@kindex charset
+This line and everything following it in the file are ignored. It is
+recognized for compatibility with other @code{troff} implementations.
+In GNU @code{troff}, character set repertoire is described on a
+per-font basis.
+@end table
+
+@kindex spare1
+@kindex spare2
+@kindex biggestfont
+GNU @code{troff} recognizes but ignores the directives @code{spare1},
+@code{spare2}, and @code{biggestfont}.
+
+The @code{res}, @code{unitwidth}, @code{fonts}, and @code{sizes} lines
+are mandatory. Directives not listed above are ignored by GNU
+@code{troff} but may be used by postprocessors to obtain further
+information about the device.
+
+@c ---------------------------------------------------------------------
+
+@node Font Description File Format, , DESC File Format, Device and Font Description Files
+@subsection Font Description File Format
+@cindex font file, format
+@cindex font description file, format
+@cindex format of font files
+@cindex format of font description files
+
+On typesetting output devices, each font is typically available at
+multiple sizes. While paper measurements in the device description file
+are in absolute units, measurements applicable to fonts must be
+proportional to the type size. @code{groff} achieves this using the
+precedent set by @acronym{AT&T} device-independent @code{troff}: one
+font size is chosen as a norm, and all others are scaled linearly
+relative to that basis. The ``unit width'' is the number of basic units
+per point when the font is rendered at this nominal size.
+
+For instance, @code{groff}'s @code{lbp} device uses a @code{unitwidth}
+of@tie{}800. Its Times roman font @samp{TR} has a @code{spacewidth}
+of@tie{}833; this is also the width of its comma, period, centered
+period, and mathematical asterisk, while its @samp{M} is 2,963 basic
+units. Thus, an @samp{M} on the @code{lbp} device is 2,963 basic units
+wide at a notional type size of 800@tie{}points.@footnote{800-point type
+is not practical for most purposes, but using it enables the quantities
+in the font description files to be expressed as integers.}
+
+A font description file has two sections. The first is a sequence of
+directives, and is parsed similarly to the @file{DESC} file described
+above. Except for the directive names that begin the second section,
+their ordering is immaterial. Later directives of the same name
+override earlier ones, spaces and tabs are handled in the same way,
+@cindex comments in font description files
+@cindex font description files, comments
+@kindex #
+and the same comment syntax is supported. Empty lines are ignored
+throughout.
+
+@table @code
+@item name @var{f}
+@kindex name
+The name of the font is@tie{}@var{f}. @samp{DESC} is an invalid font
+name. Simple integers are valid, but their use is
+discouraged.@footnote{@code{groff} requests and escape sequences
+interpret non-negative font names as mounting positions instead.
+Further, a font named @samp{0} cannot be automatically mounted by the
+@code{fonts} directive of a @file{DESC} file.}
+
+@item spacewidth @var{n}
+@kindex spacewidth
+The width of an unadjusted inter-word space is @var{n}@tie{}basic units.
+@end table
+
+The directives above must appear in the first section; those below are
+optional.
+
+@table @code
+@item slant @var{n}
+@kindex slant
+The font's glyphs have a slant of @var{n}@tie{}degrees; a positive
+@var{n} slants in the direction of text flow.
+
+@item ligatures @var{lig1} @r{@dots{}} @var{lign} @r{[}0@r{]}
+@kindex ligatures
+Glyphs @var{lig1}, @dots{}, @var{lign} are ligatures; possible ligatures
+are @samp{ff}, @samp{fi}, @samp{fl}, @samp{ffi} and @samp{ffl}. For
+compatibility with other @code{troff} implementations, the list of
+ligatures may be terminated with a@tie{}@code{0}. The list of ligatures
+must not extend over more than one line.
+
+@item special
+@cindex special fonts
+@kindex special
+The font is @dfn{special}: when a glyph is requested that is not present
+in the current font, it is sought in any mounted fonts that bear this
+property.
+@end table
+
+Other directives in this section are ignored by GNU @code{troff}, but
+may be used by postprocessors to obtain further information about the
+font.
+
+The second section contains one or two subsections. These can appear in
+either order; the first one encountered commences the second section.
+Each starts with a directive on a line by itself. A @code{charset}
+subsection is mandatory unless the associated @file{DESC} file contains
+the @code{unicode} directive. Another subsection, @code{kernpairs},
+is optional.
+
+@kindex charset
+The directive @code{charset} starts the character set
+subsection.@footnote{For typesetter devices, this directive is misnamed
+since it starts a list of glyphs, not characters.} It precedes a series
+of glyph descriptions, one per line. Each such glyph description
+comprises a set of fields separated by spaces or tabs and organized as
+follows.
+
+@quotation
+@var{name} @var{metrics} @var{type} @var{code} [@var{entity-name}]
+[@code{--} @var{comment}]
+@end quotation
+
+@cindex 8-bit input
+@cindex input, 8-bit
+@cindex accessing unnamed glyphs with @code{\N}
+@cindex unnamed glyphs, accessing with @code{\N}
+@cindex characters, unnamed, accessing with @code{\N}
+@cindex glyphs, unnamed, accessing with @code{\N}
+@kindex ---
+@noindent
+@var{name} identifies the glyph:
+@c XXX: Move this footnote to a more general discussion since it is
+@c applicable to the groff system overall.
+@c
+@c @footnote{The distinction between input, characters, and output,
+@c glyphs, is not clearly separated in the terminology of @code{groff};
+@c for example, the @code{char} request should be called @code{glyph}
+@c since it defines an output entity.}
+if @var{name} is a printable character@tie{}@var{c}, it corresponds to
+the @code{troff} ordinary character@tie{}@var{c}. If @var{name} is a
+multi-character sequence not beginning with @code{\}, it corresponds to
+the GNU @code{troff} special character escape sequence
+@samp{\[@var{name}]}. A name consisting of three minus signs,
+@samp{---}, is special and indicates that the glyph is unnamed: such
+glyphs can be accessed only by the @code{\N} escape sequence in
+@code{troff}. A special character named @samp{---} can still be defined
+using @code{char} and similar requests. The @var{name} @samp{\-}
+defines the minus sign glyph. Finally, @var{name} can be the
+unbreakable one-sixth and one-twelfth space escape sequences, @code{\|}
+and @code{\^} (``thin'' and ``hair'' spaces, respectively), in which
+case only the width metric described below is interpreted; a font can
+thus customize the widths of these spaces.
+@c XXX: For exhaustivity purposes...you can define "\whatever", which
+@c has to be accessed with \C'\\whatever' or \[\\whatever], but the
+@c parser matches predefined escape sequences before looking up special
+@c characters. Most such definitions are inaccessible from the
+@c language, because nearly every '\x', where 'x' is a Unicode basic
+@c Latin character, is a predefined groff escape sequence.
+@c
+@c XXX: Commented out because the charXXX feature is very legacy, and as
+@c noted below, discouraged in font description files.
+@c
+@c GNU @code{troff} supports 8-bit input characters; however some
+@c utilities have difficulties with eight-bit characters. For this
+@c reason, there is a convention that the entity name @samp{char@var{n}}
+@c is equivalent to the single input character whose code
+@c is@tie{}@var{n}. For example, @samp{char163} would be equivalent to
+@c the character with code@tie{}163, which is the pounds sterling sign
+@c in the ISO@tie{}@w{Latin-1} character set. You shouldn't use
+@c @samp{char@var{n}} entities in font description files since they are
+@c related to input, not output. Otherwise, you get hard-coded
+@c connections between input and output encoding, which prevents use of
+@c different (input) character sets.
+
+The form of the @var{metrics} field is as follows.
+
+@display
+@group
+@var{width}[@code{,}[@var{height}[@code{,}[@var{depth}[@code{,}[@var{italic-correction}
+ [@code{,}[@var{left-italic-correction}[@code{,}[@var{subscript-correction}]]]]]]]]]]
+@end group
+@end display
+
+@noindent
+There must not be any spaces, tabs, or newlines between these
+@dfn{subfields} (which have been split here into two lines only for
+better legibility). The subfields are in basic units expressed as
+decimal integers. Unspecified subfields default to@tie{}@code{0}.
+Since there is no associated binary format, these values are not
+required to fit into the C language data type @samp{char} as they are in
+@acronym{AT&T} device-independent @code{troff}.
+
+The @var{width} subfield gives the width of the glyph. The @var{height}
+subfield gives the height of the glyph (upward is positive); if a glyph
+does not extend above the baseline, it should be given a zero height,
+rather than a negative height. The @var{depth} subfield gives the depth
+of the glyph, that is, the distance below the baseline to which the
+glyph extends (downward is positive); if a glyph does not extend below
+the baseline, it should be given a zero depth, rather than a negative
+depth. Italic corrections are relevant to glyphs in italic or oblique
+styles. The @var{italic-correction} is the amount of space that should
+be added after an oblique glyph to be followed immediately by an upright
+glyph. The @var{left-italic-correction} is the amount of space that
+should be added before an oblique glyph to be preceded immediately by an
+upright glyph. The @var{subscript-correction} is the amount of space
+that should be added after an oblique glyph to be followed by a
+subscript; it should be less than the italic correction.
+
+For fonts used with typesetting devices, the @var{type} field gives a
+featural description of the glyph: it is a bit mask recording whether
+the glyph is an ascender, descender, both, or neither. When a @code{\w}
+escape sequence is interpolated, these values are bitwise or-ed
+together for each glyph and stored in the @code{nr} register. In font
+descriptions for terminal devices, all glyphs might have a type of zero,
+regardless of their appearance.
+
+@table @code
+@item 0
+means the glyph lies entirely between the baseline and a horizontal line
+at the ``x-height'' of the font; typical examples are @samp{a},
+@samp{c}, and @samp{x};
+
+@item 1
+means the glyph descends below the baseline, like @samp{p};
+
+@item 2
+means the glyph ascends above the font's x-height, like @samp{A} or
+@samp{b}; and
+
+@item 3
+means the glyph is both an ascender and a descender---this is true of
+parentheses in some fonts.
+@end table
+
+The @var{code} field gives a numeric identifier that the postprocessor
+uses to render the glyph. The glyph can be specified to @code{troff}
+using this code by means of the @code{\N} escape sequence. @var{code}
+can be any integer.@footnote{that is, any integer parsable by the C
+standard library's @cite{strtol@r{(3)}} function}
+
+The @var{entity-name} field defines an identifier for the glyph that the
+postprocessor uses to print the GNU @code{troff} glyph @var{name}. This
+field is optional; it was introduced so that the @code{grohtml} output
+driver could encode its character set. For example, the glyph
+@samp{\[Po]} is represented by @samp{&pound;} in @acronym{HTML} 4.0.
+For efficiency, these data are now compiled directly into
+@code{grohtml}. @code{grops} uses the field to build sub-encoding
+arrays for PostScript fonts containing more than 256 glyphs. Anything
+on the line after the @var{entity-name} field or @samp{--} is ignored.
+
+A line in the @code{charset} section can also have the form
+
+@Example
+@var{name} "
+@endExample
+
+@noindent
+identifying @var{name} as another name for the glyph mentioned in the
+preceding line. Such aliases can be chained.
+
+@kindex kernpairs
+The directive @code{kernpairs} starts a list of kerning adjustments to
+be made to adjacent glyph pairs from this font. It contains a sequence
+of lines formatted as follows.
+
+@Example
+@var{g1} @var{g2} @var{n}
+@endExample
+
+@noindent
+The foregoing means that when glyph @var{g1} is typeset immediately
+before @var{g2}, the space between them should be increased
+by@tie{}@var{n}. Most kerning pairs should have a negative value
+for@tie{}@var{n}.
+@c END Keep parallel with groff_font(5).
+
+@codequotebacktick off
+@codequoteundirected off
+
+
+
+@c =====================================================================
+@c =====================================================================
+
+@node Copying This Manual, Request Index, Font Description File Format, Top
+@appendix Copying This Manual
+
+@include fdl.texi
+
+
+
+@c =====================================================================
+@c =====================================================================
+
+@c This'll do us for the rest of the file...
+@codequotebacktick on
+@codequoteundirected on
+
+@node Request Index, Escape Sequence Index, Copying This Manual, Top
+@appendix Request Index
+
+Request names appear without a leading control character; the defaults
+are @code{.} for the regular control character and @code{'} for the
+no-break control character.
+
+@printindex rq
+
+
+
+@c =====================================================================
+@c =====================================================================
+
+@node Escape Sequence Index, Operator Index, Request Index, Top
+@appendix Escape Sequence Index
+
+The escape character, @code{\} by default, is always followed by at
+least one more input character, making an escape @emph{sequence}. Any
+input token @code{\@var{X}} with @var{X} not in the list below emits a
+warning and interpolates glyph @var{X}. Note the entries for @code{\.},
+which may be obscured by the leader dots, and for @code{\@key{RET}} and
+@code{\@key{SP}}, which are sorted alphabetically, not by code point
+order.
+
+@printindex es
+
+
+
+@c =====================================================================
+@c =====================================================================
+
+@node Operator Index, Register Index, Escape Sequence Index, Top
+@appendix Operator Index
+
+@printindex op
+
+
+
+@c =====================================================================
+@c =====================================================================
+
+@node Register Index, Macro Index, Operator Index, Top
+@appendix Register Index
+
+The macro package or program a specific register belongs to is appended
+in brackets.
+
+A register name@tie{}@code{x} consisting of exactly one character can be
+accessed as @samp{\nx}. A register name @code{xx} consisting of exactly
+two characters can be accessed as @samp{\n(xx}. Register names
+@code{xxx} of any length can be accessed as @samp{\n[xxx]}.
+
+@printindex vr
+
+
+
+@c =====================================================================
+@c =====================================================================
+
+@node Macro Index, String Index, Register Index, Top
+@appendix Macro Index
+
+The macro package a specific macro belongs to is appended in brackets.
+They appear without the leading control character (normally @samp{.}).
+
+@printindex ma
+
+
+
+@c =====================================================================
+@c =====================================================================
+
+@node String Index, File Keyword Index, Macro Index, Top
+@appendix String Index
+
+The macro package or program a that defines or uses each string is
+appended in brackets. (Only one string, @code{.T}, is defined by the
+@code{troff} formatter itself.) @xref{Strings}.
+
+
+@printindex st
+
+
+
+@c =====================================================================
+@c =====================================================================
+
+@node File Keyword Index, Program and File Index, String Index, Top
+@appendix File Keyword Index
+
+@printindex ky
+
+
+
+@c =====================================================================
+@c =====================================================================
+
+@node Program and File Index, Concept Index, File Keyword Index, Top
+@appendix Program and File Index
+
+@printindex pg
+
+
+
+@c =====================================================================
+@c =====================================================================
+
+@node Concept Index, , Program and File Index, Top
+@appendix Concept Index
+
+@printindex cp
+
+
+@bye
+
+@c Local Variables:
+@c mode: texinfo
+@c coding: latin-1
+@c fill-column: 72
+@c End:
+@c vim: set textwidth=72:
diff --git a/doc/groff.txt b/doc/groff.txt
new file mode 100644
index 0000000..fab73d4
--- /dev/null
+++ b/doc/groff.txt
@@ -0,0 +1,18123 @@
+GNU 'troff'
+1 Introduction
+ 1.1 Background
+ 1.2 What Is 'groff'?
+ 1.3 'groff' Capabilities
+ 1.4 Macro Packages
+ 1.5 Preprocessors
+ 1.6 Output Devices
+ 1.7 Installation
+ 1.8 Conventions Used in This Manual
+ 1.9 Credits
+2 Invoking 'groff'
+ 2.1 Options
+ 2.2 Environment
+ 2.3 Macro Directories
+ 2.4 Font Directories
+ 2.5 Paper Format
+ 2.6 Invocation Examples
+3 Tutorial for Macro Users
+ 3.1 Basics
+ 3.2 Common Features
+ 3.2.1 Paragraphs
+ 3.2.2 Sections and Chapters
+ 3.2.3 Headers and Footers
+ 3.2.4 Page Layout
+ 3.2.5 Displays and Keeps
+ 3.2.6 Footnotes and Endnotes
+ 3.2.7 Table of Contents
+ 3.2.8 Indexing
+ 3.2.9 Document Formats
+ 3.2.10 Columnation
+ 3.2.11 Font and Size Changes
+ 3.2.12 Predefined Text
+ 3.2.13 Preprocessor Support
+ 3.2.14 Configuration and Customization
+4 Macro Packages
+ 4.1 'man'
+ 4.1.1 Optional 'man' extensions
+ Custom headers and footers
+ Ultrix-specific man macros
+ Simple example
+ 4.2 'mdoc'
+ 4.3 'me'
+ 4.4 'mm'
+ 4.5 'mom'
+ 4.6 'ms'
+ 4.6.1 Introduction
+ 4.6.1.1 Basic information
+ 4.6.2 Document Structure
+ 4.6.3 Document Control Settings
+ Margin settings
+ Titles (headers, footers)
+ Text settings
+ Paragraph settings
+ Heading settings
+ Footnote settings
+ Display settings
+ Other settings
+ 4.6.4 Document Description Macros
+ 4.6.5 Body Text
+ 4.6.5.1 Text settings
+ 4.6.5.2 Typographical symbols
+ 4.6.5.3 Paragraphs
+ 4.6.5.4 Headings
+ 4.6.5.5 Typeface and decoration
+ 4.6.5.6 Lists
+ 4.6.5.7 Indented regions
+ 4.6.5.8 Keeps, boxed keeps, and displays
+ 4.6.5.9 Tables, figures, equations, and references
+ 4.6.5.10 Footnotes
+ 4.6.5.11 Language and localization
+ 4.6.6 Page layout
+ 4.6.6.1 Headers and footers
+ 4.6.6.2 Tab stops
+ 4.6.6.3 Margins
+ 4.6.6.4 Multiple columns
+ 4.6.6.5 Creating a table of contents
+ 4.6.7 Differences from AT&T 'ms'
+ 4.6.7.1 Unix Version 7 'ms' macros not implemented by 'groff' 'ms'
+ 4.6.8 Legacy Features
+ AT&T accent mark strings
+ Berkeley accent mark and glyph strings
+ 4.6.9 Naming Conventions
+5 GNU 'troff' Reference
+ 5.1 Text
+ 5.1.1 Filling
+ 5.1.2 Sentences
+ 5.1.3 Hyphenation
+ 5.1.4 Breaking
+ 5.1.5 Adjustment
+ 5.1.6 Tabs and Leaders
+ 5.1.7 Requests and Macros
+ 5.1.8 Macro Packages
+ 5.1.9 Input Encodings
+ 5.1.10 Input Conventions
+ 5.2 Page Geometry
+ 5.3 Measurements
+ 5.3.1 Motion Quanta
+ 5.3.2 Default Units
+ 5.4 Numeric Expressions
+ 5.5 Identifiers
+ 5.6 Formatter Instructions
+ 5.6.1 Control Characters
+ 5.6.2 Invoking Requests
+ 5.6.3 Calling Macros
+ 5.6.4 Using Escape Sequences
+ 5.6.5 Delimiters
+ 5.7 Comments
+ 5.8 Registers
+ 5.8.1 Setting Registers
+ 5.8.2 Interpolating Registers
+ 5.8.3 Auto-increment
+ 5.8.4 Assigning Register Formats
+ 5.8.5 Built-in Registers
+ 5.9 Manipulating Filling and Adjustment
+ 5.10 Manipulating Hyphenation
+ 5.11 Manipulating Spacing
+ 5.12 Tabs and Fields
+ 5.12.1 Leaders
+ 5.12.2 Fields
+ 5.13 Character Translations
+ 5.14 'troff' and 'nroff' Modes
+ 5.15 Line Layout
+ 5.16 Line Continuation
+ 5.17 Page Layout
+ 5.18 Page Control
+ 5.19 Using Fonts
+ 5.19.1 Selecting Fonts
+ 5.19.2 Font Families
+ 5.19.3 Font Positions
+ 5.19.4 Using Symbols
+ 5.19.5 Character Classes
+ 5.19.6 Special Fonts
+ 5.19.7 Artificial Fonts
+ 5.19.8 Ligatures and Kerning
+ 5.19.9 Italic Corrections
+ 5.19.10 Dummy Characters
+ 5.20 Manipulating Type Size and Vertical Spacing
+ 5.20.1 Changing the Type Size
+ 5.20.2 Changing the Vertical Spacing
+ 5.20.3 Using Fractional Type Sizes
+ 5.21 Colors
+ 5.22 Strings
+ 5.23 Conditionals and Loops
+ 5.23.1 Operators in Conditionals
+ 5.23.2 if-then
+ 5.23.3 if-else
+ 5.23.4 Conditional Blocks
+ 5.23.5 while
+ 5.24 Writing Macros
+ 5.24.1 Parameters
+ 5.24.2 Copy Mode
+ 5.25 Page Motions
+ 5.26 Drawing Geometric Objects
+ 5.27 Deferring Output
+ 5.28 Traps
+ 5.28.1 Vertical Position Traps
+ 5.28.1.1 Page Location Traps
+ 5.28.1.2 The Implicit Page Trap
+ 5.28.1.3 Diversion Traps
+ 5.28.2 Input Line Traps
+ 5.28.3 Blank Line Traps
+ 5.28.4 Leading Space Traps
+ 5.28.5 End-of-input Traps
+ 5.29 Diversions
+ 5.30 Punning Names
+ 5.31 Environments
+ 5.32 Suppressing Output
+ 5.33 I/O
+ 5.34 Postprocessor Access
+ 5.35 Miscellaneous
+ 5.36 'gtroff' Internals
+ 5.37 Debugging
+ 5.37.1 Warnings
+ 5.38 Implementation Differences
+ 5.38.1 Safer Mode
+ 5.38.2 Compatibility Mode
+ 5.38.3 Other Differences
+6 File Formats
+ 6.1 'gtroff' Output
+ 6.1.1 Language Concepts
+ 6.1.1.1 Separation
+ 6.1.1.2 Argument Units
+ 6.1.1.3 Document Parts
+ 6.1.2 Command Reference
+ 6.1.2.1 Comment Command
+ 6.1.2.2 Simple Commands
+ 6.1.2.3 Graphics Commands
+ 6.1.2.4 Device Control Commands
+ 6.1.2.5 Obsolete Command
+ 6.1.3 Intermediate Output Examples
+ 6.1.4 Output Language Compatibility
+ 6.2 Device and Font Description Files
+ 6.2.1 'DESC' File Format
+ 6.2.2 Font Description File Format
+Appendix A Copying This Manual
+Appendix B Request Index
+Appendix C Escape Sequence Index
+Appendix D Operator Index
+Appendix E Register Index
+Appendix F Macro Index
+Appendix G String Index
+Appendix H File Keyword Index
+Appendix I Program and File Index
+Appendix J Concept Index
+GNU 'troff'
+***********
+
+This manual documents GNU 'troff' version 1.23.0.
+
+ Copyright © 1994-2023 Free Software Foundation, Inc.
+
+ Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU Free Documentation License,
+ Version 1.3 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".
+
+1 Introduction
+**************
+
+GNU 'roff' (or 'groff') is a programming system for typesetting
+documents. It is highly flexible and has been used extensively for over
+thirty years.
+
+1.1 Background
+==============
+
+M. Douglas McIlroy, formerly of AT&T Bell Laboratories and present at
+the creation of the Unix operating system, offers an authoritative
+historical summary.
+
+ The prime reason for Unix was the desire of Ken [Thompson], Dennis
+ [Ritchie], and Joe Ossanna to have a pleasant environment for
+ software development. The fig leaf that got the nod from ...
+ management was that an early use would be to develop a
+ "stand-alone" word-processing system for use in typing pools and
+ secretarial offices. Perhaps they had in mind "dedicated", as
+ distinct from "stand-alone"; that's what eventuated in various
+ cases, most notably in the legal/patent department and in the AT&T
+ CEO's office.
+
+ Both those systems were targets of opportunity, not foreseen from
+ the start. When Unix was up and running on the PDP-11, Joe got
+ wind of the legal department having installed a commercial word
+ processor. He went to pitch Unix as an alternative and clinched a
+ trial by promising to make 'roff' able to number lines by tomorrow
+ in order to fulfill a patent-office requirement that the commercial
+ system did not support.
+
+ Modems were installed so legal-department secretaries could try the
+ Research machine. They liked it and Joe's superb customer service.
+ Soon the legal department got a system of their own. Joe went on
+ to create 'nroff' and 'troff'. Document preparation became a
+ widespread use of Unix, but no stand-alone word-processing system
+ was ever undertaken.
+
+ A history relating 'groff' to its predecessors 'roff', 'nroff', and
+'troff' is available in the 'roff(7)' man page.
+
+1.2 What Is 'groff'?
+====================
+
+'groff' (GNU 'roff') is a typesetting system that reads plain text input
+files that include formatting commands to produce output in PostScript,
+PDF, HTML, DVI, or other formats, or for display to a terminal.
+Formatting commands can be low-level typesetting primitives, macros from
+a supplied package, or user-defined macros. All three approaches can be
+combined.
+
+ A reimplementation and extension of the typesetter from AT&T Unix,
+'groff' is present on most POSIX systems owing to its long association
+with Unix manuals (including man pages). It and its predecessor are
+notable for their production of several best-selling software
+engineering texts. 'groff' is capable of producing typographically
+sophisticated documents while consuming minimal system resources.
+
+1.3 'groff' Capabilities
+========================
+
+GNU 'troff' is a typesetting document formatter; it provides a wide
+range of low-level text and page operations within the framework of a
+programming language. These operations compose to generate footnotes,
+tables of contents, mathematical equations, diagrams, multi-column text,
+and other elements of typeset works. Here is a survey of formatter
+features; all are under precise user control.
+
+ * text filling, breaking, alignment to the left or right margin;
+ centering
+
+ * adjustment of inter-word space size to justify text, and of
+ inter-sentence space size to suit local style conventions
+
+ * automatic and manual determination of hyphenation break points
+
+ * pagination
+
+ * selection of any font available to the output device
+
+ * adjustment of type size and vertical spacing (or "leading")
+
+ * configuration of line length and indentation amounts; columnation
+
+ * drawing of geometric primitives (lines, arcs, polygons, circles,
+ ...)
+
+ * setup of stroke and fill colors (where supported by the output
+ device)
+
+ * embedding of hyperlinks, images, document metadata, and other
+ inclusions (where supported by the output device)
+
+1.4 Macro Packages
+==================
+
+Elemental typesetting functions can be be challenging to use directly
+with complex documents. A "macro" facility specifies how certain
+routine operations, such as starting paragraphs, or printing headers and
+footers, should be performed in terms of those low-level instructions.
+Macros can be specific to one document or collected together into a
+"macro package" for use by many. Several macro packages available; the
+most widely used are provided with 'groff'. They are 'man', 'mdoc',
+'me', 'mm', 'mom', and 'ms'.
+
+1.5 Preprocessors
+=================
+
+An alternative approach to complexity management, particularly when
+constructing tables, setting mathematics, or drawing diagrams, lies in
+preprocessing. A "preprocessor" employs a domian-specific language to
+ease the generation of tables, equations, and so forth in terms that are
+convenient for human entry. Each preprocessor reads a document and
+translates the parts of it that apply to it into GNU 'troff' input.
+Command-line options to 'groff' tell it which preprocessors to use.
+
+ 'groff' provides preprocessors for laying out tables ('gtbl'),
+typesetting equations ('geqn'), drawing diagrams ('gpic' and 'ggrn'),
+inserting bibliographic references ('grefer'), and drawing chemical
+structures ('gchem'). An associated program that is useful when dealing
+with preprocessors is 'gsoelim'.(1) (*note Preprocessor
+Intro-Footnote-1::)
+
+ 'groff' also supports 'grap', a preprocessor for drawing graphs. A
+free implementation of it can be obtained separately.
+
+ Unique to 'groff' is the 'preconv' preprocessor that enables 'groff'
+to handle documents in a variety of input encodings.
+
+ Other preprocessors exist, but no free implementations are known. An
+example is 'ideal', which draws diagrams using a mathematical constraint
+language.
+
+ (1) The 'g' prefix is not used on all systems; see *note Invoking
+groff::.
+
+1.6 Output Devices
+==================
+
+GNU 'troff''s output is in a device-independent page description
+language, which is then read by an "output driver" that translates this
+language into a file format or byte stream that a piece of (possibly
+emulated) hardware understands. 'groff' features output drivers for
+PostScript devices, terminal emulators (and other simple typewriter-like
+machines), X11 (for previewing), TeX DVI, HP LaserJet 4/PCL5 and Canon
+LBP printers (which use CaPSL), HTML, XHTML, and PDF.
+
+1.7 Installation
+================
+
+Locate installation instructions in the files 'INSTALL',
+'INSTALL.extra', and 'INSTALL.REPO' in the 'groff' source distribution.
+Being a GNU project, 'groff' supports the familiar './configure && make'
+command sequence.
+
+1.8 Conventions Used in This Manual
+===================================
+
+We apply the term "groff" to the language documented here, the GNU
+implementation of the overall system, the project that develops that
+system, and the command of that name. In the first sense, 'groff' is an
+extended dialect of the 'roff' language, for which many similar
+implementations exist.
+
+ The 'roff' language features several major categories for which many
+items are predefined. Presentations of these items feature the form in
+which the item is most commonly used on the left, and, aligned to the
+right margin, the name of the category in brackets.
+
+ -- Register: \n[example]
+ The register 'example' is one that that 'groff' _doesn't_
+ predefine. You can create it yourself, though; see *note Setting
+ Registers::.
+
+ To make this document useful as a reference and not merely amiable
+bedtime reading, we tend to present these syntax items in exhaustive
+detail when they arise. References to topics discussed later in the
+text are frequent; skip material you don't understand yet.
+
+ We use Texinfo's "result" (=>) and error-> notations to present
+output written to the standard output and standard error streams,
+respectively. Diagnostic messages from the GNU 'troff' formatter and
+other programs are examples of the latter, but the formatter can also be
+directed to write user-specified messages to the standard error stream.
+The notation then serves to identify the output stream and does not
+necessarily mean that an error has occurred.(1) (*note Conventions Used
+in This Manual-Footnote-1::)
+
+ $ echo "Twelve o'clock and" | groff -Tascii | sed '/^$/d'
+ => Twelve o'clock and
+ $ echo '.tm all is well.' | groff > /dev/null
+ error-> all is well.
+
+ Sometimes we use => somewhat abstractly to represent formatted text
+that you will need to use a PostScript or PDF viewer program (or a
+printer) to observe. While arguably an abuse of notation, we think this
+preferable to requiring the reader to understand the syntax of these
+page description languages.
+
+ We also present diagnostic messages in an abbreviated form, often
+omitting the name of the program issuing them, the input file name, and
+line number or other positional information when such data do not serve
+to illuminate the topic under discussion.
+
+ Most examples are of 'roff' language input that would be placed in a
+text file. Occasionally, we start an example with a '$' character to
+indicate a shell prompt, as seen above.
+
+ You are encouraged to try the examples yourself, and to alter them to
+better learn 'groff''s behavior. Our examples frequently need to direct
+the formatter to set a line length (with '.ll') that will fit within the
+page margins of this manual. We mention this so that you know why it is
+there before we discuss the 'll' request formally.(2) (*note
+Conventions Used in This Manual-Footnote-2::)
+
+ (1) Unix and related operating systems distinguish standard output
+and standard error streams _because_ of 'troff':
+<https://minnie.tuhs.org/pipermail/tuhs/2013-December/006113.html>.
+
+ (2) *Note Line Layout::.
+
+1.9 Credits
+===========
+
+We adapted portions of this manual from existing documents. James
+Clark's man pages were an essential resource; we have updated them in
+parallel with the development of this manual. We based the tutorial for
+macro users on Eric Allman's introduction to his 'me' macro package
+(which we also provide, little altered from 4.4BSD). Larry Kollar
+contributed much of the material on the 'ms' macro package.
+
+2 Invoking 'groff'
+******************
+
+This chapter focuses on how to invoke the 'groff' front end. This front
+end takes care of the details of constructing the pipeline among the
+preprocessors, 'gtroff' and the postprocessor.
+
+ It has become a tradition that GNU programs get the prefix 'g' to
+distinguish them from their original counterparts provided by the host
+(*note Environment::). Thus, for example, 'geqn' is GNU 'eqn'. On
+operating systems like GNU/Linux or the Hurd, which don't contain
+proprietary versions of 'troff', and on MS-DOS/MS-Windows, where 'troff'
+and associated programs are not available at all, this prefix is omitted
+since GNU 'troff' is the only incarnation of 'troff' used. Exception:
+'groff' is never replaced by 'roff'.
+
+ In this document, we consequently say 'gtroff' when talking about the
+GNU 'troff' program. All other implementations of 'troff' are called
+AT&T 'troff', which is the common origin of almost all 'troff'
+implementations(1) (*note Invoking groff-Footnote-1::) (with more or
+less compatible changes). Similarly, we say 'gpic', 'geqn', and so on.
+
+ (1) Besides 'groff', 'neatroff' is an exception.
+
+2.1 Options
+===========
+
+'groff' normally runs the 'gtroff' program and a postprocessor
+appropriate for the selected device. The default device is 'ps' (but it
+can be changed when 'groff' is configured and built). It can optionally
+preprocess with any of 'gpic', 'geqn', 'gtbl', 'ggrn', 'grap', 'gchem',
+'grefer', 'gsoelim', or 'preconv'.
+
+ This section documents only options to the 'groff' front end. Many
+of the arguments to 'groff' are passed on to 'gtroff'; therefore, those
+are also included. Arguments to preprocessors and output drivers can be
+found in the man pages 'gpic(1)', 'geqn(1)', 'gtbl(1)', 'ggrn(1)',
+'grefer(1)', 'gchem(1)', 'gsoelim(1)', 'preconv(1)', 'grotty(1)',
+'grops(1)', 'gropdf(1)', 'grohtml(1)', 'grodvi(1)', 'grolj4(1)',
+'grolbp(1)', and 'gxditview(1)'.
+
+ The command-line format for 'groff' is:
+
+ groff [ -abceghijklpstvzCEGNRSUVXZ ] [ -dCS ] [ -DARG ]
+ [ -fFAM ] [ -FDIR ] [ -IDIR ] [ -KARG ]
+ [ -LARG ] [ -mNAME ] [ -MDIR ] [ -nNUM ]
+ [ -oLIST ] [ -PARG ] [ -rCN ] [ -TDEV ]
+ [ -wNAME ] [ -WNAME ] [ FILES... ]
+
+ The command-line format for 'gtroff' is as follows.
+
+ gtroff [ -abcivzCERU ] [ -dCS ] [ -fFAM ] [ -FDIR ]
+ [ -mNAME ] [ -MDIR ] [ -nNUM ] [ -oLIST ]
+ [ -rCN ] [ -TNAME ] [ -wNAME ] [ -WNAME ]
+ [ FILES... ]
+
+Obviously, many of the options to 'groff' are actually passed on to
+'gtroff'.
+
+ Options without an argument can be grouped behind a single '-'. A
+filename of '-' denotes the standard input. Whitespace is permitted
+between an option and its argument.
+
+ The 'grog' command can be used to guess the correct 'groff' command
+to format a file. See its man page 'grog(1)'; type 'man grog' at the
+command line to view it.
+
+ 'groff''s command-line options are as follows.
+
+'-a'
+ Generate a plain text approximation of the typeset output. The
+ read-only register '.A' is set to 1. *Note Built-in Registers::.
+ This option produces a sort of abstract preview of the formatted
+ output.
+
+ * Page breaks are marked by a phrase in angle brackets; for
+ example, '<beginning of page>'.
+
+ * Lines are broken where they would be in the formatted output.
+
+ * A horizontal motion of any size is represented as one space.
+ Adjacent horizontal motions are not combined. Inter-sentence
+ space nodes (those arising from the second argument to the
+ 'ss' request) are not represented.
+
+ * Vertical motions are not represented.
+
+ * Special characters are rendered in angle brackets; for
+ example, the default soft hyphen character appears as '<hy>'.
+
+ The above description should not be considered a specification; the
+ details of '-a' output are subject to change.
+
+'-b'
+ Write a backtrace reporting the state of 'gtroff''s input parser to
+ the standard error stream with each diagnostic message. The line
+ numbers given in the backtrace might not always be correct, because
+ 'gtroff''s idea of line numbers can be confused by requests that
+ append to macros.
+
+'-c'
+ Start with color output disabled.
+
+'-C'
+ Enable AT&T 'troff' compatibility mode; implies '-c'. *Note
+ Implementation Differences::, for the list of incompatibilities
+ between 'groff' and AT&T 'troff'.
+
+'-dCTEXT'
+'-dSTRING=TEXT'
+ Define 'roff' string C or STRING as T or TEXT. C must be one
+ character; STRING can be of arbitrary length. Such string
+ assignments happen before any macro file is loaded, including the
+ startup file. Due to 'getopt_long' limitations, C cannot be, and
+ STRING cannot contain, an equals sign, even though that is a valid
+ character in a 'roff' identifier.
+
+'-DENC'
+ Set fallback input encoding used by 'preconv' to ENC; implies '-k'.
+
+'-e'
+ Run 'geqn' preprocessor.
+
+'-E'
+ Inhibit 'gtroff' error messages. This option does _not_ suppress
+ messages sent to the standard error stream by documents or macro
+ packages using 'tm' or related requests.
+
+'-fFAM'
+ Use FAM as the default font family. *Note Font Families::.
+
+'-FDIR'
+ Search in directory 'DIR' for the selected output device's
+ directory of device and font description files. See the
+ description of 'GROFF_FONT_PATH' in *note Environment:: below for
+ the default search locations and ordering.
+
+'-g'
+ Run 'ggrn' preprocessor.
+
+'-G'
+ Run 'grap' preprocessor; implies '-p'.
+
+'-h'
+ Display a usage message and exit.
+
+'-i'
+ Read the standard input after all the named input files have been
+ processed.
+
+'-IDIR'
+ Search the directory DIR for files named in several contexts;
+ implies '-g' and '-s'.
+
+ * 'gsoelim' replaces 'so' requests with the contents of their
+ file name arguments.
+
+ * 'gtroff' searches for files named as operands in its command
+ line and as arguments to 'psbb', 'so', and 'soquiet' requests.
+
+ * Output drivers may search for files; for instance, 'grops'
+ looks for files named in '\X'ps: import ...'', '\X'ps: file
+ ...'', and '\X'pdf: pdfpic ...'' device control escape
+ sequences.
+
+ This option may be specified more than once; the directories are
+ searched in the order specified. If you want to search the current
+ directory before others, add '-I .' at the desired place. The
+ current working directory is otherwise searched last. '-I' works
+ similarly to, and is named for, the "include" option of Unix C
+ compilers.
+
+ '-I' options are passed to 'gsoelim', 'gtroff', and output drivers;
+ with the flag letter changed to '-M', they are also passed to
+ 'ggrn'.
+
+'-j'
+ Run 'gchem' preprocessor. Implies '-p'.
+
+'-k'
+ Run 'preconv' preprocessor. Refer to its man page for its behavior
+ if neither of 'groff''s '-K' or '-D' options is also specified.
+
+'-KENC'
+ Set input encoding used by 'preconv' to ENC; implies '-k'.
+
+'-l'
+ Send the output to a spooler for printing. The 'print' directive
+ in the device description file specifies the default command to be
+ used; see *note Device and Font Description Files::. See options
+ '-L' and '-X'.
+
+'-LARG'
+ Pass ARG to the print spooler program. If multiple ARGs are
+ required, pass each with a separate '-L' option. 'groff' does not
+ prefix an option dash to ARG before passing it to the spooler
+ program.
+
+'-mNAME'
+ Process the file 'NAME.tmac' prior to any input files. If not
+ found, 'tmac.NAME' is attempted. NAME (in both arrangements) is
+ presumed to be a macro file; see the description of
+ 'GROFF_TMAC_PATH' in *note Environment:: below for the default
+ search locations and ordering. This option and its argument are
+ also passed to 'geqn', 'grap', and 'ggrn'.
+
+'-MDIR'
+ Search directory 'DIR' for macro files; see the description of
+ 'GROFF_TMAC_PATH' in *note Environment:: below for the default
+ search locations and ordering. This option and its argument are
+ also passed to 'geqn', 'grap', and 'ggrn'.
+
+'-nNUM'
+ Number the first page NUM.
+
+'-N'
+ Prohibit newlines between 'eqn' delimiters: pass '-N' to 'geqn'.
+
+'-oLIST'
+ Output only pages in LIST, which is a comma-separated list of page
+ ranges; 'N' means page N, 'M-N' means every page between M and N,
+ '-N' means every page up to N, 'N-' means every page from N on.
+ 'gtroff' stops processing and exits after formatting the last page
+ enumerated in LIST.
+
+'-p'
+ Run 'gpic' preprocessor.
+
+'-PARG'
+ Pass ARG to the postprocessor. If multiple ARGs are required, pass
+ each with a separate '-P' option. 'groff' does not prefix an
+ option dash to ARG before passing it to the postprocessor.
+
+'-rCNUMERIC-EXPRESSION'
+'-rREGISTER=EXPR'
+ Set 'roff' register C or REGISTER to the value NUMERIC-EXPRESSION
+ (*note Numeric Expressions::). C must be one character; REGISTER
+ can be of arbitrary length. Such register assignments happen
+ before any macro file is loaded, including the startup file. Due
+ to 'getopt_long' limitations, C cannot be, and REGISTER cannot
+ contain, an equals sign, even though that is a valid character in a
+ 'roff' identifier.
+
+'-R'
+ Run 'grefer' preprocessor. No mechanism is provided for passing
+ arguments to 'grefer' because most 'grefer' options have equivalent
+ language elements that can be specified within the document.
+
+ 'gtroff' also accepts a '-R' option, which is not accessible via
+ 'groff'. This option prevents the loading of the 'troffrc' and
+ 'troffrc-end' files.
+
+'-s'
+ Run 'gsoelim' preprocessor.
+
+'-S'
+ Operate in "safer" mode; see '-U' below for its opposite. For
+ security reasons, safer mode is enabled by default.
+
+'-t'
+ Run 'gtbl' preprocessor.
+
+'-TDEV'
+ Direct 'gtroff' to format the input for the output device DEV.
+ 'groff' then calls an output driver to convert 'gtroff''s output to
+ a form appropriate for DEV. The following output devices are
+ available.
+
+ 'ps'
+ For PostScript printers and previewers.
+
+ 'pdf'
+ For PDF viewers or printers.
+
+ 'dvi'
+ For TeX DVI format.
+
+ 'X75'
+ For a 75dpi X11 previewer.
+
+ 'X75-12'
+ For a 75dpi X11 previewer with a 12-point base font in the
+ document.
+
+ 'X100'
+ For a 100dpi X11 previewer.
+
+ 'X100-12'
+ For a 100dpi X11 previewer with a 12-point base font in the
+ document.
+
+ 'ascii'
+ For typewriter-like devices using the (7-bit) ASCII (ISO 646)
+ character set.
+
+ 'latin1'
+ For typewriter-like devices that support the Latin-1
+ (ISO 8859-1) character set.
+
+ 'utf8'
+ For typewriter-like devices that use the Unicode (ISO 10646)
+ character set with UTF-8 encoding.
+
+ 'cp1047'
+ For typewriter-like devices that use the EBCDIC encoding IBM
+ code page 1047.
+
+ 'lj4'
+ For HP LaserJet4-compatible (or other PCL5-compatible)
+ printers.
+
+ 'lbp'
+ For Canon CaPSL printers (LBP-4 and LBP-8 series laser
+ printers).
+
+ 'html'
+ 'xhtml'
+ To produce HTML and XHTML output, respectively. This driver
+ consists of two parts, a preprocessor ('pre-grohtml') and a
+ postprocessor ('post-grohtml').
+
+ The predefined GNU 'troff' string '.T' contains the name of the
+ output device; the read-only register '.T' is set to 1 if this
+ option is used (which is always true if 'groff' is used to call GNU
+ 'troff'). *Note Built-in Registers::.
+
+ The postprocessor to be used for a device is specified by the
+ 'postpro' command in the device description file. (*Note Device
+ and Font Description Files::.) This can be overridden with the
+ '-X' option.
+
+'-U'
+ Operate in "unsafe mode", which enables the 'open', 'opena', 'pi',
+ 'pso', and 'sy' requests. These requests are disabled by default
+ because they allow an untrusted input document to write to
+ arbitrary file names and run arbitrary commands. This option also
+ adds the current directory to the macro package search path; see
+ the '-m' option above. '-U' is passed to 'gpic' and 'gtroff'.
+
+'-v'
+ Write version information for 'groff' and all programs run by it to
+ the standard output stream; that is, the given command line is
+ processed in the usual way, passing '-v' to the formatter and any
+ pre- or postprocessors invoked.
+
+'-V'
+ Output the pipeline that would be run by 'groff' (as a wrapper
+ program) to the standard output stream, but do not execute it. If
+ given more than once, the pipeline is both written to the standard
+ error stream and run.
+
+'-wCATEGORY'
+ Enable warnings in CATEGORY. Categories are listed in *note
+ Warnings::.
+
+'-WCATEGORY'
+ Inhibit warnings in CATEGORY. Categories are listed in *note
+ Warnings::.
+
+'-X'
+ Use 'gxditview' instead of the usual postprocessor to (pre)view a
+ document on an X11 display. Combining this option with '-Tps' uses
+ the font metrics of the PostScript device, whereas the '-TX75' and
+ '-TX100' options use the metrics of X11 fonts.
+
+'-z'
+ Suppress formatted output from 'gtroff'.
+
+'-Z'
+ Disable postprocessing. 'gtroff' output will appear on the
+ standard output stream (unless suppressed with '-z'; see *note
+ gtroff Output:: for a description of this format.
+
+2.2 Environment
+===============
+
+There are also several environment variables (of the operating system,
+not within 'gtroff') that can modify the behavior of 'groff'.
+
+'GROFF_BIN_PATH'
+ This search path, followed by 'PATH', is used for commands executed
+ by 'groff'.
+
+'GROFF_COMMAND_PREFIX'
+ If this is set to X, then 'groff' runs 'Xtroff' instead of
+ 'gtroff'. This also applies to 'tbl', 'pic', 'eqn', 'grn', 'chem',
+ 'refer', and 'soelim'. It does not apply to 'grops', 'grodvi',
+ 'grotty', 'pre-grohtml', 'post-grohtml', 'preconv', 'grolj4',
+ 'gropdf', and 'gxditview'.
+
+ The default command prefix is determined during the installation
+ process. If a non-GNU 'troff' system is found, prefix 'g' is used,
+ none otherwise.
+
+'GROFF_ENCODING'
+ The value of this variable is passed to the 'preconv'
+ preprocessor's '-e' option to select the character encoding of
+ input files. This variable's existence implies the 'groff' option
+ '-k'. If set but empty, 'groff' calls 'preconv' without an '-e'
+ option. 'groff''s '-K' option overrides 'GROFF_ENCODING'. See the
+ 'preconv(7)' man page; type 'man preconv' at the command line to
+ view it.
+
+'GROFF_FONT_PATH'
+ A list of directories in which to seek the selected output device's
+ directory of device and font description files. GNU 'troff' will
+ search directories given as arguments to any specified '-F' options
+ before these, and a built-in list of directories after them. *Note
+ Font Directories:: and the 'troff(1)' or 'gtroff(1)' man pages.
+
+'GROFF_TMAC_PATH'
+ A list of directories in which to seek macro files. GNU 'troff'
+ will search directories given as arguments to any specified '-M'
+ options before these, and a built-in list of directories after
+ them. *Note Macro Directories:: and the 'troff(1)' or 'gtroff(1)'
+ man pages.
+
+'GROFF_TMPDIR'
+ The directory in which 'groff' creates temporary files. If this is
+ not set and 'TMPDIR' is set, temporary files are created in that
+ directory. Otherwise temporary files are created in a
+ system-dependent default directory (on Unix and GNU/Linux systems,
+ this is usually '/tmp'). 'grops', 'grefer', 'pre-grohtml', and
+ 'post-grohtml' can create temporary files in this directory.
+
+'GROFF_TYPESETTER'
+ Sets the default output device. If empty or not set, a build-time
+ default (often 'ps') is used. The '-TDEV' option overrides
+ 'GROFF_TYPESETTER'.
+
+'SOURCE_DATE_EPOCH'
+ A timestamp (expressed as seconds since the Unix epoch) to use as
+ the output creation timestamp in place of the current time. The
+ time is converted to human-readable form using 'localtime(3)' when
+ the formatter starts up and stored in registers usable by documents
+ and macro packages (*note Built-in Registers::).
+
+'TZ'
+ The time zone to use when converting the current time (or value of
+ 'SOURCE_DATE_EPOCH') to human-readable form; see 'tzset(3)'.
+
+ MS-DOS and MS-Windows ports of 'groff' use semicolons, rather than
+colons, to separate the directories in the lists described above.
+
+2.3 Macro Directories
+=====================
+
+A macro file must have a name in the form 'NAME.tmac' or 'tmac.NAME' and
+be placed in a "tmac directory" to be found by the '-mNAME' command-line
+option.(1) (*note Macro Directories-Footnote-1::) Together, these
+directories constitute the "tmac path". Each directory is searched in
+the following order until the desired macro file is found or the list is
+exhausted.
+
+ * Directories specified with GNU 'troff''s or 'groff''s '-M'
+ command-line option.
+
+ * Directories listed in the 'GROFF_TMAC_PATH' environment variable.
+
+ * The current working directory (only if in unsafe mode using the
+ '-U' command-line option).
+
+ * The user's home directory, 'HOME'.
+
+ * A platform-dependent directory, a site-local (platform-independent)
+ directory, and the main tmac directory. The locations
+ corresponding to your installation are listed in section
+ "Environment" of 'gtroff(1)'. If not otherwise configured, they
+ are as follows.
+
+ /usr/local/lib/groff/site-tmac
+ /usr/local/share/groff/site-tmac
+ /usr/local/share/groff/1.23.0/tmac
+
+ The foregoing assumes that the version of 'groff' is 1.23.0, and
+ that the installation prefix was '/usr/local'. It is possible to
+ fine-tune these locations during the source configuration process.
+
+ (1) The 'mso' request does not have these limitations. *Note I/O::.
+
+2.4 Font Directories
+====================
+
+'groff' enforces few restrictions on how font description files are
+named. For its family/style mechanism to work (*note Font Families::),
+the names of fonts within a family should start with the family name,
+followed by the style. For example, the Times family uses 'T' for the
+family name and 'R', 'B', 'I', and 'BI' to indicate the styles 'roman',
+'bold', 'italic', and 'bold italic', respectively. Thus the final font
+names are 'TR', 'TB', 'TI', and 'TBI'.
+
+ Font description files are kept in "font directories", which together
+constitute the "font path". The search procedure always appends the
+directory 'dev'NAME, where NAME is the name of the output device.
+Assuming TeX DVI output, and '/foo/bar' as a font directory, the font
+description files for 'grodvi' must be in '/foo/bar/devdvi'. Each
+directory in the font path is searched in the following order until the
+desired font description file is found or the list is exhausted.
+
+ * Directories specified with GNU 'troff''s or 'groff''s '-f'
+ command-line option. All output drivers (and some preprocessors)
+ support this option as well, because they require information about
+ the glyphs to be rendered in the document.
+
+ * Directories listed in the 'GROFF_FONT_PATH' environment variable.
+
+ * A site-local directory and the main font description directory.
+ The locations corresponding to your installation are listed in
+ section "Environment" of 'gtroff(1)'. If not otherwise configured,
+ they are as follows.
+
+ /usr/local/share/groff/site-font
+ /usr/local/share/groff/1.23.0/font
+
+ The foregoing assumes that the version of 'groff' is 1.23.0, and
+ that the installation prefix was '/usr/local'. It is possible to
+ fine-tune these locations during the source configuration process.
+
+2.5 Paper Format
+================
+
+In 'groff', the page dimensions for the formatter GNU 'troff' and for
+output devices are handled separately. *Note Page Layout::, for
+vertical manipulation of the page size, and *Note Line Layout::, for
+horizontal changes. The 'papersize' macro package, normally loaded by
+'troffrc' at startup, provides an interface for configuring page
+dimensions by convenient names, like 'letter' or 'a4'; see
+'groff_tmac(5)'. The default used by the formatter depends on its build
+configuration, but is usually one of the foregoing, as geographically
+appropriate.
+
+ It is up to each macro package to respect the page dimensions
+configured in this way.
+
+ For each output device, the size of the output medium can be set in
+its 'DESC' file. Most output drivers also recognize a command-line
+option '-p' to override the default dimensions and an option '-l' to use
+landscape orientation. *Note DESC File Format::, for a description of
+the 'papersize' keyword, which takes an argument of the same form as
+'-p'. The output driver's man page, such as 'grops(1)', may also be
+helpful.
+
+ 'groff' uses the command-line option '-P' to pass options to
+postprocessors; for example, use the following for PostScript output on
+A4 paper in landscape orientation.
+
+ groff -Tps -dpaper=a4l -P-pa4 -P-l -ms foo.ms > foo.ps
+
+2.6 Invocation Examples
+=======================
+
+'roff' systems are best known for formatting man pages. Once a 'man'
+librarian program has located a man page, it may execute a 'groff'
+command much like the following.
+
+ groff -t -man -Tutf8 /usr/share/man/man1/groff.1
+
+ The librarian will also pipe the output through a pager, which might
+not interpret the SGR terminal escape sequences 'groff' emits for
+boldface, underlining, or italics; see the 'grotty(1)' man page for a
+discussion.
+
+ To process a 'roff' input file using the preprocessors 'gtbl' and
+'gpic' and the 'me' macro package in the way to which AT&T 'troff' users
+were accustomed, one would type (or script) a pipeline.
+
+ gpic foo.me | gtbl | gtroff -me -Tutf8 | grotty
+
+ Using 'groff', this pipe can be shortened to an equivalent command.
+
+ groff -p -t -me -T utf8 foo.me
+
+ An even easier way to do this is to use 'grog' to guess the
+preprocessor and macro options and execute the result by using the
+command substitution feature of the shell.
+
+ $(grog -Tutf8 foo.me)
+
+ Each command-line option to a postprocessor must be specified with
+any required leading dashes '-' because 'groff' passes the arguments
+as-is to the postprocessor; this permits arbitrary arguments to be
+transmitted. For example, to pass a title to the 'gxditview'
+postprocessor, the shell commands
+
+ groff -X -P -title -P 'trial run' mydoc.t
+
+and
+
+ groff -X -Z mydoc.t | gxditview -title 'trial run' -
+
+are equivalent.
+
+3 Tutorial for Macro Users
+**************************
+
+Most users of the 'roff' language employ a macro package to format their
+documents. Successful macro packages ease the composition process;
+their users need not have mastered the full formatting language, nor
+understand features like diversions, traps, and environments. This
+chapter aims to familiarize you with basic concepts and mechanisms
+common to many macro packages (like "displays"). If you prefer a
+meticulous and comprehensive presentation, try *note GNU troff
+Reference:: instead.
+
+3.1 Basics
+==========
+
+Let us first survey some basic concepts necessary to use a macro package
+fruitfully.(1) (*note Basics-Footnote-1::) References are made
+throughout to more detailed information.
+
+ GNU 'troff' reads an input file prepared by the user and outputs a
+formatted document suitable for publication or framing. The input
+consists of text, or words to be printed, and embedded commands
+(requests and escape sequences), which tell GNU 'troff' how to format
+the output. *Note Formatter Instructions::.
+
+ The word argument is used in this chapter to mean a word or number
+that appears on the same line as a request, and which modifies the
+meaning of that request. For example, the request
+
+ .sp
+
+spaces one line, but
+
+ .sp 4
+
+spaces four lines. The number 4 is an argument to the 'sp' request,
+which says to space four lines instead of one. Arguments are separated
+from the request and from each other by spaces (_not_ tabs). *Note
+Invoking Requests::.
+
+ The primary function of GNU 'troff' is to collect words from input
+lines, fill output lines with those words, adjust the line to the
+right-hand margin by widening spaces, and output the result. For
+example, the input:
+
+ Now is the time
+ for all good men
+ to come to the aid
+ of their party.
+ Four score and seven
+ years ago, etc.
+
+is read, packed onto output lines, and justified to produce:
+
+ => Now is the time for all good men to come to the aid of
+ => their party. Four score and seven years ago, etc.
+
+ Sometimes a new output line should be started even though the current
+line is not yet full--for example, at the end of a paragraph. To do
+this it is possible to force a break, starting a new output line. Some
+requests cause a break automatically, as do (normally) blank input lines
+and input lines beginning with a space or tab.
+
+ Not all input lines are text lines--words to be formatted. Some are
+control lines that tell a macro package (or GNU 'troff' directly) how to
+format the text. Control lines start with a dot ('.') or an apostrophe
+(''') as the first character, and can be followed by a macro call.
+
+ The formatter also does more complex things, such as automatically
+numbering pages, skipping over page boundaries, putting footnotes in the
+correct place, and so forth.
+
+ Here are a few hints for preparing text for input to GNU 'troff'.
+
+ * First, keep the input lines short. Short input lines are easier to
+ edit, and GNU 'troff' packs words onto longer lines anyhow.
+
+ * In keeping with this, it is helpful to begin a new line after every
+ comma or phrase, since common corrections are to add or delete
+ sentences or phrases.
+
+ * End each sentence with two spaces--or better, start each sentence
+ on a new line. GNU 'troff' recognizes characters that usually end
+ a sentence, and inserts inter-sentence space accordingly.
+
+ * Do not hyphenate words at the end of lines--GNU 'troff' is smart
+ enough to hyphenate words as needed, but is not smart enough to
+ take hyphens out and join a word back together. Also, words such
+ as "mother-in-law" should not be broken over a line, since then a
+ space can occur where not wanted, such as "mother- in-law".
+
+ We offer further advice in *note Input Conventions::.
+
+ GNU 'troff' permits alteration of the distance between lines of text.
+This is termed vertical spacing and is expressed in the same units as
+the type size--the point. The default is 10-point type on 12-point
+spacing. To get double-spaced text you would set the vertical spacing
+to 24 points. Some, but not all, macro packages expose a macro or
+register to configure the vertical spacing.
+
+ A number of requests allow you to change the way the output is
+arranged on the page, sometimes called the layout of the output page.
+Most macro packages don't supply macros for performing these (at least
+not without performing other actions besides), as they are such basic
+operations. The macro packages for writing man pages, 'man' and 'mdoc',
+don't encourage explicit use of these requests at all.
+
+ The request '.sp N' leaves N lines of blank space. N can be omitted
+(skipping a single line) or can be of the form Ni (for N inches) or Nc
+(for N centimeters). For example, the input:
+
+ .sp 1.5i
+ My thoughts on the subject
+ .sp
+
+leaves one and a half inches of space, followed by the line "My thoughts
+on the subject", followed by a single blank line (more measurement units
+are available; see *note Measurements::).
+
+ If you seek precision in spacing, be advised when using a macro
+package that it might not honor 'sp' requests as you expect; it can use
+a formatter feature called no-space mode to prevent excess space from
+accumulating. Macro packages typically offer registers to control
+spacing between paragraphs, before section headings, and around displays
+(discussed below); use these facilities preferentially. *Note
+Manipulating Spacing::.
+
+ Text lines can be centered by using the 'ce' request. The line after
+'ce' is centered (horizontally) on the page. To center more than one
+line, use '.ce N' (where N is the number of lines to center), followed
+by the N lines. To center many lines without counting them, type:
+
+ .ce 1000
+ lines to center
+ .ce 0
+
+The '.ce 0' request tells GNU 'troff' to center zero more lines, in
+other words, stop centering.
+
+ GNU 'troff' also offers the 'rj' request for right-aligning text. It
+works analogously to 'ce' and is convenient for setting epigraphs.
+
+ The 'bp' request starts a new page; this necessarily implies an
+ordinary (line) break.
+
+ All of these requests cause a break; that is, they always start a new
+line. To start a new line without performing any other action, use
+'br'. If you invoke them with the apostrophe ''', the no-break control
+character, the (initial) break they normally perform is suppressed.
+''br' does nothing.
+
+ (1) The remainder of this chapter is based on 'Writing Papers with
+nroff using -me' by Eric P. Allman, which is distributed with 'groff' as
+'meintro.me'.
+
+3.2 Common Features
+===================
+
+GNU 'troff' provides low-level operations for formatting a document.
+Many routine operations are undertaken in nearly all documents that
+require a series of such primitive operations to be performed. These
+common tasks are grouped into macros, which are then collected into a
+macro package.
+
+ Macro packages come in two varieties: "major" or "full-service" ones
+that manage page layout, and "minor" or "auxiliary" ones that do not,
+instead fulfilling narrow, specific tasks. Find a list in the
+'groff_tmac(5)' man page. Type 'man groff_tmac' at the command line to
+view it.
+
+ We survey several capabilities of full-service macro package below.
+Each package employs its own macros to exercise them. For details,
+consult its man page or, for 'ms', see *note ms::.
+
+3.2.1 Paragraphs
+----------------
+
+Paragraphs can be separated and indented in various ways. Some start
+with a blank line and have a first-line indentation, like most of the
+ones in this manual. Block paragraphs omit the indentation.
+
+ => Some men look at constitutions with sanctimonious
+ => reverence, and deem them like the ark of the
+ => covenant, too sacred to be touched.
+
+We also frequently encounter tagged paragraphs, which begin with a tag
+or label at the left margin and indent the remaining text.
+
+ => one This is the first paragraph. Notice how the
+ => first line of the resulting paragraph lines
+ => up with the other lines in the paragraph.
+
+If the tag is too wide for the indentation, the line is broken.
+
+ => longlabel
+ => The label does not align with the subsequent
+ => lines, but they align with each other.
+
+A variation of the tagged paragraph is the itemized or enumerated
+paragraph, which might use punctuation or a digit for a tag,
+respectively. These are frequently used to construct lists.
+
+ => o This list item starts with a bullet. When
+ => producing output for a device using the ASCII
+ => character set, an 'o' is formatted instead.
+
+Often, use of the same macro without a tag continues such a discussion.
+
+ => -xyz This option is recognized but ignored.
+ =>
+ => It had a security hole that we don't discuss.
+
+3.2.2 Sections and Chapters
+---------------------------
+
+The simplest kind of section heading is unnumbered, set in a bold or
+italic style, and occupies a line by itself. Others possess
+automatically numbered multi-level headings and/or different typeface
+styles or sizes at different levels. More sophisticated macro packages
+supply macros for designating chapters and appendices.
+
+3.2.3 Headers and Footers
+-------------------------
+
+Headers and footers occupy the top and bottom of each page,
+respectively, and contain data like the page number and the article or
+chapter title. Their appearance is not affected by the running text.
+Some packages allow for different titles on even- and odd-numbered pages
+(for printed, bound material).
+
+ Headers and footers are together called titles, and comprise three
+parts: left-aligned, centered, and right-aligned. A '%' character
+appearing anywhere in a title is automatically replaced by the page
+number. *Note Page Layout::.
+
+3.2.4 Page Layout
+-----------------
+
+Most macro packages let the user specify the size of the page margins.
+The top and bottom margins are typically handled differently than the
+left and right margins; the latter two are derived from the page offset,
+indentation, and line length. *Note Line Layout::. Commonly, packages
+support registers to tune these values.
+
+3.2.5 Displays and Keeps
+------------------------
+
+Displays are sections of text set off from the surrounding material
+(typically paragraphs), often differing in indentation, and/or spacing.
+Tables, block quotations, and figures are displayed. Equations and code
+examples, when not much shorter than an output line, often are. Lists
+may or may not be. Packages for setting man pages support example
+displays but not keeps.
+
+ A keep is a group of output lines, often a display, that is formatted
+on a single page if possible; it causes a page break to happen early so
+as to not interrupt the kept material.
+
+ Floating keeps can move, or "float", relative to the text around them
+in the input. They are useful for displays that are captioned and
+referred to by name, as with "See figure 3". Depending on the package,
+a floating keep appears at the bottom of the current page if it fits,
+and at the top of the next otherwise. Alternatively, floating keeps
+might be deferred to the end of a section. Using a floating keep can
+avoid the large vertical spaces that may precede a tall keep of the
+ordinary sort when it won't fit on the page.
+
+3.2.6 Footnotes and Endnotes
+----------------------------
+
+Footnotes and endnotes are forms of delayed formatting. They are
+recorded at their points of relevance in the input, but not formatted
+there. Instead, a mark cues the reader to check the "foot", or bottom,
+of the current page, or in the case of endnotes, an annotation list
+later in the document. Macro packages that support these features also
+supply a means of automatically numbering either type of annotation.
+
+3.2.7 Table of Contents
+-----------------------
+
+A package may handle a table of contents by directing section heading
+macros to save section heading text and the page number where it occurs
+for use in a later entry for a table of contents. It writes the
+collected entries at the end of the document, once all are known, upon
+request. A row of dots (a leader) bridges the text on the left with its
+location on the right. Other collections might work in this manner,
+providing lists of figures or tables.
+
+ A table of contents is often found at the end of a GNU 'troff'
+document because the formatter processes the document in a single pass.
+The 'gropdf' output driver supports a PDF feature that relocates pages
+at the time the document is rendered; see the 'gropdf(1)' man page.
+Type 'man gropdf' at the command line to view it.
+
+3.2.8 Indexing
+--------------
+
+An index is similar to a table of contents, in that entry labels and
+locations must be collected, but poses a greater challenge because it
+needs to be sorted before it is output. Here, processing the document
+in multiple passes is inescapable, and tools like the 'makeindex'
+program are necessary.
+
+3.2.9 Document Formats
+----------------------
+
+Some macro packages supply stock configurations of certain documents,
+like business letters and memoranda. These often also have provision
+for a cover sheet, which may be rigid in its format. With these
+features, it is even more important to use the package's macros in
+preference to the formatter requests presented earlier, where possible.
+
+3.2.10 Columnation
+------------------
+
+Macro packages apart from 'man' and 'mdoc' for man page formatting offer
+a facility for setting multiple columns on the page.
+
+3.2.11 Font and Size Changes
+----------------------------
+
+The formatter's requests and escape sequences for setting the typeface
+and size are not always intuitive, so all macro packages provide macros
+to make these operations simpler. They also make it more convenient to
+change typefaces in the middle of a word and can handle italic
+corrections automatically. *Note Italic Corrections::.
+
+3.2.12 Predefined Text
+----------------------
+
+Most macro packages supply predefined strings to set prepared text like
+the date, or to perform operations like super- and subscripting.
+
+3.2.13 Preprocessor Support
+---------------------------
+
+All macro packages provide support for various preprocessors and may
+extend their functionality by defining macros to set their contents in
+displays. Examples include 'TS' and 'TE' for 'gtbl', 'EQ' and 'EN' for
+'geqn', and 'PS' and 'PE' for 'gpic'.
+
+3.2.14 Configuration and Customization
+--------------------------------------
+
+Packages provide means of customizing many of the details of how the
+package behaves. These range from setting the default type size to
+changing the appearance of section headers.
+
+4 Macro Packages
+****************
+
+This chapter surveys the "major" macro packages that come with 'groff'.
+One, 'ms', is presented in detail.
+
+ Major macro packages are also sometimes described as "full-service"
+due to the breadth of features they provide and because more than one
+cannot be used by the same document; for example
+
+ groff -m man foo.man -m ms bar.doc
+
+doesn't work. Option arguments are processed before non-option
+arguments; the above (failing) sample is thus reordered to
+
+ groff -m man -m ms foo.man bar.doc
+
+ Many auxiliary, or "minor", macro packages are also available. They
+may in general be used with any full-service macro package and handle a
+variety of tasks from character encoding selection, to language
+localization, to inlining of raster images. See the 'groff_tmac(5)' man
+page for a list. Type 'man groff_tmac' at the command line to view it.
+
+4.1 'man'
+=========
+
+The 'man' macro package is the most widely used and probably the most
+important ever developed for 'troff'. It is easy to use, and a vast
+majority of manual pages ("man pages") are written in it.
+
+ 'groff''s implementation is documented in the 'groff_man(7)' man
+page. Type 'man groff_man' at the command line to view it.
+
+4.1.1 Optional 'man' extensions
+-------------------------------
+
+Use the file 'man.local' for local extensions to the 'man' macros or for
+style changes.
+
+Custom headers and footers
+..........................
+
+In 'groff' versions 1.18.2 and later, you can specify custom headers and
+footers by redefining the following macros in 'man.local'.
+
+ -- Macro: .PT
+ Control the content of the headers. Normally, the header prints
+ the command name and section number on either side, and the
+ optional fifth argument to 'TH' in the center.
+
+ -- Macro: .BT
+ Control the content of the footers. Normally, the footer prints
+ the page number and the third and fourth arguments to 'TH'.
+
+ Use the 'FT' register to specify the footer position. The default
+ is -0.5i.
+
+Ultrix-specific man macros
+..........................
+
+The 'groff' source distribution includes a file named 'man.ultrix',
+containing macros compatible with the Ultrix variant of 'man'. Copy
+this file into 'man.local' (or use the 'mso' request to load it) to
+enable the following macros.
+
+ -- Macro: .CT key
+ Print '<CTRL/KEY>'.
+
+ -- Macro: .CW
+ Print subsequent text using a "constant-width" (monospaced)
+ typeface (Courier roman).
+
+ -- Macro: .Ds
+ Begin a non-filled display.
+
+ -- Macro: .De
+ End a non-filled display started with 'Ds'.
+
+ -- Macro: .EX [indent]
+ Begin a non-filled display using a monospaced typeface (Courier
+ roman). Use the optional INDENT argument to indent the display.
+
+ -- Macro: .EE
+ End a non-filled display started with 'EX'.
+
+ -- Macro: .G [text]
+ Set TEXT in Helvetica. If no text is present on the line where the
+ macro is called, then the text of the next line appears in
+ Helvetica.
+
+ -- Macro: .GL [text]
+ Set TEXT in Helvetica oblique. If no text is present on the line
+ where the macro is called, then the text of the next line appears
+ in Helvetica Oblique.
+
+ -- Macro: .HB [text]
+ Set TEXT in Helvetica bold. If no text is present on the line
+ where the macro is called, then all text up to the next 'HB'
+ appears in Helvetica bold.
+
+ -- Macro: .TB [text]
+ Identical to 'HB'.
+
+ -- Macro: .MS title sect [punct]
+ Set a man page reference in Ultrix format. The TITLE is in Courier
+ instead of italic. Optional punctuation follows the section number
+ without an intervening space.
+
+ -- Macro: .NT [C] [title]
+ Begin a note. Print the optional title, or the word "Note",
+ centered on the page. Text following the macro makes up the body
+ of the note, and is indented on both sides. If the first argument
+ is 'C', the body of the note is printed centered (the second
+ argument replaces the word "Note" if specified).
+
+ -- Macro: .NE
+ End a note begun with 'NT'.
+
+ -- Macro: .PN path [punct]
+ Set the path name in a monospaced typeface (Courier roman),
+ followed by optional punctuation.
+
+ -- Macro: .Pn [punct] path [punct]
+ If called with two arguments, identical to 'PN'. If called with
+ three arguments, set the second argument in a monospaced typeface
+ (Courier roman), bracketed by the first and third arguments in the
+ current font.
+
+ -- Macro: .R
+ Switch to roman font and turn off any underlining in effect.
+
+ -- Macro: .RN
+ Print the string '<RETURN>'.
+
+ -- Macro: .VS [4]
+ Start printing a change bar in the margin if the number '4' is
+ specified. Otherwise, this macro does nothing.
+
+ -- Macro: .VE
+ End printing the change bar begun by 'VS'.
+
+Simple example
+..............
+
+The following example 'man.local' file alters the 'SH' macro to add some
+extra vertical space before printing the heading. Headings are printed
+in Helvetica bold.
+
+ .\" Make the heading fonts Helvetica
+ .ds HF HB
+ .
+ .\" Put more space in front of headings.
+ .rn SH SH-orig
+ .de SH
+ . if t .sp (u;\\n[PD]*2)
+ . SH-orig \\$*
+ ..
+
+4.2 'mdoc'
+==========
+
+'groff''s implementation of the BSD 'doc' package for man pages is
+documented in the 'groff_mdoc(7)' man page. Type 'man groff_mdoc' at
+the command line to view it.
+
+4.3 'me'
+========
+
+'groff''s implementation of the BSD 'me' macro package is documented
+using itself. A tutorial, 'meintro.me', and reference, 'meref.me', are
+available in 'groff''s documentation directory. A 'groff_me(7)' man
+page is also available and identifies the installation path for these
+documents. Type 'man groff_me' at the command line to view it.
+
+ A French translation of the tutorial is available as 'meintro_fr.me'
+and installed parallel to the English version.
+
+4.4 'mm'
+========
+
+'groff''s implementation of the AT&T memorandum macro package is
+documented in the 'groff_mm(7)' man page. Type 'man groff_mm' at the
+command line) to view it.
+
+ A Swedish localization of 'mm' is also available; see
+'groff_mmse(7)'.
+
+4.5 'mom'
+=========
+
+The main documentation files for the 'mom' macros are in HTML format.
+Additional, useful documentation is in PDF format. See the 'groff(1)'
+man page, section "Installation Directories", for their location.
+
+ * 'toc.html' Entry point to the full mom manual.
+
+ * 'macrolist.html' Hyperlinked index of macros with brief
+ descriptions, arranged by category.
+
+ * 'mom-pdf.pdf' PDF features and usage.
+
+ The mom macros are in active development between 'groff' releases.
+The most recent version, along with up-to-date documentation, is
+available at <http://www.schaffter.ca/mom/mom-05.html>.
+
+ The 'groff_mom(7)' man page (type 'man groff_mom' at the command
+line) contains a partial list of available macros, however their usage
+is best understood by consulting the HTML documentation.
+
+4.6 'ms'
+========
+
+The 'ms' ("manuscript") package is suitable for the preparation of
+letters, memoranda, reports, and books. These 'groff' macros feature
+cover page and table of contents generation, automatically numbered
+headings, several paragraph styles, a variety of text styling options,
+footnotes, and multi-column page layouts. 'ms' supports the 'tbl',
+'eqn', 'pic', and 'refer' preprocessors for inclusion of tables,
+mathematical equations, diagrams, and standardized bibliographic
+citations. This implementation is mostly compatible with the documented
+interface and behavior of AT&T Unix Version 7 'ms'. Many extensions
+from 4.2BSD (Berkeley) and Tenth Edition Research Unix have been
+recreated.
+
+4.6.1 Introduction
+------------------
+
+The 'ms' macros are the oldest surviving package for 'roff' systems.(1)
+(*note ms Introduction-Footnote-1::) While the 'man' package was
+designed for brief reference documents, the 'ms' macros are also
+suitable for longer works intended for printing and possible
+publication.
+
+ (1) While manual _pages_ are older, early ones used macros supplanted
+by the 'man' package of Seventh Edition Unix (1979). 'ms' shipped with
+Sixth Edition (1975) and was documented by Mike Lesk in a Bell Labs
+internal memorandum.
+
+4.6.1.1 Basic information
+.........................
+
+'ms' documents are plain text files; prepare them with your preferred
+text editor. If you're in a hurry to start, know that 'ms' needs one of
+its macros called at the beginning of a document so that it can
+initialize. A "macro" is a formatting instruction to 'ms'. Put a macro
+call on a line by itself. Use '.PP' if you want your paragraph's first
+line to be indented, or '.LP' if you don't.
+
+ After that, start typing normally. It is a good practice to start
+each sentence on a new line, or to put two spaces after sentence-ending
+punctuation, so that the formatter knows where the sentence boundaries
+are. You can separate paragraphs with further paragraphing macros, or
+with blank lines, and you can indent with tabs. When you need one of
+the features mentioned earlier (*note ms::), return to this part of the
+manual.
+
+ Format the document with the 'groff' command. 'nroff' can be useful
+for previewing.
+
+ $ editor radical.ms
+ $ nroff -ww -z -ms radical.ms # check for errors
+ $ nroff -ms radical.ms | less -R
+ $ groff -T ps -ms radical.ms > radical.ps
+ $ see radical.ps
+
+ Our 'radical.ms' document might look like this.
+
+ .LP
+ Radical novelties are so disturbing that they tend to be
+ suppressed or ignored, to the extent that even the
+ possibility of their existence in general is more often
+ denied than admitted.
+
+ ->That's what Dijkstra said, anyway.
+
+ 'ms' exposes many aspects of document layout to user control via
+'groff''s "registers" and "strings", which store numbers and text,
+respectively. Measurements in 'groff' are expressed with a suffix
+called a "scaling unit".
+
+'i'
+ inches
+
+'c'
+ centimeters
+
+'p'
+ points (1/72 inch)
+
+'P'
+ picas (1/6 inch)
+
+'v'
+ vees; current vertical spacing
+
+'m'
+ ems; width of an "M" in the current font
+
+'n'
+ ens; one-half em
+
+ Set registers with the 'nr' request and strings with the 'ds'
+request. "Requests" are like macro calls; they go on lines by
+themselves and start with the "control character", a dot ('.'). The
+difference is that they directly instruct the formatter program, rather
+than the macro package. We'll discuss a few as applicable. It is wise
+to specify a scaling unit when setting any register that represents a
+length, size, or distance.
+
+ .nr PS 10.5p \" Use 10.5-point type.
+ .ds FAM P \" Use Palatino font family.
+
+In the foregoing, we see that '\"' begins a comment. This is an example
+of an "escape sequence", the other kind of formatting instruction.
+Escape sequences can appear anywhere. They begin with the escape
+character ('\') and are followed by at least one more character. 'ms'
+documents tend to use only a few of 'groff''s many requests and escape
+sequences; see *note Request Index:: and *note Escape Sequence Index::
+or the 'groff(7)' man page for complete lists.
+
+'\"'
+ Begin comment; ignore remainder of line.
+
+'\n[REG]'
+ Interpolate value of register REG.
+
+'\*[STR]'
+ Interpolate contents of string STR.
+
+'\*S'
+ abbreviation of '\*[S]'; the name S must be only one character
+
+'\[CHAR]'
+ Interpolate glyph of special character named CHAR.
+
+'\&'
+ dummy character
+
+'\~'
+ Insert an unbreakable space that is adjustable like a normal space.
+
+'\|'
+ Move horizontally by one-sixth em ("thin space").
+
+ Prefix any words that start with a dot '.' or neutral apostrophe '''
+with '\&' if they are at the beginning of an input line (or might become
+that way in editing) to prevent them from being interpreted as macro
+calls or requests. Suffix '.', '?', and '!' with '\&' when needed to
+cancel end-of-sentence detection.
+
+ My exposure was \&.5 to \&.6 Sv of neutrons, said Dr.\&
+ Wallace after the criticality incident.
+
+4.6.2 Document Structure
+------------------------
+
+The 'ms' macro package expects a certain amount of structure: a
+well-formed document contains at least one paragraphing or heading macro
+call. Longer documents have a structure as follows.
+
+*Document type*
+ Calling the 'RP' macro at the beginning of your document puts the
+ document description (see below) on a cover page. Otherwise, 'ms'
+ places the information (if any) on the first page, followed
+ immediately by the body text. Some document types found in other
+ 'ms' implementations are specific to AT&T or Berkeley, and are not
+ supported by 'groff' 'ms'.
+
+*Format and layout*
+ By setting registers and strings, you can configure your document's
+ typeface, margins, spacing, headers and footers, and footnote
+ arrangement. *Note ms Document Control Settings::.
+
+*Document description*
+ A document description consists of any of: a title, one or more
+ authors' names and affiliated institutions, an abstract, and a date
+ or other identifier. *Note ms Document Description Macros::.
+
+*Body text*
+ The main matter of your document follows its description (if any).
+ 'ms' supports highly structured text consisting of paragraphs
+ interspersed with multi-level headings (chapters, sections,
+ subsections, and so forth) and augmented by lists, footnotes,
+ tables, diagrams, and similar material. *Note ms Body Text::.
+
+*Tables of contents*
+ Macros enable the collection of entries for a table of contents (or
+ index) as the material they discuss appears in the document. You
+ then call a macro to emit the table of contents at the end of your
+ document. The table of contents must necessarily follow the rest
+ of the text since GNU 'troff' is a single-pass formatter; it thus
+ cannot determine the page number of a division of the text until it
+ has been set and output. Since 'ms' was designed for the
+ production of hard copy, the traditional procedure was to manually
+ relocate the pages containing the table of contents between the
+ cover page and the body text. Today, page resequencing is more
+ often done in the digital domain. An index works similarly, but
+ because it typically needs to be sorted after collection, its
+ preparation requires separate processing.
+
+4.6.3 Document Control Settings
+-------------------------------
+
+'ms' exposes many aspects of document layout to user control via 'groff'
+requests. To use them, you must understand how to define registers and
+strings.
+
+ -- Request: .nr reg value
+ Set register REG to VALUE. If REG doesn't exist, GNU 'troff'
+ creates it.
+
+ -- Request: .ds name contents
+ Set string NAME to CONTENTS.
+
+ A list of document control registers and strings follows. For any
+parameter whose default is unsatisfactory, define its register or string
+before calling any 'ms' macro other than 'RP'.
+
+Margin settings
+...............
+
+ -- Register: \n[PO]
+ Defines the page offset (i.e., the left margin).
+
+ Effective: next page.
+
+ Default: Varies by output device and paper format; 1i is used for
+ typesetters using U.S. letter paper, and zero for terminals. *Note
+ Paper Format::.
+
+ -- Register: \n[LL]
+ Defines the line length (i.e., the width of the body text).
+
+ Effective: next paragraph.
+
+ Default: Varies by output device and paper format; 6.5i is used for
+ typesetters using U.S. letter paper (*note Paper Format::) and 65n
+ on terminals.
+
+ -- Register: \n[LT]
+ Defines the title line length (i.e., the header and footer width).
+ This is usually the same as 'LL', but need not be.
+
+ Effective: next paragraph.
+
+ Default: Varies by output device and paper format; 6.5i is used for
+ typesetters using U.S. letter paper (*note Paper Format::) and 65n
+ on terminals.
+
+ -- Register: \n[HM]
+ Defines the header margin height at the top of the page.
+
+ Effective: next page.
+
+ Default: 1i.
+
+ -- Register: \n[FM]
+ Defines the footer margin height at the bottom of the page.
+
+ Effective: next page.
+
+ Default: 1i.
+
+Titles (headers, footers)
+.........................
+
+ -- String: \*[LH]
+ Defines the text displayed in the left header position.
+
+ Effective: next header.
+
+ Default: empty.
+
+ -- String: \*[CH]
+ Defines the text displayed in the center header position.
+
+ Effective: next header.
+
+ Default: '-\n[%]-'.
+
+ -- String: \*[RH]
+ Defines the text displayed in the right header position.
+
+ Effective: next header.
+
+ Default: empty.
+
+ -- String: \*[LF]
+ Defines the text displayed in the left footer position.
+
+ Effective: next footer.
+
+ Default: empty.
+
+ -- String: \*[CF]
+ Defines the text displayed in the center footer position.
+
+ Effective: next footer.
+
+ Default: empty.
+
+ -- String: \*[RF]
+ Defines the text displayed in the right footer position.
+
+ Effective: next footer.
+
+ Default: empty.
+
+Text settings
+.............
+
+ -- Register: \n[PS]
+ Defines the type size of the body text.
+
+ Effective: next paragraph.
+
+ Default: 10p.
+
+ -- Register: \n[VS]
+ Defines the vertical spacing (type size plus leading).
+
+ Effective: next paragraph.
+
+ Default: 12p.
+
+ -- Register: \n[HY]
+ Defines the automatic hyphenation mode used with the 'hy' request.
+ Setting 'HY' to 0 is equivalent to using the 'nh' request. This is
+ a Tenth Edition Research Unix extension.
+
+ Effective: next paragraph.
+
+ Default: 6.
+
+ -- String: \*[FAM]
+ Defines the font family used to typeset the document. This is a
+ GNU extension.
+
+ Effective: next paragraph.
+
+ Default: defined by the output device; often 'T' (*note ms Body
+ Text::)
+
+Paragraph settings
+..................
+
+ -- Register: \n[PI]
+ Defines the indentation amount used by the 'PP', 'IP' (unless
+ overridden by an optional argument), 'XP', and 'RS' macros.
+
+ Effective: next paragraph.
+
+ Default: 5n.
+
+ -- Register: \n[PD]
+ Defines the space between paragraphs.
+
+ Effective: next paragraph.
+
+ Default: 0.3v (1v on low-resolution devices).
+
+ -- Register: \n[QI]
+ Defines the indentation amount used on both sides of a paragraph
+ set with the 'QP' or between the 'QS' and 'QE' macros.
+
+ Effective: next paragraph.
+
+ Default: 5n.
+
+ -- Register: \n[PORPHANS]
+ Defines the minimum number of initial lines of any paragraph that
+ must be kept together to avoid isolated lines at the bottom of a
+ page. If a new paragraph is started close to the bottom of a page,
+ and there is insufficient space to accommodate 'PORPHANS' lines
+ before an automatic page break, then a page break is forced before
+ the start of the paragraph. This is a GNU extension.
+
+ Effective: next paragraph.
+
+ Default: 1.
+
+Heading settings
+................
+
+ -- Register: \n[PSINCR]
+ Defines an increment in type size to be applied to a heading at a
+ lesser depth than that specified in 'GROWPS'. The value of
+ 'PSINCR' should be specified in points with the p scaling unit and
+ may include a fractional component; for example, '.nr PSINCR 1.5p'
+ sets a type size increment of 1.5p. This is a GNU extension.
+
+ Effective: next heading.
+
+ Default: 1p.
+
+ -- Register: \n[GROWPS]
+ Defines the heading depth above which the type size increment set
+ by 'PSINCR' becomes effective. For each heading depth less than
+ the value of 'GROWPS', the type size is increased by 'PSINCR'.
+ Setting 'GROWPS' to any value less than 2 disables the incremental
+ heading size feature. This is a GNU extension.
+
+ Effective: next heading.
+
+ Default: 0.
+
+ -- Register: \n[HORPHANS]
+ Defines the minimum number of lines of an immediately succeeding
+ paragraph that should be kept together with any heading introduced
+ by the 'NH' or 'SH' macros. If a heading is placed close to the
+ bottom of a page, and there is insufficient space to accommodate
+ both the heading and at least 'HORPHANS' lines of the following
+ paragraph, before an automatic page break, then the page break is
+ forced before the heading. This is a GNU extension.
+
+ Effective: next paragraph.
+
+ Default: 1.
+
+ -- String: \*[SN-STYLE]
+ Defines the style used to print numbered headings. *Note Headings
+ in ms::. This is a GNU extension.
+
+ Effective: next heading.
+
+ Default: alias of 'SN-DOT'
+
+Footnote settings
+.................
+
+ -- Register: \n[FI]
+ Defines the footnote indentation. This is a Berkeley extension.
+
+ Effective: next footnote.
+
+ Default: 2n.
+
+ -- Register: \n[FF]
+ Defines the format of automatically numbered footnotes, and those
+ for which the 'FS' request is given a marker argument, at the
+ bottom of a column or page. This is a Berkeley extension.
+ '0'
+ Set an automatic number(1) (*note ms Document Control
+ Settings-Footnote-1::) as a superscript (on typesetter
+ devices) or surrounded by square brackets (on terminals). The
+ footnote paragraph is indented as with 'PP' if there is an
+ 'FS' argument or an automatic number, and as with 'LP'
+ otherwise. This is the default.
+
+ '1'
+ As '0', but set the marker as regular text and follow an
+ automatic number with a period.
+
+ '2'
+ As '1', but without indentation (like 'LP').
+
+ '3'
+ As '1', but set the footnote paragraph with the marker hanging
+ (like 'IP').
+
+ Effective: next footnote.
+
+ Default: 0.
+
+ -- Register: \n[FPS]
+ Defines the footnote type size.
+
+ Effective: next footnote.
+
+ Default: '\n[PS] - 2p'.
+
+ -- Register: \n[FVS]
+ Defines the footnote vertical spacing.
+
+ Effective: next footnote.
+
+ Default: '\n[FPS] + 2p'.
+
+ -- Register: \n[FPD]
+ Defines the footnote paragraph spacing. This is a GNU extension.
+
+ Effective: next footnote.
+
+ Default: '\n[PD] / 2'.
+
+ -- String: \*[FR]
+ Defines the ratio of the footnote line length to the current line
+ length. This is a GNU extension.
+
+ Effective: next footnote in single-column arrangements, next page
+ otherwise.
+
+ Default: '11/12'.
+
+Display settings
+................
+
+ -- Register: \n[DD]
+ Sets the display distance--the vertical spacing before and after a
+ display, a 'tbl' table, an 'eqn' equation, or a 'pic' image. This
+ is a Berkeley extension.
+
+ Effective: next display boundary.
+
+ Default: 0.5v (1v on low-resolution devices).
+
+ -- Register: \n[DI]
+ Sets the default amount by which to indent a display started with
+ 'DS' and 'ID' without arguments, to '.DS I' without an indentation
+ argument, and to equations set with '.EQ I'. This is a GNU
+ extension.
+
+ Effective: next indented display.
+
+ Default: 0.5i.
+
+Other settings
+..............
+
+ -- Register: \n[MINGW]
+ Defines the default minimum width between columns in a multi-column
+ document. This is a GNU extension.
+
+ Effective: next page.
+
+ Default: 2n.
+
+ -- Register: \n[TC-MARGIN]
+ Defines the width of the field in which page numbers are set in a
+ table of contents entry; the right margin thus moves inboard by
+ this amount. This is a GNU extension.
+
+ Effective: next 'PX' call.
+
+ Default: '\w'000''
+
+ (1) defined in *note ms Footnotes::
+
+4.6.4 Document Description Macros
+---------------------------------
+
+Only the simplest document lacks a title.(1) (*note ms Document
+Description Macros-Footnote-1::) As its level of sophistication (or
+complexity) increases, it tends to acquire a date of revision,
+explicitly identified authors, sponsoring institutions for authors, and,
+at the rarefied heights, an abstract of its content. Define these data
+by calling the macros below in the order shown; 'DA' or 'ND' can be
+called to set the document date (or other identifier) at any time before
+(a) the abstract, if present, or (b) its information is required in a
+header or footer. Use of these macros is optional, except that 'TL' is
+mandatory if any of 'RP', 'AU', 'AI', or 'AB' is called, and 'AE' is
+mandatory if 'AB' is called.
+
+ -- Macro: .RP [no-repeat-info] [no-renumber]
+ Use the "report" (AT&T: "released paper") format for your document,
+ creating a separate cover page. The default arrangement is to
+ place most of the document description (title, author names and
+ institutions, and abstract, but not the date) at the top of the
+ first page. If the optional 'no-repeat-info' argument is given,
+ 'ms' produces a cover page but does not repeat any of its
+ information subsequently (but see the 'DA' macro below regarding
+ the date). Normally, 'RP' sets the page number following the cover
+ page to 1. Specifying the optional 'no-renumber' argument
+ suppresses this alteration. Optional arguments can occur in any
+ order. 'no' is recognized as a synonym of 'no-repeat-info' for
+ 'AT&T' compatibility.
+
+ -- Macro: .TL
+ Specify the document title. 'ms' collects text on input lines
+ following this call into the title until reaching 'AU', 'AB', or a
+ heading or paragraphing macro call.
+
+ -- Macro: .AU
+ Specify an author's name. 'ms' collects text on input lines
+ following this call into the author's name until reaching 'AI',
+ 'AB', another 'AU', or a heading or paragraphing macro call. Call
+ it repeatedly to specify multiple authors.
+
+ -- Macro: .AI
+ Specify the preceding author's institution. An 'AU' call is
+ usefully followed by at most one 'AI' call; if there are more, the
+ last 'AI' call controls. 'ms' collects text on input lines
+ following this call into the author's institution until reaching
+ 'AU', 'AB', or a heading or paragraphing macro call.
+
+ -- Macro: .DA [x ...]
+ Typeset the current date, or any arguments X, in the center footer,
+ and, if 'RP' is also called, left-aligned at the end of the
+ description information on the cover page.
+
+ -- Macro: .ND [x ...]
+ Typeset the current date, or any arguments X, if 'RP' is also
+ called, left-aligned at the end of the document description on the
+ cover page. This is 'groff' 'ms''s default.
+
+ -- Macro: .AB [no]
+ Begin the abstract. 'ms' collects text on input lines following
+ this call into the abstract until reaching an 'AE' call. By
+ default, 'ms' places the word "ABSTRACT" centered and in italics
+ above the text of the abstract. The optional argument 'no'
+ suppresses this heading.
+
+ -- Macro: .AE
+ End the abstract.
+
+ An example document description, using a cover page, follows.
+
+ .RP
+ .TL
+ The Inevitability of Code Bloat
+ in Commercial and Free Software
+ .AU
+ J.\& Random Luser
+ .AI
+ University of West Bumblefuzz
+ .AB
+ This report examines the long-term growth of the code
+ bases in two large,
+ popular software packages;
+ the free Emacs and the commercial Microsoft Word.
+ While differences appear in the type or order of
+ features added,
+ due to the different methodologies used,
+ the results are the same in the end.
+ .PP
+ The free software approach is shown to be superior in
+ that while free software can become as bloated as
+ commercial offerings,
+ free software tends to have fewer serious bugs and the
+ added features are more in line with user demand.
+ .AE
+
+ ...the rest of the paper...
+
+ (1) Distinguish a document title from "titles", which are what 'roff'
+systems call headers and footers collectively.
+
+4.6.5 Body Text
+---------------
+
+A variety of macros, registers, and strings can be used to structure and
+style the body of your document. They organize your text into
+paragraphs, headings, footnotes, and inclusions of material such as
+tables and figures.
+
+4.6.5.1 Text settings
+.....................
+
+The 'FAM' string, a GNU extension, sets the font family for body text;
+the default is 'T'. The 'PS' and 'VS' registers set the type size and
+vertical spacing (distance between text baselines), respectively. The
+font family and type size are ignored on terminal devices. Setting
+these parameters before the first call of a heading, paragraphing, or
+(non-date) document description macro also applies them to headers,
+footers, and (for 'FAM') footnotes.
+
+ Which font families are available depends on the output device; as a
+convention, 'T' selects a serif family ("Times"), 'H' a sans-serif
+family ("Helvetica"), and 'C' a monospaced family ("Courier"). The man
+page for the output driver documents its font repertoire. Consult the
+'groff(1)' man page for lists of available output devices and their
+drivers.
+
+ The hyphenation mode (as used by the 'hy' request) is set from the
+'HY' register. Setting 'HY' to '0' is equivalent to using the 'nh'
+request. This is a Tenth Edition Research Unix extension.
+
+4.6.5.2 Typographical symbols
+.............................
+
+'ms' provides a few strings to obtain typographical symbols not easily
+entered with the keyboard. These and many others are available as
+special character escape sequences--see the 'groff_char(7)' man page.
+
+ -- String: \*[-]
+ Interpolate an em dash.
+
+ -- String: \*[Q]
+ -- String: \*[U]
+ Interpolate typographer's quotation marks where available, and
+ neutral double quotes otherwise. '\*Q' is the left quote and '\*U'
+ the right.
+
+4.6.5.3 Paragraphs
+..................
+
+Paragraphing macros "break", or terminate, any pending output line so
+that a new paragraph can begin. Several paragraph types are available,
+differing in how indentation applies to them: to left, right, or both
+margins; to the first output line of the paragraph, all output lines, or
+all but the first. All paragraphing macro calls cause the insertion of
+vertical space in the amount stored in the 'PD' register, except at page
+or column breaks. Alternatively, a blank input line breaks the output
+line and vertically spaces by one vee.
+
+ -- Macro: .LP
+ Set a paragraph without any (additional) indentation.
+
+ -- Macro: .PP
+ Set a paragraph with a first-line left indentation in the amount
+ stored in the 'PI' register.
+
+ -- Macro: .IP [marker [width]]
+ Set a paragraph with a left indentation. The optional MARKER is
+ not indented and is empty by default. It has several applications;
+ see *note Lists in ms::. WIDTH overrides the indentation amount
+ stored in the 'PI' register; its default unit is 'n'. Once
+ specified, WIDTH applies to further 'IP' calls until specified
+ again or a heading or different paragraphing macro is called.
+
+ -- Macro: .QP
+ Set a paragraph indented from both left and right margins by the
+ amount stored in the 'QI' register.
+
+ -- Macro: .QS
+ -- Macro: .QE
+ Begin ('QS') and end ('QE') a region where each paragraph is
+ indented from both margins by the amount stored in the 'QI'
+ register. The text between 'QS' and 'QE' can be structured further
+ by use of other paragraphing macros.
+
+ -- Macro: .XP
+ Set an "exdented" paragraph--one with a left indentation in the
+ amount stored in the 'PI' register on every line _except_ the first
+ (also known as a hanging indent). This is a Berkeley extension.
+
+ The following example illustrates the use of paragraphing macros.
+
+ .NH 2
+ Cases used in the 2001 study
+ .LP
+ Two software releases were considered for this report.
+ .PP
+ The first is commercial software;
+ the second is free.
+ .IP \[bu]
+ Microsoft Word for Windows,
+ starting with version 1.0 through the current version
+ (Word 2000).
+ .IP \[bu]
+ GNU Emacs,
+ from its first appearance as a standalone editor through
+ the current version (v20).
+ See [Bloggs 2002] for details.
+ .QP
+ Franklin's Law applied to software:
+ software expands to outgrow both RAM and disk space over
+ time.
+ .SH
+ Bibliography
+ .XP
+ Bloggs, Joseph R.,
+ .I "Everyone's a Critic" ,
+ Underground Press, March 2002.
+ A definitive work that answers all questions and
+ criticisms about the quality and usability of free
+ software.
+
+4.6.5.4 Headings
+................
+
+Use headings to create a sequential or hierarchical structure for your
+document. The 'ms' macros print headings in *bold* using the same font
+family and, by default, type size as the body text. Headings are
+available with and without automatic numbering. Text on input lines
+following the macro call becomes the heading's title. Call a
+paragraphing macro to end the heading text and start the section's
+content.
+
+ -- Macro: .NH [depth]
+ -- Macro: .NH S heading-depth-index ...
+ Set an automatically numbered heading.
+
+ 'ms' produces a numbered heading the form A.B.C..., to any depth
+ desired, with the numbering of each depth increasing automatically
+ and being reset to zero when a more significant level is increased.
+ "1" is the most significant or coarsest division of the document.
+ Only non-zero values are output. If DEPTH is omitted, it is taken
+ to be '1'.
+
+ If you specify DEPTH such that an ascending gap occurs relative to
+ the previous 'NH' call--that is, you "skip a depth", as by '.NH 1'
+ and then '.NH 3'--'groff' 'ms' emits a warning on the standard
+ error stream.
+
+ Alternatively, you can give 'NH' a first argument of 'S', followed
+ by integers to number the heading depths explicitly. Further
+ automatic numbering, if used, resumes using the specified indices
+ as their predecessors. This feature is a Berkeley extension.
+
+ An example may be illustrative.
+
+ .NH 1
+ Animalia
+ .NH 2
+ Arthropoda
+ .NH 3
+ Crustacea
+ .NH 2
+ Chordata
+ .NH S 6 6 6
+ Daimonia
+ .NH 1
+ Plantae
+
+ The above results in numbering as follows; the vertical space that
+normally precedes each heading is omitted.
+
+ 1. Animalia
+ 1.1. Arthropoda
+ 1.1.1. Crustacea
+ 1.2. Chordata
+ 6.6.6. Daimonia
+ 7. Plantae
+
+ -- String: \*[SN-STYLE]
+ -- String: \*[SN-DOT]
+ -- String: \*[SN-NO-DOT]
+ -- String: \*[SN]
+ After 'NH' is called, the assigned number is made available in the
+ strings 'SN-DOT' (as it appears in a printed heading with default
+ formatting, followed by a terminating period) and 'SN-NO-DOT' (with
+ the terminating period omitted). These are GNU extensions.
+
+ You can control the style used to print numbered headings by
+ defining an appropriate alias for the string 'SN-STYLE'. By
+ default, 'SN-STYLE' is aliased to 'SN-DOT'. If you prefer to omit
+ the terminating period from numbers appearing in numbered headings,
+ you may define the alias as follows.
+
+ .als SN-STYLE SN-NO-DOT
+
+ Any such change in numbering style becomes effective from the next
+ use of 'NH' following redefinition of the alias for 'SN-STYLE'.
+ The formatted number of the current heading is available in the
+ 'SN' string (a feature first documented by Berkeley), which
+ facilitates its inclusion in, for example, table captions, equation
+ labels, and 'XS'/'XA'/'XE' table of contents entries.
+
+ -- Macro: .SH [depth]
+ Set an unnumbered heading.
+
+ The optional DEPTH argument is a GNU extension indicating the
+ heading depth corresponding to the DEPTH argument of 'NH'. It
+ matches the type size at which the heading is set to that of a
+ numbered heading at the same depth when the 'GROWPS' and 'PSINCR'
+ heading size adjustment mechanism is in effect.
+
+ If the 'GROWPS' register is set to a value greater than the LEVEL
+argument to 'NH' or 'SH', the type size of a heading produced by these
+macros increases by 'PSINCR' units over the size specified by 'PS'
+multiplied by the difference of 'GROWPS' and LEVEL. The value stored in
+'PSINCR' is interpreted in 'groff' basic units; the 'p' scaling unit
+should be employed when assigning a value specified in points. For
+example, the sequence
+
+ .nr PS 10
+ .nr GROWPS 3
+ .nr PSINCR 1.5p
+ .NH 1
+ Carnivora
+ .NH 2
+ Felinae
+ .NH 3
+ Felis catus
+ .SH 2
+ Machairodontinae
+
+will cause "1. Carnivora" to be printed in 13-point text, followed by
+"1.1. Felinae" in 11.5-point text, while "1.1.1. Felis catus" and all
+more deeply nested heading levels will remain in the 10-point text
+specified by the 'PS' register. "Machairodontinae" is printed at 11.5
+points, since it corresponds to heading level 2.
+
+ The 'HORPHANS' register operates in conjunction with the 'NH' and
+'SH' macros to inhibit the printing of isolated headings at the bottom
+of a page; it specifies the minimum number of lines of an immediately
+subsequent paragraph that must be kept on the same page as the heading.
+If insufficient space remains on the current page to accommodate the
+heading and this number of lines of paragraph text, a page break is
+forced before the heading is printed. Any display macro call or 'tbl',
+'pic', or 'eqn' region between the heading and the subsequent paragraph
+suppresses this grouping. *Note ms keeps and displays:: and *note ms
+Insertions::.
+
+4.6.5.5 Typeface and decoration
+...............................
+
+The 'ms' macros provide a variety of ways to style text. Attend closely
+to the ordering of arguments labeled PRE and POST, which is not
+intuitive. Support for PRE arguments is a GNU extension.(1) (*note
+Typeface and decoration-Footnote-1::)
+
+ -- Macro: .B [text [post [pre]]]
+ Style TEXT in bold, followed by POST in the previous font style
+ without intervening space, and preceded by PRE similarly. Without
+ arguments, 'ms' styles subsequent text in bold until the next
+ paragraphing, heading, or no-argument typeface macro call.
+
+ -- Macro: .R [text [post [pre]]]
+ As 'B', but use the roman style (upright text of normal weight)
+ instead of bold. Argument recognition is a GNU extension.
+
+ -- Macro: .I [text [post [pre]]]
+ As 'B', but use an italic or oblique style instead of bold.
+
+ -- Macro: .BI [text [post [pre]]]
+ As 'B', but use a bold italic or bold oblique style instead of
+ upright bold. This is a Tenth Edition Research Unix extension.
+
+ -- Macro: .CW [text [post [pre]]]
+ As 'B', but use a constant-width (monospaced) roman typeface
+ instead of bold. This is a Tenth Edition Research Unix extension.
+
+ -- Macro: .BX [text]
+ Typeset TEXT and draw a box around it. On terminal devices,
+ reverse video is used instead. If you want TEXT to contain space,
+ use unbreakable space or horizontal motion escape sequences ('\~',
+ '\<SP>', '\^', '\|', '\0' or '\h').
+
+ -- Macro: .UL [text [post]]
+ Typeset TEXT with an underline. POST, if present, is set after
+ TEXT with no intervening space.
+
+ -- Macro: .LG
+ Set subsequent text in larger type (two points larger than the
+ current size) until the next type size, paragraphing, or heading
+ macro call. You can specify this macro multiple times to enlarge
+ the type size as needed.
+
+ -- Macro: .SM
+ Set subsequent text in smaller type (two points smaller than the
+ current size) until the next type size, paragraphing, or heading
+ macro call. You can specify this macro multiple times to reduce
+ the type size as needed.
+
+ -- Macro: .NL
+ Set subsequent text at the normal type size (the amount in the 'PS'
+ register).
+
+ PRE and POST arguments are typically used to simplify the attachment
+of punctuation to styled words. When PRE is used, a hyphenation control
+escape sequence '\%' that would ordinarily start TEXT must start PRE
+instead to have the desired effect.
+
+ The CS course's students found one C language keyword
+ .CW static ) \%(
+ most troublesome.
+
+ The foregoing example produces output as follows.
+
+ The CS course's students found one C language keyword (static)
+ most troublesome.
+
+ You can use the output line continuation escape sequence '\c' to
+achieve the same result (*note Line Continuation::). It is also
+portable to older 'ms' implementations.
+
+ The CS course's students found one C language keyword
+ \%(\c
+ .CW \%static )
+ most troublesome.
+
+ 'groff' 'ms' also offers strings to begin and end super- and
+subscripting. These are GNU extensions.
+
+ -- String: \*[{]
+ -- String: \*[}]
+ Begin and end superscripting, respectively.
+
+ -- String: \*[<]
+ -- String: \*[>]
+ Begin and end subscripting, respectively.
+
+ Rather than calling the 'CW' macro, in 'groff' 'ms' you might prefer
+to change the font family to Courier by setting the 'FAM' string to 'C'.
+You can then use all four style macros above, returning to the default
+family (Times) with '.ds FAM T'. Because changes to 'FAM' take effect
+only at the next paragraph, 'CW' remains useful to "inline" a change to
+the font family, similarly to the practice of this document in noting
+syntactical elements of 'ms' and 'groff'.
+
+ (1) This idiosyncrasy arose through feature accretion; for example,
+the 'B' macro in Version 6 Unix 'ms' (1975) accepted only one argument,
+the text to be set in boldface. By Version 7 (1979) it recognized a
+second argument; in 1990, 'groff' 'ms' added a "pre" argument, placing
+it third to avoid breaking support for older documents.
+
+4.6.5.6 Lists
+.............
+
+The MARKER argument to the 'IP' macro can be employed to present a
+variety of lists; for instance, you can use a bullet glyph ('\[bu]') for
+unordered lists, a number (or auto-incrementing register) for numbered
+lists, or a word or phrase for glossary-style or definition lists. If
+you set the paragraph indentation register 'PI' before calling 'IP', you
+can later reorder the items in the list without having to ensure that a
+WIDTH argument remains affixed to the first call.
+
+ The following is an example of a bulleted list.
+
+ .nr PI 2n
+ A bulleted list:
+ .IP \[bu]
+ lawyers
+ .IP \[bu]
+ guns
+ .IP \[bu]
+ money
+
+ A bulleted list:
+
+ * lawyers
+
+ * guns
+
+ * money
+
+ The following is an example of a numbered list.
+
+ .nr step 0 1
+ .nr PI 3n
+ A numbered list:
+ .IP \n+[step]
+ lawyers
+ .IP \n+[step]
+ guns
+ .IP \n+[step]
+ money
+
+ A numbered list:
+
+ 1. lawyers
+
+ 2. guns
+
+ 3. money
+
+ Here we have employed the 'nr' request to create a register of our
+own, 'step'. We initialized it to zero and assigned it an
+auto-increment of 1. Each time we use the escape sequence '\n+[PI]'
+(note the plus sign), the formatter applies the increment just before
+interpolating the register's value. Preparing the 'PI' register as well
+enables us to rearrange the list without the tedium of updating macro
+calls.
+
+ The next example illustrates a glossary-style list.
+
+ A glossary-style list:
+ .IP lawyers 0.4i
+ Two or more attorneys.
+ .IP guns
+ Firearms,
+ preferably large-caliber.
+ .IP money
+ Gotta pay for those
+ lawyers and guns!
+
+ A glossary-style list:
+
+ lawyers
+ Two or more attorneys.
+
+ guns Firearms, preferably large-caliber.
+
+ money
+ Gotta pay for those lawyers and guns!
+
+ In the previous example, observe how the 'IP' macro places the
+definition on the same line as the term if it has enough space. If this
+is not what you want, there are a few workarounds we will illustrate by
+modifying the example. First, you can use a 'br' request to force a
+break after printing the term or label.
+
+ .IP guns
+ .br
+ Firearms,
+
+ Second, you could apply the '\p' escape sequence to force a break.
+The space following the escape sequence is important; if you omit it,
+'groff' prints the first word of the paragraph text on the same line as
+the term or label (if it fits) _then_ breaks the line.
+
+ .IP guns
+ \p Firearms,
+
+ Finally, you may append a horizontal motion to the marker with the
+'\h' escape sequence; using the same amount as the indentation will
+ensure that the marker is too wide for 'groff' to treat it as "fitting"
+on the same line as the paragraph text.
+
+ .IP guns\h'0.4i'
+ Firearms,
+
+ In each case, the result is the same.
+
+ A glossary-style list:
+
+ lawyers
+ Two or more attorneys.
+
+ guns
+ Firearms, preferably large-caliber.
+
+ money
+ Gotta pay for those lawyers and guns!
+
+4.6.5.7 Indented regions
+........................
+
+You may need to indent a region of text while otherwise formatting it
+normally. Indented regions can be nested; you can change '\n[PI]'
+before each call to vary the amount of inset.
+
+ -- Macro: .RS
+ Begin a region where headings, paragraphs, and displays are
+ indented (further) by the amount stored in the 'PI' register.
+
+ -- Macro: .RE
+ End the (next) most recent indented region.
+
+ This feature enables you to easily line up text under hanging and
+indented paragraphs. For example, you may wish to structure lists
+hierarchically.
+
+ .IP \[bu] 2
+ Lawyers:
+ .RS
+ .IP \[bu]
+ Dewey,
+ .IP \[bu]
+ Cheatham,
+ and
+ .IP \[bu]
+ and Howe.
+ .RE
+ .IP \[bu]
+ Guns
+
+ * Lawyers:
+
+ * Dewey,
+
+ * Cheatham, and
+
+ * Howe.
+
+ * Guns
+
+4.6.5.8 Keeps, boxed keeps, and displays
+........................................
+
+On occasion, you may want to "keep" several lines of text, or a region
+of a document, together on a single page, preventing an automatic page
+break within certain boundaries. This can cause a page break to occur
+earlier than it normally would. For example, you may want to keep two
+paragraphs together, or a paragraph that refers to a table, list, or
+figure adjacent to the item it discusses. 'ms' provides the 'KS' and
+'KE' macros for this purpose.
+
+ You can alternatively specify a "floating keep": if a keep cannot fit
+on the current page, 'ms' holds its contents and allows material
+following the keep (in the source document) to fill the remainder of the
+current page. When the page breaks, whether by reaching the end or 'bp'
+request, 'ms' puts the floating keep at the beginning of the next page.
+This is useful for placing large graphics or tables that do not need to
+appear exactly where they occur in the source document.
+
+ -- Macro: .KS
+ -- Macro: .KF
+ -- Macro: .KE
+ 'KS' begins a keep, 'KF' a floating keep, and 'KE' ends a keep of
+ either kind.
+
+ As an alternative to the keep mechanism, the 'ne' request forces a
+page break if there is not at least the amount of vertical space
+specified in its argument remaining on the page (*note Page Control::).
+One application of 'ne' is to reserve space on the page for a figure or
+illustration to be included later.
+
+ A "boxed keep" has a frame drawn around it.
+
+ -- Macro: .B1
+ -- Macro: .B2
+ 'B1' begins a keep with a box drawn around it. 'B2' ends a boxed
+ keep.
+
+ Boxed keep macros cause breaks; if you need to box a word or phrase
+within a line, see the 'BX' macro in *note Typeface and decoration::.
+Box lines are drawn as close as possible to the text they enclose so
+that they are usable within paragraphs. If you wish to box one or more
+paragraphs, you may improve the appearance by calling 'B1' after the
+first paragraphing macro, and by adding a small amount of vertical space
+before calling 'B2'.
+
+ .LP
+ .B1
+ .I Warning:
+ Happy Fun Ball may suddenly accelerate to dangerous
+ speeds.
+ .sp \n[PD]/2 \" space by half the inter-paragraph distance
+ .B2
+
+ If you want a boxed keep to float, you will need to enclose the 'B1'
+and 'B2' calls within a pair of 'KF' and 'KE' calls.
+
+ "Displays" turn off filling; lines of verse or program code are shown
+with their lines broken as in the source document without requiring 'br'
+requests between lines. Displays can be kept on a single page or
+allowed to break across pages. The 'DS' macro begins a kept display of
+the layout specified in its first argument; non-kept displays are begun
+with dedicated macros corresponding to their layout.
+
+ -- Macro: .DS L
+ -- Macro: .LD
+ Begin ('DS': kept) left-aligned display.
+
+ -- Macro: .DS [I [indent]]
+ -- Macro: .ID [indent]
+ Begin ('DS': kept) display indented by INDENT if specified, and by
+ the amount of the 'DI' register otherwise.
+
+ -- Macro: .DS B
+ -- Macro: .BD
+ Begin a ('DS': kept) a block display: the entire display is
+ left-aligned, but indented such that the longest line in the
+ display is centered on the page.
+
+ -- Macro: .DS C
+ -- Macro: .CD
+ Begin a ('DS': kept) centered display: each line in the display is
+ centered.
+
+ -- Macro: .DS R
+ -- Macro: .RD
+ Begin a ('DS': kept) right-aligned display. This is a GNU
+ extension.
+
+ -- Macro: .DE
+ End any display.
+
+ The distance stored in the 'DD' register is inserted before and after
+each pair of display macros; this is a Berkeley extension. In 'groff'
+'ms', this distance replaces any adjacent inter-paragraph distance or
+subsequent spacing prior to a section heading. The 'DI' register is a
+GNU extension; its value is an indentation applied to displays created
+with '.DS' and '.ID' without arguments, to '.DS I' without an
+indentation argument, and to indented equations set with '.EQ'. Changes
+to either register take effect at the next display boundary.
+
+4.6.5.9 Tables, figures, equations, and references
+..................................................
+
+The 'ms' package is often used with the 'tbl', 'pic', 'eqn', and 'refer'
+preprocessors. Mark text meant for preprocessors by enclosing it in
+pairs of tokens as follows, with nothing between the dot and the macro
+name. The preprocessors match these tokens only at the start of an
+input line.
+
+ -- Macro: .TS [H]
+ -- Macro: .TE
+ Demarcate a table to be processed by the 'tbl' preprocessor. The
+ optional argument 'H' to 'TS' instructs 'ms' to repeat table rows
+ (often column headings) at the top of each new page the table
+ spans, if applicable; calling the 'TH' macro marks the end of such
+ rows. The GNU 'tbl(1)' man page provides a comprehensive reference
+ to the preprocessor and offers examples of its use.
+
+ -- Macro: .PS
+ -- Macro: .PE
+ -- Macro: .PF
+ 'PS' begins a picture to be processed by the 'gpic' preprocessor;
+ either of 'PE' or 'PF' ends it, the latter with "flyback" to the
+ vertical position at its top. You can create 'pic' input manually
+ or with a program such as 'xfig'.
+
+ -- Macro: .EQ [align [label]]
+ -- Macro: .EN
+ Demarcate an equation to be processed by the 'eqn' preprocessor.
+ The equation is centered by default; ALIGN can be 'C', 'L', or 'I'
+ to (explicitly) center, left-align, or indent it by the amount
+ stored in the 'DI' register, respectively. If specified, LABEL is
+ set right-aligned.
+
+ -- Macro: .[
+ -- Macro: .]
+ Demarcate a bibliographic citation to be processed by the 'refer'
+ preprocessor. The GNU 'refer(1)' man page provides a comprehensive
+ reference to the preprocessor and the format of its bibliographic
+ database. Type 'man refer' at the command line to view it.
+
+ When 'refer' emits collected references (as might be done on a "Works
+Cited" page), it interpolates the 'REFERENCES' string as an unnumbered
+heading ('SH').
+
+ The following is an example of how to set up a table that may print
+across two or more pages.
+
+ .TS H
+ allbox;
+ Cb | Cb .
+ Part->Description
+ _
+ .TH
+ .T&
+ GH-1978->Fribulating gonkulator
+ ...the rest of the table follows...
+ .TE
+
+Attempting to place a multi-page table inside a keep can lead to
+unpleasant results, particularly if the 'tbl' 'allbox' option is used.
+
+ Mathematics can be typeset using the language of the 'eqn'
+preprocessor.
+
+ .EQ C (\*[SN-NO-DOT]a)
+ p ~ = ~ q sqrt { ( 1 + ~ ( x / q sup 2 ) }
+ .EN
+
+This input formats a labelled equation. We used the 'SN-NO-DOT' string
+to base the equation label on the current heading number, giving us more
+flexibility to reorganize the document.
+
+ Use 'groff' options to run preprocessors on the input: '-e' for
+'geqn', '-p' for 'gpic', '-R' for 'grefer', and '-t' for 'gtbl'.
+
+4.6.5.10 Footnotes
+..................
+
+A footnote is typically anchored to a place in the text with a "marker",
+which is a small integer, a symbol such as a dagger, or arbitrary
+user-specified text.
+
+ -- String: \*[*]
+ Place an "automatic number", an automatically generated numeric
+ footnote marker, in the text. Each time this string is
+ interpolated, the number it produces increments by one. Automatic
+ numbers start at 1. This is a Berkeley extension.
+
+ Enclose the footnote text in 'FS' and 'FE' macro calls to set it at
+the nearest available "foot", or bottom, of a text column or page.
+
+ -- Macro: .FS [marker]
+ -- Macro: .FE
+ Begin ('FS') and end ('FE') a footnote. 'FS' calls 'FS-MARK' with
+ any supplied MARKER argument, which is then also placed at the
+ beginning of the footnote text. If MARKER is omitted, the next
+ pending automatic footnote number enqueued by interpolation of the
+ '*' string is used, and if none exists, nothing is prefixed.
+
+ You may not desire automatically numbered footnotes in spite of their
+convenience. You can indicate a footnote with a symbol or other text by
+specifying its marker at the appropriate place (for example, by using
+'\[dg]' for the dagger glyph) _and_ as an argument to the 'FS' macro.
+Such manual marks should be repeated as arguments to 'FS' or as part of
+the footnote text to disambiguate their correspondence. You may wish to
+use '\*{' and '\*}' to superscript the marker at the anchor point, in
+the footnote text, or both.
+
+ 'groff' 'ms' provides a hook macro, 'FS-MARK', for user-determined
+operations to be performed when the 'FS' macro is called. It is passed
+the same arguments as 'FS' itself. An application of 'FS-MARK' is
+anchor placement for a hyperlink reference, so that a footnote can link
+back to its referential context.(1) (*note ms Footnotes-Footnote-1::)
+By default, this macro has an empty definition. 'FS-MARK' is a GNU
+extension.
+
+ Footnotes can be safely used within keeps and displays, but you
+should avoid using automatically numbered footnotes within floating
+keeps. You can place a second '\**' interpolation between a '\**' and
+its corresponding 'FS' call as long as each 'FS' call occurs _after_ the
+corresponding '\**' and occurrences of 'FS' are in the same order as
+corresponding occurrences of '\**'.
+
+ Footnote text is formatted as paragraphs are, using analogous
+parameters. The registers 'FI', 'FPD', 'FPS', and 'FVS' correspond to
+'PI', 'PD', 'PS', and 'CS', respectively; 'FPD', 'FPS', and 'FVS' are
+GNU extensions.
+
+ The 'FF' register controls the formatting of automatically numbered
+footnote paragraphs and those for which 'FS' is given a marker argument.
+*Note ms Document Control Settings::.
+
+ The default footnote line length is 11/12ths of the normal line
+length for compatibility with the expectations of historical 'ms'
+documents; you may wish to set the 'FR' string to '1' to align with
+contemporary typesetting practices. In the past,(2) (*note ms
+Footnotes-Footnote-2::) an 'FL' register was used for the line length in
+footnotes; however, setting this register at document initialization
+time had no effect on the footnote line length in multi-column
+arrangements.(3) (*note ms Footnotes-Footnote-3::)
+
+ 'FR' should be used in preference to the old 'FL' register in
+contemporary documents. The footnote line length is effectively
+computed as 'column-width * \*[FR]'. If an absolute footnote line
+length is required, recall that arithmetic expressions in 'roff' input
+are evaluated strictly from left to right, with no operator precedence
+(parentheses are honored).
+
+ .ds FR 0+3i \" Set footnote line length to 3 inches.
+
+ (1) "Portable Document Format Publishing with GNU Troff",
+'pdfmark.ms' in the 'groff' distribution, uses this technique.
+
+ (2) Unix Version 7 'ms', its descendants, and GNU 'ms' prior to
+'groff' version 1.23.0
+
+ (3) You could reset it after each call to '.1C', '.2C', or '.MC'.
+
+4.6.5.11 Language and localization
+..................................
+
+'groff' 'ms' provides several strings that you can customize for your
+own purposes, or redefine to adapt the macro package to languages other
+than English. It is already localized for Czech, German, French,
+Italian, and Swedish. Load the desired localization macro package after
+'ms'; see the 'groff_tmac(5)' man page.
+
+ $ groff -ms -mfr bienvenue.ms
+
+ The following strings are available.
+
+ -- String: \*[REFERENCES]
+ Contains the string printed at the beginning of a references
+ (bibliography) page produced with GNU 'refer(1)'. The default is
+ 'References'.
+
+ -- String: \*[ABSTRACT]
+ Contains the string printed at the beginning of the abstract. The
+ default is '\f[I]ABSTRACT\f[]'; it includes font selection escape
+ sequences to set the word in italics.
+
+ -- String: \*[TOC]
+ Contains the string printed at the beginning of the table of
+ contents. The default is 'Table of Contents'.
+
+ -- String: \*[MONTH1]
+ -- String: \*[MONTH2]
+ -- String: \*[MONTH3]
+ -- String: \*[MONTH4]
+ -- String: \*[MONTH5]
+ -- String: \*[MONTH6]
+ -- String: \*[MONTH7]
+ -- String: \*[MONTH8]
+ -- String: \*[MONTH9]
+ -- String: \*[MONTH10]
+ -- String: \*[MONTH11]
+ -- String: \*[MONTH12]
+ Contain the full names of the calendar months. The defaults are in
+ English: 'January', 'February', and so on.
+
+4.6.6 Page layout
+-----------------
+
+'ms''s default page layout arranges text in a single column with the
+page number between hyphens centered in a header on each page except the
+first, and produces no footers. You can customize this arrangement.
+
+4.6.6.1 Headers and footers
+...........................
+
+There are multiple ways to produce headers and footers. One is to
+define the strings 'LH', 'CH', and 'RH' to set the left, center, and
+right headers, respectively; and 'LF', 'CF', and 'RF' to set the left,
+center, and right footers. This approach suffices for documents that do
+not distinguish odd- and even-numbered pages.
+
+ Another method is to call macros that set headers or footers for odd-
+or even-numbered pages. Each such macro takes a delimited argument
+separating the left, center, and right header or footer texts from each
+other. You can replace the neutral apostrophes (''') shown below with
+any character not appearing in the header or footer text. These macros
+are Berkeley extensions.
+
+ -- Macro: .OH 'left'center'right'
+ -- Macro: .EH 'left'center'right'
+ -- Macro: .OF 'left'center'right'
+ -- Macro: .EF 'left'center'right'
+ The 'OH' and 'EH' macros define headers for odd- (recto) and
+ even-numbered (verso) pages, respectively; the 'OF' and 'EF' macros
+ define footers for them.
+
+ With either method, a percent sign '%' in header or footer text is
+replaced by the current page number. By default, 'ms' places no header
+on a page numbered "1" (regardless of its number format).
+
+ -- Macro: .P1
+ Typeset the header even on page 1. To be effective, this macro
+ must be called before the header trap is sprung on any page
+ numbered "1"; in practice, unless your page numbering is unusual,
+ this means that you should call it early, before 'TL' or any
+ heading or paragraphing macro. This is a Berkeley extension.
+
+ For even greater flexibility, 'ms' is designed to permit the
+redefinition of the macros that are called when the 'groff' traps that
+ordinarily cause the headers and footers to be output are sprung. 'PT'
+("page trap") is called by 'ms' when the header is to be written, and
+'BT' ("bottom trap") when the footer is to be. The 'groff' page
+location trap that 'ms' sets up to format the header also calls the
+(normally undefined) 'HD' macro after 'PT'; you can define 'HD' if you
+need additional processing after setting the header (for example, to
+draw a line below it). The 'HD' hook is a Berkeley extension. Any such
+macros you (re)define must implement any desired specialization for
+odd-, even-, or first numbered pages.
+
+4.6.6.2 Tab stops
+.................
+
+Use the 'ta' request to define tab stops as needed. *Note Tabs and
+Fields::.
+
+ -- Macro: .TA
+ Reset the tab stops to the 'ms' default (every 5 ens). Redefine
+ this macro to create a different set of default tab stops.
+
+4.6.6.3 Margins
+...............
+
+Control margins using the registers summarized in "Margin settings" in
+*note ms Document Control Settings:: above. There is no setting for the
+right margin; the combination of page offset '\n[PO]' and line length
+'\n[LL]' determines it.
+
+4.6.6.4 Multiple columns
+........................
+
+'ms' can set text in as many columns as reasonably fit on the page. The
+following macros force a page break if a multi-column layout is active
+when they are called. The 'MINGW' register stores the default minimum
+gutter width; it is a GNU extension. When multiple columns are in use,
+keeps and the 'HORPHANS' and 'PORPHANS' registers work with respect to
+column breaks instead of page breaks.
+
+ -- Macro: .1C
+ Arrange page text in a single column (the default).
+
+ -- Macro: .2C
+ Arrange page text in two columns.
+
+ -- Macro: .MC [column-width [gutter-width]]
+ Arrange page text in multiple columns. If you specify no
+ arguments, it is equivalent to the '2C' macro. Otherwise,
+ COLUMN-WIDTH is the width of each column and GUTTER-WIDTH is the
+ minimum distance between columns.
+
+4.6.6.5 Creating a table of contents
+....................................
+
+Because 'roff' formatters process their input in a single pass, material
+on page 50, for example, cannot influence what appears on page 1--this
+poses a challenge for a table of contents at its traditional location in
+front matter, if you wish to avoid manually maintaining it. 'ms'
+enables the collection of material to be presented in the table of
+contents as it appears, saving its page number along with it, and then
+emitting the collected contents on demand toward the end of the
+document. The table of contents can then be resequenced to its desired
+location by physically rearranging the pages of a printed document, or
+as part of post-processing--with a 'sed(1)' script to reorder the pages
+in 'troff''s output, with 'pdfjam(1)', or with 'gropdf(1)''s
+'.pdfswitchtopage' feature, for example.
+
+ Define an entry to appear in the table of contents by bracketing its
+text between calls to the 'XS' and 'XE' macros. A typical application
+is to call them immediately after 'NH' or 'SH' and repeat the heading
+text within them. The 'XA' macro, used within '.XS'/'.XE' pairs,
+supplements an entry--for instance, when it requires multiple output
+lines, whether because a heading is too long to fit or because style
+dictates that page numbers not be repeated. You may wish to indent the
+text thus wrapped to correspond to its heading depth; this can be done
+in the entry text by prefixing it with tabs or horizontal motion escape
+sequences, or by providing a second argument to the 'XA' macro. 'XS'
+and 'XA' automatically associate the page number where they are called
+with the text following them, but they accept arguments to override this
+behavior. At the end of the document, call 'TC' or 'PX' to emit the
+table of contents; 'TC' resets the page number to 'i' (Roman numeral
+one), and then calls 'PX'. All of these macros are Berkeley extensions.
+
+ -- Macro: .XS [page-number]
+ -- Macro: .XA [page-number [indentation]]
+ -- Macro: .XE
+ Begin, supplement, and end a table of contents entry. Each entry
+ is associated with PAGE-NUMBER (otherwise the current page number);
+ a PAGE-NUMBER of 'no' prevents a leader and page number from being
+ emitted for that entry. Use of 'XA' within 'XS'/'XE' is optional;
+ it can be repeated. If INDENTATION is present, a supplemental
+ entry is indented by that amount; ens are assumed if no unit is
+ indicated. Text on input lines between 'XS' and 'XE' is stored for
+ later recall by 'PX'.
+
+ -- Macro: .PX [no]
+ Switch to single-column layout. Unless 'no' is specified, center
+ and interpolate the 'TOC' string in bold and two points larger than
+ the body text. Emit the table of contents entries.
+
+ -- Macro: .TC [no]
+ Set the page number to 1, the page number format to lowercase Roman
+ numerals, and call 'PX' (with a 'no' argument, if present).
+
+ Here's an example of typical 'ms' table of contents preparation. We
+employ horizontal escape sequences '\h' to indent the entries by
+sectioning depth.
+
+ .NH 1
+ Introduction
+ .XS
+ Introduction
+ .XE
+ ...
+ .NH 2
+ Methodology
+ .XS
+ \h'2n'Methodology
+ .XA
+ \h'4n'Fassbinder's Approach
+ \h'4n'Kahiu's Approach
+ .XE
+ ...
+ .NH 1
+ Findings
+ .XS
+ Findings
+ .XE
+ ...
+ .TC
+
+ The remaining features in this subsubsection are GNU extensions.
+'groff' 'ms' obviates the need to repeat heading text after 'XS' calls.
+Call 'XN' and 'XH' after 'NH' and 'SH', respectively.
+
+ -- Macro: .XN heading-text
+ -- Macro: .XH depth heading-text
+ Format HEADING-TEXT and create a corresponding table of contents
+ entry. 'XN' computes the indentation from the depth of the
+ preceding 'NH' call; 'XH' requires a DEPTH argument to do so.
+
+ 'groff' 'ms' encourages customization of table of contents entry
+production.
+
+ -- Macro: .XN-REPLACEMENT heading-text
+ -- Macro: .XH-REPLACEMENT depth heading-text
+ These hook macros implement 'XN' and 'XH', respectively. They call
+ 'XN-INIT' and pass their HEADING-TEXT arguments to 'XH-UPDATE-TOC'.
+
+ -- Macro: .XN-INIT
+ -- Macro: .XH-UPDATE-TOC depth heading-text
+ The 'XN-INIT' hook macro does nothing by default. 'XH-UPDATE-TOC'
+ brackets HEADING-TEXT with 'XS' and 'XE' calls, indenting it by 2
+ ens per level of DEPTH beyond the first.
+
+ We could therefore produce a table of contents similar to that in the
+previous example with fewer macro calls. (The difference is that this
+input follows the "Approach" entries with leaders and page numbers.)
+
+ .NH 1
+ .XN Introduction
+ ...
+ .NH 2
+ .XN Methodology
+ .XH 3 "Fassbinder's Approach"
+ .XH 3 "Kahiu's Approach"
+ ...
+ .NH 1
+ .XN Findings
+ ...
+
+ To get the section number of the numbered headings into the table of
+contents entries, we might define 'XN-REPLACEMENT' as follows. (We
+obtain the heading depth from 'groff' 'ms''s internal register 'nh*hl'.)
+
+ .de XN-REPLACEMENT
+ .XN-INIT
+ .XH-UPDATE-TOC \\n[nh*hl] \\$@
+ \&\\*[SN] \\$*
+ ..
+
+ You can change the style of the leader that bridges each table of
+contents entry with its page number; define the 'TC-LEADER' special
+character by using the 'char' request. A typical leader combines the
+dot glyph '.' with a horizontal motion escape sequence to spread the
+dots. The width of the page number field is stored in the 'TC-MARGIN'
+register.
+
+4.6.7 Differences from AT&T 'ms'
+--------------------------------
+
+The 'groff' 'ms' macros are an independent reimplementation, using no
+AT&T code. Since they take advantage of the extended features of
+'groff', they cannot be used with AT&T 'troff'. 'groff' 'ms' supports
+features described above as Berkeley and Tenth Edition Research Unix
+extensions, and adds several of its own.
+
+ * The internals of 'groff' 'ms' differ from the internals of AT&T
+ 'ms'. Documents that depend upon implementation details of AT&T
+ 'ms' may not format properly with 'groff' 'ms'. Such details
+ include macros whose function was not documented in the AT&T 'ms'
+ manual.(1) (*note Differences from AT&T ms-Footnote-1::)
+
+ * The error-handling policy of 'groff' 'ms' is to detect and report
+ errors, rather than to ignore them silently.
+
+ * Tenth Edition Research Unix supported 'P1'/'P2' macros to bracket
+ code examples; 'groff' 'ms' does not.
+
+ * 'groff' 'ms' does not work in GNU 'troff''s AT&T compatibility
+ mode. If loaded when that mode is enabled, it aborts processing
+ with a diagnostic message.
+
+ * Multiple line spacing is not supported. Use a larger vertical
+ spacing instead.
+
+ * 'groff' 'ms' uses the same header and footer defaults in both
+ 'nroff' and 'troff' modes as AT&T 'ms' does in 'troff' mode; AT&T's
+ default in 'nroff' mode is to put the date, in U.S. traditional
+ format (e.g., "January 1, 2021"), in the center footer (the 'CF'
+ string).
+
+ * Many 'groff' 'ms' macros, including those for paragraphs, headings,
+ and displays, cause a reset of paragraph rendering parameters, and
+ may change the indentation; they do so not by incrementing or
+ decrementing it, but by setting it absolutely. This can cause
+ problems for documents that define additional macros of their own
+ that try to manipulate indentation. Use the 'ms' 'RS' and 'RE'
+ macros instead of the 'in' request.
+
+ * AT&T 'ms' interpreted the values of the registers 'PS' and 'VS' in
+ points, and did not support the use of scaling units with them.
+ 'groff' 'ms' interprets values of the registers 'PS', 'VS', 'FPS',
+ and 'FVS' equal to or larger than 1,000 (one thousand) as decimal
+ fractions multiplied by 1,000.(2) (*note Differences from AT&T
+ ms-Footnote-2::) This threshold makes use of a scaling unit with
+ these parameters practical for high-resolution devices while
+ preserving backward compatibility. It also permits expression of
+ non-integral type sizes. For example, 'groff -rPS=10.5p' at the
+ shell prompt is equivalent to placing '.nr PS 10.5p' at the
+ beginning of the document.
+
+ * AT&T 'ms''s 'AU' macro supported arguments used with some document
+ types; 'groff' 'ms' does not.
+
+ * Right-aligned displays are available. The AT&T 'ms' manual
+ observes that "it is tempting to assume that '.DS R' will right
+ adjust lines, but it doesn't work". In 'groff' 'ms', it does.
+
+ * To make 'groff' 'ms' use the default page offset (which also
+ specifies the left margin), the 'PO' register must stay undefined
+ until the first 'ms' macro is called.
+
+ This implies that '\n[PO]' should not be used early in the
+ document, unless it is changed also: accessing an undefined
+ register automatically defines it.
+
+ * 'groff' 'ms' supports the 'PN' register, but it is not necessary;
+ you can access the page number via the usual '%' register and
+ invoke the 'af' request to assign a different format to it if
+ desired.(3) (*note Differences from AT&T ms-Footnote-3::)
+
+ * The AT&T 'ms' manual documents registers 'CW' and 'GW' as setting
+ the default column width and "intercolumn gap", respectively, and
+ which applied when 'MC' was called with fewer than two arguments.
+ 'groff' 'ms' instead treats 'MC' without arguments as synonymous
+ with '2C'; there is thus no occasion for a default column width
+ register. Further, the 'MINGW' register and the second argument to
+ 'MC' specify a _minimum_ space between columns, not the fixed
+ gutter width of AT&T 'ms'.
+
+ * The AT&T 'ms' manual did not document the 'QI' register; Berkeley
+ and 'groff' 'ms' do.
+
+ -- Register: \n[GS]
+ The register 'GS' is set to 1 by the 'groff' 'ms' macros, but is
+ not used by the AT&T 'ms' package. Documents that need to
+ determine whether they are being formatted with 'groff' 'ms' or
+ another implementation should test this register.
+
+ (1) 'Typing Documents on the UNIX System: Using the -ms Macros with
+Troff and Nroff', M. E. Lesk, Bell Laboratories, 1978
+
+ (2) Register values are converted to and stored as basic units.
+*Note Measurements::.
+
+ (3) If you redefine the 'ms' 'PT' macro and desire special treatment
+of certain page numbers (like '1'), you may need to handle a non-Arabic
+page number format, as 'groff' 'ms''s 'PT' does; see the macro package
+source. 'groff' 'ms' aliases the 'PN' register to '%'.
+
+4.6.7.1 Unix Version 7 'ms' macros not implemented by 'groff' 'ms'
+..................................................................
+
+Several macros described in the Unix Version 7 'ms' documentation are
+unimplemented by 'groff' 'ms' because they are specific to the
+requirements of documents produced internally by Bell Laboratories, some
+of which also require a glyph for the Bell System logo that 'groff' does
+not support. These macros implemented several document type formats
+('EG', 'IM', 'MF', 'MR', 'TM', 'TR'), were meaningful only in
+conjunction with the use of certain document types ('AT', 'CS', 'CT',
+'OK', 'SG'), stored the postal addresses of Bell Labs sites ('HO', 'IH',
+'MH', 'PY', 'WH'), or lacked a stable definition over time ('UX'). To
+compatibly render historical 'ms' documents using these macros, we
+advise your documents to invoke the 'rm' request to remove any such
+macros it uses and then define replacements with an authentically
+typeset original at hand.(1) (*note Missing Unix Version 7 ms
+Macros-Footnote-1::) For informal purposes, a simple definition of 'UX'
+should maintain the readability of the document's substance.
+
+ .rm UX
+ .ds UX Unix\"
+
+ (1) The removal beforehand is necessary because 'groff' 'ms' aliases
+these macros to a diagnostic macro, and you want to redefine the aliased
+name, not its target.
+
+4.6.8 Legacy Features
+---------------------
+
+'groff' 'ms' retains some legacy features solely to support formatting
+of historical documents; contemporary ones should not use them because
+they can render poorly. See the 'groff_char(7)' man page.
+
+AT&T accent mark strings
+........................
+
+AT&T 'ms' defined accent mark strings as follows.
+
+ -- String: \*[']
+ Apply acute accent to subsequent glyph.
+
+ -- String: \*[`]
+ Apply grave accent to subsequent glyph.
+
+ -- String: \*[:]
+ Apply dieresis (umlaut) to subsequent glyph.
+
+ -- String: \*[^]
+ Apply circumflex accent to subsequent glyph.
+
+ -- String: \*[~]
+ Apply tilde accent to subsequent glyph.
+
+ -- String: \*[C]
+ Apply caron to subsequent glyph.
+
+ -- String: \*[,]
+ Apply cedilla to subsequent glyph.
+
+Berkeley accent mark and glyph strings
+......................................
+
+Berkeley 'ms' offered an 'AM' macro; calling it redefined the AT&T
+accent mark strings (except for '\*C'), applied them to the _preceding_
+glyph, and defined additional strings, some for spacing glyphs.
+
+ -- Macro: .AM
+ Enable alternative accent mark and glyph-producing strings.
+
+ -- String: \*[']
+ Apply acute accent to preceding glyph.
+
+ -- String: \*[`]
+ Apply grave accent to preceding glyph.
+
+ -- String: \*[:]
+ Apply dieresis (umlaut) to preceding glyph.
+
+ -- String: \*[^]
+ Apply circumflex accent to preceding glyph.
+
+ -- String: \*[~]
+ Apply tilde accent to preceding glyph.
+
+ -- String: \*[,]
+ Apply cedilla to preceding glyph.
+
+ -- String: \*[/]
+ Apply stroke (slash) to preceding glyph.
+
+ -- String: \*[v]
+ Apply caron to preceding glyph.
+
+ -- String: \*[_]
+ Apply macron to preceding glyph.
+
+ -- String: \*[.]
+ Apply underdot to preceding glyph.
+
+ -- String: \*[o]
+ Apply ring accent to preceding glyph.
+
+ -- String: \*[?]
+ Interpolate inverted question mark.
+
+ -- String: \*[!]
+ Interpolate inverted exclamation mark.
+
+ -- String: \*[8]
+ Interpolate small letter sharp s.
+
+ -- String: \*[q]
+ Interpolate small letter o with hook accent (ogonek).
+
+ -- String: \*[3]
+ Interpolate small letter yogh.
+
+ -- String: \*[d-]
+ Interpolate small letter eth.
+
+ -- String: \*[D-]
+ Interpolate capital letter eth.
+
+ -- String: \*[th]
+ Interpolate small letter thorn.
+
+ -- String: \*[Th]
+ Interpolate capital letter thorn.
+
+ -- String: \*[ae]
+ Interpolate small æ ligature.
+
+ -- String: \*[Ae]
+ Interpolate capital Æ ligature.
+
+ -- String: \*[oe]
+ Interpolate small oe ligature.
+
+ -- String: \*[OE]
+ Interpolate capital OE ligature.
+
+4.6.9 Naming Conventions
+------------------------
+
+The following conventions are used for names of macros, strings, and
+registers. External names available to documents that use the 'groff'
+'ms' macros contain only uppercase letters and digits.
+
+ Internally, the macros are divided into modules. Conventions for
+identifier names are as follows.
+
+ * Names used only within one module are of the form MODULE'*'NAME.
+
+ * Names used outside the module in which they are defined are of the
+ form MODULE'@'NAME.
+
+ * Names associated with a particular environment are of the form
+ ENVIRONMENT':'NAME; these are used only within the 'par' module.
+
+ * NAME does not have a module prefix.
+
+ * Constructed names used to implement arrays are of the form
+ ARRAY'!'INDEX.
+
+ Thus the 'groff' 'ms' macros reserve the following names.
+
+ * Names containing the characters '*', '@', and ':'.
+
+ * Names containing only uppercase letters and digits.
+
+5 GNU 'troff' Reference
+***********************
+
+This chapter covers _all_ of the facilities of the GNU 'troff'
+formatting engine. Users of macro packages may skip it if not
+interested in details.
+
+5.1 Text
+========
+
+AT&T 'troff' was designed to take input as it would be composed on a
+typewriter, including the teletypewriters used as early computer
+terminals, and relieve the user drafting a document of concern with
+details like line length, hyphenation breaking, and the achievement of
+straight margins. Early in its development, the program gained the
+ability to prepare output for a phototypesetter; a document could then
+be prepared for output to either a teletypewriter, a phototypesetter, or
+both. GNU 'troff' continues this tradition of permitting an author to
+compose a single master version of a document which can then be rendered
+for a variety of output formats or devices.
+
+ 'roff' input files contain text interspersed with instructions to
+control the formatter. Even in the absence of such instructions, GNU
+'troff' still processes its input in several ways, by filling,
+hyphenating, breaking, and adjusting it, and supplementing it with
+inter-sentence space.
+
+5.1.1 Filling
+-------------
+
+When GNU 'troff' starts up, it obtains information about the device for
+which it is preparing output.(1) (*note Filling-Footnote-1::) An
+essential property is the length of the output line, such as "6.5
+inches".
+
+ GNU 'troff' interprets plain text files employing the Unix
+line-ending convention. It reads input a character at a time,
+collecting words as it goes, and fits as many words together on an
+output line as it can--this is known as "filling". To GNU 'troff', a
+"word" is any sequence of one or more characters that aren't spaces or
+newlines. The exceptions separate words.(2) (*note
+Filling-Footnote-2::) To disable filling, see *note Manipulating Filling
+and Adjustment::.
+
+ It is a truth universally acknowledged
+ that a single man in possession of a
+ good fortune must be in want of a wife.
+ => It is a truth universally acknowledged that a
+ => single man in possession of a good fortune must
+ => be in want of a wife.
+
+ (1) *Note Device and Font Description Files::.
+
+ (2) Tabs and leaders also separate words. Escape sequences can
+function as word characters, word separators, or neither--the last
+simply have no effect on GNU 'troff''s idea of whether an input
+character is within a word. We'll discuss all of these in due course.
+
+5.1.2 Sentences
+---------------
+
+A passionate debate has raged for decades among writers of the English
+language over whether more space should appear between adjacent
+sentences than between words within a sentence, and if so, how much, and
+what other circumstances should influence this spacing.(1) (*note
+Sentences-Footnote-1::) GNU 'troff' follows the example of AT&T 'troff';
+it attempts to detect the boundaries between sentences, and supplies
+additional inter-sentence space between them.
+
+ Hello, world!
+ Welcome to groff.
+ => Hello, world! Welcome to groff.
+
+ GNU 'troff' flags certain characters (normally '!', '?', and '.') as
+potentially ending a sentence. When GNU 'troff' encounters one of these
+"end-of-sentence characters" at the end of an input line, or one of them
+is followed by two (unescaped) spaces on the same input line, it appends
+an inter-word space followed by an inter-sentence space in the output.
+
+ R. Harper subscribes to a maxim of P. T. Barnum.
+ => R. Harper subscribes to a maxim of P. T. Barnum.
+
+ In the above example, inter-sentence space is not added after 'P.' or
+'T.' because the periods do not occur at the end of an input line, nor
+are they followed by two or more spaces. Let's imagine that we've heard
+something about defamation from Mr. Harper's attorney, recast the
+sentence, and reflowed it in our text editor.
+
+ I submit that R. Harper subscribes to a maxim of P. T.
+ Barnum.
+ => I submit that R. Harper subscribes to a maxim of
+ => P. T. Barnum.
+
+ "Barnum" doesn't begin a sentence! What to do? Let us meet our
+first "escape sequence", a series of input characters that give
+instructions to GNU 'troff' instead of being used to construct output
+device glyphs.(2) (*note Sentences-Footnote-2::) An escape sequence
+begins with the backslash character '\' by default, an uncommon
+character in natural language text, and is _always_ followed by at least
+one other character, hence the term "sequence".
+
+ The dummy character escape sequence '\&' can be used after an
+end-of-sentence character to defeat end-of-sentence detection on a
+per-instance basis. We can therefore rewrite our input more
+defensively.
+
+ I submit that R.\& Harper subscribes to a maxim of P.\&
+ T.\& Barnum.
+ => I submit that R. Harper subscribes to a maxim of
+ => P. T. Barnum.
+
+ Adding text caused our input to wrap; now, we don't need '\&' after
+'T.' but we do after 'P.'. Consistent use of the escape sequence
+ensures that potential sentence boundaries are robust to editing
+activities. Further advice along these lines will follow in *note Input
+Conventions::.
+
+ Normally, the occurrence of a visible non-end-of-sentence character
+(as opposed to a space or tab) immediately after an end-of-sentence
+character cancels detection of the end of a sentence. For example, it
+would be incorrect for GNU 'troff' to infer the end of a sentence after
+the dot in '3.14159'. However, several characters are treated
+_transparently_ after the occurrence of an end-of-sentence character.
+That is, GNU 'troff' does not cancel end-of-sentence detection when it
+processes them. This is because such characters are often used as
+footnote markers or to close quotations and parentheticals. The default
+set is '"', ''', ')', ']', '*', '\[dg]', '\[dd]', '\[rq]', and '\[cq]'.
+The last four are examples of "special characters", escape sequences
+whose purpose is to obtain glyphs that are not easily typed at the
+keyboard, or which have special meaning to GNU 'troff' (like '\'
+itself).(3) (*note Sentences-Footnote-3::)
+
+ \[lq]The idea that the poor should have leisure has always
+ been shocking to the rich.\[rq]
+ (Bertrand Russell, 1935)
+ => "The idea that the poor should have
+ => leisure has always been shocking to
+ => the rich." (Bertrand Russell, 1935)
+
+ The sets of characters that potentially end sentences or are
+transparent to sentence endings are configurable. See the 'cflags'
+request in *note Using Symbols::. To change the additional
+inter-sentence space amount--even to remove it entirely--see *note
+Manipulating Filling and Adjustment::.
+
+ (1) A well-researched jeremiad appreciated by 'groff' contributors on
+both sides of the sentence-spacing debate can be found at
+<https://web.archive.org/web/20171217060354/http://www.heracliteanriver.com/?p=324>.
+
+ (2) This statement oversimplifies; there are escape sequences whose
+purpose is precisely to produce glyphs on the output device, and input
+characters that _aren't_ part of escape sequences can undergo a great
+deal of processing before getting to the output.
+
+ (3) The mnemonics for the special characters shown here are "dagger",
+"double dagger", "right (double) quote", and "closing (single) quote".
+See the 'groff_char(7)' man page.
+
+5.1.3 Hyphenation
+-----------------
+
+When an output line is nearly full, it is uncommon for the next word
+collected from the input to exactly fill it--typically, there is room
+left over only for part of the next word. The process of splitting a
+word so that it appears partially on one line (with a hyphen to indicate
+to the reader that the word has been broken) with its remainder on the
+next is "hyphenation". Hyphenation points can be manually specified;
+GNU 'troff' also uses a hyphenation algorithm and language-specific
+pattern files (based on those used in TeX) to decide which words can be
+hyphenated and where.
+
+ Hyphenation does not always occur even when the hyphenation rules for
+a word allow it; it can be disabled, and when not disabled there are
+several parameters that can prevent it in certain circumstances. *Note
+Manipulating Hyphenation::.
+
+5.1.4 Breaking
+--------------
+
+Once an output line is full, the next word (or remainder of a hyphenated
+one) is placed on a different output line; this is called a "break". In
+this manual and in 'roff' discussions generally, a "break" if not
+further qualified always refers to the termination of an output line.
+When the formatter is filling text, it introduces breaks automatically
+to keep output lines from exceeding the configured line length. After
+an automatic break, GNU 'troff' adjusts the line if applicable (see
+below), and then resumes collecting and filling text on the next output
+line.
+
+ Sometimes, a line cannot be broken automatically. This usually does
+not happen with natural language text unless the output line length has
+been manipulated to be extremely short, but it can with specialized text
+like program source code. We can use 'perl' at the shell prompt to
+contrive an example of failure to break the line. We also employ the
+'-z' option to suppress normal output.
+
+ $ perl -e 'print "#" x 80, "\n";' | nroff -z
+ error-> warning: cannot break line
+
+ The remedy for these cases is to tell GNU 'troff' where the line may
+be broken without hyphens. This is done with the non-printing break
+point escape sequence '\:'; see *note Manipulating Hyphenation::.
+
+ What if the document author wants to stop filling lines temporarily,
+for instance to start a new paragraph? There are several solutions. A
+blank input line not only causes a break, but by default it also outputs
+a one-line vertical space (effectively a blank output line). This
+behavior can be modified; see *note Blank Line Traps::. Macro packages
+may discourage or disable the blank line method of paragraphing in favor
+of their own macros.
+
+ A line that begins with one or more spaces causes a break. The
+spaces are output at the beginning of the next line without being
+_adjusted_ (see below); however, this behavior can be modified (*note
+Leading Space Traps::). Again, macro packages may provide other methods
+of producing indented paragraphs. Trailing spaces on text lines are
+discarded.(1) (*note Breaking-Footnote-1::)
+
+ What if the file ends before enough words have been collected to fill
+an output line? Or the output line is exactly full but not yet broken,
+and there is no more input? GNU 'troff' interprets the end of input as
+a break. Certain requests also cause breaks, implicitly or explicitly.
+This is discussed in *note Manipulating Filling and Adjustment::.
+
+ (1) "Text lines" are defined in *note Requests and Macros::.
+
+5.1.5 Adjustment
+----------------
+
+After GNU 'troff' performs an automatic break, it may then "adjust" the
+line, widening inter-word spaces until the text reaches the right
+margin. Extra spaces between words are preserved. Leading and trailing
+spaces are handled as noted above. Text can be aligned to the left or
+right margin only, or centered; see *note Manipulating Filling and
+Adjustment::.
+
+5.1.6 Tabs and Leaders
+----------------------
+
+GNU 'troff' translates input horizontal tab characters ("tabs") and
+<Control+A> characters ("leaders") into movements to the next tab stop.
+Tabs simply move to the next tab stop; leaders place enough periods to
+fill the space. Tab stops are by default located every half inch
+measured from the drawing position corresponding to the beginning of the
+input line; see *note Page Geometry::. Tabs and leaders do not cause
+breaks and therefore do not interrupt filling. Below, we use arrows ->
+and bullets * to indicate input tabs and leaders, respectively.
+
+ 1
+ -> 2 -> 3 * 4
+ -> * 5
+ => 1 2 3.......4 ........5
+
+ Tabs and leaders lend themselves to table construction.(1) (*note
+Tabs and Leaders-Footnote-1::) The tab and leader glyphs can be
+configured, and further facilities for sophisticated table composition
+are available; see *note Tabs and Fields::. There are many details to
+track when using such low-level features, so most users turn to the
+'tbl(1)' preprocessor to lay out tables.
+
+ (1) "Tab" is short for "tabulation", revealing the term's origin as a
+spacing mechanism for table arrangement.
+
+5.1.7 Requests and Macros
+-------------------------
+
+We have now encountered almost all of the syntax there is in the 'roff'
+language, with an exception already noted in passing. A "request" is an
+instruction to the formatter that occurs after a "control character",
+which is recognized at the beginning of an input line. The regular
+control character is a dot ('.'). Its counterpart, the "no-break
+control character", a neutral apostrophe ('''), suppresses the break
+that is implied by some requests. These characters were chosen because
+it is uncommon for lines of text in natural languages to begin with
+them. If you require a formatted period or apostrophe (closing single
+quotation mark) where GNU 'troff' is expecting a control character,
+prefix the dot or neutral apostrophe with the dummy character escape
+sequence, '\&'.
+
+ An input line beginning with a control character is called a "control
+line". Every line of input that is not a control line is a "text
+line".(1) (*note Requests and Macros-Footnote-1::)
+
+ Requests often take "arguments", words (separated from the request
+name and each other by spaces) that specify details of the action GNU
+'troff' is expected to perform. If a request is meaningless without
+arguments, it is typically ignored.
+
+ GNU 'troff''s requests and escape sequences comprise the control
+language of the formatter. Of key importance are the requests that
+define macros. Macros are invoked like requests, enabling the request
+repertoire to be extended or overridden.(2) (*note Requests and
+Macros-Footnote-2::)
+
+ A "macro" can be thought of as an abbreviation you can define for a
+collection of control and text lines. When the macro is "called" by
+giving its name after a control character, it is replaced with what it
+stands for. The process of textual replacement is known as
+"interpolation".(3) (*note Requests and Macros-Footnote-3::)
+Interpolations are handled as soon as they are recognized, and once
+performed, a 'roff' formatter scans the replacement for further
+requests, macro calls, and escape sequences.
+
+ In 'roff' systems, the 'de' request defines a macro.(4) (*note
+Requests and Macros-Footnote-4::)
+
+ .de DATE
+ 2020-11-14
+ ..
+
+The foregoing input produces no output by itself; all we have done is
+store some information. Observe the pair of dots that ends the macro
+definition. This is a default; you can specify your own terminator for
+the macro definition as the second argument to the 'de' request.
+
+ .de NAME ENDNAME
+ Heywood Jabuzzoff
+ .ENDNAME
+
+ In fact, the ending marker is itself the name of a macro to be
+called, or a request to be invoked, if it is defined at the time its
+control line is read.
+
+ .de END
+ Big Rip
+ ..
+ .de START END
+ Big Bang
+ .END
+ .START
+ => Big Rip Big Bang
+
+In the foregoing example, "Big Rip" printed before "Big Bang" because
+its macro was _called_ first. Consider what would happen if we dropped
+'END' from the '.de START' line and added '..' after '.END'. Would the
+order change?
+
+ Let us consider a more elaborate example.
+
+ .de DATE
+ 2020-10-05
+ ..
+ .
+ .de BOSS
+ D.\& Kruger,
+ J.\& Peterman
+ ..
+ .
+ .de NOTICE
+ Approved:
+ .DATE
+ by
+ .BOSS
+ ..
+ .
+ Insert tedious regulatory compliance paragraph here.
+
+ .NOTICE
+
+ Insert tedious liability disclaimer paragraph here.
+
+ .NOTICE
+ => Insert tedious regulatory compliance paragraph here.
+ =>
+ => Approved: 2020-10-05 by D. Kruger, J. Peterman
+ =>
+ => Insert tedious liability disclaimer paragraph here.
+ =>
+ => Approved: 2020-10-05 by D. Kruger, J. Peterman
+
+The above document started with a series of control lines. Three macros
+were defined, with a 'de' request declaring each macro's name, and the
+"body" of the macro starting on the next line and continuing until a
+line with two dots ''..'' marked its end. The text proper began only
+after the macros were defined; this is a common pattern. Only the
+'NOTICE' macro was called "directly" by the document; 'DATE' and 'BOSS'
+were called only by 'NOTICE' itself. Escape sequences were used in
+'BOSS', two levels of macro interpolation deep.
+
+ The advantage in typing and maintenance economy may not be obvious
+from such a short example, but imagine a much longer document with
+dozens of such paragraphs, each requiring a notice of managerial
+approval. Consider what must happen if you are in charge of generating
+a new version of such a document with a different date, for a different
+boss. With well-chosen macros, you only have to change each datum in
+one place.
+
+ In practice, we would probably use strings (*note Strings::) instead
+of macros for such simple interpolations; what is important here is to
+glimpse the potential of macros and the power of recursive
+interpolation.
+
+ We could have defined 'DATE' and 'BOSS' in the opposite order;
+perhaps less obviously, we could also have defined them _after_
+'NOTICE'. "Forward references" like this are acceptable because the
+body of a macro definition is not (completely) interpreted, but stored
+instead (*note Copy Mode::). While a macro is being defined (or
+appended to), requests are not interpreted and macros not interpolated,
+whereas some commonly used escape sequences _are_ interpreted. 'roff'
+systems also support recursive macro calls, as long as you have a way to
+break the recursion (*note Conditionals and Loops::). Maintainable
+'roff' documents tend to arrange macro definitions to minimize forward
+references.
+
+ (1) The '\<RET>' escape sequence can alter how an input line is
+classified; see *note Line Continuation::.
+
+ (2) Argument handling in macros is more flexible but also more
+complex. *Note Calling Macros::.
+
+ (3) Some escape sequences undergo interpolation as well.
+
+ (4) GNU 'troff' offers additional ones. *Note Writing Macros::.
+
+5.1.8 Macro Packages
+--------------------
+
+Macro definitions can be collected into "macro files", 'roff' input
+files designed to produce no output themselves but instead ease the
+preparation of other 'roff' documents. There is no syntactical
+difference between a macro file and any other 'roff' document; only its
+purpose distinguishes it. When a macro file is installed at a standard
+location and suitable for use by a general audience, it is often termed
+a "macro package".(1) (*note Macro Packages-Footnote-1::) Macro
+packages can be loaded by supplying the '-m' option to GNU 'troff' or a
+'groff' front end. Alternatively, a document requiring a macro package
+can load it with the 'mso' ("macro source") request.
+
+ (1) Macro files and packages frequently define registers and strings
+as well.
+
+5.1.9 Input Encodings
+---------------------
+
+The 'groff' command's '-k' option calls the 'preconv' preprocessor to
+perform input character encoding conversions. Input to the GNU 'troff'
+formatter itself, on the other hand, must be in one of two encodings it
+can recognize.
+
+'cp1047'
+ The code page 1047 input encoding works only on EBCDIC platforms
+ (and conversely, the other input encodings don't work with EBCDIC);
+ the file 'cp1047.tmac' is loaded at startup.
+
+'latin1'
+ ISO Latin-1, an encoding for Western European languages, is the
+ default input encoding on non-EBCDIC platforms; the file
+ 'latin1.tmac' is loaded at startup.
+
+Any document that is encoded in ISO 646:1991 (a descendant of USAS
+X3.4-1968 or "US-ASCII"), or, equivalently, uses only code points from
+the "C0 Controls" and "Basic Latin" parts of the Unicode character set
+is also a valid ISO Latin-1 document; the standards are interchangeable
+in their first 128 code points.(1) (*note Input Encodings-Footnote-1::)
+
+ Other encodings are supported by means of macro packages.
+
+'latin2'
+ To use ISO Latin-2, an encoding for Central and Eastern European
+ languages, invoke '.mso latin2.tmac' at the beginning of your
+ document or supply '-mlatin2' as a command-line argument to
+ 'groff'.
+
+'latin5'
+ To use ISO Latin-5, an encoding for the Turkish language, invoke
+ '.mso latin5.tmac' at the beginning of your document or supply
+ '-mlatin5' as a command-line argument to 'groff'.
+
+'latin9'
+ ISO Latin-9 succeeds Latin-1; it includes a Euro sign and better
+ glyph coverage for French. To use this encoding, invoke
+ '.mso latin9.tmac' at the beginning of your document or supply
+ '-mlatin9' as a command-line argument to 'groff'.
+
+ Some characters from an input encoding may not be available with a
+particular output driver, or their glyphs may not have representation in
+the font used. For terminal devices, fallbacks are defined, like 'EUR'
+for the Euro sign and '(C)' for the copyright sign. For typesetter
+devices, you may need to "mount" fonts that support glyphs required by
+the document. *Note Font Positions::.
+
+ Because a Euro glyph was not historically defined in PostScript
+fonts, 'groff' comes with a font called 'freeeuro.pfa' that provides the
+Euro in several styles. Standard PostScript fonts contain the glyphs
+from Latin-5 and Latin-9 that Latin-1 lacks, so these encodings are
+supported for the 'ps' and 'pdf' output devices as 'groff' ships, while
+Latin-2 is not.
+
+ Unicode supports characters from all other input encodings; the
+'utf8' output driver for terminals therefore does as well. The DVI
+output driver supports the Latin-2 and Latin-9 encodings if the
+command-line option '-mec' is used as well. (2) (*note Input
+Encodings-Footnote-2::)
+
+ (1) The _semantics_ of certain punctuation code points have gotten
+stricter with the successive standards, a cause of some frustration
+among man page writers; see the 'groff_char(7)' man page.
+
+ (2) The DVI output device defaults to using the Computer Modern (CM)
+fonts; 'ec.tmac' loads the EC fonts instead, which provide Euro '\[Eu]'
+and per mille '\[%0]' glyphs.
+
+5.1.10 Input Conventions
+------------------------
+
+Since GNU 'troff' fills text automatically, it is common practice in the
+'roff' language to avoid visual composition of text in input files: the
+esthetic appeal of the formatted output is what matters. Therefore,
+'roff' input should be arranged such that it is easy for authors and
+maintainers to compose and develop the document, understand the syntax
+of 'roff' requests, macro calls, and preprocessor languages used, and
+predict the behavior of the formatter. Several traditions have accrued
+in service of these goals.
+
+ * Follow sentence endings in the input with newlines to ease their
+ recognition (*note Sentences::). It is frequently convenient to
+ end text lines after colons and semicolons as well, as these
+ typically precede independent clauses. Consider doing so after
+ commas; they often occur in lists that become easy to scan when
+ itemized by line, or constitute supplements to the sentence that
+ are added, deleted, or updated to clarify it. Parenthetical and
+ quoted phrases are also good candidates for placement on text lines
+ by themselves.
+
+ * Set your text editor's line length to 72 characters or fewer.(1)
+ (*note Input Conventions-Footnote-1::) This limit, combined with
+ the previous item of advice, makes it less common that an input
+ line will wrap in your text editor, and thus will help you perceive
+ excessively long constructions in your text. Recall that natural
+ languages originate in speech, not writing, and that punctuation is
+ correlated with pauses for breathing and changes in prosody.
+
+ * Use '\&' after '!', '?', and '.' if they are followed by space,
+ tab, or newline characters and don't end a sentence.
+
+ * In filled text lines, use '\&' before '.' and ''' if they are
+ preceded by space, so that reflowing the input doesn't turn them
+ into control lines.
+
+ * Do not use spaces to perform indentation or align columns of a
+ table. Leading spaces are reliable when text is not being filled.
+
+ * Comment your document. It is never too soon to apply comments to
+ record information of use to future document maintainers (including
+ your future self). We thus introduce another escape sequence,
+ '\"', which causes GNU 'troff' to ignore the remainder of the input
+ line.
+
+ * Use the empty request--a control character followed immediately by
+ a newline--to visually manage separation of material in input
+ files. Many of the 'groff' project's own documents use an empty
+ request between sentences, after macro definitions, and where a
+ break is expected, and two empty requests between paragraphs or
+ other requests or macro calls that will introduce vertical space
+ into the document.
+
+ You can combine the empty request with the comment escape sequence
+ to include whole-line comments in your document, and even "comment
+ out" sections of it.
+
+ We conclude this section with an example sufficiently long to
+illustrate most of the above suggestions in practice. For the purpose
+of fitting the example between the margins of this manual with the font
+used for its typeset version, we have shortened the input line length to
+56 columns. As before, an arrow -> indicates a tab character.
+
+ .\" nroff this_file.roff | less
+ .\" groff -T ps this_file.roff > this_file.ps
+ ->The theory of relativity is intimately connected with
+ the theory of space and time.
+ .
+ I shall therefore begin with a brief investigation of
+ the origin of our ideas of space and time,
+ although in doing so I know that I introduce a
+ controversial subject. \" remainder of paragraph elided
+ .
+ .
+
+ ->The experiences of an individual appear to us arranged
+ in a series of events;
+ in this series the single events which we remember
+ appear to be ordered according to the criterion of
+ \[lq]earlier\[rq] and \[lq]later\[rq], \" punct swapped
+ which cannot be analysed further.
+ .
+ There exists,
+ therefore,
+ for the individual,
+ an I-time,
+ or subjective time.
+ .
+ This itself is not measurable.
+ .
+ I can,
+ indeed,
+ associate numbers with the events,
+ in such a way that the greater number is associated with
+ the later event than with an earlier one;
+ but the nature of this association may be quite
+ arbitrary.
+ .
+ This association I can define by means of a clock by
+ comparing the order of events furnished by the clock
+ with the order of a given series of events.
+ .
+ We understand by a clock something which provides a
+ series of events which can be counted,
+ and which has other properties of which we shall speak
+ later.
+ .\" Albert Einstein, _The Meaning of Relativity_, 1922
+
+ (1) Emacs: 'fill-column: 72'; Vim: 'textwidth=72'
+
+5.2 Page Geometry
+=================
+
+'roff' systems format text under certain assumptions about the size of
+the output medium, or page. For the formatter to correctly break a line
+it is filling, it must know the line length, which it derives from the
+page width (*note Line Layout::). For it to decide whether to write an
+output line to the current page or wait until the next one, it must know
+the page length (*note Page Layout::).
+
+ A device's "resolution" converts practical units like inches or
+centimeters to "basic units", a convenient length measure for the output
+device or file format. The formatter and output driver use basic units
+to reckon page measurements. The device description file defines its
+resolution and page dimensions (*note DESC File Format::).
+
+ A "page" is a two-dimensional structure upon which a 'roff' system
+imposes a rectangular coordinate system with its upper left corner as
+the origin. Coordinate values are in basic units and increase down and
+to the right. Useful ones are therefore always positive and within
+numeric ranges corresponding to the page boundaries.
+
+ While the formatter (and, later, output driver) is processing a page,
+it keeps track of its "drawing position", which is the location at which
+the next glyph will be written, from which the next motion will be
+measured, or where a geometric object will commence rendering.
+Notionally, glyphs are drawn from the text baseline upward and to the
+right.(1) (*note Page Geometry-Footnote-1::) The "text baseline" is a
+(usually invisible) line upon which the glyphs of a typeface are
+aligned. A glyph therefore "starts" at its bottom-left corner. If
+drawn at the origin, a typical letter glyph would lie partially or
+wholly off the page, depending on whether, like "g", it features a
+descender below the baseline.
+
+ Such a situation is nearly always undesirable. It is furthermore
+conventional not to write or draw at the extreme edges of the page.
+Therefore the initial drawing position of a 'roff' formatter is not at
+the origin, but below and to the right of it. This rightward shift from
+the left edge is known as the "page offset".(2) (*note Page
+Geometry-Footnote-2::) The downward shift leaves room for a text output
+line.
+
+ Text is arranged on a one-dimensional lattice of text baselines from
+the top to the bottom of the page. "Vertical spacing" is the distance
+between adjacent text baselines. Typographic tradition sets this
+quantity to 120% of the type size. The initial drawing position is one
+unit of vertical spacing below the page top. Typographers term this
+unit a vee.
+
+ Vertical spacing has an impact on page-breaking decisions.
+Generally, when a break occurs, the formatter moves the drawing position
+to the next text baseline automatically. If the formatter were already
+writing to the last line that would fit on the page, advancing by one
+vee would place the next text baseline off the page. Rather than let
+that happen, 'roff' formatters instruct the output driver to eject the
+page, start a new one, and again set the drawing position to one vee
+below the page top; this is a "page break".
+
+ When the last line of input text corresponds to the last output line
+that fits on the page, the break caused by the end of input will also
+break the page, producing a useless blank one. Macro packages keep
+users from having to confront this difficulty by setting "traps" (*note
+Traps::); moreover, all but the simplest page layouts tend to have
+headers and footers, or at least bear vertical margins larger than one
+vee.
+
+ (1) 'groff' does not yet support right-to-left scripts.
+
+ (2) 'groff''s terminal output devices have page offsets of zero.
+
+5.3 Measurements
+================
+
+The formatter sometimes requires the input of numeric parameters to
+specify measurements. These are specified as integers or decimal
+fractions with an optional "scaling unit" suffixed. A scaling unit is a
+letter that immediately follows the last digit of a number. Digits
+after the decimal point are optional. Measurement expressions include
+'10.5p', '11i', and '3.c'.
+
+ Measurements are scaled by the scaling unit and stored internally
+(with any fractional part discarded) in basic units. The device
+resolution can therefore be obtained by storing a value of '1i' to a
+register. The only constraint on the basic unit is that it is at least
+as small as any other unit.
+
+'u'
+ Basic unit.
+
+'i'
+ Inch; defined as 2.54 centimeters.
+
+'c'
+ Centimeter; a centimeter is about 0.3937 inches.
+
+'p'
+ Point; a typesetter's unit used for measuring type size. There are
+ 72 points to an inch.
+
+'P'
+ Pica; another typesetter's unit. There are 6 picas to an inch and
+ 12 points to a pica.
+
+'s'
+'z'
+ *Note Using Fractional Type Sizes::, for a discussion of these
+ units.
+
+'f'
+ GNU 'troff' defines this unit to scale decimal fractions in the
+ interval [0, 1] to 16-bit unsigned integers. It multiplies a
+ quantity by 65,536. *Note Colors::, for usage.
+
+ The magnitudes of other scaling units depend on the text formatting
+parameters in effect. These are useful when specifying measurements
+that need to scale with the typeface or vertical spacing.
+
+'m'
+ Em; an em is equal to the current type size in points. It is named
+ thus because it is approximately the width of the letter 'M'.
+
+'n'
+ En; an en is one-half em.
+
+'v'
+ Vee; recall *note Page Geometry::.
+
+'M'
+ Hundredth of an em.
+
+5.3.1 Motion Quanta
+-------------------
+
+An output device's basic unit 'u' is not necessarily its smallest
+addressable length; 'u' can be smaller to avoid problems with integer
+roundoff. The minimum distances that a device can work with in the
+horizontal and vertical directions are termed its "motion quanta".
+Measurements are rounded to applicable motion quanta. Half-quantum
+fractions round toward zero.
+
+ -- Register: \n[.H]
+ -- Register: \n[.V]
+ These read-only registers interpolate the horizontal and vertical
+ motion quanta, respectively, of the output device in basic units.
+
+ For example, we might draw short baseline rules on a terminal device
+as follows. *Note Drawing Geometric Objects::.
+
+ .tm \n[.H]
+ error-> 24
+ .nf
+ \l'36u' 36u
+ \l'37u' 37u
+ => _ 36u
+ => __ 37u
+
+5.3.2 Default Units
+-------------------
+
+A general-purpose register (one created or updated with the 'nr'
+request; see *note Registers::) is implicitly dimensionless, or reckoned
+in basic units if interpreted in a measurement context. But it is
+convenient for many requests and escape sequences to infer a scaling
+unit for an argument if none is specified. An explicit scaling unit
+(not after a closing parenthesis) can override an undesirable default.
+Effectively, the default unit is suffixed to the expression if a scaling
+unit is not already present. GNU 'troff''s use of integer arithmetic
+should also be kept in mind (*note Numeric Expressions::).
+
+ The 'll' request interprets its argument in ems by default. Consider
+several attempts to set a line length of 3.5 inches when the type size
+is 10 points on a terminal device with a resolution of 240 basic units
+and horizontal motion quantum of 24. Some expressions become zero; the
+request clamps them to that quantum.
+
+ .ll 3.5i \" 3.5i (= 840u)
+ .ll 7/2 \" 7u/2u -> 3u -> 3m -> 0, clamped to 24u
+ .ll (7 / 2)u \" 7u/2u -> as above
+ .ll 7/2i \" 7u/2i -> 7u/480u -> 0 -> as above
+ .ll 7i/2 \" 7i/2u -> 1680u/2m -> 1680u/24u -> 35u
+ .ll 7i/2u \" 3.5i (= 840u)
+
+The safest way to specify measurements is to attach a scaling unit. To
+multiply or divide by a dimensionless quantity, use 'u' as its scaling
+unit.
+
+5.4 Numeric Expressions
+=======================
+
+A "numeric expression" evaluates to an integer: it can be as simple as a
+literal '0' or it can be a complex sequence of register and string
+interpolations interleaved with measurements and operators.
+
+ GNU 'troff' provides a set of mathematical and logical operators
+familiar to programmers--as well as some unusual ones--but supports only
+integer arithmetic.(1) (*note Numeric Expressions-Footnote-1::) The
+internal data type used for computing results is usually a 32-bit signed
+integer, which suffices to represent magnitudes within a range of ±2
+billion.(2) (*note Numeric Expressions-Footnote-2::)
+
+ Arithmetic infix operators perform a function on the numeric
+expressions to their left and right; they are '+' (addition), '-'
+(subtraction), '*' (multiplication), '/' (truncating division), and '%'
+(modulus). "Truncating division" rounds to the integer nearer to zero,
+no matter how large the fractional portion. Overflow and division (or
+modulus) by zero are errors and abort evaluation of a numeric
+expression.
+
+ Arithmetic unary operators operate on the numeric expression to their
+right; they are '-' (negation) and '+' (assertion--for completeness; it
+does nothing). The unary minus must often be used with parentheses to
+avoid confusion with the decrementation operator, discussed below.
+
+ Observe the rounding behavior and effect of negative operands on the
+modulus and truncating division operators.
+
+ .nr T 199/100
+ .nr U 5/2
+ .nr V (-5)/2
+ .nr W 5/-2
+ .nr X 5%2
+ .nr Y (-5)%2
+ .nr Z 5%-2
+ T=\n[T] U=\n[U] V=\n[V] W=\n[W] X=\n[X] Y=\n[Y] Z=\n[Z]
+ => T=1 U=2 V=-2 W=-2 X=1 Y=-1 Z=1
+
+The sign of the modulus of operands of mixed signs is determined by the
+sign of the first. Division and modulus operators satisfy the following
+property: given a dividend A and a divisor B, a quotient Q formed by '(a
+/ b)' and a remainder R by '(a % b)', then qb + r = a.
+
+ GNU 'troff''s scaling operator, used with parentheses as '(C;E)',
+evaluates a numeric expression E using C as the default scaling unit.
+If C is omitted, scaling units are ignored in the evaluation of E. This
+operator can save typing by avoiding the attachment of scaling units to
+every operand out of caution. Your macros can select a sensible default
+unit in case the user neglects to supply one.
+
+ .\" Indent by amount given in first argument; assume ens.
+ .de Indent
+ . in (n;\\$1)
+ ..
+
+Without the scaling operator, the foregoing macro would, if called with
+a unitless argument, cause indentation by the 'in' request's default
+scaling unit (ems). The result would be twice as much indentation as
+expected.
+
+ GNU 'troff' also provides a pair of operators to compute the extrema
+of two operands: '>?' (maximum) and '<?' (minimum).
+
+ .nr slots 5
+ .nr candidates 3
+ .nr salaries (\n[slots] <? \n[candidates])
+ Looks like we'll end up paying \n[salaries] salaries.
+ => Looks like we'll end up paying 3 salaries.
+
+ Comparison operators comprise '<' (less than), '>' (greater than),
+'<=' (less than or equal), '>=' (greater than or equal), and '='
+(equal). '==' is a synonym for '='. When evaluated, a comparison is
+replaced with '0' if it is false and '1' if true. In the 'roff'
+language, positive values are true, others false.
+
+ We can operate on truth values with the logical operators '&'
+(logical conjunction or "and") and ':' (logical disjunction or "or").
+They evaluate as comparison operators do.
+
+ A logical complementation ("not") operator, '!', works only within
+'if', 'ie', and 'while' requests. Furthermore, '!' is recognized only
+at the beginning of a numeric expression not contained by another
+numeric expression. In other words, it must be the "outermost"
+operator. Including it elsewhere in the expression produces a warning
+in the 'number' category (*note Warnings::), and its expression
+evaluates false. This unfortunate limitation maintains compatibility
+with AT&T 'troff'. Test a numeric expression for falsity by comparing
+it to a false value.(3) (*note Numeric Expressions-Footnote-3::)
+
+ .nr X 1
+ .nr Y 0
+ .\" This does not work as expected.
+ .if (\n[X])&(!\n[Y]) .nop A: X is true, Y is false
+ .
+ .\" Use this construct instead.
+ .if (\n[X])&(\n[Y]<=0) .nop B: X is true, Y is false
+ error-> warning: expected numeric expression, got '!'
+ => B: X is true, Y is false
+
+ The 'roff' language has no operator precedence: expressions are
+evaluated strictly from left to right, in contrast to schoolhouse
+arithmetic. Use parentheses '(' ')' to impose a desired precedence upon
+subexpressions.
+
+ .nr X 3+5*4
+ .nr Y (3+5)*4
+ .nr Z 3+(5*4)
+ X=\n[X] Y=\n[Y] Z=\n[Z]
+ => X=32 Y=32 Z=23
+
+ For many requests and escape sequences that cause motion on the page,
+the unary operators '+' and '-' work differently when leading a numeric
+expression. They then indicate a motion relative to the drawing
+position: positive is down in vertical contexts, right in horizontal
+ones.
+
+ '+' and '-' are also treated differently by the following requests
+and escape sequences: 'bp', 'in', 'll', 'lt', 'nm', 'nr', 'pl', 'pn',
+'po', 'ps', 'pvs', 'rt', 'ti', '\H', '\R', and '\s'. Here, leading plus
+and minus signs serve as incrementation and decrementation operators,
+respectively. To negate an expression, subtract it from zero or include
+the unary minus in parentheses with its argument. *Note Setting
+Registers::, for examples.
+
+ A leading '|' operator indicates a motion relative not to the drawing
+position but to a boundary. For horizontal motions, the measurement
+specifies a distance relative to a drawing position corresponding to the
+beginning of the _input_ line. By default, tab stops reckon movements
+in this way. Most escape sequences do not; '|' tells them to do so.
+
+ Mind the \h'1.2i'gap.
+ .br
+ Mind the \h'|1.2i'gap.
+ .br
+ Mind the
+ \h'|1.2i'gap.
+ => Mind the gap.
+ => Mind the gap.
+ => Mind the gap.
+
+ One use of this feature is to define macros whose scope is limited to
+the output they format.
+
+ .\" underline word $1 with trailing punctuation $2
+ .de Underline
+ . nop \\$1\l'|0\[ul]'\\$2
+ ..
+ Typographical emphasis is best used
+ .Underline sparingly .
+
+In the above example, '|0' specifies a negative motion from the current
+position (at the end of the argument just emitted, '\$1') to the
+beginning of the input line. Thus, the '\l' escape sequence in this
+case draws a line from right to left. A macro call occurs at the
+beginning of an input line;(4) (*note Numeric Expressions-Footnote-4::)
+if the '|' operator were omitted, then the underline would be drawn at
+zero distance from the current position, producing device-dependent, and
+likely undesirable, results. On the 'ps' output device, it underlines
+the period.
+
+ For vertical motions, the '|' operator specifies a distance from the
+first text baseline on the page or in the current diversion,(5) (*note
+Numeric Expressions-Footnote-5::) using the current vertical spacing.
+
+ A
+ .br
+ B \Z'C'\v'|0'D
+ => A D
+ => B C
+
+ In the foregoing example, we've used the '\Z' escape sequence (*note
+Page Motions::) to restore the drawing position after formatting 'C',
+then moved vertically to the first text baseline on the page.
+
+ -- Escape sequence: \B'anything'
+ Interpolate 1 if ANYTHING is a valid numeric expression, and 0
+ otherwise. The delimiter need not be a neutral apostrophe; see
+ *note Delimiters::.
+
+ You might use '\B' along with the 'if' request to filter out invalid
+macro or string arguments. *Note Conditionals and Loops::.
+
+ .\" Indent by amount given in first argument; assume ens.
+ .de Indent
+ . if \B'\\$1' .in (n;\\$1)
+ ..
+
+ A register interpolated as an operand in a numeric expression must
+have an Arabic format; luckily, this is the default. *Note Assigning
+Register Formats::.
+
+ Because spaces separate arguments to requests, spaces are not allowed
+in numeric expressions unless the (sub)expression containing them is
+surrounded by parentheses. *Note Invoking Requests::, and *note
+Conditionals and Loops::.
+
+ .nf
+ .nr a 1+2 + 2+1
+ \na
+ error-> expected numeric expression, got a space
+ => 3
+ .nr a 1+(2 + 2)+1
+ \na
+ => 6
+
+ The 'nr' request (*note Setting Registers::) expects its second and
+optional third arguments to be numeric expressions; a bare '+' does not
+qualify, so our first attempt got a warning.
+
+ (1) Provision is made for interpreting and reporting decimal
+fractions in certain cases.
+
+ (2) If that's not enough, see the 'groff_tmac(5)' man page for the
+'62bit.tmac' macro package.
+
+ (3) *Note Conditionals and Loops::.
+
+ (4) Control structure syntax creates an exception to this rule, but
+is designed to remain useful: recalling our example, '.if 1 .Underline
+this' would underline only "this", precisely. *Note Conditionals and
+Loops::.
+
+ (5) *Note Diversions::.
+
+5.5 Identifiers
+===============
+
+An "identifier" labels a GNU 'troff' datum such as a register, name
+(macro, string, or diversion), typeface, color, special character,
+character class, environment, or stream. Valid identifiers consist of
+one or more ordinary characters. An ordinary character is an input
+character that is not the escape character, a leader, tab, newline, or
+invalid as GNU 'troff' input.
+
+ Invalid input characters are a subset of control characters (from the
+sets "C0 Controls" and "C1 Controls" as Unicode describes them). When
+GNU 'troff' encounters one in an identifier, it produces a warning in
+category 'input' (*note Warnings::). They are removed during
+interpretation: an identifier 'foo', followed by an invalid character
+and then 'bar', is processed as 'foobar'.
+
+ On a machine using the ISO 646, 8859, or 10646 character encodings,
+invalid input characters are '0x00', '0x08', '0x0B', '0x0D'-'0x1F', and
+'0x80'-'0x9F'. On an EBCDIC host, they are '0x00'-'0x01', '0x08',
+'0x09', '0x0B', '0x0D'-'0x14', '0x17'-'0x1F', and '0x30'-'0x3F'.(1)
+(*note Identifiers-Footnote-1::) Some of these code points are used by
+GNU 'troff' internally, making it non-trivial to extend the program to
+accept UTF-8 or other encodings that use characters from these
+ranges.(2) (*note Identifiers-Footnote-2::)
+
+ Thus, the identifiers 'br', 'PP', 'end-list', 'ref*normal-print',
+'|', '@_', and '!"#$%'()*+,-./' are all valid. Discretion should be
+exercised to prevent confusion. Identifiers starting with '(' or '['
+require care.
+
+ .nr x 9
+ .nr y 1
+ .nr (x 2
+ .nr [y 3
+ .nr sum1 (\n(x + \n[y])
+ error-> a space character is not allowed in an escape
+ error-> sequence parameter
+ A:2+3=\n[sum1]
+ .nr sum2 (\n((x + \n[[y])
+ B:2+3=\n[sum2]
+ .nr sum3 (\n[(x] + \n([y)
+ C:2+3=\n[sum3]
+ => A:2+3=1 B:2+3=5 C:2+3=5
+
+An identifier with a closing bracket (']') in its name can't be accessed
+with bracket-form escape sequences that expect an identifier as a
+parameter. For example, '\[foo]]' accesses the glyph 'foo', followed by
+']' in whatever the surrounding context is, whereas '\C'foo]'' formats a
+glyph named 'foo]'. Similarly, the identifier '(' can't be interpolated
+_except_ with bracket forms.
+
+ If you begin a macro, string, or diversion name with either of the
+characters '[' or ']', you foreclose use of the 'grefer' preprocessor,
+which recognizes '.[' and '.]' as bibliographic reference delimiters.
+
+ -- Escape sequence: \A'anything'
+ Interpolate 1 if ANYTHING is a valid identifier, and 0 otherwise.
+ The delimiter need not be a neutral apostrophe; see *note
+ Delimiters::. Because invalid input characters are removed (see
+ above), invalid identifiers are empty or contain spaces, tabs, or
+ newlines.
+
+ You can employ '\A' to validate a macro argument before using it to
+ construct another escape sequence or identifier.
+
+ .\" usage: .init-coordinate-pair name val1 val2
+ .\" Create a coordinate pair where name!x=val1 and
+ .\" name!y=val2.
+ .de init-coordinate-pair
+ . if \A'\\$1' \{\
+ . if \B'\\$2' .nr \\$1!x \\$2
+ . if \B'\\$3' .nr \\$1!y \\$3
+ . \}
+ ..
+ .init-coordinate-pair center 5 10
+ The center is at (\n[center!x], \n[center!y]).
+ .init-coordinate-pair "poi->nt" trash garbage \" ignored
+ .init-coordinate-pair point trash garbage \" ignored
+ => The center is at (5, 10).
+
+ In this example, we also validated the numeric arguments; the
+ registers 'point!x' and 'point!y' remain undefined. *Note Numeric
+ Expressions:: for the '\B' escape sequence.
+
+ How GNU 'troff' handles the interpretation of an undefined identifier
+depends on the context. There is no way to invoke an undefined request;
+such syntax is interpreted as a macro call instead. If the identifier
+is interpreted as a string, macro, or diversion, GNU 'troff' emits a
+warning in category 'mac', defines it as empty, and interpolates
+nothing. If the identifier is interpreted as a register, GNU 'troff'
+emits a warning in category 'reg', initializes it to zero, and
+interpolates that value. *Note Warnings::, *note Interpolating
+Registers::, and *note Strings::. Attempting to use an undefined
+typeface, special character, color, character class, environment, or
+stream generally provokes an error diagnostic.
+
+ Identifiers for requests, macros, strings, and diversions share one
+name space; special characters and character classes another. No other
+object types do.
+
+ .de xxx
+ . nop foo
+ ..
+ .di xxx
+ bar
+ .br
+ .di
+ .
+ .xxx
+ => bar
+
+The foregoing example shows that GNU 'troff' reuses the identifier
+'xxx', changing it from a macro to a diversion. No warning is emitted,
+and the previous contents of 'xxx' are lost.
+
+ (1) Historically, control characters like ASCII STX, ETX, and BEL
+(<Control+B>, <Control+C>, and <Control+G>) have been observed in 'roff'
+documents, particularly in macro packages employing them as delimiters
+with the output comparison operator to try to avoid collisions with the
+content of arbitrary user-supplied parameters (*note Operators in
+Conditionals::). We discourage this expedient; in GNU 'troff' it is
+unnecessary (outside of compatibility mode) because delimited arguments
+are parsed at a different input level than the surrounding context.
+*Note Implementation Differences::.
+
+ (2) Consider what happens when a C1 control '0x80'-'0x9F' is
+necessary as a continuation byte in a UTF-8 sequence.
+
+5.6 Formatter Instructions
+==========================
+
+To support documents that require more than filling, automatic line
+breaking and hyphenation, adjustment, and supplemental inter-sentence
+space, the 'roff' language offers two means of embedding instructions to
+the formatter.
+
+ One is a "request", which begins with a control character and takes
+up the remainder of the input line. Requests often perform relatively
+large-scale operations such as setting the page length, breaking the
+line, or starting a new page. They also conduct internal operations
+like defining macros.
+
+ The other is an "escape sequence", which begins with the escape
+character and can be embedded anywhere in the input, even in arguments
+to requests and other escape sequences. Escape sequences interpolate
+special characters, strings, or registers, and handle comparatively
+minor formatting tasks like sub- and superscripting.
+
+ Some operations, such as font selection and type size alteration, are
+available via both requests and escape sequences.
+
+5.6.1 Control Characters
+------------------------
+
+The mechanism of using 'roff''s control characters to invoke requests
+and call macros was introduced in *note Requests and Macros::. Control
+characters are recognized only at the beginning of an input line, or at
+the beginning of the branch of a control structure request; see *note
+Conditionals and Loops::.
+
+ A few requests cause a break implicitly; use the no-break control
+character to prevent the break. Break suppression is its sole
+behavioral distinction. Employing the no-break control character to
+invoke requests that don't cause breaks is harmless but poor style.
+*Note Manipulating Filling and Adjustment::.
+
+ The control '.' and no-break control ''' characters can each be
+changed to any ordinary character(1) (*note Control
+Characters-Footnote-1::) with the 'cc' and 'c2' requests, respectively.
+
+ -- Request: .cc [o]
+ Recognize the ordinary character O as the control character. If O
+ is absent or invalid, the default control character '.' is
+ selected. The identity of the control character is associated with
+ the environment (*note Environments::).
+
+ -- Request: .c2 [o]
+ Recognize the ordinary character O as the no-break control
+ character. If O is absent or invalid, the default no-break control
+ character ''' is selected. The identity of the no-break control
+ character is associated with the environment (*note
+ Environments::).
+
+ When writing a macro, you might wish to know which control character
+was used to call it.
+
+ -- Register: \n[.br]
+ This read-only register interpolates 1 if the currently executing
+ macro was called using the normal control character and 0
+ otherwise. If a macro is interpolated as a string, the '.br'
+ register's value is inherited from the context of the string
+ interpolation. *Note Strings::.
+
+ Use this register to reliably intercept requests that imply breaks.
+
+ .als bp*orig bp
+ .de bp
+ . ie \\n[.br] .bp*orig
+ . el 'bp*orig
+ ..
+
+ Testing the '.br' register outside of a macro definition makes no
+ sense.
+
+ (1) Recall *note Identifiers::.
+
+5.6.2 Invoking Requests
+-----------------------
+
+A control character is optionally followed by tabs and/or spaces and
+then an identifier naming a request or macro. The invocation of an
+unrecognized request is interpreted as a macro call. Defining a macro
+with the same name as a request replaces the request. Deleting a
+request name with the 'rm' request makes it unavailable. The 'als'
+request can alias requests, permitting them to be wrapped or
+non-destructively replaced. *Note Strings::.
+
+ There is no inherent limit on argument length or quantity. Most
+requests take one or more arguments, and ignore any they do not expect.
+A request may be separated from its arguments by tabs or spaces, but
+only spaces can separate an argument from its successor. Only one
+between arguments is necessary; any excess is ignored. GNU 'troff' does
+not allow tabs for argument separation.(1) (*note Invoking
+Requests-Footnote-1::)
+
+ Generally, a space _within_ a request argument is not relevant, not
+meaningful, or is supported by bespoke provisions, as with the 'tl'
+request's delimiters (*note Page Layout::). Some requests, like 'ds',
+interpret the remainder of the control line as a single argument. *Note
+Strings::.
+
+ Spaces and tabs immediately after a control character are ignored.
+Commonly, authors structure the source of documents or macro files with
+them.
+
+ .de center
+ . if \\n[.br] \
+ . br
+ . ce \\$1
+ ..
+ .
+ .
+ .de right-align
+ .->if \\n[.br] \
+ .->->br
+ .->rj \\$1
+ ..
+
+ If you assign an empty blank line trap, you can separate macro
+definitions (or any input lines) with blank lines.
+
+ .de do-nothing
+ ..
+ .blm do-nothing \" activate blank line trap
+
+ .de center
+ . if \\n[.br] \
+ . br
+ . ce \\$1
+ ..
+
+
+ .de right-align
+ .->if \\n[.br] \
+ .->->br
+ .->rj \\$1
+ ..
+
+ .blm \" deactivate blank line trap
+
+ *Note Blank Line Traps::.
+
+ (1) In compatibility mode, a space is not necessary after a request
+or macro name of two characters' length. Also, Plan 9 'troff' allows
+tabs to separate arguments.
+
+5.6.3 Calling Macros
+--------------------
+
+If a macro of the desired name does not exist when called, it is
+created, assigned an empty definition, and a warning in category 'mac'
+is emitted. Calling an undefined macro _does_ end a macro definition
+naming it as its end macro (*note Writing Macros::).
+
+ To embed spaces _within_ a macro argument, enclose the argument in
+neutral double quotes '"'. Horizontal motion escape sequences are
+sometimes a better choice for arguments to be formatted as text.
+
+ Consider calls to a hypothetical section heading macro 'uh'.
+
+ .uh The Mouse Problem
+ .uh "The Mouse Problem"
+ .uh The\~Mouse\~Problem
+ .uh The\ Mouse\ Problem
+
+The first line calls 'uh' with three arguments: 'The', 'Mouse', and
+'Problem'. The remainder call the 'uh' macro with one argument, 'The
+Mouse Problem'. The last solution, using escaped spaces, can be found
+in documents prepared for AT&T 'troff'. It can cause surprise when text
+is adjusted, because '\<SP>' inserts a _fixed-width_, non-breaking
+space. GNU 'troff''s '\~' escape sequence inserts an adjustable,
+non-breaking space.(1) (*note Calling Macros-Footnote-1::)
+
+ The foregoing raises the question of how to embed neutral double
+quotes or backslashes in macro arguments when _those_ characters are
+desired as literals. In GNU 'troff', the special character escape
+sequence '\[rs]' produces a backslash and '\[dq]' a neutral double
+quote.
+
+ In GNU 'troff''s AT&T compatibility mode, these characters remain
+available as '\(rs' and '\(dq', respectively. AT&T 'troff' did not
+consistently define these special characters, but its descendants can be
+made to support them. *Note Device and Font Description Files::.
+
+ If even that is not feasible, options remain. To obtain a literal
+escape character in a macro argument, you can simply type it if you
+change or disable the escape character first. *Note Using Escape
+Sequences::. Otherwise, you must escape the escape character repeatedly
+to a context-dependent extent. *Note Copy Mode::.
+
+ For the (neutral) double quote, you have recourse to an obscure
+syntactical feature of AT&T 'troff'. Because a double quote can begin a
+macro argument, the formatter keeps track of whether the current
+argument was started thus, and doesn't require a space after the double
+quote that ends it.(2) (*note Calling Macros-Footnote-2::) In the
+argument list to a macro, a double quote that _isn't_ preceded by a
+space _doesn't_ start a macro argument. If not preceded by a double
+quote that began an argument, this double quote becomes part of the
+argument. Furthermore, within a quoted argument, a pair of adjacent
+double quotes becomes a literal double quote.
+
+ .de eq
+ . tm arg1:\\$1 arg2:\\$2 arg3:\\$3
+ . tm arg4:\\$4 arg5:\\$5 arg6:\\$6
+ .. \" 4 backslashes on the next line
+ .eq a" "b c" "de"f\\\\g" h""i "j""k"
+ error-> arg1:a" arg2:b c arg3:de
+ error-> arg4:f\g" arg5:h""i arg6:j"k
+
+ Apart from the complexity of the rules, this traditional solution has
+the disadvantage that double quotes don't survive repeated argument
+expansion in AT&T 'troff' or GNU 'troff''s compatibility mode. This can
+frustrate efforts to pass such arguments intact through multiple macro
+calls.
+
+ .cp 1
+ .de eq
+ . tm arg1:\\$1 arg2:\\$2 arg3:\\$3
+ . tm arg4:\\$4 arg5:\\$5 arg6:\\$6
+ ..
+ .de xe
+ . eq \\$1 \\$2 \\$3 \\$4 \\$5 \\$6
+ .. \" 8 backslashes on the next line
+ .xe a" "b c" "de"f\\\\\\\\g" h""i "j""k"
+ error-> arg1:a" arg2:b arg3:c
+ error-> arg4:de arg5:f\g" arg6:h""i
+
+ Outside of compatibility mode, GNU 'troff' doesn't exhibit this
+problem because it tracks the nesting depth of interpolations. *Note
+Implementation Differences::.
+
+ (1) '\~' is fairly portable; see *note Other Differences::.
+
+ (2) Strictly, you can neglect to close the last quoted macro
+argument, relying on the end of the control line to do so. We consider
+this lethargic practice poor style.
+
+5.6.4 Using Escape Sequences
+----------------------------
+
+Whereas requests must occur on control lines, escape sequences can occur
+intermixed with text and may appear in arguments to requests, macros,
+and other escape sequences. An escape sequence is introduced by the
+escape character, a backslash '\' (but see the 'ec' request below). The
+next character selects the escape's function.
+
+ Escape sequences vary in length. Some take an argument, and of
+those, some have different syntactical forms for a one-character,
+two-character, or arbitrary-length argument. Others accept _only_ an
+arbitrary-length argument. In the former scheme, a one-character
+argument follows the function character immediately, an opening
+parenthesis '(' introduces a two-character argument (no closing
+parenthesis is used), and an argument of arbitrary length is enclosed in
+brackets '[]'. In the latter scheme, the user selects a delimiter
+character. A few escape sequences are idiosyncratic, and support both
+of the foregoing conventions ('\s'), designate their own termination
+sequence ('\?'), consume input until the next newline ('\!', '\"',
+'\#'), or support an additional modifier character ('\s' again, and
+'\n'). As with requests, use of some escape sequences in source
+documents may interact poorly with a macro package you use; consult its
+documentation to learn of "safe" sequences or alternative facilities it
+provides to achieve the desired result.
+
+ If an escape character is followed by a character that does not
+identify a defined operation, the escape character is ignored (producing
+a diagnostic of the 'escape' warning category, which is not enabled by
+default) and the following character is processed normally.
+
+ $ groff -Tps -ww
+ .nr N 12
+ .ds co white
+ .ds animal elephant
+ I have \fI\nN \*(co \*[animal]s,\f[]
+ said \P.\&\~Pseudo Pachyderm.
+ error-> warning: escape character ignored before 'P'
+ => I have 12 white elephants, said P. Pseudo Pachyderm.
+
+ Escape sequence interpolation is of higher precedence than escape
+sequence argument interpretation. This rule affords flexibility in
+using escape sequences to construct parameters to other escape
+sequences.
+
+ .ds family C\" Courier
+ .ds style I\" oblique
+ Choice a typeface \f(\*[family]\*[style]wisely.
+ => Choose a typeface wisely.
+
+In the above, the syntax form '\f(' accepts only two characters for an
+argument; the example works because the subsequent escape sequences are
+interpolated before the selection escape sequence argument is processed,
+and strings 'family' and 'style' interpolate one character each.(1)
+(*note Using Escape Sequences-Footnote-1::)
+
+ The escape character is nearly always interpreted when encountered;
+it is therefore desirable to have a way to interpolate it, disable it,
+or change it.
+
+ -- Escape sequence: \e
+ Interpolate the escape character.
+
+ The '\[rs]' special character escape sequence formats a backslash
+glyph. In macro and string definitions, the input sequences '\\' and
+'\E' defer interpretation of escape sequences. *Note Copy Mode::.
+
+ -- Request: .eo
+ Disable the escape mechanism except in copy mode. Once this
+ request is invoked, no input character is recognized as starting an
+ escape sequence in interpretation mode.
+
+ -- Request: .ec [o]
+ Recognize the ordinary character O as the escape character. If O
+ is absent or invalid, the default escape character '\' is selected.
+
+ Switching escape sequence interpretation off to define a macro and
+back on afterward can obviate the need to double the escape character
+within the definition. *Note Writing Macros::. This technique is not
+available if your macro needs to interpolate values at the time it is
+_defined_--but many do not.
+
+ .\" simplified `BR` macro from the man(7) macro package
+ .eo
+ .de BR
+ . ds result \&
+ . while (\n[.$] >= 2) \{\
+ . as result \fB\$1\fR\$2\"
+ . shift 2
+ . \}
+ . if \n[.$] .as result \fB\$1\"
+ \*[result]
+ . rm result
+ . ft R
+ ..
+ .ec
+
+ -- Request: .ecs
+ -- Request: .ecr
+ The 'ecs' request stores the escape character for recall with
+ 'ecr'. 'ecr' sets the escape character to '\' if none has been
+ saved.
+
+ Use these requests together to temporarily change the escape
+ character.
+
+ Using a different escape character, or disabling it, when calling
+macros not under your control will likely cause errors, since GNU
+'troff' has no mechanism to "intern" macros--that is, to convert a macro
+definition into a form independent of its representation.(2) (*note
+Using Escape Sequences-Footnote-2::) When a macro is called, its
+contents are interpreted literally.
+
+ (1) The omission of spaces before the comment escape sequences is
+necessary; see *note Strings::.
+
+ (2) TeX does have such a mechanism.
+
+5.6.5 Delimiters
+----------------
+
+Some escape sequences that require parameters use delimiters. The
+neutral apostrophe ''' is a popular choice and shown in this document.
+The neutral double quote '"' is also commonly seen. Letters, numerals,
+and leaders can be used. Punctuation characters are likely better
+choices, except for those defined as infix operators in numeric
+expressions; see below.
+
+ \l'1.5i\[bu]' \" draw 1.5 inches of bullet glyphs
+
+ The following escape sequences don't take arguments and thus are
+allowed as delimiters: '\<SP>', '\%', '\|', '\^', '\{', '\}', '\'',
+'\`', '\-', '\_', '\!', '\?', '\)', '\/', '\,', '\&', '\:', '\~', '\0',
+'\a', '\c', '\d', '\e', '\E', '\p', '\r', '\t', and '\u'. However,
+using them this way is discouraged; they can make the input confusing to
+read.
+
+ A few escape sequences, '\A', '\b', '\o', '\w', '\X', and '\Z',
+accept a newline as a delimiter. Newlines that serve as delimiters
+continue to be recognized as input line terminators.
+
+ A caf\o
+ e\(aa
+ in Paris
+ => A café in Paris
+
+Use of newlines as delimiters in escape sequences is also discouraged.
+
+ Finally, the escape sequences '\D', '\h', '\H', '\l', '\L', '\N',
+'\R', '\s', '\S', '\v', and '\x' prohibit many delimiters.
+
+ * the numerals '0'-'9' and the decimal point '.'
+
+ * the (single-character) operators '+-/*%<>=&:()'
+
+ * the space and tab characters
+
+ * any escape sequences other than '\%', '\:', '\{', '\}', '\'', '\`',
+ '\-', '\_', '\!', '\/', '\c', '\e', and '\p'
+
+ Delimiter syntax is complex and flexible primarily for historical
+reasons; the foregoing restrictions need be kept in mind mainly when
+using 'groff' in AT&T compatibility mode. GNU 'troff' keeps track of
+the nesting depth of escape sequence interpolations, so the only
+characters you need to avoid using as delimiters are those that appear
+in the arguments you input, not any that result from interpolation.
+Typically, ''' works fine. *Note Implementation Differences::.
+
+ $ groff -Tps
+ .de Mw
+ . nr wd \w'\\$1'
+ . tm "\\$1" is \\n(wd units wide.
+ ..
+ .Mw Wet'suwet'en
+ .Mw Wet+200i
+ .cp 1 \" turn on compatibility mode
+ .Mw Wet'suwet'en
+ .Mw Wet'
+ .Mw Wet+200i
+ error-> "Wet'suwet'en" is 54740 units wide.
+ error-> "Wet'+200i" is 42610 units wide.
+ error-> "Wet'suwet'en" is 15860 units wide.
+ error-> "Wet'" is 15860 units wide.
+ error-> "Wet'+200i" is 14415860 units wide.
+
+ We see here that in compatibility mode, the part of the argument
+after the ''' delimiter escapes from its context and, if nefariously
+crafted, influences the computation of the WD register's value in a
+surprising way.
+
+5.7 Comments
+============
+
+One of the most common forms of escape sequence is the comment.(1)
+(*note Comments-Footnote-1::)
+
+ -- Escape sequence: \"
+ Start a comment. Everything up to the next newline is ignored.
+
+ This may sound simple, but it can be tricky to keep the comments
+ from interfering with the appearance of the output. If the escape
+ sequence is to the right of some text or a request, that portion of
+ the line is ignored, but spaces preceding it are processed normally
+ by GNU 'troff'. This affects only the 'ds' and 'as' requests and
+ their variants.
+
+ One possibly irritating idiosyncrasy is that tabs should not be
+ used to vertically align comments in the source document. Tab
+ characters are not treated as separators between a request name and
+ its first argument, nor between arguments.
+
+ A comment on a line by itself is treated as a blank line, because
+ after eliminating the comment, that is all that remains.
+
+ Test
+ \" comment
+ Test
+ => Test
+ =>
+ => Test
+
+ To avoid this, it is common to combine the empty request with the
+ comment escape sequence as '.\"', causing the input line to be
+ ignored.
+
+ Another commenting scheme sometimes seen is three consecutive
+ single quotes (''''') at the beginning of a line. This works, but
+ GNU 'troff' emits a warning diagnostic (if enabled) about an
+ undefined macro (namely '''').
+
+ -- Escape sequence: \#
+ Start a comment; everything up to and including the next newline is
+ ignored. This 'groff' extension was introduced to avoid the
+ problems described above.
+
+ Test
+ \# comment
+ Test
+ => Test Test
+
+ -- Request: .ig [end]
+ Ignore input until, in the current conditional block (if any),(2)
+ (*note Comments-Footnote-2::) the macro END is called at the start
+ of a control line, or the control line '..' is encountered if END
+ is not specified. 'ig' is parsed as if it were a macro definition,
+ but its contents are discarded, not stored.(3) (*note
+ Comments-Footnote-3::)
+
+ hand\c
+ .de TX
+ fasting
+ ..
+ .ig TX
+ This is part of a large block of input that has been
+ temporarily(?) commented out.
+ We can restore it simply by removing the .ig request and
+ the call of its end macro.
+ .TX
+ => handfasting
+
+ (1) This claim may be more aspirational than descriptive.
+
+ (2) *Note Conditional Blocks::.
+
+ (3) Exception: auto-incrementing registers defined outside the
+ignored region _will_ be modified if interpolated with '\n±' inside it.
+*Note Auto-increment::.
+
+5.8 Registers
+=============
+
+In the 'roff' language, numbers can be stored in "registers". Many
+built-in registers exist, supplying anything from the date to details of
+formatting parameters. You can also define your own. *Note
+Identifiers::, for information on constructing a valid name for a
+register.
+
+5.8.1 Setting Registers
+-----------------------
+
+Define registers and update their values with the 'nr' request or the
+'\R' escape sequence.
+
+ -- Request: .nr ident value
+ -- Escape sequence: \R'ident value'
+ Set register IDENT to VALUE. If IDENT doesn't exist, GNU 'troff'
+ creates it. In the '\R' escape sequence, the delimiter need not be
+ a neutral apostrophe; see *note Delimiters::. It also does not
+ produce an input token in GNU 'troff'. *Note Gtroff Internals::.
+
+ .nr a (((17 + (3 * 4))) % 4)
+ \n[a]
+ .\R'a (((17 + (3 * 4))) % 4)'
+ \n[a]
+ => 1 1
+
+ (Later, we will discuss additional forms of 'nr' and '\R' that can
+ change a register's value after it is dereferenced but before it is
+ interpolated. *Note Auto-increment::.)
+
+ The complete transparency of '\R' can cause surprising effects if
+ you use registers like '.k', which get evaluated at the time they
+ are accessed.
+
+ .ll 1.6i
+ .
+ aaa bbb ccc ddd eee fff ggg hhh\R':k \n[.k]'
+ .tm :k == \n[:k]
+ => :k == 126950
+ .
+ .br
+ .
+ aaa bbb ccc ddd eee fff ggg hhh\h'0'\R':k \n[.k]'
+ .tm :k == \n[:k]
+ => :k == 15000
+
+ If you process this with the PostScript device ('-Tps'), there will
+ be a line break eventually after 'ggg' in both input lines.
+ However, after processing the space after 'ggg', the partially
+ collected line is not overfull yet, so GNU 'troff' continues to
+ collect input until it sees the space (or in this case, the
+ newline) after 'hhh'. At this point, the line is longer than the
+ line length, and the line gets broken.
+
+ In the first input line, since the '\R' escape sequence leaves no
+ traces, the check for the overfull line hasn't been done yet at the
+ point where '\R' gets handled, and you get a value for the '.k'
+ register that is even greater than the current line length.
+
+ In the second input line, the insertion of '\h'0'' to cause a
+ zero-width motion forces GNU 'troff' to check the line length,
+ which in turn causes the start of a new output line. Now '.k'
+ returns the expected value.
+
+ 'nr' and '\R' each have two additional special forms to increment or
+decrement a register.
+
+ -- Request: .nr ident +value
+ -- Request: .nr ident -value
+ -- Escape sequence: \R'ident +value'
+ -- Escape sequence: \R'ident -value'
+ Increment (decrement) register IDENT by VALUE. In the '\R' escape
+ sequence, the delimiter need not be a neutral apostrophe; see *note
+ Delimiters::.
+
+ .nr a 1
+ .nr a +1
+ \na
+ => 2
+
+ A leading minus sign in VALUE is always interpreted as a
+ decrementation operator, not an algebraic sign. To assign a
+ register a negative value or the negated value of another register,
+ you can force GNU 'troff' to interpret '-' as a negation or minus,
+ rather than decrementation, operator: enclose it with its operand
+ in parentheses or subtract it from zero.
+
+ .nr a 7
+ .nr b 3
+ .nr a -\nb
+ \na
+ => 4
+ .nr a (-\nb)
+ \na
+ => -3
+ .nr a 0-\nb
+ \na
+ => -3
+
+ If a register's prior value does not exist (the register was
+ undefined), an increment or decrement is applied as if to 0.
+
+ -- Request: .rr ident
+ Remove register IDENT. If IDENT doesn't exist, the request is
+ ignored. Technically, only the name is removed; the register's
+ contents are still accessible under aliases created with 'aln', if
+ any.
+
+ -- Request: .rnn ident1 ident2
+ Rename register IDENT1 to IDENT2. If IDENT1 doesn't exist, the
+ request is ignored. Renaming a built-in register does not
+ otherwise alter its properties.
+
+ -- Request: .aln new old
+ Create an alias NEW for an existing register OLD, causing the names
+ to refer to the same stored object. If OLD is undefined, a warning
+ in category 'reg' is produced and the request is ignored. *Note
+ Warnings::, for information about the enablement and suppression of
+ warnings.
+
+ To remove a register alias, invoke 'rr' on its name. A register's
+ contents do not become inaccessible until it has no more names.
+
+5.8.2 Interpolating Registers
+-----------------------------
+
+Register contents are interpolated with the '\n' escape sequence.
+
+ -- Escape sequence: \ni
+ -- Escape sequence: \n(id
+ -- Escape sequence: \n[ident]
+ Interpolate register with name IDENT (one-character name I,
+ two-character name ID). '\n' is interpreted even in copy mode
+ (*note Copy Mode::). If the register is undefined, it is created
+ and assigned a value of '0', that value is interpolated, and a
+ warning in category 'reg' is emitted. *Note Warnings::, for
+ information about the enablement and suppression of warnings.
+
+ .nr a 5
+ .nr as \na+\na
+ \n(as
+ => 10
+
+ .nr a1 5
+ .nr ab 6
+ .ds str b
+ .ds num 1
+ \n[a\n[num]]
+ => 5
+ \n[a\*[str]]
+ => 6
+
+5.8.3 Auto-increment
+--------------------
+
+Registers can also be incremented or decremented by a configured amount
+at the time they are interpolated. The value of the increment is
+specified with a third argument to the 'nr' request, and a special
+interpolation syntax is used to alter and then retrieve the register's
+value. Together, these features are called "auto-increment".(1) (*note
+Auto-increment-Footnote-1::)
+
+ -- Request: .nr ident value incr
+ Set register IDENT to VALUE and its auto-incrementation amount to
+ to INCR. The '\R' escape sequence doesn't support an INCR
+ argument.
+
+ Auto-incrementation is not _completely_ automatic; the '\n' escape
+sequence in its basic form never alters the value of a register. To
+apply auto-incrementation to a register, interpolate it with '\n±'.
+
+ -- Escape sequence: \n+i
+ -- Escape sequence: \n-i
+ -- Escape sequence: \n+(id
+ -- Escape sequence: \n-(id
+ -- Escape sequence: \n+[ident]
+ -- Escape sequence: \n-[ident]
+ Increment or decrement IDENT (one-character name I, two-character
+ name ID) by the register's auto-incrementation value and then
+ interpolate the new register value. If IDENT has no
+ auto-incrementation value, interpolate as with '\n'.
+
+ .nr a 0 1
+ .nr xx 0 5
+ .nr foo 0 -2
+ \n+a, \n+a, \n+a, \n+a, \n+a
+ .br
+ \n-(xx, \n-(xx, \n-(xx, \n-(xx, \n-(xx
+ .br
+ \n+[foo], \n+[foo], \n+[foo], \n+[foo], \n+[foo]
+ => 1, 2, 3, 4, 5
+ => -5, -10, -15, -20, -25
+ => -2, -4, -6, -8, -10
+
+ To change the increment value without changing the value of a
+register, assign the register's value to itself by interpolating it, and
+specify the desired increment normally. Apply an increment of '0' to
+disable auto-incrementation of the register.
+
+ (1) A negative auto-increment can be considered an "auto-decrement".
+
+5.8.4 Assigning Register Formats
+--------------------------------
+
+A writable register's value can be interpolated in several number
+formats. By default, conventional Arabic numerals are used. Other
+formats see use in sectioning and outlining schemes and alternative page
+numbering arrangements.
+
+ -- Request: .af reg fmt
+ Use number format FMT when interpolating register REG. Valid
+ number formats are as follows.
+
+ '0...'
+ Arabic numerals 0, 1, 2, and so on. Any decimal digit is
+ equivalent to '0'; the formatter merely counts the digits
+ specified. Multiple Arabic numerals in FMT cause
+ interpolations to be zero-padded on the left if necessary to
+ at least as many digits as specified (interpolations never
+ truncate a register value). A register with format '00'
+ interpolates values 1, 2, 3 as '01', '02', '03'. The default
+ format for all writable registers is '0'.
+
+ 'I'
+ Uppercase Roman numerals: 0, I, II, III, IV, ...
+
+ 'i'
+ Lowercase Roman numerals: 0, i, ii, iii, iv, ...
+
+ 'A'
+ Uppercase letters: 0, A, B, C, ..., Z, AA, AB, ...
+
+ 'a'
+ Lowercase letters: 0, a, b, c, ..., z, aa, ab, ...
+
+ Omitting FMT causes a warning in category 'missing'. *Note
+ Warnings::, for information about the enablement and suppression of
+ warnings. Specifying an unrecognized format is an error.
+
+ Zero values are interpolated as '0' in non-Arabic formats.
+ Negative quantities are prefixed with '-' irrespective of format.
+ In Arabic formats, the sign supplements the field width. If REG
+ doesn't exist, it is created with a zero value.
+
+ .nr a 10
+ .af a 0 \" the default format
+ \na,
+ .af a I
+ \na,
+ .af a 321
+ .nr a (-\na)
+ \na,
+ .af a a
+ \na
+ => 10, X, -010, -j
+
+ The representable extrema in the 'i' and 'I' formats correspond to
+ Arabic ±39,999. GNU 'troff' uses 'w' and 'z' to represent 5,000
+ and 10,000 in Roman numerals, respectively, following the
+ convention of AT&T 'troff'--currently, the correct glyphs for Roman
+ numerals five thousand ('U+2181') and ten thousand ('U+2182') are
+ not used.
+
+ Assigning the format of a read-only register is an error. Instead,
+ copy the read-only register's value to, and assign the format of, a
+ writable register.
+
+ -- Escape sequence: \gr
+ -- Escape sequence: \g(rg
+ -- Escape sequence: \g[reg]
+ Interpolate the format of the register REG (one-character name R,
+ two-character name RG). Zeroes represent Arabic formats. If REG
+ is not defined, REG is not created and nothing is interpolated.
+ '\g' is interpreted even in copy mode (*note Copy Mode::).
+
+ GNU 'troff' interprets only Arabic numerals. The Roman numeral or
+alphabetic formats cannot be used as operands to arithmetic operators in
+expressions (*note Numeric Expressions::). For instance, it may be
+desirable to test the page number independently of its format.
+
+ .af % i \" front matter
+ .de header-trap
+ . \" To test the page number, we need it in Arabic.
+ . ds saved-page-number-format \\g%\"
+ . af % 0
+ . nr page-number-in-decimal \\n%
+ . af % \\*[saved-page-number-format]
+ . ie \\n[page-number-in-decimal]=1 .do-first-page-stuff
+ . el \{\
+ . ie o .do-odd-numbered-page-stuff
+ . el .do-even-numbered-page-stuff
+ . \}
+ . rm saved-page-number-format
+ ..
+ .wh 0 header-trap
+
+5.8.5 Built-in Registers
+------------------------
+
+Predefined registers whose identifiers start with a dot are read-only.
+Many are Boolean-valued, interpolating a true or false value testable
+with the 'if', 'ie', or 'while' requests. Some read-only registers are
+string-valued, meaning that they interpolate text.
+
+ *Caution:* Built-in registers are subject to removal like others;
+once removed, they can be recreated only as normal writable registers
+and will not reflect formatter state.
+
+ A register name (without the dot) is often associated with a request
+of the same name. A complete listing of all built-in registers can be
+found in *note Register Index::.
+
+ We present here a few built-in registers that are not described
+elsewhere in this manual; they have to do with invariant properties of
+GNU 'troff', or obtain information about the formatter's command-line
+options, processing progress, or the operating environment.
+
+'\n[.A]'
+ Approximate output is being formatted (Boolean-valued); see 'groff'
+ '-a' option (*note Groff Options::).
+
+'\n[.c]'
+'\n[c.]'
+ Input line number. 'c.' is a writable synonym, affecting
+ subsequent interpolations of both '.c' and 'c.'.
+
+'\n[.F]'
+ Name of input file (string-valued).
+
+'\n[.g]'
+ Always true in GNU 'troff' (Boolean-valued). Documents can use
+ this to ask the formatter if it claims 'groff' compatibility.
+
+'\n[.P]'
+ Output page selection status (Boolean-valued); see 'groff' '-o'
+ option (*note Groff Options::).
+
+'\n[.R]'
+ Count of available unused registers; always 10,000 in GNU
+ 'troff'.(1) (*note Built-in Registers-Footnote-1::)
+
+'\n[.T]'
+ Indicator of output device selection (Boolean-valued); see 'groff'
+ '-T' option (*note Groff Options::).
+
+'\n[.U]'
+ Unsafe mode enablement status (Boolean-valued); see 'groff' '-U'
+ option (*note Groff Options::).
+
+'\n[.x]'
+ Major version number of the running GNU 'troff' formatter. For
+ example, if the version number is 1.23.0, then '.x' contains '1'.
+
+'\n[.y]'
+ Minor version number of the running GNU 'troff' formatter. For
+ example, if the version number is 1.23.0, then '.y' contains '23'.
+
+'\n[.Y]'
+ Revision number of the running GNU 'troff' formatter. For example,
+ if the version number is 1.23.0, then '.Y' contains '0'.
+
+'\n[$$]'
+ Process identifier (PID) of the GNU 'troff' program in its
+ operating environment.
+
+ Date- and time-related registers are set per the local time as
+determined by 'localtime(3)' when the formatter launches. This
+initialization can be overridden by 'SOURCE_DATE_EPOCH' and 'TZ'; see
+*note Environment::.
+
+'\n[seconds]'
+ Count of seconds elapsed in the minute (0-60).
+
+'\n[minutes]'
+ Count of minutes elapsed in the hour (0-59).
+
+'\n[hours]'
+ Count of hours elapsed since midnight (0-23).
+
+'\n[dw]'
+ Day of the week (1-7; 1 is Sunday).
+
+'\n[dy]'
+ Day of the month (1-31).
+
+'\n[mo]'
+ Month of the year (1-12).
+
+'\n[year]'
+ Gregorian year.
+
+'\n[yr]'
+ Gregorian year minus 1900. This register is incorrectly documented
+ in the AT&T 'troff' manual as storing the last two digits of the
+ current year. That claim stopped being true in 2000. Old 'troff'
+ input that looks like:
+
+ '\" The year number is a surprise after 1999.
+ This document was formatted in 19\n(yr.
+
+ can be corrected to:
+
+ This document was formatted in \n[year].
+
+ or, for portability across many 'roff' programs, to the following.
+
+ .nr y4 1900+\n(yr
+ This document was formatted in \n(y4.
+
+ (1) GNU 'troff' dynamically allocates memory for as many registers as
+required.
+
+5.9 Manipulating Filling and Adjustment
+=======================================
+
+When an output line is pending (see below), a break moves the drawing
+position to the beginning of the next text baseline, interrupting
+filling. Various ways of causing breaks were shown in *note Breaking::.
+The 'br' request likewise causes a break. Several other requests imply
+breaks: 'bp', 'ce', 'cf', 'fi', 'fl', 'in', 'nf', 'rj', 'sp', 'ti', and
+'trf'. If the no-break control character is used with any of these
+requests, GNU 'troff' suppresses the break; instead the requested
+operation takes effect at the next break. ''br' does nothing.
+
+ .ll 55n
+ This line is normally filled and adjusted.
+ .br
+ A line's alignment is decided
+ 'ce \" Center the next input line (no break).
+ when it is output.
+ This line returns to normal filling and adjustment.
+ => This line is normally filled and adjusted.
+ => A line's alignment is decided when it is output.
+ => This line returns to normal filling and adjustment.
+
+Output line properties like page offset, indentation, adjustment, and
+even the location of its text baseline, are not determined until the
+line has been broken. An output line is said to be "pending" if some
+input has been collected but an output line corresponding to it has not
+yet been written; such an output line is also termed "partially
+collected". If no output line is pending, it is as if a break has
+already happened; additional breaks, whether explicit or implicit, have
+no effect. If the vertical drawing position is negative--as it is when
+the formatter starts up--a break starts a new page (even if no output
+line is pending) unless an end-of-input macro is being interpreted.
+*Note End-of-input Traps::.
+
+ -- Request: .br
+ Break the line: emit any pending output line without adjustment.
+
+ foo bar
+ .br
+ baz
+ 'br
+ qux
+ => foo bar
+ => baz qux
+
+ Sometimes you want to prevent a break within a phrase or between a
+quantity and its units.
+
+ -- Escape sequence: \~
+ Insert an unbreakable space that is adjustable like an ordinary
+ space. It is discarded from the end of an output line if a break
+ is forced.
+
+ Set the output speed to\~1.
+ There are 1,024\~bytes in 1\~KiB.
+ J.\~F.\~Ossanna wrote the original CSTR\~#54.
+
+ By default, GNU 'troff' fills text and adjusts it to reach the output
+line length. The 'nf' request disables filling; the 'fi' request
+reënables it.
+
+ -- Request: .fi
+ -- Register: \n[.u]
+ Enable filling of output lines; a pending output line is broken.
+ The read-only register '.u' is set to 1. The filling enablement
+ status, sometimes called "fill mode", is associated with the
+ environment (*note Environments::). *Note Line Continuation::, for
+ interaction with the '\c' escape sequence.
+
+ -- Request: .nf
+ Disable filling of output lines: the output line length (*note Line
+ Layout::) is ignored and output lines are broken where the input
+ lines are. A pending output line is broken and adjustment is
+ suppressed. The read-only register '.u' is set to 0. The filling
+ enablement status is associated with the environment (*note
+ Environments::). See *note Line Continuation::, for interaction
+ with the '\c' escape sequence.
+
+ -- Request: .ad [mode]
+ -- Register: \n[.j]
+ Enable output line adjustment in MODE, taking effect when the
+ pending (or next) output line is broken. Adjustment is suppressed
+ when filling is. MODE can have one of the following values.
+
+ 'b'
+ 'n'
+ Adjust "normally": if the output line does not consume the
+ distance between the indentation and the configured output
+ line length, GNU 'troff' stretches adjustable spaces within
+ the line until that length is reached. When the indentation
+ is zero, this mode spreads the line to both the left and right
+ margins. This is the GNU 'troff' default.
+
+ 'c'
+ Center filled text. Contrast with the 'ce' request, which
+ centers text _without_ filling it.
+
+ 'l'
+ Align text to the left without adjusting it.
+
+ 'r'
+ Align text to the right without adjusting it.
+
+ MODE can also be a value previously stored in the '.j' register.
+ Using 'ad' without an argument is the same as '.ad \n[.j]'; unless
+ filling is disabled, GNU 'troff' resumes adjusting lines in the
+ same way it did before adjustment was disabled by invocation of the
+ 'na' request.
+
+ The adjustment mode and enablement status are encoded in the
+ read-only register '.j'. These parameters are associated with the
+ environment (*note Environments::).
+
+ The value of '.j' for any adjustment mode is an implementation
+ detail and should not be relied upon as a programmer's interface.
+ Do not write logic to interpret or perform arithmetic on it.
+
+ .ll 48n
+ .de AD
+ . br
+ . ad \\$1
+ ..
+ .de NA
+ . br
+ . na
+ ..
+ left
+ .AD r
+ .nr ad \n(.j
+ right
+ .AD c
+ center
+ .NA
+ left
+ .AD
+ center
+ .AD \n(ad
+ right
+ => left
+ => right
+ => center
+ => left
+ => center
+ => right
+
+ -- Request: .na
+ Disable output line adjustment. This produces the same output as
+ left-alignment, but the value of the adjustment mode register '.j'
+ is altered differently. The adjustment mode and enablement status
+ are associated with the environment (*note Environments::).
+
+ -- Request: .brp
+ -- Escape sequence: \p
+ Break, adjusting the line per the current adjustment mode. '\p'
+ schedules a break with adjustment at the next word boundary. The
+ escape sequence is itself neither a break nor a space of any kind;
+ it can thus be placed in the middle of a word to cause a break at
+ the end of that word.
+
+ Breaking with immediate adjustment can produce ugly results since
+ GNU 'troff' doesn't have a sophisticated paragraph-building
+ algorithm, as TeX has, for example. Instead, GNU 'troff' fills and
+ adjusts a paragraph line by line.
+
+ .ll 4.5i
+ This is an uninteresting sentence.
+ This is an uninteresting sentence.\p
+ This is an uninteresting sentence.
+
+ is formatted as follows.
+
+ This is an uninteresting sentence. This is
+ an uninteresting sentence.
+ This is an uninteresting sentence.
+
+ To clearly present the next couple of requests, we must introduce the
+concept of "productive" input lines. A "productive input line" is one
+that directly produces formatted output. Text lines produce output,(1)
+(*note Manipulating Filling and Adjustment-Footnote-1::) as do control
+lines containing requests like 'tl' or escape sequences like '\D'.
+Macro calls are not _directly_ productive, and thus not counted, but
+their interpolated contents can be. Empty requests, and requests and
+escape sequences that define registers or strings or alter the
+formatting environment (as with changes to the size, face, height,
+slant, or color of the type) are not productive. We will also preview
+the output line continuation escape sequence, '\c', which "connects" two
+input lines that would otherwise be counted separately. (2) (*note
+Manipulating Filling and Adjustment-Footnote-2::)
+
+ .de hello
+ Hello, world!
+ ..
+ .ce \" center output of next productive input line
+ .
+ .nr junk-reg 1
+ .ft I
+ Chorus: \c
+ .ft
+ .hello
+ Went the day well?
+ => Chorus: Hello, world!
+ => Went the day well?
+
+ -- Request: .ce [n]
+ -- Register: \n[.ce]
+ Break (unless the no-break control character is used), center the
+ output of the next N productive input lines with respect to the
+ line length and indentation without filling, then break again
+ regardless of the invoking control character. If the argument is
+ not positive, centering is disabled. Omitting the argument implies
+ an N of '1'. The count of lines remaining to be centered is stored
+ in the read-only register '.ce' and is associated with the
+ environment (*note Environments::).
+
+ While the '.ad c' request also centers text, it fills the text as
+ well.
+
+ .de FR
+ This is a small text fragment that shows the differences
+ between the `.ce' and the `.ad c' requests.
+ ..
+ .ll 4i
+ .ce 1000
+ .FR
+ .ce 0
+
+ .ad c
+ .FR
+ => This is a small text fragment that shows
+ => the differences
+ => between the `.ce' and the `.ad c' requests.
+ =>
+ => This is a small text fragment that shows
+ => the differences between the `.ce' and
+ => the `.ad c' requests.
+
+ The previous example illustrates a common idiom of turning
+ centering on for a quantity of lines far in excess of what is
+ required, and off again after the text to be centered. This
+ technique relieves humans of counting lines for requests that take
+ a count of input lines as an argument.
+
+ -- Request: .rj [n]
+ -- Register: \n[.rj]
+ Break (unless the no-break control character is used), align the
+ output of the next N productive input lines to the right margin
+ without filling, then break again regardless of the control
+ character. If the argument is not positive, right-alignment is
+ disabled. Omitting the argument implies an N of '1'. The count of
+ lines remaining to be right-aligned is stored in the read-only
+ register '.rj' and is associated with the environment (*note
+ Environments::).
+
+ .ll 49n
+ .rj 3
+ At first I hoped that such a technically unsound
+ project would collapse but I soon realized it was
+ doomed to success. \[em] C. A. R. Hoare
+ => At first I hoped that such a technically unsound
+ => project would collapse but I soon realized it was
+ => doomed to success. -- C. A. R. Hoare
+
+ -- Request: .ss word-space-size [additional-sentence-space-size]
+ -- Register: \n[.ss]
+ -- Register: \n[.sss]
+ Set the sizes of spaces between words and sentences(3) (*note
+ Manipulating Filling and Adjustment-Footnote-3::) in twelfths of
+ font's space width (typically one-fourth to one-third em for
+ Western scripts). The default for both parameters is 12. Negative
+ values are erroneous. The first argument is a minimum; if an
+ output line undergoes adjustment, such spaces may increase in
+ width. The optional second argument sets the amount of additional
+ space separating sentences on the same output line. If omitted,
+ this amount is set to WORD-SPACE-SIZE. The request is ignored if
+ there are no parameters.
+
+ Additional inter-sentence space is used only if the output line is
+ not full when the end of a sentence occurs in the input. If a
+ sentence ends at the end of an input line, then both an inter-word
+ space and an inter-sentence space are added to the output; if two
+ spaces follow the end of a sentence in the middle of an input line,
+ then the second space becomes an inter-sentence space in the
+ output. Additional inter-sentence space is not adjusted, but the
+ inter-word space that always precedes it may be. Further input
+ spaces after the second, if present, are adjusted as normal.
+
+ The read-only registers '.ss' and '.sss' hold the minimal
+ inter-word space and additional inter-sentence space amounts,
+ respectively. These parameters are part of the environment (*note
+ Environments::), and rounded down to the nearest multiple of 12 on
+ terminals.
+
+ The 'ss' request can insert discardable horizontal space; that is,
+ space that is discarded at a break. For example, some footnote
+ styles collect the notes into a single paragraph with large gaps
+ between each note.
+
+ .ll 48n
+ 1.\~J. Fict. Ch. Soc. 6 (2020), 3\[en]14.
+ .ss 12 48 \" applies to next sentence ending
+ Reprints no longer available through FCS.
+ .ss 12 \" go back to normal
+ 2.\~Better known for other work.
+ => 1. J. Fict. Ch. Soc. 6 (2020), 3-14. Reprints
+ => no longer available through FCS. 2. Better
+ => known for other work.
+
+ If _undiscardable_ space is required, use the '\h' escape sequence.
+
+ (1) unless diverted; see *note Diversions::
+
+ (2) *Note Line Continuation::.
+
+ (3) Recall *note Filling:: and *note Sentences:: for the definitions
+of word and sentence boundaries, respectively.
+
+5.10 Manipulating Hyphenation
+=============================
+
+When filling, GNU 'troff' hyphenates words as needed at user-specified
+and automatically determined hyphenation points. The machine-driven
+determination of hyphenation points in words requires algorithms and
+data, and is susceptible to conventions and preferences. Before
+tackling such "automatic hyphenation", let us consider how hyphenation
+points can be set explicitly.
+
+ Explicitly hyphenated words such as "mother-in-law" are eligible for
+breaking after each of their hyphens. Relatively few words in a
+language offer such obvious break points, however, and automatic
+detection of syllabic (or phonetic) boundaries for hyphenation is not
+perfect,(1) (*note Manipulating Hyphenation-Footnote-1::) particularly
+for unusual words found in technical literature. We can instruct GNU
+'troff' how to hyphenate specific words if the need arises.
+
+ -- Request: .hw word ...
+ Define each "hyphenation exception" WORD with each hyphen '-' in
+ the word indicating a hyphenation point. For example, the request
+
+ .hw in-sa-lub-rious alpha
+
+ marks potential hyphenation points in "insalubrious", and prevents
+ "alpha" from being hyphenated at all.
+
+ Besides the space character, any character whose hyphenation code
+ is zero can be used to separate the arguments of 'hw' (see the
+ 'hcode' request below). In addition, this request can be used more
+ than once.
+
+ Hyphenation points specified with 'hw' are not subject to the
+ within-word placement restrictions imposed by the 'hy' request (see
+ below).
+
+ Hyphenation exceptions specified with the 'hw' request are
+ associated with the hyphenation language (see the 'hla' request
+ below) and environment (*note Environments::); invoking the 'hw'
+ request in the absence of a hyphenation language is an error.
+
+ The request is ignored if there are no parameters.
+
+ These are known as hyphenation exceptions in the expectation that
+most users will avail themselves of automatic hyphenation; these
+exceptions override any rules that would normally apply to a word
+matching a hyphenation exception defined with 'hw'.
+
+ Situations also arise when only a specific occurrence of a word needs
+its hyphenation altered or suppressed, or when a URL or similar string
+needs to be breakable in sensible places without hyphenation.
+
+ -- Escape sequence: \%
+ -- Escape sequence: \:
+ To tell GNU 'troff' how to hyphenate words as they occur in input,
+ use the '\%' escape sequence; it is the default "hyphenation
+ character". Each instance within a word indicates to GNU 'troff'
+ that the word may be hyphenated at that point, while prefixing a
+ word with this escape sequence prevents it from being otherwise
+ hyphenated. This mechanism affects only that occurrence of the
+ word; to change the hyphenation of a word for the remainder of
+ input processing, use the 'hw' request.
+
+ GNU 'troff' regards the escape sequences '\X' and '\Y' as starting
+ a word; that is, the '\%' escape sequence in, say,
+ '\X'...'\%foobar' or '\Y'...'\%foobar' no longer prevents
+ hyphenation of 'foobar' but inserts a hyphenation point just prior
+ to it; most likely this isn't what you want. *Note Postprocessor
+ Access::.
+
+ '\:' inserts a non-printing break point; that is, a word can break
+ there, but the soft hyphen glyph (see below) is not written to the
+ output if it does. This escape sequence is an input word boundary,
+ so the remainder of the word is subject to hyphenation as normal.
+
+ You can combine '\:' and '\%' to control breaking of a file name or
+ URL, or to permit hyphenation only after certain explicit hyphens
+ within a word.
+
+ The \%Lethbridge-Stewart-\:\%Sackville-Baggins divorce
+ was, in retrospect, inevitable once the contents of
+ \%/var/log/\:\%httpd/\:\%access_log on the family web
+ server came to light, revealing visitors from Hogwarts.
+
+ -- Request: .hc [char]
+ Change the hyphenation character to CHAR. This character then
+ works as the '\%' escape sequence normally does, and thus no longer
+ appears in the output.(2) (*note Manipulating
+ Hyphenation-Footnote-2::) Without an argument, 'hc' resets the
+ hyphenation character to '\%' (the default). The hyphenation
+ character is associated with the environment (*note
+ Environments::).
+
+ -- Request: .shc [c]
+ Set the "soft hyphen character", inserted when a word is hyphenated
+ automatically or at a hyphenation character, to the ordinary or
+ special character C.(3) (*note Manipulating
+ Hyphenation-Footnote-3::) If the argument is omitted, the soft
+ hyphen character is set to the default, '\[hy]'. If no glyph for C
+ exists in the font in use at a potential hyphenation point, then
+ the line is not broken there. Neither character definitions
+ (specified with the 'char' and similar requests) nor translations
+ (specified with the 'tr' request) are applied to C.
+
+ Several requests influence automatic hyphenation. Because
+conventions vary, a variety of hyphenation modes is available to the
+'hy' request; these determine whether hyphenation will apply to a word
+prior to breaking a line at the end of a page (more or less; see below
+for details), and at which positions within that word automatically
+determined hyphenation points are permissible. The places within a word
+that are eligible for hyphenation are determined by language-specific
+data and lettercase relationships. Furthermore, hyphenation of a word
+might be suppressed due to a limit on consecutive hyphenated lines
+('hlm'), a minimum line length threshold ('hym'), or because the line
+can instead be adjusted with additional inter-word space ('hys').
+
+ -- Request: .hy [mode]
+ -- Register: \n[.hy]
+ Set automatic hyphenation mode to MODE, an integer encoding
+ conditions for hyphenation; if omitted, '1' is implied. The
+ hyphenation mode is available in the read-only register '.hy'; it
+ is associated with the environment (*note Environments::). The
+ default hyphenation mode depends on the localization file loaded
+ when GNU 'troff' starts up; see the 'hpf' request below.
+
+ Typesetting practice generally does not avail itself of every
+ opportunity for hyphenation, but the details differ by language and
+ site mandates. The hyphenation modes of AT&T 'troff' were
+ implemented with English-language publishing practices of the 1970s
+ in mind, not a scrupulous enumeration of conceivable parameters.
+ GNU 'troff' extends those modes such that finer-grained control is
+ possible, favoring compatibility with older implementations over a
+ more intuitive arrangement. The means of hyphenation mode control
+ is a set of numbers that can be added up to encode the behavior
+ sought.(4) (*note Manipulating Hyphenation-Footnote-4::) The
+ entries in the following table are termed "values"; the sum of the
+ desired values is the "mode".
+
+ '0'
+ disables hyphenation.
+
+ '1'
+ enables hyphenation except after the first and before the last
+ character of a word.
+
+ The remaining values "imply" 1; that is, they enable hyphenation
+ under the same conditions as '.hy 1', and then apply or lift
+ restrictions relative to that basis.
+
+ '2'
+ disables hyphenation of the last word on a page,(5) (*note
+ Manipulating Hyphenation-Footnote-5::) even for explicitly
+ hyphenated words.
+
+ '4'
+ disables hyphenation before the last two characters of a word.
+
+ '8'
+ disables hyphenation after the first two characters of a word.
+
+ '16'
+ enables hyphenation before the last character of a word.
+
+ '32'
+ enables hyphenation after the first character of a word.
+
+ Apart from value 2, restrictions imposed by the hyphenation mode
+ are _not_ respected for words whose hyphenations have been
+ specified with the hyphenation character ('\%' by default) or the
+ 'hw' request.
+
+ Nonzero values in the previous table are additive. For example,
+ mode 12 causes GNU 'troff' to hyphenate neither the last two nor
+ the first two characters of a word. Some values cannot be used
+ together because they contradict; for instance, values 4 and 16,
+ and values 8 and 32. As noted, it is superfluous to add 1 to any
+ non-zero even mode.
+
+ The automatic placement of hyphens in words is determined by
+ "pattern files", which are derived from TeX and available for
+ several languages. The number of characters at the beginning of a
+ word after which the first hyphenation point should be inserted is
+ determined by the patterns themselves; it can't be reduced further
+ without introducing additional, invalid hyphenation points
+ (unfortunately, this information is not part of a pattern file--you
+ have to know it in advance). The same is true for the number of
+ characters at the end of a word before the last hyphenation point
+ should be inserted. For example, you can supply the following
+ input to 'echo $(nroff)'.
+
+ .ll 1
+ .hy 48
+ splitting
+
+ You will get
+
+ s- plit- t- in- g
+
+ instead of the correct 'split- ting'. English patterns as
+ distributed with GNU 'troff' need two characters at the beginning
+ and three characters at the end; this means that value 4 of 'hy' is
+ mandatory. Value 8 is possible as an additional restriction, but
+ values 16 and 32 should be avoided, as should mode 1. Modes 4
+ and 6 are typical.
+
+ A table of left and right minimum character counts for hyphenation
+ as needed by the patterns distributed with GNU 'troff' follows; see
+ the 'groff_tmac(5)' man page for more information on GNU 'troff''s
+ language macro files.
+
+ language pattern name left min right min
+ -----------------------------------------------------------
+ Czech cs 2 2
+ English en 2 3
+ French fr 2 3
+ German traditional det 2 2
+ German reformed den 2 2
+ Italian it 2 2
+ Swedish sv 1 2
+
+ Hyphenation exceptions within pattern files (i.e., the words within
+ a TeX '\hyphenation' group) obey the hyphenation restrictions given
+ by 'hy'.
+
+ -- Request: .nh
+ Disable automatic hyphenation; i.e., set the hyphenation mode to 0
+ (see above). The hyphenation mode of the last call to 'hy' is not
+ remembered.
+
+ -- Request: .hpf pattern-file
+ -- Request: .hpfa pattern-file
+ -- Request: .hpfcode a b [c d] ...
+ Read hyphenation patterns from PATTERN-FILE, which is sought in the
+ same way that macro files are with the 'mso' request or the
+ '-mNAME' command-line option to 'groff'. The PATTERN-FILE should
+ have the same format as (simple) TeX pattern files. More
+ specifically, the following scanning rules are implemented.
+
+ * A percent sign starts a comment (up to the end of the line)
+ even if preceded by a backslash.
+
+ * "Digraphs" like '\$' are not supported.
+
+ * '^^XX' (where each X is 0-9 or a-f) and '^^C' (character C in
+ the code point range 0-127 decimal) are recognized; other uses
+ of '^' cause an error.
+
+ * No macro expansion is performed.
+
+ * 'hpf' checks for the expression '\patterns{...}' (possibly
+ with whitespace before or after the braces). Everything
+ between the braces is taken as hyphenation patterns.
+ Consequently, '{' and '}' are not allowed in patterns.
+
+ * Similarly, '\hyphenation{...}' gives a list of hyphenation
+ exceptions.
+
+ * '\endinput' is recognized also.
+
+ * For backward compatibility, if '\patterns' is missing, the
+ whole file is treated as a list of hyphenation patterns
+ (except that the '%' character is recognized as the start of a
+ comment).
+
+ The 'hpfa' request appends a file of patterns to the current list.
+
+ The 'hpfcode' request defines mapping values for character codes in
+ pattern files. It is an older mechanism no longer used by GNU
+ 'troff''s own macro files; for its successor, see 'hcode' below.
+ 'hpf' or 'hpfa' apply the mapping after reading the patterns but
+ before replacing or appending to the active list of patterns. Its
+ arguments are pairs of character codes--integers from 0 to 255.
+ The request maps character code A to code B, code C to code D, and
+ so on. Character codes that would otherwise be invalid in GNU
+ 'troff' can be used. By default, every code maps to itself except
+ those for letters 'A' to 'Z', which map to those for 'a' to 'z'.
+
+ The set of hyphenation patterns is associated with the language set
+ by the 'hla' request (see below). The 'hpf' request is usually
+ invoked by a localization file loaded by the 'troffrc' file.(6)
+ (*note Manipulating Hyphenation-Footnote-6::)
+
+ A second call to 'hpf' (for the same language) replaces the
+ hyphenation patterns with the new ones. Invoking 'hpf' or 'hpfa'
+ causes an error if there is no hyphenation language. If no 'hpf'
+ request is specified (either in the document, in a file loaded at
+ startup, or in a macro package), GNU 'troff' won't automatically
+ hyphenate at all.
+
+ -- Request: .hcode c1 code1 [c2 code2] ...
+ Set the hyphenation code of character C1 to CODE1, that of C2 to
+ CODE2, and so on. A hyphenation code must be an ordinary character
+ (not a special character escape sequence) other than a digit or a
+ space. The request is ignored if given no arguments.
+
+ For hyphenation to work, hyphenation codes must be set up. At
+ startup, GNU 'troff' assigns hyphenation codes to the letters
+ 'a'-'z' (mapped to themselves), to the letters 'A'-'Z' (mapped to
+ 'a'-'z'), and zero to all other characters. Normally, hyphenation
+ patterns contain only lowercase letters which should be applied
+ regardless of case. In other words, they assume that the words
+ 'FOO' and 'Foo' should be hyphenated exactly as 'foo' is. The
+ 'hcode' request extends this principle to letters outside the
+ Unicode basic Latin alphabet; without it, words containing such
+ letters won't be hyphenated properly even if the corresponding
+ hyphenation patterns contain them.
+
+ For example, the following 'hcode' requests are necessary to assign
+ hyphenation codes to the letters 'ÄäÖöÜüß', needed for German.
+
+ .hcode ä ä Ä ä
+ .hcode ö ö Ö ö
+ .hcode ü ü Ü ü
+ .hcode ß ß
+
+ Without these assignments, GNU 'troff' treats the German word
+ 'Kindergärten' (the plural form of 'kindergarten') as two words
+ 'kinderg' and 'rten' because the hyphenation code of the umlaut a
+ is zero by default, just like a space. There is a German
+ hyphenation pattern that covers 'kinder', so GNU 'troff' finds the
+ hyphenation 'kin-der'. The other two hyphenation points
+ ('kin-der-gär-ten') are missed.
+
+ -- Request: .hla lang
+ -- Register: \n[.hla]
+ Set the hyphenation language to LANG. Hyphenation exceptions
+ specified with the 'hw' request and hyphenation patterns and
+ exceptions specified with the 'hpf' and 'hpfa' requests are
+ associated with the hyphenation language. The 'hla' request is
+ usually invoked by a localization file, which is turn loaded by the
+ 'troffrc' or 'troffrc-end' file; see the 'hpf' request above.
+
+ The hyphenation language is available in the read-only
+ string-valued register '.hla'; it is associated with the
+ environment (*note Environments::).
+
+ -- Request: .hlm [n]
+ -- Register: \n[.hlm]
+ -- Register: \n[.hlc]
+ Set the maximum quantity of consecutive hyphenated lines to N. If
+ N is negative, there is no maximum. If omitted, N is -1. This
+ value is associated with the environment (*note Environments::).
+ Only lines output from a given environment count toward the maximum
+ associated with that environment. Hyphens resulting from '\%' are
+ counted; explicit hyphens are not.
+
+ The '.hlm' read-only register stores this maximum. The count of
+ immediately preceding consecutive hyphenated lines is available in
+ the read-only register '.hlc'.
+
+ -- Request: .hym [length]
+ -- Register: \n[.hym]
+ Set the (right) hyphenation margin to LENGTH. If the adjustment
+ mode is not 'b' or 'n', the line is not hyphenated if it is shorter
+ than LENGTH. Without an argument, the hyphenation margin is reset
+ to its default value, 0. The default scaling unit is 'm'. The
+ hyphenation margin is associated with the environment (*note
+ Environments::).
+
+ A negative argument resets the hyphenation margin to zero, emitting
+ a warning in category 'range'.
+
+ The hyphenation margin is available in the '.hym' read-only
+ register.
+
+ -- Request: .hys [hyphenation-space]
+ -- Register: \n[.hys]
+ Suppress hyphenation of the line in adjustment modes 'b' or 'n' if
+ it can be justified by adding no more than HYPHENATION-SPACE extra
+ space to each inter-word space. Without an argument, the
+ hyphenation space adjustment threshold is set to its default value,
+ 0. The default scaling unit is 'm'. The hyphenation space
+ adjustment threshold is associated with the environment (*note
+ Environments::).
+
+ A negative argument resets the hyphenation space adjustment
+ threshold to zero, emitting a warning in category 'range'.
+
+ The hyphenation space adjustment threshold is available in the
+ '.hys' read-only register.
+
+ (1) Whether a perfect algorithm for this application is even possible
+is an unsolved problem in computer science:
+<https://tug.org/docs/liang/liang-thesis.pdf>.
+
+ (2) '\%' itself stops marking hyphenation points but still produces
+no output glyph.
+
+ (3) "Soft" because it appears in output only where a hyphenation
+break is performed; a "hard" hyphen, as in "long-term", always appears.
+
+ (4) The mode is a vector of Booleans encoded as an integer. To a
+programmer, this fact is easily deduced from the exclusive use of powers
+of two for the configuration parameters; they are computationally easy
+to "mask off" and compare to zero. To almost everyone else, the
+arrangement seems recondite and unfriendly.
+
+ (5) Hyphenation is prevented if the next page location trap is closer
+to the vertical drawing position than the next text baseline would be.
+*Note Page Location Traps::.
+
+ (6) For more on localization, see the 'groff_tmac(5)' man page.
+
+5.11 Manipulating Spacing
+=========================
+
+A break causes the formatter to update the vertical drawing position at
+which the new text baseline is aligned. You can alter this location.
+
+ -- Request: .sp [distance]
+ Break and move the next text baseline down by DISTANCE, or until
+ springing a page location trap.(1) (*note Manipulating
+ Spacing-Footnote-1::) If invoked with the no-break control
+ character, 'sp' moves the pending output line's text baseline by
+ DISTANCE. A negative DISTANCE will not reduce the position of the
+ text baseline below zero. Inside a diversion, any DISTANCE
+ argument is ignored. The default scaling unit is 'v'. If DISTANCE
+ is not specified, '1v' is assumed.
+
+ .pl 5v \" Set page length to 5 vees.
+ .de xx
+ \-\-\-
+ . br
+ ..
+ .wh 0 xx \" Set a trap at the top of the page.
+ foo on page \n%
+ .sp 2v
+ bar on page \n%
+ .sp 50v \" This will cause a page break.
+ baz on page \n%
+ .pl \n(nlu \" Truncate page to current position.
+ => ---
+ => foo on page 1
+ =>
+ =>
+ => bar on page 1
+ => ---
+ => baz on page 2
+
+ You might use the following macros to set the baseline of the next
+ output text at a given distance from the top or the bottom of the
+ page. We subtract one line height ('\n[.v]') because the '|'
+ operator moves to one vee below the page top (recall *note Numeric
+ Expressions::).
+
+ .de y-from-top-down
+ . sp |\\$1-\\n[.v]u
+ ..
+ .
+ .de y-from-bot-up
+ . sp |\\n[.p]u-\\$1-\\n[.v]u
+ ..
+
+ A call to '.y-from-bot-up 10c' means that the next text baseline
+ will be 10 cm from the bottom edge of the paper.
+
+ -- Request: .ls [count]
+ -- Register: \n[.L]
+ Set the line spacing; add COUNT-1 blank lines after each line of
+ text. With no argument, GNU 'troff' uses the previous value before
+ the last 'ls' call. The default is '1'.
+
+ The read-only register '.L' contains the current line spacing; it
+ is associated with the environment (*note Environments::).
+
+ The 'ls' request is a coarse mechanism. *Note Changing the Type
+Size::, for the requests 'vs' and 'pvs' as alternatives to 'ls'.
+
+ -- Escape sequence: \x'spacing'
+ -- Register: \n[.a]
+ Sometimes, an output line requires additional vertical spacing, for
+ instance to allow room for a tall construct like an inline equation
+ with exponents or subscripts (particularly if they are iterated).
+ The '\x' escape sequence takes a delimited measurement (like
+ '\x'3p'') to increase the vertical spacing of the pending output
+ line. The default scaling unit is 'v'. If the measurement is
+ positive, extra vertical space is inserted below the current line;
+ a negative measurement adds space above. If '\x' is applied to the
+ pending output line multiple times, the maxima of the positive and
+ negative adjustments are separately applied. The delimiter need
+ not be a neutral apostrophe; see *note Delimiters::.
+
+ The '.a' read-only register contains the extra vertical spacing
+ _after_ the text baseline of the most recently emitted output line.
+ (In other words, it is the largest positive argument to '\x'
+ encountered on that line.) This quantity is exposed via a register
+ because if an output line requires this "extra post-vertical line
+ spacing", and the subsequent output line requires "extra
+ pre-vertical line spacing" (a negative argument to '\x'), then
+ applying both can lead to excessive spacing between the output
+ lines. Text that is piling high on line N might not require (as
+ much) extra pre-vertical line spacing if line N-1 carries extra
+ post-vertical line spacing.
+
+ Use of '\x' can be necessary in combination with the
+ bracket-building escape sequence '\b',(2) (*note Manipulating
+ Spacing-Footnote-2::) as the following example shows.
+
+ .nf
+ This is a test of \[rs]b (1).
+ This is a test of \[rs]b (2).
+ This is a test of \b'xyz'\x'-1m'\x'1m' (3).
+ This is a test of \[rs]b (4).
+ This is a test of \[rs]b (5).
+ => This is a test of \b (1).
+ => This is a test of \b (2).
+ => x
+ => This is a test of y (3).
+ => z
+ => This is a test of \b (4).
+ => This is a test of \b (5).
+
+Without '\x', the backslashes on the lines marked '(2)' and '(4)' would
+be overprinted.
+
+ -- Request: .ns
+ -- Request: .rs
+ -- Register: \n[.ns]
+ Enable "no-space mode". Vertical spacing, whether by 'sp' requests
+ or blank input lines, is disabled. The 'bp' request to advance to
+ the next page is also disabled, unless it is accompanied by a page
+ number (*note Page Control::). No-space mode ends automatically
+ when text(3) (*note Manipulating Spacing-Footnote-3::) is formatted
+ for output (4) (*note Manipulating Spacing-Footnote-4::) or the
+ 'rs' request is invoked, which ends no-space mode. The read-only
+ register '.ns' interpolates a Boolean value indicating the
+ enablement of no-space mode.
+
+ A paragraphing macro might ordinarily insert vertical space to
+ separate paragraphs. A section heading macro could invoke 'ns' to
+ suppress this spacing for the first paragraph in a section.
+
+ (1) *Note Page Location Traps::.
+
+ (2) *Note Drawing Geometric Objects::.
+
+ (3) or geometric objects; see *note Drawing Geometric Objects::
+
+ (4) to the top-level diversion; see *note Diversions::
+
+5.12 Tabs and Fields
+====================
+
+A tab character (ISO code point 9, EBCDIC code point 5) causes a
+horizontal movement to the next tab stop, if any.
+
+ -- Escape sequence: \t
+ Interpolate a tab in copy mode; see *note Copy Mode::.
+
+ -- Request: .ta [[n1 n2 ... nn ]T r1 r2 ... rn]
+ -- Register: \n[.tabs]
+ Change tab stop positions. This request takes a series of tab
+ specifiers as arguments (optionally divided into two groups with
+ the letter 'T') that indicate where each tab stop is to be,
+ overriding any previous settings. The default scaling unit is 'm'.
+ Invoking 'ta' without an argument removes all tab stops. GNU
+ 'troff''s startup value is 'T 0.5i'.
+
+ Tab stops can be specified absolutely--as distances from the left
+ margin. The following example sets six tab stops, one every inch.
+
+ .ta 1i 2i 3i 4i 5i 6i
+
+ Tab stops can also be specified using a leading '+', which means
+ that the specified tab stop is set relative to the previous tab
+ stop. For example, the following is equivalent to the previous
+ example.
+
+ .ta 1i +1i +1i +1i +1i +1i
+
+ GNU 'troff' supports an extended syntax to specify repeating tab
+ stops. These stops appear after a 'T' argument. Their values are
+ always taken as distances relative to the previous tab stop. This
+ is the idiomatic way to specify tab stops at equal intervals in
+ 'groff'. The following is, yet again, the same as the previous
+ examples. It does more, in fact, since it defines an infinite
+ number of tab stops at one-inch intervals.
+
+ .ta T 1i
+
+ Now we are ready to interpret the full syntax given above. The
+ 'ta' request sets tabs at positions N1, N2, ..., NN, then at NN+R1,
+ NN+R2, ..., NN+RN, then at NN+RN+R1, NN+RN+R2, ..., NN+RN+RN, and
+ so on.
+
+ For example, '4c +6c T 3c 5c 2c' is equivalent to '4c 10c 13c 18c
+ 20c 23c 28c 30c ...'.
+
+ Text written to a tab column (i.e., between two tab stops, or
+ between a tab stop and an output line boundary) may be aligned to
+ the right or left, or centered in the column. This alignment is
+ determined by appending 'R', 'L', or 'C' to the tab specifier. The
+ default is 'L'.
+
+ .ta 1i 2iC 3iR
+
+ The beginning of an output line is not a tab stop; the text that
+ begins an output line is placed according to the configured
+ alignment and indentation; see *note Manipulating Filling and
+ Adjustment:: and *note Line Layout::.
+
+ A tab stop is converted into a non-breakable horizontal movement
+ that cannot be adjusted.
+
+ .ll 2i
+ .ds foo a\tb\tc
+ .ta T 1i
+ \*[foo]
+ error-> warning: cannot break line
+ => a b c
+
+ The above creates a single output line that is a bit longer than
+ two inches (we use a string to show exactly where the tab stops
+ are). Now consider the following.
+
+ .ll 2i
+ .ds bar a\tb c\td
+ .ta T 1i
+ \*[bar]
+ error-> warning: cannot adjust line
+ => a b
+ => c d
+
+ GNU 'troff' first converts the line's tab stops into unbreakable
+ horizontal movements, then breaks after 'b'. This usually isn't
+ what you want.
+
+ Superfluous tab characters--those that do not correspond to a tab
+ stop--are ignored except for the first, which delimits the
+ characters belonging to the last tab stop for right-alignment or
+ centering.
+
+ .ds Z foo\tbar\tbaz
+ .ds ZZ foo\tbar\tbazqux
+ .ds ZZZ foo\tbar\tbaz\tqux
+ .ta 2i 4iR
+ \*[Z]
+ .br
+ \*[ZZ]
+ .br
+ \*[ZZZ]
+ .br
+ => foo bar baz
+ => foo bar bazqux
+ => foo bar bazqux
+
+ The first line right-aligns "baz" within the second tab stop. The
+ second line right-aligns "bazqux" within it. The third line
+ right-aligns only "baz" because of the additional tab character,
+ which marks the end of the text occupying the last tab stop
+ defined.
+
+ Tab stops are associated with the environment (*note
+ Environments::).
+
+ The read-only register '.tabs' contains a string representation of
+ the current tab settings suitable for use as an argument to the
+ 'ta' request.(1) (*note Tabs and Fields-Footnote-1::)
+
+ .ds tab-string \n[.tabs]
+ \*[tab-string]
+ => T120u
+
+ -- Request: .tc [c]
+ Set the tab repetition character to the ordinary or special
+ character C; normally, no glyph is written when moving to a tab
+ stop (and some output devices may output space characters to
+ achieve this motion). A "tab repetition character" causes the
+ formatter to write as many instances of C as are necessary to
+ occupy the interval from the horizontal drawing position to the
+ next tab stop. With no argument, GNU 'troff' reverts to the
+ default behavior. The tab repetition character is associated with
+ the environment (*note Environments::). Only a single character of
+ C is recognized; any excess is ignored.
+
+ -- Request: .linetabs n
+ -- Register: \n[.linetabs]
+ If N is missing or non-zero, activate "line-tabs"; deactivate it
+ otherwise (the default). Active line-tabs cause GNU 'troff' to
+ compute tab distances relative to the start of the output line
+ instead of the input line.
+
+ .de Tabs
+ . ds x a\t\c
+ . ds y b\t\c
+ . ds z c
+ . ta 1i 3i
+ \\*x
+ \\*y
+ \\*z
+ ..
+ .Tabs
+ .br
+ .linetabs
+ .Tabs
+ => a b c
+ => a b c
+
+ Line-tabs activation is associated with the environment (*note
+ Environments::). The read-only register '.linetabs' interpolates 1
+ if line-tabs are active, and 0 otherwise.
+
+ (1) Plan 9 'troff' uses the register '.S' for this purpose.
+
+5.12.1 Leaders
+--------------
+
+Sometimes it is desirable to fill a tab stop with a given glyph, but
+also use tab stops normally on the same output line. An example is a
+table of contents entry that uses dots to bridge the entry name with its
+page number, which is itself aligned between tab stops. The 'roff'
+language provides "leaders" for this purpose.(1) (*note
+Leaders-Footnote-1::)
+
+ A leader character (ISO and EBCDIC code point 1, also known as SOH or
+"start of heading"), behaves similarly to a tab character: it moves to
+the next tab stop. The difference is that for this movement, the
+default fill character is a period '.'.
+
+ -- Escape sequence: \a
+ Interpolate a leader in copy mode; see *note Copy Mode::.
+
+ -- Request: .lc [c]
+ Set the leader repetition character to the ordinary or special
+ character C. Recall *note Tabs and Leaders::: when encountering a
+ leader character in the input, the formatter writes as many dots
+ '.' as are necessary until reaching the next tab stop; this is the
+ "leader definition character". Omitting C unsets the leader
+ character. With no argument, GNU 'troff' treats leaders the same
+ as tabs. The leader repetition character is associated with the
+ environment (*note Environments::). Only a single C is recognized;
+ any excess is ignored.
+
+ A table of contents, for example, may define tab stops after a
+section number, a title, and a gap to be filled with leader dots. The
+page number follows the leader, after a right-aligned final tab stop
+wide enough to house the largest page number occurring in the document.
+
+ .ds entry1 19.\tThe Prophet\a\t98
+ .ds entry2 20.\tAll Astir\a\t101
+ .ta .5i 4.5i +.5iR
+ .nf
+ \*[entry1]
+ \*[entry2]
+ => 19. The Prophet............................. 98
+ => 20. All Astir............................... 101
+
+ (1) This is pronounced to rhyme with "feeder", and refers to how the
+glyphs "lead" the eye across the page to the corresponding page number
+or other datum.
+
+5.12.2 Fields
+-------------
+
+"Fields" are a more general way of laying out tabular data. A field is
+defined as the data between a pair of "delimiting characters". It
+contains substrings that are separated by "padding characters". The
+width of a field is the distance on the _input_ line from the position
+where the field starts to the next tab stop. A padding character
+inserts an adjustable space similar to TeX's '\hss' command (thus it can
+even be negative) to make the sum of all substring lengths plus the
+adjustable space equal to the field width. If more than one padding
+character is inserted, the available space is evenly distributed among
+them.
+
+ -- Request: .fc [delim-char [padding-char]]
+ Define a delimiting and a padding character for fields. If the
+ latter is missing, the padding character defaults to a space
+ character. If there is no argument at all, the field mechanism is
+ disabled (which is the default). In contrast to, e.g., the tab
+ repetition character, delimiting and padding characters are _not_
+ associated with the environment (*note Environments::).
+
+ .fc # ^
+ .ta T 3i
+ #foo^bar^smurf#
+ .br
+ #foo^^bar^smurf#
+ => foo bar smurf
+ => foo bar smurf
+
+5.13 Character Translations
+===========================
+
+A "translation" is a mapping of an input character to an output glyph.
+The mapping occurs at output time, i.e., the input character gets
+assigned the metric information of the mapped output character right
+before input tokens are converted to nodes (*note Gtroff Internals::,
+for more on this process).
+
+ -- Request: .tr abcd...
+ -- Request: .trin abcd...
+ Translate character A to glyph B, character C to glyph D, and so
+ on. If there is an odd number of characters in the argument, the
+ last one is translated to a fixed-width space (the same one
+ obtained by the '\<SP>' escape sequence).
+
+ The 'trin' request is identical to 'tr', but when you unformat a
+ diversion with 'asciify' it ignores the translation. *Note
+ Diversions::, for details about the 'asciify' request.
+
+ Some notes:
+
+ * Special characters ('\(XX', '\[XXX]', '\C'XXX'', '\'', '\`',
+ '\-', '\_'), glyphs defined with the 'char' request, and
+ numbered glyphs ('\N'XXX'') can be translated also.
+
+ * The '\e' escape can be translated also.
+
+ * Characters can be mapped onto the '\%' and '\~' escape
+ sequences (but '\%' and '\~' can't be mapped onto another
+ glyph).
+
+ * The following characters can't be translated: space (with one
+ exception, see below), backspace, newline, leader (and '\a'),
+ tab (and '\t').
+
+ * Translations are not considered for finding the soft hyphen
+ character set with the 'shc' request.
+
+ * The pair 'C\&' (an arbitrary character C followed by the dummy
+ character) maps this character to "nothing".
+
+ .tr a\&
+ foo bar
+ => foo br
+
+ Even the space character can be mapped to the dummy character.
+
+ .tr aa \&
+ foo bar
+ => foobar
+
+ As shown in the example, the space character can't be the
+ first character/glyph pair as an argument of 'tr'.
+ Additionally, it is not possible to map the space character to
+ any other glyph; requests like '.tr aa x' undo '.tr aa \&'
+ instead.
+
+ If justification is active, lines are justified in spite of
+ the 'empty' space character (but there is no minimal distance,
+ i.e., the space character, between words).
+
+ * After an output glyph has been constructed (this happens at
+ the moment immediately before the glyph is appended to an
+ output glyph list, either by direct output, in a macro,
+ diversion, or string), it is no longer affected by 'tr'.
+
+ * Translating character to glyphs where one of them or both are
+ undefined is possible also; 'tr' does not check whether the
+ elements of its argument exist.
+
+ *Note Gtroff Internals::.
+
+ * Without an argument, the 'tr' request is ignored.
+
+ -- Request: .trnt abcd...
+ 'trnt' is the same as the 'tr' request except that the translations
+ do not apply to text that is transparently throughput into a
+ diversion with '\!'. *Note Diversions::.
+
+ For example,
+
+ .tr ab
+ .di x
+ \!.tm a
+ .di
+ .x
+
+ prints 'b' to the standard error stream; if 'trnt' is used instead
+ of 'tr' it prints 'a'.
+
+5.14 'troff' and 'nroff' Modes
+==============================
+
+Historically, 'nroff' and 'troff' were two separate programs; the former
+for terminal output, the latter for typesetters. GNU 'troff' merges
+both functions into one executable(1) (*note troff and nroff
+Modes-Footnote-1::) that sends its output to a device driver ('grotty'
+for terminal devices, 'grops' for PostScript, and so on) which
+interprets this intermediate output format. When discussing AT&T
+'troff', it makes sense to talk about "'nroff' mode" and "'troff' mode"
+since the differences are hard-coded. GNU 'troff' takes information
+from device and font description files without handling requests
+specially if a terminal output device is used, so such a strong
+distinction is unnecessary.
+
+ Usually, a macro package can be used with all output devices.
+Nevertheless, it is sometimes necessary to make a distinction between
+terminal and non-terminal devices: GNU 'troff' provides two built-in
+conditions 'n' and 't' for the 'if', 'ie', and 'while' requests to
+decide whether GNU 'troff' shall behave like 'nroff' or like 'troff'.
+
+ -- Request: .troff
+ Make the 't' built-in condition true (and the 'n' built-in
+ condition false) for 'if', 'ie', and 'while' conditional requests.
+ This is the default if GNU 'troff' (_not_ 'groff') is started with
+ the '-R' switch to avoid loading of the startup files 'troffrc' and
+ 'troffrc-end'. Without '-R', GNU 'troff' stays in 'troff' mode if
+ the output device is not a terminal (e.g., 'ps').
+
+ -- Request: .nroff
+ Make the 'n' built-in condition true (and the 't' built-in
+ condition false) for 'if', 'ie', and 'while' conditional requests.
+ This is the default if GNU 'troff' uses a terminal output device;
+ the code for switching to 'nroff' mode is in the file 'tty.tmac',
+ which is loaded by the startup file 'troffrc'.
+
+ *Note Conditionals and Loops::, for more details on built-in
+conditions.
+
+ (1) A GNU 'nroff' program is available for convenience; it calls GNU
+'troff' to perform the formatting.
+
+5.15 Line Layout
+================
+
+The following drawing shows the dimensions that 'gtroff' uses for
+placing a line of output onto the page. They are labeled with the
+request that manipulates each dimension.
+
+ -->| in |<--
+ |<-----------ll------------>|
+ +----+----+----------------------+----+
+ | : : : |
+ +----+----+----------------------+----+
+ -->| po |<--
+ |<--------paper width---------------->|
+
+These dimensions are:
+
+'po'
+ "Page offset"--this is the leftmost position of text on the final
+ output, defining the "left margin".
+
+'in'
+ "Indentation"--this is the distance from the left margin where text
+ is printed.
+
+'ll'
+ "Line length"--this is the distance from the left margin to right
+ margin.
+
+ The right margin is not explicitly configured; the combination of
+page offset and line length provides the information necessary to derive
+it.
+
+ A simple demonstration:
+
+ .ll 3i
+ This is text without indentation.
+ The line length has been set to 3\~inches.
+ .in +.5i
+ .ll -.5i
+ Now the left and right margins are both increased.
+ .in
+ .ll
+ Calling .in and .ll without parameters restores
+ the previous values.
+
+ => This is text without indenta-
+ => tion. The line length has
+ => been set to 3 inches.
+ => Now the left and
+ => right margins are
+ => both increased.
+ => Calling .in and .ll without
+ => parameters restores the previ-
+ => ous values.
+
+ -- Request: .po [offset]
+ -- Request: .po +offset
+ -- Request: .po -offset
+ -- Register: \n[.o]
+ Set page offset to OFFSET (or increment or decrement its current
+ value by OFFSET). If invoked without an argument, the page offset
+ is restored to the value before the previous 'po' request. This
+ request does not cause a break; the page offset in effect when an
+ output line is broken prevails (*note Manipulating Filling and
+ Adjustment::). The initial value is 1i and the default scaling
+ unit is 'm'. On terminal devices, the page offset is set to zero
+ by a driver-specific macro file, 'tty.tmac'. The current page
+ offset can be found in the read-only register '.o'. This request
+ is incorrectly documented in the AT&T 'troff' manual as using a
+ default scaling unit of 'v'.
+
+ .po 3i
+ \n[.o]
+ => 720
+ .po -1i
+ \n[.o]
+ => 480
+ .po
+ \n[.o]
+ => 720
+
+ -- Request: .in [indent]
+ -- Request: .in +indent
+ -- Request: .in -indent
+ -- Register: \n[.i]
+ Set indentation to INDENT (or increment or decrement the current
+ value by INDENT). This request causes a break. Initially, there
+ is no indentation.
+
+ If 'in' is called without an argument, the indentation is reset to
+ the previous value before the last call to 'in'. The default
+ scaling unit is 'm'.
+
+ If a negative indentation value is specified (which is not
+ allowed), 'gtroff' emits a warning in category 'range' and sets the
+ indentation to zero.
+
+ The effect of 'in' is delayed until a partially collected line (if
+ it exists) is output. A temporary indentation value is reset to
+ zero also.
+
+ The current indentation (as set by 'in') can be found in the
+ read-only register '.i'. The indentation is associated with the
+ environment (*note Environments::).
+
+ -- Request: .ti offset
+ -- Request: .ti +offset
+ -- Request: .ti -offset
+ -- Register: \n[.in]
+ Temporarily indent the next output line by OFFSET. If an increment
+ or decrement value is specified, adjust the temporary indentation
+ relative to the value set by the 'in' request.
+
+ This request causes a break; its value is associated with the
+ environment (*note Environments::). The default scaling unit is
+ 'm'. A call of 'ti' without an argument is ignored.
+
+ If the total indentation value is negative (which is not allowed),
+ 'gtroff' emits a warning in category 'range' and sets the temporary
+ indentation to zero. 'Total indentation' is either OFFSET if
+ specified as an absolute value, or the temporary plus normal
+ indentation, if OFFSET is given as a relative value.
+
+ The effect of 'ti' is delayed until a partially collected line (if
+ it exists) is output.
+
+ The read-only register '.in' is the indentation that applies to the
+ current output line.
+
+ The difference between '.i' and '.in' is that the latter takes into
+ account whether a partially collected line still uses the old
+ indentation value or a temporary indentation value is active.
+
+ -- Request: .ll [length]
+ -- Request: .ll +length
+ -- Request: .ll -length
+ -- Register: \n[.l]
+ -- Register: \n[.ll]
+ Set the line length to LENGTH (or increment or decrement the
+ current value by LENGTH). Initially, the line length is set to
+ 6.5i. The effect of 'll' is delayed until a partially collected
+ line (if it exists) is output. The default scaling unit is 'm'.
+
+ If 'll' is called without an argument, the line length is reset to
+ the previous value before the last call to 'll'. If a negative
+ line length is specified (which is not allowed), 'gtroff' emits a
+ warning in category 'range' and sets the line length to zero. The
+ line length is associated with the environment (*note
+ Environments::).
+
+ The current line length (as set by 'll') can be found in the
+ read-only register '.l'. The read-only register '.ll' is the line
+ length that applies to the current output line.
+
+ Similar to '.i' and '.in', the difference between '.l' and '.ll' is
+ that the latter takes into account whether a partially collected
+ line still uses the old line length value.
+
+5.16 Line Continuation
+======================
+
+When filling is enabled, input and output line breaks generally do not
+correspond. The 'roff' language therefore distinguishes input and
+output line continuation.
+
+ -- Escape sequence: \<RET>
+ '\<RET>' (a backslash immediately followed by a newline) suppresses
+ the effects of that newline in the input. The next input line thus
+ retains the classification of its predecessor as a control or text
+ line. '\<RET>' is useful for managing line lengths in the input
+ during document maintenance; you can break an input line in the
+ middle of a request invocation, macro call, or escape sequence.
+ Input line continuation is invisible to the formatter, with two
+ exceptions: the '|' operator recognizes the new input line (*note
+ Numeric Expressions::), and the input line counter register '.c' is
+ incremented.
+
+ .ll 50n
+ .de I
+ . ft I
+ . nop \\$*
+ . ft
+ ..
+ Our film class watched
+ .I The Effect of Gamma Rays on Man-in-the-Moon
+ Marigolds. \" whoops, the input line wrapped
+ .br
+ .I My own opus begins on line \n[.c] \
+ and ends on line \n[.c].
+ => Our film class watched The Effect of Gamma Rays on
+ => Man-in-the-Moon Marigolds.
+ => My own opus begins on line 11 and ends on line 12.
+
+ -- Escape sequence: \c
+ -- Register: \n[.int]
+ '\c' continues an output line. Nothing after it on the input line
+ is formatted. In contrast to '\<RET>', a line after '\c' remains a
+ new input line, so a control character is recognized at its
+ beginning. The visual results depend on whether filling is
+ enabled; see *note Manipulating Filling and Adjustment::.
+
+ * If filling is enabled, a word interrupted with '\c' is
+ continued with the text on the next input text line, without
+ an intervening space.
+
+ This is a te\c
+ st.
+ => This is a test.
+
+ * If filling is disabled, the next input text line after '\c' is
+ handled as a continuation of the same input text line.
+
+ .nf
+ This is a \c
+ test.
+ => This is a test.
+
+ An intervening control line that causes a break overrides '\c',
+ flushing out the pending output line in the usual way.
+
+ The '.int' register contains a positive value if the last output
+ line was continued with '\c'; this datum is associated with the
+ environment (*note Environments::).(1) (*note Line
+ Continuation-Footnote-1::)
+
+ (1) Historically, the '\c' escape sequence has proven challenging to
+characterize. Some sources say it "connects the next input text" (to
+the input line on which it appears); others describe it as
+"interrupting" text, on the grounds that a text line is interrupted
+without breaking, perhaps to inject a request invocation or macro call.
+
+5.17 Page Layout
+================
+
+The formatter permits configuration of the page length and page number.
+
+ -- Request: .pl [length]
+ -- Request: .pl +length
+ -- Request: .pl -length
+ -- Register: \n[.p]
+ Change (increase or decrease) the page length per the numeric
+ expression LENGTH. The default scaling unit is 'v'. A negative
+ LENGTH is valid, but an uncommon application: it prevents page
+ location traps from being sprung,(1) (*note Page
+ Layout-Footnote-1::) and each output line is placed on a new page.
+ If LENGTH is invalid, GNU 'troff' emits a warning in category
+ 'number'. If LENGTH is absent or invalid, '11i' is assumed.
+
+ The read-only register '.p' interpolates the current page length.
+
+ -- Request: .pn num
+ -- Request: .pn +num
+ -- Request: .pn -num
+ -- Register: \n[.pn]
+ Change (increase or decrease) the page number of the _next_ page
+ per the numeric expression NUM. If NUM is invalid, GNU 'troff'
+ emits a warning in category 'number' and ignores the request.
+ Without an argument, 'pn' is ignored.
+
+ The read-only register '.pn' interpolates NUM if set by 'pn' on the
+ current page, or the current page number plus 1.
+
+ The formatter offers special support for typesetting headers and
+footers, collectively termed "titles". Titles have an independent line
+length, and their placement on the page is not restricted.
+
+ -- Request: .tl 'left'center'right'
+ Format an output line as a title consisting of LEFT, CENTER, and
+ RIGHT, each aligned accordingly. The delimiter need not be a
+ neutral apostrophe: 'tl' accepts the same delimiters as most escape
+ sequences; see *note Delimiters::. If not used as the delimiter,
+ any "page number character" character is replaced with the current
+ page number; the default is '%'; see the the 'pc' request below.
+ Without an argument, 'tl' is ignored. 'tl' writes the title line
+ immediately, ignoring any partially collected line.
+
+ It is not an error to omit delimiters after the first. For
+ example, '.tl /Thesis' is interpreted as '.tl /Thesis///': it sets
+ a title line comprising only the left-aligned word 'Thesis'.
+
+ -- Request: .lt [length]
+ -- Request: .lt +length
+ -- Request: .lt -length
+ -- Register: \n[.lt]
+ Change (increase or decrease) the line length used by titles per
+ the numeric expression LENGTH. The default scaling unit is 'm'.
+ If LENGTH is negative, GNU emits a warning in category 'range' and
+ treats LENGTH as '0'. If LENGTH is invalid, GNU 'troff' emits a
+ warning in category 'number' and ignores the request. The
+ formatter's default title length is '6.5i'. With no argument, the
+ title length is restored to the previous value. The title length
+ is is associated with the environment (*note Environments::).
+
+ The read-only register '.lt' interpolates the title line length.
+
+ -- Request: .pc [char]
+ Set the page number character to CHAR. With no argument, the page
+ number character is disabled. 'pc' does not affect the
+ register '%'.
+
+ The following example exercises title features.
+
+ .lt 50n
+ This is my partially collected
+ .tl 'Isomers 2023'%'Dextrose Edition'
+ line.
+ => Isomers 2023 1 Dextrose Edition
+ => This is my partially collected line.
+
+ We most often see titles used in page header and footer traps. *Note
+Traps::.
+
+ (1) *Note Traps::.
+
+5.18 Page Control
+=================
+
+Discretionary page breaks can prevent the unwanted separation of
+content. A new page number takes effect during page ejection; see *note
+The Implicit Page Trap::.
+
+ -- Request: .bp [page-number]
+ -- Request: .bp +page-number
+ -- Request: .bp -page-number
+ -- Register: \n[%]
+ Break the page and change (increase or decrease) the next page
+ number per the numeric expression PAGE-NUMBER. If PAGE-NUMBER is
+ invalid, GNU 'troff' emits a warning in category 'number' and
+ ignores the argument. This request causes a break. A page break
+ advances the vertical drawing position to the bottom of the page,
+ springing traps. *Note Page Location Traps::. 'bp' has effect
+ only if invoked within the top-level diversion.(1) (*note Page
+ Control-Footnote-1::) This request is incorrectly documented in the
+ AT&T 'troff' manual as having a default scaling unit of 'v'.
+
+ The register '%' interpolates the current page number.
+
+ .de BP
+ ' bp \" schedule page break once current line is output
+ ..
+
+ -- Request: .ne [space]
+ Force a page break if insufficient vertical space is available
+ (assert "needed" space). 'ne' tests the distance to the next page
+ location trap; see *note Page Location Traps::, and breaks the page
+ if that amount is less than SPACE. The default scaling unit is
+ 'v'. If SPACE is invalid, GNU 'troff' emits a warning in category
+ 'number' and ignores the argument. If SPACE is not specified, '1v'
+ is assumed.
+
+ We can require space for at least the first two output lines of a
+ paragraph, preventing its first line from being widowed at the page
+ bottom.
+
+ .ne 2v
+ Considering how common illness is,
+ how tremendous the spiritual change that it brings,
+ how astonishing,
+ when the lights of health go down,
+ the undiscovered countries that are then disclosed,
+ what wastes and deserts of the soul a slight attack
+ of influenza brings to view,
+
+ This method is reliable only if no output line is pending when 'ne'
+ is invoked. When macro packages are used, this is often not the
+ case: their paragraphing macros perform the break. You may need to
+ experiment with placing the 'ne' after the paragraphing macro, or
+ 'br' and 'ne' before it.
+
+ 'ne' is also useful to force grouping of section headings with
+ their subsequent paragraphs, or tables with their captions and/or
+ explanations. Macro packages often use 'ne' with diversions to
+ implement keeps and displays; see *note Diversions::. They may
+ also offer parameters for widow and orphan management.
+
+ -- Request: .sv [space]
+ -- Request: .os
+ Require vertical space as 'ne' does, but also save it for later
+ output by the 'os' request. If SPACE is available before the next
+ page location trap, it is output immediately. Both requests ignore
+ a partially collected line, taking effect at the next break. 'sv'
+ and 'os' ignore no-space mode (recall *note Manipulating
+ Spacing::). While the 'sv' request allows negative values for
+ SPACE, 'os' ignores them. The default scaling unit is 'v'. If
+ SPACE is not specified, '1v' is assumed.
+
+ -- Register: \n[nl]
+ 'nl' interpolates or sets the vertical drawing position. When the
+ formatter starts, the first page transition hasn't happened yet,
+ and 'nl' is negative. If a header trap has been planted on the
+ page (typically at vertical position '0'), you can assign a
+ negative value to 'nl' to spring it if that page has already
+ started (*note Page Location Traps::).
+
+ .de HD
+ . sp
+ . tl ''Goldbach Solution''
+ . sp
+ ..
+ .
+ First page.
+ .bp
+ .wh 0 HD \" plant header trap at top of page
+ .nr nl (-1)
+ Second page.
+ => First page.
+ =>
+ => (blank lines elided)
+ =>
+ => Goldbach Solution
+ =>
+ => (blank lines elided)
+ =>
+ => Second page.
+
+ Without resetting 'nl' to a negative value, the trap just planted
+ would be active beginning with the _next_ page, not the current
+ one.
+
+ *Note Diversions::, for a comparison of 'nl' with the '.h' and '.d'
+ registers.
+
+ (1) *Note Diversions::.
+
+5.19 Using Fonts
+================
+
+In digital typography, a "font" is a collection of characters in a
+specific typeface that a device can render as glyphs at a desired
+size.(1) (*note Using Fonts-Footnote-1::) A 'roff' formatter can change
+typefaces at any point in the text. The basic faces are a set of
+"styles" combining upright and slanted shapes with normal and heavy
+stroke weights: 'R', 'I', 'B', and 'BI'--these stand for roman, italic,
+bold, and bold-italic. For linguistic text, GNU 'troff' groups
+typefaces into "families" containing each of these styles.(2) (*note
+Using Fonts-Footnote-2::) A "text font" is thus often a family combined
+with a style, but it need not be: consider the 'ps' and 'pdf' devices'
+'ZCMI' (Zapf Chancery Medium italic)--often, no other style of Zapf
+Chancery Medium is provided. On typesetting devices, at least one
+"special font" is available, comprising "unstyled" glyphs for
+mathematical operators and other purposes.
+
+ Like AT&T 'troff', GNU 'troff' does not itself load or manipulate a
+digital font file;(3) (*note Using Fonts-Footnote-3::) instead it works
+with a "font description file" that characterizes it, including its
+glyph repertoire and the "metrics" (dimensions) of each glyph.(4)
+(*note Using Fonts-Footnote-4::) This information permits the formatter
+to accurately place glyphs with respect to each other. Before using a
+font description, the formatter associates it with a "mounting
+position", a place in an ordered list of available typefaces. So that a
+document need not be strongly coupled to a specific font family, in GNU
+'troff' an output device can associate a style in the abstract sense
+with a mounting position. Thus the default family can be combined with
+a style dynamically, producing a "resolved font name".
+
+ Fonts often have trademarked names, and even Free Software fonts can
+require renaming upon modification. 'groff' maintains a convention that
+a device's serif font family is given the name 'T' ("Times"), its
+sans-serif family 'H' ("Helvetica"), and its monospaced family 'C'
+("Courier"). Historical inertia has driven 'groff''s font identifiers
+to short uppercase abbreviations of font names, as with 'TR', 'TI',
+'TB', 'TBI', and a special font 'S'.
+
+ The default family used with abstract styles can be changed at any
+time; initially, it is 'T'. Typically, abstract styles are arranged in
+the first four mounting positions in the order shown above. The default
+mounting position, and therefore style, is always '1' ('R'). By issuing
+appropriate formatter instructions, you can override these defaults
+before your document writes its first glyph.
+
+ Terminal output devices cannot change font families and lack special
+fonts. They support style changes by overstriking, or by altering
+ISO 6429/ECMA-48 "graphic renditions" (character cell attributes).
+
+ (1) Terminals and some output devices have fonts that render at only
+one or two sizes. As examples of the latter, take the 'groff' 'lj4'
+device's Lineprinter, and 'lbp''s Courier and Elite faces.
+
+ (2) Font designers prepare families such that the styles share
+esthetic properties.
+
+ (3) Historically, the fonts 'troff's dealt with were not Free
+Software or, as with the Graphic Systems C/A/T, did not even exist in
+the digital domain.
+
+ (4) *Note Font Description File Format::.
+
+5.19.1 Selecting Fonts
+----------------------
+
+We use "font" to refer to any of several means of identifying a font: by
+mounting position ('3'), by abstract style ('B'), or by its identifier
+('TB').
+
+ -- Request: .ft [font]
+ -- Escape sequence: \ff
+ -- Escape sequence: \f(fn
+ -- Escape sequence: \f[font]
+ -- Register: \n[.fn]
+ The 'ft' request selects the typeface FONT. If the argument is
+ absent or 'P', it selects the previously chosen font. If FONT is a
+ non-negative integer, it is interpreted as mounting position; the
+ font mounted there is selected. If that position refers to an
+ abstract style, it is combined with the default family (see 'fam'
+ and '\F' below) to make a resolved font name. If the mounting
+ position is not a style and no font is mounted there, GNU 'troff'
+ emits a warning in category 'font' and ignores the request.
+
+ If FONT matches a style name, it is combined with the current
+ family to make a resolved font name. Otherwise, FONT is assumed to
+ already be a resolved font name.
+
+ The resolved font name is subject to translation (see request 'ftr'
+ below). Next, the (possibly translated) font name's mounting
+ position is looked up; if not mounted, FONT is sought on the file
+ system as a font description file and, if located, automatically
+ mounted at the next available position (see register '.fp' below).
+ If the font was mounted using an identifier different from its font
+ description file name (see request 'fp' below), that file name is
+ then looked up. If a font description file for the resolved font
+ name is not found, GNU 'troff' emits a warning in category 'font'
+ and ignores the request.
+
+ The '\f' escape sequence is similar, using one-character name (or
+ mounting position) F, two-character name FN, or a name FONT of
+ arbitrary length. '\f[]' selects the previous font. The syntax
+ form '\fP' is supported for backward compatibility, and '\f[P]' for
+ consistency.
+
+ eggs, bacon,
+ .ft I
+ spam,
+ .ft
+ and sausage.
+ .br
+ eggs, bacon, \fIspam,\fP and sausage.
+ => eggs, bacon, spam, and sausage
+ => eggs, bacon, spam, and sausage
+
+ The current and previously selected fonts are properties of the
+ environment (*note Environments::).
+
+ The read-only string-valued register '.fn' contains the resolved
+ font name of the selected font.
+
+ '\f' doesn't produce an input token in GNU 'troff'; it thus can be
+ used in requests that expect a single-character argument. We can
+ assign a font to a margin character as follows (*note
+ Miscellaneous::).
+
+ .mc \f[I]x\f[]
+
+ -- Request: .ftr f [g]
+ Translate font F to font G. Whenever a font named F is referred to
+ in a '\f' escape sequence, in the 'F' and 'S' conditional
+ operators, or in the 'ft', 'ul', 'bd', 'cs', 'tkf', 'special',
+ 'fspecial', 'fp', or 'sty' requests, font G is used. If G is
+ missing or equal to F the translation is undone.
+
+ Font translations cannot be chained.
+
+ .ftr XXX TR
+ .ftr XXX YYY
+ .ft XXX
+ error-> warning: can't find font 'XXX'
+
+ -- Request: .fzoom f [zoom]
+ -- Register: \n[.zoom]
+ Set magnification of font F to factor ZOOM, which must be a
+ non-negative integer multiple of 1/1000th. This request is useful
+ to adjust the optical size of a font in relation to the others. In
+ the example below, font 'CR' is magnified by 10% (the zoom factor
+ is thus 1.1).
+
+ .fam P
+ .fzoom CR 1100
+ .ps 12
+ Palatino and \f[CR]Courier\f[]
+
+ A missing or zero value of ZOOM is the same as a value of 1000,
+ which means no magnification. F must be a resolved font name, not
+ an abstract style.
+
+ The magnification of a font is completely transparent to GNU
+ 'troff'; a change of the zoom factor doesn't cause any effect
+ except that the dimensions of glyphs, (word) spaces, kerns, etc.,
+ of the affected font are adjusted accordingly.
+
+ The zoom factor of the current font is available in the read-only
+ register '.zoom', in multiples of 1/1000th. It returns zero if
+ there is no magnification.
+
+5.19.2 Font Families
+--------------------
+
+To accommodate the wide variety of fonts available, GNU 'troff'
+distinguishes "font families" and "font styles". A resolved font name
+is the catenation of a font family and a style. Selecting an abstract
+style causes GNU 'troff' to combine it with the default font family.
+
+ You can thus compose a document using abstract styles exclusively for
+its body or running text, selecting a specific family only for titles or
+examples, for instance, and change the default family on the command
+line (recall *note Groff Options::).
+
+ Fonts for the devices 'ps', 'pdf', 'dvi', 'lj4', 'lbp', and the X11
+devices support this mechanism. By default, GNU 'troff' uses the Times
+family with the four styles 'R', 'I', 'B', and 'BI'.
+
+ -- Request: .fam [family]
+ -- Register: \n[.fam]
+ -- Escape sequence: \Ff
+ -- Escape sequence: \F(fm
+ -- Escape sequence: \F[family]
+ Set the default font family, used in combination with abstract
+ styles to construct a resolved font name, to FAMILY (one-character
+ name F, two-character name FM). If no argument is given, GNU
+ 'troff' selects the previous font family; if there none, is it
+ falls back to the device's default(1) (*note Font
+ Families-Footnote-1::) or its own ('T').
+
+ The '\F' escape sequence works similarly. In disanalogy to '\f',
+ '\FP' makes 'P' the default family. Use '\F[]' to select the
+ previous default family. The default font family is available in
+ the read-only string-valued register '.fam'; it is associated with
+ the environment (*note Environments::).
+
+ spam, \" startup defaults are T (Times) R (roman)
+ .fam H \" make Helvetica the default family
+ spam, \" family H + style R = HR
+ .ft B \" family H + style B = HB
+ spam,
+ .ft CR \" Courier roman (default family not changed)
+ spam,
+ .ft \" back to Helvetica bold
+ spam,
+ .fam T \" make Times the default family
+ spam, \" family T + style B = TB
+ .ft AR \" font AR (not a style)
+ baked beans,
+ .ft R \" family T + style R = TR
+ and spam.
+
+ '\F' doesn't produce an input token in GNU 'troff'. As a
+ consequence, it can be used in requests like 'mc' (which expects a
+ single character as an argument) to change the font family on the
+ fly.
+
+ .mc \F[P]x\F[]
+
+ -- Request: .sty n style
+ -- Register: \n[.sty]
+ Associate an abstract style STYLE with mounting position N, which
+ must be a non-negative integer. If the requests 'cs', 'bd', 'tkf',
+ 'uf', or 'fspecial' are applied to an abstract style, they are
+ instead applied to the member of the current family corresponding
+ to that style.
+
+ The default family can be set with the '-f' option (*note Groff
+ Options::). The 'styles' command in the 'DESC' file controls which
+ font positions (if any) are initially associated with abstract
+ styles rather than fonts.
+
+ *Caution:* The STYLE argument is not validated. Errors may occur
+ later, when the formatter attempts to construct a resolved font
+ name, or format a character for output.
+
+ .nr BarPos \n[.fp]
+ .sty \n[.fp] Bar
+ .fam Foo
+ .ft \n[BarPos]
+ .tm .f=\n[.f]
+ A
+ error-> error: no font family named 'Foo' exists
+ error-> .f=41
+ error-> error: cannot format glyph: no current font
+
+ When an abstract style has been selected, the read-only
+ string-valued register '.sty' interpolates its name; this datum is
+ associated with the environment (*note Environments::). Otherwise,
+ '.sty' interpolates nothing.
+
+ (1) *Note DESC File Format::.
+
+5.19.3 Font Positions
+---------------------
+
+To support typeface indirection through abstract styles, and for
+compatibility with AT&T 'troff', the formatter maintains a list of font
+"positions" at which fonts required by a document are "mounted". An
+output device's description file 'DESC' typically configures a set of
+pre-mounted fonts; see *note Device and Font Description Files::. A
+font need not be explicitly mounted before it is selected; GNU 'troff'
+will search 'GROFF_FONT_PATH' for it by name and mount it at the first
+free mounting position on demand.
+
+ -- Request: .fp pos id [font-description-file-name]
+ -- Register: \n[.f]
+ -- Register: \n[.fp]
+ Mount a font under the name ID at mounting position POS, a
+ non-negative integer. When the formatter starts up, it reads the
+ output device's description to mount an initial set of faces, and
+ selects font position 1. Position 0 is unused by default. Unless
+ the FONT-DESCRIPTION-FILE-NAME argument is given, ID should be the
+ name of a font description file stored in a directory corresponding
+ to the selected output device. GNU 'troff' does not traverse
+ directories to locate the font description file.
+
+ The optional third argument enables font names to be aliased, which
+ can be necessary in compatibility mode since AT&T 'troff' syntax
+ affords no means of identifying fonts with names longer than two
+ characters, like 'TBI' or 'ZCMI', in a font selection escape
+ sequence. *Note Compatibility Mode::. You can also alias fonts on
+ mounting for convenience or abstraction. (See below regarding the
+ '.fp' register.)
+
+ .fp \n[.fp] SC ZCMI
+ Send a \f(SChand-written\fP thank-you note.
+ .fp \n[.fp] Emph TI
+ .fp \n[.fp] Strong TB
+ Are \f[Emph]these names\f[] \f[Strong]comfortable\f[]?
+
+ 'DESC', 'P', and non-negative integers are not usable as font
+ identifiers.
+
+ The position of the currently selected font (or abstract style) is
+ available in the read-only register '.f'. It is associated with
+ the environment (*note Environments::).
+
+ You can copy the value of '.f' to another register to save it for
+ later use.
+
+ .nr saved-font \n[.f]
+ ... text involving many font changes ...
+ .ft \n[saved-font]
+
+ The index of the next (non-zero) free font position is available in
+ the read-only register '.fp'. Fonts not listed in the 'DESC' file
+ are automatically mounted at position '\n[.fp]' when selected with
+ the 'ft' request or '\f' escape sequence. When mounting a font at
+ a position explicitly with the 'fp' request, this same practice
+ should be followed, although GNU 'troff' does not enforce this
+ strictly.
+
+5.19.4 Using Symbols
+--------------------
+
+A "glyph" is a graphical representation of a "character". While a
+character is an abstraction of semantic information, a glyph is
+something that can be seen on screen or paper. A character has many
+possible representation forms (for example, the character 'A' can be
+written in an upright or slanted typeface, producing distinct glyphs).
+Sometimes, a sequence of characters map to a single glyph: this is a
+"ligature"--the most common is 'fi'.
+
+ Space characters never become glyphs in GNU 'troff'. If not
+discarded (as when trailing on text lines), they are represented by
+horizontal motions in the output.
+
+ A "symbol" is simply a named glyph. Within 'gtroff', all glyph names
+of a particular font are defined in its font file. If the user requests
+a glyph not available in this font, 'gtroff' looks up an ordered list of
+"special fonts". By default, the PostScript output device supports the
+two special fonts 'SS' (slanted symbols) and 'S' (symbols) (the former
+is looked up before the latter). Other output devices use different
+names for special fonts. Fonts mounted with the 'fonts' keyword in the
+'DESC' file are globally available. To install additional special fonts
+locally (i.e., for a particular font), use the 'fspecial' request.
+
+ Here are the exact rules how 'gtroff' searches a given symbol:
+
+ * If the symbol has been defined with the 'char' request, use it.
+ This hides a symbol with the same name in the current font.
+
+ * Check the current font.
+
+ * If the symbol has been defined with the 'fchar' request, use it.
+
+ * Check whether the current font has a font-specific list of special
+ fonts; test all fonts in the order of appearance in the last
+ 'fspecial' call if appropriate.
+
+ * If the symbol has been defined with the 'fschar' request for the
+ current font, use it.
+
+ * Check all fonts in the order of appearance in the last 'special'
+ call.
+
+ * If the symbol has been defined with the 'schar' request, use it.
+
+ * As a last resort, consult all fonts loaded up to now for special
+ fonts and check them, starting with the lowest font number. This
+ can sometimes lead to surprising results since the 'fonts' line in
+ the 'DESC' file often contains empty positions, which are filled
+ later on. For example, consider the following:
+
+ fonts 3 0 0 FOO
+
+ This mounts font 'foo' at font position 3. We assume that 'FOO' is
+ a special font, containing glyph 'foo', and that no font has been
+ loaded yet. The line
+
+ .fspecial BAR BAZ
+
+ makes font 'BAZ' special only if font 'BAR' is active. We further
+ assume that 'BAZ' is really a special font, i.e., the font
+ description file contains the 'special' keyword, and that it also
+ contains glyph 'foo' with a special shape fitting to font 'BAR'.
+ After executing 'fspecial', font 'BAR' is loaded at font
+ position 1, and 'BAZ' at position 2.
+
+ We now switch to a new font 'XXX', trying to access glyph 'foo'
+ that is assumed to be missing. There are neither font-specific
+ special fonts for 'XXX' nor any other fonts made special with the
+ 'special' request, so 'gtroff' starts the search for special fonts
+ in the list of already mounted fonts, with increasing font
+ positions. Consequently, it finds 'BAZ' before 'FOO' even for
+ 'XXX', which is not the intended behaviour.
+
+ *Note Device and Font Description Files::, and *note Special Fonts::,
+for more details.
+
+ The 'groff_char(7)' man page houses a complete list of predefined
+special character names, but the availability of any as a glyph is
+device- and font-dependent. For example, say
+
+ man -Tdvi groff_char > groff_char.dvi
+
+to obtain those available with the DVI device and default font
+configuration.(1) (*note Using Symbols-Footnote-1::) If you want to use
+an additional macro package to change the fonts used, 'groff' (or
+'gtroff') must be run directly.
+
+ groff -Tdvi -mec -man groff_char.7 > groff_char.dvi
+
+ Special character names not listed in 'groff_char(7)' are derived
+algorithmically, using a simplified version of the Adobe Glyph List
+(AGL) algorithm, which is described in
+<https://github.com/adobe-type-tools/agl-aglfn>. The (frozen) set of
+names that can't be derived algorithmically is called the "'groff' glyph
+list (GGL)".
+
+ * A glyph for Unicode character U+XXXX[X[X]], which is not a
+ composite character is named 'uXXXX[X[X]]'. X must be an uppercase
+ hexadecimal digit. Examples: 'u1234', 'u008E', 'u12DB8'. The
+ largest Unicode value is 0x10FFFF. There must be at least four 'X'
+ digits; if necessary, add leading zeroes (after the 'u'). No zero
+ padding is allowed for character codes greater than 0xFFFF.
+ Surrogates (i.e., Unicode values greater than 0xFFFF represented
+ with character codes from the surrogate area U+D800-U+DFFF) are not
+ allowed either.
+
+ * A glyph representing more than a single input character is named
+
+ 'u' COMPONENT1 '_' COMPONENT2 '_' COMPONENT3 ...
+
+ Example: 'u0045_0302_0301'.
+
+ For simplicity, all Unicode characters that are composites must be
+ maximally decomposed to NFD;(2) (*note Using Symbols-Footnote-2::)
+ for example, 'u00CA_0301' is not a valid glyph name since U+00CA
+ (LATIN CAPITAL LETTER E WITH CIRCUMFLEX) can be further decomposed
+ into U+0045 (LATIN CAPITAL LETTER E) and U+0302 (COMBINING
+ CIRCUMFLEX ACCENT). 'u0045_0302_0301' is thus the glyph name for
+ U+1EBE, LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE.
+
+ * groff maintains a table to decompose all algorithmically derived
+ glyph names that are composites itself. For example, 'u0100'
+ (LATIN LETTER A WITH MACRON) is automatically decomposed into
+ 'u0041_0304'. Additionally, a glyph name of the GGL is preferred
+ to an algorithmically derived glyph name; 'groff' also
+ automatically does the mapping. Example: The glyph 'u0045_0302' is
+ mapped to '^E'.
+
+ * glyph names of the GGL can't be used in composite glyph names; for
+ example, '^E_u0301' is invalid.
+
+ -- Escape sequence: \(nm
+ -- Escape sequence: \[name]
+ -- Escape sequence: \[base-glyph combining-component ...]
+ Typeset a special character NAME (two-character name NM) or a
+ composite glyph consisting of BASE-GLYPH overlaid with one or more
+ COMBINING-COMPONENTs. For example, '\[A ho]' is a capital letter
+ "A" with a "hook accent" (ogonek).
+
+ There is no special syntax for one-character names--the analogous
+ form '\N' would collide with other escape sequences. However, the
+ four escape sequences '\'', '\-', '\_', and '\`', are translated on
+ input to the special character escape sequences '\[aa]', '\[-]',
+ '\[ul]', and '\[ga]', respectively.
+
+ A special character name of length one is not the same thing as an
+ ordinary character: that is, the character 'a' is not the same as
+ '\[a]'.
+
+ If NAME is undefined, a warning in category 'char' is produced and
+ the escape is ignored. *Note Warnings::, for information about the
+ enablement and suppression of warnings.
+
+ GNU 'troff' resolves '\[...]' with more than a single component as
+ follows:
+
+ * Any component that is found in the GGL is converted to the
+ 'uXXXX' form.
+
+ * Any component 'uXXXX' that is found in the list of
+ decomposable glyphs is decomposed.
+
+ * The resulting elements are then concatenated with '_' in
+ between, dropping the leading 'u' in all elements but the
+ first.
+
+ No check for the existence of any component (similar to 'tr'
+ request) is done.
+
+ Examples:
+
+ '\[A ho]'
+ 'A' maps to 'u0041', 'ho' maps to 'u02DB', thus the final
+ glyph name would be 'u0041_02DB'. This is not the expected
+ result: the ogonek glyph 'ho' is a spacing ogonek, but for a
+ proper composite a non-spacing ogonek (U+0328) is necessary.
+ Looking into the file 'composite.tmac', one can find
+ '.composite ho u0328', which changes the mapping of 'ho' while
+ a composite glyph name is constructed, causing the final glyph
+ name to be 'u0041_0328'.
+
+ '\[^E u0301]'
+ '\[^E aa]'
+ '\[E a^ aa]'
+ '\[E ^ ']'
+ '^E' maps to 'u0045_0302', thus the final glyph name is
+ 'u0045_0302_0301' in all forms (assuming proper calls of the
+ 'composite' request).
+
+ It is not possible to define glyphs with names like 'A ho' within a
+ 'groff' font file. This is not really a limitation; instead, you
+ have to define 'u0041_0328'.
+
+ -- Escape sequence: \C'xxx'
+ Typeset the glyph of the special character XXX. Normally, it is
+ more convenient to use '\[XXX]', but '\C' has some advantages: it
+ is compatible with AT&T device-independent 'troff' (and therefore
+ available in compatibility mode(3) (*note Using
+ Symbols-Footnote-3::)) and can interpolate special characters with
+ ']' in their names. The delimiter need not be a neutral
+ apostrophe; see *note Delimiters::.
+
+ -- Request: .composite id1 id2
+ Map special character name ID1 to ID2 if ID1 is used in '\[...]'
+ with more than one component. See above for examples. This is a
+ strict rewriting of the special character name; no check is
+ performed for the existence of a glyph for either. A set of
+ default mappings for many accents can be found in the file
+ 'composite.tmac', loaded by the default 'troffrc' at startup.
+
+ -- Escape sequence: \N'n'
+ Typeset the glyph with code N in the current font ('n' is _not_ the
+ input character code). The number N can be any non-negative
+ decimal integer. Most devices only have glyphs with codes between
+ 0 and 255; the Unicode output device uses codes in the range
+ 0-65535. If the current font does not contain a glyph with that
+ code, special fonts are _not_ searched. The '\N' escape sequence
+ can be conveniently used in conjunction with the 'char' request:
+
+ .char \[phone] \f[ZD]\N'37'
+
+ The code of each glyph is given in the fourth column in the font
+ description file after the 'charset' command. It is possible to
+ include unnamed glyphs in the font description file by using a name
+ of '---'; the '\N' escape sequence is the only way to use these.
+
+ No kerning is applied to glyphs accessed with '\N'. The delimiter
+ need not be a neutral apostrophe; see *note Delimiters::.
+
+ A few escape sequences are also special characters.
+
+ -- Escape sequence: \'
+ An escaped neutral apostrophe is a synonym for '\[aa]' (acute
+ accent).
+
+ -- Escape sequence: \`
+ An escaped grave accent is a synonym for '\[ga]' (grave accent).
+
+ -- Escape sequence: \-
+ An escaped hyphen-minus is a synonym for '\[-]' (minus sign).
+
+ -- Escape sequence: \_
+ An escaped underscore ("low line") is a synonym for '\[ul]'
+ (underrule). On typesetting devices, the underrule is
+ font-invariant and drawn lower than the underscore '_'.
+
+ -- Request: .cflags n c1 c2 ...
+ Assign properties encoded by the number N to characters C1, C2, and
+ so on.
+
+ Input characters, including special characters introduced by an
+ escape, have certain properties associated with them.(4) (*note
+ Using Symbols-Footnote-4::) These properties can be modified with
+ this request. The first argument is the sum of the desired flags
+ and the remaining arguments are the characters to be assigned those
+ properties. Spaces between the CN arguments are optional. Any
+ argument CN can be a character class defined with the 'class'
+ request rather than an individual character. *Note Character
+ Classes::.
+
+ The non-negative integer N is the sum of any of the following.
+ Some combinations are nonsensical, such as '33' (1 + 32).
+
+ '1'
+ Recognize the character as ending a sentence if followed by a
+ newline or two spaces. Initially, characters '.?!' have this
+ property.
+
+ '2'
+ Enable breaks before the character. A line is not broken at a
+ character with this property unless the characters on each
+ side both have non-zero hyphenation codes. This exception can
+ be overridden by adding 64. Initially, no characters have
+ this property.
+
+ '4'
+ Enable breaks after the character. A line is not broken at a
+ character with this property unless the characters on each
+ side both have non-zero hyphenation codes. This exception can
+ be overridden by adding 64. Initially, characters
+ '\-\[hy]\[em]' have this property.
+
+ '8'
+ Mark the glyph associated with this character as overlapping
+ other instances of itself horizontally. Initially, characters
+ '\[ul]\[rn]\[ru]\[radicalex]\[sqrtex]' have this property.
+
+ '16'
+ Mark the glyph associated with this character as overlapping
+ other instances of itself vertically. Initially, the
+ character '\[br]' has this property.
+
+ '32'
+ Mark the character as transparent for the purpose of
+ end-of-sentence recognition. In other words, an
+ end-of-sentence character followed by any number of characters
+ with this property is treated as the end of a sentence if
+ followed by a newline or two spaces. This is the same as
+ having a zero space factor in TeX. Initially, characters
+ '"')]*\[dg]\[dd]\[rq]\[cq]' have this property.
+
+ '64'
+ Ignore hyphenation codes of the surrounding characters. Use
+ this in combination with values 2 and 4 (initially, no
+ characters have this property).
+
+ For example, if you need an automatic break point after the
+ en-dash in numeric ranges like "3000-5000", insert
+
+ .cflags 68 \[en]
+
+ into your document. However, this practice can lead to bad
+ layout if done thoughtlessly; in most situations, a better
+ solution instead of changing the 'cflags' value is to insert
+ '\:' right after the hyphen at the places that really need a
+ break point.
+
+ The remaining values were implemented for East Asian language
+ support; those who use alphabetic scripts exclusively can disregard
+ them.
+
+ '128'
+ Prohibit a line break before the character, but allow a line
+ break after the character. This works only in combination
+ with flags 256 and 512 and has no effect otherwise.
+ Initially, no characters have this property.
+
+ '256'
+ Prohibit a line break after the character, but allow a line
+ break before the character. This works only in combination
+ with flags 128 and 512 and has no effect otherwise.
+ Initially, no characters have this property.
+
+ '512'
+ Allow line break before or after the character. This works
+ only in combination with flags 128 and 256 and has no effect
+ otherwise. Initially, no characters have this property.
+
+ In contrast to values 2 and 4, the values 128, 256, and 512 work
+ pairwise. If, for example, the left character has value 512, and
+ the right character 128, no break will be automatically inserted
+ between them. If we use value 6 instead for the left character, a
+ break after the character can't be suppressed since the neighboring
+ character on the right doesn't get examined.
+
+ -- Request: .char c [contents]
+ -- Request: .fchar c [contents]
+ -- Request: .fschar f c [contents]
+ -- Request: .schar c [contents]
+ Define a new character or glyph C to be CONTENTS, which can be
+ empty. More precisely, 'char' defines a 'groff' object (or
+ redefines an existing one) that is accessed with the name C on
+ input, and produces CONTENTS on output. Every time glyph C needs
+ to be printed, CONTENTS is processed in a temporary environment and
+ the result is wrapped up into a single object. Compatibility mode
+ is turned off and the escape character is set to '\' while CONTENTS
+ is processed. Any emboldening, constant spacing, or track kerning
+ is applied to this object rather than to individual glyphs in
+ CONTENTS.
+
+ An object defined by these requests can be used just like a normal
+ glyph provided by the output device. In particular, other
+ characters can be translated to it with the 'tr' or 'trin'
+ requests; it can be made the leader character with the 'lc'
+ request; repeated patterns can be drawn with it using the '\l' and
+ '\L' escape sequences; and words containing C can be hyphenated
+ correctly if the 'hcode' request is used to give the object a
+ hyphenation code.
+
+ There is a special anti-recursion feature: use of the object within
+ its own definition is handled like a normal character (not defined
+ with 'char').
+
+ The 'tr' and 'trin' requests take precedence if 'char' accesses the
+ same symbol.
+
+ .tr XY
+ X
+ => Y
+ .char X Z
+ X
+ => Y
+ .tr XX
+ X
+ => Z
+
+ The 'fchar' request defines a fallback glyph: 'gtroff' only checks
+ for glyphs defined with 'fchar' if it cannot find the glyph in the
+ current font. 'gtroff' carries out this test before checking
+ special fonts.
+
+ 'fschar' defines a fallback glyph for font F: 'gtroff' checks for
+ glyphs defined with 'fschar' after the list of fonts declared as
+ font-specific special fonts with the 'fspecial' request, but before
+ the list of fonts declared as global special fonts with the
+ 'special' request.
+
+ Finally, the 'schar' request defines a global fallback glyph:
+ 'gtroff' checks for glyphs defined with 'schar' after the list of
+ fonts declared as global special fonts with the 'special' request,
+ but before the already mounted special fonts.
+
+ *Note Character Classes::.
+
+ -- Request: .rchar c ...
+ -- Request: .rfschar f c ...
+ Remove definition of each ordinary or special character C, undoing
+ the effect of a 'char', 'fchar', or 'schar' request. Those
+ supplied by font description files cannot be removed. Spaces and
+ tabs may separate C arguments.
+
+ The request 'rfschar' removes glyph definitions defined with
+ 'fschar' for font F.
+
+ (1) Not all versions of the 'man' program support the '-T' option;
+use the subsequent example for an alternative.
+
+ (2) This is "Normalization Form D" as documented in Unicode Standard
+Annex #15 (<https://unicode.org/reports/tr15/>).
+
+ (3) *Note Compatibility Mode::.
+
+ (4) Output glyphs don't--to GNU 'troff', a glyph is simply a box with
+an index into a font, a given height above and depth below the baseline,
+and a width.
+
+5.19.5 Character Classes
+------------------------
+
+Classes are particularly useful for East Asian languages such as
+Chinese, Japanese, and Korean, where the number of needed characters is
+much larger than in European languages, and where large sets of
+characters share the same properties.
+
+ -- Request: .class name c1 c2 ...
+ Define a character class (or simply "class") NAME comprising the
+ characters C1, C2, and so on.
+
+ A class thus defined can then be referred to in lieu of listing all
+ the characters within it. Currently, only the 'cflags' request can
+ handle references to character classes.
+
+ In the request's simplest form, each CN is a character (or special
+ character).
+
+ .class [quotes] ' \[aq] \[dq] \[oq] \[cq] \[lq] \[rq]
+
+ Since class and glyph names share the same name space, it is
+ recommended to start and end the class name with '[' and ']',
+ respectively, to avoid collisions with existing character names
+ defined by GNU 'troff' or the user (with 'char' and related
+ requests). This practice applies the presence of ']' in the class
+ name to prevent the use of the special character escape form
+ '\[...]', thus you must use the '\C' escape to access a class with
+ such a name.
+
+ You can also use a character range notation consisting of a start
+ character followed by '-' and then an end character. Internally,
+ GNU 'troff' converts these two symbol names to Unicode code points
+ (according to the 'groff' glyph list [GGL]), which then give the
+ start and end value of the range. If that fails, the class
+ definition is skipped.
+
+ Furthermore, classes can be nested.
+
+ .class [prepunct] , : ; > }
+ .class [prepunctx] \C'[prepunct]' \[u2013]-\[u2016]
+
+ The class '[prepunctx]' thus contains the contents of the class
+ '[prepunct]' as defined above (the set ', : ; > }'), and characters
+ in the range between 'U+2013' and 'U+2016'.
+
+ If you want to include '-' in a class, it must be the first
+ character value in the argument list, otherwise it gets
+ misinterpreted as part of the range syntax.
+
+ It is not possible to use class names as end points of range
+ definitions.
+
+ A typical use of the 'class' request is to control line-breaking
+ and hyphenation rules as defined by the 'cflags' request. For
+ example, to inhibit line breaks before the characters belonging to
+ the 'prepunctx' class defined in the previous example, you can
+ write the following.
+
+ .cflags 2 \C'[prepunctx]'
+
+ See the 'cflags' request in *note Using Symbols::, for more
+ details.
+
+5.19.6 Special Fonts
+--------------------
+
+Special fonts are those that 'gtroff' searches when it cannot find the
+requested glyph in the current font. The Symbol font is usually a
+special font.
+
+ 'gtroff' provides the following two requests to add more special
+fonts. *Note Using Symbols::, for a detailed description of the glyph
+searching mechanism in 'gtroff'.
+
+ Usually, only non-TTY devices have special fonts.
+
+ -- Request: .special [s1 s2 ...]
+ -- Request: .fspecial f [s1 s2 ...]
+ Use the 'special' request to define special fonts. Initially, this
+ list is empty.
+
+ Use the 'fspecial' request to designate special fonts only when
+ font F is active. Initially, this list is empty.
+
+ Previous calls to 'special' or 'fspecial' are overwritten; without
+ arguments, the particular list of special fonts is set to empty.
+ Special fonts are searched in the order they appear as arguments.
+
+ All fonts that appear in a call to 'special' or 'fspecial' are
+ loaded.
+
+ *Note Using Symbols::, for the exact search order of glyphs.
+
+5.19.7 Artificial Fonts
+-----------------------
+
+There are a number of requests and escape sequences for artificially
+creating fonts. These are largely vestiges of the days when output
+devices did not have a wide variety of fonts, and when 'nroff' and
+'troff' were separate programs. Most of them are no longer necessary in
+GNU 'troff'. Nevertheless, they are supported.
+
+ -- Escape sequence: \H'height'
+ -- Escape sequence: \H'+height'
+ -- Escape sequence: \H'-height'
+ -- Register: \n[.height]
+ Change (increment, decrement) the height of the current font, but
+ not the width. If HEIGHT is zero, restore the original height.
+ Default scaling unit is 'z'.
+
+ The read-only register '.height' contains the font height as set by
+ '\H'.
+
+ Currently, only the '-Tps' and '-Tpdf' devices support this
+ feature.
+
+ '\H' doesn't produce an input token in GNU 'troff'. As a
+ consequence, it can be used in requests like 'mc' (which expects a
+ single character as an argument) to change the font on the fly:
+
+ .mc \H'+5z'x\H'0'
+
+ In compatibility mode, 'gtroff' behaves differently: If an
+ increment or decrement is used, it is always taken relative to the
+ current type size and not relative to the previously selected font
+ height. Thus,
+
+ .cp 1
+ \H'+5'test \H'+5'test
+
+ prints the word 'test' twice with the same font height (five points
+ larger than the current font size).
+
+ -- Escape sequence: \S'slant'
+ -- Register: \n[.slant]
+ Slant the current font by SLANT degrees. Positive values slant to
+ the right. Only integer values are possible.
+
+ The read-only register '.slant' contains the font slant as set by
+ '\S'.
+
+ Currently, only the '-Tps' and '-Tpdf' devices support this
+ feature.
+
+ '\S' doesn't produce an input token in GNU 'troff'. As a
+ consequence, it can be used in requests like 'mc' (which expects a
+ single character as an argument) to change the font on the fly:
+
+ .mc \S'20'x\S'0'
+
+ This escape is incorrectly documented in the AT&T 'troff' manual;
+ the slant is always set to an absolute value.
+
+ -- Request: .ul [lines]
+ The 'ul' request normally underlines subsequent lines if a TTY
+ output device is used. Otherwise, the lines are printed in italics
+ (only the term 'underlined' is used in the following). The single
+ argument is the quantity of input lines to be underlined; with no
+ argument, the next line is underlined. If LINES is zero or
+ negative, stop the effects of 'ul' (if it was active). Requests
+ and empty lines do not count for computing the number of underlined
+ input lines, even if they produce some output like 'tl'. Lines
+ inserted by macros (e.g., invoked by a trap) do count.
+
+ At the beginning of 'ul', the current font is stored and the
+ underline font is activated. Within the span of a 'ul' request, it
+ is possible to change fonts, but after the last line affected by
+ 'ul' the saved font is restored.
+
+ This number of lines still to be underlined is associated with the
+ environment (*note Environments::). The underline font can be
+ changed with the 'uf' request.
+
+ The 'ul' request does not underline spaces.
+
+ -- Request: .cu [lines]
+ The 'cu' request is similar to 'ul' but underlines spaces as well
+ (if a TTY output device is used).
+
+ -- Request: .uf font
+ Set the underline font (globally) used by 'ul' and 'cu'. By
+ default, this is the font at position 2. FONT can be either a
+ non-negative font position or the name of a font.
+
+ -- Request: .bd font [offset]
+ -- Request: .bd font1 font2 [offset]
+ -- Register: \n[.b]
+ Embolden FONT by overstriking its glyphs offset by OFFSET units
+ minus one.
+
+ Two syntax forms are available.
+
+ * Imitate a bold font unconditionally. The first argument
+ specifies the font to embolden, and the second is the number
+ of basic units, minus one, by which the two glyphs are offset.
+ If the second argument is missing, emboldening is turned off.
+
+ FONT can be either a non-negative font position or the name of
+ a font.
+
+ OFFSET is available in the '.b' read-only register if a
+ special font is active; in the 'bd' request, its default unit
+ is 'u'.
+
+ * Imitate a bold form conditionally. Embolden FONT1 by OFFSET
+ only if font FONT2 is the current font. This request can be
+ issued repeatedly to set up different emboldening values for
+ different current fonts. If the second argument is missing,
+ emboldening is turned off for this particular current font.
+
+ This affects special fonts only (either set up with the
+ 'special' command in font files or with the 'fspecial'
+ request).
+
+ -- Request: .cs font [width [em-size]]
+ Switch to and from "constant glyph space mode". If activated, the
+ width of every glyph is WIDTH/36 ems. The em size is given
+ absolutely by EM-SIZE; if this argument is missing, the em value is
+ taken from the current font size (as set with the 'ps' request)
+ when the font is effectively in use. Without second and third
+ argument, constant glyph space mode is deactivated.
+
+ Default scaling unit for EM-SIZE is 'z'; WIDTH is an integer.
+
+5.19.8 Ligatures and Kerning
+----------------------------
+
+Ligatures are groups of characters that are run together, i.e, producing
+a single glyph. For example, the letters 'f' and 'i' can form a
+ligature 'fi' as in the word 'file'. This produces a cleaner look
+(albeit subtle) to the printed output. Usually, ligatures are not
+available in fonts for TTY output devices.
+
+ Most PostScript fonts support the fi and fl ligatures. The C/A/T
+typesetter that was the target of AT&T 'troff' also supported 'ff',
+'ffi', and 'ffl' ligatures. Advanced typesetters or 'expert' fonts may
+include ligatures for 'ft' and 'ct', although GNU 'troff' does not
+support these (yet).
+
+ Only the current font is checked for ligatures and kerns; neither
+special fonts nor special charcters defined with the 'char' request (and
+its siblings) are taken into account.
+
+ -- Request: .lg [flag]
+ -- Register: \n[.lg]
+ Switch the ligature mechanism on or off; if the parameter is
+ non-zero or missing, ligatures are enabled, otherwise disabled.
+ Default is on. The current ligature mode can be found in the
+ read-only register '.lg' (set to 1 or 2 if ligatures are enabled,
+ 0 otherwise).
+
+ Setting the ligature mode to 2 enables the two-character ligatures
+ (fi, fl, and ff) and disables the three-character ligatures (ffi
+ and ffl).
+
+ "Pairwise kerning" is another subtle typesetting mechanism that
+modifies the distance between a glyph pair to improve readability. In
+most cases (but not always) the distance is decreased. Typewriter-like
+fonts and fonts for terminals where all glyphs have the same width don't
+use kerning.
+
+ -- Request: .kern [flag]
+ -- Register: \n[.kern]
+ Switch kerning on or off. If the parameter is non-zero or missing,
+ enable pairwise kerning, otherwise disable it. The read-only
+ register '.kern' is set to 1 if pairwise kerning is enabled,
+ 0 otherwise.
+
+ If the font description file contains pairwise kerning information,
+ glyphs from that font are kerned. Kerning between two glyphs can
+ be inhibited by placing '\&' between them: 'V\&A'.
+
+ *Note Font Description File Format::.
+
+ "Track kerning" expands or reduces the space between glyphs. This
+can be handy, for example, if you need to squeeze a long word onto a
+single line or spread some text to fill a narrow column. It must be
+used with great care since it is usually considered bad typography if
+the reader notices the effect.
+
+ -- Request: .tkf f s1 n1 s2 n2
+ Enable track kerning for font F. If the current font is F the
+ width of every glyph is increased by an amount between N1 and N2
+ (N1, N2 can be negative); if the current type size is less than or
+ equal to S1 the width is increased by N1; if it is greater than or
+ equal to S2 the width is increased by N2; if the type size is
+ greater than or equal to S1 and less than or equal to S2 the
+ increase in width is a linear function of the type size.
+
+ The default scaling unit is 'z' for S1 and S2, 'p' for N1 and N2.
+
+ The track kerning amount is added even to the rightmost glyph in a
+ line; for large values it is thus recommended to increase the line
+ length by the same amount to compensate.
+
+5.19.9 Italic Corrections
+-------------------------
+
+When typesetting adjacent glyphs from typefaces of different slants, the
+space between them may require adjustment.
+
+ -- Escape sequence: \/
+ Apply an "italic correction": modify the spacing of the preceding
+ glyph so that the distance between it and the following glyph is
+ correct if the latter is of upright shape. For example, if an
+ italic 'f' is followed immediately by a roman right parenthesis,
+ then in many fonts the top right portion of the 'f' overlaps the
+ top left of the right parenthesis, which is ugly. Use this escape
+ sequence whenever an oblique glyph is immediately followed by an
+ upright glyph without any intervening space.
+
+ -- Escape sequence: \,
+ Apply a "left italic correction": modify the spacing of the
+ following glyph so that the distance between it and the preceding
+ glyph is correct if the latter is of upright shape. For example,
+ if a roman left parenthesis is immediately followed by an
+ italic 'f', then in many fonts the bottom left portion of the 'f'
+ overlaps the bottom of the left parenthesis, which is ugly. Use
+ this escape sequence whenever an upright glyph is followed
+ immediately by an oblique glyph without any intervening space.
+
+5.19.10 Dummy Characters
+------------------------
+
+As discussed in *note Requests and Macros::, the first character on an
+input line is treated specially. Further, formatting a glyph has many
+consequences on formatter state (*note Environments::). Occasionally,
+we want to escape this context or embrace some of those consequences
+without actually rendering a glyph to the output.
+
+ -- Escape sequence: \&
+ Interpolate a dummy character, which is constitutive of output but
+ invisible.(1) (*note Dummy Characters-Footnote-1::) Its presence
+ alters the interpretation context of a subsequent input character,
+ and enjoys several applications.
+
+ * Prevent insertion of extra space after an end-of-sentence
+ character.
+
+ Test.
+ Test.
+ => Test. Test.
+ Test.\&
+ Test.
+ => Test. Test.
+
+ * Prevent recognition of a control character.
+
+ .Test
+ error-> warning: macro 'Test' not defined
+ \&.Test
+ => .Test
+
+ * Prevent kerning between two glyphs.
+
+ * Translate a character to "nothing".
+
+ .tr JIjiK\&k\&UVuv
+ Post universitum, alea jacta est, OK?
+ => Post vniversitvm, alea iacta est, O?
+
+ The dummy character escape sequence sees use in macro definitions
+ as a means of ensuring that arguments are treated as text even if
+ they begin with spaces or control characters.
+
+ .de HD \" typeset a simple bold heading
+ . sp
+ . ft B
+ \&\\$1 \" exercise: remove the \&
+ . ft
+ . sp
+ ..
+ .HD .\|.\|.\|surprised?
+
+ One way to think about the dummy character is to imagine placing the
+symbol '&' in the input at a certain location; if doing so has all the
+side effects on formatting that you desire except for sticking an ugly
+ampersand in the midst of your text, the dummy character is what you
+want in its place.
+
+ -- Escape sequence: \)
+ Interpolate a transparent dummy character--one that is transparent
+ to end-of-sentence detection. It behaves as '\&', except that '\&'
+ is treated as letters and numerals normally are after '.', '?' and
+ '!'; '\&' cancels end-of-sentence detection, and '\)' does not.
+
+ .de Suffix-&
+ . nop \&\\$1
+ ..
+ .
+ .de Suffix-)
+ . nop \)\\$1
+ ..
+ .
+ Here's a sentence.\c
+ .Suffix-& '
+ Another one.\c
+ .Suffix-) '
+ And a third.
+ => Here's a sentence.' Another one.' And a third.
+
+ (1) Opinions of this escape sequence's name abound. "Zero-width
+space" is a popular misnomer: 'roff' formatters do not treat it like a
+space. Ossanna called it a "non-printing, zero-width character", but
+the character causes _output_ even though it does not "print". If no
+output line is pending, the dummy character starts one. Contrast an
+empty input document with one containing only '\&'. The former produces
+no output; the latter, a blank page.
+
+5.20 Manipulating Type Size and Vertical Spacing
+================================================
+
+These concepts were introduced in *note Page Geometry::. The height of
+a font's tallest glyph is one em, which is equal to the type size in
+points.(1) (*note Manipulating Type Size and Vertical
+Spacing-Footnote-1::) A vertical spacing of less than 120% of the type
+size can make a document hard to read. Larger proportions can be useful
+to spread the text for annotations or proofreader's marks. By default,
+GNU 'troff' uses 10 point type on 12 point spacing. Typographers call
+the difference between type size and vertical spacing "leading".(2)
+(*note Manipulating Type Size and Vertical Spacing-Footnote-2::)
+
+ (1) In text fonts, the tallest glyphs are typically parentheses.
+Unfortunately, in many cases the actual dimensions of the glyphs in a
+font do not closely match its declared type size! For example, in the
+standard PostScript font families, 10-point Times sets better with
+9-point Helvetica and 11-point Courier than if all three were used at
+10 points.
+
+ (2) Rhyme with "sledding"; mechanical typography used lead metal
+(Latin _plumbum_).
+
+5.20.1 Changing the Type Size
+-----------------------------
+
+ -- Request: .ps [size]
+ -- Request: .ps +size
+ -- Request: .ps -size
+ -- Escape sequence: \ssize
+ -- Register: \n[.s]
+ Use the 'ps' request or the '\s' escape sequence to change
+ (increase, decrease) the type size (in scaled points). Specify
+ SIZE as either an absolute type size, or as a relative change from
+ the current size. 'ps' with no argument restores the previous
+ size. The 'ps' request's default scaling unit is 'z'. The
+ requested size is rounded to the nearest valid size (with ties
+ rounding down) within the limits supported by the device. If the
+ requested size is non-positive, it is treated as 1u.
+
+ Type size alteration is incorrectly documented in the AT&T 'troff'
+ manual, which claims "if [the requested size] is invalid, the next
+ larger valid size will result, with a maximum of 36".(1) (*note
+ Changing the Type Size-Footnote-1::)
+
+ The read-only string-valued register '.s' interpolates the type
+ size in points as a decimal fraction; it is associated with the
+ environment (*note Environments::). To obtain the type size in
+ scaled points, interpolate the '.ps' register instead (*note Using
+ Fractional Type Sizes::).
+
+ The '\s' escape sequence supports a variety of syntax forms.
+
+ '\sN'
+ Set the type size to N points. N must be a single digit. If
+ N is 0, restore the previous size.
+
+ '\s+N'
+ '\s-N'
+ Increase or decrease the type size by N points. N must be
+ exactly one digit.
+
+ '\s(NN'
+ Set the type size to NN points. NN must be exactly two
+ digits.
+
+ '\s+(NN'
+ '\s-(NN'
+ '\s(+NN'
+ '\s(-NN'
+ Alter the type size in points by the two-digit value NN.
+
+ *Note Using Fractional Type Sizes::, for further syntactical forms
+ of the '\s' escape sequence that additionally accept decimal
+ fractions.
+
+ snap, snap,
+ .ps +2
+ grin, grin,
+ .ps +2
+ wink, wink, \s+2nudge, nudge,\s+8 say no more!
+ .ps 10
+
+ The '\s' escape sequence affects the environment immediately and
+doesn't produce an input token. Consequently, it can be used in
+requests like 'mc', which expects a single character as an argument, to
+change the type size on the fly.
+
+ .mc \s[20]x\s[0]
+
+ -- Request: .sizes s1 s2 ... sn [0]
+ The 'DESC' file specifies which type sizes are allowed by the
+ output device; see *note DESC File Format::. Use the 'sizes'
+ request to change this set of permissible sizes. Arguments are in
+ scaled points; see *note Using Fractional Type Sizes::. Each can
+ be a single type size (such as '12000'), or a range of sizes (such
+ as '4000-72000'). You can optionally end the list with a '0'.
+
+ (1) The claim appears to have been true of Ossanna 'troff' for the
+C/A/T device; Kernighan made device-independent 'troff' more flexible.
+
+5.20.2 Changing the Vertical Spacing
+------------------------------------
+
+ -- Request: .vs [space]
+ -- Request: .vs +space
+ -- Request: .vs -space
+ -- Register: \n[.v]
+ Set the vertical spacing to, or alter it by, SPACE. The default
+ scaling unit is 'p'. If 'vs' is called without an argument, the
+ vertical spacing is reset to the previous value before the last
+ call to 'vs'. GNU 'troff' emits a warning in category 'range' if
+ SPACE is negative; the vertical spacing is then set to the smallest
+ possible positive value, the vertical motion quantum (as found in
+ the '.V' register).
+
+ '.vs 0' isn't saved in a diversion since it doesn't result in a
+ vertical motion. You must explicitly issue this request before
+ interpolating the diversion.
+
+ The read-only register '.v' contains the vertical spacing; it is
+ associated with the environment (*note Environments::).
+
+When a break occurs, GNU 'troff' performs the following procedure.
+
+ * Move the drawing position vertically by the "extra pre-vertical
+ line space", the minimum of all negative '\x' escape sequence
+ arguments in the pending output line.
+
+ * Move the drawing position vertically by the vertical line spacing.
+
+ * Write out the pending output line.
+
+ * Move the drawing position vertically by the "extra post-vertical
+ line space", the maximum of all positive '\x' escape sequence
+ arguments in the line that has just been output.
+
+ * Move the drawing position vertically by the "post-vertical line
+ spacing" (see below).
+
+ Prefer 'vs' or 'pvs' over 'ls' to produce double-spaced documents.
+'vs' and 'pvs' have finer granularity than 'ls'; moreover, some
+preprocessors assume single spacing. *Note Manipulating Spacing::,
+regarding the '\x' escape sequence and the 'ls' request.
+
+ -- Request: .pvs [space]
+ -- Request: .pvs +space
+ -- Request: .pvs -space
+ -- Register: \n[.pvs]
+ Set the post-vertical spacing to, or alter it by, SPACE. The
+ default scaling unit is 'p'. If 'pvs' is called without an
+ argument, the post-vertical spacing is reset to the previous value
+ before the last call to 'pvs'. GNU 'troff' emits a warning in
+ category 'range' if SPACE is negative; the post-vertical spacing is
+ then set to zero.
+
+ The read-only register '.pvs' contains the post-vertical spacing;
+ it is associated with the environment (*note Environments::).
+
+5.20.3 Using Fractional Type Sizes
+----------------------------------
+
+AT&T 'troff' interpreted all type size measurements in points. Combined
+with integer arithmetic, this design choice made it impossible to
+support, for instance, ten and a half-point type. In GNU 'troff', an
+output device can select a scaling factor that subdivides a point into
+"scaled points". A type size expressed in scaled points can thus
+represent a non-integral type size.
+
+ A "scaled point" is equal to 1/SIZESCALE points, where SIZESCALE is
+specified in the device description file 'DESC', and defaults to 1.(1)
+(*note Using Fractional Type Sizes-Footnote-1::) Requests and escape
+sequences in GNU 'troff' interpret arguments that represent a type size
+in scaled points, which the formatter multiplies by SIZESCALE and
+converts to an integer. Arguments treated in this way comprise those to
+the escape sequences '\H' and '\s', to the request 'ps', the third
+argument to the 'cs' request, and the second and fourth arguments to the
+'tkf' request. Scaled points may be specified explicitly with the 'z'
+scaling unit.
+
+ For example, if SIZESCALE is 1000, then a scaled point is one
+thousandth of a point. The request '.ps 10.5' is synonymous with '.ps
+10.5z' and sets the type size to 10,500 scaled points, or 10.5 points.
+Consequently, in GNU 'troff', the register '.s' can interpolate a
+non-integral type size.
+
+ -- Register: \n[.ps]
+ This read-only register interpolates the type size in scaled
+ points; it is associated with the environment (*note
+ Environments::).
+
+ It makes no sense to use the 'z' scaling unit in a numeric expression
+whose default scaling unit is neither 'u' nor 'z', so GNU 'troff'
+disallows this. Similarly, it is nonsensical to use a scaling unit
+other than 'z' or 'u' in a numeric expression whose default scaling unit
+is 'z', and so GNU 'troff' disallows this as well.
+
+ Another GNU 'troff' scaling unit, 's', multiplies by the number of
+basic units in a scaled point. Thus, '\n[.ps]s' is equal to '1m' by
+definition. Do not confuse the 's' and 'z' scaling units.
+
+ -- Register: \n[.psr]
+ -- Register: \n[.sr]
+ Output devices may be limited in the type sizes they can employ.
+ The '.s' and '.ps' registers represent the type size selected by
+ the output driver as it understands a device's capability. The
+ last _requested_ type size is interpolated in scaled points by the
+ read-only register '.psr' and in points as a decimal fraction by
+ the read-only string-valued register '.sr'. Both are associated
+ with the environment (*note Environments::).
+
+ For example, if a type size of 10.95 points is requested, and the
+ nearest size permitted by a 'sizes' request (or by the 'sizes' or
+ 'sizescale' directives in the device's 'DESC' file) is 11 points,
+ the output driver uses the latter value.
+
+ The '\s' escape sequence offers the following syntax forms that work
+with fractional type sizes and accept scaling units. You may of course
+give them integral arguments. The delimited forms need not use the
+neutral apostrophe; see *note Delimiters::.
+
+'\s[N]'
+'\s'N''
+ Set the type size to N scaled points; N is a numeric expression
+ with a default scaling unit of 'z'.
+
+'\s[+N]'
+'\s[-N]'
+'\s+[N]'
+'\s-[N]'
+'\s'+N''
+'\s'-N''
+'\s+'N''
+'\s-'N''
+ Increase or decrease the type size by N scaled points; N is a
+ numeric expression (which may start with a minus sign) with a
+ default scaling unit of 'z'.
+
+ (1) *Note Device and Font Description Files::.
+
+5.21 Colors
+===========
+
+GNU 'troff' supports color output with a variety of color spaces and up
+to 16 bits per channel. Some devices, particularly terminals, may be
+more limited. When color support is enabled, two colors are current at
+any given time: the "stroke color", with which glyphs, rules (lines),
+and geometric objects like circles and polygons are drawn, and the "fill
+color", which can be used to paint the interior of a closed geometric
+figure.
+
+ -- Request: .color [n]
+ -- Register: \n[.color]
+ If N is missing or non-zero, enable the output of color-related
+ device-independent output commands (this is the default);
+ otherwise, disable them. This request sets a global flag; it does
+ not produce an input token (*note Gtroff Internals::).
+
+ The read-only register '.color' is 1 if colors are enabled,
+ 0 otherwise.
+
+ Color can also be disabled with the '-c' command-line option.
+
+ -- Request: .defcolor ident scheme color-component ...
+ Define a color named IDENT. SCHEME selects a color space and
+ determines the quantity of required COLOR-COMPONENTs; it must be
+ one of 'rgb' (three components), 'cmy' (three), 'cmyk' (four), or
+ 'gray' (one). 'grey' is accepted as a synonym of 'gray'. The
+ color components can be encoded as a single hexadecimal value
+ starting with '#' or '##'. The former indicates that each
+ component is in the range 0-255 (0-FF), the latter the range
+ 0-65,535 (0-FFFF).
+
+ .defcolor half gray #7f
+ .defcolor pink rgb #FFC0CB
+ .defcolor magenta rgb ##ffff0000ffff
+
+ Alternatively, each color component can be specified as a decimal
+ fraction in the range 0-1, interpreted using a default scaling unit
+ of 'f', which multiplies its value by 65,536 (but clamps it at
+ 65,535).
+
+ .defcolor gray50 rgb 0.5 0.5 0.5
+ .defcolor darkgreen rgb 0.1f 0.5f 0.2f
+
+ Each output device has a color named 'default', which cannot be
+redefined. A device's default stroke and fill colors are not
+necessarily the same. For the 'dvi', 'html', 'pdf', 'ps', and 'xhtml'
+output devices, GNU 'troff' automatically loads a macro file defining
+many color names at startup. By the same mechanism, the devices
+supported by 'grotty' recognize the eight standard ISO 6429/EMCA-48
+color names.(1) (*note Colors-Footnote-1::)
+
+ -- Request: .gcolor [color]
+ -- Escape sequence: \mc
+ -- Escape sequence: \m(co
+ -- Escape sequence: \m[color]
+ -- Register: \n[.m]
+ Set the stroke color to COLOR.
+
+ .gcolor red
+ The next words
+ .gcolor
+ \m[red]are in red\m[]
+ and these words are in the previous color.
+
+ The escape sequence '\m[]' restores the previous stroke color, as
+ does a 'gcolor' request without an argument.
+
+ The name of the current stroke color is available in the read-only
+ string-valued register '.m'; it is associated with the environment
+ (*note Environments::). It interpolates nothing when the stroke
+ color is the default.
+
+ '\m' doesn't produce an input token in GNU 'troff' (*note Gtroff
+ Internals::). It therefore can be used in requests like 'mc'
+ (which expects a single character as an argument) to change the
+ color on the fly:
+
+ .mc \m[red]x\m[]
+
+ -- Request: .fcolor [color]
+ -- Escape sequence: \Mc
+ -- Escape sequence: \M(co
+ -- Escape sequence: \M[color]
+ -- Register: \n[.M]
+ Set the fill color for objects drawn with '\D'...'' escape
+ sequences. The escape sequence '\M[]' restores the previous fill
+ color, as does an 'fcolor' request without an argument.
+
+ The name of the current fill color is available in the read-only
+ string-valued register '.M'; it is associated with the environment
+ (*note Environments::). It interpolates nothing when the fill
+ color is the default. '\M' doesn't produce an input token in GNU
+ 'troff'.
+
+ Create an ellipse with a red interior as follows.
+
+ \M[red]\h'0.5i'\D'E 2i 1i'\M[]
+
+ (1) also known vulgarly as "ANSI colors"
+
+5.22 Strings
+============
+
+GNU 'troff' supports strings primarily for user convenience.
+Conventionally, if one would define a macro only to interpolate a small
+amount of text, without invoking requests or calling any other macros,
+one defines a string instead. Only one string is predefined by the
+language.
+
+ -- String: \*[.T]
+ Contains the name of the output device (for example, 'utf8' or
+ 'pdf').
+
+ The 'ds' request creates a string with a specified name and contents
+and the '\*' escape sequence dereferences its name, interpolating its
+contents. If the string named by the '\*' escape sequence does not
+exist, it is defined as empty, nothing is interpolated, and a warning in
+category 'mac' is emitted. *Note Warnings::, for information about the
+enablement and suppression of warnings.
+
+ -- Request: .ds name [contents]
+ -- Request: .ds1 name [contents]
+ -- Escape sequence: \*n
+ -- Escape sequence: \*(nm
+ -- Escape sequence: \*[name [arg1 arg2 ...]]
+ Define a string called NAME with contents CONTENTS. If NAME
+ already exists as an alias, the target of the alias is redefined;
+ see 'als' and 'rm' below. If 'ds' is called with only one
+ argument, NAME is defined as an empty string. Otherwise, GNU
+ 'troff' stores CONTENTS in copy mode.(1) (*note
+ Strings-Footnote-1::)
+
+ The '\*' escape sequence interpolates a previously defined string
+ variable NAME (one-character name N, two-character name NM). The
+ bracketed interpolation form accepts arguments that are handled as
+ macro arguments are; recall *note Calling Macros::. In contrast to
+ macro calls, however, if a closing bracket ']' occurs in a string
+ argument, that argument must be enclosed in double quotes. '\*' is
+ interpreted even in copy mode. When defining strings, argument
+ interpolations must be escaped if they are to reference parameters
+ from the calling context; *Note Parameters::.
+
+ .ds cite (\\$1, \\$2)
+ Gray codes are explored in \*[cite Morgan 1998].
+ => Gray codes are explored in (Morgan, 1998).
+
+ *Caution:* Unlike other requests, the second argument to the 'ds'
+ request consumes the remainder of the input line, including
+ trailing spaces. This means that comments on a line with such a
+ request can introduce unwanted space into a string when they are
+ set off from the material they annotate, as is conventional.
+
+ .ds H2O H\v'+.3m'\s'-2'2\v'-.3m'\s0O \" water
+
+ Instead, place the comment on another line or put the comment
+ escape sequence immediately adjacent to the last character of the
+ string.
+
+ .ds H2O H\v'+.3m'\s'-2'2\v'-.3m'\s0O\" water
+
+ Ending string definitions (and appendments) with a comment, even an
+ empty one, prevents unwanted space from creeping into them during
+ source document maintenance.
+
+ .ds author Alice Pleasance Liddell\"
+ .ds empty \" might be appended to later with .as
+
+ An initial neutral double quote '"' in CONTENTS is stripped to
+ allow embedding of leading spaces. Any other '"' is interpreted
+ literally, but it is wise to use the special character escape
+ sequence '\[dq]' instead if the string might be interpolated as
+ part of a macro argument; see *note Calling Macros::.
+
+ .ds salutation " Yours in a white wine sauce,\"
+ .ds c-var-defn " char mydate[]=\[dq]2020-07-29\[dq];\"
+
+ Strings are not limited to a single input line of text. '\<RET>'
+ works just as it does elsewhere. The resulting string is stored
+ _without_ the newlines. Care is therefore required when
+ interpolating strings while filling is disabled.
+
+ .ds foo This string contains \
+ text on multiple lines \
+ of input.
+
+ It is not possible to embed a newline in a string that will be
+ interpreted as such when the string is interpolated. To achieve
+ that effect, use '\*' to interpolate a macro instead; see *note
+ Punning Names::.
+
+ Because strings are similar to macros, they too can be defined so
+ as to suppress AT&T 'troff' compatibility mode when used; see *note
+ Writing Macros:: and *note Compatibility Mode::. The 'ds1' request
+ defines a string such that compatibility mode is off when the
+ string is later interpolated. To be more precise, a "compatibility
+ save" input token is inserted at the beginning of the string, and a
+ "compatibility restore" input token at the end.
+
+ .nr xxx 12345
+ .ds aa The value of xxx is \\n[xxx].
+ .ds1 bb The value of xxx is \\n[xxx].
+ .
+ .cp 1
+ .
+ \*(aa
+ error-> warning: register '[' not defined
+ => The value of xxx is 0xxx].
+ \*(bb
+ => The value of xxx is 12345.
+
+ -- Request: .as name [contents]
+ -- Request: .as1 name [contents]
+ The 'as' request is similar to 'ds' but appends CONTENTS to the
+ string stored as NAME instead of redefining it. If NAME doesn't
+ exist yet, it is created. If 'as' is called with only one
+ argument, no operation is performed (beyond dereferencing the
+ string).
+
+ .as salutation " with shallots, onions and garlic,\"
+
+ The 'as1' request is similar to 'as', but compatibility mode is
+ switched off when the appended portion of the string is later
+ interpolated. To be more precise, a "compatibility save" input
+ token is inserted at the beginning of the appended string, and a
+ "compatibility restore" input token at the end.
+
+ Several requests exist to perform rudimentary string operations.
+Strings can be queried ('length') and modified ('chop', 'substring',
+'stringup', 'stringdown'), and their names can be manipulated through
+renaming, removal, and aliasing ('rn', 'rm', 'als').
+
+ -- Request: .length reg anything
+ Compute the number of characters of ANYTHING and store the count in
+ the register REG. If REG doesn't exist, it is created. ANYTHING
+ is read in copy mode.
+
+ .ds xxx abcd\h'3i'efgh
+ .length yyy \*[xxx]
+ \n[yyy]
+ => 14
+
+ -- Request: .chop object
+ Remove the last character from the macro, string, or diversion
+ named OBJECT. This is useful for removing the newline from the end
+ of a diversion that is to be interpolated as a string. This
+ request can be used repeatedly on the same OBJECT; see *note Gtroff
+ Internals::, for details on nodes inserted additionally by GNU
+ 'troff'.
+
+ -- Request: .substring str start [end]
+ Replace the string named STR with its substring bounded by the
+ indices START and END, inclusively. The first character in the
+ string has index 0. If END is omitted, it is implicitly set to the
+ largest valid value (the string length minus one). Negative
+ indices count backward from the end of the string: the last
+ character has index -1, the character before the last has index -2,
+ and so on.
+
+ .ds xxx abcdefgh
+ .substring xxx 1 -4
+ \*[xxx]
+ => bcde
+ .substring xxx 2
+ \*[xxx]
+ => de
+
+ -- Request: .stringdown str
+ -- Request: .stringup str
+ Alter the string named STR by replacing each of its bytes with its
+ lowercase ('stringdown') or uppercase ('stringup') version (if one
+ exists). Special characters in the string will often transform in
+ the expected way due to the regular naming convention for accented
+ characters. When they do not, use substrings and/or catenation.
+
+ .ds resume R\['e]sum\['e]
+ \*[resume]
+ .stringdown resume
+ \*[resume]
+ .stringup resume
+ \*[resume]
+ => Résumé résumé RÉSUMÉ
+
+ (In practice, we would end the 'ds' request with a comment escape
+'\"' to prevent space from creeping into the definition during source
+document maintenance.)
+
+ -- Request: .rn old new
+ Rename the request, macro, diversion, or string OLD to NEW.
+
+ -- Request: .rm name
+ Remove the request, macro, diversion, or string NAME. GNU 'troff'
+ treats subsequent invocations as if the name had never been
+ defined.
+
+ -- Request: .als new old
+ Create an alias NEW for the existing request, string, macro, or
+ diversion object named OLD, causing the names to refer to the same
+ stored object. If OLD is undefined, a warning in category 'mac' is
+ produced, and the request is ignored. *Note Warnings::, for
+ information about the enablement and suppression of warnings.
+
+ To understand how the 'als' request works, consider two different
+ storage pools: one for objects (macros, strings, etc.), and another
+ for names. As soon as an object is defined, GNU 'troff' adds it to
+ the object pool, adds its name to the name pool, and creates a link
+ between them. When 'als' creates an alias, it adds a new name to
+ the name pool that gets linked to the same object as the old name.
+
+ Now consider this example.
+
+ .de foo
+ ..
+ .
+ .als bar foo
+ .
+ .de bar
+ . foo
+ ..
+ .
+ .bar
+ error-> input stack limit exceeded (probable infinite
+ error-> loop)
+
+ In the above, 'bar' remains an _alias_--another name for--the
+ object referred to by 'foo', which the second 'de' request
+ replaces. Alternatively, imagine that the 'de' request
+ _dereferences_ its argument before replacing it. Either way, the
+ result of calling 'bar' is a recursive loop that finally leads to
+ an error. *Note Writing Macros::.
+
+ To remove an alias, call 'rm' on its name. The object itself is
+ not destroyed until it has no more names.
+
+ When a request, macro, string, or diversion is aliased,
+ redefinitions and appendments "write through" alias names. To
+ replace an alias with a separately defined object, you must use the
+ 'rm' request on its name first.
+
+ (1) *Note Copy Mode::.
+
+5.23 Conditionals and Loops
+===========================
+
+'groff' has 'if' and 'while' control structures like other languages.
+However, the syntax for grouping multiple input lines in the branches or
+bodies of these structures is unusual.
+
+5.23.1 Operators in Conditionals
+--------------------------------
+
+In 'if', 'ie', and 'while' requests, in addition to the numeric
+expressions described in *note Numeric Expressions::, several Boolean
+operators are available; the members of this expanded class are termed
+"conditional expressions".
+
+'c GLYPH'
+ True if GLYPH is available, where GLYPH is an ordinary character, a
+ special character '\(XX' or '\[XXX]', '\N'XXX'', or has been
+ defined by any of the 'char', 'fchar', 'fschar', or 'schar'
+ requests.
+
+'d NAME'
+ True if a string, macro, diversion, or request called NAME exists.
+
+'e'
+ True if the current page is even-numbered.
+
+'F FONT'
+ True if FONT exists. FONT is handled as if it were opened with the
+ 'ft' request (that is, font translation and styles are applied),
+ without actually mounting it.
+
+'m COLOR'
+ True if COLOR is defined.
+
+'n'
+ True if the document is being processed in 'nroff' mode. *Note
+ troff and nroff Modes::.
+
+'o'
+ True if the current page is odd-numbered.
+
+'r REGISTER'
+ True if REGISTER exists.
+
+'S STYLE'
+ True if STYLE is available for the current font family. Font
+ translation is applied.
+
+'t'
+ True if the document is being processed in 'troff' mode. *Note
+ troff and nroff Modes::.
+
+'v'
+ Always false. This condition is recognized only for compatibility
+ with certain other 'troff' implementations.(1) (*note Operators in
+ Conditionals-Footnote-1::)
+
+ If the first argument to an 'if', 'ie', or 'while' request begins
+with a non-alphanumeric character apart from '!' (see below); it
+performs an output comparison test. (2) (*note Operators in
+Conditionals-Footnote-2::)
+
+''XXX'YYY''
+ True if formatting the comparands XXX and YYY produces the same
+ output commands. The delimiter need not be a neutral apostrophe:
+ the output comparison operator accepts the same delimiters as most
+ escape sequences; see *note Delimiters::. This "output comparison
+ operator" formats XXX and YYY in separate environments; after the
+ comparison, the resulting data are discarded.
+
+ .ie "|"\fR|\fP" true
+ .el false
+ => true
+
+ The resulting glyph properties, including font family, style, size,
+ and slant, must match, but not necessarily the requests and/or
+ escape sequences used to obtain them. In the previous example, '|'
+ and '\fR|\fP' result in '|' glyphs in the same typefaces at the
+ same positions, so the comparands are equal. If '.ft I' had been
+ added before the '.ie', they would differ: the first '|' would
+ produce an italic '|', not a roman one. Motions must match in
+ orientation and magnitude to within the applicable horizontal and
+ vertical motion quanta of the device, after rounding. '.if
+ "\u\d"\v'0'"' is false even though both comparands result in zero
+ net motion, because motions are not interpreted or optimized but
+ sent as-is to the output.(3) (*note Operators in
+ Conditionals-Footnote-3::) On the other hand, '.if "\d"\v'0.5m'"'
+ is true, because '\d' is defined as a downward motion of one-half
+ em.(4) (*note Operators in Conditionals-Footnote-4::)
+
+ Surround the comparands with '\?' to avoid formatting them; this
+ causes them to be compared character by character, as with string
+ comparisons in other programming languages.
+
+ .ie "\?|\?"\?\fR|\fP\?" true
+ .el false
+ => false
+
+ Since comparands protected with '\?' are read in copy mode (*note
+ Copy Mode::), they need not even be valid 'groff' syntax. The
+ escape character is still lexically recognized, however, and
+ consumes the next character.
+
+ .ds a \[
+ .ds b \[
+ .if '\?\*a\?'\?\*b\?' a and b equivalent
+ .if '\?\\?'\?\\?' backslashes equivalent
+ => a and b equivalent
+
+ The above operators can't be combined with most others, but a leading
+'!', not followed immediately by spaces or tabs, complements an
+expression.
+
+ .nr x 1
+ .ie !r x register x is not defined
+ .el register x is defined
+ => register x is defined
+
+ Spaces and tabs are optional immediately after the 'c', 'd', 'F',
+'m', 'r', and 'S' operators, but right after '!', they end the predicate
+and the conditional evaluates true.(5) (*note Operators in
+Conditionals-Footnote-5::)
+
+ .nr x 1
+ .ie ! r x register x is not defined
+ .el register x is defined
+ => r x register x is not defined
+
+The unexpected 'r x' in the output is a clue that our conditional was
+not interpreted as we planned, but matters may not always be so obvious.
+
+ (1) This refers to 'vtroff', a translator that would convert the
+C/A/T output from early-vintage AT&T 'troff' to a form suitable for
+Versatec and Benson-Varian plotters.
+
+ (2) Strictly, letters not otherwise recognized _are_ treated as
+output comparison delimiters. For portability, it is wise to avoid
+using letters not in the list above; for example, Plan 9 'troff' uses
+'h' to test a mode it calls 'htmlroff', and GNU 'troff' may provide
+additional operators in the future.
+
+ (3) Because formatting of the comparands takes place in a dummy
+environment, vertical motions within them cannot spring traps.
+
+ (4) All of this is to say that the lists of output nodes created by
+formatting XXX and YYY must be identical. *Note Gtroff Internals::.
+
+ (5) This bizarre behavior maintains compatibility with AT&T 'troff'.
+
+5.23.2 if-then
+--------------
+
+ -- Request: .if cond-expr anything
+ Evaluate the conditional expression COND-EXPR, and if it evaluates
+ true (or to a positive value), interpret the remainder of the line
+ ANYTHING as if it were an input line. Recall from *note Invoking
+ Requests:: that any quantity of spaces between arguments to
+ requests serves only to separate them; leading spaces in ANYTHING
+ are thus not seen. ANYTHING effectively _cannot_ be omitted; if
+ COND-EXPR is true and ANYTHING is empty, the newline at the end of
+ the control line is interpreted as a blank input line (and
+ therefore a blank text line).
+
+ super\c
+ tanker
+ .nr force-word-break 1
+ super\c
+ .if ((\n[force-word-break] = 1) & \n[.int])
+ tanker
+ => supertanker super tanker
+
+ -- Request: .nop anything
+ Interpret ANYTHING as if it were an input line. This is similar to
+ '.if 1'. 'nop' is not really "no operation"; its argument _is_
+ processed--unconditionally. It can be used to cause text lines to
+ share indentation with surrounding control lines.
+
+ .als real-MAC MAC
+ .de wrapped-MAC
+ . tm MAC: called with arguments \\$@
+ . nop \\*[real-MAC]\\
+ ..
+ .als MAC wrapped-MAC
+ \# Later...
+ .als MAC real-MAC
+
+ In the above, we've used aliasing, 'nop', and the interpolation of
+ a macro as a string to interpose a wrapper around the macro 'MAC'
+ (perhaps to debug it).
+
+5.23.3 if-else
+--------------
+
+ -- Request: .ie cond-expr anything
+ -- Request: .el anything
+ Use the 'ie' and 'el' requests to write an if-then-else. The first
+ request is the "if" part and the latter is the "else" part.
+ Unusually among programming languages, any number of
+ non-conditional requests may be interposed between the 'ie' branch
+ and the 'el' branch.
+
+ .nr a 0
+ .ie \na a is non-zero.
+ .nr a +1
+ .el a was not positive but is now \na.
+ => a was not positive but is now 1.
+
+ Another way in which 'el' is an ordinary request is that it does
+ not lexically "bind" more tightly to its 'ie' counterpart than it
+ does to any other request. This fact can surprise C programmers.
+
+ .nr a 1
+ .nr z 0
+ .ie \nz \
+ . ie \na a is true
+ . el a is false
+ .el z is false
+ error-> warning: unbalanced 'el' request
+ => a is false
+
+ To conveniently nest conditionals, keep reading.
+
+5.23.4 Conditional Blocks
+-------------------------
+
+It is frequently desirable for a control structure to govern more than
+one request, macro call, text line, or a combination of the foregoing.
+The opening and closing brace escape sequences '\{' and '\}' define such
+groups. These "conditional blocks" can furthermore be nested.
+
+ -- Escape sequence: \{
+ -- Escape sequence: \}
+ '\{' begins a conditional block; it must appear (after optional
+ spaces and tabs) immediately subsequent to the conditional
+ expression of an 'if', 'ie', or 'while' request,(1) (*note
+ Conditional Blocks-Footnote-1::) or as the argument to an 'el'
+ request.
+
+ '\}' ends a condition block and should appear on a line with other
+ occurrences of itself as necessary to match '\{' sequences. It can
+ be preceded by a control character, spaces, and tabs. Input after
+ any quantity of '\}' sequences on the same line is processed only
+ if all of the preceding conditions to which they correspond are
+ true. Furthermore, a '\}' closing the body of a 'while' request
+ must be the last such escape sequence on an input line.
+
+ Brace escape sequences outside of control structures have no
+ meaning and produce no output.
+
+ *Caution:* Input lines using '\{' often end with '\RET', especially
+ in macros that consist primarily of control lines. Forgetting to
+ use '\RET' on an input line after '\{' is a common source of error.
+
+ We might write the following in a page header macro. If we delete
+'\RET', the header will carry an unwanted extra empty line (except on
+page 1).
+
+ .if (\\n[%] != 1) \{\
+ . ie ((\\n[%] % 2) = 0) .tl \\*[even-numbered-page-title]
+ . el .tl \\*[odd-numbered-page-title]
+ .\}
+
+ Let us take a closer look at how conditional blocks nest.
+
+ A
+ .if 0 \{ B
+ C
+ D
+ \}E
+ F
+ => A F
+
+ N
+ .if 1 \{ O
+ . if 0 \{ P
+ Q
+ R\} S\} T
+ U
+ => N O U
+
+ The above behavior may challenge the intuition; it was implemented to
+retain compatibility with AT&T 'troff'. For clarity, it is idiomatic to
+end input lines with '\{' (followed by '\<RET>' if appropriate), and to
+precede '\}' on an input line with nothing more than a control
+character, spaces, tabs, and other instances of itself.
+
+ We can use 'ie', 'el', and conditional blocks to simulate the
+multi-way "switch" or "case" control structures of other languages. The
+following example is adapted from the 'groff' 'man' package.
+Indentation is used to clarify the logic.
+
+ .\" Simulate switch/case in roff.
+ . ie '\\$2'1' .ds title General Commands\"
+ .el \{.ie '\\$2'2' .ds title System Calls\"
+ .el \{.ie '\\$2'3' .ds title Library Functions\"
+ .el \{.ie '\\$2'4' .ds title Kernel Interfaces\"
+ .el \{.ie '\\$2'5' .ds title File Formats\"
+ .el \{.ie '\\$2'6' .ds title Games\"
+ .el \{.ie '\\$2'7' .ds title Miscellaneous Information\"
+ .el \{.ie '\\$2'8' .ds title System Management\"
+ .el \{.ie '\\$2'9' .ds title Kernel Development\"
+ .el .ds title \" empty
+ .\}\}\}\}\}\}\}\}
+
+ (1) *Note while::.
+
+5.23.5 while
+------------
+
+'groff' provides a looping construct: the 'while' request. Its syntax
+matches the 'if' request.
+
+ -- Request: .while cond-expr anything
+ Evaluate the conditional expression COND-EXPR, and repeatedly
+ execute ANYTHING unless and until COND-EXPR evaluates false.
+ ANYTHING, which is often a conditional block, is referred to as the
+ 'while' request's "body".
+
+ .nr a 0 1
+ .while (\na < 9) \{\
+ \n+a,
+ .\}
+ \n+a
+ => 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
+
+ GNU 'troff' treats the body of a 'while' request similarly to that
+ of a 'de' request (albeit one not read in copy mode(1) (*note
+ while-Footnote-1::)), but stores it under an internal name and
+ deletes it when the loop finishes. The operation of a macro
+ containing a 'while' request can slow significantly if the 'while'
+ body is large. Each time the macro is executed, the 'while' body
+ is parsed and stored again.
+
+ .de xxx
+ . nr num 10
+ . while (\\n[num] > 0) \{\
+ . \" many lines of code
+ . nr num -1
+ . \}
+ ..
+
+ An often better solution--and one that is more portable, since AT&T
+ 'troff' lacked the 'while' request--is to instead write a recursive
+ macro. It will be parsed only once.(2) (*note while-Footnote-2::)
+
+ .de yyy
+ . if (\\n[num] > 0) \{\
+ . \" many lines of code
+ . nr num -1
+ . yyy
+ . \}
+ ..
+ .
+ .de xxx
+ . nr num 10
+ . yyy
+ ..
+
+ To prevent infinite loops, the default number of available
+ recursion levels is 1,000 or somewhat less.(3) (*note
+ while-Footnote-3::) You can disable this protective measure, or
+ raise the limit, by setting the 'slimit' register. *Note
+ Debugging::.
+
+ As noted above, if a 'while' body begins with a conditional block,
+ its closing brace must end an input line.
+
+ .if 1 \{\
+ . nr a 0 1
+ . while (\n[a] < 10) \{\
+ . nop \n+[a]
+ .\}\}
+ error-> unbalanced brace escape sequences
+
+ -- Request: .break
+ Exit a 'while' loop. Do not confuse this request with a
+ typographical break or the 'br' request.
+
+ -- Request: .continue
+ Skip the remainder of a 'while' loop's body, immediately starting
+ the next iteration.
+
+ (1) *Note Copy Mode::.
+
+ (2) unless you redefine it
+
+ (3) "somewhat less" because things other than macro calls can be on
+the input stack
+
+5.24 Writing Macros
+===================
+
+A "macro" is a stored collection of text and control lines that can be
+interpolated multiple times. Use macros to define common operations.
+Macros are called in the same way that requests are invoked. While
+requests exist for the purpose of creating macros, simply calling an
+undefined macro, or interpolating it as a string, will cause it to be
+defined as empty. *Note Identifiers::.
+
+ -- Request: .de name [end]
+ Define a macro NAME, replacing the definition of any existing
+ request, macro, string, or diversion called NAME. If NAME already
+ exists as an alias, the target of the alias is redefined; recall
+ *note Strings::. GNU 'troff' enters copy mode,(1) (*note Writing
+ Macros-Footnote-1::) storing subsequent input lines as the macro
+ definition. If the optional second argument is not specified, the
+ definition ends with the control line '..' (two dots).
+ Alternatively, END identifies a macro whose call syntax at the
+ start of a control line ends the definition of NAME; END is then
+ called normally. A macro definition must end in the same
+ conditional block (if any) in which it began (*note Conditional
+ Blocks::). Spaces or tabs are permitted after the control
+ character in the line containing this ending token (either '.' or
+ 'END'), but a tab immediately after the token prevents its
+ recognition as the end of a macro definition. The macro END can be
+ called with arguments.(2) (*note Writing Macros-Footnote-2::)
+
+ Here is a small example macro called 'P' that causes a break and
+ inserts some vertical space. It could be used to separate
+ paragraphs.
+
+ .de P
+ . br
+ . sp .8v
+ ..
+
+ We can define one macro within another. Attempting to nest '..'
+ naïvely will end the outer definition because the inner definition
+ isn't interpreted as such until the outer macro is later
+ interpolated. We can use an end macro instead. Each level of
+ nesting should use a unique end macro.
+
+ An end macro need not be defined until it is called. This fact
+ enables a nested macro definition to begin inside one macro and end
+ inside another. Consider the following example.(3) (*note Writing
+ Macros-Footnote-3::)
+
+ .de m1
+ . de m2 m3
+ you
+ ..
+ .de m3
+ Hello,
+ Joe.
+ ..
+ .de m4
+ do
+ ..
+ .m1
+ know?
+ . m3
+ What
+ .m4
+ .m2
+ => Hello, Joe. What do you know?
+
+ A nested macro definition _can_ be terminated with '..' and nested
+ macros _can_ reuse end macros, but these control lines must be
+ escaped multiple times for each level of nesting. The necessity of
+ this escaping and the utility of nested macro definitions will
+ become clearer when we employ macro parameters and consider the
+ behavior of copy mode in detail.
+
+ 'de' defines a macro that inherits the compatibility mode enablement
+status of its context (*note Implementation Differences::). Often it is
+desirable to make a macro that uses 'groff' features callable from
+contexts where compatibility mode is on; for instance, when writing
+extensions to a historical macro package. To achieve this,
+compatibility mode needs to be switched off while such a macro is
+interpreted--without disturbing that state when it is finished.
+
+ -- Request: .de1 name [end]
+ The 'de1' request defines a macro to be interpreted with
+ compatibility mode disabled. When NAME is called, compatibility
+ mode enablement status is saved; it is restored when the call
+ completes. Observe the extra backlash before the interpolation of
+ register 'xxx'; we'll explore this subject in *note Copy Mode::.
+
+ .nr xxx 12345
+ .de aa
+ The value of xxx is \\n[xxx].
+ . br
+ ..
+ .de1 bb
+ The value of xxx is \\n[xxx].
+ ..
+ .cp 1
+ .aa
+ error-> warning: register '[' not defined
+ => The value of xxx is 0xxx].
+ .bb
+ => The value of xxx is 12345.
+
+ -- Request: .dei name [end]
+ -- Request: .dei1 name [end]
+ The 'dei' request defines a macro with its name and end macro
+ indirected through strings. That is, it interpolates strings named
+ NAME and END before performing the definition.
+
+ The following examples are equivalent.
+
+ .ds xx aa
+ .ds yy bb
+ .dei xx yy
+
+ .de aa bb
+
+ The 'dei1' request bears the same relationship to 'dei' as 'de1'
+ does to 'de'; it temporarily turns compatibility mode off when NAME
+ is called.
+
+ -- Request: .am name [end]
+ -- Request: .am1 name [end]
+ -- Request: .ami name [end]
+ -- Request: .ami1 name [end]
+ 'am' appends subsequent input lines to macro NAME, extending its
+ definition, and otherwise working as 'de' does.
+
+ To make the previously defined 'P' macro set indented instead of
+ block paragraphs, add the necessary code to the existing macro.
+
+ .am P
+ .ti +5n
+ ..
+
+ The other requests are analogous to their 'de' counterparts. The
+ 'am1' request turns off compatibility mode during interpretation of
+ the appendment. The 'ami' request appends indirectly, meaning that
+ strings NAME and END are interpolated with the resulting names used
+ before appending. The 'ami1' request is similar to 'ami',
+ disabling compatibility mode during interpretation of the appended
+ lines.
+
+ Using 'trace.tmac', you can trace calls to 'de', 'de1', 'am', and
+'am1'. You can also use the 'backtrace' request at any point desired to
+troubleshoot tricky spots (*note Debugging::).
+
+ *Note Strings::, for the 'als', 'rm', and 'rn' requests to create an
+alias of, remove, and rename a macro, respectively.
+
+ Macro identifiers share their name space with requests, strings, and
+diversions; see *note Identifiers::. The 'am', 'as', 'da', 'de', 'di',
+and 'ds' requests (together with their variants) create a new object
+only if the name of the macro, diversion, or string is currently
+undefined or if it is defined as a request; normally, they modify the
+value of an existing object. *Note the description of the 'als'
+request: als, for pitfalls when redefining a macro that is aliased.
+
+ -- Request: .return [anything]
+ Exit a macro, immediately returning to the caller. If called with
+ an argument ANYTHING, exit twice--the current macro and the macro
+ one level higher. This is used to define a wrapper macro for
+ 'return' in 'trace.tmac'.
+
+ (1) *Note Copy Mode::.
+
+ (2) While it is possible to define and call a macro '.', you can't
+use it as an end macro: during a macro definition, '..' is never handled
+as calling '.', even if '.de NAME .' explicitly precedes it.
+
+ (3) Its structure is adapted from, and isomorphic to, part of a
+solution by Tadziu Hoffman to the problem of reflowing text multiple
+times to find an optimal configuration for it.
+<https://lists.gnu.org/archive/html/groff/2008-12/msg00006.html>
+
+5.24.1 Parameters
+-----------------
+
+Macro calls and string interpolations optionally accept a list of
+arguments; recall *note Calling Macros::. At the time such an
+interpolation takes place, these "parameters" can be examined using a
+register and a variety of escape sequences starting with '\$'. All such
+escape sequences are interpreted even in copy mode, a fact we shall
+motivate and explain below (*note Copy Mode::).
+
+ -- Register: \n[.$]
+ The count of parameters available to a macro or string is kept in
+ this read-only register. The 'shift' request can change its value.
+
+ Any individual parameter can be accessed by its position in the list
+of arguments to the macro call, numbered from left to right starting at
+1, with one of the following escape sequences.
+
+ -- Escape sequence: \$n
+ -- Escape sequence: \$(nn
+ -- Escape sequence: \$[nnn]
+ Interpolate the Nth, NNth, or NNNth parameter. The first form
+ expects only a single digit (1<=N<=9)), the second two digits
+ (01<=NN<=99)), and the third any positive integer NNN. Macros and
+ strings accept an unlimited number of parameters.
+
+ -- Request: .shift [n]
+ Shift the parameters N places (1 by default). This is a "left
+ shift": what was parameter I becomes parameter I-N. The parameters
+ formerly in positions 1 to N are no longer available. Shifting by
+ a non-positive amount performs no operation. The register '.$' is
+ adjusted accordingly.
+
+ In practice, parameter interpolations are usually seen prefixed with
+an extra escape character. This is because the '\$' family of escape
+sequences is interpreted even in copy mode.(1) (*note
+Parameters-Footnote-1::)
+
+ -- Escape sequence: \$*
+ -- Escape sequence: \$@
+ -- Escape sequence: \$^
+ In some cases it is convenient to interpolate all of the parameters
+ at once (to pass them to a request, for instance). The '\$*'
+ escape concatenates the parameters, separating them with spaces.
+ '\$@' is similar, concatenating the parameters, surrounding each
+ with double quotes and separating them with spaces. If not in
+ compatibility mode, the interpolation depth of double quotes is
+ preserved (*note Calling Macros::). '\$^' interpolates all
+ parameters as if they were arguments to the 'ds' request.
+
+ .de foo
+ . tm $1='\\$1'
+ . tm $2='\\$2'
+ . tm $*='\\$*'
+ . tm $@='\\$@'
+ . tm $^='\\$^'
+ ..
+ .foo " This is a "test"
+ error-> $1=' This is a '
+ error-> $2='test"'
+ error-> $*=' This is a test"'
+ error-> $@='" This is a " "test""'
+ error-> $^='" This is a "test"'
+
+ '\$*' is useful when writing a macro that doesn't need to
+ distinguish its arguments, or even to not interpret them; examples
+ include macros that produce diagnostic messages by wrapping the
+ 'tm' or 'ab' requests. Use '\$@' when writing a macro that may
+ need to shift its parameters and/or wrap a macro or request that
+ finds the count significant. If in doubt, prefer '\$@' to '\$*'.
+ An application of '\$^' is seen in 'trace.tmac', which redefines
+ some requests and macros for debugging purposes.
+
+ -- Escape sequence: \$0
+ Interpolate the name by which the macro being interpreted was
+ called. The 'als' request can cause a macro to have more than one
+ name. Applying string interpolation to a macro does not change
+ this name.
+
+ .de foo
+ . tm \\$0
+ ..
+ .als bar foo
+ .
+ .de aaa
+ . foo
+ ..
+ .de bbb
+ . bar
+ ..
+ .de ccc
+ \\*[foo]\\
+ ..
+ .de ddd
+ \\*[bar]\\
+ ..
+ .
+ .aaa
+ error-> foo
+ .bbb
+ error-> bar
+ .ccc
+ error-> ccc
+ .ddd
+ error-> ddd
+
+ (1) If they were not, parameter interpolations would be similar to
+command-line parameters--fixed for the entire duration of a 'roff'
+program's run. The advantage of interpolating '\$' escape sequences
+even in copy mode is that they can interpolate different contents from
+one call to the next, like function parameters in a procedural language.
+The additional escape character is the price of this power.
+
+5.24.2 Copy Mode
+----------------
+
+When GNU 'troff' processes certain requests, most importantly those
+which define or append to a macro or string, it does so in "copy mode":
+it copies the characters of the definition into a dedicated storage
+region, interpolating the escape sequences '\n', '\g', '\$', '\*', '\V',
+and '\?' normally; interpreting '\<RET>' immediately; discarding
+comments '\"' and '\#'; interpolating the current leader, escape, or tab
+character with '\a', '\e', and '\t', respectively; and storing all other
+escape sequences in an encoded form.
+
+ The complement of copy mode--a 'roff' formatter's behavior when not
+defining or appending to a macro, string, or diversion--where all macros
+are interpolated, requests invoked, and valid escape sequences processed
+immediately upon recognition, can be termed "interpretation mode".
+
+ -- Escape sequence: \\
+ The escape character, '\' by default, can escape itself. This
+ enables you to control whether a given '\n', '\g', '\$', '\*',
+ '\V', or '\?' escape sequence is interpreted at the time the macro
+ containing it is defined, or later when the macro is called.(1)
+ (*note Copy Mode-Footnote-1::)
+
+ .nr x 20
+ .de y
+ .nr x 10
+ \&\nx
+ \&\\nx
+ ..
+ .y
+ => 20 10
+
+ You can think of '\\' as a "delayed" backslash; it is the escape
+ character followed by a backslash from which the escape character
+ has removed its special meaning. Consequently, '\\' is not an
+ escape sequence in the usual sense. In any escape sequence '\X'
+ that GNU 'troff' does not recognize, the escape character is
+ ignored and X is output. An unrecognized escape sequence causes a
+ warning in category 'escape', with two exceptions--'\\' is the
+ first.
+
+ -- Escape sequence: \.
+ '\.' escapes the control character. It is similar to '\\' in that
+ it isn't a true escape sequence. It is used to permit nested macro
+ definitions to end without a named macro call to conclude them.
+ Without a syntax for escaping the control character, this would not
+ be possible.
+
+ .de m1
+ foo
+ .
+ . de m2
+ bar
+ \\..
+ .
+ ..
+ .m1
+ .m2
+ => foo bar
+
+ The first backslash is consumed while the macro is read, and the
+ second is interpreted when macro 'm1' is called.
+
+ 'roff' documents should not use the '\\' or '\.' character sequences
+outside of copy mode; they serve only to obfuscate the input. Use '\e'
+to represent the escape character, '\[rs]' to obtain a backslash glyph,
+and '\&' before '.' and ''' where GNU 'troff' expects them as control
+characters if you mean to use them literally (recall *note Requests and
+Macros::).
+
+ Macro definitions can be nested to arbitrary depth. The mechanics of
+parsing the escape character have significant consequences for this
+practice.
+
+ .de M1
+ \\$1
+ . de M2
+ \\\\$1
+ . de M3
+ \\\\\\\\$1
+ \\\\..
+ . M3 hand.
+ \\..
+ . M2 of
+ ..
+ This understeer is getting
+ .M1 out
+ => This understeer is getting out of hand.
+
+ Each escape character is interpreted twice--once in copy mode, when
+the macro is defined, and once in interpretation mode, when the macro is
+called. As seen above, this fact leads to exponential growth in the
+quantity of escape characters required to delay interpolation of '\n',
+'\g', '\$', '\*', '\V', and '\?' at each nesting level, which can be
+daunting. GNU 'troff' offers a solution.
+
+ -- Escape sequence: \E
+ '\E' represents an escape character that is not interpreted in copy
+ mode. You can use it to ease the writing of nested macro
+ definitions.
+
+ .de M1
+ . nop \E$1
+ . de M2
+ . nop \E$1
+ . de M3
+ . nop \E$1
+ \\\\..
+ . M3 better.
+ \\..
+ . M2 bit
+ ..
+ This vehicle handles
+ .M1 a
+ => This vehicle handles a bit better.
+
+ Observe that because '\.' is not a true escape sequence, we can't
+ use '\E' to keep '..' from ending a macro definition prematurely.
+ If the multiplicity of backslashes complicates maintenance, use end
+ macros.
+
+ '\E' is also convenient to define strings containing escape
+ sequences that need to work when used in copy mode (for example, as
+ macro arguments), or which will be interpolated at varying macro
+ nesting depths. We might define strings to begin and end
+ superscripting as follows.(2) (*note Copy Mode-Footnote-2::)
+
+ .ds { \v'-.9m\s'\En[.s]*7u/10u'+.7m'
+ .ds } \v'-.7m\s0+.9m'
+
+ When the 'ec' request is used to redefine the escape character,
+ '\E' also makes it easier to distinguish the semantics of an escape
+ character from the other meaning(s) its character might have.
+ Consider the use of an unusual escape character, '-'.
+
+ .nr a 1
+ .ec -
+ .de xx
+ --na
+ ..
+ .xx
+ => -na
+
+ This result may surprise you; some people expect '1' to be output
+ since register 'a' has clearly been defined with that value. What
+ has happened? The robotic replacement of '\' with '-' has led us
+ astray. You might recognize the sequence '--' more readily with
+ the default escape character as '\-', the special character escape
+ sequence for the minus sign glyph.
+
+ .nr a 1
+ .ec -
+ .de xx
+ -Ena
+ ..
+ .xx
+ => 1
+
+ (1) Compare this to the '\def' and '\edef' commands in TeX.
+
+ (2) These are lightly adapted from the 'groff' implementation of the
+'ms' macros.
+
+5.25 Page Motions
+=================
+
+*Note Manipulating Spacing::, for a discussion of the most commonly used
+request for vertical motion, 'sp', which spaces downward by one vee.
+
+ -- Request: .mk [reg]
+ -- Request: .rt [dist]
+ You can "mark" a location on a page for subsequent "return". 'mk'
+ takes an argument, a register name in which to store the current
+ page location. If given no argument, it stores the location in an
+ internal register. This location can be used later by the 'rt' or
+ the 'sp' requests (or the '\v' escape).
+
+ The 'rt' request returns _upward_ to the location marked with the
+ last 'mk' request. If used with an argument, it returns to a
+ vertical position DIST from the top of the page (no previous call
+ to 'mk' is necessary in this case). The default scaling unit is
+ 'v'.
+
+ If a page break occurs between a 'mk' request and its matching 'rt'
+ request, the 'rt' request is silently ignored.
+
+ A simple implementation of a macro to set text in two columns
+ follows.
+
+ .nr column-length 1.5i
+ .nr column-gap 4m
+ .nr bottom-margin 1m
+ .
+ .de 2c
+ . br
+ . mk
+ . ll \\n[column-length]u
+ . wh -\\n[bottom-margin]u 2c-trap
+ . nr right-side 0
+ ..
+ .
+ .de 2c-trap
+ . ie \\n[right-side] \{\
+ . nr right-side 0
+ . po -(\\n[column-length]u + \\n[column-gap]u)
+ . \" remove trap
+ . wh -\\n[bottom-margin]u
+ . \}
+ . el \{\
+ . \" switch to right side
+ . nr right-side 1
+ . po +(\\n[column-length]u + \\n[column-gap]u)
+ . rt
+ . \}
+ ..
+
+ Now let us apply our two-column macro.
+
+ .pl 1.5i
+ .ll 4i
+ This is a small test that shows how the
+ rt request works in combination with mk.
+
+ .2c
+ Starting here, text is typeset in two columns.
+ Note that this implementation isn't robust
+ and thus not suited for a real two-column
+ macro.
+ => This is a small test that shows how the
+ => rt request works in combination with mk.
+ =>
+ => Starting here, isn't robust
+ => text is typeset and thus not
+ => in two columns. suited for a
+ => Note that this real two-column
+ => implementation macro.
+
+ Several escape sequences enable fine control of movement about the
+page.
+
+ -- Escape sequence: \v'expr'
+ Vertically move the drawing position. EXPR indicates the magnitude
+ of motion: positive is downward and and negative upward. The
+ default scaling unit is 'v'. The motion is relative to the current
+ drawing position unless EXPR begins with the boundary-relative
+ motion operator '|'. *Note Numeric Expressions::.
+
+ Text processing continues at the new drawing position; usually,
+ vertical motions should be in balanced pairs to avoid a confusing
+ page layout.
+
+ '\v' will not spring a vertical position trap. This can be useful;
+ for example, consider a page bottom trap macro that prints a marker
+ in the margin to indicate continuation of a footnote. *Note
+ Traps::.
+
+ A few escape sequences that produce vertical motion are unusual.
+They are thought to originate early in AT&T 'nroff' history to achieve
+super- and subscripting by half-line motions on line printers and
+teletypewriters before the phototypesetter made more precise positioning
+available. They are reckoned in ems--not vees--to maintain continuity
+with their original purpose of moving relative to the size of the type
+rather than the distance between text baselines (vees).(1) (*note Page
+Motions-Footnote-1::)
+
+ -- Escape sequence: \r
+ -- Escape sequence: \u
+ -- Escape sequence: \d
+ Move upward 1m, upward .5m, and downward .5m, respectively.
+
+Let us see these escape sequences in use.
+
+ Obtain 100 cm\u3\d of \ka\d\092\h'|\nau'\r233\dU.
+
+ In the foregoing we have paired '\u' and '\d' to typeset a
+superscript, and later a full em negative ("reverse") motion to place a
+superscript above a subscript. A numeral-width horizontal motion escape
+sequence aligns the proton and nucleon numbers, while '\k' marks a
+horizontal position to which '\h' returns so that we could stack them.
+(We shall discuss these horizontal motion escape sequences presently.)
+In serious applications, we often want to alter the type size of the
+-scripts and to fine-tune the vertical motions, as the 'groff' 'ms'
+package does with its super- and subscripting string definitions.
+
+ -- Escape sequence: \h'expr'
+ Horizontally move the drawing position. EXPR indicates the
+ magnitude of motion: positive is rightward and negative leftward.
+ The default scaling unit is 'm'. The motion is relative to the
+ current drawing position unless EXPR begins with the
+ boundary-relative motion operator '|'. *Note Numeric
+ Expressions::.
+
+ The following string definition sets the TeX logo.(2) (*note Page
+Motions-Footnote-2::)
+
+ .ds TeX T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X\"
+
+ There are a number of special-case escape sequences for horizontal
+motion.
+
+ -- Escape sequence: \<SP>
+ Move right one word space. (The input is a backslash followed by a
+ space.) This escape sequence can be thought of as a
+ non-adjustable, unbreakable space. Usually you want '\~' instead;
+ see *note Manipulating Filling and Adjustment::.
+
+ -- Escape sequence: \|
+ Move one-sixth em to the right on typesetting output devices. If a
+ glyph named '\|' is defined in the current font, its width is used
+ instead, even on terminal output devices.
+
+ -- Escape sequence: \^
+ Move one-twelfth em to the right on typesetting output devices. If
+ a glyph named '\^' is defined in the current font, its width is
+ used instead, even on terminal output devices.
+
+ -- Escape sequence: \0
+ Move right by the width of a numeral in the current font.
+
+ Horizontal motions are not discarded at the end of an output line as
+word spaces are. *Note Breaking::.
+
+ -- Escape sequence: \w'anything'
+ -- Register: \n[st]
+ -- Register: \n[sb]
+ -- Register: \n[rst]
+ -- Register: \n[rsb]
+ -- Register: \n[ct]
+ -- Register: \n[ssc]
+ -- Register: \n[skw]
+ Interpolate the width of ANYTHING in basic units. This escape
+ sequence allows several properties of formatted output to be
+ measured without writing it out.
+
+ The length of the string 'abc' is \w'abc'u.
+ => The length of the string 'abc' is 72u.
+
+ ANYTHING is processed in a dummy environment: this means that font
+ and type size changes, for example, may occur within it without
+ affecting subsequent output.
+
+ After each use, '\w' sets several registers.
+
+ 'st'
+ 'sb'
+ The maximum vertical displacements of the text baseline above
+ and below, respectively. The sign convention is opposite that
+ of relative vertical motions; that is, depth below the
+ (original) baseline is negative. These registers are
+ incorrectly documented in the AT&T 'troff' manual as "the
+ highest and lowest extent of [the argument to '\w'] relative
+ to the baseline".
+
+ 'rst'
+ 'rsb'
+ Like 'st' and 'sb', but taking account of the heights and
+ depths of glyphs. In other words, these registers store the
+ highest and lowest vertical positions attained by ANYTHING,
+ doing what AT&T 'troff' documented 'st' and 'sb' as doing.
+
+ 'ct'
+ Characterizes the geometry of glyphs occurring in ANYTHING.
+
+ 0
+ only short glyphs, no descenders or tall glyphs
+
+ 1
+ at least one descender
+
+ 2
+ at least one tall glyph
+
+ 3
+ at least one each of a descender and a tall glyph
+
+ 'ssc'
+ The amount of horizontal space (possibly negative) that should
+ be added to the last glyph before a subscript.
+
+ 'skw'
+ How far to right of the center of the last glyph in the '\w'
+ argument, the center of an accent from a roman font should be
+ placed over that glyph.
+
+ -- Escape sequence: \kp
+ -- Escape sequence: \k(ps
+ -- Escape sequence: \k[position]
+ Store the current horizontal position in the _input_ line in a
+ register with the name POSITION (one-character name P,
+ two-character name PS). Use this, for example, to return to the
+ beginning of a string for highlighting or other decoration.
+
+ -- Register: \n[hp]
+ The current horizontal position at the input line.
+
+ -- Register: \n[.k]
+ A read-only register containing the current horizontal output
+ position (relative to the current indentation).
+
+ -- Escape sequence: \o'abc...'
+ Overstrike the glyphs of characters A, B, C, ...; the glyphs are
+ centered, written, and the drawing position advanced by the widest
+ of the glyphs.
+
+ -- Escape sequence: \zc
+ Format the character C with zero width; that is, without advancing
+ the drawing position. Use '\z' to overstrike glyphs aligned to
+ their left edges, in contrast to '\o''s centering.
+
+ -- Escape sequence: \Z'anything'
+ Save the drawing position, format ANYTHING, then restore it. Tabs
+ and leaders in the argument are ignored with an error diagnostic.
+
+ We might implement a strike-through macro thus.
+
+ .de ST
+ .nr width \w'\\$1'
+ \Z@\v'-.25m'\l'\\n[width]u'@\\$1
+ ..
+ .
+ This is
+ .ST "a test"
+ an actual emergency!
+
+ (1) At the 'grops' defaults of 10-point type on 12-point vertical
+spacing, the difference between half a vee and half an em can be subtle:
+large spacings like '.vs .5i' make it obvious.
+
+ (2) *Note Strings::, for an explanation of the trailing '\"'.
+
+5.26 Drawing Geometric Objects
+==============================
+
+A few of the formatter's escape sequences draw lines and other geometric
+objects. Combined with each other and with page motion commands (*note
+Page Motions::), a wide variety of figures is possible. For complex
+drawings, these operations can be cumbersome; the preprocessors 'gpic'
+or 'ggrn' are typically used instead.
+
+ The '\l' and '\L' escape sequences draw horizontal and vertical
+sequences of glyphs, respectively. Even the simplest of output devices
+supports them.
+
+ -- Escape sequence: \l'l'
+ -- Escape sequence: \l'lc'
+ Draw a horizontal line of length L from the drawing position.
+ Rightward motion is positive. Afterward, the drawing position is
+ at the right end of the line. The default scaling unit is 'm'.
+
+ The optional second parameter C is a character with which to draw
+ the line. The default is the baseline rule special character,
+ '\[ru]'.
+
+ If C is a valid scaling unit, put '\&' after L to disambiguate the
+ input.
+
+ .de textbox
+ \[br]\\$*\[br]\l'|0\[rn]'\l'|0\[ul]'
+ ..
+
+ The foregoing outputs a box rule (a vertical line), the text
+ argument(s), and another box rule. We employ the boundary-relative
+ motion operator '|'. Finally, the line-drawing escape sequences
+ draw a radical extender (a form of overline) and an underline from
+ the drawing position to the position coresponding to beginning of
+ the _input_ line. The drawing position returns to just after the
+ right-hand box rule because the lengths of the drawn lines are
+ negative, as noted above.
+
+ -- Escape sequence: \L'l'
+ -- Escape sequence: \L'lc'
+ Draw a vertical line of length L from the drawing position.
+ Downward motion is positive. The default scaling unit is 'v'. The
+ default character is the box rule, '\[br]'. As with vertical
+ motion escape sequences, text processing continues where the line
+ ends. '\L' is otherwise similar to '\l'.
+
+ $ nroff <<EOF
+ This is a \L'3v'test.
+ EOF
+ => This is a
+ => |
+ => |
+ => |test.
+
+ When writing text, the drawing position is at the text baseline;
+ recall *note Page Geometry::.
+
+ The '\D' escape sequence provides "drawing commands" that direct the
+output device to render geometrical objects rather than glyphs.
+Specific devices may support only a subset, or may feature additional
+ones; consult the man page for the output driver in use. Terminal
+devices in particular implement almost none. *Note Graphics Commands::.
+
+ Rendering starts at the drawing position; when finished, the drawing
+position is left at the rightmost point of the object, even for closed
+figures, except where noted. GNU 'troff' draws stroked (outlined)
+objects with the stroke color, and shades filled ones with the fill
+color. *Note Colors::. Coordinates H and V are horizontal and vertical
+motions relative to the drawing position or previous point in the
+command. The default scaling unit for horizontal measurements (and
+diameters of circles) is 'm'; for vertical ones, 'v'.
+
+ Circles, ellipses, and polygons can be drawn filled or stroked.
+These are independent properties; if you want a filled, stroked figure,
+you must draw the same figure twice using each drawing command. A
+filled figure is always smaller than an outlined one because the former
+is drawn only within its defined area, whereas strokes have a line
+thickness (set with '\D't'').
+
+ \h'1i'\v'1i'\
+ \# increase line thickness
+ \Z'\D't 5p''\
+ \# draw stroked (unfilled) polygon
+ \Z'\D'p 3 3 -6 0''\
+ \# draw filled (solid) polygon
+ \Z'\D'P 3 3 -6 0''
+
+ -- Escape sequence: \D'command argument ...'
+ Drawing command escape sequence parameters begin with an ordinary
+ character, COMMAND, selecting the type of object to be drawn,
+ followed by ARGUMENTs whose meaning is determined by COMMAND.
+
+ '\D'~ H1 V1 ... HN VN''
+ Draw a B-spline to each point in sequence, leaving the drawing
+ position at (HN, VN).
+
+ '\D'a HC VC H V''
+ Draw a circular arc centered at (HC, VC) counterclockwise from
+ the drawing position to a point (H, V) relative to the center.
+ (1) (*note Drawing Geometric Objects-Footnote-1::)
+
+ '\D'c D''
+ Draw a circle of diameter D with its leftmost point at the
+ drawing position.
+
+ '\D'C D''
+ As '\D'C ...'', but the circle is filled.
+
+ '\D'e H V''
+ Draw an ellipse of width H and height V with its leftmost
+ point at the drawing position.
+
+ '\D'E X Y''
+ As '\D'e ...'', but the ellipse is filled.
+
+ '\D'l DX DY''
+ Draw line from the drawing position to (H, V).
+
+ The following is a macro for drawing a box around a text
+ argument; for simplicity, the box margin is a fixed at 0.2m.
+
+ .de TEXTBOX
+ . nr @wd \w'\\$1'
+ \h'.2m'\
+ \h'-.2m'\v'(.2m - \\n[rsb]u)'\
+ \D'l 0 -(\\n[rst]u - \\n[rsb]u + .4m)'\
+ \D'l (\\n[@wd]u + .4m) 0'\
+ \D'l 0 (\\n[rst]u - \\n[rsb]u + .4m)'\
+ \D'l -(\\n[@wd]u + .4m) 0'\
+ \h'.2m'\v'-(.2m - \\n[rsb]u)'\
+ \\$1\
+ \h'.2m'
+ ..
+
+ The argument is measured with the '\w' escape sequence. Its
+ width is stored in register '@wd'. '\w' also sets the
+ registers 'rst' and 'rsb'; these contain its maximum vertical
+ extents of the argument. Then, four lines are drawn to form a
+ box, offset by the box margin.
+
+ '\D'p H1 V1 ... HN VN''
+ Draw polygon with vertices at drawing position and each point
+ in sequence. GNU 'troff' closes the polygon by drawing a line
+ from (HN, VN) back to the initial drawing position.
+ Afterward, the drawing position is left at (HN, VN).
+
+ '\D'P DX1 DY1 DX2 DY2 ...''
+ As '\D'P ...'', but the polygon is filled.
+
+ The following macro is like the '\D'l'' example, but shades
+ the box. We draw the box before writing the text because
+ colors in GNU 'troff' have no transparency; in othe opposite
+ order, the filled polygon would occlude the text.
+
+ .de TEXTBOX
+ . nr @wd \w'\\$1'
+ \h'.2m'\
+ \h'-.2m'\v'(.2m - \\n[rsb]u)'\
+ \M[lightcyan]\
+ \D'P 0 -(\\n[rst]u - \\n[rsb]u + .4m) \
+ (\\n[@wd]u + .4m) 0 \
+ 0 (\\n[rst]u - \\n[rsb]u + .4m) \
+ -(\\n[@wd]u + .4m) 0'\
+ \h'.2m'\v'-(.2m - \\n[rsb]u)'\
+ \M[]\
+ \\$1\
+ \h'.2m'
+ ..
+
+ '\D't N''
+ Set the stroke thickness of geometric objects to N basic
+ units. A zero N selects the minimal supported thickness. A
+ negative N selects a thickness proportional to the type size;
+ this is the default.
+
+ In a hazy penumbra between text rendering and drawing commands we
+locate the bracket-building escape sequence, '\b'. It can assemble
+apparently large glyphs by vertically stacking ordinary ones.
+
+ -- Escape sequence: \b'contents'
+ Pile and center a sequence of glyphs vertically on the output line.
+ "Piling" stacks glyphs corresponding to each character in CONTENTS,
+ read from left to right, and placed from top to bottom. GNU
+ 'troff' separates the glyphs vertically by 1m, and the pile itself
+ is centered 0.5m above the text baseline. The horizontal drawing
+ position is then advanced by the width of the widest glyph in the
+ pile.
+
+ This rather inflexible positioning algorithm doesn't work with the
+ 'dvi' output device since its bracket pieces vary in height.
+ Instead, use the 'geqn' preprocessor.
+
+ *note Manipulating Spacing:: describes how to adjust the vertical
+ spacing of the output line with the '\x' escape sequence.
+
+ The application of '\b' that lends its name is construction of
+ brackets, braces, and parentheses when typesetting mathematics. We
+ might construct a large opening (left) brace as follows.
+
+ \b'\[lt]\[bv]\[lk]\[bv]\[lb]'
+
+ See 'groff_char(7)' for a list of special character identifiers.
+
+ (1) (HC, VC) is adjusted to the point nearest the perpendicular
+bisector of the arc's chord.
+
+5.27 Deferring Output
+=====================
+
+A few 'roff' language elements are generally not used in simple
+documents, but arise as page layouts become more sophisticated and
+demanding. "Environments" collect formatting parameters like line
+length and typeface. A "diversion" stores formatted output for later
+use. A "trap" is a condition on the input or output, tested
+automatically by the formatter, that is associated with a macro, causing
+it to be called when that condition is fulfilled.
+
+ Footnote support often exercises all three of the foregoing features.
+A simple implementation might work as follows. A pair of macros is
+defined: one starts a footnote and the other ends it. The author calls
+the first macro where a footnote marker is desired. The macro
+establishes a diversion so that the footnote text is collected at the
+place in the body text where its corresponding marker appears. An
+environment is created for the footnote so that it is set at a smaller
+typeface. The footnote text is formatted in the diversion using that
+environment, but it does not yet appear in the output. The document
+author calls the footnote end macro, which returns to the previous
+environment and ends the diversion. Later, after much more body text in
+the document, a trap, set a small distance above the page bottom, is
+sprung. The macro called by the trap draws a line across the page and
+emits the stored diversion. Thus, the footnote is rendered.
+
+ Diversions and traps make the text formatting process non-linear.
+Let us imagine a set of text lines or paragraphs labelled 'A', 'B', and
+so on. If we set up a trap that produces text 'T' (as a page footer,
+say), and we also use a diversion to store the formatted text 'D', then
+a document with input text in the order 'A B C D E F' might render as 'A
+B C E T F'. The diversion 'D' will never be output if we do not call
+for it.
+
+ Environments of themselves are not a source of non-linearity in
+document formatting: environment switches have immediate effect. One
+could always write a macro to change as many formatting parameters as
+desired with a single convenient call. But because diversions can be
+nested and macros called by traps that are sprung by other trap-called
+macros, they may be called upon in varying contexts. For example,
+consider a page header that is always to be set in Helvetica. A
+document that uses Times for most of its body text, but Courier for
+displayed code examples, poses a challenge if a page break occurs in the
+middle of a code display; if the header trap assumes that the "previous
+font" is always Times, the rest of the example will be formatted in the
+wrong typeface. One could carefully save all formatting parameters upon
+entering the trap and restore them upon leaving it, but this is verbose,
+error-prone, and not future-proof as the 'groff' language develops.
+Environments save us considerable effort.
+
+5.28 Traps
+==========
+
+"Traps" are locations in the output or conditions on the input that,
+when reached or fulfilled, call a specified macro. These traps can
+occur at a given location on the page, at a given location in the
+current diversion (together, these are known as vertical position
+traps), at a blank line, at a line with leading space characters, after
+a quantity of input lines, or at the end of input. Macros called by
+traps are passed no arguments. Setting a trap is also called "planting"
+one. It is said that a trap is "sprung" if its condition is fulfilled.
+
+5.28.1 Vertical Position Traps
+------------------------------
+
+A "vertical position trap" calls a macro when the formatter's vertical
+drawing position reaches or passes, in the downward direction, a certain
+location on the output page or in a diversion. Its applications include
+setting page headers and footers, body text in multiple columns, and
+footnotes.
+
+ -- Request: .vpt [flag]
+ -- Register: \n[.vpt]
+ Enable vertical position traps if FLAG is non-zero or absent;
+ disable them otherwise. Vertical position traps are those set by
+ the 'wh' request or by 'dt' within a diversion. The parameter that
+ controls whether vertical position traps are enabled is global.
+ Initially, vertical position traps are enabled. The current value
+ is stored in the '.vpt' read-only register.
+
+ A page can't be ejected if 'vpt' is set to zero; see *note The
+ Implicit Page Trap::.
+
+5.28.1.1 Page Location Traps
+............................
+
+A "page location trap" is a vertical position trap that applies to the
+page; that is, to undiverted output. Many can be present; manage them
+with the 'wh' and 'ch' requests.
+
+ -- Request: .wh dist [name]
+ Plant macro NAME as page location trap at DIST. The default
+ scaling unit is 'v'. Non-negative values for DIST set the trap
+ relative to the top of the page; negative values set the trap
+ relative to the bottom of the page. It is not possible to plant a
+ trap less than one basic unit from the page bottom: a DIST of '-0'
+ is interpreted as '0', the top of the page.(1) (*note Page
+ Location Traps-Footnote-1::) An existing _visible_ trap (see below)
+ at DIST is removed; this is 'wh''s sole function if NAME is
+ missing.
+
+ A trap is sprung only if it is "visible", meaning that its location
+ is reachable on the page(2) (*note Page Location
+ Traps-Footnote-2::) and it is not hidden by another trap at the
+ same location already planted there.
+
+ A macro package might set headers and footers as follows; this
+ example configures vertical margins of one inch to the body text,
+ and one half-inch to the titles. Observe the use of the no-break
+ control character with 'sp' request to position our text baselines,
+ and the page number character '%' used with the 'tl' request.
+
+ .\" hdfo.roff
+ .de hd \" page header
+ ' sp .5i
+ ' tl '\\*(Ti''\\*(Da' \" title and date strings
+ ' sp .5i
+ ..
+ .de fo \" page footer
+ ' sp .5i
+ . tl ''%''
+ . bp
+ ..
+ .wh 0 hd \" trap at top of the page
+ .wh -1i fo \" trap 1 inch from bottom
+
+ To use these traps, copy the above (or load it from a file with the
+ 'so' or 'mso' requests), then set up the strings it uses.
+
+ .so hdfo.roff
+ .ds Ti Final Report\"
+ .ds Da 21 May 2023\"
+ .ti
+ On 5 August of last year,
+ this committee tasked me with the investigation of the
+ CFIT (controlled flight into terrain) incident of
+ .\" ...and so on...
+
+ A trap above the top or at or below the bottom of the page can be
+ made visible by either moving it into the page area or increasing
+ the page length so that the trap is on the page. Negative trap
+ values always use the _current_ page length; they are not converted
+ to an absolute vertical position. We can use the 'ptr' request to
+ dump our page location traps to the standard error stream (*note
+ Debugging::). Their positions are reported in basic units; an
+ 'nroff' device example follows.
+
+ .pl 5i
+ .wh -1i xx
+ .ptr
+ error-> xx -240
+ .pl 100i
+ .ptr
+ error-> xx -240
+
+ It is possible to have more than one trap at the same location
+ (although only one at a time can be visible); to achieve this, the
+ traps must be defined at different locations, then moved to the
+ same place with the 'ch' request. In the following example, the
+ many empty lines caused by the 'bp' request are not shown in the
+ output.
+
+ .de a
+ . nop a
+ ..
+ .de b
+ . nop b
+ ..
+ .de c
+ . nop c
+ ..
+ .
+ .wh 1i a
+ .wh 2i b
+ .wh 3i c
+ .bp
+ => a b c
+ .ch b 1i
+ .ch c 1i
+ .bp
+ => a
+ .ch a 0.5i
+ .bp
+ => a b
+
+ -- Register: \n[.t]
+ The read-only register '.t' holds the distance to the next vertical
+ position trap. If there are no traps between the current position
+ and the bottom of the page, it contains the distance to the page
+ bottom. Within a diversion, in the absence of a diversion trap,
+ this distance is the largest representable integer in basic
+ units--effectively infinite.
+
+ -- Request: .ch name [dist]
+ Change the location of a trap by moving macro NAME to new location
+ DIST, or by unplanting it altogether if DIST is absent. The
+ default scaling unit is 'v'. Parameters to 'ch' are specified in
+ the opposite order from 'wh'. If NAME is the earliest planted
+ macro of multiple traps at the same location, (re)moving it from
+ that location exposes the macro next least recently planted at the
+ same place.(3) (*note Page Location Traps-Footnote-3::)
+
+ Changing a trap's location is useful for building up footnotes in a
+ diversion to allow more space at the bottom of the page for them.
+
+ The same macro can be installed simultaneously at multiple locations;
+however, only the earliest-planted instance--that has not yet been
+deleted with 'wh'--will be moved by 'ch'. The following example (using
+an 'nroff' device) illustrates this behavior. Blank lines have been
+elided from the output.
+
+ .de T
+ Trap sprung at \\n(nlu.
+ .br
+ ..
+ .wh 1i T
+ .wh 2i T
+ foo
+ .sp 11i
+ .bp
+ .ch T 4i
+ bar
+ .sp 11i
+ .bp
+ .ch T 5i
+ baz
+ .sp 11i
+ .bp
+ .wh 5i
+ .ch T 6i
+ qux
+ .sp 11i
+ => foo
+ => Trap sprung at 240u.
+ => Trap sprung at 480u.
+ => bar
+ => Trap sprung at 480u.
+ => Trap sprung at 960u.
+ => baz
+ => Trap sprung at 480u.
+ => Trap sprung at 1200u.
+ => qux
+ => Trap sprung at 1440u.
+
+ -- Register: \n[.ne]
+ The read-only register '.ne' contains the amount of space that was
+ needed in the last 'ne' request that caused a trap to be sprung; it
+ is useful in conjunction with the '.trunc' register. *Note Page
+ Control::. Since the '.ne' register is set only by traps, it
+ doesn't make sense to interpolate it outside of macros called by
+ traps.
+
+ -- Register: \n[.trunc]
+ A read-only register containing the amount of vertical space
+ truncated from an 'sp' request by the most recently sprung vertical
+ position trap, or, if the trap was sprung by an 'ne' request, minus
+ the amount of vertical motion produced by the 'ne' request. In
+ other words, at the point a trap is sprung, it represents the
+ difference of what the vertical position would have been but for
+ the trap, and what the vertical position actually is. Since the
+ '.trunc' register is set only by traps, it doesn't make sense to
+ interpolate it outside of macros called by traps.
+
+ -- Register: \n[.pe]
+ This Boolean-valued, read-only register interpolates 1 while a page
+ is being ejected, and 0 otherwise.
+
+ In the following example, we plant the same trap at the top and the
+ bottom of the page. We also make the trap report its name and the
+ vertical drawing position.
+
+ .de T
+ .tm \\$0: page \\n%, nl=\\n[nl] .pe=\\n[.pe]
+ ..
+ .ll 46n
+ .wh 0 T
+ .wh -1v T
+ Those who can make you believe absurdities can make you
+ commit atrocities. \[em] Voltaire
+ error-> T: page 1, nl=0 .pe=0
+ error-> T: page 1, nl=2600 .pe=1
+ => Those who can make you believe absurdities can
+ => make you commit atrocities. -- Voltaire
+
+ When designing macros, keep in mind that diversions and traps do
+normally interact. For example, if a trap calls a header macro (while
+outputting a diversion) that tries to change the font on the current
+page, the effect is not visible before the diversion has completely been
+printed (except for input protected with '\!' or '\?') since the data in
+the diversion is already formatted. In most cases, this is not the
+expected behaviour.
+
+ (1) *Note The Implicit Page Trap::.
+
+ (2) A trap planted at '20i' or '-30i' will not be sprung on a page of
+length '11i'.
+
+ (3) It may help to think of each trap location as maintaining a
+queue; 'wh' operates on the head of the queue, and 'ch' operates on its
+tail. Only the trap at the head of the queue is visible.
+
+5.28.1.2 The Implicit Page Trap
+...............................
+
+If, after starting GNU 'troff' without loading a macro package, you use
+the 'ptr' request to dump a list of the active traps to the standard
+error stream,(1) (*note The Implicit Page Trap-Footnote-1::) nothing is
+reported. Yet the '.t' register will report a steadily decreasing value
+with every output line your document produces, and once the value of
+'.t' gets to within '.V' of zero, you will notice that something
+trap-like happens--the page is ejected, a new one begins, and the value
+of '.t' becomes large once more.
+
+ This "implicit page trap" always exists in the top-level
+diversion;(2) (*note The Implicit Page Trap-Footnote-2::) it works like
+a trap in some ways but not others. Its purpose is to eject the current
+page and start the next one. It has no name, so it cannot be moved or
+deleted with 'wh' or 'ch' requests. You cannot hide it by placing
+another trap at its location, and can move it only by redefining the
+page length with 'pl'. Its operation is suppressed when vertical page
+traps are disabled with GNU 'troff''s 'vpt' request.
+
+ (1) *Note Debugging::.
+
+ (2) *Note Diversions::.
+
+5.28.1.3 Diversion Traps
+........................
+
+A diversion is not formatted in the context of a page, so it lacks page
+location traps; instead it can have a "diversion trap". There can exist
+at most one such vertical position trap per diversion.
+
+ -- Request: .dt [dist name]
+ Set a trap _within_ a diversion at location DIST, which is
+ interpreted relative to diversion rather than page boundaries. If
+ invoked with fewer than two arguments, any diversion trap in the
+ current diversion is removed. The register '.t' works within
+ diversions. It is an error to invoke 'dt' in the top-level
+ diversion. *Note Diversions::.
+
+5.28.2 Input Line Traps
+-----------------------
+
+ -- Request: .it [n name]
+ -- Request: .itc [n name]
+ Set an input line trap, calling macro NAME after processing the
+ next N productive input lines (recall *note Manipulating Filling
+ and Adjustment::). Any existing input line trap in the environment
+ is replaced. Without arguments, 'it' and 'itc' clear any input
+ line trap that has not yet sprung.
+
+ Consider a macro '.ST S N' which sets the next N input lines in the
+ font style S.
+
+ .de ST \" Use style $1 for next $2 text lines.
+ . it \\$2 ES
+ . ft \\$1
+ ..
+ .de ES \" end ST
+ . ft R
+ ..
+ .ST I 1
+ oblique
+ face
+ .ST I 1
+ oblique\c
+ face
+ => oblique face obliqueface (second "face" upright)
+
+ Unlike the 'ce' and 'rj' requests, 'it' counts lines interrupted
+ with the '\c' escape sequence separately (*note Line
+ Continuation::); 'itc' does not. To see the difference, let's
+ change the previous example to use 'itc' instead.
+
+ ...
+ . itc \\$2 ES
+ ...
+ => oblique face obliqueface (second "face" oblique)
+
+ You can think of the 'ce' and 'rj' requests as implicitly creating
+ an input line trap with 'itc' that schedules a break when the trap
+ is sprung.
+
+ .de BR
+ . br
+ . internal: disable centering-without-filling
+ ..
+ .
+ .de ce
+ . if \\n[.br] .br
+ . itc \\$1 BR
+ . internal: enable centering-without-filling
+ ..
+
+ Let us consider in more detail the sorts of input lines that are or
+ are not "productive".
+
+ .de Trap
+ TRAP SPRUNG
+ ..
+ .de Mac
+ .if r a \l'5n'
+ ..
+ .it 2 Trap
+ .
+ foo
+ .Mac
+ bar
+ baz
+ .it 1 Trap
+ .sp \" moves, but does not write or draw
+ qux
+ .itc 1 Trap
+ \h'5n'\c \" moves, but does not write or draw
+ jat
+
+ When 'Trap' gets called depends on whether the 'a' register is
+ defined; the control line with the 'if' request may or may not
+ produce written output. We also see that the spacing request 'sp',
+ while certainly affecting the output, does not spring the input
+ line trap. Similarly, the horizontal motion escape sequence '\h'
+ also affected the output, but was not "written". Observe that we
+ had to follow it with '\c' and use 'itc' to prevent the newline at
+ the end of the text line from causing a word break, which, like an
+ ordinary space character, counts as written output.
+
+ $ groff -Tascii input-trap-example.groff
+ => foo bar TRAP SPRUNG baz
+ =>
+ => qux TRAP SPRUNG jat TRAP SPRUNG
+ $ groff -Tascii -ra1 input-trap-example.groff
+ => foo _____ TRAP SPRUNG bar baz
+ =>
+ => qux TRAP SPRUNG jat TRAP SPRUNG
+
+ Input line traps are associated with the environment (*note
+Environments::); switching to another environment suspends the current
+input line trap, and going back resumes it, restoring the count of
+qualifying lines enumerated in that environment.
+
+5.28.3 Blank Line Traps
+-----------------------
+
+ -- Request: .blm [name]
+ Set a blank line trap, calling the macro NAME when GNU 'troff'
+ encounters a blank line in an input file, instead of the usual
+ behavior (*note Breaking::). A line consisting only of spaces is
+ also treated as blank and subject to this trap. If no argument is
+ supplied, the default blank line behavior is (re-)established.
+
+5.28.4 Leading Space Traps
+--------------------------
+
+ -- Request: .lsm [name]
+ -- Register: \n[lsn]
+ -- Register: \n[lss]
+ Set a leading space trap, calling the macro NAME when GNU 'troff'
+ encounters leading spaces in an input line; the implicit line break
+ that normally happens in this case is suppressed. If no argument
+ is supplied, the default leading space behavior is (re-)established
+ (*note Breaking::).
+
+ The count of leading spaces on an input line is stored in register
+ 'lsn', and the amount of corresponding horizontal motion in
+ register 'lss', irrespective of whether a leading space trap is
+ set. When it is, the leading spaces are removed from the input
+ line, and no motion is produced before calling NAME.
+
+5.28.5 End-of-input Traps
+-------------------------
+
+ -- Request: .em [name]
+ Set a trap at the end of input, calling macro NAME after the last
+ line of the last input file has been processed. If no argument is
+ given, any existing end-of-input trap is removed.
+
+ For example, if the document had to have a section at the bottom of
+ the last page for someone to approve it, the 'em' request could be
+ used.
+
+ .de approval
+ \c
+ . ne 3v
+ . sp (\\n[.t]u - 3v)
+ . in +4i
+ . lc _
+ . br
+ Approved:\t\a
+ . sp
+ Date:\t\t\a
+ ..
+ .
+ .em approval
+
+ The '\c' in the above example needs explanation. For historical
+ reasons (compatibility with AT&T 'troff'), the end-of-input macro
+ exits as soon as it causes a page break if no partially collected
+ line remains.(1) (*note End-of-input Traps-Footnote-1::)
+
+ Let us assume that there is no '\c' in the above 'approval' macro,
+ that the page is full, and last output line has been broken with,
+ say, a 'br' request. Because there is no more room, a 'ne' request
+ at this point causes a page ejection, which in turn makes 'troff'
+ exit immediately as just described. In most situations, this is
+ not desired; people generally want to format the input after 'ne'.
+
+ To force processing of the whole end-of-input macro independently
+ of this behavior, it is thus advisable to (invisibly) ensure the
+ existence of a partially collected line ('\c') whenever there is a
+ chance that a page break can happen. In the above example,
+ invoking the 'ne' request ensures that there is room for the
+ subsequent formatted output on the same page, so we need insert
+ '\c' only once.
+
+ The next example shows how to append three lines, then start a new
+ page unconditionally. Since '.ne 1' doesn't give the desired
+ effect--there is always one line available or we are already at the
+ beginning of the next page--we temporarily increase the page length
+ by one line so that we can use '.ne 2'.
+
+ .de EM
+ .pl +1v
+ \c
+ .ne 2
+ line one
+ .br
+ \c
+ .ne 2
+ line two
+ .br
+ \c
+ .ne 2
+ line three
+ .br
+ .pl -1v
+ \c
+ 'bp
+ ..
+ .em EM
+
+ This specific feature affects only the first potential page break
+ caused by the end-of-input macro; further page breaks emitted by
+ the macro are handled normally.
+
+ Another possible use of the 'em' request is to make GNU 'troff'
+ emit a single large page instead of multiple pages. For example,
+ one may want to produce a long plain text file for reading in a
+ terminal or emulator without page footers and headers interrupting
+ the body of the document. One approach is to set the page length
+ at the beginning of the document to a very large value to hold all
+ the text,(2) (*note End-of-input Traps-Footnote-2::) and
+ automatically adjust it to the exact height of the document after
+ the text has been output.
+
+ .de adjust-page-length
+ . br
+ . pl \\n[nl]u \" \n[nl]: current vertical position
+ ..
+ .
+ .de single-page-mode
+ . pl 99999
+ . em adjust-page-length
+ ..
+ .
+ .\" Activate the above code if configured.
+ .if \n[do-continuous-rendering] \
+ . single-page-mode
+
+ Since only one end-of-input trap exists and another macro package
+ may already use it, care must be taken not to break the mechanism.
+ A simple solution would be to append the above macro to the macro
+ package's end-of-input macro using the 'am' request.
+
+ (1) While processing an end-of-input macro, the formatter assumes
+that the next page break must be the last; it goes into "sudden death
+overtime".
+
+ (2) Another, taken by the 'groff' 'man' macros, is to intercept 'ne'
+requests and wrap 'bp' ones.
+
+5.29 Diversions
+===============
+
+In 'roff' systems it is possible to format text as if for output, but
+instead of writing it immediately, one can "divert" the formatted text
+into a named storage area. It is retrieved later by specifying its name
+after a control character. The same name space is used for such
+diversions as for strings and macros; see *note Identifiers::. Such
+text is sometimes said to be "stored in a macro", but this coinage
+obscures the important distinction between macros and strings on one
+hand and diversions on the other; the former store _unformatted_ input
+text, and the latter capture _formatted_ output. Diversions also do not
+interpret arguments. Applications of diversions include "keeps"
+(preventing a page break from occurring at an inconvenient place by
+forcing a set of output lines to be set as a group), footnotes, tables
+of contents, and indices. For orthogonality it is said that GNU 'troff'
+is in the "top-level diversion" if no diversion is active (that is,
+formatted output is being "diverted" immediately to the output device).
+
+ Dereferencing an undefined diversion will create an empty one of that
+name and cause a warning in category 'mac' to be emitted. *Note
+Warnings::, for information about the enablement and suppression of
+warnings. A diversion does not exist for the purpose of testing with
+the 'd' conditional operator until its initial definition ends (*note
+Operators in Conditionals::). The following requests are used to create
+and alter diversions.
+
+ -- Request: .di [name]
+ -- Request: .da [name]
+ Start collecting formatted output in a diversion called NAME. The
+ 'da' request appends to a diversion called NAME, creating it if
+ necessary. If NAME already exists as an alias, the target of the
+ alias is replaced or appended to; recall *note Strings::. The
+ pending output line is diverted as well. Switching to another
+ environment (with the 'ev' request) before invoking 'di' or 'da'
+ avoids including any pending output line in the diversion; see
+ *note Environments::.
+
+ Invoking 'di' or 'da' without an argument stops diverting output to
+ the diversion named by the most recent corresponding request. If
+ 'di' or 'da' is called without an argument when there is no current
+ diversion, a warning in category 'di' is produced. *Note
+ Warnings::, for information about the enablement and suppression of
+ warnings.
+
+ Before the diversion.
+ .di yyy
+ In the diversion.
+ .br
+ .di
+ After the diversion.
+ .br
+ => After the diversion.
+ .yyy
+ => Before the diversion. In the diversion.
+
+ GNU 'troff' supports "box" requests to exclude a partially collected
+line from a diversion, as this is often desirable.
+
+ -- Request: .box [name]
+ -- Request: .boxa [name]
+ Divert (or append) output to NAME, similarly to the 'di' and 'da'
+ requests, respectively. Any pending output line is _not_ included
+ in the diversion. Without an argument, stop diverting output; any
+ pending output line inside the diversion is discarded.
+
+ Before the box.
+ .box xxx
+ In the box.
+ .br
+ Hidden treasure.
+ .box
+ After the box.
+ .br
+ => Before the box. After the box.
+ .xxx
+ => In the box.
+
+ Apart from pending output line inclusion and the request names that
+populate them, boxes are handled exactly as diversions are. All of the
+following 'groff' language elements can be used with them
+interchangeably.
+
+ -- Register: \n[.z]
+ -- Register: \n[.d]
+ Diversions may be nested. The read-only string-valued register
+ '.z' contains the name of the current diversion. The read-only
+ register '.d' contains the current vertical place in the diversion.
+ If the input text is not being diverted, '.d' reports the same
+ location as the register 'nl'.
+
+ -- Register: \n[.h]
+ The read-only register '.h' stores the "high-water mark" on the
+ current page or in the current diversion. It corresponds to the
+ text baseline of the lowest line on the page.(1) (*note
+ Diversions-Footnote-1::)
+
+ .tm .h==\n[.h], nl==\n[nl]
+ => .h==0, nl==-1
+ This is a test.
+ .br
+ .sp 2
+ .tm .h==\n[.h], nl==\n[nl]
+ => .h==40, nl==120
+
+ As implied by the example, vertical motion does not produce text
+ baselines and thus does not increase the value interpolated by
+ '\n[.h]'.
+
+ -- Register: \n[dn]
+ -- Register: \n[dl]
+ After completing a diversion, the writable registers 'dn' and 'dl'
+ contain its vertical and horizontal sizes. Only the lines just
+ processed are counted: for the computation of 'dn' and 'dl', the
+ requests 'da' and 'boxa' are handled as if 'di' and 'box' had been
+ used, respectively--lines that have been already stored in the
+ diversion (box) are not taken into account.
+
+ .\" Center text both horizontally and vertically.
+ .\" Macro .(c starts centering mode; .)c terminates it.
+ .
+ .\" Disable the escape character with .eo so that we
+ .\" don't have to double backslashes on the "\n"s.
+ .eo
+ .de (c
+ . br
+ . ev (c
+ . evc 0
+ . in 0
+ . nf
+ . di @c
+ ..
+ .de )c
+ . br
+ . ev
+ . di
+ . nr @s (((\n[.t]u - \n[dn]u) / 2u) - 1v)
+ . sp \n[@s]u
+ . ce 1000
+ . @c
+ . ce 0
+ . sp \n[@s]u
+ . br
+ . fi
+ . rr @s
+ . rm @c
+ ..
+ .ec
+
+ -- Escape sequence: \!anything
+ -- Escape sequence: \?anything\?
+ "Transparently" embed ANYTHING into the current diversion,
+ preventing requests, macro calls, and escape sequences from being
+ interpreted when read into a diversion. This is useful for
+ preventing them from taking effect until the diverted text is
+ actually output. The '\!' escape sequence transparently embeds
+ input up to and including the end of the line. The '\?' escape
+ sequence transparently embeds input until its own next occurrence.
+
+ ANYTHING may not contain newlines; use '\!' by itself to embed
+ newlines in a diversion. The escape sequence '\?' is also
+ recognized in copy mode and turned into a single internal code; it
+ is this code that terminates ANYTHING. Thus the following example
+ prints 4.
+
+ .nr x 1
+ .nf
+ .di d
+ \?\\?\\\\?\\\\\\\\nx\\\\?\\?\?
+ .di
+ .nr x 2
+ .di e
+ .d
+ .di
+ .nr x 3
+ .di f
+ .e
+ .di
+ .nr x 4
+ .f
+
+ Both escape sequences read the data in copy mode.
+
+ If '\!' is used in the top-level diversion, its argument is
+ directly embedded into GNU 'troff''s intermediate output. This can
+ be used, for example, to control a postprocessor that processes the
+ data before it is sent to an output driver.
+
+ The '\?' escape used in the top-level diversion produces no output
+ at all; its argument is simply ignored.
+
+ -- Request: .output contents
+ Emit CONTENTS directly to GNU 'troff''s intermediate output
+ (subject to copy mode interpretation); this is similar to '\!' used
+ at the top level. An initial neutral double quote in CONTENTS is
+ stripped to allow embedding of leading spaces.
+
+ This request can't be used before the first page has started--if
+ you get an error, simply insert '.br' before the 'output' request.
+
+ Use with caution! It is normally only needed for mark-up used by a
+ postprocessor that does something with the output before sending it
+ to the output device, filtering out CONTENTS again.
+
+ -- Request: .asciify div
+ "Unformat" the diversion DIV in a way such that Unicode basic Latin
+ (ASCII) characters, characters translated with the 'trin' request,
+ space characters, and some escape sequences, that were formatted
+ and diverted into DIV are treated like ordinary input characters
+ when DIV is reread. Doing so can be useful in conjunction with the
+ 'writem' request. 'asciify' can be also used for gross hacks; for
+ example, the following sets register 'n' to 1.
+
+ .tr @.
+ .di x
+ @nr n 1
+ .br
+ .di
+ .tr @@
+ .asciify x
+ .x
+
+ 'asciify' cannot return all items in a diversion to their source
+ equivalent: nodes such as those produced by the '\N' escape
+ sequence will remain nodes, so the result cannot be guaranteed to
+ be a pure string. *Note Copy Mode::. Glyph parameters such as the
+ type face and size are not preserved; use 'unformat' to achieve
+ that.
+
+ -- Request: .unformat div
+ Like 'asciify', unformat the diversion DIV. However, 'unformat'
+ handles only tabs and spaces between words, the latter usually
+ arising from spaces or newlines in the input. Tabs are treated as
+ input tokens, and spaces become adjustable again. The vertical
+ sizes of lines are not preserved, but glyph information (font, type
+ size, space width, and so on) is retained.
+
+ (1) Thus, the "water" gets "higher" proceeding _down_ the page.
+
+5.30 Punning Names
+==================
+
+Macros, strings, and diversions share a name space; recall *note
+Identifiers::. Internally, the same mechanism is used to store them.
+You can thus call a macro with string interpolation syntax and vice
+versa.
+
+ .de subject
+ Typesetting
+ ..
+ .de predicate
+ rewards attention to detail
+ ..
+ \*[subject] \*[predicate].
+ Truly.
+ => Typesetting
+ => rewards attention to detail Truly.
+
+What went wrong? Strings don't contain newlines, but macros do. String
+interpolation placed a newline at the end of '\*[subject]', and the next
+thing on the input was a space. Then when '\*[predicate]' was
+interpolated, it was followed by the empty request '.' on a line by
+itself. If we want to use macros as strings, we must take interpolation
+behavior into account.
+
+ .de subject
+ Typesetting\\
+ ..
+ .de predicate
+ rewards attention to detail\\
+ ..
+ \*[subject] \*[predicate].
+ Truly.
+ => Typesetting rewards attention to detail. Truly.
+
+By ending each text line of the macros with an escaped '\<RET>', we get
+the desired effect (*note Line Continuation::).(1) (*note Punning
+Names-Footnote-1::) What would have happened if we had used only one
+backslash at a time instead?
+
+ Interpolating a string does not hide existing macro arguments. We
+can also place the escaped newline outside the string interpolation
+instead of within the string definition. Thus, in a macro, a more
+efficient way of doing
+
+ .xx \\$@
+
+is
+
+ \\*[xx]\\
+
+The latter calling syntax doesn't change the value of '\$0', which is
+then inherited from the calling macro (*note Parameters::).
+
+ Diversions can be also called with string syntax. It is sometimes
+convenient to copy one-line diversions to a string.
+
+ .di xx
+ the
+ .ft I
+ interpolation system
+ .ft
+ .br
+ .di
+ .ds yy This is a test of \*(xx\c
+ \*(yy.
+ => This is a test of the interpolation system.
+
+As the previous example shows, it is possible to store formatted output
+in strings. The '\c' escape sequence prevents the subsequent newline
+from being interpreted as a break (again, *note Line Continuation::).
+
+ Copying multi-output line diversions produces unexpected results.
+
+ .di xxx
+ a funny
+ .br
+ test
+ .br
+ .di
+ .ds yyy This is \*[xxx]\c
+ \*[yyy].
+ => test This is a funny.
+
+ Usually, it is not predictable whether a diversion contains one or
+more output lines, so this mechanism should be avoided. With AT&T
+'troff', this was the only solution to strip off a final newline from a
+diversion. Another disadvantage is that the spaces in the copied string
+are already formatted, preventing their adjustment. This can cause ugly
+results.
+
+ A clean solution to this problem is available in GNU 'troff', using
+the requests 'chop' to remove the final newline of a diversion, and
+'unformat' to make the horizontal spaces adjustable again.
+
+ .box xxx
+ a funny
+ .br
+ test
+ .br
+ .box
+ .chop xxx
+ .unformat xxx
+ This is \*[xxx].
+ => This is a funny test.
+
+ *Note Gtroff Internals::.
+
+ (1) The backslash is doubled. *Note Copy Mode::.
+
+5.31 Environments
+=================
+
+As discussed in *note Deferring Output::, environments store most of the
+parameters that determine the appearance of text. A default environment
+named '0' exists when GNU 'troff' starts up; it is modified by
+formatting-related requests and escape sequences.
+
+ You can create new environments and switch among them. Only one is
+current at any given time. Active environments are managed using a
+"stack", a data structure supporting "push" and "pop" operations. The
+current environment is at the top of the stack. The same environment
+name can be pushed onto the stack multiple times, possibly interleaved
+with others. Popping the environment stack does not destroy the current
+environment; it remains accessible by name and can be made current again
+by pushing it at any time. Environments cannot be renamed or deleted,
+and can only be modified when current. To inspect the environment
+stack, use the 'pev' request; see *note Debugging::.
+
+ Environments store the following information.
+
+ * a partially collected line, if any
+
+ * data about the most recently output glyph and line (registers
+ '.cdp', '.cht', '.csk', '.n', '.w')
+
+ * typeface parameters (size, family, style, height and slant,
+ inter-word and inter-sentence space sizes)
+
+ * page parameters (line length, title length, vertical spacing, line
+ spacing, indentation, line numbering, centering, right-alignment,
+ underlining, hyphenation parameters)
+
+ * filling enablement; adjustment enablement and mode
+
+ * tab stops; tab, leader, escape, control, no-break control,
+ hyphenation, and margin characters
+
+ * input line traps
+
+ * stroke and fill colors
+
+ -- Request: .ev [ident]
+ -- Register: \n[.ev]
+ Enter the environment IDENT, which is created if it does not
+ already exist, using the same parameters as for the default
+ environment used at startup. With no argument, GNU 'troff'
+ switches to the previous environment.
+
+ Invoking 'ev' with an argument puts environment IDENT onto the top
+ of the environment stack. (If it isn't already present in the
+ stack, this is a proper push.) Without an argument, 'ev' pops the
+ environment stack, making the previous environment current. It is
+ an error to pop the environment stack with no previous environment
+ available. The read-only string-valued register '.ev' contains the
+ name of the current environment--the one at the top of the stack.
+
+ .ev footnote-env
+ .fam N
+ .ps 6
+ .vs 8
+ .ll -.5i
+ .ev
+
+ ...
+
+ .ev footnote-env
+ \[dg] Observe the smaller text and vertical spacing.
+ .ev
+
+ We can familiarize ourselves with stack behavior by wrapping the
+ 'ev' request with a macro that reports the contents of the '.ev'
+ register to the standard error stream.
+
+ .de EV
+ . ev \\$1
+ . tm environment is now \\n[.ev]
+ ..
+ .
+ .EV foo
+ .EV bar
+ .EV
+ .EV baz
+ .EV
+ .EV
+ .EV
+
+ error-> environment is now foo
+ error-> environment is now bar
+ error-> environment is now foo
+ error-> environment is now baz
+ error-> environment is now foo
+ error-> environment is now 0
+ error-> error: environment stack underflow
+ error-> environment is now 0
+
+ -- Request: .evc environment
+ Copy the contents of ENVIRONMENT to the current environment.
+
+ The following environment data are not copied.
+
+ * a partially collected line, if present;
+
+ * the interruption status of the previous input line (due to use
+ of the '\c' escape sequence);
+
+ * the count of remaining lines to center, to right-justify, or
+ to underline (with or without underlined spaces)--these are
+ set to zero;
+
+ * the activation status of temporary indentation;
+
+ * input line traps and their associated data;
+
+ * the activation status of line numbering (which can be
+ reactivated with '.nm +0'); and
+
+ * the count of consecutive hyphenated lines (set to zero).
+
+ -- Register: \n[.w]
+ -- Register: \n[.cht]
+ -- Register: \n[.cdp]
+ -- Register: \n[.csk]
+ The '\n[.w]' register contains the width of the last glyph
+ formatted in the environment.
+
+ The '\n[.cht]' register contains the height of the last glyph
+ formatted in the environment.
+
+ The '\n[.cdp]' register contains the depth of the last glyph
+ formatted in the environment. It is positive for glyphs extending
+ below the baseline.
+
+ The '\n[.csk]' register contains the "skew" (how far to the right
+ of the glyph's center that GNU 'troff' should place an accent) of
+ the last glyph formatted in the environment.
+
+ -- Register: \n[.n]
+ The '\n[.n]' register contains the length of the previous output
+ line emitted in the environment.
+
+5.32 Suppressing Output
+=======================
+
+ -- Escape sequence: \O[num]
+ Suppress GNU 'troff' output of glyphs and geometric objects. The
+ sequences '\O2', '\O3', '\O4', and '\O5' are intended for internal
+ use by 'grohtml'.
+
+ '\O0'
+ Disable the emission of glyphs and geometric objects to the
+ output driver, provided that this sequence occurs at the
+ outermost suppression level (see '\O3' and '\04' below).
+ Horizontal motions corresponding to non-overstruck glyph
+ widths still occur.
+
+ '\O1'
+ Enable the emission of glyphs and geometric objects to the
+ output driver, provided that this sequence occurs at the
+ outermost suppression level.
+
+ '\O0' and '\O1' also reset the four registers 'opminx', 'opminy',
+ 'opmaxx', and 'opmaxy' to -1. These four registers mark the top
+ left and bottom right hand corners of a box encompassing all
+ written or drawn output.
+
+ '\O2'
+ At the outermost suppression level, enable emission of glyphs
+ and geometric objects, and write to the standard error stream
+ the page number and values of the four aforementioned
+ registers encompassing glyphs written since the last
+ interpolation of a '\O' sequence, as well as the page offset,
+ line length, image file name (if any), horizontal and vertical
+ device motion quanta, and input file name. Numeric values are
+ in basic units.
+
+ '\O3'
+ Begin a nested suppression level. 'grohtml' uses this
+ mechanism to create images of output preprocessed with 'gpic',
+ 'geqn', and 'gtbl'. At startup, GNU 'troff' is at the
+ outermost suppression level. 'pre-grohtml' generates these
+ sequences when processing the document, using GNU 'troff' with
+ the 'ps' output device, Ghostscript, and the PNM tools to
+ produce images in PNG format. They start a new page if the
+ device is not 'html' or 'xhtml', to reduce the number of
+ images crossing a page boundary.
+
+ '\O4'
+ End a nested suppression level.
+
+ '\O[5PFILE]'
+ At the outermost suppression level, write the name 'file' to
+ the standard error stream at position P, which must be one of
+ 'l', 'r', 'c', or 'i', corresponding to left, right, centered,
+ and inline alignments within the document, respectively. FILE
+ is a name associated with the production of the next image.
+
+ -- Register: \n[.O]
+ Output suppression nesting level applied by '\O3' and '\O4' escape
+ sequences.
+
+5.33 I/O
+========
+
+'gtroff' has several requests for including files:
+
+ -- Request: .so file
+ -- Request: .soquiet file
+ Replace the 'so' request's control line with the contents of the
+ file named by the argument, "sourcing" it. FILE is sought in the
+ directories specified by '-I' command-line option. If FILE does
+ not exist, a warning in category 'file' is produced and the request
+ has no further effect. *Note Warnings::, for information about the
+ enablement and suppression of warnings.
+
+ 'so' can be useful for large documents; e.g., allowing each chapter
+ of a book to be kept in a separate file. However, files
+ interpolated with 'so' are not preprocessed; to overcome this
+ limitation, see the 'gsoelim(1)' man page.
+
+ Since GNU 'troff' replaces the entire control line with the
+ contents of a file, it matters whether 'file' is terminated with a
+ newline or not. Assume that file 'xxx' contains only the word
+ 'foo' without a trailing newline.
+
+ $ printf 'foo' > xxx
+
+ The situation is
+ .so xxx
+ bar.
+ => The situation is foobar.
+
+ 'soquiet' works the same way, except that no warning diagnostic is
+ issued if FILE does not exist.
+
+ -- Request: .pso command
+ Read the standard output from the specified COMMAND and include it
+ in place of the 'pso' request.
+
+ It is an error to use this request in safer mode, which is the
+ default. Invoke GNU 'troff' or a front end with the '-U' option to
+ enable unsafe mode.
+
+ The comment regarding a final newline for the 'so' request is valid
+ for 'pso' also.
+
+ -- Request: .mso file
+ -- Request: .msoquiet file
+ Identical to the 'so' and 'soquiet' requests, respectively, except
+ that 'gtroff' searches for the specified FILE in the same
+ directories as macro files for the '-m' command-line option. If
+ the file name to be included has the form 'NAME.tmac' and it isn't
+ found, these requests try to include 'tmac.NAME' and vice versa.
+
+ -- Request: .trf file
+ -- Request: .cf file
+ Transparently output the contents of FILE. Each line is output as
+ if it were preceded by '\!'; however, the lines are _not_ subject
+ to copy mode interpretation. If the file does not end with a
+ newline, 'trf' adds one. Both requests cause a break.
+
+ When used in a diversion, these requests embed a node (*note Gtroff
+ Internals::) in it that, when reread, causes the contents of FILE
+ to be transparently copied to the output. In AT&T 'troff', the
+ contents of FILE are immediately copied to the output regardless of
+ whether there is a current diversion; this behaviour is so
+ anomalous that it must be considered a bug.
+
+ While 'cf' copies the contents of FILE completely unprocessed,
+ 'trf' disallows characters such as NUL that are not valid 'gtroff'
+ input characters (*note Identifiers::).
+
+ For 'cf', within a diversion, "completely unprocessed" means that
+ each line of a file to be inserted is handled as if it were
+ preceded by '\!\\!'.
+
+ To define a macro 'x' containing the contents of file 'f', use
+
+ .ev 1
+ .di x
+ .trf f
+ .di
+ .ev
+
+ The calls to 'ev' prevent the partially collected output line from
+ becoming part of the diversion (*note Diversions::).
+
+ -- Request: .nx [file]
+ Force 'gtroff' to continue processing of the file specified as an
+ argument. If no argument is given, immediately jump to the end of
+ file.
+
+ -- Request: .rd [prompt [arg1 arg2 ...]]
+ Read from standard input, and include what is read as though it
+ were part of the input file. Text is read until a blank line is
+ encountered.
+
+ If standard input is a TTY input device (keyboard), write PROMPT to
+ standard error, followed by a colon (or send BEL for a beep if no
+ argument is given).
+
+ Arguments after PROMPT are available for the input. For example,
+ the line
+
+ .rd data foo bar
+
+ with the input 'This is \$2.' prints
+
+ This is bar.
+
+ Using the 'nx' and 'rd' requests, it is easy to set up form letters.
+The form letter template is constructed like this, putting the following
+lines into a file called 'repeat.let':
+
+ .ce
+ \*(td
+ .sp 2
+ .nf
+ .rd
+ .sp
+ .rd
+ .fi
+ Body of letter.
+ .bp
+ .nx repeat.let
+
+When this is run, a file containing the following lines should be
+redirected in. Requests included in this file are executed as though
+they were part of the form letter. The last block of input is the 'ex'
+request, which tells GNU 'troff' to stop processing. If this were not
+there, 'troff' would not know when to stop.
+
+ Trent A. Fisher
+ 708 NW 19th Av., #202
+ Portland, OR 97209
+
+ Dear Trent,
+
+ Len Adollar
+ 4315 Sierra Vista
+ San Diego, CA 92103
+
+ Dear Mr. Adollar,
+
+ .ex
+
+ -- Request: .pi pipe
+ Pipe the output of 'gtroff' to the shell command(s) specified by
+ PIPE. This request must occur before 'gtroff' has a chance to
+ print anything.
+
+ It is an error to use this request in safer mode, which is the
+ default. Invoke GNU 'troff' or a front end with the '-U' option to
+ enable unsafe mode.
+
+ Multiple calls to 'pi' are allowed, acting as a chain. For
+ example,
+
+ .pi foo
+ .pi bar
+ ...
+
+ is the same as '.pi foo | bar'.
+
+ The intermediate output format of GNU 'troff' is piped to the
+ specified commands. Consequently, calling 'groff' without the '-Z'
+ option normally causes a fatal error.
+
+ -- Request: .sy cmds
+ -- Register: \n[systat]
+ Execute the shell command(s) specified by CMDS. The output is not
+ saved anywhere, so it is up to the user to do so.
+
+ It is an error to use this request in safer mode; this is the
+ default. Give GNU 'troff' or a front end program the '-U' option
+ to enable unsafe mode.
+
+ The following code fragment introduces the current time into a
+ document.
+
+ .sy perl -e 'printf ".nr H %d\\n.nr M %d\\n.nr S %d\\n",\
+ (localtime(time))[2,1,0]' > /tmp/x\n[$$]
+ .so /tmp/x\n[$$]
+ .sy rm /tmp/x\n[$$]
+ \nH:\nM:\nS
+
+ This works by having the Perl script (run by 'sy') write 'nr'
+ requests that set the registers 'H', 'M', and 'S' to a temporary
+ file. The 'roff' document then reads the temporary file using the
+ 'so' request.
+
+ The registers 'seconds', 'minutes', and 'hours', initialized at
+ startup of GNU 'troff', should satisfy most requirements. Use the
+ 'af' request to format their values for output.
+
+ .af hours 00
+ .af minutes 00
+ .af seconds 00
+ \n[hours]:\n[minutes]:\n[seconds]
+ => 02:17:54
+
+ The writable register 'systat' contains the return value of the
+ 'system()' function executed by the last 'sy' request.
+
+ -- Request: .open stream file
+ -- Request: .opena stream file
+ Open the specified FILE for writing and associates the specified
+ STREAM with it.
+
+ The 'opena' request is like 'open', but if the file exists, append
+ to it instead of truncating it.
+
+ It is an error to use these requests in safer mode; this is the
+ default. Give GNU 'troff' or a front end program the '-U' option
+ to enable unsafe mode.
+
+ -- Request: .write stream data
+ -- Request: .writec stream data
+ Write to the file associated with the specified STREAM. The stream
+ must previously have been the subject of an open request. The
+ remainder of the line is interpreted as the 'ds' request reads its
+ second argument: an initial neutral double quote in CONTENTS is
+ stripped to allow embedding of leading spaces, and it is read in
+ copy mode.
+
+ The 'writec' request is like 'write', but only 'write' appends a
+ newline to the data.
+
+ -- Request: .writem stream xx
+ Write the contents of the macro or string XX to the file associated
+ with the specified STREAM.
+
+ XX is read in copy mode, i.e., already formatted elements are
+ ignored. Consequently, diversions must be unformatted with the
+ 'asciify' request before calling 'writem'. Usually, this means a
+ loss of information.
+
+ -- Request: .close stream
+ Close the specified STREAM; the stream is no longer an acceptable
+ argument to the 'write' request.
+
+ Here a simple macro to write an index entry.
+
+ .open idx test.idx
+ .
+ .de IX
+ . write idx \\n[%] \\$*
+ ..
+ .
+ .IX test entry
+ .
+ .close idx
+
+ -- Escape sequence: \Ve
+ -- Escape sequence: \V(ev
+ -- Escape sequence: \V[env]
+ Interpolate the contents of the specified environment variable ENV
+ (one-character name E, two-character name EV) as returned by the
+ function 'getenv(3)'. '\V' is interpreted even in copy mode (*note
+ Copy Mode::).
+
+5.34 Postprocessor Access
+=========================
+
+Two escape sequences and two requests enable documents to pass
+information directly to a postprocessor. These are useful for
+exercising device-specific capabilities that the 'groff' language does
+not abstract or generalize; examples include the embedding of hyperlinks
+and image files. Device-specific functions are documented in each
+output driver's man page, such as 'gropdf(1)', 'grops(1)', or
+'grotty(1)'.
+
+ -- Request: .device xxx ...
+ -- Escape sequence: \X'xxx ...'
+ Embed all XXX arguments into GNU 'troff' output as parameters to a
+ device control command 'x X'. The meaning and interpretation of
+ such parameters is determined by the output driver or other
+ postprocessor.
+
+ The 'device' request processes its arguments in copy mode (*note
+ Copy Mode::). An initial neutral double quote in CONTENTS is
+ stripped to allow embedding of leading spaces. By contrast, within
+ '\X' arguments, the escape sequences '\&', '\)', '\%', and '\:' are
+ ignored; '\<SP>' and '\~' are converted to single space characters;
+ and '\\' has its escape character stripped. So that the basic
+ Latin subset of the Unicode character set(1) (*note Postprocessor
+ Access-Footnote-1::) can be reliably encoded in device control
+ commands, seven special character escape sequences ('\-', '\[aq]',
+ '\[dq]', '\[ga]', '\[ha]', '\[rs]', and '\[ti]',) are mapped to
+ basic Latin characters; see the 'groff_char(7)' man page. For this
+ transformation, character translations and special character
+ definitions are ignored.(2) (*note Postprocessor
+ Access-Footnote-2::) The use of any other escape sequence in '\X'
+ parameters is normally an error.
+
+ If the 'use_charnames_in_special' directive appears in the output
+ device's 'DESC' file, the use of special character escape sequences
+ is _not_ an error; they are simply output verbatim (with the
+ exception of the seven mapped to Unicode basic Latin characters,
+ discussed above). 'use_charnames_in_special' is currently employed
+ only by 'grohtml'.
+
+ -- Request: .devicem name
+ -- Escape sequence: \Yn
+ -- Escape sequence: \Y(nm
+ -- Escape sequence: \Y[name]
+ This is approximately equivalent to '\X'\*[NAME]'' (one-character
+ name N, two-character name NM). However, the contents of the
+ string or macro NAME are not interpreted; also it is permitted for
+ NAME to have been defined as a macro and thus contain newlines (it
+ is not permitted for the argument to '\X' to contain newlines).
+ The inclusion of newlines requires an extension to the AT&T 'troff'
+ output format, and confuses drivers that do not know about this
+ extension (*note Device Control Commands::).
+
+ -- Request: .tag name
+ -- Request: .taga name
+ Reserved for internal use.
+
+ (1) that is, ISO 646:1991-IRV or, popularly, "US-ASCII"
+
+ (2) They are bypassed because these parameters are not rendered as
+glyphs in the output; instead, they remain abstract characters--in a PDF
+bookmark or a URL, for example.
+
+5.35 Miscellaneous
+==================
+
+We document here GNU 'troff' features that fit poorly elsewhere.
+
+ -- Request: .nm [start [increment [space [indentation]]]]
+ -- Register: \n[ln]
+ -- Register: \n[.nm]
+ Begin (or, with no arguments, cease) numbering output lines. START
+ assigns the number of the _next_ output line. Only line numbers
+ divisible by INCREMENT are marked (default: '1'). SPACE configures
+ the horizontal spacing between the number and the text (default:
+ '1'). Any given INDENTATION is applied to the numbers (default:
+ '0'). The third and fourth arguments are reckoned in numeral
+ widths ('\0'). START must be non-negative and INCREMENT positive.
+
+ The formatter aligns the number to the right in a width of three
+ numeral spaces plus INDENTATION, then catenates SPACE and the
+ output line. The line length is _not_ reduced. Depending on the
+ value of the page offset,(1) (*note Miscellaneous-Footnote-1::)
+ numbers wider than the allocated space protrude into the left
+ margin, or shift the output line to the right.
+
+ Line numbering parameters corresponding to missing arguments are
+ not altered. After numbering is disabled, '.nm +0' resumes it
+ using the previously active parameters.
+
+ The parameters of 'nm' are associated with the environment (*note
+ Environments::).
+
+ While numbering is enabled, the output line number register 'ln' is
+ updated as each line is output, even if no line number is formatted
+ with it because it is being skipped (it is not a multiple of
+ INCREMENT) or because numbering is suppressed (see the 'nn' request
+ below).
+
+ The '.nm' register tracks the enablement status of numbering.
+ Temporary suspension of numbering with the 'nn' request does _not_
+ alter its value.
+
+ .po 5n
+ .ll 44n
+ Programming,
+ when stripped of all its circumstantial irrelevancies,
+ .nm 999 1 1 -4
+ boils down to no more and no less than
+ .nm +0 3
+ very effective thinking so as to avoid unmastered
+ .nn 2
+ complexity,
+ to very vigorous separation of your many
+ different concerns.
+ .br
+ \(em Edsger Dijkstra
+ .sp
+ .nm 1 1 1
+ This guy's arrogance takes your breath away.
+ .br
+ \(em John Backus
+ => Programming, when stripped of all its cir-
+ => 999 cumstantial irrelevancies, boils down to no
+ => more and no less than very effective think-
+ => ing so as to avoid unmastered complexity, to
+ => very vigorous separation of your many dif-
+ => ferent concerns.
+ => 1002 -- Edsger Dijkstra
+ =>
+ => 1 This guy's arrogance takes your breath away.
+ => 2 -- John Backus
+
+ -- Request: .nn [skip]
+ -- Register: \n[.nn]
+ Suppress numbering of the next SKIP output lines that would
+ otherwise be numbered. The default is 1. 'nn' can be invoked when
+ line numbering is not active; suppression of numbering will take
+ effect for SKIP lines once 'nm' enables it.
+
+ The '.nn' register stores the count of output lines still to have
+ their numbering suppressed.
+
+ This count is associated with the environment (*note
+ Environments::).
+
+ To test whether the current output line will be numbered, you must
+check both the '.nm' and '.nn' registers.
+
+ .de is-numbered
+ . nop This line
+ . ie (\\n[.nm] & (1-\\n[.nn])) IS
+ . el ISN'T
+ . nop numbered.
+ . br
+ ..
+ Test line numbering.
+ .is-numbered
+ .nm 1
+ .nn 1
+ .is-numbered
+ .is-numbered
+ .nm
+ .is-numbered
+ => Test line numbering. This line ISN'T numbered.
+ => This line ISN'T numbered.
+ => 1 This line IS numbered.
+ => This line ISN'T numbered.
+
+ -- Request: .mc [margin-character [distance]
+ Begin (or, with no arguments, cease) writing a "margin-character"
+ to the right of each output line. The DISTANCE argument separates
+ MARGIN-CHARACTER from the right margin. If absent, the most recent
+ value is used; the default is 10 points. If an output line exceeds
+ the line length, the margin character is appended to it. No margin
+ character is written on lines produced by the 'tl' request.
+
+ The margin character is a property of the output line; the margin
+ character last configured when the line is output controls. If the
+ margin character is disabled before an output line breaks, none is
+ output (but see below).
+
+ The margin character is associated with the environment (*note
+ Environments::).
+
+ .ll 5i
+ .nf
+ .mc \[br]
+ This paragraph is marked with a margin character.
+ .sp
+ As seen above, vertical space isn't thus marked.
+ \&
+ An output line that is present, but empty, is.
+ => This paragraph is marked with a margin character. |
+ =>
+ => As seen above, vertical space isn't thus marked. |
+ => |
+ => An output line that is present, but empty, is. |
+
+ For compatibility with AT&T 'troff', a call to 'mc' to set the margin
+character can't be undone immediately; at least one line gets a margin
+character.
+
+ .ll 10n
+ .nf
+ .mc |
+ .mc *
+ .mc
+ foo
+ bar
+ => foo *
+ => bar
+
+ The margin character mechanism is commonly used to annotate changes
+in documents. The 'groff' distribution ships a program, 'gdiffmk', to
+assist with this task.(2) (*note Miscellaneous-Footnote-2::)
+
+ -- Request: .psbb file
+ -- Register: \n[llx]
+ -- Register: \n[lly]
+ -- Register: \n[urx]
+ -- Register: \n[ury]
+ Retrieve the bounding box of the PostScript image found in FILE,
+ which must conform to Adobe's "Document Structuring Conventions"
+ (DSC), locate a '%%BoundingBox' comment, and store the (upper-,
+ lower-, -left, -right) values into the registers 'llx', 'lly',
+ 'urx', and 'ury'. If an error occurs (for example, if no
+ '%%BoundingBox' comment is present), the formatter sets these
+ registers to 0.
+
+ The search path for FILE can be controlled with the '-I'
+ command-line option.
+
+ (1) Recall *note Line Layout::.
+
+ (2) Historically, tools named 'nrchbar' and 'changebar' were
+developed for marking changes with margin characters and could be found
+in archives of the 'comp.sources.unix' USENET group. Some proprietary
+Unices also offer(ed) a 'diffmk' program.
+
+5.36 'gtroff' Internals
+=======================
+
+'gtroff' processes input in three steps. One or more input characters
+are converted to an "input token".(1) (*note Gtroff
+Internals-Footnote-1::) Then, one or more input tokens are converted to
+an "output node". Finally, output nodes are converted to the
+intermediate output language understood by all output devices.
+
+ Actually, before step one happens, 'gtroff' converts certain escape
+sequences into reserved input characters (not accessible by the user);
+such reserved characters are used for other internal processing also -
+this is the very reason why not all characters are valid input. *Note
+Identifiers::, for more on this topic.
+
+ For example, the input string 'fi\[:u]' is converted into a character
+token 'f', a character token 'i', and a special token ':u' (representing
+u umlaut). Later on, the character tokens 'f' and 'i' are merged to a
+single output node representing the ligature glyph 'fi' (provided the
+current font has a glyph for this ligature); the same happens with ':u'.
+All output glyph nodes are 'processed', which means that they are
+invariably associated with a given font, font size, advance width, etc.
+During the formatting process, 'gtroff' itself adds various nodes to
+control the data flow.
+
+ Macros, diversions, and strings collect elements in two chained
+lists: a list of input tokens that have been passed unprocessed, and a
+list of output nodes. Consider the following diversion.
+
+ .di xxx
+ a
+ \!b
+ c
+ .br
+ .di
+
+It contains these elements.
+
+node list token list element number
+
+line start node -- 1
+glyph node 'a' -- 2
+word space node -- 3
+-- 'b' 4
+-- '\n' 5
+glyph node 'c' -- 6
+vertical size node -- 7
+vertical size node -- 8
+-- '\n' 9
+
+Elements 1, 7, and 8 are inserted by 'gtroff'; the latter two (which are
+always present) specify the vertical extent of the last line, possibly
+modified by '\x'. The 'br' request finishes the pending output line,
+inserting a newline input token, which is subsequently converted to a
+space when the diversion is reread. Note that the word space node has a
+fixed width that isn't adjustable anymore. To convert horizontal space
+nodes back to input tokens, use the 'unformat' request.
+
+ Macros only contain elements in the token list (and the node list is
+empty); diversions and strings can contain elements in both lists.
+
+ The 'chop' request simply reduces the number of elements in a macro,
+string, or diversion by one. Exceptions are "compatibility save" and
+"compatibility ignore" input tokens, which are ignored. The 'substring'
+request also ignores those input tokens.
+
+ Some requests like 'tr' or 'cflags' work on glyph identifiers only;
+this means that the associated glyph can be changed without destroying
+this association. This can be very helpful for substituting glyphs. In
+the following example, we assume that glyph 'foo' isn't available by
+default, so we provide a substitution using the 'fchar' request and map
+it to input character 'x'.
+
+ .fchar \[foo] foo
+ .tr x \[foo]
+
+Now let us assume that we install an additional special font 'bar' that
+has glyph 'foo'.
+
+ .special bar
+ .rchar \[foo]
+
+Since glyphs defined with 'fchar' are searched before glyphs in special
+fonts, we must call 'rchar' to remove the definition of the fallback
+glyph. Anyway, the translation is still active; 'x' now maps to the
+real glyph 'foo'.
+
+ Macro and request arguments preserve compatibility mode enablement.
+
+ .cp 1 \" switch to compatibility mode
+ .de xx
+ \\$1
+ ..
+ .cp 0 \" switch compatibility mode off
+ .xx caf\['e]
+ => café
+
+Since compatibility mode is enabled while 'de' is invoked, the macro
+'xx' enables compatibility mode when it is called. Argument '$1' can
+still be handled properly because it inherits the compatibility mode
+enablement status that was active at the point where 'xx' was called.
+
+ After interpolation of the parameters, the compatibility save and
+restore tokens are removed.
+
+ (1) Except the escape sequences '\f', '\F', '\H', '\m', '\M', '\R',
+'\s', and '\S', which are processed immediately if not in copy mode.
+
+5.37 Debugging
+==============
+
+ Standard troff voodoo, just put a power of two backslashes in
+ front of it until it works and if you still have problems add a \c.
+ -- Ron Natalie
+
+ GNU 'troff' is not the easiest language to debug, in part thanks to
+its design features of recursive interpolation and the use of
+multi-stage pipeline processing in the surrounding system. Nevertheless
+there exist several features useful for troubleshooting.
+
+ Preprocessors use the 'lf' request to preserve the identity of the
+line numbers and names of input files. GNU 'troff' emits a variety of
+error diagnostics and supports several categories of warning; the output
+of these can be selectively suppressed. A trace of the formatter's
+input processing stack can be emitted when errors or warnings occur by
+means of GNU 'troff''s '-b' option, or produced on demand with the
+'backtrace' request. The 'tm' and related requests can be used to emit
+customized diagnostic messages or for instrumentation while
+troubleshooting. The 'ex' and 'ab' requests cause early termination
+with successful and error exit codes respectively, to halt further
+processing when continuing would be fruitless. Examine the state of the
+formatter with requests that write lists of defined names (macros,
+strings, and diversions), environments, registers, and page location
+traps to the standard error stream.
+
+ -- Request: .lf line [file]
+ Set the input line number (and, optionally, the file name) GNU
+ 'troff' shall use for error and warning messages. LINE is the
+ input line number of the _next_ line. Without an argument, the
+ request is ignored.
+
+ 'lf''s primary purpose is to aid the debugging of documents that
+ undergo preprocessing. Programs like 'tbl' that transform input in
+ their own languages into 'roff' requests use it so that any
+ diagnostic messages emitted by 'troff' correspond to the source
+ document.
+
+ -- Request: .tm message
+ -- Request: .tm1 message
+ -- Request: .tmc message
+ Send MESSAGE, which consumes the remainder of the input line and
+ cannot contain special characters, to the standard error stream,
+ followed by a newline. Leading spaces in MESSAGE are ignored.
+
+ 'tm1' is similar, but recognizes and strips a leading neutral
+ double quote from MESSAGE to allow the embedding of leading spaces.
+
+ 'tmc' works as 'tm1', but does not append a newline.
+
+ -- Request: .ab [message]
+ Write any MESSAGE to the standard error stream (like 'tm') and then
+ abort GNU 'troff'; that is, stop processing and terminate with a
+ failure status.
+
+ -- Request: .ex
+ Exit GNU 'troff'; that is, stop processing and terminate with a
+ successful status. To stop processing only the current file, use
+ the 'nx' request; see *note I/O::.
+
+ When doing something involved, it is useful to leave the debugging
+statements in the code and have them turned on by a command-line flag.
+
+ .if \n[DB] .tm debugging output
+
+To activate such statements, use the '-r' option to set the register.
+
+ groff -rDB=1 file
+
+ If it is known in advance that there are many errors and no useful
+output, GNU 'troff' can be forced to suppress formatted output with the
+'-z' option.
+
+ -- Request: .pev
+ Report the state of the current environment followed by that of all
+ other environments to the standard error stream.
+
+ -- Request: .pm
+ Report, to the standard error stream, the names of all defined
+ macros, strings, and diversions with their sizes in bytes.
+
+ -- Request: .pnr
+ Report the names and contents of all currently defined registers to
+ the standard error stream.
+
+ -- Request: .ptr
+ Report the names and positions of all page location traps to the
+ standard error stream. Empty slots in the list, where a trap has
+ been planted but subsequently (re)moved, are printed as well.
+
+ -- Request: .fl
+ Instruct 'gtroff' to flush its output immediately. The intent is
+ for interactive use, but this behaviour is currently not
+ implemented in 'gtroff'. Contrary to Unix 'troff', TTY output is
+ sent to a device driver also ('grotty'), making it non-trivial to
+ communicate interactively.
+
+ This request causes a line break.
+
+ -- Request: .backtrace
+ Write the state of the input stack to the standard error stream.
+
+ Consider the following in a file 'test'.
+
+ .de xxx
+ . backtrace
+ ..
+ .de yyy
+ . xxx
+ ..
+ .
+ .yyy
+ error-> troff: backtrace: 'test':2: macro 'xxx'
+ error-> troff: backtrace: 'test':5: macro 'yyy'
+ error-> troff: backtrace: file 'test':8
+
+ The '-b' option of GNU 'troff' causes a backtrace to be generated
+ on each error or warning. Some warnings have to be enabled; *Note
+ Warnings::.
+
+ -- Register: \n[slimit]
+ If greater than 0, sets the maximum quantity of objects on GNU
+ 'troff''s internal input stack. If less than or equal to 0, there
+ is no limit: recursion can continue until program memory is
+ exhausted. The default is 1,000.
+
+ -- Request: .warnscale su
+ Set the scaling unit used in certain warnings to SU, which can take
+ the values 'u', 'i', 'c', 'p', and 'P'. The default is 'i'.
+
+ -- Request: .spreadwarn [limit]
+ Emit a 'break' warning if the additional space inserted for each
+ space between words in an output line adjusted to both margins with
+ '.ad b' is larger than or equal to LIMIT. A negative value is
+ treated as zero; an absent argument toggles the warning on and off
+ without changing LIMIT. The default scaling unit is 'm'. At
+ startup, 'spreadwarn' is inactive and LIMIT is 3m.
+
+ For example,
+
+ .spreadwarn 0.2m
+
+ causes a warning if 'break' warnings are not suppressed and
+ 'gtroff' must add 0.2m or more for each inter-word space in a line.
+ *Note Warnings::.
+
+ GNU 'troff' has command-line options for reporting warnings ('-w')
+and backtraces ('-b') when a warning or an error occurs.
+
+ -- Request: .warn [n]
+ -- Register: \n[.warn]
+ Select the categories, or "types", of reported warnings. N is the
+ sum of the numeric codes associated with each warning category that
+ is to be enabled; all other categories are disabled. The
+ categories and their associated codes are listed in *note
+ Warnings::. For example, '.warn 0' disables all warnings, and
+ '.warn 1' disables all warnings except those about missing glyphs.
+ If no argument is given, all warning categories are enabled.
+
+ The read-only register '.warn' contains the sum of the numeric
+ codes of enabled warning categories.
+
+5.37.1 Warnings
+---------------
+
+Warning diagnostics emitted by GNU 'troff' are divided into named,
+numbered categories. The name associated with each warning category is
+used by the '-w' and '-W' options. Each category is also assigned a
+power of two; the sum of enabled category values is used by the 'warn'
+request and the '.warn' register.
+
+ Warnings of each category are produced under the following
+circumstances.
+
+'char'
+'1'
+ No mounted font defines a glyph for the requested character. This
+ category is enabled by default.
+
+'number'
+'2'
+ An invalid numeric expression was encountered. This category is
+ enabled by default. *Note Numeric Expressions::.
+
+'break'
+'4'
+ A filled output line could not be broken such that its length was
+ less than the output line length '\n[.l]'. This category is
+ enabled by default.
+
+'delim'
+'8'
+ The closing delimiter in an escape sequence was missing or
+ mismatched.
+
+'el'
+'16'
+ The 'el' request was encountered with no prior corresponding 'ie'
+ request. *Note if-else::.
+
+'scale'
+'32'
+ A scaling unit inappropriate to its context was used in a numeric
+ expression.
+
+'range'
+'64'
+ A numeric expression was out of range for its context.
+
+'syntax'
+'128'
+ A self-contradictory hyphenation mode was requested; an empty or
+ incomplete numeric expression was encountered; an operand to a
+ numeric operator was missing; an attempt was made to define a
+ recursive, empty, or nonsensical character class; or a 'groff'
+ extension conditional expression operator was used while in
+ compatibility mode.
+
+'di'
+'256'
+ A 'di', 'da', 'box', or 'boxa' request was invoked without an
+ argument when there was no current diversion.
+
+'mac'
+'512'
+ An undefined string, macro, or diversion was used. When such an
+ object is dereferenced, an empty one of that name is automatically
+ created. So, unless it is later deleted, at most one warning is
+ given for each.
+
+ This warning is also emitted upon an attempt to move an unplanted
+ trap macro (*note Page Location Traps::). In such cases, the
+ unplanted macro is _not_ dereferenced, so it is not created if it
+ does not exist.
+
+'reg'
+'1024'
+ An undefined register was used. When an undefined register is
+ dereferenced, it is automatically defined with a value of 0. So,
+ unless it is later deleted, at most one warning is given for each.
+
+'tab'
+'2048'
+ A tab character was encountered where a number was expected, or
+ appeared in an unquoted macro argument.
+
+'right-brace'
+'4096'
+ A right brace escape sequence '\}' was encountered where a number
+ was expected.
+
+'missing'
+'8192'
+ A request was invoked with a mandatory argument absent.
+
+'input'
+'16384'
+ An invalid character occurred on the input stream.
+
+'escape'
+'32768'
+ An unsupported escape sequence was encountered.
+
+'space'
+'65536'
+ A space was missing between a request or macro and its argument.
+ This warning is produced when an undefined name longer than two
+ characters is encountered and the first two characters of the name
+ constitute a defined name. No request is invoked, no macro called,
+ and an empty macro is not defined. This category is enabled by
+ default. It never occurs in compatibility mode.
+
+'font'
+'131072'
+ A non-existent font was selected, or the selection was ignored
+ because a font selection escape sequence was used after the output
+ line continuation escape sequence on an input line. This category
+ is enabled by default.
+
+'ig'
+'262144'
+ An invalid escape sequence occurred in input ignored using the 'ig'
+ request. This warning category diagnoses a condition that is an
+ error when it occurs in non-ignored input.
+
+'color'
+'524288'
+ An undefined color was selected, an attempt was made to define a
+ color using an unrecognized color space, an invalid component in a
+ color definition was encountered, or an attempt was made to
+ redefine a default color.
+
+'file'
+'1048576'
+ An attempt was made to load a file that does not exist. This
+ category is enabled by default.
+
+ Two warning names group other warning categories for convenience.
+
+'all'
+ All warning categories except 'di', 'mac' and 'reg'. This
+ shorthand is intended to produce all warnings that are useful with
+ macro packages written for AT&T 'troff' and its descendants, which
+ have less fastidious diagnostics than GNU 'troff'.
+
+'w'
+ All warning categories. Authors of documents and macro packages
+ targeting 'groff' are encouraged to use this setting.
+
+5.38 Implementation Differences
+===============================
+
+GNU 'troff' has a number of features that cause incompatibilities with
+documents written for other versions of 'troff'. Some GNU extensions to
+'troff' have become supported by other implementations.
+
+5.38.1 Safer Mode
+-----------------
+
+The formatter operates in "safer" mode by default; to mitigate risks
+from untrusted input documents, the 'pi' and 'sy' requests are disabled.
+GNU 'troff''s '-U' option enables "unsafe mode", restoring their
+function and enabling additional 'groff' extension requests, 'open',
+'opena', and 'pso'. *Note I/O::.
+
+5.38.2 Compatibility Mode
+-------------------------
+
+Long identifier names may be GNU 'troff''s most obvious innovation.
+AT&T 'troff' interprets '.dsabcd' as defining a string 'ab' with
+contents 'cd'. Normally, GNU 'troff' interprets this as a call of a
+macro named 'dsabcd'. AT&T 'troff' also interprets '\*[' and '\n[' as
+an interpolation of a string or register, respectively, named '['. In
+GNU 'troff', however, the '[' is normally interpreted as delimiting a
+long name. In compatibility mode, GNU 'troff' interprets names in the
+traditional way; they thus can be two characters long at most.
+
+ -- Request: .cp [n]
+ -- Register: \n[.C]
+ If N is missing or non-zero, turn on compatibility mode; otherwise,
+ turn it off.
+
+ The read-only register '.C' is 1 if compatibility mode is on,
+ 0 otherwise.
+
+ Compatibility mode can be also turned on with the '-C' command-line
+ option.
+
+ -- Request: .do name
+ -- Register: \n[.cp]
+ The 'do' request interprets the string, request, diversion, or
+ macro NAME (along with any further arguments) with compatibility
+ mode disabled. Compatibility mode is restored (only if it was
+ active) when the _expansion_ of NAME is interpreted; that is, the
+ restored compatibility state applies to the contents of the macro,
+ string, or diversion NAME as well as data read from files or pipes
+ if NAME is any of the 'so', 'soquiet', 'mso', 'msoquiet', or 'pso'
+ requests.
+
+ The following example illustrates several aspects of 'do' behavior.
+
+ .de mac1
+ FOO
+ ..
+ .de1 mac2
+ groff
+ .mac1
+ ..
+ .de mac3
+ compatibility
+ .mac1
+ ..
+ .de ma
+ \\$1
+ ..
+ .cp 1
+ .do mac1
+ .do mac2 \" mac2, defined with .de1, calls "mac1"
+ .do mac3 \" mac3 calls "ma" with argument "c1"
+ .do mac3 \[ti] \" groff syntax accepted in .do arguments
+ => FOO groff FOO compatibility c1 ~
+
+ The read-only register '.cp', meaningful only when dereferenced
+ from a 'do' request, is 1 if compatibility mode was on when the
+ 'do' request was encountered, and 0 if it was not. This register
+ is specialized and may require a statement of rationale.
+
+ When writing macro packages or documents that use GNU 'troff'
+ features and which may be mixed with other packages or documents
+ that do not--common scenarios include serial processing of man
+ pages or use of the 'so' or 'mso' requests--you may desire correct
+ operation regardless of compatibility mode enablement in the
+ surrounding context. It may occur to you to save the existing
+ value of '\n(.C' into a register, say, '_C', at the beginning of
+ your file, turn compatibility mode off with '.cp 0', then restore
+ it from that register at the end with '.cp \n(_C'. At the same
+ time, a modular design of a document or macro package may lead you
+ to multiple layers of inclusion. You cannot use the same register
+ name everywhere lest you "clobber" the value from a preceding or
+ enclosing context. The two-character register name space of AT&T
+ 'troff' is confining and mnemonically challenging; you may wish to
+ use the more capacious name space of GNU 'troff'. However,
+ attempting '.nr _my_saved_C \n(.C' will not work in compatibility
+ mode; the register name is too long. "This is exactly what 'do' is
+ for," you think, '.do nr _my_saved_C \n(.C'. The foregoing will
+ always save zero to your register, because 'do' turns compatibility
+ mode _off_ while it interprets its argument list.
+
+ To robustly save compatibility mode before switching it off, use
+
+ .do nr _my_saved_C \n[.cp]
+ .cp 0
+
+ at the beginning of your file, followed by
+
+ .cp \n[_my_saved_C]
+ .do rr _my_saved_C
+
+ at the end. As in the C language, we all have to share one big
+ name space, so choose a register name that is unlikely to collide
+ with other uses.
+
+ Normally, GNU 'troff' preserves the interpolation depth in delimited
+arguments, but not in compatibility mode.
+
+ .ds xx '
+ \w'abc\*(xxdef'
+ => 168 (normal mode on a terminal device)
+ => 72def' (compatibility mode on a terminal device)
+
+ Furthermore, the escape sequences '\f', '\H', '\m', '\M', '\R', '\s',
+and '\S' are transparent for the purpose of recognizing a control
+character at the beginning of a line only in compatibility mode. For
+example, this code produces bold output in both cases, but the text
+differs.
+
+ .de xx
+ Hello!
+ ..
+ \fB.xx\fP
+ => .xx (normal mode)
+ => Hello! (compatibility mode)
+
+ Normally, the syntax form '\s'N accepts only a single character (a
+digit) for N, consistently with other forms that originated in AT&T
+'troff', like '\*', '\$', '\f', '\g', '\k', '\n', and '\z'. In
+compatibility mode only, a non-zero N must be in the range 4-39. Legacy
+documents relying upon this quirk of parsing(1) (*note Compatibility
+Mode-Footnote-1::) should be migrated to another '\s' form.
+
+ (1) The Graphic Systems C/A/T phototypesetter (the original device
+target for AT&T 'troff') supported only a few discrete type sizes in the
+range 6-36 points, so Ossanna contrived a special case in the parser to
+do what the user must have meant. Kernighan warned of this in the 1992
+revision of CSTR #54 (§2.3), and more recently, McIlroy referred to it
+as a "living fossil".
+
+5.38.3 Other Differences
+------------------------
+
+'groff' request names unrecognized by other 'troff' implementations will
+likely be ignored by them; escape sequences that are 'groff' extensions
+are liable to be interpreted as if the escape character were not
+present. For example, the adjustable, non-breaking escape sequence '\~'
+is also supported by Heirloom Doctools 'troff' 050915 (September 2005),
+'mandoc' 1.9.5 (2009-09-21), 'neatroff' (commit 1c6ab0f6e, 2016-09-13),
+and Plan 9 from User Space 'troff' (commit 93f8143600, 2022-08-12), but
+not by Solaris or Documenter's Workbench 'troff's. *Note Manipulating
+Filling and Adjustment::.
+
+ GNU 'troff' does not allow the use of the escape sequences '\|',
+'\^', '\&', '\{', '\}', '\<SP>', '\'', '\`', '\-', '\_', '\!', '\%', and
+'\c' in identifiers; AT&T 'troff' does. The '\A' escape sequence (*note
+Identifiers::) may be helpful in avoiding use of these escape sequences
+in names.
+
+ When adjusting to both margins, AT&T 'troff' at first adjusts spaces
+starting from the right; GNU 'troff' begins from the left. Both
+implementations adjust spaces from opposite ends on alternating output
+lines in this adjustment mode to prevent "rivers" in the text.
+
+ GNU 'troff' does not always hyphenate words as AT&T 'troff' does.
+The AT&T implementation uses a set of hard-coded rules specific to
+English, while GNU 'troff' uses language-specific hyphenation pattern
+files derived from TeX. Furthermore, in old versions of 'troff' there
+was a limited amount of space to store hyphenation exceptions (arguments
+to the 'hw' request); GNU 'troff' has no such restriction.
+
+ GNU 'troff' predefines a string '.T' containing the argument given to
+the '-T' command-line option, namely the current output device (for
+example, 'pdf' or 'utf8'). The existence of this string is a common
+feature of post-CSTR #54 'troff's(1) (*note Other
+Differences-Footnote-1::) but valid values are specific to each
+implementation.
+
+ AT&T 'troff' ignored attempts to remove read-only registers; GNU
+'troff' honors such requests. *Note Built-in Registers::.
+
+ The (read-only) register '.T' interpolates 1 if GNU 'troff' is called
+with the '-T' command-line option, and 0 otherwise. This behavior
+differs from AT&T 'troff', which interpolated 1 only if 'nroff' was the
+formatter and was called with '-T'.
+
+ AT&T 'troff' and other implementations handle the 'lf' request
+differently. For them, its LINE argument changes the line number of the
+_current_ line.
+
+ AT&T 'troff' had only environments named '0', '1', and '2'. In GNU
+'troff', any number of environments may exist, using any valid
+identifiers for their names (*note Identifiers::.)
+
+ Fractional type sizes cause one noteworthy incompatibility. In AT&T
+'troff' the 'ps' request ignores scaling units and thus '.ps 10u' sets
+the type size to 10 points, whereas in GNU 'troff' it sets the type size
+to 10 _scaled_ points. *Note Using Fractional Type Sizes::.
+
+ The 'ab' request differs from AT&T 'troff': GNU 'troff' writes no
+message to the standard error stream if no arguments are given, and it
+exits with a failure status instead of a successful one.
+
+ The 'bp' request differs from AT&T 'troff': GNU 'troff' does not
+accept a scaling unit on the argument, a page number; the former
+(somewhat uselessly) does.
+
+ The 'pm' request differs from AT&T 'troff': GNU 'troff' reports the
+sizes of macros, strings, and diversions in bytes and ignores an
+argument to report only the sum of the sizes.
+
+ Unlike AT&T 'troff', GNU 'troff' does not ignore the 'ss' request if
+the output is a terminal device; instead, the values of minimal
+inter-word and additional inter-sentence space are each rounded down to
+the nearest multiple of 12.
+
+ In GNU 'troff' there is a fundamental difference between
+(unformatted) characters and (formatted) glyphs. Everything that
+affects how a glyph is output is stored with the glyph node; once a
+glyph node has been constructed, it is unaffected by any subsequent
+requests that are executed, including 'bd', 'cs', 'tkf', 'tr', or 'fp'
+requests. Normally, glyphs are constructed from characters immediately
+before the glyph is added to an output line. Macros, diversions, and
+strings are all, in fact, the same type of object; they contain a
+sequence of intermixed character and glyph nodes. Special characters
+transform from one to the other: before being added to the output, they
+behave as characters; afterward, they are glyphs. A glyph node does not
+behave like a character node when it is processed by a macro: it does
+not inherit any of the special properties that the character from which
+it was constructed might have had. For example, the input
+
+ .di x
+ \\\\
+ .br
+ .di
+ .x
+
+produces '\\' in GNU 'troff'. Each pair of backslashes becomes one
+backslash _glyph_; the resulting backslashes are thus not interpreted as
+escape _characters_ when they are reread as the diversion is output.
+AT&T 'troff' _would_ interpret them as escape characters when rereading
+them and end up printing one '\'.
+
+ One correct way to obtain a printable backslash in most documents is
+to use the '\e' escape sequence; this always prints a single instance of
+the current escape character,(2) (*note Other Differences-Footnote-2::)
+regardless of whether or not it is used in a diversion; it also works in
+both GNU 'troff' and AT&T 'troff'.
+
+ The other correct way, appropriate in contexts independent of the
+backslash's common use as a 'troff' escape character--perhaps in
+discussion of character sets or other programming languages--is the
+character escape '\(rs' or '\[rs]', for "reverse solidus", from its name
+in the ECMA-6 (ISO/IEC 646) standard.(3) (*note Other
+Differences-Footnote-3::)
+
+ To store an escape sequence in a diversion that is interpreted when
+the diversion is reread, either use the traditional '\!' transparent
+output facility, or, if this is unsuitable, the new '\?' escape
+sequence. *Note Diversions:: and *note Gtroff Internals::.
+
+ In the somewhat pathological case where a diversion exists containing
+a partially collected line and a partially collected line at the
+top-level diversion has never existed, AT&T 'troff' will output the
+partially collected line at the end of input; GNU 'troff' will not.
+
+ (1) DWB 3.3, Solaris, Heirloom Doctools, and Plan 9 'troff' all
+support it.
+
+ (2) Naturally, if you've changed the escape character, you need to
+prefix the 'e' with whatever it is--and you'll likely get something
+other than a backslash in the output.
+
+ (3) The 'rs' special character identifier was not defined in AT&T
+'troff''s font description files, but is in those of its lineal
+descendant, Heirloom Doctools 'troff', as of the latter's 060716 release
+(July 2006).
+
+6 File Formats
+**************
+
+All files read and written by 'gtroff' are text files. The following
+two sections describe their format.
+
+6.1 'gtroff' Output
+===================
+
+This section describes the 'groff' intermediate output format produced
+by GNU 'troff'.
+
+ As 'groff' is a wrapper program around GNU 'troff' and automatically
+calls an output driver (or "postprocessor"), this output does not show
+up normally. This is why it is called _intermediate_. 'groff' provides
+the option '-Z' to inhibit postprocessing such that the produced
+intermediate output is sent to standard output just as it is when
+calling GNU 'troff' directly.
+
+ Here, the term "troff output" describes what is output by GNU
+'troff', while "intermediate output" refers to the language that is
+accepted by the parser that prepares this output for the output drivers.
+This parser handles whitespace more flexibly than AT&T's implementation
+and implements obsolete elements for compatibility; otherwise, both
+formats are the same.(1) (*note gtroff Output-Footnote-1::)
+
+ The main purpose of the intermediate output concept is to facilitate
+the development of postprocessors by providing a common programming
+interface for all devices. It has a language of its own that is
+completely different from the 'gtroff' language. While the 'gtroff'
+language is a high-level programming language for text processing, the
+intermediate output language is a kind of low-level assembler language
+by specifying all positions on the page for writing and drawing.
+
+ The intermediate output produced by 'gtroff' is fairly readable,
+while output from AT&T 'troff' is rather hard to understand because of
+strange habits that are still supported, but not used any longer by
+'gtroff'.
+
+ (1) The parser and postprocessor for intermediate output can be found
+in the file
+'GROFF-SOURCE-DIR/src/libs/libdriver/input.cpp'.
+
+6.1.1 Language Concepts
+-----------------------
+
+The fundamental operation of the GNU 'troff' formatter is the
+translation of the 'groff' input language into a device-independent form
+primarily concerned with what has to be written or drawn at specific
+positions on the output device. This language is simple and imperative.
+In the following discussion, the term "command" always refers to this
+intermediate output language, and never to the 'groff' language intended
+for direct use by document authors. Intermediate output commands
+comprise several categories: glyph output; font, color, and text size
+selection; motion of the printing position; page advancement; drawing of
+geometric objects; and device control commands, a catch-all for
+operations not easily classified as any of the foregoing, such as
+directives to start and stop output, identify the intended output
+device, or place URL hyperlinks in supported output formats.
+
+6.1.1.1 Separation
+..................
+
+AT&T 'troff' output has strange requirements regarding whitespace. The
+'gtroff' output parser, however, is more tolerant, making whitespace
+maximally optional. Such characters, i.e., the tab, space, and newline,
+always have a syntactical meaning. They are never printable because
+spacing within the output is always done by positioning commands.
+
+ Any sequence of space or tab characters is treated as a single
+"syntactical space". It separates commands and arguments, but is only
+required when there would occur a clashing between the command code and
+the arguments without the space. Most often, this happens when
+variable-length command names, arguments, argument lists, or command
+clusters meet. Commands and arguments with a known, fixed length need
+not be separated by syntactical space.
+
+ A line break is a syntactical element, too. Every command argument
+can be followed by whitespace, a comment, or a newline character. Thus
+a "syntactical line break" is defined to consist of optional syntactical
+space that is optionally followed by a comment, and a newline character.
+
+ The normal commands, those for positioning and text, consist of a
+single letter taking a fixed number of arguments. For historical
+reasons, the parser allows stacking of such commands on the same line,
+but fortunately, in 'gtroff''s intermediate output, every command with
+at least one argument is followed by a line break, thus providing
+excellent readability.
+
+ The other commands--those for drawing and device controlling--have a
+more complicated structure; some recognize long command names, and some
+take a variable number of arguments. So all 'D' and 'x' commands were
+designed to request a syntactical line break after their last argument.
+Only one command, 'x X', has an argument that can span several input
+lines; all other commands must have all of their arguments on the same
+line as the command, i.e., the arguments may not be split by a line
+break.
+
+ Empty lines (these are lines containing only space and/or a comment),
+can occur everywhere. They are just ignored.
+
+6.1.1.2 Argument Units
+......................
+
+Some commands take integer arguments that are assumed to represent
+values in a measurement unit, but the letter for the corresponding
+scaling unit is not written with the output command arguments. Most
+commands assume the scaling unit 'u', the basic unit of the device, some
+use 'z', the scaled point unit of the device, while others, such as the
+color commands, expect plain integers.
+
+ Single characters can have the eighth bit set, as can the names of
+fonts and special characters. The names of characters and fonts can be
+of arbitrary length. A character that is to be printed is always in the
+current font.
+
+ A string argument is always terminated by the next whitespace
+character (space, tab, or newline); an embedded '#' character is
+regarded as part of the argument, not as the beginning of a comment
+command. An integer argument is already terminated by the next
+non-digit character, which then is regarded as the first character of
+the next argument or command.
+
+6.1.1.3 Document Parts
+......................
+
+A correct intermediate output document consists of two parts, the
+"prologue" and the "body".
+
+ The task of the prologue is to set the general device parameters
+using three exactly specified commands. 'gtroff''s prologue is
+guaranteed to consist of the following three lines (in that order):
+
+ x T DEVICE
+ x res N H V
+ x init
+
+with the arguments set as outlined in *note Device Control Commands::.
+The parser for the intermediate output format is able to interpret
+additional whitespace and comments as well even in the prologue.
+
+ The body is the main section for processing the document data.
+Syntactically, it is a sequence of any commands different from the ones
+used in the prologue. Processing is terminated as soon as the first
+'x stop' command is encountered; the last line of any 'gtroff'
+intermediate output always contains such a command.
+
+ Semantically, the body is page oriented. A new page is started by a
+'p' command. Positioning, writing, and drawing commands are always done
+within the current page, so they cannot occur before the first 'p'
+command. Absolute positioning (by the 'H' and 'V' commands) is done
+relative to the current page; all other positioning is done relative to
+the current location within this page.
+
+6.1.2 Command Reference
+-----------------------
+
+This section describes all intermediate output commands, both from AT&T
+'troff' as well as the 'gtroff' extensions.
+
+6.1.2.1 Comment Command
+.......................
+
+'#ANYTHING<end of line>'
+ A comment. Ignore any characters from the '#' character up to the
+ next newline character.
+
+ This command is the only possibility for commenting in the
+ intermediate output. Each comment can be preceded by arbitrary
+ syntactical space; every command can be terminated by a comment.
+
+6.1.2.2 Simple Commands
+.......................
+
+The commands in this subsection have a command code consisting of a
+single character, taking a fixed number of arguments. Most of them are
+commands for positioning and text writing. These commands are tolerant
+of whitespace. Optionally, syntactical space can be inserted before,
+after, and between the command letter and its arguments. All of these
+commands are stackable; i.e., they can be preceded by other simple
+commands or followed by arbitrary other commands on the same line. A
+separating syntactical space is necessary only when two integer
+arguments would clash or if the preceding argument ends with a string
+argument.
+
+'C ID<whitespace>'
+ Typeset the glyph of the special character ID. Trailing
+ syntactical space is necessary to allow special character names of
+ arbitrary length. The drawing position is not advanced.
+
+'c G'
+ Typeset the glyph of the ordinary character C. The drawing
+ position is not advanced.
+
+'f N'
+ Select the font mounted at position N. N cannot be negative.
+
+'H N'
+ Horizontally move the drawing position to N basic units from the
+ left edge of the page. N cannot be negative.
+
+'h N'
+ Move the drawing position right N basic units. AT&T 'troff'
+ allowed negative N; GNU 'troff' does not produce such values, but
+ 'groff''s output driver library handles them.
+
+'m COLOR-SCHEME [COMPONENT ...]'
+ Select the stroke color using the COMPONENTs in the color space
+ SCHEME. Each COMPONENT is an integer between 0 and 65535. The
+ quantity of components and their meanings vary with each SCHEME.
+ This command is a 'groff' extension.
+
+ 'mc CYAN MAGENTA YELLOW'
+ Use the CMY color scheme with components cyan, magenta, and
+ yellow.
+
+ 'md'
+ Use the default color (no components; black in most cases).
+
+ 'mg GRAY'
+ Use a grayscale color scheme with a component ranging between
+ 0 (black) and 65535 (white).
+
+ 'mk CYAN MAGENTA YELLOW BLACK'
+ Use the CMYK color scheme with components cyan, magenta,
+ yellow, and black.
+
+ 'mr RED GREEN BLUE'
+ Use the RGB color scheme with components red, green, and blue.
+
+'N N'
+ Typeset the glyph with index N in the current font. N is normally
+ a non-negative integer. The drawing position is not advanced. The
+ 'html' and 'xhtml' devices use this command with negative N to
+ produce unbreakable space; the absolute value of N is taken and
+ interpreted in basic units.
+
+'n B A'
+ Indicate a break. No action is performed; the command is present
+ to make the output more easily parsed. The integers B and A
+ describe the vertical space amounts before and after the break,
+ respectively. GNU 'troff' issues this command but 'groff''s output
+ driver library ignores it. See 'v' and 'V' below.
+
+'p N'
+ Begin a new page, setting its number to N. Each page is
+ independent, even from those using the same number. The vertical
+ drawing position is set to 0. All positioning, writing, and
+ drawing commands are interpreted in the context of a page, so a
+ 'p' command must precede them.
+
+'s N'
+ Set type size to N scaled points (unit 'z' in GNU 'troff'. AT&T
+ 'troff' used unscaled points 'p' instead; see *note Output Language
+ Compatibility::.
+
+'t XYZ<whitespace>'
+'t XYZ DUMMY-ARG<whitespace>'
+ Typeset a word XYZ; that is, set a sequence of ordinary glyphs
+ named X, Y, Z, ..., terminated by a space character or a line
+ break; an optional second integer argument is ignored (this allows
+ the formatter to generate an even number of arguments). Each glyph
+ is set at the current drawing position, and the position is then
+ advanced horizontally by the glyph's width. A glyph's width is
+ read from its metrics in the font description file, scaled to the
+ current type size, and rounded to a multiple of the horizontal
+ motion quantum. Use the 'C' command to emplace glyphs of special
+ characters. The 't' command is a 'groff' extension and is output
+ only for devices whose 'DESC' file contains the 'tcommand'
+ directive; see *note DESC File Format::.
+
+'u N XYZ<whitespace>'
+ Typeset word XYZ with track kerning. As 't', but after placing
+ each glyph, the drawing position is further advanced horizontally
+ by N basic units ('u'). The 'u' command is a 'groff' extension and
+ is output only for devices whose 'DESC' file contains the
+ 'tcommand' directive; see *note DESC File Format::.
+
+'V N'
+ Vertically move the drawing position to N basic units from the top
+ edge of the page. N cannot be negative.
+
+'v N'
+ Move the drawing position down N basic units. AT&T 'troff' allowed
+ negative N; GNU 'troff' does not produce such values, but 'groff''s
+ output driver library handles them.
+
+'w'
+ Indicate an inter-word space. No action is performed; the command
+ is present to make the output more easily parsed. Only adjustable,
+ breakable inter-word spaces are thus described; those resulting
+ from '\~' or horizontal motion escape sequences are not. GNU
+ 'troff' issues this command but 'groff''s output driver library
+ ignores it. See 'h' and 'H' above.
+
+6.1.2.3 Graphics Commands
+.........................
+
+Each graphics or drawing command in the intermediate output starts with
+the letter 'D', followed by one or two characters that specify a
+subcommand; this is followed by a fixed or variable number of integer
+arguments that are separated by a single space character. A 'D' command
+may not be followed by another command on the same line (apart from a
+comment), so each 'D' command is terminated by a syntactical line break.
+
+ 'gtroff' output follows the classical spacing rules (no space between
+command and subcommand, all arguments are preceded by a single space
+character), but the parser allows optional space between the command
+letters and makes the space before the first argument optional. As
+usual, each space can be any sequence of tab and space characters.
+
+ Some graphics commands can take a variable number of arguments. In
+this case, they are integers representing a size measured in basic units
+'u'. The arguments called H1, H2, ..., HN stand for horizontal
+distances where positive means right, negative left. The arguments
+called V1, V2, ..., VN stand for vertical distances where positive means
+down, negative up. All these distances are offsets relative to the
+current location.
+
+ Each graphics command directly corresponds to a similar 'gtroff' '\D'
+escape sequence. *Note Drawing Geometric Objects::.
+
+ Unknown 'D' commands are assumed to be device-specific. Its
+arguments are parsed as strings; the whole information is then sent to
+the postprocessor.
+
+ In the following command reference, the syntax element <line break>
+means a syntactical line break as defined above.
+
+'D~ H1 V1 H2 V2 ... HN VN<line break>'
+ Draw B-spline from current position to offset (H1,V1), then to
+ offset (H2,V2), if given, etc., up to (HN,VN). This command takes
+ a variable number of argument pairs; the current position is moved
+ to the terminal point of the drawn curve.
+
+'Da H1 V1 H2 V2<line break>'
+ Draw arc from current position to (H1,V1)+(H2,V2) with center at
+ (H1,V1); then move the current position to the final point of the
+ arc.
+
+'DC D<line break>'
+'DC D DUMMY-ARG<line break>'
+ Draw a solid circle using the current fill color with diameter D
+ (integer in basic units 'u') with leftmost point at the current
+ position; then move the current position to the rightmost point of
+ the circle. An optional second integer argument is ignored (this
+ allows the formatter to generate an even number of arguments).
+ This command is a 'gtroff' extension.
+
+'Dc D<line break>'
+ Draw circle line with diameter D (integer in basic units 'u') with
+ leftmost point at the current position; then move the current
+ position to the rightmost point of the circle.
+
+'DE H V<line break>'
+ Draw a solid ellipse in the current fill color with a horizontal
+ diameter of H and a vertical diameter of V (both integers in basic
+ units 'u') with the leftmost point at the current position; then
+ move to the rightmost point of the ellipse. This command is a
+ 'gtroff' extension.
+
+'De H V<line break>'
+ Draw an outlined ellipse with a horizontal diameter of H and a
+ vertical diameter of V (both integers in basic units 'u') with the
+ leftmost point at current position; then move to the rightmost
+ point of the ellipse.
+
+'DF COLOR-SCHEME [COMPONENT ...]<line break>'
+ Set fill color for solid drawing objects using different color
+ schemes; the analogous command for setting the color of text, line
+ graphics, and the outline of graphic objects is 'm'. The color
+ components are specified as integer arguments between 0 and 65535.
+ The number of color components and their meaning vary for the
+ different color schemes. These commands are generated by
+ 'gtroff''s escape sequences '\D'F ...'' and '\M' (with no other
+ corresponding graphics commands). No position changing. This
+ command is a 'gtroff' extension.
+
+ 'DFc CYAN MAGENTA YELLOW<line break>'
+ Set fill color for solid drawing objects using the CMY color
+ scheme, having the 3 color components CYAN, MAGENTA, and
+ YELLOW.
+
+ 'DFd<line break>'
+ Set fill color for solid drawing objects to the default fill
+ color value (black in most cases). No component arguments.
+
+ 'DFg GRAY<line break>'
+ Set fill color for solid drawing objects to the shade of gray
+ given by the argument, an integer between 0 (black) and 65535
+ (white).
+
+ 'DFk CYAN MAGENTA YELLOW BLACK<line break>'
+ Set fill color for solid drawing objects using the CMYK color
+ scheme, having the 4 color components CYAN, MAGENTA, YELLOW,
+ and BLACK.
+
+ 'DFr RED GREEN BLUE<line break>'
+ Set fill color for solid drawing objects using the RGB color
+ scheme, having the 3 color components RED, GREEN, and BLUE.
+
+'Df N<line break>'
+ The argument N must be an integer in the range -32767 to 32767.
+
+ 0 <= N <= 1000
+ Set the color for filling solid drawing objects to a shade of
+ gray, where 0 corresponds to solid white, 1000 (the default)
+ to solid black, and values in between to intermediate shades
+ of gray; this is obsoleted by command 'DFg'.
+
+ N < 0 or N > 1000
+ Set the filling color to the color that is currently being
+ used for the text and the outline, see command 'm'. For
+ example, the command sequence
+
+ mg 0 0 65535
+ Df -1
+
+ sets all colors to blue.
+
+ No position changing. This command is a 'gtroff' extension.
+
+'Dl H V<line break>'
+ Draw line from current position to offset (H,V) (integers in basic
+ units 'u'); then set current position to the end of the drawn line.
+
+'Dp H1 V1 H2 V2 ... HN VN<line break>'
+ Draw a polygon line from current position to offset (H1,V1), from
+ there to offset (H2,V2), etc., up to offset (HN,VN), and from there
+ back to the starting position. For historical reasons, the
+ position is changed by adding the sum of all arguments with odd
+ index to the actual horizontal position and the even ones to the
+ vertical position. Although this doesn't make sense it is kept for
+ compatibility. This command is a 'gtroff' extension.
+
+'DP H1 V1 H2 V2 ... HN VN<line break>'
+ Draw a solid polygon in the current fill color rather than an
+ outlined polygon, using the same arguments and positioning as the
+ corresponding 'Dp' command. This command is a 'gtroff' extension.
+
+'Dt N<line break>'
+ Set the current line thickness to N (an integer in basic units 'u')
+ if N>0; if N=0 select the smallest available line thickness; if N<0
+ set the line thickness proportional to the type size (this is the
+ default before the first 'Dt' command was specified). For
+ historical reasons, the horizontal position is changed by adding
+ the argument to the actual horizontal position, while the vertical
+ position is not changed. Although this doesn't make sense it is
+ kept for compatibility. This command is a 'gtroff' extension.
+
+6.1.2.4 Device Control Commands
+...............................
+
+Each device control command starts with the letter 'x', followed by a
+space character (optional or arbitrary space or tab in 'gtroff') and a
+subcommand letter or word; each argument (if any) must be preceded by a
+syntactical space. All 'x' commands are terminated by a syntactical
+line break; no device control command can be followed by another command
+on the same line (except a comment).
+
+ The subcommand is basically a single letter, but to increase
+readability, it can be written as a word, i.e., an arbitrary sequence of
+characters terminated by the next tab, space, or newline character. All
+characters of the subcommand word but the first are simply ignored. For
+example, 'gtroff' outputs the initialization command 'x i' as 'x init'
+and the resolution command 'x r' as 'x res'.
+
+ In the following, the syntax element <line break> means a syntactical
+line break (*note Separation::).
+
+'xF NAME<line break>'
+ The 'F' stands for FILENAME.
+
+ Use NAME as the intended name for the current file in error
+ reports. This is useful for remembering the original file name
+ when 'gtroff' uses an internal piping mechanism. The input file is
+ not changed by this command. This command is a 'gtroff' extension.
+
+'xf N S<line break>'
+ The 'f' stands for FONT.
+
+ Mount font position N (a non-negative integer) with font named S (a
+ text word). *Note Font Positions::.
+
+'xH N<line break>'
+ The 'H' stands for HEIGHT.
+
+ Set glyph height to N (a positive integer in scaled points 'z').
+ AT&T 'troff' uses the unit points ('p') instead. *Note Output
+ Language Compatibility::.
+
+'xi<line break>'
+ The 'i' stands for INIT.
+
+ Initialize device. This is the third command of the prologue.
+
+'xp<line break>'
+ The 'p' stands for PAUSE.
+
+ Parsed but ignored. The AT&T 'troff' manual documents this command
+ as
+
+ pause device, can be restarted
+
+ but GNU 'troff' output drivers do nothing with this command.
+
+'xr N H V<line break>'
+ The 'r' stands for RESOLUTION.
+
+ Resolution is N, while H is the minimal horizontal motion, and V
+ the minimal vertical motion possible with this device; all
+ arguments are positive integers in basic units 'u' per inch. This
+ is the second command of the prologue.
+
+'xS N<line break>'
+ The 'S' stands for SLANT.
+
+ Set slant to N (an integer in basic units 'u').
+
+'xs<line break>'
+ The 's' stands for STOP.
+
+ Terminates the processing of the current file; issued as the last
+ command of any intermediate 'troff' output.
+
+'xt<line break>'
+ The 't' stands for TRAILER.
+
+ Generate trailer information, if any. In GNU 'troff', this is
+ ignored.
+
+'xT XXX<line break>'
+ The 'T' stands for TYPESETTER.
+
+ Set the name of the output driver to XXX, a sequence of
+ non-whitespace characters terminated by whitespace. The possible
+ names correspond to those of 'groff''s '-T' option. This is the
+ first command of the prologue.
+
+'xu N<line break>'
+ The 'u' stands for UNDERLINE.
+
+ Configure underlining of spaces. If N is 1, start underlining of
+ spaces; if N is 0, stop underlining of spaces. This is needed for
+ the 'cu' request in 'nroff' mode and is ignored otherwise. This
+ command is a 'gtroff' extension.
+
+'xX ANYTHING<line break>'
+ The 'x' stands for X-ESCAPE.
+
+ Send string ANYTHING uninterpreted to the device. If the line
+ following this command starts with a '+' character this line is
+ interpreted as a continuation line in the following sense. The '+'
+ is ignored, but a newline character is sent instead to the device,
+ the rest of the line is sent uninterpreted. The same applies to
+ all following lines until the first character of a line is not a
+ '+' character. This command is generated by the 'gtroff' escape
+ sequence '\X'. The line-continuing feature is a 'gtroff'
+ extension.
+
+6.1.2.5 Obsolete Command
+........................
+
+In AT&T 'troff' output, the writing of a single glyph is mostly done by
+a very strange command that combines a horizontal move and a single
+character giving the glyph name. It doesn't have a command code, but is
+represented by a 3-character argument consisting of exactly 2 digits and
+a character.
+
+DDG
+ Move right DD (exactly two decimal digits) basic units 'u', then
+ print glyph G (represented as a single character).
+
+ In GNU 'troff', arbitrary syntactical space around and within this
+ command is allowed. Only when a preceding command on the same line
+ ends with an argument of variable length is a separating space
+ obligatory. In AT&T 'troff', large clusters of these and other
+ commands are used, mostly without spaces; this made such output
+ almost unreadable.
+
+ For modern high-resolution devices, this command does not make sense
+because the width of the glyphs can become much larger than two decimal
+digits. In 'gtroff', this is only used for the devices 'X75', 'X75-12',
+'X100', and 'X100-12'. For other devices, the commands 't' and 'u'
+provide a better functionality.
+
+6.1.3 Intermediate Output Examples
+----------------------------------
+
+This section presents the intermediate output generated from the same
+input for three different devices. The input is the sentence 'hell
+world' fed into 'gtroff' on the command line.
+
+High-resolution device 'ps'
+
+ This is the standard output of 'gtroff' if no '-T' option is given.
+
+ shell> echo "hell world" | groff -Z -T ps
+
+ x T ps
+ x res 72000 1 1
+ x init
+ p1
+ x font 5 TR
+ f5
+ s10000
+ V12000
+ H72000
+ thell
+ wh2500
+ tw
+ H96620
+ torld
+ n12000 0
+ x trailer
+ V792000
+ x stop
+
+ This output can be fed into 'grops' to get its representation as a
+ PostScript file.
+
+Low-resolution device 'latin1'
+
+ This is similar to the high-resolution device except that the
+ positioning is done at a minor scale. Some comments (lines
+ starting with '#') were added for clarification; they were not
+ generated by the formatter.
+
+ shell> echo "hell world" | groff -Z -T latin1
+
+ # prologue
+ x T latin1
+ x res 240 24 40
+ x init
+ # begin a new page
+ p1
+ # font setup
+ x font 1 R
+ f1
+ s10
+ # initial positioning on the page
+ V40
+ H0
+ # write text 'hell'
+ thell
+ # inform about space, and issue a horizontal jump
+ wh24
+ # write text 'world'
+ tworld
+ # announce line break, but do nothing because...
+ n40 0
+ # ...the end of the document has been reached
+ x trailer
+ V2640
+ x stop
+
+ This output can be fed into 'grotty' to get a formatted text
+ document.
+
+AT&T 'troff' output
+ Since a computer monitor has a much lower resolution than modern
+ printers, the intermediate output for X11 devices can use the
+ jump-and-write command with its 2-digit displacements.
+
+ shell> echo "hell world" | groff -Z -T X100
+
+ x T X100
+ x res 100 1 1
+ x init
+ p1
+ x font 5 TR
+ f5
+ s10
+ V16
+ H100
+ # write text with jump-and-write commands
+ ch07e07l03lw06w11o07r05l03dh7
+ n16 0
+ x trailer
+ V1100
+ x stop
+
+ This output can be fed into 'xditview' or 'gxditview' for
+ displaying in X.
+
+ Due to the obsolete jump-and-write command, the text clusters in
+ the AT&T 'troff' output are almost unreadable.
+
+6.1.4 Output Language Compatibility
+-----------------------------------
+
+The intermediate output language of AT&T 'troff' was first documented in
+'A Typesetter-independent TROFF', by Brian Kernighan, and by 1992 the
+AT&T 'troff' manual was updated to incorprate a description of it.
+
+ The GNU 'troff' intermediate output format is compatible with this
+specification except for the following features.
+
+ * The classical quasi-device independence is not yet implemented.
+
+ * The old hardware was very different from what we use today. So the
+ 'groff' devices are also fundamentally different from the ones in
+ AT&T 'troff'. For example, the AT&T PostScript device is called
+ 'post' and has a resolution of only 720 units per inch, suitable
+ for printers 20 years ago, while 'groff''s 'ps' device has a
+ resolution of 72000 units per inch. Maybe, by implementing some
+ rescaling mechanism similar to the classical quasi-device
+ independence, 'groff' could emulate AT&T's 'post' device.
+
+ * The B-spline command 'D~' is correctly handled by the intermediate
+ output parser, but the drawing routines aren't implemented in some
+ of the postprocessor programs.
+
+ * The argument of the commands 's' and 'x H' has the implicit unit
+ scaled point 'z' in 'gtroff', while AT&T 'troff' has point ('p').
+ This isn't an incompatibility but a compatible extension, for both
+ units coincide for all devices without a 'sizescale' parameter in
+ the 'DESC' file, including all postprocessors from AT&T and
+ 'groff''s text devices. The few 'groff' devices with a 'sizescale'
+ parameter either do not exist for AT&T 'troff', have a different
+ name, or seem to have a different resolution. So conflicts are
+ very unlikely.
+
+ * The position changing after the commands 'Dp', 'DP', and 'Dt' is
+ illogical, but as old versions of 'gtroff' used this feature it is
+ kept for compatibility reasons.
+
+6.2 Device and Font Description Files
+=====================================
+
+The 'groff' font and output device description formats are slight
+extensions of those used by AT&T device-independent 'troff'. In
+distinction to the AT&T implementation, 'groff' lacks a binary format;
+all files are text files.(1) (*note Device and Font Description
+Files-Footnote-1::) The device and font description files for a device
+NAME are stored in a 'devNAME' directory. The device description file
+is called 'DESC', and, for each font supported by the device, a font
+description file is called 'F', where F is usually an abbreviation of a
+font's name and/or style. For example, the 'ps' (PostScript) device has
+'groff' font description files for Times roman ('TR') and Zapf Chancery
+Medium italic ('ZCMI'), among many others, while the 'utf8' device (for
+terminal emulators) has only font descriptions for the roman, italic,
+bold, and bold-italic styles ('R', 'I', 'B', and 'BI', respectively).
+
+ Device and font description files are read both by the formatter, GNU
+'troff', and by output drivers. The programs delegate these files'
+processing to an internal library, 'libgroff', ensuring their consistent
+interpretation.
+
+ (1) Plan 9 'troff' has also abandoned the binary format.
+
+6.2.1 'DESC' File Format
+------------------------
+
+The 'DESC' file contains a series of directives; each begins a line.
+Their order is not important, with two exceptions: (1) the 'res'
+directive must precede any 'papersize' directive; and (2) the 'charset'
+directive must come last (if at all). If a directive name is repeated,
+later entries in the file override previous ones (except that the paper
+dimensions are computed based on the 'res' directive last seen when
+'papersize' is encountered). Spaces and/or tabs separate words and are
+ignored at line boundaries. Comments start with the '#' character and
+extend to the end of a line. Empty lines are ignored.
+
+'family FAM'
+ The default font family is FAM.
+
+'fonts N F1 ... FN'
+ Fonts F1, ..., FN are mounted at font positions M+1, ..., M+N where
+ M is the number of 'styles' (see below). This directive may extend
+ over more than one line. A font name of '0' causes no font to be
+ mounted at the corresponding position.
+
+'hor N'
+ The horizontal motion quantum is N basic units. All horizontal
+ quantities are rounded to multiples of N.
+
+'image_generator PROGRAM'
+ Use PROGRAM to generate PNG images from PostScript input. Under
+ GNU/Linux, this is usually 'gs', but under other systems (notably
+ Cygwin) it might be set to another name. The 'grohtml' driver uses
+ this directive.
+
+'paperlength N'
+ The vertical dimension of the output medium is N basic units
+ (deprecated: use 'papersize' instead).
+
+'papersize FORMAT-OR-DIMENSION-PAIR-OR-FILE-NAME ...'
+ The dimensions of the output medium are as according to the
+ argument, which is either a standard paper format, a pair of
+ dimensions, or the name of a plain text file containing either of
+ the foregoing.
+
+ Recognized paper formats are the ISO and DIN formats 'A0'-'A7',
+ 'B0'-'B7', 'C0'-'C7', 'D0'-'D7'; the U.S. paper types 'letter',
+ 'legal', 'tabloid', 'ledger', 'statement', and 'executive'; and the
+ envelope formats 'com10', 'monarch', and 'DL'. Matching is
+ performed without regard for lettercase.
+
+ Alternatively, the argument can be a custom paper format in the
+ format 'LENGTH,WIDTH' (with no spaces before or after the comma).
+ Both LENGTH and WIDTH must have a unit appended; valid units are
+ 'i' for inches, 'c' for centimeters, 'p' for points, and 'P' for
+ picas. Example: '12c,235p'. An argument that starts with a digit
+ is always treated as a custom paper format.
+
+ Finally, the argument can be a file name (e.g., '/etc/papersize');
+ if the file can be opened, the first line is read and a match
+ attempted against each of the other forms. No comment syntax is
+ supported.
+
+ More than one argument can be specified; each is scanned in turn
+ and the first valid paper specification used.
+
+'paperwidth N'
+ The horizontal dimension of the output medium is N basic units
+ (deprecated: use 'papersize' instead).
+
+'pass_filenames'
+ Direct GNU 'troff' to emit the name of the source file being
+ processed. This is achieved with the intermediate output command
+ 'x F', which 'grohtml' interprets.
+
+'postpro PROGRAM'
+ Use PROGRAM as the postprocessor.
+
+'prepro PROGRAM'
+ Use PROGRAM as a preprocessor. The 'html' and 'xhtml' output
+ devices use this directive.
+
+'print PROGRAM'
+ Use PROGRAM as a spooler program for printing. If omitted, the
+ '-l' and '-L' options of 'groff' are ignored.
+
+'res N'
+ The device resolution is N basic units per inch.
+
+'sizes S1 ... SN 0'
+ The device has fonts at S1, ..., SN scaled points (see below). The
+ list of sizes must be terminated by '0'. Each SI can also be a
+ range of sizes M-N. The list can extend over more than one line.
+
+'sizescale N'
+ A typographical point is subdivided into N scaled points. The
+ default is '1'. *Note Using Fractional Type Sizes::.
+
+'styles S1 ... SM'
+ The first M mounting positions are associated with styles S1, ...,
+ SM.
+
+'tcommand'
+ The postprocessor can handle the 't' and 'u' intermediate output
+ commands.
+
+'unicode'
+ The output device supports the complete Unicode repertoire. This
+ directive is useful only for devices that produce character
+ entities instead of glyphs.
+
+ If 'unicode' is present, no 'charset' section is required in the
+ font description files since the Unicode handling built into
+ 'groff' is used. However, if there are entries in a font
+ description file's 'charset' section, they either override the
+ default mappings for those particular characters or add new
+ mappings (normally for composite characters).
+
+ The 'utf8', 'html', and 'xhtml' output devices use this directive.
+
+'unitwidth N'
+ Quantities in the font description files are in basic units for
+ fonts whose type size is N scaled points.
+
+'unscaled_charwidths'
+ Make the font handling module always return unscaled character
+ widths. The 'grohtml' driver uses this directive.
+
+'use_charnames_in_special'
+ GNU 'troff' should encode special characters inside device control
+ commands; see *note Postprocessor Access::. The 'grohtml' driver
+ uses this directive.
+
+'vert N'
+ The vertical motion quantum is N basic units. All vertical
+ quantities are rounded to multiples of N.
+
+'charset'
+ This line and everything following it in the file are ignored. It
+ is recognized for compatibility with other 'troff' implementations.
+ In GNU 'troff', character set repertoire is described on a per-font
+ basis.
+
+ GNU 'troff' recognizes but ignores the directives 'spare1', 'spare2',
+and 'biggestfont'.
+
+ The 'res', 'unitwidth', 'fonts', and 'sizes' lines are mandatory.
+Directives not listed above are ignored by GNU 'troff' but may be used
+by postprocessors to obtain further information about the device.
+
+6.2.2 Font Description File Format
+----------------------------------
+
+On typesetting output devices, each font is typically available at
+multiple sizes. While paper measurements in the device description file
+are in absolute units, measurements applicable to fonts must be
+proportional to the type size. 'groff' achieves this using the
+precedent set by AT&T device-independent 'troff': one font size is
+chosen as a norm, and all others are scaled linearly relative to that
+basis. The "unit width" is the number of basic units per point when the
+font is rendered at this nominal size.
+
+ For instance, 'groff''s 'lbp' device uses a 'unitwidth' of 800. Its
+Times roman font 'TR' has a 'spacewidth' of 833; this is also the width
+of its comma, period, centered period, and mathematical asterisk, while
+its 'M' is 2,963 basic units. Thus, an 'M' on the 'lbp' device is 2,963
+basic units wide at a notional type size of 800 points.(1) (*note Font
+Description File Format-Footnote-1::)
+
+ A font description file has two sections. The first is a sequence of
+directives, and is parsed similarly to the 'DESC' file described above.
+Except for the directive names that begin the second section, their
+ordering is immaterial. Later directives of the same name override
+earlier ones, spaces and tabs are handled in the same way, and the same
+comment syntax is supported. Empty lines are ignored throughout.
+
+'name F'
+ The name of the font is F. 'DESC' is an invalid font name. Simple
+ integers are valid, but their use is discouraged.(2) (*note Font
+ Description File Format-Footnote-2::)
+
+'spacewidth N'
+ The width of an unadjusted inter-word space is N basic units.
+
+ The directives above must appear in the first section; those below
+are optional.
+
+'slant N'
+ The font's glyphs have a slant of N degrees; a positive N slants in
+ the direction of text flow.
+
+'ligatures LIG1 ... LIGN [0]'
+ Glyphs LIG1, ..., LIGN are ligatures; possible ligatures are 'ff',
+ 'fi', 'fl', 'ffi' and 'ffl'. For compatibility with other 'troff'
+ implementations, the list of ligatures may be terminated with
+ a '0'. The list of ligatures must not extend over more than one
+ line.
+
+'special'
+ The font is "special": when a glyph is requested that is not
+ present in the current font, it is sought in any mounted fonts that
+ bear this property.
+
+ Other directives in this section are ignored by GNU 'troff', but may
+be used by postprocessors to obtain further information about the font.
+
+ The second section contains one or two subsections. These can appear
+in either order; the first one encountered commences the second section.
+Each starts with a directive on a line by itself. A 'charset'
+subsection is mandatory unless the associated 'DESC' file contains the
+'unicode' directive. Another subsection, 'kernpairs', is optional.
+
+ The directive 'charset' starts the character set subsection.(3)
+(*note Font Description File Format-Footnote-3::) It precedes a series
+of glyph descriptions, one per line. Each such glyph description
+comprises a set of fields separated by spaces or tabs and organized as
+follows.
+
+ NAME METRICS TYPE CODE [ENTITY-NAME] ['--' COMMENT]
+
+NAME identifies the glyph: if NAME is a printable character C, it
+corresponds to the 'troff' ordinary character C. If NAME is a
+multi-character sequence not beginning with '\', it corresponds to the
+GNU 'troff' special character escape sequence '\[NAME]'. A name
+consisting of three minus signs, '---', is special and indicates that
+the glyph is unnamed: such glyphs can be accessed only by the '\N'
+escape sequence in 'troff'. A special character named '---' can still
+be defined using 'char' and similar requests. The NAME '\-' defines the
+minus sign glyph. Finally, NAME can be the unbreakable one-sixth and
+one-twelfth space escape sequences, '\|' and '\^' ("thin" and "hair"
+spaces, respectively), in which case only the width metric described
+below is interpreted; a font can thus customize the widths of these
+spaces.
+
+ The form of the METRICS field is as follows.
+
+ WIDTH[','[HEIGHT[','[DEPTH[','[ITALIC-CORRECTION
+ [','[LEFT-ITALIC-CORRECTION[','[SUBSCRIPT-CORRECTION]]]]]]]]]]
+
+There must not be any spaces, tabs, or newlines between these
+"subfields" (which have been split here into two lines only for better
+legibility). The subfields are in basic units expressed as decimal
+integers. Unspecified subfields default to '0'. Since there is no
+associated binary format, these values are not required to fit into the
+C language data type 'char' as they are in AT&T device-independent
+'troff'.
+
+ The WIDTH subfield gives the width of the glyph. The HEIGHT subfield
+gives the height of the glyph (upward is positive); if a glyph does not
+extend above the baseline, it should be given a zero height, rather than
+a negative height. The DEPTH subfield gives the depth of the glyph,
+that is, the distance below the baseline to which the glyph extends
+(downward is positive); if a glyph does not extend below the baseline,
+it should be given a zero depth, rather than a negative depth. Italic
+corrections are relevant to glyphs in italic or oblique styles. The
+ITALIC-CORRECTION is the amount of space that should be added after an
+oblique glyph to be followed immediately by an upright glyph. The
+LEFT-ITALIC-CORRECTION is the amount of space that should be added
+before an oblique glyph to be preceded immediately by an upright glyph.
+The SUBSCRIPT-CORRECTION is the amount of space that should be added
+after an oblique glyph to be followed by a subscript; it should be less
+than the italic correction.
+
+ For fonts used with typesetting devices, the TYPE field gives a
+featural description of the glyph: it is a bit mask recording whether
+the glyph is an ascender, descender, both, or neither. When a '\w'
+escape sequence is interpolated, these values are bitwise or-ed together
+for each glyph and stored in the 'nr' register. In font descriptions
+for terminal devices, all glyphs might have a type of zero, regardless
+of their appearance.
+
+'0'
+ means the glyph lies entirely between the baseline and a horizontal
+ line at the "x-height" of the font; typical examples are 'a', 'c',
+ and 'x';
+
+'1'
+ means the glyph descends below the baseline, like 'p';
+
+'2'
+ means the glyph ascends above the font's x-height, like 'A' or 'b';
+ and
+
+'3'
+ means the glyph is both an ascender and a descender--this is true
+ of parentheses in some fonts.
+
+ The CODE field gives a numeric identifier that the postprocessor uses
+to render the glyph. The glyph can be specified to 'troff' using this
+code by means of the '\N' escape sequence. CODE can be any integer.(4)
+(*note Font Description File Format-Footnote-4::)
+
+ The ENTITY-NAME field defines an identifier for the glyph that the
+postprocessor uses to print the GNU 'troff' glyph NAME. This field is
+optional; it was introduced so that the 'grohtml' output driver could
+encode its character set. For example, the glyph '\[Po]' is represented
+by '&pound;' in HTML 4.0. For efficiency, these data are now compiled
+directly into 'grohtml'. 'grops' uses the field to build sub-encoding
+arrays for PostScript fonts containing more than 256 glyphs. Anything
+on the line after the ENTITY-NAME field or '--' is ignored.
+
+ A line in the 'charset' section can also have the form
+
+ NAME "
+
+identifying NAME as another name for the glyph mentioned in the
+preceding line. Such aliases can be chained.
+
+ The directive 'kernpairs' starts a list of kerning adjustments to be
+made to adjacent glyph pairs from this font. It contains a sequence of
+lines formatted as follows.
+
+ G1 G2 N
+
+The foregoing means that when glyph G1 is typeset immediately before G2,
+the space between them should be increased by N. Most kerning pairs
+should have a negative value for N.
+
+ (1) 800-point type is not practical for most purposes, but using it
+enables the quantities in the font description files to be expressed as
+integers.
+
+ (2) 'groff' requests and escape sequences interpret non-negative font
+names as mounting positions instead. Further, a font named '0' cannot
+be automatically mounted by the 'fonts' directive of a 'DESC' file.
+
+ (3) For typesetter devices, this directive is misnamed since it
+starts a list of glyphs, not characters.
+
+ (4) that is, any integer parsable by the C standard library's
+'strtol(3)' function
+
+Appendix A Copying This Manual
+******************************
+
+ Version 1.3, 3 November 2008
+
+ Copyright © 2000-2018 Free Software Foundation, Inc.
+ <http://fsf.org/>
+
+ 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.
+
+ The "publisher" means any person or entity that distributes copies
+ of the Document to the public.
+
+ 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 under this License. Any attempt
+ otherwise to copy, modify, sublicense, or distribute it is void,
+ and will automatically terminate your rights under this License.
+
+ However, if you cease all violation of this License, then your
+ license from a particular copyright holder is reinstated (a)
+ provisionally, unless and until the copyright holder explicitly and
+ finally terminates your license, and (b) permanently, if the
+ copyright holder fails to notify you of the violation by some
+ reasonable means prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+ reinstated permanently if the copyright holder notifies you of the
+ violation by some reasonable means, this is the first time you have
+ received notice of violation of this License (for any work) from
+ that copyright holder, and you cure the violation prior to 30 days
+ after your receipt of the notice.
+
+ Termination of your rights under this section does not terminate
+ the licenses of parties who have received copies or rights from you
+ under this License. If your rights have been terminated and not
+ permanently reinstated, receipt of a copy of some or all of the
+ same material does not give you any rights to use it.
+
+ 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. If the Document specifies that a proxy can
+ decide which future versions of this License can be used, that
+ proxy's public statement of acceptance of a version permanently
+ authorizes you to choose that version for the Document.
+
+ 11. RELICENSING
+
+ "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
+ World Wide Web server that publishes copyrightable works and also
+ provides prominent facilities for anybody to edit those works. A
+ public wiki that anybody can edit is an example of such a server.
+ A "Massive Multiauthor Collaboration" (or "MMC") contained in the
+ site means any set of copyrightable works thus published on the MMC
+ site.
+
+ "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
+ license published by Creative Commons Corporation, a not-for-profit
+ corporation with a principal place of business in San Francisco,
+ California, as well as future copyleft versions of that license
+ published by that same organization.
+
+ "Incorporate" means to publish or republish a Document, in whole or
+ in part, as part of another Document.
+
+ An MMC is "eligible for relicensing" if it is licensed under this
+ License, and if all works that were first published under this
+ License somewhere other than this MMC, and subsequently
+ incorporated in whole or in part into the MMC, (1) had no cover
+ texts or invariant sections, and (2) were thus incorporated prior
+ to November 1, 2008.
+
+ The operator of an MMC Site may republish an MMC contained in the
+ site under CC-BY-SA on the same site at any time before August 1,
+ 2009, provided the MMC is eligible for relicensing.
+
+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.3
+ 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.
+
+Appendix B Request Index
+************************
+
+Request names appear without a leading control character; the defaults
+are '.' for the regular control character and ''' for the no-break
+control character.
+
+* Menu:
+
+* ab: Debugging. (line 12127)
+* ad: Manipulating Filling and Adjustment.
+ (line 5701)
+* af: Assigning Register Formats.
+ (line 5419)
+* aln: Setting Registers. (line 5323)
+* als: Strings. (line 8972)
+* am: Writing Macros. (line 9530)
+* am1: Writing Macros. (line 9531)
+* ami: Writing Macros. (line 9532)
+* ami1: Writing Macros. (line 9533)
+* as: Strings. (line 8888)
+* as1: Strings. (line 8889)
+* asciify: Diversions. (line 11120)
+* backtrace: Debugging. (line 12176)
+* bd: Artificial Fonts. (line 8211)
+* blm: Blank Line Traps. (line 10779)
+* box: Diversions. (line 10975)
+* boxa: Diversions. (line 10976)
+* bp: Page Control. (line 7175)
+* br: Manipulating Filling and Adjustment.
+ (line 5657)
+* break: while. (line 9393)
+* brp: Manipulating Filling and Adjustment.
+ (line 5774)
+* c2: Control Characters.
+ (line 4749)
+* cc: Control Characters.
+ (line 4743)
+* ce: Manipulating Filling and Adjustment.
+ (line 5826)
+* cf: I/O. (line 11521)
+* cflags: Using Symbols. (line 7846)
+* ch: Page Location Traps.
+ (line 10528)
+* char: Using Symbols. (line 7945)
+* chop: Strings. (line 8919)
+* class: Character Classes. (line 8034)
+* close: I/O. (line 11703)
+* color: Colors. (line 8687)
+* composite: Using Symbols. (line 7802)
+* continue: while. (line 9397)
+* cp: Compatibility Mode.
+ (line 12414)
+* cs: Artificial Fonts. (line 8241)
+* cu: Artificial Fonts. (line 8202)
+* da: Diversions. (line 10944)
+* de: Writing Macros. (line 9418)
+* de1: Writing Macros. (line 9490)
+* defcolor: Colors. (line 8699)
+* dei: Writing Macros. (line 9512)
+* dei1: Writing Macros. (line 9513)
+* device: Postprocessor Access.
+ (line 11738)
+* devicem: Postprocessor Access.
+ (line 11768)
+* di: Diversions. (line 10943)
+* do: Compatibility Mode.
+ (line 12425)
+* ds: ms Document Control Settings.
+ (line 1803)
+* ds <1>: Strings. (line 8798)
+* ds1: Strings. (line 8799)
+* dt: Diversion Traps. (line 10668)
+* ec: Using Escape Sequences.
+ (line 5012)
+* ecr: Using Escape Sequences.
+ (line 5038)
+* ecs: Using Escape Sequences.
+ (line 5037)
+* el: if-else. (line 9213)
+* em: End-of-input Traps.
+ (line 10807)
+* eo: Using Escape Sequences.
+ (line 5007)
+* ev: Environments. (line 11308)
+* evc: Environments. (line 11362)
+* ex: Debugging. (line 12132)
+* fam: Font Families. (line 7463)
+* fc: Fields. (line 6704)
+* fchar: Using Symbols. (line 7946)
+* fcolor: Colors. (line 8757)
+* fi: Manipulating Filling and Adjustment.
+ (line 5684)
+* fl: Debugging. (line 12167)
+* fp: Font Positions. (line 7550)
+* fschar: Using Symbols. (line 7947)
+* fspecial: Special Fonts. (line 8104)
+* ft: Selecting Fonts. (line 7348)
+* ftr: Selecting Fonts. (line 7406)
+* fzoom: Selecting Fonts. (line 7420)
+* gcolor: Colors. (line 8729)
+* hc: Manipulating Hyphenation.
+ (line 6023)
+* hcode: Manipulating Hyphenation.
+ (line 6228)
+* hla: Manipulating Hyphenation.
+ (line 6262)
+* hlm: Manipulating Hyphenation.
+ (line 6275)
+* hpf: Manipulating Hyphenation.
+ (line 6168)
+* hpfa: Manipulating Hyphenation.
+ (line 6169)
+* hpfcode: Manipulating Hyphenation.
+ (line 6170)
+* hw: Manipulating Hyphenation.
+ (line 5957)
+* hy: Manipulating Hyphenation.
+ (line 6055)
+* hym: Manipulating Hyphenation.
+ (line 6289)
+* hys: Manipulating Hyphenation.
+ (line 6304)
+* ie: if-else. (line 9212)
+* if: if-then. (line 9171)
+* ig: Comments. (line 5180)
+* in: Line Layout. (line 6935)
+* it: Input Line Traps. (line 10679)
+* itc: Input Line Traps. (line 10680)
+* kern: Ligatures and Kerning.
+ (line 8288)
+* lc: Leaders. (line 6661)
+* length: Strings. (line 8909)
+* lf: Debugging. (line 12103)
+* lg: Ligatures and Kerning.
+ (line 8270)
+* linetabs: Tabs and Fields. (line 6614)
+* ll: Line Layout. (line 6987)
+* ls: Manipulating Spacing.
+ (line 6395)
+* lsm: Leading Space Traps.
+ (line 10789)
+* lt: Page Layout. (line 7134)
+* mc: Miscellaneous. (line 11897)
+* mk: Page Motions. (line 9867)
+* mso: I/O. (line 11512)
+* msoquiet: I/O. (line 11513)
+* na: Manipulating Filling and Adjustment.
+ (line 5768)
+* ne: Page Control. (line 7195)
+* nf: Manipulating Filling and Adjustment.
+ (line 5692)
+* nh: Manipulating Hyphenation.
+ (line 6163)
+* nm: Miscellaneous. (line 11796)
+* nn: Miscellaneous. (line 11861)
+* nop: if-then. (line 9190)
+* nr: ms Document Control Settings.
+ (line 1799)
+* nr <1>: Setting Registers. (line 5223)
+* nr <2>: Setting Registers. (line 5277)
+* nr <3>: Auto-increment. (line 5372)
+* nroff: troff and nroff Modes.
+ (line 6840)
+* ns: Manipulating Spacing.
+ (line 6454)
+* nx: I/O. (line 11553)
+* open: I/O. (line 11670)
+* opena: I/O. (line 11671)
+* os: Page Control. (line 7230)
+* output: Diversions. (line 11107)
+* pc: Page Layout. (line 7149)
+* pev: Debugging. (line 12150)
+* pi: I/O. (line 11612)
+* pl: Page Layout. (line 7090)
+* pm: Debugging. (line 12154)
+* pn: Page Layout. (line 7104)
+* pnr: Debugging. (line 12158)
+* po: Line Layout. (line 6909)
+* ps: Changing the Type Size.
+ (line 8462)
+* psbb: Miscellaneous. (line 11945)
+* pso: I/O. (line 11501)
+* ptr: Debugging. (line 12162)
+* pvs: Changing the Vertical Spacing.
+ (line 8581)
+* rchar: Using Symbols. (line 8004)
+* rd: I/O. (line 11558)
+* return: Writing Macros. (line 9567)
+* rfschar: Using Symbols. (line 8005)
+* rj: Manipulating Filling and Adjustment.
+ (line 5865)
+* rm: Strings. (line 8967)
+* rn: Strings. (line 8964)
+* rnn: Setting Registers. (line 5318)
+* rr: Setting Registers. (line 5312)
+* rs: Manipulating Spacing.
+ (line 6455)
+* rt: Page Motions. (line 9868)
+* schar: Using Symbols. (line 7948)
+* shc: Manipulating Hyphenation.
+ (line 6032)
+* shift: Parameters. (line 9610)
+* sizes: Changing the Type Size.
+ (line 8526)
+* so: I/O. (line 11472)
+* soquiet: I/O. (line 11473)
+* sp: Manipulating Spacing.
+ (line 6348)
+* special: Special Fonts. (line 8103)
+* spreadwarn: Debugging. (line 12207)
+* ss: Manipulating Filling and Adjustment.
+ (line 5885)
+* stringdown: Strings. (line 8944)
+* stringup: Strings. (line 8945)
+* sty: Font Families. (line 7504)
+* substring: Strings. (line 8927)
+* sv: Page Control. (line 7229)
+* sy: I/O. (line 11634)
+* ta: Tabs and Fields. (line 6488)
+* tag: Postprocessor Access.
+ (line 11781)
+* taga: Postprocessor Access.
+ (line 11782)
+* tc: Tabs and Fields. (line 6602)
+* ti: Line Layout. (line 6959)
+* tkf: Ligatures and Kerning.
+ (line 8307)
+* tl: Page Layout. (line 7120)
+* tm: Debugging. (line 12115)
+* tm1: Debugging. (line 12116)
+* tmc: Debugging. (line 12117)
+* tr: Character Translations.
+ (line 6729)
+* trf: I/O. (line 11520)
+* trin: Character Translations.
+ (line 6730)
+* trnt: Character Translations.
+ (line 6795)
+* troff: troff and nroff Modes.
+ (line 6832)
+* uf: Artificial Fonts. (line 8206)
+* ul: Artificial Fonts. (line 8180)
+* unformat: Diversions. (line 11145)
+* vpt: Vertical Position Traps.
+ (line 10406)
+* vs: Changing the Vertical Spacing.
+ (line 8540)
+* warn: Debugging. (line 12226)
+* warnscale: Debugging. (line 12203)
+* wh: Page Location Traps.
+ (line 10425)
+* while: while. (line 9331)
+* write: I/O. (line 11682)
+* writec: I/O. (line 11683)
+* writem: I/O. (line 11694)
+
+Appendix C Escape Sequence Index
+********************************
+
+The escape character, '\' by default, is always followed by at least one
+more input character, making an escape _sequence_. Any input token '\X'
+with X not in the list below emits a warning and interpolates glyph X.
+Note the entries for '\.', which may be obscured by the leader dots, and
+for '\<RET>' and '\<SP>', which are sorted alphabetically, not by code
+point order.
+
+* Menu:
+
+* \: Using Escape Sequences.
+ (line 4944)
+* \ <1>: Using Symbols. (line 7731)
+* \!: Diversions. (line 11065)
+* \": Comments. (line 5136)
+* \#: Comments. (line 5170)
+* \$: Parameters. (line 9602)
+* \$*: Parameters. (line 9622)
+* \$0: Parameters. (line 9657)
+* \$@: Parameters. (line 9623)
+* \$^: Parameters. (line 9624)
+* \%: Manipulating Hyphenation.
+ (line 5991)
+* \&: Dummy Characters. (line 8357)
+* \': Using Symbols. (line 7831)
+* \(: Using Symbols. (line 7733)
+* \): Dummy Characters. (line 8407)
+* \*: Strings. (line 8800)
+* \,: Italic Corrections.
+ (line 8338)
+* \-: Using Symbols. (line 7838)
+* \.: Copy Mode. (line 9739)
+* \/: Italic Corrections.
+ (line 8328)
+* \0: Page Motions. (line 10014)
+* \:: Manipulating Hyphenation.
+ (line 5992)
+* \?: Diversions. (line 11066)
+* \A: Identifiers. (line 4628)
+* \a: Leaders. (line 6658)
+* \B: Numeric Expressions.
+ (line 4522)
+* \b: Drawing Geometric Objects.
+ (line 10308)
+* \c: Line Continuation. (line 7047)
+* \C: Using Symbols. (line 7793)
+* \d: Page Motions. (line 9965)
+* \D: Drawing Geometric Objects.
+ (line 10216)
+* \e: Using Escape Sequences.
+ (line 5000)
+* \E: Copy Mode. (line 9794)
+* \f: Selecting Fonts. (line 7349)
+* \F: Font Families. (line 7465)
+* \g: Assigning Register Formats.
+ (line 5477)
+* \H: Artificial Fonts. (line 8129)
+* \h: Page Motions. (line 9982)
+* \k: Page Motions. (line 10082)
+* \l: Drawing Geometric Objects.
+ (line 10141)
+* \L: Drawing Geometric Objects.
+ (line 10167)
+* \m: Colors. (line 8730)
+* \M: Colors. (line 8758)
+* \n: Interpolating Registers.
+ (line 5338)
+* \n <1>: Auto-increment. (line 5381)
+* \N: Using Symbols. (line 7810)
+* \newline: Line Continuation. (line 7019)
+* \o: Page Motions. (line 10097)
+* \O: Suppressing Output.
+ (line 11410)
+* \p: Manipulating Filling and Adjustment.
+ (line 5775)
+* \R: Setting Registers. (line 5224)
+* \R <1>: Setting Registers. (line 5279)
+* \r: Page Motions. (line 9963)
+* \<RET>: Line Continuation. (line 7019)
+* \S: Artificial Fonts. (line 8160)
+* \s: Changing the Type Size.
+ (line 8465)
+* \<SP>: Page Motions. (line 9998)
+* \space: Page Motions. (line 9998)
+* \t: Tabs and Fields. (line 6485)
+* \u: Page Motions. (line 9964)
+* \v: Page Motions. (line 9938)
+* \V: I/O. (line 11719)
+* \w: Page Motions. (line 10020)
+* \x: Manipulating Spacing.
+ (line 6407)
+* \X: Postprocessor Access.
+ (line 11739)
+* \Y: Postprocessor Access.
+ (line 11769)
+* \z: Page Motions. (line 10102)
+* \Z: Page Motions. (line 10107)
+* \[: Using Symbols. (line 7733)
+* \\: Copy Mode. (line 9714)
+* \^: Page Motions. (line 10009)
+* \_: Using Symbols. (line 7841)
+* \`: Using Symbols. (line 7835)
+* \{: Conditional Blocks.
+ (line 9249)
+* \{ <1>: Conditional Blocks.
+ (line 9250)
+* \|: Page Motions. (line 10004)
+* \}: Conditional Blocks.
+ (line 9250)
+* \~: Manipulating Filling and Adjustment.
+ (line 5671)
+
+Appendix D Operator Index
+*************************
+
+* Menu:
+
+* !: Numeric Expressions.
+ (line 4426)
+* %: Numeric Expressions.
+ (line 4359)
+* &: Numeric Expressions.
+ (line 4422)
+* (: Numeric Expressions.
+ (line 4446)
+* ): Numeric Expressions.
+ (line 4446)
+* *: Numeric Expressions.
+ (line 4359)
+* +: Numeric Expressions.
+ (line 4359)
+* + <1>: Numeric Expressions.
+ (line 4365)
+* + (unary): Numeric Expressions.
+ (line 4457)
+* -: Numeric Expressions.
+ (line 4359)
+* - <1>: Numeric Expressions.
+ (line 4365)
+* - (unary): Numeric Expressions.
+ (line 4457)
+* /: Numeric Expressions.
+ (line 4359)
+* ;: Numeric Expressions.
+ (line 4390)
+* <: Numeric Expressions.
+ (line 4416)
+* <=: Numeric Expressions.
+ (line 4416)
+* <?: Numeric Expressions.
+ (line 4407)
+* <colon>: Numeric Expressions.
+ (line 4422)
+* =: Numeric Expressions.
+ (line 4416)
+* ==: Numeric Expressions.
+ (line 4416)
+* >: Numeric Expressions.
+ (line 4416)
+* >=: Numeric Expressions.
+ (line 4416)
+* >?: Numeric Expressions.
+ (line 4407)
+* |: Numeric Expressions.
+ (line 4471)
+
+Appendix E Register Index
+*************************
+
+The macro package or program a specific register belongs to is appended
+in brackets.
+
+ A register name 'x' consisting of exactly one character can be
+accessed as '\nx'. A register name 'xx' consisting of exactly two
+characters can be accessed as '\n(xx'. Register names 'xxx' of any
+length can be accessed as '\n[xxx]'.
+
+* Menu:
+
+* $$: Built-in Registers.
+ (line 5571)
+* %: Page Layout. (line 7149)
+* % <1>: Page Control. (line 7178)
+* .$: Parameters. (line 9594)
+* .A: Built-in Registers.
+ (line 5527)
+* .a: Manipulating Spacing.
+ (line 6408)
+* .b: Artificial Fonts. (line 8213)
+* .br: Control Characters.
+ (line 4759)
+* .c: Built-in Registers.
+ (line 5531)
+* .C: Compatibility Mode.
+ (line 12415)
+* .cdp: Environments. (line 11387)
+* .ce: Manipulating Filling and Adjustment.
+ (line 5827)
+* .cht: Environments. (line 11386)
+* .color: Colors. (line 8688)
+* .cp: Compatibility Mode.
+ (line 12426)
+* .csk: Environments. (line 11388)
+* .d: Diversions. (line 11000)
+* .ev: Environments. (line 11309)
+* .F: Built-in Registers.
+ (line 5536)
+* .f: Font Positions. (line 7551)
+* .fam: Font Families. (line 7464)
+* .fn: Selecting Fonts. (line 7352)
+* .fp: Font Positions. (line 7552)
+* .g: Built-in Registers.
+ (line 5539)
+* .H: Motion Quanta. (line 4300)
+* .h: Diversions. (line 11007)
+* .height: Artificial Fonts. (line 8132)
+* .hla: Manipulating Hyphenation.
+ (line 6263)
+* .hlc: Manipulating Hyphenation.
+ (line 6277)
+* .hlm: Manipulating Hyphenation.
+ (line 6276)
+* .hy: Manipulating Hyphenation.
+ (line 6056)
+* .hym: Manipulating Hyphenation.
+ (line 6290)
+* .hys: Manipulating Hyphenation.
+ (line 6305)
+* .i: Line Layout. (line 6938)
+* .in: Line Layout. (line 6962)
+* .int: Line Continuation. (line 7048)
+* .j: Manipulating Filling and Adjustment.
+ (line 5702)
+* .k: Page Motions. (line 10093)
+* .kern: Ligatures and Kerning.
+ (line 8289)
+* .L: Manipulating Spacing.
+ (line 6396)
+* .l: Line Layout. (line 6990)
+* .lg: Ligatures and Kerning.
+ (line 8271)
+* .linetabs: Tabs and Fields. (line 6615)
+* .ll: Line Layout. (line 6991)
+* .lt: Page Layout. (line 7137)
+* .m: Colors. (line 8733)
+* .M: Colors. (line 8761)
+* .n: Environments. (line 11403)
+* .ne: Page Location Traps.
+ (line 10579)
+* .nm: Miscellaneous. (line 11798)
+* .nn: Miscellaneous. (line 11862)
+* .ns: Manipulating Spacing.
+ (line 6456)
+* .o: Line Layout. (line 6912)
+* .O: Suppressing Output.
+ (line 11463)
+* .P: Built-in Registers.
+ (line 5543)
+* .p: Page Layout. (line 7093)
+* .pe: Page Location Traps.
+ (line 10598)
+* .pn: Page Layout. (line 7107)
+* .ps: Using Fractional Type Sizes.
+ (line 8622)
+* .psr: Using Fractional Type Sizes.
+ (line 8637)
+* .pvs: Changing the Vertical Spacing.
+ (line 8584)
+* .R: Built-in Registers.
+ (line 5547)
+* .rj: Manipulating Filling and Adjustment.
+ (line 5866)
+* .s: Changing the Type Size.
+ (line 8466)
+* .slant: Artificial Fonts. (line 8161)
+* .sr: Using Fractional Type Sizes.
+ (line 8638)
+* .ss: Manipulating Filling and Adjustment.
+ (line 5886)
+* .sss: Manipulating Filling and Adjustment.
+ (line 5887)
+* .sty: Font Families. (line 7505)
+* .T: Built-in Registers.
+ (line 5551)
+* .t: Page Location Traps.
+ (line 10520)
+* .tabs: Tabs and Fields. (line 6489)
+* .trunc: Page Location Traps.
+ (line 10587)
+* .U: Built-in Registers.
+ (line 5555)
+* .u: Manipulating Filling and Adjustment.
+ (line 5685)
+* .V: Motion Quanta. (line 4301)
+* .v: Changing the Vertical Spacing.
+ (line 8543)
+* .vpt: Vertical Position Traps.
+ (line 10407)
+* .w: Environments. (line 11385)
+* .warn: Debugging. (line 12227)
+* .x: Built-in Registers.
+ (line 5559)
+* .y: Built-in Registers.
+ (line 5563)
+* .Y: Built-in Registers.
+ (line 5567)
+* .z: Diversions. (line 10999)
+* .zoom: Selecting Fonts. (line 7421)
+* c.: Built-in Registers.
+ (line 5532)
+* ct: Page Motions. (line 10025)
+* DD [ms]: ms Document Control Settings.
+ (line 2089)
+* DI [ms]: ms Document Control Settings.
+ (line 2098)
+* dl: Diversions. (line 11026)
+* dn: Diversions. (line 11025)
+* dw: Built-in Registers.
+ (line 5589)
+* dy: Built-in Registers.
+ (line 5592)
+* FF [ms]: ms Document Control Settings.
+ (line 2029)
+* FI [ms]: ms Document Control Settings.
+ (line 2022)
+* FM [ms]: ms Document Control Settings.
+ (line 1848)
+* FPD [ms]: ms Document Control Settings.
+ (line 2070)
+* FPS [ms]: ms Document Control Settings.
+ (line 2056)
+* FVS [ms]: ms Document Control Settings.
+ (line 2063)
+* GROWPS [ms]: ms Document Control Settings.
+ (line 1987)
+* GS [ms]: Differences from AT&T ms.
+ (line 3360)
+* HM [ms]: ms Document Control Settings.
+ (line 1841)
+* HORPHANS [ms]: ms Document Control Settings.
+ (line 1998)
+* hours: Built-in Registers.
+ (line 5586)
+* hp: Page Motions. (line 10090)
+* HY [ms]: ms Document Control Settings.
+ (line 1917)
+* LL [ms]: ms Document Control Settings.
+ (line 1822)
+* llx: Miscellaneous. (line 11946)
+* lly: Miscellaneous. (line 11947)
+* ln: Miscellaneous. (line 11797)
+* lsn: Leading Space Traps.
+ (line 10790)
+* lss: Leading Space Traps.
+ (line 10791)
+* LT [ms]: ms Document Control Settings.
+ (line 1831)
+* MINGW [ms]: ms Document Control Settings.
+ (line 2111)
+* minutes: Built-in Registers.
+ (line 5583)
+* mo: Built-in Registers.
+ (line 5595)
+* nl: Page Control. (line 7240)
+* opmaxx: Suppressing Output.
+ (line 11426)
+* opmaxy: Suppressing Output.
+ (line 11426)
+* opminx: Suppressing Output.
+ (line 11426)
+* opminy: Suppressing Output.
+ (line 11426)
+* PD [ms]: ms Document Control Settings.
+ (line 1946)
+* PI [ms]: ms Document Control Settings.
+ (line 1938)
+* PO [ms]: ms Document Control Settings.
+ (line 1813)
+* PORPHANS [ms]: ms Document Control Settings.
+ (line 1961)
+* PS [ms]: ms Document Control Settings.
+ (line 1903)
+* PSINCR [ms]: ms Document Control Settings.
+ (line 1976)
+* QI [ms]: ms Document Control Settings.
+ (line 1953)
+* rsb: Page Motions. (line 10024)
+* rst: Page Motions. (line 10023)
+* sb: Page Motions. (line 10022)
+* seconds: Built-in Registers.
+ (line 5580)
+* skw: Page Motions. (line 10027)
+* slimit: Debugging. (line 12197)
+* ssc: Page Motions. (line 10026)
+* st: Page Motions. (line 10021)
+* systat: I/O. (line 11635)
+* TC-MARGIN [ms]: ms Document Control Settings.
+ (line 2119)
+* urx: Miscellaneous. (line 11948)
+* ury: Miscellaneous. (line 11949)
+* VS [ms]: ms Document Control Settings.
+ (line 1910)
+* year: Built-in Registers.
+ (line 5598)
+* yr: Built-in Registers.
+ (line 5601)
+
+Appendix F Macro Index
+**********************
+
+The macro package a specific macro belongs to is appended in brackets.
+They appear without the leading control character (normally '.').
+
+* Menu:
+
+* 1C [ms]: ms Multiple Columns.
+ (line 3125)
+* 2C [ms]: ms Multiple Columns.
+ (line 3128)
+* [ [ms]: ms Insertions. (line 2876)
+* ] [ms]: ms Insertions. (line 2877)
+* AB [ms]: ms Document Description Macros.
+ (line 2187)
+* AE [ms]: ms Document Description Macros.
+ (line 2194)
+* AI [ms]: ms Document Description Macros.
+ (line 2170)
+* AM [ms]: ms Legacy Features. (line 3443)
+* AU [ms]: ms Document Description Macros.
+ (line 2164)
+* B [ms]: Typeface and decoration.
+ (line 2485)
+* B1 [ms]: ms keeps and displays.
+ (line 2774)
+* B2 [ms]: ms keeps and displays.
+ (line 2775)
+* BD [ms]: ms keeps and displays.
+ (line 2815)
+* BI [ms]: Typeface and decoration.
+ (line 2498)
+* BT [man]: Optional man extensions.
+ (line 1442)
+* BX [ms]: Typeface and decoration.
+ (line 2506)
+* CD [ms]: ms keeps and displays.
+ (line 2821)
+* CT [man]: Optional man extensions.
+ (line 1457)
+* CW [man]: Optional man extensions.
+ (line 1460)
+* CW [ms]: Typeface and decoration.
+ (line 2502)
+* DA [ms]: ms Document Description Macros.
+ (line 2177)
+* De [man]: Optional man extensions.
+ (line 1467)
+* DE [ms]: ms keeps and displays.
+ (line 2830)
+* Ds [man]: Optional man extensions.
+ (line 1464)
+* DS [ms]: ms keeps and displays.
+ (line 2805)
+* DS [ms] <1>: ms keeps and displays.
+ (line 2809)
+* DS [ms] <2>: ms keeps and displays.
+ (line 2814)
+* DS [ms] <3>: ms keeps and displays.
+ (line 2820)
+* DS [ms] <4>: ms keeps and displays.
+ (line 2825)
+* EE [man]: Optional man extensions.
+ (line 1474)
+* EF [ms]: ms Headers and Footers.
+ (line 3069)
+* EH [ms]: ms Headers and Footers.
+ (line 3067)
+* EN [ms]: ms Insertions. (line 2869)
+* EQ [ms]: ms Insertions. (line 2868)
+* EX [man]: Optional man extensions.
+ (line 1470)
+* FE [ms]: ms Footnotes. (line 2935)
+* FS [ms]: ms Footnotes. (line 2934)
+* G [man]: Optional man extensions.
+ (line 1477)
+* GL [man]: Optional man extensions.
+ (line 1482)
+* HB [man]: Optional man extensions.
+ (line 1487)
+* I [ms]: Typeface and decoration.
+ (line 2495)
+* ID [ms]: ms keeps and displays.
+ (line 2810)
+* IP [ms]: Paragraphs in ms. (line 2294)
+* KE [ms]: ms keeps and displays.
+ (line 2762)
+* KF [ms]: ms keeps and displays.
+ (line 2761)
+* KS [ms]: ms keeps and displays.
+ (line 2760)
+* LD [ms]: ms keeps and displays.
+ (line 2806)
+* LG [ms]: Typeface and decoration.
+ (line 2516)
+* LP [ms]: Paragraphs in ms. (line 2287)
+* MC [ms]: ms Multiple Columns.
+ (line 3131)
+* MS [man]: Optional man extensions.
+ (line 1495)
+* ND [ms]: ms Document Description Macros.
+ (line 2182)
+* NE [man]: Optional man extensions.
+ (line 1507)
+* NH [ms]: Headings in ms. (line 2361)
+* NL [ms]: Typeface and decoration.
+ (line 2528)
+* NT [man]: Optional man extensions.
+ (line 1500)
+* OF [ms]: ms Headers and Footers.
+ (line 3068)
+* OH [ms]: ms Headers and Footers.
+ (line 3066)
+* P1 [ms]: ms Headers and Footers.
+ (line 3078)
+* PE [ms]: ms Insertions. (line 2861)
+* PF [ms]: ms Insertions. (line 2862)
+* PN [man]: Optional man extensions.
+ (line 1510)
+* Pn [man]: Optional man extensions.
+ (line 1514)
+* PP [ms]: Paragraphs in ms. (line 2290)
+* PS [ms]: ms Insertions. (line 2860)
+* PT [man]: Optional man extensions.
+ (line 1437)
+* PX [ms]: ms TOC. (line 3181)
+* QE [ms]: Paragraphs in ms. (line 2307)
+* QP [ms]: Paragraphs in ms. (line 2302)
+* QS [ms]: Paragraphs in ms. (line 2306)
+* R [man]: Optional man extensions.
+ (line 1520)
+* R [ms]: Typeface and decoration.
+ (line 2491)
+* RD [ms]: ms keeps and displays.
+ (line 2826)
+* RE [ms]: Indented regions in ms.
+ (line 2710)
+* RN [man]: Optional man extensions.
+ (line 1523)
+* RP [ms]: ms Document Description Macros.
+ (line 2145)
+* RS [ms]: Indented regions in ms.
+ (line 2706)
+* SH [ms]: Headings in ms. (line 2431)
+* SM [ms]: Typeface and decoration.
+ (line 2522)
+* TA [ms]: Tab Stops in ms. (line 3103)
+* TB [man]: Optional man extensions.
+ (line 1492)
+* TC [ms]: ms TOC. (line 3186)
+* TE [ms]: ms Insertions. (line 2852)
+* TL [ms]: ms Document Description Macros.
+ (line 2159)
+* TS [ms]: ms Insertions. (line 2851)
+* UL [ms]: Typeface and decoration.
+ (line 2512)
+* VE [man]: Optional man extensions.
+ (line 1530)
+* VS [man]: Optional man extensions.
+ (line 1526)
+* XA [ms]: ms TOC. (line 3170)
+* XE [ms]: ms TOC. (line 3171)
+* XH [ms]: ms TOC. (line 3222)
+* XH-REPLACEMENT [ms]: ms TOC. (line 3231)
+* XH-UPDATE-TOC [ms]: ms TOC. (line 3236)
+* XN [ms]: ms TOC. (line 3221)
+* XN-INIT [ms]: ms TOC. (line 3235)
+* XN-REPLACEMENT [ms]: ms TOC. (line 3230)
+* XP [ms]: Paragraphs in ms. (line 2313)
+* XS [ms]: ms TOC. (line 3169)
+
+Appendix G String Index
+***********************
+
+The macro package or program a that defines or uses each string is
+appended in brackets. (Only one string, '.T', is defined by the 'troff'
+formatter itself.) *Note Strings::.
+
+* Menu:
+
+* ! [ms]: ms Legacy Features. (line 3482)
+* ' [ms]: ms Legacy Features. (line 3415)
+* ' [ms] <1>: ms Legacy Features. (line 3446)
+* * [ms]: ms Footnotes. (line 2925)
+* , [ms]: ms Legacy Features. (line 3433)
+* , [ms] <1>: ms Legacy Features. (line 3461)
+* - [ms]: Typographical symbols in ms.
+ (line 2266)
+* . [ms]: ms Legacy Features. (line 3473)
+* .T: Strings. (line 8787)
+* .T <1>: Strings. (line 8787)
+* / [ms]: ms Legacy Features. (line 3464)
+* 3 [ms]: ms Legacy Features. (line 3491)
+* 8 [ms]: ms Legacy Features. (line 3485)
+* : [ms]: ms Legacy Features. (line 3421)
+* : [ms] <1>: ms Legacy Features. (line 3452)
+* < [ms]: Typeface and decoration.
+ (line 2562)
+* > [ms]: Typeface and decoration.
+ (line 2563)
+* ? [ms]: ms Legacy Features. (line 3479)
+* ^ [ms]: ms Legacy Features. (line 3424)
+* ^ [ms] <1>: ms Legacy Features. (line 3455)
+* _ [ms]: ms Legacy Features. (line 3470)
+* ` [ms]: ms Legacy Features. (line 3418)
+* ` [ms] <1>: ms Legacy Features. (line 3449)
+* { [ms]: Typeface and decoration.
+ (line 2558)
+* } [ms]: Typeface and decoration.
+ (line 2559)
+* ~ [ms]: ms Legacy Features. (line 3427)
+* ~ [ms] <1>: ms Legacy Features. (line 3458)
+* ABSTRACT [ms]: ms language and localization.
+ (line 3019)
+* ae [ms]: ms Legacy Features. (line 3506)
+* Ae [ms]: ms Legacy Features. (line 3509)
+* C [ms]: ms Legacy Features. (line 3430)
+* CF [ms]: ms Document Control Settings.
+ (line 1886)
+* CH [ms]: ms Document Control Settings.
+ (line 1865)
+* d- [ms]: ms Legacy Features. (line 3494)
+* D- [ms]: ms Legacy Features. (line 3497)
+* FAM [ms]: ms Document Control Settings.
+ (line 1926)
+* FR [ms]: ms Document Control Settings.
+ (line 2077)
+* LF [ms]: ms Document Control Settings.
+ (line 1879)
+* LH [ms]: ms Document Control Settings.
+ (line 1858)
+* MONTH1 [ms]: ms language and localization.
+ (line 3028)
+* MONTH10 [ms]: ms language and localization.
+ (line 3037)
+* MONTH11 [ms]: ms language and localization.
+ (line 3038)
+* MONTH12 [ms]: ms language and localization.
+ (line 3039)
+* MONTH2 [ms]: ms language and localization.
+ (line 3029)
+* MONTH3 [ms]: ms language and localization.
+ (line 3030)
+* MONTH4 [ms]: ms language and localization.
+ (line 3031)
+* MONTH5 [ms]: ms language and localization.
+ (line 3032)
+* MONTH6 [ms]: ms language and localization.
+ (line 3033)
+* MONTH7 [ms]: ms language and localization.
+ (line 3034)
+* MONTH8 [ms]: ms language and localization.
+ (line 3035)
+* MONTH9 [ms]: ms language and localization.
+ (line 3036)
+* o [ms]: ms Legacy Features. (line 3476)
+* oe [ms]: ms Legacy Features. (line 3512)
+* OE [ms]: ms Legacy Features. (line 3515)
+* Q [ms]: Typographical symbols in ms.
+ (line 2269)
+* q [ms]: ms Legacy Features. (line 3488)
+* REFERENCES [ms]: ms language and localization.
+ (line 3014)
+* RF [ms]: ms Document Control Settings.
+ (line 1893)
+* RH [ms]: ms Document Control Settings.
+ (line 1872)
+* SN [ms]: Headings in ms. (line 2410)
+* SN-DOT [ms]: Headings in ms. (line 2408)
+* SN-NO-DOT [ms]: Headings in ms. (line 2409)
+* SN-STYLE [ms]: ms Document Control Settings.
+ (line 2011)
+* SN-STYLE [ms] <1>: Headings in ms. (line 2407)
+* th [ms]: ms Legacy Features. (line 3500)
+* Th [ms]: ms Legacy Features. (line 3503)
+* TOC [ms]: ms language and localization.
+ (line 3024)
+* U [ms]: Typographical symbols in ms.
+ (line 2270)
+* v [ms]: ms Legacy Features. (line 3467)
+
+Appendix H File Keyword Index
+*****************************
+
+* Menu:
+
+* #: DESC File Format. (line 13432)
+* # <1>: Font Description File Format.
+ (line 13592)
+* ---: Font Description File Format.
+ (line 13639)
+* biggestfont: DESC File Format. (line 13562)
+* charset: DESC File Format. (line 13557)
+* charset <1>: Font Description File Format.
+ (line 13631)
+* family: Selecting Fonts. (line 7352)
+* family <1>: DESC File Format. (line 13436)
+* fonts: Using Symbols. (line 7612)
+* fonts <1>: Special Fonts. (line 8104)
+* fonts <2>: DESC File Format. (line 13439)
+* hor: DESC File Format. (line 13445)
+* image_generator: DESC File Format. (line 13449)
+* kernpairs: Font Description File Format.
+ (line 13727)
+* ligatures: Font Description File Format.
+ (line 13611)
+* name: Font Description File Format.
+ (line 13596)
+* paperlength: DESC File Format. (line 13455)
+* papersize: DESC File Format. (line 13459)
+* paperwidth: DESC File Format. (line 13486)
+* pass_filenames: DESC File Format. (line 13490)
+* postpro: DESC File Format. (line 13495)
+* prepro: DESC File Format. (line 13498)
+* print: DESC File Format. (line 13502)
+* res: DESC File Format. (line 13506)
+* sizes: DESC File Format. (line 13509)
+* sizescale: DESC File Format. (line 13514)
+* slant: Font Description File Format.
+ (line 13607)
+* spacewidth: Font Description File Format.
+ (line 13601)
+* spare1: DESC File Format. (line 13562)
+* spare2: DESC File Format. (line 13562)
+* special: Artificial Fonts. (line 8230)
+* special <1>: Font Description File Format.
+ (line 13618)
+* styles: Selecting Fonts. (line 7352)
+* styles <1>: Font Families. (line 7511)
+* styles <2>: DESC File Format. (line 13518)
+* tcommand: DESC File Format. (line 13522)
+* unicode: DESC File Format. (line 13526)
+* unitwidth: DESC File Format. (line 13540)
+* unscaled_charwidths: DESC File Format. (line 13544)
+* use_charnames_in_special: Postprocessor Access.
+ (line 11760)
+* use_charnames_in_special <1>: DESC File Format. (line 13548)
+* vert: DESC File Format. (line 13553)
+
+Appendix I Program and File Index
+*********************************
+
+* Menu:
+
+* an.tmac: man. (line 1417)
+* changebar: Miscellaneous. (line 11940)
+* composite.tmac: Using Symbols. (line 7802)
+* cp1047.tmac: Input Encodings. (line 3986)
+* cs.tmac: Manipulating Hyphenation.
+ (line 6215)
+* de.tmac: Manipulating Hyphenation.
+ (line 6215)
+* DESC: Selecting Fonts. (line 7352)
+* DESC <1>: Font Families. (line 7511)
+* DESC <2>: Using Symbols. (line 7612)
+* DESC <3>: Using Symbols. (line 7820)
+* DESC <4>: Special Fonts. (line 8104)
+* diffmk: Miscellaneous. (line 11940)
+* ec.tmac: Input Encodings. (line 4027)
+* en.tmac: Manipulating Hyphenation.
+ (line 6215)
+* eqn: ms Insertions. (line 2845)
+* fr.tmac: Manipulating Hyphenation.
+ (line 6215)
+* freeeuro.pfa: Input Encodings. (line 4027)
+* gchem: Groff Options. (line 478)
+* gdiffmk: Miscellaneous. (line 11940)
+* geqn: Groff Options. (line 478)
+* ggrn: Groff Options. (line 478)
+* gpic: Groff Options. (line 478)
+* grap: Groff Options. (line 478)
+* grefer: Groff Options. (line 478)
+* groff: Groff Options. (line 478)
+* gsoelim: Groff Options. (line 478)
+* gtbl: Groff Options. (line 478)
+* gtroff: Groff Options. (line 478)
+* it.tmac: Manipulating Hyphenation.
+ (line 6215)
+* ja.tmac: Manipulating Hyphenation.
+ (line 6215)
+* latin1.tmac: Input Encodings. (line 3991)
+* latin2.tmac: Input Encodings. (line 4004)
+* latin5.tmac: Input Encodings. (line 4010)
+* latin9.tmac: Input Encodings. (line 4015)
+* makeindex: Indexing. (line 1340)
+* man.local: Optional man extensions.
+ (line 1427)
+* man.tmac: man. (line 1417)
+* man.ultrix: Optional man extensions.
+ (line 1451)
+* nrchbar: Miscellaneous. (line 11940)
+* papersize.tmac: Paper Format. (line 975)
+* perl: I/O. (line 11645)
+* pic: ms Insertions. (line 2845)
+* post-grohtml: Groff Options. (line 766)
+* pre-grohtml: Groff Options. (line 766)
+* preconv: Groff Options. (line 478)
+* refer: ms Insertions. (line 2845)
+* soelim: Debugging. (line 12103)
+* sv.tmac: Manipulating Hyphenation.
+ (line 6215)
+* tbl: ms Insertions. (line 2845)
+* trace.tmac: Writing Macros. (line 9551)
+* troffrc: Groff Options. (line 699)
+* troffrc <1>: Paper Format. (line 975)
+* troffrc <2>: Manipulating Hyphenation.
+ (line 6215)
+* troffrc <3>: Manipulating Hyphenation.
+ (line 6263)
+* troffrc <4>: troff and nroff Modes.
+ (line 6832)
+* troffrc-end: Groff Options. (line 699)
+* troffrc-end <1>: Manipulating Hyphenation.
+ (line 6263)
+* troffrc-end <2>: troff and nroff Modes.
+ (line 6832)
+* tty.tmac: troff and nroff Modes.
+ (line 6840)
+* tty.tmac <1>: Line Layout. (line 6912)
+* vtroff: Operators in Conditionals.
+ (line 9070)
+* zh.tmac: Manipulating Hyphenation.
+ (line 6215)
+
+Appendix J Concept Index
+************************
+
+* Menu:
+
+* ", as delimiter: Delimiters. (line 5060)
+* ", at end of sentence: Sentences. (line 3663)
+* ", at end of sentence <1>: Using Symbols. (line 7892)
+* ", embedding in a macro argument: Calling Macros. (line 4875)
+* %, as delimiter: Delimiters. (line 5092)
+* &, as delimiter: Delimiters. (line 5092)
+* ', as a comment: Comments. (line 5164)
+* ', as delimiter: Delimiters. (line 5060)
+* ', at end of sentence: Sentences. (line 3663)
+* ', at end of sentence <1>: Using Symbols. (line 7892)
+* (, as delimiter: Delimiters. (line 5092)
+* ), as delimiter: Delimiters. (line 5092)
+* ), at end of sentence: Sentences. (line 3663)
+* ), at end of sentence <1>: Using Symbols. (line 7892)
+* *, as delimiter: Delimiters. (line 5092)
+* *, at end of sentence: Sentences. (line 3663)
+* *, at end of sentence <1>: Using Symbols. (line 7892)
+* +, and page motion: Numeric Expressions.
+ (line 4457)
+* +, as delimiter: Delimiters. (line 5092)
+* -, and page motion: Numeric Expressions.
+ (line 4457)
+* -, as delimiter: Delimiters. (line 5092)
+* ., as delimiter: Delimiters. (line 5090)
+* .h register, difference from nl: Diversions. (line 11020)
+* .ps register, in comparison with .psr: Using Fractional Type Sizes.
+ (line 8638)
+* .s register, in comparison with .sr: Using Fractional Type Sizes.
+ (line 8638)
+* .S register, Plan 9 alias for .tabs: Tabs and Fields. (line 6593)
+* .t register, and diversions: Diversion Traps. (line 10668)
+* .tabs register, Plan 9 alias (.S): Tabs and Fields. (line 6593)
+* .V register, and vs: Changing the Vertical Spacing.
+ (line 8546)
+* /, as delimiter: Delimiters. (line 5092)
+* 8-bit input: Font Description File Format.
+ (line 13639)
+* <, as delimiter: Delimiters. (line 5092)
+* <colon>, as delimiter: Delimiters. (line 5092)
+* =, as delimiter: Delimiters. (line 5092)
+* >, as delimiter: Delimiters. (line 5092)
+* [, macro names starting with, and refer: Identifiers. (line 4623)
+* \!, and copy mode: Diversions. (line 11074)
+* \!, and output request: Diversions. (line 11106)
+* \!, and trnt: Character Translations.
+ (line 6795)
+* \!, as delimiter: Delimiters. (line 5069)
+* \!, as delimiter <1>: Delimiters. (line 5096)
+* \!, in top-level diversion: Diversions. (line 11098)
+* \!, incompatibilities with AT&T troff: Other Differences. (line 12546)
+* \!, incompatibilities with AT&T troff <1>: Other Differences.
+ (line 12636)
+* \$, when reading text for a macro: Copy Mode. (line 9699)
+* \%, and translations: Character Translations.
+ (line 6747)
+* \%, as delimiter: Delimiters. (line 5069)
+* \%, as delimiter <1>: Delimiters. (line 5096)
+* \%, following \X or \Y: Manipulating Hyphenation.
+ (line 6001)
+* \%, in \X: Postprocessor Access.
+ (line 11746)
+* \%, incompatibilities with AT&T troff: Other Differences. (line 12546)
+* \&, and glyph definitions: Using Symbols. (line 7948)
+* \&, and translations: Character Translations.
+ (line 6758)
+* \&, as delimiter: Delimiters. (line 5069)
+* \&, at end of sentence: Sentences. (line 3647)
+* \&, in \X: Postprocessor Access.
+ (line 11746)
+* \&, incompatibilities with AT&T troff: Other Differences. (line 12546)
+* \', and translations: Character Translations.
+ (line 6741)
+* \', as delimiter: Delimiters. (line 5069)
+* \', as delimiter <1>: Delimiters. (line 5096)
+* \', incompatibilities with AT&T troff: Other Differences. (line 12546)
+* \(, and translations: Character Translations.
+ (line 6741)
+* \), as delimiter: Delimiters. (line 5069)
+* \), in \X: Postprocessor Access.
+ (line 11746)
+* \*, and warnings: Warnings. (line 12301)
+* \*, incompatibilities with AT&T troff: Compatibility Mode.
+ (line 12404)
+* \*, when reading text for a macro: Copy Mode. (line 9699)
+* \, disabling (eo): Using Escape Sequences.
+ (line 5007)
+* \, embedding in a macro argument: Calling Macros. (line 4875)
+* \,, as delimiter: Delimiters. (line 5069)
+* \- glyph, and cflags: Using Symbols. (line 7875)
+* \-, and translations: Character Translations.
+ (line 6741)
+* \-, as delimiter: Delimiters. (line 5069)
+* \-, as delimiter <1>: Delimiters. (line 5096)
+* \-, incompatibilities with AT&T troff: Other Differences. (line 12546)
+* \/, as delimiter: Delimiters. (line 5069)
+* \/, as delimiter <1>: Delimiters. (line 5096)
+* \0, as delimiter: Delimiters. (line 5069)
+* \:, as delimiter: Delimiters. (line 5069)
+* \:, as delimiter <1>: Delimiters. (line 5096)
+* \<colon>, in \X: Postprocessor Access.
+ (line 11746)
+* \?, and copy mode: Operators in Conditionals.
+ (line 9116)
+* \?, and copy mode <1>: Diversions. (line 11074)
+* \?, as delimiter: Delimiters. (line 5069)
+* \?, in top-level diversion: Diversions. (line 11103)
+* \?, incompatibilities with AT&T troff: Other Differences. (line 12636)
+* \a, and copy mode: Leaders. (line 6658)
+* \a, and translations: Character Translations.
+ (line 6751)
+* \a, as delimiter: Delimiters. (line 5069)
+* \A, delimiters allowed by: Delimiters. (line 5076)
+* \A, incompatibilities with AT&T troff: Other Differences. (line 12546)
+* \b, delimiters allowed by: Delimiters. (line 5076)
+* \b, limitations of: Drawing Geometric Objects.
+ (line 10316)
+* \C, and translations: Character Translations.
+ (line 6741)
+* \c, as delimiter: Delimiters. (line 5069)
+* \c, as delimiter <1>: Delimiters. (line 5096)
+* \c, incompatibilities with AT&T troff: Other Differences. (line 12546)
+* \c, when filling disabled: Line Continuation. (line 7062)
+* \c, when filling enabled: Line Continuation. (line 7054)
+* \d, as delimiter: Delimiters. (line 5069)
+* \D, delimiters allowed by: Delimiters. (line 5087)
+* \e, and glyph definitions: Using Symbols. (line 7948)
+* \e, and translations: Character Translations.
+ (line 6745)
+* \e, as delimiter: Delimiters. (line 5069)
+* \E, as delimiter: Delimiters. (line 5069)
+* \e, as delimiter <1>: Delimiters. (line 5096)
+* \e, incompatibilities with AT&T troff: Other Differences. (line 12636)
+* \F, and changing fonts: Selecting Fonts. (line 7352)
+* \f, and font translations: Selecting Fonts. (line 7406)
+* \f, incompatibilities with AT&T troff: Compatibility Mode.
+ (line 12506)
+* \h, delimiters allowed by: Delimiters. (line 5087)
+* \H, delimiters allowed by: Delimiters. (line 5087)
+* \H, incompatibilities with AT&T troff: Compatibility Mode.
+ (line 12506)
+* \H, using + and - with: Numeric Expressions.
+ (line 4463)
+* \H, with fractional type sizes: Using Fractional Type Sizes.
+ (line 8604)
+* \l, and glyph definitions: Using Symbols. (line 7948)
+* \L, and glyph definitions: Using Symbols. (line 7948)
+* \l, delimiters allowed by: Delimiters. (line 5087)
+* \L, delimiters allowed by: Delimiters. (line 5087)
+* \N, and translations: Character Translations.
+ (line 6741)
+* \n, and warnings: Warnings. (line 12313)
+* \N, delimiters allowed by: Delimiters. (line 5087)
+* \n, incompatibilities with AT&T troff: Compatibility Mode.
+ (line 12404)
+* \n, when reading text for a macro: Copy Mode. (line 9699)
+* \o, delimiters allowed by: Delimiters. (line 5076)
+* \p, as delimiter: Delimiters. (line 5069)
+* \p, as delimiter <1>: Delimiters. (line 5096)
+* \R, after \c: Line Continuation. (line 7048)
+* \R, and warnings: Warnings. (line 12313)
+* \r, as delimiter: Delimiters. (line 5069)
+* \R, delimiters allowed by: Delimiters. (line 5087)
+* \R, difference from nr: Auto-increment. (line 5372)
+* \R, using + and - with: Numeric Expressions.
+ (line 4463)
+* \<RET>, when reading text for a macro: Copy Mode. (line 9699)
+* \s, delimiters allowed by: Delimiters. (line 5087)
+* \S, delimiters allowed by: Delimiters. (line 5087)
+* \s, incompatibilities with AT&T troff: Compatibility Mode.
+ (line 12506)
+* \S, incompatibilities with AT&T troff: Compatibility Mode.
+ (line 12506)
+* \s, incompatibilities with AT&T troff <1>: Compatibility Mode.
+ (line 12519)
+* \s, using + and - with: Numeric Expressions.
+ (line 4463)
+* \s, with fractional type sizes: Using Fractional Type Sizes.
+ (line 8604)
+* \<SP>, as delimiter: Delimiters. (line 5069)
+* \<SP>, difference from \~: Calling Macros. (line 4867)
+* \<SP>, incompatibilities with AT&T troff: Other Differences.
+ (line 12546)
+* \t, and copy mode: Tabs and Fields. (line 6485)
+* \t, and translations: Character Translations.
+ (line 6751)
+* \t, and warnings: Warnings. (line 12319)
+* \t, as delimiter: Delimiters. (line 5069)
+* \u, as delimiter: Delimiters. (line 5069)
+* \V, and copy mode: I/O. (line 11721)
+* \v, delimiters allowed by: Delimiters. (line 5087)
+* \v, internal representation: Gtroff Internals. (line 12017)
+* \w, delimiters allowed by: Delimiters. (line 5076)
+* \X, and special characters: Postprocessor Access.
+ (line 11760)
+* \X, delimiters allowed by: Delimiters. (line 5076)
+* \x, delimiters allowed by: Delimiters. (line 5087)
+* \X, followed by \%: Manipulating Hyphenation.
+ (line 6001)
+* \Y, followed by \%: Manipulating Hyphenation.
+ (line 6001)
+* \Z, delimiters allowed by: Delimiters. (line 5076)
+* \[, and translations: Character Translations.
+ (line 6741)
+* \\, when reading text for a macro: Copy Mode. (line 9738)
+* \^, as delimiter: Delimiters. (line 5069)
+* \^, incompatibilities with AT&T troff: Other Differences. (line 12546)
+* \_, and translations: Character Translations.
+ (line 6741)
+* \_, as delimiter: Delimiters. (line 5069)
+* \_, as delimiter <1>: Delimiters. (line 5096)
+* \_, incompatibilities with AT&T troff: Other Differences. (line 12546)
+* \`, and translations: Character Translations.
+ (line 6741)
+* \`, as delimiter: Delimiters. (line 5069)
+* \`, as delimiter <1>: Delimiters. (line 5096)
+* \`, incompatibilities with AT&T troff: Other Differences. (line 12546)
+* \{, as delimiter: Delimiters. (line 5069)
+* \{, as delimiter <1>: Delimiters. (line 5096)
+* \{, incompatibilities with AT&T troff: Other Differences. (line 12546)
+* \|, as delimiter: Delimiters. (line 5069)
+* \|, incompatibilities with AT&T troff: Other Differences. (line 12546)
+* \}, and warnings: Warnings. (line 12324)
+* \}, as delimiter: Delimiters. (line 5069)
+* \}, as delimiter <1>: Delimiters. (line 5096)
+* \}, incompatibilities with AT&T troff: Other Differences. (line 12546)
+* \~, and translations: Character Translations.
+ (line 6747)
+* \~, as delimiter: Delimiters. (line 5069)
+* \~, difference from \<SP>: Calling Macros. (line 4867)
+* \~, incompatibilities with AT&T troff: Other Differences. (line 12539)
+* ], as part of an identifier: Identifiers. (line 4616)
+* ], at end of sentence: Sentences. (line 3663)
+* ], at end of sentence <1>: Using Symbols. (line 7892)
+* ], macro names starting with, and refer: Identifiers. (line 4623)
+* |, and page motion: Numeric Expressions.
+ (line 4471)
+* ab request, incompatibilities with AT&T troff: Other Differences.
+ (line 12592)
+* aborting (ab): Debugging. (line 12127)
+* absolute (sic) position operator (|): Numeric Expressions.
+ (line 4471)
+* abstract font style: Using Fonts. (line 7302)
+* abstract font style, setting up (sty): Font Families. (line 7505)
+* accent marks [ms]: ms Legacy Features.
+ (line 3405)
+* access to postprocessor: Postprocessor Access.
+ (line 11729)
+* accessing unnamed glyphs with \N: Font Description File Format.
+ (line 13639)
+* activating kerning (kern): Ligatures and Kerning.
+ (line 8289)
+* activating ligatures (lg): Ligatures and Kerning.
+ (line 8271)
+* activating track kerning (tkf): Ligatures and Kerning.
+ (line 8307)
+* ad request, and hyphenation margin: Manipulating Hyphenation.
+ (line 6290)
+* ad request, and hyphenation space: Manipulating Hyphenation.
+ (line 6305)
+* addition: Numeric Expressions.
+ (line 4359)
+* additional inter-sentence space: Manipulating Filling and Adjustment.
+ (line 5893)
+* adjustment and filling, manipulating: Manipulating Filling and Adjustment.
+ (line 5624)
+* adjustment mode register (.j): Manipulating Filling and Adjustment.
+ (line 5731)
+* adjustment to both margins, difference from AT&T troff: Other Differences.
+ (line 12552)
+* Adobe Glyph List (AGL): Using Symbols. (line 7688)
+* alias, diversion, creating (als): Strings. (line 8972)
+* alias, diversion, removing (rm): Strings. (line 9007)
+* alias, macro, creating (als): Strings. (line 8972)
+* alias, macro, removing (rm): Strings. (line 9007)
+* alias, register, creating (aln): Setting Registers. (line 5323)
+* alias, register, removing (rr): Setting Registers. (line 5329)
+* alias, string, creating (als): Strings. (line 8972)
+* alias, string, removing (rm): Strings. (line 9007)
+* aliasing fonts with third argument to fp request: Font Positions.
+ (line 7561)
+* als request, and \$0: Parameters. (line 9657)
+* am, am1, ami requests, and warnings: Warnings. (line 12301)
+* appending to a diversion (da, boxa): Diversions. (line 10944)
+* appending to a file (opena): I/O. (line 11671)
+* appending to a macro (am): Writing Macros. (line 9533)
+* appending to a string (as): Strings. (line 8889)
+* approximation output register (.A): Built-in Registers.
+ (line 5527)
+* arc, drawing (\D'a ...'): Drawing Geometric Objects.
+ (line 10225)
+* argument: Requests and Macros.
+ (line 3829)
+* arguments to macros: Calling Macros. (line 4851)
+* arguments to macros, and tabs: Invoking Requests. (line 4789)
+* arguments to requests: Invoking Requests. (line 4789)
+* arguments to requests, and tabs: Invoking Requests. (line 4789)
+* arguments, and compatibility mode: Gtroff Internals. (line 12054)
+* arguments, to escape sequences, delimiting: Delimiters. (line 5060)
+* arguments, to strings: Strings. (line 8802)
+* arithmetic operators: Numeric Expressions.
+ (line 4359)
+* artificial fonts: Artificial Fonts. (line 8122)
+* as, as1 requests, and comments: Comments. (line 5139)
+* as, as1 requests, and warnings: Warnings. (line 12301)
+* ASCII output encoding: Groff Options. (line 743)
+* asciify request, and writem: I/O. (line 11694)
+* assertion (arithmetic operator): Numeric Expressions.
+ (line 4365)
+* assign number format to register (af): Assigning Register Formats.
+ (line 5413)
+* assignments, indirect: Interpolating Registers.
+ (line 5340)
+* assignments, nested: Interpolating Registers.
+ (line 5340)
+* AT&T ms, macro package differences: Differences from AT&T ms.
+ (line 3276)
+* attributes, character cell: Using Fonts. (line 7323)
+* auto-incrementation of a register: Auto-increment. (line 5364)
+* automatic font mounting: Selecting Fonts. (line 7365)
+* automatic hyphenation: Manipulating Hyphenation.
+ (line 5941)
+* automatic hyphenation parameters: Manipulating Hyphenation.
+ (line 6042)
+* auxiliary macro package: Major Macro Packages.
+ (line 1408)
+* available glyphs, list of (groff_char(7) man page): Using Symbols.
+ (line 7675)
+* background: Background. (line 229)
+* background color name register (.M): Colors. (line 8765)
+* backslash glyph, formatting (\[rs]): Using Escape Sequences.
+ (line 5002)
+* backslash, embedding in a macro argument: Calling Macros. (line 4875)
+* backslash, printing (\\, \e, \E, \[rs]): Other Differences.
+ (line 12636)
+* backspace character, and translations: Character Translations.
+ (line 6751)
+* backtrace of input stack (backtrace): Debugging. (line 12176)
+* baseline rule special character(\[ru]): Drawing Geometric Objects.
+ (line 10146)
+* baseline, text: Page Geometry. (line 4184)
+* baseline, text <1>: Manipulating Type Size and Vertical Spacing.
+ (line 8438)
+* basic scaling unit (u): Measurements. (line 4245)
+* basic units: Page Geometry. (line 4169)
+* basic units, conversion to: Measurements. (line 4239)
+* basics of macro package usage: Basics. (line 1058)
+* bd request, and font styles: Font Families. (line 7505)
+* bd request, and font translations: Selecting Fonts. (line 7406)
+* bd request, incompatibilities with AT&T troff: Other Differences.
+ (line 12609)
+* beginning diversion (di, box): Diversions. (line 10944)
+* beginning of conditional block (\{): Conditional Blocks.
+ (line 9250)
+* blank line: Breaking. (line 3749)
+* blank line macro (blm): Breaking. (line 3749)
+* blank line macro (blm) <1>: Invoking Requests. (line 4820)
+* blank line macro (blm) <2>: Blank Line Traps. (line 10779)
+* blank line trap (blm): Invoking Requests. (line 4820)
+* blank line traps: Blank Line Traps. (line 10778)
+* blank lines, disabling: Manipulating Spacing.
+ (line 6456)
+* block, conditional, beginning (\{): Conditional Blocks.
+ (line 9250)
+* block, conditional, end (\}): Conditional Blocks.
+ (line 9250)
+* blocks, conditional: Conditional Blocks.
+ (line 9243)
+* body, of a while request: while. (line 9330)
+* boldface, imitating (bd): Artificial Fonts. (line 8213)
+* bottom margin: Page Location Traps.
+ (line 10440)
+* boundary-relative motion operator (|): Numeric Expressions.
+ (line 4471)
+* bounding box: Miscellaneous. (line 11949)
+* box (diversion operation): Diversions. (line 10971)
+* box request, and warnings: Warnings. (line 12296)
+* box rule glyph (\[br]): Drawing Geometric Objects.
+ (line 10168)
+* box, boxa requests, and warnings: Warnings. (line 12301)
+* boxa request, and dn (dl): Diversions. (line 11026)
+* boxa request, and warnings: Warnings. (line 12296)
+* boxes [ms]: ms keeps and displays.
+ (line 2771)
+* bp request, and top-level diversion: Page Control. (line 7183)
+* bp request, and traps (.pe): Page Location Traps.
+ (line 10598)
+* bp request, causing implicit break: Manipulating Filling and Adjustment.
+ (line 5624)
+* bp request, incompatibilities with AT&T troff: Other Differences.
+ (line 12596)
+* bp request, using + and - with: Numeric Expressions.
+ (line 4463)
+* br glyph, and cflags: Using Symbols. (line 7887)
+* brace escape sequence, closing (\}): Conditional Blocks.
+ (line 9250)
+* brace escape sequence, opening (\}): Conditional Blocks.
+ (line 9250)
+* brace escape sequences (\{, \}): Conditional Blocks.
+ (line 9250)
+* break: Breaking. (line 3725)
+* break <1>: Manipulating Filling and Adjustment.
+ (line 5624)
+* break (introduction): Basics. (line 1188)
+* break request, in a while loop: while. (line 9393)
+* break, page: Page Geometry. (line 4208)
+* break, page <1>: Page Control. (line 7170)
+* break, page <2>: The Implicit Page Trap.
+ (line 10638)
+* break, page (introduction): Basics. (line 1185)
+* break, page, final: End-of-input Traps.
+ (line 10834)
+* break, page, prevented by vpt: Vertical Position Traps.
+ (line 10414)
+* breaking file names (\:): Manipulating Hyphenation.
+ (line 6008)
+* breaking URLs (\:): Manipulating Hyphenation.
+ (line 6008)
+* breaking without hyphens (\:): Manipulating Hyphenation.
+ (line 6008)
+* built-in register, removing: Built-in Registers.
+ (line 5513)
+* built-in registers: Built-in Registers.
+ (line 5508)
+* bulleted list, example markup [ms]: Lists in ms. (line 2590)
+* c scaling unit: Measurements. (line 4252)
+* calling a macro: Requests and Macros.
+ (line 3840)
+* calling macros: Calling Macros. (line 4851)
+* capabilities of groff: groff Capabilities.
+ (line 281)
+* case-transforming a string (stringdown, stringup): Strings.
+ (line 8945)
+* categories, warning: Warnings. (line 12250)
+* CCSID 1047 output encoding (EBCDIC): Groff Options. (line 755)
+* ce request, causing implicit break: Manipulating Filling and Adjustment.
+ (line 5624)
+* ce request, difference from .ad c: Manipulating Filling and Adjustment.
+ (line 5836)
+* cell, character, attributes: Using Fonts. (line 7323)
+* centered text (filled): Manipulating Filling and Adjustment.
+ (line 5716)
+* centered text (unfilled): Manipulating Filling and Adjustment.
+ (line 5827)
+* centering lines (ce): Manipulating Filling and Adjustment.
+ (line 5827)
+* centering lines (introduction): Basics. (line 1170)
+* centimeter scaling unit (c): Measurements. (line 4252)
+* cf request, and copy mode: I/O. (line 11521)
+* cf request, causing implicit break: Manipulating Filling and Adjustment.
+ (line 5624)
+* changing control characters: Control Characters.
+ (line 4726)
+* changing font family (fam, \F): Font Families. (line 7467)
+* changing fonts (ft, \f): Selecting Fonts. (line 7352)
+* changing format, and read-only registers: Assigning Register Formats.
+ (line 5472)
+* changing the font height (\H): Artificial Fonts. (line 8132)
+* changing the font slant (\S): Artificial Fonts. (line 8161)
+* changing the page number character (pc): Page Layout. (line 7149)
+* changing trap location (ch): Page Location Traps.
+ (line 10528)
+* changing type sizes (ps, \s): Changing the Type Size.
+ (line 8466)
+* changing vertical line spacing (vs): Changing the Vertical Spacing.
+ (line 8543)
+* char request, and soft hyphen character: Manipulating Hyphenation.
+ (line 6032)
+* char request, and translations: Character Translations.
+ (line 6741)
+* char request, used with \N: Using Symbols. (line 7810)
+* character: Using Symbols. (line 7600)
+* character cell attributes: Using Fonts. (line 7323)
+* character class (class): Character Classes. (line 8034)
+* character classes: Character Classes. (line 8028)
+* character properties (cflags): Using Symbols. (line 7846)
+* character translations: Character Translations.
+ (line 6722)
+* character, backspace, and translations: Character Translations.
+ (line 6751)
+* character, control (.): Requests and Macros.
+ (line 3813)
+* character, control, changing (cc): Control Characters.
+ (line 4738)
+* character, defining (char): Using Symbols. (line 7948)
+* character, defining fallback (fchar, fschar, schar): Using Symbols.
+ (line 7948)
+* character, distinguished from glyph: Using Symbols. (line 7600)
+* character, dummy (\&): Dummy Characters. (line 8357)
+* character, dummy (\&), as control character suppressor: Requests and Macros.
+ (line 3820)
+* character, dummy (\&), effect on kerning: Ligatures and Kerning.
+ (line 8294)
+* character, dummy (\&), effect on \l escape sequence: Drawing Geometric Objects.
+ (line 10150)
+* character, escape, changing (ec): Using Escape Sequences.
+ (line 5012)
+* character, escape, while defining glyph: Using Symbols. (line 7948)
+* character, field delimiting (fc): Fields. (line 6692)
+* character, field padding (fc): Fields. (line 6692)
+* character, horizontal tab: Tabs and Leaders. (line 3785)
+* character, hyphenation (\%): Manipulating Hyphenation.
+ (line 5992)
+* character, leader: Tabs and Leaders. (line 3785)
+* character, leader repetition (lc): Leaders. (line 6661)
+* character, leader, and translations: Character Translations.
+ (line 6751)
+* character, leader, non-interpreted (\a): Leaders. (line 6658)
+* character, named (\C): Using Symbols. (line 7793)
+* character, newline, and translations: Character Translations.
+ (line 6751)
+* character, no-break control ('): Requests and Macros.
+ (line 3813)
+* character, no-break control, changing (c2): Control Characters.
+ (line 4738)
+* character, ordinary: Identifiers. (line 4577)
+* character, soft hyphen, setting (shc): Manipulating Hyphenation.
+ (line 6032)
+* character, special: Character Translations.
+ (line 6741)
+* character, tab repetition (tc): Tabs and Fields. (line 6602)
+* character, tab, and translations: Character Translations.
+ (line 6751)
+* character, tab, non-interpreted (\t): Tabs and Fields. (line 6485)
+* character, transparent: Using Symbols. (line 7892)
+* character, transparent dummy (\)): Dummy Characters. (line 8407)
+* characters, end-of-sentence: Using Symbols. (line 7863)
+* characters, end-of-sentence transparent: Sentences. (line 3663)
+* characters, hyphenation: Using Symbols. (line 7868)
+* characters, input, and output glyphs, compatibility with AT&T troff: Other Differences.
+ (line 12609)
+* characters, invalid for trf request: I/O. (line 11533)
+* characters, invalid input: Identifiers. (line 4581)
+* characters, overlapping: Using Symbols. (line 7882)
+* characters, special: Sentences. (line 3663)
+* characters, special, list of (groff_char(7) man page): Using Symbols.
+ (line 7675)
+* characters, unnamed, accessing with \N: Font Description File Format.
+ (line 13639)
+* circle, filled, drawing (\D'C ...'): Drawing Geometric Objects.
+ (line 10234)
+* circle, outlined, drawing (\D'c ...'): Drawing Geometric Objects.
+ (line 10230)
+* circle, solid, drawing (\D'C ...'): Drawing Geometric Objects.
+ (line 10234)
+* circle, stroked, drawing (\D'c ...'): Drawing Geometric Objects.
+ (line 10230)
+* class of characters (class): Character Classes. (line 8034)
+* classes, character: Character Classes. (line 8028)
+* clearing input line trap (it, itc): Input Line Traps. (line 10680)
+* closing brace escape sequence (\}): Conditional Blocks.
+ (line 9250)
+* closing file (close): I/O. (line 11703)
+* code page 1047 output encoding: Groff Options. (line 755)
+* code page 1047, input encoding: Input Encodings. (line 3986)
+* code, hyphenation (hcode): Manipulating Hyphenation.
+ (line 6228)
+* color name, background, register (.M): Colors. (line 8765)
+* color name, fill, register (.M): Colors. (line 8765)
+* color name, stroke, register (.m): Colors. (line 8744)
+* color, default: Colors. (line 8720)
+* color, fill: Colors. (line 8678)
+* color, stroke: Colors. (line 8678)
+* colors: Colors. (line 8678)
+* command prefix: Environment. (line 835)
+* command-line options: Groff Options. (line 520)
+* comments: Comments. (line 5132)
+* comments in device description files: DESC File Format. (line 13432)
+* comments in font description files: Font Description File Format.
+ (line 13592)
+* comments, lining up with tabs: Comments. (line 5145)
+* comments, with ds: Strings. (line 8823)
+* common features: Common Features. (line 1201)
+* common name space of macros, diversions, and strings: Identifiers.
+ (line 4668)
+* comparison of strings: Operators in Conditionals.
+ (line 9108)
+* comparison operators: Numeric Expressions.
+ (line 4416)
+* compatibility mode: Warnings. (line 12341)
+* compatibility mode <1>: Compatibility Mode.
+ (line 12404)
+* compatibility mode, and parameters: Gtroff Internals. (line 12054)
+* complementation, logical: Numeric Expressions.
+ (line 4426)
+* composite glyph names: Using Symbols. (line 7688)
+* conditional block, beginning (\{): Conditional Blocks.
+ (line 9250)
+* conditional block, end (\}): Conditional Blocks.
+ (line 9250)
+* conditional blocks: Conditional Blocks.
+ (line 9243)
+* conditional expressions: Operators in Conditionals.
+ (line 9027)
+* conditional output for terminal (TTY): Operators in Conditionals.
+ (line 9053)
+* conditional page break (ne): Page Control. (line 7195)
+* conditionals and loops: Conditionals and Loops.
+ (line 9020)
+* configuring control characters: Control Characters.
+ (line 4726)
+* configuring the page length (pl): Page Layout. (line 7093)
+* consecutive hyphenated lines (hlm): Manipulating Hyphenation.
+ (line 6277)
+* constant glyph space mode (cs): Artificial Fonts. (line 8241)
+* contents, table of: Table of Contents. (line 1323)
+* contents, table of <1>: Leaders. (line 6671)
+* continuation, input line (\<RET>): Line Continuation. (line 7019)
+* continuation, output line (\c): Line Continuation. (line 7048)
+* continue request, in a while loop: while. (line 9393)
+* continued output line register (.int): Line Continuation. (line 7073)
+* continuous underlining (cu): Artificial Fonts. (line 8202)
+* control character (.): Requests and Macros.
+ (line 3813)
+* control character, changing (cc): Control Characters.
+ (line 4738)
+* control character, no-break ('): Requests and Macros.
+ (line 3813)
+* control character, no-break, changing (c2): Control Characters.
+ (line 4738)
+* control characters: Control Characters.
+ (line 4726)
+* control line: Requests and Macros.
+ (line 3825)
+* control, line: Line Continuation. (line 7014)
+* control, page: Page Control. (line 7170)
+* conventions for input: Input Conventions. (line 4051)
+* conversion to basic units: Measurements. (line 4239)
+* copy mode: Copy Mode. (line 9699)
+* copy mode <1>: Copy Mode. (line 9699)
+* copy mode, and cf request: I/O. (line 11521)
+* copy mode, and device request: Postprocessor Access.
+ (line 11744)
+* copy mode, and length request: Strings. (line 8909)
+* copy mode, and macro parameters: Parameters. (line 9616)
+* copy mode, and output request: Diversions. (line 11106)
+* copy mode, and trf request: I/O. (line 11521)
+* copy mode, and write request: I/O. (line 11683)
+* copy mode, and writec request: I/O. (line 11683)
+* copy mode, and writem request: I/O. (line 11697)
+* copy mode, and \!: Diversions. (line 11074)
+* copy mode, and \?: Operators in Conditionals.
+ (line 9116)
+* copy mode, and \? <1>: Diversions. (line 11074)
+* copy mode, and \a: Leaders. (line 6658)
+* copy mode, and \t: Tabs and Fields. (line 6485)
+* copy mode, and \V: I/O. (line 11721)
+* copying environment (evc): Environments. (line 11362)
+* correction between oblique and upright glyph (\/, \,): Italic Corrections.
+ (line 8328)
+* correction between upright and oblique glyph (\/, \,): Italic Corrections.
+ (line 8338)
+* correction, italic (\/): Italic Corrections.
+ (line 8328)
+* correction, left italic (\,): Italic Corrections.
+ (line 8338)
+* cover page in [ms], example markup: ms Document Description Macros.
+ (line 2196)
+* cp request, and glyph definitions: Using Symbols. (line 7948)
+* cq glyph, at end of sentence: Sentences. (line 3663)
+* cq glyph, at end of sentence <1>: Using Symbols. (line 7892)
+* creating alias for register (aln): Setting Registers. (line 5323)
+* creating alias, for diversion (als): Strings. (line 8972)
+* creating alias, for macro (als): Strings. (line 8972)
+* creating alias, for string (als): Strings. (line 8972)
+* creating new characters (char): Using Symbols. (line 7948)
+* credits: Credits. (line 444)
+* cs request, and font styles: Font Families. (line 7505)
+* cs request, and font translations: Selecting Fonts. (line 7406)
+* cs request, incompatibilities with AT&T troff: Other Differences.
+ (line 12609)
+* cs request, with fractional type sizes: Using Fractional Type Sizes.
+ (line 8604)
+* CSTR #54 errata: Built-in Registers.
+ (line 5600)
+* CSTR #54 errata <1>: Line Layout. (line 6920)
+* CSTR #54 errata <2>: Page Control. (line 7185)
+* CSTR #54 errata <3>: Artificial Fonts. (line 8176)
+* CSTR #54 errata <4>: Changing the Type Size.
+ (line 8475)
+* CSTR #54 errata <5>: Page Motions. (line 10040)
+* CSTR #54 erratum, bp request: Page Control. (line 7185)
+* CSTR #54 erratum, po request: Line Layout. (line 6920)
+* CSTR #54 erratum, ps request: Changing the Type Size.
+ (line 8475)
+* CSTR #54 erratum, sb register: Page Motions. (line 10040)
+* CSTR #54 erratum, st register: Page Motions. (line 10040)
+* CSTR #54 erratum, yr register: Built-in Registers.
+ (line 5600)
+* CSTR #54 erratum, \S escape: Artificial Fonts. (line 8176)
+* CSTR #54 erratum, \s escape sequence: Changing the Type Size.
+ (line 8475)
+* current directory: Macro Directories. (line 910)
+* current input file name register (.F): Built-in Registers.
+ (line 5536)
+* current page number (%): Page Control. (line 7188)
+* current time, hours (hours): Built-in Registers.
+ (line 5586)
+* current time, minutes (minutes): Built-in Registers.
+ (line 5583)
+* current time, seconds (seconds): Built-in Registers.
+ (line 5580)
+* da request, and dn (dl): Diversions. (line 11026)
+* da request, and warnings: Warnings. (line 12296)
+* da request, and warnings <1>: Warnings. (line 12301)
+* date, day of the month register (dy): Built-in Registers.
+ (line 5592)
+* date, day of the week register (dw): Built-in Registers.
+ (line 5589)
+* date, month of the year register (mo): Built-in Registers.
+ (line 5595)
+* date, year register (year, yr): Built-in Registers.
+ (line 5598)
+* day of the month register (dy): Built-in Registers.
+ (line 5592)
+* day of the week register (dw): Built-in Registers.
+ (line 5589)
+* dd glyph, at end of sentence: Sentences. (line 3663)
+* dd glyph, at end of sentence <1>: Using Symbols. (line 7892)
+* de request, and while: while. (line 9343)
+* de, de1, dei requests, and warnings: Warnings. (line 12301)
+* debugging: Debugging. (line 12078)
+* debugging page location traps: Page Location Traps.
+ (line 10476)
+* decimal point, as delimiter: Delimiters. (line 5090)
+* decrementation, automatic, of a register: Auto-increment. (line 5364)
+* default color: Colors. (line 8720)
+* default tab stops: Tabs and Fields. (line 6493)
+* default units: Default Units. (line 4318)
+* deferred output: Deferring Output. (line 10337)
+* defining character (char): Using Symbols. (line 7948)
+* defining character class (class): Character Classes. (line 8034)
+* defining fallback character (fchar, fschar, schar): Using Symbols.
+ (line 7948)
+* defining glyph (char): Using Symbols. (line 7948)
+* defining symbol (char): Using Symbols. (line 7948)
+* delimited arguments, incompatibilities with AT&T troff: Compatibility Mode.
+ (line 12498)
+* delimiters, for escape sequence arguments: Delimiters. (line 5060)
+* delimiting character, for fields (fc): Fields. (line 6692)
+* delimiting escape sequence arguments: Delimiters. (line 5060)
+* depth, interpolation: Calling Macros. (line 4929)
+* depth, of last glyph (.cdp): Environments. (line 11388)
+* DESC file format: DESC File Format. (line 13425)
+* DESC file, and font mounting: Font Positions. (line 7590)
+* DESC file, and use_charnames_in_special keyword: Postprocessor Access.
+ (line 11760)
+* description file, font: Using Fonts. (line 7295)
+* device description files, comments: DESC File Format. (line 13432)
+* device request, and copy mode: Postprocessor Access.
+ (line 11744)
+* device resolution: Page Geometry. (line 4169)
+* device resolution <1>: DESC File Format. (line 13506)
+* device resolution, obtaining in the formatter: Measurements.
+ (line 4240)
+* devices for output: Output Device Intro.
+ (line 359)
+* dg glyph, at end of sentence: Sentences. (line 3663)
+* dg glyph, at end of sentence <1>: Using Symbols. (line 7892)
+* di request, and warnings: Warnings. (line 12296)
+* di request, and warnings <1>: Warnings. (line 12301)
+* differences in implementation: Implementation Differences.
+ (line 12388)
+* digit-width space (\0): Page Motions. (line 10014)
+* digits, as delimiters: Delimiters. (line 5090)
+* dimensions, line: Line Layout. (line 6855)
+* directories for fonts: Font Directories. (line 934)
+* directories for macros: Macro Directories. (line 898)
+* directory, current: Macro Directories. (line 910)
+* directory, for tmac files: Macro Directories. (line 900)
+* directory, home: Macro Directories. (line 913)
+* directory, platform-specific: Macro Directories. (line 915)
+* directory, site-local: Macro Directories. (line 915)
+* directory, site-local <1>: Font Directories. (line 957)
+* disabling hyphenation (\%): Manipulating Hyphenation.
+ (line 5992)
+* disabling \ (eo): Using Escape Sequences.
+ (line 5007)
+* discardable horizontal space: Manipulating Filling and Adjustment.
+ (line 5914)
+* displays: Displays and Keeps.
+ (line 1290)
+* displays [ms]: ms keeps and displays.
+ (line 2797)
+* displays, and footnotes [ms]: ms Footnotes. (line 2958)
+* distance to next vertical position trap register (.t): Page Location Traps.
+ (line 10520)
+* diversion: Deferring Output. (line 10337)
+* diversion name register (.z): Diversions. (line 11000)
+* diversion trap, setting (dt): Diversion Traps. (line 10668)
+* diversion traps: Diversion Traps. (line 10663)
+* diversion, appending to (da, boxa): Diversions. (line 10944)
+* diversion, beginning (di, box): Diversions. (line 10944)
+* diversion, creating alias for (als): Strings. (line 8972)
+* diversion, ending (di, box): Diversions. (line 10944)
+* diversion, nested: Diversions. (line 11000)
+* diversion, removing (rm): Strings. (line 8967)
+* diversion, removing alias for (rm): Strings. (line 9007)
+* diversion, renaming (rn): Strings. (line 8964)
+* diversion, stripping final newline: Punning Names. (line 11246)
+* diversion, top-level: Diversions. (line 10930)
+* diversion, top-level, and bp: Page Control. (line 7183)
+* diversion, top-level, and \!: Diversions. (line 11098)
+* diversion, top-level, and \?: Diversions. (line 11103)
+* diversion, unformatting (asciify): Diversions. (line 11120)
+* diversion, vertical position in, register (.d): Diversions.
+ (line 11000)
+* diversions: Diversions. (line 10918)
+* diversions <1>: Punning Names. (line 11157)
+* diversions, and traps: Page Location Traps.
+ (line 10618)
+* diversions, shared name space with macros and strings: Identifiers.
+ (line 4668)
+* division, truncating: Numeric Expressions.
+ (line 4359)
+* dl register, and da (boxa): Diversions. (line 11026)
+* dn register, and da (boxa): Diversions. (line 11026)
+* document description macros, [ms]: ms Document Description Macros.
+ (line 2132)
+* document formats: Document Formats. (line 1349)
+* documents, multi-file: Debugging. (line 12103)
+* documents, structuring the source of: Invoking Requests. (line 4803)
+* dot, as delimiter: Delimiters. (line 5090)
+* double quote, embedding in a macro argument: Calling Macros.
+ (line 4875)
+* double quotes, trailing, in strings: Strings. (line 8844)
+* double-spacing (ls): Manipulating Spacing.
+ (line 6396)
+* double-spacing (vs, pvs): Changing the Vertical Spacing.
+ (line 8575)
+* down-casing a string (stringdown): Strings. (line 8945)
+* drawing a filled circle (\D'C ...'): Drawing Geometric Objects.
+ (line 10234)
+* drawing a filled ellipse (\D'E ...'): Drawing Geometric Objects.
+ (line 10241)
+* drawing a filled polygon (\D'P ...'): Drawing Geometric Objects.
+ (line 10275)
+* drawing a line (\D'l ...'): Drawing Geometric Objects.
+ (line 10244)
+* drawing a solid circle (\D'C ...'): Drawing Geometric Objects.
+ (line 10234)
+* drawing a solid ellipse (\D'E ...'): Drawing Geometric Objects.
+ (line 10241)
+* drawing a solid polygon (\D'P ...'): Drawing Geometric Objects.
+ (line 10275)
+* drawing a spline (\D'~ ...'): Drawing Geometric Objects.
+ (line 10221)
+* drawing a stroked circle (\D'c ...'): Drawing Geometric Objects.
+ (line 10230)
+* drawing a stroked ellipse (\D'e ...'): Drawing Geometric Objects.
+ (line 10237)
+* drawing a stroked polygon (\D'p ...'): Drawing Geometric Objects.
+ (line 10269)
+* drawing an arc (\D'a ...'): Drawing Geometric Objects.
+ (line 10225)
+* drawing an outlined circle (\D'c ...'): Drawing Geometric Objects.
+ (line 10230)
+* drawing an outlined ellipse (\D'e ...'): Drawing Geometric Objects.
+ (line 10237)
+* drawing an outlined polygon (\D'p ...'): Drawing Geometric Objects.
+ (line 10269)
+* drawing horizontal lines (\l): Drawing Geometric Objects.
+ (line 10142)
+* drawing position: Page Geometry. (line 4181)
+* drawing position, vertical (nl): Page Control. (line 7240)
+* drawing requests: Drawing Geometric Objects.
+ (line 10130)
+* drawing vertical lines (\L): Drawing Geometric Objects.
+ (line 10168)
+* ds request, and comments: Strings. (line 8823)
+* ds request, and double quotes: Strings. (line 8844)
+* ds request, and leading spaces: Strings. (line 8844)
+* ds, ds1 requests, and comments: Comments. (line 5139)
+* ds, ds1 requests, and warnings: Warnings. (line 12301)
+* dummy character (\&): Dummy Characters. (line 8357)
+* dummy character (\&), as control character suppressor: Requests and Macros.
+ (line 3820)
+* dummy character (\&), effect on kerning: Ligatures and Kerning.
+ (line 8294)
+* dummy character (\&), effect on \l escape sequence: Drawing Geometric Objects.
+ (line 10150)
+* dummy character, transparent (\)): Dummy Characters. (line 8407)
+* dummy environment, used by \w escape sequence: Page Motions.
+ (line 10034)
+* dumping environments (pev): Debugging. (line 12150)
+* dumping page location traps (ptr): Debugging. (line 12162)
+* dumping registers (pnr): Debugging. (line 12158)
+* dumping symbol table (pm): Debugging. (line 12154)
+* EBCDIC output encoding: Groff Options. (line 755)
+* EBCDIC, input encoding: Input Encodings. (line 3986)
+* ejection, page: Page Geometry. (line 4208)
+* ejection, page <1>: Page Control. (line 7170)
+* ejection, page <2>: The Implicit Page Trap.
+ (line 10638)
+* ejection, page, of final page: End-of-input Traps.
+ (line 10834)
+* ejection, page, prevented by vpt: Vertical Position Traps.
+ (line 10414)
+* el request, and warnings: Warnings. (line 12273)
+* ellipse, filled, drawing (\D'E ...'): Drawing Geometric Objects.
+ (line 10241)
+* ellipse, outlined, drawing (\D'e ...'): Drawing Geometric Objects.
+ (line 10237)
+* ellipse, solid, drawing (\D'E ...'): Drawing Geometric Objects.
+ (line 10241)
+* ellipse, stroked, drawing (\D'e ...'): Drawing Geometric Objects.
+ (line 10237)
+* em glyph, and cflags: Using Symbols. (line 7875)
+* em scaling unit (m): Measurements. (line 4277)
+* embolding of special fonts: Artificial Fonts. (line 8230)
+* empty line: Breaking. (line 3749)
+* en scaling unit (n): Measurements. (line 4281)
+* enabling vertical position traps (vpt): Vertical Position Traps.
+ (line 10407)
+* encoding, input, code page 1047: Input Encodings. (line 3986)
+* encoding, input, EBCDIC: Input Encodings. (line 3986)
+* encoding, input, Latin-1 (ISO 8859-1): Input Encodings. (line 3991)
+* encoding, input, Latin-2 (ISO 8859-2): Input Encodings. (line 4004)
+* encoding, input, Latin-5 (ISO 8859-9): Input Encodings. (line 4010)
+* encoding, input, Latin-9 (ISO 8859-15): Input Encodings. (line 4015)
+* encoding, output, ASCII: Groff Options. (line 743)
+* encoding, output, code page 1047: Groff Options. (line 755)
+* encoding, output, EBCDIC: Groff Options. (line 755)
+* encoding, output, ISO 646: Groff Options. (line 743)
+* encoding, output, Latin-1 (ISO 8859-1): Groff Options. (line 747)
+* encoding, output, UTF-8: Groff Options. (line 751)
+* end of conditional block (\}): Conditional Blocks.
+ (line 9250)
+* end-of-input macro (em): End-of-input Traps.
+ (line 10807)
+* end-of-input trap, setting (em): End-of-input Traps.
+ (line 10807)
+* end-of-input traps: End-of-input Traps.
+ (line 10806)
+* end-of-sentence characters: Sentences. (line 3619)
+* end-of-sentence characters <1>: Using Symbols. (line 7863)
+* end-of-sentence transparent characters: Sentences. (line 3663)
+* ending diversion (di, box): Diversions. (line 10944)
+* endnotes: Footnotes and Endnotes.
+ (line 1313)
+* environment: Deferring Output. (line 10337)
+* environment availability and naming, incompatibilities with: Other Differences.
+ (line 12583)
+* environment number/name register (.ev): Environments. (line 11309)
+* environment variables: Environment. (line 827)
+* environment, copying (evc): Environments. (line 11362)
+* environment, dimensions of last glyph (.w, .cht, .cdp, .csk): Environments.
+ (line 11388)
+* environment, dummy, used by \w escape sequence: Page Motions.
+ (line 10034)
+* environment, previous line length (.n): Environments. (line 11403)
+* environment, switching (ev): Environments. (line 11309)
+* environments: Environments. (line 11268)
+* environments, dumping (pev): Debugging. (line 12150)
+* equality operator: Numeric Expressions.
+ (line 4416)
+* equation example [ms]: ms Insertions. (line 2903)
+* equations [ms]: ms Insertions. (line 2844)
+* escape character, changing (ec): Using Escape Sequences.
+ (line 5012)
+* escape character, formatting (\e): Using Escape Sequences.
+ (line 4999)
+* escape character, while defining glyph: Using Symbols. (line 7948)
+* escape sequence: Formatter Instructions.
+ (line 4714)
+* escape sequence argument delimiters: Delimiters. (line 5060)
+* escape sequences: Using Escape Sequences.
+ (line 4942)
+* escape sequences, brace (\{, \}): Conditional Blocks.
+ (line 9250)
+* escaping newline characters, in strings: Strings. (line 8853)
+* ex request, use in debugging: Debugging. (line 12132)
+* ex request, used with nx and rd: I/O. (line 11591)
+* example markup, bulleted list [ms]: Lists in ms. (line 2590)
+* example markup, cover page in [ms]: ms Document Description Macros.
+ (line 2196)
+* example markup, glossary-style list [ms]: Lists in ms. (line 2637)
+* example markup, numbered list [ms]: Lists in ms. (line 2609)
+* examples of invocation: Invocation Examples.
+ (line 1002)
+* exiting (ex): Debugging. (line 12132)
+* expansion of strings (\*): Strings. (line 8802)
+* explicit hyphen (\%): Manipulating Hyphenation.
+ (line 6277)
+* explicit hyphenation: Manipulating Hyphenation.
+ (line 5948)
+* expression, limitation of logical not in: Numeric Expressions.
+ (line 4426)
+* expression, order of evaluation: Numeric Expressions.
+ (line 4446)
+* expressions, and register format: Assigning Register Formats.
+ (line 5484)
+* expressions, and space characters: Numeric Expressions.
+ (line 4538)
+* expressions, conditional: Operators in Conditionals.
+ (line 9027)
+* expressions, numeric: Numeric Expressions.
+ (line 4348)
+* extra post-vertical line space (\x): Changing the Vertical Spacing.
+ (line 8568)
+* extra post-vertical line space register (.a): Manipulating Spacing.
+ (line 6420)
+* extra pre-vertical line space (\x): Changing the Vertical Spacing.
+ (line 8560)
+* extra spaces between words: Adjustment. (line 3775)
+* extreme values representable with Roman numerals: Assigning Register Formats.
+ (line 5465)
+* extremum operators (>?, <?): Numeric Expressions.
+ (line 4407)
+* f scaling unit: Colors. (line 8712)
+* factor, zoom, of a font (fzoom): Selecting Fonts. (line 7421)
+* fallback character, defining (fchar, fschar, schar): Using Symbols.
+ (line 7948)
+* fallback glyph, removing definition (rchar, rfschar): Using Symbols.
+ (line 8005)
+* fam request, and changing fonts: Selecting Fonts. (line 7352)
+* families, font: Font Families. (line 7448)
+* family, font: Using Fonts. (line 7280)
+* features, common: Common Features. (line 1201)
+* fi request, causing implicit break: Manipulating Filling and Adjustment.
+ (line 5624)
+* field delimiting character (fc): Fields. (line 6692)
+* field padding character (fc): Fields. (line 6692)
+* fields: Fields. (line 6692)
+* fields, and tabs: Tabs and Fields. (line 6481)
+* figure space (\0): Page Motions. (line 10014)
+* figures [ms]: ms Insertions. (line 2844)
+* file formats: File Formats. (line 12674)
+* file names, breaking (\:): Manipulating Hyphenation.
+ (line 6008)
+* file, appending to (opena): I/O. (line 11671)
+* file, closing (close): I/O. (line 11703)
+* file, font description: Using Fonts. (line 7295)
+* file, inclusion (so): I/O. (line 11473)
+* file, macro, search path: Macro Directories. (line 900)
+* file, opening (open): I/O. (line 11671)
+* file, processing next (nx): I/O. (line 11553)
+* file, writing to (write, writec): I/O. (line 11683)
+* files, font: Device and Font Description Files.
+ (line 13401)
+* fill color: Colors. (line 8678)
+* fill color name register (.M): Colors. (line 8765)
+* fill mode (fi), enabling: Manipulating Filling and Adjustment.
+ (line 5685)
+* fill mode, and \c: Line Continuation. (line 7054)
+* fill mode, disabling: Manipulating Filling and Adjustment.
+ (line 5692)
+* filled circle, drawing (\D'C ...'): Drawing Geometric Objects.
+ (line 10234)
+* filled ellipse, drawing (\D'E ...'): Drawing Geometric Objects.
+ (line 10241)
+* filled polygon, drawing (\D'P ...'): Drawing Geometric Objects.
+ (line 10275)
+* filling: Filling. (line 3581)
+* filling and adjustment, manipulating: Manipulating Filling and Adjustment.
+ (line 5624)
+* filling of output, disabling (nf): Manipulating Filling and Adjustment.
+ (line 5692)
+* filling of output, enabling (fi): Manipulating Filling and Adjustment.
+ (line 5685)
+* filling, and break warnings: Warnings. (line 12262)
+* filling, and inter-sentence space: Manipulating Filling and Adjustment.
+ (line 5898)
+* final newline, stripping in diversions: Punning Names. (line 11246)
+* fl request, causing implicit break: Manipulating Filling and Adjustment.
+ (line 5624)
+* floating keep: Displays and Keeps.
+ (line 1301)
+* flush output (fl): Debugging. (line 12167)
+* font: Using Fonts. (line 7280)
+* font aliasing with third argument to fp request: Font Positions.
+ (line 7561)
+* font description file: Using Fonts. (line 7295)
+* font description file format: DESC File Format. (line 13425)
+* font description file, format: Font Description File Format.
+ (line 13572)
+* font description files, comments: Font Description File Format.
+ (line 13592)
+* font directories: Font Directories. (line 934)
+* font families: Font Families. (line 7448)
+* font family: Using Fonts. (line 7280)
+* font family, changing (fam, \F): Font Families. (line 7467)
+* font file, format: Font Description File Format.
+ (line 13572)
+* font files: Device and Font Description Files.
+ (line 13401)
+* font for underlining (uf): Artificial Fonts. (line 8206)
+* font height, changing (\H): Artificial Fonts. (line 8132)
+* font metrics: Using Fonts. (line 7295)
+* font mounting, automatic: Selecting Fonts. (line 7365)
+* font path: Font Directories. (line 942)
+* font position register (.f): Font Positions. (line 7578)
+* font positions: Font Positions. (line 7540)
+* font slant, changing (\S): Artificial Fonts. (line 8161)
+* font style: Using Fonts. (line 7280)
+* font style, abstract: Using Fonts. (line 7302)
+* font style, abstract, setting up (sty): Font Families. (line 7505)
+* font styles: Font Families. (line 7448)
+* font translation (ftr): Selecting Fonts. (line 7406)
+* font, magnification (fzoom): Selecting Fonts. (line 7421)
+* font, mounting (fp): Font Positions. (line 7552)
+* font, optical size: Selecting Fonts. (line 7421)
+* font, previous, selecting (\f[], \fP): Selecting Fonts. (line 7378)
+* font, previous, slecting (ft): Selecting Fonts. (line 7352)
+* font, selection: Selecting Fonts. (line 7343)
+* font, special: Using Fonts. (line 7280)
+* font, text: Using Fonts. (line 7280)
+* font, unstyled: Using Fonts. (line 7280)
+* font, zoom factor (fzoom): Selecting Fonts. (line 7421)
+* fonts, artificial: Artificial Fonts. (line 8122)
+* fonts, changing (ft, \f): Selecting Fonts. (line 7352)
+* fonts, searching: Font Directories. (line 934)
+* fonts, special: Special Fonts. (line 8092)
+* footers: Page Layout. (line 7115)
+* footers <1>: Page Location Traps.
+ (line 10440)
+* footers [ms]: ms Headers and Footers.
+ (line 3052)
+* footnote marker [ms]: ms Footnotes. (line 2920)
+* footnotes: Footnotes and Endnotes.
+ (line 1313)
+* footnotes [ms]: ms Footnotes. (line 2920)
+* footnotes, and displays [ms]: ms Footnotes. (line 2958)
+* footnotes, and keeps [ms]: ms Footnotes. (line 2958)
+* form letters: I/O. (line 11575)
+* format of font description file: DESC File Format. (line 13425)
+* format of font description files: Font Description File Format.
+ (line 13572)
+* format of font files: Font Description File Format.
+ (line 13572)
+* format of register (\g): Assigning Register Formats.
+ (line 5479)
+* format, paper: Paper Format. (line 972)
+* formats, file: File Formats. (line 12674)
+* formatter instructions: Formatter Instructions.
+ (line 4703)
+* formatting a backslash glyph (\[rs]): Using Escape Sequences.
+ (line 5002)
+* formatting a title line (tl): Page Layout. (line 7120)
+* formatting the escape character (\e): Using Escape Sequences.
+ (line 4999)
+* formatting the time: I/O. (line 11656)
+* fp request, and font translations: Selecting Fonts. (line 7406)
+* fp request, incompatibilities with AT&T troff: Other Differences.
+ (line 12609)
+* fractional point sizes: Using Fractional Type Sizes.
+ (line 8597)
+* fractional point sizes <1>: Other Differences. (line 12587)
+* fractional type sizes: Using Fractional Type Sizes.
+ (line 8597)
+* fractional type sizes <1>: Other Differences. (line 12587)
+* fractional type sizes in ms macros: Differences from AT&T ms.
+ (line 3315)
+* French spacing: Sentences. (line 3619)
+* fspecial request, and font styles: Font Families. (line 7505)
+* fspecial request, and font translations: Selecting Fonts. (line 7406)
+* fspecial request, and glyph search order: Using Symbols. (line 7612)
+* fspecial request, and imitating bold: Artificial Fonts. (line 8230)
+* ft request, and font translations: Selecting Fonts. (line 7406)
+* full-service macro package: Major Macro Packages.
+ (line 1397)
+* geometry, page: Page Geometry. (line 4162)
+* GGL (groff glyph list): Using Symbols. (line 7688)
+* GGL (groff glyph list) <1>: Character Classes. (line 8055)
+* glossary-style list, example markup [ms]: Lists in ms. (line 2637)
+* glyph: Using Symbols. (line 7600)
+* glyph for line drawing: Drawing Geometric Objects.
+ (line 10168)
+* glyph names, composite: Using Symbols. (line 7688)
+* glyph pile (\b): Drawing Geometric Objects.
+ (line 10308)
+* glyph properties (cflags): Using Symbols. (line 7846)
+* glyph, box rule (\[br]): Drawing Geometric Objects.
+ (line 10168)
+* glyph, constant space: Artificial Fonts. (line 8241)
+* glyph, defining (char): Using Symbols. (line 7948)
+* glyph, distinguished from character: Using Symbols. (line 7600)
+* glyph, for line drawing: Drawing Geometric Objects.
+ (line 10146)
+* glyph, for margins (mc): Miscellaneous. (line 11897)
+* glyph, last, dimensions (.w, .cht, .cdp, .csk): Environments.
+ (line 11388)
+* glyph, leader repetition (lc): Leaders. (line 6661)
+* glyph, numbered (\N): Character Translations.
+ (line 6741)
+* glyph, numbered (\N) <1>: Using Symbols. (line 7810)
+* glyph, removing definition (rchar, rfschar): Using Symbols.
+ (line 8005)
+* glyph, soft hyphen (hy): Manipulating Hyphenation.
+ (line 6032)
+* glyph, tab repetition (tc): Tabs and Fields. (line 6602)
+* glyph, underscore (\[ru]): Drawing Geometric Objects.
+ (line 10146)
+* glyphs, available, list of (groff_char(7) man page): Using Symbols.
+ (line 7675)
+* glyphs, output, and input characters, compatibility with AT&T troff: Other Differences.
+ (line 12609)
+* glyphs, overstriking (\o): Page Motions. (line 10097)
+* glyphs, unnamed: Using Symbols. (line 7820)
+* glyphs, unnamed, accessing with \N: Font Description File Format.
+ (line 13639)
+* GNU troff, identification register (.g): Built-in Registers.
+ (line 5539)
+* GNU troff, PID register ($$): Built-in Registers.
+ (line 5571)
+* GNU troff, process ID register ($$): Built-in Registers.
+ (line 5571)
+* GNU-specific register (.g): Built-in Registers.
+ (line 5539)
+* graphic renditions: Using Fonts. (line 7323)
+* greater than (or equal to) operator: Numeric Expressions.
+ (line 4416)
+* groff capabilities: groff Capabilities.
+ (line 281)
+* groff glyph list (GGL): Using Symbols. (line 7688)
+* groff glyph list (GGL) <1>: Character Classes. (line 8055)
+* groff invocation: Invoking groff. (line 454)
+* groff, and pi request: I/O. (line 11629)
+* groff--what is it?: What Is groff?. (line 264)
+* GROFF_BIN_PATH, environment variable: Environment. (line 831)
+* GROFF_COMMAND_PREFIX, environment variable: Environment. (line 835)
+* GROFF_ENCODING, environment variable: Environment. (line 846)
+* GROFF_FONT_PATH, environment variable: Environment. (line 855)
+* GROFF_FONT_PATH, environment variable <1>: Font Directories.
+ (line 955)
+* GROFF_TMAC_PATH, environment variable: Environment. (line 862)
+* GROFF_TMAC_PATH, environment variable <1>: Macro Directories.
+ (line 908)
+* GROFF_TMPDIR, environment variable: Environment. (line 869)
+* GROFF_TYPESETTER, environment variable: Environment. (line 877)
+* grohtml, the program: Groff Options. (line 766)
+* gtroff, interactive use: Debugging. (line 12167)
+* gtroff, output: gtroff Output. (line 12680)
+* gtroff, reference: GNU troff Reference.
+ (line 3549)
+* hair space (\^): Page Motions. (line 10008)
+* hcode request, and glyph definitions: Using Symbols. (line 7948)
+* headers: Page Layout. (line 7115)
+* headers <1>: Page Location Traps.
+ (line 10440)
+* headers [ms]: ms Headers and Footers.
+ (line 3052)
+* height, font, changing (\H): Artificial Fonts. (line 8132)
+* height, of last glyph (.cht): Environments. (line 11388)
+* high-water mark register (.h): Diversions. (line 11007)
+* home directory: Macro Directories. (line 913)
+* horizontal discardable space: Manipulating Filling and Adjustment.
+ (line 5914)
+* horizontal input line position register (hp): Page Motions.
+ (line 10090)
+* horizontal input line position, saving (\k): Page Motions.
+ (line 10084)
+* horizontal line, drawing (\l): Drawing Geometric Objects.
+ (line 10142)
+* horizontal motion (\h): Page Motions. (line 9982)
+* horizontal motion quantum: DESC File Format. (line 13445)
+* horizontal motion quantum register (.H): Motion Quanta. (line 4299)
+* horizontal output line position register (.k): Page Motions.
+ (line 10093)
+* horizontal resolution: DESC File Format. (line 13445)
+* horizontal resolution register (.H): Motion Quanta. (line 4299)
+* horizontal space (\h): Page Motions. (line 9982)
+* horizontal space, unformatting: Punning Names. (line 11246)
+* horizontal tab character: Tabs and Leaders. (line 3785)
+* hours, current time (hours): Built-in Registers.
+ (line 5586)
+* hpf request, and hyphenation language: Manipulating Hyphenation.
+ (line 6263)
+* hw request, and hy restrictions: Manipulating Hyphenation.
+ (line 5970)
+* hw request, and hyphenation language: Manipulating Hyphenation.
+ (line 6263)
+* hy glyph, and cflags: Using Symbols. (line 7875)
+* hyphen, explicit (\%): Manipulating Hyphenation.
+ (line 6277)
+* hyphenated lines, consecutive (hlm): Manipulating Hyphenation.
+ (line 6277)
+* hyphenating characters: Using Symbols. (line 7868)
+* hyphenation: Hyphenation. (line 3707)
+* hyphenation character (\%): Manipulating Hyphenation.
+ (line 5992)
+* hyphenation code (hcode): Manipulating Hyphenation.
+ (line 6228)
+* hyphenation consecutive line count register (.hlc): Manipulating Hyphenation.
+ (line 6284)
+* hyphenation consecutive line limit register (.hlm): Manipulating Hyphenation.
+ (line 6284)
+* hyphenation exceptions: Manipulating Hyphenation.
+ (line 5956)
+* hyphenation language register (.hla): Manipulating Hyphenation.
+ (line 6270)
+* hyphenation margin (hym): Manipulating Hyphenation.
+ (line 6290)
+* hyphenation margin register (.hym): Manipulating Hyphenation.
+ (line 6300)
+* hyphenation mode register (.hy): Manipulating Hyphenation.
+ (line 6054)
+* hyphenation parameters, automatic: Manipulating Hyphenation.
+ (line 6042)
+* hyphenation pattern files: Manipulating Hyphenation.
+ (line 6116)
+* hyphenation patterns (hpf): Manipulating Hyphenation.
+ (line 6170)
+* hyphenation space (hys): Manipulating Hyphenation.
+ (line 6305)
+* hyphenation space adjustment threshold: Manipulating Hyphenation.
+ (line 6305)
+* hyphenation space adjustment threshold register (.hys): Manipulating Hyphenation.
+ (line 6316)
+* hyphenation, automatic: Manipulating Hyphenation.
+ (line 5941)
+* hyphenation, disabling (\%): Manipulating Hyphenation.
+ (line 5992)
+* hyphenation, explicit: Manipulating Hyphenation.
+ (line 5948)
+* hyphenation, incompatibilities with AT&T troff: Other Differences.
+ (line 12557)
+* hyphenation, manipulating: Manipulating Hyphenation.
+ (line 5941)
+* hyphenation, manual: Manipulating Hyphenation.
+ (line 5948)
+* i scaling unit: Measurements. (line 4249)
+* i/o: I/O. (line 11469)
+* IBM code page 1047 input encoding: Input Encodings. (line 3986)
+* IBM code page 1047 output encoding: Groff Options. (line 755)
+* identifiers: Identifiers. (line 4574)
+* identifiers, undefined: Identifiers. (line 4656)
+* ie request, and font translations: Selecting Fonts. (line 7406)
+* ie request, and warnings: Warnings. (line 12273)
+* ie request, operators to use with: Operators in Conditionals.
+ (line 9027)
+* if request, and font translations: Selecting Fonts. (line 7406)
+* if request, and the ! operator: Numeric Expressions.
+ (line 4365)
+* if request, operators to use with: Operators in Conditionals.
+ (line 9027)
+* if-else: if-else. (line 9211)
+* if-then: if-then. (line 9170)
+* imitating boldface (bd): Artificial Fonts. (line 8213)
+* implementation differences: Implementation Differences.
+ (line 12388)
+* implicit line break: Breaking. (line 3725)
+* implicit trap: The Implicit Page Trap.
+ (line 10638)
+* in request, causing implicit break: Manipulating Filling and Adjustment.
+ (line 5624)
+* in request, using + and - with: Numeric Expressions.
+ (line 4463)
+* inch scaling unit (i): Measurements. (line 4249)
+* including a file (so): I/O. (line 11473)
+* incompatibilities with AT&T troff: Implementation Differences.
+ (line 12388)
+* increment value without changing the register: Auto-increment.
+ (line 5403)
+* incrementation, automatic, of a register: Auto-increment. (line 5364)
+* indentation (in): Line Layout. (line 6874)
+* indentation, of roff source code: Invoking Requests. (line 4803)
+* index, in macro package: Indexing. (line 1340)
+* indicator, scaling: Measurements. (line 4232)
+* indirect assignments: Interpolating Registers.
+ (line 5340)
+* input and output requests: I/O. (line 11469)
+* input characters and output glyphs, compatibility with AT&T troff: Other Differences.
+ (line 12609)
+* input characters, invalid: Identifiers. (line 4581)
+* input conventions: Input Conventions. (line 4051)
+* input encoding, code page 1047: Input Encodings. (line 3986)
+* input encoding, EBCDIC: Input Encodings. (line 3986)
+* input encoding, Latin-1 (ISO 8859-1): Input Encodings. (line 3991)
+* input encoding, Latin-2 (ISO 8859-2): Input Encodings. (line 4004)
+* input encoding, Latin-5 (ISO 8859-9): Input Encodings. (line 4010)
+* input encoding, Latin-9 (ISO 8859-15): Input Encodings. (line 4015)
+* input file name, current, register (.F): Built-in Registers.
+ (line 5536)
+* input level: Calling Macros. (line 4929)
+* input level in delimited arguments: Compatibility Mode.
+ (line 12498)
+* input line continuation (\<RET>): Line Continuation. (line 7019)
+* input line number register (.c, c.): Built-in Registers.
+ (line 5532)
+* input line number, setting (lf): Debugging. (line 12103)
+* input line position, horizontal, saving (\k): Page Motions.
+ (line 10084)
+* input line trap, clearing (it, itc): Input Line Traps. (line 10680)
+* input line trap, setting (it, itc): Input Line Traps. (line 10680)
+* input line traps: Input Line Traps. (line 10678)
+* input line traps and interrupted lines (itc): Input Line Traps.
+ (line 10704)
+* input line, horizontal position, register (hp): Page Motions.
+ (line 10090)
+* input line, productive: Manipulating Filling and Adjustment.
+ (line 5797)
+* input stack, backtrace (backtrace): Debugging. (line 12176)
+* input stack, setting limit: Debugging. (line 12197)
+* input token: Gtroff Internals. (line 11970)
+* input, 8-bit: Font Description File Format.
+ (line 13639)
+* input, standard, reading from (rd): I/O. (line 11558)
+* inserting horizontal space (\h): Page Motions. (line 9982)
+* installation: Installation. (line 370)
+* instructing the formatter: Formatter Instructions.
+ (line 4703)
+* inter-sentence space size register (.sss): Manipulating Filling and Adjustment.
+ (line 5887)
+* inter-sentence space, additional: Manipulating Filling and Adjustment.
+ (line 5893)
+* inter-word spacing, minimal: Manipulating Filling and Adjustment.
+ (line 5891)
+* interactive use of gtroff: Debugging. (line 12167)
+* intercepting requests: Control Characters.
+ (line 4765)
+* intermediate output: gtroff Output. (line 12690)
+* interpolating registers (\n): Interpolating Registers.
+ (line 5335)
+* interpolation: Requests and Macros.
+ (line 3840)
+* interpolation depth: Calling Macros. (line 4929)
+* interpolation depth in delimited arguments: Compatibility Mode.
+ (line 12498)
+* interpolation of strings (\*): Strings. (line 8802)
+* interpretation mode: Copy Mode. (line 9708)
+* interrupted line: Line Continuation. (line 7048)
+* interrupted line register (.int): Line Continuation. (line 7073)
+* interrupted lines and input line traps (itc): Input Line Traps.
+ (line 10704)
+* introduction: Introduction. (line 222)
+* invalid characters for trf request: I/O. (line 11533)
+* invalid input characters: Identifiers. (line 4581)
+* invocation examples: Invocation Examples.
+ (line 1002)
+* invoking groff: Invoking groff. (line 454)
+* invoking requests: Invoking Requests. (line 4781)
+* ISO 646 output encoding: Groff Options. (line 743)
+* ISO 8859-1 (Latin-1) output encoding: Groff Options. (line 747)
+* ISO 8859-1 (Latin-1), input encoding: Input Encodings. (line 3991)
+* ISO 8859-15 (Latin-9), input encoding: Input Encodings. (line 4015)
+* ISO 8859-2 (Latin-2), input encoding: Input Encodings. (line 4004)
+* ISO 8859-9 (Latin-5), input encoding: Input Encodings. (line 4010)
+* italic correction (\/): Italic Corrections.
+ (line 8328)
+* justifying text: Manipulating Filling and Adjustment.
+ (line 5624)
+* justifying text (rj): Manipulating Filling and Adjustment.
+ (line 5866)
+* keep, floating: Displays and Keeps.
+ (line 1301)
+* keeps (introduction): Displays and Keeps.
+ (line 1297)
+* keeps [ms]: ms keeps and displays.
+ (line 2743)
+* keeps, and footnotes [ms]: ms Footnotes. (line 2958)
+* kerning and ligatures: Ligatures and Kerning.
+ (line 8253)
+* kerning enabled register (.kern): Ligatures and Kerning.
+ (line 8289)
+* kerning, activating (kern): Ligatures and Kerning.
+ (line 8289)
+* kerning, track: Ligatures and Kerning.
+ (line 8300)
+* landscape page orientation: Paper Format. (line 972)
+* language [ms]: ms language and localization.
+ (line 3003)
+* last glyph, dimensions (.w, .cht, .cdp, .csk): Environments.
+ (line 11388)
+* last-requested point size registers (.psr, .sr): Using Fractional Type Sizes.
+ (line 8638)
+* last-requested type size registers (.psr, .sr): Using Fractional Type Sizes.
+ (line 8638)
+* Latin-1 (ISO 8859-1) output encoding: Groff Options. (line 747)
+* Latin-1 (ISO 8859-1), input encoding: Input Encodings. (line 3991)
+* Latin-2 (ISO 8859-2), input encoding: Input Encodings. (line 4004)
+* Latin-5 (ISO 8859-9), input encoding: Input Encodings. (line 4010)
+* Latin-9 (ISO 8859-15), input encoding: Input Encodings. (line 4015)
+* layout, line: Line Layout. (line 6855)
+* layout, page: Page Layout. (line 7087)
+* lc request, and glyph definitions: Using Symbols. (line 7948)
+* leader character: Tabs and Leaders. (line 3785)
+* leader character <1>: Leaders. (line 6652)
+* leader character, and translations: Character Translations.
+ (line 6751)
+* leader character, non-interpreted (\a): Leaders. (line 6658)
+* leader repetition character (lc): Leaders. (line 6661)
+* leaders: Leaders. (line 6645)
+* leading: Manipulating Type Size and Vertical Spacing.
+ (line 8444)
+* leading space macro (lsm): Breaking. (line 3757)
+* leading space traps: Leading Space Traps.
+ (line 10788)
+* leading spaces: Breaking. (line 3757)
+* leading spaces macro (lsm): Leading Space Traps.
+ (line 10791)
+* leading spaces with ds: Strings. (line 8844)
+* left italic correction (\,): Italic Corrections.
+ (line 8338)
+* left margin (po): Line Layout. (line 6870)
+* length of a string (length): Strings. (line 8909)
+* length of line (ll): Line Layout. (line 6878)
+* length of previous line (.n): Environments. (line 11403)
+* length of the page, configuring (pl): Page Layout. (line 7093)
+* length of title line, configuring (lt): Page Layout. (line 7137)
+* length request, and copy mode: Strings. (line 8909)
+* less than (or equal to) operator: Numeric Expressions.
+ (line 4416)
+* letters, form: I/O. (line 11575)
+* level, input: Calling Macros. (line 4929)
+* level, suppression nesting, register: Suppressing Output.
+ (line 11463)
+* lf request, incompatibilities with AT&T troff: Other Differences.
+ (line 12579)
+* ligature: Using Symbols. (line 7600)
+* ligatures and kerning: Ligatures and Kerning.
+ (line 8253)
+* ligatures enabled register (.lg): Ligatures and Kerning.
+ (line 8271)
+* ligatures, activating (lg): Ligatures and Kerning.
+ (line 8271)
+* limitations of \b escape sequence: Drawing Geometric Objects.
+ (line 10316)
+* line break: Manipulating Filling and Adjustment.
+ (line 5624)
+* line break (introduction): Basics. (line 1188)
+* line break, output: Breaking. (line 3725)
+* line control: Line Continuation. (line 7014)
+* line dimensions: Line Layout. (line 6855)
+* line drawing glyph: Drawing Geometric Objects.
+ (line 10146)
+* line drawing glyph <1>: Drawing Geometric Objects.
+ (line 10168)
+* line indentation (in): Line Layout. (line 6874)
+* line layout: Line Layout. (line 6855)
+* line length (ll): Line Layout. (line 6878)
+* line length register (.l): Line Layout. (line 7003)
+* line length, previous (.n): Environments. (line 11403)
+* line number, input, register (.c, c.): Built-in Registers.
+ (line 5532)
+* line number, output, register (ln): Miscellaneous. (line 11820)
+* line numbers, printing (nm): Miscellaneous. (line 11798)
+* line space, extra post-vertical (\x): Changing the Vertical Spacing.
+ (line 8568)
+* line space, extra pre-vertical (\x): Changing the Vertical Spacing.
+ (line 8560)
+* line spacing register (.L): Manipulating Spacing.
+ (line 6400)
+* line spacing, post-vertical (pvs): Changing the Vertical Spacing.
+ (line 8572)
+* line thickness (\D't ...'): Drawing Geometric Objects.
+ (line 10298)
+* line, blank: Breaking. (line 3749)
+* line, drawing (\D'l ...'): Drawing Geometric Objects.
+ (line 10244)
+* line, horizontal, drawing (\l): Drawing Geometric Objects.
+ (line 10142)
+* line, input, continuation (\<RET>): Line Continuation. (line 7019)
+* line, input, horizontal position, register (hp): Page Motions.
+ (line 10090)
+* line, input, horizontal position, saving (\k): Page Motions.
+ (line 10084)
+* line, interrupted: Line Continuation. (line 7048)
+* line, output, continuation (\c): Line Continuation. (line 7048)
+* line, output, horizontal position, register (.k): Page Motions.
+ (line 10093)
+* line, productive input: Manipulating Filling and Adjustment.
+ (line 5797)
+* line, vertical, drawing (\L): Drawing Geometric Objects.
+ (line 10168)
+* line-tabs mode: Tabs and Fields. (line 6615)
+* lines, blank, disabling: Manipulating Spacing.
+ (line 6456)
+* lines, centering (ce): Manipulating Filling and Adjustment.
+ (line 5827)
+* lines, centering (introduction): Basics. (line 1170)
+* lines, consecutive hyphenated (hlm): Manipulating Hyphenation.
+ (line 6277)
+* lines, interrupted, and input line traps (itc): Input Line Traps.
+ (line 10704)
+* lines, right-aligning (introduction): Basics. (line 1182)
+* lines, right-justifying (introduction): Basics. (line 1182)
+* list of special characters (groff_char(7) man page): Using Symbols.
+ (line 7675)
+* listing page location traps (ptr): Debugging. (line 12162)
+* lists: Paragraphs. (line 1228)
+* ll request, using + and - with: Numeric Expressions.
+ (line 4463)
+* localization: Manipulating Hyphenation.
+ (line 6215)
+* localization [ms]: ms language and localization.
+ (line 3003)
+* locating macro files: Macro Directories. (line 900)
+* locating macro packages: Macro Directories. (line 900)
+* location, vertical, page, marking (mk): Page Motions. (line 9868)
+* location, vertical, page, returning to marked (rt): Page Motions.
+ (line 9868)
+* logical "and" operator: Numeric Expressions.
+ (line 4422)
+* logical "or" operator: Numeric Expressions.
+ (line 4422)
+* logical complementation operator: Numeric Expressions.
+ (line 4426)
+* logical conjunction operator: Numeric Expressions.
+ (line 4422)
+* logical disjunction operator: Numeric Expressions.
+ (line 4422)
+* logical not, limitation in expression: Numeric Expressions.
+ (line 4426)
+* logical operators: Numeric Expressions.
+ (line 4422)
+* long names: Compatibility Mode.
+ (line 12404)
+* loops and conditionals: Conditionals and Loops.
+ (line 9020)
+* lowercasing a string (stringdown): Strings. (line 8945)
+* ls request, alternative to (pvs): Changing the Vertical Spacing.
+ (line 8584)
+* lt request, using + and - with: Numeric Expressions.
+ (line 4463)
+* m scaling unit: Measurements. (line 4277)
+* M scaling unit: Measurements. (line 4287)
+* machine units: Page Geometry. (line 4169)
+* macro: Requests and Macros.
+ (line 3840)
+* macro arguments: Calling Macros. (line 4851)
+* macro arguments, and compatibility mode: Gtroff Internals.
+ (line 12054)
+* macro arguments, and tabs: Invoking Requests. (line 4789)
+* macro directories: Macro Directories. (line 898)
+* macro file search path: Macro Directories. (line 900)
+* macro name register (\$0): Parameters. (line 9657)
+* macro names, starting with [ or ], and refer: Identifiers.
+ (line 4623)
+* macro package: Macro Packages. (line 3963)
+* macro package search path: Macro Directories. (line 900)
+* macro package usage, basics of: Basics. (line 1058)
+* macro package, auxiliary: Major Macro Packages.
+ (line 1408)
+* macro package, full-service: Major Macro Packages.
+ (line 1397)
+* macro package, introduction: Macro Package Intro.
+ (line 316)
+* macro package, major: Major Macro Packages.
+ (line 1394)
+* macro package, minor: Major Macro Packages.
+ (line 1408)
+* macro package, structuring the source of: Invoking Requests.
+ (line 4803)
+* macro, appending to (am): Writing Macros. (line 9533)
+* macro, creating alias for (als): Strings. (line 8972)
+* macro, end-of-input (em): End-of-input Traps.
+ (line 10807)
+* macro, parameters (\$): Parameters. (line 9616)
+* macro, removing (rm): Strings. (line 8967)
+* macro, removing alias for (rm): Strings. (line 9007)
+* macro, renaming (rn): Strings. (line 8964)
+* macros, recursive: while. (line 9359)
+* macros, searching: Macro Directories. (line 898)
+* macros, shared name space with strings and diversions: Identifiers.
+ (line 4668)
+* macros, tutorial for users: Tutorial for Macro Users.
+ (line 1046)
+* macros, writing: Writing Macros. (line 9410)
+* magnification of a font (fzoom): Selecting Fonts. (line 7421)
+* major macro package: Major Macro Packages.
+ (line 1394)
+* major version number register (.x): Built-in Registers.
+ (line 5559)
+* man macros, custom headers and footers: Optional man extensions.
+ (line 1433)
+* man macros, Ultrix-specific: Optional man extensions.
+ (line 1451)
+* man pages: man. (line 1417)
+* manipulating filling and adjustment: Manipulating Filling and Adjustment.
+ (line 5624)
+* manipulating hyphenation: Manipulating Hyphenation.
+ (line 5941)
+* manipulating spacing: Manipulating Spacing.
+ (line 6344)
+* manipulating type size and vertical spacing: Manipulating Type Size and Vertical Spacing.
+ (line 8438)
+* manual hyphenation: Manipulating Hyphenation.
+ (line 5948)
+* manual pages: man. (line 1417)
+* margin for hyphenation (hym): Manipulating Hyphenation.
+ (line 6290)
+* margin glyph (mc): Miscellaneous. (line 11897)
+* margin, bottom: Page Location Traps.
+ (line 10440)
+* margin, left (po): Line Layout. (line 6870)
+* margin, right: Line Layout. (line 6881)
+* margin, top: Page Location Traps.
+ (line 10440)
+* mark, high-water, register (.h): Diversions. (line 11007)
+* marker, footnote [ms]: ms Footnotes. (line 2920)
+* marking vertical page location (mk): Page Motions. (line 9868)
+* maximum operator: Numeric Expressions.
+ (line 4407)
+* maximum value representable with Roman numerals: Assigning Register Formats.
+ (line 5465)
+* mdoc macros: mdoc. (line 1552)
+* me macro package: me. (line 1559)
+* measurement units: Measurements. (line 4232)
+* measurements: Measurements. (line 4232)
+* measurements, specifying safely: Default Units. (line 4341)
+* metrics, font: Using Fonts. (line 7295)
+* minimal inter-word spacing: Manipulating Filling and Adjustment.
+ (line 5891)
+* minimum operator: Numeric Expressions.
+ (line 4407)
+* minimum value representable with Roman numerals: Assigning Register Formats.
+ (line 5465)
+* minor macro package: Major Macro Packages.
+ (line 1408)
+* minor version number register (.y): Built-in Registers.
+ (line 5563)
+* minutes, current time (minutes): Built-in Registers.
+ (line 5583)
+* mm macro package: mm. (line 1571)
+* mode for constant glyph space (cs): Artificial Fonts. (line 8241)
+* mode, compatibility: Compatibility Mode.
+ (line 12404)
+* mode, compatibility, and parameters: Gtroff Internals. (line 12054)
+* mode, copy: Copy Mode. (line 9699)
+* mode, copy <1>: Copy Mode. (line 9699)
+* mode, copy, and cf request: I/O. (line 11521)
+* mode, copy, and device request: Postprocessor Access.
+ (line 11744)
+* mode, copy, and length request: Strings. (line 8909)
+* mode, copy, and macro parameters: Parameters. (line 9616)
+* mode, copy, and output request: Diversions. (line 11106)
+* mode, copy, and trf request: I/O. (line 11521)
+* mode, copy, and write request: I/O. (line 11683)
+* mode, copy, and writec request: I/O. (line 11683)
+* mode, copy, and writem request: I/O. (line 11697)
+* mode, copy, and \!: Diversions. (line 11074)
+* mode, copy, and \?: Operators in Conditionals.
+ (line 9116)
+* mode, copy, and \? <1>: Diversions. (line 11074)
+* mode, copy, and \a: Leaders. (line 6658)
+* mode, copy, and \t: Tabs and Fields. (line 6485)
+* mode, copy, and \V: I/O. (line 11721)
+* mode, fill (fi), enabling: Manipulating Filling and Adjustment.
+ (line 5685)
+* mode, fill, and break warnings: Warnings. (line 12262)
+* mode, fill, and inter-sentence space: Manipulating Filling and Adjustment.
+ (line 5898)
+* mode, fill, and \c: Line Continuation. (line 7054)
+* mode, fill, disabling: Manipulating Filling and Adjustment.
+ (line 5692)
+* mode, interpretation: Copy Mode. (line 9708)
+* mode, line-tabs: Tabs and Fields. (line 6615)
+* mode, no-fill: Manipulating Filling and Adjustment.
+ (line 5692)
+* mode, no-fill, and \c: Line Continuation. (line 7062)
+* mode, no-space (ns): Manipulating Spacing.
+ (line 6456)
+* mode, nroff: troff and nroff Modes.
+ (line 6813)
+* mode, safer: Groff Options. (line 707)
+* mode, safer <1>: Macro Directories. (line 910)
+* mode, safer <2>: Built-in Registers.
+ (line 5555)
+* mode, safer <3>: I/O. (line 11504)
+* mode, safer <4>: I/O. (line 11616)
+* mode, safer <5>: I/O. (line 11638)
+* mode, safer <6>: I/O. (line 11677)
+* mode, safer <7>: Safer Mode. (line 12395)
+* mode, troff: troff and nroff Modes.
+ (line 6813)
+* mode, unsafe: Groff Options. (line 783)
+* mode, unsafe <1>: Macro Directories. (line 910)
+* mode, unsafe <2>: Built-in Registers.
+ (line 5555)
+* mode, unsafe <3>: I/O. (line 11504)
+* mode, unsafe <4>: I/O. (line 11616)
+* mode, unsafe <5>: I/O. (line 11638)
+* mode, unsafe <6>: I/O. (line 11677)
+* modifying requests: Control Characters.
+ (line 4765)
+* modulus: Numeric Expressions.
+ (line 4359)
+* mom macro package: mom. (line 1581)
+* month of the year register (mo): Built-in Registers.
+ (line 5595)
+* motion operators: Numeric Expressions.
+ (line 4457)
+* motion quanta: Motion Quanta. (line 4292)
+* motion quantum, horizontal: DESC File Format. (line 13445)
+* motion quantum, horizontal, register (.H): Motion Quanta. (line 4299)
+* motion quantum, vertical: DESC File Format. (line 13553)
+* motion, horizontal (\h): Page Motions. (line 9982)
+* motion, vertical (\v): Page Motions. (line 9938)
+* motions, page: Page Motions. (line 9863)
+* mounting a font (fp): Font Positions. (line 7552)
+* mounting position: Using Fonts. (line 7295)
+* mounting position <1>: Using Fonts. (line 7295)
+* mounting, font, automatic: Selecting Fonts. (line 7365)
+* ms macros: ms. (line 1603)
+* ms macros, accent marks: ms Legacy Features.
+ (line 3405)
+* ms macros, body text: ms Body Text. (line 2231)
+* ms macros, creating table of contents: ms TOC. (line 3139)
+* ms macros, displays: ms keeps and displays.
+ (line 2743)
+* ms macros, document control settings: ms Document Control Settings.
+ (line 1794)
+* ms macros, document description: ms Document Description Macros.
+ (line 2132)
+* ms macros, equations: ms Insertions. (line 2844)
+* ms macros, figures: ms Insertions. (line 2844)
+* ms macros, footers: ms Headers and Footers.
+ (line 3052)
+* ms macros, footnotes: ms Footnotes. (line 2920)
+* ms macros, fractional type sizes in: Differences from AT&T ms.
+ (line 3315)
+* ms macros, general structure: ms Document Structure.
+ (line 1747)
+* ms macros, groff differences from AT&T: Differences from AT&T ms.
+ (line 3276)
+* ms macros, headers: ms Headers and Footers.
+ (line 3052)
+* ms macros, headings: Headings in ms. (line 2352)
+* ms macros, keeps: ms keeps and displays.
+ (line 2743)
+* ms macros, language: ms language and localization.
+ (line 3003)
+* ms macros, lists: Lists in ms. (line 2582)
+* ms macros, localization: ms language and localization.
+ (line 3003)
+* ms macros, margins: ms Margins. (line 3109)
+* ms macros, multiple columns: ms Multiple Columns.
+ (line 3117)
+* ms macros, naming conventions: ms Naming Conventions.
+ (line 3520)
+* ms macros, nested lists: Indented regions in ms.
+ (line 2713)
+* ms macros, obtaining typographical symbols: Typographical symbols in ms.
+ (line 2261)
+* ms macros, page layout: ms Page Layout. (line 3045)
+* ms macros, paragraph handling: Paragraphs in ms. (line 2277)
+* ms macros, references: ms Insertions. (line 2844)
+* ms macros, special characters: ms Legacy Features.
+ (line 3405)
+* ms macros, strings: ms Legacy Features.
+ (line 3405)
+* ms macros, tables: ms Insertions. (line 2844)
+* ms macros, text settings: Text settings in ms.
+ (line 2239)
+* multi-file documents: Debugging. (line 12103)
+* multi-line strings: Strings. (line 8853)
+* multi-page table example [ms]: ms Insertions. (line 2886)
+* multiple columns [ms]: ms Multiple Columns.
+ (line 3117)
+* multiplication: Numeric Expressions.
+ (line 4359)
+* n scaling unit: Measurements. (line 4281)
+* name space, common, of macros, diversions, and strings: Identifiers.
+ (line 4668)
+* name, background color, register (.M): Colors. (line 8765)
+* name, fill color, register (.M): Colors. (line 8765)
+* name, stroke color, register (.m): Colors. (line 8744)
+* named character (\C): Using Symbols. (line 7793)
+* names, long: Compatibility Mode.
+ (line 12404)
+* naming conventions, ms macros: ms Naming Conventions.
+ (line 3520)
+* ne request, and the .trunc register: Page Location Traps.
+ (line 10587)
+* ne request, comparison with sv: Page Control. (line 7230)
+* negating register values: Setting Registers. (line 5289)
+* negation: Numeric Expressions.
+ (line 4365)
+* nested assignments: Interpolating Registers.
+ (line 5340)
+* nested diversions: Diversions. (line 11000)
+* nested lists [ms]: Indented regions in ms.
+ (line 2713)
+* nesting level, suppression, register: Suppressing Output.
+ (line 11463)
+* new page (bp): Page Control. (line 7178)
+* newline character, and translations: Character Translations.
+ (line 6751)
+* newline character, in strings, escaping: Strings. (line 8853)
+* newline, as delimiter: Delimiters. (line 5076)
+* newline, final, stripping in diversions: Punning Names. (line 11246)
+* next file, processing (nx): I/O. (line 11553)
+* next free font position register (.fp): Font Positions. (line 7589)
+* next page number register (.pn): Page Layout. (line 7112)
+* next page number, configuring (pn): Page Layout. (line 7107)
+* nf request, causing implicit break: Manipulating Filling and Adjustment.
+ (line 5624)
+* nl register, and .d: Diversions. (line 11000)
+* nl register, difference from .h: Diversions. (line 11020)
+* nm request, using + and - with: Numeric Expressions.
+ (line 4463)
+* no-break control character ('): Requests and Macros.
+ (line 3813)
+* no-break control character, changing (c2): Control Characters.
+ (line 4738)
+* no-fill mode: Manipulating Filling and Adjustment.
+ (line 5692)
+* no-fill mode, and \c: Line Continuation. (line 7062)
+* no-space mode (ns): Manipulating Spacing.
+ (line 6456)
+* node, output: Gtroff Internals. (line 11970)
+* non-printing break point (\:): Manipulating Hyphenation.
+ (line 6008)
+* nr request, and warnings: Warnings. (line 12313)
+* nr request, using + and - with: Numeric Expressions.
+ (line 4463)
+* nroff mode: troff and nroff Modes.
+ (line 6813)
+* number formats, assigning to register (af): Assigning Register Formats.
+ (line 5413)
+* number of registers register (.R): Built-in Registers.
+ (line 5547)
+* number, input line, setting (lf): Debugging. (line 12103)
+* number, page, next, configuring (pn): Page Layout. (line 7107)
+* numbered glyph (\N): Character Translations.
+ (line 6741)
+* numbered glyph (\N) <1>: Using Symbols. (line 7810)
+* numbered list, example markup [ms]: Lists in ms. (line 2609)
+* numbers, line, printing (nm): Miscellaneous. (line 11798)
+* numeral-width space (\0): Page Motions. (line 10014)
+* numerals, as delimiters: Delimiters. (line 5090)
+* numerals, Roman: Assigning Register Formats.
+ (line 5433)
+* numeric expression, valid: Numeric Expressions.
+ (line 4522)
+* numeric expressions: Numeric Expressions.
+ (line 4348)
+* object creation: Writing Macros. (line 9558)
+* offset, page: Page Geometry. (line 4193)
+* offset, page (po): Line Layout. (line 6870)
+* open request, and safer mode: Groff Options. (line 707)
+* opena request, and safer mode: Groff Options. (line 707)
+* opening brace escape sequence (\}): Conditional Blocks.
+ (line 9250)
+* opening file (open): I/O. (line 11671)
+* operator, scaling: Numeric Expressions.
+ (line 4390)
+* operators, arithmetic: Numeric Expressions.
+ (line 4359)
+* operators, as delimiters: Delimiters. (line 5092)
+* operators, comparison: Numeric Expressions.
+ (line 4416)
+* operators, extremum (>?, <?): Numeric Expressions.
+ (line 4407)
+* operators, logical: Numeric Expressions.
+ (line 4422)
+* operators, motion: Numeric Expressions.
+ (line 4457)
+* operators, unary arithmetic: Numeric Expressions.
+ (line 4365)
+* optical size of a font: Selecting Fonts. (line 7421)
+* options: Groff Options. (line 478)
+* order of evaluation in expressions: Numeric Expressions.
+ (line 4446)
+* ordinary character: Identifiers. (line 4577)
+* orientation, landscape: Paper Format. (line 972)
+* orphan: Page Control. (line 7222)
+* orphan lines, preventing with ne: Page Control. (line 7195)
+* os request, and no-space mode: Page Control. (line 7233)
+* outlined circle, drawing (\D'c ...'): Drawing Geometric Objects.
+ (line 10230)
+* outlined ellipse, drawing (\D'e ...'): Drawing Geometric Objects.
+ (line 10237)
+* outlined polygon, drawing (\D'p ...'): Drawing Geometric Objects.
+ (line 10269)
+* output and input requests: I/O. (line 11469)
+* output comparison operator: Operators in Conditionals.
+ (line 9080)
+* output device name string (.T): Groff Options. (line 772)
+* output device name string (.T) <1>: Strings. (line 8787)
+* output device name string (.T), in other implementations: Other Differences.
+ (line 12564)
+* output device usage register (.T): Groff Options. (line 772)
+* output device usage register (.T), incompatibility with AT&T troff: Other Differences.
+ (line 12574)
+* output devices: Output Device Intro.
+ (line 359)
+* output encoding, ASCII: Groff Options. (line 743)
+* output encoding, code page 1047: Groff Options. (line 755)
+* output encoding, EBCDIC: Groff Options. (line 755)
+* output encoding, ISO 646: Groff Options. (line 743)
+* output encoding, Latin-1 (ISO 8859-1): Groff Options. (line 747)
+* output encoding, UTF-8: Groff Options. (line 751)
+* output glyphs, and input characters, compatibility with AT&T troff: Other Differences.
+ (line 12609)
+* output line break: Breaking. (line 3725)
+* output line number register (ln): Miscellaneous. (line 11820)
+* output line properties: Manipulating Filling and Adjustment.
+ (line 5644)
+* output line, continuation (\c): Line Continuation. (line 7048)
+* output line, horizontal position, register (.k): Page Motions.
+ (line 10093)
+* output node: Gtroff Internals. (line 11970)
+* output request, and copy mode: Diversions. (line 11106)
+* output request, and \!: Diversions. (line 11106)
+* output, filling, disablement of (nf): Manipulating Filling and Adjustment.
+ (line 5692)
+* output, filling, enablement of (fi): Manipulating Filling and Adjustment.
+ (line 5685)
+* output, flush (fl): Debugging. (line 12167)
+* output, gtroff: gtroff Output. (line 12680)
+* output, intermediate: gtroff Output. (line 12690)
+* output, suppressing (\O): Suppressing Output.
+ (line 11410)
+* output, transparent (cf, trf): I/O. (line 11521)
+* output, transparent (\!, \?): Diversions. (line 11066)
+* output, transparent, incompatibilities with AT&T troff: Other Differences.
+ (line 12636)
+* output, troff: gtroff Output. (line 12690)
+* overlapping characters: Using Symbols. (line 7882)
+* overstriking glyphs (\o): Page Motions. (line 10097)
+* p scaling unit: Measurements. (line 4255)
+* P scaling unit: Measurements. (line 4259)
+* package, macro: Macro Packages. (line 3963)
+* package, macro, auxiliary: Major Macro Packages.
+ (line 1408)
+* package, macro, full-service: Major Macro Packages.
+ (line 1397)
+* package, macro, introduction: Macro Package Intro.
+ (line 316)
+* package, macro, major: Major Macro Packages.
+ (line 1394)
+* package, macro, minor: Major Macro Packages.
+ (line 1408)
+* package, macro, search path: Macro Directories. (line 900)
+* package, package, structuring the source of: Invoking Requests.
+ (line 4803)
+* padding character, for fields (fc): Fields. (line 6692)
+* page: Page Geometry. (line 4175)
+* page break: Page Geometry. (line 4208)
+* page break <1>: Page Control. (line 7170)
+* page break <2>: The Implicit Page Trap.
+ (line 10638)
+* page break (introduction): Basics. (line 1185)
+* page break, conditional (ne): Page Control. (line 7195)
+* page break, final: End-of-input Traps.
+ (line 10834)
+* page break, prevented by vpt: Vertical Position Traps.
+ (line 10414)
+* page control: Page Control. (line 7170)
+* page ejection: Page Geometry. (line 4208)
+* page ejection <1>: Page Control. (line 7170)
+* page ejection <2>: The Implicit Page Trap.
+ (line 10638)
+* page ejection status register (.pe): Page Location Traps.
+ (line 10598)
+* page ejection, of final page: End-of-input Traps.
+ (line 10834)
+* page ejection, prevented by vpt: Vertical Position Traps.
+ (line 10414)
+* page footers: Page Location Traps.
+ (line 10440)
+* page headers: Page Location Traps.
+ (line 10440)
+* page layout: Page Layout. (line 7087)
+* page layout [ms]: ms Page Layout. (line 3045)
+* page length register (.p): Page Layout. (line 7101)
+* page length, configuring (pl): Page Layout. (line 7093)
+* page location traps: Page Location Traps.
+ (line 10420)
+* page location traps, debugging: Page Location Traps.
+ (line 10476)
+* page location, vertical, marking (mk): Page Motions. (line 9868)
+* page location, vertical, returning to marked (rt): Page Motions.
+ (line 9868)
+* page motions: Page Motions. (line 9863)
+* page number character (%): Page Layout. (line 7120)
+* page number character, changing (pc): Page Layout. (line 7149)
+* page number register (%): Page Control. (line 7188)
+* page number, configuring next (pn): Page Layout. (line 7107)
+* page number, next, register (.pn): Page Layout. (line 7112)
+* page offset: Page Geometry. (line 4193)
+* page offset (po): Line Layout. (line 6870)
+* page orientation, landscape: Paper Format. (line 972)
+* page, geometry of: Page Geometry. (line 4162)
+* page, new (bp): Page Control. (line 7178)
+* paper format: Paper Format. (line 972)
+* paper size: Paper Format. (line 972)
+* paragraphs: Paragraphs. (line 1220)
+* parameter count register (.$): Parameters. (line 9594)
+* parameters: Parameters. (line 9586)
+* parameters, and compatibility mode: Gtroff Internals. (line 12054)
+* parameters, macro (\$): Parameters. (line 9616)
+* parentheses: Numeric Expressions.
+ (line 4446)
+* partially collected line: Manipulating Filling and Adjustment.
+ (line 5644)
+* path, for font files: Font Directories. (line 942)
+* path, for tmac files: Macro Directories. (line 900)
+* pattern files, for hyphenation: Manipulating Hyphenation.
+ (line 6116)
+* patterns for hyphenation (hpf): Manipulating Hyphenation.
+ (line 6170)
+* pending output line: Manipulating Filling and Adjustment.
+ (line 5644)
+* pi request, and groff: I/O. (line 11629)
+* pi request, and safer mode: Groff Options. (line 707)
+* pi request, disabled by default: Safer Mode. (line 12395)
+* pica scaling unit (P): Measurements. (line 4259)
+* PID of GNU troff register ($$): Built-in Registers.
+ (line 5571)
+* pile, glyph (\b): Drawing Geometric Objects.
+ (line 10308)
+* pl request, using + and - with: Numeric Expressions.
+ (line 4463)
+* plain text approximation output register (.A): Groff Options.
+ (line 521)
+* plain text approximation output register (.A) <1>: Built-in Registers.
+ (line 5527)
+* planting a trap: Traps. (line 10393)
+* platform-specific directory: Macro Directories. (line 915)
+* pm request, incompatibilities with AT&T troff: Other Differences.
+ (line 12600)
+* pn request, using + and - with: Numeric Expressions.
+ (line 4463)
+* PNG image generation from PostScript: DESC File Format. (line 13449)
+* po request, using + and - with: Numeric Expressions.
+ (line 4463)
+* point scaling unit (p): Measurements. (line 4255)
+* point size registers (.s, .ps): Changing the Type Size.
+ (line 8480)
+* point size registers, last-requested (.psr, .sr): Using Fractional Type Sizes.
+ (line 8638)
+* point sizes, changing (ps, \s): Changing the Type Size.
+ (line 8466)
+* point sizes, fractional: Using Fractional Type Sizes.
+ (line 8597)
+* point sizes, fractional <1>: Other Differences. (line 12587)
+* polygon, filled, drawing (\D'P ...'): Drawing Geometric Objects.
+ (line 10275)
+* polygon, outlined, drawing (\D'p ...'): Drawing Geometric Objects.
+ (line 10269)
+* polygon, solid, drawing (\D'P ...'): Drawing Geometric Objects.
+ (line 10275)
+* polygon, stroked, drawing (\D'p ...'): Drawing Geometric Objects.
+ (line 10269)
+* position of lowest text line (.h): Diversions. (line 11007)
+* position, absolute (sic) operator (|): Numeric Expressions.
+ (line 4471)
+* position, drawing: Page Geometry. (line 4181)
+* position, horizontal input line, saving (\k): Page Motions.
+ (line 10084)
+* position, horizontal, in input line, register (hp): Page Motions.
+ (line 10090)
+* position, horizontal, in output line, register (.k): Page Motions.
+ (line 10093)
+* position, mounting: Using Fonts. (line 7295)
+* position, vertical, in diversion, register (.d): Diversions.
+ (line 11000)
+* positions, font: Font Positions. (line 7540)
+* post-vertical line spacing: Changing the Vertical Spacing.
+ (line 8572)
+* post-vertical line spacing register (.pvs): Changing the Vertical Spacing.
+ (line 8584)
+* post-vertical line spacing, changing (pvs): Changing the Vertical Spacing.
+ (line 8584)
+* postprocessor access: Postprocessor Access.
+ (line 11729)
+* postprocessors: Output Device Intro.
+ (line 359)
+* PostScript, bounding box: Miscellaneous. (line 11949)
+* PostScript, PNG image generation: DESC File Format. (line 13449)
+* prefix, for commands: Environment. (line 835)
+* preprocessors: Preprocessor Intro.
+ (line 328)
+* previous font, selecting (ft): Selecting Fonts. (line 7352)
+* previous font, selecting (\f[], \fP): Selecting Fonts. (line 7378)
+* previous line length (.n): Environments. (line 11403)
+* print current page register (.P): Groff Options. (line 670)
+* printing backslash (\\, \e, \E, \[rs]): Other Differences.
+ (line 12636)
+* printing line numbers (nm): Miscellaneous. (line 11798)
+* printing to stderr (tm, tm1, tmc): Debugging. (line 12117)
+* printing, zero-width (\z, \Z): Page Motions. (line 10102)
+* printing, zero-width (\z, \Z) <1>: Page Motions. (line 10107)
+* process ID of GNU troff register ($$): Built-in Registers.
+ (line 5571)
+* processing next file (nx): I/O. (line 11553)
+* productive input line: Manipulating Filling and Adjustment.
+ (line 5797)
+* properties of characters (cflags): Using Symbols. (line 7846)
+* properties of glyphs (cflags): Using Symbols. (line 7846)
+* properties of output lines: Manipulating Filling and Adjustment.
+ (line 5644)
+* ps request, and constant glyph space mode: Artificial Fonts.
+ (line 8241)
+* ps request, incompatibilities with AT&T troff: Other Differences.
+ (line 12587)
+* ps request, using + and - with: Numeric Expressions.
+ (line 4463)
+* ps request, with fractional type sizes: Using Fractional Type Sizes.
+ (line 8604)
+* pso request, and safer mode: Groff Options. (line 707)
+* pvs request, using + and - with: Numeric Expressions.
+ (line 4463)
+* quanta, motion: Motion Quanta. (line 4292)
+* quantum, horizontal motion: DESC File Format. (line 13445)
+* quantum, vertical motion: DESC File Format. (line 13553)
+* radicalex glyph, and cflags: Using Symbols. (line 7882)
+* ragged-left text: Manipulating Filling and Adjustment.
+ (line 5723)
+* ragged-right text: Manipulating Filling and Adjustment.
+ (line 5720)
+* rc request, and glyph definitions: Using Symbols. (line 7948)
+* read-only register removal, incompatibility with AT&T troff: Other Differences.
+ (line 12571)
+* read-only register, changing format: Assigning Register Formats.
+ (line 5472)
+* reading from standard input (rd): I/O. (line 11558)
+* recursive macros: while. (line 9359)
+* refer, and macro names starting with [ or ]: Identifiers. (line 4623)
+* reference, gtroff: GNU troff Reference.
+ (line 3549)
+* references [ms]: ms Insertions. (line 2844)
+* register format, in expressions: Assigning Register Formats.
+ (line 5484)
+* register, assigning number format to (af): Assigning Register Formats.
+ (line 5413)
+* register, built-in, removing: Built-in Registers.
+ (line 5513)
+* register, creating alias for (aln): Setting Registers. (line 5323)
+* register, format (\g): Assigning Register Formats.
+ (line 5479)
+* register, read-only, removal, incompatibility with AT&T troff: Other Differences.
+ (line 12571)
+* register, removing (rr): Setting Registers. (line 5312)
+* register, removing alias for (rr): Setting Registers. (line 5329)
+* register, renaming (rnn): Setting Registers. (line 5318)
+* registers: Registers. (line 5210)
+* registers, built-in: Built-in Registers.
+ (line 5508)
+* registers, dumping (pnr): Debugging. (line 12158)
+* registers, interpolating (\n): Interpolating Registers.
+ (line 5335)
+* registers, number of, register (.R): Built-in Registers.
+ (line 5547)
+* registers, setting (nr, \R): Setting Registers. (line 5219)
+* removal of read-only registers, incompatibility with AT&T troff: Other Differences.
+ (line 12571)
+* removing a built-in register: Built-in Registers.
+ (line 5513)
+* removing a register (rr): Setting Registers. (line 5312)
+* removing alias for register (rr): Setting Registers. (line 5329)
+* removing alias, for diversion (rm): Strings. (line 9007)
+* removing alias, for macro (rm): Strings. (line 9007)
+* removing alias, for string (rm): Strings. (line 9007)
+* removing diversion (rm): Strings. (line 8967)
+* removing glyph definition (rchar, rfschar): Using Symbols.
+ (line 8005)
+* removing macro (rm): Strings. (line 8967)
+* removing request (rm): Strings. (line 8967)
+* removing string (rm): Strings. (line 8967)
+* renaming a register (rnn): Setting Registers. (line 5318)
+* renaming diversion (rn): Strings. (line 8964)
+* renaming macro (rn): Strings. (line 8964)
+* renaming request (rn): Strings. (line 8964)
+* renaming string (rn): Strings. (line 8964)
+* renditions, graphic: Using Fonts. (line 7323)
+* request: Requests and Macros.
+ (line 3813)
+* request <1>: Formatter Instructions.
+ (line 4708)
+* request arguments: Invoking Requests. (line 4789)
+* request arguments, and compatibility mode: Gtroff Internals.
+ (line 12054)
+* request arguments, and tabs: Invoking Requests. (line 4789)
+* request, removing (rm): Strings. (line 8967)
+* request, renaming (rn): Strings. (line 8964)
+* request, undefined: Comments. (line 5150)
+* requests for drawing: Drawing Geometric Objects.
+ (line 10130)
+* requests for input and output: I/O. (line 11469)
+* requests, intercepting: Control Characters.
+ (line 4765)
+* requests, invoking: Invoking Requests. (line 4781)
+* requests, modifying: Control Characters.
+ (line 4765)
+* resolution, device: Page Geometry. (line 4169)
+* resolution, device <1>: DESC File Format. (line 13506)
+* resolution, device, obtaining in the formatter: Measurements.
+ (line 4240)
+* resolution, horizontal: DESC File Format. (line 13445)
+* resolution, horizontal, register (.H): Motion Quanta. (line 4299)
+* resolution, vertical: DESC File Format. (line 13553)
+* returning to marked vertical page location (rt): Page Motions.
+ (line 9868)
+* revision number register (.Y): Built-in Registers.
+ (line 5567)
+* right margin: Line Layout. (line 6881)
+* right-aligning lines (introduction): Basics. (line 1182)
+* right-justifying (rj): Manipulating Filling and Adjustment.
+ (line 5866)
+* right-justifying lines (introduction): Basics. (line 1182)
+* rivers: Other Differences. (line 12552)
+* rj request, causing implicit break: Manipulating Filling and Adjustment.
+ (line 5624)
+* rn glyph, and cflags: Using Symbols. (line 7882)
+* roman glyph, correction after italic glyph (\/): Italic Corrections.
+ (line 8328)
+* roman glyph, correction before italic glyph (\,): Italic Corrections.
+ (line 8338)
+* Roman numerals: Assigning Register Formats.
+ (line 5433)
+* Roman numerals, extrema (maximum and minimum): Assigning Register Formats.
+ (line 5465)
+* rq glyph, at end of sentence: Sentences. (line 3663)
+* rq glyph, at end of sentence <1>: Using Symbols. (line 7892)
+* rt request, using + and - with: Numeric Expressions.
+ (line 4463)
+* ru glyph, and cflags: Using Symbols. (line 7882)
+* running system commands: I/O. (line 11633)
+* s scaling unit: Using Fractional Type Sizes.
+ (line 8604)
+* safer mode: Groff Options. (line 707)
+* safer mode <1>: Macro Directories. (line 910)
+* safer mode <2>: Built-in Registers.
+ (line 5555)
+* safer mode <3>: I/O. (line 11504)
+* safer mode <4>: I/O. (line 11616)
+* safer mode <5>: I/O. (line 11638)
+* safer mode <6>: I/O. (line 11677)
+* safer mode <7>: Safer Mode. (line 12395)
+* saving horizontal input line position (\k): Page Motions. (line 10084)
+* scaling indicator: Measurements. (line 4232)
+* scaling operator: Numeric Expressions.
+ (line 4390)
+* scaling unit c: Measurements. (line 4252)
+* scaling unit f: Colors. (line 8712)
+* scaling unit i: Measurements. (line 4249)
+* scaling unit m: Measurements. (line 4277)
+* scaling unit M: Measurements. (line 4287)
+* scaling unit n: Measurements. (line 4281)
+* scaling unit p: Measurements. (line 4255)
+* scaling unit P: Measurements. (line 4259)
+* scaling unit s: Using Fractional Type Sizes.
+ (line 8604)
+* scaling unit u: Measurements. (line 4245)
+* scaling unit v: Measurements. (line 4284)
+* scaling unit z: Using Fractional Type Sizes.
+ (line 8604)
+* searching fonts: Font Directories. (line 934)
+* searching macros: Macro Directories. (line 898)
+* seconds, current time (seconds): Built-in Registers.
+ (line 5580)
+* selecting the previous font (ft): Selecting Fonts. (line 7352)
+* sentence space: Sentences. (line 3619)
+* sentence space size register (.sss): Manipulating Filling and Adjustment.
+ (line 5887)
+* sentences: Sentences. (line 3607)
+* sequence, escape: Formatter Instructions.
+ (line 4714)
+* setting diversion trap (dt): Diversion Traps. (line 10668)
+* setting end-of-input trap (em): End-of-input Traps.
+ (line 10807)
+* setting input line number (lf): Debugging. (line 12103)
+* setting input line trap (it, itc): Input Line Traps. (line 10680)
+* setting registers (nr, \R): Setting Registers. (line 5219)
+* setting the page length (pl): Page Layout. (line 7093)
+* setting up an abstract font style (sty): Font Families. (line 7505)
+* shc request, and translations: Character Translations.
+ (line 6755)
+* site-local directory: Macro Directories. (line 915)
+* site-local directory <1>: Font Directories. (line 957)
+* size of sentence space register (.sss): Manipulating Filling and Adjustment.
+ (line 5887)
+* size of word space register (.ss): Manipulating Filling and Adjustment.
+ (line 5887)
+* size, optical, of a font: Selecting Fonts. (line 7421)
+* size, paper: Paper Format. (line 972)
+* size, size: Manipulating Type Size and Vertical Spacing.
+ (line 8438)
+* sizes, fractional: Other Differences. (line 12587)
+* sizes, fractional type: Using Fractional Type Sizes.
+ (line 8597)
+* skew, of last glyph (.csk): Environments. (line 11388)
+* slant, font, changing (\S): Artificial Fonts. (line 8161)
+* soft hyphen character, setting (shc): Manipulating Hyphenation.
+ (line 6032)
+* soft hyphen glyph (hy): Manipulating Hyphenation.
+ (line 6032)
+* solid circle, drawing (\D'C ...'): Drawing Geometric Objects.
+ (line 10234)
+* solid ellipse, drawing (\D'E ...'): Drawing Geometric Objects.
+ (line 10241)
+* solid polygon, drawing (\D'P ...'): Drawing Geometric Objects.
+ (line 10275)
+* SOURCE_DATE_EPOCH, environment variable: Environment. (line 882)
+* sp request, and no-space mode: Manipulating Spacing.
+ (line 6456)
+* sp request, causing implicit break: Manipulating Filling and Adjustment.
+ (line 5624)
+* space between sentences: Sentences. (line 3619)
+* space between sentences register (.sss): Manipulating Filling and Adjustment.
+ (line 5887)
+* space between words register (.ss): Manipulating Filling and Adjustment.
+ (line 5887)
+* space character, as delimiter: Delimiters. (line 5094)
+* space characters, in expressions: Numeric Expressions.
+ (line 4538)
+* space, between sentences: Manipulating Filling and Adjustment.
+ (line 5893)
+* space, between words: Manipulating Filling and Adjustment.
+ (line 5891)
+* space, discardable, horizontal: Manipulating Filling and Adjustment.
+ (line 5914)
+* space, hair (\^): Page Motions. (line 10008)
+* space, horizontal (\h): Page Motions. (line 9982)
+* space, horizontal, unformatting: Punning Names. (line 11246)
+* space, thin (\|): Page Motions. (line 10003)
+* space, unbreakable (\~): Manipulating Filling and Adjustment.
+ (line 5671)
+* space, unbreakable and unadjustable (\<SP>): Page Motions.
+ (line 9998)
+* space, vertical, unit (v): Measurements. (line 4284)
+* space, width of a digit (numeral) (\0): Page Motions. (line 10014)
+* spaces with ds: Strings. (line 8844)
+* spaces, in a macro argument: Calling Macros. (line 4856)
+* spaces, leading and trailing: Breaking. (line 3757)
+* spacing (introduction): Basics. (line 1150)
+* spacing, manipulating: Manipulating Spacing.
+ (line 6344)
+* spacing, vertical: Page Geometry. (line 4202)
+* spacing, vertical <1>: Manipulating Type Size and Vertical Spacing.
+ (line 8438)
+* spacing, vertical (introduction): Basics. (line 1136)
+* special characters: Sentences. (line 3663)
+* special characters <1>: Character Translations.
+ (line 6741)
+* special characters [ms]: ms Legacy Features.
+ (line 3405)
+* special characters, list of (groff_char(7) man page): Using Symbols.
+ (line 7675)
+* special font: Using Fonts. (line 7280)
+* special fonts: Using Symbols. (line 7612)
+* special fonts <1>: Special Fonts. (line 8092)
+* special fonts <2>: Font Description File Format.
+ (line 13618)
+* special fonts, emboldening: Artificial Fonts. (line 8230)
+* special request, and font translations: Selecting Fonts. (line 7406)
+* special request, and glyph search order: Using Symbols. (line 7612)
+* spline, drawing (\D'~ ...'): Drawing Geometric Objects.
+ (line 10221)
+* springing a trap: Traps. (line 10394)
+* sqrtex glyph, and cflags: Using Symbols. (line 7882)
+* ss request, incompatibilities with AT&T troff: Other Differences.
+ (line 12604)
+* stack: Environments. (line 11273)
+* stacking glyphs (\b): Drawing Geometric Objects.
+ (line 10308)
+* standard input, reading from (rd): I/O. (line 11558)
+* stderr, printing to (tm, tm1, tmc): Debugging. (line 12117)
+* stops, tab: Tabs and Leaders. (line 3785)
+* string arguments: Strings. (line 8802)
+* string comparison: Operators in Conditionals.
+ (line 9108)
+* string expansion (\*): Strings. (line 8802)
+* string interpolation (\*): Strings. (line 8802)
+* string, appending (as): Strings. (line 8889)
+* string, creating alias for (als): Strings. (line 8972)
+* string, length of (length): Strings. (line 8909)
+* string, removing (rm): Strings. (line 8967)
+* string, removing alias for (rm): Strings. (line 9007)
+* string, renaming (rn): Strings. (line 8964)
+* strings: Strings. (line 8780)
+* strings [ms]: ms Legacy Features.
+ (line 3405)
+* strings, multi-line: Strings. (line 8853)
+* strings, shared name space with macros and diversions: Identifiers.
+ (line 4668)
+* stripping final newline in diversions: Punning Names. (line 11246)
+* stroke color: Colors. (line 8678)
+* stroke color name register (.m): Colors. (line 8744)
+* stroked circle, drawing (\D'c ...'): Drawing Geometric Objects.
+ (line 10230)
+* stroked ellipse, drawing (\D'e ...'): Drawing Geometric Objects.
+ (line 10237)
+* stroked polygon, drawing (\D'p ...'): Drawing Geometric Objects.
+ (line 10269)
+* structuring source code of documents or macro packages: Invoking Requests.
+ (line 4803)
+* sty request, and changing fonts: Selecting Fonts. (line 7352)
+* sty request, and font translations: Selecting Fonts. (line 7406)
+* style, font: Using Fonts. (line 7280)
+* style, font, abstract: Using Fonts. (line 7302)
+* style, font, abstract, setting up (sty): Font Families. (line 7505)
+* styles, font: Font Families. (line 7448)
+* substring (substring): Strings. (line 8927)
+* subtraction: Numeric Expressions.
+ (line 4359)
+* suppressing output (\O): Suppressing Output.
+ (line 11410)
+* suppression nesting level register: Suppressing Output.
+ (line 11463)
+* sv request, and no-space mode: Page Control. (line 7233)
+* switching environments (ev): Environments. (line 11309)
+* sy request, and safer mode: Groff Options. (line 707)
+* sy request, disabled by default: Safer Mode. (line 12395)
+* symbol: Using Symbols. (line 7612)
+* symbol table, dumping (pm): Debugging. (line 12154)
+* symbol, defining (char): Using Symbols. (line 7948)
+* symbols, using: Using Symbols. (line 7600)
+* system commands, running: I/O. (line 11633)
+* system() return value register (systat): I/O. (line 11666)
+* tab character: Tabs and Leaders. (line 3785)
+* tab character encoding: Tabs and Fields. (line 6481)
+* tab character, and translations: Character Translations.
+ (line 6751)
+* tab character, as delimiter: Delimiters. (line 5094)
+* tab character, non-interpreted (\t): Tabs and Fields. (line 6485)
+* tab repetition character (tc): Tabs and Fields. (line 6602)
+* tab stop settings register (.tabs): Tabs and Fields. (line 6593)
+* tab stops: Tabs and Leaders. (line 3785)
+* tab stops, default: Tabs and Fields. (line 6493)
+* tab, line-tabs mode: Tabs and Fields. (line 6615)
+* table of contents: Table of Contents. (line 1323)
+* table of contents <1>: Leaders. (line 6671)
+* table of contents, creating [ms]: ms TOC. (line 3139)
+* table, multi-page, example [ms]: ms Insertions. (line 2886)
+* tables [ms]: ms Insertions. (line 2844)
+* tabs, and fields: Tabs and Fields. (line 6481)
+* tabs, and macro arguments: Invoking Requests. (line 4789)
+* tabs, and request arguments: Invoking Requests. (line 4789)
+* tabs, before comments: Comments. (line 5145)
+* tagged paragraphs: Paragraphs. (line 1228)
+* tags, paragraph: Paragraphs. (line 1228)
+* terminal, conditional output for: Operators in Conditionals.
+ (line 9053)
+* text baseline: Page Geometry. (line 4184)
+* text baseline <1>: Manipulating Type Size and Vertical Spacing.
+ (line 8438)
+* text font: Using Fonts. (line 7280)
+* text line: Requests and Macros.
+ (line 3826)
+* text line, position of lowest (.h): Diversions. (line 11007)
+* text, GNU troff processing: Text. (line 3556)
+* text, justifying: Manipulating Filling and Adjustment.
+ (line 5624)
+* text, justifying (rj): Manipulating Filling and Adjustment.
+ (line 5866)
+* thickness of lines (\D't ...'): Drawing Geometric Objects.
+ (line 10298)
+* thin space (\|): Page Motions. (line 10003)
+* three-part title (tl): Page Layout. (line 7120)
+* ti request, causing implicit break: Manipulating Filling and Adjustment.
+ (line 5624)
+* ti request, using + and - with: Numeric Expressions.
+ (line 4463)
+* time, current, hours (hours): Built-in Registers.
+ (line 5586)
+* time, current, minutes (minutes): Built-in Registers.
+ (line 5583)
+* time, current, seconds (seconds): Built-in Registers.
+ (line 5580)
+* time, formatting: I/O. (line 11656)
+* title length, configuring (lt): Page Layout. (line 7137)
+* title line length register (.lt): Page Layout. (line 7146)
+* title line, formatting (tl): Page Layout. (line 7120)
+* titles: Page Layout. (line 7115)
+* tkf request, and font styles: Font Families. (line 7505)
+* tkf request, and font translations: Selecting Fonts. (line 7406)
+* tkf request, with fractional type sizes: Using Fractional Type Sizes.
+ (line 8604)
+* tl request, and mc: Miscellaneous. (line 11901)
+* tmac, directory: Macro Directories. (line 900)
+* tmac, path: Macro Directories. (line 900)
+* TMPDIR, environment variable: Environment. (line 869)
+* token, input: Gtroff Internals. (line 11970)
+* top margin: Page Location Traps.
+ (line 10440)
+* top-level diversion: Diversions. (line 10930)
+* top-level diversion, and bp: Page Control. (line 7183)
+* top-level diversion, and \!: Diversions. (line 11098)
+* top-level diversion, and \?: Diversions. (line 11103)
+* tr request, and glyph definitions: Using Symbols. (line 7948)
+* tr request, and soft hyphen character: Manipulating Hyphenation.
+ (line 6032)
+* tr request, incompatibilities with AT&T troff: Other Differences.
+ (line 12609)
+* track kerning: Ligatures and Kerning.
+ (line 8300)
+* track kerning, activating (tkf): Ligatures and Kerning.
+ (line 8307)
+* trailing double quotes in strings: Strings. (line 8844)
+* trailing spaces in string definitions and appendments: Strings.
+ (line 8823)
+* trailing spaces on text lines: Breaking. (line 3757)
+* translations of characters: Character Translations.
+ (line 6722)
+* transparent characters: Using Symbols. (line 7892)
+* transparent dummy character (\)): Dummy Characters. (line 8407)
+* transparent output (cf, trf): I/O. (line 11521)
+* transparent output (\!, \?): Diversions. (line 11066)
+* transparent output, incompatibilities with AT&T troff: Other Differences.
+ (line 12636)
+* trap: Deferring Output. (line 10337)
+* trap, changing location (ch): Page Location Traps.
+ (line 10528)
+* trap, distance to next vertical position, register (.t): Page Location Traps.
+ (line 10520)
+* trap, diversion, setting (dt): Diversion Traps. (line 10668)
+* trap, end-of-input, setting (em): End-of-input Traps.
+ (line 10807)
+* trap, implicit: The Implicit Page Trap.
+ (line 10638)
+* trap, input line, clearing (it, itc): Input Line Traps. (line 10680)
+* trap, input line, setting (it, itc): Input Line Traps. (line 10680)
+* trap, planting: Traps. (line 10393)
+* trap, springing: Traps. (line 10394)
+* traps: Traps. (line 10387)
+* traps, and diversions: Page Location Traps.
+ (line 10618)
+* traps, blank line: Blank Line Traps. (line 10778)
+* traps, diversion: Diversion Traps. (line 10663)
+* traps, end-of-input: End-of-input Traps.
+ (line 10806)
+* traps, input line: Input Line Traps. (line 10678)
+* traps, input line, and interrupted lines (itc): Input Line Traps.
+ (line 10704)
+* traps, leading space: Leading Space Traps.
+ (line 10788)
+* traps, page location: Page Location Traps.
+ (line 10420)
+* traps, page location, dumping (ptr): Debugging. (line 12162)
+* traps, page location, listing (ptr): Debugging. (line 12162)
+* traps, sprung by bp request (.pe): Page Location Traps.
+ (line 10598)
+* traps, vertical position: Vertical Position Traps.
+ (line 10399)
+* trf request, and copy mode: I/O. (line 11521)
+* trf request, and invalid characters: I/O. (line 11533)
+* trf request, causing implicit break: Manipulating Filling and Adjustment.
+ (line 5624)
+* trin request, and asciify: Diversions. (line 11120)
+* troff mode: troff and nroff Modes.
+ (line 6813)
+* troff output: gtroff Output. (line 12690)
+* truncated vertical space register (.trunc): Page Location Traps.
+ (line 10587)
+* truncating division: Numeric Expressions.
+ (line 4359)
+* TTY, conditional output for: Operators in Conditionals.
+ (line 9053)
+* tutorial for macro users: Tutorial for Macro Users.
+ (line 1046)
+* type size: Manipulating Type Size and Vertical Spacing.
+ (line 8438)
+* type size registers (.s, .ps): Changing the Type Size.
+ (line 8480)
+* type size registers, last-requested (.psr, .sr): Using Fractional Type Sizes.
+ (line 8638)
+* type sizes, changing (ps, \s): Changing the Type Size.
+ (line 8466)
+* type sizes, fractional: Using Fractional Type Sizes.
+ (line 8597)
+* type sizes, fractional <1>: Other Differences. (line 12587)
+* typeface: Using Fonts. (line 7280)
+* TZ, environment variable: Environment. (line 889)
+* u scaling unit: Measurements. (line 4245)
+* uf request, and font styles: Font Families. (line 7505)
+* ul glyph, and cflags: Using Symbols. (line 7882)
+* ul request, and font translations: Selecting Fonts. (line 7406)
+* Ultrix-specific man macros: Optional man extensions.
+ (line 1451)
+* unadjustable and unbreakable space (\<SP>): Page Motions. (line 9998)
+* unary arithmetic operators: Numeric Expressions.
+ (line 4365)
+* unbreakable and unadjustable space (\<SP>): Page Motions. (line 9998)
+* unbreakable space (\~): Manipulating Filling and Adjustment.
+ (line 5671)
+* undefined identifiers: Identifiers. (line 4656)
+* undefined request: Comments. (line 5150)
+* underline font (uf): Artificial Fonts. (line 8206)
+* underlining (ul): Artificial Fonts. (line 8180)
+* underlining, continuous (cu): Artificial Fonts. (line 8202)
+* unformatting diversions (asciify): Diversions. (line 11120)
+* unformatting horizontal space: Punning Names. (line 11246)
+* Unicode: Identifiers. (line 4581)
+* Unicode <1>: Using Symbols. (line 7810)
+* unit, scaling, c: Measurements. (line 4252)
+* unit, scaling, f: Colors. (line 8712)
+* unit, scaling, i: Measurements. (line 4249)
+* unit, scaling, m: Measurements. (line 4277)
+* unit, scaling, M: Measurements. (line 4287)
+* unit, scaling, n: Measurements. (line 4281)
+* unit, scaling, p: Measurements. (line 4255)
+* unit, scaling, P: Measurements. (line 4259)
+* unit, scaling, s: Using Fractional Type Sizes.
+ (line 8604)
+* unit, scaling, u: Measurements. (line 4245)
+* unit, scaling, v: Measurements. (line 4284)
+* unit, scaling, z: Using Fractional Type Sizes.
+ (line 8604)
+* units of measurement: Measurements. (line 4232)
+* units, basic: Page Geometry. (line 4169)
+* units, basic, conversion to: Measurements. (line 4239)
+* units, default: Default Units. (line 4318)
+* units, machine: Page Geometry. (line 4169)
+* unnamed glyphs: Using Symbols. (line 7820)
+* unnamed glyphs, accessing with \N: Font Description File Format.
+ (line 13639)
+* unsafe mode: Groff Options. (line 783)
+* unsafe mode <1>: Macro Directories. (line 910)
+* unsafe mode <2>: Built-in Registers.
+ (line 5555)
+* unsafe mode <3>: I/O. (line 11504)
+* unsafe mode <4>: I/O. (line 11616)
+* unsafe mode <5>: I/O. (line 11638)
+* unsafe mode <6>: I/O. (line 11677)
+* unstyled font: Using Fonts. (line 7280)
+* up-casing a string (stringup): Strings. (line 8945)
+* uppercasing a string (stringup): Strings. (line 8945)
+* upright glyph, correction after oblique glyph (\/): Italic Corrections.
+ (line 8328)
+* upright glyph, correction before oblique glyph (\,): Italic Corrections.
+ (line 8338)
+* URLs, breaking (\:): Manipulating Hyphenation.
+ (line 6008)
+* user's macro tutorial: Tutorial for Macro Users.
+ (line 1046)
+* user's tutorial for macros: Tutorial for Macro Users.
+ (line 1046)
+* using escape sequences: Using Escape Sequences.
+ (line 4942)
+* using symbols: Using Symbols. (line 7600)
+* UTF-8 output encoding: Groff Options. (line 751)
+* v scaling unit: Measurements. (line 4284)
+* valid numeric expression: Numeric Expressions.
+ (line 4522)
+* value, incrementing without changing the register: Auto-increment.
+ (line 5403)
+* variables in environment: Environment. (line 827)
+* vee: Page Geometry. (line 4202)
+* vee scaling unit (v): Measurements. (line 4284)
+* version number, major, register (.x): Built-in Registers.
+ (line 5559)
+* version number, minor, register (.y): Built-in Registers.
+ (line 5563)
+* vertical drawing position (nl): Page Control. (line 7240)
+* vertical line drawing (\L): Drawing Geometric Objects.
+ (line 10168)
+* vertical line spacing register (.v): Changing the Vertical Spacing.
+ (line 8543)
+* vertical line spacing, changing (vs): Changing the Vertical Spacing.
+ (line 8543)
+* vertical line spacing, effective value: Changing the Vertical Spacing.
+ (line 8558)
+* vertical motion (\v): Page Motions. (line 9938)
+* vertical motion quantum: DESC File Format. (line 13553)
+* vertical page location, marking (mk): Page Motions. (line 9868)
+* vertical page location, returning to marked (rt): Page Motions.
+ (line 9868)
+* vertical position in diversion register (.d): Diversions. (line 11000)
+* vertical position trap enable register (.vpt): Vertical Position Traps.
+ (line 10407)
+* vertical position traps: Vertical Position Traps.
+ (line 10399)
+* vertical position traps, enabling (vpt): Vertical Position Traps.
+ (line 10407)
+* vertical position, drawing (nl): Page Control. (line 7240)
+* vertical resolution: DESC File Format. (line 13553)
+* vertical space unit (v): Measurements. (line 4284)
+* vertical spacing: Page Geometry. (line 4202)
+* vertical spacing <1>: Manipulating Type Size and Vertical Spacing.
+ (line 8438)
+* vertical spacing (introduction): Basics. (line 1136)
+* warning categories: Warnings. (line 12250)
+* warning level (warn): Debugging. (line 12227)
+* warnings: Debugging. (line 12222)
+* warnings <1>: Warnings. (line 12241)
+* what is groff?: What Is groff?. (line 264)
+* while: while. (line 9327)
+* while request, and font translations: Selecting Fonts. (line 7406)
+* while request, and the ! operator: Numeric Expressions.
+ (line 4365)
+* while request, confusing with br: while. (line 9393)
+* while request, operators to use with: Operators in Conditionals.
+ (line 9027)
+* widow: Page Control. (line 7203)
+* widow <1>: Page Control. (line 7222)
+* width escape (\w): Page Motions. (line 10027)
+* width, of last glyph (.w): Environments. (line 11388)
+* word space size register (.ss): Manipulating Filling and Adjustment.
+ (line 5887)
+* word, definition of: Filling. (line 3581)
+* write request, and copy mode: I/O. (line 11683)
+* writec request, and copy mode: I/O. (line 11683)
+* writem request, and copy mode: I/O. (line 11697)
+* writing macros: Writing Macros. (line 9410)
+* writing to file (write, writec): I/O. (line 11683)
+* year, current, register (year, yr): Built-in Registers.
+ (line 5598)
+* z scaling unit: Using Fractional Type Sizes.
+ (line 8604)
+* zero-width printing (\z, \Z): Page Motions. (line 10102)
+* zero-width printing (\z, \Z) <1>: Page Motions. (line 10107)
+* zoom factor of a font (fzoom): Selecting Fonts. (line 7421)
+
diff --git a/doc/me-revisions b/doc/me-revisions
new file mode 100644
index 0000000..50913f9
--- /dev/null
+++ b/doc/me-revisions
@@ -0,0 +1,261 @@
+8.1 Sat Jun 5 14:06:23 1993 UTC bostic
+-- 4.4BSD snapshot (revision 8.1); add 1993 to copyright
+
+2.37 Sat Oct 26 22:29:25 1991 UTC eric
+-- have .rn (in @h) check to see that the temp macros are defined
+ first -- for SoftQuad troff, per Rick Adam's request
+
+2.36 Mon Oct 7 20:57:46 1991 UTC cael
+-- modify pathname
+
+2.35 Wed Apr 17 15:31:46 1991 UTC bostic
+-- new copyright; att/bsd/shared
+
+2.34 Sat Jun 2 18:30:49 1990 UTC karels
+-- reorg: move me library directory
+
+2.33 Wed Jan 4 10:54:00 1989 UTC karels
+-- don't use bold if \n(pf is >4 but not 8 (allow pf to be, eg, 5)
+
+2.32 Fri Sep 30 10:19:15 1988 UTC bostic
+-- update to new copyright notices
+
+2.31 Sat May 21 15:12:44 1988 UTC bostic
+-- don't strip copyright notice
+
+2.30 Thu May 19 17:21:40 1988 UTC bostic
+-- written by Eric Allman; add Berkeley specific header
+
+2.29 Fri Apr 22 10:48:37 1988 UTC karels
+-- allow .PS to support old or new pic (new uses units of inches)
+
+2.28 12 May 86
+-- Fix footnotes if no -rv flag specified
+
+2.27 17 Apr 86
+-- Assume non-C/A/T typesetters -- use -rv2 to get old function
+
+2.26 27 Mar 86
+-- Always go into fill mode in .sh; necessary to get output format
+ correct.
+
+2.25 3 Mar 86
+-- Drop basic unit scaling on .sz and .ps requests; this confuses some
+ versions of troff.
+
+2.24 7 Jan 86
+-- Merge ditroff and troff versions.
+-- Add support for pic, gremlin, and ideal.
+-- Add .lh macro to print a letterhead.
+-- Adjust .bi (bold italics) to be more device resolution independent.
+
+2.23 23 Jun 85
+-- Allow .]< to initialize refer macros (as well as .]-).
+
+2.22 27 Apr 85
+-- Fix incorrect comment strip in $p macro.
+-- Drop into fill mode in .TS so that text boxes will work properly.
+
+2.21 4 Mar 85
+-- Change \*- macro from \- to \(em in troff.
+-- Change block indent (\n(bi) from 4n to 4m to look better in troff.
+
+2.20 18 Feb 85
+-- Don't reset ii register in .bu or .np
+
+2.19 14 Feb 85
+-- add .bu and .sm macros (bullet and smaller).
+-- have .np take a fixed .ip width.
+
+2.18 14 Feb 85
+-- Avoid cut marks on laser printers.
+
+2.17 14 Feb 85
+-- Some bug fixes as reported from many places.
+
+2.16 11 Oct 84
+-- Improve some tracing.
+-- Minor improvements from rrh.
+
+2.15 10 Apr 83
+-- Fix a name conflict between .sh and floating keeps (as suggested
+ by Hy Murviet).
+
+2.14 28 Dec 81
+-- Integrate the refer macros into -me. This is basically a cheap
+ and dirty modification of the -ms version, and is probably not
+ terribly compatible with the usual -me standards. This can be
+ tuned later if needed.
+
+2.13 22 Dec 81
+-- Allow the -rb<x> flag to set the font you want for bold font --
+ set it to font <x>. Default 2 (italic) in nroff, 3 (bold) in
+ troff.
+
+2.12 20 Mar 81
+-- Remove silly "." at top of page on dumb terminals -- lpr is smarter
+ now.
+
+2.11 19 Mar 81
+-- Fixed indexes to indent on second line.
+
+2.10 26 Feb 81
+-- Improvement to nested index solution, now works for ()b & ()z.
+
+2.9 10 Dec 80
+-- More stuff to make indices inside keeps work correctly.
+
+2.8 10 Nov 80
+-- Had .)c do a .br to insure that the final line is forced out.
+
+2.7 24 Sep 80
+-- Fixed bug in 2.6
+
+2.6 23 Sep 80
+-- Fixed problem introduced by 2.2 which occurred in footnotes and
+ index entries in filled keeps
+
+2.5 29 Aug 80
+-- Changed umlaut to not be so tricky -- it seems to backfire.
+
+2.4 25 Aug 80
+-- Fixed bug in indices caused by 2.2.
+
+2.3 20 Aug 80
+-- Fixed bug in footnotes caused by 2.2.
+-- Changed temp file names that macros that do dynamic loading rename
+ themselves to. For example, if you say '.TS ... .(f' when both of
+ them have been used for the first time, the @T macro got used twice.
+
+2.2 18 Aug 80
+-- Suspended footnote & index processing until final output
+ (so that they will work properly in keeps).
+
+2.1 18 Aug 80
+-- Release 2. No changes.
+
+Mod 28 18 Aug 80
+-- If \nv is set on entry, handle .po differently (for vtroff).
+-- Allow ".nr fi 0".
+
+Mod 27 30 Jun 80
+-- Put in a cludge to try to make multi-columned output work
+ with wide floating keeps. Moves all wide keeps to the top
+ of the next real page.
+
+Mod 26 9 Nov 79
+-- Fixed footnote bug that caused the first line of footnotes
+ that were broken across a page to be indented.
+
+Mod 25 1 Oct 79
+-- Fixed footnote bug that caused footnotes invoked at the
+ top of pages to come out in bold font.
+-- Fixed equation bug that caused equations at the top of
+ page to be improperly centered.
+
+Mod 24 27 Sep 79
+-- Changed delimiter in all \w's to " from ', to allow for
+ apostrophes in labels.
+-- Increased footnote fudge factor.
+-- Changed \x factor in \*[ & \*< to be one half previous value.
+
+Mod 23 24 Aug 79
+-- Changed .ip to start new line if the tag is too long for
+ the space provided.
+
+Mod 22 11 Jul 79
+-- Changed .ac to handle new paper (with second parameter
+ == "*").
+
+Mod 21 24 Apr 79
+-- Changed \*[ and \*< to use \x -- to avoid line overlap.
+
+Mod 20 6 Apr 79
+-- Changed 12-pitch DTC terminals to still space 1/6 inch (instead
+ of 1/8 inch), unless the 'x' register is non-zero -- do-able with
+ the -rx1 option on the nroff command line.
+
+Mod 19 28 Mar 79
+-- Had .ep do a .rs, to avoid occasional problems (like with
+ .+c (again).
+-- Added the 'X' register: if non-zero on startup on a 12-pitch
+ terminal, it outputs 6 LPI instead of 8 LPI.
+
+Mod 18 26 Mar 79
+-- Had .+c reset indent, to solve problems of prelim material
+ after a .ip (as with references)
+
+Mod 17 19 Mar 79
+-- Fixed a bug in .++ which caused it to renumber pages incorrectly,
+ the result of nroff starting a new page immediately upon reaching
+ the end of the previous page (damn!).
+
+Mod 16 8 Mar 79
+-- Fixed a bug in .++ which caused it to change page number formats
+ before forcing out the page.
+-- Changed tmac.e so that extra '.so's to the package will next to
+ 'null.me'.
+-- Changed .sh so that a title of "_" will cause section depth change
+ side-effects only (base indent will remain the same, and no output
+ will occur).
+
+Mod 15a 7 Mar 79
+-- Fixed a bug in Mod 15 which caused .ip's to fail.
+
+Mod 15 2 Mar 79
+-- Changed .@p to do paragraph indents normally in keeps, which
+ will override the indent parameter in keeps with paragraph
+ forms in them (use .ba to fix this).
+
+Mod 14 23 Feb 79
+-- Fixed .ip so it would hyphenate correctly.
+
+Mod 13 16 Feb 79
+-- Added .rs before eqn title output to fix vertical centering
+ problem.
+
+Mod 12 15 Feb 79
+-- Changed NROFF bold font to be regular .ul (.cu is a pain).
+-- Changed .sh to output regular spaces instead of unpaddable
+ spaces.
+-- Fixed bug in .1c with bad line length (didn't reset \n($l).
+
+Mod 11 13 Feb 79
+-- Added hook to .$c to call .$C (for index entries or whatever).
+
+Mod 10 12 Feb 79
+-- Had .xp print in current environment and not reset to single
+ spacing, to allow more control over output format.
+
+Mod 9 26 Dec 78
+-- Fixed yet another problem with equation spacing.
+
+Mod 8 18 Dec 78
+-- Fixed .@q to solve a problem with \n(dn getting lost on
+ equations at top of page.
+
+Mod 7 11 Dec 78
+-- Had .@q (equation output) move to end of equation after
+ equation output (eqn doesn't seem to space quite right).
+
+Mod 6 27 Nov 78
+-- Fixed the umlaut on DTC output to be prettier.
+
+Mod 5 5 Nov 78
+-- Fixed a bug with the second parameter to .ip.
+
+Mod 4 2 Nov 78
+-- Added .uh command (unnumbered heading).
+-- Changed .$p and .sh accordingly.
+
+Mod 3 2 Oct 78
+-- Fixed .ne command in .$p (print section headings).
+
+Mod 2 25 Sep 78
+-- Changed .np to use () instead of [].
+
+Mod 1 12 Sep 78
+-- Fixed footnote fudge factor (curse NROFF!!)
+-- Put "needs" on .(z, .)z.
+
+Mod 0 11 Sep 78
diff --git a/doc/meintro.me.in b/doc/meintro.me.in
new file mode 100644
index 0000000..ac23ce6
--- /dev/null
+++ b/doc/meintro.me.in
@@ -0,0 +1,2266 @@
+.\" groff -me
+.\"
+.\" Copyright (c) 1986, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in
+.\" the documentation and/or other materials provided with the
+.\" distribution.
+.\" 3. [Deleted. See
+.\" ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change]
+.\" 4. Neither the name of the University nor the names of its
+.\" contributors may be used to endorse or promote products derived
+.\" from this software without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS"
+.\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+.\" PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
+.\" CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)intro.me 8.2 (Berkeley) 06/01/94
+.\"
+.\" Modified for groff by jjc@jclark.com.
+.\"UC 7
+.if t .ll 6.5i
+.if t .lt 6.5i
+.nr sx 0
+.ds MO @VERSION@
+.nr si 3n
+.he 'Using \f(BIgroff\fP and \f(BI\-me\fP''%'
+.\"eh 'USD:19-%''Writing Papers with NROFF using \-me'
+.\"oh 'Writing Papers with NROFF using \-me''USD:19-%'
+.ds U Unix
+.ds N \fInroff\fP
+.ds T \fItroff\fP
+.ds G \fIgroff\fP
+.ds UG groff\" upright "groff" for use in slanted contexts
+.+c
+.(l C
+.sz 14
+.b "Writing Papers with \f(BIgroff\fP using \f(BI\-me\fP"
+.sz
+.sp 2
+.ul
+Eric P. Allman
+.sp
+Project INGRES
+Electronics Research Laboratory
+University of California, Berkeley
+Berkeley, California 94720
+.sp 2
+.i "Modified for \fR\*(UG\fP by James Clark*"
+.(f
+* This document applies to the version of the \-me macros
+included with \*G version \*(MO.
+.)f
+.)l
+.sp 4
+.pp
+This document describes
+the text processing facilities
+available on \*U
+and other
+operating systems
+via \*G and the
+\-me
+macro package.
+It is assumed
+that the reader
+already is generally familiar
+with the \*U operating system
+and a text editor
+such as
+.i vi .
+This is intended to be a casual introduction,
+and
+as such not all material is covered.
+In particular,
+many variations and additional features
+of the \-me macro package
+are not explained.
+For a complete discussion of this
+and other issues,
+see
+the
+.q "\fIme\fP Reference Manual"
+and
+.i "groff: The GNU implementation of troff."
+.pp
+\*G, a computer program
+that runs on the \*U operating system,
+reads an input file
+prepared by the user
+and outputs a formatted paper
+suitable for publication or framing.
+The input consists of
+.i text ,
+or words to be printed,
+and
+.i requests ,
+which give instructions
+to the \*G program
+telling how to format the printed copy.
+.pp
+Section 1
+describes the basics
+of text processing.
+Section 2
+describes the basic requests.
+Section 3
+introduces displays.
+Annotations,
+such as footnotes,
+are handled in
+section 4.
+The more complex requests
+which are not discussed in section 2
+are covered in section 5.
+Finally,
+section 6
+discusses things you will need
+to know
+if you want to typeset documents.
+If you are a novice,
+you probably won't want to read beyond section 4
+until you have tried some of the basic features out.
+.pp
+When you have your raw text ready,
+call the \*G formatter by typing
+as a request to the \*U shell:
+.(b
+groff \-me \-T\c
+.i "type files"
+.)b
+where
+.i type
+describes the type of
+output device you are using.
+A complete description of options
+to the \*G command can be found in
+.i groff (1).
+.pp
+The word
+.i argument
+is used in this manual
+to mean a word or number
+which appears on the same line
+as a request
+which modifies the meaning
+of that request.
+For example,
+the request
+.(b
+\&.sp
+.)b
+spaces one line,
+but
+.(b
+\&.sp 4
+.)b
+spaces four lines.
+The number
+.b 4
+is an
+.i argument
+to the
+.b .sp
+request
+which says to space four lines
+instead of one.
+Arguments are separated from the request
+and from each other
+by spaces.
+.sh 1 "Basics of Text Processing"
+.pp
+The primary function
+of \*G
+is to
+.i collect
+words from input lines,
+.i fill
+output lines with those words,
+.i justify
+the right hand margin by inserting extra spaces
+in the line,
+and output the result.
+For example,
+the input:
+.(b
+Now is the time
+for all good men
+to come to the aid
+of their party.
+Four score and seven
+years ago,...
+.)b
+will be read,
+packed onto output lines,
+and justified
+to produce:
+.(b F
+Now is the time
+for all good men
+to come to the aid
+of their party.
+Four score and seven
+years ago,...
+.)b
+Sometimes you may want to start a new output line
+even though the line you are on
+is not yet full;
+for example,
+at the end of a paragraph.
+To do this
+you can cause a
+.i break ,
+which
+starts a new output line.
+Some requests
+cause a break automatically,
+as do blank input lines
+and input lines beginning with a space.
+.pp
+Not all input lines
+are text to be formatted.
+Some of the input lines
+are
+.i requests
+which describe
+how to format the text.
+Requests always have a period
+or an apostrophe
+(\c
+.q "\|\(aq\|" )
+as the first character
+of the input line.
+.pp
+The text formatter
+also does more complex things,
+such as automatically numbering pages,
+skipping over page folds,
+putting footnotes in the correct place,
+and so forth.
+.pp
+I can offer you a few hints
+for preparing text
+for input to \*G.
+First,
+keep the input lines short.
+Short input lines are easier to edit,
+and \*G will pack words onto longer lines
+for you anyhow.
+In keeping with this,
+it is helpful
+to begin a new line
+after every period,
+comma,
+or phrase,
+since common corrections
+are to add or delete sentences
+or phrases.
+Second,
+do not put spaces at the end of lines.
+Third,
+do not hyphenate words at the end of lines
+(except words that should have hyphens in them,
+such as
+.q mother-in-law );
+\*G is smart enough to hyphenate words
+for you as needed,
+but is not smart enough
+to take hyphens out
+and join a word back together.
+Also,
+words such as
+.q mother-in-law
+should not be broken
+over a line,
+since then you will get a space
+where not wanted,
+such as
+.tr @-
+.nh
+.q "mother@\ in@law" .
+.br
+.tr @@
+.hy 14
+.sh 1 "Basic Requests"
+.sh 2 "Paragraphs"
+.pp
+Paragraphs are begun
+by using the
+.b .pp
+request.
+For example,
+the input:
+.(b
+\&.pp
+Now is the time for all good men
+to come to the aid of their party.
+Four score and seven years ago,...
+.)b
+produces a blank line
+followed by an indented first line.
+The result is:
+.(b F
+.ti +\n(piu
+Now is the time for all good men
+to come to the aid of their party.
+Four score and seven years ago,...
+.)b
+.pp
+Notice that the sentences
+of the paragraphs
+.i "must not"
+begin with a space,
+since blank lines
+and lines beginning with spaces
+cause a break.
+For example,
+if I had typed:
+.(b
+\&.pp
+Now is the time for all good men
+ to come to the aid of their party.
+Four score and seven years ago,...
+.)b
+The output would be:
+.(b F
+.ti +\n(piu
+Now is the time for all good men
+ to come to the aid of their party.
+Four score and seven years ago,...
+.)b
+A new line begins after the word
+.q men
+because the second line began with a space character.
+.pp
+There are many
+fancier
+types of paragraphs,
+which will be described later.
+.sh 2 "Headers and Footers"
+.pp
+Arbitrary headers and footers
+can be put
+at the top and bottom
+of every page.
+Two requests
+of the form
+.b .he \ \c
+.i title
+and
+.b .fo \ \c
+.i title
+define the titles to put at the head and the foot
+of every page,
+respectively.
+The titles are called
+.i three-part
+titles,
+that is,
+there is a left-justified part,
+a centered part,
+and a right-justified part.
+To separate these three parts
+the first character of
+.i title
+(whatever it may be)
+is used as a delimiter.
+Any character may be used,
+but
+backslash
+and double quote marks
+should be avoided.
+The percent sign
+is replaced by the current page number
+whenever found in the title.
+For example,
+the input:
+.(b
+\&.he \(aq\(aq%\(aq\(aq
+\&.fo \(aqJane Jones\(aq\(aqMy Book\(aq
+.)b
+results in the page number
+centered at the top
+of each page,
+.q "Jane Jones"
+in the lower left corner,
+and
+.q "My Book"
+in the lower right corner.
+.sh 2 "Double Spacing"
+.pp
+.ls 2
+\*G will double space output text automatically if you
+use the request
+.b ".ls\ 2" ,
+as is done in this section.
+You can revert to single spaced mode
+by typing
+.b ".ls\ 1" .
+.ls 1
+.sh 2 "Page Layout"
+.pp
+A number of requests allow
+you to change the way the printed copy looks,
+sometimes called the
+.i layout
+of the output page.
+Most of these requests adjust the placing
+of
+.q "white space"
+(blank lines or spaces).
+In these explanations,
+characters in italics
+should be replaced with values you wish to use;
+bold characters
+represent characters which should actually be typed.
+.pp
+The
+.b .bp
+request
+starts a new page.
+.pp
+The request
+.b .sp \ \c
+.i N
+leaves
+.i N
+lines of blank space.
+.i N
+can be omitted
+(meaning skip a single line)
+or can be of the form
+.i N \^\c
+.b i
+(for
+.i N
+inches)
+or
+.i N \^\c
+.b c
+(for
+.i N
+centimeters).
+For example, the input:
+.(b
+\&.sp 1.5i
+My thoughts on the subject
+\&.sp
+.)b
+leaves one and a half inches of space,
+followed by the line
+.q "My thoughts on the subject" ,
+followed by a single blank line.
+.pp
+This request will not leave space at the top of a page.
+If you need the requested space to appear regardless of page position,
+use the
+.b .bl
+request, which has the same syntax as
+.b .sp
+but always leaves the requested space, even at the top of a page.
+.pp
+The
+.b .in \ \c
+.i +N
+request
+changes the amount of white space
+on the left of the page
+(the
+.i indent ).
+The argument
+.i N
+can be of the form
+.b + \c
+.i N
+(meaning leave
+.i N
+spaces more than you are already leaving),
+.b \- \c
+.i N
+(meaning leave less than you do now),
+or just
+.i N
+(meaning leave exactly
+.i N
+spaces).
+.i N
+can be of the form
+.i N \^\c
+.b i
+or
+.i N \^\c
+.b c
+also.
+For example,
+the input:
+.(b
+initial text
+\&.in 5
+some text
+\&.in +1i
+more text
+\&.in \-2c
+final text
+.)b
+produces
+.q "some text"
+indented exactly five spaces
+from the left margin,
+.q "more text"
+indented five spaces
+plus one inch
+from the left margin
+(fifteen spaces
+on a pica typewriter),
+and
+.q "final text"
+indented five spaces
+plus one inch
+minus two centimeters
+from the margin.
+That is,
+the output is:
+.(b
+initial text
+.in +5
+some text
+.in +1i
+more text
+.in -2c
+final text
+.)b
+.pp
+The
+.b .ti \ \c
+.i +N
+(temporary indent)
+request is used like
+.b .in \ \c
+.i +N
+when the indent
+should apply to one line only,
+after which it should revert
+to the previous indent.
+For example,
+the input:
+.(b
+\&.in 1i
+\&.ti 0
+Ware, James R. The Best of Confucius,
+Halcyon House, 1950.
+An excellent book containing translations of
+most of Confucius\(aq most delightful sayings.
+A definite must for anyone interested in the early
+foundations of Chinese philosophy.
+.)b
+produces:
+.in 1i+\n($iu
+.ti \n($iu
+Ware, James R. The Best of Confucius,
+Halcyon House, 1950.
+An excellent book containing translations of
+most of Confucius' most delightful sayings.
+A definite must for anyone interested in the early foundations
+of Chinese philosophy.
+.pp
+Text lines can be centered
+by using the
+.b .ce
+request.
+The line after the
+.b .ce
+is centered
+(horizontally)
+on the page.
+To center more than one line,
+use
+.b .ce \ \c
+.i N
+(where
+.i N
+is the number of lines to center),
+followed by the
+.i N
+lines.
+If you want to center many lines
+but don't want to count them,
+type:
+.(b
+\&.ce 1000
+lines to center
+\&.ce 0
+.)b
+The
+.b ".ce\ 0"
+request tells \*G to center zero more lines,
+in other words,
+stop centering.
+.pp
+All of these requests
+cause a break;
+that is,
+they always start
+a new line.
+If you want to start a new line
+without performing any other action,
+use
+.b .br .
+.sh 1 "Displays"
+.pp
+Displays are sections of text
+to be set off
+from the body of the paper.
+Major quotes,
+tables,
+and figures
+are types of displays,
+as are all the examples
+used in this document.
+All displays
+except centered blocks
+are output
+single spaced.
+.sh 2 "Major Quotes"
+.pp
+Major quotes
+are quotes which are several lines long,
+and hence are set in from the rest
+of the text
+without quote marks
+around them.
+These can be generated
+using the requests
+.b .(q
+and
+.b .)q
+to surround the quote.
+For example,
+the input:
+.(b
+As Weizenbaum points out:
+\&.(q
+It is said that to explain is to explain away.
+This maxim is nowhere so well fulfilled
+as in the areas of computer programming,...
+\&.)q
+.)b
+generates as output:
+.lp
+As Weizenbaum points out:
+.(q
+It is said that to explain is to explain away.
+This maxim is nowhere so well fulfilled
+as in the areas of computer programming,...
+.)q
+.sh 2 "Lists"
+.pp
+A
+.i list
+is an indented,
+single spaced,
+unfilled display.
+Lists should be used
+when the material to be printed
+should not be filled and justified
+like normal text,
+such as columns of figures
+or the examples used in this paper.
+Lists are surrounded
+by the requests
+.b .(l
+and
+.b .)l .
+For example,
+type:
+.(b
+Alternatives to avoid deadlock are:
+\&.(l
+Lock in a specified order
+Detect deadlock and back out one process
+Lock all resources needed before proceeding
+\&.)l
+.)b
+will produce:
+.br
+Alternatives to avoid deadlock are:
+.(l
+Lock in a specified order
+Detect deadlock and back out one process
+Lock all resources needed before proceeding
+.)l
+.sh 2 "Keeps"
+.pp
+A
+.i keep
+is a display of lines
+which are kept on a single page
+if possible.
+An example of where you would use a keep
+might be a diagram.
+Keeps differ from lists
+in that lists may be broken
+over a page boundary
+whereas keeps will not.
+.pp
+Blocks are the basic kind of keep.
+They begin with the request
+.b .(b
+and end with the request
+.b .)b .
+If there is not room on the current page
+for everything in the block,
+a new page is begun.
+This has the unpleasant effect
+of leaving blank space
+at the bottom of the page.
+When this is not appropriate,
+you can use the alternative,
+called
+.i "floating keeps" .
+.pp
+.i "Floating keeps"
+move relative to the text.
+Hence,
+they are good for things
+which will be referred to
+by name,
+such as
+.q "See figure 3" .
+A floating keep will appear
+at the bottom of the current page
+if it will fit;
+otherwise,
+it will appear at the top
+of the next page.
+Floating keeps begin with the line
+.b .(z
+and end with the line
+.b .)z .
+For an example of a floating keep,
+see figure 1.
+.(z
+.in 1i
+.xl -1i
+.hl
+\&.(z
+\&.hl
+Text of keep to be floated.
+\&.sp
+\&.ce
+Figure 1. Example of a Floating Keep.
+\&.hl
+\&.)z
+.sp
+.ce
+Figure 1. Example of a Floating Keep.
+.hl
+.)z
+The
+.b .hl
+request is used
+to draw a horizontal line
+so that the figure
+stands out from the text.
+.sh 2 "Fancier Displays"
+.pp
+Keeps and lists are normally collected in
+.i nofill
+mode,
+so that they are good for tables and such.
+If you want filling enabled in the display
+(for text),
+type
+.b ".(l\ F"
+(Throughout this section,
+comments applied to
+.b .(l
+also apply to
+.b .(b
+and
+.b .(z ).
+This kind of display
+will be indented from both margins.
+For example,
+the input:
+.(b
+\&.(l F
+And now boys and girls,
+a newer, bigger, better toy than ever before!
+Be the first on your block to have your own computer!
+Yes kids, you too can have one of these modern
+data processing devices.
+You too can produce beautifully formatted papers
+without even batting an eye!
+\&.)l
+.)b
+will be output as:
+.(b F
+And now boys and girls,
+a newer, bigger, better toy than ever before!
+Be the first on your block to have your own computer!
+Yes kids, you too can have one of these modern
+data processing devices.
+You too can produce beautifully formatted papers
+without even batting an eye!
+.)b
+.pp
+Lists and blocks are also normally indented
+(floating keeps are normally left justified).
+To get a left-justified list,
+type
+.b ".(l\ L" .
+To get a list centered
+line-for-line,
+type
+.b ".(l C" .
+For example,
+to get a filled,
+left justified list, enter:
+.(b
+\&.(l L F
+text of block
+\&.)l
+.)b
+The input:
+.(b
+\&.(l
+first line of unfilled display
+more lines
+\&.)l
+.)b
+produces the indented text:
+.(b
+first line of unfilled display
+more lines
+.)b
+Typing the character
+.b L
+after the
+.b .(l
+request produces the left justified result:
+.(b L
+first line of unfilled display
+more lines
+.)b
+Using
+.b C
+instead of
+.b L
+produces the line-at-a-time centered output:
+.(b C
+first line of unfilled display
+more lines
+.)b
+.pp
+Sometimes it may be
+that you want to center several lines
+as a group,
+rather than centering them
+one line at a time.
+To do this
+use centered blocks,
+which are surrounded by the requests
+.b .(c
+and
+.b .)c .
+All the lines are centered as a unit,
+such that the longest line is centered
+and the rest are
+lined up around that line.
+Notice that lines
+do not move
+relative to each other
+using centered blocks,
+whereas they do
+using the
+.b C
+argument to keeps.
+.pp
+Centered blocks are
+.i not
+keeps,
+and may be used
+in conjunction
+with keeps.
+For example,
+to center a group of lines
+as a unit
+and keep them
+on one page,
+use:
+.(b
+\&.(b L
+\&.(c
+first line of unfilled display
+more lines
+\&.)c
+\&.)b
+.)b
+.ne 1i
+to produce:
+.(b L
+.(c
+first line of unfilled display
+more lines
+.)c
+.)b
+If the block requests
+(\c
+.b .(b
+and
+.b .)b )
+had been omitted
+the result would have been the same,
+but with no guarantee
+that the lines of the centered block
+would have all been on one page.
+Note the use of the
+.b L
+argument to
+.b .(b ;
+this causes the centered block
+to center within the entire line
+rather than within the line
+minus the indent.
+Also,
+the center requests
+must
+be nested
+.i inside
+the keep requests.
+.sh 1 "Annotations"
+.pp
+There are a number of requests
+to save text
+for later printing.
+.i Footnotes
+are printed at the bottom of the current page.
+.i "Delayed text"
+is intended to be a variant form
+of footnote;
+the text is printed only
+when explicitly called for,
+such as at the end of each chapter.
+.i Indexes
+are a type of delayed text
+having a tag
+(usually the page number)
+attached to each entry
+after a row of dots.
+Indexes are also saved
+until called for explicitly.
+.sh 2 "Footnotes"
+.pp
+Footnotes begin with the request
+.b .(f
+and end with the request
+.b .)f .
+The current footnote number is maintained
+automatically,
+and can be used by typing \e**,
+to produce a footnote number\**.
+.(f
+\** Like this.
+.)f
+The number is automatically incremented
+after every footnote.
+For example,
+the input:
+.(b
+\&.(q
+A man who is not upright
+and at the same time is presumptuous;
+one who is not diligent and at the same time is ignorant;
+one who is untruthful and at the same time is incompetent;
+such men I do not count among acquaintances.\e**
+\&.(f
+\e** James R. Ware,
+\&.ul
+The Best of Confucius,
+Halcyon House, 1950.
+Page 77.
+\&.)f
+\&.)q
+.)b
+generates the result:
+.(q
+A man who is not upright
+and at the same time is presumptuous;
+one who is not diligent and at the same time is ignorant;
+one who is untruthful and at the same time is incompetent;
+such men I do not count among acquaintances.\**
+.(f
+\** James R. Ware,
+.ul
+The Best of Confucius,
+Halcyon House, 1950.
+Page 77.
+.)f
+.)q
+It is important
+that the footnote
+appears
+.i inside
+the quote,
+so that you can be sure
+that the footnote
+will appear
+on the same page
+as the quote.
+.sh 2 "Delayed Text"
+.pp
+Delayed text
+is very similar to a footnote
+except that it is printed
+when called for explicitly.
+This allows a list of
+references to
+appear
+(for example)
+at the end of each chapter,
+as is the convention in some disciplines.
+Use
+.b \e*#
+on delayed text
+instead of
+.b \e**
+as on footnotes.
+.pp
+If you are using delayed text
+as your standard reference mechanism,
+you can still use footnotes,
+except that you may want to reference them
+with special characters*
+.(f
+*Such as an asterisk.
+.)f
+rather than numbers.
+.sh 2 "Indexes"
+.pp
+An
+.q index
+(actually more like a table of contents,
+since the entries are not sorted alphabetically)
+resembles delayed text,
+in that it is saved until called for.
+However,
+each entry has the page number
+(or some other tag)
+appended to the last line
+of the index entry
+after a row of dots.
+.pp
+Index entries begin with the request
+.b .(x
+and end with
+.b .)x .
+The
+.b .)x
+request may have a argument,
+which is the value to print
+as the
+.q "page number" .
+It defaults to the current page number.
+If the page number given is an underscore
+(\c
+.q _ )
+no page number
+or line of dots
+is printed at all.
+To get the line of dots
+without a page number,
+type
+.b ".)x """"" ,
+which specifies an explicitly null page number.
+.pp
+The
+.b .xp
+request prints the index.
+.pp
+For example,
+the input:
+.(b
+\&.(x
+Sealing wax
+\&.)x
+\&.(x
+Cabbages and kings
+\&.)x _
+\&.(x
+Why the sea is boiling hot
+\&.)x 2.5a
+\&.(x
+Whether pigs have wings
+\&.)x ""
+\&.(x
+This is a terribly long index entry, such as might be used
+for a list of illustrations, tables, or figures; I expect it to
+take at least two lines.
+\&.)x
+\&.xp
+.)b
+generates:
+.(x
+Sealing wax
+.)x
+.(x
+Cabbages and kings
+.)x _
+.(x
+Why the sea is boiling hot
+.)x 2.5a
+.(x
+Whether pigs have wings
+.)x ""
+.(x
+This is a terribly long index entry, such as might be used
+for a list of illustrations, tables, or figures; I expect it to
+take at least two lines.
+.)x
+.xp
+.pp
+The
+.b .(x
+request may have a single character
+argument,
+specifying the
+.q name
+of the index;
+the normal index is
+.b x .
+Thus,
+several
+.q indices
+may be maintained simultaneously
+(such as a list of tables, table of contents, etc.).
+.pp
+Notice that the index must be printed
+at the
+.i end
+of the paper,
+rather than at the beginning
+where it will probably appear
+(as a table of contents);
+the pages may have to be physically rearranged
+after printing.
+.sh 1 "Fancier Features"
+.pp
+A large number of fancier requests
+exist,
+notably requests to provide other sorts of paragraphs,
+numbered sections of the form
+.b 1.2.3
+(such as used in this document),
+and multicolumn output.
+.sh 2 "More Paragraphs"
+.pp
+Paragraphs generally start with
+a blank line
+and with the first line
+indented.
+It is possible to get
+left-justified block-style paragraphs
+by using
+.b .lp
+instead of
+.b .pp ,
+as demonstrated by the next paragraph.
+.lp
+Sometimes you want to use paragraphs
+that have the
+.i body
+indented,
+and the first line
+exdented
+(opposite of indented)
+with a label.
+This can be done with the
+.b .ip
+request.
+A word specified on the same line as
+.b .ip
+is printed in the margin,
+and the body is lined up
+at a prespecified position
+.ne 1i
+(normally five spaces).
+For example,
+the input:
+.(b
+\&.ip one
+This is the first paragraph.
+Notice how the first line
+of the resulting paragraph lines up
+with the other lines in the paragraph.
+\&.ip two
+And here we are at the second paragraph already.
+You may notice that the argument to \c
+.b .ip
+appears
+in the margin.
+\&.lp
+We can continue text...
+.)b
+produces as output:
+.ip one
+This is the first paragraph.
+Notice how the first line of the resulting paragraph lines up
+with the other lines in the paragraph.
+.ip two
+And here we are at the second paragraph already.
+You may notice that the argument to
+.b .ip
+appears
+in the margin.
+.lp
+We can continue text without starting a new indented
+paragraph
+by using the
+.b .lp
+request.
+.pp
+If you have spaces in the label of a
+.b .ip
+request,
+you must use an
+.q "unpaddable space"
+instead of a regular space.
+This is typed as a backslash character
+(\c
+.q \e )
+followed by a space.
+For example,
+to print the label
+.q "Part 1" ,
+enter:
+.(b
+\&.ip "Part\e 1"
+.)b
+.pp
+If a label of an indented paragraph
+(that is, the argument to
+.b .ip )
+is longer than the space allocated for the label,
+.b .ip
+will begin a new line after the label.
+For example,
+the input:
+.(b
+\&.ip longlabel
+This paragraph had a long label.
+The first character of text on the first line
+will not line up with the text on second and subsequent lines,
+although they will line up with each other.
+.)b
+will produce:
+.ip longlabel
+This paragraph had a long label.
+The first character of text on the first line
+will not line up with the text on second and subsequent lines,
+although they will line up with each other.
+.pp
+It is possible to change the size of the label
+by using a second argument
+which is the size of the label.
+For example,
+the above example could be done correctly
+by saying:
+.(b
+\&.ip longlabel 10
+.)b
+which will make the paragraph indent
+10 spaces for this paragraph only.
+If you have many paragraphs to indent
+all the same amount,
+alter the value of the
+.i register
+.b ii .
+For example, to leave one inch of space
+for the label,
+type:
+.(b
+\&.nr ii 1i
+.)b
+somewhere before the first call to
+.b .ip .
+Refer to the reference manual
+for more information.
+.pp
+If
+.b .ip
+is used
+with no argument at all
+no hanging tag will be printed.
+For example,
+the input:
+.(b
+\&.ip [a]
+This is the first paragraph of the example.
+We have seen this sort of example before.
+\&.ip
+This paragraph is lined up with the previous paragraph,
+but it has no tag in the margin.
+.)b
+produces as output:
+.ip [a]
+This is the first paragraph of the example.
+We have seen this sort of example before.
+.ip
+This paragraph is lined up with the previous paragraph,
+but it has no tag in the margin.
+.pp
+A special case of
+.b .ip
+is
+.b .np ,
+which automatically
+numbers paragraphs sequentially from 1.
+The numbering is reset at the next
+.b .pp ,
+.b .lp ,
+or
+.b .sh
+(to be described in the next section)
+request.
+For example,
+the input:
+.(b
+\&.np
+This is the first point.
+\&.np
+This is the second point.
+Points are just regular paragraphs
+which are given sequence numbers automatically
+by the \&.np request.
+\&.pp
+This paragraph will reset numbering by \&.np.
+\&.np
+For example,
+we have reverted to numbering from one now.
+.)b
+generates:
+.np
+This is the first point.
+.np
+This is the second point.
+Points are just regular paragraphs
+which are given sequence numbers automatically
+by the \&.np request.
+.pp
+This paragraph will reset numbering by \&.np.
+.np
+For example,
+we have reverted to numbering from one now.
+.pp
+The
+.b .bu
+request gives lists of this sort that are identified with
+bullets rather than numbers.
+The paragraphs are also crunched together.
+For example,
+the input:
+.(b
+\&.bu
+\&One egg yolk
+\&.bu
+\&One tablespoon cream or top milk
+\&.bu
+\&Salt, cayenne, and lemon juice to taste
+\&.bu
+\&A generous two tablespoonfuls of butter
+.)b
+produces\**:
+.(f
+\** By the way,
+if you put the first three ingredients in a a heavy, deep pan
+and whisk the ingredients madly over a medium flame
+(never taking your hand off the handle of the pot)
+until the mixture reaches the consistency of custard
+(just a minute or two),
+then mix in the butter off-heat,
+you will have a wonderful Hollandaise sauce.
+.)f
+.bu
+One egg yolk
+.bu
+One tablespoon cream or top milk
+.bu
+Salt, cayenne, and lemon juice to taste
+.bu
+A generous two tablespoonfuls of butter
+.sh 2 "Section Headings"
+.pp
+Section numbers
+(such as the ones used in this document)
+can be automatically generated
+using the
+.b .sh
+request.
+You must tell
+.b .sh
+the
+.i depth
+of the section number
+and a section title.
+The depth
+specifies how many numbers
+are to appear
+(separated by decimal points)
+in the section number.
+For example,
+the section number
+.b 4.2.5
+has a depth of three.
+.pp
+Section numbers
+are incremented
+in a fairly intuitive fashion.
+If you add a number
+(increase the depth),
+the new number starts out
+at one.
+If you subtract section numbers
+(or keep the same number)
+the final number is incremented.
+For example,
+the input:
+.(b
+\&.sh 1 "The Preprocessor"
+\&.sh 2 "Basic Concepts"
+\&.sh 2 "Control Inputs"
+\&.sh 3
+\&.sh 3
+\&.sh 1 "Code Generation"
+\&.sh 3
+.)b
+produces as output the result:
+.(b
+.b
+1. The Preprocessor
+1.1. Basic Concepts
+1.2. Control Inputs
+1.2.1.
+1.2.2.
+2. Code Generation
+2.1.1.
+.)b
+.pp
+You can specify the section number to begin
+by placing the section number after the section title,
+using spaces instead of dots.
+For example,
+the request:
+.(b
+\&.sh 3 "Another section" 7 3 4
+.)b
+will begin the section numbered
+.b 7.3.4 ;
+all subsequent
+.b .sh
+requests will number relative to this number.
+.pp
+There are more complex features
+which will cause each section to be indented
+proportionally to the depth of the section.
+For example, if you enter:
+.(b
+\&.nr si \c
+.i N
+.)b
+each section will be indented by an amount
+.i N .
+.i N
+must have a scaling factor attached,
+that is, it must be of the form
+.i Nx ,
+where
+.i x
+is a character telling what units
+.i N
+is in.
+Common values for
+.i x
+are
+.b i
+for inches,
+.b c
+for centimeters,
+and
+.b n
+for
+.i ens
+(the width of a single character).
+For example,
+to indent each section
+one-half inch,
+type:
+.(b
+\&.nr si 0.5i
+.)b
+After this,
+sections will be indented by
+one-half inch
+per level of depth in the section number.
+For example,
+this document was produced
+using the request
+.(b
+\&.nr si 3n
+.)b
+at the beginning of the input file,
+giving three spaces of indent
+per section depth.
+.pp
+Section headers without automatically generated numbers
+can be done using:
+.(b
+\&.uh "Title"
+.)b
+which will do a section heading,
+but will put no number on the section.
+.sh 2 "Parts of the Basic Paper"
+.pp
+There are some requests
+which assist in setting up
+papers.
+The
+.b .tp
+request
+initializes for a title page.
+There are no headers or footers
+on a title page,
+and unlike other pages
+you can space down
+and leave blank space
+at the top.
+For example,
+a typical title page might appear as:
+.(b
+\&.tp
+\&.sp 2i
+\&.(l C
+THE GROWTH OF TOENAILS
+IN UPPER PRIMATES
+\&.sp
+by
+\&.sp
+Frank N. Furter
+\&.)l
+\&.bp
+.)b
+.pp
+The
+.b .+c \ \c
+.i T
+request can be used
+to start chapters.
+Each chapter is automatically numbered
+from one,
+and a heading is printed at the top of each chapter
+with the chapter number
+and the chapter name
+.i T .
+For example,
+to begin a chapter called
+.q Conclusions ,
+use the request:
+.(b
+\&.+c "CONCLUSIONS"
+.)b
+which will produce,
+on a new page,
+the lines
+.(b C
+Chapter 5
+CONCLUSIONS
+.)b
+with appropriate spacing for a thesis.
+Also, the header is moved to the foot of the page
+on the first page of a chapter.
+Although the
+.b .+c
+request was not designed to work only with the
+.b .th
+request,
+it is tuned for the format acceptable
+for a PhD thesis
+at Berkeley.
+.pp
+If the
+title parameter
+.i T
+is omitted from the
+.b .+c
+request,
+the result is a chapter with no heading.
+This can also be used at the beginning
+of a paper;
+for example,
+.b .+c
+was used to generate page one
+of this document.
+.pp
+Although
+papers traditionally have the abstract,
+table of contents,
+and so forth at the front of the paper,
+it is more convenient to format
+and print them last
+when using \*G.
+This is so that index entries
+can be collected and then printed
+for the table of contents
+(or whatever).
+At the end of the paper,
+issue the
+.b ".++ P"
+request,
+which begins the preliminary part
+of the paper.
+After issuing this request,
+the
+.b .+c
+request will begin a preliminary section
+of the paper.
+Most notably,
+this prints the page number
+restarted from one
+in lower case Roman numbers.
+.b .+c
+may be used repeatedly
+to begin different parts of the
+front material
+for example,
+the abstract,
+the table of contents,
+acknowledgments,
+list of illustrations,
+etc.
+The request
+.b ".++ B"
+may also be used
+to begin the bibliographic section
+at the end of the paper.
+For example,
+the paper might appear
+as outlined in figure 2.
+(In this figure,
+comments begin with the sequence
+.b \e" .)
+.(z
+.hl
+.if t .in 0.5i
+.if t .ta 2i
+.if n .ta 3i
+\&.th \e" set for thesis mode
+\&.fo \(aq\(aqDRAFT\(aq\(aq \e" define footer for each page
+\&.tp \e" begin title page
+\&.(l C \e" center a large block
+THE GROWTH OF TOENAILS
+IN UPPER PRIMATES
+\&.sp
+by
+\&.sp
+Frank Furter
+\&.)l \e" end centered part
+\&.+c INTRODUCTION \e" begin chapter named "INTRODUCTION"
+\&.(x t \e" make an entry into index `t'
+Introduction
+\&.)x \e" end of index entry
+text of chapter one
+\&.+c "NEXT CHAPTER" \e" begin another chapter
+\&.(x t \e" enter into index `t' again
+Next Chapter
+\&.)x
+text of chapter two
+\&.+c CONCLUSIONS
+\&.(x t
+Conclusions
+\&.)x
+text of chapter three
+\&.++ B \e" begin bibliographic information
+\&.+c BIBLIOGRAPHY \e" begin another `chapter'
+\&.(x t
+Bibliography
+\&.)x
+text of bibliography
+\&.++ P \e" begin preliminary material
+\&.+c "TABLE OF CONTENTS"
+\&.xp t \e" print index `t' collected above
+\&.+c PREFACE \e" begin another preliminary section
+text of preface
+.sp 2
+.in 0
+.ce
+Figure 2. Outline of a Sample Paper
+.hl
+.)z
+.sh 2 "Equations and Tables"
+.pp
+Two special \*U programs exist
+to format special types of material.
+.b Eqn
+sets equations.
+.b Tbl
+arranges to print
+extremely pretty tables
+in a variety of formats.
+This document will only describe
+the embellishments
+to the standard features;
+consult the reference manuals
+for those processors
+for a description of their use.
+.pp
+The
+.b eqn
+program is described fully
+in the document
+.ul
+Typesetting Mathematics \- User's Guide
+by Brian W. Kernighan
+and Lorinda L. Cherry.
+Equations are centered,
+and are kept on one page.
+They are introduced by the
+.b .EQ
+request and terminated by the
+.b .EN
+request.
+.pp
+The
+.b .EQ
+request may take an
+equation number as an
+optional argument,
+which is printed vertically centered
+on the right hand side
+of the equation.
+If the equation becomes too long
+it should be split
+between two lines.
+To do this, type:
+.(b
+\&.EQ (eq 34)
+text of equation 34
+\&.EN C
+\&.EQ
+continuation of equation 34
+\&.EN
+.)b
+The
+.b C
+on the
+.b .EN
+request
+specifies that the equation
+will be continued.
+.pp
+The
+.b tbl
+program produces tables.
+It is fully described
+(including numerous examples)
+in the document
+.ul
+Tbl \- A Program to Format Tables
+by M. E. Lesk.
+Tables begin with the
+.b .TS
+request
+and end with the
+.b .TE
+request.
+Tables are normally kept on a single page.
+If you have a table which is too big
+to fit on a single page,
+so that you know it will extend
+to several pages,
+begin the table with the request
+.b ".TS\ H"
+and put the request
+.b .TH
+after the part of the table
+which you want
+duplicated at the top of every page
+that the table is printed on.
+For example, a table definition
+for a long table might look like:
+.ds TA \|\h'.4n'\v'-.2n'\s-4\zT\s0\v'.2n'\h'-.4n'\(ci\|
+.if n .ds TA \ \o'-T'\ \"
+.(b
+\&.TS H
+c s s
+n n n.
+THE TABLE TITLE
+\&.TH
+text of the table
+\&.TE
+.)b
+.sh 2 "Two Column Output"
+.pp
+You can get two-column output
+automatically
+by using the request
+.b .2c .
+This causes everything after it
+to be output in two-column form.
+The request
+.b .bc
+will start a new column;
+it differs from
+.b .bp
+in that
+.b .bp
+may leave a totally blank column
+when it starts a new page.
+To revert to single-column output,
+use
+.b .1c .
+.sh 2 "Defining Macros"
+.pp
+A
+.i macro
+is a collection of requests and text
+which may be used
+by stating a simple request.
+Macros begin with the line
+.b ".de" \ \c
+.i xx
+(where
+.i xx
+is the name of the macro to be defined)
+and end with the line consisting of two dots.
+After defining the macro,
+stating the line
+.b . \c
+.i xx
+is the same as stating all the other lines.
+For example,
+to define a macro
+that spaces 3 lines
+and then centers the next input line,
+enter:
+.(b
+\&.de SS
+\&.sp 3
+\&.ce
+\&..
+.)b
+and use it by typing:
+.(b
+\&.SS
+\&Title Line
+(beginning of text)
+.)b
+.pp
+Macro names may be one or two characters.
+In order to avoid conflicts
+with names in \-me,
+always use upper case letters as names.
+The only names to avoid are
+.b TS ,
+.b TH ,
+.b TE ,
+.b EQ ,
+and
+.b EN .
+.sh 2 "Annotations Inside Keeps"
+.pp
+Sometimes you may want to put
+a footnote
+or index entry inside a keep.
+For example,
+if you want to maintain a
+.q "list of figures"
+you will want to do something like:
+.(b
+\&.(z
+\&.(c
+text of figure
+\&.)c
+\&.ce
+Figure 5.
+\&.(x f
+Figure 5
+\&.)x
+\&.)z
+.)b
+which you may hope
+will give you a figure
+with a label
+and an entry in the index
+.b f
+(presumably a list of figures index).
+Unfortunately,
+the
+index entry
+is read and interpreted
+when the keep is read,
+not when it is printed,
+so the page number in the index is likely to be wrong.
+The solution is to use the magic string
+.b \e!
+at the beginning of all the lines dealing with the index.
+In other words,
+you should use:
+.(b
+\&.(z
+\&.(c
+Text of figure
+\&.)c
+\&.ce
+Figure 5.
+\e!.(x f
+\e!Figure 5
+\e!.)x
+\&.)z
+.)b
+which will defer the processing of the index
+until the figure is output.
+This will guarantee
+that the page number in the index
+is correct.
+The same comments apply
+to
+blocks
+(with
+.b .(b
+and
+.b .)b )
+as well.
+.sh 1 "\*T and the Photosetter"
+.pp
+With a little care,
+you can prepare
+documents that
+will print nicely
+on either a regular terminal
+or when phototypeset
+using the \*T formatting program.
+.sh 2 "Fonts"
+.pp
+A
+.i font
+is a style of type.
+There are three fonts
+that are available simultaneously,
+Times Roman,
+Times Italic,
+and Times Bold,
+plus the special math font.
+The normal font is Roman.
+.pp
+There are ways of switching between fonts.
+The requests
+.b .r ,
+.b .i ,
+.b .b ,
+and
+.b .bi
+switch to Roman,
+italic,
+bold,
+and bold-italic fonts respectively.
+You can set a single word
+in some font
+by typing (for example):
+.(b
+\&.i word
+.)b
+which will set
+.i word
+in italics
+but does not affect the surrounding text.
+.pp
+Notice that if you are setting more than one word
+in whatever font,
+you must surround that word with double quote marks
+(`\|"\|')
+so that it will appear to the \*G processor as a single word.
+The quote marks will not appear in the formatted text.
+If you do want a quote mark to appear,
+you should quote the entire string
+(even if a single word),
+and use
+.i two
+quote marks where you want one to appear.
+For example,
+if you want to produce the text:
+.(b
+.i """Master Control\|"""
+.)b
+in italics, you must type:
+.(b
+\&.i """Master Control\e|"""
+.)b
+The
+.b \e|
+produces a thin space
+so that the
+.q l
+does not overlap the quote sign in \*G,
+like this:
+.(b
+.i """Master Control"""
+.)b
+.pp
+There are also some
+.q pseudo-fonts
+available.
+The input:
+.(b
+\&.(b
+\&.u underlined
+\&.bx "words in a box"
+\&.)b
+.)b
+generates
+.(b
+.u underlined
+.bx "words in a box"
+.)b
+Notice that pseudo font requests
+set only the single parameter in the pseudo font;
+ordinary font requests will begin setting all text
+in the special font
+if you do not provide a parameter.
+No more than one word
+should appear
+with these three font requests
+in the middle of lines.
+This is because
+of the way \*G justifies text.
+For example,
+if you were to issue the requests:
+.(b
+\&.u "some underlined words"
+and
+\&.bx "words in a box"
+.)b
+in the middle of a line
+\*G would produce
+.u "some underlined words"
+and
+.bx "words in a box" ,\p
+which I think you will agree does not look good.
+.pp
+The second parameter
+of all font requests
+is set in the original font.
+For example,
+the font request:
+.(b
+\&.b bold face
+.)b
+generates
+.q bold
+in bold font,
+but sets
+.q face
+in the font of the surrounding text,
+resulting in:
+.(b
+.b bold face.
+.)b
+To set the two words
+.b bold
+and
+.b face
+both in
+.b "bold face" ,
+type:
+.(b
+\&.b "bold face"
+.)b
+.pp
+You can mix fonts in a word by using the
+special sequence
+.b \ec
+at the end of a line
+to indicate
+.q "continue text processing" ;
+this allows input lines
+to be joined together
+without a space between them.
+For example, the input:
+.(b
+\&.u under \ec
+\&.i italics
+.)b
+generates
+.u under \c
+.i italics ,
+but if we had typed:
+.(b
+\&.u under
+\&.i italics
+.)b
+the result would have been
+.u under
+.i italics
+as two words.
+.sh 2 "Point Sizes"
+.pp
+The phototypesetter
+supports different sizes of type,
+measured in points.
+The default point size
+is 10 points
+for most text,
+8 points for footnotes.
+To change the point size,
+type:
+.(b
+\&.sz \c
+.i +N
+.)b
+where
+.i N
+is the size wanted in points.
+The
+.i "vertical spacing"
+(distance between the bottom of most letters
+(the
+.i baseline )
+between adjacent lines)
+is set to be proportional
+to the type size.
+.pp
+These point-size changes are
+.i temporary !!!
+For example,
+to reset the point size of basic text to twelve point, use:
+.(b
+\&.nr pp 12
+\&.nr sp 12
+\&.nr tp 12
+.)b
+to reset the default point size of
+paragraphs,
+section headers,
+and titles respectively.
+If you only want to set the names of sections in a larger point size,
+use:
+.(b
+\&.nr sp 11
+.)b
+alone \*- this sets section titles
+(e.g.,
+.b "Point Sizes"
+above)
+in a larger font than the default.
+.pp
+A single word or phrase can be set in a smaller point size
+than the surrounding text
+using the
+.b .sm
+request.
+This is especially convenient for words that are all capitals,
+due to the optical illusion that makes them look even larger
+than they actually are.
+For example:
+.(b
+\&.sm UNIX
+.)b
+prints as
+.sm UNIX
+rather than
+UNIX.
+.\" Dave Kemper notes that the following probably has not been true
+.\" since 1986; keeping (but commented) for historical interest.
+.\" .pp
+.\" Warning:
+.\" changing point sizes
+.\" on the phototypesetter
+.\" is a slow mechanical operation.
+.\" On laser printers it may require loading new fonts.
+.\" Size changes
+.\" .ne 1i
+.\" should be considered carefully.
+.sh 2 "Quotes"
+.pp
+It is conventional when using
+the typesetter to
+use pairs of grave and acute accents
+to generate double quotes,
+rather than the
+double quote character
+(`\|"\|').
+This is because it looks better
+to use grave and acute accents;
+for example, compare
+"quote" to
+``quote''.
+.pp
+You may use the sequences
+.b \e*(lq
+and
+.b \e*(rq
+to stand for the left and right quote
+respectively.
+For example,
+use:
+.(b
+\e*(lqSome things aren\(aqt true
+even if they did happen.\e*(rq
+.)b
+to generate the result:
+.(b
+.q "Some things aren't true even if they did happen."
+.)b
+As a shorthand,
+the special font request:
+.(b
+\&.q "quoted text"
+.)b
+will generate
+.q "quoted text" .
+Notice that you must surround
+the material to be quoted
+with double quote marks
+if it is more than one word.
+.sx 0
+.uh Acknowledgments
+.pp
+I would like to thank
+Bob Epstein,
+Bill Joy,
+and Larry Rowe
+for having the courage
+to use the \-me macros
+to produce non-trivial papers
+during the development stages;
+Ricki Blau,
+Pamela Humphrey,
+and Jim Joyce
+for their help with the documentation phase;
+peter kessler
+for numerous complaints years after I was
+.q done
+with this project,
+most accompanied by fixes
+(hence forcing me to fix several small bugs);
+and the plethora of people who have contributed ideas
+and have given support for the project.
+.\" Local Variables:
+.\" mode: nroff
+.\" End:
+.\" vim: filetype=groff:
diff --git a/doc/meintro_fr.me.in b/doc/meintro_fr.me.in
new file mode 100644
index 0000000..4c49586
--- /dev/null
+++ b/doc/meintro_fr.me.in
@@ -0,0 +1,2374 @@
+.\" groff -kt -me -mfr
+.\"
+.\" Copyright (c) 1986, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in
+.\" the documentation and/or other materials provided with the
+.\" distribution.
+.\" 3. [Deleted. See
+.\" ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change]
+.\" 4. Neither the name of the University nor the names of its
+.\" contributors may be used to endorse or promote products derived
+.\" from this software without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS"
+.\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+.\" PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
+.\" CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)intro.me 8.2 (Berkeley) 06/01/94
+.\"
+.\" Modified for groff by jjc@jclark.com.
+.\"
+.\" Translated to French by Grégoire Babey <gibux@gmx.ch>
+.\"UC 7
+.if t .ll 6.5i
+.if t .lt 6.5i
+.nr sx 0
+.ds MO @VERSION@
+.nr si 3n
+.he '\f(BIgroff\fP en option \f(BI\-me\fP''%'
+.\"eh 'USD:19-%''Writing Papers with NROFF using \-me'
+.\"oh 'Writing Papers with NROFF using \-me''USD:19-%'
+.ds U Unix
+.ds N \fInroff\fP
+.ds T \fItroff\fP
+.ds G \fIgroff\fP
+.ds UG groff\" upright "groff" for use in slanted contexts
+.+c
+.(l C
+.sz 14
+.b "Rédiger des documents avec \f(BIgroff \-me\fP"
+.sz
+.sp 2
+.ul
+Eric P. Allman
+.sp
+Projet INGRES
+Electronics Research Laboratory
+University of California, Berkeley
+Berkeley, California 94720
+.sp 2
+.i "Modifié pour \fR\*(UG\fP par James Clark*"
+.(f
+* Ce document a été
+.i \*(UG\fRé \" defeat italic correction
+le 27 octobre 2001 et s'applique à la version des macros \-me
+inclus dans la version \*(MO de \*G.
+.)f
+.sp 2
+.i "Adapté au français par Grégoire Babey\(dg"
+.(f
+\(dg La traduction française a été
+.i \*(UG\fRée \" defeat italic correction
+le 20 octobre 2013,
+toutes les commandes ont été testées sur la version 1.21 de \*G.
+.)f
+.)l
+.sp 2
+.pp
+Ce document décrit les outils de traitement de texte
+sur un système \*U
+et autres systèmes d'exploitation
+fournis par \*G
+et le
+paquet de macros
+\-me.
+Il présuppose que le lecteur
+est déjà familiarisé avec les systèmes \*U
+et un éditeur de texte
+(tel que par exemple
+.i vi ).
+Son intention est d'être une introduction
+simple et concrète, et par conséquent,
+il ne traitera pas toute la matière disponible.
+En particulier,
+de nombreuses variantes et fonctionnalités supplémentaires
+du paquet de macros \-me ne seront pas décrites.
+Pour une discussion plus complète de telle ou telle fonctionnalité,
+voyez
+.q "\fIme\fP Reference Manual"
+et
+.i "groff: The GNU implementation of troff."
+.pp
+\*G, est un logiciel
+fonctionnant sur le système d'exploitation \*U.
+Il lit un fichier d'entrée
+préparé par l'utilisateur
+et sort un texte formaté,
+prêt à être publié ou mis en page.
+Le fichier d'entrée est formé de
+.i texte ,
+les mots destinés à être imprimés,
+et de
+.i requêtes ,
+qui donnent des instructions au programme \*G
+et lui indiquent quelle forme donner à la copie imprimée.
+.nr ii \w'Chapitre\~\0'u+1n
+.ip "Chapitre\~1"
+décrit les éléments de base du traitement de texte.
+.ip "Chapitre\~2"
+décrit les requêtes de base.
+.ip "Chapitre\~3"
+introduit les mises en évidence: citations, tableaux, figures.
+.ip "Chapitre\~4"
+annotations (notes en bas de page, texte différé, index).
+.ip "Chapitre\~5"
+requêtes plus complexes, n'ayant pu être traitées au chapitre 2.
+.ip "Chapitre\~6"
+les choses que vous devez savoir pour pouvoir rédiger des documents.
+.pp
+Si vous êtes novice,
+vous ne voudrez sans doute pas attendre d'avoir lu jusqu'au chapitre 4
+pour tester par vous mêmes les fonctions de base du programme.
+Quand votre texte sera prêt à être traité,
+appelez le formateur \*G en tapant
+cette commande dans votre shell \*U (ou terminal):
+.(b
+groff \-k \-me \-mfr foo.me > foo.ps
+.)b
+L'option
+.b \-k
+tient compte des caractères accentués propres au français.
+L'option
+.b \-mfr
+permet de configurer les espaces entre les phrases
+ainsi que les césures de manière appropriée
+si on suppose que
+.q foo.me
+est rédigé en français.
+Remplacez
+.q foo
+par le nom de votre fichier qui devra être en un mot.
+Le fichier devra être placé dans votre répertoire personnel,
+sinon remplacez foo par le chemin du fichier.
+À la place de \&.ps,
+vous pouvez mettre \&.pdf ou le format que vous désirez obtenir.
+Vous trouverez un description plus complète des options pour la commande
+\*G en tapant
+.b "man groff"
+dans votre terminal ou console.
+.pp
+Le mot
+.i argument
+est utilisé dans ce manuel
+pour décrire un mot ou un nombre
+qui apparait sur la même ligne qu'une requête
+en modifiant le sens de cette requête.
+Par exemple,
+la requête
+.(b
+\&.sp
+.)b
+met un espace après une ligne,
+mais
+.(b
+\&.sp 4
+.)b
+met 4 espaces après une ligne.
+Le nombre
+.b 4
+est un
+.i argument
+de la requête
+.b .sp
+qui lui dit d'espacer de quatre lignes
+au lieu d'une.
+Les arguments sont séparés de la requête et des autres arguments
+par un espacement.
+.sh 1 "Éléments de base du traitement de texte"
+.pp
+La fonction primaire
+de \*G
+est de
+.i collecter
+des mots sur les lignes du fichier d'entrée, de
+.i remplir
+de ces mots les lignes du ficher de sortie, de
+.i justifier
+le texte sur la marge de droite
+en insérant des espaces supplémentaires entre les mots,
+et de rendre le fichier de sortie.
+Par exemple,
+l'entrée:
+.(b
+Maintenant il est temps
+pour tous les hommes bons
+de venir en aide
+à leur parti.
+Il y a quatre-vingt-sept ans...
+.)b
+sera lu,
+rendu dans des lignes de sortie,
+et justifié,
+ce qui produira:
+.(b F
+Maintenant il est temps
+pour tous les hommes bons
+de venir en aide
+à leur parti.
+Il y a quatre-vingt-sept ans...
+.)b
+Parfois,
+vous désirerez commencer une nouvelle ligne,
+même si la ligne actuelle n'est pas encore pleine;
+par exemple,
+à la fin d'un paragraphe.
+Pour y parvenir,
+vous pouvez provoquer une
+.i interruption:
+une ligne d'entrée vide,
+ou une nouvelle ligne commençant par un espacement
+provoquent le début d'une nouvelle ligne.
+Certaines requêtes provoquent automatiquement une interruption.
+.pp
+Les lignes d'entrée ne sont pas toutes destinées à être formatées
+(voir plus bas).
+Certaines lignes sont des
+.i requêtes
+qui décrivent
+comment le texte doit être formaté.
+Les requêtes commencent toujours par un point ou une apostrophe
+(\c
+.q "\|\(aq\|" ).
+.pp
+Le formateur de texte effectue aussi des tâches plus complexes,
+comme la numérotation automatique des pages,
+le saut de page automatique,
+le placement des notes en bas de page au bon endroit,
+et ainsi de suite.
+.pp
+Je peux vous donner quelques conseils
+comment préparer votre texte d'entrée pour \*G.
+Premièrement,
+écrivez des lignes d'entrée courtes.
+Des lignes d'entrée courtes seront plus faciles à modifier,
+et de toutes façons, \*G les saisira pour vous en lignes plus longues.
+En accord avec cette idée,
+il est pratique de commencer une
+nouvelle ligne après
+chaque virgule ou point,
+puisque habituellement les corrections consistent à
+modifier ou supprimer des propositions ou des phrases.
+Deuxièmement,
+n'ajoutez pas d'espacements à la fin des lignes.
+Troisièmement,
+ne séparez pas vous-même les mots en fin de ligne
+avec des traits d'union
+(excepté les mots qui en contiennent naturellement,
+comme
+.q belle-mère );
+\*G est assez futé pour séparer pour vous les mots qui doivent l'être,
+mais il ne l'est pas assez pour réunir les syllabes
+que vous auriez séparées vous-même.
+Ainsi,
+des mots tels que
+.q belle-mère
+ne devraient pas être écrit sur deux lignes,
+sinon vous obtiendrez un espacement là ou vous n'en vouliez pas,
+comme ici par exemple:
+.tr @-
+.nh
+.q "belle@\~mère" .
+.br
+.tr @@
+.hy 14
+.sh 1 "Requêtes de base"
+.sh 2 "Paragraphes"
+.pp
+On commence un nouveau paragraphe
+en utilisant la requête
+.b .pp .
+Par exemple,
+l'entrée:
+.(b
+\&.pp
+Maintenant il est temps pour tous les hommes bons
+de venir en aide à leur parti.
+Il y a quatre-vingt-sept ans...
+.)b
+donne un ligne d'espacement, suivie d'une ligne indentée.
+Le résultat est:
+.(b F
+.ti +\n(piu
+Maintenant il est temps pour tous les hommes bons
+de venir en aide à leur parti.
+Il y a quatre-vingt-sept ans...
+.)b
+.pp
+Notez que les phrases d'un paragraphes ne
+.i "devront pas"
+commencer par un espacement,
+puisque une ligne d'espacement ou un espace en début de ligne
+provoque une interruption.
+Par exemple,
+si je tapais:
+.(b
+\&.pp
+Maintenant il est temps pour tous les hommes bons
+ de venir en aide à leur parti.
+Il y a quatre-vingt-sept ans...
+.)b
+La sortie serait:
+.(b F
+.ti +\n(piu
+Maintenant il est temps pour tous les hommes bons
+ de venir en aide à leur parti.
+Il y a quatre-vingt-sept ans...
+.)b
+Une nouvelle ligne commence après le mot
+.q bons
+parce que la deuxième ligne d'entrée a été commencée avec un espacement.
+.pp
+Il existe beaucoup de types de paragraphes plus élaborés,
+qui seront décrits plus tard.
+.sh 2 "En-têtes et pied de page "
+.pp
+On peut ajouter si on veut des en-têtes et des pieds de page.
+Deux requêtes
+ayant la forme de
+.b .he \~\c
+.i titre
+and
+.b .fo \~\c
+.i titre
+définissent les titres à mettre respectivement en haut
+et en pied de page.
+Ces titres sont appelés titres
+.i "en trois parties"
+:
+une première partie est justifiée sur la gauche,
+la deuxième est centrée,
+la troisième justifiée sur la droite.
+Les trois parties sont séparées par des apostrophes.
+Le signe %,
+si il est présent dans le titre,
+sera automatiquement remplacé par le numéro de page courant.
+Par exemple l'entrée:
+.(b
+\&.he \(aq\(aq%\(aq\(aq
+.)b
+donnera le numéro de page courant centré sur chaque page.
+.(b
+\&.he \(aq\(aq\(aq%\(aq
+.)b
+donnera le numéro de page jusifié à droite sur chaque page.
+.(b
+\&.he \(aqGroff -me\(aqTraduction\(aq%\(aq
+.)b
+donnera à gauche "Groff -me",
+au centre "Traduction" et à droite le numéro de page courant.
+.br
+Les éléments de l'en-tête peuvent débuter par n'importe quelle lettre,
+mais antislash et guillemets sont à éviter.
+La commande
+.b .fo
+fonctionne de manière analogue.
+.sh 2 "Double espacement"
+.pp
+.ls 2
+\*G insère un double espacement vertical dans le texe de sortie
+si vous utilisez la requête
+.b ".ls\~2" ,
+comme cela a été fait ici.
+Vous pouvez retourner à l'espacement vertical simple en tapant
+.b ".ls\~1" .
+.ls 1
+.sh 2 "Layout de la page"
+.pp
+Un certain nombre de requêtes
+vous permettent de modifier la présentation de la copie imprimée,
+ce qu'on appelle le
+.i layout
+de la page de sortie.
+La plupart de ces requêtes ajustent dans le texte des
+.q "espaces blancs"
+(espacement, espacement vertical).
+Dans les explications qui suivent, les caractères en italique
+doivent être remplacés par les valeurs que vous souhaitez;
+les caractères gras
+devront être tapés tels quels.
+.pp
+La requête
+.b .bp
+commence une nouvelle page.
+.pp
+La requête
+.b .sp \~\c
+.i N
+laisse
+.i N
+lignes d'espacement vertical.
+.i N
+peut être négligé
+(dans ce cas, il n'y aura qu'une ligne d'espacement),
+ou peut prendre la forme
+.i N \^\c
+.b i
+(pour
+.i N
+pouces)
+or
+.i N \^\c
+.b c
+(pour
+.i N
+centimètres).
+Par exemple, l'entrée:
+.(b
+\&.sp 3.5c
+Mes pensées sur le sujet
+\&.sp
+.)b
+laissera trois centimètres et demi d'espace sur la gauche,
+suivis de la ligne
+.q "Mes pensées sur le sujet" ,
+suivie elle-même d'un espacement vertical.
+.pp
+Cette requête ne laissera pas d'espacement vertical en haut d'une page.
+Si vous avez besoin de l'espacement que apparaisse quelle que soit la
+position sur la page,
+utilisez la requête
+.b .bl
+, qui a la même syntaxe que
+.b .sp
+mais qui ajoutera toujours l'espacement demandé,
+même en haut d'une page.
+.pp
+La requête
+.b .in \~\c
+.i +N
+change le nombre d'espacements sur la gauche de la page
+(l'
+.i indentation).
+L'argument
+.i N
+peut avoir la forme
+.b + \c
+.i N
+(ce qui veut dire
+.i N
+espacements de plus que ce qu'il y avait avant),
+.b \- \c
+.i N
+(ce qui veut dire
+.i N
+espacements de moins que ce qu'il y avait avant),
+ou juste
+.i N
+(ce qui veut dire exactement
+.i N
+espacements).
+.i N
+peut aussi avoir la forme
+.i N \^\c
+.b i
+ou
+.i N \^\c
+.b c .
+Par exemple,
+l'entrée:
+.(b
+texte initial
+\&.in 5
+plus de texte
+\&.in +1i
+encore plus de texte
+\&.in \-2c
+fin du texte
+.)b
+produit
+.q "texte initial"
+justifié à gauche
+.q "plus de texte"
+indenté à 5 espacements
+de la marge de gauche,
+.q "encore plus d texte"
+indenté à 5 espacements
+plus un pouce
+de la marge de gauche
+(15 espacements sur une machine à écrire à picas),
+et
+.q "fin du texte"
+à 5 espacements
+plus un pouce
+moins deux centimètres
+de la marge de gauche.
+C'est à dire la sortie suivante:
+.(b
+texte initial
+.in +5
+plus de texte
+.in +1i
+encore plus de texte
+.in -2c
+fin du texte
+.)b
+.pp
+La requête
+.b .ti \~\c
+.i +N
+(indentation temporaire)
+est utilisée de la même manière que
+.b .in \~\c
+.i +N
+quand l'indentation ne concerne qu'une seule ligne,
+après quoi on retourne à l'indentation initiale.
+Par exemple,
+l'entrée:
+.(b
+\&.in 1i
+\&.ti 0
+Ware, James R. The Best of Confucius,
+Halcyon House, 1950.
+Un livre excellent,
+qui présente en traduction (anglaise)
+les phrases les plus délicieuses de Confucius.
+Décidément un passage obligé
+pour tous ceux qui s'intéressent
+au fondements primitifs de la philosophie chinoise.
+.)b
+produira:
+.sp 2
+.in 1i+\n($iu
+.ti \n($iu
+Ware, James R. The Best of Confucius,
+Halcyon House, 1950.
+Un livre excellent, qui présente
+en traduction (anglaise) les phrases les plus délicieuses de Confucius.
+Décidément un passage obligé pour tous ceux
+qui s'intéressent au fondements primitifs de la philosophie chinoise.
+.pp
+Les lignes de texte peuvent être centrées en utilisant la requête
+.b .ce .
+La ligne qui suit
+.b .ce
+est centrée (horizontalement)
+sur la page.
+Pour centrer plus qu'une ligne,
+utilisez
+.b .ce \~\c
+.i N
+(où
+.i N
+est le nombre de lignes à centrer),
+suivi de
+.i N
+lignes.
+Si vous voulez centrer plusieurs lignes,
+mais vous vous refusez à les compter,
+tapez:
+.(b
+\&.ce 1000
+lignes à centrer
+\&.ce 0
+.)b
+Cette requête
+.b ".ce\~0"
+dit à \*G de ne centrer plus que 0 lignes,
+c'est à dire,
+d'arrêter de centrer.
+.pp
+Toutes ces requêtes provoquent une interruption;
+c'est à dire qu'elles commencent toutes une nouvelle ligne.
+Si vous voulez commencer une nouvelle ligne sans rien faire d'autre,
+utilisez
+.b .br .
+.sh 1 "Mises en évidences"
+.pp
+Les mises en évidences sont des passages de textes sortis
+du corps de texte.
+Citations,
+tableaux
+et figures
+sont des types de mise en évidence,
+comme le sont tous les exemples
+exposés dans ce document.
+Toutes les mises en évidence,
+exceptés les blocs centrés,
+sont précédés et suivis en sortie d'un seul espacement vertical.
+.sh 2 "Citations longues"
+.pp
+Les citations longues
+sont des citations qui s'étalent sur plusieurs lignes,
+elles sont donc sorties du corps de texte
+et ne sont pas entourées de guillemets.
+Cela peut être réalisé
+en utilisant les requêtes
+.b .(q
+et
+.b .)q
+entourant la citation.
+Par exemple,
+l'entrée:
+.(b
+Comme l'indique Weizenbaum:
+\&.(q
+On dit qu'expliquer, c'est expliquer en s'éloignant.
+Cette maxime ne s'accomplit nulle part aussi bien
+que dans le domaine de la programmation informatique,...
+\&.)q
+.)b
+génère comme sortie:
+.lp
+Comme l'indique Weizenbaum:
+.(q
+On dit qu'expliquer, c'est expliquer en s'éloignant.
+Cette maxime ne s'accomplit nulle part aussi bien
+que dans le domaine de la programmation informatique,...
+.)q
+.sh 2 "Listes"
+.pp
+Une
+.i liste
+est une mise en évidence
+indentée,
+à espacements simples,
+non justifiée.
+On devrait utiliser une liste
+quand le matériel à imprimer
+ne doit pas être justifié comme un texte normal,
+tels les colonnes de figures
+ou les exemples utilisés dans ce document.
+Les listes sont encadrées par les requêtes
+.b .(l
+et
+.b .)l .
+Par exemple,
+tapez:
+.(b
+La famille des Équidés comprend:
+\&.(l
+les chevaux
+les ânes
+les hémiones
+les zèbres
+\&.)l
+.)b
+cela produira:
+.br
+La famille des Équidés comprend:
+.(l
+les chevaux
+les ânes
+les hémiones
+les zèbres
+.)l
+.sh 2 "Clos"
+.pp
+Un
+.i clos
+est un ensemble de lignes mises en évidences
+que l'on désire garder sur la même page
+si possible.
+Par exemple un diagramme.
+Les clos diffèrent des listes.
+Les listes peuvent être réparties sur plusieurs pages,
+tandis que les clos ne peuvent pas l'être.
+.pp
+Les blocs sont un genre primitif de clos.
+Ils débutent avec la requête
+.b .(b
+et se terminent avec la requête
+.b .)b .
+Si il n'y a pas de place sur la page courante
+pour y placer le bloc entier,
+il sera placé sur une nouvelle page.
+Cela a pour effet déplaisant de laisser
+un espace blanc en fin de page.
+Quand cela n'est pas approprié,
+vous pouvez user d'une alternative
+appelée
+.i "clos flottants" .
+.pp
+Les
+.i "clos flottants"
+se déplacent dans le texte.
+Donc,
+il sont appropriés pour les choses
+auxquelles on se réfère nommément, comme
+.q "voir Figure 3" .
+Un clos flottant apparaîtra
+au bas de la page courante
+si il y a la place;
+autrement,
+il apparaîtra
+sur la page suivante.
+Les clos flottants commencent par
+.b .(z
+et finissent par
+.b .)z .
+Comme exemple de clos flottant,
+voir figure 1.
+.(z
+.in 1i
+.xl -1i
+.hl
+\&.(z
+\&.hl
+Texte du clos flottant
+\&.sp
+\&.ce
+Figure 1. Exemple de clos flottant.
+\&.hl
+\&.)z
+.sp
+.ce
+Figure 1. Exemple de clos flottant.
+.hl
+.)z
+La requête
+.b .hl
+est utilisée
+pour dessiner une ligne horizontale
+de sorte que la figure
+soit séparée du texte.
+.sp 15
+.sh 2 "Mises en évidences plus élaborées"
+.pp
+Les clos et les listes sont normalement collectés en mode
+.i non-justifié .
+Ils sont donc propres à contenir des tableaux et autres.
+Si vous voulez obtenir une mise en évidence
+en mode justifié
+(pour du texte),
+tapez
+.b ".(l\~F"
+[Tout au long de ce chapitre,
+les remarques s'appliquant à
+.b .(l
+s'appliquent aussi à
+.b .(b
+et
+.b .(z ].
+Cette espèce de mise en évidence
+sera indentée des deux côtés.
+Par exemple,
+l'entrée:
+.(b
+\&.(l F
+Et maintenant les garçons et les filles,
+un jouet plus grand,
+plus beau que tout ce qui a existé auparavant!
+Soyez le premier, la première de votre quartier
+à posséder votre propre ordinateur!
+Oui les enfants, vous aussi vous pouvez posséder
+une de ces machines à gérer les informations.
+Vous aussi vous pouvez produire de beaux papiers
+formatés sans même remuer le petit doigt!
+\&.)l
+.)b
+donnera en sortie:
+.(b F
+Et maintenant les garçons et les filles,
+un jouet plus grand,
+plus beau que tout ce qui a existé auparavant!
+Soyez le premier, la première de votre quartier
+à posséder votre propre ordinateur!
+Oui les enfants, vous aussi vous pouvez posséder
+une de ces machines à gérer les informations.
+Vous aussi vous pouvez produire de beaux papiers
+formatés sans même remuer le petit doigt!
+.)b
+.pp
+Par exemple,
+pour obtenir une liste justifiée,
+alignée sur la gauche, entrez:
+.(b
+\&.(l L F
+Et maintenant les garçons et les filles,
+un jouet plus grand,
+plus beau que tout ce qui a existé auparavant!
+Soyez le premier, la première de votre quartier
+à posséder votre propre ordinateur!
+Oui les enfants, vous aussi vous pouvez posséder
+une de ces machines à gérer les informations.
+Vous aussi vous pouvez produire de beaux papiers
+formatés sans même remuer le petit doigt!
+\&.)l
+.)b
+Ce qui donnera:
+.(l L F
+Et maintenant les garçons et les filles,
+un jouet plus grand,
+plus beau que tout ce qui a existé auparavant!
+Soyez le premier, la première de votre quartier
+à posséder votre propre ordinateur!
+Oui les enfants, vous aussi vous pouvez posséder
+une de ces machines à gérer les informations.
+Vous aussi vous pouvez produire de beaux papiers
+formatés sans même remuer le petit doigt!
+.)l
+.pp
+Normalement, les listes et les blocs sont indentés
+(les clos flottant sont normalement alignés sur la gauche).
+Pour obtenir une liste
+alignée sur la gauche,
+tapez
+.b ".(l\~L" .
+Pour obtenir une ligne centrée
+ligne après ligne,
+tapez
+.b ".(l C" .
+L'entrée:
+.(b
+\&.(l
+première ligne d'une mise en évidence non-justifiée
+lignes suivantes
+\&.)l
+.)b
+produit un texte indenté:
+.(b
+première ligne d'une mise en évidence non-justifiée
+lignes suivantes
+.)b
+En tapant
+.b L
+après la requête
+.b .(l
+cela produira le même résultat, mais aligné à gauche:
+.(b L
+première ligne d'une mise en évidence non-justifiée
+lignes suivantes
+.)b
+Si vous utilisez
+.b C
+à la place de
+.b L
+vous obtenez une liste centrée:
+.(b C
+première ligne d'une mise en évidence non-justifiée
+lignes suivantes
+.)b
+.pp
+Parfois,
+vous voudrez centrer
+plusieurs lignes en groupe
+plutôt que de centrer ligne par ligne.
+Pour le faire,
+utilisez les blocs centrés
+qui sont produits par les requêtes
+.b .(c
+et
+.b .)c .
+Toutes les lignes sont centrées en tant que groupe.
+La ligne la plus longue est centrée par rapport aux marges
+et les lignes plus courtes sont alignées sur la plus longue.
+Notez que si vous utilisez un bloc centré,
+les lignes ne bougent pas les unes par rapport aux autres,
+tandis qu'elles le feront si vous utilisez l'argument
+.b C
+pour les clos.
+.pp
+Les blocs centrés ne sont
+.i pas
+des clos,
+et peuvent même être combinés
+avec eux comme nous allons le voir.
+Par exemple,
+pour centrer des lignes
+en groupe
+et les garder
+sur une même page,
+utilisez:
+.(b
+\&.(b L
+\&.(c
+première ligne d'une mise en évidence non-justifiée
+lignes suivantes
+\&.)c
+\&.)b
+.\" .ne 1i
+.)b
+ce qui produira:
+.(b L
+.(c
+première ligne d'une mise en évidence non-justifiée
+lignes suivantes
+.)c
+.)b
+Sans les requêtes
+(\c
+.b .(b
+et
+.b .)b )
+le résultat aurait été le même,
+mais sans garantie
+que les lignes du bloc centré
+aient été sur la même page.
+Notez l'usage de l'argument
+.b L
+après
+.b .(b .
+Il fait en sorte
+que le bloc se centre
+sur toute la longueur de la ligne
+plutôt que sur la longueur de ligne raccourcie de l'indentation.
+Aussi,
+la requête demandant de centrer
+doit être placée
+.i à \~l'intérieur
+de la requête formant le clos.
+.sh 1 "Annotations"
+.pp
+Un certain nombre de requêtes
+servent à mettre du texte de côté
+pour l'imprimer plus tard, comme les
+.i "notes en bas de page"
+qui sont imprimées au bas de la page courante.
+.br
+Le
+.i "texte différé"
+est en quelque sorte une variante de la
+note en bas de page;
+le texte n'est imprimé
+qu'au moment où on fait appel à lui,
+par exemple à la fin de chaque chapitre.
+.br
+Les
+.i Index
+sont un genre de texte différé
+ayant un numéro de rappel
+(habituellement le numéro de la page)
+attaché à chaque entrée
+après une rangée de points.
+Les Index sont aussi mis de côté
+jusqu'à ce qu'on fasse explicitement appel à eux.
+.sh 2 "Notes en bas de page"
+.pp
+Une note en bas de page commence avec la requête
+.b .(f
+et se termine avec la requête
+.b .)f .
+La note en bas de page courante
+est maintenue automatiquement,
+et peut être utilisée en tapant \e**,
+ce qui produira un numéro de note\**.
+.(f
+\**Comme celui-ci.
+.)f
+Le numéro est automatiquement incrémenté
+après chaque note en bas de page.
+Par exemple,
+l'entrée:
+.(b
+\&.(q
+Un homme qui n'est pas honnête
+et qui, en même temps, est présomptueux;
+un homme qui n'est pas attentif
+et qui, en même temps, est ignorant;
+un homme qui est rempli de mensonge
+et qui, en même temps, est incompétent;
+un tel homme ne fait pas partie de mes relations.\e**
+\&.(f
+\e**Traduit de :James R. Ware,
+\&.ul
+The Best of Confucius,
+Halcyon House, 1950.
+Page 77.
+\&.)f
+\&.)q
+.)b
+génère le résultat suivant:
+.(q
+Un homme qui n'est pas honnête
+et qui, en même temps, est présomptueux;
+un homme qui n'est pas attentif
+et qui, en même temps, est ignorant;
+un homme qui est rempli de mensonge
+et qui, en même temps, est incompétent;
+un tel homme ne fait pas partie de mes relations.\**
+.(f
+\**Traduit de: James R. Ware,
+.ul
+The Best of Confucius,
+Halcyon House, 1950.
+Page 77.
+.)f
+.)q
+Il est important que la note en bas de page
+apparaisse
+.i "à l'intérieur"
+de la citation,
+ainsi vous serez sûr
+qu'elle
+apparaîtra
+sur la même page
+que la citation.
+.sh 2 "Texte différé"
+.pp
+Le texte différé
+ressemble beaucoup à la note en bas de page
+sauf qu'il est imprimé seulement
+si on fait explicitement appel à lui.
+Cela permet de faire apparaître par exemple
+une liste de références
+à la fin de chaque chapitre,
+ce qui est une convention dans certaines disciplines.
+Utilisez
+.b \e*#
+pour le texte différé
+en lieu et place du
+.b \e**
+des notes en bas de page.
+.pp
+Si vous faites du texte différé
+votre moyen habituel de noter les références,
+vous pourrez toujours utiliser en parallèle
+les notes en bas de page,
+mais, comme référence,
+vous utiliserez alors des signes spéciaux*
+.(f
+*comme un astérisque (!)
+.)f
+plutôt que des numéros.
+.br
+Pour faire apparaître une note en bas de page munie
+d'un signe spécial comme celle que vous admirez ci- dessus,
+entrez:
+.br
+\&...vous utiliserez alors des signes spéciaux*.
+.br
+Suivi de:
+.(b
+\&.(f
+.br
+*comme un astérisque (!).
+.br
+\&.)f
+.)b
+.sh 2 "Index"
+.pp
+Un
+.q index
+(ou plutôt table des matières
+puisque les éléments ne sont pas classés
+par ordre alphabétique)
+ressemble au texte différé,
+par le fait qu'il est gardé en réserve
+jusqu'à ce qu'on fasse appel à lui.
+Cependant,
+chaque élément de l'index
+a un numéro de page
+(ou un autre signe distinctif)
+à la fin de la dernière ligne le décrivant,
+à la suite d'une rangée de points (voir ci-dessous).
+.pp
+Les entrées pour l'index
+commencent avec
+.b .(x
+et finissent avec
+.b .)x .
+Dans chaque chapitre
+dont vous voulez qu'il apparaisse dans l'index,
+introduisez une telle requête
+en répétant l'énoncé du titre**.
+.(f
+**Voir aussi le plan de thèse exposé au chapitre 5.3.
+.)f
+La requête
+.b .)x
+peut avoir un argument,
+quand on veut formuler soi-même
+une valeur prenant la place du
+.q "numéro de page" .
+Sans argument,
+c'est le numéro de page où se trouve la requête
+qui sera utilisé automatiquement.
+Si le numéro de page donné est un trait de soulignage
+(\c
+.q _ )
+aucun numéro de page
+ou ligne de points ne sera imprimé.
+Pour obtenir une ligne de points
+sans numéro de page,
+tapez
+.b ".)x """"" ,
+ce qui signifie qu'il n'y a pas de numéro de page.
+.pp
+La requête
+.b .xp
+imprime l'index.
+.pp
+Par exemple,
+l'entrée:
+.(b
+\&.(x
+Cire à cacheter
+\&.)x
+\&.(x
+Des choux et des rois
+\&.)x _
+\&.(x
+Pourquoi la mer bout
+\&.)x 2.5a
+\&.(x
+Si les cochons avaient des ailes
+\&.)x ""
+\&.(x
+Ceci est une entrée d'index terriblement longue,
+comme on pourrait en avoir besoin pour
+une liste d'illustrations, de tableaux, ou de figures;
+je m'attends à ce qu'elle fasse au moins deux lignes.
+\&.)x
+\&.xp
+.)b
+génère:
+.(x
+Cire à cacheter
+.)x
+.(x
+Des choux et des rois
+.)x _
+.(x
+Pourquoi la mer bout
+.)x 2.5a
+.(x
+Si les cochons avaient des ailes
+.)x ""
+.(x
+Ceci est une entrée d'index terriblement longue,
+comme on pourrait en avoir besoin pour
+une liste d'illustrations, de tableaux, ou de figures;
+je m'attends à ce qu'elle fasse au moins deux lignes.
+.)x
+.xp
+.pp
+La requête
+.b .(x
+peut avoir comme argument
+un caractère unique,
+qui spécifie le
+.q nom
+de l'index;
+l'index normal répond à la requête
+.b x .
+Donc,
+on peut maintenir plusieurs
+.q indices
+simultanément**
+.(f
+**Voir aussi le plan de thèse exposé au chapitre 5.3
+.)f
+(un pour la liste des tableaux, un pour la table des matières, etc.).
+.pp
+Notez que l'index doit
+être imprimé à la
+.i fin
+du document,
+plutôt qu'au début
+où il apparaîtra sans doute
+(en temps que table des matières);
+les pages devront peut-être être réarrangées physiquement
+après impression.
+.sh 1 "Fonctionnalités plus complexes"
+.pp
+Il existe un grand nombre d'autres possibilités,
+notamment des requêtes
+qui fournissent d'autres types de paragraphes,
+des chapitres numérotés en forme
+.b 1.2.3
+(comme ils le sont dans le présent document),
+et l'impression sur plusieurs colonnes.
+.sh 2 "Autres types de paragraphes"
+.pp
+Généralement, les paragraphes
+commencent par un espacement vertical et
+la première ligne est indentée.
+On peut obtenir des paragraphes justifiés
+et alignés à gauche
+en utilisant
+.b .lp
+au lieu de
+.b .pp ,
+comme démontré au paragraphe suivant.
+.lp
+Parfois, vous voudrez utiliser des paragraphes dont le
+.i corps
+est indenté
+et la première ligne
+non-indentée
+et munie d'un label.
+Cela peut être réalisé grâce à la requête
+.b .ip .
+Un mot spécifié sur la même ligne que
+.b .ip
+est imprimé dans la marge,
+et le corps du paragraphe est aligné
+sur une position prédéfinie
+.\" .ne 1i
+(normalement cinq espacements).
+Par exemple,
+l'entrée:
+.(b
+\&.ip un
+Ceci est le premier paragraphe.
+Notez comment le reste de la première
+ligne s'aligne
+sur les autres lignes du paragraphe.
+\&.ip deux
+Et ici nous sommes déjà au second paragraphe.
+Vous noterez que l'argument de \c
+.b .ip
+apparaît dans la marge.
+\&.lp
+Nous pouvons poursuivre ce texte...
+.)b
+produit comme sortie:
+.ip un
+Ceci est le premier paragraphe.
+Notez comment le reste de la première
+ligne s'aligne
+sur les autres lignes du paragraphe.
+.ip deux
+Et ici nous sommes déjà au second paragraphe.
+Vous noterez que l'argument de
+.b .ip
+apparaît dans la marge
+.lp
+Nous pouvons poursuivre ce texte sans
+commencer un nouveau paragraphe indenté
+en utilisant la requête
+.b .lp .
+.pp
+Si vous avez des espacements
+dans le label de la requête
+.b .ip ,
+vous devrez utiliser un
+.q "espacement inremplissable"
+au lieu d'un espacement normal.
+On crée celui-ci à l'aide d'un caractère antislash
+(\c
+.q \e )
+suivi d'un espacement.
+Par exemple,
+pour imprimer le label
+.q "Partie 1" ,
+entrer:
+.(b
+\&.ip "Partie\e 1"
+.)b
+.pp
+Si le label prévu pour un paragraphe indenté
+(c'est à dire l'argument de
+.b .ip )
+est plus long que l'espace prévu pour le label (cinq espacements),
+.b .ip
+commencera une nouvelle ligne après le label.
+Par exemple,
+l'entrée:
+.(b
+\&.ip label\~long
+Ce paragraphe a un label long.
+Le premier caractère du texte de la première ligne
+ne s'alignera pas sur le texte de la seconde ligne
+et suivantes,
+bien que celles-ci soient alignées entre elles.
+.)b
+produira:
+.ip label\~long
+Ce paragraphe a un label long.
+Le premier caractère du texte de la première ligne
+ne s'alignera pas sur le texte de la seconde ligne
+et suivantes,
+bien que celles-ci soient alignées entre elles.
+.pp
+Il est possible de changer la taille du label
+en utilisant un second argument
+qui définit la taille du label.
+Par exemple,
+on pourra écrire l'exemple ci-dessus correctement
+en disant:
+.(b
+\&.ip label\~long 10
+.)b
+qui rendra l'indentation du paragraphe longue de
+10 espacements pour ce paragraphe seulement.
+Si vous avez plusieurs paragraphes à indenter
+de la même longueur,
+utilisez un
+.i "registre de nombres"
+.b ii .
+Par exemple, pour laisser un pouce d'espace
+avant le label,
+tapez:
+.(b
+\&.nr ii 1i
+.)b
+quelque part avant le premier appel de
+.b .ip .
+Pour plus d'informations, voyez le
+.i "Manuel de Référence" .
+.pp
+Si
+.b .ip
+est utilisé
+sans aucun argument
+aucun label ne sera imprimé.
+Par exemple,
+l'entrée:
+.(b
+\&.ip [a]
+Ceci est le premier paragraphe de l'exemple.
+Nous avons déjà vu ce genre d'exemples auparavant.
+\&.ip
+Ce paragraphe est aligné sur le précédent,
+mais il n'a pas de label dans la marge.
+.)b
+produit la sortie:
+.ip [a]
+Ceci est le premier paragraphe de l'exemple.
+Nous avons déjà vu ce genre d'exemples auparavant.
+.ip
+Ce paragraphe est aligné sur le précédent,
+mais il n'a pas de label dans la marge.
+.pp
+Un cas spécial de
+.b .ip
+est
+.b .np ,
+qui numérote automatiquement
+les paragraphes de manière séquentielle à partir de 1.
+La numérotation repart de 1 à la prochaine requête
+.b .pp ,
+.b .lp ,
+or
+.b .sh
+(cette dernière est décrite au chapitre suivant).
+Par exemple,
+l'entrée:
+.(b
+\&.np
+Ceci est le premier point.
+\&.np
+Ceci est le second point.
+Les "points" sont juste des paragraphes normaux
+auxquels on donne automatiquement un numéro
+à l'aide de la requête \&.np.
+\&.pp
+Ce paragraphe remet la numérotation par \&.np à 1.
+\&.np
+Là par exemple,
+nous avons recommencé la numérotation à 1.
+.)b
+génère:
+.np
+Ceci est le premier point.
+.np
+Ceci est le second point.
+Les "points" sont juste des paragraphes normaux
+auxquels on donne automatiquement un numéro
+à l'aide de la requête \&.np.
+.pp
+Ce paragraphe remet la numérotation à 1 à cause de \&.pp.
+.np
+Là par exemple,
+nous avons recommencé la numérotation à 1.
+.pp
+La requête
+.b .bu
+donne des listes de ce type,
+qui sont identifiées par des puces
+plutôt que par des numéros.
+Les paragraphes sont aussi regroupés verticalement.
+Par exemple,
+l'entrée:
+.(b
+\&.bu
+\&Un jaune d'oeuf
+\&.bu
+\&Une c.-à-s. de crème
+\&.bu
+\&Sel, poivre de Cayenne et jus de citron pour assaisonner
+\&.bu
+\&Deux bonnes c.-à-s. de beurre
+.)b
+produit\**:
+.(f
+\**Par ailleurs,
+si vous mettez ces trois ingrédients
+dans une cocotte assez haute,
+et que vous remuez le tout comme un cinglé à feu moyen
+(ne lâchez jamais l'anse de la cocotte)
+jusqu'à ce que le mélange ait la consistance d'une béchamel
+(ce qui prend juste une à deux minutes),
+si ensuite,
+vous retirez la cocotte du feu et vous incorporez le beurre,
+vous obtiendrez une délicieuse sauce hollandaise.
+.)f
+.bu
+Un jaune d'oeuf
+.bu
+Une c.-à-s. de crème
+.bu
+Sel, poivre de Cayenne et jus de citron pour assaisonner
+.bu
+Deux bonnes c.-à-s. de beurre
+.sh 2 "Titres de chapitres"
+.pp
+Les titres de chapitre
+(comme ceux utilisés dans ce document)
+peuvent être générés automatiquement
+pa la requête
+.b .sh .
+Vous devez indiquer à la requête
+.b .sh
+la
+.i profondeur
+du numéro de chapitre
+et le titre du chapitre.
+La profondeur indique
+combien de nombres doivent apparaître
+(séparés par des points décimaux)
+dans le numéro de chapitre.
+Par exemple,
+le numéro de chapitre
+.b 4.2.5
+a une profondeur de trois.
+.pp
+Les numéros de chapitres
+sont incrémentés
+de façon assez intuitive.
+Si vous ajoutez un numéro
+(ce faisant, vous augmentez la profondeur),
+le nouveau numéro commencera à 1.
+Si vous enlevez un numéro de chapitre
+(vous réduisez la profondeur)
+ou que vous gardez
+le même nombre de chapitre
+(vous gardez la même profondeur),
+le numéro final sera incrémenté.
+Par exemple,
+l'entrée:
+.(b
+\&.sh 1 "Le Préprocesseur"
+\&.sh 2 "Concepts de base"
+\&.sh 2 "Entrées de contrôle"
+\&.sh 3
+\&.sh 3
+\&.sh 1 "Produire du code"
+\&.sh 3
+.)b
+donnera comme résultat:
+.(b
+.b
+1. Le Préprocesseur
+1.1. Concepts de base
+1.2. Entrées de contrôle
+1.2.1.
+1.2.2.
+2. Produire du code
+2.1.1.
+.)b
+.pp
+Vous pouvez spécifier le numéro de chapitre dès le départ
+en plaçant le numéro de chapitre après le titre de chapitre,
+en utilisant des espacements à la place des points.
+Par exemple,
+la requête:
+.(b
+\&.sh 3 "un autre chapitre" 7 3 4
+.)b
+commencera par le chapitre ayant le numéro
+.b 7.3.4 ;
+toutes les requêtes
+.b .sh
+suivantes seront numérotées relativement à ce chapitre.
+.pp
+Il y a des fonctionnalités encore plus complexes
+qui vont indenter le titre de chaque chapitre,
+sous-chapitre, ou sous-sous-chapitre
+relativement à sa profondeur.
+Par exemple, si vous entrez:
+.(b
+\&.nr si \c
+.i N
+.)b
+chaque titre et sous-titre sera indenté d'une quantité
+.i N .
+.i N
+a un facteur d'échelle attaché,
+c'est à dire qu'il doit avoir la forme
+.i Nx ,
+où
+.i x
+indique de quelle unité est
+.i N .
+Les valeurs courantes pour
+.i x
+.b i
+pour les pouces (inches),
+.b c
+pour les centimètres,
+et
+.b n
+pour les
+.i ens
+(= une largeur de caractère).
+Par exemple,
+pour indenter chaque sous-chapitre
+d'un demi-pouce,
+tapez:
+.(b
+\&.nr si 0.5i
+.)b
+après cette requête,
+les titre de chapitres seront indentés
+d'un demi-pouce
+par niveau de profondeur.
+Par exemple,
+le présent document a écrit
+en ayant recours à la requête
+.(b
+\&.nr si 3n
+.)b
+au début du fichier d'entrée,
+ce qui donne trois espacements d'indentation
+par niveau de profondeur du chapitre.
+.pp
+Des numéros de chapitre
+sans indentation automatique
+peuvent être créés
+grâce à la requête:
+.(b
+\&.uh "Titre"
+.)b
+qui fera un titre de chapitre,
+sans numérotation.
+.sh 2 "Les parties du document"
+.pp
+Certaines requêtes sont là pour
+aider à mettre en forme le document.
+La requête
+.b .tp
+initialise une page de titre.
+Sur une page de titre,
+il n'y a ni en-tête ni pied de page, et,
+contrairement à ce qui se passe sur les autres pages,
+vous pouvez laisser des grands espaces blancs
+en haut de la page.
+Par exemple,
+une page de titre typique aura cette apparence:
+.(b
+\&.tp
+\&.sp 7c
+\&.(l C
+LA CROISSANCE DES ONGLES D\(aqORTEILS
+CHEZ LES PRIMATES SUPÉRIEURS
+\&.sp
+par
+\&.sp
+Frank N. Furter
+\&.)l
+\&.bp
+.)b
+.pp
+La requête
+.b .+c \~\c
+.i T
+peut être utilisée pour
+commencer un nouveau chapitre.
+Chaque nouveau chapitre sera numéroté automatiquement
+à partir de 1,
+et le titre sera imprimé au début de chaque chapitre
+avec le numéro de chapitre
+et le nom du chapitre
+.i T .
+Par exemple,
+pour commencer un chapitre s'intitulant
+.q Conclusions,
+utilisez la requête:
+.(b
+\&.+c "CONCLUSIONS"
+.)b
+qui produira sur une nouvelle page,
+les lignes
+.(b C
+Chapitre 5
+CONCLUSIONS
+.)b
+avec des espacements appropriés pour une thèse.
+L'en-tête aussi est déplacé en bas de page
+sur la première page d'un chapitre\** \&.
+.(f
+\**Voir la première page de ce document
+.)f
+.pp
+Si on omet le paramètre de titre
+.i T
+après la requête
+.b .+c
+,
+Le chapitre résultant sera un chapitre sans titre.
+cela peut être utilisé au commencement d'un document;
+par exemple,
+.b .+c
+a été utilisé pour créer la page 1
+du présent document.
+.pp
+Même si traditionnellement
+les documents ont le résumé,
+la table des matières,
+etc... au début du document,
+si vous utilisez
+\*G,
+il sera plus pratique
+de les rédiger en dernier.
+Il faut vous dire que les entrées d'index
+peuvent être collectées en amont
+et être imprimées
+dans la table des matières
+(ou d'autres index).
+À la fin du document,
+utilisez la requête
+.b ".++ P" ,
+qui commence la partie préliminaire du document.
+Après cette requête,
+la requête
+.b .+c
+commencera une section préliminaire
+pour votre document.
+Remarquez que,
+cela imprime le numéro de la page
+en repartant de 1
+en chiffres romains minuscules.
+.b .+c
+peut être utilisé plusieurs fois d'affilée
+pour ébaucher les différentes parties du document.
+Par exemple,
+le résumé,
+la table des matières,
+les remerciements,
+la liste des illustrations,
+etc.
+La requête
+.b ".++ B"
+peut aussi être employée
+pour commencer le chapitre de bibliographie
+à la fin du document.
+.pp
+Une ébauche peut être organisée
+comme le montre la figure 2 ci-dessous.
+(Dans cette figure,
+les commentaires débutent par la requête
+.b \e" .)
+.(z
+.hl
+.if t .in 0.5i
+.if t .ta 2i
+.if n .ta \w'.+c "CHAPITRE SUIVANT"'u+1n
+\&.fo \(aq\(aqÉBAUCHE\(aq\(aq \e" définir un pied de page pour chaque\
+ page
+\&.tp \e" commencer la page de titre
+\&.(l C \e" liste centrée
+LA CROISSANCE
+DES ONGLES D\(aqORTEILS
+CHEZ LES PRIMATES SUPÉRIEURS
+\&.sp
+par
+\&.sp
+Frank Furter
+\&.)l \e" fin de la liste centrée
+\&.+c INTRODUCTION \e" début du chapitre intitulé "INTRODUCTION"
+\&.(x t \e" faire une entrée pour l\(aqindex "t"
+Introduction
+\&.)x \e" fin de l\(aqentrée d\(aqindex
+texte du chapitre 1 \e" =Introduction
+\&.+c "CHAPITRE SUIVANT" \e" commencer un nouveau chapitre
+\&.(x t \e" faire un entrée pour l\(aqindex "t"
+Chapitre suivant
+\&.)x
+texte du chapitre 2 \e" =chapitre suivant
+\&.+c CONCLUSIONS
+\&.(x t
+Conclusions
+\&.)x
+texte du chapitre 3 \e" =Conclusions
+\&.++ B \e" commencer la bibliographie
+\&.+c BIBLIOGRAPHIE \e" commencer un nouveau "chapitre"
+\&.(x t
+Bibliographie
+\&.)x
+texte de la bibliographie
+\&.++ P \e" commencer la partie préliminaire...
+\&. \e" ...du document
+\&.+c "TABLE DES MATIÈRES"
+\&.xp t \e" imprimer l\(aqindex "t" collecté en amont
+\&.+c PREFACE \e" commencer un nouveau chapitre...
+\&. \e" ...dans la partie préliminaire.
+texte de la préface
+.sp 2
+.in 0
+.ce
+Figure 2. Ébauche d'un exemple de document.
+.hl
+.)z
+.sh 2 "Équations et Tableaux"
+.pp
+Il existe deux programmes \*U spécialement conçus
+pour formater les types de matières spéciaux.
+.b Eqn
+imprime les équations.
+.b Tbl
+permet d'imprimer
+de très jolis tableaux
+dans toute une variété de formats.
+Le présent document décrira seulement comment
+rendre plus jolie
+leur fonctionnalités standard.
+Pour savoir
+comment ces deux programmes fonctionnent
+consultez les manuels de référence de ces processeurs\**.
+.(f
+\**N.d.tr.
+.b "man eqn"
+et
+.b "man tbl"
+.)f
+.pp
+Le logiciel
+.b eqn
+est décrit complètement
+dans le document
+.ul
+Typesetting Mathematics \- User's Guide
+par Brian W. Kernighan
+and Lorinda L. Cherry\**.
+.(f
+\**Disponible sur la toile
+.)f
+Les équations sont centrées
+et restent sur une page.
+On les introduit dans le texte par la requête
+.b .EQ
+et on les termine par la requête
+.b .E .
+.pp
+La requête
+.b .EQ
+peut avoir un numéro d'équation comme
+argument optionnel.
+Ce numéro sera imprimé centré
+à droite de l'équation.
+Si l'équation devient trop longue,
+on devra l'imprimer sur deux lignes.
+Pour faire ceci, tapez:
+.(b
+\&.EQ (eq 34)
+texte de l'équation 34
+\&.EN C
+\&.EQ
+continuation de l'équation 34
+\&.EN
+.)b
+Le
+.b C
+après la requête
+.b .EN
+spécifie que l'équation
+sera continuée.
+.pp
+Le programme
+.b tbl
+produit des tableaux.
+Il est décrit complètement
+(avec des exemples numériques)
+dans le document
+.ul
+Tbl \- A Program to Format Tables
+par M. E. Lesk\**.
+.(f
+\**Également disponible sur la toile
+.)f
+Les tableaux commencent par la requête
+.b .TS
+et se terminent par la requête
+.b .TE .
+Normalement, les tableaux restent sur la même page.
+Si vous avez un tableau trop grand
+pour tenir sur une seule page,
+et dont vous savez
+qu'il lui en faudra plusieurs,
+commencez le tableau avec la requête
+.b ".TS\~H"
+et mettez la requête
+.b .TH
+après la ligne du tableau
+que vous voulez
+imprimer au début de chaque page
+contenant le tableau.
+Par exemple, la définition
+d'un long tableau
+pourrait être:
+.ds TA \|\h'.4n'\v'-.2n'\s-4\zT\s0\v'.2n'\h'-.4n'\(ci\|
+.if n .ds TA \~\o'-T'\~\"
+.(b
+\&.TS H
+c s s
+n n n.
+TITRE DU TABLEAU
+\&.TH
+texte du tableau
+\&.TE
+.)b
+.sh 2 "Sortie sur deux colonnes"
+.pp
+Vous pouvez rédiger votre texte sur deux colonnes
+automatiquement
+grâce à la requête
+.b .2c .
+Cela rendra tout contenu
+suivant cette requête
+sur deux colonnes.
+La requête
+.b .bc
+commencera une nouvelle colonne;
+elle diffère de
+.b .bp
+en ce que
+.b .bp
+peut laisser une colonne totalement
+vide quand il commence une nouvelle page.
+Pour revenir à l'impression sur une colonne,
+utilisez
+.b .1c .
+.sh 2 "Définir un macro"
+.pp
+Un
+.i macro
+est un ensemble formé de requêtes et de texte
+qui peut être résumé
+en une seule requête.
+Les macros commencent par la ligne
+.b ".de" \~\c
+.i xx
+(où
+.i xx
+est le nom du macro que l'on va définir)
+et elle finit par une ligne consistant en 2 points.
+Après avoir défini le macro,
+écrire la ligne
+.b . \c
+.i xx
+revient à écrire toutes les autres lignes.
+Par exemple,
+pour définir un macro
+qui espace de trois lignes
+et centre les lignes qui suivent,
+entrez:
+.(b
+\&.de SS
+\&.sp 3
+\&.ce
+\&..
+.)b
+et utilisez en rédigeant:
+.(b
+\&.SS
+\&Ligne de titre
+(début du texte)
+.)b
+.pp
+Les noms des macros peuvent être formés d'un ou deux caractères.
+Pour éviter les conflits avec des noms de requêtes
+dans \-me,
+utilisez toujours des majuscules.
+Les seuls noms à éviter sont
+.b TS ,
+.b TH ,
+.b TE ,
+.b EQ ,
+and
+.b EN .
+.sh 2 "Annotations à l'intérieur d'un clos"
+.pp
+Parfois, vous voudrez insérer
+une note en bas de page
+ou une entrée d'index
+à l'intérieur d'un clos.
+Par exemple,
+si vous vouliez maintenir une
+.q "liste des figures"
+vous pourriez vouloir faire quelque chose comme:
+.(b
+\&.(z
+\&.(c
+texte de la figure
+\&.)c
+\&.ce
+Figure 5.
+\&.(x f
+Figure 5
+\&.)x
+\&.)z
+.)b
+et vous pourriez espérer
+que ça donne une figure
+avec un label
+et une entrée d'index
+.b f
+(probablement une liste des figures).
+Par malheur,
+l'entrée d'index
+est lue et interprétée
+lorsque le clos est lu,
+et non pas lorsqu'il est imprimé,
+et donc le numéro de page dans l'index sera probablement erroné.
+La solution est d'utiliser la chaîne magique
+.b \e!
+au début de chaque ligne se rapportant à l'index.
+Autrement dit,
+vous utiliserez:
+.(b
+\&.(z
+\&.(c
+Texte de la figure
+\&.)c
+\&.ce
+Figure 5.
+\e!.(x f
+\e!Figure 5
+\e!.)x
+\&.)z
+.)b
+qui différera l'indexation
+jusqu'à ce que la figure soit en sortie.
+Cela garantira
+que le numéro de la page dans l'index soit correct.
+Le même commentaire s'applique aussi
+aux blocs (avec
+.b .(b
+et
+.b .)b )
+.
+.sh 1 "\*T et le photocompositeur"
+.pp
+Avec un peu de soin,
+vous pouvez préparer
+des documents
+qui seront joliment imprimés
+sur un terminal normal,
+ou, si vous avez besoin d'un photocompositeur,
+en utilisant le programme de formatage \*T \&.
+.sh 2 "Polices"
+.pp
+Une
+.i police
+est un style de caractères.
+Trois polices sont
+disponibles simultanément,
+Times Roman,
+Times italique,
+et Times en gras,
+plus la police spéciale pour les maths.
+La police normale est Roman.
+.pp
+On peut à tout instant
+changer de police.
+Les requêtes
+.b .r ,
+.b .i ,
+.b .b ,
+et
+.b .bi
+changent respectivement sur Roman,
+italique,
+gras,
+et italique gras.
+Vous pouvez mettre un seul mot
+dans une certaine police
+en tapant (par exemple):
+.(b
+\&.i mot
+.)b
+ce qui mettra ce
+.i mot
+en italique,
+mais n'affectera pas le texte environnant.
+.pp
+Notez que si vous voulez mettre plus d'un mot à la fois
+dans une police de votre choix,
+vous devez entourer ces mots de guillemets
+(`\|"\|')
+ainsi, pour le processeur \*G, ils apparaîtront comme un seul mot.
+Les guillemets n'apparaîtront pas dans le texte.
+Si vous voulez que des guillemets apparaissent dans le texte,
+vous devrez mettre toute la chaîne de caractères entre guillemets
+(même si il s'agit d'un seul mot),
+et utiliser
+.i deux
+paires de guillemets,
+quand vous voulez qu'une paire apparaisse.
+Par exemple,
+si vous voulez produire le texte:
+.(b
+.i """poisson d'avril\|"""
+.)b
+en italique, vous devez taper:
+.(b
+\&.i """poisson d'avril\e|"""
+.)b
+Le
+.b \e|
+produit un petit espacement
+de sorte que
+.q l
+d'
+.i avril
+ne soit pas trop proche des guillemets dans \*G,
+comme cela l'est ici:
+.(b
+.i """poisson d'avril"""
+.)b
+.pp
+Quelques
+.q pseudo-polices
+sont disponibles.
+L'entrée:
+.(b
+\&.(b
+\&.u souligné
+\&.bx "mots dans un cadre"
+\&.)b
+.)b
+génère
+.(b
+.u souligné
+.bx "mots dans un cadre"
+.)b
+Notez que les requêtes de pseudo-police
+ne mettent qu'un seul paramètre dans la pseudo-police;
+les requêtes de police ordinaire (.r, \&.i, \&.b, et \&.bi)
+vont commencer à mettre
+tout le texte qui suit
+dans la police spéciale
+si vous ne fournissez pas de paramètre précis\**.
+.(f
+\**N.d.tr. Pour cela,
+commencer une nouvelle ligne directement après la requête.
+La police spéciale sera maintenue jusqu'à la fin du paragraphe.
+.)f
+Si vous utilisez ces requêtes de pseudo-polices (.u, \&.bx)
+au milieu des lignes,
+elles ne devraient porter vraiment que sur un seul mot.
+Ceci à cause de la manière
+de laquelle \*G justifie le texte.
+Par exemple,
+si vous voulez utiliser les requêtes:
+.(b
+\&.u "mots soulignés"
+et
+\&.bx "mots dans un cadre"
+.)b
+au milieu d'une ligne,
+\*G produirait
+.u "mots soulignés"
+et
+.bx "mots dans un cadre" ,\p
+ce qui, vous l'admettrez sans peine, n'est pas très joli.
+.pp
+Le second paramètre
+de toutes les requêtes de police
+est dans la police d'origine.
+Par exemple,
+la requête de police:
+.(b
+\&.b hardi petit
+.)b
+génère
+.q hardi
+en caractères gras,
+mais mettra
+.q petit
+dans la police du texte environnant,
+ce qui donne:
+.(b
+.b hardi petit.
+.)b
+Pour avoir les deux mots
+.b hardi
+et
+.b petit
+en gras
+.b "hardi petit" ,
+tapez:
+.(b
+\&.b "hardi petit"
+.)b
+.pp
+Vous pouvez panacher les polices à l'intérieur
+d'un seul mot en utilisant une séquence spéciale
+.b \ec
+en fin de ligne
+pour indiquer
+.q "continuer à traiter le texte" ;
+cela permet aux lignes d'entrée
+d'être mises bout à bout
+sans être interrompues par un espacement.
+Par exemple, l'entrée:
+.(b
+\&.u sou \ec
+\&.i ligné
+.)b
+génère
+.u sou \c
+.i ligné ,
+mais si nous avions tapé:
+.(b
+\&.u sou
+\&.i ligné
+.)b
+le résultat aurait été
+.u sou
+.i ligné
+en deux mots.
+.sh 2 "Tailles de caractères"
+.pp
+Le photocompositeur
+supporte différentes tailles de caractères,
+mesurées en points.
+La taille de caractères par défaut
+est 10 points
+pour le corps de texte,
+8 points pour les notes en bas de page.
+Pour changer la taille des caractères,
+tapez:
+.(b
+\&.sz \c
+.i N
+.)b
+où
+.i N
+est la taille souhaitée exprimée en points.
+Vous pouvez aussi
+.q "ajouter de la taille"
+avec la requête
+.(b
+\&.sz \c
+.i +N
+.)b
+ou en
+.q enlever
+en utilisant le signe - à la place de + \&.
+.br
+L'
+.i "espacement vertical"\**
+.(f
+\**Distance entre le bas de la plupart des lettre
+(la
+.i "ligne de base")
+de deux lignes adjacentes.
+.)f
+sera proportionnel à
+la taille des caractères.
+.pp
+Avec
+.b .sz
+, ces changements de tailles de caractères sont
+.i temporaires !!!
+Pour revenir à la taille par défaut, tapez simplement
+.(b
+\& \&.sz
+.)b
+Si vous voulez influencer systématiquement
+la taille des éléments de votre texte,
+utilisez les commandes
+.b .nr:
+.(b
+\&.nr pp 12
+.)b
+met tout corps de texte se trouvant après cette commande à 12 pts.
+.(b
+\&.nr sp 12
+.)b
+met tous les titres de chapitre suivant cette commande à 12 pts.
+.(b
+\&.nr tp 12
+.)b
+met tous les en-têtes et pieds de page suivant cette commande à 12 pts.
+Vous la placerez avantageusement directement après la commande
+.b .he
+(ou
+.b .fo ).
+.pp
+On peut donner à un seul mot ou phrase
+une taille plus petite
+que celle du texte environnant
+en utilisant la requête
+.b .sm .
+Cela convient spécialement aux mots écrits en capitales,
+à cause d'une illusion d'optique qui les fait paraître
+plus grandes qu'elles ne le sont vraiment.
+Par exemple:
+.(b
+\&.sm UNIX
+.)b
+s'imprime
+.sm UNIX ,
+ce qui est plus joli que UNIX.
+.\" Dave Kemper notes that the following probably has not been true
+.\" since 1986; keeping (but commented) for historical interest.
+.\" .pp
+.\" Avertissement:
+.\" changer les tailles de caractères
+.\" sur le photocompositeur
+.\" est une opération mécanique lente.
+.\" Sur les imprimantes laser, il faudra peut-être recharger de
+.\" nouvelles polices.
+.\" Dès lors les changements de tailles de caractères devraient être
+.\" .ne 1i
+.\" utilisés avec prudence.
+.sh 2 "Guillemets"
+.pp
+En typographie,
+pour créer des guillemets,
+il est habituel
+d'utiliser deux accents graves et deux accents aigus,
+plutôt que les guillemets
+(`\|"\|').
+C'est parce que
+deux accents graves et deux accents aigus
+donnent un meilleur résultat optique.
+Par exemple, comparez
+"guillemets" à
+``guillemets''.
+.pp
+Vous pourrez aussi utiliser la séquence
+.b \e*(lq
+et
+.b \e*(rq
+pour mettre les guillemets respectivement à gauche et à droite
+du mot ou de l'expression concernés.
+Par exemple,
+utilisez:
+.(b
+\e*(lqCertaines choses ne sont pas vraies,
+même si elles ont eu lieu.\e*(rq
+.)b
+génère le résultat:
+.(b
+\*(lqCertaines choses ne sont pas vraies,
+même si elles ont eu lieu.\*(rq
+.)b
+Plus rapide, la requête:
+.(b
+\&.q "texte entre guillemets"
+.)b
+générera
+.q "texte entre guillemets" .
+Notez que vous devez entourer
+le texte concerné de guillemets
+s'il est formé de plusieurs mots.
+.sx 0
+.uh Remerciements
+.pp
+J'aimerais remercier
+Bob Epstein,
+Bill Joy,
+et Larry Rowe
+pour avoir eu le courage
+d'utiliser les macros \-me
+pour écrire des documents inhabituels
+durant la phase de développement;
+Ricki Blau,
+Pamela Humphrey,
+et Jim Joyce
+pour leur aide durant la phase de documentation;
+Peter Kessler
+pour ses nombreux griefs,
+des années après que j'aie considéré le projet comme
+.q achevé ,
+le plus souvent accompagnés de propositions de solutions
+(qui m'ont donc forcé à réparer plusieurs petits bogues);
+et la foule de gens qui ont contribué à ce projet
+par leurs idées ou leur soutien.
+.(b
+.uh "Annexe: petit lexique des noms de requêtes"
+Par ordre d'apparition dans le texte
+.sp
+.TS
+tab(|);
+L L Lx.
+\&.sp|space|espacement
+\&.pp|paragraph|nouveau paragraphe
+\&.he|header|en-tête
+\&.fo|footer|pied de page
+\&.ls|line spacing|T{
+espacement vertical (entre les lignes)
+T}
+\&.in|indent|indentation
+\&.ce|center|centrer
+\&.br|break|T{
+interruption (commence une nouvelle ligne)
+T}
+\&.(q|quote|citation (début)
+\&.)q|quote|citation (fin)
+\&.(l|list|liste (début)
+\&.)l|list|liste (fin)
+\&.(b|bloc|bloc (début)
+\&.)b|bloc|bloc (fin)
+\&.(z|floating keep|clos flottant (début)
+\&.)z|floating keep|clos flottant (fin)
+\&.hl|horizontal line|ligne horizontale
+\&.(c|centered block|bloc centré (début)
+\&.)c|centered block|bloc centré (fin)
+\&.(f|footnote|note en bas de page (début)
+\&.)f|footnote|note en bas de page (fin)
+\&.(x|index|T{
+faire apparaître dans l'index (début)
+T}
+\&.)x|index|T{
+faire apparaître dans l'index (fin)
+T}
+\&.xp|print index|imprimer l'index
+\&.lp|lined up paragraph|T{
+paragraphe aligné (à 1e ligne non-indentée)
+T}
+\&.ip|indented paragraph|T{
+paragraphe indenté, sauf en sa première ligne
+T}
+\&.np|numbered paragraph|paragraphe numéroté
+\&.sh|set header|faire un titre
+\&.uh|unnumbered header|titre non-numéroté
+\&.tp|title page|page de titre
+\&.+c|add chapter|ajouter un chapitre
+\&.EQ|equation|équation (début)
+\&.EN|equation|équation (fin)
+\&.TS|table start|tableau (début)
+\&.TE|table end|tableau (fin)
+\&.2c|2 column|écrire sur 2 colonnes
+\&.1c|1 columns|écrire sur 1 colonne
+\&.de xx|define macro|définir un macro
+\&.r|roman|roman
+\&.i|italic|italique
+\&.b|bold|gras
+\&.bi|bold italic|italique gras
+\&.u|underlined|souligné
+\&.bx|box|encadré
+\&.sz|size|taille de police
+\&.sm|small|T{
+plus petit que le texte environnant
+T}
+\&.q|quoted|entre guillemets
+.TE
+.)b
+.\" Local Variables:
+.\" mode: nroff
+.\" coding: utf-8
+.\" End:
+.\" vim: filetype=groff:
diff --git a/doc/meref.me.in b/doc/meref.me.in
new file mode 100644
index 0000000..bc5eb62
--- /dev/null
+++ b/doc/meref.me.in
@@ -0,0 +1,2439 @@
+.\" Copyright (c) 1986, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in
+.\" the documentation and/or other materials provided with the
+.\" distribution.
+.\" 3. [Deleted. See
+.\" ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change]
+.\" 4. Neither the name of the University nor the names of its
+.\" contributors may be used to endorse or promote products derived
+.\" from this software without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS"
+.\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+.\" PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
+.\" CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)ref.me 8.2 (Berkeley) 06/01/94
+.\"
+.\" Modified by jjc@jclark.com and g.branden.robinson@gmail.com for
+.\" groff.
+.\"UC 7
+.nr fi 1n
+.nr sx 0
+.\"pn 0
+.ds MO @VERSION@
+.de TL \" *** title line
+.lp
+.di XX
+..
+.ie \n(.g \{\
+.de DE
+\?\h'|\\n(DIu'\c\?
+..
+.\}
+.el \{\
+.de DE
+\\\\h'|\\\\n(DIu'\\\\c
+..
+.\}
+.am DE
+.br
+.di
+.in +\\n(DIu
+.ti 0
+.XX
+.rm XX
+..
+.ds UG groff\" upright "groff" for use outside of running text
+.ds UM me\" upright "me"
+.ds G \fI\*(UG\fP\"
+.ds N \fInroff\fP\"
+.ds T \fItroff\fP\"
+.ds ME \fI\*(UM\fP\"
+.ds MR \f(BI\*(UM\fP Reference Manual\"
+.\" Compute an indentation for the macro and string synopses based on
+.\" the length of the longest entry.
+.nr DI \w'.sh \(+-N T a b c d e f'+2n
+.he '\*(MR''%'
+.de NR
+.b "\en\\$1" "\\$2"
+..
+.de ST
+.b "\e*\\$1" "\\$2"
+..
+.\"sc
+.\"eh 'USD:20-%''\-me Reference Manual'
+.\"oh '\-me Reference Manual''USD:20-%'
+.+c
+.ce 20
+.sz 14
+.b "\*(MR"
+.sz
+.sp
+.i "for \fR\*(UG \*(UM\fP version \*(MO*"
+.(f
+* based on \fIe.tmac\fP 8.1 from 4.4BSD
+.)f
+.sp 2
+.ul
+Eric P. Allman
+.sp
+.i "Adapted for \fR\*(UG\fP by James Clark and G.\& Branden Robinson"
+.ce 0
+.sp 4
+.pp
+This document describes
+in terse form
+the features
+of the \*(ME macro package
+for \*G.
+Some familiarity with the latter is assumed.
+Specifically,
+the reader should understand
+breaks;
+filling;
+adjustment;
+font selection;
+type sizes;
+the definition and use of
+registers,
+strings,
+and macros;
+and typographical units of measurement:
+points, ems, ens, and vees.
+For a more casual introduction
+to text processing,
+refer to
+.\" the document \" slack phrasing for widow/orphan control
+.q "Writing Papers with \*G using \-\*(ME" .
+.pp
+Many of the package's rendering parameters
+can be adjusted through
+registers,
+strings,
+and macro calls.
+Macro arguments are denoted with lowercase letters for
+numeric values
+(suffixed with a scaling unit if appropriate)
+and with uppercase for text arguments.
+Default parameter values are shown in square brackets.
+The notation
+.i \(+-n
+indicates a numerical value with an optional leading sign.
+Without the sign,
+it assigns a value
+.i n.
+With it,
+it expresses alteration of an existing value by the amount
+.i n.
+\*(ME's font registers may be set only to mounting positions.
+Position zero tells \*(ME to perform no font change;
+the font of the preceding text
+is used instead.
+Position zero is a
+.q pseudo-font ;
+that is,
+it is interpreted and handled by the macros.
+In contrast,
+using position zero
+may produce unexpected results
+in a font selection escape sequence such as
+.b \ef0 ,
+because those are interpreted directly by \*T.
+\*(ME's type size registers support only integral values in points.
+Changes to parameters
+that affect the layout of the page
+(notably page length and vertical margins)
+should be done before calling
+any paragraphing or sectioning macros.
+Normally,
+vertical space is suppressed at the top of a page
+if no text has yet appeared
+(page headers notwithstanding).
+.pp
+\*G measures distances
+in device-specific basic units,
+so it is often necessary
+to specify measurements with a scaling unit.
+For instance,
+to set the paragraph indentation
+to eight ens,
+input
+.q ".nr pi 8n" .
+.q ".nr pi 8"
+makes the paragraph indentation eight basic units,
+or 8/72,000 inches on
+.i grops,
+\*G's PostScript output driver.
+.pp
+Registers and strings
+with names of the form
+.b $ \c
+.bi x
+may be used in expressions and text
+but should not be changed.
+Macros with names of the form
+.b $ \c
+.bi x
+are
+.i hooks,
+called internally by \*(ME,
+and can be redefined
+to alter their function.
+This may be a sensitive operation;
+look at the macro definition in the
+.i e.tmac
+file before changing it.
+If you don't require a given hook,
+(re)define it as empty instead of removing it.
+.pp
+Objects in \*(ME
+follow a rigid naming convention.
+To avoid conflict,
+any user-defined register,
+string,
+or macro
+names should be single numerals or uppercase letters,
+or any longer character sequence
+including at least one uppercase letter.\**
+.(f
+\**
+For portability between BSD and \*G \*(ME,
+limit names to
+two characters,
+and avoid names starting with
+.b [
+(left square bracket).
+.)f
+The names employed
+by any preprocessors in use
+should also not be repurposed.
+.\" dead-tree pagination
+.br
+.ne 8v
+.sh 1 "Paragraphing"
+.TL
+.b .lp
+.DE
+Begin left-aligned paragraph.
+Centering,
+right-alignment,
+and underlining are canceled.
+The font is set to
+.NR (pf
+[1],
+the type size
+to
+.NR (pp
+[10p],
+and vertical spacing
+(text baseline spacing)
+to
+.NR (tv
+[120]%
+of the type size.
+Vertical space of
+.NR (ps
+[0.35v]
+is inserted
+before the paragraph.
+The indentation is reset
+to
+.NR ($i
+[0]
+plus
+.NR (po
+[0]
+unless the paragraph
+is inside a display
+(see
+.b .ba ).
+At least
+the first two output lines
+of the paragraph
+are kept together
+on a page.
+.TL
+.b .pp
+.DE
+Like
+.b .lp ,
+but apply a (further) indentation of
+.NR (pi
+[5n]
+to the first output line.
+.TL
+.b .ip
+.i T
+.i i
+.DE
+Like
+.b .lp ,
+but set the paragraph
+with an optional hanging tag
+.i T
+[empty]
+and the remainder indented by
+.i i
+[\c
+.NR (ii
+[5n]].
+The tag
+.i T
+is
+.q exdented
+(the opposite of
+.i in dented).
+Any spaces in
+.i T
+must be unbreakable.
+If
+.i T
+does not fit in the space
+.i i,
+.b .ip
+breaks the line after
+.i T .
+.TL
+.b .np
+.DE
+Like
+.b .ip ,
+but tag the paragraph with a number in parentheses,
+starting at 1.
+Each subsequent
+.b .np
+call increments it.
+The paragraph number is stored in
+.NR ($p
+and reset to 1 by
+.b .lp ,
+.b .pp ,
+.b .bu ,
+.b .sh ,
+and
+.b .sx .
+.TL
+.b .bu
+.DE
+Like
+.b .ip ,
+except that the tag is a bullet (\(bu).
+No vertical space is inserted
+between adjacent bulleted paragraphs,
+.\" TODO: Move the following application note to meintro.me.in or some
+.\" future non-introductory me(7) usage manual.
+enabling the construction of compact itemized lists.
+.sh 1 "Sectioning"
+.pp
+Numbered sections
+are similar to paragraphs
+except that a
+section number of the form
+.q 1.2.3
+is automatically
+generated for each.
+\*(ME supports up to six levels of sectioning;
+any given section has a
+.i depth
+that determines
+the quantity of components
+(separated by dots)
+shown in its section number.
+Unnumbered section headings are similar,
+except that no number is prefixed
+to the section title.
+.TL
+.b .sh
+.i \(+-n
+.i T
+.i "a b c d e f"
+.DE
+Begin section with numbered heading
+of depth
+.i \(+-n
+[+0]
+and optional title
+.i T
+[empty].
+Vertical space of
+.NR (ss
+[1v]
+precedes the heading.
+The components
+of the section number
+are maintained in
+.NR ($1
+through
+.NR ($6 ;
+combined,
+they are available in
+.ST ($n .
+Automatic section numbering at all depths begins at 1.
+The heading is set in font
+.NR (sf
+[3]
+at size
+.NR (sp
+[10p]
+and uses the indentation of its parent depth;
+a further indentation of
+.NR (so
+[0]
+is applied only to its output line.
+The section number is followed by a period,
+after which the typeface is set
+to the paragraph font
+.NR (pf
+at size
+.NR (pp
+so that content may follow immediately
+on the same output line.
+.b .sh
+ensures that there is enough room
+to format the section heading
+with the beginning of a paragraph on the same page
+(about 3 lines total).
+If any of
+.i a
+through
+.i f
+[all empty]
+is specified,
+each component of the section number
+is assigned the corresponding argument
+instead of being automatically adjusted.
+A hyphen
+(\c
+.q \- )
+for a component argument
+prevents its alteration.
+If
+.i T
+is an underscore
+(\c
+.q _ ),
+the section depth and numbering are reset,
+the base indentation is not,
+and nothing is output\(em\c
+.\" TODO: Move the following application note to meintro.me.in or some
+.\" future non-introductory me(7) usage manual.
+this is useful to automatically
+coordinate section numbers with
+chapter numbers.
+If all components are zero,
+no number is output.
+.TL
+.b .sx
+.i \(+-n
+.DE
+Go to section depth
+.i \(+-n
+[\-1],
+but emit no section heading
+and do not increment the section number.
+This has the effect of an
+.b .lp
+call
+at the new depth.
+.TL
+.b .uh
+.i T
+.DE
+Begin unnumbered section.
+Like
+.b .sh ,
+without the section numbering features.
+.TL
+.b .$p
+.i T
+.i B
+.i n
+.DE
+Output section heading.
+.i T
+is the title,
+.i B
+is the concatenated number,
+and
+.i n
+is the depth.
+These parameters are not always present;
+.b .sh
+passes all three,
+.b .uh
+only the first,
+and
+.b .sx
+all three,
+but the first two
+are empty.
+If
+.i n
+is present,
+the section indentation is set to
+.NR (si
+times\~\c
+.i n .
+.TL
+.b .$0
+.i T
+.i B
+.i n
+.DE
+This hook macro,
+normally empty,
+is called automatically
+by
+.b .sh
+and
+.b .uh
+after they call
+.b .$p ,
+and is passed the same arguments.
+.\" TODO: Move the following application note to meintro.me.in or some
+.\" future non-introductory me(7) usage manual.
+You can define it to,
+for instance,
+automatically put
+each section title
+into a table of contents
+using
+.b .(x
+and
+.b .)x .
+.TL
+.b .$ \c
+.bi n
+.DE
+These hook macros
+(where
+.i n
+is an integer 1\(en6)
+are called by
+.b .$p
+just before it outputs
+a section heading
+of depth
+.i n.
+.\" TODO: Move the following application note to meintro.me.in or some
+.\" future non-introductory me(7) usage manual.
+They could be used
+to obtain section depth-dependent spacing.
+.sh 1 "Headers, Footers, and Margins"
+.ds TP \(aq\,\fIL\/\fP\(aq\,\fIM\/\fP\(aq\,\fIR\/\fP\(aq
+.pp
+Headers and footers
+are known as
+.i "three-part titles"
+for their left,
+middle,
+and right-hand components
+.i L,
+.i M,
+and
+.i R.
+The components are separated
+by a
+.i delimiter,
+shown here as a neutral apostrophe,
+but which can be any character
+that does not occur in any of the components.
+Any defined title is
+placed on the page automatically,
+set in font
+.NR (tf
+[3]
+at size
+.NR (tp
+[10p].
+Each title definition
+applies starting with the
+.i next
+page;
+titles intended for output on the first page
+should be defined prior to any sectioning or paragraphing macro calls.
+A title
+must be quoted
+if it contains more than two adjacent spaces
+or more than eight spaces total.
+.pp
+The placement
+of headers and footers
+is controlled by four registers
+initialized to values scaled
+with respect to the default type size and vertical spacing.
+.NR (hm
+[4v]
+is the distance from the top of the page
+to the top of the header,
+.NR (fm
+[3v]
+that from the bottom of the page
+to the bottom of the footer,
+.NR (tm
+[7v]
+that from the top of the page
+to the top of the text,
+and
+.NR (bm
+[6v]
+that from the bottom of the page
+to the (nominal) bottom of the text.
+.pp
+\*(ME uses \*T's environment 0 for body text,
+1 for keeps
+(see below),
+and 2 for headers and footers.
+The default line length is two inches less than the page width
+(e.g.,
+6.5i on U.S.\& letter paper).
+The default page offset
+(left margin)
+is determined by the output device;
+it is typically 1.0i on typesetting devices and 0 on terminals.
+.TL
+.b .xl
+.i \(+-n
+.DE
+Set line length to
+.i n
+[see above]
+only in the current environment.
+.TL
+.b .ll
+.i \(+-n
+.DE
+Set line length to
+to
+.i n
+[see above]
+in all environments used by \*(ME,\**
+.(f
+\**
+\*(ME uses only the three environments of AT&T \*T,
+but in GNU \*T,
+the user can create additional ones.
+.b .ll
+works like
+.b .xl
+for the latter.
+.)f
+and store it in
+.NR ($l .
+This macro should not be used
+after output has begun,
+and particularly not in multi-column layouts.
+.TL
+.b .he
+\*(TP
+.DE
+Define header
+to be placed at the top
+of every page.
+.TL
+.b .fo
+\*(TP
+.DE
+Define footer
+to be placed at the bottom
+of every page.
+.TL
+.b .eh
+\*(TP
+.DE
+Define header
+to be placed at the top
+of every even-numbered page.
+.TL
+.b .oh
+\*(TP
+.DE
+Define header
+to be placed at the top
+of every odd-numbered page.
+.TL
+.b .ef
+\*(TP
+.DE
+Define footer
+to be placed at the bottom
+of every even-numbered page.
+.TL
+.b .of
+\*(TP
+.DE
+Define footer
+to be placed at the bottom
+of every odd-numbered page.
+.TL
+.b .hx
+.DE
+Suppress headers and footers
+on the next page.
+.TL
+.b .$h
+.DE
+Output the page header.
+Care should be taken when redefining this macro.
+Doing so
+can disable the
+.b .he ,
+.b .fo ,
+.b .eh ,
+.b .oh ,
+.b .ef ,
+and
+.b .of
+macros,
+as well as the chapter-style title feature
+of
+.b .+c .
+.TL
+.b .$f
+.DE
+Output the page footer;
+the same comments apply
+as to
+.b .$h .
+.TL
+.b .$H
+.DE
+This hook macro is called
+at the top of each page
+(after the header and any
+pending floating keeps are emitted)
+and of each column in multi-column mode.
+.\" TODO: Move the following application note to meintro.me.in or some
+.\" future non-introductory me(7) usage manual.
+Use it for column headings.
+.sh 1 "Displays"
+.pp
+Display macros enclose material;
+their names are of the form
+.b .( \c
+.bi x
+and
+.b .) \c
+.bi x ,
+and must be paired.
+Not all display types can nest
+with themselves or each other.
+All displays except centered blocks
+and long quotations
+are preceded and followed
+by an extra
+.NR (bs
+[0.35v]
+of vertical space
+and use a vertical spacing of
+.NR (dv
+[120]%.
+Long quotation pre- and post-space is stored in a dedicated register,
+while centered blocks have none;
+both use the vertical spacing of normal text,
+.NR (tv .
+.TL
+.b .(l
+.i A
+.i F
+.DE
+Begin list.
+Text until
+.b .)l
+is set in font
+.NR (df
+[0]
+with filling disabled.
+If
+.i A
+[\c
+.b I ]
+is
+.b I ,
+the list is indented by
+.NR (bi
+[4m];
+if
+.b M ,
+it is set at the left margin;
+if
+.b L ,
+it is left-aligned
+(distinguishably from
+.b M
+only if the base indentation
+is not zero);
+and if
+.b C ,
+the list is centered on a line-by-line basis.
+If
+.i F
+[empty]
+is
+.b F ,
+filling is enabled.
+.TL
+.b .)l
+.DE
+End list.
+.\" dead-tree pagination
+.br
+.ne 4v
+.TL
+.b .(q
+.DE
+Begin long quotation.
+Text until
+.b .)q
+is filled,
+indented on the left and right
+by
+.NR (qi
+[4n],
+preceded and followed
+by
+.NR (qs
+[0.35v]
+space,
+and set at type size
+.NR (qp
+[\-1p].
+.TL
+.b .)q
+.DE
+End long quotation.
+.TL
+.b .(b
+.i A
+.i F
+.DE
+Begin a block,
+a form of
+.i keep:
+\*(ME tries to avoid breaking a page
+or column between
+.b .(b
+and
+.b .)b .
+Such a break is allowed anyway
+if respecting the keep
+would leave more than
+.NR (bt
+[0]
+vees of blank space
+below it.
+If
+.NR (bt
+is zero,
+this threshold feature
+is disabled:
+the break will not occur within the keep.
+The font and
+.i A
+and
+.i F
+arguments are handled as with
+.b .(l .
+.TL
+.b .)b
+.DE
+End block.
+.\" dead-tree pagination
+.br
+.ne 3v
+.TL
+.b .(z
+.i A
+.i F
+.DE
+Begin floating keep.
+Like
+.b .(b ,
+except that
+.i A
+defaults to
+.b M
+and the keep
+.i floats
+to the bottom of the page or column
+if it fits,
+or the top of the next otherwise.
+Its position relative to adjacent formatted text
+is thus flexible.
+.NR (zs
+[1v]
+space
+precedes and follows
+a floating keep.
+.TL
+.b .)z
+.DE
+End floating keep.
+.TL
+.b .(c
+.DE
+Begin centered block.
+Input until
+.b .)c
+is collected,
+its longest output line centered,
+and the remainder aligned with respect to that line;
+contrast with the line-by-line centering obtained with
+\(lq\c
+.b ".(b C" \(rq.
+.TL
+.b .)c
+.DE
+End centered block.
+.sh 1 "Annotations"
+.pp
+Some annotation macros are also mandatorily paired enclosures,
+as display macros are.
+.TL
+.b .(d
+.DE
+Begin delayed text.
+Input until
+.b .)d
+is saved for later output by
+.b .pd .
+Delayed text regions are numbered
+starting at 1;
+the number is kept in
+.NR ($d
+and in the associated string
+.ST # .
+.\" TODO: Move the following application note to meintro.me.in or some
+.\" future non-introductory me(7) usage manual.
+Endnotes are one application.
+.TL
+.b .)d
+.DE
+End delayed text.
+.NR ($d
+and the associated string
+.ST #
+are incremented.
+.TL
+.b .pd
+.DE
+Emit delayed text:
+output everything accumulated with
+.b .(d
+since the last call to
+.b .pd .
+The delayed text number is reset to 1.
+.\" TODO: Move the following application note to meintro.me.in or some
+.\" future non-introductory me(7) usage manual.
+This might be used
+at the end of each chapter.
+.TL
+.b .(f
+.DE
+Begin footnote.
+Input until
+.b .)f
+is saved for output
+when the foot of the page is reached.
+Footnotes are numbered
+starting at 1;
+the number is kept in
+.NR ($f
+and in the associated string
+.ST * .
+The text of the footnote
+floats to the bottom
+of the page
+and set in font
+.NR (ff
+[1]
+at size
+.NR (fp
+[8p].
+Each entry
+is preceded by
+.NR (fs
+[0.2v]
+space,
+indented
+.NR (fi
+[3n]
+on its first line,
+and
+.q undented
+(indented from the right margin)
+by
+.NR (fu
+[0].
+Footnotes line up underneath
+columns in the page layout.
+.\" XXX: Quantify when debugged. See Savannah #58447, #63163, #63164.
+If the footnote's content
+does not fit on the page,
+it carries over
+to the next.
+.TL
+.b .)f
+.DE
+End footnote.
+.NR ($f
+and the associated string
+.ST *
+are incremented
+if the latter has been interpolated
+outside a footnote.
+.TL
+.b .$s
+.DE
+Output footnote separator:
+draw a horizontal line up to 2 inches wide.
+Called by
+.b .(f .
+Any redefinition should produce output
+no more than one vee in height.
+.TL
+.b .(x
+.i X
+.DE
+Begin index entry.
+Input until
+.b .)x
+is saved in an index named
+.i X
+[\c
+.b x ]
+until called up with
+.b .xp.
+Each entry is preceded
+by
+.NR (xs
+[0.2v]
+of vertical space
+and undented by
+.NR (xu
+[0.5i];
+that amount of space is reserved
+on the right end of the line
+for the
+(possibly affixed)
+page number.
+.TL
+.b .)x
+.i P
+.i A
+.DE
+End index entry.
+The entry
+is rendered with a
+.i leader
+(row of dots)
+up to an affix
+(such as a volume number and
+separating punctuation)
+.i A
+[empty]
+followed by
+.i P
+[\c
+.NR % ]
+right-aligned on the last line of the entry.
+If
+.i A
+is specified,
+.i P
+must be as well.
+If
+.i P
+is an underscore,
+the leader,
+.i P,
+and any
+.i A
+are suppressed.
+.TL
+.b .xp
+.i X
+.DE
+Emit index
+.i X
+[\c
+.b x ]
+using the current font and type size
+with display vertical spacing
+(\c
+.NR (dv ).
+.\" dead-tree pagination
+.br
+.ne 4v
+.sh 1 "Columnated Output"
+.TL
+.b .2c
+.i \(+-s
+.i n
+.DE
+Enter multi-column mode,
+formatting text in
+.i n
+[2]
+columns of equal width.
+The column separation
+(\c
+.q gutter )
+is set to
+.i \(+-s
+[4n],
+saved
+in
+.NR ($s ,
+and persists until changed by this macro.
+The
+.i n
+columns with
+.i n \-1
+gutters
+fill the single-column line length;
+each column's line length
+is stored in
+.NR ($l .
+The current column number
+is in
+.NR ($c
+and the number of columns in
+.NR ($m .
+.TL
+.b .1c
+.DE
+Leave multi-column mode;
+return to single-column layout.
+.TL
+.b .bc
+.DE
+Begin new column.
+Like
+.b .bp ,
+but begin a column
+on a new page
+only if necessary.
+.\" dead-tree pagination
+.br
+.ne 4v
+.sh 1 "Type Size and Font Styles"
+.TL
+.b .sz
+.i \(+-p
+.DE
+Set the type size to
+.i \(+-p
+[10p],
+and the vertical spacing per
+.NR (tv .
+These do
+.i not
+persist beyond many \*(ME macro calls:
+paragraph macros reset
+the type size and vertical spacing.
+Similarly,
+headers/footers,
+section headings,
+long quotations,
+footnotes,
+and
+chapter titles
+alter them.
+.pp
+\*(ME assumes that font positions 1 through 4 correspond to
+roman,
+italic,
+bold,
+and bold-italic typefaces,
+respectively.
+Use the
+.b .fp
+request to mount your preferred fonts in these positions.
+.pp
+The following macros
+style or decorate an argument
+.i W
+and accept an optional second argument
+.i X,
+formatted as the previous text without intervening space.
+To suppress a word break after the call,
+populate or suffix
+.i X
+with
+.b \ec .
+.TL
+.b .r
+.i W
+.i X
+.DE
+Set
+.i W
+in the roman style.
+If no parameters,
+change to the roman style.
+.TL
+.b .i
+.i W
+.i X
+.DE
+Set
+.i W
+in italics.
+If no parameters,
+change to the italic style.
+.TL
+.b .b
+.i W
+.i X
+.DE
+Set
+.i W
+in boldface.
+If no parameters,
+switch to the bold style.
+.TL
+.b .bi
+.i W
+.i X
+.DE
+Set
+.i W
+in bold italics.
+If no parameters,
+switch to the bold-italic style.
+.TL
+.b .q
+.i W
+.i X
+.DE
+Quote
+.i W ,
+surrounding it with
+with
+.b \(lq
+and
+.b \(rq .
+.TL
+.b .sm
+.i W
+.i X
+.DE
+Set
+.i W
+one point smaller than the surrounding type.
+It has no effect in \*N mode.
+.TL
+.b .u
+.i W
+.i X
+.DE
+Underline
+.i W.
+On typesetting output devices,
+this is true underlining,
+in contrast to the
+.b .ul
+request,
+which changes to the
+.q "underline font"
+(usually italics in \*G).
+On terminal output devices,
+.i W
+is surrounded by underscores.
+This argument should not be subject to adjustment,
+hyphenation,
+or breaking;
+.b .u
+is reliable only when filling is disabled.
+.TL
+.b .bx
+.i W
+.i X
+.DE
+Set
+.i W
+in a box.
+On typesetting output devices,
+.i W
+is surrounded by rules (lines).
+On terminal output devices,
+.i W
+is simulated with ISO\~6429 color escape sequences
+or surrounded by vertical bars.
+It is not marked specially on
+.i groff 's
+.b html
+output device.
+This argument should not be subject to adjustment,
+hyphenation,
+or breaking;
+.b .bx
+is reliable only when filling is disabled.
+.sh 1 "Preprocessor Support"
+.TL
+.b .EQ
+.i A
+.i T
+.DE
+Begin
+.i \%@g@eqn (1)
+equation.
+If
+.i A
+[\c
+.b C ]
+is
+.b C ,
+the equation is centered;
+if
+.b I ,
+indented by
+.NR (bi
+[4m];
+and if
+.b L ,
+left-aligned.
+.i T
+[empty]
+is a title aligned to the right margin
+next to the equation.
+See
+.q "Typesetting Mathematics \- User's Guide"
+by Brian W. Kernighan
+and Lorinda L. Cherry.
+.TL
+.b .EN
+.i C
+.DE
+End
+.i \%@g@eqn
+equation.
+If
+.i C
+[empty]
+is
+.b C ,
+and the equation is followed immediately
+by another
+.b .EQ ,
+the texts of each are centered together.
+Otherwise,
+the equation is typeset
+within the page or column
+with
+.NR (es
+[0.5v]
+space
+above and below it.
+.TL
+.b .TS
+.i H
+.DE
+Begin (start)
+.i \%@g@tbl (1)
+table.
+Tables are preceded and followed by
+.NR (bs
+of space.
+If
+.i H
+[empty]
+is
+.b H ,
+you can call
+.b .TH
+after some table rows
+to repeat them across columns or pages.
+If you want a table to float,
+surround the
+.b .TS
+and
+.b .TE
+calls with
+.b .(z
+and
+.b .)z
+calls.
+.TL
+.b .TH
+.DE
+With \(lq\c
+.b ".TS H" \(rq,
+end the
+.i \%@g@tbl
+table header.
+.TL
+.b .TE
+.DE
+End
+.i \%@g@tbl
+table.
+.TL
+.b .PS
+.i h
+.i w
+.DE
+Begin
+.i \%@g@pic (1)
+picture.
+.i h
+[empty]
+and
+.i w
+[empty],
+if present,
+scale the image.
+.\" XXX: That's vague, but DWB pic and GNU pic reportedly interpret
+.\" these arguments differently and there's no room here to discuss it.
+.TL
+.b .PE
+.DE
+End
+.i \%@g@pic
+picture,
+leaving the drawing position at the bottom of the picture.
+.TL
+.b .PF
+.DE
+End
+.i \%@g@pic
+picture,
+leaving the drawing position at the top of the picture.
+.TL
+.b .IS
+.DE
+Begin
+.i ideal (1)\**
+picture.
+.(f
+\**
+.i groff
+does not provide an implementation of the
+.i ideal
+preprocessor.
+.)f
+.TL
+.b .IE
+.DE
+End
+.i ideal
+picture,
+leaving the drawing position at the bottom of the picture.
+.TL
+.b .IF
+.DE
+End
+.i ideal
+picture,
+leaving the drawing position at the top of the picture.
+.TL
+.b .GS
+.i A
+.DE
+Begin
+.i \%@g@grn (1)
+picture.
+.i A
+[\c
+.b C ]
+can be
+.b C ,
+.b L ,
+or
+.b R
+to center, left-, or right-align
+the picture.
+.TL
+.b .GE
+.DE
+End
+.i \%@g@grn
+picture,
+leaving the drawing position at the bottom of the picture.
+.TL
+.b .GF
+.DE
+End
+.i \%@g@grn
+picture,
+leaving the drawing position at the top of the picture.
+.sh 1 "Formal Documents"
+.TL
+.b .tp
+.DE
+Begin title page.
+Unusually,
+.b .sp
+calls at the top of the page
+.i are
+honored.
+Headers and footers are suppressed.
+The page number
+is not incremented
+for this page.
+.TL
+.b .++
+.i S
+.i H
+.DE
+Begin a
+.i segment
+of an organized document,
+affecting the values and formatting
+of chapter and page numbers.
+The chapter number in
+.NR (ch
+is reset to\~0.
+A segment uses Arabic numerals
+for chapter and page numbers
+except where noted.
+The mandatory segment type argument
+.i S
+must be one of
+.b C
+for chapters
+(of the main matter),
+.b A
+for appendices
+(uppercase alphabetical chapter numbers),
+.b P
+for preliminary (\(lqfront\(rq) matter
+(such as a foreword;
+lowercase Roman page numbers),
+.b AB
+for an abstract
+(page numbering restarts at 1),
+or
+.b B
+for \(lqback\(rq matter,
+such as a bibliography.
+.b C
+or
+.b A
+may be prefixed with
+.b R ,
+which specifies a restart of page numbering
+when
+.b .+c
+is called within the applicable segment.
+If present,
+the
+.i H
+[empty]
+parameter defines the new header,
+which must be delimited as a three-part title\(em\c
+if it contains spaces,
+it must furthermore be quoted.
+To include the chapter number in
+.i H,
+use the input sequence
+.b "\eEn(ch" .\**
+.(f
+\**
+If you wish to avoid use of the \*G\|\" prevent italic f \ ugliness
+.b \eE
+extension,
+fully
+.i eight
+backslashes must precede
+.q n(ch .
+.)f
+For example,
+\[lq]\c
+.b ".++ RA |||\eEn(ch.%|" \[rq]
+numbers appendices and pages as
+.bi A .\c
+.bi n
+in the right-hand header,
+where
+.i A
+is the appendix letter
+and
+.i n
+is the page number.
+Each subdivision of a segment
+(each chapter,
+appendix,
+etc.\&)
+should be preceded by a
+.b .+c
+call.
+It is easier when using
+\*T to put the front matter
+at the end of the paper,
+so that the table of contents
+can be collected and put out;
+this material can then be resequenced
+by a tool that processes the output format,
+or physically moved
+to the beginning of the printed document.
+.TL
+.b .+c
+.i T
+.DE
+Begin chapter
+(or appendix).
+Reset the footnote number
+in
+.NR ($f
+to 1.
+If the segment type is
+.b RA
+or
+.b RC ,
+reset the page number
+in
+.NR %
+to 1.
+If
+.b .++
+has not been called,
+a segment type of
+.b C
+is assumed.
+If a header is defined,
+it replaces the footer
+on the first page
+of each chapter.
+If a title
+.i T
+[empty]
+is supplied,
+.b .$c
+is called.
+.TL
+.b .$c
+.i T
+.DE
+Format a chapter heading
+centered in boldface.
+The text
+.ST (wc
+[\c
+.b Chapter ]
+is output
+if the segment type is
+.b C
+or
+.b RC,
+or that in
+.ST (wa
+[\c
+.b Appendix ]
+if the segment type is
+.b A
+or
+.b RA.
+The chapter number
+is incremented and output. \" except for abstract and bibliography segs
+If a chapter title
+.i T
+is present,
+it is formatted the same way,
+preceded by vertical space.
+If the segment type is any of
+.b C ,
+.b RC ,
+.b A ,
+or
+.b RA ,
+.b $C
+is called.
+.TL
+.b .$C
+.i K
+.i N
+.i T
+.DE
+This hook macro
+is called by
+.b .+c
+and
+.b .$c .
+.i K
+is the chapter or appendix term supplied by
+.b $c ,
+.i N
+is the chapter or appendix number,
+and
+.i T
+is its title.
+.\" TODO: Move the following application note to meintro.me.in or some
+.\" future non-introductory me(7) usage manual.
+This hook can be used to insert chapter titles
+into a table of contents.
+.sh 1 "Miscellaneous"
+.TL
+.b .ld
+.DE
+Update the
+.NR (y2
+and
+.NR (y4
+registers based on the current value of
+.NR (yr ,
+reinitialize the localized strings
+.ST (dw ,
+.ST (mo ,
+.ST (wa ,
+and
+.ST (wc ,
+and reset
+.ST (td
+based on the foregoing.
+.TL
+.b .re
+.DE
+Reset tab stops to every 0.5i.
+.TL
+.b .ba
+.i \(+-n
+.DE
+Set the base indentation
+to
+.i \(+-n
+[0].
+Paragraphs,
+sections,
+and displays
+are indented by at least this amount,
+stored in
+.NR ($i .
+Titles and footnotes
+are unaffected.
+.TL
+.b .hl
+.DE
+Break and draw a horizontal line
+of the current line length.
+You might call
+.b .hl
+at the beginning and/or end
+of a floating keep
+to differentiate
+the text from a figure.
+.TL
+.b .ep
+.DE
+End this page,
+but do not begin the next page.
+Useful for forcing out footnotes,
+but other than
+that hardly ever used.
+Must be followed by a
+.b .bp
+request or the end of input.
+.\" dead-tree pagination
+.br
+.ne 6v
+.sh 1 "\f(BIroff\fP Support\fR\**"
+.(f
+\**
+These facilities are provided to aid migration of
+\(lqold
+.i roff \(rq
+documents.
+See
+.i roff (7)
+for a history of
+.i roff -related
+typesetting systems.
+.)f
+.pp
+.TL
+.b .ix
+.i \(+-n
+.DE
+Equivalent to \(lq\|\fB\[aq]in \fI\(+-n\/\fR\(rq.
+.TL
+.b .bl
+.i n
+.DE
+Equivalent to \(lq\fB.sp \fIN\/\fR\(rq
+inside a
+.b .(b
+block.
+.TL
+.b .m1
+.i \(+-n
+.DE
+Set/adjust the space between the top of the page
+and the header to/by
+.i \(+-n
+[4v].
+.TL
+.b .m2
+.i \(+-n
+.DE
+Set/adjust the space between the header
+and the first line of text to/by
+.i \(+-n
+[2v].
+.TL
+.b .m3
+.i \(+-n
+.DE
+Set/adjust the space
+between the bottom of the text
+and the footer to/by
+.i \(+-n
+[2v].
+.TL
+.b .m4
+.i \(+-n
+.DE
+Set/adjust the space
+between the footer
+and the bottom of the page to/by
+.i \(+-n
+[4v].
+.TL
+.b .pa
+.i \(+-n
+.DE
+Equivalent to \(lq\fB.bp \fI\(+-n\/\fR\(rq.
+.TL
+.b .ro
+.DE
+Equivalent to \(lq\fB.af % i\fP\(rq.
+.TL
+.b .ar
+.DE
+Equivalent to \(lq\fB.af % 1\fP\(rq.
+.TL
+.b .n1
+.i C
+.DE
+Number output lines starting from 1.
+If
+.i C
+[empty]
+is
+.b C ,
+the line length is reduced
+and correspondingly indented;
+otherwise,
+the page offset is reduced
+to accommodate the line number.
+The amount in all cases is
+.NR (no
+[\ew\(aq0000\(aqu
+(the width of four numerals
+in the current font)].
+.TL
+.b .n2
+.i \(+-n
+.DE
+Stop numbering output lines if
+.i n
+missing,
+otherwise continue with the number modified by
+\(+-\c
+.i n.
+.TL
+.b .sk
+.DE
+Leave the next output page blank
+except for headers and footers.
+This can reserve space
+for a full-page diagram
+produced externally
+and composited in later.
+(To reserve only a partial page,
+use \[lq]\c
+.b .sv \~\c
+.bi n \[rq],
+where
+.i n
+is the amount of space required.
+This space will be output immediately
+if there is room,
+and otherwise
+at the top of the next page.
+If
+.i n
+is greater than the space available
+on an empty page,
+none will be output.)
+.sh 1 "Predefined Strings"
+.TL
+.ST *
+.DE
+Interpolate footnote number bracketed by superscripting strings:
+.ST { \c
+.\" \^ avoids 'f\' bad kerning in Times bold; wrong font metrics?
+.NR ($f \^\c
+.ST } .
+.TL
+.ST #
+.DE
+Interpolate delayed text number surrounded by square brackets:
+.b [ \c
+.NR ($d \c
+.b ] .
+.TL
+.ST {
+.DE
+Begin superscripting:
+move upward and reduce the type size.
+The line height is increased above by
+.NR (sx
+[0.2m]
+to accommodate the superscript.
+In \*N mode,
+output a left square bracket.
+.TL
+.ST }
+.DE
+End superscripting:
+reverse the motion and type size change of
+.ST { .
+In \*N mode,
+output a right square bracket.
+.\" TODO: Move this example to a section on super- and subscripting in
+.\" meintro.
+.\"For example,
+.\"to produce a superscript
+.\"you might type
+.\".b x \c
+.\".ST { \c
+.\".b 2 \c
+.\".ST } ,
+.\"which will render as
+.\".b x\*{2\*}
+.\"on typesetters and as
+.\".b x[2]
+.\"on terminals.
+.TL
+.ST <
+.DE
+Begin subscripting:
+move downward and reduce the type size.
+The line height is increased below by
+.NR (sx
+to accommodate the subscript.
+In \*N mode,
+output a left angle bracket.
+.TL
+.ST >
+.DE
+End subscripting:
+reverse the motion and type size change of
+.ST < .
+In \*N mode,
+output a right angle bracket.
+.\" dead-tree pagination
+.br
+.ne 6v
+.pp
+\*G \*(ME provides localized strings
+to support documents in several input languages;
+see the
+.i groff_tmac (5)
+man page.
+The date-related strings are initialized
+based on the current date
+when the formatter runs.
+To encode a different date in your document,
+change the \*T date registers as desired
+and then call
+.b .ld
+to update the strings.
+The day of the week is
+.i not
+recomputed from a new calendar date;
+.NR (dw
+must be modified manually.
+The strings can also be defined directly.
+.(b L F
+.TL
+.ST (dw
+.DE
+Weekday name.
+.TL
+.ST (mo
+.DE
+Month name.
+.TL
+.ST (td
+.DE
+The date in a form suitable for correspondence.
+Construct other date formats with
+.ST (dw ,
+.NR (dy
+(day of the month),
+.ST (mo ,
+.NR (mo
+(month of the year),
+.NR (y4
+(year),
+and
+.NR (y2
+(year of the century).
+.TL
+.ST (wa
+.DE
+The term
+.b .$c
+uses for
+.q appendix .
+.TL
+.ST (wc
+.DE
+The term
+.b .$c
+uses for
+.q chapter .
+.)b
+.sh 1 "Special Characters"
+.pp
+For modern documents,
+see the
+.i groff_char (7)
+man page.
+.pp
+For rendering of legacy \*(ME documents,
+the macro package defines several strings that construct accent marks
+and two symbols from mathematical set theory.
+These strings are limited in multiple respects:
+they can have a crude appearance,
+they are unrecognizable on character-cell video terminals
+because they rely on overstriking,
+and they cannot in general be \(lqstacked\(rq,
+as is required to correctly render words in
+(for example)
+Vietnamese.
+Preferable \*G alternatives
+are presented alongside them in the following table.
+.sp
+.\" dead-tree pagination
+.ne 2v
+.ta 5n +\w'There exists'u+2n +\w'Usage'u+3n +\w'Example'u+3n \
++\w'Output'u+3n +\w'groff'u+3n +\w'Output'u+3n
+.nf
+.b " Name Usage Example Output \f(BIgroff\fP Output"
+ Acute \e*\(aq a\e*\(aq a\*' \e[a aa] \[a aa]
+ Grave \e*\(ga e\e*\(ga e\*` \e[e ga] \[e ga]
+ Umlaut \e*: u\e*: u\*: \e[u ad] \[u ad]
+ Tilde \e*\(ti n\e*\(ti n\*~ \e[n a\(ti] \[n a~]
+ Caret \e*\(ha e\e*\(ha e\*^ \e[e a\(ha] \[e a^]
+ Cedilla \e*, c\e*, c\*, \e[c ac] \[c ac]
+ Caron \e*v s\e*v s\*v \e[s ah] \[s ah]
+ Ring \e*o A\e*o A\*o \e[A ao] \[A ao]
+ There exists \e*(qe \*(qe \e[te] \[te]
+ For all \e*(qa \*(qa \e[fa] \[fa]
+.fi
+.pp
+Three further string definitions cause no particular problems but have
+no advantage over \*G special character escape sequences
+apart from portability to BSD Unix systems.
+(The last lacks even that distinction,
+since
+Unix Version\~7 \*T
+supported the
+.b \e(em
+special character.)
+.TL
+.ST (lq
+.DE
+Left double quotation mark.
+Use
+.b \e(lq
+instead.
+.TL
+.ST (rq
+.DE
+Right double quotation mark.
+Use
+.b \e(rq
+instead.
+.TL
+.ST \-
+.DE
+Em dash.
+Use
+.b \e(em
+instead.
+.uh Acknowledgments
+.pp
+Allman would like to thank
+Bob Epstein,
+Bill Joy,
+and Larry Rowe
+for having the courage
+to use the \*(ME macros
+to produce non-trivial papers
+during the development stages;
+Ricki Blau,
+Pamela Humphrey,
+and Jim Joyce
+for their help with the documentation phase;
+peter kessler
+for numerous complaints,
+most accompanied by fixes;
+and the plethora of people who have contributed ideas
+and have given support for the project.
+.bp
+.uh Summary
+.pp
+Almost all macros,
+strings,
+and registers
+available in the \*(ME package
+are summarized below;
+the legacy strings from section
+.q "Special Characters"
+are omitted.
+Selected \*T
+requests,
+registers,
+and escape sequences are included as well;
+those listed can generally be used with impunity.
+The list is sorted by Unicode code point
+(basic Latin subset)
+keyed on the identifier:
+escape and control characters are disregarded,
+as are the escape function selectors for register and string
+interpolation,
+.b n
+and
+.b * .
+.pp
+Each row contains the name of the
+macro (or request),
+register,
+string,
+or escape function;
+a code for the name's type
+(one of the foregoing);
+and its description.
+The type codes are
+.b M
+for a macro or \*T
+request
+(shown prefixed with the control character
+.b . ,
+but the no-break control character
+.b \(aq
+can also be used),
+.b S
+for a string
+(shown using its interpolation syntax,
+.b \e*
+or
+.b \e*( ),
+.b R
+for a register
+(shown using its interpolation syntax,
+.b \en
+or
+.b \en( ),
+and
+.b F
+for a \*T built-in function
+(shown prefixed with the escape character
+.b \e ).
+.pp
+The type code can carry a variety of annotations.
+A section sign \(sc indicates features interpreted by \*T
+rather than the \*(ME package.
+The dagger \(dg and double dagger \(dd identify user-definable macros.
+Those marked with
+\(dd have default definitions;
+changing them may have unexpected side effects.
+The degree sign \(de notes features requiring AT&T device-independent
+\*T extensions
+(ca.\& 1981),
+and a square \(sq labels \*G extensions.
+.de $H
+.ev 1
+.ta \w'\enewline\(sc'u +\w'TYPE'u+2n
+.b "Name Type Description"
+.ev
+..
+.sp
+.if t .2c
+.if n .(c
+.(l L
+.$H
+\e\fI\,newline\fP F\(sc continue input line
+\e" F\(sc comment (to end of input line)
+\e*# S delayed text marker
+\e$\fI\,n\fP F\(sc interpolate \fIn\/\fPth macro argument
+\en($0 R section depth
+\&.$0 M\(dg post-section heading hook
+\en($1 R first section number component
+\&.$1 M\(dg pre-section heading depth 1 hook
+\en($2 R second section number component
+\&.$2 M\(dg pre-section heading depth 2 hook
+\en($3 R third section number component
+\&.$3 M\(dg pre-section heading depth 3 hook
+\en($4 R fourth section number component
+\&.$4 M\(dg pre-section heading depth 4 hook
+\en($5 R fifth section number component
+\&.$5 M\(dg pre-section heading depth 5 hook
+\en($6 R sixth section number component
+\&.$6 M\(dg pre-section heading depth 6 hook
+\&.$C M\(dg post-chapter title heading hook
+\&.$H M\(dg page/column heading hook
+\en($c R current column number
+\&.$c M\(dd output chapter number and title
+\en($d R delayed text number
+\en($f R footnote number
+\&.$f M\(dd output footer
+\&.$h M\(dd output header
+\en($i R paragraph base indentation
+\en($l R column width
+\en($m R number of available columns
+\e*($n S concatenated section number
+\en($p R numbered paragraph number
+\&.$p M\(dd output section heading
+\en($s R column spacing (indentation)
+\&.$s M\(dd output footnote area separator
+\e% F\(sc control hyphenation
+\en% R\(sc current page number
+\e& F\(sc dummy character
+\e(\fI\,xx\fP F\(sc interpolate special character \fIxx\fP
+\&.(b M begin block
+\&.(c M begin centered block
+\&.(d M begin delayed text
+\&.(f M begin footnote
+\&.(l M begin list
+\&.(q M begin long quotation
+\&.(x M begin index entry
+\&.(z M begin floating keep
+\e\(aq F\(sc acute accent
+\&.)b M end block
+\&.)c M end centered block
+\&.)d M end delayed text
+\&.)f M end footnote
+\&.)l M end list
+\&.)q M end long quotation
+\&.)x M end index entry
+\&.)z M end floating keep
+\e*\fI\,x\fP F\(sc interpolate string \fIx\fP
+\e*(\fI\,xx\fP F\(sc interpolate string \fIxx\fP
+\e** S footnote marker
+\&.++ M set document segment type
+\&.+c M begin chapter or appendix
+\e\- F\(sc minus sign
+\e*\- S em dash
+\en(.$ R\(sc macro parameter count
+\en(.i R\(sc current indentation
+\en(.l R\(sc current line length
+\en(.p R\(sc current page length
+\en(.s R\(sc current type size in points
+\e0 F\(sc unadjustable digit-width space
+\&.1c M end multi-column layout
+\&.2c M begin multi-column layout
+\e*< S begin subscripting
+\e*> S end subscripting
+\&.EN M end \fI@g@eqn\fP equation
+\&.EQ M begin \fI@g@eqn\fP equation
+\&.GE M\(de end \fI@g@grn\fP picture with position at bottom
+\&.GF M\(de end \fI@g@grn\fP picture with position at top
+\&.GS M\(de start \fI@g@grn\fP picture
+\&.IE M\(de end \fIideal\fP picture with position at bottom
+\&.IF M\(de end \fIideal\fP picture with position at top
+\&.IS M\(de start \fIideal\fP picture
+\eL\(aq\fI\,d\/\fP\(aq F\(sc draw vertical line of length \fId\fP
+\&.PE M\(de end \fI@g@pic\fP picture with position at bottom
+\&.PF M\(de end \fI@g@pic\fP picture with position at top
+\&.PS M\(de start \fI@g@pic\fP picture
+\&.TE M end \fI@g@tbl\fP table
+\&.TH M end heading for multi-page \fI@g@tbl\fP table
+\&.TS M begin \fI@g@tbl\fP table
+\e\(ha F\(sc 1/12 em unbreakable hair space
+\e_ F\(sc underrule
+\e\(ga F\(sc grave accent
+\&.ad M\(sc set text adjustment mode
+\&.af M\(sc assign register format
+\&.am M\(sc append to macro
+\&.ar M use Arabic numerals for page numbers
+\&.as M\(sc append to string
+\&.b M embolden argument
+\&.ba M set base indentation
+\&.bc M begin new column
+\&.bi M embolden and italicize argument
+\en(bi R display (block) indentation
+\&.bl M insert space (even at page top; cf.\& \fB.sp\fP)
+\en(bm R distance from text area to page bottom
+\&.bp M\(sc begin new page
+\&.br M\(sc break output line
+\en(bs R display (block) pre/post space
+\en(bt R block threshold for keeps
+\&.bx M box argument
+\ec F\(sc continue output line
+\&.ce M\(sc center output lines
+\en(ch R current chapter number
+\&.cp M\(sc\(sq toggle AT&T \*T compatibility mode
+\&.de M\(sc define macro
+\en(df R display font
+\&.do M\(sc\(sq operate with compatibility mode off
+\&.ds M\(sc define string
+\en(dv R\(sq vertical spacing of displayed text (%)
+\en(dw R\(sc day of the week
+\e*(dw S weekday name
+\en(dy R\(sc day of the month
+\ee F\(sc printable version of escape character \fB\e\fP
+\&.ef M set even-numbered page footer
+\&.eh M set even-numbered page header
+\&.el M\(sc else part of \fB.ie\fP conditional
+\&.ep M end page
+\en(es R equation pre/post space
+\ef\fI\,f\fP F\(sc inline font change to font \fIf\fP
+\ef(\fI\,ff\fP F\(sc inline font change to font \fIff\fP
+\&.fc M\(sc set field characters
+\en(ff R footnote font
+\&.fi M\(sc enable filling
+\en(fi R footnote indentation (first line only)
+\en(fm R footer margin
+\&.fo M set footer
+\&.fp M mount font at position
+\en(fp R footnote type size in points
+\en(fs R footnote prespace
+\en(fu R footnote undent (right indentation)
+\eh\(aq\fI\,d\/\fP\(aq F\(sc move distance \fId\fP horizontally
+\&.hc M\(sc set hyphenation character
+\&.he M set header
+\&.hl M draw horizontal line
+\en(hm R header margin
+\&.hx M suppress next page's headers/footers
+\&.hy M\(sc set automatic hyphenation mode
+\&.i M italicize argument
+\&.ie M\(sc conditional with \fB.el\fP
+\&.if M\(sc conditional
+\en(ii R indented paragraph indentation
+\&.in M\(sc set indentation (transient; cf.\& \fB.ba\fP)
+\&.ip M begin indented paragraph
+\&.ix M set indentation without break
+\el\(aq\fI\,d\/\fP\(aq F\(sc draw horizontal line of length \fId\fP
+\&.lc M\(sc set leader repetition character
+\&.ld M\(sq reset localization and date info
+\&.ll M set line length in \fIme\fP environments
+\&.lp M begin fully left-aligned paragraph
+\e*(lq S left double quotation mark
+\&.ls M\(sc set multi-line spacing
+\&.m1 M set page top to header distance
+\&.m2 M set header to text distance
+\&.m3 M set text to footer distance
+\&.m4 M set footer to page bottom distance
+\&.mc M\(sc set margin character
+\&.mk M\(sc mark vertical position (see \fB.rt\fP)
+\en(mo R\(sc month of the year
+\e*(mo S month name
+\en\fI\,x\fP F\(sc interpolate register \fIx\fP
+\en(\fI\,xx\fP F\(sc interpolate register \fIxx\fP
+\&.n1 M begin output line numbering
+\&.n2 M end or alter output line numbering
+\&.na M\(sc disable adjustment
+\&.ne M\(sc need vertical space
+\&.nf M\(sc disable filling
+\&.nh M\(sc disable automatic hyphenation
+\en(no R\(sq line numbering offset
+\&.np M begin numbered paragraph
+\&.nr M\(sc set register
+\&.ns M\(sc begin no-space mode
+\&.of M set odd-numbered page footer
+\&.oh M set odd-numbered page header
+\&.pa M begin page
+\&.pd M output delayed text
+\en(pf R paragraph font
+\en(pi R paragraph indentation
+\&.pl M\(sc set page length
+\&.pn M\(sc set next page number
+\&.po M\(sc set page offset
+\en(po R paragraph offset
+\&.pp M begin first-line indented paragraph
+\en(pp R paragraph type size in points
+\en(ps R paragraph prespace
+\&.q M quote argument
+\en(qi R long quotation left/right indentation
+\en(qp R long quotation type size in points
+\en(qs R long quotation pre/post space
+\&.r M set argument in roman
+\&.re M reset tab stops
+\&.rj M\(sq right-align output lines
+\&.rm M\(sc remove macro, string, or request
+\&.rn M\(sc rename macro, string, or request
+\&.ro M use Roman numerals for page numbers
+\e*(rq S right double quotation mark
+\&.rr M\(sc remove register
+\&.rs M\(sc restore spacing (end no-space mode)
+\&.rt M\(sc return to vertical position set by \fB.mk\fP
+\es\(aq\fI\,\(+-n\/\fP\(aq F\(sc\(de inline type size change\
+ to/by \fIn\fP points
+\en(sf R section title font
+\&.sh M begin numbered section
+\en(si R section indentation per level of depth
+\&.sk M skip next page
+\&.sm M set argument at smaller type size
+\&.so M\(sc source (interpolate) input file
+\en(so R additional section title offset
+\&.sp M\(sc insert space (except at page top; cf.\& \fB.bl\fP)
+\en(sp R section title type size in points
+\en(ss R section prespace
+\&.sx M change section depth
+\en(sx R\(sq super/subscript line height increase
+\&.sz M set type size and vertical spacing
+\&.ta M\(sc set tab stops
+\&.tc M\(sc set tab repetition character
+\e*(td S today's date
+\en(tf R title font
+\&.ti M\(sc temporary indentation (next line only)
+\&.tl M\(sc output three-part title
+\en(tm R distance from page top to text area
+\&.tp M begin title page
+\en(tp R title type size in points
+\&.tr M\(sc translate characters
+\en(tv R\(sq vertical spacing of text (%)
+\&.u M underline argument
+\&.uh M begin unnumbered section
+\&.ul M\(sc underline output lines
+\ev\(aq\fI\,d\/\fP\(aq F\(sc move distance \fId\fP vertically
+\ew\(aq\fI\,S\/\fP\(aq F\(sc interpolate formatted width of \fIS\fP
+\e*(wa S\(sq term for \(lqappendix\(rq used by \fB.$c\fP
+\e*(wc S\(sq term for \(lqchapter\(rq used by \fB.$c\fP
+\&.xl M set line length (current environment)
+\&.xp M output index
+\en(xs R index entry prespace
+\en(xu R index undent (right indentation)
+\en(y2 R\(sq year of the century
+\en(y4 R\(sq year
+\en(yr R\(sc year minus 1900
+\en(zs R floating keep pre/post space
+\e{ F\(sc begin conditional group
+\e*{ S begin superscripting
+\e| F\(sc 1/6 em unbreakable thin space
+\e} F\(sc end conditional group
+\e*} S end superscripting
+\e\(ti F\(sc\(sq unbreakable word space
+.)l
+.if n .)c
+.ds $H \" empty
+.\" If we're laying out the final column, `1c` will produce an
+.\" unnecessary empty page. If we're not, omitting `1c` will format a
+.\" column of headers with nothing underneath.
+.if \n($c<\n($m .1c
+.\" Local Variables:
+.\" mode: nroff
+.\" End:
+.\" vim: filetype=groff:
diff --git a/doc/ms.ms b/doc/ms.ms
new file mode 100644
index 0000000..984c804
--- /dev/null
+++ b/doc/ms.ms
@@ -0,0 +1,4486 @@
+.\" 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+.
+.\" Handle font requests with families, for instance in tbl(1) tables.
+.if n \{\
+. ftr CR B \" for a visible distinction from roman
+. ftr CB B
+. ftr CI I
+. ftr CBI BI
+. \" Redefine CW to use bold instead for a visible font change.
+. als CW B
+. \" The "document control settings" table imposes this minimum width.
+. nr LL 87n
+.\}
+.\" This document doesn't require the minus sign (in Times) but we do
+.\" want a copy- and-pastable hyphen-minus.
+.ie '\*[.T]'cp1047' .char \- \N'96'
+.el .char \- \N'45'
+.\" A very limited output device might not have a dagger glyph.
+.fchar \[dg] *
+.nr PS 11
+.nr VS 13
+.ds FR 1
+.nr TC-MARGIN \w'00' \" expect 2-digit page numbers at most
+.ie t .nr PI 3.5n
+.el .nr PI 4n
+.ND May 2023
+.EH '%''May 2023'
+.EF ''''
+.OH 'Using \f[I]groff\f[] with the \f[I]ms\f[] macros''%'
+.OF ''''
+.TL
+Using
+.BI groff
+with the
+.BI ms
+Macro Package
+.AU
+Larry Kollar
+.AI
+kollar@alltel.net
+.AU
+G.\& Branden Robinson
+.AI
+g.branden.robinson@gmail.com
+.AB no
+The
+.I ms
+(\[lq]manuscript\[rq]) package is suitable for the composition of
+letters,
+memoranda,
+reports,
+and books.
+.
+These
+.I groff
+macros feature cover page and table of contents generation,
+automatically numbered headings,
+several paragraph styles,
+a variety of text styling options,
+footnotes,
+and multi-column page layouts.
+.
+.I ms
+supports the
+.I tbl ,
+.I eqn ,
+.I pic ,
+and
+.I refer
+preprocessors for inclusion of tables,
+mathematical equations,
+diagrams,
+and standardized bibliographic citations.
+.
+This implementation is mostly compatible with the documented interface
+and behavior of AT&T Unix Version\~7
+.I ms .
+.
+Many extensions from 4.2BSD (Berkeley)
+.\" Few changes were made in 4.3, Tahoe, Reno, or 4.4.
+and Tenth Edition Research Unix have been recreated.
+.AE
+.
+.
+.\" ------------------------- End of cover page ------------------------
+.NH 1
+Introduction
+.XS
+Introduction
+.XE
+.
+.
+.LP
+The
+.I ms
+macros are the oldest surviving package for
+.I roff
+systems.\**
+.
+.FS
+While manual
+.I pages
+are older,
+early ones used macros supplanted by the
+.I man
+package of Seventh Edition Unix (1979).
+.
+.I ms
+shipped with Sixth Edition (1975) and was documented by Mike Lesk in a
+Bell Labs internal memorandum.
+.FE
+.
+While the
+.I man
+package was designed for brief reference documents,
+the
+.I ms
+macros are also suitable for longer works intended for printing and
+possible publication.
+.
+.
+.PP
+In this document,
+a right arrow (\[->]) is used to indicate a tab character in the input.
+.
+.
+.KS
+.NH 2
+Basic information
+.XS
+ Basic information
+.XE
+.
+.
+.LP
+.I ms
+documents are plain text files;
+prepare them with your preferred text editor.
+.
+If you're in a hurry to start,
+know that
+.I ms
+needs one of its macros called at the beginning of a document so that it
+can initialize.
+.
+A
+.I macro
+is a formatting instruction to
+.I ms.
+.
+Put a macro call on a line by itself.
+.
+Use
+.CW .PP
+if you want your paragraph's first line to be indented,
+or
+.CW .LP
+if you don't.
+.KE
+.
+.
+.PP
+After that,
+start typing normally.
+.
+It is a good practice to start each sentence on a new line,
+or to put two spaces after sentence-ending punctuation,
+so that the formatter knows where the sentence boundaries are.
+.
+You can separate paragraphs with further paragraphing macro calls,
+or with blank lines,
+and you can indent with tabs.
+.
+When you need one of the features mentioned earlier,
+return to this manual.
+.
+.
+.PP
+Format the document with the
+.I groff (1)
+command.
+.
+.I nroff (1)
+can be useful for previewing.
+.
+.
+.if n .ftr TI I
+.TS
+box center;
+Lf(CR)1 Lf(CB).
+$ editor radical.ms \f[TI]# vim, emacs, .\|.\|.
+$ nroff -ww -z -ms radical.ms \f[TI]# check for errors
+$ nroff \-ms radical.ms | less \-R
+$ groff \-T pdf \-ms radical.ms > radical.pdf
+$ see radical.pdf \f[TI]# or your favorite PDF viewer
+.TE
+.if n .ftr TI
+.
+.
+.PP
+Our
+.CW radical.ms
+document might look like this.
+.
+.
+.TS
+box center;
+Lf(CR).
+\&.LP
+Radical novelties are so disturbing that they tend to be
+suppressed or ignored, to the extent that even the
+possibility of their existence in general is more often
+denied than admitted.
+.sp
+\[->]That\[aq]s what Dijkstra said, anyway.
+.TE
+.
+.
+.LP
+.I ms
+exposes many aspects of document layout to user control via
+.I groff 's
+.I registers
+and
+.I strings,
+which store numbers and text,
+respectively.
+.
+Measurements in
+.I groff
+are expressed with a suffix called a
+.I "scaling unit."
+.
+.
+.TS
+box center;
+cb cb
+cf(CR) l .
+Scaling unit Description
+_
+i inches (\[sd])
+c centimeters
+p points (1/72\[sd])
+P picas (1/6\[sd])
+v \[lq]vees\[rq]; current vertical spacing
+m \[lq]ems\[rq]; width of an \[lq]M\[rq] in the current font
+n \[lq]ens\[rq]; one-half em
+.TE
+.
+.
+.PP
+Set registers with the
+.CW nr
+request
+and strings with the
+.CW ds
+request.
+.
+.I Requests
+are like macro calls;
+they go on lines by themselves and start with the
+.I "control character,"
+a dot
+.CW . ). (
+.
+The difference is that they directly instruct the formatter program,
+rather than the macro package.
+.
+We'll discuss a few as applicable.
+.
+It is wise to specify a scaling unit when setting any register that
+represents a length,
+size,
+or distance.
+.
+.
+.TS
+box center;
+lf(CR).
+\&.nr PS 10.5p \[rs]" Use 10.5\-point type.
+\&.ds FAM P \[rs]" Use Palatino font family.
+.TE
+.
+.
+.LP
+In the foregoing,
+we see that
+.CW \[rs]"
+begins a comment.
+.
+This is an example of an
+.I "escape sequence,"
+the other kind of formatting instruction.
+.
+Escape sequences can appear anywhere.
+.
+They begin with the escape character
+.CW \[rs] ) (
+and are followed by at least one more character.
+.
+.I ms
+documents like this one tend to use only a few of
+.I groff 's
+many requests and escape sequences;
+see the
+.I groff (7)
+man page for complete lists.
+.
+.
+.TS
+box center;
+Cb Cb
+Lf(CR) Lx .
+Escape sequence Description
+_
+\[rs]" Begin comment; ignore remainder of line.
+\[rs]n[\f[I]reg\f[]] T{
+Interpolate value of register
+.I reg .
+T}
+\[rs]*[\f[I]str\f[]] T{
+Interpolate contents of string
+.I str .
+T}
+\[rs]*\f[I]s T{
+abbreviation of
+.CW \[rs]*[\f[I]s\f[]] ;
+the name
+.I s
+must be only one character
+T}
+\[rs][\f[I]char\f[]] T{
+Interpolate glyph of special character named
+.I char .
+T}
+\[rs]& non-printing, zero-width dummy character
+\[rs]\[ti] T{
+Insert an unbreakable space of adjustable width like a normal space.
+T}
+\[rs]| T{
+Move horizontally by one-sixth em
+(\[lq]thin space\[rq]).
+T}
+.TE
+.
+.
+.PP
+Prefix any words that start with a dot
+.CW .\& ) (
+or neutral apostrophe
+.CW \[aq] ) (
+with
+.CW \[rs]&
+if they are at the beginning of an input line
+(or might become that way in editing)
+to prevent them from being interpreted as macro calls or requests.
+.
+Suffix
+.CW . ,
+.CW ? ,
+and
+.CW !\&
+with
+.CW \[rs]&
+when needed to cancel end-of-sentence detection.
+.
+.
+.TS
+box center;
+lf(CR).
+My exposure was \[rs]&.5 to \[rs]&.6 Sv of neutrons, said Dr.\[rs]&
+Wallace after the criticality incident.
+.TE
+.
+.
+.\" ------------------------
+.if t \{\
+. br
+. bp
+.\}
+.NH 1
+General structure of an
+.BI ms
+document
+.XS
+General structure of an
+.I ms
+document
+.XE
+.
+.
+.LP
+The
+.I ms
+macro package expects a certain amount of structure:
+a well-formed document contains at least one paragraphing or heading
+macro call.
+.
+Longer documents have a structure as follows.
+.
+.
+.IP "\fBDocument type\fP"
+Calling the
+.CW RP
+macro at the beginning of your document puts the document description
+(see below)
+on a cover page.
+.
+Otherwise,
+.I ms
+places this information
+(if any)
+on the first page,
+followed immediately by the body text.
+.
+Some document types found in other
+.I ms
+implementations are specific to AT&T or Berkeley,
+and are not supported by
+.I "groff ms" .
+.
+.
+.IP "\fBFormat and layout\fP"
+By setting registers and strings,
+you can configure your document's typeface,
+margins,
+spacing,
+headers and footers,
+and footnote arrangement.
+.
+See section \[lq]Document control settings\[rq] below.
+.
+.
+.IP "\fBDocument description\fP"
+A document description consists of any of:
+a title,
+one or more authors' names and affiliated institutions,
+an abstract,
+and a date or other identifier.
+.
+See section \[lq]Document description macros\[rq] below.
+.
+.
+.IP "\fBBody text\fP"
+The main matter of your document follows its description
+(if any).
+.
+.I ms
+supports highly structured text consisting of paragraphs interspersed
+with multi-level headings
+(chapters,
+sections,
+subsections,
+and so forth)
+and augmented by lists,
+footnotes,
+tables,
+diagrams,
+and similar material.
+.
+See section \[lq]Body text\[rq] below.
+.
+.
+.IP "\fBTables of contents\fP"
+Macros enable the collection of entries for a table of contents
+(or index)
+as the material they discuss appears in the document.
+.
+You then call a macro to emit the table of contents at the end of
+your document.
+.
+The table of contents must necessarily follow the rest of the text since
+GNU
+.I troff
+is a single-pass formatter;
+it thus cannot determine the page number of a division of the text until
+it has been set and output.
+.
+Since
+.I ms
+output was designed for the production of hard copy,
+the traditional procedure was to manually relocate the pages containing
+the table of contents between the cover page and the body text.
+.
+Today,
+page resequencing is more often done in the digital domain.
+.
+An index works similarly,
+but because it typically needs to be sorted after collection,
+its preparation requires separate processing.
+.
+.
+.\" ------------------------
+.if t \{\
+. br
+. bp
+.\}
+.NH 1
+Document control settings
+.XS
+Document control settings
+.XE
+.
+.
+.LP
+The document parameters below are presented in the syntax
+used to interpolate their values.
+.
+For any unsatisfactory default,
+define its register,
+string,
+or special character before calling any
+.I ms
+macro other than
+.CW RP .
+.
+The \[lq]Next\[rq] heading indicates that changes to the parameter are
+effective as of the next new element processed of the listed type.
+.
+For entries marked
+.I special ,
+see the discussion in the applicable section.
+.
+.
+.TS H
+box;
+cb | cb cb cb cb
+l | lf(CR)p-1 lx l lf(CR)p-1.
+Type Parameter Definition Next Default
+_
+.TH
+Margins \[rs]n[PO] Page offset (left margin) page\
+ 1i (0)\*{*\*}
+\^ \[rs]n[LL] Line length paragraph \
+6.5i (65n)\*{*\*}
+\^ \[rs]n[LT] Title line length paragraph \
+6.5i (65n)\*{*\*}
+\^ \[rs]n[HM] Top (header) margin page 1i
+\^ \[rs]n[FM] Bottom (footer) margin page 1i
+_
+T{
+Titles
+.br
+(headers,
+.br
+footers)
+T} \[rs]*[LH] Left header text header \f[I]empty
+\^ \[rs]*[CH] Center header text header \-\[rs]n[%]\-
+\^ \[rs]*[RH] Right header text header \f[I]empty
+\^ \[rs]*[LF] Left footer text footer \f[I]empty
+\^ \[rs]*[CF] Center footer text footer \f[I]empty
+\^ \[rs]*[RF] Right footer text footer \f[I]empty
+_
+Text \[rs]n[PS] Type (point) size paragraph 10p
+\^ \[rs]n[VS] Vertical spacing paragraph 12p
+\^ \[rs]n[HY] Hyphenation mode paragraph 6
+\^ \[rs]*[FAM] Font family paragraph T
+_
+Paragraphs \[rs]n[PI] Indentation paragraph 5n
+\^ \[rs]n[PD] Paragraph distance (spacing) paragraph\
+ 0.3v \f[R](\f[]1v\f[R])\*{\[dg]\*}
+\^ \[rs]n[QI] Quotation indentation paragraph 5n
+\^ \[rs]n[PORPHANS] # of initial lines kept paragraph\
+ 1
+_
+Headings \[rs]n[PSINCR] Type (point) size increment\
+ heading 1p
+\^ \[rs]n[GROWPS] Size increase depth limit heading 0
+\^ \[rs]n[HORPHANS] # of following lines kept\
+ heading 1
+\^ \[rs]*[SN\-STYLE] Numbering style (alias) heading\
+ \[rs]*[SN\-DOT]
+_
+Footnotes \[rs]n[FI] Indentation footnote 2n
+\^ \[rs]n[FF] Format footnote 0
+\^ \[rs]n[FPS] Type (point) size footnote\
+ \[rs]n[PS]\-2p
+\^ \[rs]n[FVS] Vertical spacing footnote\
+ \[rs]n[FPS]+2p
+\^ \[rs]n[FPD] Paragraph distance (spacing) footnote\
+ \[rs]n[PD]/2
+\^ \[rs]*[FR] Line length ratio \f[I]special 11/12
+_
+Displays \[rs]n[DD] Display distance (spacing)\
+ \f[I]special 0.5v \f[R](\f[]1v\f[R])\*{\[dg]\*}
+\^ \[rs]n[DI] Display indentation \f[I]special 0.5i
+_
+Other \[rs]n[MINGW] Minimum gutter width page 2n
+\^ \[rs]n[TC\-MARGIN] TOC page number margin width\
+ \f[CR]PX\f[] call \[rs]w\[aq]000\[aq]
+\^ \[rs][TC\-LEADER] TOC leader character\
+ \f[CR]PX\f[] call .\[rs]h\[aq]1m\[aq]
+.TE
+.
+.
+.IP \*{*\*}
+Defaults vary by output device and paper format;
+the values shown are for typesetters using U.S.\& letter paper,
+and then terminals.
+.
+See section \[lq]Paper format\[rq] of the
+.I groff (1)
+man page.
+.
+.
+.IP \*{\[dg]\*}
+The
+.CW PD
+and
+.CW DD
+registers use the larger value if the vertical motion quantum of the
+output device is too coarse for the smaller one;
+usually,
+this is the case only for output to terminals and emulators thereof.
+.
+.
+.\" ------------------------
+.if t \{\
+. br
+. bp
+.\}
+.NH 1
+Document description macros
+.XS
+Document description macros
+.XE
+.
+.
+.LP
+Only the simplest document lacks a title.\**
+.
+.FS
+Distinguish a document title from \[lq]titles\[rq],
+which are what
+.I roff
+systems call headers and footers collectively.
+.FE
+.
+As its level of sophistication
+(or complexity)
+increases,
+it tends to acquire a date of revision,
+explicitly identified authors,
+sponsoring institutions for authors,
+and,
+at the rarefied heights,
+an abstract of its content.
+.
+By default,
+.I ms
+arranges most of the document description
+(the title,
+author names and institutions,
+and abstract,
+but not the date)
+at the top of the first page.
+.
+.
+.PP
+Define these data by calling the macros below in the order shown;
+.CW .DA
+or
+.CW .ND
+can be called to set the document date
+(or other identifier)
+at any time before (a) the abstract,
+if present,
+or (b) its information is required in a header or footer.
+.
+Use of these macros is optional,
+except that
+.CW .TL
+is mandatory if any of
+.CW .RP ,
+.CW .AU ,
+.CW .AI ,
+or
+.CW .AB
+is called,
+and
+.CW .AE
+is mandatory if
+.CW .AB
+is called.
+.
+.
+.TS H
+box;
+lb lb
+lf(CR) lx.
+Macro Description
+_
+.TH
+\&.RP \f[R][\f[I]option\f[] .\|.\|.] T{
+Use the \[lq]report\[rq]
+(AT&T: \[lq]released paper\[rq])
+format for your document,
+creating a separate cover page.
+.
+If the optional
+.CW no\-\:\%repeat\-\:\%info
+argument is given,
+.I ms
+produces a cover page but does not repeat any of its information
+subsequently
+(but see the
+.CW DA
+macro below regarding the date).
+.
+Normally,
+.CW .RP
+sets the page number following the cover page to\~1.
+.
+Specifying the optional
+.CW no\-\:\%renumber
+argument suppresses this alteration.
+.
+Optional arguments can occur in any order.
+.
+.CW no
+is recognized as a synonym of
+.CW no\-\:\%repeat\-\:\%info
+for AT&T compatibility.
+T}
+_
+\&.TL T{
+Specify the document title.
+.
+.I ms
+collects text on input lines following this call into the title
+until reaching
+.CW .AU ,
+.CW .AB ,
+or a heading or paragraphing macro call.
+T}
+_
+\&.AU T{
+Specify an author's name.
+.
+.I ms
+collects text on input lines following this call into the author's name
+until reaching
+.CW .AI ,
+.CW .AB ,
+another
+.CW .AU ,
+or a heading or paragraphing macro call.
+.
+Call it repeatedly to specify multiple authors.
+T}
+_
+\&.AI T{
+Specify the preceding author's institution.
+.
+An
+.CW .AU
+call is usefully followed by at most one
+.CW .AI
+call;
+if there are more,
+the last
+.CW .AI
+call controls.
+.
+.I ms
+collects text on input lines following this call into the author's
+institution until reaching
+.CW .AU ,
+.CW .AB ,
+or a heading or paragraphing macro call.
+T}
+_
+\&.DA \f[R][\f[I]x\f[] .\|.\|.\&] T{
+Typeset the current date,
+or any
+.I x , arguments\~
+in the center footer,
+and,
+if
+.CW .RP
+is also called,
+left-aligned at the end of the document description on the cover page.
+T}
+_
+\&.ND \f[R][\f[I]x\f[] .\|.\|.\&] T{
+Typeset the current date,
+or any
+.I x , arguments\~
+if
+.CW .RP
+is also called,
+left-aligned at the end of the document description on the cover page.
+.
+This is
+.I "groff ms" 's
+default.
+T}
+_
+\&.AB \f[R][\f[]no\f[R]] T{
+Begin the abstract.
+.
+.I ms
+collects text on input lines following this call into the abstract
+until reaching an
+.CW .AE
+call.
+.
+By default,
+.I ms
+places the word \[lq]ABSTRACT\[rq] centered and in italics above the
+text of the abstract.
+.
+The optional argument
+.CW no
+suppresses this heading.
+T}
+_
+\&.AE End the abstract.
+.TE
+.
+.
+.KS
+.LP
+An example document description,
+using a cover page,
+follows.
+.
+.
+.\" Wrap lines in the code example below at 64 columns.
+.TS
+box center;
+l.
+T{
+.nf
+.CW
+\&.RP
+\&.TL
+The Inevitability of Code Bloat in Commercial and Free Software
+\&.AU
+J.\[rs]& Random Luser
+\&.AI
+University of West Bumblefuzz
+\&.AB
+This report examines the long-term growth of the code bases in
+two large,
+popular software packages;
+the free Emacs and the commercial Microsoft Word.
+While differences appear in the type or order of features added,
+due to the different methodologies used,
+the results are the same in the end.
+\&.PP
+The free software approach is shown to be superior in that while
+free software can become as bloated as commercial offerings,
+free software tends to have fewer serious bugs and the added
+features are more in line with user demand.
+\&.AE
+.R
+\&.\|.\|.\|the rest of the paper\|.\|.\|.
+.fi
+T}
+.TE
+.KE
+.
+.
+.\" ------------------------
+.if t \{\
+. br
+. bp
+.\}
+.NH 1
+Body text
+.XS
+Body text
+.XE
+.
+.
+.LP
+A variety of macros,
+registers,
+and strings can be used to structure and style the body of your
+document.
+.
+They organize your text into
+paragraphs,
+headings,
+footnotes,
+and inclusions of material such as tables and figures.
+.
+.
+.KS
+.NH 2
+Text settings
+.XS
+ Text settings
+.XE
+.
+.
+.LP
+The
+.CW FAM
+string,
+a GNU extension,
+sets the font family for body text;
+the default is
+.CW T \[rq]. \[lq]
+.
+The
+.CW PS
+and
+.CW VS
+registers set the type size and vertical spacing
+(distance between text baselines),
+respectively.
+.
+The font family and type size are ignored on terminal devices.
+.
+Setting these parameters before the first call of a heading,
+paragraphing,
+or (non-date) document description macro also applies them to headers,
+footers,
+and
+(for
+.CW FAM )
+footnotes.
+.
+.
+.PP
+Which font families are available depends on the output device;
+as a convention,
+.CW T
+selects a serif family (\[lq]Times\[rq]),
+.CW H
+a sans-serif family (\[lq]Helvetica\[rq]),
+and
+.CW C
+a monospaced family (\[lq]Courier\[rq]).
+.
+The man page for the output driver documents its font repertoire.
+.
+Consult the
+.I groff (1)
+man page for lists of available output devices and their drivers.
+.
+.
+.PP
+The
+.CW HY
+register defines the automatic hyphenation mode used with the
+.CW hy
+request.
+.
+Setting
+.CW \[rs]n[HY]
+.CW 0 "" to\~
+is equivalent to using the
+.CW nh
+request.
+.
+This is a Tenth Edition Research Unix extension.
+.KE
+.
+.
+.KS
+.NH 2
+Typographical symbols
+.XS
+ Typographical symbols
+.XE
+.
+.
+.LP
+.I ms
+provides a few strings to obtain typographical symbols not easily
+entered with the keyboard.
+.
+These and many others are available as special character escape
+sequences\*[-]see
+the
+.I groff_char (7)
+man page.
+.
+.TS
+box center;
+cb lb
+Lf(CR) Lx.
+String Description
+_
+\[rs]*[\-] Interpolate an em dash.
+_
+\[rs]*[Q] T{
+Interpolate typographer's quotation marks where available,
+and neutral double quotes otherwise.
+.
+.CW \[rs]*[Q]
+is the left quote and
+.CW \[rs]*[U]
+the right.
+T}
+\[rs]*[U] \^
+.TE
+.KE
+.
+.
+.KS
+.NH 2
+Paragraphs
+.XS
+ Paragraphs
+.XE
+.
+.
+.LP
+Paragraphing macros
+.I break ,
+or terminate,
+any pending output line so that a new paragraph can begin.
+.
+Several paragraph types are available,
+differing in how indentation
+applies to them:
+to left,
+right,
+or both margins;
+to the first output line of the paragraph,
+all output lines,
+or all but the first.
+.
+All paragraphing macro calls cause the insertion of vertical space in
+the amount stored in the
+.CW PD
+register,
+except at page or column breaks.
+.
+Alternatively,
+a blank input line breaks the output line and vertically spaces by one
+vee.
+.KE
+.
+.
+.PP
+The
+.CW PORPHANS
+register defines the minimum number of initial lines of any paragraph
+that must be kept together to avoid isolated lines at the bottom of a
+page.
+.
+If a new paragraph is started close to the bottom of a page,
+and there is insufficient space to accommodate
+.CW \[rs]n[PORPHANS]
+lines before an automatic page break,
+then a page break is forced before the start of the paragraph.
+.
+This is a GNU extension.
+.
+.
+.TS H
+box;
+lb lb
+lf(CR) lx.
+Macro Description
+_
+.TH
+\&.LP Set a paragraph without any (additional) indentation.
+_
+\&.PP T{
+Set a paragraph with a first-line left indentation of
+.CW \[rs]n[PI] .
+T}
+_
+\&.IP \f[R][\f[I]marker\f[] [\f[I]width\f[]]] T{
+Set a paragraph with a left indentation.
+.
+The optional
+.I marker
+is not indented and is empty by default.
+.
+It has several applications;
+see subsection \[lq]Lists\[rq] below.
+.
+.I width
+overrides the indentation amount in
+.CW \[rs]n[PI] ;
+its default unit is
+.CW n \[rq]. \[lq]
+.
+Once specified,
+.I width
+applies to further
+.CW .IP
+calls until specified again or a heading or different paragraphing macro
+is called.
+T}
+_
+\&.QP T{
+Set a paragraph indented from both left and right margins by
+.CW \[rs]n[QI] .
+T}
+_
+T{
+\&.QS
+.br
+\&.QE
+T} T{
+Begin
+.CW QS ) (
+and end
+.CW QE ) (
+a region where each paragraph is indented from both margins by
+.CW \[rs]n[QI] .
+.
+The text between
+.CW .QS
+and
+.CW .QE
+can be structured further by use of other paragraphing macros.
+T}
+_
+\&.XP T{
+Set an \[lq]exdented\[rq] paragraph\[em]one with a left indentation of
+.CW \[rs]n[PI]
+on every line
+.I except
+the first
+(also known as a hanging indent).
+.
+This is a Berkeley extension.
+T}
+.TE
+.
+.
+.KS
+.PP
+The following example illustrates the use of paragraphing macros.
+.
+.
+.TS
+box center;
+l.
+T{
+.nf
+.CW
+\&.NH 2
+Cases used in the 2001 study
+\&.LP
+Two software releases were considered for this report.
+\&.PP
+The first is commercial software;
+the second is free.
+\&.IP \[rs][bu]
+Microsoft Word for Windows,
+starting with version 1.0 through the current version
+(Word 2000).
+\&.IP \[rs][bu]
+GNU Emacs,
+from its first appearance as a standalone editor through the
+current version (v20).
+See [Bloggs 2002] for details.
+\&.QP
+Franklin\[aq]s Law applied to software:
+software expands to outgrow both RAM and disk space over time.
+\&.SH
+Bibliography
+\&.XP
+Bloggs, Joseph R.,
+\&.I "Everyone\[aq]s a Critic" ,
+Underground Press, March 2002.
+A definitive work that answers all questions and criticisms
+about the quality and usability of free software.
+.R
+.fi
+T}
+.TE
+.KE
+.
+.
+.KS
+.NH 2
+Headings
+.XS
+ Headings
+.XE
+.
+.
+.LP
+Use headings to create a hierarchical structure for your document.
+.
+The
+.I ms
+macros print headings in
+.B bold
+using the same font family and,
+by default,
+type size as the body text.
+.
+Headings are available with and without automatic numbering.
+.
+Text on input lines following the macro call becomes the heading's
+title.
+.
+Call a paragraphing macro to end the heading text and start the
+section's content.
+.
+.
+.TS
+box;
+cb cb
+lf(CR) lx .
+Macro Description
+_
+\&.NH [\f[I]depth\f[]] T{
+Set an automatically numbered heading.
+.
+.I ms
+produces a numbered heading in the form
+.CW
+.I a .\c
+.I b .\c
+.R
+.I c .\|.\|.,
+to any level desired,
+with the numbering of each depth increasing automatically and being
+reset to zero when a more significant depth increases.
+.
+\[lq]1\[rq]\~is the most significant or coarsest division of the
+document.
+.
+Only non-zero values are output.
+.
+If
+.I depth
+is omitted,
+it is taken to be
+.CW 1 .
+.
+If you specify
+.I depth
+such that an ascending gap occurs relative to the previous
+.CW NH
+call\[em]that is,
+you \[lq]skip a depth\[rq],
+as by
+.CW ".NH\~1" \[rq] \[lq]
+and then
+.CW ".NH\~3" \[rq]\c \[lq]
+.I "groff ms" "" \[em]
+emits a warning on the standard error stream.
+T}
+\&.NH S \f[I]heading-depth-index\f[]\f[R] .\|.\|.\f[] T{
+Alternatively,
+you can give
+.CW NH
+a first argument
+.CW S , of\~
+followed by integers to number the heading depths explicitly.
+.
+Further automatic numbering,
+if used,
+resumes using the specified indices as their predecessors.
+.
+.\" Although undocumented in Tuthill's 4.2BSD ms.diffs paper...
+This feature is a Berkeley extension.
+T}
+.TE
+.KE
+.
+.
+.PP
+An example may be illustrative.
+.
+.
+.TS
+box center;
+cb | cb
+lf(CR) | lB.
+Input Result
+_
+T{
+.nf
+\&.NH 1
+Animalia
+\&.NH 2
+Arthropoda
+\&.NH 3
+Crustacea
+\&.NH 2
+Chordata
+\&.NH S 6 6 6
+Daimonia
+\&.NH 1
+Plantae
+.fi
+T} T{
+.nf
+1. Animalia
+.sp
+1.1. Arthropoda
+.sp
+1.1.1. Crustacea
+.sp
+1.2. Chordata
+.sp
+6.6.6. Daimonia
+.sp
+7. Plantae
+.fi
+T}
+.TE
+.
+.
+.PP
+After
+.CW .NH
+is called,
+the assigned number is made available in the strings
+.CW SN\-DOT
+(as it appears in a printed heading with default formatting,
+followed by a terminating period)
+and
+.CW SN\-NO\-DOT
+(with the terminating period omitted).
+.
+These are GNU extensions.
+.
+.
+.PP
+You can control the style used to print numbered headings by defining an
+appropriate alias for the string
+.CW SN\-STYLE .
+.
+By default,
+.CW \[rs]*[SN\-STYLE]
+is aliased to
+.CW \[rs]*[SN\-DOT] .
+.
+If you prefer to omit the terminating period from numbers appearing in
+numbered headings,
+you may define the alias as follows.
+.
+.
+.TS
+box center;
+lf(CR).
+\&.als SN\-STYLE SN\-NO\-DOT
+.TE
+.
+.
+.LP
+Any such change in numbering style becomes effective from the next use
+of
+.CW .NH
+following redefinition of the alias for
+.CW \[rs]*[SN\-STYLE] .
+.
+The formatted number of the current heading is available in
+.CW \[rs]*[SN]
+(a feature first documented by Berkeley),
+which facilitates its inclusion in,
+for example,
+table captions,
+equation labels,
+and
+.CW .XS /\c
+.CW .XA /\c
+.CW .XE
+table of contents entries.
+.
+.
+.TS
+box;
+cb cb
+lf(CR) lx .
+Macro Description
+_
+\&.SH [\f[I]depth\f[]] T{
+Set an unnumbered heading.
+.
+The optional
+.I depth
+argument is a GNU extension indicating the heading depth corresponding
+to the
+.I depth
+argument of
+.CW .NH .
+.
+It matches the type size at which the heading is set to that of a
+numbered heading at the same depth when the
+.CW \[rs]n[GROWPS]
+and
+.CW \[rs]n[PSINCR]
+heading size adjustment mechanism is in effect.
+T}
+.TE
+.
+.
+.PP
+The
+.CW PSINCR
+register defines an increment in type size to be applied to a heading at
+a lesser depth than that specified in
+.CW \[rs]n[GROWPS] .
+.
+The value of
+.CW \[rs]n[PSINCR]
+should be specified in points with the
+.CW p
+scaling unit and may include a fractional component;
+for example,
+.
+.
+.TS
+box center;
+lf(CR).
+\&.nr PSINCR 1.5p
+.TE
+.
+.
+.LP
+sets a type size increment of 1.5 points.
+.
+.
+.PP
+The
+.CW GROWPS
+register defines the heading depth above which the type size increment
+set by
+.CW \[rs]n[PSINCR]
+becomes effective.
+.
+For each heading depth less than the value of
+.CW \[rs]n[GROWPS] ,
+the type size is increased by
+.CW \[rs]n[PSINCR] .
+.
+Setting
+.CW \[rs]n[GROWPS]
+to a value less than\~2 disables the incremental heading size feature.
+.
+.
+.PP
+In other words,
+if the value of
+.CW GROWPS
+register is greater than the
+.I depth
+argument to a
+.CW .NH
+or
+.CW .SH
+call,
+the type size of a heading produced by these macros increases by
+.CW \[rs]n[PSINCR]
+units over
+.CW \[rs]n[PS]
+multiplied by the difference of
+.CW \[rs]n[GROWPS]
+and
+.I depth .
+.
+.
+For example,
+the sequence
+.
+.TS
+box center;
+lf(CR).
+\&.nr PS 10
+\&.nr GROWPS 3
+\&.nr PSINCR 1.5p
+\&.NH 1
+Carnivora
+\&.NH 2
+Felinae
+\&.NH 3
+Felis catus
+\&.SH 2
+Machairodontinae
+.TE
+.
+.
+.LP
+will cause \[lq]1. Carnivora\[rq] to be printed in 13-point text,
+followed by \[lq]1.1. Felinae\[rq] in 11.5-point text,
+while \[lq]1.1.1. Felis catus\[rq] and all more deeply nested headings
+will remain in the 10-point text specified by the
+.CW PS
+register.
+.
+\[lq]Machairodontinae\[rq] is printed at 11.5 points,
+since it corresponds to heading depth\~2.
+.
+.
+.PP
+The
+.CW \[rs]n[HORPHANS]
+register operates in conjunction with the
+.CW NH
+and
+.CW SH
+macros to inhibit the printing of isolated headings at the bottom of a
+page;
+it specifies the minimum number of lines of the subsequent paragraph
+that must be kept on the same page as the heading.
+.
+If insufficient space remains on the current page to accommodate the
+heading and this number of lines of paragraph text,
+a page break is forced before the heading is printed.
+.
+Any display macro call or
+.I tbl ,
+.I pic ,
+or
+.I eqn
+region
+(see subsequent sections)
+between the heading and the subsequent paragraph suppresses this
+grouping.
+.
+.
+.\" The next table is huge and we need a lot of room for it, but we
+.\" can't use a keep because it's a boxed repeated-heading table. Flush
+.\" the pending output line and demand half a page.
+.br
+.ne (\n[.p]u / 2u)
+.NH 2
+Typeface and decoration
+.XS
+ Typeface and decoration
+.XE
+.
+.
+.LP
+The
+.I ms
+macros provide a variety of ways to style text.
+.
+Attend closely to the ordering of arguments labeled
+.I pre
+and
+.I post,
+which is not intuitive.
+.
+Support for
+.I pre
+arguments is a GNU extension.\**
+.FS
+This idiosyncrasy arose through feature accretion;
+for example,
+the
+.CW B
+macro in Version\~6 Unix
+.I ms
+(1975) accepted only one argument,
+the text to be set in boldface.
+.
+By Version\~7 (1979) it recognized a second argument;
+in 1990,
+.I "groff ms"
+added a \*[Q]pre\*[U] argument,
+placing it third to avoid breaking support for older documents.
+.FE
+.
+.
+.TS H
+box;
+lb lb
+lf(CR) lx.
+Macro Description
+_
+.TH
+\&.B \f[R][\f[I]text\f[] [\f[I]post\f[] [\f[I]pre\f[]]]] T{
+Style
+.I text
+in
+.B bold ,
+followed by
+.I post
+in the previous font style without intervening space,
+and preceded by
+.I pre
+similarly.
+.
+Without arguments,
+.I ms
+styles subsequent text in bold
+until the next
+paragraphing,
+heading,
+or no-argument typeface macro call.
+T}
+_
+\&.R \f[R][\f[I]text\f[] [\f[I]post\f[] [\f[I]pre\f[]]]] T{
+As
+.CW .B ,
+but use the roman style
+(upright text of normal weight)
+instead of bold.
+.
+Argument recognition is a GNU extension.
+T}
+_
+\&.I \f[R][\f[I]text\f[] [\f[I]post\f[] [\f[I]pre\f[]]]] T{
+As
+.CW .B ,
+but use an
+.I italic
+or oblique style instead of bold.
+T}
+_
+\&.BI \f[R][\f[I]text\f[] [\f[I]post\f[] [\f[I]pre\f[]]]] T{
+As
+.CW .B ,
+but use a
+.BI "bold italic"
+or bold oblique style instead of upright bold.
+.
+This is a Tenth Edition Research Unix extension.
+.\" possibly 9th, but definitely not Berkeley
+T}
+_
+\&.CW \f[R][\f[I]text\f[] [\f[I]post\f[] [\f[I]pre\f[]]]] T{
+As
+.CW .B ,
+but use a
+.CW constant-width
+(monospaced) roman typeface instead of bold.
+.
+This is a Tenth Edition Research Unix extension.
+.\" possibly 9th, but definitely not Berkeley
+T}
+_
+\&.BX \f[R][\f[I]text\f[]] T{
+Typeset
+.I text
+and draw a
+.BX box
+around it.
+.
+On terminal devices,
+reverse video is used instead
+(see the implementation note below).
+.
+If you want
+.I text
+to contain space,
+use unbreakable space or horizontal motion escape sequences
+.CW \[rs]\[ti] , (
+.CW \[rs]\c
+.I space ,
+.CW \[rs]\[ha] ,
+.CW \[rs]| ,
+.CW \[rs]0 ,
+or
+.CW \[rs]h ).
+T}
+_
+\&.UL \f[R][\f[I]text\f[] [\f[I]post\f[]]] T{
+Typeset
+.I text
+with an
+.UL underline .
+.
+.I post,
+if present,
+is set after
+.I text
+with no intervening space.
+T}
+_
+\&.LG T{
+Set subsequent text in
+.LG
+larger type
+.NL
+(2\~points larger than the current size)
+until the next
+type size,
+paragraphing,
+or heading macro call.
+.
+You can
+.LG
+specify this macro
+.LG
+multiple times
+.NL
+to enlarge the type size as needed.
+T}
+_
+\&.SM T{
+Set subsequent text in
+.SM
+smaller type
+.NL
+(2\~points smaller than the current size)
+until the next
+type size,
+paragraphing,
+or heading macro call.
+.
+You can
+.SM
+specify this macro
+.SM
+multiple times
+.NL
+to reduce the type size as needed.
+T}
+_
+\&.NL T{
+Set subsequent text at the normal type size
+.CW \[rs]n[PS] ). (
+T}
+.TE
+.
+.
+.PP
+.I pre
+and
+.I post
+arguments
+are typically used to simplify the attachment of punctuation to styled
+words.
+When
+.I pre
+is used,
+a hyphenation control escape sequence
+.CW \[rs]%
+that would ordinarily start
+.I text
+must start
+.I pre
+instead to have the desired effect.
+.
+.TS
+box center;
+Cb Cb
+Lf(CR) L.
+Input Result
+T{
+.na
+.nh
+The CS course\[aq]s students found one C language keyword
+.br
+\&.CW static ) \[rs]%(
+.br
+most troublesome.
+T} T{
+The CS course's students found one C language keyword
+.CW static ) \%(
+most troublesome.
+T}
+.TE
+.
+.KS
+You can use the output line continuation escape sequence
+.CW \[rs]c
+to achieve the same result.
+.
+It is also portable to some older
+.I ms
+implementations. \" DWB 3.3 ms: no; Heirloom Doctools ms: yes
+.
+.TS
+box center;
+Cb Cb
+Lf(CR) L.
+Input Result
+T{
+.na
+.nh
+The CS course\[aq]s students found one C language keyword
+.br
+\[rs]%(\[rs]c
+.br
+\&.CW static )
+.br
+most troublesome.
+T} T{
+The CS course's students found one C language keyword
+\%(\c
+.CW static )
+most troublesome.
+T}
+.TE
+.KE
+.
+.
+.PP
+Rather than calling the
+.CW CW
+macro,
+in
+.I "groff ms"
+you might prefer to change the font family to Courier by setting
+.CW \[rs]*[FAM]
+to
+.CW C \[rq]. \[lq]
+.
+You can then use all four style macros above,
+returning to the default family (Times) with
+.CW ".ds FAM T" \[rq]. \[lq]
+.
+Because changes to
+.CW \[rs]*[FAM]
+take effect only at the next paragraph,
+this document uses
+.CW .CW
+to \[lq]inline\[rq] a change to the font family,
+marking syntactical elements of
+.I ms
+and
+.I groff .
+.
+.
+.KS
+.PP
+.I "groff ms"
+also offers strings to begin and end super- and subscripting.
+.
+These are GNU extensions.
+.
+.
+.TS
+box;
+lb lb
+lf(CR) lx.
+String Description
+_
+\[rs]*{ Begin superscripting.
+\[rs]*} End superscripting.
+_
+\[rs]*< Begin subscripting.
+\[rs]*> End subscripting.
+.TE
+.KE
+.
+.
+.nr PS -2
+.nr VS -2
+.LP
+.B1
+.hy 0
+.I "Implementation note:"
+In
+.CW nroff
+mode,
+the
+.CW BX
+macro \[lq]boxes\[rq] its argument by bracketing it with
+.I groff
+extension escape sequences to set the foreground color to black and the
+background to white and then reset them to their previous values;
+the terminal output driver,
+.I grotty (1),
+converts these to ISO\~6429 color escape sequences,
+which may be ignored or mishandled by some terminals,
+or may be disabled by
+.I grotty 's
+.CW \-c
+option.
+.
+Further,
+if the terminal is set up to use these colors in those roles already,
+.CW .BX
+will cause no visible effect in the output.
+.
+Surmounting these challenges would require adding features to
+.I grotty ,
+for instance to provide a mechanism to request ISO\~6429's
+\[lq]standout\[rq] mode \" That's "smso" and "rmso" in terminfo.
+(often supported on monochrome terminals),
+or to replace the presumed support of the terminal for ISO\~6429 escape
+sequences with the use of a library that can query the capabilities of
+the terminal and adapt the output sent to the device accordingly.
+.
+(Practically,
+this likely means adding a dependency on
+.CW libtinfo .)
+.
+Contact the
+.I groff
+development mailing list if you'd like to contribute.
+.sp \n[PD]/2
+.B2
+.nr PS +2
+.nr VS +2
+.
+.
+.NH 2
+Lists
+.XS
+ Lists
+.XE
+.
+.
+.LP
+The
+.I marker
+argument to the
+.CW IP
+macro can be employed to present a variety of lists;
+for instance,
+you can use a bullet glyph
+.CW \[rs][bu] ) (
+for unordered lists,
+a number
+(or auto-incrementing register)
+for numbered lists,
+or a word or phrase for glossary-style or definition lists.
+.
+If you set the paragraph indentation register
+.CW PI
+before calling
+.CW IP ,
+you can later reorder the items in the list without having to ensure
+that a
+.I width
+argument remains affixed to the first call.
+.
+.
+.TS H
+box center;
+cb cb
+lf(CR) l .
+Input Result
+_
+.TH
+T{
+.nf
+\&.nr PI 2n
+A bulleted list:
+\&.IP \[rs][bu]
+lawyers
+\&.IP \[rs][bu]
+guns
+\&.IP \[rs][bu]
+money
+.fi
+T} T{
+.nr PI 2n
+A bulleted list:
+.IP \[bu]
+lawyers
+.IP \[bu]
+guns
+.IP \[bu]
+money
+T}
+_
+T{
+.nf
+\&.nr step 0 1
+\&.nr PI 3n
+A numbered list:
+\&.IP \[rs]n+[step].
+lawyers
+\&.IP \[rs]n+[step].
+guns
+\&.IP \[rs]n+[step].
+money
+.fi
+T} T{
+.nr step 0 1
+.nr PI 3n
+A numbered list:
+.IP \n+[step].
+lawyers
+.IP \n+[step].
+guns
+.IP \n+[step].
+money
+T}
+_
+T{
+.nf
+A glossary-style list:
+\&.IP lawyers 0.4i
+Two or more attorneys.
+\&.IP guns
+Firearms,
+preferably large-caliber.
+\&.IP money
+Gotta pay for those
+lawyers and guns!
+.fi
+T} T{
+A glossary-style list:
+.
+.IP lawyers 0.4i
+Two or more attorneys.
+.IP guns
+Firearms,
+preferably large-caliber.
+.IP money
+Gotta pay for those lawyers and guns!
+T}
+.TE
+.
+.
+.PP
+In the enumerated list example,
+we employed the
+.CW nr
+request to create a register of our own,
+.CW step .
+.
+We initialized it to zero and assigned it an auto-increment of 1.
+.
+Each time we use the escape sequence
+.CW \[rs]n+[PI]
+(note the plus sign),
+the formatter applies the increment just before interpolating the
+register's value.
+.
+Preparing the
+.CW PI
+register as well enables us to rearrange the list without the tedium of
+updating macro calls.
+.
+.
+.PP
+In the glossary example,
+observe how the
+.CW IP
+macro places the definition on the same line as the term if it has
+enough space.
+.
+If this is not what you want,
+there are a few workarounds we will illustrate by modifying the example.
+.
+First,
+you can use a
+.CW br
+request to force a break after printing the term or label.
+.
+Second,
+you could apply the
+.CW \[rs]p
+escape sequence to force a break.
+.
+The space following the escape sequence is important;
+if you omit it,
+.I groff
+prints the first word of the paragraph text on the same line as the term
+or label
+(if it fits)
+.I then
+breaks the line.
+.
+Finally,
+you may append a horizontal motion to the marker with the
+.CW \[rs]h
+escape sequence;
+using the same amount as the indentation will ensure that the marker is
+too wide for
+.I groff
+to treat it as \[lq]fitting\[rq] on the same line as the paragraph text.
+.
+.
+.TS
+box center;
+cb | cb | cb
+lf(CR) | lf(CR) | lf(CR).
+Approach #1 Approach #2 Approach #3
+_
+T{
+.nf
+\&.IP guns
+\&.br
+Firearms,
+.fi
+T} T{
+.nf
+\&.IP guns
+\[rs]p Firearms,
+.fi
+T} T{
+.nf
+\&.IP guns\[rs]h\[aq]0.4i\[aq]
+Firearms,
+.fi
+T}
+_
+.T&
+cb s s
+l s s.
+Result
+_
+T{
+A glossary-style list:
+.
+.IP lawyers 0.4i
+Two or more attorneys.
+.IP guns\h\[aq]0.4i\[aq] 0.4i
+Firearms,
+preferably large-caliber.
+.IP money
+Gotta pay for those lawyers and guns!
+T}
+.TE
+.
+.
+.NH 2
+Indented regions
+.XS
+ Indented regions
+.XE
+.
+.
+.LP
+You may need to indent a region of text while otherwise formatting it
+normally.
+.
+Indented regions can be nested;
+you can change
+.CW \[rs]n[PI]
+before each call to vary the amount of inset.
+.
+.
+.TS
+box;
+cb cb
+lf(CR) lx .
+Macro Description
+_
+\&.RS T{
+Begin a region where headings,
+paragraphs,
+and displays are indented (further) by
+.CW \[rs]n[PI] .
+T}
+\&.RE T{
+End the (next) most recent indented region.
+T}
+.TE
+.
+.
+.PP
+This feature enables you to easily line up text under hanging and
+indented paragraphs.
+.
+For example,
+you may wish to structure lists hierarchically.
+.
+.
+.KS
+.TS
+box center;
+cb cb
+lf(CR)8 l .
+Input Result
+_
+T{
+.nf
+.CW
+\&.IP \[rs][bu] 2
+Lawyers:
+\&.RS
+\&.IP \[rs][bu]
+Dewey,
+\&.IP \[rs][bu]
+Cheatham,
+and
+\&.IP \[rs][bu]
+Howe.
+\&.RE
+\&.IP \[rs][bu]
+Guns
+.R
+\&.\|.\|.
+.fi
+T} T{
+.IP \[bu] 2
+Lawyers:
+.RS
+.IP \[bu]
+Dewey,
+.IP \[bu]
+Cheatham,
+and
+.IP \[bu]
+Howe.
+.RE
+.IP \[bu]
+Guns
+\&.\|.\|.
+T}
+.TE
+.KE
+.
+.
+.NH 2
+Keeps, boxed keeps, and displays
+.XS
+ Keeps, boxed keeps, and displays
+.XE
+.
+.
+.LP
+On occasion,
+you may want to
+.I keep
+several lines of text,
+or a region of a document,
+together on a single page,
+preventing an automatic page break within certain boundaries.
+.
+This can cause a page break to occur earlier than it normally would.
+.
+For example,
+you may want to keep two paragraphs together,
+or a paragraph that refers to a table,
+list,
+or figure adjacent to the item it discusses.
+.
+.I ms
+provides the
+.CW KS
+and
+.CW KE
+macros for this purpose.
+.
+.
+.PP
+You can alternatively specify a
+.I "floating keep:"
+if a keep cannot fit on the current page,
+.I ms
+holds its contents and allows material following the keep
+(in the source document)
+to fill the remainder of the current page.
+.
+When the page breaks,
+whether by reaching the end or
+.CW bp
+request,
+.I ms
+puts the floating keep at the beginning of the next page.
+.
+This is useful for placing large graphics or tables that do not need to
+appear exactly where they occur in the source document.
+.
+.
+.TS
+box;
+cb cb
+lf(CR) lx .
+Macro Description
+_
+\&.KS Begin a keep.
+\&.KF Begin a floating keep.
+_
+\&.KE End (floating) keep.
+.TE
+.
+.
+.PP
+As an alternative to the keep mechanism,
+the
+.CW ne
+request forces a page break if there is not at least the amount of
+vertical space specified in its argument remaining on the page.
+.
+One application of
+.CW ne
+is to reserve space on the page for a figure or illustration to be
+included later.
+.
+.
+.KS
+.PP
+A
+.I "boxed keep"
+has a frame drawn around it.
+.
+.
+.TS
+box;
+cb cb
+lf(CR) lx .
+Macro Description
+_
+\&.B1 Begin a keep with a box drawn around it.
+\&.B2 End boxed keep.
+.TE
+.KE
+.
+.
+.KS
+.LP
+Boxed keep macros cause breaks;
+if you need to box a word or phrase within a line,
+see the
+.CW BX
+macro in section \[lq]Typeface and decoration\[rq] above.
+.
+Box lines are drawn as close as possible to the text they enclose so
+that they are usable within paragraphs.
+.
+If you wish to place one or more paragraphs in a boxed keep,
+you may improve their appearance by calling
+.CW .B1
+after the first paragraphing macro,
+and by adding a small amount of vertical space before calling
+.CW .B2 .
+.
+.
+.TS
+box center;
+lf(CR).
+\&.LP
+\&.B1
+\&.I Warning:
+Happy Fun Ball may suddenly accelerate to dangerous speeds.
+\&.sp \[rs]n[PD]/2 \[rs]" space by half the inter-paragraph distance
+\&.B2
+.TE
+.KE
+.
+.
+.LP
+If you want a boxed keep to float,
+you will need to enclose the
+.CW .B1
+and
+.CW .B2
+calls within a pair of
+.CW .KF
+and
+.CW .KE
+calls.
+.
+.
+.PP
+.I Displays
+turn off filling;
+lines of verse or program code are shown with their lines broken as in
+the source document without requiring
+.CW br
+requests between lines.
+.
+Displays can be kept on a single page or allowed to break across pages.
+.
+The
+.CW DS
+macro begins a kept display of the layout specified in its first
+argument;
+non-kept displays are begun with dedicated macros corresponding to their
+layout.
+.
+.
+.TS
+box;
+cb s | cb
+cb cb | ^
+lf(CR) lf(CR) | lx .
+Display macro Description
+With keep Without keep
+_
+\&.DS L \&.LD Begin left-aligned display.
+\&.DS \f[R][\f[]I\f[R] [\,\f[I]indent\/\f[]]] \
+\&.ID \f[R][\,\f[I]indent\/\f[]] T{
+Begin display indented by
+.I indent
+if given,
+.CW \[rs]n[DI]
+otherwise.
+T}
+\&.DS B \&.BD T{
+Begin block display
+(left-aligned with longest line centered).
+T}
+\&.DS C \&.CD Begin centered display.
+\&.DS R \&.RD T{
+Begin right-aligned display.
+This is a GNU extension.
+T}
+_
+.T&
+cf(CR) s | lx .
+\&.DE End any display.
+.TE
+.
+.
+.PP
+The distance stored in
+.CW \[rs]n[DD]
+is inserted before and after each pair of display macros;
+this is a Berkeley extension.
+.
+In
+.I "groff ms" ,
+this distance replaces any adjacent inter-paragraph distance
+or subsequent spacing prior to a section heading.
+.
+The
+.CW DI
+register is a GNU extension;
+its value is an indentation applied to displays created with
+.CW .DS
+and
+.CW .ID
+without arguments,
+to
+.CW .DS\~I \[rq] \[lq]
+without an indentation argument,
+and to equations set with
+.CW .EQ\~I \[rq]. \[lq]
+.
+Changes to either register take effect at the next display boundary.
+.
+.
+.KS
+.NH 2
+Tables, figures, equations, and references
+.XS
+ Tables, figures, equations, and references
+.XE
+.LP
+The
+.I ms
+package is often used with the
+.I tbl ,
+.I pic ,
+.I eqn ,
+and
+.I refer
+preprocessors.
+.
+The
+.CW \[rs]n[DD]
+distance is also applied to regions of the document preprocessed with
+.I tbl ,
+.I pic ,
+and
+.I eqn .
+.
+Mark text meant for preprocessors by enclosing it in pairs of tokens as
+follows,
+with nothing between the dot and the macro name.
+.
+The preprocessors match these tokens only at the start of an input line.
+.
+.
+.TS
+box;
+cb cb
+lf(CR) lx .
+Tag pair Description
+_
+T{
+\&.TS
+.R
+.CW H ] [
+.CW
+.br
+\&.TE
+T} T{
+Demarcate a table to be processed by the
+.I tbl
+preprocessor.
+.
+The optional
+.CW H
+argument to
+.CW .TS
+instructs
+.I ms
+to repeat table rows
+(often column headings)
+at the top of each new page the table spans,
+if applicable;
+calling the
+.CW TH
+macro marks the end of such rows.
+.
+The GNU
+.I tbl (1)
+man page provides a comprehensive reference to the preprocessor and
+offers examples of its use.
+T}
+_
+T{
+\&.PS
+.br
+\&.PE
+.br
+\&.PF
+T} T{
+.CW .PS
+begins a picture to be processed by the
+.I pic
+preprocessor;
+either of
+.CW .PE
+or
+.CW .PF
+ends it,
+the latter with \[lq]flyback\[rq] to the vertical position at its top.
+.
+You can create
+.I pic
+input manually or with a program such as
+.I xfig (1).
+T}
+_
+T{
+\&.EQ
+.R
+.I align \~[\c [
+.I label ]]
+.CW
+.br
+\&.EN
+T} T{
+Demarcate an equation to be processed by the
+.I eqn
+preprocessor.
+.
+The equation is centered by default;
+.I align
+can be
+.CW C ,
+.CW L ,
+or
+.CW I
+to (explicitly) center,
+left-align,
+or indent it by
+.CW \[rs]n[DI] ,
+respectively.
+.
+If specified,
+.I label
+is set right-aligned.
+T}
+_
+T{
+\&.[
+.br
+\&.]
+T} T{
+Demarcate a bibliographic citation to be processed by the
+.I refer
+preprocessor.
+.
+The GNU
+.I refer (1)
+man page provides a comprehensive reference to the preprocessor and the
+format of its bibliographic database.
+T}
+.TE
+.KE
+.
+.
+.PP
+When
+.I refer
+emits collected references
+(as might be done on a \[lq]Works Cited\[rq] page),
+it interpolates the string
+.CW \[rs]*[REFERENCES]
+as an unnumbered heading
+.CW .SH ). (
+.
+.
+.KS
+.PP
+The following is an example of how to set up a table that may print
+across two or more pages.
+.
+.
+.TS
+box center;
+l .
+T{
+.nf
+.CW
+\&.TS H
+allbox;
+Cb | Cb .
+Part\[->]Description
+_
+\&.TH
+\&.T&
+L | Lx .
+GH-1978\[->]Fribulating gonkulator
+.R
+\&.\|.\|.\|the rest of the table follows\|.\|.\|.
+.CW
+\&.TE
+.R
+.fi
+T}
+.TE
+.
+.
+Attempting to place a multi-page table inside a keep can lead to
+unpleasant results,
+particularly if the
+.I tbl
+.CW allbox
+option is used.
+.KE
+.
+.
+.PP
+Mathematics can be typeset using the language of the
+.I eqn
+preprocessor.
+.
+.
+.TS
+box center;
+Lf(CR).
+\&.EQ C (\[rs]*[SN\-NO\-DOT]a)
+p \[ti] = \[ti] q sqrt { 1 + \[ti] ( x / q sup 2 ) }
+\&.EN
+.TE
+.
+.
+This input formats a labelled equation.
+.
+We used the
+.CW SN\-NO\-DOT
+string to base the equation label on the current heading number,
+giving us more flexibility to reorganize the document.
+.
+.
+.EQ C (\*[SN-NO-DOT]a)
+p ~ = ~ q sqrt { 1 + ~ ( x / q sup 2 ) }
+.EN
+.
+Use
+.I groff
+options
+to run preprocessors on the input:
+.CW \-e
+for
+.I eqn ,
+.CW \-p
+for
+.I pic ,
+.CW \-R
+for
+.I refer ,
+and
+.CW \-t
+for
+.I tbl.
+.
+.
+.KS
+.NH 2
+Footnotes
+.XS
+ Footnotes
+.XE
+.
+.
+.LP
+.\" The following sentence is used below as an example as well. Keep it
+.\" in sync.
+A footnote is typically anchored to a place in the text with a
+.I marker,
+which is a small integer,\**
+.FS
+like this numeric footnote
+.FE
+a symbol,\*{\[dg]\*}
+.FS \[dg]
+like this symbolic footnote
+.FE
+or arbitrary user-specified text.
+.
+.
+.TS
+box;
+lb lb
+lf(CR) lx.
+String Description
+_
+\[rs]** T{
+Place an
+.I "automatic number,"
+an automatically updated numeric footnote marker,
+in the text.
+.
+Each time this string is interpolated,
+the number it produces increments by one.
+.
+Automatic numbers start at 1.
+.
+This is a Berkeley extension.
+T}
+.TE
+.KE
+.
+.
+.PP
+Enclose the footnote text in
+.CW FS
+and
+.CW FE
+macro calls to set it at the nearest available \[lq]foot\[rq],
+or bottom,
+of a text column or page.
+.
+.
+.TS
+box;
+cb cb
+lfCR lx .
+Macro Description
+_
+\&.FS \f[R][\f[I]marker\f[]] T{
+Begin a footnote.
+.
+The
+.CW FS\-MARK
+hook
+(see below)
+is called with any supplied
+.I marker
+argument,
+which is then also placed at the beginning of the footnote text.
+.
+If
+.I marker
+is omitted,
+the next pending automatic number enqueued by interpolation of the
+.CW *
+string is used,
+and if none exists,
+nothing is prefixed.
+.
+T}
+_
+\&.FE End footnote text.
+.TE
+.
+.
+.PP
+You may not desire automatically numbered footnotes in spite of their
+convenience.
+.
+You can indicate a footnote with a symbol or other text by specifying
+its marker at the appropriate place
+(for example,
+by using
+.CW \[rs][dg]
+for the dagger glyph)
+.I and
+as an argument to the
+.CW FS
+macro.
+.
+Such manual marks should be repeated as arguments to
+.CW .FS
+or as part of the footnote text to disambiguate their correspondence.
+.
+You may wish to use
+.CW \[rs]*{
+and
+.CW \[rs]*}
+to superscript the marker at the anchor point,
+in the footnote text,
+or both.
+.
+.
+.PP
+.I "groff ms"
+provides a hook macro,
+.CW FS\-MARK ,
+for user-determined operations to be performed when the
+.CW FS
+macro is called.
+.
+It is passed the same arguments as
+.CW FS
+itself.
+.
+An application of
+.CW FS\-MARK
+is anchor placement for a hyperlink reference,
+so that a footnote can link back to its referential context.\**
+.
+.FS
+\[lq]Portable Document Format Publishing with GNU Troff\[rq],
+.I pdfmark.ms
+in the
+.I groff
+distribution,
+uses this technique.
+.FE
+.
+By default,
+this macro has an empty definition.
+.
+.CW FS\-MARK
+is a GNU extension.
+.
+.
+.PP
+The following input was used to produce the first sentence in this
+section.
+.
+.
+.TS
+box center;
+lfCR.
+A footnote is anchored to a place in the text with a
+\&.I marker,
+which is a small integer,\[rs]**
+\&.FS
+like this numeric footnote
+\&.FE
+a symbol,\[rs]*{\[rs][dg]\[rs]*}
+\&.FS \[rs][dg]
+like this symbolic footnote
+\&.FE
+or arbitrary user-specified text.
+.TE
+.
+.
+.PP
+Footnotes can be safely used within keeps and displays,
+but you should avoid using automatically numbered footnotes within
+floating keeps.
+.
+You can place a second
+.CW \[rs]**
+interpolation between a
+.CW \[rs]**
+and its corresponding
+.CW .FS
+call as long as each
+.CW .FS
+call occurs
+.I after
+the corresponding
+.CW \[rs]**
+and occurrences of
+.CW .FS
+are in the same order as corresponding occurrences of
+.CW \[rs]** .
+.
+.
+.PP
+Footnote text is formatted as paragraphs are,
+using analogous parameters.
+.
+The registers
+.CW FI ,
+.CW FPD ,
+.CW FPS ,
+and
+.CW FVS
+correspond to
+.CW PI ,
+.CW PD ,
+.CW PS ,
+and
+.CW VS ,
+respectively;
+.CW FPD ,
+.CW FPS ,
+and
+.CW FVS
+are GNU extensions.
+.
+.
+.KS
+.PP
+The
+.CW FF
+register controls the formatting of automatically numbered footnote
+paragraphs,
+and those for which
+.CW .FS
+is given a
+.I marker
+argument,
+at the bottom of a column or page as follows.
+.
+.
+.TS
+box;
+cb cb
+lf(CR) lx .
+\f[CB]FF\f[] value Description
+_
+0 T{
+Set an automatic number as a superscript
+(on typesetter devices)
+or surrounded by square brackets
+(on terminals).
+.
+The footnote paragraph is indented as with
+.CW .PP
+if there is an
+.CW .FS
+argument or an automatic number,
+and as with
+.CW .LP
+otherwise.
+.
+This is the default.
+T}
+1 T{
+As
+.CW 0 ,
+but set the marker as regular text,
+and follow an automatic number with a period.
+T}
+2 T{
+As
+.CW 1 ,
+but without indentation
+(like
+.CW .LP ).
+T}
+3 T{
+As
+.CW 1 ,
+but set the footnote paragraph with the marker hanging
+(like
+.CW .IP ).
+T}
+.TE
+.KE
+.
+.
+.PP
+The default footnote line length is 11/12ths of the normal line length
+for compatibility with the expectations of historical
+.I ms
+documents;
+you may wish to set
+.CW \[rs]*[FR]
+to
+.CW 1
+to align with contemporary typesetting practices.
+.
+In the past,\**
+.FS
+Unix
+Version\~7
+.I ms ,
+its descendants,
+and
+.I "groff ms"
+prior to version 1.23.0
+.FE
+an
+.CW FL
+register was used for the line length in footnotes;
+however,
+setting this register at document initialization time had no effect on
+the footnote line length in multi-column arrangements.\**
+.
+.FS
+You could reset it after each call to
+.CW .1C ,
+.CW .2C ,
+or
+.CW .MC .
+.FE
+.
+.
+.PP
+.CW \[rs]*[FR]
+should be used in preference to
+.CW \[rs]n[FL]
+in contemporary documents.
+.
+The footnote line length is effectively computed as
+.I column-width "" \[lq]
+.CW "\~*\~\[rs]*[FR]" \[rq].
+.
+If an absolute footnote line length is required,
+recall that arithmetic expressions in the
+.I roff
+language are evaluated strictly from left to right,
+with no operator precedence
+(parentheses are honored).
+.
+.
+.TS
+box center;
+lf(CR).
+\&.ds FR 0+3i \[rs]" Set footnote line length to 3 inches.
+.TE
+.
+.
+.LP \" continuing previous paragraph
+Changes to the footnote length ratio
+.CW \[rs]*[FR]
+take effect with the next footnote written in single-column
+arrangements,
+but on the next page in multiple-column contexts.
+.
+.
+.KS
+.NH 2
+Language and localization
+.XS
+ Language and localization
+.XE
+.
+.
+.LP
+.I "groff ms"
+provides several strings that you can customize for your own purposes,
+or redefine to adapt the macro package to languages other than English.
+.
+It is already localized for
+.\" cs, de, fr, it, sv
+Czech,
+German,
+French,
+Italian,
+and
+Swedish.
+.
+Load the desired localization macro package after
+.I ms ;
+see the
+.I groff_tmac (5)
+man page.
+.
+.
+.TS
+box center;
+lf(CR).
+$ \f[CB]groff \-ms \-mfr bienvenue.ms
+.TE
+.
+.
+.PP
+The following strings are available.
+.
+.TS
+box center;
+cb lb
+lf(CR) lf(CR) .
+String Default
+_
+\[rs]*[REFERENCES] References
+\[rs]*[ABSTRACT] \[rs]f[I]ABSTRACT\[rs]f[]
+\[rs]*[TOC] Table of Contents
+\[rs]*[MONTH1] January
+\[rs]*[MONTH2] February
+\[rs]*[MONTH3] March
+\[rs]*[MONTH4] April
+\[rs]*[MONTH5] May
+\[rs]*[MONTH6] June
+\[rs]*[MONTH7] July
+\[rs]*[MONTH8] August
+\[rs]*[MONTH9] September
+\[rs]*[MONTH10] October
+\[rs]*[MONTH11] November
+\[rs]*[MONTH12] December
+.TE
+.
+.
+.PP
+The default for
+.CW \[rs]*[ABSTRACT]
+includes font selection escape sequences to set the word in italics.
+.KE
+.
+.
+.KS
+.NH 2
+Glyphs for special characters
+.XS
+ Glyphs for special characters
+.XE
+.
+.
+.LP
+Some of the special character escape sequences used in this document
+are listed below.
+.
+The minus sign glyph can also be accessed by the shorthand
+.CW \[rs]\[mi] .
+.
+These and many others are documented in the
+.I groff_char (7)
+man page.
+.
+.
+.TS
+box center;
+Cb Lb Lb
+Lf(CR) L L .
+Input Appearance Description
+_
+\[rs][\-] \[mi] minus sign
+\[rs][\->] \[->] right arrow
+\[rs][aq] \[aq] neutral apostrophe
+\[rs][bu] \[bu] bullet
+\[rs][dq] \[dq] neutral double quote
+\[rs][dg] \[dg] dagger
+\[rs][em] \[em] em dash
+\[rs][ha] \[ha] circumflex accent (caret, hat)
+\[rs][lg] \[lq] left double quotation mark
+\[rs][rq] \[rq] right double quotation mark
+\[rs][rs] \[rs] reverse solidus (backslash)
+\[rs][sd] \[sd] seconds (double prime) mark
+\[rs][ti] \[ti] tilde
+.TE
+.KE
+.
+.\" ------------------------
+.if t \{\
+. br
+. bp
+.\}
+.NH 1
+Page layout
+.XS
+Page layout
+.XE
+.LP
+.I ms 's
+default page layout arranges text
+in a single column
+with the page number
+between hyphens
+centered in a header
+on each page
+except the first,
+and produces no footers.
+.
+You can customize this arrangement.
+.
+.
+.NH 2
+Headers and footers
+.XS
+ Headers and footers
+.XE
+.
+.
+.LP
+There are multiple ways to produce headers and footers.
+.
+One is to define the strings
+.CW LH ,
+.CW CH ,
+and
+.CW RH
+to set the left,
+center,
+and right headers,
+respectively;
+and
+.CW LF ,
+.CW CF ,
+and
+.CW RF
+to set the left,
+center,
+and right footers.
+.
+This approach suffices for documents that do not distinguish odd- and
+even-numbered pages.
+.
+.
+.PP
+Another method is to call macros that set headers or footers for odd- or
+even-numbered pages.
+.
+Each such macro takes a delimited argument separating the left,
+center,
+and right header or footer texts from each other.
+.
+You can replace the neutral apostrophes (\[aq]) shown below with any
+character not appearing in the header or footer text.
+.
+These macros are Berkeley extensions.
+.
+.
+.TS
+box;
+lb lb
+lf(CR) lx.
+Macro Description
+_
+\&.OH \[aq]\f[I]left\f[]\[aq]\f[I]center\f[]\[aq]\f[I]right\f[]\[aq]\
+ T{
+Set the left, center, and right headers on odd-numbered (recto) pages.
+T}
+\&.OF \[aq]\f[I]left\f[]\[aq]\f[I]center\f[]\[aq]\f[I]right\f[]\[aq]\
+ T{
+Set the left, center, and right footers on odd-numbered (recto) pages.
+T}
+\&.EH \[aq]\f[I]left\f[]\[aq]\f[I]center\f[]\[aq]\f[I]right\f[]\[aq]\
+ T{
+Set the left, center, and right headers on even-numbered (verso) pages.
+T}
+\&.EF \[aq]\f[I]left\f[]\[aq]\f[I]center\f[]\[aq]\f[I]right\f[]\[aq]\
+ T{
+Set the left, center, and right footers on even-numbered (verso) pages.
+T}
+.TE
+.
+.
+.PP
+With either method,
+a percent sign
+.B %
+in header or footer text is replaced by the current page number.
+.
+By default,
+.I ms
+places no header on a page numbered \[lq]1\[rq]
+(regardless of its number format).
+.
+.
+.TS
+box;
+lb lb
+lf(CR) lx.
+Macro Description
+_
+\&.P1 T{
+Typeset the header even on page\~1.
+.
+To be effective,
+this macro must be called before the header trap is sprung on any page
+numbered \[lq]1\[rq];
+in practice,
+unless your page numbering is unusual,
+this means that you should call it early,
+before
+.CW .TL
+or any heading or paragraphing macro.
+.
+This is a Berkeley extension.
+T}
+.TE
+.
+.
+.PP
+For even greater flexibility,
+.I ms
+is designed to permit the redefinition of the macros that are called
+when the
+.I groff
+traps that ordinarily cause the headers and footers to be output are
+sprung.
+.
+.CW PT
+(\[lq]page trap\[rq])
+is called by
+.I ms
+when the header is to be written,
+and
+.CW BT
+(\[lq]bottom trap\[rq])
+when the footer is to be.
+.
+The
+.I groff
+page location trap that
+.I ms
+sets up to format the header also calls the
+(normally undefined)
+.CW HD
+macro after
+.CW .PT ;
+you can define
+.CW .HD
+if you need additional processing after setting the header
+(for example,
+to draw a line below it).
+.
+.\" Although undocumented in Tuthill's 4.2BSD ms.diffs paper...
+The
+.CW HD
+hook is a Berkeley extension.
+.
+Any such macros you (re)define must implement any desired specialization
+for odd-,
+even-,
+or first numbered pages.
+.
+.
+.KS
+.NH 2
+Tab stops
+.XS
+ Tab stops
+.XE
+.
+.
+.LP
+Use the
+.CW ta
+request to set tab stops as needed.
+.
+.
+.TS
+box;
+lb lb
+lf(CR) lx.
+Macro Description
+_
+\&.TA T{
+Reset the tab stops to the
+.I ms
+default
+(every 5 ens).
+.
+Redefine this macro to create a different set of default tab stops.
+T}
+.TE
+.KE
+.
+.
+.KS
+.NH 2
+Margins
+.XS
+ Margins
+.XE
+.
+.
+.LP
+Control margins using the registers summarized in the \[lq]Margins\[rq]
+portion of the table in section \[lq]Document control settings\[rq]
+above.
+.
+There is no setting for the right margin;
+the combination of page offset
+.CW \[rs]n[PO]
+and line length
+.CW \[rs]n[LL]
+determines it.
+.KE
+.
+.
+.KS
+.NH 2
+Multiple columns
+.XS
+ Multiple columns
+.XE
+.
+.
+.LP
+.I ms
+can set text in as many columns as reasonably fit on the page.
+.
+The following macros force a page break if a multi-column layout is
+active when they are called.
+.
+.CW \[rs]n[MINGW]
+is the default minimum gutter width;
+it is a GNU extension.
+.
+When multiple columns are in use,
+keeps
+and the
+.CW \%HORPHANS
+and
+.CW \%PORPHANS
+registers
+work with respect to column breaks instead of page breaks.
+.
+.
+.TS
+box;
+cb cb
+lf(CR) lx .
+Macro Description
+_
+\&.1C T{
+Arrange page text in a single column (the default).
+T}
+_
+\&.2C T{
+Arrange page text in two columns.
+T}
+_
+\&.MC \f[R][\f[I]column-width\f[] [\f[I]gutter-width\f[]]] T{
+Arrange page text in multiple columns.
+.
+If you specify no arguments,
+it is equivalent to the
+.CW 2C
+macro.
+.
+Otherwise,
+.I column-width
+is the width of each column and
+.I gutter-width
+is the minimum distance between columns.
+T}
+.TE
+.KE
+.
+.
+.\" ------------------------
+.NH 2
+Creating a table of contents
+.XS
+ Creating a table of contents
+.XE
+.LP
+Because
+.I roff
+formatters process their input in a single pass,
+material on page 50,
+for example,
+cannot influence what appears on page\~1\[em]this poses a challenge for
+a table of contents at its traditional location in front matter,
+if you wish to avoid manually maintaining it.
+.
+.I ms
+enables the collection of material to be presented in the table of
+contents as it appears,
+saving its page number along with it,
+and then emitting the collected contents on demand toward the end of the
+document.
+.
+The table of contents can then be resequenced to its desired location
+by physically rearranging the pages of a printed document,
+or as part of post-processing\[em]with a
+.I sed (1)
+script to reorder the pages in
+.I troff 's
+output,
+with
+.I pdfjam (1),
+or with
+.I gropdf (1)'s
+.B .pdfswitchtopage
+feature,
+for example.
+.
+.
+.PP
+Define an entry to appear in the table of contents by bracketing its
+text between calls to the
+.CW XS
+and
+.CW XE
+macros.
+.
+A typical application is to call them immediately after
+.CW NH
+or
+.CW SH
+and repeat the heading text within them.
+.
+The
+.CW XA
+macro,
+used within
+.CW .XS /\c
+.CW .XE
+pairs,
+supplements an entry\[em]for instance,
+when it requires multiple output lines,
+whether because a heading is too long to fit or because style dictates
+that page numbers not be repeated.
+.
+You may wish to indent the text thus wrapped to correspond to its
+heading depth;
+this can be done in the entry text by prefixing it with tabs or
+horizontal motion escape sequences,
+or by providing a second argument to the
+.CW XA
+macro.
+.
+.CW .XS
+and
+.CW .XA
+automatically associate the page number where they are called with the
+text following them,
+but they accept arguments to override this behavior.
+.
+At the end of the document,
+call
+.CW TC
+or
+.CW PX
+to emit the table of contents;
+.CW .TC
+resets the page number
+.B i "" to\~
+(Roman numeral one),
+and then calls
+.CW PX .
+.
+All of these macros are Berkeley extensions.
+.
+.TS
+box;
+cb cb
+lf(CR) lx .
+Macro Description
+_
+\&.XS \f[R][\f[I]page-number\f[]] T{
+Begin,
+supplement,
+and end a table of contents entry.
+.
+Each entry is associated with
+.I page-number
+(otherwise the current page number);
+a
+.I page-number
+of
+.CW no
+prevents a leader and page number from being emitted for that entry.
+.
+Use of
+.CW .XA
+within
+.CW .XS /\c
+.CW .XE
+is optional;
+it can be repeated.
+.
+If
+.I indentation
+is present,
+a supplemental entry is indented by that amount;
+ens are assumed if no unit is indicated.
+.
+Text on input lines between
+.CW .XS
+and
+.CW .XE
+is stored for later recall by
+.CW .PX .
+T}
+\&.XA \f[R][\f[I]page-number\f[] [\f[I]indentation\f[]]] \^
+\&.XE \^
+_
+\&.PX \f[R][\f[]no\f[R]] T{
+Switch to single-column layout.
+.
+Unless
+.CW no
+is specified,
+center and interpolate
+.CW \[rs]*[TOC]
+in bold and two points larger than the body text.
+.
+Emit the table of contents entries.
+T}
+_
+\&.TC \f[R][\f[]no\f[R]] T{
+Set the page number to\~1,
+the page number format to lowercase Roman numerals,
+and call
+.CW PX
+(with a
+.CW no
+argument,
+if present).
+T}
+.TE
+.
+.
+.KS
+.PP
+Here's an example of typical
+.I ms
+table of contents preparation and
+its result.
+.
+We employ horizontal escape sequences
+.CW \[rs]h
+to indent the entries by sectioning depth.
+.
+.TS
+box center;
+L.
+T{
+.nf
+.CW
+\&.NH 1
+Introduction
+\&.XS
+Introduction
+\&.XE
+.R
+\&.\|.\|.
+.CW
+\&.NH 2
+Methodology
+\&.XS
+\[rs]h\[aq]2n\[aq]Methodology
+\&.XA no
+\[rs]h\[aq]4n\[aq]Fassbinder\[aq]s Approach
+\&.XA no
+\[rs]h\[aq]4n\[aq]Kahiu\[aq]s Approach
+\&.XE
+.R
+\&.\|.\|.
+.CW
+\&.NH 1
+Findings
+\&.XS
+Findings
+\&.XE
+.R
+\&.\|.\|.
+.CW
+\&.TC
+.fi
+T}
+.TE
+.KE
+.
+.nr SavedPageNumber \n%
+.nr SavedH1 \n[H1] \" groff ms internal name
+.nr SavedH2 \n[H2] \" groff ms internal name
+.nr % 1
+.rr H1
+.rr H2
+.als SavedTOC toc*div \" groff ms internal name
+.rm toc*div
+.di ThrowAway
+.NH 1
+Introduction
+.XS
+Introduction
+.XE
+.nr % 2
+.NH 2
+Methodology
+.XS
+\h'2n'Methodology
+.XA no
+\h'4n'Fassbinder's Approach
+.XA no
+\h'4n'Kahiu's Approach
+.XE
+.nr % 5
+.NH 1
+Findings
+.XS
+Findings
+.XE
+.br
+.di
+.\" We can't emit the TOC inside a B1/B2 box, so use lines instead.
+.R
+\l'\n[.l]u'
+.PX
+\l'\n[.l]u'
+.als toc*div SavedTOC
+.rm SavedTOC
+.nr % \n[SavedPageNumber]
+.nr H1 \n[SavedH1]
+.nr H2 \n[SavedH2]
+.rr SavedPageNumber
+.rr SavedH1
+.rr SavedH2
+.
+.
+.PP
+The remaining features in this subsection are GNU extensions.
+.
+.I "groff ms"
+obviates the need to repeat heading text after
+.CW XS
+calls.
+.
+Call
+.CW XN
+and
+.CW XH
+after
+.CW NH
+and
+.CW SH ,
+respectively.
+.
+.
+.TS
+box;
+cb cb
+lf(CR) lx .
+Macro Description
+_
+\&.XN \f[I]heading-text T{
+Format
+.I heading-text
+and create a corresponding table of contents entry;
+the indentation is computed from the depth of the preceding
+.CW NH
+call.
+T}
+\&.XH \f[I]depth heading-text T{
+As
+.CW .XN ,
+but use
+.I depth
+to determine the indentation.
+T}
+.TE
+.
+.
+.KS
+.PP
+.I "groff ms"
+encourages customization of table of contents entry production.
+.
+.
+.TS
+box;
+cb cb
+lf(CR) lx .
+Macro Description
+_
+\&.XN\-REPLACEMENT \f[I]heading-text T{
+These hook macros implement
+.CW .XN
+and
+.CW .XH ,
+respectively.
+.
+They call
+.CW \%XN\-INIT
+and
+pass their
+.I heading-text
+arguments to
+.CW .\%XH\-UPDATE\-TOC .
+T}
+\&.XH\-REPLACEMENT \f[I]depth heading-text \^
+\&.XH\-INIT T{
+This hook macro does nothing by default.
+T}
+\&.XH\-UPDATE\-TOC\~ \f[I]depth heading-text T{
+Bracket
+.I heading-text
+with
+.CW XS
+and
+.CW XE
+calls,
+indenting it by 2 ens per level of
+.I depth
+beyond the first.
+T}
+.TE
+.KE
+.
+.
+.LP
+.TS
+box center;
+L.
+T{
+.nf
+.CW
+\&.NH 1
+\&.XN Introduction
+.R
+\&.\|.\|.
+.CW
+\&.NH 2
+\&.XN Methodology
+\&.XH 3 \[dq]Fassbinder\[aq]s Approach\[dq]
+\&.XH 3 \[dq]Kahiu\[aq]s Approach\[dq]
+.R
+\&.\|.\|.
+.CW
+\&.NH 1
+\&.XN Findings
+.R
+\&.\|.\|.
+.CW
+\&.TC
+.fi
+T}
+.TE
+.
+.nr SavedPageNumber \n%
+.nr SavedH1 \n[H1] \" groff ms internal name
+.nr SavedH2 \n[H2] \" groff ms internal name
+.nr % 1
+.rr H1
+.rr H2
+.als SavedTOC toc*div \" groff ms internal name
+.rm toc*div
+.di ThrowAway
+.NH 1
+.XN Introduction
+.nr % 2
+.NH 2
+.XN Methodology
+.XH 3 "Fassbinder's Approach"
+.XH 3 "Kahiu's Approach"
+.nr % 5
+.NH 1
+.XN Findings
+.br
+.di
+.\" We can't emit the TOC inside a B1/B2 box, so use lines instead.
+.R
+\l'\n[.l]u'
+.PX
+\l'\n[.l]u'
+.als toc*div SavedTOC
+.rm SavedTOC
+.nr % \n[SavedPageNumber]
+.nr H1 \n[SavedH1]
+.nr H2 \n[SavedH2]
+.rr SavedPageNumber
+.rr SavedH1
+.rr SavedH2
+.
+.
+.PP
+To get the section number of the numbered headings into the table of
+contents entries,
+we might define
+.CW \%XN\-REPLACEMENT
+as follows.
+.
+(We obtain the heading depth from
+.I "groff ms" 's
+internal register
+.CW nh*hl .)
+.
+.
+.LP
+.TS
+box center;
+L.
+T{
+.nf
+.CW
+\&.de XN\-REPLACEMENT
+\&.XN\-INIT
+\&.XH\-UPDATE\-TOC \[rs]\[rs]n[nh*hl] \[rs]\[rs]$@
+\&\[rs]&\[rs]\[rs]*[SN] \[rs]\[rs]$*
+\&..
+T}
+.TE
+.
+.
+.PP
+You can change the style of the leader that bridges each table of
+contents entry with its page number;
+define the
+.CW TC\-LEADER
+special character by using the
+.CW char
+request.
+.
+A typical leader combines the dot glyph
+.CW .\& \[rq] \[lq]
+with a horizontal motion escape sequence to spread the dots.
+.
+The width of the page number field is stored in the
+.CW TC\-MARGIN
+register.
+.
+.
+.\" ------------------------
+.if t \{\
+. br
+. bp
+.\}
+.NH 1
+Differences from AT&T
+.BI ms
+.XS
+Differences from AT&T
+.I ms
+.XE
+.LP
+The
+.I "groff ms"
+macros are an independent reimplementation,
+using no AT&T code.
+.
+Since they take advantage of the extended features of
+.I groff ,
+they cannot be used with AT&T
+.I troff .
+.
+.I "groff ms"
+supports features described above as Berkeley and Tenth Edition Research
+Unix extensions,
+and adds several of its own.
+.
+.
+.PP
+The internals of
+.I "groff ms"
+differ from those of AT&T
+.I ms .
+.
+Documents that depend upon implementation details of AT&T
+.I ms
+may not format properly with
+.I "groff ms" .
+.
+Such details include macros whose function was not documented in the
+AT&T
+.I ms
+manual [Lesk 1978].
+.\" TODO: Use refer(1).
+.\" XXX: We support RT anyway; maybe we should stop?
+.
+.
+.PP
+The error-handling policy of
+.I "groff ms"
+is to detect and report errors,
+rather than to ignore them silently.
+.
+.
+.PP
+Tenth Edition \" possibly 9th
+Research Unix supported
+.B P1 /
+.B P2
+macros to bracket code examples;
+.I "groff ms"
+does not.
+.
+.
+.PP
+.I "groff ms"
+does not work in GNU
+.I troff 's \" GNU
+AT&T compatibility mode.
+.
+If loaded when that mode is enabled,
+it aborts processing with a diagnostic message.
+.
+.
+.PP
+Multiple line spacing is not supported.
+.
+Use a larger vertical spacing instead.
+.
+.
+.PP
+.I "groff ms"
+uses the same header and footer defaults in both
+.CW nroff
+and
+.CW troff
+modes
+as AT&T
+.I ms
+does in
+.CW troff
+mode;
+AT&T's default in
+.CW nroff
+mode is to put the date,
+in U.S.\& traditional format
+(e.g.,
+\[lq]January 1, 2021\[rq]),
+in the center footer
+(the
+.CW CF
+string).
+.
+.
+.PP
+Many
+.I "groff ms"
+macros,
+including those for paragraphs,
+headings,
+and displays,
+cause a reset of formatting parameters,
+and may change the indentation;
+they do so not by incrementing or decrementing it,
+but by setting it absolutely.
+.
+This can cause problems for documents that define additional macros of
+their own that try to manipulate indentation.
+.
+Use
+.CW .RS
+and
+.CW .RE
+instead of the
+.CW in
+request.
+.
+.
+.PP
+AT&T
+.I ms
+interpreted the values of the registers
+.CW PS
+and
+.CW VS
+in points,
+and did not support the use of scaling units with them.
+.
+.I "groff ms"
+interprets values of the registers
+.CW PS ,
+.CW VS ,
+.CW FPS ,
+and
+.CW FVS
+equal to or larger than\~1,000
+(one thousand)
+as decimal fractions multiplied by\~1,000.\**
+.FS
+Register values are converted to and stored as basic units.
+.
+See \[lq]Measurements\[rq] in the
+.I groff
+Texinfo manual or in
+.I groff (7).
+.FE
+.
+This threshold makes use of a scaling unit with these parameters
+practical for high-resolution devices while preserving backward
+compatibility.
+.
+It also permits expression of non-integral type sizes.
+.
+For example,
+.CW "groff \-rPS=10.5p" \[rq] \[lq]
+at the shell prompt is equivalent to placing
+.CW ".nr PS 10.5p" \[rq] \[lq]
+at the beginning of the document.
+.
+.
+.PP
+AT&T
+.I ms 's
+.CW AU
+macro supported arguments used with some document types;
+.I "groff ms"
+does not.
+.
+.
+.PP
+Right-aligned displays are available.
+.
+The AT&T
+.I ms
+manual observes that \[lq]it is tempting to assume that
+.CW ".DS R"
+will right adjust lines,
+but it doesn't work\[rq].
+.
+In
+.I "groff ms" ,
+it does.
+.
+.
+.PP
+To make
+.I "groff ms"
+use the default page offset
+(which also specifies the left margin),
+the
+.B PO
+register must stay undefined until the first
+.I ms
+macro is called.
+.
+This implies that
+.B \[rs]n[PO]
+should not be used early in the document,
+unless it is changed also:
+accessing an undefined register automatically defines it.
+.
+.
+.PP
+.I "groff ms"
+supports the
+.CW PN
+register,
+but it is not necessary;
+you can access the page number via the usual
+.CW %
+register and invoke the
+.CW af
+request to assign a different format to it if desired.\**
+.FS
+If you redefine the
+.I ms
+.CW PT
+macro \" I wouldn't mention that, but Lesk 1978 encourages doing so. :-/
+and desire special treatment of certain page numbers
+(like
+.CW 1 \[rq]), \[lq]
+you may need to handle a non-Arabic page number format,
+as
+.I "groff ms" 's
+.CW .PT
+does;
+see the macro package source.
+.
+.I "groff ms"
+aliases the
+.CW PN
+register to
+.CW % .
+.FE
+.
+.
+.PP
+The AT&T
+.I ms
+manual documents registers
+.CW CW
+and
+.CW GW
+as setting the default column width and \[lq]intercolumn gap\[rq],
+respectively,
+and which applied when
+.CW .MC
+was called with fewer than two arguments.
+.
+.I "groff ms"
+instead treats
+.CW .MC
+without arguments as synonymous with
+.CW .2C ;
+there is thus no occasion for a default column width register.
+.
+Further,
+the
+.CW MINGW
+register
+and the second argument to
+.CW .MC
+specify a
+.I minimum
+space between columns,
+not the fixed gutter width of AT&T
+.I ms .
+.
+.
+.PP
+The AT&T
+.I ms
+manual did not document the
+.CW QI
+register;
+Berkeley and
+.I "groff ms"
+do.
+.
+.
+.PP
+The register
+.CW GS
+is set to\~1 by the
+.I "groff ms"
+macros,
+but is not used by the AT&T
+.I ms
+package.
+.
+Documents that need to determine whether they are being formatted with
+.I "groff ms"
+or another implementation should test this register.
+.
+.
+.\" XXX: We can't use a keep here because the wrong page number will be
+.\" recorded in the table of contents; see Savannah #63159.
+.\"KS
+.br
+.ne 6v
+.NH 2
+Unix Version\~7
+.BI ms
+macros not implemented by
+.BI "groff ms"
+.XS
+ Unix Version 7
+.I ms
+macros not implemented by
+.I "groff ms"
+.XE
+.LP
+Several macros described in the Unix Version\~7
+.I ms
+documentation are unimplemented by
+.I "groff ms"
+because they are specific to the requirements of documents produced
+internally by Bell Laboratories,
+some of which also require a glyph for the Bell System logo that
+.I groff
+does not support.
+.
+These macros implemented several document type formats
+(\c
+.CW EG , \" engineer's notes
+.CW IM , \" internal memorandum
+.CW MF , \" memorandum for file
+.CW MR , \" memorandum for record
+.CW TM , \" technical memorandum
+.CW TR ), \" technical report
+were meaningful only in conjunction with the use of certain document
+types
+(\c
+.CW AT , \" attachments
+.CW CS , \" cover sheet info for `TM` documents
+.CW CT , \" copies to
+.CW OK , \" "other keywords" for `TM` documents
+.CW SG ), \" signatures for `TM` documents
+stored the postal addresses of Bell Labs sites
+(\c
+.CW HO , \" Holmdel
+.CW IH , \" Naperville
+.CW MH , \" Murray Hill
+.CW PY , \" Piscataway
+.CW WH ), \" Whippany
+or lacked a stable definition over time
+(\c
+.CW UX ). \" Unix; on 1st use, add footnote identifying trademark owner
+.
+To compatibly render historical
+.I ms
+documents using these macros,
+we advise your documents to invoke the
+.CW rm
+request to remove any such macros it uses and then define replacements
+with an authentically typeset original at hand.\**
+.FS
+The removal beforehand is necessary because
+.I "groff ms"
+aliases these macros to a diagnostic macro,
+and you want to redefine the aliased name,
+not its target.
+.FE
+.
+For informal purposes,
+a simple definition of
+.CW UX
+should maintain the readability of the document's substance.
+.
+.
+.TS
+box center;
+lf(CR).
+\&.rm UX
+\&.ds UX Unix\[rs]"
+.TE
+.rs \" XXX: Work around Savannah #64005.
+.\"KE
+.
+.
+.\" ------------------------
+.if t \{\
+. br
+. bp
+.\}
+.NH 1
+Legacy features
+.XS
+Legacy features
+.XE
+.
+.
+.LP
+.I "groff ms"
+retains some legacy features solely to support formatting of historical
+documents;
+contemporary ones should not use them because they can render poorly.
+.
+See
+.I groff_char (7)
+instead.
+.
+.
+.KS
+.NH 2
+AT&T
+.I ms
+accent mark strings
+.XS
+ AT&T
+.I ms
+accent mark strings
+.XE
+.LP
+AT&T
+.I ms
+defined
+accent mark strings as follows.
+.
+.
+.TS
+box center;
+Cb Lb
+Lf(CR) Lx.
+String Description
+_
+\[rs]*[\[aq]] Apply acute accent to subsequent glyph.
+\[rs]*[\[ga]] Apply grave accent to subsequent glyph.
+\[rs]*[:] Apply dieresis (umlaut) to subsequent glyph.
+\[rs]*[\[ha]] Apply circumflex accent to subsequent glyph.
+\[rs]*[\[ti]] Apply tilde accent to subsequent glyph.
+\[rs]*[C] Apply caron to subsequent glyph.
+.\" \*v was an undocumented (in Lesk 1978-11-13) synonym for \*C.
+\[rs]*[,] Apply cedilla to subsequent glyph.
+.TE
+.KE
+.
+.
+.NH 2
+Berkeley
+.I ms
+accent mark and glyph strings
+.XS
+ Berkeley
+.I ms
+accent mark and glyph strings
+.XE
+.LP
+Berkeley
+.I ms
+offered an
+.CW AM
+macro;
+calling it redefined the AT&T accent mark strings
+(except for
+.CW \[rs]*C ),
+applied them to the
+.I preceding
+glyph,
+and defined additional strings,
+some for spacing glyphs.
+.
+.
+.TS
+box;
+cb cb
+lf(CR) lx .
+Macro Description
+_
+\&.AM Enable alternative accent mark and glyph-producing strings.
+.TE
+.
+.
+.TS
+box center;
+Cb Lb
+Lf(CR) Lx.
+String Description
+_
+\[rs]*[\[aq]] Apply acute accent to preceding glyph.
+\[rs]*[\[ga]] Apply grave accent to preceding glyph.
+\[rs]*[:] Apply dieresis (umlaut) to preceding glyph.
+\[rs]*[\[ha]] Apply circumflex accent to preceding glyph.
+\[rs]*[\[ti]] Apply tilde accent to preceding glyph.
+\[rs]*[,] Apply cedilla to preceding glyph.
+\[rs]*[/] Apply stroke (slash) to preceding glyph.
+\[rs]*[v] Apply caron to preceding glyph.
+\[rs]*[_] Apply macron to preceding glyph.
+\[rs]*[.] Apply underdot to preceding glyph.
+\[rs]*[o] Apply ring accent to preceding glyph.
+_
+\[rs]*[?] Interpolate inverted question mark.
+\[rs]*[!] Interpolate inverted exclamation mark.
+\[rs]*[8] Interpolate small letter sharp s.
+\[rs]*[q] Interpolate small letter o with hook accent (ogonek).
+\[rs]*[3] Interpolate small letter yogh.
+\[rs]*[d-] Interpolate small letter eth.
+\[rs]*[D-] Interpolate capital letter eth.
+\[rs]*[th] Interpolate small letter thorn.
+\[rs]*[TH] Interpolate capital letter thorn.
+\[rs]*[ae] Interpolate small ae ligature.
+\[rs]*[AE] Interpolate capital ae ligature.
+\[rs]*[oe] Interpolate small oe ligature.
+\[rs]*[OE] Interpolate capital oe ligature.
+.TE
+.rs \" XXX: Work around Savannah #64005.
+.
+.
+.\" ------------------------
+.if t \{\
+. br
+. bp
+.\}
+.NH 1
+Further reading
+.XS
+Further reading
+.XE
+.
+.
+.XP
+\[lq]Typing Documents on the Unix System:
+Using the \-ms Macros with Troff and Nroff\[rq];
+M.\& E.\& Lesk;
+November 13, 1978.
+.
+This document describes the
+.I ms
+supplied with AT&T Unix Version\~7.
+.
+.
+.XP
+\[lq]A Revised Version of \-ms\[rq];
+Bill Tuthill;
+August 1983.
+.
+The 4.2BSD release featured several extensions to
+.I ms ,
+most of which are recreated in
+.I "groff ms" .
+.
+(The exceptions are the
+.CW TM
+and
+.CW CT
+macros for setting a doctoral thesis in the format required by the
+contemporaneous degree-granting authorities of the University of
+California at Berkeley.)
+.
+.
+.XP
+\[lq]Using PDF boxes with
+.I groff
+and the
+.I ms
+macros\[rq];
+Deri James;
+March 2021.
+.
+.CW BOXSTART
+and
+.CW BOXSTOP
+macros are available via the
+.I sboxes
+extension package,
+enabling colored,
+bordered boxes when the
+.CW pdf
+output device is used.
+.
+This document is distributed with
+.I groff
+as the file
+.I msboxes.pdf .
+.
+.
+.LP
+This manual was composed using
+.I "groff ms" ;
+the curious may consult its source in the file
+.I ms.ms
+to see how its formatting was achieved.
+.\" ------------------------
+.TC
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/doc/pic.ms b/doc/pic.ms
new file mode 100644
index 0000000..51c710f
--- /dev/null
+++ b/doc/pic.ms
@@ -0,0 +1,3287 @@
+.\" Copyright (C) 2006-2020 Free Software Foundation, Inc.
+.\" Written by Eric S. Raymond <esr@thyrsus.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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+.\"
+.\" For tolerably obvious reason, this needs to be processed through PIC.
+.\" It also needs to be processed through TBL and EQN. Use "groff -p -e -t".
+.\" There is no hope that this will ever look right under nroff.
+.\"
+.\" Comments beginning with %% are cut lines so portions of this
+.\" document can be automatically extracted. %%TUTORIAL%% begins the
+.\" tutorial part; %%REFERENCE%% the reference part. %%POSTLUDE%% the
+.\" bibliography and end matter after the reference part.
+.\"
+.\" This document was written for free use and redistribution by
+.\" Eric S. Raymond <esr@thyrsus.com> in August 1995. It has been put
+.\" under the GPL in March 2006.
+.\"
+.
+.
+.\" Set a proper TeX and LaTeX
+.ie t \{\
+. ds tx T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X\"
+. ds lx L\h'-0.36m'\v'-0.22v'\s-2A\s0\h'-0.15m'\v'0.22v'\*(tx\"
+.\}
+.el \{\
+. ds tx TeX\"
+. ds lx LaTeX\"
+.\}
+.
+.\" Centered caption for figure. Assumes previous .KS
+.de CE
+. ce 1
+Figure \\n[H1]-\\$1
+. sp 1
+. KE
+..
+.
+.\" Definitions end here
+.
+.
+.TL
+Making Pictures With GNU PIC
+.AU
+Eric S. Raymond
+.AI
+\[la]\fIesr@snark.thyrsus.com\fP\[ra]
+.AB
+The \fBpic\fP language is a \fBtroff\fP extension that makes it easy
+to create and alter box-and-arrow diagrams of the kind frequently used
+in technical papers and textbooks.
+This paper is both an introduction to and reference for \fIgpic\/\fP(1),
+the implementation distributed by the Free Software Foundation for use
+with \fIgroff\/\fP(1).
+It also catalogs other implementations and explains the differences
+among them.
+.AE
+.\"%%TUTORIAL%%
+.
+.
+.NH 1
+Introduction to PIC
+.
+.NH 2
+Why PIC?
+.PP
+The \fBpic\fP language provides an easy way to write procedural
+box-and-arrow diagrams to be included in \fBtroff\fP documents.
+The language is sufficiently flexible to be quite useful for state
+charts, Petri-net diagrams, flow charts, simple circuit schematics,
+jumper layouts, and other kinds of illustration involving repetitive
+uses of simple geometric forms and splines.
+Because these descriptions are procedural and object-based, they are
+both compact and easy to modify.
+.PP
+The phrase \[lq]GNU pic\[rq] may refer to either of two \fBpic\fP
+implementations distributed by the Free Software Foundation and
+intended to accept the same input language.
+The \fIgpic\/\fP(1) implementation is for use with the \fIgroff\/\fP(1)
+implementation of \fBtroff\fP.
+The \fIpic2plot\/\fP(1) implementation runs standalone and is part of
+the \fBplotutils\fR package.
+Because both implementations are widely available in source form for
+free, they are good bets for writing very portable documentation.
+.
+.NH 2
+PIC Versions
+.PP
+The original 1984 pre-\fIditroff\/\fP(1) version of \fBpic\fP is long
+obsolete.
+The rewritten 1991 version is still available as part of the
+Documenter's Work Bench module of System V.
+.PP
+Where differences between Documenter's Work Bench (1991) \fBpic\fP and GNU
+\fBpic\fP need to be described, original \fBpic\fP is referred to as
+\[lq]DWB pic\[rq].
+Details on the history of the program are given at the end of this
+document.
+.PP
+The \fBpic2plot\fR program does not require the rest of the
+\fIgroff\/\fP(1) toolchain to render graphics.
+It can display \fBpic\fR diagrams in an X\~window, or generate output
+plots in a large number of other formats.
+These formats include: PNG, PBM, PGM, PPM, GIF, SVG, Adobe Illustrator
+format, idraw-editable Postscript, the WebCGM format for Web-based
+vector graphics, the format used by the \fBxfig\fP drawing editor, the
+Hewlett-Packard PCL\~5 printer language, the Hewlett-Packard Graphics
+Language (by default, HP-GL/2), the ReGIS (remote graphics instruction
+set) format developed by DEC, Tektronix format, and device-independent
+GNU graphics metafile format.
+.PP
+In this document, \fIgpic\/\fP(1) and \fIpic2plot\/\fP(1) extensions are
+marked as such.
+.
+.
+.NH 1
+Invoking PIC
+.PP
+Every \fBpic\fP description is a little program describing drawing
+actions.
+The \fB[gtn]roff\fP-dependent versions compile the program by
+\fIpic\/\fP(1) into \fIgtroff\/\fP(1) macros; the \fIpic2plot\/\fP(1)
+implementation uses a plotting library to draw the picture directly.
+Programs that process or display
+\fIgtroff\/\fP(1) output need not know or care that parts of the image
+began life as \fBpic\fP descriptions.
+.PP
+The \fIpic\/\fP(1) program tries to translate anything between \fB.PS\fP
+and \fB.PE\fP markers, and passes through everything else.
+The normal definitions of \fB.PS\fP and \fB.PE\fP in the \fIms\fP macro
+package and elsewhere have also the side-effect of centering the
+\fBpic\fP output on the page.
+.
+.KS
+.NH 2
+PIC Error Messages
+.PP
+If you make a mistake in \fBpic\fP input such that the program cannot
+interpret what you mean,
+\fIgpic\/\fP(1) issues a diagnostic message in the format prescribed by
+the GNU Coding Standards.
+.
+A typical error message looks like
+.
+.
+.ds FAM C
+.DS
+pic:\fIfile\fP:\fInnn\fP: syntax error before \[aq]\fItoken\fP\[aq]
+pic:\fIfile\fP:\fInnn\fP: giving up on this picture
+.DE
+.ds FAM T
+.
+.
+.LP
+where
+.I file
+is the name of the file being processed,
+.I nnn
+is a line number within that file,
+and
+.I token
+is a symbol in the \fBpic\fP language
+(often a keyword)
+near
+(usually just after)
+the error location.
+.KE
+.
+.
+.NH 1
+Basic PIC Concepts
+.PP
+Pictures are described procedurally, as collections of objects
+connected by motions.
+Normally, \fBpic\fP tries to string together objects left-to-right in
+the sequence they are described, joining them at visually natural
+points.
+Here is an example illustrating the flow of data in \fBpic\fP
+processing:
+.KS
+.PS
+ellipse "document";
+arrow;
+box width 0.6 "\fIgpic\/\fP(1)"
+arrow;
+box width 1.1 "\fIgtbl\/\fP(1) or \fIgeqn\/\fP(1)" "(optional)" dashed;
+arrow;
+box width 0.6 "\fIgtroff\/\fP(1)";
+arrow;
+ellipse "PostScript"
+.PE
+.CE "1: Flow of \fBpic\fP data"
+.PP
+This was produced from the following \fBpic\fP program:
+.KS
+.DS
+.ps -1
+.vs -1
+.CW
+\&.PS
+ellipse "document";
+arrow;
+box width 0.6 "\efIgpic\e/\efP(1)"
+arrow;
+box width 1.1 "\efIgtbl\e/\efP(1) or \efIgeqn\e/\efP(1)" "(optional)" dashed;
+arrow;
+box width 0.6 "\efIgtroff\e/\efP(1)";
+arrow;
+ellipse "PostScript"
+\&.PE
+.DE
+.R
+.KE
+.LP
+This little program illustrates several \fBpic\fP basics.
+Firstly, we see how to invoke three object types; ellipses, arrows, and
+boxes.
+We see how to declare text lines to go within an object (and that text
+can have font changes in it).
+We see how to change the line style of an object from solid (the
+default) to dashed.
+And we see that a box can be made wider than its default size to
+accommodate more text (we'll discuss this facility in detail in the next
+section).
+.PP
+We also get to see \fBpic\fP's simple syntax.
+Statements are ended by newlines or semicolons.
+String quotes are required around all text arguments, whether or not
+they contain spaces.
+In general, the order of command arguments and modifiers like \[lq]width
+1.2\[rq] or \[lq]dashed\[rq] doesn't matter, except that the order of
+text arguments is significant.
+.PP
+Here are all but one of the basic \fBpic\fP objects at their default sizes:
+.KS
+.PS
+box "box";
+move;
+line "line" "";
+move;
+arrow "arrow" "";
+move;
+circle "circle";
+move;
+ellipse "ellipse";
+move;
+arc; down; move; "arc"
+.PE
+.CE "2: Basic \fBpic\fP objects"
+.PP
+The missing simple object type is a \fIspline\fP.
+There is also a way to collect objects into \fIblock composites\fP which
+allows you to treat the whole group as a single object (resembling a
+box) for many purposes.
+We'll describe both of these later on.
+.PP
+The box, ellipse, circle, and block composite objects are \fIclosed\/\fR;
+lines, arrows, arcs and splines are \fIopen\fP.
+This distinction is often important in explaining command modifiers.
+.PP
+Figure \n[H1]-2 was produced by the following \fBpic\fP program,
+which introduces some more basic concepts:
+.KS
+.DS
+.CW
+\&.PS
+box "box";
+move;
+line "line" "";
+move;
+arrow "arrow" "";
+move;
+circle "circle";
+move;
+ellipse "ellipse";
+move;
+arc; down; move; "arc"
+\&.PE
+.DE
+.ft R
+.KE
+.PP
+The first thing to notice is the \fImove\fP command, which moves a
+default distance (1/2 inch) in the current movement direction.
+.PP
+Secondly, see how we can also decorate lines and arrows with text.
+The line and arrow commands each take two arguments here, specifying
+text to go above and below the object.
+If you wonder why one argument would not do, contemplate the output of
+\fBarrow "ow!"\fP:
+.KS
+.PS
+arrow "ow!"
+.PE
+.CE "3: Text centered on an arrow"
+.PP
+When a command takes one text string, \fBpic\fP tries to place it at
+the object's geometric center.
+As you add more strings, \fBpic\fP treats them as a vertical block to be
+centered.
+The program
+.KS
+.DS
+.CW
+line "1";
+line "1" "2";
+line "1" "2" "3";
+line "1" "2" "3" "4";
+line "1" "2" "3" "4" "5";
+.DE
+.ft R
+.KE
+.LP
+for example, gives you this:
+.KS
+.sp 2
+.PS
+line "1";
+line "1" "2";
+line "1" "2" "3";
+line "1" "2" "3" "4";
+line "1" "2" "3" "4" "5";
+.PE
+.sp 2
+.CE "4: Effects of multiple text arguments"
+.PP
+The last line of Figure 3-2's program, `\fBarc; down; move;
+"arc"\fP', describing the captioned arc, introduces several new ideas.
+Firstly, we see how to change the direction in which objects are
+joined.
+Had we written \fBarc; move; "arc"\fP, omitting \fBdown\fP the caption
+would have been joined to the top of the arc, like this:
+.KS
+.PS
+arc; move; "arc";
+.PE
+.CE "5: Result of \fBarc; move; ""arc""\fP"
+.PP
+This is because drawing an arc changes the default direction to the
+one its exit end points at.
+To reinforce this point, consider:
+.KS
+.PS
+arc cw; move; "arc";
+.PE
+.CE "6: Result of \fBarc cw; move; ""arc""\fP"
+.PP
+All we've done differently here is specify \[lq]cw\[rq] for a clockwise arc
+(\[lq]ccw\[rq] specifies counter-clockwise direction).
+Observe how it changes the default direction to down, rather than up.
+.PP
+Another good way to see this via with the following program:
+.KS
+.DS
+.CW
+line; arc; arc cw; line
+.DE
+.ft R
+.KE
+.LP
+which yields:
+.KS
+.PS
+line; arc; arc cw; line;
+.PE
+.CE "7: Result of \fBline; arc; arc cw; line\fP"
+.LP
+Notice that we did not have to specify \[lq]up\[rq] for the second arc to be
+joined to the end of the first.
+.PP
+Finally, observe that a string, alone, is treated as text to be
+surrounded by an invisible box of a size either specified by width
+and height attributes or by the defaults \fBtextwid\fR and
+\fBtextht\fR.
+Both are initially zero (because we don't know the default font size).
+.
+.
+.NH 1
+Sizes and Spacing
+.PP
+Sizes are specified in inches.
+If you don't like inches, it's possible to set a global style variable
+\fBscale\fP that changes the unit.
+Setting \fBscale = 2.54\fP effectively changes the internal unit to
+centimeters (all other size variable values are scaled correspondingly).
+.
+.NH 2
+Default Sizes of Objects
+.PP
+Here are the default sizes for \fBpic\fP objects:
+.TS H
+center, tab(@), linesize(2);
+lb | lb
+l | l.
+.sp 2p
+Object@Default Size
+.sp 2p
+_
+.sp 2p
+.TH
+box@0.75" wide by 0.5" high
+circle@0.5" diameter
+ellipse@0.75" wide by 0.5" high
+arc@0.5" radius
+line@0.5" long
+arrow@0.5" long
+.sp 5p
+_
+.TE
+.PP
+The simplest way to think about these defaults is that they make the
+other basic objects fit snugly into a default-sized box.
+.PP
+\fIpic2plot\/\fP(1) does not necessarily emit a physical inch for
+each virtual inch in its drawing coordinate system.
+Instead, it draws on a canvas 8\~virtual inches by 8\~virtual inches
+wide.
+If its output page size is \[lq]letter\[rq], these virtual inches will
+map to real ones.
+Specifying a different page size (such as, say, \[lq]a4\[rq]) will scale
+virtual inches so they are output as one eighth of the page width.
+Also, \fIpic2plot\/\fP(1) centers all images by default, though the
+\fB\-n\fP option can be used to prevent this.
+.
+.NH 2
+Objects Do Not Stretch!
+.PP
+Text is rendered in the current font with normal troff line spacing.
+Boxes, circles, and ellipses do \fInot\fP automatically resize to fit
+enclosed text.
+Thus, if you say \fBbox "this text far too long for a default box"\fP
+you'll get this:
+.KS
+.PS
+box "this text is far too long for a default box"
+.PE
+.CE "1: Boxes do not automatically resize"
+.LP
+which is probably not the effect you want.
+.
+.NH 2
+Resizing Boxes
+.PP
+To change the box size, you can specify a box width with the \[lq]width\[rq]
+modifier:
+.KS
+.PS
+box width 3 "this text is far too long for a default box"
+.PE
+.CE "2: Result of \fBbox width 3 ""text far too long""\fP"
+.PP
+This modifier takes a dimension in inches.
+There is also a \[lq]height\[rq] modifier that changes a box's height.
+The \fBwidth\fP keyword may be abbreviated to \fBwid\fP; the
+\fBheight\fP keyword to \fBht\fP.
+.
+.NH 2
+Resizing Other Object Types
+.PP
+To change the size of a circle, give it a \fBrad[ius]\fP or
+\fBdiam[eter]\fP modifier; this changes the radius or diameter of the
+circle, according to the numeric argument that follows.
+.KS
+.PS
+{circle rad 0.1; move down 0.2 from last circle .s; "0.1"};
+move; circle rad 0.2 "0.2"; move; circle rad 0.3 "0.3";
+.PE
+.CE "3: Circles with increasing radii"
+.PP
+The \fBmove\fP command can also take a dimension, which just tells
+it how many inches to move in the current direction.
+.PP
+Ellipses are sized to fit in the rectangular box defined by their
+axes, and can be resized with \fBwidth\fP and \fBheight\fP like boxes.
+.PP
+You can also change the radius of curvature of an arc with \fBrad[ius]\fP
+(which specifies the radius of the circle of which the arc is a segment).
+Larger values yield flatter arcs.
+.KS
+.PS
+{arc rad 0.1; move down 0.3 from last arc .center; "0.1"};
+move;
+{arc rad 0.2; move down 0.4 from last arc .center; "0.2"};
+move;
+{arc rad 0.3; move down 0.5 from last arc .center; "0.3"};
+.PE
+.CE "4: \fBarc rad\fP with increasing radii"
+.PP
+Observe that because an arc is defined as a quarter circle, increasing
+the radius also increases the size of the arc's bounding box.
+.
+.NH 2
+The `same' Keyword
+.PP
+In place of a dimension specification, you can use the keyword
+\fBsame\fR.
+This gives the object the same size as the previous one
+of its type.
+As an example, the program
+.KS
+.DS
+.CW
+\&.PS
+box; box wid 1 ht 1; box same; box
+\&.PE
+.R
+.DE
+.KE
+.LP
+gives you
+.KS
+.PS
+box; box wid 1 ht 1; box same; box
+.PE
+.CE "5: The \fBsame\fP keyword"
+.
+.
+.NH 1
+Generalized Lines and Splines
+.
+.NH 2
+Diagonal Lines
+.PP
+It is possible to specify diagonal lines or arrows by adding multiple \fBup\fP,
+\fBdown\fP, \fBleft\fP, and \fBright\fP modifiers to the line object.
+Any of these can have a multiplier.
+To understand the effects, think of the drawing area as being gridded
+with standard-sized boxes.
+.KS
+.PS
+# Draw a demonstration up left arrow with grid box overlay
+define gridarrow
+{
+ move right 0.5
+ [
+ {arrow up left $1;}
+ box wid 0.5 ht 0.5 dotted with .nw at last arrow .end;
+ for i = 2 to ($1 / 0.5) do {
+ box wid 0.5 ht 0.5 dotted with .sw at last box .se;
+ }
+ move down from last arrow .center;
+ [
+ sprintf("\fBarrow up left %g\fP", $1)
+ ]
+ ]
+ move right 0.1 from last [] .e;
+}
+gridarrow(0.5);
+gridarrow(1);
+gridarrow(1.5);
+gridarrow(2);
+undef gridarrow
+.PE
+.CE "1: Diagonal arrows (dotted boxes show the implied 0.5-inch grid)"
+.
+.NH 2
+Multi-Segment Line Objects
+.PP
+A \[lq]line\[rq] or \[lq]arrow\[rq] object may actually be a path
+consisting of any number of segments of varying lengths and directions.
+To describe a path, connect several line or arrow commands with the
+keyword \fBthen\fP.
+.KS
+.PS
+define zigzag { $1 right 1 then down .5 left 1 then right 1 }
+zigzag(line);
+.PE
+.CE "2: \fBline right 1 then down .5 left 1 then right 1\fP"
+.PP
+If a path starts with \fBthen\fP, the first segment is assumed to be into
+the current direction, using the default length.
+.
+.NH 2
+Spline Objects
+.PP
+If you start a path with the \fBspline\fP keyword, the path vertices
+are treated as control points for a spline curve fit.
+.KS
+.PS
+[zigzag(spline);]
+move down 0.2 from last [] .s;
+"The spline curve..."
+move right from last [] .e;
+[
+ zigzag(line dashed);
+ spline from start of last line right 1 then down .5 left 1 then right 1;
+ "1" at last spline .start + (-0.1, 0);
+ "2" at last spline .start + (1.1, 0);
+ "3" at last spline .end + (-1.1, 0);
+ "4" at last spline .end + (0.1, 0);
+]
+move down 0.2 from last [] .s;
+"...with tangents displayed"
+undef zigzag;
+.PE
+.CE "3: \fBspline right 1 then down .5 left 1 then right 1\fP"
+.PP
+You can describe many natural-looking but irregular curves this
+way.
+For example:
+.KS
+.PS
+[spline right then up then left then down ->;]
+move down 0.2 from last [] .s;
+["\fBspline right then up then left then down ->;\fP"]
+move right 3 from last [] .se;
+"\fBspline left then up right then down right ->;\fP"
+move up 0.2;
+[spline left then up right then down right ->;]
+.PE
+.CE "4: Two more spline examples"
+.LP
+Note the arrow decorations.
+Arrowheads can be applied naturally to any path-based object, line or
+spline.
+We'll see how in the next section.
+.
+.
+.NH 1
+Decorating Objects
+.
+.NH 2
+Text Special Effects
+.PP
+All \fBpic\fP implementations support the following font-styling
+escapes within text objects:
+.IP "\efR, \ef1" \w'\efR,\~\ef3'u+2n
+Set Roman style (the default)
+.IP "\efI, \ef2"
+Set Italic style
+.IP "\efB, \ef3"
+Set Bold style
+.IP \efP
+Revert to previous style; only works one level deep, does not stack.
+.PP
+In the \fBpic\fP implementations that are preprocessors for a
+toolchain that include \fB[gtn]roff\fP, text objects may also contain
+\fB[gtn]roff\fP vertical- and horizontal-motion escapes such as \eh or \ev.
+Troff special glyphs are also available.
+All \e-escapes will be passed through to the postprocessing stage and
+have their normal effects.
+The base font family is set by the \fB[gtn]roff\fP environment at the
+time the picture is rendered.
+.PP
+\fBpic2plot\fP replaces \fB[gtn]roff\fP horizontal- and vertical-motion
+escapes with \e-escapes of its own.
+Troff special glyphs are not available, but in most back ends Latin-1
+special characters and a square-root radical will be.
+See the \fBpic2plot\fP documentation for full details.
+.
+.NH 2
+Dashed Objects
+.PP
+We've already seen that the modifier \fBdashed\fP can change the line
+style of an object from solid to dashed.
+GNU \fBgpic\fP permits you to dot or dash ellipses, circles, and arcs
+(and splines in \*[tx] mode only); some versions of DWB may only permit
+dashing of lines and boxes.
+It's possible to change the dash interval by specifying a
+number after the modifier.
+.PP
+.KS
+.PS
+box dashed "default";
+move;
+box dashed 0.05 "0.05";
+move;
+box dashed 0.1 "0.1";
+move;
+box dashed 0.15 "0.15";
+move;
+box dashed 0.2 "0.2";
+.PE
+.CE "1: Dashed objects"
+.
+.NH 2
+Dotted Objects
+.PP
+Another available qualifier is \fBdotted\fP.
+GNU \fBgpic\fP permits you to dot or dash ellipses, circles, and arcs
+(and splines in \*[tx] mode only); some versions of DWB may only permit
+dashing of lines and boxes.
+It too can be suffixed with a number to specify the interval between
+dots:
+.KS
+.PS
+box dotted "default";
+move;
+box dotted 0.05 "0.05";
+move;
+box dotted 0.1 "0.1";
+move;
+box dotted 0.15 "0.15";
+move;
+box dotted 0.2 "0.2";
+.PE
+.CE "2: Dotted objects"
+.
+.NH 2
+Rounding Box Corners
+.PP
+It is also possible, in GNU \fBgpic\fP only, to modify a box so it has
+rounded corners:
+.KS
+.PS
+box rad 0.05 "rad 0.05";
+move;
+box rad 0.1 "rad 0.1";
+move;
+box rad 0.15 "rad 0.15";
+move;
+box rad 0.2 "rad 0.2";
+move;
+box rad 0.25 "rad 0.25";
+.PE
+.CE "3: \fBbox rad\fP with increasing radius values"
+.PP
+Radius values higher than half the minimum box dimension are silently
+truncated to that value.
+.
+.NH 2
+Slanted Boxes
+.PP
+GNU \fBgpic\fP supports slanted boxes:
+.KS
+.PS
+box wid 1.2 xslanted 0.1 "xslanted 0.1";
+move;
+box wid 1.2 yslanted -0.1 "yslanted -0.1";
+move;
+box wid 1.2 xslanted -0.2 yslanted 0.1 "xslanted -0.2" "yslanted 0.1";
+.PE
+.CE "4: Various slanted boxes."
+.PP
+The \fBxslanted\fP and \fByslanted\fP attributes specify the x and
+y\~offset, respectively, of the box's upper right corner from its default
+position.
+.
+.NH 2
+Arrowheads
+.PP
+Lines and arcs can be decorated as well.
+Any line or arc (and any spline as well) can be decorated with
+arrowheads by adding one or more as modifiers:
+.KS
+.PS
+line <- ->
+.PE
+.CE "5: Double-headed line made with \fBline <- ->\fP"
+.PP
+In fact, the \fBarrow\fP command is just shorthand for \fBline ->\fP.
+And there is a double-head modifier <->, so the figure above could have
+been made with \fBline <->\fP.
+.PP
+Arrowheads have a \fBwidth\fP attribute, the distance across the rear;
+and a \fBheight\fP attribute, the length of the arrowhead along the shaft.
+.PP
+Arrowhead style is controlled by the style variable \fBarrowhead\fP.
+The DWB and GNU versions interpret it differently.
+DWB defaults to open arrowheads and an \fBarrowhead\fP value of\~2; the
+Kernighan paper says a value of\~7 makes solid arrowheads.
+GNU \fBgpic\fP defaults to solid arrowheads and an \fBarrowhead\fP value
+of\~1; a value of\~0 produces open arrowheads.
+Note that solid arrowheads are always filled with the current outline
+color.
+.
+.NH 2
+Line Thickness
+.PP
+It's also possible to change the line thickness of an object (this is
+a GNU extension, DWB \fBpic\fP doesn't support it).
+The default thickness of the lines used to draw objects is controlled by the
+.B linethick
+variable.
+This gives the thickness of lines in points.
+A negative value means use the default thickness:
+in \*[tx] output mode, this means use a thickness of 8 milliinches;
+in \*[tx] output mode with the
+.B -c
+option, this means use the line thickness specified by
+.B .ps
+lines; in troff output mode, this means use a thickness proportional
+to the pointsize.
+A zero value means draw the thinnest possible line supported by the
+output device.
+Initially it has a value of -1.
+There is also a \fBthickness\fP attribute (which can be abbreviated to
+\fBthick\fP).
+For example, \fBcircle thickness 1.5\fP would draw a circle using a line
+with a thickness of 1.5 points.
+The thickness of lines is not affected by the value of the
+.B scale
+variable, nor by any width or height given in the
+.B .PS
+line.
+.
+.NH 2
+Invisible Objects
+.PP
+The modifier \fBinvis[ible]\fP makes an object entirely invisible.
+This used to be useful for positioning text in an invisible object that
+is properly joined to neighboring ones.
+Newer DWB versions and GNU \fBpic\fP treat stand-alone text in exactly
+this way.
+.
+.NH 2
+Filled Objects
+.PP
+It is possible to fill boxes, circles, and ellipses.
+The modifier \fBfill[ed]\fP accomplishes this.
+You can suffix it with a fill value; the default is given by the style
+variable \fBfillval\fP.
+.PP
+DWB \fBpic\fP and \fBgpic\fP have opposite conventions for fill values
+and different defaults.
+DWB \fBfillval\fP defaults to 0.3 and smaller values are darker; GNU
+\fBfillval\fP uses 0 for white and 1 for black.
+.KS
+.PS
+circle fill; move; circle fill 0.4; move; circle fill 0.9;
+.PE
+.CE "6: \fBcircle fill; move; circle fill 0.4; move; circle fill 0.9;\fR"
+.PP
+GNU \fBgpic\fP makes some additional guarantees.
+A fill value greater than 1 can also be used: this means fill with the
+shade of gray that is currently being used for text and lines.
+Normally this is black, but output devices may provide a mechanism for
+changing this.
+The invisible attribute does not affect the filling of objects.
+Any text associated with a filled object is added after the object has
+been filled, so that the text is not obscured by the filling.
+.
+.NH 2
+Colored Objects
+.PP
+As a GNU extension, three additional modifiers are available to specify
+colored objects.
+\fBoutline\fP sets the color of the outline, \fBshaded\fP the fill
+color, and \fBcolor\fP sets both.
+All three keywords expect a suffix specifying the color.
+Example:
+.KS
+.PS
+box color "yellow"; arrow color "cyan"; circle shaded "green" outline "black";
+.PE
+.CE "7: \fBbox color ""yellow""; arrow color ""cyan""; \
+circle shaded ""green"" outline ""black"";\fR"
+.PP
+Alternative spellings are \fBcolour\fP, \fBcolored\fP, \fBcoloured\fP,
+and \fBoutlined\fP.
+.PP
+Predefined color names for \fI[gtn]roff\/\fP-based \fBpic\fP
+implementations are defined in the device macro files, for example
+\f(CWps.tmac\fP; additional colors can be defined with the
+\fB.defcolor\fP request (see the manual page of GNU \fItroff\/\fP(1)
+for more details).
+Currently, color support is not available at all in \*[tx] mode.
+.PP
+The \fIpic2plot\/\fP(1) carries with its own set of color names,
+essentially those recognized by the X\~window system with \[lq]grey\[rq]
+accepted as a variant of \[lq]gray\[rq].
+.PP
+\fBpic\fP assumes that at the beginning of a picture both glyph and fill
+color are set to the default value.
+.
+.
+.NH 1
+More About Text Placement
+.PP
+By default, text is centered at the geometric center of the object it is
+associated with.
+The modifier \fBljust\fP causes the left end to be at the specified
+point (which means that the text lies to the right of the specified
+place!), the modifier \fBrjust\fP puts the right end at the place.
+The modifiers \fBabove\fP and \fBbelow\fP center the text one half line
+space in the given direction.
+.PP
+Text attributes can be combined:
+.KS
+.PS
+[line up "ljust text" ljust;]
+move 1.5;
+[line up "rjust text" rjust;]
+move;
+[arrow 1 "ljust above" ljust above;]
+move;
+[arrow 1 "rjust below" rjust below;]
+.PE
+.CE "1: Text attributes"
+.PP
+What actually happens is that \fIn\fP text strings are centered in a box
+that is \fBtextwid\fP wide by \fBtextht\fP high.
+Both these variables are initially zero (that is \fBpic\fR's way of not
+making assumptions about \fI[tg]roff\/\fP(1)'s default point size).
+.PP
+In GNU \fBgpic\fR, objects can have an
+.B aligned
+attribute.
+This only works if the postprocessor is
+\fBgrops\fP or \fBgropdf\fP.
+Any text associated with an object having the
+.B aligned
+attribute is rotated about the center of the object
+so that it is aligned in the direction from the start point
+to the end point of the object.
+Note that this attribute has no effect for objects whose start and
+end points are coincident.
+.
+.
+.NH 1
+More About Direction Changes
+.PP
+We've already seen how to change the direction in which objects are
+composed from rightwards to downwards.
+Here are some more illustrative examples:
+.KS
+.PS
+down;
+[
+ "\fBright; box; arrow; circle; arrow; ellipse\fP";
+ move 0.2;
+ [right; box; arrow; circle; arrow; ellipse;]
+]
+move down 0.3 from last [] .s;
+[
+ "\fBleft; box; arrow; circle; arrow; ellipse\fP"
+ move 0.2;
+ [left; box; arrow; circle; arrow; ellipse;]
+]
+# move down 0.3 from last [] .sw;
+# To re-join this illustrations, delete everything from here down to
+# the next #-comment, and uncomment the move line above
+.PE
+.CE "1: Effects of different motion directions (right and left)"
+.KS
+.PS
+# To re-join this illustrations, delete everything down to here, then
+# comment out the next `down' line.
+# Don't forget to re-number the figures following!
+down;
+[
+ "\fBdown; box; arrow; circle; arrow; ellipse;\fP"
+ move 0.2;
+ box; arrow; circle; arrow; ellipse;
+]
+move right 2 from last [] .e;
+[
+ up; box; arrow; circle; arrow; ellipse;
+ move 0.2;
+ "\fBup; box; arrow; circle; arrow; ellipse;\fP"
+]
+.PE
+.CE "2: Effects of different motion directions (up and down)"
+.PP
+Something that may appear surprising happens if you change directions
+in the obvious way:
+.KS
+.PS
+box; arrow; circle; down; arrow; ellipse
+.PE
+.CE "3: \fBbox; arrow; circle; down; arrow; ellipse\fP"
+.LP
+You might have expected that program to yield this:
+.KS
+.PS
+box; arrow; circle; move to last circle .s; down; arrow; ellipse
+.PE
+.CE "4: More intuitive?"
+.LP
+But, in fact, to get Figure \*[SN]3 you have to do this:
+.KS
+.DS
+.CW
+\&.PS
+box;
+arrow;
+circle;
+move to last circle .s;
+down;
+arrow;
+ellipse
+\&.PE
+.R
+.DE
+.KE
+.LP
+Why is this?
+Because the exit point for the current direction is already set when you
+draw the object.
+The second arrow in Figure \*[SN]2 dropped downwards from the circle's
+attachment point for an
+object to be joined to the right.
+.PP
+The meaning of the command \fBmove to last circle \&.s\fP should be
+obvious.
+In order to see how it generalizes, we'll need to go into detail on two
+important topics; locations and object names.
+.
+.
+.NH 1
+Naming Objects
+.PP
+The most natural way to name locations in \fBpic\fP is relative to
+objects.
+In order to do this, you have to be able to name
+objects.
+The \fBpic\fP language has rich facilities for this that try to emulate
+the syntax of English.
+.
+.NH 2
+Naming Objects By Order Of Drawing
+.PP
+The simplest (and generally the most useful) way to name an object is
+with a \fBlast\fP clause.
+It needs to be followed by an object type name; \fBbox\fP, \fBcircle\fP,
+\fBellipse\fP, \fBline\fP, \fBarrow\fP, \fBspline\fP, \fB""\fP, or
+\fB[]\fP (the last type refers to a \fIcomposite object\fP which we'll
+discuss later).
+So, for example, the \fBlast circle\fP clause in the program attached to
+Figure \*[SN]3 refers to the last circle drawn.
+.PP
+More generally, objects of a given type are implicitly numbered
+(starting from\~1).
+You can refer to (say) the third ellipse in the current picture with
+\fB3rd ellipse\fP, or to the first box as \fB1st box\fP, or to the fifth
+text string (which isn't an attribute to another object) as \fB5th
+""\fP.
+.PP
+Objects are also numbered backwards by type from the last one.
+You can say \fB2nd last box\fP to get the second-to-last box, or
+\fB3rd last ellipse\fP to get the third-to-last ellipse.
+.PP
+In places where \fIn\/\fBth\fR is allowed, \fB`\fIexpr\/\fB'th\fR is
+also allowed.
+Note that
+.B 'th
+is a single token: no space is allowed between the
+.B '
+and the \fBth\fP.
+For example,
+.IP
+.KS
+.DS
+.CW
+for i = 1 to 4 do {
+ line from `i'th box.nw to `i+1'th box.se
+}
+.DE
+.R
+.KE
+.
+.NH 2
+Naming Objects With Labels
+.PP
+You can also specify an object by referring to a label.
+A label is a word (which must begin with a capital letter) followed by a
+colon; you declare it by placing it immediately before the object
+drawing command.
+For example, the program
+.KS
+.DS
+.CW
+\&.PS
+A: box "first" "object"
+move;
+B: ellipse "second" "object"
+move;
+arrow right at A .r;
+\&.PE
+.R
+.DE
+.KE
+.LP
+declares labels \fBA\fP and \fBB\fP for its first and second objects.
+Here's what that looks like:
+.KS
+.PS
+A: box "first" "object"
+move;
+B: ellipse "second" "object"
+move;
+arrow right at A .r;
+.PE
+.CE "1: Example of label use"
+The \fBat\fP statement in the fourth line uses the label \fBA\fP (the
+behavior of \fBat\fP is explained in the next section).
+We'll see later on that labels are most useful for referring to block
+composite objects.
+.PP
+Labels are not constants but variables (you can view colon as a sort
+of assignment).
+You can say something like \fBA: A + (1,0);\fP and the effect is to
+reassign the label \fBA\fR to designate a position one inch to the right
+of its old value.
+.
+.
+.NH 1
+Describing locations
+.PP
+The location of points can be described in many different ways.
+All these forms are interchangeable as for as the \fBpic\fP language
+syntax is concerned; where you can use one, any of the others that would
+make semantic sense are allowed.
+.PP
+The special label \fBHere\fR always refers to the current position.
+.
+.NH 2
+Absolute Coordinates
+.PP
+The simplest is absolute coordinates in inches; \fBpic\fP uses a
+Cartesian system with (0,0) at the lower left corner of the virtual
+drawing surface for each picture (that is, X\~increases to the right
+and Y\~increases upwards).
+An absolute location may always be written in the conventional form as
+two comma-separated numbers surrounded by parentheses (and this is
+recommended for clarity).
+In contexts where it creates no ambiguity, the pair of X and
+Y\~coordinates suffices without parentheses.
+.PP
+It is a good idea to avoid absolute coordinates, however.
+They tend to make picture descriptions difficult to understand and
+modify.
+Instead, there are quite a number of ways to specify locations
+relative to \fBpic\fP objects and previous locations.
+.PP
+Another possibility of surprise is the fact that \fBpic\fP crops the
+picture to the smallest bounding box before writing it out.
+For example, if you have a picture consisting of a small box with its
+lower left corner at (2,2) and another small box with its upper right
+corner at (5,5), the width and height of the image are both 3\~units and
+not\~5.
+To get the origin at (0,0) included, simply add an invisible object to
+the picture, positioning the object's left corner at (0,0).
+.
+.NH 2
+Locations Relative to Objects
+.PP
+The symbol \fBHere\fP always refers to the position of the last object
+drawn or the destination of the last \fBmove\fP.
+.PP
+Alone and unqualified, a \fBlast circle\fP or any other way of
+specifying a closed-object or arc location refers as a position to the
+geometric center of the object.
+Unqualified, the name of a line or spline object refers to the position
+of the object start.
+.PP
+Also, \fBpic\fP objects have quite a few named locations
+associated with them.
+One of these is the object center, which can be indicated (redundantly)
+with the suffix \fB.center\fP (or just \fB.c\fP).
+Thus, \fBlast circle \&.center\fP is equivalent to \fBlast
+circle\fP.
+.NH 3
+Locations Relative to Closed Objects
+.PP
+Every closed object (box, circle, ellipse, or block composite) also
+has eight compass points associated with it;
+.KS
+.PS
+define dot {circle fill rad 0.02 at $1}
+
+define compass { [
+ ME: $1;
+ dot(ME.c); "\fB .c\fP" at ME .c ljust;
+ dot(ME.n); "\fB.n\fP" at ME .n above
+ dot(ME.ne); "\fB .ne\fP" at ME .ne above
+ dot(ME.e); "\fB .e\fP" at ME .e ljust
+ dot(ME.se); "\fB .se\fP" at ME .se below
+ dot(ME.s); "\fB.s\fP" at ME .s below
+ dot(ME.sw); "\fB.sw \fP" at ME .sw below
+ dot(ME.w); "\fB.w \fP" at ME .w rjust
+ dot(ME.nw); "\fB.nw \fP" at ME .nw above
+] }
+compass(box wid 1.5 ht 1);
+move right from last [] .e;
+compass(circle diam 1);
+move right from last [] .e;
+compass(ellipse wid 1.5 ht 1);
+.PE
+.CE "1: Compass points"
+.LP
+these are the locations where eight compass rays from the geometric center
+would intersect the figure.
+So when we say \fBlast circle \&.s\fP we are referring to the south
+compass point of the last circle drawn.
+The explanation of Figure 8-3's program is now complete.
+.PP
+(In case you dislike compass points, the names \fB.top\fP,
+\&\fB.bottom\fP, \fB.left\fP and \fB.right\fP are synonyms for \fB.n\fP,
+\&\fB.s\fP, \fB.e\fP, and \fB.w\fP respectively; they can even be
+abbreviated to \fB.t\fP, \fB.b\fP, \fB.l\fP and \fB.r\fP).
+.PP
+The names \fBcenter\fP, \fBtop\fP, \fBbottom\fP, \fBleft\fP, \fBright\fP,
+\fBnorth\fP, \fBsouth\fP, \fBeast\fP, and \fBwest\fP can also be used
+(without the leading dot) in a prefix form marked by \fBof\fP; thus,
+\fBcenter of last circle\fP and \fBtop of 2nd last ellipse\fP are both
+valid object references.
+Finally, the names \fBleft\fP and \fBright\fP can be prefixed with
+\fBupper\fP and \fBlower\fP which both have the obvious meaning.
+.PP
+Arc objects also have compass points; they are the compass points of
+the implied circle.
+.PP
+Non-closed objects (line, arrow, or spline) have compass points too, but
+the locations of them are completely arbitrary.
+In particular, different \fBpic\fP implementations return different
+locations.
+.NH 3
+Locations Relative to Open Objects
+.PP
+Every open object (line, arrow, arc, or spline) has three named
+points: \fB.start\fP, \fB.center\fP (or \fB.c\fP), and \fB.end\fP.
+They can also be used without leading dots in the \fBof\fP prefix form.
+The center of an arc is the center of its circle, but the center of
+a line, path, or spline is halfway between its endpoints.
+.KS
+.PS
+define critical {
+ [ ME: $1;
+ dot(ME.c); "\fB.center\fP" rjust at ME.center + (-0.1, 0.1)
+ dot(ME.start); "\fB.start\fP" rjust at ME.start + (-0.1, 0.1)
+ dot(ME.end); "\fB.end\fP" rjust at ME.end + (-0.1, 0.1)
+ ]
+}
+critical(line up right 1);
+move right 1 from last [] .e;
+critical(arc rad 0.5 cw);
+move down 0.5 from 2nd last [] .s;
+critical(line right 1 then down .5 left 1 then right 1);
+move right 1 from last [] .e;
+critical(spline right 1 then up right then left then left 1);
+.PE
+.CE "2: Special points on open objects"
+.PP
+.
+.NH 2
+Ways of Composing Positions
+.PP
+Once you have two positions to work with, there are several ways to
+combine them to specify new positions.
+.NH 3
+Vector Sums and Displacements
+.PP
+Positions may be added or subtracted to yield a new position (to be
+more precise, you can only add a position and an expression pair; the
+latter must be on the right side of the addition or subtraction sign).
+The result is the conventional vector sum or difference of coordinates.
+For example, \fBlast box \&.ne + (0.1, 0)\fP is a valid position.
+This example illustrates a common use, to define a position slightly
+offset from a named one (say, for captioning purposes).
+.NH 3
+Interpolation Between Positions
+.PP
+A position may be interpolated between any two positions.
+The syntax is `\fIfraction\fP \fBof the way between\fP \fIposition1\fP
+\fBand\fP \fIposition2\fP'.
+For example, you can say \fB1/3 of the way between Here and last ellipse
+\&.ne\fP.
+The fraction may be in numerator/denominator form or may be an ordinary
+number (values are \fInot\fP restricted to [0,1]).
+As an alternative to this verbose syntax, you can say `\fIfraction\fP
+\fB<\,\fP\fIposition1\fP \fB,\fP \fIposition2\/\fP\fB>\fP'; thus, the
+example could also be written as \fB1/3 <Here, last ellipse>\fP.
+.KS
+.PS
+arrow up right;
+P: 1/3 of the way between last arrow .start and last arrow .end;
+dot(P); move right 0.1; "P";
+.PE
+.CE "3: \fBP: 1/3 of the way between last arrow .start and last arrow .end\fP"
+.PP
+This facility can be used, for example, to draw double connections.
+.KS
+.PS
+A: box "yin"; move;
+B: box "yang";
+arrow right at 1/4 <A.e,A.ne>;
+arrow left at 1/4 <B.w,B.sw>;
+.PE
+.CE "4: Doubled arrows"
+.LP
+You can get Figure \n[H1]-4 from the following program:
+.KS
+.DS
+.CW
+\&.PS
+A: box "yin"; move;
+B: box "yang";
+arrow right at 1/4 <A.e,A.ne>;
+arrow left at 1/4 <B.w,B.sw>;
+\&.PE
+.R
+.DE
+.KE
+.LP
+Note the use of the short form for interpolating points.
+.NH 3
+Projections of Points
+.PP
+Given two positions \fIp\fP and \fIq\fP, the position
+\fB(\,\fP\fIp\fP\fB,\fP \fIq\fP\fB)\fP has the X\~coordinate of \fIp\fP
+and the Y coordinate of \fIq\fP.
+This can be helpful in placing an object at one of the corners of the
+virtual box defined by two other objects.
+.KS
+.PS
+box invis wid 2 height 1;
+dot(last box .ne); "\fB(B,A)\fP is here" ljust at last circle + (0.1, 0.1);
+dot(last box .se); "B" ljust at last circle + (0.1, -0.1)
+dot(last box .sw); "\fB(A,B)\fP is here" rjust at last circle + (-0.1, -0.1);
+dot(last box .nw); "A" ljust at last circle + (-0.1, 0.1)
+.PE
+.CE "5: Using (\fIx\fP, \fIy\fP) composition"
+.
+.NH 2
+Using Locations
+.PP
+There are four ways to use locations; \fBat\fP, \fBfrom\fP, \fBto\fP,
+and \fBwith\fP.
+All four are object modifiers; that is, you use them as suffixes to a
+drawing command.
+.PP
+The \fBat\fP modifier says to draw a closed object or arc with its
+center at the following location, or to draw a line/spline/arrow
+starting at the following location.
+.PP
+The \fBto\fP modifier can be used alone to specify a move destination.
+The \fBfrom\fP modifier can be used alone in the same way as \fBat\fP.
+.PP
+The \fBfrom\fP and \fBto\fP modifiers can be used with a \fBline\fR or
+\fBarc\fR command to specify start and end points of the object.
+In conjunction with named locations, this offers a very flexible
+mechanism for connecting objects.
+For example, the following program
+.KS
+.DS
+.CW
+\&.PS
+box "from"
+move 0.75;
+ellipse "to"
+arc cw from 1/3 of the way \e
+ between last box .n and last box .ne to last ellipse .n;
+\&.PE
+.R
+.DE
+.KE
+.LP
+yields:
+.KS
+.PS
+box "from"
+move 0.75;
+ellipse "to"
+arc cw from 1/3 of the way \
+ between last box .n and last box .ne to last ellipse .n;
+.PE
+.CE "6: A tricky connection specified with English-like syntax"
+.PP
+The \fBwith\fP modifier allows you to identify a named attachment
+point of an object (or a position within the object) with another point.
+This is very useful for connecting objects in a natural way.
+For an example, consider these two programs:
+.KS
+.PS
+[
+ [
+ box wid 0.5 ht 0.5;
+ box wid 0.75 ht 0.75;
+ ]
+ move 0.1 down 0.3 from last [] .s;
+ "\fBbox wid 0.5 ht 0.5; box wid 0.75 ht 0.75\fP"
+]
+move from last [].e 1.5
+[
+ [
+ box wid 0.5 ht 0.5;
+ box wid 0.75 ht 0.75 with .sw at last box .se;
+ ]
+ move 0.1 down 0.3 from last [] .s;
+ box invisible "\fBbox wid 0.5 ht 0.5;\fP" \
+ "\fBbox wid 0.75 ht 0.75 with .sw at last box .se;\fP"
+]
+.PE
+.CE "7: Using the \fBwith\fP modifier for attachments"
+.
+.NH 2
+The `chop' Modifier
+.PP
+When drawing lines between circles that don't intersect them at a
+compass point, it is useful to be able to shorten a line by the radius
+of the circle at either or both ends.
+Consider the following program:
+.KS
+.DS
+.CW
+\&.PS
+circle "x"
+circle "y" at 1st circle - (0.4, 0.6)
+circle "z" at 1st circle + (0.4, -0.6)
+arrow from 1st circle to 2nd circle chop
+arrow from 2nd circle to 3rd circle chop
+arrow from 3rd circle to 1st circle chop
+\&.PE
+.DE
+.R
+.KE
+.LP
+It yields the following:
+.KS
+.PS
+circle "x"
+circle "y" at 1st circle - (0.4, 0.6)
+circle "z" at 1st circle + (0.4, -0.6)
+arrow from 1st circle to 2nd circle chop
+arrow from 2nd circle to 3rd circle chop
+arrow from 3rd circle to 1st circle chop
+.PE
+.CE "8: The \fBchop\fR modifier"
+.LP
+Notice that the \fBchop\fR attribute moves arrowheads rather than
+stepping on them.
+By default, the \fBchop\fR modifier shortens both ends of the line by
+\fBcirclerad\fR.
+By suffixing it with a number you can change the amount of chopping.
+.PP
+If you say \fBline \&.\|.\|.\& chop \fIr1\fP chop \fIr2\fP\fR with
+\fIr1\fP and \fIr2\fP both numbers, you can vary the amount of chopping
+at both ends.
+You can use this in combination with trigonometric functions to write
+code that deals with more complex intersections.
+.
+.
+.NH 1
+Object Groups
+.PP
+There are two different ways to group objects in \fBpic\fP; \fIbrace
+grouping\fP and \fIblock composites\fP.
+.
+.NH 2
+Brace Grouping
+.PP
+The simpler method is simply to group a set of objects within curly
+bracket or brace characters.
+On exit from this grouping, the current position and direction are
+restored to their value when the opening brace was encountered.
+.
+.NH 2
+Block Composites
+.PP
+A block composite object is created a series of commands enclosed by
+square brackets.
+The composite can be treated for most purposes like a single closed
+object, with the size and shape of its bounding box.
+Here is an example.
+The program fragment
+.KS
+.DS
+.CW
+A: [
+ circle;
+ line up 1 at last circle .n;
+ line down 1 at last circle .s;
+ line right 1 at last circle .e;
+ line left 1 at last circle .w;
+ box dashed with .nw at last circle .se + (0.2, -0.2);
+ Caption: center of last box;
+]
+.R
+.DE
+.KE
+.LP
+yields the block in figure \n[H1]-1, which we show both with and
+without its attachment points.
+The block's location becomes the value of \fBA\fP.
+.KS
+.PS
+define junction {
+ circle;
+ line up 1 at last circle .n;
+ line down 1 at last circle .s;
+ line right 1 at last circle .e;
+ line left 1 at last circle .w;
+ box dashed with .nw at last circle .se + (0.2, -0.2);
+ Caption: center of last box;
+}
+[junction();]
+move;
+compass([junction()]);
+.PE
+.CE "1: A sample composite object"
+.LP
+To refer to one of the composite's attachment points, you can say
+(for example) \fBA \&.s\fP.
+For purposes of object naming, composites are a class.
+You could write \fBlast [] \&.s\fP as an equivalent reference, usable
+anywhere a location is needed.
+This construction is very important for putting together large,
+multi-part diagrams.
+.PP
+Blocks are also a variable-scoping mechanism, like a \fIgroff\/\fP(1)
+environment.
+All variable assignments done inside a block are undone at the end of it.
+To get at values within a block, write a name of the block followed by a
+dot, followed by the label you want.
+For example, we could refer the center of the box in the above composite as
+\fBlast [] \&.Caption\fP or \fBA.Caption\fP.
+.PP
+This kind of reference to a label can be used in any way any other
+location can be.
+For example, if we added \fB"Hi!" at A.Caption\fP
+the result would look like this:
+.KS
+.PS
+A: [junction();]
+"Hi!" at A.Caption;
+.PE
+.CE "2: Adding a caption using interior labeling"
+.PP
+You can also use interior labels in either part of a \fBwith\fR
+modifier.
+This means that the example composite could be placed relative to its
+caption box by a command containing \fBwith A.Caption at\fP.
+.PP
+Note that both width and height of the block composite object are always
+positive:
+.KS
+.PS
+[
+ [
+ box wid -0.5 ht 0.5
+ box wid 0.75 ht 0.75
+ ]
+ move 0.1 down 0.3 from last [].s
+ "\fBbox wid -0.5 ht 0.5; box wid 0.75 ht 0.75\fP"
+]
+move from last [].e 2
+[
+ [
+ [ box wid -0.5 ht 0.5 ]
+ box wid 0.75 ht 0.75
+ ]
+ move 0.1 down 0.3 from last [].s
+ "\fB[box wid -0.5 ht 0.5]; box wid 0.75 ht 0.75\fP"
+]
+.PE
+.CE "3: Composite block objects always have positive width and height"
+.PP
+Blocks may be nested.
+This means you can use block attachment points to build up complex
+diagrams hierarchically, from the inside out.
+Note that \fBlast\fP and the other sequential naming mechanisms
+don't look inside blocks, so if you have a program that looks
+like
+.KS
+.DS
+.CW
+\&.PS
+P: [box "foo"; ellipse "bar"];
+Q: [
+ [box "baz"; ellipse "quxx"]
+ "random text";
+ ]
+arrow from 2nd last [];
+\&.PE
+.R
+.DE
+.KE
+.LP
+the arrow in the last line is attached to object \fBP\fP, not
+object \fBQ\fP.
+.PP
+In DWB \fBpic\fP, only references one level deep into enclosed blocks
+were permitted.
+GNU \fBgpic\fP removes this restriction.
+.PP
+The combination of block variable scoping, assignability of labels and
+the macro facility that we'll describe later on can be used to
+simulate functions with local variables (just wrap the macro body in
+block braces).
+.
+.
+.NH 1
+Style Variables
+.PP
+There are a number of global style variables in \fBpic\fR that can be used to
+change its overall behavior.
+We've mentioned several of them in previous sections.
+They're all described here.
+For each variable, the default is given.
+.TS H
+center, tab(@), linesize(2);
+lb | lb | lb
+l | n | l.
+.sp 2p
+Style Variable@Default@What It Does
+.sp 2p
+_
+.sp 2p
+.TH
+boxht@0.5@Default height of a box
+boxwid@0.75@Default width of a box
+lineht@0.5@Default length of vertical line
+linewid@0.75@Default length of horizontal line
+linethick@-1@Default line thickness
+arcrad @0.25@Default radius of an arc
+circlerad@0.25@Default radius of a circle
+ellipseht@0.5@Default height of an ellipse
+ellipsewid@0.75@Default width of an ellipse
+moveht@0.5@Default length of vertical move
+movewid@0.75@Default length of horizontal move
+textht@0@Default height of box enclosing a text object
+textwid@0@Default width of box enclosing a text object
+arrowht@0.1@Length of arrowhead along shaft
+arrowwid@0.05@Width of rear of arrowhead
+arrowhead@1@Enable/disable arrowhead filling
+dashwid@0.05@Interval for dashed lines
+maxpswid@8.5@Maximum width of picture
+maxpsht@11@Maximum height of picture
+scale@1@Unit scale factor
+fillval@0.5@Default fill value
+.sp 5p
+_
+.TE
+Any of these variables can be set with a simple assignment statement.
+For example:
+.KS
+.PS
+[boxht=1; boxwid=0.3; movewid=0.2; box; move; box; move; box; move; box;]
+.PE
+.CE "1: \fBboxht=1; boxwid=0.3; movewid=0.2; box; move; box; move; box; move; box;\fP"
+.PP
+In GNU \fBpic\fR, setting the \fBscale\fR variable re-scales all
+size-related state variables so that their values remain equivalent in
+the new units.
+.PP
+The command \fBreset\fP resets all style variables to their defaults.
+You can give it a list of variable names as arguments (optionally
+separated by commas), in which case it resets only those.
+.PP
+State variables retain their values across pictures until reset.
+.
+.
+.NH 1
+Expressions, Variables, and Assignment
+.PP
+A number is a valid expression, of course (all numbers are stored
+internally as floating-point).
+Decimal-point notation is acceptable;
+in GNU \fBgpic\fR, scientific notation in C's `e' format (like
+\f(CW5e-2\fP) is accepted.
+.PP
+Anywhere a number is expected, the language also accepts a
+variable.
+Variables may be the built-in style variable described in the last
+section, or new variables created by assignment.
+.PP
+DWB \fBpic\fP supports only the ordinary assignment via \fB=\fP, which
+defines the variable (on the left side of the equal sign) in the current
+block if it is not already defined there, and then changes the value (on
+the right side) in the current block.
+The variable is not visible outside of the block.
+This is similar to the C\~programming language where a variable within a
+block shadows a variable with the same name outside of the block.
+.PP
+GNU \fBgpic\fP supports an alternate form of assignment using \fB:=\fP.
+The variable must already be defined, and the value is assigned to
+that variable without creating a variable local to the current block.
+For example, this
+.KS
+.DS
+.CW
+x=5
+y=5
+[
+ x:=3
+ y=3
+]
+print x " " y
+.DE
+.KE
+.LP
+prints \fB3 5\fP.
+.PP
+You can use the height, width, radius, and x and y coordinates of any
+object or corner in expressions.
+If \fBA\fP is an object label or name, all the following are valid:
+.KS
+.DS
+.CW
+A.x # x coordinate of the center of A
+A.ne.y # y coordinate of the northeast corner of A
+A.wid # the width of A
+A.ht # and its height
+2nd last circle.rad # the radius of the 2nd last circle
+.R
+.DE
+.KE
+.LP
+Note the second expression, showing how to extract a corner coordinate.
+.PP
+Basic arithmetic resembling those of C operators are available; \fB+\fP,
+\fB*\fP, \fB-\fP, \fB/\fP, and \fB%\fP.
+So is \fB^\fP for exponentiation.
+Grouping is permitted in the usual way using parentheses.
+GNU \fBgpic\fP allows logical operators to appear in expressions;
+\fB!\&\fP (logical negation, not factorial), \fB&&\fP, \fB|\||\fP,
+\fB==\fP, \fB!=\fP, \fB>=\fP, \fB<=\fP, \fB<\fP, \fB>\fP.
+.PP
+Various built-in functions are supported: \fBsin(\fIx\fB)\fR,
+\fBcos(\fIx\fB)\fR, \fBlog(\fIx\fB)\fR, \fBexp(\fIx\fB)\fR,
+\fBsqrt(\fIx\fB)\fR, \fBmax(\fIx\fB,\fIy\fB)\fR,
+\fBatan2(\fIx\fB,\fIy\fB)\fR, \fBmin(\fIx\fB,\fIy\fB)\fR,
+\fBint(\fIx\fB)\fR, \fBrand()\fP, and \fBsrand()\fP.
+Both \fBexp\fP and \fBlog\fP are
+base\~10; \fBint\fP does integer truncation; \fBrand()\fP returns a
+random number in [0-1), and \fBsrand()\fP sets the seed for
+a new sequence of pseudo-random numbers to be returned by \fBrand()\fP
+(\fBsrand()\fP is a GNU extension).
+.PP
+GNU \fBgpic\fP also documents a one-argument form or rand,
+\fBrand(\fIx\fB)\fR, which returns a random number between 1 and
+\fIx\fP, but this is deprecated and may be removed in a future
+version.
+.PP
+The function \fBsprintf()\fP behaves like a C \fIsprintf\/\fP(3)
+function that only takes %%, %e, %E, %f, %g, and %G conversion
+specifications.
+.
+.
+.NH 1
+Macros
+.PP
+You can define macros in \fBpic\fP, with up to 32 arguments (up to 16
+on EBCDIC platforms).
+This is useful for diagrams with repetitive parts.
+In conjunction with the scope rules for block composites, it effectively
+gives you the ability to write functions.
+.PP
+The syntax is
+.DS
+.CW
+\fBdefine\fP \fIname\fP \fB{\fP \fIreplacement text \fB}\fP
+.R
+.DE
+.LP
+This defines \fIname\fR as a macro to be replaced by the replacement
+text (not including the braces).
+The macro may be called as
+.DS
+.CW
+\fIname\fB(\fIarg1, arg2, \|.\|.\|.\& argn\fB)\fR
+.R
+.DE
+.LP
+The arguments (if any) are substituted for tokens \fB$1\fP, \fB$2\fP
+\&.\|.\|.\& \fB$n\fP
+appearing in the replacement text.
+.PP
+As an example of macro use, consider this:
+.KS
+.DS
+.CW
+.ps -1
+.vs -1
+\&.PS
+# Plot a single jumper in a box, $1 is the on-off state.
+define jumper { [
+ shrinkfactor = 0.8;
+ Outer: box invis wid 0.45 ht 1;
+
+ # Count on end ] to reset these
+ boxwid = Outer.wid * shrinkfactor / 2;
+ boxht = Outer.ht * shrinkfactor / 2;
+
+ box fill (!$1) with .s at center of Outer;
+ box fill ($1) with .n at center of Outer;
+] }
+
+# Plot a block of six jumpers.
+define jumperblock {
+ jumper($1);
+ jumper($2);
+ jumper($3);
+ jumper($4);
+ jumper($5);
+ jumper($6);
+
+ jwidth = last [].Outer.wid;
+ jheight = last [].Outer.ht;
+
+ box with .nw at 6th last [].nw wid 6*jwidth ht jheight;
+
+ # Use {} to avoid changing position from last box draw.
+ # This is necessary so move in any direction works as expected
+ {"Jumpers in state $1$2$3$4$5$6" at last box .s + (0,-0.2);}
+}
+
+# Sample macro invocations.
+jumperblock(1,1,0,0,1,0);
+move;
+jumperblock(1,0,1,0,1,1);
+\&.PE
+.ps
+.vs
+.R
+.DE
+.KE
+.LP
+It yields the following:
+.KS
+.PS
+# Plot a single jumper in a box, $1 is the on-off state.
+define jumper { [
+ shrinkfactor = 0.8;
+ Outer: box invis wid 0.45 ht 1;
+
+ # Count on end ] to reset these
+ boxwid = Outer.wid * shrinkfactor / 2;
+ boxht = Outer.ht * shrinkfactor / 2;
+
+ box fill (!$1) with .s at center of Outer;
+ box fill ($1) with .n at center of Outer;
+] }
+
+# Plot a block of six jumpers
+define jumperblock {
+ jumper($1);
+ jumper($2);
+ jumper($3);
+ jumper($4);
+ jumper($5);
+ jumper($6);
+
+ jwidth = last [].Outer.wid;
+ jheight = last [].Outer.ht;
+
+ box with .nw at 6th last [].nw wid 6*jwidth ht jheight;
+
+ # Use {} to avoid changing position from last box draw.
+ # This is necessary so move in any direction works as expected
+ {"Jumpers in state $1$2$3$4$5$6" at last box .s + (0,-0.2);}
+}
+
+# Sample macro invocations
+jumperblock(1,1,0,0,1,0);
+move 0.25;
+jumperblock(1,0,1,0,1,1);
+.PE
+.CE "1: Sample use of a macro"
+.LP
+This macro example illustrates how you can combine [], brace grouping,
+and variable assignment to write true functions.
+.PP
+One detail the example above does not illustrate is the fact that
+macro argument parsing is not token-oriented.
+If you call \fBjumper(\~1\~)\fP, the value of $1 is \fB"\~1\~"\fP.
+You could even call \fBjumper(big\~string)\fP to give $1 the value
+\fB"big\~string"\fP.
+.PP
+If you want to pass in a coordinate pair, you can avoid getting
+tripped up by the comma by wrapping the pair in parentheses.
+.PP
+Macros persist through pictures.
+To undefine a macro, say \fBundef\fP \fIname\fR; for example,
+.DS
+\f(CWundef jumper\fP
+\f(CWundef jumperblock\fP
+.DE
+.LP
+would undefine the two macros in the jumper block example.
+.
+.
+.NH 1
+Import/Export Commands
+.PP
+Commands that import or export data between \fBpic\fR and its
+environment are described here.
+.
+.NH 2
+File and Table Insertion
+.PP
+The statement
+.DS
+\f(CWcopy\fP \fIfilename\fR
+.DE
+.LP
+inserts the contents of \fIfilename\fR in the \fBpic\fP input stream.
+Any \fB.PS\fP/\fB.PE\fP pair in the file is ignored.
+You can use this to include pre-generated images.
+.PP
+A variant of this statement replicates the \fBcopy thru\fP feature of
+\fIgrap\/\fP(1).
+The call
+.DS
+\f(CWcopy\fP \fIfilename\fR \f(CWthru\fP \fImacro\fP
+.DE
+.LP
+calls \fImacro\fP (which may be either a name or replacement text)
+on the arguments obtained by breaking each line of the file into
+blank-separated fields.
+The macro may have up to 9\~arguments.
+The replacement text may be delimited by braces or by a pair of
+instances of any character not appearing in the rest of the text.
+.PP
+If you write
+.DS
+\f(CWcopy\fP \f(CWthru\fP \fImacro\fP
+.DE
+.LP
+omitting the filename, lines to be parsed are taken from the input
+source up to the next \fB.PE\fP.
+.PP
+In either of the last two \fBcopy\fP commands, GNU \fBgpic\fP permits a
+trailing `\fBuntil\fP \fIword\/\fP' clause to be added which terminates
+the copy when the first word matches the argument (the default
+behavior is therefore equivalent to \fBuntil \&.PE\fP).
+.PP
+Accordingly, the command
+.RS
+.KS
+.IP
+.CW
+.nf
+\&.PS
+copy thru % circle at ($1,$2) % until "END"
+1 2
+3 4
+5 6
+END
+box
+\&.PE
+.R
+.fi
+.KE
+.RE
+.LP
+is equivalent to
+.RS
+.KS
+.IP
+.CW
+.nf
+\&.PS
+circle at (1,2)
+circle at (3,4)
+circle at (5,6)
+box
+\&.PE
+.R
+.fi
+.KE
+.RE
+.
+.NH 2
+Debug Messages
+.PP
+The command \fBprint\fR accepts any number of arguments, concatenates
+their output forms, and writes the result to standard error.
+Each argument must be an expression, a position, or a text string.
+.
+.NH 2
+Escape to Post-Processor
+.PP
+If you write
+.DS
+\fBcommand\fR \fIarg\fR\|.\|.\|.
+.DE
+.LP
+\fBpic\fP concatenates the arguments and pass them through as a line
+to troff or \*[tx].
+Each
+.I arg
+must be an expression, a position, or text.
+This has a similar effect to a line beginning with
+.B .
+or
+\fB\e\fR\|,
+but allows the values of variables to be passed through.
+.LP
+For example,
+.KS
+.DS
+.CW
+.nf
+\&.PS
+x = 14
+command ".ds string x is " x "."
+\&.PE
+\e*[string]
+.DE
+.R
+.KE
+.LP
+prints
+.DS
+.CW
+x is 14.
+.R
+.DE
+.
+.NH 2
+Executing Shell Commands
+.PP
+The command
+.DS
+\f(CWsh\fP \f(CW{\fP \fIanything.\|.\|.\fP \f(CW}\fP
+.DE
+.LP
+macro-expands the text in braces, then executes it as a shell command.
+This could be used to generate images or data tables for later
+inclusion.
+The delimiters shown as {} here may also be two copies of any one
+character not present in the shell command text.
+In either case, the body may contain balanced {} pairs.
+Strings in the body may contain balanced or unbalanced braces in any
+case.
+.
+.
+.NH 1
+Control-flow constructs
+.PP
+The \fBpic\fP language provides conditionals and looping.
+For example,
+.KS
+.DS
+.CW
+pi = atan2(0,-1);
+for i = 0 to 2 * pi by 0.1 do {
+ "-" at (i/2, 0);
+ "." at (i/2, sin(i)/2);
+ ":" at (i/2, cos(i)/2);
+}
+.R
+.DE
+.KE
+.LP
+which yields this:
+.KS
+.PS
+pi = atan2(0,-1);
+for i = 0 to 2 * pi by 0.1 do {
+ "-" at (i/2, 0);
+ "." at (i/2, sin(i)/2);
+ ":" at (i/2, cos(i)/2);
+}
+.PE
+.CE "1: Plotting with a \fBfor\fP loop"
+.LP
+The syntax of the \fBfor\fP statement is:
+.DS
+\fBfor\fR \fIvariable\fR \fB=\fR \fIexpr1\/\fR \fBto\fR \fIexpr2\/\fR \
+[\fBby\fR [\fB*\fR]\fIexpr3\/\fR] \fBdo\fR \fIX\fR \fIbody\fR \fIX\fR
+.DE
+The semantics are as follows: Set
+.I variable
+to \fIexpr1\fR.
+While the value of
+.I variable
+is less than or equal to
+\fIexpr2\fR,
+do
+.I body
+and increment
+.I variable
+by
+\fIexpr3\fR;
+if
+.B by
+is not given, increment
+.I variable
+by\~1.
+If
+.I expr3
+is prefixed by\~\c
+.B *
+then
+.I variable
+is multiplied instead by
+\fIexpr3\fR.
+The value of
+.I expr3
+can be negative for the additive case;
+.I variable
+is then tested whether it is greater than or equal to
+\fIexpr2\fR.
+For the multiplicative case,
+.I expr3
+must be greater than zero.
+If the constraints aren't met, the loop isn't executed.
+.I X
+can be any character not occurring in
+\fIbody\fR; or the two \fIX\/\fPs may be paired braces (as in the
+\fBsh\fR command).
+.PP
+The syntax of the \fBif\fP statement is as follows:
+.DS
+\fBif\fR \fIexpr\fR \fBthen\fR \fIX\fR \fIif-true\fR \fIX\fR \
+[\fBelse\fR \fIY\fR \fIif-false\fR \fIY\/\fR]
+.DE
+Its semantics are as follows: Evaluate
+\fIexpr\fR;
+if it is non-zero then do
+\fIif-true\fR,
+otherwise do
+\fIif-false\fR.
+.I X
+can be any character not occurring in
+\fIif-true\fR.
+.I Y
+can be any character not occurring in
+\fIif-false\fR.
+.PP
+Eithe or both of the
+.I X
+or
+.I Y
+pairs may instead be balanced pairs of
+braces ({ and\~}) as in the \fBsh\fR command.
+In either case, the \fIif-true\fR may contain balanced pairs of braces.
+None of these delimiters are seen inside strings.
+.PP
+All the usual relational operators my be used in conditional expressions;
+\fB!\&\fP (logical negation, not factorial), \fB&&\fP, \fB|\||\fP, \fB==\fP,
+\fB!=\fP, \fB>=\fP, \fB<=\fP, \fB<\fP, \fB>\fP.
+.PP
+String comparison is also supported using \fB==\fP and \fB!=\fP.
+String comparisons may need to be parenthesized to avoid syntactic
+ambiguities.
+.
+.
+.NH 1
+Interface To [gt]roff
+.PP
+The output of \fBpic\fP is \fB[gt]roff\fP drawing commands.
+The GNU \fIgpic\/\fP(1) command warns that it relies on drawing
+extensions present in \fIgroff\/\fP(1) that are not present in
+\fItroff\/\fP(1).
+.
+.NH 2
+Scaling Arguments
+.PP
+The DWB \fIpic\/\fP(1) program accepts one or two arguments to
+\&\fB.PS\fP, which is interpreted as a width and height in inches to
+which the results of \fIpic\/\fP(1) should be scaled (width and height
+scale independently).
+If there is only one argument, it is interpreted as a width to scale the
+picture to, and height is scaled by the same proportion.
+.PP
+GNU \fBgpic\fP is less general; it accepts a single width to scale
+to, or a zero width and a maximum height to scale to.
+With two non-zero arguments, it scales to the maximum height.
+.
+.NH 2
+How Scaling is Handled
+.PP
+When \fBpic\fP processes a picture description on input, it passes
+\fB.PS\fP, \fB.PE\fP, and \fB.PF\fP through to the postprocessor.
+The \fB.PS\fP gets decorated with two numeric arguments which are the X
+and Y\~dimensions of the picture in inches.
+The post-processor can use these to reserve space for the picture and
+center it.
+.PP
+The GNU incarnation of the \fBms\fP macro package, for example, includes
+the following definitions:
+.KS
+.DS
+.ps -1
+.vs -1
+.CW
+\&.de PS
+\&.br
+\&.sp \e\en[DD]u
+\&.ie \e\en[.$]<2 .@error bad arguments to PS (not preprocessed with pic?)
+\&.el \e{\e
+\&. ds@need (u;\e\e$1)+1v
+\&. in +(u;\e\en[.l]-\e\en[.i]-\e\e$2/2>?0)
+\&.\e}
+\&..
+\&.de PE
+\&.par@reset
+\&.sp \e\en[DD]u+.5m
+\&..
+.R
+.DE
+.ps
+.vs
+.KE
+.LP
+Equivalent definitions of these and of \fB.PF\fP are supplied by GNU
+\fIpic\/\fP(1) if you use the \-mpic option; this should make it usable
+with macro pages other than \fIms\/\fR(1).
+.PP
+If \fB.PF\fP is used instead of \fB.PE\fP, the \fBtroff\fP position is
+restored to what it was at the picture start (Kernighan notes that
+the\~F stands for \[lq]flyback\[rq]).
+.PP
+The invocation
+.DS
+\&\fB.PS <\,\fP\fIfile\fP
+.DE
+.LP
+causes the contents of \fIfile\fP to replace the \fB.PS\fP line.
+This feature is deprecated; use `\fBcopy\fP \fIfile\fR' instead.
+.
+.NH 2
+PIC and [gt]roff commands
+.PP
+By default, input lines that begin with a period are passed to the
+postprocessor, embedded at the corresponding point in the output.
+Messing with horizontal or vertical spacing is an obvious recipe for
+bugs, but point size and font changes are usually safe.
+.PP
+Point sizes and font changes are also safe within text strings, as
+long as they are undone before the end of string.
+.PP
+The enablement of output line filling by \fB[gt]roff\fP is preserved
+across pictures.
+.
+.NH 2
+PIC and EQN
+.PP
+The Kernighan paper notes that there is a subtle problem with
+complicated equations inside \fBpic\fR pictures; they come out wrong if
+\fIeqn\/\fP(1) has to leave extra vertical space for the equation.
+If your equation involves more than subscripts and superscripts, you
+must add to the beginning of each equation the extra information
+\fBspace\~0\fP.
+He gives the following example:
+.KS
+.DS
+.CW
+arrow
+box "$space 0 {H( omega )} over {1 - H( omega )}$"
+arrow
+.R
+.DE
+.KE
+.EQ
+delim @@
+.EN
+.KS
+.PS
+arrow
+box "@space 0 {H( omega )} over {1 - H( omega )}@"
+arrow
+.PE
+.CE "1: Equations within pictures"
+.
+.NH 2
+Absolute Positioning of Pictures
+.PP
+A \fBpic\fP picture is positioned vertically by troff at the current
+position.
+The topmost position possible on a page is not the paper edge
+but a position which is one baseline lower so that the first row of glyphs
+is visible.
+To make a picture really start at the paper edge you have to make the
+baseline-to-baseline distance zero, this is, you must set the vertical
+spacing to\~0 (using \fB.vs\fP) before starting the picture.
+.
+.
+.NH 1
+Interface to TeX
+.PP
+.PP
+\*[tx] mode is enabled by the
+.B \-t
+option.
+In \*[tx] mode, pic defines a vbox called
+.B \egraph
+for each picture; the name can be changed with the pseudo-variable
+.B figname
+(which is actually a specially parsed command).
+You must yourself print that vbox using, for example, the command
+.RS
+.LP
+.CW
+\ecenterline{\ebox\egraph}
+.RE
+.LP
+Actually, since the vbox has a height of zero (it is defined with \evtop)
+this produces slightly more vertical space above the picture than
+below it;
+.RS
+.LP
+.CW
+\ecenterline{\eraise 1em\ebox\egraph}
+.RE
+.LP
+would avoid this.
+.PP
+To make the vbox having a positive height and a depth of zero (as used
+e.g.\& by \*(lx's \f(CW\%graphics.sty\fP), define the following macro in
+your document:
+.KS
+.DS
+.CW
+\edef\egpicbox#1{%
+ \evbox{\eunvbox\ecsname #1\eendcsname\ekern 0pt}}
+.R
+.DE
+.KE
+.LP
+Now you can simply say
+.B \egpicbox{graph}
+instead of \ebox\egraph.
+.PP
+You must use a \*[tx] driver that supports the
+.B tpic
+specials, version\~2.
+.PP
+Lines beginning with
+.B \e
+are passed through transparently; a
+.B %
+is added to the end of the line to avoid unwanted spaces.
+You can safely use this feature to change fonts or to
+change the value of \fB\ebaselineskip\fP.
+Anything else may well produce undesirable results; use at your own risk.
+Lines beginning with a period are not given any special treatment.
+.PP
+The \*[tx] mode of \fIpic\/\fP(1) does \fInot\fP translate \fBtroff\fP
+font and size changes included in text strings!
+.PP
+Here an example how to use \fBfigname\fP.
+.KS
+.DS
+.CW
+\&.PS
+figname = foo;
+\&...
+\&.PE
+
+\&.PS
+figname = bar;
+\&...
+\&.PE
+
+\ecenterline{\ebox\efoo \ehss \ebox\ebar}
+.DE
+.R
+.KE
+.LP
+Use this feature sparsingly and only if really needed:
+A different name means a new box register in \*[tx], and the maximum number
+of box registers is only 256.
+Also be careful not to use a predefined \*[tx] or \*[lx] macro name as
+an argument to \fBfigname\fP since this inevitably causes an error.
+.
+.
+.NH 1
+Obsolete Commands
+.PP
+GNU \fIgpic\/\fP(1) has a command
+.DS
+\fBplot\fR \fIexpr\fR [\fB"\fItext\fB"\fR]
+.DE
+This is a text object which is constructed by using
+.I text
+as a format string for sprintf
+with an argument of
+\fIexpr\fP.
+If
+.I text
+is omitted a format string of \fB"%g"\fP is used.
+Attributes can be specified in the same way as for a normal text
+object.
+Be very careful that you specify an appropriate format string;
+\fBpic\fP does only very limited checking of the string.
+This is deprecated in favour of
+\fBsprintf\fP.
+.
+.
+.NH 1
+Some Larger Examples
+.PP
+Here are a few larger examples, with complete source code.
+One of our earlier examples is generated in an instructive way using a
+for loop:
+.KS
+.DS
+.ps -1
+.vs -1
+.CW
+\&.PS
+# Draw a demonstration up left arrow with grid box overlay
+define gridarrow
+{
+ move right 0.1
+ [
+ {arrow up left $1;}
+ box wid 0.5 ht 0.5 dotted with .nw at last arrow .end;
+ for i = 2 to ($1 / 0.5) do
+ {
+ box wid 0.5 ht 0.5 dotted with .sw at last box .se;
+ }
+ move down from last arrow .center;
+ [
+ sprintf("\efBarrow up left %g\efP", $1)
+ ]
+ ]
+ move right 0.1 from last [] .e;
+}
+gridarrow(0.5);
+gridarrow(1);
+gridarrow(1.5);
+gridarrow(2);
+undef gridarrow
+\&.PE
+.R
+.DE
+.ps
+.vs
+.KE
+.KS
+.PS
+# Draw a demonstration up left arrow with grid box overlay
+define gridarrow
+{
+ move right 0.5
+ [
+ {arrow up left $1;}
+ box wid 0.5 ht 0.5 dotted with .nw at last arrow .end;
+ for i = 2 to ($1 / 0.5) do {
+ box wid 0.5 ht 0.5 dotted with .sw at last box .se;
+ }
+ move down from last arrow .center;
+ [
+ sprintf("\fBarrow up left %g\fP", $1)
+ ]
+ ]
+ move right 0.1 from last [] .e;
+}
+gridarrow(0.5);
+gridarrow(1);
+gridarrow(1.5);
+gridarrow(2);
+undef gridarrow
+.PE
+.CE "1: Diagonal arrows (dotted boxes show the implied 0.5-inch grid)"
+.PP
+Here's an example concocted to demonstrate layout of a large,
+multiple-part pattern:
+.KS
+.DS
+.ps -1
+.vs -1
+.CW
+\&.PS
+define filter {box ht 0.25 rad 0.125}
+lineht = 0.25;
+Top: [
+ right;
+ box "\efBms\efR" "sources";
+ move;
+ box "\efBHTML\efR" "sources";
+ move;
+ box "\efBlinuxdoc-sgml\efP" "sources" wid 1.5;
+ move;
+ box "\efBTexinfo\efP" "sources";
+
+ line down from 1st box .s lineht;
+ A: line down;
+ line down from 2nd box .s; filter "\efBhtml2ms\efP";
+ B: line down;
+ line down from 3rd box .s; filter "\efBformat\efP";
+ C: line down;
+ line down from 4th box .s; filter "\efBtexi2roff\efP";
+ D: line down;
+]
+move down 1 from last [] .s;
+Anchor: box wid 1 ht 0.75 "\efBms\efR" "intermediate" "form";
+arrow from Top.A.end to Anchor.nw;
+arrow from Top.B.end to 1/3 of the way between Anchor.nw and Anchor.ne;
+arrow from Top.C.end to 2/3 of the way between Anchor.nw and Anchor.ne;
+arrow from Top.D.end to Anchor.ne
+{
+ # PostScript column
+ move to Anchor .sw;
+ line down left then down ->;
+ filter "\efBpic\efP";
+ arrow;
+ filter "\efBeqn\efP";
+ arrow;
+ filter "\efBtbl\efP";
+ arrow;
+ filter "\efBgroff\efP";
+ arrow;
+ box "PostScript";
+
+ # HTML column
+ move to Anchor .se;
+ line down right then down ->;
+ A: filter dotted "\efBpic2img\efP";
+ arrow;
+ B: filter dotted "\efBeqn2html\efP";
+ arrow;
+ C: filter dotted "\efBtbl2html\efP";
+ arrow;
+ filter "\efBms2html\efP";
+ arrow;
+ box "HTML";
+
+ # Nonexistence caption
+ box dashed wid 1 at B + (2,0) "These tools" "don't yet exist";
+ line chop 0 chop 0.1 dashed from last box .nw to A.e ->;
+ line chop 0 chop 0.1 dashed from last box .w to B.e ->;
+ line chop 0 chop 0.1 dashed from last box .sw to C.e ->;
+}
+\&.PE
+.R
+.DE
+.ps
+.vs
+.KE
+.KS
+.PS
+define filter {box ht 0.25 rad 0.125}
+lineht = 0.25;
+Top: [
+ right;
+ box "\fBms\fR" "sources";
+ move;
+ box "\fBHTML\fR" "sources";
+ move;
+ box "\fBlinuxdoc-sgml\fP" "sources" wid 1.5;
+ move;
+ box "\fBTexinfo\fP" "sources";
+
+ line down from 1st box .s lineht;
+ A: line down;
+ line down from 2nd box .s; filter "\fBhtml2ms\fP";
+ B: line down;
+ line down from 3rd box .s; filter "\fBformat\fP";
+ C: line down;
+ line down from 4th box .s; filter "\fBtexi2roff\fP";
+ D: line down;
+]
+move down 1 from last [] .s;
+Anchor: box wid 1 ht 0.75 "\fBms\fR" "intermediate" "form";
+arrow from Top.A.end to Anchor.nw;
+arrow from Top.B.end to 1/3 of the way between Anchor.nw and Anchor.ne;
+arrow from Top.C.end to 2/3 of the way between Anchor.nw and Anchor.ne;
+arrow from Top.D.end to Anchor.ne
+{
+ # PostScript column
+ move to Anchor .sw;
+ line down left then down ->;
+ filter "\fBpic\fP";
+ arrow;
+ filter "\fBeqn\fP";
+ arrow;
+ filter "\fBtbl\fP";
+ arrow;
+ filter "\fBgroff\fP";
+ arrow;
+ box "PostScript";
+
+ # HTML column
+ move to Anchor .se;
+ line down right then down ->;
+ A: filter dotted "\fBpic2img\fP";
+ arrow;
+ B: filter dotted "\fBeqn2html\fP";
+ arrow;
+ C: filter dotted "\fBtbl2html\fP";
+ arrow;
+ filter "\fBms2html\fP";
+ arrow;
+ box "HTML";
+
+ # Nonexistence caption
+ box dashed wid 1 at B + (2,0) "These tools" "don't yet exist";
+ line chop 0 chop 0.1 dashed from last box .nw to A.e ->;
+ line chop 0 chop 0.1 dashed from last box .w to B.e ->;
+ line chop 0 chop 0.1 dashed from last box .sw to C.e ->;
+}
+.PE
+.CE "2: Hypothetical production flow for dual-mode publishing"
+.PP
+.KS
+.PS
+# a three-dimensional block
+#
+# tblock(<width>, <height>, <text>)
+
+define tblock { [
+ box ht $2 wid $1 \
+ color "gold" outlined "black" \
+ xslanted 0 yslanted 0 \
+ $3;
+ box ht .1 wid $1 \
+ color "yellow" outlined "black" \
+ xslanted .1 yslanted 0 \
+ with .sw at last box .nw;
+ box ht $2 wid .1 \
+ color "goldenrod" outlined "black" \
+ xslanted 0 yslanted .1 \
+ with .nw at 2nd last box .ne;
+] }
+
+tblock(1, .5, "Master" "1");
+move -.1
+tblock(.5, 1, "Slave");
+.PE
+.CE "3: Three-dimensional Boxes"
+.PP
+Here the source code for figure \n[H1]-3:
+.KS
+.DS
+.CW
+\&.PS
+# a three-dimensional block
+#
+# tblock(<width>, <height>, <text>)
+
+define tblock { [
+ box ht $2 wid $1 \e
+ color "gold" outlined "black" \e
+ xslanted 0 yslanted 0 \e
+ $3;
+ box ht .1 wid $1 \e
+ color "yellow" outlined "black" \e
+ xslanted .1 yslanted 0 \e
+ with .sw at last box .nw;
+ box ht $2 wid .1 \e
+ color "goldenrod" outlined "black" \e
+ xslanted 0 yslanted .1 \e
+ with .nw at 2nd last box .ne;
+] }
+
+tblock(1, .5, "Master" "1");
+move -.1
+tblock(.5, 1, "Slave");
+\&.PE
+.DE
+.ft R
+.KE
+.
+.
+.
+.NH 1
+PIC Reference
+.PP
+This is an annotated grammar of \fBpic\fP.
+.
+.NH 2
+Lexical Items
+.PP
+In general, \fBpic\fP is a free-format, token-oriented language that
+ignores whitespace outside strings.
+But certain lines and constructs are specially interpreted at the
+lexical level:
+.PP
+A comment begins with \fB#\fP and continues to \fB\en\fP (comments may
+also follow text in a line).
+A line beginning with a period or backslash may be interpreted as text
+to be passed through to the post-processor, depending on command-line
+options.
+An end-of-line backslash is interpreted as a request to continue the
+line; the backslash and following newline are ignored.
+.PP
+.RS
+Here are the grammar terminals:
+.IP \s[-1]INT\s[0]
+A positive integer.
+.IP \s[-1]NUMBER\s[0]
+A floating point numeric constant.
+May contain a decimal point or be expressed in scientific notation in
+the style of \fIprintf\/\fP(3)'s %e escape.
+A trailing `i' or `I' (indicating the unit `inch') is ignored.
+.IP \s[-1]TEXT\s[0]
+A string enclosed in double quotes.
+A double quote within \s[-1]TEXT\s[0] must be preceded by a backslash.
+Instead of \s[-1]TEXT\s[0] you can use
+.DS
+.CW
+sprintf ( TEXT [, <expr> ...] )
+.R
+.DE
+.IP
+except after the `until' and `last' keywords, and after all ordinal
+keywords (`th' and friends).
+.IP \s[-1]VARIABLE\s[0]
+A string starting with a character from the set [a-z], optionally
+followed by one or more characters of the set [a-zA-Z0-9_].
+(Values of variables are preserved across pictures.)
+.IP \s[-1]LABEL\s[0]
+A string starting with a character from the set [A-Z], optionally
+followed by one or more characters of the set [a-zA-Z0-9_].
+.IP \s[-1]COMMAND-LINE\s[0]
+A line starting with a command character (`.' in groff mode, `\e' in
+\*[tx] mode).
+.IP \s[-1]BALANCED-TEXT\s[0]
+A string either enclosed by `{' and `}' or with \fIX\fP and \fIX\fP,
+where \fIX\fP doesn't occur in the string.
+.IP \s[-1]BALANCED-BODY\s[0]
+Delimiters as in \s[-1]BALANCED-TEXT\s[0]; the body is interpreted as
+`\fB\[la]command\[ra].\|.\|.\fP'.
+.IP \s[-1]FILENAME\s[0]
+The name of a file.
+This has the same semantics as \s[-1]TEXT\s[0].
+.IP \s[-1]MACRONAME\s[0]
+Either \s[-1]VARIABLE\s[0] or \s[-1]LABEL\s[0].
+.RE
+.
+.NH 2
+Semi-Formal Grammar
+.PP
+Tokens not enclosed in \[la]\|\[ra] are literals, except:
+.IP 1.
+\fB\en\fP is a newline.
+.IP 2.
+Three dots is a suffix meaning `replace with 0 or more repetitions
+of the preceding element(s).
+.IP 3.
+An enclosure in square brackets has its usual meaning of `this clause is
+optional'.
+.IP 4.
+Square-bracket-enclosed portions within tokens are optional.
+Thus, `h\^[eigh]\^t' matches either `height' or `ht'.
+.LP
+If one of these special tokens has to be referred to literally, it is
+surrounded with single quotes.
+.PP
+The top-level \fBpic\fP object is a picture.
+.DS
+.CW
+<picture> ::=
+ .PS [NUMBER [NUMBER]]\en
+ <statement> ...
+ .PE \en
+.R
+.DE
+.PP
+The arguments, if present, represent the width and height of the picture,
+causing \fBpic\fR to attempt to scale it to the given dimensions in
+inches.
+In no case, however, the X and Y\~dimensions of the picture exceed the
+values of the style variables \fBmaxpswid\fP and \fBmaxpsheight\fP
+(which default to the normal 8.5\^i by 11\^i page size).
+.PP
+If the ending `.PE' is replaced by `.PF', the page vertical position is
+restored to its value at the time `.PS' was encountered.
+Another alternate form of invocation is `.PS\~<\s[-1]FILENAME\s[0]',
+which replaces the `.PS' line with a file to be interpreted by \fBpic\fR
+(but this feature is deprecated).
+.PP
+The `.PS', `.PE', and `.PF' macros to perform centering and scaling are
+normally supplied by the post-processor.
+.PP
+In the following, either `|' or a new line starts an alternative.
+.DS
+.CW
+<statement> ::=
+ <command> ;
+ <command> \en
+.R
+.DE
+.DS
+.CW
+<command> ::=
+ <primitive> [<attribute>]
+ LABEL : [;] <command>
+ LABEL : [;] <command> [<position>]
+ { <command> ... }
+ VARIABLE [:] = <any-expr>
+ figname = MACRONAME
+ up | down | left | right
+ COMMAND-LINE
+ command <print-arg> ...
+ print <print-arg> ...
+ sh BALANCED-TEXT
+ copy FILENAME
+ copy [FILENAME] thru MACRONAME [until TEXT]
+ copy [FILENAME] thru BALANCED-BODY [until TEXT]
+ for VARIABLE = <expr> to <expr> [by [*] <expr>] do BALANCED-BODY
+ if <any-expr> then BALANCED-BODY [else BALANCED-BODY]
+ reset [VARIABLE [[,] VARIABLE ...]]
+.R
+.DE
+.DS
+.CW
+<print-arg> ::=
+ TEXT
+ <expr>
+ <position>
+.R
+.DE
+.PP
+The current position and direction are saved on entry to a
+ `{\~.\|.\|.\~}' construction and restored on exit from it.
+.PP
+Note that in `if' constructions, newlines can only occur in
+\s[-1]BALANCED-BODY\s[0].
+This means that
+.DS
+.CW
+if
+{ ... }
+else
+{ ... }
+.R
+.DE
+.PP
+fails.
+You have to use the braces on the same line as the keywords:
+.DS
+.CW
+if {
+\&...
+} else {
+\&...
+}
+.R
+.DE
+.PP
+This restriction doesn't hold for the body after the `do' in a `for'
+construction.
+.PP
+At the beginning of each picture, `figname' is reset to the vbox name
+`graph'; this command has only a meaning in \*[tx] mode.
+While the grammar rules allow digits and the underscore in the value of
+`figname', \*[tx] normally accepts uppercase and lowercase letters only
+as box names (you have to use `\ecsname' if you really need to
+circumvent this limitation).
+.DS
+.CW
+<any-expr> ::=
+ <expr>
+ <text-expr>
+ <any-expr> <logical-op> <any-expr>
+ ! <any-expr>
+.R
+.DE
+.DS
+.CW
+<logical-op> ::=
+ == | != | && | '||'
+.R
+.DE
+.DS
+.CW
+<text-expr> ::=
+ TEXT == TEXT
+ TEXT != TEXT
+.R
+.DE
+.PP
+Logical operators are handled specially by \fBpic\fP since they can
+deal with text strings also.
+\fBpic\fP uses \%\fIstrcmp\/\fP(3) to test for equality of strings; an
+empty string is considered as `false' for `&&' and `|\||'.
+.DS
+.CW
+<primitive> ::=
+ box \fR# closed object \[em] rectangle\fP
+ circle \fR# closed object \[em] circle\fP
+ ellipse \fR# closed object \[em] ellipse\fP
+ arc \fR# open object \[em] quarter-circle\fP
+ line \fR# open object \[em] line\fP
+ arrow \fR# open object \[em] line with arrowhead\fP
+ spline \fR# open object \[em] spline curve\fP
+ move
+ TEXT TEXT ... \fR# text within invisible box\fP
+ plot <expr> TEXT \fR# formatted text\fP
+ '[' <command> ... ']'
+.R
+.DE
+.PP
+Drawn objects within `[\~.\|.\|.\~]' are treated as a single composite
+object with a rectangular shape (that of the bounding box of all the
+elements).
+Variable and label assignments within a block are local to the block.
+Current direction of motion is restored to the value at start of block
+upon exit.
+Position is \fInot\fR restored (unlike `{\~}');
+instead, the current position becomes the exit position for the current
+direction on the block's bounding box.
+.DS
+.CW
+<attribute> ::=
+ h[eigh]t <expr> \fR# set height of closed figure\fP
+ wid[th] <expr> \fR# set width of closed figure\fP
+ rad[ius] <expr> \fR# set radius of circle/arc\fP
+ diam[eter] <expr> \fR# set diameter of circle/arc\fP
+ up [<expr>] \fR# move up\fP
+ down [<expr>] \fR# move down\fP
+ left [<expr>] \fR# move left\fP
+ right [<expr>] \fR# move right\fP
+ from <position> \fR# set from position of open figure\fP
+ to <position> \fR# set to position of open figure\fP
+ at <position> \fR# set center of open figure\fP
+ with <path> \fR# fix corner/named point at specified location\fP
+ with <position> \fR# fix position of object at specified location\fP
+ by <expr-pair> \fR# set object's attachment point\fP
+ then \fR# sequential segment composition\fP
+ dotted [<expr>] \fR# set dotted line style\fP
+ dashed [<expr>] \fR# set dashed line style\fP
+ thick[ness] <expr> \fR# set thickness of lines\fP
+ chop [<expr>] \fR# chop end(s) of segment\fP
+ '->' | '<-' | '<->' \fR# decorate with arrows\fP
+ invis[ible] \fR# make primitive invisible\fP
+ solid \fR# set solid line style\fP
+ fill[ed] [<expr>] \fR# fill closed figure with optional density\fP
+ xscaled <expr> \fR# slant box into x direction\fP
+ yscaled <expr> \fR# slant box into y direction\fP
+ colo[u]r[ed] TEXT \fR# set fill and outline color for figure\fP
+ outline[d] TEXT \fR# set outline color for figure\fP
+ shaded TEXT \fR# set fill color for figure\fP
+ same \fR# copy size of previous object\fP
+ cw | ccw \fR# set orientation of curves\fP
+ ljust | rjust \fR# adjust text horizontally\fP
+ above | below \fR# adjust text vertically\fP
+ aligned \fR# align parallel to object\fP
+ TEXT TEXT ... \fR# text within object\fP
+ <expr> \fR# motion in the current direction\fR
+.R
+.DE
+.PP
+Missing attributes are supplied from defaults; inappropriate ones are
+silently ignored.
+For lines, splines, and arcs, height and width refer to arrowhead size.
+.PP
+The `at' primitive sets the center of the current object.
+The `with' attribute fixes the specified feature of the given object to
+a specified location.
+(Note that `with' is incorrectly described in the Kernighan paper.)
+.PP
+The `by' primitive is not documented in the tutorial portion of
+the Kernighan paper, and should probably be considered unreliable.
+.PP
+The primitive `arrow' is a synonym for `line\~->'.
+.PP
+Text is normally an attribute of some object, in which case successive
+strings are vertically stacked and centered on the object's center by
+default.
+Standalone text is treated as though placed in an invisible box.
+.PP
+A text item consists of a string or sprintf-expression, optionally
+followed by positioning information.
+Text (or strings specified with `sprintf') may contain font changes,
+size changes, and local motions, provided those changes are undone
+before the end of the current item.
+Text may also contain \e-escapes denoting special characters.
+The base font and specific set of escapes supported is implementation
+dependent, but supported escapes always include the following:
+.IP "\efR, \ef1" \w'\efR,\~\ef3'u+2n
+Set Roman style (the default)
+.IP "\efI, \ef2"
+Set Italic style
+.IP "\efB, \ef3"
+Set Bold style
+.IP \efP
+Revert to previous style; only works one level deep, does not stack.
+.PP
+Color names are dependent on the \gBpic\fR implementation, but in
+all modern versions color names recognized by the X\~window system are
+supported.
+.PP
+A position is an (x,y) coordinate pair.
+There are lots of different ways to specify positions:
+.DS
+.CW
+<position> ::=
+ <position-not-place>
+ <place>
+ ( <position> )
+.R
+.DE
+.DS
+.CW
+<position-not-place> ::=
+ <expr-pair>
+ <position> + <expr-pair>
+ <position> - <expr-pair>
+ ( <position> , <position> )
+ <expr> [of the way] between <position> and <position>
+ <expr> '<' <position> , <position> '>'
+.R
+.DE
+.DS
+.CW
+<expr-pair> ::=
+ <expr> , <expr>
+ ( expr-pair )
+.R
+.DE
+.DS
+.CW
+<place> ::=
+ <label>
+ <label> <corner>
+ <corner> [of] <label>
+ Here
+.R
+.DE
+.DS
+.CW
+<label> ::=
+ LABEL [. LABEL ...]
+ <nth-primitive>
+.R
+.DE
+.DS
+.CW
+<corner> ::=
+ .n | .e | .w | .s
+ .ne | .se | .nw | .sw
+ .c[enter] | .start | .end
+ .t[op] | .b[ot[tom]] | .l[eft] | .r[ight]
+ left | right | <top-of> | <bottom-of>
+ <north-of> | <south-of> | <east-of> | <west-of>
+ <center-of> | <start-of> | <end-of>
+ upper left | lower left | upper right | lower right
+.R
+.DE
+.DS
+.CW
+<\,\f(CIxxx\/\fP-of> ::=
+ \f(CIxxx\fP \fR# followed by `of'\fP
+.R
+.DE
+.DS
+.CW
+<nth-primitive> ::=
+ <ordinal> <object-type>
+ [<ordinal>] last <object-type>
+.R
+.DE
+.DS
+.CW
+<ordinal> ::=
+ INT th
+ INT st | INT nd | INT rd
+ ` <any-expr> 'th
+.R
+.DE
+.DS
+.CW
+<object-type> ::=
+ box
+ circle
+ ellipse
+ arc
+ line
+ arrow
+ spline
+ '[]'
+ TEXT
+.R
+.DE
+.PP
+As Kernighan notes, \[lq]since barbarisms like \fB1th\fP and \fB3th\fP are
+barbaric, synonyms like \fB1st\fP and \fB3rd\fP are accepted as well.\[rq]
+Objects of a given type are numbered from 1 upwards in order of
+declaration; the \fBlast\fP modifier counts backwards.
+.PP
+The \[lq]'th\[rq] form (which allows you to select a previous object with
+an expression, as opposed to a numeric literal) is not documented in DWB's
+\fIpic\/\fR(1).
+.PP
+The \[la]\,\fIxxx\/\fP-of\|\[ra] rule is special: The lexical parser checks whether
+\fIxxx\fP is followed by the token `of' without eliminating it so that
+the grammar parser can still see `of'.
+Valid examples of specifying a place with corner and label are thus
+.DS
+.CW
+A .n
+\&.n of A
+\&.n A
+north of A
+.R
+.DE
+.LP
+while
+.DS
+.CW
+north A
+A north
+.R
+.DE
+both cause a syntax error.
+(DWB \fBpic\fP also allows the weird form `A\~north\~of'.)
+.PP
+Here the special rules for the `with' keyword using a path:
+.DS
+.CW
+<path> ::=
+ <relative-path>
+ ( <relative-path> , <relative-path> )
+.R
+.DE
+.DS
+.CW
+<relative-path> ::=
+ <corner>
+ . LABEL [. LABEL ...] [<corner>]
+.R
+.DE
+.PP
+The following style variables control output:
+.TS H
+center tab(@), linesize(2);
+lb | lb | lb
+l | n | l.
+.sp 2p
+Style Variable@Default@What It Does
+.sp 2p
+_
+.sp 2p
+.TH
+boxht@0.5@Default height of a box
+boxwid@0.75@Default width of a box
+lineht@0.5@Default length of vertical line
+linewid@0.75@Default length of horizontal line
+arcrad @0.25@Default radius of an arc
+circlerad@0.25@Default radius of a circle
+ellipseht@0.5@Default height of an ellipse
+ellipsewid@0.75@Default width of an ellipse
+moveht@0.5@Default length of vertical move
+movewid@0.75@Default length of horizontal move
+textht@0@Default height of box enclosing a text object
+textwid@0@Default width of box enclosing a text object
+arrowht@0.1@Length of arrowhead along shaft
+arrowwid@0.05@Width of rear of arrowhead
+arrowhead@1@Enable/disable arrowhead filling
+dashwid@0.05@Interval for dashed lines
+maxpswid@8.5@Maximum width of picture
+maxpsht@11@Maximum height of picture
+scale@1@Unit scale factor
+fillval@0.5@Default fill value
+.sp 5p
+_
+.TE
+Any of these can be set by assignment, or reset using the \fBreset\fP
+statement.
+Style variables assigned within `[\~]' blocks are restored to their
+beginning-of-block value on exit; top-level assignments persist across
+pictures.
+Dimensions are divided by \fBscale\fR on output.
+.PP
+All \fBpic\fP expressions are evaluated in floating point; units
+are always inches (a trailing `i' or `I' is ignored).
+Expressions have the following simple grammar, with semantics very
+similar to C\~expressions:
+.DS
+.CW
+<expr> ::=
+ VARIABLE
+ NUMBER
+ <place> <place-attribute>
+ <expr> <op> <expr>
+ - <expr>
+ ( <any-expr> )
+ ! <expr>
+ <func1> ( <any-expr> )
+ <func2> ( <any-expr> , <any-expr> )
+ rand ( )
+.R
+.DE
+.DS
+.CW
+<place-attribute>
+ .x | .y | .h[eigh]t | .wid[th] | .rad
+.R
+.DE
+.DS
+.CW
+<op> ::=
+ + | - | * | / | % | ^ | '<' | '>' | '<=' | '>='
+.R
+.DE
+.DS
+.CW
+<func1> ::=
+ sin | cos | log | exp | sqrt | int | rand | srand
+.R
+.DE
+.DS
+.CW
+<func2> ::=
+ atan2 | max | min
+.R
+.DE
+.LP
+Both \fBexp\fP and \fBlog\fP are base 10; \fBint\fP does integer
+truncation; and \fBrand()\fP returns a random number in [0-1).
+.PP
+There are \fBdefine\fP and \fBundef\fR statements which are not part
+of the grammar (they behave as pre-processor macros to the language).
+These may be used to define pseudo-functions.
+.DS
+.CW
+\fBdefine\fP \fIname\fP \fB{\fP \fIreplacement-text\fP \fB}\fP
+.R
+.DE
+.LP
+This defines \fIname\fR as a macro to be replaced by the replacement
+text (not including the braces).
+The macro may be called as
+.DS
+.CW
+\fIname\/\fB(\,\fIarg1, arg2, .\|.\|., argn\fB\/)\fR
+.R
+.DE
+.LP
+The arguments (if any) are substituted for tokens $1, $2 \&.\|.\|.\& $n
+appearing in the replacement text.
+To undefine a macro, say \fBundef\fP \fIname\fR, specifying the name to
+be undefined.
+.\"%%POSTLUDE%%
+.
+.
+.NH 1
+History and Acknowledgements
+.PP
+Original \fBpic\fP was written to go with Joseph Ossanna's original
+\fItroff\/\fP(1) by Brian Kernighan, and later re-written by Kernighan
+with substantial enhancements (apparently as part of the evolution of
+\fItroff\/\fP(1) into \fIditroff\/\fP(1) to generate
+device-independent output).
+.PP
+The language had been inspired by some earlier graphics languages
+including \fBideal\fP and \fBgrap\fP.
+Kernighan credits Chris van Wyk (the designer of \fBideal\fP) with many
+of the ideas that went into
+\fBpic\fP.
+.PP
+.\" the original definitions of EQ and EN cause insertion of vertical
+.\" space which is not appropriate here
+.de EQ
+..
+.de EN
+..
+.EQ
+delim $$
+.EN
+The \fBpic\fP language was originally described by Brian Kernighan in
+Bell Labs Computing Science Technical Report #116 (you can obtain a
+PostScript copy of the revised version, [1], by sending a mail message to
+\fInetlib@research.att.com\fP with a body of `send 116 from
+research/cstr').
+There have been two revisions, in 1984 and 1991.
+.PP
+The document you are reading effectively subsumes Kernighan's
+description; it was written to fill in lacun\[ae] in the exposition and
+integrate in descriptions of the GNU \fIgpic\/\fP(1) and
+\fIpic2plot\/\fP(1) features.
+.PP
+The GNU \fBgpic\fR implementation was written by James Clark
+\[la]\,\fIjjc@jclark.com\/\fP\[ra].
+.PP
+The GNU \fBpic2plot\fR implementation is based on James Clark's parser
+code and maintained by Robert Maier, principal author of \fBplotutils\fP.
+.
+.
+.NH 1
+Bibliography
+.IP 1.
+Kernighan, B. W.
+\fBPIC \[em] A Graphics Language for Typesetting
+(Revised User Manual)\fP.
+Bell Labs Computing Science Technical Report #116, December 1991.
+.IP 2.
+Van Wyk, C. J.
+\fBA high-level language for specifying pictures\fP.
+\fIACM Transactions On Graphics\fP 1,2 (1982) 163-182.
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" End:
+.\" vim: filetype=groff:
diff --git a/doc/txi-en.tex b/doc/txi-en.tex
new file mode 100644
index 0000000..640a355
--- /dev/null
+++ b/doc/txi-en.tex
@@ -0,0 +1,74 @@
+% $Id: txi-en.tex 5191 2013-02-23 00:11:18Z karl $
+% txi.en.tex -- English non-translations for texinfo.tex. This is read
+% when a source document says @documentlanguage en (which might happen
+% after another @documentlanguage). The actual values are the same as
+% the defaults.
+%
+% Copyright 1999, 2007, 2008 Free Software Foundation.
+%
+% 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 3 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, see <http://www.gnu.org/licenses/>.
+
+\txisetlanguage{USenglish}{2}{3}
+
+\plainnonfrenchspacing
+
+\gdef\putwordAppendix{Appendix}
+\gdef\putwordChapter{Chapter}
+\gdef\putworderror{error}
+\gdef\putwordfile{file}
+\gdef\putwordin{in}
+\gdef\putwordIndexIsEmpty{(Index is empty)}
+\gdef\putwordIndexNonexistent{(Index is nonexistent)}
+\gdef\putwordInfo{Info}
+\gdef\putwordInstanceVariableof{Instance Variable of}
+\gdef\putwordMethodon{Method on}
+\gdef\putwordNoTitle{No Title}
+\gdef\putwordof{of}
+\gdef\putwordon{on}
+\gdef\putwordpage{page}
+\gdef\putwordsection{section}
+\gdef\putwordSection{Section}
+\gdef\putwordsee{see}
+\gdef\putwordSee{See}
+\gdef\putwordShortTOC{Short Contents}
+\gdef\putwordTOC{Table of Contents}
+%
+\gdef\putwordMJan{January}
+\gdef\putwordMFeb{February}
+\gdef\putwordMMar{March}
+\gdef\putwordMApr{April}
+\gdef\putwordMMay{May}
+\gdef\putwordMJun{June}
+\gdef\putwordMJul{July}
+\gdef\putwordMAug{August}
+\gdef\putwordMSep{September}
+\gdef\putwordMOct{October}
+\gdef\putwordMNov{November}
+\gdef\putwordMDec{December}
+%
+\gdef\putwordDefmac{Macro}
+\gdef\putwordDefspec{Special Form}
+\gdef\putwordDefvar{Variable}
+\gdef\putwordDefopt{User Option}
+\gdef\putwordDeffunc{Function}
+
+% Produces Day Month Year style of output.
+\def\today{%
+ \number\day\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \space\number\year}
diff --git a/doc/webpage.ms b/doc/webpage.ms
new file mode 100644
index 0000000..c5697d6
--- /dev/null
+++ b/doc/webpage.ms
@@ -0,0 +1,2580 @@
+.\" This file gives a small example how a web page could look like if
+.\" created with groff.
+.\"
+.\"
+.\" To make it work with other output devices also, we include
+.\" www.tmac directly.
+.\"
+.am pspic*error-hook
+. ab \\n[.F]:\\n[.c]: fatal error: PSPIC failed to include '\\$1'
+..
+.
+.nr PS 10
+.nr VS 12
+.if '\*[.T]'html' .nr LL 10i
+.if r ps4html .nr LL 10i
+.
+.mso www.tmac
+.
+.HEAD "<link rel=""stylesheet"" type=""text/css"" href=""groff.css"" >"
+.\" .HEAD "<link rel=""icon"" type=""image/png"" href=""http://www.gnu.org/graphics/gnu-mini.png"" >"
+.
+.ALN "#eeeeee" 30
+.
+.de blm-macro
+. nr tmp \\n[.i]
+. LP
+. in \\n[tmp]u
+..
+.blm blm-macro
+.
+.HX 1
+.
+.defcolor mydarkred rgb 0.65f 0.1f 0.2f
+.defcolor mydarkgreen rgb 0.1f 0.5f 0.2f
+.defcolor mydarkblue rgb 0.1f 0.2f 0.6f
+.
+.ds GNU \m[mydarkred]G\m[]\m[mydarkgreen]N\m[]\m[mydarkblue]U\m[]
+.
+.NHR
+.HTL
+.
+Home of Groff (GNU Troff).
+.
+.HTML-IMAGE-LEFT
+.PSPIC -L gnu.eps 2i 2i
+.ie r ps4html \{\
+. ll 10i
+. br
+. nop \v'-0.66i'\h'2.0i'\s[80]\*[GNU] Troff\s0
+. ll
+.\}
+.el \
+. nop \v'-0.66i'\h'2.0i'\s[60]\*[GNU] Troff\s0
+.HTML-IMAGE-END
+.
+.HR
+.
+.LNS
+.
+.DC T HIS mydarkred
+is the home page for groff (\c
+.URL http://\:www.gnu.org/ GNU
+Troff), which is a software typesetting package
+that reads plain text mixed with formatting commands
+and produces formatted output.
+.
+Output may be PostScript or PDF, html,
+or ASCII/UTF8 for display at the terminal.
+.
+Formatting commands may be either low-level typesetting requests
+(\[lq]primitives\[rq]) or macros from a supplied set.
+.
+Users may also write their own macros.
+.
+All three may be combined.
+
+Present on most Unix systems owing to its long association
+with Unix manuals (man pages),
+groff is capable of producing typographically sophisticated documents
+while consuming only minimal system resources.
+
+The source code of the currently released versions of groff is
+available at the
+.URL "http://\:ftp.gnu.org/\:gnu/\:groff/" "GNU host"
+and its mirrors;
+the current development version is available from a
+.URL "https://\:savannah.gnu.org/\:git/\:?group=groff" "git repository" .
+.
+The current version is 1.23.0 (March 2023).
+
+To view the git repository in your browser, use
+.URL "http://\:git.savannah.gnu.org/\:cgit/\:groff.git" \
+ "Savannah's cgit interface" .
+
+Additional contributions can be found
+.URL "http://\:groff.ffii.org/\:groff/\:contrib/" here .
+
+For a special version of groff on the Microsoft operating systems, see
+.URL "https://\:sf.net/\:projects/\:ezwinports/\:files/" \
+ "Groff for Windows"
+(version 1.21).
+
+Groff was originally written and maintained by James Clark; it
+is now maintained by the team at
+.MTO groff@\:gnu.org "" .
+.
+.HR
+.
+\s[-2]\f[I]This document was produced using
+.URL http://\:www.gnu.org/\:software/\:groff groff\~\n[.x].\n[.y].\n[.Y] .
+.br
+The image at the top has been contributed by Imogen Mulley,
+based on a similar picture found on the
+.URL http://\:www.gnu.org "GNU server" .
+.
+.
+.SH
+License
+.LP
+GNU troff is released under the
+.URL http://\:www.gnu.org/\:copyleft/\:gpl.html "GNU Copyright License" .
+The documentation is released under the
+.URL http://\:www.gnu.org/\:copyleft/\:fdl.html "Free Documentation License" .
+.
+.
+.SH
+README
+.LP
+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', `PDF', `TeX DVI' format, `HP LaserJet\~4'
+printers, `Canon CaPSL' printers, `HTML' and `XHTML' formats (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 J\[:o]rgen H\[:a]gg.
+
+See the file `INSTALL' for installation instructions on how to install from
+a release.
+You require a C++ compiler.
+
+The file `INSTALL.REPO' contains supplementary instructions for building
+directly from a clone of the repository.
+
+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 file `MORE.STUFF' contains information about add-on packages useful for
+`groff'.
+.
+.
+.SH
+Repository and FTP access
+.LP
+The most recent released version of `groff' is always available by
+.URL "ftp://\:ftp.gnu.org/\:gnu/\:groff" "anonymous ftp" .
+
+The current development version of `groff' is available from a
+.URL http://\:savannah.gnu.org/\:git/\:?group=groff "git repository" .
+
+To view the git repository in your browser, go to its
+.URL http://\:git.savannah.gnu.org/\:cgit/\:groff.git "browser interface" .
+.
+.
+.SH
+Groff dependencies
+.LP
+Depending on your requirements, you may need at least some of the
+following tools to build `groff' directly from its source:
+
+.in 2m
+.nf
+perl \[>=] v5.6.1 (see macro GROFF_PERL in file `m4/groff.m4')
+ghostscript
+the psutils package
+the netpbm package
+texinfo 5.0
+bison \[>=] 1.875b or byacc
+.fi
+.in
+
+Note that `texinfo' and `bison' or `byacc' are required only for building
+from repository sources (a checked-out working copy).
+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' < 5.0 works, and the original release of `bison'
+1.875 is known not to work; you \fImay\fP find that `bison' releases < 1.875
+work, but in case of difficulty, please update to a later version
+\fIbefore\fP posting a bug report.
+For \fIall\fP 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.
+
+Additionally, producing `PDF' output directly with the `gropdf' device needs
+a working installation of `perl'.
+The same is true for some other preprocessors like `chem'.
+
+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'.
+.
+.
+.SH
+Bug reports
+.LP
+Please report bugs using the project's
+.URL https://\:savannah.gnu.org/\:projects/\:groff "bug tracker" .
+
+You may use 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:
+this enables us to determine whether it really is a bug.
+.
+.
+.SH
+Mailing lists
+.LP
+Three mailing lists are available:
+
+.ULS
+.LI
+.MTO bug\-groff@\:gnu.org
+for following bug reports;
+
+.LI
+.MTO groff@\:gnu.org
+for general discussion of groff; and
+
+.LI
+.MTO groff\-commit@\:gnu.org "" ,
+a read-only list showing commits to the git repository.
+.ULE
+
+To subscribe, send a mail to \[la]list\[ra]\-request@\[la]domain\[ra]
+(example:
+.MTO groff\-request@\:gnu.org
+for the `groff' list) with the word `subscribe' in either the
+subject or body of the e-mail (don't include the quotes).
+Alternatively, you may subscribe by visiting the web pages at
+
+.in 2m
+.nf
+.URL http://lists.gnu.org/mailman/listinfo/bug\-groff
+.URL http://lists.gnu.org/mailman/listinfo/groff
+.URL http://lists.gnu.org/mailman/listinfo/groff\-commit
+.fi
+.in
+
+Each of these web pages also provides a link to a browseable archive of
+postings to the corresponding mailing list.
+.
+.
+.SH
+NEWS VERSION 1.22.3
+.LP
+.SH 2
+gxditview
+
+.ULS
+.LI
+X11 resources for gxditview, which were previously installed in
+/usr/X11/lib/X11/app\-defaults no matter which `prefix' was set, are
+now installed in appresdir=$prefix/lib/X11/app\-defaults.
+If `appresdir' is not a standard X11 resource directory, the environment
+variable XFILESEARCHPATH should be set to this path.
+The standard default directories depends on the system `libXt'.
+Common directories include:
+
+.in 2m
+.nf
+/usr/lib/X11/app\-defaults
+/usr/share/X11/app\-defaults
+/etc/X11/app\-defaults
+.fi
+.in
+
+Note that if the option `\-\-with\-appresdir' is passed to `configure', the
+`prefix' will not be added to `appresdir'.
+.ULE
+.
+.
+.SH 2
+glilypond
+
+.ULS
+.LI
+This new preprocessor (contributed by Bernd Warken) allows embedding of code
+for
+.URL http://\:www.lilypond.org "GNU LilyPond" ,
+a music typesetter.
+The data gets automatically processed and embedded as EPS images.
+.ULE
+.
+.
+.SH 2
+gperl
+
+.ULS
+.LI
+Bernd Warken contributed a new preprocessor to handle Perl code that can be
+evaluated and then processed by groff.
+.ULE
+.
+.
+.SH 2
+gpinyin
+
+.ULS
+.LI
+Another preprocessor from Bernd Warken to pretty-print Pinyin syllables like
+`guo2wang2' as `gu\['o]w\['a]ng'.
+.ULE
+.
+.
+.SH 2
+pdfroff
+
+.ULS
+.LI
+The pdfroff utility script now activates its `\-\-no\-toc\-relocation'
+option by default, unless a request similar to:
+
+.in 2m
+.nf
+\&.if !\en[PHASE] .tm pdfroff\-option:set toc_relocation=enabled
+.fi
+.in
+
+is invoked during input file processing; (`.if !\en[PHASE] \&.\|.\|.\&'
+ensures that the effect of the `.tm' request is restricted to the
+document setup phase of processing, as pdfroff sets it to 1 or\~2 in the
+output phase, but leaves it unset in the setup phase).
+
+The bundled `spdf.tmac' macro package, which implicitly activates
+`\-mpdfmark' for `ms' macro users, ensures that TOC relocation is
+appropriately enabled, when the `.TC' macro is invoked.
+.ULE
+.
+.
+.SH 2
+macro packages
+
+.ULS
+.LI
+The \-mom macro package now has full support for eqn, pic, and tbl, as well
+as captioning and labelling of pdf images and preprocessor output.
+Lists of Figures, Equations, and Tables can now be autogenerated.
+PDF_IMAGE has a new FRAME option.
+
+.LI
+A French introduction to the \-me macro package has been added (file
+`meintro_fr.me').
+
+.LI
+In \-mdoc, command %C is now available, providing a city or place reference.
+.ULE
+.
+.
+.SH
+NEWS VERSION 1.22.2
+.LP
+.SH 2
+tbl
+
+.ULS
+.LI
+The character `#' can now be used as an eqn delimiter within tables.
+.ULE
+.
+.
+.SH 2
+eqn
+
+.ULS
+.LI
+A GNU extension
+
+.in 2m
+.nf
+.ft C
+delim on
+.ft P
+.fi
+.in
+
+has been added to reactivate delimiters which have been disabled with
+`delim off'.
+.ULE
+.
+.
+.SH
+NEWS VERSION 1.22.1
+.LP
+(There was no release 1.22.)
+.LP
+.SH 2
+groff
+
+.ULS
+.LI
+A new option `\-j' has been added to call the `chem' preprocessor.
+.ULE
+.
+.
+.SH 2
+tbl
+
+.ULS
+.LI
+Improved line numbering support.
+.ULE
+.
+.
+.SH 2
+macro packages
+
+.ULS
+.LI
+Support for the `refer' preprocessor has been added to the \-mm macro
+package.
+
+.LI
+In \-me, the `TH' macro was changed for compatibility with line number
+support in tables.
+
+`bl' now works inside of blocks.
+
+The behaviour of centered blocks has been improved.
+
+Line numbering support has been improved.
+
+.LI
+The \-mom macro package has reached version 2.0, focusing on PDF output
+with gropdf (using the new `pdfmom' wrapper script).
+See the file `version\-2.html' of the \-mom documentation for a list of the
+many changes.
+
+.LI
+Some generic Unicode fallback characters (mainly Roman numerals) have been
+added.
+.ULE
+.
+.
+.SH 2
+tbl
+
+.ULS
+.LI
+Added numbered line support in tables.
+.ULE
+.
+.
+.SH 2
+gropdf
+
+.ULS
+.LI
+A new driver for generating PDF output directly, contributed by
+.MTO deri@\:chuzzlewit.myzen.co.uk "Deri James" .
+
+Note that this driver is written in Perl; you need a working Perl
+installation to run this output device.
+.ULE
+.
+.
+.SH 2
+pdfmom
+
+.ULS
+.LI
+A new wrapper around groff that facilitates the production of PDF documents
+from files formatted with the \-mom macros.
+.ULE
+.
+.
+.SH
+NEWS VERSION 1.21
+.LP
+.SH 2
+troff
+
+.ULS
+.LI
+The new `lsm' request specifies a macro to be invoked when leading
+spaces in an input line are encountered (which are removed then).
+Number registers `lsn' and `lss' hold the number of removed leading
+spaces and the corresponding horizontal space, respectively.
+
+.LI
+There is a new warning category `file', enabled by default.
+The `mso' request emits warnings in this category when the requested
+macro file does not exist.
+
+.LI
+The new `class' request assigns a short name to a set of characters
+which can be referred to in the `cflags' request.
+This is especially useful to control line-breaking and hyphenation
+rules in CJK languages.
+
+.LI
+Three new values for the `cflags' request have been added, which are
+needed for proper CJK support.
+
+.in 2m
+128 prohibit before but allow break after character
+.br
+256 prohibit after but allow break before character
+.br
+512 allow break before and after character
+.in
+.ULE
+.
+.
+.SH 2
+tbl
+
+.ULS
+.LI
+A new global option `nowarn' suppresses warnings if tables are longer
+than the current line width.
+.ULE
+.
+.
+.SH 2
+afmtodit
+
+.ULS
+.LI
+New option `\-o' to specify the name of the output file.
+.ULE
+.
+.
+.SH 2
+macro packages
+
+.ULS
+.LI
+A new macro `%U' has been added to the mdoc package to indicate a URL
+reference within an \&.Rs/.Re environment.
+
+.LI
+Rudimentary support for the Japanese script has been added, most
+suitable for man page handling as output by grotty.
+The file `ja.tmac' contains the necessary setup to allow line breaks
+before and after CJK characters (with proper exceptions).
+Note, however, that no inter-character spacing is implemented yet \[en]
+this usually causes many warnings about bad line breaks.
+.ULE
+.
+.
+.SH
+NEWS VERSION 1.20.1
+.LP
+A packaging error made it necessary to publish this release.
+No user-visible changes.
+.
+.
+.SH
+NEWS VERSION 1.20
+.LP
+.SH 2
+groff
+
+.ULS
+.LI
+XHTML support has been added to grohtml and can be specified by
+\-Txhtml.
+This option also utilizes the MathML capability of
+eqn and combines the outputs of both in the final XHTML file.
+Users can also specify the `\-P\-V' option together with `\-Txhtml'
+in groff.
+This has the effect of creating an XHTML validator
+button at the bottom of each page.
+
+.LI
+Some options have been added to control a new preprocessor,
+`preconv' (see below): `\-k' activates it, `\-K' sets the input
+encoding, and `\-D' sets the default encoding.
+
+.LI
+A new environment variable `GROFF_ENCODING' sets the encoding
+of input files; it implies command option `\-k'.
+.ULE
+.
+.
+.SH 2
+troff
+
+.ULS
+.LI
+Two new requests `device' and `devicem' have been added which are
+equivalents to the \eX and \eY escapes, respectively.
+
+.LI
+A new read-only number register `.br' is available which is set to\~1
+if a macro is called as \&.foo and to\~0 if called as \&'foo.
+This allows reliable modification of requests.
+
+.in 2m
+.nf
+.ft C
+\&.als bp@orig bp
+\&.de bp
+\&.\& tm before bp
+\&.\& ie \e\en[.br] .bp@orig
+\&.\& el \[aq]bp@orig
+\&.\& tm after bp
+\&..
+.ft P
+.fi
+.in
+
+.LI
+A new request `fzoom' has been added to adjust the optical size of a
+font in relation to the others.
+The zoom factor is given in integer multiples of 1/1000th.
+In the following example, the CR font is magnified by 10% (the zoom
+factor is 1.1).
+
+.in 2m
+.nf
+.ft C
+\&.fam P
+\&.fzoom CR 1100
+\&.ps 12
+\&Palatino and \ef[CR]Courier\ef[]
+.ft P
+.fi
+.in
+
+The new number register `.zoom' holds the zoom value of the current font,
+in multiples of 1/1000th.
+
+.LI
+The `cflags' request has been extended with a new flag value 64, to be
+used in combination with values\~2 (break before character) and\~4 (break
+after character).
+If set, the hyphenation codes of the surrounding characters are ignored.
+
+.LI
+A new debugging request, `pev', has been added to print all of the current
+known environments to stderr.
+It first prints the state of the current environment, then iterates
+through all of the known environments, printing each except the one that
+is current.
+
+.LI
+A new escape `\e$^' has been added.
+It represents the parameters of a macro as if they were an argument to
+the `ds' request.
+This is used by `trace.tmac'.
+
+.LI
+A new read-only number register `.O' is available which returns the
+current suppression level as set by the `\eO' escape.
+
+.LI
+The space width emitted by the `\e|' and `\e^' escape sequences can be
+controlled on a per-font basis.
+If there is a glyph named `\e|' or `\e^', respectively (note the leading
+backslash), defined in the current font file, use this glyph's width
+instead of the default value.
+
+This behaviour is not new, but hasn't been documented before.
+.ULE
+.
+.
+.SH 2
+nroff
+
+.ULS
+.LI
+Two new command-line options `\-w' and `\-W' are accepted and passed to
+groff to enable and disable warning messages, respectively.
+.ULE
+.
+.
+.SH 2
+preconv
+
+.ULS
+.LI
+This is a new preprocessor to convert various input encodings to something
+groff understands (this is, ASCII and \e[uXXXX] entities, with `XXXX' a
+hexadecimal number with 4 to 6 digits, representing a Unicode input code).
+Normally, preconv should be invoked with options `\-k' and `\-K' of groff.
+See the preconv man page for details.
+.ULE
+.
+.
+.SH 2
+pic
+
+.ULS
+.LI
+int(x) now really behaves as documented: It truncates the non-integer part
+of\~x, this is, it rounds towards zero and not towards the next integer
+less than or equal to\~x.
+
+.LI
+Pic now supports up to 32 macro arguments (and up to 16 on EBCDIC
+platforms).
+
+.LI
+Heinz-J\[:u]rgen \[:O]rtel contributed code for two new keywords,
+`xslanted' and `yslanted', which can change the shape of boxes into
+arbitrary parallelograms.
+.ULE
+.
+.
+.SH 2
+tbl
+
+.ULS
+.LI
+Latest versions of DWB tbl introduced an `x' column specifier for a single
+column expanded to the line width.
+GNU tbl has now been extended to support even multiple `x' specifiers
+within a table.
+
+.LI
+To avoid collision with the new `x' specifier, a block formatting macro
+must now be selected with specifier letter `m'.
+.ULE
+.
+.
+.SH 2
+eqn
+
+.ULS
+.LI
+Eric S.\& Raymond has added a new device type to eqn, MathML.
+When \-TMathML is enabled, eqn now emits MathML formula markup rather than
+groff commands.
+The new groff \-Txhtml device uses this.
+.ULE
+.
+.
+.SH 2
+chem
+
+.ULS
+.LI
+The preprocessor `chem' was added.
+`chem' is a roff language to generate chemical structure diagrams.
+It generates `pic' output.
+.ULE
+.
+.
+.SH 2
+grops
+
+.ULS
+.LI
+The PS font definition files have been regenerated with newer AFM versions
+from Adobe's 35 core fonts as present in most Level\~2 PS printers.
+The changes are minor (most notably, the addition of the `Euro' glyph and an
+extended set of kerning values).
+
+For backwards compatibility, the old set of font definition files is still
+available; for details please read the man page of grops.
+.ULE
+.
+.
+.SH 2
+grotty
+
+.ULS
+.LI
+\eD'p.\|.\|.\&' is now supported if the polygon consists entirely of
+horizontal and vertical lines.
+.ULE
+.
+.
+.SH 2
+grohtml
+
+.ULS
+.LI
+XHTML support has been added.
+
+.LI
+New command-line option `\-V' (to be used in XHTML mode) to produce an
+XHTML validator button.
+
+.LI
+New command-line option `\-y' to produce a right-justified groff signature
+at the end of the document (in combination with option `\-V').
+.ULE
+.
+.
+.SH 2
+gxditview
+
+.ULS
+.LI
+Support for keyboard navigation has been improved.
+
+.LI
+Similar to other X11 applications, there are now two resource files,
+`GXditview' and `GXditview\-color'.
+.ULE
+.
+.
+.SH 2
+groffer
+
+.ULS
+.LI
+`groffer' version 1.* exists now in a shell and a Perl version.
+.ULE
+.
+.
+.SH 2
+afmtodit
+
+.ULS
+.LI
+New option `\-c' to output more font information as comments.
+
+.LI
+New option `\-k' to suppress output of kerning data.
+
+.LI
+New option `\-f NAME' to set the internal name of the groff font.
+.ULE
+.
+.
+.SH 2
+macro packages
+
+.ULS
+.LI
+Joachim Walsdorff contributed the `hdtbl' package for the generation of
+tables, using a syntax very similar to the HTML table model.
+For example, a table with two cells and two rows looks like this:
+
+.in 2m
+.nf
+.ft C
+\&.TBL cols=2
+\&.\& TR .TD 1*1 .TD 1*2
+\&.\& TR .TD 2*1 .TD 2*2
+\&.ETB
+.ft P
+.fi
+.in
+
+Here the same table using a more expanded syntax:
+
+
+.in 2m
+.nf
+.ft C
+\&.TBL cols=2
+\&.\& TR
+\&.\& TD 1*1
+\&.\& TD 1*2
+\&.\& TR
+\&.\& TD 2*1
+\&.\& TD 2*2
+\&.ETB
+.ft P
+.fi
+.in
+
+Tables can be nested; `hdtbl' works without a preprocessor so that the
+full capability of groff's macro engine is available.
+
+This package currently works with `\-Tps' only.
+
+.LI
+\-mandoc now supports multiple man pages (in either man or mdoc format).
+
+.LI
+Fabrice M\['e]nard contributed locales support.
+In particular, it is now possible to get French localization of the main
+macro packages (\-ms, \-mm, \-me, and \-mom, but not \-man and \-mdoc
+which are localized differently) by appending `\-mfr' to the list of macro
+packages.
+Example:
+
+.in 2m
+.ft C
+.nf
+groff \-ms \-mfr foo > foo.ps
+.fi
+.ft P
+.in
+
+Note that latin-9 input encoding is used for French (to support the `oe'
+ligature).
+
+.LI
+Swedish macro localization (with `\-msv') has been added.
+
+.LI
+German macro localization (with `\-mde' and `\-mden' for traditional and
+new orthography, respectively) has been added.
+
+.LI
+Czech macro localization (with `\-mcs') has been added.
+
+Note that latin-2 input encoding is used for Czech.
+
+.LI
+A new macro `Dx' has been added to the mdoc package which identifies the
+DragonFly OS.
+
+.LI
+If mdoc is used to print multiple man pages (together with the \-rcR=0
+command-line option), each man page now starts a new page.
+
+.LI
+\-mtrace has been considerably improved, now showing number and string
+register assignments, among other things.
+See the groff_trace man page for details.
+
+.LI
+The PSPIC macro now works with all devices (producing a hollow
+rectangle on devices which don't support inclusion of PS images) and
+is loaded in troffrc at start-up.
+
+.LI
+A new auxiliary macro package `62bit' has been added which provides some
+macros for adding, multiplying, and dividing signed 62-bit integers (mainly
+to handle normal groff number operations without risking overflow errors).
+
+.LI
+For \-ms, Eric S.\& Raymond contributed support for ancient Bell Labs
+localisms `.SC', `.UC', `.P1', and `.P2'.
+The latter three are enabled only after \&.SC is called.
+
+.LI
+A new string, `SN-STYLE', has been added to the ms macros, controlling
+the formatting of section numbers in headings defined by `.NH'.
+
+.LI
+The new macro package `ptx' provides a template definition for the `.xx'
+macro as needed by GNU ptx (for creating permuted indices).
+.ULE
+.
+.
+.SH
+NEWS VERSION 1.19.2
+.LP
+.SH 2
+troff
+
+.ULS
+.LI
+Analogously to the \&.ft and \ef pair, two new requests `gcolor' and
+`fcolor' (which pair with \em and \eM, respectively) have been added to
+set the glyph and background colours.
+
+.LI
+A new read-only, string-valued register `.sty' returns the name of the
+current style.
+
+.LI
+Two new conditional operators `F\~\[la]name\[ra]' and `S\~\[la]name\[ra]'
+have been added.
+`F' is true if a font \[la]name\[ra] exists.
+`S' is true if a style \[la]name\[ra] has been registered.
+
+.LI
+Cyrillic characters have been added to the `utf8' and `html' output
+devices.
+.ULE
+.
+.
+.SH 2
+pic
+
+.ULS
+.LI
+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.
+.ULE
+.
+.
+.SH 2
+eqn
+
+.ULS
+.LI
+The following keywords aren't new but haven't been documented previously:
+
+.in 2m
+.B undef
+.I name
+(to undefine a macro)
+.br
+.B
+copy
+.I file \[dq] \[dq]
+.R
+a synonym for `include')
+.br
+.B space
+.I n
+(to modify the vertical spacing before and after an equation)
+.in
+
+.LI
+The following macros aren't new but haven't been documented previously:
+
+.in 2m
+.B Alpha ,
+\&\.\.\.,
+.B Omega
+(the same as
+.B ALPHA ,
+\&\.\.\.,
+.B OMEGA )
+.br
+\fBldots\fP (three dots on the baseline)
+.br
+\fBdollar\fP (a dollar glyph)
+.in
+
+.LI
+The following keywords have been extended.
+Again, this isn't new but hasn't been documented previously:
+
+.in 2m
+.B col
+.I n
+.B {
+\&\.\.\.\&
+.B }
+.br
+.B lcol
+.I n
+.B {
+\&\.\.\.\&
+.B }
+.br
+.B rcol
+.I n
+.B {
+\&\.\.\.\&
+.B }
+.br
+.B ccol
+.I n
+.B {
+\&\.\.\.\&
+.B }
+.br
+.B pile
+.I n
+.B {
+\&\.\.\.\&
+.B }
+.br
+.B lpile
+.I n
+.B {
+\&\.\.\.\&
+.B }
+.br
+.B rpile
+.I n
+.B {
+\&\.\.\.\&
+.B }
+.br
+.B cpile
+.I n
+.B {
+\&\.\.\.\&
+.B }
+.br
+The above all set the vertical spacing between rows to\~\c
+.I n ).
+.ULE
+.
+.
+.SH 2
+grohtml
+
+.ULS
+.LI
+This device driver has been raised to beta stage; its set of tags should
+be stable now.
+
+.LI
+New command-line option `\-s' to set the base point size.
+
+.LI
+New command-line option `\-S' to set the split level while generating
+multiple files.
+.ULE
+.
+.
+.SH 2
+grotty
+
+.ULS
+.LI
+Experimental support for zero-width and double-width characters.
+.ULE
+.
+.
+.SH 2
+gxditview
+
+.ULS
+.LI
+On platforms which have the X\~Window System this program is now built and
+installed automatically.
+.ULE
+.
+.
+.SH 2
+xtotroff
+
+.ULS
+.LI
+This program to create font definition files for xditview isn't new but
+hasn't been installed previously.
+.ULE
+.
+.
+.SH 2
+groffer
+
+.ULS
+.LI
+A security problem (reported as CAN-2004-0969) has been fixed.
+.ULE
+.
+.
+.SH 2
+gdiffmk
+
+.ULS
+.LI
+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.
+.ULE
+.
+.
+.SH 2
+pdfroff
+
+.ULS
+.LI
+A new wrapper script contributed by Keith Marshall to easily create PDF
+documents with groff.
+.ULE
+.
+.
+.SH 2
+macro packages
+
+.ULS
+.LI
+ms.tmac
+
+.ULS
+.LI
+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.
+
+.LI
+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.
+
+.LI
+The following registers have been added for improving layout control:
+
+.IP PORPHANS
+Defines number of lines following `LP', `PP', `QP', `IP' or `XP' which
+must be kept together, before any automatic page break.
+
+.IP 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.
+
+.IP GROWPS
+Sets the first level of heading (set with `NH') which keeps the
+same point size as body text.
+
+.IP PSINCR
+Sets the point size increment for each level of heading (set with
+`NH'), below the threshold level set by `GROWPS'; e.g., if
+\en[PS]\~=\~10, \en[GROWPS]\~=\~3 and \en[PSINCR]\~=\~2.0p, then `.NH\~1'
+produces 14-point headings, `.NH\~2' produces 12-point,
+and all other levels
+remain at 10\~points (because \en[PS]\~=\~10).
+
+.LI
+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.
+.ULE
+
+Please refer to the documentation of the ms package for other, minor
+improvements.
+
+.LI
+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.
+
+.LI
+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
+<head>.\|.\|.</head> 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.
+.ULE
+.
+.
+.SH 2
+pdfmark
+
+.ULS
+.LI
+A new macro package contributed by Keith Marshall which implements PDF
+marks.
+This is in alpha stage currently.
+.ULE
+.
+.
+.SH 2
+miscellaneous
+
+.ULS
+.LI
+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.
+.ULE
+.
+.
+.SH
+NEWS VERSION 1.19.1
+.LP
+.SH 2
+groff
+
+.ULS
+.LI
+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 \eX'ps:\~file'
+and \eX'ps:\~import' escapes.
+
+.LI
+If option `\-V' is used more than once, the commands are both printed
+on standard error and run.
+.ULE
+.
+.
+.SH 2
+troff
+
+.ULS
+.LI
+Two new read-only, string-valued registers `.m' and `.M' return the
+name of the current drawing and background color, respectively.
+
+.LI
+New read-only register `.U' which is set to\~1 if in unsafe mode and
+0\~otherwise.
+
+.LI
+An input encoding file for \%latin-5 (a.k.a.\& ISO \%8859-9) has been
+added.
+Example use:
+
+.in 2m
+.ft C
+groff \-Tdvi \-mlatin5 my_file > my_file.dvi
+.ft R
+.in
+
+Note that some output devices don't support all glyphs of this encoding.
+
+.LI
+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.
+
+.LI
+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').
+
+.LI
+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.
+
+.LI
+Since version 1.19 you can say `.vs\~0'.
+Older versions emit a warning and convert this to `.vs\~\en[.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.
+.ULE
+.
+.
+.SH 2
+pic
+
+.ULS
+.LI
+Dashed and dotted ellipses have been implemented.
+.ULE
+.
+.
+.SH 2
+tbl
+
+.ULS
+.LI
+New key character `x' to make tbl call a user-defined macro on a table
+cell.
+Patch by
+.MTO hj.oertel@\:surfeu.de "Heinz-J\[:u]rgen Oertel" .
+.ULE
+.
+.
+.SH 2
+grap2graph
+
+.ULS
+.LI
+A new script contributed by
+.MTO esr@\:thyrsus.com "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.]
+.ULE
+.
+.
+.SH 2
+grohtml
+
+.ULS
+.LI
+New option `\-j' to emit output split into multiple files.
+.ULE
+.
+.
+.SH 2
+grops
+
+.ULS
+.LI
+New command-line option `\-I' to specify a directory to search for files
+on the command line and files named in \eX'ps:\~import' and \eX'ps:\~file'
+escapes.
+This is also handled by the groff wrapper program.
+
+.LI
+The default value for the `broken' keyword in the DESC file is now\~0.
+.ULE
+.
+.
+.SH 2
+grolj4
+
+.ULS
+.LI
+A new man page
+.I lj4_font (5)
+documents how fonts are accessed with
+grolj4.
+
+.LI
+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.
+.ULE
+.
+.
+.SH 2
+afmtodit
+
+.ULS
+.LI
+New option `\-x' to prevent use of built-in Adobe Glyph List.
+.ULE
+.
+.
+.SH 2
+hpftodit
+
+.ULS
+.LI
+Completely revised to handle HP TrueType metric files also.
+See the hpftodit manual page for more details.
+.ULE
+.
+.
+.SH 2
+groffer
+
+.ULS
+.LI
+This version is a rewrite of groffer in many parts, but it is kept in
+the old single script style.
+
+.ULS
+.LI
+New options: \-\-text (\-\-mode\~text), \-\-tty\-viewer, \-\-X (\-\-mode\~X),
+\-\-X\-viewer, \-\-html (\-\-mode\~html), \-\-html\-view, \-\-apropos\-data,
+\-\-apropos\-devel, \-\-apropos\-progs.
+
+.LI
+New documentation file README_SH.
+
+.LI
+Enhancement of the configuration files and the `apropos' handling.
+.ULE
+.ULE
+.
+.
+.SH 2
+macro packages
+
+.ULS
+.LI
+www.tmac: New macro `JOBNAME' to split output into multiple files.
+
+.LI
+In mdoc, multiple calls to `.Lb' are now supported in the LIBRARY
+section.
+.ULE
+.
+.
+.SH
+NEWS VERSION 1.19
+.LP
+.SH 2
+troff
+
+.ULS
+.LI
+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:
+
+.in 2m
+.ft C
+groff \-Tdvi \-mlatin9 my_file > my_file.dvi
+.ft P
+.in
+
+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.
+
+.LI
+Composite glyphs are now supported.
+To do this, a subset of the Adobe Glyph List (AGL) Algorithm as described in
+.URL http://\:partners.adobe.com/\:public/\:developer/\:opentype/\:index_glyph.html \
+ http://\:partners.adobe.com/\:public/\:developer/\:opentype/\:index_glyph.html
+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 \e[.\|.\|.\&] escape sequence has been extended to specify multiple
+glyph components.
+Example:
+
+.in 2m
+.ft C
+\e[A ho]
+.ft R
+.in
+
+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
+
+.in 2m
+.ft C
+\&.composite from to
+.ft R
+.in
+
+changes the mapping while a composite glyph name is constructed.
+To make \e[A\~ho] yield the expected result,
+
+.in 2m
+.ft C
+\&.composite ho u0328
+.ft R
+.in
+
+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.
+
+.LI
+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'.
+
+.LI
+Fallback characters defined with `fschar' can be removed with the
+new `rfschar' request.
+
+.LI
+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.
+
+.LI
+In groff versions 1.18 and 1.18.1, \eD'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.
+
+\eD'f\~.\|.\|.\&' is deprecated since it depends on the horizontal
+motion quanum of the output device (given with the `hor' parameter in
+the DESC file).
+Use the new \eD'Fg\~.\|.\|.\&' escape instead.
+
+.LI
+For orthogonality, new \eD subcommands to change the fill color are
+available:
+
+.in 2m
+.ft C
+\eD\[aq]Fr \&.\|.\|.\&\[aq] \f[R](rgb)\f[]
+.br
+\eD\[aq]Fc \&.\|.\|.\&\[aq] \f[R](cmy)\f[]
+.br
+\eD\[aq]Fg \&.\|.\|.\&\[aq] \f[R](gray)\f[]
+.br
+\eD\[aq]Fk \&.\|.\|.\&\[aq] \f[R](cmyk)\f[]
+.br
+\eD\[aq]Fd\[aq] \f[R](default color)\f[]
+.ft R
+.in
+
+The arguments are the same as with the `defcolor' request.
+The current position is \f[I]not\f[] changed.
+
+.LI
+The values set with \eH and \eS are now available in number registers
+\en[.height] and \en[.slant], respectively.
+
+.LI
+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.
+
+.LI
+The new glyph symbol `tno' is a textual variant of `no'.
+
+.LI
+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.
+.ULE
+.
+.
+.SH 2
+grops
+
+.ULS
+.LI
+The font `freeeuro.pfa' has been added to provide various default glyph
+shapes for `eu' and `Eu'.
+
+.LI
+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.
+
+.LI
+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).
+Patch by
+.MTO egil@\:kvaleberg.no "Egil Kvaleberg" .
+
+.LI
+Non-slanted PostScript metrics have been changed again; they no longer
+contain negative left italic correction values.
+This assures correct spacing with eqn.
+.ULE
+.
+.
+.SH 2
+grodvi
+
+.ULS
+.LI
+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.
+
+.LI
+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.
+
+.LI
+The glyph shapes for \e[*f] and \e[*e] have been exchanged with \e[+f] and
+\e[+e], respectively, to be in sync with all other devices.
+
+.LI
+Glyphs \e[HE] and \e[DI] have been replaced with \e[u2662] and \e[u2661],
+respectively, since the former two glyphs have a black (filled) shape
+which grodvi doesn't provide by default (it never has actually).
+.ULE
+.
+.
+.SH 2
+grolj4
+
+.ULS
+.LI
+The glyphs \e[*e] and \e[+e] have been exchanged to be in sync with
+all other devices.
+
+.LI
+The glyph \e[\[ti]=] is now called \e[|=].
+Similar to other devices,
+\e[\[ti]=] is now another name for glyph \e[\[ti]\[ti]].
+.ULE
+.
+.
+.SH 2
+grotty
+
+.ULS
+.LI
+New option `\-r'.
+It is similar to the \-i option except it tells grotty to
+use the `reverse video' attribute to render italic fonts.
+.ULE
+.
+.
+.SH 2
+pic
+
+.ULS
+.LI
+New command `figname' to set the name of a picture's output box in TeX
+mode.
+.ULE
+.
+.
+.SH 2
+refer
+
+.ULS
+.LI
+The environment variable `REFER' to override the name of the default
+database isn't new but hasn't been documented before.
+.ULE
+.
+.
+.SH 2
+soelim
+
+.ULS
+.LI
+New option `\-r' to avoid emission of `.lf' lines.
+
+.LI
+New option `\-t' to emit TeX comment lines (giving current file and the
+line number) instead of `.lf' lines.
+.ULE
+.
+.
+.SH 2
+afmtodit
+
+.ULS
+.LI
+Unencoded glyphs in an AFM file are output also (since grops can now emit
+multiple encoding vectors for a single font).
+
+.LI
+New option `\-m' to prevent negative left italic correction values.
+
+.LI
+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.
+.ULE
+.
+.
+.SH 2
+macro packages
+
+.ULS
+.LI
+.MTO kollar@\:alltel.net "Larry Kollar"
+and others made the man macros more customizable.
+
+.ULS
+.LI
+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.
+
+.LI
+New command-line option \-rHY (similar to the ms macros) to control
+hyphenation.
+
+.LI
+New macros `.PT' and `.BT' to print the header and footer strings.
+They can be replaced with a customized version in `man.local'.
+
+.LI
+The string `HF' now holds the typeface to print headings and
+subheadings.
+
+.LI
+Similar to the ms macros, the LT register now defaults to LL if not
+explicitly specified on the command line.
+.ULE
+
+.LI
+troff's start-up file `troffrc' now includes `papersize.tmac' to set
+the paper size with the command-line option `\-dpaper=<size>'.
+
+Possible values for `<size>' are the same as the predefined `papersize'
+values in the DESC file (only lowercase; see the groff_font man page)
+except \%a7\[en]d7.
+An appended `l' (ell) character denotes landscape orientation.
+Examples: `a4l', `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:
+
+.in 2m
+.ft C
+groff \-Tps \-dpaper=a4l \-P\-pa4 \-P\-l \-ms foo.ms > foo.ps
+.ft R
+.in
+.ULE
+.
+.
+.SH
+NEWS VERSION 1.18.1
+.LP
+.SH 2
+troff
+
+.ULS
+.LI
+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 `\e,' and
+appending `\e/' 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 \e, and \e/ 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.
+.ULE
+.
+.SH 2
+tbl
+
+.ULS
+.LI
+Added global option `nospaces' to ignore leading and trailing spaces in data
+items.
+.ULE
+.
+.SH 2
+grolbp
+
+.ULS
+.LI
+The option \-w (\-\-linewidth) has been added (similar to other device
+drivers) to set the default line width.
+.ULE
+.
+.SH 2
+grn
+
+.ULS
+.LI
+Support for b-spline and Bezier curves has been added.
+.ULE
+.
+.SH 2
+groffer
+
+.ULS
+.LI
+New option \-\-shell to select the shell under which groffer shall run.
+.ULE
+.
+.SH 2
+Macro Packages
+
+.ULS
+.LI
+The string `Am' (producing an ampersand) has been added to mdoc for
+compatibility with NetBSD.
+
+.LI
+`.IX' is now deprecated for mom; you should use `.IQ' (Indent Quit)
+instead.
+
+.LI
+In mom, new inlines `FWD', `BCK', `UP', and `DOWN' deal with horizontal
+and vertical movements; please refer to contrib/mom/NEWS for more
+details.
+
+.LI
+New macro ENDNOTES_HDRFTR_CENTER for mom to better control headers.
+.ULE
+.
+.SH 2
+Miscellaneous
+
+.ULS
+.LI
+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:
+
+.in 2m
+.ft C
+papersize /etc/papersize a4
+.ft P
+.in
+
+.LI
+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 \%dev\c
+.I XXX
+subdirectory, e.g.,
+
+.in 2m
+.ft C
+/usr/local/share/groff/site\-font/devps/FOO
+.ft P
+.in
+
+for a PostScript font definition file FOO.
+.ULE
+.
+.
+.SH
+NEWS VERSION 1.18
+.LP
+This section describes recent user-visible changes in groff.
+Bug fixes are not described.
+There are more details in the man pages.
+
+.ad c
+\s[+5]\m[red]\
+Please read the changes below regarding
+.ie '\*[.T]'html' \
+. URL #grotty grotty ,
+.el \
+. nop grotty,
+groff's tty frontend.\
+\m[]\s[0]
+.br
+.ad n
+.
+.SH 2
+Troff
+
+.ULS
+.LI
+Color support has been added to troff and pic (and to the device drivers
+grops, grodvi, grotty, and grohtml \[en] other preprocessors and drivers will
+follow).
+A new function `defcolor' defines colors; the escape sequence `\em' sets the
+drawing color, the escape sequence `\eM' specifies the background color for
+closed objects created with \eD'.\|.\|.\&' commands.
+`\em[]' and `\eM[]' switch back to the previous color.
+`\em' and `\eM' 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
+.ie '\*[.T]'html' \
+. URL #GROFF_NO_SGR GROFF_NO_SGR
+.el \
+. nop GROFF_NO_SGR
+environment variable also.
+
+For defining color components as fractions between 0 and\~1, a new
+scaling unit `f' has been defined: 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.
+
+.LI
+Similar to \em and \eM, \ef[] switches back to the previous font.
+\efP (and \ef[P]) is still valid for backwards compatibility.
+
+.LI
+The new escape \eF is the same as `.fam'; \eF[] switches back to previous
+family \[en] \eF[P] selects family `P'.
+
+.LI
+Two new glyph symbols are available: `eu' is the official Euro symbol;
+`Eu' is a font-specific glyph variant.
+
+.LI
+The new glyph symbols `t+\-', `tdi', and `tmu' are textual variants of
+`+\-', `di', and `mu', respectively.
+
+.LI
+Latin-1 character 181 (PS name `mu', Unicode name U+00B5 MICRO SIGN) has
+got the troff glyph name `mc'.
+
+.LI
+\-Tutf8 is now available on EBCDIC hosts.
+
+.LI
+Strings can take arguments, using this syntax: \e*[foo\~arg1\~arg2\~.\|.\|.].
+Example:
+
+.in 2m
+.nf
+.ft C
+\&.ds xxx This is a \e\e$1 test.
+\e*[xxx nice]
+.ft P
+.fi
+.in
+
+.LI
+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:
+
+.in 2m
+.nf
+.ft C
+\&.de !
+\&..
+\&.
+\&.de foo
+\&.\& nop Hello, I\[aq]m \[aq]foo\[aq].
+\&.\& nop I will now define \[aq]bar\[aq].
+\&.\& de bar !
+\&.\& nop Hello, I\[aq]m \[aq]bar\[aq].
+\&.\& !
+\&..
+.ft P
+.fi
+.in
+
+.LI
+`.fn' is a new string-valued register which returns the (internal) real
+font name; styles and families are properly concatenated.
+
+.LI
+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.
+
+.LI
+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.
+
+.LI
+In analogy to the `tmc' request, `.writec' is the same as `.write' but
+doesn't emit a final newline.
+
+.LI
+The new request `itc' is a variant of `.it' for which a line interrupted
+with \ec counts as one input line.
+
+.LI
+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.
+
+.LI
+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.
+
+.LI
+To emit strings directly to the intermediate output, a new `output'
+request has been added; it is similar to `\e!' used at the top level.
+
+.LI
+`.hpf' has been extended.
+It can now handle most TeX hyphenation pattern files without
+modification.
+To do that, the commands \epatterns, \ehyphenation, and \eendinput are
+recognized.
+Please refer to groff_diff.7 for more information.
+
+.LI
+`hpfcode' is a new request to provide an input encoding mapping for the
+`hpf' request.
+
+.LI
+The new request `hpfa' appends hyphenation patterns (`hpf' replaces
+already existing patterns).
+
+.LI
+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).
+
+.LI
+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.
+
+.LI
+`trin' (translate input) is a new request which is similar to `tr' with
+the exception that the `asciify' request uses the character code (if
+any) before the character translation.
+Example:
+
+.in 2m
+.nf
+.ft C
+\&.trin ax
+\&.di xxx
+a
+\&.br
+\&.di
+\&.xxx
+\&.trin aa
+\&.asciify xxx
+\&.xxx
+.ft P
+.fi
+.in
+
+The result is `x\~a'.
+Using `tr', the result would be `x\~x'.
+
+.LI
+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.
+
+.LI
+For compatibility with plan 9's troff, multiple `pi' requests are
+supported:
+
+.in 2m
+.nf
+.ft C
+\&.pi foo
+\&.pi bar
+.ft P
+.fi
+.in
+
+is now equivalent to
+
+.in 2m
+.ft C
+\&.pi foo | bar
+.ft P
+.in
+
+.LI
+A new escape sequence `\eO' is available to disable and enable glyph
+output.
+Please see groff_diff.man and groff.texinfo for more details.
+
+.LI
+The escapes `\e%', `\e&', `\e)', and `\e:' no longer cause an error in \eX;
+they are ignored now.
+Additionally `\e\~' (space) and `\e\[ti]' are converted to single space
+characters.
+
+.LI
+The default tab distance in nroff mode is now 0.8i\~(inches) to be compatible
+with Unix troff.
+
+.LI
+Using the latin-1 input character 0xAD (soft hyphen) for the `shc'
+request was a bad idea.
+Instead, it is now translated to `\e%', and the default hyphenation
+character is again \e[hy].
+Note that the glyph \e[shc] is not useful for typographic purposes;
+it only exists to have glyph names for all latin-1 characters.
+.ULE
+.
+.SH 2
+Macro Packages
+
+.ULS
+.LI
+.MTO df191@\:ncf.ca "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.
+
+.LI
+Two macros `AT' (AT&T) and `UC' (Univ.\& of California) have been added to
+the man macros for compatibility with older BSD releases.
+
+.LI
+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\~(ens) in nroff mode and
+6.5i\~(inches) in troff mode.
+
+.LI
+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 has this functionality also.
+
+.LI
+A new macro `Ex' has been added to the mdoc macro package to document an
+exit status.
+
+.LI
+`troff.man' has been split.
+Differences to Unix troff are now documented in the new man page
+`groff_diff.man'.
+
+.LI
+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.
+
+.LI
+The trace.tmac package now traces calls to `am' also.
+Additionally, it works in compatibility mode.
+
+.LI
+`troff.1' has been split.
+Differences to Unix troff are now documented in the new man page
+`groff_diff.7'.
+
+.LI
+`groff_mwww.7' has been renamed to `groff_www.7'.
+The file mwww.tmac has been removed.
+
+.LI
+`groff_ms.7' has been completely rewritten.
+It now contains a complete reference to the ms macros.
+
+.LI
+`groff_trace.7' documents the trace macro package.
+
+.LI
+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.
+
+.ULS
+.LI
+The following macros have been renamed:
+
+.in 2m
+.nf
+MAILTO \-> MTO
+IMAGE \-> IMG
+LINE \-> HR
+.fi
+.in
+
+.LI
+For consistency, the macros `URL', `FTL', and `MTO' now all have the
+address as the first parameter followed by the description.
+
+.LI
+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.
+
+.LI
+For specifying the background color and a background image, use the
+new macros `BCL' and `BGIMG', respectively.
+
+.LI
+The macro `NHR' has been added; it suppresses the generation of top and
+bottom rules which grohtml emits by default.
+
+.LI
+The new macro `HX' determines the cut-off point for automatic link
+generation to headings.
+
+.LI
+The image position parameter names in `IMG' have been changed to `\-L',
+`\-R', and `\-C'.
+
+.LI
+New macro `PIMG' for inclusion of a PNG image (it automatically
+converts it into an EPS file if not \-Thtml is used).
+
+.LI
+New macro `MPIMG' for putting a PNG image into the left or right margin
+(it automatically converts it into an EPS file if not \-Thtml is used).
+
+.LI
+New macros `HnS', `HnE' to start and end a header line block.
+
+.LI
+New macro `DC' to produce dropcap characters.
+
+.LI
+New macro `HTL' to generate an HTML title line only but no H1 heading.
+
+.LI
+New macros `ULS' and `ULE' to start and end an unordered list.
+The new macro `LI' inserts a list item.
+.ULE
+.ULE
+.
+.
+.SH 2
+groff
+
+.ULS
+.LI
+The new command-line option `\-c' disables color output (which is always
+disabled in compatibility mode).
+.ULE
+.
+.
+.SH 2
+Nroff
+
+.ULS
+.LI
+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).
+.ULE
+.
+.
+.SH 2
+pic
+
+.ULS
+.LI
+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:
+
+.in 2m
+.ft C
+circle shaded "green" outline "black" ;
+.ft P
+.in
+
+Filled arrows always use the outline color for filling.
+
+Color support for TeX output is not implemented yet.
+.ULE
+.
+.
+.SH 2
+Pic2graph
+
+.ULS
+.LI
+A new script contributed by
+.MTO esr@\:thyrsus.com "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.
+.ULE
+.
+.
+.SH 2
+Eqn2graph
+
+.ULS
+.LI
+A new script contributed by
+.MTO esr@\:thyrsus.com "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.
+.ULE
+.
+.
+.SH 2
+Groffer
+
+.ULS
+.LI
+A new script contributed by
+.MTO groff\-bernd.warken\-72@web.de "Bernd Warken" .
+It displays groff files and man pages on X and tty, taking care of most
+parameters automatically.
+.ULE
+.
+.
+.SH 2
+Grog
+
+.ULS
+.LI
+Documents using the mom macro package are recognized.
+.ULE
+.
+.
+.SH 2
+grops
+
+.ULS
+.LI
+Color support has been added.
+
+.LI
+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.
+.ULE
+.
+.
+.SH 2
+Grodvi
+
+.ULS
+.LI
+By default,
+font sizes are now available in the range 5\[en]10000p\~(points),
+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:
+
+.in 2m
+.nf
+.ft C
+\&.if \[aq]\e*[.T]\[aq]dvi\[aq] \e
+\&.\& sizes 500 600 700 800 900 1000 1095 1200 1400 1440 1600 \e
+\& 1728 1800 2000 2074 2200 2400 2488 2800 3600
+.ft P
+.fi
+.in
+
+.LI
+A new font file HBI (using cmssbxo10; this is slanted sans serif bold
+extended) has been added.
+
+.LI
+Two font families are now available: `T' and `H'.
+
+.LI
+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.
+
+.LI
+Color support has been added.
+For drawing commands, colors are translated to gray values currently.
+.ULE
+.
+.
+.TAG grotty
+.SH 2
+Grotty
+
+.ULS
+.LI
+Color support has been added, using the SGR (ISO\~6429, sometimes called
+ANSI color) escape sequences.
+
+.LI
+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 (or $MANPAGER, depending on the
+used version of `man'); alternatively, you can use `man's `\-P' option (or
+adapt its configuration file accordingly).
+See
+.I man (1)
+for more details.
+
+.TAG GROFF_NO_SGR
+.LI
+If the environment variable GROFF_NO_SGR is set, SGR output is disabled,
+reverting to the old behaviour.
+
+.LI
+A new special \eX'tty:\~sgr\~n' has been added; if n is non-zero or missing,
+enable SGR output (the default).
+
+.LI
+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).
+.ULE
+.
+.
+.SH 2
+grohtml
+
+.ULS
+.LI
+Color support for glyphs has been added.
+
+.LI
+New option `\-h' to select the style of headings in HTML output.
+
+.LI
+New option `\-b' to set the background colour to white.
+
+.LI
+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.
+
+.LI
+groff character/glyph entities now map onto HTML\~4 character entities.
+.ULE
+.
+.
+.SH 2
+Grolbp
+
+.ULS
+.LI
+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.
+.ULE
+.
+.
+.SH 2
+Miscellaneous
+
+.ULS
+.LI
+A new manual page `ditroff.7' is available.
+
+.LI
+The groff texinfo manual is now installed, together with a bunch
+of examples.
+
+.LI
+A new keyword `papersize' has been added to the DESC file format.
+Its argument is either
+
+.ULS
+.LI
+a predefined paper format (e.g., `A4' or `letter')
+
+.LI
+a file name pointing to a file which must contain a paper size
+specification in its first line (e.g., `/etc/papersize')
+
+.LI
+a custom paper size definition like `35c,4i'
+.ULE
+
+See
+.I 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.
+.ULE
+.
+.LNE
+.
+.\" EOF
+.\" Local Variables:
+.\" mode: nroff
+.\" End:
+.\" vim: filetype=groff:
diff --git a/font/devX100-12/CB b/font/devX100-12/CB
new file mode 100644
index 0000000..dd1d545
--- /dev/null
+++ b/font/devX100-12/CB
@@ -0,0 +1,215 @@
+name CB
+spacewidth 10
+charset
+--- 10,9 0 00
+--- 10,1 0 040
+! 10,11 0 041
+" 10,11 0 042
+dq "
+# 10,11,1 0 043
+sh "
+$ 10,12,1 0 044
+Do "
+% 10,11 0 045
+& 10,9 0 046
+' 10,11 0 047
+aq "
+cq "
+oq "
+( 10,11,2 0 050
+) 10,11,2 0 051
+* 10,11 0 052
++ 10,9 0 053
+, 10,2,3 0 054
+\- 10,6 0 055
+. 10,2 0 056
+/ 10,12,2 0 057
+sl "
+0 10,11 0 060
+1 10,11 0 061
+2 10,11 0 062
+3 10,11 0 063
+4 10,11 0 064
+5 10,11 0 065
+6 10,11 0 066
+7 10,11 0 067
+8 10,11 0 070
+9 10,11 0 071
+: 10,7 0 072
+; 10,7,3 0 073
+< 10,9 0 074
+= 10,7 0 075
+> 10,9 0 076
+? 10,10 0 077
+@ 10,11,1 0 0100
+at "
+A 10,10 0 0101
+B 10,10 0 0102
+C 10,10 0 0103
+D 10,10 0 0104
+E 10,10 0 0105
+F 10,10 0 0106
+G 10,10 0 0107
+H 10,10 0 0110
+I 10,10 0 0111
+J 10,10 0 0112
+K 10,10 0 0113
+L 10,10 0 0114
+M 10,10 0 0115
+N 10,10 0 0116
+O 10,10 0 0117
+P 10,10 0 0120
+Q 10,10,2 0 0121
+R 10,10 0 0122
+S 10,10 0 0123
+T 10,10 0 0124
+U 10,10 0 0125
+V 10,10 0 0126
+W 10,10 0 0127
+X 10,10 0 0130
+Y 10,10 0 0131
+Z 10,10 0 0132
+[ 10,11,2 0 0133
+lB "
+\ 10,12,2 0 0134
+rs "
+] 10,11,2 0 0135
+rB "
+^ 10,11 0 0136
+a^ "
+ha "
+_ 10,0,3 0 0137
+` 10,11 0 0140
+ga "
+a 10,7 0 0141
+b 10,11 0 0142
+c 10,7 0 0143
+d 10,11 0 0144
+e 10,7 0 0145
+f 10,11 0 0146
+g 10,7,3 0 0147
+h 10,11 0 0150
+i 10,10 0 0151
+j 10,10,3 0 0152
+k 10,11 0 0153
+l 10,11 0 0154
+m 10,7 0 0155
+n 10,7 0 0156
+o 10,7 0 0157
+p 10,7,3 0 0160
+q 10,7,3 0 0161
+r 10,7 0 0162
+s 10,7 0 0163
+t 10,9 0 0164
+u 10,7 0 0165
+v 10,7 0 0166
+w 10,7 0 0167
+x 10,7 0 0170
+y 10,7,3 0 0171
+z 10,7 0 0172
+{ 10,11,2 0 0173
+lC "
+| 10,11,2 0 0174
+ba "
+} 10,11,2 0 0175
+rC "
+~ 10,6 0 0176
+a~ "
+ti "
+--- 10,1 0 0240
+r! 10,7,3 0 0241
+ct 10,10 0 0242
+Po 10,10 0 0243
+Cs 10,8 0 0244
+Ye 10,10 0 0245
+bb 10,11,2 0 0246
+sc 10,11,1 0 0247
+ad 10,10 0 0250
+co 10,10 0 0251
+Of 10,10 0 0252
+Fo 10,7 0 0253
+tno 10,7 0 0254
+- 10,6 0 0255
+hy "
+rg 10,10 0 0256
+a- 10,10 0 0257
+de 10,11 0 0260
+t+- 10,9 0 0261
+S2 10,11 0 0262
+S3 10,11 0 0263
+aa 10,11 0 0264
+mc 10,7,3 0 0265
+ps 10,11,1 0 0266
+pc 10,6 0 0267
+ac 10,1,3 0 0270
+S1 10,11 0 0271
+Om 10,10 0 0272
+Fc 10,7 0 0273
+14 10,11 0 0274
+12 10,11 0 0275
+34 10,11 0 0276
+r? 10,7,3 0 0277
+`A 10,14 0 0300
+'A 10,14 0 0301
+^A 10,14 0 0302
+~A 10,13 0 0303
+:A 10,13 0 0304
+oA 10,14 0 0305
+AE 10,10 0 0306
+,C 10,10,3 0 0307
+`E 10,14 0 0310
+'E 10,14 0 0311
+^E 10,14 0 0312
+:E 10,13 0 0313
+`I 10,14 0 0314
+'I 10,14 0 0315
+^I 10,14 0 0316
+:I 10,13 0 0317
+-D 10,10 0 0320
+~N 10,13 0 0321
+`O 10,14 0 0322
+'O 10,14 0 0323
+^O 10,14 0 0324
+~O 10,13 0 0325
+:O 10,13 0 0326
+tmu 10,8 0 0327
+/O 10,11,1 0 0330
+`U 10,14 0 0331
+'U 10,14 0 0332
+^U 10,14 0 0333
+:U 10,13 0 0334
+'Y 10,14 0 0335
+TP 10,10 0 0336
+ss 10,11 0 0337
+`a 10,11 0 0340
+'a 10,11 0 0341
+^a 10,11 0 0342
+~a 10,10 0 0343
+:a 10,10 0 0344
+oa 10,12 0 0345
+ae 10,7 0 0346
+,c 10,7,3 0 0347
+`e 10,11 0 0350
+'e 10,11 0 0351
+^e 10,11 0 0352
+:e 10,10 0 0353
+`i 10,11 0 0354
+'i 10,11 0 0355
+^i 10,11 0 0356
+:i 10,10 0 0357
+Sd 10,12 0 0360
+~n 10,10 0 0361
+`o 10,11 0 0362
+'o 10,11 0 0363
+^o 10,11 0 0364
+~o 10,10 0 0365
+:o 10,10 0 0366
+tdi 10,9 0 0367
+/o 10,8,1 0 0370
+`u 10,11 0 0371
+'u 10,11 0 0372
+^u 10,11 0 0373
+:u 10,10 0 0374
+'y 10,11,3 0 0375
+Tp 10,11,3 0 0376
+:y 10,10,3 0 0377
diff --git a/font/devX100-12/CBI b/font/devX100-12/CBI
new file mode 100644
index 0000000..8cce3f2
--- /dev/null
+++ b/font/devX100-12/CBI
@@ -0,0 +1,215 @@
+name CBI
+spacewidth 10
+charset
+--- 10,9 0 00
+--- 10,1 0 040
+! 10,11 0 041
+" 10,11 0 042
+dq "
+# 10,11,1 0 043
+sh "
+$ 10,12,1 0 044
+Do "
+% 10,11 0 045
+& 10,9 0 046
+' 10,11 0 047
+aq "
+cq "
+oq "
+( 10,11,2 0 050
+) 10,11,2 0 051
+* 10,11 0 052
++ 10,9 0 053
+, 10,2,3 0 054
+\- 10,6 0 055
+. 10,2 0 056
+/ 10,12,2 0 057
+sl "
+0 10,11 0 060
+1 10,11 0 061
+2 10,11 0 062
+3 10,11 0 063
+4 10,11 0 064
+5 10,11 0 065
+6 10,11 0 066
+7 10,11 0 067
+8 10,11 0 070
+9 10,11 0 071
+: 10,7 0 072
+; 10,7,3 0 073
+< 10,9 0 074
+= 10,7 0 075
+> 10,9 0 076
+? 10,10 0 077
+@ 10,11,1 0 0100
+at "
+A 10,10 0 0101
+B 10,10 0 0102
+C 10,10 0 0103
+D 10,10 0 0104
+E 10,10 0 0105
+F 10,10 0 0106
+G 10,10 0 0107
+H 10,10 0 0110
+I 10,10 0 0111
+J 10,10 0 0112
+K 10,10 0 0113
+L 10,10 0 0114
+M 10,10 0 0115
+N 10,10 0 0116
+O 10,10 0 0117
+P 10,10 0 0120
+Q 10,10,2 0 0121
+R 10,10 0 0122
+S 10,10 0 0123
+T 10,10 0 0124
+U 10,10 0 0125
+V 10,10 0 0126
+W 10,10 0 0127
+X 10,10 0 0130
+Y 10,10 0 0131
+Z 10,10 0 0132
+[ 10,11,2 0 0133
+lB "
+\ 10,12,2 0 0134
+rs "
+] 10,11,2 0 0135
+rB "
+^ 10,11 0 0136
+a^ "
+ha "
+_ 10,0,3 0 0137
+` 10,11 0 0140
+ga "
+a 10,7 0 0141
+b 10,11 0 0142
+c 10,7 0 0143
+d 10,11 0 0144
+e 10,7 0 0145
+f 10,11 0 0146
+g 10,7,3 0 0147
+h 10,11 0 0150
+i 10,10 0 0151
+j 10,10,3 0 0152
+k 10,11 0 0153
+l 10,11 0 0154
+m 10,7 0 0155
+n 10,7 0 0156
+o 10,7 0 0157
+p 10,7,3 0 0160
+q 10,7,3 0 0161
+r 10,7 0 0162
+s 10,7 0 0163
+t 10,9 0 0164
+u 10,7 0 0165
+v 10,7 0 0166
+w 10,7 0 0167
+x 10,7 0 0170
+y 10,7,3 0 0171
+z 10,7 0 0172
+{ 10,11,2 0 0173
+lC "
+| 10,11,2 0 0174
+ba "
+} 10,11,2 0 0175
+rC "
+~ 10,6 0 0176
+a~ "
+ti "
+--- 10,1 0 0240
+r! 10,7,4 0 0241
+ct 10,10 0 0242
+Po 10,10 0 0243
+Cs 10,8 0 0244
+Ye 10,10 0 0245
+bb 10,11,2 0 0246
+sc 10,11,1 0 0247
+ad 10,10 0 0250
+co 10,10 0 0251
+Of 10,10 0 0252
+Fo 10,7 0 0253
+tno 10,7 0 0254
+- 10,6 0 0255
+hy "
+rg 10,10 0 0256
+a- 10,9 0 0257
+de 10,11 0 0260
+t+- 10,10 0 0261
+S2 10,11 0 0262
+S3 10,11 0 0263
+aa 10,11 0 0264
+mc 10,7,3 0 0265
+ps 10,11,1 0 0266
+pc 10,6 0 0267
+ac 10,0,3 0 0270
+S1 10,11 0 0271
+Om 10,10 0 0272
+Fc 10,7 0 0273
+14 10,11 0 0274
+12 10,11 0 0275
+34 10,11 0 0276
+r? 10,7,4 0 0277
+`A 10,14 0 0300
+'A 10,14 0 0301
+^A 10,14 0 0302
+~A 10,13 0 0303
+:A 10,13 0 0304
+oA 10,14 0 0305
+AE 10,10 0 0306
+,C 10,10,3 0 0307
+`E 10,14 0 0310
+'E 10,14 0 0311
+^E 10,14 0 0312
+:E 10,13 0 0313
+`I 10,14 0 0314
+'I 10,14 0 0315
+^I 10,14 0 0316
+:I 10,13 0 0317
+-D 10,10 0 0320
+~N 10,13 0 0321
+`O 10,14 0 0322
+'O 10,14 0 0323
+^O 10,14 0 0324
+~O 10,13 0 0325
+:O 10,13 0 0326
+tmu 10,8 0 0327
+/O 10,10 0 0330
+`U 10,14 0 0331
+'U 10,14 0 0332
+^U 10,14 0 0333
+:U 10,13 0 0334
+'Y 10,14 0 0335
+TP 10,10 0 0336
+ss 10,11 0 0337
+`a 10,11 0 0340
+'a 10,11 0 0341
+^a 10,11 0 0342
+~a 10,10 0 0343
+:a 10,10 0 0344
+oa 10,11 0 0345
+ae 10,7 0 0346
+,c 10,7,3 0 0347
+`e 10,11 0 0350
+'e 10,11 0 0351
+^e 10,11 0 0352
+:e 10,10 0 0353
+`i 10,11 0 0354
+'i 10,11 0 0355
+^i 10,11 0 0356
+:i 10,10 0 0357
+Sd 10,12 0 0360
+~n 10,10 0 0361
+`o 10,11 0 0362
+'o 10,11 0 0363
+^o 10,11 0 0364
+~o 10,10 0 0365
+:o 10,10 0 0366
+tdi 10,9 0 0367
+/o 10,8,1 0 0370
+`u 10,11 0 0371
+'u 10,11 0 0372
+^u 10,11 0 0373
+:u 10,10 0 0374
+'y 10,11,3 0 0375
+Tp 10,11,3 0 0376
+:y 10,10,3 0 0377
diff --git a/font/devX100-12/CI b/font/devX100-12/CI
new file mode 100644
index 0000000..0d460bd
--- /dev/null
+++ b/font/devX100-12/CI
@@ -0,0 +1,215 @@
+name CI
+spacewidth 10
+charset
+--- 10,9 0 00
+--- 10,1 0 040
+! 10,11 0 041
+" 10,11 0 042
+dq "
+# 10,11,1 0 043
+sh "
+$ 10,12,1 0 044
+Do "
+% 10,11 0 045
+& 10,9 0 046
+' 10,11 0 047
+aq "
+cq "
+oq "
+( 10,11,2 0 050
+) 10,11,2 0 051
+* 10,10 0 052
++ 10,9 0 053
+, 10,2,2 0 054
+\- 10,5 0 055
+. 10,2 0 056
+/ 10,11,2 0 057
+sl "
+0 10,11 0 060
+1 10,11 0 061
+2 10,11 0 062
+3 10,11 0 063
+4 10,11 0 064
+5 10,11 0 065
+6 10,11 0 066
+7 10,11 0 067
+8 10,11 0 070
+9 10,11 0 071
+: 10,7 0 072
+; 10,7,2 0 073
+< 10,9 0 074
+= 10,7 0 075
+> 10,9 0 076
+? 10,10 0 077
+@ 10,11,1 0 0100
+at "
+A 10,10 0 0101
+B 10,10 0 0102
+C 10,10 0 0103
+D 10,10 0 0104
+E 10,10 0 0105
+F 10,10 0 0106
+G 10,10 0 0107
+H 10,10 0 0110
+I 10,10 0 0111
+J 10,10 0 0112
+K 10,10 0 0113
+L 10,10 0 0114
+M 10,10 0 0115
+N 10,10 0 0116
+O 10,10 0 0117
+P 10,10 0 0120
+Q 10,10,2 0 0121
+R 10,10 0 0122
+S 10,10 0 0123
+T 10,10 0 0124
+U 10,10 0 0125
+V 10,10 0 0126
+W 10,10 0 0127
+X 10,10 0 0130
+Y 10,10 0 0131
+Z 10,10 0 0132
+[ 10,11,2 0 0133
+lB "
+\ 10,11,2 0 0134
+rs "
+] 10,11,2 0 0135
+rB "
+^ 10,11 0 0136
+a^ "
+ha "
+_ 10,0,3 0 0137
+` 10,11 0 0140
+ga "
+a 10,7 0 0141
+b 10,10 0 0142
+c 10,7 0 0143
+d 10,10 0 0144
+e 10,7 0 0145
+f 10,10 0 0146
+g 10,7,3 0 0147
+h 10,10 0 0150
+i 10,11 0 0151
+j 10,11,3 0 0152
+k 10,10 0 0153
+l 10,10 0 0154
+m 10,7 0 0155
+n 10,7 0 0156
+o 10,7 0 0157
+p 10,7,3 0 0160
+q 10,7,3 0 0161
+r 10,7 0 0162
+s 10,7 0 0163
+t 10,9 0 0164
+u 10,7 0 0165
+v 10,7 0 0166
+w 10,7 0 0167
+x 10,7 0 0170
+y 10,7,3 0 0171
+z 10,7 0 0172
+{ 10,11,2 0 0173
+lC "
+| 10,10,2 0 0174
+ba "
+} 10,11,2 0 0175
+rC "
+~ 10,6 0 0176
+a~ "
+ti "
+--- 10,1 0 0240
+r! 10,7,4 0 0241
+ct 10,10 0 0242
+Po 10,10 0 0243
+Cs 10,8 0 0244
+Ye 10,10 0 0245
+bb 10,11,2 0 0246
+sc 10,11,1 0 0247
+ad 10,10 0 0250
+co 10,10 0 0251
+Of 10,10 0 0252
+Fo 10,7 0 0253
+tno 10,6 0 0254
+- 10,5 0 0255
+hy "
+rg 10,10 0 0256
+a- 10,10 0 0257
+de 10,11 0 0260
+t+- 10,9 0 0261
+S2 10,11 0 0262
+S3 10,11 0 0263
+aa 10,11 0 0264
+mc 10,7,3 0 0265
+ps 10,11,1 0 0266
+pc 10,6 0 0267
+ac 10,0,3 0 0270
+S1 10,11 0 0271
+Om 10,10 0 0272
+Fc 10,7 0 0273
+14 10,11 0 0274
+12 10,11 0 0275
+34 10,11 0 0276
+r? 10,7,3 0 0277
+`A 10,14 0 0300
+'A 10,14 0 0301
+^A 10,14 0 0302
+~A 10,13 0 0303
+:A 10,13 0 0304
+oA 10,14 0 0305
+AE 10,10 0 0306
+,C 10,10,3 0 0307
+`E 10,14 0 0310
+'E 10,14 0 0311
+^E 10,14 0 0312
+:E 10,13 0 0313
+`I 10,14 0 0314
+'I 10,14 0 0315
+^I 10,14 0 0316
+:I 10,13 0 0317
+-D 10,10 0 0320
+~N 10,13 0 0321
+`O 10,14 0 0322
+'O 10,14 0 0323
+^O 10,14 0 0324
+~O 10,13 0 0325
+:O 10,13 0 0326
+tmu 10,8 0 0327
+/O 10,10 0 0330
+`U 10,14 0 0331
+'U 10,14 0 0332
+^U 10,14 0 0333
+:U 10,13 0 0334
+'Y 10,14 0 0335
+TP 10,10 0 0336
+ss 10,11 0 0337
+`a 10,11 0 0340
+'a 10,11 0 0341
+^a 10,11 0 0342
+~a 10,10 0 0343
+:a 10,10 0 0344
+oa 10,11 0 0345
+ae 10,7 0 0346
+,c 10,7,3 0 0347
+`e 10,11 0 0350
+'e 10,11 0 0351
+^e 10,11 0 0352
+:e 10,10 0 0353
+`i 10,11 0 0354
+'i 10,11 0 0355
+^i 10,11 0 0356
+:i 10,10 0 0357
+Sd 10,11 0 0360
+~n 10,10 0 0361
+`o 10,11 0 0362
+'o 10,11 0 0363
+^o 10,11 0 0364
+~o 10,10 0 0365
+:o 10,10 0 0366
+tdi 10,8 0 0367
+/o 10,8,1 0 0370
+`u 10,11 0 0371
+'u 10,11 0 0372
+^u 10,11 0 0373
+:u 10,10 0 0374
+'y 10,11,3 0 0375
+Tp 10,11,3 0 0376
+:y 10,10,3 0 0377
diff --git a/font/devX100-12/CR b/font/devX100-12/CR
new file mode 100644
index 0000000..93bce20
--- /dev/null
+++ b/font/devX100-12/CR
@@ -0,0 +1,215 @@
+name CR
+spacewidth 10
+charset
+--- 10,9 0 00
+--- 10,1 0 040
+! 10,11 0 041
+" 10,11 0 042
+dq "
+# 10,11,1 0 043
+sh "
+$ 10,12,1 0 044
+Do "
+% 10,11 0 045
+& 10,9 0 046
+' 10,11 0 047
+aq "
+cq "
+oq "
+( 10,11,2 0 050
+) 10,11,2 0 051
+* 10,11 0 052
++ 10,9 0 053
+, 10,2,2 0 054
+\- 10,5 0 055
+. 10,2 0 056
+/ 10,11,2 0 057
+sl "
+0 10,11 0 060
+1 10,11 0 061
+2 10,11 0 062
+3 10,11 0 063
+4 10,11 0 064
+5 10,11 0 065
+6 10,11 0 066
+7 10,11 0 067
+8 10,11 0 070
+9 10,11 0 071
+: 10,7 0 072
+; 10,7,2 0 073
+< 10,9 0 074
+= 10,7 0 075
+> 10,9 0 076
+? 10,10 0 077
+@ 10,11,1 0 0100
+at "
+A 10,10 0 0101
+B 10,10 0 0102
+C 10,10 0 0103
+D 10,10 0 0104
+E 10,10 0 0105
+F 10,10 0 0106
+G 10,10 0 0107
+H 10,10 0 0110
+I 10,10 0 0111
+J 10,10 0 0112
+K 10,10 0 0113
+L 10,10 0 0114
+M 10,10 0 0115
+N 10,10 0 0116
+O 10,10 0 0117
+P 10,10 0 0120
+Q 10,10,2 0 0121
+R 10,10 0 0122
+S 10,10 0 0123
+T 10,10 0 0124
+U 10,10 0 0125
+V 10,10 0 0126
+W 10,10 0 0127
+X 10,10 0 0130
+Y 10,10 0 0131
+Z 10,10 0 0132
+[ 10,11,2 0 0133
+lB "
+\ 10,11,2 0 0134
+rs "
+] 10,11,2 0 0135
+rB "
+^ 10,11 0 0136
+a^ "
+ha "
+_ 10,0,3 0 0137
+` 10,11 0 0140
+ga "
+a 10,7 0 0141
+b 10,10 0 0142
+c 10,7 0 0143
+d 10,10 0 0144
+e 10,7 0 0145
+f 10,10 0 0146
+g 10,7,3 0 0147
+h 10,10 0 0150
+i 10,10 0 0151
+j 10,10,3 0 0152
+k 10,10 0 0153
+l 10,10 0 0154
+m 10,7 0 0155
+n 10,7 0 0156
+o 10,7 0 0157
+p 10,7,3 0 0160
+q 10,7,3 0 0161
+r 10,7 0 0162
+s 10,7 0 0163
+t 10,9 0 0164
+u 10,7 0 0165
+v 10,7 0 0166
+w 10,7 0 0167
+x 10,7 0 0170
+y 10,7,3 0 0171
+z 10,7 0 0172
+{ 10,11,2 0 0173
+lC "
+| 10,10,2 0 0174
+ba "
+} 10,11,2 0 0175
+rC "
+~ 10,6 0 0176
+a~ "
+ti "
+--- 10,1 0 0240
+r! 10,7,3 0 0241
+ct 10,10 0 0242
+Po 10,10 0 0243
+Cs 10,8 0 0244
+Ye 10,10 0 0245
+bb 10,10,2 0 0246
+sc 10,11,1 0 0247
+ad 10,10 0 0250
+co 10,10 0 0251
+Of 10,10 0 0252
+Fo 10,7 0 0253
+tno 10,6 0 0254
+- 10,5 0 0255
+hy "
+rg 10,10 0 0256
+a- 10,9 0 0257
+de 10,11 0 0260
+t+- 10,9 0 0261
+S2 10,11 0 0262
+S3 10,11 0 0263
+aa 10,11 0 0264
+mc 10,7,3 0 0265
+ps 10,11,1 0 0266
+pc 10,6 0 0267
+ac 10,1,3 0 0270
+S1 10,11 0 0271
+Om 10,10 0 0272
+Fc 10,7 0 0273
+14 10,11 0 0274
+12 10,11 0 0275
+34 10,11 0 0276
+r? 10,7,3 0 0277
+`A 10,14 0 0300
+'A 10,14 0 0301
+^A 10,14 0 0302
+~A 10,13 0 0303
+:A 10,13 0 0304
+oA 10,14 0 0305
+AE 10,10 0 0306
+,C 10,10,3 0 0307
+`E 10,14 0 0310
+'E 10,14 0 0311
+^E 10,14 0 0312
+:E 10,13 0 0313
+`I 10,14 0 0314
+'I 10,14 0 0315
+^I 10,14 0 0316
+:I 10,13 0 0317
+-D 10,10 0 0320
+~N 10,13 0 0321
+`O 10,14 0 0322
+'O 10,14 0 0323
+^O 10,14 0 0324
+~O 10,13 0 0325
+:O 10,13 0 0326
+tmu 10,8 0 0327
+/O 10,10 0 0330
+`U 10,14 0 0331
+'U 10,14 0 0332
+^U 10,14 0 0333
+:U 10,13 0 0334
+'Y 10,14 0 0335
+TP 10,10 0 0336
+ss 10,11 0 0337
+`a 10,11 0 0340
+'a 10,11 0 0341
+^a 10,11 0 0342
+~a 10,10 0 0343
+:a 10,10 0 0344
+oa 10,12 0 0345
+ae 10,7 0 0346
+,c 10,7,3 0 0347
+`e 10,11 0 0350
+'e 10,11 0 0351
+^e 10,11 0 0352
+:e 10,10 0 0353
+`i 10,11 0 0354
+'i 10,11 0 0355
+^i 10,11 0 0356
+:i 10,10 0 0357
+Sd 10,11 0 0360
+~n 10,10 0 0361
+`o 10,11 0 0362
+'o 10,11 0 0363
+^o 10,11 0 0364
+~o 10,10 0 0365
+:o 10,10 0 0366
+tdi 10,8 0 0367
+/o 10,8,1 0 0370
+`u 10,11 0 0371
+'u 10,11 0 0372
+^u 10,11 0 0373
+:u 10,10 0 0374
+'y 10,11,3 0 0375
+Tp 10,11,3 0 0376
+:y 10,10,3 0 0377
diff --git a/font/devX100-12/DESC b/font/devX100-12/DESC
new file mode 100644
index 0000000..ead70b9
--- /dev/null
+++ b/font/devX100-12/DESC
@@ -0,0 +1,9 @@
+styles R I B BI
+fonts 6 0 0 0 0 0 S
+sizes 8 10 12 14 18 24 0
+res 100
+X11
+hor 1
+vert 1
+unitwidth 12
+postpro gxditview
diff --git a/font/devX100-12/HB b/font/devX100-12/HB
new file mode 100644
index 0000000..001ac75
--- /dev/null
+++ b/font/devX100-12/HB
@@ -0,0 +1,215 @@
+name HB
+spacewidth 5
+charset
+--- 12,11 0 00
+--- 5,1 0 040
+! 6,12 0 041
+" 8,12 0 042
+dq "
+# 9,12 0 043
+sh "
+$ 9,13,1 0 044
+Do "
+% 14,12 0 045
+& 12,12 0 046
+' 4,12 0 047
+aq "
+cq "
+oq "
+( 6,12,3 0 050
+) 6,12,3 0 051
+* 6,12 0 052
++ 10,8 0 053
+, 4,2,3 0 054
+\- 5,5 0 055
+. 4,2 0 056
+/ 5,12 0 057
+sl "
+0 9,12 0 060
+1 9,12 0 061
+2 9,12 0 062
+3 9,12 0 063
+4 9,12 0 064
+5 9,12 0 065
+6 9,12 0 066
+7 9,12 0 067
+8 9,12 0 070
+9 9,12 0 071
+: 5,8 0 072
+; 5,8,3 0 073
+< 10,8 0 074
+= 10,7 0 075
+> 10,8 0 076
+? 10,12 0 077
+@ 16,12,2 0 0100
+at "
+A 12,12 0 0101
+B 11,12 0 0102
+C 12,12 0 0103
+D 12,12 0 0104
+E 10,12 0 0105
+F 10,12 0 0106
+G 12,12 0 0107
+H 12,12 0 0110
+I 4,12 0 0111
+J 9,12 0 0112
+K 12,12 0 0113
+L 10,12 0 0114
+M 13,12 0 0115
+N 12,12 0 0116
+O 13,12 0 0117
+P 11,12 0 0120
+Q 13,12,1 0 0121
+R 12,12 0 0122
+S 11,12 0 0123
+T 10,12 0 0124
+U 12,12 0 0125
+V 11,12 0 0126
+W 15,12 0 0127
+X 11,12 0 0130
+Y 11,12 0 0131
+Z 10,12 0 0132
+[ 6,12,3 0 0133
+lB "
+\ 5,12 0 0134
+rs "
+] 6,12,3 0 0135
+rB "
+^ 10,12 0 0136
+a^ "
+ha "
+_ 9,0,3 0 0137
+` 6,13 0 0140
+ga "
+a 9,9 0 0141
+b 10,12 0 0142
+c 9,9 0 0143
+d 10,12 0 0144
+e 10,9 0 0145
+f 6,12 0 0146
+g 10,9,4 0 0147
+h 10,12 0 0150
+i 4,12 0 0151
+j 5,12,4 0 0152
+k 9,12 0 0153
+l 4,12 0 0154
+m 14,9 0 0155
+n 10,9 0 0156
+o 10,9 0 0157
+p 10,9,4 0 0160
+q 10,9,4 0 0161
+r 6,9 0 0162
+s 9,9 0 0163
+t 6,11 0 0164
+u 10,9 0 0165
+v 9,9 0 0166
+w 13,9 0 0167
+x 9,9 0 0170
+y 9,9,4 0 0171
+z 8,9 0 0172
+{ 6,12,3 0 0173
+lC "
+| 4,12,4 0 0174
+ba "
+} 6,12,3 0 0175
+rC "
+~ 10,6 0 0176
+a~ "
+ti "
+--- 5,1 0 0240
+r! 6,9,3 0 0241
+ct 9,10,1 0 0242
+Po 9,12 0 0243
+Cs 9,9 0 0244
+Ye 9,12 0 0245
+bb 5,12,4 0 0246
+sc 9,12,3 0 0247
+ad 6,12 0 0250
+co 12,12 0 0251
+Of 6,12 0 0252
+Fo 9,8 0 0253
+tno 10,7 0 0254
+- 5,5 0 0255
+hy "
+rg 12,12 0 0256
+a- 6,11 0 0257
+de 7,12 0 0260
+t+- 10,11 0 0261
+S2 6,12 0 0262
+S3 6,12 0 0263
+aa 6,13 0 0264
+mc 10,9,3 0 0265
+ps 9,12,3 0 0266
+pc 5,6 0 0267
+ac 6,0,4 0 0270
+S1 6,12 0 0271
+Om 6,12 0 0272
+Fc 9,8 0 0273
+14 14,12 0 0274
+12 14,12 0 0275
+34 14,12 0 0276
+r? 10,9,3 0 0277
+`A 12,16 0 0300
+'A 12,16 0 0301
+^A 12,16 0 0302
+~A 12,15 0 0303
+:A 12,15 0 0304
+oA 12,16 0 0305
+AE 15,12 0 0306
+,C 12,12,4 0 0307
+`E 10,16 0 0310
+'E 10,16 0 0311
+^E 10,16 0 0312
+:E 10,15 0 0313
+`I 4,16 0 0314
+'I 4,16 0 0315
+^I 4,16 0 0316
+:I 4,15 0 0317
+-D 12,12 0 0320
+~N 12,15 0 0321
+`O 13,16 0 0322
+'O 13,16 0 0323
+^O 13,16 0 0324
+~O 13,15 0 0325
+:O 13,15 0 0326
+tmu 10,9 0 0327
+/O 13,12 0 0330
+`U 12,16 0 0331
+'U 12,16 0 0332
+^U 12,16 0 0333
+:U 12,15 0 0334
+'Y 11,16 0 0335
+TP 11,12 0 0336
+ss 10,12 0 0337
+`a 9,13 0 0340
+'a 9,13 0 0341
+^a 9,13 0 0342
+~a 9,12 0 0343
+:a 9,12 0 0344
+oa 9,13 0 0345
+ae 15,9 0 0346
+,c 9,9,4 0 0347
+`e 10,13 0 0350
+'e 10,13 0 0351
+^e 10,13 0 0352
+:e 10,12 0 0353
+`i 4,13 0 0354
+'i 4,13 0 0355
+^i 4,13 0 0356
+:i 4,12 0 0357
+Sd 10,12 0 0360
+~n 10,12 0 0361
+`o 10,13 0 0362
+'o 10,13 0 0363
+^o 10,13 0 0364
+~o 10,12 0 0365
+:o 10,12 0 0366
+tdi 10,8 0 0367
+/o 10,9 0 0370
+`u 10,13 0 0371
+'u 10,13 0 0372
+^u 10,13 0 0373
+:u 10,12 0 0374
+'y 9,13,4 0 0375
+Tp 10,12,4 0 0376
+:y 9,12,4 0 0377
diff --git a/font/devX100-12/HBI b/font/devX100-12/HBI
new file mode 100644
index 0000000..57ad375
--- /dev/null
+++ b/font/devX100-12/HBI
@@ -0,0 +1,215 @@
+name HBI
+spacewidth 5
+charset
+--- 12,11 0 00
+--- 5,1 0 040
+! 6,12 0 041
+" 8,12 0 042
+dq "
+# 9,12 0 043
+sh "
+$ 9,13,1 0 044
+Do "
+% 14,12 0 045
+& 12,12 0 046
+' 4,12 0 047
+aq "
+cq "
+oq "
+( 6,12,3 0 050
+) 6,12,3 0 051
+* 6,12 0 052
++ 10,8 0 053
+, 4,2,3 0 054
+\- 5,5 0 055
+. 4,2 0 056
+/ 5,12 0 057
+sl "
+0 9,12 0 060
+1 9,12 0 061
+2 9,12 0 062
+3 9,12 0 063
+4 9,12 0 064
+5 9,12 0 065
+6 9,12 0 066
+7 9,12 0 067
+8 9,12 0 070
+9 9,12 0 071
+: 5,8 0 072
+; 5,8,3 0 073
+< 10,8 0 074
+= 10,7 0 075
+> 10,8 0 076
+? 10,12 0 077
+@ 16,12,2 0 0100
+at "
+A 12,12 0 0101
+B 12,12 0 0102
+C 12,12 0 0103
+D 12,12 0 0104
+E 11,12 0 0105
+F 10,12 0 0106
+G 13,12 0 0107
+H 12,12 0 0110
+I 4,12 0 0111
+J 9,12 0 0112
+K 12,12 0 0113
+L 10,12 0 0114
+M 13,12 0 0115
+N 12,12 0 0116
+O 13,12 0 0117
+P 11,12 0 0120
+Q 13,12,1 0 0121
+R 12,12 0 0122
+S 11,12 0 0123
+T 10,12 0 0124
+U 12,12 0 0125
+V 11,12 0 0126
+W 15,12 0 0127
+X 11,12 0 0130
+Y 11,12 0 0131
+Z 10,12 0 0132
+[ 6,12,3 0 0133
+lB "
+\ 5,12 0 0134
+rs "
+] 6,12,3 0 0135
+rB "
+^ 10,12 0 0136
+a^ "
+ha "
+_ 9,0,3 0 0137
+` 6,13 0 0140
+ga "
+a 9,9 0 0141
+b 10,12 0 0142
+c 9,9 0 0143
+d 10,12 0 0144
+e 9,9 0 0145
+f 5,12 0 0146
+g 10,9,4 0 0147
+h 10,12 0 0150
+i 4,12 0 0151
+j 5,12,4 0 0152
+k 9,12 0 0153
+l 5,12 0 0154
+m 14,9 0 0155
+n 10,9 0 0156
+o 10,9 0 0157
+p 10,9,4 0 0160
+q 10,9,4 0 0161
+r 6,9 0 0162
+s 9,9 0 0163
+t 6,12 0 0164
+u 10,9 0 0165
+v 9,9 0 0166
+w 13,9 0 0167
+x 9,9 0 0170
+y 9,9,4 0 0171
+z 8,9 0 0172
+{ 6,12,3 0 0173
+lC "
+| 3,12,4 0 0174
+ba "
+} 6,12,3 0 0175
+rC "
+~ 10,5 0 0176
+a~ "
+ti "
+--- 5,1 0 0240
+r! 6,9,3 0 0241
+ct 9,10,1 0 0242
+Po 9,12 0 0243
+Cs 9,9 0 0244
+Ye 9,12 0 0245
+bb 5,12,4 0 0246
+sc 9,12,3 0 0247
+ad 6,12 0 0250
+co 12,12 0 0251
+Of 6,12 0 0252
+Fo 9,8 0 0253
+tno 10,7 0 0254
+- 5,5 0 0255
+hy "
+rg 12,12 0 0256
+a- 6,11 0 0257
+de 7,12 0 0260
+t+- 10,11 0 0261
+S2 6,12 0 0262
+S3 6,12 0 0263
+aa 6,13 0 0264
+mc 10,9,4 0 0265
+ps 9,12,3 0 0266
+pc 5,6 0 0267
+ac 6,0,4 0 0270
+S1 6,12 0 0271
+Om 6,12 0 0272
+Fc 9,8 0 0273
+14 14,12 0 0274
+12 14,12 0 0275
+34 14,12 0 0276
+r? 10,9,3 0 0277
+`A 12,16 0 0300
+'A 12,16 0 0301
+^A 12,16 0 0302
+~A 12,15 0 0303
+:A 12,15 0 0304
+oA 12,15 0 0305
+AE 17,12 0 0306
+,C 12,12,4 0 0307
+`E 11,16 0 0310
+'E 11,16 0 0311
+^E 11,16 0 0312
+:E 11,15 0 0313
+`I 4,16 0 0314
+'I 4,16 0 0315
+^I 4,16 0 0316
+:I 4,15 0 0317
+-D 12,12 0 0320
+~N 12,15 0 0321
+`O 13,16 0 0322
+'O 13,16 0 0323
+^O 13,16 0 0324
+~O 13,15 0 0325
+:O 13,15 0 0326
+tmu 10,8 0 0327
+/O 13,12 0 0330
+`U 12,16 0 0331
+'U 12,16 0 0332
+^U 12,16 0 0333
+:U 12,15 0 0334
+'Y 11,16 0 0335
+TP 11,12 0 0336
+ss 10,12 0 0337
+`a 9,13 0 0340
+'a 9,13 0 0341
+^a 9,13 0 0342
+~a 9,12 0 0343
+:a 9,12 0 0344
+oa 9,13 0 0345
+ae 15,9 0 0346
+,c 9,9,4 0 0347
+`e 9,13 0 0350
+'e 9,13 0 0351
+^e 9,13 0 0352
+:e 9,12 0 0353
+`i 4,13 0 0354
+'i 4,13 0 0355
+^i 4,13 0 0356
+:i 4,12 0 0357
+Sd 10,13 0 0360
+~n 10,12 0 0361
+`o 10,13 0 0362
+'o 10,13 0 0363
+^o 10,13 0 0364
+~o 10,12 0 0365
+:o 10,12 0 0366
+tdi 10,8 0 0367
+/o 10,9 0 0370
+`u 10,13 0 0371
+'u 10,13 0 0372
+^u 10,13 0 0373
+:u 10,12 0 0374
+'y 9,13,4 0 0375
+Tp 10,12,4 0 0376
+:y 9,12,4 0 0377
diff --git a/font/devX100-12/HI b/font/devX100-12/HI
new file mode 100644
index 0000000..78fd900
--- /dev/null
+++ b/font/devX100-12/HI
@@ -0,0 +1,215 @@
+name HI
+spacewidth 5
+charset
+--- 12,11 0 00
+--- 5,1 0 040
+! 5,12 0 041
+" 6,12 0 042
+dq "
+# 9,12 0 043
+sh "
+$ 9,13,1 0 044
+Do "
+% 14,12 0 045
+& 11,12 0 046
+' 3,12 0 047
+aq "
+cq "
+oq "
+( 6,12,3 0 050
+) 6,12,3 0 051
+* 6,12 0 052
++ 10,9 0 053
+, 4,2,2 0 054
+\- 5,5 0 055
+. 4,2 0 056
+/ 5,12 0 057
+sl "
+0 9,12 0 060
+1 9,12 0 061
+2 9,12 0 062
+3 9,12 0 063
+4 9,12 0 064
+5 9,12 0 065
+6 9,12 0 066
+7 9,12 0 067
+8 9,12 0 070
+9 9,12 0 071
+: 4,9 0 072
+; 4,9,2 0 073
+< 10,9 0 074
+= 10,6 0 075
+> 10,9 0 076
+? 9,12 0 077
+@ 17,12,1 0 0100
+at "
+A 11,12 0 0101
+B 11,12 0 0102
+C 12,12 0 0103
+D 12,12 0 0104
+E 11,12 0 0105
+F 10,12 0 0106
+G 13,12 0 0107
+H 12,12 0 0110
+I 4,12 0 0111
+J 8,12 0 0112
+K 11,12 0 0113
+L 9,12 0 0114
+M 13,12 0 0115
+N 12,12 0 0116
+O 13,12 0 0117
+P 11,12 0 0120
+Q 13,12,1 0 0121
+R 12,12 0 0122
+S 11,12 0 0123
+T 10,12 0 0124
+U 12,12 0 0125
+V 11,12 0 0126
+W 16,12 0 0127
+X 11,12 0 0130
+Y 11,12 0 0131
+Z 10,12 0 0132
+[ 5,12,3 0 0133
+lB "
+\ 5,12 0 0134
+rs "
+] 5,12,3 0 0135
+rB "
+^ 8,12 0 0136
+a^ "
+ha "
+_ 9,0,3 0 0137
+` 6,13 0 0140
+ga "
+a 9,9 0 0141
+b 9,12 0 0142
+c 8,9 0 0143
+d 9,12 0 0144
+e 9,9 0 0145
+f 5,12 0 0146
+g 9,9,4 0 0147
+h 9,12 0 0150
+i 3,12 0 0151
+j 4,12,4 0 0152
+k 8,12 0 0153
+l 4,12 0 0154
+m 14,9 0 0155
+n 9,9 0 0156
+o 9,9 0 0157
+p 9,9,4 0 0160
+q 9,9,4 0 0161
+r 5,9 0 0162
+s 8,9 0 0163
+t 5,11 0 0164
+u 9,9 0 0165
+v 8,9 0 0166
+w 12,9 0 0167
+x 8,9 0 0170
+y 8,9,4 0 0171
+z 8,9 0 0172
+{ 6,12,3 0 0173
+lC "
+| 3,12,4 0 0174
+ba "
+} 6,12,3 0 0175
+rC "
+~ 10,6 0 0176
+a~ "
+ti "
+--- 5,1 0 0240
+r! 6,9,3 0 0241
+ct 9,10,1 0 0242
+Po 9,12 0 0243
+Cs 9,10 0 0244
+Ye 9,12 0 0245
+bb 4,12,4 0 0246
+sc 9,12,3 0 0247
+ad 5,12 0 0250
+co 12,12 0 0251
+Of 6,12 0 0252
+Fo 9,8 0 0253
+tno 10,6 0 0254
+- 5,5 0 0255
+hy "
+rg 12,12 0 0256
+a- 6,11 0 0257
+de 7,12 0 0260
+t+- 10,11 0 0261
+S2 6,12 0 0262
+S3 6,12 0 0263
+aa 6,13 0 0264
+mc 9,9,4 0 0265
+ps 9,12,3 0 0266
+pc 5,7 0 0267
+ac 6,0,4 0 0270
+S1 6,12 0 0271
+Om 6,12 0 0272
+Fc 9,8 0 0273
+14 14,12 0 0274
+12 14,13 0 0275
+34 14,12 0 0276
+r? 10,9,3 0 0277
+`A 11,16 0 0300
+'A 11,16 0 0301
+^A 11,16 0 0302
+~A 11,15 0 0303
+:A 11,15 0 0304
+oA 11,15 0 0305
+AE 16,12 0 0306
+,C 12,12,3 0 0307
+`E 11,16 0 0310
+'E 11,16 0 0311
+^E 11,16 0 0312
+:E 11,15 0 0313
+`I 4,16 0 0314
+'I 4,16 0 0315
+^I 4,16 0 0316
+:I 4,15 0 0317
+-D 12,12 0 0320
+~N 12,15 0 0321
+`O 13,16 0 0322
+'O 13,16 0 0323
+^O 13,16 0 0324
+~O 13,15 0 0325
+:O 13,15 0 0326
+tmu 10,8 0 0327
+/O 13,12 0 0330
+`U 12,16 0 0331
+'U 12,16 0 0332
+^U 12,16 0 0333
+:U 12,15 0 0334
+'Y 11,16 0 0335
+TP 11,12 0 0336
+ss 10,12 0 0337
+`a 9,13 0 0340
+'a 9,13 0 0341
+^a 9,13 0 0342
+~a 9,12 0 0343
+:a 9,12 0 0344
+oa 9,13 0 0345
+ae 15,9 0 0346
+,c 8,9,3 0 0347
+`e 9,13 0 0350
+'e 9,13 0 0351
+^e 9,13 0 0352
+:e 9,12 0 0353
+`i 4,13 0 0354
+'i 4,13 0 0355
+^i 4,13 0 0356
+:i 4,12 0 0357
+Sd 9,12 0 0360
+~n 9,12 0 0361
+`o 9,13 0 0362
+'o 9,13 0 0363
+^o 9,13 0 0364
+~o 9,12 0 0365
+:o 9,12 0 0366
+tdi 10,9 0 0367
+/o 10,9 0 0370
+`u 9,13 0 0371
+'u 9,13 0 0372
+^u 9,13 0 0373
+:u 9,12 0 0374
+'y 8,13,4 0 0375
+Tp 9,12,4 0 0376
+:y 8,12,4 0 0377
diff --git a/font/devX100-12/HR b/font/devX100-12/HR
new file mode 100644
index 0000000..ec864ad
--- /dev/null
+++ b/font/devX100-12/HR
@@ -0,0 +1,215 @@
+name HR
+spacewidth 5
+charset
+--- 12,11 0 00
+--- 5,1 0 040
+! 5,12 0 041
+" 6,12 0 042
+dq "
+# 9,11 0 043
+sh "
+$ 9,13,2 0 044
+Do "
+% 14,12 0 045
+& 11,12 0 046
+' 3,12 0 047
+aq "
+cq "
+oq "
+( 6,12,4 0 050
+) 6,12,4 0 051
+* 6,12 0 052
++ 10,9 0 053
+, 4,2,2 0 054
+\- 5,5 0 055
+. 4,2 0 056
+/ 5,12 0 057
+sl "
+0 9,12 0 060
+1 9,12 0 061
+2 9,12 0 062
+3 9,12 0 063
+4 9,12 0 064
+5 9,12 0 065
+6 9,12 0 066
+7 9,12 0 067
+8 9,12 0 070
+9 9,12 0 071
+: 4,9 0 072
+; 4,9,2 0 073
+< 10,9 0 074
+= 10,6 0 075
+> 10,9 0 076
+? 9,12 0 077
+@ 17,12,2 0 0100
+at "
+A 11,12 0 0101
+B 11,12 0 0102
+C 12,12 0 0103
+D 12,12 0 0104
+E 11,12 0 0105
+F 10,12 0 0106
+G 13,12 0 0107
+H 12,12 0 0110
+I 4,12 0 0111
+J 8,12 0 0112
+K 11,12 0 0113
+L 9,12 0 0114
+M 13,12 0 0115
+N 12,12 0 0116
+O 13,12 0 0117
+P 11,12 0 0120
+Q 13,12,1 0 0121
+R 12,12 0 0122
+S 11,12 0 0123
+T 10,12 0 0124
+U 12,12 0 0125
+V 11,12 0 0126
+W 15,12 0 0127
+X 11,12 0 0130
+Y 11,12 0 0131
+Z 10,12 0 0132
+[ 5,12,3 0 0133
+lB "
+\ 5,12 0 0134
+rs "
+] 5,12,3 0 0135
+rB "
+^ 8,12 0 0136
+a^ "
+ha "
+_ 9,0,3 0 0137
+` 6,13 0 0140
+ga "
+a 9,9 0 0141
+b 9,12 0 0142
+c 8,9 0 0143
+d 9,12 0 0144
+e 9,9 0 0145
+f 5,12 0 0146
+g 9,9,4 0 0147
+h 9,12 0 0150
+i 3,12 0 0151
+j 4,12,4 0 0152
+k 8,12 0 0153
+l 3,12 0 0154
+m 14,9 0 0155
+n 9,9 0 0156
+o 9,9 0 0157
+p 9,9,4 0 0160
+q 9,9,4 0 0161
+r 5,9 0 0162
+s 8,9 0 0163
+t 5,11 0 0164
+u 9,9 0 0165
+v 8,9 0 0166
+w 12,9 0 0167
+x 8,9 0 0170
+y 8,9,3 0 0171
+z 8,9 0 0172
+{ 6,12,4 0 0173
+lC "
+| 4,12,4 0 0174
+ba "
+} 6,12,4 0 0175
+rC "
+~ 10,6 0 0176
+a~ "
+ti "
+--- 5,1 0 0240
+r! 6,9,3 0 0241
+ct 9,11,2 0 0242
+Po 9,12 0 0243
+Cs 9,10 0 0244
+Ye 9,12 0 0245
+bb 4,12,4 0 0246
+sc 9,12,3 0 0247
+ad 5,12 0 0250
+co 12,12 0 0251
+Of 6,12 0 0252
+Fo 9,8 0 0253
+tno 10,6 0 0254
+- 5,5 0 0255
+hy "
+rg 12,12 0 0256
+a- 6,11 0 0257
+de 7,12 0 0260
+t+- 10,11 0 0261
+S2 6,12 0 0262
+S3 6,12 0 0263
+aa 6,13 0 0264
+mc 9,9,4 0 0265
+ps 9,12,3 0 0266
+pc 5,6 0 0267
+ac 6,0,4 0 0270
+S1 6,12 0 0271
+Om 6,12 0 0272
+Fc 9,8 0 0273
+14 14,12 0 0274
+12 14,13 0 0275
+34 14,12 0 0276
+r? 10,9,3 0 0277
+`A 11,16 0 0300
+'A 11,16 0 0301
+^A 11,16 0 0302
+~A 11,15 0 0303
+:A 11,15 0 0304
+oA 11,15 0 0305
+AE 16,12 0 0306
+,C 12,12,4 0 0307
+`E 11,16 0 0310
+'E 11,16 0 0311
+^E 11,16 0 0312
+:E 11,15 0 0313
+`I 4,16 0 0314
+'I 4,16 0 0315
+^I 4,16 0 0316
+:I 4,15 0 0317
+-D 12,12 0 0320
+~N 12,15 0 0321
+`O 13,16 0 0322
+'O 13,16 0 0323
+^O 13,16 0 0324
+~O 13,15 0 0325
+:O 13,15 0 0326
+tmu 10,8 0 0327
+/O 13,13,1 0 0330
+`U 12,16 0 0331
+'U 12,16 0 0332
+^U 12,16 0 0333
+:U 12,15 0 0334
+'Y 11,16 0 0335
+TP 11,12 0 0336
+ss 10,12 0 0337
+`a 9,13 0 0340
+'a 9,13 0 0341
+^a 9,13 0 0342
+~a 9,12 0 0343
+:a 9,12 0 0344
+oa 9,13 0 0345
+ae 15,9 0 0346
+,c 8,9,4 0 0347
+`e 9,13 0 0350
+'e 9,13 0 0351
+^e 9,13 0 0352
+:e 9,12 0 0353
+`i 4,13 0 0354
+'i 4,13 0 0355
+^i 4,13 0 0356
+:i 4,12 0 0357
+Sd 9,12 0 0360
+~n 9,12 0 0361
+`o 9,13 0 0362
+'o 9,13 0 0363
+^o 9,13 0 0364
+~o 9,12 0 0365
+:o 9,12 0 0366
+tdi 10,9 0 0367
+/o 10,10 0 0370
+`u 9,13 0 0371
+'u 9,13 0 0372
+^u 9,13 0 0373
+:u 9,12 0 0374
+'y 8,13,3 0 0375
+Tp 9,12,4 0 0376
+:y 8,12,3 0 0377
diff --git a/font/devX100-12/NB b/font/devX100-12/NB
new file mode 100644
index 0000000..b45c0e1
--- /dev/null
+++ b/font/devX100-12/NB
@@ -0,0 +1,215 @@
+name NB
+spacewidth 4
+charset
+--- 15,11 0 00
+--- 4,1 0 040
+! 5,12 0 041
+" 6,12 0 042
+dq "
+# 10,12 0 043
+sh "
+$ 10,14,1 0 044
+Do "
+% 14,12 0 045
+& 14,12 0 046
+' 4,12 0 047
+aq "
+cq "
+oq "
+( 6,12,2 0 050
+) 6,12,2 0 051
+* 8,12 0 052
++ 10,8 0 053
+, 5,3,3 0 054
+\- 5,5 0 055
+. 5,3 0 056
+/ 5,12 0 057
+sl "
+0 10,12 0 060
+1 10,12 0 061
+2 10,12 0 062
+3 10,12 0 063
+4 10,12 0 064
+5 10,12 0 065
+6 10,12 0 066
+7 10,12 0 067
+8 10,12 0 070
+9 10,12 0 071
+: 5,8 0 072
+; 5,8,3 0 073
+< 10,9 0 074
+= 10,7 0 075
+> 10,9 0 076
+? 8,12 0 077
+@ 12,12,1 0 0100
+at "
+A 13,12 0 0101
+B 13,12 0 0102
+C 13,12 0 0103
+D 14,12 0 0104
+E 12,12 0 0105
+F 12,12 0 0106
+G 14,12 0 0107
+H 15,12 0 0110
+I 7,12 0 0111
+J 11,12 0 0112
+K 13,12 0 0113
+L 12,12 0 0114
+M 16,12 0 0115
+N 14,12 0 0116
+O 14,12 0 0117
+P 13,12 0 0120
+Q 14,12,3 0 0121
+R 14,12 0 0122
+S 11,12 0 0123
+T 12,12 0 0124
+U 14,12 0 0125
+V 13,12 0 0126
+W 16,12 0 0127
+X 12,12 0 0130
+Y 12,12 0 0131
+Z 11,12 0 0132
+[ 6,12,2 0 0133
+lB "
+\ 10,12 0 0134
+rs "
+] 7,12,2 0 0135
+rB "
+^ 10,12 0 0136
+a^ "
+ha "
+_ 8,0,2 0 0137
+` 6,12 0 0140
+ga "
+a 10,8 0 0141
+b 11,12 0 0142
+c 9,8 0 0143
+d 11,12 0 0144
+e 10,8 0 0145
+f 7,12 0 0146
+g 10,9,3 0 0147
+h 11,12 0 0150
+i 6,12 0 0151
+j 6,12,3 0 0152
+k 11,12 0 0153
+l 6,12 0 0154
+m 16,8 0 0155
+n 11,8 0 0156
+o 11,8 0 0157
+p 11,8,3 0 0160
+q 10,8,3 0 0161
+r 9,8 0 0162
+s 8,8 0 0163
+t 7,11 0 0164
+u 11,8 0 0165
+v 10,8 0 0166
+w 15,8 0 0167
+x 10,8 0 0170
+y 10,8,3 0 0171
+z 9,8 0 0172
+{ 6,12,2 0 0173
+lC "
+| 10,12 0 0174
+ba "
+} 6,12,2 0 0175
+rC "
+~ 10,6 0 0176
+a~ "
+ti "
+--- 4,1 0 0240
+r! 5,9,3 0 0241
+ct 10,10,2 0 0242
+Po 10,12 0 0243
+Cs 10,10 0 0244
+Ye 10,12 0 0245
+bb 10,12 0 0246
+sc 9,12,3 0 0247
+ad 6,11 0 0250
+co 12,12 0 0251
+Of 6,12 0 0252
+Fo 8,7 0 0253
+tno 10,7 0 0254
+- 5,5 0 0255
+hy "
+rg 12,12 0 0256
+a- 6,11 0 0257
+de 7,12 0 0260
+t+- 10,9 0 0261
+S2 6,12 0 0262
+S3 6,12 0 0263
+aa 6,12 0 0264
+mc 11,8,3 0 0265
+ps 12,12 0 0266
+pc 5,6 0 0267
+ac 6,1,3 0 0270
+S1 6,12 0 0271
+Om 6,12 0 0272
+Fc 8,7 0 0273
+14 14,12 0 0274
+12 14,12 0 0275
+34 14,12 0 0276
+r? 8,9,3 0 0277
+`A 13,16 0 0300
+'A 13,16 0 0301
+^A 13,16 0 0302
+~A 13,15 0 0303
+:A 13,15 0 0304
+oA 13,16 0 0305
+AE 16,12 0 0306
+,C 13,12,3 0 0307
+`E 12,16 0 0310
+'E 12,16 0 0311
+^E 12,16 0 0312
+:E 12,15 0 0313
+`I 7,16 0 0314
+'I 7,16 0 0315
+^I 7,16 0 0316
+:I 7,15 0 0317
+-D 14,12 0 0320
+~N 14,15 0 0321
+`O 14,16 0 0322
+'O 14,16 0 0323
+^O 14,16 0 0324
+~O 14,15 0 0325
+:O 14,15 0 0326
+tmu 10,8 0 0327
+/O 14,13,1 0 0330
+`U 14,16 0 0331
+'U 14,16 0 0332
+^U 14,16 0 0333
+:U 14,15 0 0334
+'Y 12,16 0 0335
+TP 13,12 0 0336
+ss 10,12 0 0337
+`a 10,12 0 0340
+'a 10,12 0 0341
+^a 10,12 0 0342
+~a 10,11 0 0343
+:a 10,11 0 0344
+oa 10,12 0 0345
+ae 15,8 0 0346
+,c 9,8,3 0 0347
+`e 10,12 0 0350
+'e 10,12 0 0351
+^e 10,12 0 0352
+:e 10,11 0 0353
+`i 6,12 0 0354
+'i 6,12 0 0355
+^i 6,12 0 0356
+:i 6,11 0 0357
+Sd 11,13 0 0360
+~n 11,11 0 0361
+`o 11,12 0 0362
+'o 11,12 0 0363
+^o 11,12 0 0364
+~o 11,11 0 0365
+:o 11,11 0 0366
+tdi 10,8 0 0367
+/o 10,10,2 0 0370
+`u 11,12 0 0371
+'u 11,12 0 0372
+^u 11,12 0 0373
+:u 11,11 0 0374
+'y 10,12,3 0 0375
+Tp 11,12,3 0 0376
+:y 10,11,3 0 0377
diff --git a/font/devX100-12/NBI b/font/devX100-12/NBI
new file mode 100644
index 0000000..74f72a4
--- /dev/null
+++ b/font/devX100-12/NBI
@@ -0,0 +1,215 @@
+name NBI
+spacewidth 4
+charset
+--- 14,11 0 00
+--- 4,1 0 040
+! 6,12 0 041
+" 7,12 0 042
+dq "
+# 10,12 0 043
+sh "
+$ 9,14,1 0 044
+Do "
+% 15,12 0 045
+& 15,12 0 046
+' 5,12 0 047
+aq "
+cq "
+oq "
+( 7,12,2 0 050
+) 7,12,2 0 051
+* 8,12 0 052
++ 10,8 0 053
+, 5,3,3 0 054
+\- 5,5 0 055
+. 5,3 0 056
+/ 5,12 0 057
+sl "
+0 9,12 0 060
+1 9,12 0 061
+2 9,12 0 062
+3 9,12 0 063
+4 9,12 0 064
+5 9,12 0 065
+6 9,12 0 066
+7 9,12 0 067
+8 9,12 0 070
+9 9,12 0 071
+: 5,8 0 072
+; 5,8,3 0 073
+< 10,8 0 074
+= 10,7 0 075
+> 10,8 0 076
+? 8,12 0 077
+@ 12,12 0 0100
+at "
+A 12,12 0 0101
+B 13,12 0 0102
+C 13,12 0 0103
+D 14,12 0 0104
+E 12,12 0 0105
+F 12,12 0 0106
+G 14,12 0 0107
+H 14,12 0 0110
+I 7,12 0 0111
+J 11,12 0 0112
+K 13,12 0 0113
+L 12,12 0 0114
+M 16,12 0 0115
+N 14,12 0 0116
+O 14,12 0 0117
+P 12,12 0 0120
+Q 14,12,3 0 0121
+R 14,12 0 0122
+S 11,12 0 0123
+T 12,12 0 0124
+U 14,12 0 0125
+V 12,12 0 0126
+W 16,12 0 0127
+X 12,12 0 0130
+Y 12,12 0 0131
+Z 12,12 0 0132
+[ 7,12,2 0 0133
+lB "
+\ 10,12 0 0134
+rs "
+] 7,12,2 0 0135
+rB "
+^ 10,12 0 0136
+a^ "
+ha "
+_ 8,0,3 0 0137
+` 6,12 0 0140
+ga "
+a 11,8 0 0141
+b 10,12 0 0142
+c 9,8 0 0143
+d 11,12 0 0144
+e 9,8 0 0145
+f 6,12,3 0 0146
+g 10,9,3 0 0147
+h 11,12 0 0150
+i 6,12 0 0151
+j 6,12,3 0 0152
+k 11,12 0 0153
+l 6,12 0 0154
+m 15,8 0 0155
+n 11,8 0 0156
+o 10,8 0 0157
+p 11,8,3 0 0160
+q 10,8,3 0 0161
+r 9,8 0 0162
+s 8,8 0 0163
+t 7,11 0 0164
+u 11,8 0 0165
+v 9,8 0 0166
+w 14,8 0 0167
+x 9,8 0 0170
+y 9,8,3 0 0171
+z 9,8 0 0172
+{ 7,12,2 0 0173
+lC "
+| 10,12 0 0174
+ba "
+} 7,12,2 0 0175
+rC "
+~ 10,6 0 0176
+a~ "
+ti "
+--- 4,1 0 0240
+r! 6,9,3 0 0241
+ct 10,10,2 0 0242
+Po 10,12 0 0243
+Cs 10,10 0 0244
+Ye 10,12 0 0245
+bb 10,12 0 0246
+sc 9,12,3 0 0247
+ad 6,11 0 0250
+co 12,12 0 0251
+Of 7,12 0 0252
+Fo 8,7 0 0253
+tno 10,7 0 0254
+- 5,5 0 0255
+hy "
+rg 12,12 0 0256
+a- 6,11 0 0257
+de 7,12 0 0260
+t+- 10,8 0 0261
+S2 6,12 0 0262
+S3 6,12 0 0263
+aa 6,12 0 0264
+mc 11,8,3 0 0265
+ps 11,12 0 0266
+pc 5,6 0 0267
+ac 5,1,3 0 0270
+S1 6,12 0 0271
+Om 6,12 0 0272
+Fc 8,7 0 0273
+14 14,12 0 0274
+12 14,12 0 0275
+34 14,12 0 0276
+r? 8,9,3 0 0277
+`A 12,16 0 0300
+'A 12,16 0 0301
+^A 12,16 0 0302
+~A 12,15 0 0303
+:A 12,15 0 0304
+oA 12,16 0 0305
+AE 15,12 0 0306
+,C 13,12,3 0 0307
+`E 12,16 0 0310
+'E 12,16 0 0311
+^E 12,16 0 0312
+:E 12,15 0 0313
+`I 7,16 0 0314
+'I 7,16 0 0315
+^I 7,16 0 0316
+:I 7,15 0 0317
+-D 14,12 0 0320
+~N 14,15 0 0321
+`O 14,16 0 0322
+'O 14,16 0 0323
+^O 14,16 0 0324
+~O 14,15 0 0325
+:O 14,15 0 0326
+tmu 10,8 0 0327
+/O 14,13,1 0 0330
+`U 14,16 0 0331
+'U 14,16 0 0332
+^U 14,16 0 0333
+:U 14,15 0 0334
+'Y 12,16 0 0335
+TP 12,12 0 0336
+ss 10,12,3 0 0337
+`a 11,12 0 0340
+'a 11,12 0 0341
+^a 11,12 0 0342
+~a 11,11 0 0343
+:a 11,11 0 0344
+oa 11,13 0 0345
+ae 14,8 0 0346
+,c 9,8,3 0 0347
+`e 9,12 0 0350
+'e 9,12 0 0351
+^e 9,12 0 0352
+:e 9,11 0 0353
+`i 6,12 0 0354
+'i 6,12 0 0355
+^i 6,12 0 0356
+:i 6,11 0 0357
+Sd 10,13 0 0360
+~n 11,11 0 0361
+`o 10,12 0 0362
+'o 10,12 0 0363
+^o 10,12 0 0364
+~o 10,11 0 0365
+:o 10,11 0 0366
+tdi 10,8 0 0367
+/o 10,10,2 0 0370
+`u 11,12 0 0371
+'u 11,12 0 0372
+^u 11,12 0 0373
+:u 11,11 0 0374
+'y 9,12,3 0 0375
+Tp 11,11,3 0 0376
+:y 9,11,3 0 0377
diff --git a/font/devX100-12/NI b/font/devX100-12/NI
new file mode 100644
index 0000000..d4a4677
--- /dev/null
+++ b/font/devX100-12/NI
@@ -0,0 +1,215 @@
+name NI
+spacewidth 4
+charset
+--- 14,11 0 00
+--- 4,1 0 040
+! 6,12 0 041
+" 7,12 0 042
+dq "
+# 9,12 0 043
+sh "
+$ 9,14,1 0 044
+Do "
+% 14,12 0 045
+& 14,12 0 046
+' 5,12 0 047
+aq "
+cq "
+oq "
+( 6,12,2 0 050
+) 5,12,2 0 051
+* 8,12 0 052
++ 10,9 0 053
+, 4,2,3 0 054
+\- 5,4 0 055
+. 4,2 0 056
+/ 10,12,2 0 057
+sl "
+0 9,12 0 060
+1 9,12 0 061
+2 9,12 0 062
+3 9,12 0 063
+4 9,12 0 064
+5 9,12 0 065
+6 9,12 0 066
+7 9,12 0 067
+8 9,12 0 070
+9 9,12 0 071
+: 5,8 0 072
+; 5,8,3 0 073
+< 10,9 0 074
+= 10,6 0 075
+> 10,9 0 076
+? 7,12 0 077
+@ 12,12 0 0100
+at "
+A 12,12 0 0101
+B 12,12 0 0102
+C 12,12 0 0103
+D 13,12 0 0104
+E 12,12 0 0105
+F 11,12 0 0106
+G 13,12 0 0107
+H 14,12 0 0110
+I 7,12 0 0111
+J 10,12 0 0112
+K 12,12 0 0113
+L 11,12 0 0114
+M 16,12 0 0115
+N 13,12 0 0116
+O 13,12 0 0117
+P 11,12 0 0120
+Q 13,12,3 0 0121
+R 13,12 0 0122
+S 11,12 0 0123
+T 11,12 0 0124
+U 13,12 0 0125
+V 11,12 0 0126
+W 15,12 0 0127
+X 12,12 0 0130
+Y 11,12 0 0131
+Z 11,12 0 0132
+[ 6,12,2 0 0133
+lB "
+\ 10,12 0 0134
+rs "
+] 6,12,2 0 0135
+rB "
+^ 10,12 0 0136
+a^ "
+ha "
+_ 8,0,3 0 0137
+` 5,12 0 0140
+ga "
+a 10,8 0 0141
+b 9,12 0 0142
+c 8,8 0 0143
+d 10,12 0 0144
+e 7,8 0 0145
+f 5,12,3 0 0146
+g 9,9,3 0 0147
+h 10,12 0 0150
+i 6,12 0 0151
+j 5,12,3 0 0152
+k 9,12 0 0153
+l 6,12 0 0154
+m 15,8 0 0155
+n 10,8 0 0156
+o 8,8 0 0157
+p 9,8,3 0 0160
+q 9,8,3 0 0161
+r 7,8 0 0162
+s 7,8 0 0163
+t 6,11 0 0164
+u 10,8 0 0165
+v 8,8 0 0166
+w 13,8 0 0167
+x 8,8 0 0170
+y 8,8,3 0 0171
+z 8,8 0 0172
+{ 6,12,2 0 0173
+lC "
+| 10,12 0 0174
+ba "
+} 6,12,2 0 0175
+rC "
+~ 10,5 0 0176
+a~ "
+ti "
+--- 4,1 0 0240
+r! 6,9,3 0 0241
+ct 9,10,2 0 0242
+Po 9,12 0 0243
+Cs 9,10 0 0244
+Ye 9,12 0 0245
+bb 10,12 0 0246
+sc 8,12,3 0 0247
+ad 6,11 0 0250
+co 12,12 0 0251
+Of 7,12 0 0252
+Fo 7,6 0 0253
+tno 10,6 0 0254
+- 5,4 0 0255
+hy "
+rg 12,12 0 0256
+a- 5,10 0 0257
+de 7,12 0 0260
+t+- 10,9 0 0261
+S2 6,12 0 0262
+S3 6,12 0 0263
+aa 5,12 0 0264
+mc 10,8,3 0 0265
+ps 11,12 0 0266
+pc 5,5 0 0267
+ac 5,1,3 0 0270
+S1 6,12 0 0271
+Om 6,12 0 0272
+Fc 7,6 0 0273
+14 14,12 0 0274
+12 14,12 0 0275
+34 14,12 0 0276
+r? 7,9,3 0 0277
+`A 12,16 0 0300
+'A 12,16 0 0301
+^A 12,16 0 0302
+~A 12,15 0 0303
+:A 12,15 0 0304
+oA 12,16 0 0305
+AE 14,12 0 0306
+,C 12,12,3 0 0307
+`E 12,16 0 0310
+'E 12,16 0 0311
+^E 12,16 0 0312
+:E 12,15 0 0313
+`I 7,16 0 0314
+'I 7,16 0 0315
+^I 7,16 0 0316
+:I 7,15 0 0317
+-D 13,12 0 0320
+~N 13,15 0 0321
+`O 13,16 0 0322
+'O 13,16 0 0323
+^O 13,16 0 0324
+~O 13,15 0 0325
+:O 13,15 0 0326
+tmu 10,8 0 0327
+/O 13,13,1 0 0330
+`U 13,16 0 0331
+'U 13,16 0 0332
+^U 13,16 0 0333
+:U 13,15 0 0334
+'Y 11,16 0 0335
+TP 11,12 0 0336
+ss 9,12,3 0 0337
+`a 10,12 0 0340
+'a 10,12 0 0341
+^a 10,12 0 0342
+~a 10,11 0 0343
+:a 10,11 0 0344
+oa 10,13 0 0345
+ae 12,8 0 0346
+,c 8,8,3 0 0347
+`e 7,12 0 0350
+'e 7,12 0 0351
+^e 7,12 0 0352
+:e 7,11 0 0353
+`i 6,12 0 0354
+'i 6,12 0 0355
+^i 6,12 0 0356
+:i 6,11 0 0357
+Sd 8,13 0 0360
+~n 10,11 0 0361
+`o 8,12 0 0362
+'o 8,12 0 0363
+^o 8,12 0 0364
+~o 8,11 0 0365
+:o 8,11 0 0366
+tdi 10,8 0 0367
+/o 8,10,2 0 0370
+`u 10,12 0 0371
+'u 10,12 0 0372
+^u 10,12 0 0373
+:u 10,11 0 0374
+'y 8,12,3 0 0375
+Tp 9,11,3 0 0376
+:y 8,11,3 0 0377
diff --git a/font/devX100-12/NR b/font/devX100-12/NR
new file mode 100644
index 0000000..ce19c65
--- /dev/null
+++ b/font/devX100-12/NR
@@ -0,0 +1,215 @@
+name NR
+spacewidth 4
+charset
+--- 14,11 0 00
+--- 4,1 0 040
+! 5,12 0 041
+" 6,12 0 042
+dq "
+# 9,12 0 043
+sh "
+$ 9,13,2 0 044
+Do "
+% 14,12 0 045
+& 13,12 0 046
+' 3,12 0 047
+aq "
+cq "
+oq "
+( 6,12,2 0 050
+) 6,12,2 0 051
+* 8,12 0 052
++ 10,9 0 053
+, 4,2,3 0 054
+\- 5,4 0 055
+. 4,2 0 056
+/ 5,12 0 057
+sl "
+0 9,12 0 060
+1 9,12 0 061
+2 9,12 0 062
+3 9,12 0 063
+4 9,12 0 064
+5 9,12 0 065
+6 9,12 0 066
+7 9,12 0 067
+8 9,12 0 070
+9 9,12 0 071
+: 4,8 0 072
+; 4,8,3 0 073
+< 10,8 0 074
+= 10,6 0 075
+> 10,8 0 076
+? 7,12 0 077
+@ 12,12,1 0 0100
+at "
+A 12,12 0 0101
+B 12,12 0 0102
+C 12,12 0 0103
+D 13,12 0 0104
+E 12,12 0 0105
+F 11,12 0 0106
+G 13,12 0 0107
+H 14,12 0 0110
+I 7,12 0 0111
+J 9,12 0 0112
+K 13,12 0 0113
+L 11,12 0 0114
+M 16,12 0 0115
+N 13,12 0 0116
+O 13,12 0 0117
+P 11,12 0 0120
+Q 13,12,3 0 0121
+R 12,12 0 0122
+S 10,12 0 0123
+T 11,12 0 0124
+U 13,12 0 0125
+V 12,12 0 0126
+W 16,12 0 0127
+X 11,12 0 0130
+Y 12,12 0 0131
+Z 10,12 0 0132
+[ 6,12,2 0 0133
+lB "
+\ 10,12 0 0134
+rs "
+] 6,12,2 0 0135
+rB "
+^ 10,12 0 0136
+a^ "
+ha "
+_ 8,0,2 0 0137
+` 5,12 0 0140
+ga "
+a 9,8 0 0141
+b 9,12 0 0142
+c 7,8 0 0143
+d 10,12 0 0144
+e 8,8 0 0145
+f 6,12 0 0146
+g 9,8,3 0 0147
+h 10,12 0 0150
+i 5,12 0 0151
+j 5,12,3 0 0152
+k 10,12 0 0153
+l 5,12 0 0154
+m 15,8 0 0155
+n 10,8 0 0156
+o 8,8 0 0157
+p 9,8,3 0 0160
+q 9,8,3 0 0161
+r 7,8 0 0162
+s 8,8 0 0163
+t 7,11 0 0164
+u 10,8 0 0165
+v 9,8 0 0166
+w 13,8 0 0167
+x 9,8 0 0170
+y 9,8,3 0 0171
+z 8,8 0 0172
+{ 6,12,2 0 0173
+lC "
+| 10,12 0 0174
+ba "
+} 6,12,2 0 0175
+rC "
+~ 10,5 0 0176
+a~ "
+ti "
+--- 4,1 0 0240
+r! 5,9,3 0 0241
+ct 9,10,2 0 0242
+Po 9,12 0 0243
+Cs 9,10 0 0244
+Ye 9,12 0 0245
+bb 10,12 0 0246
+sc 8,12,3 0 0247
+ad 5,11 0 0250
+co 12,12 0 0251
+Of 6,12 0 0252
+Fo 7,6 0 0253
+tno 10,6 0 0254
+- 5,4 0 0255
+hy "
+rg 12,12 0 0256
+a- 5,10 0 0257
+de 7,12 0 0260
+t+- 10,9 0 0261
+S2 6,12 0 0262
+S3 6,12 0 0263
+aa 5,12 0 0264
+mc 10,8,3 0 0265
+ps 10,12,3 0 0266
+pc 5,5 0 0267
+ac 5,1,3 0 0270
+S1 6,12 0 0271
+Om 5,12 0 0272
+Fc 7,6 0 0273
+14 14,12 0 0274
+12 13,12 0 0275
+34 14,12 0 0276
+r? 7,9,3 0 0277
+`A 12,16 0 0300
+'A 12,16 0 0301
+^A 12,16 0 0302
+~A 12,15 0 0303
+:A 12,15 0 0304
+oA 12,16 0 0305
+AE 17,12 0 0306
+,C 12,12,3 0 0307
+`E 12,16 0 0310
+'E 12,16 0 0311
+^E 12,16 0 0312
+:E 12,15 0 0313
+`I 7,16 0 0314
+'I 7,16 0 0315
+^I 7,16 0 0316
+:I 7,15 0 0317
+-D 13,12 0 0320
+~N 13,15 0 0321
+`O 13,16 0 0322
+'O 13,16 0 0323
+^O 13,16 0 0324
+~O 13,15 0 0325
+:O 13,15 0 0326
+tmu 10,8 0 0327
+/O 13,13,1 0 0330
+`U 13,16 0 0331
+'U 13,16 0 0332
+^U 13,16 0 0333
+:U 13,15 0 0334
+'Y 12,16 0 0335
+TP 11,12 0 0336
+ss 10,12 0 0337
+`a 9,12 0 0340
+'a 9,12 0 0341
+^a 9,12 0 0342
+~a 9,11 0 0343
+:a 9,11 0 0344
+oa 9,13 0 0345
+ae 13,8 0 0346
+,c 7,8,3 0 0347
+`e 8,12 0 0350
+'e 8,12 0 0351
+^e 8,12 0 0352
+:e 8,11 0 0353
+`i 5,12 0 0354
+'i 5,12 0 0355
+^i 5,12 0 0356
+:i 5,11 0 0357
+Sd 8,13 0 0360
+~n 10,11 0 0361
+`o 8,12 0 0362
+'o 8,12 0 0363
+^o 8,12 0 0364
+~o 8,11 0 0365
+:o 8,11 0 0366
+tdi 10,8 0 0367
+/o 8,9,1 0 0370
+`u 10,12 0 0371
+'u 10,12 0 0372
+^u 10,12 0 0373
+:u 10,11 0 0374
+'y 9,12,3 0 0375
+Tp 9,11,3 0 0376
+:y 9,11,3 0 0377
diff --git a/font/devX100-12/S b/font/devX100-12/S
new file mode 100644
index 0000000..c898a48
--- /dev/null
+++ b/font/devX100-12/S
@@ -0,0 +1,221 @@
+name S
+special
+spacewidth 4
+charset
+--- 4,1 0 040
+! 5,11 0 041
+fa 11,12 0 042
+# 8,11 0 043
+sh "
+te 9,12 0 044
+% 13,11,1 0 045
+& 13,11 0 046
+st 7,8 0 047
+( 5,12,2 0 050
+) 5,12,2 0 051
+** 8,8 0 052
++ 9,9 0 053
+pl "
+, 4,3,2 0 054
+\- 9,5 0 055
+mi "
+. 4,3 0 056
+/ 5,11 0 057
+sl "
+0 8,12 0 060
+1 8,12 0 061
+2 8,12 0 062
+3 8,12 0 063
+4 8,12 0 064
+5 8,12 0 065
+6 8,12 0 066
+7 8,12 0 067
+8 8,12 0 070
+9 8,12 0 071
+: 4,8 0 072
+; 4,8,2 0 073
+< 9,9 0 074
+= 9,6 0 075
+eq "
+> 9,9 0 076
+? 7,11 0 077
+=~ 9,8 0 0100
+*A 12,11 0 0101
+*B 11,11 0 0102
+*X 12,11 0 0103
+*D 10,11 0 0104
+*E 10,11 0 0105
+*F 12,11 0 0106
+*G 10,11 0 0107
+*Y 12,11 0 0110
+*I 6,11 0 0111
++h 10,12 0 0112
+*K 12,11 0 0113
+*L 11,11 0 0114
+*M 14,11 0 0115
+*N 11,11 0 0116
+*O 12,11 0 0117
+*P 12,11 0 0120
+*H 12,11 0 0121
+*R 9,11 0 0122
+*S 10,11 0 0123
+*T 10,11 0 0124
+--- 11,11 0 0125
+ts 8,8,4 0 0126
+*W 12,12 0 0127
+*C 11,11 0 0130
+*Q 13,11 0 0131
+*Z 10,11 0 0132
+[ 6,12,2 0 0133
+lB "
+tf 14,8 0 0134
+3d "
+] 5,12,2 0 0135
+rB "
+pp 11,11 0 0136
+_ 8,0,3 0 0137
+radicalex 8,13 0 0140
+*a 11,9 0 0141
+*b 9,13,4 0 0142
+*x 9,9,3 0 0143
+*d 8,12 0 0144
+*e 7,9 0 0145
+*f 9,11,3 0 0146
+*g 7,9,4 0 0147
+*y 10,9,3 0 0150
+*i 5,9 0 0151
++f 10,9,3 0 0152
+*k 9,9 0 0153
+*l 9,13 0 0154
+*m 9,9,4 0 0155
+*n 8,9 0 0156
+*o 9,9 0 0157
+*p 9,9 0 0160
+*h 9,12 0 0161
+*r 9,9,4 0 0162
+*s 10,9 0 0163
+*t 7,9 0 0164
+*u 9,9 0 0165
++p 11,10 0 0166
+*w 11,9 0 0167
+*c 8,13,4 0 0170
+*q 11,9,4 0 0171
+*z 8,13,4 0 0172
+lC 8,12,2 0 0173
+{ "
+ba 3,11,3 0 0174
+| "
+rC 8,12,2 0 0175
+} "
+ap 9,5 0 0176
+*U 10,11 0 0241
+fm 4,12 0 0242
+<= 9,11 0 0243
+f/ 3,11 0 0244
+if 12,7 0 0245
+Fn 8,12,3 0 0246
+CL 12,9,1 0 0247
+DI 12,9 0 0250
+HE 12,9 0 0251
+SP 12,9,1 0 0252
+<> 17,9 0 0253
+<- 16,9 0 0254
+ua 10,13,2 0 0255
+arrowverttp "
+-> 16,9 0 0256
+da 10,13,2 0 0257
+arrowvertbt "
+de 6,11 0 0260
++- 9,11 0 0261
+sd 7,12 0 0262
+>= 9,11 0 0263
+mu 9,9 0 0264
+pt 11,7 0 0265
+pd 8,13,1 0 0266
+bu 8,8 0 0267
+di 9,8 0 0270
+!= 9,9,1 0 0271
+== 9,8 0 0272
+~= 9,7 0 0273
+~~ "
+--- 16,3 0 0274
+arrowvertex 10,13,4 0 0275
+an 16,5 0 0276
+CR 10,10,1 0 0277
+Ah 13,11 0 0300
+Im 11,13,1 0 0301
+Re 13,13 0 0302
+wp 16,9,4 0 0303
+c* 12,11 0 0304
+c+ 12,11 0 0305
+es 13,12 0 0306
+ca 12,9 0 0307
+cu 12,9 0 0310
+sp 11,8 0 0311
+ip 11,7,3 0 0312
+nb 11,9,1 0 0313
+sb 11,8 0 0314
+ib 11,8,2 0 0315
+mo 11,7 0 0316
+nm 11,8,1 0 0317
+/_ 12,11 0 0320
+gr 11,12 0 0321
+rg 13,11 0 0322
+co 13,11 0 0323
+tm 14,11 0 0324
+--- 13,13,2 0 0325
+sr 9,13,3 0 0326
+sqrt "
+md 4,5 0 0327
+no 12,5 0 0330
+AN 10,8 0 0331
+OR 10,8 0 0332
+hA 17,9 0 0333
+lA 16,9 0 0334
+uA 10,13,2 0 0335
+rA 16,9 0 0336
+dA 10,13,2 0 0337
+lz 8,12 0 0340
+la 5,13,2 0 0341
+--- 13,11 0 0342
+--- 13,11 0 0343
+--- 13,11 0 0344
+--- 11,13,2 0 0345
+parenlefttp 6,13,4 0 0346
+parenleftex 6,13,4 0 0347
+parenleftbt 6,13,4 0 0350
+bracketlefttp 6,13,4 0 0351
+lc "
+bracketleftex 6,13,4 0 0352
+bracketleftbt 6,13,4 0 0353
+lf "
+bracelefttp 8,13,4 0 0354
+lt "
+braceleftmid 8,13,4 0 0355
+lk "
+braceleftbt 8,13,4 0 0356
+lb "
+bracerightex 8,13,4 0 0357
+braceleftex "
+braceex "
+bv "
+ra 5,13,2 0 0361
+is 5,13,4 0 0362
+integral "
+--- 11,13,4 0 0363
+--- 11,13,4 0 0364
+--- 11,13,4 0 0365
+parenrighttp 7,13,4 0 0366
+parenrightex 6,13,4 0 0367
+parenrightbt 6,13,4 0 0370
+bracketrighttp 6,13,4 0 0371
+rc "
+bracketrightex 6,13,4 0 0372
+bracketrightbt 6,13,4 0 0373
+rf "
+bracerighttp 8,13,4 0 0374
+rt "
+bracerightmid 8,13,4 0 0375
+rk "
+bracerightbt 8,13,4 0 0376
+rb "
diff --git a/font/devX100-12/TB b/font/devX100-12/TB
new file mode 100644
index 0000000..fbce600
--- /dev/null
+++ b/font/devX100-12/TB
@@ -0,0 +1,215 @@
+name TB
+spacewidth 5
+charset
+--- 12,11 0 00
+--- 5,1 0 040
+! 6,11 0 041
+" 9,11 0 042
+dq "
+# 8,11 0 043
+sh "
+$ 8,12,1 0 044
+Do "
+% 16,12 0 045
+& 14,11 0 046
+' 5,11 0 047
+aq "
+cq "
+oq "
+( 6,11,3 0 050
+) 6,11,3 0 051
+* 8,11 0 052
++ 9,8 0 053
+, 4,2,3 0 054
+\- 5,5 0 055
+. 4,2 0 056
+/ 5,11 0 057
+sl "
+0 8,11 0 060
+1 8,11 0 061
+2 8,11 0 062
+3 8,11 0 063
+4 8,11 0 064
+5 8,11 0 065
+6 8,11 0 066
+7 8,11 0 067
+8 8,11 0 070
+9 8,11 0 071
+: 5,7 0 072
+; 5,7,3 0 073
+< 9,8 0 074
+= 9,7 0 075
+> 9,8 0 076
+? 8,11 0 077
+@ 16,11,2 0 0100
+at "
+A 12,11 0 0101
+B 10,11 0 0102
+C 11,11 0 0103
+D 11,11 0 0104
+E 10,11 0 0105
+F 10,11 0 0106
+G 12,11 0 0107
+H 12,11 0 0110
+I 6,11 0 0111
+J 8,11,2 0 0112
+K 13,11 0 0113
+L 11,11 0 0114
+M 15,11 0 0115
+N 12,11 0 0116
+O 12,11 0 0117
+P 10,11 0 0120
+Q 12,11,3 0 0121
+R 12,11 0 0122
+S 9,11 0 0123
+T 11,11 0 0124
+U 12,11 0 0125
+V 12,11 0 0126
+W 17,11 0 0127
+X 12,11 0 0130
+Y 12,11 0 0131
+Z 11,11 0 0132
+[ 6,11,3 0 0133
+lB "
+\ 5,11 0 0134
+rs "
+] 6,11,3 0 0135
+rB "
+^ 9,11 0 0136
+a^ "
+ha "
+_ 8,0,4 0 0137
+` 6,12 0 0140
+ga "
+a 8,8 0 0141
+b 9,11 0 0142
+c 7,8 0 0143
+d 9,11 0 0144
+e 7,8 0 0145
+f 6,11 0 0146
+g 8,8,4 0 0147
+h 9,11 0 0150
+i 5,11 0 0151
+j 5,11,4 0 0152
+k 9,11 0 0153
+l 5,11 0 0154
+m 13,8 0 0155
+n 9,8 0 0156
+o 8,8 0 0157
+p 9,8,4 0 0160
+q 9,8,4 0 0161
+r 7,8 0 0162
+s 6,8 0 0163
+t 6,11 0 0164
+u 9,8 0 0165
+v 8,8 0 0166
+w 12,8 0 0167
+x 8,8 0 0170
+y 8,8,4 0 0171
+z 7,8 0 0172
+{ 7,11,3 0 0173
+lC "
+| 4,11,3 0 0174
+ba "
+} 7,11,3 0 0175
+rC "
+~ 9,8 0 0176
+a~ "
+ti "
+--- 5,1 0 0240
+r! 6,8,4 0 0241
+ct 8,10,2 0 0242
+Po 8,11 0 0243
+Cs 8,8 0 0244
+Ye 8,11 0 0245
+bb 4,12,3 0 0246
+sc 8,11,4 0 0247
+ad 6,11 0 0250
+co 12,11 0 0251
+Of 5,11 0 0252
+Fo 8,7 0 0253
+tno 9,7 0 0254
+- 5,5 0 0255
+hy "
+rg 12,11 0 0256
+a- 6,10 0 0257
+de 7,11 0 0260
+t+- 9,9 0 0261
+S2 5,11 0 0262
+S3 5,11 0 0263
+aa 6,12 0 0264
+mc 9,8,3 0 0265
+ps 9,11,4 0 0266
+pc 4,6 0 0267
+ac 6,0,4 0 0270
+S1 5,11 0 0271
+Om 6,11 0 0272
+Fc 8,7 0 0273
+14 12,11 0 0274
+12 12,11 0 0275
+34 12,11 0 0276
+r? 8,8,3 0 0277
+`A 12,15 0 0300
+'A 12,15 0 0301
+^A 12,15 0 0302
+~A 12,14 0 0303
+:A 12,14 0 0304
+oA 12,16 0 0305
+AE 16,11 0 0306
+,C 11,11,4 0 0307
+`E 10,15 0 0310
+'E 10,15 0 0311
+^E 10,15 0 0312
+:E 10,14 0 0313
+`I 6,15 0 0314
+'I 6,15 0 0315
+^I 6,15 0 0316
+:I 6,14 0 0317
+-D 11,11 0 0320
+~N 12,14 0 0321
+`O 12,15 0 0322
+'O 12,15 0 0323
+^O 12,15 0 0324
+~O 12,14 0 0325
+:O 12,14 0 0326
+tmu 9,8 0 0327
+/O 13,12,1 0 0330
+`U 12,15 0 0331
+'U 12,15 0 0332
+^U 12,15 0 0333
+:U 12,14 0 0334
+'Y 12,15 0 0335
+TP 10,11 0 0336
+ss 9,11 0 0337
+`a 8,12 0 0340
+'a 8,12 0 0341
+^a 8,12 0 0342
+~a 8,11 0 0343
+:a 8,11 0 0344
+oa 8,13 0 0345
+ae 12,8 0 0346
+,c 7,8,4 0 0347
+`e 7,12 0 0350
+'e 7,12 0 0351
+^e 7,12 0 0352
+:e 7,11 0 0353
+`i 5,12 0 0354
+'i 5,12 0 0355
+^i 5,12 0 0356
+:i 5,11 0 0357
+Sd 8,11 0 0360
+~n 9,11 0 0361
+`o 8,12 0 0362
+'o 8,12 0 0363
+^o 8,12 0 0364
+~o 8,11 0 0365
+:o 8,11 0 0366
+tdi 9,8 0 0367
+/o 8,9,1 0 0370
+`u 9,12 0 0371
+'u 9,12 0 0372
+^u 9,12 0 0373
+:u 9,11 0 0374
+'y 8,12,4 0 0375
+Tp 9,11,4 0 0376
+:y 8,11,4 0 0377
diff --git a/font/devX100-12/TBI b/font/devX100-12/TBI
new file mode 100644
index 0000000..730bdbf
--- /dev/null
+++ b/font/devX100-12/TBI
@@ -0,0 +1,215 @@
+name TBI
+spacewidth 4
+charset
+--- 13,11 0 00
+--- 4,1 0 040
+! 6,11 0 041
+" 9,11 0 042
+dq "
+# 8,11 0 043
+sh "
+$ 8,12,1 0 044
+Do "
+% 13,11 0 045
+& 13,11 0 046
+' 5,11 0 047
+aq "
+cq "
+oq "
+( 6,11,3 0 050
+) 6,11,3 0 051
+* 8,11 0 052
++ 10,9 0 053
+, 4,2,3 0 054
+\- 5,5 0 055
+. 4,2 0 056
+/ 5,12 0 057
+sl "
+0 8,11 0 060
+1 8,11 0 061
+2 8,11 0 062
+3 8,11 0 063
+4 8,11 0 064
+5 8,11 0 065
+6 8,11 0 066
+7 8,11 0 067
+8 8,11 0 070
+9 8,11 0 071
+: 5,7 0 072
+; 5,7,3 0 073
+< 10,8 0 074
+= 10,7 0 075
+> 10,8 0 076
+? 8,11 0 077
+@ 14,11,2 0 0100
+at "
+A 11,11 0 0101
+B 11,11 0 0102
+C 11,11 0 0103
+D 12,11 0 0104
+E 11,11 0 0105
+F 11,11 0 0106
+G 12,11 0 0107
+H 13,11 0 0110
+I 6,11 0 0111
+J 8,11,2 0 0112
+K 11,11 0 0113
+L 10,11 0 0114
+M 15,11 0 0115
+N 12,11 0 0116
+O 12,11 0 0117
+P 10,11 0 0120
+Q 12,11,4 0 0121
+R 11,11 0 0122
+S 9,11 0 0123
+T 10,11 0 0124
+U 12,11 0 0125
+V 11,11 0 0126
+W 15,11 0 0127
+X 11,11 0 0130
+Y 10,11 0 0131
+Z 10,11 0 0132
+[ 6,12,3 0 0133
+lB "
+\ 5,12 0 0134
+rs "
+] 6,12,3 0 0135
+rB "
+^ 10,11 0 0136
+a^ "
+ha "
+_ 8,0,2 0 0137
+` 6,12 0 0140
+ga "
+a 8,8 0 0141
+b 8,11 0 0142
+c 7,8 0 0143
+d 8,11 0 0144
+e 7,8 0 0145
+f 6,11,3 0 0146
+g 8,8,3 0 0147
+h 9,11 0 0150
+i 5,11 0 0151
+j 5,11,3 0 0152
+k 8,11 0 0153
+l 5,11 0 0154
+m 13,8 0 0155
+n 9,8 0 0156
+o 8,8 0 0157
+p 8,8,3 0 0160
+q 8,8,3 0 0161
+r 6,8 0 0162
+s 6,8 0 0163
+t 5,10 0 0164
+u 9,8 0 0165
+v 7,8 0 0166
+w 11,8 0 0167
+x 8,8 0 0170
+y 7,8,3 0 0171
+z 6,8,1 0 0172
+{ 6,12,3 0 0173
+lC "
+| 4,12 0 0174
+ba "
+} 6,12,3 0 0175
+rC "
+~ 10,6 0 0176
+a~ "
+ti "
+--- 4,1 0 0240
+r! 6,8,4 0 0241
+ct 8,10,2 0 0242
+Po 8,11 0 0243
+Cs 8,9 0 0244
+Ye 8,11 0 0245
+bb 4,12 0 0246
+sc 8,11,3 0 0247
+ad 6,11 0 0250
+co 12,11 0 0251
+Of 4,11 0 0252
+Fo 8,7 0 0253
+tno 10,5 0 0254
+- 5,5 0 0255
+hy "
+rg 12,11 0 0256
+a- 6,10 0 0257
+de 7,11 0 0260
+t+- 10,10 0 0261
+S2 5,11 0 0262
+S3 5,11 0 0263
+aa 6,12 0 0264
+mc 9,8,3 0 0265
+ps 8,11,3 0 0266
+pc 4,5 0 0267
+ac 6,1,3 0 0270
+S1 5,11 0 0271
+Om 5,11 0 0272
+Fc 8,7 0 0273
+14 13,11 0 0274
+12 13,11 0 0275
+34 13,11 0 0276
+r? 8,8,4 0 0277
+`A 11,15 0 0300
+'A 11,15 0 0301
+^A 11,15 0 0302
+~A 11,14 0 0303
+:A 11,14 0 0304
+oA 11,15 0 0305
+AE 15,11 0 0306
+,C 11,11,3 0 0307
+`E 11,15 0 0310
+'E 11,15 0 0311
+^E 11,15 0 0312
+:E 11,14 0 0313
+`I 6,15 0 0314
+'I 6,15 0 0315
+^I 6,15 0 0316
+:I 6,14 0 0317
+-D 12,11 0 0320
+~N 12,14 0 0321
+`O 12,15 0 0322
+'O 12,15 0 0323
+^O 12,15 0 0324
+~O 12,14 0 0325
+:O 12,14 0 0326
+tmu 10,9 0 0327
+/O 12,12,2 0 0330
+`U 12,15 0 0331
+'U 12,15 0 0332
+^U 12,15 0 0333
+:U 12,14 0 0334
+'Y 10,15 0 0335
+TP 10,11 0 0336
+ss 8,12,3 0 0337
+`a 8,12 0 0340
+'a 8,12 0 0341
+^a 8,12 0 0342
+~a 8,11 0 0343
+:a 8,11 0 0344
+oa 8,12 0 0345
+ae 12,8 0 0346
+,c 7,8,3 0 0347
+`e 7,12 0 0350
+'e 7,12 0 0351
+^e 7,12 0 0352
+:e 7,11 0 0353
+`i 5,12 0 0354
+'i 5,12 0 0355
+^i 5,12 0 0356
+:i 5,11 0 0357
+Sd 8,11 0 0360
+~n 9,11 0 0361
+`o 8,12 0 0362
+'o 8,12 0 0363
+^o 8,12 0 0364
+~o 8,11 0 0365
+:o 8,11 0 0366
+tdi 10,9 0 0367
+/o 8,10,2 0 0370
+`u 9,12 0 0371
+'u 9,12 0 0372
+^u 9,12 0 0373
+:u 9,11 0 0374
+'y 7,12,3 0 0375
+Tp 8,11,3 0 0376
+:y 7,11,3 0 0377
diff --git a/font/devX100-12/TI b/font/devX100-12/TI
new file mode 100644
index 0000000..ef47ada
--- /dev/null
+++ b/font/devX100-12/TI
@@ -0,0 +1,215 @@
+name TI
+spacewidth 4
+charset
+--- 12,11 0 00
+--- 4,1 0 040
+! 6,11 0 041
+" 7,10 0 042
+dq "
+# 8,11 0 043
+sh "
+$ 8,12,1 0 044
+Do "
+% 13,11 0 045
+& 13,11 0 046
+' 4,10 0 047
+aq "
+cq "
+oq "
+( 6,11,3 0 050
+) 6,11,3 0 051
+* 8,11 0 052
++ 11,9 0 053
+, 4,2,2 0 054
+\- 5,4 0 055
+. 4,2 0 056
+/ 5,11 0 057
+sl "
+0 8,11 0 060
+1 8,11 0 061
+2 8,11 0 062
+3 8,11 0 063
+4 8,11 0 064
+5 8,11 0 065
+6 8,11 0 066
+7 8,11 0 067
+8 8,11 0 070
+9 8,11 0 071
+: 5,7 0 072
+; 5,7,2 0 073
+< 11,9 0 074
+= 11,6 0 075
+> 11,9 0 076
+? 8,11 0 077
+@ 15,11,3 0 0100
+at "
+A 10,11 0 0101
+B 10,11 0 0102
+C 11,11 0 0103
+D 12,11 0 0104
+E 10,11 0 0105
+F 10,11 0 0106
+G 12,11 0 0107
+H 12,11 0 0110
+I 6,11 0 0111
+J 7,11 0 0112
+K 11,11 0 0113
+L 9,11 0 0114
+M 14,11 0 0115
+N 11,11 0 0116
+O 12,11 0 0117
+P 10,11 0 0120
+Q 12,11,3 0 0121
+R 10,11 0 0122
+S 8,11 0 0123
+T 9,11 0 0124
+U 12,11 0 0125
+V 10,11 0 0126
+W 14,11 0 0127
+X 10,11 0 0130
+Y 9,11 0 0131
+Z 9,11 0 0132
+[ 6,11,3 0 0133
+lB "
+\ 5,11 0 0134
+rs "
+] 6,11,3 0 0135
+rB "
+^ 7,11 0 0136
+a^ "
+ha "
+_ 8,0,4 0 0137
+` 6,12 0 0140
+ga "
+a 8,8 0 0141
+b 8,11 0 0142
+c 7,8 0 0143
+d 8,11 0 0144
+e 7,8 0 0145
+f 5,11,4 0 0146
+g 8,8,4 0 0147
+h 8,11 0 0150
+i 5,11 0 0151
+j 5,11,4 0 0152
+k 7,11 0 0153
+l 5,11 0 0154
+m 12,8 0 0155
+n 8,8 0 0156
+o 8,8 0 0157
+p 8,8,4 0 0160
+q 8,8,4 0 0161
+r 6,8 0 0162
+s 6,8 0 0163
+t 5,10 0 0164
+u 8,8 0 0165
+v 7,8 0 0166
+w 11,8 0 0167
+x 7,8 0 0170
+y 7,8,4 0 0171
+z 6,8 0 0172
+{ 7,11,3 0 0173
+lC "
+| 5,11,3 0 0174
+ba "
+} 7,11,3 0 0175
+rC "
+~ 9,6 0 0176
+a~ "
+ti "
+--- 4,1 0 0240
+r! 6,8,3 0 0241
+ct 8,9,1 0 0242
+Po 8,11 0 0243
+Cs 8,9 0 0244
+Ye 8,11 0 0245
+bb 5,11,3 0 0246
+sc 8,12,1 0 0247
+ad 6,11 0 0250
+co 13,11 0 0251
+Of 5,11 0 0252
+Fo 8,6 0 0253
+tno 11,6 0 0254
+- 5,4 0 0255
+hy "
+rg 13,11 0 0256
+a- 6,10 0 0257
+de 7,11 0 0260
+t+- 11,11 0 0261
+S2 5,11 0 0262
+S3 5,11 0 0263
+aa 6,12 0 0264
+mc 8,8,4 0 0265
+ps 9,11,3 0 0266
+pc 4,5 0 0267
+ac 6,1,3 0 0270
+S1 5,11 0 0271
+Om 5,11 0 0272
+Fc 8,6 0 0273
+14 13,11 0 0274
+12 13,11 0 0275
+34 13,11 0 0276
+r? 8,8,3 0 0277
+`A 10,15 0 0300
+'A 10,15 0 0301
+^A 10,15 0 0302
+~A 10,14 0 0303
+:A 10,14 0 0304
+oA 10,15 0 0305
+AE 15,11 0 0306
+,C 11,11,3 0 0307
+`E 10,15 0 0310
+'E 10,15 0 0311
+^E 10,15 0 0312
+:E 10,14 0 0313
+`I 6,15 0 0314
+'I 6,15 0 0315
+^I 6,15 0 0316
+:I 6,14 0 0317
+-D 12,11 0 0320
+~N 11,14 0 0321
+`O 12,15 0 0322
+'O 12,15 0 0323
+^O 12,15 0 0324
+~O 12,14 0 0325
+:O 12,14 0 0326
+tmu 11,9 0 0327
+/O 12,12,1 0 0330
+`U 12,15 0 0331
+'U 12,15 0 0332
+^U 12,15 0 0333
+:U 12,14 0 0334
+'Y 9,15 0 0335
+TP 10,11 0 0336
+ss 8,11,4 0 0337
+`a 8,12 0 0340
+'a 8,12 0 0341
+^a 8,12 0 0342
+~a 8,11 0 0343
+:a 8,11 0 0344
+oa 8,13 0 0345
+ae 11,8 0 0346
+,c 7,8,3 0 0347
+`e 7,12 0 0350
+'e 7,12 0 0351
+^e 7,12 0 0352
+:e 7,11 0 0353
+`i 5,12 0 0354
+'i 5,12 0 0355
+^i 5,12 0 0356
+:i 5,11 0 0357
+Sd 8,12 0 0360
+~n 8,11 0 0361
+`o 8,12 0 0362
+'o 8,12 0 0363
+^o 8,12 0 0364
+~o 8,11 0 0365
+:o 8,11 0 0366
+tdi 11,8 0 0367
+/o 8,9,1 0 0370
+`u 8,12 0 0371
+'u 8,12 0 0372
+^u 8,12 0 0373
+:u 8,11 0 0374
+'y 7,12,4 0 0375
+Tp 8,11,4 0 0376
+:y 7,11,4 0 0377
diff --git a/font/devX100-12/TR b/font/devX100-12/TR
new file mode 100644
index 0000000..efb7846
--- /dev/null
+++ b/font/devX100-12/TR
@@ -0,0 +1,215 @@
+name TR
+spacewidth 4
+charset
+--- 12,11 0 00
+--- 4,1 0 040
+! 5,11 0 041
+" 7,11 0 042
+dq "
+# 8,11 0 043
+sh "
+$ 8,12,1 0 044
+Do "
+% 14,11 0 045
+& 13,11 0 046
+' 3,11 0 047
+aq "
+cq "
+oq "
+( 5,11,3 0 050
+) 5,11,3 0 051
+* 8,11 0 052
++ 9,8 0 053
+, 4,2,1 0 054
+\- 5,5 0 055
+. 4,2 0 056
+/ 5,11,2 0 057
+sl "
+0 8,11 0 060
+1 8,11 0 061
+2 8,11 0 062
+3 8,11 0 063
+4 8,11 0 064
+5 8,11 0 065
+6 8,11 0 066
+7 8,11 0 067
+8 8,11 0 070
+9 8,11 0 071
+: 4,8 0 072
+; 4,8,1 0 073
+< 9,9 0 074
+= 9,6 0 075
+> 9,9 0 076
+? 7,11 0 077
+@ 15,11,3 0 0100
+at "
+A 12,11 0 0101
+B 11,11 0 0102
+C 11,11 0 0103
+D 12,11 0 0104
+E 10,11 0 0105
+F 9,11 0 0106
+G 12,11 0 0107
+H 12,11 0 0110
+I 5,11 0 0111
+J 6,11 0 0112
+K 12,11 0 0113
+L 10,11 0 0114
+M 15,11 0 0115
+N 12,11 0 0116
+O 12,11 0 0117
+P 9,11 0 0120
+Q 12,11,3 0 0121
+R 11,11 0 0122
+S 9,11 0 0123
+T 10,11 0 0124
+U 12,11 0 0125
+V 12,11 0 0126
+W 16,11 0 0127
+X 12,11 0 0130
+Y 12,11 0 0131
+Z 10,11 0 0132
+[ 5,11,3 0 0133
+lB "
+\ 5,11 0 0134
+rs "
+] 5,11,3 0 0135
+rB "
+^ 8,11 0 0136
+a^ "
+ha "
+_ 8,0,2 0 0137
+` 6,11 0 0140
+ga "
+a 7,8 0 0141
+b 8,11 0 0142
+c 7,8 0 0143
+d 8,11 0 0144
+e 7,8 0 0145
+f 6,11 0 0146
+g 8,8,4 0 0147
+h 8,11 0 0150
+i 5,11 0 0151
+j 4,11,4 0 0152
+k 8,11 0 0153
+l 5,11 0 0154
+m 13,8 0 0155
+n 8,8 0 0156
+o 8,8 0 0157
+p 8,8,4 0 0160
+q 8,8,4 0 0161
+r 6,8 0 0162
+s 6,8 0 0163
+t 5,10 0 0164
+u 8,8 0 0165
+v 8,8 0 0166
+w 12,8 0 0167
+x 8,8 0 0170
+y 8,8,4 0 0171
+z 7,8 0 0172
+{ 8,11,3 0 0173
+lC "
+| 3,11 0 0174
+ba "
+} 8,11,3 0 0175
+rC "
+~ 9,6 0 0176
+a~ "
+ti "
+--- 4,1 0 0240
+r! 5,8,3 0 0241
+ct 8,10,2 0 0242
+Po 8,11 0 0243
+Cs 8,10 0 0244
+Ye 8,11 0 0245
+bb 3,11 0 0246
+sc 8,11,3 0 0247
+ad 6,11 0 0250
+co 13,11 0 0251
+Of 5,11 0 0252
+Fo 8,7 0 0253
+tno 9,5 0 0254
+- 5,5 0 0255
+hy "
+rg 13,11 0 0256
+a- 6,10 0 0257
+de 7,11 0 0260
+t+- 9,9 0 0261
+S2 5,11 0 0262
+S3 5,11 0 0263
+aa 6,11 0 0264
+mc 8,8,3 0 0265
+ps 8,11,4 0 0266
+pc 4,6 0 0267
+ac 6,0,4 0 0270
+S1 5,11 0 0271
+Om 5,11 0 0272
+Fc 8,7 0 0273
+14 13,11 0 0274
+12 13,11 0 0275
+34 13,11 0 0276
+r? 7,8,3 0 0277
+`A 12,15 0 0300
+'A 12,15 0 0301
+^A 12,15 0 0302
+~A 12,14 0 0303
+:A 12,14 0 0304
+oA 12,14 0 0305
+AE 15,11 0 0306
+,C 11,11,4 0 0307
+`E 10,15 0 0310
+'E 10,15 0 0311
+^E 10,15 0 0312
+:E 10,14 0 0313
+`I 5,15 0 0314
+'I 5,15 0 0315
+^I 5,15 0 0316
+:I 5,14 0 0317
+-D 12,11 0 0320
+~N 12,14 0 0321
+`O 12,15 0 0322
+'O 12,15 0 0323
+^O 12,15 0 0324
+~O 12,14 0 0325
+:O 12,14 0 0326
+tmu 9,7 0 0327
+/O 12,12,1 0 0330
+`U 12,15 0 0331
+'U 12,15 0 0332
+^U 12,15 0 0333
+:U 12,14 0 0334
+'Y 12,15 0 0335
+TP 9,11 0 0336
+ss 8,11 0 0337
+`a 7,12 0 0340
+'a 7,12 0 0341
+^a 7,12 0 0342
+~a 7,11 0 0343
+:a 7,11 0 0344
+oa 7,12 0 0345
+ae 11,8 0 0346
+,c 7,8,4 0 0347
+`e 7,12 0 0350
+'e 7,12 0 0351
+^e 7,12 0 0352
+:e 7,11 0 0353
+`i 5,12 0 0354
+'i 5,12 0 0355
+^i 5,12 0 0356
+:i 5,11 0 0357
+Sd 8,11 0 0360
+~n 8,11 0 0361
+`o 8,12 0 0362
+'o 8,12 0 0363
+^o 8,12 0 0364
+~o 8,11 0 0365
+:o 8,11 0 0366
+tdi 9,9 0 0367
+/o 8,10,2 0 0370
+`u 8,12 0 0371
+'u 8,12 0 0372
+^u 8,12 0 0373
+:u 8,11 0 0374
+'y 8,12,4 0 0375
+Tp 8,11,4 0 0376
+:y 8,11,4 0 0377
diff --git a/font/devX100-12/devX100-12.am b/font/devX100-12/devX100-12.am
new file mode 100644
index 0000000..a1a509c
--- /dev/null
+++ b/font/devX100-12/devX100-12.am
@@ -0,0 +1,65 @@
+# Copyright (C) 2014-2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+DEVX10012FONTS = \
+ font/devX100-12/DESC \
+ font/devX100-12/TR \
+ font/devX100-12/TI \
+ font/devX100-12/TB \
+ font/devX100-12/TBI \
+ font/devX100-12/CR \
+ font/devX100-12/CI \
+ font/devX100-12/CB \
+ font/devX100-12/CBI \
+ font/devX100-12/HR \
+ font/devX100-12/HI \
+ font/devX100-12/HB \
+ font/devX100-12/HBI \
+ font/devX100-12/NR \
+ font/devX100-12/NI \
+ font/devX100-12/NB \
+ font/devX100-12/NBI \
+ font/devX100-12/S
+
+if !WITHOUT_X11
+devX100_12_fontdir = $(fontdir)/devX100-12
+devX100_12_font_DATA = $(DEVX10012FONTS)
+endif
+
+EXTRA_DIST += $(DEVX10012FONTS)
+
+# This target generates font descriptions from core X11 font data
+# returned by a running X server; these are _not_ normally generated
+# during a build, but provided with the groff source distribution.
+#
+# This maintainer-mode target alters files in the source tree.
+maintainer-font-descriptions: devX100-12_font-descriptions
+devX100_12_fontsrcdir = $(top_srcdir)/font/devX100-12
+devX100-12_font-descriptions: $(xtotroff) $(xditview_srcdir)/DESC.in \
+ $(xditview_srcdir)/FontMap-X11
+ $(AM_V_GEN)$(MKDIR_P) $(devX100_12_fontsrcdir) \
+ && sed -e 's/res .*/res 100/;s/unitwidth .*/unitwidth 12/' \
+ $(xditview_srcdir)/DESC.in >$(devX100_12_fontsrcdir)/DESC \
+ && $(xtotroff) -d $(devX100_12_fontsrcdir) -r 100 -s 12 \
+ $(xditview_srcdir)/FontMap-X11
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/font/devX100/CB b/font/devX100/CB
new file mode 100644
index 0000000..a5b0a63
--- /dev/null
+++ b/font/devX100/CB
@@ -0,0 +1,215 @@
+name CB
+spacewidth 9
+charset
+--- 9,9 0 00
+--- 9,1 0 040
+! 9,9 0 041
+" 9,10 0 042
+dq "
+# 9,10,1 0 043
+sh "
+$ 9,11,1 0 044
+Do "
+% 9,10 0 045
+& 9,8 0 046
+' 9,9 0 047
+aq "
+cq "
+oq "
+( 9,9,2 0 050
+) 9,9,2 0 051
+* 9,9 0 052
++ 9,8 0 053
+, 9,2,2 0 054
+\- 9,5 0 055
+. 9,2 0 056
+/ 9,10,2 0 057
+sl "
+0 9,10 0 060
+1 9,10 0 061
+2 9,10 0 062
+3 9,10 0 063
+4 9,10 0 064
+5 9,10 0 065
+6 9,10 0 066
+7 9,10 0 067
+8 9,10 0 070
+9 9,10 0 071
+: 9,7 0 072
+; 9,7,2 0 073
+< 9,8 0 074
+= 9,6 0 075
+> 9,8 0 076
+? 9,9 0 077
+@ 9,9 0 0100
+at "
+A 9,9 0 0101
+B 9,9 0 0102
+C 9,9 0 0103
+D 9,9 0 0104
+E 9,9 0 0105
+F 9,9 0 0106
+G 9,9 0 0107
+H 9,9 0 0110
+I 9,9 0 0111
+J 9,9 0 0112
+K 9,9 0 0113
+L 9,9 0 0114
+M 9,9 0 0115
+N 9,9 0 0116
+O 9,9 0 0117
+P 9,9 0 0120
+Q 9,9,2 0 0121
+R 9,9 0 0122
+S 9,9 0 0123
+T 9,9 0 0124
+U 9,9 0 0125
+V 9,9 0 0126
+W 9,9 0 0127
+X 9,9 0 0130
+Y 9,9 0 0131
+Z 9,9 0 0132
+[ 9,9,2 0 0133
+lB "
+\ 9,10,2 0 0134
+rs "
+] 9,9,2 0 0135
+rB "
+^ 9,9 0 0136
+a^ "
+ha "
+_ 9,0,2 0 0137
+` 9,9 0 0140
+ga "
+a 9,7 0 0141
+b 9,10 0 0142
+c 9,7 0 0143
+d 9,10 0 0144
+e 9,7 0 0145
+f 9,10 0 0146
+g 9,7,3 0 0147
+h 9,10 0 0150
+i 9,10 0 0151
+j 9,10,3 0 0152
+k 9,10 0 0153
+l 9,10 0 0154
+m 9,7 0 0155
+n 9,7 0 0156
+o 9,7 0 0157
+p 9,7,3 0 0160
+q 9,7,3 0 0161
+r 9,7 0 0162
+s 9,7 0 0163
+t 9,9 0 0164
+u 9,7 0 0165
+v 9,7 0 0166
+w 9,7 0 0167
+x 9,7 0 0170
+y 9,7,3 0 0171
+z 9,7 0 0172
+{ 9,9,2 0 0173
+lC "
+| 9,9,2 0 0174
+ba "
+} 9,9,2 0 0175
+rC "
+~ 9,6 0 0176
+a~ "
+ti "
+--- 9,1 0 0240
+r! 9,7,2 0 0241
+ct 9,9,1 0 0242
+Po 9,9 0 0243
+Cs 9,7 0 0244
+Ye 9,9 0 0245
+bb 9,9,2 0 0246
+sc 9,10,1 0 0247
+ad 9,10 0 0250
+co 9,9 0 0251
+Of 9,9 0 0252
+Fo 9,6 0 0253
+tno 9,5 0 0254
+- 9,5 0 0255
+hy "
+rg 9,9 0 0256
+a- 9,9 0 0257
+de 9,9 0 0260
+t+- 9,8 0 0261
+S2 9,10 0 0262
+S3 9,10 0 0263
+aa 9,9 0 0264
+mc 9,7,3 0 0265
+ps 9,10,1 0 0266
+pc 9,5 0 0267
+ac 9,1,3 0 0270
+S1 9,10 0 0271
+Om 9,9 0 0272
+Fc 9,6 0 0273
+14 9,10 0 0274
+12 9,10 0 0275
+34 9,10 0 0276
+r? 9,7,2 0 0277
+`A 9,12 0 0300
+'A 9,12 0 0301
+^A 9,12 0 0302
+~A 9,12 0 0303
+:A 9,12 0 0304
+oA 9,12 0 0305
+AE 9,9 0 0306
+,C 9,9,4 0 0307
+`E 9,12 0 0310
+'E 9,12 0 0311
+^E 9,12 0 0312
+:E 9,12 0 0313
+`I 9,12 0 0314
+'I 9,12 0 0315
+^I 9,12 0 0316
+:I 9,12 0 0317
+-D 9,9 0 0320
+~N 9,12 0 0321
+`O 9,12 0 0322
+'O 9,12 0 0323
+^O 9,12 0 0324
+~O 9,12 0 0325
+:O 9,12 0 0326
+tmu 9,8 0 0327
+/O 9,10 0 0330
+`U 9,12 0 0331
+'U 9,12 0 0332
+^U 9,12 0 0333
+:U 9,12 0 0334
+'Y 9,12 0 0335
+TP 9,9 0 0336
+ss 9,9 0 0337
+`a 9,10 0 0340
+'a 9,10 0 0341
+^a 9,10 0 0342
+~a 9,10 0 0343
+:a 9,10 0 0344
+oa 9,10 0 0345
+ae 9,7 0 0346
+,c 9,7,4 0 0347
+`e 9,10 0 0350
+'e 9,10 0 0351
+^e 9,10 0 0352
+:e 9,10 0 0353
+`i 9,10 0 0354
+'i 9,10 0 0355
+^i 9,10 0 0356
+:i 9,10 0 0357
+Sd 9,10 0 0360
+~n 9,10 0 0361
+`o 9,10 0 0362
+'o 9,10 0 0363
+^o 9,10 0 0364
+~o 9,10 0 0365
+:o 9,10 0 0366
+tdi 9,8 0 0367
+/o 9,7 0 0370
+`u 9,10 0 0371
+'u 9,10 0 0372
+^u 9,10 0 0373
+:u 9,10 0 0374
+'y 9,10,3 0 0375
+Tp 9,9,3 0 0376
+:y 9,10,3 0 0377
diff --git a/font/devX100/CBI b/font/devX100/CBI
new file mode 100644
index 0000000..4096d9a
--- /dev/null
+++ b/font/devX100/CBI
@@ -0,0 +1,215 @@
+name CBI
+spacewidth 9
+charset
+--- 9,9 0 00
+--- 9,1 0 040
+! 9,10 0 041
+" 9,9 0 042
+dq "
+# 9,11,1 0 043
+sh "
+$ 9,11,1 0 044
+Do "
+% 9,10 0 045
+& 9,8 0 046
+' 9,9 0 047
+aq "
+cq "
+oq "
+( 9,9,2 0 050
+) 9,9,2 0 051
+* 9,10 0 052
++ 9,8 0 053
+, 9,2,2 0 054
+\- 9,5 0 055
+. 9,2 0 056
+/ 9,10,2 0 057
+sl "
+0 9,10 0 060
+1 9,10 0 061
+2 9,10 0 062
+3 9,10 0 063
+4 9,10 0 064
+5 9,10 0 065
+6 9,10 0 066
+7 9,10 0 067
+8 9,10 0 070
+9 9,10 0 071
+: 9,7 0 072
+; 9,7,2 0 073
+< 9,8 0 074
+= 9,6 0 075
+> 9,8 0 076
+? 9,9 0 077
+@ 9,9 0 0100
+at "
+A 9,9 0 0101
+B 9,9 0 0102
+C 9,9 0 0103
+D 9,9 0 0104
+E 9,9 0 0105
+F 9,9 0 0106
+G 9,9 0 0107
+H 9,9 0 0110
+I 9,9 0 0111
+J 9,9 0 0112
+K 9,9 0 0113
+L 9,9 0 0114
+M 9,9 0 0115
+N 9,9 0 0116
+O 9,9 0 0117
+P 9,9 0 0120
+Q 9,9,2 0 0121
+R 9,9 0 0122
+S 9,9 0 0123
+T 9,9 0 0124
+U 9,9 0 0125
+V 9,9 0 0126
+W 9,9 0 0127
+X 9,9 0 0130
+Y 9,9 0 0131
+Z 9,9 0 0132
+[ 9,9,2 0 0133
+lB "
+\ 9,10,2 0 0134
+rs "
+] 9,9,2 0 0135
+rB "
+^ 9,9 0 0136
+a^ "
+ha "
+_ 9,0,3 0 0137
+` 9,9 0 0140
+ga "
+a 9,7 0 0141
+b 9,10 0 0142
+c 9,7 0 0143
+d 9,10 0 0144
+e 9,7 0 0145
+f 9,10 0 0146
+g 9,7,3 0 0147
+h 9,10 0 0150
+i 9,10 0 0151
+j 9,10,3 0 0152
+k 9,10 0 0153
+l 9,10 0 0154
+m 9,7 0 0155
+n 9,7 0 0156
+o 9,7 0 0157
+p 9,7,3 0 0160
+q 9,7,3 0 0161
+r 9,7 0 0162
+s 9,7 0 0163
+t 9,9 0 0164
+u 9,7 0 0165
+v 9,7 0 0166
+w 9,7 0 0167
+x 9,7 0 0170
+y 9,7,3 0 0171
+z 9,7 0 0172
+{ 9,9,2 0 0173
+lC "
+| 9,9,2 0 0174
+ba "
+} 9,9,2 0 0175
+rC "
+~ 9,6 0 0176
+a~ "
+ti "
+--- 9,1 0 0240
+r! 9,7,3 0 0241
+ct 9,9,1 0 0242
+Po 9,9 0 0243
+Cs 9,7 0 0244
+Ye 9,9 0 0245
+bb 9,10,2 0 0246
+sc 9,10,1 0 0247
+ad 9,10 0 0250
+co 9,9 0 0251
+Of 9,9 0 0252
+Fo 9,6 0 0253
+tno 9,6 0 0254
+- 9,5 0 0255
+hy "
+rg 9,9 0 0256
+a- 9,9 0 0257
+de 9,10 0 0260
+t+- 9,8 0 0261
+S2 9,10 0 0262
+S3 9,10 0 0263
+aa 9,10 0 0264
+mc 9,7,3 0 0265
+ps 9,10,1 0 0266
+pc 9,5 0 0267
+ac 9,1,3 0 0270
+S1 9,10 0 0271
+Om 9,9 0 0272
+Fc 9,6 0 0273
+14 9,10 0 0274
+12 9,10 0 0275
+34 9,10 0 0276
+r? 9,7,2 0 0277
+`A 9,12 0 0300
+'A 9,12 0 0301
+^A 9,12 0 0302
+~A 9,12 0 0303
+:A 9,12 0 0304
+oA 9,12 0 0305
+AE 9,9 0 0306
+,C 9,9,4 0 0307
+`E 9,12 0 0310
+'E 9,12 0 0311
+^E 9,12 0 0312
+:E 9,12 0 0313
+`I 9,12 0 0314
+'I 9,12 0 0315
+^I 9,12 0 0316
+:I 9,12 0 0317
+-D 9,9 0 0320
+~N 9,12 0 0321
+`O 9,12 0 0322
+'O 9,12 0 0323
+^O 9,12 0 0324
+~O 9,12 0 0325
+:O 9,12 0 0326
+tmu 9,8 0 0327
+/O 9,9 0 0330
+`U 9,12 0 0331
+'U 9,12 0 0332
+^U 9,12 0 0333
+:U 9,12 0 0334
+'Y 9,12 0 0335
+TP 9,9 0 0336
+ss 9,9 0 0337
+`a 9,10 0 0340
+'a 9,10 0 0341
+^a 9,10 0 0342
+~a 9,10 0 0343
+:a 9,10 0 0344
+oa 9,10 0 0345
+ae 9,7 0 0346
+,c 9,7,4 0 0347
+`e 9,10 0 0350
+'e 9,10 0 0351
+^e 9,10 0 0352
+:e 9,10 0 0353
+`i 9,10 0 0354
+'i 9,10 0 0355
+^i 9,10 0 0356
+:i 9,10 0 0357
+Sd 9,10 0 0360
+~n 9,10 0 0361
+`o 9,10 0 0362
+'o 9,10 0 0363
+^o 9,10 0 0364
+~o 9,10 0 0365
+:o 9,10 0 0366
+tdi 9,8 0 0367
+/o 9,8 0 0370
+`u 9,10 0 0371
+'u 9,10 0 0372
+^u 9,10 0 0373
+:u 9,10 0 0374
+'y 9,10,3 0 0375
+Tp 9,9,3 0 0376
+:y 9,10,3 0 0377
diff --git a/font/devX100/CI b/font/devX100/CI
new file mode 100644
index 0000000..233f3fa
--- /dev/null
+++ b/font/devX100/CI
@@ -0,0 +1,215 @@
+name CI
+spacewidth 9
+charset
+--- 9,9 0 00
+--- 9,1 0 040
+! 9,9 0 041
+" 9,10 0 042
+dq "
+# 9,10,1 0 043
+sh "
+$ 9,10,1 0 044
+Do "
+% 9,10 0 045
+& 9,8 0 046
+' 9,9 0 047
+aq "
+cq "
+oq "
+( 9,10,3 0 050
+) 9,10,3 0 051
+* 9,9 0 052
++ 9,8 0 053
+, 9,2,2 0 054
+\- 9,5 0 055
+. 9,2 0 056
+/ 9,10,2 0 057
+sl "
+0 9,10 0 060
+1 9,10 0 061
+2 9,10 0 062
+3 9,10 0 063
+4 9,10 0 064
+5 9,10 0 065
+6 9,10 0 066
+7 9,10 0 067
+8 9,10 0 070
+9 9,10 0 071
+: 9,7 0 072
+; 9,7,2 0 073
+< 9,8 0 074
+= 9,6 0 075
+> 9,8 0 076
+? 9,9 0 077
+@ 9,9 0 0100
+at "
+A 9,9 0 0101
+B 9,9 0 0102
+C 9,9 0 0103
+D 9,9 0 0104
+E 9,9 0 0105
+F 9,9 0 0106
+G 9,9 0 0107
+H 9,9 0 0110
+I 9,9 0 0111
+J 9,9 0 0112
+K 9,9 0 0113
+L 9,9 0 0114
+M 9,9 0 0115
+N 9,9 0 0116
+O 9,9 0 0117
+P 9,9 0 0120
+Q 9,9,2 0 0121
+R 9,9 0 0122
+S 9,9 0 0123
+T 9,9 0 0124
+U 9,9 0 0125
+V 9,9 0 0126
+W 9,9 0 0127
+X 9,9 0 0130
+Y 9,9 0 0131
+Z 9,9 0 0132
+[ 9,10,3 0 0133
+lB "
+\ 9,10,2 0 0134
+rs "
+] 9,10,3 0 0135
+rB "
+^ 9,9 0 0136
+a^ "
+ha "
+_ 9,0,3 0 0137
+` 9,9 0 0140
+ga "
+a 9,7 0 0141
+b 9,10 0 0142
+c 9,7 0 0143
+d 9,10 0 0144
+e 9,7 0 0145
+f 9,10 0 0146
+g 9,7,3 0 0147
+h 9,10 0 0150
+i 9,10 0 0151
+j 9,10,3 0 0152
+k 9,10 0 0153
+l 9,10 0 0154
+m 9,7 0 0155
+n 9,7 0 0156
+o 9,7 0 0157
+p 9,7,3 0 0160
+q 9,7,3 0 0161
+r 9,7 0 0162
+s 9,7 0 0163
+t 9,9 0 0164
+u 9,7 0 0165
+v 9,7 0 0166
+w 9,7 0 0167
+x 9,7 0 0170
+y 9,7,3 0 0171
+z 9,7 0 0172
+{ 9,10,3 0 0173
+lC "
+| 9,9,2 0 0174
+ba "
+} 9,10,3 0 0175
+rC "
+~ 9,5 0 0176
+a~ "
+ti "
+--- 9,1 0 0240
+r! 9,7,2 0 0241
+ct 9,10 0 0242
+Po 9,9 0 0243
+Cs 9,7 0 0244
+Ye 9,9 0 0245
+bb 9,9,2 0 0246
+sc 9,9,1 0 0247
+ad 9,9 0 0250
+co 9,9 0 0251
+Of 9,9 0 0252
+Fo 9,7 0 0253
+tno 9,6 0 0254
+- 9,5 0 0255
+hy "
+rg 9,9 0 0256
+a- 9,9 0 0257
+de 9,10 0 0260
+t+- 9,8 0 0261
+S2 9,10 0 0262
+S3 9,10 0 0263
+aa 9,9 0 0264
+mc 9,7,3 0 0265
+ps 9,9,1 0 0266
+pc 9,5 0 0267
+ac 9,1,3 0 0270
+S1 9,10 0 0271
+Om 9,9 0 0272
+Fc 9,7 0 0273
+14 9,10 0 0274
+12 9,10 0 0275
+34 9,10 0 0276
+r? 9,7,2 0 0277
+`A 9,12 0 0300
+'A 9,12 0 0301
+^A 9,12 0 0302
+~A 9,12 0 0303
+:A 9,11 0 0304
+oA 9,12 0 0305
+AE 9,9 0 0306
+,C 9,9,3 0 0307
+`E 9,12 0 0310
+'E 9,12 0 0311
+^E 9,12 0 0312
+:E 9,11 0 0313
+`I 9,12 0 0314
+'I 9,12 0 0315
+^I 9,12 0 0316
+:I 9,11 0 0317
+-D 9,9 0 0320
+~N 9,12 0 0321
+`O 9,12 0 0322
+'O 9,12 0 0323
+^O 9,12 0 0324
+~O 9,12 0 0325
+:O 9,11 0 0326
+tmu 9,8 0 0327
+/O 9,9 0 0330
+`U 9,12 0 0331
+'U 9,12 0 0332
+^U 9,12 0 0333
+:U 9,11 0 0334
+'Y 9,12 0 0335
+TP 9,9 0 0336
+ss 9,9 0 0337
+`a 9,10 0 0340
+'a 9,10 0 0341
+^a 9,10 0 0342
+~a 9,10 0 0343
+:a 9,9 0 0344
+oa 9,11 0 0345
+ae 9,7 0 0346
+,c 9,7,3 0 0347
+`e 9,10 0 0350
+'e 9,10 0 0351
+^e 9,10 0 0352
+:e 9,9 0 0353
+`i 9,10 0 0354
+'i 9,10 0 0355
+^i 9,10 0 0356
+:i 9,9 0 0357
+Sd 9,10 0 0360
+~n 9,10 0 0361
+`o 9,10 0 0362
+'o 9,10 0 0363
+^o 9,10 0 0364
+~o 9,10 0 0365
+:o 9,9 0 0366
+tdi 9,8 0 0367
+/o 9,7 0 0370
+`u 9,10 0 0371
+'u 9,10 0 0372
+^u 9,10 0 0373
+:u 9,9 0 0374
+'y 9,10,3 0 0375
+Tp 9,9,3 0 0376
+:y 9,9,3 0 0377
diff --git a/font/devX100/CR b/font/devX100/CR
new file mode 100644
index 0000000..2224a12
--- /dev/null
+++ b/font/devX100/CR
@@ -0,0 +1,215 @@
+name CR
+spacewidth 9
+charset
+--- 9,9 0 00
+--- 9,1 0 040
+! 9,9 0 041
+" 9,10 0 042
+dq "
+# 9,9,1 0 043
+sh "
+$ 9,11,2 0 044
+Do "
+% 9,10 0 045
+& 9,8 0 046
+' 9,9 0 047
+aq "
+cq "
+oq "
+( 9,10,2 0 050
+) 9,10,2 0 051
+* 9,9 0 052
++ 9,8 0 053
+, 9,2,2 0 054
+\- 9,5 0 055
+. 9,2 0 056
+/ 9,10,1 0 057
+sl "
+0 9,10 0 060
+1 9,10 0 061
+2 9,10 0 062
+3 9,10 0 063
+4 9,10 0 064
+5 9,10 0 065
+6 9,10 0 066
+7 9,10 0 067
+8 9,10 0 070
+9 9,10 0 071
+: 9,7 0 072
+; 9,7,2 0 073
+< 9,8 0 074
+= 9,6 0 075
+> 9,8 0 076
+? 9,9 0 077
+@ 9,9,1 0 0100
+at "
+A 9,9 0 0101
+B 9,9 0 0102
+C 9,9 0 0103
+D 9,9 0 0104
+E 9,9 0 0105
+F 9,9 0 0106
+G 9,9 0 0107
+H 9,9 0 0110
+I 9,9 0 0111
+J 9,9 0 0112
+K 9,9 0 0113
+L 9,9 0 0114
+M 9,9 0 0115
+N 9,9 0 0116
+O 9,9 0 0117
+P 9,9 0 0120
+Q 9,9,2 0 0121
+R 9,9 0 0122
+S 9,9 0 0123
+T 9,9 0 0124
+U 9,9 0 0125
+V 9,9 0 0126
+W 9,9 0 0127
+X 9,9 0 0130
+Y 9,9 0 0131
+Z 9,9 0 0132
+[ 9,10,2 0 0133
+lB "
+\ 9,10,1 0 0134
+rs "
+] 9,10,2 0 0135
+rB "
+^ 9,9 0 0136
+a^ "
+ha "
+_ 9,0,3 0 0137
+` 9,10 0 0140
+ga "
+a 9,7 0 0141
+b 9,10 0 0142
+c 9,7 0 0143
+d 9,10 0 0144
+e 9,7 0 0145
+f 9,10 0 0146
+g 9,7,3 0 0147
+h 9,10 0 0150
+i 9,10 0 0151
+j 9,10,3 0 0152
+k 9,10 0 0153
+l 9,10 0 0154
+m 9,7 0 0155
+n 9,7 0 0156
+o 9,7 0 0157
+p 9,7,3 0 0160
+q 9,7,3 0 0161
+r 9,7 0 0162
+s 9,7 0 0163
+t 9,9 0 0164
+u 9,7 0 0165
+v 9,7 0 0166
+w 9,7 0 0167
+x 9,7 0 0170
+y 9,7,3 0 0171
+z 9,7 0 0172
+{ 9,10,2 0 0173
+lC "
+| 9,9,2 0 0174
+ba "
+} 9,10,2 0 0175
+rC "
+~ 9,5 0 0176
+a~ "
+ti "
+--- 9,1 0 0240
+r! 9,7,2 0 0241
+ct 9,9 0 0242
+Po 9,9 0 0243
+Cs 9,7 0 0244
+Ye 9,9 0 0245
+bb 9,9,2 0 0246
+sc 9,9,1 0 0247
+ad 9,9 0 0250
+co 9,9 0 0251
+Of 9,9 0 0252
+Fo 9,7 0 0253
+tno 9,6 0 0254
+- 9,5 0 0255
+hy "
+rg 9,9 0 0256
+a- 9,9 0 0257
+de 9,10 0 0260
+t+- 9,8 0 0261
+S2 9,10 0 0262
+S3 9,10 0 0263
+aa 9,10 0 0264
+mc 9,7,3 0 0265
+ps 9,9,1 0 0266
+pc 9,5 0 0267
+ac 9,0,3 0 0270
+S1 9,10 0 0271
+Om 9,9 0 0272
+Fc 9,7 0 0273
+14 9,10 0 0274
+12 9,10 0 0275
+34 9,10 0 0276
+r? 9,7,2 0 0277
+`A 9,12 0 0300
+'A 9,12 0 0301
+^A 9,12 0 0302
+~A 9,12 0 0303
+:A 9,11 0 0304
+oA 9,12 0 0305
+AE 9,9 0 0306
+,C 9,9,3 0 0307
+`E 9,12 0 0310
+'E 9,12 0 0311
+^E 9,12 0 0312
+:E 9,11 0 0313
+`I 9,12 0 0314
+'I 9,12 0 0315
+^I 9,12 0 0316
+:I 9,11 0 0317
+-D 9,9 0 0320
+~N 9,12 0 0321
+`O 9,12 0 0322
+'O 9,12 0 0323
+^O 9,12 0 0324
+~O 9,12 0 0325
+:O 9,11 0 0326
+tmu 9,8 0 0327
+/O 9,9 0 0330
+`U 9,12 0 0331
+'U 9,12 0 0332
+^U 9,12 0 0333
+:U 9,11 0 0334
+'Y 9,12 0 0335
+TP 9,9 0 0336
+ss 9,9 0 0337
+`a 9,10 0 0340
+'a 9,10 0 0341
+^a 9,10 0 0342
+~a 9,10 0 0343
+:a 9,9 0 0344
+oa 9,10 0 0345
+ae 9,7 0 0346
+,c 9,7,3 0 0347
+`e 9,10 0 0350
+'e 9,10 0 0351
+^e 9,10 0 0352
+:e 9,9 0 0353
+`i 9,10 0 0354
+'i 9,10 0 0355
+^i 9,10 0 0356
+:i 9,9 0 0357
+Sd 9,12 0 0360
+~n 9,10 0 0361
+`o 9,10 0 0362
+'o 9,10 0 0363
+^o 9,10 0 0364
+~o 9,10 0 0365
+:o 9,9 0 0366
+tdi 9,8 0 0367
+/o 9,7 0 0370
+`u 9,10 0 0371
+'u 9,10 0 0372
+^u 9,10 0 0373
+:u 9,9 0 0374
+'y 9,10,3 0 0375
+Tp 9,9,3 0 0376
+:y 9,9,3 0 0377
diff --git a/font/devX100/DESC b/font/devX100/DESC
new file mode 100644
index 0000000..7f63535
--- /dev/null
+++ b/font/devX100/DESC
@@ -0,0 +1,9 @@
+styles R I B BI
+fonts 6 0 0 0 0 0 S
+sizes 8 10 12 14 18 24 0
+res 100
+X11
+hor 1
+vert 1
+unitwidth 10
+postpro gxditview
diff --git a/font/devX100/HB b/font/devX100/HB
new file mode 100644
index 0000000..65d4b19
--- /dev/null
+++ b/font/devX100/HB
@@ -0,0 +1,215 @@
+name HB
+spacewidth 4
+charset
+--- 10,11 0 00
+--- 4,1 0 040
+! 4,11 0 041
+" 7,11 0 042
+dq "
+# 9,10 0 043
+sh "
+$ 8,12,2 0 044
+Do "
+% 13,11 0 045
+& 11,10 0 046
+' 4,11 0 047
+aq "
+cq "
+oq "
+( 5,11,3 0 050
+) 5,11,3 0 051
+* 6,11 0 052
++ 9,8 0 053
+, 4,2,1 0 054
+\- 4,5 0 055
+. 4,2 0 056
+/ 4,11 0 057
+sl "
+0 8,11 0 060
+1 8,11 0 061
+2 8,11 0 062
+3 8,11 0 063
+4 8,11 0 064
+5 8,11 0 065
+6 8,11 0 066
+7 8,11 0 067
+8 8,11 0 070
+9 8,11 0 071
+: 5,8 0 072
+; 5,8,1 0 073
+< 8,7 0 074
+= 9,6 0 075
+> 8,7 0 076
+? 9,11 0 077
+@ 14,11,1 0 0100
+at "
+A 10,11 0 0101
+B 10,11 0 0102
+C 11,11 0 0103
+D 11,11 0 0104
+E 9,11 0 0105
+F 9,11 0 0106
+G 11,11 0 0107
+H 10,11 0 0110
+I 4,11 0 0111
+J 8,11 0 0112
+K 10,11 0 0113
+L 8,11 0 0114
+M 13,11 0 0115
+N 11,11 0 0116
+O 12,11 0 0117
+P 10,11 0 0120
+Q 12,11 0 0121
+R 11,11 0 0122
+S 10,11 0 0123
+T 8,11 0 0124
+U 11,11 0 0125
+V 10,11 0 0126
+W 14,11 0 0127
+X 9,11 0 0130
+Y 10,11 0 0131
+Z 9,11 0 0132
+[ 5,11,3 0 0133
+lB "
+\ 4,11 0 0134
+rs "
+] 5,11,3 0 0135
+rB "
+^ 8,11 0 0136
+a^ "
+ha "
+_ 8,0,3 0 0137
+` 5,11 0 0140
+ga "
+a 8,8 0 0141
+b 9,11 0 0142
+c 8,8 0 0143
+d 9,11 0 0144
+e 8,8 0 0145
+f 4,11 0 0146
+g 9,8,3 0 0147
+h 9,11 0 0150
+i 4,11 0 0151
+j 4,11,3 0 0152
+k 8,11 0 0153
+l 4,11 0 0154
+m 12,8 0 0155
+n 9,8 0 0156
+o 9,8 0 0157
+p 9,8,3 0 0160
+q 9,8,3 0 0161
+r 6,8 0 0162
+s 8,8 0 0163
+t 5,10 0 0164
+u 9,8 0 0165
+v 8,8 0 0166
+w 10,8 0 0167
+x 7,8 0 0170
+y 8,8,3 0 0171
+z 6,8 0 0172
+{ 6,11,3 0 0173
+lC "
+| 4,11,3 0 0174
+ba "
+} 6,11,3 0 0175
+rC "
+~ 9,6 0 0176
+a~ "
+ti "
+--- 4,1 0 0240
+r! 4,8,3 0 0241
+ct 8,9,1 0 0242
+Po 8,11 0 0243
+Cs 8,9 0 0244
+Ye 9,11 0 0245
+bb 4,11,3 0 0246
+sc 8,11,3 0 0247
+ad 5,11 0 0250
+co 12,11 0 0251
+Of 6,11 0 0252
+Fo 9,7 0 0253
+tno 9,6 0 0254
+- 4,5 0 0255
+hy "
+rg 12,11 0 0256
+a- 5,10 0 0257
+de 6,11 0 0260
+t+- 9,9 0 0261
+S2 5,11 0 0262
+S3 5,11 0 0263
+aa 5,11 0 0264
+mc 9,8,3 0 0265
+ps 8,11,3 0 0266
+pc 4,5 0 0267
+ac 5,0,3 0 0270
+S1 4,11 0 0271
+Om 6,11 0 0272
+Fc 9,7 0 0273
+14 12,11 0 0274
+12 12,11 0 0275
+34 12,11 0 0276
+r? 9,8,3 0 0277
+`A 10,14 0 0300
+'A 10,14 0 0301
+^A 10,14 0 0302
+~A 10,14 0 0303
+:A 10,14 0 0304
+oA 10,14 0 0305
+AE 15,11 0 0306
+,C 11,11,3 0 0307
+`E 9,14 0 0310
+'E 9,14 0 0311
+^E 9,14 0 0312
+:E 9,14 0 0313
+`I 4,14 0 0314
+'I 4,14 0 0315
+^I 4,14 0 0316
+:I 4,14 0 0317
+-D 11,11 0 0320
+~N 11,14 0 0321
+`O 12,14 0 0322
+'O 12,14 0 0323
+^O 12,14 0 0324
+~O 12,14 0 0325
+:O 12,14 0 0326
+tmu 9,8 0 0327
+/O 12,11 0 0330
+`U 11,14 0 0331
+'U 11,14 0 0332
+^U 11,14 0 0333
+:U 11,14 0 0334
+'Y 10,14 0 0335
+TP 10,11 0 0336
+ss 8,11 0 0337
+`a 8,11 0 0340
+'a 8,11 0 0341
+^a 8,11 0 0342
+~a 8,11 0 0343
+:a 8,11 0 0344
+oa 8,11 0 0345
+ae 13,8 0 0346
+,c 9,8,3 0 0347
+`e 8,11 0 0350
+'e 8,11 0 0351
+^e 8,11 0 0352
+:e 8,11 0 0353
+`i 4,11 0 0354
+'i 4,11 0 0355
+^i 4,11 0 0356
+:i 4,11 0 0357
+Sd 9,11 0 0360
+~n 9,11 0 0361
+`o 9,11 0 0362
+'o 9,11 0 0363
+^o 9,11 0 0364
+~o 9,11 0 0365
+:o 9,11 0 0366
+tdi 9,8 0 0367
+/o 9,8 0 0370
+`u 9,11 0 0371
+'u 9,11 0 0372
+^u 9,11 0 0373
+:u 9,11 0 0374
+'y 8,11,3 0 0375
+Tp 9,11,3 0 0376
+:y 8,11,3 0 0377
diff --git a/font/devX100/HBI b/font/devX100/HBI
new file mode 100644
index 0000000..e0a4c3f
--- /dev/null
+++ b/font/devX100/HBI
@@ -0,0 +1,215 @@
+name HBI
+spacewidth 4
+charset
+--- 10,11 0 00
+--- 4,1 0 040
+! 5,11 0 041
+" 7,11 0 042
+dq "
+# 10,10 0 043
+sh "
+$ 8,12,1 0 044
+Do "
+% 13,11 0 045
+& 11,10 0 046
+' 4,11 0 047
+aq "
+cq "
+oq "
+( 5,11,3 0 050
+) 6,11,3 0 051
+* 6,11 0 052
++ 9,8 0 053
+, 4,2,2 0 054
+\- 5,5 0 055
+. 4,2 0 056
+/ 4,11 0 057
+sl "
+0 8,11 0 060
+1 8,11 0 061
+2 8,11 0 062
+3 8,11 0 063
+4 8,11 0 064
+5 8,11 0 065
+6 8,11 0 066
+7 8,11 0 067
+8 8,11 0 070
+9 8,11 0 071
+: 5,8 0 072
+; 5,8,2 0 073
+< 8,7 0 074
+= 9,6 0 075
+> 9,7 0 076
+? 9,11 0 077
+@ 14,11,2 0 0100
+at "
+A 9,11 0 0101
+B 10,11 0 0102
+C 11,11 0 0103
+D 11,11 0 0104
+E 9,11 0 0105
+F 8,11 0 0106
+G 11,11 0 0107
+H 10,11 0 0110
+I 4,11 0 0111
+J 8,11 0 0112
+K 10,11 0 0113
+L 8,11 0 0114
+M 13,11 0 0115
+N 11,11 0 0116
+O 12,11 0 0117
+P 10,11 0 0120
+Q 12,11 0 0121
+R 10,11 0 0122
+S 10,11 0 0123
+T 8,11 0 0124
+U 11,11 0 0125
+V 10,11 0 0126
+W 14,11 0 0127
+X 9,11 0 0130
+Y 10,11 0 0131
+Z 9,11 0 0132
+[ 5,11,3 0 0133
+lB "
+\ 6,11 0 0134
+rs "
+] 5,11,3 0 0135
+rB "
+^ 8,11 0 0136
+a^ "
+ha "
+_ 8,0,3 0 0137
+` 5,11 0 0140
+ga "
+a 8,8 0 0141
+b 9,11 0 0142
+c 8,8 0 0143
+d 9,11 0 0144
+e 8,8 0 0145
+f 5,11 0 0146
+g 9,8,3 0 0147
+h 9,11 0 0150
+i 4,11 0 0151
+j 4,11,3 0 0152
+k 8,11 0 0153
+l 4,11 0 0154
+m 12,8 0 0155
+n 9,8 0 0156
+o 8,8 0 0157
+p 9,8,3 0 0160
+q 9,8,3 0 0161
+r 6,8 0 0162
+s 8,8 0 0163
+t 5,10 0 0164
+u 9,8 0 0165
+v 8,8 0 0166
+w 11,8 0 0167
+x 7,8 0 0170
+y 7,8,3 0 0171
+z 6,8 0 0172
+{ 6,11,3 0 0173
+lC "
+| 4,11,3 0 0174
+ba "
+} 6,11,3 0 0175
+rC "
+~ 9,6 0 0176
+a~ "
+ti "
+--- 4,1 0 0240
+r! 5,8,3 0 0241
+ct 8,9,1 0 0242
+Po 9,11 0 0243
+Cs 9,8 0 0244
+Ye 9,11 0 0245
+bb 4,11,3 0 0246
+sc 9,11,3 0 0247
+ad 5,11 0 0250
+co 12,11 0 0251
+Of 6,11 0 0252
+Fo 11,7 0 0253
+tno 9,6 0 0254
+- 5,5 0 0255
+hy "
+rg 12,11 0 0256
+a- 5,11 0 0257
+de 6,11 0 0260
+t+- 9,9 0 0261
+S2 5,11 0 0262
+S3 5,11 0 0263
+aa 5,11 0 0264
+mc 9,8,3 0 0265
+ps 8,11,3 0 0266
+pc 4,5 0 0267
+ac 5,1,3 0 0270
+S1 5,11 0 0271
+Om 6,11 0 0272
+Fc 11,7 0 0273
+14 12,11 0 0274
+12 12,11 0 0275
+34 13,11 0 0276
+r? 8,8,3 0 0277
+`A 9,14 0 0300
+'A 9,14 0 0301
+^A 9,14 0 0302
+~A 9,14 0 0303
+:A 9,14 0 0304
+oA 9,14 0 0305
+AE 14,11 0 0306
+,C 11,11,3 0 0307
+`E 9,14 0 0310
+'E 9,14 0 0311
+^E 9,14 0 0312
+:E 9,14 0 0313
+`I 4,14 0 0314
+'I 4,14 0 0315
+^I 4,14 0 0316
+:I 4,14 0 0317
+-D 11,11 0 0320
+~N 11,14 0 0321
+`O 12,14 0 0322
+'O 12,14 0 0323
+^O 12,14 0 0324
+~O 12,14 0 0325
+:O 12,14 0 0326
+tmu 9,8 0 0327
+/O 12,11 0 0330
+`U 11,14 0 0331
+'U 11,14 0 0332
+^U 11,14 0 0333
+:U 11,14 0 0334
+'Y 10,14 0 0335
+TP 10,11 0 0336
+ss 9,11 0 0337
+`a 8,11 0 0340
+'a 8,11 0 0341
+^a 8,11 0 0342
+~a 8,11 0 0343
+:a 8,11 0 0344
+oa 8,11 0 0345
+ae 13,8 0 0346
+,c 8,8,3 0 0347
+`e 8,11 0 0350
+'e 8,11 0 0351
+^e 8,11 0 0352
+:e 8,11 0 0353
+`i 4,11 0 0354
+'i 4,11 0 0355
+^i 4,11 0 0356
+:i 4,11 0 0357
+Sd 8,11 0 0360
+~n 9,11 0 0361
+`o 8,11 0 0362
+'o 8,11 0 0363
+^o 8,11 0 0364
+~o 8,11 0 0365
+:o 8,11 0 0366
+tdi 9,8 0 0367
+/o 8,8 0 0370
+`u 9,11 0 0371
+'u 9,11 0 0372
+^u 9,11 0 0373
+:u 9,11 0 0374
+'y 7,11,3 0 0375
+Tp 9,11,3 0 0376
+:y 7,11,3 0 0377
diff --git a/font/devX100/HI b/font/devX100/HI
new file mode 100644
index 0000000..3505d9a
--- /dev/null
+++ b/font/devX100/HI
@@ -0,0 +1,215 @@
+name HI
+spacewidth 4
+charset
+--- 11,11 0 00
+--- 4,1 0 040
+! 4,11 0 041
+" 5,11 0 042
+dq "
+# 9,10 0 043
+sh "
+$ 8,12,2 0 044
+Do "
+% 12,11 0 045
+& 10,10 0 046
+' 3,11 0 047
+aq "
+cq "
+oq "
+( 5,11,3 0 050
+) 5,11,3 0 051
+* 8,11 0 052
++ 9,8 0 053
+, 3,2,2 0 054
+\- 5,5 0 055
+. 3,2 0 056
+/ 4,11 0 057
+sl "
+0 8,11 0 060
+1 8,11 0 061
+2 8,11 0 062
+3 8,11 0 063
+4 8,11 0 064
+5 8,11 0 065
+6 8,11 0 066
+7 8,11 0 067
+8 8,11 0 070
+9 8,11 0 071
+: 4,8 0 072
+; 4,8,2 0 073
+< 9,7 0 074
+= 9,6 0 075
+> 9,7 0 076
+? 8,11 0 077
+@ 13,11,1 0 0100
+at "
+A 11,11 0 0101
+B 10,11 0 0102
+C 10,11 0 0103
+D 10,11 0 0104
+E 9,11 0 0105
+F 9,11 0 0106
+G 11,11 0 0107
+H 11,11 0 0110
+I 5,11 0 0111
+J 9,11 0 0112
+K 10,11 0 0113
+L 8,11 0 0114
+M 14,11 0 0115
+N 11,11 0 0116
+O 11,11 0 0117
+P 9,11 0 0120
+Q 11,11 0 0121
+R 10,11 0 0122
+S 9,11 0 0123
+T 8,11 0 0124
+U 11,11 0 0125
+V 11,11 0 0126
+W 14,11 0 0127
+X 10,11 0 0130
+Y 9,11 0 0131
+Z 9,11 0 0132
+[ 5,11,3 0 0133
+lB "
+\ 6,11 0 0134
+rs "
+] 5,11,3 0 0135
+rB "
+^ 7,11 0 0136
+a^ "
+ha "
+_ 8,0,3 0 0137
+` 4,11 0 0140
+ga "
+a 8,8 0 0141
+b 8,11 0 0142
+c 7,8 0 0143
+d 8,11 0 0144
+e 8,8 0 0145
+f 4,11 0 0146
+g 8,8,3 0 0147
+h 8,11 0 0150
+i 4,11 0 0151
+j 3,11,3 0 0152
+k 7,11 0 0153
+l 3,11 0 0154
+m 11,8 0 0155
+n 8,8 0 0156
+o 8,8 0 0157
+p 8,8,3 0 0160
+q 8,8,3 0 0161
+r 5,8 0 0162
+s 7,8 0 0163
+t 4,10 0 0164
+u 8,8 0 0165
+v 7,8 0 0166
+w 10,8 0 0167
+x 7,8 0 0170
+y 7,8,3 0 0171
+z 7,8 0 0172
+{ 5,11,3 0 0173
+lC "
+| 4,11,3 0 0174
+ba "
+} 5,11,3 0 0175
+rC "
+~ 8,6 0 0176
+a~ "
+ti "
+--- 4,1 0 0240
+r! 4,8,3 0 0241
+ct 8,9,1 0 0242
+Po 9,11 0 0243
+Cs 8,8 0 0244
+Ye 9,11 0 0245
+bb 4,11,3 0 0246
+sc 8,11,3 0 0247
+ad 5,10 0 0250
+co 12,11 0 0251
+Of 5,11 0 0252
+Fo 8,6 0 0253
+tno 9,6 0 0254
+- 5,5 0 0255
+hy "
+rg 12,11 0 0256
+a- 4,10 0 0257
+de 6,11 0 0260
+t+- 9,9 0 0261
+S2 5,11 0 0262
+S3 5,11 0 0263
+aa 4,11 0 0264
+mc 8,8,3 0 0265
+ps 8,11,3 0 0266
+pc 4,5 0 0267
+ac 3,0,3 0 0270
+S1 5,11 0 0271
+Om 5,11 0 0272
+Fc 8,6 0 0273
+14 12,11 0 0274
+12 12,11 0 0275
+34 12,11 0 0276
+r? 8,8,3 0 0277
+`A 11,14 0 0300
+'A 11,14 0 0301
+^A 11,14 0 0302
+~A 11,14 0 0303
+:A 11,13 0 0304
+oA 11,14 0 0305
+AE 15,11 0 0306
+,C 10,11,3 0 0307
+`E 9,14 0 0310
+'E 9,14 0 0311
+^E 9,14 0 0312
+:E 9,13 0 0313
+`I 5,14 0 0314
+'I 5,14 0 0315
+^I 5,14 0 0316
+:I 5,13 0 0317
+-D 10,11 0 0320
+~N 11,14 0 0321
+`O 11,14 0 0322
+'O 11,14 0 0323
+^O 11,14 0 0324
+~O 11,14 0 0325
+:O 11,13 0 0326
+tmu 9,8 0 0327
+/O 11,11 0 0330
+`U 11,14 0 0331
+'U 11,14 0 0332
+^U 11,14 0 0333
+:U 11,13 0 0334
+'Y 9,14 0 0335
+TP 9,11 0 0336
+ss 8,11 0 0337
+`a 8,11 0 0340
+'a 8,11 0 0341
+^a 8,11 0 0342
+~a 8,11 0 0343
+:a 8,11 0 0344
+oa 8,11 0 0345
+ae 12,8 0 0346
+,c 7,8,3 0 0347
+`e 8,11 0 0350
+'e 8,11 0 0351
+^e 8,11 0 0352
+:e 8,11 0 0353
+`i 3,11 0 0354
+'i 3,11 0 0355
+^i 3,11 0 0356
+:i 3,11 0 0357
+Sd 8,11 0 0360
+~n 8,11 0 0361
+`o 8,11 0 0362
+'o 8,11 0 0363
+^o 8,11 0 0364
+~o 8,11 0 0365
+:o 8,11 0 0366
+tdi 9,8 0 0367
+/o 8,9,1 0 0370
+`u 8,11 0 0371
+'u 8,11 0 0372
+^u 8,11 0 0373
+:u 8,11 0 0374
+'y 7,11,3 0 0375
+Tp 8,11,3 0 0376
+:y 7,11,3 0 0377
diff --git a/font/devX100/HR b/font/devX100/HR
new file mode 100644
index 0000000..d245418
--- /dev/null
+++ b/font/devX100/HR
@@ -0,0 +1,215 @@
+name HR
+spacewidth 4
+charset
+--- 10,11 0 00
+--- 4,1 0 040
+! 4,11 0 041
+" 5,11 0 042
+dq "
+# 8,10 0 043
+sh "
+$ 8,12,2 0 044
+Do "
+% 12,11 0 045
+& 10,10 0 046
+' 3,11 0 047
+aq "
+cq "
+oq "
+( 5,11,3 0 050
+) 5,11,3 0 051
+* 7,11 0 052
++ 9,8 0 053
+, 3,2,2 0 054
+\- 4,5 0 055
+. 3,2 0 056
+/ 4,11 0 057
+sl "
+0 8,11 0 060
+1 8,11 0 061
+2 8,11 0 062
+3 8,11 0 063
+4 8,11 0 064
+5 8,11 0 065
+6 8,11 0 066
+7 8,11 0 067
+8 8,11 0 070
+9 8,11 0 071
+: 3,8 0 072
+; 4,8,2 0 073
+< 8,7 0 074
+= 9,6 0 075
+> 8,7 0 076
+? 8,11 0 077
+@ 13,11,1 0 0100
+at "
+A 9,11 0 0101
+B 9,11 0 0102
+C 10,11 0 0103
+D 10,11 0 0104
+E 9,11 0 0105
+F 8,11 0 0106
+G 11,11 0 0107
+H 10,11 0 0110
+I 4,11 0 0111
+J 7,11 0 0112
+K 9,11 0 0113
+L 8,11 0 0114
+M 12,11 0 0115
+N 10,11 0 0116
+O 11,11 0 0117
+P 9,11 0 0120
+Q 11,11 0 0121
+R 10,11 0 0122
+S 9,11 0 0123
+T 9,11 0 0124
+U 10,11 0 0125
+V 9,11 0 0126
+W 13,11 0 0127
+X 9,11 0 0130
+Y 9,11 0 0131
+Z 9,11 0 0132
+[ 4,11,3 0 0133
+lB "
+\ 4,11 0 0134
+rs "
+] 4,11,3 0 0135
+rB "
+^ 7,11 0 0136
+a^ "
+ha "
+_ 8,0,3 0 0137
+` 5,11 0 0140
+ga "
+a 8,8 0 0141
+b 7,11 0 0142
+c 7,8 0 0143
+d 8,11 0 0144
+e 8,8 0 0145
+f 4,11 0 0146
+g 8,8,3 0 0147
+h 8,11 0 0150
+i 3,11 0 0151
+j 3,11,3 0 0152
+k 7,11 0 0153
+l 3,11 0 0154
+m 11,8 0 0155
+n 8,8 0 0156
+o 8,8 0 0157
+p 8,8,3 0 0160
+q 8,8,3 0 0161
+r 5,8 0 0162
+s 7,8 0 0163
+t 4,10 0 0164
+u 7,8 0 0165
+v 7,8 0 0166
+w 10,8 0 0167
+x 7,8 0 0170
+y 7,8,3 0 0171
+z 7,8 0 0172
+{ 5,11,3 0 0173
+lC "
+| 3,11,3 0 0174
+ba "
+} 5,11,3 0 0175
+rC "
+~ 8,6 0 0176
+a~ "
+ti "
+--- 4,1 0 0240
+r! 4,8,3 0 0241
+ct 8,9,1 0 0242
+Po 8,11 0 0243
+Cs 8,8 0 0244
+Ye 7,11 0 0245
+bb 3,11,3 0 0246
+sc 8,11,3 0 0247
+ad 5,10 0 0250
+co 12,11 0 0251
+Of 6,11 0 0252
+Fo 8,7 0 0253
+tno 9,6 0 0254
+- 4,5 0 0255
+hy "
+rg 12,11 0 0256
+a- 4,10 0 0257
+de 6,11 0 0260
+t+- 9,9 0 0261
+S2 5,11 0 0262
+S3 5,11 0 0263
+aa 5,11 0 0264
+mc 8,8,3 0 0265
+ps 8,11,3 0 0266
+pc 4,5 0 0267
+ac 5,0,3 0 0270
+S1 5,11 0 0271
+Om 6,11 0 0272
+Fc 8,7 0 0273
+14 12,11 0 0274
+12 12,11 0 0275
+34 12,11 0 0276
+r? 8,8,3 0 0277
+`A 9,14 0 0300
+'A 9,14 0 0301
+^A 9,14 0 0302
+~A 9,14 0 0303
+:A 9,13 0 0304
+oA 9,14 0 0305
+AE 14,11 0 0306
+,C 10,11,3 0 0307
+`E 9,14 0 0310
+'E 9,14 0 0311
+^E 9,14 0 0312
+:E 9,13 0 0313
+`I 4,14 0 0314
+'I 4,14 0 0315
+^I 4,14 0 0316
+:I 4,13 0 0317
+-D 10,11 0 0320
+~N 10,14 0 0321
+`O 11,14 0 0322
+'O 11,14 0 0323
+^O 11,14 0 0324
+~O 11,14 0 0325
+:O 11,13 0 0326
+tmu 9,8 0 0327
+/O 11,11 0 0330
+`U 10,14 0 0331
+'U 10,14 0 0332
+^U 10,14 0 0333
+:U 10,13 0 0334
+'Y 9,14 0 0335
+TP 9,11 0 0336
+ss 7,11 0 0337
+`a 8,11 0 0340
+'a 8,11 0 0341
+^a 8,11 0 0342
+~a 8,11 0 0343
+:a 8,11 0 0344
+oa 8,12 0 0345
+ae 13,8 0 0346
+,c 8,8,3 0 0347
+`e 8,11 0 0350
+'e 8,11 0 0351
+^e 8,11 0 0352
+:e 8,11 0 0353
+`i 3,11 0 0354
+'i 3,11 0 0355
+^i 3,11 0 0356
+:i 3,11 0 0357
+Sd 8,11 0 0360
+~n 8,11 0 0361
+`o 8,11 0 0362
+'o 8,11 0 0363
+^o 8,11 0 0364
+~o 8,11 0 0365
+:o 8,11 0 0366
+tdi 9,8 0 0367
+/o 8,8 0 0370
+`u 8,11 0 0371
+'u 8,11 0 0372
+^u 8,11 0 0373
+:u 8,11 0 0374
+'y 7,11,3 0 0375
+Tp 8,11,3 0 0376
+:y 7,11,3 0 0377
diff --git a/font/devX100/NB b/font/devX100/NB
new file mode 100644
index 0000000..d6da201
--- /dev/null
+++ b/font/devX100/NB
@@ -0,0 +1,215 @@
+name NB
+spacewidth 4
+charset
+--- 12,11 0 00
+--- 4,1 0 040
+! 4,11 0 041
+" 5,11 0 042
+dq "
+# 8,10 0 043
+sh "
+$ 8,12,1 0 044
+Do "
+% 13,11 0 045
+& 13,11 0 046
+' 3,11 0 047
+aq "
+cq "
+oq "
+( 5,11,2 0 050
+) 5,11,2 0 051
+* 6,11 0 052
++ 8,8 0 053
+, 4,3,2 0 054
+\- 5,5 0 055
+. 4,3 0 056
+/ 5,11 0 057
+sl "
+0 8,11 0 060
+1 8,11 0 061
+2 8,11 0 062
+3 8,11 0 063
+4 8,11 0 064
+5 8,11 0 065
+6 8,11 0 066
+7 8,11 0 067
+8 8,11 0 070
+9 8,11 0 071
+: 4,7 0 072
+; 4,7,2 0 073
+< 8,8 0 074
+= 8,6 0 075
+> 8,8 0 076
+? 7,11 0 077
+@ 14,11 0 0100
+at "
+A 11,11 0 0101
+B 10,11 0 0102
+C 11,11 0 0103
+D 12,11 0 0104
+E 10,11 0 0105
+F 10,11 0 0106
+G 12,11 0 0107
+H 12,11 0 0110
+I 7,11 0 0111
+J 9,11 0 0112
+K 12,11 0 0113
+L 10,11 0 0114
+M 14,11 0 0115
+N 12,11 0 0116
+O 12,11 0 0117
+P 10,11 0 0120
+Q 12,11,3 0 0121
+R 12,11 0 0122
+S 10,11 0 0123
+T 11,11 0 0124
+U 12,11 0 0125
+V 11,11 0 0126
+W 14,11 0 0127
+X 12,11 0 0130
+Y 11,11 0 0131
+Z 9,11 0 0132
+[ 5,11,2 0 0133
+lB "
+\ 7,11 0 0134
+rs "
+] 5,11,2 0 0135
+rB "
+^ 8,11 0 0136
+a^ "
+ha "
+_ 7,0,2 0 0137
+` 6,11 0 0140
+ga "
+a 9,7 0 0141
+b 10,11 0 0142
+c 8,7 0 0143
+d 10,11 0 0144
+e 9,7 0 0145
+f 6,11 0 0146
+g 8,8,3 0 0147
+h 10,11 0 0150
+i 5,10 0 0151
+j 5,10,3 0 0152
+k 9,11 0 0153
+l 5,11 0 0154
+m 15,7 0 0155
+n 10,7 0 0156
+o 9,7 0 0157
+p 10,7,3 0 0160
+q 9,7,3 0 0161
+r 7,7 0 0162
+s 7,7 0 0163
+t 6,10 0 0164
+u 10,7 0 0165
+v 7,7 0 0166
+w 12,7 0 0167
+x 9,7 0 0170
+y 7,7,3 0 0171
+z 7,7 0 0172
+{ 6,11,2 0 0173
+lC "
+| 8,11 0 0174
+ba "
+} 6,11,2 0 0175
+rC "
+~ 8,6 0 0176
+a~ "
+ti "
+--- 4,1 0 0240
+r! 5,8,3 0 0241
+ct 8,8,1 0 0242
+Po 9,11 0 0243
+Cs 9,10 0 0244
+Ye 11,11 0 0245
+bb 8,11 0 0246
+sc 7,11,2 0 0247
+ad 7,10 0 0250
+co 12,11 0 0251
+Of 6,11 0 0252
+Fo 8,6 0 0253
+tno 8,6 0 0254
+- 5,5 0 0255
+hy "
+rg 12,11 0 0256
+a- 7,9 0 0257
+de 6,11 0 0260
+t+- 8,8 0 0261
+S2 5,11 0 0262
+S3 5,11 0 0263
+aa 6,11 0 0264
+mc 10,7,3 0 0265
+ps 10,11 0 0266
+pc 5,6 0 0267
+ac 5,0,3 0 0270
+S1 5,11 0 0271
+Om 6,11 0 0272
+Fc 8,6 0 0273
+14 12,11 0 0274
+12 12,11 0 0275
+34 12,11 0 0276
+r? 7,8,3 0 0277
+`A 11,15 0 0300
+'A 11,15 0 0301
+^A 11,15 0 0302
+~A 11,14 0 0303
+:A 11,14 0 0304
+oA 11,15 0 0305
+AE 15,11 0 0306
+,C 11,11,3 0 0307
+`E 10,15 0 0310
+'E 10,15 0 0311
+^E 10,15 0 0312
+:E 10,14 0 0313
+`I 7,15 0 0314
+'I 7,15 0 0315
+^I 7,15 0 0316
+:I 7,14 0 0317
+-D 12,11 0 0320
+~N 12,14 0 0321
+`O 12,15 0 0322
+'O 12,15 0 0323
+^O 12,15 0 0324
+~O 12,14 0 0325
+:O 12,14 0 0326
+tmu 8,8 0 0327
+/O 12,11 0 0330
+`U 12,15 0 0331
+'U 12,15 0 0332
+^U 12,15 0 0333
+:U 12,14 0 0334
+'Y 11,15 0 0335
+TP 10,11 0 0336
+ss 9,11 0 0337
+`a 9,11 0 0340
+'a 9,11 0 0341
+^a 9,11 0 0342
+~a 9,10 0 0343
+:a 9,10 0 0344
+oa 9,11 0 0345
+ae 14,7 0 0346
+,c 8,7,3 0 0347
+`e 9,11 0 0350
+'e 9,11 0 0351
+^e 9,11 0 0352
+:e 9,10 0 0353
+`i 5,11 0 0354
+'i 5,11 0 0355
+^i 5,11 0 0356
+:i 5,10 0 0357
+Sd 9,11 0 0360
+~n 10,10 0 0361
+`o 9,11 0 0362
+'o 9,11 0 0363
+^o 9,11 0 0364
+~o 9,10 0 0365
+:o 9,10 0 0366
+tdi 8,8 0 0367
+/o 9,8,1 0 0370
+`u 10,11 0 0371
+'u 10,11 0 0372
+^u 10,11 0 0373
+:u 10,10 0 0374
+'y 7,11,3 0 0375
+Tp 10,11,3 0 0376
+:y 7,10,3 0 0377
diff --git a/font/devX100/NBI b/font/devX100/NBI
new file mode 100644
index 0000000..c98383e
--- /dev/null
+++ b/font/devX100/NBI
@@ -0,0 +1,215 @@
+name NBI
+spacewidth 4
+charset
+--- 12,11 0 00
+--- 4,1 0 040
+! 5,11 0 041
+" 6,11 0 042
+dq "
+# 8,10 0 043
+sh "
+$ 8,12,1 0 044
+Do "
+% 13,11,1 0 045
+& 13,11 0 046
+' 4,11 0 047
+aq "
+cq "
+oq "
+( 5,11,2 0 050
+) 6,11,2 0 051
+* 7,11 0 052
++ 8,8 0 053
+, 4,2,3 0 054
+\- 5,5 0 055
+. 4,2 0 056
+/ 5,11 0 057
+sl "
+0 8,11 0 060
+1 8,11 0 061
+2 8,11 0 062
+3 8,11 0 063
+4 8,11 0 064
+5 8,11 0 065
+6 8,11 0 066
+7 8,11 0 067
+8 8,11 0 070
+9 8,11 0 071
+: 4,7 0 072
+; 5,7,3 0 073
+< 9,9 0 074
+= 9,7 0 075
+> 9,9 0 076
+? 7,11 0 077
+@ 13,11 0 0100
+at "
+A 11,11 0 0101
+B 10,11 0 0102
+C 11,11 0 0103
+D 12,11 0 0104
+E 10,11 0 0105
+F 10,11 0 0106
+G 11,11 0 0107
+H 12,11 0 0110
+I 6,11 0 0111
+J 8,11 0 0112
+K 12,11 0 0113
+L 10,11 0 0114
+M 15,11 0 0115
+N 13,11 0 0116
+O 12,11 0 0117
+P 11,11 0 0120
+Q 12,11,2 0 0121
+R 12,11 0 0122
+S 10,11 0 0123
+T 11,11 0 0124
+U 12,11 0 0125
+V 11,11 0 0126
+W 15,11 0 0127
+X 11,11 0 0130
+Y 9,11 0 0131
+Z 10,11 0 0132
+[ 7,11,2 0 0133
+lB "
+\ 9,11 0 0134
+rs "
+] 7,11,2 0 0135
+rB "
+^ 8,11 0 0136
+a^ "
+ha "
+_ 9,0,2 0 0137
+` 5,11 0 0140
+ga "
+a 10,7 0 0141
+b 8,11 0 0142
+c 8,7 0 0143
+d 10,11 0 0144
+e 8,7 0 0145
+f 5,11,3 0 0146
+g 8,9,3 0 0147
+h 10,11 0 0150
+i 5,10 0 0151
+j 4,10,3 0 0152
+k 9,11 0 0153
+l 5,11 0 0154
+m 15,7 0 0155
+n 10,7 0 0156
+o 8,7 0 0157
+p 8,7,3 0 0160
+q 9,7,3 0 0161
+r 7,7 0 0162
+s 8,7 0 0163
+t 5,9 0 0164
+u 10,7 0 0165
+v 8,7 0 0166
+w 13,7 0 0167
+x 9,7 0 0170
+y 9,7,3 0 0171
+z 9,7 0 0172
+{ 6,11,2 0 0173
+lC "
+| 9,11 0 0174
+ba "
+} 6,11,2 0 0175
+rC "
+~ 11,6 0 0176
+a~ "
+ti "
+--- 4,1 0 0240
+r! 5,8,3 0 0241
+ct 8,8,1 0 0242
+Po 10,11 0 0243
+Cs 8,9 0 0244
+Ye 10,11 0 0245
+bb 8,11 0 0246
+sc 9,11,2 0 0247
+ad 6,10 0 0250
+co 12,11 0 0251
+Of 8,11 0 0252
+Fo 10,7 0 0253
+tno 9,7 0 0254
+- 5,5 0 0255
+hy "
+rg 12,11 0 0256
+a- 6,9 0 0257
+de 6,11 0 0260
+t+- 8,8 0 0261
+S2 5,11 0 0262
+S3 5,11 0 0263
+aa 5,11 0 0264
+mc 10,7,3 0 0265
+ps 9,11 0 0266
+pc 5,6 0 0267
+ac 5,0,3 0 0270
+S1 5,11 0 0271
+Om 8,11 0 0272
+Fc 10,7 0 0273
+14 12,11 0 0274
+12 12,11 0 0275
+34 12,11 0 0276
+r? 7,8,3 0 0277
+`A 11,15 0 0300
+'A 11,15 0 0301
+^A 11,15 0 0302
+~A 11,14 0 0303
+:A 11,14 0 0304
+oA 11,15 0 0305
+AE 14,11 0 0306
+,C 11,11,3 0 0307
+`E 10,15 0 0310
+'E 10,15 0 0311
+^E 10,15 0 0312
+:E 10,14 0 0313
+`I 6,15 0 0314
+'I 6,15 0 0315
+^I 6,15 0 0316
+:I 6,14 0 0317
+-D 12,11 0 0320
+~N 13,14 0 0321
+`O 12,15 0 0322
+'O 12,15 0 0323
+^O 12,15 0 0324
+~O 12,14 0 0325
+:O 12,14 0 0326
+tmu 8,8 0 0327
+/O 12,11 0 0330
+`U 12,15 0 0331
+'U 12,15 0 0332
+^U 12,15 0 0333
+:U 12,14 0 0334
+'Y 9,15 0 0335
+TP 11,11 0 0336
+ss 10,11,3 0 0337
+`a 10,11 0 0340
+'a 10,11 0 0341
+^a 10,11 0 0342
+~a 10,10 0 0343
+:a 10,10 0 0344
+oa 10,11 0 0345
+ae 13,7 0 0346
+,c 8,7,3 0 0347
+`e 8,11 0 0350
+'e 8,11 0 0351
+^e 8,11 0 0352
+:e 8,10 0 0353
+`i 5,11 0 0354
+'i 5,11 0 0355
+^i 5,11 0 0356
+:i 5,10 0 0357
+Sd 8,11 0 0360
+~n 10,10 0 0361
+`o 8,11 0 0362
+'o 8,11 0 0363
+^o 8,11 0 0364
+~o 8,10 0 0365
+:o 8,10 0 0366
+tdi 8,8 0 0367
+/o 8,7 0 0370
+`u 10,11 0 0371
+'u 10,11 0 0372
+^u 10,11 0 0373
+:u 10,10 0 0374
+'y 9,11,3 0 0375
+Tp 8,11,3 0 0376
+:y 9,10,3 0 0377
diff --git a/font/devX100/NI b/font/devX100/NI
new file mode 100644
index 0000000..6cf37e5
--- /dev/null
+++ b/font/devX100/NI
@@ -0,0 +1,215 @@
+name NI
+spacewidth 4
+charset
+--- 11,11 0 00
+--- 4,1 0 040
+! 5,11 0 041
+" 6,11 0 042
+dq "
+# 11,10 0 043
+sh "
+$ 8,12,1 0 044
+Do "
+% 12,11,1 0 045
+& 11,11 0 046
+' 4,11 0 047
+aq "
+cq "
+oq "
+( 5,11,2 0 050
+) 5,11,2 0 051
+* 6,11 0 052
++ 8,8 0 053
+, 4,2,2 0 054
+\- 5,5 0 055
+. 4,2 0 056
+/ 9,11,3 0 057
+sl "
+0 8,11 0 060
+1 8,11 0 061
+2 8,11 0 062
+3 8,11 0 063
+4 8,11 0 064
+5 8,11 0 065
+6 8,11 0 066
+7 8,11 0 067
+8 8,11 0 070
+9 8,11 0 071
+: 4,7 0 072
+; 4,7,2 0 073
+< 9,8 0 074
+= 8,6 0 075
+> 9,8 0 076
+? 6,11 0 077
+@ 12,11 0 0100
+at "
+A 11,11 0 0101
+B 9,11 0 0102
+C 10,11 0 0103
+D 11,11 0 0104
+E 9,11 0 0105
+F 8,11 0 0106
+G 10,11 0 0107
+H 11,11 0 0110
+I 7,11 0 0111
+J 8,11 0 0112
+K 10,11 0 0113
+L 9,11 0 0114
+M 14,11 0 0115
+N 12,11 0 0116
+O 10,11 0 0117
+P 10,11 0 0120
+Q 10,11,2 0 0121
+R 11,11 0 0122
+S 10,11 0 0123
+T 10,11 0 0124
+U 12,11 0 0125
+V 10,11 0 0126
+W 13,11 0 0127
+X 10,11 0 0130
+Y 9,11 0 0131
+Z 10,11 0 0132
+[ 6,11,2 0 0133
+lB "
+\ 8,11 0 0134
+rs "
+] 6,11,2 0 0135
+rB "
+^ 6,11 0 0136
+a^ "
+ha "
+_ 7,0,2 0 0137
+` 4,11 0 0140
+ga "
+a 9,7 0 0141
+b 7,11 0 0142
+c 6,7 0 0143
+d 9,11 0 0144
+e 6,7 0 0145
+f 5,11,3 0 0146
+g 7,8,3 0 0147
+h 9,11 0 0150
+i 4,11 0 0151
+j 4,11,3 0 0152
+k 8,11 0 0153
+l 4,11 0 0154
+m 14,7 0 0155
+n 9,7 0 0156
+o 7,7 0 0157
+p 7,7,3 0 0160
+q 8,7,3 0 0161
+r 7,7 0 0162
+s 7,7 0 0163
+t 5,9 0 0164
+u 9,7 0 0165
+v 7,7 0 0166
+w 11,7 0 0167
+x 8,7 0 0170
+y 7,7,3 0 0171
+z 8,7 0 0172
+{ 6,11,2 0 0173
+lC "
+| 9,11 0 0174
+ba "
+} 6,11,2 0 0175
+rC "
+~ 9,6 0 0176
+a~ "
+ti "
+--- 4,1 0 0240
+r! 4,8,3 0 0241
+ct 8,9,2 0 0242
+Po 9,11 0 0243
+Cs 8,9 0 0244
+Ye 9,11 0 0245
+bb 8,11 0 0246
+sc 7,11,2 0 0247
+ad 7,10 0 0250
+co 13,11 0 0251
+Of 6,11 0 0252
+Fo 8,7 0 0253
+tno 8,6 0 0254
+- 5,5 0 0255
+hy "
+rg 13,11 0 0256
+a- 6,9 0 0257
+de 6,11 0 0260
+t+- 8,8 0 0261
+S2 5,11 0 0262
+S3 5,11 0 0263
+aa 4,11 0 0264
+mc 9,7,3 0 0265
+ps 9,11 0 0266
+pc 5,6 0 0267
+ac 5,0,3 0 0270
+S1 5,11 0 0271
+Om 6,11 0 0272
+Fc 8,7 0 0273
+14 12,11 0 0274
+12 12,11 0 0275
+34 12,11 0 0276
+r? 6,8,3 0 0277
+`A 11,14 0 0300
+'A 11,14 0 0301
+^A 11,14 0 0302
+~A 11,14 0 0303
+:A 11,14 0 0304
+oA 11,14 0 0305
+AE 14,11 0 0306
+,C 10,11,3 0 0307
+`E 9,14 0 0310
+'E 9,14 0 0311
+^E 9,14 0 0312
+:E 9,14 0 0313
+`I 7,14 0 0314
+'I 7,14 0 0315
+^I 7,14 0 0316
+:I 7,14 0 0317
+-D 11,11 0 0320
+~N 12,14 0 0321
+`O 10,14 0 0322
+'O 10,14 0 0323
+^O 10,14 0 0324
+~O 10,14 0 0325
+:O 10,14 0 0326
+tmu 8,8 0 0327
+/O 10,11 0 0330
+`U 12,14 0 0331
+'U 12,14 0 0332
+^U 12,14 0 0333
+:U 12,14 0 0334
+'Y 9,14 0 0335
+TP 10,11 0 0336
+ss 8,11,3 0 0337
+`a 9,11 0 0340
+'a 9,11 0 0341
+^a 9,11 0 0342
+~a 9,10 0 0343
+:a 9,10 0 0344
+oa 9,11 0 0345
+ae 10,7 0 0346
+,c 6,7,3 0 0347
+`e 6,11 0 0350
+'e 6,11 0 0351
+^e 6,11 0 0352
+:e 6,10 0 0353
+`i 4,11 0 0354
+'i 4,11 0 0355
+^i 4,11 0 0356
+:i 4,10 0 0357
+Sd 7,11 0 0360
+~n 9,10 0 0361
+`o 7,11 0 0362
+'o 7,11 0 0363
+^o 7,11 0 0364
+~o 7,10 0 0365
+:o 7,10 0 0366
+tdi 8,8 0 0367
+/o 7,8,1 0 0370
+`u 9,11 0 0371
+'u 9,11 0 0372
+^u 9,11 0 0373
+:u 9,10 0 0374
+'y 7,11,3 0 0375
+Tp 7,11,3 0 0376
+:y 7,10,3 0 0377
diff --git a/font/devX100/NR b/font/devX100/NR
new file mode 100644
index 0000000..2d6daf8
--- /dev/null
+++ b/font/devX100/NR
@@ -0,0 +1,215 @@
+name NR
+spacewidth 4
+charset
+--- 12,11 0 00
+--- 4,1 0 040
+! 3,11 0 041
+" 5,11 0 042
+dq "
+# 8,11 0 043
+sh "
+$ 8,12,2 0 044
+Do "
+% 12,11 0 045
+& 13,11 0 046
+' 3,11 0 047
+aq "
+cq "
+oq "
+( 5,11,2 0 050
+) 6,11,2 0 051
+* 7,11 0 052
++ 9,7 0 053
+, 4,2,2 0 054
+\- 5,4 0 055
+. 4,2 0 056
+/ 4,11 0 057
+sl "
+0 8,11 0 060
+1 8,11 0 061
+2 8,11 0 062
+3 8,11 0 063
+4 8,11 0 064
+5 8,11 0 065
+6 8,11 0 066
+7 8,11 0 067
+8 8,11 0 070
+9 8,11 0 071
+: 4,7 0 072
+; 4,7,2 0 073
+< 10,7 0 074
+= 9,6 0 075
+> 10,7 0 076
+? 6,11 0 077
+@ 13,11 0 0100
+at "
+A 10,11 0 0101
+B 10,11 0 0102
+C 11,11 0 0103
+D 11,11 0 0104
+E 10,11 0 0105
+F 10,11 0 0106
+G 11,11 0 0107
+H 12,11 0 0110
+I 6,11 0 0111
+J 7,11 0 0112
+K 11,11 0 0113
+L 10,11 0 0114
+M 16,11 0 0115
+N 13,11 0 0116
+O 11,11 0 0117
+P 10,11 0 0120
+Q 11,11,2 0 0121
+R 11,11 0 0122
+S 8,11 0 0123
+T 10,11 0 0124
+U 13,11 0 0125
+V 10,11 0 0126
+W 16,11 0 0127
+X 13,11 0 0130
+Y 10,11 0 0131
+Z 9,11 0 0132
+[ 4,11,2 0 0133
+lB "
+\ 8,11 0 0134
+rs "
+] 4,11,2 0 0135
+rB "
+^ 7,11 0 0136
+a^ "
+ha "
+_ 7,0,2 0 0137
+` 5,11 0 0140
+ga "
+a 8,7 0 0141
+b 7,11 0 0142
+c 7,7 0 0143
+d 8,11 0 0144
+e 7,7 0 0145
+f 5,11 0 0146
+g 8,7,3 0 0147
+h 9,11 0 0150
+i 4,10 0 0151
+j 4,10,3 0 0152
+k 9,11 0 0153
+l 4,11 0 0154
+m 14,7 0 0155
+n 9,7 0 0156
+o 7,7 0 0157
+p 8,7,3 0 0160
+q 7,7,3 0 0161
+r 7,7 0 0162
+s 6,7 0 0163
+t 5,9 0 0164
+u 9,7 0 0165
+v 8,7 0 0166
+w 12,7 0 0167
+x 8,7 0 0170
+y 8,7,3 0 0171
+z 7,7 0 0172
+{ 4,11,2 0 0173
+lC "
+| 9,11 0 0174
+ba "
+} 5,11,2 0 0175
+rC "
+~ 9,5 0 0176
+a~ "
+ti "
+--- 4,1 0 0240
+r! 4,8,3 0 0241
+ct 8,9,2 0 0242
+Po 8,11 0 0243
+Cs 8,9 0 0244
+Ye 8,11 0 0245
+bb 9,11 0 0246
+sc 7,11,2 0 0247
+ad 6,10 0 0250
+co 14,11 0 0251
+Of 6,11 0 0252
+Fo 7,6 0 0253
+tno 9,5 0 0254
+- 5,4 0 0255
+hy "
+rg 14,11 0 0256
+a- 5,9 0 0257
+de 6,11 0 0260
+t+- 9,7 0 0261
+S2 5,11 0 0262
+S3 5,11 0 0263
+aa 5,11 0 0264
+mc 9,7,3 0 0265
+ps 9,11,2 0 0266
+pc 4,5 0 0267
+ac 5,1,3 0 0270
+S1 5,11 0 0271
+Om 5,11 0 0272
+Fc 7,6 0 0273
+14 12,11 0 0274
+12 12,11 0 0275
+34 12,11 0 0276
+r? 6,8,3 0 0277
+`A 10,14 0 0300
+'A 10,14 0 0301
+^A 10,14 0 0302
+~A 10,14 0 0303
+:A 10,13 0 0304
+oA 10,14 0 0305
+AE 15,11 0 0306
+,C 11,11,3 0 0307
+`E 10,14 0 0310
+'E 10,14 0 0311
+^E 10,14 0 0312
+:E 10,14 0 0313
+`I 6,14 0 0314
+'I 6,14 0 0315
+^I 6,14 0 0316
+:I 6,14 0 0317
+-D 11,11 0 0320
+~N 13,14 0 0321
+`O 11,14 0 0322
+'O 11,14 0 0323
+^O 11,14 0 0324
+~O 11,14 0 0325
+:O 11,14 0 0326
+tmu 9,7 0 0327
+/O 11,11 0 0330
+`U 13,14 0 0331
+'U 13,14 0 0332
+^U 13,14 0 0333
+:U 13,14 0 0334
+'Y 10,14 0 0335
+TP 10,11 0 0336
+ss 8,11 0 0337
+`a 8,11 0 0340
+'a 8,11 0 0341
+^a 8,11 0 0342
+~a 8,10 0 0343
+:a 8,10 0 0344
+oa 8,11 0 0345
+ae 12,7 0 0346
+,c 7,7,3 0 0347
+`e 7,11 0 0350
+'e 7,11 0 0351
+^e 7,11 0 0352
+:e 7,10 0 0353
+`i 4,11 0 0354
+'i 4,11 0 0355
+^i 4,11 0 0356
+:i 4,10 0 0357
+Sd 7,11 0 0360
+~n 9,10 0 0361
+`o 7,11 0 0362
+'o 7,11 0 0363
+^o 7,11 0 0364
+~o 7,10 0 0365
+:o 7,10 0 0366
+tdi 9,7 0 0367
+/o 7,8,1 0 0370
+`u 9,11 0 0371
+'u 9,11 0 0372
+^u 9,11 0 0373
+:u 9,10 0 0374
+'y 8,11,3 0 0375
+Tp 8,11,3 0 0376
+:y 8,10,3 0 0377
diff --git a/font/devX100/S b/font/devX100/S
new file mode 100644
index 0000000..ebf37c9
--- /dev/null
+++ b/font/devX100/S
@@ -0,0 +1,221 @@
+name S
+special
+spacewidth 4
+charset
+--- 4,1 0 040
+! 5,10 0 041
+fa 9,10 0 042
+# 7,10 0 043
+sh "
+te 8,10 0 044
+% 12,10 0 045
+& 11,10 0 046
+st 6,7 0 047
+( 5,10,3 0 050
+) 5,10,3 0 051
+** 7,8 0 052
++ 8,7 0 053
+pl "
+, 3,2,2 0 054
+\- 8,4 0 055
+mi "
+. 3,2 0 056
+/ 4,10 0 057
+sl "
+0 7,10 0 060
+1 7,10 0 061
+2 7,10 0 062
+3 7,10 0 063
+4 7,10 0 064
+5 7,10 0 065
+6 7,10 0 066
+7 7,10 0 067
+8 7,10 0 070
+9 7,10 0 071
+: 4,7 0 072
+; 4,7,2 0 073
+< 8,7 0 074
+= 8,5 0 075
+eq "
+> 8,7 0 076
+? 6,10 0 077
+=~ 8,7 0 0100
+*A 11,10 0 0101
+*B 9,10 0 0102
+*X 11,10 0 0103
+*D 9,10 0 0104
+*E 9,10 0 0105
+*F 11,10 0 0106
+*G 9,10 0 0107
+*Y 11,10 0 0110
+*I 5,10 0 0111
++h 9,10 0 0112
+*K 10,10 0 0113
+*L 10,10 0 0114
+*M 13,10 0 0115
+*N 11,10 0 0116
+*O 10,10 0 0117
+*P 11,10 0 0120
+*H 10,10 0 0121
+*R 8,10 0 0122
+*S 9,10 0 0123
+*T 9,10 0 0124
+--- 9,10 0 0125
+ts 7,7,3 0 0126
+*W 11,10 0 0127
+*C 9,10 0 0130
+*Q 11,10 0 0131
+*Z 9,10 0 0132
+[ 5,10,3 0 0133
+lB "
+tf 10,7 0 0134
+3d "
+] 5,10,3 0 0135
+rB "
+pp 10,10 0 0136
+_ 7,0,3 0 0137
+radicalex 7,12 0 0140
+*a 9,7 0 0141
+*b 8,11,3 0 0142
+*x 8,7,3 0 0143
+*d 7,11 0 0144
+*e 6,7 0 0145
+*f 9,10,3 0 0146
+*g 6,7,3 0 0147
+*y 8,7,3 0 0150
+*i 5,7 0 0151
++f 9,7,3 0 0152
+*k 8,7 0 0153
+*l 8,10 0 0154
+*m 8,7,2 0 0155
+*n 8,7 0 0156
+*o 8,7 0 0157
+*p 8,7 0 0160
+*h 7,10 0 0161
+*r 8,7,3 0 0162
+*s 8,7 0 0163
+*t 6,7 0 0164
+*u 8,7 0 0165
++p 11,8 0 0166
+*w 11,7 0 0167
+*c 7,12,3 0 0170
+*q 9,7,3 0 0171
+*z 7,11,3 0 0172
+lC 7,10,3 0 0173
+{ "
+ba 3,10,3 0 0174
+| "
+rC 7,10,3 0 0175
+} "
+ap 8,5 0 0176
+*U 9,10 0 0241
+fm 4,10 0 0242
+<= 8,9 0 0243
+f/ 4,10 0 0244
+if 10,6 0 0245
+Fn 7,10,3 0 0246
+CL 11,7 0 0247
+DI 11,7 0 0250
+HE 11,7 0 0251
+SP 11,7 0 0252
+<> 15,7 0 0253
+<- 14,7 0 0254
+ua 9,12,3 0 0255
+arrowverttp "
+-> 14,7 0 0256
+da 9,12,3 0 0257
+arrowvertbt "
+de 6,10 0 0260
++- 8,9 0 0261
+sd 6,10 0 0262
+>= 8,9 0 0263
+mu 8,7 0 0264
+pt 10,6 0 0265
+pd 7,11 0 0266
+bu 7,6 0 0267
+di 8,7 0 0270
+!= 8,7 0 0271
+== 8,6 0 0272
+~= 8,7 0 0273
+~~ "
+--- 15,2 0 0274
+arrowvertex 9,12,3 0 0275
+an 15,4 0 0276
+CR 10,9 0 0277
+Ah 12,10 0 0300
+Im 10,11,1 0 0301
+Re 12,11 0 0302
+wp 12,9,3 0 0303
+c* 11,9 0 0304
+c+ 11,9 0 0305
+es 12,11 0 0306
+ca 10,7 0 0307
+cu 10,7 0 0310
+sp 10,7 0 0311
+ip 10,7,2 0 0312
+nb 10,8,1 0 0313
+sb 10,7 0 0314
+ib 10,7,2 0 0315
+mo 10,7 0 0316
+nm 10,8,1 0 0317
+/_ 11,10 0 0320
+gr 10,11 0 0321
+rg 12,10 0 0322
+co 12,10 0 0323
+tm 11,10 0 0324
+--- 12,11,1 0 0325
+sr 8,12 0 0326
+sqrt "
+md 4,5 0 0327
+no 10,5 0 0330
+AN 9,7 0 0331
+OR 9,7 0 0332
+hA 15,7 0 0333
+lA 14,7 0 0334
+uA 9,12 0 0335
+rA 14,7 0 0336
+dA 9,12 0 0337
+lz 7,11 0 0340
+la 5,12,3 0 0341
+--- 12,10 0 0342
+--- 12,10 0 0343
+--- 11,10 0 0344
+--- 10,11,1 0 0345
+parenlefttp 6,12,3 0 0346
+parenleftex 6,12,3 0 0347
+parenleftbt 6,12,3 0 0350
+bracketlefttp 6,12,3 0 0351
+lc "
+bracketleftex 6,12,3 0 0352
+bracketleftbt 6,12,3 0 0353
+lf "
+bracelefttp 7,12,3 0 0354
+lt "
+braceleftmid 7,12,3 0 0355
+lk "
+braceleftbt 7,12,3 0 0356
+lb "
+bracerightex 7,12,3 0 0357
+braceleftex "
+braceex "
+bv "
+ra 5,12,3 0 0361
+is 4,12,1 0 0362
+integral "
+--- 10,12,3 0 0363
+--- 10,12,3 0 0364
+--- 10,12,3 0 0365
+parenrighttp 6,12,3 0 0366
+parenrightex 6,12,3 0 0367
+parenrightbt 6,12,3 0 0370
+bracketrighttp 6,12,3 0 0371
+rc "
+bracketrightex 6,12,3 0 0372
+bracketrightbt 6,12,3 0 0373
+rf "
+bracerighttp 7,12,3 0 0374
+rt "
+bracerightmid 7,12,3 0 0375
+rk "
+bracerightbt 7,12,3 0 0376
+rb "
diff --git a/font/devX100/TB b/font/devX100/TB
new file mode 100644
index 0000000..334283f
--- /dev/null
+++ b/font/devX100/TB
@@ -0,0 +1,215 @@
+name TB
+spacewidth 3
+charset
+--- 11,9 0 00
+--- 3,1 0 040
+! 4,10 0 041
+" 7,10 0 042
+dq "
+# 7,10 0 043
+sh "
+$ 7,11,1 0 044
+Do "
+% 14,10 0 045
+& 12,10 0 046
+' 4,10 0 047
+aq "
+cq "
+oq "
+( 5,10,3 0 050
+) 5,10,3 0 051
+* 7,10 0 052
++ 8,7 0 053
+, 3,2,2 0 054
+\- 4,4 0 055
+. 3,2 0 056
+/ 4,10 0 057
+sl "
+0 7,10 0 060
+1 7,10 0 061
+2 7,10 0 062
+3 7,10 0 063
+4 7,10 0 064
+5 7,10 0 065
+6 7,10 0 066
+7 7,10 0 067
+8 7,10 0 070
+9 7,10 0 071
+: 4,7 0 072
+; 4,7,2 0 073
+< 8,7 0 074
+= 8,5 0 075
+> 8,7 0 076
+? 7,10 0 077
+@ 14,10,2 0 0100
+at "
+A 10,10 0 0101
+B 9,10 0 0102
+C 10,10 0 0103
+D 10,10 0 0104
+E 9,10 0 0105
+F 8,10 0 0106
+G 11,10 0 0107
+H 11,10 0 0110
+I 5,10 0 0111
+J 7,10,1 0 0112
+K 11,10 0 0113
+L 9,10 0 0114
+M 13,10 0 0115
+N 10,10 0 0116
+O 11,10 0 0117
+P 9,10 0 0120
+Q 11,10,3 0 0121
+R 10,10 0 0122
+S 8,10 0 0123
+T 9,10 0 0124
+U 10,10 0 0125
+V 10,10 0 0126
+W 14,10 0 0127
+X 10,10 0 0130
+Y 10,10 0 0131
+Z 9,10 0 0132
+[ 5,10,3 0 0133
+lB "
+\ 4,10 0 0134
+rs "
+] 5,10,3 0 0135
+rB "
+^ 8,10 0 0136
+a^ "
+ha "
+_ 7,0,3 0 0137
+` 5,11 0 0140
+ga "
+a 7,7 0 0141
+b 8,10 0 0142
+c 6,7 0 0143
+d 7,10 0 0144
+e 6,7 0 0145
+f 5,10 0 0146
+g 7,7,3 0 0147
+h 8,10 0 0150
+i 4,10 0 0151
+j 4,10,3 0 0152
+k 8,10 0 0153
+l 4,10 0 0154
+m 12,7 0 0155
+n 8,7 0 0156
+o 7,7 0 0157
+p 8,7,3 0 0160
+q 7,7,3 0 0161
+r 6,7 0 0162
+s 6,7 0 0163
+t 5,9 0 0164
+u 7,7 0 0165
+v 7,7 0 0166
+w 10,7 0 0167
+x 7,7 0 0170
+y 7,7,3 0 0171
+z 6,7 0 0172
+{ 7,10,3 0 0173
+lC "
+| 3,10,2 0 0174
+ba "
+} 7,10,3 0 0175
+rC "
+~ 8,7 0 0176
+a~ "
+ti "
+--- 3,1 0 0240
+r! 4,7,3 0 0241
+ct 7,9,2 0 0242
+Po 8,10 0 0243
+Cs 8,8 0 0244
+Ye 8,10 0 0245
+bb 3,10,2 0 0246
+sc 7,10,2 0 0247
+ad 5,10 0 0250
+co 12,10 0 0251
+Of 5,10 0 0252
+Fo 9,6 0 0253
+tno 9,5 0 0254
+- 4,4 0 0255
+hy "
+rg 12,10 0 0256
+a- 5,9 0 0257
+de 6,10 0 0260
+t+- 8,9 0 0261
+S2 4,10 0 0262
+S3 4,10 0 0263
+aa 5,11 0 0264
+mc 7,7,3 0 0265
+ps 8,10,3 0 0266
+pc 4,6 0 0267
+ac 5,0,3 0 0270
+S1 4,10 0 0271
+Om 5,10 0 0272
+Fc 9,6 0 0273
+14 10,10 0 0274
+12 10,10 0 0275
+34 10,10 0 0276
+r? 7,7,3 0 0277
+`A 10,14 0 0300
+'A 10,14 0 0301
+^A 10,14 0 0302
+~A 10,13 0 0303
+:A 10,13 0 0304
+oA 10,14 0 0305
+AE 14,10 0 0306
+,C 10,10,3 0 0307
+`E 9,14 0 0310
+'E 9,14 0 0311
+^E 9,14 0 0312
+:E 9,13 0 0313
+`I 5,14 0 0314
+'I 5,14 0 0315
+^I 5,14 0 0316
+:I 5,13 0 0317
+-D 11,10 0 0320
+~N 10,13 0 0321
+`O 11,14 0 0322
+'O 11,14 0 0323
+^O 11,14 0 0324
+~O 11,13 0 0325
+:O 11,13 0 0326
+tmu 8,7 0 0327
+/O 11,11,1 0 0330
+`U 10,14 0 0331
+'U 10,14 0 0332
+^U 10,14 0 0333
+:U 10,13 0 0334
+'Y 10,14 0 0335
+TP 9,10 0 0336
+ss 8,10 0 0337
+`a 7,11 0 0340
+'a 7,11 0 0341
+^a 7,11 0 0342
+~a 7,10 0 0343
+:a 7,10 0 0344
+oa 7,11 0 0345
+ae 11,7 0 0346
+,c 7,7,3 0 0347
+`e 7,11 0 0350
+'e 7,11 0 0351
+^e 7,11 0 0352
+:e 7,10 0 0353
+`i 4,11 0 0354
+'i 4,11 0 0355
+^i 4,11 0 0356
+:i 4,10 0 0357
+Sd 7,10 0 0360
+~n 8,10 0 0361
+`o 7,11 0 0362
+'o 7,11 0 0363
+^o 7,11 0 0364
+~o 7,10 0 0365
+:o 7,10 0 0366
+tdi 8,7 0 0367
+/o 7,8,1 0 0370
+`u 7,11 0 0371
+'u 7,11 0 0372
+^u 7,11 0 0373
+:u 7,10 0 0374
+'y 7,11,3 0 0375
+Tp 8,10,3 0 0376
+:y 7,10,3 0 0377
diff --git a/font/devX100/TBI b/font/devX100/TBI
new file mode 100644
index 0000000..8383c0a
--- /dev/null
+++ b/font/devX100/TBI
@@ -0,0 +1,215 @@
+name TBI
+spacewidth 3
+charset
+--- 11,9 0 00
+--- 3,1 0 040
+! 7,10 0 041
+" 7,10 0 042
+dq "
+# 8,10 0 043
+sh "
+$ 7,11,1 0 044
+Do "
+% 14,10 0 045
+& 10,10 0 046
+' 4,10 0 047
+aq "
+cq "
+oq "
+( 6,10,3 0 050
+) 6,10,3 0 051
+* 7,10 0 052
++ 9,7 0 053
+, 4,2,2 0 054
+\- 5,4 0 055
+. 3,2 0 056
+/ 6,10 0 057
+sl "
+0 7,10 0 060
+1 7,10 0 061
+2 7,10 0 062
+3 7,10 0 063
+4 7,10 0 064
+5 7,10 0 065
+6 7,10 0 066
+7 7,10 0 067
+8 7,10 0 070
+9 7,10 0 071
+: 5,7 0 072
+; 4,7,2 0 073
+< 8,6 0 074
+= 10,5 0 075
+> 8,6 0 076
+? 8,10 0 077
+@ 15,10,2 0 0100
+at "
+A 9,10 0 0101
+B 9,10 0 0102
+C 9,10 0 0103
+D 10,10 0 0104
+E 10,10 0 0105
+F 9,10 0 0106
+G 10,10 0 0107
+H 11,10 0 0110
+I 5,10 0 0111
+J 7,10,1 0 0112
+K 11,10 0 0113
+L 9,10 0 0114
+M 13,10 0 0115
+N 11,10 0 0116
+O 10,10 0 0117
+P 9,10 0 0120
+Q 10,10,3 0 0121
+R 10,10 0 0122
+S 8,10 0 0123
+T 10,10 0 0124
+U 10,10 0 0125
+V 10,10 0 0126
+W 13,10 0 0127
+X 9,10 0 0130
+Y 8,10 0 0131
+Z 8,10 0 0132
+[ 6,10,3 0 0133
+lB "
+\ 6,10 0 0134
+rs "
+] 5,10,3 0 0135
+rB "
+^ 8,10 0 0136
+a^ "
+ha "
+_ 7,0,2 0 0137
+` 6,10 0 0140
+ga "
+a 8,7 0 0141
+b 7,10 0 0142
+c 6,7 0 0143
+d 7,10 0 0144
+e 7,7 0 0145
+f 5,10,3 0 0146
+g 6,7,3 0 0147
+h 8,10 0 0150
+i 4,10 0 0151
+j 4,10,3 0 0152
+k 7,10 0 0153
+l 4,10 0 0154
+m 11,7 0 0155
+n 8,7 0 0156
+o 7,7 0 0157
+p 7,7,3 0 0160
+q 7,7,3 0 0161
+r 6,7 0 0162
+s 6,7 0 0163
+t 4,9 0 0164
+u 7,7 0 0165
+v 6,7 0 0166
+w 9,7 0 0167
+x 6,7 0 0170
+y 6,7,3 0 0171
+z 6,7 0 0172
+{ 7,10,3 0 0173
+lC "
+| 4,10 0 0174
+ba "
+} 7,10,3 0 0175
+rC "
+~ 10,5 0 0176
+a~ "
+ti "
+--- 3,1 0 0240
+r! 7,7,3 0 0241
+ct 7,8,1 0 0242
+Po 7,10 0 0243
+Cs 8,8 0 0244
+Ye 7,10 0 0245
+bb 4,10 0 0246
+sc 8,10,3 0 0247
+ad 6,9 0 0250
+co 12,10 0 0251
+Of 6,10 0 0252
+Fo 8,6 0 0253
+tno 9,5 0 0254
+- 5,4 0 0255
+hy "
+rg 12,10 0 0256
+a- 6,9 0 0257
+de 6,10 0 0260
+t+- 9,9 0 0261
+S2 4,10 0 0262
+S3 4,10 0 0263
+aa 6,10 0 0264
+mc 7,7,3 0 0265
+ps 8,10,3 0 0266
+pc 4,5 0 0267
+ac 5,0,3 0 0270
+S1 4,10 0 0271
+Om 6,10 0 0272
+Fc 8,6 0 0273
+14 10,10 0 0274
+12 10,10 0 0275
+34 10,10 0 0276
+r? 8,7,3 0 0277
+`A 9,13 0 0300
+'A 9,13 0 0301
+^A 9,13 0 0302
+~A 9,13 0 0303
+:A 9,13 0 0304
+oA 9,13 0 0305
+AE 14,10 0 0306
+,C 9,10,3 0 0307
+`E 10,13 0 0310
+'E 10,13 0 0311
+^E 10,13 0 0312
+:E 10,13 0 0313
+`I 5,13 0 0314
+'I 5,13 0 0315
+^I 5,13 0 0316
+:I 5,13 0 0317
+-D 10,10 0 0320
+~N 11,13 0 0321
+`O 10,13 0 0322
+'O 10,13 0 0323
+^O 10,13 0 0324
+~O 10,13 0 0325
+:O 10,13 0 0326
+tmu 9,7 0 0327
+/O 10,11,1 0 0330
+`U 10,13 0 0331
+'U 10,13 0 0332
+^U 10,13 0 0333
+:U 10,13 0 0334
+'Y 8,13 0 0335
+TP 9,10 0 0336
+ss 7,10,3 0 0337
+`a 8,10 0 0340
+'a 8,10 0 0341
+^a 8,11 0 0342
+~a 8,10 0 0343
+:a 8,10 0 0344
+oa 8,11 0 0345
+ae 11,7 0 0346
+,c 6,7,3 0 0347
+`e 7,10 0 0350
+'e 7,10 0 0351
+^e 7,11 0 0352
+:e 7,10 0 0353
+`i 4,10 0 0354
+'i 4,10 0 0355
+^i 4,11 0 0356
+:i 4,10 0 0357
+Sd 7,10 0 0360
+~n 8,10 0 0361
+`o 7,10 0 0362
+'o 7,10 0 0363
+^o 7,11 0 0364
+~o 7,10 0 0365
+:o 7,10 0 0366
+tdi 9,7 0 0367
+/o 7,8,1 0 0370
+`u 7,10 0 0371
+'u 7,10 0 0372
+^u 7,11 0 0373
+:u 7,10 0 0374
+'y 6,10,2 0 0375
+Tp 7,10,3 0 0376
+:y 6,10,2 0 0377
diff --git a/font/devX100/TI b/font/devX100/TI
new file mode 100644
index 0000000..a03f001
--- /dev/null
+++ b/font/devX100/TI
@@ -0,0 +1,215 @@
+name TI
+spacewidth 3
+charset
+--- 10,9 0 00
+--- 3,1 0 040
+! 5,10 0 041
+" 6,10 0 042
+dq "
+# 7,10 0 043
+sh "
+$ 7,11,1 0 044
+Do "
+% 12,10 0 045
+& 11,10 0 046
+' 3,10 0 047
+aq "
+cq "
+oq "
+( 5,10,3 0 050
+) 5,10,3 0 051
+* 7,10 0 052
++ 10,7 0 053
+, 4,2,1 0 054
+\- 5,4 0 055
+. 3,2 0 056
+/ 4,10 0 057
+sl "
+0 7,10 0 060
+1 7,10 0 061
+2 7,10 0 062
+3 7,10 0 063
+4 7,10 0 064
+5 7,10 0 065
+6 7,10 0 066
+7 7,10 0 067
+8 7,10 0 070
+9 7,10 0 071
+: 4,7 0 072
+; 4,7,1 0 073
+< 10,7,1 0 074
+= 10,5 0 075
+> 10,7,1 0 076
+? 7,10 0 077
+@ 13,10,3 0 0100
+at "
+A 9,10 0 0101
+B 8,10 0 0102
+C 9,10 0 0103
+D 10,10 0 0104
+E 9,10 0 0105
+F 9,10 0 0106
+G 10,10 0 0107
+H 10,10 0 0110
+I 5,10 0 0111
+J 6,10 0 0112
+K 10,10 0 0113
+L 8,10 0 0114
+M 12,10 0 0115
+N 11,10 0 0116
+O 10,10 0 0117
+P 9,10 0 0120
+Q 10,10,3 0 0121
+R 9,10 0 0122
+S 7,10 0 0123
+T 8,10 0 0124
+U 10,10 0 0125
+V 9,10 0 0126
+W 11,10 0 0127
+X 9,10 0 0130
+Y 8,10 0 0131
+Z 8,10 0 0132
+[ 6,10,3 0 0133
+lB "
+\ 4,10 0 0134
+rs "
+] 6,10,3 0 0135
+rB "
+^ 6,10 0 0136
+a^ "
+ha "
+_ 7,0,4 0 0137
+` 5,10 0 0140
+ga "
+a 7,7 0 0141
+b 7,10 0 0142
+c 6,7 0 0143
+d 7,10 0 0144
+e 7,7 0 0145
+f 5,10,3 0 0146
+g 6,7,3 0 0147
+h 7,10 0 0150
+i 4,10 0 0151
+j 4,10,3 0 0152
+k 7,10 0 0153
+l 4,10 0 0154
+m 10,7 0 0155
+n 7,7 0 0156
+o 7,7 0 0157
+p 7,7,3 0 0160
+q 7,7,3 0 0161
+r 5,7 0 0162
+s 6,7 0 0163
+t 5,9 0 0164
+u 7,7 0 0165
+v 6,7 0 0166
+w 9,7 0 0167
+x 7,7 0 0170
+y 7,7,3 0 0171
+z 6,7 0 0172
+{ 6,10,3 0 0173
+lC "
+| 4,10,3 0 0174
+ba "
+} 6,10,3 0 0175
+rC "
+~ 8,5 0 0176
+a~ "
+ti "
+--- 3,1 0 0240
+r! 6,7,3 0 0241
+ct 7,9,2 0 0242
+Po 7,10 0 0243
+Cs 7,8 0 0244
+Ye 7,10 0 0245
+bb 4,10,3 0 0246
+sc 7,11,2 0 0247
+ad 5,10 0 0250
+co 12,10 0 0251
+Of 5,10 0 0252
+Fo 7,6 0 0253
+tno 9,6 0 0254
+- 5,4 0 0255
+hy "
+rg 12,10 0 0256
+a- 5,10 0 0257
+de 6,10 0 0260
+t+- 10,9 0 0261
+S2 4,10 0 0262
+S3 4,10 0 0263
+aa 4,10 0 0264
+mc 7,7,3 0 0265
+ps 8,10,3 0 0266
+pc 4,4 0 0267
+ac 5,0,3 0 0270
+S1 4,10 0 0271
+Om 5,10 0 0272
+Fc 7,6 0 0273
+14 10,10 0 0274
+12 10,10 0 0275
+34 10,10 0 0276
+r? 7,7,3 0 0277
+`A 9,13 0 0300
+'A 9,13 0 0301
+^A 9,13 0 0302
+~A 9,13 0 0303
+:A 9,12 0 0304
+oA 9,13 0 0305
+AE 13,10 0 0306
+,C 9,10,3 0 0307
+`E 9,13 0 0310
+'E 9,13 0 0311
+^E 9,13 0 0312
+:E 9,12 0 0313
+`I 5,13 0 0314
+'I 5,13 0 0315
+^I 5,13 0 0316
+:I 5,12 0 0317
+-D 10,10 0 0320
+~N 11,13 0 0321
+`O 10,13 0 0322
+'O 10,13 0 0323
+^O 10,13 0 0324
+~O 10,13 0 0325
+:O 10,12 0 0326
+tmu 10,7 0 0327
+/O 10,11,1 0 0330
+`U 10,13 0 0331
+'U 10,13 0 0332
+^U 10,13 0 0333
+:U 10,12 0 0334
+'Y 8,13 0 0335
+TP 9,10 0 0336
+ss 7,10,3 0 0337
+`a 7,10 0 0340
+'a 7,10 0 0341
+^a 7,11 0 0342
+~a 7,10 0 0343
+:a 7,9 0 0344
+oa 7,10 0 0345
+ae 10,7 0 0346
+,c 6,7,3 0 0347
+`e 7,10 0 0350
+'e 7,10 0 0351
+^e 7,11 0 0352
+:e 7,9 0 0353
+`i 4,10 0 0354
+'i 4,10 0 0355
+^i 4,11 0 0356
+:i 4,9 0 0357
+Sd 7,10 0 0360
+~n 7,10 0 0361
+`o 7,10 0 0362
+'o 7,10 0 0363
+^o 7,11 0 0364
+~o 7,10 0 0365
+:o 7,9 0 0366
+tdi 10,7 0 0367
+/o 7,8,1 0 0370
+`u 7,10 0 0371
+'u 7,10 0 0372
+^u 7,11 0 0373
+:u 7,9 0 0374
+'y 7,10,3 0 0375
+Tp 7,10,3 0 0376
+:y 7,9,3 0 0377
diff --git a/font/devX100/TR b/font/devX100/TR
new file mode 100644
index 0000000..d21aa49
--- /dev/null
+++ b/font/devX100/TR
@@ -0,0 +1,215 @@
+name TR
+spacewidth 3
+charset
+--- 10,9 0 00
+--- 3,1 0 040
+! 5,10 0 041
+" 6,10 0 042
+dq "
+# 7,10 0 043
+sh "
+$ 7,11,1 0 044
+Do "
+% 12,10 0 045
+& 11,10 0 046
+' 3,10 0 047
+aq "
+cq "
+oq "
+( 5,10,3 0 050
+) 5,10,3 0 051
+* 7,10 0 052
++ 8,7 0 053
+, 4,1,2 0 054
+\- 4,4 0 055
+. 4,1 0 056
+/ 4,10,2 0 057
+sl "
+0 7,10 0 060
+1 7,10 0 061
+2 7,10 0 062
+3 7,10 0 063
+4 7,10 0 064
+5 7,10 0 065
+6 7,10 0 066
+7 7,10 0 067
+8 7,10 0 070
+9 7,10 0 071
+: 4,7 0 072
+; 4,7,2 0 073
+< 8,7 0 074
+= 8,5 0 075
+> 8,7 0 076
+? 6,10 0 077
+@ 13,10,2 0 0100
+at "
+A 11,10 0 0101
+B 9,10 0 0102
+C 10,10 0 0103
+D 10,10 0 0104
+E 9,10 0 0105
+F 8,10 0 0106
+G 11,10 0 0107
+H 10,10 0 0110
+I 5,10 0 0111
+J 6,10 0 0112
+K 10,10 0 0113
+L 9,10 0 0114
+M 13,10 0 0115
+N 11,10 0 0116
+O 10,10 0 0117
+P 8,10 0 0120
+Q 10,10,3 0 0121
+R 9,10 0 0122
+S 8,10 0 0123
+T 9,10 0 0124
+U 10,10 0 0125
+V 9,10 0 0126
+W 13,10 0 0127
+X 10,10 0 0130
+Y 9,10 0 0131
+Z 8,10 0 0132
+[ 5,10,3 0 0133
+lB "
+\ 4,10 0 0134
+rs "
+] 5,10,3 0 0135
+rB "
+^ 7,10 0 0136
+a^ "
+ha "
+_ 7,0,3 0 0137
+` 5,11 0 0140
+ga "
+a 7,7 0 0141
+b 7,10 0 0142
+c 7,7 0 0143
+d 7,10 0 0144
+e 7,7 0 0145
+f 4,10 0 0146
+g 7,7,3 0 0147
+h 7,10 0 0150
+i 3,10 0 0151
+j 4,10,3 0 0152
+k 7,10 0 0153
+l 3,10 0 0154
+m 11,7 0 0155
+n 7,7 0 0156
+o 7,7 0 0157
+p 7,7,3 0 0160
+q 7,7,3 0 0161
+r 5,7 0 0162
+s 6,7 0 0163
+t 4,8 0 0164
+u 7,7 0 0165
+v 7,7 0 0166
+w 11,7 0 0167
+x 7,7 0 0170
+y 7,7,3 0 0171
+z 6,7 0 0172
+{ 7,10,3 0 0173
+lC "
+| 3,10 0 0174
+ba "
+} 7,10,3 0 0175
+rC "
+~ 8,5 0 0176
+a~ "
+ti "
+--- 3,1 0 0240
+r! 5,7,3 0 0241
+ct 7,8,1 0 0242
+Po 8,10 0 0243
+Cs 7,8 0 0244
+Ye 7,10 0 0245
+bb 3,10 0 0246
+sc 7,10,3 0 0247
+ad 5,10 0 0250
+co 12,10 0 0251
+Of 4,10 0 0252
+Fo 7,6 0 0253
+tno 9,6 0 0254
+- 4,4 0 0255
+hy "
+rg 12,10 0 0256
+a- 4,9 0 0257
+de 6,10 0 0260
+t+- 8,7 0 0261
+S2 4,10 0 0262
+S3 4,10 0 0263
+aa 5,11 0 0264
+mc 7,7,3 0 0265
+ps 7,10,3 0 0266
+pc 4,5 0 0267
+ac 5,0,3 0 0270
+S1 4,10 0 0271
+Om 5,10 0 0272
+Fc 7,6 0 0273
+14 10,10 0 0274
+12 10,10 0 0275
+34 10,10 0 0276
+r? 6,7,3 0 0277
+`A 11,14 0 0300
+'A 11,14 0 0301
+^A 11,14 0 0302
+~A 11,14 0 0303
+:A 11,13 0 0304
+oA 11,14 0 0305
+AE 13,10 0 0306
+,C 10,10,3 0 0307
+`E 9,14 0 0310
+'E 9,14 0 0311
+^E 9,14 0 0312
+:E 9,13 0 0313
+`I 5,14 0 0314
+'I 5,14 0 0315
+^I 5,14 0 0316
+:I 5,13 0 0317
+-D 10,10 0 0320
+~N 11,14 0 0321
+`O 10,14 0 0322
+'O 10,14 0 0323
+^O 10,14 0 0324
+~O 10,14 0 0325
+:O 10,13 0 0326
+tmu 8,7 0 0327
+/O 10,11,1 0 0330
+`U 10,14 0 0331
+'U 10,14 0 0332
+^U 10,14 0 0333
+:U 10,13 0 0334
+'Y 9,14 0 0335
+TP 8,10 0 0336
+ss 7,10 0 0337
+`a 7,11 0 0340
+'a 7,11 0 0341
+^a 7,11 0 0342
+~a 7,11 0 0343
+:a 7,10 0 0344
+oa 7,11 0 0345
+ae 11,7 0 0346
+,c 7,7,3 0 0347
+`e 7,11 0 0350
+'e 7,11 0 0351
+^e 7,11 0 0352
+:e 7,10 0 0353
+`i 3,11 0 0354
+'i 3,11 0 0355
+^i 3,11 0 0356
+:i 3,10 0 0357
+Sd 7,10 0 0360
+~n 7,11 0 0361
+`o 7,11 0 0362
+'o 7,11 0 0363
+^o 7,11 0 0364
+~o 7,11 0 0365
+:o 7,10 0 0366
+tdi 8,7 0 0367
+/o 7,8,1 0 0370
+`u 7,11 0 0371
+'u 7,11 0 0372
+^u 7,11 0 0373
+:u 7,10 0 0374
+'y 7,11,3 0 0375
+Tp 7,10,3 0 0376
+:y 7,10,3 0 0377
diff --git a/font/devX100/devX100.am b/font/devX100/devX100.am
new file mode 100644
index 0000000..77b35d3
--- /dev/null
+++ b/font/devX100/devX100.am
@@ -0,0 +1,65 @@
+# Copyright (C) 2014-2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+DEVX100FONTS = \
+ font/devX100/DESC \
+ font/devX100/TR \
+ font/devX100/TI \
+ font/devX100/TB \
+ font/devX100/TBI \
+ font/devX100/CR \
+ font/devX100/CI \
+ font/devX100/CB \
+ font/devX100/CBI \
+ font/devX100/HR \
+ font/devX100/HI \
+ font/devX100/HB \
+ font/devX100/HBI \
+ font/devX100/NR \
+ font/devX100/NI \
+ font/devX100/NB \
+ font/devX100/NBI \
+ font/devX100/S
+
+if !WITHOUT_X11
+devX100_fontdir = $(fontdir)/devX100
+devX100_font_DATA = $(DEVX100FONTS)
+endif
+
+EXTRA_DIST += $(DEVX100FONTS)
+
+# This target generates font descriptions from core X11 font data
+# returned by a running X server; these are _not_ normally generated
+# during a build, but provided with the groff source distribution.
+#
+# This maintainer-mode target alters files in the source tree.
+maintainer-font-descriptions: devX100_font-descriptions
+devX100_fontsrcdir=$(top_srcdir)/font/devX100
+devX100_font-descriptions: $(xtotroff) $(xditview_srcdir)/DESC.in \
+ $(xditview_srcdir)/FontMap-X11
+ $(AM_V_GEN)$(MKDIR_P) $(devX100_fontsrcdir) \
+ && sed -e 's/res .*/res 100/' $(xditview_srcdir)/DESC.in \
+ >$(devX100_fontsrcdir)/DESC \
+ && $(xtotroff) -d $(devX100_fontsrcdir) -r 100 -s 10 \
+ $(xditview_srcdir)/FontMap-X11
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/font/devX75-12/CB b/font/devX75-12/CB
new file mode 100644
index 0000000..da4fa7c
--- /dev/null
+++ b/font/devX75-12/CB
@@ -0,0 +1,215 @@
+name CB
+spacewidth 7
+charset
+--- 7,7 0 00
+--- 7,1 0 040
+! 7,9 0 041
+" 7,8 0 042
+dq "
+# 7,8 0 043
+sh "
+$ 7,10,2 0 044
+Do "
+% 7,8 0 045
+& 7,8 0 046
+' 7,8 0 047
+aq "
+cq "
+oq "
+( 7,9,2 0 050
+) 7,9,2 0 051
+* 7,9 0 052
++ 7,6 0 053
+, 7,2,1 0 054
+\- 7,4 0 055
+. 7,2 0 056
+/ 7,8,2 0 057
+sl "
+0 7,9 0 060
+1 7,9 0 061
+2 7,9 0 062
+3 7,9 0 063
+4 7,9 0 064
+5 7,9 0 065
+6 7,9 0 066
+7 7,9 0 067
+8 7,9 0 070
+9 7,9 0 071
+: 7,6 0 072
+; 7,6,1 0 073
+< 7,7 0 074
+= 7,5 0 075
+> 7,7 0 076
+? 7,8 0 077
+@ 7,8 0 0100
+at "
+A 7,8 0 0101
+B 7,8 0 0102
+C 7,8 0 0103
+D 7,8 0 0104
+E 7,8 0 0105
+F 7,8 0 0106
+G 7,8 0 0107
+H 7,8 0 0110
+I 7,8 0 0111
+J 7,8 0 0112
+K 7,8 0 0113
+L 7,8 0 0114
+M 7,8 0 0115
+N 7,8 0 0116
+O 7,8 0 0117
+P 7,8 0 0120
+Q 7,8,2 0 0121
+R 7,8 0 0122
+S 7,8 0 0123
+T 7,8 0 0124
+U 7,8 0 0125
+V 7,8 0 0126
+W 7,8 0 0127
+X 7,8 0 0130
+Y 7,8 0 0131
+Z 7,8 0 0132
+[ 7,9,2 0 0133
+lB "
+\ 7,8,2 0 0134
+rs "
+] 7,9,2 0 0135
+rB "
+^ 7,8 0 0136
+a^ "
+ha "
+_ 7,0,2 0 0137
+` 7,9 0 0140
+ga "
+a 7,6 0 0141
+b 7,9 0 0142
+c 7,6 0 0143
+d 7,9 0 0144
+e 7,6 0 0145
+f 7,9 0 0146
+g 7,6,3 0 0147
+h 7,9 0 0150
+i 7,9 0 0151
+j 7,9,3 0 0152
+k 7,9 0 0153
+l 7,9 0 0154
+m 7,6 0 0155
+n 7,6 0 0156
+o 7,6 0 0157
+p 7,6,3 0 0160
+q 7,6,3 0 0161
+r 7,6 0 0162
+s 7,6 0 0163
+t 7,8 0 0164
+u 7,6 0 0165
+v 7,6 0 0166
+w 7,6 0 0167
+x 7,6 0 0170
+y 7,6,3 0 0171
+z 7,6 0 0172
+{ 7,9,2 0 0173
+lC "
+| 7,8,2 0 0174
+ba "
+} 7,9,2 0 0175
+rC "
+~ 7,5 0 0176
+a~ "
+ti "
+--- 7,1 0 0240
+r! 7,6,3 0 0241
+ct 7,8,1 0 0242
+Po 7,8 0 0243
+Cs 7,7 0 0244
+Ye 7,8 0 0245
+bb 7,8,2 0 0246
+sc 7,9,1 0 0247
+ad 7,9 0 0250
+co 7,8 0 0251
+Of 7,9 0 0252
+Fo 7,5 0 0253
+tno 7,5 0 0254
+- 7,4 0 0255
+hy "
+rg 7,8 0 0256
+a- 7,8 0 0257
+de 7,8 0 0260
+t+- 7,6 0 0261
+S2 7,8 0 0262
+S3 7,8 0 0263
+aa 7,9 0 0264
+mc 7,6,3 0 0265
+ps 7,9,1 0 0266
+pc 7,5 0 0267
+ac 7,0,3 0 0270
+S1 7,8 0 0271
+Om 7,9 0 0272
+Fc 7,5 0 0273
+14 7,9,1 0 0274
+12 7,9,1 0 0275
+34 7,9,1 0 0276
+r? 7,6,3 0 0277
+`A 7,11 0 0300
+'A 7,11 0 0301
+^A 7,11 0 0302
+~A 7,11 0 0303
+:A 7,10 0 0304
+oA 7,11 0 0305
+AE 7,8 0 0306
+,C 7,8,3 0 0307
+`E 7,11 0 0310
+'E 7,11 0 0311
+^E 7,11 0 0312
+:E 7,10 0 0313
+`I 7,11 0 0314
+'I 7,11 0 0315
+^I 7,11 0 0316
+:I 7,10 0 0317
+-D 7,8 0 0320
+~N 7,11 0 0321
+`O 7,11 0 0322
+'O 7,11 0 0323
+^O 7,11 0 0324
+~O 7,11 0 0325
+:O 7,10 0 0326
+tmu 7,6 0 0327
+/O 7,8 0 0330
+`U 7,11 0 0331
+'U 7,11 0 0332
+^U 7,11 0 0333
+:U 7,10 0 0334
+'Y 7,11 0 0335
+TP 7,8 0 0336
+ss 7,9 0 0337
+`a 7,9 0 0340
+'a 7,9 0 0341
+^a 7,9 0 0342
+~a 7,9 0 0343
+:a 7,8 0 0344
+oa 7,10 0 0345
+ae 7,6 0 0346
+,c 7,6,3 0 0347
+`e 7,9 0 0350
+'e 7,9 0 0351
+^e 7,9 0 0352
+:e 7,8 0 0353
+`i 7,9 0 0354
+'i 7,9 0 0355
+^i 7,9 0 0356
+:i 7,8 0 0357
+Sd 7,9 0 0360
+~n 7,9 0 0361
+`o 7,9 0 0362
+'o 7,9 0 0363
+^o 7,9 0 0364
+~o 7,9 0 0365
+:o 7,8 0 0366
+tdi 7,6 0 0367
+/o 7,7,1 0 0370
+`u 7,9 0 0371
+'u 7,9 0 0372
+^u 7,9 0 0373
+:u 7,8 0 0374
+'y 7,9,3 0 0375
+Tp 7,8,3 0 0376
+:y 7,8,3 0 0377
diff --git a/font/devX75-12/CBI b/font/devX75-12/CBI
new file mode 100644
index 0000000..8400e41
--- /dev/null
+++ b/font/devX75-12/CBI
@@ -0,0 +1,215 @@
+name CBI
+spacewidth 7
+charset
+--- 7,7 0 00
+--- 7,1 0 040
+! 7,9 0 041
+" 7,8 0 042
+dq "
+# 7,9 0 043
+sh "
+$ 7,10,2 0 044
+Do "
+% 7,8 0 045
+& 7,8 0 046
+' 7,8 0 047
+aq "
+cq "
+oq "
+( 7,9,2 0 050
+) 7,9,2 0 051
+* 7,8 0 052
++ 7,6 0 053
+, 7,2,1 0 054
+\- 7,4 0 055
+. 7,2 0 056
+/ 7,9,1 0 057
+sl "
+0 7,9 0 060
+1 7,9 0 061
+2 7,9 0 062
+3 7,9 0 063
+4 7,9 0 064
+5 7,9 0 065
+6 7,9 0 066
+7 7,9 0 067
+8 7,9 0 070
+9 7,9 0 071
+: 7,6 0 072
+; 7,6,1 0 073
+< 7,6 0 074
+= 7,5 0 075
+> 7,6 0 076
+? 7,8 0 077
+@ 7,8,1 0 0100
+at "
+A 7,8 0 0101
+B 7,8 0 0102
+C 7,8 0 0103
+D 7,8 0 0104
+E 7,8 0 0105
+F 7,8 0 0106
+G 7,8 0 0107
+H 7,8 0 0110
+I 7,8 0 0111
+J 7,8 0 0112
+K 7,8 0 0113
+L 7,8 0 0114
+M 7,8 0 0115
+N 7,8 0 0116
+O 7,8 0 0117
+P 7,8 0 0120
+Q 7,8,2 0 0121
+R 7,8 0 0122
+S 7,8 0 0123
+T 7,8 0 0124
+U 7,8 0 0125
+V 7,8 0 0126
+W 7,8 0 0127
+X 7,8 0 0130
+Y 7,8 0 0131
+Z 7,8 0 0132
+[ 7,9,2 0 0133
+lB "
+\ 7,9,1 0 0134
+rs "
+] 7,9,2 0 0135
+rB "
+^ 7,8 0 0136
+a^ "
+ha "
+_ 7,0,2 0 0137
+` 7,9 0 0140
+ga "
+a 7,6 0 0141
+b 7,9 0 0142
+c 7,6 0 0143
+d 7,9 0 0144
+e 7,6 0 0145
+f 7,9 0 0146
+g 7,6,3 0 0147
+h 7,9 0 0150
+i 7,9 0 0151
+j 7,9,3 0 0152
+k 7,9 0 0153
+l 7,9 0 0154
+m 7,6 0 0155
+n 7,6 0 0156
+o 7,6 0 0157
+p 7,6,3 0 0160
+q 7,6,3 0 0161
+r 7,6 0 0162
+s 7,6 0 0163
+t 7,8 0 0164
+u 7,6 0 0165
+v 7,6 0 0166
+w 7,6 0 0167
+x 7,6 0 0170
+y 7,6,3 0 0171
+z 7,6 0 0172
+{ 7,9,2 0 0173
+lC "
+| 7,8,1 0 0174
+ba "
+} 7,9,2 0 0175
+rC "
+~ 7,5 0 0176
+a~ "
+ti "
+--- 7,1 0 0240
+r! 7,6,2 0 0241
+ct 7,8,1 0 0242
+Po 7,8 0 0243
+Cs 7,7 0 0244
+Ye 7,8 0 0245
+bb 7,8,1 0 0246
+sc 7,9,1 0 0247
+ad 7,9 0 0250
+co 7,8 0 0251
+Of 7,8 0 0252
+Fo 7,5 0 0253
+tno 7,5 0 0254
+- 7,4 0 0255
+hy "
+rg 7,8 0 0256
+a- 7,8 0 0257
+de 7,8 0 0260
+t+- 7,6 0 0261
+S2 7,8 0 0262
+S3 7,8 0 0263
+aa 7,9 0 0264
+mc 7,6,3 0 0265
+ps 7,9,1 0 0266
+pc 7,5 0 0267
+ac 7,0,3 0 0270
+S1 7,8 0 0271
+Om 7,8 0 0272
+Fc 7,5 0 0273
+14 7,9 0 0274
+12 7,9 0 0275
+34 7,9 0 0276
+r? 7,6,2 0 0277
+`A 7,11 0 0300
+'A 7,11 0 0301
+^A 7,11 0 0302
+~A 7,11 0 0303
+:A 7,10 0 0304
+oA 7,11 0 0305
+AE 7,8 0 0306
+,C 7,8,3 0 0307
+`E 7,11 0 0310
+'E 7,11 0 0311
+^E 7,11 0 0312
+:E 7,10 0 0313
+`I 7,11 0 0314
+'I 7,11 0 0315
+^I 7,11 0 0316
+:I 7,10 0 0317
+-D 7,8 0 0320
+~N 7,11 0 0321
+`O 7,11 0 0322
+'O 7,11 0 0323
+^O 7,11 0 0324
+~O 7,11 0 0325
+:O 7,10 0 0326
+tmu 7,6 0 0327
+/O 7,8 0 0330
+`U 7,11 0 0331
+'U 7,11 0 0332
+^U 7,11 0 0333
+:U 7,10 0 0334
+'Y 7,11 0 0335
+TP 7,8 0 0336
+ss 7,8 0 0337
+`a 7,9 0 0340
+'a 7,9 0 0341
+^a 7,9 0 0342
+~a 7,9 0 0343
+:a 7,8 0 0344
+oa 7,10 0 0345
+ae 7,6 0 0346
+,c 7,6,3 0 0347
+`e 7,9 0 0350
+'e 7,9 0 0351
+^e 7,9 0 0352
+:e 7,8 0 0353
+`i 7,9 0 0354
+'i 7,9 0 0355
+^i 7,9 0 0356
+:i 7,8 0 0357
+Sd 7,10 0 0360
+~n 7,9 0 0361
+`o 7,9 0 0362
+'o 7,9 0 0363
+^o 7,9 0 0364
+~o 7,9 0 0365
+:o 7,8 0 0366
+tdi 7,6 0 0367
+/o 7,7,1 0 0370
+`u 7,9 0 0371
+'u 7,9 0 0372
+^u 7,9 0 0373
+:u 7,8 0 0374
+'y 7,9,3 0 0375
+Tp 7,8,3 0 0376
+:y 7,8,3 0 0377
diff --git a/font/devX75-12/CI b/font/devX75-12/CI
new file mode 100644
index 0000000..d2ee37e
--- /dev/null
+++ b/font/devX75-12/CI
@@ -0,0 +1,215 @@
+name CI
+spacewidth 7
+charset
+--- 7,7 0 00
+--- 7,1 0 040
+! 7,8 0 041
+" 7,8 0 042
+dq "
+# 7,8 0 043
+sh "
+$ 7,10,1 0 044
+Do "
+% 7,8 0 045
+& 7,8 0 046
+' 7,8 0 047
+aq "
+cq "
+oq "
+( 7,9,2 0 050
+) 7,9,2 0 051
+* 7,8 0 052
++ 7,6 0 053
+, 7,2,1 0 054
+\- 7,4 0 055
+. 7,1 0 056
+/ 7,8,1 0 057
+sl "
+0 7,9 0 060
+1 7,9 0 061
+2 7,9 0 062
+3 7,9 0 063
+4 7,9 0 064
+5 7,9 0 065
+6 7,9 0 066
+7 7,9 0 067
+8 7,9 0 070
+9 7,9 0 071
+: 7,5 0 072
+; 7,5,1 0 073
+< 7,7 0 074
+= 7,5 0 075
+> 7,7 0 076
+? 7,8 0 077
+@ 7,8 0 0100
+at "
+A 7,8 0 0101
+B 7,8 0 0102
+C 7,8 0 0103
+D 7,8 0 0104
+E 7,8 0 0105
+F 7,8 0 0106
+G 7,8 0 0107
+H 7,8 0 0110
+I 7,8 0 0111
+J 7,8 0 0112
+K 7,8 0 0113
+L 7,8 0 0114
+M 7,8 0 0115
+N 7,8 0 0116
+O 7,8 0 0117
+P 7,8 0 0120
+Q 7,8,2 0 0121
+R 7,8 0 0122
+S 7,8 0 0123
+T 7,8 0 0124
+U 7,8 0 0125
+V 7,8 0 0126
+W 7,8 0 0127
+X 7,8 0 0130
+Y 7,8 0 0131
+Z 7,8 0 0132
+[ 7,9,2 0 0133
+lB "
+\ 7,8,1 0 0134
+rs "
+] 7,9,2 0 0135
+rB "
+^ 7,8 0 0136
+a^ "
+ha "
+_ 7,0,3 0 0137
+` 7,9 0 0140
+ga "
+a 7,6 0 0141
+b 7,9 0 0142
+c 7,6 0 0143
+d 7,9 0 0144
+e 7,6 0 0145
+f 7,9 0 0146
+g 7,6,3 0 0147
+h 7,9 0 0150
+i 7,9 0 0151
+j 7,9,3 0 0152
+k 7,9 0 0153
+l 7,9 0 0154
+m 7,6 0 0155
+n 7,6 0 0156
+o 7,6 0 0157
+p 7,6,3 0 0160
+q 7,6,3 0 0161
+r 7,6 0 0162
+s 7,6 0 0163
+t 7,8 0 0164
+u 7,6 0 0165
+v 7,6 0 0166
+w 7,6 0 0167
+x 7,6 0 0170
+y 7,6,3 0 0171
+z 7,6 0 0172
+{ 7,9,2 0 0173
+lC "
+| 7,8,1 0 0174
+ba "
+} 7,9,2 0 0175
+rC "
+~ 7,4 0 0176
+a~ "
+ti "
+--- 7,1 0 0240
+r! 7,6,3 0 0241
+ct 7,8,1 0 0242
+Po 7,8 0 0243
+Cs 7,7 0 0244
+Ye 7,8 0 0245
+bb 7,8,2 0 0246
+sc 7,9,1 0 0247
+ad 7,8 0 0250
+co 7,8 0 0251
+Of 7,8 0 0252
+Fo 7,6 0 0253
+tno 7,5 0 0254
+- 7,4 0 0255
+hy "
+rg 7,8 0 0256
+a- 7,8 0 0257
+de 7,8 0 0260
+t+- 7,6 0 0261
+S2 7,8 0 0262
+S3 7,8 0 0263
+aa 7,9 0 0264
+mc 7,6,3 0 0265
+ps 7,9,1 0 0266
+pc 7,4 0 0267
+ac 7,0,3 0 0270
+S1 7,8 0 0271
+Om 7,8 0 0272
+Fc 7,6 0 0273
+14 7,9,1 0 0274
+12 7,9,1 0 0275
+34 7,9,1 0 0276
+r? 7,6,2 0 0277
+`A 7,11 0 0300
+'A 7,11 0 0301
+^A 7,11 0 0302
+~A 7,11 0 0303
+:A 7,10 0 0304
+oA 7,11 0 0305
+AE 7,8 0 0306
+,C 7,8,3 0 0307
+`E 7,11 0 0310
+'E 7,11 0 0311
+^E 7,11 0 0312
+:E 7,10 0 0313
+`I 7,11 0 0314
+'I 7,11 0 0315
+^I 7,11 0 0316
+:I 7,10 0 0317
+-D 7,8 0 0320
+~N 7,11 0 0321
+`O 7,11 0 0322
+'O 7,11 0 0323
+^O 7,11 0 0324
+~O 7,11 0 0325
+:O 7,10 0 0326
+tmu 7,6 0 0327
+/O 7,8 0 0330
+`U 7,11 0 0331
+'U 7,11 0 0332
+^U 7,11 0 0333
+:U 7,10 0 0334
+'Y 7,11 0 0335
+TP 7,8 0 0336
+ss 7,9 0 0337
+`a 7,9 0 0340
+'a 7,9 0 0341
+^a 7,9 0 0342
+~a 7,9 0 0343
+:a 7,8 0 0344
+oa 7,10 0 0345
+ae 7,6 0 0346
+,c 7,6,3 0 0347
+`e 7,9 0 0350
+'e 7,9 0 0351
+^e 7,9 0 0352
+:e 7,8 0 0353
+`i 7,9 0 0354
+'i 7,9 0 0355
+^i 7,9 0 0356
+:i 7,8 0 0357
+Sd 7,10 0 0360
+~n 7,9 0 0361
+`o 7,9 0 0362
+'o 7,9 0 0363
+^o 7,9 0 0364
+~o 7,9 0 0365
+:o 7,8 0 0366
+tdi 7,6 0 0367
+/o 7,7,1 0 0370
+`u 7,9 0 0371
+'u 7,9 0 0372
+^u 7,9 0 0373
+:u 7,8 0 0374
+'y 7,9,3 0 0375
+Tp 7,9,3 0 0376
+:y 7,8,3 0 0377
diff --git a/font/devX75-12/CR b/font/devX75-12/CR
new file mode 100644
index 0000000..f2c2e1c
--- /dev/null
+++ b/font/devX75-12/CR
@@ -0,0 +1,215 @@
+name CR
+spacewidth 7
+charset
+--- 7,7 0 00
+--- 7,1 0 040
+! 7,9 0 041
+" 7,8 0 042
+dq "
+# 7,8 0 043
+sh "
+$ 7,9,1 0 044
+Do "
+% 7,8 0 045
+& 7,8 0 046
+' 7,8 0 047
+aq "
+cq "
+oq "
+( 7,9,2 0 050
+) 7,9,2 0 051
+* 7,8 0 052
++ 7,6 0 053
+, 7,2,1 0 054
+\- 7,4 0 055
+. 7,1 0 056
+/ 7,9,1 0 057
+sl "
+0 7,9 0 060
+1 7,9 0 061
+2 7,9 0 062
+3 7,9 0 063
+4 7,9 0 064
+5 7,9 0 065
+6 7,9 0 066
+7 7,9 0 067
+8 7,9 0 070
+9 7,9 0 071
+: 7,5 0 072
+; 7,5,1 0 073
+< 7,7 0 074
+= 7,5 0 075
+> 7,7 0 076
+? 7,8 0 077
+@ 7,8 0 0100
+at "
+A 7,8 0 0101
+B 7,8 0 0102
+C 7,8 0 0103
+D 7,8 0 0104
+E 7,8 0 0105
+F 7,8 0 0106
+G 7,8 0 0107
+H 7,8 0 0110
+I 7,8 0 0111
+J 7,8 0 0112
+K 7,8 0 0113
+L 7,8 0 0114
+M 7,8 0 0115
+N 7,8 0 0116
+O 7,8 0 0117
+P 7,8 0 0120
+Q 7,8,1 0 0121
+R 7,8 0 0122
+S 7,8 0 0123
+T 7,8 0 0124
+U 7,8 0 0125
+V 7,8 0 0126
+W 7,8 0 0127
+X 7,8 0 0130
+Y 7,8 0 0131
+Z 7,8 0 0132
+[ 7,9,2 0 0133
+lB "
+\ 7,9,1 0 0134
+rs "
+] 7,9,2 0 0135
+rB "
+^ 7,8 0 0136
+a^ "
+ha "
+_ 7,0,3 0 0137
+` 7,9 0 0140
+ga "
+a 7,6 0 0141
+b 7,9 0 0142
+c 7,6 0 0143
+d 7,9 0 0144
+e 7,6 0 0145
+f 7,9 0 0146
+g 7,6,3 0 0147
+h 7,9 0 0150
+i 7,9 0 0151
+j 7,9,3 0 0152
+k 7,9 0 0153
+l 7,9 0 0154
+m 7,6 0 0155
+n 7,6 0 0156
+o 7,6 0 0157
+p 7,6,3 0 0160
+q 7,6,3 0 0161
+r 7,6 0 0162
+s 7,6 0 0163
+t 7,8 0 0164
+u 7,6 0 0165
+v 7,6 0 0166
+w 7,6 0 0167
+x 7,6 0 0170
+y 7,6,3 0 0171
+z 7,6 0 0172
+{ 7,8,2 0 0173
+lC "
+| 7,8,2 0 0174
+ba "
+} 7,8,2 0 0175
+rC "
+~ 7,5 0 0176
+a~ "
+ti "
+--- 7,1 0 0240
+r! 7,6,3 0 0241
+ct 7,8,1 0 0242
+Po 7,8 0 0243
+Cs 7,7 0 0244
+Ye 7,8 0 0245
+bb 7,8,2 0 0246
+sc 7,9,1 0 0247
+ad 7,8 0 0250
+co 7,8 0 0251
+Of 7,8 0 0252
+Fo 7,6 0 0253
+tno 7,5 0 0254
+- 7,4 0 0255
+hy "
+rg 7,8 0 0256
+a- 7,8 0 0257
+de 7,8 0 0260
+t+- 7,6 0 0261
+S2 7,8 0 0262
+S3 7,8 0 0263
+aa 7,9 0 0264
+mc 7,6,3 0 0265
+ps 7,9,1 0 0266
+pc 7,4 0 0267
+ac 7,0,3 0 0270
+S1 7,8 0 0271
+Om 7,8 0 0272
+Fc 7,6 0 0273
+14 7,9,1 0 0274
+12 7,9,1 0 0275
+34 7,9,1 0 0276
+r? 7,6,2 0 0277
+`A 7,11 0 0300
+'A 7,11 0 0301
+^A 7,11 0 0302
+~A 7,11 0 0303
+:A 7,10 0 0304
+oA 7,11 0 0305
+AE 7,8 0 0306
+,C 7,8,3 0 0307
+`E 7,11 0 0310
+'E 7,11 0 0311
+^E 7,11 0 0312
+:E 7,10 0 0313
+`I 7,11 0 0314
+'I 7,11 0 0315
+^I 7,11 0 0316
+:I 7,10 0 0317
+-D 7,8 0 0320
+~N 7,11 0 0321
+`O 7,11 0 0322
+'O 7,11 0 0323
+^O 7,11 0 0324
+~O 7,11 0 0325
+:O 7,10 0 0326
+tmu 7,6 0 0327
+/O 7,9,1 0 0330
+`U 7,11 0 0331
+'U 7,11 0 0332
+^U 7,11 0 0333
+:U 7,10 0 0334
+'Y 7,11 0 0335
+TP 7,8 0 0336
+ss 7,9 0 0337
+`a 7,9 0 0340
+'a 7,9 0 0341
+^a 7,9 0 0342
+~a 7,9 0 0343
+:a 7,8 0 0344
+oa 7,9 0 0345
+ae 7,6 0 0346
+,c 7,6,3 0 0347
+`e 7,9 0 0350
+'e 7,9 0 0351
+^e 7,9 0 0352
+:e 7,8 0 0353
+`i 7,9 0 0354
+'i 7,9 0 0355
+^i 7,9 0 0356
+:i 7,8 0 0357
+Sd 7,10 0 0360
+~n 7,9 0 0361
+`o 7,9 0 0362
+'o 7,9 0 0363
+^o 7,9 0 0364
+~o 7,9 0 0365
+:o 7,8 0 0366
+tdi 7,6 0 0367
+/o 7,7,1 0 0370
+`u 7,9 0 0371
+'u 7,9 0 0372
+^u 7,9 0 0373
+:u 7,8 0 0374
+'y 7,9,3 0 0375
+Tp 7,9,3 0 0376
+:y 7,8,3 0 0377
diff --git a/font/devX75-12/DESC b/font/devX75-12/DESC
new file mode 100644
index 0000000..4793e59
--- /dev/null
+++ b/font/devX75-12/DESC
@@ -0,0 +1,9 @@
+styles R I B BI
+fonts 6 0 0 0 0 0 S
+sizes 8 10 12 14 18 24 0
+res 75
+X11
+hor 1
+vert 1
+unitwidth 12
+postpro gxditview
diff --git a/font/devX75-12/HB b/font/devX75-12/HB
new file mode 100644
index 0000000..28b0495
--- /dev/null
+++ b/font/devX75-12/HB
@@ -0,0 +1,215 @@
+name HB
+spacewidth 4
+charset
+--- 9,9 0 00
+--- 4,1 0 040
+! 4,9 0 041
+" 5,9 0 042
+dq "
+# 8,8 0 043
+sh "
+$ 7,9,2 0 044
+Do "
+% 12,9 0 045
+& 9,9 0 046
+' 3,9 0 047
+aq "
+cq "
+oq "
+( 6,9,3 0 050
+) 6,9,3 0 051
+* 6,9 0 052
++ 7,6 0 053
+, 4,2,2 0 054
+\- 5,4 0 055
+. 4,2 0 056
+/ 4,9 0 057
+sl "
+0 7,9 0 060
+1 7,9 0 061
+2 7,9 0 062
+3 7,9 0 063
+4 7,9 0 064
+5 7,9 0 065
+6 7,9 0 066
+7 7,9 0 067
+8 7,9 0 070
+9 7,9 0 071
+: 4,7 0 072
+; 4,7,2 0 073
+< 7,6 0 074
+= 7,5 0 075
+> 7,6 0 076
+? 8,9 0 077
+@ 12,9,1 0 0100
+at "
+A 8,9 0 0101
+B 9,9 0 0102
+C 8,9 0 0103
+D 9,9 0 0104
+E 8,9 0 0105
+F 7,9 0 0106
+G 10,9 0 0107
+H 9,9 0 0110
+I 4,9 0 0111
+J 7,9 0 0112
+K 9,9 0 0113
+L 7,9 0 0114
+M 11,9 0 0115
+N 9,9 0 0116
+O 10,9 0 0117
+P 8,9 0 0120
+Q 10,9 0 0121
+R 9,9 0 0122
+S 9,9 0 0123
+T 8,9 0 0124
+U 9,9 0 0125
+V 8,9 0 0126
+W 10,9 0 0127
+X 8,9 0 0130
+Y 8,9 0 0131
+Z 7,9 0 0132
+[ 4,9,3 0 0133
+lB "
+\ 4,9 0 0134
+rs "
+] 4,9,3 0 0135
+rB "
+^ 7,9 0 0136
+a^ "
+ha "
+_ 7,0,3 0 0137
+` 4,10 0 0140
+ga "
+a 7,7 0 0141
+b 7,9 0 0142
+c 7,7 0 0143
+d 7,9 0 0144
+e 7,7 0 0145
+f 5,9 0 0146
+g 7,7,3 0 0147
+h 7,9 0 0150
+i 3,9 0 0151
+j 3,9,3 0 0152
+k 7,9 0 0153
+l 3,9 0 0154
+m 11,7 0 0155
+n 7,7 0 0156
+o 7,7 0 0157
+p 7,7,3 0 0160
+q 7,7,3 0 0161
+r 5,7 0 0162
+s 7,7 0 0163
+t 5,9 0 0164
+u 7,7 0 0165
+v 8,7 0 0166
+w 11,7 0 0167
+x 7,7 0 0170
+y 8,7,3 0 0171
+z 6,7 0 0172
+{ 5,9,3 0 0173
+lC "
+| 4,9,3 0 0174
+ba "
+} 5,9,3 0 0175
+rC "
+~ 7,5 0 0176
+a~ "
+ti "
+--- 4,1 0 0240
+r! 4,7,3 0 0241
+ct 7,8,1 0 0242
+Po 7,9 0 0243
+Cs 7,7 0 0244
+Ye 7,9 0 0245
+bb 4,9,2 0 0246
+sc 7,9,3 0 0247
+ad 5,9 0 0250
+co 11,9 0 0251
+Of 6,9 0 0252
+Fo 8,6 0 0253
+tno 8,6 0 0254
+- 5,4 0 0255
+hy "
+rg 11,9 0 0256
+a- 4,9 0 0257
+de 5,8 0 0260
+t+- 7,7 0 0261
+S2 4,9 0 0262
+S3 4,9 0 0263
+aa 4,10 0 0264
+mc 7,7,3 0 0265
+ps 7,9,3 0 0266
+pc 4,5 0 0267
+ac 4,1,3 0 0270
+S1 4,9 0 0271
+Om 6,9 0 0272
+Fc 8,6 0 0273
+14 10,9 0 0274
+12 10,9 0 0275
+34 10,9 0 0276
+r? 8,7,3 0 0277
+`A 8,12 0 0300
+'A 8,12 0 0301
+^A 8,12 0 0302
+~A 8,12 0 0303
+:A 8,11 0 0304
+oA 8,12 0 0305
+AE 13,9 0 0306
+,C 8,9,3 0 0307
+`E 8,12 0 0310
+'E 8,12 0 0311
+^E 8,12 0 0312
+:E 8,11 0 0313
+`I 4,12 0 0314
+'I 4,12 0 0315
+^I 4,12 0 0316
+:I 4,11 0 0317
+-D 9,9 0 0320
+~N 9,12 0 0321
+`O 10,12 0 0322
+'O 10,12 0 0323
+^O 10,12 0 0324
+~O 10,12 0 0325
+:O 10,11 0 0326
+tmu 7,6 0 0327
+/O 10,9,1 0 0330
+`U 9,12 0 0331
+'U 9,12 0 0332
+^U 9,12 0 0333
+:U 9,11 0 0334
+'Y 8,12 0 0335
+TP 8,9 0 0336
+ss 8,9 0 0337
+`a 7,10 0 0340
+'a 7,10 0 0341
+^a 7,10 0 0342
+~a 7,10 0 0343
+:a 7,9 0 0344
+oa 7,11 0 0345
+ae 11,7 0 0346
+,c 7,7,3 0 0347
+`e 7,10 0 0350
+'e 7,10 0 0351
+^e 7,10 0 0352
+:e 7,9 0 0353
+`i 3,10 0 0354
+'i 3,10 0 0355
+^i 3,10 0 0356
+:i 3,9 0 0357
+Sd 7,10 0 0360
+~n 7,10 0 0361
+`o 7,10 0 0362
+'o 7,10 0 0363
+^o 7,10 0 0364
+~o 7,10 0 0365
+:o 7,9 0 0366
+tdi 7,6 0 0367
+/o 7,7 0 0370
+`u 7,10 0 0371
+'u 7,10 0 0372
+^u 7,10 0 0373
+:u 7,9 0 0374
+'y 8,10,3 0 0375
+Tp 7,9,3 0 0376
+:y 8,9,3 0 0377
diff --git a/font/devX75-12/HBI b/font/devX75-12/HBI
new file mode 100644
index 0000000..2725a9e
--- /dev/null
+++ b/font/devX75-12/HBI
@@ -0,0 +1,215 @@
+name HBI
+spacewidth 4
+charset
+--- 10,9 0 00
+--- 4,1 0 040
+! 4,9 0 041
+" 6,9 0 042
+dq "
+# 7,8 0 043
+sh "
+$ 7,9,1 0 044
+Do "
+% 13,9 0 045
+& 9,9 0 046
+' 4,9 0 047
+aq "
+cq "
+oq "
+( 5,9,3 0 050
+) 5,9,3 0 051
+* 6,9 0 052
++ 8,6 0 053
+, 3,2,2 0 054
+\- 5,4 0 055
+. 3,2 0 056
+/ 5,9 0 057
+sl "
+0 7,9 0 060
+1 7,9 0 061
+2 7,9 0 062
+3 7,9 0 063
+4 7,9 0 064
+5 7,9 0 065
+6 7,9 0 066
+7 7,9 0 067
+8 7,9 0 070
+9 7,9 0 071
+: 4,7 0 072
+; 4,7,2 0 073
+< 7,6 0 074
+= 7,5 0 075
+> 7,6 0 076
+? 8,9 0 077
+@ 11,9,1 0 0100
+at "
+A 8,9 0 0101
+B 9,9 0 0102
+C 8,9 0 0103
+D 9,9 0 0104
+E 8,9 0 0105
+F 7,9 0 0106
+G 9,9 0 0107
+H 10,9 0 0110
+I 5,9 0 0111
+J 7,9 0 0112
+K 9,9 0 0113
+L 7,9 0 0114
+M 12,9 0 0115
+N 10,9 0 0116
+O 9,9 0 0117
+P 8,9 0 0120
+Q 9,9 0 0121
+R 9,9 0 0122
+S 8,9 0 0123
+T 7,9 0 0124
+U 8,9 0 0125
+V 9,9 0 0126
+W 10,9 0 0127
+X 9,9 0 0130
+Y 7,9 0 0131
+Z 7,9 0 0132
+[ 4,9,3 0 0133
+lB "
+\ 5,9 0 0134
+rs "
+] 4,9,3 0 0135
+rB "
+^ 6,9 0 0136
+a^ "
+ha "
+_ 7,0,3 0 0137
+` 4,9 0 0140
+ga "
+a 6,7 0 0141
+b 7,9 0 0142
+c 7,7 0 0143
+d 7,9 0 0144
+e 7,7 0 0145
+f 5,9 0 0146
+g 7,7,3 0 0147
+h 7,9 0 0150
+i 3,9 0 0151
+j 3,9,3 0 0152
+k 7,9 0 0153
+l 3,9 0 0154
+m 11,7 0 0155
+n 7,7 0 0156
+o 7,7 0 0157
+p 7,7,3 0 0160
+q 7,7,3 0 0161
+r 5,7 0 0162
+s 7,7 0 0163
+t 5,9 0 0164
+u 7,7 0 0165
+v 7,7 0 0166
+w 10,7 0 0167
+x 7,7 0 0170
+y 7,7,3 0 0171
+z 6,7 0 0172
+{ 5,9,3 0 0173
+lC "
+| 4,9,3 0 0174
+ba "
+} 5,9,3 0 0175
+rC "
+~ 7,5 0 0176
+a~ "
+ti "
+--- 4,1 0 0240
+r! 4,7,3 0 0241
+ct 7,8,1 0 0242
+Po 7,9 0 0243
+Cs 7,7 0 0244
+Ye 7,9 0 0245
+bb 4,9,2 0 0246
+sc 7,9,3 0 0247
+ad 5,9 0 0250
+co 11,9 0 0251
+Of 6,9 0 0252
+Fo 10,6 0 0253
+tno 8,5 0 0254
+- 5,4 0 0255
+hy "
+rg 11,9 0 0256
+a- 4,9 0 0257
+de 5,8 0 0260
+t+- 8,7 0 0261
+S2 4,9 0 0262
+S3 4,9 0 0263
+aa 4,9 0 0264
+mc 7,7,3 0 0265
+ps 7,9,3 0 0266
+pc 4,5 0 0267
+ac 4,1,3 0 0270
+S1 4,9 0 0271
+Om 6,9 0 0272
+Fc 10,6 0 0273
+14 10,9 0 0274
+12 10,9 0 0275
+34 10,9 0 0276
+r? 7,7,2 0 0277
+`A 8,12 0 0300
+'A 8,12 0 0301
+^A 8,12 0 0302
+~A 8,12 0 0303
+:A 8,11 0 0304
+oA 8,12 0 0305
+AE 11,9 0 0306
+,C 8,9,3 0 0307
+`E 8,12 0 0310
+'E 8,12 0 0311
+^E 8,12 0 0312
+:E 8,11 0 0313
+`I 5,12 0 0314
+'I 5,12 0 0315
+^I 5,12 0 0316
+:I 5,11 0 0317
+-D 9,9 0 0320
+~N 10,12 0 0321
+`O 9,12 0 0322
+'O 9,12 0 0323
+^O 9,12 0 0324
+~O 9,12 0 0325
+:O 9,11 0 0326
+tmu 8,6 0 0327
+/O 9,9 0 0330
+`U 8,12 0 0331
+'U 8,12 0 0332
+^U 8,12 0 0333
+:U 8,11 0 0334
+'Y 7,12 0 0335
+TP 8,9 0 0336
+ss 7,9 0 0337
+`a 6,10 0 0340
+'a 6,10 0 0341
+^a 6,10 0 0342
+~a 6,10 0 0343
+:a 6,9 0 0344
+oa 6,10 0 0345
+ae 10,7 0 0346
+,c 7,7,3 0 0347
+`e 7,10 0 0350
+'e 7,10 0 0351
+^e 7,10 0 0352
+:e 7,9 0 0353
+`i 3,10 0 0354
+'i 3,10 0 0355
+^i 3,10 0 0356
+:i 3,9 0 0357
+Sd 7,10 0 0360
+~n 7,10 0 0361
+`o 7,10 0 0362
+'o 7,10 0 0363
+^o 7,10 0 0364
+~o 7,10 0 0365
+:o 7,9 0 0366
+tdi 8,6 0 0367
+/o 7,8 0 0370
+`u 7,10 0 0371
+'u 7,10 0 0372
+^u 7,10 0 0373
+:u 7,9 0 0374
+'y 7,10,3 0 0375
+Tp 7,9,3 0 0376
+:y 7,9,3 0 0377
diff --git a/font/devX75-12/HI b/font/devX75-12/HI
new file mode 100644
index 0000000..48577c4
--- /dev/null
+++ b/font/devX75-12/HI
@@ -0,0 +1,215 @@
+name HI
+spacewidth 4
+charset
+--- 10,9 0 00
+--- 4,1 0 040
+! 3,9 0 041
+" 5,9 0 042
+dq "
+# 7,8 0 043
+sh "
+$ 7,9,1 0 044
+Do "
+% 11,9 0 045
+& 9,9 0 046
+' 3,9 0 047
+aq "
+cq "
+oq "
+( 4,9,3 0 050
+) 4,9,3 0 051
+* 5,9 0 052
++ 7,6 0 053
+, 3,1,2 0 054
+\- 5,4 0 055
+. 3,1 0 056
+/ 4,9 0 057
+sl "
+0 7,9 0 060
+1 7,9 0 061
+2 7,9 0 062
+3 7,9 0 063
+4 7,9 0 064
+5 7,9 0 065
+6 7,9 0 066
+7 7,9 0 067
+8 7,9 0 070
+9 7,9 0 071
+: 3,6 0 072
+; 3,6,2 0 073
+< 8,6 0 074
+= 7,5 0 075
+> 8,6 0 076
+? 7,9 0 077
+@ 12,9,1 0 0100
+at "
+A 9,9 0 0101
+B 8,9 0 0102
+C 8,9 0 0103
+D 9,9 0 0104
+E 8,9 0 0105
+F 8,9 0 0106
+G 8,9 0 0107
+H 10,9 0 0110
+I 4,9 0 0111
+J 8,9 0 0112
+K 8,9 0 0113
+L 7,9 0 0114
+M 12,9 0 0115
+N 10,9 0 0116
+O 9,9 0 0117
+P 8,9 0 0120
+Q 9,9 0 0121
+R 8,9 0 0122
+S 8,9 0 0123
+T 7,9 0 0124
+U 9,9 0 0125
+V 8,9 0 0126
+W 11,9 0 0127
+X 9,9 0 0130
+Y 8,9 0 0131
+Z 9,9 0 0132
+[ 4,9,3 0 0133
+lB "
+\ 4,9 0 0134
+rs "
+] 4,9,3 0 0135
+rB "
+^ 6,8 0 0136
+a^ "
+ha "
+_ 7,0,3 0 0137
+` 2,10 0 0140
+ga "
+a 7,7 0 0141
+b 7,9 0 0142
+c 6,7 0 0143
+d 7,9 0 0144
+e 6,7 0 0145
+f 3,9 0 0146
+g 7,7,3 0 0147
+h 7,9 0 0150
+i 3,9 0 0151
+j 3,9,3 0 0152
+k 6,9 0 0153
+l 3,9 0 0154
+m 9,7 0 0155
+n 7,7 0 0156
+o 7,7 0 0157
+p 7,7,3 0 0160
+q 7,7,3 0 0161
+r 4,7 0 0162
+s 6,7 0 0163
+t 4,9 0 0164
+u 7,7 0 0165
+v 6,7 0 0166
+w 9,7 0 0167
+x 6,7 0 0170
+y 6,7,3 0 0171
+z 6,7 0 0172
+{ 5,9,3 0 0173
+lC "
+| 4,9,3 0 0174
+ba "
+} 5,9,3 0 0175
+rC "
+~ 7,5 0 0176
+a~ "
+ti "
+--- 4,1 0 0240
+r! 4,6,3 0 0241
+ct 8,8,1 0 0242
+Po 8,9 0 0243
+Cs 7,7 0 0244
+Ye 7,9 0 0245
+bb 4,9,2 0 0246
+sc 7,9,3 0 0247
+ad 3,9 0 0250
+co 11,9 0 0251
+Of 5,9 0 0252
+Fo 7,6 0 0253
+tno 8,6 0 0254
+- 5,4 0 0255
+hy "
+rg 11,9 0 0256
+a- 4,9 0 0257
+de 5,8 0 0260
+t+- 7,7 0 0261
+S2 4,8 0 0262
+S3 4,8 0 0263
+aa 2,10 0 0264
+mc 7,7,3 0 0265
+ps 8,9,3 0 0266
+pc 3,4 0 0267
+ac 3,1,3 0 0270
+S1 4,8 0 0271
+Om 5,9 0 0272
+Fc 7,6 0 0273
+14 10,9 0 0274
+12 10,9 0 0275
+34 10,9 0 0276
+r? 7,6,3 0 0277
+`A 9,12 0 0300
+'A 9,12 0 0301
+^A 9,12 0 0302
+~A 9,12 0 0303
+:A 9,11 0 0304
+oA 9,12 0 0305
+AE 11,9 0 0306
+,C 8,9,3 0 0307
+`E 8,12 0 0310
+'E 8,12 0 0311
+^E 8,12 0 0312
+:E 8,11 0 0313
+`I 4,12 0 0314
+'I 4,12 0 0315
+^I 4,12 0 0316
+:I 4,11 0 0317
+-D 9,9 0 0320
+~N 10,12 0 0321
+`O 9,12 0 0322
+'O 9,12 0 0323
+^O 9,12 0 0324
+~O 9,12 0 0325
+:O 9,11 0 0326
+tmu 7,6 0 0327
+/O 10,9 0 0330
+`U 9,12 0 0331
+'U 9,12 0 0332
+^U 9,12 0 0333
+:U 9,11 0 0334
+'Y 8,12 0 0335
+TP 8,9 0 0336
+ss 7,9 0 0337
+`a 7,10 0 0340
+'a 7,10 0 0341
+^a 7,10 0 0342
+~a 7,10 0 0343
+:a 7,9 0 0344
+oa 7,10 0 0345
+ae 11,7 0 0346
+,c 6,7,3 0 0347
+`e 6,10 0 0350
+'e 6,10 0 0351
+^e 6,10 0 0352
+:e 6,9 0 0353
+`i 3,10 0 0354
+'i 3,10 0 0355
+^i 3,10 0 0356
+:i 3,9 0 0357
+Sd 7,11 0 0360
+~n 7,10 0 0361
+`o 7,10 0 0362
+'o 7,10 0 0363
+^o 7,10 0 0364
+~o 7,10 0 0365
+:o 7,9 0 0366
+tdi 7,6 0 0367
+/o 7,7 0 0370
+`u 7,10 0 0371
+'u 7,10 0 0372
+^u 7,10 0 0373
+:u 7,9 0 0374
+'y 6,10,3 0 0375
+Tp 7,9,3 0 0376
+:y 7,9,3 0 0377
diff --git a/font/devX75-12/HR b/font/devX75-12/HR
new file mode 100644
index 0000000..80c6761
--- /dev/null
+++ b/font/devX75-12/HR
@@ -0,0 +1,215 @@
+name HR
+spacewidth 4
+charset
+--- 9,9 0 00
+--- 4,1 0 040
+! 3,9 0 041
+" 5,9 0 042
+dq "
+# 7,8 0 043
+sh "
+$ 7,9,1 0 044
+Do "
+% 11,9 0 045
+& 9,9 0 046
+' 3,9 0 047
+aq "
+cq "
+oq "
+( 4,9,3 0 050
+) 4,9,3 0 051
+* 5,9 0 052
++ 7,6 0 053
+, 4,1,2 0 054
+\- 5,4 0 055
+. 3,1 0 056
+/ 4,9 0 057
+sl "
+0 7,9 0 060
+1 7,9 0 061
+2 7,9 0 062
+3 7,9 0 063
+4 7,9 0 064
+5 7,9 0 065
+6 7,9 0 066
+7 7,9 0 067
+8 7,9 0 070
+9 7,9 0 071
+: 3,6 0 072
+; 3,6,2 0 073
+< 7,6 0 074
+= 7,5 0 075
+> 7,6 0 076
+? 7,9 0 077
+@ 12,9,1 0 0100
+at "
+A 9,9 0 0101
+B 8,9 0 0102
+C 9,9 0 0103
+D 9,9 0 0104
+E 8,9 0 0105
+F 8,9 0 0106
+G 9,9 0 0107
+H 9,9 0 0110
+I 3,9 0 0111
+J 7,9 0 0112
+K 8,9 0 0113
+L 7,9 0 0114
+M 11,9 0 0115
+N 9,9 0 0116
+O 10,9 0 0117
+P 8,9 0 0120
+Q 10,9 0 0121
+R 8,9 0 0122
+S 8,9 0 0123
+T 7,9 0 0124
+U 8,9 0 0125
+V 9,9 0 0126
+W 11,9 0 0127
+X 9,9 0 0130
+Y 9,9 0 0131
+Z 9,9 0 0132
+[ 3,9,3 0 0133
+lB "
+\ 4,9 0 0134
+rs "
+] 3,9,3 0 0135
+rB "
+^ 6,8 0 0136
+a^ "
+ha "
+_ 7,0,2 0 0137
+` 2,10 0 0140
+ga "
+a 7,7 0 0141
+b 7,9 0 0142
+c 7,7 0 0143
+d 7,9 0 0144
+e 7,7 0 0145
+f 3,9 0 0146
+g 7,7,3 0 0147
+h 7,9 0 0150
+i 3,9 0 0151
+j 3,9,3 0 0152
+k 6,9 0 0153
+l 3,9 0 0154
+m 9,7 0 0155
+n 7,7 0 0156
+o 7,7 0 0157
+p 7,7,3 0 0160
+q 7,7,3 0 0161
+r 4,7 0 0162
+s 6,7 0 0163
+t 3,9 0 0164
+u 7,7 0 0165
+v 7,7 0 0166
+w 9,7 0 0167
+x 6,7 0 0170
+y 7,7,3 0 0171
+z 6,7 0 0172
+{ 4,9,3 0 0173
+lC "
+| 3,9,3 0 0174
+ba "
+} 4,9,3 0 0175
+rC "
+~ 7,5 0 0176
+a~ "
+ti "
+--- 4,1 0 0240
+r! 3,7,3 0 0241
+ct 7,8,1 0 0242
+Po 7,9 0 0243
+Cs 7,7 0 0244
+Ye 7,9 0 0245
+bb 3,9,2 0 0246
+sc 6,9,3 0 0247
+ad 3,9 0 0250
+co 11,9 0 0251
+Of 5,9 0 0252
+Fo 7,6 0 0253
+tno 8,6 0 0254
+- 5,4 0 0255
+hy "
+rg 11,9 0 0256
+a- 4,9 0 0257
+de 5,8 0 0260
+t+- 7,7 0 0261
+S2 4,8 0 0262
+S3 4,8 0 0263
+aa 2,10 0 0264
+mc 7,7,3 0 0265
+ps 7,9,3 0 0266
+pc 3,4 0 0267
+ac 3,1,3 0 0270
+S1 4,8 0 0271
+Om 5,9 0 0272
+Fc 7,6 0 0273
+14 10,9 0 0274
+12 10,9 0 0275
+34 10,9 0 0276
+r? 7,6,3 0 0277
+`A 9,12 0 0300
+'A 9,12 0 0301
+^A 9,12 0 0302
+~A 9,12 0 0303
+:A 9,11 0 0304
+oA 9,12 0 0305
+AE 11,9 0 0306
+,C 9,9,3 0 0307
+`E 8,12 0 0310
+'E 8,12 0 0311
+^E 8,12 0 0312
+:E 8,11 0 0313
+`I 3,12 0 0314
+'I 3,12 0 0315
+^I 3,12 0 0316
+:I 3,11 0 0317
+-D 9,9 0 0320
+~N 9,12 0 0321
+`O 10,12 0 0322
+'O 10,12 0 0323
+^O 10,12 0 0324
+~O 10,12 0 0325
+:O 10,11 0 0326
+tmu 7,6 0 0327
+/O 10,10,1 0 0330
+`U 8,12 0 0331
+'U 8,12 0 0332
+^U 8,12 0 0333
+:U 8,11 0 0334
+'Y 9,12 0 0335
+TP 8,9 0 0336
+ss 7,9 0 0337
+`a 7,10 0 0340
+'a 7,10 0 0341
+^a 7,10 0 0342
+~a 7,10 0 0343
+:a 7,9 0 0344
+oa 7,10 0 0345
+ae 11,7 0 0346
+,c 7,7,3 0 0347
+`e 7,10 0 0350
+'e 7,10 0 0351
+^e 7,10 0 0352
+:e 7,9 0 0353
+`i 3,10 0 0354
+'i 3,10 0 0355
+^i 3,10 0 0356
+:i 3,9 0 0357
+Sd 7,10 0 0360
+~n 7,10 0 0361
+`o 7,10 0 0362
+'o 7,10 0 0363
+^o 7,10 0 0364
+~o 7,10 0 0365
+:o 7,9 0 0366
+tdi 7,6 0 0367
+/o 7,7 0 0370
+`u 7,10 0 0371
+'u 7,10 0 0372
+^u 7,10 0 0373
+:u 7,9 0 0374
+'y 7,10,3 0 0375
+Tp 7,9,3 0 0376
+:y 7,9,3 0 0377
diff --git a/font/devX75-12/NB b/font/devX75-12/NB
new file mode 100644
index 0000000..95eba49
--- /dev/null
+++ b/font/devX75-12/NB
@@ -0,0 +1,215 @@
+name NB
+spacewidth 4
+charset
+--- 11,9 0 00
+--- 4,1 0 040
+! 4,9 0 041
+" 6,9 0 042
+dq "
+# 8,9 0 043
+sh "
+$ 7,10,1 0 044
+Do "
+% 13,9 0 045
+& 11,9 0 046
+' 4,9 0 047
+aq "
+cq "
+oq "
+( 5,9,2 0 050
+) 5,9,2 0 051
+* 6,9 0 052
++ 8,7 0 053
+, 4,2,2 0 054
+\- 4,4 0 055
+. 4,2 0 056
+/ 4,9 0 057
+sl "
+0 7,9 0 060
+1 7,9 0 061
+2 7,9 0 062
+3 7,9 0 063
+4 7,9 0 064
+5 7,9 0 065
+6 7,9 0 066
+7 7,9 0 067
+8 7,9 0 070
+9 7,9 0 071
+: 4,6 0 072
+; 4,6,2 0 073
+< 7,6 0 074
+= 7,5 0 075
+> 7,6 0 076
+? 7,9 0 077
+@ 11,9 0 0100
+at "
+A 11,9 0 0101
+B 9,9 0 0102
+C 9,9 0 0103
+D 10,9 0 0104
+E 9,9 0 0105
+F 9,9 0 0106
+G 10,9 0 0107
+H 11,9 0 0110
+I 5,9 0 0111
+J 8,9 0 0112
+K 10,9 0 0113
+L 9,9 0 0114
+M 12,9 0 0115
+N 11,9 0 0116
+O 10,9 0 0117
+P 9,9 0 0120
+Q 10,9,2 0 0121
+R 10,9 0 0122
+S 8,9 0 0123
+T 9,9 0 0124
+U 10,9 0 0125
+V 11,9 0 0126
+W 14,9 0 0127
+X 10,9 0 0130
+Y 9,9 0 0131
+Z 9,9 0 0132
+[ 5,9,2 0 0133
+lB "
+\ 6,9 0 0134
+rs "
+] 5,9,2 0 0135
+rB "
+^ 6,9 0 0136
+a^ "
+ha "
+_ 6,0,2 0 0137
+` 5,9 0 0140
+ga "
+a 8,6 0 0141
+b 8,9 0 0142
+c 7,6 0 0143
+d 9,9 0 0144
+e 7,6 0 0145
+f 5,9 0 0146
+g 7,7,3 0 0147
+h 9,9 0 0150
+i 5,9 0 0151
+j 3,9,3 0 0152
+k 8,9 0 0153
+l 5,9 0 0154
+m 13,6 0 0155
+n 9,6 0 0156
+o 8,6 0 0157
+p 8,6,3 0 0160
+q 8,6,3 0 0161
+r 6,6 0 0162
+s 6,6 0 0163
+t 5,9 0 0164
+u 9,6 0 0165
+v 7,6 0 0166
+w 11,6 0 0167
+x 8,6 0 0170
+y 7,6,3 0 0171
+z 7,6 0 0172
+{ 5,9,2 0 0173
+lC "
+| 8,9 0 0174
+ba "
+} 5,9,2 0 0175
+rC "
+~ 7,5 0 0176
+a~ "
+ti "
+--- 4,1 0 0240
+r! 4,6,3 0 0241
+ct 7,7,1 0 0242
+Po 8,9 0 0243
+Cs 8,8 0 0244
+Ye 9,9 0 0245
+bb 8,9 0 0246
+sc 6,9,1 0 0247
+ad 5,9 0 0250
+co 10,9 0 0251
+Of 6,9 0 0252
+Fo 8,6 0 0253
+tno 7,5 0 0254
+- 4,4 0 0255
+hy "
+rg 11,9 0 0256
+a- 6,8 0 0257
+de 5,9 0 0260
+t+- 8,7 0 0261
+S2 4,9 0 0262
+S3 4,9 0 0263
+aa 5,9 0 0264
+mc 9,6,3 0 0265
+ps 10,9 0 0266
+pc 3,5 0 0267
+ac 5,0,3 0 0270
+S1 4,9 0 0271
+Om 6,9 0 0272
+Fc 8,6 0 0273
+14 10,9 0 0274
+12 10,9 0 0275
+34 10,9 0 0276
+r? 7,6,3 0 0277
+`A 11,12 0 0300
+'A 11,12 0 0301
+^A 11,12 0 0302
+~A 11,12 0 0303
+:A 11,12 0 0304
+oA 11,12 0 0305
+AE 14,9 0 0306
+,C 9,9,3 0 0307
+`E 9,12 0 0310
+'E 9,12 0 0311
+^E 9,12 0 0312
+:E 9,12 0 0313
+`I 5,12 0 0314
+'I 5,12 0 0315
+^I 5,12 0 0316
+:I 5,12 0 0317
+-D 10,9 0 0320
+~N 11,12 0 0321
+`O 10,12 0 0322
+'O 10,12 0 0323
+^O 10,12 0 0324
+~O 10,12 0 0325
+:O 10,12 0 0326
+tmu 8,7 0 0327
+/O 10,9 0 0330
+`U 10,12 0 0331
+'U 10,12 0 0332
+^U 10,12 0 0333
+:U 10,12 0 0334
+'Y 9,12 0 0335
+TP 9,9 0 0336
+ss 8,9 0 0337
+`a 8,9 0 0340
+'a 8,9 0 0341
+^a 8,9 0 0342
+~a 8,9 0 0343
+:a 8,9 0 0344
+oa 8,9 0 0345
+ae 11,6 0 0346
+,c 7,6,3 0 0347
+`e 7,9 0 0350
+'e 7,9 0 0351
+^e 7,9 0 0352
+:e 7,9 0 0353
+`i 5,9 0 0354
+'i 5,9 0 0355
+^i 5,9 0 0356
+:i 5,9 0 0357
+Sd 8,9 0 0360
+~n 9,9 0 0361
+`o 8,9 0 0362
+'o 8,9 0 0363
+^o 8,9 0 0364
+~o 8,9 0 0365
+:o 8,9 0 0366
+tdi 8,7 0 0367
+/o 8,7,1 0 0370
+`u 9,9 0 0371
+'u 9,9 0 0372
+^u 9,9 0 0373
+:u 9,9 0 0374
+'y 7,9,3 0 0375
+Tp 8,9,3 0 0376
+:y 7,9,3 0 0377
diff --git a/font/devX75-12/NBI b/font/devX75-12/NBI
new file mode 100644
index 0000000..2b242aa
--- /dev/null
+++ b/font/devX75-12/NBI
@@ -0,0 +1,215 @@
+name NBI
+spacewidth 4
+charset
+--- 11,9 0 00
+--- 4,1 0 040
+! 5,9 0 041
+" 6,9 0 042
+dq "
+# 8,8 0 043
+sh "
+$ 7,10,1 0 044
+Do "
+% 12,9 0 045
+& 12,9 0 046
+' 4,9 0 047
+aq "
+cq "
+oq "
+( 5,9,2 0 050
+) 5,9,2 0 051
+* 6,9 0 052
++ 8,7 0 053
+, 3,2,2 0 054
+\- 4,4 0 055
+. 3,2 0 056
+/ 6,9 0 057
+sl "
+0 7,9 0 060
+1 7,9 0 061
+2 7,9 0 062
+3 7,9 0 063
+4 7,9 0 064
+5 7,9 0 065
+6 7,9 0 066
+7 7,9 0 067
+8 7,9 0 070
+9 7,9 0 071
+: 4,6 0 072
+; 4,6,2 0 073
+< 7,7 0 074
+= 7,5 0 075
+> 7,7 0 076
+? 6,9 0 077
+@ 11,9 0 0100
+at "
+A 10,9 0 0101
+B 9,9 0 0102
+C 9,9 0 0103
+D 10,9 0 0104
+E 9,9 0 0105
+F 8,9 0 0106
+G 10,9 0 0107
+H 11,9 0 0110
+I 6,9 0 0111
+J 8,9 0 0112
+K 10,9 0 0113
+L 9,9 0 0114
+M 14,9 0 0115
+N 11,9 0 0116
+O 10,9 0 0117
+P 9,9 0 0120
+Q 10,9,2 0 0121
+R 10,9 0 0122
+S 8,9 0 0123
+T 9,9 0 0124
+U 9,9 0 0125
+V 10,9 0 0126
+W 13,9 0 0127
+X 11,9 0 0130
+Y 9,9 0 0131
+Z 9,9 0 0132
+[ 6,9,2 0 0133
+lB "
+\ 6,9 0 0134
+rs "
+] 6,9,2 0 0135
+rB "
+^ 8,9 0 0136
+a^ "
+ha "
+_ 6,0,2 0 0137
+` 4,9 0 0140
+ga "
+a 8,6 0 0141
+b 7,9 0 0142
+c 6,6 0 0143
+d 8,9 0 0144
+e 7,6 0 0145
+f 5,9,3 0 0146
+g 7,8,3 0 0147
+h 8,9 0 0150
+i 4,9 0 0151
+j 4,9,3 0 0152
+k 8,9 0 0153
+l 4,9 0 0154
+m 12,6 0 0155
+n 8,6 0 0156
+o 7,6 0 0157
+p 8,6,3 0 0160
+q 8,6,3 0 0161
+r 6,6 0 0162
+s 7,6 0 0163
+t 5,8 0 0164
+u 8,6 0 0165
+v 7,6 0 0166
+w 11,6 0 0167
+x 7,6 0 0170
+y 6,6,3 0 0171
+z 7,6 0 0172
+{ 6,9,2 0 0173
+lC "
+| 8,9 0 0174
+ba "
+} 6,9,2 0 0175
+rC "
+~ 8,5 0 0176
+a~ "
+ti "
+--- 4,1 0 0240
+r! 5,6,3 0 0241
+ct 7,7,1 0 0242
+Po 9,9 0 0243
+Cs 8,8 0 0244
+Ye 10,9 0 0245
+bb 8,9 0 0246
+sc 6,9,2 0 0247
+ad 4,9 0 0250
+co 10,9 0 0251
+Of 6,9 0 0252
+Fo 9,6 0 0253
+tno 7,5 0 0254
+- 4,4 0 0255
+hy "
+rg 10,9 0 0256
+a- 5,8 0 0257
+de 5,9 0 0260
+t+- 8,7 0 0261
+S2 4,9 0 0262
+S3 4,9 0 0263
+aa 4,9 0 0264
+mc 8,6,3 0 0265
+ps 8,9 0 0266
+pc 5,5 0 0267
+ac 4,0,3 0 0270
+S1 4,9 0 0271
+Om 5,9 0 0272
+Fc 9,6 0 0273
+14 10,9 0 0274
+12 10,9 0 0275
+34 10,9 0 0276
+r? 6,6,3 0 0277
+`A 10,12 0 0300
+'A 10,12 0 0301
+^A 10,12 0 0302
+~A 10,12 0 0303
+:A 10,12 0 0304
+oA 10,12 0 0305
+AE 12,9 0 0306
+,C 9,9,3 0 0307
+`E 9,12 0 0310
+'E 9,12 0 0311
+^E 9,12 0 0312
+:E 9,12 0 0313
+`I 6,12 0 0314
+'I 6,12 0 0315
+^I 6,12 0 0316
+:I 6,12 0 0317
+-D 10,9 0 0320
+~N 11,12 0 0321
+`O 10,12 0 0322
+'O 10,12 0 0323
+^O 10,12 0 0324
+~O 10,12 0 0325
+:O 10,12 0 0326
+tmu 8,7 0 0327
+/O 10,9 0 0330
+`U 9,12 0 0331
+'U 9,12 0 0332
+^U 9,12 0 0333
+:U 9,12 0 0334
+'Y 9,12 0 0335
+TP 9,9 0 0336
+ss 9,9,2 0 0337
+`a 8,9 0 0340
+'a 8,9 0 0341
+^a 8,10 0 0342
+~a 8,9 0 0343
+:a 8,9 0 0344
+oa 8,10 0 0345
+ae 11,6 0 0346
+,c 6,6,3 0 0347
+`e 7,9 0 0350
+'e 7,9 0 0351
+^e 7,10 0 0352
+:e 7,9 0 0353
+`i 4,9 0 0354
+'i 4,9 0 0355
+^i 4,10 0 0356
+:i 4,9 0 0357
+Sd 7,9 0 0360
+~n 8,9 0 0361
+`o 7,9 0 0362
+'o 7,9 0 0363
+^o 7,10 0 0364
+~o 7,9 0 0365
+:o 7,9 0 0366
+tdi 8,7 0 0367
+/o 7,6 0 0370
+`u 8,9 0 0371
+'u 8,9 0 0372
+^u 8,10 0 0373
+:u 8,9 0 0374
+'y 6,9,3 0 0375
+Tp 8,9,3 0 0376
+:y 6,9,3 0 0377
diff --git a/font/devX75-12/NI b/font/devX75-12/NI
new file mode 100644
index 0000000..3ab29a5
--- /dev/null
+++ b/font/devX75-12/NI
@@ -0,0 +1,215 @@
+name NI
+spacewidth 3
+charset
+--- 10,9 0 00
+--- 3,1 0 040
+! 4,9 0 041
+" 6,9 0 042
+dq "
+# 8,8 0 043
+sh "
+$ 6,10,1 0 044
+Do "
+% 10,9 0 045
+& 10,9 0 046
+' 4,9 0 047
+aq "
+cq "
+oq "
+( 5,9,2 0 050
+) 5,9,2 0 051
+* 7,9 0 052
++ 8,7 0 053
+, 2,2,1 0 054
+\- 4,4 0 055
+. 2,2 0 056
+/ 8,9,1 0 057
+sl "
+0 6,9 0 060
+1 6,9 0 061
+2 6,9 0 062
+3 6,9 0 063
+4 6,9 0 064
+5 6,9 0 065
+6 6,9 0 066
+7 6,9 0 067
+8 6,9 0 070
+9 6,9 0 071
+: 3,6 0 072
+; 3,6,1 0 073
+< 7,6 0 074
+= 7,5 0 075
+> 7,6 0 076
+? 5,9 0 077
+@ 11,9 0 0100
+at "
+A 8,9 0 0101
+B 8,9 0 0102
+C 9,9 0 0103
+D 10,9 0 0104
+E 9,9 0 0105
+F 9,9 0 0106
+G 9,9 0 0107
+H 10,9 0 0110
+I 5,9 0 0111
+J 7,9 0 0112
+K 9,9 0 0113
+L 8,9 0 0114
+M 13,9 0 0115
+N 11,9 0 0116
+O 9,9 0 0117
+P 8,9 0 0120
+Q 9,9,2 0 0121
+R 10,9 0 0122
+S 9,9 0 0123
+T 8,9 0 0124
+U 8,9 0 0125
+V 9,9 0 0126
+W 13,9 0 0127
+X 10,9 0 0130
+Y 8,9 0 0131
+Z 9,9 0 0132
+[ 6,9,2 0 0133
+lB "
+\ 8,9 0 0134
+rs "
+] 6,9,2 0 0135
+rB "
+^ 6,9 0 0136
+a^ "
+ha "
+_ 6,0,2 0 0137
+` 4,9 0 0140
+ga "
+a 8,6 0 0141
+b 7,9 0 0142
+c 6,6 0 0143
+d 8,9 0 0144
+e 6,6 0 0145
+f 4,9,3 0 0146
+g 6,7,3 0 0147
+h 8,9 0 0150
+i 4,9 0 0151
+j 3,9,3 0 0152
+k 7,9 0 0153
+l 4,9 0 0154
+m 12,6 0 0155
+n 8,6 0 0156
+o 6,6 0 0157
+p 7,6,3 0 0160
+q 7,6,3 0 0161
+r 5,6 0 0162
+s 6,6 0 0163
+t 4,8 0 0164
+u 8,6 0 0165
+v 7,6 0 0166
+w 10,6 0 0167
+x 6,6 0 0170
+y 6,6,3 0 0171
+z 6,6 0 0172
+{ 5,9,2 0 0173
+lC "
+| 6,9 0 0174
+ba "
+} 5,9,2 0 0175
+rC "
+~ 7,5 0 0176
+a~ "
+ti "
+--- 3,1 0 0240
+r! 4,7,2 0 0241
+ct 6,7,1 0 0242
+Po 8,9 0 0243
+Cs 9,8 0 0244
+Ye 9,9 0 0245
+bb 6,9 0 0246
+sc 6,9,2 0 0247
+ad 5,9 0 0250
+co 10,9 0 0251
+Of 5,9 0 0252
+Fo 7,5 0 0253
+tno 7,5 0 0254
+- 4,4 0 0255
+hy "
+rg 10,9 0 0256
+a- 5,8 0 0257
+de 5,9 0 0260
+t+- 8,7 0 0261
+S2 4,9 0 0262
+S3 4,9 0 0263
+aa 4,9 0 0264
+mc 8,6,3 0 0265
+ps 9,9 0 0266
+pc 5,5 0 0267
+ac 4,0,3 0 0270
+S1 4,9 0 0271
+Om 4,9 0 0272
+Fc 7,5 0 0273
+14 9,9 0 0274
+12 9,9 0 0275
+34 9,9 0 0276
+r? 5,7,2 0 0277
+`A 8,12 0 0300
+'A 8,12 0 0301
+^A 8,12 0 0302
+~A 8,12 0 0303
+:A 8,12 0 0304
+oA 8,12 0 0305
+AE 13,9 0 0306
+,C 9,9,3 0 0307
+`E 9,12 0 0310
+'E 9,12 0 0311
+^E 9,12 0 0312
+:E 9,12 0 0313
+`I 5,12 0 0314
+'I 5,12 0 0315
+^I 5,12 0 0316
+:I 5,12 0 0317
+-D 10,9 0 0320
+~N 11,12 0 0321
+`O 9,12 0 0322
+'O 9,12 0 0323
+^O 9,12 0 0324
+~O 9,12 0 0325
+:O 9,12 0 0326
+tmu 8,7 0 0327
+/O 9,9 0 0330
+`U 8,12 0 0331
+'U 8,12 0 0332
+^U 8,12 0 0333
+:U 8,12 0 0334
+'Y 8,12 0 0335
+TP 8,9 0 0336
+ss 8,9,3 0 0337
+`a 8,9 0 0340
+'a 8,9 0 0341
+^a 8,9 0 0342
+~a 8,9 0 0343
+:a 8,9 0 0344
+oa 8,10 0 0345
+ae 9,6 0 0346
+,c 6,6,3 0 0347
+`e 6,9 0 0350
+'e 6,9 0 0351
+^e 6,9 0 0352
+:e 6,9 0 0353
+`i 4,9 0 0354
+'i 4,9 0 0355
+^i 4,9 0 0356
+:i 4,9 0 0357
+Sd 6,9 0 0360
+~n 8,9 0 0361
+`o 6,9 0 0362
+'o 6,9 0 0363
+^o 6,9 0 0364
+~o 6,9 0 0365
+:o 6,9 0 0366
+tdi 8,7 0 0367
+/o 6,6 0 0370
+`u 8,9 0 0371
+'u 8,9 0 0372
+^u 8,9 0 0373
+:u 8,9 0 0374
+'y 6,9,3 0 0375
+Tp 7,9,3 0 0376
+:y 8,9,3 0 0377
diff --git a/font/devX75-12/NR b/font/devX75-12/NR
new file mode 100644
index 0000000..2aa38eb
--- /dev/null
+++ b/font/devX75-12/NR
@@ -0,0 +1,215 @@
+name NR
+spacewidth 3
+charset
+--- 10,9 0 00
+--- 3,1 0 040
+! 4,9 0 041
+" 6,9 0 042
+dq "
+# 8,8 0 043
+sh "
+$ 6,10,1 0 044
+Do "
+% 11,9 0 045
+& 9,9 0 046
+' 4,9 0 047
+aq "
+cq "
+oq "
+( 4,9,2 0 050
+) 4,9,2 0 051
+* 6,9 0 052
++ 8,7 0 053
+, 4,2,1 0 054
+\- 4,4 0 055
+. 4,2 0 056
+/ 4,9 0 057
+sl "
+0 6,9 0 060
+1 6,9 0 061
+2 6,9 0 062
+3 6,9 0 063
+4 6,9 0 064
+5 6,9 0 065
+6 6,9 0 066
+7 6,9 0 067
+8 6,9 0 070
+9 6,9 0 071
+: 4,6 0 072
+; 4,6,1 0 073
+< 7,6 0 074
+= 7,5 0 075
+> 7,6 0 076
+? 5,9 0 077
+@ 10,9 0 0100
+at "
+A 10,9 0 0101
+B 8,9 0 0102
+C 9,9 0 0103
+D 9,9 0 0104
+E 8,9 0 0105
+F 8,9 0 0106
+G 10,9 0 0107
+H 10,9 0 0110
+I 6,9 0 0111
+J 7,9 0 0112
+K 9,9 0 0113
+L 8,9 0 0114
+M 12,9 0 0115
+N 10,9 0 0116
+O 9,9 0 0117
+P 8,9 0 0120
+Q 9,9,2 0 0121
+R 9,9 0 0122
+S 7,9 0 0123
+T 8,9 0 0124
+U 10,9 0 0125
+V 10,9 0 0126
+W 12,9 0 0127
+X 9,9 0 0130
+Y 10,9 0 0131
+Z 7,9 0 0132
+[ 4,9,2 0 0133
+lB "
+\ 6,9 0 0134
+rs "
+] 4,9,2 0 0135
+rB "
+^ 6,9 0 0136
+a^ "
+ha "
+_ 8,0,2 0 0137
+` 3,9 0 0140
+ga "
+a 7,6 0 0141
+b 6,9 0 0142
+c 6,6 0 0143
+d 7,9 0 0144
+e 6,6 0 0145
+f 4,9 0 0146
+g 7,7,3 0 0147
+h 8,9 0 0150
+i 4,9 0 0151
+j 4,9,3 0 0152
+k 7,9 0 0153
+l 4,9 0 0154
+m 12,6 0 0155
+n 8,6 0 0156
+o 6,6 0 0157
+p 7,6,3 0 0160
+q 6,6,3 0 0161
+r 6,6 0 0162
+s 6,6 0 0163
+t 4,8 0 0164
+u 8,6 0 0165
+v 6,6 0 0166
+w 10,6 0 0167
+x 7,6 0 0170
+y 6,6,3 0 0171
+z 6,6 0 0172
+{ 4,9,2 0 0173
+lC "
+| 8,9 0 0174
+ba "
+} 4,9,2 0 0175
+rC "
+~ 7,5 0 0176
+a~ "
+ti "
+--- 3,1 0 0240
+r! 4,7,2 0 0241
+ct 7,7,1 0 0242
+Po 8,9 0 0243
+Cs 8,8 0 0244
+Ye 8,9 0 0245
+bb 8,9 0 0246
+sc 6,9,2 0 0247
+ad 4,9 0 0250
+co 11,9 0 0251
+Of 5,9 0 0252
+Fo 7,6 0 0253
+tno 7,5 0 0254
+- 4,4 0 0255
+hy "
+rg 11,9 0 0256
+a- 5,8 0 0257
+de 5,9 0 0260
+t+- 8,7 0 0261
+S2 4,9 0 0262
+S3 4,9 0 0263
+aa 3,9 0 0264
+mc 8,6,3 0 0265
+ps 8,9,2 0 0266
+pc 4,5 0 0267
+ac 4,0,3 0 0270
+S1 4,9 0 0271
+Om 5,9 0 0272
+Fc 7,6 0 0273
+14 9,9 0 0274
+12 9,9 0 0275
+34 9,9 0 0276
+r? 5,7,2 0 0277
+`A 10,12 0 0300
+'A 10,12 0 0301
+^A 10,12 0 0302
+~A 10,12 0 0303
+:A 10,12 0 0304
+oA 10,12 0 0305
+AE 13,9 0 0306
+,C 9,9,3 0 0307
+`E 8,12 0 0310
+'E 8,12 0 0311
+^E 8,12 0 0312
+:E 8,12 0 0313
+`I 6,12 0 0314
+'I 6,12 0 0315
+^I 6,12 0 0316
+:I 6,12 0 0317
+-D 9,9 0 0320
+~N 10,12 0 0321
+`O 9,12 0 0322
+'O 9,12 0 0323
+^O 9,12 0 0324
+~O 9,12 0 0325
+:O 9,12 0 0326
+tmu 8,7 0 0327
+/O 9,9 0 0330
+`U 10,12 0 0331
+'U 10,12 0 0332
+^U 10,12 0 0333
+:U 10,12 0 0334
+'Y 10,12 0 0335
+TP 8,9 0 0336
+ss 7,9 0 0337
+`a 7,9 0 0340
+'a 7,9 0 0341
+^a 7,9 0 0342
+~a 7,9 0 0343
+:a 7,9 0 0344
+oa 7,9 0 0345
+ae 10,6 0 0346
+,c 6,6,3 0 0347
+`e 6,9 0 0350
+'e 6,9 0 0351
+^e 6,9 0 0352
+:e 6,9 0 0353
+`i 4,9 0 0354
+'i 4,9 0 0355
+^i 4,9 0 0356
+:i 4,9 0 0357
+Sd 6,9 0 0360
+~n 8,9 0 0361
+`o 6,9 0 0362
+'o 6,9 0 0363
+^o 6,9 0 0364
+~o 6,9 0 0365
+:o 6,8 0 0366
+tdi 8,7 0 0367
+/o 6,7,1 0 0370
+`u 8,9 0 0371
+'u 8,9 0 0372
+^u 8,9 0 0373
+:u 8,9 0 0374
+'y 6,9,3 0 0375
+Tp 7,9,3 0 0376
+:y 6,9,3 0 0377
diff --git a/font/devX75-12/S b/font/devX75-12/S
new file mode 100644
index 0000000..ad70dc6
--- /dev/null
+++ b/font/devX75-12/S
@@ -0,0 +1,221 @@
+name S
+special
+spacewidth 3
+charset
+--- 3,1 0 040
+! 4,9 0 041
+fa 9,9 0 042
+# 7,9 0 043
+sh "
+te 7,9 0 044
+% 10,9 0 045
+& 10,9 0 046
+st 6,6 0 047
+( 5,9,3 0 050
+) 5,9,3 0 051
+** 6,7 0 052
++ 7,6 0 053
+pl "
+, 3,1,2 0 054
+\- 7,4 0 055
+mi "
+. 3,1 0 056
+/ 3,9 0 057
+sl "
+0 6,9 0 060
+1 6,9 0 061
+2 6,9 0 062
+3 6,9 0 063
+4 6,9 0 064
+5 6,9 0 065
+6 6,9 0 066
+7 6,9 0 067
+8 6,9 0 070
+9 6,9 0 071
+: 3,6 0 072
+; 3,6,2 0 073
+< 7,6 0 074
+= 7,5 0 075
+eq "
+> 7,6 0 076
+? 6,9 0 077
+=~ 7,6 0 0100
+*A 9,9 0 0101
+*B 8,9 0 0102
+*X 9,9 0 0103
+*D 8,9 0 0104
+*E 8,9 0 0105
+*F 10,9 0 0106
+*G 8,9 0 0107
+*Y 9,9 0 0110
+*I 4,9 0 0111
++h 8,9 0 0112
+*K 9,9 0 0113
+*L 9,9 0 0114
+*M 11,9 0 0115
+*N 9,9 0 0116
+*O 9,9 0 0117
+*P 9,9 0 0120
+*H 9,9 0 0121
+*R 7,9 0 0122
+*S 7,9 0 0123
+*T 8,9 0 0124
+--- 9,9 0 0125
+ts 7,6,3 0 0126
+*W 10,9 0 0127
+*C 8,9 0 0130
+*Q 10,9 0 0131
+*Z 8,9 0 0132
+[ 5,9,3 0 0133
+lB "
+tf 9,6 0 0134
+3d "
+] 5,9,3 0 0135
+rB "
+pp 8,9 0 0136
+_ 6,0,3 0 0137
+radicalex 6,12 0 0140
+*a 8,6 0 0141
+*b 7,10,3 0 0142
+*x 7,6,3 0 0143
+*d 7,10 0 0144
+*e 6,6 0 0145
+*f 8,8,3 0 0146
+*g 7,6,3 0 0147
+*y 8,6,3 0 0150
+*i 3,6 0 0151
++f 8,6,3 0 0152
+*k 7,6 0 0153
+*l 7,9 0 0154
+*m 8,6,3 0 0155
+*n 7,6 0 0156
+*o 7,6 0 0157
+*p 7,6 0 0160
+*h 7,9 0 0161
+*r 7,6,3 0 0162
+*s 8,6 0 0163
+*t 6,6 0 0164
+*u 8,6 0 0165
++p 9,7 0 0166
+*w 9,6 0 0167
+*c 6,11,3 0 0170
+*q 9,6,3 0 0171
+*z 6,10,3 0 0172
+lC 6,9,3 0 0173
+{ "
+ba 3,9,3 0 0174
+| "
+rC 6,9,3 0 0175
+} "
+ap 7,5 0 0176
+*U 8,9 0 0241
+fm 3,9 0 0242
+<= 7,7 0 0243
+f/ 4,9 0 0244
+if 9,5 0 0245
+Fn 6,9,3 0 0246
+CL 9,6,1 0 0247
+DI 7,6 0 0250
+HE 9,6 0 0251
+SP 9,6,1 0 0252
+<> 13,6 0 0253
+<- 12,6 0 0254
+ua 7,12,4 0 0255
+arrowverttp "
+-> 12,6 0 0256
+da 7,12,3 0 0257
+arrowvertbt "
+de 5,9 0 0260
++- 7,7 0 0261
+sd 5,9 0 0262
+>= 7,7 0 0263
+mu 7,6 0 0264
+pt 9,5 0 0265
+pd 6,10 0 0266
+bu 6,5 0 0267
+di 7,6 0 0270
+!= 7,7 0 0271
+== 7,6 0 0272
+~= 7,6 0 0273
+~~ "
+--- 11,1 0 0274
+arrowvertex 7,12,4 0 0275
+an 13,4 0 0276
+CR 8,8 0 0277
+Ah 10,9 0 0300
+Im 9,10,1 0 0301
+Re 10,10 0 0302
+wp 10,8,3 0 0303
+c* 10,9 0 0304
+c+ 10,9 0 0305
+es 10,9 0 0306
+ca 10,6 0 0307
+cu 10,6 0 0310
+sp 9,6 0 0311
+ip 9,6,2 0 0312
+nb 9,7,1 0 0313
+sb 9,6 0 0314
+ib 9,6,2 0 0315
+mo 8,6 0 0316
+nm 8,7,1 0 0317
+/_ 10,9 0 0320
+gr 9,9 0 0321
+rg 10,9 0 0322
+co 10,9 0 0323
+tm 11,9 0 0324
+--- 10,10,1 0 0325
+sr 7,12 0 0326
+sqrt "
+md 3,4 0 0327
+no 9,4 0 0330
+AN 8,6 0 0331
+OR 8,6 0 0332
+hA 13,6 0 0333
+lA 12,6 0 0334
+uA 8,11,1 0 0335
+rA 12,6 0 0336
+dA 8,12 0 0337
+lz 6,9 0 0340
+la 4,10,1 0 0341
+--- 10,9 0 0342
+--- 10,9 0 0343
+--- 10,9 0 0344
+--- 9,10,1 0 0345
+parenlefttp 5,12,4 0 0346
+parenleftex 5,12,4 0 0347
+parenleftbt 5,12,4 0 0350
+bracketlefttp 5,12,4 0 0351
+lc "
+bracketleftex 5,12,4 0 0352
+bracketleftbt 5,12,3 0 0353
+lf "
+bracelefttp 6,12,4 0 0354
+lt "
+braceleftmid 6,12,4 0 0355
+lk "
+braceleftbt 6,12,3 0 0356
+lb "
+bracerightex 6,12,4 0 0357
+braceleftex "
+braceex "
+bv "
+ra 4,10,2 0 0361
+is 4,12,3 0 0362
+integral "
+--- 9,12,4 0 0363
+--- 9,12,4 0 0364
+--- 9,12,3 0 0365
+parenrighttp 5,12,4 0 0366
+parenrightex 5,12,4 0 0367
+parenrightbt 5,12,4 0 0370
+bracketrighttp 5,12,4 0 0371
+rc "
+bracketrightex 5,12,4 0 0372
+bracketrightbt 5,12,3 0 0373
+rf "
+bracerighttp 6,12,4 0 0374
+rt "
+bracerightmid 6,12,4 0 0375
+rk "
+bracerightbt 6,12,3 0 0376
+rb "
diff --git a/font/devX75-12/TB b/font/devX75-12/TB
new file mode 100644
index 0000000..9909e26
--- /dev/null
+++ b/font/devX75-12/TB
@@ -0,0 +1,215 @@
+name TB
+spacewidth 3
+charset
+--- 10,9 0 00
+--- 3,1 0 040
+! 4,9 0 041
+" 5,9 0 042
+dq "
+# 6,9 0 043
+sh "
+$ 6,10,1 0 044
+Do "
+% 12,9 0 045
+& 10,9 0 046
+' 3,9 0 047
+aq "
+cq "
+oq "
+( 4,9,3 0 050
+) 4,9,3 0 051
+* 6,9 0 052
++ 7,6 0 053
+, 4,2,2 0 054
+\- 4,4 0 055
+. 4,2 0 056
+/ 4,9 0 057
+sl "
+0 6,9 0 060
+1 6,9 0 061
+2 6,9 0 062
+3 6,9 0 063
+4 6,9 0 064
+5 6,9 0 065
+6 6,9 0 066
+7 6,9 0 067
+8 6,9 0 070
+9 6,9 0 071
+: 4,6 0 072
+; 4,6,2 0 073
+< 7,6 0 074
+= 7,5 0 075
+> 8,6 0 076
+? 7,9 0 077
+@ 12,9,2 0 0100
+at "
+A 9,9 0 0101
+B 9,9 0 0102
+C 8,9 0 0103
+D 9,9 0 0104
+E 8,9 0 0105
+F 8,9 0 0106
+G 9,9 0 0107
+H 10,9 0 0110
+I 5,9 0 0111
+J 7,9,1 0 0112
+K 10,9 0 0113
+L 8,9 0 0114
+M 11,9 0 0115
+N 9,9 0 0116
+O 9,9 0 0117
+P 8,9 0 0120
+Q 9,9,2 0 0121
+R 9,9 0 0122
+S 7,9 0 0123
+T 9,9 0 0124
+U 9,9 0 0125
+V 9,9 0 0126
+W 12,9 0 0127
+X 9,9 0 0130
+Y 9,9 0 0131
+Z 8,9 0 0132
+[ 4,9,3 0 0133
+lB "
+\ 3,9 0 0134
+rs "
+] 4,9,3 0 0135
+rB "
+^ 7,9 0 0136
+a^ "
+ha "
+_ 6,0,3 0 0137
+` 4,9 0 0140
+ga "
+a 7,6 0 0141
+b 6,9 0 0142
+c 6,6 0 0143
+d 6,9 0 0144
+e 7,6 0 0145
+f 4,9 0 0146
+g 6,6,3 0 0147
+h 6,9 0 0150
+i 3,9 0 0151
+j 3,9,3 0 0152
+k 7,9 0 0153
+l 3,9 0 0154
+m 9,6 0 0155
+n 6,6 0 0156
+o 7,6 0 0157
+p 6,6,3 0 0160
+q 6,6,3 0 0161
+r 5,6 0 0162
+s 6,6 0 0163
+t 4,8 0 0164
+u 6,6 0 0165
+v 6,6 0 0166
+w 9,6 0 0167
+x 6,6 0 0170
+y 6,6,3 0 0171
+z 6,6 0 0172
+{ 5,9,3 0 0173
+lC "
+| 3,9,3 0 0174
+ba "
+} 5,9,3 0 0175
+rC "
+~ 7,6 0 0176
+a~ "
+ti "
+--- 3,1 0 0240
+r! 4,6,3 0 0241
+ct 6,7,2 0 0242
+Po 6,9 0 0243
+Cs 7,8 0 0244
+Ye 8,9 0 0245
+bb 3,9,3 0 0246
+sc 6,9,3 0 0247
+ad 4,9 0 0250
+co 11,9 0 0251
+Of 4,9 0 0252
+Fo 8,6 0 0253
+tno 8,5 0 0254
+- 4,4 0 0255
+hy "
+rg 11,9 0 0256
+a- 4,8 0 0257
+de 5,9 0 0260
+t+- 7,7 0 0261
+S2 4,9 0 0262
+S3 4,9 0 0263
+aa 4,9 0 0264
+mc 6,6,3 0 0265
+ps 8,9,3 0 0266
+pc 3,5 0 0267
+ac 4,0,3 0 0270
+S1 4,9 0 0271
+Om 4,9 0 0272
+Fc 8,6 0 0273
+14 9,9 0 0274
+12 9,9 0 0275
+34 9,9 0 0276
+r? 7,6,3 0 0277
+`A 9,12 0 0300
+'A 9,12 0 0301
+^A 9,12 0 0302
+~A 9,12 0 0303
+:A 9,12 0 0304
+oA 9,12 0 0305
+AE 13,9 0 0306
+,C 8,9,3 0 0307
+`E 8,12 0 0310
+'E 8,12 0 0311
+^E 8,12 0 0312
+:E 8,12 0 0313
+`I 5,12 0 0314
+'I 5,12 0 0315
+^I 5,12 0 0316
+:I 5,12 0 0317
+-D 9,9 0 0320
+~N 9,12 0 0321
+`O 9,12 0 0322
+'O 9,12 0 0323
+^O 9,12 0 0324
+~O 9,12 0 0325
+:O 9,12 0 0326
+tmu 7,6 0 0327
+/O 9,10,1 0 0330
+`U 9,12 0 0331
+'U 9,12 0 0332
+^U 9,12 0 0333
+:U 9,12 0 0334
+'Y 9,12 0 0335
+TP 8,9 0 0336
+ss 8,9 0 0337
+`a 7,9 0 0340
+'a 7,9 0 0341
+^a 7,9 0 0342
+~a 7,9 0 0343
+:a 7,9 0 0344
+oa 7,10 0 0345
+ae 8,6 0 0346
+,c 6,6,3 0 0347
+`e 7,9 0 0350
+'e 7,9 0 0351
+^e 7,9 0 0352
+:e 7,9 0 0353
+`i 3,9 0 0354
+'i 3,9 0 0355
+^i 3,9 0 0356
+:i 3,9 0 0357
+Sd 7,9 0 0360
+~n 6,9 0 0361
+`o 7,9 0 0362
+'o 7,9 0 0363
+^o 7,9 0 0364
+~o 7,9 0 0365
+:o 7,9 0 0366
+tdi 7,6 0 0367
+/o 7,7,1 0 0370
+`u 6,9 0 0371
+'u 6,9 0 0372
+^u 6,9 0 0373
+:u 6,9 0 0374
+'y 6,9,3 0 0375
+Tp 6,9,3 0 0376
+:y 6,9,3 0 0377
diff --git a/font/devX75-12/TBI b/font/devX75-12/TBI
new file mode 100644
index 0000000..2f8a9e5
--- /dev/null
+++ b/font/devX75-12/TBI
@@ -0,0 +1,215 @@
+name TBI
+spacewidth 3
+charset
+--- 10,9 0 00
+--- 3,1 0 040
+! 5,9 0 041
+" 7,9 0 042
+dq "
+# 7,9 0 043
+sh "
+$ 6,10,1 0 044
+Do "
+% 12,9 0 045
+& 9,9 0 046
+' 4,9 0 047
+aq "
+cq "
+oq "
+( 6,9,2 0 050
+) 6,9,2 0 051
+* 6,9 0 052
++ 7,6 0 053
+, 4,2,1 0 054
+\- 4,4 0 055
+. 4,2 0 056
+/ 5,9 0 057
+sl "
+0 6,9 0 060
+1 6,9 0 061
+2 6,9 0 062
+3 6,9 0 063
+4 6,9 0 064
+5 6,9 0 065
+6 6,9 0 066
+7 6,9 0 067
+8 6,9 0 070
+9 6,9 0 071
+: 5,6 0 072
+; 5,6,1 0 073
+< 9,7 0 074
+= 8,5 0 075
+> 9,7 0 076
+? 6,9 0 077
+@ 12,9,1 0 0100
+at "
+A 8,9 0 0101
+B 8,9 0 0102
+C 8,9 0 0103
+D 9,9 0 0104
+E 8,9 0 0105
+F 8,9 0 0106
+G 9,9 0 0107
+H 10,9 0 0110
+I 5,9 0 0111
+J 6,9,1 0 0112
+K 8,9 0 0113
+L 8,9 0 0114
+M 11,9 0 0115
+N 9,9 0 0116
+O 9,9 0 0117
+P 8,9 0 0120
+Q 9,9,3 0 0121
+R 8,9 0 0122
+S 8,9 0 0123
+T 7,9 0 0124
+U 10,9 0 0125
+V 8,9 0 0126
+W 11,9 0 0127
+X 8,9 0 0130
+Y 7,9 0 0131
+Z 7,9 0 0132
+[ 6,9,2 0 0133
+lB "
+\ 5,9 0 0134
+rs "
+] 7,9,2 0 0135
+rB "
+^ 8,9 0 0136
+a^ "
+ha "
+_ 6,0,2 0 0137
+` 4,9 0 0140
+ga "
+a 7,6 0 0141
+b 6,9 0 0142
+c 5,6 0 0143
+d 6,9 0 0144
+e 6,6 0 0145
+f 3,9,3 0 0146
+g 5,6,3 0 0147
+h 6,9 0 0150
+i 4,9 0 0151
+j 4,9,3 0 0152
+k 6,9 0 0153
+l 4,9 0 0154
+m 9,6 0 0155
+n 6,6 0 0156
+o 6,6 0 0157
+p 6,6,3 0 0160
+q 6,6,3 0 0161
+r 5,6 0 0162
+s 5,6 0 0163
+t 3,7 0 0164
+u 7,6 0 0165
+v 6,6 0 0166
+w 8,6 0 0167
+x 6,6 0 0170
+y 6,6,3 0 0171
+z 6,6,1 0 0172
+{ 6,9,2 0 0173
+lC "
+| 4,9 0 0174
+ba "
+} 6,9,2 0 0175
+rC "
+~ 9,5 0 0176
+a~ "
+ti "
+--- 3,1 0 0240
+r! 4,6,3 0 0241
+ct 6,8,2 0 0242
+Po 6,9 0 0243
+Cs 8,7 0 0244
+Ye 6,9 0 0245
+bb 4,9 0 0246
+sc 7,9,3 0 0247
+ad 5,9 0 0250
+co 11,9 0 0251
+Of 6,9 0 0252
+Fo 9,6 0 0253
+tno 8,6 0 0254
+- 4,4 0 0255
+hy "
+rg 11,9 0 0256
+a- 4,8 0 0257
+de 5,9 0 0260
+t+- 7,7 0 0261
+S2 4,9 0 0262
+S3 4,9 0 0263
+aa 4,9 0 0264
+mc 7,6,3 0 0265
+ps 7,9,3 0 0266
+pc 3,5 0 0267
+ac 4,0,3 0 0270
+S1 4,9 0 0271
+Om 6,9 0 0272
+Fc 9,6 0 0273
+14 9,9 0 0274
+12 9,9 0 0275
+34 9,9 0 0276
+r? 6,6,3 0 0277
+`A 8,12 0 0300
+'A 8,12 0 0301
+^A 8,12 0 0302
+~A 8,12 0 0303
+:A 8,12 0 0304
+oA 8,12 0 0305
+AE 12,9 0 0306
+,C 8,9,3 0 0307
+`E 8,12 0 0310
+'E 8,12 0 0311
+^E 8,12 0 0312
+:E 8,12 0 0313
+`I 5,12 0 0314
+'I 5,12 0 0315
+^I 5,12 0 0316
+:I 5,12 0 0317
+-D 9,9 0 0320
+~N 9,12 0 0321
+`O 9,12 0 0322
+'O 9,12 0 0323
+^O 9,12 0 0324
+~O 9,12 0 0325
+:O 9,12 0 0326
+tmu 7,6 0 0327
+/O 9,10,1 0 0330
+`U 10,12 0 0331
+'U 10,12 0 0332
+^U 10,12 0 0333
+:U 10,12 0 0334
+'Y 7,12 0 0335
+TP 8,9 0 0336
+ss 7,9,3 0 0337
+`a 7,9 0 0340
+'a 7,9 0 0341
+^a 7,9 0 0342
+~a 7,9 0 0343
+:a 7,9 0 0344
+oa 7,9 0 0345
+ae 10,6 0 0346
+,c 5,6,3 0 0347
+`e 6,9 0 0350
+'e 6,9 0 0351
+^e 6,9 0 0352
+:e 6,9 0 0353
+`i 3,9 0 0354
+'i 3,9 0 0355
+^i 3,9 0 0356
+:i 3,9 0 0357
+Sd 6,9 0 0360
+~n 7,9 0 0361
+`o 6,9 0 0362
+'o 6,9 0 0363
+^o 6,9 0 0364
+~o 6,9 0 0365
+:o 6,9 0 0366
+tdi 7,6 0 0367
+/o 6,7,1 0 0370
+`u 7,9 0 0371
+'u 7,9 0 0372
+^u 7,9 0 0373
+:u 7,9 0 0374
+'y 6,9,3 0 0375
+Tp 6,9,3 0 0376
+:y 6,9,3 0 0377
diff --git a/font/devX75-12/TI b/font/devX75-12/TI
new file mode 100644
index 0000000..0d1d534
--- /dev/null
+++ b/font/devX75-12/TI
@@ -0,0 +1,215 @@
+name TI
+spacewidth 3
+charset
+--- 9,9 0 00
+--- 3,1 0 040
+! 4,9 0 041
+" 5,9 0 042
+dq "
+# 6,9 0 043
+sh "
+$ 6,10,1 0 044
+Do "
+% 10,9 0 045
+& 9,9 0 046
+' 3,9 0 047
+aq "
+cq "
+oq "
+( 4,9,3 0 050
+) 4,9,3 0 051
+* 6,9 0 052
++ 8,6 0 053
+, 3,1,2 0 054
+\- 4,4 0 055
+. 3,1 0 056
+/ 4,9 0 057
+sl "
+0 6,9 0 060
+1 6,9 0 061
+2 6,9 0 062
+3 6,9 0 063
+4 6,9 0 064
+5 6,9 0 065
+6 6,9 0 066
+7 6,9 0 067
+8 6,9 0 070
+9 6,9 0 071
+: 4,6 0 072
+; 4,6,2 0 073
+< 8,7 0 074
+= 8,5 0 075
+> 8,7 0 076
+? 6,9 0 077
+@ 12,9,1 0 0100
+at "
+A 8,9 0 0101
+B 8,9 0 0102
+C 7,9 0 0103
+D 9,9 0 0104
+E 8,9 0 0105
+F 8,9 0 0106
+G 8,9 0 0107
+H 9,9 0 0110
+I 5,9 0 0111
+J 5,9 0 0112
+K 8,9 0 0113
+L 7,9 0 0114
+M 11,9 0 0115
+N 9,9 0 0116
+O 7,9 0 0117
+P 8,9 0 0120
+Q 7,9,2 0 0121
+R 8,9 0 0122
+S 6,9 0 0123
+T 7,9 0 0124
+U 8,9 0 0125
+V 7,9 0 0126
+W 10,9 0 0127
+X 8,9 0 0130
+Y 7,9 0 0131
+Z 7,9 0 0132
+[ 5,9,2 0 0133
+lB "
+\ 3,9 0 0134
+rs "
+] 5,9,2 0 0135
+rB "
+^ 5,9 0 0136
+a^ "
+ha "
+_ 6,0,3 0 0137
+` 4,9 0 0140
+ga "
+a 6,6 0 0141
+b 6,9 0 0142
+c 5,6 0 0143
+d 6,9 0 0144
+e 6,6 0 0145
+f 4,9,3 0 0146
+g 5,6,3 0 0147
+h 6,9 0 0150
+i 4,9 0 0151
+j 4,9,3 0 0152
+k 6,9 0 0153
+l 3,9 0 0154
+m 9,6 0 0155
+n 6,6 0 0156
+o 6,6 0 0157
+p 6,6,3 0 0160
+q 6,6,3 0 0161
+r 4,6 0 0162
+s 5,6 0 0163
+t 4,7 0 0164
+u 6,6 0 0165
+v 6,6 0 0166
+w 9,6 0 0167
+x 6,6 0 0170
+y 6,6,3 0 0171
+z 5,6 0 0172
+{ 5,9,3 0 0173
+lC "
+| 4,9,3 0 0174
+ba "
+} 5,9,3 0 0175
+rC "
+~ 7,5 0 0176
+a~ "
+ti "
+--- 3,1 0 0240
+r! 5,6,3 0 0241
+ct 6,8,2 0 0242
+Po 6,9 0 0243
+Cs 7,7 0 0244
+Ye 6,9 0 0245
+bb 4,9,3 0 0246
+sc 6,9,2 0 0247
+ad 4,8 0 0250
+co 11,9 0 0251
+Of 4,9 0 0252
+Fo 6,6 0 0253
+tno 8,5 0 0254
+- 4,4 0 0255
+hy "
+rg 11,9 0 0256
+a- 4,8 0 0257
+de 5,9 0 0260
+t+- 8,7 0 0261
+S2 4,9 0 0262
+S3 4,9 0 0263
+aa 4,9 0 0264
+mc 6,6,3 0 0265
+ps 7,9,2 0 0266
+pc 3,4 0 0267
+ac 4,0,3 0 0270
+S1 3,9 0 0271
+Om 4,9 0 0272
+Fc 6,6 0 0273
+14 9,9 0 0274
+12 9,9 0 0275
+34 9,9 0 0276
+r? 6,6,3 0 0277
+`A 8,12 0 0300
+'A 8,12 0 0301
+^A 8,12 0 0302
+~A 8,12 0 0303
+:A 8,11 0 0304
+oA 8,12 0 0305
+AE 11,9 0 0306
+,C 7,9,3 0 0307
+`E 8,12 0 0310
+'E 8,12 0 0311
+^E 8,12 0 0312
+:E 8,11 0 0313
+`I 5,12 0 0314
+'I 5,12 0 0315
+^I 5,12 0 0316
+:I 5,11 0 0317
+-D 9,9 0 0320
+~N 9,12 0 0321
+`O 7,12 0 0322
+'O 7,12 0 0323
+^O 7,12 0 0324
+~O 7,12 0 0325
+:O 7,11 0 0326
+tmu 8,6 0 0327
+/O 7,10,1 0 0330
+`U 8,12 0 0331
+'U 8,12 0 0332
+^U 8,12 0 0333
+:U 8,11 0 0334
+'Y 7,12 0 0335
+TP 8,9 0 0336
+ss 6,9,3 0 0337
+`a 7,9 0 0340
+'a 7,9 0 0341
+^a 7,9 0 0342
+~a 7,9 0 0343
+:a 7,8 0 0344
+oa 7,9 0 0345
+ae 9,6 0 0346
+,c 5,6,3 0 0347
+`e 6,9 0 0350
+'e 6,9 0 0351
+^e 6,9 0 0352
+:e 6,8 0 0353
+`i 4,9 0 0354
+'i 4,9 0 0355
+^i 4,9 0 0356
+:i 4,8 0 0357
+Sd 6,9 0 0360
+~n 6,9 0 0361
+`o 6,9 0 0362
+'o 6,9 0 0363
+^o 6,9 0 0364
+~o 6,9 0 0365
+:o 6,8 0 0366
+tdi 8,6 0 0367
+/o 6,7,1 0 0370
+`u 6,9 0 0371
+'u 6,9 0 0372
+^u 6,9 0 0373
+:u 6,8 0 0374
+'y 6,9,3 0 0375
+Tp 6,9,3 0 0376
+:y 6,8,3 0 0377
diff --git a/font/devX75-12/TR b/font/devX75-12/TR
new file mode 100644
index 0000000..f1a610a
--- /dev/null
+++ b/font/devX75-12/TR
@@ -0,0 +1,215 @@
+name TR
+spacewidth 3
+charset
+--- 9,9 0 00
+--- 3,1 0 040
+! 3,9 0 041
+" 5,9 0 042
+dq "
+# 6,8 0 043
+sh "
+$ 6,10,1 0 044
+Do "
+% 10,9 0 045
+& 10,9 0 046
+' 2,9 0 047
+aq "
+cq "
+oq "
+( 5,9,3 0 050
+) 5,9,3 0 051
+* 6,9 0 052
++ 7,6 0 053
+, 3,1,2 0 054
+\- 4,4 0 055
+. 3,1 0 056
+/ 3,9 0 057
+sl "
+0 6,9 0 060
+1 6,9 0 061
+2 6,9 0 062
+3 6,9 0 063
+4 6,9 0 064
+5 6,9 0 065
+6 6,9 0 066
+7 6,9 0 067
+8 6,9 0 070
+9 6,9 0 071
+: 3,6 0 072
+; 3,6,2 0 073
+< 7,6 0 074
+= 7,5 0 075
+> 7,6 0 076
+? 5,9 0 077
+@ 11,9,2 0 0100
+at "
+A 9,9 0 0101
+B 8,9 0 0102
+C 8,9 0 0103
+D 9,9 0 0104
+E 8,9 0 0105
+F 7,9 0 0106
+G 9,9 0 0107
+H 9,9 0 0110
+I 4,9 0 0111
+J 5,9 0 0112
+K 9,9 0 0113
+L 7,9 0 0114
+M 11,9 0 0115
+N 9,9 0 0116
+O 9,9 0 0117
+P 7,9 0 0120
+Q 9,9,2 0 0121
+R 8,9 0 0122
+S 7,9 0 0123
+T 7,9 0 0124
+U 9,9 0 0125
+V 9,9 0 0126
+W 12,9 0 0127
+X 9,9 0 0130
+Y 9,9 0 0131
+Z 8,9 0 0132
+[ 4,9,3 0 0133
+lB "
+\ 3,9 0 0134
+rs "
+] 4,9,3 0 0135
+rB "
+^ 6,9 0 0136
+a^ "
+ha "
+_ 6,0,3 0 0137
+` 4,9 0 0140
+ga "
+a 6,6 0 0141
+b 6,9 0 0142
+c 6,6 0 0143
+d 6,9 0 0144
+e 6,6 0 0145
+f 4,9 0 0146
+g 6,6,3 0 0147
+h 6,9 0 0150
+i 3,9 0 0151
+j 3,9,3 0 0152
+k 6,9 0 0153
+l 3,9 0 0154
+m 9,6 0 0155
+n 6,6 0 0156
+o 6,6 0 0157
+p 6,6,3 0 0160
+q 6,6,3 0 0161
+r 4,6 0 0162
+s 6,6 0 0163
+t 4,7 0 0164
+u 6,6 0 0165
+v 6,6 0 0166
+w 9,6 0 0167
+x 6,6 0 0170
+y 6,6,3 0 0171
+z 6,6 0 0172
+{ 6,9,3 0 0173
+lC "
+| 3,9 0 0174
+ba "
+} 6,9,3 0 0175
+rC "
+~ 7,5 0 0176
+a~ "
+ti "
+--- 3,1 0 0240
+r! 4,6,3 0 0241
+ct 6,7,1 0 0242
+Po 6,9 0 0243
+Cs 7,8 0 0244
+Ye 6,9 0 0245
+bb 3,9 0 0246
+sc 6,9,3 0 0247
+ad 3,8 0 0250
+co 10,9 0 0251
+Of 5,9 0 0252
+Fo 7,5 0 0253
+tno 8,5 0 0254
+- 4,4 0 0255
+hy "
+rg 11,9 0 0256
+a- 4,8 0 0257
+de 5,9 0 0260
+t+- 7,7 0 0261
+S2 4,9 0 0262
+S3 4,9 0 0263
+aa 4,9 0 0264
+mc 6,6,3 0 0265
+ps 7,9,3 0 0266
+pc 3,4 0 0267
+ac 3,0,3 0 0270
+S1 4,9 0 0271
+Om 5,9 0 0272
+Fc 7,5 0 0273
+14 9,9 0 0274
+12 9,9 0 0275
+34 9,9 0 0276
+r? 5,6,3 0 0277
+`A 9,12 0 0300
+'A 9,12 0 0301
+^A 9,12 0 0302
+~A 9,12 0 0303
+:A 9,11 0 0304
+oA 9,12 0 0305
+AE 11,9 0 0306
+,C 8,9,3 0 0307
+`E 8,12 0 0310
+'E 8,12 0 0311
+^E 8,12 0 0312
+:E 8,11 0 0313
+`I 4,12 0 0314
+'I 4,12 0 0315
+^I 4,12 0 0316
+:I 4,11 0 0317
+-D 9,9 0 0320
+~N 9,12 0 0321
+`O 9,12 0 0322
+'O 9,12 0 0323
+^O 9,12 0 0324
+~O 9,12 0 0325
+:O 9,11 0 0326
+tmu 7,6 0 0327
+/O 9,10 0 0330
+`U 8,12 0 0331
+'U 8,12 0 0332
+^U 8,12 0 0333
+:U 8,11 0 0334
+'Y 9,12 0 0335
+TP 7,9 0 0336
+ss 6,9 0 0337
+`a 6,9 0 0340
+'a 6,9 0 0341
+^a 6,9 0 0342
+~a 6,9 0 0343
+:a 6,8 0 0344
+oa 6,9 0 0345
+ae 9,6 0 0346
+,c 5,6,3 0 0347
+`e 6,9 0 0350
+'e 6,9 0 0351
+^e 6,9 0 0352
+:e 6,8 0 0353
+`i 3,9 0 0354
+'i 3,9 0 0355
+^i 3,9 0 0356
+:i 3,8 0 0357
+Sd 6,9 0 0360
+~n 6,9 0 0361
+`o 6,9 0 0362
+'o 6,9 0 0363
+^o 6,9 0 0364
+~o 6,9 0 0365
+:o 6,8 0 0366
+tdi 7,6 0 0367
+/o 6,6,1 0 0370
+`u 6,9 0 0371
+'u 6,9 0 0372
+^u 6,9 0 0373
+:u 6,8 0 0374
+'y 6,9,3 0 0375
+Tp 6,9,3 0 0376
+:y 6,8,3 0 0377
diff --git a/font/devX75-12/devX75-12.am b/font/devX75-12/devX75-12.am
new file mode 100644
index 0000000..ddca5b5
--- /dev/null
+++ b/font/devX75-12/devX75-12.am
@@ -0,0 +1,65 @@
+# Copyright (C) 2014-2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+DEVX7512FONTS = \
+ font/devX75-12/DESC \
+ font/devX75-12/TR \
+ font/devX75-12/TI \
+ font/devX75-12/TB \
+ font/devX75-12/TBI \
+ font/devX75-12/CR \
+ font/devX75-12/CI \
+ font/devX75-12/CB \
+ font/devX75-12/CBI \
+ font/devX75-12/HR \
+ font/devX75-12/HI \
+ font/devX75-12/HB \
+ font/devX75-12/HBI \
+ font/devX75-12/NR \
+ font/devX75-12/NI \
+ font/devX75-12/NB \
+ font/devX75-12/NBI \
+ font/devX75-12/S
+
+if !WITHOUT_X11
+devX75_12_fontdir = $(fontdir)/devX75-12
+devX75_12_font_DATA = $(DEVX7512FONTS)
+endif
+
+EXTRA_DIST += $(DEVX7512FONTS)
+
+# This target generates font descriptions from core X11 font data
+# returned by a running X server; these are _not_ normally generated
+# during a build, but provided with the groff source distribution.
+#
+# This maintainer-mode target alters files in the source tree.
+maintainer-font-descriptions: devX75-12_font-descriptions
+devX75_12_fontsrcdir=$(top_srcdir)/font/devX75-12
+devX75-12_font-descriptions: $(xtotroff) $(xditview_srcdir)/DESC.in \
+ $(xditview_srcdir)/FontMap-X11
+ $(AM_V_GEN)$(MKDIR_P) $(devX75_12_fontsrcdir) \
+ && sed -e 's/res .*/res 75/;s/unitwidth .*/unitwidth 12/' \
+ $(xditview_srcdir)/DESC.in >$(devX75_12_fontsrcdir)/DESC \
+ && $(xtotroff) -d $(devX75_12_fontsrcdir) -r 75 -s 12 \
+ $(xditview_srcdir)/FontMap-X11
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/font/devX75/CB b/font/devX75/CB
new file mode 100644
index 0000000..9529fdb
--- /dev/null
+++ b/font/devX75/CB
@@ -0,0 +1,215 @@
+name CB
+spacewidth 6
+charset
+--- 6,5 0 00
+--- 6,1 0 040
+! 6,7 0 041
+" 6,6 0 042
+dq "
+# 6,7 0 043
+sh "
+$ 6,7,1 0 044
+Do "
+% 6,6 0 045
+& 6,6 0 046
+' 6,6 0 047
+aq "
+cq "
+oq "
+( 6,7,1 0 050
+) 6,7,1 0 051
+* 6,7 0 052
++ 6,6 0 053
+, 6,1,2 0 054
+\- 6,4 0 055
+. 6,1 0 056
+/ 6,7,1 0 057
+sl "
+0 6,7 0 060
+1 6,7 0 061
+2 6,7 0 062
+3 6,7 0 063
+4 6,7 0 064
+5 6,7 0 065
+6 6,7 0 066
+7 6,7 0 067
+8 6,7 0 070
+9 6,7 0 071
+: 6,4 0 072
+; 6,4,2 0 073
+< 6,6 0 074
+= 6,5 0 075
+> 6,6 0 076
+? 6,6 0 077
+@ 6,7,1 0 0100
+at "
+A 6,6 0 0101
+B 6,6 0 0102
+C 6,6 0 0103
+D 6,6 0 0104
+E 6,6 0 0105
+F 6,6 0 0106
+G 6,6 0 0107
+H 6,6 0 0110
+I 6,6 0 0111
+J 6,6 0 0112
+K 6,6 0 0113
+L 6,6 0 0114
+M 6,6 0 0115
+N 6,6 0 0116
+O 6,6 0 0117
+P 6,6 0 0120
+Q 6,6,1 0 0121
+R 6,6 0 0122
+S 6,6 0 0123
+T 6,6 0 0124
+U 6,6 0 0125
+V 6,6 0 0126
+W 6,6 0 0127
+X 6,6 0 0130
+Y 6,6 0 0131
+Z 6,6 0 0132
+[ 6,7,1 0 0133
+lB "
+\ 6,7,1 0 0134
+rs "
+] 6,7,1 0 0135
+rB "
+^ 6,7 0 0136
+a^ "
+ha "
+_ 6,0,2 0 0137
+` 6,8 0 0140
+ga "
+a 6,5 0 0141
+b 6,7 0 0142
+c 6,5 0 0143
+d 6,7 0 0144
+e 6,5 0 0145
+f 6,7 0 0146
+g 6,5,2 0 0147
+h 6,7 0 0150
+i 6,7 0 0151
+j 6,7,2 0 0152
+k 6,7 0 0153
+l 6,7 0 0154
+m 6,5 0 0155
+n 6,5 0 0156
+o 6,5 0 0157
+p 6,5,2 0 0160
+q 6,5,2 0 0161
+r 6,5 0 0162
+s 6,5 0 0163
+t 6,7 0 0164
+u 6,5 0 0165
+v 6,5 0 0166
+w 6,5 0 0167
+x 6,5 0 0170
+y 6,5,2 0 0171
+z 6,5 0 0172
+{ 6,7,1 0 0173
+lC "
+| 6,7,2 0 0174
+ba "
+} 6,7,1 0 0175
+rC "
+~ 6,5 0 0176
+a~ "
+ti "
+--- 6,1 0 0240
+r! 6,5,2 0 0241
+ct 6,7,1 0 0242
+Po 6,7 0 0243
+Cs 6,6 0 0244
+Ye 6,7 0 0245
+bb 6,7,2 0 0246
+sc 6,7,1 0 0247
+ad 6,7 0 0250
+co 6,7 0 0251
+Of 6,7 0 0252
+Fo 6,5 0 0253
+tno 6,5 0 0254
+- 6,4 0 0255
+hy "
+rg 6,7 0 0256
+a- 6,7 0 0257
+de 6,7 0 0260
+t+- 6,6 0 0261
+S2 6,7 0 0262
+S3 6,7 0 0263
+aa 6,8 0 0264
+mc 6,5,2 0 0265
+ps 6,7,1 0 0266
+pc 6,5 0 0267
+ac 6,1,2 0 0270
+S1 6,7 0 0271
+Om 6,7 0 0272
+Fc 6,5 0 0273
+14 6,8,1 0 0274
+12 6,8,1 0 0275
+34 6,8,1 0 0276
+r? 6,4,2 0 0277
+`A 6,9 0 0300
+'A 6,9 0 0301
+^A 6,9 0 0302
+~A 6,9 0 0303
+:A 6,9 0 0304
+oA 6,9 0 0305
+AE 6,6 0 0306
+,C 6,6,2 0 0307
+`E 6,9 0 0310
+'E 6,9 0 0311
+^E 6,9 0 0312
+:E 6,9 0 0313
+`I 6,9 0 0314
+'I 6,9 0 0315
+^I 6,9 0 0316
+:I 6,9 0 0317
+-D 6,6 0 0320
+~N 6,9 0 0321
+`O 6,9 0 0322
+'O 6,9 0 0323
+^O 6,9 0 0324
+~O 6,9 0 0325
+:O 6,9 0 0326
+tmu 6,6 0 0327
+/O 6,6,1 0 0330
+`U 6,9 0 0331
+'U 6,9 0 0332
+^U 6,9 0 0333
+:U 6,9 0 0334
+'Y 6,9 0 0335
+TP 6,6 0 0336
+ss 6,7 0 0337
+`a 6,8 0 0340
+'a 6,8 0 0341
+^a 6,8 0 0342
+~a 6,8 0 0343
+:a 6,8 0 0344
+oa 6,9 0 0345
+ae 6,5 0 0346
+,c 6,5,2 0 0347
+`e 6,8 0 0350
+'e 6,8 0 0351
+^e 6,8 0 0352
+:e 6,8 0 0353
+`i 6,8 0 0354
+'i 6,8 0 0355
+^i 6,8 0 0356
+:i 6,8 0 0357
+Sd 6,8 0 0360
+~n 6,8 0 0361
+`o 6,8 0 0362
+'o 6,8 0 0363
+^o 6,8 0 0364
+~o 6,8 0 0365
+:o 6,8 0 0366
+tdi 6,6 0 0367
+/o 6,6,1 0 0370
+`u 6,8 0 0371
+'u 6,8 0 0372
+^u 6,8 0 0373
+:u 6,8 0 0374
+'y 6,8,2 0 0375
+Tp 6,7,2 0 0376
+:y 6,8,2 0 0377
diff --git a/font/devX75/CBI b/font/devX75/CBI
new file mode 100644
index 0000000..1826155
--- /dev/null
+++ b/font/devX75/CBI
@@ -0,0 +1,215 @@
+name CBI
+spacewidth 6
+charset
+--- 6,5 0 00
+--- 6,1 0 040
+! 6,7 0 041
+" 6,7 0 042
+dq "
+# 6,7 0 043
+sh "
+$ 6,7,1 0 044
+Do "
+% 6,7 0 045
+& 6,6 0 046
+' 6,7 0 047
+aq "
+cq "
+oq "
+( 6,7,2 0 050
+) 6,7,2 0 051
+* 6,7 0 052
++ 6,6 0 053
+, 6,1,2 0 054
+\- 6,4 0 055
+. 6,1 0 056
+/ 6,7,1 0 057
+sl "
+0 6,7 0 060
+1 6,7 0 061
+2 6,7 0 062
+3 6,7 0 063
+4 6,7 0 064
+5 6,7 0 065
+6 6,7 0 066
+7 6,7 0 067
+8 6,7 0 070
+9 6,7 0 071
+: 6,4 0 072
+; 6,4,2 0 073
+< 6,6 0 074
+= 6,5 0 075
+> 6,6 0 076
+? 6,7 0 077
+@ 6,7,1 0 0100
+at "
+A 6,6 0 0101
+B 6,6 0 0102
+C 6,6 0 0103
+D 6,6 0 0104
+E 6,6 0 0105
+F 6,6 0 0106
+G 6,6 0 0107
+H 6,6 0 0110
+I 6,6 0 0111
+J 6,6 0 0112
+K 6,6 0 0113
+L 6,6 0 0114
+M 6,6 0 0115
+N 6,6 0 0116
+O 6,6 0 0117
+P 6,6 0 0120
+Q 6,6,1 0 0121
+R 6,6 0 0122
+S 6,6 0 0123
+T 6,6 0 0124
+U 6,6 0 0125
+V 6,6 0 0126
+W 6,6 0 0127
+X 6,6 0 0130
+Y 6,6 0 0131
+Z 6,6 0 0132
+[ 6,7,2 0 0133
+lB "
+\ 6,7,1 0 0134
+rs "
+] 6,7,2 0 0135
+rB "
+^ 6,7 0 0136
+a^ "
+ha "
+_ 6,0,2 0 0137
+` 6,8 0 0140
+ga "
+a 6,5 0 0141
+b 6,7 0 0142
+c 6,5 0 0143
+d 6,7 0 0144
+e 6,5 0 0145
+f 6,7 0 0146
+g 6,5,2 0 0147
+h 6,7 0 0150
+i 6,7 0 0151
+j 6,7,2 0 0152
+k 6,7 0 0153
+l 6,7 0 0154
+m 6,5 0 0155
+n 6,5 0 0156
+o 6,5 0 0157
+p 6,5,2 0 0160
+q 6,5,2 0 0161
+r 6,5 0 0162
+s 6,5 0 0163
+t 6,7 0 0164
+u 6,5 0 0165
+v 6,5 0 0166
+w 6,5 0 0167
+x 6,5 0 0170
+y 6,5,2 0 0171
+z 6,5 0 0172
+{ 6,7,2 0 0173
+lC "
+| 6,7,1 0 0174
+ba "
+} 6,7,2 0 0175
+rC "
+~ 6,5 0 0176
+a~ "
+ti "
+--- 6,1 0 0240
+r! 6,5,2 0 0241
+ct 6,7,1 0 0242
+Po 6,6 0 0243
+Cs 6,6 0 0244
+Ye 6,6 0 0245
+bb 6,7,1 0 0246
+sc 6,7,1 0 0247
+ad 6,7 0 0250
+co 6,7 0 0251
+Of 6,6 0 0252
+Fo 6,4 0 0253
+tno 6,5 0 0254
+- 6,4 0 0255
+hy "
+rg 6,7 0 0256
+a- 6,7 0 0257
+de 6,7 0 0260
+t+- 6,6 0 0261
+S2 6,7 0 0262
+S3 6,7 0 0263
+aa 6,8 0 0264
+mc 6,5,2 0 0265
+ps 6,7,1 0 0266
+pc 6,4 0 0267
+ac 6,0,2 0 0270
+S1 6,7 0 0271
+Om 6,6 0 0272
+Fc 6,4 0 0273
+14 6,8,1 0 0274
+12 6,8,1 0 0275
+34 6,8,1 0 0276
+r? 6,6,2 0 0277
+`A 6,9 0 0300
+'A 6,9 0 0301
+^A 6,9 0 0302
+~A 6,9 0 0303
+:A 6,8 0 0304
+oA 6,9 0 0305
+AE 6,6 0 0306
+,C 6,6,2 0 0307
+`E 6,9 0 0310
+'E 6,9 0 0311
+^E 6,9 0 0312
+:E 6,8 0 0313
+`I 6,9 0 0314
+'I 6,9 0 0315
+^I 6,9 0 0316
+:I 6,8 0 0317
+-D 6,6 0 0320
+~N 6,9 0 0321
+`O 6,9 0 0322
+'O 6,9 0 0323
+^O 6,9 0 0324
+~O 6,9 0 0325
+:O 6,8 0 0326
+tmu 6,6 0 0327
+/O 6,7 0 0330
+`U 6,9 0 0331
+'U 6,9 0 0332
+^U 6,9 0 0333
+:U 6,8 0 0334
+'Y 6,9 0 0335
+TP 6,6 0 0336
+ss 6,7 0 0337
+`a 6,8 0 0340
+'a 6,8 0 0341
+^a 6,8 0 0342
+~a 6,8 0 0343
+:a 6,7 0 0344
+oa 6,9 0 0345
+ae 6,5 0 0346
+,c 6,5,2 0 0347
+`e 6,8 0 0350
+'e 6,8 0 0351
+^e 6,8 0 0352
+:e 6,7 0 0353
+`i 6,8 0 0354
+'i 6,8 0 0355
+^i 6,8 0 0356
+:i 6,7 0 0357
+Sd 6,8 0 0360
+~n 6,8 0 0361
+`o 6,8 0 0362
+'o 6,8 0 0363
+^o 6,8 0 0364
+~o 6,8 0 0365
+:o 6,7 0 0366
+tdi 6,6 0 0367
+/o 6,5 0 0370
+`u 6,8 0 0371
+'u 6,8 0 0372
+^u 6,8 0 0373
+:u 6,7 0 0374
+'y 6,8,2 0 0375
+Tp 6,7,2 0 0376
+:y 6,7,2 0 0377
diff --git a/font/devX75/CI b/font/devX75/CI
new file mode 100644
index 0000000..50cfd62
--- /dev/null
+++ b/font/devX75/CI
@@ -0,0 +1,215 @@
+name CI
+spacewidth 6
+charset
+--- 6,5 0 00
+--- 6,1 0 040
+! 6,7 0 041
+" 6,7 0 042
+dq "
+# 6,7 0 043
+sh "
+$ 6,7,1 0 044
+Do "
+% 6,7 0 045
+& 6,6 0 046
+' 6,7 0 047
+aq "
+cq "
+oq "
+( 6,7,1 0 050
+) 6,7,1 0 051
+* 6,7 0 052
++ 6,6 0 053
+, 6,1,2 0 054
+\- 6,4 0 055
+. 6,1 0 056
+/ 6,7,1 0 057
+sl "
+0 6,7 0 060
+1 6,7 0 061
+2 6,7 0 062
+3 6,7 0 063
+4 6,7 0 064
+5 6,7 0 065
+6 6,7 0 066
+7 6,7 0 067
+8 6,7 0 070
+9 6,7 0 071
+: 6,4 0 072
+; 6,4,2 0 073
+< 6,6 0 074
+= 6,5 0 075
+> 6,6 0 076
+? 6,6 0 077
+@ 6,7 0 0100
+at "
+A 6,6 0 0101
+B 6,6 0 0102
+C 6,6 0 0103
+D 6,6 0 0104
+E 6,6 0 0105
+F 6,6 0 0106
+G 6,6 0 0107
+H 6,6 0 0110
+I 6,6 0 0111
+J 6,6 0 0112
+K 6,6 0 0113
+L 6,6 0 0114
+M 6,6 0 0115
+N 6,6 0 0116
+O 6,6 0 0117
+P 6,6 0 0120
+Q 6,6,2 0 0121
+R 6,6 0 0122
+S 6,6 0 0123
+T 6,6 0 0124
+U 6,6 0 0125
+V 6,6 0 0126
+W 6,6 0 0127
+X 6,6 0 0130
+Y 6,6 0 0131
+Z 6,6 0 0132
+[ 6,7,1 0 0133
+lB "
+\ 6,7,1 0 0134
+rs "
+] 6,7,1 0 0135
+rB "
+^ 6,7 0 0136
+a^ "
+ha "
+_ 6,0,2 0 0137
+` 6,8 0 0140
+ga "
+a 6,5 0 0141
+b 6,7 0 0142
+c 6,5 0 0143
+d 6,7 0 0144
+e 6,5 0 0145
+f 6,7 0 0146
+g 6,5,2 0 0147
+h 6,7 0 0150
+i 6,7 0 0151
+j 6,7,2 0 0152
+k 6,7 0 0153
+l 6,7 0 0154
+m 6,5 0 0155
+n 6,5 0 0156
+o 6,5 0 0157
+p 6,5,2 0 0160
+q 6,5,2 0 0161
+r 6,5 0 0162
+s 6,5 0 0163
+t 6,7 0 0164
+u 6,5 0 0165
+v 6,5 0 0166
+w 6,5 0 0167
+x 6,5 0 0170
+y 6,5,2 0 0171
+z 6,5 0 0172
+{ 6,7,1 0 0173
+lC "
+| 6,7,1 0 0174
+ba "
+} 6,7,1 0 0175
+rC "
+~ 6,5 0 0176
+a~ "
+ti "
+--- 6,1 0 0240
+r! 6,5,2 0 0241
+ct 6,6 0 0242
+Po 6,7 0 0243
+Cs 6,6 0 0244
+Ye 6,6 0 0245
+bb 6,7,2 0 0246
+sc 6,7,1 0 0247
+ad 6,7 0 0250
+co 6,7 0 0251
+Of 6,7 0 0252
+Fo 6,4 0 0253
+tno 6,5 0 0254
+- 6,4 0 0255
+hy "
+rg 6,7 0 0256
+a- 6,7 0 0257
+de 6,7 0 0260
+t+- 6,6 0 0261
+S2 6,7 0 0262
+S3 6,7 0 0263
+aa 6,8 0 0264
+mc 6,5,2 0 0265
+ps 6,7,1 0 0266
+pc 6,4 0 0267
+ac 6,0,2 0 0270
+S1 6,7 0 0271
+Om 6,7 0 0272
+Fc 6,4 0 0273
+14 6,8,1 0 0274
+12 6,8,1 0 0275
+34 6,8,1 0 0276
+r? 6,4,2 0 0277
+`A 6,9 0 0300
+'A 6,9 0 0301
+^A 6,9 0 0302
+~A 6,9 0 0303
+:A 6,8 0 0304
+oA 6,9 0 0305
+AE 6,6 0 0306
+,C 6,6,2 0 0307
+`E 6,9 0 0310
+'E 6,9 0 0311
+^E 6,9 0 0312
+:E 6,8 0 0313
+`I 6,9 0 0314
+'I 6,9 0 0315
+^I 6,9 0 0316
+:I 6,8 0 0317
+-D 6,6 0 0320
+~N 6,9 0 0321
+`O 6,9 0 0322
+'O 6,9 0 0323
+^O 6,9 0 0324
+~O 6,9 0 0325
+:O 6,8 0 0326
+tmu 6,6 0 0327
+/O 6,6 0 0330
+`U 6,9 0 0331
+'U 6,9 0 0332
+^U 6,9 0 0333
+:U 6,8 0 0334
+'Y 6,9 0 0335
+TP 6,6 0 0336
+ss 6,7 0 0337
+`a 6,8 0 0340
+'a 6,8 0 0341
+^a 6,8 0 0342
+~a 6,8 0 0343
+:a 6,7 0 0344
+oa 6,9 0 0345
+ae 6,5 0 0346
+,c 6,5,2 0 0347
+`e 6,8 0 0350
+'e 6,8 0 0351
+^e 6,8 0 0352
+:e 6,7 0 0353
+`i 6,8 0 0354
+'i 6,8 0 0355
+^i 6,8 0 0356
+:i 6,7 0 0357
+Sd 6,8 0 0360
+~n 6,8 0 0361
+`o 6,8 0 0362
+'o 6,8 0 0363
+^o 6,8 0 0364
+~o 6,8 0 0365
+:o 6,7 0 0366
+tdi 6,6 0 0367
+/o 6,6,1 0 0370
+`u 6,8 0 0371
+'u 6,8 0 0372
+^u 6,8 0 0373
+:u 6,7 0 0374
+'y 6,8,2 0 0375
+Tp 6,7,2 0 0376
+:y 6,7,2 0 0377
diff --git a/font/devX75/CR b/font/devX75/CR
new file mode 100644
index 0000000..7273b40
--- /dev/null
+++ b/font/devX75/CR
@@ -0,0 +1,215 @@
+name CR
+spacewidth 6
+charset
+--- 6,5 0 00
+--- 6,1 0 040
+! 6,7 0 041
+" 6,7 0 042
+dq "
+# 6,7 0 043
+sh "
+$ 6,7,1 0 044
+Do "
+% 6,6 0 045
+& 6,6 0 046
+' 6,7 0 047
+aq "
+cq "
+oq "
+( 6,7,2 0 050
+) 6,7,2 0 051
+* 6,7 0 052
++ 6,6 0 053
+, 6,1,2 0 054
+\- 6,4 0 055
+. 6,1 0 056
+/ 6,7,1 0 057
+sl "
+0 6,7 0 060
+1 6,7 0 061
+2 6,7 0 062
+3 6,7 0 063
+4 6,7 0 064
+5 6,7 0 065
+6 6,7 0 066
+7 6,7 0 067
+8 6,7 0 070
+9 6,7 0 071
+: 6,4 0 072
+; 6,4,2 0 073
+< 6,6 0 074
+= 6,5 0 075
+> 6,6 0 076
+? 6,6 0 077
+@ 6,7,1 0 0100
+at "
+A 6,6 0 0101
+B 6,6 0 0102
+C 6,6 0 0103
+D 6,6 0 0104
+E 6,6 0 0105
+F 6,6 0 0106
+G 6,6 0 0107
+H 6,6 0 0110
+I 6,6 0 0111
+J 6,6 0 0112
+K 6,6 0 0113
+L 6,6 0 0114
+M 6,6 0 0115
+N 6,6 0 0116
+O 6,6 0 0117
+P 6,6 0 0120
+Q 6,6,1 0 0121
+R 6,6 0 0122
+S 6,6 0 0123
+T 6,6 0 0124
+U 6,6 0 0125
+V 6,6 0 0126
+W 6,6 0 0127
+X 6,6 0 0130
+Y 6,6 0 0131
+Z 6,6 0 0132
+[ 6,7,2 0 0133
+lB "
+\ 6,7,1 0 0134
+rs "
+] 6,7,2 0 0135
+rB "
+^ 6,7 0 0136
+a^ "
+ha "
+_ 6,0,2 0 0137
+` 6,8 0 0140
+ga "
+a 6,5 0 0141
+b 6,7 0 0142
+c 6,5 0 0143
+d 6,7 0 0144
+e 6,5 0 0145
+f 6,7 0 0146
+g 6,5,2 0 0147
+h 6,7 0 0150
+i 6,7 0 0151
+j 6,7,2 0 0152
+k 6,7 0 0153
+l 6,7 0 0154
+m 6,5 0 0155
+n 6,5 0 0156
+o 6,5 0 0157
+p 6,5,2 0 0160
+q 6,5,2 0 0161
+r 6,5 0 0162
+s 6,5 0 0163
+t 6,7 0 0164
+u 6,5 0 0165
+v 6,5 0 0166
+w 6,5 0 0167
+x 6,5 0 0170
+y 6,5,2 0 0171
+z 6,5 0 0172
+{ 6,7,2 0 0173
+lC "
+| 6,7,2 0 0174
+ba "
+} 6,7,2 0 0175
+rC "
+~ 6,5 0 0176
+a~ "
+ti "
+--- 6,1 0 0240
+r! 6,5,2 0 0241
+ct 6,7,1 0 0242
+Po 6,7 0 0243
+Cs 6,6 0 0244
+Ye 6,7 0 0245
+bb 6,7,2 0 0246
+sc 6,6,1 0 0247
+ad 6,7 0 0250
+co 6,7 0 0251
+Of 6,6 0 0252
+Fo 6,4 0 0253
+tno 6,5 0 0254
+- 6,4 0 0255
+hy "
+rg 6,7 0 0256
+a- 6,7 0 0257
+de 6,7 0 0260
+t+- 6,6 0 0261
+S2 6,7 0 0262
+S3 6,7 0 0263
+aa 6,8 0 0264
+mc 6,5,2 0 0265
+ps 6,6,1 0 0266
+pc 6,4 0 0267
+ac 6,1,2 0 0270
+S1 6,7 0 0271
+Om 6,6 0 0272
+Fc 6,4 0 0273
+14 6,8,1 0 0274
+12 6,8,1 0 0275
+34 6,8,1 0 0276
+r? 6,4,2 0 0277
+`A 6,9 0 0300
+'A 6,9 0 0301
+^A 6,9 0 0302
+~A 6,9 0 0303
+:A 6,8 0 0304
+oA 6,9 0 0305
+AE 6,6 0 0306
+,C 6,6,2 0 0307
+`E 6,9 0 0310
+'E 6,9 0 0311
+^E 6,9 0 0312
+:E 6,8 0 0313
+`I 6,9 0 0314
+'I 6,9 0 0315
+^I 6,9 0 0316
+:I 6,8 0 0317
+-D 6,6 0 0320
+~N 6,9 0 0321
+`O 6,9 0 0322
+'O 6,9 0 0323
+^O 6,9 0 0324
+~O 6,9 0 0325
+:O 6,8 0 0326
+tmu 6,6 0 0327
+/O 6,6 0 0330
+`U 6,9 0 0331
+'U 6,9 0 0332
+^U 6,9 0 0333
+:U 6,8 0 0334
+'Y 6,9 0 0335
+TP 6,6 0 0336
+ss 6,7 0 0337
+`a 6,8 0 0340
+'a 6,8 0 0341
+^a 6,8 0 0342
+~a 6,8 0 0343
+:a 6,7 0 0344
+oa 6,9 0 0345
+ae 6,5 0 0346
+,c 6,5,2 0 0347
+`e 6,8 0 0350
+'e 6,8 0 0351
+^e 6,8 0 0352
+:e 6,7 0 0353
+`i 6,8 0 0354
+'i 6,8 0 0355
+^i 6,8 0 0356
+:i 6,7 0 0357
+Sd 6,8 0 0360
+~n 6,8 0 0361
+`o 6,8 0 0362
+'o 6,8 0 0363
+^o 6,8 0 0364
+~o 6,8 0 0365
+:o 6,7 0 0366
+tdi 6,6 0 0367
+/o 6,5 0 0370
+`u 6,8 0 0371
+'u 6,8 0 0372
+^u 6,8 0 0373
+:u 6,7 0 0374
+'y 6,8,2 0 0375
+Tp 6,7,2 0 0376
+:y 6,7,2 0 0377
diff --git a/font/devX75/DESC b/font/devX75/DESC
new file mode 100644
index 0000000..172170c
--- /dev/null
+++ b/font/devX75/DESC
@@ -0,0 +1,9 @@
+styles R I B BI
+fonts 6 0 0 0 0 0 S
+sizes 8 10 12 14 18 24 0
+res 75
+X11
+hor 1
+vert 1
+unitwidth 10
+postpro gxditview
diff --git a/font/devX75/HB b/font/devX75/HB
new file mode 100644
index 0000000..8f92729
--- /dev/null
+++ b/font/devX75/HB
@@ -0,0 +1,215 @@
+name HB
+spacewidth 3
+charset
+--- 7,7 0 00
+--- 3,1 0 040
+! 4,8 0 041
+" 5,8 0 042
+dq "
+# 6,7 0 043
+sh "
+$ 6,8,1 0 044
+Do "
+% 8,8 0 045
+& 8,8 0 046
+' 3,8 0 047
+aq "
+cq "
+oq "
+( 4,8,2 0 050
+) 4,8,2 0 051
+* 4,8 0 052
++ 6,6 0 053
+, 3,2,2 0 054
+\- 5,4 0 055
+. 3,2 0 056
+/ 4,8 0 057
+sl "
+0 6,8 0 060
+1 6,8 0 061
+2 6,8 0 062
+3 6,8 0 063
+4 6,8 0 064
+5 6,8 0 065
+6 6,8 0 066
+7 6,8 0 067
+8 6,8 0 070
+9 6,8 0 071
+: 3,6 0 072
+; 3,6,2 0 073
+< 5,6 0 074
+= 6,5 0 075
+> 5,6 0 076
+? 6,8 0 077
+@ 11,7,2 0 0100
+at "
+A 8,8 0 0101
+B 7,8 0 0102
+C 8,8 0 0103
+D 7,8 0 0104
+E 6,8 0 0105
+F 6,8 0 0106
+G 8,8 0 0107
+H 7,8 0 0110
+I 3,8 0 0111
+J 6,8 0 0112
+K 7,8 0 0113
+L 6,8 0 0114
+M 10,8 0 0115
+N 8,8 0 0116
+O 8,8 0 0117
+P 7,8 0 0120
+Q 8,8,1 0 0121
+R 7,8 0 0122
+S 7,8 0 0123
+T 7,8 0 0124
+U 7,8 0 0125
+V 8,8 0 0126
+W 11,8 0 0127
+X 8,8 0 0130
+Y 9,8 0 0131
+Z 7,8 0 0132
+[ 4,8,2 0 0133
+lB "
+\ 4,8 0 0134
+rs "
+] 4,8,2 0 0135
+rB "
+^ 5,8 0 0136
+a^ "
+ha "
+_ 6,0,2 0 0137
+` 3,8 0 0140
+ga "
+a 6,6 0 0141
+b 6,8 0 0142
+c 5,6 0 0143
+d 6,8 0 0144
+e 6,6 0 0145
+f 4,8 0 0146
+g 6,6,2 0 0147
+h 6,8 0 0150
+i 3,8 0 0151
+j 3,8,2 0 0152
+k 6,8 0 0153
+l 3,8 0 0154
+m 9,6 0 0155
+n 6,6 0 0156
+o 6,6 0 0157
+p 6,6,2 0 0160
+q 6,6,2 0 0161
+r 4,6 0 0162
+s 6,6 0 0163
+t 4,8 0 0164
+u 6,6 0 0165
+v 6,6 0 0166
+w 8,6 0 0167
+x 7,6 0 0170
+y 6,6,2 0 0171
+z 6,6 0 0172
+{ 5,8,2 0 0173
+lC "
+| 3,8,2 0 0174
+ba "
+} 5,8,2 0 0175
+rC "
+~ 6,4 0 0176
+a~ "
+ti "
+--- 3,1 0 0240
+r! 4,6,2 0 0241
+ct 6,7,1 0 0242
+Po 6,8 0 0243
+Cs 6,7 0 0244
+Ye 7,8 0 0245
+bb 3,8,2 0 0246
+sc 6,8,2 0 0247
+ad 3,8 0 0250
+co 10,8 0 0251
+Of 5,8 0 0252
+Fo 7,4 0 0253
+tno 7,5 0 0254
+- 5,4 0 0255
+hy "
+rg 10,8 0 0256
+a- 3,8 0 0257
+de 4,7 0 0260
+t+- 6,7 0 0261
+S2 3,7 0 0262
+S3 3,7 0 0263
+aa 3,9 0 0264
+mc 6,6,2 0 0265
+ps 6,8,2 0 0266
+pc 3,4 0 0267
+ac 3,0,2 0 0270
+S1 3,7 0 0271
+Om 5,8 0 0272
+Fc 7,4 0 0273
+14 9,8 0 0274
+12 9,8 0 0275
+34 9,8 0 0276
+r? 6,6,2 0 0277
+`A 8,11 0 0300
+'A 8,11 0 0301
+^A 8,11 0 0302
+~A 8,11 0 0303
+:A 8,10 0 0304
+oA 8,11 0 0305
+AE 10,8 0 0306
+,C 8,8,2 0 0307
+`E 6,11 0 0310
+'E 6,11 0 0311
+^E 6,11 0 0312
+:E 6,10 0 0313
+`I 3,11 0 0314
+'I 3,11 0 0315
+^I 3,11 0 0316
+:I 3,10 0 0317
+-D 7,8 0 0320
+~N 8,11 0 0321
+`O 8,11 0 0322
+'O 8,11 0 0323
+^O 8,11 0 0324
+~O 8,11 0 0325
+:O 8,10 0 0326
+tmu 6,6 0 0327
+/O 8,8 0 0330
+`U 7,11 0 0331
+'U 7,11 0 0332
+^U 7,11 0 0333
+:U 7,10 0 0334
+'Y 9,11 0 0335
+TP 7,8 0 0336
+ss 6,8 0 0337
+`a 6,9 0 0340
+'a 6,9 0 0341
+^a 6,9 0 0342
+~a 6,9 0 0343
+:a 6,9 0 0344
+oa 6,9 0 0345
+ae 9,6 0 0346
+,c 5,6,2 0 0347
+`e 6,9 0 0350
+'e 6,9 0 0351
+^e 6,9 0 0352
+:e 6,9 0 0353
+`i 3,9 0 0354
+'i 3,9 0 0355
+^i 3,9 0 0356
+:i 3,9 0 0357
+Sd 6,9 0 0360
+~n 6,9 0 0361
+`o 6,9 0 0362
+'o 6,9 0 0363
+^o 6,9 0 0364
+~o 6,9 0 0365
+:o 6,9 0 0366
+tdi 6,6 0 0367
+/o 6,6 0 0370
+`u 6,9 0 0371
+'u 6,9 0 0372
+^u 6,9 0 0373
+:u 6,9 0 0374
+'y 6,9,2 0 0375
+Tp 6,8,2 0 0376
+:y 6,9,2 0 0377
diff --git a/font/devX75/HBI b/font/devX75/HBI
new file mode 100644
index 0000000..943ee67
--- /dev/null
+++ b/font/devX75/HBI
@@ -0,0 +1,215 @@
+name HBI
+spacewidth 3
+charset
+--- 7,7 0 00
+--- 3,1 0 040
+! 4,8 0 041
+" 6,8 0 042
+dq "
+# 7,7 0 043
+sh "
+$ 6,8,1 0 044
+Do "
+% 9,8 0 045
+& 8,8 0 046
+' 3,8 0 047
+aq "
+cq "
+oq "
+( 5,8,2 0 050
+) 5,8,2 0 051
+* 6,8 0 052
++ 6,6 0 053
+, 3,2,2 0 054
+\- 5,4 0 055
+. 3,2 0 056
+/ 5,8 0 057
+sl "
+0 6,8 0 060
+1 6,8 0 061
+2 6,8 0 062
+3 6,8 0 063
+4 6,8 0 064
+5 6,8 0 065
+6 6,8 0 066
+7 6,8 0 067
+8 6,8 0 070
+9 6,8 0 071
+: 3,6 0 072
+; 3,6,2 0 073
+< 6,6 0 074
+= 6,5 0 075
+> 7,6 0 076
+? 6,8 0 077
+@ 10,7,2 0 0100
+at "
+A 8,8 0 0101
+B 7,8 0 0102
+C 7,8 0 0103
+D 8,8 0 0104
+E 6,8 0 0105
+F 5,8 0 0106
+G 8,8 0 0107
+H 7,8 0 0110
+I 3,8 0 0111
+J 6,8 0 0112
+K 8,8 0 0113
+L 6,8 0 0114
+M 10,8 0 0115
+N 8,8 0 0116
+O 8,8 0 0117
+P 7,8 0 0120
+Q 8,8 0 0121
+R 8,8 0 0122
+S 7,8 0 0123
+T 6,8 0 0124
+U 7,8 0 0125
+V 8,8 0 0126
+W 10,8 0 0127
+X 7,8 0 0130
+Y 7,8 0 0131
+Z 7,8 0 0132
+[ 4,8,2 0 0133
+lB "
+\ 5,8 0 0134
+rs "
+] 4,8,2 0 0135
+rB "
+^ 6,8 0 0136
+a^ "
+ha "
+_ 6,0,2 0 0137
+` 3,8 0 0140
+ga "
+a 6,6 0 0141
+b 6,8 0 0142
+c 5,6 0 0143
+d 6,8 0 0144
+e 6,6 0 0145
+f 3,8 0 0146
+g 6,6,2 0 0147
+h 6,8 0 0150
+i 3,8 0 0151
+j 3,8,2 0 0152
+k 6,8 0 0153
+l 3,8 0 0154
+m 9,6 0 0155
+n 6,6 0 0156
+o 6,6 0 0157
+p 6,6,2 0 0160
+q 6,6,2 0 0161
+r 4,6 0 0162
+s 6,6 0 0163
+t 4,8 0 0164
+u 6,6 0 0165
+v 6,6 0 0166
+w 8,6 0 0167
+x 5,6 0 0170
+y 6,6,2 0 0171
+z 5,6 0 0172
+{ 5,8,2 0 0173
+lC "
+| 4,8,2 0 0174
+ba "
+} 5,8,2 0 0175
+rC "
+~ 6,5 0 0176
+a~ "
+ti "
+--- 3,1 0 0240
+r! 4,6,2 0 0241
+ct 7,7,1 0 0242
+Po 7,7 0 0243
+Cs 6,7 0 0244
+Ye 7,8 0 0245
+bb 4,8,1 0 0246
+sc 7,8,2 0 0247
+ad 4,8 0 0250
+co 10,8 0 0251
+Of 5,8 0 0252
+Fo 8,5 0 0253
+tno 7,5 0 0254
+- 5,4 0 0255
+hy "
+rg 10,8 0 0256
+a- 4,8 0 0257
+de 4,7 0 0260
+t+- 6,7 0 0261
+S2 3,7 0 0262
+S3 3,7 0 0263
+aa 3,9 0 0264
+mc 6,6,2 0 0265
+ps 7,8,2 0 0266
+pc 3,4 0 0267
+ac 3,1,2 0 0270
+S1 3,7 0 0271
+Om 5,8 0 0272
+Fc 8,5 0 0273
+14 9,8 0 0274
+12 9,8 0 0275
+34 9,8 0 0276
+r? 6,6,2 0 0277
+`A 8,11 0 0300
+'A 8,11 0 0301
+^A 8,11 0 0302
+~A 8,11 0 0303
+:A 8,10 0 0304
+oA 8,11 0 0305
+AE 10,8 0 0306
+,C 7,8,2 0 0307
+`E 6,11 0 0310
+'E 6,11 0 0311
+^E 6,11 0 0312
+:E 6,10 0 0313
+`I 3,11 0 0314
+'I 3,11 0 0315
+^I 3,11 0 0316
+:I 3,10 0 0317
+-D 8,8 0 0320
+~N 8,11 0 0321
+`O 8,11 0 0322
+'O 8,11 0 0323
+^O 8,11 0 0324
+~O 8,11 0 0325
+:O 8,10 0 0326
+tmu 6,6 0 0327
+/O 8,8 0 0330
+`U 7,11 0 0331
+'U 7,11 0 0332
+^U 7,11 0 0333
+:U 7,10 0 0334
+'Y 7,11 0 0335
+TP 7,8 0 0336
+ss 7,8 0 0337
+`a 6,9 0 0340
+'a 6,9 0 0341
+^a 6,9 0 0342
+~a 6,9 0 0343
+:a 6,8 0 0344
+oa 6,9 0 0345
+ae 9,6 0 0346
+,c 5,6,2 0 0347
+`e 6,9 0 0350
+'e 6,9 0 0351
+^e 6,9 0 0352
+:e 6,8 0 0353
+`i 3,9 0 0354
+'i 3,9 0 0355
+^i 3,9 0 0356
+:i 3,8 0 0357
+Sd 6,9 0 0360
+~n 6,9 0 0361
+`o 6,9 0 0362
+'o 6,9 0 0363
+^o 6,9 0 0364
+~o 6,9 0 0365
+:o 6,8 0 0366
+tdi 6,6 0 0367
+/o 8,6 0 0370
+`u 6,9 0 0371
+'u 6,9 0 0372
+^u 6,9 0 0373
+:u 6,8 0 0374
+'y 6,9,2 0 0375
+Tp 6,8,2 0 0376
+:y 6,8,2 0 0377
diff --git a/font/devX75/HI b/font/devX75/HI
new file mode 100644
index 0000000..03ae2ea
--- /dev/null
+++ b/font/devX75/HI
@@ -0,0 +1,215 @@
+name HI
+spacewidth 3
+charset
+--- 8,7 0 00
+--- 3,1 0 040
+! 4,8 0 041
+" 4,8 0 042
+dq "
+# 7,7 0 043
+sh "
+$ 6,8,1 0 044
+Do "
+% 9,8 0 045
+& 8,8 0 046
+' 2,8 0 047
+aq "
+cq "
+oq "
+( 4,8,2 0 050
+) 4,8,2 0 051
+* 4,8 0 052
++ 6,6 0 053
+, 3,1,2 0 054
+\- 6,4 0 055
+. 3,1 0 056
+/ 3,8 0 057
+sl "
+0 6,8 0 060
+1 6,8 0 061
+2 6,8 0 062
+3 6,8 0 063
+4 6,8 0 064
+5 6,8 0 065
+6 6,8 0 066
+7 6,8 0 067
+8 6,8 0 070
+9 6,8 0 071
+: 3,6 0 072
+; 3,6,2 0 073
+< 6,6 0 074
+= 7,5 0 075
+> 6,6 0 076
+? 6,8 0 077
+@ 11,8,2 0 0100
+at "
+A 7,8 0 0101
+B 7,8 0 0102
+C 8,8 0 0103
+D 8,8 0 0104
+E 7,8 0 0105
+F 6,8 0 0106
+G 8,8 0 0107
+H 8,8 0 0110
+I 3,8 0 0111
+J 5,8 0 0112
+K 7,8 0 0113
+L 5,8 0 0114
+M 9,8 0 0115
+N 8,8 0 0116
+O 8,8 0 0117
+P 7,8 0 0120
+Q 8,8,1 0 0121
+R 7,8 0 0122
+S 7,8 0 0123
+T 5,8 0 0124
+U 8,8 0 0125
+V 7,8 0 0126
+W 10,8 0 0127
+X 7,8 0 0130
+Y 7,8 0 0131
+Z 7,8 0 0132
+[ 4,8,2 0 0133
+lB "
+\ 3,8 0 0134
+rs "
+] 4,8,2 0 0135
+rB "
+^ 6,7 0 0136
+a^ "
+ha "
+_ 6,0,2 0 0137
+` 3,8 0 0140
+ga "
+a 5,6 0 0141
+b 5,8 0 0142
+c 5,6 0 0143
+d 5,8 0 0144
+e 5,6 0 0145
+f 4,8 0 0146
+g 5,6,2 0 0147
+h 6,8 0 0150
+i 2,8 0 0151
+j 2,8,2 0 0152
+k 5,8 0 0153
+l 2,8 0 0154
+m 8,6 0 0155
+n 6,6 0 0156
+o 6,6 0 0157
+p 5,6,2 0 0160
+q 5,6,2 0 0161
+r 4,6 0 0162
+s 5,6 0 0163
+t 4,8 0 0164
+u 5,6 0 0165
+v 6,6 0 0166
+w 8,6 0 0167
+x 6,6 0 0170
+y 5,6,2 0 0171
+z 5,6 0 0172
+{ 4,8,2 0 0173
+lC "
+| 3,8,2 0 0174
+ba "
+} 4,8,2 0 0175
+rC "
+~ 7,5 0 0176
+a~ "
+ti "
+--- 3,1 0 0240
+r! 4,6,2 0 0241
+ct 7,7,1 0 0242
+Po 6,8 0 0243
+Cs 6,7 0 0244
+Ye 6,8 0 0245
+bb 3,8,2 0 0246
+sc 6,8,2 0 0247
+ad 3,8 0 0250
+co 10,8 0 0251
+Of 5,8 0 0252
+Fo 8,5 0 0253
+tno 7,5 0 0254
+- 6,4 0 0255
+hy "
+rg 10,8 0 0256
+a- 3,8 0 0257
+de 4,7 0 0260
+t+- 6,7 0 0261
+S2 3,8 0 0262
+S3 3,8 0 0263
+aa 3,9 0 0264
+mc 5,6,2 0 0265
+ps 6,8,2 0 0266
+pc 3,5 0 0267
+ac 3,1,2 0 0270
+S1 3,8 0 0271
+Om 5,8 0 0272
+Fc 8,5 0 0273
+14 9,8,1 0 0274
+12 9,8,1 0 0275
+34 9,8,1 0 0276
+r? 6,6,2 0 0277
+`A 7,11 0 0300
+'A 7,11 0 0301
+^A 7,11 0 0302
+~A 7,11 0 0303
+:A 7,10 0 0304
+oA 7,11 0 0305
+AE 10,8 0 0306
+,C 8,8,2 0 0307
+`E 7,11 0 0310
+'E 7,11 0 0311
+^E 7,11 0 0312
+:E 7,10 0 0313
+`I 3,11 0 0314
+'I 3,11 0 0315
+^I 3,11 0 0316
+:I 3,10 0 0317
+-D 8,8 0 0320
+~N 8,11 0 0321
+`O 8,11 0 0322
+'O 8,11 0 0323
+^O 8,11 0 0324
+~O 8,11 0 0325
+:O 8,10 0 0326
+tmu 6,6 0 0327
+/O 8,8 0 0330
+`U 8,11 0 0331
+'U 8,11 0 0332
+^U 8,11 0 0333
+:U 8,10 0 0334
+'Y 7,11 0 0335
+TP 7,8 0 0336
+ss 6,8 0 0337
+`a 5,9 0 0340
+'a 5,9 0 0341
+^a 5,9 0 0342
+~a 5,9 0 0343
+:a 5,8 0 0344
+oa 5,9 0 0345
+ae 8,6 0 0346
+,c 5,6,2 0 0347
+`e 5,9 0 0350
+'e 5,9 0 0351
+^e 5,9 0 0352
+:e 5,8 0 0353
+`i 2,9 0 0354
+'i 2,9 0 0355
+^i 2,9 0 0356
+:i 2,8 0 0357
+Sd 6,9 0 0360
+~n 6,9 0 0361
+`o 6,9 0 0362
+'o 6,9 0 0363
+^o 6,9 0 0364
+~o 6,9 0 0365
+:o 6,8 0 0366
+tdi 6,6 0 0367
+/o 6,6 0 0370
+`u 5,9 0 0371
+'u 5,9 0 0372
+^u 5,9 0 0373
+:u 5,8 0 0374
+'y 5,9,2 0 0375
+Tp 5,8,2 0 0376
+:y 5,8,2 0 0377
diff --git a/font/devX75/HR b/font/devX75/HR
new file mode 100644
index 0000000..bd871e9
--- /dev/null
+++ b/font/devX75/HR
@@ -0,0 +1,215 @@
+name HR
+spacewidth 3
+charset
+--- 8,7 0 00
+--- 3,1 0 040
+! 3,8 0 041
+" 4,8 0 042
+dq "
+# 6,7 0 043
+sh "
+$ 6,8,1 0 044
+Do "
+% 9,8 0 045
+& 8,8 0 046
+' 2,8 0 047
+aq "
+cq "
+oq "
+( 4,8,2 0 050
+) 4,8,2 0 051
+* 4,8 0 052
++ 6,6 0 053
+, 3,1,2 0 054
+\- 4,4 0 055
+. 3,1 0 056
+/ 3,8 0 057
+sl "
+0 6,8 0 060
+1 6,8 0 061
+2 6,8 0 062
+3 6,8 0 063
+4 6,8 0 064
+5 6,8 0 065
+6 6,8 0 066
+7 6,8 0 067
+8 6,8 0 070
+9 6,8 0 071
+: 3,6 0 072
+; 3,6,2 0 073
+< 6,6 0 074
+= 5,5 0 075
+> 6,6 0 076
+? 6,8 0 077
+@ 11,8,2 0 0100
+at "
+A 7,8 0 0101
+B 7,8 0 0102
+C 8,8 0 0103
+D 8,8 0 0104
+E 7,8 0 0105
+F 6,8 0 0106
+G 8,8 0 0107
+H 8,8 0 0110
+I 3,8 0 0111
+J 5,8 0 0112
+K 7,8 0 0113
+L 6,8 0 0114
+M 9,8 0 0115
+N 8,8 0 0116
+O 8,8 0 0117
+P 7,8 0 0120
+Q 8,8,1 0 0121
+R 7,8 0 0122
+S 7,8 0 0123
+T 5,8 0 0124
+U 8,8 0 0125
+V 7,8 0 0126
+W 9,8 0 0127
+X 7,8 0 0130
+Y 7,8 0 0131
+Z 7,8 0 0132
+[ 3,8,2 0 0133
+lB "
+\ 3,8 0 0134
+rs "
+] 3,8,2 0 0135
+rB "
+^ 6,8 0 0136
+a^ "
+ha "
+_ 6,0,2 0 0137
+` 3,8 0 0140
+ga "
+a 5,6 0 0141
+b 6,8 0 0142
+c 5,6 0 0143
+d 6,8 0 0144
+e 5,6 0 0145
+f 4,8 0 0146
+g 6,6,2 0 0147
+h 6,8 0 0150
+i 2,8 0 0151
+j 2,8,1 0 0152
+k 5,8 0 0153
+l 2,8 0 0154
+m 8,6 0 0155
+n 6,6 0 0156
+o 6,6 0 0157
+p 6,6,2 0 0160
+q 6,6,2 0 0161
+r 4,6 0 0162
+s 5,6 0 0163
+t 4,8 0 0164
+u 5,6 0 0165
+v 6,6 0 0166
+w 8,6 0 0167
+x 6,6 0 0170
+y 5,6,2 0 0171
+z 5,6 0 0172
+{ 3,8,2 0 0173
+lC "
+| 3,8,2 0 0174
+ba "
+} 3,8,2 0 0175
+rC "
+~ 7,5 0 0176
+a~ "
+ti "
+--- 3,1 0 0240
+r! 3,6,2 0 0241
+ct 6,7,1 0 0242
+Po 6,8 0 0243
+Cs 5,7 0 0244
+Ye 6,8 0 0245
+bb 3,8,2 0 0246
+sc 6,8,2 0 0247
+ad 3,8 0 0250
+co 9,7 0 0251
+Of 4,8 0 0252
+Fo 6,5 0 0253
+tno 7,5 0 0254
+- 4,4 0 0255
+hy "
+rg 9,7 0 0256
+a- 3,8 0 0257
+de 4,7 0 0260
+t+- 6,7 0 0261
+S2 3,7 0 0262
+S3 3,7 0 0263
+aa 3,8 0 0264
+mc 5,6,2 0 0265
+ps 6,8,2 0 0266
+pc 3,4 0 0267
+ac 3,0,2 0 0270
+S1 3,7 0 0271
+Om 4,8 0 0272
+Fc 6,5 0 0273
+14 9,8 0 0274
+12 9,8 0 0275
+34 9,8 0 0276
+r? 6,6,2 0 0277
+`A 7,11 0 0300
+'A 7,11 0 0301
+^A 7,11 0 0302
+~A 7,11 0 0303
+:A 7,10 0 0304
+oA 7,11 0 0305
+AE 10,8 0 0306
+,C 8,8,2 0 0307
+`E 7,11 0 0310
+'E 7,11 0 0311
+^E 7,11 0 0312
+:E 7,10 0 0313
+`I 3,11 0 0314
+'I 3,11 0 0315
+^I 3,11 0 0316
+:I 3,10 0 0317
+-D 8,8 0 0320
+~N 8,11 0 0321
+`O 8,11 0 0322
+'O 8,11 0 0323
+^O 8,11 0 0324
+~O 8,11 0 0325
+:O 8,10 0 0326
+tmu 6,6 0 0327
+/O 8,9,1 0 0330
+`U 8,11 0 0331
+'U 8,11 0 0332
+^U 8,11 0 0333
+:U 8,10 0 0334
+'Y 7,11 0 0335
+TP 7,8 0 0336
+ss 5,8 0 0337
+`a 5,9 0 0340
+'a 5,9 0 0341
+^a 5,9 0 0342
+~a 5,9 0 0343
+:a 5,8 0 0344
+oa 5,9 0 0345
+ae 8,6 0 0346
+,c 5,6,2 0 0347
+`e 5,9 0 0350
+'e 5,9 0 0351
+^e 5,9 0 0352
+:e 5,8 0 0353
+`i 2,9 0 0354
+'i 2,9 0 0355
+^i 2,9 0 0356
+:i 2,8 0 0357
+Sd 6,9 0 0360
+~n 5,9 0 0361
+`o 6,9 0 0362
+'o 6,9 0 0363
+^o 6,9 0 0364
+~o 6,9 0 0365
+:o 6,8 0 0366
+tdi 6,6 0 0367
+/o 6,6 0 0370
+`u 5,9 0 0371
+'u 5,9 0 0372
+^u 5,9 0 0373
+:u 5,8 0 0374
+'y 5,9,2 0 0375
+Tp 6,8,2 0 0376
+:y 5,8,2 0 0377
diff --git a/font/devX75/NB b/font/devX75/NB
new file mode 100644
index 0000000..04717fa
--- /dev/null
+++ b/font/devX75/NB
@@ -0,0 +1,215 @@
+name NB
+spacewidth 2
+charset
+--- 10,7 0 00
+--- 2,1 0 040
+! 3,8 0 041
+" 6,8 0 042
+dq "
+# 8,8 0 043
+sh "
+$ 6,9,1 0 044
+Do "
+% 11,8 0 045
+& 9,8 0 046
+' 4,8 0 047
+aq "
+cq "
+oq "
+( 5,8,2 0 050
+) 5,8,2 0 051
+* 6,8 0 052
++ 6,6 0 053
+, 3,2,2 0 054
+\- 4,4 0 055
+. 3,2 0 056
+/ 5,8 0 057
+sl "
+0 6,8 0 060
+1 6,8 0 061
+2 6,8 0 062
+3 6,8 0 063
+4 6,8 0 064
+5 6,8 0 065
+6 6,8 0 066
+7 6,8 0 067
+8 6,8 0 070
+9 6,8 0 071
+: 3,5 0 072
+; 3,5,2 0 073
+< 7,6 0 074
+= 6,5 0 075
+> 7,6 0 076
+? 6,8 0 077
+@ 10,8 0 0100
+at "
+A 8,8 0 0101
+B 8,8 0 0102
+C 8,8 0 0103
+D 9,8 0 0104
+E 7,8 0 0105
+F 7,8 0 0106
+G 8,8 0 0107
+H 10,8 0 0110
+I 5,8 0 0111
+J 7,8 0 0112
+K 9,8 0 0113
+L 7,8 0 0114
+M 12,8 0 0115
+N 9,8 0 0116
+O 8,8 0 0117
+P 8,8 0 0120
+Q 8,8,1 0 0121
+R 9,8 0 0122
+S 7,8 0 0123
+T 7,8 0 0124
+U 9,8 0 0125
+V 9,8 0 0126
+W 12,8 0 0127
+X 9,8 0 0130
+Y 9,8 0 0131
+Z 7,8 0 0132
+[ 4,8,2 0 0133
+lB "
+\ 5,8 0 0134
+rs "
+] 4,8,2 0 0135
+rB "
+^ 6,8 0 0136
+a^ "
+ha "
+_ 5,0,2 0 0137
+` 4,8 0 0140
+ga "
+a 5,5 0 0141
+b 7,8 0 0142
+c 6,5 0 0143
+d 7,8 0 0144
+e 6,5 0 0145
+f 5,8 0 0146
+g 6,6,2 0 0147
+h 7,8 0 0150
+i 5,8 0 0151
+j 5,8,2 0 0152
+k 6,8 0 0153
+l 5,8 0 0154
+m 11,5 0 0155
+n 7,5 0 0156
+o 7,5 0 0157
+p 7,5,2 0 0160
+q 7,5,2 0 0161
+r 5,5 0 0162
+s 5,5 0 0163
+t 4,7 0 0164
+u 7,5 0 0165
+v 7,5 0 0166
+w 10,5 0 0167
+x 7,5 0 0170
+y 7,5,2 0 0171
+z 6,5 0 0172
+{ 5,8,2 0 0173
+lC "
+| 6,8 0 0174
+ba "
+} 5,8,2 0 0175
+rC "
+~ 7,5 0 0176
+a~ "
+ti "
+--- 2,1 0 0240
+r! 3,6,2 0 0241
+ct 6,6,1 0 0242
+Po 8,8 0 0243
+Cs 8,6 0 0244
+Ye 9,8 0 0245
+bb 6,8 0 0246
+sc 5,8,2 0 0247
+ad 4,8 0 0250
+co 9,8 0 0251
+Of 4,8 0 0252
+Fo 7,5 0 0253
+tno 6,5 0 0254
+- 4,4 0 0255
+hy "
+rg 9,8 0 0256
+a- 5,7 0 0257
+de 4,8 0 0260
+t+- 6,6 0 0261
+S2 3,8 0 0262
+S3 3,8 0 0263
+aa 4,8 0 0264
+mc 7,5,2 0 0265
+ps 8,8 0 0266
+pc 3,5 0 0267
+ac 4,1,2 0 0270
+S1 3,8 0 0271
+Om 5,8 0 0272
+Fc 7,5 0 0273
+14 9,8 0 0274
+12 9,8 0 0275
+34 9,8 0 0276
+r? 6,6,2 0 0277
+`A 8,11 0 0300
+'A 8,11 0 0301
+^A 8,11 0 0302
+~A 8,11 0 0303
+:A 8,11 0 0304
+oA 8,11 0 0305
+AE 11,8 0 0306
+,C 8,8,2 0 0307
+`E 7,11 0 0310
+'E 7,11 0 0311
+^E 7,11 0 0312
+:E 7,11 0 0313
+`I 5,11 0 0314
+'I 5,11 0 0315
+^I 5,11 0 0316
+:I 5,11 0 0317
+-D 9,8 0 0320
+~N 9,11 0 0321
+`O 8,11 0 0322
+'O 8,11 0 0323
+^O 8,11 0 0324
+~O 8,11 0 0325
+:O 8,11 0 0326
+tmu 6,6 0 0327
+/O 8,8 0 0330
+`U 9,11 0 0331
+'U 9,11 0 0332
+^U 9,11 0 0333
+:U 9,11 0 0334
+'Y 9,11 0 0335
+TP 8,8 0 0336
+ss 8,8 0 0337
+`a 5,8 0 0340
+'a 5,8 0 0341
+^a 5,9 0 0342
+~a 5,8 0 0343
+:a 5,8 0 0344
+oa 5,8 0 0345
+ae 9,5 0 0346
+,c 6,5,2 0 0347
+`e 6,8 0 0350
+'e 6,8 0 0351
+^e 6,9 0 0352
+:e 6,8 0 0353
+`i 5,8 0 0354
+'i 5,8 0 0355
+^i 5,9 0 0356
+:i 5,8 0 0357
+Sd 7,8 0 0360
+~n 7,8 0 0361
+`o 7,8 0 0362
+'o 7,8 0 0363
+^o 7,9 0 0364
+~o 7,8 0 0365
+:o 7,8 0 0366
+tdi 6,6 0 0367
+/o 7,6,1 0 0370
+`u 7,8 0 0371
+'u 7,8 0 0372
+^u 7,9 0 0373
+:u 7,8 0 0374
+'y 7,8,2 0 0375
+Tp 7,8,2 0 0376
+:y 7,8,2 0 0377
diff --git a/font/devX75/NBI b/font/devX75/NBI
new file mode 100644
index 0000000..72e9846
--- /dev/null
+++ b/font/devX75/NBI
@@ -0,0 +1,215 @@
+name NBI
+spacewidth 2
+charset
+--- 10,7 0 00
+--- 2,1 0 040
+! 5,8 0 041
+" 6,8 0 042
+dq "
+# 8,7 0 043
+sh "
+$ 6,9,1 0 044
+Do "
+% 11,8 0 045
+& 10,8 0 046
+' 4,8 0 047
+aq "
+cq "
+oq "
+( 4,8,1 0 050
+) 5,8,1 0 051
+* 6,8 0 052
++ 6,6 0 053
+, 3,2,2 0 054
+\- 4,4 0 055
+. 3,2 0 056
+/ 5,8 0 057
+sl "
+0 6,8 0 060
+1 6,8 0 061
+2 6,8 0 062
+3 6,8 0 063
+4 6,8 0 064
+5 6,8 0 065
+6 6,8 0 066
+7 6,8 0 067
+8 6,8 0 070
+9 6,8 0 071
+: 4,5 0 072
+; 4,5,2 0 073
+< 7,6 0 074
+= 6,5 0 075
+> 7,6 0 076
+? 6,8 0 077
+@ 11,8 0 0100
+at "
+A 8,8 0 0101
+B 8,8 0 0102
+C 7,8 0 0103
+D 9,8 0 0104
+E 8,8 0 0105
+F 7,8 0 0106
+G 8,8 0 0107
+H 10,8 0 0110
+I 6,8 0 0111
+J 7,8 0 0112
+K 10,8 0 0113
+L 7,8 0 0114
+M 11,8 0 0115
+N 8,8 0 0116
+O 8,8 0 0117
+P 8,8 0 0120
+Q 8,8,2 0 0121
+R 9,8 0 0122
+S 7,8 0 0123
+T 7,8 0 0124
+U 8,8 0 0125
+V 8,8 0 0126
+W 11,8 0 0127
+X 8,8 0 0130
+Y 7,8 0 0131
+Z 8,8 0 0132
+[ 5,8,1 0 0133
+lB "
+\ 5,8 0 0134
+rs "
+] 5,8,1 0 0135
+rB "
+^ 6,8 0 0136
+a^ "
+ha "
+_ 5,0,2 0 0137
+` 4,8 0 0140
+ga "
+a 7,5 0 0141
+b 7,8 0 0142
+c 6,5 0 0143
+d 7,8 0 0144
+e 6,5 0 0145
+f 5,8,2 0 0146
+g 6,6,2 0 0147
+h 7,8 0 0150
+i 4,8 0 0151
+j 4,8,2 0 0152
+k 7,8 0 0153
+l 4,8 0 0154
+m 10,5 0 0155
+n 7,5 0 0156
+o 6,5 0 0157
+p 7,5,2 0 0160
+q 7,5,2 0 0161
+r 5,5 0 0162
+s 4,5 0 0163
+t 4,7 0 0164
+u 7,5 0 0165
+v 6,5 0 0166
+w 10,5 0 0167
+x 7,5 0 0170
+y 7,5,2 0 0171
+z 5,5 0 0172
+{ 5,8,1 0 0173
+lC "
+| 6,8 0 0174
+ba "
+} 5,8,1 0 0175
+rC "
+~ 7,5 0 0176
+a~ "
+ti "
+--- 2,1 0 0240
+r! 4,6,2 0 0241
+ct 6,6,1 0 0242
+Po 7,8 0 0243
+Cs 7,7 0 0244
+Ye 7,8 0 0245
+bb 6,8 0 0246
+sc 6,8,2 0 0247
+ad 4,8 0 0250
+co 9,8 0 0251
+Of 6,8 0 0252
+Fo 8,5 0 0253
+tno 6,5 0 0254
+- 4,4 0 0255
+hy "
+rg 9,8 0 0256
+a- 5,7 0 0257
+de 4,8 0 0260
+t+- 6,6 0 0261
+S2 3,8 0 0262
+S3 3,8 0 0263
+aa 4,8 0 0264
+mc 7,5,2 0 0265
+ps 8,8 0 0266
+pc 3,5 0 0267
+ac 4,1,2 0 0270
+S1 3,8 0 0271
+Om 5,8 0 0272
+Fc 8,5 0 0273
+14 9,8 0 0274
+12 9,8 0 0275
+34 9,8 0 0276
+r? 6,6,2 0 0277
+`A 8,11 0 0300
+'A 8,11 0 0301
+^A 8,11 0 0302
+~A 8,11 0 0303
+:A 8,11 0 0304
+oA 8,11 0 0305
+AE 10,8 0 0306
+,C 7,8,2 0 0307
+`E 8,11 0 0310
+'E 8,11 0 0311
+^E 8,11 0 0312
+:E 8,11 0 0313
+`I 6,11 0 0314
+'I 6,11 0 0315
+^I 6,11 0 0316
+:I 6,11 0 0317
+-D 9,8 0 0320
+~N 8,11 0 0321
+`O 8,11 0 0322
+'O 8,11 0 0323
+^O 8,11 0 0324
+~O 8,11 0 0325
+:O 8,11 0 0326
+tmu 6,6 0 0327
+/O 8,8 0 0330
+`U 8,11 0 0331
+'U 8,11 0 0332
+^U 8,11 0 0333
+:U 8,11 0 0334
+'Y 7,11 0 0335
+TP 8,8 0 0336
+ss 8,8,2 0 0337
+`a 7,8 0 0340
+'a 7,8 0 0341
+^a 7,8 0 0342
+~a 7,8 0 0343
+:a 7,8 0 0344
+oa 7,9 0 0345
+ae 9,5 0 0346
+,c 6,5,2 0 0347
+`e 6,8 0 0350
+'e 6,8 0 0351
+^e 6,8 0 0352
+:e 6,8 0 0353
+`i 4,8 0 0354
+'i 4,8 0 0355
+^i 4,8 0 0356
+:i 4,8 0 0357
+Sd 6,8 0 0360
+~n 7,8 0 0361
+`o 6,8 0 0362
+'o 6,8 0 0363
+^o 6,8 0 0364
+~o 6,8 0 0365
+:o 6,8 0 0366
+tdi 6,6 0 0367
+/o 6,5 0 0370
+`u 7,8 0 0371
+'u 7,8 0 0372
+^u 7,8 0 0373
+:u 7,8 0 0374
+'y 7,8,2 0 0375
+Tp 7,8,2 0 0376
+:y 7,8,2 0 0377
diff --git a/font/devX75/NI b/font/devX75/NI
new file mode 100644
index 0000000..aa59f38
--- /dev/null
+++ b/font/devX75/NI
@@ -0,0 +1,215 @@
+name NI
+spacewidth 2
+charset
+--- 9,7 0 00
+--- 2,1 0 040
+! 4,8 0 041
+" 6,8 0 042
+dq "
+# 8,7 0 043
+sh "
+$ 5,9,1 0 044
+Do "
+% 9,8 0 045
+& 9,8 0 046
+' 4,8 0 047
+aq "
+cq "
+oq "
+( 5,8,1 0 050
+) 5,8,1 0 051
+* 6,8 0 052
++ 6,5 0 053
+, 2,2,1 0 054
+\- 4,3 0 055
+. 2,2 0 056
+/ 5,8,1 0 057
+sl "
+0 5,8 0 060
+1 5,8 0 061
+2 5,8 0 062
+3 5,8 0 063
+4 5,8 0 064
+5 5,8 0 065
+6 5,8 0 066
+7 5,8 0 067
+8 5,8 0 070
+9 5,8 0 071
+: 3,5 0 072
+; 3,5,1 0 073
+< 7,5 0 074
+= 6,4 0 075
+> 7,5 0 076
+? 6,8 0 077
+@ 9,8 0 0100
+at "
+A 8,8 0 0101
+B 7,8 0 0102
+C 6,8 0 0103
+D 8,8 0 0104
+E 7,8 0 0105
+F 7,8 0 0106
+G 8,8 0 0107
+H 9,8 0 0110
+I 5,8 0 0111
+J 5,8 0 0112
+K 8,8 0 0113
+L 7,8 0 0114
+M 12,8 0 0115
+N 9,8 0 0116
+O 7,8 0 0117
+P 7,8 0 0120
+Q 7,8,2 0 0121
+R 8,8 0 0122
+S 7,8 0 0123
+T 7,8 0 0124
+U 7,8 0 0125
+V 8,8 0 0126
+W 11,8 0 0127
+X 8,8 0 0130
+Y 8,8 0 0131
+Z 8,8 0 0132
+[ 5,8,1 0 0133
+lB "
+\ 5,8 0 0134
+rs "
+] 5,8,1 0 0135
+rB "
+^ 6,8 0 0136
+a^ "
+ha "
+_ 5,0,2 0 0137
+` 3,8 0 0140
+ga "
+a 6,5 0 0141
+b 6,8 0 0142
+c 5,5 0 0143
+d 6,8 0 0144
+e 5,5 0 0145
+f 4,8,2 0 0146
+g 5,6,2 0 0147
+h 6,8 0 0150
+i 3,8 0 0151
+j 3,8,2 0 0152
+k 6,8 0 0153
+l 3,8 0 0154
+m 9,5 0 0155
+n 6,5 0 0156
+o 6,5 0 0157
+p 6,5,2 0 0160
+q 6,5,2 0 0161
+r 5,5 0 0162
+s 4,5 0 0163
+t 3,7 0 0164
+u 6,5 0 0165
+v 6,5 0 0166
+w 9,5 0 0167
+x 6,5 0 0170
+y 6,5,2 0 0171
+z 6,5 0 0172
+{ 5,8,1 0 0173
+lC "
+| 6,8 0 0174
+ba "
+} 5,8,1 0 0175
+rC "
+~ 7,4 0 0176
+a~ "
+ti "
+--- 2,1 0 0240
+r! 4,6,2 0 0241
+ct 5,6,1 0 0242
+Po 6,8 0 0243
+Cs 8,8 0 0244
+Ye 8,8 0 0245
+bb 6,8 0 0246
+sc 6,8,1 0 0247
+ad 4,7 0 0250
+co 9,8 0 0251
+Of 5,8 0 0252
+Fo 6,5 0 0253
+tno 6,4 0 0254
+- 4,3 0 0255
+hy "
+rg 9,8 0 0256
+a- 4,7 0 0257
+de 4,8 0 0260
+t+- 6,5 0 0261
+S2 3,8 0 0262
+S3 3,8 0 0263
+aa 3,8 0 0264
+mc 6,5,2 0 0265
+ps 8,8 0 0266
+pc 3,4 0 0267
+ac 4,1,2 0 0270
+S1 3,8 0 0271
+Om 4,8 0 0272
+Fc 6,5 0 0273
+14 7,8 0 0274
+12 7,8 0 0275
+34 7,8 0 0276
+r? 6,6,2 0 0277
+`A 8,11 0 0300
+'A 8,11 0 0301
+^A 8,11 0 0302
+~A 8,11 0 0303
+:A 8,10 0 0304
+oA 8,11 0 0305
+AE 10,8 0 0306
+,C 6,8,2 0 0307
+`E 7,11 0 0310
+'E 7,11 0 0311
+^E 7,11 0 0312
+:E 7,10 0 0313
+`I 5,11 0 0314
+'I 5,11 0 0315
+^I 5,11 0 0316
+:I 5,10 0 0317
+-D 8,8 0 0320
+~N 9,11 0 0321
+`O 7,11 0 0322
+'O 7,11 0 0323
+^O 7,11 0 0324
+~O 7,11 0 0325
+:O 7,10 0 0326
+tmu 6,5 0 0327
+/O 7,8 0 0330
+`U 7,11 0 0331
+'U 7,11 0 0332
+^U 7,11 0 0333
+:U 7,10 0 0334
+'Y 8,10 0 0335
+TP 7,8 0 0336
+ss 7,8,2 0 0337
+`a 6,8 0 0340
+'a 6,8 0 0341
+^a 6,8 0 0342
+~a 6,8 0 0343
+:a 6,7 0 0344
+oa 6,9 0 0345
+ae 8,5 0 0346
+,c 5,5,2 0 0347
+`e 5,8 0 0350
+'e 5,8 0 0351
+^e 5,8 0 0352
+:e 5,7 0 0353
+`i 3,8 0 0354
+'i 3,8 0 0355
+^i 3,8 0 0356
+:i 3,7 0 0357
+Sd 6,8 0 0360
+~n 6,8 0 0361
+`o 6,8 0 0362
+'o 6,8 0 0363
+^o 6,8 0 0364
+~o 6,8 0 0365
+:o 6,7 0 0366
+tdi 6,5 0 0367
+/o 6,5 0 0370
+`u 6,8 0 0371
+'u 6,8 0 0372
+^u 6,8 0 0373
+:u 6,7 0 0374
+'y 6,8,2 0 0375
+Tp 6,8,2 0 0376
+:y 6,7,2 0 0377
diff --git a/font/devX75/NR b/font/devX75/NR
new file mode 100644
index 0000000..6d3fb6f
--- /dev/null
+++ b/font/devX75/NR
@@ -0,0 +1,215 @@
+name NR
+spacewidth 3
+charset
+--- 9,7 0 00
+--- 3,1 0 040
+! 4,8 0 041
+" 6,8 0 042
+dq "
+# 8,8 0 043
+sh "
+$ 5,9,1 0 044
+Do "
+% 9,8 0 045
+& 10,8 0 046
+' 4,8 0 047
+aq "
+cq "
+oq "
+( 4,8,1 0 050
+) 4,8,1 0 051
+* 6,8 0 052
++ 6,5 0 053
+, 3,2,1 0 054
+\- 4,3 0 055
+. 4,2 0 056
+/ 4,8 0 057
+sl "
+0 5,8 0 060
+1 5,8 0 061
+2 5,8 0 062
+3 5,8 0 063
+4 5,8 0 064
+5 5,8 0 065
+6 5,8 0 066
+7 5,8 0 067
+8 5,8 0 070
+9 5,8 0 071
+: 4,5 0 072
+; 4,5,1 0 073
+< 7,5 0 074
+= 6,4 0 075
+> 7,5 0 076
+? 5,8 0 077
+@ 9,8 0 0100
+at "
+A 8,8 0 0101
+B 7,8 0 0102
+C 7,8 0 0103
+D 8,8 0 0104
+E 7,8 0 0105
+F 7,8 0 0106
+G 8,8 0 0107
+H 9,8 0 0110
+I 4,8 0 0111
+J 5,8 0 0112
+K 8,8 0 0113
+L 7,8 0 0114
+M 10,8 0 0115
+N 9,8 0 0116
+O 8,8 0 0117
+P 7,8 0 0120
+Q 8,8,1 0 0121
+R 8,8 0 0122
+S 6,8 0 0123
+T 8,8 0 0124
+U 8,8 0 0125
+V 8,8 0 0126
+W 12,8 0 0127
+X 7,8 0 0130
+Y 8,8 0 0131
+Z 6,8 0 0132
+[ 3,8,1 0 0133
+lB "
+\ 5,8 0 0134
+rs "
+] 3,8,1 0 0135
+rB "
+^ 6,8 0 0136
+a^ "
+ha "
+_ 5,0,2 0 0137
+` 3,8 0 0140
+ga "
+a 6,5 0 0141
+b 5,8 0 0142
+c 5,5 0 0143
+d 6,8 0 0144
+e 5,5 0 0145
+f 4,8 0 0146
+g 6,5,2 0 0147
+h 6,8 0 0150
+i 4,7 0 0151
+j 4,7,2 0 0152
+k 7,8 0 0153
+l 4,8 0 0154
+m 10,5 0 0155
+n 7,5 0 0156
+o 5,5 0 0157
+p 5,5,2 0 0160
+q 6,5,2 0 0161
+r 5,5 0 0162
+s 5,5 0 0163
+t 3,7 0 0164
+u 6,5 0 0165
+v 6,5 0 0166
+w 8,5 0 0167
+x 6,5 0 0170
+y 6,5,2 0 0171
+z 5,5 0 0172
+{ 4,8,1 0 0173
+lC "
+| 6,8 0 0174
+ba "
+} 4,8,1 0 0175
+rC "
+~ 7,4 0 0176
+a~ "
+ti "
+--- 3,1 0 0240
+r! 4,6,2 0 0241
+ct 6,6,1 0 0242
+Po 7,8 0 0243
+Cs 7,7 0 0244
+Ye 8,8 0 0245
+bb 6,8 0 0246
+sc 5,8,2 0 0247
+ad 4,7 0 0250
+co 10,8 0 0251
+Of 5,8 0 0252
+Fo 6,4 0 0253
+tno 6,4 0 0254
+- 4,3 0 0255
+hy "
+rg 10,8 0 0256
+a- 5,7 0 0257
+de 4,8 0 0260
+t+- 6,5 0 0261
+S2 3,8 0 0262
+S3 3,8 0 0263
+aa 3,8 0 0264
+mc 6,5,2 0 0265
+ps 7,8,2 0 0266
+pc 4,4 0 0267
+ac 3,1,2 0 0270
+S1 3,8 0 0271
+Om 5,8 0 0272
+Fc 6,4 0 0273
+14 7,8 0 0274
+12 7,8 0 0275
+34 7,8 0 0276
+r? 5,6,2 0 0277
+`A 8,11 0 0300
+'A 8,11 0 0301
+^A 8,11 0 0302
+~A 8,11 0 0303
+:A 8,10 0 0304
+oA 8,11 0 0305
+AE 11,8 0 0306
+,C 7,8,2 0 0307
+`E 7,11 0 0310
+'E 7,11 0 0311
+^E 7,11 0 0312
+:E 7,10 0 0313
+`I 4,11 0 0314
+'I 4,11 0 0315
+^I 4,11 0 0316
+:I 4,10 0 0317
+-D 8,8 0 0320
+~N 9,11 0 0321
+`O 8,11 0 0322
+'O 8,11 0 0323
+^O 8,11 0 0324
+~O 8,11 0 0325
+:O 8,10 0 0326
+tmu 6,5 0 0327
+/O 8,8 0 0330
+`U 8,11 0 0331
+'U 8,11 0 0332
+^U 8,11 0 0333
+:U 8,10 0 0334
+'Y 8,11 0 0335
+TP 7,8 0 0336
+ss 7,8 0 0337
+`a 6,8 0 0340
+'a 6,8 0 0341
+^a 6,8 0 0342
+~a 6,8 0 0343
+:a 6,7 0 0344
+oa 6,8 0 0345
+ae 8,5 0 0346
+,c 5,5,2 0 0347
+`e 5,8 0 0350
+'e 5,8 0 0351
+^e 5,8 0 0352
+:e 5,7 0 0353
+`i 4,8 0 0354
+'i 4,8 0 0355
+^i 4,8 0 0356
+:i 4,7 0 0357
+Sd 5,8 0 0360
+~n 7,8 0 0361
+`o 5,8 0 0362
+'o 5,8 0 0363
+^o 5,8 0 0364
+~o 5,8 0 0365
+:o 5,7 0 0366
+tdi 6,5 0 0367
+/o 5,5,1 0 0370
+`u 6,8 0 0371
+'u 6,8 0 0372
+^u 6,8 0 0373
+:u 6,7 0 0374
+'y 6,8,2 0 0375
+Tp 5,8,2 0 0376
+:y 6,7,2 0 0377
diff --git a/font/devX75/S b/font/devX75/S
new file mode 100644
index 0000000..324bb42
--- /dev/null
+++ b/font/devX75/S
@@ -0,0 +1,221 @@
+name S
+special
+spacewidth 3
+charset
+--- 3,1 0 040
+! 3,7 0 041
+fa 7,7 0 042
+# 5,7 0 043
+sh "
+te 6,7 0 044
+% 8,7 0 045
+& 7,7 0 046
+st 5,5 0 047
+( 4,7,2 0 050
+) 4,7,2 0 051
+** 5,6 0 052
++ 6,5 0 053
+pl "
+, 2,1,2 0 054
+\- 6,3 0 055
+mi "
+. 2,2 0 056
+/ 3,7 0 057
+sl "
+0 5,7 0 060
+1 5,7 0 061
+2 5,7 0 062
+3 5,7 0 063
+4 5,7 0 064
+5 5,7 0 065
+6 5,7 0 066
+7 5,7 0 067
+8 5,7 0 070
+9 5,7 0 071
+: 2,5 0 072
+; 2,5,2 0 073
+< 7,5 0 074
+= 6,4 0 075
+eq "
+> 6,5 0 076
+? 5,7 0 077
+=~ 6,6 0 0100
+*A 8,7 0 0101
+*B 6,7 0 0102
+*X 8,7 0 0103
+*D 7,7 0 0104
+*E 6,7 0 0105
+*F 8,7 0 0106
+*G 6,7 0 0107
+*Y 8,7 0 0110
+*I 3,7 0 0111
++h 7,7 0 0112
+*K 7,7 0 0113
+*L 7,7 0 0114
+*M 10,7 0 0115
+*N 8,7 0 0116
+*O 7,7 0 0117
+*P 8,7 0 0120
+*H 7,7 0 0121
+*R 6,7 0 0122
+*S 6,7 0 0123
+*T 6,7 0 0124
+--- 8,7 0 0125
+ts 5,5,2 0 0126
+*W 9,7 0 0127
+*C 7,7 0 0130
+*Q 9,7 0 0131
+*Z 6,7 0 0132
+[ 3,7,2 0 0133
+lB "
+tf 7,5 0 0134
+3d "
+] 3,7,2 0 0135
+rB "
+pp 7,7 0 0136
+_ 5,0,2 0 0137
+radicalex 5,10 0 0140
+*a 7,5 0 0141
+*b 5,8,2 0 0142
+*x 6,5,2 0 0143
+*d 5,8 0 0144
+*e 5,5 0 0145
+*f 6,7,2 0 0146
+*g 6,5,2 0 0147
+*y 6,5,2 0 0150
+*i 4,5 0 0151
++f 6,5,2 0 0152
+*k 6,5 0 0153
+*l 6,8 0 0154
+*m 6,5,2 0 0155
+*n 6,5 0 0156
+*o 5,5 0 0157
+*p 6,5 0 0160
+*h 5,7 0 0161
+*r 5,5,3 0 0162
+*s 6,5 0 0163
+*t 5,5 0 0164
+*u 6,5 0 0165
++p 8,6 0 0166
+*w 8,5 0 0167
+*c 5,8,2 0 0170
+*q 7,5,2 0 0171
+*z 5,8,2 0 0172
+lC 5,7,2 0 0173
+{ "
+ba 2,7,2 0 0174
+| "
+rC 5,7,2 0 0175
+} "
+ap 6,4 0 0176
+*U 7,7 0 0241
+fm 3,8 0 0242
+<= 6,7 0 0243
+f/ 3,7 0 0244
+if 7,4 0 0245
+Fn 5,7,2 0 0246
+CL 7,5 0 0247
+DI 7,5 0 0250
+HE 7,5 0 0251
+SP 7,5 0 0252
+<> 10,5 0 0253
+<- 10,5 0 0254
+ua 6,10,4 0 0255
+arrowverttp "
+-> 10,5 0 0256
+da 6,10,2 0 0257
+arrowvertbt "
+de 4,7 0 0260
++- 6,7 0 0261
+sd 4,8 0 0262
+>= 6,7 0 0263
+mu 6,5 0 0264
+pt 7,4 0 0265
+pd 5,8 0 0266
+bu 5,4 0 0267
+di 6,5 0 0270
+!= 6,5 0 0271
+== 6,5 0 0272
+~= 6,5 0 0273
+~~ "
+--- 9,1 0 0274
+arrowvertex 6,10,4 0 0275
+an 10,3 0 0276
+CR 7,6 0 0277
+Ah 8,7 0 0300
+Im 7,8,1 0 0301
+Re 8,8 0 0302
+wp 9,6,2 0 0303
+c* 8,7 0 0304
+c+ 8,7 0 0305
+es 8,8,1 0 0306
+ca 8,5 0 0307
+cu 8,5 0 0310
+sp 7,5 0 0311
+ip 7,5,2 0 0312
+nb 7,6,1 0 0313
+sb 7,5 0 0314
+ib 7,5,2 0 0315
+mo 7,5 0 0316
+nm 7,6,1 0 0317
+/_ 8,7 0 0320
+gr 7,7 0 0321
+rg 8,7,1 0 0322
+co 8,7,1 0 0323
+tm 10,7 0 0324
+--- 9,8,1 0 0325
+sr 6,10 0 0326
+sqrt "
+md 3,3 0 0327
+no 7,3 0 0330
+AN 6,5 0 0331
+OR 6,5 0 0332
+hA 11,5 0 0333
+lA 10,5 0 0334
+uA 6,10 0 0335
+rA 10,5 0 0336
+dA 6,10 0 0337
+lz 7,7 0 0340
+la 3,7,2 0 0341
+--- 8,7,1 0 0342
+--- 8,7,1 0 0343
+--- 9,7 0 0344
+--- 7,8,1 0 0345
+parenlefttp 4,10,4 0 0346
+parenleftex 4,10,4 0 0347
+parenleftbt 4,10,4 0 0350
+bracketlefttp 4,10,4 0 0351
+lc "
+bracketleftex 4,10,4 0 0352
+bracketleftbt 4,10,2 0 0353
+lf "
+bracelefttp 5,10,4 0 0354
+lt "
+braceleftmid 5,10,4 0 0355
+lk "
+braceleftbt 5,10,2 0 0356
+lb "
+bracerightex 5,10,4 0 0357
+braceleftex "
+braceex "
+bv "
+ra 3,7,2 0 0361
+is 3,10,2 0 0362
+integral "
+--- 7,10,4 0 0363
+--- 7,10,4 0 0364
+--- 7,10,2 0 0365
+parenrighttp 4,10,4 0 0366
+parenrightex 4,10,4 0 0367
+parenrightbt 4,10,4 0 0370
+bracketrighttp 4,10,4 0 0371
+rc "
+bracketrightex 4,10,4 0 0372
+bracketrightbt 4,10,2 0 0373
+rf "
+bracerighttp 5,10,4 0 0374
+rt "
+bracerightmid 5,10,4 0 0375
+rk "
+bracerightbt 5,10,2 0 0376
+rb "
diff --git a/font/devX75/TB b/font/devX75/TB
new file mode 100644
index 0000000..11a796b
--- /dev/null
+++ b/font/devX75/TB
@@ -0,0 +1,215 @@
+name TB
+spacewidth 2
+charset
+--- 9,7 0 00
+--- 2,1 0 040
+! 4,7 0 041
+" 5,7 0 042
+dq "
+# 6,7 0 043
+sh "
+$ 5,8,1 0 044
+Do "
+% 9,7 0 045
+& 9,7 0 046
+' 3,7 0 047
+aq "
+cq "
+oq "
+( 4,7,3 0 050
+) 4,7,3 0 051
+* 6,7 0 052
++ 6,5 0 053
+, 4,2,1 0 054
+\- 3,3 0 055
+. 3,2 0 056
+/ 3,7 0 057
+sl "
+0 5,7 0 060
+1 5,7 0 061
+2 5,7 0 062
+3 5,7 0 063
+4 5,7 0 064
+5 5,7 0 065
+6 5,7 0 066
+7 5,7 0 067
+8 5,7 0 070
+9 5,7 0 071
+: 4,5 0 072
+; 4,5,1 0 073
+< 6,5 0 074
+= 6,4 0 075
+> 6,5 0 076
+? 6,7 0 077
+@ 11,7,2 0 0100
+at "
+A 7,7 0 0101
+B 7,7 0 0102
+C 7,7 0 0103
+D 8,7 0 0104
+E 7,7 0 0105
+F 7,7 0 0106
+G 7,7 0 0107
+H 9,7 0 0110
+I 5,7 0 0111
+J 5,7,1 0 0112
+K 8,7 0 0113
+L 7,7 0 0114
+M 10,7 0 0115
+N 8,7 0 0116
+O 7,7 0 0117
+P 6,7 0 0120
+Q 7,7,2 0 0121
+R 7,7 0 0122
+S 6,7 0 0123
+T 7,7 0 0124
+U 7,7 0 0125
+V 8,7 0 0126
+W 10,7 0 0127
+X 7,7 0 0130
+Y 8,7 0 0131
+Z 7,7 0 0132
+[ 4,7,3 0 0133
+lB "
+\ 3,7 0 0134
+rs "
+] 4,7,3 0 0135
+rB "
+^ 6,7 0 0136
+a^ "
+ha "
+_ 5,0,3 0 0137
+` 4,8 0 0140
+ga "
+a 5,5 0 0141
+b 5,7 0 0142
+c 5,5 0 0143
+d 6,7 0 0144
+e 5,5 0 0145
+f 3,7 0 0146
+g 5,5,3 0 0147
+h 5,7 0 0150
+i 3,8 0 0151
+j 4,8,2 0 0152
+k 5,7 0 0153
+l 3,7 0 0154
+m 8,5 0 0155
+n 6,5 0 0156
+o 6,5 0 0157
+p 5,5,2 0 0160
+q 5,5,2 0 0161
+r 4,5 0 0162
+s 4,5 0 0163
+t 4,7 0 0164
+u 5,5 0 0165
+v 5,5 0 0166
+w 6,5 0 0167
+x 5,5 0 0170
+y 5,5,2 0 0171
+z 5,5 0 0172
+{ 4,7,3 0 0173
+lC "
+| 3,7,2 0 0174
+ba "
+} 4,7,3 0 0175
+rC "
+~ 6,4 0 0176
+a~ "
+ti "
+--- 2,1 0 0240
+r! 4,4,3 0 0241
+ct 6,6,1 0 0242
+Po 6,7 0 0243
+Cs 6,6 0 0244
+Ye 6,7 0 0245
+bb 3,7,2 0 0246
+sc 5,7,2 0 0247
+ad 4,8 0 0250
+co 9,7 0 0251
+Of 4,7 0 0252
+Fo 6,5 0 0253
+tno 7,5 0 0254
+- 3,3 0 0255
+hy "
+rg 9,7 0 0256
+a- 4,7 0 0257
+de 4,7 0 0260
+t+- 6,7 0 0261
+S2 3,7 0 0262
+S3 3,7 0 0263
+aa 4,7 0 0264
+mc 5,5,3 0 0265
+ps 6,7,3 0 0266
+pc 3,4 0 0267
+ac 3,0,3 0 0270
+S1 3,7 0 0271
+Om 4,7 0 0272
+Fc 6,5 0 0273
+14 7,7 0 0274
+12 7,7 0 0275
+34 7,7 0 0276
+r? 6,4,3 0 0277
+`A 7,10 0 0300
+'A 7,10 0 0301
+^A 7,10 0 0302
+~A 7,10 0 0303
+:A 7,10 0 0304
+oA 7,10 0 0305
+AE 9,7 0 0306
+,C 7,7,3 0 0307
+`E 7,10 0 0310
+'E 7,10 0 0311
+^E 7,10 0 0312
+:E 7,10 0 0313
+`I 5,10 0 0314
+'I 5,10 0 0315
+^I 5,10 0 0316
+:I 5,10 0 0317
+-D 8,7 0 0320
+~N 8,10 0 0321
+`O 7,10 0 0322
+'O 7,10 0 0323
+^O 7,10 0 0324
+~O 7,10 0 0325
+:O 7,10 0 0326
+tmu 6,5 0 0327
+/O 7,8,1 0 0330
+`U 7,10 0 0331
+'U 7,10 0 0332
+^U 7,10 0 0333
+:U 7,10 0 0334
+'Y 8,10 0 0335
+TP 6,7 0 0336
+ss 6,7 0 0337
+`a 5,8 0 0340
+'a 5,8 0 0341
+^a 5,8 0 0342
+~a 5,8 0 0343
+:a 5,8 0 0344
+oa 5,8 0 0345
+ae 8,5 0 0346
+,c 5,5,3 0 0347
+`e 5,8 0 0350
+'e 5,8 0 0351
+^e 5,8 0 0352
+:e 5,8 0 0353
+`i 3,8 0 0354
+'i 3,8 0 0355
+^i 3,8 0 0356
+:i 3,8 0 0357
+Sd 6,8 0 0360
+~n 6,8 0 0361
+`o 6,8 0 0362
+'o 6,8 0 0363
+^o 6,8 0 0364
+~o 6,8 0 0365
+:o 6,8 0 0366
+tdi 6,5 0 0367
+/o 6,6,1 0 0370
+`u 5,8 0 0371
+'u 5,8 0 0372
+^u 5,8 0 0373
+:u 5,8 0 0374
+'y 5,8,3 0 0375
+Tp 5,7,3 0 0376
+:y 5,8,3 0 0377
diff --git a/font/devX75/TBI b/font/devX75/TBI
new file mode 100644
index 0000000..0be4638
--- /dev/null
+++ b/font/devX75/TBI
@@ -0,0 +1,215 @@
+name TBI
+spacewidth 2
+charset
+--- 8,7 0 00
+--- 2,1 0 040
+! 6,7 0 041
+" 6,7 0 042
+dq "
+# 8,7 0 043
+sh "
+$ 5,7 0 044
+Do "
+% 11,7 0 045
+& 8,7 0 046
+' 4,7 0 047
+aq "
+cq "
+oq "
+( 6,7,2 0 050
+) 6,7,2 0 051
+* 7,8 0 052
++ 7,5 0 053
+, 4,2,1 0 054
+\- 3,3 0 055
+. 4,2 0 056
+/ 5,7 0 057
+sl "
+0 5,7 0 060
+1 5,7 0 061
+2 5,7 0 062
+3 5,7 0 063
+4 5,7 0 064
+5 5,7 0 065
+6 5,7 0 066
+7 5,7 0 067
+8 5,7 0 070
+9 5,7 0 071
+: 3,5 0 072
+; 5,5,1 0 073
+< 6,5 0 074
+= 7,4 0 075
+> 6,5 0 076
+? 5,7 0 077
+@ 11,7,2 0 0100
+at "
+A 6,7 0 0101
+B 7,7 0 0102
+C 7,7 0 0103
+D 7,7 0 0104
+E 7,7 0 0105
+F 7,7 0 0106
+G 7,7 0 0107
+H 8,7 0 0110
+I 4,7 0 0111
+J 5,7,1 0 0112
+K 7,7 0 0113
+L 6,7 0 0114
+M 10,7 0 0115
+N 8,7 0 0116
+O 7,7 0 0117
+P 6,7 0 0120
+Q 7,7,2 0 0121
+R 7,7 0 0122
+S 6,7 0 0123
+T 6,7 0 0124
+U 8,7 0 0125
+V 7,7 0 0126
+W 9,7 0 0127
+X 7,7 0 0130
+Y 6,7 0 0131
+Z 6,7 0 0132
+[ 5,7,2 0 0133
+lB "
+\ 5,7 0 0134
+rs "
+] 5,7,2 0 0135
+rB "
+^ 7,7 0 0136
+a^ "
+ha "
+_ 5,0,2 0 0137
+` 4,8 0 0140
+ga "
+a 5,5 0 0141
+b 5,7 0 0142
+c 5,5 0 0143
+d 5,7 0 0144
+e 5,5 0 0145
+f 4,7,3 0 0146
+g 4,5,3 0 0147
+h 5,7 0 0150
+i 3,7 0 0151
+j 3,7,3 0 0152
+k 5,7 0 0153
+l 3,7 0 0154
+m 7,5 0 0155
+n 5,5 0 0156
+o 5,5 0 0157
+p 5,5,3 0 0160
+q 5,5,3 0 0161
+r 4,5 0 0162
+s 4,5 0 0163
+t 4,6 0 0164
+u 5,5 0 0165
+v 4,5 0 0166
+w 7,5 0 0167
+x 4,5 0 0170
+y 5,5,2 0 0171
+z 4,5 0 0172
+{ 5,7,2 0 0173
+lC "
+| 3,7 0 0174
+ba "
+} 5,7,2 0 0175
+rC "
+~ 6,4 0 0176
+a~ "
+ti "
+--- 2,1 0 0240
+r! 5,5,3 0 0241
+ct 5,6,1 0 0242
+Po 5,7 0 0243
+Cs 7,6 0 0244
+Ye 5,7 0 0245
+bb 3,7 0 0246
+sc 5,7,2 0 0247
+ad 5,7 0 0250
+co 9,7 0 0251
+Of 5,7 0 0252
+Fo 8,5 0 0253
+tno 7,5 0 0254
+- 3,3 0 0255
+hy "
+rg 9,7 0 0256
+a- 4,7 0 0257
+de 4,7 0 0260
+t+- 7,7 0 0261
+S2 3,7 0 0262
+S3 3,7 0 0263
+aa 4,7 0 0264
+mc 5,5,3 0 0265
+ps 8,7,3 0 0266
+pc 4,4 0 0267
+ac 3,0,3 0 0270
+S1 3,7 0 0271
+Om 5,7 0 0272
+Fc 8,5 0 0273
+14 7,7 0 0274
+12 7,7 0 0275
+34 7,7 0 0276
+r? 5,5,3 0 0277
+`A 6,10 0 0300
+'A 6,10 0 0301
+^A 6,10 0 0302
+~A 6,10 0 0303
+:A 6,10 0 0304
+oA 6,10 0 0305
+AE 9,7 0 0306
+,C 7,7,3 0 0307
+`E 7,10 0 0310
+'E 7,10 0 0311
+^E 7,10 0 0312
+:E 7,10 0 0313
+`I 4,10 0 0314
+'I 4,10 0 0315
+^I 4,10 0 0316
+:I 4,10 0 0317
+-D 7,7 0 0320
+~N 8,10 0 0321
+`O 7,10 0 0322
+'O 7,10 0 0323
+^O 7,10 0 0324
+~O 7,10 0 0325
+:O 7,10 0 0326
+tmu 7,5 0 0327
+/O 7,8,1 0 0330
+`U 8,10 0 0331
+'U 8,10 0 0332
+^U 8,10 0 0333
+:U 8,10 0 0334
+'Y 6,10 0 0335
+TP 6,7 0 0336
+ss 6,7,3 0 0337
+`a 5,8 0 0340
+'a 5,8 0 0341
+^a 5,8 0 0342
+~a 5,8 0 0343
+:a 5,8 0 0344
+oa 5,8 0 0345
+ae 8,5 0 0346
+,c 5,5,3 0 0347
+`e 5,8 0 0350
+'e 5,8 0 0351
+^e 5,8 0 0352
+:e 5,8 0 0353
+`i 3,8 0 0354
+'i 3,8 0 0355
+^i 3,8 0 0356
+:i 3,8 0 0357
+Sd 5,8 0 0360
+~n 5,8 0 0361
+`o 5,8 0 0362
+'o 5,8 0 0363
+^o 5,8 0 0364
+~o 5,8 0 0365
+:o 5,8 0 0366
+tdi 7,5 0 0367
+/o 5,6,1 0 0370
+`u 5,8 0 0371
+'u 5,8 0 0372
+^u 5,8 0 0373
+:u 5,8 0 0374
+'y 5,8,2 0 0375
+Tp 5,7,3 0 0376
+:y 5,8,2 0 0377
diff --git a/font/devX75/TI b/font/devX75/TI
new file mode 100644
index 0000000..0f6cdfe
--- /dev/null
+++ b/font/devX75/TI
@@ -0,0 +1,215 @@
+name TI
+spacewidth 2
+charset
+--- 7,7 0 00
+--- 2,1 0 040
+! 3,7 0 041
+" 4,8 0 042
+dq "
+# 5,7 0 043
+sh "
+$ 5,8,1 0 044
+Do "
+% 9,7 0 045
+& 8,7 0 046
+' 3,8 0 047
+aq "
+cq "
+oq "
+( 3,7,2 0 050
+) 4,7,2 0 051
+* 5,7 0 052
++ 7,5 0 053
+, 3,1,2 0 054
+\- 4,3 0 055
+. 3,1 0 056
+/ 4,7 0 057
+sl "
+0 5,7 0 060
+1 5,7 0 061
+2 5,7 0 062
+3 5,7 0 063
+4 5,7 0 064
+5 5,7 0 065
+6 5,7 0 066
+7 5,7 0 067
+8 5,7 0 070
+9 5,7 0 071
+: 3,5 0 072
+; 3,5,2 0 073
+< 5,5 0 074
+= 7,4 0 075
+> 5,5 0 076
+? 5,7 0 077
+@ 10,7,2 0 0100
+at "
+A 7,7 0 0101
+B 6,7 0 0102
+C 7,7 0 0103
+D 7,7 0 0104
+E 6,7 0 0105
+F 6,7 0 0106
+G 8,7 0 0107
+H 7,7 0 0110
+I 3,7 0 0111
+J 4,7 0 0112
+K 7,7 0 0113
+L 6,7 0 0114
+M 10,7 0 0115
+N 7,7 0 0116
+O 7,7 0 0117
+P 6,7 0 0120
+Q 7,7,2 0 0121
+R 6,7 0 0122
+S 5,7 0 0123
+T 6,7 0 0124
+U 7,7 0 0125
+V 6,7 0 0126
+W 9,7 0 0127
+X 6,7 0 0130
+Y 6,7 0 0131
+Z 6,7 0 0132
+[ 4,7,2 0 0133
+lB "
+\ 5,7 0 0134
+rs "
+] 4,7,2 0 0135
+rB "
+^ 5,7 0 0136
+a^ "
+ha "
+_ 5,0,3 0 0137
+` 3,8 0 0140
+ga "
+a 5,5 0 0141
+b 5,7 0 0142
+c 5,5 0 0143
+d 5,7 0 0144
+e 5,5 0 0145
+f 3,7,3 0 0146
+g 4,5,3 0 0147
+h 5,7 0 0150
+i 3,7 0 0151
+j 3,7,3 0 0152
+k 5,7 0 0153
+l 3,7 0 0154
+m 7,5 0 0155
+n 5,5 0 0156
+o 5,5 0 0157
+p 5,5,3 0 0160
+q 5,5,3 0 0161
+r 4,5 0 0162
+s 4,5 0 0163
+t 3,6 0 0164
+u 5,5 0 0165
+v 5,5 0 0166
+w 7,5 0 0167
+x 4,5 0 0170
+y 5,5,3 0 0171
+z 4,5 0 0172
+{ 4,7,2 0 0173
+lC "
+| 3,7,2 0 0174
+ba "
+} 4,7,2 0 0175
+rC "
+~ 6,4 0 0176
+a~ "
+ti "
+--- 2,1 0 0240
+r! 4,5,2 0 0241
+ct 5,6,1 0 0242
+Po 5,7 0 0243
+Cs 5,7 0 0244
+Ye 7,7 0 0245
+bb 3,7,2 0 0246
+sc 5,7,2 0 0247
+ad 3,7 0 0250
+co 9,7 0 0251
+Of 4,7 0 0252
+Fo 5,5 0 0253
+tno 7,4 0 0254
+- 4,3 0 0255
+hy "
+rg 9,7 0 0256
+a- 3,7 0 0257
+de 4,7 0 0260
+t+- 7,7 0 0261
+S2 3,7 0 0262
+S3 3,7 0 0263
+aa 3,8 0 0264
+mc 5,5,3 0 0265
+ps 6,7,3 0 0266
+pc 3,3 0 0267
+ac 3,0,2 0 0270
+S1 3,7 0 0271
+Om 3,7 0 0272
+Fc 5,5 0 0273
+14 7,7 0 0274
+12 7,7 0 0275
+34 7,7 0 0276
+r? 5,5,2 0 0277
+`A 7,10 0 0300
+'A 7,10 0 0301
+^A 7,10 0 0302
+~A 7,10 0 0303
+:A 7,9 0 0304
+oA 7,10 0 0305
+AE 8,7 0 0306
+,C 7,7,2 0 0307
+`E 6,10 0 0310
+'E 6,10 0 0311
+^E 6,10 0 0312
+:E 6,9 0 0313
+`I 3,10 0 0314
+'I 3,10 0 0315
+^I 3,10 0 0316
+:I 3,9 0 0317
+-D 7,7 0 0320
+~N 7,10 0 0321
+`O 7,10 0 0322
+'O 7,10 0 0323
+^O 7,10 0 0324
+~O 7,10 0 0325
+:O 7,9 0 0326
+tmu 7,5 0 0327
+/O 7,8,1 0 0330
+`U 7,10 0 0331
+'U 7,10 0 0332
+^U 7,10 0 0333
+:U 7,9 0 0334
+'Y 6,9 0 0335
+TP 6,7 0 0336
+ss 6,7,2 0 0337
+`a 5,8 0 0340
+'a 5,8 0 0341
+^a 5,8 0 0342
+~a 5,8 0 0343
+:a 5,7 0 0344
+oa 5,8 0 0345
+ae 7,5 0 0346
+,c 5,5,2 0 0347
+`e 5,8 0 0350
+'e 5,8 0 0351
+^e 5,8 0 0352
+:e 5,7 0 0353
+`i 3,8 0 0354
+'i 3,8 0 0355
+^i 3,8 0 0356
+:i 3,7 0 0357
+Sd 5,8 0 0360
+~n 5,8 0 0361
+`o 5,8 0 0362
+'o 5,8 0 0363
+^o 5,8 0 0364
+~o 5,8 0 0365
+:o 5,7 0 0366
+tdi 7,5 0 0367
+/o 5,6,1 0 0370
+`u 5,8 0 0371
+'u 5,8 0 0372
+^u 5,8 0 0373
+:u 5,7 0 0374
+'y 5,8,3 0 0375
+Tp 5,7,3 0 0376
+:y 5,7,3 0 0377
diff --git a/font/devX75/TR b/font/devX75/TR
new file mode 100644
index 0000000..16b0cb8
--- /dev/null
+++ b/font/devX75/TR
@@ -0,0 +1,215 @@
+name TR
+spacewidth 2
+charset
+--- 8,7 0 00
+--- 2,1 0 040
+! 3,7 0 041
+" 4,7 0 042
+dq "
+# 5,7 0 043
+sh "
+$ 5,8,1 0 044
+Do "
+% 8,7 0 045
+& 8,7 0 046
+' 2,7 0 047
+aq "
+cq "
+oq "
+( 4,7,2 0 050
+) 4,7,2 0 051
+* 5,7 0 052
++ 6,5 0 053
+, 3,1,2 0 054
+\- 4,3 0 055
+. 3,1 0 056
+/ 3,7 0 057
+sl "
+0 5,7 0 060
+1 5,7 0 061
+2 5,7 0 062
+3 5,7 0 063
+4 5,7 0 064
+5 5,7 0 065
+6 5,7 0 066
+7 5,7 0 067
+8 5,7 0 070
+9 5,7 0 071
+: 3,5 0 072
+; 3,5,2 0 073
+< 5,5 0 074
+= 6,4 0 075
+> 5,5 0 076
+? 4,7 0 077
+@ 9,7,2 0 0100
+at "
+A 8,7 0 0101
+B 6,7 0 0102
+C 7,7 0 0103
+D 7,7 0 0104
+E 6,7 0 0105
+F 6,7 0 0106
+G 7,7 0 0107
+H 8,7 0 0110
+I 4,7 0 0111
+J 4,7 0 0112
+K 7,7 0 0113
+L 6,7 0 0114
+M 10,7 0 0115
+N 8,7 0 0116
+O 7,7 0 0117
+P 6,7 0 0120
+Q 7,7,2 0 0121
+R 7,7 0 0122
+S 5,7 0 0123
+T 6,7 0 0124
+U 8,7 0 0125
+V 8,7 0 0126
+W 10,7 0 0127
+X 8,7 0 0130
+Y 8,7 0 0131
+Z 6,7 0 0132
+[ 3,7,2 0 0133
+lB "
+\ 3,7 0 0134
+rs "
+] 3,7,2 0 0135
+rB "
+^ 5,7 0 0136
+a^ "
+ha "
+_ 5,0,3 0 0137
+` 3,8 0 0140
+ga "
+a 4,5 0 0141
+b 5,7 0 0142
+c 4,5 0 0143
+d 5,7 0 0144
+e 4,5 0 0145
+f 4,7 0 0146
+g 5,5,2 0 0147
+h 5,7 0 0150
+i 3,7 0 0151
+j 3,7,2 0 0152
+k 5,7 0 0153
+l 4,7 0 0154
+m 8,5 0 0155
+n 5,5 0 0156
+o 5,5 0 0157
+p 5,5,2 0 0160
+q 5,5,2 0 0161
+r 4,5 0 0162
+s 4,5 0 0163
+t 4,6 0 0164
+u 5,5 0 0165
+v 5,5 0 0166
+w 8,5 0 0167
+x 6,5 0 0170
+y 5,5,2 0 0171
+z 5,5 0 0172
+{ 4,7,2 0 0173
+lC "
+| 2,7,2 0 0174
+ba "
+} 4,7,2 0 0175
+rC "
+~ 7,4 0 0176
+a~ "
+ti "
+--- 2,1 0 0240
+r! 3,5,2 0 0241
+ct 5,6,1 0 0242
+Po 5,7 0 0243
+Cs 5,7 0 0244
+Ye 5,7 0 0245
+bb 2,7 0 0246
+sc 5,8,1 0 0247
+ad 5,7 0 0250
+co 9,7 0 0251
+Of 4,7 0 0252
+Fo 5,5 0 0253
+tno 7,4 0 0254
+- 4,3 0 0255
+hy "
+rg 9,7 0 0256
+a- 4,7 0 0257
+de 4,7 0 0260
+t+- 6,7 0 0261
+S2 3,7 0 0262
+S3 3,7 0 0263
+aa 3,7 0 0264
+mc 5,5,2 0 0265
+ps 6,7,2 0 0266
+pc 2,3 0 0267
+ac 4,0,3 0 0270
+S1 3,7 0 0271
+Om 4,7 0 0272
+Fc 5,5 0 0273
+14 8,7 0 0274
+12 8,7 0 0275
+34 8,7 0 0276
+r? 4,5,2 0 0277
+`A 8,10 0 0300
+'A 8,10 0 0301
+^A 8,10 0 0302
+~A 8,10 0 0303
+:A 8,9 0 0304
+oA 8,10 0 0305
+AE 9,7 0 0306
+,C 7,7,3 0 0307
+`E 6,10 0 0310
+'E 6,10 0 0311
+^E 6,10 0 0312
+:E 6,9 0 0313
+`I 4,10 0 0314
+'I 4,10 0 0315
+^I 4,10 0 0316
+:I 4,9 0 0317
+-D 7,7 0 0320
+~N 8,10 0 0321
+`O 7,10 0 0322
+'O 7,10 0 0323
+^O 7,10 0 0324
+~O 7,10 0 0325
+:O 7,9 0 0326
+tmu 6,5 0 0327
+/O 8,8,1 0 0330
+`U 8,10 0 0331
+'U 8,10 0 0332
+^U 8,10 0 0333
+:U 8,9 0 0334
+'Y 8,10 0 0335
+TP 6,7 0 0336
+ss 5,7 0 0337
+`a 4,8 0 0340
+'a 4,8 0 0341
+^a 4,8 0 0342
+~a 4,8 0 0343
+:a 4,7 0 0344
+oa 4,8 0 0345
+ae 6,5 0 0346
+,c 4,5,3 0 0347
+`e 4,8 0 0350
+'e 4,8 0 0351
+^e 4,8 0 0352
+:e 4,7 0 0353
+`i 4,8 0 0354
+'i 4,8 0 0355
+^i 4,8 0 0356
+:i 4,7 0 0357
+Sd 5,8 0 0360
+~n 5,8 0 0361
+`o 5,8 0 0362
+'o 5,8 0 0363
+^o 5,8 0 0364
+~o 5,8 0 0365
+:o 5,7 0 0366
+tdi 6,5 0 0367
+/o 5,6,1 0 0370
+`u 5,8 0 0371
+'u 5,8 0 0372
+^u 5,8 0 0373
+:u 5,7 0 0374
+'y 5,8,2 0 0375
+Tp 5,7,2 0 0376
+:y 5,7,2 0 0377
diff --git a/font/devX75/devX75.am b/font/devX75/devX75.am
new file mode 100644
index 0000000..b2f7b0b
--- /dev/null
+++ b/font/devX75/devX75.am
@@ -0,0 +1,65 @@
+# Copyright (C) 2014-2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+DEVX75FONTS = \
+ font/devX75/DESC \
+ font/devX75/TR \
+ font/devX75/TI \
+ font/devX75/TB \
+ font/devX75/TBI \
+ font/devX75/CR \
+ font/devX75/CI \
+ font/devX75/CB \
+ font/devX75/CBI \
+ font/devX75/HR \
+ font/devX75/HI \
+ font/devX75/HB \
+ font/devX75/HBI \
+ font/devX75/NR \
+ font/devX75/NI \
+ font/devX75/NB \
+ font/devX75/NBI \
+ font/devX75/S
+
+if !WITHOUT_X11
+devX75_fontdir = $(fontdir)/devX75
+devX75_font_DATA = $(DEVX75FONTS)
+endif
+
+EXTRA_DIST += $(DEVX75FONTS)
+
+# This target generates font descriptions from core X11 font data
+# returned by a running X server; these are _not_ normally generated
+# during a build, but provided with the groff source distribution.
+#
+# This maintainer-mode target alters files in the source tree.
+maintainer-font-descriptions: devX75_font-descriptions
+devX75_fontsrcdir=$(top_srcdir)/font/devX75
+devX75_font-descriptions: $(xtotroff) $(xditview_srcdir)/DESC.in \
+ $(xditview_srcdir)/FontMap-X11
+ $(AM_V_GEN)$(MKDIR_P) $(devX75_fontsrcdir) \
+ && sed -e 's/res .*/res 75/' $(xditview_srcdir)/DESC.in \
+ >$(devX75_fontsrcdir)/DESC \
+ && $(xtotroff) -d $(devX75_fontsrcdir) -r 75 -s 10 \
+ $(xditview_srcdir)/FontMap-X11
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/font/devascii/DESC.proto b/font/devascii/DESC.proto
new file mode 100644
index 0000000..88399ab
--- /dev/null
+++ b/font/devascii/DESC.proto
@@ -0,0 +1,8 @@
+res 240
+hor 24
+vert 40
+unitwidth 10
+sizes 10 0
+fonts 4 R I B BI
+tcommand
+postpro grotty
diff --git a/font/devascii/R.proto b/font/devascii/R.proto
new file mode 100644
index 0000000..bb1f900
--- /dev/null
+++ b/font/devascii/R.proto
@@ -0,0 +1,190 @@
+name R
+internalname 0
+spacewidth 24
+charset
+--- 24 0 0000
+--- 24 0 0001
+--- 24 0 0002
+--- 24 0 0003
+--- 24 0 0004
+--- 24 0 0005
+--- 24 0 0006
+--- 24 0 0007
+--- 24 0 0010
+--- 24 0 0011
+--- 24 0 0012
+--- 24 0 0013
+--- 24 0 0014
+--- 24 0 0015
+--- 24 0 0016
+--- 24 0 0017
+--- 24 0 0020
+--- 24 0 0021
+--- 24 0 0022
+--- 24 0 0023
+--- 24 0 0024
+--- 24 0 0025
+--- 24 0 0026
+--- 24 0 0027
+--- 24 0 0030
+--- 24 0 0031
+--- 24 0 0032
+--- 24 0 0033
+--- 24 0 0034
+--- 24 0 0035
+--- 24 0 0036
+--- 24 0 0037
+! 24 0 0041
+" 24 0 0042
+dq "
+lq "
+rq "
+# 24 0 0043
+sh "
+$ 24 0 0044
+Do "
+% 24 0 0045
+& 24 0 0046
+' 24 0 0047
+aa "
+fm "
+aq "
+cq "
+( 24 0 0050
+) 24 0 0051
+* 24 0 0052
+** "
++ 24 0 0053
+pl "
+, 24 0 0054
+\- 24 0 0055
+hy "
+- "
+mi "
+en "
+. 24 0 0056
+/ 24 0 0057
+sl "
+f/ "
+0 24 0 0060
+1 24 0 0061
+2 24 0 0062
+3 24 0 0063
+4 24 0 0064
+5 24 0 0065
+6 24 0 0066
+7 24 0 0067
+8 24 0 0070
+9 24 0 0071
+: 24 0 0072
+; 24 0 0073
+< 24 0 0074
+la "
+fo "
+= 24 0 0075
+eq "
+> 24 0 0076
+ra "
+fc "
+? 24 0 0077
+@ 24 0 0100
+at "
+A 24 0 0101
+*A "
+B 24 0 0102
+*B "
+C 24 0 0103
+D 24 0 0104
+E 24 0 0105
+*E "
+F 24 0 0106
+G 24 0 0107
+H 24 0 0110
+*Y "
+I 24 0 0111
+*I "
+J 24 0 0112
+K 24 0 0113
+*K "
+L 24 0 0114
+M 24 0 0115
+*M "
+N 24 0 0116
+*N "
+O 24 0 0117
+ci "
+*O "
+P 24 0 0120
+*R "
+Q 24 0 0121
+R 24 0 0122
+S 24 0 0123
+T 24 0 0124
+*T "
+U 24 0 0125
+V 24 0 0126
+W 24 0 0127
+X 24 0 0130
+*X "
+Y 24 0 0131
+*U "
+Z 24 0 0132
+*Z "
+[ 24 0 0133
+lB "
+\ 24 0 0134
+rs "
+] 24 0 0135
+rB "
+^ 24 0 0136
+a^ "
+ha "
+_ 24 0 0137
+ru "
+ul "
+` 24 0 0140
+oq "
+ga "
+a 24 0 0141
+b 24 0 0142
+c 24 0 0143
+d 24 0 0144
+e 24 0 0145
+f 24 0 0146
+g 24 0 0147
+h 24 0 0150
+i 24 0 0151
+j 24 0 0152
+k 24 0 0153
+l 24 0 0154
+m 24 0 0155
+n 24 0 0156
+o 24 0 0157
+*o "
+p 24 0 0160
+q 24 0 0161
+r 24 0 0162
+s 24 0 0163
+t 24 0 0164
+u 24 0 0165
+v 24 0 0166
+w 24 0 0167
+x 24 0 0170
+mu "
+tmu "
+y 24 0 0171
+z 24 0 0172
+{ 24 0 0173
+lC "
+| 24 0 0174
+or "
+bv "
+br "
+ba "
+} 24 0 0175
+rC "
+~ 24 0 0176
+a~ "
+ap "
+ti "
+--- 24 0 0177
diff --git a/font/devascii/devascii.am b/font/devascii/devascii.am
new file mode 100644
index 0000000..02bc802
--- /dev/null
+++ b/font/devascii/devascii.am
@@ -0,0 +1,51 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+devascii_srcdir = $(top_srcdir)/font/devascii
+DEVASCIIFONTS = R I B BI
+DEVASCIIFONTSFILES = \
+ font/devascii/R font/devascii/I font/devascii/B font/devascii/BI
+
+DEVASCIIRES = 240
+DEVASCIICPI = 10
+DEVASCIILPI = 6
+
+devasciifontdir = $(fontdir)/devascii
+devasciifont_DATA = $(DEVASCIIFONTSFILES) font/devascii/DESC
+MOSTLYCLEANFILES += $(DEVASCIIFONTSFILES) font/devascii/DESC
+EXTRA_DIST += \
+ font/devascii/R.proto \
+ font/devascii/DESC.proto
+
+$(DEVASCIIFONTSFILES): $(devascii_srcdir)/R.proto
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && $(RM) $@ \
+ && $(SHELL) $(GENFONTSSH) $(devascii_srcdir)/R.proto \
+ $(DEVASCIIRES) $(DEVASCIICPI) `basename $@` > $@
+
+font/devascii/DESC: $(devascii_srcdir)/DESC.proto
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && $(SHELL) $(GENDESCSH) $(devascii_srcdir)/DESC.proto \
+ $(DEVASCIIRES) $(DEVASCIICPI) $(DEVASCIILPI) \
+ $(DEVASCIIFONTS) > $@
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/font/devcp1047/DESC.proto b/font/devcp1047/DESC.proto
new file mode 100644
index 0000000..88399ab
--- /dev/null
+++ b/font/devcp1047/DESC.proto
@@ -0,0 +1,8 @@
+res 240
+hor 24
+vert 40
+unitwidth 10
+sizes 10 0
+fonts 4 R I B BI
+tcommand
+postpro grotty
diff --git a/font/devcp1047/R.proto b/font/devcp1047/R.proto
new file mode 100644
index 0000000..a1103db
--- /dev/null
+++ b/font/devcp1047/R.proto
@@ -0,0 +1,322 @@
+name R
+internalname 0
+spacewidth 24
+charset
+--- 24 0 0000
+--- 24 0 0001
+--- 24 0 0002
+--- 24 0 0003
+--- 24 0 0004
+--- 24 0 0005
+--- 24 0 0006
+--- 24 0 0007
+--- 24 0 0010
+--- 24 0 0011
+--- 24 0 0012
+--- 24 0 0013
+--- 24 0 0014
+--- 24 0 0015
+--- 24 0 0016
+--- 24 0 0017
+--- 24 0 0020
+--- 24 0 0021
+--- 24 0 0022
+--- 24 0 0023
+--- 24 0 0024
+--- 24 0 0025
+--- 24 0 0026
+--- 24 0 0027
+--- 24 0 0030
+--- 24 0 0031
+--- 24 0 0032
+--- 24 0 0033
+--- 24 0 0034
+--- 24 0 0035
+--- 24 0 0036
+--- 24 0 0037
+--- 24 0 0040
+--- 24 0 0041
+--- 24 0 0042
+--- 24 0 0043
+--- 24 0 0044
+--- 24 0 0045
+--- 24 0 0046
+--- 24 0 0047
+--- 24 0 0050
+--- 24 0 0051
+--- 24 0 0052
+--- 24 0 0053
+--- 24 0 0054
+--- 24 0 0055
+--- 24 0 0056
+--- 24 0 0057
+--- 24 0 0060
+--- 24 0 0061
+--- 24 0 0062
+--- 24 0 0063
+--- 24 0 0064
+--- 24 0 0065
+--- 24 0 0066
+--- 24 0 0067
+--- 24 0 0070
+--- 24 0 0071
+--- 24 0 0072
+--- 24 0 0073
+--- 24 0 0074
+--- 24 0 0075
+--- 24 0 0076
+--- 24 0 0077
+--- 24 0 0100
+--- 24 0 0101
+^a 24 0 0102
+:a 24 0 0103
+`a 24 0 0104
+'a 24 0 0105
+~a 24 0 0106
+oa 24 0 0107
+,c 24 0 0110
+~n 24 0 0111
+ct 24 0 0112
+. 24 0 0113
+< 24 0 0114
+fo "
+la "
+( 24 0 0115
++ 24 0 0116
+pl "
+| 24 0 0117
+ba "
+br "
+bv "
+or "
+& 24 0 0120
+'e 24 0 0121
+^e 24 0 0122
+:e 24 0 0123
+`e 24 0 0124
+'i 24 0 0125
+^i 24 0 0126
+:i 24 0 0127
+`i 24 0 0130
+ss 24 0 0131
+! 24 0 0132
+$ 24 0 0133
+Do "
+* 24 0 0134
+** "
+) 24 0 0135
+; 24 0 0136
+^ 24 0 0137
+a^ "
+ha "
+\- 24 0 0140
+- "
+en "
+hy "
+mi "
+/ 24 0 0141
+f/ "
+sl "
+^A 24 0 0142
+:A 24 0 0143
+`A 24 0 0144
+'A 24 0 0145
+~A 24 0 0146
+oA 24 0 0147
+,C 24 0 0150
+~N 24 0 0151
+bb 24 0 0152
+, 24 0 0153
+% 24 0 0154
+_ 24 0 0155
+ru "
+ul "
+> 24 0 0156
+fc "
+ra "
+? 24 0 0157
+/o 24 0 0160
+'E 24 0 0161
+^E 24 0 0162
+:E 24 0 0163
+`E 24 0 0164
+'I 24 0 0165
+^I 24 0 0166
+:I 24 0 0167
+`I 24 0 0170
+` 24 0 0171
+ga "
+oq "
+: 24 0 0172
+# 24 0 0173
+sh "
+@ 24 0 0174
+at "
+' 24 0 0175
+aq "
+fm "
+cq "
+= 24 0 0176
+eq "
+" 24 0 0177
+dq "
+lq "
+rq "
+/O 24 0 0200
+a 24 0 0201
+b 24 0 0202
+c 24 0 0203
+d 24 0 0204
+e 24 0 0205
+f 24 0 0206
+g 24 0 0207
+h 24 0 0210
+i 24 0 0211
+Fo 24 0 0212
+Fc 24 0 0213
+Sd 24 0 0214
+'y 24 0 0215
+Tp 24 0 0216
++- 24 0 0217
+t+- "
+de 24 0 0220
+j 24 0 0221
+k 24 0 0222
+l 24 0 0223
+m 24 0 0224
+n 24 0 0225
+o 24 0 0226
+*o "
+p 24 0 0227
+q 24 0 0230
+r 24 0 0231
+Of 24 0 0232
+Om 24 0 0233
+ae 24 0 0234
+ac 24 0 0235
+AE 24 0 0236
+Cs 24 0 0237
+*m 24 0 0240
+mc "
+~ 24 0 0241
+a~ "
+ap "
+ti "
+s 24 0 0242
+t 24 0 0243
+u 24 0 0244
+v 24 0 0245
+w 24 0 0246
+x 24 0 0247
+y 24 0 0250
+z 24 0 0251
+r! 24 0 0252
+r? 24 0 0253
+-D 24 0 0254
+[ 24 0 0255
+lB "
+TP 24 0 0256
+rg 24 0 0257
+no 24 0 0260
+tno "
+Po 24 0 0261
+Ye 24 0 0262
+md 24 0 0263
+pc "
+co 24 0 0264
+sc 24 0 0265
+ps 24 0 0266
+14 24 0 0267
+12 24 0 0270
+34 24 0 0271
+'Y 24 0 0272
+ad 24 0 0273
+a- 24 0 0274
+] 24 0 0275
+rB "
+aa 24 0 0276
+mu 24 0 0277
+tmu "
+{ 24 0 0300
+lC "
+A 24 0 0301
+*A "
+B 24 0 0302
+*B "
+C 24 0 0303
+D 24 0 0304
+E 24 0 0305
+*E "
+F 24 0 0306
+G 24 0 0307
+H 24 0 0310
+*Y "
+I 24 0 0311
+*I "
+--- 24 0 0312
+^o 24 0 0313
+:o 24 0 0314
+`o 24 0 0315
+'o 24 0 0316
+~o 24 0 0317
+} 24 0 0320
+rC "
+J 24 0 0321
+K 24 0 0322
+*K "
+L 24 0 0323
+M 24 0 0324
+*M "
+N 24 0 0325
+*N "
+O 24 0 0326
+*O "
+ci "
+P 24 0 0327
+*R "
+Q 24 0 0330
+R 24 0 0331
+S1 24 0 0332
+^u 24 0 0333
+:u 24 0 0334
+`u 24 0 0335
+'u 24 0 0336
+:y 24 0 0337
+\ 24 0 0340
+rs "
+di 24 0 0341
+tdi "
+S 24 0 0342
+T 24 0 0343
+*T "
+U 24 0 0344
+V 24 0 0345
+W 24 0 0346
+X 24 0 0347
+*X "
+Y 24 0 0350
+*U "
+Z 24 0 0351
+*Z "
+S2 24 0 0352
+^O 24 0 0353
+:O 24 0 0354
+`O 24 0 0355
+'O 24 0 0356
+~O 24 0 0357
+0 24 0 0360
+1 24 0 0361
+2 24 0 0362
+3 24 0 0363
+4 24 0 0364
+5 24 0 0365
+6 24 0 0366
+7 24 0 0367
+8 24 0 0370
+9 24 0 0371
+S3 24 0 0372
+^U 24 0 0373
+:U 24 0 0374
+`U 24 0 0375
+'U 24 0 0376
+--- 24 0 0377
diff --git a/font/devcp1047/devcp1047.am b/font/devcp1047/devcp1047.am
new file mode 100644
index 0000000..e320dd8
--- /dev/null
+++ b/font/devcp1047/devcp1047.am
@@ -0,0 +1,49 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+devcp1047_srcdir = $(top_srcdir)/font/devcp1047
+DEVCP1047FONTS = R I B BI
+DEVCP1047FONTSFILES = \
+ font/devcp1047/R font/devcp1047/I font/devcp1047/B font/devcp1047/BI
+
+DEVCP1047RES = 240
+DEVCP1047CPI = 10
+DEVCP1047LPI = 6
+
+devcp1047fontdir = $(fontdir)/devcp1047
+devcp1047font_DATA = $(DEVCP1047FONTSFILES) font/devcp1047/DESC
+MOSTLYCLEANFILES += $(DEVCP1047FONTSFILES) font/devcp1047/DESC
+EXTRA_DIST += font/devcp1047/R.proto font/devcp1047/DESC.proto
+
+$(DEVCP1047FONTSFILES): $(devcp1047_srcdir)/R.proto
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && $(RM) $@ \
+ && $(SHELL) $(GENFONTSSH) $(devcp1047_srcdir)/R.proto \
+ $(DEVCP1047RES) $(DEVCP1047CPI) `basename $@` > $@
+
+font/devcp1047/DESC: $(devcp1047_srcdir)/DESC.proto
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && $(SHELL) $(GENDESCSH) $(devcp1047_srcdir)/DESC.proto \
+ $(DEVCP1047RES) $(DEVCP1047CPI) $(DEVCP1047LPI) \
+ $(DEVCP1047FONTS) > $@
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/font/devdvi/CW b/font/devdvi/CW
new file mode 100644
index 0000000..99d5df9
--- /dev/null
+++ b/font/devdvi/CW
@@ -0,0 +1,152 @@
+name CW
+special
+internalname cmtt10
+spacewidth 550498
+checksum -538297224
+designsize 10485760
+charset
+*G 550498,640797 2 0000
+*D 550498,640797 2 0001
+*H 550498,640797 2 0002
+*L 550498,640797 2 0003
+*C 550498,640797 2 0004
+*P 550498,640797 2 0005
+*S 550498,640797 2 0006
+*U 550498,640797 2 0007
+*F 550498,640797 2 0010
+*Q 550498,640797 2 0011
+*W 550498,640797 2 0012
+ff 550498,640797 2 0013
+fi 550498,640797 2 0014
+fl 550498,640797 2 0015
+Fi 550498,407779,233018 1 0016
+Fl 550498,407779,233018 1 0017
+.i 550498,451470 0 0020
+.j 550498,451470,233018 1 0021
+ga 550498,640797 2 0022
+aa 550498,640797 2 0023
+ah 550498,593466 2 0024
+ab 550498,640797 2 0025
+a- 550498,593027 2 0026
+ao 550498,640797 2 0027
+ac 550498,0,203891 1 0030
+ss 550498,640797 2 0031
+ae 550498,451470 0 0032
+oe 550498,451470 0 0033
+/o 550498,567979,116509 3 0034
+AE 550498,640797 2 0035
+OE 550498,640797 2 0036
+/O 550498,699051,58254 3 0037
+u2423 550498,230104,116509 1 0040
+! 550498,640797 2 0041
+dq 550498,640797 2 0042
+" "
+sh 550498,640797 2 0043
+# "
+Do 550498,728178,87381 3 0044
+$ "
+% 550498,728178,87381 3 0045
+& 550498,640797 2 0046
+cq 550498,640797 2 0047
+' "
+( 550498,728178,87379 3 0050
+) 550498,728178,87379 3 0051
+* 550498,546134 2 0052
++ 550498,556326,-84470 2 0053
+, 550498,131072,145635 1 0054
+\- 550498,556326,-84470 2 0055
+- "
+. 550498,131072 0 0056
+sl 550498,728178,87379 3 0057
+/ "
+0 550498,640797 2 0060
+1 550498,640797 2 0061
+2 550498,640797 2 0062
+3 550498,640797 2 0063
+4 550498,640797 2 0064
+5 550498,640797 2 0065
+6 550498,640797 2 0066
+7 550498,640797 2 0067
+8 550498,640797 2 0070
+9 550498,640797 2 0071
+: 550498,451470 0 0072
+; 550498,451470,145635 1 0073
+< 550498,582542,-58254 2 0074
+= 550498,435813,-204984 0 0075
+> 550498,582542,-58254 2 0076
+? 550498,640797 2 0077
+at 550498,640797 2 0100
+@ "
+A 550498,640797 2 0101
+B 550498,640797 2 0102
+C 550498,640797 2 0103
+D 550498,640797 2 0104
+E 550498,640797 2 0105
+F 550498,640797 2 0106
+G 550498,640797 2 0107
+H 550498,640797 2 0110
+I 550498,640797 2 0111
+J 550498,640797 2 0112
+K 550498,640797 2 0113
+L 550498,640797 2 0114
+M 550498,640797 2 0115
+N 550498,640797 2 0116
+O 550498,640797 2 0117
+P 550498,640797 2 0120
+Q 550498,640797,145635 3 0121
+R 550498,640797 2 0122
+S 550498,640797 2 0123
+T 550498,640797 2 0124
+U 550498,640797 2 0125
+V 550498,640797 2 0126
+W 550498,640797 2 0127
+X 550498,640797 2 0130
+Y 550498,640797 2 0131
+Z 550498,640797 2 0132
+lB 550498,728178,87379 3 0133
+[ "
+rs 550498,728178,87379 3 0134
+\ "
+rB 550498,728178,87379 3 0135
+] "
+ha 550498,640797 2 0136
+^ "
+a^ "
+_ 550498,0,99757 1 0137
+oq 550498,640797 2 0140
+` "
+a 550498,451470 0 0141
+b 550498,640797 2 0142
+c 550498,451470 0 0143
+d 550498,640797 2 0144
+e 550498,451470 0 0145
+f 550498,640797 2 0146
+g 550498,451470,233018 1 0147
+h 550498,640797 2 0150
+i 550498,640797 2 0151
+j 550498,640797,233018 3 0152
+k 550498,640797 2 0153
+l 550498,640797 2 0154
+m 550498,451470 0 0155
+n 550498,451470 0 0156
+o 550498,451470 0 0157
+p 550498,451470,233018 1 0160
+q 550498,451470,233018 1 0161
+r 550498,451470 0 0162
+s 550498,451470 0 0163
+t 550498,580466 2 0164
+u 550498,451470 0 0165
+v 550498,451470 0 0166
+w 550498,451470 0 0167
+x 550498,451470 0 0170
+y 550498,451470,233018 1 0171
+z 550498,451470 0 0172
+{ 550498,728178,87379 3 0173
+lC "
+| 550498,728178,87379 3 0174
+ba "
+} 550498,728178,87379 3 0175
+rC "
+~ 550498,640797 2 0176
+a~ "
+ad 550498,640797 2 0177
diff --git a/font/devdvi/CWEC b/font/devdvi/CWEC
new file mode 100644
index 0000000..d777901
--- /dev/null
+++ b/font/devdvi/CWEC
@@ -0,0 +1,280 @@
+name CWEC
+internalname ectt1000
+spacewidth 550368
+checksum 1900807883
+designsize 10485760
+charset
+ga 550368,640640 2 0000
+aa 550368,640640 2 0001
+a^ 550368,669760 2 0002
+a~ 550368,669760 2 0003
+ad 550368,640640 2 0004
+a" 550368,640640 2 0005
+ao 550368,669760 2 0006
+ah 550368,669760 2 0007
+ab 550368,669760 2 0010
+a- 550368,640640 2 0011
+a. 550368,640640 2 0012
+ac 550368,0,203840 1 0013
+ho 550368,0,232960 1 0014
+bq 550368,131040,145600 1 0015
+fo 550368,460096 2 0016
+fc 550368,460096 2 0017
+lq 550368,640640 2 0020
+rq 550368,640640 2 0021
+Bq 550368,131040,145600 1 0022
+Fo 550368,460096 2 0023
+Fc 550368,460096 2 0024
+en 550368,451360 0 0025
+em 550368,451360 0 0026
+--- 0,451360 0 0027
+--- 550368,728000,87360 3 0030
+.i 550368,451360 0 0031
+.j 550368,451360,232960 1 0032
+ff 550368,640640 2 0033
+fi 550368,640640 2 0034
+fl 550368,640640 2 0035
+Fi 550368,640640 2 0036
+Fl 550368,640640 2 0037
+u2423 550368,451360,116480 1 0040
+u01C3 550368,640640 2 0041
+! "
+dq 550368,640640 2 0042
+" "
+sh 550368,640640 2 0043
+# "
+Do 550368,728000,87360 3 0044
+$ "
+% 550368,728000,87360 3 0045
+& 550368,640640 2 0046
+cq 550368,640640 2 0047
+' "
+( 550368,728000,87360 3 0050
+) 550368,728000,87360 3 0051
+* 550368,546000 2 0052
++ 550368,556192,-84448 2 0053
+, 550368,131040,145600 1 0054
+- 550368,451360 0 0055
+. 550368,131040 0 0056
+sl 550368,728000,87360 3 0057
+/ "
+0 550368,640640 2 0060
+1 550368,640640 2 0061
+2 550368,640640 2 0062
+3 550368,640640 2 0063
+4 550368,640640 2 0064
+5 550368,640640 2 0065
+6 550368,640640 2 0066
+7 550368,640640 2 0067
+8 550368,640640 2 0070
+9 550368,640640 2 0071
+: 550368,451360 0 0072
+; 550368,451360,145600 1 0073
+< 550368,581362,-58240 2 0074
+= 550368,435706,-204934 0 0075
+> 550368,581362,-58240 2 0076
+? 550368,640640 2 0077
+at 550368,640640 2 0100
+@ "
+A 550368,640640 2 0101
+B 550368,640640 2 0102
+C 550368,640640 2 0103
+D 550368,640640 2 0104
+E 550368,640640 2 0105
+F 550368,640640 2 0106
+G 550368,640640 2 0107
+H 550368,640640 2 0110
+I 550368,640640 2 0111
+J 550368,640640 2 0112
+K 550368,640640 2 0113
+L 550368,640640 2 0114
+M 550368,640640 2 0115
+N 550368,640640 2 0116
+O 550368,640640 2 0117
+P 550368,640640 2 0120
+Q 550368,640640,145600 3 0121
+R 550368,640640 2 0122
+S 550368,640640 2 0123
+T 550368,640640 2 0124
+U 550368,640640 2 0125
+V 550368,640640 2 0126
+W 550368,640640 2 0127
+X 550368,640640 2 0130
+Y 550368,640640 2 0131
+Z 550368,640640 2 0132
+lB 550368,728000,87360 3 0133
+[ "
+rs 550368,728000,87360 3 0134
+\ "
+rB 550368,728000,87360 3 0135
+] "
+ha 550368,640640 2 0136
+^ "
+_ 550368,0,99733 1 0137
+oq 550368,640640 2 0140
+` "
+a 550368,451360 0 0141
+b 550368,640640 2 0142
+c 550368,451360 0 0143
+d 550368,640640 2 0144
+e 550368,451360 0 0145
+f 550368,640640 2 0146
+g 550368,451360,232960 1 0147
+h 550368,640640 2 0150
+i 550368,640640 2 0151
+j 550368,640640,232960 3 0152
+k 550368,640640 2 0153
+l 550368,640640 2 0154
+m 550368,451360 0 0155
+n 550368,451360 0 0156
+o 550368,451360 0 0157
+p 550368,451360,232960 1 0160
+q 550368,451360,232960 1 0161
+r 550368,451360 0 0162
+s 550368,451360 0 0163
+t 550368,581362 2 0164
+u 550368,451360 0 0165
+v 550368,451360 0 0166
+w 550368,451360 0 0167
+x 550368,451360 0 0170
+y 550368,451360,232960 1 0171
+z 550368,451360 0 0172
+lC 550368,728000,87360 3 0173
+{ "
+u01C0 550368,728000,87360 3 0174
+ba "
+| "
+rC 550368,728000,87360 3 0175
+} "
+~ 550368,640640 2 0176
+hy 550368,451360 0 0177
+u0041_0306 550368,859040 2 0200
+u0041_0328 550368,640640,232960 3 0201
+'C 550368,816227 2 0202
+u0043_030C 550368,859040 2 0203
+u0044_030C 550368,859040 2 0204
+u0045_030C 550368,859040 2 0205
+u0045_0328 550368,640640,232960 3 0206
+u0047_0306 550368,859040 2 0207
+u004C_0301 550368,816227 2 0210
+u004C_030C 550368,859040 2 0211
+/L 550368,640640 2 0212
+u004E_0301 550368,816227 2 0213
+u004E_030C 550368,859040 2 0214
+u014A 550368,640640 2 0215
+u004F_030B 550368,816227 2 0216
+u0052_0301 550368,816227 2 0217
+u0052_030C 550368,859040 2 0220
+u0053_0301 550368,816227 2 0221
+vS 550368,859040 2 0222
+u0053_0327 550368,640640,203840 3 0223
+u0054_030C 550368,859040 2 0224
+u0054_0327 550368,640640,203840 3 0225
+u0055_030B 550368,816227 2 0226
+u0055_030A 550368,859040 2 0227
+:Y 550368,859040 2 0230
+u005A_0301 550368,816227 2 0231
+vZ 550368,859040 2 0232
+u005A_0307 550368,816227 2 0233
+IJ 550368,640640 2 0234
+u0049_0307 550368,816227 2 0235
+u0111 550368,640640 2 0236
+sc 550368,640640,232960 3 0237
+u0061_0306 550368,669760 2 0240
+u0061_0328 550368,451360,232960 1 0241
+'c 550368,640640 2 0242
+u0063_030C 550368,669760 2 0243
+u0064_030C 550368,640640 2 0244
+u0065_030C 550368,669760 2 0245
+u0065_0328 550368,451360,232960 1 0246
+u0067_0306 550368,669760,232960 3 0247
+u006C_0301 550368,816227 2 0250
+u006C_030C 550368,640640 2 0251
+/l 550368,640640 2 0252
+u006E_0301 550368,640640 2 0253
+u006E_030C 550368,669760 2 0254
+u016A 550368,451360,232960 1 0255
+u006F_030B 550368,640640 2 0256
+u0072_0301 550368,640640 2 0257
+u0072_030C 550368,669760 2 0260
+u0073_0301 550368,640640 2 0261
+vs 550368,669760 2 0262
+u0073_0327 550368,451360,203840 1 0263
+u0074_030C 550368,640640 2 0264
+u0074_0327 550368,581362,203840 3 0265
+u0075_030B 550368,640640 2 0266
+u0075_030A 550368,669760 2 0267
+:y 550368,640640,232960 3 0270
+u007A_0301 550368,640640 2 0271
+vz 550368,669760 2 0272
+u007A_0307 550368,640640 2 0273
+ij 550368,640640,232960 3 0274
+r! 550368,407680,232960 1 0275
+r? 550368,407680,232960 1 0276
+Po 550368,640640 2 0277
+`A 550368,816227 2 0300
+'A 550368,816227 2 0301
+^A 550368,859040 2 0302
+~A 550368,859040 2 0303
+:A 550368,859040 2 0304
+oA 550368,816227 2 0305
+AE 550368,640640 2 0306
+,C 550368,640640,203840 3 0307
+`E 550368,816227 2 0310
+'E 550368,816227 2 0311
+^E 550368,859040 2 0312
+:E 550368,859040 2 0313
+`I 550368,816227 2 0314
+'I 550368,816227 2 0315
+^I 550368,859040 2 0316
+:I 550368,859040 2 0317
+u0189 550368,640640 2 0320
+u0110 "
+-D "
+~N 550368,859040 2 0321
+`O 550368,816227 2 0322
+'O 550368,816227 2 0323
+^O 550368,859040 2 0324
+~O 550368,859040 2 0325
+:O 550368,859040 2 0326
+OE 550368,640640 2 0327
+/O 550368,698880,58240 3 0330
+`U 550368,816227 2 0331
+'U 550368,816227 2 0332
+^U 550368,859040 2 0333
+:U 550368,859040 2 0334
+'Y 550368,816227 2 0335
+TP 550368,640640 2 0336
+--- 550368,640640 2 0337
+`a 550368,640640 2 0340
+'a 550368,640640 2 0341
+^a 550368,669760 2 0342
+~a 550368,669760 2 0343
+:a 550368,640640 2 0344
+oa 550368,669760 2 0345
+ae 550368,451360 0 0346
+,c 550368,451360,203840 1 0347
+`e 550368,640640 2 0350
+'e 550368,640640 2 0351
+^e 550368,669760 2 0352
+:e 550368,640640 2 0353
+`i 550368,640640 2 0354
+'i 550368,640640 2 0355
+^i 550368,669760 2 0356
+:i 550368,640640 2 0357
+Sd 550368,640640 2 0360
+~n 550368,669760 2 0361
+`o 550368,640640 2 0362
+'o 550368,640640 2 0363
+^o 550368,669760 2 0364
+~o 550368,669760 2 0365
+:o 550368,640640 2 0366
+oe 550368,451360 0 0367
+/o 550368,567840,116480 3 0370
+`u 550368,640640 2 0371
+'u 550368,640640 2 0372
+^u 550368,669760 2 0373
+:u 550368,640640 2 0374
+'y 550368,640640,232960 3 0375
+Tp 550368,640640,232960 3 0376
+ss 550368,640640 2 0377
diff --git a/font/devdvi/CWI b/font/devdvi/CWI
new file mode 100644
index 0000000..8db0518
--- /dev/null
+++ b/font/devdvi/CWI
@@ -0,0 +1,151 @@
+name CWI
+internalname cmitt10
+spacewidth 550498
+slant 14.036243
+checksum -538297224
+designsize 10485760
+charset
+*G 550498,640797,0,182045 2 0000
+*D 550498,640797,0,182045 2 0001
+*H 550498,640797,0,182045 2 0002
+*L 550498,640797,0,182045 2 0003
+*C 550498,640797,0,182045 2 0004
+*P 550498,640797,0,182045 2 0005
+*S 550498,640797,0,182045 2 0006
+*U 550498,640797,0,182045 2 0007
+*F 550498,640797,0,182045 2 0010
+*Q 550498,640797,0,182045 2 0011
+*W 550498,640797,0,182045 2 0012
+ff 550498,640797,0,182045 2 0013
+fi 550498,640797,0,182045 2 0014
+fl 550498,640797,0,182045 2 0015
+Fi 550498,407779,233018,182045 1 0016
+Fl 550498,407779,233018,182045 1 0017
+.i 550498,451470,0,182045 0 0020
+.j 550498,451470,233018,182045 1 0021
+ga 550498,640797,0,182045 2 0022
+aa 550498,640797,0,182045 2 0023
+ah 550498,593466,0,182045 2 0024
+ab 550498,640797,0,182045 2 0025
+a- 550498,593027,0,182045 2 0026
+ao 550498,640797,0,182045 2 0027
+ac 550498,0,203891,182045 1 0030
+ss 550498,640797,233018,182045 3 0031
+ae 550498,451470,0,182045 0 0032
+oe 550498,451470,0,182045 0 0033
+/o 550498,567979,116509,182045 3 0034
+AE 550498,640797,0,182045 2 0035
+OE 550498,640797,0,182045 2 0036
+/O 550498,699051,58254,182045 3 0037
+u2423 550498,230104,116509,182045 1 0040
+! 550498,640797,0,182045 2 0041
+dq 550498,640797,0,182045 2 0042
+" "
+sh 550498,640797,0,182045 2 0043
+# "
+Po 550498,640797,0,182045 2 0044
+% 550498,728178,87381,182045 3 0045
+& 550498,640797,0,182045 2 0046
+cq 550498,640797,0,182045 2 0047
+' "
+( 550498,728178,87379,182045 3 0050
+) 550498,728178,87379,182045 3 0051
+* 550498,546134,0,182045 2 0052
++ 550498,556326,-84470,182045 2 0053
+, 550498,131072,145635,182045 1 0054
+\- 550498,556326,-84470,182045 2 0055
+- "
+. 550498,131072,0,182045 0 0056
+sl 550498,728178,87379,182045 3 0057
+/ "
+0 550498,640797,0,182045 2 0060
+1 550498,640797,0,182045 2 0061
+2 550498,640797,0,182045 2 0062
+3 550498,640797,0,182045 2 0063
+4 550498,640797,233018,182045 3 0064
+5 550498,640797,0,182045 2 0065
+6 550498,640797,0,182045 2 0066
+7 550498,640797,233018,182045 3 0067
+8 550498,640797,0,182045 2 0070
+9 550498,640797,0,182045 2 0071
+: 550498,451470,0,182045 0 0072
+; 550498,451470,145635,182045 1 0073
+< 550498,582542,-58254,182045 2 0074
+= 550498,435813,-204984,182045 0 0075
+> 550498,582542,-58254,182045 2 0076
+? 550498,640797,0,182045 2 0077
+at 550498,640797,0,182045 2 0100
+@ "
+A 550498,640797,0,182045 2 0101
+B 550498,640797,0,182045 2 0102
+C 550498,640797,0,182045 2 0103
+D 550498,640797,0,182045 2 0104
+E 550498,640797,0,182045 2 0105
+F 550498,640797,0,182045 2 0106
+G 550498,640797,0,182045 2 0107
+H 550498,640797,0,182045 2 0110
+I 550498,640797,0,182045 2 0111
+J 550498,640797,0,182045 2 0112
+K 550498,640797,0,182045 2 0113
+L 550498,640797,0,182045 2 0114
+M 550498,640797,0,182045 2 0115
+N 550498,640797,0,182045 2 0116
+O 550498,640797,0,182045 2 0117
+P 550498,640797,0,182045 2 0120
+Q 550498,640797,145635,182045 3 0121
+R 550498,640797,0,182045 2 0122
+S 550498,640797,0,182045 2 0123
+T 550498,640797,0,182045 2 0124
+U 550498,640797,0,182045 2 0125
+V 550498,640797,0,182045 2 0126
+W 550498,640797,0,182045 2 0127
+X 550498,640797,0,182045 2 0130
+Y 550498,640797,0,182045 2 0131
+Z 550498,640797,0,182045 2 0132
+lB 550498,728178,87379,182045 3 0133
+[ "
+rs 550498,728178,87379,182045 3 0134
+\ "
+rB 550498,728178,87379,182045 3 0135
+] "
+ha 550498,640797,0,182045 2 0136
+^ "
+a^ "
+_ 550498,0,99757,182045 1 0137
+oq 550498,640797,0,182045 2 0140
+` "
+a 550498,451470,0,182045 0 0141
+b 550498,640797,0,182045 2 0142
+c 550498,451470,0,182045 0 0143
+d 550498,640797,0,182045 2 0144
+e 550498,451470,0,182045 0 0145
+f 550498,640797,233018,182045 3 0146
+g 550498,451470,233018,182045 1 0147
+h 550498,640797,0,182045 2 0150
+i 550498,640797,0,182045 2 0151
+j 550498,640797,233018,182045 3 0152
+k 550498,640797,0,182045 2 0153
+l 550498,640797,0,182045 2 0154
+m 550498,451470,0,182045 0 0155
+n 550498,451470,0,182045 0 0156
+o 550498,451470,0,182045 0 0157
+p 550498,451470,233018,182045 1 0160
+q 550498,451470,233018,182045 1 0161
+r 550498,451470,0,182045 0 0162
+s 550498,451470,0,182045 0 0163
+t 550498,640797,0,182045 2 0164
+u 550498,451470,0,182045 0 0165
+v 550498,451470,0,182045 0 0166
+w 550498,451470,0,182045 0 0167
+x 550498,451470,0,182045 0 0170
+y 550498,451470,233018,182045 1 0171
+z 550498,451470,0,182045 0 0172
+{ 550498,728178,87379,182045 3 0173
+lC "
+| 550498,728178,87379,182045 3 0174
+ba "
+} 550498,728178,87379,182045 3 0175
+rC "
+~ 550498,640797,0,182045 2 0176
+a~ "
+ad 550498,640797,0,182045 2 0177
diff --git a/font/devdvi/CWIEC b/font/devdvi/CWIEC
new file mode 100644
index 0000000..5e2356b
--- /dev/null
+++ b/font/devdvi/CWIEC
@@ -0,0 +1,281 @@
+name CWIEC
+internalname ecit1000
+spacewidth 550368
+slant 14.036243
+checksum 1900807883
+designsize 10485760
+charset
+ga 550368,640640,0,182000 2 0000
+aa 550368,640640,0,182000 2 0001
+a^ 550368,669760 2 0002
+a~ 550368,669760,0,182000 2 0003
+ad 550368,640640,0,182000 2 0004
+a" 550368,640640,0,182000 2 0005
+ao 550368,669760,0,182000 2 0006
+ah 550368,669760 2 0007
+ab 550368,669760,0,182000 2 0010
+a- 550368,640640,0,182000 2 0011
+a. 550368,640640,0,182000 2 0012
+ac 550368,0,203840,182000 1 0013
+ho 550368,0,232960,182000 1 0014
+bq 550368,131040,145600,182000 1 0015
+fo 550368,460096,0,182000 2 0016
+fc 550368,460096,0,182000 2 0017
+lq 550368,640640,0,182000 2 0020
+rq 550368,640640,0,182000 2 0021
+Bq 550368,131040,145600,182000 1 0022
+Fo 550368,460096,0,182000 2 0023
+Fc 550368,460096,0,182000 2 0024
+en 550368,451360,0,182000 0 0025
+em 550368,451360,0,182000 0 0026
+--- 0,451360 0 0027
+--- 550368,728000,87360,182000 3 0030
+.i 550368,451360,0,182000 0 0031
+.j 550368,451360,232960,182000 1 0032
+ff 550368,640640,232960,182000 3 0033
+fi 550368,640640,232960,182000 3 0034
+fl 550368,640640,232960,182000 3 0035
+Fi 550368,640640,232960,182000 3 0036
+Fl 550368,640640,232960,182000 3 0037
+u2423 550368,451360,116480,182000 1 0040
+u01C3 550368,640640,0,182000 2 0041
+! "
+dq 550368,640640,0,182000 2 0042
+" "
+sh 550368,640640,0,182000 2 0043
+# "
+Do 550368,728000,87360,182000 3 0044
+$ "
+% 550368,728000,87360,182000 3 0045
+& 550368,640640,0,182000 2 0046
+cq 550368,640640,0,182000 2 0047
+' "
+( 550368,728000,87360,182000 3 0050
+) 550368,728000,87360,182000 3 0051
+* 550368,546000,0,182000 2 0052
++ 550368,556192,-84448,182000 2 0053
+, 550368,131040,145600,182000 1 0054
+- 550368,451360,0,182000 0 0055
+. 550368,131040,0,182000 0 0056
+sl 550368,728000,87360,182000 3 0057
+/ "
+0 550368,640640,0,182000 2 0060
+1 550368,640640,0,182000 2 0061
+2 550368,640640,0,182000 2 0062
+3 550368,640640,0,182000 2 0063
+4 550368,640640,232960,182000 3 0064
+5 550368,640640,0,182000 2 0065
+6 550368,640640,0,182000 2 0066
+7 550368,640640,0,182000 2 0067
+8 550368,640640,0,182000 2 0070
+9 550368,640640,0,182000 2 0071
+: 550368,451360,0,182000 0 0072
+; 550368,451360,145600,182000 1 0073
+< 550368,582400,-58240,182000 2 0074
+= 550368,435706,-204934,182000 0 0075
+> 550368,582400,-58240,182000 2 0076
+? 550368,640640,0,182000 2 0077
+at 550368,640640,0,182000 2 0100
+@ "
+A 550368,640640,0,182000 2 0101
+B 550368,640640,0,182000 2 0102
+C 550368,640640,0,182000 2 0103
+D 550368,640640,0,182000 2 0104
+E 550368,640640,0,182000 2 0105
+F 550368,640640,0,182000 2 0106
+G 550368,640640,0,182000 2 0107
+H 550368,640640,0,182000 2 0110
+I 550368,640640,0,182000 2 0111
+J 550368,640640,0,182000 2 0112
+K 550368,640640,0,182000 2 0113
+L 550368,640640,0,182000 2 0114
+M 550368,640640,0,182000 2 0115
+N 550368,640640,0,182000 2 0116
+O 550368,640640,0,182000 2 0117
+P 550368,640640,0,182000 2 0120
+Q 550368,640640,145600,182000 3 0121
+R 550368,640640,0,182000 2 0122
+S 550368,640640,0,182000 2 0123
+T 550368,640640,0,182000 2 0124
+U 550368,640640,0,182000 2 0125
+V 550368,640640,0,182000 2 0126
+W 550368,640640,0,182000 2 0127
+X 550368,640640,0,182000 2 0130
+Y 550368,640640,0,182000 2 0131
+Z 550368,640640,0,182000 2 0132
+lB 550368,728000,87360,182000 3 0133
+[ "
+rs 550368,728000,87360,182000 3 0134
+\ "
+rB 550368,728000,87360,182000 3 0135
+] "
+ha 550368,640640,0,182000 2 0136
+^ "
+_ 550368,0,99733,182000 1 0137
+oq 550368,640640,0,182000 2 0140
+` "
+a 550368,451360,0,182000 0 0141
+b 550368,640640,0,182000 2 0142
+c 550368,451360,0,182000 0 0143
+d 550368,640640,0,182000 2 0144
+e 550368,451360,0,182000 0 0145
+f 550368,640640,232960,182000 3 0146
+g 550368,451360,232960,182000 1 0147
+h 550368,640640,0,182000 2 0150
+i 550368,640640,0,182000 2 0151
+j 550368,640640,232960,182000 3 0152
+k 550368,640640,0,182000 2 0153
+l 550368,640640,0,182000 2 0154
+m 550368,451360,0,182000 0 0155
+n 550368,451360,0,182000 0 0156
+o 550368,451360,0,182000 0 0157
+p 550368,451360,232960,182000 1 0160
+q 550368,451360,232960,182000 1 0161
+r 550368,451360,0,182000 0 0162
+s 550368,451360,0,182000 0 0163
+t 550368,640640,0,182000 2 0164
+u 550368,451360,0,182000 0 0165
+v 550368,451360,0,182000 0 0166
+w 550368,451360,0,182000 0 0167
+x 550368,451360,0,182000 0 0170
+y 550368,451360,232960,182000 1 0171
+z 550368,451360,0,182000 0 0172
+lC 550368,728000,87360,182000 3 0173
+{ "
+u01C0 550368,728000,87360,182000 3 0174
+ba "
+| "
+rC 550368,728000,87360,182000 3 0175
+} "
+~ 550368,640640,0,182000 2 0176
+hy 550368,451360,0,182000 0 0177
+u0041_0306 550368,859040,0,182000 2 0200
+u0041_0328 550368,640640,232960,182000 3 0201
+'C 550368,816379,0,182000 2 0202
+u0043_030C 550368,859040,0,182000 2 0203
+u0044_030C 550368,859040,0,182000 2 0204
+u0045_030C 550368,859040,0,182000 2 0205
+u0045_0328 550368,640640,232960,182000 3 0206
+u0047_0306 550368,859040,0,182000 2 0207
+u004C_0301 550368,816379,0,182000 2 0210
+u004C_030C 550368,859040,0,182000 2 0211
+/L 550368,640640,0,182000 2 0212
+u004E_0301 550368,816379,0,182000 2 0213
+u004E_030C 550368,859040,0,182000 2 0214
+u014A 550368,640640,0,160160 2 0215
+u004F_030B 550368,816379,0,182000 2 0216
+u0052_0301 550368,816379,0,182000 2 0217
+u0052_030C 550368,859040,0,182000 2 0220
+u0053_0301 550368,816379,0,182000 2 0221
+vS 550368,859040,0,182000 2 0222
+u0053_0327 550368,640640,203840,182000 3 0223
+u0054_030C 550368,859040,0,182000 2 0224
+u0054_0327 550368,640640,203840,182000 3 0225
+u0055_030B 550368,816379,0,182000 2 0226
+u0055_030A 550368,859040,0,182000 2 0227
+:Y 550368,859040,0,182000 2 0230
+u005A_0301 550368,816379,0,182000 2 0231
+vZ 550368,859040,0,182000 2 0232
+u005A_0307 550368,816379,0,182000 2 0233
+IJ 550368,640640,0,182000 2 0234
+u0049_0307 550368,816379,0,182000 2 0235
+u0111 550368,640640,0,182000 2 0236
+sc 550368,640640,232960,182000 3 0237
+u0061_0306 550368,669760,0,182000 2 0240
+u0061_0328 550368,451360,232960,182000 1 0241
+'c 550368,640640,0,182000 2 0242
+u0063_030C 550368,669760,0,182000 2 0243
+u0064_030C 550368,640640,0,182000 2 0244
+u0065_030C 550368,669760,0,182000 2 0245
+u0065_0328 550368,451360,232960,182000 1 0246
+u0067_0306 550368,669760,232960,182000 3 0247
+u006C_0301 550368,816379,0,182000 2 0250
+u006C_030C 550368,640640,0,182000 2 0251
+/l 550368,640640,0,182000 2 0252
+u006E_0301 550368,640640,0,182000 2 0253
+u006E_030C 550368,669760,0,182000 2 0254
+u016A 550368,451360,232960,182000 1 0255
+u006F_030B 550368,669760,0,182000 2 0256
+u0072_0301 550368,640640,0,182000 2 0257
+u0072_030C 550368,669760,0,182000 2 0260
+u0073_0301 550368,640640,0,182000 2 0261
+vs 550368,669760,0,182000 2 0262
+u0073_0327 550368,451360,203840,182000 1 0263
+u0074_030C 550368,640640,0,182000 2 0264
+u0074_0327 550368,640640,203840,182000 3 0265
+u0075_030B 550368,640640,0,182000 2 0266
+u0075_030A 550368,669760,0,182000 2 0267
+:y 550368,669760,232960,182000 3 0270
+u007A_0301 550368,640640,0,182000 2 0271
+vz 550368,669760,0,182000 2 0272
+u007A_0307 550368,640640,0,182000 2 0273
+ij 550368,640640,232960,182000 3 0274
+r! 550368,407680,232960,182000 1 0275
+r? 550368,407680,232960,182000 1 0276
+Po 550368,640640,0,182000 2 0277
+`A 550368,816379,0,182000 2 0300
+'A 550368,816379,0,182000 2 0301
+^A 550368,859040,0,182000 2 0302
+~A 550368,859040,0,182000 2 0303
+:A 550368,859040,0,182000 2 0304
+oA 550368,816379,0,182000 2 0305
+AE 550368,640640,0,182000 2 0306
+,C 550368,640640,203840,182000 3 0307
+`E 550368,816379,0,182000 2 0310
+'E 550368,816379,0,182000 2 0311
+^E 550368,859040,0,182000 2 0312
+:E 550368,859040,0,182000 2 0313
+`I 550368,816379,0,182000 2 0314
+'I 550368,816379,0,182000 2 0315
+^I 550368,859040,0,182000 2 0316
+:I 550368,859040,0,182000 2 0317
+u0189 550368,640640,0,182000 2 0320
+u0110 "
+-D "
+~N 550368,859040,0,182000 2 0321
+`O 550368,816379,0,182000 2 0322
+'O 550368,816379,0,182000 2 0323
+^O 550368,859040,0,182000 2 0324
+~O 550368,859040,0,182000 2 0325
+:O 550368,859040,0,182000 2 0326
+OE 550368,640640,0,182000 2 0327
+/O 550368,698880,58240,182000 3 0330
+`U 550368,816379,0,182000 2 0331
+'U 550368,816379,0,182000 2 0332
+^U 550368,859040,0,182000 2 0333
+:U 550368,859040,0,182000 2 0334
+'Y 550368,816379,0,182000 2 0335
+TP 550368,640640,0,182000 2 0336
+--- 550368,640640,0,182000 2 0337
+`a 550368,640640,0,182000 2 0340
+'a 550368,640640,0,182000 2 0341
+^a 550368,669760,0,182000 2 0342
+~a 550368,669760,0,182000 2 0343
+:a 550368,669760,0,182000 2 0344
+oa 550368,669760,0,182000 2 0345
+ae 550368,451360,0,182000 0 0346
+,c 550368,451360,203840,182000 1 0347
+`e 550368,640640,0,182000 2 0350
+'e 550368,640640,0,182000 2 0351
+^e 550368,669760,0,182000 2 0352
+:e 550368,669760,0,182000 2 0353
+`i 550368,640640,0,182000 2 0354
+'i 550368,640640,0,182000 2 0355
+^i 550368,669760,0,182000 2 0356
+:i 550368,669760,0,182000 2 0357
+Sd 550368,640640,0,182000 2 0360
+~n 550368,669760,0,182000 2 0361
+`o 550368,640640,0,182000 2 0362
+'o 550368,640640,0,182000 2 0363
+^o 550368,669760,0,182000 2 0364
+~o 550368,669760,0,182000 2 0365
+:o 550368,669760,0,182000 2 0366
+oe 550368,451360,0,182000 0 0367
+/o 550368,567840,116480,182000 3 0370
+`u 550368,640640,0,182000 2 0371
+'u 550368,640640,0,182000 2 0372
+^u 550368,669760,0,182000 2 0373
+:u 550368,669760,0,182000 2 0374
+'y 550368,640640,232960,182000 3 0375
+Tp 550368,640640,232960,182000 3 0376
+ss 550368,640640,232960,182000 3 0377
diff --git a/font/devdvi/CWITC b/font/devdvi/CWITC
new file mode 100644
index 0000000..4365408
--- /dev/null
+++ b/font/devdvi/CWITC
@@ -0,0 +1,138 @@
+name CWITC
+special
+internalname tcit1000
+spacewidth 550368
+slant 14.036243
+checksum 1703447420
+designsize 10485760
+charset
+--- 550368,628074,0,182000 2 0000
+--- 550368,628074,0,182000 2 0001
+--- 550368,669760,0,182000 2 0002
+--- 550368,669760,0,182000 2 0003
+--- 550368,669760,0,182000 2 0004
+--- 550368,628074,0,182000 2 0005
+--- 550368,669760,0,182000 2 0006
+--- 550368,669760,0,182000 2 0007
+--- 550368,669760,0,182000 2 0010
+--- 550368,669760,0,182000 2 0011
+--- 550368,628074,0,182000 2 0012
+--- 550368,0,203840,182000 1 0013
+--- 550368,0,232960,182000 1 0014
+--- 550368,104832,232960,182000 1 0015
+--- 550368,104832,232960,182000 1 0022
+--- 550368,451360,0,182000 0 0025
+--- 550368,451360,0,182000 0 0026
+--- 0,640640 2 0027
+<- 550368,435706,-204934,182000 0 0030
+-> 550368,435706,-204934,182000 0 0031
+--- 550368,640640,0,182000 2 0032
+--- 550368,829920,0,182000 2 0033
+--- 550368,640640,0,182000 2 0034
+--- 550368,640640,0,182000 2 0035
+--- 0,640640 2 0037
+u2422 550368,640640,0,182000 2 0040
+Do 550368,728000,87360,182000 3 0044
+$ "
+aq 550368,640640,0,182000 2 0047
+--- 550368,551096,-94640,182000 2 0052
+, 550368,130000,145600,182000 1 0054
+--- 550368,435706,-204934,182000 0 0055
+. 550368,130000,0,182000 0 0056
+f/ 550368,728000,87360,182000 3 0057
+0 550368,451360,0,182000 0 0060
+1 550368,451360,0,182000 0 0061
+2 550368,451360,0,182000 0 0062
+3 550368,451360,232960,182000 1 0063
+4 550368,451360,232960,182000 1 0064
+5 550368,451360,232960,182000 1 0065
+6 550368,640640,0,182000 2 0066
+7 550368,451360,232960,182000 1 0067
+8 550368,640640,0,182000 2 0070
+9 550368,451360,232960,182000 1 0071
+la 550368,728000,87360,182000 3 0074
+\- 550368,551096,-84448,182000 2 0075
+ra 550368,728000,87360,182000 3 0076
+u2127 550368,640640,0,182000 2 0115
+ci 550368,728000,232960,182000 3 0117
+u03A9 550368,640640,0,182000 2 0127
+u301A 550368,728000,87360,182000 3 0133
+u301B 550368,728000,87360,182000 3 0135
+ua 550368,640640,0,182000 2 0136
+da 550368,640640,0,182000 2 0137
+--- 550368,640640,0,182000 2 0140
+--- 550368,551096,-94640,182000 2 0142
+--- 550368,551096,-94640,182000 2 0143
+--- 550368,571115,18930,182000 3 0144
+--- 550368,640640,0,182000 2 0154
+--- 550368,551096,-94640,182000 2 0155
+u266A 672672,640640 2 0156
+ti 550368,130000,0,182000 0 0176
+~ "
+--- 550368,435706,-204934,182000 0 0177
+--- 550368,640640,0,182000 2 0200
+--- 550368,640640,0,182000 2 0201
+--- 550368,640640,0,182000 2 0202
+--- 550368,640640,0,182000 2 0203
+dg 550368,640640,232960,182000 3 0204
+dd 550368,640640,232960,182000 3 0205
+u2016 550368,728000,87360,182000 3 0206
+%0 550368,728000,87360,182000 3 0207
+bu 550368,534352,-106288,182000 2 0210
+u2103 550368,640640,0,182000 2 0211
+--- 550368,728000,87360,182000 3 0212
+--- 550368,571115,116480,182000 3 0213
+Fn 550368,640640,232960,182000 3 0214
+u20A1 550368,728000,87360,182000 3 0215
+u20A9 550368,640640,0,182000 2 0216
+u20A6 550368,640640,0,182000 2 0217
+--- 550368,728000,87360,182000 3 0220
+u20B1 550368,640640,0,182000 2 0221
+u20A4 550368,640640,0,182000 2 0222
+u211E 550368,640640,0,182000 2 0223
+u203D 550368,640640,0,182000 2 0224
+--- 550368,407680,232960,182000 1 0225
+u20AB 550368,728000,0,182000 2 0226
+tm 550368,728000,0,182000 2 0227
+u2031 550368,728000,87360,182000 3 0230
+--- 550368,640640,232960,182000 3 0231
+u0E3F 550368,728000,87360,182000 3 0232
+u2116 550368,640640,0,182000 2 0233
+u2052 550368,728000,0,182000 2 0234
+u212E 550368,640640,0,182000 2 0235
+u25E6 550368,534352,-106288,182000 2 0236
+u2120 550368,728000,0,182000 2 0237
+u2045 550368,728000,87360,182000 3 0240
+u2046 550368,728000,87360,182000 3 0241
+ct 550368,571115,116480,182000 3 0242
+Po 550368,640640,0,182000 2 0243
+Cs 550368,580323,0,182000 2 0244
+Ye 550368,640640,0,182000 2 0245
+bb 550368,728000,87360,182000 3 0246
+sc 550368,640640,232960,182000 3 0247
+--- 550368,640640,0,182000 2 0250
+co 550368,728000,232960,182000 3 0251
+Of 550368,728000,0,182000 2 0252
+--- 550368,728000,232960,182000 3 0253
+tno 550368,451360,0,182000 0 0254
+u2117 550368,728000,232960,182000 3 0255
+rg 550368,728000,232960,182000 3 0256
+--- 550368,640640,0,182000 2 0257
+de 550368,640640,0,182000 2 0260
+t+- 550368,551096,-84448,182000 2 0261
+S2 550368,728000,0,182000 2 0262
+S3 550368,728000,0,182000 2 0263
+--- 550368,640640,0,182000 2 0264
+mc 550368,451360,232960,182000 1 0265
+ps 550368,640640,232960,182000 3 0266
+pc 550368,451360,0,182000 0 0267
+u203B 550368,514453,0,182000 2 0270
+S1 550368,728000,0,182000 2 0271
+Om 550368,728000,0,182000 2 0272
+sr 550368,728000,14560,182000 3 0273
+--- 550368,728000,232960,182000 3 0274
+--- 550368,728000,232960,182000 3 0275
+--- 550368,728000,232960,182000 3 0276
+Eu 550368,640640,0,182000 2 0277
+tmu 550368,551096,-84448,182000 2 0326
+tdi 550368,551096,-84448,182000 2 0366
diff --git a/font/devdvi/CWTC b/font/devdvi/CWTC
new file mode 100644
index 0000000..0e73e8a
--- /dev/null
+++ b/font/devdvi/CWTC
@@ -0,0 +1,137 @@
+name CWTC
+special
+internalname tctt1000
+spacewidth 550368
+checksum 1703447420
+designsize 10485760
+charset
+--- 550368,627768 2 0000
+--- 550368,627768 2 0001
+--- 550368,669760 2 0002
+--- 550368,669760 2 0003
+--- 550368,669760 2 0004
+--- 550368,627768 2 0005
+--- 550368,669760 2 0006
+--- 550368,669760 2 0007
+--- 550368,669760 2 0010
+--- 550368,669760 2 0011
+--- 550368,627768 2 0012
+--- 550368,0,203840 1 0013
+--- 550368,0,232960 1 0014
+--- 550368,104832,232960 1 0015
+--- 550368,104832,232960 1 0022
+--- 550368,451360 0 0025
+--- 550368,451360 0 0026
+--- 0,640640 2 0027
+<- 550368,435706,-204934 0 0030
+-> 550368,435706,-204934 0 0031
+--- 550368,640640 2 0032
+--- 550368,829920 2 0033
+--- 550368,640640 2 0034
+--- 550368,640640 2 0035
+--- 0,640640 2 0037
+u2422 550368,640640 2 0040
+Do 550368,728000,87360 3 0044
+$ "
+aq 550368,640640 2 0047
+--- 550368,551096,-94640 2 0052
+, 550368,130000,145600 1 0054
+--- 550368,435706,-204934 0 0055
+. 550368,130000 0 0056
+f/ 550368,728000,87360 3 0057
+0 550368,451360 0 0060
+1 550368,451360 0 0061
+2 550368,451360 0 0062
+3 550368,451360,232960 1 0063
+4 550368,451360,232960 1 0064
+5 550368,451360,232960 1 0065
+6 550368,640640 2 0066
+7 550368,451360,232960 1 0067
+8 550368,640640 2 0070
+9 550368,451360,232960 1 0071
+la 550368,728000,87360 3 0074
+\- 550368,551096,-84448 2 0075
+ra 550368,728000,87360 3 0076
+u2127 550368,640640 2 0115
+ci 550368,728000,232960 3 0117
+u03A9 550368,640640 2 0127
+u301A 550368,728000,87360 3 0133
+u301B 550368,728000,87360 3 0135
+ua 550368,640640 2 0136
+da 550368,640640 2 0137
+--- 550368,640640 2 0140
+--- 550368,551096,-94640 2 0142
+--- 550368,551096,-94640 2 0143
+--- 550368,571115,18930 3 0144
+--- 550368,640640 2 0154
+--- 550368,551096,-94640 2 0155
+u266A 672672,640640 2 0156
+ti 550368,130000 0 0176
+~ "
+--- 550368,435706,-204934 0 0177
+--- 550368,640640 2 0200
+--- 550368,640640 2 0201
+--- 550368,640640 2 0202
+--- 550368,640640 2 0203
+dg 550368,640640,232960 3 0204
+dd 550368,640640,232960 3 0205
+u2016 550368,728000,87360 3 0206
+%0 550368,728000,87360 3 0207
+bu 550368,534352,-106288 2 0210
+u2103 550368,640640 2 0211
+--- 550368,728000,87360 3 0212
+--- 550368,571115,116480 3 0213
+Fn 550368,640640 2 0214
+u20A1 550368,728000,87360 3 0215
+u20A9 550368,640640 2 0216
+u20A6 550368,640640 2 0217
+--- 550368,728000,87360 3 0220
+u20B1 550368,640640 2 0221
+u20A4 550368,640640 2 0222
+u211E 550368,640640 2 0223
+u203D 550368,640640 2 0224
+--- 550368,407680,232960 1 0225
+u20AB 550368,728000 2 0226
+tm 550368,728000 2 0227
+u2031 550368,728000,87360 3 0230
+--- 550368,640640,232960 3 0231
+u0E3F 550368,728000,87360 3 0232
+u2116 550368,640640 2 0233
+u2052 550368,728000 2 0234
+u212E 550368,640640 2 0235
+u25E6 550368,534352,-106288 2 0236
+u2120 550368,728000 2 0237
+u2045 550368,728000,87360 3 0240
+u2046 550368,728000,87360 3 0241
+ct 550368,571115,116480 3 0242
+Po 550368,640640 2 0243
+Cs 550368,580323 2 0244
+Ye 550368,640640 2 0245
+bb 550368,728000,87360 3 0246
+sc 550368,640640,232960 3 0247
+--- 550368,640640 2 0250
+co 550368,728000,232960 3 0251
+Of 550368,728000 2 0252
+--- 550368,728000,232960 3 0253
+tno 550368,451360 0 0254
+u2117 550368,728000,232960 3 0255
+rg 550368,728000,232960 3 0256
+--- 550368,640640 2 0257
+de 550368,640640 2 0260
+t+- 550368,551096,-84448 2 0261
+S2 550368,728000 2 0262
+S3 550368,728000 2 0263
+--- 550368,640640 2 0264
+mc 550368,451360,232960 1 0265
+ps 550368,640640,232960 3 0266
+pc 550368,451360 0 0267
+u203B 550368,514453 2 0270
+S1 550368,728000 2 0271
+Om 550368,728000 2 0272
+sr 550368,728000,14560 3 0273
+--- 550368,728000,232960 3 0274
+--- 550368,728000,232960 3 0275
+--- 550368,728000,232960 3 0276
+Eu 550368,640640 2 0277
+tmu 550368,551096,-84448 2 0326
+tdi 550368,551096,-84448 2 0366
diff --git a/font/devdvi/DESC.in b/font/devdvi/DESC.in
new file mode 100644
index 0000000..b5df761
--- /dev/null
+++ b/font/devdvi/DESC.in
@@ -0,0 +1,11 @@
+sizescale 100
+unitwidth 131072
+res 57816
+hor 1
+vert 1
+sizes 500-1000000 0
+styles R I B BI
+family T
+fonts 13 0 0 0 0 0 0 0 0 0 MI S EX CW
+tcommand
+postpro grodvi
diff --git a/font/devdvi/EX b/font/devdvi/EX
new file mode 100644
index 0000000..e231035
--- /dev/null
+++ b/font/devdvi/EX
@@ -0,0 +1,144 @@
+name EX
+spacewidth 350836
+special
+internalname cmex10
+checksum -89033454
+designsize 10485760
+charset
+parenleft0 480600,41942,1216362 1 0000
+parenright0 480600,41942,1216362 1 0001
+bracketleft0 436909,41942,1216362 1 0002
+bracketright0 436909,41942,1216362 1 0003
+floorleft0 495163,41942,1216362 1 0004
+floorright0 495163,41942,1216362 1 0005
+ceilingleft0 495163,41942,1216362 1 0006
+ceilingright0 495163,41942,1216362 1 0007
+braceleft0 611672,41942,1216362 1 0010
+braceright0 611672,41942,1216362 1 0011
+angleleft0 495163,41942,1216362 1 0012
+angleright0 495163,41942,1216362 1 0013
+barex 349526,0,629152 1 0014
+bardblex 582544,0,629152 1 0015
+slash0 605845,41942,1216362 1 0016
+backslash0 605845,41942,1216362 1 0017
+parenleft1 626235,41942,1845514 1 0020
+parenright1 626235,41942,1845514 1 0021
+parenleft2 771872,41942,2474666 1 0022
+parenright2 771872,41942,2474666 1 0023
+bracketleft2 553418,41942,2474666 1 0024
+bracketright2 553418,41942,2474666 1 0025
+floorleft2 611672,41942,2474666 1 0026
+floorright2 611672,41942,2474666 1 0027
+ceilingleft2 611672,41942,2474666 1 0030
+ceilingright2 611672,41942,2474666 1 0031
+braceleft2 786434,41942,2474666 1 0032
+braceright2 786434,41942,2474666 1 0033
+angleleft2 786434,41942,2474666 1 0034
+angleright2 786434,41942,2474666 1 0035
+slash2 1095182,41942,2474666 1 0036
+backslash2 1095182,41942,2474666 1 0037
+parenleft3 830126,41942,3103818 1 0040
+parenright3 830126,41942,3103818 1 0041
+bracketleft3 611672,41942,3103818 1 0042
+bracketright3 611672,41942,3103818 1 0043
+floorleft3 669926,41942,3103818 1 0044
+floorright3 669926,41942,3103818 1 0045
+ceilingleft3 669926,41942,3103818 1 0046
+ceilingright3 669926,41942,3103818 1 0047
+braceleft3 844691,41942,3103818 1 0050
+braceright3 844691,41942,3103818 1 0051
+angleleft3 844691,41942,3103818 1 0052
+angleright3 844691,41942,3103818 1 0053
+slash3 1339851,41942,3103818 1 0054
+backslash3 1339851,41942,3103818 1 0055
+slash1 850515,41942,1845514 1 0056
+backslash1 850515,41942,1845514 1 0057
+parenlefttp 917507,41942,1845514 1 0060
+parenrighttp 917507,41942,1845514 1 0061
+bracketlefttp 699053,41942,1845514 1 0062
+bracketrighttp 699053,41942,1845514 1 0063
+bracketleftbt 699053,41942,1845514 1 0064
+bracketrightbt 699053,41942,1845514 1 0065
+bracketleftex 699053,0,629152 1 0066
+bracketrightex 699053,0,629152 1 0067
+lt 932070,0,943728 1 0070
+bracelefttp "
+rt 932070,0,943728 1 0071
+bracerighttp "
+lb 932070,0,943728 1 0072
+braceleftbt "
+rb 932070,0,943728 1 0073
+bracerightbt "
+lk 932070,0,1887456 1 0074
+braceleftmid "
+rk 932070,0,1887456 1 0075
+bracerightmid "
+braceleftex 932070,0,314576 1 0076
+bracerightex "
+braceex "
+arrowvertex 699053,0,629152 1 0077
+parenleftbt 917507,41942,1845514 1 0100
+parenrightbt 917507,41942,1845514 1 0101
+parenleftex 917507,0,629152 1 0102
+parenrightex 917507,0,629152 1 0103
+angleleft1 640798,41942,1845514 1 0104
+angleright1 640798,41942,1845514 1 0105
+--- 873816,0,1048590 1 0106
+--- 1165088,104859,1572877 1 0107
+--- 495162,0,1165096,203891 1 0110
+ointegral 582544,0,2330194,466035 1 0111
+ois "
+--- 1165088,0,1048590 1 0112
+bigcircledot 1584520,104859,1572877 1 0113
+--- 1165088,0,1048590 1 0114
+bigcircleplus 1584520,104859,1572877 1 0115
+--- 1165088,0,1048590 1 0116
+bigcirclemultiply 1584520,104859,1572877 1 0117
+--- 1106834,0,1048590 1 0120
+--- 990325,0,1048590 1 0121
+--- 495162,0,1165096,203891 1 0122
+--- 873816,0,1048590 1 0123
+--- 873816,0,1048590 1 0124
+--- 873816,0,1048590 1 0125
+--- 873816,0,1048590 1 0126
+--- 873816,0,1048590 1 0127
+sum 1514614,104859,1572877 1 0130
+product 1339851,104859,1572877 1 0131
+integral 582544,0,2330194,466035 1 0132
+bigunion 1165088,104859,1572877 1 0133
+bigintersection 1165088,104859,1572877 1 0134
+bigunionplus 1165088,104859,1572877 1 0135
+biglogicaland 1165088,104859,1572877 1 0136
+biglogicalor 1165088,104859,1572877 1 0137
+--- 990325,0,1048590 1 0140
+coproduct 1339851,104859,1572877 1 0141
+--- 582544,757306 2 0142
+--- 1048579,786432 2 0143
+--- 1514614,786432 2 0144
+--- 582544,757306 2 0145
+--- 1048579,786432 2 0146
+--- 1514614,786432 2 0147
+bracketleft1 495163,41942,1845514 1 0150
+bracketright1 495163,41942,1845514 1 0151
+floorleft1 553418,41942,1845514 1 0152
+floorright1 553418,41942,1845514 1 0153
+ceilingleft1 553418,41942,1845514 1 0154
+ceilingright1 553418,41942,1845514 1 0155
+braceleft1 699053,41942,1845514 1 0156
+braceright1 699053,41942,1845514 1 0157
+sqrt0 1048579,41942,1216362 1 0160
+sqrt1 1048579,41942,1845514 1 0161
+sqrt2 1048579,41942,2474666 1 0162
+sqrt3 1048579,41942,3103818 1 0163
+--- 1106834,0,1887456 1 0164
+--- 1106834,0,629152 1 0165
+--- 1106834,41942,587210 1 0166
+arrowvertdblex 815562,0,629152 1 0167
+arrowverttp 699053,0,629152 1 0170
+arrowvertbt 699053,0,629152 1 0171
+--- 471864,125827 0 0172
+--- 471864,125827 0 0173
+--- 471864,125827 0 0174
+--- 471864,125827 0 0175
+arrowvertdbltp 815562,0,629152 1 0176
+arrowvertdblbt 815562,0,629152 1 0177
diff --git a/font/devdvi/HB b/font/devdvi/HB
new file mode 100644
index 0000000..7d9847b
--- /dev/null
+++ b/font/devdvi/HB
@@ -0,0 +1,297 @@
+name HB
+internalname cmssbx10
+spacewidth 384480
+ligatures ff fi fl ffi ffl 0
+checksum -244629176
+designsize 10485760
+kernpairs
+ff cq 80101
+ff ' 80101
+ff ? 80101
+ff ! 80101
+ff ) 80101
+ff rB 80101
+ff ] 80101
+slash@for@l l -267971
+slash@for@l L -307293
+cq ? 128160
+' ? 128160
+cq ! 128160
+' ! 128160
+A t -32040
+A C -32040
+A O -32040
+A G -32040
+A U -32040
+A Q -32040
+A T -96120
+A Y -96120
+A V -128160
+A W -128160
+D X -32040
+D W -32040
+D A -32040
+D V -32040
+D Y -32040
+F o -32040
+F e -32040
+F u -32040
+F r -32040
+F a -32040
+F A -96120
+F O -32040
+F C -32040
+F G -32040
+F Q -32040
+I I 32040
+K O -32040
+K C -32040
+K G -32040
+K Q -32040
+L T -96120
+L Y -96120
+L V -128160
+L W -128160
+O X -32040
+O W -32040
+O A -32040
+O V -32040
+O Y -32040
+P A -96120
+P o -32040
+P e -32040
+P a -32040
+P . -96120
+P , -96120
+T y -96120
+T e -96120
+T o -96120
+T r -96120
+T a -96120
+T A -96120
+T u -96120
+V o -32040
+V e -32040
+V u -32040
+V r -32040
+V a -32040
+V A -96120
+V O -32040
+V C -32040
+V G -32040
+V Q -32040
+W o -32040
+W e -32040
+W u -32040
+W r -32040
+W a -32040
+W A -96120
+W O -32040
+W C -32040
+W G -32040
+W Q -32040
+X O -32040
+X C -32040
+X G -32040
+X Q -32040
+Y e -96120
+Y o -96120
+Y r -96120
+Y a -96120
+Y A -96120
+Y u -96120
+a r -32040
+a y -32040
+a w -32040
+b e 32040
+b o 32040
+b x -32040
+b d 32040
+b c 32040
+b q 32040
+b r -32040
+b y -32040
+b w -32040
+f cq 80101
+f ' 80101
+f ? 80101
+f ! 80101
+f ) 80101
+f rB 80101
+f ] 80101
+g j 32040
+k e -32040
+k a -32040
+k o -32040
+k c -32040
+o e 32040
+o o 32040
+o x -32040
+o d 32040
+o c 32040
+o q 32040
+o r -32040
+o y -32040
+o w -32040
+p e 32040
+p o 32040
+p x -32040
+p d 32040
+p c 32040
+p q 32040
+p r -32040
+p y -32040
+p w -32040
+t y -32040
+t w -32040
+u w -32040
+w e -32040
+w a -32040
+w o -32040
+w c -32040
+y o -32040
+y e -32040
+y a -32040
+y . -96120
+y , -96120
+charset
+*G 608760,728178,0,0,0,-160200 2 0000
+*D 961200,728178 2 0001
+*H 897120,728178,0,0,-32040,-32040 2 0002
+*L 704880,728178 2 0003
+*C 768960,728178 2 0004
+*P 833040,728178 2 0005
+*S 833040,728178 2 0006
+*U 897120,728178,0,0,-32040,-160200 2 0007
+*F 833040,728178,0,0,-32040 2 0010
+*Q 897120,728178,0,0,-32040,-80101 2 0011
+*W 833040,728178 2 0012
+ff 672840,728178,0,80101 2 0013
+fi 614586,728178 2 0014
+fl 614586,728178 2 0015
+Fi 934986,728178 2 0016
+Fl 934986,728178 2 0017
+.i 267971,480597 0 0020
+.j 300011,480597,203890 1 0021
+ga 576720,728178 2 0022
+aa 576720,728178 2 0023
+ah 576720,666283 2 0024
+ab 576720,728178 2 0025
+a- 576720,668757 2 0026
+ao 768960,728178 2 0027
+ac 512640,0,178403 1 0030
+ss 592739,728178 2 0031
+ae 833040,480597 0 0032
+oe 897120,480597 0 0033
+/o 576720,582542,101946 3 0034
+AE 993240,728178 2 0035
+OE 1121400,728178 2 0036
+/O 897120,779150,50973 3 0037
+slash@for@l 267971,480597 0 0040
+! 384480,728178 2 0041
+rq 585458,728178 2 0042
+sh 961200,728178,203888 3 0043
+# "
+Do 576720,786432,58254 3 0044
+$ "
+% 1079109,786432,58254 3 0045
+& 870906,728178 2 0046
+cq 320400,728178 2 0047
+' "
+( 448560,786432,262144 3 0050
+) 448560,786432,262144 3 0051
+* 576720,786432 2 0052
++ 897120,646624,122336 3 0053
+, 320400,136898,110683 1 0054
+hy 384480,480597 0 0055
+- "
+. 320400,136898 0 0056
+sl 576720,786432,262144 3 0057
+/ "
+0 576720,728178 2 0060
+1 576720,728178 2 0061
+2 576720,728178 2 0062
+3 576720,728178 2 0063
+4 576720,728178 2 0064
+5 576720,728178 2 0065
+6 576720,728178 2 0066
+7 576720,728178 2 0067
+8 576720,728178 2 0070
+9 576720,728178 2 0071
+: 320400,480597 0 0072
+; 320400,480597,110683 1 0073
+r! 384480,524288,203890 3 0074
+= 897120,425984,-98304 0 0075
+r? 544680,524288,203890 3 0076
+? 544680,728178 2 0077
+at 768960,728178 2 0100
+@ "
+A 768960,728178 2 0101
+B 768960,728178 2 0102
+C 736920,728178,0,0,-32040 2 0103
+D 833040,728178,0,0,0,-32040 2 0104
+E 672840,728178 2 0105
+F 640800,728178,0,0,0,-160200 2 0106
+G 768960,728178,0,0,-32040 2 0107
+H 833040,728178 2 0110
+I 346614,728178 2 0111
+J 544680,728178,0,0,0,-32040 2 0112
+K 801000,728178 2 0113
+L 608760,728178,0,0,0,64080 2 0114
+M 1025280,728178 2 0115
+N 833040,728178 2 0116
+O 833040,728178,0,0,-32040,-32040 2 0117
+P 736920,728178,0,0,0,-160200 2 0120
+Q 833040,728178,110683,0,-32040 3 0121
+R 736920,728178 2 0122
+S 640800,728178 2 0123
+T 768960,728178,0,0,0,-160200 2 0124
+U 801000,728178,0,0,32040 2 0125
+V 768960,728178,0,16021,48061,-240299 2 0126
+W 1089360,728178,0,16021,48061,-144179 2 0127
+X 768960,728178 2 0130
+Y 768960,728178,0,28835,32040,-227485 2 0131
+Z 704880,728178 2 0132
+lB 359722,786432,262144 3 0133
+[ "
+lq 585458,728178 2 0134
+rB 359722,786432,262144 3 0135
+] "
+ha 576720,728178 2 0136
+^ "
+a^ "
+a. 320400,728178 2 0137
+oq 320400,728178 2 0140
+` "
+a 550506,480597 0 0141
+b 588371,728178 2 0142
+c 512640,480597 0 0143
+d 588371,728178 2 0144
+e 535942,480597 0 0145
+f 352440,728178,0,80101 2 0146
+g 576720,480597,203890,16021 1 0147
+h 588371,728178 2 0150
+i 267971,728178 2 0151
+j 300011,728178,203890 3 0152
+k 556331,728178 2 0153
+l 267971,728178 2 0154
+m 908771,480597 0 0155
+n 588371,480597 0 0156
+o 576720,480597 0 0157
+p 588371,480597,203890 1 0160
+q 588371,480597,203890 1 0161
+r 390306,480597,0,16021 0 0162
+s 442152,480597 0 0163
+t 423802,617914 2 0164
+u 588371,480597 0 0165
+v 524291,480597,0,16021 0 0166
+w 780611,480597,0,16021 0 0167
+x 524291,480597 0 0170
+y 524291,480597,203890,16021 1 0171
+z 499533,480597 0 0172
+en 576720,480597,0,32040 0 0173
+em 1153440,480597,0,32040 0 0174
+a" 576720,728178 2 0175
+~ 576720,728178 2 0176
+a~ "
+ad 576720,728178 2 0177
diff --git a/font/devdvi/HBEC b/font/devdvi/HBEC
new file mode 100644
index 0000000..8347193
--- /dev/null
+++ b/font/devdvi/HBEC
@@ -0,0 +1,2078 @@
+name HBEC
+internalname ecsx1000
+spacewidth 384384
+ligatures ff fi fl ffi ffl 0
+checksum -1149688141
+designsize 10485760
+kernpairs
+bq Bq 128128
+bq j 128128
+bq .j 128128
+bq g 64064
+bq u0067_0306 64064
+bq y 64064
+bq :y 64064
+bq 'y 64064
+bq v -96096
+bq w -64064
+bq V -128128
+bq W -96096
+bq Y -96096
+bq :Y -96096
+bq 'Y -96096
+bq O -32032
+bq u004F_030B -32032
+bq `O -32032
+bq 'O -32032
+bq ^O -32032
+bq ~O -32032
+bq :O -32032
+bq OE -32032
+bq /O -32032
+bq C -32032
+bq G -32032
+bq 'C -32032
+bq u0043_030C -32032
+bq u0047_0306 -32032
+bq ,C -32032
+bq Q -32032
+lq oq 128128
+lq ` 128128
+lq lq 128128
+rq cq 128128
+rq ' 128128
+rq rq 128128
+Bq bq 128128
+Bq , 128128
+Bq Bq 128128
+Bq j 128128
+Bq .j 128128
+Bq g 64064
+Bq u0067_0306 64064
+Bq y 64064
+Bq :y 64064
+Bq 'y 64064
+Bq v -96096
+Bq w -64064
+Bq V -128128
+Bq W -96096
+Bq Y -96096
+Bq :Y -96096
+Bq 'Y -96096
+Bq O -32032
+Bq u004F_030B -32032
+Bq `O -32032
+Bq 'O -32032
+Bq ^O -32032
+Bq ~O -32032
+Bq :O -32032
+Bq OE -32032
+Bq /O -32032
+Bq C -32032
+Bq G -32032
+Bq 'C -32032
+Bq u0043_030C -32032
+Bq u0047_0306 -32032
+Bq ,C -32032
+Bq Q -32032
+Fc . -96096
+Fc , -96096
+ff cq 80080
+ff ' 80080
+ff oq 80080
+ff ` 80080
+ff lq 80080
+ff rq 80080
+ff ? 80080
+ff u01C3 80080
+ff ! 80080
+ff ) 80080
+ff rB 80080
+ff ] 80080
+cq rq 128128
+' rq 128128
+cq ? 128128
+' ? 128128
+cq u01C3 128128
+cq ! 128128
+' u01C3 128128
+' ! 128128
+A y -32032
+A :y -32032
+A 'y -32032
+A v -32032
+A w -32032
+A c -32032
+A 'c -32032
+A u0063_030C -32032
+A ,c -32032
+A d -32032
+A u0064_030C -32032
+A u0111 -32032
+A Sd -32032
+A e -32032
+A u0065_030C -32032
+A u0065_0328 -32032
+A `e -32032
+A 'e -32032
+A ^e -32032
+A :e -32032
+A o -32032
+A u006F_030B -32032
+A `o -32032
+A 'o -32032
+A ^o -32032
+A ~o -32032
+A :o -32032
+A oe -32032
+A /o -32032
+A q -32032
+A t -32032
+A u0074_030C -32032
+A u0074_0327 -32032
+A C -32032
+A G -32032
+A 'C -32032
+A u0043_030C -32032
+A u0047_0306 -32032
+A ,C -32032
+A Q -32032
+A O -32032
+A u004F_030B -32032
+A `O -32032
+A 'O -32032
+A ^O -32032
+A ~O -32032
+A :O -32032
+A OE -32032
+A /O -32032
+A U -32032
+A u0055_030B -32032
+A u0055_030A -32032
+A `U -32032
+A 'U -32032
+A ^U -32032
+A :U -32032
+A T -96096
+A u0054_030C -96096
+A u0054_0327 -96096
+A Y -96096
+A :Y -96096
+A 'Y -96096
+A V -128128
+A W -128128
+D X -32032
+D W -32032
+D A -32032
+D u0041_0306 -32032
+D u0041_0328 -32032
+D `A -32032
+D 'A -32032
+D ^A -32032
+D ~A -32032
+D :A -32032
+D oA -32032
+D AE -32032
+D V -32032
+D Y -32032
+D :Y -32032
+D 'Y -32032
+F o -32032
+F a -32032
+F e -32032
+F y -32032
+F u -32032
+F r -32032
+F v -32032
+F s -32032
+F c -32032
+F d -32032
+F g -32032
+F m -32032
+F n -32032
+F p -32032
+F w -32032
+F z -32032
+F ae -32032
+F /o -32032
+F A -96096
+F u0041_0306 -96096
+F u0041_0328 -96096
+F `A -96096
+F 'A -96096
+F ^A -96096
+F ~A -96096
+F :A -96096
+F oA -96096
+F AE -96096
+F O -32032
+F u004F_030B -32032
+F `O -32032
+F 'O -32032
+F ^O -32032
+F ~O -32032
+F :O -32032
+F OE -32032
+F /O -32032
+F C -32032
+F G -32032
+F 'C -32032
+F u0043_030C -32032
+F u0047_0306 -32032
+F ,C -32032
+F Q -32032
+I I 32032
+K v -32032
+K o -32032
+K u006F_030B -32032
+K `o -32032
+K 'o -32032
+K ^o -32032
+K ~o -32032
+K :o -32032
+K oe -32032
+K /o -32032
+K C -32032
+K G -32032
+K 'C -32032
+K u0043_030C -32032
+K u0047_0306 -32032
+K ,C -32032
+K Q -32032
+L T -96096
+L u0054_030C -96096
+L u0054_0327 -96096
+L Y -96096
+L :Y -96096
+L 'Y -96096
+L V -128128
+L W -128128
+O X -32032
+O W -32032
+O A -32032
+O u0041_0306 -32032
+O u0041_0328 -32032
+O `A -32032
+O 'A -32032
+O ^A -32032
+O ~A -32032
+O :A -32032
+O oA -32032
+O AE -32032
+O V -32032
+O Y -32032
+O :Y -32032
+O 'Y -32032
+P A -96096
+P u0041_0306 -96096
+P u0041_0328 -96096
+P `A -96096
+P 'A -96096
+P ^A -96096
+P ~A -96096
+P :A -96096
+P oA -96096
+P AE -96096
+P o -32032
+P u006F_030B -32032
+P `o -32032
+P 'o -32032
+P ^o -32032
+P ~o -32032
+P :o -32032
+P oe -32032
+P /o -32032
+P e -32032
+P u0065_030C -32032
+P u0065_0328 -32032
+P `e -32032
+P 'e -32032
+P ^e -32032
+P :e -32032
+P a -32032
+P u0061_0306 -32032
+P u0061_0328 -32032
+P `a -32032
+P 'a -32032
+P ^a -32032
+P ^a -32032
+P ~a -32032
+P :a -32032
+P oa -32032
+P ae -32032
+P . -96096
+P , -96096
+T y -96096
+T e -96096
+T o -96096
+T r -96096
+T a -96096
+T u -96096
+T n -96096
+T .i -96096
+T c -96096
+T d -96096
+T g -96096
+T p -96096
+T s -96096
+T v -96096
+T w -96096
+T x -96096
+T z -96096
+T A -96096
+T u0041_0306 -96096
+T u0041_0328 -96096
+T `A -96096
+T 'A -96096
+T ^A -96096
+T ~A -96096
+T :A -96096
+T oA -96096
+T AE -96096
+V o -32032
+V a -32032
+V e -32032
+V y -32032
+V u -32032
+V r -32032
+V v -32032
+V s -32032
+V c -32032
+V d -32032
+V g -32032
+V m -32032
+V n -32032
+V p -32032
+V w -32032
+V z -32032
+V ae -32032
+V /o -32032
+V A -96096
+V u0041_0306 -96096
+V u0041_0328 -96096
+V `A -96096
+V 'A -96096
+V ^A -96096
+V ~A -96096
+V :A -96096
+V oA -96096
+V AE -96096
+V O -32032
+V u004F_030B -32032
+V `O -32032
+V 'O -32032
+V ^O -32032
+V ~O -32032
+V :O -32032
+V OE -32032
+V /O -32032
+V C -32032
+V G -32032
+V 'C -32032
+V u0043_030C -32032
+V u0047_0306 -32032
+V ,C -32032
+V Q -32032
+W o -32032
+W a -32032
+W e -32032
+W y -32032
+W u -32032
+W r -32032
+W v -32032
+W s -32032
+W c -32032
+W d -32032
+W g -32032
+W m -32032
+W n -32032
+W p -32032
+W w -32032
+W z -32032
+W ae -32032
+W /o -32032
+W A -96096
+W u0041_0306 -96096
+W u0041_0328 -96096
+W `A -96096
+W 'A -96096
+W ^A -96096
+W ~A -96096
+W :A -96096
+W oA -96096
+W AE -96096
+W O -32032
+W u004F_030B -32032
+W `O -32032
+W 'O -32032
+W ^O -32032
+W ~O -32032
+W :O -32032
+W OE -32032
+W /O -32032
+W C -32032
+W G -32032
+W 'C -32032
+W u0043_030C -32032
+W u0047_0306 -32032
+W ,C -32032
+W Q -32032
+X O -32032
+X u004F_030B -32032
+X `O -32032
+X 'O -32032
+X ^O -32032
+X ~O -32032
+X :O -32032
+X OE -32032
+X /O -32032
+X C -32032
+X G -32032
+X 'C -32032
+X u0043_030C -32032
+X u0047_0306 -32032
+X ,C -32032
+X Q -32032
+Y e -96096
+Y o -96096
+Y r -96096
+Y a -96096
+Y u -96096
+Y n -96096
+Y .i -96096
+Y c -96096
+Y d -96096
+Y g -96096
+Y p -96096
+Y s -96096
+Y v -96096
+Y w -96096
+Y x -96096
+Y z -96096
+Y A -96096
+Y u0041_0306 -96096
+Y u0041_0328 -96096
+Y `A -96096
+Y 'A -96096
+Y ^A -96096
+Y ~A -96096
+Y :A -96096
+Y oA -96096
+Y AE -96096
+oq lq 128128
+` lq 128128
+oq ? 128128
+` ? 128128
+oq u01C3 128128
+oq ! 128128
+` u01C3 128128
+` ! 128128
+a r -32032
+a y -32032
+a :y -32032
+a 'y -32032
+a w -32032
+b e 32032
+b u0065_030C 32032
+b u0065_0328 32032
+b `e 32032
+b 'e 32032
+b ^e 32032
+b :e 32032
+b o 32032
+b u006F_030B 32032
+b `o 32032
+b 'o 32032
+b ^o 32032
+b ~o 32032
+b :o 32032
+b oe 32032
+b /o 32032
+b x -32032
+b d 32032
+b c 32032
+b 'c 32032
+b u0063_030C 32032
+b ,c 32032
+b q 32032
+b r -32032
+b y -32032
+b :y -32032
+b 'y -32032
+b w -32032
+e V -96096
+f cq 80080
+f ' 80080
+f oq 80080
+f ` 80080
+f lq 80080
+f rq 80080
+f ? 80080
+f u01C3 80080
+f ! 80080
+f ) 80080
+f rB 80080
+f ] 80080
+g j 32032
+k W -96096
+k V -96096
+k e -32032
+k u0065_030C -32032
+k u0065_0328 -32032
+k `e -32032
+k 'e -32032
+k ^e -32032
+k :e -32032
+k a -32032
+k u0061_0306 -32032
+k u0061_0328 -32032
+k `a -32032
+k 'a -32032
+k ^a -32032
+k ^a -32032
+k ~a -32032
+k :a -32032
+k oa -32032
+k ae -32032
+k o -32032
+k u006F_030B -32032
+k `o -32032
+k 'o -32032
+k ^o -32032
+k ~o -32032
+k :o -32032
+k oe -32032
+k /o -32032
+k c -32032
+k 'c -32032
+k u0063_030C -32032
+k ,c -32032
+o e 32032
+o u0065_030C 32032
+o u0065_0328 32032
+o `e 32032
+o 'e 32032
+o ^e 32032
+o :e 32032
+o o 32032
+o u006F_030B 32032
+o `o 32032
+o 'o 32032
+o ^o 32032
+o ~o 32032
+o :o 32032
+o oe 32032
+o /o 32032
+o x -32032
+o d 32032
+o c 32032
+o 'c 32032
+o u0063_030C 32032
+o ,c 32032
+o q 32032
+o r -32032
+o y -32032
+o :y -32032
+o 'y -32032
+o w -32032
+p e 32032
+p u0065_030C 32032
+p u0065_0328 32032
+p `e 32032
+p 'e 32032
+p ^e 32032
+p :e 32032
+p o 32032
+p u006F_030B 32032
+p `o 32032
+p 'o 32032
+p ^o 32032
+p ~o 32032
+p :o 32032
+p oe 32032
+p /o 32032
+p x -32032
+p d 32032
+p c 32032
+p 'c 32032
+p u0063_030C 32032
+p ,c 32032
+p q 32032
+p r -32032
+p y -32032
+p :y -32032
+p 'y -32032
+p w -32032
+t y -32032
+t :y -32032
+t 'y -32032
+t w -32032
+u w -32032
+w e -32032
+w u0065_030C -32032
+w u0065_0328 -32032
+w `e -32032
+w 'e -32032
+w ^e -32032
+w :e -32032
+w a -32032
+w u0061_0306 -32032
+w u0061_0328 -32032
+w `a -32032
+w 'a -32032
+w ^a -32032
+w ^a -32032
+w ~a -32032
+w :a -32032
+w oa -32032
+w ae -32032
+w o -32032
+w u006F_030B -32032
+w `o -32032
+w 'o -32032
+w ^o -32032
+w ~o -32032
+w :o -32032
+w oe -32032
+w /o -32032
+w c -32032
+w 'c -32032
+w u0063_030C -32032
+w ,c -32032
+y o -32032
+y u006F_030B -32032
+y `o -32032
+y 'o -32032
+y ^o -32032
+y ~o -32032
+y :o -32032
+y oe -32032
+y /o -32032
+y e -32032
+y u0065_030C -32032
+y u0065_0328 -32032
+y `e -32032
+y 'e -32032
+y ^e -32032
+y :e -32032
+y a -32032
+y u0061_0306 -32032
+y u0061_0328 -32032
+y `a -32032
+y 'a -32032
+y ^a -32032
+y ^a -32032
+y ~a -32032
+y :a -32032
+y oa -32032
+y ae -32032
+y . -96096
+y , -96096
+u0041_0306 y -32032
+u0041_0306 :y -32032
+u0041_0306 'y -32032
+u0041_0306 v -32032
+u0041_0306 w -32032
+u0041_0306 c -32032
+u0041_0306 'c -32032
+u0041_0306 u0063_030C -32032
+u0041_0306 ,c -32032
+u0041_0306 d -32032
+u0041_0306 u0064_030C -32032
+u0041_0306 u0111 -32032
+u0041_0306 Sd -32032
+u0041_0306 e -32032
+u0041_0306 u0065_030C -32032
+u0041_0306 u0065_0328 -32032
+u0041_0306 `e -32032
+u0041_0306 'e -32032
+u0041_0306 ^e -32032
+u0041_0306 :e -32032
+u0041_0306 o -32032
+u0041_0306 u006F_030B -32032
+u0041_0306 `o -32032
+u0041_0306 'o -32032
+u0041_0306 ^o -32032
+u0041_0306 ~o -32032
+u0041_0306 :o -32032
+u0041_0306 oe -32032
+u0041_0306 /o -32032
+u0041_0306 q -32032
+u0041_0306 t -32032
+u0041_0306 u0074_030C -32032
+u0041_0306 u0074_0327 -32032
+u0041_0306 C -32032
+u0041_0306 G -32032
+u0041_0306 'C -32032
+u0041_0306 u0043_030C -32032
+u0041_0306 u0047_0306 -32032
+u0041_0306 ,C -32032
+u0041_0306 Q -32032
+u0041_0306 O -32032
+u0041_0306 u004F_030B -32032
+u0041_0306 `O -32032
+u0041_0306 'O -32032
+u0041_0306 ^O -32032
+u0041_0306 ~O -32032
+u0041_0306 :O -32032
+u0041_0306 OE -32032
+u0041_0306 /O -32032
+u0041_0306 U -32032
+u0041_0306 u0055_030B -32032
+u0041_0306 u0055_030A -32032
+u0041_0306 `U -32032
+u0041_0306 'U -32032
+u0041_0306 ^U -32032
+u0041_0306 :U -32032
+u0041_0306 T -96096
+u0041_0306 u0054_030C -96096
+u0041_0306 u0054_0327 -96096
+u0041_0306 Y -96096
+u0041_0306 :Y -96096
+u0041_0306 'Y -96096
+u0041_0306 V -128128
+u0041_0306 W -128128
+'C v -32032
+'C w -32032
+'C c -32032
+'C 'c -32032
+'C u0063_030C -32032
+'C ,c -32032
+'C d -32032
+'C u0064_030C -32032
+'C u0111 -32032
+'C Sd -32032
+'C e -32032
+'C u0065_030C -32032
+'C u0065_0328 -32032
+'C `e -32032
+'C 'e -32032
+'C ^e -32032
+'C :e -32032
+'C o -32032
+'C u006F_030B -32032
+'C `o -32032
+'C 'o -32032
+'C ^o -32032
+'C ~o -32032
+'C :o -32032
+'C oe -32032
+'C /o -32032
+'C q -32032
+'C t -32032
+'C u0074_030C -32032
+'C u0074_0327 -32032
+'C C -32032
+'C G -32032
+'C 'C -32032
+'C u0043_030C -32032
+'C u0047_0306 -32032
+'C ,C -32032
+'C Q -32032
+'C O -32032
+'C u004F_030B -32032
+'C `O -32032
+'C 'O -32032
+'C ^O -32032
+'C ~O -32032
+'C :O -32032
+'C OE -32032
+'C /O -32032
+'C U -32032
+'C u0055_030B -32032
+'C u0055_030A -32032
+'C `U -32032
+'C 'U -32032
+'C ^U -32032
+'C :U -32032
+'C T -96096
+'C u0054_030C -96096
+'C u0054_0327 -96096
+'C Y -96096
+'C :Y -96096
+'C 'Y -96096
+'C V -128128
+'C W -128128
+u0044_030C X -32032
+u0044_030C W -32032
+u0044_030C A -32032
+u0044_030C u0041_0306 -32032
+u0044_030C u0041_0328 -32032
+u0044_030C `A -32032
+u0044_030C 'A -32032
+u0044_030C ^A -32032
+u0044_030C ~A -32032
+u0044_030C :A -32032
+u0044_030C oA -32032
+u0044_030C AE -32032
+u0044_030C V -32032
+u0044_030C Y -32032
+u0044_030C :Y -32032
+u0044_030C 'Y -32032
+u004C_0301 T -96096
+u004C_0301 u0054_030C -96096
+u004C_0301 u0054_0327 -96096
+u004C_0301 Y -96096
+u004C_0301 :Y -96096
+u004C_0301 'Y -96096
+u004C_0301 V -128128
+u004C_0301 W -128128
+u004C_030C T -96096
+u004C_030C u0054_030C -96096
+u004C_030C u0054_0327 -96096
+u004C_030C Y -96096
+u004C_030C :Y -96096
+u004C_030C 'Y -96096
+u004C_030C V -128128
+u004C_030C W -128128
+/L T -96096
+/L u0054_030C -96096
+/L u0054_0327 -96096
+/L Y -96096
+/L :Y -96096
+/L 'Y -96096
+/L V -128128
+/L W -128128
+u004F_030B X -32032
+u004F_030B W -32032
+u004F_030B A -32032
+u004F_030B u0041_0306 -32032
+u004F_030B u0041_0328 -32032
+u004F_030B `A -32032
+u004F_030B 'A -32032
+u004F_030B ^A -32032
+u004F_030B ~A -32032
+u004F_030B :A -32032
+u004F_030B oA -32032
+u004F_030B AE -32032
+u004F_030B V -32032
+u004F_030B Y -32032
+u004F_030B :Y -32032
+u004F_030B 'Y -32032
+u0054_030C y -96096
+u0054_030C e -96096
+u0054_030C o -96096
+u0054_030C r -96096
+u0054_030C a -96096
+u0054_030C u -96096
+u0054_030C n -96096
+u0054_030C .i -96096
+u0054_030C c -96096
+u0054_030C d -96096
+u0054_030C g -96096
+u0054_030C p -96096
+u0054_030C s -96096
+u0054_030C v -96096
+u0054_030C w -96096
+u0054_030C x -96096
+u0054_030C z -96096
+u0054_030C A -96096
+u0054_030C u0041_0306 -96096
+u0054_030C u0041_0328 -96096
+u0054_030C `A -96096
+u0054_030C 'A -96096
+u0054_030C ^A -96096
+u0054_030C ~A -96096
+u0054_030C :A -96096
+u0054_030C oA -96096
+u0054_030C AE -96096
+u0054_0327 y -96096
+u0054_0327 e -96096
+u0054_0327 o -96096
+u0054_0327 r -96096
+u0054_0327 a -96096
+u0054_0327 u -96096
+u0054_0327 n -96096
+u0054_0327 .i -96096
+u0054_0327 c -96096
+u0054_0327 d -96096
+u0054_0327 g -96096
+u0054_0327 p -96096
+u0054_0327 s -96096
+u0054_0327 v -96096
+u0054_0327 w -96096
+u0054_0327 x -96096
+u0054_0327 z -96096
+u0054_0327 A -96096
+u0054_0327 u0041_0306 -96096
+u0054_0327 u0041_0328 -96096
+u0054_0327 `A -96096
+u0054_0327 'A -96096
+u0054_0327 ^A -96096
+u0054_0327 ~A -96096
+u0054_0327 :A -96096
+u0054_0327 oA -96096
+u0054_0327 AE -96096
+:Y e -96096
+:Y o -96096
+:Y r -96096
+:Y a -96096
+:Y u -96096
+:Y n -96096
+:Y .i -96096
+:Y c -96096
+:Y d -96096
+:Y g -96096
+:Y p -96096
+:Y s -96096
+:Y v -96096
+:Y w -96096
+:Y x -96096
+:Y z -96096
+:Y A -96096
+:Y u0041_0306 -96096
+:Y u0041_0328 -96096
+:Y `A -96096
+:Y 'A -96096
+:Y ^A -96096
+:Y ~A -96096
+:Y :A -96096
+:Y oA -96096
+:Y AE -96096
+u0061_0306 r -32032
+u0061_0306 y -32032
+u0061_0306 :y -32032
+u0061_0306 'y -32032
+u0061_0306 w -32032
+u0061_0328 w -32032
+/l cq 32032
+/l ' 32032
+/l a -32032
+/l u0061_0328 -32032
+/l c -32032
+/l 'c -32032
+/l d -32032
+/l e -32032
+/l u0065_0328 -32032
+/l g -32032
+/l o -32032
+/l 'o -32032
+/l s -32032
+/l u0073_0301 -32032
+u006F_030B e 32032
+u006F_030B u0065_030C 32032
+u006F_030B u0065_0328 32032
+u006F_030B `e 32032
+u006F_030B 'e 32032
+u006F_030B ^e 32032
+u006F_030B :e 32032
+u006F_030B o 32032
+u006F_030B u006F_030B 32032
+u006F_030B `o 32032
+u006F_030B 'o 32032
+u006F_030B ^o 32032
+u006F_030B ~o 32032
+u006F_030B :o 32032
+u006F_030B oe 32032
+u006F_030B /o 32032
+u006F_030B x -32032
+u006F_030B d 32032
+u006F_030B c 32032
+u006F_030B 'c 32032
+u006F_030B u0063_030C 32032
+u006F_030B ,c 32032
+u006F_030B q 32032
+u006F_030B r -32032
+u006F_030B y -32032
+u006F_030B :y -32032
+u006F_030B 'y -32032
+u006F_030B w -32032
+u0074_030C y -32032
+u0074_030C :y -32032
+u0074_030C 'y -32032
+u0074_030C w -32032
+u0074_0327 y -32032
+u0074_0327 :y -32032
+u0074_0327 'y -32032
+u0074_0327 w -32032
+u0075_030B w -32032
+u0075_030A w -32032
+:y o -32032
+:y u006F_030B -32032
+:y `o -32032
+:y 'o -32032
+:y ^o -32032
+:y ~o -32032
+:y :o -32032
+:y oe -32032
+:y /o -32032
+:y e -32032
+:y u0065_030C -32032
+:y u0065_0328 -32032
+:y `e -32032
+:y 'e -32032
+:y ^e -32032
+:y :e -32032
+:y a -32032
+:y u0061_0306 -32032
+:y u0061_0328 -32032
+:y `a -32032
+:y 'a -32032
+:y ^a -32032
+:y ^a -32032
+:y ~a -32032
+:y :a -32032
+:y oa -32032
+:y ae -32032
+:y . -96096
+:y , -96096
+`A y -32032
+`A :y -32032
+`A 'y -32032
+`A v -32032
+`A w -32032
+`A c -32032
+`A 'c -32032
+`A u0063_030C -32032
+`A ,c -32032
+`A d -32032
+`A u0064_030C -32032
+`A u0111 -32032
+`A Sd -32032
+`A e -32032
+`A u0065_030C -32032
+`A u0065_0328 -32032
+`A `e -32032
+`A 'e -32032
+`A ^e -32032
+`A :e -32032
+`A o -32032
+`A u006F_030B -32032
+`A `o -32032
+`A 'o -32032
+`A ^o -32032
+`A ~o -32032
+`A :o -32032
+`A oe -32032
+`A /o -32032
+`A q -32032
+`A t -32032
+`A u0074_030C -32032
+`A u0074_0327 -32032
+`A C -32032
+`A G -32032
+`A 'C -32032
+`A u0043_030C -32032
+`A u0047_0306 -32032
+`A ,C -32032
+`A Q -32032
+`A O -32032
+`A u004F_030B -32032
+`A `O -32032
+`A 'O -32032
+`A ^O -32032
+`A ~O -32032
+`A :O -32032
+`A OE -32032
+`A /O -32032
+`A U -32032
+`A u0055_030B -32032
+`A u0055_030A -32032
+`A `U -32032
+`A 'U -32032
+`A ^U -32032
+`A :U -32032
+`A T -96096
+`A u0054_030C -96096
+`A u0054_0327 -96096
+`A Y -96096
+`A :Y -96096
+`A 'Y -96096
+`A V -128128
+`A W -128128
+'A y -32032
+'A :y -32032
+'A 'y -32032
+'A v -32032
+'A w -32032
+'A c -32032
+'A 'c -32032
+'A u0063_030C -32032
+'A ,c -32032
+'A d -32032
+'A u0064_030C -32032
+'A u0111 -32032
+'A Sd -32032
+'A e -32032
+'A u0065_030C -32032
+'A u0065_0328 -32032
+'A `e -32032
+'A 'e -32032
+'A ^e -32032
+'A :e -32032
+'A o -32032
+'A u006F_030B -32032
+'A `o -32032
+'A 'o -32032
+'A ^o -32032
+'A ~o -32032
+'A :o -32032
+'A oe -32032
+'A /o -32032
+'A q -32032
+'A t -32032
+'A u0074_030C -32032
+'A u0074_0327 -32032
+'A C -32032
+'A G -32032
+'A 'C -32032
+'A u0043_030C -32032
+'A u0047_0306 -32032
+'A ,C -32032
+'A Q -32032
+'A O -32032
+'A u004F_030B -32032
+'A `O -32032
+'A 'O -32032
+'A ^O -32032
+'A ~O -32032
+'A :O -32032
+'A OE -32032
+'A /O -32032
+'A U -32032
+'A u0055_030B -32032
+'A u0055_030A -32032
+'A `U -32032
+'A 'U -32032
+'A ^U -32032
+'A :U -32032
+'A T -96096
+'A u0054_030C -96096
+'A u0054_0327 -96096
+'A Y -96096
+'A :Y -96096
+'A 'Y -96096
+'A V -128128
+'A W -128128
+^A y -32032
+^A :y -32032
+^A 'y -32032
+^A v -32032
+^A w -32032
+^A c -32032
+^A 'c -32032
+^A u0063_030C -32032
+^A ,c -32032
+^A d -32032
+^A u0064_030C -32032
+^A u0111 -32032
+^A Sd -32032
+^A e -32032
+^A u0065_030C -32032
+^A u0065_0328 -32032
+^A `e -32032
+^A 'e -32032
+^A ^e -32032
+^A :e -32032
+^A o -32032
+^A u006F_030B -32032
+^A `o -32032
+^A 'o -32032
+^A ^o -32032
+^A ~o -32032
+^A :o -32032
+^A oe -32032
+^A /o -32032
+^A q -32032
+^A t -32032
+^A u0074_030C -32032
+^A u0074_0327 -32032
+^A C -32032
+^A G -32032
+^A 'C -32032
+^A u0043_030C -32032
+^A u0047_0306 -32032
+^A ,C -32032
+^A Q -32032
+^A O -32032
+^A u004F_030B -32032
+^A `O -32032
+^A 'O -32032
+^A ^O -32032
+^A ~O -32032
+^A :O -32032
+^A OE -32032
+^A /O -32032
+^A U -32032
+^A u0055_030B -32032
+^A u0055_030A -32032
+^A `U -32032
+^A 'U -32032
+^A ^U -32032
+^A :U -32032
+^A T -96096
+^A u0054_030C -96096
+^A u0054_0327 -96096
+^A Y -96096
+^A :Y -96096
+^A 'Y -96096
+^A V -128128
+^A W -128128
+~A y -32032
+~A :y -32032
+~A 'y -32032
+~A v -32032
+~A w -32032
+~A c -32032
+~A 'c -32032
+~A u0063_030C -32032
+~A ,c -32032
+~A d -32032
+~A u0064_030C -32032
+~A u0111 -32032
+~A Sd -32032
+~A e -32032
+~A u0065_030C -32032
+~A u0065_0328 -32032
+~A `e -32032
+~A 'e -32032
+~A ^e -32032
+~A :e -32032
+~A o -32032
+~A u006F_030B -32032
+~A `o -32032
+~A 'o -32032
+~A ^o -32032
+~A ~o -32032
+~A :o -32032
+~A oe -32032
+~A /o -32032
+~A q -32032
+~A t -32032
+~A u0074_030C -32032
+~A u0074_0327 -32032
+~A C -32032
+~A G -32032
+~A 'C -32032
+~A u0043_030C -32032
+~A u0047_0306 -32032
+~A ,C -32032
+~A Q -32032
+~A O -32032
+~A u004F_030B -32032
+~A `O -32032
+~A 'O -32032
+~A ^O -32032
+~A ~O -32032
+~A :O -32032
+~A OE -32032
+~A /O -32032
+~A U -32032
+~A u0055_030B -32032
+~A u0055_030A -32032
+~A `U -32032
+~A 'U -32032
+~A ^U -32032
+~A :U -32032
+~A T -96096
+~A u0054_030C -96096
+~A u0054_0327 -96096
+~A Y -96096
+~A :Y -96096
+~A 'Y -96096
+~A V -128128
+~A W -128128
+:A y -32032
+:A :y -32032
+:A 'y -32032
+:A v -32032
+:A w -32032
+:A c -32032
+:A 'c -32032
+:A u0063_030C -32032
+:A ,c -32032
+:A d -32032
+:A u0064_030C -32032
+:A u0111 -32032
+:A Sd -32032
+:A e -32032
+:A u0065_030C -32032
+:A u0065_0328 -32032
+:A `e -32032
+:A 'e -32032
+:A ^e -32032
+:A :e -32032
+:A o -32032
+:A u006F_030B -32032
+:A `o -32032
+:A 'o -32032
+:A ^o -32032
+:A ~o -32032
+:A :o -32032
+:A oe -32032
+:A /o -32032
+:A q -32032
+:A t -32032
+:A u0074_030C -32032
+:A u0074_0327 -32032
+:A C -32032
+:A G -32032
+:A 'C -32032
+:A u0043_030C -32032
+:A u0047_0306 -32032
+:A ,C -32032
+:A Q -32032
+:A O -32032
+:A u004F_030B -32032
+:A `O -32032
+:A 'O -32032
+:A ^O -32032
+:A ~O -32032
+:A :O -32032
+:A OE -32032
+:A /O -32032
+:A U -32032
+:A u0055_030B -32032
+:A u0055_030A -32032
+:A `U -32032
+:A 'U -32032
+:A ^U -32032
+:A :U -32032
+:A T -96096
+:A u0054_030C -96096
+:A u0054_0327 -96096
+:A Y -96096
+:A :Y -96096
+:A 'Y -96096
+:A V -128128
+:A W -128128
+oA y -32032
+oA :y -32032
+oA 'y -32032
+oA v -32032
+oA w -32032
+oA c -32032
+oA 'c -32032
+oA u0063_030C -32032
+oA ,c -32032
+oA d -32032
+oA u0064_030C -32032
+oA u0111 -32032
+oA Sd -32032
+oA e -32032
+oA u0065_030C -32032
+oA u0065_0328 -32032
+oA `e -32032
+oA 'e -32032
+oA ^e -32032
+oA :e -32032
+oA o -32032
+oA u006F_030B -32032
+oA `o -32032
+oA 'o -32032
+oA ^o -32032
+oA ~o -32032
+oA :o -32032
+oA oe -32032
+oA /o -32032
+oA q -32032
+oA t -32032
+oA u0074_030C -32032
+oA u0074_0327 -32032
+oA C -32032
+oA G -32032
+oA 'C -32032
+oA u0043_030C -32032
+oA u0047_0306 -32032
+oA ,C -32032
+oA Q -32032
+oA O -32032
+oA u004F_030B -32032
+oA `O -32032
+oA 'O -32032
+oA ^O -32032
+oA ~O -32032
+oA :O -32032
+oA OE -32032
+oA /O -32032
+oA U -32032
+oA u0055_030B -32032
+oA u0055_030A -32032
+oA `U -32032
+oA 'U -32032
+oA ^U -32032
+oA :U -32032
+oA T -96096
+oA u0054_030C -96096
+oA u0054_0327 -96096
+oA Y -96096
+oA :Y -96096
+oA 'Y -96096
+oA V -128128
+oA W -128128
+u0189 X -32032
+u0110 X -32032
+-D X -32032
+u0189 W -32032
+u0110 W -32032
+-D W -32032
+u0189 A -32032
+u0110 A -32032
+-D A -32032
+u0189 u0041_0306 -32032
+u0110 u0041_0306 -32032
+-D u0041_0306 -32032
+u0189 u0041_0328 -32032
+u0110 u0041_0328 -32032
+-D u0041_0328 -32032
+u0189 `A -32032
+u0110 `A -32032
+-D `A -32032
+u0189 'A -32032
+u0110 'A -32032
+-D 'A -32032
+u0189 ^A -32032
+u0110 ^A -32032
+-D ^A -32032
+u0189 ~A -32032
+u0110 ~A -32032
+-D ~A -32032
+u0189 :A -32032
+u0110 :A -32032
+-D :A -32032
+u0189 oA -32032
+u0110 oA -32032
+-D oA -32032
+u0189 AE -32032
+u0110 AE -32032
+-D AE -32032
+u0189 V -32032
+u0110 V -32032
+-D V -32032
+u0189 Y -32032
+u0110 Y -32032
+-D Y -32032
+u0189 :Y -32032
+u0110 :Y -32032
+-D :Y -32032
+u0189 'Y -32032
+u0110 'Y -32032
+-D 'Y -32032
+`O X -32032
+`O W -32032
+`O A -32032
+`O u0041_0306 -32032
+`O u0041_0328 -32032
+`O `A -32032
+`O 'A -32032
+`O ^A -32032
+`O ~A -32032
+`O :A -32032
+`O oA -32032
+`O AE -32032
+`O V -32032
+`O Y -32032
+`O :Y -32032
+`O 'Y -32032
+'O X -32032
+'O W -32032
+'O A -32032
+'O u0041_0306 -32032
+'O u0041_0328 -32032
+'O `A -32032
+'O 'A -32032
+'O ^A -32032
+'O ~A -32032
+'O :A -32032
+'O oA -32032
+'O AE -32032
+'O V -32032
+'O Y -32032
+'O :Y -32032
+'O 'Y -32032
+^O X -32032
+^O W -32032
+^O A -32032
+^O u0041_0306 -32032
+^O u0041_0328 -32032
+^O `A -32032
+^O 'A -32032
+^O ^A -32032
+^O ~A -32032
+^O :A -32032
+^O oA -32032
+^O AE -32032
+^O V -32032
+^O Y -32032
+^O :Y -32032
+^O 'Y -32032
+~O X -32032
+~O W -32032
+~O A -32032
+~O u0041_0306 -32032
+~O u0041_0328 -32032
+~O `A -32032
+~O 'A -32032
+~O ^A -32032
+~O ~A -32032
+~O :A -32032
+~O oA -32032
+~O AE -32032
+~O V -32032
+~O Y -32032
+~O :Y -32032
+~O 'Y -32032
+:O X -32032
+:O W -32032
+:O A -32032
+:O u0041_0306 -32032
+:O u0041_0328 -32032
+:O `A -32032
+:O 'A -32032
+:O ^A -32032
+:O ~A -32032
+:O :A -32032
+:O oA -32032
+:O AE -32032
+:O V -32032
+:O Y -32032
+:O :Y -32032
+:O 'Y -32032
+/O X -32032
+/O W -32032
+/O A -32032
+/O u0041_0306 -32032
+/O u0041_0328 -32032
+/O `A -32032
+/O 'A -32032
+/O ^A -32032
+/O ~A -32032
+/O :A -32032
+/O oA -32032
+/O AE -32032
+/O V -32032
+/O Y -32032
+/O :Y -32032
+/O 'Y -32032
+'Y e -96096
+'Y o -96096
+'Y r -96096
+'Y a -96096
+'Y u -96096
+'Y n -96096
+'Y .i -96096
+'Y c -96096
+'Y d -96096
+'Y g -96096
+'Y p -96096
+'Y s -96096
+'Y v -96096
+'Y w -96096
+'Y x -96096
+'Y z -96096
+'Y A -96096
+'Y u0041_0306 -96096
+'Y u0041_0328 -96096
+'Y `A -96096
+'Y 'A -96096
+'Y ^A -96096
+'Y ~A -96096
+'Y :A -96096
+'Y oA -96096
+'Y AE -96096
+`a r -32032
+`a y -32032
+`a :y -32032
+`a 'y -32032
+`a w -32032
+'a r -32032
+'a y -32032
+'a :y -32032
+'a 'y -32032
+'a w -32032
+^a r -32032
+^a y -32032
+^a :y -32032
+^a 'y -32032
+^a w -32032
+~a r -32032
+~a y -32032
+~a :y -32032
+~a 'y -32032
+~a w -32032
+:a r -32032
+:a y -32032
+:a :y -32032
+:a 'y -32032
+:a w -32032
+oa r -32032
+oa y -32032
+oa :y -32032
+oa 'y -32032
+oa w -32032
+`o e 32032
+`o u0065_030C 32032
+`o u0065_0328 32032
+`o `e 32032
+`o 'e 32032
+`o ^e 32032
+`o :e 32032
+`o o 32032
+`o u006F_030B 32032
+`o `o 32032
+`o 'o 32032
+`o ^o 32032
+`o ~o 32032
+`o :o 32032
+`o oe 32032
+`o /o 32032
+`o x -32032
+`o d 32032
+`o c 32032
+`o 'c 32032
+`o u0063_030C 32032
+`o ,c 32032
+`o q 32032
+`o r -32032
+`o y -32032
+`o :y -32032
+`o 'y -32032
+`o w -32032
+'o e 32032
+'o u0065_030C 32032
+'o u0065_0328 32032
+'o `e 32032
+'o 'e 32032
+'o ^e 32032
+'o :e 32032
+'o o 32032
+'o u006F_030B 32032
+'o `o 32032
+'o 'o 32032
+'o ^o 32032
+'o ~o 32032
+'o :o 32032
+'o oe 32032
+'o /o 32032
+'o x -32032
+'o d 32032
+'o c 32032
+'o 'c 32032
+'o u0063_030C 32032
+'o ,c 32032
+'o q 32032
+'o r -32032
+'o y -32032
+'o :y -32032
+'o 'y -32032
+'o w -32032
+^o e 32032
+^o u0065_030C 32032
+^o u0065_0328 32032
+^o `e 32032
+^o 'e 32032
+^o ^e 32032
+^o :e 32032
+^o o 32032
+^o u006F_030B 32032
+^o `o 32032
+^o 'o 32032
+^o ^o 32032
+^o ~o 32032
+^o :o 32032
+^o oe 32032
+^o /o 32032
+^o x -32032
+^o d 32032
+^o c 32032
+^o 'c 32032
+^o u0063_030C 32032
+^o ,c 32032
+^o q 32032
+^o r -32032
+^o y -32032
+^o :y -32032
+^o 'y -32032
+^o w -32032
+~o e 32032
+~o u0065_030C 32032
+~o u0065_0328 32032
+~o `e 32032
+~o 'e 32032
+~o ^e 32032
+~o :e 32032
+~o o 32032
+~o u006F_030B 32032
+~o `o 32032
+~o 'o 32032
+~o ^o 32032
+~o ~o 32032
+~o :o 32032
+~o oe 32032
+~o /o 32032
+~o x -32032
+~o d 32032
+~o c 32032
+~o 'c 32032
+~o u0063_030C 32032
+~o ,c 32032
+~o q 32032
+~o r -32032
+~o y -32032
+~o :y -32032
+~o 'y -32032
+~o w -32032
+:o e 32032
+:o u0065_030C 32032
+:o u0065_0328 32032
+:o `e 32032
+:o 'e 32032
+:o ^e 32032
+:o :e 32032
+:o o 32032
+:o u006F_030B 32032
+:o `o 32032
+:o 'o 32032
+:o ^o 32032
+:o ~o 32032
+:o :o 32032
+:o oe 32032
+:o /o 32032
+:o x -32032
+:o d 32032
+:o c 32032
+:o 'c 32032
+:o u0063_030C 32032
+:o ,c 32032
+:o q 32032
+:o r -32032
+:o y -32032
+:o :y -32032
+:o 'y -32032
+:o w -32032
+/o e 32032
+/o u0065_030C 32032
+/o u0065_0328 32032
+/o `e 32032
+/o 'e 32032
+/o ^e 32032
+/o :e 32032
+/o o 32032
+/o u006F_030B 32032
+/o `o 32032
+/o 'o 32032
+/o ^o 32032
+/o ~o 32032
+/o :o 32032
+/o oe 32032
+/o /o 32032
+/o x -32032
+/o d 32032
+/o c 32032
+/o 'c 32032
+/o u0063_030C 32032
+/o ,c 32032
+/o q 32032
+/o r -32032
+/o y -32032
+/o :y -32032
+/o 'y -32032
+/o w -32032
+`u w -32032
+'u w -32032
+^u w -32032
+:u w -32032
+'y o -32032
+'y u006F_030B -32032
+'y `o -32032
+'y 'o -32032
+'y ^o -32032
+'y ~o -32032
+'y :o -32032
+'y oe -32032
+'y /o -32032
+'y e -32032
+'y u0065_030C -32032
+'y u0065_0328 -32032
+'y `e -32032
+'y 'e -32032
+'y ^e -32032
+'y :e -32032
+'y a -32032
+'y u0061_0306 -32032
+'y u0061_0328 -32032
+'y `a -32032
+'y 'a -32032
+'y ^a -32032
+'y ^a -32032
+'y ~a -32032
+'y :a -32032
+'y oa -32032
+'y ae -32032
+'y . -96096
+'y , -96096
+charset
+ga 576576,698880 2 0000
+aa 576576,698880 2 0001
+a^ 576576,698880 2 0002
+a~ 576576,698880 2 0003
+ad 576576,728000 2 0004
+a" 576576,698880,0,14555 2 0005
+ao 768768,698880 2 0006
+ah 576576,698880 2 0007
+ab 576576,698880 2 0010
+a- 576576,728000 2 0011
+a. 320320,755976 2 0012
+ac 512512,0,178360 1 0013
+ho 320320,0,203840 1 0014
+bq 320320,136864,110656 1 0015
+fo 512512,524160 2 0016
+fc 512512,524160 2 0017
+lq 393120,755976 2 0020
+rq 393120,755976 2 0021
+Bq 393120,136864,110656 1 0022
+Fo 768768,524160 2 0023
+Fc 768768,524160 2 0024
+en 576576,480480,0,32032 0 0025
+em 1153152,480480,0,32032 0 0026
+--- 0,480480 0 0027
+--- 512512,782600,29120 3 0030
+.i 267904,480480 0 0031
+.j 299936,480480,203840 1 0032
+ff 672672,755976,0,80080 2 0033
+fi 614432,755976 2 0034
+fl 614432,755976 2 0035
+Fi 934752,755976 2 0036
+Fl 934752,755976 2 0037
+u2423 576576,480480,101920 1 0040
+u01C3 384384,755976 2 0041
+! "
+dq 576576,755976 2 0042
+" "
+sh 960960,755976,232960 3 0043
+# "
+Do 576576,782600,29120 3 0044
+$ "
+% 1078840,782600,29120 3 0045
+& 870688,755976 2 0046
+cq 320320,755976 2 0047
+' "
+( 448448,782600,262080 3 0050
+) 448448,782600,262080 3 0051
+* 576576,782600 2 0052
++ 896896,646464,122304 3 0053
+, 320320,136864,110656 1 0054
+- 384384,480480 0 0055
+. 320320,136864 0 0056
+sl 576576,782600,262080 3 0057
+/ "
+0 576576,728000 2 0060
+1 576576,728000 2 0061
+2 576576,728000 2 0062
+3 576576,728000 2 0063
+4 576576,728000 2 0064
+5 576576,728000 2 0065
+6 576576,728000 2 0066
+7 576576,728000 2 0067
+8 576576,728000 2 0070
+9 576576,728000 2 0071
+: 320320,480480 0 0072
+; 320320,480480,110656 1 0073
+< 896896,636091,111931 3 0074
+= 896896,425880,-98280 0 0075
+> 896896,636091,111931 3 0076
+? 544544,755976 2 0077
+at 768768,755976 2 0100
+@ "
+A 768768,728000 2 0101
+B 768768,728000 2 0102
+C 736736,728000,0,0,-32032 2 0103
+D 832832,728000,0,0,0,-32032 2 0104
+E 672672,728000 2 0105
+F 640640,728000,0,0,0,-160160 2 0106
+G 768768,728000,0,0,-32032 2 0107
+H 832832,728000 2 0110
+I 340704,728000 2 0111
+J 544544,728000,0,0,0,-32032 2 0112
+K 800800,728000 2 0113
+L 608608,728000,0,0,0,64064 2 0114
+M 1025024,728000 2 0115
+N 832832,728000 2 0116
+O 832832,728000,0,0,-32032,-32032 2 0117
+P 736736,728000,0,0,0,-160160 2 0120
+Q 832832,728000,110656,0,-32032 3 0121
+R 736736,728000 2 0122
+S 640640,728000 2 0123
+T 768768,728000,0,0,0,-160160 2 0124
+U 800800,728000,0,0,32032 2 0125
+V 768768,728000,0,16016,48048,-240240 2 0126
+W 1089088,728000,0,16016,48048,-144144 2 0127
+X 768768,728000 2 0130
+Y 768768,728000,0,28829,32032,-227427 2 0131
+Z 704704,728000 2 0132
+lB 359632,782600,262080 3 0133
+[ "
+rs 576576,782600,262080 3 0134
+\ "
+rB 359632,782600,262080 3 0135
+] "
+ha 704704,755976 2 0136
+^ "
+_ 896896,0,352171 1 0137
+oq 320320,755976 2 0140
+` "
+a 550368,480480 0 0141
+b 588224,755976 2 0142
+c 512512,480480 0 0143
+d 588224,755976 2 0144
+e 535808,480480 0 0145
+f 352352,755976,0,80080 2 0146
+g 576576,480480,203840,16016 1 0147
+h 588224,755976 2 0150
+i 267904,755976 2 0151
+j 299936,755976,203840 3 0152
+k 556192,755976 2 0153
+l 267904,755976 2 0154
+m 908544,480480 0 0155
+n 588224,480480 0 0156
+o 576576,480480 0 0157
+p 588224,480480,203840 1 0160
+q 588224,480480,203840 1 0161
+r 390208,480480,0,16016 0 0162
+s 442042,480480 0 0163
+t 423696,617763 2 0164
+u 588224,480480 0 0165
+v 524160,480480,0,16016 0 0166
+w 780416,480480,0,16016 0 0167
+x 524160,480480 0 0170
+y 524160,480480,203840,16016 1 0171
+z 499408,480480 0 0172
+lC 576576,782600,262080 3 0173
+{ "
+u01C0 320320,782600,262080 3 0174
+ba "
+| "
+rC 576576,782600,262080 3 0175
+} "
+~ 704704,755976 2 0176
+hy 192192,480480 0 0177
+u0041_0306 768768,946400 2 0200
+u0041_0328 768768,728000,203840 3 0201
+'C 736736,905917 2 0202
+u0043_030C 736736,946400,0,0,-32032 2 0203
+u0044_030C 832832,946400,0,0,0,-32032 2 0204
+u0045_030C 672672,946400 2 0205
+u0045_0328 672672,728000,203840 3 0206
+u0047_0306 768768,946400,0,0,-32032 2 0207
+u004C_0301 608608,905917,0,0,0,64064 2 0210
+u004C_030C 608608,946400,0,0,0,64064 2 0211
+/L 704704,728000 2 0212
+u004E_0301 832832,905917 2 0213
+u004E_030C 832832,946400 2 0214
+u014A 864864,728000,0,0,0,-32032 2 0215
+u004F_030B 832832,905917,0,0,-32032,-32032 2 0216
+u0052_0301 736736,905917 2 0217
+u0052_030C 736736,946400 2 0220
+u0053_0301 640640,905917 2 0221
+vS 640640,946400 2 0222
+u0053_0327 640640,728000,178360 3 0223
+u0054_030C 768768,946400,0,0,0,-160160 2 0224
+u0054_0327 768768,728000,178360,0,0,-160160 3 0225
+u0055_030B 800800,905917,0,0,32032 2 0226
+u0055_030A 800800,946400,0,0,32032 2 0227
+:Y 768768,946400,0,28829,32032,-227427 2 0230
+u005A_0301 704704,905917 2 0231
+vZ 704704,946400 2 0232
+u005A_0307 704704,905917 2 0233
+IJ 853216,728000,0,0,0,-32032 2 0234
+u0049_0307 340704,905917 2 0235
+u0111 588224,755976 2 0236
+sc 559104,755976,203840 3 0237
+u0061_0306 550368,698880 2 0240
+u0061_0328 550368,480480,203840 1 0241
+'c 512512,698880 2 0242
+u0063_030C 512512,698880 2 0243
+u0064_030C 767312,755976 2 0244
+u0065_030C 535808,698880 2 0245
+u0065_0328 535808,480480,203840 1 0246
+u0067_0306 576576,698880,203840,16016 3 0247
+u006C_0301 267904,905917,0,123075 2 0250
+u006C_030C 446992,755976 2 0251
+/l 399818,755976,0,29120 2 0252
+u006E_0301 588224,698880 2 0253
+u006E_030C 588224,698880 2 0254
+u016A 588224,480480,203840 1 0255
+u006F_030B 576576,698880,0,14555 2 0256
+u0072_0301 390208,698880,0,16016 2 0257
+u0072_030C 390208,698880,0,16016 2 0260
+u0073_0301 442042,698880 2 0261
+vs 442042,698880 2 0262
+u0073_0327 442042,480480,178360 1 0263
+u0074_030C 423696,755976 2 0264
+u0074_0327 423696,617763,178360 3 0265
+u0075_030B 588224,698880,0,8730 2 0266
+u0075_030A 588224,698880 2 0267
+:y 524160,728000,203840,16016 3 0270
+u007A_0301 499408,698880 2 0271
+vz 499408,698880 2 0272
+u007A_0307 499408,755976 2 0273
+ij 620256,755976,203840 3 0274
+r! 384384,553280,203840 3 0275
+r? 544544,553280,203840 3 0276
+Po 736736,755976 2 0277
+`A 768768,905917 2 0300
+'A 768768,905917 2 0301
+^A 768768,946400 2 0302
+~A 768768,946400 2 0303
+:A 768768,946400 2 0304
+oA 768768,905917 2 0305
+AE 992992,728000 2 0306
+,C 736736,728000,178360,0,-32032 3 0307
+`E 672672,905917 2 0310
+'E 672672,905917 2 0311
+^E 672672,946400 2 0312
+:E 672672,946400 2 0313
+`I 340704,905917 2 0314
+'I 340704,905917,0,85210,0,42605 2 0315
+^I 340704,946400 2 0316
+:I 340704,946400 2 0317
+u0189 832832,728000,0,0,0,-32032 2 0320
+u0110 "
+-D "
+~N 832832,946400 2 0321
+`O 832832,905917,0,0,-32032,-32032 2 0322
+'O 832832,905917 2 0323
+^O 832832,946400,0,0,-32032,-32032 2 0324
+~O 832832,946400,0,0,-32032,-32032 2 0325
+:O 832832,946400,0,0,-32032,-32032 2 0326
+OE 1121120,728000 2 0327
+/O 896896,782600,50960 3 0330
+`U 800800,905917,0,0,32032 2 0331
+'U 800800,905917 2 0332
+^U 800800,946400,0,0,32032 2 0333
+:U 800800,946400,0,0,32032 2 0334
+'Y 768768,905917,0,28829,32032,-227427 2 0335
+TP 672672,728000 2 0336
+--- 1281280,728000 2 0337
+`a 550368,698880 2 0340
+'a 550368,698880 2 0341
+^a 550368,698880 2 0342
+~a 550368,698880 2 0343
+:a 550368,728000 2 0344
+oa 550368,698880 2 0345
+ae 832832,480480 0 0346
+,c 512512,480480,178360 1 0347
+`e 535808,698880 2 0350
+'e 535808,698880 2 0351
+^e 535808,698880 2 0352
+:e 535808,728000 2 0353
+`i 267904,698880 2 0354
+'i 267904,698880,0,43683 2 0355
+^i 267904,698880 2 0356
+:i 331968,728000 2 0357
+Sd 576576,755976 2 0360
+~n 588224,698880 2 0361
+`o 576576,698880 2 0362
+'o 576576,698880 2 0363
+^o 576576,698880 2 0364
+~o 576576,698880 2 0365
+:o 576576,728000 2 0366
+oe 896896,480480 0 0367
+/o 576576,582400,101920 3 0370
+`u 588224,698880 2 0371
+'u 588224,698880 2 0372
+^u 588224,698880 2 0373
+:u 588224,728000 2 0374
+'y 524160,698880,203840,16016 3 0375
+Tp 588224,755976,203840 3 0376
+ss 592592,755976 2 0377
diff --git a/font/devdvi/HBI b/font/devdvi/HBI
new file mode 100644
index 0000000..f410707
--- /dev/null
+++ b/font/devdvi/HBI
@@ -0,0 +1,298 @@
+name HBI
+internalname cmssbxo10
+spacewidth 384480
+slant 11.999911
+ligatures ff fi fl ffi ffl 0
+checksum 461961576
+designsize 10485760
+kernpairs
+ff cq 80101
+ff ' 80101
+ff ? 80101
+ff ! 80101
+ff ) 80101
+ff rB 80101
+ff ] 80101
+slash@for@l l -267971
+slash@for@l L -307293
+cq ? 128160
+' ? 128160
+cq ! 128160
+' ! 128160
+A t -32040
+A C -32040
+A O -32040
+A G -32040
+A U -32040
+A Q -32040
+A T -96120
+A Y -96120
+A V -128160
+A W -128160
+D X -32040
+D W -32040
+D A -32040
+D V -32040
+D Y -32040
+F o -32040
+F e -32040
+F u -32040
+F r -32040
+F a -32040
+F A -96120
+F O -32040
+F C -32040
+F G -32040
+F Q -32040
+I I 32040
+K O -32040
+K C -32040
+K G -32040
+K Q -32040
+L T -96120
+L Y -96120
+L V -128160
+L W -128160
+O X -32040
+O W -32040
+O A -32040
+O V -32040
+O Y -32040
+P A -96120
+P o -32040
+P e -32040
+P a -32040
+P . -96120
+P , -96120
+T y -96120
+T e -96120
+T o -96120
+T r -96120
+T a -96120
+T A -96120
+T u -96120
+V o -32040
+V e -32040
+V u -32040
+V r -32040
+V a -32040
+V A -96120
+V O -32040
+V C -32040
+V G -32040
+V Q -32040
+W o -32040
+W e -32040
+W u -32040
+W r -32040
+W a -32040
+W A -96120
+W O -32040
+W C -32040
+W G -32040
+W Q -32040
+X O -32040
+X C -32040
+X G -32040
+X Q -32040
+Y e -96120
+Y o -96120
+Y r -96120
+Y a -96120
+Y A -96120
+Y u -96120
+a r -32040
+a y -32040
+a w -32040
+b e 32040
+b o 32040
+b x -32040
+b d 32040
+b c 32040
+b q 32040
+b r -32040
+b y -32040
+b w -32040
+f cq 80101
+f ' 80101
+f ? 80101
+f ! 80101
+f ) 80101
+f rB 80101
+f ] 80101
+g j 32040
+k e -32040
+k a -32040
+k o -32040
+k c -32040
+o e 32040
+o o 32040
+o x -32040
+o d 32040
+o c 32040
+o q 32040
+o r -32040
+o y -32040
+o w -32040
+p e 32040
+p o 32040
+p x -32040
+p d 32040
+p c 32040
+p q 32040
+p r -32040
+p y -32040
+p w -32040
+t y -32040
+t w -32040
+u w -32040
+w e -32040
+w a -32040
+w o -32040
+w c -32040
+y o -32040
+y e -32040
+y a -32040
+y . -96120
+y , -96120
+charset
+*G 608760,728178,0,138757,0,-21443 2 0000
+*D 961200,728178 2 0001
+*H 897120,728178,0,76304,-78474,44264 2 0002
+*L 704880,728178 2 0003
+*C 768960,728178,0,132349,0,66174 2 0004
+*P 833040,728178,0,90698,0,45349 2 0005
+*S 833040,728178,0,122738,0,61370 2 0006
+*U 897120,728178,0,91782,-155862,-68418 2 0007
+*F 833040,728178,0,45349,-109429,45349 2 0010
+*Q 897120,728178,0,91782,-155862,-18190 2 0011
+*W 833040,728178,0,84043,0,42022 2 0012
+ff 672840,728178,0,234878 2 0013
+fi 614586,728178,0,121282 2 0014
+fl 614586,728178,0,124194 2 0015
+Fi 934986,728178,0,121282 2 0016
+Fl 934986,728178,0,124194 2 0017
+.i 267971,480597,0,71570 0 0020
+.j 300011,480597,203890,71570 1 0021
+ga 576720,728178 2 0022
+aa 576720,728178,0,90698 2 0023
+ah 576720,666283,0,60066 2 0024
+ab 576720,728178,0,96523 2 0025
+a- 576720,668757,0,94086 2 0026
+ao 839126,728178 2 0027
+ac 512640,0,178403 1 0030
+ss 592739,728178,0,90698 2 0031
+ae 833040,480597,0,78936 0 0032
+oe 897120,480597,0,78936 0 0033
+/o 576720,582542,101946,34810 3 0034
+AE 993240,728178,0,122738 2 0035
+OE 1121400,728178,0,122738 2 0036
+/O 897120,779150,50973,76304 3 0037
+slash@for@l 267971,480597 0 0040
+! 384480,728178,0,63027 2 0041
+rq 585458,728178,0,28947 2 0042
+sh 961200,728178,203888,58506 3 0043
+# "
+Do 576720,786432,58254,122738 3 0044
+$ "
+% 1079109,786432,58254,29870 3 0045
+& 870906,728178,0,32248 2 0046
+cq 320400,728178,0,95067 2 0047
+' "
+( 448560,786432,262144,135120 3 0050
+) 448560,786432,262144,23680 3 0051
+* 576720,786432,0,119099 2 0052
++ 897120,646624,122336,23680 3 0053
+, 320400,136898,110683 1 0054
+hy 384480,480597,0,19037 0 0055
+- "
+. 320400,136898 0 0056
+sl 576720,786432,262144,135120 3 0057
+/ "
+0 576720,728178,0,122738 2 0060
+1 576720,728178,0,122738 2 0061
+2 576720,728178,0,122738 2 0062
+3 576720,728178,0,122738 2 0063
+4 576720,728178,0,122738 2 0064
+5 576720,728178,0,122738 2 0065
+6 576720,728178,0,122738 2 0066
+7 576720,728178,0,122738 2 0067
+8 576720,728178,0,122738 2 0070
+9 576720,728178,0,122738 2 0071
+: 320400,480597,0,42443 0 0072
+; 320400,480597,110683,42443 1 0073
+r! 384480,524288,203890,19690 3 0074
+= 897120,425984,-98304,58506 0 0075
+r? 544680,524288,203890 3 0076
+? 544680,728178,0,123822 2 0077
+at 768960,728178,0,76304 2 0100
+@ "
+A 768960,728178 2 0101
+B 768960,728178,0,84043,0,42022 2 0102
+C 736920,728178,0,122738,-78474,61370 2 0103
+D 833040,728178,0,76304,0,44264 2 0104
+E 672840,728178,0,122738,0,61370 2 0105
+F 640800,728178,0,138757,0,-21443 2 0106
+G 768960,728178,0,122738,-78474,61370 2 0107
+H 833040,728178,0,90698,0,45349 2 0110
+I 346614,728178,0,138757,0,69379 2 0111
+J 544680,728178,0,90698,0,13309 2 0112
+K 801000,728178,0,122738,0,61370 2 0113
+L 608760,728178,0,0,0,64080 2 0114
+M 1025280,728178,0,90698,0,13309 2 0115
+N 833040,728178,0,90698,0,13309 2 0116
+O 833040,728178,0,76304,-78474,44264 2 0117
+P 736920,728178,0,84043,0,-76157 2 0120
+Q 833040,728178,110683,76304,-78474,76304 3 0121
+R 736920,728178,0,84043,0,63032 2 0122
+S 640800,728178,0,90698,0,45349 2 0123
+T 768960,728178,0,138757,-116083,-21443 2 0124
+U 801000,728178,0,90698,-78474,13309 2 0125
+V 768960,728178,0,170798,-106717,-85522 2 0126
+W 1089360,728178,0,170798,-106717,10598 2 0127
+X 768960,728178,0,138757,0,69379 2 0130
+Y 768960,728178,0,183613,-122738,-72707 2 0131
+Z 704880,728178,0,122738,0,61370 2 0132
+lB 359722,786432,262144,167160 3 0133
+[ "
+lq 585458,728178,0,148370 2 0134
+rB 359722,786432,262144,110362 3 0135
+] "
+ha 576720,728178,0,55680 2 0136
+^ "
+a^ "
+a. 320400,728178,0,103805 2 0137
+oq 320400,728178,0,95067 2 0140
+` "
+a 550506,480597,0,40613 0 0141
+b 588371,728178,0,35056 2 0142
+c 512640,480597,0,89338 0 0143
+d 588371,728178,0,124194 2 0144
+e 535942,480597,0,78936 0 0145
+f 352440,728178,0,234878 2 0146
+g 576720,480597,203890,118174 1 0147
+h 588371,728178,0,48352 2 0150
+i 267971,728178,0,130019 2 0151
+j 300011,728178,203890,124194 3 0152
+k 556331,728178,0,89338 2 0153
+l 267971,728178,0,124194 2 0154
+m 908771,480597,0,48352 0 0155
+n 588371,480597,0,48352 0 0156
+o 576720,480597,0,71507 0 0157
+p 588371,480597,203890,44669 1 0160
+q 588371,480597,203890,71570 1 0161
+r 390306,480597,0,118174 0 0162
+s 442152,480597,0,82930 0 0163
+t 423802,617914,0,76522 2 0164
+u 588371,480597,0,71570 0 0165
+v 524291,480597,0,118174 0 0166
+w 780611,480597,0,118174 0 0167
+x 524291,480597,0,98949 0 0170
+y 524291,480597,203890,118174 1 0171
+z 499533,480597,0,96037 0 0172
+en 576720,480597,0,95173 0 0173
+em 1153440,480597,0,95173 0 0174
+a" 576720,728178,0,90698 2 0175
+~ 576720,728178,0,90698 2 0176
+a~ "
+ad 576720,728178,0,87784 2 0177
diff --git a/font/devdvi/HBIEC b/font/devdvi/HBIEC
new file mode 100644
index 0000000..a34a04f
--- /dev/null
+++ b/font/devdvi/HBIEC
@@ -0,0 +1,2079 @@
+name HBIEC
+internalname ecso1000
+spacewidth 384384
+slant 11.999911
+ligatures ff fi fl ffi ffl 0
+checksum -2073731298
+designsize 10485760
+kernpairs
+bq Bq 128128
+bq j 128128
+bq .j 128128
+bq g 64064
+bq u0067_0306 64064
+bq y 64064
+bq :y 64064
+bq 'y 64064
+bq v -96096
+bq w -64064
+bq V -128128
+bq W -96096
+bq Y -96096
+bq :Y -96096
+bq 'Y -96096
+bq O -32032
+bq u004F_030B -32032
+bq `O -32032
+bq 'O -32032
+bq ^O -32032
+bq ~O -32032
+bq :O -32032
+bq OE -32032
+bq /O -32032
+bq C -32032
+bq G -32032
+bq 'C -32032
+bq u0043_030C -32032
+bq u0047_0306 -32032
+bq ,C -32032
+bq Q -32032
+lq oq 128128
+lq ` 128128
+lq lq 128128
+rq cq 128128
+rq ' 128128
+rq rq 128128
+Bq bq 128128
+Bq , 128128
+Bq Bq 128128
+Bq j 128128
+Bq .j 128128
+Bq g 64064
+Bq u0067_0306 64064
+Bq y 64064
+Bq :y 64064
+Bq 'y 64064
+Bq v -96096
+Bq w -64064
+Bq V -128128
+Bq W -96096
+Bq Y -96096
+Bq :Y -96096
+Bq 'Y -96096
+Bq O -32032
+Bq u004F_030B -32032
+Bq `O -32032
+Bq 'O -32032
+Bq ^O -32032
+Bq ~O -32032
+Bq :O -32032
+Bq OE -32032
+Bq /O -32032
+Bq C -32032
+Bq G -32032
+Bq 'C -32032
+Bq u0043_030C -32032
+Bq u0047_0306 -32032
+Bq ,C -32032
+Bq Q -32032
+Fc . -96096
+Fc , -96096
+ff cq 80080
+ff ' 80080
+ff oq 80080
+ff ` 80080
+ff lq 80080
+ff rq 80080
+ff ? 80080
+ff u01C3 80080
+ff ! 80080
+ff ) 80080
+ff rB 80080
+ff ] 80080
+cq rq 128128
+' rq 128128
+cq ? 128128
+' ? 128128
+cq u01C3 128128
+cq ! 128128
+' u01C3 128128
+' ! 128128
+A y -32032
+A :y -32032
+A 'y -32032
+A v -32032
+A w -32032
+A c -32032
+A 'c -32032
+A u0063_030C -32032
+A ,c -32032
+A d -32032
+A u0064_030C -32032
+A u0111 -32032
+A Sd -32032
+A e -32032
+A u0065_030C -32032
+A u0065_0328 -32032
+A `e -32032
+A 'e -32032
+A ^e -32032
+A :e -32032
+A o -32032
+A u006F_030B -32032
+A `o -32032
+A 'o -32032
+A ^o -32032
+A ~o -32032
+A :o -32032
+A oe -32032
+A /o -32032
+A q -32032
+A t -32032
+A u0074_030C -32032
+A u0074_0327 -32032
+A C -32032
+A G -32032
+A 'C -32032
+A u0043_030C -32032
+A u0047_0306 -32032
+A ,C -32032
+A Q -32032
+A O -32032
+A u004F_030B -32032
+A `O -32032
+A 'O -32032
+A ^O -32032
+A ~O -32032
+A :O -32032
+A OE -32032
+A /O -32032
+A U -32032
+A u0055_030B -32032
+A u0055_030A -32032
+A `U -32032
+A 'U -32032
+A ^U -32032
+A :U -32032
+A T -96096
+A u0054_030C -96096
+A u0054_0327 -96096
+A Y -96096
+A :Y -96096
+A 'Y -96096
+A V -128128
+A W -128128
+D X -32032
+D W -32032
+D A -32032
+D u0041_0306 -32032
+D u0041_0328 -32032
+D `A -32032
+D 'A -32032
+D ^A -32032
+D ~A -32032
+D :A -32032
+D oA -32032
+D AE -32032
+D V -32032
+D Y -32032
+D :Y -32032
+D 'Y -32032
+F o -32032
+F a -32032
+F e -32032
+F y -32032
+F u -32032
+F r -32032
+F v -32032
+F s -32032
+F c -32032
+F d -32032
+F g -32032
+F m -32032
+F n -32032
+F p -32032
+F w -32032
+F z -32032
+F ae -32032
+F /o -32032
+F A -96096
+F u0041_0306 -96096
+F u0041_0328 -96096
+F `A -96096
+F 'A -96096
+F ^A -96096
+F ~A -96096
+F :A -96096
+F oA -96096
+F AE -96096
+F O -32032
+F u004F_030B -32032
+F `O -32032
+F 'O -32032
+F ^O -32032
+F ~O -32032
+F :O -32032
+F OE -32032
+F /O -32032
+F C -32032
+F G -32032
+F 'C -32032
+F u0043_030C -32032
+F u0047_0306 -32032
+F ,C -32032
+F Q -32032
+I I 32032
+K v -32032
+K o -32032
+K u006F_030B -32032
+K `o -32032
+K 'o -32032
+K ^o -32032
+K ~o -32032
+K :o -32032
+K oe -32032
+K /o -32032
+K C -32032
+K G -32032
+K 'C -32032
+K u0043_030C -32032
+K u0047_0306 -32032
+K ,C -32032
+K Q -32032
+L T -96096
+L u0054_030C -96096
+L u0054_0327 -96096
+L Y -96096
+L :Y -96096
+L 'Y -96096
+L V -128128
+L W -128128
+O X -32032
+O W -32032
+O A -32032
+O u0041_0306 -32032
+O u0041_0328 -32032
+O `A -32032
+O 'A -32032
+O ^A -32032
+O ~A -32032
+O :A -32032
+O oA -32032
+O AE -32032
+O V -32032
+O Y -32032
+O :Y -32032
+O 'Y -32032
+P A -96096
+P u0041_0306 -96096
+P u0041_0328 -96096
+P `A -96096
+P 'A -96096
+P ^A -96096
+P ~A -96096
+P :A -96096
+P oA -96096
+P AE -96096
+P o -32032
+P u006F_030B -32032
+P `o -32032
+P 'o -32032
+P ^o -32032
+P ~o -32032
+P :o -32032
+P oe -32032
+P /o -32032
+P e -32032
+P u0065_030C -32032
+P u0065_0328 -32032
+P `e -32032
+P 'e -32032
+P ^e -32032
+P :e -32032
+P a -32032
+P u0061_0306 -32032
+P u0061_0328 -32032
+P `a -32032
+P 'a -32032
+P ^a -32032
+P ^a -32032
+P ~a -32032
+P :a -32032
+P oa -32032
+P ae -32032
+P . -96096
+P , -96096
+T y -96096
+T e -96096
+T o -96096
+T r -96096
+T a -96096
+T u -96096
+T n -96096
+T .i -96096
+T c -96096
+T d -96096
+T g -96096
+T p -96096
+T s -96096
+T v -96096
+T w -96096
+T x -96096
+T z -96096
+T A -96096
+T u0041_0306 -96096
+T u0041_0328 -96096
+T `A -96096
+T 'A -96096
+T ^A -96096
+T ~A -96096
+T :A -96096
+T oA -96096
+T AE -96096
+V o -32032
+V a -32032
+V e -32032
+V y -32032
+V u -32032
+V r -32032
+V v -32032
+V s -32032
+V c -32032
+V d -32032
+V g -32032
+V m -32032
+V n -32032
+V p -32032
+V w -32032
+V z -32032
+V ae -32032
+V /o -32032
+V A -96096
+V u0041_0306 -96096
+V u0041_0328 -96096
+V `A -96096
+V 'A -96096
+V ^A -96096
+V ~A -96096
+V :A -96096
+V oA -96096
+V AE -96096
+V O -32032
+V u004F_030B -32032
+V `O -32032
+V 'O -32032
+V ^O -32032
+V ~O -32032
+V :O -32032
+V OE -32032
+V /O -32032
+V C -32032
+V G -32032
+V 'C -32032
+V u0043_030C -32032
+V u0047_0306 -32032
+V ,C -32032
+V Q -32032
+W o -32032
+W a -32032
+W e -32032
+W y -32032
+W u -32032
+W r -32032
+W v -32032
+W s -32032
+W c -32032
+W d -32032
+W g -32032
+W m -32032
+W n -32032
+W p -32032
+W w -32032
+W z -32032
+W ae -32032
+W /o -32032
+W A -96096
+W u0041_0306 -96096
+W u0041_0328 -96096
+W `A -96096
+W 'A -96096
+W ^A -96096
+W ~A -96096
+W :A -96096
+W oA -96096
+W AE -96096
+W O -32032
+W u004F_030B -32032
+W `O -32032
+W 'O -32032
+W ^O -32032
+W ~O -32032
+W :O -32032
+W OE -32032
+W /O -32032
+W C -32032
+W G -32032
+W 'C -32032
+W u0043_030C -32032
+W u0047_0306 -32032
+W ,C -32032
+W Q -32032
+X O -32032
+X u004F_030B -32032
+X `O -32032
+X 'O -32032
+X ^O -32032
+X ~O -32032
+X :O -32032
+X OE -32032
+X /O -32032
+X C -32032
+X G -32032
+X 'C -32032
+X u0043_030C -32032
+X u0047_0306 -32032
+X ,C -32032
+X Q -32032
+Y e -96096
+Y o -96096
+Y r -96096
+Y a -96096
+Y u -96096
+Y n -96096
+Y .i -96096
+Y c -96096
+Y d -96096
+Y g -96096
+Y p -96096
+Y s -96096
+Y v -96096
+Y w -96096
+Y x -96096
+Y z -96096
+Y A -96096
+Y u0041_0306 -96096
+Y u0041_0328 -96096
+Y `A -96096
+Y 'A -96096
+Y ^A -96096
+Y ~A -96096
+Y :A -96096
+Y oA -96096
+Y AE -96096
+oq lq 128128
+` lq 128128
+oq ? 128128
+` ? 128128
+oq u01C3 128128
+oq ! 128128
+` u01C3 128128
+` ! 128128
+a r -32032
+a y -32032
+a :y -32032
+a 'y -32032
+a w -32032
+b e 32032
+b u0065_030C 32032
+b u0065_0328 32032
+b `e 32032
+b 'e 32032
+b ^e 32032
+b :e 32032
+b o 32032
+b u006F_030B 32032
+b `o 32032
+b 'o 32032
+b ^o 32032
+b ~o 32032
+b :o 32032
+b oe 32032
+b /o 32032
+b x -32032
+b d 32032
+b c 32032
+b 'c 32032
+b u0063_030C 32032
+b ,c 32032
+b q 32032
+b r -32032
+b y -32032
+b :y -32032
+b 'y -32032
+b w -32032
+e V -96096
+f cq 80080
+f ' 80080
+f oq 80080
+f ` 80080
+f lq 80080
+f rq 80080
+f ? 80080
+f u01C3 80080
+f ! 80080
+f ) 80080
+f rB 80080
+f ] 80080
+g j 32032
+k W -96096
+k V -96096
+k e -32032
+k u0065_030C -32032
+k u0065_0328 -32032
+k `e -32032
+k 'e -32032
+k ^e -32032
+k :e -32032
+k a -32032
+k u0061_0306 -32032
+k u0061_0328 -32032
+k `a -32032
+k 'a -32032
+k ^a -32032
+k ^a -32032
+k ~a -32032
+k :a -32032
+k oa -32032
+k ae -32032
+k o -32032
+k u006F_030B -32032
+k `o -32032
+k 'o -32032
+k ^o -32032
+k ~o -32032
+k :o -32032
+k oe -32032
+k /o -32032
+k c -32032
+k 'c -32032
+k u0063_030C -32032
+k ,c -32032
+o e 32032
+o u0065_030C 32032
+o u0065_0328 32032
+o `e 32032
+o 'e 32032
+o ^e 32032
+o :e 32032
+o o 32032
+o u006F_030B 32032
+o `o 32032
+o 'o 32032
+o ^o 32032
+o ~o 32032
+o :o 32032
+o oe 32032
+o /o 32032
+o x -32032
+o d 32032
+o c 32032
+o 'c 32032
+o u0063_030C 32032
+o ,c 32032
+o q 32032
+o r -32032
+o y -32032
+o :y -32032
+o 'y -32032
+o w -32032
+p e 32032
+p u0065_030C 32032
+p u0065_0328 32032
+p `e 32032
+p 'e 32032
+p ^e 32032
+p :e 32032
+p o 32032
+p u006F_030B 32032
+p `o 32032
+p 'o 32032
+p ^o 32032
+p ~o 32032
+p :o 32032
+p oe 32032
+p /o 32032
+p x -32032
+p d 32032
+p c 32032
+p 'c 32032
+p u0063_030C 32032
+p ,c 32032
+p q 32032
+p r -32032
+p y -32032
+p :y -32032
+p 'y -32032
+p w -32032
+t y -32032
+t :y -32032
+t 'y -32032
+t w -32032
+u w -32032
+w e -32032
+w u0065_030C -32032
+w u0065_0328 -32032
+w `e -32032
+w 'e -32032
+w ^e -32032
+w :e -32032
+w a -32032
+w u0061_0306 -32032
+w u0061_0328 -32032
+w `a -32032
+w 'a -32032
+w ^a -32032
+w ^a -32032
+w ~a -32032
+w :a -32032
+w oa -32032
+w ae -32032
+w o -32032
+w u006F_030B -32032
+w `o -32032
+w 'o -32032
+w ^o -32032
+w ~o -32032
+w :o -32032
+w oe -32032
+w /o -32032
+w c -32032
+w 'c -32032
+w u0063_030C -32032
+w ,c -32032
+y o -32032
+y u006F_030B -32032
+y `o -32032
+y 'o -32032
+y ^o -32032
+y ~o -32032
+y :o -32032
+y oe -32032
+y /o -32032
+y e -32032
+y u0065_030C -32032
+y u0065_0328 -32032
+y `e -32032
+y 'e -32032
+y ^e -32032
+y :e -32032
+y a -32032
+y u0061_0306 -32032
+y u0061_0328 -32032
+y `a -32032
+y 'a -32032
+y ^a -32032
+y ^a -32032
+y ~a -32032
+y :a -32032
+y oa -32032
+y ae -32032
+y . -96096
+y , -96096
+u0041_0306 y -32032
+u0041_0306 :y -32032
+u0041_0306 'y -32032
+u0041_0306 v -32032
+u0041_0306 w -32032
+u0041_0306 c -32032
+u0041_0306 'c -32032
+u0041_0306 u0063_030C -32032
+u0041_0306 ,c -32032
+u0041_0306 d -32032
+u0041_0306 u0064_030C -32032
+u0041_0306 u0111 -32032
+u0041_0306 Sd -32032
+u0041_0306 e -32032
+u0041_0306 u0065_030C -32032
+u0041_0306 u0065_0328 -32032
+u0041_0306 `e -32032
+u0041_0306 'e -32032
+u0041_0306 ^e -32032
+u0041_0306 :e -32032
+u0041_0306 o -32032
+u0041_0306 u006F_030B -32032
+u0041_0306 `o -32032
+u0041_0306 'o -32032
+u0041_0306 ^o -32032
+u0041_0306 ~o -32032
+u0041_0306 :o -32032
+u0041_0306 oe -32032
+u0041_0306 /o -32032
+u0041_0306 q -32032
+u0041_0306 t -32032
+u0041_0306 u0074_030C -32032
+u0041_0306 u0074_0327 -32032
+u0041_0306 C -32032
+u0041_0306 G -32032
+u0041_0306 'C -32032
+u0041_0306 u0043_030C -32032
+u0041_0306 u0047_0306 -32032
+u0041_0306 ,C -32032
+u0041_0306 Q -32032
+u0041_0306 O -32032
+u0041_0306 u004F_030B -32032
+u0041_0306 `O -32032
+u0041_0306 'O -32032
+u0041_0306 ^O -32032
+u0041_0306 ~O -32032
+u0041_0306 :O -32032
+u0041_0306 OE -32032
+u0041_0306 /O -32032
+u0041_0306 U -32032
+u0041_0306 u0055_030B -32032
+u0041_0306 u0055_030A -32032
+u0041_0306 `U -32032
+u0041_0306 'U -32032
+u0041_0306 ^U -32032
+u0041_0306 :U -32032
+u0041_0306 T -96096
+u0041_0306 u0054_030C -96096
+u0041_0306 u0054_0327 -96096
+u0041_0306 Y -96096
+u0041_0306 :Y -96096
+u0041_0306 'Y -96096
+u0041_0306 V -128128
+u0041_0306 W -128128
+'C v -32032
+'C w -32032
+'C c -32032
+'C 'c -32032
+'C u0063_030C -32032
+'C ,c -32032
+'C d -32032
+'C u0064_030C -32032
+'C u0111 -32032
+'C Sd -32032
+'C e -32032
+'C u0065_030C -32032
+'C u0065_0328 -32032
+'C `e -32032
+'C 'e -32032
+'C ^e -32032
+'C :e -32032
+'C o -32032
+'C u006F_030B -32032
+'C `o -32032
+'C 'o -32032
+'C ^o -32032
+'C ~o -32032
+'C :o -32032
+'C oe -32032
+'C /o -32032
+'C q -32032
+'C t -32032
+'C u0074_030C -32032
+'C u0074_0327 -32032
+'C C -32032
+'C G -32032
+'C 'C -32032
+'C u0043_030C -32032
+'C u0047_0306 -32032
+'C ,C -32032
+'C Q -32032
+'C O -32032
+'C u004F_030B -32032
+'C `O -32032
+'C 'O -32032
+'C ^O -32032
+'C ~O -32032
+'C :O -32032
+'C OE -32032
+'C /O -32032
+'C U -32032
+'C u0055_030B -32032
+'C u0055_030A -32032
+'C `U -32032
+'C 'U -32032
+'C ^U -32032
+'C :U -32032
+'C T -96096
+'C u0054_030C -96096
+'C u0054_0327 -96096
+'C Y -96096
+'C :Y -96096
+'C 'Y -96096
+'C V -128128
+'C W -128128
+u0044_030C X -32032
+u0044_030C W -32032
+u0044_030C A -32032
+u0044_030C u0041_0306 -32032
+u0044_030C u0041_0328 -32032
+u0044_030C `A -32032
+u0044_030C 'A -32032
+u0044_030C ^A -32032
+u0044_030C ~A -32032
+u0044_030C :A -32032
+u0044_030C oA -32032
+u0044_030C AE -32032
+u0044_030C V -32032
+u0044_030C Y -32032
+u0044_030C :Y -32032
+u0044_030C 'Y -32032
+u004C_0301 T -96096
+u004C_0301 u0054_030C -96096
+u004C_0301 u0054_0327 -96096
+u004C_0301 Y -96096
+u004C_0301 :Y -96096
+u004C_0301 'Y -96096
+u004C_0301 V -128128
+u004C_0301 W -128128
+u004C_030C T -96096
+u004C_030C u0054_030C -96096
+u004C_030C u0054_0327 -96096
+u004C_030C Y -96096
+u004C_030C :Y -96096
+u004C_030C 'Y -96096
+u004C_030C V -128128
+u004C_030C W -128128
+/L T -96096
+/L u0054_030C -96096
+/L u0054_0327 -96096
+/L Y -96096
+/L :Y -96096
+/L 'Y -96096
+/L V -128128
+/L W -128128
+u004F_030B X -32032
+u004F_030B W -32032
+u004F_030B A -32032
+u004F_030B u0041_0306 -32032
+u004F_030B u0041_0328 -32032
+u004F_030B `A -32032
+u004F_030B 'A -32032
+u004F_030B ^A -32032
+u004F_030B ~A -32032
+u004F_030B :A -32032
+u004F_030B oA -32032
+u004F_030B AE -32032
+u004F_030B V -32032
+u004F_030B Y -32032
+u004F_030B :Y -32032
+u004F_030B 'Y -32032
+u0054_030C y -96096
+u0054_030C e -96096
+u0054_030C o -96096
+u0054_030C r -96096
+u0054_030C a -96096
+u0054_030C u -96096
+u0054_030C n -96096
+u0054_030C .i -96096
+u0054_030C c -96096
+u0054_030C d -96096
+u0054_030C g -96096
+u0054_030C p -96096
+u0054_030C s -96096
+u0054_030C v -96096
+u0054_030C w -96096
+u0054_030C x -96096
+u0054_030C z -96096
+u0054_030C A -96096
+u0054_030C u0041_0306 -96096
+u0054_030C u0041_0328 -96096
+u0054_030C `A -96096
+u0054_030C 'A -96096
+u0054_030C ^A -96096
+u0054_030C ~A -96096
+u0054_030C :A -96096
+u0054_030C oA -96096
+u0054_030C AE -96096
+u0054_0327 y -96096
+u0054_0327 e -96096
+u0054_0327 o -96096
+u0054_0327 r -96096
+u0054_0327 a -96096
+u0054_0327 u -96096
+u0054_0327 n -96096
+u0054_0327 .i -96096
+u0054_0327 c -96096
+u0054_0327 d -96096
+u0054_0327 g -96096
+u0054_0327 p -96096
+u0054_0327 s -96096
+u0054_0327 v -96096
+u0054_0327 w -96096
+u0054_0327 x -96096
+u0054_0327 z -96096
+u0054_0327 A -96096
+u0054_0327 u0041_0306 -96096
+u0054_0327 u0041_0328 -96096
+u0054_0327 `A -96096
+u0054_0327 'A -96096
+u0054_0327 ^A -96096
+u0054_0327 ~A -96096
+u0054_0327 :A -96096
+u0054_0327 oA -96096
+u0054_0327 AE -96096
+:Y e -96096
+:Y o -96096
+:Y r -96096
+:Y a -96096
+:Y u -96096
+:Y n -96096
+:Y .i -96096
+:Y c -96096
+:Y d -96096
+:Y g -96096
+:Y p -96096
+:Y s -96096
+:Y v -96096
+:Y w -96096
+:Y x -96096
+:Y z -96096
+:Y A -96096
+:Y u0041_0306 -96096
+:Y u0041_0328 -96096
+:Y `A -96096
+:Y 'A -96096
+:Y ^A -96096
+:Y ~A -96096
+:Y :A -96096
+:Y oA -96096
+:Y AE -96096
+u0061_0306 r -32032
+u0061_0306 y -32032
+u0061_0306 :y -32032
+u0061_0306 'y -32032
+u0061_0306 w -32032
+u0061_0328 w -32032
+/l cq 32032
+/l ' 32032
+/l a -32032
+/l u0061_0328 -32032
+/l c -32032
+/l 'c -32032
+/l d -32032
+/l e -32032
+/l u0065_0328 -32032
+/l g -32032
+/l o -32032
+/l 'o -32032
+/l s -32032
+/l u0073_0301 -32032
+u006F_030B e 32032
+u006F_030B u0065_030C 32032
+u006F_030B u0065_0328 32032
+u006F_030B `e 32032
+u006F_030B 'e 32032
+u006F_030B ^e 32032
+u006F_030B :e 32032
+u006F_030B o 32032
+u006F_030B u006F_030B 32032
+u006F_030B `o 32032
+u006F_030B 'o 32032
+u006F_030B ^o 32032
+u006F_030B ~o 32032
+u006F_030B :o 32032
+u006F_030B oe 32032
+u006F_030B /o 32032
+u006F_030B x -32032
+u006F_030B d 32032
+u006F_030B c 32032
+u006F_030B 'c 32032
+u006F_030B u0063_030C 32032
+u006F_030B ,c 32032
+u006F_030B q 32032
+u006F_030B r -32032
+u006F_030B y -32032
+u006F_030B :y -32032
+u006F_030B 'y -32032
+u006F_030B w -32032
+u0074_030C y -32032
+u0074_030C :y -32032
+u0074_030C 'y -32032
+u0074_030C w -32032
+u0074_0327 y -32032
+u0074_0327 :y -32032
+u0074_0327 'y -32032
+u0074_0327 w -32032
+u0075_030B w -32032
+u0075_030A w -32032
+:y o -32032
+:y u006F_030B -32032
+:y `o -32032
+:y 'o -32032
+:y ^o -32032
+:y ~o -32032
+:y :o -32032
+:y oe -32032
+:y /o -32032
+:y e -32032
+:y u0065_030C -32032
+:y u0065_0328 -32032
+:y `e -32032
+:y 'e -32032
+:y ^e -32032
+:y :e -32032
+:y a -32032
+:y u0061_0306 -32032
+:y u0061_0328 -32032
+:y `a -32032
+:y 'a -32032
+:y ^a -32032
+:y ^a -32032
+:y ~a -32032
+:y :a -32032
+:y oa -32032
+:y ae -32032
+:y . -96096
+:y , -96096
+`A y -32032
+`A :y -32032
+`A 'y -32032
+`A v -32032
+`A w -32032
+`A c -32032
+`A 'c -32032
+`A u0063_030C -32032
+`A ,c -32032
+`A d -32032
+`A u0064_030C -32032
+`A u0111 -32032
+`A Sd -32032
+`A e -32032
+`A u0065_030C -32032
+`A u0065_0328 -32032
+`A `e -32032
+`A 'e -32032
+`A ^e -32032
+`A :e -32032
+`A o -32032
+`A u006F_030B -32032
+`A `o -32032
+`A 'o -32032
+`A ^o -32032
+`A ~o -32032
+`A :o -32032
+`A oe -32032
+`A /o -32032
+`A q -32032
+`A t -32032
+`A u0074_030C -32032
+`A u0074_0327 -32032
+`A C -32032
+`A G -32032
+`A 'C -32032
+`A u0043_030C -32032
+`A u0047_0306 -32032
+`A ,C -32032
+`A Q -32032
+`A O -32032
+`A u004F_030B -32032
+`A `O -32032
+`A 'O -32032
+`A ^O -32032
+`A ~O -32032
+`A :O -32032
+`A OE -32032
+`A /O -32032
+`A U -32032
+`A u0055_030B -32032
+`A u0055_030A -32032
+`A `U -32032
+`A 'U -32032
+`A ^U -32032
+`A :U -32032
+`A T -96096
+`A u0054_030C -96096
+`A u0054_0327 -96096
+`A Y -96096
+`A :Y -96096
+`A 'Y -96096
+`A V -128128
+`A W -128128
+'A y -32032
+'A :y -32032
+'A 'y -32032
+'A v -32032
+'A w -32032
+'A c -32032
+'A 'c -32032
+'A u0063_030C -32032
+'A ,c -32032
+'A d -32032
+'A u0064_030C -32032
+'A u0111 -32032
+'A Sd -32032
+'A e -32032
+'A u0065_030C -32032
+'A u0065_0328 -32032
+'A `e -32032
+'A 'e -32032
+'A ^e -32032
+'A :e -32032
+'A o -32032
+'A u006F_030B -32032
+'A `o -32032
+'A 'o -32032
+'A ^o -32032
+'A ~o -32032
+'A :o -32032
+'A oe -32032
+'A /o -32032
+'A q -32032
+'A t -32032
+'A u0074_030C -32032
+'A u0074_0327 -32032
+'A C -32032
+'A G -32032
+'A 'C -32032
+'A u0043_030C -32032
+'A u0047_0306 -32032
+'A ,C -32032
+'A Q -32032
+'A O -32032
+'A u004F_030B -32032
+'A `O -32032
+'A 'O -32032
+'A ^O -32032
+'A ~O -32032
+'A :O -32032
+'A OE -32032
+'A /O -32032
+'A U -32032
+'A u0055_030B -32032
+'A u0055_030A -32032
+'A `U -32032
+'A 'U -32032
+'A ^U -32032
+'A :U -32032
+'A T -96096
+'A u0054_030C -96096
+'A u0054_0327 -96096
+'A Y -96096
+'A :Y -96096
+'A 'Y -96096
+'A V -128128
+'A W -128128
+^A y -32032
+^A :y -32032
+^A 'y -32032
+^A v -32032
+^A w -32032
+^A c -32032
+^A 'c -32032
+^A u0063_030C -32032
+^A ,c -32032
+^A d -32032
+^A u0064_030C -32032
+^A u0111 -32032
+^A Sd -32032
+^A e -32032
+^A u0065_030C -32032
+^A u0065_0328 -32032
+^A `e -32032
+^A 'e -32032
+^A ^e -32032
+^A :e -32032
+^A o -32032
+^A u006F_030B -32032
+^A `o -32032
+^A 'o -32032
+^A ^o -32032
+^A ~o -32032
+^A :o -32032
+^A oe -32032
+^A /o -32032
+^A q -32032
+^A t -32032
+^A u0074_030C -32032
+^A u0074_0327 -32032
+^A C -32032
+^A G -32032
+^A 'C -32032
+^A u0043_030C -32032
+^A u0047_0306 -32032
+^A ,C -32032
+^A Q -32032
+^A O -32032
+^A u004F_030B -32032
+^A `O -32032
+^A 'O -32032
+^A ^O -32032
+^A ~O -32032
+^A :O -32032
+^A OE -32032
+^A /O -32032
+^A U -32032
+^A u0055_030B -32032
+^A u0055_030A -32032
+^A `U -32032
+^A 'U -32032
+^A ^U -32032
+^A :U -32032
+^A T -96096
+^A u0054_030C -96096
+^A u0054_0327 -96096
+^A Y -96096
+^A :Y -96096
+^A 'Y -96096
+^A V -128128
+^A W -128128
+~A y -32032
+~A :y -32032
+~A 'y -32032
+~A v -32032
+~A w -32032
+~A c -32032
+~A 'c -32032
+~A u0063_030C -32032
+~A ,c -32032
+~A d -32032
+~A u0064_030C -32032
+~A u0111 -32032
+~A Sd -32032
+~A e -32032
+~A u0065_030C -32032
+~A u0065_0328 -32032
+~A `e -32032
+~A 'e -32032
+~A ^e -32032
+~A :e -32032
+~A o -32032
+~A u006F_030B -32032
+~A `o -32032
+~A 'o -32032
+~A ^o -32032
+~A ~o -32032
+~A :o -32032
+~A oe -32032
+~A /o -32032
+~A q -32032
+~A t -32032
+~A u0074_030C -32032
+~A u0074_0327 -32032
+~A C -32032
+~A G -32032
+~A 'C -32032
+~A u0043_030C -32032
+~A u0047_0306 -32032
+~A ,C -32032
+~A Q -32032
+~A O -32032
+~A u004F_030B -32032
+~A `O -32032
+~A 'O -32032
+~A ^O -32032
+~A ~O -32032
+~A :O -32032
+~A OE -32032
+~A /O -32032
+~A U -32032
+~A u0055_030B -32032
+~A u0055_030A -32032
+~A `U -32032
+~A 'U -32032
+~A ^U -32032
+~A :U -32032
+~A T -96096
+~A u0054_030C -96096
+~A u0054_0327 -96096
+~A Y -96096
+~A :Y -96096
+~A 'Y -96096
+~A V -128128
+~A W -128128
+:A y -32032
+:A :y -32032
+:A 'y -32032
+:A v -32032
+:A w -32032
+:A c -32032
+:A 'c -32032
+:A u0063_030C -32032
+:A ,c -32032
+:A d -32032
+:A u0064_030C -32032
+:A u0111 -32032
+:A Sd -32032
+:A e -32032
+:A u0065_030C -32032
+:A u0065_0328 -32032
+:A `e -32032
+:A 'e -32032
+:A ^e -32032
+:A :e -32032
+:A o -32032
+:A u006F_030B -32032
+:A `o -32032
+:A 'o -32032
+:A ^o -32032
+:A ~o -32032
+:A :o -32032
+:A oe -32032
+:A /o -32032
+:A q -32032
+:A t -32032
+:A u0074_030C -32032
+:A u0074_0327 -32032
+:A C -32032
+:A G -32032
+:A 'C -32032
+:A u0043_030C -32032
+:A u0047_0306 -32032
+:A ,C -32032
+:A Q -32032
+:A O -32032
+:A u004F_030B -32032
+:A `O -32032
+:A 'O -32032
+:A ^O -32032
+:A ~O -32032
+:A :O -32032
+:A OE -32032
+:A /O -32032
+:A U -32032
+:A u0055_030B -32032
+:A u0055_030A -32032
+:A `U -32032
+:A 'U -32032
+:A ^U -32032
+:A :U -32032
+:A T -96096
+:A u0054_030C -96096
+:A u0054_0327 -96096
+:A Y -96096
+:A :Y -96096
+:A 'Y -96096
+:A V -128128
+:A W -128128
+oA y -32032
+oA :y -32032
+oA 'y -32032
+oA v -32032
+oA w -32032
+oA c -32032
+oA 'c -32032
+oA u0063_030C -32032
+oA ,c -32032
+oA d -32032
+oA u0064_030C -32032
+oA u0111 -32032
+oA Sd -32032
+oA e -32032
+oA u0065_030C -32032
+oA u0065_0328 -32032
+oA `e -32032
+oA 'e -32032
+oA ^e -32032
+oA :e -32032
+oA o -32032
+oA u006F_030B -32032
+oA `o -32032
+oA 'o -32032
+oA ^o -32032
+oA ~o -32032
+oA :o -32032
+oA oe -32032
+oA /o -32032
+oA q -32032
+oA t -32032
+oA u0074_030C -32032
+oA u0074_0327 -32032
+oA C -32032
+oA G -32032
+oA 'C -32032
+oA u0043_030C -32032
+oA u0047_0306 -32032
+oA ,C -32032
+oA Q -32032
+oA O -32032
+oA u004F_030B -32032
+oA `O -32032
+oA 'O -32032
+oA ^O -32032
+oA ~O -32032
+oA :O -32032
+oA OE -32032
+oA /O -32032
+oA U -32032
+oA u0055_030B -32032
+oA u0055_030A -32032
+oA `U -32032
+oA 'U -32032
+oA ^U -32032
+oA :U -32032
+oA T -96096
+oA u0054_030C -96096
+oA u0054_0327 -96096
+oA Y -96096
+oA :Y -96096
+oA 'Y -96096
+oA V -128128
+oA W -128128
+u0189 X -32032
+u0110 X -32032
+-D X -32032
+u0189 W -32032
+u0110 W -32032
+-D W -32032
+u0189 A -32032
+u0110 A -32032
+-D A -32032
+u0189 u0041_0306 -32032
+u0110 u0041_0306 -32032
+-D u0041_0306 -32032
+u0189 u0041_0328 -32032
+u0110 u0041_0328 -32032
+-D u0041_0328 -32032
+u0189 `A -32032
+u0110 `A -32032
+-D `A -32032
+u0189 'A -32032
+u0110 'A -32032
+-D 'A -32032
+u0189 ^A -32032
+u0110 ^A -32032
+-D ^A -32032
+u0189 ~A -32032
+u0110 ~A -32032
+-D ~A -32032
+u0189 :A -32032
+u0110 :A -32032
+-D :A -32032
+u0189 oA -32032
+u0110 oA -32032
+-D oA -32032
+u0189 AE -32032
+u0110 AE -32032
+-D AE -32032
+u0189 V -32032
+u0110 V -32032
+-D V -32032
+u0189 Y -32032
+u0110 Y -32032
+-D Y -32032
+u0189 :Y -32032
+u0110 :Y -32032
+-D :Y -32032
+u0189 'Y -32032
+u0110 'Y -32032
+-D 'Y -32032
+`O X -32032
+`O W -32032
+`O A -32032
+`O u0041_0306 -32032
+`O u0041_0328 -32032
+`O `A -32032
+`O 'A -32032
+`O ^A -32032
+`O ~A -32032
+`O :A -32032
+`O oA -32032
+`O AE -32032
+`O V -32032
+`O Y -32032
+`O :Y -32032
+`O 'Y -32032
+'O X -32032
+'O W -32032
+'O A -32032
+'O u0041_0306 -32032
+'O u0041_0328 -32032
+'O `A -32032
+'O 'A -32032
+'O ^A -32032
+'O ~A -32032
+'O :A -32032
+'O oA -32032
+'O AE -32032
+'O V -32032
+'O Y -32032
+'O :Y -32032
+'O 'Y -32032
+^O X -32032
+^O W -32032
+^O A -32032
+^O u0041_0306 -32032
+^O u0041_0328 -32032
+^O `A -32032
+^O 'A -32032
+^O ^A -32032
+^O ~A -32032
+^O :A -32032
+^O oA -32032
+^O AE -32032
+^O V -32032
+^O Y -32032
+^O :Y -32032
+^O 'Y -32032
+~O X -32032
+~O W -32032
+~O A -32032
+~O u0041_0306 -32032
+~O u0041_0328 -32032
+~O `A -32032
+~O 'A -32032
+~O ^A -32032
+~O ~A -32032
+~O :A -32032
+~O oA -32032
+~O AE -32032
+~O V -32032
+~O Y -32032
+~O :Y -32032
+~O 'Y -32032
+:O X -32032
+:O W -32032
+:O A -32032
+:O u0041_0306 -32032
+:O u0041_0328 -32032
+:O `A -32032
+:O 'A -32032
+:O ^A -32032
+:O ~A -32032
+:O :A -32032
+:O oA -32032
+:O AE -32032
+:O V -32032
+:O Y -32032
+:O :Y -32032
+:O 'Y -32032
+/O X -32032
+/O W -32032
+/O A -32032
+/O u0041_0306 -32032
+/O u0041_0328 -32032
+/O `A -32032
+/O 'A -32032
+/O ^A -32032
+/O ~A -32032
+/O :A -32032
+/O oA -32032
+/O AE -32032
+/O V -32032
+/O Y -32032
+/O :Y -32032
+/O 'Y -32032
+'Y e -96096
+'Y o -96096
+'Y r -96096
+'Y a -96096
+'Y u -96096
+'Y n -96096
+'Y .i -96096
+'Y c -96096
+'Y d -96096
+'Y g -96096
+'Y p -96096
+'Y s -96096
+'Y v -96096
+'Y w -96096
+'Y x -96096
+'Y z -96096
+'Y A -96096
+'Y u0041_0306 -96096
+'Y u0041_0328 -96096
+'Y `A -96096
+'Y 'A -96096
+'Y ^A -96096
+'Y ~A -96096
+'Y :A -96096
+'Y oA -96096
+'Y AE -96096
+`a r -32032
+`a y -32032
+`a :y -32032
+`a 'y -32032
+`a w -32032
+'a r -32032
+'a y -32032
+'a :y -32032
+'a 'y -32032
+'a w -32032
+^a r -32032
+^a y -32032
+^a :y -32032
+^a 'y -32032
+^a w -32032
+~a r -32032
+~a y -32032
+~a :y -32032
+~a 'y -32032
+~a w -32032
+:a r -32032
+:a y -32032
+:a :y -32032
+:a 'y -32032
+:a w -32032
+oa r -32032
+oa y -32032
+oa :y -32032
+oa 'y -32032
+oa w -32032
+`o e 32032
+`o u0065_030C 32032
+`o u0065_0328 32032
+`o `e 32032
+`o 'e 32032
+`o ^e 32032
+`o :e 32032
+`o o 32032
+`o u006F_030B 32032
+`o `o 32032
+`o 'o 32032
+`o ^o 32032
+`o ~o 32032
+`o :o 32032
+`o oe 32032
+`o /o 32032
+`o x -32032
+`o d 32032
+`o c 32032
+`o 'c 32032
+`o u0063_030C 32032
+`o ,c 32032
+`o q 32032
+`o r -32032
+`o y -32032
+`o :y -32032
+`o 'y -32032
+`o w -32032
+'o e 32032
+'o u0065_030C 32032
+'o u0065_0328 32032
+'o `e 32032
+'o 'e 32032
+'o ^e 32032
+'o :e 32032
+'o o 32032
+'o u006F_030B 32032
+'o `o 32032
+'o 'o 32032
+'o ^o 32032
+'o ~o 32032
+'o :o 32032
+'o oe 32032
+'o /o 32032
+'o x -32032
+'o d 32032
+'o c 32032
+'o 'c 32032
+'o u0063_030C 32032
+'o ,c 32032
+'o q 32032
+'o r -32032
+'o y -32032
+'o :y -32032
+'o 'y -32032
+'o w -32032
+^o e 32032
+^o u0065_030C 32032
+^o u0065_0328 32032
+^o `e 32032
+^o 'e 32032
+^o ^e 32032
+^o :e 32032
+^o o 32032
+^o u006F_030B 32032
+^o `o 32032
+^o 'o 32032
+^o ^o 32032
+^o ~o 32032
+^o :o 32032
+^o oe 32032
+^o /o 32032
+^o x -32032
+^o d 32032
+^o c 32032
+^o 'c 32032
+^o u0063_030C 32032
+^o ,c 32032
+^o q 32032
+^o r -32032
+^o y -32032
+^o :y -32032
+^o 'y -32032
+^o w -32032
+~o e 32032
+~o u0065_030C 32032
+~o u0065_0328 32032
+~o `e 32032
+~o 'e 32032
+~o ^e 32032
+~o :e 32032
+~o o 32032
+~o u006F_030B 32032
+~o `o 32032
+~o 'o 32032
+~o ^o 32032
+~o ~o 32032
+~o :o 32032
+~o oe 32032
+~o /o 32032
+~o x -32032
+~o d 32032
+~o c 32032
+~o 'c 32032
+~o u0063_030C 32032
+~o ,c 32032
+~o q 32032
+~o r -32032
+~o y -32032
+~o :y -32032
+~o 'y -32032
+~o w -32032
+:o e 32032
+:o u0065_030C 32032
+:o u0065_0328 32032
+:o `e 32032
+:o 'e 32032
+:o ^e 32032
+:o :e 32032
+:o o 32032
+:o u006F_030B 32032
+:o `o 32032
+:o 'o 32032
+:o ^o 32032
+:o ~o 32032
+:o :o 32032
+:o oe 32032
+:o /o 32032
+:o x -32032
+:o d 32032
+:o c 32032
+:o 'c 32032
+:o u0063_030C 32032
+:o ,c 32032
+:o q 32032
+:o r -32032
+:o y -32032
+:o :y -32032
+:o 'y -32032
+:o w -32032
+/o e 32032
+/o u0065_030C 32032
+/o u0065_0328 32032
+/o `e 32032
+/o 'e 32032
+/o ^e 32032
+/o :e 32032
+/o o 32032
+/o u006F_030B 32032
+/o `o 32032
+/o 'o 32032
+/o ^o 32032
+/o ~o 32032
+/o :o 32032
+/o oe 32032
+/o /o 32032
+/o x -32032
+/o d 32032
+/o c 32032
+/o 'c 32032
+/o u0063_030C 32032
+/o ,c 32032
+/o q 32032
+/o r -32032
+/o y -32032
+/o :y -32032
+/o 'y -32032
+/o w -32032
+`u w -32032
+'u w -32032
+^u w -32032
+:u w -32032
+'y o -32032
+'y u006F_030B -32032
+'y `o -32032
+'y 'o -32032
+'y ^o -32032
+'y ~o -32032
+'y :o -32032
+'y oe -32032
+'y /o -32032
+'y e -32032
+'y u0065_030C -32032
+'y u0065_0328 -32032
+'y `e -32032
+'y 'e -32032
+'y ^e -32032
+'y :e -32032
+'y a -32032
+'y u0061_0306 -32032
+'y u0061_0328 -32032
+'y `a -32032
+'y 'a -32032
+'y ^a -32032
+'y ^a -32032
+'y ~a -32032
+'y :a -32032
+'y oa -32032
+'y ae -32032
+'y . -96096
+'y , -96096
+charset
+ga 576576,698880 2 0000
+aa 576576,698880,0,84486 2 0001
+a^ 576576,698880 2 0002
+a~ 576576,698880,0,84486 2 0003
+ad 576576,728000,0,84851 2 0004
+a" 576576,698880,0,84486 2 0005
+ao 830664,698880 2 0006
+ah 576576,698880 2 0007
+ab 576576,698880,0,90310 2 0010
+a- 576576,728000,0,106691 2 0011
+a. 320320,755976,0,107058 2 0012
+ac 512512,0,178360 1 0013
+ho 320320,0,203840 1 0014
+bq 320320,136864,110656 1 0015
+fo 512512,524160,0,47349 2 0016
+fc 512512,524160,0,47349 2 0017
+lq 393120,755976,0,154523 2 0020
+rq 393120,755976,0,35090 2 0021
+Bq 393120,136864,110656,35090 1 0022
+Fo 768768,524160,0,27709 2 0023
+Fc 768768,524160,0,9419 2 0024
+en 576576,480480,0,95150 0 0025
+em 1153152,480480,0,95150 0 0026
+--- 0,480480 0 0027
+--- 512512,782600,29120,32339 3 0030
+.i 267904,480480,0,71520 0 0031
+.j 299936,480480,203840,71520 1 0032
+ff 672672,755976,0,241010 2 0033
+fi 614432,755976,0,127442 2 0034
+fl 614432,755976,0,130354 2 0035
+Fi 934752,755976,0,127442 2 0036
+Fl 934752,755976,0,130354 2 0037
+u2423 576576,480480,101920,39690 1 0040
+u01C3 384384,755976,0,69202 2 0041
+! "
+dq 576576,755976,0,72114 2 0042
+" "
+sh 960960,755976,232960,58491 3 0043
+# "
+Do 576576,782600,29120,122707 3 0044
+$ "
+% 1078840,782600,29120,32339 3 0045
+& 870688,755976,0,32240 2 0046
+cq 320320,755976,0,101234 2 0047
+' "
+( 448448,782600,262080,135086 3 0050
+) 448448,782600,262080,23674 3 0051
+* 576576,782600,0,119070 2 0052
++ 896896,646464,122304,23674 3 0053
+, 320320,136864,110656 1 0054
+- 384384,480480,0,19032 0 0055
+. 320320,136864 0 0056
+sl 576576,782600,262080,135086 3 0057
+/ "
+0 576576,728000,0,122707 2 0060
+1 576576,728000,0,122707 2 0061
+2 576576,728000,0,122707 2 0062
+3 576576,728000,0,122707 2 0063
+4 576576,728000,0,122707 2 0064
+5 576576,728000,0,122707 2 0065
+6 576576,728000,0,122707 2 0066
+7 576576,728000,0,122707 2 0067
+8 576576,728000,0,122707 2 0070
+9 576576,728000,0,122707 2 0071
+: 320320,480480,0,42432 0 0072
+; 320320,480480,110656,42432 1 0073
+< 896896,636091,111931,71141 3 0074
+= 896896,425880,-98280,58491 0 0075
+> 896896,636091,111931 3 0076
+? 544544,755976,0,128744 2 0077
+at 768768,755976,0,80618 2 0100
+@ "
+A 768768,728000 2 0101
+B 768768,728000,0,84022,0,42011 2 0102
+C 736736,728000,0,122707,-78454,61354 2 0103
+D 832832,728000,0,76286,0,44254 2 0104
+E 672672,728000,0,122707,0,61354 2 0105
+F 640640,728000,0,138723,0,-21437 2 0106
+G 768768,728000,0,122707,-78454,61354 2 0107
+H 832832,728000,0,90675,0,45338 2 0110
+I 340704,728000,0,138723,0,69362 2 0111
+J 544544,728000,0,90675,0,13306 2 0112
+K 800800,728000,0,122707,0,61354 2 0113
+L 608608,728000,0,0,0,64064 2 0114
+M 1025024,728000,0,90675,0,13306 2 0115
+N 832832,728000,0,90675,0,13306 2 0116
+O 832832,728000,0,76286,-78454,44254 2 0117
+P 736736,728000,0,84022,0,-76138 2 0120
+Q 832832,728000,110656,76286,-78454,76286 3 0121
+R 736736,728000,0,84022,0,63018 2 0122
+S 640640,728000,0,90675,0,45338 2 0123
+T 768768,728000,0,138723,-116054,-21437 2 0124
+U 800800,728000,0,90675,-78454,13306 2 0125
+V 768768,728000,0,170755,-106691,-85501 2 0126
+W 1089088,728000,0,170755,-106691,10595 2 0127
+X 768768,728000,0,138723,0,69362 2 0130
+Y 768768,728000,0,183568,-122707,-72688 2 0131
+Z 704704,728000,0,122707,0,61354 2 0132
+lB 359632,782600,262080,167118 3 0133
+[ "
+rs 576576,782600,262080 3 0134
+\ "
+rB 359632,782600,262080,110334 3 0135
+] "
+ha 704704,755976,0,59794 2 0136
+^ "
+_ 896896,0,352171 1 0137
+oq 320320,755976,0,101234 2 0140
+` "
+a 550368,480480,0,40605 0 0141
+b 588224,755976,0,35090 2 0142
+c 512512,480480,0,89315 0 0143
+d 588224,755976,0,130354 2 0144
+e 535808,480480,0,78917 0 0145
+f 352352,755976,0,241010 2 0146
+g 576576,480480,203840,118144 1 0147
+h 588224,755976,0,48341 2 0150
+i 267904,755976,0,133266 2 0151
+j 299936,755976,203840,130354 3 0152
+k 556192,755976,0,89315 2 0153
+l 267904,755976,0,130354 2 0154
+m 908544,480480,0,48341 0 0155
+n 588224,480480,0,48341 0 0156
+o 576576,480480,0,71520 0 0157
+p 588224,480480,203840,44658 1 0160
+q 588224,480480,203840,71520 1 0161
+r 390208,480480,0,118144 0 0162
+s 442042,480480,0,82909 0 0163
+t 423696,617763,0,76502 2 0164
+u 588224,480480,0,71520 0 0165
+v 524160,480480,0,118144 0 0166
+w 780416,480480,0,118144 0 0167
+x 524160,480480,0,98925 0 0170
+y 524160,480480,203840,118144 1 0171
+z 499408,480480,0,96013 0 0172
+lC 576576,782600,262080,140910 3 0173
+{ "
+u01C0 320320,782600,262080,82670 3 0174
+ba "
+| "
+rC 576576,782600,262080,29498 3 0175
+} "
+~ 704704,755976,0,96379 2 0176
+hy 192192,480480,0,19032 0 0177
+u0041_0306 768768,946400 2 0200
+u0041_0328 768768,728000,203840 3 0201
+'C 736736,905917,0,122707 2 0202
+u0043_030C 736736,946400,0,122707,-78454,61354 2 0203
+u0044_030C 832832,946400,0,76286,0,44254 2 0204
+u0045_030C 672672,946400,0,122707,0,61354 2 0205
+u0045_0328 672672,728000,203840,122707 3 0206
+u0047_0306 768768,946400,0,122707,-78454,61354 2 0207
+u004C_0301 608608,905917,0,0,0,64064 2 0210
+u004C_030C 608608,946400,0,0,0,64064 2 0211
+/L 704704,728000 2 0212
+u004E_0301 832832,905917,0,90675 2 0213
+u004E_030C 832832,946400,0,90675,0,13306 2 0214
+u014A 864864,728000,0,154739,0,45338 2 0215
+u004F_030B 832832,905917,0,76286,-78454,44254 2 0216
+u0052_0301 736736,905917,0,84022,0,63018 2 0217
+u0052_030C 736736,946400,0,84022,0,63018 2 0220
+u0053_0301 640640,905917,0,90675 2 0221
+vS 640640,946400,0,90675,0,45338 2 0222
+u0053_0327 640640,728000,178360,90675,0,45338 3 0223
+u0054_030C 768768,946400,0,138723,-116054,-21437 2 0224
+u0054_0327 768768,728000,178360,138723,-116054,-21437 3 0225
+u0055_030B 800800,905917,0,90675,-78454,13306 2 0226
+u0055_030A 800800,946400,0,90675,-78454,13306 2 0227
+:Y 768768,946400,0,183568,-122707,-72688 2 0230
+u005A_0301 704704,905917,0,122707 2 0231
+vZ 704704,946400,0,122707,0,61354 2 0232
+u005A_0307 704704,905917,0,122707 2 0233
+IJ 853216,728000,0,90675,0,13306 2 0234
+u0049_0307 340704,905917,0,138723,0,69362 2 0235
+u0111 588224,755976,0,130354 2 0236
+sc 559104,755976,203840 3 0237
+u0061_0306 550368,698880,0,40605 2 0240
+u0061_0328 550368,480480,203840,40605 1 0241
+'c 512512,698880,0,89315 2 0242
+u0063_030C 512512,698880,0,89315 2 0243
+u0064_030C 767312,755976,0,130354 2 0244
+u0065_030C 535808,698880,0,78917 2 0245
+u0065_0328 535808,480480,203840,78917 1 0246
+u0067_0306 576576,698880,203840,118144 3 0247
+u006C_0301 267904,905917,0,130354 2 0250
+u006C_030C 446992,755976,0,130354 2 0251
+/l 399818,755976,0,130354 2 0252
+u006E_0301 588224,698880,0,48341 2 0253
+u006E_030C 588224,698880,0,48341 2 0254
+u016A 588224,480480,203840,48341 1 0255
+u006F_030B 576576,698880,0,71520 2 0256
+u0072_0301 390208,698880,0,118144 2 0257
+u0072_030C 390208,698880,0,118144 2 0260
+u0073_0301 442042,698880,0,82909 2 0261
+vs 442042,698880,0,82909 2 0262
+u0073_0327 442042,480480,178360,82909 1 0263
+u0074_030C 423696,755976,0,135304 2 0264
+u0074_0327 423696,617763,178360,76502 3 0265
+u0075_030B 588224,698880,0,71520 2 0266
+u0075_030A 588224,698880,0,71520 2 0267
+:y 524160,728000,203840,118144 3 0270
+u007A_0301 499408,698880,0,96013 2 0271
+vz 499408,698880,0,96013 2 0272
+u007A_0307 499408,755976,0,96013 2 0273
+ij 620256,755976,203840,133266 3 0274
+r! 384384,553280,203840,25874 3 0275
+r? 544544,553280,203840 3 0276
+Po 857434,755976 2 0277
+`A 768768,905917 2 0300
+'A 768768,905917,0,16302 2 0301
+^A 768768,946400 2 0302
+~A 768768,946400 2 0303
+:A 768768,946400 2 0304
+oA 768768,905917 2 0305
+AE 992992,728000,0,122707 2 0306
+,C 736736,728000,178360,122707,-78454,61354 3 0307
+`E 672672,905917,0,122707,0,61354 2 0310
+'E 672672,905917,0,122707,0,61354 2 0311
+^E 672672,946400,0,122707,0,61354 2 0312
+:E 672672,946400,0,122707 2 0313
+`I 340704,905917,0,138723,0,69362 2 0314
+'I 340704,905917,0,138723,0,69362 2 0315
+^I 340704,946400,0,138723,0,69362 2 0316
+:I 340704,946400,0,138723,0,69362 2 0317
+u0189 832832,728000,0,76286,0,44254 2 0320
+u0110 "
+-D "
+~N 832832,946400,0,90675,0,13306 2 0321
+`O 832832,905917,0,76286,-78454,44254 2 0322
+'O 832832,905917,0,76286 2 0323
+^O 832832,946400,0,76286,-78454,44254 2 0324
+~O 832832,946400,0,76286,-78454,44254 2 0325
+:O 832832,946400,0,76286,-78454,44254 2 0326
+OE 1121120,728000,0,122707 2 0327
+/O 896896,782600,50960,76286 3 0330
+`U 800800,905917,0,90675,-78454,13306 2 0331
+'U 800800,905917,0,90675 2 0332
+^U 800800,946400,0,90675,-78454,13306 2 0333
+:U 800800,946400,0,90675,-78454,13306 2 0334
+'Y 768768,905917,0,183568,-122707,-72688 2 0335
+TP 672672,728000,0,84022,0,42011 2 0336
+--- 1281280,728000,0,90675,0,45338 2 0337
+`a 550368,698880,0,40605 2 0340
+'a 550368,698880,0,40605 2 0341
+^a 550368,698880,0,40605 2 0342
+~a 550368,698880,0,40605 2 0343
+:a 550368,728000,0,40605 2 0344
+oa 550368,698880,0,40605 2 0345
+ae 832832,480480,0,78917 0 0346
+,c 512512,480480,178360,89315 1 0347
+`e 535808,698880,0,78917 2 0350
+'e 535808,698880,0,78917 2 0351
+^e 535808,698880,0,78917 2 0352
+:e 535808,728000,0,78917 2 0353
+`i 267904,698880,0,117974 2 0354
+'i 267904,698880,0,117974 2 0355
+^i 267904,698880,0,117974 2 0356
+:i 331968,728000,0,117974 2 0357
+Sd 576576,755976,0,102128 2 0360
+~n 588224,698880,0,48341 2 0361
+`o 576576,698880,0,71520 2 0362
+'o 576576,698880,0,71520 2 0363
+^o 576576,698880,0,71520 2 0364
+~o 576576,698880,0,71520 2 0365
+:o 576576,728000,0,71520 2 0366
+oe 896896,480480,0,78917 0 0367
+/o 576576,582400,101920,34802 3 0370
+`u 588224,698880,0,71520 2 0371
+'u 588224,698880,0,71520 2 0372
+^u 588224,698880,0,71520 2 0373
+:u 588224,728000,0,71520 2 0374
+'y 524160,698880,203840,118144 3 0375
+Tp 588224,755976,203840,44658 3 0376
+ss 592592,755976,0,96866 2 0377
diff --git a/font/devdvi/HBITC b/font/devdvi/HBITC
new file mode 100644
index 0000000..b7645b2
--- /dev/null
+++ b/font/devdvi/HBITC
@@ -0,0 +1,138 @@
+name HBITC
+special
+internalname tcso1000
+spacewidth 384384
+slant 11.999911
+checksum 220072497
+designsize 10485760
+charset
+--- 576576,660915 2 0000
+--- 576576,660915,0,76549 2 0001
+--- 576576,698880,0,51541 2 0002
+--- 576576,698880,0,84486 2 0003
+--- 576576,698880 2 0004
+--- 576576,660915,0,76549 2 0005
+--- 800800,698880 2 0006
+--- 576576,698880 2 0007
+--- 576576,698880,0,90310 2 0010
+--- 576576,698880,0,100502 2 0011
+--- 320320,660915 2 0012
+--- 512512,0,178360 1 0013
+--- 320320,0,203840 1 0014
+--- 448448,137072,203840 1 0015
+--- 576576,137072,203840 1 0022
+--- 768768,483392,0,95150 2 0025
+--- 864864,483392,0,95150 2 0026
+--- 0,728000 2 0027
+<- 1153152,425880,-98280 0 0030
+-> 1153152,425880,-98280 0 0031
+--- 267904,757120,0,487894 2 0032
+--- 352352,1004640,0,543309 2 0033
+--- 524160,757120,0,487894 2 0034
+--- 524160,757120,0,543309 2 0035
+--- 0,757120 2 0037
+u2422 588224,757120,0,35048 2 0040
+Do 576576,786240,29120,122707 3 0044
+$ "
+aq 320320,757120,0,104146 2 0047
+--- 576576,502320,-21840 2 0052
+, 320320,137072,110656 1 0054
+--- 384384,425880,-98280,58491 0 0055
+. 320320,137072 0 0056
+f/ 576576,786240,262080,135086 3 0057
+0 576576,483392,0,58677 2 0060
+1 576576,483392 2 0061
+2 576576,483392,0,56077 2 0062
+3 576576,483392,203840,56077 3 0063
+4 576576,483392,203840,13312 3 0064
+5 576576,483392,203840,38064 3 0065
+6 576576,728000,0,90675 2 0066
+7 576576,483392,203840,102128 3 0067
+8 576576,728000,0,90675 2 0070
+9 576576,483392,203840,38064 3 0071
+la 448448,786240,262080 3 0074
+\- 896896,646464,122304,23674 3 0075
+ra 448448,786240,262080 3 0076
+u2127 832832,728000,0,132317,0,66158 2 0115
+ci 1281280,786240,262080 3 0117
+u03A9 832832,728000,0,84022,0,42011 2 0127
+u301A 464464,786240,262080 3 0133
+u301B 464464,786240,262080 3 0135
+ua 576576,757120,232960,96098 3 0136
+da 576576,757120,232960 3 0137
+--- 576576,757120 2 0140
+--- 576576,502320,-21840 2 0142
+--- 576576,502320,-21840 2 0143
+--- 576576,660915,27666 3 0144
+--- 1153152,757120 2 0154
+--- 576576,502320,-21840 2 0155
+u266A 704704,757120 2 0156
+ti 704704,137072 0 0176
+~ "
+--- 192192,425880,-98280,58491 0 0177
+--- 704704,757120,0,102690 2 0200
+--- 704704,757120,0,79394 2 0201
+--- 576576,757120,0,96866 2 0202
+--- 576576,757120 2 0203
+dg 512512,757120,203840 3 0204
+dd 512512,757120,203840 3 0205
+u2016 576576,786240,262080 3 0206
+%0 1463224,786240,29120,32339 3 0207
+bu 576576,483392,-37856 2 0210
+u2103 992992,728000,0,122707,-78454,61354 2 0211
+--- 704704,786240,29120,122707 3 0212
+--- 576576,582400,101920,89315 3 0213
+Fn 352352,757120,0,241010 2 0214
+u20A1 736736,786240,29120,122707,-78454,61354 3 0215
+u20A9 1089088,728000,0,170755,-106691,10595 2 0216
+u20A6 864864,728000,0,90675,0,13306 2 0217
+--- 896896,786240,29120,122707,-78454,61354 3 0220
+u20B1 752752,728000,0,84022,0,-76138 2 0221
+u20A4 857434,757120 2 0222
+u211E 736736,728000,0,84022,0,63018 2 0223
+u203D 544544,757120,0,128744 2 0224
+--- 544544,553280,203840 3 0225
+u20AB 588224,786240,0,130354 2 0226
+tm 768768,786240,0,550366 2 0227
+u2031 2088494,786240,29120,32339 3 0230
+--- 544544,757120,203840 3 0231
+u0E3F 768768,786240,29120,84022,0,42011 3 0232
+u2116 960960,728000,0,90675,0,13306 2 0233
+u2052 576576,786240,0,135086 2 0234
+u212E 794976,728000,0,117602 2 0235
+u25E6 576576,483392,-37856 2 0236
+u2120 768768,786240,0,550366 2 0237
+u2045 416416,786240,262080,29498 3 0240
+u2046 416416,786240,262080,140910 3 0241
+ct 576576,582400,101920,89315 3 0242
+Po 857434,757120 2 0243
+Cs 826203,617763,0,102128 2 0244
+Ye 768768,728000,0,183568 2 0245
+bb 192192,786240,262080,103054 3 0246
+sc 559104,757120,203840 3 0247
+--- 576576,757120,0,91042 2 0250
+co 1281280,786240,262080 3 0251
+Of 512512,786240,0,116982 2 0252
+--- 1281280,786240,262080 3 0253
+tno 768768,483392,0,70096 2 0254
+u2117 1281280,786240,262080 3 0255
+rg 1281280,786240,262080 3 0256
+--- 896896,757120 2 0257
+de 384384,728000 2 0260
+t+- 896896,646464,122304,23674 3 0261
+S2 512512,786240,0,135086 2 0262
+S3 512512,786240,0,135086 2 0263
+--- 576576,757120,0,96866 2 0264
+mc 588224,483392,203840,71552 3 0265
+ps 704704,757120,203840 3 0266
+pc 235872,483392 2 0267
+u203B 700819,572691,0,19032 2 0270
+S1 512512,786240,0,135086 2 0271
+Om 512512,786240,0,116982 2 0272
+sr 544544,786240,174720,167118 3 0273
+--- 512512,786240,203840,135086 3 0274
+--- 512512,786240,203840,135086 3 0275
+--- 512512,786240,203840,135086 3 0276
+Eu 896896,728000,0,122707 2 0277
+tmu 896896,646464,122304,23674 3 0326
+tdi 896896,646464,122304,23674 3 0366
diff --git a/font/devdvi/HBTC b/font/devdvi/HBTC
new file mode 100644
index 0000000..d953209
--- /dev/null
+++ b/font/devdvi/HBTC
@@ -0,0 +1,137 @@
+name HBTC
+special
+internalname tcsx1000
+spacewidth 384384
+checksum -1912309847
+designsize 10485760
+charset
+--- 576576,660915 2 0000
+--- 576576,660915 2 0001
+--- 576576,698880 2 0002
+--- 576576,698880 2 0003
+--- 576576,698880 2 0004
+--- 576576,660915,0,61907 2 0005
+--- 800800,698880 2 0006
+--- 576576,698880 2 0007
+--- 576576,698880 2 0010
+--- 576576,698880 2 0011
+--- 320320,660915 2 0012
+--- 512512,0,178360 1 0013
+--- 320320,0,203840 1 0014
+--- 448448,137072,203840 1 0015
+--- 576576,137072,203840 1 0022
+--- 768768,483392,0,32032 2 0025
+--- 864864,483392,0,32032 2 0026
+--- 0,728000 2 0027
+<- 1153152,425880,-98280 0 0030
+-> 1153152,425880,-98280 0 0031
+--- 267904,757120,0,359632 2 0032
+--- 352352,1004640,0,391664 2 0033
+--- 524160,757120,0,359632 2 0034
+--- 524160,757120,0,391664 2 0035
+--- 0,757120 2 0037
+u2422 588224,757120 2 0040
+Do 576576,786240,29120 3 0044
+$ "
+aq 320320,757120 2 0047
+--- 576576,502320,-21840 2 0052
+, 320320,137072,110656 1 0054
+--- 384384,425880,-98280 0 0055
+. 320320,137072 0 0056
+f/ 576576,786240,262080 3 0057
+0 576576,483392 2 0060
+1 576576,483392 2 0061
+2 576576,483392 2 0062
+3 576576,483392,203840 3 0063
+4 576576,483392,203840 3 0064
+5 576576,483392,203840 3 0065
+6 576576,728000 2 0066
+7 576576,483392,203840 3 0067
+8 576576,728000 2 0070
+9 576576,483392,203840 3 0071
+la 448448,786240,262080 3 0074
+\- 896896,646464,122304 3 0075
+ra 448448,786240,262080 3 0076
+u2127 832832,728000 2 0115
+ci 1281280,786240,262080 3 0117
+u03A9 832832,728000 2 0127
+u301A 464464,786240,262080 3 0133
+u301B 464464,786240,262080 3 0135
+ua 576576,757120,232960 3 0136
+da 576576,757120,232960 3 0137
+--- 576576,757120 2 0140
+--- 576576,502320,-21840 2 0142
+--- 576576,502320,-21840 2 0143
+--- 576576,660915,27666 3 0144
+--- 1153152,757120 2 0154
+--- 576576,502320,-21840 2 0155
+u266A 704704,757120 2 0156
+ti 704704,137072 0 0176
+~ "
+--- 192192,425880,-98280 0 0177
+--- 704704,757120 2 0200
+--- 704704,757120 2 0201
+--- 576576,757120 2 0202
+--- 576576,757120 2 0203
+dg 512512,757120,203840 3 0204
+dd 512512,757120,203840 3 0205
+u2016 576576,786240,262080 3 0206
+%0 1463224,786240,29120 3 0207
+bu 576576,483392,-37856 2 0210
+u2103 992992,728000,0,0,-32032 2 0211
+--- 704704,786240,29120 3 0212
+--- 576576,582400,101920 3 0213
+Fn 352352,757120,0,80080 2 0214
+u20A1 736736,786240,29120,0,-32032 3 0215
+u20A9 1089088,728000,0,16016,48048,-144144 2 0216
+u20A6 864864,728000 2 0217
+--- 896896,786240,29120,0,-32032 3 0220
+u20B1 752752,728000,0,0,0,-160160 2 0221
+u20A4 736736,757120 2 0222
+u211E 736736,728000 2 0223
+u203D 544544,757120 2 0224
+--- 544544,553280,203840 3 0225
+u20AB 588224,786240 2 0226
+tm 768768,786240,0,550366 2 0227
+u2031 2088494,786240,29120 3 0230
+--- 544544,757120,203840 3 0231
+u0E3F 768768,786240,29120 3 0232
+u2116 960960,728000 2 0233
+u2052 576576,786240 2 0234
+u212E 794976,728000 2 0235
+u25E6 576576,483392,-37856 2 0236
+u2120 768768,786240,0,550366 2 0237
+u2045 416416,786240,262080 3 0240
+u2046 416416,786240,262080 3 0241
+ct 576576,582400,101920 3 0242
+Po 736736,757120 2 0243
+Cs 826203,617763 2 0244
+Ye 768768,728000,0,28829 2 0245
+bb 192192,786240,262080 3 0246
+sc 559104,757120,203840 3 0247
+--- 576576,757120 2 0250
+co 1281280,786240,262080 3 0251
+Of 512512,786240 2 0252
+--- 1281280,786240,262080 3 0253
+tno 768768,483392 2 0254
+u2117 1281280,786240,262080 3 0255
+rg 1281280,786240,262080 3 0256
+--- 896896,757120 2 0257
+de 384384,728000 2 0260
+t+- 896896,646464,122304 3 0261
+S2 512512,786240 2 0262
+S3 512512,786240 2 0263
+--- 576576,757120 2 0264
+mc 588224,483392,203840 3 0265
+ps 704704,757120,203840 3 0266
+pc 235872,483392 2 0267
+u203B 700819,572691 2 0270
+S1 512512,786240 2 0271
+Om 512512,786240 2 0272
+sr 544544,786240,174720 3 0273
+--- 512512,786240,203840 3 0274
+--- 512512,786240,203840 3 0275
+--- 512512,786240,203840 3 0276
+Eu 896896,728000 2 0277
+tmu 896896,646464,122304 3 0326
+tdi 896896,646464,122304 3 0366
diff --git a/font/devdvi/HI b/font/devdvi/HI
new file mode 100644
index 0000000..4034e21
--- /dev/null
+++ b/font/devdvi/HI
@@ -0,0 +1,298 @@
+name HI
+internalname cmssi10
+spacewidth 349526
+slant 11.999911
+ligatures ff fi fl ffi ffl 0
+checksum -984248855
+designsize 10485760
+kernpairs
+ff cq 72818
+ff ' 72818
+ff ? 72818
+ff ! 72818
+ff ) 72818
+ff rB 72818
+ff ] 72818
+slash@for@l l -250494
+slash@for@l L -270885
+cq ? 116509
+' ? 116509
+cq ! 116509
+' ! 116509
+A t -29128
+A C -29128
+A O -29128
+A G -29128
+A U -29128
+A Q -29128
+A T -87382
+A Y -87382
+A V -116509
+A W -116509
+D X -29128
+D W -29128
+D A -29128
+D V -29128
+D Y -29128
+F o -29128
+F e -29128
+F u -29128
+F r -29128
+F a -29128
+F A -87382
+F O -29128
+F C -29128
+F G -29128
+F Q -29128
+I I 29128
+K O -29128
+K C -29128
+K G -29128
+K Q -29128
+L T -87382
+L Y -87382
+L V -116509
+L W -116509
+O X -29128
+O W -29128
+O A -29128
+O V -29128
+O Y -29128
+P A -87382
+P o -29128
+P e -29128
+P a -29128
+P . -87382
+P , -87382
+T y -87382
+T e -87382
+T o -87382
+T r -87382
+T a -87382
+T A -87382
+T u -87382
+V o -29128
+V e -29128
+V u -29128
+V r -29128
+V a -29128
+V A -87382
+V O -29128
+V C -29128
+V G -29128
+V Q -29128
+W o -29128
+W e -29128
+W u -29128
+W r -29128
+W a -29128
+W A -87382
+W O -29128
+W C -29128
+W G -29128
+W Q -29128
+X O -29128
+X C -29128
+X G -29128
+X Q -29128
+Y e -87382
+Y o -87382
+Y r -87382
+Y a -87382
+Y A -87382
+Y u -87382
+a r -29128
+a y -29128
+a w -29128
+b e 29128
+b o 29128
+b x -29128
+b d 29128
+b c 29128
+b q 29128
+b r -29128
+b y -29128
+b w -29128
+f cq 72818
+f ' 72818
+f ? 72818
+f ! 72818
+f ) 72818
+f rB 72818
+f ] 72818
+g j 29128
+k e -29128
+k a -29128
+k o -29128
+k c -29128
+o e 29128
+o o 29128
+o x -29128
+o d 29128
+o c 29128
+o q 29128
+o r -29128
+o y -29128
+o w -29128
+p e 29128
+p o 29128
+p x -29128
+p d 29128
+p c 29128
+p q 29128
+p r -29128
+p y -29128
+p w -29128
+t y -29128
+t w -29128
+u w -29128
+w e -29128
+w a -29128
+w o -29128
+w c -29128
+y o -29128
+y e -29128
+y a -29128
+y . -87382
+y , -87382
+charset
+*G 567981,728178,0,140214,0,-5422 2 0000
+*D 873816,728178 2 0001
+*H 815562,728178,0,79216,-75562,50088 2 0002
+*L 640800,728178 2 0003
+*C 699053,728178,0,134389,0,67195 2 0004
+*P 742746,728178,0,84870,0,42435 2 0005
+*S 757307,728178,0,125650,0,62826 2 0006
+*U 815562,728178,0,94694,-152950,-50942 2 0007
+*F 757307,728178,0,48261,-106517,48261 2 0010
+*Q 815562,728178,0,94694,-152950,-10907 2 0011
+*W 757307,728178,0,86955,0,43478 2 0012
+ff 611672,728178,0,227595 2 0013
+fi 562155,728178,0,102349 2 0014
+fl 562155,728178,0,99435 2 0015
+Fi 853427,728178,0,102349 2 0016
+Fl 853427,728178,0,99435 2 0017
+.i 250494,466034,0,43715 0 0020
+.j 279622,466034,203890,43715 1 0021
+ga 524290,728178 2 0022
+aa 524290,728178,0,96523 2 0023
+ah 524290,662642,0,88419 2 0024
+ab 524290,728178,0,99435 2 0025
+a- 524290,638464,0,92018 2 0026
+ao 773347,728178 2 0027
+ac 466035,0,178403 1 0030
+ss 503902,728178,0,96523 2 0031
+ae 757307,466034,0,71070 0 0032
+oe 815562,466034,0,71070 0 0033
+/o 524290,567979,101946,50821 3 0034
+AE 902944,728178,0,125650 2 0035
+OE 1019453,728178,0,125650 2 0036
+/O 815562,779150,50973,79216 3 0037
+slash@for@l 250494,466034 0 0040
+! 334963,728178,0,60114 2 0041
+rq 524290,728178,0,3315 2 0042
+sh 873816,728178,203888,53338 3 0043
+# "
+Do 524290,786432,58254,116982 3 0044
+$ "
+% 873816,786432,58254,32782 3 0045
+& 795173,728178,0,32064 2 0046
+cq 291272,728178,0,81960 2 0047
+' "
+( 407781,786432,262144,138032 3 0050
+) 407781,786432,262144,26592 3 0051
+* 524290,786432,0,123469 2 0052
++ 815562,611670,87382,26592 3 0053
+, 291272,87381,131072 1 0054
+hy 349526,466034,0,20402 0 0055
+- "
+. 291272,87381 0 0056
+sl 524290,786432,262144,138032 3 0057
+/ "
+0 524290,687400,0,116982 2 0060
+1 524290,687400,0,116982 2 0061
+2 524290,687400,0,116982 2 0062
+3 524290,687400,0,116982 2 0063
+4 524290,687400,0,116982 2 0064
+5 524290,687400,0,116982 2 0065
+6 524290,687400,0,116982 2 0066
+7 524290,687400,0,116982 2 0067
+8 524290,687400,0,116982 2 0070
+9 524290,687400,0,116982 2 0071
+: 291272,466034,0,26240 0 0072
+; 291272,466034,131072,26240 1 0073
+r! 334963,524288,203890,16776 3 0074
+= 815562,387973,-136315,53338 0 0075
+r? 495163,524288,203890 3 0076
+? 495163,728178,0,123822 2 0077
+at 699053,728178,0,79216 2 0100
+@ "
+A 699054,728178 2 0101
+B 699054,728178,0,86955,0,43478 2 0102
+C 669926,728178,0,125650,-75562,62826 2 0103
+D 757309,728178,0,79216,0,50088 2 0104
+E 626235,728178,0,125650,0,62826 2 0105
+F 597109,728178,0,140214,0,-5422 2 0106
+G 699053,728178,0,125650,-75562,62826 2 0107
+H 742746,728178,0,84870,0,42435 2 0110
+I 291274,728178,0,140214,0,70107 2 0111
+J 495163,728178,0,84870,0,13307 2 0112
+K 728182,728178,0,125650,0,62826 2 0113
+L 567981,728178,0,0,0,58254 2 0114
+M 917509,728178,0,84870,0,13307 2 0115
+N 742746,728178,0,84870,0,13307 2 0116
+O 771870,728178,0,79216,-75562,50088 2 0117
+P 669926,728178,0,86955,0,-58682 2 0120
+Q 771870,728178,131072,79216,-75562,79216 3 0121
+R 677208,728178,0,86955,0,65216 2 0122
+S 582544,728178,0,96523,0,48262 2 0123
+T 713616,728178,0,140214,-116083,-5422 2 0124
+U 720901,728178,0,84870,-75562,13307 2 0125
+V 699054,728178,0,169341,-111086,-63677 2 0126
+W 990326,728178,0,169341,-111086,23704 2 0127
+X 699054,728178,0,140214,0,70107 2 0130
+Y 699054,728178,0,180992,-125650,-52026 2 0131
+Z 640798,728178,0,125650,0,62826 2 0132
+lB 302923,786432,262144,167160 3 0133
+[ "
+lq 524290,728178,0,148952 2 0134
+rB 302923,786432,262144,91429 3 0135
+] "
+ha 524290,728178,0,83776 2 0136
+^ "
+a^ "
+a. 291272,712366,0,81512 2 0137
+oq 291272,728178,0,81960 2 0140
+` "
+a 503901,466034,0,10283 0 0141
+b 541766,728178,0,32053 2 0142
+c 466035,466034,0,87406 0 0143
+d 541766,728178,0,99435 2 0144
+e 466035,466034,0,71070 0 0145
+f 320400,728178,0,227595 2 0146
+g 524290,466034,203890,113621 1 0147
+h 541766,728178,0,18642 2 0150
+i 250494,712366,0,101901 2 0151
+j 279622,712366,203890,96075 3 0152
+k 512640,728178,0,87406 2 0153
+l 250494,728178,0,99435 2 0154
+m 833038,466034,0,18642 0 0155
+n 541766,466034,0,18642 0 0156
+o 524290,466034,0,69341 0 0157
+p 541766,466034,203890,40790 1 0160
+q 541766,466034,203890,43715 1 0161
+r 358266,466034,0,113621 0 0162
+s 401955,466034,0,81581 0 0163
+t 378653,599189,0,75757 2 0164
+u 541766,466034,0,43715 0 0165
+v 483512,466034,0,113621 0 0166
+w 716530,466034,0,113621 0 0167
+x 483512,466034,0,96144 0 0170
+y 483512,466034,203890,113621 1 0171
+z 455840,466034,0,91776 0 0172
+en 524290,466034,0,90349 0 0173
+em 1048579,466034,0,90349 0 0174
+a" 524290,728178,0,96523 2 0175
+~ 524290,709454,0,92544 2 0176
+a~ "
+ad 524290,712366,0,66949 2 0177
diff --git a/font/devdvi/HIEC b/font/devdvi/HIEC
new file mode 100644
index 0000000..a53f126
--- /dev/null
+++ b/font/devdvi/HIEC
@@ -0,0 +1,2079 @@
+name HIEC
+internalname ecsi1000
+spacewidth 349440
+slant 11.999911
+ligatures ff fi fl ffi ffl 0
+checksum -132433781
+designsize 10485760
+kernpairs
+bq Bq 116480
+bq j 116480
+bq .j 116480
+bq g 58240
+bq u0067_0306 58240
+bq y 58240
+bq :y 58240
+bq 'y 58240
+bq v -87360
+bq w -58240
+bq V -116480
+bq W -87360
+bq Y -87360
+bq :Y -87360
+bq 'Y -87360
+bq O -29120
+bq u004F_030B -29120
+bq `O -29120
+bq 'O -29120
+bq ^O -29120
+bq ~O -29120
+bq :O -29120
+bq OE -29120
+bq /O -29120
+bq C -29120
+bq G -29120
+bq 'C -29120
+bq u0043_030C -29120
+bq u0047_0306 -29120
+bq ,C -29120
+bq Q -29120
+lq oq 116480
+lq ` 116480
+lq lq 116480
+rq cq 116480
+rq ' 116480
+rq rq 116480
+Bq bq 116480
+Bq , 116480
+Bq Bq 116480
+Bq j 116480
+Bq .j 116480
+Bq g 58240
+Bq u0067_0306 58240
+Bq y 58240
+Bq :y 58240
+Bq 'y 58240
+Bq v -87360
+Bq w -58240
+Bq V -116480
+Bq W -87360
+Bq Y -87360
+Bq :Y -87360
+Bq 'Y -87360
+Bq O -29120
+Bq u004F_030B -29120
+Bq `O -29120
+Bq 'O -29120
+Bq ^O -29120
+Bq ~O -29120
+Bq :O -29120
+Bq OE -29120
+Bq /O -29120
+Bq C -29120
+Bq G -29120
+Bq 'C -29120
+Bq u0043_030C -29120
+Bq u0047_0306 -29120
+Bq ,C -29120
+Bq Q -29120
+Fc . -87360
+Fc , -87360
+ff cq 72800
+ff ' 72800
+ff oq 72800
+ff ` 72800
+ff lq 72800
+ff rq 72800
+ff ? 72800
+ff u01C3 72800
+ff ! 72800
+ff ) 72800
+ff rB 72800
+ff ] 72800
+cq rq 116480
+' rq 116480
+cq ? 116480
+' ? 116480
+cq u01C3 116480
+cq ! 116480
+' u01C3 116480
+' ! 116480
+A y -29120
+A :y -29120
+A 'y -29120
+A v -29120
+A w -29120
+A c -29120
+A 'c -29120
+A u0063_030C -29120
+A ,c -29120
+A d -29120
+A u0064_030C -29120
+A u0111 -29120
+A Sd -29120
+A e -29120
+A u0065_030C -29120
+A u0065_0328 -29120
+A `e -29120
+A 'e -29120
+A ^e -29120
+A :e -29120
+A o -29120
+A u006F_030B -29120
+A `o -29120
+A 'o -29120
+A ^o -29120
+A ~o -29120
+A :o -29120
+A oe -29120
+A /o -29120
+A q -29120
+A t -29120
+A u0074_030C -29120
+A u0074_0327 -29120
+A C -29120
+A G -29120
+A 'C -29120
+A u0043_030C -29120
+A u0047_0306 -29120
+A ,C -29120
+A Q -29120
+A O -29120
+A u004F_030B -29120
+A `O -29120
+A 'O -29120
+A ^O -29120
+A ~O -29120
+A :O -29120
+A OE -29120
+A /O -29120
+A U -29120
+A u0055_030B -29120
+A u0055_030A -29120
+A `U -29120
+A 'U -29120
+A ^U -29120
+A :U -29120
+A T -87360
+A u0054_030C -87360
+A u0054_0327 -87360
+A Y -87360
+A :Y -87360
+A 'Y -87360
+A V -116480
+A W -116480
+D X -29120
+D W -29120
+D A -29120
+D u0041_0306 -29120
+D u0041_0328 -29120
+D `A -29120
+D 'A -29120
+D ^A -29120
+D ~A -29120
+D :A -29120
+D oA -29120
+D AE -29120
+D V -29120
+D Y -29120
+D :Y -29120
+D 'Y -29120
+F o -29120
+F a -29120
+F e -29120
+F y -29120
+F u -29120
+F r -29120
+F v -29120
+F s -29120
+F c -29120
+F d -29120
+F g -29120
+F m -29120
+F n -29120
+F p -29120
+F w -29120
+F z -29120
+F ae -29120
+F /o -29120
+F A -87360
+F u0041_0306 -87360
+F u0041_0328 -87360
+F `A -87360
+F 'A -87360
+F ^A -87360
+F ~A -87360
+F :A -87360
+F oA -87360
+F AE -87360
+F O -29120
+F u004F_030B -29120
+F `O -29120
+F 'O -29120
+F ^O -29120
+F ~O -29120
+F :O -29120
+F OE -29120
+F /O -29120
+F C -29120
+F G -29120
+F 'C -29120
+F u0043_030C -29120
+F u0047_0306 -29120
+F ,C -29120
+F Q -29120
+I I 29120
+K v -29120
+K o -29120
+K u006F_030B -29120
+K `o -29120
+K 'o -29120
+K ^o -29120
+K ~o -29120
+K :o -29120
+K oe -29120
+K /o -29120
+K C -29120
+K G -29120
+K 'C -29120
+K u0043_030C -29120
+K u0047_0306 -29120
+K ,C -29120
+K Q -29120
+L T -87360
+L u0054_030C -87360
+L u0054_0327 -87360
+L Y -87360
+L :Y -87360
+L 'Y -87360
+L V -116480
+L W -116480
+O X -29120
+O W -29120
+O A -29120
+O u0041_0306 -29120
+O u0041_0328 -29120
+O `A -29120
+O 'A -29120
+O ^A -29120
+O ~A -29120
+O :A -29120
+O oA -29120
+O AE -29120
+O V -29120
+O Y -29120
+O :Y -29120
+O 'Y -29120
+P A -87360
+P u0041_0306 -87360
+P u0041_0328 -87360
+P `A -87360
+P 'A -87360
+P ^A -87360
+P ~A -87360
+P :A -87360
+P oA -87360
+P AE -87360
+P o -29120
+P u006F_030B -29120
+P `o -29120
+P 'o -29120
+P ^o -29120
+P ~o -29120
+P :o -29120
+P oe -29120
+P /o -29120
+P e -29120
+P u0065_030C -29120
+P u0065_0328 -29120
+P `e -29120
+P 'e -29120
+P ^e -29120
+P :e -29120
+P a -29120
+P u0061_0306 -29120
+P u0061_0328 -29120
+P `a -29120
+P 'a -29120
+P ^a -29120
+P ^a -29120
+P ~a -29120
+P :a -29120
+P oa -29120
+P ae -29120
+P . -87360
+P , -87360
+T y -87360
+T e -87360
+T o -87360
+T r -87360
+T a -87360
+T u -87360
+T n -87360
+T .i -87360
+T c -87360
+T d -87360
+T g -87360
+T p -87360
+T s -87360
+T v -87360
+T w -87360
+T x -87360
+T z -87360
+T A -87360
+T u0041_0306 -87360
+T u0041_0328 -87360
+T `A -87360
+T 'A -87360
+T ^A -87360
+T ~A -87360
+T :A -87360
+T oA -87360
+T AE -87360
+V o -29120
+V a -29120
+V e -29120
+V y -29120
+V u -29120
+V r -29120
+V v -29120
+V s -29120
+V c -29120
+V d -29120
+V g -29120
+V m -29120
+V n -29120
+V p -29120
+V w -29120
+V z -29120
+V ae -29120
+V /o -29120
+V A -87360
+V u0041_0306 -87360
+V u0041_0328 -87360
+V `A -87360
+V 'A -87360
+V ^A -87360
+V ~A -87360
+V :A -87360
+V oA -87360
+V AE -87360
+V O -29120
+V u004F_030B -29120
+V `O -29120
+V 'O -29120
+V ^O -29120
+V ~O -29120
+V :O -29120
+V OE -29120
+V /O -29120
+V C -29120
+V G -29120
+V 'C -29120
+V u0043_030C -29120
+V u0047_0306 -29120
+V ,C -29120
+V Q -29120
+W o -29120
+W a -29120
+W e -29120
+W y -29120
+W u -29120
+W r -29120
+W v -29120
+W s -29120
+W c -29120
+W d -29120
+W g -29120
+W m -29120
+W n -29120
+W p -29120
+W w -29120
+W z -29120
+W ae -29120
+W /o -29120
+W A -87360
+W u0041_0306 -87360
+W u0041_0328 -87360
+W `A -87360
+W 'A -87360
+W ^A -87360
+W ~A -87360
+W :A -87360
+W oA -87360
+W AE -87360
+W O -29120
+W u004F_030B -29120
+W `O -29120
+W 'O -29120
+W ^O -29120
+W ~O -29120
+W :O -29120
+W OE -29120
+W /O -29120
+W C -29120
+W G -29120
+W 'C -29120
+W u0043_030C -29120
+W u0047_0306 -29120
+W ,C -29120
+W Q -29120
+X O -29120
+X u004F_030B -29120
+X `O -29120
+X 'O -29120
+X ^O -29120
+X ~O -29120
+X :O -29120
+X OE -29120
+X /O -29120
+X C -29120
+X G -29120
+X 'C -29120
+X u0043_030C -29120
+X u0047_0306 -29120
+X ,C -29120
+X Q -29120
+Y e -87360
+Y o -87360
+Y r -87360
+Y a -87360
+Y u -87360
+Y n -87360
+Y .i -87360
+Y c -87360
+Y d -87360
+Y g -87360
+Y p -87360
+Y s -87360
+Y v -87360
+Y w -87360
+Y x -87360
+Y z -87360
+Y A -87360
+Y u0041_0306 -87360
+Y u0041_0328 -87360
+Y `A -87360
+Y 'A -87360
+Y ^A -87360
+Y ~A -87360
+Y :A -87360
+Y oA -87360
+Y AE -87360
+oq lq 116480
+` lq 116480
+oq ? 116480
+` ? 116480
+oq u01C3 116480
+oq ! 116480
+` u01C3 116480
+` ! 116480
+a r -29120
+a y -29120
+a :y -29120
+a 'y -29120
+a w -29120
+b e 29120
+b u0065_030C 29120
+b u0065_0328 29120
+b `e 29120
+b 'e 29120
+b ^e 29120
+b :e 29120
+b o 29120
+b u006F_030B 29120
+b `o 29120
+b 'o 29120
+b ^o 29120
+b ~o 29120
+b :o 29120
+b oe 29120
+b /o 29120
+b x -29120
+b d 29120
+b c 29120
+b 'c 29120
+b u0063_030C 29120
+b ,c 29120
+b q 29120
+b r -29120
+b y -29120
+b :y -29120
+b 'y -29120
+b w -29120
+e V -87360
+f cq 72800
+f ' 72800
+f oq 72800
+f ` 72800
+f lq 72800
+f rq 72800
+f ? 72800
+f u01C3 72800
+f ! 72800
+f ) 72800
+f rB 72800
+f ] 72800
+g j 29120
+k W -87360
+k V -87360
+k e -29120
+k u0065_030C -29120
+k u0065_0328 -29120
+k `e -29120
+k 'e -29120
+k ^e -29120
+k :e -29120
+k a -29120
+k u0061_0306 -29120
+k u0061_0328 -29120
+k `a -29120
+k 'a -29120
+k ^a -29120
+k ^a -29120
+k ~a -29120
+k :a -29120
+k oa -29120
+k ae -29120
+k o -29120
+k u006F_030B -29120
+k `o -29120
+k 'o -29120
+k ^o -29120
+k ~o -29120
+k :o -29120
+k oe -29120
+k /o -29120
+k c -29120
+k 'c -29120
+k u0063_030C -29120
+k ,c -29120
+o e 29120
+o u0065_030C 29120
+o u0065_0328 29120
+o `e 29120
+o 'e 29120
+o ^e 29120
+o :e 29120
+o o 29120
+o u006F_030B 29120
+o `o 29120
+o 'o 29120
+o ^o 29120
+o ~o 29120
+o :o 29120
+o oe 29120
+o /o 29120
+o x -29120
+o d 29120
+o c 29120
+o 'c 29120
+o u0063_030C 29120
+o ,c 29120
+o q 29120
+o r -29120
+o y -29120
+o :y -29120
+o 'y -29120
+o w -29120
+p e 29120
+p u0065_030C 29120
+p u0065_0328 29120
+p `e 29120
+p 'e 29120
+p ^e 29120
+p :e 29120
+p o 29120
+p u006F_030B 29120
+p `o 29120
+p 'o 29120
+p ^o 29120
+p ~o 29120
+p :o 29120
+p oe 29120
+p /o 29120
+p x -29120
+p d 29120
+p c 29120
+p 'c 29120
+p u0063_030C 29120
+p ,c 29120
+p q 29120
+p r -29120
+p y -29120
+p :y -29120
+p 'y -29120
+p w -29120
+t y -29120
+t :y -29120
+t 'y -29120
+t w -29120
+u w -29120
+w e -29120
+w u0065_030C -29120
+w u0065_0328 -29120
+w `e -29120
+w 'e -29120
+w ^e -29120
+w :e -29120
+w a -29120
+w u0061_0306 -29120
+w u0061_0328 -29120
+w `a -29120
+w 'a -29120
+w ^a -29120
+w ^a -29120
+w ~a -29120
+w :a -29120
+w oa -29120
+w ae -29120
+w o -29120
+w u006F_030B -29120
+w `o -29120
+w 'o -29120
+w ^o -29120
+w ~o -29120
+w :o -29120
+w oe -29120
+w /o -29120
+w c -29120
+w 'c -29120
+w u0063_030C -29120
+w ,c -29120
+y o -29120
+y u006F_030B -29120
+y `o -29120
+y 'o -29120
+y ^o -29120
+y ~o -29120
+y :o -29120
+y oe -29120
+y /o -29120
+y e -29120
+y u0065_030C -29120
+y u0065_0328 -29120
+y `e -29120
+y 'e -29120
+y ^e -29120
+y :e -29120
+y a -29120
+y u0061_0306 -29120
+y u0061_0328 -29120
+y `a -29120
+y 'a -29120
+y ^a -29120
+y ^a -29120
+y ~a -29120
+y :a -29120
+y oa -29120
+y ae -29120
+y . -87360
+y , -87360
+u0041_0306 y -29120
+u0041_0306 :y -29120
+u0041_0306 'y -29120
+u0041_0306 v -29120
+u0041_0306 w -29120
+u0041_0306 c -29120
+u0041_0306 'c -29120
+u0041_0306 u0063_030C -29120
+u0041_0306 ,c -29120
+u0041_0306 d -29120
+u0041_0306 u0064_030C -29120
+u0041_0306 u0111 -29120
+u0041_0306 Sd -29120
+u0041_0306 e -29120
+u0041_0306 u0065_030C -29120
+u0041_0306 u0065_0328 -29120
+u0041_0306 `e -29120
+u0041_0306 'e -29120
+u0041_0306 ^e -29120
+u0041_0306 :e -29120
+u0041_0306 o -29120
+u0041_0306 u006F_030B -29120
+u0041_0306 `o -29120
+u0041_0306 'o -29120
+u0041_0306 ^o -29120
+u0041_0306 ~o -29120
+u0041_0306 :o -29120
+u0041_0306 oe -29120
+u0041_0306 /o -29120
+u0041_0306 q -29120
+u0041_0306 t -29120
+u0041_0306 u0074_030C -29120
+u0041_0306 u0074_0327 -29120
+u0041_0306 C -29120
+u0041_0306 G -29120
+u0041_0306 'C -29120
+u0041_0306 u0043_030C -29120
+u0041_0306 u0047_0306 -29120
+u0041_0306 ,C -29120
+u0041_0306 Q -29120
+u0041_0306 O -29120
+u0041_0306 u004F_030B -29120
+u0041_0306 `O -29120
+u0041_0306 'O -29120
+u0041_0306 ^O -29120
+u0041_0306 ~O -29120
+u0041_0306 :O -29120
+u0041_0306 OE -29120
+u0041_0306 /O -29120
+u0041_0306 U -29120
+u0041_0306 u0055_030B -29120
+u0041_0306 u0055_030A -29120
+u0041_0306 `U -29120
+u0041_0306 'U -29120
+u0041_0306 ^U -29120
+u0041_0306 :U -29120
+u0041_0306 T -87360
+u0041_0306 u0054_030C -87360
+u0041_0306 u0054_0327 -87360
+u0041_0306 Y -87360
+u0041_0306 :Y -87360
+u0041_0306 'Y -87360
+u0041_0306 V -116480
+u0041_0306 W -116480
+'C v -29120
+'C w -29120
+'C c -29120
+'C 'c -29120
+'C u0063_030C -29120
+'C ,c -29120
+'C d -29120
+'C u0064_030C -29120
+'C u0111 -29120
+'C Sd -29120
+'C e -29120
+'C u0065_030C -29120
+'C u0065_0328 -29120
+'C `e -29120
+'C 'e -29120
+'C ^e -29120
+'C :e -29120
+'C o -29120
+'C u006F_030B -29120
+'C `o -29120
+'C 'o -29120
+'C ^o -29120
+'C ~o -29120
+'C :o -29120
+'C oe -29120
+'C /o -29120
+'C q -29120
+'C t -29120
+'C u0074_030C -29120
+'C u0074_0327 -29120
+'C C -29120
+'C G -29120
+'C 'C -29120
+'C u0043_030C -29120
+'C u0047_0306 -29120
+'C ,C -29120
+'C Q -29120
+'C O -29120
+'C u004F_030B -29120
+'C `O -29120
+'C 'O -29120
+'C ^O -29120
+'C ~O -29120
+'C :O -29120
+'C OE -29120
+'C /O -29120
+'C U -29120
+'C u0055_030B -29120
+'C u0055_030A -29120
+'C `U -29120
+'C 'U -29120
+'C ^U -29120
+'C :U -29120
+'C T -87360
+'C u0054_030C -87360
+'C u0054_0327 -87360
+'C Y -87360
+'C :Y -87360
+'C 'Y -87360
+'C V -116480
+'C W -116480
+u0044_030C X -29120
+u0044_030C W -29120
+u0044_030C A -29120
+u0044_030C u0041_0306 -29120
+u0044_030C u0041_0328 -29120
+u0044_030C `A -29120
+u0044_030C 'A -29120
+u0044_030C ^A -29120
+u0044_030C ~A -29120
+u0044_030C :A -29120
+u0044_030C oA -29120
+u0044_030C AE -29120
+u0044_030C V -29120
+u0044_030C Y -29120
+u0044_030C :Y -29120
+u0044_030C 'Y -29120
+u004C_0301 T -87360
+u004C_0301 u0054_030C -87360
+u004C_0301 u0054_0327 -87360
+u004C_0301 Y -87360
+u004C_0301 :Y -87360
+u004C_0301 'Y -87360
+u004C_0301 V -116480
+u004C_0301 W -116480
+u004C_030C T -87360
+u004C_030C u0054_030C -87360
+u004C_030C u0054_0327 -87360
+u004C_030C Y -87360
+u004C_030C :Y -87360
+u004C_030C 'Y -87360
+u004C_030C V -116480
+u004C_030C W -116480
+/L T -87360
+/L u0054_030C -87360
+/L u0054_0327 -87360
+/L Y -87360
+/L :Y -87360
+/L 'Y -87360
+/L V -116480
+/L W -116480
+u004F_030B X -29120
+u004F_030B W -29120
+u004F_030B A -29120
+u004F_030B u0041_0306 -29120
+u004F_030B u0041_0328 -29120
+u004F_030B `A -29120
+u004F_030B 'A -29120
+u004F_030B ^A -29120
+u004F_030B ~A -29120
+u004F_030B :A -29120
+u004F_030B oA -29120
+u004F_030B AE -29120
+u004F_030B V -29120
+u004F_030B Y -29120
+u004F_030B :Y -29120
+u004F_030B 'Y -29120
+u0054_030C y -87360
+u0054_030C e -87360
+u0054_030C o -87360
+u0054_030C r -87360
+u0054_030C a -87360
+u0054_030C u -87360
+u0054_030C n -87360
+u0054_030C .i -87360
+u0054_030C c -87360
+u0054_030C d -87360
+u0054_030C g -87360
+u0054_030C p -87360
+u0054_030C s -87360
+u0054_030C v -87360
+u0054_030C w -87360
+u0054_030C x -87360
+u0054_030C z -87360
+u0054_030C A -87360
+u0054_030C u0041_0306 -87360
+u0054_030C u0041_0328 -87360
+u0054_030C `A -87360
+u0054_030C 'A -87360
+u0054_030C ^A -87360
+u0054_030C ~A -87360
+u0054_030C :A -87360
+u0054_030C oA -87360
+u0054_030C AE -87360
+u0054_0327 y -87360
+u0054_0327 e -87360
+u0054_0327 o -87360
+u0054_0327 r -87360
+u0054_0327 a -87360
+u0054_0327 u -87360
+u0054_0327 n -87360
+u0054_0327 .i -87360
+u0054_0327 c -87360
+u0054_0327 d -87360
+u0054_0327 g -87360
+u0054_0327 p -87360
+u0054_0327 s -87360
+u0054_0327 v -87360
+u0054_0327 w -87360
+u0054_0327 x -87360
+u0054_0327 z -87360
+u0054_0327 A -87360
+u0054_0327 u0041_0306 -87360
+u0054_0327 u0041_0328 -87360
+u0054_0327 `A -87360
+u0054_0327 'A -87360
+u0054_0327 ^A -87360
+u0054_0327 ~A -87360
+u0054_0327 :A -87360
+u0054_0327 oA -87360
+u0054_0327 AE -87360
+:Y e -87360
+:Y o -87360
+:Y r -87360
+:Y a -87360
+:Y u -87360
+:Y n -87360
+:Y .i -87360
+:Y c -87360
+:Y d -87360
+:Y g -87360
+:Y p -87360
+:Y s -87360
+:Y v -87360
+:Y w -87360
+:Y x -87360
+:Y z -87360
+:Y A -87360
+:Y u0041_0306 -87360
+:Y u0041_0328 -87360
+:Y `A -87360
+:Y 'A -87360
+:Y ^A -87360
+:Y ~A -87360
+:Y :A -87360
+:Y oA -87360
+:Y AE -87360
+u0061_0306 r -29120
+u0061_0306 y -29120
+u0061_0306 :y -29120
+u0061_0306 'y -29120
+u0061_0306 w -29120
+u0061_0328 w -29120
+/l cq 29120
+/l ' 29120
+/l a -29120
+/l u0061_0328 -29120
+/l c -29120
+/l 'c -29120
+/l d -29120
+/l e -29120
+/l u0065_0328 -29120
+/l g -29120
+/l o -29120
+/l 'o -29120
+/l s -29120
+/l u0073_0301 -29120
+u006F_030B e 29120
+u006F_030B u0065_030C 29120
+u006F_030B u0065_0328 29120
+u006F_030B `e 29120
+u006F_030B 'e 29120
+u006F_030B ^e 29120
+u006F_030B :e 29120
+u006F_030B o 29120
+u006F_030B u006F_030B 29120
+u006F_030B `o 29120
+u006F_030B 'o 29120
+u006F_030B ^o 29120
+u006F_030B ~o 29120
+u006F_030B :o 29120
+u006F_030B oe 29120
+u006F_030B /o 29120
+u006F_030B x -29120
+u006F_030B d 29120
+u006F_030B c 29120
+u006F_030B 'c 29120
+u006F_030B u0063_030C 29120
+u006F_030B ,c 29120
+u006F_030B q 29120
+u006F_030B r -29120
+u006F_030B y -29120
+u006F_030B :y -29120
+u006F_030B 'y -29120
+u006F_030B w -29120
+u0074_030C y -29120
+u0074_030C :y -29120
+u0074_030C 'y -29120
+u0074_030C w -29120
+u0074_0327 y -29120
+u0074_0327 :y -29120
+u0074_0327 'y -29120
+u0074_0327 w -29120
+u0075_030B w -29120
+u0075_030A w -29120
+:y o -29120
+:y u006F_030B -29120
+:y `o -29120
+:y 'o -29120
+:y ^o -29120
+:y ~o -29120
+:y :o -29120
+:y oe -29120
+:y /o -29120
+:y e -29120
+:y u0065_030C -29120
+:y u0065_0328 -29120
+:y `e -29120
+:y 'e -29120
+:y ^e -29120
+:y :e -29120
+:y a -29120
+:y u0061_0306 -29120
+:y u0061_0328 -29120
+:y `a -29120
+:y 'a -29120
+:y ^a -29120
+:y ^a -29120
+:y ~a -29120
+:y :a -29120
+:y oa -29120
+:y ae -29120
+:y . -87360
+:y , -87360
+`A y -29120
+`A :y -29120
+`A 'y -29120
+`A v -29120
+`A w -29120
+`A c -29120
+`A 'c -29120
+`A u0063_030C -29120
+`A ,c -29120
+`A d -29120
+`A u0064_030C -29120
+`A u0111 -29120
+`A Sd -29120
+`A e -29120
+`A u0065_030C -29120
+`A u0065_0328 -29120
+`A `e -29120
+`A 'e -29120
+`A ^e -29120
+`A :e -29120
+`A o -29120
+`A u006F_030B -29120
+`A `o -29120
+`A 'o -29120
+`A ^o -29120
+`A ~o -29120
+`A :o -29120
+`A oe -29120
+`A /o -29120
+`A q -29120
+`A t -29120
+`A u0074_030C -29120
+`A u0074_0327 -29120
+`A C -29120
+`A G -29120
+`A 'C -29120
+`A u0043_030C -29120
+`A u0047_0306 -29120
+`A ,C -29120
+`A Q -29120
+`A O -29120
+`A u004F_030B -29120
+`A `O -29120
+`A 'O -29120
+`A ^O -29120
+`A ~O -29120
+`A :O -29120
+`A OE -29120
+`A /O -29120
+`A U -29120
+`A u0055_030B -29120
+`A u0055_030A -29120
+`A `U -29120
+`A 'U -29120
+`A ^U -29120
+`A :U -29120
+`A T -87360
+`A u0054_030C -87360
+`A u0054_0327 -87360
+`A Y -87360
+`A :Y -87360
+`A 'Y -87360
+`A V -116480
+`A W -116480
+'A y -29120
+'A :y -29120
+'A 'y -29120
+'A v -29120
+'A w -29120
+'A c -29120
+'A 'c -29120
+'A u0063_030C -29120
+'A ,c -29120
+'A d -29120
+'A u0064_030C -29120
+'A u0111 -29120
+'A Sd -29120
+'A e -29120
+'A u0065_030C -29120
+'A u0065_0328 -29120
+'A `e -29120
+'A 'e -29120
+'A ^e -29120
+'A :e -29120
+'A o -29120
+'A u006F_030B -29120
+'A `o -29120
+'A 'o -29120
+'A ^o -29120
+'A ~o -29120
+'A :o -29120
+'A oe -29120
+'A /o -29120
+'A q -29120
+'A t -29120
+'A u0074_030C -29120
+'A u0074_0327 -29120
+'A C -29120
+'A G -29120
+'A 'C -29120
+'A u0043_030C -29120
+'A u0047_0306 -29120
+'A ,C -29120
+'A Q -29120
+'A O -29120
+'A u004F_030B -29120
+'A `O -29120
+'A 'O -29120
+'A ^O -29120
+'A ~O -29120
+'A :O -29120
+'A OE -29120
+'A /O -29120
+'A U -29120
+'A u0055_030B -29120
+'A u0055_030A -29120
+'A `U -29120
+'A 'U -29120
+'A ^U -29120
+'A :U -29120
+'A T -87360
+'A u0054_030C -87360
+'A u0054_0327 -87360
+'A Y -87360
+'A :Y -87360
+'A 'Y -87360
+'A V -116480
+'A W -116480
+^A y -29120
+^A :y -29120
+^A 'y -29120
+^A v -29120
+^A w -29120
+^A c -29120
+^A 'c -29120
+^A u0063_030C -29120
+^A ,c -29120
+^A d -29120
+^A u0064_030C -29120
+^A u0111 -29120
+^A Sd -29120
+^A e -29120
+^A u0065_030C -29120
+^A u0065_0328 -29120
+^A `e -29120
+^A 'e -29120
+^A ^e -29120
+^A :e -29120
+^A o -29120
+^A u006F_030B -29120
+^A `o -29120
+^A 'o -29120
+^A ^o -29120
+^A ~o -29120
+^A :o -29120
+^A oe -29120
+^A /o -29120
+^A q -29120
+^A t -29120
+^A u0074_030C -29120
+^A u0074_0327 -29120
+^A C -29120
+^A G -29120
+^A 'C -29120
+^A u0043_030C -29120
+^A u0047_0306 -29120
+^A ,C -29120
+^A Q -29120
+^A O -29120
+^A u004F_030B -29120
+^A `O -29120
+^A 'O -29120
+^A ^O -29120
+^A ~O -29120
+^A :O -29120
+^A OE -29120
+^A /O -29120
+^A U -29120
+^A u0055_030B -29120
+^A u0055_030A -29120
+^A `U -29120
+^A 'U -29120
+^A ^U -29120
+^A :U -29120
+^A T -87360
+^A u0054_030C -87360
+^A u0054_0327 -87360
+^A Y -87360
+^A :Y -87360
+^A 'Y -87360
+^A V -116480
+^A W -116480
+~A y -29120
+~A :y -29120
+~A 'y -29120
+~A v -29120
+~A w -29120
+~A c -29120
+~A 'c -29120
+~A u0063_030C -29120
+~A ,c -29120
+~A d -29120
+~A u0064_030C -29120
+~A u0111 -29120
+~A Sd -29120
+~A e -29120
+~A u0065_030C -29120
+~A u0065_0328 -29120
+~A `e -29120
+~A 'e -29120
+~A ^e -29120
+~A :e -29120
+~A o -29120
+~A u006F_030B -29120
+~A `o -29120
+~A 'o -29120
+~A ^o -29120
+~A ~o -29120
+~A :o -29120
+~A oe -29120
+~A /o -29120
+~A q -29120
+~A t -29120
+~A u0074_030C -29120
+~A u0074_0327 -29120
+~A C -29120
+~A G -29120
+~A 'C -29120
+~A u0043_030C -29120
+~A u0047_0306 -29120
+~A ,C -29120
+~A Q -29120
+~A O -29120
+~A u004F_030B -29120
+~A `O -29120
+~A 'O -29120
+~A ^O -29120
+~A ~O -29120
+~A :O -29120
+~A OE -29120
+~A /O -29120
+~A U -29120
+~A u0055_030B -29120
+~A u0055_030A -29120
+~A `U -29120
+~A 'U -29120
+~A ^U -29120
+~A :U -29120
+~A T -87360
+~A u0054_030C -87360
+~A u0054_0327 -87360
+~A Y -87360
+~A :Y -87360
+~A 'Y -87360
+~A V -116480
+~A W -116480
+:A y -29120
+:A :y -29120
+:A 'y -29120
+:A v -29120
+:A w -29120
+:A c -29120
+:A 'c -29120
+:A u0063_030C -29120
+:A ,c -29120
+:A d -29120
+:A u0064_030C -29120
+:A u0111 -29120
+:A Sd -29120
+:A e -29120
+:A u0065_030C -29120
+:A u0065_0328 -29120
+:A `e -29120
+:A 'e -29120
+:A ^e -29120
+:A :e -29120
+:A o -29120
+:A u006F_030B -29120
+:A `o -29120
+:A 'o -29120
+:A ^o -29120
+:A ~o -29120
+:A :o -29120
+:A oe -29120
+:A /o -29120
+:A q -29120
+:A t -29120
+:A u0074_030C -29120
+:A u0074_0327 -29120
+:A C -29120
+:A G -29120
+:A 'C -29120
+:A u0043_030C -29120
+:A u0047_0306 -29120
+:A ,C -29120
+:A Q -29120
+:A O -29120
+:A u004F_030B -29120
+:A `O -29120
+:A 'O -29120
+:A ^O -29120
+:A ~O -29120
+:A :O -29120
+:A OE -29120
+:A /O -29120
+:A U -29120
+:A u0055_030B -29120
+:A u0055_030A -29120
+:A `U -29120
+:A 'U -29120
+:A ^U -29120
+:A :U -29120
+:A T -87360
+:A u0054_030C -87360
+:A u0054_0327 -87360
+:A Y -87360
+:A :Y -87360
+:A 'Y -87360
+:A V -116480
+:A W -116480
+oA y -29120
+oA :y -29120
+oA 'y -29120
+oA v -29120
+oA w -29120
+oA c -29120
+oA 'c -29120
+oA u0063_030C -29120
+oA ,c -29120
+oA d -29120
+oA u0064_030C -29120
+oA u0111 -29120
+oA Sd -29120
+oA e -29120
+oA u0065_030C -29120
+oA u0065_0328 -29120
+oA `e -29120
+oA 'e -29120
+oA ^e -29120
+oA :e -29120
+oA o -29120
+oA u006F_030B -29120
+oA `o -29120
+oA 'o -29120
+oA ^o -29120
+oA ~o -29120
+oA :o -29120
+oA oe -29120
+oA /o -29120
+oA q -29120
+oA t -29120
+oA u0074_030C -29120
+oA u0074_0327 -29120
+oA C -29120
+oA G -29120
+oA 'C -29120
+oA u0043_030C -29120
+oA u0047_0306 -29120
+oA ,C -29120
+oA Q -29120
+oA O -29120
+oA u004F_030B -29120
+oA `O -29120
+oA 'O -29120
+oA ^O -29120
+oA ~O -29120
+oA :O -29120
+oA OE -29120
+oA /O -29120
+oA U -29120
+oA u0055_030B -29120
+oA u0055_030A -29120
+oA `U -29120
+oA 'U -29120
+oA ^U -29120
+oA :U -29120
+oA T -87360
+oA u0054_030C -87360
+oA u0054_0327 -87360
+oA Y -87360
+oA :Y -87360
+oA 'Y -87360
+oA V -116480
+oA W -116480
+u0189 X -29120
+u0110 X -29120
+-D X -29120
+u0189 W -29120
+u0110 W -29120
+-D W -29120
+u0189 A -29120
+u0110 A -29120
+-D A -29120
+u0189 u0041_0306 -29120
+u0110 u0041_0306 -29120
+-D u0041_0306 -29120
+u0189 u0041_0328 -29120
+u0110 u0041_0328 -29120
+-D u0041_0328 -29120
+u0189 `A -29120
+u0110 `A -29120
+-D `A -29120
+u0189 'A -29120
+u0110 'A -29120
+-D 'A -29120
+u0189 ^A -29120
+u0110 ^A -29120
+-D ^A -29120
+u0189 ~A -29120
+u0110 ~A -29120
+-D ~A -29120
+u0189 :A -29120
+u0110 :A -29120
+-D :A -29120
+u0189 oA -29120
+u0110 oA -29120
+-D oA -29120
+u0189 AE -29120
+u0110 AE -29120
+-D AE -29120
+u0189 V -29120
+u0110 V -29120
+-D V -29120
+u0189 Y -29120
+u0110 Y -29120
+-D Y -29120
+u0189 :Y -29120
+u0110 :Y -29120
+-D :Y -29120
+u0189 'Y -29120
+u0110 'Y -29120
+-D 'Y -29120
+`O X -29120
+`O W -29120
+`O A -29120
+`O u0041_0306 -29120
+`O u0041_0328 -29120
+`O `A -29120
+`O 'A -29120
+`O ^A -29120
+`O ~A -29120
+`O :A -29120
+`O oA -29120
+`O AE -29120
+`O V -29120
+`O Y -29120
+`O :Y -29120
+`O 'Y -29120
+'O X -29120
+'O W -29120
+'O A -29120
+'O u0041_0306 -29120
+'O u0041_0328 -29120
+'O `A -29120
+'O 'A -29120
+'O ^A -29120
+'O ~A -29120
+'O :A -29120
+'O oA -29120
+'O AE -29120
+'O V -29120
+'O Y -29120
+'O :Y -29120
+'O 'Y -29120
+^O X -29120
+^O W -29120
+^O A -29120
+^O u0041_0306 -29120
+^O u0041_0328 -29120
+^O `A -29120
+^O 'A -29120
+^O ^A -29120
+^O ~A -29120
+^O :A -29120
+^O oA -29120
+^O AE -29120
+^O V -29120
+^O Y -29120
+^O :Y -29120
+^O 'Y -29120
+~O X -29120
+~O W -29120
+~O A -29120
+~O u0041_0306 -29120
+~O u0041_0328 -29120
+~O `A -29120
+~O 'A -29120
+~O ^A -29120
+~O ~A -29120
+~O :A -29120
+~O oA -29120
+~O AE -29120
+~O V -29120
+~O Y -29120
+~O :Y -29120
+~O 'Y -29120
+:O X -29120
+:O W -29120
+:O A -29120
+:O u0041_0306 -29120
+:O u0041_0328 -29120
+:O `A -29120
+:O 'A -29120
+:O ^A -29120
+:O ~A -29120
+:O :A -29120
+:O oA -29120
+:O AE -29120
+:O V -29120
+:O Y -29120
+:O :Y -29120
+:O 'Y -29120
+/O X -29120
+/O W -29120
+/O A -29120
+/O u0041_0306 -29120
+/O u0041_0328 -29120
+/O `A -29120
+/O 'A -29120
+/O ^A -29120
+/O ~A -29120
+/O :A -29120
+/O oA -29120
+/O AE -29120
+/O V -29120
+/O Y -29120
+/O :Y -29120
+/O 'Y -29120
+'Y e -87360
+'Y o -87360
+'Y r -87360
+'Y a -87360
+'Y u -87360
+'Y n -87360
+'Y .i -87360
+'Y c -87360
+'Y d -87360
+'Y g -87360
+'Y p -87360
+'Y s -87360
+'Y v -87360
+'Y w -87360
+'Y x -87360
+'Y z -87360
+'Y A -87360
+'Y u0041_0306 -87360
+'Y u0041_0328 -87360
+'Y `A -87360
+'Y 'A -87360
+'Y ^A -87360
+'Y ~A -87360
+'Y :A -87360
+'Y oA -87360
+'Y AE -87360
+`a r -29120
+`a y -29120
+`a :y -29120
+`a 'y -29120
+`a w -29120
+'a r -29120
+'a y -29120
+'a :y -29120
+'a 'y -29120
+'a w -29120
+^a r -29120
+^a y -29120
+^a :y -29120
+^a 'y -29120
+^a w -29120
+~a r -29120
+~a y -29120
+~a :y -29120
+~a 'y -29120
+~a w -29120
+:a r -29120
+:a y -29120
+:a :y -29120
+:a 'y -29120
+:a w -29120
+oa r -29120
+oa y -29120
+oa :y -29120
+oa 'y -29120
+oa w -29120
+`o e 29120
+`o u0065_030C 29120
+`o u0065_0328 29120
+`o `e 29120
+`o 'e 29120
+`o ^e 29120
+`o :e 29120
+`o o 29120
+`o u006F_030B 29120
+`o `o 29120
+`o 'o 29120
+`o ^o 29120
+`o ~o 29120
+`o :o 29120
+`o oe 29120
+`o /o 29120
+`o x -29120
+`o d 29120
+`o c 29120
+`o 'c 29120
+`o u0063_030C 29120
+`o ,c 29120
+`o q 29120
+`o r -29120
+`o y -29120
+`o :y -29120
+`o 'y -29120
+`o w -29120
+'o e 29120
+'o u0065_030C 29120
+'o u0065_0328 29120
+'o `e 29120
+'o 'e 29120
+'o ^e 29120
+'o :e 29120
+'o o 29120
+'o u006F_030B 29120
+'o `o 29120
+'o 'o 29120
+'o ^o 29120
+'o ~o 29120
+'o :o 29120
+'o oe 29120
+'o /o 29120
+'o x -29120
+'o d 29120
+'o c 29120
+'o 'c 29120
+'o u0063_030C 29120
+'o ,c 29120
+'o q 29120
+'o r -29120
+'o y -29120
+'o :y -29120
+'o 'y -29120
+'o w -29120
+^o e 29120
+^o u0065_030C 29120
+^o u0065_0328 29120
+^o `e 29120
+^o 'e 29120
+^o ^e 29120
+^o :e 29120
+^o o 29120
+^o u006F_030B 29120
+^o `o 29120
+^o 'o 29120
+^o ^o 29120
+^o ~o 29120
+^o :o 29120
+^o oe 29120
+^o /o 29120
+^o x -29120
+^o d 29120
+^o c 29120
+^o 'c 29120
+^o u0063_030C 29120
+^o ,c 29120
+^o q 29120
+^o r -29120
+^o y -29120
+^o :y -29120
+^o 'y -29120
+^o w -29120
+~o e 29120
+~o u0065_030C 29120
+~o u0065_0328 29120
+~o `e 29120
+~o 'e 29120
+~o ^e 29120
+~o :e 29120
+~o o 29120
+~o u006F_030B 29120
+~o `o 29120
+~o 'o 29120
+~o ^o 29120
+~o ~o 29120
+~o :o 29120
+~o oe 29120
+~o /o 29120
+~o x -29120
+~o d 29120
+~o c 29120
+~o 'c 29120
+~o u0063_030C 29120
+~o ,c 29120
+~o q 29120
+~o r -29120
+~o y -29120
+~o :y -29120
+~o 'y -29120
+~o w -29120
+:o e 29120
+:o u0065_030C 29120
+:o u0065_0328 29120
+:o `e 29120
+:o 'e 29120
+:o ^e 29120
+:o :e 29120
+:o o 29120
+:o u006F_030B 29120
+:o `o 29120
+:o 'o 29120
+:o ^o 29120
+:o ~o 29120
+:o :o 29120
+:o oe 29120
+:o /o 29120
+:o x -29120
+:o d 29120
+:o c 29120
+:o 'c 29120
+:o u0063_030C 29120
+:o ,c 29120
+:o q 29120
+:o r -29120
+:o y -29120
+:o :y -29120
+:o 'y -29120
+:o w -29120
+/o e 29120
+/o u0065_030C 29120
+/o u0065_0328 29120
+/o `e 29120
+/o 'e 29120
+/o ^e 29120
+/o :e 29120
+/o o 29120
+/o u006F_030B 29120
+/o `o 29120
+/o 'o 29120
+/o ^o 29120
+/o ~o 29120
+/o :o 29120
+/o oe 29120
+/o /o 29120
+/o x -29120
+/o d 29120
+/o c 29120
+/o 'c 29120
+/o u0063_030C 29120
+/o ,c 29120
+/o q 29120
+/o r -29120
+/o y -29120
+/o :y -29120
+/o 'y -29120
+/o w -29120
+`u w -29120
+'u w -29120
+^u w -29120
+:u w -29120
+'y o -29120
+'y u006F_030B -29120
+'y `o -29120
+'y 'o -29120
+'y ^o -29120
+'y ~o -29120
+'y :o -29120
+'y oe -29120
+'y /o -29120
+'y e -29120
+'y u0065_030C -29120
+'y u0065_0328 -29120
+'y `e -29120
+'y 'e -29120
+'y ^e -29120
+'y :e -29120
+'y a -29120
+'y u0061_0306 -29120
+'y u0061_0328 -29120
+'y `a -29120
+'y 'a -29120
+'y ^a -29120
+'y ^a -29120
+'y ~a -29120
+'y :a -29120
+'y oa -29120
+'y ae -29120
+'y . -87360
+'y , -87360
+charset
+ga 524160,669760 2 0000
+aa 524160,669760,0,84120 2 0001
+a^ 524160,669760 2 0002
+a~ 524160,669760,0,84120 2 0003
+ad 524160,689730,0,62688 2 0004
+a" 524160,669760,0,84120 2 0005
+ao 756650,669760 2 0006
+ah 524160,669760 2 0007
+ab 524160,669760,0,87032 2 0010
+a- 524160,689730,0,103456 2 0011
+a. 291200,710738,0,81526 2 0012
+ac 465920,0,178360 1 0013
+ho 291200,0,203840 1 0014
+bq 291200,87360,131040 1 0015
+fo 465920,463008,0,39555 0 0016
+fc 465920,463008,0,39555 0 0017
+lq 349440,757120,0,155106 2 0020
+rq 349440,757120,0,9506 2 0021
+Bq 349440,87360,131040,9506 1 0022
+Fo 698880,463008,0,22390 0 0023
+Fc 698880,463008 0 0024
+en 524160,463008,0,90325 0 0025
+em 1048320,463008,0,90325 0 0026
+--- 0,463008 0 0027
+--- 465920,782600,29120,35251 3 0030
+.i 250432,463008,0,43706 0 0031
+.j 279552,463008,203840,43706 1 0032
+ff 611520,757120,0,233730 2 0033
+fi 562016,757120,0,108514 2 0034
+fl 562016,757120,0,105602 2 0035
+Fi 853216,757120,0,108514 2 0036
+Fl 853216,757120,0,105602 2 0037
+u2423 524160,463008,101920,34338 1 0040
+u01C3 334880,757120,0,66290 2 0041
+! "
+dq 524160,757120,0,56098 2 0042
+" "
+sh 873600,757120,232960,53326 3 0043
+# "
+Do 524160,782600,29120,116955 3 0044
+$ "
+% 873600,782600,29120,35251 3 0045
+& 794976,757120,0,32051 2 0046
+cq 291200,757120,0,88130 2 0047
+' "
+( 407680,782600,262080,137998 3 0050
+) 407680,782600,262080,26586 3 0051
+* 524160,782600,0,123438 2 0052
++ 815360,611520,87360,26586 3 0053
+, 291200,87360,131040 1 0054
+- 349440,463008,0,20397 0 0055
+. 291200,87360 0 0056
+sl 524160,782600,262080,137998 3 0057
+/ "
+0 524160,689730,0,116955 2 0060
+1 524160,689730,0,116955 2 0061
+2 524160,689730,0,116955 2 0062
+3 524160,689730,0,116955 2 0063
+4 524160,689730,0,116955 2 0064
+5 524160,689730,0,116955 2 0065
+6 524160,689730,0,116955 2 0066
+7 524160,689730,0,116955 2 0067
+8 524160,689730,0,116955 2 0070
+9 524160,689730,0,116955 2 0071
+: 291200,463008,0,26234 0 0072
+; 291200,463008,131040,26234 1 0073
+< 815360,571045,50091,63819 3 0074
+= 815360,387883,-136277,53326 0 0075
+> 815360,571045,50091 3 0076
+? 495040,757120,0,128744 2 0077
+at 698880,757120,0,83530 2 0100
+@ "
+A 698880,728000 2 0101
+B 698880,728000,0,86934,0,43467 2 0102
+C 669760,728000,0,125619,-75542,62810 2 0103
+D 757120,728000,0,79198,0,50078 2 0104
+E 626080,728000,0,125619,0,62810 2 0105
+F 596960,728000,0,140179,0,-5421 2 0106
+G 698880,728000,0,125619,-75542,62810 2 0107
+H 742560,728000,0,84851,0,42426 2 0110
+I 291200,728000,0,140179,0,70090 2 0111
+J 495040,728000,0,84851,0,13306 2 0112
+K 728000,728000,0,125619,0,62810 2 0113
+L 567840,728000,0,0,0,58240 2 0114
+M 917280,728000,0,84851,0,13306 2 0115
+N 742560,728000,0,84851,0,13306 2 0116
+O 771680,728000,0,79198,-75542,50078 2 0117
+P 669760,728000,0,86934,0,-58666 2 0120
+Q 771680,728000,131040,79198,-75542,79198 3 0121
+R 677040,728000,0,86934,0,65202 2 0122
+S 582400,728000,0,96499,0,48250 2 0123
+T 713440,728000,0,140179,-116054,-5421 2 0124
+U 720720,728000,0,84851,-75542,13306 2 0125
+V 698880,728000,0,169299,-111059,-63661 2 0126
+W 990080,728000,0,169299,-111059,23699 2 0127
+X 698880,728000,0,140179,0,70090 2 0130
+Y 698880,728000,0,180947,-125619,-52013 2 0131
+Z 640640,728000,0,125619,0,62810 2 0132
+lB 302848,782600,262080,167118 3 0133
+[ "
+rs 524160,782600,262080 3 0134
+\ "
+rB 302848,782600,262080,91406 3 0135
+] "
+ha 640640,757120,0,87882 2 0136
+^ "
+_ 815360,0,259754 1 0137
+oq 291200,757120,0,88130 2 0140
+` "
+a 503776,463008,0,10282 0 0141
+b 541632,757120,0,32051 2 0142
+c 465920,463008,0,87386 0 0143
+d 541632,757120,0,105602 2 0144
+e 465920,463008,0,71054 0 0145
+f 320320,757120,0,233730 2 0146
+g 524160,463008,203840,113594 1 0147
+h 541632,757120,0,18638 2 0150
+i 250432,710738,0,101877 2 0151
+j 279552,710738,203840,96086 3 0152
+k 512512,757120,0,87386 2 0153
+l 250432,757120,0,105602 2 0154
+m 832832,463008,0,18638 0 0155
+n 541632,463008,0,18638 0 0156
+o 524160,463008,0,69323 0 0157
+p 541632,463008,203840,40781 1 0160
+q 541632,463008,203840,43706 1 0161
+r 358176,463008,0,113594 0 0162
+s 401856,463008,0,81526 0 0163
+t 378560,599043,0,75738 2 0164
+u 541632,463008,0,43706 0 0165
+v 483392,463008,0,113594 0 0166
+w 716352,463008,0,113594 0 0167
+x 483392,463008,0,96086 0 0170
+y 483392,463008,203840,113594 1 0171
+z 455728,463008,0,91754 0 0172
+lC 524160,782600,262080,140910 3 0173
+{ "
+u01C0 291200,782600,262080,71610 3 0174
+ba "
+| "
+rC 524160,782600,262080,29498 3 0175
+} "
+~ 640640,710738,0,92522 2 0176
+hy 174720,463008,0,20397 0 0177
+u0041_0306 698880,931840 2 0200
+u0041_0328 698880,728000,203840 3 0201
+'C 669760,892202,0,125619 2 0202
+u0043_030C 669760,931840,0,125619,-75542,62810 2 0203
+u0044_030C 757120,931840,0,79198,0,50078 2 0204
+u0045_030C 626080,931840,0,125619,0,62810 2 0205
+u0045_0328 626080,728000,203840,125619 3 0206
+u0047_0306 698880,931840,0,125619,-75542,62810 2 0207
+u004C_0301 567840,892202,0,0,0,58240 2 0210
+u004C_030C 567840,931840,0,0,0,58240 2 0211
+/L 655200,728000 2 0212
+u004E_0301 742560,892202,0,84851 2 0213
+u004E_030C 742560,931840,0,84851,0,13306 2 0214
+u014A 786240,728000,0,154739,0,48250 2 0215
+u004F_030B 771680,892202,0,79198,-75542,50078 2 0216
+u0052_0301 677040,892202,0,86934,0,65202 2 0217
+u0052_030C 677040,931840,0,86934,0,65202 2 0220
+u0053_0301 582400,892202,0,96499 2 0221
+vS 582400,931840,0,96499,0,48250 2 0222
+u0053_0327 582400,728000,178360,96499,0,48250 3 0223
+u0054_030C 713440,931840,0,140179,-116054,-5421 2 0224
+u0054_0327 713440,728000,178360,140179,-116054,-5421 3 0225
+u0055_030B 720720,892202,0,84851,-75542,13306 2 0226
+u0055_030A 720720,931840,0,84851,-75542,13306 2 0227
+:Y 698880,931840,0,180947,-125619,-52013 2 0230
+u005A_0301 640640,892202,0,125619 2 0231
+vZ 640640,931840,0,125619,0,62810 2 0232
+u005A_0307 640640,892202,0,125619 2 0233
+IJ 757120,728000,0,84851,0,13306 2 0234
+u0049_0307 291200,892202,0,140179,0,70090 2 0235
+u0111 541632,757120,0,105602 2 0236
+sc 465920,757120,203840 3 0237
+u0061_0306 503776,669760,0,10282 2 0240
+u0061_0328 503776,463008,203840,10282 1 0241
+'c 465920,669760,0,87386 2 0242
+u0063_030C 465920,669760,0,87386 2 0243
+u0064_030C 663936,757120,0,105602 2 0244
+u0065_030C 465920,669760,0,71054 2 0245
+u0065_0328 465920,463008,203840,71054 1 0246
+u0067_0306 524160,669760,203840,113594 3 0247
+u006C_0301 250432,892202,0,105602 2 0250
+u006C_030C 372736,757120,0,105602 2 0251
+/l 340122,757120,0,105602 2 0252
+u006E_0301 541632,669760,0,18638 2 0253
+u006E_030C 541632,669760,0,18638 2 0254
+u016A 541632,463008,203840,18638 1 0255
+u006F_030B 524160,669760,0,69323 2 0256
+u0072_0301 358176,669760,0,113594 2 0257
+u0072_030C 358176,669760,0,113594 2 0260
+u0073_0301 401856,669760,0,81526 2 0261
+vs 401856,669760,0,81526 2 0262
+u0073_0327 401856,463008,178360,81526 1 0263
+u0074_030C 378560,757120,0,137634 2 0264
+u0074_0327 378560,599043,178360,75738 3 0265
+u0075_030B 541632,669760,0,43706 2 0266
+u0075_030A 541632,669760,0,43706 2 0267
+:y 483392,689730,203840,113594 3 0270
+u007A_0301 455728,669760,0,91754 2 0271
+vz 455728,669760,0,91754 2 0272
+u007A_0307 455728,710738,0,91754 2 0273
+ij 570752,710738,203840,101877 3 0274
+r! 334880,553280,203840,22962 3 0275
+r? 495040,553280,203840 3 0276
+Po 790458,757120 2 0277
+`A 698880,892202 2 0300
+'A 698880,892202,0,20814 2 0301
+^A 698880,931840 2 0302
+~A 698880,931840 2 0303
+:A 698880,931840 2 0304
+oA 698880,892202 2 0305
+AE 902720,728000,0,125619 2 0306
+,C 669760,728000,178360,125619,-75542,62810 3 0307
+`E 626080,892202,0,125619,0,62810 2 0310
+'E 626080,892202,0,125619,0,62810 2 0311
+^E 626080,931840,0,125619,0,62810 2 0312
+:E 626080,931840,0,125619 2 0313
+`I 291200,892202,0,140179,0,70090 2 0314
+'I 291200,892202,0,140179,0,70090 2 0315
+^I 291200,931840,0,140179,0,70090 2 0316
+:I 291200,931840,0,140179,0,70090 2 0317
+u0189 757120,728000,0,79198,0,50078 2 0320
+u0110 "
+-D "
+~N 742560,931840,0,84851,0,13306 2 0321
+`O 771680,892202,0,79198,-75542,50078 2 0322
+'O 771680,892202,0,79198 2 0323
+^O 771680,931840,0,79198,-75542,50078 2 0324
+~O 771680,931840,0,79198,-75542,50078 2 0325
+:O 771680,931840,0,79198,-75542,50078 2 0326
+OE 1019200,728000,0,125619 2 0327
+/O 815360,782600,50960,79198 3 0330
+`U 720720,892202,0,84851,-75542,13306 2 0331
+'U 720720,892202,0,84851 2 0332
+^U 720720,931840,0,84851,-75542,13306 2 0333
+:U 720720,931840,0,84851,-75542,13306 2 0334
+'Y 698880,892202,0,180947,-125619,-52013 2 0335
+TP 611520,728000,0,86934,0,43467 2 0336
+--- 1164800,728000,0,96499,0,48250 2 0337
+`a 503776,669760,0,10282 2 0340
+'a 503776,669760,0,10282 2 0341
+^a 503776,669760,0,10282 2 0342
+~a 503776,669760,0,10282 2 0343
+:a 503776,689730,0,10282 2 0344
+oa 503776,669760,0,10282 2 0345
+ae 757120,463008,0,71054 0 0346
+,c 465920,463008,178360,87386 1 0347
+`e 465920,669760,0,71054 2 0350
+'e 465920,669760,0,71054 2 0351
+^e 465920,669760,0,71054 2 0352
+:e 465920,689730,0,71054 2 0353
+`i 250432,669760,0,87032 2 0354
+'i 250432,669760,0,87032 2 0355
+^i 250432,669760,0,87032 2 0356
+:i 308672,689730,0,87032 2 0357
+Sd 524160,757120,0,99034 2 0360
+~n 541632,669760,0,18638 2 0361
+`o 524160,669760,0,69323 2 0362
+'o 524160,669760,0,69323 2 0363
+^o 524160,669760,0,69323 2 0364
+~o 524160,669760,0,69323 2 0365
+:o 524160,689730,0,69323 2 0366
+oe 815360,463008,0,71054 0 0367
+/o 524160,571045,101920,50810 3 0370
+`u 541632,669760,0,43706 2 0371
+'u 541632,669760,0,43706 2 0372
+^u 541632,669760,0,43706 2 0373
+:u 541632,689730,0,43706 2 0374
+'y 483392,669760,203840,113594 3 0375
+Tp 541632,757120,203840,40781 3 0376
+ss 503776,757120,0,102690 2 0377
diff --git a/font/devdvi/HITC b/font/devdvi/HITC
new file mode 100644
index 0000000..7dae369
--- /dev/null
+++ b/font/devdvi/HITC
@@ -0,0 +1,138 @@
+name HITC
+special
+internalname tcsi1000
+spacewidth 349440
+slant 11.999911
+checksum -627212161
+designsize 10485760
+charset
+--- 524160,631051 2 0000
+--- 524160,631051,0,75893 2 0001
+--- 524160,662478,0,75502 2 0002
+--- 524160,662478,0,84120 2 0003
+--- 524160,662478 2 0004
+--- 524160,631051,0,75893 2 0005
+--- 720720,662478 2 0006
+--- 524160,662478 2 0007
+--- 524160,662478,0,87032 2 0010
+--- 524160,662478,0,98680 2 0011
+--- 291200,631051 2 0012
+--- 465920,0,178360 1 0013
+--- 291200,0,203840 1 0014
+--- 407680,87360,203840 1 0015
+--- 524160,87360,203840 1 0022
+--- 698880,465920,0,90325 0 0025
+--- 786240,465920,0,90325 0 0026
+--- 0,728000 2 0027
+<- 1048320,387883,-136277 0 0030
+-> 1048320,387883,-136277 0 0031
+--- 250432,757120,0,429390 2 0032
+--- 308672,1019200,0,483269 2 0033
+--- 483392,757120,0,429390 2 0034
+--- 483392,757120,0,483269 2 0035
+--- 0,757120 2 0037
+u2422 541632,757120,0,32045 2 0040
+Do 524160,786240,29120,116955 3 0044
+$ "
+aq 291200,757120,0,85218 2 0047
+--- 524160,495040,-29120 2 0052
+, 291200,87360,131040 1 0054
+--- 349440,387883,-136277,53326 0 0055
+. 291200,87360 0 0056
+f/ 524160,786240,262080,137998 3 0057
+0 524160,465920,0,54763 0 0060
+1 524160,465920 0 0061
+2 524160,465920,0,55931 0 0062
+3 524160,465920,203840,55931 1 0063
+4 524160,465920,203840 1 0064
+5 524160,465920,203840,40794 1 0065
+6 524160,687232,0,87835 2 0066
+7 524160,465920,203840,99034 1 0067
+8 524160,687232,0,87835 2 0070
+9 524160,465920,203840,40794 1 0071
+la 407680,786240,262080 3 0074
+\- 815360,605282,87360,26586 3 0075
+ra 407680,786240,262080 3 0076
+u2127 757120,728000,0,134355,0,67178 2 0115
+ci 1164800,786240,262080 3 0117
+u03A9 757120,728000,0,86934,0,43467 2 0127
+u301A 422240,786240,262080 3 0133
+u301B 422240,786240,262080 3 0135
+ua 524160,757120,232960,64066 3 0136
+da 524160,757120,232960 3 0137
+--- 524160,757120 2 0140
+--- 524160,495040,-29120 2 0142
+--- 524160,495040,-29120 2 0143
+--- 524160,662478,29122 3 0144
+--- 1048320,757120 2 0154
+--- 524160,495040,-29120 2 0155
+u266A 640640,757120 2 0156
+ti 640640,133120 0 0176
+~ "
+--- 174720,387883,-136277,53326 0 0177
+--- 640640,757120,0,105602 2 0200
+--- 640640,757120,0,108514 2 0201
+--- 524160,757120,0,102690 2 0202
+--- 524160,757120 2 0203
+dg 465920,757120,203840 3 0204
+dd 465920,757120,203840 3 0205
+u2016 524160,786240,262080 3 0206
+%0 1223040,786240,29120,35251 3 0207
+bu 524160,465920,-58240 0 0210
+u2103 902720,728000,0,125619,-75542,62810 2 0211
+--- 640640,786240,29120,116955 3 0212
+--- 524160,560560,101920,87386 3 0213
+Fn 320320,757120,0,233730 2 0214
+u20A1 669760,786240,29120,125619,-75542,62810 3 0215
+u20A9 990080,728000,0,169299,-111059,23699 2 0216
+u20A6 771680,728000,0,84851,0,13306 2 0217
+--- 815360,786240,29120,125619,-75542,62810 3 0220
+u20B1 684320,728000,0,86934,0,-58666 2 0221
+u20A4 790458,757120 2 0222
+u211E 677040,728000,0,86934,0,65202 2 0223
+u203D 495040,757120,0,128744 2 0224
+--- 495040,560560,203840 3 0225
+u20AB 541632,786240,0,105602 2 0226
+tm 698880,786240,0,550366 2 0227
+u2031 1612550,786240,29120,35251 3 0230
+--- 495040,757120,203840 3 0231
+u0E3F 698880,786240,29120,86934,0,43467 3 0232
+u2116 859040,728000,0,84851,0,13306 2 0233
+u2052 524160,786240,0,137998 2 0234
+u212E 701792,728000,0,114690 2 0235
+u25E6 524160,465920,-58240 0 0236
+u2120 698880,786240,0,550366 2 0237
+u2045 378560,786240,262080,29498 3 0240
+u2046 378560,786240,262080,140910 3 0241
+ct 524160,560560,101920,87386 3 0242
+Po 790458,757120 2 0243
+Cs 793402,605282,0,99034 2 0244
+Ye 698880,728000,0,180947 2 0245
+bb 174720,786240,262080,108878 3 0246
+sc 465920,757120,203840 3 0247
+--- 524160,712194,0,66933 2 0250
+co 1164800,786240,262080 3 0251
+Of 465920,786240,0,116982 2 0252
+--- 1164800,786240,262080 3 0253
+tno 698880,465920,0,69914 0 0254
+u2117 1164800,786240,262080 3 0255
+rg 1164800,786240,262080 3 0256
+--- 815360,757120 2 0257
+de 349440,728000 2 0260
+t+- 815360,605282,87360,26586 3 0261
+S2 465920,786240,0,137998 2 0262
+S3 465920,786240,0,137998 2 0263
+--- 524160,757120,0,102690 2 0264
+mc 541632,465920,203840,43706 1 0265
+ps 640640,757120,203840 3 0266
+pc 247520,465920 0 0267
+u203B 679466,560560,0,20397 2 0270
+S1 465920,786240,0,137998 2 0271
+Om 465920,786240,0,116982 2 0272
+sr 495040,786240,220138,167118 3 0273
+--- 465920,786240,203840,137998 3 0274
+--- 465920,786240,203840,137998 3 0275
+--- 465920,786240,203840,137998 3 0276
+Eu 815360,728000,0,125619 2 0277
+tmu 815360,605282,87360,26586 3 0326
+tdi 815360,605282,87360,26586 3 0366
diff --git a/font/devdvi/HR b/font/devdvi/HR
new file mode 100644
index 0000000..d9d660b
--- /dev/null
+++ b/font/devdvi/HR
@@ -0,0 +1,297 @@
+name HR
+internalname cmss10
+spacewidth 349526
+ligatures ff fi fl ffi ffl 0
+checksum 1831058770
+designsize 10485760
+kernpairs
+ff cq 72818
+ff ' 72818
+ff ? 72818
+ff ! 72818
+ff ) 72818
+ff rB 72818
+ff ] 72818
+slash@for@l l -250494
+slash@for@l L -270885
+cq ? 116509
+' ? 116509
+cq ! 116509
+' ! 116509
+A t -29128
+A C -29128
+A O -29128
+A G -29128
+A U -29128
+A Q -29128
+A T -87382
+A Y -87382
+A V -116509
+A W -116509
+D X -29128
+D W -29128
+D A -29128
+D V -29128
+D Y -29128
+F o -29128
+F e -29128
+F u -29128
+F r -29128
+F a -29128
+F A -87382
+F O -29128
+F C -29128
+F G -29128
+F Q -29128
+I I 29128
+K O -29128
+K C -29128
+K G -29128
+K Q -29128
+L T -87382
+L Y -87382
+L V -116509
+L W -116509
+O X -29128
+O W -29128
+O A -29128
+O V -29128
+O Y -29128
+P A -87382
+P o -29128
+P e -29128
+P a -29128
+P . -87382
+P , -87382
+T y -87382
+T e -87382
+T o -87382
+T r -87382
+T a -87382
+T A -87382
+T u -87382
+V o -29128
+V e -29128
+V u -29128
+V r -29128
+V a -29128
+V A -87382
+V O -29128
+V C -29128
+V G -29128
+V Q -29128
+W o -29128
+W e -29128
+W u -29128
+W r -29128
+W a -29128
+W A -87382
+W O -29128
+W C -29128
+W G -29128
+W Q -29128
+X O -29128
+X C -29128
+X G -29128
+X Q -29128
+Y e -87382
+Y o -87382
+Y r -87382
+Y a -87382
+Y A -87382
+Y u -87382
+a r -29128
+a y -29128
+a w -29128
+b e 29128
+b o 29128
+b x -29128
+b d 29128
+b c 29128
+b q 29128
+b r -29128
+b y -29128
+b w -29128
+f cq 72818
+f ' 72818
+f ? 72818
+f ! 72818
+f ) 72818
+f rB 72818
+f ] 72818
+g j 29128
+k e -29128
+k a -29128
+k o -29128
+k c -29128
+o e 29128
+o o 29128
+o x -29128
+o d 29128
+o c 29128
+o q 29128
+o r -29128
+o y -29128
+o w -29128
+p e 29128
+p o 29128
+p x -29128
+p d 29128
+p c 29128
+p q 29128
+p r -29128
+p y -29128
+p w -29128
+t y -29128
+t w -29128
+u w -29128
+w e -29128
+w a -29128
+w o -29128
+w c -29128
+y o -29128
+y e -29128
+y a -29128
+y . -87382
+y , -87382
+charset
+*G 567981,728178,0,0,0,-145637 2 0000
+*D 873816,728178 2 0001
+*H 815562,728178,0,0,-29128,-29128 2 0002
+*L 640800,728178 2 0003
+*C 699053,728178 2 0004
+*P 742746,728178 2 0005
+*S 757307,728178 2 0006
+*U 815562,728178,0,0,-29128,-145637 2 0007
+*F 757307,728178,0,0,-29128 2 0010
+*Q 815562,728178,0,0,-29128,-72818 2 0011
+*W 757307,728178 2 0012
+ff 611672,728178,0,72818 2 0013
+fi 562155,728178 2 0014
+fl 562155,728178 2 0015
+Fi 853427,728178 2 0016
+Fl 853427,728178 2 0017
+.i 250494,466034 0 0020
+.j 279622,466034,203890 1 0021
+ga 524290,728178 2 0022
+aa 524290,728178 2 0023
+ah 524290,662642 2 0024
+ab 524290,728178 2 0025
+a- 524290,638464 2 0026
+ao 699054,728178 2 0027
+ac 466035,0,178403 1 0030
+ss 503902,728178 2 0031
+ae 757307,466034 0 0032
+oe 815562,466034 0 0033
+/o 524290,567979,101946 3 0034
+AE 902944,728178 2 0035
+OE 1019453,728178 2 0036
+/O 815562,779150,50973 3 0037
+slash@for@l 250494,466034 0 0040
+! 334963,728178 2 0041
+rq 524290,728178 2 0042
+sh 873816,728178,203888 3 0043
+# "
+Do 524290,786432,58254 3 0044
+$ "
+% 873816,786432,58254 3 0045
+& 795173,728178 2 0046
+cq 291272,728178 2 0047
+' "
+( 407781,786432,262144 3 0050
+) 407781,786432,262144 3 0051
+* 524290,786432 2 0052
++ 815562,611670,87382 3 0053
+, 291272,87381,131072 1 0054
+hy 349526,466034 0 0055
+- "
+. 291272,87381 0 0056
+sl 524290,786432,262144 3 0057
+/ "
+0 524290,687400 2 0060
+1 524290,687400 2 0061
+2 524290,687400 2 0062
+3 524290,687400 2 0063
+4 524290,687400 2 0064
+5 524290,687400 2 0065
+6 524290,687400 2 0066
+7 524290,687400 2 0067
+8 524290,687400 2 0070
+9 524290,687400 2 0071
+: 291272,466034 0 0072
+; 291272,466034,131072 1 0073
+r! 334963,524288,203890 3 0074
+= 815562,387973,-136315 0 0075
+r? 495163,524288,203890 3 0076
+? 495163,728178 2 0077
+at 699053,728178 2 0100
+@ "
+A 699054,728178 2 0101
+B 699054,728178 2 0102
+C 669926,728178,0,0,-29128 2 0103
+D 757309,728178,0,0,0,-29128 2 0104
+E 626235,728178 2 0105
+F 597109,728178,0,0,0,-145637 2 0106
+G 699053,728178,0,0,-29128 2 0107
+H 742746,728178 2 0110
+I 291274,728178 2 0111
+J 495163,728178,0,0,0,-29128 2 0112
+K 728182,728178 2 0113
+L 567981,728178,0,0,0,58254 2 0114
+M 917509,728178 2 0115
+N 742746,728178 2 0116
+O 771870,728178,0,0,-29128,-29128 2 0117
+P 669926,728178,0,0,0,-145637 2 0120
+Q 771870,728178,131072,0,-29128 3 0121
+R 677208,728178 2 0122
+S 582544,728178 2 0123
+T 713616,728178,0,0,0,-145637 2 0124
+U 720901,728178,0,0,29126 2 0125
+V 699054,728178,0,14563,43691,-218454 2 0126
+W 990326,728178,0,14563,43691,-131074 2 0127
+X 699054,728178 2 0130
+Y 699054,728178,0,26214,29128,-206803 2 0131
+Z 640798,728178 2 0132
+lB 302923,786432,262144 3 0133
+[ "
+lq 524290,728178 2 0134
+rB 302923,786432,262144 3 0135
+] "
+ha 524290,728178 2 0136
+^ "
+a^ "
+a. 291272,712366 2 0137
+oq 291272,728178 2 0140
+` "
+a 503901,466034 0 0141
+b 541766,728178 2 0142
+c 466035,466034 0 0143
+d 541766,728178 2 0144
+e 466035,466034 0 0145
+f 320400,728178,0,72818 2 0146
+g 524290,466034,203890,14563 1 0147
+h 541766,728178 2 0150
+i 250494,712366 2 0151
+j 279622,712366,203890 3 0152
+k 512640,728178 2 0153
+l 250494,728178 2 0154
+m 833038,466034 0 0155
+n 541766,466034 0 0156
+o 524290,466034 0 0157
+p 541766,466034,203890 1 0160
+q 541766,466034,203890 1 0161
+r 358266,466034,0,14563 0 0162
+s 401955,466034 0 0163
+t 378653,599189 2 0164
+u 541766,466034 0 0165
+v 483512,466034,0,14563 0 0166
+w 716530,466034,0,14563 0 0167
+x 483512,466034 0 0170
+y 483512,466034,203890,14563 1 0171
+z 455840,466034 0 0172
+en 524290,466034,0,29128 0 0173
+em 1048579,466034,0,29128 0 0174
+a" 524290,728178 2 0175
+~ 524290,709454 2 0176
+a~ "
+ad 524290,712366 2 0177
diff --git a/font/devdvi/HREC b/font/devdvi/HREC
new file mode 100644
index 0000000..735f2f1
--- /dev/null
+++ b/font/devdvi/HREC
@@ -0,0 +1,2078 @@
+name HREC
+internalname ecss1000
+spacewidth 349440
+ligatures ff fi fl ffi ffl 0
+checksum -1936902655
+designsize 10485760
+kernpairs
+bq Bq 116480
+bq j 116480
+bq .j 116480
+bq g 58240
+bq u0067_0306 58240
+bq y 58240
+bq :y 58240
+bq 'y 58240
+bq v -87360
+bq w -58240
+bq V -116480
+bq W -87360
+bq Y -87360
+bq :Y -87360
+bq 'Y -87360
+bq O -29120
+bq u004F_030B -29120
+bq `O -29120
+bq 'O -29120
+bq ^O -29120
+bq ~O -29120
+bq :O -29120
+bq OE -29120
+bq /O -29120
+bq C -29120
+bq G -29120
+bq 'C -29120
+bq u0043_030C -29120
+bq u0047_0306 -29120
+bq ,C -29120
+bq Q -29120
+lq oq 116480
+lq ` 116480
+lq lq 116480
+rq cq 116480
+rq ' 116480
+rq rq 116480
+Bq bq 116480
+Bq , 116480
+Bq Bq 116480
+Bq j 116480
+Bq .j 116480
+Bq g 58240
+Bq u0067_0306 58240
+Bq y 58240
+Bq :y 58240
+Bq 'y 58240
+Bq v -87360
+Bq w -58240
+Bq V -116480
+Bq W -87360
+Bq Y -87360
+Bq :Y -87360
+Bq 'Y -87360
+Bq O -29120
+Bq u004F_030B -29120
+Bq `O -29120
+Bq 'O -29120
+Bq ^O -29120
+Bq ~O -29120
+Bq :O -29120
+Bq OE -29120
+Bq /O -29120
+Bq C -29120
+Bq G -29120
+Bq 'C -29120
+Bq u0043_030C -29120
+Bq u0047_0306 -29120
+Bq ,C -29120
+Bq Q -29120
+Fc . -87360
+Fc , -87360
+ff cq 72800
+ff ' 72800
+ff oq 72800
+ff ` 72800
+ff lq 72800
+ff rq 72800
+ff ? 72800
+ff u01C3 72800
+ff ! 72800
+ff ) 72800
+ff rB 72800
+ff ] 72800
+cq rq 116480
+' rq 116480
+cq ? 116480
+' ? 116480
+cq u01C3 116480
+cq ! 116480
+' u01C3 116480
+' ! 116480
+A y -29120
+A :y -29120
+A 'y -29120
+A v -29120
+A w -29120
+A c -29120
+A 'c -29120
+A u0063_030C -29120
+A ,c -29120
+A d -29120
+A u0064_030C -29120
+A u0111 -29120
+A Sd -29120
+A e -29120
+A u0065_030C -29120
+A u0065_0328 -29120
+A `e -29120
+A 'e -29120
+A ^e -29120
+A :e -29120
+A o -29120
+A u006F_030B -29120
+A `o -29120
+A 'o -29120
+A ^o -29120
+A ~o -29120
+A :o -29120
+A oe -29120
+A /o -29120
+A q -29120
+A t -29120
+A u0074_030C -29120
+A u0074_0327 -29120
+A C -29120
+A G -29120
+A 'C -29120
+A u0043_030C -29120
+A u0047_0306 -29120
+A ,C -29120
+A Q -29120
+A O -29120
+A u004F_030B -29120
+A `O -29120
+A 'O -29120
+A ^O -29120
+A ~O -29120
+A :O -29120
+A OE -29120
+A /O -29120
+A U -29120
+A u0055_030B -29120
+A u0055_030A -29120
+A `U -29120
+A 'U -29120
+A ^U -29120
+A :U -29120
+A T -87360
+A u0054_030C -87360
+A u0054_0327 -87360
+A Y -87360
+A :Y -87360
+A 'Y -87360
+A V -116480
+A W -116480
+D X -29120
+D W -29120
+D A -29120
+D u0041_0306 -29120
+D u0041_0328 -29120
+D `A -29120
+D 'A -29120
+D ^A -29120
+D ~A -29120
+D :A -29120
+D oA -29120
+D AE -29120
+D V -29120
+D Y -29120
+D :Y -29120
+D 'Y -29120
+F o -29120
+F a -29120
+F e -29120
+F y -29120
+F u -29120
+F r -29120
+F v -29120
+F s -29120
+F c -29120
+F d -29120
+F g -29120
+F m -29120
+F n -29120
+F p -29120
+F w -29120
+F z -29120
+F ae -29120
+F /o -29120
+F A -87360
+F u0041_0306 -87360
+F u0041_0328 -87360
+F `A -87360
+F 'A -87360
+F ^A -87360
+F ~A -87360
+F :A -87360
+F oA -87360
+F AE -87360
+F O -29120
+F u004F_030B -29120
+F `O -29120
+F 'O -29120
+F ^O -29120
+F ~O -29120
+F :O -29120
+F OE -29120
+F /O -29120
+F C -29120
+F G -29120
+F 'C -29120
+F u0043_030C -29120
+F u0047_0306 -29120
+F ,C -29120
+F Q -29120
+I I 29120
+K v -29120
+K o -29120
+K u006F_030B -29120
+K `o -29120
+K 'o -29120
+K ^o -29120
+K ~o -29120
+K :o -29120
+K oe -29120
+K /o -29120
+K C -29120
+K G -29120
+K 'C -29120
+K u0043_030C -29120
+K u0047_0306 -29120
+K ,C -29120
+K Q -29120
+L T -87360
+L u0054_030C -87360
+L u0054_0327 -87360
+L Y -87360
+L :Y -87360
+L 'Y -87360
+L V -116480
+L W -116480
+O X -29120
+O W -29120
+O A -29120
+O u0041_0306 -29120
+O u0041_0328 -29120
+O `A -29120
+O 'A -29120
+O ^A -29120
+O ~A -29120
+O :A -29120
+O oA -29120
+O AE -29120
+O V -29120
+O Y -29120
+O :Y -29120
+O 'Y -29120
+P A -87360
+P u0041_0306 -87360
+P u0041_0328 -87360
+P `A -87360
+P 'A -87360
+P ^A -87360
+P ~A -87360
+P :A -87360
+P oA -87360
+P AE -87360
+P o -29120
+P u006F_030B -29120
+P `o -29120
+P 'o -29120
+P ^o -29120
+P ~o -29120
+P :o -29120
+P oe -29120
+P /o -29120
+P e -29120
+P u0065_030C -29120
+P u0065_0328 -29120
+P `e -29120
+P 'e -29120
+P ^e -29120
+P :e -29120
+P a -29120
+P u0061_0306 -29120
+P u0061_0328 -29120
+P `a -29120
+P 'a -29120
+P ^a -29120
+P ^a -29120
+P ~a -29120
+P :a -29120
+P oa -29120
+P ae -29120
+P . -87360
+P , -87360
+T y -87360
+T e -87360
+T o -87360
+T r -87360
+T a -87360
+T u -87360
+T n -87360
+T .i -87360
+T c -87360
+T d -87360
+T g -87360
+T p -87360
+T s -87360
+T v -87360
+T w -87360
+T x -87360
+T z -87360
+T A -87360
+T u0041_0306 -87360
+T u0041_0328 -87360
+T `A -87360
+T 'A -87360
+T ^A -87360
+T ~A -87360
+T :A -87360
+T oA -87360
+T AE -87360
+V o -29120
+V a -29120
+V e -29120
+V y -29120
+V u -29120
+V r -29120
+V v -29120
+V s -29120
+V c -29120
+V d -29120
+V g -29120
+V m -29120
+V n -29120
+V p -29120
+V w -29120
+V z -29120
+V ae -29120
+V /o -29120
+V A -87360
+V u0041_0306 -87360
+V u0041_0328 -87360
+V `A -87360
+V 'A -87360
+V ^A -87360
+V ~A -87360
+V :A -87360
+V oA -87360
+V AE -87360
+V O -29120
+V u004F_030B -29120
+V `O -29120
+V 'O -29120
+V ^O -29120
+V ~O -29120
+V :O -29120
+V OE -29120
+V /O -29120
+V C -29120
+V G -29120
+V 'C -29120
+V u0043_030C -29120
+V u0047_0306 -29120
+V ,C -29120
+V Q -29120
+W o -29120
+W a -29120
+W e -29120
+W y -29120
+W u -29120
+W r -29120
+W v -29120
+W s -29120
+W c -29120
+W d -29120
+W g -29120
+W m -29120
+W n -29120
+W p -29120
+W w -29120
+W z -29120
+W ae -29120
+W /o -29120
+W A -87360
+W u0041_0306 -87360
+W u0041_0328 -87360
+W `A -87360
+W 'A -87360
+W ^A -87360
+W ~A -87360
+W :A -87360
+W oA -87360
+W AE -87360
+W O -29120
+W u004F_030B -29120
+W `O -29120
+W 'O -29120
+W ^O -29120
+W ~O -29120
+W :O -29120
+W OE -29120
+W /O -29120
+W C -29120
+W G -29120
+W 'C -29120
+W u0043_030C -29120
+W u0047_0306 -29120
+W ,C -29120
+W Q -29120
+X O -29120
+X u004F_030B -29120
+X `O -29120
+X 'O -29120
+X ^O -29120
+X ~O -29120
+X :O -29120
+X OE -29120
+X /O -29120
+X C -29120
+X G -29120
+X 'C -29120
+X u0043_030C -29120
+X u0047_0306 -29120
+X ,C -29120
+X Q -29120
+Y e -87360
+Y o -87360
+Y r -87360
+Y a -87360
+Y u -87360
+Y n -87360
+Y .i -87360
+Y c -87360
+Y d -87360
+Y g -87360
+Y p -87360
+Y s -87360
+Y v -87360
+Y w -87360
+Y x -87360
+Y z -87360
+Y A -87360
+Y u0041_0306 -87360
+Y u0041_0328 -87360
+Y `A -87360
+Y 'A -87360
+Y ^A -87360
+Y ~A -87360
+Y :A -87360
+Y oA -87360
+Y AE -87360
+oq lq 116480
+` lq 116480
+oq ? 116480
+` ? 116480
+oq u01C3 116480
+oq ! 116480
+` u01C3 116480
+` ! 116480
+a r -29120
+a y -29120
+a :y -29120
+a 'y -29120
+a w -29120
+b e 29120
+b u0065_030C 29120
+b u0065_0328 29120
+b `e 29120
+b 'e 29120
+b ^e 29120
+b :e 29120
+b o 29120
+b u006F_030B 29120
+b `o 29120
+b 'o 29120
+b ^o 29120
+b ~o 29120
+b :o 29120
+b oe 29120
+b /o 29120
+b x -29120
+b d 29120
+b c 29120
+b 'c 29120
+b u0063_030C 29120
+b ,c 29120
+b q 29120
+b r -29120
+b y -29120
+b :y -29120
+b 'y -29120
+b w -29120
+e V -87360
+f cq 72800
+f ' 72800
+f oq 72800
+f ` 72800
+f lq 72800
+f rq 72800
+f ? 72800
+f u01C3 72800
+f ! 72800
+f ) 72800
+f rB 72800
+f ] 72800
+g j 29120
+k W -87360
+k V -87360
+k e -29120
+k u0065_030C -29120
+k u0065_0328 -29120
+k `e -29120
+k 'e -29120
+k ^e -29120
+k :e -29120
+k a -29120
+k u0061_0306 -29120
+k u0061_0328 -29120
+k `a -29120
+k 'a -29120
+k ^a -29120
+k ^a -29120
+k ~a -29120
+k :a -29120
+k oa -29120
+k ae -29120
+k o -29120
+k u006F_030B -29120
+k `o -29120
+k 'o -29120
+k ^o -29120
+k ~o -29120
+k :o -29120
+k oe -29120
+k /o -29120
+k c -29120
+k 'c -29120
+k u0063_030C -29120
+k ,c -29120
+o e 29120
+o u0065_030C 29120
+o u0065_0328 29120
+o `e 29120
+o 'e 29120
+o ^e 29120
+o :e 29120
+o o 29120
+o u006F_030B 29120
+o `o 29120
+o 'o 29120
+o ^o 29120
+o ~o 29120
+o :o 29120
+o oe 29120
+o /o 29120
+o x -29120
+o d 29120
+o c 29120
+o 'c 29120
+o u0063_030C 29120
+o ,c 29120
+o q 29120
+o r -29120
+o y -29120
+o :y -29120
+o 'y -29120
+o w -29120
+p e 29120
+p u0065_030C 29120
+p u0065_0328 29120
+p `e 29120
+p 'e 29120
+p ^e 29120
+p :e 29120
+p o 29120
+p u006F_030B 29120
+p `o 29120
+p 'o 29120
+p ^o 29120
+p ~o 29120
+p :o 29120
+p oe 29120
+p /o 29120
+p x -29120
+p d 29120
+p c 29120
+p 'c 29120
+p u0063_030C 29120
+p ,c 29120
+p q 29120
+p r -29120
+p y -29120
+p :y -29120
+p 'y -29120
+p w -29120
+t y -29120
+t :y -29120
+t 'y -29120
+t w -29120
+u w -29120
+w e -29120
+w u0065_030C -29120
+w u0065_0328 -29120
+w `e -29120
+w 'e -29120
+w ^e -29120
+w :e -29120
+w a -29120
+w u0061_0306 -29120
+w u0061_0328 -29120
+w `a -29120
+w 'a -29120
+w ^a -29120
+w ^a -29120
+w ~a -29120
+w :a -29120
+w oa -29120
+w ae -29120
+w o -29120
+w u006F_030B -29120
+w `o -29120
+w 'o -29120
+w ^o -29120
+w ~o -29120
+w :o -29120
+w oe -29120
+w /o -29120
+w c -29120
+w 'c -29120
+w u0063_030C -29120
+w ,c -29120
+y o -29120
+y u006F_030B -29120
+y `o -29120
+y 'o -29120
+y ^o -29120
+y ~o -29120
+y :o -29120
+y oe -29120
+y /o -29120
+y e -29120
+y u0065_030C -29120
+y u0065_0328 -29120
+y `e -29120
+y 'e -29120
+y ^e -29120
+y :e -29120
+y a -29120
+y u0061_0306 -29120
+y u0061_0328 -29120
+y `a -29120
+y 'a -29120
+y ^a -29120
+y ^a -29120
+y ~a -29120
+y :a -29120
+y oa -29120
+y ae -29120
+y . -87360
+y , -87360
+u0041_0306 y -29120
+u0041_0306 :y -29120
+u0041_0306 'y -29120
+u0041_0306 v -29120
+u0041_0306 w -29120
+u0041_0306 c -29120
+u0041_0306 'c -29120
+u0041_0306 u0063_030C -29120
+u0041_0306 ,c -29120
+u0041_0306 d -29120
+u0041_0306 u0064_030C -29120
+u0041_0306 u0111 -29120
+u0041_0306 Sd -29120
+u0041_0306 e -29120
+u0041_0306 u0065_030C -29120
+u0041_0306 u0065_0328 -29120
+u0041_0306 `e -29120
+u0041_0306 'e -29120
+u0041_0306 ^e -29120
+u0041_0306 :e -29120
+u0041_0306 o -29120
+u0041_0306 u006F_030B -29120
+u0041_0306 `o -29120
+u0041_0306 'o -29120
+u0041_0306 ^o -29120
+u0041_0306 ~o -29120
+u0041_0306 :o -29120
+u0041_0306 oe -29120
+u0041_0306 /o -29120
+u0041_0306 q -29120
+u0041_0306 t -29120
+u0041_0306 u0074_030C -29120
+u0041_0306 u0074_0327 -29120
+u0041_0306 C -29120
+u0041_0306 G -29120
+u0041_0306 'C -29120
+u0041_0306 u0043_030C -29120
+u0041_0306 u0047_0306 -29120
+u0041_0306 ,C -29120
+u0041_0306 Q -29120
+u0041_0306 O -29120
+u0041_0306 u004F_030B -29120
+u0041_0306 `O -29120
+u0041_0306 'O -29120
+u0041_0306 ^O -29120
+u0041_0306 ~O -29120
+u0041_0306 :O -29120
+u0041_0306 OE -29120
+u0041_0306 /O -29120
+u0041_0306 U -29120
+u0041_0306 u0055_030B -29120
+u0041_0306 u0055_030A -29120
+u0041_0306 `U -29120
+u0041_0306 'U -29120
+u0041_0306 ^U -29120
+u0041_0306 :U -29120
+u0041_0306 T -87360
+u0041_0306 u0054_030C -87360
+u0041_0306 u0054_0327 -87360
+u0041_0306 Y -87360
+u0041_0306 :Y -87360
+u0041_0306 'Y -87360
+u0041_0306 V -116480
+u0041_0306 W -116480
+'C v -29120
+'C w -29120
+'C c -29120
+'C 'c -29120
+'C u0063_030C -29120
+'C ,c -29120
+'C d -29120
+'C u0064_030C -29120
+'C u0111 -29120
+'C Sd -29120
+'C e -29120
+'C u0065_030C -29120
+'C u0065_0328 -29120
+'C `e -29120
+'C 'e -29120
+'C ^e -29120
+'C :e -29120
+'C o -29120
+'C u006F_030B -29120
+'C `o -29120
+'C 'o -29120
+'C ^o -29120
+'C ~o -29120
+'C :o -29120
+'C oe -29120
+'C /o -29120
+'C q -29120
+'C t -29120
+'C u0074_030C -29120
+'C u0074_0327 -29120
+'C C -29120
+'C G -29120
+'C 'C -29120
+'C u0043_030C -29120
+'C u0047_0306 -29120
+'C ,C -29120
+'C Q -29120
+'C O -29120
+'C u004F_030B -29120
+'C `O -29120
+'C 'O -29120
+'C ^O -29120
+'C ~O -29120
+'C :O -29120
+'C OE -29120
+'C /O -29120
+'C U -29120
+'C u0055_030B -29120
+'C u0055_030A -29120
+'C `U -29120
+'C 'U -29120
+'C ^U -29120
+'C :U -29120
+'C T -87360
+'C u0054_030C -87360
+'C u0054_0327 -87360
+'C Y -87360
+'C :Y -87360
+'C 'Y -87360
+'C V -116480
+'C W -116480
+u0044_030C X -29120
+u0044_030C W -29120
+u0044_030C A -29120
+u0044_030C u0041_0306 -29120
+u0044_030C u0041_0328 -29120
+u0044_030C `A -29120
+u0044_030C 'A -29120
+u0044_030C ^A -29120
+u0044_030C ~A -29120
+u0044_030C :A -29120
+u0044_030C oA -29120
+u0044_030C AE -29120
+u0044_030C V -29120
+u0044_030C Y -29120
+u0044_030C :Y -29120
+u0044_030C 'Y -29120
+u004C_0301 T -87360
+u004C_0301 u0054_030C -87360
+u004C_0301 u0054_0327 -87360
+u004C_0301 Y -87360
+u004C_0301 :Y -87360
+u004C_0301 'Y -87360
+u004C_0301 V -116480
+u004C_0301 W -116480
+u004C_030C T -87360
+u004C_030C u0054_030C -87360
+u004C_030C u0054_0327 -87360
+u004C_030C Y -87360
+u004C_030C :Y -87360
+u004C_030C 'Y -87360
+u004C_030C V -116480
+u004C_030C W -116480
+/L T -87360
+/L u0054_030C -87360
+/L u0054_0327 -87360
+/L Y -87360
+/L :Y -87360
+/L 'Y -87360
+/L V -116480
+/L W -116480
+u004F_030B X -29120
+u004F_030B W -29120
+u004F_030B A -29120
+u004F_030B u0041_0306 -29120
+u004F_030B u0041_0328 -29120
+u004F_030B `A -29120
+u004F_030B 'A -29120
+u004F_030B ^A -29120
+u004F_030B ~A -29120
+u004F_030B :A -29120
+u004F_030B oA -29120
+u004F_030B AE -29120
+u004F_030B V -29120
+u004F_030B Y -29120
+u004F_030B :Y -29120
+u004F_030B 'Y -29120
+u0054_030C y -87360
+u0054_030C e -87360
+u0054_030C o -87360
+u0054_030C r -87360
+u0054_030C a -87360
+u0054_030C u -87360
+u0054_030C n -87360
+u0054_030C .i -87360
+u0054_030C c -87360
+u0054_030C d -87360
+u0054_030C g -87360
+u0054_030C p -87360
+u0054_030C s -87360
+u0054_030C v -87360
+u0054_030C w -87360
+u0054_030C x -87360
+u0054_030C z -87360
+u0054_030C A -87360
+u0054_030C u0041_0306 -87360
+u0054_030C u0041_0328 -87360
+u0054_030C `A -87360
+u0054_030C 'A -87360
+u0054_030C ^A -87360
+u0054_030C ~A -87360
+u0054_030C :A -87360
+u0054_030C oA -87360
+u0054_030C AE -87360
+u0054_0327 y -87360
+u0054_0327 e -87360
+u0054_0327 o -87360
+u0054_0327 r -87360
+u0054_0327 a -87360
+u0054_0327 u -87360
+u0054_0327 n -87360
+u0054_0327 .i -87360
+u0054_0327 c -87360
+u0054_0327 d -87360
+u0054_0327 g -87360
+u0054_0327 p -87360
+u0054_0327 s -87360
+u0054_0327 v -87360
+u0054_0327 w -87360
+u0054_0327 x -87360
+u0054_0327 z -87360
+u0054_0327 A -87360
+u0054_0327 u0041_0306 -87360
+u0054_0327 u0041_0328 -87360
+u0054_0327 `A -87360
+u0054_0327 'A -87360
+u0054_0327 ^A -87360
+u0054_0327 ~A -87360
+u0054_0327 :A -87360
+u0054_0327 oA -87360
+u0054_0327 AE -87360
+:Y e -87360
+:Y o -87360
+:Y r -87360
+:Y a -87360
+:Y u -87360
+:Y n -87360
+:Y .i -87360
+:Y c -87360
+:Y d -87360
+:Y g -87360
+:Y p -87360
+:Y s -87360
+:Y v -87360
+:Y w -87360
+:Y x -87360
+:Y z -87360
+:Y A -87360
+:Y u0041_0306 -87360
+:Y u0041_0328 -87360
+:Y `A -87360
+:Y 'A -87360
+:Y ^A -87360
+:Y ~A -87360
+:Y :A -87360
+:Y oA -87360
+:Y AE -87360
+u0061_0306 r -29120
+u0061_0306 y -29120
+u0061_0306 :y -29120
+u0061_0306 'y -29120
+u0061_0306 w -29120
+u0061_0328 w -29120
+/l cq 29120
+/l ' 29120
+/l a -29120
+/l u0061_0328 -29120
+/l c -29120
+/l 'c -29120
+/l d -29120
+/l e -29120
+/l u0065_0328 -29120
+/l g -29120
+/l o -29120
+/l 'o -29120
+/l s -29120
+/l u0073_0301 -29120
+u006F_030B e 29120
+u006F_030B u0065_030C 29120
+u006F_030B u0065_0328 29120
+u006F_030B `e 29120
+u006F_030B 'e 29120
+u006F_030B ^e 29120
+u006F_030B :e 29120
+u006F_030B o 29120
+u006F_030B u006F_030B 29120
+u006F_030B `o 29120
+u006F_030B 'o 29120
+u006F_030B ^o 29120
+u006F_030B ~o 29120
+u006F_030B :o 29120
+u006F_030B oe 29120
+u006F_030B /o 29120
+u006F_030B x -29120
+u006F_030B d 29120
+u006F_030B c 29120
+u006F_030B 'c 29120
+u006F_030B u0063_030C 29120
+u006F_030B ,c 29120
+u006F_030B q 29120
+u006F_030B r -29120
+u006F_030B y -29120
+u006F_030B :y -29120
+u006F_030B 'y -29120
+u006F_030B w -29120
+u0074_030C y -29120
+u0074_030C :y -29120
+u0074_030C 'y -29120
+u0074_030C w -29120
+u0074_0327 y -29120
+u0074_0327 :y -29120
+u0074_0327 'y -29120
+u0074_0327 w -29120
+u0075_030B w -29120
+u0075_030A w -29120
+:y o -29120
+:y u006F_030B -29120
+:y `o -29120
+:y 'o -29120
+:y ^o -29120
+:y ~o -29120
+:y :o -29120
+:y oe -29120
+:y /o -29120
+:y e -29120
+:y u0065_030C -29120
+:y u0065_0328 -29120
+:y `e -29120
+:y 'e -29120
+:y ^e -29120
+:y :e -29120
+:y a -29120
+:y u0061_0306 -29120
+:y u0061_0328 -29120
+:y `a -29120
+:y 'a -29120
+:y ^a -29120
+:y ^a -29120
+:y ~a -29120
+:y :a -29120
+:y oa -29120
+:y ae -29120
+:y . -87360
+:y , -87360
+`A y -29120
+`A :y -29120
+`A 'y -29120
+`A v -29120
+`A w -29120
+`A c -29120
+`A 'c -29120
+`A u0063_030C -29120
+`A ,c -29120
+`A d -29120
+`A u0064_030C -29120
+`A u0111 -29120
+`A Sd -29120
+`A e -29120
+`A u0065_030C -29120
+`A u0065_0328 -29120
+`A `e -29120
+`A 'e -29120
+`A ^e -29120
+`A :e -29120
+`A o -29120
+`A u006F_030B -29120
+`A `o -29120
+`A 'o -29120
+`A ^o -29120
+`A ~o -29120
+`A :o -29120
+`A oe -29120
+`A /o -29120
+`A q -29120
+`A t -29120
+`A u0074_030C -29120
+`A u0074_0327 -29120
+`A C -29120
+`A G -29120
+`A 'C -29120
+`A u0043_030C -29120
+`A u0047_0306 -29120
+`A ,C -29120
+`A Q -29120
+`A O -29120
+`A u004F_030B -29120
+`A `O -29120
+`A 'O -29120
+`A ^O -29120
+`A ~O -29120
+`A :O -29120
+`A OE -29120
+`A /O -29120
+`A U -29120
+`A u0055_030B -29120
+`A u0055_030A -29120
+`A `U -29120
+`A 'U -29120
+`A ^U -29120
+`A :U -29120
+`A T -87360
+`A u0054_030C -87360
+`A u0054_0327 -87360
+`A Y -87360
+`A :Y -87360
+`A 'Y -87360
+`A V -116480
+`A W -116480
+'A y -29120
+'A :y -29120
+'A 'y -29120
+'A v -29120
+'A w -29120
+'A c -29120
+'A 'c -29120
+'A u0063_030C -29120
+'A ,c -29120
+'A d -29120
+'A u0064_030C -29120
+'A u0111 -29120
+'A Sd -29120
+'A e -29120
+'A u0065_030C -29120
+'A u0065_0328 -29120
+'A `e -29120
+'A 'e -29120
+'A ^e -29120
+'A :e -29120
+'A o -29120
+'A u006F_030B -29120
+'A `o -29120
+'A 'o -29120
+'A ^o -29120
+'A ~o -29120
+'A :o -29120
+'A oe -29120
+'A /o -29120
+'A q -29120
+'A t -29120
+'A u0074_030C -29120
+'A u0074_0327 -29120
+'A C -29120
+'A G -29120
+'A 'C -29120
+'A u0043_030C -29120
+'A u0047_0306 -29120
+'A ,C -29120
+'A Q -29120
+'A O -29120
+'A u004F_030B -29120
+'A `O -29120
+'A 'O -29120
+'A ^O -29120
+'A ~O -29120
+'A :O -29120
+'A OE -29120
+'A /O -29120
+'A U -29120
+'A u0055_030B -29120
+'A u0055_030A -29120
+'A `U -29120
+'A 'U -29120
+'A ^U -29120
+'A :U -29120
+'A T -87360
+'A u0054_030C -87360
+'A u0054_0327 -87360
+'A Y -87360
+'A :Y -87360
+'A 'Y -87360
+'A V -116480
+'A W -116480
+^A y -29120
+^A :y -29120
+^A 'y -29120
+^A v -29120
+^A w -29120
+^A c -29120
+^A 'c -29120
+^A u0063_030C -29120
+^A ,c -29120
+^A d -29120
+^A u0064_030C -29120
+^A u0111 -29120
+^A Sd -29120
+^A e -29120
+^A u0065_030C -29120
+^A u0065_0328 -29120
+^A `e -29120
+^A 'e -29120
+^A ^e -29120
+^A :e -29120
+^A o -29120
+^A u006F_030B -29120
+^A `o -29120
+^A 'o -29120
+^A ^o -29120
+^A ~o -29120
+^A :o -29120
+^A oe -29120
+^A /o -29120
+^A q -29120
+^A t -29120
+^A u0074_030C -29120
+^A u0074_0327 -29120
+^A C -29120
+^A G -29120
+^A 'C -29120
+^A u0043_030C -29120
+^A u0047_0306 -29120
+^A ,C -29120
+^A Q -29120
+^A O -29120
+^A u004F_030B -29120
+^A `O -29120
+^A 'O -29120
+^A ^O -29120
+^A ~O -29120
+^A :O -29120
+^A OE -29120
+^A /O -29120
+^A U -29120
+^A u0055_030B -29120
+^A u0055_030A -29120
+^A `U -29120
+^A 'U -29120
+^A ^U -29120
+^A :U -29120
+^A T -87360
+^A u0054_030C -87360
+^A u0054_0327 -87360
+^A Y -87360
+^A :Y -87360
+^A 'Y -87360
+^A V -116480
+^A W -116480
+~A y -29120
+~A :y -29120
+~A 'y -29120
+~A v -29120
+~A w -29120
+~A c -29120
+~A 'c -29120
+~A u0063_030C -29120
+~A ,c -29120
+~A d -29120
+~A u0064_030C -29120
+~A u0111 -29120
+~A Sd -29120
+~A e -29120
+~A u0065_030C -29120
+~A u0065_0328 -29120
+~A `e -29120
+~A 'e -29120
+~A ^e -29120
+~A :e -29120
+~A o -29120
+~A u006F_030B -29120
+~A `o -29120
+~A 'o -29120
+~A ^o -29120
+~A ~o -29120
+~A :o -29120
+~A oe -29120
+~A /o -29120
+~A q -29120
+~A t -29120
+~A u0074_030C -29120
+~A u0074_0327 -29120
+~A C -29120
+~A G -29120
+~A 'C -29120
+~A u0043_030C -29120
+~A u0047_0306 -29120
+~A ,C -29120
+~A Q -29120
+~A O -29120
+~A u004F_030B -29120
+~A `O -29120
+~A 'O -29120
+~A ^O -29120
+~A ~O -29120
+~A :O -29120
+~A OE -29120
+~A /O -29120
+~A U -29120
+~A u0055_030B -29120
+~A u0055_030A -29120
+~A `U -29120
+~A 'U -29120
+~A ^U -29120
+~A :U -29120
+~A T -87360
+~A u0054_030C -87360
+~A u0054_0327 -87360
+~A Y -87360
+~A :Y -87360
+~A 'Y -87360
+~A V -116480
+~A W -116480
+:A y -29120
+:A :y -29120
+:A 'y -29120
+:A v -29120
+:A w -29120
+:A c -29120
+:A 'c -29120
+:A u0063_030C -29120
+:A ,c -29120
+:A d -29120
+:A u0064_030C -29120
+:A u0111 -29120
+:A Sd -29120
+:A e -29120
+:A u0065_030C -29120
+:A u0065_0328 -29120
+:A `e -29120
+:A 'e -29120
+:A ^e -29120
+:A :e -29120
+:A o -29120
+:A u006F_030B -29120
+:A `o -29120
+:A 'o -29120
+:A ^o -29120
+:A ~o -29120
+:A :o -29120
+:A oe -29120
+:A /o -29120
+:A q -29120
+:A t -29120
+:A u0074_030C -29120
+:A u0074_0327 -29120
+:A C -29120
+:A G -29120
+:A 'C -29120
+:A u0043_030C -29120
+:A u0047_0306 -29120
+:A ,C -29120
+:A Q -29120
+:A O -29120
+:A u004F_030B -29120
+:A `O -29120
+:A 'O -29120
+:A ^O -29120
+:A ~O -29120
+:A :O -29120
+:A OE -29120
+:A /O -29120
+:A U -29120
+:A u0055_030B -29120
+:A u0055_030A -29120
+:A `U -29120
+:A 'U -29120
+:A ^U -29120
+:A :U -29120
+:A T -87360
+:A u0054_030C -87360
+:A u0054_0327 -87360
+:A Y -87360
+:A :Y -87360
+:A 'Y -87360
+:A V -116480
+:A W -116480
+oA y -29120
+oA :y -29120
+oA 'y -29120
+oA v -29120
+oA w -29120
+oA c -29120
+oA 'c -29120
+oA u0063_030C -29120
+oA ,c -29120
+oA d -29120
+oA u0064_030C -29120
+oA u0111 -29120
+oA Sd -29120
+oA e -29120
+oA u0065_030C -29120
+oA u0065_0328 -29120
+oA `e -29120
+oA 'e -29120
+oA ^e -29120
+oA :e -29120
+oA o -29120
+oA u006F_030B -29120
+oA `o -29120
+oA 'o -29120
+oA ^o -29120
+oA ~o -29120
+oA :o -29120
+oA oe -29120
+oA /o -29120
+oA q -29120
+oA t -29120
+oA u0074_030C -29120
+oA u0074_0327 -29120
+oA C -29120
+oA G -29120
+oA 'C -29120
+oA u0043_030C -29120
+oA u0047_0306 -29120
+oA ,C -29120
+oA Q -29120
+oA O -29120
+oA u004F_030B -29120
+oA `O -29120
+oA 'O -29120
+oA ^O -29120
+oA ~O -29120
+oA :O -29120
+oA OE -29120
+oA /O -29120
+oA U -29120
+oA u0055_030B -29120
+oA u0055_030A -29120
+oA `U -29120
+oA 'U -29120
+oA ^U -29120
+oA :U -29120
+oA T -87360
+oA u0054_030C -87360
+oA u0054_0327 -87360
+oA Y -87360
+oA :Y -87360
+oA 'Y -87360
+oA V -116480
+oA W -116480
+u0189 X -29120
+u0110 X -29120
+-D X -29120
+u0189 W -29120
+u0110 W -29120
+-D W -29120
+u0189 A -29120
+u0110 A -29120
+-D A -29120
+u0189 u0041_0306 -29120
+u0110 u0041_0306 -29120
+-D u0041_0306 -29120
+u0189 u0041_0328 -29120
+u0110 u0041_0328 -29120
+-D u0041_0328 -29120
+u0189 `A -29120
+u0110 `A -29120
+-D `A -29120
+u0189 'A -29120
+u0110 'A -29120
+-D 'A -29120
+u0189 ^A -29120
+u0110 ^A -29120
+-D ^A -29120
+u0189 ~A -29120
+u0110 ~A -29120
+-D ~A -29120
+u0189 :A -29120
+u0110 :A -29120
+-D :A -29120
+u0189 oA -29120
+u0110 oA -29120
+-D oA -29120
+u0189 AE -29120
+u0110 AE -29120
+-D AE -29120
+u0189 V -29120
+u0110 V -29120
+-D V -29120
+u0189 Y -29120
+u0110 Y -29120
+-D Y -29120
+u0189 :Y -29120
+u0110 :Y -29120
+-D :Y -29120
+u0189 'Y -29120
+u0110 'Y -29120
+-D 'Y -29120
+`O X -29120
+`O W -29120
+`O A -29120
+`O u0041_0306 -29120
+`O u0041_0328 -29120
+`O `A -29120
+`O 'A -29120
+`O ^A -29120
+`O ~A -29120
+`O :A -29120
+`O oA -29120
+`O AE -29120
+`O V -29120
+`O Y -29120
+`O :Y -29120
+`O 'Y -29120
+'O X -29120
+'O W -29120
+'O A -29120
+'O u0041_0306 -29120
+'O u0041_0328 -29120
+'O `A -29120
+'O 'A -29120
+'O ^A -29120
+'O ~A -29120
+'O :A -29120
+'O oA -29120
+'O AE -29120
+'O V -29120
+'O Y -29120
+'O :Y -29120
+'O 'Y -29120
+^O X -29120
+^O W -29120
+^O A -29120
+^O u0041_0306 -29120
+^O u0041_0328 -29120
+^O `A -29120
+^O 'A -29120
+^O ^A -29120
+^O ~A -29120
+^O :A -29120
+^O oA -29120
+^O AE -29120
+^O V -29120
+^O Y -29120
+^O :Y -29120
+^O 'Y -29120
+~O X -29120
+~O W -29120
+~O A -29120
+~O u0041_0306 -29120
+~O u0041_0328 -29120
+~O `A -29120
+~O 'A -29120
+~O ^A -29120
+~O ~A -29120
+~O :A -29120
+~O oA -29120
+~O AE -29120
+~O V -29120
+~O Y -29120
+~O :Y -29120
+~O 'Y -29120
+:O X -29120
+:O W -29120
+:O A -29120
+:O u0041_0306 -29120
+:O u0041_0328 -29120
+:O `A -29120
+:O 'A -29120
+:O ^A -29120
+:O ~A -29120
+:O :A -29120
+:O oA -29120
+:O AE -29120
+:O V -29120
+:O Y -29120
+:O :Y -29120
+:O 'Y -29120
+/O X -29120
+/O W -29120
+/O A -29120
+/O u0041_0306 -29120
+/O u0041_0328 -29120
+/O `A -29120
+/O 'A -29120
+/O ^A -29120
+/O ~A -29120
+/O :A -29120
+/O oA -29120
+/O AE -29120
+/O V -29120
+/O Y -29120
+/O :Y -29120
+/O 'Y -29120
+'Y e -87360
+'Y o -87360
+'Y r -87360
+'Y a -87360
+'Y u -87360
+'Y n -87360
+'Y .i -87360
+'Y c -87360
+'Y d -87360
+'Y g -87360
+'Y p -87360
+'Y s -87360
+'Y v -87360
+'Y w -87360
+'Y x -87360
+'Y z -87360
+'Y A -87360
+'Y u0041_0306 -87360
+'Y u0041_0328 -87360
+'Y `A -87360
+'Y 'A -87360
+'Y ^A -87360
+'Y ~A -87360
+'Y :A -87360
+'Y oA -87360
+'Y AE -87360
+`a r -29120
+`a y -29120
+`a :y -29120
+`a 'y -29120
+`a w -29120
+'a r -29120
+'a y -29120
+'a :y -29120
+'a 'y -29120
+'a w -29120
+^a r -29120
+^a y -29120
+^a :y -29120
+^a 'y -29120
+^a w -29120
+~a r -29120
+~a y -29120
+~a :y -29120
+~a 'y -29120
+~a w -29120
+:a r -29120
+:a y -29120
+:a :y -29120
+:a 'y -29120
+:a w -29120
+oa r -29120
+oa y -29120
+oa :y -29120
+oa 'y -29120
+oa w -29120
+`o e 29120
+`o u0065_030C 29120
+`o u0065_0328 29120
+`o `e 29120
+`o 'e 29120
+`o ^e 29120
+`o :e 29120
+`o o 29120
+`o u006F_030B 29120
+`o `o 29120
+`o 'o 29120
+`o ^o 29120
+`o ~o 29120
+`o :o 29120
+`o oe 29120
+`o /o 29120
+`o x -29120
+`o d 29120
+`o c 29120
+`o 'c 29120
+`o u0063_030C 29120
+`o ,c 29120
+`o q 29120
+`o r -29120
+`o y -29120
+`o :y -29120
+`o 'y -29120
+`o w -29120
+'o e 29120
+'o u0065_030C 29120
+'o u0065_0328 29120
+'o `e 29120
+'o 'e 29120
+'o ^e 29120
+'o :e 29120
+'o o 29120
+'o u006F_030B 29120
+'o `o 29120
+'o 'o 29120
+'o ^o 29120
+'o ~o 29120
+'o :o 29120
+'o oe 29120
+'o /o 29120
+'o x -29120
+'o d 29120
+'o c 29120
+'o 'c 29120
+'o u0063_030C 29120
+'o ,c 29120
+'o q 29120
+'o r -29120
+'o y -29120
+'o :y -29120
+'o 'y -29120
+'o w -29120
+^o e 29120
+^o u0065_030C 29120
+^o u0065_0328 29120
+^o `e 29120
+^o 'e 29120
+^o ^e 29120
+^o :e 29120
+^o o 29120
+^o u006F_030B 29120
+^o `o 29120
+^o 'o 29120
+^o ^o 29120
+^o ~o 29120
+^o :o 29120
+^o oe 29120
+^o /o 29120
+^o x -29120
+^o d 29120
+^o c 29120
+^o 'c 29120
+^o u0063_030C 29120
+^o ,c 29120
+^o q 29120
+^o r -29120
+^o y -29120
+^o :y -29120
+^o 'y -29120
+^o w -29120
+~o e 29120
+~o u0065_030C 29120
+~o u0065_0328 29120
+~o `e 29120
+~o 'e 29120
+~o ^e 29120
+~o :e 29120
+~o o 29120
+~o u006F_030B 29120
+~o `o 29120
+~o 'o 29120
+~o ^o 29120
+~o ~o 29120
+~o :o 29120
+~o oe 29120
+~o /o 29120
+~o x -29120
+~o d 29120
+~o c 29120
+~o 'c 29120
+~o u0063_030C 29120
+~o ,c 29120
+~o q 29120
+~o r -29120
+~o y -29120
+~o :y -29120
+~o 'y -29120
+~o w -29120
+:o e 29120
+:o u0065_030C 29120
+:o u0065_0328 29120
+:o `e 29120
+:o 'e 29120
+:o ^e 29120
+:o :e 29120
+:o o 29120
+:o u006F_030B 29120
+:o `o 29120
+:o 'o 29120
+:o ^o 29120
+:o ~o 29120
+:o :o 29120
+:o oe 29120
+:o /o 29120
+:o x -29120
+:o d 29120
+:o c 29120
+:o 'c 29120
+:o u0063_030C 29120
+:o ,c 29120
+:o q 29120
+:o r -29120
+:o y -29120
+:o :y -29120
+:o 'y -29120
+:o w -29120
+/o e 29120
+/o u0065_030C 29120
+/o u0065_0328 29120
+/o `e 29120
+/o 'e 29120
+/o ^e 29120
+/o :e 29120
+/o o 29120
+/o u006F_030B 29120
+/o `o 29120
+/o 'o 29120
+/o ^o 29120
+/o ~o 29120
+/o :o 29120
+/o oe 29120
+/o /o 29120
+/o x -29120
+/o d 29120
+/o c 29120
+/o 'c 29120
+/o u0063_030C 29120
+/o ,c 29120
+/o q 29120
+/o r -29120
+/o y -29120
+/o :y -29120
+/o 'y -29120
+/o w -29120
+`u w -29120
+'u w -29120
+^u w -29120
+:u w -29120
+'y o -29120
+'y u006F_030B -29120
+'y `o -29120
+'y 'o -29120
+'y ^o -29120
+'y ~o -29120
+'y :o -29120
+'y oe -29120
+'y /o -29120
+'y e -29120
+'y u0065_030C -29120
+'y u0065_0328 -29120
+'y `e -29120
+'y 'e -29120
+'y ^e -29120
+'y :e -29120
+'y a -29120
+'y u0061_0306 -29120
+'y u0061_0328 -29120
+'y `a -29120
+'y 'a -29120
+'y ^a -29120
+'y ^a -29120
+'y ~a -29120
+'y :a -29120
+'y oa -29120
+'y ae -29120
+'y . -87360
+'y , -87360
+charset
+ga 524160,669760 2 0000
+aa 524160,669760 2 0001
+a^ 524160,669760 2 0002
+a~ 524160,669760 2 0003
+ad 524160,689730 2 0004
+a" 524160,669760,0,14557 2 0005
+ao 698880,669760 2 0006
+ah 524160,669760 2 0007
+ab 524160,669760 2 0010
+a- 524160,689730 2 0011
+a. 291200,710738 2 0012
+ac 465920,0,178360 1 0013
+ho 291200,0,203840 1 0014
+bq 291200,87360,131040 1 0015
+fo 465920,463008 0 0016
+fc 465920,463008 0 0017
+lq 349440,757120 2 0020
+rq 349440,757120 2 0021
+Bq 349440,87360,131040 1 0022
+Fo 698880,463008 0 0023
+Fc 698880,463008 0 0024
+en 524160,463008,0,29120 0 0025
+em 1048320,463008,0,29120 0 0026
+--- 0,463008 0 0027
+--- 465920,782600,29120 3 0030
+.i 250432,463008 0 0031
+.j 279552,463008,203840 1 0032
+ff 611520,757120,0,72800 2 0033
+fi 562016,757120 2 0034
+fl 562016,757120 2 0035
+Fi 853216,757120 2 0036
+Fl 853216,757120 2 0037
+u2423 524160,463008,101920 1 0040
+u01C3 334880,757120 2 0041
+! "
+dq 524160,757120 2 0042
+" "
+sh 873600,757120,232960 3 0043
+# "
+Do 524160,782600,29120 3 0044
+$ "
+% 873600,782600,29120 3 0045
+& 794976,757120 2 0046
+cq 291200,757120 2 0047
+' "
+( 407680,782600,262080 3 0050
+) 407680,782600,262080 3 0051
+* 524160,782600 2 0052
++ 815360,611520,87360 3 0053
+, 291200,87360,131040 1 0054
+- 349440,463008 0 0055
+. 291200,87360 0 0056
+sl 524160,782600,262080 3 0057
+/ "
+0 524160,689730 2 0060
+1 524160,689730 2 0061
+2 524160,689730 2 0062
+3 524160,689730 2 0063
+4 524160,689730 2 0064
+5 524160,689730 2 0065
+6 524160,689730 2 0066
+7 524160,689730 2 0067
+8 524160,689730 2 0070
+9 524160,689730 2 0071
+: 291200,463008 0 0072
+; 291200,463008,131040 1 0073
+< 815360,571045,50091 3 0074
+= 815360,387883,-136277 0 0075
+> 815360,571045,50091 3 0076
+? 495040,757120 2 0077
+at 698880,757120 2 0100
+@ "
+A 698880,728000 2 0101
+B 698880,728000 2 0102
+C 669760,728000,0,0,-29120 2 0103
+D 757120,728000,0,0,0,-29120 2 0104
+E 626080,728000 2 0105
+F 596960,728000,0,0,0,-145600 2 0106
+G 698880,728000,0,0,-29120 2 0107
+H 742560,728000 2 0110
+I 291200,728000 2 0111
+J 495040,728000,0,0,0,-29120 2 0112
+K 728000,728000 2 0113
+L 567840,728000,0,0,0,58240 2 0114
+M 917280,728000 2 0115
+N 742560,728000 2 0116
+O 771680,728000,0,0,-29120,-29120 2 0117
+P 669760,728000,0,0,0,-145600 2 0120
+Q 771680,728000,131040,0,-29120 3 0121
+R 677040,728000 2 0122
+S 582400,728000 2 0123
+T 713440,728000,0,0,0,-145600 2 0124
+U 720720,728000,0,0,29120 2 0125
+V 698880,728000,0,14560,43680,-218400 2 0126
+W 990080,728000,0,14560,43680,-131040 2 0127
+X 698880,728000 2 0130
+Y 698880,728000,0,26208,29120,-206752 2 0131
+Z 640640,728000 2 0132
+lB 302848,782600,262080 3 0133
+[ "
+rs 524160,782600,262080 3 0134
+\ "
+rB 302848,782600,262080 3 0135
+] "
+ha 640640,757120 2 0136
+^ "
+_ 815360,0,259754 1 0137
+oq 291200,757120 2 0140
+` "
+a 503776,463008 0 0141
+b 541632,757120 2 0142
+c 465920,463008 0 0143
+d 541632,757120 2 0144
+e 465920,463008 0 0145
+f 320320,757120,0,72800 2 0146
+g 524160,463008,203840,14560 1 0147
+h 541632,757120 2 0150
+i 250432,710738 2 0151
+j 279552,710738,203840 3 0152
+k 512512,757120 2 0153
+l 250432,757120 2 0154
+m 832832,463008 0 0155
+n 541632,463008 0 0156
+o 524160,463008 0 0157
+p 541632,463008,203840 1 0160
+q 541632,463008,203840 1 0161
+r 358176,463008,0,14560 0 0162
+s 401856,463008 0 0163
+t 378560,599043 2 0164
+u 541632,463008 0 0165
+v 483392,463008,0,14560 0 0166
+w 716352,463008,0,14560 0 0167
+x 483392,463008 0 0170
+y 483392,463008,203840,14560 1 0171
+z 455728,463008 0 0172
+lC 524160,782600,262080 3 0173
+{ "
+u01C0 291200,782600,262080 3 0174
+ba "
+| "
+rC 524160,782600,262080 3 0175
+} "
+~ 640640,710738 2 0176
+hy 174720,463008 0 0177
+u0041_0306 698880,931840 2 0200
+u0041_0328 698880,728000,203840 3 0201
+'C 669760,892202 2 0202
+u0043_030C 669760,931840,0,0,-29120 2 0203
+u0044_030C 757120,931840,0,0,0,-29120 2 0204
+u0045_030C 626080,931840 2 0205
+u0045_0328 626080,728000,203840 3 0206
+u0047_0306 698880,931840,0,0,-29120 2 0207
+u004C_0301 567840,892202,0,0,0,58240 2 0210
+u004C_030C 567840,931840,0,0,0,58240 2 0211
+/L 655200,728000 2 0212
+u004E_0301 742560,892202 2 0213
+u004E_030C 742560,931840 2 0214
+u014A 786240,728000,0,0,0,-29120 2 0215
+u004F_030B 771680,892202,0,0,-29120,-29120 2 0216
+u0052_0301 677040,892202 2 0217
+u0052_030C 677040,931840 2 0220
+u0053_0301 582400,892202 2 0221
+vS 582400,931840 2 0222
+u0053_0327 582400,728000,178360 3 0223
+u0054_030C 713440,931840,0,0,0,-145600 2 0224
+u0054_0327 713440,728000,178360,0,0,-145600 3 0225
+u0055_030B 720720,892202,0,0,29120 2 0226
+u0055_030A 720720,931840,0,0,29120 2 0227
+:Y 698880,931840,0,26208,29120,-206752 2 0230
+u005A_0301 640640,892202 2 0231
+vZ 640640,931840 2 0232
+u005A_0307 640640,892202 2 0233
+IJ 757120,728000,0,0,0,-29120 2 0234
+u0049_0307 291200,892202 2 0235
+u0111 541632,757120 2 0236
+sc 465920,757120,203840 3 0237
+u0061_0306 503776,669760 2 0240
+u0061_0328 503776,463008,203840 1 0241
+'c 465920,669760 2 0242
+u0063_030C 465920,669760 2 0243
+u0064_030C 663936,757120 2 0244
+u0065_030C 465920,669760 2 0245
+u0065_0328 465920,463008,203840 1 0246
+u0067_0306 524160,669760,203840,14560 3 0247
+u006C_0301 250432,892202,0,96354 2 0250
+u006C_030C 372736,757120 2 0251
+/l 340122,757120,0,11645 2 0252
+u006E_0301 541632,669760 2 0253
+u006E_030C 541632,669760 2 0254
+u016A 541632,463008,203840 1 0255
+u006F_030B 524160,669760,0,14557 2 0256
+u0072_0301 358176,669760,0,14560 2 0257
+u0072_030C 358176,669760,0,14560 2 0260
+u0073_0301 401856,669760 2 0261
+vs 401856,669760 2 0262
+u0073_0327 401856,463008,178360 1 0263
+u0074_030C 378560,757120 2 0264
+u0074_0327 378560,599043,178360 3 0265
+u0075_030B 541632,669760,0,5818 2 0266
+u0075_030A 541632,669760 2 0267
+:y 483392,689730,203840,14560 3 0270
+u007A_0301 455728,669760 2 0271
+vz 455728,669760 2 0272
+u007A_0307 455728,710738 2 0273
+ij 570752,710738,203840 3 0274
+r! 334880,553280,203840 3 0275
+r? 495040,553280,203840 3 0276
+Po 669760,757120 2 0277
+`A 698880,892202 2 0300
+'A 698880,892202 2 0301
+^A 698880,931840 2 0302
+~A 698880,931840 2 0303
+:A 698880,931840 2 0304
+oA 698880,892202 2 0305
+AE 902720,728000 2 0306
+,C 669760,728000,178360,0,-29120 3 0307
+`E 626080,892202 2 0310
+'E 626080,892202 2 0311
+^E 626080,931840 2 0312
+:E 626080,931840 2 0313
+`I 291200,892202 2 0314
+'I 291200,892202,0,78541,0,39270 2 0315
+^I 291200,931840 2 0316
+:I 291200,931840 2 0317
+u0189 757120,728000,0,0,0,-29120 2 0320
+u0110 "
+-D "
+~N 742560,931840 2 0321
+`O 771680,892202,0,0,-29120,-29120 2 0322
+'O 771680,892202 2 0323
+^O 771680,931840,0,0,-29120,-29120 2 0324
+~O 771680,931840,0,0,-29120,-29120 2 0325
+:O 771680,931840,0,0,-29120,-29120 2 0326
+OE 1019200,728000 2 0327
+/O 815360,782600,50960 3 0330
+`U 720720,892202,0,0,29120 2 0331
+'U 720720,892202 2 0332
+^U 720720,931840,0,0,29120 2 0333
+:U 720720,931840,0,0,29120 2 0334
+'Y 698880,892202,0,26208,29120,-206752 2 0335
+TP 611520,728000 2 0336
+--- 1164800,728000 2 0337
+`a 503776,669760 2 0340
+'a 503776,669760 2 0341
+^a 503776,669760 2 0342
+~a 503776,669760 2 0343
+:a 503776,689730 2 0344
+oa 503776,669760 2 0345
+ae 757120,463008 0 0346
+,c 465920,463008,178360 1 0347
+`e 465920,669760 2 0350
+'e 465920,669760 2 0351
+^e 465920,669760 2 0352
+:e 465920,689730 2 0353
+`i 250432,669760 2 0354
+'i 250432,669760,0,34946 2 0355
+^i 250432,669760 2 0356
+:i 308672,689730 2 0357
+Sd 524160,757120 2 0360
+~n 541632,669760 2 0361
+`o 524160,669760 2 0362
+'o 524160,669760 2 0363
+^o 524160,669760 2 0364
+~o 524160,669760 2 0365
+:o 524160,689730 2 0366
+oe 815360,463008 0 0367
+/o 524160,571045,101920 3 0370
+`u 541632,669760 2 0371
+'u 541632,669760 2 0372
+^u 541632,669760 2 0373
+:u 541632,689730 2 0374
+'y 483392,669760,203840,14560 3 0375
+Tp 541632,757120,203840 3 0376
+ss 503776,757120 2 0377
diff --git a/font/devdvi/HRTC b/font/devdvi/HRTC
new file mode 100644
index 0000000..f05e6ca
--- /dev/null
+++ b/font/devdvi/HRTC
@@ -0,0 +1,137 @@
+name HRTC
+special
+internalname tcss1000
+spacewidth 349440
+checksum 1552149760
+designsize 10485760
+charset
+--- 524160,631051 2 0000
+--- 524160,631051 2 0001
+--- 524160,662478 2 0002
+--- 524160,662478 2 0003
+--- 524160,662478 2 0004
+--- 524160,631051,0,46502 2 0005
+--- 720720,662478 2 0006
+--- 524160,662478 2 0007
+--- 524160,662478 2 0010
+--- 524160,662478 2 0011
+--- 291200,631051 2 0012
+--- 465920,0,178360 1 0013
+--- 291200,0,203840 1 0014
+--- 407680,87360,203840 1 0015
+--- 524160,87360,203840 1 0022
+--- 698880,465920,0,29120 0 0025
+--- 786240,465920,0,29120 0 0026
+--- 0,728000 2 0027
+<- 1048320,387883,-136277 0 0030
+-> 1048320,387883,-136277 0 0031
+--- 250432,757120,0,302848 2 0032
+--- 308672,1019200,0,331968 2 0033
+--- 483392,757120,0,302848 2 0034
+--- 483392,757120,0,331968 2 0035
+--- 0,757120 2 0037
+u2422 541632,757120 2 0040
+Do 524160,786240,29120 3 0044
+$ "
+aq 291200,757120 2 0047
+--- 524160,495040,-29120 2 0052
+, 291200,87360,131040 1 0054
+--- 349440,387883,-136277 0 0055
+. 291200,87360 0 0056
+f/ 524160,786240,262080 3 0057
+0 524160,465920 0 0060
+1 524160,465920 0 0061
+2 524160,465920 0 0062
+3 524160,465920,203840 1 0063
+4 524160,465920,203840 1 0064
+5 524160,465920,203840 1 0065
+6 524160,687232 2 0066
+7 524160,465920,203840 1 0067
+8 524160,687232 2 0070
+9 524160,465920,203840 1 0071
+la 407680,786240,262080 3 0074
+\- 815360,605282,87360 3 0075
+ra 407680,786240,262080 3 0076
+u2127 757120,728000 2 0115
+ci 1164800,786240,262080 3 0117
+u03A9 757120,728000 2 0127
+u301A 422240,786240,262080 3 0133
+u301B 422240,786240,262080 3 0135
+ua 524160,757120,232960 3 0136
+da 524160,757120,232960 3 0137
+--- 524160,757120 2 0140
+--- 524160,495040,-29120 2 0142
+--- 524160,495040,-29120 2 0143
+--- 524160,662478,29122 3 0144
+--- 1048320,757120 2 0154
+--- 524160,495040,-29120 2 0155
+u266A 640640,757120 2 0156
+ti 640640,133120 0 0176
+~ "
+--- 174720,387883,-136277 0 0177
+--- 640640,757120 2 0200
+--- 640640,757120 2 0201
+--- 524160,757120 2 0202
+--- 524160,757120 2 0203
+dg 465920,757120,203840 3 0204
+dd 465920,757120,203840 3 0205
+u2016 524160,786240,262080 3 0206
+%0 1223040,786240,29120 3 0207
+bu 524160,465920,-58240 0 0210
+u2103 902720,728000,0,0,-29120 2 0211
+--- 640640,786240,29120 3 0212
+--- 524160,560560,101920 3 0213
+Fn 320320,757120,0,72800 2 0214
+u20A1 669760,786240,29120,0,-29120 3 0215
+u20A9 990080,728000,0,14560,43680,-131040 2 0216
+u20A6 771680,728000 2 0217
+--- 815360,786240,29120,0,-29120 3 0220
+u20B1 684320,728000,0,0,0,-145600 2 0221
+u20A4 669760,757120 2 0222
+u211E 677040,728000 2 0223
+u203D 495040,757120 2 0224
+--- 495040,560560,203840 3 0225
+u20AB 541632,786240 2 0226
+tm 698880,786240,0,550366 2 0227
+u2031 1612550,786240,29120 3 0230
+--- 495040,757120,203840 3 0231
+u0E3F 698880,786240,29120 3 0232
+u2116 859040,728000 2 0233
+u2052 524160,786240 2 0234
+u212E 701792,728000 2 0235
+u25E6 524160,465920,-58240 0 0236
+u2120 698880,786240,0,550366 2 0237
+u2045 378560,786240,262080 3 0240
+u2046 378560,786240,262080 3 0241
+ct 524160,560560,101920 3 0242
+Po 669760,757120 2 0243
+Cs 793402,605282 2 0244
+Ye 698880,728000,0,26208 2 0245
+bb 174720,786240,262080 3 0246
+sc 465920,757120,203840 3 0247
+--- 524160,712194 2 0250
+co 1164800,786240,262080 3 0251
+Of 465920,786240 2 0252
+--- 1164800,786240,262080 3 0253
+tno 698880,465920 0 0254
+u2117 1164800,786240,262080 3 0255
+rg 1164800,786240,262080 3 0256
+--- 815360,757120 2 0257
+de 349440,728000 2 0260
+t+- 815360,605282,87360 3 0261
+S2 465920,786240 2 0262
+S3 465920,786240 2 0263
+--- 524160,757120 2 0264
+mc 541632,465920,203840 1 0265
+ps 640640,757120,203840 3 0266
+pc 247520,465920 0 0267
+u203B 679466,560560 2 0270
+S1 465920,786240 2 0271
+Om 465920,786240 2 0272
+sr 495040,786240,220138 3 0273
+--- 465920,786240,203840 3 0274
+--- 465920,786240,203840 3 0275
+--- 465920,786240,203840 3 0276
+Eu 815360,728000 2 0277
+tmu 815360,605282,87360 3 0326
+tdi 815360,605282,87360 3 0366
diff --git a/font/devdvi/MI b/font/devdvi/MI
new file mode 100644
index 0000000..bbe1e06
--- /dev/null
+++ b/font/devdvi/MI
@@ -0,0 +1,137 @@
+name MI
+spacewidth 350836
+special
+internalname cmmi10
+slant 14.036243
+checksum 195060286
+designsize 10485760
+charset
+--- 645166,716526,0,145637 2 0000
+--- 873816,716526 2 0001
+--- 799829,716526,0,29128 2 0002
+--- 728179,716526 2 0003
+--- 778424,716526,0,79371 2 0004
+--- 871630,716526,0,85195 2 0005
+--- 817746,716526,0,60438 2 0006
+--- 611669,716526,0,145637 2 0007
+--- 699051,716526 2 0010
+--- 641962,716526,0,115344 2 0011
+--- 809918,716526,0,52610 2 0012
+*a 670776,451470,0,3882 0 0013
+*b 593102,728178,203890,55342 3 0014
+*g 542880,451470,203890,58254 1 0015
+*d 466034,728178,0,39685 2 0016
++e 425621,451470 0 0017
+*z 458754,728178,203890,77368 3 0020
+*y 520651,451470,203890,37622 1 0021
+*h 492248,728178,0,29128 2 0022
+*i 371130,451470 0 0023
+*k 604147,451470 0 0024
+*l 611672,728178 2 0025
+mc 631819,451470,203890 1 0026
+*m "
+*n 517979,451470,0,66750 0 0027
+*c 458754,728178,203890,48242 3 0030
+*p 597717,451470,0,37622 0 0031
+*r 542130,451470,203890 1 0032
+*s 599171,451470,0,37622 0 0033
+*t 458390,451470,0,118694 0 0034
+*u 566525,451470,0,37622 0 0035
+*f 624778,728178,203890 3 0036
+*x 656086,451470,203890 1 0037
+*q 683034,728178,203890,37622 3 0040
+*w 652691,451470,0,37622 0 0041
+*e 488970,451470 0 0042
++h 620170,728178 2 0043
++p 868357,451470,0,29128 0 0044
+--- 542130,451470,203890 1 0045
+ts 380474,451470,101946,83739 1 0046
++f 685944,451470,203890 1 0047
+u21BC 1048579,384696,-139592 0 0050
+u21BD 1048579,384696,-139592 0 0051
+u21C0 1048579,384696,-139592 0 0052
+u21C1 1048579,384696,-139592 0 0053
+--- 291272,486275,-38013 2 0054
+--- 291272,486275,-38013 2 0055
+u25B7 524290,487880,-36408 2 0056
+u25C1 524290,487880,-36408 2 0057
+--- 524290,451470 0 0060
+--- 524290,451470 0 0061
+--- 524290,451470 0 0062
+--- 524290,451470,203890 1 0063
+--- 524290,451470,203890 1 0064
+--- 524290,451470,203890 1 0065
+--- 524290,675749 2 0066
+--- 524290,451470,203890 1 0067
+--- 524290,675749 2 0070
+--- 524290,451470,203890 1 0071
+--- 291272,110683 0 0072
+--- 291272,110683,203890 1 0073
+< 815562,565285,40997 3 0074
+--- 524290,786432,262144 3 0075
+> 815562,565285,40997 3 0076
+u22C6 524290,487880,-36408 2 0077
+pd 556693,728178,0,58254 2 0100
+--- 786434,716526 2 0101
+--- 795355,716526,0,52610 2 0102
+--- 749440,716526,0,75002 2 0103
+--- 868134,716526,0,29128 2 0104
+--- 774054,716526,0,60438 2 0105
+--- 674294,716526,0,145637 2 0106
+--- 824442,716526 2 0107
+--- 871630,716526,0,85195 2 0110
+--- 460938,716526,0,82283 2 0111
+--- 581450,716526,0,100853 2 0112
+--- 890563,716526,0,75002 2 0113
+--- 713616,716526 2 0114
+--- 1017266,716526,0,114323 2 0115
+--- 842502,716526,0,114323 2 0116
+--- 799829,716526,0,29128 2 0117
+--- 673200,716526,0,145637 2 0120
+--- 828957,716526,203890 3 0121
+--- 796173,716526,0,8101 2 0122
+--- 642982,716526,0,60438 2 0123
+--- 612763,716526,0,145637 2 0124
+--- 715944,716526,0,114323 2 0125
+--- 611670,716526,0,233018 2 0126
+--- 990323,716526,0,145637 2 0127
+--- 868718,716526,0,82283 2 0130
+--- 608758,716526,0,233018 2 0131
+--- 715800,716526,0,75002 2 0132
+u266D 407781,786432 2 0133
+u266E 407781,728178,203890 3 0134
+u266F 407781,728178,203890 3 0135
+u2323 1048579,375013,-149275 0 0136
+u2322 1048579,375013,-149275 0 0137
+u2113 436910,728178 2 0140
+--- 554267,451470 0 0141
+--- 450014,728178 2 0142
+--- 453778,451470 0 0143
+--- 545771,728178 2 0144
+--- 488245,451470 0 0145
+--- 513368,728178,203890,112869 3 0146
+--- 500138,451470,203890,37622 1 0147
+--- 604147,728178 2 0150
+--- 361248,691562 2 0151
+--- 431811,691562,203890,60024 3 0152
+--- 545893,728178,0,33010 2 0153
+--- 312874,728178,0,20634 2 0154
+--- 920664,451470 0 0155
+--- 629392,451470 0 0156
+*o 508269,451470 0 0157
+--- 527566,451470,203890 1 0160
+--- 468099,451470,203890,37622 1 0161
+--- 473075,451470,0,29128 0 0162
+--- 491520,451470 0 0163
+--- 378654,644958 2 0164
+--- 600266,451470 0 0165
+--- 508270,451470,0,37622 0 0166
+--- 750694,451470,0,28216 0 0167
+--- 599291,451470 0 0170
+--- 514098,451470,203890,37622 1 0171
+--- 487640,451470,0,46117 0 0172
+--- 338120,451470 0 0173
+--- 402685,451470,203890 1 0174
+wp 667376,451470,203890 1 0175
+--- 524290,749149,0,161291 2 0176
+--- 291272,728178,0,418866 2 0177
diff --git a/font/devdvi/S b/font/devdvi/S
new file mode 100644
index 0000000..4b4f8d6
--- /dev/null
+++ b/font/devdvi/S
@@ -0,0 +1,150 @@
+name S
+spacewidth 350836
+special
+internalname cmsy10
+slant 14.036243
+checksum 555887770
+designsize 10485760
+charset
+mi 815562,611670,87382 3 0000
+\- "
+pc 291272,466035,-58253 2 0001
+md "
+tmu 815562,611670,87382 3 0002
+mu "
+** 524290,487880,-36408 2 0003
+tdi 815562,611670,87382 3 0004
+di "
+u22C4 524290,466035,-58253 2 0005
+t+- 815562,611670,87382 3 0006
++- "
+-+ 815562,611670,87382 3 0007
+c+ 815562,611670,87382 3 0010
+u2296 815562,611670,87382 3 0011
+c* 815562,611670,87382 3 0012
+u2298 815562,611670,87382 3 0013
+u2299 815562,611670,87382 3 0014
+ci 1048579,728178,203890 3 0015
+u25E6 524290,466035,-58253 2 0016
+bu 524290,466035,-58253 2 0017
+u224D 815562,486275,-38013 2 0020
+== 815562,486275,-38013 2 0021
+ib 815562,666864,142576 3 0022
+ip 815562,666864,142576 3 0023
+<= 815562,666864,142576 3 0024
+>= 815562,666864,142576 3 0025
+u227C 815562,666864,142576 3 0026
+u227D 815562,666864,142576 3 0027
+ti 815562,384696,-139592 0 0030
+ap "
+~= 815562,506590,-17698 2 0031
+~~ "
+sb 815562,565285,40997 3 0032
+sp 815562,565285,40997 3 0033
+<< 1048579,565285,40997 3 0034
+>> 1048579,565285,40997 3 0035
+u227A 815562,565285,40997 3 0036
+u227B 815562,565285,40997 3 0037
+<- 1048579,384696,-139592 0 0040
+-> 1048579,384696,-139592 0 0041
+ua 524290,728178,203888 3 0042
+da 524290,728178,203888 3 0043
+<> 1048579,384696,-139592 0 0044
+u2197 1048579,728178,203888 3 0045
+u2198 1048579,728178,203888 3 0046
+|= 815562,486275,-38013 2 0047
+lA 1048579,384696,-139592 0 0050
+rA 1048579,384696,-139592 0 0051
+uA 640798,728178,203888 3 0052
+dA 640798,728178,203888 3 0053
+hA 1048579,384696,-139592 0 0054
+u2196 1048579,728178,203888 3 0055
+u2199 1048579,728178,203888 3 0056
+pt 815562,451470 0 0057
+prime 288358,582544 2 0060
+if 1048579,451470 0 0061
+mo 699053,565285,40997 3 0062
+st 699053,565285,40997 3 0063
+u25B3 932070,728178,203890 3 0064
+u25BD 932070,728178,203890 3 0065
+slashnot 0,728178,203888 3 0066
+--- 0,384696,-139592 0 0067
+fa 582544,728178 2 0070
+te 582544,728178 2 0071
+tno 699053,451470 0 0072
+no "
+es 524290,786432,58254 3 0073
+Re 757307,728178 2 0074
+Im 757307,728178 2 0075
+u22A4 815562,728178 2 0076
+pp 815562,728178 2 0077
+Ah 640798,728178 2 0100
+A 837258,716526 2 0101
+B 688715,716526,0,31890 2 0102
+C 552106,716526,0,61170 2 0103
+D 808864,716526,0,29128 2 0104
+E 553419,716526,0,93786 2 0105
+F 753662,716526,0,104130 2 0106
+G 623762,716526,101946,62184 3 0107
+H 885541,716526,0,10123 2 0110
+I 570966,716526,0,77408 2 0111
+J 710704,716526,101946,193694 3 0112
+K 798963,716526,0,15147 2 0113
+L 723229,716526 2 0114
+M 1259235,716526 2 0115
+N 860347,716526,0,154518 2 0116
+O 834786,716526,0,29128 2 0117
+P 729347,716526,0,86216 2 0120
+Q 856341,716526,101946 3 0121
+R 888672,716526 2 0122
+S 634974,716526,0,78638 2 0123
+T 571101,716526,0,266514 2 0124
+U 656232,716526,0,104130 2 0125
+V 642549,716526,0,86216 2 0126
+W 1035766,716526,0,86216 2 0127
+X 747946,716526,0,153541 2 0130
+Y 700802,716526,101946,86216 3 0131
+Z 759930,716526,0,83302 2 0132
+cu 699053,582544 2 0133
+ca 699053,582544 2 0134
+u228E 699053,582544 2 0135
+AN 699053,582544 2 0136
+OR 699053,582544 2 0137
+u22A2 640798,728178 2 0140
+u22A3 640798,728178 2 0141
+lf 466035,786432,262144 3 0142
+rf 466035,786432,262144 3 0143
+lc 466035,786432,262144 3 0144
+rc 466035,786432,262144 3 0145
+{ 524290,786432,262144 3 0146
+lC "
+} 524290,786432,262144 3 0147
+rC "
+la 407781,786432,262144 3 0150
+ra 407781,786432,262144 3 0151
+bar 291272,786432,262144 3 0152
+bv "
+| "
+ba "
+bardbl 524290,786432,262144 3 0153
+va 524290,786432,262144 3 0154
+vA 640798,786432,262144 3 0155
+rs 524290,786432,262144 3 0156
+\ "
+u2240 291272,728178,203888 3 0157
+sqrt 873816,41942,1006634 1 0160
+u2210 786434,716526 2 0161
+gr 873816,716526 2 0162
+is 436909,728178,203890,116509 3 0163
+u2294 699053,582544 2 0164
+u2293 699053,582544 2 0165
+u2291 815562,666864,142576 3 0166
+u2292 815562,666864,142576 3 0167
+sc 466037,728178,203890 3 0170
+dg 466035,728178,203890 3 0171
+dd 466035,728178,203890 3 0172
+ps 640798,728178,203890 3 0173
+CL 815562,728178,135926 3 0174
+u2662 815562,728178,135926 3 0175
+u2661 815562,728178,135926 3 0176
+SP 815562,728178,135926 3 0177
diff --git a/font/devdvi/SA b/font/devdvi/SA
new file mode 100644
index 0000000..5e9ea2e
--- /dev/null
+++ b/font/devdvi/SA
@@ -0,0 +1,142 @@
+name SA
+spacewidth 350836
+special
+internalname msam10
+checksum -1749815603
+designsize 10485760
+charset
+boxdot 815562,707789 2 0000
+boxplus 815562,707789 2 0001
+boxtimes 815562,707789 2 0002
+square 815562,707789 2 0003
+blacksquare 815562,707789 2 0004
+centerdot 291272,576570 2 0005
+lz 699053,725867,116509 3 0006
+lozenge "
+blacklozenge 699053,725867,116509 3 0007
+circlearrowright 815562,610248,85960 3 0010
+circlearrowleft 815562,610248,85960 3 0011
+rightleftharpoons 1048579,547770,14197 3 0012
+leftrightharpoons 1048579,547770,14197 3 0013
+boxminus 815562,707789 2 0014
+Vdash 757307,725867 2 0015
+Vvdash 932070,725867 2 0016
+vDash 640798,725867 2 0017
+twoheadrightarrow 1048579,547770,14197 3 0020
+twoheadleftarrow 1048579,547770,14197 3 0021
+leftleftarrows 1048579,707789,189584 3 0022
+rightrightarrows 1048579,707789,189584 3 0023
+upuparrows 873816,725867,203888 3 0024
+downdownarrows 873816,725867,203888 3 0025
+upharpoonright 436909,725867,203888 3 0026
+downharpoonright 436909,725867,203888 3 0027
+upharpoonleft 436909,725867,203888 3 0030
+downharpoonleft 436909,725867,203888 3 0031
+rightarrowtail 1165088,547770,14197 3 0032
+leftarrowtail 1165088,547770,14197 3 0033
+leftrightarrows 1048579,707789,189584 3 0034
+rightleftarrows 1048579,707789,189584 3 0035
+Lsh 524290,725867 2 0036
+Rsh 524290,725867 2 0037
+rightsquigarrow 1048579,396238,-139592 0 0040
+leftrightsquigarrow 1456360,396238,-139592 0 0041
+looparrowleft 1048579,576570 2 0042
+looparrowright 1048579,576570 2 0043
+circeq 815562,765021,240733 3 0044
+succsim 815562,765021,240733 3 0045
+gtrsim 815562,765021,240733 3 0046
+gtrapprox 815562,792549,268261 3 0047
+multimap 1165088,576570 2 0050
+3d 699053,725867 2 0051
+tf "
+therefore "
+because 699053,725867 2 0052
+doteqdot 815562,610248,85960 3 0053
+triangleq 815562,961197,85960 3 0054
+precsim 815562,765021,240733 3 0055
+lesssim 815562,765021,240733 3 0056
+lessapprox 815562,792549,268261 3 0057
+eqslantless 815562,667592,143304 3 0060
+eqslantgtr 815562,667592,143304 3 0061
+curlyeqprec 815562,667592,143304 3 0062
+curlyeqsucc 815562,667592,143304 3 0063
+preccurlyeq 815562,667592,143304 3 0064
+leqq 815562,792549,268261 3 0065
+leqslant 815562,667592,143304 3 0066
+lessgtr 815562,707789,189584 3 0067
+backprime 288358,576570 2 0070
+--- 524290,486557,-37731 2 0071
+risingdotseq 815562,610248,85960 3 0072
+fallingdotseq 815562,610248,85960 3 0073
+succcurlyeq 815562,667592,143304 3 0074
+geqq 815562,792549,268261 3 0075
+geqslant 815562,667592,143304 3 0076
+gtrless 815562,707789,189584 3 0077
+sqsubset 815562,576570,36882 3 0100
+sqsupset 815562,576570,36882 3 0101
+vartriangleright 815562,576570,36882 3 0102
+vartriangleleft 815562,576570,36882 3 0103
+trianglerighteq 815562,667592,143304 3 0104
+trianglelefteq 815562,667592,143304 3 0105
+bigstar 990323,725867,203888 3 0106
+between 524290,792549,268261 3 0107
+blacktriangledown 757307,576570 2 0110
+blacktriangleright 815562,576570,36882 3 0111
+blacktriangleleft 815562,576570,36882 3 0112
+--- 524290,486557,-37731 2 0113
+--- 524290,486557,-37731 2 0114
+vartriangle 757307,576570 2 0115
+blacktriangle 757307,576570 2 0116
+triangledown 757307,576570 2 0117
+eqcirc 815562,725867 2 0120
+lesseqgtr 815562,928714,404426 3 0121
+gtreqless 815562,928714,404426 3 0122
+lesseqqgtr 815562,1030294,506006 3 0123
+gtreqqless 815562,1030294,506006 3 0124
+Ye 786434,707789,0,26214 2 0125
+yen "
+Rrightarrow 1048579,667592,143304 3 0126
+Lleftarrow 1048579,667592,143304 3 0127
+OK 873816,725867 2 0130
+checkmark "
+veebar 640798,725867,203888 3 0131
+barwedge 640798,725867,203888 3 0132
+doublebarwedge 640798,792549,203888 3 0133
+/_ 757307,725867 2 0134
+angle "
+measuredangle 757307,725867 2 0135
+sphericalangle 757307,547770,36882 3 0136
+varpropto 815562,725867 2 0137
+smallsmile 815562,725867,203888 3 0140
+smallfrown 815562,725867,203888 3 0141
+Subset 815562,576570,36882 3 0142
+Supset 815562,576570,36882 3 0143
+Cup 699053,576570 2 0144
+Cap 699053,576570 2 0145
+curlywedge 797355,576570 2 0146
+curlyvee 797355,576570 2 0147
+leftthreetimes 815562,725867 2 0150
+rightthreetimes 815562,725867 2 0151
+subseteqq 815562,792549,268261 3 0152
+supseteqq 815562,792549,268261 3 0153
+bumpeq 815562,576570,63568 3 0154
+Bumpeq 815562,576570,63568 3 0155
+lll 1398106,576570,36882 3 0156
+ggg 1398106,576570,36882 3 0157
+ulcorner 524290,725867 2 0160
+urcorner 524290,725867 2 0161
+rg 992648,725867,163146 3 0162
+circledR "
+circledS 946045,725867,163146 3 0163
+pitchfork 699053,725867 2 0164
+dotplus 815562,725867,85960 3 0165
+backsim 815562,396238,-139592 0 0166
+backsimeq 815562,486557,-37731 2 0167
+llcorner 524290,396238 0 0170
+lrcorner 524290,396238 0 0171
+maltese 873816,725867 2 0172
+complement 524290,865080 2 0173
+intercal 582544,451470,203888 1 0174
+circledcirc 815562,610248,85960 3 0175
+circledast 815562,610248,85960 3 0176
+circleddash 815562,610248,85960 3 0177
diff --git a/font/devdvi/SB b/font/devdvi/SB
new file mode 100644
index 0000000..811b351
--- /dev/null
+++ b/font/devdvi/SB
@@ -0,0 +1,132 @@
+name SB
+special
+internalname msbm10
+spacewidth 314576
+slant 14.036243
+checksum -2001332536
+designsize 10485760
+charset
+lvertneqq 815562,794042,263635 3 0000
+gvertneqq 815562,794042,263635 3 0001
+nleq 815562,832390,317448 3 0002
+ngeq 815562,832390,317448 3 0003
+nless 815562,740048,215760 3 0004
+ngtr 815562,740048,215760 3 0005
+nprec 815562,740048,215760 3 0006
+nsucc 815562,740048,215760 3 0007
+lneqq 815562,794042,263635 3 0010
+gneqq 815562,794042,263635 3 0011
+nleqslant 815562,832390,317448 3 0012
+ngeqslant 815562,832390,317448 3 0013
+lneq 815562,666864,142576 3 0014
+gneq 815562,666864,142576 3 0015
+npreceq 815562,832390,317448 3 0016
+nsucceq 815562,832390,317448 3 0017
+precnsim 815562,777110,243501 3 0020
+succnsim 815562,777110,243501 3 0021
+lnsim 815562,777110,243501 3 0022
+gnsim 815562,777110,243501 3 0023
+nleqq 815562,964179,439891 3 0024
+ngeqq 815562,964179,439891 3 0025
+precneqq 815562,794042,263635 3 0026
+succneqq 815562,794042,263635 3 0027
+precnapprox 815562,794042,274379 3 0030
+succnapprox 815562,794042,274379 3 0031
+lnapprox 815562,794042,274379 3 0032
+gnapprox 815562,794042,274379 3 0033
+nsim 815562,384696,-139592 0 0034
+ncong 815562,832390,317448 3 0035
+diagup 932070,722352,203888 3 0036
+diagdown 932070,777110,203888 3 0037
+varsubsetneq 815562,666864,142576 3 0040
+varsupsetneq 815562,666864,142576 3 0041
+nsubseteqq 815562,794042,263635 3 0042
+nsupseteqq 815562,794042,263635 3 0043
+subsetneqq 815562,832390,298650 3 0044
+supsetneqq 815562,832390,298650 3 0045
+varsubsetneqq 815562,794042,263635 3 0046
+varsupsetneqq 815562,794042,263635 3 0047
+subsetneq 815562,666864,142576 3 0050
+supsetneq 815562,666864,142576 3 0051
+nsubseteq 815562,832390,317448 3 0052
+nsupseteq 815562,832390,317448 3 0053
+nparallel 524290,777110,263635 3 0054
+nmid 291272,777110,263635 3 0055
+nshortmid 233018,609920,85632 3 0056
+nshortparallel 407781,609920,85632 3 0057
+nvdash 640798,722352 2 0060
+nVdash 757307,722352 2 0061
+nvDash 640798,722352 2 0062
+nVDash 757307,722352 2 0063
+ntrianglerighteq 815562,832390,317448 3 0064
+ntrianglelefteq 815562,832390,317448 3 0065
+ntriangleleft 815562,740048,215760 3 0066
+ntriangleright 815562,740048,215760 3 0067
+nleftarrow 1048579,384696,-139592 0 0070
+nrightarrow 1048579,384696,-139592 0 0071
+nLeftarrow 1048579,384696,-139592 0 0072
+nRightarrow 1048579,384696,-139592 0 0073
+nLeftrightarrow 1048579,384696,-139592 0 0074
+nleftrightarrow 1048579,384696,-139592 0 0075
+divideontimes 815562,609920,85632 3 0076
+varnothing 815562,609920,85632 3 0077
+nexists 582544,722352 2 0100
+BbbA 757307,722352 2 0101
+BbbB 699053,722352 2 0102
+BbbC 757307,722352 2 0103
+BbbD 757307,722352 2 0104
+BbbE 699053,722352 2 0105
+BbbF 640798,722352 2 0106
+BbbG 815562,722352 2 0107
+BbbH 815562,722352 2 0110
+BbbI 407781,722352 2 0111
+BbbJ 524290,722352,174763 3 0112
+BbbK 815562,722352 2 0113
+BbbL 699053,722352 2 0114
+BbbM 990325,722352 2 0115
+BbbN 757307,722352 2 0116
+BbbO 815562,722352,174763 3 0117
+BbbP 640798,722352 2 0120
+BbbQ 815562,722352,174763 3 0121
+BbbR 757307,722352 2 0122
+BbbS 582544,722352 2 0123
+BbbT 699053,722352 2 0124
+BbbU 757307,722352 2 0125
+BbbV 757307,722352 2 0126
+BbbW 1048579,722352 2 0127
+BbbX 757307,722352 2 0130
+BbbY 757307,722352 2 0131
+BbbZ 699053,722352 2 0132
+--- 1980650,865080 2 0133
+--- 2446685,865080 2 0134
+--- 1980650,865080 2 0135
+--- 2446685,943717 2 0136
+Finv 582544,722352 2 0140
+Game 669925,722352 2 0141
+mho 757307,722352 2 0146
+eth 582544,722352 2 0147
+eqsim 815562,486275,-38013 2 0150
+beth 699053,722352 2 0151
+gimel 466035,722352 2 0152
+daleth 699053,722352 2 0153
+lessdot 815562,565285,40997 3 0154
+gtrdot 815562,565285,40997 3 0155
+ltimes 815562,609920,85632 3 0156
+rtimes 815562,609920,85632 3 0157
+shortmid 233018,609920,85632 3 0160
+shortparallel 407781,609920,85632 3 0161
+smallsetminus 815562,609920,85632 3 0162
+thicksim 815562,384696,-139592 0 0163
+thickapprox 815562,506590,-17698 2 0164
+approxeq 815562,609920,85632 3 0165
+succapprox 815562,794042,274379 3 0166
+precapprox 815562,794042,274379 3 0167
+curvearrowleft 1048579,451470 0 0170
+curvearrowright 1048579,451470 0 0171
+digamma 815562,609920,85632 3 0172
+varkappa 699053,451470,0,42235 0 0173
+Bbbk 582544,722352 2 0174
+hslash 566525,722352 2 0175
+-h 566525,722352 2 0176
+hbar "
+backepsilon 450016,451470 0 0177
diff --git a/font/devdvi/SC b/font/devdvi/SC
new file mode 100644
index 0000000..43497b2
--- /dev/null
+++ b/font/devdvi/SC
@@ -0,0 +1,137 @@
+name SC
+special
+internalname cmtex10
+spacewidth 550498
+checksum -538297224
+designsize 10485760
+charset
+pc 550498,534482,-106315 2 0000
+md "
+da 550498,640797 2 0001
+*a 550498,451470 0 0002
+*b 550498,640797,233018 3 0003
+AN 550498,512640 2 0004
+tno 550498,451470 0 0005
+no "
+mo 550498,582542,-58254 2 0006
+*p 550498,451470 0 0007
+*l 550498,640797 2 0010
+*g 550498,451470,233018 1 0011
+*d 550498,640797 2 0012
+ua 550498,640797 2 0013
+pm 550498,556326,-84470 2 0014
+c+ 550498,556326,-84470 2 0015
+if 550498,451470 0 0016
+pd 550498,640797 2 0017
+sb 550498,582542,-58254 2 0020
+sp 550498,582542,-58254 2 0021
+ca 550498,512640 2 0022
+cu 550498,512640 2 0023
+fa 550498,640797 2 0024
+te 550498,640797 2 0025
+c* 550498,556326,-84470 2 0026
+u21C6 550498,628053,-12744 2 0027
+<- 550498,435813,-204984 0 0030
+-> 550498,435813,-204984 0 0031
+!= 550498,672827,32030 3 0032
+u22C4 550498,534482,-106315 2 0033
+<= 550498,661547,20750 3 0034
+>= 550498,661547,20750 3 0035
+== 550498,514818,-125979 2 0036
+OR 550498,512640 2 0037
+--- 550498 0 0040
+--- 550498,640797 2 0041
+--- 550498,640797 2 0042
+--- 550498,640797 2 0043
+--- 550498,728178,87381 3 0044
+--- 550498,728178,87381 3 0045
+--- 550498,640797 2 0046
+--- 550498,640797 2 0047
+--- 550498,728178,87379 3 0050
+--- 550498,728178,87379 3 0051
+--- 550498,546134 2 0052
+--- 550498,556326,-84470 2 0053
+--- 550498,131072,145635 1 0054
+--- 550498,556326,-84470 2 0055
+--- 550498,131072 0 0056
+--- 550498,728178,87379 3 0057
+--- 550498,640797 2 0060
+--- 550498,640797 2 0061
+--- 550498,640797 2 0062
+--- 550498,640797 2 0063
+--- 550498,640797 2 0064
+--- 550498,640797 2 0065
+--- 550498,640797 2 0066
+--- 550498,640797 2 0067
+--- 550498,640797 2 0070
+--- 550498,640797 2 0071
+--- 550498,451470 0 0072
+--- 550498,451470,145635 1 0073
+--- 550498,582542,-58254 2 0074
+--- 550498,435813,-204984 0 0075
+--- 550498,582542,-58254 2 0076
+--- 550498,640797 2 0077
+--- 550498,640797 2 0100
+--- 550498,640797 2 0101
+--- 550498,640797 2 0102
+--- 550498,640797 2 0103
+--- 550498,640797 2 0104
+--- 550498,640797 2 0105
+--- 550498,640797 2 0106
+--- 550498,640797 2 0107
+--- 550498,640797 2 0110
+--- 550498,640797 2 0111
+--- 550498,640797 2 0112
+--- 550498,640797 2 0113
+--- 550498,640797 2 0114
+--- 550498,640797 2 0115
+--- 550498,640797 2 0116
+--- 550498,640797 2 0117
+--- 550498,640797 2 0120
+--- 550498,640797,145635 3 0121
+--- 550498,640797 2 0122
+--- 550498,640797 2 0123
+--- 550498,640797 2 0124
+--- 550498,640797 2 0125
+--- 550498,640797 2 0126
+--- 550498,640797 2 0127
+--- 550498,640797 2 0130
+--- 550498,640797 2 0131
+--- 550498,640797 2 0132
+--- 550498,728178,87379 3 0133
+--- 550498,728178,87379 3 0134
+--- 550498,728178,87379 3 0135
+--- 550498,640797 2 0136
+--- 550498,0,99757 1 0137
+--- 550498,640797 2 0140
+--- 550498,451470 0 0141
+--- 550498,640797 2 0142
+--- 550498,451470 0 0143
+--- 550498,640797 2 0144
+--- 550498,451470 0 0145
+--- 550498,640797 2 0146
+--- 550498,451470,233018 1 0147
+--- 550498,640797 2 0150
+--- 550498,640797 2 0151
+--- 550498,640797,233018 3 0152
+--- 550498,640797 2 0153
+--- 550498,640797 2 0154
+--- 550498,451470 0 0155
+--- 550498,451470 0 0156
+--- 550498,451470 0 0157
+--- 550498,451470,233018 1 0160
+--- 550498,451470,233018 1 0161
+--- 550498,451470 0 0162
+--- 550498,451470 0 0163
+--- 550498,580466 2 0164
+--- 550498,451470 0 0165
+--- 550498,451470 0 0166
+--- 550498,451470 0 0167
+--- 550498,451470 0 0170
+--- 550498,451470,233018 1 0171
+--- 550498,451470 0 0172
+--- 550498,728178,87379 3 0173
+--- 550498,728178,87379 3 0174
+--- 550498,728178,87379 3 0175
+--- 550498,640797 2 0176
+is 550498,640797,233018 3 0177
diff --git a/font/devdvi/TB b/font/devdvi/TB
new file mode 100644
index 0000000..581840a
--- /dev/null
+++ b/font/devdvi/TB
@@ -0,0 +1,348 @@
+#
+# manually added kerning for `` and ''
+#
+name TB
+internalname cmbx10
+spacewidth 401952
+ligatures ff fi fl ffi ffl 0
+checksum 452076118
+designsize 10485760
+kernpairs
+ff cq 114323
+ff ' 114323
+ff ? 114323
+ff ! 114323
+ff ) 114323
+ff rB 114323
+ff ] 114323
+' ' -100488
+' cq -100488
+cq ' -100488
+cq cq -100488
+slash@for@l l -334960
+slash@for@l L -396128
+cq ? 133984
+' ? 133984
+cq ! 133984
+' ! 133984
+A t -33496
+A C -33496
+A O -33496
+A G -33496
+A U -33496
+A Q -33496
+A T -100488
+A Y -100488
+A V -133984
+A W -133984
+D X -33496
+D W -33496
+D A -33496
+D V -33496
+D Y -33496
+F o -100488
+F e -100488
+F u -100488
+F r -100488
+F a -100488
+F A -133984
+F O -33496
+F C -33496
+F G -33496
+F Q -33496
+I I 33496
+K O -33496
+K C -33496
+K G -33496
+K Q -33496
+L T -100488
+L Y -100488
+L V -133984
+L W -133984
+O X -33496
+O W -33496
+O A -33496
+O V -33496
+O Y -33496
+P A -100488
+P o -33496
+P e -33496
+P a -33496
+P . -100488
+P , -100488
+R t -33496
+R C -33496
+R O -33496
+R G -33496
+R U -33496
+R Q -33496
+R T -100488
+R Y -100488
+R V -133984
+R W -133984
+T y -33496
+T e -100488
+T o -100488
+T r -100488
+T a -100488
+T A -100488
+T u -100488
+V o -100488
+V e -100488
+V u -100488
+V r -100488
+V a -100488
+V A -133984
+V O -33496
+V C -33496
+V G -33496
+V Q -33496
+W o -100488
+W e -100488
+W u -100488
+W r -100488
+W a -100488
+W A -133984
+W O -33496
+W C -33496
+W G -33496
+W Q -33496
+X O -33496
+X C -33496
+X G -33496
+X Q -33496
+Y e -100488
+Y o -100488
+Y r -100488
+Y a -100488
+Y A -100488
+Y u -100488
+oq oq -100488
+oq ` -100488
+` oq -100488
+` ` -100488
+a v -33496
+a j 66992
+a y -33496
+a w -33496
+b e 33496
+b o 33496
+b x -33496
+b d 33496
+b c 33496
+b q 33496
+b v -33496
+b j 66992
+b y -33496
+b w -33496
+c h -33496
+c k -33496
+f cq 114323
+f ' 114323
+f ? 114323
+f ! 114323
+f ) 114323
+f rB 114323
+f ] 114323
+g j 33496
+h t -33496
+h u -33496
+h b -33496
+h y -33496
+h v -33496
+h w -33496
+k a -66992
+k e -33496
+k a -33496
+k o -33496
+k c -33496
+m t -33496
+m u -33496
+m b -33496
+m y -33496
+m v -33496
+m w -33496
+n t -33496
+n u -33496
+n b -33496
+n y -33496
+n v -33496
+n w -33496
+o e 33496
+o o 33496
+o x -33496
+o d 33496
+o c 33496
+o q 33496
+o v -33496
+o j 66992
+o y -33496
+o w -33496
+p e 33496
+p o 33496
+p x -33496
+p d 33496
+p c 33496
+p q 33496
+p v -33496
+p j 66992
+p y -33496
+p w -33496
+t y -33496
+t w -33496
+u w -33496
+v a -66992
+v e -33496
+v a -33496
+v o -33496
+v c -33496
+w e -33496
+w a -33496
+w o -33496
+w c -33496
+y o -33496
+y e -33496
+y a -33496
+y . -100488
+y , -100488
+charset
+*G 725261,719440,0,0,0,-167480 2 0000
+*D 1004880,719440 2 0001
+*H 937888,719440,0,0,-33496,-33496 2 0002
+*L 844682,719440 2 0003
+*C 803904,719440 2 0004
+*P 943714,719440 2 0005
+*S 870896,719440 2 0006
+*U 937888,719440,0,0,-33496,-167480 2 0007
+*F 870896,719440,0,0,-33496 2 0010
+*Q 937888,719440,0,0,-33496,-83741 2 0011
+*W 870896,719440 2 0012
+ff 703416,728178,0,114323 2 0013
+fi 669920,728178 2 0014
+fl 669920,728178 2 0015
+Fi 1004880,728178 2 0016
+Fl 1004880,728178 2 0017
+.i 334960,466034 0 0020
+.j 368456,466034,203890 1 0021
+ga 602928,728178 2 0022
+aa 602928,728178 2 0023
+ah 602928,662642 2 0024
+ab 602928,728178 2 0025
+a- 602928,625066 2 0026
+ao 911674,728178 2 0027
+ac 535936,0,178403 1 0030
+ss 626230,728178 2 0031
+ae 870896,466034 0 0032
+oe 937888,466034 0 0033
+/o 602928,567979,101946 3 0034
+AE 1092261,719440 2 0035
+OE 1226245,719440 2 0036
+/O 937888,770413,50973 3 0037
+slash@for@l 334960,466034 0 0040
+! 367000,728178 2 0041
+rq 632056,728178 2 0042
+sh 1004880,728178,203888 3 0043
+# "
+Do 602928,786432,58254 3 0044
+$ "
+% 1004880,786432,58254 3 0045
+& 937888,728178 2 0046
+cq 334960,728178 2 0047
+' "
+( 468944,786432,262144 3 0050
+) 468944,786432,262144 3 0051
+* 602928,786432 2 0052
++ 937888,664096,139808 3 0053
+, 334960,163112,203890 1 0054
+hy 401952,466034 0 0055
+- "
+. 334960,163112 0 0056
+sl 602928,786432,262144 3 0057
+/ "
+0 602928,675749 2 0060
+1 602928,675749 2 0061
+2 602928,675749 2 0062
+3 602928,675749 2 0063
+4 602928,675749 2 0064
+5 602928,675749 2 0065
+6 602928,675749 2 0066
+7 602928,675749 2 0067
+8 602928,675749 2 0070
+9 602928,675749 2 0071
+: 334960,466034 0 0072
+; 334960,466034,203890 1 0073
+r! 367000,524288,203890 3 0074
+= 937888,410110,-114178 0 0075
+r? 569432,524288,203890 3 0076
+? 569432,728178 2 0077
+at 937888,728178 2 0100
+@ "
+A 911674,719440 2 0101
+B 857789,719440 2 0102
+C 870896,719440,0,0,-33496 2 0103
+D 924781,719440,0,0,0,-33496 2 0104
+E 792253,719440 2 0105
+F 758757,719440,0,0,0,-167480 2 0106
+G 948083,719440,0,0,-33496 2 0107
+H 943714,719440 2 0110
+I 457294,719440 2 0111
+J 623317,719440,0,0,0,-33496 2 0112
+K 945170,719440 2 0113
+L 725261,719440,0,0,0,66992 2 0114
+M 1144690,719440 2 0115
+N 943714,719440 2 0116
+O 905848,719440,0,0,-33496,-33496 2 0117
+P 824293,719440,0,0,0,-167480 2 0120
+Q 905848,719440,203890,0,-33496 3 0121
+R 904392,719440 2 0122
+S 669920,719440 2 0123
+T 838856,719440,0,0,0,-167480 2 0124
+U 927694,719440,0,0,-20389 2 0125
+V 911674,719440,0,16749,50245,-251219 2 0126
+W 1246634,719440,0,16749,50245,-150731 2 0127
+X 911674,719440 2 0130
+Y 911674,719440,0,30146,33496,-237822 2 0131
+Z 736912,719440 2 0132
+lB 334960,786432,262144 3 0133
+[ "
+lq 632056,728178 2 0134
+rB 334960,786432,262144 3 0135
+] "
+ha 602928,728178 2 0136
+^ "
+a^ "
+a. 334960,728178 2 0137
+oq 334960,728178 2 0140
+` "
+a 586179,466034 0 0141
+b 669920,728178 2 0142
+c 535936,466034 0 0143
+d 669920,728178 2 0144
+e 552685,466034 0 0145
+f 368456,728178,0,114323 2 0146
+g 602928,466034,203890,16749 1 0147
+h 669920,728178 2 0150
+i 334960,728178 2 0151
+j 368456,728178,203890 3 0152
+k 636424,728178 2 0153
+l 334960,728178 2 0154
+m 1004880,466034 0 0155
+n 669920,466034 0 0156
+o 602928,466034 0 0157
+p 669920,466034,203890 1 0160
+q 636424,466034,203890 1 0161
+r 496616,466034 0 0162
+s 475643,466034 0 0163
+t 468944,665763 2 0164
+u 669920,466034 0 0165
+v 636424,466034,0,16749 0 0166
+w 870896,466034,0,16749 0 0167
+x 636424,466034 0 0170
+y 636424,466034,203890,16749 1 0171
+z 535936,466034 0 0172
+en 602928,466034,0,33496 0 0173
+em 1205856,466034,0,33496 0 0174
+a" 602928,728178 2 0175
+~ 602928,728178 2 0176
+a~ "
+ad 602928,728178 2 0177
diff --git a/font/devdvi/TBEC b/font/devdvi/TBEC
new file mode 100644
index 0000000..7ee1a69
--- /dev/null
+++ b/font/devdvi/TBEC
@@ -0,0 +1,2306 @@
+name TBEC
+internalname ecbx1000
+spacewidth 401856
+ligatures ff fi fl ffi ffl 0
+checksum 39675532
+designsize 10485760
+kernpairs
+bq Bq 133952
+bq j 133952
+bq .j 133952
+bq g 66976
+bq u0067_0306 66976
+bq y 66976
+bq :y 66976
+bq 'y 66976
+bq v -100464
+bq w -66976
+bq V -133952
+bq W -100464
+bq Y -100464
+bq :Y -100464
+bq 'Y -100464
+bq O -33488
+bq u004F_030B -33488
+bq `O -33488
+bq 'O -33488
+bq ^O -33488
+bq ~O -33488
+bq :O -33488
+bq OE -33488
+bq /O -33488
+bq C -33488
+bq G -33488
+bq 'C -33488
+bq u0043_030C -33488
+bq u0047_0306 -33488
+bq ,C -33488
+bq Q -33488
+lq oq 133952
+lq ` 133952
+lq lq 133952
+rq cq 133952
+rq ' 133952
+rq rq 133952
+Bq bq 133952
+Bq , 133952
+Bq Bq 133952
+Bq j 133952
+Bq .j 133952
+Bq g 66976
+Bq u0067_0306 66976
+Bq y 66976
+Bq :y 66976
+Bq 'y 66976
+Bq v -100464
+Bq w -66976
+Bq V -133952
+Bq W -100464
+Bq Y -100464
+Bq :Y -100464
+Bq 'Y -100464
+Bq O -33488
+Bq u004F_030B -33488
+Bq `O -33488
+Bq 'O -33488
+Bq ^O -33488
+Bq ~O -33488
+Bq :O -33488
+Bq OE -33488
+Bq /O -33488
+Bq C -33488
+Bq G -33488
+Bq 'C -33488
+Bq u0043_030C -33488
+Bq u0047_0306 -33488
+Bq ,C -33488
+Bq Q -33488
+Fc . -100464
+Fc , -100464
+ff cq 114296
+ff ' 114296
+ff oq 114296
+ff ` 114296
+ff lq 114296
+ff rq 114296
+ff ? 114296
+ff u01C3 114296
+ff ! 114296
+ff ) 114296
+ff rB 114296
+ff ] 114296
+cq rq 133952
+' rq 133952
+cq ? 133952
+' ? 133952
+cq u01C3 133952
+cq ! 133952
+' u01C3 133952
+' ! 133952
+A y -100464
+A :y -100464
+A 'y -100464
+A v -133952
+A w -100464
+A c -33488
+A 'c -33488
+A u0063_030C -33488
+A ,c -33488
+A d -33488
+A u0064_030C -33488
+A u0111 -33488
+A Sd -33488
+A e -33488
+A u0065_030C -33488
+A u0065_0328 -33488
+A `e -33488
+A 'e -33488
+A ^e -33488
+A :e -33488
+A o -33488
+A u006F_030B -33488
+A `o -33488
+A 'o -33488
+A ^o -33488
+A ~o -33488
+A :o -33488
+A oe -33488
+A /o -33488
+A q -33488
+A t -33488
+A u0074_030C -33488
+A u0074_0327 -33488
+A C -33488
+A G -33488
+A 'C -33488
+A u0043_030C -33488
+A u0047_0306 -33488
+A ,C -33488
+A Q -33488
+A O -33488
+A u004F_030B -33488
+A `O -33488
+A 'O -33488
+A ^O -33488
+A ~O -33488
+A :O -33488
+A OE -33488
+A /O -33488
+A U -33488
+A u0055_030B -33488
+A u0055_030A -33488
+A `U -33488
+A 'U -33488
+A ^U -33488
+A :U -33488
+A T -100464
+A u0054_030C -100464
+A u0054_0327 -100464
+A Y -100464
+A :Y -100464
+A 'Y -100464
+A V -133952
+A W -133952
+D X -33488
+D W -33488
+D A -33488
+D u0041_0306 -33488
+D u0041_0328 -33488
+D `A -33488
+D 'A -33488
+D ^A -33488
+D ~A -33488
+D :A -33488
+D oA -33488
+D AE -33488
+D V -33488
+D Y -33488
+D :Y -33488
+D 'Y -33488
+F o -100464
+F a -100464
+F e -100464
+F y -100464
+F u -100464
+F r -100464
+F v -100464
+F s -100464
+F c -100464
+F d -100464
+F g -100464
+F m -100464
+F n -100464
+F p -100464
+F w -100464
+F z -100464
+F ae -100464
+F /o -100464
+F A -133952
+F u0041_0306 -133952
+F u0041_0328 -133952
+F `A -133952
+F 'A -133952
+F ^A -133952
+F ~A -133952
+F :A -133952
+F oA -133952
+F AE -133952
+F O -33488
+F u004F_030B -33488
+F `O -33488
+F 'O -33488
+F ^O -33488
+F ~O -33488
+F :O -33488
+F OE -33488
+F /O -33488
+F C -33488
+F G -33488
+F 'C -33488
+F u0043_030C -33488
+F u0047_0306 -33488
+F ,C -33488
+F Q -33488
+I I 33488
+K v -100464
+K w -33488
+K o -33488
+K u006F_030B -33488
+K `o -33488
+K 'o -33488
+K ^o -33488
+K ~o -33488
+K :o -33488
+K oe -33488
+K /o -33488
+K C -33488
+K G -33488
+K 'C -33488
+K u0043_030C -33488
+K u0047_0306 -33488
+K ,C -33488
+K Q -33488
+L T -100464
+L u0054_030C -100464
+L u0054_0327 -100464
+L Y -100464
+L :Y -100464
+L 'Y -100464
+L V -133952
+L W -133952
+O X -33488
+O W -33488
+O A -33488
+O u0041_0306 -33488
+O u0041_0328 -33488
+O `A -33488
+O 'A -33488
+O ^A -33488
+O ~A -33488
+O :A -33488
+O oA -33488
+O AE -33488
+O V -33488
+O Y -33488
+O :Y -33488
+O 'Y -33488
+P A -100464
+P u0041_0306 -100464
+P u0041_0328 -100464
+P `A -100464
+P 'A -100464
+P ^A -100464
+P ~A -100464
+P :A -100464
+P oA -100464
+P AE -100464
+P o -33488
+P u006F_030B -33488
+P `o -33488
+P 'o -33488
+P ^o -33488
+P ~o -33488
+P :o -33488
+P oe -33488
+P /o -33488
+P e -33488
+P u0065_030C -33488
+P u0065_0328 -33488
+P `e -33488
+P 'e -33488
+P ^e -33488
+P :e -33488
+P a -33488
+P u0061_0306 -33488
+P u0061_0328 -33488
+P `a -33488
+P 'a -33488
+P ^a -33488
+P ^a -33488
+P ~a -33488
+P :a -33488
+P oa -33488
+P ae -33488
+P . -100464
+P , -100464
+R t -33488
+R u0074_030C -33488
+R u0074_0327 -33488
+R C -33488
+R G -33488
+R 'C -33488
+R u0043_030C -33488
+R u0047_0306 -33488
+R ,C -33488
+R Q -33488
+R O -33488
+R u004F_030B -33488
+R `O -33488
+R 'O -33488
+R ^O -33488
+R ~O -33488
+R :O -33488
+R OE -33488
+R /O -33488
+R U -33488
+R u0055_030B -33488
+R u0055_030A -33488
+R `U -33488
+R 'U -33488
+R ^U -33488
+R :U -33488
+R T -100464
+R u0054_030C -100464
+R u0054_0327 -100464
+R Y -100464
+R :Y -100464
+R 'Y -100464
+R V -133952
+R W -133952
+T y -33488
+T e -100464
+T o -100464
+T r -100464
+T a -100464
+T u -100464
+T n -100464
+T .i -100464
+T c -100464
+T d -100464
+T g -100464
+T p -100464
+T s -100464
+T v -100464
+T w -100464
+T x -100464
+T z -100464
+T A -100464
+T u0041_0306 -100464
+T u0041_0328 -100464
+T `A -100464
+T 'A -100464
+T ^A -100464
+T ~A -100464
+T :A -100464
+T oA -100464
+T AE -100464
+V o -100464
+V a -100464
+V e -100464
+V y -100464
+V u -100464
+V r -100464
+V v -100464
+V s -100464
+V c -100464
+V d -100464
+V g -100464
+V m -100464
+V n -100464
+V p -100464
+V w -100464
+V z -100464
+V ae -100464
+V /o -100464
+V A -133952
+V u0041_0306 -133952
+V u0041_0328 -133952
+V `A -133952
+V 'A -133952
+V ^A -133952
+V ~A -133952
+V :A -133952
+V oA -133952
+V AE -133952
+V O -33488
+V u004F_030B -33488
+V `O -33488
+V 'O -33488
+V ^O -33488
+V ~O -33488
+V :O -33488
+V OE -33488
+V /O -33488
+V C -33488
+V G -33488
+V 'C -33488
+V u0043_030C -33488
+V u0047_0306 -33488
+V ,C -33488
+V Q -33488
+W o -100464
+W a -100464
+W e -100464
+W y -100464
+W u -100464
+W r -100464
+W v -100464
+W s -100464
+W c -100464
+W d -100464
+W g -100464
+W m -100464
+W n -100464
+W p -100464
+W w -100464
+W z -100464
+W ae -100464
+W /o -100464
+W A -133952
+W u0041_0306 -133952
+W u0041_0328 -133952
+W `A -133952
+W 'A -133952
+W ^A -133952
+W ~A -133952
+W :A -133952
+W oA -133952
+W AE -133952
+W O -33488
+W u004F_030B -33488
+W `O -33488
+W 'O -33488
+W ^O -33488
+W ~O -33488
+W :O -33488
+W OE -33488
+W /O -33488
+W C -33488
+W G -33488
+W 'C -33488
+W u0043_030C -33488
+W u0047_0306 -33488
+W ,C -33488
+W Q -33488
+X O -33488
+X u004F_030B -33488
+X `O -33488
+X 'O -33488
+X ^O -33488
+X ~O -33488
+X :O -33488
+X OE -33488
+X /O -33488
+X C -33488
+X G -33488
+X 'C -33488
+X u0043_030C -33488
+X u0047_0306 -33488
+X ,C -33488
+X Q -33488
+Y e -100464
+Y o -100464
+Y r -100464
+Y a -100464
+Y u -100464
+Y n -100464
+Y .i -100464
+Y c -100464
+Y d -100464
+Y g -100464
+Y p -100464
+Y s -100464
+Y v -100464
+Y w -100464
+Y x -100464
+Y z -100464
+Y A -100464
+Y u0041_0306 -100464
+Y u0041_0328 -100464
+Y `A -100464
+Y 'A -100464
+Y ^A -100464
+Y ~A -100464
+Y :A -100464
+Y oA -100464
+Y AE -100464
+oq lq 133952
+` lq 133952
+oq ? 133952
+` ? 133952
+oq u01C3 133952
+oq ! 133952
+` u01C3 133952
+` ! 133952
+a v -33488
+a j 66976
+a y -33488
+a :y -33488
+a 'y -33488
+a w -33488
+b e 33488
+b u0065_030C 33488
+b u0065_0328 33488
+b `e 33488
+b 'e 33488
+b ^e 33488
+b :e 33488
+b o 33488
+b u006F_030B 33488
+b `o 33488
+b 'o 33488
+b ^o 33488
+b ~o 33488
+b :o 33488
+b oe 33488
+b /o 33488
+b x -33488
+b d 33488
+b c 33488
+b 'c 33488
+b u0063_030C 33488
+b ,c 33488
+b q 33488
+b v -33488
+b j 66976
+b y -33488
+b :y -33488
+b 'y -33488
+b w -33488
+c h -33488
+c k -33488
+e V -100464
+f cq 114296
+f ' 114296
+f oq 114296
+f ` 114296
+f lq 114296
+f rq 114296
+f ? 114296
+f u01C3 114296
+f ! 114296
+f ) 114296
+f rB 114296
+f ] 114296
+g j 33488
+h W -100464
+h V -100464
+h t -33488
+h u -33488
+h u0075_030B -33488
+h u0075_030A -33488
+h `u -33488
+h 'u -33488
+h ^u -33488
+h :u -33488
+h b -33488
+h y -33488
+h v -33488
+h w -33488
+k W -100464
+k V -100464
+k a -66976
+k u0061_0306 -66976
+k u0061_0328 -66976
+k `a -66976
+k 'a -66976
+k ^a -66976
+k ^a -66976
+k ~a -66976
+k :a -66976
+k oa -66976
+k ae -66976
+k e -33488
+k u0065_030C -33488
+k u0065_0328 -33488
+k `e -33488
+k 'e -33488
+k ^e -33488
+k :e -33488
+k a -33488
+k u0061_0306 -33488
+k u0061_0328 -33488
+k `a -33488
+k 'a -33488
+k ^a -33488
+k ^a -33488
+k ~a -33488
+k :a -33488
+k oa -33488
+k ae -33488
+k o -33488
+k u006F_030B -33488
+k `o -33488
+k 'o -33488
+k ^o -33488
+k ~o -33488
+k :o -33488
+k oe -33488
+k /o -33488
+k c -33488
+k 'c -33488
+k u0063_030C -33488
+k ,c -33488
+m W -100464
+m V -100464
+m t -33488
+m u -33488
+m u0075_030B -33488
+m u0075_030A -33488
+m `u -33488
+m 'u -33488
+m ^u -33488
+m :u -33488
+m b -33488
+m y -33488
+m v -33488
+m w -33488
+n W -100464
+n V -100464
+n t -33488
+n u -33488
+n u0075_030B -33488
+n u0075_030A -33488
+n `u -33488
+n 'u -33488
+n ^u -33488
+n :u -33488
+n b -33488
+n y -33488
+n v -33488
+n w -33488
+o e 33488
+o u0065_030C 33488
+o u0065_0328 33488
+o `e 33488
+o 'e 33488
+o ^e 33488
+o :e 33488
+o o 33488
+o u006F_030B 33488
+o `o 33488
+o 'o 33488
+o ^o 33488
+o ~o 33488
+o :o 33488
+o oe 33488
+o /o 33488
+o x -33488
+o d 33488
+o c 33488
+o 'c 33488
+o u0063_030C 33488
+o ,c 33488
+o q 33488
+o v -33488
+o j 66976
+o y -33488
+o :y -33488
+o 'y -33488
+o w -33488
+p e 33488
+p u0065_030C 33488
+p u0065_0328 33488
+p `e 33488
+p 'e 33488
+p ^e 33488
+p :e 33488
+p o 33488
+p u006F_030B 33488
+p `o 33488
+p 'o 33488
+p ^o 33488
+p ~o 33488
+p :o 33488
+p oe 33488
+p /o 33488
+p x -33488
+p d 33488
+p c 33488
+p 'c 33488
+p u0063_030C 33488
+p ,c 33488
+p q 33488
+p v -33488
+p j 66976
+p y -33488
+p :y -33488
+p 'y -33488
+p w -33488
+t y -33488
+t :y -33488
+t 'y -33488
+t w -33488
+u w -33488
+v a -66976
+v u0061_0306 -66976
+v u0061_0328 -66976
+v `a -66976
+v 'a -66976
+v ^a -66976
+v ^a -66976
+v ~a -66976
+v :a -66976
+v oa -66976
+v ae -66976
+v e -33488
+v u0065_030C -33488
+v u0065_0328 -33488
+v `e -33488
+v 'e -33488
+v ^e -33488
+v :e -33488
+v a -33488
+v u0061_0306 -33488
+v u0061_0328 -33488
+v `a -33488
+v 'a -33488
+v ^a -33488
+v ^a -33488
+v ~a -33488
+v :a -33488
+v oa -33488
+v ae -33488
+v o -33488
+v u006F_030B -33488
+v `o -33488
+v 'o -33488
+v ^o -33488
+v ~o -33488
+v :o -33488
+v oe -33488
+v /o -33488
+v c -33488
+v 'c -33488
+v u0063_030C -33488
+v ,c -33488
+w e -33488
+w u0065_030C -33488
+w u0065_0328 -33488
+w `e -33488
+w 'e -33488
+w ^e -33488
+w :e -33488
+w a -33488
+w u0061_0306 -33488
+w u0061_0328 -33488
+w `a -33488
+w 'a -33488
+w ^a -33488
+w ^a -33488
+w ~a -33488
+w :a -33488
+w oa -33488
+w ae -33488
+w o -33488
+w u006F_030B -33488
+w `o -33488
+w 'o -33488
+w ^o -33488
+w ~o -33488
+w :o -33488
+w oe -33488
+w /o -33488
+w c -33488
+w 'c -33488
+w u0063_030C -33488
+w ,c -33488
+y o -33488
+y u006F_030B -33488
+y `o -33488
+y 'o -33488
+y ^o -33488
+y ~o -33488
+y :o -33488
+y oe -33488
+y /o -33488
+y e -33488
+y u0065_030C -33488
+y u0065_0328 -33488
+y `e -33488
+y 'e -33488
+y ^e -33488
+y :e -33488
+y a -33488
+y u0061_0306 -33488
+y u0061_0328 -33488
+y `a -33488
+y 'a -33488
+y ^a -33488
+y ^a -33488
+y ~a -33488
+y :a -33488
+y oa -33488
+y ae -33488
+y . -100464
+y , -100464
+u0041_0306 y -100464
+u0041_0306 :y -100464
+u0041_0306 'y -100464
+u0041_0306 v -133952
+u0041_0306 w -100464
+u0041_0306 c -33488
+u0041_0306 'c -33488
+u0041_0306 u0063_030C -33488
+u0041_0306 ,c -33488
+u0041_0306 d -33488
+u0041_0306 u0064_030C -33488
+u0041_0306 u0111 -33488
+u0041_0306 Sd -33488
+u0041_0306 e -33488
+u0041_0306 u0065_030C -33488
+u0041_0306 u0065_0328 -33488
+u0041_0306 `e -33488
+u0041_0306 'e -33488
+u0041_0306 ^e -33488
+u0041_0306 :e -33488
+u0041_0306 o -33488
+u0041_0306 u006F_030B -33488
+u0041_0306 `o -33488
+u0041_0306 'o -33488
+u0041_0306 ^o -33488
+u0041_0306 ~o -33488
+u0041_0306 :o -33488
+u0041_0306 oe -33488
+u0041_0306 /o -33488
+u0041_0306 q -33488
+u0041_0306 t -33488
+u0041_0306 u0074_030C -33488
+u0041_0306 u0074_0327 -33488
+u0041_0306 C -33488
+u0041_0306 G -33488
+u0041_0306 'C -33488
+u0041_0306 u0043_030C -33488
+u0041_0306 u0047_0306 -33488
+u0041_0306 ,C -33488
+u0041_0306 Q -33488
+u0041_0306 O -33488
+u0041_0306 u004F_030B -33488
+u0041_0306 `O -33488
+u0041_0306 'O -33488
+u0041_0306 ^O -33488
+u0041_0306 ~O -33488
+u0041_0306 :O -33488
+u0041_0306 OE -33488
+u0041_0306 /O -33488
+u0041_0306 U -33488
+u0041_0306 u0055_030B -33488
+u0041_0306 u0055_030A -33488
+u0041_0306 `U -33488
+u0041_0306 'U -33488
+u0041_0306 ^U -33488
+u0041_0306 :U -33488
+u0041_0306 T -100464
+u0041_0306 u0054_030C -100464
+u0041_0306 u0054_0327 -100464
+u0041_0306 Y -100464
+u0041_0306 :Y -100464
+u0041_0306 'Y -100464
+u0041_0306 V -133952
+u0041_0306 W -133952
+'C v -133952
+'C w -100464
+'C c -33488
+'C 'c -33488
+'C u0063_030C -33488
+'C ,c -33488
+'C d -33488
+'C u0064_030C -33488
+'C u0111 -33488
+'C Sd -33488
+'C e -33488
+'C u0065_030C -33488
+'C u0065_0328 -33488
+'C `e -33488
+'C 'e -33488
+'C ^e -33488
+'C :e -33488
+'C o -33488
+'C u006F_030B -33488
+'C `o -33488
+'C 'o -33488
+'C ^o -33488
+'C ~o -33488
+'C :o -33488
+'C oe -33488
+'C /o -33488
+'C q -33488
+'C t -33488
+'C u0074_030C -33488
+'C u0074_0327 -33488
+'C C -33488
+'C G -33488
+'C 'C -33488
+'C u0043_030C -33488
+'C u0047_0306 -33488
+'C ,C -33488
+'C Q -33488
+'C O -33488
+'C u004F_030B -33488
+'C `O -33488
+'C 'O -33488
+'C ^O -33488
+'C ~O -33488
+'C :O -33488
+'C OE -33488
+'C /O -33488
+'C U -33488
+'C u0055_030B -33488
+'C u0055_030A -33488
+'C `U -33488
+'C 'U -33488
+'C ^U -33488
+'C :U -33488
+'C T -100464
+'C u0054_030C -100464
+'C u0054_0327 -100464
+'C Y -100464
+'C :Y -100464
+'C 'Y -100464
+'C V -133952
+'C W -133952
+u0044_030C X -33488
+u0044_030C W -33488
+u0044_030C A -33488
+u0044_030C u0041_0306 -33488
+u0044_030C u0041_0328 -33488
+u0044_030C `A -33488
+u0044_030C 'A -33488
+u0044_030C ^A -33488
+u0044_030C ~A -33488
+u0044_030C :A -33488
+u0044_030C oA -33488
+u0044_030C AE -33488
+u0044_030C V -33488
+u0044_030C Y -33488
+u0044_030C :Y -33488
+u0044_030C 'Y -33488
+u004C_0301 T -100464
+u004C_0301 u0054_030C -100464
+u004C_0301 u0054_0327 -100464
+u004C_0301 Y -100464
+u004C_0301 :Y -100464
+u004C_0301 'Y -100464
+u004C_0301 V -133952
+u004C_0301 W -133952
+u004C_030C T -100464
+u004C_030C u0054_030C -100464
+u004C_030C u0054_0327 -100464
+u004C_030C Y -100464
+u004C_030C :Y -100464
+u004C_030C 'Y -100464
+u004C_030C V -133952
+u004C_030C W -133952
+/L T -100464
+/L u0054_030C -100464
+/L u0054_0327 -100464
+/L Y -100464
+/L :Y -100464
+/L 'Y -100464
+/L V -133952
+/L W -133952
+u004F_030B X -33488
+u004F_030B W -33488
+u004F_030B A -33488
+u004F_030B u0041_0306 -33488
+u004F_030B u0041_0328 -33488
+u004F_030B `A -33488
+u004F_030B 'A -33488
+u004F_030B ^A -33488
+u004F_030B ~A -33488
+u004F_030B :A -33488
+u004F_030B oA -33488
+u004F_030B AE -33488
+u004F_030B V -33488
+u004F_030B Y -33488
+u004F_030B :Y -33488
+u004F_030B 'Y -33488
+u0052_0301 t -33488
+u0052_0301 u0074_030C -33488
+u0052_0301 u0074_0327 -33488
+u0052_0301 C -33488
+u0052_0301 G -33488
+u0052_0301 'C -33488
+u0052_0301 u0043_030C -33488
+u0052_0301 u0047_0306 -33488
+u0052_0301 ,C -33488
+u0052_0301 Q -33488
+u0052_0301 O -33488
+u0052_0301 u004F_030B -33488
+u0052_0301 `O -33488
+u0052_0301 'O -33488
+u0052_0301 ^O -33488
+u0052_0301 ~O -33488
+u0052_0301 :O -33488
+u0052_0301 OE -33488
+u0052_0301 /O -33488
+u0052_0301 U -33488
+u0052_0301 u0055_030B -33488
+u0052_0301 u0055_030A -33488
+u0052_0301 `U -33488
+u0052_0301 'U -33488
+u0052_0301 ^U -33488
+u0052_0301 :U -33488
+u0052_0301 T -100464
+u0052_0301 u0054_030C -100464
+u0052_0301 u0054_0327 -100464
+u0052_0301 Y -100464
+u0052_0301 :Y -100464
+u0052_0301 'Y -100464
+u0052_0301 V -133952
+u0052_0301 W -133952
+u0054_030C y -33488
+u0054_030C e -100464
+u0054_030C o -100464
+u0054_030C r -100464
+u0054_030C a -100464
+u0054_030C u -100464
+u0054_030C n -100464
+u0054_030C .i -100464
+u0054_030C c -100464
+u0054_030C d -100464
+u0054_030C g -100464
+u0054_030C p -100464
+u0054_030C s -100464
+u0054_030C v -100464
+u0054_030C w -100464
+u0054_030C x -100464
+u0054_030C z -100464
+u0054_030C A -100464
+u0054_030C u0041_0306 -100464
+u0054_030C u0041_0328 -100464
+u0054_030C `A -100464
+u0054_030C 'A -100464
+u0054_030C ^A -100464
+u0054_030C ~A -100464
+u0054_030C :A -100464
+u0054_030C oA -100464
+u0054_030C AE -100464
+u0054_0327 y -33488
+u0054_0327 e -100464
+u0054_0327 o -100464
+u0054_0327 r -100464
+u0054_0327 a -100464
+u0054_0327 u -100464
+u0054_0327 n -100464
+u0054_0327 .i -100464
+u0054_0327 c -100464
+u0054_0327 d -100464
+u0054_0327 g -100464
+u0054_0327 p -100464
+u0054_0327 s -100464
+u0054_0327 v -100464
+u0054_0327 w -100464
+u0054_0327 x -100464
+u0054_0327 z -100464
+u0054_0327 A -100464
+u0054_0327 u0041_0306 -100464
+u0054_0327 u0041_0328 -100464
+u0054_0327 `A -100464
+u0054_0327 'A -100464
+u0054_0327 ^A -100464
+u0054_0327 ~A -100464
+u0054_0327 :A -100464
+u0054_0327 oA -100464
+u0054_0327 AE -100464
+:Y e -100464
+:Y o -100464
+:Y r -100464
+:Y a -100464
+:Y u -100464
+:Y n -100464
+:Y .i -100464
+:Y c -100464
+:Y d -100464
+:Y g -100464
+:Y p -100464
+:Y s -100464
+:Y v -100464
+:Y w -100464
+:Y x -100464
+:Y z -100464
+:Y A -100464
+:Y u0041_0306 -100464
+:Y u0041_0328 -100464
+:Y `A -100464
+:Y 'A -100464
+:Y ^A -100464
+:Y ~A -100464
+:Y :A -100464
+:Y oA -100464
+:Y AE -100464
+u0061_0306 v -33488
+u0061_0306 j 66976
+u0061_0306 y -33488
+u0061_0306 :y -33488
+u0061_0306 'y -33488
+u0061_0306 w -33488
+u0061_0328 g 33488
+u0061_0328 p 33488
+u0061_0328 w -33488
+'c h -33488
+'c k -33488
+u0063_030C h -33488
+u0063_030C k -33488
+/l cq 33488
+/l ' 33488
+u006E_0301 t -33488
+u006E_0301 u -33488
+u006E_0301 u0075_030B -33488
+u006E_0301 u0075_030A -33488
+u006E_0301 `u -33488
+u006E_0301 'u -33488
+u006E_0301 ^u -33488
+u006E_0301 :u -33488
+u006E_0301 b -33488
+u006E_0301 y -33488
+u006E_0301 v -33488
+u006E_0301 w -33488
+u006E_030C t -33488
+u006E_030C u -33488
+u006E_030C u0075_030B -33488
+u006E_030C u0075_030A -33488
+u006E_030C `u -33488
+u006E_030C 'u -33488
+u006E_030C ^u -33488
+u006E_030C :u -33488
+u006E_030C b -33488
+u006E_030C y -33488
+u006E_030C v -33488
+u006E_030C w -33488
+u016A t -33488
+u016A u -33488
+u016A u0075_030B -33488
+u016A u0075_030A -33488
+u016A `u -33488
+u016A 'u -33488
+u016A ^u -33488
+u016A :u -33488
+u016A b -33488
+u016A y -33488
+u016A v -33488
+u016A w -33488
+u006F_030B e 33488
+u006F_030B u0065_030C 33488
+u006F_030B u0065_0328 33488
+u006F_030B `e 33488
+u006F_030B 'e 33488
+u006F_030B ^e 33488
+u006F_030B :e 33488
+u006F_030B o 33488
+u006F_030B u006F_030B 33488
+u006F_030B `o 33488
+u006F_030B 'o 33488
+u006F_030B ^o 33488
+u006F_030B ~o 33488
+u006F_030B :o 33488
+u006F_030B oe 33488
+u006F_030B /o 33488
+u006F_030B x -33488
+u006F_030B d 33488
+u006F_030B c 33488
+u006F_030B 'c 33488
+u006F_030B u0063_030C 33488
+u006F_030B ,c 33488
+u006F_030B q 33488
+u006F_030B v -33488
+u006F_030B j 66976
+u006F_030B y -33488
+u006F_030B :y -33488
+u006F_030B 'y -33488
+u006F_030B w -33488
+u0074_030C y -33488
+u0074_030C :y -33488
+u0074_030C 'y -33488
+u0074_030C w -33488
+u0074_0327 y -33488
+u0074_0327 :y -33488
+u0074_0327 'y -33488
+u0074_0327 w -33488
+u0075_030B w -33488
+u0075_030A w -33488
+:y o -33488
+:y u006F_030B -33488
+:y `o -33488
+:y 'o -33488
+:y ^o -33488
+:y ~o -33488
+:y :o -33488
+:y oe -33488
+:y /o -33488
+:y e -33488
+:y u0065_030C -33488
+:y u0065_0328 -33488
+:y `e -33488
+:y 'e -33488
+:y ^e -33488
+:y :e -33488
+:y a -33488
+:y u0061_0306 -33488
+:y u0061_0328 -33488
+:y `a -33488
+:y 'a -33488
+:y ^a -33488
+:y ^a -33488
+:y ~a -33488
+:y :a -33488
+:y oa -33488
+:y ae -33488
+:y . -100464
+:y , -100464
+`A y -100464
+`A :y -100464
+`A 'y -100464
+`A v -133952
+`A w -100464
+`A c -33488
+`A 'c -33488
+`A u0063_030C -33488
+`A ,c -33488
+`A d -33488
+`A u0064_030C -33488
+`A u0111 -33488
+`A Sd -33488
+`A e -33488
+`A u0065_030C -33488
+`A u0065_0328 -33488
+`A `e -33488
+`A 'e -33488
+`A ^e -33488
+`A :e -33488
+`A o -33488
+`A u006F_030B -33488
+`A `o -33488
+`A 'o -33488
+`A ^o -33488
+`A ~o -33488
+`A :o -33488
+`A oe -33488
+`A /o -33488
+`A q -33488
+`A t -33488
+`A u0074_030C -33488
+`A u0074_0327 -33488
+`A C -33488
+`A G -33488
+`A 'C -33488
+`A u0043_030C -33488
+`A u0047_0306 -33488
+`A ,C -33488
+`A Q -33488
+`A O -33488
+`A u004F_030B -33488
+`A `O -33488
+`A 'O -33488
+`A ^O -33488
+`A ~O -33488
+`A :O -33488
+`A OE -33488
+`A /O -33488
+`A U -33488
+`A u0055_030B -33488
+`A u0055_030A -33488
+`A `U -33488
+`A 'U -33488
+`A ^U -33488
+`A :U -33488
+`A T -100464
+`A u0054_030C -100464
+`A u0054_0327 -100464
+`A Y -100464
+`A :Y -100464
+`A 'Y -100464
+`A V -133952
+`A W -133952
+'A y -100464
+'A :y -100464
+'A 'y -100464
+'A v -133952
+'A w -100464
+'A c -33488
+'A 'c -33488
+'A u0063_030C -33488
+'A ,c -33488
+'A d -33488
+'A u0064_030C -33488
+'A u0111 -33488
+'A Sd -33488
+'A e -33488
+'A u0065_030C -33488
+'A u0065_0328 -33488
+'A `e -33488
+'A 'e -33488
+'A ^e -33488
+'A :e -33488
+'A o -33488
+'A u006F_030B -33488
+'A `o -33488
+'A 'o -33488
+'A ^o -33488
+'A ~o -33488
+'A :o -33488
+'A oe -33488
+'A /o -33488
+'A q -33488
+'A t -33488
+'A u0074_030C -33488
+'A u0074_0327 -33488
+'A C -33488
+'A G -33488
+'A 'C -33488
+'A u0043_030C -33488
+'A u0047_0306 -33488
+'A ,C -33488
+'A Q -33488
+'A O -33488
+'A u004F_030B -33488
+'A `O -33488
+'A 'O -33488
+'A ^O -33488
+'A ~O -33488
+'A :O -33488
+'A OE -33488
+'A /O -33488
+'A U -33488
+'A u0055_030B -33488
+'A u0055_030A -33488
+'A `U -33488
+'A 'U -33488
+'A ^U -33488
+'A :U -33488
+'A T -100464
+'A u0054_030C -100464
+'A u0054_0327 -100464
+'A Y -100464
+'A :Y -100464
+'A 'Y -100464
+'A V -133952
+'A W -133952
+^A y -100464
+^A :y -100464
+^A 'y -100464
+^A v -133952
+^A w -100464
+^A c -33488
+^A 'c -33488
+^A u0063_030C -33488
+^A ,c -33488
+^A d -33488
+^A u0064_030C -33488
+^A u0111 -33488
+^A Sd -33488
+^A e -33488
+^A u0065_030C -33488
+^A u0065_0328 -33488
+^A `e -33488
+^A 'e -33488
+^A ^e -33488
+^A :e -33488
+^A o -33488
+^A u006F_030B -33488
+^A `o -33488
+^A 'o -33488
+^A ^o -33488
+^A ~o -33488
+^A :o -33488
+^A oe -33488
+^A /o -33488
+^A q -33488
+^A t -33488
+^A u0074_030C -33488
+^A u0074_0327 -33488
+^A C -33488
+^A G -33488
+^A 'C -33488
+^A u0043_030C -33488
+^A u0047_0306 -33488
+^A ,C -33488
+^A Q -33488
+^A O -33488
+^A u004F_030B -33488
+^A `O -33488
+^A 'O -33488
+^A ^O -33488
+^A ~O -33488
+^A :O -33488
+^A OE -33488
+^A /O -33488
+^A U -33488
+^A u0055_030B -33488
+^A u0055_030A -33488
+^A `U -33488
+^A 'U -33488
+^A ^U -33488
+^A :U -33488
+^A T -100464
+^A u0054_030C -100464
+^A u0054_0327 -100464
+^A Y -100464
+^A :Y -100464
+^A 'Y -100464
+^A V -133952
+^A W -133952
+~A y -100464
+~A :y -100464
+~A 'y -100464
+~A v -133952
+~A w -100464
+~A c -33488
+~A 'c -33488
+~A u0063_030C -33488
+~A ,c -33488
+~A d -33488
+~A u0064_030C -33488
+~A u0111 -33488
+~A Sd -33488
+~A e -33488
+~A u0065_030C -33488
+~A u0065_0328 -33488
+~A `e -33488
+~A 'e -33488
+~A ^e -33488
+~A :e -33488
+~A o -33488
+~A u006F_030B -33488
+~A `o -33488
+~A 'o -33488
+~A ^o -33488
+~A ~o -33488
+~A :o -33488
+~A oe -33488
+~A /o -33488
+~A q -33488
+~A t -33488
+~A u0074_030C -33488
+~A u0074_0327 -33488
+~A C -33488
+~A G -33488
+~A 'C -33488
+~A u0043_030C -33488
+~A u0047_0306 -33488
+~A ,C -33488
+~A Q -33488
+~A O -33488
+~A u004F_030B -33488
+~A `O -33488
+~A 'O -33488
+~A ^O -33488
+~A ~O -33488
+~A :O -33488
+~A OE -33488
+~A /O -33488
+~A U -33488
+~A u0055_030B -33488
+~A u0055_030A -33488
+~A `U -33488
+~A 'U -33488
+~A ^U -33488
+~A :U -33488
+~A T -100464
+~A u0054_030C -100464
+~A u0054_0327 -100464
+~A Y -100464
+~A :Y -100464
+~A 'Y -100464
+~A V -133952
+~A W -133952
+:A y -100464
+:A :y -100464
+:A 'y -100464
+:A v -133952
+:A w -100464
+:A c -33488
+:A 'c -33488
+:A u0063_030C -33488
+:A ,c -33488
+:A d -33488
+:A u0064_030C -33488
+:A u0111 -33488
+:A Sd -33488
+:A e -33488
+:A u0065_030C -33488
+:A u0065_0328 -33488
+:A `e -33488
+:A 'e -33488
+:A ^e -33488
+:A :e -33488
+:A o -33488
+:A u006F_030B -33488
+:A `o -33488
+:A 'o -33488
+:A ^o -33488
+:A ~o -33488
+:A :o -33488
+:A oe -33488
+:A /o -33488
+:A q -33488
+:A t -33488
+:A u0074_030C -33488
+:A u0074_0327 -33488
+:A C -33488
+:A G -33488
+:A 'C -33488
+:A u0043_030C -33488
+:A u0047_0306 -33488
+:A ,C -33488
+:A Q -33488
+:A O -33488
+:A u004F_030B -33488
+:A `O -33488
+:A 'O -33488
+:A ^O -33488
+:A ~O -33488
+:A :O -33488
+:A OE -33488
+:A /O -33488
+:A U -33488
+:A u0055_030B -33488
+:A u0055_030A -33488
+:A `U -33488
+:A 'U -33488
+:A ^U -33488
+:A :U -33488
+:A T -100464
+:A u0054_030C -100464
+:A u0054_0327 -100464
+:A Y -100464
+:A :Y -100464
+:A 'Y -100464
+:A V -133952
+:A W -133952
+oA y -100464
+oA :y -100464
+oA 'y -100464
+oA v -133952
+oA w -100464
+oA c -33488
+oA 'c -33488
+oA u0063_030C -33488
+oA ,c -33488
+oA d -33488
+oA u0064_030C -33488
+oA u0111 -33488
+oA Sd -33488
+oA e -33488
+oA u0065_030C -33488
+oA u0065_0328 -33488
+oA `e -33488
+oA 'e -33488
+oA ^e -33488
+oA :e -33488
+oA o -33488
+oA u006F_030B -33488
+oA `o -33488
+oA 'o -33488
+oA ^o -33488
+oA ~o -33488
+oA :o -33488
+oA oe -33488
+oA /o -33488
+oA q -33488
+oA t -33488
+oA u0074_030C -33488
+oA u0074_0327 -33488
+oA C -33488
+oA G -33488
+oA 'C -33488
+oA u0043_030C -33488
+oA u0047_0306 -33488
+oA ,C -33488
+oA Q -33488
+oA O -33488
+oA u004F_030B -33488
+oA `O -33488
+oA 'O -33488
+oA ^O -33488
+oA ~O -33488
+oA :O -33488
+oA OE -33488
+oA /O -33488
+oA U -33488
+oA u0055_030B -33488
+oA u0055_030A -33488
+oA `U -33488
+oA 'U -33488
+oA ^U -33488
+oA :U -33488
+oA T -100464
+oA u0054_030C -100464
+oA u0054_0327 -100464
+oA Y -100464
+oA :Y -100464
+oA 'Y -100464
+oA V -133952
+oA W -133952
+u0189 X -33488
+u0110 X -33488
+-D X -33488
+u0189 W -33488
+u0110 W -33488
+-D W -33488
+u0189 A -33488
+u0110 A -33488
+-D A -33488
+u0189 u0041_0306 -33488
+u0110 u0041_0306 -33488
+-D u0041_0306 -33488
+u0189 u0041_0328 -33488
+u0110 u0041_0328 -33488
+-D u0041_0328 -33488
+u0189 `A -33488
+u0110 `A -33488
+-D `A -33488
+u0189 'A -33488
+u0110 'A -33488
+-D 'A -33488
+u0189 ^A -33488
+u0110 ^A -33488
+-D ^A -33488
+u0189 ~A -33488
+u0110 ~A -33488
+-D ~A -33488
+u0189 :A -33488
+u0110 :A -33488
+-D :A -33488
+u0189 oA -33488
+u0110 oA -33488
+-D oA -33488
+u0189 AE -33488
+u0110 AE -33488
+-D AE -33488
+u0189 V -33488
+u0110 V -33488
+-D V -33488
+u0189 Y -33488
+u0110 Y -33488
+-D Y -33488
+u0189 :Y -33488
+u0110 :Y -33488
+-D :Y -33488
+u0189 'Y -33488
+u0110 'Y -33488
+-D 'Y -33488
+`O X -33488
+`O W -33488
+`O A -33488
+`O u0041_0306 -33488
+`O u0041_0328 -33488
+`O `A -33488
+`O 'A -33488
+`O ^A -33488
+`O ~A -33488
+`O :A -33488
+`O oA -33488
+`O AE -33488
+`O V -33488
+`O Y -33488
+`O :Y -33488
+`O 'Y -33488
+'O X -33488
+'O W -33488
+'O A -33488
+'O u0041_0306 -33488
+'O u0041_0328 -33488
+'O `A -33488
+'O 'A -33488
+'O ^A -33488
+'O ~A -33488
+'O :A -33488
+'O oA -33488
+'O AE -33488
+'O V -33488
+'O Y -33488
+'O :Y -33488
+'O 'Y -33488
+^O X -33488
+^O W -33488
+^O A -33488
+^O u0041_0306 -33488
+^O u0041_0328 -33488
+^O `A -33488
+^O 'A -33488
+^O ^A -33488
+^O ~A -33488
+^O :A -33488
+^O oA -33488
+^O AE -33488
+^O V -33488
+^O Y -33488
+^O :Y -33488
+^O 'Y -33488
+~O X -33488
+~O W -33488
+~O A -33488
+~O u0041_0306 -33488
+~O u0041_0328 -33488
+~O `A -33488
+~O 'A -33488
+~O ^A -33488
+~O ~A -33488
+~O :A -33488
+~O oA -33488
+~O AE -33488
+~O V -33488
+~O Y -33488
+~O :Y -33488
+~O 'Y -33488
+:O X -33488
+:O W -33488
+:O A -33488
+:O u0041_0306 -33488
+:O u0041_0328 -33488
+:O `A -33488
+:O 'A -33488
+:O ^A -33488
+:O ~A -33488
+:O :A -33488
+:O oA -33488
+:O AE -33488
+:O V -33488
+:O Y -33488
+:O :Y -33488
+:O 'Y -33488
+/O X -33488
+/O W -33488
+/O A -33488
+/O u0041_0306 -33488
+/O u0041_0328 -33488
+/O `A -33488
+/O 'A -33488
+/O ^A -33488
+/O ~A -33488
+/O :A -33488
+/O oA -33488
+/O AE -33488
+/O V -33488
+/O Y -33488
+/O :Y -33488
+/O 'Y -33488
+'Y e -100464
+'Y o -100464
+'Y r -100464
+'Y a -100464
+'Y u -100464
+'Y n -100464
+'Y .i -100464
+'Y c -100464
+'Y d -100464
+'Y g -100464
+'Y p -100464
+'Y s -100464
+'Y v -100464
+'Y w -100464
+'Y x -100464
+'Y z -100464
+'Y A -100464
+'Y u0041_0306 -100464
+'Y u0041_0328 -100464
+'Y `A -100464
+'Y 'A -100464
+'Y ^A -100464
+'Y ~A -100464
+'Y :A -100464
+'Y oA -100464
+'Y AE -100464
+`a v -33488
+`a j 66976
+`a y -33488
+`a :y -33488
+`a 'y -33488
+`a w -33488
+'a v -33488
+'a j 66976
+'a y -33488
+'a :y -33488
+'a 'y -33488
+'a w -33488
+^a v -33488
+^a j 66976
+^a y -33488
+^a :y -33488
+^a 'y -33488
+^a w -33488
+~a v -33488
+~a j 66976
+~a y -33488
+~a :y -33488
+~a 'y -33488
+~a w -33488
+:a v -33488
+:a j 66976
+:a y -33488
+:a :y -33488
+:a 'y -33488
+:a w -33488
+oa v -33488
+oa j 66976
+oa y -33488
+oa :y -33488
+oa 'y -33488
+oa w -33488
+,c h -33488
+,c k -33488
+~n t -33488
+~n u -33488
+~n u0075_030B -33488
+~n u0075_030A -33488
+~n `u -33488
+~n 'u -33488
+~n ^u -33488
+~n :u -33488
+~n b -33488
+~n y -33488
+~n v -33488
+~n w -33488
+`o e 33488
+`o u0065_030C 33488
+`o u0065_0328 33488
+`o `e 33488
+`o 'e 33488
+`o ^e 33488
+`o :e 33488
+`o o 33488
+`o u006F_030B 33488
+`o `o 33488
+`o 'o 33488
+`o ^o 33488
+`o ~o 33488
+`o :o 33488
+`o oe 33488
+`o /o 33488
+`o x -33488
+`o d 33488
+`o c 33488
+`o 'c 33488
+`o u0063_030C 33488
+`o ,c 33488
+`o q 33488
+`o v -33488
+`o j 66976
+`o y -33488
+`o :y -33488
+`o 'y -33488
+`o w -33488
+'o e 33488
+'o u0065_030C 33488
+'o u0065_0328 33488
+'o `e 33488
+'o 'e 33488
+'o ^e 33488
+'o :e 33488
+'o o 33488
+'o u006F_030B 33488
+'o `o 33488
+'o 'o 33488
+'o ^o 33488
+'o ~o 33488
+'o :o 33488
+'o oe 33488
+'o /o 33488
+'o x -33488
+'o d 33488
+'o c 33488
+'o 'c 33488
+'o u0063_030C 33488
+'o ,c 33488
+'o q 33488
+'o v -33488
+'o j 66976
+'o y -33488
+'o :y -33488
+'o 'y -33488
+'o w -33488
+^o e 33488
+^o u0065_030C 33488
+^o u0065_0328 33488
+^o `e 33488
+^o 'e 33488
+^o ^e 33488
+^o :e 33488
+^o o 33488
+^o u006F_030B 33488
+^o `o 33488
+^o 'o 33488
+^o ^o 33488
+^o ~o 33488
+^o :o 33488
+^o oe 33488
+^o /o 33488
+^o x -33488
+^o d 33488
+^o c 33488
+^o 'c 33488
+^o u0063_030C 33488
+^o ,c 33488
+^o q 33488
+^o v -33488
+^o j 66976
+^o y -33488
+^o :y -33488
+^o 'y -33488
+^o w -33488
+~o e 33488
+~o u0065_030C 33488
+~o u0065_0328 33488
+~o `e 33488
+~o 'e 33488
+~o ^e 33488
+~o :e 33488
+~o o 33488
+~o u006F_030B 33488
+~o `o 33488
+~o 'o 33488
+~o ^o 33488
+~o ~o 33488
+~o :o 33488
+~o oe 33488
+~o /o 33488
+~o x -33488
+~o d 33488
+~o c 33488
+~o 'c 33488
+~o u0063_030C 33488
+~o ,c 33488
+~o q 33488
+~o v -33488
+~o j 66976
+~o y -33488
+~o :y -33488
+~o 'y -33488
+~o w -33488
+:o e 33488
+:o u0065_030C 33488
+:o u0065_0328 33488
+:o `e 33488
+:o 'e 33488
+:o ^e 33488
+:o :e 33488
+:o o 33488
+:o u006F_030B 33488
+:o `o 33488
+:o 'o 33488
+:o ^o 33488
+:o ~o 33488
+:o :o 33488
+:o oe 33488
+:o /o 33488
+:o x -33488
+:o d 33488
+:o c 33488
+:o 'c 33488
+:o u0063_030C 33488
+:o ,c 33488
+:o q 33488
+:o v -33488
+:o j 66976
+:o y -33488
+:o :y -33488
+:o 'y -33488
+:o w -33488
+/o e 33488
+/o u0065_030C 33488
+/o u0065_0328 33488
+/o `e 33488
+/o 'e 33488
+/o ^e 33488
+/o :e 33488
+/o o 33488
+/o u006F_030B 33488
+/o `o 33488
+/o 'o 33488
+/o ^o 33488
+/o ~o 33488
+/o :o 33488
+/o oe 33488
+/o /o 33488
+/o x -33488
+/o d 33488
+/o c 33488
+/o 'c 33488
+/o u0063_030C 33488
+/o ,c 33488
+/o q 33488
+/o v -33488
+/o j 66976
+/o y -33488
+/o :y -33488
+/o 'y -33488
+/o w -33488
+`u w -33488
+'u w -33488
+^u w -33488
+:u w -33488
+'y o -33488
+'y u006F_030B -33488
+'y `o -33488
+'y 'o -33488
+'y ^o -33488
+'y ~o -33488
+'y :o -33488
+'y oe -33488
+'y /o -33488
+'y e -33488
+'y u0065_030C -33488
+'y u0065_0328 -33488
+'y `e -33488
+'y 'e -33488
+'y ^e -33488
+'y :e -33488
+'y a -33488
+'y u0061_0306 -33488
+'y u0061_0328 -33488
+'y `a -33488
+'y 'a -33488
+'y ^a -33488
+'y ^a -33488
+'y ~a -33488
+'y :a -33488
+'y oa -33488
+'y ae -33488
+'y . -100464
+'y , -100464
+charset
+ga 602784,679952 2 0000
+aa 602784,679952 2 0001
+a^ 602784,679952 2 0002
+a~ 602784,679952 2 0003
+ad 602784,723632 2 0004
+a" 602784,679952,0,15530 2 0005
+ao 911456,679952 2 0006
+ah 602784,679952 2 0007
+ab 602784,679952 2 0010
+a- 602784,723632 2 0011
+a. 334880,723632 2 0012
+ac 535808,0,178360 1 0013
+ho 334880,0,203840 1 0014
+bq 334880,163072,203840 1 0015
+fo 535808,495040 2 0016
+fc 535808,495040 2 0017
+lq 430976,723632 2 0020
+rq 430976,723632 2 0021
+Bq 430976,163072,203840 1 0022
+Fo 669760,495040 2 0023
+Fc 669760,495040 2 0024
+en 602784,465920,0,33488 0 0025
+em 1205568,465920,0,33488 0 0026
+--- 0,465920 0 0027
+--- 468832,786240,58240 3 0030
+.i 334880,465920 0 0031
+.j 368368,465920,203840 1 0032
+ff 703248,723632,0,114296 2 0033
+fi 669760,723632 2 0034
+fl 669760,723632 2 0035
+Fi 1004640,723632 2 0036
+Fl 1004640,723632 2 0037
+u2423 602784,465920,101920 1 0040
+u01C3 366912,723632 2 0041
+! "
+dq 602784,723632 2 0042
+" "
+sh 1004640,723632,203840 3 0043
+# "
+Do 602784,786240,58240 3 0044
+$ "
+% 1004640,786240,58240 3 0045
+& 937664,723632 2 0046
+cq 334880,723632 2 0047
+' "
+( 468832,786240,262080 3 0050
+) 468832,786240,262080 3 0051
+* 602784,786240 2 0052
++ 937664,664768,139776 3 0053
+, 334880,163072,203840 1 0054
+- 401856,465920 0 0055
+. 334880,163072 0 0056
+sl 602784,786240,262080 3 0057
+/ "
+0 602784,679952 2 0060
+1 602784,679952 2 0061
+2 602784,679952 2 0062
+3 602784,679952 2 0063
+4 602784,679952 2 0064
+5 602784,679952 2 0065
+6 602784,679952 2 0066
+7 602784,679952 2 0067
+8 602784,679952 2 0070
+9 602784,679952 2 0071
+: 334880,465920 0 0072
+; 334880,465920,203840 1 0073
+< 937664,613858,89698 3 0074
+= 937664,410018,-114142 0 0075
+> 937664,613858,89698 3 0076
+? 569296,723632 2 0077
+at 937664,723632 2 0100
+@ "
+A 911456,723632 2 0101
+B 857584,723632 2 0102
+C 870688,723632,0,0,-33488 2 0103
+D 924560,723632,0,0,0,-33488 2 0104
+E 792064,723632 2 0105
+F 758576,723632,0,0,0,-167440 2 0106
+G 947856,723632,0,0,-33488 2 0107
+H 943488,723632 2 0110
+I 457184,723632 2 0111
+J 623168,723632,0,0,0,-33488 2 0112
+K 944944,723632 2 0113
+L 725088,723632,0,0,0,66976 2 0114
+M 1144416,723632 2 0115
+N 943488,723632 2 0116
+O 905632,723632,0,0,-33488,-33488 2 0117
+P 824096,723632,0,0,0,-167440 2 0120
+Q 905632,723632,203840,0,-33488 3 0121
+R 904176,723632 2 0122
+S 669760,723632 2 0123
+T 838656,723632,0,0,0,-167440 2 0124
+U 927472,723632,0,0,-20384 2 0125
+V 911456,723632,0,16744,50232,-251160 2 0126
+W 1246336,723632,0,16744,50232,-150696 2 0127
+X 911456,723632 2 0130
+Y 911456,723632,0,30139,33488,-237765 2 0131
+Z 736736,723632 2 0132
+lB 334880,786240,262080 3 0133
+[ "
+rs 602784,786240,262080 3 0134
+\ "
+rB 334880,786240,262080 3 0135
+] "
+ha 736736,723632 2 0136
+^ "
+_ 937664,0,322658 1 0137
+oq 334880,723632 2 0140
+` "
+a 586040,465920 0 0141
+b 669760,723632 2 0142
+c 535808,465920 0 0143
+d 669760,723632 2 0144
+e 552552,465920 0 0145
+f 368368,723632,0,114296 2 0146
+g 602784,465920,203840,16744 1 0147
+h 669760,723632 2 0150
+i 334880,723632 2 0151
+j 368368,723632,203840 3 0152
+k 636272,723632 2 0153
+l 334880,723632 2 0154
+m 1004640,465920 0 0155
+n 669760,465920 0 0156
+o 602784,465920 0 0157
+p 669760,465920,203840 1 0160
+q 636272,465920,203840 1 0161
+r 496496,465920 0 0162
+s 475530,465920 0 0163
+t 468832,664768 2 0164
+u 669760,465920 0 0165
+v 636272,465920,0,16744 0 0166
+w 870688,465920,0,16744 0 0167
+x 636272,465920 0 0170
+y 636272,465920,203840,16744 1 0171
+z 535808,465920 0 0172
+lC 602784,786240,262080 3 0173
+{ "
+u01C0 334880,786240,262080 3 0174
+ba "
+| "
+rC 602784,786240,262080 3 0175
+} "
+~ 736736,723632 2 0176
+hy 200928,465920 0 0177
+u0041_0306 911456,937664 2 0200
+u0041_0328 911456,723632,203840 3 0201
+'C 870688,918813 2 0202
+u0043_030C 870688,937664,0,0,-33488 2 0203
+u0044_030C 924560,937664,0,0,0,-33488 2 0204
+u0045_030C 792064,937664 2 0205
+u0045_0328 792064,723632,203840 3 0206
+u0047_0306 947856,937664,0,0,-33488 2 0207
+u004C_0301 725088,918813,0,0,0,66976 2 0210
+u004C_030C 725088,937664,0,0,0,66976 2 0211
+/L 725088,723632 2 0212
+u004E_0301 943488,918813 2 0213
+u004E_030C 943488,937664 2 0214
+u014A 958048,723632,0,0,0,-33488 2 0215
+u004F_030B 905632,918813,0,0,-33488,-33488 2 0216
+u0052_0301 904176,918813 2 0217
+u0052_030C 904176,937664 2 0220
+u0053_0301 669760,918813 2 0221
+vS 669760,937664 2 0222
+u0053_0327 669760,723632,178360 3 0223
+u0054_030C 838656,937664,0,0,0,-167440 2 0224
+u0054_0327 838656,723632,178360,0,0,-167440 3 0225
+u0055_030B 927472,918813,0,0,-20384 2 0226
+u0055_030A 927472,937664,0,0,-20384 2 0227
+:Y 911456,937664,0,30139,33488,-237765 2 0230
+u005A_0301 736736,918813 2 0231
+vZ 736736,937664 2 0232
+u005A_0307 736736,918813 2 0233
+IJ 1059968,723632,0,0,0,-33488 2 0234
+u0049_0307 457184,918813 2 0235
+u0111 669760,723632 2 0236
+sc 554736,723632,203840 3 0237
+u0061_0306 586040,679952 2 0240
+u0061_0328 586040,465920,203840 1 0241
+'c 535808,679952 2 0242
+u0063_030C 535808,679952 2 0243
+u0064_030C 849576,723632 2 0244
+u0065_030C 552552,679952 2 0245
+u0065_0328 552552,465920,203840 1 0246
+u0067_0306 602784,679952,203840,16744 3 0247
+u006C_0301 334880,918813,0,56493 2 0250
+u006C_030C 526344,723632 2 0251
+/l 405205,723632 2 0252
+u006E_0301 669760,679952 2 0253
+u006E_030C 669760,679952 2 0254
+u016A 669760,465920,203840 1 0255
+u006F_030B 602784,679952,0,15530 2 0256
+u0072_0301 496496,679952 2 0257
+u0072_030C 496496,679952 2 0260
+u0073_0301 475530,679952 2 0261
+vs 475530,679952 2 0262
+u0073_0327 475530,465920,178360 1 0263
+u0074_030C 468832,723632 2 0264
+u0074_0327 468832,664768,178360 3 0265
+u0075_030B 669760,679952 2 0266
+u0075_030A 669760,679952 2 0267
+:y 636272,723632,203840,16744 3 0270
+u007A_0301 535808,679952 2 0271
+vz 535808,679952 2 0272
+u007A_0307 535808,723632 2 0273
+ij 703248,723632,203840 3 0274
+r! 366912,524160,203840 3 0275
+r? 569296,524160,203840 3 0276
+Po 770224,723632 2 0277
+`A 911456,918813 2 0300
+'A 911456,918813 2 0301
+^A 911456,937664 2 0302
+~A 911456,937664 2 0303
+:A 911456,937664 2 0304
+oA 911456,893984 2 0305
+AE 1092000,723632 2 0306
+,C 870688,723632,178360,0,-33488 3 0307
+`E 792064,918813 2 0310
+'E 792064,918813 2 0311
+^E 792064,937664 2 0312
+:E 792064,937664 2 0313
+`I 457184,918813 2 0314
+'I 457184,918813 2 0315
+^I 457184,937664 2 0316
+:I 457184,937664 2 0317
+u0189 924560,723632,0,0,0,-33488 2 0320
+u0110 "
+-D "
+~N 943488,937664 2 0321
+`O 905632,918813,0,0,-33488,-33488 2 0322
+'O 905632,918813 2 0323
+^O 905632,937664,0,0,-33488,-33488 2 0324
+~O 905632,937664,0,0,-33488,-33488 2 0325
+:O 905632,937664,0,0,-33488,-33488 2 0326
+OE 1225952,723632 2 0327
+/O 937664,770224,50960 3 0330
+`U 927472,918813,0,0,-20384 2 0331
+'U 927472,918813 2 0332
+^U 927472,937664,0,0,-20384 2 0333
+:U 927472,937664,0,0,-20384 2 0334
+'Y 911456,918813,0,30139,33488,-237765 2 0335
+TP 757120,723632 2 0336
+--- 1339520,723632 2 0337
+`a 586040,679952 2 0340
+'a 586040,679952 2 0341
+^a 586040,679952 2 0342
+~a 586040,679952 2 0343
+:a 586040,723632 2 0344
+oa 586040,679952 2 0345
+ae 870688,465920 0 0346
+,c 535808,465920,178360 1 0347
+`e 552552,679952 2 0350
+'e 552552,679952 2 0351
+^e 552552,679952 2 0352
+:e 552552,723632 2 0353
+`i 334880,679952 2 0354
+'i 334880,679952,0,28280 2 0355
+^i 334880,679952 2 0356
+:i 401856,723632 2 0357
+Sd 602784,723632 2 0360
+~n 669760,679952 2 0361
+`o 602784,679952 2 0362
+'o 602784,679952 2 0363
+^o 602784,679952 2 0364
+~o 602784,679952 2 0365
+:o 602784,723632 2 0366
+oe 937664,465920 0 0367
+/o 602784,567840,101920 3 0370
+`u 669760,679952 2 0371
+'u 669760,679952 2 0372
+^u 669760,679952 2 0373
+:u 669760,723632 2 0374
+'y 636272,679952,203840,16744 3 0375
+Tp 669760,723632,203840 3 0376
+ss 626080,723632 2 0377
diff --git a/font/devdvi/TBI b/font/devdvi/TBI
new file mode 100644
index 0000000..5c34bc2
--- /dev/null
+++ b/font/devdvi/TBI
@@ -0,0 +1,354 @@
+#
+# manually added kerning for `` and ''
+#
+name TBI
+internalname cmbxti10
+spacewidth 434573
+slant 14.036243
+ligatures ff fi fl ffi ffl 0
+checksum 1175274390
+designsize 10485760
+kernpairs
+ff cq 111848
+ff ' 111848
+ff ? 111848
+ff ! 111848
+ff ) 111848
+ff rB 111848
+ff ] 111848
+' ' -92624
+cq ' -92624
+' cq -92624
+cq cq -92624
+slash@for@l l -311075
+slash@for@l L -402826
+cq ? 123498
+' ? 123498
+cq ! 123498
+' ! 123498
+A n -30875
+A l -30875
+A r -30875
+A u -30875
+A m -30875
+A t -30875
+A i -30875
+A C -30875
+A O -30875
+A G -30875
+A h -30875
+A b -30875
+A U -30875
+A k -30875
+A v -30875
+A w -30875
+A Q -30875
+A T -92624
+A Y -92624
+A V -123498
+A W -123498
+A e -61749
+A a -61749
+A o -61749
+A d -61749
+A c -61749
+A g -61749
+A q -61749
+D X -30875
+D W -30875
+D A -30875
+D V -30875
+D Y -30875
+F o -92624
+F e -92624
+F u -92624
+F r -92624
+F a -92624
+F A -123498
+F O -30875
+F C -30875
+F G -30875
+F Q -30875
+K O -30875
+K C -30875
+K G -30875
+K Q -30875
+L T -92624
+L Y -92624
+L V -123498
+L W -123498
+L e -61749
+L a -61749
+L o -61749
+L d -61749
+L c -61749
+L g -61749
+L q -61749
+O X -30875
+O W -30875
+O A -30875
+O V -30875
+O Y -30875
+P A -92624
+R n -30875
+R l -30875
+R r -30875
+R u -30875
+R m -30875
+R t -30875
+R i -30875
+R C -30875
+R O -30875
+R G -30875
+R h -30875
+R b -30875
+R U -30875
+R k -30875
+R v -30875
+R w -30875
+R Q -30875
+R T -92624
+R Y -92624
+R V -123498
+R W -123498
+R e -61749
+R a -61749
+R o -61749
+R d -61749
+R c -61749
+R g -61749
+R q -61749
+T y -92624
+T e -92624
+T o -92624
+T r -92624
+T a -92624
+T u -92624
+T A -92624
+V o -92624
+V e -92624
+V u -92624
+V r -92624
+V a -92624
+V A -123498
+V O -30875
+V C -30875
+V G -30875
+V Q -30875
+W A -92624
+X O -30875
+X C -30875
+X G -30875
+X Q -30875
+Y e -92624
+Y o -92624
+Y r -92624
+Y a -92624
+Y u -92624
+Y A -92624
+oq oq -92624
+oq ` -92624
+` oq -92624
+` ` -92624
+b e -61749
+b a -61749
+b o -61749
+b d -61749
+b c -61749
+b g -61749
+b q -61749
+c e -61749
+c a -61749
+c o -61749
+c d -61749
+c c -61749
+c g -61749
+c q -61749
+d l 61749
+e e -61749
+e a -61749
+e o -61749
+e d -61749
+e c -61749
+e g -61749
+e q -61749
+Fn cq 111848
+Fn ' 111848
+f cq 111848
+f ' 111848
+Fn ? 111848
+f ? 111848
+Fn ! 111848
+f ! 111848
+Fn ) 111848
+f ) 111848
+Fn rB 111848
+Fn ] 111848
+f rB 111848
+f ] 111848
+l l 61749
+n cq -123498
+n ' -123498
+o e -61749
+o a -61749
+o o -61749
+o d -61749
+o c -61749
+o g -61749
+o q -61749
+p e -61749
+p a -61749
+p o -61749
+p d -61749
+p c -61749
+p g -61749
+p q -61749
+r e -61749
+r a -61749
+r o -61749
+r d -61749
+r c -61749
+r g -61749
+r q -61749
+w l 61749
+charset
+*G 731666,719440,0,135298,0,-19075 2 0000
+*D 990312,719440 2 0001
+*H 928563,719440,0,95027,-84834,64152 2 0002
+*L 845843,719440 2 0003
+*C 805066,719440,0,158248,0,79125 2 0004
+*P 939632,719440,0,180443,0,90222 2 0005
+*S 866814,719440,0,119859,0,59930 2 0006
+*U 928563,719440,0,113013,-174763,-41360 2 0007
+*F 866814,719440,0,59054,-120805,59054 2 0010
+*Q 928563,719440,0,113013,-174763,-5243 2 0011
+*W 866814,719440,0,104021,0,52011 2 0012
+ff 792256,728178,203890,228357 3 0013
+fi 707205,728178,203890,113890 3 0014
+fl 738078,728178,203890,113890 3 0015
+Fi 1095466,728178,203890,113890 3 0016
+Fl 1110902,728178,203890,113890 3 0017
+.i 372824,466034,0,98840 0 0020
+.j 403699,466034,203890,48354 1 0021
+ga 619819,728178 2 0022
+aa 619819,728178,0,89421 2 0023
+ah 619819,662642,0,86728 2 0024
+ab 619819,728178,0,108354 2 0025
+a- 619819,623318,0,109518 2 0026
+ao 994973,728178 2 0027
+ac 558070,0,178403 1 0030
+ss 697302,728178,203890,102090 3 0031
+ae 866814,466034,0,89131 0 0032
+oe 866814,466034,0,89131 0 0033
+/o 619819,567979,101946,99179 3 0034
+AE 1072450,719440,0,119859 2 0035
+OE 1195947,719440,0,119859 2 0036
+/O 928563,770413,50973,95027 3 0037
+slash@for@l 311075,466034 0 0040
+! 404864,728178,0,119714 2 0041
+rq 650696,728178,0,83248 2 0042
+sh 990312,728178,203888,71653 3 0043
+# "
+Po 910723,728178 2 0044
+% 990312,786432,58254,134859 3 0045
+& 928563,728178,0,89421 2 0046
+cq 372824,728178,0,135734 2 0047
+' "
+( 496322,786432,262144,165733 3 0050
+) 496322,786432,262144,34661 3 0051
+* 619819,786432,0,150296 2 0052
++ 928563,632637,108349,34661 3 0053
+, 372824,154374,203890 1 0054
+hy 434573,466034,0,27379 0 0055
+- "
+. 372824,154374 0 0056
+sl 619819,786432,262144,165733 3 0057
+/ "
+0 619819,675749,0,138062 2 0060
+1 619819,675749,0,138062 2 0061
+2 619819,675749,0,138062 2 0062
+3 619819,675749,0,138062 2 0063
+4 619819,675749,203890,138062 3 0064
+5 619819,675749,0,138062 2 0065
+6 619819,675749,0,138062 2 0066
+7 619819,675749,203890,138062 3 0067
+8 619819,675749,0,138062 2 0070
+9 619819,675749,0,138062 2 0071
+: 372824,466034,0,70198 0 0072
+; 372824,466034,203890,70198 1 0073
+r! 404864,524288,203890,68741 3 0074
+= 928563,410110,-114178,71653 0 0075
+r? 619819,524288,203890 3 0076
+? 619819,728178,0,120296 2 0077
+at 928563,728178,0,96555 2 0100
+@ "
+A 907592,719440 2 0101
+B 856330,719440,0,104021,0,52011 2 0102
+C 866814,719440,0,148986,-84834,74493 2 0103
+D 918078,719440,0,95027,0,64152 2 0104
+E 793414,719440,0,119859,0,59930 2 0105
+F 762541,719440,0,135298,0,-19075 2 0106
+G 938758,719440,0,77042,-84834,77042 2 0107
+H 939632,719440,0,180443,0,90222 2 0110
+I 494576,719440,0,164424,0,82213 2 0111
+J 640208,719440,0,152045,0,45147 2 0112
+K 938467,719440,0,148986,0,74493 2 0113
+L 731666,719440,0,0,0,61749 2 0114
+M 1124878,719440,0,180443,0,59347 2 0115
+N 939632,719440,0,180443,0,59347 2 0116
+O 896523,719440,0,95027,-84834,64152 2 0117
+P 825454,719440,0,104021,0,-50352 2 0120
+Q 896523,719440,203890,95027,-84834,95027 3 0121
+R 901186,719440,0,26835,0,20126 2 0122
+S 681568,719440,0,118112,0,59056 2 0123
+T 834774,719440,0,135298,-134896,-19075 2 0124
+U 923613,719440,0,180443,-136096,59347 2 0125
+V 907592,719440,0,195298,-133549,-51698 2 0126
+W 1216336,719440,0,195298,-133549,40925 2 0127
+X 907592,719440,0,164424,0,82213 2 0130
+Y 907592,719440,0,207648,-148986,-39347 2 0131
+Z 743317,719440,0,148986,0,74493 2 0132
+lB 373408,786432,262144,196608 3 0133
+[ "
+lq 650696,728178,0,175869 2 0134
+rB 373408,786432,262144,104568 3 0135
+] "
+ha 619819,728178,0,70344 2 0136
+^ "
+a^ "
+a. 372824,728178,0,135734 2 0137
+oq 372824,728178,0,135734 2 0140
+` "
+a 619819,466034,0,98840,-34078,98840 0 0141
+b 558070,728178,0,82430,-34078,82430 2 0142
+c 558070,466034,0,54760,-34078,54760 0 0143
+d 619819,728178,0,113890,-34078,113890 2 0144
+e 558070,466034,0,89131,-34078,89131 0 0145
+Fn 419432,728178,203890,228357,112722,116509 3 0146
+f "
+g 558070,466034,203890,110102,-35829,71266 1 0147
+h 619819,728178,0,98840,0,98840 2 0150
+i 372824,726931,0,119403,-17669,119403 2 0151
+j 372824,726931,203890,175326,50973,110102 3 0152
+k 558070,728178,0,116509,0,98840 2 0153
+l 311075,728178,0,113890,-30875,129714 2 0154
+m 990312,466034,0,98840,-17669,98840 0 0155
+n 681568,466034,0,98840,-17669,98840 0 0156
+o 619819,466034,0,82430,-34078,82430 0 0157
+p 619819,466034,203890,82430,-17182,82430 1 0160
+q 558070,466034,203890,110102,-34078,71266 1 0161
+r 526034,466034,0,116509,-17669,85634 0 0162
+s 510595,466034,0,85634,0,85634 0 0163
+t 403699,665763,0,101072,-39323,101072 2 0164
+u 650694,466034,0,98840,-17669,98840 0 0165
+v 558070,466034,0,116509,-17669,77672 0 0166
+w 805066,466034,0,116509,-17669,87382 0 0167
+x 587782,466034,0,131946,0,131946 0 0170
+y 588946,466034,203890,110102,-17669,71266 1 0171
+z 514382,466034,0,145637,0,98840 0 0172
+en 619819,466034,0,102880 0 0173
+em 1239638,466034,0,102880 0 0174
+a" 619819,728178,0,120296 2 0175
+~ 619819,728178,0,120296 2 0176
+a~ "
+ad 619819,728178,0,120298 2 0177
diff --git a/font/devdvi/TBIEC b/font/devdvi/TBIEC
new file mode 100644
index 0000000..0bc0973
--- /dev/null
+++ b/font/devdvi/TBIEC
@@ -0,0 +1,2765 @@
+name TBIEC
+internalname ecbi1000
+spacewidth 434470
+slant 14.036243
+ligatures ff fi fl ffi ffl 0
+checksum 501947664
+designsize 10485760
+kernpairs
+bq Bq 123469
+bq v -92602
+bq w -92602
+bq T -92602
+bq V -123469
+bq W -123469
+bq Y -92602
+bq :Y -92602
+bq 'Y -92602
+bq O -30867
+bq u004F_030B -30867
+bq `O -30867
+bq 'O -30867
+bq ^O -30867
+bq ~O -30867
+bq :O -30867
+bq OE -30867
+bq /O -30867
+bq C -30867
+bq G -30867
+bq 'C -30867
+bq u0043_030C -30867
+bq u0047_0306 -30867
+bq ,C -30867
+bq Q -30867
+lq oq 123469
+lq ` 123469
+lq lq 123469
+rq cq 123469
+rq ' 123469
+rq rq 123469
+Bq bq 123469
+Bq , 123469
+Bq Bq 123469
+Bq v -92602
+Bq w -92602
+Bq T -92602
+Bq V -123469
+Bq W -123469
+Bq Y -92602
+Bq :Y -92602
+Bq 'Y -92602
+Bq O -30867
+Bq u004F_030B -30867
+Bq `O -30867
+Bq 'O -30867
+Bq ^O -30867
+Bq ~O -30867
+Bq :O -30867
+Bq OE -30867
+Bq /O -30867
+Bq C -30867
+Bq G -30867
+Bq 'C -30867
+Bq u0043_030C -30867
+Bq u0047_0306 -30867
+Bq ,C -30867
+Bq Q -30867
+Fc . -92602
+Fc , -92602
+ff cq 111821
+ff ' 111821
+ff oq 111821
+ff ` 111821
+ff lq 111821
+ff rq 111821
+ff ? 111821
+ff u01C3 111821
+ff ! 111821
+ff ) 111821
+ff rB 111821
+ff ] 111821
+cq rq 123469
+' rq 123469
+cq ? 123469
+' ? 123469
+cq u01C3 123469
+cq ! 123469
+' u01C3 123469
+' ! 123469
+A y -30867
+A :y -30867
+A 'y -30867
+A n -30867
+A u006E_0301 -30867
+A u006E_030C -30867
+A u016A -30867
+A ~n -30867
+A l -30867
+A u006C_0301 -30867
+A u006C_030C -30867
+A r -30867
+A u -30867
+A u0075_030B -30867
+A u0075_030A -30867
+A `u -30867
+A 'u -30867
+A ^u -30867
+A :u -30867
+A m -30867
+A t -30867
+A u0074_030C -30867
+A u0074_0327 -30867
+A i -30867
+A 'i -30867
+A h -30867
+A b -30867
+A k -30867
+A v -30867
+A w -30867
+A C -30867
+A G -30867
+A 'C -30867
+A u0043_030C -30867
+A u0047_0306 -30867
+A ,C -30867
+A Q -30867
+A O -30867
+A u004F_030B -30867
+A `O -30867
+A 'O -30867
+A ^O -30867
+A ~O -30867
+A :O -30867
+A OE -30867
+A /O -30867
+A U -30867
+A u0055_030B -30867
+A u0055_030A -30867
+A `U -30867
+A 'U -30867
+A ^U -30867
+A :U -30867
+A T -92602
+A u0054_030C -92602
+A u0054_0327 -92602
+A Y -92602
+A :Y -92602
+A 'Y -92602
+A V -123469
+A W -123469
+A e -61734
+A u0065_030C -61734
+A u0065_0328 -61734
+A `e -61734
+A 'e -61734
+A ^e -61734
+A :e -61734
+A a -61734
+A u0061_0306 -61734
+A u0061_0328 -61734
+A `a -61734
+A 'a -61734
+A ^a -61734
+A ^a -61734
+A ~a -61734
+A :a -61734
+A oa -61734
+A ae -61734
+A o -61734
+A u006F_030B -61734
+A `o -61734
+A 'o -61734
+A ^o -61734
+A ~o -61734
+A :o -61734
+A oe -61734
+A /o -61734
+A d -61734
+A u0111 -61734
+A c -61734
+A 'c -61734
+A u0063_030C -61734
+A ,c -61734
+A g -61734
+A u0067_0306 -61734
+A q -61734
+D X -30867
+D W -30867
+D A -30867
+D u0041_0306 -30867
+D u0041_0328 -30867
+D `A -30867
+D 'A -30867
+D ^A -30867
+D ~A -30867
+D :A -30867
+D oA -30867
+D AE -30867
+D V -30867
+D Y -30867
+D :Y -30867
+D 'Y -30867
+F o -92602
+F e -92602
+F u0065_0328 -92602
+F u -92602
+F r -92602
+F n -92602
+F v -92602
+F a -92602
+F u0061_0328 -92602
+F A -123469
+F u0041_0306 -123469
+F u0041_0328 -123469
+F `A -123469
+F 'A -123469
+F ^A -123469
+F ~A -123469
+F :A -123469
+F oA -123469
+F AE -123469
+F O -30867
+F u004F_030B -30867
+F `O -30867
+F 'O -30867
+F ^O -30867
+F ~O -30867
+F :O -30867
+F OE -30867
+F /O -30867
+F C -30867
+F G -30867
+F 'C -30867
+F u0043_030C -30867
+F u0047_0306 -30867
+F ,C -30867
+F Q -30867
+K v -30867
+K w -30867
+K O -30867
+K u004F_030B -30867
+K `O -30867
+K 'O -30867
+K ^O -30867
+K ~O -30867
+K :O -30867
+K OE -30867
+K /O -30867
+K C -30867
+K G -30867
+K 'C -30867
+K u0043_030C -30867
+K u0047_0306 -30867
+K ,C -30867
+K Q -30867
+L T -92602
+L u0054_030C -92602
+L u0054_0327 -92602
+L Y -92602
+L :Y -92602
+L 'Y -92602
+L V -123469
+L W -123469
+L e -61734
+L u0065_030C -61734
+L u0065_0328 -61734
+L `e -61734
+L 'e -61734
+L ^e -61734
+L :e -61734
+L a -61734
+L u0061_0306 -61734
+L u0061_0328 -61734
+L `a -61734
+L 'a -61734
+L ^a -61734
+L ^a -61734
+L ~a -61734
+L :a -61734
+L oa -61734
+L ae -61734
+L o -61734
+L u006F_030B -61734
+L `o -61734
+L 'o -61734
+L ^o -61734
+L ~o -61734
+L :o -61734
+L oe -61734
+L /o -61734
+L d -61734
+L u0111 -61734
+L c -61734
+L 'c -61734
+L u0063_030C -61734
+L ,c -61734
+L g -61734
+L u0067_0306 -61734
+L q -61734
+O X -30867
+O W -30867
+O A -30867
+O u0041_0306 -30867
+O u0041_0328 -30867
+O `A -30867
+O 'A -30867
+O ^A -30867
+O ~A -30867
+O :A -30867
+O oA -30867
+O AE -30867
+O V -30867
+O Y -30867
+O :Y -30867
+O 'Y -30867
+P A -92602
+P u0041_0306 -92602
+P u0041_0328 -92602
+P `A -92602
+P 'A -92602
+P ^A -92602
+P ~A -92602
+P :A -92602
+P oA -92602
+P AE -92602
+R n -30867
+R u006E_0301 -30867
+R u006E_030C -30867
+R u016A -30867
+R ~n -30867
+R l -30867
+R u006C_0301 -30867
+R u006C_030C -30867
+R r -30867
+R u -30867
+R u0075_030B -30867
+R u0075_030A -30867
+R `u -30867
+R 'u -30867
+R ^u -30867
+R :u -30867
+R m -30867
+R t -30867
+R u0074_030C -30867
+R u0074_0327 -30867
+R i -30867
+R 'i -30867
+R h -30867
+R b -30867
+R k -30867
+R v -30867
+R w -30867
+R C -30867
+R G -30867
+R 'C -30867
+R u0043_030C -30867
+R u0047_0306 -30867
+R ,C -30867
+R Q -30867
+R O -30867
+R u004F_030B -30867
+R `O -30867
+R 'O -30867
+R ^O -30867
+R ~O -30867
+R :O -30867
+R OE -30867
+R /O -30867
+R U -30867
+R u0055_030B -30867
+R u0055_030A -30867
+R `U -30867
+R 'U -30867
+R ^U -30867
+R :U -30867
+R T -92602
+R u0054_030C -92602
+R u0054_0327 -92602
+R Y -92602
+R :Y -92602
+R 'Y -92602
+R V -123469
+R W -123469
+R e -61734
+R u0065_030C -61734
+R u0065_0328 -61734
+R `e -61734
+R 'e -61734
+R ^e -61734
+R :e -61734
+R a -61734
+R u0061_0306 -61734
+R u0061_0328 -61734
+R `a -61734
+R 'a -61734
+R ^a -61734
+R ^a -61734
+R ~a -61734
+R :a -61734
+R oa -61734
+R ae -61734
+R o -61734
+R u006F_030B -61734
+R `o -61734
+R 'o -61734
+R ^o -61734
+R ~o -61734
+R :o -61734
+R oe -61734
+R /o -61734
+R d -61734
+R u0111 -61734
+R c -61734
+R 'c -61734
+R u0063_030C -61734
+R ,c -61734
+R g -61734
+R u0067_0306 -61734
+R q -61734
+T y -92602
+T e -92602
+T o -92602
+T r -92602
+T a -92602
+T u -92602
+T A -92602
+T u0041_0306 -92602
+T u0041_0328 -92602
+T `A -92602
+T 'A -92602
+T ^A -92602
+T ~A -92602
+T :A -92602
+T oA -92602
+T AE -92602
+V o -92602
+V e -92602
+V u0065_0328 -92602
+V u -92602
+V r -92602
+V n -92602
+V v -92602
+V a -92602
+V u0061_0328 -92602
+V A -123469
+V u0041_0306 -123469
+V u0041_0328 -123469
+V `A -123469
+V 'A -123469
+V ^A -123469
+V ~A -123469
+V :A -123469
+V oA -123469
+V AE -123469
+V O -30867
+V u004F_030B -30867
+V `O -30867
+V 'O -30867
+V ^O -30867
+V ~O -30867
+V :O -30867
+V OE -30867
+V /O -30867
+V C -30867
+V G -30867
+V 'C -30867
+V u0043_030C -30867
+V u0047_0306 -30867
+V ,C -30867
+V Q -30867
+W o -92602
+W e -92602
+W u0065_0328 -92602
+W u -92602
+W r -92602
+W n -92602
+W v -92602
+W a -92602
+W u0061_0328 -92602
+W A -123469
+W u0041_0306 -123469
+W u0041_0328 -123469
+W `A -123469
+W 'A -123469
+W ^A -123469
+W ~A -123469
+W :A -123469
+W oA -123469
+W AE -123469
+W O -30867
+W u004F_030B -30867
+W `O -30867
+W 'O -30867
+W ^O -30867
+W ~O -30867
+W :O -30867
+W OE -30867
+W /O -30867
+W C -30867
+W G -30867
+W 'C -30867
+W u0043_030C -30867
+W u0047_0306 -30867
+W ,C -30867
+W Q -30867
+X O -30867
+X u004F_030B -30867
+X `O -30867
+X 'O -30867
+X ^O -30867
+X ~O -30867
+X :O -30867
+X OE -30867
+X /O -30867
+X C -30867
+X G -30867
+X 'C -30867
+X u0043_030C -30867
+X u0047_0306 -30867
+X ,C -30867
+X Q -30867
+Y e -92602
+Y o -92602
+Y r -92602
+Y a -92602
+Y u -92602
+Y A -92602
+Y u0041_0306 -92602
+Y u0041_0328 -92602
+Y `A -92602
+Y 'A -92602
+Y ^A -92602
+Y ~A -92602
+Y :A -92602
+Y oA -92602
+Y AE -92602
+oq lq 123469
+` lq 123469
+oq ? 123469
+` ? 123469
+oq u01C3 123469
+oq ! 123469
+` u01C3 123469
+` ! 123469
+b e -61734
+b u0065_030C -61734
+b u0065_0328 -61734
+b `e -61734
+b 'e -61734
+b ^e -61734
+b :e -61734
+b a -61734
+b u0061_0306 -61734
+b u0061_0328 -61734
+b `a -61734
+b 'a -61734
+b ^a -61734
+b ^a -61734
+b ~a -61734
+b :a -61734
+b oa -61734
+b ae -61734
+b o -61734
+b u006F_030B -61734
+b `o -61734
+b 'o -61734
+b ^o -61734
+b ~o -61734
+b :o -61734
+b oe -61734
+b /o -61734
+b d -61734
+b u0111 -61734
+b c -61734
+b 'c -61734
+b u0063_030C -61734
+b ,c -61734
+b g -61734
+b u0067_0306 -61734
+b q -61734
+c e -61734
+c u0065_030C -61734
+c u0065_0328 -61734
+c `e -61734
+c 'e -61734
+c ^e -61734
+c :e -61734
+c a -61734
+c u0061_0306 -61734
+c u0061_0328 -61734
+c `a -61734
+c 'a -61734
+c ^a -61734
+c ^a -61734
+c ~a -61734
+c :a -61734
+c oa -61734
+c ae -61734
+c o -61734
+c u006F_030B -61734
+c `o -61734
+c 'o -61734
+c ^o -61734
+c ~o -61734
+c :o -61734
+c oe -61734
+c /o -61734
+c d -61734
+c u0111 -61734
+c c -61734
+c 'c -61734
+c u0063_030C -61734
+c ,c -61734
+c g -61734
+c u0067_0306 -61734
+c q -61734
+d l 61734
+d u006C_0301 61734
+d u006C_030C 61734
+e e -61734
+e u0065_030C -61734
+e u0065_0328 -61734
+e `e -61734
+e 'e -61734
+e ^e -61734
+e :e -61734
+e a -61734
+e u0061_0306 -61734
+e u0061_0328 -61734
+e `a -61734
+e 'a -61734
+e ^a -61734
+e ^a -61734
+e ~a -61734
+e :a -61734
+e oa -61734
+e ae -61734
+e o -61734
+e u006F_030B -61734
+e `o -61734
+e 'o -61734
+e ^o -61734
+e ~o -61734
+e :o -61734
+e oe -61734
+e /o -61734
+e d -61734
+e u0111 -61734
+e c -61734
+e 'c -61734
+e u0063_030C -61734
+e ,c -61734
+e g -61734
+e u0067_0306 -61734
+e q -61734
+f cq 111821
+f ' 111821
+f oq 111821
+f ` 111821
+f lq 111821
+f rq 111821
+f ? 111821
+f u01C3 111821
+f ! 111821
+f ) 111821
+f rB 111821
+f ] 111821
+l l 61734
+l u006C_0301 61734
+l u006C_030C 61734
+n cq -123469
+n ' -123469
+o e -61734
+o u0065_030C -61734
+o u0065_0328 -61734
+o `e -61734
+o 'e -61734
+o ^e -61734
+o :e -61734
+o a -61734
+o u0061_0306 -61734
+o u0061_0328 -61734
+o `a -61734
+o 'a -61734
+o ^a -61734
+o ^a -61734
+o ~a -61734
+o :a -61734
+o oa -61734
+o ae -61734
+o o -61734
+o u006F_030B -61734
+o `o -61734
+o 'o -61734
+o ^o -61734
+o ~o -61734
+o :o -61734
+o oe -61734
+o /o -61734
+o d -61734
+o u0111 -61734
+o c -61734
+o 'c -61734
+o u0063_030C -61734
+o ,c -61734
+o g -61734
+o u0067_0306 -61734
+o q -61734
+p e -61734
+p u0065_030C -61734
+p u0065_0328 -61734
+p `e -61734
+p 'e -61734
+p ^e -61734
+p :e -61734
+p a -61734
+p u0061_0306 -61734
+p u0061_0328 -61734
+p `a -61734
+p 'a -61734
+p ^a -61734
+p ^a -61734
+p ~a -61734
+p :a -61734
+p oa -61734
+p ae -61734
+p o -61734
+p u006F_030B -61734
+p `o -61734
+p 'o -61734
+p ^o -61734
+p ~o -61734
+p :o -61734
+p oe -61734
+p /o -61734
+p d -61734
+p u0111 -61734
+p c -61734
+p 'c -61734
+p u0063_030C -61734
+p ,c -61734
+p g -61734
+p u0067_0306 -61734
+p q -61734
+r e -61734
+r u0065_030C -61734
+r u0065_0328 -61734
+r `e -61734
+r 'e -61734
+r ^e -61734
+r :e -61734
+r a -61734
+r u0061_0306 -61734
+r u0061_0328 -61734
+r `a -61734
+r 'a -61734
+r ^a -61734
+r ^a -61734
+r ~a -61734
+r :a -61734
+r oa -61734
+r ae -61734
+r o -61734
+r u006F_030B -61734
+r `o -61734
+r 'o -61734
+r ^o -61734
+r ~o -61734
+r :o -61734
+r oe -61734
+r /o -61734
+r d -61734
+r u0111 -61734
+r c -61734
+r 'c -61734
+r u0063_030C -61734
+r ,c -61734
+r g -61734
+r u0067_0306 -61734
+r q -61734
+w l 61734
+w u006C_0301 61734
+w u006C_030C 61734
+u0041_0306 y -30867
+u0041_0306 :y -30867
+u0041_0306 'y -30867
+u0041_0306 n -30867
+u0041_0306 u006E_0301 -30867
+u0041_0306 u006E_030C -30867
+u0041_0306 u016A -30867
+u0041_0306 ~n -30867
+u0041_0306 l -30867
+u0041_0306 u006C_0301 -30867
+u0041_0306 u006C_030C -30867
+u0041_0306 r -30867
+u0041_0306 u -30867
+u0041_0306 u0075_030B -30867
+u0041_0306 u0075_030A -30867
+u0041_0306 `u -30867
+u0041_0306 'u -30867
+u0041_0306 ^u -30867
+u0041_0306 :u -30867
+u0041_0306 m -30867
+u0041_0306 t -30867
+u0041_0306 u0074_030C -30867
+u0041_0306 u0074_0327 -30867
+u0041_0306 i -30867
+u0041_0306 'i -30867
+u0041_0306 h -30867
+u0041_0306 b -30867
+u0041_0306 k -30867
+u0041_0306 v -30867
+u0041_0306 w -30867
+u0041_0306 C -30867
+u0041_0306 G -30867
+u0041_0306 'C -30867
+u0041_0306 u0043_030C -30867
+u0041_0306 u0047_0306 -30867
+u0041_0306 ,C -30867
+u0041_0306 Q -30867
+u0041_0306 O -30867
+u0041_0306 u004F_030B -30867
+u0041_0306 `O -30867
+u0041_0306 'O -30867
+u0041_0306 ^O -30867
+u0041_0306 ~O -30867
+u0041_0306 :O -30867
+u0041_0306 OE -30867
+u0041_0306 /O -30867
+u0041_0306 U -30867
+u0041_0306 u0055_030B -30867
+u0041_0306 u0055_030A -30867
+u0041_0306 `U -30867
+u0041_0306 'U -30867
+u0041_0306 ^U -30867
+u0041_0306 :U -30867
+u0041_0306 T -92602
+u0041_0306 u0054_030C -92602
+u0041_0306 u0054_0327 -92602
+u0041_0306 Y -92602
+u0041_0306 :Y -92602
+u0041_0306 'Y -92602
+u0041_0306 V -123469
+u0041_0306 W -123469
+u0041_0306 e -61734
+u0041_0306 u0065_030C -61734
+u0041_0306 u0065_0328 -61734
+u0041_0306 `e -61734
+u0041_0306 'e -61734
+u0041_0306 ^e -61734
+u0041_0306 :e -61734
+u0041_0306 a -61734
+u0041_0306 u0061_0306 -61734
+u0041_0306 u0061_0328 -61734
+u0041_0306 `a -61734
+u0041_0306 'a -61734
+u0041_0306 ^a -61734
+u0041_0306 ^a -61734
+u0041_0306 ~a -61734
+u0041_0306 :a -61734
+u0041_0306 oa -61734
+u0041_0306 ae -61734
+u0041_0306 o -61734
+u0041_0306 u006F_030B -61734
+u0041_0306 `o -61734
+u0041_0306 'o -61734
+u0041_0306 ^o -61734
+u0041_0306 ~o -61734
+u0041_0306 :o -61734
+u0041_0306 oe -61734
+u0041_0306 /o -61734
+u0041_0306 d -61734
+u0041_0306 u0111 -61734
+u0041_0306 c -61734
+u0041_0306 'c -61734
+u0041_0306 u0063_030C -61734
+u0041_0306 ,c -61734
+u0041_0306 g -61734
+u0041_0306 u0067_0306 -61734
+u0041_0306 q -61734
+u0041_0328 n -30867
+u0041_0328 u006E_0301 -30867
+u0041_0328 u006E_030C -30867
+u0041_0328 u016A -30867
+u0041_0328 ~n -30867
+u0041_0328 l -30867
+u0041_0328 u006C_0301 -30867
+u0041_0328 u006C_030C -30867
+u0041_0328 r -30867
+u0041_0328 u -30867
+u0041_0328 u0075_030B -30867
+u0041_0328 u0075_030A -30867
+u0041_0328 `u -30867
+u0041_0328 'u -30867
+u0041_0328 ^u -30867
+u0041_0328 :u -30867
+u0041_0328 m -30867
+u0041_0328 t -30867
+u0041_0328 u0074_030C -30867
+u0041_0328 u0074_0327 -30867
+u0041_0328 i -30867
+u0041_0328 'i -30867
+u0041_0328 h -30867
+u0041_0328 b -30867
+u0041_0328 k -30867
+u0041_0328 v -30867
+u0041_0328 w -30867
+u0041_0328 C -30867
+u0041_0328 G -30867
+u0041_0328 'C -30867
+u0041_0328 u0043_030C -30867
+u0041_0328 u0047_0306 -30867
+u0041_0328 ,C -30867
+u0041_0328 Q -30867
+u0041_0328 O -30867
+u0041_0328 u004F_030B -30867
+u0041_0328 `O -30867
+u0041_0328 'O -30867
+u0041_0328 ^O -30867
+u0041_0328 ~O -30867
+u0041_0328 :O -30867
+u0041_0328 OE -30867
+u0041_0328 /O -30867
+u0041_0328 U -30867
+u0041_0328 u0055_030B -30867
+u0041_0328 u0055_030A -30867
+u0041_0328 `U -30867
+u0041_0328 'U -30867
+u0041_0328 ^U -30867
+u0041_0328 :U -30867
+u0041_0328 T -92602
+u0041_0328 u0054_030C -92602
+u0041_0328 u0054_0327 -92602
+u0041_0328 Y -92602
+u0041_0328 :Y -92602
+u0041_0328 'Y -92602
+u0041_0328 V -123469
+u0041_0328 W -123469
+u0041_0328 e -61734
+u0041_0328 u0065_030C -61734
+u0041_0328 u0065_0328 -61734
+u0041_0328 `e -61734
+u0041_0328 'e -61734
+u0041_0328 ^e -61734
+u0041_0328 :e -61734
+u0041_0328 a -61734
+u0041_0328 u0061_0306 -61734
+u0041_0328 u0061_0328 -61734
+u0041_0328 `a -61734
+u0041_0328 'a -61734
+u0041_0328 ^a -61734
+u0041_0328 ^a -61734
+u0041_0328 ~a -61734
+u0041_0328 :a -61734
+u0041_0328 oa -61734
+u0041_0328 ae -61734
+u0041_0328 o -61734
+u0041_0328 u006F_030B -61734
+u0041_0328 `o -61734
+u0041_0328 'o -61734
+u0041_0328 ^o -61734
+u0041_0328 ~o -61734
+u0041_0328 :o -61734
+u0041_0328 oe -61734
+u0041_0328 /o -61734
+u0041_0328 d -61734
+u0041_0328 u0111 -61734
+u0041_0328 c -61734
+u0041_0328 'c -61734
+u0041_0328 u0063_030C -61734
+u0041_0328 ,c -61734
+u0041_0328 g -61734
+u0041_0328 u0067_0306 -61734
+u0041_0328 q -61734
+u0044_030C X -30867
+u0044_030C W -30867
+u0044_030C A -30867
+u0044_030C u0041_0306 -30867
+u0044_030C u0041_0328 -30867
+u0044_030C `A -30867
+u0044_030C 'A -30867
+u0044_030C ^A -30867
+u0044_030C ~A -30867
+u0044_030C :A -30867
+u0044_030C oA -30867
+u0044_030C AE -30867
+u0044_030C V -30867
+u0044_030C Y -30867
+u0044_030C :Y -30867
+u0044_030C 'Y -30867
+u004C_0301 T -92602
+u004C_0301 u0054_030C -92602
+u004C_0301 u0054_0327 -92602
+u004C_0301 Y -92602
+u004C_0301 :Y -92602
+u004C_0301 'Y -92602
+u004C_0301 V -123469
+u004C_0301 W -123469
+u004C_0301 e -61734
+u004C_0301 u0065_030C -61734
+u004C_0301 u0065_0328 -61734
+u004C_0301 `e -61734
+u004C_0301 'e -61734
+u004C_0301 ^e -61734
+u004C_0301 :e -61734
+u004C_0301 a -61734
+u004C_0301 u0061_0306 -61734
+u004C_0301 u0061_0328 -61734
+u004C_0301 `a -61734
+u004C_0301 'a -61734
+u004C_0301 ^a -61734
+u004C_0301 ^a -61734
+u004C_0301 ~a -61734
+u004C_0301 :a -61734
+u004C_0301 oa -61734
+u004C_0301 ae -61734
+u004C_0301 o -61734
+u004C_0301 u006F_030B -61734
+u004C_0301 `o -61734
+u004C_0301 'o -61734
+u004C_0301 ^o -61734
+u004C_0301 ~o -61734
+u004C_0301 :o -61734
+u004C_0301 oe -61734
+u004C_0301 /o -61734
+u004C_0301 d -61734
+u004C_0301 u0111 -61734
+u004C_0301 c -61734
+u004C_0301 'c -61734
+u004C_0301 u0063_030C -61734
+u004C_0301 ,c -61734
+u004C_0301 g -61734
+u004C_0301 u0067_0306 -61734
+u004C_0301 q -61734
+u004C_030C T -92602
+u004C_030C u0054_030C -92602
+u004C_030C u0054_0327 -92602
+u004C_030C Y -92602
+u004C_030C :Y -92602
+u004C_030C 'Y -92602
+u004C_030C V -123469
+u004C_030C W -123469
+u004C_030C e -61734
+u004C_030C u0065_030C -61734
+u004C_030C u0065_0328 -61734
+u004C_030C `e -61734
+u004C_030C 'e -61734
+u004C_030C ^e -61734
+u004C_030C :e -61734
+u004C_030C a -61734
+u004C_030C u0061_0306 -61734
+u004C_030C u0061_0328 -61734
+u004C_030C `a -61734
+u004C_030C 'a -61734
+u004C_030C ^a -61734
+u004C_030C ^a -61734
+u004C_030C ~a -61734
+u004C_030C :a -61734
+u004C_030C oa -61734
+u004C_030C ae -61734
+u004C_030C o -61734
+u004C_030C u006F_030B -61734
+u004C_030C `o -61734
+u004C_030C 'o -61734
+u004C_030C ^o -61734
+u004C_030C ~o -61734
+u004C_030C :o -61734
+u004C_030C oe -61734
+u004C_030C /o -61734
+u004C_030C d -61734
+u004C_030C u0111 -61734
+u004C_030C c -61734
+u004C_030C 'c -61734
+u004C_030C u0063_030C -61734
+u004C_030C ,c -61734
+u004C_030C g -61734
+u004C_030C u0067_0306 -61734
+u004C_030C q -61734
+u004F_030B X -30867
+u004F_030B W -30867
+u004F_030B A -30867
+u004F_030B u0041_0306 -30867
+u004F_030B u0041_0328 -30867
+u004F_030B `A -30867
+u004F_030B 'A -30867
+u004F_030B ^A -30867
+u004F_030B ~A -30867
+u004F_030B :A -30867
+u004F_030B oA -30867
+u004F_030B AE -30867
+u004F_030B V -30867
+u004F_030B Y -30867
+u004F_030B :Y -30867
+u004F_030B 'Y -30867
+u0052_0301 n -30867
+u0052_0301 u006E_0301 -30867
+u0052_0301 u006E_030C -30867
+u0052_0301 u016A -30867
+u0052_0301 ~n -30867
+u0052_0301 l -30867
+u0052_0301 u006C_0301 -30867
+u0052_0301 u006C_030C -30867
+u0052_0301 r -30867
+u0052_0301 u -30867
+u0052_0301 u0075_030B -30867
+u0052_0301 u0075_030A -30867
+u0052_0301 `u -30867
+u0052_0301 'u -30867
+u0052_0301 ^u -30867
+u0052_0301 :u -30867
+u0052_0301 m -30867
+u0052_0301 t -30867
+u0052_0301 u0074_030C -30867
+u0052_0301 u0074_0327 -30867
+u0052_0301 i -30867
+u0052_0301 'i -30867
+u0052_0301 h -30867
+u0052_0301 b -30867
+u0052_0301 k -30867
+u0052_0301 v -30867
+u0052_0301 w -30867
+u0052_0301 C -30867
+u0052_0301 G -30867
+u0052_0301 'C -30867
+u0052_0301 u0043_030C -30867
+u0052_0301 u0047_0306 -30867
+u0052_0301 ,C -30867
+u0052_0301 Q -30867
+u0052_0301 O -30867
+u0052_0301 u004F_030B -30867
+u0052_0301 `O -30867
+u0052_0301 'O -30867
+u0052_0301 ^O -30867
+u0052_0301 ~O -30867
+u0052_0301 :O -30867
+u0052_0301 OE -30867
+u0052_0301 /O -30867
+u0052_0301 U -30867
+u0052_0301 u0055_030B -30867
+u0052_0301 u0055_030A -30867
+u0052_0301 `U -30867
+u0052_0301 'U -30867
+u0052_0301 ^U -30867
+u0052_0301 :U -30867
+u0052_0301 T -92602
+u0052_0301 u0054_030C -92602
+u0052_0301 u0054_0327 -92602
+u0052_0301 Y -92602
+u0052_0301 :Y -92602
+u0052_0301 'Y -92602
+u0052_0301 V -123469
+u0052_0301 W -123469
+u0052_0301 e -61734
+u0052_0301 u0065_030C -61734
+u0052_0301 u0065_0328 -61734
+u0052_0301 `e -61734
+u0052_0301 'e -61734
+u0052_0301 ^e -61734
+u0052_0301 :e -61734
+u0052_0301 a -61734
+u0052_0301 u0061_0306 -61734
+u0052_0301 u0061_0328 -61734
+u0052_0301 `a -61734
+u0052_0301 'a -61734
+u0052_0301 ^a -61734
+u0052_0301 ^a -61734
+u0052_0301 ~a -61734
+u0052_0301 :a -61734
+u0052_0301 oa -61734
+u0052_0301 ae -61734
+u0052_0301 o -61734
+u0052_0301 u006F_030B -61734
+u0052_0301 `o -61734
+u0052_0301 'o -61734
+u0052_0301 ^o -61734
+u0052_0301 ~o -61734
+u0052_0301 :o -61734
+u0052_0301 oe -61734
+u0052_0301 /o -61734
+u0052_0301 d -61734
+u0052_0301 u0111 -61734
+u0052_0301 c -61734
+u0052_0301 'c -61734
+u0052_0301 u0063_030C -61734
+u0052_0301 ,c -61734
+u0052_0301 g -61734
+u0052_0301 u0067_0306 -61734
+u0052_0301 q -61734
+u0054_030C y -92602
+u0054_030C e -92602
+u0054_030C o -92602
+u0054_030C r -92602
+u0054_030C a -92602
+u0054_030C u -92602
+u0054_030C A -92602
+u0054_030C u0041_0306 -92602
+u0054_030C u0041_0328 -92602
+u0054_030C `A -92602
+u0054_030C 'A -92602
+u0054_030C ^A -92602
+u0054_030C ~A -92602
+u0054_030C :A -92602
+u0054_030C oA -92602
+u0054_030C AE -92602
+u0054_0327 y -92602
+u0054_0327 e -92602
+u0054_0327 o -92602
+u0054_0327 r -92602
+u0054_0327 a -92602
+u0054_0327 u -92602
+u0054_0327 A -92602
+u0054_0327 u0041_0306 -92602
+u0054_0327 u0041_0328 -92602
+u0054_0327 `A -92602
+u0054_0327 'A -92602
+u0054_0327 ^A -92602
+u0054_0327 ~A -92602
+u0054_0327 :A -92602
+u0054_0327 oA -92602
+u0054_0327 AE -92602
+:Y e -92602
+:Y o -92602
+:Y r -92602
+:Y a -92602
+:Y u -92602
+:Y A -92602
+:Y u0041_0306 -92602
+:Y u0041_0328 -92602
+:Y `A -92602
+:Y 'A -92602
+:Y ^A -92602
+:Y ~A -92602
+:Y :A -92602
+:Y oA -92602
+:Y AE -92602
+'c e -61734
+'c u0065_030C -61734
+'c u0065_0328 -61734
+'c `e -61734
+'c 'e -61734
+'c ^e -61734
+'c :e -61734
+'c a -61734
+'c u0061_0306 -61734
+'c u0061_0328 -61734
+'c `a -61734
+'c 'a -61734
+'c ^a -61734
+'c ^a -61734
+'c ~a -61734
+'c :a -61734
+'c oa -61734
+'c ae -61734
+'c o -61734
+'c u006F_030B -61734
+'c `o -61734
+'c 'o -61734
+'c ^o -61734
+'c ~o -61734
+'c :o -61734
+'c oe -61734
+'c /o -61734
+'c d -61734
+'c u0111 -61734
+'c c -61734
+'c 'c -61734
+'c u0063_030C -61734
+'c ,c -61734
+'c g -61734
+'c u0067_0306 -61734
+'c q -61734
+u0063_030C e -61734
+u0063_030C u0065_030C -61734
+u0063_030C u0065_0328 -61734
+u0063_030C `e -61734
+u0063_030C 'e -61734
+u0063_030C ^e -61734
+u0063_030C :e -61734
+u0063_030C a -61734
+u0063_030C u0061_0306 -61734
+u0063_030C u0061_0328 -61734
+u0063_030C `a -61734
+u0063_030C 'a -61734
+u0063_030C ^a -61734
+u0063_030C ^a -61734
+u0063_030C ~a -61734
+u0063_030C :a -61734
+u0063_030C oa -61734
+u0063_030C ae -61734
+u0063_030C o -61734
+u0063_030C u006F_030B -61734
+u0063_030C `o -61734
+u0063_030C 'o -61734
+u0063_030C ^o -61734
+u0063_030C ~o -61734
+u0063_030C :o -61734
+u0063_030C oe -61734
+u0063_030C /o -61734
+u0063_030C d -61734
+u0063_030C u0111 -61734
+u0063_030C c -61734
+u0063_030C 'c -61734
+u0063_030C u0063_030C -61734
+u0063_030C ,c -61734
+u0063_030C g -61734
+u0063_030C u0067_0306 -61734
+u0063_030C q -61734
+u0064_030C l 61734
+u0064_030C u006C_0301 61734
+u0064_030C u006C_030C 61734
+u0065_030C e -61734
+u0065_030C u0065_030C -61734
+u0065_030C u0065_0328 -61734
+u0065_030C `e -61734
+u0065_030C 'e -61734
+u0065_030C ^e -61734
+u0065_030C :e -61734
+u0065_030C a -61734
+u0065_030C u0061_0306 -61734
+u0065_030C u0061_0328 -61734
+u0065_030C `a -61734
+u0065_030C 'a -61734
+u0065_030C ^a -61734
+u0065_030C ^a -61734
+u0065_030C ~a -61734
+u0065_030C :a -61734
+u0065_030C oa -61734
+u0065_030C ae -61734
+u0065_030C o -61734
+u0065_030C u006F_030B -61734
+u0065_030C `o -61734
+u0065_030C 'o -61734
+u0065_030C ^o -61734
+u0065_030C ~o -61734
+u0065_030C :o -61734
+u0065_030C oe -61734
+u0065_030C /o -61734
+u0065_030C d -61734
+u0065_030C u0111 -61734
+u0065_030C c -61734
+u0065_030C 'c -61734
+u0065_030C u0063_030C -61734
+u0065_030C ,c -61734
+u0065_030C g -61734
+u0065_030C u0067_0306 -61734
+u0065_030C q -61734
+u0065_0328 e -61734
+u0065_0328 u0065_030C -61734
+u0065_0328 u0065_0328 -61734
+u0065_0328 `e -61734
+u0065_0328 'e -61734
+u0065_0328 ^e -61734
+u0065_0328 :e -61734
+u0065_0328 a -61734
+u0065_0328 u0061_0306 -61734
+u0065_0328 u0061_0328 -61734
+u0065_0328 `a -61734
+u0065_0328 'a -61734
+u0065_0328 ^a -61734
+u0065_0328 ^a -61734
+u0065_0328 ~a -61734
+u0065_0328 :a -61734
+u0065_0328 oa -61734
+u0065_0328 ae -61734
+u0065_0328 o -61734
+u0065_0328 u006F_030B -61734
+u0065_0328 `o -61734
+u0065_0328 'o -61734
+u0065_0328 ^o -61734
+u0065_0328 ~o -61734
+u0065_0328 :o -61734
+u0065_0328 oe -61734
+u0065_0328 /o -61734
+u0065_0328 d -61734
+u0065_0328 u0111 -61734
+u0065_0328 c -61734
+u0065_0328 'c -61734
+u0065_0328 u0063_030C -61734
+u0065_0328 ,c -61734
+u0065_0328 g -61734
+u0065_0328 u0067_0306 -61734
+u0065_0328 q -61734
+u006C_0301 l 61734
+u006C_0301 u006C_0301 61734
+u006C_0301 u006C_030C 61734
+u006C_030C l 61734
+u006C_030C u006C_0301 61734
+u006C_030C u006C_030C 61734
+/l cq 30867
+/l ' 30867
+`A y -30867
+`A :y -30867
+`A 'y -30867
+`A n -30867
+`A u006E_0301 -30867
+`A u006E_030C -30867
+`A u016A -30867
+`A ~n -30867
+`A l -30867
+`A u006C_0301 -30867
+`A u006C_030C -30867
+`A r -30867
+`A u -30867
+`A u0075_030B -30867
+`A u0075_030A -30867
+`A `u -30867
+`A 'u -30867
+`A ^u -30867
+`A :u -30867
+`A m -30867
+`A t -30867
+`A u0074_030C -30867
+`A u0074_0327 -30867
+`A i -30867
+`A 'i -30867
+`A h -30867
+`A b -30867
+`A k -30867
+`A v -30867
+`A w -30867
+`A C -30867
+`A G -30867
+`A 'C -30867
+`A u0043_030C -30867
+`A u0047_0306 -30867
+`A ,C -30867
+`A Q -30867
+`A O -30867
+`A u004F_030B -30867
+`A `O -30867
+`A 'O -30867
+`A ^O -30867
+`A ~O -30867
+`A :O -30867
+`A OE -30867
+`A /O -30867
+`A U -30867
+`A u0055_030B -30867
+`A u0055_030A -30867
+`A `U -30867
+`A 'U -30867
+`A ^U -30867
+`A :U -30867
+`A T -92602
+`A u0054_030C -92602
+`A u0054_0327 -92602
+`A Y -92602
+`A :Y -92602
+`A 'Y -92602
+`A V -123469
+`A W -123469
+`A e -61734
+`A u0065_030C -61734
+`A u0065_0328 -61734
+`A `e -61734
+`A 'e -61734
+`A ^e -61734
+`A :e -61734
+`A a -61734
+`A u0061_0306 -61734
+`A u0061_0328 -61734
+`A `a -61734
+`A 'a -61734
+`A ^a -61734
+`A ^a -61734
+`A ~a -61734
+`A :a -61734
+`A oa -61734
+`A ae -61734
+`A o -61734
+`A u006F_030B -61734
+`A `o -61734
+`A 'o -61734
+`A ^o -61734
+`A ~o -61734
+`A :o -61734
+`A oe -61734
+`A /o -61734
+`A d -61734
+`A u0111 -61734
+`A c -61734
+`A 'c -61734
+`A u0063_030C -61734
+`A ,c -61734
+`A g -61734
+`A u0067_0306 -61734
+`A q -61734
+'A y -30867
+'A :y -30867
+'A 'y -30867
+'A n -30867
+'A u006E_0301 -30867
+'A u006E_030C -30867
+'A u016A -30867
+'A ~n -30867
+'A l -30867
+'A u006C_0301 -30867
+'A u006C_030C -30867
+'A r -30867
+'A u -30867
+'A u0075_030B -30867
+'A u0075_030A -30867
+'A `u -30867
+'A 'u -30867
+'A ^u -30867
+'A :u -30867
+'A m -30867
+'A t -30867
+'A u0074_030C -30867
+'A u0074_0327 -30867
+'A i -30867
+'A 'i -30867
+'A h -30867
+'A b -30867
+'A k -30867
+'A v -30867
+'A w -30867
+'A C -30867
+'A G -30867
+'A 'C -30867
+'A u0043_030C -30867
+'A u0047_0306 -30867
+'A ,C -30867
+'A Q -30867
+'A O -30867
+'A u004F_030B -30867
+'A `O -30867
+'A 'O -30867
+'A ^O -30867
+'A ~O -30867
+'A :O -30867
+'A OE -30867
+'A /O -30867
+'A U -30867
+'A u0055_030B -30867
+'A u0055_030A -30867
+'A `U -30867
+'A 'U -30867
+'A ^U -30867
+'A :U -30867
+'A T -92602
+'A u0054_030C -92602
+'A u0054_0327 -92602
+'A Y -92602
+'A :Y -92602
+'A 'Y -92602
+'A V -123469
+'A W -123469
+'A e -61734
+'A u0065_030C -61734
+'A u0065_0328 -61734
+'A `e -61734
+'A 'e -61734
+'A ^e -61734
+'A :e -61734
+'A a -61734
+'A u0061_0306 -61734
+'A u0061_0328 -61734
+'A `a -61734
+'A 'a -61734
+'A ^a -61734
+'A ^a -61734
+'A ~a -61734
+'A :a -61734
+'A oa -61734
+'A ae -61734
+'A o -61734
+'A u006F_030B -61734
+'A `o -61734
+'A 'o -61734
+'A ^o -61734
+'A ~o -61734
+'A :o -61734
+'A oe -61734
+'A /o -61734
+'A d -61734
+'A u0111 -61734
+'A c -61734
+'A 'c -61734
+'A u0063_030C -61734
+'A ,c -61734
+'A g -61734
+'A u0067_0306 -61734
+'A q -61734
+^A y -30867
+^A :y -30867
+^A 'y -30867
+^A n -30867
+^A u006E_0301 -30867
+^A u006E_030C -30867
+^A u016A -30867
+^A ~n -30867
+^A l -30867
+^A u006C_0301 -30867
+^A u006C_030C -30867
+^A r -30867
+^A u -30867
+^A u0075_030B -30867
+^A u0075_030A -30867
+^A `u -30867
+^A 'u -30867
+^A ^u -30867
+^A :u -30867
+^A m -30867
+^A t -30867
+^A u0074_030C -30867
+^A u0074_0327 -30867
+^A i -30867
+^A 'i -30867
+^A h -30867
+^A b -30867
+^A k -30867
+^A v -30867
+^A w -30867
+^A C -30867
+^A G -30867
+^A 'C -30867
+^A u0043_030C -30867
+^A u0047_0306 -30867
+^A ,C -30867
+^A Q -30867
+^A O -30867
+^A u004F_030B -30867
+^A `O -30867
+^A 'O -30867
+^A ^O -30867
+^A ~O -30867
+^A :O -30867
+^A OE -30867
+^A /O -30867
+^A U -30867
+^A u0055_030B -30867
+^A u0055_030A -30867
+^A `U -30867
+^A 'U -30867
+^A ^U -30867
+^A :U -30867
+^A T -92602
+^A u0054_030C -92602
+^A u0054_0327 -92602
+^A Y -92602
+^A :Y -92602
+^A 'Y -92602
+^A V -123469
+^A W -123469
+^A e -61734
+^A u0065_030C -61734
+^A u0065_0328 -61734
+^A `e -61734
+^A 'e -61734
+^A ^e -61734
+^A :e -61734
+^A a -61734
+^A u0061_0306 -61734
+^A u0061_0328 -61734
+^A `a -61734
+^A 'a -61734
+^A ^a -61734
+^A ^a -61734
+^A ~a -61734
+^A :a -61734
+^A oa -61734
+^A ae -61734
+^A o -61734
+^A u006F_030B -61734
+^A `o -61734
+^A 'o -61734
+^A ^o -61734
+^A ~o -61734
+^A :o -61734
+^A oe -61734
+^A /o -61734
+^A d -61734
+^A u0111 -61734
+^A c -61734
+^A 'c -61734
+^A u0063_030C -61734
+^A ,c -61734
+^A g -61734
+^A u0067_0306 -61734
+^A q -61734
+~A y -30867
+~A :y -30867
+~A 'y -30867
+~A n -30867
+~A u006E_0301 -30867
+~A u006E_030C -30867
+~A u016A -30867
+~A ~n -30867
+~A l -30867
+~A u006C_0301 -30867
+~A u006C_030C -30867
+~A r -30867
+~A u -30867
+~A u0075_030B -30867
+~A u0075_030A -30867
+~A `u -30867
+~A 'u -30867
+~A ^u -30867
+~A :u -30867
+~A m -30867
+~A t -30867
+~A u0074_030C -30867
+~A u0074_0327 -30867
+~A i -30867
+~A 'i -30867
+~A h -30867
+~A b -30867
+~A k -30867
+~A v -30867
+~A w -30867
+~A C -30867
+~A G -30867
+~A 'C -30867
+~A u0043_030C -30867
+~A u0047_0306 -30867
+~A ,C -30867
+~A Q -30867
+~A O -30867
+~A u004F_030B -30867
+~A `O -30867
+~A 'O -30867
+~A ^O -30867
+~A ~O -30867
+~A :O -30867
+~A OE -30867
+~A /O -30867
+~A U -30867
+~A u0055_030B -30867
+~A u0055_030A -30867
+~A `U -30867
+~A 'U -30867
+~A ^U -30867
+~A :U -30867
+~A T -92602
+~A u0054_030C -92602
+~A u0054_0327 -92602
+~A Y -92602
+~A :Y -92602
+~A 'Y -92602
+~A V -123469
+~A W -123469
+~A e -61734
+~A u0065_030C -61734
+~A u0065_0328 -61734
+~A `e -61734
+~A 'e -61734
+~A ^e -61734
+~A :e -61734
+~A a -61734
+~A u0061_0306 -61734
+~A u0061_0328 -61734
+~A `a -61734
+~A 'a -61734
+~A ^a -61734
+~A ^a -61734
+~A ~a -61734
+~A :a -61734
+~A oa -61734
+~A ae -61734
+~A o -61734
+~A u006F_030B -61734
+~A `o -61734
+~A 'o -61734
+~A ^o -61734
+~A ~o -61734
+~A :o -61734
+~A oe -61734
+~A /o -61734
+~A d -61734
+~A u0111 -61734
+~A c -61734
+~A 'c -61734
+~A u0063_030C -61734
+~A ,c -61734
+~A g -61734
+~A u0067_0306 -61734
+~A q -61734
+:A y -30867
+:A :y -30867
+:A 'y -30867
+:A n -30867
+:A u006E_0301 -30867
+:A u006E_030C -30867
+:A u016A -30867
+:A ~n -30867
+:A l -30867
+:A u006C_0301 -30867
+:A u006C_030C -30867
+:A r -30867
+:A u -30867
+:A u0075_030B -30867
+:A u0075_030A -30867
+:A `u -30867
+:A 'u -30867
+:A ^u -30867
+:A :u -30867
+:A m -30867
+:A t -30867
+:A u0074_030C -30867
+:A u0074_0327 -30867
+:A i -30867
+:A 'i -30867
+:A h -30867
+:A b -30867
+:A k -30867
+:A v -30867
+:A w -30867
+:A C -30867
+:A G -30867
+:A 'C -30867
+:A u0043_030C -30867
+:A u0047_0306 -30867
+:A ,C -30867
+:A Q -30867
+:A O -30867
+:A u004F_030B -30867
+:A `O -30867
+:A 'O -30867
+:A ^O -30867
+:A ~O -30867
+:A :O -30867
+:A OE -30867
+:A /O -30867
+:A U -30867
+:A u0055_030B -30867
+:A u0055_030A -30867
+:A `U -30867
+:A 'U -30867
+:A ^U -30867
+:A :U -30867
+:A T -92602
+:A u0054_030C -92602
+:A u0054_0327 -92602
+:A Y -92602
+:A :Y -92602
+:A 'Y -92602
+:A V -123469
+:A W -123469
+:A e -61734
+:A u0065_030C -61734
+:A u0065_0328 -61734
+:A `e -61734
+:A 'e -61734
+:A ^e -61734
+:A :e -61734
+:A a -61734
+:A u0061_0306 -61734
+:A u0061_0328 -61734
+:A `a -61734
+:A 'a -61734
+:A ^a -61734
+:A ^a -61734
+:A ~a -61734
+:A :a -61734
+:A oa -61734
+:A ae -61734
+:A o -61734
+:A u006F_030B -61734
+:A `o -61734
+:A 'o -61734
+:A ^o -61734
+:A ~o -61734
+:A :o -61734
+:A oe -61734
+:A /o -61734
+:A d -61734
+:A u0111 -61734
+:A c -61734
+:A 'c -61734
+:A u0063_030C -61734
+:A ,c -61734
+:A g -61734
+:A u0067_0306 -61734
+:A q -61734
+oA y -30867
+oA :y -30867
+oA 'y -30867
+oA n -30867
+oA u006E_0301 -30867
+oA u006E_030C -30867
+oA u016A -30867
+oA ~n -30867
+oA l -30867
+oA u006C_0301 -30867
+oA u006C_030C -30867
+oA r -30867
+oA u -30867
+oA u0075_030B -30867
+oA u0075_030A -30867
+oA `u -30867
+oA 'u -30867
+oA ^u -30867
+oA :u -30867
+oA m -30867
+oA t -30867
+oA u0074_030C -30867
+oA u0074_0327 -30867
+oA i -30867
+oA 'i -30867
+oA h -30867
+oA b -30867
+oA k -30867
+oA v -30867
+oA w -30867
+oA C -30867
+oA G -30867
+oA 'C -30867
+oA u0043_030C -30867
+oA u0047_0306 -30867
+oA ,C -30867
+oA Q -30867
+oA O -30867
+oA u004F_030B -30867
+oA `O -30867
+oA 'O -30867
+oA ^O -30867
+oA ~O -30867
+oA :O -30867
+oA OE -30867
+oA /O -30867
+oA U -30867
+oA u0055_030B -30867
+oA u0055_030A -30867
+oA `U -30867
+oA 'U -30867
+oA ^U -30867
+oA :U -30867
+oA T -92602
+oA u0054_030C -92602
+oA u0054_0327 -92602
+oA Y -92602
+oA :Y -92602
+oA 'Y -92602
+oA V -123469
+oA W -123469
+oA e -61734
+oA u0065_030C -61734
+oA u0065_0328 -61734
+oA `e -61734
+oA 'e -61734
+oA ^e -61734
+oA :e -61734
+oA a -61734
+oA u0061_0306 -61734
+oA u0061_0328 -61734
+oA `a -61734
+oA 'a -61734
+oA ^a -61734
+oA ^a -61734
+oA ~a -61734
+oA :a -61734
+oA oa -61734
+oA ae -61734
+oA o -61734
+oA u006F_030B -61734
+oA `o -61734
+oA 'o -61734
+oA ^o -61734
+oA ~o -61734
+oA :o -61734
+oA oe -61734
+oA /o -61734
+oA d -61734
+oA u0111 -61734
+oA c -61734
+oA 'c -61734
+oA u0063_030C -61734
+oA ,c -61734
+oA g -61734
+oA u0067_0306 -61734
+oA q -61734
+u0189 X -30867
+u0110 X -30867
+-D X -30867
+u0189 W -30867
+u0110 W -30867
+-D W -30867
+u0189 A -30867
+u0110 A -30867
+-D A -30867
+u0189 u0041_0306 -30867
+u0110 u0041_0306 -30867
+-D u0041_0306 -30867
+u0189 u0041_0328 -30867
+u0110 u0041_0328 -30867
+-D u0041_0328 -30867
+u0189 `A -30867
+u0110 `A -30867
+-D `A -30867
+u0189 'A -30867
+u0110 'A -30867
+-D 'A -30867
+u0189 ^A -30867
+u0110 ^A -30867
+-D ^A -30867
+u0189 ~A -30867
+u0110 ~A -30867
+-D ~A -30867
+u0189 :A -30867
+u0110 :A -30867
+-D :A -30867
+u0189 oA -30867
+u0110 oA -30867
+-D oA -30867
+u0189 AE -30867
+u0110 AE -30867
+-D AE -30867
+u0189 V -30867
+u0110 V -30867
+-D V -30867
+u0189 Y -30867
+u0110 Y -30867
+-D Y -30867
+u0189 :Y -30867
+u0110 :Y -30867
+-D :Y -30867
+u0189 'Y -30867
+u0110 'Y -30867
+-D 'Y -30867
+`O X -30867
+`O W -30867
+`O A -30867
+`O u0041_0306 -30867
+`O u0041_0328 -30867
+`O `A -30867
+`O 'A -30867
+`O ^A -30867
+`O ~A -30867
+`O :A -30867
+`O oA -30867
+`O AE -30867
+`O V -30867
+`O Y -30867
+`O :Y -30867
+`O 'Y -30867
+'O X -30867
+'O W -30867
+'O A -30867
+'O u0041_0306 -30867
+'O u0041_0328 -30867
+'O `A -30867
+'O 'A -30867
+'O ^A -30867
+'O ~A -30867
+'O :A -30867
+'O oA -30867
+'O AE -30867
+'O V -30867
+'O Y -30867
+'O :Y -30867
+'O 'Y -30867
+^O X -30867
+^O W -30867
+^O A -30867
+^O u0041_0306 -30867
+^O u0041_0328 -30867
+^O `A -30867
+^O 'A -30867
+^O ^A -30867
+^O ~A -30867
+^O :A -30867
+^O oA -30867
+^O AE -30867
+^O V -30867
+^O Y -30867
+^O :Y -30867
+^O 'Y -30867
+~O X -30867
+~O W -30867
+~O A -30867
+~O u0041_0306 -30867
+~O u0041_0328 -30867
+~O `A -30867
+~O 'A -30867
+~O ^A -30867
+~O ~A -30867
+~O :A -30867
+~O oA -30867
+~O AE -30867
+~O V -30867
+~O Y -30867
+~O :Y -30867
+~O 'Y -30867
+:O X -30867
+:O W -30867
+:O A -30867
+:O u0041_0306 -30867
+:O u0041_0328 -30867
+:O `A -30867
+:O 'A -30867
+:O ^A -30867
+:O ~A -30867
+:O :A -30867
+:O oA -30867
+:O AE -30867
+:O V -30867
+:O Y -30867
+:O :Y -30867
+:O 'Y -30867
+/O X -30867
+/O W -30867
+/O A -30867
+/O u0041_0306 -30867
+/O u0041_0328 -30867
+/O `A -30867
+/O 'A -30867
+/O ^A -30867
+/O ~A -30867
+/O :A -30867
+/O oA -30867
+/O AE -30867
+/O V -30867
+/O Y -30867
+/O :Y -30867
+/O 'Y -30867
+'Y e -92602
+'Y o -92602
+'Y r -92602
+'Y a -92602
+'Y u -92602
+'Y A -92602
+'Y u0041_0306 -92602
+'Y u0041_0328 -92602
+'Y `A -92602
+'Y 'A -92602
+'Y ^A -92602
+'Y ~A -92602
+'Y :A -92602
+'Y oA -92602
+'Y AE -92602
+`e e -61734
+`e u0065_030C -61734
+`e u0065_0328 -61734
+`e `e -61734
+`e 'e -61734
+`e ^e -61734
+`e :e -61734
+`e a -61734
+`e u0061_0306 -61734
+`e u0061_0328 -61734
+`e `a -61734
+`e 'a -61734
+`e ^a -61734
+`e ^a -61734
+`e ~a -61734
+`e :a -61734
+`e oa -61734
+`e ae -61734
+`e o -61734
+`e u006F_030B -61734
+`e `o -61734
+`e 'o -61734
+`e ^o -61734
+`e ~o -61734
+`e :o -61734
+`e oe -61734
+`e /o -61734
+`e d -61734
+`e u0111 -61734
+`e c -61734
+`e 'c -61734
+`e u0063_030C -61734
+`e ,c -61734
+`e g -61734
+`e u0067_0306 -61734
+`e q -61734
+'e e -61734
+'e u0065_030C -61734
+'e u0065_0328 -61734
+'e `e -61734
+'e 'e -61734
+'e ^e -61734
+'e :e -61734
+'e a -61734
+'e u0061_0306 -61734
+'e u0061_0328 -61734
+'e `a -61734
+'e 'a -61734
+'e ^a -61734
+'e ^a -61734
+'e ~a -61734
+'e :a -61734
+'e oa -61734
+'e ae -61734
+'e o -61734
+'e u006F_030B -61734
+'e `o -61734
+'e 'o -61734
+'e ^o -61734
+'e ~o -61734
+'e :o -61734
+'e oe -61734
+'e /o -61734
+'e d -61734
+'e u0111 -61734
+'e c -61734
+'e 'c -61734
+'e u0063_030C -61734
+'e ,c -61734
+'e g -61734
+'e u0067_0306 -61734
+'e q -61734
+^e e -61734
+^e u0065_030C -61734
+^e u0065_0328 -61734
+^e `e -61734
+^e 'e -61734
+^e ^e -61734
+^e :e -61734
+^e a -61734
+^e u0061_0306 -61734
+^e u0061_0328 -61734
+^e `a -61734
+^e 'a -61734
+^e ^a -61734
+^e ^a -61734
+^e ~a -61734
+^e :a -61734
+^e oa -61734
+^e ae -61734
+^e o -61734
+^e u006F_030B -61734
+^e `o -61734
+^e 'o -61734
+^e ^o -61734
+^e ~o -61734
+^e :o -61734
+^e oe -61734
+^e /o -61734
+^e d -61734
+^e u0111 -61734
+^e c -61734
+^e 'c -61734
+^e u0063_030C -61734
+^e ,c -61734
+^e g -61734
+^e u0067_0306 -61734
+^e q -61734
+:e e -61734
+:e u0065_030C -61734
+:e u0065_0328 -61734
+:e `e -61734
+:e 'e -61734
+:e ^e -61734
+:e :e -61734
+:e a -61734
+:e u0061_0306 -61734
+:e u0061_0328 -61734
+:e `a -61734
+:e 'a -61734
+:e ^a -61734
+:e ^a -61734
+:e ~a -61734
+:e :a -61734
+:e oa -61734
+:e ae -61734
+:e o -61734
+:e u006F_030B -61734
+:e `o -61734
+:e 'o -61734
+:e ^o -61734
+:e ~o -61734
+:e :o -61734
+:e oe -61734
+:e /o -61734
+:e d -61734
+:e u0111 -61734
+:e c -61734
+:e 'c -61734
+:e u0063_030C -61734
+:e ,c -61734
+:e g -61734
+:e u0067_0306 -61734
+:e q -61734
+`o e -61734
+`o u0065_030C -61734
+`o u0065_0328 -61734
+`o `e -61734
+`o 'e -61734
+`o ^e -61734
+`o :e -61734
+`o a -61734
+`o u0061_0306 -61734
+`o u0061_0328 -61734
+`o `a -61734
+`o 'a -61734
+`o ^a -61734
+`o ^a -61734
+`o ~a -61734
+`o :a -61734
+`o oa -61734
+`o ae -61734
+`o o -61734
+`o u006F_030B -61734
+`o `o -61734
+`o 'o -61734
+`o ^o -61734
+`o ~o -61734
+`o :o -61734
+`o oe -61734
+`o /o -61734
+`o d -61734
+`o u0111 -61734
+`o c -61734
+`o 'c -61734
+`o u0063_030C -61734
+`o ,c -61734
+`o g -61734
+`o u0067_0306 -61734
+`o q -61734
+'o e -61734
+'o u0065_030C -61734
+'o u0065_0328 -61734
+'o `e -61734
+'o 'e -61734
+'o ^e -61734
+'o :e -61734
+'o a -61734
+'o u0061_0306 -61734
+'o u0061_0328 -61734
+'o `a -61734
+'o 'a -61734
+'o ^a -61734
+'o ^a -61734
+'o ~a -61734
+'o :a -61734
+'o oa -61734
+'o ae -61734
+'o o -61734
+'o u006F_030B -61734
+'o `o -61734
+'o 'o -61734
+'o ^o -61734
+'o ~o -61734
+'o :o -61734
+'o oe -61734
+'o /o -61734
+'o d -61734
+'o u0111 -61734
+'o c -61734
+'o 'c -61734
+'o u0063_030C -61734
+'o ,c -61734
+'o g -61734
+'o u0067_0306 -61734
+'o q -61734
+^o e -61734
+^o u0065_030C -61734
+^o u0065_0328 -61734
+^o `e -61734
+^o 'e -61734
+^o ^e -61734
+^o :e -61734
+^o a -61734
+^o u0061_0306 -61734
+^o u0061_0328 -61734
+^o `a -61734
+^o 'a -61734
+^o ^a -61734
+^o ^a -61734
+^o ~a -61734
+^o :a -61734
+^o oa -61734
+^o ae -61734
+^o o -61734
+^o u006F_030B -61734
+^o `o -61734
+^o 'o -61734
+^o ^o -61734
+^o ~o -61734
+^o :o -61734
+^o oe -61734
+^o /o -61734
+^o d -61734
+^o u0111 -61734
+^o c -61734
+^o 'c -61734
+^o u0063_030C -61734
+^o ,c -61734
+^o g -61734
+^o u0067_0306 -61734
+^o q -61734
+~o e -61734
+~o u0065_030C -61734
+~o u0065_0328 -61734
+~o `e -61734
+~o 'e -61734
+~o ^e -61734
+~o :e -61734
+~o a -61734
+~o u0061_0306 -61734
+~o u0061_0328 -61734
+~o `a -61734
+~o 'a -61734
+~o ^a -61734
+~o ^a -61734
+~o ~a -61734
+~o :a -61734
+~o oa -61734
+~o ae -61734
+~o o -61734
+~o u006F_030B -61734
+~o `o -61734
+~o 'o -61734
+~o ^o -61734
+~o ~o -61734
+~o :o -61734
+~o oe -61734
+~o /o -61734
+~o d -61734
+~o u0111 -61734
+~o c -61734
+~o 'c -61734
+~o u0063_030C -61734
+~o ,c -61734
+~o g -61734
+~o u0067_0306 -61734
+~o q -61734
+:o e -61734
+:o u0065_030C -61734
+:o u0065_0328 -61734
+:o `e -61734
+:o 'e -61734
+:o ^e -61734
+:o :e -61734
+:o a -61734
+:o u0061_0306 -61734
+:o u0061_0328 -61734
+:o `a -61734
+:o 'a -61734
+:o ^a -61734
+:o ^a -61734
+:o ~a -61734
+:o :a -61734
+:o oa -61734
+:o ae -61734
+:o o -61734
+:o u006F_030B -61734
+:o `o -61734
+:o 'o -61734
+:o ^o -61734
+:o ~o -61734
+:o :o -61734
+:o oe -61734
+:o /o -61734
+:o d -61734
+:o u0111 -61734
+:o c -61734
+:o 'c -61734
+:o u0063_030C -61734
+:o ,c -61734
+:o g -61734
+:o u0067_0306 -61734
+:o q -61734
+Tp e -61734
+Tp u0065_030C -61734
+Tp u0065_0328 -61734
+Tp `e -61734
+Tp 'e -61734
+Tp ^e -61734
+Tp :e -61734
+Tp a -61734
+Tp u0061_0306 -61734
+Tp u0061_0328 -61734
+Tp `a -61734
+Tp 'a -61734
+Tp ^a -61734
+Tp ^a -61734
+Tp ~a -61734
+Tp :a -61734
+Tp oa -61734
+Tp ae -61734
+Tp o -61734
+Tp u006F_030B -61734
+Tp `o -61734
+Tp 'o -61734
+Tp ^o -61734
+Tp ~o -61734
+Tp :o -61734
+Tp oe -61734
+Tp /o -61734
+Tp d -61734
+Tp u0111 -61734
+Tp c -61734
+Tp 'c -61734
+Tp u0063_030C -61734
+Tp ,c -61734
+Tp g -61734
+Tp u0067_0306 -61734
+Tp q -61734
+charset
+ga 619674,684320 2 0000
+aa 619674,684320,0,78478 2 0001
+a^ 555610,684320 2 0002
+a~ 619674,684320,0,109346 2 0003
+ad 619674,723632,0,118082 2 0004
+a" 619674,684320,0,109346 2 0005
+ao 980179,684320 2 0006
+ah 555610,684320 2 0007
+ab 619674,684320,0,97406 2 0010
+a- 619674,723632,0,133515 2 0011
+a. 372736,723632,0,135699 2 0012
+ac 557939,0,178360 1 0013
+ho 372736,0,203840 1 0014
+bq 372736,154336,203840 1 0015
+fo 557939,495040,0,62026 2 0016
+fc 557939,495040,0,62026 2 0017
+lq 465338,723632,0,175826 2 0020
+rq 465338,723632,0,83224 2 0021
+Bq 465338,154336,203840,83224 1 0022
+Fo 681408,495040,0,57808 2 0023
+Fc 681408,495040 2 0024
+en 619674,465920,0,102854 0 0025
+em 1239347,465920,0,102854 0 0026
+--- 0,465920 0 0027
+--- 496205,778232,58240,134826 3 0030
+.i 372736,465920,0,98814 0 0031
+.j 403603,465920,203840,48339 1 0032
+ff 792064,723632,203840,228301 3 0033
+fi 707034,723632,203840,113859 3 0034
+fl 737901,723632,203840,113859 3 0035
+Fi 1095203,723632,203840,113859 3 0036
+Fl 1110637,723632,203840,113859 3 0037
+u2423 619674,465920,101920,46446,0,23224 1 0040
+u01C3 404768,723632,0,119755 2 0041
+! "
+dq 619674,723632,0,88816 2 0042
+" "
+sh 990080,723632,203840,71637 3 0043
+# "
+Do 619674,778232,58240,138029 3 0044
+$ "
+% 990080,778232,58240,134826 3 0045
+& 928346,723632,0,89398 2 0046
+cq 372736,723632,0,135699 2 0047
+' "
+( 496205,778232,262080,165693 3 0050
+) 496205,778232,262080,34653 3 0051
+* 619674,778232,0,150259 2 0052
++ 928346,632486,108326,34653 3 0053
+, 372736,154336,203840 1 0054
+- 434470,465920,0,27373 0 0055
+. 372736,154336 0 0056
+sl 619674,778232,262080,165693 3 0057
+/ "
+0 619674,670592,0,138029 2 0060
+1 619674,670592,0,138029 2 0061
+2 619674,670592,0,138029 2 0062
+3 619674,670592,0,138029 2 0063
+4 619674,670592,203840,138029 3 0064
+5 619674,670592,0,138029 2 0065
+6 619674,670592,0,138029 2 0066
+7 619674,670592,0,138029 2 0067
+8 619674,670592,0,138029 2 0070
+9 619674,670592,0,138029 2 0071
+: 372736,465920,0,70251 0 0072
+; 372736,465920,203840,70251 1 0073
+< 928346,613858,89698,91730 3 0074
+= 928346,410018,-114142,71637 0 0075
+> 928346,613858,89698,3786 3 0076
+? 619674,723632,0,120266 2 0077
+at 928346,723632,0,96533 2 0100
+@ "
+A 907379,723632 2 0101
+B 856128,723632,0,103995,0,51998 2 0102
+C 866611,723632,0,148949,-84813,74475 2 0103
+D 917862,723632,0,95003,0,64136 2 0104
+E 793229,723632,0,119755,0,59915 2 0105
+F 762362,723632,0,135262,0,-19074 2 0106
+G 938538,723632,0,77022,-84813,77022 2 0107
+H 939411,723632,0,180398,0,90200 2 0110
+I 494458,723632,0,164382,0,82192 2 0111
+J 640058,723632,0,152006,0,45136 2 0112
+K 938246,723632,0,148949,0,74475 2 0113
+L 731494,723632,0,0,0,61734 2 0114
+M 1124614,723632,0,180398,0,59333 2 0115
+N 939411,723632,0,180398,0,59333 2 0116
+O 896314,723632,0,95003,-84813,64136 2 0117
+P 825261,723632,0,103995,0,-50341 2 0120
+Q 896314,723632,203840,95003,-84813,95003 3 0121
+R 900973,723632,0,26827,0,20120 2 0122
+S 681408,723632,0,118082,0,59042 2 0123
+T 834579,723632,0,135262,-134862,-19074 2 0124
+U 923395,723632,0,180398,-136064,59333 2 0125
+V 907379,723632,0,195250,-133515,-51688 2 0126
+W 1216051,723632,0,195250,-133515,40914 2 0127
+X 907379,723632,0,164382,0,82192 2 0130
+Y 907379,723632,0,207597,-148949,-39341 2 0131
+Z 743142,723632,0,148949,0,74475 2 0132
+lB 373326,778232,262080,196560 3 0133
+[ "
+rs 619674,778232,262080 3 0134
+\ "
+rB 373326,778232,262080,104549 3 0135
+] "
+ha 743142,723632,0,70251 2 0136
+^ "
+_ 928346,0,322658 1 0137
+oq 372736,723632,0,135699 2 0140
+` "
+a 619674,465920,0,98814,-34070,98814 0 0141
+b 557939,723632,0,82410,-34070,82410 2 0142
+c 557939,465920,0,54746,-34070,54746 0 0143
+d 619674,723632,0,113859,-34070,113859 2 0144
+e 557939,465920,0,89107,-34070,89107 0 0145
+f 419328,723632,203840,228301,112694,116480 3 0146
+g 557939,465920,203840,110074,-35818,71246 1 0147
+h 619674,723632,0,98814,0,98814 2 0150
+i 372736,723632,0,119371,-17666,119371 2 0151
+j 372736,723632,203840,175282,50960,110074 3 0152
+k 557939,723632,0,116480,0,98814 2 0153
+l 311002,723632,0,113859,-30867,129682 2 0154
+m 990080,465920,0,98814,-17666,98814 0 0155
+n 681408,465920,0,98814,-17666,98814 0 0156
+o 619674,465920,0,82410,-34070,82410 0 0157
+p 619674,465920,203840,82410,-17181,82410 1 0160
+q 557939,465920,203840,110074,-34070,71246 1 0161
+r 525907,465920,0,116480,-17666,85613 0 0162
+s 510474,465920,0,85613,0,85613 0 0163
+t 403603,670592,0,101046,-39312,101046 2 0164
+u 650541,465920,0,98814,-17666,98814 0 0165
+v 557939,465920,0,116480,-17666,77653 0 0166
+w 804877,465920,0,116480,-17666,87360 0 0167
+x 587642,465920,0,131914,0,131914 0 0170
+y 588806,465920,203840,110074,-17666,71246 1 0171
+z 514259,465920,0,145600,0,98814 0 0172
+lC 619674,778232,262080,153754 3 0173
+{ "
+u01C0 372736,778232,262080,104549 3 0174
+ba "
+| "
+rC 619674,778232,262080,22714 3 0175
+} "
+~ 743142,723632,0,120266 2 0176
+hy 249267,465920,0,27373 0 0177
+u0041_0306 907379,937664 2 0200
+u0041_0328 907379,723632,203840 3 0201
+'C 866611,916128,0,148949 2 0202
+u0043_030C 866611,937664,0,148949,-84813,74475 2 0203
+u0044_030C 917862,937664,0,95003,0,64136 2 0204
+u0045_030C 793229,937664,0,119755,0,59915 2 0205
+u0045_0328 793229,723632,203840,119755 3 0206
+u0047_0306 938538,937664,0,77022,-84813,77022 2 0207
+u004C_0301 731494,916128,0,0,0,61734 2 0210
+u004C_030C 731494,937664,0,0,0,61734 2 0211
+/L 731494,723632 2 0212
+u004E_0301 939411,916128,0,180398 2 0213
+u004E_030C 939411,937664,0,180398,0,59333 2 0214
+u014A 948730,723632,0,179816,0,59042 2 0215
+u004F_030B 896314,916128,0,95003,-84813,64136 2 0216
+u0052_0301 900973,916128,0,26827,0,20120 2 0217
+u0052_030C 900973,937664,0,26827,0,20120 2 0220
+u0053_0301 681408,916128,0,118082 2 0221
+vS 681408,937664,0,118082,0,59042 2 0222
+u0053_0327 681408,723632,178360,118082,0,59042 3 0223
+u0054_030C 834579,937664,0,135262,-134862,-19074 2 0224
+u0054_0327 834579,723632,178360,135262,-134862,-19074 3 0225
+u0055_030B 923395,916128,0,180398,-136064,59333 2 0226
+u0055_030A 923395,937664,0,180398,-136064,59333 2 0227
+:Y 907379,937664,0,207597,-148949,-39341 2 0230
+u005A_0301 743142,916128,0,148949 2 0231
+vZ 743142,937664,0,148949,0,74475 2 0232
+u005A_0307 743142,916128,0,148949 2 0233
+IJ 1050067,723632,0,152006,0,45136 2 0234
+u0049_0307 494458,916128,0,164382,0,82192 2 0235
+u0111 619674,723632,0,113859,-34070,113859 2 0236
+sc 575994,723632,203840 3 0237
+u0061_0306 619674,684320,0,98814,-34070,98814 2 0240
+u0061_0328 619674,465920,203840,98814 1 0241
+'c 557939,684320,0,54746 2 0242
+u0063_030C 557939,684320,0,54746,-34070,54746 2 0243
+u0064_030C 619674,723632,0,113859,-34070,113859 2 0244
+u0065_030C 557939,684320,0,89107,-34070,89107 2 0245
+u0065_0328 557939,465920,203840,89107 1 0246
+u0067_0306 557939,684320,203840,110074,-35818,71246 3 0247
+u006C_0301 311002,916128,0,113859,-30867,129682 2 0250
+u006C_030C 311002,723632,0,113859,-30867,129682 2 0251
+/l 372736,723632,0,113859 2 0252
+u006E_0301 681408,684320,0,98814 2 0253
+u006E_030C 681408,684320,0,98814,-17666,98814 2 0254
+u016A 681408,465920,203840,98814,-17666,98814 1 0255
+u006F_030B 619674,684320,0,82410,-34070,82410 2 0256
+u0072_0301 525907,684320,0,116480,-17666,85613 2 0257
+u0072_030C 525907,684320,0,116480,-17666,85613 2 0260
+u0073_0301 510474,684320,0,85613 2 0261
+vs 510474,684320,0,140213,0,140213 2 0262
+u0073_0327 510474,465920,178360,85613,0,85613 1 0263
+u0074_030C 403603,723632,0,101046,-39312,101046 2 0264
+u0074_0327 403603,670592,178360,101046,-39312,101046 3 0265
+u0075_030B 650541,684320,0,231067,-17666,231067 2 0266
+u0075_030A 650541,684320,0,98814,-17666,98814 2 0267
+:y 588806,684320,203840,110074,-17666,71246 3 0270
+u007A_0301 514259,684320,0,145600,0,98814 2 0271
+vz 514259,684320,0,145600,0,98814 2 0272
+u007A_0307 514259,723632,0,145600,0,98814 2 0273
+ij 681408,723632,203840,119371,50960,110074 3 0274
+r! 404768,524160,203840,68723 3 0275
+r? 619674,524160,203840 3 0276
+Po 910510,723632 2 0277
+`A 907379,916128 2 0300
+'A 907379,916128 2 0301
+^A 907379,937664 2 0302
+~A 907379,937664 2 0303
+:A 907379,937664 2 0304
+oA 907379,893984 2 0305
+AE 1072198,723632,0,119755 2 0306
+,C 866611,723632,178360,148949,-84813,74475 3 0307
+`E 793229,916128,0,119755,0,59915 2 0310
+'E 793229,916128,0,119755,0,59915 2 0311
+^E 793229,937664,0,119755,0,59915 2 0312
+:E 793229,937664,0,119755 2 0313
+`I 494458,916128,0,164382,0,82192 2 0314
+'I 494458,916128,0,164382,0,82192 2 0315
+^I 494458,937664,0,164382,0,82192 2 0316
+:I 494458,937664,0,164382,0,82192 2 0317
+u0189 917862,723632,0,95003,0,64136 2 0320
+u0110 "
+-D "
+~N 939411,937664,0,180398,0,59333 2 0321
+`O 896314,916128,0,95003,-84813,64136 2 0322
+'O 896314,916128,0,95003 2 0323
+^O 896314,937664,0,95003,-84813,64136 2 0324
+~O 896314,937664,0,95003,-84813,64136 2 0325
+:O 896314,937664,0,95003,-84813,64136 2 0326
+OE 1195667,723632,0,119755 2 0327
+/O 928346,778232,50960,95003 3 0330
+`U 923395,916128,0,180398,-136064,59333 2 0331
+'U 923395,916128,0,180398 2 0332
+^U 923395,937664,0,180398,-136064,59333 2 0333
+:U 923395,937664,0,180398,-136064,59333 2 0334
+'Y 907379,916128,0,207597,-148949,-39341 2 0335
+TP 763526,723632,0,103995,0,51998 2 0336
+--- 1298752,723632,0,118082,0,59042 2 0337
+`a 619674,684320,0,98814,-34070,98814 2 0340
+'a 619674,684320,0,98814,-34070,98814 2 0341
+^a 619674,684320,0,98814,-34070,98814 2 0342
+~a 619674,684320,0,98814,-34070,98814 2 0343
+:a 619674,684320,0,98814,-34070,98814 2 0344
+oa 619674,684320,0,98814,-34070,98814 2 0345
+ae 866611,465920,0,89107 0 0346
+,c 557939,465920,178360,54746,-34070,54746 1 0347
+`e 557939,684320,0,89107,-34070,89107 2 0350
+'e 557939,684320,0,89107,-34070,89107 2 0351
+^e 557939,684320,0,89107,-34070,89107 2 0352
+:e 557939,684320,0,89107,-34070,89107 2 0353
+`i 372736,684320,0,98814 2 0354
+'i 372736,684320,0,98814 2 0355
+^i 372736,684320,0,98814 2 0356
+:i 372736,684320,0,98814 2 0357
+Sd 619674,723632,0,116480 2 0360
+~n 681408,684320,0,98814,-17666,98814 2 0361
+`o 619674,684320,0,82410,-34070,82410 2 0362
+'o 619674,684320,0,82410,-34070,82410 2 0363
+^o 619674,684320,0,82410,-34070,82410 2 0364
+~o 619674,684320,0,82410,-34070,82410 2 0365
+:o 619674,684320,0,82410,-34070,82410 2 0366
+oe 866611,465920,0,89107 0 0367
+/o 619674,567840,101920,99154 3 0370
+`u 650541,684320,0,98814,-17666,98814 2 0371
+'u 650541,684320,0,98814,-17666,98814 2 0372
+^u 650541,684320,0,98814,-17666,98814 2 0373
+:u 650541,684320,0,98814,-17666,98814 2 0374
+'y 588806,684320,203840,110074,-17666,71246 3 0375
+Tp 619674,723632,203840,82410 3 0376
+ss 697133,723632,203840,102064 3 0377
diff --git a/font/devdvi/TBITC b/font/devdvi/TBITC
new file mode 100644
index 0000000..a451d4e
--- /dev/null
+++ b/font/devdvi/TBITC
@@ -0,0 +1,138 @@
+name TBITC
+special
+internalname tcbi1000
+spacewidth 434470
+slant 14.036243
+checksum 487057398
+designsize 10485760
+charset
+--- 619674,662664 2 0000
+--- 619674,662664,0,73064 2 0001
+--- 619674,679952,0,64866 2 0002
+--- 619674,679952,0,109346 2 0003
+--- 619674,679952 2 0004
+--- 619674,662664,0,103931 2 0005
+--- 923395,679952 2 0006
+--- 619674,679952 2 0007
+--- 619674,679952,0,97406 2 0010
+--- 619674,679952,0,124779 2 0011
+--- 372736,662664 2 0012
+--- 557939,0,178360 1 0013
+--- 372736,0,203840 1 0014
+--- 496205,154336,203840 1 0015
+--- 619674,154336,203840 1 0022
+--- 868941,472035,0,102854 2 0025
+--- 961542,472035,0,102854 2 0026
+--- 0,723632 2 0027
+<- 1175283,410018,-114142 0 0030
+-> 1175283,410018,-114142 0 0031
+--- 372736,723632,0,516589 2 0032
+--- 453690,981344,0,575605 2 0033
+--- 619674,723632,0,516589 2 0034
+--- 619674,723632,0,575605 2 0035
+--- 0,723632 2 0037
+u2422 557939,723632,0,82410,-34070,82410 2 0040
+Do 619674,786240,58240,138029 3 0044
+$ "
+aq 372736,723632,0,119683 2 0047
+--- 619674,495040,-29120 2 0052
+, 372736,154336,203840 1 0054
+--- 434470,410018,-114142,71637 0 0055
+. 372736,154336 0 0056
+f/ 619674,786240,262080,165693 3 0057
+0 619674,472035,0,69189 2 0060
+1 619674,472035 2 0061
+2 619674,472035,0,68491 2 0062
+3 619674,472035,203840,68491 3 0063
+4 619674,472035,203840,17472 3 0064
+5 619674,472035,203840,54746 3 0065
+6 619674,679952,0,107162 2 0066
+7 619674,472035,203840,116480 3 0067
+8 619674,679952,0,107162 2 0070
+9 619674,472035,203840,54746 3 0071
+la 496205,786240,262080 3 0074
+\- 928346,634378,108326,34653 3 0075
+ra 496205,786240,262080 3 0076
+u2127 866611,723632,0,158208,0,79104 2 0115
+ci 1298752,786240,262080 3 0117
+u03A9 866611,723632,0,103995,0,51998 2 0127
+u301A 511638,786240,262080 3 0133
+u301B 511638,786240,262080 3 0135
+ua 619674,723632,203840,95514 3 0136
+da 619674,723632,203840 3 0137
+--- 619674,723632 2 0140
+--- 619674,495040,-29120 2 0142
+--- 619674,495040,-29120 2 0143
+--- 619674,634378,26210 3 0144
+--- 1175283,723632 2 0154
+--- 619674,495040,-29120 2 0155
+u266A 679078,723632 2 0156
+ti 743142,133120 0 0176
+~ "
+--- 249267,410018,-114142,71637 0 0177
+--- 743142,723632,0,108326 2 0200
+--- 743142,723632,0,103085 2 0201
+--- 619674,723632,0,120266 2 0202
+--- 619674,723632 2 0203
+dg 557939,723632,203840 3 0204
+dd 557939,723632,203840 3 0205
+u2016 619674,786240,262080 3 0206
+%0 1360486,786240,58240,134826 3 0207
+bu 619674,472035,-46010 2 0210
+u2103 1113549,723632,0,148949,-84813,74475 2 0211
+--- 743142,786240,58240,138029 3 0212
+--- 619674,567840,101920,104133 3 0213
+Fn 419328,723632,203840,228301,112694,116480 3 0214
+u20A1 866611,786240,58240,148949,-84813,74475 3 0215
+u20A9 1216051,723632,0,195250,-133515,40914 2 0216
+u20A6 970278,723632,0,180398,0,59333 2 0217
+--- 938538,786240,58240,77022,-84813,77022 3 0220
+u20B1 840694,723632,0,103995,0,-50341 2 0221
+u20A4 910510,723632 2 0222
+u211E 900973,723632,0,26827,0,20120 2 0223
+u203D 683738,723632,0,120266 2 0224
+--- 619674,524160,203840 3 0225
+u20AB 619674,786240,0,128419,-34070,128419 2 0226
+tm 804877,786240,0,550366 2 0227
+u2031 1811264,786240,58240,134826 3 0230
+--- 588806,723632,203840 3 0231
+u0E3F 856128,786240,58240,103995,0,51998 3 0232
+u2116 1140048,723632,0,180398,0,59333 2 0233
+u2052 619674,786240,0,165693 2 0234
+u212E 834288,723632,0,136659 2 0235
+u25E6 619674,472035,-46010 2 0236
+u2120 804877,786240,0,550366 2 0237
+u2045 465338,786240,262080,22714 3 0240
+u2046 465338,786240,262080,153754 3 0241
+ct 619674,567840,101920,104133 3 0242
+Po 910510,723632 2 0243
+Cs 864454,599043,0,116480 2 0244
+Ye 907379,723632,0,207597 2 0245
+bb 249267,786240,262080,134826 3 0246
+sc 575994,723632,203840 3 0247
+--- 619674,723632,0,120266 2 0250
+co 1298752,786240,262080 3 0251
+Of 557939,786240,0,137592 2 0252
+--- 1298752,786240,262080 3 0253
+tno 804877,472035,0,85613 2 0254
+u2117 1298752,786240,262080 3 0255
+rg 1298752,786240,262080 3 0256
+--- 928346,723632 2 0257
+de 434470,723632 2 0260
+t+- 928346,634378,108326,34653 3 0261
+S2 557939,786240,0,165693 2 0262
+S3 557939,786240,0,165693 2 0263
+--- 619674,723632,0,89398 2 0264
+mc 619674,472035,203840,98814,44554,98814 3 0265
+ps 743142,723632,203840 3 0266
+pc 321485,472035 2 0267
+u203B 740811,553278,0,27373 2 0270
+S1 557939,786240,0,165693 2 0271
+Om 557939,786240,0,137592 2 0272
+sr 556774,786240,199165,196560 3 0273
+--- 557939,786240,203840,165693 3 0274
+--- 557939,786240,203840,165693 3 0275
+--- 557939,786240,203840,165693 3 0276
+Eu 928346,723632,0,119829 2 0277
+tmu 928346,634378,108326,34653 3 0326
+tdi 928346,634378,108326,34653 3 0366
diff --git a/font/devdvi/TBTC b/font/devdvi/TBTC
new file mode 100644
index 0000000..0b92505
--- /dev/null
+++ b/font/devdvi/TBTC
@@ -0,0 +1,137 @@
+name TBTC
+special
+internalname tcbx1000
+spacewidth 401856
+checksum -1650382063
+designsize 10485760
+charset
+--- 602784,664624 2 0000
+--- 602784,664624 2 0001
+--- 602784,679952 2 0002
+--- 602784,679952 2 0003
+--- 602784,679952 2 0004
+--- 602784,664624,0,11531 2 0005
+--- 927472,679952 2 0006
+--- 602784,679952 2 0007
+--- 602784,679952 2 0010
+--- 602784,679952 2 0011
+--- 334880,664624 2 0012
+--- 535808,0,178360 1 0013
+--- 334880,0,203840 1 0014
+--- 468832,163072,203840 1 0015
+--- 602784,163072,203840 1 0022
+--- 803712,465920,0,33488 0 0025
+--- 904176,465920,0,33488 0 0026
+--- 0,723632 2 0027
+<- 1205568,410018,-114142 0 0030
+-> 1205568,410018,-114142 0 0031
+--- 334880,723632,0,326144 2 0032
+--- 416416,981344,0,359632 2 0033
+--- 602784,723632,0,326144 2 0034
+--- 602784,723632,0,359632 2 0035
+--- 0,723632 2 0037
+u2422 669760,723632 2 0040
+Do 602784,786240,58240 3 0044
+$ "
+aq 334880,723632 2 0047
+--- 602784,495768,-29120 2 0052
+, 334880,163072,203840 1 0054
+--- 401856,410018,-114142 0 0055
+. 334880,163072 0 0056
+f/ 602784,786240,262080 3 0057
+0 602784,465920 0 0060
+1 602784,465920 0 0061
+2 602784,465920 0 0062
+3 602784,465920,203840 1 0063
+4 602784,465920,203840 1 0064
+5 602784,465920,203840 1 0065
+6 602784,679952 2 0066
+7 602784,465920,203840 1 0067
+8 602784,679952 2 0070
+9 602784,465920,203840 1 0071
+la 468832,786240,262080 3 0074
+\- 937664,664624,139776 3 0075
+ra 468832,786240,262080 3 0076
+u2127 870688,723632 2 0115
+ci 1339520,786240,262080 3 0117
+u03A9 870688,723632 2 0127
+u301A 485576,786240,262080 3 0133
+u301B 485576,786240,262080 3 0135
+ua 602784,723632,203840 3 0136
+da 602784,723632,203840 3 0137
+--- 602784,723632 2 0140
+--- 602784,495768,-29120 2 0142
+--- 602784,495768,-29120 2 0143
+--- 602784,636270,26210 3 0144
+--- 1205568,723632 2 0154
+--- 602784,495768,-29120 2 0155
+u266A 736736,723632 2 0156
+ti 736736,133120 0 0176
+~ "
+--- 200928,410018,-114142 0 0177
+--- 736736,723632 2 0200
+--- 736736,723632 2 0201
+--- 602784,723632 2 0202
+--- 602784,723632 2 0203
+dg 535808,723632,203840 3 0204
+dd 535808,723632,203840 3 0205
+u2016 602784,786240,262080 3 0206
+%0 1406496,786240,58240 3 0207
+bu 602784,495768,-27664 2 0210
+u2103 1138592,723632,0,0,-33488 2 0211
+--- 736736,786240,58240 3 0212
+--- 602784,567840,101920 3 0213
+Fn 368368,723632,0,114296 2 0214
+u20A1 870688,786240,58240,0,-33488 3 0215
+u20A9 1246336,723632,0,16744,50232,-150696 2 0216
+u20A6 976976,723632 2 0217
+--- 947856,786240,58240,0,-33488 3 0220
+u20B1 840840,723632,0,0,0,-167440 2 0221
+u20A4 770224,723632 2 0222
+u211E 904176,723632 2 0223
+u203D 569296,723632 2 0224
+--- 569296,524160,203840 3 0225
+u20AB 669760,786240 2 0226
+tm 803712,786240,0,550366 2 0227
+u2031 1889888,786240,58240 3 0230
+--- 569296,723632,203840 3 0231
+u0E3F 857584,786240,58240 3 0232
+u2116 1157520,723632 2 0233
+u2052 602784,786240 2 0234
+u212E 833560,723632 2 0235
+u25E6 602784,495768,-27664 2 0236
+u2120 803712,786240,0,550366 2 0237
+u2045 435344,786240,262080 3 0240
+u2046 435344,786240,262080 3 0241
+ct 602784,567840,101920 3 0242
+Po 770224,723632 2 0243
+Cs 810874,599043 2 0244
+Ye 911456,723632,0,30139 2 0245
+bb 200928,786240,262080 3 0246
+sc 554736,723632,203840 3 0247
+--- 602784,723632 2 0250
+co 1339520,786240,262080 3 0251
+Of 535808,786240 2 0252
+--- 1339520,786240,262080 3 0253
+tno 803712,465920 0 0254
+u2117 1339520,786240,262080 3 0255
+rg 1339520,786240,262080 3 0256
+--- 937664,723632 2 0257
+de 401856,723632 2 0260
+t+- 937664,664624,139776 3 0261
+S2 535808,786240 2 0262
+S3 535808,786240 2 0263
+--- 602784,723632 2 0264
+mc 669760,465920,203840 1 0265
+ps 736736,723632,203840 3 0266
+pc 288288,465920 0 0267
+u203B 687230,553278 2 0270
+S1 535808,786240 2 0271
+Om 535808,786240 2 0272
+sr 569296,786240,199165 3 0273
+--- 535808,786240,203840 3 0274
+--- 535808,786240,203840 3 0275
+--- 535808,786240,203840 3 0276
+Eu 937664,723632 2 0277
+tmu 937664,664624,139776 3 0326
+tdi 937664,664624,139776 3 0366
diff --git a/font/devdvi/TI b/font/devdvi/TI
new file mode 100644
index 0000000..31a0edc
--- /dev/null
+++ b/font/devdvi/TI
@@ -0,0 +1,355 @@
+#
+# manually added kerning for `` and ''
+#
+name TI
+special
+internalname cmti10
+spacewidth 375155
+slant 14.036243
+ligatures ff fi fl ffi ffl 0
+checksum -50321606
+designsize 10485760
+kernpairs
+ff cq 109373
+ff ' 109373
+ff ? 109373
+ff ! 109373
+ff ) 109373
+ff rB 109373
+ff ] 109373
+' ' -80390
+cq ' -80390
+' cq -80390
+cq cq -80390
+slash@for@l l -267968
+slash@for@l L -336125
+cq ? 107187
+' ? 107187
+cq ! 107187
+' ! 107187
+A n -26797
+A l -26797
+A r -26797
+A u -26797
+A m -26797
+A t -26797
+A i -26797
+A C -26797
+A O -26797
+A G -26797
+A h -26797
+A b -26797
+A U -26797
+A k -26797
+A v -26797
+A w -26797
+A Q -26797
+A T -80390
+A Y -80390
+A V -107187
+A W -107187
+A e -53594
+A a -53594
+A o -53594
+A d -53594
+A c -53594
+A g -53594
+A q -53594
+D X -26797
+D W -26797
+D A -26797
+D V -26797
+D Y -26797
+F o -80390
+F e -80390
+F u -80390
+F r -80390
+F a -80390
+F A -107187
+F O -26797
+F C -26797
+F G -26797
+F Q -26797
+K O -26797
+K C -26797
+K G -26797
+K Q -26797
+L T -80390
+L Y -80390
+L V -107187
+L W -107187
+L e -53594
+L a -53594
+L o -53594
+L d -53594
+L c -53594
+L g -53594
+L q -53594
+O X -26797
+O W -26797
+O A -26797
+O V -26797
+O Y -26797
+P A -80390
+R n -26797
+R l -26797
+R r -26797
+R u -26797
+R m -26797
+R t -26797
+R i -26797
+R C -26797
+R O -26797
+R G -26797
+R h -26797
+R b -26797
+R U -26797
+R k -26797
+R v -26797
+R w -26797
+R Q -26797
+R T -80390
+R Y -80390
+R V -107187
+R W -107187
+R e -53594
+R a -53594
+R o -53594
+R d -53594
+R c -53594
+R g -53594
+R q -53594
+T y -80390
+T e -80390
+T o -80390
+T r -80390
+T a -80390
+T u -80390
+T A -80390
+V o -80390
+V e -80390
+V u -80390
+V r -80390
+V a -80390
+V A -107187
+V O -26797
+V C -26797
+V G -26797
+V Q -26797
+W A -80390
+X O -26797
+X C -26797
+X G -26797
+X Q -26797
+Y e -80390
+Y o -80390
+Y r -80390
+Y a -80390
+Y u -80390
+Y A -80390
+oq oq -80390
+oq ` -80390
+` oq -80390
+` ` -80390
+b e -53594
+b a -53594
+b o -53594
+b d -53594
+b c -53594
+b g -53594
+b q -53594
+c e -53594
+c a -53594
+c o -53594
+c d -53594
+c c -53594
+c g -53594
+c q -53594
+d l 53594
+e e -53594
+e a -53594
+e o -53594
+e d -53594
+e c -53594
+e g -53594
+e q -53594
+Fn cq 109373
+Fn ' 109373
+f cq 109373
+f ' 109373
+Fn ? 109373
+f ? 109373
+Fn ! 109373
+f ! 109373
+Fn ) 109373
+f ) 109373
+Fn rB 109373
+Fn ] 109373
+f rB 109373
+f ] 109373
+l l 53594
+n cq -107187
+n ' -107187
+o e -53594
+o a -53594
+o o -53594
+o d -53594
+o c -53594
+o g -53594
+o q -53594
+p e -53594
+p a -53594
+p o -53594
+p d -53594
+p c -53594
+p g -53594
+p q -53594
+r e -53594
+r a -53594
+r o -53594
+r d -53594
+r c -53594
+r g -53594
+r q -53594
+w l 53594
+charset
+*G 657686,716526,0,139518,0,5534 2 0000
+*D 857498,716526 2 0001
+*H 803904,716526,0,98595,-80538,71798 2 0002
+*L 725843,716526 2 0003
+*C 696717,716526,0,160373,0,80187 2 0004
+*P 779437,716526,0,171851,0,85926 2 0005
+*S 750310,716526,0,126120,0,63061 2 0006
+*U 803904,716526,0,116509,-170102,-17475 2 0007
+*F 750310,716526,0,62770,-116363,62770 2 0010
+*Q 803904,716526,0,116509,-170102,4659 2 0011
+*W 750310,716526,0,107552,0,53776 2 0012
+ff 643123,728178,203890,222240 3 0013
+fi 589530,728178,203890,108354 3 0014
+fl 616326,728178,203890,108354 3 0015
+Fi 924490,728178,203890,108354 3 0016
+Fl 937888,728178,203890,108354 3 0017
+.i 321562,451470,0,80440 0 0020
+.j 348358,451470,203890,39176 1 0021
+ga 535936,728178 2 0022
+aa 535936,728178,0,101654 2 0023
+ah 535936,659002,0,86982 2 0024
+ab 535936,728178,0,113306 2 0025
+a- 535936,588949,0,108354 2 0026
+ao 871672,728178 2 0027
+ac 482342,0,178403 1 0030
+ss 562733,728178,203890,110245 3 0031
+ae 750310,451470,0,78789 0 0032
+oe 750310,451470,0,78789 0 0033
+/o 535936,553416,101946,96411 3 0034
+AE 925654,716526,0,126120 2 0035
+OE 1032842,716526,0,126120 2 0036
+/O 803904,767499,50973,98595 3 0037
+slash@for@l 267968,451470 0 0040
+! 321562,728178,0,130200 2 0041
+rq 539432,728178,0,72994 2 0042
+sh 857498,728178,203888,69378 3 0043
+# "
+Po 806453,728178 2 0044
+% 857498,786432,58254,143014 3 0045
+& 803904,728178,0,101654 2 0046
+cq 321562,728178,0,130200 2 0047
+' "
+( 428749,786432,262144,169811 3 0050
+) 428749,786432,262144,38739 3 0051
+* 535936,786432,0,156413 2 0052
++ 803904,588949,59418,38739 3 0053
+, 321562,110683,203890 1 0054
+hy 375155,451470,0,29637 0 0055
+- "
+. 321562,110683 0 0056
+sl 535936,786432,262144,169811 3 0057
+/ "
+0 535936,675749,0,142141 2 0060
+1 535936,675749,0,142141 2 0061
+2 535936,675749,0,142141 2 0062
+3 535936,675749,0,142141 2 0063
+4 535936,675749,203890,142141 3 0064
+5 535936,675749,0,142141 2 0065
+6 535936,675749,0,142141 2 0066
+7 535936,675749,203890,142141 3 0067
+8 535936,675749,0,142141 2 0070
+9 535936,675749,0,142141 2 0071
+: 321562,451470,0,61022 0 0072
+; 321562,451470,203890,61022 1 0073
+r! 321562,524288,203890,79227 3 0074
+= 803904,384696,-139592,69378 0 0075
+r? 535936,524288,203890 3 0076
+? 535936,728178,0,128451 2 0077
+at 803904,728178,0,100634 2 0100
+@ "
+A 779437,716526 2 0101
+B 738077,716526,0,107552,0,53776 2 0102
+C 750310,716526,0,152334,-80538,76168 2 0103
+D 791670,716526,0,98595,0,71798 2 0104
+E 711280,716526,0,126120,0,63061 2 0105
+F 684483,716526,0,139518,0,5534 2 0106
+G 811186,716526,0,91459,-80538,91459 2 0107
+H 779437,716526,0,171851,0,85926 2 0110
+I 404282,716526,0,165733,0,82867 2 0111
+J 550499,716526,0,147093,0,46750 2 0112
+K 806234,716526,0,152334,0,76168 2 0113
+L 657686,716526,0,0,0,53594 2 0114
+M 940218,716526,0,171851,0,59130 2 0115
+N 779437,716526,0,171851,0,59130 2 0116
+O 803904,716526,0,98595,-80538,71798 2 0117
+P 711280,716526,0,107552,0,-26432 2 0120
+Q 803904,716526,203890,98595,-80538,98595 3 0121
+R 764874,716526,0,40560,0,30421 2 0122
+S 589530,716526,0,125538,0,62770 2 0123
+T 750310,716526,0,139518,-134349,5534 2 0124
+U 779437,716526,0,171851,-121898,59130 2 0125
+V 779437,716526,0,192530,-138936,-21845 2 0126
+W 1047405,716526,0,192530,-138936,58546 2 0127
+X 779437,716526,0,165733,0,82867 2 0130
+Y 779437,716526,0,203248,-152334,-11126 2 0131
+Z 643123,716526,0,152334,0,76168 2 0132
+lB 321562,786432,262144,196608 3 0133
+[ "
+lq 539432,728178,0,176685 2 0134
+rB 321562,786432,262144,110392 3 0135
+] "
+ha 535936,728178,0,69688 2 0136
+^ "
+a^ "
+a. 321562,700301,0,123230 2 0137
+oq 321562,728178,0,130200 2 0140
+` "
+a 535936,451470,0,80440,-46677,80440 0 0141
+b 482342,728178,0,66190,-46677,66190 2 0142
+c 482342,451470,0,59274,-46677,59274 0 0143
+d 535936,728178,0,108354,-46677,108354 2 0144
+e 482342,451470,0,78789,-46677,78789 0 0145
+Fn 321562,728178,203890,222240,104566,112867 3 0146
+f "
+g 482342,451470,203890,92770,-21045,55147 1 0147
+h 535936,728178,0,80440,0,80440 2 0150
+i 321562,687194,0,106846,-32427,106846 2 0151
+j 321562,687194,203890,151701,50973,92770 3 0152
+k 482342,728178,0,112867,0,80440 2 0153
+l 267968,728178,0,108354,-26797,107237 2 0154
+m 857498,451470,0,80440,-32427,80440 0 0155
+n 589530,451470,0,80440,-32427,80440 0 0156
+o 535936,451470,0,66190,-46677,66190 0 0157
+p 535936,451470,203890,66190,-22718,66190 1 0160
+q 482342,451470,203890,92770,-46677,55147 1 0161
+r 442147,451470,0,112867,-32427,86070 0 0162
+s 428749,451470,0,86070,0,86070 0 0163
+t 348358,644958,0,99469,-45875,99469 2 0164
+u 562733,451470,0,80440,-32427,80440 0 0165
+v 482342,451470,0,112867,-32427,75245 0 0166
+w 696717,451470,0,112867,-32427,84651 0 0167
+x 486421,451470,0,126266,0,126266 0 0170
+y 509139,451470,203890,92770,-32427,55147 1 0171
+z 428749,451470,0,128888,0,80440 0 0172
+en 535936,451470,0,96552 0 0173
+em 1071872,451470,0,96552 0 0174
+a" 535936,728178,0,128451 2 0175
+~ 535936,700301,0,121482 2 0176
+a~ "
+ad 535936,700301,0,109832 2 0177
diff --git a/font/devdvi/TIEC b/font/devdvi/TIEC
new file mode 100644
index 0000000..ccf4bec
--- /dev/null
+++ b/font/devdvi/TIEC
@@ -0,0 +1,2765 @@
+name TIEC
+internalname ecti1000
+spacewidth 375066
+slant 14.036243
+ligatures ff fi fl ffi ffl 0
+checksum -1119301501
+designsize 10485760
+kernpairs
+bq Bq 107162
+bq v -80371
+bq w -80371
+bq T -80371
+bq V -107162
+bq W -107162
+bq Y -80371
+bq :Y -80371
+bq 'Y -80371
+bq O -26790
+bq u004F_030B -26790
+bq `O -26790
+bq 'O -26790
+bq ^O -26790
+bq ~O -26790
+bq :O -26790
+bq OE -26790
+bq /O -26790
+bq C -26790
+bq G -26790
+bq 'C -26790
+bq u0043_030C -26790
+bq u0047_0306 -26790
+bq ,C -26790
+bq Q -26790
+lq oq 107162
+lq ` 107162
+lq lq 107162
+rq cq 107162
+rq ' 107162
+rq rq 107162
+Bq bq 107162
+Bq , 107162
+Bq Bq 107162
+Bq v -80371
+Bq w -80371
+Bq T -80371
+Bq V -107162
+Bq W -107162
+Bq Y -80371
+Bq :Y -80371
+Bq 'Y -80371
+Bq O -26790
+Bq u004F_030B -26790
+Bq `O -26790
+Bq 'O -26790
+Bq ^O -26790
+Bq ~O -26790
+Bq :O -26790
+Bq OE -26790
+Bq /O -26790
+Bq C -26790
+Bq G -26790
+Bq 'C -26790
+Bq u0043_030C -26790
+Bq u0047_0306 -26790
+Bq ,C -26790
+Bq Q -26790
+Fc . -80371
+Fc , -80371
+ff cq 109346
+ff ' 109346
+ff oq 109346
+ff ` 109346
+ff lq 109346
+ff rq 109346
+ff ? 109346
+ff u01C3 109346
+ff ! 109346
+ff ) 109346
+ff rB 109346
+ff ] 109346
+cq rq 107162
+' rq 107162
+cq ? 107162
+' ? 107162
+cq u01C3 107162
+cq ! 107162
+' u01C3 107162
+' ! 107162
+A y -26790
+A :y -26790
+A 'y -26790
+A n -26790
+A u006E_0301 -26790
+A u006E_030C -26790
+A u016A -26790
+A ~n -26790
+A l -26790
+A u006C_0301 -26790
+A u006C_030C -26790
+A r -26790
+A u -26790
+A u0075_030B -26790
+A u0075_030A -26790
+A `u -26790
+A 'u -26790
+A ^u -26790
+A :u -26790
+A m -26790
+A t -26790
+A u0074_030C -26790
+A u0074_0327 -26790
+A i -26790
+A 'i -26790
+A h -26790
+A b -26790
+A k -26790
+A v -26790
+A w -26790
+A C -26790
+A G -26790
+A 'C -26790
+A u0043_030C -26790
+A u0047_0306 -26790
+A ,C -26790
+A Q -26790
+A O -26790
+A u004F_030B -26790
+A `O -26790
+A 'O -26790
+A ^O -26790
+A ~O -26790
+A :O -26790
+A OE -26790
+A /O -26790
+A U -26790
+A u0055_030B -26790
+A u0055_030A -26790
+A `U -26790
+A 'U -26790
+A ^U -26790
+A :U -26790
+A T -80371
+A u0054_030C -80371
+A u0054_0327 -80371
+A Y -80371
+A :Y -80371
+A 'Y -80371
+A V -107162
+A W -107162
+A e -53581
+A u0065_030C -53581
+A u0065_0328 -53581
+A `e -53581
+A 'e -53581
+A ^e -53581
+A :e -53581
+A a -53581
+A u0061_0306 -53581
+A u0061_0328 -53581
+A `a -53581
+A 'a -53581
+A ^a -53581
+A ^a -53581
+A ~a -53581
+A :a -53581
+A oa -53581
+A ae -53581
+A o -53581
+A u006F_030B -53581
+A `o -53581
+A 'o -53581
+A ^o -53581
+A ~o -53581
+A :o -53581
+A oe -53581
+A /o -53581
+A d -53581
+A u0111 -53581
+A c -53581
+A 'c -53581
+A u0063_030C -53581
+A ,c -53581
+A g -53581
+A u0067_0306 -53581
+A q -53581
+D X -26790
+D W -26790
+D A -26790
+D u0041_0306 -26790
+D u0041_0328 -26790
+D `A -26790
+D 'A -26790
+D ^A -26790
+D ~A -26790
+D :A -26790
+D oA -26790
+D AE -26790
+D V -26790
+D Y -26790
+D :Y -26790
+D 'Y -26790
+F o -80371
+F e -80371
+F u0065_0328 -80371
+F u -80371
+F r -80371
+F n -80371
+F v -80371
+F a -80371
+F u0061_0328 -80371
+F A -107162
+F u0041_0306 -107162
+F u0041_0328 -107162
+F `A -107162
+F 'A -107162
+F ^A -107162
+F ~A -107162
+F :A -107162
+F oA -107162
+F AE -107162
+F O -26790
+F u004F_030B -26790
+F `O -26790
+F 'O -26790
+F ^O -26790
+F ~O -26790
+F :O -26790
+F OE -26790
+F /O -26790
+F C -26790
+F G -26790
+F 'C -26790
+F u0043_030C -26790
+F u0047_0306 -26790
+F ,C -26790
+F Q -26790
+K v -26790
+K w -26790
+K O -26790
+K u004F_030B -26790
+K `O -26790
+K 'O -26790
+K ^O -26790
+K ~O -26790
+K :O -26790
+K OE -26790
+K /O -26790
+K C -26790
+K G -26790
+K 'C -26790
+K u0043_030C -26790
+K u0047_0306 -26790
+K ,C -26790
+K Q -26790
+L T -80371
+L u0054_030C -80371
+L u0054_0327 -80371
+L Y -80371
+L :Y -80371
+L 'Y -80371
+L V -107162
+L W -107162
+L e -53581
+L u0065_030C -53581
+L u0065_0328 -53581
+L `e -53581
+L 'e -53581
+L ^e -53581
+L :e -53581
+L a -53581
+L u0061_0306 -53581
+L u0061_0328 -53581
+L `a -53581
+L 'a -53581
+L ^a -53581
+L ^a -53581
+L ~a -53581
+L :a -53581
+L oa -53581
+L ae -53581
+L o -53581
+L u006F_030B -53581
+L `o -53581
+L 'o -53581
+L ^o -53581
+L ~o -53581
+L :o -53581
+L oe -53581
+L /o -53581
+L d -53581
+L u0111 -53581
+L c -53581
+L 'c -53581
+L u0063_030C -53581
+L ,c -53581
+L g -53581
+L u0067_0306 -53581
+L q -53581
+O X -26790
+O W -26790
+O A -26790
+O u0041_0306 -26790
+O u0041_0328 -26790
+O `A -26790
+O 'A -26790
+O ^A -26790
+O ~A -26790
+O :A -26790
+O oA -26790
+O AE -26790
+O V -26790
+O Y -26790
+O :Y -26790
+O 'Y -26790
+P A -80371
+P u0041_0306 -80371
+P u0041_0328 -80371
+P `A -80371
+P 'A -80371
+P ^A -80371
+P ~A -80371
+P :A -80371
+P oA -80371
+P AE -80371
+R n -26790
+R u006E_0301 -26790
+R u006E_030C -26790
+R u016A -26790
+R ~n -26790
+R l -26790
+R u006C_0301 -26790
+R u006C_030C -26790
+R r -26790
+R u -26790
+R u0075_030B -26790
+R u0075_030A -26790
+R `u -26790
+R 'u -26790
+R ^u -26790
+R :u -26790
+R m -26790
+R t -26790
+R u0074_030C -26790
+R u0074_0327 -26790
+R i -26790
+R 'i -26790
+R h -26790
+R b -26790
+R k -26790
+R v -26790
+R w -26790
+R C -26790
+R G -26790
+R 'C -26790
+R u0043_030C -26790
+R u0047_0306 -26790
+R ,C -26790
+R Q -26790
+R O -26790
+R u004F_030B -26790
+R `O -26790
+R 'O -26790
+R ^O -26790
+R ~O -26790
+R :O -26790
+R OE -26790
+R /O -26790
+R U -26790
+R u0055_030B -26790
+R u0055_030A -26790
+R `U -26790
+R 'U -26790
+R ^U -26790
+R :U -26790
+R T -80371
+R u0054_030C -80371
+R u0054_0327 -80371
+R Y -80371
+R :Y -80371
+R 'Y -80371
+R V -107162
+R W -107162
+R e -53581
+R u0065_030C -53581
+R u0065_0328 -53581
+R `e -53581
+R 'e -53581
+R ^e -53581
+R :e -53581
+R a -53581
+R u0061_0306 -53581
+R u0061_0328 -53581
+R `a -53581
+R 'a -53581
+R ^a -53581
+R ^a -53581
+R ~a -53581
+R :a -53581
+R oa -53581
+R ae -53581
+R o -53581
+R u006F_030B -53581
+R `o -53581
+R 'o -53581
+R ^o -53581
+R ~o -53581
+R :o -53581
+R oe -53581
+R /o -53581
+R d -53581
+R u0111 -53581
+R c -53581
+R 'c -53581
+R u0063_030C -53581
+R ,c -53581
+R g -53581
+R u0067_0306 -53581
+R q -53581
+T y -80371
+T e -80371
+T o -80371
+T r -80371
+T a -80371
+T u -80371
+T A -80371
+T u0041_0306 -80371
+T u0041_0328 -80371
+T `A -80371
+T 'A -80371
+T ^A -80371
+T ~A -80371
+T :A -80371
+T oA -80371
+T AE -80371
+V o -80371
+V e -80371
+V u0065_0328 -80371
+V u -80371
+V r -80371
+V n -80371
+V v -80371
+V a -80371
+V u0061_0328 -80371
+V A -107162
+V u0041_0306 -107162
+V u0041_0328 -107162
+V `A -107162
+V 'A -107162
+V ^A -107162
+V ~A -107162
+V :A -107162
+V oA -107162
+V AE -107162
+V O -26790
+V u004F_030B -26790
+V `O -26790
+V 'O -26790
+V ^O -26790
+V ~O -26790
+V :O -26790
+V OE -26790
+V /O -26790
+V C -26790
+V G -26790
+V 'C -26790
+V u0043_030C -26790
+V u0047_0306 -26790
+V ,C -26790
+V Q -26790
+W o -80371
+W e -80371
+W u0065_0328 -80371
+W u -80371
+W r -80371
+W n -80371
+W v -80371
+W a -80371
+W u0061_0328 -80371
+W A -107162
+W u0041_0306 -107162
+W u0041_0328 -107162
+W `A -107162
+W 'A -107162
+W ^A -107162
+W ~A -107162
+W :A -107162
+W oA -107162
+W AE -107162
+W O -26790
+W u004F_030B -26790
+W `O -26790
+W 'O -26790
+W ^O -26790
+W ~O -26790
+W :O -26790
+W OE -26790
+W /O -26790
+W C -26790
+W G -26790
+W 'C -26790
+W u0043_030C -26790
+W u0047_0306 -26790
+W ,C -26790
+W Q -26790
+X O -26790
+X u004F_030B -26790
+X `O -26790
+X 'O -26790
+X ^O -26790
+X ~O -26790
+X :O -26790
+X OE -26790
+X /O -26790
+X C -26790
+X G -26790
+X 'C -26790
+X u0043_030C -26790
+X u0047_0306 -26790
+X ,C -26790
+X Q -26790
+Y e -80371
+Y o -80371
+Y r -80371
+Y a -80371
+Y u -80371
+Y A -80371
+Y u0041_0306 -80371
+Y u0041_0328 -80371
+Y `A -80371
+Y 'A -80371
+Y ^A -80371
+Y ~A -80371
+Y :A -80371
+Y oA -80371
+Y AE -80371
+oq lq 107162
+` lq 107162
+oq ? 107162
+` ? 107162
+oq u01C3 107162
+oq ! 107162
+` u01C3 107162
+` ! 107162
+b e -53581
+b u0065_030C -53581
+b u0065_0328 -53581
+b `e -53581
+b 'e -53581
+b ^e -53581
+b :e -53581
+b a -53581
+b u0061_0306 -53581
+b u0061_0328 -53581
+b `a -53581
+b 'a -53581
+b ^a -53581
+b ^a -53581
+b ~a -53581
+b :a -53581
+b oa -53581
+b ae -53581
+b o -53581
+b u006F_030B -53581
+b `o -53581
+b 'o -53581
+b ^o -53581
+b ~o -53581
+b :o -53581
+b oe -53581
+b /o -53581
+b d -53581
+b u0111 -53581
+b c -53581
+b 'c -53581
+b u0063_030C -53581
+b ,c -53581
+b g -53581
+b u0067_0306 -53581
+b q -53581
+c e -53581
+c u0065_030C -53581
+c u0065_0328 -53581
+c `e -53581
+c 'e -53581
+c ^e -53581
+c :e -53581
+c a -53581
+c u0061_0306 -53581
+c u0061_0328 -53581
+c `a -53581
+c 'a -53581
+c ^a -53581
+c ^a -53581
+c ~a -53581
+c :a -53581
+c oa -53581
+c ae -53581
+c o -53581
+c u006F_030B -53581
+c `o -53581
+c 'o -53581
+c ^o -53581
+c ~o -53581
+c :o -53581
+c oe -53581
+c /o -53581
+c d -53581
+c u0111 -53581
+c c -53581
+c 'c -53581
+c u0063_030C -53581
+c ,c -53581
+c g -53581
+c u0067_0306 -53581
+c q -53581
+d l 53581
+d u006C_0301 53581
+d u006C_030C 53581
+e e -53581
+e u0065_030C -53581
+e u0065_0328 -53581
+e `e -53581
+e 'e -53581
+e ^e -53581
+e :e -53581
+e a -53581
+e u0061_0306 -53581
+e u0061_0328 -53581
+e `a -53581
+e 'a -53581
+e ^a -53581
+e ^a -53581
+e ~a -53581
+e :a -53581
+e oa -53581
+e ae -53581
+e o -53581
+e u006F_030B -53581
+e `o -53581
+e 'o -53581
+e ^o -53581
+e ~o -53581
+e :o -53581
+e oe -53581
+e /o -53581
+e d -53581
+e u0111 -53581
+e c -53581
+e 'c -53581
+e u0063_030C -53581
+e ,c -53581
+e g -53581
+e u0067_0306 -53581
+e q -53581
+f cq 109346
+f ' 109346
+f oq 109346
+f ` 109346
+f lq 109346
+f rq 109346
+f ? 109346
+f u01C3 109346
+f ! 109346
+f ) 109346
+f rB 109346
+f ] 109346
+l l 53581
+l u006C_0301 53581
+l u006C_030C 53581
+n cq -107162
+n ' -107162
+o e -53581
+o u0065_030C -53581
+o u0065_0328 -53581
+o `e -53581
+o 'e -53581
+o ^e -53581
+o :e -53581
+o a -53581
+o u0061_0306 -53581
+o u0061_0328 -53581
+o `a -53581
+o 'a -53581
+o ^a -53581
+o ^a -53581
+o ~a -53581
+o :a -53581
+o oa -53581
+o ae -53581
+o o -53581
+o u006F_030B -53581
+o `o -53581
+o 'o -53581
+o ^o -53581
+o ~o -53581
+o :o -53581
+o oe -53581
+o /o -53581
+o d -53581
+o u0111 -53581
+o c -53581
+o 'c -53581
+o u0063_030C -53581
+o ,c -53581
+o g -53581
+o u0067_0306 -53581
+o q -53581
+p e -53581
+p u0065_030C -53581
+p u0065_0328 -53581
+p `e -53581
+p 'e -53581
+p ^e -53581
+p :e -53581
+p a -53581
+p u0061_0306 -53581
+p u0061_0328 -53581
+p `a -53581
+p 'a -53581
+p ^a -53581
+p ^a -53581
+p ~a -53581
+p :a -53581
+p oa -53581
+p ae -53581
+p o -53581
+p u006F_030B -53581
+p `o -53581
+p 'o -53581
+p ^o -53581
+p ~o -53581
+p :o -53581
+p oe -53581
+p /o -53581
+p d -53581
+p u0111 -53581
+p c -53581
+p 'c -53581
+p u0063_030C -53581
+p ,c -53581
+p g -53581
+p u0067_0306 -53581
+p q -53581
+r e -53581
+r u0065_030C -53581
+r u0065_0328 -53581
+r `e -53581
+r 'e -53581
+r ^e -53581
+r :e -53581
+r a -53581
+r u0061_0306 -53581
+r u0061_0328 -53581
+r `a -53581
+r 'a -53581
+r ^a -53581
+r ^a -53581
+r ~a -53581
+r :a -53581
+r oa -53581
+r ae -53581
+r o -53581
+r u006F_030B -53581
+r `o -53581
+r 'o -53581
+r ^o -53581
+r ~o -53581
+r :o -53581
+r oe -53581
+r /o -53581
+r d -53581
+r u0111 -53581
+r c -53581
+r 'c -53581
+r u0063_030C -53581
+r ,c -53581
+r g -53581
+r u0067_0306 -53581
+r q -53581
+w l 53581
+w u006C_0301 53581
+w u006C_030C 53581
+u0041_0306 y -26790
+u0041_0306 :y -26790
+u0041_0306 'y -26790
+u0041_0306 n -26790
+u0041_0306 u006E_0301 -26790
+u0041_0306 u006E_030C -26790
+u0041_0306 u016A -26790
+u0041_0306 ~n -26790
+u0041_0306 l -26790
+u0041_0306 u006C_0301 -26790
+u0041_0306 u006C_030C -26790
+u0041_0306 r -26790
+u0041_0306 u -26790
+u0041_0306 u0075_030B -26790
+u0041_0306 u0075_030A -26790
+u0041_0306 `u -26790
+u0041_0306 'u -26790
+u0041_0306 ^u -26790
+u0041_0306 :u -26790
+u0041_0306 m -26790
+u0041_0306 t -26790
+u0041_0306 u0074_030C -26790
+u0041_0306 u0074_0327 -26790
+u0041_0306 i -26790
+u0041_0306 'i -26790
+u0041_0306 h -26790
+u0041_0306 b -26790
+u0041_0306 k -26790
+u0041_0306 v -26790
+u0041_0306 w -26790
+u0041_0306 C -26790
+u0041_0306 G -26790
+u0041_0306 'C -26790
+u0041_0306 u0043_030C -26790
+u0041_0306 u0047_0306 -26790
+u0041_0306 ,C -26790
+u0041_0306 Q -26790
+u0041_0306 O -26790
+u0041_0306 u004F_030B -26790
+u0041_0306 `O -26790
+u0041_0306 'O -26790
+u0041_0306 ^O -26790
+u0041_0306 ~O -26790
+u0041_0306 :O -26790
+u0041_0306 OE -26790
+u0041_0306 /O -26790
+u0041_0306 U -26790
+u0041_0306 u0055_030B -26790
+u0041_0306 u0055_030A -26790
+u0041_0306 `U -26790
+u0041_0306 'U -26790
+u0041_0306 ^U -26790
+u0041_0306 :U -26790
+u0041_0306 T -80371
+u0041_0306 u0054_030C -80371
+u0041_0306 u0054_0327 -80371
+u0041_0306 Y -80371
+u0041_0306 :Y -80371
+u0041_0306 'Y -80371
+u0041_0306 V -107162
+u0041_0306 W -107162
+u0041_0306 e -53581
+u0041_0306 u0065_030C -53581
+u0041_0306 u0065_0328 -53581
+u0041_0306 `e -53581
+u0041_0306 'e -53581
+u0041_0306 ^e -53581
+u0041_0306 :e -53581
+u0041_0306 a -53581
+u0041_0306 u0061_0306 -53581
+u0041_0306 u0061_0328 -53581
+u0041_0306 `a -53581
+u0041_0306 'a -53581
+u0041_0306 ^a -53581
+u0041_0306 ^a -53581
+u0041_0306 ~a -53581
+u0041_0306 :a -53581
+u0041_0306 oa -53581
+u0041_0306 ae -53581
+u0041_0306 o -53581
+u0041_0306 u006F_030B -53581
+u0041_0306 `o -53581
+u0041_0306 'o -53581
+u0041_0306 ^o -53581
+u0041_0306 ~o -53581
+u0041_0306 :o -53581
+u0041_0306 oe -53581
+u0041_0306 /o -53581
+u0041_0306 d -53581
+u0041_0306 u0111 -53581
+u0041_0306 c -53581
+u0041_0306 'c -53581
+u0041_0306 u0063_030C -53581
+u0041_0306 ,c -53581
+u0041_0306 g -53581
+u0041_0306 u0067_0306 -53581
+u0041_0306 q -53581
+u0041_0328 n -26790
+u0041_0328 u006E_0301 -26790
+u0041_0328 u006E_030C -26790
+u0041_0328 u016A -26790
+u0041_0328 ~n -26790
+u0041_0328 l -26790
+u0041_0328 u006C_0301 -26790
+u0041_0328 u006C_030C -26790
+u0041_0328 r -26790
+u0041_0328 u -26790
+u0041_0328 u0075_030B -26790
+u0041_0328 u0075_030A -26790
+u0041_0328 `u -26790
+u0041_0328 'u -26790
+u0041_0328 ^u -26790
+u0041_0328 :u -26790
+u0041_0328 m -26790
+u0041_0328 t -26790
+u0041_0328 u0074_030C -26790
+u0041_0328 u0074_0327 -26790
+u0041_0328 i -26790
+u0041_0328 'i -26790
+u0041_0328 h -26790
+u0041_0328 b -26790
+u0041_0328 k -26790
+u0041_0328 v -26790
+u0041_0328 w -26790
+u0041_0328 C -26790
+u0041_0328 G -26790
+u0041_0328 'C -26790
+u0041_0328 u0043_030C -26790
+u0041_0328 u0047_0306 -26790
+u0041_0328 ,C -26790
+u0041_0328 Q -26790
+u0041_0328 O -26790
+u0041_0328 u004F_030B -26790
+u0041_0328 `O -26790
+u0041_0328 'O -26790
+u0041_0328 ^O -26790
+u0041_0328 ~O -26790
+u0041_0328 :O -26790
+u0041_0328 OE -26790
+u0041_0328 /O -26790
+u0041_0328 U -26790
+u0041_0328 u0055_030B -26790
+u0041_0328 u0055_030A -26790
+u0041_0328 `U -26790
+u0041_0328 'U -26790
+u0041_0328 ^U -26790
+u0041_0328 :U -26790
+u0041_0328 T -80371
+u0041_0328 u0054_030C -80371
+u0041_0328 u0054_0327 -80371
+u0041_0328 Y -80371
+u0041_0328 :Y -80371
+u0041_0328 'Y -80371
+u0041_0328 V -107162
+u0041_0328 W -107162
+u0041_0328 e -53581
+u0041_0328 u0065_030C -53581
+u0041_0328 u0065_0328 -53581
+u0041_0328 `e -53581
+u0041_0328 'e -53581
+u0041_0328 ^e -53581
+u0041_0328 :e -53581
+u0041_0328 a -53581
+u0041_0328 u0061_0306 -53581
+u0041_0328 u0061_0328 -53581
+u0041_0328 `a -53581
+u0041_0328 'a -53581
+u0041_0328 ^a -53581
+u0041_0328 ^a -53581
+u0041_0328 ~a -53581
+u0041_0328 :a -53581
+u0041_0328 oa -53581
+u0041_0328 ae -53581
+u0041_0328 o -53581
+u0041_0328 u006F_030B -53581
+u0041_0328 `o -53581
+u0041_0328 'o -53581
+u0041_0328 ^o -53581
+u0041_0328 ~o -53581
+u0041_0328 :o -53581
+u0041_0328 oe -53581
+u0041_0328 /o -53581
+u0041_0328 d -53581
+u0041_0328 u0111 -53581
+u0041_0328 c -53581
+u0041_0328 'c -53581
+u0041_0328 u0063_030C -53581
+u0041_0328 ,c -53581
+u0041_0328 g -53581
+u0041_0328 u0067_0306 -53581
+u0041_0328 q -53581
+u0044_030C X -26790
+u0044_030C W -26790
+u0044_030C A -26790
+u0044_030C u0041_0306 -26790
+u0044_030C u0041_0328 -26790
+u0044_030C `A -26790
+u0044_030C 'A -26790
+u0044_030C ^A -26790
+u0044_030C ~A -26790
+u0044_030C :A -26790
+u0044_030C oA -26790
+u0044_030C AE -26790
+u0044_030C V -26790
+u0044_030C Y -26790
+u0044_030C :Y -26790
+u0044_030C 'Y -26790
+u004C_0301 T -80371
+u004C_0301 u0054_030C -80371
+u004C_0301 u0054_0327 -80371
+u004C_0301 Y -80371
+u004C_0301 :Y -80371
+u004C_0301 'Y -80371
+u004C_0301 V -107162
+u004C_0301 W -107162
+u004C_0301 e -53581
+u004C_0301 u0065_030C -53581
+u004C_0301 u0065_0328 -53581
+u004C_0301 `e -53581
+u004C_0301 'e -53581
+u004C_0301 ^e -53581
+u004C_0301 :e -53581
+u004C_0301 a -53581
+u004C_0301 u0061_0306 -53581
+u004C_0301 u0061_0328 -53581
+u004C_0301 `a -53581
+u004C_0301 'a -53581
+u004C_0301 ^a -53581
+u004C_0301 ^a -53581
+u004C_0301 ~a -53581
+u004C_0301 :a -53581
+u004C_0301 oa -53581
+u004C_0301 ae -53581
+u004C_0301 o -53581
+u004C_0301 u006F_030B -53581
+u004C_0301 `o -53581
+u004C_0301 'o -53581
+u004C_0301 ^o -53581
+u004C_0301 ~o -53581
+u004C_0301 :o -53581
+u004C_0301 oe -53581
+u004C_0301 /o -53581
+u004C_0301 d -53581
+u004C_0301 u0111 -53581
+u004C_0301 c -53581
+u004C_0301 'c -53581
+u004C_0301 u0063_030C -53581
+u004C_0301 ,c -53581
+u004C_0301 g -53581
+u004C_0301 u0067_0306 -53581
+u004C_0301 q -53581
+u004C_030C T -80371
+u004C_030C u0054_030C -80371
+u004C_030C u0054_0327 -80371
+u004C_030C Y -80371
+u004C_030C :Y -80371
+u004C_030C 'Y -80371
+u004C_030C V -107162
+u004C_030C W -107162
+u004C_030C e -53581
+u004C_030C u0065_030C -53581
+u004C_030C u0065_0328 -53581
+u004C_030C `e -53581
+u004C_030C 'e -53581
+u004C_030C ^e -53581
+u004C_030C :e -53581
+u004C_030C a -53581
+u004C_030C u0061_0306 -53581
+u004C_030C u0061_0328 -53581
+u004C_030C `a -53581
+u004C_030C 'a -53581
+u004C_030C ^a -53581
+u004C_030C ^a -53581
+u004C_030C ~a -53581
+u004C_030C :a -53581
+u004C_030C oa -53581
+u004C_030C ae -53581
+u004C_030C o -53581
+u004C_030C u006F_030B -53581
+u004C_030C `o -53581
+u004C_030C 'o -53581
+u004C_030C ^o -53581
+u004C_030C ~o -53581
+u004C_030C :o -53581
+u004C_030C oe -53581
+u004C_030C /o -53581
+u004C_030C d -53581
+u004C_030C u0111 -53581
+u004C_030C c -53581
+u004C_030C 'c -53581
+u004C_030C u0063_030C -53581
+u004C_030C ,c -53581
+u004C_030C g -53581
+u004C_030C u0067_0306 -53581
+u004C_030C q -53581
+u004F_030B X -26790
+u004F_030B W -26790
+u004F_030B A -26790
+u004F_030B u0041_0306 -26790
+u004F_030B u0041_0328 -26790
+u004F_030B `A -26790
+u004F_030B 'A -26790
+u004F_030B ^A -26790
+u004F_030B ~A -26790
+u004F_030B :A -26790
+u004F_030B oA -26790
+u004F_030B AE -26790
+u004F_030B V -26790
+u004F_030B Y -26790
+u004F_030B :Y -26790
+u004F_030B 'Y -26790
+u0052_0301 n -26790
+u0052_0301 u006E_0301 -26790
+u0052_0301 u006E_030C -26790
+u0052_0301 u016A -26790
+u0052_0301 ~n -26790
+u0052_0301 l -26790
+u0052_0301 u006C_0301 -26790
+u0052_0301 u006C_030C -26790
+u0052_0301 r -26790
+u0052_0301 u -26790
+u0052_0301 u0075_030B -26790
+u0052_0301 u0075_030A -26790
+u0052_0301 `u -26790
+u0052_0301 'u -26790
+u0052_0301 ^u -26790
+u0052_0301 :u -26790
+u0052_0301 m -26790
+u0052_0301 t -26790
+u0052_0301 u0074_030C -26790
+u0052_0301 u0074_0327 -26790
+u0052_0301 i -26790
+u0052_0301 'i -26790
+u0052_0301 h -26790
+u0052_0301 b -26790
+u0052_0301 k -26790
+u0052_0301 v -26790
+u0052_0301 w -26790
+u0052_0301 C -26790
+u0052_0301 G -26790
+u0052_0301 'C -26790
+u0052_0301 u0043_030C -26790
+u0052_0301 u0047_0306 -26790
+u0052_0301 ,C -26790
+u0052_0301 Q -26790
+u0052_0301 O -26790
+u0052_0301 u004F_030B -26790
+u0052_0301 `O -26790
+u0052_0301 'O -26790
+u0052_0301 ^O -26790
+u0052_0301 ~O -26790
+u0052_0301 :O -26790
+u0052_0301 OE -26790
+u0052_0301 /O -26790
+u0052_0301 U -26790
+u0052_0301 u0055_030B -26790
+u0052_0301 u0055_030A -26790
+u0052_0301 `U -26790
+u0052_0301 'U -26790
+u0052_0301 ^U -26790
+u0052_0301 :U -26790
+u0052_0301 T -80371
+u0052_0301 u0054_030C -80371
+u0052_0301 u0054_0327 -80371
+u0052_0301 Y -80371
+u0052_0301 :Y -80371
+u0052_0301 'Y -80371
+u0052_0301 V -107162
+u0052_0301 W -107162
+u0052_0301 e -53581
+u0052_0301 u0065_030C -53581
+u0052_0301 u0065_0328 -53581
+u0052_0301 `e -53581
+u0052_0301 'e -53581
+u0052_0301 ^e -53581
+u0052_0301 :e -53581
+u0052_0301 a -53581
+u0052_0301 u0061_0306 -53581
+u0052_0301 u0061_0328 -53581
+u0052_0301 `a -53581
+u0052_0301 'a -53581
+u0052_0301 ^a -53581
+u0052_0301 ^a -53581
+u0052_0301 ~a -53581
+u0052_0301 :a -53581
+u0052_0301 oa -53581
+u0052_0301 ae -53581
+u0052_0301 o -53581
+u0052_0301 u006F_030B -53581
+u0052_0301 `o -53581
+u0052_0301 'o -53581
+u0052_0301 ^o -53581
+u0052_0301 ~o -53581
+u0052_0301 :o -53581
+u0052_0301 oe -53581
+u0052_0301 /o -53581
+u0052_0301 d -53581
+u0052_0301 u0111 -53581
+u0052_0301 c -53581
+u0052_0301 'c -53581
+u0052_0301 u0063_030C -53581
+u0052_0301 ,c -53581
+u0052_0301 g -53581
+u0052_0301 u0067_0306 -53581
+u0052_0301 q -53581
+u0054_030C y -80371
+u0054_030C e -80371
+u0054_030C o -80371
+u0054_030C r -80371
+u0054_030C a -80371
+u0054_030C u -80371
+u0054_030C A -80371
+u0054_030C u0041_0306 -80371
+u0054_030C u0041_0328 -80371
+u0054_030C `A -80371
+u0054_030C 'A -80371
+u0054_030C ^A -80371
+u0054_030C ~A -80371
+u0054_030C :A -80371
+u0054_030C oA -80371
+u0054_030C AE -80371
+u0054_0327 y -80371
+u0054_0327 e -80371
+u0054_0327 o -80371
+u0054_0327 r -80371
+u0054_0327 a -80371
+u0054_0327 u -80371
+u0054_0327 A -80371
+u0054_0327 u0041_0306 -80371
+u0054_0327 u0041_0328 -80371
+u0054_0327 `A -80371
+u0054_0327 'A -80371
+u0054_0327 ^A -80371
+u0054_0327 ~A -80371
+u0054_0327 :A -80371
+u0054_0327 oA -80371
+u0054_0327 AE -80371
+:Y e -80371
+:Y o -80371
+:Y r -80371
+:Y a -80371
+:Y u -80371
+:Y A -80371
+:Y u0041_0306 -80371
+:Y u0041_0328 -80371
+:Y `A -80371
+:Y 'A -80371
+:Y ^A -80371
+:Y ~A -80371
+:Y :A -80371
+:Y oA -80371
+:Y AE -80371
+'c e -53581
+'c u0065_030C -53581
+'c u0065_0328 -53581
+'c `e -53581
+'c 'e -53581
+'c ^e -53581
+'c :e -53581
+'c a -53581
+'c u0061_0306 -53581
+'c u0061_0328 -53581
+'c `a -53581
+'c 'a -53581
+'c ^a -53581
+'c ^a -53581
+'c ~a -53581
+'c :a -53581
+'c oa -53581
+'c ae -53581
+'c o -53581
+'c u006F_030B -53581
+'c `o -53581
+'c 'o -53581
+'c ^o -53581
+'c ~o -53581
+'c :o -53581
+'c oe -53581
+'c /o -53581
+'c d -53581
+'c u0111 -53581
+'c c -53581
+'c 'c -53581
+'c u0063_030C -53581
+'c ,c -53581
+'c g -53581
+'c u0067_0306 -53581
+'c q -53581
+u0063_030C e -53581
+u0063_030C u0065_030C -53581
+u0063_030C u0065_0328 -53581
+u0063_030C `e -53581
+u0063_030C 'e -53581
+u0063_030C ^e -53581
+u0063_030C :e -53581
+u0063_030C a -53581
+u0063_030C u0061_0306 -53581
+u0063_030C u0061_0328 -53581
+u0063_030C `a -53581
+u0063_030C 'a -53581
+u0063_030C ^a -53581
+u0063_030C ^a -53581
+u0063_030C ~a -53581
+u0063_030C :a -53581
+u0063_030C oa -53581
+u0063_030C ae -53581
+u0063_030C o -53581
+u0063_030C u006F_030B -53581
+u0063_030C `o -53581
+u0063_030C 'o -53581
+u0063_030C ^o -53581
+u0063_030C ~o -53581
+u0063_030C :o -53581
+u0063_030C oe -53581
+u0063_030C /o -53581
+u0063_030C d -53581
+u0063_030C u0111 -53581
+u0063_030C c -53581
+u0063_030C 'c -53581
+u0063_030C u0063_030C -53581
+u0063_030C ,c -53581
+u0063_030C g -53581
+u0063_030C u0067_0306 -53581
+u0063_030C q -53581
+u0064_030C l 53581
+u0064_030C u006C_0301 53581
+u0064_030C u006C_030C 53581
+u0065_030C e -53581
+u0065_030C u0065_030C -53581
+u0065_030C u0065_0328 -53581
+u0065_030C `e -53581
+u0065_030C 'e -53581
+u0065_030C ^e -53581
+u0065_030C :e -53581
+u0065_030C a -53581
+u0065_030C u0061_0306 -53581
+u0065_030C u0061_0328 -53581
+u0065_030C `a -53581
+u0065_030C 'a -53581
+u0065_030C ^a -53581
+u0065_030C ^a -53581
+u0065_030C ~a -53581
+u0065_030C :a -53581
+u0065_030C oa -53581
+u0065_030C ae -53581
+u0065_030C o -53581
+u0065_030C u006F_030B -53581
+u0065_030C `o -53581
+u0065_030C 'o -53581
+u0065_030C ^o -53581
+u0065_030C ~o -53581
+u0065_030C :o -53581
+u0065_030C oe -53581
+u0065_030C /o -53581
+u0065_030C d -53581
+u0065_030C u0111 -53581
+u0065_030C c -53581
+u0065_030C 'c -53581
+u0065_030C u0063_030C -53581
+u0065_030C ,c -53581
+u0065_030C g -53581
+u0065_030C u0067_0306 -53581
+u0065_030C q -53581
+u0065_0328 e -53581
+u0065_0328 u0065_030C -53581
+u0065_0328 u0065_0328 -53581
+u0065_0328 `e -53581
+u0065_0328 'e -53581
+u0065_0328 ^e -53581
+u0065_0328 :e -53581
+u0065_0328 a -53581
+u0065_0328 u0061_0306 -53581
+u0065_0328 u0061_0328 -53581
+u0065_0328 `a -53581
+u0065_0328 'a -53581
+u0065_0328 ^a -53581
+u0065_0328 ^a -53581
+u0065_0328 ~a -53581
+u0065_0328 :a -53581
+u0065_0328 oa -53581
+u0065_0328 ae -53581
+u0065_0328 o -53581
+u0065_0328 u006F_030B -53581
+u0065_0328 `o -53581
+u0065_0328 'o -53581
+u0065_0328 ^o -53581
+u0065_0328 ~o -53581
+u0065_0328 :o -53581
+u0065_0328 oe -53581
+u0065_0328 /o -53581
+u0065_0328 d -53581
+u0065_0328 u0111 -53581
+u0065_0328 c -53581
+u0065_0328 'c -53581
+u0065_0328 u0063_030C -53581
+u0065_0328 ,c -53581
+u0065_0328 g -53581
+u0065_0328 u0067_0306 -53581
+u0065_0328 q -53581
+u006C_0301 l 53581
+u006C_0301 u006C_0301 53581
+u006C_0301 u006C_030C 53581
+u006C_030C l 53581
+u006C_030C u006C_0301 53581
+u006C_030C u006C_030C 53581
+/l cq 26790
+/l ' 26790
+`A y -26790
+`A :y -26790
+`A 'y -26790
+`A n -26790
+`A u006E_0301 -26790
+`A u006E_030C -26790
+`A u016A -26790
+`A ~n -26790
+`A l -26790
+`A u006C_0301 -26790
+`A u006C_030C -26790
+`A r -26790
+`A u -26790
+`A u0075_030B -26790
+`A u0075_030A -26790
+`A `u -26790
+`A 'u -26790
+`A ^u -26790
+`A :u -26790
+`A m -26790
+`A t -26790
+`A u0074_030C -26790
+`A u0074_0327 -26790
+`A i -26790
+`A 'i -26790
+`A h -26790
+`A b -26790
+`A k -26790
+`A v -26790
+`A w -26790
+`A C -26790
+`A G -26790
+`A 'C -26790
+`A u0043_030C -26790
+`A u0047_0306 -26790
+`A ,C -26790
+`A Q -26790
+`A O -26790
+`A u004F_030B -26790
+`A `O -26790
+`A 'O -26790
+`A ^O -26790
+`A ~O -26790
+`A :O -26790
+`A OE -26790
+`A /O -26790
+`A U -26790
+`A u0055_030B -26790
+`A u0055_030A -26790
+`A `U -26790
+`A 'U -26790
+`A ^U -26790
+`A :U -26790
+`A T -80371
+`A u0054_030C -80371
+`A u0054_0327 -80371
+`A Y -80371
+`A :Y -80371
+`A 'Y -80371
+`A V -107162
+`A W -107162
+`A e -53581
+`A u0065_030C -53581
+`A u0065_0328 -53581
+`A `e -53581
+`A 'e -53581
+`A ^e -53581
+`A :e -53581
+`A a -53581
+`A u0061_0306 -53581
+`A u0061_0328 -53581
+`A `a -53581
+`A 'a -53581
+`A ^a -53581
+`A ^a -53581
+`A ~a -53581
+`A :a -53581
+`A oa -53581
+`A ae -53581
+`A o -53581
+`A u006F_030B -53581
+`A `o -53581
+`A 'o -53581
+`A ^o -53581
+`A ~o -53581
+`A :o -53581
+`A oe -53581
+`A /o -53581
+`A d -53581
+`A u0111 -53581
+`A c -53581
+`A 'c -53581
+`A u0063_030C -53581
+`A ,c -53581
+`A g -53581
+`A u0067_0306 -53581
+`A q -53581
+'A y -26790
+'A :y -26790
+'A 'y -26790
+'A n -26790
+'A u006E_0301 -26790
+'A u006E_030C -26790
+'A u016A -26790
+'A ~n -26790
+'A l -26790
+'A u006C_0301 -26790
+'A u006C_030C -26790
+'A r -26790
+'A u -26790
+'A u0075_030B -26790
+'A u0075_030A -26790
+'A `u -26790
+'A 'u -26790
+'A ^u -26790
+'A :u -26790
+'A m -26790
+'A t -26790
+'A u0074_030C -26790
+'A u0074_0327 -26790
+'A i -26790
+'A 'i -26790
+'A h -26790
+'A b -26790
+'A k -26790
+'A v -26790
+'A w -26790
+'A C -26790
+'A G -26790
+'A 'C -26790
+'A u0043_030C -26790
+'A u0047_0306 -26790
+'A ,C -26790
+'A Q -26790
+'A O -26790
+'A u004F_030B -26790
+'A `O -26790
+'A 'O -26790
+'A ^O -26790
+'A ~O -26790
+'A :O -26790
+'A OE -26790
+'A /O -26790
+'A U -26790
+'A u0055_030B -26790
+'A u0055_030A -26790
+'A `U -26790
+'A 'U -26790
+'A ^U -26790
+'A :U -26790
+'A T -80371
+'A u0054_030C -80371
+'A u0054_0327 -80371
+'A Y -80371
+'A :Y -80371
+'A 'Y -80371
+'A V -107162
+'A W -107162
+'A e -53581
+'A u0065_030C -53581
+'A u0065_0328 -53581
+'A `e -53581
+'A 'e -53581
+'A ^e -53581
+'A :e -53581
+'A a -53581
+'A u0061_0306 -53581
+'A u0061_0328 -53581
+'A `a -53581
+'A 'a -53581
+'A ^a -53581
+'A ^a -53581
+'A ~a -53581
+'A :a -53581
+'A oa -53581
+'A ae -53581
+'A o -53581
+'A u006F_030B -53581
+'A `o -53581
+'A 'o -53581
+'A ^o -53581
+'A ~o -53581
+'A :o -53581
+'A oe -53581
+'A /o -53581
+'A d -53581
+'A u0111 -53581
+'A c -53581
+'A 'c -53581
+'A u0063_030C -53581
+'A ,c -53581
+'A g -53581
+'A u0067_0306 -53581
+'A q -53581
+^A y -26790
+^A :y -26790
+^A 'y -26790
+^A n -26790
+^A u006E_0301 -26790
+^A u006E_030C -26790
+^A u016A -26790
+^A ~n -26790
+^A l -26790
+^A u006C_0301 -26790
+^A u006C_030C -26790
+^A r -26790
+^A u -26790
+^A u0075_030B -26790
+^A u0075_030A -26790
+^A `u -26790
+^A 'u -26790
+^A ^u -26790
+^A :u -26790
+^A m -26790
+^A t -26790
+^A u0074_030C -26790
+^A u0074_0327 -26790
+^A i -26790
+^A 'i -26790
+^A h -26790
+^A b -26790
+^A k -26790
+^A v -26790
+^A w -26790
+^A C -26790
+^A G -26790
+^A 'C -26790
+^A u0043_030C -26790
+^A u0047_0306 -26790
+^A ,C -26790
+^A Q -26790
+^A O -26790
+^A u004F_030B -26790
+^A `O -26790
+^A 'O -26790
+^A ^O -26790
+^A ~O -26790
+^A :O -26790
+^A OE -26790
+^A /O -26790
+^A U -26790
+^A u0055_030B -26790
+^A u0055_030A -26790
+^A `U -26790
+^A 'U -26790
+^A ^U -26790
+^A :U -26790
+^A T -80371
+^A u0054_030C -80371
+^A u0054_0327 -80371
+^A Y -80371
+^A :Y -80371
+^A 'Y -80371
+^A V -107162
+^A W -107162
+^A e -53581
+^A u0065_030C -53581
+^A u0065_0328 -53581
+^A `e -53581
+^A 'e -53581
+^A ^e -53581
+^A :e -53581
+^A a -53581
+^A u0061_0306 -53581
+^A u0061_0328 -53581
+^A `a -53581
+^A 'a -53581
+^A ^a -53581
+^A ^a -53581
+^A ~a -53581
+^A :a -53581
+^A oa -53581
+^A ae -53581
+^A o -53581
+^A u006F_030B -53581
+^A `o -53581
+^A 'o -53581
+^A ^o -53581
+^A ~o -53581
+^A :o -53581
+^A oe -53581
+^A /o -53581
+^A d -53581
+^A u0111 -53581
+^A c -53581
+^A 'c -53581
+^A u0063_030C -53581
+^A ,c -53581
+^A g -53581
+^A u0067_0306 -53581
+^A q -53581
+~A y -26790
+~A :y -26790
+~A 'y -26790
+~A n -26790
+~A u006E_0301 -26790
+~A u006E_030C -26790
+~A u016A -26790
+~A ~n -26790
+~A l -26790
+~A u006C_0301 -26790
+~A u006C_030C -26790
+~A r -26790
+~A u -26790
+~A u0075_030B -26790
+~A u0075_030A -26790
+~A `u -26790
+~A 'u -26790
+~A ^u -26790
+~A :u -26790
+~A m -26790
+~A t -26790
+~A u0074_030C -26790
+~A u0074_0327 -26790
+~A i -26790
+~A 'i -26790
+~A h -26790
+~A b -26790
+~A k -26790
+~A v -26790
+~A w -26790
+~A C -26790
+~A G -26790
+~A 'C -26790
+~A u0043_030C -26790
+~A u0047_0306 -26790
+~A ,C -26790
+~A Q -26790
+~A O -26790
+~A u004F_030B -26790
+~A `O -26790
+~A 'O -26790
+~A ^O -26790
+~A ~O -26790
+~A :O -26790
+~A OE -26790
+~A /O -26790
+~A U -26790
+~A u0055_030B -26790
+~A u0055_030A -26790
+~A `U -26790
+~A 'U -26790
+~A ^U -26790
+~A :U -26790
+~A T -80371
+~A u0054_030C -80371
+~A u0054_0327 -80371
+~A Y -80371
+~A :Y -80371
+~A 'Y -80371
+~A V -107162
+~A W -107162
+~A e -53581
+~A u0065_030C -53581
+~A u0065_0328 -53581
+~A `e -53581
+~A 'e -53581
+~A ^e -53581
+~A :e -53581
+~A a -53581
+~A u0061_0306 -53581
+~A u0061_0328 -53581
+~A `a -53581
+~A 'a -53581
+~A ^a -53581
+~A ^a -53581
+~A ~a -53581
+~A :a -53581
+~A oa -53581
+~A ae -53581
+~A o -53581
+~A u006F_030B -53581
+~A `o -53581
+~A 'o -53581
+~A ^o -53581
+~A ~o -53581
+~A :o -53581
+~A oe -53581
+~A /o -53581
+~A d -53581
+~A u0111 -53581
+~A c -53581
+~A 'c -53581
+~A u0063_030C -53581
+~A ,c -53581
+~A g -53581
+~A u0067_0306 -53581
+~A q -53581
+:A y -26790
+:A :y -26790
+:A 'y -26790
+:A n -26790
+:A u006E_0301 -26790
+:A u006E_030C -26790
+:A u016A -26790
+:A ~n -26790
+:A l -26790
+:A u006C_0301 -26790
+:A u006C_030C -26790
+:A r -26790
+:A u -26790
+:A u0075_030B -26790
+:A u0075_030A -26790
+:A `u -26790
+:A 'u -26790
+:A ^u -26790
+:A :u -26790
+:A m -26790
+:A t -26790
+:A u0074_030C -26790
+:A u0074_0327 -26790
+:A i -26790
+:A 'i -26790
+:A h -26790
+:A b -26790
+:A k -26790
+:A v -26790
+:A w -26790
+:A C -26790
+:A G -26790
+:A 'C -26790
+:A u0043_030C -26790
+:A u0047_0306 -26790
+:A ,C -26790
+:A Q -26790
+:A O -26790
+:A u004F_030B -26790
+:A `O -26790
+:A 'O -26790
+:A ^O -26790
+:A ~O -26790
+:A :O -26790
+:A OE -26790
+:A /O -26790
+:A U -26790
+:A u0055_030B -26790
+:A u0055_030A -26790
+:A `U -26790
+:A 'U -26790
+:A ^U -26790
+:A :U -26790
+:A T -80371
+:A u0054_030C -80371
+:A u0054_0327 -80371
+:A Y -80371
+:A :Y -80371
+:A 'Y -80371
+:A V -107162
+:A W -107162
+:A e -53581
+:A u0065_030C -53581
+:A u0065_0328 -53581
+:A `e -53581
+:A 'e -53581
+:A ^e -53581
+:A :e -53581
+:A a -53581
+:A u0061_0306 -53581
+:A u0061_0328 -53581
+:A `a -53581
+:A 'a -53581
+:A ^a -53581
+:A ^a -53581
+:A ~a -53581
+:A :a -53581
+:A oa -53581
+:A ae -53581
+:A o -53581
+:A u006F_030B -53581
+:A `o -53581
+:A 'o -53581
+:A ^o -53581
+:A ~o -53581
+:A :o -53581
+:A oe -53581
+:A /o -53581
+:A d -53581
+:A u0111 -53581
+:A c -53581
+:A 'c -53581
+:A u0063_030C -53581
+:A ,c -53581
+:A g -53581
+:A u0067_0306 -53581
+:A q -53581
+oA y -26790
+oA :y -26790
+oA 'y -26790
+oA n -26790
+oA u006E_0301 -26790
+oA u006E_030C -26790
+oA u016A -26790
+oA ~n -26790
+oA l -26790
+oA u006C_0301 -26790
+oA u006C_030C -26790
+oA r -26790
+oA u -26790
+oA u0075_030B -26790
+oA u0075_030A -26790
+oA `u -26790
+oA 'u -26790
+oA ^u -26790
+oA :u -26790
+oA m -26790
+oA t -26790
+oA u0074_030C -26790
+oA u0074_0327 -26790
+oA i -26790
+oA 'i -26790
+oA h -26790
+oA b -26790
+oA k -26790
+oA v -26790
+oA w -26790
+oA C -26790
+oA G -26790
+oA 'C -26790
+oA u0043_030C -26790
+oA u0047_0306 -26790
+oA ,C -26790
+oA Q -26790
+oA O -26790
+oA u004F_030B -26790
+oA `O -26790
+oA 'O -26790
+oA ^O -26790
+oA ~O -26790
+oA :O -26790
+oA OE -26790
+oA /O -26790
+oA U -26790
+oA u0055_030B -26790
+oA u0055_030A -26790
+oA `U -26790
+oA 'U -26790
+oA ^U -26790
+oA :U -26790
+oA T -80371
+oA u0054_030C -80371
+oA u0054_0327 -80371
+oA Y -80371
+oA :Y -80371
+oA 'Y -80371
+oA V -107162
+oA W -107162
+oA e -53581
+oA u0065_030C -53581
+oA u0065_0328 -53581
+oA `e -53581
+oA 'e -53581
+oA ^e -53581
+oA :e -53581
+oA a -53581
+oA u0061_0306 -53581
+oA u0061_0328 -53581
+oA `a -53581
+oA 'a -53581
+oA ^a -53581
+oA ^a -53581
+oA ~a -53581
+oA :a -53581
+oA oa -53581
+oA ae -53581
+oA o -53581
+oA u006F_030B -53581
+oA `o -53581
+oA 'o -53581
+oA ^o -53581
+oA ~o -53581
+oA :o -53581
+oA oe -53581
+oA /o -53581
+oA d -53581
+oA u0111 -53581
+oA c -53581
+oA 'c -53581
+oA u0063_030C -53581
+oA ,c -53581
+oA g -53581
+oA u0067_0306 -53581
+oA q -53581
+u0189 X -26790
+u0110 X -26790
+-D X -26790
+u0189 W -26790
+u0110 W -26790
+-D W -26790
+u0189 A -26790
+u0110 A -26790
+-D A -26790
+u0189 u0041_0306 -26790
+u0110 u0041_0306 -26790
+-D u0041_0306 -26790
+u0189 u0041_0328 -26790
+u0110 u0041_0328 -26790
+-D u0041_0328 -26790
+u0189 `A -26790
+u0110 `A -26790
+-D `A -26790
+u0189 'A -26790
+u0110 'A -26790
+-D 'A -26790
+u0189 ^A -26790
+u0110 ^A -26790
+-D ^A -26790
+u0189 ~A -26790
+u0110 ~A -26790
+-D ~A -26790
+u0189 :A -26790
+u0110 :A -26790
+-D :A -26790
+u0189 oA -26790
+u0110 oA -26790
+-D oA -26790
+u0189 AE -26790
+u0110 AE -26790
+-D AE -26790
+u0189 V -26790
+u0110 V -26790
+-D V -26790
+u0189 Y -26790
+u0110 Y -26790
+-D Y -26790
+u0189 :Y -26790
+u0110 :Y -26790
+-D :Y -26790
+u0189 'Y -26790
+u0110 'Y -26790
+-D 'Y -26790
+`O X -26790
+`O W -26790
+`O A -26790
+`O u0041_0306 -26790
+`O u0041_0328 -26790
+`O `A -26790
+`O 'A -26790
+`O ^A -26790
+`O ~A -26790
+`O :A -26790
+`O oA -26790
+`O AE -26790
+`O V -26790
+`O Y -26790
+`O :Y -26790
+`O 'Y -26790
+'O X -26790
+'O W -26790
+'O A -26790
+'O u0041_0306 -26790
+'O u0041_0328 -26790
+'O `A -26790
+'O 'A -26790
+'O ^A -26790
+'O ~A -26790
+'O :A -26790
+'O oA -26790
+'O AE -26790
+'O V -26790
+'O Y -26790
+'O :Y -26790
+'O 'Y -26790
+^O X -26790
+^O W -26790
+^O A -26790
+^O u0041_0306 -26790
+^O u0041_0328 -26790
+^O `A -26790
+^O 'A -26790
+^O ^A -26790
+^O ~A -26790
+^O :A -26790
+^O oA -26790
+^O AE -26790
+^O V -26790
+^O Y -26790
+^O :Y -26790
+^O 'Y -26790
+~O X -26790
+~O W -26790
+~O A -26790
+~O u0041_0306 -26790
+~O u0041_0328 -26790
+~O `A -26790
+~O 'A -26790
+~O ^A -26790
+~O ~A -26790
+~O :A -26790
+~O oA -26790
+~O AE -26790
+~O V -26790
+~O Y -26790
+~O :Y -26790
+~O 'Y -26790
+:O X -26790
+:O W -26790
+:O A -26790
+:O u0041_0306 -26790
+:O u0041_0328 -26790
+:O `A -26790
+:O 'A -26790
+:O ^A -26790
+:O ~A -26790
+:O :A -26790
+:O oA -26790
+:O AE -26790
+:O V -26790
+:O Y -26790
+:O :Y -26790
+:O 'Y -26790
+/O X -26790
+/O W -26790
+/O A -26790
+/O u0041_0306 -26790
+/O u0041_0328 -26790
+/O `A -26790
+/O 'A -26790
+/O ^A -26790
+/O ~A -26790
+/O :A -26790
+/O oA -26790
+/O AE -26790
+/O V -26790
+/O Y -26790
+/O :Y -26790
+/O 'Y -26790
+'Y e -80371
+'Y o -80371
+'Y r -80371
+'Y a -80371
+'Y u -80371
+'Y A -80371
+'Y u0041_0306 -80371
+'Y u0041_0328 -80371
+'Y `A -80371
+'Y 'A -80371
+'Y ^A -80371
+'Y ~A -80371
+'Y :A -80371
+'Y oA -80371
+'Y AE -80371
+`e e -53581
+`e u0065_030C -53581
+`e u0065_0328 -53581
+`e `e -53581
+`e 'e -53581
+`e ^e -53581
+`e :e -53581
+`e a -53581
+`e u0061_0306 -53581
+`e u0061_0328 -53581
+`e `a -53581
+`e 'a -53581
+`e ^a -53581
+`e ^a -53581
+`e ~a -53581
+`e :a -53581
+`e oa -53581
+`e ae -53581
+`e o -53581
+`e u006F_030B -53581
+`e `o -53581
+`e 'o -53581
+`e ^o -53581
+`e ~o -53581
+`e :o -53581
+`e oe -53581
+`e /o -53581
+`e d -53581
+`e u0111 -53581
+`e c -53581
+`e 'c -53581
+`e u0063_030C -53581
+`e ,c -53581
+`e g -53581
+`e u0067_0306 -53581
+`e q -53581
+'e e -53581
+'e u0065_030C -53581
+'e u0065_0328 -53581
+'e `e -53581
+'e 'e -53581
+'e ^e -53581
+'e :e -53581
+'e a -53581
+'e u0061_0306 -53581
+'e u0061_0328 -53581
+'e `a -53581
+'e 'a -53581
+'e ^a -53581
+'e ^a -53581
+'e ~a -53581
+'e :a -53581
+'e oa -53581
+'e ae -53581
+'e o -53581
+'e u006F_030B -53581
+'e `o -53581
+'e 'o -53581
+'e ^o -53581
+'e ~o -53581
+'e :o -53581
+'e oe -53581
+'e /o -53581
+'e d -53581
+'e u0111 -53581
+'e c -53581
+'e 'c -53581
+'e u0063_030C -53581
+'e ,c -53581
+'e g -53581
+'e u0067_0306 -53581
+'e q -53581
+^e e -53581
+^e u0065_030C -53581
+^e u0065_0328 -53581
+^e `e -53581
+^e 'e -53581
+^e ^e -53581
+^e :e -53581
+^e a -53581
+^e u0061_0306 -53581
+^e u0061_0328 -53581
+^e `a -53581
+^e 'a -53581
+^e ^a -53581
+^e ^a -53581
+^e ~a -53581
+^e :a -53581
+^e oa -53581
+^e ae -53581
+^e o -53581
+^e u006F_030B -53581
+^e `o -53581
+^e 'o -53581
+^e ^o -53581
+^e ~o -53581
+^e :o -53581
+^e oe -53581
+^e /o -53581
+^e d -53581
+^e u0111 -53581
+^e c -53581
+^e 'c -53581
+^e u0063_030C -53581
+^e ,c -53581
+^e g -53581
+^e u0067_0306 -53581
+^e q -53581
+:e e -53581
+:e u0065_030C -53581
+:e u0065_0328 -53581
+:e `e -53581
+:e 'e -53581
+:e ^e -53581
+:e :e -53581
+:e a -53581
+:e u0061_0306 -53581
+:e u0061_0328 -53581
+:e `a -53581
+:e 'a -53581
+:e ^a -53581
+:e ^a -53581
+:e ~a -53581
+:e :a -53581
+:e oa -53581
+:e ae -53581
+:e o -53581
+:e u006F_030B -53581
+:e `o -53581
+:e 'o -53581
+:e ^o -53581
+:e ~o -53581
+:e :o -53581
+:e oe -53581
+:e /o -53581
+:e d -53581
+:e u0111 -53581
+:e c -53581
+:e 'c -53581
+:e u0063_030C -53581
+:e ,c -53581
+:e g -53581
+:e u0067_0306 -53581
+:e q -53581
+`o e -53581
+`o u0065_030C -53581
+`o u0065_0328 -53581
+`o `e -53581
+`o 'e -53581
+`o ^e -53581
+`o :e -53581
+`o a -53581
+`o u0061_0306 -53581
+`o u0061_0328 -53581
+`o `a -53581
+`o 'a -53581
+`o ^a -53581
+`o ^a -53581
+`o ~a -53581
+`o :a -53581
+`o oa -53581
+`o ae -53581
+`o o -53581
+`o u006F_030B -53581
+`o `o -53581
+`o 'o -53581
+`o ^o -53581
+`o ~o -53581
+`o :o -53581
+`o oe -53581
+`o /o -53581
+`o d -53581
+`o u0111 -53581
+`o c -53581
+`o 'c -53581
+`o u0063_030C -53581
+`o ,c -53581
+`o g -53581
+`o u0067_0306 -53581
+`o q -53581
+'o e -53581
+'o u0065_030C -53581
+'o u0065_0328 -53581
+'o `e -53581
+'o 'e -53581
+'o ^e -53581
+'o :e -53581
+'o a -53581
+'o u0061_0306 -53581
+'o u0061_0328 -53581
+'o `a -53581
+'o 'a -53581
+'o ^a -53581
+'o ^a -53581
+'o ~a -53581
+'o :a -53581
+'o oa -53581
+'o ae -53581
+'o o -53581
+'o u006F_030B -53581
+'o `o -53581
+'o 'o -53581
+'o ^o -53581
+'o ~o -53581
+'o :o -53581
+'o oe -53581
+'o /o -53581
+'o d -53581
+'o u0111 -53581
+'o c -53581
+'o 'c -53581
+'o u0063_030C -53581
+'o ,c -53581
+'o g -53581
+'o u0067_0306 -53581
+'o q -53581
+^o e -53581
+^o u0065_030C -53581
+^o u0065_0328 -53581
+^o `e -53581
+^o 'e -53581
+^o ^e -53581
+^o :e -53581
+^o a -53581
+^o u0061_0306 -53581
+^o u0061_0328 -53581
+^o `a -53581
+^o 'a -53581
+^o ^a -53581
+^o ^a -53581
+^o ~a -53581
+^o :a -53581
+^o oa -53581
+^o ae -53581
+^o o -53581
+^o u006F_030B -53581
+^o `o -53581
+^o 'o -53581
+^o ^o -53581
+^o ~o -53581
+^o :o -53581
+^o oe -53581
+^o /o -53581
+^o d -53581
+^o u0111 -53581
+^o c -53581
+^o 'c -53581
+^o u0063_030C -53581
+^o ,c -53581
+^o g -53581
+^o u0067_0306 -53581
+^o q -53581
+~o e -53581
+~o u0065_030C -53581
+~o u0065_0328 -53581
+~o `e -53581
+~o 'e -53581
+~o ^e -53581
+~o :e -53581
+~o a -53581
+~o u0061_0306 -53581
+~o u0061_0328 -53581
+~o `a -53581
+~o 'a -53581
+~o ^a -53581
+~o ^a -53581
+~o ~a -53581
+~o :a -53581
+~o oa -53581
+~o ae -53581
+~o o -53581
+~o u006F_030B -53581
+~o `o -53581
+~o 'o -53581
+~o ^o -53581
+~o ~o -53581
+~o :o -53581
+~o oe -53581
+~o /o -53581
+~o d -53581
+~o u0111 -53581
+~o c -53581
+~o 'c -53581
+~o u0063_030C -53581
+~o ,c -53581
+~o g -53581
+~o u0067_0306 -53581
+~o q -53581
+:o e -53581
+:o u0065_030C -53581
+:o u0065_0328 -53581
+:o `e -53581
+:o 'e -53581
+:o ^e -53581
+:o :e -53581
+:o a -53581
+:o u0061_0306 -53581
+:o u0061_0328 -53581
+:o `a -53581
+:o 'a -53581
+:o ^a -53581
+:o ^a -53581
+:o ~a -53581
+:o :a -53581
+:o oa -53581
+:o ae -53581
+:o o -53581
+:o u006F_030B -53581
+:o `o -53581
+:o 'o -53581
+:o ^o -53581
+:o ~o -53581
+:o :o -53581
+:o oe -53581
+:o /o -53581
+:o d -53581
+:o u0111 -53581
+:o c -53581
+:o 'c -53581
+:o u0063_030C -53581
+:o ,c -53581
+:o g -53581
+:o u0067_0306 -53581
+:o q -53581
+Tp e -53581
+Tp u0065_030C -53581
+Tp u0065_0328 -53581
+Tp `e -53581
+Tp 'e -53581
+Tp ^e -53581
+Tp :e -53581
+Tp a -53581
+Tp u0061_0306 -53581
+Tp u0061_0328 -53581
+Tp `a -53581
+Tp 'a -53581
+Tp ^a -53581
+Tp ^a -53581
+Tp ~a -53581
+Tp :a -53581
+Tp oa -53581
+Tp ae -53581
+Tp o -53581
+Tp u006F_030B -53581
+Tp `o -53581
+Tp 'o -53581
+Tp ^o -53581
+Tp ~o -53581
+Tp :o -53581
+Tp oe -53581
+Tp /o -53581
+Tp d -53581
+Tp u0111 -53581
+Tp c -53581
+Tp 'c -53581
+Tp u0063_030C -53581
+Tp ,c -53581
+Tp g -53581
+Tp u0067_0306 -53581
+Tp q -53581
+charset
+ga 535808,672672 2 0000
+aa 535808,672672,0,87069 2 0001
+a^ 482227,672672 2 0002
+a~ 535808,672672,0,113859 2 0003
+ad 535808,693578,0,107522 2 0004
+a" 535808,672672,0,113859 2 0005
+ao 852051,672672 2 0006
+ah 482227,672672 2 0007
+ab 535808,672672,0,98717 2 0010
+a- 535808,693578,0,132560 2 0011
+a. 321485,693578,0,123198 2 0012
+ac 482227,0,178360 1 0013
+ho 321485,0,203840 1 0014
+bq 321485,110656,203840 1 0015
+fo 482227,506688,0,73032 2 0016
+fc 482227,506688,0,73032 2 0017
+lq 378560,722176,0,176642 2 0020
+rq 378560,722176,0,73032 2 0021
+Bq 378560,110656,203840,73032 1 0022
+Fo 589389,506688,0,73032 2 0023
+Fc 589389,506688 2 0024
+en 535808,451360,0,96458 0 0025
+em 1071616,451360,0,96458 0 0026
+--- 0,451360 0 0027
+--- 428646,786240,58240,142979 3 0030
+.i 321485,451360,0,80419 0 0031
+.j 348275,451360,203840,39166 1 0032
+ff 642970,722176,203840,222186 3 0033
+fi 589389,722176,203840,108326 3 0034
+fl 616179,722176,203840,108326 3 0035
+Fi 924269,722176,203840,108326 3 0036
+Fl 937664,722176,203840,108326 3 0037
+u2423 535808,451360,101920,49941,0,24971 1 0040
+u01C3 321485,722176,0,130166 2 0041
+! "
+dq 535808,722176,0,90272 2 0042
+" "
+sh 857293,722176,203840,69362 3 0043
+# "
+Do 535808,786240,58240,142106 3 0044
+$ "
+% 857293,786240,58240,142979 3 0045
+& 803712,722176,0,101629 2 0046
+cq 321485,722176,0,130166 2 0047
+' "
+( 428646,786240,262080,169770 3 0050
+) 428646,786240,262080,38730 3 0051
+* 535808,786240,0,156374 2 0052
++ 803712,583565,59405,38730 3 0053
+, 321485,110656,203840 1 0054
+- 375066,451360,0,29630 0 0055
+. 321485,110656 0 0056
+sl 535808,786240,262080,169770 3 0057
+/ "
+0 535808,672672,0,142106 2 0060
+1 535808,672672,0,142106 2 0061
+2 535808,672672,0,142106 2 0062
+3 535808,672672,0,142106 2 0063
+4 535808,672672,203840,142106 3 0064
+5 535808,672672,0,142106 2 0065
+6 535808,672672,0,142106 2 0066
+7 535808,672672,0,142106 2 0067
+8 535808,672672,0,142106 2 0070
+9 535808,672672,0,142106 2 0071
+: 321485,451360,0,61006 0 0072
+; 321485,451360,203840,61006 1 0073
+< 803712,559216,40992,87707 3 0074
+= 803712,384606,-139554,69362 0 0075
+> 803712,559216,40992,11939 3 0076
+? 535808,722176,0,128419 2 0077
+at 803712,722176,0,100610 2 0100
+@ "
+A 779251,722176 2 0101
+B 737901,722176,0,107522,0,53763 2 0102
+C 750131,722176,0,152298,-80517,76149 2 0103
+D 791482,722176,0,98571,0,71781 2 0104
+E 711110,722176,0,126090,0,63045 2 0105
+F 684320,722176,0,139485,0,5533 2 0106
+G 810992,722176,0,91437,-80517,91437 2 0107
+H 779251,722176,0,171808,0,85904 2 0110
+I 404186,722176,0,165693,0,82846 2 0111
+J 550368,722176,0,147056,0,46738 2 0112
+K 806042,722176,0,152298,0,76149 2 0113
+L 657530,722176,0,0,0,53581 2 0114
+M 939994,722176,0,171808,0,59114 2 0115
+N 779251,722176,0,171808,0,59114 2 0116
+O 803712,722176,0,98571,-80517,71781 2 0117
+P 711110,722176,0,107522,0,-26426 2 0120
+Q 803712,722176,203840,98571,-80517,98571 3 0121
+R 764691,722176,0,40550,0,30413 2 0122
+S 589389,722176,0,125507,0,62754 2 0123
+T 750131,722176,0,139485,-134317,5533 2 0124
+U 779251,722176,0,171808,-121867,59114 2 0125
+V 779251,722176,0,192483,-138902,-21840 2 0126
+W 1047155,722176,0,192483,-138902,58531 2 0127
+X 779251,722176,0,165693,0,82846 2 0130
+Y 779251,722176,0,203198,-152298,-11125 2 0131
+Z 642970,722176,0,152298,0,76149 2 0132
+lB 321485,786240,262080,196560 3 0133
+[ "
+rs 535808,786240,262080 3 0134
+\ "
+rB 321485,786240,262080,110370 3 0135
+] "
+ha 642970,722176,0,69670 2 0136
+^ "
+_ 803712,0,244102 1 0137
+oq 321485,722176,0,130166 2 0140
+` "
+a 535808,451360,0,80419,-46666,80419 0 0141
+b 482227,722176,0,66174,-46666,66174 2 0142
+c 482227,451360,0,59259,-46666,59259 0 0143
+d 535808,722176,0,108326,-46666,108326 2 0144
+e 482227,451360,0,78770,-46666,78770 0 0145
+f 321485,722176,203840,222186,104541,112840 3 0146
+g 482227,451360,203840,92747,-21040,55134 1 0147
+h 535808,722176,0,80419,0,80419 2 0150
+i 321485,693578,0,106819,-32421,106819 2 0151
+j 321485,693578,203840,151664,50960,92747 3 0152
+k 482227,722176,0,112840,0,80419 2 0153
+l 267904,722176,0,108326,-26790,107210 2 0154
+m 857293,451360,0,80419,-32421,80419 0 0155
+n 589389,451360,0,80419,-32421,80419 0 0156
+o 535808,451360,0,66174,-46666,66174 0 0157
+p 535808,451360,203840,66174,-22714,66174 1 0160
+q 482227,451360,203840,92747,-46666,55134 1 0161
+r 442042,451360,0,112840,-32421,86050 0 0162
+s 428646,451360,0,86050,0,86050 0 0163
+t 348275,644802,0,99445,-45864,99445 2 0164
+u 562598,451360,0,80419,-32421,80419 0 0165
+v 482227,451360,0,112840,-32421,75227 0 0166
+w 696550,451360,0,112840,-32421,84630 0 0167
+x 486304,451360,0,126235,0,126235 0 0170
+y 509018,451360,203840,92747,-32421,55134 1 0171
+z 428646,451360,0,128856,0,80419 0 0172
+lC 535808,786240,262080,154627 3 0173
+{ "
+u01C0 321485,786240,262080,110370 3 0174
+ba "
+| "
+rC 535808,786240,262080,23587 3 0175
+} "
+~ 642970,693578,0,121451 2 0176
+hy 214323,451360,0,29630 0 0177
+u0041_0306 779251,934752 2 0200
+u0041_0328 779251,722176,203840 3 0201
+'C 750131,896954,0,152298 2 0202
+u0043_030C 750131,934752,0,152298,-80517,76149 2 0203
+u0044_030C 791482,934752,0,98571,0,71781 2 0204
+u0045_030C 711110,934752,0,126090,0,63045 2 0205
+u0045_0328 711110,722176,203840,126090 3 0206
+u0047_0306 810992,934752,0,91437,-80517,91437 2 0207
+u004C_0301 657530,896954,0,0,0,53581 2 0210
+u004C_030C 657530,934752,0,0,0,53581 2 0211
+/L 657530,722176 2 0212
+u004E_0301 779251,896954,0,171808 2 0213
+u004E_030C 779251,934752,0,171808,0,59114 2 0214
+u014A 818272,722176,0,179088,0,62754 2 0215
+u004F_030B 803712,896954,0,98571,-80517,71781 2 0216
+u0052_0301 764691,896954,0,40550,0,30413 2 0217
+u0052_030C 764691,934752,0,40550,0,30413 2 0220
+u0053_0301 589389,896954,0,125507 2 0221
+vS 589389,934752,0,125507,0,62754 2 0222
+u0053_0327 589389,722176,178360,125507,0,62754 3 0223
+u0054_030C 750131,934752,0,139485,-134317,5533 2 0224
+u0054_0327 750131,722176,178360,139485,-134317,5533 3 0225
+u0055_030B 779251,896954,0,171808,-121867,59114 2 0226
+u0055_030A 779251,934752,0,171808,-121867,59114 2 0227
+:Y 779251,934752,0,203198,-152298,-11125 2 0230
+u005A_0301 642970,896954,0,152298 2 0231
+vZ 642970,934752,0,152298,0,76149 2 0232
+u005A_0307 642970,896954,0,152298 2 0233
+IJ 886413,722176,0,147056,0,46738 2 0234
+u0049_0307 404186,896954,0,165693,0,82846 2 0235
+u0111 535808,722176,0,108326,-46666,108326 2 0236
+sc 482227,722176,203840 3 0237
+u0061_0306 535808,672672,0,80419,-46666,80419 2 0240
+u0061_0328 535808,451360,203840,80419 1 0241
+'c 482227,672672,0,59259 2 0242
+u0063_030C 482227,672672,0,59259,-46666,59259 2 0243
+u0064_030C 535808,722176,0,108326,-46666,108326 2 0244
+u0065_030C 482227,672672,0,78770,-46666,78770 2 0245
+u0065_0328 482227,451360,203840,78770 1 0246
+u0067_0306 482227,672672,203840,92747,-21040,55134 3 0247
+u006C_0301 267904,896954,0,108326,-26790,107210 2 0250
+u006C_030C 267904,722176,0,108326,-26790,107210 2 0251
+/l 334880,722176,0,108326 2 0252
+u006E_0301 589389,672672,0,80419 2 0253
+u006E_030C 589389,672672,0,80419,-32421,80419 2 0254
+u016A 589389,451360,203840,80419,-32421,80419 1 0255
+u006F_030B 535808,672672,0,66174,-46666,66174 2 0256
+u0072_0301 442042,672672,0,112840,-32421,86050 2 0257
+u0072_030C 442042,672672,0,112840,-32421,86050 2 0260
+u0073_0301 428646,672672,0,86050 2 0261
+vs 428646,672672,0,140650,0,140650 2 0262
+u0073_0327 428646,451360,178360,86050,0,86050 1 0263
+u0074_030C 348275,722176,0,99445,-45864,99445 2 0264
+u0074_0327 348275,644802,178360,99445,-45864,99445 3 0265
+u0075_030B 562598,672672,0,210246,-32421,210246 2 0266
+u0075_030A 562598,672672,0,80419,-32421,80419 2 0267
+:y 509018,672672,203840,92747,-32421,55134 3 0270
+u007A_0301 428646,672672,0,128856,0,80419 2 0271
+vz 428646,672672,0,128856,0,80419 2 0272
+u007A_0307 428646,693578,0,128856,0,80419 2 0273
+ij 589389,693578,203840,106819,50960,92747 3 0274
+r! 321485,524160,203840,79206 3 0275
+r? 535808,524160,203840 3 0276
+Po 806261,722176 2 0277
+`A 779251,896954 2 0300
+'A 779251,896954 2 0301
+^A 779251,934752 2 0302
+~A 779251,934752 2 0303
+:A 779251,934752 2 0304
+oA 779251,896954 2 0305
+AE 925434,722176,0,126090 2 0306
+,C 750131,722176,178360,152298,-80517,76149 3 0307
+`E 711110,896954,0,126090,0,63045 2 0310
+'E 711110,896954,0,126090,0,63045 2 0311
+^E 711110,934752,0,126090,0,63045 2 0312
+:E 711110,934752,0,126090 2 0313
+`I 404186,896954,0,165693,0,82846 2 0314
+'I 404186,896954,0,165693,0,82846 2 0315
+^I 404186,934752,0,165693,0,82846 2 0316
+:I 404186,934752,0,165693,0,82846 2 0317
+u0189 791482,722176,0,98571,0,71781 2 0320
+u0110 "
+-D "
+~N 779251,934752,0,171808,0,59114 2 0321
+`O 803712,896954,0,98571,-80517,71781 2 0322
+'O 803712,896954,0,98571 2 0323
+^O 803712,934752,0,98571,-80517,71781 2 0324
+~O 803712,934752,0,98571,-80517,71781 2 0325
+:O 803712,934752,0,98571,-80517,71781 2 0326
+OE 1032595,722176,0,126090 2 0327
+/O 803712,767312,50960,98571 3 0330
+`U 779251,896954,0,171808,-121867,59114 2 0331
+'U 779251,896954,0,171808 2 0332
+^U 779251,934752,0,171808,-121867,59114 2 0333
+:U 779251,934752,0,171808,-121867,59114 2 0334
+'Y 779251,896954,0,203198,-152298,-11125 2 0335
+TP 657530,722176,0,107522,0,53763 2 0336
+--- 1125197,722176,0,125507,0,62754 2 0337
+`a 535808,672672,0,80419,-46666,80419 2 0340
+'a 535808,672672,0,80419,-46666,80419 2 0341
+^a 535808,672672,0,80419,-46666,80419 2 0342
+~a 535808,672672,0,80419,-46666,80419 2 0343
+:a 535808,672672,0,80419,-46666,80419 2 0344
+oa 535808,672672,0,80419,-46666,80419 2 0345
+ae 750131,451360,0,78770 0 0346
+,c 482227,451360,178360,59259,-46666,59259 1 0347
+`e 482227,672672,0,78770,-46666,78770 2 0350
+'e 482227,672672,0,78770,-46666,78770 2 0351
+^e 482227,672672,0,78770,-46666,78770 2 0352
+:e 482227,672672,0,78770,-46666,78770 2 0353
+`i 321485,672672,0,80419 2 0354
+'i 321485,672672,0,80419 2 0355
+^i 321485,672672,0,80419 2 0356
+:i 321485,672672,0,80419 2 0357
+Sd 535808,722176,0,112840 2 0360
+~n 589389,672672,0,80419,-32421,80419 2 0361
+`o 535808,672672,0,66174,-46666,66174 2 0362
+'o 535808,672672,0,66174,-46666,66174 2 0363
+^o 535808,672672,0,66174,-46666,66174 2 0364
+~o 535808,672672,0,66174,-46666,66174 2 0365
+:o 535808,672672,0,66174,-46666,66174 2 0366
+oe 750131,451360,0,78770 0 0367
+/o 535808,559216,101920,96458 3 0370
+`u 562598,672672,0,80419,-32421,80419 2 0371
+'u 562598,672672,0,80419,-32421,80419 2 0372
+^u 562598,672672,0,80419,-32421,80419 2 0373
+:u 562598,672672,0,80419,-32421,80419 2 0374
+'y 509018,672672,203840,92747,-32421,55134 3 0375
+Tp 535808,722176,203840,66174 3 0376
+ss 562598,722176,203840,110218 3 0377
diff --git a/font/devdvi/TITC b/font/devdvi/TITC
new file mode 100644
index 0000000..c050c97
--- /dev/null
+++ b/font/devdvi/TITC
@@ -0,0 +1,138 @@
+name TITC
+special
+internalname tcti1000
+spacewidth 375066
+slant 14.036243
+checksum 427649518
+designsize 10485760
+charset
+--- 535808,634477 2 0000
+--- 535808,634477,0,79074 2 0001
+--- 535808,672672,0,62390 2 0002
+--- 535808,672672,0,113859 2 0003
+--- 535808,672672 2 0004
+--- 535808,634477,0,105864 2 0005
+--- 779251,672672 2 0006
+--- 535808,672672 2 0007
+--- 535808,672672,0,98717 2 0010
+--- 535808,672672,0,127254 2 0011
+--- 321485,634477 2 0012
+--- 482227,0,178360 1 0013
+--- 321485,0,203840 1 0014
+--- 428646,110656,203840 1 0015
+--- 535808,110656,203840 1 0022
+--- 750131,450486,0,96528 0 0025
+--- 830502,450486,0,96528 0 0026
+--- 0,716352 2 0027
+<- 1018035,384606,-139554 0 0030
+-> 1018035,384606,-139554 0 0031
+--- 321485,728000,0,454288 2 0032
+--- 375066,992992,0,510522 2 0033
+--- 535808,728000,0,454288 2 0034
+--- 535808,728000,0,510522 2 0035
+--- 0,728000 2 0037
+u2422 482227,728000,0,66174,-46666,66174 2 0040
+Do 535808,786240,58240,142106 3 0044
+$ "
+aq 321485,728000,0,117062 2 0047
+--- 535808,487760,-36400 2 0052
+, 321485,110656,203840 1 0054
+--- 375066,384606,-139554,69362 0 0055
+. 321485,110656 0 0056
+f/ 535808,786240,262080,169770 3 0057
+0 535808,450486,0,68272 0 0060
+1 535808,450486 0 0061
+2 535808,450486,0,68840 0 0062
+3 535808,450486,203840,68840 1 0063
+4 535808,450486,203840,12376 1 0064
+5 535808,450486,203840,59259 1 0065
+6 535808,672672,0,115315 2 0066
+7 535808,450486,203840,112840 1 0067
+8 535808,672672,0,115315 2 0070
+9 535808,450486,203840,59259 1 0071
+la 428646,786240,262080 3 0074
+\- 803712,581944,59405,38730 3 0075
+ra 428646,786240,262080 3 0076
+u2127 750131,716352,0,160334,0,80168 2 0115
+ci 1125197,786240,262080 3 0117
+u03A9 750131,716352,0,107526,0,53763 2 0127
+u301A 442042,786240,262080 3 0133
+u301B 442042,786240,262080 3 0135
+ua 535808,728000,203840,96387 3 0136
+da 535808,728000,203840 3 0137
+--- 535808,728000 2 0140
+--- 535808,487760,-36400 2 0142
+--- 535808,487760,-36400 2 0143
+--- 535808,634477,27666 3 0144
+--- 1018035,728000 2 0154
+--- 535808,487760,-36400 2 0155
+u266A 589389,728000 2 0156
+ti 642970,128960 0 0176
+~ "
+--- 214323,384606,-139554,69362 0 0177
+--- 642970,728000,0,113277 2 0200
+--- 642970,728000,0,104250 2 0201
+--- 535808,728000,0,128419 2 0202
+--- 535808,728000 2 0203
+dg 482227,728000,203840 3 0204
+dd 482227,728000,203840 3 0205
+u2016 535808,786240,262080 3 0206
+%0 1178778,786240,58240,142979 3 0207
+bu 535808,450486,-74547 0 0210
+u2103 964454,716352,0,152298,-80517,76149 2 0211
+--- 642970,786240,58240,142106 3 0212
+--- 535808,548426,101920,102125 3 0213
+Fn 321485,728000,203840,222186,104541,112840 3 0214
+u20A1 750131,786240,58240,152298,-80517,76149 3 0215
+u20A9 1047155,716352,0,192483,-138902,58531 2 0216
+u20A6 806042,716352,0,171808,0,59114 2 0217
+--- 810992,786240,58240,91437,-80517,91437 3 0220
+u20B1 724506,716352,0,107526,0,-26426 2 0221
+u20A4 806261,728000 2 0222
+u211E 764691,716352,0,40550,0,30413 2 0223
+u203D 589389,728000,0,128419 2 0224
+--- 535808,524160,203840 3 0225
+u20AB 535808,786240,0,122886,-46666,122886 2 0226
+tm 696550,786240,0,550366 2 0227
+u2031 1515405,786240,58240,142979 3 0230
+--- 509018,728000,203840 3 0231
+u0E3F 737901,786240,58240,107526,0,53763 3 0232
+u2116 937373,716352,0,171808,0,59114 2 0233
+u2052 535808,786240,0,169770 2 0234
+u212E 705869,716352,0,136106 2 0235
+u25E6 535808,450486,-74547 0 0236
+u2120 696550,786240,0,550366 2 0237
+u2045 401856,786240,262080,23587 3 0240
+u2046 401856,786240,262080,154627 3 0241
+ct 535808,548426,101920,102125 3 0242
+Po 806261,728000 2 0243
+Cs 816510,581944,0,112840 2 0244
+Ye 779251,716352,0,203198 2 0245
+bb 214323,786240,262080,142979 3 0246
+sc 482227,728000,203840 3 0247
+--- 535808,700130,0,109803 2 0250
+co 1125197,786240,262080 3 0251
+Of 482227,786240,0,137592 2 0252
+--- 1125197,786240,262080 3 0253
+tno 696550,450486,0,86050 0 0254
+u2117 1125197,786240,262080 3 0255
+rg 1125197,786240,262080 3 0256
+--- 803712,728000 2 0257
+de 375066,716352 2 0260
+t+- 803712,581944,59405,38730 3 0261
+S2 482227,786240,0,169770 2 0262
+S3 482227,786240,0,169770 2 0263
+--- 535808,728000,0,101629 2 0264
+mc 535808,450486,203840,80419,30867,80419 1 0265
+ps 642970,728000,203840 3 0266
+pc 321485,450486 0 0267
+u203B 704314,548426,0,29630 2 0270
+S1 482227,786240,0,169770 2 0271
+Om 482227,786240,0,137592 2 0272
+sr 482227,786240,220138,196560 3 0273
+--- 482227,786240,203840,169770 3 0274
+--- 482227,786240,203840,169770 3 0275
+--- 482227,786240,203840,169770 3 0276
+Eu 803712,716352,0,126090 2 0277
+tmu 803712,581944,59405,38730 3 0326
+tdi 803712,581944,59405,38730 3 0366
diff --git a/font/devdvi/TR b/font/devdvi/TR
new file mode 100644
index 0000000..64f457b
--- /dev/null
+++ b/font/devdvi/TR
@@ -0,0 +1,431 @@
+#
+# manually added kerning for `` and ''
+#
+name TR
+special
+internalname cmr10
+spacewidth 349526
+ligatures ff fi fl ffi ffl 0
+checksum 1274110073
+designsize 10485760
+kernpairs
+ff cq 81557
+ff ' 81557
+ff ? 81557
+ff ! 81557
+ff ) 81557
+ff rB 81557
+ff ] 81557
+' ' -87382
+cq ' -87382
+' cq -87382
+cq cq -87382
+slash@for@l l -291272
+slash@for@l L -334963
+cq ? 116509
+' ? 116509
+cq ! 116509
+' ! 116509
+*A t -29128
+A t -29128
+*A C -29128
+A C -29128
+*A *O -29128
+*A O -29128
+A *O -29128
+A O -29128
+*A G -29128
+A G -29128
+*A U -29128
+A U -29128
+*A Q -29128
+A Q -29128
+*A *T -87382
+*A T -87382
+A *T -87382
+A T -87382
+*A Y -87382
+A Y -87382
+*A V -116509
+A V -116509
+*A W -116509
+A W -116509
+D *X -29128
+D X -29128
+D W -29128
+D *A -29128
+D A -29128
+D V -29128
+D Y -29128
+F o -87382
+F e -87382
+F u -87382
+F r -87382
+F a -87382
+F *A -116509
+F A -116509
+F *O -29128
+F O -29128
+F C -29128
+F G -29128
+F Q -29128
+*I *I 29128
+*I I 29128
+I *I 29128
+I I 29128
+*K *O -29128
+*K O -29128
+K *O -29128
+K O -29128
+*K C -29128
+K C -29128
+*K G -29128
+K G -29128
+*K Q -29128
+K Q -29128
+L *T -87382
+L T -87382
+L Y -87382
+L V -116509
+L W -116509
+*O *X -29128
+*O X -29128
+O *X -29128
+O X -29128
+*O W -29128
+O W -29128
+*O *A -29128
+*O A -29128
+O *A -29128
+O A -29128
+*O V -29128
+O V -29128
+*O Y -29128
+O Y -29128
+*R *A -87382
+*R A -87382
+P *A -87382
+P A -87382
+*R o -29128
+P o -29128
+*R e -29128
+P e -29128
+*R a -29128
+P a -29128
+*R . -87382
+P . -87382
+*R , -87382
+P , -87382
+R t -29128
+R C -29128
+R *O -29128
+R O -29128
+R G -29128
+R U -29128
+R Q -29128
+R *T -87382
+R T -87382
+R Y -87382
+R V -116509
+R W -116509
+*T y -29128
+T y -29128
+*T e -87382
+T e -87382
+*T o -87382
+T o -87382
+*T r -87382
+T r -87382
+*T a -87382
+T a -87382
+*T *A -87382
+*T A -87382
+T *A -87382
+T A -87382
+*T u -87382
+T u -87382
+V o -87382
+V e -87382
+V u -87382
+V r -87382
+V a -87382
+V *A -116509
+V A -116509
+V *O -29128
+V O -29128
+V C -29128
+V G -29128
+V Q -29128
+W o -87382
+W e -87382
+W u -87382
+W r -87382
+W a -87382
+W *A -116509
+W A -116509
+W *O -29128
+W O -29128
+W C -29128
+W G -29128
+W Q -29128
+*X *O -29128
+*X O -29128
+X *O -29128
+X O -29128
+*X C -29128
+X C -29128
+*X G -29128
+X G -29128
+*X Q -29128
+X Q -29128
+Y e -87382
+Y o -87382
+Y r -87382
+Y a -87382
+Y *A -87382
+Y A -87382
+Y u -87382
+oq oq -87382
+oq ` -87382
+` oq -87382
+` ` -87382
+a v -29128
+a j 58254
+a y -29128
+a w -29128
+b e 29128
+b o 29128
+b x -29128
+b d 29128
+b c 29128
+b q 29128
+b v -29128
+b j 58254
+b y -29128
+b w -29128
+c h -29128
+c k -29128
+f cq 81557
+f ' 81557
+f ? 81557
+f ! 81557
+f ) 81557
+f rB 81557
+f ] 81557
+g j 29128
+h t -29128
+h u -29128
+h b -29128
+h y -29128
+h v -29128
+h w -29128
+k a -58254
+k e -29128
+k a -29128
+k o -29128
+k c -29128
+m t -29128
+m u -29128
+m b -29128
+m y -29128
+m v -29128
+m w -29128
+n t -29128
+n u -29128
+n b -29128
+n y -29128
+n v -29128
+n w -29128
+o e 29128
+o o 29128
+o x -29128
+o d 29128
+o c 29128
+o q 29128
+o v -29128
+o j 58254
+o y -29128
+o w -29128
+p e 29128
+p o 29128
+p x -29128
+p d 29128
+p c 29128
+p q 29128
+p v -29128
+p j 58254
+p y -29128
+p w -29128
+t y -29128
+t w -29128
+u w -29128
+v a -58254
+v e -29128
+v a -29128
+v o -29128
+v c -29128
+w e -29128
+w a -29128
+w o -29128
+w c -29128
+y o -29128
+y e -29128
+y a -29128
+y . -87382
+y , -87382
+charset
+*G 655362,716526,0,0,0,-145637 2 0000
+*D 873816,716526 2 0001
+*H 815562,716526,0,0,-29128,-29128 2 0002
+*L 728179,716526 2 0003
+*C 699053,716526 2 0004
+*P 786434,716526 2 0005
+*S 757307,716526 2 0006
+*U 815562,716526,0,0,-29128,-145637 2 0007
+*F 757307,716526,0,0,-29128 2 0010
+*Q 815562,716526,0,0,-29128,-72818 2 0011
+*W 757307,716526 2 0012
+ff 611672,728178,0,81557 2 0013
+fi 582544,728178 2 0014
+fl 582544,728178 2 0015
+Fi 873816,728178 2 0016
+Fl 873816,728178 2 0017
+.i 291272,451470 0 0020
+.j 320400,451470,203890 1 0021
+ga 524290,728178 2 0022
+aa 524290,728178 2 0023
+ah 524290,659002 2 0024
+ab 524290,728178 2 0025
+a- 524290,595357 2 0026
+ao 786434,728178 2 0027
+ac 466035,0,178403 1 0030
+ss 524291,728178 2 0031
+ae 757307,451470 0 0032
+oe 815562,451470 0 0033
+/o 524290,553416,101946 3 0034
+AE 946634,716526 2 0035
+OE 1063142,716526 2 0036
+/O 815562,767499,50973 3 0037
+slash@for@l 291272,451470 0 0040
+! 291272,728178 2 0041
+rq 524290,728178 2 0042
+sh 873816,728178,203888 3 0043
+# "
+Do 524290,786432,58254 3 0044
+$ "
+% 873816,786432,58254 3 0045
+& 815562,728178 2 0046
+cq 291272,728178 2 0047
+' "
+( 407781,786432,262144 3 0050
+) 407781,786432,262144 3 0051
+* 524290,786432 2 0052
+pl 815562,611670,87382 3 0053
++ "
+, 291272,110683,203890 1 0054
+hy 349526,451470 0 0055
+- "
+. 291272,110683 0 0056
+sl 524290,786432,262144 3 0057
+/ "
+0 524290,675749 2 0060
+1 524290,675749 2 0061
+2 524290,675749 2 0062
+3 524290,675749 2 0063
+4 524290,675749 2 0064
+5 524290,675749 2 0065
+6 524290,675749 2 0066
+7 524290,675749 2 0067
+8 524290,675749 2 0070
+9 524290,675749 2 0071
+: 291272,451470 0 0072
+; 291272,451470,203890 1 0073
+r! 291272,524288,203890 3 0074
+eq 815562,384696,-139592 0 0075
+= "
+r? 495163,524288,203890 3 0076
+? 495163,728178 2 0077
+at 815562,728178 2 0100
+@ "
+*A 786434,716526 2 0101
+A "
+*B 742744,716526 2 0102
+B "
+C 757307,716526,0,0,-29128 2 0103
+D 800998,716526,0,0,0,-29128 2 0104
+*E 713616,716526 2 0105
+E "
+F 684490,716526,0,0,0,-145637 2 0106
+G 822843,716526,0,0,-29128 2 0107
+*Y 786434,716526 2 0110
+H "
+*I 378653,716526 2 0111
+I "
+J 538853,716526,0,0,0,-29128 2 0112
+*K 815562,716526 2 0113
+K "
+L 655362,716526,0,0,0,58254 2 0114
+*M 961197,716526 2 0115
+M "
+*N 786434,716526 2 0116
+N "
+*O 815562,716526,0,0,-29128,-29128 2 0117
+O "
+*R 713616,716526,0,0,0,-145637 2 0120
+P "
+Q 815562,716526,203890,0,-29128 3 0121
+R 771870,716526 2 0122
+S 582544,716526 2 0123
+*T 757307,716526,0,0,0,-145637 2 0124
+T "
+U 786434,716526,0,0,-14563 2 0125
+V 786434,716526,0,14563,43691,-218454 2 0126
+W 1077706,716526,0,14563,43691,-131074 2 0127
+*X 786434,716526 2 0130
+X "
+Y 786434,716526,0,26214,29128,-206803 2 0131
+*Z 640798,716526 2 0132
+Z "
+lB 291272,786432,262144 3 0133
+[ "
+lq 524290,728178 2 0134
+rB 291272,786432,262144 3 0135
+] "
+ha 524290,728178 2 0136
+^ "
+a^ "
+a. 291272,700301 2 0137
+oq 291272,728178 2 0140
+` "
+a 524290,451470 0 0141
+b 582544,728178 2 0142
+c 466035,451470 0 0143
+d 582544,728178 2 0144
+e 466035,451470 0 0145
+f 320400,728178,0,81557 2 0146
+g 524290,451470,203890,14563 1 0147
+h 582544,728178 2 0150
+i 291272,700301 2 0151
+j 320400,700301,203890 3 0152
+k 553418,728178 2 0153
+l 291272,728178 2 0154
+m 873816,451470 0 0155
+n 582544,451470 0 0156
+o 524290,451470 0 0157
+p 582544,451470,203890 1 0160
+q 553416,451470,203890 1 0161
+r 410694,451470 0 0162
+s 413606,451470 0 0163
+t 407781,644958 2 0164
+u 582544,451470 0 0165
+v 553418,451470,0,14563 0 0166
+w 757307,451470,0,14563 0 0167
+x 553418,451470 0 0170
+y 553418,451470,203890,14563 1 0171
+z 466035,451470 0 0172
+en 524290,451470,0,29128 0 0173
+em 1048579,451470,0,29128 0 0174
+a" 524290,728178 2 0175
+~ 524290,700301 2 0176
+a~ "
+ad 524290,700301 2 0177
diff --git a/font/devdvi/TREC b/font/devdvi/TREC
new file mode 100644
index 0000000..01a391e
--- /dev/null
+++ b/font/devdvi/TREC
@@ -0,0 +1,2306 @@
+name TREC
+internalname ecrm1000
+spacewidth 349440
+ligatures ff fi fl ffi ffl 0
+checksum 204597937
+designsize 10485760
+kernpairs
+bq Bq 116480
+bq j 116480
+bq .j 116480
+bq g 58240
+bq u0067_0306 58240
+bq y 58240
+bq :y 58240
+bq 'y 58240
+bq v -87360
+bq w -58240
+bq V -116480
+bq W -87360
+bq Y -87360
+bq :Y -87360
+bq 'Y -87360
+bq O -29120
+bq u004F_030B -29120
+bq `O -29120
+bq 'O -29120
+bq ^O -29120
+bq ~O -29120
+bq :O -29120
+bq OE -29120
+bq /O -29120
+bq C -29120
+bq G -29120
+bq 'C -29120
+bq u0043_030C -29120
+bq u0047_0306 -29120
+bq ,C -29120
+bq Q -29120
+lq oq 116480
+lq ` 116480
+lq lq 116480
+rq cq 116480
+rq ' 116480
+rq rq 116480
+Bq bq 116480
+Bq , 116480
+Bq Bq 116480
+Bq j 116480
+Bq .j 116480
+Bq g 58240
+Bq u0067_0306 58240
+Bq y 58240
+Bq :y 58240
+Bq 'y 58240
+Bq v -87360
+Bq w -58240
+Bq V -116480
+Bq W -87360
+Bq Y -87360
+Bq :Y -87360
+Bq 'Y -87360
+Bq O -29120
+Bq u004F_030B -29120
+Bq `O -29120
+Bq 'O -29120
+Bq ^O -29120
+Bq ~O -29120
+Bq :O -29120
+Bq OE -29120
+Bq /O -29120
+Bq C -29120
+Bq G -29120
+Bq 'C -29120
+Bq u0043_030C -29120
+Bq u0047_0306 -29120
+Bq ,C -29120
+Bq Q -29120
+Fc . -87360
+Fc , -87360
+ff cq 81536
+ff ' 81536
+ff oq 81536
+ff ` 81536
+ff lq 81536
+ff rq 81536
+ff ? 81536
+ff u01C3 81536
+ff ! 81536
+ff ) 81536
+ff rB 81536
+ff ] 81536
+cq rq 116480
+' rq 116480
+cq ? 116480
+' ? 116480
+cq u01C3 116480
+cq ! 116480
+' u01C3 116480
+' ! 116480
+A y -87360
+A :y -87360
+A 'y -87360
+A v -116480
+A w -87360
+A c -29120
+A 'c -29120
+A u0063_030C -29120
+A ,c -29120
+A d -29120
+A u0064_030C -29120
+A u0111 -29120
+A Sd -29120
+A e -29120
+A u0065_030C -29120
+A u0065_0328 -29120
+A `e -29120
+A 'e -29120
+A ^e -29120
+A :e -29120
+A o -29120
+A u006F_030B -29120
+A `o -29120
+A 'o -29120
+A ^o -29120
+A ~o -29120
+A :o -29120
+A oe -29120
+A /o -29120
+A q -29120
+A t -29120
+A u0074_030C -29120
+A u0074_0327 -29120
+A C -29120
+A G -29120
+A 'C -29120
+A u0043_030C -29120
+A u0047_0306 -29120
+A ,C -29120
+A Q -29120
+A O -29120
+A u004F_030B -29120
+A `O -29120
+A 'O -29120
+A ^O -29120
+A ~O -29120
+A :O -29120
+A OE -29120
+A /O -29120
+A U -29120
+A u0055_030B -29120
+A u0055_030A -29120
+A `U -29120
+A 'U -29120
+A ^U -29120
+A :U -29120
+A T -87360
+A u0054_030C -87360
+A u0054_0327 -87360
+A Y -87360
+A :Y -87360
+A 'Y -87360
+A V -116480
+A W -116480
+D X -29120
+D W -29120
+D A -29120
+D u0041_0306 -29120
+D u0041_0328 -29120
+D `A -29120
+D 'A -29120
+D ^A -29120
+D ~A -29120
+D :A -29120
+D oA -29120
+D AE -29120
+D V -29120
+D Y -29120
+D :Y -29120
+D 'Y -29120
+F o -87360
+F a -87360
+F e -87360
+F y -87360
+F u -87360
+F r -87360
+F v -87360
+F s -87360
+F c -87360
+F d -87360
+F g -87360
+F m -87360
+F n -87360
+F p -87360
+F w -87360
+F z -87360
+F ae -87360
+F /o -87360
+F A -116480
+F u0041_0306 -116480
+F u0041_0328 -116480
+F `A -116480
+F 'A -116480
+F ^A -116480
+F ~A -116480
+F :A -116480
+F oA -116480
+F AE -116480
+F O -29120
+F u004F_030B -29120
+F `O -29120
+F 'O -29120
+F ^O -29120
+F ~O -29120
+F :O -29120
+F OE -29120
+F /O -29120
+F C -29120
+F G -29120
+F 'C -29120
+F u0043_030C -29120
+F u0047_0306 -29120
+F ,C -29120
+F Q -29120
+I I 29120
+K v -87360
+K w -29120
+K o -29120
+K u006F_030B -29120
+K `o -29120
+K 'o -29120
+K ^o -29120
+K ~o -29120
+K :o -29120
+K oe -29120
+K /o -29120
+K C -29120
+K G -29120
+K 'C -29120
+K u0043_030C -29120
+K u0047_0306 -29120
+K ,C -29120
+K Q -29120
+L T -87360
+L u0054_030C -87360
+L u0054_0327 -87360
+L Y -87360
+L :Y -87360
+L 'Y -87360
+L V -116480
+L W -116480
+O X -29120
+O W -29120
+O A -29120
+O u0041_0306 -29120
+O u0041_0328 -29120
+O `A -29120
+O 'A -29120
+O ^A -29120
+O ~A -29120
+O :A -29120
+O oA -29120
+O AE -29120
+O V -29120
+O Y -29120
+O :Y -29120
+O 'Y -29120
+P A -87360
+P u0041_0306 -87360
+P u0041_0328 -87360
+P `A -87360
+P 'A -87360
+P ^A -87360
+P ~A -87360
+P :A -87360
+P oA -87360
+P AE -87360
+P o -29120
+P u006F_030B -29120
+P `o -29120
+P 'o -29120
+P ^o -29120
+P ~o -29120
+P :o -29120
+P oe -29120
+P /o -29120
+P e -29120
+P u0065_030C -29120
+P u0065_0328 -29120
+P `e -29120
+P 'e -29120
+P ^e -29120
+P :e -29120
+P a -29120
+P u0061_0306 -29120
+P u0061_0328 -29120
+P `a -29120
+P 'a -29120
+P ^a -29120
+P ^a -29120
+P ~a -29120
+P :a -29120
+P oa -29120
+P ae -29120
+P . -87360
+P , -87360
+R t -29120
+R u0074_030C -29120
+R u0074_0327 -29120
+R C -29120
+R G -29120
+R 'C -29120
+R u0043_030C -29120
+R u0047_0306 -29120
+R ,C -29120
+R Q -29120
+R O -29120
+R u004F_030B -29120
+R `O -29120
+R 'O -29120
+R ^O -29120
+R ~O -29120
+R :O -29120
+R OE -29120
+R /O -29120
+R U -29120
+R u0055_030B -29120
+R u0055_030A -29120
+R `U -29120
+R 'U -29120
+R ^U -29120
+R :U -29120
+R T -87360
+R u0054_030C -87360
+R u0054_0327 -87360
+R Y -87360
+R :Y -87360
+R 'Y -87360
+R V -116480
+R W -116480
+T y -29120
+T e -87360
+T o -87360
+T r -87360
+T a -87360
+T u -87360
+T n -87360
+T .i -87360
+T c -87360
+T d -87360
+T g -87360
+T p -87360
+T s -87360
+T v -87360
+T w -87360
+T x -87360
+T z -87360
+T A -87360
+T u0041_0306 -87360
+T u0041_0328 -87360
+T `A -87360
+T 'A -87360
+T ^A -87360
+T ~A -87360
+T :A -87360
+T oA -87360
+T AE -87360
+V o -87360
+V a -87360
+V e -87360
+V y -87360
+V u -87360
+V r -87360
+V v -87360
+V s -87360
+V c -87360
+V d -87360
+V g -87360
+V m -87360
+V n -87360
+V p -87360
+V w -87360
+V z -87360
+V ae -87360
+V /o -87360
+V A -116480
+V u0041_0306 -116480
+V u0041_0328 -116480
+V `A -116480
+V 'A -116480
+V ^A -116480
+V ~A -116480
+V :A -116480
+V oA -116480
+V AE -116480
+V O -29120
+V u004F_030B -29120
+V `O -29120
+V 'O -29120
+V ^O -29120
+V ~O -29120
+V :O -29120
+V OE -29120
+V /O -29120
+V C -29120
+V G -29120
+V 'C -29120
+V u0043_030C -29120
+V u0047_0306 -29120
+V ,C -29120
+V Q -29120
+W o -87360
+W a -87360
+W e -87360
+W y -87360
+W u -87360
+W r -87360
+W v -87360
+W s -87360
+W c -87360
+W d -87360
+W g -87360
+W m -87360
+W n -87360
+W p -87360
+W w -87360
+W z -87360
+W ae -87360
+W /o -87360
+W A -116480
+W u0041_0306 -116480
+W u0041_0328 -116480
+W `A -116480
+W 'A -116480
+W ^A -116480
+W ~A -116480
+W :A -116480
+W oA -116480
+W AE -116480
+W O -29120
+W u004F_030B -29120
+W `O -29120
+W 'O -29120
+W ^O -29120
+W ~O -29120
+W :O -29120
+W OE -29120
+W /O -29120
+W C -29120
+W G -29120
+W 'C -29120
+W u0043_030C -29120
+W u0047_0306 -29120
+W ,C -29120
+W Q -29120
+X O -29120
+X u004F_030B -29120
+X `O -29120
+X 'O -29120
+X ^O -29120
+X ~O -29120
+X :O -29120
+X OE -29120
+X /O -29120
+X C -29120
+X G -29120
+X 'C -29120
+X u0043_030C -29120
+X u0047_0306 -29120
+X ,C -29120
+X Q -29120
+Y e -87360
+Y o -87360
+Y r -87360
+Y a -87360
+Y u -87360
+Y n -87360
+Y .i -87360
+Y c -87360
+Y d -87360
+Y g -87360
+Y p -87360
+Y s -87360
+Y v -87360
+Y w -87360
+Y x -87360
+Y z -87360
+Y A -87360
+Y u0041_0306 -87360
+Y u0041_0328 -87360
+Y `A -87360
+Y 'A -87360
+Y ^A -87360
+Y ~A -87360
+Y :A -87360
+Y oA -87360
+Y AE -87360
+oq lq 116480
+` lq 116480
+oq ? 116480
+` ? 116480
+oq u01C3 116480
+oq ! 116480
+` u01C3 116480
+` ! 116480
+a v -29120
+a j 58240
+a y -29120
+a :y -29120
+a 'y -29120
+a w -29120
+b e 29120
+b u0065_030C 29120
+b u0065_0328 29120
+b `e 29120
+b 'e 29120
+b ^e 29120
+b :e 29120
+b o 29120
+b u006F_030B 29120
+b `o 29120
+b 'o 29120
+b ^o 29120
+b ~o 29120
+b :o 29120
+b oe 29120
+b /o 29120
+b x -29120
+b d 29120
+b c 29120
+b 'c 29120
+b u0063_030C 29120
+b ,c 29120
+b q 29120
+b v -29120
+b j 58240
+b y -29120
+b :y -29120
+b 'y -29120
+b w -29120
+c h -29120
+c k -29120
+e V -87360
+f cq 81536
+f ' 81536
+f oq 81536
+f ` 81536
+f lq 81536
+f rq 81536
+f ? 81536
+f u01C3 81536
+f ! 81536
+f ) 81536
+f rB 81536
+f ] 81536
+g j 29120
+h W -87360
+h V -87360
+h t -29120
+h u -29120
+h u0075_030B -29120
+h u0075_030A -29120
+h `u -29120
+h 'u -29120
+h ^u -29120
+h :u -29120
+h b -29120
+h y -29120
+h v -29120
+h w -29120
+k W -87360
+k V -87360
+k a -58240
+k u0061_0306 -58240
+k u0061_0328 -58240
+k `a -58240
+k 'a -58240
+k ^a -58240
+k ^a -58240
+k ~a -58240
+k :a -58240
+k oa -58240
+k ae -58240
+k e -29120
+k u0065_030C -29120
+k u0065_0328 -29120
+k `e -29120
+k 'e -29120
+k ^e -29120
+k :e -29120
+k a -29120
+k u0061_0306 -29120
+k u0061_0328 -29120
+k `a -29120
+k 'a -29120
+k ^a -29120
+k ^a -29120
+k ~a -29120
+k :a -29120
+k oa -29120
+k ae -29120
+k o -29120
+k u006F_030B -29120
+k `o -29120
+k 'o -29120
+k ^o -29120
+k ~o -29120
+k :o -29120
+k oe -29120
+k /o -29120
+k c -29120
+k 'c -29120
+k u0063_030C -29120
+k ,c -29120
+m W -87360
+m V -87360
+m t -29120
+m u -29120
+m u0075_030B -29120
+m u0075_030A -29120
+m `u -29120
+m 'u -29120
+m ^u -29120
+m :u -29120
+m b -29120
+m y -29120
+m v -29120
+m w -29120
+n W -87360
+n V -87360
+n t -29120
+n u -29120
+n u0075_030B -29120
+n u0075_030A -29120
+n `u -29120
+n 'u -29120
+n ^u -29120
+n :u -29120
+n b -29120
+n y -29120
+n v -29120
+n w -29120
+o e 29120
+o u0065_030C 29120
+o u0065_0328 29120
+o `e 29120
+o 'e 29120
+o ^e 29120
+o :e 29120
+o o 29120
+o u006F_030B 29120
+o `o 29120
+o 'o 29120
+o ^o 29120
+o ~o 29120
+o :o 29120
+o oe 29120
+o /o 29120
+o x -29120
+o d 29120
+o c 29120
+o 'c 29120
+o u0063_030C 29120
+o ,c 29120
+o q 29120
+o v -29120
+o j 58240
+o y -29120
+o :y -29120
+o 'y -29120
+o w -29120
+p e 29120
+p u0065_030C 29120
+p u0065_0328 29120
+p `e 29120
+p 'e 29120
+p ^e 29120
+p :e 29120
+p o 29120
+p u006F_030B 29120
+p `o 29120
+p 'o 29120
+p ^o 29120
+p ~o 29120
+p :o 29120
+p oe 29120
+p /o 29120
+p x -29120
+p d 29120
+p c 29120
+p 'c 29120
+p u0063_030C 29120
+p ,c 29120
+p q 29120
+p v -29120
+p j 58240
+p y -29120
+p :y -29120
+p 'y -29120
+p w -29120
+t y -29120
+t :y -29120
+t 'y -29120
+t w -29120
+u w -29120
+v a -58240
+v u0061_0306 -58240
+v u0061_0328 -58240
+v `a -58240
+v 'a -58240
+v ^a -58240
+v ^a -58240
+v ~a -58240
+v :a -58240
+v oa -58240
+v ae -58240
+v e -29120
+v u0065_030C -29120
+v u0065_0328 -29120
+v `e -29120
+v 'e -29120
+v ^e -29120
+v :e -29120
+v a -29120
+v u0061_0306 -29120
+v u0061_0328 -29120
+v `a -29120
+v 'a -29120
+v ^a -29120
+v ^a -29120
+v ~a -29120
+v :a -29120
+v oa -29120
+v ae -29120
+v o -29120
+v u006F_030B -29120
+v `o -29120
+v 'o -29120
+v ^o -29120
+v ~o -29120
+v :o -29120
+v oe -29120
+v /o -29120
+v c -29120
+v 'c -29120
+v u0063_030C -29120
+v ,c -29120
+w e -29120
+w u0065_030C -29120
+w u0065_0328 -29120
+w `e -29120
+w 'e -29120
+w ^e -29120
+w :e -29120
+w a -29120
+w u0061_0306 -29120
+w u0061_0328 -29120
+w `a -29120
+w 'a -29120
+w ^a -29120
+w ^a -29120
+w ~a -29120
+w :a -29120
+w oa -29120
+w ae -29120
+w o -29120
+w u006F_030B -29120
+w `o -29120
+w 'o -29120
+w ^o -29120
+w ~o -29120
+w :o -29120
+w oe -29120
+w /o -29120
+w c -29120
+w 'c -29120
+w u0063_030C -29120
+w ,c -29120
+y o -29120
+y u006F_030B -29120
+y `o -29120
+y 'o -29120
+y ^o -29120
+y ~o -29120
+y :o -29120
+y oe -29120
+y /o -29120
+y e -29120
+y u0065_030C -29120
+y u0065_0328 -29120
+y `e -29120
+y 'e -29120
+y ^e -29120
+y :e -29120
+y a -29120
+y u0061_0306 -29120
+y u0061_0328 -29120
+y `a -29120
+y 'a -29120
+y ^a -29120
+y ^a -29120
+y ~a -29120
+y :a -29120
+y oa -29120
+y ae -29120
+y . -87360
+y , -87360
+u0041_0306 y -87360
+u0041_0306 :y -87360
+u0041_0306 'y -87360
+u0041_0306 v -116480
+u0041_0306 w -87360
+u0041_0306 c -29120
+u0041_0306 'c -29120
+u0041_0306 u0063_030C -29120
+u0041_0306 ,c -29120
+u0041_0306 d -29120
+u0041_0306 u0064_030C -29120
+u0041_0306 u0111 -29120
+u0041_0306 Sd -29120
+u0041_0306 e -29120
+u0041_0306 u0065_030C -29120
+u0041_0306 u0065_0328 -29120
+u0041_0306 `e -29120
+u0041_0306 'e -29120
+u0041_0306 ^e -29120
+u0041_0306 :e -29120
+u0041_0306 o -29120
+u0041_0306 u006F_030B -29120
+u0041_0306 `o -29120
+u0041_0306 'o -29120
+u0041_0306 ^o -29120
+u0041_0306 ~o -29120
+u0041_0306 :o -29120
+u0041_0306 oe -29120
+u0041_0306 /o -29120
+u0041_0306 q -29120
+u0041_0306 t -29120
+u0041_0306 u0074_030C -29120
+u0041_0306 u0074_0327 -29120
+u0041_0306 C -29120
+u0041_0306 G -29120
+u0041_0306 'C -29120
+u0041_0306 u0043_030C -29120
+u0041_0306 u0047_0306 -29120
+u0041_0306 ,C -29120
+u0041_0306 Q -29120
+u0041_0306 O -29120
+u0041_0306 u004F_030B -29120
+u0041_0306 `O -29120
+u0041_0306 'O -29120
+u0041_0306 ^O -29120
+u0041_0306 ~O -29120
+u0041_0306 :O -29120
+u0041_0306 OE -29120
+u0041_0306 /O -29120
+u0041_0306 U -29120
+u0041_0306 u0055_030B -29120
+u0041_0306 u0055_030A -29120
+u0041_0306 `U -29120
+u0041_0306 'U -29120
+u0041_0306 ^U -29120
+u0041_0306 :U -29120
+u0041_0306 T -87360
+u0041_0306 u0054_030C -87360
+u0041_0306 u0054_0327 -87360
+u0041_0306 Y -87360
+u0041_0306 :Y -87360
+u0041_0306 'Y -87360
+u0041_0306 V -116480
+u0041_0306 W -116480
+'C v -116480
+'C w -87360
+'C c -29120
+'C 'c -29120
+'C u0063_030C -29120
+'C ,c -29120
+'C d -29120
+'C u0064_030C -29120
+'C u0111 -29120
+'C Sd -29120
+'C e -29120
+'C u0065_030C -29120
+'C u0065_0328 -29120
+'C `e -29120
+'C 'e -29120
+'C ^e -29120
+'C :e -29120
+'C o -29120
+'C u006F_030B -29120
+'C `o -29120
+'C 'o -29120
+'C ^o -29120
+'C ~o -29120
+'C :o -29120
+'C oe -29120
+'C /o -29120
+'C q -29120
+'C t -29120
+'C u0074_030C -29120
+'C u0074_0327 -29120
+'C C -29120
+'C G -29120
+'C 'C -29120
+'C u0043_030C -29120
+'C u0047_0306 -29120
+'C ,C -29120
+'C Q -29120
+'C O -29120
+'C u004F_030B -29120
+'C `O -29120
+'C 'O -29120
+'C ^O -29120
+'C ~O -29120
+'C :O -29120
+'C OE -29120
+'C /O -29120
+'C U -29120
+'C u0055_030B -29120
+'C u0055_030A -29120
+'C `U -29120
+'C 'U -29120
+'C ^U -29120
+'C :U -29120
+'C T -87360
+'C u0054_030C -87360
+'C u0054_0327 -87360
+'C Y -87360
+'C :Y -87360
+'C 'Y -87360
+'C V -116480
+'C W -116480
+u0044_030C X -29120
+u0044_030C W -29120
+u0044_030C A -29120
+u0044_030C u0041_0306 -29120
+u0044_030C u0041_0328 -29120
+u0044_030C `A -29120
+u0044_030C 'A -29120
+u0044_030C ^A -29120
+u0044_030C ~A -29120
+u0044_030C :A -29120
+u0044_030C oA -29120
+u0044_030C AE -29120
+u0044_030C V -29120
+u0044_030C Y -29120
+u0044_030C :Y -29120
+u0044_030C 'Y -29120
+u004C_0301 T -87360
+u004C_0301 u0054_030C -87360
+u004C_0301 u0054_0327 -87360
+u004C_0301 Y -87360
+u004C_0301 :Y -87360
+u004C_0301 'Y -87360
+u004C_0301 V -116480
+u004C_0301 W -116480
+u004C_030C T -87360
+u004C_030C u0054_030C -87360
+u004C_030C u0054_0327 -87360
+u004C_030C Y -87360
+u004C_030C :Y -87360
+u004C_030C 'Y -87360
+u004C_030C V -116480
+u004C_030C W -116480
+/L T -87360
+/L u0054_030C -87360
+/L u0054_0327 -87360
+/L Y -87360
+/L :Y -87360
+/L 'Y -87360
+/L V -116480
+/L W -116480
+u004F_030B X -29120
+u004F_030B W -29120
+u004F_030B A -29120
+u004F_030B u0041_0306 -29120
+u004F_030B u0041_0328 -29120
+u004F_030B `A -29120
+u004F_030B 'A -29120
+u004F_030B ^A -29120
+u004F_030B ~A -29120
+u004F_030B :A -29120
+u004F_030B oA -29120
+u004F_030B AE -29120
+u004F_030B V -29120
+u004F_030B Y -29120
+u004F_030B :Y -29120
+u004F_030B 'Y -29120
+u0052_0301 t -29120
+u0052_0301 u0074_030C -29120
+u0052_0301 u0074_0327 -29120
+u0052_0301 C -29120
+u0052_0301 G -29120
+u0052_0301 'C -29120
+u0052_0301 u0043_030C -29120
+u0052_0301 u0047_0306 -29120
+u0052_0301 ,C -29120
+u0052_0301 Q -29120
+u0052_0301 O -29120
+u0052_0301 u004F_030B -29120
+u0052_0301 `O -29120
+u0052_0301 'O -29120
+u0052_0301 ^O -29120
+u0052_0301 ~O -29120
+u0052_0301 :O -29120
+u0052_0301 OE -29120
+u0052_0301 /O -29120
+u0052_0301 U -29120
+u0052_0301 u0055_030B -29120
+u0052_0301 u0055_030A -29120
+u0052_0301 `U -29120
+u0052_0301 'U -29120
+u0052_0301 ^U -29120
+u0052_0301 :U -29120
+u0052_0301 T -87360
+u0052_0301 u0054_030C -87360
+u0052_0301 u0054_0327 -87360
+u0052_0301 Y -87360
+u0052_0301 :Y -87360
+u0052_0301 'Y -87360
+u0052_0301 V -116480
+u0052_0301 W -116480
+u0054_030C y -29120
+u0054_030C e -87360
+u0054_030C o -87360
+u0054_030C r -87360
+u0054_030C a -87360
+u0054_030C u -87360
+u0054_030C n -87360
+u0054_030C .i -87360
+u0054_030C c -87360
+u0054_030C d -87360
+u0054_030C g -87360
+u0054_030C p -87360
+u0054_030C s -87360
+u0054_030C v -87360
+u0054_030C w -87360
+u0054_030C x -87360
+u0054_030C z -87360
+u0054_030C A -87360
+u0054_030C u0041_0306 -87360
+u0054_030C u0041_0328 -87360
+u0054_030C `A -87360
+u0054_030C 'A -87360
+u0054_030C ^A -87360
+u0054_030C ~A -87360
+u0054_030C :A -87360
+u0054_030C oA -87360
+u0054_030C AE -87360
+u0054_0327 y -29120
+u0054_0327 e -87360
+u0054_0327 o -87360
+u0054_0327 r -87360
+u0054_0327 a -87360
+u0054_0327 u -87360
+u0054_0327 n -87360
+u0054_0327 .i -87360
+u0054_0327 c -87360
+u0054_0327 d -87360
+u0054_0327 g -87360
+u0054_0327 p -87360
+u0054_0327 s -87360
+u0054_0327 v -87360
+u0054_0327 w -87360
+u0054_0327 x -87360
+u0054_0327 z -87360
+u0054_0327 A -87360
+u0054_0327 u0041_0306 -87360
+u0054_0327 u0041_0328 -87360
+u0054_0327 `A -87360
+u0054_0327 'A -87360
+u0054_0327 ^A -87360
+u0054_0327 ~A -87360
+u0054_0327 :A -87360
+u0054_0327 oA -87360
+u0054_0327 AE -87360
+:Y e -87360
+:Y o -87360
+:Y r -87360
+:Y a -87360
+:Y u -87360
+:Y n -87360
+:Y .i -87360
+:Y c -87360
+:Y d -87360
+:Y g -87360
+:Y p -87360
+:Y s -87360
+:Y v -87360
+:Y w -87360
+:Y x -87360
+:Y z -87360
+:Y A -87360
+:Y u0041_0306 -87360
+:Y u0041_0328 -87360
+:Y `A -87360
+:Y 'A -87360
+:Y ^A -87360
+:Y ~A -87360
+:Y :A -87360
+:Y oA -87360
+:Y AE -87360
+u0061_0306 v -29120
+u0061_0306 j 58240
+u0061_0306 y -29120
+u0061_0306 :y -29120
+u0061_0306 'y -29120
+u0061_0306 w -29120
+u0061_0328 g 29120
+u0061_0328 p 29120
+u0061_0328 w -29120
+'c h -29120
+'c k -29120
+u0063_030C h -29120
+u0063_030C k -29120
+/l cq 29120
+/l ' 29120
+u006E_0301 t -29120
+u006E_0301 u -29120
+u006E_0301 u0075_030B -29120
+u006E_0301 u0075_030A -29120
+u006E_0301 `u -29120
+u006E_0301 'u -29120
+u006E_0301 ^u -29120
+u006E_0301 :u -29120
+u006E_0301 b -29120
+u006E_0301 y -29120
+u006E_0301 v -29120
+u006E_0301 w -29120
+u006E_030C t -29120
+u006E_030C u -29120
+u006E_030C u0075_030B -29120
+u006E_030C u0075_030A -29120
+u006E_030C `u -29120
+u006E_030C 'u -29120
+u006E_030C ^u -29120
+u006E_030C :u -29120
+u006E_030C b -29120
+u006E_030C y -29120
+u006E_030C v -29120
+u006E_030C w -29120
+u016A t -29120
+u016A u -29120
+u016A u0075_030B -29120
+u016A u0075_030A -29120
+u016A `u -29120
+u016A 'u -29120
+u016A ^u -29120
+u016A :u -29120
+u016A b -29120
+u016A y -29120
+u016A v -29120
+u016A w -29120
+u006F_030B e 29120
+u006F_030B u0065_030C 29120
+u006F_030B u0065_0328 29120
+u006F_030B `e 29120
+u006F_030B 'e 29120
+u006F_030B ^e 29120
+u006F_030B :e 29120
+u006F_030B o 29120
+u006F_030B u006F_030B 29120
+u006F_030B `o 29120
+u006F_030B 'o 29120
+u006F_030B ^o 29120
+u006F_030B ~o 29120
+u006F_030B :o 29120
+u006F_030B oe 29120
+u006F_030B /o 29120
+u006F_030B x -29120
+u006F_030B d 29120
+u006F_030B c 29120
+u006F_030B 'c 29120
+u006F_030B u0063_030C 29120
+u006F_030B ,c 29120
+u006F_030B q 29120
+u006F_030B v -29120
+u006F_030B j 58240
+u006F_030B y -29120
+u006F_030B :y -29120
+u006F_030B 'y -29120
+u006F_030B w -29120
+u0074_030C y -29120
+u0074_030C :y -29120
+u0074_030C 'y -29120
+u0074_030C w -29120
+u0074_0327 y -29120
+u0074_0327 :y -29120
+u0074_0327 'y -29120
+u0074_0327 w -29120
+u0075_030B w -29120
+u0075_030A w -29120
+:y o -29120
+:y u006F_030B -29120
+:y `o -29120
+:y 'o -29120
+:y ^o -29120
+:y ~o -29120
+:y :o -29120
+:y oe -29120
+:y /o -29120
+:y e -29120
+:y u0065_030C -29120
+:y u0065_0328 -29120
+:y `e -29120
+:y 'e -29120
+:y ^e -29120
+:y :e -29120
+:y a -29120
+:y u0061_0306 -29120
+:y u0061_0328 -29120
+:y `a -29120
+:y 'a -29120
+:y ^a -29120
+:y ^a -29120
+:y ~a -29120
+:y :a -29120
+:y oa -29120
+:y ae -29120
+:y . -87360
+:y , -87360
+`A y -87360
+`A :y -87360
+`A 'y -87360
+`A v -116480
+`A w -87360
+`A c -29120
+`A 'c -29120
+`A u0063_030C -29120
+`A ,c -29120
+`A d -29120
+`A u0064_030C -29120
+`A u0111 -29120
+`A Sd -29120
+`A e -29120
+`A u0065_030C -29120
+`A u0065_0328 -29120
+`A `e -29120
+`A 'e -29120
+`A ^e -29120
+`A :e -29120
+`A o -29120
+`A u006F_030B -29120
+`A `o -29120
+`A 'o -29120
+`A ^o -29120
+`A ~o -29120
+`A :o -29120
+`A oe -29120
+`A /o -29120
+`A q -29120
+`A t -29120
+`A u0074_030C -29120
+`A u0074_0327 -29120
+`A C -29120
+`A G -29120
+`A 'C -29120
+`A u0043_030C -29120
+`A u0047_0306 -29120
+`A ,C -29120
+`A Q -29120
+`A O -29120
+`A u004F_030B -29120
+`A `O -29120
+`A 'O -29120
+`A ^O -29120
+`A ~O -29120
+`A :O -29120
+`A OE -29120
+`A /O -29120
+`A U -29120
+`A u0055_030B -29120
+`A u0055_030A -29120
+`A `U -29120
+`A 'U -29120
+`A ^U -29120
+`A :U -29120
+`A T -87360
+`A u0054_030C -87360
+`A u0054_0327 -87360
+`A Y -87360
+`A :Y -87360
+`A 'Y -87360
+`A V -116480
+`A W -116480
+'A y -87360
+'A :y -87360
+'A 'y -87360
+'A v -116480
+'A w -87360
+'A c -29120
+'A 'c -29120
+'A u0063_030C -29120
+'A ,c -29120
+'A d -29120
+'A u0064_030C -29120
+'A u0111 -29120
+'A Sd -29120
+'A e -29120
+'A u0065_030C -29120
+'A u0065_0328 -29120
+'A `e -29120
+'A 'e -29120
+'A ^e -29120
+'A :e -29120
+'A o -29120
+'A u006F_030B -29120
+'A `o -29120
+'A 'o -29120
+'A ^o -29120
+'A ~o -29120
+'A :o -29120
+'A oe -29120
+'A /o -29120
+'A q -29120
+'A t -29120
+'A u0074_030C -29120
+'A u0074_0327 -29120
+'A C -29120
+'A G -29120
+'A 'C -29120
+'A u0043_030C -29120
+'A u0047_0306 -29120
+'A ,C -29120
+'A Q -29120
+'A O -29120
+'A u004F_030B -29120
+'A `O -29120
+'A 'O -29120
+'A ^O -29120
+'A ~O -29120
+'A :O -29120
+'A OE -29120
+'A /O -29120
+'A U -29120
+'A u0055_030B -29120
+'A u0055_030A -29120
+'A `U -29120
+'A 'U -29120
+'A ^U -29120
+'A :U -29120
+'A T -87360
+'A u0054_030C -87360
+'A u0054_0327 -87360
+'A Y -87360
+'A :Y -87360
+'A 'Y -87360
+'A V -116480
+'A W -116480
+^A y -87360
+^A :y -87360
+^A 'y -87360
+^A v -116480
+^A w -87360
+^A c -29120
+^A 'c -29120
+^A u0063_030C -29120
+^A ,c -29120
+^A d -29120
+^A u0064_030C -29120
+^A u0111 -29120
+^A Sd -29120
+^A e -29120
+^A u0065_030C -29120
+^A u0065_0328 -29120
+^A `e -29120
+^A 'e -29120
+^A ^e -29120
+^A :e -29120
+^A o -29120
+^A u006F_030B -29120
+^A `o -29120
+^A 'o -29120
+^A ^o -29120
+^A ~o -29120
+^A :o -29120
+^A oe -29120
+^A /o -29120
+^A q -29120
+^A t -29120
+^A u0074_030C -29120
+^A u0074_0327 -29120
+^A C -29120
+^A G -29120
+^A 'C -29120
+^A u0043_030C -29120
+^A u0047_0306 -29120
+^A ,C -29120
+^A Q -29120
+^A O -29120
+^A u004F_030B -29120
+^A `O -29120
+^A 'O -29120
+^A ^O -29120
+^A ~O -29120
+^A :O -29120
+^A OE -29120
+^A /O -29120
+^A U -29120
+^A u0055_030B -29120
+^A u0055_030A -29120
+^A `U -29120
+^A 'U -29120
+^A ^U -29120
+^A :U -29120
+^A T -87360
+^A u0054_030C -87360
+^A u0054_0327 -87360
+^A Y -87360
+^A :Y -87360
+^A 'Y -87360
+^A V -116480
+^A W -116480
+~A y -87360
+~A :y -87360
+~A 'y -87360
+~A v -116480
+~A w -87360
+~A c -29120
+~A 'c -29120
+~A u0063_030C -29120
+~A ,c -29120
+~A d -29120
+~A u0064_030C -29120
+~A u0111 -29120
+~A Sd -29120
+~A e -29120
+~A u0065_030C -29120
+~A u0065_0328 -29120
+~A `e -29120
+~A 'e -29120
+~A ^e -29120
+~A :e -29120
+~A o -29120
+~A u006F_030B -29120
+~A `o -29120
+~A 'o -29120
+~A ^o -29120
+~A ~o -29120
+~A :o -29120
+~A oe -29120
+~A /o -29120
+~A q -29120
+~A t -29120
+~A u0074_030C -29120
+~A u0074_0327 -29120
+~A C -29120
+~A G -29120
+~A 'C -29120
+~A u0043_030C -29120
+~A u0047_0306 -29120
+~A ,C -29120
+~A Q -29120
+~A O -29120
+~A u004F_030B -29120
+~A `O -29120
+~A 'O -29120
+~A ^O -29120
+~A ~O -29120
+~A :O -29120
+~A OE -29120
+~A /O -29120
+~A U -29120
+~A u0055_030B -29120
+~A u0055_030A -29120
+~A `U -29120
+~A 'U -29120
+~A ^U -29120
+~A :U -29120
+~A T -87360
+~A u0054_030C -87360
+~A u0054_0327 -87360
+~A Y -87360
+~A :Y -87360
+~A 'Y -87360
+~A V -116480
+~A W -116480
+:A y -87360
+:A :y -87360
+:A 'y -87360
+:A v -116480
+:A w -87360
+:A c -29120
+:A 'c -29120
+:A u0063_030C -29120
+:A ,c -29120
+:A d -29120
+:A u0064_030C -29120
+:A u0111 -29120
+:A Sd -29120
+:A e -29120
+:A u0065_030C -29120
+:A u0065_0328 -29120
+:A `e -29120
+:A 'e -29120
+:A ^e -29120
+:A :e -29120
+:A o -29120
+:A u006F_030B -29120
+:A `o -29120
+:A 'o -29120
+:A ^o -29120
+:A ~o -29120
+:A :o -29120
+:A oe -29120
+:A /o -29120
+:A q -29120
+:A t -29120
+:A u0074_030C -29120
+:A u0074_0327 -29120
+:A C -29120
+:A G -29120
+:A 'C -29120
+:A u0043_030C -29120
+:A u0047_0306 -29120
+:A ,C -29120
+:A Q -29120
+:A O -29120
+:A u004F_030B -29120
+:A `O -29120
+:A 'O -29120
+:A ^O -29120
+:A ~O -29120
+:A :O -29120
+:A OE -29120
+:A /O -29120
+:A U -29120
+:A u0055_030B -29120
+:A u0055_030A -29120
+:A `U -29120
+:A 'U -29120
+:A ^U -29120
+:A :U -29120
+:A T -87360
+:A u0054_030C -87360
+:A u0054_0327 -87360
+:A Y -87360
+:A :Y -87360
+:A 'Y -87360
+:A V -116480
+:A W -116480
+oA y -87360
+oA :y -87360
+oA 'y -87360
+oA v -116480
+oA w -87360
+oA c -29120
+oA 'c -29120
+oA u0063_030C -29120
+oA ,c -29120
+oA d -29120
+oA u0064_030C -29120
+oA u0111 -29120
+oA Sd -29120
+oA e -29120
+oA u0065_030C -29120
+oA u0065_0328 -29120
+oA `e -29120
+oA 'e -29120
+oA ^e -29120
+oA :e -29120
+oA o -29120
+oA u006F_030B -29120
+oA `o -29120
+oA 'o -29120
+oA ^o -29120
+oA ~o -29120
+oA :o -29120
+oA oe -29120
+oA /o -29120
+oA q -29120
+oA t -29120
+oA u0074_030C -29120
+oA u0074_0327 -29120
+oA C -29120
+oA G -29120
+oA 'C -29120
+oA u0043_030C -29120
+oA u0047_0306 -29120
+oA ,C -29120
+oA Q -29120
+oA O -29120
+oA u004F_030B -29120
+oA `O -29120
+oA 'O -29120
+oA ^O -29120
+oA ~O -29120
+oA :O -29120
+oA OE -29120
+oA /O -29120
+oA U -29120
+oA u0055_030B -29120
+oA u0055_030A -29120
+oA `U -29120
+oA 'U -29120
+oA ^U -29120
+oA :U -29120
+oA T -87360
+oA u0054_030C -87360
+oA u0054_0327 -87360
+oA Y -87360
+oA :Y -87360
+oA 'Y -87360
+oA V -116480
+oA W -116480
+u0189 X -29120
+u0110 X -29120
+-D X -29120
+u0189 W -29120
+u0110 W -29120
+-D W -29120
+u0189 A -29120
+u0110 A -29120
+-D A -29120
+u0189 u0041_0306 -29120
+u0110 u0041_0306 -29120
+-D u0041_0306 -29120
+u0189 u0041_0328 -29120
+u0110 u0041_0328 -29120
+-D u0041_0328 -29120
+u0189 `A -29120
+u0110 `A -29120
+-D `A -29120
+u0189 'A -29120
+u0110 'A -29120
+-D 'A -29120
+u0189 ^A -29120
+u0110 ^A -29120
+-D ^A -29120
+u0189 ~A -29120
+u0110 ~A -29120
+-D ~A -29120
+u0189 :A -29120
+u0110 :A -29120
+-D :A -29120
+u0189 oA -29120
+u0110 oA -29120
+-D oA -29120
+u0189 AE -29120
+u0110 AE -29120
+-D AE -29120
+u0189 V -29120
+u0110 V -29120
+-D V -29120
+u0189 Y -29120
+u0110 Y -29120
+-D Y -29120
+u0189 :Y -29120
+u0110 :Y -29120
+-D :Y -29120
+u0189 'Y -29120
+u0110 'Y -29120
+-D 'Y -29120
+`O X -29120
+`O W -29120
+`O A -29120
+`O u0041_0306 -29120
+`O u0041_0328 -29120
+`O `A -29120
+`O 'A -29120
+`O ^A -29120
+`O ~A -29120
+`O :A -29120
+`O oA -29120
+`O AE -29120
+`O V -29120
+`O Y -29120
+`O :Y -29120
+`O 'Y -29120
+'O X -29120
+'O W -29120
+'O A -29120
+'O u0041_0306 -29120
+'O u0041_0328 -29120
+'O `A -29120
+'O 'A -29120
+'O ^A -29120
+'O ~A -29120
+'O :A -29120
+'O oA -29120
+'O AE -29120
+'O V -29120
+'O Y -29120
+'O :Y -29120
+'O 'Y -29120
+^O X -29120
+^O W -29120
+^O A -29120
+^O u0041_0306 -29120
+^O u0041_0328 -29120
+^O `A -29120
+^O 'A -29120
+^O ^A -29120
+^O ~A -29120
+^O :A -29120
+^O oA -29120
+^O AE -29120
+^O V -29120
+^O Y -29120
+^O :Y -29120
+^O 'Y -29120
+~O X -29120
+~O W -29120
+~O A -29120
+~O u0041_0306 -29120
+~O u0041_0328 -29120
+~O `A -29120
+~O 'A -29120
+~O ^A -29120
+~O ~A -29120
+~O :A -29120
+~O oA -29120
+~O AE -29120
+~O V -29120
+~O Y -29120
+~O :Y -29120
+~O 'Y -29120
+:O X -29120
+:O W -29120
+:O A -29120
+:O u0041_0306 -29120
+:O u0041_0328 -29120
+:O `A -29120
+:O 'A -29120
+:O ^A -29120
+:O ~A -29120
+:O :A -29120
+:O oA -29120
+:O AE -29120
+:O V -29120
+:O Y -29120
+:O :Y -29120
+:O 'Y -29120
+/O X -29120
+/O W -29120
+/O A -29120
+/O u0041_0306 -29120
+/O u0041_0328 -29120
+/O `A -29120
+/O 'A -29120
+/O ^A -29120
+/O ~A -29120
+/O :A -29120
+/O oA -29120
+/O AE -29120
+/O V -29120
+/O Y -29120
+/O :Y -29120
+/O 'Y -29120
+'Y e -87360
+'Y o -87360
+'Y r -87360
+'Y a -87360
+'Y u -87360
+'Y n -87360
+'Y .i -87360
+'Y c -87360
+'Y d -87360
+'Y g -87360
+'Y p -87360
+'Y s -87360
+'Y v -87360
+'Y w -87360
+'Y x -87360
+'Y z -87360
+'Y A -87360
+'Y u0041_0306 -87360
+'Y u0041_0328 -87360
+'Y `A -87360
+'Y 'A -87360
+'Y ^A -87360
+'Y ~A -87360
+'Y :A -87360
+'Y oA -87360
+'Y AE -87360
+`a v -29120
+`a j 58240
+`a y -29120
+`a :y -29120
+`a 'y -29120
+`a w -29120
+'a v -29120
+'a j 58240
+'a y -29120
+'a :y -29120
+'a 'y -29120
+'a w -29120
+^a v -29120
+^a j 58240
+^a y -29120
+^a :y -29120
+^a 'y -29120
+^a w -29120
+~a v -29120
+~a j 58240
+~a y -29120
+~a :y -29120
+~a 'y -29120
+~a w -29120
+:a v -29120
+:a j 58240
+:a y -29120
+:a :y -29120
+:a 'y -29120
+:a w -29120
+oa v -29120
+oa j 58240
+oa y -29120
+oa :y -29120
+oa 'y -29120
+oa w -29120
+,c h -29120
+,c k -29120
+~n t -29120
+~n u -29120
+~n u0075_030B -29120
+~n u0075_030A -29120
+~n `u -29120
+~n 'u -29120
+~n ^u -29120
+~n :u -29120
+~n b -29120
+~n y -29120
+~n v -29120
+~n w -29120
+`o e 29120
+`o u0065_030C 29120
+`o u0065_0328 29120
+`o `e 29120
+`o 'e 29120
+`o ^e 29120
+`o :e 29120
+`o o 29120
+`o u006F_030B 29120
+`o `o 29120
+`o 'o 29120
+`o ^o 29120
+`o ~o 29120
+`o :o 29120
+`o oe 29120
+`o /o 29120
+`o x -29120
+`o d 29120
+`o c 29120
+`o 'c 29120
+`o u0063_030C 29120
+`o ,c 29120
+`o q 29120
+`o v -29120
+`o j 58240
+`o y -29120
+`o :y -29120
+`o 'y -29120
+`o w -29120
+'o e 29120
+'o u0065_030C 29120
+'o u0065_0328 29120
+'o `e 29120
+'o 'e 29120
+'o ^e 29120
+'o :e 29120
+'o o 29120
+'o u006F_030B 29120
+'o `o 29120
+'o 'o 29120
+'o ^o 29120
+'o ~o 29120
+'o :o 29120
+'o oe 29120
+'o /o 29120
+'o x -29120
+'o d 29120
+'o c 29120
+'o 'c 29120
+'o u0063_030C 29120
+'o ,c 29120
+'o q 29120
+'o v -29120
+'o j 58240
+'o y -29120
+'o :y -29120
+'o 'y -29120
+'o w -29120
+^o e 29120
+^o u0065_030C 29120
+^o u0065_0328 29120
+^o `e 29120
+^o 'e 29120
+^o ^e 29120
+^o :e 29120
+^o o 29120
+^o u006F_030B 29120
+^o `o 29120
+^o 'o 29120
+^o ^o 29120
+^o ~o 29120
+^o :o 29120
+^o oe 29120
+^o /o 29120
+^o x -29120
+^o d 29120
+^o c 29120
+^o 'c 29120
+^o u0063_030C 29120
+^o ,c 29120
+^o q 29120
+^o v -29120
+^o j 58240
+^o y -29120
+^o :y -29120
+^o 'y -29120
+^o w -29120
+~o e 29120
+~o u0065_030C 29120
+~o u0065_0328 29120
+~o `e 29120
+~o 'e 29120
+~o ^e 29120
+~o :e 29120
+~o o 29120
+~o u006F_030B 29120
+~o `o 29120
+~o 'o 29120
+~o ^o 29120
+~o ~o 29120
+~o :o 29120
+~o oe 29120
+~o /o 29120
+~o x -29120
+~o d 29120
+~o c 29120
+~o 'c 29120
+~o u0063_030C 29120
+~o ,c 29120
+~o q 29120
+~o v -29120
+~o j 58240
+~o y -29120
+~o :y -29120
+~o 'y -29120
+~o w -29120
+:o e 29120
+:o u0065_030C 29120
+:o u0065_0328 29120
+:o `e 29120
+:o 'e 29120
+:o ^e 29120
+:o :e 29120
+:o o 29120
+:o u006F_030B 29120
+:o `o 29120
+:o 'o 29120
+:o ^o 29120
+:o ~o 29120
+:o :o 29120
+:o oe 29120
+:o /o 29120
+:o x -29120
+:o d 29120
+:o c 29120
+:o 'c 29120
+:o u0063_030C 29120
+:o ,c 29120
+:o q 29120
+:o v -29120
+:o j 58240
+:o y -29120
+:o :y -29120
+:o 'y -29120
+:o w -29120
+/o e 29120
+/o u0065_030C 29120
+/o u0065_0328 29120
+/o `e 29120
+/o 'e 29120
+/o ^e 29120
+/o :e 29120
+/o o 29120
+/o u006F_030B 29120
+/o `o 29120
+/o 'o 29120
+/o ^o 29120
+/o ~o 29120
+/o :o 29120
+/o oe 29120
+/o /o 29120
+/o x -29120
+/o d 29120
+/o c 29120
+/o 'c 29120
+/o u0063_030C 29120
+/o ,c 29120
+/o q 29120
+/o v -29120
+/o j 58240
+/o y -29120
+/o :y -29120
+/o 'y -29120
+/o w -29120
+`u w -29120
+'u w -29120
+^u w -29120
+:u w -29120
+'y o -29120
+'y u006F_030B -29120
+'y `o -29120
+'y 'o -29120
+'y ^o -29120
+'y ~o -29120
+'y :o -29120
+'y oe -29120
+'y /o -29120
+'y e -29120
+'y u0065_030C -29120
+'y u0065_0328 -29120
+'y `e -29120
+'y 'e -29120
+'y ^e -29120
+'y :e -29120
+'y a -29120
+'y u0061_0306 -29120
+'y u0061_0328 -29120
+'y `a -29120
+'y 'a -29120
+'y ^a -29120
+'y ^a -29120
+'y ~a -29120
+'y :a -29120
+'y oa -29120
+'y ae -29120
+'y . -87360
+'y , -87360
+charset
+ga 524160,672672 2 0000
+aa 524160,672672 2 0001
+a^ 524160,672672 2 0002
+a~ 524160,672672 2 0003
+ad 524160,695554 2 0004
+a" 524160,672672,0,10267 2 0005
+ao 786240,672672 2 0006
+ah 524160,672672 2 0007
+ab 524160,672672 2 0010
+a- 524160,695554 2 0011
+a. 291200,695554 2 0012
+ac 465920,0,178360 1 0013
+ho 291200,0,203840 1 0014
+bq 291200,110656,203840 1 0015
+fo 465920,506688 2 0016
+fc 465920,506688 2 0017
+lq 349440,722176 2 0020
+rq 349440,722176 2 0021
+Bq 349440,110656,203840 1 0022
+Fo 582400,506688 2 0023
+Fc 582400,506688 2 0024
+en 524160,451360,0,29120 0 0025
+em 1048320,451360,0,29120 0 0026
+--- 0,451360 0 0027
+--- 407680,786240,58240 3 0030
+.i 291200,451360 0 0031
+.j 320320,451360,203840 1 0032
+ff 611520,722176,0,81536 2 0033
+fi 582400,722176 2 0034
+fl 582400,722176 2 0035
+Fi 873600,722176 2 0036
+Fl 873600,722176 2 0037
+u2423 524160,451360,101920 1 0040
+u01C3 291200,722176 2 0041
+! "
+dq 524160,722176 2 0042
+" "
+sh 873600,722176,203840 3 0043
+# "
+Do 524160,786240,58240 3 0044
+$ "
+% 873600,786240,58240 3 0045
+& 815360,722176 2 0046
+cq 291200,722176 2 0047
+' "
+( 407680,786240,262080 3 0050
+) 407680,786240,262080 3 0051
+* 524160,786240 2 0052
++ 815360,611520,87360 3 0053
+, 291200,110656,203840 1 0054
+- 349440,451360 0 0055
+. 291200,110656 0 0056
+sl 524160,786240,262080 3 0057
+/ "
+0 524160,672672 2 0060
+1 524160,672672 2 0061
+2 524160,672672 2 0062
+3 524160,672672 2 0063
+4 524160,672672 2 0064
+5 524160,672672 2 0065
+6 524160,672672 2 0066
+7 524160,672672 2 0067
+8 524160,672672 2 0070
+9 524160,672672 2 0071
+: 291200,451360 0 0072
+; 291200,451360,203840 1 0073
+< 815360,559216,40992 3 0074
+= 815360,384606,-139554 0 0075
+> 815360,559216,40992 3 0076
+? 495040,722176 2 0077
+at 815360,722176 2 0100
+@ "
+A 786240,722176 2 0101
+B 742560,722176 2 0102
+C 757120,722176,0,0,-29120 2 0103
+D 800800,722176,0,0,0,-29120 2 0104
+E 713440,722176 2 0105
+F 684320,722176,0,0,0,-145600 2 0106
+G 822640,722176,0,0,-29120 2 0107
+H 786240,722176 2 0110
+I 378560,722176 2 0111
+J 538720,722176,0,0,0,-29120 2 0112
+K 815360,722176 2 0113
+L 655200,722176,0,0,0,58240 2 0114
+M 960960,722176 2 0115
+N 786240,722176 2 0116
+O 815360,722176,0,0,-29120,-29120 2 0117
+P 713440,722176,0,0,0,-145600 2 0120
+Q 815360,722176,203840,0,-29120 3 0121
+R 771680,722176 2 0122
+S 582400,722176 2 0123
+T 757120,722176,0,0,0,-145600 2 0124
+U 786240,722176,0,0,-14560 2 0125
+V 786240,722176,0,14560,43680,-218400 2 0126
+W 1077440,722176,0,14560,43680,-131040 2 0127
+X 786240,722176 2 0130
+Y 786240,722176,0,26208,29120,-206752 2 0131
+Z 640640,722176 2 0132
+lB 291200,786240,262080 3 0133
+[ "
+rs 524160,786240,262080 3 0134
+\ "
+rB 291200,786240,262080 3 0135
+] "
+ha 640640,722176 2 0136
+^ "
+_ 815360,0,244102 1 0137
+oq 291200,722176 2 0140
+` "
+a 524160,451360 0 0141
+b 582400,722176 2 0142
+c 465920,451360 0 0143
+d 582400,722176 2 0144
+e 465920,451360 0 0145
+f 320320,722176,0,81536 2 0146
+g 524160,451360,203840,14560 1 0147
+h 582400,722176 2 0150
+i 291200,695554 2 0151
+j 320320,695554,203840 3 0152
+k 553280,722176 2 0153
+l 291200,722176 2 0154
+m 873600,451360 0 0155
+n 582400,451360 0 0156
+o 524160,451360 0 0157
+p 582400,451360,203840 1 0160
+q 553280,451360,203840 1 0161
+r 410592,451360 0 0162
+s 413504,451360 0 0163
+t 407680,644802 2 0164
+u 582400,451360 0 0165
+v 553280,451360,0,14560 0 0166
+w 757120,451360,0,14560 0 0167
+x 553280,451360 0 0170
+y 553280,451360,203840,14560 1 0171
+z 465920,451360 0 0172
+lC 524160,786240,262080 3 0173
+{ "
+u01C0 291200,786240,262080 3 0174
+ba "
+| "
+rC 524160,786240,262080 3 0175
+} "
+~ 640640,695554 2 0176
+hy 174720,451360 0 0177
+u0041_0306 786240,934752 2 0200
+u0041_0328 786240,722176,203840 3 0201
+'C 757120,897976 2 0202
+u0043_030C 757120,934752,0,0,-29120 2 0203
+u0044_030C 800800,934752,0,0,0,-29120 2 0204
+u0045_030C 713440,934752 2 0205
+u0045_0328 713440,722176,203840 3 0206
+u0047_0306 822640,934752,0,0,-29120 2 0207
+u004C_0301 655200,897976,0,0,0,58240 2 0210
+u004C_030C 655200,934752,0,0,0,58240 2 0211
+/L 655200,722176 2 0212
+u004E_0301 786240,897976 2 0213
+u004E_030C 786240,934752 2 0214
+u014A 829920,722176,0,0,0,-29120 2 0215
+u004F_030B 815360,897976,0,0,-29120,-29120 2 0216
+u0052_0301 771680,897976 2 0217
+u0052_030C 771680,934752 2 0220
+u0053_0301 582400,897976 2 0221
+vS 582400,934752 2 0222
+u0053_0327 582400,722176,178360 3 0223
+u0054_030C 757120,934752,0,0,0,-145600 2 0224
+u0054_0327 757120,722176,178360,0,0,-145600 3 0225
+u0055_030B 786240,897976,0,0,-14560 2 0226
+u0055_030A 786240,934752,0,0,-14560 2 0227
+:Y 786240,934752,0,26208,29120,-206752 2 0230
+u005A_0301 640640,897976 2 0231
+vZ 640640,934752 2 0232
+u005A_0307 640640,897976 2 0233
+IJ 902720,722176,0,0,0,-29120 2 0234
+u0049_0307 378560,897976 2 0235
+u0111 582400,722176 2 0236
+sc 465920,722176,203840 3 0237
+u0061_0306 524160,672672 2 0240
+u0061_0328 524160,451360,203840 1 0241
+'c 465920,672672 2 0242
+u0063_030C 465920,672672 2 0243
+u0064_030C 707616,722176 2 0244
+u0065_030C 465920,672672 2 0245
+u0065_0328 465920,451360,203840 1 0246
+u0067_0306 524160,672672,203840,14560 3 0247
+u006C_0301 291200,897976,0,52149 2 0250
+u006C_030C 422240,722176 2 0251
+/l 352352,722176 2 0252
+u006E_0301 582400,672672 2 0253
+u006E_030C 582400,672672 2 0254
+u016A 582400,451360,203840 1 0255
+u006F_030B 524160,672672,0,10267 2 0256
+u0072_0301 410592,672672 2 0257
+u0072_030C 410592,672672 2 0260
+u0073_0301 413504,672672 2 0261
+vs 413504,672672 2 0262
+u0073_0327 413504,451360,178360 1 0263
+u0074_030C 407680,722176 2 0264
+u0074_0327 407680,644802,178360 3 0265
+u0075_030B 582400,672672 2 0266
+u0075_030A 582400,672672 2 0267
+:y 553280,695554,203840,14560 3 0270
+u007A_0301 465920,672672 2 0271
+vz 465920,672672 2 0272
+u007A_0307 465920,695554 2 0273
+ij 611520,695554,203840 3 0274
+r! 291200,524160,203840 3 0275
+r? 495040,524160,203840 3 0276
+Po 669760,722176 2 0277
+`A 786240,897976 2 0300
+'A 786240,897976 2 0301
+^A 786240,934752 2 0302
+~A 786240,934752 2 0303
+:A 786240,934752 2 0304
+oA 786240,897976 2 0305
+AE 946400,722176 2 0306
+,C 757120,722176,178360,0,-29120 3 0307
+`E 713440,897976 2 0310
+'E 713440,897976 2 0311
+^E 713440,934752 2 0312
+:E 713440,934752 2 0313
+`I 378560,897976 2 0314
+'I 378560,897976 2 0315
+^I 378560,934752 2 0316
+:I 378560,934752 2 0317
+u0189 800800,722176,0,0,0,-29120 2 0320
+u0110 "
+-D "
+~N 786240,934752 2 0321
+`O 815360,897976,0,0,-29120,-29120 2 0322
+'O 815360,897976 2 0323
+^O 815360,934752,0,0,-29120,-29120 2 0324
+~O 815360,934752,0,0,-29120,-29120 2 0325
+:O 815360,934752,0,0,-29120,-29120 2 0326
+OE 1062880,722176 2 0327
+/O 815360,767312,50960 3 0330
+`U 786240,897976,0,0,-14560 2 0331
+'U 786240,897976 2 0332
+^U 786240,934752,0,0,-14560 2 0333
+:U 786240,934752,0,0,-14560 2 0334
+'Y 786240,897976,0,26208,29120,-206752 2 0335
+TP 655200,722176 2 0336
+--- 1164800,722176 2 0337
+`a 524160,672672 2 0340
+'a 524160,672672 2 0341
+^a 524160,672672 2 0342
+~a 524160,672672 2 0343
+:a 524160,695554 2 0344
+oa 524160,672672 2 0345
+ae 757120,451360 0 0346
+,c 465920,451360,178360 1 0347
+`e 465920,672672 2 0350
+'e 465920,672672 2 0351
+^e 465920,672672 2 0352
+:e 465920,695554 2 0353
+`i 291200,672672 2 0354
+'i 291200,672672,0,17094 2 0355
+^i 291200,672672 2 0356
+:i 349440,695554 2 0357
+Sd 524160,722176 2 0360
+~n 582400,672672 2 0361
+`o 524160,672672 2 0362
+'o 524160,672672 2 0363
+^o 524160,672672 2 0364
+~o 524160,672672 2 0365
+:o 524160,695554 2 0366
+oe 815360,451360 0 0367
+/o 524160,559216,101920 3 0370
+`u 582400,672672 2 0371
+'u 582400,672672 2 0372
+^u 582400,672672 2 0373
+:u 582400,695554 2 0374
+'y 553280,672672,203840,14560 3 0375
+Tp 582400,722176,203840 3 0376
+ss 524160,722176 2 0377
diff --git a/font/devdvi/TRTC b/font/devdvi/TRTC
new file mode 100644
index 0000000..b297903
--- /dev/null
+++ b/font/devdvi/TRTC
@@ -0,0 +1,137 @@
+name TRTC
+special
+internalname tcrm1000
+spacewidth 349440
+checksum -1137054567
+designsize 10485760
+charset
+--- 524160,635442 2 0000
+--- 524160,635442 2 0001
+--- 524160,672672 2 0002
+--- 524160,672672 2 0003
+--- 524160,672672 2 0004
+--- 524160,635442,0,15970 2 0005
+--- 786240,672672 2 0006
+--- 524160,672672 2 0007
+--- 524160,672672 2 0010
+--- 524160,672672 2 0011
+--- 291200,635442 2 0012
+--- 465920,0,178360 1 0013
+--- 291200,0,203840 1 0014
+--- 407680,110656,203840 1 0015
+--- 524160,110656,203840 1 0022
+--- 698880,458640,0,29120 2 0025
+--- 786240,458640,0,29120 2 0026
+--- 0,722176 2 0027
+<- 1048320,384606,-139554 0 0030
+-> 1048320,384606,-139554 0 0031
+--- 291200,722176,0,275184 2 0032
+--- 349440,992992,0,304304 2 0033
+--- 524160,722176,0,275184 2 0034
+--- 524160,722176,0,304304 2 0035
+--- 0,722176 2 0037
+u2422 582400,722176 2 0040
+Do 524160,786240,58240 3 0044
+$ "
+aq 291200,722176 2 0047
+--- 524160,487760,-36400 2 0052
+, 291200,110656,203840 1 0054
+--- 349440,384606,-139554 0 0055
+. 291200,110656 0 0056
+f/ 524160,786240,262080 3 0057
+0 524160,458640 2 0060
+1 524160,458640 2 0061
+2 524160,458640 2 0062
+3 524160,458640,203840 3 0063
+4 524160,458640,203840 3 0064
+5 524160,458640,203840 3 0065
+6 524160,672672 2 0066
+7 524160,458640,203840 3 0067
+8 524160,672672 2 0070
+9 524160,458640,203840 3 0071
+la 407680,786240,262080 3 0074
+\- 815360,611520,87360 3 0075
+ra 407680,786240,262080 3 0076
+u2127 757120,722176 2 0115
+ci 1164800,786240,262080 3 0117
+u03A9 757120,722176 2 0127
+u301A 422240,786240,262080 3 0133
+u301B 422240,786240,262080 3 0135
+ua 524160,722176,203840 3 0136
+da 524160,722176,203840 3 0137
+--- 524160,722176 2 0140
+--- 524160,487760,-36400 2 0142
+--- 524160,487760,-36400 2 0143
+--- 524160,635442,27666 3 0144
+--- 1048320,722176 2 0154
+--- 524160,487760,-36400 2 0155
+u266A 640640,722176 2 0156
+ti 640640,128960 0 0176
+~ "
+--- 174720,384606,-139554 0 0177
+--- 640640,722176 2 0200
+--- 640640,722176 2 0201
+--- 524160,722176 2 0202
+--- 524160,722176 2 0203
+dg 465920,722176,203840 3 0204
+dd 465920,722176,203840 3 0205
+u2016 524160,786240,262080 3 0206
+%0 1223040,786240,58240 3 0207
+bu 524160,458640,-58240 2 0210
+u2103 990080,722176,0,0,-29120 2 0211
+--- 640640,786240,58240 3 0212
+--- 524160,548426,101920 3 0213
+Fn 320320,722176,0,81536 2 0214
+u20A1 757120,786240,58240,0,-29120 3 0215
+u20A9 1077440,722176,0,14560,43680,-131040 2 0216
+u20A6 815360,722176 2 0217
+--- 822640,786240,58240,0,-29120 3 0220
+u20B1 728000,722176,0,0,0,-145600 2 0221
+u20A4 669760,722176 2 0222
+u211E 771680,722176 2 0223
+u203D 495040,722176 2 0224
+--- 495040,524160,203840 3 0225
+u20AB 582400,786240 2 0226
+tm 698880,786240,0,550366 2 0227
+u2031 1586070,786240,58240 3 0230
+--- 495040,722176,203840 3 0231
+u0E3F 742560,786240,58240 3 0232
+u2116 960960,722176 2 0233
+u2052 524160,786240 2 0234
+u212E 709072,722176 2 0235
+u25E6 524160,458640,-58240 2 0236
+u2120 698880,786240,0,550366 2 0237
+u2045 378560,786240,262080 3 0240
+u2046 378560,786240,262080 3 0241
+ct 524160,548426,101920 3 0242
+Po 669760,722176 2 0243
+Cs 772248,580323 2 0244
+Ye 786240,722176,0,26208 2 0245
+bb 174720,786240,262080 3 0246
+sc 465920,722176,203840 3 0247
+--- 524160,700130 2 0250
+co 1164800,786240,262080 3 0251
+Of 465920,786240 2 0252
+--- 1164800,786240,262080 3 0253
+tno 698880,458640 2 0254
+u2117 1164800,786240,262080 3 0255
+rg 1164800,786240,262080 3 0256
+--- 815360,722176 2 0257
+de 349440,722176 2 0260
+t+- 815360,611520,87360 3 0261
+S2 465920,786240 2 0262
+S3 465920,786240 2 0263
+--- 524160,722176 2 0264
+mc 582400,458640,203840 3 0265
+ps 640640,722176,203840 3 0266
+pc 291200,458640 2 0267
+u203B 660051,548426 2 0270
+S1 465920,786240 2 0271
+Om 465920,786240 2 0272
+sr 495040,786240,220138 3 0273
+--- 465920,786240,203840 3 0274
+--- 465920,786240,203840 3 0275
+--- 465920,786240,203840 3 0276
+Eu 815360,722176 2 0277
+tmu 815360,611520,87360 3 0326
+tdi 815360,611520,87360 3 0366
diff --git a/font/devdvi/devdvi.am b/font/devdvi/devdvi.am
new file mode 100644
index 0000000..e7f5768
--- /dev/null
+++ b/font/devdvi/devdvi.am
@@ -0,0 +1,96 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+devdvi_srcdir = $(top_srcdir)/font/devdvi
+DEVDVIFONTFILES = \
+ font/devdvi/TR \
+ font/devdvi/TI \
+ font/devdvi/TB \
+ font/devdvi/TBI \
+ font/devdvi/CW \
+ font/devdvi/CWI \
+ font/devdvi/HR \
+ font/devdvi/HI \
+ font/devdvi/HB \
+ font/devdvi/HBI \
+ font/devdvi/TREC \
+ font/devdvi/TIEC \
+ font/devdvi/TBEC \
+ font/devdvi/TBIEC \
+ font/devdvi/CWEC \
+ font/devdvi/CWIEC \
+ font/devdvi/HREC \
+ font/devdvi/HIEC \
+ font/devdvi/HBEC \
+ font/devdvi/HBIEC \
+ font/devdvi/TRTC \
+ font/devdvi/TITC \
+ font/devdvi/TBTC \
+ font/devdvi/TBITC \
+ font/devdvi/CWTC \
+ font/devdvi/CWITC \
+ font/devdvi/HRTC \
+ font/devdvi/HITC \
+ font/devdvi/HBTC \
+ font/devdvi/HBITC \
+ font/devdvi/MI \
+ font/devdvi/S \
+ font/devdvi/EX \
+ font/devdvi/SA \
+ font/devdvi/SB \
+ font/devdvi/SC
+devdvifontdir = $(fontdir)/devdvi
+devdvifont_DATA = $(DEVDVIFONTFILES) font/devdvi/DESC
+
+DEVDVIGENFILES = \
+ font/devdvi/generate/Makefile \
+ font/devdvi/generate/msam.map \
+ font/devdvi/generate/msbm.map \
+ font/devdvi/generate/texb.map \
+ font/devdvi/generate/texex.map \
+ font/devdvi/generate/texi.map \
+ font/devdvi/generate/texmi.map \
+ font/devdvi/generate/texr.map \
+ font/devdvi/generate/texsy.map \
+ font/devdvi/generate/textt.map \
+ font/devdvi/generate/textex.map \
+ font/devdvi/generate/ec.map \
+ font/devdvi/generate/tc.map \
+ font/devdvi/generate/CompileFonts
+devdvigendir = $(fontdir)/devdvi/generate
+devdvigen_DATA = $(DEVDVIGENFILES)
+
+EXTRA_DIST += $(DEVDVIFONTFILES) $(DEVDVIGENFILES) font/devdvi/DESC.in
+MOSTLYCLEANFILES += font/devdvi/DESC
+
+font/devdvi/DESC: $(devdvi_srcdir)/DESC.in
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && cat $(devdvi_srcdir)/DESC.in >$@ \
+ && if test "$(PAGE)" = A4; then \
+ echo "papersize a4" >>$@; \
+ else \
+ echo "papersize letter" >>$@; \
+ fi \
+ && (test -z '$(DVIPRINT)' \
+ || echo print '$(DVIPRINT)' >>$@)
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/font/devdvi/generate/CompileFonts b/font/devdvi/generate/CompileFonts
new file mode 100755
index 0000000..0d07529
--- /dev/null
+++ b/font/devdvi/generate/CompileFonts
@@ -0,0 +1,15 @@
+#! /bin/sh
+# Compile fonts in the sizes needed by groff.
+sizes="5 6 7 8 9 10 10.95 12 14 14.40 16 17.28 18 20 20.74 22 24 24.88 28 36"
+fonts="cmr10 cmti10 cmbx10 cmbxti10 cmtt10 cmex10 cmmi10 cmsy10 cmss10 cmssbx10 cmssi10"
+mode=cx
+dpi=300
+
+for f in $fonts; do
+ for s in $sizes; do
+ virmf "&cm \\mode=$mode; mag=$s/10; batchmode; input $f" >/dev/null
+ mag=`expr $s \* $dpi / 10`
+ gftopk $f.${mag}gf >/dev/null
+ rm $f.${mag}gf
+ done
+done
diff --git a/font/devdvi/generate/Makefile b/font/devdvi/generate/Makefile
new file mode 100644
index 0000000..825e06d
--- /dev/null
+++ b/font/devdvi/generate/Makefile
@@ -0,0 +1,211 @@
+# Makefile for 'font devdvi/generate'
+#
+# Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# This is set up so you can do:
+# make -f generate/Makefile
+# in the parent directory of the directory containing this file.
+
+# Note manually-added kerning values for `` and '' in the font files:
+# B, BI, I, R.
+
+srcdir=generate
+tfmdir=/usr/local/lib/groff-tfm
+gfdir=/usr/local/lib/groff-gf
+
+TFMTODIT=tfmtodit
+FONTS=TR TI TB TBI CW CWI HR HI HB HBI \
+ TREC TIEC TBEC TBIEC CWEC CWIEC HREC HIEC HBEC HBIEC \
+ TRTC TITC TBTC TBITC CWTC CWITC HRTC HITC HBTC HBITC \
+ MI S SC EX SA SB
+SPECIALFLAG=-s
+
+RM=rm -f
+
+all: $(FONTS)
+
+#### CM fonts ####
+
+# TR is special because it contains \(pl \(eq
+
+TR: $(srcdir)/texr.map
+ $(TFMTODIT) $(SPECIALFLAG) -g $(gfdir)/cmr10.300gf \
+ $(tfmdir)/cmr10.tfm $(srcdir)/texr.map $@
+
+# TI is special because it contains \(Po
+
+TI: $(srcdir)/texi.map
+ $(TFMTODIT) $(SPECIALFLAG) -g $(gfdir)/cmti10.300gf \
+ $(tfmdir)/cmti10.tfm $(srcdir)/texi.map $@
+
+TB: $(srcdir)/texb.map
+ $(TFMTODIT) -g $(gfdir)/cmbx10.300gf \
+ $(tfmdir)/cmbx10.tfm $(srcdir)/texb.map $@
+
+TBI: $(srcdir)/texi.map
+ $(TFMTODIT) -g $(gfdir)/cmbxti10.300gf \
+ $(tfmdir)/cmbxti10.tfm $(srcdir)/texi.map $@
+
+# CW is special because it contains "
+
+CW: $(srcdir)/textt.map
+ $(TFMTODIT) $(SPECIALFLAG) \
+ $(tfmdir)/cmtt10.tfm $(srcdir)/textt.map $@
+
+CWI: $(srcdir)/texitt.map
+ $(TFMTODIT) \
+ $(tfmdir)/cmitt10.tfm $(srcdir)/texitt.map $@
+
+MI: $(srcdir)/texmi.map
+ $(TFMTODIT) $(SPECIALFLAG) -k 0177 \
+ $(tfmdir)/cmmi10.tfm $(srcdir)/texmi.map $@
+
+S: $(srcdir)/texsy.map
+ $(TFMTODIT) $(SPECIALFLAG) -k 060 \
+ $(tfmdir)/cmsy10.tfm $(srcdir)/texsy.map $@
+
+SC: $(srcdir)/textex.map
+ $(TFMTODIT) $(SPECIALFLAG) \
+ $(tfmdir)/cmtex10.tfm $(srcdir)/textex.map $@
+
+EX: $(srcdir)/texex.map
+ $(TFMTODIT) $(SPECIALFLAG) \
+ $(tfmdir)/cmex10.tfm $(srcdir)/texex.map $@
+
+HR: $(srcdir)/texb.map
+ $(TFMTODIT) -g $(gfdir)/cmss10.300gf \
+ $(tfmdir)/cmss10.tfm $(srcdir)/texb.map $@
+
+HB: $(srcdir)/texb.map
+ $(TFMTODIT) -g $(gfdir)/cmssbx10.300gf \
+ $(tfmdir)/cmssbx10.tfm $(srcdir)/texb.map $@
+
+HI: $(srcdir)/texb.map
+ $(TFMTODIT) -g $(gfdir)/cmssi10.300gf \
+ $(tfmdir)/cmssi10.tfm $(srcdir)/texb.map $@
+
+HBI: $(srcdir)/texb.map
+ $(TFMTODIT) -g $(gfdir)/cmssbxo10.300gf \
+ $(tfmdir)/cmssbxo10.tfm $(srcdir)/texb.map $@
+
+SA: $(srcdir)/msam.map
+ $(TFMTODIT) $(SPECIALFLAG) \
+ $(tfmdir)/msam10.tfm $(srcdir)/msam.map $@
+
+SB: $(srcdir)/msbm.map
+ $(TFMTODIT) $(SPECIALFLAG) \
+ $(tfmdir)/msbm10.tfm $(srcdir)/msbm.map $@
+
+#### EC fonts ####
+
+TREC: $(srcdir)/ec.map
+ $(TFMTODIT) -g $(gfdir)/ecrm1000.300gf \
+ $(tfmdir)/ecrm1000.tfm $(srcdir)/ec.map $@
+
+TIEC: $(srcdir)/ec.map
+ $(TFMTODIT) -g $(gfdir)/ecti1000.300gf \
+ $(tfmdir)/ecti1000.tfm $(srcdir)/ec.map $@
+
+TBEC: $(srcdir)/ec.map
+ $(TFMTODIT) -g $(gfdir)/ecbx1000.300gf \
+ $(tfmdir)/ecbx1000.tfm $(srcdir)/ec.map $@
+
+TBIEC: $(srcdir)/ec.map
+ $(TFMTODIT) -g $(gfdir)/ecbi1000.300gf \
+ $(tfmdir)/ecbi1000.tfm $(srcdir)/ec.map $@
+
+CWEC: $(srcdir)/ec.map
+ $(TFMTODIT) $(tfmdir)/ectt1000.tfm $(srcdir)/ec.map $@
+
+CWIEC: $(srcdir)/ec.map
+ $(TFMTODIT) $(tfmdir)/ecit1000.tfm $(srcdir)/ec.map $@
+
+HREC: $(srcdir)/ec.map
+ $(TFMTODIT) -g $(gfdir)/ecss1000.300gf \
+ $(tfmdir)/ecss1000.tfm $(srcdir)/ec.map $@
+
+HBEC: $(srcdir)/ec.map
+ $(TFMTODIT) -g $(gfdir)/ecsx1000.300gf \
+ $(tfmdir)/ecsx1000.tfm $(srcdir)/ec.map $@
+
+HIEC: $(srcdir)/ec.map
+ $(TFMTODIT) -g $(gfdir)/ecsi1000.300gf \
+ $(tfmdir)/ecsi1000.tfm $(srcdir)/ec.map $@
+
+HBIEC: $(srcdir)/ec.map
+ $(TFMTODIT) -g $(gfdir)/ecso1000.300gf \
+ $(tfmdir)/ecso1000.tfm $(srcdir)/ec.map $@
+
+#### TC fonts ####
+
+TRTC: $(srcdir)/tc.map
+ $(TFMTODIT) $(SPECIALFLAG) -g $(gfdir)/tcrm1000.300gf \
+ $(tfmdir)/tcrm1000.tfm $(srcdir)/tc.map $@
+
+TITC: $(srcdir)/tc.map
+ $(TFMTODIT) $(SPECIALFLAG) -g $(gfdir)/tcti1000.300gf \
+ $(tfmdir)/tcti1000.tfm $(srcdir)/tc.map $@
+
+TBTC: $(srcdir)/tc.map
+ $(TFMTODIT) $(SPECIALFLAG) -g $(gfdir)/tcbx1000.300gf \
+ $(tfmdir)/tcbx1000.tfm $(srcdir)/tc.map $@
+
+TBITC: $(srcdir)/tc.map
+ $(TFMTODIT) $(SPECIALFLAG) -g $(gfdir)/tcbi1000.300gf \
+ $(tfmdir)/tcbi1000.tfm $(srcdir)/tc.map $@
+
+CWTC: $(srcdir)/tc.map
+ $(TFMTODIT) $(SPECIALFLAG) \
+ $(tfmdir)/tctt1000.tfm $(srcdir)/tc.map $@
+
+CWITC: $(srcdir)/tc.map
+ $(TFMTODIT) $(SPECIALFLAG) \
+ $(tfmdir)/tcit1000.tfm $(srcdir)/tc.map $@
+
+HRTC: $(srcdir)/tc.map
+ $(TFMTODIT) $(SPECIALFLAG) -g $(gfdir)/tcss1000.300gf \
+ $(tfmdir)/tcss1000.tfm $(srcdir)/tc.map $@
+
+HBTC: $(srcdir)/tc.map
+ $(TFMTODIT) $(SPECIALFLAG) -g $(gfdir)/tcsx1000.300gf \
+ $(tfmdir)/tcsx1000.tfm $(srcdir)/tc.map $@
+
+HITC: $(srcdir)/tc.map
+ $(TFMTODIT) $(SPECIALFLAG) -g $(gfdir)/tcsi1000.300gf \
+ $(tfmdir)/tcsi1000.tfm $(srcdir)/tc.map $@
+
+HBITC: $(srcdir)/tc.map
+ $(TFMTODIT) $(SPECIALFLAG) -g $(gfdir)/tcso1000.300gf \
+ $(tfmdir)/tcso1000.tfm $(srcdir)/tc.map $@
+
+clean:
+
+realclean:
+ $(RM) $(FONTS)
+
+extraclean: realclean
+ $(RM) core *~ "#*"
+
+.PHONY: clean realclean extraclean all
+
+# Local Variables:
+# mode: makefile
+# fill-column: 72
+# End:
+# vim: set textwidth=72:
diff --git a/font/devdvi/generate/ec.map b/font/devdvi/generate/ec.map
new file mode 100644
index 0000000..57e6608
--- /dev/null
+++ b/font/devdvi/generate/ec.map
@@ -0,0 +1,255 @@
+# Map for EC fonts with T1 encoding.
+# Originally contributed by Andreas Schwab <schwab@suse.de>
+0 ga
+1 aa
+2 a^
+3 a~
+4 ad
+5 a"
+6 ao
+7 ah
+8 ab
+9 a-
+10 a.
+11 ac
+12 ho
+13 bq
+14 fo
+15 fc
+16 lq
+17 rq
+18 Bq
+19 Fo
+20 Fc
+21 en
+22 em
+25 .i
+26 .j
+27 ff
+28 fi
+29 fl
+30 Fi
+31 Fl
+32 u2423
+33 ! u01C3
+34 " dq
+35 # sh
+36 $ Do
+37 %
+38 &
+39 ' cq
+40 (
+41 )
+42 *
+43 +
+44 ,
+45 -
+46 .
+47 / sl
+48 0
+49 1
+50 2
+51 3
+52 4
+53 5
+54 6
+55 7
+56 8
+57 9
+58 :
+59 ;
+60 <
+61 =
+62 >
+63 ?
+64 @ at
+65 A
+66 B
+67 C
+68 D
+69 E
+70 F
+71 G
+72 H
+73 I
+74 J
+75 K
+76 L
+77 M
+78 N
+79 O
+80 P
+81 Q
+82 R
+83 S
+84 T
+85 U
+86 V
+87 W
+88 X
+89 Y
+90 Z
+91 [ lB
+92 \ rs
+93 ] rB
+94 ^ ha
+95 _
+96 ` oq
+97 a
+98 b
+99 c
+100 d
+101 e
+102 f
+103 g
+104 h
+105 i
+106 j
+107 k
+108 l
+109 m
+110 n
+111 o
+112 p
+113 q
+114 r
+115 s
+116 t
+117 u
+118 v
+119 w
+120 x
+121 y
+122 z
+123 { lC
+124 | ba u01C0
+125 } rC
+126 ~
+127 hy
+128 u0041_0306
+129 u0041_0328
+130 'C
+131 u0043_030C
+132 u0044_030C
+133 u0045_030C
+134 u0045_0328
+135 u0047_0306
+136 u004C_0301
+137 u004C_030C
+138 /L
+139 u004E_0301
+140 u004E_030C
+141 u014A
+142 u004F_030B
+143 u0052_0301
+144 u0052_030C
+145 u0053_0301
+146 vS
+147 u0053_0327
+148 u0054_030C
+149 u0054_0327
+150 u0055_030B
+151 u0055_030A
+152 :Y
+153 u005A_0301
+154 vZ
+155 u005A_0307
+156 IJ
+157 u0049_0307
+158 u0111
+159 sc
+160 u0061_0306
+161 u0061_0328
+162 'c
+163 u0063_030C
+164 u0064_030C
+165 u0065_030C
+166 u0065_0328
+167 u0067_0306
+168 u006C_0301
+169 u006C_030C
+170 /l
+171 u006E_0301
+172 u006E_030C
+173 u016A
+174 u006F_030B
+175 u0072_0301
+176 u0072_030C
+177 u0073_0301
+178 vs
+179 u0073_0327
+180 u0074_030C
+181 u0074_0327
+182 u0075_030B
+183 u0075_030A
+184 :y
+185 u007A_0301
+186 vz
+187 u007A_0307
+188 ij
+189 r!
+190 r?
+191 Po
+192 `A
+193 'A
+194 ^A
+195 ~A
+196 :A
+197 oA
+198 AE
+199 ,C
+200 `E
+201 'E
+202 ^E
+203 :E
+204 `I
+205 'I
+206 ^I
+207 :I
+208 -D u0110 u0189
+209 ~N
+210 `O
+211 'O
+212 ^O
+213 ~O
+214 :O
+215 OE
+216 /O
+217 `U
+218 'U
+219 ^U
+220 :U
+221 'Y
+222 TP
+224 `a
+225 'a
+226 ^a
+227 ~a
+228 :a
+229 oa
+230 ae
+231 ,c
+232 `e
+233 'e
+234 ^e
+235 :e
+236 `i
+237 'i
+238 ^i
+239 :i
+240 Sd
+241 ~n
+242 `o
+243 'o
+244 ^o
+245 ~o
+246 :o
+247 oe
+248 /o
+249 `u
+250 'u
+251 ^u
+252 :u
+253 'y
+254 Tp
+255 ss
diff --git a/font/devdvi/generate/msam.map b/font/devdvi/generate/msam.map
new file mode 100644
index 0000000..20a22e6
--- /dev/null
+++ b/font/devdvi/generate/msam.map
@@ -0,0 +1,127 @@
+# Map for the AMSFonts 2.0 msam font using TeX names.
+# Contributed by Zdzislaw Meglicki (Zdzislaw.Meglicki@arp.anu.edu.au).
+0 boxdot
+1 boxplus
+2 boxtimes
+3 square
+4 blacksquare
+5 centerdot
+6 lozenge lz
+7 blacklozenge
+8 circlearrowright
+9 circlearrowleft
+10 rightleftharpoons
+11 leftrightharpoons
+12 boxminus
+13 Vdash
+14 Vvdash
+15 vDash
+16 twoheadrightarrow
+17 twoheadleftarrow
+18 leftleftarrows
+19 rightrightarrows
+20 upuparrows
+21 downdownarrows
+22 upharpoonright
+23 downharpoonright
+24 upharpoonleft
+25 downharpoonleft
+26 rightarrowtail
+27 leftarrowtail
+28 leftrightarrows
+29 rightleftarrows
+30 Lsh
+31 Rsh
+32 rightsquigarrow
+33 leftrightsquigarrow
+34 looparrowleft
+35 looparrowright
+36 circeq
+37 succsim
+38 gtrsim
+39 gtrapprox
+40 multimap
+41 therefore tf 3d
+42 because
+43 doteqdot
+44 triangleq
+45 precsim
+46 lesssim
+47 lessapprox
+48 eqslantless
+49 eqslantgtr
+50 curlyeqprec
+51 curlyeqsucc
+52 preccurlyeq
+53 leqq
+54 leqslant
+55 lessgtr
+56 backprime
+58 risingdotseq
+59 fallingdotseq
+60 succcurlyeq
+61 geqq
+62 geqslant
+63 gtrless
+64 sqsubset
+65 sqsupset
+66 vartriangleright
+67 vartriangleleft
+68 trianglerighteq
+69 trianglelefteq
+70 bigstar
+71 between
+72 blacktriangledown
+73 blacktriangleright
+74 blacktriangleleft
+77 vartriangle
+78 blacktriangle
+79 triangledown
+80 eqcirc
+81 lesseqgtr
+82 gtreqless
+83 lesseqqgtr
+84 gtreqqless
+85 yen Ye
+86 Rrightarrow
+87 Lleftarrow
+88 checkmark OK
+89 veebar
+90 barwedge
+91 doublebarwedge
+92 angle /_
+93 measuredangle
+94 sphericalangle
+95 varpropto
+96 smallsmile
+97 smallfrown
+98 Subset
+99 Supset
+100 Cup
+101 Cap
+102 curlywedge
+103 curlyvee
+104 leftthreetimes
+105 rightthreetimes
+106 subseteqq
+107 supseteqq
+108 bumpeq
+109 Bumpeq
+110 lll
+111 ggg
+112 ulcorner
+113 urcorner
+114 circledR rg
+115 circledS
+116 pitchfork
+117 dotplus
+118 backsim
+119 backsimeq
+120 llcorner
+121 lrcorner
+122 maltese
+123 complement
+124 intercal
+125 circledcirc
+126 circledast
+127 circleddash
diff --git a/font/devdvi/generate/msbm.map b/font/devdvi/generate/msbm.map
new file mode 100644
index 0000000..07ee095
--- /dev/null
+++ b/font/devdvi/generate/msbm.map
@@ -0,0 +1,121 @@
+# Map for the AMSFonts 2.0 msbm font using TeX names.
+# Contributed by Zdzislaw Meglicki (Zdzislaw.Meglicki@arp.anu.edu.au).
+0 lvertneqq
+1 gvertneqq
+2 nleq
+3 ngeq
+4 nless
+5 ngtr
+6 nprec
+7 nsucc
+8 lneqq
+9 gneqq
+10 nleqslant
+11 ngeqslant
+12 lneq
+13 gneq
+14 npreceq
+15 nsucceq
+16 precnsim
+17 succnsim
+18 lnsim
+19 gnsim
+20 nleqq
+21 ngeqq
+22 precneqq
+23 succneqq
+24 precnapprox
+25 succnapprox
+26 lnapprox
+27 gnapprox
+28 nsim
+29 ncong
+30 diagup
+31 diagdown
+32 varsubsetneq
+33 varsupsetneq
+34 nsubseteqq
+35 nsupseteqq
+36 subsetneqq
+37 supsetneqq
+38 varsubsetneqq
+39 varsupsetneqq
+40 subsetneq
+41 supsetneq
+42 nsubseteq
+43 nsupseteq
+44 nparallel
+45 nmid
+46 nshortmid
+47 nshortparallel
+48 nvdash
+49 nVdash
+50 nvDash
+51 nVDash
+52 ntrianglerighteq
+53 ntrianglelefteq
+54 ntriangleleft
+55 ntriangleright
+56 nleftarrow
+57 nrightarrow
+58 nLeftarrow
+59 nRightarrow
+60 nLeftrightarrow
+61 nleftrightarrow
+62 divideontimes
+63 varnothing
+64 nexists
+65 BbbA
+66 BbbB
+67 BbbC
+68 BbbD
+69 BbbE
+70 BbbF
+71 BbbG
+72 BbbH
+73 BbbI
+74 BbbJ
+75 BbbK
+76 BbbL
+77 BbbM
+78 BbbN
+79 BbbO
+80 BbbP
+81 BbbQ
+82 BbbR
+83 BbbS
+84 BbbT
+85 BbbU
+86 BbbV
+87 BbbW
+88 BbbX
+89 BbbY
+90 BbbZ
+96 Finv
+97 Game
+102 mho
+103 eth
+104 eqsim
+105 beth
+106 gimel
+107 daleth
+108 lessdot
+109 gtrdot
+110 ltimes
+111 rtimes
+112 shortmid
+113 shortparallel
+114 smallsetminus
+115 thicksim
+116 thickapprox
+117 approxeq
+118 succapprox
+119 precapprox
+120 curvearrowleft
+121 curvearrowright
+122 digamma
+123 varkappa
+124 Bbbk
+125 hslash
+126 hbar -h
+127 backepsilon
diff --git a/font/devdvi/generate/tc.map b/font/devdvi/generate/tc.map
new file mode 100644
index 0000000..4c12a30
--- /dev/null
+++ b/font/devdvi/generate/tc.map
@@ -0,0 +1,81 @@
+# Map for TC fonts with TS1 encoding.
+24 <-
+25 ->
+32 u2422
+36 $ Do
+39 aq
+44 ,
+46 .
+47 f/
+48 0
+49 1
+50 2
+51 3
+52 4
+53 5
+54 6
+55 7
+56 8
+57 9
+60 la
+61 \-
+62 ra
+77 u2127
+79 ci
+87 u03A9
+91 u301A
+93 u301B
+94 ua
+95 da
+110 u266A
+126 ~ ti
+132 dg
+133 dd
+134 u2016
+135 %0
+136 bu
+137 u2103
+140 Fn
+141 u20A1
+142 u20A9
+143 u20A6
+145 u20B1
+146 u20A4
+147 u211E
+148 u203D
+150 u20AB
+151 tm
+152 u2031
+154 u0E3F
+155 u2116
+156 u2052
+157 u212E
+158 u25E6
+159 u2120
+160 u2045
+161 u2046
+162 ct
+163 Po
+164 Cs
+165 Ye
+166 bb
+167 sc
+169 co
+170 Of
+172 tno
+173 u2117
+174 rg
+176 de
+177 t+-
+178 S2
+179 S3
+181 mc
+182 ps
+183 pc
+184 u203B
+185 S1
+186 Om
+187 sr
+191 Eu
+214 tmu
+246 tdi
diff --git a/font/devdvi/generate/texb.map b/font/devdvi/generate/texb.map
new file mode 100644
index 0000000..ddab640
--- /dev/null
+++ b/font/devdvi/generate/texb.map
@@ -0,0 +1,128 @@
+0 *G
+1 *D
+2 *H
+3 *L
+4 *C
+5 *P
+6 *S
+7 *U
+8 *F
+9 *Q
+10 *W
+11 ff
+12 fi
+13 fl
+14 Fi
+15 Fl
+16 .i
+17 .j
+18 ga
+19 aa
+20 ah
+21 ab
+22 a-
+23 ao
+24 ac
+25 ss
+26 ae
+27 oe
+28 /o
+29 AE
+30 OE
+31 /O
+32 slash@for@l
+33 !
+34 rq
+35 # sh
+36 $ Do
+37 %
+38 &
+39 ' cq
+40 (
+41 )
+42 *
+43 +
+44 ,
+45 - hy
+46 .
+47 / sl
+48 0
+49 1
+50 2
+51 3
+52 4
+53 5
+54 6
+55 7
+56 8
+57 9
+58 :
+59 ;
+60 r!
+61 =
+62 r?
+63 ?
+64 @ at
+65 A
+66 B
+67 C
+68 D
+69 E
+70 F
+71 G
+72 H
+73 I
+74 J
+75 K
+76 L
+77 M
+78 N
+79 O
+80 P
+81 Q
+82 R
+83 S
+84 T
+85 U
+86 V
+87 W
+88 X
+89 Y
+90 Z
+91 [ lB
+92 lq
+93 ] rB
+94 a^ ^ ha
+95 a.
+96 ` oq
+97 a
+98 b
+99 c
+100 d
+101 e
+102 f
+103 g
+104 h
+105 i
+106 j
+107 k
+108 l
+109 m
+110 n
+111 o
+112 p
+113 q
+114 r
+115 s
+116 t
+117 u
+118 v
+119 w
+120 x
+121 y
+122 z
+123 en
+124 em
+125 a"
+126 a~ ~
+127 ad
diff --git a/font/devdvi/generate/texex.map b/font/devdvi/generate/texex.map
new file mode 100644
index 0000000..2e497f7
--- /dev/null
+++ b/font/devdvi/generate/texex.map
@@ -0,0 +1,100 @@
+0 parenleft0
+1 parenright0
+2 bracketleft0
+3 bracketright0
+4 floorleft0
+5 floorright0
+6 ceilingleft0
+7 ceilingright0
+8 braceleft0
+9 braceright0
+10 angleleft0
+11 angleright0
+12 barex
+13 bardblex
+14 slash0
+15 backslash0
+16 parenleft1
+17 parenright1
+18 parenleft2
+19 parenright2
+20 bracketleft2
+21 bracketright2
+22 floorleft2
+23 floorright2
+24 ceilingleft2
+25 ceilingright2
+26 braceleft2
+27 braceright2
+28 angleleft2
+29 angleright2
+30 slash2
+31 backslash2
+32 parenleft3
+33 parenright3
+34 bracketleft3
+35 bracketright3
+36 floorleft3
+37 floorright3
+38 ceilingleft3
+39 ceilingright3
+40 braceleft3
+41 braceright3
+42 angleleft3
+43 angleright3
+44 slash3
+45 backslash3
+46 slash1
+47 backslash1
+48 parenlefttp
+49 parenrighttp
+50 bracketlefttp
+51 bracketrighttp
+52 bracketleftbt
+53 bracketrightbt
+54 bracketleftex
+55 bracketrightex
+56 bracelefttp lt
+57 bracerighttp rt
+58 braceleftbt lb
+59 bracerightbt rb
+60 braceleftmid lk
+61 bracerightmid rk
+62 braceex bracerightex braceleftex
+63 arrowvertex
+64 parenleftbt
+65 parenrightbt
+66 parenleftex
+67 parenrightex
+68 angleleft1
+69 angleright1
+73 ois ointegral
+75 bigcircledot
+77 bigcircleplus
+79 bigcirclemultiply
+88 sum
+89 product
+90 integral
+91 bigunion
+92 bigintersection
+93 bigunionplus
+94 biglogicaland
+95 biglogicalor
+97 coproduct
+104 bracketleft1
+105 bracketright1
+106 floorleft1
+107 floorright1
+108 ceilingleft1
+109 ceilingright1
+110 braceleft1
+111 braceright1
+112 sqrt0
+113 sqrt1
+114 sqrt2
+115 sqrt3
+119 arrowvertdblex
+120 arrowverttp
+121 arrowvertbt
+126 arrowvertdbltp
+127 arrowvertdblbt
diff --git a/font/devdvi/generate/texi.map b/font/devdvi/generate/texi.map
new file mode 100644
index 0000000..4e3915d
--- /dev/null
+++ b/font/devdvi/generate/texi.map
@@ -0,0 +1,128 @@
+0 *G
+1 *D
+2 *H
+3 *L
+4 *C
+5 *P
+6 *S
+7 *U
+8 *F
+9 *Q
+10 *W
+11 ff
+12 fi
+13 fl
+14 Fi
+15 Fl
+16 .i
+17 .j
+18 ga
+19 aa
+20 ah
+21 ab
+22 a-
+23 ao
+24 ac
+25 ss
+26 ae
+27 oe
+28 /o
+29 AE
+30 OE
+31 /O
+32 slash@for@l
+33 !
+34 rq
+35 # sh
+36 Po
+37 %
+38 &
+39 ' cq
+40 (
+41 )
+42 *
+43 +
+44 ,
+45 - hy
+46 .
+47 / sl
+48 0
+49 1
+50 2
+51 3
+52 4
+53 5
+54 6
+55 7
+56 8
+57 9
+58 :
+59 ;
+60 r!
+61 =
+62 r?
+63 ?
+64 @ at
+65 A
+66 B
+67 C
+68 D
+69 E
+70 F
+71 G
+72 H
+73 I
+74 J
+75 K
+76 L
+77 M
+78 N
+79 O
+80 P
+81 Q
+82 R
+83 S
+84 T
+85 U
+86 V
+87 W
+88 X
+89 Y
+90 Z
+91 [ lB
+92 lq
+93 ] rB
+94 a^ ^ ha
+95 a.
+96 ` oq
+97 a
+98 b
+99 c
+100 d
+101 e
+102 f Fn
+103 g
+104 h
+105 i
+106 j
+107 k
+108 l
+109 m
+110 n
+111 o
+112 p
+113 q
+114 r
+115 s
+116 t
+117 u
+118 v
+119 w
+120 x
+121 y
+122 z
+123 en
+124 em
+125 a"
+126 a~ ~
+127 ad
diff --git a/font/devdvi/generate/texmi.map b/font/devdvi/generate/texmi.map
new file mode 100644
index 0000000..669d046
--- /dev/null
+++ b/font/devdvi/generate/texmi.map
@@ -0,0 +1,46 @@
+11 *a
+12 *b
+13 *g
+14 *d
+15 +e
+16 *z
+17 *y
+18 *h
+19 *i
+20 *k
+21 *l
+22 *m mc
+23 *n
+24 *c
+25 *p
+26 *r
+27 *s
+28 *t
+29 *u
+30 *f
+31 *x
+32 *q
+33 *w
+34 *e
+35 +h
+36 +p
+38 ts
+39 +f
+40 u21BC
+41 u21BD
+42 u21C0
+43 u21C1
+46 u25B7
+47 u25C1
+60 <
+62 >
+63 u22C6
+64 pd
+91 u266D
+92 u266E
+93 u266F
+94 u2323
+95 u2322
+96 u2113
+111 *o
+125 wp
diff --git a/font/devdvi/generate/texr.map b/font/devdvi/generate/texr.map
new file mode 100644
index 0000000..0eaf423
--- /dev/null
+++ b/font/devdvi/generate/texr.map
@@ -0,0 +1,128 @@
+0 *G
+1 *D
+2 *H
+3 *L
+4 *C
+5 *P
+6 *S
+7 *U
+8 *F
+9 *Q
+10 *W
+11 ff
+12 fi
+13 fl
+14 Fi
+15 Fl
+16 .i
+17 .j
+18 ga
+19 aa
+20 ah
+21 ab
+22 a-
+23 ao
+24 ac
+25 ss
+26 ae
+27 oe
+28 /o
+29 AE
+30 OE
+31 /O
+32 slash@for@l
+33 !
+34 rq
+35 # sh
+36 $ Do
+37 %
+38 &
+39 ' cq
+40 (
+41 )
+42 *
+43 + pl
+44 ,
+45 - hy
+46 .
+47 / sl
+48 0
+49 1
+50 2
+51 3
+52 4
+53 5
+54 6
+55 7
+56 8
+57 9
+58 :
+59 ;
+60 r!
+61 = eq
+62 r?
+63 ?
+64 @ at
+65 A *A
+66 B *B
+67 C
+68 D
+69 E *E
+70 F
+71 G
+72 H *Y
+73 I *I
+74 J
+75 K *K
+76 L
+77 M *M
+78 N *N
+79 O *O
+80 P *R
+81 Q
+82 R
+83 S
+84 T *T
+85 U
+86 V
+87 W
+88 X *X
+89 Y
+90 Z *Z
+91 [ lB
+92 lq
+93 ] rB
+94 a^ ^ ha
+95 a.
+96 ` oq
+97 a
+98 b
+99 c
+100 d
+101 e
+102 f
+103 g
+104 h
+105 i
+106 j
+107 k
+108 l
+109 m
+110 n
+111 o
+112 p
+113 q
+114 r
+115 s
+116 t
+117 u
+118 v
+119 w
+120 x
+121 y
+122 z
+123 en
+124 em
+125 a"
+126 a~ ~
+127 ad
diff --git a/font/devdvi/generate/texsy.map b/font/devdvi/generate/texsy.map
new file mode 100644
index 0000000..8848c92
--- /dev/null
+++ b/font/devdvi/generate/texsy.map
@@ -0,0 +1,127 @@
+0 \- mi
+1 md pc
+2 mu tmu
+3 **
+4 di tdi
+5 u22C4
+6 +- t+-
+7 -+
+8 c+
+9 u2296
+10 c*
+11 u2298
+12 u2299
+13 ci
+14 u25E6
+15 bu
+16 u224D
+17 ==
+18 ib
+19 ip
+20 <=
+21 >=
+22 u227C
+23 u227D
+24 ap ti
+25 ~~ ~=
+26 sb
+27 sp
+28 <<
+29 >>
+30 u227A
+31 u227B
+32 <-
+33 ->
+34 ua
+35 da
+36 <>
+37 u2197
+38 u2198
+39 |=
+40 lA
+41 rA
+42 uA
+43 dA
+44 hA
+45 u2196
+46 u2199
+47 pt
+48 prime
+49 if
+50 mo
+51 st
+52 u25B3
+53 u25BD
+54 slashnot
+56 fa
+57 te
+58 no tno
+59 es
+60 Re
+61 Im
+62 u22A4
+63 pp
+64 Ah
+65 A
+66 B
+67 C
+68 D
+69 E
+70 F
+71 G
+72 H
+73 I
+74 J
+75 K
+76 L
+77 M
+78 N
+79 O
+80 P
+81 Q
+82 R
+83 S
+84 T
+85 U
+86 V
+87 W
+88 X
+89 Y
+90 Z
+91 cu
+92 ca
+93 u228E
+94 AN
+95 OR
+96 u22A2
+97 u22A3
+98 lf
+99 rf
+100 lc
+101 rc
+102 lC {
+103 rC }
+104 la
+105 ra
+106 ba | bv bar
+107 bardbl
+108 va
+109 vA
+110 \ rs
+111 u2240
+112 sqrt
+113 u2210
+114 gr
+115 is
+116 u2294
+117 u2293
+118 u2291
+119 u2292
+120 sc
+121 dg
+122 dd
+123 ps
+124 CL
+125 u2662
+126 u2661
+127 SP
diff --git a/font/devdvi/generate/textex.map b/font/devdvi/generate/textex.map
new file mode 100644
index 0000000..9756627
--- /dev/null
+++ b/font/devdvi/generate/textex.map
@@ -0,0 +1,34 @@
+# Map for the cmtex font
+0 md pc
+1 da
+2 *a
+3 *b
+4 AN
+5 no tno
+6 mo
+7 *p
+8 *l
+9 *g
+10 *d
+11 ua
+12 pm
+13 c+
+14 if
+15 pd
+16 sb
+17 sp
+18 ca
+19 cu
+20 fa
+21 te
+22 c*
+23 u21C6
+24 <-
+25 ->
+26 !=
+27 u22C4
+28 <=
+29 >=
+30 ==
+31 OR
+127 is
diff --git a/font/devdvi/generate/textt.map b/font/devdvi/generate/textt.map
new file mode 100644
index 0000000..157013d
--- /dev/null
+++ b/font/devdvi/generate/textt.map
@@ -0,0 +1,128 @@
+0 *G
+1 *D
+2 *H
+3 *L
+4 *C
+5 *P
+6 *S
+7 *U
+8 *F
+9 *Q
+10 *W
+11 ff
+12 fi
+13 fl
+14 Fi
+15 Fl
+16 .i
+17 .j
+18 ga
+19 aa
+20 ah
+21 ab
+22 a-
+23 ao
+24 ac
+25 ss
+26 ae
+27 oe
+28 /o
+29 AE
+30 OE
+31 /O
+32 u2423
+33 !
+34 " dq
+35 # sh
+36 $ Do
+37 %
+38 &
+39 ' cq
+40 (
+41 )
+42 *
+43 +
+44 ,
+45 - \-
+46 .
+47 / sl
+48 0
+49 1
+50 2
+51 3
+52 4
+53 5
+54 6
+55 7
+56 8
+57 9
+58 :
+59 ;
+60 <
+61 =
+62 >
+63 ?
+64 @ at
+65 A
+66 B
+67 C
+68 D
+69 E
+70 F
+71 G
+72 H
+73 I
+74 J
+75 K
+76 L
+77 M
+78 N
+79 O
+80 P
+81 Q
+82 R
+83 S
+84 T
+85 U
+86 V
+87 W
+88 X
+89 Y
+90 Z
+91 [ lB
+92 \ rs
+93 ] rB
+94 a^ ^ ha
+95 _
+96 ` oq
+97 a
+98 b
+99 c
+100 d
+101 e
+102 f
+103 g
+104 h
+105 i
+106 j
+107 k
+108 l
+109 m
+110 n
+111 o
+112 p
+113 q
+114 r
+115 s
+116 t
+117 u
+118 v
+119 w
+120 x
+121 y
+122 z
+123 lC {
+124 ba |
+125 rC }
+126 a~ ~
+127 ad
diff --git a/font/devhtml/DESC.proto b/font/devhtml/DESC.proto
new file mode 100644
index 0000000..0c9c0cc
--- /dev/null
+++ b/font/devhtml/DESC.proto
@@ -0,0 +1,13 @@
+res 240
+hor 24
+vert 40
+unitwidth 10
+sizes 1-1000 0
+fonts 9 R I B BI CR CI CB CBI S
+tcommand
+unscaled_charwidths
+postpro post-grohtml
+prepro pre-grohtml
+use_charnames_in_special
+pass_filenames
+unicode
diff --git a/font/devhtml/R.in b/font/devhtml/R.in
new file mode 100644
index 0000000..849c0b6
--- /dev/null
+++ b/font/devhtml/R.in
@@ -0,0 +1,8 @@
+name R
+internalname 0
+spacewidth 24
+charset
+hy 24 0 0x002D
+- "
+la 24 0 0x2329
+ra 24 0 0x232A
diff --git a/font/devhtml/R.proto b/font/devhtml/R.proto
new file mode 100644
index 0000000..bfe06e7
--- /dev/null
+++ b/font/devhtml/R.proto
@@ -0,0 +1,1035 @@
+name R
+internalname 0
+spacewidth 24
+# TODO:
+#- 24 0 0x2010
+#hy "
+charset
+' 24 0 0x2019
+- 24 0 0x002D
+hy "
+` 24 0 0x2018
+^ 24 0 0x02C6
+~ 24 0 0x02DC
+la 24 0 0x2329
+ra 24 0 0x232A
+u0041_0300 24 0 0x00C0
+u0041_0301 24 0 0x00C1
+u0041_0302 24 0 0x00C2
+u0041_0303 24 0 0x00C3
+u0041_0308 24 0 0x00C4
+u0041_030A 24 0 0x00C5
+u0043_0327 24 0 0x00C7
+u0045_0300 24 0 0x00C8
+u0045_0301 24 0 0x00C9
+u0045_0302 24 0 0x00CA
+u0045_0308 24 0 0x00CB
+u0049_0300 24 0 0x00CC
+u0049_0301 24 0 0x00CD
+u0049_0302 24 0 0x00CE
+u0049_0308 24 0 0x00CF
+u004E_0303 24 0 0x00D1
+u004F_0300 24 0 0x00D2
+u004F_0301 24 0 0x00D3
+u004F_0302 24 0 0x00D4
+u004F_0303 24 0 0x00D5
+u004F_0308 24 0 0x00D6
+u0055_0300 24 0 0x00D9
+u0055_0301 24 0 0x00DA
+u0055_0302 24 0 0x00DB
+u0055_0308 24 0 0x00DC
+u0059_0301 24 0 0x00DD
+u0061_0300 24 0 0x00E0
+u0061_0301 24 0 0x00E1
+u0061_0302 24 0 0x00E2
+u0061_0303 24 0 0x00E3
+u0061_0308 24 0 0x00E4
+u0061_030A 24 0 0x00E5
+u0063_0327 24 0 0x00E7
+u0065_0300 24 0 0x00E8
+u0065_0301 24 0 0x00E9
+u0065_0302 24 0 0x00EA
+u0065_0308 24 0 0x00EB
+u0069_0300 24 0 0x00EC
+u0069_0301 24 0 0x00ED
+u0069_0302 24 0 0x00EE
+u0069_0308 24 0 0x00EF
+u006E_0303 24 0 0x00F1
+u006F_0300 24 0 0x00F2
+u006F_0301 24 0 0x00F3
+u006F_0302 24 0 0x00F4
+u006F_0303 24 0 0x00F5
+u006F_0308 24 0 0x00F6
+u0075_0300 24 0 0x00F9
+u0075_0301 24 0 0x00FA
+u0075_0302 24 0 0x00FB
+u0075_0308 24 0 0x00FC
+u0079_0301 24 0 0x00FD
+u0079_0308 24 0 0x00FF
+u0041_0304 24 0 0x0100
+u0061_0304 24 0 0x0101
+u0041_0306 24 0 0x0102
+u0061_0306 24 0 0x0103
+u0041_0328 24 0 0x0104
+u0061_0328 24 0 0x0105
+u0043_0301 24 0 0x0106
+u0063_0301 24 0 0x0107
+u0043_0302 24 0 0x0108
+u0063_0302 24 0 0x0109
+u0043_0307 24 0 0x010A
+u0063_0307 24 0 0x010B
+u0043_030C 24 0 0x010C
+u0063_030C 24 0 0x010D
+u0044_030C 24 0 0x010E
+u0064_030C 24 0 0x010F
+u0045_0304 24 0 0x0112
+u0065_0304 24 0 0x0113
+u0045_0306 24 0 0x0114
+u0065_0306 24 0 0x0115
+u0045_0307 24 0 0x0116
+u0065_0307 24 0 0x0117
+u0045_0328 24 0 0x0118
+u0065_0328 24 0 0x0119
+u0045_030C 24 0 0x011A
+u0065_030C 24 0 0x011B
+u0047_0302 24 0 0x011C
+u0067_0302 24 0 0x011D
+u0047_0306 24 0 0x011E
+u0067_0306 24 0 0x011F
+u0047_0307 24 0 0x0120
+u0067_0307 24 0 0x0121
+u0047_0327 24 0 0x0122
+u0067_0327 24 0 0x0123
+u0048_0302 24 0 0x0124
+u0068_0302 24 0 0x0125
+u0049_0303 24 0 0x0128
+u0069_0303 24 0 0x0129
+u0049_0304 24 0 0x012A
+u0069_0304 24 0 0x012B
+u0049_0306 24 0 0x012C
+u0069_0306 24 0 0x012D
+u0049_0328 24 0 0x012E
+u0069_0328 24 0 0x012F
+u0049_0307 24 0 0x0130
+u004A_0302 24 0 0x0134
+u006A_0302 24 0 0x0135
+u004B_0327 24 0 0x0136
+u006B_0327 24 0 0x0137
+u004C_0301 24 0 0x0139
+u006C_0301 24 0 0x013A
+u004C_0327 24 0 0x013B
+u006C_0327 24 0 0x013C
+u004C_030C 24 0 0x013D
+u006C_030C 24 0 0x013E
+u004E_0301 24 0 0x0143
+u006E_0301 24 0 0x0144
+u004E_0327 24 0 0x0145
+u006E_0327 24 0 0x0146
+u004E_030C 24 0 0x0147
+u006E_030C 24 0 0x0148
+u004F_0304 24 0 0x014C
+u006F_0304 24 0 0x014D
+u004F_0306 24 0 0x014E
+u006F_0306 24 0 0x014F
+u004F_030B 24 0 0x0150
+u006F_030B 24 0 0x0151
+u0052_0301 24 0 0x0154
+u0072_0301 24 0 0x0155
+u0052_0327 24 0 0x0156
+u0072_0327 24 0 0x0157
+u0052_030C 24 0 0x0158
+u0072_030C 24 0 0x0159
+u0053_0301 24 0 0x015A
+u0073_0301 24 0 0x015B
+u0053_0302 24 0 0x015C
+u0073_0302 24 0 0x015D
+u0053_0327 24 0 0x015E
+u0073_0327 24 0 0x015F
+u0053_030C 24 0 0x0160
+u0073_030C 24 0 0x0161
+u0054_0327 24 0 0x0162
+u0074_0327 24 0 0x0163
+u0054_030C 24 0 0x0164
+u0074_030C 24 0 0x0165
+u0055_0303 24 0 0x0168
+u0075_0303 24 0 0x0169
+u0055_0304 24 0 0x016A
+u0075_0304 24 0 0x016B
+u0055_0306 24 0 0x016C
+u0075_0306 24 0 0x016D
+u0055_030A 24 0 0x016E
+u0075_030A 24 0 0x016F
+u0055_030B 24 0 0x0170
+u0075_030B 24 0 0x0171
+u0055_0328 24 0 0x0172
+u0075_0328 24 0 0x0173
+u0057_0302 24 0 0x0174
+u0077_0302 24 0 0x0175
+u0059_0302 24 0 0x0176
+u0079_0302 24 0 0x0177
+u0059_0308 24 0 0x0178
+u005A_0301 24 0 0x0179
+u007A_0301 24 0 0x017A
+u005A_0307 24 0 0x017B
+u007A_0307 24 0 0x017C
+u005A_030C 24 0 0x017D
+u007A_030C 24 0 0x017E
+u004F_031B 24 0 0x01A0
+u006F_031B 24 0 0x01A1
+u0055_031B 24 0 0x01AF
+u0075_031B 24 0 0x01B0
+u0041_030C 24 0 0x01CD
+u0061_030C 24 0 0x01CE
+u0049_030C 24 0 0x01CF
+u0069_030C 24 0 0x01D0
+u004F_030C 24 0 0x01D1
+u006F_030C 24 0 0x01D2
+u0055_030C 24 0 0x01D3
+u0075_030C 24 0 0x01D4
+u0055_0308_0304 24 0 0x01D5
+u0075_0308_0304 24 0 0x01D6
+u0055_0308_0301 24 0 0x01D7
+u0075_0308_0301 24 0 0x01D8
+u0055_0308_030C 24 0 0x01D9
+u0075_0308_030C 24 0 0x01DA
+u0055_0308_0300 24 0 0x01DB
+u0075_0308_0300 24 0 0x01DC
+u0041_0308_0304 24 0 0x01DE
+u0061_0308_0304 24 0 0x01DF
+u0041_0307_0304 24 0 0x01E0
+u0061_0307_0304 24 0 0x01E1
+u00C6_0304 24 0 0x01E2
+u00E6_0304 24 0 0x01E3
+u0047_030C 24 0 0x01E6
+u0067_030C 24 0 0x01E7
+u004B_030C 24 0 0x01E8
+u006B_030C 24 0 0x01E9
+u004F_0328 24 0 0x01EA
+u006F_0328 24 0 0x01EB
+u004F_0328_0304 24 0 0x01EC
+u006F_0328_0304 24 0 0x01ED
+u01B7_030C 24 0 0x01EE
+u0292_030C 24 0 0x01EF
+u006A_030C 24 0 0x01F0
+u0047_0301 24 0 0x01F4
+u0067_0301 24 0 0x01F5
+u004E_0300 24 0 0x01F8
+u006E_0300 24 0 0x01F9
+u0041_030A_0301 24 0 0x01FA
+u0061_030A_0301 24 0 0x01FB
+u00C6_0301 24 0 0x01FC
+u00E6_0301 24 0 0x01FD
+u00D8_0301 24 0 0x01FE
+u00F8_0301 24 0 0x01FF
+u0041_030F 24 0 0x0200
+u0061_030F 24 0 0x0201
+u0041_0311 24 0 0x0202
+u0061_0311 24 0 0x0203
+u0045_030F 24 0 0x0204
+u0065_030F 24 0 0x0205
+u0045_0311 24 0 0x0206
+u0065_0311 24 0 0x0207
+u0049_030F 24 0 0x0208
+u0069_030F 24 0 0x0209
+u0049_0311 24 0 0x020A
+u0069_0311 24 0 0x020B
+u004F_030F 24 0 0x020C
+u006F_030F 24 0 0x020D
+u004F_0311 24 0 0x020E
+u006F_0311 24 0 0x020F
+u0052_030F 24 0 0x0210
+u0072_030F 24 0 0x0211
+u0052_0311 24 0 0x0212
+u0072_0311 24 0 0x0213
+u0055_030F 24 0 0x0214
+u0075_030F 24 0 0x0215
+u0055_0311 24 0 0x0216
+u0075_0311 24 0 0x0217
+u0053_0326 24 0 0x0218
+u0073_0326 24 0 0x0219
+u0054_0326 24 0 0x021A
+u0074_0326 24 0 0x021B
+u0048_030C 24 0 0x021E
+u0068_030C 24 0 0x021F
+u0041_0307 24 0 0x0226
+u0061_0307 24 0 0x0227
+u0045_0327 24 0 0x0228
+u0065_0327 24 0 0x0229
+u004F_0308_0304 24 0 0x022A
+u006F_0308_0304 24 0 0x022B
+u004F_0303_0304 24 0 0x022C
+u006F_0303_0304 24 0 0x022D
+u004F_0307 24 0 0x022E
+u006F_0307 24 0 0x022F
+u004F_0307_0304 24 0 0x0230
+u006F_0307_0304 24 0 0x0231
+u0059_0304 24 0 0x0232
+u0079_0304 24 0 0x0233
+u0308_0301 24 0 0x0344
+u00A8_0301 24 0 0x0385
+u0391_0301 24 0 0x0386
+u0395_0301 24 0 0x0388
+u0397_0301 24 0 0x0389
+u0399_0301 24 0 0x038A
+u039F_0301 24 0 0x038C
+u03A5_0301 24 0 0x038E
+u03A9_0301 24 0 0x038F
+u03B9_0308_0301 24 0 0x0390
+u0399_0308 24 0 0x03AA
+u03A5_0308 24 0 0x03AB
+u03B1_0301 24 0 0x03AC
+u03B5_0301 24 0 0x03AD
+u03B7_0301 24 0 0x03AE
+u03B9_0301 24 0 0x03AF
+u03C5_0308_0301 24 0 0x03B0
+u03B9_0308 24 0 0x03CA
+u03C5_0308 24 0 0x03CB
+u03BF_0301 24 0 0x03CC
+u03C5_0301 24 0 0x03CD
+u03C9_0301 24 0 0x03CE
+u03D2_0301 24 0 0x03D3
+u03D2_0308 24 0 0x03D4
+u0415_0300 24 0 0x0400
+u0415_0308 24 0 0x0401
+u0413_0301 24 0 0x0403
+u0406_0308 24 0 0x0407
+u041A_0301 24 0 0x040C
+u0418_0300 24 0 0x040D
+u0423_0306 24 0 0x040E
+u0418_0306 24 0 0x0419
+u0438_0306 24 0 0x0439
+u0435_0300 24 0 0x0450
+u0435_0308 24 0 0x0451
+u0433_0301 24 0 0x0453
+u0456_0308 24 0 0x0457
+u043A_0301 24 0 0x045C
+u0438_0300 24 0 0x045D
+u0443_0306 24 0 0x045E
+u0474_030F 24 0 0x0476
+u0475_030F 24 0 0x0477
+u0416_0306 24 0 0x04C1
+u0436_0306 24 0 0x04C2
+u0410_0306 24 0 0x04D0
+u0430_0306 24 0 0x04D1
+u0410_0308 24 0 0x04D2
+u0430_0308 24 0 0x04D3
+u0415_0306 24 0 0x04D6
+u0435_0306 24 0 0x04D7
+u04D8_0308 24 0 0x04DA
+u04D9_0308 24 0 0x04DB
+u0416_0308 24 0 0x04DC
+u0436_0308 24 0 0x04DD
+u0417_0308 24 0 0x04DE
+u0437_0308 24 0 0x04DF
+u0418_0304 24 0 0x04E2
+u0438_0304 24 0 0x04E3
+u0418_0308 24 0 0x04E4
+u0438_0308 24 0 0x04E5
+u041E_0308 24 0 0x04E6
+u043E_0308 24 0 0x04E7
+u04E8_0308 24 0 0x04EA
+u04E9_0308 24 0 0x04EB
+u042D_0308 24 0 0x04EC
+u044D_0308 24 0 0x04ED
+u0423_0304 24 0 0x04EE
+u0443_0304 24 0 0x04EF
+u0423_0308 24 0 0x04F0
+u0443_0308 24 0 0x04F1
+u0423_030B 24 0 0x04F2
+u0443_030B 24 0 0x04F3
+u0427_0308 24 0 0x04F4
+u0447_0308 24 0 0x04F5
+u042B_0308 24 0 0x04F8
+u044B_0308 24 0 0x04F9
+u0627_0653 24 0 0x0622
+u0627_0654 24 0 0x0623
+u0648_0654 24 0 0x0624
+u0627_0655 24 0 0x0625
+u064A_0654 24 0 0x0626
+u06D5_0654 24 0 0x06C0
+u06C1_0654 24 0 0x06C2
+u06D2_0654 24 0 0x06D3
+u0928_093C 24 0 0x0929
+u0930_093C 24 0 0x0931
+u0933_093C 24 0 0x0934
+u0915_093C 24 0 0x0958
+u0916_093C 24 0 0x0959
+u0917_093C 24 0 0x095A
+u091C_093C 24 0 0x095B
+u0921_093C 24 0 0x095C
+u0922_093C 24 0 0x095D
+u092B_093C 24 0 0x095E
+u092F_093C 24 0 0x095F
+u09C7_09BE 24 0 0x09CB
+u09C7_09D7 24 0 0x09CC
+u09A1_09BC 24 0 0x09DC
+u09A2_09BC 24 0 0x09DD
+u09AF_09BC 24 0 0x09DF
+u0A32_0A3C 24 0 0x0A33
+u0A38_0A3C 24 0 0x0A36
+u0A16_0A3C 24 0 0x0A59
+u0A17_0A3C 24 0 0x0A5A
+u0A1C_0A3C 24 0 0x0A5B
+u0A2B_0A3C 24 0 0x0A5E
+u0B47_0B56 24 0 0x0B48
+u0B47_0B3E 24 0 0x0B4B
+u0B47_0B57 24 0 0x0B4C
+u0B21_0B3C 24 0 0x0B5C
+u0B22_0B3C 24 0 0x0B5D
+u0B92_0BD7 24 0 0x0B94
+u0BC6_0BBE 24 0 0x0BCA
+u0BC7_0BBE 24 0 0x0BCB
+u0BC6_0BD7 24 0 0x0BCC
+u0C46_0C56 24 0 0x0C48
+u0CBF_0CD5 24 0 0x0CC0
+u0CC6_0CD5 24 0 0x0CC7
+u0CC6_0CD6 24 0 0x0CC8
+u0CC6_0CC2 24 0 0x0CCA
+u0CC6_0CC2_0CD5 24 0 0x0CCB
+u0D46_0D3E 24 0 0x0D4A
+u0D47_0D3E 24 0 0x0D4B
+u0D46_0D57 24 0 0x0D4C
+u0DD9_0DCA 24 0 0x0DDA
+u0DD9_0DCF 24 0 0x0DDC
+u0DD9_0DCF_0DCA 24 0 0x0DDD
+u0DD9_0DDF 24 0 0x0DDE
+u0F42_0FB7 24 0 0x0F43
+u0F4C_0FB7 24 0 0x0F4D
+u0F51_0FB7 24 0 0x0F52
+u0F56_0FB7 24 0 0x0F57
+u0F5B_0FB7 24 0 0x0F5C
+u0F40_0FB5 24 0 0x0F69
+u0F71_0F72 24 0 0x0F73
+u0F71_0F74 24 0 0x0F75
+u0FB2_0F80 24 0 0x0F76
+u0FB3_0F80 24 0 0x0F78
+u0F71_0F80 24 0 0x0F81
+u0F92_0FB7 24 0 0x0F93
+u0F9C_0FB7 24 0 0x0F9D
+u0FA1_0FB7 24 0 0x0FA2
+u0FA6_0FB7 24 0 0x0FA7
+u0FAB_0FB7 24 0 0x0FAC
+u0F90_0FB5 24 0 0x0FB9
+u1025_102E 24 0 0x1026
+u0041_0325 24 0 0x1E00
+u0061_0325 24 0 0x1E01
+u0042_0307 24 0 0x1E02
+u0062_0307 24 0 0x1E03
+u0042_0323 24 0 0x1E04
+u0062_0323 24 0 0x1E05
+u0042_0331 24 0 0x1E06
+u0062_0331 24 0 0x1E07
+u0043_0327_0301 24 0 0x1E08
+u0063_0327_0301 24 0 0x1E09
+u0044_0307 24 0 0x1E0A
+u0064_0307 24 0 0x1E0B
+u0044_0323 24 0 0x1E0C
+u0064_0323 24 0 0x1E0D
+u0044_0331 24 0 0x1E0E
+u0064_0331 24 0 0x1E0F
+u0044_0327 24 0 0x1E10
+u0064_0327 24 0 0x1E11
+u0044_032D 24 0 0x1E12
+u0064_032D 24 0 0x1E13
+u0045_0304_0300 24 0 0x1E14
+u0065_0304_0300 24 0 0x1E15
+u0045_0304_0301 24 0 0x1E16
+u0065_0304_0301 24 0 0x1E17
+u0045_032D 24 0 0x1E18
+u0065_032D 24 0 0x1E19
+u0045_0330 24 0 0x1E1A
+u0065_0330 24 0 0x1E1B
+u0045_0327_0306 24 0 0x1E1C
+u0065_0327_0306 24 0 0x1E1D
+u0046_0307 24 0 0x1E1E
+u0066_0307 24 0 0x1E1F
+u0047_0304 24 0 0x1E20
+u0067_0304 24 0 0x1E21
+u0048_0307 24 0 0x1E22
+u0068_0307 24 0 0x1E23
+u0048_0323 24 0 0x1E24
+u0068_0323 24 0 0x1E25
+u0048_0308 24 0 0x1E26
+u0068_0308 24 0 0x1E27
+u0048_0327 24 0 0x1E28
+u0068_0327 24 0 0x1E29
+u0048_032E 24 0 0x1E2A
+u0068_032E 24 0 0x1E2B
+u0049_0330 24 0 0x1E2C
+u0069_0330 24 0 0x1E2D
+u0049_0308_0301 24 0 0x1E2E
+u0069_0308_0301 24 0 0x1E2F
+u004B_0301 24 0 0x1E30
+u006B_0301 24 0 0x1E31
+u004B_0323 24 0 0x1E32
+u006B_0323 24 0 0x1E33
+u004B_0331 24 0 0x1E34
+u006B_0331 24 0 0x1E35
+u004C_0323 24 0 0x1E36
+u006C_0323 24 0 0x1E37
+u004C_0323_0304 24 0 0x1E38
+u006C_0323_0304 24 0 0x1E39
+u004C_0331 24 0 0x1E3A
+u006C_0331 24 0 0x1E3B
+u004C_032D 24 0 0x1E3C
+u006C_032D 24 0 0x1E3D
+u004D_0301 24 0 0x1E3E
+u006D_0301 24 0 0x1E3F
+u004D_0307 24 0 0x1E40
+u006D_0307 24 0 0x1E41
+u004D_0323 24 0 0x1E42
+u006D_0323 24 0 0x1E43
+u004E_0307 24 0 0x1E44
+u006E_0307 24 0 0x1E45
+u004E_0323 24 0 0x1E46
+u006E_0323 24 0 0x1E47
+u004E_0331 24 0 0x1E48
+u006E_0331 24 0 0x1E49
+u004E_032D 24 0 0x1E4A
+u006E_032D 24 0 0x1E4B
+u004F_0303_0301 24 0 0x1E4C
+u006F_0303_0301 24 0 0x1E4D
+u004F_0303_0308 24 0 0x1E4E
+u006F_0303_0308 24 0 0x1E4F
+u004F_0304_0300 24 0 0x1E50
+u006F_0304_0300 24 0 0x1E51
+u004F_0304_0301 24 0 0x1E52
+u006F_0304_0301 24 0 0x1E53
+u0050_0301 24 0 0x1E54
+u0070_0301 24 0 0x1E55
+u0050_0307 24 0 0x1E56
+u0070_0307 24 0 0x1E57
+u0052_0307 24 0 0x1E58
+u0072_0307 24 0 0x1E59
+u0052_0323 24 0 0x1E5A
+u0072_0323 24 0 0x1E5B
+u0052_0323_0304 24 0 0x1E5C
+u0072_0323_0304 24 0 0x1E5D
+u0052_0331 24 0 0x1E5E
+u0072_0331 24 0 0x1E5F
+u0053_0307 24 0 0x1E60
+u0073_0307 24 0 0x1E61
+u0053_0323 24 0 0x1E62
+u0073_0323 24 0 0x1E63
+u0053_0301_0307 24 0 0x1E64
+u0073_0301_0307 24 0 0x1E65
+u0053_030C_0307 24 0 0x1E66
+u0073_030C_0307 24 0 0x1E67
+u0053_0323_0307 24 0 0x1E68
+u0073_0323_0307 24 0 0x1E69
+u0054_0307 24 0 0x1E6A
+u0074_0307 24 0 0x1E6B
+u0054_0323 24 0 0x1E6C
+u0074_0323 24 0 0x1E6D
+u0054_0331 24 0 0x1E6E
+u0074_0331 24 0 0x1E6F
+u0054_032D 24 0 0x1E70
+u0074_032D 24 0 0x1E71
+u0055_0324 24 0 0x1E72
+u0075_0324 24 0 0x1E73
+u0055_0330 24 0 0x1E74
+u0075_0330 24 0 0x1E75
+u0055_032D 24 0 0x1E76
+u0075_032D 24 0 0x1E77
+u0055_0303_0301 24 0 0x1E78
+u0075_0303_0301 24 0 0x1E79
+u0055_0304_0308 24 0 0x1E7A
+u0075_0304_0308 24 0 0x1E7B
+u0056_0303 24 0 0x1E7C
+u0076_0303 24 0 0x1E7D
+u0056_0323 24 0 0x1E7E
+u0076_0323 24 0 0x1E7F
+u0057_0300 24 0 0x1E80
+u0077_0300 24 0 0x1E81
+u0057_0301 24 0 0x1E82
+u0077_0301 24 0 0x1E83
+u0057_0308 24 0 0x1E84
+u0077_0308 24 0 0x1E85
+u0057_0307 24 0 0x1E86
+u0077_0307 24 0 0x1E87
+u0057_0323 24 0 0x1E88
+u0077_0323 24 0 0x1E89
+u0058_0307 24 0 0x1E8A
+u0078_0307 24 0 0x1E8B
+u0058_0308 24 0 0x1E8C
+u0078_0308 24 0 0x1E8D
+u0059_0307 24 0 0x1E8E
+u0079_0307 24 0 0x1E8F
+u005A_0302 24 0 0x1E90
+u007A_0302 24 0 0x1E91
+u005A_0323 24 0 0x1E92
+u007A_0323 24 0 0x1E93
+u005A_0331 24 0 0x1E94
+u007A_0331 24 0 0x1E95
+u0068_0331 24 0 0x1E96
+u0074_0308 24 0 0x1E97
+u0077_030A 24 0 0x1E98
+u0079_030A 24 0 0x1E99
+u017F_0307 24 0 0x1E9B
+u0041_0323 24 0 0x1EA0
+u0061_0323 24 0 0x1EA1
+u0041_0309 24 0 0x1EA2
+u0061_0309 24 0 0x1EA3
+u0041_0302_0301 24 0 0x1EA4
+u0061_0302_0301 24 0 0x1EA5
+u0041_0302_0300 24 0 0x1EA6
+u0061_0302_0300 24 0 0x1EA7
+u0041_0302_0309 24 0 0x1EA8
+u0061_0302_0309 24 0 0x1EA9
+u0041_0302_0303 24 0 0x1EAA
+u0061_0302_0303 24 0 0x1EAB
+u0041_0323_0302 24 0 0x1EAC
+u0061_0323_0302 24 0 0x1EAD
+u0041_0306_0301 24 0 0x1EAE
+u0061_0306_0301 24 0 0x1EAF
+u0041_0306_0300 24 0 0x1EB0
+u0061_0306_0300 24 0 0x1EB1
+u0041_0306_0309 24 0 0x1EB2
+u0061_0306_0309 24 0 0x1EB3
+u0041_0306_0303 24 0 0x1EB4
+u0061_0306_0303 24 0 0x1EB5
+u0041_0323_0306 24 0 0x1EB6
+u0061_0323_0306 24 0 0x1EB7
+u0045_0323 24 0 0x1EB8
+u0065_0323 24 0 0x1EB9
+u0045_0309 24 0 0x1EBA
+u0065_0309 24 0 0x1EBB
+u0045_0303 24 0 0x1EBC
+u0065_0303 24 0 0x1EBD
+u0045_0302_0301 24 0 0x1EBE
+u0065_0302_0301 24 0 0x1EBF
+u0045_0302_0300 24 0 0x1EC0
+u0065_0302_0300 24 0 0x1EC1
+u0045_0302_0309 24 0 0x1EC2
+u0065_0302_0309 24 0 0x1EC3
+u0045_0302_0303 24 0 0x1EC4
+u0065_0302_0303 24 0 0x1EC5
+u0045_0323_0302 24 0 0x1EC6
+u0065_0323_0302 24 0 0x1EC7
+u0049_0309 24 0 0x1EC8
+u0069_0309 24 0 0x1EC9
+u0049_0323 24 0 0x1ECA
+u0069_0323 24 0 0x1ECB
+u004F_0323 24 0 0x1ECC
+u006F_0323 24 0 0x1ECD
+u004F_0309 24 0 0x1ECE
+u006F_0309 24 0 0x1ECF
+u004F_0302_0301 24 0 0x1ED0
+u006F_0302_0301 24 0 0x1ED1
+u004F_0302_0300 24 0 0x1ED2
+u006F_0302_0300 24 0 0x1ED3
+u004F_0302_0309 24 0 0x1ED4
+u006F_0302_0309 24 0 0x1ED5
+u004F_0302_0303 24 0 0x1ED6
+u006F_0302_0303 24 0 0x1ED7
+u004F_0323_0302 24 0 0x1ED8
+u006F_0323_0302 24 0 0x1ED9
+u004F_031B_0301 24 0 0x1EDA
+u006F_031B_0301 24 0 0x1EDB
+u004F_031B_0300 24 0 0x1EDC
+u006F_031B_0300 24 0 0x1EDD
+u004F_031B_0309 24 0 0x1EDE
+u006F_031B_0309 24 0 0x1EDF
+u004F_031B_0303 24 0 0x1EE0
+u006F_031B_0303 24 0 0x1EE1
+u004F_031B_0323 24 0 0x1EE2
+u006F_031B_0323 24 0 0x1EE3
+u0055_0323 24 0 0x1EE4
+u0075_0323 24 0 0x1EE5
+u0055_0309 24 0 0x1EE6
+u0075_0309 24 0 0x1EE7
+u0055_031B_0301 24 0 0x1EE8
+u0075_031B_0301 24 0 0x1EE9
+u0055_031B_0300 24 0 0x1EEA
+u0075_031B_0300 24 0 0x1EEB
+u0055_031B_0309 24 0 0x1EEC
+u0075_031B_0309 24 0 0x1EED
+u0055_031B_0303 24 0 0x1EEE
+u0075_031B_0303 24 0 0x1EEF
+u0055_031B_0323 24 0 0x1EF0
+u0075_031B_0323 24 0 0x1EF1
+u0059_0300 24 0 0x1EF2
+u0079_0300 24 0 0x1EF3
+u0059_0323 24 0 0x1EF4
+u0079_0323 24 0 0x1EF5
+u0059_0309 24 0 0x1EF6
+u0079_0309 24 0 0x1EF7
+u0059_0303 24 0 0x1EF8
+u0079_0303 24 0 0x1EF9
+u03B1_0313 24 0 0x1F00
+u03B1_0314 24 0 0x1F01
+u03B1_0313_0300 24 0 0x1F02
+u03B1_0314_0300 24 0 0x1F03
+u03B1_0313_0301 24 0 0x1F04
+u03B1_0314_0301 24 0 0x1F05
+u03B1_0313_0342 24 0 0x1F06
+u03B1_0314_0342 24 0 0x1F07
+u0391_0313 24 0 0x1F08
+u0391_0314 24 0 0x1F09
+u0391_0313_0300 24 0 0x1F0A
+u0391_0314_0300 24 0 0x1F0B
+u0391_0313_0301 24 0 0x1F0C
+u0391_0314_0301 24 0 0x1F0D
+u0391_0313_0342 24 0 0x1F0E
+u0391_0314_0342 24 0 0x1F0F
+u03B5_0313 24 0 0x1F10
+u03B5_0314 24 0 0x1F11
+u03B5_0313_0300 24 0 0x1F12
+u03B5_0314_0300 24 0 0x1F13
+u03B5_0313_0301 24 0 0x1F14
+u03B5_0314_0301 24 0 0x1F15
+u0395_0313 24 0 0x1F18
+u0395_0314 24 0 0x1F19
+u0395_0313_0300 24 0 0x1F1A
+u0395_0314_0300 24 0 0x1F1B
+u0395_0313_0301 24 0 0x1F1C
+u0395_0314_0301 24 0 0x1F1D
+u03B7_0313 24 0 0x1F20
+u03B7_0314 24 0 0x1F21
+u03B7_0313_0300 24 0 0x1F22
+u03B7_0314_0300 24 0 0x1F23
+u03B7_0313_0301 24 0 0x1F24
+u03B7_0314_0301 24 0 0x1F25
+u03B7_0313_0342 24 0 0x1F26
+u03B7_0314_0342 24 0 0x1F27
+u0397_0313 24 0 0x1F28
+u0397_0314 24 0 0x1F29
+u0397_0313_0300 24 0 0x1F2A
+u0397_0314_0300 24 0 0x1F2B
+u0397_0313_0301 24 0 0x1F2C
+u0397_0314_0301 24 0 0x1F2D
+u0397_0313_0342 24 0 0x1F2E
+u0397_0314_0342 24 0 0x1F2F
+u03B9_0313 24 0 0x1F30
+u03B9_0314 24 0 0x1F31
+u03B9_0313_0300 24 0 0x1F32
+u03B9_0314_0300 24 0 0x1F33
+u03B9_0313_0301 24 0 0x1F34
+u03B9_0314_0301 24 0 0x1F35
+u03B9_0313_0342 24 0 0x1F36
+u03B9_0314_0342 24 0 0x1F37
+u0399_0313 24 0 0x1F38
+u0399_0314 24 0 0x1F39
+u0399_0313_0300 24 0 0x1F3A
+u0399_0314_0300 24 0 0x1F3B
+u0399_0313_0301 24 0 0x1F3C
+u0399_0314_0301 24 0 0x1F3D
+u0399_0313_0342 24 0 0x1F3E
+u0399_0314_0342 24 0 0x1F3F
+u03BF_0313 24 0 0x1F40
+u03BF_0314 24 0 0x1F41
+u03BF_0313_0300 24 0 0x1F42
+u03BF_0314_0300 24 0 0x1F43
+u03BF_0313_0301 24 0 0x1F44
+u03BF_0314_0301 24 0 0x1F45
+u039F_0313 24 0 0x1F48
+u039F_0314 24 0 0x1F49
+u039F_0313_0300 24 0 0x1F4A
+u039F_0314_0300 24 0 0x1F4B
+u039F_0313_0301 24 0 0x1F4C
+u039F_0314_0301 24 0 0x1F4D
+u03C5_0313 24 0 0x1F50
+u03C5_0314 24 0 0x1F51
+u03C5_0313_0300 24 0 0x1F52
+u03C5_0314_0300 24 0 0x1F53
+u03C5_0313_0301 24 0 0x1F54
+u03C5_0314_0301 24 0 0x1F55
+u03C5_0313_0342 24 0 0x1F56
+u03C5_0314_0342 24 0 0x1F57
+u03A5_0314 24 0 0x1F59
+u03A5_0314_0300 24 0 0x1F5B
+u03A5_0314_0301 24 0 0x1F5D
+u03A5_0314_0342 24 0 0x1F5F
+u03C9_0313 24 0 0x1F60
+u03C9_0314 24 0 0x1F61
+u03C9_0313_0300 24 0 0x1F62
+u03C9_0314_0300 24 0 0x1F63
+u03C9_0313_0301 24 0 0x1F64
+u03C9_0314_0301 24 0 0x1F65
+u03C9_0313_0342 24 0 0x1F66
+u03C9_0314_0342 24 0 0x1F67
+u03A9_0313 24 0 0x1F68
+u03A9_0314 24 0 0x1F69
+u03A9_0313_0300 24 0 0x1F6A
+u03A9_0314_0300 24 0 0x1F6B
+u03A9_0313_0301 24 0 0x1F6C
+u03A9_0314_0301 24 0 0x1F6D
+u03A9_0313_0342 24 0 0x1F6E
+u03A9_0314_0342 24 0 0x1F6F
+u03B1_0300 24 0 0x1F70
+u03B1_0301 24 0 0x1F71
+u03B5_0300 24 0 0x1F72
+u03B5_0301 24 0 0x1F73
+u03B7_0300 24 0 0x1F74
+u03B7_0301 24 0 0x1F75
+u03B9_0300 24 0 0x1F76
+u03B9_0301 24 0 0x1F77
+u03BF_0300 24 0 0x1F78
+u03BF_0301 24 0 0x1F79
+u03C5_0300 24 0 0x1F7A
+u03C5_0301 24 0 0x1F7B
+u03C9_0300 24 0 0x1F7C
+u03C9_0301 24 0 0x1F7D
+u03B1_0313_0345 24 0 0x1F80
+u03B1_0314_0345 24 0 0x1F81
+u03B1_0313_0300_0345 24 0 0x1F82
+u03B1_0314_0300_0345 24 0 0x1F83
+u03B1_0313_0301_0345 24 0 0x1F84
+u03B1_0314_0301_0345 24 0 0x1F85
+u03B1_0313_0342_0345 24 0 0x1F86
+u03B1_0314_0342_0345 24 0 0x1F87
+u0391_0313_0345 24 0 0x1F88
+u0391_0314_0345 24 0 0x1F89
+u0391_0313_0300_0345 24 0 0x1F8A
+u0391_0314_0300_0345 24 0 0x1F8B
+u0391_0313_0301_0345 24 0 0x1F8C
+u0391_0314_0301_0345 24 0 0x1F8D
+u0391_0313_0342_0345 24 0 0x1F8E
+u0391_0314_0342_0345 24 0 0x1F8F
+u03B7_0313_0345 24 0 0x1F90
+u03B7_0314_0345 24 0 0x1F91
+u03B7_0313_0300_0345 24 0 0x1F92
+u03B7_0314_0300_0345 24 0 0x1F93
+u03B7_0313_0301_0345 24 0 0x1F94
+u03B7_0314_0301_0345 24 0 0x1F95
+u03B7_0313_0342_0345 24 0 0x1F96
+u03B7_0314_0342_0345 24 0 0x1F97
+u0397_0313_0345 24 0 0x1F98
+u0397_0314_0345 24 0 0x1F99
+u0397_0313_0300_0345 24 0 0x1F9A
+u0397_0314_0300_0345 24 0 0x1F9B
+u0397_0313_0301_0345 24 0 0x1F9C
+u0397_0314_0301_0345 24 0 0x1F9D
+u0397_0313_0342_0345 24 0 0x1F9E
+u0397_0314_0342_0345 24 0 0x1F9F
+u03C9_0313_0345 24 0 0x1FA0
+u03C9_0314_0345 24 0 0x1FA1
+u03C9_0313_0300_0345 24 0 0x1FA2
+u03C9_0314_0300_0345 24 0 0x1FA3
+u03C9_0313_0301_0345 24 0 0x1FA4
+u03C9_0314_0301_0345 24 0 0x1FA5
+u03C9_0313_0342_0345 24 0 0x1FA6
+u03C9_0314_0342_0345 24 0 0x1FA7
+u03A9_0313_0345 24 0 0x1FA8
+u03A9_0314_0345 24 0 0x1FA9
+u03A9_0313_0300_0345 24 0 0x1FAA
+u03A9_0314_0300_0345 24 0 0x1FAB
+u03A9_0313_0301_0345 24 0 0x1FAC
+u03A9_0314_0301_0345 24 0 0x1FAD
+u03A9_0313_0342_0345 24 0 0x1FAE
+u03A9_0314_0342_0345 24 0 0x1FAF
+u03B1_0306 24 0 0x1FB0
+u03B1_0304 24 0 0x1FB1
+u03B1_0300_0345 24 0 0x1FB2
+u03B1_0345 24 0 0x1FB3
+u03B1_0301_0345 24 0 0x1FB4
+u03B1_0342 24 0 0x1FB6
+u03B1_0342_0345 24 0 0x1FB7
+u0391_0306 24 0 0x1FB8
+u0391_0304 24 0 0x1FB9
+u0391_0300 24 0 0x1FBA
+u0391_0301 24 0 0x1FBB
+u0391_0345 24 0 0x1FBC
+u00A8_0342 24 0 0x1FC1
+u03B7_0300_0345 24 0 0x1FC2
+u03B7_0345 24 0 0x1FC3
+u03B7_0301_0345 24 0 0x1FC4
+u03B7_0342 24 0 0x1FC6
+u03B7_0342_0345 24 0 0x1FC7
+u0395_0300 24 0 0x1FC8
+u0395_0301 24 0 0x1FC9
+u0397_0300 24 0 0x1FCA
+u0397_0301 24 0 0x1FCB
+u0397_0345 24 0 0x1FCC
+u1FBF_0300 24 0 0x1FCD
+u1FBF_0301 24 0 0x1FCE
+u1FBF_0342 24 0 0x1FCF
+u03B9_0306 24 0 0x1FD0
+u03B9_0304 24 0 0x1FD1
+u03B9_0308_0300 24 0 0x1FD2
+u03B9_0308_0301 24 0 0x1FD3
+u03B9_0342 24 0 0x1FD6
+u03B9_0308_0342 24 0 0x1FD7
+u0399_0306 24 0 0x1FD8
+u0399_0304 24 0 0x1FD9
+u0399_0300 24 0 0x1FDA
+u0399_0301 24 0 0x1FDB
+u1FFE_0300 24 0 0x1FDD
+u1FFE_0301 24 0 0x1FDE
+u1FFE_0342 24 0 0x1FDF
+u03C5_0306 24 0 0x1FE0
+u03C5_0304 24 0 0x1FE1
+u03C5_0308_0300 24 0 0x1FE2
+u03C5_0308_0301 24 0 0x1FE3
+u03C1_0313 24 0 0x1FE4
+u03C1_0314 24 0 0x1FE5
+u03C5_0342 24 0 0x1FE6
+u03C5_0308_0342 24 0 0x1FE7
+u03A5_0306 24 0 0x1FE8
+u03A5_0304 24 0 0x1FE9
+u03A5_0300 24 0 0x1FEA
+u03A5_0301 24 0 0x1FEB
+u03A1_0314 24 0 0x1FEC
+u00A8_0300 24 0 0x1FED
+u00A8_0301 24 0 0x1FEE
+u03C9_0300_0345 24 0 0x1FF2
+u03C9_0345 24 0 0x1FF3
+u03C9_0301_0345 24 0 0x1FF4
+u03C9_0342 24 0 0x1FF6
+u03C9_0342_0345 24 0 0x1FF7
+u039F_0300 24 0 0x1FF8
+u039F_0301 24 0 0x1FF9
+u03A9_0300 24 0 0x1FFA
+u03A9_0301 24 0 0x1FFB
+u03A9_0345 24 0 0x1FFC
+u0041_030A 24 0 0x212B
+u2190_0338 24 0 0x219A
+u2192_0338 24 0 0x219B
+u2194_0338 24 0 0x21AE
+u21D0_0338 24 0 0x21CD
+u21D4_0338 24 0 0x21CE
+u21D2_0338 24 0 0x21CF
+u2203_0338 24 0 0x2204
+u2208_0338 24 0 0x2209
+u220B_0338 24 0 0x220C
+u2223_0338 24 0 0x2224
+u2225_0338 24 0 0x2226
+u223C_0338 24 0 0x2241
+u2243_0338 24 0 0x2244
+u2245_0338 24 0 0x2247
+u2248_0338 24 0 0x2249
+u003D_0338 24 0 0x2260
+u2261_0338 24 0 0x2262
+u224D_0338 24 0 0x226D
+u003C_0338 24 0 0x226E
+u003E_0338 24 0 0x226F
+u2264_0338 24 0 0x2270
+u2265_0338 24 0 0x2271
+u2272_0338 24 0 0x2274
+u2273_0338 24 0 0x2275
+u2276_0338 24 0 0x2278
+u2277_0338 24 0 0x2279
+u227A_0338 24 0 0x2280
+u227B_0338 24 0 0x2281
+u2282_0338 24 0 0x2284
+u2283_0338 24 0 0x2285
+u2286_0338 24 0 0x2288
+u2287_0338 24 0 0x2289
+u22A2_0338 24 0 0x22AC
+u22A8_0338 24 0 0x22AD
+u22A9_0338 24 0 0x22AE
+u22AB_0338 24 0 0x22AF
+u227C_0338 24 0 0x22E0
+u227D_0338 24 0 0x22E1
+u2291_0338 24 0 0x22E2
+u2292_0338 24 0 0x22E3
+u22B2_0338 24 0 0x22EA
+u22B3_0338 24 0 0x22EB
+u22B4_0338 24 0 0x22EC
+u22B5_0338 24 0 0x22ED
+u2ADD_0338 24 0 0x2ADC
+u304B_3099 24 0 0x304C
+u304D_3099 24 0 0x304E
+u304F_3099 24 0 0x3050
+u3051_3099 24 0 0x3052
+u3053_3099 24 0 0x3054
+u3055_3099 24 0 0x3056
+u3057_3099 24 0 0x3058
+u3059_3099 24 0 0x305A
+u305B_3099 24 0 0x305C
+u305D_3099 24 0 0x305E
+u305F_3099 24 0 0x3060
+u3061_3099 24 0 0x3062
+u3064_3099 24 0 0x3065
+u3066_3099 24 0 0x3067
+u3068_3099 24 0 0x3069
+u306F_3099 24 0 0x3070
+u306F_309A 24 0 0x3071
+u3072_3099 24 0 0x3073
+u3072_309A 24 0 0x3074
+u3075_3099 24 0 0x3076
+u3075_309A 24 0 0x3077
+u3078_3099 24 0 0x3079
+u3078_309A 24 0 0x307A
+u307B_3099 24 0 0x307C
+u307B_309A 24 0 0x307D
+u3046_3099 24 0 0x3094
+u309D_3099 24 0 0x309E
+u30AB_3099 24 0 0x30AC
+u30AD_3099 24 0 0x30AE
+u30AF_3099 24 0 0x30B0
+u30B1_3099 24 0 0x30B2
+u30B3_3099 24 0 0x30B4
+u30B5_3099 24 0 0x30B6
+u30B7_3099 24 0 0x30B8
+u30B9_3099 24 0 0x30BA
+u30BB_3099 24 0 0x30BC
+u30BD_3099 24 0 0x30BE
+u30BF_3099 24 0 0x30C0
+u30C1_3099 24 0 0x30C2
+u30C4_3099 24 0 0x30C5
+u30C6_3099 24 0 0x30C7
+u30C8_3099 24 0 0x30C9
+u30CF_3099 24 0 0x30D0
+u30CF_309A 24 0 0x30D1
+u30D2_3099 24 0 0x30D3
+u30D2_309A 24 0 0x30D4
+u30D5_3099 24 0 0x30D6
+u30D5_309A 24 0 0x30D7
+u30D8_3099 24 0 0x30D9
+u30D8_309A 24 0 0x30DA
+u30DB_3099 24 0 0x30DC
+u30DB_309A 24 0 0x30DD
+u30A6_3099 24 0 0x30F4
+u30EF_3099 24 0 0x30F7
+u30F0_3099 24 0 0x30F8
+u30F1_3099 24 0 0x30F9
+u30F2_3099 24 0 0x30FA
+u30FD_3099 24 0 0x30FE
+u05D9_05B4 24 0 0xFB1D
+u05F2_05B7 24 0 0xFB1F
+u05E9_05C1 24 0 0xFB2A
+u05E9_05C2 24 0 0xFB2B
+u05E9_05BC_05C1 24 0 0xFB2C
+u05E9_05BC_05C2 24 0 0xFB2D
+u05D0_05B7 24 0 0xFB2E
+u05D0_05B8 24 0 0xFB2F
+u05D0_05BC 24 0 0xFB30
+u05D1_05BC 24 0 0xFB31
+u05D2_05BC 24 0 0xFB32
+u05D3_05BC 24 0 0xFB33
+u05D4_05BC 24 0 0xFB34
+u05D5_05BC 24 0 0xFB35
+u05D6_05BC 24 0 0xFB36
+u05D8_05BC 24 0 0xFB38
+u05D9_05BC 24 0 0xFB39
+u05DA_05BC 24 0 0xFB3A
+u05DB_05BC 24 0 0xFB3B
+u05DC_05BC 24 0 0xFB3C
+u05DE_05BC 24 0 0xFB3E
+u05E0_05BC 24 0 0xFB40
+u05E1_05BC 24 0 0xFB41
+u05E3_05BC 24 0 0xFB43
+u05E4_05BC 24 0 0xFB44
+u05E6_05BC 24 0 0xFB46
+u05E7_05BC 24 0 0xFB47
+u05E8_05BC 24 0 0xFB48
+u05E9_05BC 24 0 0xFB49
+u05EA_05BC 24 0 0xFB4A
+u05D5_05B9 24 0 0xFB4B
+u05D1_05BF 24 0 0xFB4C
+u05DB_05BF 24 0 0xFB4D
+u05E4_05BF 24 0 0xFB4E
+u1D157_1D165 24 0 0x1D15E
+u1D158_1D165 24 0 0x1D15F
+u1D158_1D165_1D16E 24 0 0x1D160
+u1D158_1D165_1D16F 24 0 0x1D161
+u1D158_1D165_1D170 24 0 0x1D162
+u1D158_1D165_1D171 24 0 0x1D163
+u1D158_1D165_1D172 24 0 0x1D164
+u1D1B9_1D165 24 0 0x1D1BB
+u1D1BA_1D165 24 0 0x1D1BC
+u1D1B9_1D165_1D16E 24 0 0x1D1BD
+u1D1BA_1D165_1D16E 24 0 0x1D1BE
+u1D1B9_1D165_1D16F 24 0 0x1D1BF
+u1D1BA_1D165_1D16F 24 0 0x1D1C0
diff --git a/font/devhtml/devhtml.am b/font/devhtml/devhtml.am
new file mode 100644
index 0000000..76f3232
--- /dev/null
+++ b/font/devhtml/devhtml.am
@@ -0,0 +1,69 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+devhtml_srcdir = $(top_srcdir)/font/devhtml
+DEVHTMLFONTS = R I B BI CR CI CB CBI S
+DEVHTMLFONTSFILES = \
+ font/devhtml/R \
+ font/devhtml/I \
+ font/devhtml/B \
+ font/devhtml/BI \
+ font/devhtml/CR \
+ font/devhtml/CI \
+ font/devhtml/CB \
+ font/devhtml/CBI \
+ font/devhtml/S
+
+DEVHTMLRES = 240
+DEVHTMLCPI = 10
+DEVHTMLLPI = 6
+
+devhtmlfontdir = $(fontdir)/devhtml
+devhtmlfont_DATA = $(DEVHTMLFONTSFILES) font/devhtml/DESC
+MOSTLYCLEANFILES += $(DEVHTMLFONTSFILES) font/devhtml/DESC
+EXTRA_DIST += \
+ font/devhtml/R.proto \
+ font/devhtml/DESC.proto \
+ font/devhtml/R.in
+
+$(DEVHTMLFONTSFILES): $(devhtml_srcdir)/R.proto
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && $(RM) $@ \
+ && $(SHELL) $(GENFONTSSH) $(devhtml_srcdir)/R.proto \
+ $(DEVHTMLRES) $(DEVHTMLCPI) `basename $@` >$@
+
+font/devhtml/DESC: $(devhtml_srcdir)/DESC.proto
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && $(SHELL) $(GENDESCSH) $(devhtml_srcdir)/DESC.proto \
+ $(DEVHTMLRES) $(DEVHTMLCPI) $(DEVHTMLLPI) $(DEVHTMLFONTS) \
+ > $@.tmp \
+ && echo "image_generator $(GHOSTSCRIPT)" >>$@.tmp \
+ && mv $@.tmp $@
+
+# HTML documents to be produced by troff should depend on this stamp
+# file to ensure that (post-)grohtml's device and font description files
+# are available.
+MOSTLYCLEANFILES += font/devhtml/stamp
+font/devhtml/stamp: font/devhtml/DESC $(DEVHTMLFONTSFILES)
+ $(AM_V_at)>$@
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/font/devlatin1/DESC.proto b/font/devlatin1/DESC.proto
new file mode 100644
index 0000000..88399ab
--- /dev/null
+++ b/font/devlatin1/DESC.proto
@@ -0,0 +1,8 @@
+res 240
+hor 24
+vert 40
+unitwidth 10
+sizes 10 0
+fonts 4 R I B BI
+tcommand
+postpro grotty
diff --git a/font/devlatin1/R.proto b/font/devlatin1/R.proto
new file mode 100644
index 0000000..b54d0d5
--- /dev/null
+++ b/font/devlatin1/R.proto
@@ -0,0 +1,322 @@
+name R
+internalname 0
+spacewidth 24
+charset
+--- 24 0 0000
+--- 24 0 0001
+--- 24 0 0002
+--- 24 0 0003
+--- 24 0 0004
+--- 24 0 0005
+--- 24 0 0006
+--- 24 0 0007
+--- 24 0 0010
+--- 24 0 0011
+--- 24 0 0012
+--- 24 0 0013
+--- 24 0 0014
+--- 24 0 0015
+--- 24 0 0016
+--- 24 0 0017
+--- 24 0 0020
+--- 24 0 0021
+--- 24 0 0022
+--- 24 0 0023
+--- 24 0 0024
+--- 24 0 0025
+--- 24 0 0026
+--- 24 0 0027
+--- 24 0 0030
+--- 24 0 0031
+--- 24 0 0032
+--- 24 0 0033
+--- 24 0 0034
+--- 24 0 0035
+--- 24 0 0036
+--- 24 0 0037
+! 24 0 0041
+" 24 0 0042
+dq "
+lq "
+rq "
+# 24 0 0043
+sh "
+$ 24 0 0044
+Do "
+% 24 0 0045
+& 24 0 0046
+' 24 0 0047
+fm "
+aq "
+oq "
+cq "
+( 24 0 0050
+) 24 0 0051
+* 24 0 0052
+** "
++ 24 0 0053
+pl "
+, 24 0 0054
+\- 24 0 0055
+mi "
+- "
+hy "
+en "
+. 24 0 0056
+/ 24 0 0057
+sl "
+f/ "
+0 24 0 0060
+1 24 0 0061
+2 24 0 0062
+3 24 0 0063
+4 24 0 0064
+5 24 0 0065
+6 24 0 0066
+7 24 0 0067
+8 24 0 0070
+9 24 0 0071
+: 24 0 0072
+; 24 0 0073
+< 24 0 0074
+la "
+fo "
+= 24 0 0075
+eq "
+> 24 0 0076
+ra "
+fc "
+? 24 0 0077
+@ 24 0 0100
+at "
+A 24 0 0101
+*A "
+B 24 0 0102
+*B "
+C 24 0 0103
+D 24 0 0104
+E 24 0 0105
+*E "
+F 24 0 0106
+G 24 0 0107
+H 24 0 0110
+*Y "
+I 24 0 0111
+*I "
+J 24 0 0112
+K 24 0 0113
+*K "
+L 24 0 0114
+M 24 0 0115
+*M "
+N 24 0 0116
+*N "
+O 24 0 0117
+ci "
+*O "
+P 24 0 0120
+*R "
+Q 24 0 0121
+R 24 0 0122
+S 24 0 0123
+T 24 0 0124
+*T "
+U 24 0 0125
+V 24 0 0126
+W 24 0 0127
+X 24 0 0130
+*X "
+Y 24 0 0131
+*U "
+Z 24 0 0132
+*Z "
+[ 24 0 0133
+lB "
+\ 24 0 0134
+rs "
+] 24 0 0135
+rB "
+^ 24 0 0136
+a^ "
+ha "
+_ 24 0 0137
+ru "
+ul "
+` 24 0 0140
+ga "
+a 24 0 0141
+b 24 0 0142
+c 24 0 0143
+d 24 0 0144
+e 24 0 0145
+f 24 0 0146
+g 24 0 0147
+h 24 0 0150
+i 24 0 0151
+j 24 0 0152
+k 24 0 0153
+l 24 0 0154
+m 24 0 0155
+n 24 0 0156
+o 24 0 0157
+*o "
+p 24 0 0160
+q 24 0 0161
+r 24 0 0162
+s 24 0 0163
+t 24 0 0164
+u 24 0 0165
+v 24 0 0166
+w 24 0 0167
+x 24 0 0170
+y 24 0 0171
+z 24 0 0172
+{ 24 0 0173
+lC "
+| 24 0 0174
+or "
+bv "
+br "
+ba "
+} 24 0 0175
+rC "
+~ 24 0 0176
+a~ "
+ap "
+ti "
+--- 24 0 0177
+--- 24 0 0200
+--- 24 0 0201
+--- 24 0 0202
+--- 24 0 0203
+--- 24 0 0204
+--- 24 0 0205
+--- 24 0 0206
+--- 24 0 0207
+--- 24 0 0210
+--- 24 0 0211
+--- 24 0 0212
+--- 24 0 0213
+--- 24 0 0214
+--- 24 0 0215
+--- 24 0 0216
+--- 24 0 0217
+--- 24 0 0220
+--- 24 0 0221
+--- 24 0 0222
+--- 24 0 0223
+--- 24 0 0224
+--- 24 0 0225
+--- 24 0 0226
+--- 24 0 0227
+--- 24 0 0230
+--- 24 0 0231
+--- 24 0 0232
+--- 24 0 0233
+--- 24 0 0234
+--- 24 0 0235
+--- 24 0 0236
+--- 24 0 0237
+--- 24 0 0240
+r! 24 0 0241
+ct 24 0 0242
+Po 24 0 0243
+Cs 24 0 0244
+Ye 24 0 0245
+bb 24 0 0246
+sc 24 0 0247
+ad 24 0 0250
+co 24 0 0251
+Of 24 0 0252
+Fo 24 0 0253
+no 24 0 0254
+tno "
+--- 24 0 0255
+rg 24 0 0256
+a- 24 0 0257
+de 24 0 0260
+ao "
++- 24 0 0261
+t+- "
+S2 24 0 0262
+S3 24 0 0263
+aa 24 0 0264
+*m 24 0 0265
+mc "
+ps 24 0 0266
+pc 24 0 0267
+md "
+ac 24 0 0270
+S1 24 0 0271
+Om 24 0 0272
+Fc 24 0 0273
+14 24 0 0274
+12 24 0 0275
+34 24 0 0276
+r? 24 0 0277
+`A 24 0 0300
+'A 24 0 0301
+^A 24 0 0302
+~A 24 0 0303
+:A 24 0 0304
+oA 24 0 0305
+AE 24 0 0306
+,C 24 0 0307
+`E 24 0 0310
+'E 24 0 0311
+^E 24 0 0312
+:E 24 0 0313
+`I 24 0 0314
+'I 24 0 0315
+^I 24 0 0316
+:I 24 0 0317
+-D 24 0 0320
+~N 24 0 0321
+`O 24 0 0322
+'O 24 0 0323
+^O 24 0 0324
+~O 24 0 0325
+:O 24 0 0326
+mu 24 0 0327
+tmu "
+/O 24 0 0330
+`U 24 0 0331
+'U 24 0 0332
+^U 24 0 0333
+:U 24 0 0334
+'Y 24 0 0335
+TP 24 0 0336
+ss 24 0 0337
+`a 24 0 0340
+'a 24 0 0341
+^a 24 0 0342
+~a 24 0 0343
+:a 24 0 0344
+oa 24 0 0345
+ae 24 0 0346
+,c 24 0 0347
+`e 24 0 0350
+'e 24 0 0351
+^e 24 0 0352
+:e 24 0 0353
+`i 24 0 0354
+'i 24 0 0355
+^i 24 0 0356
+:i 24 0 0357
+Sd 24 0 0360
+~n 24 0 0361
+`o 24 0 0362
+'o 24 0 0363
+^o 24 0 0364
+~o 24 0 0365
+:o 24 0 0366
+di 24 0 0367
+tdi "
+/o 24 0 0370
+`u 24 0 0371
+'u 24 0 0372
+^u 24 0 0373
+:u 24 0 0374
+'y 24 0 0375
+Tp 24 0 0376
+:y 24 0 0377
diff --git a/font/devlatin1/devlatin1.am b/font/devlatin1/devlatin1.am
new file mode 100644
index 0000000..42d3556
--- /dev/null
+++ b/font/devlatin1/devlatin1.am
@@ -0,0 +1,49 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+devlatin1_srcdir = $(top_srcdir)/font/devlatin1
+DEVLATIN1FONTS = R I B BI
+DEVLATIN1FONTSFILES = \
+ font/devlatin1/R font/devlatin1/I font/devlatin1/B font/devlatin1/BI
+
+DEVLATIN1RES = 240
+DEVLATIN1CPI = 10
+DEVLATIN1LPI = 6
+
+devlatin1fontdir = $(fontdir)/devlatin1
+devlatin1font_DATA = $(DEVLATIN1FONTSFILES) font/devlatin1/DESC
+MOSTLYCLEANFILES += $(DEVLATIN1FONTSFILES) font/devlatin1/DESC
+EXTRA_DIST += font/devlatin1/R.proto font/devlatin1/DESC.proto
+
+$(DEVLATIN1FONTSFILES): $(devlatin1_srcdir)/R.proto
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && $(RM) $@ \
+ && $(SHELL) $(GENFONTSSH) $(devlatin1_srcdir)/R.proto \
+ $(DEVLATIN1RES) $(DEVLATIN1CPI) `basename $@` > $@
+
+font/devlatin1/DESC: $(devlatin1_srcdir)/DESC.proto
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && $(SHELL) $(GENDESCSH) $(devlatin1_srcdir)/DESC.proto \
+ $(DEVLATIN1RES) $(DEVLATIN1CPI) $(DEVLATIN1LPI) \
+ $(DEVLATIN1FONTS) > $@
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/font/devlbp/CB b/font/devlbp/CB
new file mode 100644
index 0000000..1a828a1
--- /dev/null
+++ b/font/devlbp/CB
@@ -0,0 +1,216 @@
+name CB
+lbpname NcourierB
+spacewidth 2200
+slant 0
+charset
+aq 2200 0 0x27 -- 0,39 # quotesingle
+space 2200 0 0x20 -- 0,32
+! 2200 0 0x21 -- 0,33 # exclam
+" 2200 0 0x22 -- 0,34 # quotedbl
+dq 2200 0 0x22 -- 0,34 # quotedbl
+# 2200 0 0x23 -- 0,35 # numbersign
+sh 2200 0 0x23 -- 0,35 # "
+$ 2200 0 0x24 -- 0,36 # dollar
+Do 2200 0 0x24 -- 0,36 # "
+% 2200 0 0x25 -- 0,37 # percent
+& 2200 0 0x26 -- 0,38 # ampersand
+' 2200 0 0x27 -- 0,39 # quoteright
+cq 2200 0 0x27 -- 0,39 # quoteright
+( 2200 0 0x28 -- 0,40 # parenleft
+) 2200 0 0x29 -- 0,41 # parenright
+* 2200 0 0x2a -- 0,42 # asterisk
++ 2200 0 0x2b -- 0,43 # plus
+, 2200 0 0x2c -- 0,44 # comma
+- 2200 0 0x2d -- 0,45 # hyphen
+\- 2200 0 0x2d -- 0,45 # hyphen
+hy 2200 0 0x2d -- 0,45 # "
+. 2200 0 0x2e -- 0,46 # period
+/ 2200 0 0x2f -- 0,47 # slash
+sl 2200 0 0x2f -- 0,47 # "
+0 2200 0 0x30 -- 0,48 # zero
+1 2200 0 0x31 -- 0,49 # one
+2 2200 0 0x32 -- 0,50 # two
+3 2200 0 0x33 -- 0,51 # three
+4 2200 0 0x34 -- 0,52 # four
+5 2200 0 0x35 -- 0,53 # five
+6 2200 0 0x36 -- 0,54 # six
+7 2200 0 0x37 -- 0,55 # seven
+8 2200 0 0x38 -- 0,56 # eight
+9 2200 0 0x39 -- 0,57 # nine
+: 2200 0 0x3a -- 0,58 # colon
+; 2200 0 0x3b -- 0,59 # semicolon
+< 2200 0 0x3c -- 0,60 # less
+= 2200 0 0x3d -- 0,61 # equal
+> 2200 0 0x3e -- 0,62 # greater
+? 2200 0 0x3f -- 0,63 # question
+@ 2200 0 0x40 -- 0,64 # at
+at 2200 0 0x40 -- 0,64 # "
+A 2200 0 0x41 -- 0,65 # A
+B 2200 0 0x42 -- 0,66 # B
+C 2200 0 0x43 -- 0,67 # C
+D 2200 0 0x44 -- 0,68 # D
+E 2200 0 0x45 -- 0,69 # E
+F 2200 0 0x46 -- 0,70 # F
+G 2200 0 0x47 -- 0,71 # G
+H 2200 0 0x48 -- 0,72 # H
+I 2200 0 0x49 -- 0,73 # I
+J 2200 0 0x4a -- 0,74 # J
+K 2200 0 0x4b -- 0,75 # K
+L 2200 0 0x4c -- 0,76 # L
+M 2200 0 0x4d -- 0,77 # M
+N 2200 0 0x4e -- 0,78 # N
+O 2200 0 0x4f -- 0,79 # O
+P 2200 0 0x50 -- 0,80 # P
+Q 2200 0 0x51 -- 0,81 # Q
+R 2200 0 0x52 -- 0,82 # R
+S 2200 0 0x53 -- 0,83 # S
+T 2200 0 0x54 -- 0,84 # T
+U 2200 0 0x55 -- 0,85 # U
+V 2200 0 0x56 -- 0,86 # V
+W 2200 0 0x57 -- 0,87 # W
+X 2200 0 0x58 -- 0,88 # X
+Y 2200 0 0x59 -- 0,89 # Y
+Z 2200 0 0x5a -- 0,90 # Z
+[ 2200 0 0x5b -- 0,91 # bracketleft
+lB 2200 0 0x5b -- 0,91 # "
+\ 2200 0 0x5c -- 0,92 # backslash
+rs 2200 0 0x5c -- 0,92 # "
+] 2200 0 0x5d -- 0,93 # bracketright
+rB 2200 0 0x5d -- 0,93 # "
+a^ 2200 0 0x5e -- 0,94 # circumflex
+^ 2200 0 0x5e -- 0,94 # "
+_ 2200 0 0x5f -- 0,95 # underscore
+` 2200 0 0x60 -- 0,96 # quoteleft
+oq 2200 0 0x60 -- 0,96 # "
+a 2200 0 0x61 -- 0,97 # a
+b 2200 0 0x62 -- 0,98 # b
+c 2200 0 0x63 -- 0,99 # c
+d 2200 0 0x64 -- 0,100 # d
+e 2200 0 0x65 -- 0,101 # e
+f 2200 0 0x66 -- 0,102 # f
+g 2200 0 0x67 -- 0,103 # g
+h 2200 0 0x68 -- 0,104 # h
+i 2200 0 0x69 -- 0,105 # i
+j 2200 0 0x6a -- 0,106 # j
+k 2200 0 0x6b -- 0,107 # k
+l 2200 0 0x6c -- 0,108 # l
+m 2200 0 0x6d -- 0,109 # m
+n 2200 0 0x6e -- 0,110 # n
+o 2200 0 0x6f -- 0,111 # o
+p 2200 0 0x70 -- 0,112 # p
+q 2200 0 0x71 -- 0,113 # q
+r 2200 0 0x72 -- 0,114 # r
+s 2200 0 0x73 -- 0,115 # s
+t 2200 0 0x74 -- 0,116 # t
+u 2200 0 0x75 -- 0,117 # u
+v 2200 0 0x76 -- 0,118 # v
+w 2200 0 0x77 -- 0,119 # w
+x 2200 0 0x78 -- 0,120 # x
+y 2200 0 0x79 -- 0,121 # y
+z 2200 0 0x7a -- 0,122 # z
+lC 2200 0 0x7b -- 0,123 # braceleft
+{ 2200 0 0x7b -- 0,123 # "
+| 2200 0 0x7c -- 0,124 # "
+rC 2200 0 0x7d -- 0,125 # braceright
+} 2200 0 0x7d -- 0,125 # "
+a~ 2200 0 0x7e -- 0,126 # tilde
+~ 2200 0 0x7e -- 0,126 # "
+AE 2200 0 0x92 -- 1,36 # AE
+ae 2200 0 0x91 -- 1,37 # ae
+'E 2200 0 0x90 -- 1,40 # Eacute
+'a 2200 0 0xa0 -- 1,27 # aacute
+'e 2200 0 0x82 -- 1,41 # eacute
+'i 2200 0 0xa1 -- 1,49 # iacute
+'o 2200 0 0xa2 -- 1,59 # oacute
+'u 2200 0 0x95 -- 1,65 # uacute
+:A 2200 0 0x8e -- 1,30 # Adieresis
+:O 2200 0 0x99 -- 1,62 # Odieresis
+:U 2200 0 0x9a -- 1,70 # Udieresis
+:a 2200 0 0x84 -- 1,31 # adieresis
+:e 2200 0 0x89 -- 1,45 # edieresis
+:i 2200 0 0x8b -- 1,53 # idieresis
+:o 2200 0 0x94 -- 1,63 # odieresis
+:u 2200 0 0x81 -- 1,71 # udieresis
+:y 2200 0 0x98 -- 1,75 # ydieresis
+^a 2200 0 0x83 -- 1,29 # acircumflex
+^e 2200 0 0x88 -- 1,43 # ecircumflex
+^i 2200 0 0x8c -- 1,51 # icircumflex
+^o 2200 0 0x93 -- 1,61 # ocircumflex
+^u 2200 0 0x96 -- 1,69 # ucircumflex
+`a 2200 0 0x85 -- 1,33 # agrave
+`e 2200 0 0x8a -- 1,47 # egrave
+`i 2200 0 0x8d -- 1,55 # igrave
+`o 2200 0 0x95 -- 1,65 # ograve
+`u 2200 0 0x97 -- 1,73 # ugrave
+~A 2200 0 0x28e -- 1,26 # Atilde
+~N 2200 0 0xa5 -- 1,56 # Ntilde
+~a 2200 0 0x284 -- --- # atilde
+~n 2200 0 0xa4 -- 1,57 # ntilde
+,C 2200 0 0x80 -- 1,38 # Ccedilla
+,c 2200 0 0x87 -- 1,39 # ccedilla
+oA 2200 0 0x8f -- 1,34 # Aring
+oa 2200 0 0x86 -- 1,35 # aring
+a^ 2200 0 0x5e -- 1,3 # circumflex "circumflex accent"
+a~ 2200 0 0x7e -- 1,2 # tilde "tilde accent"
+Do 2200 0 0x24 -- 0,36 # dollar
+Po 2200 0 0x9c -- 4,11 # sterling
+Ye 2200 0 0x9d -- 4,12 # yen
+Fn 2200 0 0x9f -- 4,14 # florin
+ct 2200 0 0x9b -- 4,19 # cent
+Fo 2200 0 0xae -- 4,9 # guillemotleft
+r! 2200 0 0xad -- 4,7 # exclamdown
+r? 2200 0 0xa8 -- 4,8 # questiondown
+Of 2200 0 0xa6 -- 4,15 # ordfeminine
+Om 2200 0 0xa7 -- 4,16 # ordmasculine
+S2 2200 0 0xfd -- 4,20 # twosuperior
+<- 2200 0 0x1b -- 6,22 # arrowleft
+-> 2200 0 0x1a -- 6,21 # arrowright
+<> 2200 0 0x1d -- 6,25 # arrowboth "horizontal double-headed arrow"
+da 2200 0 0x19 -- 6,24 # arrowdown
+ua 2200 0 0x18 -- 6,23 # arrowup
+va 2200 0 0x12 -- 6,26 # \& "vertical double-headed arrow"
+ba 2200 0 0xb3 -- 3,9 # bar
+bb 2200 0 0x7c -- 0,124 # brokenbar
+ul 2200 0 0x5f -- 0,95 # ul "underline with traditional troff metrics"
+ci 2200 0 0x9 -- 4,1 # circle
+bu 2200 0 0x7 -- 4,0 # bullet
+ps 2200 0 0x14 -- 4,5 # paragraph
+sc 2200 0 0x15 -- 4,6 # section
+de 2200 0 0xf8 -- 6,36 # degree
+12 2200 0 0xab -- 4,17 # onehalf
+14 2200 0 0xac -- 4,18 # onequarter
+hy 2200 0 0x2d -- 6,0 # hyphen
+lB 2200 0 0x5b -- 0,91 # bracketleft
+rB 2200 0 0x5d -- 0,93 # bracketright
+lC 2200 0 0x7b -- 0,123 # braceleft
+rC 2200 0 0x7d -- 0,125 # braceright
+aq 2200 0 0x27 -- 0,39 # quotesingle "apostrophe quote"
+at 2200 0 0x40 -- 0,64 # at
+.C1 2200 0 0x2d -- 0,45 # - minus "minus sign from current font"
+sh 2200 0 0x23 -- 0,35 # numbersign
+sl 2200 0 0x2f -- 0,47 # slash
+rs 2200 0 0x5c -- 0,92 # backslash
+*a 2200 0 0xe0 -- 8,1 # alpha
+*b 2200 0 0xe1 -- 8,3 # beta
+*d 2200 0 0xeb -- 8,9 # delta
+*h 2200 0 0xe9 -- 8,17 # theta
+*m 2200 0 0xe6 -- 8,25 # mu
+*p 2200 0 0xe3 -- 8,33 # pi
+*s 2200 0 0xe5 -- 8,37 # sigma
+*t 2200 0 0xe7 -- 8,41 # tau
+~~ 2200 0 0xf7 -- 6,13 # approxequal
+~= 2200 0 0xf7 -- 6,13 # approxequal
++- 2200 0 0xf1 -- 6,1 # plusminus
+<= 2200 0 0xf3 -- 6,2 # lessequal
+ca 2200 0 0xef -- 6,16 # intersection "intersection, cap"
+-h 2200 0 0xc4 -- 3,8 # hbar
+hbar "
+CL 2200 0 0x5 -- 5,168 # club "club suit"
+SP 2200 0 0x6 -- 5,171 # spade "spade suit"
+HE 2200 0 0x3 -- 5,170 # heart "heart suit"
+DI 2200 0 0x4 -- 5,169 # diamond "diamond suit"
+<< 2200 0 0xae -- 6,77 # "" "much less"
+>> 2200 0 0xaf -- 6,78 # "" "much greater"
+pc 2200 0 0xfa -- 6,32 # periodcentered
+mc 2200 0 0xe6 -- 8,25 # mu
+t+- 2200 0 0xf1 -- 6,1 # plusminus
diff --git a/font/devlbp/CI b/font/devlbp/CI
new file mode 100644
index 0000000..454bfd1
--- /dev/null
+++ b/font/devlbp/CI
@@ -0,0 +1,216 @@
+name CI
+lbpname NcourierI
+spacewidth 2200
+slant 0
+charset
+aq 2200 0 0x27 -- 0,39 # quotesingle
+space 2200 0 0x20 -- 0,32
+! 2200 0 0x21 -- 0,33 # exclam
+" 2200 0 0x22 -- 0,34 # quotedbl
+dq 2200 0 0x22 -- 0,34 # quotedbl
+# 2200 0 0x23 -- 0,35 # numbersign
+sh 2200 0 0x23 -- 0,35 # "
+$ 2200 0 0x24 -- 0,36 # dollar
+Do 2200 0 0x24 -- 0,36 # "
+% 2200 0 0x25 -- 0,37 # percent
+& 2200 0 0x26 -- 0,38 # ampersand
+' 2200 0 0x27 -- 0,39 # quoteright
+cq 2200 0 0x27 -- 0,39 # quoteright
+( 2200 0 0x28 -- 0,40 # parenleft
+) 2200 0 0x29 -- 0,41 # parenright
+* 2200 0 0x2a -- 0,42 # asterisk
++ 2200 0 0x2b -- 0,43 # plus
+, 2200 0 0x2c -- 0,44 # comma
+- 2200 0 0x2d -- 0,45 # hyphen
+\- 2200 0 0x2d -- 0,45 # hyphen
+hy 2200 0 0x2d -- 0,45 # "
+. 2200 0 0x2e -- 0,46 # period
+/ 2200 0 0x2f -- 0,47 # slash
+sl 2200 0 0x2f -- 0,47 # "
+0 2200 0 0x30 -- 0,48 # zero
+1 2200 0 0x31 -- 0,49 # one
+2 2200 0 0x32 -- 0,50 # two
+3 2200 0 0x33 -- 0,51 # three
+4 2200 0 0x34 -- 0,52 # four
+5 2200 0 0x35 -- 0,53 # five
+6 2200 0 0x36 -- 0,54 # six
+7 2200 0 0x37 -- 0,55 # seven
+8 2200 0 0x38 -- 0,56 # eight
+9 2200 0 0x39 -- 0,57 # nine
+: 2200 0 0x3a -- 0,58 # colon
+; 2200 0 0x3b -- 0,59 # semicolon
+< 2200 0 0x3c -- 0,60 # less
+= 2200 0 0x3d -- 0,61 # equal
+> 2200 0 0x3e -- 0,62 # greater
+? 2200 0 0x3f -- 0,63 # question
+@ 2200 0 0x40 -- 0,64 # at
+at 2200 0 0x40 -- 0,64 # "
+A 2200 0 0x41 -- 0,65 # A
+B 2200 0 0x42 -- 0,66 # B
+C 2200 0 0x43 -- 0,67 # C
+D 2200 0 0x44 -- 0,68 # D
+E 2200 0 0x45 -- 0,69 # E
+F 2200 0 0x46 -- 0,70 # F
+G 2200 0 0x47 -- 0,71 # G
+H 2200 0 0x48 -- 0,72 # H
+I 2200 0 0x49 -- 0,73 # I
+J 2200 0 0x4a -- 0,74 # J
+K 2200 0 0x4b -- 0,75 # K
+L 2200 0 0x4c -- 0,76 # L
+M 2200 0 0x4d -- 0,77 # M
+N 2200 0 0x4e -- 0,78 # N
+O 2200 0 0x4f -- 0,79 # O
+P 2200 0 0x50 -- 0,80 # P
+Q 2200 0 0x51 -- 0,81 # Q
+R 2200 0 0x52 -- 0,82 # R
+S 2200 0 0x53 -- 0,83 # S
+T 2200 0 0x54 -- 0,84 # T
+U 2200 0 0x55 -- 0,85 # U
+V 2200 0 0x56 -- 0,86 # V
+W 2200 0 0x57 -- 0,87 # W
+X 2200 0 0x58 -- 0,88 # X
+Y 2200 0 0x59 -- 0,89 # Y
+Z 2200 0 0x5a -- 0,90 # Z
+[ 2200 0 0x5b -- 0,91 # bracketleft
+lB 2200 0 0x5b -- 0,91 # "
+\ 2200 0 0x5c -- 0,92 # backslash
+rs 2200 0 0x5c -- 0,92 # "
+] 2200 0 0x5d -- 0,93 # bracketright
+rB 2200 0 0x5d -- 0,93 # "
+a^ 2200 0 0x5e -- 0,94 # circumflex
+^ 2200 0 0x5e -- 0,94 # "
+_ 2200 0 0x5f -- 0,95 # underscore
+` 2200 0 0x60 -- 0,96 # quoteleft
+oq 2200 0 0x60 -- 0,96 # "
+a 2200 0 0x61 -- 0,97 # a
+b 2200 0 0x62 -- 0,98 # b
+c 2200 0 0x63 -- 0,99 # c
+d 2200 0 0x64 -- 0,100 # d
+e 2200 0 0x65 -- 0,101 # e
+f 2200 0 0x66 -- 0,102 # f
+g 2200 0 0x67 -- 0,103 # g
+h 2200 0 0x68 -- 0,104 # h
+i 2200 0 0x69 -- 0,105 # i
+j 2200 0 0x6a -- 0,106 # j
+k 2200 0 0x6b -- 0,107 # k
+l 2200 0 0x6c -- 0,108 # l
+m 2200 0 0x6d -- 0,109 # m
+n 2200 0 0x6e -- 0,110 # n
+o 2200 0 0x6f -- 0,111 # o
+p 2200 0 0x70 -- 0,112 # p
+q 2200 0 0x71 -- 0,113 # q
+r 2200 0 0x72 -- 0,114 # r
+s 2200 0 0x73 -- 0,115 # s
+t 2200 0 0x74 -- 0,116 # t
+u 2200 0 0x75 -- 0,117 # u
+v 2200 0 0x76 -- 0,118 # v
+w 2200 0 0x77 -- 0,119 # w
+x 2200 0 0x78 -- 0,120 # x
+y 2200 0 0x79 -- 0,121 # y
+z 2200 0 0x7a -- 0,122 # z
+lC 2200 0 0x7b -- 0,123 # braceleft
+{ 2200 0 0x7b -- 0,123 # "
+| 2200 0 0x7c -- 0,124 # "
+rC 2200 0 0x7d -- 0,125 # braceright
+} 2200 0 0x7d -- 0,125 # "
+a~ 2200 0 0x7e -- 0,126 # tilde
+~ 2200 0 0x7e -- 0,126 # "
+AE 2200 0 0x92 -- 1,36 # AE
+ae 2200 0 0x91 -- 1,37 # ae
+'E 2200 0 0x90 -- 1,40 # Eacute
+'a 2200 0 0xa0 -- 1,27 # aacute
+'e 2200 0 0x82 -- 1,41 # eacute
+'i 2200 0 0xa1 -- 1,49 # iacute
+'o 2200 0 0xa2 -- 1,59 # oacute
+'u 2200 0 0x95 -- 1,65 # uacute
+:A 2200 0 0x8e -- 1,30 # Adieresis
+:O 2200 0 0x99 -- 1,62 # Odieresis
+:U 2200 0 0x9a -- 1,70 # Udieresis
+:a 2200 0 0x84 -- 1,31 # adieresis
+:e 2200 0 0x89 -- 1,45 # edieresis
+:i 2200 0 0x8b -- 1,53 # idieresis
+:o 2200 0 0x94 -- 1,63 # odieresis
+:u 2200 0 0x81 -- 1,71 # udieresis
+:y 2200 0 0x98 -- 1,75 # ydieresis
+^a 2200 0 0x83 -- 1,29 # acircumflex
+^e 2200 0 0x88 -- 1,43 # ecircumflex
+^i 2200 0 0x8c -- 1,51 # icircumflex
+^o 2200 0 0x93 -- 1,61 # ocircumflex
+^u 2200 0 0x96 -- 1,69 # ucircumflex
+`a 2200 0 0x85 -- 1,33 # agrave
+`e 2200 0 0x8a -- 1,47 # egrave
+`i 2200 0 0x8d -- 1,55 # igrave
+`o 2200 0 0x95 -- 1,65 # ograve
+`u 2200 0 0x97 -- 1,73 # ugrave
+~A 2200 0 0x28e -- 1,26 # Atilde
+~N 2200 0 0xa5 -- 1,56 # Ntilde
+~a 2200 0 0x284 -- --- # atilde
+~n 2200 0 0xa4 -- 1,57 # ntilde
+,C 2200 0 0x80 -- 1,38 # Ccedilla
+,c 2200 0 0x87 -- 1,39 # ccedilla
+oA 2200 0 0x8f -- 1,34 # Aring
+oa 2200 0 0x86 -- 1,35 # aring
+a^ 2200 0 0x5e -- 1,3 # circumflex "circumflex accent"
+a~ 2200 0 0x7e -- 1,2 # tilde "tilde accent"
+Do 2200 0 0x24 -- 0,36 # dollar
+Po 2200 0 0x9c -- 4,11 # sterling
+Ye 2200 0 0x9d -- 4,12 # yen
+Fn 2200 0 0x9f -- 4,14 # florin
+ct 2200 0 0x9b -- 4,19 # cent
+Fo 2200 0 0xae -- 4,9 # guillemotleft
+r! 2200 0 0xad -- 4,7 # exclamdown
+r? 2200 0 0xa8 -- 4,8 # questiondown
+Of 2200 0 0xa6 -- 4,15 # ordfeminine
+Om 2200 0 0xa7 -- 4,16 # ordmasculine
+S2 2200 0 0xfd -- 4,20 # twosuperior
+<- 2200 0 0x1b -- 6,22 # arrowleft
+-> 2200 0 0x1a -- 6,21 # arrowright
+<> 2200 0 0x1d -- 6,25 # arrowboth "horizontal double-headed arrow"
+da 2200 0 0x19 -- 6,24 # arrowdown
+ua 2200 0 0x18 -- 6,23 # arrowup
+va 2200 0 0x12 -- 6,26 # \& "vertical double-headed arrow"
+ba 2200 0 0xb3 -- 3,9 # bar
+bb 2200 0 0x7c -- 0,124 # brokenbar
+ul 2200 0 0x5f -- 0,95 # ul "underline with traditional troff metrics"
+ci 2200 0 0x9 -- 4,1 # circle
+bu 2200 0 0x7 -- 4,0 # bullet
+ps 2200 0 0x14 -- 4,5 # paragraph
+sc 2200 0 0x15 -- 4,6 # section
+de 2200 0 0xf8 -- 6,36 # degree
+12 2200 0 0xab -- 4,17 # onehalf
+14 2200 0 0xac -- 4,18 # onequarter
+hy 2200 0 0x2d -- 6,0 # hyphen
+lB 2200 0 0x5b -- 0,91 # bracketleft
+rB 2200 0 0x5d -- 0,93 # bracketright
+lC 2200 0 0x7b -- 0,123 # braceleft
+rC 2200 0 0x7d -- 0,125 # braceright
+aq 2200 0 0x27 -- 0,39 # quotesingle "apostrophe quote"
+at 2200 0 0x40 -- 0,64 # at
+.C1 2200 0 0x2d -- 0,45 # - minus "minus sign from current font"
+sh 2200 0 0x23 -- 0,35 # numbersign
+sl 2200 0 0x2f -- 0,47 # slash
+rs 2200 0 0x5c -- 0,92 # backslash
+*a 2200 0 0xe0 -- 8,1 # alpha
+*b 2200 0 0xe1 -- 8,3 # beta
+*d 2200 0 0xeb -- 8,9 # delta
+*h 2200 0 0xe9 -- 8,17 # theta
+*m 2200 0 0xe6 -- 8,25 # mu
+*p 2200 0 0xe3 -- 8,33 # pi
+*s 2200 0 0xe5 -- 8,37 # sigma
+*t 2200 0 0xe7 -- 8,41 # tau
+~~ 2200 0 0xf7 -- 6,13 # approxequal
+~= 2200 0 0xf7 -- 6,13 # approxequal
++- 2200 0 0xf1 -- 6,1 # plusminus
+<= 2200 0 0xf3 -- 6,2 # lessequal
+ca 2200 0 0xef -- 6,16 # intersection "intersection, cap"
+-h 2200 0 0xc4 -- 3,8 # hbar
+hbar "
+CL 2200 0 0x5 -- 5,168 # club "club suit"
+SP 2200 0 0x6 -- 5,171 # spade "spade suit"
+HE 2200 0 0x3 -- 5,170 # heart "heart suit"
+DI 2200 0 0x4 -- 5,169 # diamond "diamond suit"
+<< 2200 0 0xae -- 6,77 # "" "much less"
+>> 2200 0 0xaf -- 6,78 # "" "much greater"
+pc 2200 0 0xfa -- 6,32 # periodcentered
+mc 2200 0 0xe6 -- 8,25 # mu
+t+- 2200 0 0xf1 -- 6,1 # plusminus
diff --git a/font/devlbp/CR b/font/devlbp/CR
new file mode 100644
index 0000000..4799995
--- /dev/null
+++ b/font/devlbp/CR
@@ -0,0 +1,216 @@
+name CR
+lbpname NcourierR
+spacewidth 2200
+slant 0
+charset
+aq 2200 0 0x27 -- 0,39 # quotesingle
+space 2200 0 0x20 -- 0,32
+! 2200 0 0x21 -- 0,33 # exclam
+" 2200 0 0x22 -- 0,34 # quotedbl
+dq 2200 0 0x22 -- 0,34 # quotedbl
+# 2200 0 0x23 -- 0,35 # numbersign
+sh 2200 0 0x23 -- 0,35 # "
+$ 2200 0 0x24 -- 0,36 # dollar
+Do 2200 0 0x24 -- 0,36 # "
+% 2200 0 0x25 -- 0,37 # percent
+& 2200 0 0x26 -- 0,38 # ampersand
+' 2200 0 0x27 -- 0,39 # quoteright
+cq 2200 0 0x27 -- 0,39 # quoteright
+( 2200 0 0x28 -- 0,40 # parenleft
+) 2200 0 0x29 -- 0,41 # parenright
+* 2200 0 0x2a -- 0,42 # asterisk
++ 2200 0 0x2b -- 0,43 # plus
+, 2200 0 0x2c -- 0,44 # comma
+- 2200 0 0x2d -- 0,45 # hyphen
+\- 2200 0 0x2d -- 0,45 # hyphen
+hy 2200 0 0x2d -- 0,45 # "
+. 2200 0 0x2e -- 0,46 # period
+/ 2200 0 0x2f -- 0,47 # slash
+sl 2200 0 0x2f -- 0,47 # "
+0 2200 0 0x30 -- 0,48 # zero
+1 2200 0 0x31 -- 0,49 # one
+2 2200 0 0x32 -- 0,50 # two
+3 2200 0 0x33 -- 0,51 # three
+4 2200 0 0x34 -- 0,52 # four
+5 2200 0 0x35 -- 0,53 # five
+6 2200 0 0x36 -- 0,54 # six
+7 2200 0 0x37 -- 0,55 # seven
+8 2200 0 0x38 -- 0,56 # eight
+9 2200 0 0x39 -- 0,57 # nine
+: 2200 0 0x3a -- 0,58 # colon
+; 2200 0 0x3b -- 0,59 # semicolon
+< 2200 0 0x3c -- 0,60 # less
+= 2200 0 0x3d -- 0,61 # equal
+> 2200 0 0x3e -- 0,62 # greater
+? 2200 0 0x3f -- 0,63 # question
+@ 2200 0 0x40 -- 0,64 # at
+at 2200 0 0x40 -- 0,64 # "
+A 2200 0 0x41 -- 0,65 # A
+B 2200 0 0x42 -- 0,66 # B
+C 2200 0 0x43 -- 0,67 # C
+D 2200 0 0x44 -- 0,68 # D
+E 2200 0 0x45 -- 0,69 # E
+F 2200 0 0x46 -- 0,70 # F
+G 2200 0 0x47 -- 0,71 # G
+H 2200 0 0x48 -- 0,72 # H
+I 2200 0 0x49 -- 0,73 # I
+J 2200 0 0x4a -- 0,74 # J
+K 2200 0 0x4b -- 0,75 # K
+L 2200 0 0x4c -- 0,76 # L
+M 2200 0 0x4d -- 0,77 # M
+N 2200 0 0x4e -- 0,78 # N
+O 2200 0 0x4f -- 0,79 # O
+P 2200 0 0x50 -- 0,80 # P
+Q 2200 0 0x51 -- 0,81 # Q
+R 2200 0 0x52 -- 0,82 # R
+S 2200 0 0x53 -- 0,83 # S
+T 2200 0 0x54 -- 0,84 # T
+U 2200 0 0x55 -- 0,85 # U
+V 2200 0 0x56 -- 0,86 # V
+W 2200 0 0x57 -- 0,87 # W
+X 2200 0 0x58 -- 0,88 # X
+Y 2200 0 0x59 -- 0,89 # Y
+Z 2200 0 0x5a -- 0,90 # Z
+[ 2200 0 0x5b -- 0,91 # bracketleft
+lB 2200 0 0x5b -- 0,91 # "
+\ 2200 0 0x5c -- 0,92 # backslash
+rs 2200 0 0x5c -- 0,92 # "
+] 2200 0 0x5d -- 0,93 # bracketright
+rB 2200 0 0x5d -- 0,93 # "
+a^ 2200 0 0x5e -- 0,94 # circumflex
+^ 2200 0 0x5e -- 0,94 # "
+_ 2200 0 0x5f -- 0,95 # underscore
+` 2200 0 0x60 -- 0,96 # quoteleft
+oq 2200 0 0x60 -- 0,96 # "
+a 2200 0 0x61 -- 0,97 # a
+b 2200 0 0x62 -- 0,98 # b
+c 2200 0 0x63 -- 0,99 # c
+d 2200 0 0x64 -- 0,100 # d
+e 2200 0 0x65 -- 0,101 # e
+f 2200 0 0x66 -- 0,102 # f
+g 2200 0 0x67 -- 0,103 # g
+h 2200 0 0x68 -- 0,104 # h
+i 2200 0 0x69 -- 0,105 # i
+j 2200 0 0x6a -- 0,106 # j
+k 2200 0 0x6b -- 0,107 # k
+l 2200 0 0x6c -- 0,108 # l
+m 2200 0 0x6d -- 0,109 # m
+n 2200 0 0x6e -- 0,110 # n
+o 2200 0 0x6f -- 0,111 # o
+p 2200 0 0x70 -- 0,112 # p
+q 2200 0 0x71 -- 0,113 # q
+r 2200 0 0x72 -- 0,114 # r
+s 2200 0 0x73 -- 0,115 # s
+t 2200 0 0x74 -- 0,116 # t
+u 2200 0 0x75 -- 0,117 # u
+v 2200 0 0x76 -- 0,118 # v
+w 2200 0 0x77 -- 0,119 # w
+x 2200 0 0x78 -- 0,120 # x
+y 2200 0 0x79 -- 0,121 # y
+z 2200 0 0x7a -- 0,122 # z
+lC 2200 0 0x7b -- 0,123 # braceleft
+{ 2200 0 0x7b -- 0,123 # "
+| 2200 0 0x7c -- 0,124 # "
+rC 2200 0 0x7d -- 0,125 # braceright
+} 2200 0 0x7d -- 0,125 # "
+a~ 2200 0 0x7e -- 0,126 # tilde
+~ 2200 0 0x7e -- 0,126 # "
+AE 2200 0 0x92 -- 1,36 # AE
+ae 2200 0 0x91 -- 1,37 # ae
+'E 2200 0 0x90 -- 1,40 # Eacute
+'a 2200 0 0xa0 -- 1,27 # aacute
+'e 2200 0 0x82 -- 1,41 # eacute
+'i 2200 0 0xa1 -- 1,49 # iacute
+'o 2200 0 0xa2 -- 1,59 # oacute
+'u 2200 0 0x95 -- 1,65 # uacute
+:A 2200 0 0x8e -- 1,30 # Adieresis
+:O 2200 0 0x99 -- 1,62 # Odieresis
+:U 2200 0 0x9a -- 1,70 # Udieresis
+:a 2200 0 0x84 -- 1,31 # adieresis
+:e 2200 0 0x89 -- 1,45 # edieresis
+:i 2200 0 0x8b -- 1,53 # idieresis
+:o 2200 0 0x94 -- 1,63 # odieresis
+:u 2200 0 0x81 -- 1,71 # udieresis
+:y 2200 0 0x98 -- 1,75 # ydieresis
+^a 2200 0 0x83 -- 1,29 # acircumflex
+^e 2200 0 0x88 -- 1,43 # ecircumflex
+^i 2200 0 0x8c -- 1,51 # icircumflex
+^o 2200 0 0x93 -- 1,61 # ocircumflex
+^u 2200 0 0x96 -- 1,69 # ucircumflex
+`a 2200 0 0x85 -- 1,33 # agrave
+`e 2200 0 0x8a -- 1,47 # egrave
+`i 2200 0 0x8d -- 1,55 # igrave
+`o 2200 0 0x95 -- 1,65 # ograve
+`u 2200 0 0x97 -- 1,73 # ugrave
+~A 2200 0 0x28e -- 1,26 # Atilde
+~N 2200 0 0xa5 -- 1,56 # Ntilde
+~a 2200 0 0x284 -- --- # atilde
+~n 2200 0 0xa4 -- 1,57 # ntilde
+,C 2200 0 0x80 -- 1,38 # Ccedilla
+,c 2200 0 0x87 -- 1,39 # ccedilla
+oA 2200 0 0x8f -- 1,34 # Aring
+oa 2200 0 0x86 -- 1,35 # aring
+a^ 2200 0 0x5e -- 1,3 # circumflex "circumflex accent"
+a~ 2200 0 0x7e -- 1,2 # tilde "tilde accent"
+Do 2200 0 0x24 -- 0,36 # dollar
+Po 2200 0 0x9c -- 4,11 # sterling
+Ye 2200 0 0x9d -- 4,12 # yen
+Fn 2200 0 0x9f -- 4,14 # florin
+ct 2200 0 0x9b -- 4,19 # cent
+Fo 2200 0 0xae -- 4,9 # guillemotleft
+r! 2200 0 0xad -- 4,7 # exclamdown
+r? 2200 0 0xa8 -- 4,8 # questiondown
+Of 2200 0 0xa6 -- 4,15 # ordfeminine
+Om 2200 0 0xa7 -- 4,16 # ordmasculine
+S2 2200 0 0xfd -- 4,20 # twosuperior
+<- 2200 0 0x1b -- 6,22 # arrowleft
+-> 2200 0 0x1a -- 6,21 # arrowright
+<> 2200 0 0x1d -- 6,25 # arrowboth "horizontal double-headed arrow"
+da 2200 0 0x19 -- 6,24 # arrowdown
+ua 2200 0 0x18 -- 6,23 # arrowup
+va 2200 0 0x12 -- 6,26 # \& "vertical double-headed arrow"
+ba 2200 0 0xb3 -- 3,9 # bar
+bb 2200 0 0x7c -- 0,124 # brokenbar
+ul 2200 0 0x5f -- 0,95 # ul "underline with traditional troff metrics"
+ci 2200 0 0x9 -- 4,1 # circle
+bu 2200 0 0x7 -- 4,0 # bullet
+ps 2200 0 0x14 -- 4,5 # paragraph
+sc 2200 0 0x15 -- 4,6 # section
+de 2200 0 0xf8 -- 6,36 # degree
+12 2200 0 0xab -- 4,17 # onehalf
+14 2200 0 0xac -- 4,18 # onequarter
+hy 2200 0 0x2d -- 6,0 # hyphen
+lB 2200 0 0x5b -- 0,91 # bracketleft
+rB 2200 0 0x5d -- 0,93 # bracketright
+lC 2200 0 0x7b -- 0,123 # braceleft
+rC 2200 0 0x7d -- 0,125 # braceright
+aq 2200 0 0x27 -- 0,39 # quotesingle "apostrophe quote"
+at 2200 0 0x40 -- 0,64 # at
+.C1 2200 0 0x2d -- 0,45 # - minus "minus sign from current font"
+sh 2200 0 0x23 -- 0,35 # numbersign
+sl 2200 0 0x2f -- 0,47 # slash
+rs 2200 0 0x5c -- 0,92 # backslash
+*a 2200 0 0xe0 -- 8,1 # alpha
+*b 2200 0 0xe1 -- 8,3 # beta
+*d 2200 0 0xeb -- 8,9 # delta
+*h 2200 0 0xe9 -- 8,17 # theta
+*m 2200 0 0xe6 -- 8,25 # mu
+*p 2200 0 0xe3 -- 8,33 # pi
+*s 2200 0 0xe5 -- 8,37 # sigma
+*t 2200 0 0xe7 -- 8,41 # tau
+~~ 2200 0 0xf7 -- 6,13 # approxequal
+~= 2200 0 0xf7 -- 6,13 # approxequal
++- 2200 0 0xf1 -- 6,1 # plusminus
+<= 2200 0 0xf3 -- 6,2 # lessequal
+ca 2200 0 0xef -- 6,16 # intersection "intersection, cap"
+-h 2200 0 0xc4 -- 3,8 # hbar
+hbar "
+CL 2200 0 0x5 -- 5,168 # club "club suit"
+SP 2200 0 0x6 -- 5,171 # spade "spade suit"
+HE 2200 0 0x3 -- 5,170 # heart "heart suit"
+DI 2200 0 0x4 -- 5,169 # diamond "diamond suit"
+<< 2200 0 0xae -- 6,77 # "" "much less"
+>> 2200 0 0xaf -- 6,78 # "" "much greater"
+pc 2200 0 0xfa -- 6,32 # periodcentered
+mc 2200 0 0xe6 -- 8,25 # mu
+t+- 2200 0 0xf1 -- 6,1 # plusminus
diff --git a/font/devlbp/DESC.in b/font/devlbp/DESC.in
new file mode 100644
index 0000000..eb5d6f2
--- /dev/null
+++ b/font/devlbp/DESC.in
@@ -0,0 +1,9 @@
+res 300
+unitwidth 800
+family T
+styles R I B BI
+sizes 1-1000 0
+fonts 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+tcommand
+orientation portrait
+postpro grolbp
diff --git a/font/devlbp/EB b/font/devlbp/EB
new file mode 100644
index 0000000..d3f2322
--- /dev/null
+++ b/font/devlbp/EB
@@ -0,0 +1,216 @@
+name EB
+lbpname NeliteB
+spacewidth 1900
+slant 0
+charset
+aq 1900 0 0x27 -- 0,39 # quotesingle
+space 1900 0 0x20 -- 0,32
+! 1900 0 0x21 -- 0,33 # exclam
+" 1900 0 0x22 -- 0,34 # quotedbl
+dq 1900 0 0x22 -- 0,34 # quotedbl
+# 1900 0 0x23 -- 0,35 # numbersign
+sh 1900 0 0x23 -- 0,35 # "
+$ 1900 0 0x24 -- 0,36 # dollar
+Do 1900 0 0x24 -- 0,36 # "
+% 1900 0 0x25 -- 0,37 # percent
+& 1900 0 0x26 -- 0,38 # ampersand
+' 1900 0 0x27 -- 0,39 # quoteright
+cq 1900 0 0x27 -- 0,39 # quoteright
+( 1900 0 0x28 -- 0,40 # parenleft
+) 1900 0 0x29 -- 0,41 # parenright
+* 1900 0 0x2a -- 0,42 # asterisk
++ 1900 0 0x2b -- 0,43 # plus
+, 1900 0 0x2c -- 0,44 # comma
+- 1900 0 0x2d -- 0,45 # hyphen
+\- 1900 0 0x2d -- 0,45 # hyphen
+hy 1900 0 0x2d -- 0,45 # "
+. 1900 0 0x2e -- 0,46 # period
+/ 1900 0 0x2f -- 0,47 # slash
+sl 1900 0 0x2f -- 0,47 # "
+0 1900 0 0x30 -- 0,48 # zero
+1 1900 0 0x31 -- 0,49 # one
+2 1900 0 0x32 -- 0,50 # two
+3 1900 0 0x33 -- 0,51 # three
+4 1900 0 0x34 -- 0,52 # four
+5 1900 0 0x35 -- 0,53 # five
+6 1900 0 0x36 -- 0,54 # six
+7 1900 0 0x37 -- 0,55 # seven
+8 1900 0 0x38 -- 0,56 # eight
+9 1900 0 0x39 -- 0,57 # nine
+: 1900 0 0x3a -- 0,58 # colon
+; 1900 0 0x3b -- 0,59 # semicolon
+< 1900 0 0x3c -- 0,60 # less
+= 1900 0 0x3d -- 0,61 # equal
+> 1900 0 0x3e -- 0,62 # greater
+? 1900 0 0x3f -- 0,63 # question
+@ 1900 0 0x40 -- 0,64 # at
+at 1900 0 0x40 -- 0,64 # "
+A 1900 0 0x41 -- 0,65 # A
+B 1900 0 0x42 -- 0,66 # B
+C 1900 0 0x43 -- 0,67 # C
+D 1900 0 0x44 -- 0,68 # D
+E 1900 0 0x45 -- 0,69 # E
+F 1900 0 0x46 -- 0,70 # F
+G 1900 0 0x47 -- 0,71 # G
+H 1900 0 0x48 -- 0,72 # H
+I 1900 0 0x49 -- 0,73 # I
+J 1900 0 0x4a -- 0,74 # J
+K 1900 0 0x4b -- 0,75 # K
+L 1900 0 0x4c -- 0,76 # L
+M 1900 0 0x4d -- 0,77 # M
+N 1900 0 0x4e -- 0,78 # N
+O 1900 0 0x4f -- 0,79 # O
+P 1900 0 0x50 -- 0,80 # P
+Q 1900 0 0x51 -- 0,81 # Q
+R 1900 0 0x52 -- 0,82 # R
+S 1900 0 0x53 -- 0,83 # S
+T 1900 0 0x54 -- 0,84 # T
+U 1900 0 0x55 -- 0,85 # U
+V 1900 0 0x56 -- 0,86 # V
+W 1900 0 0x57 -- 0,87 # W
+X 1900 0 0x58 -- 0,88 # X
+Y 1900 0 0x59 -- 0,89 # Y
+Z 1900 0 0x5a -- 0,90 # Z
+[ 1900 0 0x5b -- 0,91 # bracketleft
+lB 1900 0 0x5b -- 0,91 # "
+\ 1900 0 0x5c -- 0,92 # backslash
+rs 1900 0 0x5c -- 0,92 # "
+] 1900 0 0x5d -- 0,93 # bracketright
+rB 1900 0 0x5d -- 0,93 # "
+a^ 1900 0 0x5e -- 0,94 # circumflex
+^ 1900 0 0x5e -- 0,94 # "
+_ 1900 0 0x5f -- 0,95 # underscore
+` 1900 0 0x60 -- 0,96 # quoteleft
+oq 1900 0 0x60 -- 0,96 # "
+a 1900 0 0x61 -- 0,97 # a
+b 1900 0 0x62 -- 0,98 # b
+c 1900 0 0x63 -- 0,99 # c
+d 1900 0 0x64 -- 0,100 # d
+e 1900 0 0x65 -- 0,101 # e
+f 1900 0 0x66 -- 0,102 # f
+g 1900 0 0x67 -- 0,103 # g
+h 1900 0 0x68 -- 0,104 # h
+i 1900 0 0x69 -- 0,105 # i
+j 1900 0 0x6a -- 0,106 # j
+k 1900 0 0x6b -- 0,107 # k
+l 1900 0 0x6c -- 0,108 # l
+m 1900 0 0x6d -- 0,109 # m
+n 1900 0 0x6e -- 0,110 # n
+o 1900 0 0x6f -- 0,111 # o
+p 1900 0 0x70 -- 0,112 # p
+q 1900 0 0x71 -- 0,113 # q
+r 1900 0 0x72 -- 0,114 # r
+s 1900 0 0x73 -- 0,115 # s
+t 1900 0 0x74 -- 0,116 # t
+u 1900 0 0x75 -- 0,117 # u
+v 1900 0 0x76 -- 0,118 # v
+w 1900 0 0x77 -- 0,119 # w
+x 1900 0 0x78 -- 0,120 # x
+y 1900 0 0x79 -- 0,121 # y
+z 1900 0 0x7a -- 0,122 # z
+lC 1900 0 0x7b -- 0,123 # braceleft
+{ 1900 0 0x7b -- 0,123 # "
+| 1900 0 0x7c -- 0,124 # "
+rC 1900 0 0x7d -- 0,125 # braceright
+} 1900 0 0x7d -- 0,125 # "
+a~ 1900 0 0x7e -- 0,126 # tilde
+~ 1900 0 0x7e -- 0,126 # "
+AE 1900 0 0x92 -- 1,36 # AE
+ae 1900 0 0x91 -- 1,37 # ae
+'E 1900 0 0x90 -- 1,40 # Eacute
+'a 1900 0 0xa0 -- 1,27 # aacute
+'e 1900 0 0x82 -- 1,41 # eacute
+'i 1900 0 0xa1 -- 1,49 # iacute
+'o 1900 0 0xa2 -- 1,59 # oacute
+'u 1900 0 0x95 -- 1,65 # uacute
+:A 1900 0 0x8e -- 1,30 # Adieresis
+:O 1900 0 0x99 -- 1,62 # Odieresis
+:U 1900 0 0x9a -- 1,70 # Udieresis
+:a 1900 0 0x84 -- 1,31 # adieresis
+:e 1900 0 0x89 -- 1,45 # edieresis
+:i 1900 0 0x8b -- 1,53 # idieresis
+:o 1900 0 0x94 -- 1,63 # odieresis
+:u 1900 0 0x81 -- 1,71 # udieresis
+:y 1900 0 0x98 -- 1,75 # ydieresis
+^a 1900 0 0x83 -- 1,29 # acircumflex
+^e 1900 0 0x88 -- 1,43 # ecircumflex
+^i 1900 0 0x8c -- 1,51 # icircumflex
+^o 1900 0 0x93 -- 1,61 # ocircumflex
+^u 1900 0 0x96 -- 1,69 # ucircumflex
+`a 1900 0 0x85 -- 1,33 # agrave
+`e 1900 0 0x8a -- 1,47 # egrave
+`i 1900 0 0x8d -- 1,55 # igrave
+`o 1900 0 0x95 -- 1,65 # ograve
+`u 1900 0 0x97 -- 1,73 # ugrave
+~A 1900 0 0x28e -- 1,26 # Atilde
+~N 1900 0 0xa5 -- 1,56 # Ntilde
+~a 1900 0 0x284 -- --- # atilde
+~n 1900 0 0xa4 -- 1,57 # ntilde
+,C 1900 0 0x80 -- 1,38 # Ccedilla
+,c 1900 0 0x87 -- 1,39 # ccedilla
+oA 1900 0 0x8f -- 1,34 # Aring
+oa 1900 0 0x86 -- 1,35 # aring
+a^ 1900 0 0x5e -- 1,3 # circumflex "circumflex accent"
+a~ 1900 0 0x7e -- 1,2 # tilde "tilde accent"
+Do 1900 0 0x24 -- 0,36 # dollar
+Po 1900 0 0x9c -- 4,11 # sterling
+Ye 1900 0 0x9d -- 4,12 # yen
+Fn 1900 0 0x9f -- 4,14 # florin
+ct 1900 0 0x9b -- 4,19 # cent
+Fo 1900 0 0xae -- 4,9 # guillemotleft
+r! 1900 0 0xad -- 4,7 # exclamdown
+r? 1900 0 0xa8 -- 4,8 # questiondown
+Of 1900 0 0xa6 -- 4,15 # ordfeminine
+Om 1900 0 0xa7 -- 4,16 # ordmasculine
+S2 1900 0 0xfd -- 4,20 # twosuperior
+<- 1900 0 0x1b -- 6,22 # arrowleft
+-> 1900 0 0x1a -- 6,21 # arrowright
+<> 1900 0 0x1d -- 6,25 # arrowboth "horizontal double-headed arrow"
+da 1900 0 0x19 -- 6,24 # arrowdown
+ua 1900 0 0x18 -- 6,23 # arrowup
+va 1900 0 0x12 -- 6,26 # \& "vertical double-headed arrow"
+ba 1900 0 0xb3 -- 3,9 # bar
+bb 1900 0 0x7c -- 0,124 # brokenbar
+ul 1900 0 0x5f -- 0,95 # ul "underline with traditional troff metrics"
+ci 1900 0 0x9 -- 4,1 # circle
+bu 1900 0 0x7 -- 4,0 # bullet
+ps 1900 0 0x14 -- 4,5 # paragraph
+sc 1900 0 0x15 -- 4,6 # section
+de 1900 0 0xf8 -- 6,36 # degree
+12 1900 0 0xab -- 4,17 # onehalf
+14 1900 0 0xac -- 4,18 # onequarter
+hy 1900 0 0x2d -- 6,0 # hyphen
+lB 1900 0 0x5b -- 0,91 # bracketleft
+rB 1900 0 0x5d -- 0,93 # bracketright
+lC 1900 0 0x7b -- 0,123 # braceleft
+rC 1900 0 0x7d -- 0,125 # braceright
+aq 1900 0 0x27 -- 0,39 # quotesingle "apostrophe quote"
+at 1900 0 0x40 -- 0,64 # at
+.C1 1900 0 0x2d -- 0,45 # - minus "minus sign from current font"
+sh 1900 0 0x23 -- 0,35 # numbersign
+sl 1900 0 0x2f -- 0,47 # slash
+rs 1900 0 0x5c -- 0,92 # backslash
+*a 1900 0 0xe0 -- 8,1 # alpha
+*b 1900 0 0xe1 -- 8,3 # beta
+*d 1900 0 0xeb -- 8,9 # delta
+*h 1900 0 0xe9 -- 8,17 # theta
+*m 1900 0 0xe6 -- 8,25 # mu
+*p 1900 0 0xe3 -- 8,33 # pi
+*s 1900 0 0xe5 -- 8,37 # sigma
+*t 1900 0 0xe7 -- 8,41 # tau
+~~ 1900 0 0xf7 -- 6,13 # approxequal
+~= 1900 0 0xf7 -- 6,13 # approxequal
++- 1900 0 0xf1 -- 6,1 # plusminus
+<= 1900 0 0xf3 -- 6,2 # lessequal
+ca 1900 0 0xef -- 6,16 # intersection "intersection, cap"
+-h 1900 0 0xc4 -- 3,8 # hbar
+hbar "
+CL 1900 0 0x5 -- 5,168 # club "club suit"
+SP 1900 0 0x6 -- 5,171 # spade "spade suit"
+HE 1900 0 0x3 -- 5,170 # heart "heart suit"
+DI 1900 0 0x4 -- 5,169 # diamond "diamond suit"
+<< 1900 0 0xae -- 6,77 # "" "much less"
+>> 1900 0 0xaf -- 6,78 # "" "much greater"
+pc 1900 0 0xfa -- 6,32 # periodcentered
+mc 1900 0 0xe6 -- 8,25 # mu
+t+- 1900 0 0xf1 -- 6,1 # plusminus
diff --git a/font/devlbp/EI b/font/devlbp/EI
new file mode 100644
index 0000000..372e352
--- /dev/null
+++ b/font/devlbp/EI
@@ -0,0 +1,216 @@
+name EI
+lbpname NeliteI
+spacewidth 1900
+slant 0
+charset
+aq 1900 0 0x27 -- 0,39 # quotesingle
+space 1900 0 0x20 -- 0,32
+! 1900 0 0x21 -- 0,33 # exclam
+" 1900 0 0x22 -- 0,34 # quotedbl
+dq 1900 0 0x22 -- 0,34 # quotedbl
+# 1900 0 0x23 -- 0,35 # numbersign
+sh 1900 0 0x23 -- 0,35 # "
+$ 1900 0 0x24 -- 0,36 # dollar
+Do 1900 0 0x24 -- 0,36 # "
+% 1900 0 0x25 -- 0,37 # percent
+& 1900 0 0x26 -- 0,38 # ampersand
+' 1900 0 0x27 -- 0,39 # quoteright
+cq 1900 0 0x27 -- 0,39 # quoteright
+( 1900 0 0x28 -- 0,40 # parenleft
+) 1900 0 0x29 -- 0,41 # parenright
+* 1900 0 0x2a -- 0,42 # asterisk
++ 1900 0 0x2b -- 0,43 # plus
+, 1900 0 0x2c -- 0,44 # comma
+- 1900 0 0x2d -- 0,45 # hyphen
+\- 1900 0 0x2d -- 0,45 # hyphen
+hy 1900 0 0x2d -- 0,45 # "
+. 1900 0 0x2e -- 0,46 # period
+/ 1900 0 0x2f -- 0,47 # slash
+sl 1900 0 0x2f -- 0,47 # "
+0 1900 0 0x30 -- 0,48 # zero
+1 1900 0 0x31 -- 0,49 # one
+2 1900 0 0x32 -- 0,50 # two
+3 1900 0 0x33 -- 0,51 # three
+4 1900 0 0x34 -- 0,52 # four
+5 1900 0 0x35 -- 0,53 # five
+6 1900 0 0x36 -- 0,54 # six
+7 1900 0 0x37 -- 0,55 # seven
+8 1900 0 0x38 -- 0,56 # eight
+9 1900 0 0x39 -- 0,57 # nine
+: 1900 0 0x3a -- 0,58 # colon
+; 1900 0 0x3b -- 0,59 # semicolon
+< 1900 0 0x3c -- 0,60 # less
+= 1900 0 0x3d -- 0,61 # equal
+> 1900 0 0x3e -- 0,62 # greater
+? 1900 0 0x3f -- 0,63 # question
+@ 1900 0 0x40 -- 0,64 # at
+at 1900 0 0x40 -- 0,64 # "
+A 1900 0 0x41 -- 0,65 # A
+B 1900 0 0x42 -- 0,66 # B
+C 1900 0 0x43 -- 0,67 # C
+D 1900 0 0x44 -- 0,68 # D
+E 1900 0 0x45 -- 0,69 # E
+F 1900 0 0x46 -- 0,70 # F
+G 1900 0 0x47 -- 0,71 # G
+H 1900 0 0x48 -- 0,72 # H
+I 1900 0 0x49 -- 0,73 # I
+J 1900 0 0x4a -- 0,74 # J
+K 1900 0 0x4b -- 0,75 # K
+L 1900 0 0x4c -- 0,76 # L
+M 1900 0 0x4d -- 0,77 # M
+N 1900 0 0x4e -- 0,78 # N
+O 1900 0 0x4f -- 0,79 # O
+P 1900 0 0x50 -- 0,80 # P
+Q 1900 0 0x51 -- 0,81 # Q
+R 1900 0 0x52 -- 0,82 # R
+S 1900 0 0x53 -- 0,83 # S
+T 1900 0 0x54 -- 0,84 # T
+U 1900 0 0x55 -- 0,85 # U
+V 1900 0 0x56 -- 0,86 # V
+W 1900 0 0x57 -- 0,87 # W
+X 1900 0 0x58 -- 0,88 # X
+Y 1900 0 0x59 -- 0,89 # Y
+Z 1900 0 0x5a -- 0,90 # Z
+[ 1900 0 0x5b -- 0,91 # bracketleft
+lB 1900 0 0x5b -- 0,91 # "
+\ 1900 0 0x5c -- 0,92 # backslash
+rs 1900 0 0x5c -- 0,92 # "
+] 1900 0 0x5d -- 0,93 # bracketright
+rB 1900 0 0x5d -- 0,93 # "
+a^ 1900 0 0x5e -- 0,94 # circumflex
+^ 1900 0 0x5e -- 0,94 # "
+_ 1900 0 0x5f -- 0,95 # underscore
+` 1900 0 0x60 -- 0,96 # quoteleft
+oq 1900 0 0x60 -- 0,96 # "
+a 1900 0 0x61 -- 0,97 # a
+b 1900 0 0x62 -- 0,98 # b
+c 1900 0 0x63 -- 0,99 # c
+d 1900 0 0x64 -- 0,100 # d
+e 1900 0 0x65 -- 0,101 # e
+f 1900 0 0x66 -- 0,102 # f
+g 1900 0 0x67 -- 0,103 # g
+h 1900 0 0x68 -- 0,104 # h
+i 1900 0 0x69 -- 0,105 # i
+j 1900 0 0x6a -- 0,106 # j
+k 1900 0 0x6b -- 0,107 # k
+l 1900 0 0x6c -- 0,108 # l
+m 1900 0 0x6d -- 0,109 # m
+n 1900 0 0x6e -- 0,110 # n
+o 1900 0 0x6f -- 0,111 # o
+p 1900 0 0x70 -- 0,112 # p
+q 1900 0 0x71 -- 0,113 # q
+r 1900 0 0x72 -- 0,114 # r
+s 1900 0 0x73 -- 0,115 # s
+t 1900 0 0x74 -- 0,116 # t
+u 1900 0 0x75 -- 0,117 # u
+v 1900 0 0x76 -- 0,118 # v
+w 1900 0 0x77 -- 0,119 # w
+x 1900 0 0x78 -- 0,120 # x
+y 1900 0 0x79 -- 0,121 # y
+z 1900 0 0x7a -- 0,122 # z
+lC 1900 0 0x7b -- 0,123 # braceleft
+{ 1900 0 0x7b -- 0,123 # "
+| 1900 0 0x7c -- 0,124 # "
+rC 1900 0 0x7d -- 0,125 # braceright
+} 1900 0 0x7d -- 0,125 # "
+a~ 1900 0 0x7e -- 0,126 # tilde
+~ 1900 0 0x7e -- 0,126 # "
+AE 1900 0 0x92 -- 1,36 # AE
+ae 1900 0 0x91 -- 1,37 # ae
+'E 1900 0 0x90 -- 1,40 # Eacute
+'a 1900 0 0xa0 -- 1,27 # aacute
+'e 1900 0 0x82 -- 1,41 # eacute
+'i 1900 0 0xa1 -- 1,49 # iacute
+'o 1900 0 0xa2 -- 1,59 # oacute
+'u 1900 0 0x95 -- 1,65 # uacute
+:A 1900 0 0x8e -- 1,30 # Adieresis
+:O 1900 0 0x99 -- 1,62 # Odieresis
+:U 1900 0 0x9a -- 1,70 # Udieresis
+:a 1900 0 0x84 -- 1,31 # adieresis
+:e 1900 0 0x89 -- 1,45 # edieresis
+:i 1900 0 0x8b -- 1,53 # idieresis
+:o 1900 0 0x94 -- 1,63 # odieresis
+:u 1900 0 0x81 -- 1,71 # udieresis
+:y 1900 0 0x98 -- 1,75 # ydieresis
+^a 1900 0 0x83 -- 1,29 # acircumflex
+^e 1900 0 0x88 -- 1,43 # ecircumflex
+^i 1900 0 0x8c -- 1,51 # icircumflex
+^o 1900 0 0x93 -- 1,61 # ocircumflex
+^u 1900 0 0x96 -- 1,69 # ucircumflex
+`a 1900 0 0x85 -- 1,33 # agrave
+`e 1900 0 0x8a -- 1,47 # egrave
+`i 1900 0 0x8d -- 1,55 # igrave
+`o 1900 0 0x95 -- 1,65 # ograve
+`u 1900 0 0x97 -- 1,73 # ugrave
+~A 1900 0 0x28e -- 1,26 # Atilde
+~N 1900 0 0xa5 -- 1,56 # Ntilde
+~a 1900 0 0x284 -- --- # atilde
+~n 1900 0 0xa4 -- 1,57 # ntilde
+,C 1900 0 0x80 -- 1,38 # Ccedilla
+,c 1900 0 0x87 -- 1,39 # ccedilla
+oA 1900 0 0x8f -- 1,34 # Aring
+oa 1900 0 0x86 -- 1,35 # aring
+a^ 1900 0 0x5e -- 1,3 # circumflex "circumflex accent"
+a~ 1900 0 0x7e -- 1,2 # tilde "tilde accent"
+Do 1900 0 0x24 -- 0,36 # dollar
+Po 1900 0 0x9c -- 4,11 # sterling
+Ye 1900 0 0x9d -- 4,12 # yen
+Fn 1900 0 0x9f -- 4,14 # florin
+ct 1900 0 0x9b -- 4,19 # cent
+Fo 1900 0 0xae -- 4,9 # guillemotleft
+r! 1900 0 0xad -- 4,7 # exclamdown
+r? 1900 0 0xa8 -- 4,8 # questiondown
+Of 1900 0 0xa6 -- 4,15 # ordfeminine
+Om 1900 0 0xa7 -- 4,16 # ordmasculine
+S2 1900 0 0xfd -- 4,20 # twosuperior
+<- 1900 0 0x1b -- 6,22 # arrowleft
+-> 1900 0 0x1a -- 6,21 # arrowright
+<> 1900 0 0x1d -- 6,25 # arrowboth "horizontal double-headed arrow"
+da 1900 0 0x19 -- 6,24 # arrowdown
+ua 1900 0 0x18 -- 6,23 # arrowup
+va 1900 0 0x12 -- 6,26 # \& "vertical double-headed arrow"
+ba 1900 0 0xb3 -- 3,9 # bar
+bb 1900 0 0x7c -- 0,124 # brokenbar
+ul 1900 0 0x5f -- 0,95 # ul "underline with traditional troff metrics"
+ci 1900 0 0x9 -- 4,1 # circle
+bu 1900 0 0x7 -- 4,0 # bullet
+ps 1900 0 0x14 -- 4,5 # paragraph
+sc 1900 0 0x15 -- 4,6 # section
+de 1900 0 0xf8 -- 6,36 # degree
+12 1900 0 0xab -- 4,17 # onehalf
+14 1900 0 0xac -- 4,18 # onequarter
+hy 1900 0 0x2d -- 6,0 # hyphen
+lB 1900 0 0x5b -- 0,91 # bracketleft
+rB 1900 0 0x5d -- 0,93 # bracketright
+lC 1900 0 0x7b -- 0,123 # braceleft
+rC 1900 0 0x7d -- 0,125 # braceright
+aq 1900 0 0x27 -- 0,39 # quotesingle "apostrophe quote"
+at 1900 0 0x40 -- 0,64 # at
+.C1 1900 0 0x2d -- 0,45 # - minus "minus sign from current font"
+sh 1900 0 0x23 -- 0,35 # numbersign
+sl 1900 0 0x2f -- 0,47 # slash
+rs 1900 0 0x5c -- 0,92 # backslash
+*a 1900 0 0xe0 -- 8,1 # alpha
+*b 1900 0 0xe1 -- 8,3 # beta
+*d 1900 0 0xeb -- 8,9 # delta
+*h 1900 0 0xe9 -- 8,17 # theta
+*m 1900 0 0xe6 -- 8,25 # mu
+*p 1900 0 0xe3 -- 8,33 # pi
+*s 1900 0 0xe5 -- 8,37 # sigma
+*t 1900 0 0xe7 -- 8,41 # tau
+~~ 1900 0 0xf7 -- 6,13 # approxequal
+~= 1900 0 0xf7 -- 6,13 # approxequal
++- 1900 0 0xf1 -- 6,1 # plusminus
+<= 1900 0 0xf3 -- 6,2 # lessequal
+ca 1900 0 0xef -- 6,16 # intersection "intersection, cap"
+-h 1900 0 0xc4 -- 3,8 # hbar
+hbar "
+CL 1900 0 0x5 -- 5,168 # club "club suit"
+SP 1900 0 0x6 -- 5,171 # spade "spade suit"
+HE 1900 0 0x3 -- 5,170 # heart "heart suit"
+DI 1900 0 0x4 -- 5,169 # diamond "diamond suit"
+<< 1900 0 0xae -- 6,77 # "" "much less"
+>> 1900 0 0xaf -- 6,78 # "" "much greater"
+pc 1900 0 0xfa -- 6,32 # periodcentered
+mc 1900 0 0xe6 -- 8,25 # mu
+t+- 1900 0 0xf1 -- 6,1 # plusminus
diff --git a/font/devlbp/ER b/font/devlbp/ER
new file mode 100644
index 0000000..f384293
--- /dev/null
+++ b/font/devlbp/ER
@@ -0,0 +1,216 @@
+name ER
+lbpname NeliteR
+spacewidth 1900
+slant 0
+charset
+aq 1900 0 0x27 -- 0,39 # quotesingle
+space 1900 0 0x20 -- 0,32
+! 1900 0 0x21 -- 0,33 # exclam
+" 1900 0 0x22 -- 0,34 # quotedbl
+dq 1900 0 0x22 -- 0,34 # quotedbl
+# 1900 0 0x23 -- 0,35 # numbersign
+sh 1900 0 0x23 -- 0,35 # "
+$ 1900 0 0x24 -- 0,36 # dollar
+Do 1900 0 0x24 -- 0,36 # "
+% 1900 0 0x25 -- 0,37 # percent
+& 1900 0 0x26 -- 0,38 # ampersand
+' 1900 0 0x27 -- 0,39 # quoteright
+cq 1900 0 0x27 -- 0,39 # quoteright
+( 1900 0 0x28 -- 0,40 # parenleft
+) 1900 0 0x29 -- 0,41 # parenright
+* 1900 0 0x2a -- 0,42 # asterisk
++ 1900 0 0x2b -- 0,43 # plus
+, 1900 0 0x2c -- 0,44 # comma
+- 1900 0 0x2d -- 0,45 # hyphen
+\- 1900 0 0x2d -- 0,45 # hyphen
+hy 1900 0 0x2d -- 0,45 # "
+. 1900 0 0x2e -- 0,46 # period
+/ 1900 0 0x2f -- 0,47 # slash
+sl 1900 0 0x2f -- 0,47 # "
+0 1900 0 0x30 -- 0,48 # zero
+1 1900 0 0x31 -- 0,49 # one
+2 1900 0 0x32 -- 0,50 # two
+3 1900 0 0x33 -- 0,51 # three
+4 1900 0 0x34 -- 0,52 # four
+5 1900 0 0x35 -- 0,53 # five
+6 1900 0 0x36 -- 0,54 # six
+7 1900 0 0x37 -- 0,55 # seven
+8 1900 0 0x38 -- 0,56 # eight
+9 1900 0 0x39 -- 0,57 # nine
+: 1900 0 0x3a -- 0,58 # colon
+; 1900 0 0x3b -- 0,59 # semicolon
+< 1900 0 0x3c -- 0,60 # less
+= 1900 0 0x3d -- 0,61 # equal
+> 1900 0 0x3e -- 0,62 # greater
+? 1900 0 0x3f -- 0,63 # question
+@ 1900 0 0x40 -- 0,64 # at
+at 1900 0 0x40 -- 0,64 # "
+A 1900 0 0x41 -- 0,65 # A
+B 1900 0 0x42 -- 0,66 # B
+C 1900 0 0x43 -- 0,67 # C
+D 1900 0 0x44 -- 0,68 # D
+E 1900 0 0x45 -- 0,69 # E
+F 1900 0 0x46 -- 0,70 # F
+G 1900 0 0x47 -- 0,71 # G
+H 1900 0 0x48 -- 0,72 # H
+I 1900 0 0x49 -- 0,73 # I
+J 1900 0 0x4a -- 0,74 # J
+K 1900 0 0x4b -- 0,75 # K
+L 1900 0 0x4c -- 0,76 # L
+M 1900 0 0x4d -- 0,77 # M
+N 1900 0 0x4e -- 0,78 # N
+O 1900 0 0x4f -- 0,79 # O
+P 1900 0 0x50 -- 0,80 # P
+Q 1900 0 0x51 -- 0,81 # Q
+R 1900 0 0x52 -- 0,82 # R
+S 1900 0 0x53 -- 0,83 # S
+T 1900 0 0x54 -- 0,84 # T
+U 1900 0 0x55 -- 0,85 # U
+V 1900 0 0x56 -- 0,86 # V
+W 1900 0 0x57 -- 0,87 # W
+X 1900 0 0x58 -- 0,88 # X
+Y 1900 0 0x59 -- 0,89 # Y
+Z 1900 0 0x5a -- 0,90 # Z
+[ 1900 0 0x5b -- 0,91 # bracketleft
+lB 1900 0 0x5b -- 0,91 # "
+\ 1900 0 0x5c -- 0,92 # backslash
+rs 1900 0 0x5c -- 0,92 # "
+] 1900 0 0x5d -- 0,93 # bracketright
+rB 1900 0 0x5d -- 0,93 # "
+a^ 1900 0 0x5e -- 0,94 # circumflex
+^ 1900 0 0x5e -- 0,94 # "
+_ 1900 0 0x5f -- 0,95 # underscore
+` 1900 0 0x60 -- 0,96 # quoteleft
+oq 1900 0 0x60 -- 0,96 # "
+a 1900 0 0x61 -- 0,97 # a
+b 1900 0 0x62 -- 0,98 # b
+c 1900 0 0x63 -- 0,99 # c
+d 1900 0 0x64 -- 0,100 # d
+e 1900 0 0x65 -- 0,101 # e
+f 1900 0 0x66 -- 0,102 # f
+g 1900 0 0x67 -- 0,103 # g
+h 1900 0 0x68 -- 0,104 # h
+i 1900 0 0x69 -- 0,105 # i
+j 1900 0 0x6a -- 0,106 # j
+k 1900 0 0x6b -- 0,107 # k
+l 1900 0 0x6c -- 0,108 # l
+m 1900 0 0x6d -- 0,109 # m
+n 1900 0 0x6e -- 0,110 # n
+o 1900 0 0x6f -- 0,111 # o
+p 1900 0 0x70 -- 0,112 # p
+q 1900 0 0x71 -- 0,113 # q
+r 1900 0 0x72 -- 0,114 # r
+s 1900 0 0x73 -- 0,115 # s
+t 1900 0 0x74 -- 0,116 # t
+u 1900 0 0x75 -- 0,117 # u
+v 1900 0 0x76 -- 0,118 # v
+w 1900 0 0x77 -- 0,119 # w
+x 1900 0 0x78 -- 0,120 # x
+y 1900 0 0x79 -- 0,121 # y
+z 1900 0 0x7a -- 0,122 # z
+lC 1900 0 0x7b -- 0,123 # braceleft
+{ 1900 0 0x7b -- 0,123 # "
+| 1900 0 0x7c -- 0,124 # "
+rC 1900 0 0x7d -- 0,125 # braceright
+} 1900 0 0x7d -- 0,125 # "
+a~ 1900 0 0x7e -- 0,126 # tilde
+~ 1900 0 0x7e -- 0,126 # "
+AE 1900 0 0x92 -- 1,36 # AE
+ae 1900 0 0x91 -- 1,37 # ae
+'E 1900 0 0x90 -- 1,40 # Eacute
+'a 1900 0 0xa0 -- 1,27 # aacute
+'e 1900 0 0x82 -- 1,41 # eacute
+'i 1900 0 0xa1 -- 1,49 # iacute
+'o 1900 0 0xa2 -- 1,59 # oacute
+'u 1900 0 0x95 -- 1,65 # uacute
+:A 1900 0 0x8e -- 1,30 # Adieresis
+:O 1900 0 0x99 -- 1,62 # Odieresis
+:U 1900 0 0x9a -- 1,70 # Udieresis
+:a 1900 0 0x84 -- 1,31 # adieresis
+:e 1900 0 0x89 -- 1,45 # edieresis
+:i 1900 0 0x8b -- 1,53 # idieresis
+:o 1900 0 0x94 -- 1,63 # odieresis
+:u 1900 0 0x81 -- 1,71 # udieresis
+:y 1900 0 0x98 -- 1,75 # ydieresis
+^a 1900 0 0x83 -- 1,29 # acircumflex
+^e 1900 0 0x88 -- 1,43 # ecircumflex
+^i 1900 0 0x8c -- 1,51 # icircumflex
+^o 1900 0 0x93 -- 1,61 # ocircumflex
+^u 1900 0 0x96 -- 1,69 # ucircumflex
+`a 1900 0 0x85 -- 1,33 # agrave
+`e 1900 0 0x8a -- 1,47 # egrave
+`i 1900 0 0x8d -- 1,55 # igrave
+`o 1900 0 0x95 -- 1,65 # ograve
+`u 1900 0 0x97 -- 1,73 # ugrave
+~A 1900 0 0x28e -- 1,26 # Atilde
+~N 1900 0 0xa5 -- 1,56 # Ntilde
+~a 1900 0 0x284 -- --- # atilde
+~n 1900 0 0xa4 -- 1,57 # ntilde
+,C 1900 0 0x80 -- 1,38 # Ccedilla
+,c 1900 0 0x87 -- 1,39 # ccedilla
+oA 1900 0 0x8f -- 1,34 # Aring
+oa 1900 0 0x86 -- 1,35 # aring
+a^ 1900 0 0x5e -- 1,3 # circumflex "circumflex accent"
+a~ 1900 0 0x7e -- 1,2 # tilde "tilde accent"
+Do 1900 0 0x24 -- 0,36 # dollar
+Po 1900 0 0x9c -- 4,11 # sterling
+Ye 1900 0 0x9d -- 4,12 # yen
+Fn 1900 0 0x9f -- 4,14 # florin
+ct 1900 0 0x9b -- 4,19 # cent
+Fo 1900 0 0xae -- 4,9 # guillemotleft
+r! 1900 0 0xad -- 4,7 # exclamdown
+r? 1900 0 0xa8 -- 4,8 # questiondown
+Of 1900 0 0xa6 -- 4,15 # ordfeminine
+Om 1900 0 0xa7 -- 4,16 # ordmasculine
+S2 1900 0 0xfd -- 4,20 # twosuperior
+<- 1900 0 0x1b -- 6,22 # arrowleft
+-> 1900 0 0x1a -- 6,21 # arrowright
+<> 1900 0 0x1d -- 6,25 # arrowboth "horizontal double-headed arrow"
+da 1900 0 0x19 -- 6,24 # arrowdown
+ua 1900 0 0x18 -- 6,23 # arrowup
+va 1900 0 0x12 -- 6,26 # \& "vertical double-headed arrow"
+ba 1900 0 0xb3 -- 3,9 # bar
+bb 1900 0 0x7c -- 0,124 # brokenbar
+ul 1900 0 0x5f -- 0,95 # ul "underline with traditional troff metrics"
+ci 1900 0 0x9 -- 4,1 # circle
+bu 1900 0 0x7 -- 4,0 # bullet
+ps 1900 0 0x14 -- 4,5 # paragraph
+sc 1900 0 0x15 -- 4,6 # section
+de 1900 0 0xf8 -- 6,36 # degree
+12 1900 0 0xab -- 4,17 # onehalf
+14 1900 0 0xac -- 4,18 # onequarter
+hy 1900 0 0x2d -- 6,0 # hyphen
+lB 1900 0 0x5b -- 0,91 # bracketleft
+rB 1900 0 0x5d -- 0,93 # bracketright
+lC 1900 0 0x7b -- 0,123 # braceleft
+rC 1900 0 0x7d -- 0,125 # braceright
+aq 1900 0 0x27 -- 0,39 # quotesingle "apostrophe quote"
+at 1900 0 0x40 -- 0,64 # at
+.C1 1900 0 0x2d -- 0,45 # - minus "minus sign from current font"
+sh 1900 0 0x23 -- 0,35 # numbersign
+sl 1900 0 0x2f -- 0,47 # slash
+rs 1900 0 0x5c -- 0,92 # backslash
+*a 1900 0 0xe0 -- 8,1 # alpha
+*b 1900 0 0xe1 -- 8,3 # beta
+*d 1900 0 0xeb -- 8,9 # delta
+*h 1900 0 0xe9 -- 8,17 # theta
+*m 1900 0 0xe6 -- 8,25 # mu
+*p 1900 0 0xe3 -- 8,33 # pi
+*s 1900 0 0xe5 -- 8,37 # sigma
+*t 1900 0 0xe7 -- 8,41 # tau
+~~ 1900 0 0xf7 -- 6,13 # approxequal
+~= 1900 0 0xf7 -- 6,13 # approxequal
++- 1900 0 0xf1 -- 6,1 # plusminus
+<= 1900 0 0xf3 -- 6,2 # lessequal
+ca 1900 0 0xef -- 6,16 # intersection "intersection, cap"
+-h 1900 0 0xc4 -- 3,8 # hbar
+hbar "
+CL 1900 0 0x5 -- 5,168 # club "club suit"
+SP 1900 0 0x6 -- 5,171 # spade "spade suit"
+HE 1900 0 0x3 -- 5,170 # heart "heart suit"
+DI 1900 0 0x4 -- 5,169 # diamond "diamond suit"
+<< 1900 0 0xae -- 6,77 # "" "much less"
+>> 1900 0 0xaf -- 6,78 # "" "much greater"
+pc 1900 0 0xfa -- 6,32 # periodcentered
+mc 1900 0 0xe6 -- 8,25 # mu
+t+- 1900 0 0xf1 -- 6,1 # plusminus
diff --git a/font/devlbp/HB b/font/devlbp/HB
new file mode 100644
index 0000000..30ad0ea
--- /dev/null
+++ b/font/devlbp/HB
@@ -0,0 +1,400 @@
+name HB
+lbpname Swiss-Bold
+special
+spacewidth 927
+slant 0
+ligatures fi fl 0
+charset
+ha 1110 2 0x4c3 0,94 # asciicircum
+ti 1110 0 0x4c4 0,126 # asciitilde
+vS 2223 2 0x169 1,176 # Scaron
+vZ 2037 2 0x16e 1,206 # Zcaron
+vs 1853 2 0x173 1,177 # scaron
+vz 1667 2 0x174 1,207 # zcaron
+:Y 2223 2 0x16d 1,74 # Ydieresis
+tm 3333 2 0x170 4,41 # trademark
+aq 793 2 0x27 0,39 # quotesingle
+space 927 0 0x20 0,32
+! 1110 2 0x21 0,33 # exclam
+" 1580 2 0x22 0,34 # quotedbl
+dq 1580 2 0x22 0,34 # quotedbl
+# 1853 2 0x23 0,35 # numbersign
+sh 1853 2 0x23 0,35 # "
+$ 1853 2 0x24 0,36 # dollar
+Do 1853 2 0x24 0,36 # "
+% 2963 2 0x25 0,37 # percent
+& 2407 2 0x26 0,38 # ampersand
+' 793 2 0x27 0,39 # quoteright
+cq 793 2 0x27 0,39 # quoteright
+( 1110 2 0x28 0,40 # parenleft
+) 1110 2 0x29 0,41 # parenright
+* 1297 2 0x2a 0,42 # asterisk
++ 1947 0 0x2b 0,43 # plus
+, 927 0 0x2c 0,44 # comma
+- 1947 0 0x2d 0,45 # hyphen
+hy 1947 0 0x2d 0,45 # "
+. 927 0 0x2e 0,46 # period
+/ 927 2 0x2f 0,47 # slash
+sl 927 2 0x2f 0,47 # "
+0 1853 2 0x30 0,48 # zero
+1 1853 2 0x31 0,49 # one
+2 1853 2 0x32 0,50 # two
+3 1853 2 0x33 0,51 # three
+4 1853 2 0x34 0,52 # four
+5 1853 2 0x35 0,53 # five
+6 1853 2 0x36 0,54 # six
+7 1853 2 0x37 0,55 # seven
+8 1853 2 0x38 0,56 # eight
+9 1853 2 0x39 0,57 # nine
+: 1110 0 0x3a 0,58 # colon
+; 1110 0 0x3b 0,59 # semicolon
+< 1947 0 0x3c 0,60 # less
+= 1947 0 0x3d 0,61 # equal
+> 1947 0 0x3e 0,62 # greater
+? 2037 2 0x3f 0,63 # question
+@ 3250 2 0x40 0,64 # at
+at 3250 2 0x40 0,64 # "
+A 2407 2 0x41 0,65 # A
+B 2407 2 0x42 0,66 # B
+C 2407 2 0x43 0,67 # C
+D 2407 2 0x44 0,68 # D
+E 2223 2 0x45 0,69 # E
+F 2037 2 0x46 0,70 # F
+G 2593 2 0x47 0,71 # G
+H 2407 2 0x48 0,72 # H
+I 927 2 0x49 0,73 # I
+J 1853 2 0x4a 0,74 # J
+K 2407 2 0x4b 0,75 # K
+L 2037 2 0x4c 0,76 # L
+M 2777 2 0x4d 0,77 # M
+N 2407 2 0x4e 0,78 # N
+O 2593 2 0x4f 0,79 # O
+P 2223 2 0x50 0,80 # P
+Q 2593 2 0x51 0,81 # Q
+R 2407 2 0x52 0,82 # R
+S 2223 2 0x53 0,83 # S
+T 2037 2 0x54 0,84 # T
+U 2407 2 0x55 0,85 # U
+V 2223 2 0x56 0,86 # V
+W 3147 2 0x57 0,87 # W
+X 2223 2 0x58 0,88 # X
+Y 2223 2 0x59 0,89 # Y
+Z 2037 2 0x5a 0,90 # Z
+[ 1110 2 0x5b 0,91 # bracketleft
+lB 1110 2 0x5b 0,91 # "
+\ 927 2 0x5c 0,92 # backslash
+rs 927 2 0x5c 0,92 # "
+] 1110 2 0x5d 0,93 # bracketright
+rB 1110 2 0x5d 0,93 # "
+a^ 1110 2 0x5e 0,94 # circumflex
+^ 1110 2 0x5e 0,94 # "
+_ 1853 0 0x5f 0,95 # underscore
+` 1110 2 0x60 0,96 # quoteleft
+oq 1110 2 0x60 0,96 # "
+a 1853 0 0x61 0,97 # a
+b 2037 2 0x62 0,98 # b
+c 1853 0 0x63 0,99 # c
+d 2037 2 0x64 0,100 # d
+e 1853 0 0x65 0,101 # e
+f 1110 2 0x66 0,102 # f
+g 2037 1 0x67 0,103 # g
+h 2037 2 0x68 0,104 # h
+i 927 2 0x69 0,105 # i
+j 927 2 0x6a 0,106 # j
+k 1853 2 0x6b 0,107 # k
+l 927 2 0x6c 0,108 # l
+m 2963 0 0x6d 0,109 # m
+n 2037 0 0x6e 0,110 # n
+o 2037 0 0x6f 0,111 # o
+p 2037 1 0x70 0,112 # p
+q 2037 1 0x71 0,113 # q
+r 1297 0 0x72 0,114 # r
+s 1853 0 0x73 0,115 # s
+t 1110 2 0x74 0,116 # t
+u 2037 0 0x75 0,117 # u
+v 1853 0 0x76 0,118 # v
+w 2593 0 0x77 0,119 # w
+x 1853 0 0x78 0,120 # x
+y 1853 1 0x79 0,121 # y
+z 1667 0 0x7a 0,122 # z
+lC 1297 2 0x7b 0,123 # braceleft
+{ 1297 2 0x7b 0,123 # "
+| 933 2 0x7c 0,124 # "
+rC 1297 2 0x7d 0,125 # braceright
+} 1297 2 0x7d 0,125 # "
+a~ 1110 2 0x7e 0,126 # tilde
+~ 1110 2 0x7e 0,126 # "
+-D 2407 2 0x13d 1,78 # Eth "Icelandic uppercase eth"
+Sd 2037 2 0x148 1,87 # eth "Icelandic lowercase eth"
+TP 2223 2 0x13e 1,88 # Thorn "Icelandic uppercase thorn"
+Tp 2037 3 0x143 1,89 # thorn "Icelandic lowercase thorn"
+AE 3333 2 0x92 1,36 # AE
+ae 2963 0 0x91 1,37 # ae
+OE 3333 2 0x141 1,166 # OE
+oe 3147 0 0x146 1,167 # oe
+ij 1830 0 0x150 1,139 # ij "Dutch ij ligature"
+ss 2037 2 0x147 1,23 # germandbls
+'A 2407 2 0x15a 1,26 # Aacute
+'E 2223 2 0x90 1,40 # Eacute
+'I 927 2 0x161 1,48 # Iacute
+'O 2593 2 0x165 1,58 # Oacute
+'U 2407 2 0x16a 1,66 # Uacute
+'a 1853 2 0xa0 1,27 # aacute
+'e 1853 2 0x82 1,41 # eacute
+'i 927 2 0xa1 1,49 # iacute
+'o 2037 2 0xa2 1,59 # oacute
+'u 2037 2 0x95 1,65 # uacute
+:A 2407 2 0x8e 1,30 # Adieresis
+:E 2223 2 0x15f 1,44 # Edieresis
+:I 927 2 0x163 1,52 # Idieresis
+:O 2593 2 0x99 1,62 # Odieresis
+:U 2407 2 0x9a 1,70 # Udieresis
+:Y 2223 2 0x16d 1,74 # Ydieresis
+:a 1853 2 0x84 1,31 # adieresis
+:e 1853 2 0x89 1,45 # edieresis
+:i 927 2 0x8b 1,53 # idieresis
+:o 2037 2 0x94 1,63 # odieresis
+:u 2037 2 0x81 1,71 # udieresis
+:y 1853 3 0x98 1,75 # ydieresis
+^A 2407 2 0x15b 1,28 # Acircumflex
+^E 2223 2 0x15e 1,42 # Ecircumflex
+^I 927 2 0x162 1,50 # Icircumflex
+^O 2593 2 0x166 1,60 # Ocircumflex
+^U 2407 2 0x16b 1,68 # Ucircumflex
+^a 1853 2 0x83 1,29 # acircumflex
+^e 1853 2 0x88 1,43 # ecircumflex
+^i 927 2 0x8c 1,51 # icircumflex
+^o 2037 2 0x93 1,61 # ocircumflex
+^u 2037 2 0x96 1,69 # ucircumflex
+`A 2407 2 0x15c 1,32 # Agrave
+`E 2223 2 0x160 1,46 # Egrave
+`I 927 2 0x164 1,54 # Igrave
+`O 2593 2 0x167 1,64 # Ograve
+`U 2407 2 0x16c 1,72 # Ugrave
+`a 1853 2 0x85 1,33 # agrave
+~a 1853 2 0x284 --- # atilde
+`e 1853 2 0x8a 1,47 # egrave
+`i 927 2 0x8d 1,55 # igrave
+`o 2037 2 0x95 1,65 # ograve
+`u 2037 2 0x97 1,73 # ugrave
+~A 2407 2 0x28e 1,26 # Atilde
+~N 2407 2 0xa5 1,56 # Ntilde
+~O 2593 2 0x168 1,82 # Otilde
+~n 2037 2 0xa4 1,57 # ntilde
+~o 2037 2 0x172 1,83 # otilde
+vS 2223 2 0x169 1,176 # Scaron
+vs 1853 2 0x173 1,177 # scaron
+vZ 2037 2 0x16e 1,206 # Zcaron
+vz 1667 2 0x174 1,207 # zcaron
+,C 2407 2 0x80 1,38 # Ccedilla
+,c 1853 0 0x87 1,39 # ccedilla
+/L 2037 2 0x13f 1,152 # Lslash "Polish L with a slash"
+/l 927 2 0x144 1,153 # lslash "Polish l with a slash"
+/O 2593 2 0x140 1,80 # Oslash
+/o 2037 0 0x145 1,81 # oslash
+oA 2407 2 0x8f 1,34 # Aring
+oa 1853 2 0x86 1,35 # aring
+a" 1110 2 0x13a 1,16 # hungarumlaut "Hungarian umlaut"
+a- 1110 2 0x135 1,8 # macron "macron or bar accent"
+a. 1110 2 0x137 1,15 # dotaccent "dot accent"
+a^ 1110 2 0x5e 1,3 # circumflex "circumflex accent"
+aa 1110 2 0x120 1,6 # acute "acute accent"
+ga 1110 2 0x121 1,0 # grave "grave accent"
+ab 1110 2 0x136 1,22 # breve "breve accent"
+ac 1110 0 0x139 1,17 # cedilla "cedilla accent"
+ad 1110 2 0x122 1,7 # dieresis "umlaut or dieresis"
+ah 1110 2 0x13c 1,19 # caron "h\('a\(vcek accent"
+ao 1110 2 0x138 1,14 # ring "ring or circle accent"
+a~ 1110 2 0x7e 1,2 # tilde "tilde accent"
+ho 1110 0 0x13b 1,18 # ogonek "hook or ogonek accent"
+.i 927 0 0x142 1,239 # dotlessi "i without a dot"
+Cs 1853 2 0x12f 4,24 # currency "Scandinavian currency sign"
+Do 1853 2 0x24 0,36 # dollar
+Po 1853 2 0x9c 4,11 # sterling
+Ye 1853 2 0x9d 4,12 # yen
+Fn 1853 2 0x9f 4,14 # florin
+ct 1853 2 0x9b 4,19 # cent
+Fo 1853 0 0xae 4,9 # guillemotleft
+Fc 1110 0 0x4bb 4,20 # guillemotright
+fo 1110 0 0x127 4,35 # guilsinglleft
+fc 1110 0 0x128 4,36 # guilsinglright
+r! 1110 1 0xad 4,7 # exclamdown
+r? 2037 1 0xa8 4,8 # questiondown
+fi 2037 2 0x130 4,54 # fi "fi ligature"
+fl 2037 2 0x131 4,55 # fl "fl ligature"
+OK 2037 0 0x3d6 --- # \& "check mark, tick"
+Of 1233 2 0xa6 4,15 # ordfeminine
+Om 1217 2 0xa7 4,16 # ordmasculine
+S1 1110 2 0x156 4,78 # onesuperior
+S2 1110 2 0xfd 4,20 # twosuperior
+S3 1110 2 0x14d 4,26 # threesuperior
+<- 3290 0 0x1b 6,22 # arrowleft
+-> 3290 0 0x1a 6,21 # arrowright
+<> 3473 0 0x1d 6,25 # arrowboth "horizontal double-headed arrow"
+da 2010 0 0x19 6,24 # arrowdown
+ua 2010 0 0x18 6,23 # arrowup
+va 2010 0 0x12 6,26 # \& "vertical double-headed arrow"
+lA 2010 0 0x3dc 6,57 # arrowdblleft
+rA 2010 0 0x3de 6,56 # arrowdblright
+hA 2010 0 0x3db 6,60 # arrowdblboth "horizontal double-headed double arrow"
+dA 2010 0 0x3df 6,59 # arrowdbldown
+uA 2010 0 0x3dd 6,58 # arrowdblup
+ba 3333 2 0xb3 3,9 # bar
+bb 933 2 0x7c 0,124 # brokenbar
+br 3333 0 0x1db 3,9 # br "box rule with traditional troff metrics"
+ru 3333 0 0x123 4,34 # ru "baseline rule"
+ul 1853 0 0x5f 0,95 # ul "underline with traditional troff metrics"
+bv 3333 0 0x3f4 3,9 # bv "bold vertical"
+ci 2843 0 0x9 4,1 # circle
+bu 2120 0 0x7 4,0 # bullet
+co 2457 2 0x154 4,23 # copyright
+rg 2457 2 0x155 4,22 # registered
+tm 3333 2 0x170 4,41 # trademark
+dd 1853 2 0x12b 4,40 # daggerdbl "double dagger sign"
+dg 1853 2 0x12a 4,39 # dagger
+ps 1853 2 0x14 4,5 # paragraph
+sc 1853 2 0x15 4,6 # section
+de 1333 2 0xf8 6,36 # degree
+em 3333 0 0x123 4,34 # emdash "em dash"
+en 1853 0 0x132 4,33 # endash "en dash"
+%0 3333 2 0x129 4,75 # perthousand "per thousand, per mille sign"
+12 2780 2 0xab 4,17 # onehalf
+14 2780 2 0xac 4,18 # onequarter
+34 2780 2 0x12e 4,25 # threequarters
+f/ 927 2 0x158 6,6 # fraction "bar for fractions"
+fm 927 0 0x3a2 6,45 # minute "footmark, prime"
+sd 927 0 0x3b2 6,46 # second
+ha 927 2 0x4c3 6,85 # asciicircum "\s-2ASCII\s+2 circumflex, hat, caret"
+ti 927 0 0x4c4 6,12 # asciitilde "\s-2ASCII\s0 tilde, large tilde"
+hy 1947 0 0x2d 6,0 # hyphen
+lB 1110 2 0x5b 0,91 # bracketleft
+rB 1110 2 0x5d 0,93 # bracketright
+lC 1297 2 0x7b 0,123 # braceleft
+rC 1297 2 0x7d 0,125 # braceright
+la 1297 0 0x3e1 6,10 # angleleft "left angle bracket"
+ra 1297 0 0x3f1 6,11 # angleright "right angle bracket"
+Bq 1667 0 0x4b9 4,63 # quotedblbase "low double comma quote"
+bq 1667 0 0x4b8 6,62 # quotesinglbase "low single comma quote"
+lq 1667 2 0x125 4,32 # quotedblleft
+rq 1667 2 0x4ba 6,31 # quotedblright
+oq 927 2 0x176 4,29 # quoteleft "single open quote"
+aq 793 2 0x27 0,39 # quotesingle "apostrophe quote"
+at 3250 2 0x40 0,64 # at
+.C1 1947 0 0x2d 0,45 # - minus "minus sign from current font"
+sh 1853 2 0x23 0,35 # numbersign
+sl 927 2 0x2f 0,47 # slash
+rs 927 2 0x5c 0,92 # backslash
+3d 927 0 0x35c 6,102 # therefore
+tf 927 0 0x35c 6,102 # therefore
+*A 927 0 0x341 8,0 # Alpha
+*B 927 0 0x342 8,2 # Beta
+*C 927 0 0x358 8,28 # Xi
+*D 927 0 0x344 8,8 # Delta
+*E 927 0 0x345 8,10 # Epsilon
+*F 2477 0 0x346 8,44 # Phi
+*G 1953 0 0x347 8,6 # Gamma
+*H 1953 0 0x351 8,16 # Theta
+*I 1953 0 0x349 8,18 # Iota
+*K 1953 0 0x34b 8,20 # Kappa
+*L 1953 0 0x34c 8,22 # Lambda
+*M 1953 0 0x34d 8,24 # Mu
+*N 1953 0 0x34e 8,26 # Nu
+*O 1953 0 0x34f 8,30 # Omicron
+*P 1953 0 0x350 8,32 # Pi
+*Q 1953 0 0x359 8,48 # Psi
+*R 1953 0 0x352 8,34 # Rho
+*S 1953 0 0x353 8,36 # Sigma
+*T 1953 0 0x354 8,40 # Tau
+*U 1953 0 0x3a1 8,76 # Upsilon
+*W 2560 0 0x357 8,50 # Omega
+*X 1953 0 0x343 8,36 # Chi
+*Y 1953 0 0x348 8,14 # Eta
+*Z 1953 0 0x35a 8,12 # Zeta
+*a 2027 0 0xe0 8,1 # alpha
+*b 2027 0 0xe1 8,3 # beta
+*c 2027 0 0x378 8,29 # xi
+*d 1980 0 0xeb 8,9 # delta
+*e 1980 0 0x36e 8,70 # epsilon
+*f 1980 0 0x366 8,45 # phi
++f 1980 0 0x36a 8,77 # phi1 "variant phi"
+*g 1980 0 0x367 8,7 # gamma
+*h 1977 0 0xe9 8,17 # theta
++h 1977 0 0x375 8,71 # theta1 "variant theta"
+*i 1977 0 0x369 8,19 # iota
+*k 1977 0 0x36b 8,21 # kappa
+*l 1977 0 0x36c 8,23 # lambda
+*m 2037 0 0xe6 8,25 # mu
+*n 2037 0 0x36e 8,27 # nu
+*o 2037 0 0x36f 8,31 # omicron
+*p 2143 0 0xe3 8,33 # pi
++p 2143 0 0x376 8,78 # omega1 "variant pi, looking like omega"
+*q 2143 0 0x379 8,49 # psi
+*r 2143 0 0x372 8,35 # rho
+*s 2157 0 0xe5 8,37 # sigma
+*t 1503 0 0xe7 8,41 # tau
+*u 1503 0 0x375 8,27 # upsilon
+*w 1503 0 0x377 8,51 # omega
+*x 1503 0 0x363 8,47 # chi
+*y 1503 0 0x368 8,15 # eta
+*z 1503 0 0x37a 8,13 # zeta
+ts 1503 0 0x356 8,39 # sigma1 "terminal sigma"
+~~ 2663 0 0xf7 6,13 # approxequal
+~= 2663 0 0xf7 6,13 # approxequal
+!= 2663 0 0x3b9 6,99 # notequal
+** 927 0 0x32a 0,32 # asteriskmath
++- 1947 0 0xf1 6,1 # plusminus
+<= 2407 0 0xf3 6,2 # lessequal
+== 2407 0 0x3ba 8,14 # equivalence
+=~ 2407 0 0x340 8,116 # congruent
+>= 2027 0 0x3b3 8,3 # greaterequal
+AN 2027 0 0x3d9 8,85 # logicaland
+OR 2027 0 0x3da 8,86 # logicalor
+no 2027 0 0x3d8 8,20 # logicalnot
+te 2027 0 0x324 8,121 # existential "there exists, existential quantifier"
+fa 2027 0 0x322 8,122 # universal "for all, universal quantifier"
+Ah 2027 0 0x3c0 9,0 # aleph
+Im 2027 0 0x3c1 8,21 # Ifraktur "Fraktur I, imaginary"
+Re 2027 0 0x3c2 8,22 # Rfraktur "Fraktur R, real"
+if 2027 0 0x3a5 8,19 # infinity
+md 2027 0 0x3b7 8,32 # dotmath
+mo 2027 0 0x3ce 8,15 # element
+mu 2027 0 0x3b4 8,39 # multiply
+nc 2027 0 0x3cb 8,197 # uni2285
+nm 2027 0 0x3cf 8,209 # notelement
+pl 1110 0 0x32b 0,93 # plusmath "plus sign in special font"
+eq 1947 0 0x33d 0,61 # equalmath "equals sign in special font"
+pt 1947 0 0x3b5 6,4 # proportional
+pp 1947 0 0x35e 8,89 # perpendicular
+sb 1947 0 0x3cc 6,67 # propersubset
+sp 1947 0 0x3c9 6,68 # propersuperset
+ib 1947 0 0x3cd 6,69 # reflexsubset
+ip 1947 0 0x3ca 6,70 # reflexsuperset
+ap 1947 0 0x37e 6,12 # similar
+pd 1947 0 0x3b6 6,34 # partialdiff "partial differentiation sign"
+c* 1947 0 0x3c4 6,80 # circlemultiply "multiply sign in a circle"
+c+ 1947 0 0x3c5 6,81 # circleplus "plus sign in a circle"
+ca 2620 0 0xef 6,16 # intersection "intersection, cap"
+cu 2620 0 0x3c8 6,66 # union "union, cup"
+di 1947 0 0x3b8 6,8 # divide "division sign"
+-h 3333 0 0xc4 3,8 # hbar
+hbar "
+gr 3333 0 0x3d1 6,33 # gradient
+es 2593 0 0x3c6 0,79 # emptyset
+CL 2510 0 0x5 5,168 # club "club suit"
+SP 2510 0 0x6 5,171 # spade "spade suit"
+HE 2510 0 0x3 5,170 # heart "heart suit"
+DI 2510 0 0x4 5,169 # diamond "diamond suit"
+CR 2510 0 0x3bf 5,20 # carriagereturn "carriage return symbol"
+st 2510 0 0x327 6,71 # suchthat
+/_ 2510 0 0x3d0 6,79 # angle
+<< 1853 0 0xae 6,77 # "" "much less"
+>> 1853 0 0xaf 6,78 # "" "much greater"
+wp 1853 0 0x3c3 6,53 # weierstrass "Weierstrass p"
+lz 1853 0 0x3e0 6,95 # lozenge
+an 3333 0 0x3be 3,8 # arrowhorizex "horizontal arrow extension"
+pc 927 0 0xfa 6,32 # periodcentered
+mc 2037 0 0xe6 8,25 # mu
+t+- 1947 0 0xf1 6,1 # plusminus
+tmu 2027 0 0x3b4 8,39 # multiply
+tdi 1947 0 0x3b8 6,8 # divide "division sign"
+tno 2027 0 0x3d8 8,20 # logicalnot
diff --git a/font/devlbp/HBI b/font/devlbp/HBI
new file mode 100644
index 0000000..e0e83db
--- /dev/null
+++ b/font/devlbp/HBI
@@ -0,0 +1,401 @@
+slant 18.49
+name HBI
+lbpname Swiss-BoldOblique
+special
+spacewidth 927
+slant 0
+ligatures fi fl 0
+charset
+ha 1110 2 0x4c3 0,94 # asciicircum
+ti 1110 0 0x4c4 0,126 # asciitilde
+vS 2223 2 0x169 1,176 # Scaron
+vZ 2037 2 0x16e 1,206 # Zcaron
+vs 1853 2 0x173 1,177 # scaron
+vz 1667 2 0x174 1,207 # zcaron
+:Y 2223 2 0x16d 1,74 # Ydieresis
+tm 3333 2 0x170 4,41 # trademark
+aq 793 2 0x27 0,39 # quotesingle
+space 927 0 0x20 0,32
+! 1110 2 0x21 0,33 # exclam
+" 1580 2 0x22 0,34 # quotedbl
+dq 1580 2 0x22 0,34 # quotedbl
+# 1853 2 0x23 0,35 # numbersign
+sh 1853 2 0x23 0,35 # "
+$ 1853 2 0x24 0,36 # dollar
+Do 1853 2 0x24 0,36 # "
+% 2963 2 0x25 0,37 # percent
+& 2407 2 0x26 0,38 # ampersand
+' 793 2 0x27 0,39 # quoteright
+cq 793 2 0x27 0,39 # quoteright
+( 1110 2 0x28 0,40 # parenleft
+) 1110 2 0x29 0,41 # parenright
+* 1297 2 0x2a 0,42 # asterisk
++ 1947 0 0x2b 0,43 # plus
+, 927 0 0x2c 0,44 # comma
+- 1947 0 0x2d 0,45 # hyphen
+hy 1947 0 0x2d 0,45 # "
+. 927 0 0x2e 0,46 # period
+/ 927 2 0x2f 0,47 # slash
+sl 927 2 0x2f 0,47 # "
+0 1853 2 0x30 0,48 # zero
+1 1853 2 0x31 0,49 # one
+2 1853 2 0x32 0,50 # two
+3 1853 2 0x33 0,51 # three
+4 1853 2 0x34 0,52 # four
+5 1853 2 0x35 0,53 # five
+6 1853 2 0x36 0,54 # six
+7 1853 2 0x37 0,55 # seven
+8 1853 2 0x38 0,56 # eight
+9 1853 2 0x39 0,57 # nine
+: 1110 0 0x3a 0,58 # colon
+; 1110 0 0x3b 0,59 # semicolon
+< 1947 0 0x3c 0,60 # less
+= 1947 0 0x3d 0,61 # equal
+> 1947 0 0x3e 0,62 # greater
+? 2037 2 0x3f 0,63 # question
+@ 3250 2 0x40 0,64 # at
+at 3250 2 0x40 0,64 # "
+A 2407 2 0x41 0,65 # A
+B 2407 2 0x42 0,66 # B
+C 2407 2 0x43 0,67 # C
+D 2407 2 0x44 0,68 # D
+E 2223 2 0x45 0,69 # E
+F 2037 2 0x46 0,70 # F
+G 2593 2 0x47 0,71 # G
+H 2407 2 0x48 0,72 # H
+I 927 2 0x49 0,73 # I
+J 1853 2 0x4a 0,74 # J
+K 2407 2 0x4b 0,75 # K
+L 2037 2 0x4c 0,76 # L
+M 2777 2 0x4d 0,77 # M
+N 2407 2 0x4e 0,78 # N
+O 2593 2 0x4f 0,79 # O
+P 2223 2 0x50 0,80 # P
+Q 2593 2 0x51 0,81 # Q
+R 2407 2 0x52 0,82 # R
+S 2223 2 0x53 0,83 # S
+T 2037 2 0x54 0,84 # T
+U 2407 2 0x55 0,85 # U
+V 2223 2 0x56 0,86 # V
+W 3147 2 0x57 0,87 # W
+X 2223 2 0x58 0,88 # X
+Y 2223 2 0x59 0,89 # Y
+Z 2037 2 0x5a 0,90 # Z
+[ 1110 2 0x5b 0,91 # bracketleft
+lB 1110 2 0x5b 0,91 # "
+\ 927 2 0x5c 0,92 # backslash
+rs 927 2 0x5c 0,92 # "
+] 1110 2 0x5d 0,93 # bracketright
+rB 1110 2 0x5d 0,93 # "
+a^ 1110 2 0x5e 0,94 # circumflex
+^ 1110 2 0x5e 0,94 # "
+_ 1853 0 0x5f 0,95 # underscore
+` 1110 2 0x60 0,96 # quoteleft
+oq 1110 2 0x60 0,96 # "
+a 1853 0 0x61 0,97 # a
+b 2037 2 0x62 0,98 # b
+c 1853 0 0x63 0,99 # c
+d 2037 2 0x64 0,100 # d
+e 1853 0 0x65 0,101 # e
+f 1110 2 0x66 0,102 # f
+g 2037 1 0x67 0,103 # g
+h 2037 2 0x68 0,104 # h
+i 927 2 0x69 0,105 # i
+j 927 2 0x6a 0,106 # j
+k 1853 2 0x6b 0,107 # k
+l 927 2 0x6c 0,108 # l
+m 2963 0 0x6d 0,109 # m
+n 2037 0 0x6e 0,110 # n
+o 2037 0 0x6f 0,111 # o
+p 2037 1 0x70 0,112 # p
+q 2037 1 0x71 0,113 # q
+r 1297 0 0x72 0,114 # r
+s 1853 0 0x73 0,115 # s
+t 1110 2 0x74 0,116 # t
+u 2037 0 0x75 0,117 # u
+v 1853 0 0x76 0,118 # v
+w 2593 0 0x77 0,119 # w
+x 1853 0 0x78 0,120 # x
+y 1853 1 0x79 0,121 # y
+z 1667 0 0x7a 0,122 # z
+lC 1297 2 0x7b 0,123 # braceleft
+{ 1297 2 0x7b 0,123 # "
+| 933 2 0x7c 0,124 # "
+rC 1297 2 0x7d 0,125 # braceright
+} 1297 2 0x7d 0,125 # "
+a~ 1110 2 0x7e 0,126 # tilde
+~ 1110 2 0x7e 0,126 # "
+-D 2407 2 0x13d 1,78 # Eth "Icelandic uppercase eth"
+Sd 2037 2 0x148 1,87 # eth "Icelandic lowercase eth"
+TP 2223 2 0x13e 1,88 # Thorn "Icelandic uppercase thorn"
+Tp 2037 3 0x143 1,89 # thorn "Icelandic lowercase thorn"
+AE 3333 2 0x92 1,36 # AE
+ae 2963 0 0x91 1,37 # ae
+OE 3333 2 0x141 1,166 # OE
+oe 3147 0 0x146 1,167 # oe
+ij 1830 0 0x150 1,139 # ij "Dutch ij ligature"
+ss 2037 2 0x147 1,23 # germandbls
+'A 2407 2 0x15a 1,26 # Aacute
+'E 2223 2 0x90 1,40 # Eacute
+'I 927 2 0x161 1,48 # Iacute
+'O 2593 2 0x165 1,58 # Oacute
+'U 2407 2 0x16a 1,66 # Uacute
+'a 1853 2 0xa0 1,27 # aacute
+'e 1853 2 0x82 1,41 # eacute
+'i 927 2 0xa1 1,49 # iacute
+'o 2037 2 0xa2 1,59 # oacute
+'u 2037 2 0x95 1,65 # uacute
+:A 2407 2 0x8e 1,30 # Adieresis
+:E 2223 2 0x15f 1,44 # Edieresis
+:I 927 2 0x163 1,52 # Idieresis
+:O 2593 2 0x99 1,62 # Odieresis
+:U 2407 2 0x9a 1,70 # Udieresis
+:Y 2223 2 0x16d 1,74 # Ydieresis
+:a 1853 2 0x84 1,31 # adieresis
+:e 1853 2 0x89 1,45 # edieresis
+:i 927 2 0x8b 1,53 # idieresis
+:o 2037 2 0x94 1,63 # odieresis
+:u 2037 2 0x81 1,71 # udieresis
+:y 1853 3 0x98 1,75 # ydieresis
+^A 2407 2 0x15b 1,28 # Acircumflex
+^E 2223 2 0x15e 1,42 # Ecircumflex
+^I 927 2 0x162 1,50 # Icircumflex
+^O 2593 2 0x166 1,60 # Ocircumflex
+^U 2407 2 0x16b 1,68 # Ucircumflex
+^a 1853 2 0x83 1,29 # acircumflex
+^e 1853 2 0x88 1,43 # ecircumflex
+^i 927 2 0x8c 1,51 # icircumflex
+^o 2037 2 0x93 1,61 # ocircumflex
+^u 2037 2 0x96 1,69 # ucircumflex
+`A 2407 2 0x15c 1,32 # Agrave
+`E 2223 2 0x160 1,46 # Egrave
+`I 927 2 0x164 1,54 # Igrave
+`O 2593 2 0x167 1,64 # Ograve
+`U 2407 2 0x16c 1,72 # Ugrave
+`a 1853 2 0x85 1,33 # agrave
+~a 1853 2 0x284 --- # atilde
+`e 1853 2 0x8a 1,47 # egrave
+`i 927 2 0x8d 1,55 # igrave
+`o 2037 2 0x95 1,65 # ograve
+`u 2037 2 0x97 1,73 # ugrave
+~A 2407 2 0x28e 1,26 # Atilde
+~N 2407 2 0xa5 1,56 # Ntilde
+~O 2593 2 0x168 1,82 # Otilde
+~n 2037 2 0xa4 1,57 # ntilde
+~o 2037 2 0x172 1,83 # otilde
+vS 2223 2 0x169 1,176 # Scaron
+vs 1853 2 0x173 1,177 # scaron
+vZ 2037 2 0x16e 1,206 # Zcaron
+vz 1667 2 0x174 1,207 # zcaron
+,C 2407 2 0x80 1,38 # Ccedilla
+,c 1853 0 0x87 1,39 # ccedilla
+/L 2037 2 0x13f 1,152 # Lslash "Polish L with a slash"
+/l 927 2 0x144 1,153 # lslash "Polish l with a slash"
+/O 2593 2 0x140 1,80 # Oslash
+/o 2037 0 0x145 1,81 # oslash
+oA 2407 2 0x8f 1,34 # Aring
+oa 1853 2 0x86 1,35 # aring
+a" 1110 2 0x13a 1,16 # hungarumlaut "Hungarian umlaut"
+a- 1110 2 0x135 1,8 # macron "macron or bar accent"
+a. 1110 2 0x137 1,15 # dotaccent "dot accent"
+a^ 1110 2 0x5e 1,3 # circumflex "circumflex accent"
+aa 1110 2 0x120 1,6 # acute "acute accent"
+ga 1110 2 0x121 1,0 # grave "grave accent"
+ab 1110 2 0x136 1,22 # breve "breve accent"
+ac 1110 0 0x139 1,17 # cedilla "cedilla accent"
+ad 1110 2 0x122 1,7 # dieresis "umlaut or dieresis"
+ah 1110 2 0x13c 1,19 # caron "h\('a\(vcek accent"
+ao 1110 2 0x138 1,14 # ring "ring or circle accent"
+a~ 1110 2 0x7e 1,2 # tilde "tilde accent"
+ho 1110 0 0x13b 1,18 # ogonek "hook or ogonek accent"
+.i 927 0 0x142 1,239 # dotlessi "i without a dot"
+Cs 1853 2 0x12f 4,24 # currency "Scandinavian currency sign"
+Do 1853 2 0x24 0,36 # dollar
+Po 1853 2 0x9c 4,11 # sterling
+Ye 1853 2 0x9d 4,12 # yen
+Fn 1853 2 0x9f 4,14 # florin
+ct 1853 2 0x9b 4,19 # cent
+Fo 1853 0 0xae 4,9 # guillemotleft
+Fc 1110 0 0x4bb 4,20 # guillemotright
+fo 1110 0 0x127 4,35 # guilsinglleft
+fc 1110 0 0x128 4,36 # guilsinglright
+r! 1110 1 0xad 4,7 # exclamdown
+r? 2037 1 0xa8 4,8 # questiondown
+fi 2037 2 0x130 4,54 # fi "fi ligature"
+fl 2037 2 0x131 4,55 # fl "fl ligature"
+OK 2037 0 0x3d6 --- # \& "check mark, tick"
+Of 1233 2 0xa6 4,15 # ordfeminine
+Om 1217 2 0xa7 4,16 # ordmasculine
+S1 1110 2 0x156 4,78 # onesuperior
+S2 1110 2 0xfd 4,20 # twosuperior
+S3 1110 2 0x14d 4,26 # threesuperior
+<- 3290 0 0x1b 6,22 # arrowleft
+-> 3290 0 0x1a 6,21 # arrowright
+<> 3473 0 0x1d 6,25 # arrowboth "horizontal double-headed arrow"
+da 2010 0 0x19 6,24 # arrowdown
+ua 2010 0 0x18 6,23 # arrowup
+va 2010 0 0x12 6,26 # \& "vertical double-headed arrow"
+lA 2010 0 0x3dc 6,57 # arrowdblleft
+rA 2010 0 0x3de 6,56 # arrowdblright
+hA 2010 0 0x3db 6,60 # arrowdblboth "horizontal double-headed double arrow"
+dA 2010 0 0x3df 6,59 # arrowdbldown
+uA 2010 0 0x3dd 6,58 # arrowdblup
+ba 3333 2 0xb3 3,9 # bar
+bb 933 2 0x7c 0,124 # brokenbar
+br 3333 0 0x1db 3,9 # br "box rule with traditional troff metrics"
+ru 3333 0 0x123 4,34 # ru "baseline rule"
+ul 1853 0 0x5f 0,95 # ul "underline with traditional troff metrics"
+bv 3333 0 0x3f4 3,9 # bv "bold vertical"
+ci 2843 0 0x9 4,1 # circle
+bu 2120 0 0x7 4,0 # bullet
+co 2457 2 0x154 4,23 # copyright
+rg 2457 2 0x155 4,22 # registered
+tm 3333 2 0x170 4,41 # trademark
+dd 1853 2 0x12b 4,40 # daggerdbl "double dagger sign"
+dg 1853 2 0x12a 4,39 # dagger
+ps 1853 2 0x14 4,5 # paragraph
+sc 1853 2 0x15 4,6 # section
+de 1333 2 0xf8 6,36 # degree
+em 3333 0 0x123 4,34 # emdash "em dash"
+en 1853 0 0x132 4,33 # endash "en dash"
+%0 3333 2 0x129 4,75 # perthousand "per thousand, per mille sign"
+12 2780 2 0xab 4,17 # onehalf
+14 2780 2 0xac 4,18 # onequarter
+34 2780 2 0x12e 4,25 # threequarters
+f/ 557 2 0x158 6,6 # fraction "bar for fractions"
+fm 557 0 0x3a2 6,45 # minute "footmark, prime"
+sd 557 0 0x3b2 6,46 # second
+ha 557 2 0x4c3 6,85 # asciicircum "\s-2ASCII\s+2 circumflex, hat, caret"
+ti 557 0 0x4c4 6,12 # asciitilde "\s-2ASCII\s0 tilde, large tilde"
+hy 1947 0 0x2d 6,0 # hyphen
+lB 1110 2 0x5b 0,91 # bracketleft
+rB 1110 2 0x5d 0,93 # bracketright
+lC 1297 2 0x7b 0,123 # braceleft
+rC 1297 2 0x7d 0,125 # braceright
+la 1297 0 0x3e1 6,10 # angleleft "left angle bracket"
+ra 1297 0 0x3f1 6,11 # angleright "right angle bracket"
+Bq 1667 0 0x4b9 4,63 # quotedblbase "low double comma quote"
+bq 1667 0 0x4b8 6,62 # quotesinglbase "low single comma quote"
+lq 1667 2 0x125 4,32 # quotedblleft
+rq 1667 2 0x4ba 6,31 # quotedblright
+oq 927 2 0x176 4,29 # quoteleft "single open quote"
+aq 793 2 0x27 0,39 # quotesingle "apostrophe quote"
+at 3250 2 0x40 0,64 # at
+.C1 1947 0 0x2d 0,45 # - minus "minus sign from current font"
+sh 1853 2 0x23 0,35 # numbersign
+sl 927 2 0x2f 0,47 # slash
+rs 927 2 0x5c 0,92 # backslash
+3d 927 0 0x35c 6,102 # therefore
+tf 927 0 0x35c 6,102 # therefore
+*A 927 0 0x341 8,0 # Alpha
+*B 927 0 0x342 8,2 # Beta
+*C 927 0 0x358 8,28 # Xi
+*D 927 0 0x344 8,8 # Delta
+*E 927 0 0x345 8,10 # Epsilon
+*F 2477 0 0x346 8,44 # Phi
+*G 1953 0 0x347 8,6 # Gamma
+*H 1953 0 0x351 8,16 # Theta
+*I 1953 0 0x349 8,18 # Iota
+*K 1953 0 0x34b 8,20 # Kappa
+*L 1953 0 0x34c 8,22 # Lambda
+*M 1953 0 0x34d 8,24 # Mu
+*N 1953 0 0x34e 8,26 # Nu
+*O 1953 0 0x34f 8,30 # Omicron
+*P 1953 0 0x350 8,32 # Pi
+*Q 1953 0 0x359 8,48 # Psi
+*R 1953 0 0x352 8,34 # Rho
+*S 1953 0 0x353 8,36 # Sigma
+*T 1953 0 0x354 8,40 # Tau
+*U 1953 0 0x3a1 8,76 # Upsilon
+*W 2560 0 0x357 8,50 # Omega
+*X 1953 0 0x343 8,36 # Chi
+*Y 1953 0 0x348 8,14 # Eta
+*Z 1953 0 0x35a 8,12 # Zeta
+*a 2027 0 0xe0 8,1 # alpha
+*b 2027 0 0xe1 8,3 # beta
+*c 2027 0 0x378 8,29 # xi
+*d 1980 0 0xeb 8,9 # delta
+*e 1980 0 0x36e 8,70 # epsilon
+*f 1980 0 0x366 8,45 # phi
++f 1980 0 0x36a 8,77 # phi1 "variant phi"
+*g 1980 0 0x367 8,7 # gamma
+*h 1977 0 0xe9 8,17 # theta
++h 1977 0 0x375 8,71 # theta1 "variant theta"
+*i 1977 0 0x369 8,19 # iota
+*k 1977 0 0x36b 8,21 # kappa
+*l 1977 0 0x36c 8,23 # lambda
+*m 2037 0 0xe6 8,25 # mu
+*n 2037 0 0x36e 8,27 # nu
+*o 2037 0 0x36f 8,31 # omicron
+*p 2143 0 0xe3 8,33 # pi
++p 2143 0 0x376 8,78 # omega1 "variant pi, looking like omega"
+*q 2143 0 0x379 8,49 # psi
+*r 2143 0 0x372 8,35 # rho
+*s 2157 0 0xe5 8,37 # sigma
+*t 1503 0 0xe7 8,41 # tau
+*u 1503 0 0x375 8,27 # upsilon
+*w 1503 0 0x377 8,51 # omega
+*x 1503 0 0x363 8,47 # chi
+*y 1503 0 0x368 8,15 # eta
+*z 1503 0 0x37a 8,13 # zeta
+ts 1503 0 0x356 8,39 # sigma1 "terminal sigma"
+~~ 2663 0 0xf7 6,13 # approxequal
+~= 2663 0 0xf7 6,13 # approxequal
+!= 2663 0 0x3b9 6,99 # notequal
+** 927 0 0x32a 0,32 # asteriskmath
++- 1947 0 0xf1 6,1 # plusminus
+<= 2407 0 0xf3 6,2 # lessequal
+== 2407 0 0x3ba 8,14 # equivalence
+=~ 2407 0 0x340 8,116 # congruent
+>= 2027 0 0x3b3 8,3 # greaterequal
+AN 2027 0 0x3d9 8,85 # logicaland
+OR 2027 0 0x3da 8,86 # logicalor
+no 2027 0 0x3d8 8,20 # logicalnot
+te 2027 0 0x324 8,121 # existential "there exists, existential quantifier"
+fa 2027 0 0x322 8,122 # universal "for all, universal quantifier"
+Ah 2027 0 0x3c0 9,0 # aleph
+Im 2027 0 0x3c1 8,21 # Ifraktur "Fraktur I, imaginary"
+Re 2027 0 0x3c2 8,22 # Rfraktur "Fraktur R, real"
+if 2027 0 0x3a5 8,19 # infinity
+md 2027 0 0x3b7 8,32 # dotmath
+mo 2027 0 0x3ce 8,15 # element
+mu 2027 0 0x3b4 8,39 # multiply
+nc 2027 0 0x3cb 8,197 # uni2285
+nm 2027 0 0x3cf 8,209 # notelement
+pl 1110 0 0x32b 0,93 # plusmath "plus sign in special font"
+eq 1947 0 0x33d 0,61 # equalmath "equals sign in special font"
+pt 1947 0 0x3b5 6,4 # proportional
+pp 1947 0 0x35e 8,89 # perpendicular
+sb 1947 0 0x3cc 6,67 # propersubset
+sp 1947 0 0x3c9 6,68 # propersuperset
+ib 1947 0 0x3cd 6,69 # reflexsubset
+ip 1947 0 0x3ca 6,70 # reflexsuperset
+ap 1947 0 0x37e 6,12 # similar
+pd 1947 0 0x3b6 6,34 # partialdiff "partial differentiation sign"
+c* 1947 0 0x3c4 6,80 # circlemultiply "multiply sign in a circle"
+c+ 1947 0 0x3c5 6,81 # circleplus "plus sign in a circle"
+ca 2620 0 0xef 6,16 # intersection "intersection, cap"
+cu 2620 0 0x3c8 6,66 # union "union, cup"
+di 1947 0 0x3b8 6,8 # divide "division sign"
+-h 3333 0 0xc4 3,8 # hbar
+hbar "
+gr 3333 0 0x3d1 6,33 # gradient
+es 2593 0 0x3c6 0,79 # emptyset
+CL 2510 0 0x5 5,168 # club "club suit"
+SP 2510 0 0x6 5,171 # spade "spade suit"
+HE 2510 0 0x3 5,170 # heart "heart suit"
+DI 2510 0 0x4 5,169 # diamond "diamond suit"
+CR 2510 0 0x3bf 5,20 # carriagereturn "carriage return symbol"
+st 2510 0 0x327 6,71 # suchthat
+/_ 2510 0 0x3d0 6,79 # angle
+<< 1853 0 0xae 6,77 # "" "much less"
+>> 1853 0 0xaf 6,78 # "" "much greater"
+wp 1853 0 0x3c3 6,53 # weierstrass "Weierstrass p"
+lz 1853 0 0x3e0 6,95 # lozenge
+an 3333 0 0x3be 3,8 # arrowhorizex "horizontal arrow extension"
+pc 927 0 0xfa 6,32 # periodcentered
+mc 2037 0 0xe6 8,25 # mu
+t+- 1947 0 0xf1 6,1 # plusminus
+tmu 2027 0 0x3b4 8,39 # multiply
+tdi 1947 0 0x3b8 6,8 # divide "division sign"
+tno 2027 0 0x3d8 8,20 # logicalnot
diff --git a/font/devlbp/HI b/font/devlbp/HI
new file mode 100644
index 0000000..fc63a63
--- /dev/null
+++ b/font/devlbp/HI
@@ -0,0 +1,401 @@
+slant 18.49
+name HI
+lbpname Swiss-Oblique
+special
+spacewidth 927
+slant 0
+ligatures fi fl 0
+charset
+ha 1110 2 0x4c3 0,94 # asciicircum
+ti 1110 0 0x4c4 0,126 # asciitilde
+vS 2223 2 0x169 1,176 # Scaron
+vZ 2037 2 0x16e 1,206 # Zcaron
+vs 1667 2 0x173 1,177 # scaron
+vz 1667 2 0x174 1,207 # zcaron
+:Y 2223 2 0x16d 1,74 # Ydieresis
+tm 3333 2 0x170 4,41 # trademark
+aq 637 2 0x27 0,39 # quotesingle
+space 927 0 0x20 0,32
+! 927 2 0x21 0,33 # exclam
+" 1183 2 0x22 0,34 # quotedbl
+dq 1183 2 0x22 0,34 # quotedbl
+# 1853 2 0x23 0,35 # numbersign
+sh 1853 2 0x23 0,35 # "
+$ 1853 2 0x24 0,36 # dollar
+Do 1853 2 0x24 0,36 # "
+% 2963 2 0x25 0,37 # percent
+& 2223 2 0x26 0,38 # ampersand
+' 637 2 0x27 0,39 # quoteright
+cq 637 2 0x27 0,39 # quoteright
+( 1110 2 0x28 0,40 # parenleft
+) 1110 2 0x29 0,41 # parenright
+* 1297 2 0x2a 0,42 # asterisk
++ 1947 0 0x2b 0,43 # plus
+, 927 0 0x2c 0,44 # comma
+- 1947 0 0x2d 0,45 # hyphen
+hy 1947 0 0x2d 0,45 # "
+. 927 0 0x2e 0,46 # period
+/ 927 2 0x2f 0,47 # slash
+sl 927 2 0x2f 0,47 # "
+0 1853 2 0x30 0,48 # zero
+1 1853 2 0x31 0,49 # one
+2 1853 2 0x32 0,50 # two
+3 1853 2 0x33 0,51 # three
+4 1853 2 0x34 0,52 # four
+5 1853 2 0x35 0,53 # five
+6 1853 2 0x36 0,54 # six
+7 1853 2 0x37 0,55 # seven
+8 1853 2 0x38 0,56 # eight
+9 1853 2 0x39 0,57 # nine
+: 927 0 0x3a 0,58 # colon
+; 927 0 0x3b 0,59 # semicolon
+< 1947 0 0x3c 0,60 # less
+= 1947 0 0x3d 0,61 # equal
+> 1947 0 0x3e 0,62 # greater
+? 1853 2 0x3f 0,63 # question
+@ 3383 2 0x40 0,64 # at
+at 3383 2 0x40 0,64 # "
+A 2223 2 0x41 0,65 # A
+B 2223 2 0x42 0,66 # B
+C 2407 2 0x43 0,67 # C
+D 2407 2 0x44 0,68 # D
+E 2223 2 0x45 0,69 # E
+F 2037 2 0x46 0,70 # F
+G 2593 2 0x47 0,71 # G
+H 2407 2 0x48 0,72 # H
+I 927 2 0x49 0,73 # I
+J 1667 2 0x4a 0,74 # J
+K 2223 2 0x4b 0,75 # K
+L 1853 2 0x4c 0,76 # L
+M 2777 2 0x4d 0,77 # M
+N 2407 2 0x4e 0,78 # N
+O 2593 2 0x4f 0,79 # O
+P 2223 2 0x50 0,80 # P
+Q 2593 2 0x51 0,81 # Q
+R 2407 2 0x52 0,82 # R
+S 2223 2 0x53 0,83 # S
+T 2037 2 0x54 0,84 # T
+U 2407 2 0x55 0,85 # U
+V 2223 2 0x56 0,86 # V
+W 3147 2 0x57 0,87 # W
+X 2223 2 0x58 0,88 # X
+Y 2223 2 0x59 0,89 # Y
+Z 2037 2 0x5a 0,90 # Z
+[ 927 2 0x5b 0,91 # bracketleft
+lB 927 2 0x5b 0,91 # "
+\ 927 2 0x5c 0,92 # backslash
+rs 927 2 0x5c 0,92 # "
+] 927 2 0x5d 0,93 # bracketright
+rB 927 2 0x5d 0,93 # "
+a^ 1110 2 0x5e 0,94 # circumflex
+^ 1110 2 0x5e 0,94 # "
+_ 1853 0 0x5f 0,95 # underscore
+` 1110 2 0x60 0,96 # quoteleft
+oq 1110 2 0x60 0,96 # "
+a 1853 0 0x61 0,97 # a
+b 1853 2 0x62 0,98 # b
+c 1667 0 0x63 0,99 # c
+d 1853 2 0x64 0,100 # d
+e 1853 0 0x65 0,101 # e
+f 927 2 0x66 0,102 # f
+g 1853 1 0x67 0,103 # g
+h 1853 2 0x68 0,104 # h
+i 740 2 0x69 0,105 # i
+j 740 2 0x6a 0,106 # j
+k 1667 2 0x6b 0,107 # k
+l 740 2 0x6c 0,108 # l
+m 2777 0 0x6d 0,109 # m
+n 1853 0 0x6e 0,110 # n
+o 1853 0 0x6f 0,111 # o
+p 1853 1 0x70 0,112 # p
+q 1853 1 0x71 0,113 # q
+r 1110 0 0x72 0,114 # r
+s 1667 0 0x73 0,115 # s
+t 927 2 0x74 0,116 # t
+u 1853 0 0x75 0,117 # u
+v 1667 0 0x76 0,118 # v
+w 2407 0 0x77 0,119 # w
+x 1667 0 0x78 0,120 # x
+y 1667 1 0x79 0,121 # y
+z 1667 0 0x7a 0,122 # z
+lC 1113 2 0x7b 0,123 # braceleft
+{ 1113 2 0x7b 0,123 # "
+| 867 2 0x7c 0,124 # "
+rC 1113 2 0x7d 0,125 # braceright
+} 1113 2 0x7d 0,125 # "
+a~ 1110 2 0x7e 0,126 # tilde
+~ 1110 2 0x7e 0,126 # "
+-D 2407 2 0x13d 1,78 # Eth "Icelandic uppercase eth"
+Sd 1853 2 0x148 1,87 # eth "Icelandic lowercase eth"
+TP 2223 2 0x13e 1,88 # Thorn "Icelandic uppercase thorn"
+Tp 1853 3 0x143 1,89 # thorn "Icelandic lowercase thorn"
+AE 3333 2 0x92 1,36 # AE
+ae 2963 0 0x91 1,37 # ae
+OE 3333 2 0x141 1,166 # OE
+oe 3147 0 0x146 1,167 # oe
+ij 1437 0 0x150 1,139 # ij "Dutch ij ligature"
+ss 2037 2 0x147 1,23 # germandbls
+'A 2223 2 0x15a 1,26 # Aacute
+'E 2223 2 0x90 1,40 # Eacute
+'I 927 2 0x161 1,48 # Iacute
+'O 2593 2 0x165 1,58 # Oacute
+'U 2407 2 0x16a 1,66 # Uacute
+'a 1853 2 0xa0 1,27 # aacute
+'e 1853 2 0x82 1,41 # eacute
+'i 927 2 0xa1 1,49 # iacute
+'o 1853 2 0xa2 1,59 # oacute
+'u 1853 2 0x95 1,65 # uacute
+:A 2223 2 0x8e 1,30 # Adieresis
+:E 2223 2 0x15f 1,44 # Edieresis
+:I 927 2 0x163 1,52 # Idieresis
+:O 2593 2 0x99 1,62 # Odieresis
+:U 2407 2 0x9a 1,70 # Udieresis
+:Y 2223 2 0x16d 1,74 # Ydieresis
+:a 1853 2 0x84 1,31 # adieresis
+:e 1853 2 0x89 1,45 # edieresis
+:i 927 2 0x8b 1,53 # idieresis
+:o 1853 2 0x94 1,63 # odieresis
+:u 1853 2 0x81 1,71 # udieresis
+:y 1667 3 0x98 1,75 # ydieresis
+^A 2223 2 0x15b 1,28 # Acircumflex
+^E 2223 2 0x15e 1,42 # Ecircumflex
+^I 927 2 0x162 1,50 # Icircumflex
+^O 2593 2 0x166 1,60 # Ocircumflex
+^U 2407 2 0x16b 1,68 # Ucircumflex
+^a 1853 2 0x83 1,29 # acircumflex
+^e 1853 2 0x88 1,43 # ecircumflex
+^i 927 2 0x8c 1,51 # icircumflex
+^o 1853 2 0x93 1,61 # ocircumflex
+^u 1853 2 0x96 1,69 # ucircumflex
+`A 2223 2 0x15c 1,32 # Agrave
+`E 2223 2 0x160 1,46 # Egrave
+`I 927 2 0x164 1,54 # Igrave
+`O 2593 2 0x167 1,64 # Ograve
+`U 2407 2 0x16c 1,72 # Ugrave
+`a 1853 2 0x85 1,33 # agrave
+~a 1853 2 0x284 --- # atilde
+`e 1853 2 0x8a 1,47 # egrave
+`i 927 2 0x8d 1,55 # igrave
+`o 1853 2 0x95 1,65 # ograve
+`u 1853 2 0x97 1,73 # ugrave
+~A 2223 2 0x28e 1,26 # Atilde
+~N 2407 2 0xa5 1,56 # Ntilde
+~O 2593 2 0x168 1,82 # Otilde
+~n 1853 2 0xa4 1,57 # ntilde
+~o 1853 2 0x172 1,83 # otilde
+vS 2223 2 0x169 1,176 # Scaron
+vs 1667 2 0x173 1,177 # scaron
+vZ 2037 2 0x16e 1,206 # Zcaron
+vz 1667 2 0x174 1,207 # zcaron
+,C 2407 2 0x80 1,38 # Ccedilla
+,c 1667 0 0x87 1,39 # ccedilla
+/L 1853 2 0x13f 1,152 # Lslash "Polish L with a slash"
+/l 740 2 0x144 1,153 # lslash "Polish l with a slash"
+/O 2593 2 0x140 1,80 # Oslash
+/o 2037 0 0x145 1,81 # oslash
+oA 2223 2 0x8f 1,34 # Aring
+oa 1853 2 0x86 1,35 # aring
+a" 1110 2 0x13a 1,16 # hungarumlaut "Hungarian umlaut"
+a- 1110 2 0x135 1,8 # macron "macron or bar accent"
+a. 1110 2 0x137 1,15 # dotaccent "dot accent"
+a^ 1110 2 0x5e 1,3 # circumflex "circumflex accent"
+aa 1110 2 0x120 1,6 # acute "acute accent"
+ga 1110 2 0x121 1,0 # grave "grave accent"
+ab 1110 2 0x136 1,22 # breve "breve accent"
+ac 1110 0 0x139 1,17 # cedilla "cedilla accent"
+ad 1110 2 0x122 1,7 # dieresis "umlaut or dieresis"
+ah 1110 2 0x13c 1,19 # caron "h\('a\(vcek accent"
+ao 1110 2 0x138 1,14 # ring "ring or circle accent"
+a~ 1110 2 0x7e 1,2 # tilde "tilde accent"
+ho 1110 0 0x13b 1,18 # ogonek "hook or ogonek accent"
+.i 927 0 0x142 1,239 # dotlessi "i without a dot"
+Cs 1853 2 0x12f 4,24 # currency "Scandinavian currency sign"
+Do 1853 2 0x24 0,36 # dollar
+Po 1853 2 0x9c 4,11 # sterling
+Ye 1853 2 0x9d 4,12 # yen
+Fn 1853 2 0x9f 4,14 # florin
+ct 1853 2 0x9b 4,19 # cent
+Fo 1853 0 0xae 4,9 # guillemotleft
+Fc 1110 0 0x4bb 4,20 # guillemotright
+fo 1110 0 0x127 4,35 # guilsinglleft
+fc 1110 0 0x128 4,36 # guilsinglright
+r! 1110 1 0xad 4,7 # exclamdown
+r? 2037 1 0xa8 4,8 # questiondown
+fi 1667 2 0x130 4,54 # fi "fi ligature"
+fl 1667 2 0x131 4,55 # fl "fl ligature"
+OK 1667 0 0x3d6 --- # \& "check mark, tick"
+Of 1233 2 0xa6 4,15 # ordfeminine
+Om 1217 2 0xa7 4,16 # ordmasculine
+S1 1110 2 0x156 4,78 # onesuperior
+S2 1110 2 0xfd 4,20 # twosuperior
+S3 1110 2 0x14d 4,26 # threesuperior
+<- 3290 0 0x1b 6,22 # arrowleft
+-> 3290 0 0x1a 6,21 # arrowright
+<> 3473 0 0x1d 6,25 # arrowboth "horizontal double-headed arrow"
+da 2010 0 0x19 6,24 # arrowdown
+ua 2010 0 0x18 6,23 # arrowup
+va 2010 0 0x12 6,26 # \& "vertical double-headed arrow"
+lA 2010 0 0x3dc 6,57 # arrowdblleft
+rA 2010 0 0x3de 6,56 # arrowdblright
+hA 2010 0 0x3db 6,60 # arrowdblboth "horizontal double-headed double arrow"
+dA 2010 0 0x3df 6,59 # arrowdbldown
+uA 2010 0 0x3dd 6,58 # arrowdblup
+ba 3333 2 0xb3 3,9 # bar
+bb 867 2 0x7c 0,124 # brokenbar
+br 3333 0 0x1db 3,9 # br "box rule with traditional troff metrics"
+ru 3333 0 0x123 4,34 # ru "baseline rule"
+ul 1853 0 0x5f 0,95 # ul "underline with traditional troff metrics"
+bv 3333 0 0x3f4 3,9 # bv "bold vertical"
+ci 2843 0 0x9 4,1 # circle
+bu 2120 0 0x7 4,0 # bullet
+co 2457 2 0x154 4,23 # copyright
+rg 2457 2 0x155 4,22 # registered
+tm 3333 2 0x170 4,41 # trademark
+dd 1853 2 0x12b 4,40 # daggerdbl "double dagger sign"
+dg 1853 2 0x12a 4,39 # dagger
+ps 1790 2 0x14 4,5 # paragraph
+sc 1853 2 0x15 4,6 # section
+de 1333 2 0xf8 6,36 # degree
+em 3333 0 0x123 4,34 # emdash "em dash"
+en 1853 0 0x132 4,33 # endash "en dash"
+%0 3333 2 0x129 4,75 # perthousand "per thousand, per mille sign"
+12 2780 2 0xab 4,17 # onehalf
+14 2780 2 0xac 4,18 # onequarter
+34 2780 2 0x12e 4,25 # threequarters
+f/ 557 2 0x158 6,6 # fraction "bar for fractions"
+fm 557 0 0x3a2 6,45 # minute "footmark, prime"
+sd 557 0 0x3b2 6,46 # second
+ha 557 2 0x4c3 6,85 # asciicircum "\s-2ASCII\s+2 circumflex, hat, caret"
+ti 557 0 0x4c4 6,12 # asciitilde "\s-2ASCII\s0 tilde, large tilde"
+hy 1947 0 0x2d 6,0 # hyphen
+lB 927 2 0x5b 0,91 # bracketleft
+rB 927 2 0x5d 0,93 # bracketright
+lC 1113 2 0x7b 0,123 # braceleft
+rC 1113 2 0x7d 0,125 # braceright
+la 1113 0 0x3e1 6,10 # angleleft "left angle bracket"
+ra 1113 0 0x3f1 6,11 # angleright "right angle bracket"
+Bq 1110 0 0x4b9 4,63 # quotedblbase "low double comma quote"
+bq 1110 0 0x4b8 6,62 # quotesinglbase "low single comma quote"
+lq 1110 2 0x125 4,32 # quotedblleft
+rq 1110 2 0x4ba 6,31 # quotedblright
+oq 740 2 0x176 4,29 # quoteleft "single open quote"
+aq 637 2 0x27 0,39 # quotesingle "apostrophe quote"
+at 3383 2 0x40 0,64 # at
+.C1 1947 0 0x2d 0,45 # - minus "minus sign from current font"
+sh 1853 2 0x23 0,35 # numbersign
+sl 927 2 0x2f 0,47 # slash
+rs 927 2 0x5c 0,92 # backslash
+3d 927 0 0x35c 6,102 # therefore
+tf 927 0 0x35c 6,102 # therefore
+*A 927 0 0x341 8,0 # Alpha
+*B 927 0 0x342 8,2 # Beta
+*C 927 0 0x358 8,28 # Xi
+*D 927 0 0x344 8,8 # Delta
+*E 927 0 0x345 8,10 # Epsilon
+*F 2377 0 0x346 8,44 # Phi
+*G 1907 0 0x347 8,6 # Gamma
+*H 1907 0 0x351 8,16 # Theta
+*I 1907 0 0x349 8,18 # Iota
+*K 1907 0 0x34b 8,20 # Kappa
+*L 1907 0 0x34c 8,22 # Lambda
+*M 1907 0 0x34d 8,24 # Mu
+*N 1907 0 0x34e 8,26 # Nu
+*O 1907 0 0x34f 8,30 # Omicron
+*P 1907 0 0x350 8,32 # Pi
+*Q 1907 0 0x359 8,48 # Psi
+*R 1907 0 0x352 8,34 # Rho
+*S 1973 0 0x353 8,36 # Sigma
+*T 1973 0 0x354 8,40 # Tau
+*U 1973 0 0x3a1 8,76 # Upsilon
+*W 2547 0 0x357 8,50 # Omega
+*X 1973 0 0x343 8,36 # Chi
+*Y 1973 0 0x348 8,14 # Eta
+*Z 1973 0 0x35a 8,12 # Zeta
+*a 2023 0 0xe0 8,1 # alpha
+*b 1893 0 0xe1 8,3 # beta
+*c 1893 0 0x378 8,29 # xi
+*d 1890 0 0xeb 8,9 # delta
+*e 1890 0 0x36e 8,70 # epsilon
+*f 1890 0 0x366 8,45 # phi
++f 1890 0 0x36a 8,77 # phi1 "variant phi"
+*g 1890 0 0x367 8,7 # gamma
+*h 1853 0 0xe9 8,17 # theta
++h 1853 0 0x375 8,71 # theta1 "variant theta"
+*i 1853 0 0x369 8,19 # iota
+*k 1853 0 0x36b 8,21 # kappa
+*l 1853 0 0x36c 8,23 # lambda
+*m 1853 0 0xe6 8,25 # mu
+*n 1853 0 0x36e 8,27 # nu
+*o 1853 0 0x36f 8,31 # omicron
+*p 1963 0 0xe3 8,33 # pi
++p 1963 0 0x376 8,78 # omega1 "variant pi, looking like omega"
+*q 1963 0 0x379 8,49 # psi
+*r 1963 0 0x372 8,35 # rho
+*s 2037 0 0xe5 8,37 # sigma
+*t 1463 0 0xe7 8,41 # tau
+*u 1463 0 0x375 8,27 # upsilon
+*w 1463 0 0x377 8,51 # omega
+*x 1463 0 0x363 8,47 # chi
+*y 1463 0 0x368 8,15 # eta
+*z 1463 0 0x37a 8,13 # zeta
+ts 1463 0 0x356 8,39 # sigma1 "terminal sigma"
+~~ 2663 0 0xf7 6,13 # approxequal
+~= 2663 0 0xf7 6,13 # approxequal
+!= 2663 0 0x3b9 6,99 # notequal
+** 927 0 0x32a 0,32 # asteriskmath
++- 1947 0 0xf1 6,1 # plusminus
+<= 2413 0 0xf3 6,2 # lessequal
+== 2413 0 0x3ba 8,14 # equivalence
+=~ 2413 0 0x340 8,116 # congruent
+>= 1893 0 0x3b3 8,3 # greaterequal
+AN 1893 0 0x3d9 8,85 # logicaland
+OR 1893 0 0x3da 8,86 # logicalor
+no 1893 0 0x3d8 8,20 # logicalnot
+te 1893 0 0x324 8,121 # existential "there exists, existential quantifier"
+fa 1893 0 0x322 8,122 # universal "for all, universal quantifier"
+Ah 1893 0 0x3c0 9,0 # aleph
+Im 1893 0 0x3c1 8,21 # Ifraktur "Fraktur I, imaginary"
+Re 1893 0 0x3c2 8,22 # Rfraktur "Fraktur R, real"
+if 1893 0 0x3a5 8,19 # infinity
+md 1893 0 0x3b7 8,32 # dotmath
+mo 1893 0 0x3ce 8,15 # element
+mu 1893 0 0x3b4 8,39 # multiply
+nc 1893 0 0x3cb 8,197 # uni2285
+nm 1893 0 0x3cf 8,209 # notelement
+pl 927 0 0x32b 0,93 # plusmath "plus sign in special font"
+eq 1947 0 0x33d 0,61 # equalmath "equals sign in special font"
+pt 1947 0 0x3b5 6,4 # proportional
+pp 1947 0 0x35e 8,89 # perpendicular
+sb 1947 0 0x3cc 6,67 # propersubset
+sp 1947 0 0x3c9 6,68 # propersuperset
+ib 1947 0 0x3cd 6,69 # reflexsubset
+ip 1947 0 0x3ca 6,70 # reflexsuperset
+ap 1947 0 0x37e 6,12 # similar
+pd 1947 0 0x3b6 6,34 # partialdiff "partial differentiation sign"
+c* 1947 0 0x3c4 6,80 # circlemultiply "multiply sign in a circle"
+c+ 1947 0 0x3c5 6,81 # circleplus "plus sign in a circle"
+ca 2620 0 0xef 6,16 # intersection "intersection, cap"
+cu 2620 0 0x3c8 6,66 # union "union, cup"
+di 1947 0 0x3b8 6,8 # divide "division sign"
+-h 3333 0 0xc4 3,8 # hbar
+hbar "
+gr 3333 0 0x3d1 6,33 # gradient
+es 2593 0 0x3c6 0,79 # emptyset
+CL 2510 0 0x5 5,168 # club "club suit"
+SP 2510 0 0x6 5,171 # spade "spade suit"
+HE 2510 0 0x3 5,170 # heart "heart suit"
+DI 2510 0 0x4 5,169 # diamond "diamond suit"
+CR 2510 0 0x3bf 5,20 # carriagereturn "carriage return symbol"
+st 2510 0 0x327 6,71 # suchthat
+/_ 2510 0 0x3d0 6,79 # angle
+<< 1853 0 0xae 6,77 # "" "much less"
+>> 1853 0 0xaf 6,78 # "" "much greater"
+wp 1853 0 0x3c3 6,53 # weierstrass "Weierstrass p"
+lz 1853 0 0x3e0 6,95 # lozenge
+an 3333 0 0x3be 3,8 # arrowhorizex "horizontal arrow extension"
+pc 927 0 0xfa 6,32 # periodcentered
+mc 1853 0 0xe6 8,25 # mu
+t+- 1947 0 0xf1 6,1 # plusminus
+tmu 1893 0 0x3b4 8,39 # multiply
+tdi 1947 0 0x3b8 6,8 # divide "division sign"
+tno 1893 0 0x3d8 8,20 # logicalnot
diff --git a/font/devlbp/HNB b/font/devlbp/HNB
new file mode 100644
index 0000000..23475b5
--- /dev/null
+++ b/font/devlbp/HNB
@@ -0,0 +1,400 @@
+name HNB
+lbpname Swiss-Narrow-Bold
+special
+spacewidth 228
+slant 0
+ligatures fi fl 0
+charset
+ha 280 2 0x4c3 0,94 # asciicircum
+ti 280 0 0x4c4 0,126 # asciitilde
+vS 280 2 0x169 1,176 # Scaron
+vZ 280 2 0x16e 1,206 # Zcaron
+vs 280 2 0x173 1,177 # scaron
+vz 280 2 0x174 1,207 # zcaron
+:Y 280 2 0x16d 1,74 # Ydieresis
+tm 280 2 0x170 4,41 # trademark
+aq 195 2 0x27 0,39 # quotesingle
+space 228 0 0x20 0,32
+! 273 2 0x21 0,33 # exclam
+" 389 2 0x22 0,34 # quotedbl
+dq 389 2 0x22 0,34 # quotedbl
+# 456 2 0x23 0,35 # numbersign
+sh 456 2 0x23 0,35 # "
+$ 456 2 0x24 0,36 # dollar
+Do 456 2 0x24 0,36 # "
+% 720 2 0x25 0,37 # percent
+& 592 2 0x26 0,38 # ampersand
+' 195 2 0x27 0,39 # quoteright
+cq 195 2 0x27 0,39 # quoteright
+( 273 2 0x28 0,40 # parenleft
+) 273 2 0x29 0,41 # parenright
+* 319 2 0x2a 0,42 # asterisk
++ 479 0 0x2b 0,43 # plus
+, 228 0 0x2c 0,44 # comma
+- 479 0 0x2d 0,45 # hyphen
+hy 479 0 0x2d 0,45 # "
+. 228 0 0x2e 0,46 # period
+/ 228 2 0x2f 0,47 # slash
+sl 228 2 0x2f 0,47 # "
+0 456 2 0x30 0,48 # zero
+1 456 2 0x31 0,49 # one
+2 456 2 0x32 0,50 # two
+3 456 2 0x33 0,51 # three
+4 456 2 0x34 0,52 # four
+5 456 2 0x35 0,53 # five
+6 456 2 0x36 0,54 # six
+7 456 2 0x37 0,55 # seven
+8 456 2 0x38 0,56 # eight
+9 456 2 0x39 0,57 # nine
+: 273 0 0x3a 0,58 # colon
+; 273 0 0x3b 0,59 # semicolon
+< 479 0 0x3c 0,60 # less
+= 479 0 0x3d 0,61 # equal
+> 479 0 0x3e 0,62 # greater
+? 501 2 0x3f 0,63 # question
+@ 800 2 0x40 0,64 # at
+at 800 2 0x40 0,64 # "
+A 592 2 0x41 0,65 # A
+B 592 2 0x42 0,66 # B
+C 592 2 0x43 0,67 # C
+D 592 2 0x44 0,68 # D
+E 547 2 0x45 0,69 # E
+F 501 2 0x46 0,70 # F
+G 638 2 0x47 0,71 # G
+H 592 2 0x48 0,72 # H
+I 228 2 0x49 0,73 # I
+J 456 2 0x4a 0,74 # J
+K 592 2 0x4b 0,75 # K
+L 501 2 0x4c 0,76 # L
+M 683 2 0x4d 0,77 # M
+N 592 2 0x4e 0,78 # N
+O 638 2 0x4f 0,79 # O
+P 547 2 0x50 0,80 # P
+Q 638 2 0x51 0,81 # Q
+R 592 2 0x52 0,82 # R
+S 547 2 0x53 0,83 # S
+T 501 2 0x54 0,84 # T
+U 592 2 0x55 0,85 # U
+V 547 2 0x56 0,86 # V
+W 774 2 0x57 0,87 # W
+X 547 2 0x58 0,88 # X
+Y 547 2 0x59 0,89 # Y
+Z 501 2 0x5a 0,90 # Z
+[ 273 2 0x5b 0,91 # bracketleft
+lB 273 2 0x5b 0,91 # "
+\ 228 2 0x5c 0,92 # backslash
+rs 228 2 0x5c 0,92 # "
+] 273 2 0x5d 0,93 # bracketright
+rB 273 2 0x5d 0,93 # "
+a^ 280 2 0x5e 0,94 # circumflex
+^ 280 2 0x5e 0,94 # "
+_ 456 0 0x5f 0,95 # underscore
+` 280 2 0x60 0,96 # quoteleft
+oq 280 2 0x60 0,96 # "
+a 456 0 0x61 0,97 # a
+b 501 2 0x62 0,98 # b
+c 456 0 0x63 0,99 # c
+d 501 2 0x64 0,100 # d
+e 456 0 0x65 0,101 # e
+f 273 2 0x66 0,102 # f
+g 501 1 0x67 0,103 # g
+h 501 2 0x68 0,104 # h
+i 228 2 0x69 0,105 # i
+j 228 2 0x6a 0,106 # j
+k 456 2 0x6b 0,107 # k
+l 228 2 0x6c 0,108 # l
+m 729 0 0x6d 0,109 # m
+n 501 0 0x6e 0,110 # n
+o 501 0 0x6f 0,111 # o
+p 501 1 0x70 0,112 # p
+q 501 1 0x71 0,113 # q
+r 319 0 0x72 0,114 # r
+s 456 0 0x73 0,115 # s
+t 273 2 0x74 0,116 # t
+u 501 0 0x75 0,117 # u
+v 456 0 0x76 0,118 # v
+w 638 0 0x77 0,119 # w
+x 456 0 0x78 0,120 # x
+y 456 1 0x79 0,121 # y
+z 410 0 0x7a 0,122 # z
+lC 319 2 0x7b 0,123 # braceleft
+{ 319 2 0x7b 0,123 # "
+| 230 2 0x7c 0,124 # "
+rC 319 2 0x7d 0,125 # braceright
+} 319 2 0x7d 0,125 # "
+a~ 280 2 0x7e 0,126 # tilde
+~ 280 2 0x7e 0,126 # "
+-D 592 2 0x13d 1,78 # Eth "Icelandic uppercase eth"
+Sd 501 2 0x148 1,87 # eth "Icelandic lowercase eth"
+TP 547 2 0x13e 1,88 # Thorn "Icelandic uppercase thorn"
+Tp 501 3 0x143 1,89 # thorn "Icelandic lowercase thorn"
+AE 820 2 0x92 1,36 # AE
+ae 729 0 0x91 1,37 # ae
+OE 820 2 0x141 1,166 # OE
+oe 774 0 0x146 1,167 # oe
+ij 450 0 0x150 1,139 # ij "Dutch ij ligature"
+ss 501 2 0x147 1,23 # germandbls
+'A 501 2 0x15a 1,26 # Aacute
+'E 547 2 0x90 1,40 # Eacute
+'I 547 2 0x161 1,48 # Iacute
+'O 547 2 0x165 1,58 # Oacute
+'U 547 2 0x16a 1,66 # Uacute
+'a 456 2 0xa0 1,27 # aacute
+'e 456 2 0x82 1,41 # eacute
+'i 228 2 0xa1 1,49 # iacute
+'o 501 2 0xa2 1,59 # oacute
+'u 501 2 0x95 1,65 # uacute
+:A 592 2 0x8e 1,30 # Adieresis
+:E 592 2 0x15f 1,44 # Edieresis
+:I 592 2 0x163 1,52 # Idieresis
+:O 638 2 0x99 1,62 # Odieresis
+:U 592 2 0x9a 1,70 # Udieresis
+:Y 592 2 0x16d 1,74 # Ydieresis
+:a 456 2 0x84 1,31 # adieresis
+:e 456 2 0x89 1,45 # edieresis
+:i 228 2 0x8b 1,53 # idieresis
+:o 501 2 0x94 1,63 # odieresis
+:u 501 2 0x81 1,71 # udieresis
+:y 456 3 0x98 1,75 # ydieresis
+^A 456 2 0x15b 1,28 # Acircumflex
+^E 456 2 0x15e 1,42 # Ecircumflex
+^I 456 2 0x162 1,50 # Icircumflex
+^O 456 2 0x166 1,60 # Ocircumflex
+^U 456 2 0x16b 1,68 # Ucircumflex
+^a 456 2 0x83 1,29 # acircumflex
+^e 456 2 0x88 1,43 # ecircumflex
+^i 228 2 0x8c 1,51 # icircumflex
+^o 501 2 0x93 1,61 # ocircumflex
+^u 501 2 0x96 1,69 # ucircumflex
+`A 501 2 0x15c 1,32 # Agrave
+`E 501 2 0x160 1,46 # Egrave
+`I 501 2 0x164 1,54 # Igrave
+`O 501 2 0x167 1,64 # Ograve
+`U 501 2 0x16c 1,72 # Ugrave
+`a 456 2 0x85 1,33 # agrave
+~a 456 2 0x284 --- # atilde
+`e 456 2 0x8a 1,47 # egrave
+`i 228 2 0x8d 1,55 # igrave
+`o 501 2 0x95 1,65 # ograve
+`u 501 2 0x97 1,73 # ugrave
+~A 501 2 0x28e 1,26 # Atilde
+~N 592 2 0xa5 1,56 # Ntilde
+~O 592 2 0x168 1,82 # Otilde
+~n 501 2 0xa4 1,57 # ntilde
+~o 501 2 0x172 1,83 # otilde
+vS 501 2 0x169 1,176 # Scaron
+vs 501 2 0x173 1,177 # scaron
+vZ 501 2 0x16e 1,206 # Zcaron
+vz 501 2 0x174 1,207 # zcaron
+,C 592 2 0x80 1,38 # Ccedilla
+,c 456 0 0x87 1,39 # ccedilla
+/L 501 2 0x13f 1,152 # Lslash "Polish L with a slash"
+/l 228 2 0x144 1,153 # lslash "Polish l with a slash"
+/O 638 2 0x140 1,80 # Oslash
+/o 501 0 0x145 1,81 # oslash
+oA 592 2 0x8f 1,34 # Aring
+oa 456 2 0x86 1,35 # aring
+a" 273 2 0x13a 1,16 # hungarumlaut "Hungarian umlaut"
+a- 273 2 0x135 1,8 # macron "macron or bar accent"
+a. 273 2 0x137 1,15 # dotaccent "dot accent"
+a^ 273 2 0x5e 1,3 # circumflex "circumflex accent"
+aa 273 2 0x120 1,6 # acute "acute accent"
+ga 273 2 0x121 1,0 # grave "grave accent"
+ab 273 2 0x136 1,22 # breve "breve accent"
+ac 273 0 0x139 1,17 # cedilla "cedilla accent"
+ad 273 2 0x122 1,7 # dieresis "umlaut or dieresis"
+ah 273 2 0x13c 1,19 # caron "h\('a\(vcek accent"
+ao 273 2 0x138 1,14 # ring "ring or circle accent"
+a~ 273 2 0x7e 1,2 # tilde "tilde accent"
+ho 273 0 0x13b 1,18 # ogonek "hook or ogonek accent"
+.i 228 0 0x142 1,239 # dotlessi "i without a dot"
+Cs 456 2 0x12f 4,24 # currency "Scandinavian currency sign"
+Do 456 2 0x24 0,36 # dollar
+Po 456 2 0x9c 4,11 # sterling
+Ye 456 2 0x9d 4,12 # yen
+Fn 456 2 0x9f 4,14 # florin
+ct 456 2 0x9b 4,19 # cent
+Fo 456 0 0xae 4,9 # guillemotleft
+Fc 273 0 0x4bb 4,20 # guillemotright
+fo 273 0 0x127 4,35 # guilsinglleft
+fc 273 0 0x128 4,36 # guilsinglright
+r! 273 1 0xad 4,7 # exclamdown
+r? 501 1 0xa8 4,8 # questiondown
+fi 501 2 0x130 4,54 # fi "fi ligature"
+fl 501 2 0x131 4,55 # fl "fl ligature"
+OK 501 0 0x3d6 --- # \& "check mark, tick"
+Of 303 2 0xa6 4,15 # ordfeminine
+Om 299 2 0xa7 4,16 # ordmasculine
+S1 273 2 0x156 4,78 # onesuperior
+S2 273 2 0xfd 4,20 # twosuperior
+S3 273 2 0x14d 4,26 # threesuperior
+<- 809 0 0x1b 6,22 # arrowleft
+-> 809 0 0x1a 6,21 # arrowright
+<> 854 0 0x1d 6,25 # arrowboth "horizontal double-headed arrow"
+da 494 0 0x19 6,24 # arrowdown
+ua 494 0 0x18 6,23 # arrowup
+va 494 0 0x12 6,26 # \& "vertical double-headed arrow"
+lA 494 0 0x3dc 6,57 # arrowdblleft
+rA 494 0 0x3de 6,56 # arrowdblright
+hA 494 0 0x3db 6,60 # arrowdblboth "horizontal double-headed double arrow"
+dA 494 0 0x3df 6,59 # arrowdbldown
+uA 494 0 0x3dd 6,58 # arrowdblup
+ba 820 2 0xb3 3,9 # bar
+bb 230 2 0x7c 0,124 # brokenbar
+br 820 0 0x1db 3,9 # br "box rule with traditional troff metrics"
+ru 820 0 0x123 4,34 # ru "baseline rule"
+ul 456 0 0x5f 0,95 # ul "underline with traditional troff metrics"
+bv 820 0 0x3f4 3,9 # bv "bold vertical"
+ci 699 0 0x9 4,1 # circle
+bu 522 0 0x7 4,0 # bullet
+co 604 2 0x154 4,23 # copyright
+rg 604 2 0x155 4,22 # registered
+tm 604 2 0x170 4,41 # trademark
+dd 456 2 0x12b 4,40 # daggerdbl "double dagger sign"
+dg 456 2 0x12a 4,39 # dagger
+ps 456 2 0x14 4,5 # paragraph
+sc 456 2 0x15 4,6 # section
+de 328 2 0xf8 6,36 # degree
+em 820 0 0x123 4,34 # emdash "em dash"
+en 456 0 0x132 4,33 # endash "en dash"
+%0 820 2 0x129 4,75 # perthousand "per thousand, per mille sign"
+12 684 2 0xab 4,17 # onehalf
+14 684 2 0xac 4,18 # onequarter
+34 684 2 0x12e 4,25 # threequarters
+f/ 137 2 0x158 6,6 # fraction "bar for fractions"
+fm 137 0 0x3a2 6,45 # minute "footmark, prime"
+sd 137 0 0x3b2 6,46 # second
+ha 137 2 0x4c3 6,85 # asciicircum "\s-2ASCII\s+2 circumflex, hat, caret"
+ti 137 0 0x4c4 6,12 # asciitilde "\s-2ASCII\s0 tilde, large tilde"
+hy 500 0 0x2d 6,0 # hyphen
+lB 273 2 0x5b 0,91 # bracketleft
+rB 273 2 0x5d 0,93 # bracketright
+lC 319 2 0x7b 0,123 # braceleft
+rC 319 2 0x7d 0,125 # braceright
+la 319 0 0x3e1 6,10 # angleleft "left angle bracket"
+ra 319 0 0x3f1 6,11 # angleright "right angle bracket"
+Bq 410 0 0x4b9 4,63 # quotedblbase "low double comma quote"
+bq 410 0 0x4b8 6,62 # quotesinglbase "low single comma quote"
+lq 410 2 0x125 4,32 # quotedblleft
+rq 410 2 0x4ba 6,31 # quotedblright
+oq 228 2 0x176 4,29 # quoteleft "single open quote"
+aq 195 2 0x27 0,39 # quotesingle "apostrophe quote"
+at 800 2 0x40 0,64 # at
+.C1 479 0 0x2d 0,45 # - minus "minus sign from current font"
+sh 456 2 0x23 0,35 # numbersign
+sl 228 2 0x2f 0,47 # slash
+rs 228 2 0x5c 0,92 # backslash
+3d 228 0 0x35c 6,102 # therefore
+tf 228 0 0x35c 6,102 # therefore
+*A 228 0 0x341 8,0 # Alpha
+*B 228 0 0x342 8,2 # Beta
+*C 228 0 0x358 8,28 # Xi
+*D 228 0 0x344 8,8 # Delta
+*E 228 0 0x345 8,10 # Epsilon
+*F 609 0 0x346 8,44 # Phi
+*G 481 0 0x347 8,6 # Gamma
+*H 481 0 0x351 8,16 # Theta
+*I 481 0 0x349 8,18 # Iota
+*K 481 0 0x34b 8,20 # Kappa
+*L 481 0 0x34c 8,22 # Lambda
+*M 481 0 0x34d 8,24 # Mu
+*N 481 0 0x34e 8,26 # Nu
+*O 481 0 0x34f 8,30 # Omicron
+*P 481 0 0x350 8,32 # Pi
+*Q 481 0 0x359 8,48 # Psi
+*R 481 0 0x352 8,34 # Rho
+*S 481 0 0x353 8,36 # Sigma
+*T 481 0 0x354 8,40 # Tau
+*U 481 0 0x3a1 8,76 # Upsilon
+*W 630 0 0x357 8,50 # Omega
+*X 481 0 0x343 8,36 # Chi
+*Y 481 0 0x348 8,14 # Eta
+*Z 481 0 0x35a 8,12 # Zeta
+*a 499 0 0xe0 8,1 # alpha
+*b 499 0 0xe1 8,3 # beta
+*c 499 0 0x378 8,29 # xi
+*d 487 0 0xeb 8,9 # delta
+*e 487 0 0x36e 8,70 # epsilon
+*f 487 0 0x366 8,45 # phi
++f 487 0 0x36a 8,77 # phi1 "variant phi"
+*g 487 0 0x367 8,7 # gamma
+*h 486 0 0xe9 8,17 # theta
++h 486 0 0x375 8,71 # theta1 "variant theta"
+*i 486 0 0x369 8,19 # iota
+*k 486 0 0x36b 8,21 # kappa
+*l 486 0 0x36c 8,23 # lambda
+*m 501 0 0xe6 8,25 # mu
+*n 501 0 0x36e 8,27 # nu
+*o 501 0 0x36f 8,31 # omicron
+*p 527 0 0xe3 8,33 # pi
++p 527 0 0x376 8,78 # omega1 "variant pi, looking like omega"
+*q 527 0 0x379 8,49 # psi
+*r 527 0 0x372 8,35 # rho
+*s 531 0 0xe5 8,37 # sigma
+*t 375 0 0xe7 8,41 # tau
+*u 375 0 0x375 8,27 # upsilon
+*w 375 0 0x377 8,51 # omega
+*x 375 0 0x363 8,47 # chi
+*y 375 0 0x368 8,15 # eta
+*z 375 0 0x37a 8,13 # zeta
+ts 375 0 0x356 8,39 # sigma1 "terminal sigma"
+~~ 655 0 0xf7 6,13 # approxequal
+~= 655 0 0xf7 6,13 # approxequal
+!= 655 0 0x3b9 6,99 # notequal
+** 228 0 0x32a 0,32 # asteriskmath
++- 479 0 0xf1 6,1 # plusminus
+<= 592 0 0xf3 6,2 # lessequal
+== 592 0 0x3ba 8,14 # equivalence
+=~ 592 0 0x340 8,116 # congruent
+>= 499 0 0x3b3 8,3 # greaterequal
+AN 499 0 0x3d9 8,85 # logicaland
+OR 499 0 0x3da 8,86 # logicalor
+no 499 0 0x3d8 8,20 # logicalnot
+te 499 0 0x324 8,121 # existential "there exists, existential quantifier"
+fa 499 0 0x322 8,122 # universal "for all, universal quantifier"
+Ah 499 0 0x3c0 9,0 # aleph
+Im 499 0 0x3c1 8,21 # Ifraktur "Fraktur I, imaginary"
+Re 499 0 0x3c2 8,22 # Rfraktur "Fraktur R, real"
+if 499 0 0x3a5 8,19 # infinity
+md 499 0 0x3b7 8,32 # dotmath
+mo 499 0 0x3ce 8,15 # element
+mu 499 0 0x3b4 8,39 # multiply
+nc 499 0 0x3cb 8,197 # uni2285
+nm 499 0 0x3cf 8,209 # notelement
+pl 273 0 0x32b 0,93 # plusmath "plus sign in special font"
+eq 479 0 0x33d 0,61 # equalmath "equals sign in special font"
+pt 479 0 0x3b5 6,4 # proportional
+pp 479 0 0x35e 8,89 # perpendicular
+sb 479 0 0x3cc 6,67 # propersubset
+sp 479 0 0x3c9 6,68 # propersuperset
+ib 479 0 0x3cd 6,69 # reflexsubset
+ip 479 0 0x3ca 6,70 # reflexsuperset
+ap 479 0 0x37e 6,12 # similar
+pd 479 0 0x3b6 6,34 # partialdiff "partial differentiation sign"
+c* 479 0 0x3c4 6,80 # circlemultiply "multiply sign in a circle"
+c+ 479 0 0x3c5 6,81 # circleplus "plus sign in a circle"
+ca 645 0 0xef 6,16 # intersection "intersection, cap"
+cu 645 0 0x3c8 6,66 # union "union, cup"
+di 479 0 0x3b8 6,8 # divide "division sign"
+-h 820 0 0xc4 3,8 # hbar
+hbar "
+gr 820 0 0x3d1 6,33 # gradient
+es 638 0 0x3c6 0,79 # emptyset
+CL 617 0 0x5 5,168 # club "club suit"
+SP 617 0 0x6 5,171 # spade "spade suit"
+HE 617 0 0x3 5,170 # heart "heart suit"
+DI 617 0 0x4 5,169 # diamond "diamond suit"
+CR 617 0 0x3bf 5,20 # carriagereturn "carriage return symbol"
+st 617 0 0x327 6,71 # suchthat
+/_ 617 0 0x3d0 6,79 # angle
+<< 456 0 0xae 6,77 # "" "much less"
+>> 456 0 0xaf 6,78 # "" "much greater"
+wp 456 0 0x3c3 6,53 # weierstrass "Weierstrass p"
+lz 456 0 0x3e0 6,95 # lozenge
+an 820 0 0x3be 3,8 # arrowhorizex "horizontal arrow extension"
+pc 240 0 0xfa 6,32 # periodcentered
+mc 501 0 0xe6 8,25 # mu
+t+- 479 0 0xf1 6,1 # plusminus
+tmu 499 0 0x3b4 8,39 # multiply
+tdi 479 0 0x3b8 6,8 # divide "division sign"
+tno 499 0 0x3d8 8,20 # logicalnot
diff --git a/font/devlbp/HNBI b/font/devlbp/HNBI
new file mode 100644
index 0000000..119aa6e
--- /dev/null
+++ b/font/devlbp/HNBI
@@ -0,0 +1,400 @@
+name HNBI
+lbpname Swiss-Narrow-BoldOblique
+special
+spacewidth 228
+slant 0
+ligatures fi fl 0
+charset
+ha 280 2 0x4c3 0,94 # asciicircum
+ti 280 0 0x4c4 0,126 # asciitilde
+vS 280 2 0x169 1,176 # Scaron
+vZ 280 2 0x16e 1,206 # Zcaron
+vs 280 2 0x173 1,177 # scaron
+vz 280 2 0x174 1,207 # zcaron
+:Y 280 2 0x16d 1,74 # Ydieresis
+tm 280 2 0x170 4,41 # trademark
+aq 195 2 0x27 0,39 # quotesingle
+space 228 0 0x20 0,32
+! 273 2 0x21 0,33 # exclam
+" 389 2 0x22 0,34 # quotedbl
+dq 389 2 0x22 0,34 # quotedbl
+# 456 2 0x23 0,35 # numbersign
+sh 456 2 0x23 0,35 # "
+$ 456 2 0x24 0,36 # dollar
+Do 456 2 0x24 0,36 # "
+% 720 2 0x25 0,37 # percent
+& 592 2 0x26 0,38 # ampersand
+' 195 2 0x27 0,39 # quoteright
+cq 195 2 0x27 0,39 # quoteright
+( 273 2 0x28 0,40 # parenleft
+) 273 2 0x29 0,41 # parenright
+* 319 2 0x2a 0,42 # asterisk
++ 479 0 0x2b 0,43 # plus
+, 228 0 0x2c 0,44 # comma
+- 479 0 0x2d 0,45 # hyphen
+hy 479 0 0x2d 0,45 # "
+. 228 0 0x2e 0,46 # period
+/ 228 2 0x2f 0,47 # slash
+sl 228 2 0x2f 0,47 # "
+0 456 2 0x30 0,48 # zero
+1 456 2 0x31 0,49 # one
+2 456 2 0x32 0,50 # two
+3 456 2 0x33 0,51 # three
+4 456 2 0x34 0,52 # four
+5 456 2 0x35 0,53 # five
+6 456 2 0x36 0,54 # six
+7 456 2 0x37 0,55 # seven
+8 456 2 0x38 0,56 # eight
+9 456 2 0x39 0,57 # nine
+: 273 0 0x3a 0,58 # colon
+; 273 0 0x3b 0,59 # semicolon
+< 479 0 0x3c 0,60 # less
+= 479 0 0x3d 0,61 # equal
+> 479 0 0x3e 0,62 # greater
+? 501 2 0x3f 0,63 # question
+@ 800 2 0x40 0,64 # at
+at 800 2 0x40 0,64 # "
+A 592 2 0x41 0,65 # A
+B 592 2 0x42 0,66 # B
+C 592 2 0x43 0,67 # C
+D 592 2 0x44 0,68 # D
+E 547 2 0x45 0,69 # E
+F 501 2 0x46 0,70 # F
+G 638 2 0x47 0,71 # G
+H 592 2 0x48 0,72 # H
+I 228 2 0x49 0,73 # I
+J 456 2 0x4a 0,74 # J
+K 592 2 0x4b 0,75 # K
+L 501 2 0x4c 0,76 # L
+M 683 2 0x4d 0,77 # M
+N 592 2 0x4e 0,78 # N
+O 638 2 0x4f 0,79 # O
+P 547 2 0x50 0,80 # P
+Q 638 2 0x51 0,81 # Q
+R 592 2 0x52 0,82 # R
+S 547 2 0x53 0,83 # S
+T 501 2 0x54 0,84 # T
+U 592 2 0x55 0,85 # U
+V 547 2 0x56 0,86 # V
+W 774 2 0x57 0,87 # W
+X 547 2 0x58 0,88 # X
+Y 547 2 0x59 0,89 # Y
+Z 501 2 0x5a 0,90 # Z
+[ 273 2 0x5b 0,91 # bracketleft
+lB 273 2 0x5b 0,91 # "
+\ 228 2 0x5c 0,92 # backslash
+rs 228 2 0x5c 0,92 # "
+] 273 2 0x5d 0,93 # bracketright
+rB 273 2 0x5d 0,93 # "
+a^ 280 2 0x5e 0,94 # circumflex
+^ 280 2 0x5e 0,94 # "
+_ 456 0 0x5f 0,95 # underscore
+` 280 2 0x60 0,96 # quoteleft
+oq 280 2 0x60 0,96 # "
+a 456 0 0x61 0,97 # a
+b 501 2 0x62 0,98 # b
+c 456 0 0x63 0,99 # c
+d 501 2 0x64 0,100 # d
+e 456 0 0x65 0,101 # e
+f 273 2 0x66 0,102 # f
+g 501 1 0x67 0,103 # g
+h 501 2 0x68 0,104 # h
+i 228 2 0x69 0,105 # i
+j 228 2 0x6a 0,106 # j
+k 456 2 0x6b 0,107 # k
+l 228 2 0x6c 0,108 # l
+m 729 0 0x6d 0,109 # m
+n 501 0 0x6e 0,110 # n
+o 501 0 0x6f 0,111 # o
+p 501 1 0x70 0,112 # p
+q 501 1 0x71 0,113 # q
+r 319 0 0x72 0,114 # r
+s 456 0 0x73 0,115 # s
+t 273 2 0x74 0,116 # t
+u 501 0 0x75 0,117 # u
+v 456 0 0x76 0,118 # v
+w 638 0 0x77 0,119 # w
+x 456 0 0x78 0,120 # x
+y 456 1 0x79 0,121 # y
+z 410 0 0x7a 0,122 # z
+lC 319 2 0x7b 0,123 # braceleft
+{ 319 2 0x7b 0,123 # "
+| 230 2 0x7c 0,124 # "
+rC 319 2 0x7d 0,125 # braceright
+} 319 2 0x7d 0,125 # "
+a~ 280 2 0x7e 0,126 # tilde
+~ 280 2 0x7e 0,126 # "
+-D 592 2 0x13d 1,78 # Eth "Icelandic uppercase eth"
+Sd 501 2 0x148 1,87 # eth "Icelandic lowercase eth"
+TP 547 2 0x13e 1,88 # Thorn "Icelandic uppercase thorn"
+Tp 501 3 0x143 1,89 # thorn "Icelandic lowercase thorn"
+AE 820 2 0x92 1,36 # AE
+ae 729 0 0x91 1,37 # ae
+OE 820 2 0x141 1,166 # OE
+oe 774 0 0x146 1,167 # oe
+ij 450 0 0x150 1,139 # ij "Dutch ij ligature"
+ss 501 2 0x147 1,23 # germandbls
+'A 501 2 0x15a 1,26 # Aacute
+'E 547 2 0x90 1,40 # Eacute
+'I 547 2 0x161 1,48 # Iacute
+'O 547 2 0x165 1,58 # Oacute
+'U 547 2 0x16a 1,66 # Uacute
+'a 456 2 0xa0 1,27 # aacute
+'e 456 2 0x82 1,41 # eacute
+'i 228 2 0xa1 1,49 # iacute
+'o 501 2 0xa2 1,59 # oacute
+'u 501 2 0x95 1,65 # uacute
+:A 592 2 0x8e 1,30 # Adieresis
+:E 592 2 0x15f 1,44 # Edieresis
+:I 592 2 0x163 1,52 # Idieresis
+:O 638 2 0x99 1,62 # Odieresis
+:U 592 2 0x9a 1,70 # Udieresis
+:Y 592 2 0x16d 1,74 # Ydieresis
+:a 456 2 0x84 1,31 # adieresis
+:e 456 2 0x89 1,45 # edieresis
+:i 228 2 0x8b 1,53 # idieresis
+:o 501 2 0x94 1,63 # odieresis
+:u 501 2 0x81 1,71 # udieresis
+:y 456 3 0x98 1,75 # ydieresis
+^A 456 2 0x15b 1,28 # Acircumflex
+^E 456 2 0x15e 1,42 # Ecircumflex
+^I 456 2 0x162 1,50 # Icircumflex
+^O 456 2 0x166 1,60 # Ocircumflex
+^U 456 2 0x16b 1,68 # Ucircumflex
+^a 456 2 0x83 1,29 # acircumflex
+^e 456 2 0x88 1,43 # ecircumflex
+^i 228 2 0x8c 1,51 # icircumflex
+^o 501 2 0x93 1,61 # ocircumflex
+^u 501 2 0x96 1,69 # ucircumflex
+`A 501 2 0x15c 1,32 # Agrave
+`E 501 2 0x160 1,46 # Egrave
+`I 501 2 0x164 1,54 # Igrave
+`O 501 2 0x167 1,64 # Ograve
+`U 501 2 0x16c 1,72 # Ugrave
+`a 456 2 0x85 1,33 # agrave
+~a 456 2 0x284 --- # atilde
+`e 456 2 0x8a 1,47 # egrave
+`i 228 2 0x8d 1,55 # igrave
+`o 501 2 0x95 1,65 # ograve
+`u 501 2 0x97 1,73 # ugrave
+~A 501 2 0x28e 1,26 # Atilde
+~N 592 2 0xa5 1,56 # Ntilde
+~O 592 2 0x168 1,82 # Otilde
+~n 501 2 0xa4 1,57 # ntilde
+~o 501 2 0x172 1,83 # otilde
+vS 501 2 0x169 1,176 # Scaron
+vs 501 2 0x173 1,177 # scaron
+vZ 501 2 0x16e 1,206 # Zcaron
+vz 501 2 0x174 1,207 # zcaron
+,C 592 2 0x80 1,38 # Ccedilla
+,c 456 0 0x87 1,39 # ccedilla
+/L 501 2 0x13f 1,152 # Lslash "Polish L with a slash"
+/l 228 2 0x144 1,153 # lslash "Polish l with a slash"
+/O 638 2 0x140 1,80 # Oslash
+/o 501 0 0x145 1,81 # oslash
+oA 592 2 0x8f 1,34 # Aring
+oa 456 2 0x86 1,35 # aring
+a" 273 2 0x13a 1,16 # hungarumlaut "Hungarian umlaut"
+a- 273 2 0x135 1,8 # macron "macron or bar accent"
+a. 273 2 0x137 1,15 # dotaccent "dot accent"
+a^ 273 2 0x5e 1,3 # circumflex "circumflex accent"
+aa 273 2 0x120 1,6 # acute "acute accent"
+ga 273 2 0x121 1,0 # grave "grave accent"
+ab 273 2 0x136 1,22 # breve "breve accent"
+ac 273 0 0x139 1,17 # cedilla "cedilla accent"
+ad 273 2 0x122 1,7 # dieresis "umlaut or dieresis"
+ah 273 2 0x13c 1,19 # caron "h\('a\(vcek accent"
+ao 273 2 0x138 1,14 # ring "ring or circle accent"
+a~ 273 2 0x7e 1,2 # tilde "tilde accent"
+ho 273 0 0x13b 1,18 # ogonek "hook or ogonek accent"
+.i 228 0 0x142 1,239 # dotlessi "i without a dot"
+Cs 456 2 0x12f 4,24 # currency "Scandinavian currency sign"
+Do 456 2 0x24 0,36 # dollar
+Po 456 2 0x9c 4,11 # sterling
+Ye 456 2 0x9d 4,12 # yen
+Fn 456 2 0x9f 4,14 # florin
+ct 456 2 0x9b 4,19 # cent
+Fo 456 0 0xae 4,9 # guillemotleft
+Fc 273 0 0x4bb 4,20 # guillemotright
+fo 273 0 0x127 4,35 # guilsinglleft
+fc 273 0 0x128 4,36 # guilsinglright
+r! 273 1 0xad 4,7 # exclamdown
+r? 501 1 0xa8 4,8 # questiondown
+fi 501 2 0x130 4,54 # fi "fi ligature"
+fl 501 2 0x131 4,55 # fl "fl ligature"
+OK 501 0 0x3d6 --- # \& "check mark, tick"
+Of 303 2 0xa6 4,15 # ordfeminine
+Om 299 2 0xa7 4,16 # ordmasculine
+S1 273 2 0x156 4,78 # onesuperior
+S2 273 2 0xfd 4,20 # twosuperior
+S3 273 2 0x14d 4,26 # threesuperior
+<- 809 0 0x1b 6,22 # arrowleft
+-> 809 0 0x1a 6,21 # arrowright
+<> 854 0 0x1d 6,25 # arrowboth "horizontal double-headed arrow"
+da 494 0 0x19 6,24 # arrowdown
+ua 494 0 0x18 6,23 # arrowup
+va 494 0 0x12 6,26 # \& "vertical double-headed arrow"
+lA 494 0 0x3dc 6,57 # arrowdblleft
+rA 494 0 0x3de 6,56 # arrowdblright
+hA 494 0 0x3db 6,60 # arrowdblboth "horizontal double-headed double arrow"
+dA 494 0 0x3df 6,59 # arrowdbldown
+uA 494 0 0x3dd 6,58 # arrowdblup
+ba 820 2 0xb3 3,9 # bar
+bb 230 2 0x7c 0,124 # brokenbar
+br 820 0 0x1db 3,9 # br "box rule with traditional troff metrics"
+ru 820 0 0x123 4,34 # ru "baseline rule"
+ul 456 0 0x5f 0,95 # ul "underline with traditional troff metrics"
+bv 820 0 0x3f4 3,9 # bv "bold vertical"
+ci 699 0 0x9 4,1 # circle
+bu 522 0 0x7 4,0 # bullet
+co 604 2 0x154 4,23 # copyright
+rg 604 2 0x155 4,22 # registered
+tm 604 2 0x170 4,41 # trademark
+dd 456 2 0x12b 4,40 # daggerdbl "double dagger sign"
+dg 456 2 0x12a 4,39 # dagger
+ps 456 2 0x14 4,5 # paragraph
+sc 456 2 0x15 4,6 # section
+de 328 2 0xf8 6,36 # degree
+em 820 0 0x123 4,34 # emdash "em dash"
+en 456 0 0x132 4,33 # endash "en dash"
+%0 820 2 0x129 4,75 # perthousand "per thousand, per mille sign"
+12 684 2 0xab 4,17 # onehalf
+14 684 2 0xac 4,18 # onequarter
+34 684 2 0x12e 4,25 # threequarters
+f/ 137 2 0x158 6,6 # fraction "bar for fractions"
+fm 137 0 0x3a2 6,45 # minute "footmark, prime"
+sd 137 0 0x3b2 6,46 # second
+ha 137 2 0x4c3 6,85 # asciicircum "\s-2ASCII\s+2 circumflex, hat, caret"
+ti 137 0 0x4c4 6,12 # asciitilde "\s-2ASCII\s0 tilde, large tilde"
+hy 500 0 0x2d 6,0 # hyphen
+lB 273 2 0x5b 0,91 # bracketleft
+rB 273 2 0x5d 0,93 # bracketright
+lC 319 2 0x7b 0,123 # braceleft
+rC 319 2 0x7d 0,125 # braceright
+la 319 0 0x3e1 6,10 # angleleft "left angle bracket"
+ra 319 0 0x3f1 6,11 # angleright "right angle bracket"
+Bq 410 0 0x4b9 4,63 # quotedblbase "low double comma quote"
+bq 410 0 0x4b8 6,62 # quotesinglbase "low single comma quote"
+lq 410 2 0x125 4,32 # quotedblleft
+rq 410 2 0x4ba 6,31 # quotedblright
+oq 228 2 0x176 4,29 # quoteleft "single open quote"
+aq 195 2 0x27 0,39 # quotesingle "apostrophe quote"
+at 800 2 0x40 0,64 # at
+.C1 479 0 0x2d 0,45 # - minus "minus sign from current font"
+sh 456 2 0x23 0,35 # numbersign
+sl 228 2 0x2f 0,47 # slash
+rs 228 2 0x5c 0,92 # backslash
+3d 228 0 0x35c 6,102 # therefore
+tf 228 0 0x35c 6,102 # therefore
+*A 228 0 0x341 8,0 # Alpha
+*B 228 0 0x342 8,2 # Beta
+*C 228 0 0x358 8,28 # Xi
+*D 228 0 0x344 8,8 # Delta
+*E 228 0 0x345 8,10 # Epsilon
+*F 609 0 0x346 8,44 # Phi
+*G 481 0 0x347 8,6 # Gamma
+*H 481 0 0x351 8,16 # Theta
+*I 481 0 0x349 8,18 # Iota
+*K 481 0 0x34b 8,20 # Kappa
+*L 481 0 0x34c 8,22 # Lambda
+*M 481 0 0x34d 8,24 # Mu
+*N 481 0 0x34e 8,26 # Nu
+*O 481 0 0x34f 8,30 # Omicron
+*P 481 0 0x350 8,32 # Pi
+*Q 481 0 0x359 8,48 # Psi
+*R 481 0 0x352 8,34 # Rho
+*S 481 0 0x353 8,36 # Sigma
+*T 481 0 0x354 8,40 # Tau
+*U 481 0 0x3a1 8,76 # Upsilon
+*W 630 0 0x357 8,50 # Omega
+*X 481 0 0x343 8,36 # Chi
+*Y 481 0 0x348 8,14 # Eta
+*Z 481 0 0x35a 8,12 # Zeta
+*a 499 0 0xe0 8,1 # alpha
+*b 499 0 0xe1 8,3 # beta
+*c 499 0 0x378 8,29 # xi
+*d 487 0 0xeb 8,9 # delta
+*e 487 0 0x36e 8,70 # epsilon
+*f 487 0 0x366 8,45 # phi
++f 487 0 0x36a 8,77 # phi1 "variant phi"
+*g 487 0 0x367 8,7 # gamma
+*h 486 0 0xe9 8,17 # theta
++h 486 0 0x375 8,71 # theta1 "variant theta"
+*i 486 0 0x369 8,19 # iota
+*k 486 0 0x36b 8,21 # kappa
+*l 486 0 0x36c 8,23 # lambda
+*m 501 0 0xe6 8,25 # mu
+*n 501 0 0x36e 8,27 # nu
+*o 501 0 0x36f 8,31 # omicron
+*p 527 0 0xe3 8,33 # pi
++p 527 0 0x376 8,78 # omega1 "variant pi, looking like omega"
+*q 527 0 0x379 8,49 # psi
+*r 527 0 0x372 8,35 # rho
+*s 531 0 0xe5 8,37 # sigma
+*t 375 0 0xe7 8,41 # tau
+*u 375 0 0x375 8,27 # upsilon
+*w 375 0 0x377 8,51 # omega
+*x 375 0 0x363 8,47 # chi
+*y 375 0 0x368 8,15 # eta
+*z 375 0 0x37a 8,13 # zeta
+ts 375 0 0x356 8,39 # sigma1 "terminal sigma"
+~~ 655 0 0xf7 6,13 # approxequal
+~= 655 0 0xf7 6,13 # approxequal
+!= 655 0 0x3b9 6,99 # notequal
+** 228 0 0x32a 0,32 # asteriskmath
++- 479 0 0xf1 6,1 # plusminus
+<= 592 0 0xf3 6,2 # lessequal
+== 592 0 0x3ba 8,14 # equivalence
+=~ 592 0 0x340 8,116 # congruent
+>= 499 0 0x3b3 8,3 # greaterequal
+AN 499 0 0x3d9 8,85 # logicaland
+OR 499 0 0x3da 8,86 # logicalor
+no 499 0 0x3d8 8,20 # logicalnot
+te 499 0 0x324 8,121 # existential "there exists, existential quantifier"
+fa 499 0 0x322 8,122 # universal "for all, universal quantifier"
+Ah 499 0 0x3c0 9,0 # aleph
+Im 499 0 0x3c1 8,21 # Ifraktur "Fraktur I, imaginary"
+Re 499 0 0x3c2 8,22 # Rfraktur "Fraktur R, real"
+if 499 0 0x3a5 8,19 # infinity
+md 499 0 0x3b7 8,32 # dotmath
+mo 499 0 0x3ce 8,15 # element
+mu 499 0 0x3b4 8,39 # multiply
+nc 499 0 0x3cb 8,197 # uni2285
+nm 499 0 0x3cf 8,209 # notelement
+pl 273 0 0x32b 0,93 # plusmath "plus sign in special font"
+eq 479 0 0x33d 0,61 # equalmath "equals sign in special font"
+pt 479 0 0x3b5 6,4 # proportional
+pp 479 0 0x35e 8,89 # perpendicular
+sb 479 0 0x3cc 6,67 # propersubset
+sp 479 0 0x3c9 6,68 # propersuperset
+ib 479 0 0x3cd 6,69 # reflexsubset
+ip 479 0 0x3ca 6,70 # reflexsuperset
+ap 479 0 0x37e 6,12 # similar
+pd 479 0 0x3b6 6,34 # partialdiff "partial differentiation sign"
+c* 479 0 0x3c4 6,80 # circlemultiply "multiply sign in a circle"
+c+ 479 0 0x3c5 6,81 # circleplus "plus sign in a circle"
+ca 645 0 0xef 6,16 # intersection "intersection, cap"
+cu 645 0 0x3c8 6,66 # union "union, cup"
+di 479 0 0x3b8 6,8 # divide "division sign"
+-h 820 0 0xc4 3,8 # hbar
+hbar "
+gr 820 0 0x3d1 6,33 # gradient
+es 638 0 0x3c6 0,79 # emptyset
+CL 617 0 0x5 5,168 # club "club suit"
+SP 617 0 0x6 5,171 # spade "spade suit"
+HE 617 0 0x3 5,170 # heart "heart suit"
+DI 617 0 0x4 5,169 # diamond "diamond suit"
+CR 617 0 0x3bf 5,20 # carriagereturn "carriage return symbol"
+st 617 0 0x327 6,71 # suchthat
+/_ 617 0 0x3d0 6,79 # angle
+<< 456 0 0xae 6,77 # "" "much less"
+>> 456 0 0xaf 6,78 # "" "much greater"
+wp 456 0 0x3c3 6,53 # weierstrass "Weierstrass p"
+lz 456 0 0x3e0 6,95 # lozenge
+an 820 0 0x3be 3,8 # arrowhorizex "horizontal arrow extension"
+pc 240 0 0xfa 6,32 # periodcentered
+mc 501 0 0xe6 8,25 # mu
+t+- 479 0 0xf1 6,1 # plusminus
+tmu 499 0 0x3b4 8,39 # multiply
+tdi 479 0 0x3b8 6,8 # divide "division sign"
+tno 499 0 0x3d8 8,20 # logicalnot
diff --git a/font/devlbp/HNI b/font/devlbp/HNI
new file mode 100644
index 0000000..78d2207
--- /dev/null
+++ b/font/devlbp/HNI
@@ -0,0 +1,400 @@
+name HNI
+lbpname Swiss-Narrow-Oblique
+special
+spacewidth 228
+slant 0
+ligatures fi fl 0
+charset
+ha 280 2 0x4c3 0,94 # asciicircum
+ti 280 0 0x4c4 0,126 # asciitilde
+vS 280 2 0x169 1,176 # Scaron
+vZ 280 2 0x16e 1,206 # Zcaron
+vs 280 2 0x173 1,177 # scaron
+vz 280 2 0x174 1,207 # zcaron
+:Y 280 2 0x16d 1,74 # Ydieresis
+tm 280 2 0x170 4,41 # trademark
+aq 157 2 0x27 0,39 # quotesingle
+space 228 0 0x20 0,32
+! 228 2 0x21 0,33 # exclam
+" 291 2 0x22 0,34 # quotedbl
+dq 291 2 0x22 0,34 # quotedbl
+# 456 2 0x23 0,35 # numbersign
+sh 456 2 0x23 0,35 # "
+$ 456 2 0x24 0,36 # dollar
+Do 456 2 0x24 0,36 # "
+% 720 2 0x25 0,37 # percent
+& 547 2 0x26 0,38 # ampersand
+' 157 2 0x27 0,39 # quoteright
+cq 157 2 0x27 0,39 # quoteright
+( 273 2 0x28 0,40 # parenleft
+) 273 2 0x29 0,41 # parenright
+* 319 2 0x2a 0,42 # asterisk
++ 479 0 0x2b 0,43 # plus
+, 228 0 0x2c 0,44 # comma
+- 479 0 0x2d 0,45 # hyphen
+hy 479 0 0x2d 0,45 # "
+. 228 0 0x2e 0,46 # period
+/ 228 2 0x2f 0,47 # slash
+sl 228 2 0x2f 0,47 # "
+0 456 2 0x30 0,48 # zero
+1 456 2 0x31 0,49 # one
+2 456 2 0x32 0,50 # two
+3 456 2 0x33 0,51 # three
+4 456 2 0x34 0,52 # four
+5 456 2 0x35 0,53 # five
+6 456 2 0x36 0,54 # six
+7 456 2 0x37 0,55 # seven
+8 456 2 0x38 0,56 # eight
+9 456 2 0x39 0,57 # nine
+: 228 0 0x3a 0,58 # colon
+; 228 0 0x3b 0,59 # semicolon
+< 479 0 0x3c 0,60 # less
+= 479 0 0x3d 0,61 # equal
+> 479 0 0x3e 0,62 # greater
+? 456 2 0x3f 0,63 # question
+@ 832 2 0x40 0,64 # at
+at 832 2 0x40 0,64 # "
+A 547 2 0x41 0,65 # A
+B 547 2 0x42 0,66 # B
+C 592 2 0x43 0,67 # C
+D 592 2 0x44 0,68 # D
+E 547 2 0x45 0,69 # E
+F 501 2 0x46 0,70 # F
+G 638 2 0x47 0,71 # G
+H 592 2 0x48 0,72 # H
+I 228 2 0x49 0,73 # I
+J 410 2 0x4a 0,74 # J
+K 547 2 0x4b 0,75 # K
+L 456 2 0x4c 0,76 # L
+M 683 2 0x4d 0,77 # M
+N 592 2 0x4e 0,78 # N
+O 638 2 0x4f 0,79 # O
+P 547 2 0x50 0,80 # P
+Q 638 2 0x51 0,81 # Q
+R 592 2 0x52 0,82 # R
+S 547 2 0x53 0,83 # S
+T 501 2 0x54 0,84 # T
+U 592 2 0x55 0,85 # U
+V 547 2 0x56 0,86 # V
+W 774 2 0x57 0,87 # W
+X 547 2 0x58 0,88 # X
+Y 547 2 0x59 0,89 # Y
+Z 501 2 0x5a 0,90 # Z
+[ 228 2 0x5b 0,91 # bracketleft
+lB 228 2 0x5b 0,91 # "
+\ 228 2 0x5c 0,92 # backslash
+rs 228 2 0x5c 0,92 # "
+] 228 2 0x5d 0,93 # bracketright
+rB 228 2 0x5d 0,93 # "
+a^ 280 2 0x5e 0,94 # circumflex
+^ 280 2 0x5e 0,94 # "
+_ 456 0 0x5f 0,95 # underscore
+` 280 2 0x60 0,96 # quoteleft
+oq 280 2 0x60 0,96 # "
+a 456 0 0x61 0,97 # a
+b 456 2 0x62 0,98 # b
+c 410 0 0x63 0,99 # c
+d 456 2 0x64 0,100 # d
+e 456 0 0x65 0,101 # e
+f 228 2 0x66 0,102 # f
+g 456 1 0x67 0,103 # g
+h 456 2 0x68 0,104 # h
+i 182 2 0x69 0,105 # i
+j 182 2 0x6a 0,106 # j
+k 410 2 0x6b 0,107 # k
+l 182 2 0x6c 0,108 # l
+m 683 0 0x6d 0,109 # m
+n 456 0 0x6e 0,110 # n
+o 456 0 0x6f 0,111 # o
+p 456 1 0x70 0,112 # p
+q 456 1 0x71 0,113 # q
+r 273 0 0x72 0,114 # r
+s 410 0 0x73 0,115 # s
+t 228 2 0x74 0,116 # t
+u 456 0 0x75 0,117 # u
+v 410 0 0x76 0,118 # v
+w 592 0 0x77 0,119 # w
+x 410 0 0x78 0,120 # x
+y 410 1 0x79 0,121 # y
+z 410 0 0x7a 0,122 # z
+lC 274 2 0x7b 0,123 # braceleft
+{ 274 2 0x7b 0,123 # "
+| 213 2 0x7c 0,124 # "
+rC 274 2 0x7d 0,125 # braceright
+} 274 2 0x7d 0,125 # "
+a~ 280 2 0x7e 0,126 # tilde
+~ 280 2 0x7e 0,126 # "
+-D 592 2 0x13d 1,78 # Eth "Icelandic uppercase eth"
+Sd 456 2 0x148 1,87 # eth "Icelandic lowercase eth"
+TP 547 2 0x13e 1,88 # Thorn "Icelandic uppercase thorn"
+Tp 456 3 0x143 1,89 # thorn "Icelandic lowercase thorn"
+AE 820 2 0x92 1,36 # AE
+ae 729 0 0x91 1,37 # ae
+OE 820 2 0x141 1,166 # OE
+oe 774 0 0x146 1,167 # oe
+ij 353 0 0x150 1,139 # ij "Dutch ij ligature"
+ss 501 2 0x147 1,23 # germandbls
+'A 501 2 0x15a 1,26 # Aacute
+'E 547 2 0x90 1,40 # Eacute
+'I 547 2 0x161 1,48 # Iacute
+'O 547 2 0x165 1,58 # Oacute
+'U 547 2 0x16a 1,66 # Uacute
+'a 456 2 0xa0 1,27 # aacute
+'e 456 2 0x82 1,41 # eacute
+'i 228 2 0xa1 1,49 # iacute
+'o 456 2 0xa2 1,59 # oacute
+'u 456 2 0x95 1,65 # uacute
+:A 547 2 0x8e 1,30 # Adieresis
+:E 547 2 0x15f 1,44 # Edieresis
+:I 547 2 0x163 1,52 # Idieresis
+:O 638 2 0x99 1,62 # Odieresis
+:U 592 2 0x9a 1,70 # Udieresis
+:Y 592 2 0x16d 1,74 # Ydieresis
+:a 456 2 0x84 1,31 # adieresis
+:e 456 2 0x89 1,45 # edieresis
+:i 228 2 0x8b 1,53 # idieresis
+:o 456 2 0x94 1,63 # odieresis
+:u 456 2 0x81 1,71 # udieresis
+:y 410 3 0x98 1,75 # ydieresis
+^A 410 2 0x15b 1,28 # Acircumflex
+^E 410 2 0x15e 1,42 # Ecircumflex
+^I 410 2 0x162 1,50 # Icircumflex
+^O 410 2 0x166 1,60 # Ocircumflex
+^U 410 2 0x16b 1,68 # Ucircumflex
+^a 456 2 0x83 1,29 # acircumflex
+^e 456 2 0x88 1,43 # ecircumflex
+^i 228 2 0x8c 1,51 # icircumflex
+^o 456 2 0x93 1,61 # ocircumflex
+^u 456 2 0x96 1,69 # ucircumflex
+`A 456 2 0x15c 1,32 # Agrave
+`E 456 2 0x160 1,46 # Egrave
+`I 456 2 0x164 1,54 # Igrave
+`O 456 2 0x167 1,64 # Ograve
+`U 456 2 0x16c 1,72 # Ugrave
+`a 456 2 0x85 1,33 # agrave
+~a 456 2 0x284 --- # atilde
+`e 456 2 0x8a 1,47 # egrave
+`i 228 2 0x8d 1,55 # igrave
+`o 456 2 0x95 1,65 # ograve
+`u 456 2 0x97 1,73 # ugrave
+~A 456 2 0x28e 1,26 # Atilde
+~N 592 2 0xa5 1,56 # Ntilde
+~O 592 2 0x168 1,82 # Otilde
+~n 456 2 0xa4 1,57 # ntilde
+~o 456 2 0x172 1,83 # otilde
+vS 456 2 0x169 1,176 # Scaron
+vs 456 2 0x173 1,177 # scaron
+vZ 456 2 0x16e 1,206 # Zcaron
+vz 456 2 0x174 1,207 # zcaron
+,C 592 2 0x80 1,38 # Ccedilla
+,c 410 0 0x87 1,39 # ccedilla
+/L 456 2 0x13f 1,152 # Lslash "Polish L with a slash"
+/l 182 2 0x144 1,153 # lslash "Polish l with a slash"
+/O 638 2 0x140 1,80 # Oslash
+/o 501 0 0x145 1,81 # oslash
+oA 547 2 0x8f 1,34 # Aring
+oa 456 2 0x86 1,35 # aring
+a" 273 2 0x13a 1,16 # hungarumlaut "Hungarian umlaut"
+a- 273 2 0x135 1,8 # macron "macron or bar accent"
+a. 273 2 0x137 1,15 # dotaccent "dot accent"
+a^ 273 2 0x5e 1,3 # circumflex "circumflex accent"
+aa 273 2 0x120 1,6 # acute "acute accent"
+ga 273 2 0x121 1,0 # grave "grave accent"
+ab 273 2 0x136 1,22 # breve "breve accent"
+ac 273 0 0x139 1,17 # cedilla "cedilla accent"
+ad 273 2 0x122 1,7 # dieresis "umlaut or dieresis"
+ah 273 2 0x13c 1,19 # caron "h\('a\(vcek accent"
+ao 273 2 0x138 1,14 # ring "ring or circle accent"
+a~ 273 2 0x7e 1,2 # tilde "tilde accent"
+ho 273 0 0x13b 1,18 # ogonek "hook or ogonek accent"
+.i 228 0 0x142 1,239 # dotlessi "i without a dot"
+Cs 456 2 0x12f 4,24 # currency "Scandinavian currency sign"
+Do 456 2 0x24 0,36 # dollar
+Po 456 2 0x9c 4,11 # sterling
+Ye 456 2 0x9d 4,12 # yen
+Fn 456 2 0x9f 4,14 # florin
+ct 456 2 0x9b 4,19 # cent
+Fo 456 0 0xae 4,9 # guillemotleft
+Fc 273 0 0x4bb 4,20 # guillemotright
+fo 273 0 0x127 4,35 # guilsinglleft
+fc 273 0 0x128 4,36 # guilsinglright
+r! 273 1 0xad 4,7 # exclamdown
+r? 501 1 0xa8 4,8 # questiondown
+fi 410 2 0x130 4,54 # fi "fi ligature"
+fl 410 2 0x131 4,55 # fl "fl ligature"
+OK 410 0 0x3d6 --- # \& "check mark, tick"
+Of 303 2 0xa6 4,15 # ordfeminine
+Om 299 2 0xa7 4,16 # ordmasculine
+S1 273 2 0x156 4,78 # onesuperior
+S2 273 2 0xfd 4,20 # twosuperior
+S3 273 2 0x14d 4,26 # threesuperior
+<- 809 0 0x1b 6,22 # arrowleft
+-> 809 0 0x1a 6,21 # arrowright
+<> 854 0 0x1d 6,25 # arrowboth "horizontal double-headed arrow"
+da 494 0 0x19 6,24 # arrowdown
+ua 494 0 0x18 6,23 # arrowup
+va 494 0 0x12 6,26 # \& "vertical double-headed arrow"
+lA 494 0 0x3dc 6,57 # arrowdblleft
+rA 494 0 0x3de 6,56 # arrowdblright
+hA 494 0 0x3db 6,60 # arrowdblboth "horizontal double-headed double arrow"
+dA 494 0 0x3df 6,59 # arrowdbldown
+uA 494 0 0x3dd 6,58 # arrowdblup
+ba 820 2 0xb3 3,9 # bar
+bb 213 2 0x7c 0,124 # brokenbar
+br 820 0 0x1db 3,9 # br "box rule with traditional troff metrics"
+ru 820 0 0x123 4,34 # ru "baseline rule"
+ul 456 0 0x5f 0,95 # ul "underline with traditional troff metrics"
+bv 820 0 0x3f4 3,9 # bv "bold vertical"
+ci 699 0 0x9 4,1 # circle
+bu 522 0 0x7 4,0 # bullet
+co 604 2 0x154 4,23 # copyright
+rg 604 2 0x155 4,22 # registered
+tm 604 2 0x170 4,41 # trademark
+dd 456 2 0x12b 4,40 # daggerdbl "double dagger sign"
+dg 456 2 0x12a 4,39 # dagger
+ps 440 2 0x14 4,5 # paragraph
+sc 456 2 0x15 4,6 # section
+de 328 2 0xf8 6,36 # degree
+em 820 0 0x123 4,34 # emdash "em dash"
+en 456 0 0x132 4,33 # endash "en dash"
+%0 820 2 0x129 4,75 # perthousand "per thousand, per mille sign"
+12 684 2 0xab 4,17 # onehalf
+14 684 2 0xac 4,18 # onequarter
+34 684 2 0x12e 4,25 # threequarters
+f/ 137 2 0x158 6,6 # fraction "bar for fractions"
+fm 137 0 0x3a2 6,45 # minute "footmark, prime"
+sd 137 0 0x3b2 6,46 # second
+ha 137 2 0x4c3 6,85 # asciicircum "\s-2ASCII\s+2 circumflex, hat, caret"
+ti 137 0 0x4c4 6,12 # asciitilde "\s-2ASCII\s0 tilde, large tilde"
+hy 500 0 0x2d 6,0 # hyphen
+lB 228 2 0x5b 0,91 # bracketleft
+rB 228 2 0x5d 0,93 # bracketright
+lC 274 2 0x7b 0,123 # braceleft
+rC 274 2 0x7d 0,125 # braceright
+la 274 0 0x3e1 6,10 # angleleft "left angle bracket"
+ra 274 0 0x3f1 6,11 # angleright "right angle bracket"
+Bq 273 0 0x4b9 4,63 # quotedblbase "low double comma quote"
+bq 273 0 0x4b8 6,62 # quotesinglbase "low single comma quote"
+lq 273 2 0x125 4,32 # quotedblleft
+rq 273 2 0x4ba 6,31 # quotedblright
+oq 182 2 0x176 4,29 # quoteleft "single open quote"
+aq 157 2 0x27 0,39 # quotesingle "apostrophe quote"
+at 832 2 0x40 0,64 # at
+.C1 479 0 0x2d 0,45 # - minus "minus sign from current font"
+sh 456 2 0x23 0,35 # numbersign
+sl 228 2 0x2f 0,47 # slash
+rs 228 2 0x5c 0,92 # backslash
+3d 228 0 0x35c 6,102 # therefore
+tf 228 0 0x35c 6,102 # therefore
+*A 228 0 0x341 8,0 # Alpha
+*B 228 0 0x342 8,2 # Beta
+*C 228 0 0x358 8,28 # Xi
+*D 228 0 0x344 8,8 # Delta
+*E 228 0 0x345 8,10 # Epsilon
+*F 585 0 0x346 8,44 # Phi
+*G 469 0 0x347 8,6 # Gamma
+*H 469 0 0x351 8,16 # Theta
+*I 469 0 0x349 8,18 # Iota
+*K 469 0 0x34b 8,20 # Kappa
+*L 469 0 0x34c 8,22 # Lambda
+*M 469 0 0x34d 8,24 # Mu
+*N 469 0 0x34e 8,26 # Nu
+*O 469 0 0x34f 8,30 # Omicron
+*P 469 0 0x350 8,32 # Pi
+*Q 469 0 0x359 8,48 # Psi
+*R 469 0 0x352 8,34 # Rho
+*S 485 0 0x353 8,36 # Sigma
+*T 485 0 0x354 8,40 # Tau
+*U 485 0 0x3a1 8,76 # Upsilon
+*W 626 0 0x357 8,50 # Omega
+*X 485 0 0x343 8,36 # Chi
+*Y 485 0 0x348 8,14 # Eta
+*Z 485 0 0x35a 8,12 # Zeta
+*a 498 0 0xe0 8,1 # alpha
+*b 466 0 0xe1 8,3 # beta
+*c 466 0 0x378 8,29 # xi
+*d 465 0 0xeb 8,9 # delta
+*e 465 0 0x36e 8,70 # epsilon
+*f 465 0 0x366 8,45 # phi
++f 465 0 0x36a 8,77 # phi1 "variant phi"
+*g 465 0 0x367 8,7 # gamma
+*h 456 0 0xe9 8,17 # theta
++h 456 0 0x375 8,71 # theta1 "variant theta"
+*i 456 0 0x369 8,19 # iota
+*k 456 0 0x36b 8,21 # kappa
+*l 456 0 0x36c 8,23 # lambda
+*m 456 0 0xe6 8,25 # mu
+*n 456 0 0x36e 8,27 # nu
+*o 456 0 0x36f 8,31 # omicron
+*p 483 0 0xe3 8,33 # pi
++p 483 0 0x376 8,78 # omega1 "variant pi, looking like omega"
+*q 483 0 0x379 8,49 # psi
+*r 483 0 0x372 8,35 # rho
+*s 501 0 0xe5 8,37 # sigma
+*t 375 0 0xe7 8,41 # tau
+*u 375 0 0x375 8,27 # upsilon
+*w 375 0 0x377 8,51 # omega
+*x 375 0 0x363 8,47 # chi
+*y 375 0 0x368 8,15 # eta
+*z 375 0 0x37a 8,13 # zeta
+ts 375 0 0x356 8,39 # sigma1 "terminal sigma"
+~~ 655 0 0xf7 6,13 # approxequal
+~= 655 0 0xf7 6,13 # approxequal
+!= 655 0 0x3b9 6,99 # notequal
+** 228 0 0x32a 0,32 # asteriskmath
++- 479 0 0xf1 6,1 # plusminus
+<= 594 0 0xf3 6,2 # lessequal
+== 594 0 0x3ba 8,14 # equivalence
+=~ 594 0 0x340 8,116 # congruent
+>= 466 0 0x3b3 8,3 # greaterequal
+AN 466 0 0x3d9 8,85 # logicaland
+OR 466 0 0x3da 8,86 # logicalor
+no 466 0 0x3d8 8,20 # logicalnot
+te 466 0 0x324 8,121 # existential "there exists, existential quantifier"
+fa 466 0 0x322 8,122 # universal "for all, universal quantifier"
+Ah 466 0 0x3c0 9,0 # aleph
+Im 466 0 0x3c1 8,21 # Ifraktur "Fraktur I, imaginary"
+Re 466 0 0x3c2 8,22 # Rfraktur "Fraktur R, real"
+if 466 0 0x3a5 8,19 # infinity
+md 466 0 0x3b7 8,32 # dotmath
+mo 466 0 0x3ce 8,15 # element
+mu 466 0 0x3b4 8,39 # multiply
+nc 466 0 0x3cb 8,197 # uni2285
+nm 466 0 0x3cf 8,209 # notelement
+pl 228 0 0x32b 0,93 # plusmath "plus sign in special font"
+eq 479 0 0x33d 0,61 # equalmath "equals sign in special font"
+pt 479 0 0x3b5 6,4 # proportional
+pp 479 0 0x35e 8,89 # perpendicular
+sb 479 0 0x3cc 6,67 # propersubset
+sp 479 0 0x3c9 6,68 # propersuperset
+ib 479 0 0x3cd 6,69 # reflexsubset
+ip 479 0 0x3ca 6,70 # reflexsuperset
+ap 479 0 0x37e 6,12 # similar
+pd 479 0 0x3b6 6,34 # partialdiff "partial differentiation sign"
+c* 479 0 0x3c4 6,80 # circlemultiply "multiply sign in a circle"
+c+ 479 0 0x3c5 6,81 # circleplus "plus sign in a circle"
+ca 645 0 0xef 6,16 # intersection "intersection, cap"
+cu 645 0 0x3c8 6,66 # union "union, cup"
+di 479 0 0x3b8 6,8 # divide "division sign"
+-h 820 0 0xc4 3,8 # hbar
+hbar "
+gr 820 0 0x3d1 6,33 # gradient
+es 638 0 0x3c6 0,79 # emptyset
+CL 617 0 0x5 5,168 # club "club suit"
+SP 617 0 0x6 5,171 # spade "spade suit"
+HE 617 0 0x3 5,170 # heart "heart suit"
+DI 617 0 0x4 5,169 # diamond "diamond suit"
+CR 617 0 0x3bf 5,20 # carriagereturn "carriage return symbol"
+st 617 0 0x327 6,71 # suchthat
+/_ 617 0 0x3d0 6,79 # angle
+<< 456 0 0xae 6,77 # "" "much less"
+>> 456 0 0xaf 6,78 # "" "much greater"
+wp 456 0 0x3c3 6,53 # weierstrass "Weierstrass p"
+lz 456 0 0x3e0 6,95 # lozenge
+an 820 0 0x3be 3,8 # arrowhorizex "horizontal arrow extension"
+pc 240 0 0xfa 6,32 # periodcentered
+mc 456 0 0xe6 8,25 # mu
+t+- 479 0 0xf1 6,1 # plusminus
+tmu 466 0 0x3b4 8,39 # multiply
+tdi 479 0 0x3b8 6,8 # divide "division sign"
+tno 466 0 0x3d8 8,20 # logicalnot
diff --git a/font/devlbp/HNR b/font/devlbp/HNR
new file mode 100644
index 0000000..7ad6e07
--- /dev/null
+++ b/font/devlbp/HNR
@@ -0,0 +1,400 @@
+name HNR
+lbpname Swiss-Narrow
+special
+spacewidth 228
+slant 0
+ligatures fi fl 0
+charset
+ha 290 2 0x4c3 0,94 # asciicircum
+ti 280 0 0x4c4 0,126 # asciitilde
+vS 280 2 0x169 1,176 # Scaron
+vZ 280 2 0x16e 1,206 # Zcaron
+vs 280 2 0x173 1,177 # scaron
+vz 280 2 0x174 1,207 # zcaron
+:Y 280 2 0x16d 1,74 # Ydieresis
+tm 280 2 0x170 4,41 # trademark
+aq 157 2 0x27 0,39 # quotesingle
+space 228 0 0x20 0,32
+! 228 2 0x21 0,33 # exclam
+" 291 2 0x22 0,34 # quotedbl
+dq 291 2 0x22 0,34 # quotedbl
+# 456 2 0x23 0,35 # numbersign
+sh 456 2 0x23 0,35 # "
+$ 456 2 0x24 0,36 # dollar
+Do 456 2 0x24 0,36 # "
+% 720 2 0x25 0,37 # percent
+& 547 2 0x26 0,38 # ampersand
+' 157 2 0x27 0,39 # quoteright
+cq 157 2 0x27 0,39 # quoteright
+( 273 2 0x28 0,40 # parenleft
+) 273 2 0x29 0,41 # parenright
+* 319 2 0x2a 0,42 # asterisk
++ 479 0 0x2b 0,43 # plus
+, 228 0 0x2c 0,44 # comma
+- 479 0 0x2d 0,45 # hyphen
+hy 479 0 0x2d 0,45 # "
+. 228 0 0x2e 0,46 # period
+/ 228 2 0x2f 0,47 # slash
+sl 228 2 0x2f 0,47 # "
+0 456 2 0x30 0,48 # zero
+1 456 2 0x31 0,49 # one
+2 456 2 0x32 0,50 # two
+3 456 2 0x33 0,51 # three
+4 456 2 0x34 0,52 # four
+5 456 2 0x35 0,53 # five
+6 456 2 0x36 0,54 # six
+7 456 2 0x37 0,55 # seven
+8 456 2 0x38 0,56 # eight
+9 456 2 0x39 0,57 # nine
+: 228 0 0x3a 0,58 # colon
+; 228 0 0x3b 0,59 # semicolon
+< 479 0 0x3c 0,60 # less
+= 479 0 0x3d 0,61 # equal
+> 479 0 0x3e 0,62 # greater
+? 456 2 0x3f 0,63 # question
+@ 832 2 0x40 0,64 # at
+at 832 2 0x40 0,64 # "
+A 547 2 0x41 0,65 # A
+B 547 2 0x42 0,66 # B
+C 592 2 0x43 0,67 # C
+D 592 2 0x44 0,68 # D
+E 547 2 0x45 0,69 # E
+F 501 2 0x46 0,70 # F
+G 638 2 0x47 0,71 # G
+H 592 2 0x48 0,72 # H
+I 228 2 0x49 0,73 # I
+J 410 2 0x4a 0,74 # J
+K 547 2 0x4b 0,75 # K
+L 456 2 0x4c 0,76 # L
+M 683 2 0x4d 0,77 # M
+N 592 2 0x4e 0,78 # N
+O 638 2 0x4f 0,79 # O
+P 547 2 0x50 0,80 # P
+Q 638 2 0x51 0,81 # Q
+R 592 2 0x52 0,82 # R
+S 547 2 0x53 0,83 # S
+T 501 2 0x54 0,84 # T
+U 592 2 0x55 0,85 # U
+V 547 2 0x56 0,86 # V
+W 774 2 0x57 0,87 # W
+X 547 2 0x58 0,88 # X
+Y 547 2 0x59 0,89 # Y
+Z 501 2 0x5a 0,90 # Z
+[ 228 2 0x5b 0,91 # bracketleft
+lB 228 2 0x5b 0,91 # "
+\ 228 2 0x5c 0,92 # backslash
+rs 228 2 0x5c 0,92 # "
+] 228 2 0x5d 0,93 # bracketright
+rB 228 2 0x5d 0,93 # "
+a^ 290 2 0x5e 0,94 # circumflex
+^ 290 2 0x5e 0,94 # "
+_ 456 0 0x5f 0,95 # underscore
+` 290 2 0x60 0,96 # quoteleft
+oq 290 2 0x60 0,96 # "
+a 456 0 0x61 0,97 # a
+b 456 2 0x62 0,98 # b
+c 410 0 0x63 0,99 # c
+d 456 2 0x64 0,100 # d
+e 456 0 0x65 0,101 # e
+f 228 2 0x66 0,102 # f
+g 456 1 0x67 0,103 # g
+h 456 2 0x68 0,104 # h
+i 182 2 0x69 0,105 # i
+j 182 2 0x6a 0,106 # j
+k 410 2 0x6b 0,107 # k
+l 182 2 0x6c 0,108 # l
+m 683 0 0x6d 0,109 # m
+n 456 0 0x6e 0,110 # n
+o 456 0 0x6f 0,111 # o
+p 456 1 0x70 0,112 # p
+q 456 1 0x71 0,113 # q
+r 273 0 0x72 0,114 # r
+s 410 0 0x73 0,115 # s
+t 228 2 0x74 0,116 # t
+u 456 0 0x75 0,117 # u
+v 410 0 0x76 0,118 # v
+w 592 0 0x77 0,119 # w
+x 410 0 0x78 0,120 # x
+y 410 1 0x79 0,121 # y
+z 410 0 0x7a 0,122 # z
+lC 274 2 0x7b 0,123 # braceleft
+{ 274 2 0x7b 0,123 # "
+| 213 2 0x7c 0,124 # "
+rC 274 2 0x7d 0,125 # braceright
+} 274 2 0x7d 0,125 # "
+a~ 280 2 0x7e 0,126 # tilde
+~ 280 2 0x7e 0,126 # "
+-D 592 2 0x13d 1,78 # Eth "Icelandic uppercase eth"
+Sd 456 2 0x148 1,87 # eth "Icelandic lowercase eth"
+TP 547 2 0x13e 1,88 # Thorn "Icelandic uppercase thorn"
+Tp 456 3 0x143 1,89 # thorn "Icelandic lowercase thorn"
+AE 820 2 0x92 1,36 # AE
+ae 729 0 0x91 1,37 # ae
+OE 820 2 0x141 1,166 # OE
+oe 774 0 0x146 1,167 # oe
+ij 353 0 0x150 1,139 # ij "Dutch ij ligature"
+ss 501 2 0x147 1,23 # germandbls
+'A 501 2 0x15a 1,26 # Aacute
+'E 547 2 0x90 1,40 # Eacute
+'I 547 2 0x161 1,48 # Iacute
+'O 547 2 0x165 1,58 # Oacute
+'U 547 2 0x16a 1,66 # Uacute
+'a 456 2 0xa0 1,27 # aacute
+'e 456 2 0x82 1,41 # eacute
+'i 228 2 0xa1 1,49 # iacute
+'o 456 2 0xa2 1,59 # oacute
+'u 456 2 0x95 1,65 # uacute
+:A 547 2 0x8e 1,30 # Adieresis
+:E 547 2 0x15f 1,44 # Edieresis
+:I 547 2 0x163 1,52 # Idieresis
+:O 638 2 0x99 1,62 # Odieresis
+:U 592 2 0x9a 1,70 # Udieresis
+:Y 592 2 0x16d 1,74 # Ydieresis
+:a 456 2 0x84 1,31 # adieresis
+:e 456 2 0x89 1,45 # edieresis
+:i 228 2 0x8b 1,53 # idieresis
+:o 456 2 0x94 1,63 # odieresis
+:u 456 2 0x81 1,71 # udieresis
+:y 410 3 0x98 1,75 # ydieresis
+^A 410 2 0x15b 1,28 # Acircumflex
+^E 410 2 0x15e 1,42 # Ecircumflex
+^I 410 2 0x162 1,50 # Icircumflex
+^O 410 2 0x166 1,60 # Ocircumflex
+^U 410 2 0x16b 1,68 # Ucircumflex
+^a 456 2 0x83 1,29 # acircumflex
+^e 456 2 0x88 1,43 # ecircumflex
+^i 228 2 0x8c 1,51 # icircumflex
+^o 456 2 0x93 1,61 # ocircumflex
+^u 456 2 0x96 1,69 # ucircumflex
+`A 456 2 0x15c 1,32 # Agrave
+`E 456 2 0x160 1,46 # Egrave
+`I 456 2 0x164 1,54 # Igrave
+`O 456 2 0x167 1,64 # Ograve
+`U 456 2 0x16c 1,72 # Ugrave
+`a 456 2 0x85 1,33 # agrave
+~a 456 2 0x284 --- # atilde
+`e 456 2 0x8a 1,47 # egrave
+`i 228 2 0x8d 1,55 # igrave
+`o 456 2 0x95 1,65 # ograve
+`u 456 2 0x97 1,73 # ugrave
+~A 456 2 0x28e 1,26 # Atilde
+~N 592 2 0xa5 1,56 # Ntilde
+~O 592 2 0x168 1,82 # Otilde
+~n 456 2 0xa4 1,57 # ntilde
+~o 456 2 0x172 1,83 # otilde
+vS 456 2 0x169 1,176 # Scaron
+vs 456 2 0x173 1,177 # scaron
+vZ 456 2 0x16e 1,206 # Zcaron
+vz 456 2 0x174 1,207 # zcaron
+,C 592 2 0x80 1,38 # Ccedilla
+,c 410 0 0x87 1,39 # ccedilla
+/L 456 2 0x13f 1,152 # Lslash "Polish L with a slash"
+/l 182 2 0x144 1,153 # lslash "Polish l with a slash"
+/O 638 2 0x140 1,80 # Oslash
+/o 501 0 0x145 1,81 # oslash
+oA 547 2 0x8f 1,34 # Aring
+oa 456 2 0x86 1,35 # aring
+a" 273 2 0x13a 1,16 # hungarumlaut "Hungarian umlaut"
+a- 273 2 0x135 1,8 # macron "macron or bar accent"
+a. 273 2 0x137 1,15 # dotaccent "dot accent"
+a^ 273 2 0x5e 1,3 # circumflex "circumflex accent"
+aa 273 2 0x120 1,6 # acute "acute accent"
+ga 273 2 0x121 1,0 # grave "grave accent"
+ab 273 2 0x136 1,22 # breve "breve accent"
+ac 273 0 0x139 1,17 # cedilla "cedilla accent"
+ad 273 2 0x122 1,7 # dieresis "umlaut or dieresis"
+ah 273 2 0x13c 1,19 # caron "h\('a\(vcek accent"
+ao 273 2 0x138 1,14 # ring "ring or circle accent"
+a~ 273 2 0x7e 1,2 # tilde "tilde accent"
+ho 273 0 0x13b 1,18 # ogonek "hook or ogonek accent"
+.i 228 0 0x142 1,239 # dotlessi "i without a dot"
+Cs 456 2 0x12f 4,24 # currency "Scandinavian currency sign"
+Do 456 2 0x24 0,36 # dollar
+Po 456 2 0x9c 4,11 # sterling
+Ye 456 2 0x9d 4,12 # yen
+Fn 456 2 0x9f 4,14 # florin
+ct 456 2 0x9b 4,19 # cent
+Fo 456 0 0xae 4,9 # guillemotleft
+Fc 273 0 0x4bb 4,20 # guillemotright
+fo 273 0 0x127 4,35 # guilsinglleft
+fc 273 0 0x128 4,36 # guilsinglright
+r! 273 1 0xad 4,7 # exclamdown
+r? 501 1 0xa8 4,8 # questiondown
+fi 410 2 0x130 4,54 # fi "fi ligature"
+fl 410 2 0x131 4,55 # fl "fl ligature"
+OK 410 0 0x3d6 --- # \& "check mark, tick"
+Of 303 2 0xa6 4,15 # ordfeminine
+Om 299 2 0xa7 4,16 # ordmasculine
+S1 273 2 0x156 4,78 # onesuperior
+S2 273 2 0xfd 4,20 # twosuperior
+S3 273 2 0x14d 4,26 # threesuperior
+<- 809 0 0x1b 6,22 # arrowleft
+-> 809 0 0x1a 6,21 # arrowright
+<> 854 0 0x1d 6,25 # arrowboth "horizontal double-headed arrow"
+da 494 0 0x19 6,24 # arrowdown
+ua 494 0 0x18 6,23 # arrowup
+va 494 0 0x12 6,26 # \& "vertical double-headed arrow"
+lA 494 0 0x3dc 6,57 # arrowdblleft
+rA 494 0 0x3de 6,56 # arrowdblright
+hA 494 0 0x3db 6,60 # arrowdblboth "horizontal double-headed double arrow"
+dA 494 0 0x3df 6,59 # arrowdbldown
+uA 494 0 0x3dd 6,58 # arrowdblup
+ba 820 2 0xb3 3,9 # bar
+bb 213 2 0x7c 0,124 # brokenbar
+br 820 0 0x1db 3,9 # br "box rule with traditional troff metrics"
+ru 820 0 0x123 4,34 # ru "baseline rule"
+ul 456 0 0x5f 0,95 # ul "underline with traditional troff metrics"
+bv 820 0 0x3f4 3,9 # bv "bold vertical"
+ci 699 0 0x9 4,1 # circle
+bu 522 0 0x7 4,0 # bullet
+co 604 2 0x154 4,23 # copyright
+rg 604 2 0x155 4,22 # registered
+tm 604 2 0x170 4,41 # trademark
+dd 456 2 0x12b 4,40 # daggerdbl "double dagger sign"
+dg 456 2 0x12a 4,39 # dagger
+ps 440 2 0x14 4,5 # paragraph
+sc 456 2 0x15 4,6 # section
+de 328 2 0xf8 6,36 # degree
+em 820 0 0x123 4,34 # emdash "em dash"
+en 456 0 0x132 4,33 # endash "en dash"
+%0 820 2 0x129 4,75 # perthousand "per thousand, per mille sign"
+12 684 2 0xab 4,17 # onehalf
+14 684 2 0xac 4,18 # onequarter
+34 684 2 0x12e 4,25 # threequarters
+f/ 137 2 0x158 6,6 # fraction "bar for fractions"
+fm 137 0 0x3a2 6,45 # minute "footmark, prime"
+sd 137 0 0x3b2 6,46 # second
+ha 137 2 0x4c3 6,85 # asciicircum "\s-2ASCII\s+2 circumflex, hat, caret"
+ti 137 0 0x4c4 6,12 # asciitilde "\s-2ASCII\s0 tilde, large tilde"
+hy 500 0 0x2d 6,0 # hyphen
+lB 228 2 0x5b 0,91 # bracketleft
+rB 228 2 0x5d 0,93 # bracketright
+lC 274 2 0x7b 0,123 # braceleft
+rC 274 2 0x7d 0,125 # braceright
+la 274 0 0x3e1 6,10 # angleleft "left angle bracket"
+ra 274 0 0x3f1 6,11 # angleright "right angle bracket"
+Bq 273 0 0x4b9 4,63 # quotedblbase "low double comma quote"
+bq 273 0 0x4b8 6,62 # quotesinglbase "low single comma quote"
+lq 273 2 0x125 4,32 # quotedblleft
+rq 273 2 0x4ba 6,31 # quotedblright
+oq 182 2 0x176 4,29 # quoteleft "single open quote"
+aq 157 2 0x27 0,39 # quotesingle "apostrophe quote"
+at 832 2 0x40 0,64 # at
+.C1 479 0 0x2d 0,45 # - minus "minus sign from current font"
+sh 456 2 0x23 0,35 # numbersign
+sl 228 2 0x2f 0,47 # slash
+rs 228 2 0x5c 0,92 # backslash
+3d 228 0 0x35c 6,102 # therefore
+tf 228 0 0x35c 6,102 # therefore
+*A 228 0 0x341 8,0 # Alpha
+*B 228 0 0x342 8,2 # Beta
+*C 228 0 0x358 8,28 # Xi
+*D 228 0 0x344 8,8 # Delta
+*E 228 0 0x345 8,10 # Epsilon
+*F 585 0 0x346 8,44 # Phi
+*G 469 0 0x347 8,6 # Gamma
+*H 469 0 0x351 8,16 # Theta
+*I 469 0 0x349 8,18 # Iota
+*K 469 0 0x34b 8,20 # Kappa
+*L 469 0 0x34c 8,22 # Lambda
+*M 469 0 0x34d 8,24 # Mu
+*N 469 0 0x34e 8,26 # Nu
+*O 469 0 0x34f 8,30 # Omicron
+*P 469 0 0x350 8,32 # Pi
+*Q 469 0 0x359 8,48 # Psi
+*R 469 0 0x352 8,34 # Rho
+*S 485 0 0x353 8,36 # Sigma
+*T 485 0 0x354 8,40 # Tau
+*U 485 0 0x3a1 8,76 # Upsilon
+*W 626 0 0x357 8,50 # Omega
+*X 485 0 0x343 8,36 # Chi
+*Y 485 0 0x348 8,14 # Eta
+*Z 485 0 0x35a 8,12 # Zeta
+*a 498 0 0xe0 8,1 # alpha
+*b 466 0 0xe1 8,3 # beta
+*c 466 0 0x378 8,29 # xi
+*d 465 0 0xeb 8,9 # delta
+*e 465 0 0x36e 8,70 # epsilon
+*f 465 0 0x366 8,45 # phi
++f 465 0 0x36a 8,77 # phi1 "variant phi"
+*g 465 0 0x367 8,7 # gamma
+*h 456 0 0xe9 8,17 # theta
++h 456 0 0x375 8,71 # theta1 "variant theta"
+*i 456 0 0x369 8,19 # iota
+*k 456 0 0x36b 8,21 # kappa
+*l 456 0 0x36c 8,23 # lambda
+*m 456 0 0xe6 8,25 # mu
+*n 456 0 0x36e 8,27 # nu
+*o 456 0 0x36f 8,31 # omicron
+*p 483 0 0xe3 8,33 # pi
++p 483 0 0x376 8,78 # omega1 "variant pi, looking like omega"
+*q 483 0 0x379 8,49 # psi
+*r 483 0 0x372 8,35 # rho
+*s 501 0 0xe5 8,37 # sigma
+*t 375 0 0xe7 8,41 # tau
+*u 375 0 0x375 8,27 # upsilon
+*w 375 0 0x377 8,51 # omega
+*x 375 0 0x363 8,47 # chi
+*y 375 0 0x368 8,15 # eta
+*z 375 0 0x37a 8,13 # zeta
+ts 375 0 0x356 8,39 # sigma1 "terminal sigma"
+~~ 655 0 0xf7 6,13 # approxequal
+~= 655 0 0xf7 6,13 # approxequal
+!= 655 0 0x3b9 6,99 # notequal
+** 228 0 0x32a 0,32 # asteriskmath
++- 479 0 0xf1 6,1 # plusminus
+<= 594 0 0xf3 6,2 # lessequal
+== 594 0 0x3ba 8,14 # equivalence
+=~ 594 0 0x340 8,116 # congruent
+>= 466 0 0x3b3 8,3 # greaterequal
+AN 466 0 0x3d9 8,85 # logicaland
+OR 466 0 0x3da 8,86 # logicalor
+no 466 0 0x3d8 8,20 # logicalnot
+te 466 0 0x324 8,121 # existential "there exists, existential quantifier"
+fa 466 0 0x322 8,122 # universal "for all, universal quantifier"
+Ah 466 0 0x3c0 9,0 # aleph
+Im 466 0 0x3c1 8,21 # Ifraktur "Fraktur I, imaginary"
+Re 466 0 0x3c2 8,22 # Rfraktur "Fraktur R, real"
+if 466 0 0x3a5 8,19 # infinity
+md 466 0 0x3b7 8,32 # dotmath
+mo 466 0 0x3ce 8,15 # element
+mu 466 0 0x3b4 8,39 # multiply
+nc 466 0 0x3cb 8,197 # uni2285
+nm 466 0 0x3cf 8,209 # notelement
+pl 228 0 0x32b 0,93 # plusmath "plus sign in special font"
+eq 479 0 0x33d 0,61 # equalmath "equals sign in special font"
+pt 479 0 0x3b5 6,4 # proportional
+pp 479 0 0x35e 8,89 # perpendicular
+sb 479 0 0x3cc 6,67 # propersubset
+sp 479 0 0x3c9 6,68 # propersuperset
+ib 479 0 0x3cd 6,69 # reflexsubset
+ip 479 0 0x3ca 6,70 # reflexsuperset
+ap 479 0 0x37e 6,12 # similar
+pd 479 0 0x3b6 6,34 # partialdiff "partial differentiation sign"
+c* 479 0 0x3c4 6,80 # circlemultiply "multiply sign in a circle"
+c+ 479 0 0x3c5 6,81 # circleplus "plus sign in a circle"
+ca 645 0 0xef 6,16 # intersection "intersection, cap"
+cu 645 0 0x3c8 6,66 # union "union, cup"
+di 479 0 0x3b8 6,8 # divide "division sign"
+-h 820 0 0xc4 3,8 # hbar
+hbar "
+gr 820 0 0x3d1 6,33 # gradient
+es 638 0 0x3c6 0,79 # emptyset
+CL 617 0 0x5 5,168 # club "club suit"
+SP 617 0 0x6 5,171 # spade "spade suit"
+HE 617 0 0x3 5,170 # heart "heart suit"
+DI 617 0 0x4 5,169 # diamond "diamond suit"
+CR 617 0 0x3bf 5,20 # carriagereturn "carriage return symbol"
+st 617 0 0x327 6,71 # suchthat
+/_ 617 0 0x3d0 6,79 # angle
+<< 456 0 0xae 6,77 # "" "much less"
+>> 456 0 0xaf 6,78 # "" "much greater"
+wp 456 0 0x3c3 6,53 # weierstrass "Weierstrass p"
+lz 456 0 0x3e0 6,95 # lozenge
+an 820 0 0x3be 3,8 # arrowhorizex "horizontal arrow extension"
+pc 240 0 0xfa 6,32 # periodcentered
+mc 456 0 0xe6 8,25 # mu
+t+- 479 0 0xf1 6,1 # plusminus
+tmu 466 0 0x3b4 8,39 # multiply
+tdi 479 0 0x3b8 6,8 # divide "division sign"
+tno 466 0 0x3d8 8,20 # logicalnot
diff --git a/font/devlbp/HR b/font/devlbp/HR
new file mode 100644
index 0000000..7e2de1b
--- /dev/null
+++ b/font/devlbp/HR
@@ -0,0 +1,400 @@
+name HR
+lbpname Swiss
+special
+spacewidth 927
+slant 0
+ligatures fi fl 0
+charset
+ha 1110 2 0x4c3 0,94 # asciicircum
+ti 1110 0 0x4c4 0,126 # asciitilde
+vS 2223 2 0x169 1,176 # Scaron
+vZ 2037 2 0x16e 1,206 # Zcaron
+vs 1667 2 0x173 1,177 # scaron
+vz 1667 2 0x174 1,207 # zcaron
+:Y 2223 2 0x16d 1,74 # Ydieresis
+tm 3333 2 0x170 4,41 # trademark
+aq 637 2 0x27 0,39 # quotesingle
+space 927 0 0x20 0,32
+! 927 2 0x21 0,33 # exclam
+" 1183 2 0x22 0,34 # quotedbl
+dq 1183 2 0x22 0,34 # quotedbl
+# 1853 2 0x23 0,35 # numbersign
+sh 1853 2 0x23 0,35 # "
+$ 1853 2 0x24 0,36 # dollar
+Do 1853 2 0x24 0,36 # "
+% 2963 2 0x25 0,37 # percent
+& 2223 2 0x26 0,38 # ampersand
+' 637 2 0x27 0,39 # quoteright
+cq 637 2 0x27 0,39 # quoteright
+( 1110 2 0x28 0,40 # parenleft
+) 1110 2 0x29 0,41 # parenright
+* 1297 2 0x2a 0,42 # asterisk
++ 1947 0 0x2b 0,43 # plus
+, 927 0 0x2c 0,44 # comma
+- 1947 0 0x2d 0,45 # hyphen
+hy 1947 0 0x2d 0,45 # "
+. 927 0 0x2e 0,46 # period
+/ 927 2 0x2f 0,47 # slash
+sl 927 2 0x2f 0,47 # "
+0 1853 2 0x30 0,48 # zero
+1 1853 2 0x31 0,49 # one
+2 1853 2 0x32 0,50 # two
+3 1853 2 0x33 0,51 # three
+4 1853 2 0x34 0,52 # four
+5 1853 2 0x35 0,53 # five
+6 1853 2 0x36 0,54 # six
+7 1853 2 0x37 0,55 # seven
+8 1853 2 0x38 0,56 # eight
+9 1853 2 0x39 0,57 # nine
+: 927 0 0x3a 0,58 # colon
+; 927 0 0x3b 0,59 # semicolon
+< 1947 0 0x3c 0,60 # less
+= 1947 0 0x3d 0,61 # equal
+> 1947 0 0x3e 0,62 # greater
+? 1853 2 0x3f 0,63 # question
+@ 3383 2 0x40 0,64 # at
+at 3383 2 0x40 0,64 # "
+A 2223 2 0x41 0,65 # A
+B 2223 2 0x42 0,66 # B
+C 2407 2 0x43 0,67 # C
+D 2407 2 0x44 0,68 # D
+E 2223 2 0x45 0,69 # E
+F 2037 2 0x46 0,70 # F
+G 2593 2 0x47 0,71 # G
+H 2407 2 0x48 0,72 # H
+I 927 2 0x49 0,73 # I
+J 1667 2 0x4a 0,74 # J
+K 2223 2 0x4b 0,75 # K
+L 1853 2 0x4c 0,76 # L
+M 2777 2 0x4d 0,77 # M
+N 2407 2 0x4e 0,78 # N
+O 2593 2 0x4f 0,79 # O
+P 2223 2 0x50 0,80 # P
+Q 2593 2 0x51 0,81 # Q
+R 2407 2 0x52 0,82 # R
+S 2223 2 0x53 0,83 # S
+T 2037 2 0x54 0,84 # T
+U 2407 2 0x55 0,85 # U
+V 2223 2 0x56 0,86 # V
+W 3147 2 0x57 0,87 # W
+X 2223 2 0x58 0,88 # X
+Y 2223 2 0x59 0,89 # Y
+Z 2037 2 0x5a 0,90 # Z
+[ 927 2 0x5b 0,91 # bracketleft
+lB 927 2 0x5b 0,91 # "
+\ 927 2 0x5c 0,92 # backslash
+rs 927 2 0x5c 0,92 # "
+] 927 2 0x5d 0,93 # bracketright
+rB 927 2 0x5d 0,93 # "
+a^ 1110 2 0x5e 0,94 # circumflex
+^ 1110 2 0x5e 0,94 # "
+_ 1853 0 0x5f 0,95 # underscore
+` 1110 2 0x60 0,96 # quoteleft
+oq 1110 2 0x60 0,96 # "
+a 1853 0 0x61 0,97 # a
+b 1853 2 0x62 0,98 # b
+c 1667 0 0x63 0,99 # c
+d 1853 2 0x64 0,100 # d
+e 1853 0 0x65 0,101 # e
+f 927 2 0x66 0,102 # f
+g 1853 1 0x67 0,103 # g
+h 1853 2 0x68 0,104 # h
+i 740 2 0x69 0,105 # i
+j 740 2 0x6a 0,106 # j
+k 1667 2 0x6b 0,107 # k
+l 740 2 0x6c 0,108 # l
+m 2777 0 0x6d 0,109 # m
+n 1853 0 0x6e 0,110 # n
+o 1853 0 0x6f 0,111 # o
+p 1853 1 0x70 0,112 # p
+q 1853 1 0x71 0,113 # q
+r 1110 0 0x72 0,114 # r
+s 1667 0 0x73 0,115 # s
+t 927 2 0x74 0,116 # t
+u 1853 0 0x75 0,117 # u
+v 1667 0 0x76 0,118 # v
+w 2407 0 0x77 0,119 # w
+x 1667 0 0x78 0,120 # x
+y 1667 1 0x79 0,121 # y
+z 1667 0 0x7a 0,122 # z
+lC 1113 2 0x7b 0,123 # braceleft
+{ 1113 2 0x7b 0,123 # "
+| 867 2 0x7c 0,124 # "
+rC 1113 2 0x7d 0,125 # braceright
+} 1113 2 0x7d 0,125 # "
+a~ 1110 2 0x7e 0,126 # tilde
+~ 1110 2 0x7e 0,126 # "
+-D 2407 2 0x13d 1,78 # Eth "Icelandic uppercase eth"
+Sd 1853 2 0x148 1,87 # eth "Icelandic lowercase eth"
+TP 2223 2 0x13e 1,88 # Thorn "Icelandic uppercase thorn"
+Tp 1853 3 0x143 1,89 # thorn "Icelandic lowercase thorn"
+AE 3333 2 0x92 1,36 # AE
+ae 2963 0 0x91 1,37 # ae
+OE 3333 2 0x141 1,166 # OE
+oe 3147 0 0x146 1,167 # oe
+ij 1437 0 0x150 1,139 # ij "Dutch ij ligature"
+ss 2037 2 0x147 1,23 # germandbls
+'A 2223 2 0x15a 1,26 # Aacute
+'E 2223 2 0x90 1,40 # Eacute
+'I 927 2 0x161 1,48 # Iacute
+'O 2593 2 0x165 1,58 # Oacute
+'U 2407 2 0x16a 1,66 # Uacute
+'a 1853 2 0xa0 1,27 # aacute
+'e 1853 2 0x82 1,41 # eacute
+'i 927 2 0xa1 1,49 # iacute
+'o 1853 2 0xa2 1,59 # oacute
+'u 1853 2 0x95 1,65 # uacute
+:A 2223 2 0x8e 1,30 # Adieresis
+:E 2223 2 0x15f 1,44 # Edieresis
+:I 927 2 0x163 1,52 # Idieresis
+:O 2593 2 0x99 1,62 # Odieresis
+:U 2407 2 0x9a 1,70 # Udieresis
+:Y 2223 2 0x16d 1,74 # Ydieresis
+:a 1853 2 0x84 1,31 # adieresis
+:e 1853 2 0x89 1,45 # edieresis
+:i 927 2 0x8b 1,53 # idieresis
+:o 1853 2 0x94 1,63 # odieresis
+:u 1853 2 0x81 1,71 # udieresis
+:y 1667 3 0x98 1,75 # ydieresis
+^A 2223 2 0x15b 1,28 # Acircumflex
+^E 2223 2 0x15e 1,42 # Ecircumflex
+^I 927 2 0x162 1,50 # Icircumflex
+^O 2593 2 0x166 1,60 # Ocircumflex
+^U 2407 2 0x16b 1,68 # Ucircumflex
+^a 1853 2 0x83 1,29 # acircumflex
+^e 1853 2 0x88 1,43 # ecircumflex
+^i 927 2 0x8c 1,51 # icircumflex
+^o 1853 2 0x93 1,61 # ocircumflex
+^u 1853 2 0x96 1,69 # ucircumflex
+`A 2223 2 0x15c 1,32 # Agrave
+`E 2223 2 0x160 1,46 # Egrave
+`I 927 2 0x164 1,54 # Igrave
+`O 2593 2 0x167 1,64 # Ograve
+`U 2407 2 0x16c 1,72 # Ugrave
+`a 1853 2 0x85 1,33 # agrave
+~a 1853 2 0x284 --- # atilde
+`e 1853 2 0x8a 1,47 # egrave
+`i 927 2 0x8d 1,55 # igrave
+`o 1853 2 0x95 1,65 # ograve
+`u 1853 2 0x97 1,73 # ugrave
+~A 2223 2 0x28e 1,26 # Atilde
+~N 2407 2 0xa5 1,56 # Ntilde
+~O 2593 2 0x168 1,82 # Otilde
+~n 1853 2 0xa4 1,57 # ntilde
+~o 1853 2 0x172 1,83 # otilde
+vS 2223 2 0x169 1,176 # Scaron
+vs 1667 2 0x173 1,177 # scaron
+vZ 2037 2 0x16e 1,206 # Zcaron
+vz 1667 2 0x174 1,207 # zcaron
+,C 2407 2 0x80 1,38 # Ccedilla
+,c 1667 0 0x87 1,39 # ccedilla
+/L 1853 2 0x13f 1,152 # Lslash "Polish L with a slash"
+/l 740 2 0x144 1,153 # lslash "Polish l with a slash"
+/O 2593 2 0x140 1,80 # Oslash
+/o 2037 0 0x145 1,81 # oslash
+oA 2223 2 0x8f 1,34 # Aring
+oa 1853 2 0x86 1,35 # aring
+a" 1110 2 0x13a 1,16 # hungarumlaut "Hungarian umlaut"
+a- 1110 2 0x135 1,8 # macron "macron or bar accent"
+a. 1110 2 0x137 1,15 # dotaccent "dot accent"
+a^ 1110 2 0x5e 1,3 # circumflex "circumflex accent"
+aa 1110 2 0x120 1,6 # acute "acute accent"
+ga 1110 2 0x121 1,0 # grave "grave accent"
+ab 1110 2 0x136 1,22 # breve "breve accent"
+ac 1110 0 0x139 1,17 # cedilla "cedilla accent"
+ad 1110 2 0x122 1,7 # dieresis "umlaut or dieresis"
+ah 1110 2 0x13c 1,19 # caron "h\('a\(vcek accent"
+ao 1110 2 0x138 1,14 # ring "ring or circle accent"
+a~ 1110 2 0x7e 1,2 # tilde "tilde accent"
+ho 1110 0 0x13b 1,18 # ogonek "hook or ogonek accent"
+.i 927 0 0x142 1,239 # dotlessi "i without a dot"
+Cs 1853 2 0x12f 4,24 # currency "Scandinavian currency sign"
+Do 1853 2 0x24 0,36 # dollar
+Po 1853 2 0x9c 4,11 # sterling
+Ye 1853 2 0x9d 4,12 # yen
+Fn 1853 2 0x9f 4,14 # florin
+ct 1853 2 0x9b 4,19 # cent
+Fo 1853 0 0xae 4,9 # guillemotleft
+Fc 1110 0 0x4bb 4,20 # guillemotright
+fo 1110 0 0x127 4,35 # guilsinglleft
+fc 1110 0 0x128 4,36 # guilsinglright
+r! 1110 1 0xad 4,7 # exclamdown
+r? 2037 1 0xa8 4,8 # questiondown
+fi 1667 2 0x130 4,54 # fi "fi ligature"
+fl 1667 2 0x131 4,55 # fl "fl ligature"
+OK 1667 0 0x3d6 --- # \& "check mark, tick"
+Of 1233 2 0xa6 4,15 # ordfeminine
+Om 1217 2 0xa7 4,16 # ordmasculine
+S1 1110 2 0x156 4,78 # onesuperior
+S2 1110 2 0xfd 4,20 # twosuperior
+S3 1110 2 0x14d 4,26 # threesuperior
+<- 3290 0 0x1b 6,22 # arrowleft
+-> 3290 0 0x1a 6,21 # arrowright
+<> 3473 0 0x1d 6,25 # arrowboth "horizontal double-headed arrow"
+da 2010 0 0x19 6,24 # arrowdown
+ua 2010 0 0x18 6,23 # arrowup
+va 2010 0 0x12 6,26 # \& "vertical double-headed arrow"
+lA 2010 0 0x3dc 6,57 # arrowdblleft
+rA 2010 0 0x3de 6,56 # arrowdblright
+hA 2010 0 0x3db 6,60 # arrowdblboth "horizontal double-headed double arrow"
+dA 2010 0 0x3df 6,59 # arrowdbldown
+uA 2010 0 0x3dd 6,58 # arrowdblup
+ba 3333 2 0xb3 3,9 # bar
+bb 867 2 0x7c 0,124 # brokenbar
+br 3333 0 0x1db 3,9 # br "box rule with traditional troff metrics"
+ru 3333 0 0x123 4,34 # ru "baseline rule"
+ul 1853 0 0x5f 0,95 # ul "underline with traditional troff metrics"
+bv 3333 0 0x3f4 3,9 # bv "bold vertical"
+ci 2843 0 0x9 4,1 # circle
+bu 2120 0 0x7 4,0 # bullet
+co 2457 2 0x154 4,23 # copyright
+rg 2457 2 0x155 4,22 # registered
+tm 3333 2 0x170 4,41 # trademark
+dd 1853 2 0x12b 4,40 # daggerdbl "double dagger sign"
+dg 1853 2 0x12a 4,39 # dagger
+ps 1790 2 0x14 4,5 # paragraph
+sc 1853 2 0x15 4,6 # section
+de 1333 2 0xf8 6,36 # degree
+em 3333 0 0x123 4,34 # emdash "em dash"
+en 1853 0 0x132 4,33 # endash "en dash"
+%0 3333 2 0x129 4,75 # perthousand "per thousand, per mille sign"
+12 2780 2 0xab 4,17 # onehalf
+14 2780 2 0xac 4,18 # onequarter
+34 2780 2 0x12e 4,25 # threequarters
+f/ 556 2 0x158 6,6 # fraction "bar for fractions"
+fm 556 0 0x3a2 6,45 # minute "footmark, prime"
+sd 556 0 0x3b2 6,46 # second
+ha 556 2 0x4c3 6,85 # asciicircum "\s-2ASCII\s+2 circumflex, hat, caret"
+ti 556 0 0x4c4 6,12 # asciitilde "\s-2ASCII\s0 tilde, large tilde"
+hy 1947 0 0x2d 6,0 # hyphen
+lB 927 2 0x5b 0,91 # bracketleft
+rB 927 2 0x5d 0,93 # bracketright
+lC 1113 2 0x7b 0,123 # braceleft
+rC 1113 2 0x7d 0,125 # braceright
+la 1113 0 0x3e1 6,10 # angleleft "left angle bracket"
+ra 1113 0 0x3f1 6,11 # angleright "right angle bracket"
+Bq 1110 0 0x4b9 4,63 # quotedblbase "low double comma quote"
+bq 1110 0 0x4b8 6,62 # quotesinglbase "low single comma quote"
+lq 1110 2 0x125 4,32 # quotedblleft
+rq 1110 2 0x4ba 6,31 # quotedblright
+oq 740 2 0x176 4,29 # quoteleft "single open quote"
+aq 637 2 0x27 0,39 # quotesingle "apostrophe quote"
+at 3383 2 0x40 0,64 # at
+.C1 1947 0 0x2d 0,45 # - minus "minus sign from current font"
+sh 1853 2 0x23 0,35 # numbersign
+sl 927 2 0x2f 0,47 # slash
+rs 927 2 0x5c 0,92 # backslash
+3d 927 0 0x35c 6,102 # therefore
+tf 927 0 0x35c 6,102 # therefore
+*A 927 0 0x341 8,0 # Alpha
+*B 927 0 0x342 8,2 # Beta
+*C 927 0 0x358 8,28 # Xi
+*D 927 0 0x344 8,8 # Delta
+*E 927 0 0x345 8,10 # Epsilon
+*F 2377 0 0x346 8,44 # Phi
+*G 1907 0 0x347 8,6 # Gamma
+*H 1907 0 0x351 8,16 # Theta
+*I 1907 0 0x349 8,18 # Iota
+*K 1907 0 0x34b 8,20 # Kappa
+*L 1907 0 0x34c 8,22 # Lambda
+*M 1907 0 0x34d 8,24 # Mu
+*N 1907 0 0x34e 8,26 # Nu
+*O 1907 0 0x34f 8,30 # Omicron
+*P 1907 0 0x350 8,32 # Pi
+*Q 1907 0 0x359 8,48 # Psi
+*R 1907 0 0x352 8,34 # Rho
+*S 1973 0 0x353 8,36 # Sigma
+*T 1973 0 0x354 8,40 # Tau
+*U 1973 0 0x3a1 8,76 # Upsilon
+*W 2547 0 0x357 8,50 # Omega
+*X 1973 0 0x343 8,36 # Chi
+*Y 1973 0 0x348 8,14 # Eta
+*Z 1973 0 0x35a 8,12 # Zeta
+*a 2023 0 0xe0 8,1 # alpha
+*b 1893 0 0xe1 8,3 # beta
+*c 1893 0 0x378 8,29 # xi
+*d 1890 0 0xeb 8,9 # delta
+*e 1890 0 0x36e 8,70 # epsilon
+*f 1890 0 0x366 8,45 # phi
++f 1890 0 0x36a 8,77 # phi1 "variant phi"
+*g 1890 0 0x367 8,7 # gamma
+*h 1853 0 0xe9 8,17 # theta
++h 1853 0 0x375 8,71 # theta1 "variant theta"
+*i 1853 0 0x369 8,19 # iota
+*k 1853 0 0x36b 8,21 # kappa
+*l 1853 0 0x36c 8,23 # lambda
+*m 1853 0 0xe6 8,25 # mu
+*n 1853 0 0x36e 8,27 # nu
+*o 1853 0 0x36f 8,31 # omicron
+*p 1963 0 0xe3 8,33 # pi
++p 1963 0 0x376 8,78 # omega1 "variant pi, looking like omega"
+*q 1963 0 0x379 8,49 # psi
+*r 1963 0 0x372 8,35 # rho
+*s 2037 0 0xe5 8,37 # sigma
+*t 1463 0 0xe7 8,41 # tau
+*u 1463 0 0x375 8,27 # upsilon
+*w 1463 0 0x377 8,51 # omega
+*x 1463 0 0x363 8,47 # chi
+*y 1463 0 0x368 8,15 # eta
+*z 1463 0 0x37a 8,13 # zeta
+ts 1463 0 0x356 8,39 # sigma1 "terminal sigma"
+~~ 2663 0 0xf7 6,13 # approxequal
+~= 2663 0 0xf7 6,13 # approxequal
+!= 2663 0 0x3b9 6,99 # notequal
+** 927 0 0x32a 0,32 # asteriskmath
++- 1947 0 0xf1 6,1 # plusminus
+<= 2413 0 0xf3 6,2 # lessequal
+== 2413 0 0x3ba 8,14 # equivalence
+=~ 2413 0 0x340 8,116 # congruent
+>= 1893 0 0x3b3 8,3 # greaterequal
+AN 1893 0 0x3d9 8,85 # logicaland
+OR 1893 0 0x3da 8,86 # logicalor
+no 1893 0 0x3d8 8,20 # logicalnot
+te 1893 0 0x324 8,121 # existential "there exists, existential quantifier"
+fa 1893 0 0x322 8,122 # universal "for all, universal quantifier"
+Ah 1893 0 0x3c0 9,0 # aleph
+Im 1893 0 0x3c1 8,21 # Ifraktur "Fraktur I, imaginary"
+Re 1893 0 0x3c2 8,22 # Rfraktur "Fraktur R, real"
+if 1893 0 0x3a5 8,19 # infinity
+md 1893 0 0x3b7 8,32 # dotmath
+mo 1893 0 0x3ce 8,15 # element
+mu 1893 0 0x3b4 8,39 # multiply
+nc 1893 0 0x3cb 8,197 # uni2285
+nm 1893 0 0x3cf 8,209 # notelement
+pl 927 0 0x32b 0,93 # plusmath "plus sign in special font"
+eq 1947 0 0x33d 0,61 # equalmath "equals sign in special font"
+pt 1947 0 0x3b5 6,4 # proportional
+pp 1947 0 0x35e 8,89 # perpendicular
+sb 1947 0 0x3cc 6,67 # propersubset
+sp 1947 0 0x3c9 6,68 # propersuperset
+ib 1947 0 0x3cd 6,69 # reflexsubset
+ip 1947 0 0x3ca 6,70 # reflexsuperset
+ap 1947 0 0x37e 6,12 # similar
+pd 1947 0 0x3b6 6,34 # partialdiff "partial differentiation sign"
+c* 1947 0 0x3c4 6,80 # circlemultiply "multiply sign in a circle"
+c+ 1947 0 0x3c5 6,81 # circleplus "plus sign in a circle"
+ca 2620 0 0xef 6,16 # intersection "intersection, cap"
+cu 2620 0 0x3c8 6,66 # union "union, cup"
+di 1947 0 0x3b8 6,8 # divide "division sign"
+-h 3333 0 0xc4 3,8 # hbar
+hbar "
+gr 3333 0 0x3d1 6,33 # gradient
+es 2593 0 0x3c6 0,79 # emptyset
+CL 2510 0 0x5 5,168 # club "club suit"
+SP 2510 0 0x6 5,171 # spade "spade suit"
+HE 2510 0 0x3 5,170 # heart "heart suit"
+DI 2510 0 0x4 5,169 # diamond "diamond suit"
+CR 2510 0 0x3bf 5,20 # carriagereturn "carriage return symbol"
+st 2510 0 0x327 6,71 # suchthat
+/_ 2510 0 0x3d0 6,79 # angle
+<< 1853 0 0xae 6,77 # "" "much less"
+>> 1853 0 0xaf 6,78 # "" "much greater"
+wp 1853 0 0x3c3 6,53 # weierstrass "Weierstrass p"
+lz 1853 0 0x3e0 6,95 # lozenge
+an 3333 0 0x3be 3,8 # arrowhorizex "horizontal arrow extension"
+pc 927 0 0xfa 6,32 # periodcentered
+mc 1853 0 0xe6 8,25 # mu
+t+- 1947 0 0xf1 6,1 # plusminus
+tmu 1893 0 0x3b4 8,39 # multiply
+tdi 1947 0 0x3b8 6,8 # divide "division sign"
+tno 1893 0 0x3d8 8,20 # logicalnot
diff --git a/font/devlbp/TB b/font/devlbp/TB
new file mode 100644
index 0000000..57d6696
--- /dev/null
+++ b/font/devlbp/TB
@@ -0,0 +1,422 @@
+name TB
+lbpname Dutch-Bold
+special
+spacewidth 833
+slant 0
+ligatures fi fl 0
+charset
+ha 1110 2 0x4c3 0,94 # asciicircum
+ti 1110 0 0x4c4 0,126 # asciitilde
+vS 1853 2 0x169 1,176 # Scaron
+vZ 2223 2 0x16e 1,206 # Zcaron
+vs 1297 2 0x173 1,177 # scaron
+vz 1480 2 0x174 1,207 # zcaron
+:Y 2407 2 0x16d 1,74 # Ydieresis
+tm 3333 2 0x170 4,41 # trademark
+aq 927 2 0x27 0,39 # quotesingle
+space 833 0 0x20 0,32
+! 1110 2 0x21 0,33 # exclam
+" 1850 2 0x22 0,34 # quotedbl
+dq 1850 2 0x22 0,34 # quotedbl
+# 1667 2 0x23 0,35 # numbersign
+sh 1667 2 0x23 0,35 # "
+$ 1667 2 0x24 0,36 # dollar
+Do 1667 2 0x24 0,36 # "
+% 3333 2 0x25 0,37 # percent
+& 2777 2 0x26 0,38 # ampersand
+' 927 2 0x27 0,39 # quoteright
+cq 927 2 0x27 0,39 # quoteright
+( 1110 2 0x28 0,40 # parenleft
+) 1110 2 0x29 0,41 # parenright
+* 1667 2 0x2a 0,42 # asterisk
++ 1900 0 0x2b 0,43 # plus
+, 833 0 0x2c 0,44 # comma
+- 1900 0 0x2d 0,45 # hyphen
+\- 1900 0 0x2d 0,45 # hyphen
+hy 1900 0 0x2d 0,45 # "
+. 833 0 0x2e 0,46 # period
+/ 927 2 0x2f 0,47 # slash
+sl 927 2 0x2f 0,47 # "
+0 1667 2 0x30 0,48 # zero
+1 1667 2 0x31 0,49 # one
+2 1667 2 0x32 0,50 # two
+3 1667 2 0x33 0,51 # three
+4 1667 2 0x34 0,52 # four
+5 1667 2 0x35 0,53 # five
+6 1667 2 0x36 0,54 # six
+7 1667 2 0x37 0,55 # seven
+8 1667 2 0x38 0,56 # eight
+9 1667 2 0x39 0,57 # nine
+: 0 0 0x3a 0,58 # colon
+; 1110 0 0x3b 0,59 # semicolon
+< 1900 0 0x3c 0,60 # less
+= 1900 0 0x3d 0,61 # equal
+> 1900 0 0x3e 0,62 # greater
+? 1667 2 0x3f 0,63 # question
+@ 3100 2 0x40 0,64 # at
+at 3100 2 0x40 0,64 # "
+A 2407 2 0x41 0,65 # A
+B 2223 2 0x42 0,66 # B
+C 2407 2 0x43 0,67 # C
+D 2407 2 0x44 0,68 # D
+E 2223 2 0x45 0,69 # E
+F 2037 2 0x46 0,70 # F
+G 2593 2 0x47 0,71 # G
+H 2593 2 0x48 0,72 # H
+I 1297 2 0x49 0,73 # I
+J 1667 2 0x4a 0,74 # J
+K 2593 2 0x4b 0,75 # K
+L 2223 2 0x4c 0,76 # L
+M 3147 2 0x4d 0,77 # M
+N 2407 2 0x4e 0,78 # N
+O 2593 2 0x4f 0,79 # O
+P 2037 2 0x50 0,80 # P
+Q 2593 2 0x51 0,81 # Q
+R 2407 2 0x52 0,82 # R
+S 1853 2 0x53 0,83 # S
+T 2223 2 0x54 0,84 # T
+U 2407 2 0x55 0,85 # U
+V 2407 2 0x56 0,86 # V
+W 3333 2 0x57 0,87 # W
+X 2407 2 0x58 0,88 # X
+Y 2407 2 0x59 0,89 # Y
+Z 2223 2 0x5a 0,90 # Z
+[ 1110 2 0x5b 0,91 # bracketleft
+lB 1110 2 0x5b 0,91 # "
+\ 927 2 0x5c 0,92 # backslash
+rs 927 2 0x5c 0,92 # "
+] 1110 2 0x5d 0,93 # bracketright
+rB 1110 2 0x5d 0,93 # "
+a^ 1110 2 0x5e 0,94 # circumflex
+^ 1110 2 0x5e 0,94 # "
+_ 1667 0 0x5f 0,95 # underscore
+` 1110 2 0x60 0,96 # quoteleft
+oq 1110 2 0x60 0,96 # "
+a 1667 0 0x61 0,97 # a
+b 1853 2 0x62 0,98 # b
+c 1480 0 0x63 0,99 # c
+d 1853 2 0x64 0,100 # d
+e 1480 0 0x65 0,101 # e
+f 1110 2 0x66 0,102 # f
+g 1667 1 0x67 0,103 # g
+h 1853 2 0x68 0,104 # h
+i 927 2 0x69 0,105 # i
+j 1110 2 0x6a 0,106 # j
+k 1853 2 0x6b 0,107 # k
+l 927 2 0x6c 0,108 # l
+m 2777 0 0x6d 0,109 # m
+n 1853 0 0x6e 0,110 # n
+o 1667 0 0x6f 0,111 # o
+p 1853 1 0x70 0,112 # p
+q 1853 1 0x71 0,113 # q
+r 1480 0 0x72 0,114 # r
+s 1297 0 0x73 0,115 # s
+t 1110 2 0x74 0,116 # t
+u 1853 0 0x75 0,117 # u
+v 1667 0 0x76 0,118 # v
+w 2407 0 0x77 0,119 # w
+x 1667 0 0x78 0,120 # x
+y 1667 1 0x79 0,121 # y
+z 1480 0 0x7a 0,122 # z
+lC 1313 2 0x7b 0,123 # braceleft
+{ 1313 2 0x7b 0,123 # "
+ba 733 2 0x7c 0,124 # bar
+| 733 2 0x7c 0,124 # "
+rC 1313 2 0x7d 0,125 # braceright
+} 1313 2 0x7d 0,125 # "
+a~ 1110 2 0x7e 0,126 # tilde
+~ 1110 2 0x7e 0,126 # "
+-D 2407 2 0x13d 1,78 # Eth "Icelandic uppercase eth"
+Sd 1667 2 0x148 1,87 # eth "Icelandic lowercase eth"
+TP 2037 2 0x13e 1,88 # Thorn "Icelandic uppercase thorn"
+Tp 1853 3 0x143 1,89 # thorn "Icelandic lowercase thorn"
+AE 3333 2 0x92 1,36 # AE
+ae 2407 0 0x91 1,37 # ae
+OE 3333 2 0x141 1,166 # OE
+oe 2407 0 0x146 1,167 # oe
+ij 1990 0 0x150 1,139 # ij "Dutch ij ligature"
+ss 1853 2 0x147 1,23 # germandbls
+'A 2407 2 0x15a 1,26 # Aacute
+'E 2223 2 0x90 1,40 # Eacute
+'I 1297 2 0x161 1,48 # Iacute
+'O 2593 2 0x165 1,58 # Oacute
+'U 2407 2 0x16a 1,66 # Uacute
+'a 1667 2 0xa0 1,27 # aacute
+'e 1480 2 0x82 1,41 # eacute
+'i 927 2 0xa1 1,49 # iacute
+'o 1667 2 0xa2 1,59 # oacute
+'u 1667 2 0x95 1,65 # uacute
+:A 2407 2 0x8e 1,30 # Adieresis
+:E 2223 2 0x15f 1,44 # Edieresis
+:I 1297 2 0x163 1,52 # Idieresis
+:O 2593 2 0x99 1,62 # Odieresis
+:U 2407 2 0x9a 1,70 # Udieresis
+:Y 2407 2 0x16d 1,74 # Ydieresis
+:a 1667 2 0x84 1,31 # adieresis
+:e 1480 2 0x89 1,45 # edieresis
+:i 927 2 0x8b 1,53 # idieresis
+:o 1667 2 0x94 1,63 # odieresis
+:u 1853 2 0x81 1,71 # udieresis
+:y 1667 3 0x98 1,75 # ydieresis
+^A 2407 2 0x15b 1,28 # Acircumflex
+^E 2223 2 0x15e 1,42 # Ecircumflex
+^I 1297 2 0x162 1,50 # Icircumflex
+^O 2593 2 0x166 1,60 # Ocircumflex
+^U 2407 2 0x16b 1,68 # Ucircumflex
+^a 1667 2 0x83 1,29 # acircumflex
+^e 1480 2 0x88 1,43 # ecircumflex
+^i 927 2 0x8c 1,51 # icircumflex
+^o 1667 2 0x93 1,61 # ocircumflex
+^u 1853 2 0x96 1,69 # ucircumflex
+`A 2407 2 0x15c 1,32 # Agrave
+`E 2223 2 0x160 1,46 # Egrave
+`I 1297 2 0x164 1,54 # Igrave
+`O 2593 2 0x167 1,64 # Ograve
+`U 2407 2 0x16c 1,72 # Ugrave
+`a 1667 2 0x85 1,33 # agrave
+`e 1480 2 0x8a 1,47 # egrave
+`i 927 2 0x8d 1,55 # igrave
+`o 1667 2 0x95 1,65 # ograve
+`u 1853 2 0x97 1,73 # ugrave
+~A 2407 2 0x28e 1,26 # Atilde
+~N 2407 2 0xa5 1,56 # Ntilde
+~O 2593 2 0x168 1,82 # Otilde
+~a 1667 2 0x284 --- # atilde
+~n 1853 2 0xa4 1,57 # ntilde
+~o 1667 2 0x172 1,83 # otilde
+vS 1853 2 0x169 1,176 # Scaron
+vs 1297 2 0x173 1,177 # scaron
+vZ 2223 2 0x16e 1,206 # Zcaron
+vz 1480 2 0x174 1,207 # zcaron
+,C 2407 2 0x80 1,38 # Ccedilla
+,c 1480 0 0x87 1,39 # ccedilla
+/L 2223 2 0x13f 1,152 # Lslash "Polish L with a slash"
+/l 927 2 0x144 1,153 # lslash "Polish l with a slash"
+/O 2593 2 0x140 1,80 # Oslash
+/o 1667 0 0x145 1,81 # oslash
+oA 2407 2 0x8f 1,34 # Aring
+oa 1667 2 0x86 1,35 # aring
+a" 1110 2 0x13a 1,16 # hungarumlaut "Hungarian umlaut"
+a- 1110 2 0x135 1,8 # macron "macron or bar accent"
+a. 1110 2 0x137 1,15 # dotaccent "dot accent"
+a^ 1110 2 0x5e 1,3 # circumflex "circumflex accent"
+aa 1110 2 0x120 1,6 # acute "acute accent"
+ga 1110 2 0x121 1,0 # grave "grave accent"
+ab 1110 2 0x136 1,22 # breve "breve accent"
+ac 1110 0 0x139 1,17 # cedilla "cedilla accent"
+ad 1110 2 0x122 1,7 # dieresis "umlaut or dieresis"
+ah 1110 2 0x13c 1,19 # caron "h\('a\(vcek accent"
+ao 1110 2 0x138 1,14 # ring "ring or circle accent"
+a~ 1110 2 0x7e 1,2 # tilde "tilde accent"
+ho 1110 0 0x13b 1,18 # ogonek "hook or ogonek accent"
+.i 927 0 0x142 1,239 # dotlessi "i without a dot"
+Cs 1667 2 0x12f 4,24 # currency "Scandinavian currency sign"
+Do 1667 2 0x24 0,36 # dollar
+Po 1667 2 0x9c 4,11 # sterling
+Ye 1667 2 0x9d 4,12 # yen
+Fn 1667 2 0x9f 4,14 # florin
+ct 1667 2 0x9b 4,19 # cent
+Fo 1667 0 0xae 4,9 # guillemotleft
+Fc 1000 0 0x4bb 4,20 # guillemotright
+fo 1110 0 0x127 4,35 # guilsinglleft
+fc 1110 0 0x128 4,36 # guilsinglright
+r! 1110 1 0xad 4,7 # exclamdown
+r? 1667 1 0xa8 4,8 # questiondown
+fi 1853 2 0x130 4,54 # fi "fi ligature"
+fl 1853 2 0x131 4,55 # fl "fl ligature"
+OK 1853 0 0x3d6 --- # \& "check mark, tick"
+Of 1000 2 0xa6 4,15 # ordfeminine
+Om 1100 2 0xa7 4,16 # ordmasculine
+S1 1000 2 0x156 4,78 # onesuperior
+S2 1000 2 0xfd 4,20 # twosuperior
+S3 1000 2 0x14d 4,26 # threesuperior
+<- 3290 0 0x1b 6,22 # arrowleft
+-> 3290 0 0x1a 6,21 # arrowright
+<> 3473 0 0x1d 6,25 # arrowboth "horizontal double-headed arrow"
+da 2010 0 0x19 6,24 # arrowdown
+ua 2010 0 0x18 6,23 # arrowup
+va 2010 0 0x12 6,26 # \& "vertical double-headed arrow"
+lA 2010 0 0x3dc 6,57 # arrowdblleft
+rA 2010 0 0x3de 6,56 # arrowdblright
+hA 2010 0 0x3db 6,60 # arrowdblboth "horizontal double-headed double arrow"
+dA 2010 0 0x3df 6,59 # arrowdbldown
+uA 2010 0 0x3dd 6,58 # arrowdblup
+ba 3333 2 0xb3 3,9 # bar
+bb 733 2 0x7c 0,124 # brokenbar
+br 3333 0 0x1db 3,9 # br "box rule with traditional troff metrics"
+ru 3333 0 0x123 4,34 # ru "baseline rule"
+ul 1667 0 0x5f 0,95 # ul "underline with traditional troff metrics"
+bv 3333 0 0xb3 3,9 # bv "bold vertical"
+ci 2843 0 0x9 4,1 # circle
+bu 2120 0 0x7 4,0 # bullet
+co 2490 2 0x154 4,23 # copyright
+rg 2490 2 0x155 4,22 # registered
+tm 3333 2 0x170 4,41 # trademark
+dd 1667 2 0x12b 4,40 # daggerdbl "double dagger sign"
+dg 1667 2 0x12a 4,39 # dagger
+ps 1800 2 0x14 4,5 # paragraph
+sc 1667 2 0x15 4,6 # section
+de 1333 2 0xf8 6,36 # degree
+em 3333 0 0x123 4,34 # emdash "em dash"
+en 1667 0 0x132 4,33 # endash "en dash"
+%0 3333 2 0x129 4,75 # perthousand "per thousand, per mille sign"
+12 2500 2 0xab 4,17 # onehalf
+14 2500 2 0xac 4,18 # onequarter
+34 2500 2 0x12e 4,25 # threequarters
+f/ 927 2 0x158 6,6 # fraction "bar for fractions"
+fm 927 0 0x3a2 6,45 # minute "footmark, prime"
+sd 927 0 0x3b2 6,46 # second
+ha 927 2 0x4c3 6,85 # asciicircum "\s-2ASCII\s+2 circumflex, hat, caret"
+ti 927 0 0x4c4 6,12 # asciitilde "\s-2ASCII\s0 tilde, large tilde"
+hy 1900 0 0x2d 6,0 # hyphen
+lB 1110 2 0x5b 0,91 # bracketleft
+rB 1110 2 0x5d 0,93 # bracketright
+lC 1313 2 0x7b 0,123 # braceleft
+rC 1313 2 0x7d 0,125 # braceright
+la 1313 0 0x3e1 6,10 # angleleft "left angle bracket"
+ra 1313 0 0x3f1 6,11 # angleright "right angle bracket"
+Bq 1667 0 0x4b9 4,63 # quotedblbase "low double comma quote"
+bq 1667 0 0x4b8 6,62 # quotesinglbase "low single comma quote"
+lq 1667 2 0x125 4,32 # quotedblleft
+rq 1667 2 0x4ba 6,31 # quotedblright
+oq 1110 2 0x176 4,29 # quoteleft "single open quote"
+aq 927 2 0x27 0,39 # quotesingle "apostrophe quote"
+at 3100 2 0x40 0,64 # at
+.C1 1900 0 0x2d 0,45 # - minus "minus sign from current font"
+sh 1667 2 0x23 0,35 # numbersign
+sl 927 2 0x2f 0,47 # slash
+rs 927 2 0x5c 0,92 # backslash
+3d 927 0 0x35c 6,102 # therefore
+tf 927 0 0x35c 6,102 # therefore
+*A 927 0 0x341 8,0 # Alpha
+*B 927 0 0x342 8,2 # Beta
+*C 927 0 0x358 8,28 # Xi
+*D 927 0 0x344 8,8 # Delta
+*E 927 0 0x345 8,10 # Epsilon
+*F 2560 0 0x346 8,44 # Phi
+*G 2003 0 0x347 8,6 # Gamma
+*H 2003 0 0x351 8,16 # Theta
+*I 2003 0 0x349 8,18 # Iota
+*K 2003 0 0x34b 8,20 # Kappa
+*L 2003 0 0x34c 8,22 # Lambda
+*M 2003 0 0x34d 8,24 # Mu
+*N 2003 0 0x34e 8,26 # Nu
+*O 2003 0 0x34f 8,30 # Omicron
+*P 2003 0 0x350 8,32 # Pi
+*Q 2003 0 0x359 8,48 # Psi
+*R 2003 0 0x352 8,34 # Rho
+*S 2203 0 0x353 8,36 # Sigma
+*T 2203 0 0x354 8,40 # Tau
+*U 2203 0 0x3a1 8,76 # Upsilon
+*W 2510 0 0x357 8,50 # Omega
+*X 2203 0 0x343 8,36 # Chi
+*Y 2203 0 0x348 8,14 # Eta
+*Z 2203 0 0x35a 8,12 # Zeta
+*a 1787 0 0xe0 8,1 # alpha
+*b 1633 0 0xe1 8,3 # beta
+*c 1633 0 0x378 8,29 # xi
+*d 1610 0 0xeb 8,9 # delta
+*e 1610 0 0x36e 8,70 # epsilon
+*f 1610 0 0x366 8,45 # phi
++f 1610 0 0x36a 8,77 # phi1 "variant phi"
+*g 1610 0 0x367 8,7 # gamma
+*h 1587 0 0xe9 8,17 # theta
++h 1587 0 0x375 8,71 # theta1 "variant theta"
+*i 1587 0 0x369 8,19 # iota
+*k 1587 0 0x36b 8,21 # kappa
+*l 1587 0 0x36c 8,23 # lambda
+*m 1853 0 0xe6 8,25 # mu
+*n 1853 0 0x36e 8,27 # nu
+*o 1853 0 0x36f 8,31 # omicron
+*p 1920 0 0xe3 8,33 # pi
++p 1920 0 0x376 8,78 # omega1 "variant pi, looking like omega"
+*q 1920 0 0x379 8,49 # psi
+*r 1920 0 0x372 8,35 # rho
+*s 1747 0 0xe5 8,37 # sigma
+*t 1473 0 0xe7 8,41 # tau
+*u 1473 0 0x375 8,27 # upsilon
+*w 1473 0 0x377 8,51 # omega
+*x 1473 0 0x363 8,47 # chi
+*y 1473 0 0x368 8,15 # eta
+*z 1473 0 0x37a 8,13 # zeta
+ts 1473 0 0x356 8,39 # sigma1 "terminal sigma"
+~~ 2663 0 0xf7 6,13 # approxequal
+~= 2663 0 0xf7 6,13 # approxequal
+!= 2663 0 0x3b9 6,99 # notequal
+** 833 0 0x32a 0,32 # asteriskmath
++- 1900 0 0xf1 6,1 # plusminus
+<= 2407 0 0xf3 6,2 # lessequal
+== 2407 0 0x3ba 8,14 # equivalence
+=~ 2407 0 0x340 8,116 # congruent
+>= 1633 0 0x3b3 8,3 # greaterequal
+AN 1633 0 0x3d9 8,85 # logicaland
+OR 1633 0 0x3da 8,86 # logicalor
+no 1633 0 0x3d8 8,20 # logicalnot
+te 1633 0 0x324 8,121 # existential "there exists, existential quantifier"
+fa 1633 0 0x322 8,122 # universal "for all, universal quantifier"
+Ah 1633 0 0x3c0 9,0 # aleph
+Im 1633 0 0x3c1 8,21 # Ifraktur "Fraktur I, imaginary"
+Re 1633 0 0x3c2 8,22 # Rfraktur "Fraktur R, real"
+if 1633 0 0x3a5 8,19 # infinity
+md 1633 0 0x3b7 8,32 # dotmath
+mo 1633 0 0x3ce 8,15 # element
+mu 1633 0 0x3b4 8,39 # multiply
+nc 1633 0 0x3cb 8,197 # uni2285
+nm 1633 0 0x3cf 8,209 # notelement
+pl 1110 0 0x32b 0,93 # plusmath "plus sign in special font"
+eq 1900 0 0x33d 0,61 # equalmath "equals sign in special font"
+pt 1900 0 0x3b5 6,4 # proportional
+pp 1900 0 0x35e 8,89 # perpendicular
+sb 1900 0 0x3cc 6,67 # propersubset
+sp 1900 0 0x3c9 6,68 # propersuperset
+ib 1900 0 0x3cd 6,69 # reflexsubset
+ip 1900 0 0x3ca 6,70 # reflexsuperset
+ap 1900 0 0x37e 6,12 # similar
+pd 1900 0 0x3b6 6,34 # partialdiff "partial differentiation sign"
+c* 1900 0 0x3c4 6,80 # circlemultiply "multiply sign in a circle"
+c+ 1900 0 0x3c5 6,81 # circleplus "plus sign in a circle"
+ca 2620 0 0xef 6,16 # intersection "intersection, cap"
+cu 2620 0 0x3c8 6,66 # union "union, cup"
+di 1900 0 0x3b8 6,8 # divide "division sign"
+-h 3333 0 0xc4 3,8 # hbar
+hbar "
+gr 3333 0 0x3d1 6,33 # gradient
+es 2593 0 0x3c6 0,79 # emptyset
+CL 2510 0 0x5 5,168 # club "club suit"
+SP 2510 0 0x6 5,171 # spade "spade suit"
+HE 2510 0 0x3 5,170 # heart "heart suit"
+DI 2510 0 0x4 5,169 # diamond "diamond suit"
+CR 2510 0 0x3bf 5,20 # carriagereturn "carriage return symbol"
+st 2510 0 0x327 6,71 # suchthat
+/_ 2510 0 0x3d0 6,79 # angle
+<< 1667 0 0xae 6,77 # "" "much less"
+>> 1667 0 0xaf 6,78 # "" "much greater"
+wp 1667 0 0x3c3 6,53 # weierstrass "Weierstrass p"
+lz 1667 0 0x3e0 6,95 # lozenge
+an 3333 0 0x3be 3,8 # arrowhorizex "horizontal arrow extension"
+pc 833 0 0xfa 6,32 # periodcentered
+mc 1853 0 0xe6 8,25 # mu
+t+- 1900 0 0xf1 6,1 # plusminus
+tmu 1633 0 0x3b4 8,39 # multiply
+tdi 1900 0 0x3b8 6,8 # divide "division sign"
+tno 1633 0 0x3d8 8,20 # logicalnot
+kernpairs
+V A -120
+W A -96
+Y A -72
+Y C -48
+A V -120
+A W -120
+A Y -120
+V a -24
+Y a -48
+V c -48
+Y c -48
+P e -48
+V e -48
+Y e -72
+V o -48
+W o -48
+Y o -96
+A v -48
+A w -48
diff --git a/font/devlbp/TBI b/font/devlbp/TBI
new file mode 100644
index 0000000..ba247b7
--- /dev/null
+++ b/font/devlbp/TBI
@@ -0,0 +1,402 @@
+name TBI
+lbpname Dutch-BoldItalic
+special
+spacewidth 833
+slant 18.49
+ligatures fi fl 0
+charset
+ha 1110 2 0x4c3 0,94 # asciicircum
+ti 1110 0 0x4c4 0,126 # asciitilde
+vS 1853 2 0x169 1,176 # Scaron
+vZ 2037 2 0x16e 1,206 # Zcaron
+vs 1297 2 0x173 1,177 # scaron
+vz 1297 2 0x174 1,207 # zcaron
+:Y 2037 2 0x16d 1,74 # Ydieresis
+tm 3333 2 0x170 4,41 # trademark
+aq 927 2 0x27 0,39 # quotesingle
+space 833 0 0x20 0,32
+! 1297 2 0x21 0,33 # exclam
+" 1850 2 0x22 0,34 # quotedbl
+dq 1850 2 0x22 0,34 # quotedbl
+# 1667 2 0x23 0,35 # numbersign
+sh 1667 2 0x23 0,35 # "
+$ 1667 2 0x24 0,36 # dollar
+Do 1667 2 0x24 0,36 # "
+% 2777 2 0x25 0,37 # percent
+& 2593 2 0x26 0,38 # ampersand
+' 927 2 0x27 0,39 # quoteright
+cq 927 2 0x27 0,39 # quoteright
+( 1110 2 0x28 0,40 # parenleft
+) 1110 2 0x29 0,41 # parenright
+* 1667 2 0x2a 0,42 # asterisk
++ 1900 0 0x2b 0,43 # plus
+, 833 0 0x2c 0,44 # comma
+- 2020 0 0x2d 0,45 # hyphen
+\- 2020 0 0x2d 0,45 # hyphen
+hy 2020 0 0x2d 0,45 # "
+. 833 0 0x2e 0,46 # period
+/ 927 2 0x2f 0,47 # slash
+sl 927 2 0x2f 0,47 # "
+0 1667 2 0x30 0,48 # zero
+1 1667 2 0x31 0,49 # one
+2 1667 2 0x32 0,50 # two
+3 1667 2 0x33 0,51 # three
+4 1667 2 0x34 0,52 # four
+5 1667 2 0x35 0,53 # five
+6 1667 2 0x36 0,54 # six
+7 1667 2 0x37 0,55 # seven
+8 1667 2 0x38 0,56 # eight
+9 1667 2 0x39 0,57 # nine
+: 1110 0 0x3a 0,58 # colon
+; 1110 0 0x3b 0,59 # semicolon
+< 1900 0 0x3c 0,60 # less
+= 1900 0 0x3d 0,61 # equal
+> 1900 0 0x3e 0,62 # greater
+? 1667 2 0x3f 0,63 # question
+@ 2773 2 0x40 0,64 # at
+at 2773 2 0x40 0,64 # "
+A 2223 2 0x41 0,65 # A
+B 2223 2 0x42 0,66 # B
+C 2223 2 0x43 0,67 # C
+D 2407 2 0x44 0,68 # D
+E 2223 2 0x45 0,69 # E
+F 2223 2 0x46 0,70 # F
+G 2407 2 0x47 0,71 # G
+H 2593 2 0x48 0,72 # H
+I 1297 2 0x49 0,73 # I
+J 1667 2 0x4a 0,74 # J
+K 2223 2 0x4b 0,75 # K
+L 2037 2 0x4c 0,76 # L
+M 2963 2 0x4d 0,77 # M
+N 2407 2 0x4e 0,78 # N
+O 2407 2 0x4f 0,79 # O
+P 2037 2 0x50 0,80 # P
+Q 2407 2 0x51 0,81 # Q
+R 2223 2 0x52 0,82 # R
+S 1853 2 0x53 0,83 # S
+T 2037 2 0x54 0,84 # T
+U 2407 2 0x55 0,85 # U
+V 2223 2 0x56 0,86 # V
+W 2963 2 0x57 0,87 # W
+X 2223 2 0x58 0,88 # X
+Y 2037 2 0x59 0,89 # Y
+Z 2037 2 0x5a 0,90 # Z
+[ 1110 2 0x5b 0,91 # bracketleft
+lB 1110 2 0x5b 0,91 # "
+\ 927 2 0x5c 0,92 # backslash
+rs 927 2 0x5c 0,92 # "
+] 1110 2 0x5d 0,93 # bracketright
+rB 1110 2 0x5d 0,93 # "
+a^ 1110 2 0x5e 0,94 # circumflex
+^ 1110 2 0x5e 0,94 # "
+_ 1667 0 0x5f 0,95 # underscore
+` 1110 2 0x60 0,96 # quoteleft
+oq 1110 2 0x60 0,96 # "
+a 1667 0 0x61 0,97 # a
+b 1667 2 0x62 0,98 # b
+c 1480 0 0x63 0,99 # c
+d 1667 2 0x64 0,100 # d
+e 1480 0 0x65 0,101 # e
+f 1110 2 0x66 0,102 # f
+g 1667 1 0x67 0,103 # g
+h 1853 2 0x68 0,104 # h
+i 927 2 0x69 0,105 # i
+j 927 2 0x6a 0,106 # j
+k 1667 2 0x6b 0,107 # k
+l 927 2 0x6c 0,108 # l
+m 2593 0 0x6d 0,109 # m
+n 1853 0 0x6e 0,110 # n
+o 1667 0 0x6f 0,111 # o
+p 1667 1 0x70 0,112 # p
+q 1667 1 0x71 0,113 # q
+r 1297 0 0x72 0,114 # r
+s 1297 0 0x73 0,115 # s
+t 927 2 0x74 0,116 # t
+u 1853 0 0x75 0,117 # u
+v 1480 0 0x76 0,118 # v
+w 2223 0 0x77 0,119 # w
+x 1667 0 0x78 0,120 # x
+y 1480 1 0x79 0,121 # y
+z 1297 0 0x7a 0,122 # z
+lC 1160 2 0x7b 0,123 # braceleft
+{ 1160 2 0x7b 0,123 # "
+ba 733 2 0x7c 0,124 # bar
+| 733 2 0x7c 0,124 # "
+rC 1160 2 0x7d 0,125 # braceright
+} 1160 2 0x7d 0,125 # "
+a~ 1110 2 0x7e 0,126 # tilde
+~ 1110 2 0x7e 0,126 # "
+-D 2407 2 0x13d 1,78 # Eth "Icelandic uppercase eth"
+Sd 1667 2 0x148 1,87 # eth "Icelandic lowercase eth"
+TP 2037 2 0x13e 1,88 # Thorn "Icelandic uppercase thorn"
+Tp 1667 3 0x143 1,89 # thorn "Icelandic lowercase thorn"
+AE 3147 2 0x92 1,36 # AE
+ae 2407 0 0x91 1,37 # ae
+OE 3147 2 0x141 1,166 # OE
+oe 2407 0 0x146 1,167 # oe
+ij 1807 0 0x150 1,139 # ij "Dutch ij ligature"
+ss 1667 2 0x147 1,23 # germandbls
+'A 2223 2 0x15a 1,26 # Aacute
+'E 2223 2 0x90 1,40 # Eacute
+'I 1297 2 0x161 1,48 # Iacute
+'O 2407 2 0x165 1,58 # Oacute
+'U 2407 2 0x16a 1,66 # Uacute
+'a 1667 2 0xa0 1,27 # aacute
+'e 1480 2 0x82 1,41 # eacute
+'i 927 2 0xa1 1,49 # iacute
+'o 1667 2 0xa2 1,59 # oacute
+'u 1667 2 0x95 1,65 # uacute
+:A 2223 2 0x8e 1,30 # Adieresis
+:E 2223 2 0x15f 1,44 # Edieresis
+:I 1297 2 0x163 1,52 # Idieresis
+:O 2407 2 0x99 1,62 # Odieresis
+:U 2407 2 0x9a 1,70 # Udieresis
+:Y 2037 2 0x16d 1,74 # Ydieresis
+:a 1667 2 0x84 1,31 # adieresis
+:e 1480 2 0x89 1,45 # edieresis
+:i 927 2 0x8b 1,53 # idieresis
+:o 1667 2 0x94 1,63 # odieresis
+:u 1853 2 0x81 1,71 # udieresis
+:y 1480 3 0x98 1,75 # ydieresis
+^A 2223 2 0x15b 1,28 # Acircumflex
+^E 2223 2 0x15e 1,42 # Ecircumflex
+^I 1297 2 0x162 1,50 # Icircumflex
+^O 2407 2 0x166 1,60 # Ocircumflex
+^U 2407 2 0x16b 1,68 # Ucircumflex
+^a 1667 2 0x83 1,29 # acircumflex
+^e 1480 2 0x88 1,43 # ecircumflex
+^i 927 2 0x8c 1,51 # icircumflex
+^o 1667 2 0x93 1,61 # ocircumflex
+^u 1853 2 0x96 1,69 # ucircumflex
+`A 2223 2 0x15c 1,32 # Agrave
+`E 2223 2 0x160 1,46 # Egrave
+`I 1297 2 0x164 1,54 # Igrave
+`O 2407 2 0x167 1,64 # Ograve
+`U 2407 2 0x16c 1,72 # Ugrave
+`a 1667 2 0x85 1,33 # agrave
+`e 1480 2 0x8a 1,47 # egrave
+`i 927 2 0x8d 1,55 # igrave
+`o 1667 2 0x95 1,65 # ograve
+`u 1853 2 0x97 1,73 # ugrave
+~A 2223 2 0x28e 1,26 # Atilde
+~N 2407 2 0xa5 1,56 # Ntilde
+~O 2407 2 0x168 1,82 # Otilde
+~a 1667 2 0x284 --- # atilde
+~n 1853 2 0xa4 1,57 # ntilde
+~o 1667 2 0x172 1,83 # otilde
+vS 1853 2 0x169 1,176 # Scaron
+vs 1297 2 0x173 1,177 # scaron
+vZ 2037 2 0x16e 1,206 # Zcaron
+vz 1297 2 0x174 1,207 # zcaron
+,C 2223 2 0x80 1,38 # Ccedilla
+,c 1480 0 0x87 1,39 # ccedilla
+/L 2037 2 0x13f 1,152 # Lslash "Polish L with a slash"
+/l 927 2 0x144 1,153 # lslash "Polish l with a slash"
+/O 2407 2 0x140 1,80 # Oslash
+/o 1667 0 0x145 1,81 # oslash
+oA 2223 2 0x8f 1,34 # Aring
+oa 1667 2 0x86 1,35 # aring
+a" 1110 2 0x13a 1,16 # hungarumlaut "Hungarian umlaut"
+a- 1110 2 0x135 1,8 # macron "macron or bar accent"
+a. 1110 2 0x137 1,15 # dotaccent "dot accent"
+a^ 1110 2 0x5e 1,3 # circumflex "circumflex accent"
+aa 1110 2 0x120 1,6 # acute "acute accent"
+ga 1110 2 0x121 1,0 # grave "grave accent"
+ab 1110 2 0x136 1,22 # breve "breve accent"
+ac 1110 0 0x139 1,17 # cedilla "cedilla accent"
+ad 1110 2 0x122 1,7 # dieresis "umlaut or dieresis"
+ah 1110 2 0x13c 1,19 # caron "h\('a\(vcek accent"
+ao 1110 2 0x138 1,14 # ring "ring or circle accent"
+a~ 1110 2 0x7e 1,2 # tilde "tilde accent"
+ho 1110 0 0x13b 1,18 # ogonek "hook or ogonek accent"
+.i 927 0 0x142 1,239 # dotlessi "i without a dot"
+Cs 1667 2 0x12f 4,24 # currency "Scandinavian currency sign"
+Do 1667 2 0x24 0,36 # dollar
+Po 1667 2 0x9c 4,11 # sterling
+Ye 1667 2 0x9d 4,12 # yen
+Fn 1667 2 0x9f 4,14 # florin
+ct 1667 2 0x9b 4,19 # cent
+Fo 1667 0 0xae 4,9 # guillemotleft
+Fc 1000 0 0x4bb 4,20 # guillemotright
+fo 1110 0 0x127 4,35 # guilsinglleft
+fc 1110 0 0x128 4,36 # guilsinglright
+r! 1297 1 0xad 4,7 # exclamdown
+r? 1667 1 0xa8 4,8 # questiondown
+fi 1853 2 0x130 4,54 # fi "fi ligature"
+fl 1853 2 0x131 4,55 # fl "fl ligature"
+OK 1853 0 0x3d6 --- # \& "check mark, tick"
+Of 887 2 0xa6 4,15 # ordfeminine
+Om 1000 2 0xa7 4,16 # ordmasculine
+S1 1000 2 0x156 4,78 # onesuperior
+S2 1000 2 0xfd 4,20 # twosuperior
+S3 1000 2 0x14d 4,26 # threesuperior
+<- 3290 0 0x1b 6,22 # arrowleft
+-> 3290 0 0x1a 6,21 # arrowright
+<> 3473 0 0x1d 6,25 # arrowboth "horizontal double-headed arrow"
+da 2010 0 0x19 6,24 # arrowdown
+ua 2010 0 0x18 6,23 # arrowup
+va 2010 0 0x12 6,26 # \& "vertical double-headed arrow"
+lA 2010 0 0x3dc 6,57 # arrowdblleft
+rA 2010 0 0x3de 6,56 # arrowdblright
+hA 2010 0 0x3db 6,60 # arrowdblboth "horizontal double-headed double arrow"
+dA 2010 0 0x3df 6,59 # arrowdbldown
+uA 2010 0 0x3dd 6,58 # arrowdblup
+ba 3333 2 0xb3 3,9 # bar
+bb 733 2 0x7c 0,124 # brokenbar
+br 3333 0 0x1db 3,9 # br "box rule with traditional troff metrics"
+ru 3333 0 0x123 4,34 # ru "baseline rule"
+ul 1667 0 0x5f 0,95 # ul "underline with traditional troff metrics"
+bv 3333 0 0xb3 3,9 # bv "bold vertical"
+ci 2843 0 0x9 4,1 # circle
+bu 2120 0 0x7 4,0 # bullet
+co 2490 2 0x154 4,23 # copyright
+rg 2490 2 0x155 4,22 # registered
+tm 3333 2 0x170 4,41 # trademark
+dd 1667 2 0x12b 4,40 # daggerdbl "double dagger sign"
+dg 1667 2 0x12a 4,39 # dagger
+ps 1667 2 0x14 4,5 # paragraph
+sc 1667 2 0x15 4,6 # section
+de 1333 2 0xf8 6,36 # degree
+em 3333 0 0x123 4,34 # emdash "em dash"
+en 1667 0 0x132 4,33 # endash "en dash"
+%0 3333 2 0x129 4,75 # perthousand "per thousand, per mille sign"
+12 2500 2 0xab 4,17 # onehalf
+14 2500 2 0xac 4,18 # onequarter
+34 2500 2 0x12e 4,25 # threequarters
+f/ 927 2 0x158 6,6 # fraction "bar for fractions"
+fm 927 0 0x3a2 6,45 # minute "footmark, prime"
+sd 927 0 0x3b2 6,46 # second
+ha 927 2 0x4c3 6,85 # asciicircum "\s-2ASCII\s+2 circumflex, hat, caret"
+ti 927 0 0x4c4 6,12 # asciitilde "\s-2ASCII\s0 tilde, large tilde"
+hy 2020 0 0x2d 6,0 # hyphen
+lB 1110 2 0x5b 0,91 # bracketleft
+rB 1110 2 0x5d 0,93 # bracketright
+lC 1160 2 0x7b 0,123 # braceleft
+rC 1160 2 0x7d 0,125 # braceright
+la 1160 0 0x3e1 6,10 # angleleft "left angle bracket"
+ra 1160 0 0x3f1 6,11 # angleright "right angle bracket"
+Bq 1667 0 0x4b9 4,63 # quotedblbase "low double comma quote"
+bq 1667 0 0x4b8 6,62 # quotesinglbase "low single comma quote"
+lq 1667 2 0x125 4,32 # quotedblleft
+rq 1667 2 0x4ba 6,31 # quotedblright
+oq 1110 2 0x176 4,29 # quoteleft "single open quote"
+aq 927 2 0x27 0,39 # quotesingle "apostrophe quote"
+at 2773 2 0x40 0,64 # at
+.C1 2020 0 0x2d 0,45 # - minus "minus sign from current font"
+sh 1667 2 0x23 0,35 # numbersign
+sl 927 2 0x2f 0,47 # slash
+rs 927 2 0x5c 0,92 # backslash
+3d 927 0 0x35c 6,102 # therefore
+tf 927 0 0x35c 6,102 # therefore
+*A 927 0 0x341 8,0 # Alpha
+*B 927 0 0x342 8,2 # Beta
+*C 927 0 0x358 8,28 # Xi
+*D 927 0 0x344 8,8 # Delta
+*E 927 0 0x345 8,10 # Epsilon
+*F 2560 0 0x346 8,44 # Phi
+*G 2003 0 0x347 8,6 # Gamma
+*H 2003 0 0x351 8,16 # Theta
+*I 2003 0 0x349 8,18 # Iota
+*K 2003 0 0x34b 8,20 # Kappa
+*L 2003 0 0x34c 8,22 # Lambda
+*M 2003 0 0x34d 8,24 # Mu
+*N 2003 0 0x34e 8,26 # Nu
+*O 2003 0 0x34f 8,30 # Omicron
+*P 2003 0 0x350 8,32 # Pi
+*Q 2003 0 0x359 8,48 # Psi
+*R 2003 0 0x352 8,34 # Rho
+*S 2203 0 0x353 8,36 # Sigma
+*T 2203 0 0x354 8,40 # Tau
+*U 2203 0 0x3a1 8,76 # Upsilon
+*W 2510 0 0x357 8,50 # Omega
+*X 2203 0 0x343 8,36 # Chi
+*Y 2203 0 0x348 8,14 # Eta
+*Z 2203 0 0x35a 8,12 # Zeta
+*a 1787 0 0xe0 8,1 # alpha
+*b 1633 0 0xe1 8,3 # beta
+*c 1633 0 0x378 8,29 # xi
+*d 1610 0 0xeb 8,9 # delta
+*e 1610 0 0x36e 8,70 # epsilon
+*f 1610 0 0x366 8,45 # phi
++f 1610 0 0x36a 8,77 # phi1 "variant phi"
+*g 1610 0 0x367 8,7 # gamma
+*h 1587 0 0xe9 8,17 # theta
++h 1587 0 0x375 8,71 # theta1 "variant theta"
+*i 1587 0 0x369 8,19 # iota
+*k 1587 0 0x36b 8,21 # kappa
+*l 1587 0 0x36c 8,23 # lambda
+*m 1920 0 0xe6 8,25 # mu
+*n 1920 0 0x36e 8,27 # nu
+*o 1920 0 0x36f 8,31 # omicron
+*p 1920 0 0xe3 8,33 # pi
++p 1920 0 0x376 8,78 # omega1 "variant pi, looking like omega"
+*q 1920 0 0x379 8,49 # psi
+*r 1920 0 0x372 8,35 # rho
+*s 1747 0 0xe5 8,37 # sigma
+*t 1473 0 0xe7 8,41 # tau
+*u 1473 0 0x375 8,27 # upsilon
+*w 1473 0 0x377 8,51 # omega
+*x 1473 0 0x363 8,47 # chi
+*y 1473 0 0x368 8,15 # eta
+*z 1473 0 0x37a 8,13 # zeta
+ts 1473 0 0x356 8,39 # sigma1 "terminal sigma"
+~~ 2663 0 0xf7 6,13 # approxequal
+~= 2663 0 0xf7 6,13 # approxequal
+!= 2663 0 0x3b9 6,99 # notequal
+** 833 0 0x32a 0,32 # asteriskmath
++- 1900 0 0xf1 6,1 # plusminus
+<= 2407 0 0xf3 6,2 # lessequal
+== 2407 0 0x3ba 8,14 # equivalence
+=~ 2407 0 0x340 8,116 # congruent
+>= 1633 0 0x3b3 8,3 # greaterequal
+AN 1633 0 0x3d9 8,85 # logicaland
+OR 1633 0 0x3da 8,86 # logicalor
+no 1633 0 0x3d8 8,20 # logicalnot
+te 1633 0 0x324 8,121 # existential "there exists, existential quantifier"
+fa 1633 0 0x322 8,122 # universal "for all, universal quantifier"
+Ah 1633 0 0x3c0 9,0 # aleph
+Im 1633 0 0x3c1 8,21 # Ifraktur "Fraktur I, imaginary"
+Re 1633 0 0x3c2 8,22 # Rfraktur "Fraktur R, real"
+if 1633 0 0x3a5 8,19 # infinity
+md 1633 0 0x3b7 8,32 # dotmath
+mo 1633 0 0x3ce 8,15 # element
+mu 1633 0 0x3b4 8,39 # multiply
+nc 1633 0 0x3cb 8,197 # uni2285
+nm 1633 0 0x3cf 8,209 # notelement
+pl 1110 0 0x32b 0,93 # plusmath "plus sign in special font"
+eq 1900 0 0x33d 0,61 # equalmath "equals sign in special font"
+pt 1900 0 0x3b5 6,4 # proportional
+pp 1900 0 0x35e 8,89 # perpendicular
+sb 1900 0 0x3cc 6,67 # propersubset
+sp 1900 0 0x3c9 6,68 # propersuperset
+ib 1900 0 0x3cd 6,69 # reflexsubset
+ip 1900 0 0x3ca 6,70 # reflexsuperset
+ap 1900 0 0x37e 6,12 # similar
+pd 1900 0 0x3b6 6,34 # partialdiff "partial differentiation sign"
+c* 1900 0 0x3c4 6,80 # circlemultiply "multiply sign in a circle"
+c+ 1900 0 0x3c5 6,81 # circleplus "plus sign in a circle"
+ca 2620 0 0xef 6,16 # intersection "intersection, cap"
+cu 2620 0 0x3c8 6,66 # union "union, cup"
+di 1900 0 0x3b8 6,8 # divide "division sign"
+-h 3333 0 0xc4 3,8 # hbar
+hbar "
+gr 3333 0 0x3d1 6,33 # gradient
+es 2407 0 0x3c6 0,79 # emptyset
+CL 2510 0 0x5 5,168 # club "club suit"
+SP 2510 0 0x6 5,171 # spade "spade suit"
+HE 2510 0 0x3 5,170 # heart "heart suit"
+DI 2510 0 0x4 5,169 # diamond "diamond suit"
+CR 2510 0 0x3bf 5,20 # carriagereturn "carriage return symbol"
+st 2510 0 0x327 6,71 # suchthat
+/_ 2510 0 0x3d0 6,79 # angle
+<< 1667 0 0xae 6,77 # "" "much less"
+>> 1667 0 0xaf 6,78 # "" "much greater"
+wp 1667 0 0x3c3 6,53 # weierstrass "Weierstrass p"
+lz 1667 0 0x3e0 6,95 # lozenge
+an 3333 0 0x3be 3,8 # arrowhorizex "horizontal arrow extension"
+pc 833 0 0xfa 6,32 # periodcentered
+mc 1920 0 0xe6 8,25 # mu
+t+- 1900 0 0xf1 6,1 # plusminus
+tmu 1633 0 0x3b4 8,39 # multiply
+tdi 1900 0 0x3b8 6,8 # divide "division sign"
+tno 1633 0 0x3d8 8,20 # logicalnot
diff --git a/font/devlbp/TI b/font/devlbp/TI
new file mode 100644
index 0000000..97fee75
--- /dev/null
+++ b/font/devlbp/TI
@@ -0,0 +1,430 @@
+name TI
+lbpname Dutch-Italic
+special
+spacewidth 833
+slant 18.49
+ligatures fi fl 0
+charset
+ha 1110 2 0x4c3 0,94 # asciicircum
+ti 1110 0 0x4c4 0,126 # asciitilde
+vS 1667 2 0x169 1,176 # Scaron
+vZ 1853 2 0x16e 1,206 # Zcaron
+vs 1297 2 0x173 1,177 # scaron
+vz 1297 2 0x174 1,207 # zcaron
+:Y 1853 2 0x16d 1,74 # Ydieresis
+tm 3266 2 0x170 4,41 # trademark
+aq 713 2 0x27 0,39 # quotesingle
+space 833 0 0x20 0,32
+! 1110 2 0x21 0,33 # exclam
+" 1400 2 0x22 0,34 # quotedbl
+dq 1400 2 0x22 0,34 # quotedbl
+# 1667 2 0x23 0,35 # numbersign
+sh 1667 2 0x23 0,35 # "
+$ 1667 2 0x24 0,36 # dollar
+Do 1667 2 0x24 0,36 # "
+% 2777 2 0x25 0,37 # percent
+& 2593 2 0x26 0,38 # ampersand
+' 713 2 0x27 0,39 # quoteright
+cq 713 2 0x27 0,39 # quoteright
+( 1110 2 0x28 0,40 # parenleft
+) 1110 2 0x29 0,41 # parenright
+* 1667 2 0x2a 0,42 # asterisk
++ 2250 0 0x2b 0,43 # plus
+, 833 0 0x2c 0,44 # comma
+- 2250 0 0x2d 0,45 # hyphen
+\- 2250 0 0x2d 0,45 # hyphen
+hy 2250 0 0x2d 0,45 # "
+. 833 0 0x2e 0,46 # period
+/ 927 2 0x2f 0,47 # slash
+sl 927 2 0x2f 0,47 # "
+0 1667 2 0x30 0,48 # zero
+1 1667 2 0x31 0,49 # one
+2 1667 2 0x32 0,50 # two
+3 1667 2 0x33 0,51 # three
+4 1667 2 0x34 0,52 # four
+5 1667 2 0x35 0,53 # five
+6 1667 2 0x36 0,54 # six
+7 1667 2 0x37 0,55 # seven
+8 1667 2 0x38 0,56 # eight
+9 1667 2 0x39 0,57 # nine
+: 0 0 0x3a 0,58 # colon
+; 1110 0 0x3b 0,59 # semicolon
+< 2250 0 0x3c 0,60 # less
+= 2250 0 0x3d 0,61 # equal
+> 2250 0 0x3e 0,62 # greater
+? 1667 2 0x3f 0,63 # question
+@ 3067 2 0x40 0,64 # at
+at 3067 2 0x40 0,64 # "
+A 2037 2 0x41 0,65 # A
+B 2037 2 0x42 0,66 # B
+C 2223 2 0x43 0,67 # C
+D 2407 2 0x44 0,68 # D
+E 2037 2 0x45 0,69 # E
+F 2037 2 0x46 0,70 # F
+G 2407 2 0x47 0,71 # G
+H 2407 2 0x48 0,72 # H
+I 1110 2 0x49 0,73 # I
+J 1480 2 0x4a 0,74 # J
+K 2223 2 0x4b 0,75 # K
+L 1853 2 0x4c 0,76 # L
+M 2777 2 0x4d 0,77 # M
+N 2223 2 0x4e 0,78 # N
+O 2407 2 0x4f 0,79 # O
+P 2037 2 0x50 0,80 # P
+Q 2407 2 0x51 0,81 # Q
+R 2037 2 0x52 0,82 # R
+S 1667 2 0x53 0,83 # S
+T 1853 2 0x54 0,84 # T
+U 2407 2 0x55 0,85 # U
+V 2037 2 0x56 0,86 # V
+W 2777 2 0x57 0,87 # W
+X 2037 2 0x58 0,88 # X
+Y 1853 2 0x59 0,89 # Y
+Z 1853 2 0x5a 0,90 # Z
+[ 1297 2 0x5b 0,91 # bracketleft
+lB 1297 2 0x5b 0,91 # "
+\ 927 2 0x5c 0,92 # backslash
+rs 927 2 0x5c 0,92 # "
+] 1297 2 0x5d 0,93 # bracketright
+rB 1297 2 0x5d 0,93 # "
+a^ 1110 2 0x5e 0,94 # circumflex
+^ 1110 2 0x5e 0,94 # "
+_ 1667 0 0x5f 0,95 # underscore
+` 1110 2 0x60 0,96 # quoteleft
+oq 1110 2 0x60 0,96 # "
+a 1667 0 0x61 0,97 # a
+b 1667 2 0x62 0,98 # b
+c 1480 0 0x63 0,99 # c
+d 1667 2 0x64 0,100 # d
+e 1480 0 0x65 0,101 # e
+f 927 2 0x66 0,102 # f
+g 1667 1 0x67 0,103 # g
+h 1667 2 0x68 0,104 # h
+i 927 2 0x69 0,105 # i
+j 927 2 0x6a 0,106 # j
+k 1480 2 0x6b 0,107 # k
+l 927 2 0x6c 0,108 # l
+m 2407 0 0x6d 0,109 # m
+n 1667 0 0x6e 0,110 # n
+o 1667 0 0x6f 0,111 # o
+p 1667 1 0x70 0,112 # p
+q 1667 1 0x71 0,113 # q
+r 1297 0 0x72 0,114 # r
+s 1297 0 0x73 0,115 # s
+t 927 2 0x74 0,116 # t
+u 1667 0 0x75 0,117 # u
+v 1480 0 0x76 0,118 # v
+w 2223 0 0x77 0,119 # w
+x 1480 0 0x78 0,120 # x
+y 1480 1 0x79 0,121 # y
+z 1297 0 0x7a 0,122 # z
+lC 1333 2 0x7b 0,123 # braceleft
+{ 1333 2 0x7b 0,123 # "
+ba 917 2 0x7c 0,124 # bar
+| 917 2 0x7c 0,124 # "
+rC 1333 2 0x7d 0,125 # braceright
+} 1333 2 0x7d 0,125 # "
+a~ 1110 2 0x7e 0,126 # tilde
+~ 1110 2 0x7e 0,126 # "
+-D 2407 2 0x13d 1,78 # Eth "Icelandic uppercase eth"
+Sd 1667 2 0x148 1,87 # eth "Icelandic lowercase eth"
+TP 2037 2 0x13e 1,88 # Thorn "Icelandic uppercase thorn"
+Tp 1667 3 0x143 1,89 # thorn "Icelandic lowercase thorn"
+AE 2963 2 0x92 1,36 # AE
+ae 2223 0 0x91 1,37 # ae
+OE 3147 2 0x141 1,166 # OE
+oe 2223 0 0x146 1,167 # oe
+ij 1807 0 0x150 1,139 # ij "Dutch ij ligature"
+ss 1667 2 0x147 1,23 # germandbls
+'A 2037 2 0x15a 1,26 # Aacute
+'E 2037 2 0x90 1,40 # Eacute
+'I 1110 2 0x161 1,48 # Iacute
+'O 2407 2 0x165 1,58 # Oacute
+'U 2407 2 0x16a 1,66 # Uacute
+'a 1667 2 0xa0 1,27 # aacute
+'e 1480 2 0x82 1,41 # eacute
+'i 927 2 0xa1 1,49 # iacute
+'o 1667 2 0xa2 1,59 # oacute
+'u 1667 2 0x95 1,65 # uacute
+:A 2037 2 0x8e 1,30 # Adieresis
+:E 2037 2 0x15f 1,44 # Edieresis
+:I 1110 2 0x163 1,52 # Idieresis
+:O 2407 2 0x99 1,62 # Odieresis
+:U 2407 2 0x9a 1,70 # Udieresis
+:Y 1853 2 0x16d 1,74 # Ydieresis
+:a 1667 2 0x84 1,31 # adieresis
+:e 1480 2 0x89 1,45 # edieresis
+:i 927 2 0x8b 1,53 # idieresis
+:o 1667 2 0x94 1,63 # odieresis
+:u 1667 2 0x81 1,71 # udieresis
+:y 1480 3 0x98 1,75 # ydieresis
+^A 2037 2 0x15b 1,28 # Acircumflex
+^E 2037 2 0x15e 1,42 # Ecircumflex
+^I 1110 2 0x162 1,50 # Icircumflex
+^O 2407 2 0x166 1,60 # Ocircumflex
+^U 2407 2 0x16b 1,68 # Ucircumflex
+^a 1667 2 0x83 1,29 # acircumflex
+^e 1480 2 0x88 1,43 # ecircumflex
+^i 927 2 0x8c 1,51 # icircumflex
+^o 1667 2 0x93 1,61 # ocircumflex
+^u 1667 2 0x96 1,69 # ucircumflex
+`A 2037 2 0x15c 1,32 # Agrave
+`E 2037 2 0x160 1,46 # Egrave
+`I 1110 2 0x164 1,54 # Igrave
+`O 2407 2 0x167 1,64 # Ograve
+`U 2407 2 0x16c 1,72 # Ugrave
+`a 1667 2 0x85 1,33 # agrave
+`e 1480 2 0x8a 1,47 # egrave
+`i 927 2 0x8d 1,55 # igrave
+`o 1667 2 0x95 1,65 # ograve
+`u 1667 2 0x97 1,73 # ugrave
+~A 2037 2 0x28e 1,26 # Atilde
+~N 2223 2 0xa5 1,56 # Ntilde
+~O 2407 2 0x168 1,82 # Otilde
+~a 1667 2 0x284 --- # atilde
+~n 1667 2 0xa4 1,57 # ntilde
+~o 1667 2 0x172 1,83 # otilde
+vS 1667 2 0x169 1,176 # Scaron
+vs 1297 2 0x173 1,177 # scaron
+vZ 1853 2 0x16e 1,206 # Zcaron
+vz 1297 2 0x174 1,207 # zcaron
+,C 2223 2 0x80 1,38 # Ccedilla
+,c 1480 0 0x87 1,39 # ccedilla
+/L 1853 2 0x13f 1,152 # Lslash "Polish L with a slash"
+/l 927 2 0x144 1,153 # lslash "Polish l with a slash"
+/O 2407 2 0x140 1,80 # Oslash
+/o 1667 0 0x145 1,81 # oslash
+oA 2037 2 0x8f 1,34 # Aring
+oa 1667 2 0x86 1,35 # aring
+a" 1110 2 0x13a 1,16 # hungarumlaut "Hungarian umlaut"
+a- 1110 2 0x135 1,8 # macron "macron or bar accent"
+a. 1110 2 0x137 1,15 # dotaccent "dot accent"
+a^ 1110 2 0x5e 1,3 # circumflex "circumflex accent"
+aa 1110 2 0x120 1,6 # acute "acute accent"
+ga 1110 2 0x121 1,0 # grave "grave accent"
+ab 1110 2 0x136 1,22 # breve "breve accent"
+ac 1110 0 0x139 1,17 # cedilla "cedilla accent"
+ad 1110 2 0x122 1,7 # dieresis "umlaut or dieresis"
+ah 1110 2 0x13c 1,19 # caron "h\('a\(vcek accent"
+ao 1110 2 0x138 1,14 # ring "ring or circle accent"
+a~ 1110 2 0x7e 1,2 # tilde "tilde accent"
+ho 1110 0 0x13b 1,18 # ogonek "hook or ogonek accent"
+.i 927 0 0x142 1,239 # dotlessi "i without a dot"
+Cs 1667 2 0x12f 4,24 # currency "Scandinavian currency sign"
+Do 1667 2 0x24 0,36 # dollar
+Po 1667 2 0x9c 4,11 # sterling
+Ye 1667 2 0x9d 4,12 # yen
+Fn 1667 2 0x9f 4,14 # florin
+ct 1667 2 0x9b 4,19 # cent
+Fo 1667 0 0xae 4,9 # guillemotleft
+Fc 1000 0 0x4bb 4,20 # guillemotright
+fo 1110 0 0x127 4,35 # guilsinglleft
+fc 1110 0 0x128 4,36 # guilsinglright
+r! 1297 1 0xad 4,7 # exclamdown
+r? 1667 1 0xa8 4,8 # questiondown
+fi 1667 2 0x130 4,54 # fi "fi ligature"
+fl 1667 2 0x131 4,55 # fl "fl ligature"
+OK 1667 0 0x3d6 --- # \& "check mark, tick"
+Of 920 2 0xa6 4,15 # ordfeminine
+Om 1033 2 0xa7 4,16 # ordmasculine
+S1 1000 2 0x156 4,78 # onesuperior
+S2 1000 2 0xfd 4,20 # twosuperior
+S3 1000 2 0x14d 4,26 # threesuperior
+<- 3290 0 0x1b 6,22 # arrowleft
+-> 3290 0 0x1a 6,21 # arrowright
+<> 3473 0 0x1d 6,25 # arrowboth "horizontal double-headed arrow"
+da 2010 0 0x19 6,24 # arrowdown
+ua 2010 0 0x18 6,23 # arrowup
+va 2010 0 0x12 6,26 # \& "vertical double-headed arrow"
+lA 2010 0 0x3dc 6,57 # arrowdblleft
+rA 2010 0 0x3de 6,56 # arrowdblright
+hA 2010 0 0x3db 6,60 # arrowdblboth "horizontal double-headed double arrow"
+dA 2010 0 0x3df 6,59 # arrowdbldown
+uA 2010 0 0x3dd 6,58 # arrowdblup
+ba 3333 2 0xb3 3,9 # bar
+bb 917 2 0x7c 0,124 # brokenbar
+br 3333 0 0x1db 3,9 # br "box rule with traditional troff metrics"
+ru 2963 0 0x123 4,34 # ru "baseline rule"
+ul 1667 0 0x5f 0,95 # ul "underline with traditional troff metrics"
+bv 3333 0 0xb3 3,9 # bv "bold vertical"
+ci 2843 0 0x9 4,1 # circle
+bu 2120 0 0x7 4,0 # bullet
+co 2533 2 0x154 4,23 # copyright
+rg 2533 2 0x155 4,22 # registered
+tm 3266 2 0x170 4,41 # trademark
+dd 1667 2 0x12b 4,40 # daggerdbl "double dagger sign"
+dg 1667 2 0x12a 4,39 # dagger
+ps 1743 2 0x14 4,5 # paragraph
+sc 1667 2 0x15 4,6 # section
+de 1333 2 0xf8 6,36 # degree
+em 2963 0 0x123 4,34 # emdash "em dash"
+en 1667 0 0x132 4,33 # endash "en dash"
+%0 3333 2 0x129 4,75 # perthousand "per thousand, per mille sign"
+12 2500 2 0xab 4,17 # onehalf
+14 2500 2 0xac 4,18 # onequarter
+34 2500 2 0x12e 4,25 # threequarters
+f/ 927 2 0x158 6,6 # fraction "bar for fractions"
+fm 927 0 0x3a2 6,45 # minute "footmark, prime"
+sd 927 0 0x3b2 6,46 # second
+ha 927 2 0x4c3 6,85 # asciicircum "\s-2ASCII\s+2 circumflex, hat, caret"
+ti 927 0 0x4c4 6,12 # asciitilde "\s-2ASCII\s0 tilde, large tilde"
+hy 2250 0 0x2d 6,0 # hyphen
+lB 1297 2 0x5b 0,91 # bracketleft
+rB 1297 2 0x5d 0,93 # bracketright
+lC 1333 2 0x7b 0,123 # braceleft
+rC 1333 2 0x7d 0,125 # braceright
+la 1333 0 0x3e1 6,10 # angleleft "left angle bracket"
+ra 1333 0 0x3f1 6,11 # angleright "right angle bracket"
+Bq 1853 0 0x4b9 4,63 # quotedblbase "low double comma quote"
+bq 1853 0 0x4b8 6,62 # quotesinglbase "low single comma quote"
+lq 1853 2 0x125 4,32 # quotedblleft
+rq 1853 2 0x4ba 6,31 # quotedblright
+oq 1110 2 0x176 4,29 # quoteleft "single open quote"
+aq 713 2 0x27 0,39 # quotesingle "apostrophe quote"
+at 3067 2 0x40 0,64 # at
+.C1 2250 0 0x2d 0,45 # - minus "minus sign from current font"
+sh 1667 2 0x23 0,35 # numbersign
+sl 927 2 0x2f 0,47 # slash
+rs 927 2 0x5c 0,92 # backslash
+3d 927 0 0x35c 6,102 # therefore
+tf 927 0 0x35c 6,102 # therefore
+*A 927 0 0x341 8,0 # Alpha
+*B 927 0 0x342 8,2 # Beta
+*C 927 0 0x358 8,28 # Xi
+*D 927 0 0x344 8,8 # Delta
+*E 927 0 0x345 8,10 # Epsilon
+*F 2627 0 0x346 8,44 # Phi
+*G 1977 0 0x347 8,6 # Gamma
+*H 1977 0 0x351 8,16 # Theta
+*I 1977 0 0x349 8,18 # Iota
+*K 1977 0 0x34b 8,20 # Kappa
+*L 1977 0 0x34c 8,22 # Lambda
+*M 1977 0 0x34d 8,24 # Mu
+*N 1977 0 0x34e 8,26 # Nu
+*O 1977 0 0x34f 8,30 # Omicron
+*P 1977 0 0x350 8,32 # Pi
+*Q 1977 0 0x359 8,48 # Psi
+*R 1977 0 0x352 8,34 # Rho
+*S 2140 0 0x353 8,36 # Sigma
+*T 2140 0 0x354 8,40 # Tau
+*U 2140 0 0x3a1 8,76 # Upsilon
+*W 2653 0 0x357 8,50 # Omega
+*X 2140 0 0x343 8,36 # Chi
+*Y 2140 0 0x348 8,14 # Eta
+*Z 2140 0 0x35a 8,12 # Zeta
+*a 1987 0 0xe0 8,1 # alpha
+*b 1723 0 0xe1 8,3 # beta
+*c 1723 0 0x378 8,29 # xi
+*d 1760 0 0xeb 8,9 # delta
+*e 1760 0 0x36e 8,70 # epsilon
+*f 1760 0 0x366 8,45 # phi
++f 1760 0 0x36a 8,77 # phi1 "variant phi"
+*g 1760 0 0x367 8,7 # gamma
+*h 1643 0 0xe9 8,17 # theta
++h 1643 0 0x375 8,71 # theta1 "variant theta"
+*i 1643 0 0x369 8,19 # iota
+*k 1643 0 0x36b 8,21 # kappa
+*l 1643 0 0x36c 8,23 # lambda
+*m 1667 0 0xe6 8,25 # mu
+*n 1667 0 0x36e 8,27 # nu
+*o 1667 0 0x36f 8,31 # omicron
+*p 2037 0 0xe3 8,33 # pi
++p 2037 0 0x376 8,78 # omega1 "variant pi, looking like omega"
+*q 2037 0 0x379 8,49 # psi
+*r 2037 0 0x372 8,35 # rho
+*s 1753 0 0xe5 8,37 # sigma
+*t 1413 0 0xe7 8,41 # tau
+*u 1413 0 0x375 8,27 # upsilon
+*w 1413 0 0x377 8,51 # omega
+*x 1413 0 0x363 8,47 # chi
+*y 1413 0 0x368 8,15 # eta
+*z 1413 0 0x37a 8,13 # zeta
+ts 1413 0 0x356 8,39 # sigma1 "terminal sigma"
+~~ 2663 0 0xf7 6,13 # approxequal
+~= 2663 0 0xf7 6,13 # approxequal
+!= 2663 0 0x3b9 6,99 # notequal
+** 833 0 0x32a 0,32 # asteriskmath
++- 2250 0 0xf1 6,1 # plusminus
+<= 2413 0 0xf3 6,2 # lessequal
+== 2413 0 0x3ba 8,14 # equivalence
+=~ 2413 0 0x340 8,116 # congruent
+>= 1723 0 0x3b3 8,3 # greaterequal
+AN 1723 0 0x3d9 8,85 # logicaland
+OR 1723 0 0x3da 8,86 # logicalor
+no 1723 0 0x3d8 8,20 # logicalnot
+te 1723 0 0x324 8,121 # existential "there exists, existential quantifier"
+fa 1723 0 0x322 8,122 # universal "for all, universal quantifier"
+Ah 1723 0 0x3c0 9,0 # aleph
+Im 1723 0 0x3c1 8,21 # Ifraktur "Fraktur I, imaginary"
+Re 1723 0 0x3c2 8,22 # Rfraktur "Fraktur R, real"
+if 1723 0 0x3a5 8,19 # infinity
+md 1723 0 0x3b7 8,32 # dotmath
+mo 1723 0 0x3ce 8,15 # element
+mu 1723 0 0x3b4 8,39 # multiply
+nc 1723 0 0x3cb 8,197 # uni2285
+nm 1723 0 0x3cf 8,209 # notelement
+pl 1297 0 0x32b 0,93 # plusmath "plus sign in special font"
+eq 2250 0 0x33d 0,61 # equalmath "equals sign in special font"
+pt 2250 0 0x3b5 6,4 # proportional
+pp 2250 0 0x35e 8,89 # perpendicular
+sb 2250 0 0x3cc 6,67 # propersubset
+sp 2250 0 0x3c9 6,68 # propersuperset
+ib 2250 0 0x3cd 6,69 # reflexsubset
+ip 2250 0 0x3ca 6,70 # reflexsuperset
+ap 2250 0 0x37e 6,12 # similar
+pd 2250 0 0x3b6 6,34 # partialdiff "partial differentiation sign"
+c* 2250 0 0x3c4 6,80 # circlemultiply "multiply sign in a circle"
+c+ 2250 0 0x3c5 6,81 # circleplus "plus sign in a circle"
+ca 2620 0 0xef 6,16 # intersection "intersection, cap"
+cu 2620 0 0x3c8 6,66 # union "union, cup"
+di 2250 0 0x3b8 6,8 # divide "division sign"
+-h 3333 0 0xc4 3,8 # hbar
+hbar "
+gr 3333 0 0x3d1 6,33 # gradient
+es 2407 0 0x3c6 0,79 # emptyset
+CL 2510 0 0x5 5,168 # club "club suit"
+SP 2510 0 0x6 5,171 # spade "spade suit"
+HE 2510 0 0x3 5,170 # heart "heart suit"
+DI 2510 0 0x4 5,169 # diamond "diamond suit"
+CR 2510 0 0x3bf 5,20 # carriagereturn "carriage return symbol"
+st 2510 0 0x327 6,71 # suchthat
+/_ 2510 0 0x3d0 6,79 # angle
+<< 1667 0 0xae 6,77 # "" "much less"
+>> 1667 0 0xaf 6,78 # "" "much greater"
+wp 1667 0 0x3c3 6,53 # weierstrass "Weierstrass p"
+lz 1667 0 0x3e0 6,95 # lozenge
+an 3333 0 0x3be 3,8 # arrowhorizex "horizontal arrow extension"
+pc 833 0 0xfa 6,32 # periodcentered
+mc 1667 0 0xe6 8,25 # mu
+t+- 2250 0 0xf1 6,1 # plusminus
+tmu 1723 0 0x3b4 8,39 # multiply
+tdi 2250 0 0x3b8 6,8 # divide "division sign"
+tno 1723 0 0x3d8 8,20 # logicalnot
+kernpairs
+V A -168
+W A -96
+Y A -72
+A V -72
+A W -72
+A Y -48
+T a -48
+V a -48
+W a -48
+Y a -48
+v a -48
+T c -48
+V c -48
+Y c -48
+P e -48
+T e -48
+V e -48
+Y e 48
+f e -24
+F o -48
+P o -48
+T o -48
+V o -72
+W o -48
+Y o -120
+A v -48
+A w -24
diff --git a/font/devlbp/TR b/font/devlbp/TR
new file mode 100644
index 0000000..a66b7fd
--- /dev/null
+++ b/font/devlbp/TR
@@ -0,0 +1,426 @@
+name TR
+lbpname Dutch-Roman
+special
+spacewidth 833
+slant 0
+ligatures fi fl 0
+charset
+ha 1110 2 0x4c3 0,94 # asciicircum
+ti 1110 0 0x4c4 0,126 # asciitilde
+vS 1853 2 0x169 1,176 # Scaron
+vZ 2037 2 0x16e 1,206 # Zcaron
+vs 1297 2 0x173 1,177 # scaron
+vz 1480 2 0x174 1,207 # zcaron
+:Y 2407 2 0x16d 1,74 # Ydieresis
+tm 3226 2 0x170 4,41 # trademark
+aq 600 2 0x27 0,39 # quotesingle
+space 833 0 0x20 0,32
+! 1110 2 0x21 0,33 # exclam
+" 1360 2 0x22 0,34 # quotedbl
+dq 1360 2 0x22 0,34 # quotedbl
+# 1667 2 0x23 0,35 # numbersign
+sh 1667 2 0x23 0,35 # "
+$ 1667 2 0x24 0,36 # dollar
+Do 1667 2 0x24 0,36 # "
+% 2777 2 0x25 0,37 # percent
+& 2593 2 0x26 0,38 # ampersand
+' 600 2 0x27 0,39 # quoteright
+cq 600 2 0x27 0,39 # quoteright
+( 1110 2 0x28 0,40 # parenleft
+) 1110 2 0x29 0,41 # parenright
+* 1667 2 0x2a 0,42 # asterisk
++ 1880 0 0x2b 0,43 # plus
+, 833 0 0x2c 0,44 # comma
+- 1110 0 0x2d 0,45 # hyphen
+\- 1110 0 0x2d 0,45 # hyphen
+hy 1110 0 0x2d 0,45 # "
+. 833 0 0x2e 0,46 # period
+/ 927 2 0x2f 0,47 # slash
+sl 927 2 0x2f 0,47 # "
+0 1667 2 0x30 0,48 # zero
+1 1667 2 0x31 0,49 # one
+2 1667 2 0x32 0,50 # two
+3 1667 2 0x33 0,51 # three
+4 1667 2 0x34 0,52 # four
+5 1667 2 0x35 0,53 # five
+6 1667 2 0x36 0,54 # six
+7 1667 2 0x37 0,55 # seven
+8 1667 2 0x38 0,56 # eight
+9 1667 2 0x39 0,57 # nine
+: 927 0 0x3a 0,58 # colon
+; 927 0 0x3b 0,59 # semicolon
+< 1880 0 0x3c 0,60 # less
+= 1880 0 0x3d 0,61 # equal
+> 1880 0 0x3e 0,62 # greater
+? 1480 2 0x3f 0,63 # question
+@ 3070 2 0x40 0,64 # at
+at 3070 2 0x40 0,64 # "
+A 2407 2 0x41 0,65 # A
+B 2223 2 0x42 0,66 # B
+C 2223 2 0x43 0,67 # C
+D 2407 2 0x44 0,68 # D
+E 2037 2 0x45 0,69 # E
+F 1853 2 0x46 0,70 # F
+G 2407 2 0x47 0,71 # G
+H 2407 2 0x48 0,72 # H
+I 1110 2 0x49 0,73 # I
+J 1297 2 0x4a 0,74 # J
+K 2407 2 0x4b 0,75 # K
+L 2037 2 0x4c 0,76 # L
+M 2963 2 0x4d 0,77 # M
+N 2407 2 0x4e 0,78 # N
+O 2407 2 0x4f 0,79 # O
+P 1853 2 0x50 0,80 # P
+Q 2407 2 0x51 0,81 # Q
+R 2223 2 0x52 0,82 # R
+S 1853 2 0x53 0,83 # S
+T 2037 2 0x54 0,84 # T
+U 2407 2 0x55 0,85 # U
+V 2407 2 0x56 0,86 # V
+W 3147 2 0x57 0,87 # W
+X 2407 2 0x58 0,88 # X
+Y 2407 2 0x59 0,89 # Y
+Z 2037 2 0x5a 0,90 # Z
+[ 1110 2 0x5b 0,91 # bracketleft
+lB 1110 2 0x5b 0,91 # "
+\ 927 2 0x5c 0,92 # backslash
+rs 927 2 0x5c 0,92 # "
+] 1110 2 0x5d 0,93 # bracketright
+rB 1110 2 0x5d 0,93 # "
+a^ 1110 2 0x5e 0,94 # circumflex
+^ 1110 2 0x5e 0,94 # "
+_ 1667 0 0x5f 0,95 # underscore
+` 1110 2 0x60 0,96 # quoteleft
+oq 1110 2 0x60 0,96 # "
+a 1480 0 0x61 0,97 # a
+b 1667 2 0x62 0,98 # b
+c 1480 0 0x63 0,99 # c
+d 1667 2 0x64 0,100 # d
+e 1480 0 0x65 0,101 # e
+f 1110 2 0x66 0,102 # f
+g 1667 1 0x67 0,103 # g
+h 1667 2 0x68 0,104 # h
+i 927 2 0x69 0,105 # i
+j 927 2 0x6a 0,106 # j
+k 1667 2 0x6b 0,107 # k
+l 927 2 0x6c 0,108 # l
+m 2593 0 0x6d 0,109 # m
+n 1667 0 0x6e 0,110 # n
+o 1667 0 0x6f 0,111 # o
+p 1667 1 0x70 0,112 # p
+q 1667 1 0x71 0,113 # q
+r 1110 0 0x72 0,114 # r
+s 1297 0 0x73 0,115 # s
+t 927 2 0x74 0,116 # t
+u 1667 0 0x75 0,117 # u
+v 1667 0 0x76 0,118 # v
+w 2407 0 0x77 0,119 # w
+x 1667 0 0x78 0,120 # x
+y 1667 1 0x79 0,121 # y
+z 1480 0 0x7a 0,122 # z
+lC 1600 2 0x7b 0,123 # braceleft
+{ 1600 2 0x7b 0,123 # "
+| 667 2 0x7c 0,124 # "
+rC 1600 2 0x7d 0,125 # braceright
+} 1600 2 0x7d 0,125 # "
+a~ 1110 2 0x7e 0,126 # tilde
+~ 1110 2 0x7e 0,126 # "
+-D 2407 2 0x13d 1,78 # Eth "Icelandic uppercase eth"
+Sd 1667 2 0x148 1,87 # eth "Icelandic lowercase eth"
+TP 1853 2 0x13e 1,88 # Thorn "Icelandic uppercase thorn"
+Tp 1667 3 0x143 1,89 # thorn "Icelandic lowercase thorn"
+AE 2963 2 0x92 1,36 # AE
+ae 2223 0 0x91 1,37 # ae
+OE 2963 2 0x141 1,166 # OE
+oe 2407 0 0x146 1,167 # oe
+ij 1783 0 0x150 1,139 # ij "Dutch ij ligature"
+ss 1667 2 0x147 1,23 # germandbls
+'A 2407 2 0x15a 1,26 # Aacute
+'E 2037 2 0x90 1,40 # Eacute
+'I 1110 2 0x161 1,48 # Iacute
+'O 2407 2 0x165 1,58 # Oacute
+'U 2407 2 0x16a 1,66 # Uacute
+'a 1480 2 0xa0 1,27 # aacute
+'e 1480 2 0x82 1,41 # eacute
+'i 927 2 0xa1 1,49 # iacute
+'o 1667 2 0xa2 1,59 # oacute
+'u 1667 2 0x95 1,65 # uacute
+:A 2407 2 0x8e 1,30 # Adieresis
+:E 2037 2 0x15f 1,44 # Edieresis
+:I 1110 2 0x163 1,52 # Idieresis
+:O 2407 2 0x99 1,62 # Odieresis
+:U 2407 2 0x9a 1,70 # Udieresis
+:Y 2407 2 0x16d 1,74 # Ydieresis
+:a 1480 2 0x84 1,31 # adieresis
+:e 1480 2 0x89 1,45 # edieresis
+:i 927 2 0x8b 1,53 # idieresis
+:o 1667 2 0x94 1,63 # odieresis
+:u 1667 2 0x81 1,71 # udieresis
+:y 1667 3 0x98 1,75 # ydieresis
+^A 2407 2 0x15b 1,28 # Acircumflex
+^E 2037 2 0x15e 1,42 # Ecircumflex
+^I 1110 2 0x162 1,50 # Icircumflex
+^O 2407 2 0x166 1,60 # Ocircumflex
+^U 2407 2 0x16b 1,68 # Ucircumflex
+^a 1480 2 0x83 1,29 # acircumflex
+^e 1480 2 0x88 1,43 # ecircumflex
+^i 927 2 0x8c 1,51 # icircumflex
+^o 1667 2 0x93 1,61 # ocircumflex
+^u 1667 2 0x96 1,69 # ucircumflex
+`A 2407 2 0x15c 1,32 # Agrave
+`E 2037 2 0x160 1,46 # Egrave
+`I 1110 2 0x164 1,54 # Igrave
+`O 2407 2 0x167 1,64 # Ograve
+`U 2407 2 0x16c 1,72 # Ugrave
+`a 1480 2 0x85 1,33 # agrave
+`e 1480 2 0x8a 1,47 # egrave
+`i 927 2 0x8d 1,55 # igrave
+`o 1667 2 0x95 1,65 # ograve
+`u 1667 2 0x97 1,73 # ugrave
+~A 2407 2 0x28e 1,26 # Atilde
+~N 2407 2 0xa5 1,56 # Ntilde
+~O 2407 2 0x168 1,82 # Otilde
+~a 1480 2 0x284 --- # atilde
+~n 1667 2 0xa4 1,57 # ntilde
+~o 1667 2 0x172 1,83 # otilde
+vS 1853 2 0x169 1,176 # Scaron
+vs 1297 2 0x173 1,177 # scaron
+vZ 2037 2 0x16e 1,206 # Zcaron
+vz 1480 2 0x174 1,207 # zcaron
+,C 2223 2 0x80 1,38 # Ccedilla
+,c 1480 0 0x87 1,39 # ccedilla
+/L 2037 2 0x13f 1,152 # Lslash "Polish L with a slash"
+/l 927 2 0x144 1,153 # lslash "Polish l with a slash"
+/O 2407 2 0x140 1,80 # Oslash
+/o 1667 0 0x145 1,81 # oslash
+oA 2407 2 0x8f 1,34 # Aring
+oa 1480 2 0x86 1,35 # aring
+a" 1110 2 0x13a 1,16 # hungarumlaut "Hungarian umlaut"
+a- 1110 2 0x135 1,8 # macron "macron or bar accent"
+a. 1110 2 0x137 1,15 # dotaccent "dot accent"
+a^ 1110 2 0x5e 1,3 # circumflex "circumflex accent"
+aa 1110 2 0x120 1,6 # acute "acute accent"
+ga 1110 2 0x121 1,0 # grave "grave accent"
+ab 1110 2 0x136 1,22 # breve "breve accent"
+ac 1110 0 0x139 1,17 # cedilla "cedilla accent"
+ad 1110 2 0x122 1,7 # dieresis "umlaut or dieresis"
+ah 1110 2 0x13c 1,19 # caron "h\('a\(vcek accent"
+ao 1110 2 0x138 1,14 # ring "ring or circle accent"
+a~ 1110 2 0x7e 1,2 # tilde "tilde accent"
+ho 1110 0 0x13b 1,18 # ogonek "hook or ogonek accent"
+.i 927 0 0x142 1,239 # dotlessi "i without a dot"
+Cs 1667 2 0x12f 4,24 # currency "Scandinavian currency sign"
+Do 1667 2 0x24 0,36 # dollar
+Po 1667 2 0x9c 4,11 # sterling
+Ye 1667 2 0x9d 4,12 # yen
+Fn 1667 2 0x9f 4,14 # florin
+ct 1667 2 0x9b 4,19 # cent
+Fo 1667 0 0xae 4,9 # guillemotleft
+Fc 1000 0 0x4bb 4,20 # guillemotright
+fo 1110 0 0x127 4,35 # guilsinglleft
+fc 1110 0 0x128 4,36 # guilsinglright
+r! 1110 1 0xad 4,7 # exclamdown
+r? 1480 1 0xa8 4,8 # questiondown
+fi 1853 2 0x130 4,54 # fi "fi ligature"
+fl 1853 2 0x131 4,55 # fl "fl ligature"
+OK 1853 0 0x3d6 --- # \& "check mark, tick"
+Of 920 2 0xa6 4,15 # ordfeminine
+Om 1033 2 0xa7 4,16 # ordmasculine
+S1 1000 2 0x156 4,78 # onesuperior
+S2 1000 2 0xfd 4,20 # twosuperior
+S3 1000 2 0x14d 4,26 # threesuperior
+<- 3290 0 0x1b 6,22 # arrowleft
+-> 3290 0 0x1a 6,21 # arrowright
+<> 3473 0 0x1d 6,25 # arrowboth "horizontal double-headed arrow"
+da 2010 0 0x19 6,24 # arrowdown
+ua 2010 0 0x18 6,23 # arrowup
+va 2010 0 0x12 6,26 # \& "vertical double-headed arrow"
+lA 2010 0 0x3dc 6,57 # arrowdblleft
+rA 2010 0 0x3de 6,56 # arrowdblright
+hA 2010 0 0x3db 6,60 # arrowdblboth "horizontal double-headed double arrow"
+dA 2010 0 0x3df 6,59 # arrowdbldown
+uA 2010 0 0x3dd 6,58 # arrowdblup
+ba 3333 2 0xb3 3,9 # bar
+bb 667 2 0x7c 0,124 # brokenbar
+br 3333 0 0x1db 3,9 # br "box rule with traditional troff metrics"
+ru 3333 0 0x123 4,34 # ru "baseline rule"
+ul 1667 0 0x5f 0,95 # ul "underline with traditional troff metrics"
+bv 3333 0 0x3f4 3,9 # bv "bold vertical"
+ci 2843 0 0x9 4,1 # circle
+bu 2120 0 0x7 4,0 # bullet
+co 2533 2 0x154 4,23 # copyright
+rg 2533 2 0x155 4,22 # registered
+tm 3226 2 0x170 4,41 # trademark
+dd 1667 2 0x12b 4,40 # daggerdbl "double dagger sign"
+dg 1667 2 0x12a 4,39 # dagger
+ps 1510 2 0x14 4,5 # paragraph
+sc 1667 2 0x15 4,6 # section
+de 1333 2 0xf8 6,36 # degree
+em 3333 0 0x123 4,34 # emdash "em dash"
+en 1667 0 0x132 4,33 # endash "en dash"
+%0 3333 2 0x129 4,75 # perthousand "per thousand, per mille sign"
+12 2500 2 0xab 4,17 # onehalf
+14 2500 2 0xac 4,18 # onequarter
+34 2500 2 0x12e 4,25 # threequarters
+f/ 550 2 0x158 6,6 # fraction "bar for fractions"
+fm 550 0 0x3a2 6,45 # minute "footmark, prime"
+sd 550 0 0x3b2 6,46 # second
+ha 550 2 0x4c3 6,85 # asciicircum "\s-2ASCII\s+2 circumflex, hat, caret"
+ti 550 0 0x4c4 6,12 # asciitilde "\s-2ASCII\s0 tilde, large tilde"
+hy 1880 0 0x2d 6,0 # hyphen
+lB 1110 2 0x5b 0,91 # bracketleft
+rB 1110 2 0x5d 0,93 # bracketright
+lC 1600 2 0x7b 0,123 # braceleft
+rC 1600 2 0x7d 0,125 # braceright
+la 1600 0 0x3e1 6,10 # angleleft "left angle bracket"
+ra 1600 0 0x3f1 6,11 # angleright "right angle bracket"
+Bq 1480 0 0x4b9 4,63 # quotedblbase "low double comma quote"
+bq 1480 0 0x4b8 6,62 # quotesinglbase "low single comma quote"
+lq 1480 2 0x125 4,32 # quotedblleft
+rq 1480 2 0x4ba 6,31 # quotedblright
+oq 1110 2 0x176 4,29 # quoteleft "single open quote"
+aq 600 2 0x27 0,39 # quotesingle "apostrophe quote"
+at 3070 2 0x40 0,64 # at
+.C1 1110 0 0x2d 0,45 # - minus "minus sign from current font"
+sh 1667 2 0x23 0,35 # numbersign
+sl 927 2 0x2f 0,47 # slash
+rs 927 2 0x5c 0,92 # backslash
+3d 927 0 0x35c 6,102 # therefore
+tf 927 0 0x35c 6,102 # therefore
+*A 927 0 0x341 8,0 # Alpha
+*B 927 0 0x342 8,2 # Beta
+*C 927 0 0x358 8,28 # Xi
+*D 927 0 0x344 8,8 # Delta
+*E 927 0 0x345 8,10 # Epsilon
+*F 2627 0 0x346 8,44 # Phi
+*G 1977 0 0x347 8,6 # Gamma
+*H 1977 0 0x351 8,16 # Theta
+*I 1977 0 0x349 8,18 # Iota
+*K 1977 0 0x34b 8,20 # Kappa
+*L 1977 0 0x34c 8,22 # Lambda
+*M 1977 0 0x34d 8,24 # Mu
+*N 1977 0 0x34e 8,26 # Nu
+*O 1977 0 0x34f 8,30 # Omicron
+*P 1977 0 0x350 8,32 # Pi
+*Q 1977 0 0x359 8,48 # Psi
+*R 1977 0 0x352 8,34 # Rho
+*S 2140 0 0x353 8,36 # Sigma
+*T 2140 0 0x354 8,40 # Tau
+*U 2140 0 0x3a1 8,76 # Upsilon
+*W 2653 0 0x357 8,50 # Omega
+*X 2140 0 0x343 8,36 # Chi
+*Y 2140 0 0x348 8,14 # Eta
+*Z 2140 0 0x35a 8,12 # Zeta
+*a 1987 0 0xe0 8,1 # alpha
+*b 1723 0 0xe1 8,3 # beta
+*c 1723 0 0x378 8,29 # xi
+*d 1760 0 0xeb 8,9 # delta
+*e 1760 0 0x36e 8,70 # epsilon
+*f 1760 0 0x366 8,45 # phi
++f 1760 0 0x36a 8,77 # phi1 "variant phi"
+*g 1760 0 0x367 8,7 # gamma
+*h 1643 0 0xe9 8,17 # theta
++h 1643 0 0x375 8,71 # theta1 "variant theta"
+*i 1643 0 0x369 8,19 # iota
+*k 1643 0 0x36b 8,21 # kappa
+*l 1643 0 0x36c 8,23 # lambda
+*m 1667 0 0xe6 8,25 # mu
+*n 1667 0 0x36e 8,27 # nu
+*o 1667 0 0x36f 8,31 # omicron
+*p 2037 0 0xe3 8,33 # pi
++p 2037 0 0x376 8,78 # omega1 "variant pi, looking like omega"
+*q 2037 0 0x379 8,49 # psi
+*r 2037 0 0x372 8,35 # rho
+*s 1753 0 0xe5 8,37 # sigma
+*t 1413 0 0xe7 8,41 # tau
+*u 1413 0 0x375 8,27 # upsilon
+*w 1413 0 0x377 8,51 # omega
+*x 1413 0 0x363 8,47 # chi
+*y 1413 0 0x368 8,15 # eta
+*z 1413 0 0x37a 8,13 # zeta
+ts 1413 0 0x356 8,39 # sigma1 "terminal sigma"
+~~ 2663 0 0xf7 6,13 # approxequal
+~= 2663 0 0xf7 6,13 # approxequal
+!= 2663 0 0x3b9 6,99 # notequal
+** 833 0 0x32a 0,32 # asteriskmath
++- 1880 0 0xf1 6,1 # plusminus
+<= 2413 0 0xf3 6,2 # lessequal
+== 2413 0 0x3ba 8,14 # equivalence
+=~ 2413 0 0x340 8,116 # congruent
+>= 1723 0 0x3b3 8,3 # greaterequal
+AN 1723 0 0x3d9 8,85 # logicaland
+OR 1723 0 0x3da 8,86 # logicalor
+no 1723 0 0x3d8 8,20 # logicalnot
+te 1723 0 0x324 8,121 # existential "there exists, existential quantifier"
+fa 1723 0 0x322 8,122 # universal "for all, universal quantifier"
+Ah 1723 0 0x3c0 9,0 # aleph
+Im 1723 0 0x3c1 8,21 # Ifraktur "Fraktur I, imaginary"
+Re 1723 0 0x3c2 8,22 # Rfraktur "Fraktur R, real"
+if 1723 0 0x3a5 8,19 # infinity
+md 1723 0 0x3b7 8,32 # dotmath
+mo 1723 0 0x3ce 8,15 # element
+mu 1723 0 0x3b4 8,39 # multiply
+nc 1723 0 0x3cb 8,197 # uni2285
+nm 1723 0 0x3cf 8,209 # notelement
+pl 1110 0 0x32b 0,93 # plusmath "plus sign in special font"
+eq 1880 0 0x33d 0,61 # equalmath "equals sign in special font"
+pt 1880 0 0x3b5 6,4 # proportional
+pp 1880 0 0x35e 8,89 # perpendicular
+sb 1880 0 0x3cc 6,67 # propersubset
+sp 1880 0 0x3c9 6,68 # propersuperset
+ib 1880 0 0x3cd 6,69 # reflexsubset
+ip 1880 0 0x3ca 6,70 # reflexsuperset
+ap 1880 0 0x37e 6,12 # similar
+pd 1880 0 0x3b6 6,34 # partialdiff "partial differentiation sign"
+c* 1880 0 0x3c4 6,80 # circlemultiply "multiply sign in a circle"
+c+ 1880 0 0x3c5 6,81 # circleplus "plus sign in a circle"
+ca 2620 0 0xef 6,16 # intersection "intersection, cap"
+cu 2620 0 0x3c8 6,66 # union "union, cup"
+di 1880 0 0x3b8 6,8 # divide "division sign"
+-h 3333 0 0xc4 3,8 # hbar
+hbar "
+gr 3333 0 0x3d1 6,33 # gradient
+es 2407 0 0x3c6 0,79 # emptyset
+CL 2510 0 0x5 5,168 # club "club suit"
+SP 2510 0 0x6 5,171 # spade "spade suit"
+HE 2510 0 0x3 5,170 # heart "heart suit"
+DI 2510 0 0x4 5,169 # diamond "diamond suit"
+CR 2510 0 0x3bf 5,20 # carriagereturn "carriage return symbol"
+st 2510 0 0x327 6,71 # suchthat
+/_ 2510 0 0x3d0 6,79 # angle
+<< 1667 0 0xae 6,77 # "" "much less"
+>> 1667 0 0xaf 6,78 # "" "much greater"
+wp 1667 0 0x3c3 6,53 # weierstrass "Weierstrass p"
+lz 1667 0 0x3e0 6,95 # lozenge
+an 3333 0 0x3be 3,8 # arrowhorizex "horizontal arrow extension"
+pc 833 0 0xfa 6,32 # periodcentered
+mc 1667 0 0xe6 8,25 # mu
+t+- 1880 0 0xf1 6,1 # plusminus
+tmu 1723 0 0x3b4 8,39 # multiply
+tdi 1880 0 0x3b8 6,8 # divide "division sign"
+tno 1723 0 0x3d8 8,20 # logicalnot
+kernpairs
+F A -48
+P A -48
+V A -72
+W A -72
+Y A -72
+A V -96
+A W -72
+A Y -72
+P a -48
+V a -48
+W a -48
+Y a -24
+V c -48
+W c -48
+Y c -24
+P e -48
+V e -48
+W e -48
+Y e -48
+V o -48
+W o -24
+Y o -48
+A v -48
+A w -48
diff --git a/font/devlbp/devlbp.am b/font/devlbp/devlbp.am
new file mode 100644
index 0000000..0702a20
--- /dev/null
+++ b/font/devlbp/devlbp.am
@@ -0,0 +1,60 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+LBPPRINT=$(PSPRINT)
+devlbp_srcdir = $(top_srcdir)/font/devlbp
+DEVLBPFONTFILES = \
+ font/devlbp/HB \
+ font/devlbp/HBI \
+ font/devlbp/HI \
+ font/devlbp/HR \
+ font/devlbp/HNB \
+ font/devlbp/HNBI \
+ font/devlbp/HNI \
+ font/devlbp/HNR \
+ font/devlbp/TB \
+ font/devlbp/TBI \
+ font/devlbp/TI \
+ font/devlbp/TR \
+ font/devlbp/CR \
+ font/devlbp/CB \
+ font/devlbp/CI \
+ font/devlbp/ER \
+ font/devlbp/EB \
+ font/devlbp/EI
+devlbpfontdir = $(fontdir)/devlbp
+devlbpfont_DATA = $(DEVLBPFONTFILES) font/devlbp/DESC
+EXTRA_DIST += $(DEVLBPFONTFILES) font/devlbp/DESC.in
+MOSTLYCLEANFILES += font/devlbp/DESC
+
+font/devlbp/DESC: $(devlbp_srcdir)/DESC.in
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && cat $(devlbp_srcdir)/DESC.in >$@ \
+ && if test "$(PAGE)" = A4; then \
+ echo "papersize a4" >>$@; \
+ else \
+ echo "papersize letter" >>$@; \
+ fi \
+ && (test -z '$(LBPPRINT)' \
+ || echo print '$(LBPPRINT)' >>$@)
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/font/devlj4/AB b/font/devlj4/AB
new file mode 100644
index 0000000..304f84e
--- /dev/null
+++ b/font/devlj4/AB
@@ -0,0 +1,428 @@
+# M Arial Bd
+name AB
+spacewidth 7351
+pcltypeface 16602
+pclproportional 1
+pclweight 3
+pclstyle 0
+ligatures fi fl 0
+kernpairs
+1 1 -1459
+A T -1963
+A V -1963
+A W -1459
+A Y -2428
+A v -981
+A w -477
+A y -981
+A cq -1459
+A ' -1459
+F , -2932
+F . -2932
+F A -1459
+L T -1963
+L V -1963
+L W -1459
+L Y -2428
+L y -981
+L cq -1459
+L ' -1459
+P , -3410
+P . -3410
+P A -1963
+R V -477
+R W -477
+R Y -981
+T , -2932
+T hy -1459
+T - -1459
+T . -2932
+T : -2932
+T ; -2932
+T A -1963
+T O -477
+T a -1963
+T c -1963
+T e -1963
+T i -477
+T o -1963
+T r -1459
+T s -1963
+T u -1963
+T w -1963
+T y -1963
+V , -2428
+V hy -1459
+V - -1459
+V . -2428
+V : -1459
+V ; -1459
+V A -1963
+V a -1459
+V e -1459
+V i -477
+V o -1963
+V r -1459
+V u -981
+V y -981
+W , -1459
+W hy -529
+W - -529
+W . -1459
+W : -477
+W ; -477
+W A -1459
+W a -981
+W e -477
+W i -232
+W o -477
+W r -477
+W u -477
+W y -477
+Y , -2932
+Y hy -1459
+Y - -1459
+Y . -2932
+Y : -1963
+Y ; -1963
+Y A -2428
+Y a -1459
+Y e -1459
+Y i -981
+Y o -1963
+Y p -1459
+Y q -1963
+Y u -1459
+Y v -1459
+f cq 478
+f ' 478
+r , -1459
+r . -1459
+r cq 982
+r ' 982
+v , -1963
+v . -1963
+w , -981
+w . -981
+y , -1963
+y . -1963
+oq oq -981
+oq ` -981
+` oq -981
+` ` -981
+cq s -981
+' s -981
+cq cq -981
+cq ' -981
+' cq -981
+' ' -981
+charset
+! 8811,18939 2 161057 -- U+0021 (19U 33)
+dq 12544,18939 2 161058 -- U+0022 (19U 34)
+" "
+sh 14715,19262,323 2 161059 -- U+0023 (19U 35)
+# "
+Do 14715,20464,2648 2 161060 -- U+0024 (19U 36)
+$ "
+% 23526,19262,762 2 161061 -- U+0025 (19U 37)
+& 19107,19262,491 2 161062 -- U+0026 (19U 38)
+aq 6292,18939 2 161063 -- U+0027 (19U 39)
+( 8811,19262,5568 3 161064 -- U+0028 (19U 40)
+) 8811,19262,5568 3 161065 -- U+0029 (19U 41)
+* 10297,19262 2 161066 -- U+002A (19U 42)
++ 15451,15968 0 161067 -- U+002B (19U 43)
+, 7351,3630,4225 0 161068 -- U+002C (19U 44)
+hy 8811,8682 0 161069 -- U+002D (19U 45)
+- "
+. 7351,3630 0 161070 -- U+002E (19U 46)
+sl 7351,19262,323 2 161071 -- U+002F (19U 47)
+/ "
+0 14715,19017,323 2 161072 -- U+0030 (19U 48)
+1 14715,19017 2 161073 -- U+0031 (19U 49)
+2 14715,19017 2 161074 -- U+0032 (19U 50)
+3 14715,19017,323 2 161075 -- U+0033 (19U 51)
+4 14715,19017 2 161076 -- U+0034 (19U 52)
+5 14715,18681,323 2 161077 -- U+0035 (19U 53)
+6 14715,19017,323 2 161078 -- U+0036 (19U 54)
+7 14715,18681 2 161079 -- U+0037 (19U 55)
+8 14715,19017,336 2 161080 -- U+0038 (19U 56)
+9 14715,19017,336 2 161081 -- U+0039 (19U 57)
+: 8811,13720 0 161082 -- U+003A (19U 58)
+; 8811,13720,4225 0 161083 -- U+003B (19U 59)
+< 15451,16549 0 161084 -- U+003C (19U 60)
+= 15451,13875 0 161085 -- U+003D (19U 61)
+> 15451,16524 0 161086 -- U+003E (19U 62)
+? 16162,19133 2 161087 -- U+003F (19U 63)
+at 25799,19275,5568 3 161088 -- U+0040 (19U 64)
+@ "
+A 19107,18939 2 161089 -- U+0041 (19U 65)
+B 19107,18939 2 161090 -- U+0042 (19U 66)
+C 19107,19262,323 2 161091 -- U+0043 (19U 67)
+D 19107,18939 2 161092 -- U+0044 (19U 68)
+E 17648,18939 2 161093 -- U+0045 (19U 69)
+F 16162,18939 2 161094 -- U+0046 (19U 70)
+G 20580,19262,323 2 161095 -- U+0047 (19U 71)
+H 19107,18939 2 161096 -- U+0048 (19U 72)
+I 7351,18939 2 161097 -- U+0049 (19U 73)
+J 14715,18939,323 2 161098 -- U+004A (19U 74)
+K 19107,18939 2 161099 -- U+004B (19U 75)
+L 16162,18784 2 161100 -- U+004C (19U 76)
+M 22040,18939 2 161101 -- U+004D (19U 77)
+N 19107,18939 2 161102 -- U+004E (19U 78)
+O 20580,19262,323 2 161103 -- U+004F (19U 79)
+P 17648,18939 2 161104 -- U+0050 (19U 80)
+Q 20580,19262,1899 2 161105 -- U+0051 (19U 81)
+R 19107,18939 2 161106 -- U+0052 (19U 82)
+S 17648,19262,336 2 161107 -- U+0053 (19U 83)
+T 16162,18939 2 161108 -- U+0054 (19U 84)
+U 19107,18939,323 2 161109 -- U+0055 (19U 85)
+V 17648,18939 2 161110 -- U+0056 (19U 86)
+W 24973,18939 2 161111 -- U+0057 (19U 87)
+X 17648,18939 2 161112 -- U+0058 (19U 88)
+Y 17648,18939 2 161113 -- U+0059 (19U 89)
+Z 16162,18939 2 161114 -- U+005A (19U 90)
+lB 8811,18939,5336 3 161115 -- U+005B (19U 91)
+[ "
+rs 7351,19262,323 2 161116 -- U+005C (19U 92)
+\ "
+rB 8811,18939,5336 3 161117 -- U+005D (19U 93)
+] "
+ha 15451,19262 2 161118 -- U+005E (19U 94)
+_ 14715,0,5232 1 161119 -- U+005F (19U 95)
+ga 8811,19262 2 161120 -- U+0060 (19U 96)
+a 14715,14030,310 0 161121 -- U+0061 (19U 97)
+b 16162,18939,310 2 161122 -- U+0062 (19U 98)
+c 14715,14030,310 0 161123 -- U+0063 (19U 99)
+d 16162,18939,310 2 161124 -- U+0064 (19U 100)
+e 14715,14030,310 0 161125 -- U+0065 (19U 101)
+f 8811,19262 2 161126 -- U+0066 (19U 102)
+g 16162,14030,5568 1 161127 -- U+0067 (19U 103)
+h 16162,18939 2 161128 -- U+0068 (19U 104)
+i 7351,18939 2 161129 -- U+0069 (19U 105)
+j 7351,18939,5568 3 161130 -- U+006A (19U 106)
+k 14715,18939 2 161131 -- U+006B (19U 107)
+l 7351,18939 2 161132 -- U+006C (19U 108)
+m 23526,14030 0 161133 -- U+006D (19U 109)
+n 16162,14030 0 161134 -- U+006E (19U 110)
+o 16162,14030,310 0 161135 -- U+006F (19U 111)
+p 16162,14030,5219 1 161136 -- U+0070 (19U 112)
+q 16162,14030,5219 1 161137 -- U+0071 (19U 113)
+r 10297,14030 0 161138 -- U+0072 (19U 114)
+s 14715,14030,310 0 161139 -- U+0073 (19U 115)
+t 8811,18565,310 2 161140 -- U+0074 (19U 116)
+u 16162,13720,310 0 161141 -- U+0075 (19U 117)
+v 14715,13720 0 161142 -- U+0076 (19U 118)
+w 20580,13720 0 161143 -- U+0077 (19U 119)
+x 14715,13720 0 161144 -- U+0078 (19U 120)
+y 14715,13720,5568 1 161145 -- U+0079 (19U 121)
+z 13229,13720 0 161146 -- U+007A (19U 122)
+{ 10297,19262,5568 3 161147 -- U+007B (19U 123)
+lC "
+| 7403,19262,5568 3 161148 -- U+007C (19U 124)
+ba "
+} 10297,19262,5568 3 161149 -- U+007D (19U 125)
+rC "
+ti 15451,11937 0 161150 -- U+007E (19U 126)
+r! 8811,13720,5258 1 161185 -- U+00A1 (19U 161)
+ct 14715,18810,5206 3 161186 -- U+00A2 (19U 162)
+Po 14715,19262,323 2 161187 -- U+00A3 (19U 163)
+Cs 14715,16149 0 161188 -- U+00A4 (19U 164)
+Ye 14715,18939 2 161189 -- U+00A5 (19U 165)
+bb 7403,19262,5568 3 161190 -- U+00A6 (19U 166)
+sc 14715,19262,5568 3 161191 -- U+00A7 (19U 167)
+ad 8811,19262 2 161192 -- U+00A8 (19U 168)
+co 19495,19327,465 2 161193 -- U+00A9 (19U 169)
+Of 9793,19262 2 161194 -- U+00AA (19U 170)
+Fo 14715,12699 0 161195 -- U+00AB (19U 171)
+tno 15451,13875 0 161196 -- U+00AC (19U 172)
+u00AD 8811,8682 0 161197 -- U+00AD (19U 173)
+rg 19495,19327,465 2 161198 -- U+00AE (19U 174)
+u00AF 14612,22415 2 161199 -- U+00AF (19U 175)
+de 10581,19262 2 161200 -- U+00B0 (19U 176)
+t+- 14521,17841 2 161201 -- U+00B1 (19U 177)
+S2 8811,19172 2 161202 -- U+00B2 (19U 178)
+S3 8811,19172 2 161203 -- U+00B3 (19U 179)
+aa 8811,19262 2 161204 -- U+00B4 (19U 180)
+mc 15245,13720,5258 1 161205 -- U+00B5 (19U 181)
+ps 14715,18939,5206 3 161206 -- U+00B6 (19U 182)
+pc 7351,11033 0 60157 -- U+00B7 ( 7J 253)
+ac 8811,0,5413 1 161208 -- U+00B8 (19U 184)
+S1 8811,19172 2 161209 -- U+00B9 (19U 185)
+Om 9663,19262 2 161210 -- U+00BA (19U 186)
+Fc 14715,12699 0 161211 -- U+00BB (19U 187)
+14 22066,19172,698 2 161212 -- U+00BC (19U 188)
+12 22066,19172,698 2 161213 -- U+00BD (19U 189)
+34 22066,19172,698 2 161214 -- U+00BE (19U 190)
+r? 16162,13720,5426 1 161215 -- U+00BF (19U 191)
+`A 19107,23887 2 161216 -- U+00C0 (19U 192)
+'A 19107,23887 2 161217 -- U+00C1 (19U 193)
+^A 19107,23836 2 161218 -- U+00C2 (19U 194)
+~A 19107,23280 2 161219 -- U+00C3 (19U 195)
+:A 19107,23138 2 161220 -- U+00C4 (19U 196)
+oA 19107,22712 2 161221 -- U+00C5 (19U 197)
+AE 26458,18939 2 161222 -- U+00C6 (19U 198)
+,C 19107,19262,5413 3 161223 -- U+00C7 (19U 199)
+`E 17648,23887 2 161224 -- U+00C8 (19U 200)
+'E 17648,23887 2 161225 -- U+00C9 (19U 201)
+^E 17648,23836 2 161226 -- U+00CA (19U 202)
+:E 17648,23138 2 161227 -- U+00CB (19U 203)
+`I 7351,23887 2 161228 -- U+00CC (19U 204)
+'I 7351,23887 2 161229 -- U+00CD (19U 205)
+^I 7351,23836 2 161230 -- U+00CE (19U 206)
+:I 7351,23138 2 161231 -- U+00CF (19U 207)
+-D 19107,18939 2 161232 -- U+00D0 (19U 208)
+~N 19107,23280 2 161233 -- U+00D1 (19U 209)
+`O 20580,23887,323 2 161234 -- U+00D2 (19U 210)
+'O 20580,23887,323 2 161235 -- U+00D3 (19U 211)
+^O 20580,23836,323 2 161236 -- U+00D4 (19U 212)
+~O 20580,23280,323 2 161237 -- U+00D5 (19U 213)
+:O 20580,23138,323 2 161238 -- U+00D6 (19U 214)
+tmu 15451,15645 0 161239 -- U+00D7 (19U 215)
+/O 20580,19844,1059 2 161240 -- U+00D8 (19U 216)
+`U 19107,23887,323 2 161241 -- U+00D9 (19U 217)
+'U 19107,23887,323 2 161242 -- U+00DA (19U 218)
+^U 19107,23836,323 2 161243 -- U+00DB (19U 219)
+:U 19107,23138,323 2 161244 -- U+00DC (19U 220)
+'Y 17648,23887 2 161245 -- U+00DD (19U 221)
+TP 17648,18939 2 161246 -- U+00DE (19U 222)
+ss 16162,19262,310 2 161247 -- U+00DF (19U 223)
+`a 14715,19262,310 2 161248 -- U+00E0 (19U 224)
+'a 14715,19262,310 2 161249 -- U+00E1 (19U 225)
+^a 14715,19262,310 2 161250 -- U+00E2 (19U 226)
+~a 14715,18862,310 2 161251 -- U+00E3 (19U 227)
+:a 14715,19262,310 2 161252 -- U+00E4 (19U 228)
+oa 14715,19870,310 2 161253 -- U+00E5 (19U 229)
+ae 23526,14030,310 0 161254 -- U+00E6 (19U 230)
+,c 14715,14030,5413 1 161255 -- U+00E7 (19U 231)
+`e 14715,19262,310 2 161256 -- U+00E8 (19U 232)
+'e 14715,19262,310 2 161257 -- U+00E9 (19U 233)
+^e 14715,19262,310 2 161258 -- U+00EA (19U 234)
+:e 14715,19262,310 2 161259 -- U+00EB (19U 235)
+`i 7351,19262 2 161260 -- U+00EC (19U 236)
+'i 7351,19262 2 161261 -- U+00ED (19U 237)
+^i 7351,19262 2 161262 -- U+00EE (19U 238)
+:i 7351,19262 2 161263 -- U+00EF (19U 239)
+Sd 16162,18939,323 2 161264 -- U+00F0 (19U 240)
+~n 16162,18862 2 161265 -- U+00F1 (19U 241)
+`o 16162,19262,310 2 161266 -- U+00F2 (19U 242)
+'o 16162,19262,310 2 161267 -- U+00F3 (19U 243)
+^o 16162,19262,310 2 161268 -- U+00F4 (19U 244)
+~o 16162,18862,310 2 161269 -- U+00F5 (19U 245)
+:o 16162,19262,310 2 161270 -- U+00F6 (19U 246)
+tdi 14521,16304 0 161271 -- U+00F7 (19U 247)
+/o 16162,14456,943 0 161272 -- U+00F8 (19U 248)
+`u 16162,19262,310 2 161273 -- U+00F9 (19U 249)
+'u 16162,19262,310 2 161274 -- U+00FA (19U 250)
+^u 16162,19262,310 2 161275 -- U+00FB (19U 251)
+:u 16162,19262,310 2 161276 -- U+00FC (19U 252)
+'y 14715,19262,5568 3 161277 -- U+00FD (19U 253)
+Tp 16162,18939,5219 3 161278 -- U+00FE (19U 254)
+:y 14715,19262,5568 3 161279 -- U+00FF (19U 255)
+u0041_0306 19107,23719 2 75203 -- U+0102 ( 9E 195)
+u0061_0306 14715,19262,310 2 75235 -- U+0103 ( 9E 227)
+u0041_0328 19107,18939,5568 3 75173 -- U+0104 ( 9E 165)
+u0061_0328 14715,14030,5568 1 75193 -- U+0105 ( 9E 185)
+'C 19107,23887,323 2 75206 -- U+0106 ( 9E 198)
+'c 14715,19262,310 2 75238 -- U+0107 ( 9E 230)
+u0041_030C 19107,23913,323 2 75208 -- U+010C ( 9E 200)
+u0061_030C 14715,19262,310 2 75240 -- U+010D ( 9E 232)
+u0044_030C 19107,23913 2 75215 -- U+010E ( 9E 207)
+u0064_030C 19017,18939,310 2 75247 -- U+010F ( 9E 239)
+u0111 16162,18939,310 2 75248 -- U+0111 ( 9E 240)
+u0045_0328 17648,18939,5568 3 75210 -- U+0118 ( 9E 202)
+u0065_0328 14715,14030,5568 1 75242 -- U+0119 ( 9E 234)
+u0045_030C 17648,23913 2 75212 -- U+011A ( 9E 204)
+u0065_030C 14715,19262,310 2 75244 -- U+011B ( 9E 236)
+u0047_0306 20580,23719,323 2 46288 -- U+011E ( 5T 208)
+u0067_0306 16162,19262,5568 3 46320 -- U+011F ( 5T 240)
+u0049_0307 7351,23461 2 46301 -- U+0130 ( 5T 221)
+.i 7351,13720 0 46333 -- U+0131 ( 5T 253)
+IJ 20761,18939,323 2 60135 -- U+0132 ( 7J 231)
+ij 14715,18939,5568 3 60134 -- U+0133 ( 7J 230)
+u004C_0301 16162,23887 2 75205 -- U+0139 ( 9E 197)
+u006C_0301 7351,23771 2 75237 -- U+013A ( 9E 229)
+u004C_030C 16162,18784 2 75196 -- U+013D ( 9E 188)
+u006C_030C 10193,18939 2 75198 -- U+013E ( 9E 190)
+u013F 16162,18784 2 95646 -- U+013F (11U 158)
+u0140 12674,18939 2 95647 -- U+0140 (11U 159)
+/L 16162,18939 2 75171 -- U+0141 ( 9E 163)
+/l 7351,18939 2 75187 -- U+0142 ( 9E 179)
+u004E_0301 19107,23887 2 75217 -- U+0143 ( 9E 209)
+u006E_0301 16162,19262 2 75249 -- U+0144 ( 9E 241)
+u004E_030C 19107,23913 2 75218 -- U+0147 ( 9E 210)
+u006E_030C 16162,19262 2 75250 -- U+0148 ( 9E 242)
+u0149 18746,18939 2 95660 -- U+0149 (11U 172)
+u004F_030B 20580,23875,323 2 75221 -- U+0150 ( 9E 213)
+u006F_030B 16162,19314,310 2 75253 -- U+0151 ( 9E 245)
+OE 26458,19262,323 2 161164 -- U+0152 (19U 140)
+oe 24973,14030,310 0 161180 -- U+0153 (19U 156)
+u0052_0301 19107,23887 2 75200 -- U+0154 ( 9E 192)
+u0072_0301 10297,19262 2 75232 -- U+0155 ( 9E 224)
+u0052_030C 19107,23913 2 75224 -- U+0158 ( 9E 216)
+u0072_030C 10297,19262 2 75256 -- U+0159 ( 9E 248)
+u0053_0301 17648,23887,336 2 75148 -- U+015A ( 9E 140)
+u0073_0301 14715,19262,310 2 75164 -- U+015B ( 9E 156)
+u0053_0327 17648,19262,5413 3 75178 -- U+015E ( 9E 170)
+u0073_0327 14715,14030,5413 1 75194 -- U+015F ( 9E 186)
+vS 17648,23913,336 2 161162 -- U+0160 (19U 138)
+vs 14715,19262,310 2 161178 -- U+0161 (19U 154)
+u0054_0327 16162,18939,8436 3 75230 -- U+0162 ( 9E 222)
+u0074_0327 8811,18565,7751 3 75262 -- U+0163 ( 9E 254)
+u0054_030C 16162,23913 2 75149 -- U+0164 ( 9E 141)
+u0074_030C 12674,18939,310 2 75165 -- U+0165 ( 9E 157)
+u0055_030A 19107,24327,323 2 75225 -- U+016E ( 9E 217)
+u0075_030A 16162,19870,310 2 75257 -- U+016F ( 9E 249)
+u0055_030B 19107,23875,323 2 75227 -- U+0170 ( 9E 219)
+u0075_030B 16162,19314,310 2 75259 -- U+0171 ( 9E 251)
+:Y 17648,23138 2 161183 -- U+0178 (19U 159)
+u005A_0301 16162,23887 2 75151 -- U+0179 ( 9E 143)
+u007A_0301 13229,19262 2 75167 -- U+017A ( 9E 159)
+u005A_0307 16162,23552 2 75183 -- U+017B ( 9E 175)
+u007A_0307 13229,19262 2 75199 -- U+017C ( 9E 191)
+vZ 16162,23913 2 75150 -- U+017D ( 9E 142)
+vz 13229,19262 2 75166 -- U+017E ( 9E 158)
+Fn 14715,19262,5568 3 161155 -- U+0192 (19U 131)
+a^ 8811,19262 2 161160 -- U+02C6 (19U 136)
+^ "
+ah 8811,19262 2 75169 -- U+02C7 ( 9E 161)
+a- 8811,18371 2 60154 -- U+02C9 ( 7J 250)
+ab 8811,19262 2 75170 -- U+02D8 ( 9E 162)
+a. 8811,19262 2 75263 -- U+02D9 ( 9E 255)
+ao 8811,19870 2 60152 -- U+02DA ( 7J 248)
+ho 8811,336,5568 1 75186 -- U+02DB ( 9E 178)
+~ 8811,18862 2 161176 -- U+02DC (19U 152)
+a~ "
+a" 8811,19314 2 75197 -- U+02DD ( 9E 189)
+en 14715,8217 0 161174 -- U+2013 (19U 150)
+em 26458,8217 0 161175 -- U+2014 (19U 151)
+u2017 14612,0,9961 1 60095 -- U+2017 ( 7J 191)
+oq 7351,19120 2 161169 -- U+2018 (19U 145)
+` "
+cq 7351,18888 2 161170 -- U+2019 (19U 146)
+' "
+bq 7351,3630,4225 0 161154 -- U+201A (19U 130)
+lq 13229,19120 2 161171 -- U+201C (19U 147)
+rq 13229,18939 2 161172 -- U+201D (19U 148)
+Bq 13229,3630,4237 0 161156 -- U+201E (19U 132)
+dg 14715,18707,4522 2 161158 -- U+2020 (19U 134)
+dd 14715,18707,4522 2 161159 -- U+2021 (19U 135)
+bu 9263,13165 0 161173 -- U+2022 (19U 149)
+u2026 26458,3630 0 161157 -- U+2026 (19U 133)
+%0 26458,19262,762 2 161161 -- U+2030 (19U 137)
+fm 6343,18939 2 60101 -- U+2032 ( 7J 197)
+sd 12674,18939 2 60102 -- U+2033 ( 7J 198)
+fo 8811,12699 0 161163 -- U+2039 (19U 139)
+fc 8811,12699 0 161179 -- U+203A (19U 155)
+u203C 15981,18939 2 87315 -- U+203C (10U 19)
+u207F 10477,15477 0 87548 -- U+207F (10U 252)
+u20A7 28939,18939,336 2 60121 -- U+20A7 ( 7J 217)
+Eu 14715,19262,323 2 161152 -- U+20AC (19U 128)
+u2105 23422,19262,723 2 60072 -- U+2105 ( 7J 168)
+u2113 12932,19262,310 2 60122 -- U+2113 ( 7J 218)
+tm 26458,18939 2 161177 -- U+2122 (19U 153)
+\- 15451,11046 0 60096 -- U+2212 ( 7J 192)
+f/ 4418,19172,698 2 60109 -- U+2215 ( 7J 205)
+sq 15981,12196 0 60091 -- U+25A1 ( 7J 187)
+u25CA 13074,18371 2 101079 -- U+25CA (12J 215)
+fi 16162,19262 2 60077 -- U+FB01 ( 7J 173)
+fl 16162,19262 2 60078 -- U+FB02 ( 7J 174)
diff --git a/font/devlj4/ABI b/font/devlj4/ABI
new file mode 100644
index 0000000..af145cd
--- /dev/null
+++ b/font/devlj4/ABI
@@ -0,0 +1,428 @@
+# M Arial Bd It
+name ABI
+spacewidth 7351
+slant 12.000000
+pcltypeface 16602
+pclproportional 1
+pclweight 3
+pclstyle 1
+ligatures fi fl 0
+kernpairs
+1 1 -1963
+A T -1963
+A V -1963
+A W -1459
+A Y -1963
+A cq -1459
+A ' -1459
+F , -2932
+F . -2932
+F A -1459
+L T -1963
+L V -1459
+L W -1459
+L Y -1963
+L cq -1963
+L ' -1963
+P , -3410
+P . -3410
+P A -1963
+R T -477
+R W -477
+R Y -477
+T , -1963
+T hy -1459
+T - -1459
+T . -1963
+T : -1963
+T ; -1963
+T A -1963
+T O -477
+T a -981
+T c -981
+T e -981
+T i -477
+T o -981
+T r -477
+T s -981
+T u -477
+T w -981
+T y -981
+V , -2428
+V hy -981
+V - -981
+V . -2428
+V : -981
+V ; -981
+V A -1963
+V a -981
+V e -981
+V i -981
+V o -981
+V r -477
+V u -477
+V y -477
+W , -1963
+W hy -981
+W - -981
+W . -1963
+W : -981
+W ; -981
+W A -1459
+W a -477
+W e -477
+W i -232
+W o -477
+W r -477
+W u -477
+W y -477
+Y , -2428
+Y hy -1963
+Y - -1963
+Y . -2428
+Y : -1459
+Y ; -1459
+Y A -1963
+Y a -981
+Y e -981
+Y i -981
+Y o -981
+Y p -981
+Y q -981
+Y u -981
+Y v -981
+f f -477
+f cq 478
+f ' 478
+r , -1459
+r . -1459
+r cq 982
+r ' 982
+v , -1459
+v . -1459
+w , -981
+w . -981
+y , -981
+y . -981
+oq oq -981
+oq ` -981
+` oq -981
+` ` -981
+cq s -477
+' s -477
+cq t 478
+' t 478
+cq cq -981
+cq ' -981
+' cq -981
+' ' -981
+charset
+! 8811,18939,0,1847,-309,181 2 161057 -- U+0021 (19U 33)
+dq 12544,18939,0,2093,-2596,181 2 161058 -- U+0022 (19U 34)
+" "
+sh 14715,19262,323,2041,52,181 2 161059 -- U+0023 (19U 35)
+# "
+Do 14715,20373,2623,1847,155,181 2 161060 -- U+0024 (19U 36)
+$ "
+% 23526,19262,814,659,-1084,181 2 161061 -- U+0025 (19U 37)
+& 19107,19262,439,891,-877,181 2 161062 -- U+0026 (19U 38)
+aq 6292,18939,0,3734,-2686,181 2 161063 -- U+0027 (19U 39)
+( 8811,19262,5568,4031,-425,181 3 161064 -- U+0028 (19U 40)
+) 8811,19262,5568,220,3385,181 3 161065 -- U+0029 (19U 41)
+* 10297,19262,0,2984,-1278,181 2 161066 -- U+002A (19U 42)
++ 15451,15968,0,1240,-813,181 0 161067 -- U+002B (19U 43)
+, 7351,3579,4108,0,1046 0 161068 -- U+002C (19U 44)
+hy 8811,8617,0,1473,297,181 0 161069 -- U+002D (19U 45)
+- "
+. 7351,3579,0,0,155 0 161070 -- U+002E (19U 46)
+sl 7351,19262,323,4780,2468,181 2 161071 -- U+002F (19U 47)
+/ "
+0 14715,19017,323,1718,-387,181 2 161072 -- U+0030 (19U 48)
+1 14715,19056,0,116,-1821,116 2 161073 -- U+0031 (19U 49)
+2 14715,19017,0,1705,-283,181 2 161074 -- U+0032 (19U 50)
+3 14715,19017,323,1421,-25,181 2 161075 -- U+0033 (19U 51)
+4 14715,18939,0,1421,594,181 2 161076 -- U+0034 (19U 52)
+5 14715,18681,323,1886,-361,181 2 161077 -- U+0035 (19U 53)
+6 14715,19017,336,1835,-826,181 2 161078 -- U+0036 (19U 54)
+7 14715,18681,0,2545,-1420,181 2 161079 -- U+0037 (19U 55)
+8 14715,19017,336,1602,-425,181 2 161080 -- U+0038 (19U 56)
+9 14715,19017,323,1369,-361,181 2 161081 -- U+0039 (19U 57)
+: 8811,13720,0,891,-542,181 0 161082 -- U+003A (19U 58)
+; 8811,13720,4108,969,245,181 0 161083 -- U+003B (19U 59)
+< 15451,16549,0,1111,-942,181 0 161084 -- U+003C (19U 60)
+= 15451,13875,0,1240,-813,181 0 161085 -- U+003D (19U 61)
+> 15451,16524,0,1124,-942,181 0 161086 -- U+003E (19U 62)
+? 16162,19262,0,1512,-1937,181 2 161087 -- U+003F (19U 63)
+at 25799,19275,5568,2157,-399,181 3 161088 -- U+0040 (19U 64)
+@ "
+A 19107,18939,0,26,1615,26 2 161089 -- U+0041 (19U 65)
+B 19107,18939,0,995,258,181 2 161090 -- U+0042 (19U 66)
+C 19107,19262,336,1938,-1188,181 2 161091 -- U+0043 (19U 67)
+D 19107,18939,0,1382,168,181 2 161092 -- U+0044 (19U 68)
+E 17648,18939,0,2752,233,181 2 161093 -- U+0045 (19U 69)
+F 16162,18939,0,3411,284,181 2 161094 -- U+0046 (19U 70)
+G 20580,19262,323,1524,-1020,181 2 161095 -- U+0047 (19U 71)
+H 19107,18939,0,2442,168,181 2 161096 -- U+0048 (19U 72)
+I 7351,18939,0,2739,400,181 2 161097 -- U+0049 (19U 73)
+J 14715,18939,323,2468,556,181 2 161098 -- U+004A (19U 74)
+K 19107,18939,0,3411,271,181 2 161099 -- U+004B (19U 75)
+L 16162,18939,0,543,129,181 2 161100 -- U+004C (19U 76)
+M 22040,18939,0,2519,245,181 2 161101 -- U+004D (19U 77)
+N 19107,18939,0,2390,129,181 2 161102 -- U+004E (19U 78)
+O 20580,19262,336,1486,-994,181 2 161103 -- U+004F (19U 79)
+P 17648,18939,0,2248,245,181 2 161104 -- U+0050 (19U 80)
+Q 20580,19262,2519,1473,-994,181 2 161105 -- U+0051 (19U 81)
+R 19107,18939,0,1822,155,181 2 161106 -- U+0052 (19U 82)
+S 17648,19262,323,1563,-309,181 2 161107 -- U+0053 (19U 83)
+T 16162,18939,0,3914,-1859,181 2 161108 -- U+0054 (19U 84)
+U 19107,18939,323,2455,-1097,181 2 161109 -- U+0055 (19U 85)
+V 17648,18939,0,4664,-1678,181 2 161110 -- U+0056 (19U 86)
+W 24973,18939,0,4599,-1782,181 2 161111 -- U+0057 (19U 87)
+X 17648,18939,0,4405,2119,181 2 161112 -- U+0058 (19U 88)
+Y 17648,18939,0,4431,-1717,181 2 161113 -- U+0059 (19U 89)
+Z 16162,18939,0,2829,659,181 2 161114 -- U+005A (19U 90)
+lB 8811,18939,5219,4121,1059,181 3 161115 -- U+005B (19U 91)
+[ "
+rs 7351,19262,323,1563,-748,181 2 161116 -- U+005C (19U 92)
+\ "
+rB 8811,18939,5219,2429,2791,181 3 161117 -- U+005D (19U 93)
+] "
+ha 15451,19262,0,1111,-1459,181 2 161118 -- U+005E (19U 94)
+_ 14715,0,5232,1447,1563,181 1 161119 -- U+005F (19U 95)
+ga 8811,19366,0,1266,-2221,181 2 161120 -- U+0060 (19U 96)
+a 14715,14043,323,711,129,181 0 161121 -- U+0061 (19U 97)
+b 16162,18939,323,1072,362,181 2 161122 -- U+0062 (19U 98)
+c 14715,14043,323,1537,-270,181 0 161123 -- U+0063 (19U 99)
+d 16162,18939,323,2842,-244,181 2 161124 -- U+0064 (19U 100)
+e 14715,14043,323,1279,-219,181 0 161125 -- U+0065 (19U 101)
+f 8811,19262,0,4961,-102,181 2 161126 -- U+0066 (19U 102)
+g 16162,14043,5568,1628,491,181 1 161127 -- U+0067 (19U 103)
+h 16162,18939,0,788,207,181 2 161128 -- U+0068 (19U 104)
+i 7351,18939,0,2687,258,181 2 161129 -- U+0069 (19U 105)
+j 7351,18939,5568,2726,4212,181 3 161130 -- U+006A (19U 106)
+k 14715,18939,0,2855,323,181 2 161131 -- U+006B (19U 107)
+l 7351,18939,0,2661,284,181 2 161132 -- U+006C (19U 108)
+m 23526,14043,0,775,375,181 0 161133 -- U+006D (19U 109)
+n 16162,14043,0,801,207,181 0 161134 -- U+006E (19U 110)
+o 16162,14043,323,1008,-283,181 0 161135 -- U+006F (19U 111)
+p 16162,14043,5232,1176,1460,181 1 161136 -- U+0070 (19U 112)
+q 16162,14043,5232,1692,-257,181 1 161137 -- U+0071 (19U 113)
+r 10297,14043,0,3566,465,181 0 161138 -- U+0072 (19U 114)
+s 14715,14043,323,1201,736,181 0 161139 -- U+0073 (19U 115)
+t 8811,18474,323,2842,-671,181 2 161140 -- U+0074 (19U 116)
+u 16162,13720,323,1537,-542,181 0 161141 -- U+0075 (19U 117)
+v 14715,13720,0,2958,-658,181 0 161142 -- U+0076 (19U 118)
+w 20580,13720,0,2971,-580,181 0 161143 -- U+0077 (19U 119)
+x 14715,13720,0,2803,1899,181 0 161144 -- U+0078 (19U 120)
+y 14715,13720,5568,3023,1150,181 1 161145 -- U+0079 (19U 121)
+z 13229,13720,0,1809,878,181 0 161146 -- U+007A (19U 122)
+{ 10297,19262,5568,3992,207,181 3 161147 -- U+007B (19U 123)
+lC "
+| 7403,19262,5568,0,-955 3 161148 -- U+007C (19U 124)
+ba "
+} 10297,19262,5568,633,3566,181 3 161149 -- U+007D (19U 125)
+rC "
+ti 15451,11937,0,1357,-451,181 0 161150 -- U+007E (19U 126)
+r! 8811,13720,5219,568,1008,181 1 161185 -- U+00A1 (19U 161)
+ct 14715,18888,5103,1486,-232,181 3 161186 -- U+00A2 (19U 162)
+Po 14715,19262,478,2752,775,181 2 161187 -- U+00A3 (19U 163)
+Cs 14715,16149,0,1809,-425,181 0 161188 -- U+00A4 (19U 164)
+Ye 14715,18939,0,4237,685,181 2 161189 -- U+00A5 (19U 165)
+bb 7403,19262,5568,0,-955 3 161190 -- U+00A6 (19U 166)
+sc 14715,19262,5607,1421,749,181 3 161191 -- U+00A7 (19U 167)
+ad 8811,18965,0,4018,-916,181 2 161192 -- U+00A8 (19U 168)
+co 19495,19327,465,2765,168,181 2 161193 -- U+00A9 (19U 169)
+Of 9793,19262,0,2429,-852,181 2 161194 -- U+00AA (19U 170)
+Fo 14715,12622,0,2235,-852,181 0 161195 -- U+00AB (19U 171)
+tno 15451,13875,0,1240,-813,181 0 161196 -- U+00AC (19U 172)
+u00AD 8811,8617,0,1473,297,181 0 161197 -- U+00AD (19U 173)
+rg 19495,19327,465,2765,168,181 2 161198 -- U+00AE (19U 174)
+u00AF 14612,22415,0,3604,-490,181 2 161199 -- U+00AF (19U 175)
+de 10581,19262,0,1886,-1588,181 2 161200 -- U+00B0 (19U 176)
+t+- 14521,17841,0,1718,-361,181 2 161201 -- U+00B1 (19U 177)
+S2 8811,19172,0,2984,-852,181 2 161202 -- U+00B2 (19U 178)
+S3 8811,19172,0,2816,-697,181 2 161203 -- U+00B3 (19U 179)
+aa 8811,19327,0,4018,-3539,181 2 161204 -- U+00B4 (19U 180)
+mc 15245,13720,5310,1537,2300,181 1 161205 -- U+00B5 (19U 181)
+ps 14715,18939,5206,2377,155,181 3 161206 -- U+00B6 (19U 182)
+pc 7351,11033,0,0,-580 0 60157 -- U+00B7 ( 7J 253)
+ac 8811,0,5491,0,1137 1 161208 -- U+00B8 (19U 184)
+S1 8811,19198,0,2080,-1717,181 2 161209 -- U+00B9 (19U 185)
+Om 9663,19262,0,2623,-593,181 2 161210 -- U+00BA (19U 186)
+Fc 14715,12622,0,659,723,181 0 161211 -- U+00BB (19U 187)
+14 22066,19172,788,1473,-1317,181 2 161212 -- U+00BC (19U 188)
+12 22066,19172,788,1357,-929,181 2 161213 -- U+00BD (19U 189)
+34 22066,19172,788,1783,-684,181 2 161214 -- U+00BE (19U 190)
+r? 16162,13720,5542,0,607 1 161215 -- U+00BF (19U 191)
+`A 19107,23952,0,26,1615,26 2 161216 -- U+00C0 (19U 192)
+'A 19107,23913,0,362,1615,181 2 161217 -- U+00C1 (19U 193)
+^A 19107,23952,0,142,1499,142 2 161218 -- U+00C2 (19U 194)
+~A 19107,23125,0,26,1615,26 2 161219 -- U+00C3 (19U 195)
+:A 19107,23177,0,271,1563,181 2 161220 -- U+00C4 (19U 196)
+oA 19107,22596,245,26,1615,26 2 161221 -- U+00C5 (19U 197)
+AE 26458,18939,0,2881,2170,181 2 161222 -- U+00C6 (19U 198)
+,C 19107,19262,5413,1938,-1188,181 3 161223 -- U+00C7 (19U 199)
+`E 17648,23952,0,2752,233,181 2 161224 -- U+00C8 (19U 200)
+'E 17648,23913,0,2752,233,181 2 161225 -- U+00C9 (19U 201)
+^E 17648,23952,0,2752,233,181 2 161226 -- U+00CA (19U 202)
+:E 17648,23177,0,2752,233,181 2 161227 -- U+00CB (19U 203)
+`I 7351,23952,0,4095,400,181 2 161228 -- U+00CC (19U 204)
+'I 7351,23913,0,5904,400,181 2 161229 -- U+00CD (19U 205)
+^I 7351,23952,0,5245,400,181 2 161230 -- U+00CE (19U 206)
+:I 7351,23177,0,5943,400,181 2 161231 -- U+00CF (19U 207)
+-D 19107,18939,0,1395,349,181 2 161232 -- U+00D0 (19U 208)
+~N 19107,23125,0,2390,129,181 2 161233 -- U+00D1 (19U 209)
+`O 20580,23952,336,1486,-994,181 2 161234 -- U+00D2 (19U 210)
+'O 20580,23913,336,1486,-994,181 2 161235 -- U+00D3 (19U 211)
+^O 20580,23952,336,1486,-994,181 2 161236 -- U+00D4 (19U 212)
+~O 20580,23125,336,1486,-994,181 2 161237 -- U+00D5 (19U 213)
+:O 20580,23177,336,1486,-994,181 2 161238 -- U+00D6 (19U 214)
+tmu 15451,15645,0,917,-1123,181 0 161239 -- U+00D7 (19U 215)
+/O 20580,20283,1576,1550,-735,181 2 161240 -- U+00D8 (19U 216)
+`U 19107,23952,323,2455,-1097,181 2 161241 -- U+00D9 (19U 217)
+'U 19107,23913,323,2455,-1097,181 2 161242 -- U+00DA (19U 218)
+^U 19107,23952,323,2455,-1097,181 2 161243 -- U+00DB (19U 219)
+:U 19107,23177,323,2455,-1097,181 2 161244 -- U+00DC (19U 220)
+'Y 17648,23913,0,4431,-1717,181 2 161245 -- U+00DD (19U 221)
+TP 17648,18939,0,1486,245,181 2 161246 -- U+00DE (19U 222)
+ss 16162,19262,323,543,388,181 2 161247 -- U+00DF (19U 223)
+`a 14715,19366,323,711,129,181 2 161248 -- U+00E0 (19U 224)
+'a 14715,19327,323,1615,129,181 2 161249 -- U+00E1 (19U 225)
+^a 14715,19353,323,711,129,181 2 161250 -- U+00E2 (19U 226)
+~a 14715,18797,323,840,439,181 2 161251 -- U+00E3 (19U 227)
+:a 14715,18965,323,1253,129,181 2 161252 -- U+00E4 (19U 228)
+oa 14715,19947,323,711,129,181 2 161253 -- U+00E5 (19U 229)
+ae 23526,14043,323,698,504,181 0 161254 -- U+00E6 (19U 230)
+,c 14715,14043,5387,1524,-257,181 1 161255 -- U+00E7 (19U 231)
+`e 14715,19366,323,1279,-219,181 2 161256 -- U+00E8 (19U 232)
+'e 14715,19327,323,1473,-219,181 2 161257 -- U+00E9 (19U 233)
+^e 14715,19353,323,1279,-219,181 2 161258 -- U+00EA (19U 234)
+:e 14715,18965,323,1279,-219,181 2 161259 -- U+00EB (19U 235)
+`i 7351,19366,0,3152,258,181 2 161260 -- U+00EC (19U 236)
+'i 7351,19327,0,4896,258,181 2 161261 -- U+00ED (19U 237)
+^i 7351,19353,0,4276,258,181 2 161262 -- U+00EE (19U 238)
+:i 7351,18965,0,5013,258,181 2 161263 -- U+00EF (19U 239)
+Sd 16162,18939,336,1240,-283,181 2 161264 -- U+00F0 (19U 240)
+~n 16162,18797,0,801,207,181 2 161265 -- U+00F1 (19U 241)
+`o 16162,19366,323,1008,-283,181 2 161266 -- U+00F2 (19U 242)
+'o 16162,19327,323,1008,-283,181 2 161267 -- U+00F3 (19U 243)
+^o 16162,19353,323,1008,-283,181 2 161268 -- U+00F4 (19U 244)
+~o 16162,18797,323,1008,-283,181 2 161269 -- U+00F5 (19U 245)
+:o 16162,18965,323,1008,-283,181 2 161270 -- U+00F6 (19U 246)
+tdi 14521,16304,0,1718,-361,181 0 161271 -- U+00F7 (19U 247)
+/o 16162,15115,1382,1137,-77,181 0 161272 -- U+00F8 (19U 248)
+`u 16162,19366,323,1537,-542,181 2 161273 -- U+00F9 (19U 249)
+'u 16162,19327,323,1537,-542,181 2 161274 -- U+00FA (19U 250)
+^u 16162,19353,323,1537,-542,181 2 161275 -- U+00FB (19U 251)
+:u 16162,18965,323,1537,-542,181 2 161276 -- U+00FC (19U 252)
+'y 14715,19327,5568,3023,1150,181 3 161277 -- U+00FD (19U 253)
+Tp 16162,18939,5232,1098,1563,181 3 161278 -- U+00FE (19U 254)
+:y 14715,18965,5568,3023,1150,181 3 161279 -- U+00FF (19U 255)
+u0041_0306 19107,23500,0,26,1615,26 2 75203 -- U+0102 ( 9E 195)
+u0061_0306 14715,19224,323,956,129,181 2 75235 -- U+0103 ( 9E 227)
+u0041_0328 19107,18939,5491,1111,1615,181 3 75173 -- U+0104 ( 9E 165)
+u0061_0328 14715,14043,5491,814,129,181 1 75193 -- U+0105 ( 9E 185)
+'C 19107,23913,336,1938,-1188,181 2 75206 -- U+0106 ( 9E 198)
+'c 14715,19327,323,1537,-270,181 2 75238 -- U+0107 ( 9E 230)
+u0041_030C 19107,23875,336,1938,-1188,181 2 75208 -- U+010C ( 9E 200)
+u0061_030C 14715,19353,323,1925,-270,181 2 75240 -- U+010D ( 9E 232)
+u0044_030C 19107,23952,0,1382,168,181 2 75215 -- U+010E ( 9E 207)
+u0064_030C 19572,18939,323,4380,-244,181 2 75247 -- U+010F ( 9E 239)
+u0111 16162,18939,323,4405,-244,181 2 75248 -- U+0111 ( 9E 240)
+u0045_0328 17648,18939,5491,2752,233,181 3 75210 -- U+0118 ( 9E 202)
+u0065_0328 14715,14043,5491,1279,-219,181 1 75242 -- U+0119 ( 9E 234)
+u0045_030C 17648,23952,0,2752,233,181 2 75212 -- U+011A ( 9E 204)
+u0065_030C 14715,19353,323,1292,-219,181 2 75244 -- U+011B ( 9E 236)
+u0047_0306 20580,23500,323,1524,-1020,181 2 46288 -- U+011E ( 5T 208)
+u0067_0306 16162,19224,5568,1628,491,181 3 46320 -- U+011F ( 5T 240)
+u0049_0307 7351,23397,0,3604,400,181 2 46301 -- U+0130 ( 5T 221)
+.i 7351,13720,0,1602,258,181 0 46333 -- U+0131 ( 5T 253)
+IJ 20696,18939,323,2571,400,181 2 60135 -- U+0132 ( 7J 231)
+ij 14715,18939,5568,2597,90,181 3 60134 -- U+0133 ( 7J 230)
+u004C_0301 16162,23913,0,543,129,181 2 75205 -- U+0139 ( 9E 197)
+u006C_0301 7351,23784,0,5155,284,181 2 75237 -- U+013A ( 9E 229)
+u004C_030C 16162,18939,0,1344,129,181 2 75196 -- U+013D ( 9E 188)
+u006C_030C 10477,18939,0,4418,323,181 2 75198 -- U+013E ( 9E 190)
+u013F 16162,18939,0,504,168,181 2 95646 -- U+013F (11U 158)
+u0140 12674,18939,0,788,336,181 2 95647 -- U+0140 (11U 159)
+/L 16162,18939,0,646,930,181 2 75171 -- U+0141 ( 9E 163)
+/l 7351,18939,0,2726,530,181 2 75187 -- U+0142 ( 9E 179)
+u004E_0301 19107,23913,0,2390,129,181 2 75217 -- U+0143 ( 9E 209)
+u006E_0301 16162,19327,0,801,207,181 2 75249 -- U+0144 ( 9E 241)
+u004E_030C 19107,23952,0,2390,129,181 2 75218 -- U+0147 ( 9E 210)
+u006E_030C 16162,19353,0,891,207,181 2 75250 -- U+0148 ( 9E 242)
+u0149 18746,18939,0,685,245,181 2 95660 -- U+0149 (11U 172)
+u004F_030B 20580,23849,336,1486,-994,181 2 75221 -- U+0150 ( 9E 213)
+u006F_030B 16162,19262,323,1641,-283,181 2 75253 -- U+0151 ( 9E 245)
+OE 26458,19262,323,3398,-503,181 2 161164 -- U+0152 (19U 140)
+oe 24973,14043,323,1318,-219,181 0 161180 -- U+0153 (19U 156)
+u0052_0301 19107,23913,0,1822,155,181 2 75200 -- U+0154 ( 9E 192)
+u0072_0301 10297,19327,0,4044,465,181 2 75232 -- U+0155 ( 9E 224)
+u0052_030C 19107,23952,0,1822,155,181 2 75224 -- U+0158 ( 9E 216)
+u0072_030C 10297,19353,0,4767,465,181 2 75256 -- U+0159 ( 9E 248)
+u0053_0301 17648,23913,323,1563,-309,181 2 75148 -- U+015A ( 9E 140)
+u0073_0301 14715,19327,323,1201,736,181 2 75164 -- U+015B ( 9E 156)
+u0053_0327 17648,19262,5491,1563,-309,181 3 75178 -- U+015E ( 9E 170)
+u0073_0327 14715,14043,5387,1201,736,181 1 75194 -- U+015F ( 9E 186)
+vS 17648,23952,323,1563,-309,181 2 161162 -- U+0160 (19U 138)
+vs 14715,19353,323,1201,736,181 2 161178 -- U+0161 (19U 154)
+u0054_0327 16162,18939,7894,3914,-1859,181 3 75230 -- U+0162 ( 9E 222)
+u0074_0327 8811,18474,7261,2855,-438,181 3 75262 -- U+0163 ( 9E 254)
+u0054_030C 16162,23952,0,3914,-1859,181 2 75149 -- U+0164 ( 9E 141)
+u0074_030C 12674,18939,323,4392,-710,181 2 75165 -- U+0165 ( 9E 157)
+u0055_030A 19107,24856,323,2455,-1097,181 2 75225 -- U+016E ( 9E 217)
+u0075_030A 16162,19947,323,1537,-542,181 2 75257 -- U+016F ( 9E 249)
+u0055_030B 19107,23849,323,2455,-1097,181 2 75227 -- U+0170 ( 9E 219)
+u0075_030B 16162,19262,323,2403,-542,181 2 75259 -- U+0171 ( 9E 251)
+:Y 17648,23177,0,4431,-1717,181 2 161183 -- U+0178 (19U 159)
+u005A_0301 16162,23913,0,2829,659,181 2 75151 -- U+0179 ( 9E 143)
+u007A_0301 13229,19327,0,1809,878,181 2 75167 -- U+017A ( 9E 159)
+u005A_0307 16162,23397,0,2829,659,181 2 75183 -- U+017B ( 9E 175)
+u007A_0307 13229,19249,0,1809,878,181 2 75199 -- U+017C ( 9E 191)
+vZ 16162,23952,0,2829,659,181 2 75150 -- U+017D ( 9E 142)
+vz 13229,19353,0,2054,878,181 2 75166 -- U+017E ( 9E 158)
+Fn 14715,19262,5568,1357,1576,181 3 161155 -- U+0192 (19U 131)
+a^ 8811,19353,0,2868,-167,181 2 161160 -- U+02C6 (19U 136)
+^ "
+ah 8811,19353,0,4276,-1575,181 2 75169 -- U+02C7 ( 9E 161)
+a- 8811,18436,0,3540,-929,181 2 60154 -- U+02C9 ( 7J 250)
+ab 8811,19224,0,2842,-916,181 2 75170 -- U+02D8 ( 9E 162)
+a. 8811,19249,0,1240,-2996,181 2 75263 -- U+02D9 ( 9E 255)
+ao 8811,19947,0,1473,-2660,181 2 60152 -- U+02DA ( 7J 248)
+ho 8811,245,5491,0,-322 1 75186 -- U+02DB ( 9E 178)
+~ 8811,18797,0,3850,-1136,181 2 161176 -- U+02DC (19U 152)
+a~ "
+a" 8811,19262,0,4845,439,181 2 75197 -- U+02DD ( 9E 189)
+en 14715,8217,0,1266,1369,181 0 161174 -- U+2013 (19U 150)
+em 26458,8217,0,1318,1318,181 0 161175 -- U+2014 (19U 151)
+u2017 14612,0,9961,1550,1563,181 1 60095 -- U+2017 ( 7J 191)
+oq 7351,19159,0,2196,-1562,181 2 161169 -- U+2018 (19U 145)
+` "
+cq 7351,18939,0,2584,-1950,181 2 161170 -- U+2019 (19U 146)
+' "
+bq 7351,3579,4108,0,1046 0 161154 -- U+201A (19U 130)
+lq 13229,19159,0,2984,-1989,181 2 161171 -- U+201C (19U 147)
+rq 13229,18939,0,3075,-2079,181 2 161172 -- U+201D (19U 148)
+Bq 13229,3579,4108,0,1227 0 161156 -- U+201E (19U 132)
+dg 14715,18681,4522,2325,-916,181 2 161158 -- U+2020 (19U 134)
+dd 14715,18681,4522,2468,1344,181 2 161159 -- U+2021 (19U 135)
+bu 9263,13165,0,1835,-826,181 0 161173 -- U+2022 (19U 149)
+u2026 26458,3579,0,0,-1136 0 161157 -- U+2026 (19U 133)
+%0 26458,19262,749,1886,-477,181 2 161161 -- U+2030 (19U 137)
+fm 6343,18939,0,3682,-2686,181 2 60101 -- U+2032 ( 7J 197)
+sd 12674,18939,0,1964,-2596,181 2 60102 -- U+2033 ( 7J 198)
+fo 8811,12622,0,2519,-257,181 0 161163 -- U+2039 (19U 139)
+fc 8811,12622,0,943,1059,181 0 161179 -- U+203A (19U 155)
+u203C 15981,18939,0,1847,-309,181 2 87315 -- U+203C (10U 19)
+u207F 10477,15412,0,2209,-244,181 0 87548 -- U+207F (10U 252)
+u20A7 29210,18939,336,891,1059,181 2 60121 -- U+20A7 ( 7J 217)
+Eu 14715,19262,336,3514,607,181 2 161152 -- U+20AC (19U 128)
+u2105 23422,19262,814,1576,-503,181 2 60072 -- U+2105 ( 7J 168)
+u2113 13655,19262,323,2002,65,181 2 60122 -- U+2113 ( 7J 218)
+tm 26458,18939,0,0,-2505 2 161177 -- U+2122 (19U 153)
+\- 15451,11046,0,1240,-813,181 0 60096 -- U+2212 ( 7J 192)
+f/ 4418,19172,788,9909,7894,181 2 60109 -- U+2215 ( 7J 205)
+sq 15981,12196,0,0,-567 0 60091 -- U+25A1 ( 7J 187)
+u25CA 13074,18371,0,1899,-451,181 2 101079 -- U+25CA (12J 215)
+fi 16162,19262,0,2674,-219,181 2 60077 -- U+FB01 ( 7J 173)
+fl 16162,19262,0,2648,-180,181 2 60078 -- U+FB02 ( 7J 174)
diff --git a/font/devlj4/AI b/font/devlj4/AI
new file mode 100644
index 0000000..a980b41
--- /dev/null
+++ b/font/devlj4/AI
@@ -0,0 +1,426 @@
+# M Arial It
+name AI
+spacewidth 7351
+slant 12.000000
+pcltypeface 16602
+pclproportional 1
+pclweight 0
+pclstyle 1
+ligatures fi fl 0
+kernpairs
+1 1 -1963
+A T -1963
+A V -1459
+A W -477
+A Y -1963
+A v -477
+A w -477
+A y -232
+A cq -981
+A ' -981
+F , -3410
+F . -3410
+F A -1963
+L T -1963
+L V -1459
+L W -981
+L Y -2428
+L y -477
+L cq -1459
+L ' -1459
+P , -3410
+P . -3410
+P A -1963
+R T -477
+R V -477
+R W -477
+R Y -981
+T , -2428
+T hy -2428
+T - -2428
+T . -2428
+T : -1963
+T ; -1963
+T A -1963
+T O -477
+T a -2428
+T c -2428
+T e -2428
+T i -232
+T o -2428
+T r -1963
+T s -2428
+T u -1963
+T w -1963
+T y -1963
+V , -1963
+V hy -981
+V - -981
+V . -1963
+V : -477
+V ; -477
+V A -1459
+V a -981
+V e -981
+V i -477
+V o -981
+V r -477
+V u -477
+V y -477
+W , -981
+W hy -477
+W - -477
+W . -981
+W A -477
+W a -477
+W e -477
+W i -232
+Y , -2428
+Y hy -1963
+Y - -1963
+Y . -2428
+Y : -981
+Y ; -981
+Y A -1459
+Y a -1963
+Y e -1459
+Y i -477
+Y o -1459
+Y p -1459
+Y q -1459
+Y u -981
+Y v -981
+f cq 982
+f ' 982
+r , -1459
+r hy -477
+r - -477
+r . -981
+r cq 982
+r ' 982
+v , -1963
+v . -1963
+w , -1459
+w . -1459
+y , -1963
+y . -1963
+oq oq -981
+oq ` -981
+` oq -981
+` ` -981
+cq s -477
+' s -477
+cq cq -981
+cq ' -981
+' cq -981
+' ' -981
+charset
+! 7351,18939,0,2002,-167,181 2 161057 -- U+0021 (19U 33)
+dq 9392,18939,0,3139,-2131,181 2 161058 -- U+0022 (19U 34)
+" "
+sh 14715,19262,323,1938,90,181 2 161059 -- U+0023 (19U 35)
+# "
+Do 14715,20205,2532,1757,-38,181 2 161060 -- U+0024 (19U 36)
+$ "
+% 23526,19262,698,349,-1252,181 2 161061 -- U+0025 (19U 37)
+& 17648,19262,452,904,-761,181 2 161062 -- U+0026 (19U 38)
+aq 5051,18939,0,3114,-2040,181 2 161063 -- U+0027 (19U 39)
+( 8811,19262,5568,3436,-916,181 3 161064 -- U+0028 (19U 40)
+) 8811,19262,5568,0,2726 3 161065 -- U+0029 (19U 41)
+* 10297,19262,0,2610,-1730,181 2 161066 -- U+002A (19U 42)
++ 15451,15580,0,749,-1058,181 0 161067 -- U+002B (19U 43)
+, 7351,2648,3824,0,685 0 161068 -- U+002C (19U 44)
+hy 8811,8023,0,1357,90,181 0 161069 -- U+002D (19U 45)
+- "
+. 7351,2648,0,0,-206 0 161070 -- U+002E (19U 46)
+sl 7351,19262,310,4832,2661,181 2 161071 -- U+002F (19U 47)
+/ "
+0 14715,19017,323,1563,-555,181 2 161072 -- U+0030 (19U 48)
+1 14715,19017,0,0,-2596 2 161073 -- U+0031 (19U 49)
+2 14715,19017,0,1473,-232,181 2 161074 -- U+0032 (19U 50)
+3 14715,19017,323,1344,-128,181 2 161075 -- U+0033 (19U 51)
+4 14715,18939,0,956,116,181 2 161076 -- U+0034 (19U 52)
+5 14715,18681,323,1744,-516,181 2 161077 -- U+0035 (19U 53)
+6 14715,19017,323,1628,-890,181 2 161078 -- U+0036 (19U 54)
+7 14715,18681,0,2351,-1885,181 2 161079 -- U+0037 (19U 55)
+8 14715,19017,336,1537,-658,181 2 161080 -- U+0038 (19U 56)
+9 14715,19017,323,1189,-464,181 2 161081 -- U+0039 (19U 57)
+: 7351,13720,0,982,-193,181 0 161082 -- U+003A (19U 58)
+; 7351,13720,3824,904,685,181 0 161083 -- U+003B (19U 59)
+< 15451,15748,0,788,-1058,181 0 161084 -- U+003C (19U 60)
+= 15451,13307,0,749,-1058,181 0 161085 -- U+003D (19U 61)
+> 15451,15748,0,788,-1058,181 0 161086 -- U+003E (19U 62)
+? 14715,19262,0,1434,-2040,181 2 161087 -- U+003F (19U 63)
+at 26859,19288,5568,362,-115,181 3 161088 -- U+0040 (19U 64)
+@ "
+A 17648,18939,0,0,1847 2 161089 -- U+0041 (19U 65)
+B 17648,18939,0,995,168,181 2 161090 -- U+0042 (19U 66)
+C 19107,19262,323,1537,-1084,181 2 161091 -- U+0043 (19U 67)
+D 19107,18939,0,1046,142,181 2 161092 -- U+0044 (19U 68)
+E 17648,18939,0,2493,129,181 2 161093 -- U+0045 (19U 69)
+F 16162,18939,0,2623,116,181 2 161094 -- U+0046 (19U 70)
+G 20580,19262,323,1008,-1252,181 2 161095 -- U+0047 (19U 71)
+H 19107,18939,0,2157,207,181 2 161096 -- U+0048 (19U 72)
+I 7351,18939,0,1964,-193,181 2 161097 -- U+0049 (19U 73)
+J 13229,18939,323,2261,439,181 2 161098 -- U+004A (19U 74)
+K 17648,18939,0,3281,142,181 2 161099 -- U+004B (19U 75)
+L 14715,18939,0,478,258,181 2 161100 -- U+004C (19U 76)
+M 22040,18939,0,2351,155,181 2 161101 -- U+004D (19U 77)
+N 19107,18939,0,2235,26,181 2 161102 -- U+004E (19U 78)
+O 20580,19262,323,1176,-1097,181 2 161103 -- U+004F (19U 79)
+P 17648,18939,0,2132,181,181 2 161104 -- U+0050 (19U 80)
+Q 20580,19262,2170,1201,-1123,181 2 161105 -- U+0051 (19U 81)
+R 19107,18939,0,1524,78,181 2 161106 -- U+0052 (19U 82)
+S 17648,19262,323,1434,-542,181 2 161107 -- U+0053 (19U 83)
+T 16162,18939,0,3811,-1976,181 2 161108 -- U+0054 (19U 84)
+U 19107,18939,336,2170,-1239,181 2 161109 -- U+0055 (19U 85)
+V 17648,18939,0,3695,-1963,181 2 161110 -- U+0056 (19U 86)
+W 24973,18939,0,4431,-1989,181 2 161111 -- U+0057 (19U 87)
+X 17648,18939,0,4018,2157,181 2 161112 -- U+0058 (19U 88)
+Y 17648,18939,0,4121,-1769,181 2 161113 -- U+0059 (19U 89)
+Z 16162,18939,0,2002,672,181 2 161114 -- U+005A (19U 90)
+lB 7351,18939,5181,4315,1150,181 3 161115 -- U+005B (19U 91)
+[ "
+rs 7351,19262,310,1201,-929,181 2 161116 -- U+005C (19U 92)
+\ "
+rB 7351,18939,5181,2674,2868,181 3 161117 -- U+005D (19U 93)
+] "
+ha 12415,19262,0,1783,-542,181 2 161118 -- U+005E (19U 94)
+_ 14715,0,5258,336,2997,181 1 161119 -- U+005F (19U 95)
+ga 8811,18939,0,698,-2531,181 2 161120 -- U+0060 (19U 96)
+a 14715,14030,310,530,155,181 0 161121 -- U+0061 (19U 97)
+b 14715,18939,310,762,439,181 2 161122 -- U+0062 (19U 98)
+c 13229,14030,310,1602,-167,181 0 161123 -- U+0063 (19U 99)
+d 14715,18939,310,2429,-77,181 2 161124 -- U+0064 (19U 100)
+e 14715,14030,310,672,-51,181 0 161125 -- U+0065 (19U 101)
+f 7351,19262,0,4754,116,181 2 161126 -- U+0066 (19U 102)
+g 14715,14030,5491,1537,633,181 1 161127 -- U+0067 (19U 103)
+h 14715,18939,0,594,439,181 2 161128 -- U+0068 (19U 104)
+i 5878,18939,0,2519,530,181 2 161129 -- U+0069 (19U 105)
+j 5878,18939,5491,2506,4522,181 3 161130 -- U+006A (19U 106)
+k 13229,18939,0,2739,413,181 2 161131 -- U+006B (19U 107)
+l 5878,18939,0,2429,620,181 2 161132 -- U+006C (19U 108)
+m 22040,14030,0,775,452,181 0 161133 -- U+006D (19U 109)
+n 14715,14030,0,568,439,181 0 161134 -- U+006E (19U 110)
+o 14715,14030,310,891,26,181 0 161135 -- U+006F (19U 111)
+p 14715,14030,5258,762,1589,181 1 161136 -- U+0070 (19U 112)
+q 14715,14030,5258,1214,-38,181 1 161137 -- U+0071 (19U 113)
+r 8811,14030,0,3604,439,181 0 161138 -- U+0072 (19U 114)
+s 13229,14030,310,1357,310,181 0 161139 -- U+0073 (19U 115)
+t 7351,18707,233,2468,-167,181 2 161140 -- U+0074 (19U 116)
+u 14715,13720,310,1357,-335,181 0 161141 -- U+0075 (19U 117)
+v 13229,13720,0,2881,-774,181 0 161142 -- U+0076 (19U 118)
+w 19107,13720,0,2765,-735,181 0 161143 -- U+0077 (19U 119)
+x 13229,13720,0,2313,1357,181 0 161144 -- U+0078 (19U 120)
+y 13229,13720,5568,2933,1318,181 1 161145 -- U+0079 (19U 121)
+z 13229,13720,0,1641,801,181 0 161146 -- U+007A (19U 122)
+{ 8837,19262,5568,4263,-64,181 3 161147 -- U+007B (19U 123)
+lC "
+| 6873,19262,5568,0,-1110 3 161148 -- U+007C (19U 124)
+ba "
+} 8837,19262,5568,659,3540,181 3 161149 -- U+007D (19U 125)
+rC "
+ti 15451,11433,0,1201,-800,181 0 161150 -- U+007E (19U 126)
+r! 8811,13720,5219,581,-206,181 1 161185 -- U+00A1 (19U 161)
+ct 14715,19198,5258,620,-671,181 3 161186 -- U+00A2 (19U 162)
+Po 14715,19262,323,2674,491,181 2 161187 -- U+00A3 (19U 163)
+Cs 14715,15710,0,1421,-800,181 0 161188 -- U+00A4 (19U 164)
+Ye 14715,18939,0,4250,349,181 2 161189 -- U+00A5 (19U 165)
+bb 6873,19262,5568,0,-1110 3 161190 -- U+00A6 (19U 166)
+sc 14715,19262,5568,1292,517,181 3 161191 -- U+00A7 (19U 167)
+ad 8811,18500,0,3320,-1743,181 2 161192 -- U+00A8 (19U 168)
+co 19495,19262,233,2390,245,181 2 161193 -- U+00A9 (19U 169)
+Of 9793,19262,0,2351,-839,181 2 161194 -- U+00AA (19U 170)
+Fo 14715,12661,0,814,-761,181 0 161195 -- U+00AB (19U 171)
+tno 15451,13307,0,749,-1058,181 0 161196 -- U+00AC (19U 172)
+u00AD 8811,8023,0,1357,90,181 0 161197 -- U+00AD (19U 173)
+rg 19495,19262,233,2390,245,181 2 161198 -- U+00AE (19U 174)
+u00AF 14612,21898,0,4457,-1020,181 2 161199 -- U+00AF (19U 175)
+de 10581,19262,0,1434,-2208,181 2 161200 -- U+00B0 (19U 176)
+t+- 14521,15878,0,904,-283,181 0 161201 -- U+00B1 (19U 177)
+S2 8811,19172,0,3114,-645,181 2 161202 -- U+00B2 (19U 178)
+S3 8811,19172,0,3088,-865,181 2 161203 -- U+00B3 (19U 179)
+aa 8811,18939,0,2351,-3151,181 2 161204 -- U+00B4 (19U 180)
+mc 15245,13720,5297,1201,1163,181 1 161205 -- U+00B5 (19U 181)
+ps 14211,18939,5258,3230,-516,181 3 161206 -- U+00B6 (19U 182)
+pc 7351,10645,0,0,-1071 0 60157 -- U+00B7 ( 7J 253)
+ac 8811,155,5491,116,323,116 1 161208 -- U+00B8 (19U 184)
+S1 8811,19172,0,1886,-2286,181 2 161209 -- U+00B9 (19U 185)
+Om 9663,19262,0,2545,-529,181 2 161210 -- U+00BA (19U 186)
+Fc 14715,12661,0,0,245 0 161211 -- U+00BB (19U 187)
+14 22066,19262,788,1757,-890,181 2 161212 -- U+00BC (19U 188)
+12 22066,19262,788,1137,-270,181 2 161213 -- U+00BD (19U 189)
+34 22066,19262,788,2145,-865,181 2 161214 -- U+00BE (19U 190)
+r? 16162,13720,5542,0,-903 1 161215 -- U+00BF (19U 191)
+`A 17648,23668,0,0,1847 2 161216 -- U+00C0 (19U 192)
+'A 17648,23655,0,0,1847 2 161217 -- U+00C1 (19U 193)
+^A 17648,23655,0,0,1847 2 161218 -- U+00C2 (19U 194)
+~A 17648,22957,0,0,1847 2 161219 -- U+00C3 (19U 195)
+:A 17648,22751,0,0,1847 2 161220 -- U+00C4 (19U 196)
+oA 17648,22841,0,0,1847 2 161221 -- U+00C5 (19U 197)
+AE 26458,18939,0,2468,2390,181 2 161222 -- U+00C6 (19U 198)
+,C 19107,19262,5568,1563,-1110,181 3 161223 -- U+00C7 (19U 199)
+`E 17648,23668,0,2493,129,181 2 161224 -- U+00C8 (19U 200)
+'E 17648,23655,0,2493,129,181 2 161225 -- U+00C9 (19U 201)
+^E 17648,23655,0,2493,129,181 2 161226 -- U+00CA (19U 202)
+:E 17648,22712,0,2493,129,181 2 161227 -- U+00CB (19U 203)
+`I 7351,23668,0,2971,-193,181 2 161228 -- U+00CC (19U 204)
+'I 7351,23655,0,4263,-193,181 2 161229 -- U+00CD (19U 205)
+^I 7351,23655,0,4741,-193,181 2 161230 -- U+00CE (19U 206)
+:I 7351,22751,0,4909,-193,181 2 161231 -- U+00CF (19U 207)
+-D 19107,18939,0,1266,142,181 2 161232 -- U+00D0 (19U 208)
+~N 19107,22957,0,2235,26,181 2 161233 -- U+00D1 (19U 209)
+`O 20580,23668,323,1176,-1097,181 2 161234 -- U+00D2 (19U 210)
+'O 20580,23655,323,1176,-1097,181 2 161235 -- U+00D3 (19U 211)
+^O 20580,23655,323,1176,-1097,181 2 161236 -- U+00D4 (19U 212)
+~O 20580,22957,323,1176,-1097,181 2 161237 -- U+00D5 (19U 213)
+:O 20580,22751,323,1176,-1097,181 2 161238 -- U+00D6 (19U 214)
+tmu 15451,14986,0,504,-2053,181 0 161239 -- U+00D7 (19U 215)
+/O 20580,20231,1331,1279,-929,181 2 161240 -- U+00D8 (19U 216)
+`U 19107,23668,336,2170,-1239,181 2 161241 -- U+00D9 (19U 217)
+'U 19107,23655,336,2170,-1239,181 2 161242 -- U+00DA (19U 218)
+^U 19107,23655,336,2170,-1239,181 2 161243 -- U+00DB (19U 219)
+:U 19107,22751,336,2170,-1239,181 2 161244 -- U+00DC (19U 220)
+'Y 17648,23655,0,4121,-1769,181 2 161245 -- U+00DD (19U 221)
+TP 17648,18939,0,1318,181,181 2 161246 -- U+00DE (19U 222)
+ss 16162,19262,323,168,362,168 2 161247 -- U+00DF (19U 223)
+`a 14715,18939,310,530,155,181 2 161248 -- U+00E0 (19U 224)
+'a 14715,18939,310,530,155,181 2 161249 -- U+00E1 (19U 225)
+^a 14715,18939,310,530,155,181 2 161250 -- U+00E2 (19U 226)
+~a 14715,18694,310,904,155,181 2 161251 -- U+00E3 (19U 227)
+:a 14715,18500,310,530,155,181 2 161252 -- U+00E4 (19U 228)
+oa 14715,19405,310,530,155,181 2 161253 -- U+00E5 (19U 229)
+ae 23526,14043,323,685,194,181 0 161254 -- U+00E6 (19U 230)
+,c 13229,14030,5258,1602,-167,181 1 161255 -- U+00E7 (19U 231)
+`e 14715,18939,310,672,-51,181 2 161256 -- U+00E8 (19U 232)
+'e 14715,18939,310,672,-51,181 2 161257 -- U+00E9 (19U 233)
+^e 14715,18939,310,672,-51,181 2 161258 -- U+00EA (19U 234)
+:e 14715,18500,310,672,-51,181 2 161259 -- U+00EB (19U 235)
+`i 7351,18939,0,2170,-296,181 2 161260 -- U+00EC (19U 236)
+'i 7351,18939,0,3204,-296,181 2 161261 -- U+00ED (19U 237)
+^i 7351,18939,0,3798,-296,181 2 161262 -- U+00EE (19U 238)
+:i 7351,18500,0,3966,-296,181 2 161263 -- U+00EF (19U 239)
+Sd 14715,18939,323,1046,26,181 2 161264 -- U+00F0 (19U 240)
+~n 14715,18681,0,685,439,181 2 161265 -- U+00F1 (19U 241)
+`o 14715,18939,310,891,26,181 2 161266 -- U+00F2 (19U 242)
+'o 14715,18939,310,891,26,181 2 161267 -- U+00F3 (19U 243)
+^o 14715,18939,310,891,26,181 2 161268 -- U+00F4 (19U 244)
+~o 14715,18681,310,891,26,181 2 161269 -- U+00F5 (19U 245)
+:o 14715,18500,310,891,26,181 2 161270 -- U+00F6 (19U 246)
+tdi 14521,14560,0,956,-335,181 0 161271 -- U+00F7 (19U 247)
+/o 16162,14973,1318,607,-658,181 0 161272 -- U+00F8 (19U 248)
+`u 14715,18939,310,1357,-335,181 2 161273 -- U+00F9 (19U 249)
+'u 14715,18939,310,1357,-335,181 2 161274 -- U+00FA (19U 250)
+^u 14715,18939,310,1357,-335,181 2 161275 -- U+00FB (19U 251)
+:u 14715,18500,310,1357,-335,181 2 161276 -- U+00FC (19U 252)
+'y 13229,18939,5568,2933,1318,181 3 161277 -- U+00FD (19U 253)
+Tp 14715,18939,5258,762,1589,181 3 161278 -- U+00FE (19U 254)
+:y 13229,18500,5568,2933,1318,181 3 161279 -- U+00FF (19U 255)
+u0041_0306 17648,23448,0,0,1847 2 75203 -- U+0102 ( 9E 195)
+u0061_0306 14715,18371,310,530,155,181 2 75235 -- U+0103 ( 9E 227)
+u0041_0328 17648,18939,5491,2132,1847,181 3 75173 -- U+0104 ( 9E 165)
+u0061_0328 14715,14030,5491,1679,155,181 1 75193 -- U+0105 ( 9E 185)
+'C 19107,23655,323,1537,-1084,181 2 75206 -- U+0106 ( 9E 198)
+'c 13229,18939,310,1602,-167,181 2 75238 -- U+0107 ( 9E 230)
+u0041_030C 19107,23655,323,1537,-1084,181 2 75208 -- U+010C ( 9E 200)
+u0061_030C 13229,18939,310,1718,-167,181 2 75240 -- U+010D ( 9E 232)
+u0044_030C 19107,23655,0,1046,142,181 2 75215 -- U+010E ( 9E 207)
+u0064_030C 16536,18939,310,4444,-128,181 2 75247 -- U+010F ( 9E 239)
+u0111 14715,18939,310,3876,-77,181 2 75248 -- U+0111 ( 9E 240)
+u0045_0328 17648,18939,5491,2493,129,181 3 75210 -- U+0118 ( 9E 202)
+u0065_0328 14715,14030,5491,672,-51,181 1 75242 -- U+0119 ( 9E 234)
+u0045_030C 17648,23655,0,2493,129,181 2 75212 -- U+011A ( 9E 204)
+u0065_030C 14715,18939,310,672,-51,181 2 75244 -- U+011B ( 9E 236)
+u0047_0306 20580,23448,323,1008,-1252,181 2 46288 -- U+011E ( 5T 208)
+u0067_0306 14715,18371,5491,1537,633,181 3 46320 -- U+011F ( 5T 240)
+u0049_0307 7351,22854,0,2803,-193,181 2 46301 -- U+0130 ( 5T 221)
+.i 7351,13720,0,788,-296,181 0 46333 -- U+0131 ( 5T 253)
+IJ 19405,18939,323,2261,-193,181 2 60135 -- U+0132 ( 7J 231)
+ij 11743,18939,5491,2635,556,181 3 60134 -- U+0133 ( 7J 230)
+u004C_0301 14715,23655,0,478,258,181 2 75205 -- U+0139 ( 9E 197)
+u006C_0301 5878,23461,0,4715,620,181 2 75237 -- U+013A ( 9E 229)
+u004C_030C 14715,18939,0,1395,258,181 2 75196 -- U+013D ( 9E 188)
+u006C_030C 7441,18939,0,4444,594,181 2 75198 -- U+013E ( 9E 190)
+u013F 14715,18939,0,530,207,181 2 95646 -- U+013F (11U 158)
+u0140 10581,18939,0,530,581,181 2 95647 -- U+0140 (11U 159)
+/L 14715,18939,0,465,1008,181 2 75171 -- U+0141 ( 9E 163)
+/l 5878,18939,0,2984,827,181 2 75187 -- U+0142 ( 9E 179)
+u004E_0301 19107,23655,0,2235,26,181 2 75217 -- U+0143 ( 9E 209)
+u006E_0301 14715,18939,0,568,439,181 2 75249 -- U+0144 ( 9E 241)
+u004E_030C 19107,23655,0,2235,26,181 2 75218 -- U+0147 ( 9E 210)
+u006E_030C 14715,18939,0,620,439,181 2 75250 -- U+0148 ( 9E 242)
+u0149 16265,18862,0,659,13,181 2 95660 -- U+0149 (11U 172)
+u004F_030B 20580,23655,323,1176,-1097,181 2 75221 -- U+0150 ( 9E 213)
+u006F_030B 14715,18939,310,1990,26,181 2 75253 -- U+0151 ( 9E 245)
+OE 26458,19262,336,2480,-800,181 2 161164 -- U+0152 (19U 140)
+oe 24973,14030,310,659,-348,181 0 161180 -- U+0153 (19U 156)
+u0052_0301 19107,23655,0,1524,78,181 2 75200 -- U+0154 ( 9E 192)
+u0072_0301 8811,18939,0,3604,439,181 2 75232 -- U+0155 ( 9E 224)
+u0052_030C 19107,23655,0,1524,78,181 2 75224 -- U+0158 ( 9E 216)
+u0072_030C 8811,18939,0,4470,439,181 2 75256 -- U+0159 ( 9E 248)
+u0053_0301 17648,23655,323,1434,-542,181 2 75148 -- U+015A ( 9E 140)
+u0073_0301 13229,18939,310,1357,310,181 2 75164 -- U+015B ( 9E 156)
+u0053_0327 17648,19262,5568,1434,-542,181 3 75178 -- U+015E ( 9E 170)
+u0073_0327 13229,14030,5258,1357,310,181 1 75194 -- U+015F ( 9E 186)
+vS 17648,23655,323,1434,-542,181 2 161162 -- U+0160 (19U 138)
+vs 13229,18939,310,1421,310,181 2 161178 -- U+0161 (19U 154)
+u0054_0327 16162,18939,7273,3811,-1976,181 3 75230 -- U+0162 ( 9E 222)
+u0074_0327 7351,18707,6692,2455,65,181 3 75262 -- U+0163 ( 9E 254)
+u0054_030C 16162,23655,0,3811,-1976,181 2 75149 -- U+0164 ( 9E 141)
+u0074_030C 9366,18939,233,4470,-89,181 2 75165 -- U+0165 ( 9E 157)
+u0055_030A 19107,24714,336,2170,-1239,181 2 75225 -- U+016E ( 9E 217)
+u0075_030A 14715,19405,310,1357,-335,181 2 75257 -- U+016F ( 9E 249)
+u0055_030B 19107,23655,336,2170,-1239,181 2 75227 -- U+0170 ( 9E 219)
+u0075_030B 14715,18939,310,1628,-335,181 2 75259 -- U+0171 ( 9E 251)
+:Y 17648,22712,0,4121,-1769,181 2 161183 -- U+0178 (19U 159)
+u005A_0301 16162,23655,0,2002,672,181 2 75151 -- U+0179 ( 9E 143)
+u007A_0301 13229,18939,0,1641,801,181 2 75167 -- U+017A ( 9E 159)
+u005A_0307 16162,22854,0,2002,672,181 2 75183 -- U+017B ( 9E 175)
+u007A_0307 13229,18500,0,1641,801,181 2 75199 -- U+017C ( 9E 191)
+vZ 16162,23655,0,1847,827,181 2 75150 -- U+017D ( 9E 142)
+vz 13229,18939,0,1641,801,181 2 75166 -- U+017E ( 9E 158)
+Fn 14715,19275,5568,620,723,181 3 161155 -- U+0192 (19U 131)
+a^ 8811,18939,0,2765,-1330,181 2 161160 -- U+02C6 (19U 136)
+^ "
+ah 8811,18939,0,3514,-2092,181 2 75169 -- U+02C7 ( 9E 161)
+a- 8811,17673,0,3501,-1278,181 2 60154 -- U+02C9 ( 7J 250)
+ab 8811,18371,0,3075,-1511,181 2 75170 -- U+02D8 ( 9E 162)
+a. 8811,18500,0,1137,-3823,181 2 75263 -- U+02D9 ( 9E 255)
+ao 8811,19405,0,1447,-2919,181 2 60152 -- U+02DA ( 7J 248)
+ho 8811,349,5491,0,-296 1 75186 -- U+02DB ( 9E 178)
+~ 8811,18681,0,3721,-1162,181 2 161176 -- U+02DC (19U 152)
+a~ "
+a" 8811,18939,0,4509,-955,181 2 75197 -- U+02DD ( 9E 189)
+en 14715,7790,0,1266,1369,181 0 161174 -- U+2013 (19U 150)
+em 26458,7790,0,1318,1318,181 0 161175 -- U+2014 (19U 151)
+u2017 14612,0,8591,439,2997,181 1 60095 -- U+2017 ( 7J 191)
+oq 5878,19262,0,2868,-2092,181 2 161169 -- U+2018 (19U 145)
+` "
+cq 5878,18862,0,2765,-1989,181 2 161170 -- U+2019 (19U 146)
+' "
+bq 5878,2648,3824,0,1512 0 161154 -- U+201A (19U 130)
+lq 8811,19262,0,3436,-1472,181 2 161171 -- U+201C (19U 147)
+rq 8811,18862,0,3553,-1446,181 2 161172 -- U+201D (19U 148)
+Bq 8811,2648,3824,220,1835,181 0 161156 -- U+201E (19U 132)
+dg 14715,18681,4509,2041,-1084,181 2 161158 -- U+2020 (19U 134)
+dd 14715,18681,4509,2170,1176,181 2 161159 -- U+2021 (19U 135)
+bu 9263,12544,0,13,-89,13 0 161173 -- U+2022 (19U 149)
+u2026 26458,2648,0,0,-2479 0 161157 -- U+2026 (19U 133)
+%0 26458,19262,711,1408,-438,181 2 161161 -- U+2030 (19U 137)
+fm 4961,18939,0,3204,-2040,181 2 60101 -- U+2032 ( 7J 197)
+sd 9366,18939,0,3165,-2131,181 2 60102 -- U+2033 ( 7J 198)
+fo 8811,12661,0,814,65,181 0 161163 -- U+2039 (19U 139)
+fc 8811,12661,0,129,891,129 0 161179 -- U+203A (19U 155)
+u203C 13229,18939,0,1912,-167,181 2 87315 -- U+203C (10U 19)
+u207F 9651,15477,0,2067,-219,181 0 87548 -- U+207F (10U 252)
+u20A7 28939,18939,336,827,995,181 2 60121 -- U+20A7 ( 7J 217)
+Eu 14715,19262,323,3669,271,181 2 161152 -- U+20AC (19U 128)
+u2105 23422,19262,698,917,-1058,181 2 60072 -- U+2105 ( 7J 168)
+u2113 8552,19262,310,3927,995,181 2 60122 -- U+2113 ( 7J 218)
+tm 26458,18939,0,0,-2299 2 161177 -- U+2122 (19U 153)
+\- 15451,10426,0,749,-1058,181 0 60096 -- U+2212 ( 7J 192)
+f/ 4418,19262,788,10271,8242,181 2 60109 -- U+2215 ( 7J 205)
+sq 15981,12196,0,0,-567 0 60091 -- U+25A1 ( 7J 187)
+u25CA 13074,18371,0,1679,-232,181 2 101079 -- U+25CA (12J 215)
+fi 13229,19262,0,2506,-115,181 2 60077 -- U+FB01 ( 7J 173)
+fl 13229,19262,0,2506,-115,181 2 60078 -- U+FB02 ( 7J 174)
diff --git a/font/devlj4/ALBB b/font/devlj4/ALBB
new file mode 100644
index 0000000..d5495c5
--- /dev/null
+++ b/font/devlj4/ALBB
@@ -0,0 +1,756 @@
+# Albertus Xb
+name ALBB
+spacewidth 9759
+pcltypeface 4362
+pclproportional 1
+pclweight 4
+pclstyle 0
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -2924
+P . -4388
+P , -4388
+V A -3413
+A V -3413
+T o -3413
+T r -3413
+T c -3413
+T e -3413
+T d -3413
+T s -3413
+T y -3413
+T a -3413
+T w -3413
+T u -3413
+L T -2924
+L Y -2924
+Y o -2924
+Y e -2924
+Y a -2924
+A W -2924
+W A -2924
+T A -3413
+V o -2924
+V e -2924
+V a -2438
+Y A -2924
+F A -1949
+F . -3902
+F , -3902
+A T -3413
+A Y -2924
+v . -2438
+v , -2438
+y . -2438
+y , -2438
+T . -3413
+T , -3413
+L W -2924
+P A -2438
+V . -3902
+V , -3902
+Y . -2924
+Y , -2924
+W o -2438
+W e -2438
+W a -1949
+W . -2924
+W , -2924
+r . -2924
+r , -2924
+w . -2438
+w , -2438
+Y u -1949
+A v -1460
+A y -1460
+A w -1460
+o . -974
+o , -974
+p . -1949
+p , -1949
+e . -974
+e , -974
+b . -1949
+b , -1949
+O T -2438
+O V -1949
+O Y -2438
+O . -2438
+O , -2438
+L y -974
+L O -974
+L G -485
+L C -485
+L Q -485
+P J -485
+V y -1460
+V u -1460
+V O -1949
+V G -1460
+V C -1460
+V Q -1460
+D T -2438
+D V -1460
+D Y -1949
+D . -2438
+D , -2438
+Y O -2438
+Y G -1949
+Y C -1949
+Y Q -1949
+F o -974
+F e -974
+F a -974
+O A -1460
+O W -1460
+L U -485
+R T -1460
+R V -1460
+R Y -1460
+R W -1460
+G T -485
+P o -1460
+P g -974
+P e -1460
+P a -974
+D A -974
+D W -974
+B T -1949
+B Y -1949
+B . -1949
+B , -1949
+A O -1460
+A G -974
+A C -974
+A U -974
+A Q -974
+W r -974
+W y -974
+W u -974
+W O -1460
+W G -974
+W C -974
+W Q -974
+U A -974
+U . -1949
+U , -1949
+Q A -974
+Q W -974
+f . -485
+f , -485
+T O -2438
+T G -2438
+T C -2438
+T Q -2438
+O X -1949
+L o -485
+L e -485
+L q -485
+G V -485
+G Y -485
+G W -485
+G . -485
+G , -485
+P T -485
+P V -485
+P Y -485
+D X -1460
+B V -1460
+B X -1460
+B A -974
+B W -974
+S . -1460
+S , -1460
+F O -485
+X o -1460
+X e -1460
+X y -1460
+X O -1949
+X G -1460
+X C -1460
+X Q -1460
+A o -974
+A e -974
+Q X -1460
+K o -974
+K e -974
+K y -974
+K w -974
+K O -1460
+K G -974
+K C -974
+K Q -974
+o v -485
+o y -485
+o x -485
+o w -485
+h v -485
+h y -485
+m v -485
+m y -485
+r g -974
+g . -974
+g , -974
+p v -485
+p y -485
+p x -485
+v o -485
+v g -485
+v c -485
+v d -485
+v a -485
+v q -485
+e v -485
+e y -485
+b v -485
+b y -485
+b w -485
+s . -974
+s , -974
+y o -485
+y g -485
+y c -485
+y d -485
+y a -485
+y q -485
+f g -485
+x o -485
+x c -485
+x e -485
+x d -485
+x q -485
+a v -485
+a y -485
+a w -485
+w o -485
+w g -485
+w c -485
+w d -485
+w a -485
+w q -485
+T S -1460
+R o -974
+R y -974
+R O -1460
+R G -974
+R C -974
+R U -974
+R Q -974
+G X -485
+G A -485
+P s -974
+P Z -485
+P X -485
+P W -485
+V S -1460
+S A -974
+Y S -1460
+X u -1460
+A t -974
+A c -974
+A d -974
+A u -974
+A q -974
+W S -974
+K c -974
+K u -974
+h w -485
+m w -485
+r o -974
+r c -974
+r e -974
+r d -974
+r a -974
+r q -974
+g g -485
+p w -485
+v e -485
+v s -485
+e x -485
+e w -485
+y e -485
+y s -485
+f o -485
+f c -485
+f e -485
+f d -485
+f s -485
+f a -485
+f q -485
+w e -485
+w s -485
+k o -485
+k c -485
+k v -485
+k e -485
+k d -485
+k y -485
+k w -485
+k q -485
+O Z -974
+O J -974
+L J -485
+R e -974
+R u -974
+G Z -485
+P O -485
+E O -485
+Z o -485
+Z e -485
+Z d -485
+Z y -485
+Z w -485
+Z u -485
+Z O -974
+Z G -485
+Z C -485
+Z Q -485
+D Z -485
+D J -485
+B Z -485
+B J -485
+A J -485
+J O -485
+K J -485
+t o -485
+t c -485
+t e -485
+t d -485
+t q -485
+o z -485
+r s -974
+g o -485
+g c -485
+g e -485
+g d -485
+g s -485
+g a -485
+g q -485
+p z -485
+e z -485
+z o -485
+z c -485
+z e -485
+z d -485
+z q -485
+b z -485
+k t -485
+k u -485
+O g -485
+O j -485
+R J -485
+G J -485
+C O -485
+B O -485
+U O -485
+K T -485
+K V -485
+K Y -485
+K W -485
+K U -485
+L cq -974
+L ' -974
+T hy -3413
+T - -3413
+T en -3413
+T em -3413
+A cq -1460
+A ' -1460
+hy T -3413
+- T -3413
+en T -3413
+em T -3413
+Y hy -1949
+Y - -1949
+Y en -1949
+Y em -1949
+p cq -485
+p ' -485
+e cq -485
+e ' -485
+b cq -485
+b ' -485
+a cq -485
+a ' -485
+V hy -1460
+V - -1460
+V en -1460
+V em -1460
+h cq -485
+h ' -485
+m cq -485
+m ' -485
+R cq -974
+R ' -974
+W hy -974
+W - -974
+W en -974
+W em -974
+cq d -1949
+' d -1949
+L hy -485
+L - -485
+L en -485
+L em -485
+X hy -1460
+X - -1460
+X en -1460
+X em -1460
+A hy -974
+A - -974
+A en -974
+A em -974
+K hy -974
+K - -974
+K en -974
+K em -974
+cq s -974
+' s -974
+hy X -1460
+- X -1460
+hy A -974
+- A -974
+en X -1460
+en A -974
+em X -1460
+R hy -974
+R - -974
+R en -974
+R em -974
+K cq -485
+K ' -485
+k cq -485
+k ' -485
+O cq -485
+O ' -485
+Z hy -485
+Z - -485
+Z en -485
+Z em -485
+k hy -485
+k - -485
+k en -485
+k em -485
+charset
+! 9759,20130,300 2 161057 -- MSL 1 (19U 33)
+dq 15126,20130 2 161058 -- MSL 2 (19U 34)
+" "
+sh 17565,20430,300 2 161059 -- MSL 3 (19U 35)
+# "
+Do 17565,21630,2370 2 161060 -- MSL 4 (19U 36)
+$ "
+% 25857,20430,300 2 161061 -- MSL 5 (19U 37)
+& 23907,17037,300 0 161062 -- MSL 6 (19U 38)
+cq 9759,20130 2 161170 -- MSL 8 (19U 146)
+' "
+( 13173,20130,4365 3 161064 -- MSL 9 (19U 40)
+) 13173,20130,4365 3 161065 -- MSL 10 (19U 41)
+* 17565,20130 2 161066 -- MSL 11 (19U 42)
++ 25857,15465 0 161067 -- MSL 12 (19U 43)
+, 9759,5025,3885 0 161068 -- MSL 13 (19U 44)
+hy 9759,10515 0 161069 -- MSL 14 (19U 45)
+- "
+. 9759,5430,300 0 161070 -- MSL 15 (19U 46)
+sl 13173,20130 2 161071 -- MSL 16 (19U 47)
+/ "
+0 17565,20430,300 2 161072 -- MSL 17 (19U 48)
+1 17565,20430 2 161073 -- MSL 18 (19U 49)
+2 17565,20430 2 161074 -- MSL 19 (19U 50)
+3 17565,20130,300 2 161075 -- MSL 20 (19U 51)
+4 17565,20130 2 161076 -- MSL 21 (19U 52)
+5 17565,20130,300 2 161077 -- MSL 22 (19U 53)
+6 17565,20130,300 2 161078 -- MSL 23 (19U 54)
+7 17565,20130 2 161079 -- MSL 24 (19U 55)
+8 17565,20430,300 2 161080 -- MSL 25 (19U 56)
+9 17565,20430 2 161081 -- MSL 26 (19U 57)
+: 9759,14376,300 0 161082 -- MSL 27 (19U 58)
+; 9759,14376,3885 0 161083 -- MSL 28 (19U 59)
+< 26346,16068 0 161084 -- MSL 29 (19U 60)
+= 25857,13644 0 161085 -- MSL 30 (19U 61)
+> 26346,16068 0 161086 -- MSL 31 (19U 62)
+? 12684,20430,300 2 161087 -- MSL 32 (19U 63)
+at 25857,21057,2679 2 161088 -- MSL 33 (19U 64)
+@ "
+A 20490,20130 2 161089 -- MSL 34 (19U 65)
+B 18540,20130 2 161090 -- MSL 35 (19U 66)
+C 19029,20430,300 2 161091 -- MSL 36 (19U 67)
+D 20490,20130 2 161092 -- MSL 37 (19U 68)
+E 16101,20130 2 161093 -- MSL 38 (19U 69)
+F 15126,20130 2 161094 -- MSL 39 (19U 70)
+G 20490,20430,300 2 161095 -- MSL 40 (19U 71)
+H 21468,20130 2 161096 -- MSL 41 (19U 72)
+I 10245,20130 2 161097 -- MSL 42 (19U 73)
+J 11709,20130,4380 3 161098 -- MSL 43 (19U 74)
+K 19515,20130 2 161099 -- MSL 44 (19U 75)
+L 15126,20130 2 161100 -- MSL 45 (19U 76)
+M 25857,20130 2 161101 -- MSL 46 (19U 77)
+N 22443,20130 2 161102 -- MSL 47 (19U 78)
+O 23907,20430,300 2 161103 -- MSL 48 (19U 79)
+P 17076,20130 2 161104 -- MSL 49 (19U 80)
+Q 23907,20430,4095 2 161105 -- MSL 50 (19U 81)
+R 18540,20130 2 161106 -- MSL 51 (19U 82)
+S 14148,20430,300 2 161107 -- MSL 52 (19U 83)
+T 16587,20130 2 161108 -- MSL 53 (19U 84)
+U 21468,20130,300 2 161109 -- MSL 54 (19U 85)
+V 20004,20130 2 161110 -- MSL 55 (19U 86)
+W 25857,20130 2 161111 -- MSL 56 (19U 87)
+X 20004,20130 2 161112 -- MSL 57 (19U 88)
+Y 17565,20130 2 161113 -- MSL 58 (19U 89)
+Z 17565,20130 2 161114 -- MSL 59 (19U 90)
+lB 13173,20130,3960 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 13173,20130 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 13173,20130,3960 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588 1 161119 -- MSL 64 (19U 95)
+oq 9759,20130 2 161169 -- MSL 66 (19U 145)
+` "
+a 13173,14310,300 0 161121 -- MSL 67 (19U 97)
+b 16101,20025 2 161122 -- MSL 68 (19U 98)
+c 12684,14310,300 0 161123 -- MSL 69 (19U 99)
+d 15612,20025,300 2 161124 -- MSL 70 (19U 100)
+e 13662,14310,300 0 161125 -- MSL 71 (19U 101)
+f 9759,20130 2 161126 -- MSL 72 (19U 102)
+g 14637,14310,4650 1 161127 -- MSL 73 (19U 103)
+h 15612,20025 2 161128 -- MSL 74 (19U 104)
+i 7806,20940 2 161129 -- MSL 75 (19U 105)
+j 7806,20940,4365 3 161130 -- MSL 76 (19U 106)
+k 16587,20025 2 161131 -- MSL 77 (19U 107)
+l 7806,20025 2 161132 -- MSL 78 (19U 108)
+m 23418,14310 0 161133 -- MSL 79 (19U 109)
+n 15612,14310 0 161134 -- MSL 80 (19U 110)
+o 16101,14310,300 0 161135 -- MSL 81 (19U 111)
+p 15612,14310,4365 1 161136 -- MSL 82 (19U 112)
+q 15612,14310,4365 1 161137 -- MSL 83 (19U 113)
+r 11220,14310 0 161138 -- MSL 84 (19U 114)
+s 11220,14310,300 0 161139 -- MSL 85 (19U 115)
+t 10734,17100,300 0 161140 -- MSL 86 (19U 116)
+u 15612,14010,300 0 161141 -- MSL 87 (19U 117)
+v 14637,14010 0 161142 -- MSL 88 (19U 118)
+w 20979,14010 0 161143 -- MSL 89 (19U 119)
+x 16587,14010 0 161144 -- MSL 90 (19U 120)
+y 14637,14010,4365 1 161145 -- MSL 91 (19U 121)
+z 12198,14010 0 161146 -- MSL 92 (19U 122)
+{ 13173,20130,6075 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588 3 161148 -- MSL 94 (19U 124)
+ba "
+} 13173,20130,6075 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,9435 0 161150 -- MSL 96 (19U 126)
+`A 20490,25170 2 161216 -- MSL 99 (19U 192)
+^A 20490,25170 2 161218 -- MSL 100 (19U 194)
+`E 16101,25170 2 161224 -- MSL 101 (19U 200)
+^E 16101,25170 2 161226 -- MSL 102 (19U 202)
+:E 16101,26130 2 161227 -- MSL 103 (19U 203)
+^I 10245,25170 2 161230 -- MSL 104 (19U 206)
+:I 10245,26130 2 161231 -- MSL 105 (19U 207)
+aa 17565,20250 2 161204 -- MSL 106 (19U 180)
+ga 17565,20250 2 161120 -- MSL 107 (19U 96)
+a^ 17565,20250 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 17565,20190 2 161192 -- MSL 109 (19U 168)
+~ 17565,19035 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 21468,25170,300 2 161241 -- MSL 111 (19U 217)
+^U 21468,25170,300 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105 2 161199 -- MSL 113 (19U 175)
+'Y 17565,25170 2 161245 -- MSL 114 (19U 221)
+'y 14637,20250,4365 3 161277 -- MSL 115 (19U 253)
+de 14637,20430 2 161200 -- MSL 116 (19U 176)
+,C 19029,20430,6270 3 161223 -- MSL 117 (19U 199)
+,c 12684,14310,6000 1 161255 -- MSL 118 (19U 231)
+~N 22443,25101 2 161233 -- MSL 119 (19U 209)
+~n 15612,19035 2 161265 -- MSL 120 (19U 241)
+r! 9759,14376,6054 1 161185 -- MSL 121 (19U 161)
+r? 12684,14526,6204 1 161215 -- MSL 122 (19U 191)
+Cs 17565,15834 0 161188 -- MSL 123 (19U 164)
+Po 17565,20430 2 161187 -- MSL 124 (19U 163)
+Ye 17565,20130 2 161189 -- MSL 125 (19U 165)
+sc 17565,20430,4365 3 161191 -- MSL 126 (19U 167)
+Fn 17565,20130 2 161155 -- MSL 127 (19U 131)
+ct 17565,19911 2 161186 -- MSL 128 (19U 162)
+^a 13173,20250,300 2 161250 -- MSL 129 (19U 226)
+^e 13662,20250,300 2 161258 -- MSL 130 (19U 234)
+^o 16101,20250,300 2 161268 -- MSL 131 (19U 244)
+^u 15612,20250,300 2 161275 -- MSL 132 (19U 251)
+'a 13173,20250,300 2 161249 -- MSL 133 (19U 225)
+'e 13662,20250,300 2 161257 -- MSL 134 (19U 233)
+'o 16101,20250,300 2 161267 -- MSL 135 (19U 243)
+'u 15612,20250,300 2 161274 -- MSL 136 (19U 250)
+`a 13173,20250,300 2 161248 -- MSL 137 (19U 224)
+`e 13662,20250,300 2 161256 -- MSL 138 (19U 232)
+`o 16101,20250,300 2 161266 -- MSL 139 (19U 242)
+`u 15612,20250,300 2 161273 -- MSL 140 (19U 249)
+:a 13173,20190,300 2 161252 -- MSL 141 (19U 228)
+:e 13662,20190,300 2 161259 -- MSL 142 (19U 235)
+:o 16101,20190,300 2 161270 -- MSL 143 (19U 246)
+:u 15612,20190,300 2 161276 -- MSL 144 (19U 252)
+oA 20490,26508 2 161221 -- MSL 145 (19U 197)
+^i 7806,20250 2 161262 -- MSL 146 (19U 238)
+/O 23907,20601,366 2 161240 -- MSL 147 (19U 216)
+AE 26835,20130 2 161222 -- MSL 148 (19U 198)
+oa 13173,20655,300 2 161253 -- MSL 149 (19U 229)
+'i 7806,20250 2 161261 -- MSL 150 (19U 237)
+/o 16101,14373,330 0 161272 -- MSL 151 (19U 248)
+ae 20004,14310,300 0 161254 -- MSL 152 (19U 230)
+:A 20490,26130 2 161220 -- MSL 153 (19U 196)
+`i 7806,20250 2 161260 -- MSL 154 (19U 236)
+:O 23907,26130,300 2 161238 -- MSL 155 (19U 214)
+:U 21468,26130,300 2 161244 -- MSL 156 (19U 220)
+'E 16101,25170 2 161225 -- MSL 157 (19U 201)
+:i 7806,20190 2 161263 -- MSL 158 (19U 239)
+ss 17076,20130,300 2 161247 -- MSL 159 (19U 223)
+^O 23907,25170,300 2 161236 -- MSL 160 (19U 212)
+'A 20490,25170 2 161217 -- MSL 161 (19U 193)
+~A 20490,25101 2 161219 -- MSL 162 (19U 195)
+~a 13173,19035,300 2 161251 -- MSL 163 (19U 227)
+-D 21468,20130 2 161232 -- MSL 164 (19U 208)
+Sd 16101,20025,300 2 161264 -- MSL 165 (19U 240)
+'I 10245,25170 2 161229 -- MSL 166 (19U 205)
+`I 10245,25170 2 161228 -- MSL 167 (19U 204)
+'O 23907,25170,300 2 161235 -- MSL 168 (19U 211)
+`O 23907,25170,300 2 161234 -- MSL 169 (19U 210)
+~O 23907,25101,300 2 161237 -- MSL 170 (19U 213)
+~o 16101,19035,300 2 161269 -- MSL 171 (19U 245)
+vS 14148,25170,300 2 161162 -- MSL 172 (19U 138)
+vs 11220,20250,300 2 161178 -- MSL 173 (19U 154)
+'U 21468,25170,300 2 161242 -- MSL 174 (19U 218)
+:Y 17565,26130 2 161183 -- MSL 175 (19U 159)
+:y 14637,20190,4365 3 161279 -- MSL 176 (19U 255)
+TP 17076,20130 2 161246 -- MSL 177 (19U 222)
+Tp 15612,20025,4365 3 161278 -- MSL 178 (19U 254)
+mc 15612,12630,4680 1 161205 -- MSL 180 (19U 181)
+ps 17565,19635,4200 3 161206 -- MSL 181 (19U 182)
+34 25857,20430,300 2 161214 -- MSL 182 (19U 190)
+\- 25857,10380 0 60096 -- MSL 183 ( 7J 192)
+14 25857,20430,300 2 161212 -- MSL 184 (19U 188)
+12 25857,20430,300 2 161213 -- MSL 185 (19U 189)
+Of 12198,20430 2 161194 -- MSL 186 (19U 170)
+Om 12198,20430 2 161210 -- MSL 187 (19U 186)
+Fo 13662,12450 0 161195 -- MSL 188 (19U 171)
+Fc 13662,12450 0 161211 -- MSL 190 (19U 187)
+t+- 25857,15465,6855 1 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916 3 161190 -- MSL 192 (19U 166)
+co 13173,19635 2 161193 -- MSL 193 (19U 169)
+tno 25857,12210 0 161196 -- MSL 194 (19U 172)
+u00AD 9759,10515 0 161197 -- MSL 195 (19U 173)
+rg 13173,19635 2 161198 -- MSL 196 (19U 174)
+S2 12198,20340 2 161202 -- MSL 197 (19U 178)
+S3 12198,20130 2 161203 -- MSL 198 (19U 179)
+ac 17565,0,6000 1 161208 -- MSL 199 (19U 184)
+S1 12198,20340 2 161209 -- MSL 200 (19U 185)
+tmu 25857,15282 0 161239 -- MSL 201 (19U 215)
+tdi 25857,16380,885 0 161271 -- MSL 202 (19U 247)
+u203C 18540,20130,300 2 87315 -- MSL 221 (10U 19)
+u20A7 27810,20130,300 2 60121 -- MSL 232 ( 7J 217)
+pc 9759,13080 0 161207 -- MSL 302 (19U 183)
+u013F 15126,20130 2 51943 -- MSL 306 ( 6J 231)
+u0140 12684,20025 2 51959 -- MSL 307 ( 6J 247)
+u2113 17565,18045,765 0 60122 -- MSL 308 ( 7J 218)
+u0149 23418,20130 2 51951 -- MSL 309 ( 6J 239)
+fm 9759,20130 2 60101 -- MSL 310 ( 7J 197)
+sd 15612,20130 2 60102 -- MSL 311 ( 7J 198)
+dg 17565,20130,4365 3 161158 -- MSL 312 (19U 134)
+tm 16101,17850 0 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588 1 60095 -- MSL 314 ( 7J 191)
+ah 17565,20250 2 75169 -- MSL 315 ( 9E 161)
+ao 17565,20655 2 60152 -- MSL 316 ( 7J 248)
+f/ 3903,20430,300 2 60109 -- MSL 324 ( 7J 205)
+em 25857,10095 0 161175 -- MSL 325 (19U 151)
+en 17565,10095 0 161174 -- MSL 326 (19U 150)
+dd 17565,20130,4365 3 161159 -- MSL 327 (19U 135)
+.i 7806,14010 0 46333 -- MSL 328 ( 5T 253)
+aq 9759,20130 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226 0 161173 -- MSL 331 (19U 149)
+u207F 12684,20340 2 87548 -- MSL 332 (10U 252)
+u0111 15612,20025,300 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 20490,25080 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 13173,19260,300 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 20490,20130,5829 3 75173 -- MSL 404 ( 9E 165)
+u0061_0328 13173,14310,5838 1 75193 -- MSL 405 ( 9E 185)
+'C 19029,25170,300 2 75206 -- MSL 406 ( 9E 198)
+'c 12684,20250,300 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 19029,25170,300 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 12684,20250,300 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 20490,25170 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 20979,20130,300 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 16101,25170 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 13662,20250,300 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 16101,20130,5829 3 75210 -- MSL 422 ( 9E 202)
+u0065_0328 13662,14310,5838 1 75242 -- MSL 423 ( 9E 234)
+u004C_0301 15126,25170 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 7806,25170 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 15126,20130 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 12684,20130 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 22443,25170 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 15612,20250 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 22443,25170 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 15612,20250 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 23907,25170,300 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 16101,20250,300 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 18540,25170 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 11220,20250 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 18540,25170 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 11220,20250 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 14148,25170,300 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 11220,20250,300 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 16587,25170 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 13173,20130,300 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 16587,20130,6270 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 10734,17100,6000 1 75262 -- MSL 469 ( 9E 254)
+u0055_030B 21468,25170,300 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 15612,20250,300 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 21468,26508,300 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 15612,20655,300 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 17565,25170 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 12198,20250 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 17565,26571 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 12198,20190 2 75199 -- MSL 485 ( 9E 191)
+u2070 12198,20340 2 51753 -- MSL 1000 ( 6J 41)
+u2074 12198,20130 2 51748 -- MSL 1001 ( 6J 36)
+u2075 12198,20130 2 51749 -- MSL 1002 ( 6J 37)
+u2076 12198,20130 2 51806 -- MSL 1003 ( 6J 94)
+u2077 12198,20130 2 51750 -- MSL 1004 ( 6J 38)
+u2078 12198,20340 2 51754 -- MSL 1005 ( 6J 42)
+u2079 12198,20340 2 51752 -- MSL 1006 ( 6J 40)
+lq 17076,20130 2 161171 -- MSL 1017 (19U 147)
+rq 17076,20130 2 161172 -- MSL 1018 (19U 148)
+Bq 17076,5025,3885 0 161156 -- MSL 1019 (19U 132)
+u2003 25857,0 0 51821 -- MSL 1020 ( 6J 109)
+u2002 17565,0 0 51822 -- MSL 1021 ( 6J 110)
+u2009 9759,0 0 51828 -- MSL 1023 ( 6J 116)
+u2026 25857,4830,300 0 161157 -- MSL 1028 (19U 133)
+vz 12198,20250 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,18000 0 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056 0 51794 -- MSL 1036 ( 6J 82)
+fi 16587,20130 2 60077 -- MSL 1040 ( 7J 173)
+fl 16587,20130 2 60078 -- MSL 1041 ( 7J 174)
+ff 18540,20130 2 51883 -- MSL 1042 ( 6J 171)
+Fi 25371,20130 2 51884 -- MSL 1043 ( 6J 172)
+Fl 25371,20130 2 51885 -- MSL 1044 ( 6J 173)
+ij 15612,20940,4365 3 60134 -- MSL 1047 ( 7J 230)
+u2105 29274,20430,300 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 20490,25080,300 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 14637,19260,4650 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 14148,20430,6270 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 11220,14310,6000 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 10245,26571 2 46301 -- MSL 1065 ( 5T 221)
+bq 9759,5025,3885 0 161154 -- MSL 1067 (19U 130)
+%0 33663,20430,300 2 161161 -- MSL 1068 (19U 137)
+a- 17565,19020 2 60154 -- MSL 1084 ( 7J 250)
+ab 17565,19260 2 75170 -- MSL 1086 ( 9E 162)
+a. 17565,20190 2 75263 -- MSL 1088 ( 9E 255)
+oe 23418,14310,300 0 161180 -- MSL 1090 (19U 156)
+OE 31224,20430,300 2 161164 -- MSL 1091 (19U 140)
+fo 7806,12450 0 161163 -- MSL 1092 (19U 139)
+fc 7806,12450 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624 0 60091 -- MSL 1094 ( 7J 187)
+/L 16587,20130 2 75171 -- MSL 1095 ( 9E 163)
+/l 12684,20025 2 75187 -- MSL 1096 ( 9E 179)
+a" 17565,20250 2 75197 -- MSL 1097 ( 9E 189)
+ho 17565,348,5838 1 75186 -- MSL 1098 ( 9E 178)
+vZ 17565,25170 2 75150 -- MSL 1106 ( 9E 142)
+IJ 21954,20130,4380 3 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/ALBR b/font/devlj4/ALBR
new file mode 100644
index 0000000..4a1b033
--- /dev/null
+++ b/font/devlj4/ALBR
@@ -0,0 +1,771 @@
+# Albertus Md
+name ALBR
+spacewidth 8295
+pcltypeface 4362
+pclproportional 1
+pclweight 1
+pclstyle 0
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -2924
+P . -4388
+P , -4388
+V A -4388
+A V -4388
+T o -3902
+T r -3902
+T c -3902
+T e -3902
+T d -3902
+T s -3902
+T y -3902
+T a -3902
+T w -3902
+T u -3902
+L T -2924
+L Y -2924
+Y o -3902
+Y e -3902
+Y a -2924
+A W -3413
+W A -3413
+T A -3902
+V o -2924
+V e -2924
+V a -2924
+Y A -3902
+F A -2924
+F . -3902
+F , -3902
+A T -3902
+A Y -3902
+v . -3413
+v , -3413
+y . -3413
+y , -3413
+T . -3902
+T , -3902
+L W -2924
+P A -2924
+V . -3902
+V , -3902
+Y . -3902
+Y , -3902
+W o -2438
+W e -2438
+W a -2438
+W . -3413
+W , -3413
+r . -2924
+r , -2924
+w . -3413
+w , -3413
+Y u -1949
+A v -2438
+A y -2438
+A w -2438
+o . -1949
+o , -1949
+p . -1949
+p , -1949
+e . -974
+e , -974
+b . -1949
+b , -1949
+O T -2438
+O V -2438
+O Y -2438
+O . -2438
+O , -2438
+L y -1460
+L O -1460
+L G -974
+L C -974
+L Q -974
+P J -485
+V y -1949
+V u -1949
+V O -2438
+V G -1949
+V C -1949
+V Q -1949
+D T -2438
+D V -1949
+D Y -1949
+D . -2438
+D , -2438
+Y O -2438
+Y G -1949
+Y C -1949
+Y Q -1949
+F o -974
+F e -974
+F a -974
+O A -2438
+O W -1949
+L U -974
+R T -1460
+R V -1460
+R Y -1460
+R W -1460
+G T -1460
+P o -1460
+P g -974
+P e -1460
+P a -974
+D A -1949
+D W -1460
+B T -1949
+B Y -1949
+B . -1949
+B , -1949
+A O -2438
+A G -1949
+A C -1949
+A U -1949
+A Q -1949
+W r -1460
+W y -1460
+W u -1460
+W O -1949
+W G -1460
+W C -1460
+W Q -1460
+Q A -1949
+Q W -1460
+f . -485
+f , -485
+T O -2438
+T G -2438
+T C -2438
+T Q -2438
+O X -1460
+L o -974
+L e -974
+L q -974
+G V -1460
+G Y -1460
+G W -1460
+G . -485
+G , -485
+P T -485
+P V -485
+P Y -485
+D X -974
+B V -1949
+B X -974
+B A -1949
+B W -1460
+S . -1460
+S , -1460
+F O -485
+X o -974
+X e -974
+X y -974
+X O -1460
+X G -974
+X C -974
+X Q -974
+A o -1949
+A e -1949
+Q X -974
+K o -974
+K e -974
+K y -974
+K w -974
+K O -1460
+K G -974
+K C -974
+K Q -974
+o v -485
+o y -485
+o x -485
+o w -485
+h v -485
+h y -485
+n v -485
+n y -485
+m v -485
+m y -485
+r g -974
+g . -974
+g , -974
+p v -485
+p y -485
+p x -485
+v o -485
+v g -485
+v c -485
+v d -485
+v a -485
+v q -485
+e v -485
+e y -485
+b v -485
+b y -485
+b w -485
+s . -974
+s , -974
+y o -485
+y g -485
+y c -485
+y d -485
+y a -485
+y q -485
+f g -485
+x o -485
+x c -485
+x e -485
+x d -485
+x a -485
+x q -485
+a v -485
+a y -485
+a w -485
+w o -485
+w g -485
+w c -485
+w d -485
+w a -485
+w q -485
+T S -1460
+L a -974
+R o -974
+R y -974
+R O -1460
+R G -974
+R C -974
+R U -974
+R Q -974
+G X -485
+G A -485
+P Z -485
+P X -485
+P W -485
+V S -1460
+S T -974
+S V -974
+S Y -974
+S X -974
+S A -1460
+S W -974
+Y S -1460
+X a -974
+X u -974
+A t -974
+A c -1949
+A d -1949
+A a -974
+A u -1949
+A q -1949
+W S -1460
+K c -974
+K u -974
+o f -485
+h w -485
+n w -485
+m w -485
+r o -974
+r c -974
+r e -974
+r d -974
+r a -974
+r q -974
+g g -485
+p f -485
+p w -485
+v e -485
+e f -485
+e x -485
+e w -485
+b f -485
+y e -485
+f o -485
+f c -485
+f e -485
+f d -485
+f a -485
+f q -485
+w e -485
+k o -485
+k c -485
+k v -485
+k e -485
+k d -485
+k y -485
+k a -485
+k w -485
+k q -485
+O Z -974
+O J -974
+L J -485
+R e -974
+R a -974
+R u -974
+G Z -485
+P O -485
+E O -485
+Z o -485
+Z e -485
+Z d -485
+Z y -485
+Z a -485
+Z w -485
+Z u -485
+Z O -974
+Z G -485
+Z C -485
+Z Q -485
+D Z -485
+D J -485
+B Z -485
+B J -485
+S Z -485
+S J -485
+A J -485
+J O -485
+K a -974
+K J -485
+o z -485
+h f -485
+n f -485
+m f -485
+g o -485
+g c -485
+g e -485
+g d -485
+g a -485
+g q -485
+p z -485
+e z -485
+z o -485
+z c -485
+z e -485
+z d -485
+z a -485
+z q -485
+b z -485
+a f -485
+k t -485
+k f -485
+k u -485
+O g -485
+O j -485
+R J -485
+G J -485
+C O -485
+B O -485
+A f -485
+U O -485
+K T -485
+K V -485
+K Y -485
+K W -485
+K U -485
+L cq -2924
+L ' -2924
+T hy -3902
+T - -3902
+T en -3902
+T em -3902
+A cq -2924
+A ' -2924
+hy T -3902
+- T -3902
+en T -3902
+em T -3902
+Y hy -1949
+Y - -1949
+Y en -1949
+Y em -1949
+p cq -1949
+p ' -1949
+e cq -974
+e ' -974
+b cq -1949
+b ' -1949
+a cq -1460
+a ' -1460
+V hy -1949
+V - -1949
+V en -1949
+V em -1949
+h cq -1949
+h ' -1949
+n cq -1949
+n ' -1949
+m cq -1949
+m ' -1949
+R cq -974
+R ' -974
+W hy -1460
+W - -1460
+W en -1460
+W em -1460
+cq d -1949
+' d -1949
+L hy -974
+L - -974
+L en -974
+L em -974
+X hy -974
+X - -974
+X en -974
+X em -974
+A hy -1949
+A - -1949
+A en -1949
+A em -1949
+K hy -974
+K - -974
+K en -974
+K em -974
+hy X -974
+- X -974
+hy A -1949
+- A -1949
+en X -974
+en A -1949
+em X -974
+R hy -974
+R - -974
+R en -974
+R em -974
+K cq -485
+K ' -485
+b f -485
+k cq -485
+k ' -485
+O cq -485
+O ' -485
+Z hy -485
+Z - -485
+Z en -485
+Z em -485
+k hy -485
+k - -485
+k en -485
+k em -485
+charset
+! 8295,20130,300 2 161057 -- MSL 1 (19U 33)
+dq 13173,20130 2 161058 -- MSL 2 (19U 34)
+" "
+sh 16587,20430,300 2 161059 -- MSL 3 (19U 35)
+# "
+Do 16587,21909,2490 2 161060 -- MSL 4 (19U 36)
+$ "
+% 24882,20430,300 2 161061 -- MSL 5 (19U 37)
+& 22932,16869,300 0 161062 -- MSL 6 (19U 38)
+cq 8295,20130 2 161170 -- MSL 8 (19U 146)
+' "
+( 10734,20130,4365 3 161064 -- MSL 9 (19U 40)
+) 10734,20130,4365 3 161065 -- MSL 10 (19U 41)
+* 16587,20130 2 161066 -- MSL 11 (19U 42)
++ 24882,15420,60 0 161067 -- MSL 12 (19U 43)
+, 8295,3945,5055 1 161068 -- MSL 13 (19U 44)
+hy 8295,9795 0 161069 -- MSL 14 (19U 45)
+- "
+. 8295,4080,300 0 161070 -- MSL 15 (19U 46)
+sl 11709,20130 2 161071 -- MSL 16 (19U 47)
+/ "
+0 16587,20430,300 2 161072 -- MSL 17 (19U 48)
+1 16587,20430 2 161073 -- MSL 18 (19U 49)
+2 16587,20430 2 161074 -- MSL 19 (19U 50)
+3 16587,20130,300 2 161075 -- MSL 20 (19U 51)
+4 16587,20130 2 161076 -- MSL 21 (19U 52)
+5 16587,20130,300 2 161077 -- MSL 22 (19U 53)
+6 16587,20130,300 2 161078 -- MSL 23 (19U 54)
+7 16587,20130 2 161079 -- MSL 24 (19U 55)
+8 16587,20430,300 2 161080 -- MSL 25 (19U 56)
+9 16587,20430 2 161081 -- MSL 26 (19U 57)
+: 8295,12372,300 0 161082 -- MSL 27 (19U 58)
+; 8295,12372,5055 1 161083 -- MSL 28 (19U 59)
+< 26346,16068 0 161084 -- MSL 29 (19U 60)
+= 24882,11880 0 161085 -- MSL 30 (19U 61)
+> 26346,16068 0 161086 -- MSL 31 (19U 62)
+? 12198,20430,300 2 161087 -- MSL 32 (19U 63)
+at 24882,21030,2745 2 161088 -- MSL 33 (19U 64)
+@ "
+A 20979,20430 2 161089 -- MSL 34 (19U 65)
+B 15126,20130 2 161090 -- MSL 35 (19U 66)
+C 18051,20430,300 2 161091 -- MSL 36 (19U 67)
+D 18540,20130 2 161092 -- MSL 37 (19U 68)
+E 14637,20130 2 161093 -- MSL 38 (19U 69)
+F 13662,20130 2 161094 -- MSL 39 (19U 70)
+G 20490,20430,300 2 161095 -- MSL 40 (19U 71)
+H 20004,20130 2 161096 -- MSL 41 (19U 72)
+I 8295,20130 2 161097 -- MSL 42 (19U 73)
+J 10734,20130,4488 3 161098 -- MSL 43 (19U 74)
+K 18051,20130 2 161099 -- MSL 44 (19U 75)
+L 14148,20130 2 161100 -- MSL 45 (19U 76)
+M 24396,20130 2 161101 -- MSL 46 (19U 77)
+N 21468,20130 2 161102 -- MSL 47 (19U 78)
+O 22932,20430,300 2 161103 -- MSL 48 (19U 79)
+P 13662,20130 2 161104 -- MSL 49 (19U 80)
+Q 22932,20430,4152 3 161105 -- MSL 50 (19U 81)
+R 16587,20130 2 161106 -- MSL 51 (19U 82)
+S 13662,20430,300 2 161107 -- MSL 52 (19U 83)
+T 16587,20130 2 161108 -- MSL 53 (19U 84)
+U 20979,20130,300 2 161109 -- MSL 54 (19U 85)
+V 20490,20130 2 161110 -- MSL 55 (19U 86)
+W 24882,20430 2 161111 -- MSL 56 (19U 87)
+X 18051,20130 2 161112 -- MSL 57 (19U 88)
+Y 17076,20130 2 161113 -- MSL 58 (19U 89)
+Z 16101,20130 2 161114 -- MSL 59 (19U 90)
+lB 11220,20130,4365 3 161115 -- MSL 60 (19U 91)
+[ "
+rs 11709,20130 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 11220,20130,4365 3 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588 1 161119 -- MSL 64 (19U 95)
+oq 8295,20130 2 161169 -- MSL 66 (19U 145)
+` "
+a 12198,14310,300 0 161121 -- MSL 67 (19U 97)
+b 14148,20025 2 161122 -- MSL 68 (19U 98)
+c 12198,14310,300 0 161123 -- MSL 69 (19U 99)
+d 14637,20025,300 2 161124 -- MSL 70 (19U 100)
+e 12684,14310,300 0 161125 -- MSL 71 (19U 101)
+f 8295,20130 2 161126 -- MSL 72 (19U 102)
+g 12684,14310,4479 1 161127 -- MSL 73 (19U 103)
+h 14148,20025 2 161128 -- MSL 74 (19U 104)
+i 6342,19815 2 161129 -- MSL 75 (19U 105)
+j 6342,19815,4365 3 161130 -- MSL 76 (19U 106)
+k 12684,20025 2 161131 -- MSL 77 (19U 107)
+l 6342,20025 2 161132 -- MSL 78 (19U 108)
+m 21954,14310 0 161133 -- MSL 79 (19U 109)
+n 14148,14310 0 161134 -- MSL 80 (19U 110)
+o 14637,14310,300 0 161135 -- MSL 81 (19U 111)
+p 14637,14310,4365 1 161136 -- MSL 82 (19U 112)
+q 14148,14310,4365 1 161137 -- MSL 83 (19U 113)
+r 9759,14310 0 161138 -- MSL 84 (19U 114)
+s 9270,14310,300 0 161139 -- MSL 85 (19U 115)
+t 8781,16950,300 0 161140 -- MSL 86 (19U 116)
+u 14148,14010,300 0 161141 -- MSL 87 (19U 117)
+v 12684,14010 0 161142 -- MSL 88 (19U 118)
+w 18540,14010 0 161143 -- MSL 89 (19U 119)
+x 12684,14010 0 161144 -- MSL 90 (19U 120)
+y 13173,14010,4365 1 161145 -- MSL 91 (19U 121)
+z 10245,14010 0 161146 -- MSL 92 (19U 122)
+{ 11709,20130,6075 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588 3 161148 -- MSL 94 (19U 124)
+ba "
+} 11709,20130,6075 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,8952 0 161150 -- MSL 96 (19U 126)
+`A 20979,24960 2 161216 -- MSL 99 (19U 192)
+^A 20979,24960 2 161218 -- MSL 100 (19U 194)
+`E 14637,24960 2 161224 -- MSL 101 (19U 200)
+^E 14637,24960 2 161226 -- MSL 102 (19U 202)
+:E 14637,25020 2 161227 -- MSL 103 (19U 203)
+^I 8295,24960 2 161230 -- MSL 104 (19U 206)
+:I 8295,25020 2 161231 -- MSL 105 (19U 207)
+aa 16587,19785 2 161204 -- MSL 106 (19U 180)
+ga 16587,19785 2 161120 -- MSL 107 (19U 96)
+a^ 16587,19785 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 16587,19140 2 161192 -- MSL 109 (19U 168)
+~ 16587,18507 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 20979,24960,300 2 161241 -- MSL 111 (19U 217)
+^U 20979,24960,300 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105 2 161199 -- MSL 113 (19U 175)
+'Y 17076,24960 2 161245 -- MSL 114 (19U 221)
+'y 13173,19785,4365 3 161277 -- MSL 115 (19U 253)
+de 13662,20430 2 161200 -- MSL 116 (19U 176)
+,C 18051,20430,6330 3 161223 -- MSL 117 (19U 199)
+,c 12198,14310,6006 1 161255 -- MSL 118 (19U 231)
+~N 21468,24783 2 161233 -- MSL 119 (19U 209)
+~n 14148,18507 2 161265 -- MSL 120 (19U 241)
+r! 8295,14346,6084 1 161185 -- MSL 121 (19U 161)
+r? 12198,14496,6234 1 161215 -- MSL 122 (19U 191)
+Cs 16587,15684 0 161188 -- MSL 123 (19U 164)
+Po 16587,20430 2 161187 -- MSL 124 (19U 163)
+Ye 16587,20130 2 161189 -- MSL 125 (19U 165)
+sc 16587,20430,4365 3 161191 -- MSL 126 (19U 167)
+Fn 16587,20130 2 161155 -- MSL 127 (19U 131)
+ct 16587,19968 2 161186 -- MSL 128 (19U 162)
+^a 12198,19785,300 2 161250 -- MSL 129 (19U 226)
+^e 12684,19785,300 2 161258 -- MSL 130 (19U 234)
+^o 14637,19785,300 2 161268 -- MSL 131 (19U 244)
+^u 14148,19785,300 2 161275 -- MSL 132 (19U 251)
+'a 12198,19785,300 2 161249 -- MSL 133 (19U 225)
+'e 12684,19785,300 2 161257 -- MSL 134 (19U 233)
+'o 14637,19785,300 2 161267 -- MSL 135 (19U 243)
+'u 14148,19785,300 2 161274 -- MSL 136 (19U 250)
+`a 12198,19785,300 2 161248 -- MSL 137 (19U 224)
+`e 12684,19785,300 2 161256 -- MSL 138 (19U 232)
+`o 14637,19785,300 2 161266 -- MSL 139 (19U 242)
+`u 14148,19785,300 2 161273 -- MSL 140 (19U 249)
+:a 12198,19140,300 2 161252 -- MSL 141 (19U 228)
+:e 12684,19140,300 2 161259 -- MSL 142 (19U 235)
+:o 14637,19140,300 2 161270 -- MSL 143 (19U 246)
+:u 14148,19140,300 2 161276 -- MSL 144 (19U 252)
+oA 20979,26154 2 161221 -- MSL 145 (19U 197)
+^i 6342,19785 2 161262 -- MSL 146 (19U 238)
+/O 22932,20454,300 2 161240 -- MSL 147 (19U 216)
+AE 25857,20130 2 161222 -- MSL 148 (19U 198)
+oa 12198,20160,300 2 161253 -- MSL 149 (19U 229)
+'i 6342,19785 2 161261 -- MSL 150 (19U 237)
+/o 14637,14316,300 0 161272 -- MSL 151 (19U 248)
+ae 19515,14310,300 0 161254 -- MSL 152 (19U 230)
+:A 20979,25020 2 161220 -- MSL 153 (19U 196)
+`i 6342,19785 2 161260 -- MSL 154 (19U 236)
+:O 22932,25020,300 2 161238 -- MSL 155 (19U 214)
+:U 20979,25020,300 2 161244 -- MSL 156 (19U 220)
+'E 14637,24960 2 161225 -- MSL 157 (19U 201)
+:i 6342,19140 2 161263 -- MSL 158 (19U 239)
+ss 15612,20130,300 2 161247 -- MSL 159 (19U 223)
+^O 22932,24960,300 2 161236 -- MSL 160 (19U 212)
+'A 20979,24960 2 161217 -- MSL 161 (19U 193)
+~A 20979,24783 2 161219 -- MSL 162 (19U 195)
+~a 12198,18507,300 2 161251 -- MSL 163 (19U 227)
+-D 20004,20130 2 161232 -- MSL 164 (19U 208)
+Sd 14637,20025,300 2 161264 -- MSL 165 (19U 240)
+'I 8295,24960 2 161229 -- MSL 166 (19U 205)
+`I 8295,24960 2 161228 -- MSL 167 (19U 204)
+'O 22932,24960,300 2 161235 -- MSL 168 (19U 211)
+`O 22932,24960,300 2 161234 -- MSL 169 (19U 210)
+~O 22932,24783,300 2 161237 -- MSL 170 (19U 213)
+~o 14637,18507,300 2 161269 -- MSL 171 (19U 245)
+vS 13662,24960,300 2 161162 -- MSL 172 (19U 138)
+vs 9270,19785,300 2 161178 -- MSL 173 (19U 154)
+'U 20979,24960,300 2 161242 -- MSL 174 (19U 218)
+:Y 17076,25020 2 161183 -- MSL 175 (19U 159)
+:y 13173,19140,4365 3 161279 -- MSL 176 (19U 255)
+TP 13662,20130 2 161246 -- MSL 177 (19U 222)
+Tp 14637,20025,4365 3 161278 -- MSL 178 (19U 254)
+mc 14637,12630,4350 1 161205 -- MSL 180 (19U 181)
+ps 16587,19635,4200 3 161206 -- MSL 181 (19U 182)
+34 24882,20430,300 2 161214 -- MSL 182 (19U 190)
+\- 24882,9405 0 60096 -- MSL 183 ( 7J 192)
+14 24882,20430,300 2 161212 -- MSL 184 (19U 188)
+12 24882,20430,300 2 161213 -- MSL 185 (19U 189)
+Of 10245,20430 2 161194 -- MSL 186 (19U 170)
+Om 10245,20430 2 161210 -- MSL 187 (19U 186)
+Fo 12198,12450 0 161195 -- MSL 188 (19U 171)
+Fc 12198,12450 0 161211 -- MSL 190 (19U 187)
+t+- 24882,15420,5175 1 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916 3 161190 -- MSL 192 (19U 166)
+co 13173,19635 2 161193 -- MSL 193 (19U 169)
+tno 24882,12135 0 161196 -- MSL 194 (19U 172)
+u00AD 8295,9795 0 161197 -- MSL 195 (19U 173)
+rg 13173,19635 2 161198 -- MSL 196 (19U 174)
+S2 10245,20340 2 161202 -- MSL 197 (19U 178)
+S3 10245,20130 2 161203 -- MSL 198 (19U 179)
+ac 16587,309,6006 1 161208 -- MSL 199 (19U 184)
+S1 10245,20340 2 161209 -- MSL 200 (19U 185)
+tmu 24882,15990,279 0 161239 -- MSL 201 (19U 215)
+tdi 24882,15090 0 161271 -- MSL 202 (19U 247)
+u203C 15126,20130,300 2 87315 -- MSL 221 (10U 19)
+u20A7 22443,20130,300 2 60121 -- MSL 232 ( 7J 217)
+pc 8295,12330 0 161207 -- MSL 302 (19U 183)
+u013F 14148,20130 2 51943 -- MSL 306 ( 6J 231)
+u0140 9759,20025 2 51959 -- MSL 307 ( 6J 247)
+u2113 16587,18150,297 2 60122 -- MSL 308 ( 7J 218)
+u0149 19515,20130 2 51951 -- MSL 309 ( 6J 239)
+fm 8295,20130 2 60101 -- MSL 310 ( 7J 197)
+sd 14148,20130 2 60102 -- MSL 311 ( 7J 198)
+dg 16587,20130,4365 3 161158 -- MSL 312 (19U 134)
+tm 16101,17850 0 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588 1 60095 -- MSL 314 ( 7J 191)
+ah 16587,19785 2 75169 -- MSL 315 ( 9E 161)
+ao 16587,20160 2 60152 -- MSL 316 ( 7J 248)
+f/ 3414,20430,300 2 60109 -- MSL 324 ( 7J 205)
+em 24882,9525 0 161175 -- MSL 325 (19U 151)
+en 16587,9525 0 161174 -- MSL 326 (19U 150)
+dd 16587,20130,4365 3 161159 -- MSL 327 (19U 135)
+.i 6342,14010 0 46333 -- MSL 328 ( 5T 253)
+aq 8295,20130 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226 0 161173 -- MSL 331 (19U 149)
+u207F 12198,20340 2 87548 -- MSL 332 (10U 252)
+u0111 15126,20025,300 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 20979,24900 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 12198,19110,300 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 20979,20430,6417 3 75173 -- MSL 404 ( 9E 165)
+u0061_0328 12198,14310,6417 1 75193 -- MSL 405 ( 9E 185)
+'C 18051,24960,300 2 75206 -- MSL 406 ( 9E 198)
+'c 12198,19785,300 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 18051,24960,300 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 12198,19785,300 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 18540,24960 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 18051,20130,300 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 14637,24960 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 12684,19785,300 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 14637,20130,6417 3 75210 -- MSL 422 ( 9E 202)
+u0065_0328 12684,14310,6417 1 75242 -- MSL 423 ( 9E 234)
+u004C_0301 14148,24960 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 6342,24960 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 14148,20130 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 9759,20130 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 21468,24960 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 14148,19785 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 21468,24960 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 14148,19785 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 22932,24960,300 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 14637,19785,300 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 16587,24960 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 9759,19785 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 16587,24960 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 9759,19785 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 13662,24960,300 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 9270,19785,300 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 16587,24960 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 10245,20130,300 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 16587,20130,6330 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 8781,16950,6006 1 75262 -- MSL 469 ( 9E 254)
+u0055_030B 20979,24960,300 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 14148,19785,300 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 20979,26154,300 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 14148,20160,300 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 16101,24960 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 10245,19785 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 16101,25020 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 10245,19140 2 75199 -- MSL 485 ( 9E 191)
+u2070 10245,20340 2 51753 -- MSL 1000 ( 6J 41)
+u2074 10245,20130 2 51748 -- MSL 1001 ( 6J 36)
+u2075 10245,20130 2 51749 -- MSL 1002 ( 6J 37)
+u2076 10245,20130 2 51806 -- MSL 1003 ( 6J 94)
+u2077 10245,20130 2 51750 -- MSL 1004 ( 6J 38)
+u2078 10245,20340 2 51754 -- MSL 1005 ( 6J 42)
+u2079 10245,20340 2 51752 -- MSL 1006 ( 6J 40)
+lq 14148,20130 2 161171 -- MSL 1017 (19U 147)
+rq 14148,20130 2 161172 -- MSL 1018 (19U 148)
+Bq 14148,3900,5100 1 161156 -- MSL 1019 (19U 132)
+u2003 24882,0 0 51821 -- MSL 1020 ( 6J 109)
+u2002 16587,0 0 51822 -- MSL 1021 ( 6J 110)
+u2009 8295,0 0 51828 -- MSL 1023 ( 6J 116)
+u2026 24882,3630,300 0 161157 -- MSL 1028 (19U 133)
+vz 10245,19785 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,18000 0 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056 3 51794 -- MSL 1036 ( 6J 82)
+fi 14148,20130 2 60077 -- MSL 1040 ( 7J 173)
+fl 14148,20130 2 60078 -- MSL 1041 ( 7J 174)
+ff 15612,20130 2 51883 -- MSL 1042 ( 6J 171)
+Fi 21468,20130 2 51884 -- MSL 1043 ( 6J 172)
+Fl 21468,20130 2 51885 -- MSL 1044 ( 6J 173)
+ij 12684,19815,4365 3 60134 -- MSL 1047 ( 7J 230)
+u2105 26346,20430,300 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 20490,24900,300 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 12684,19110,4479 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 13662,20430,6330 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 9270,14310,6006 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 8295,25020 2 46301 -- MSL 1065 ( 5T 221)
+bq 8295,3900,5100 1 161154 -- MSL 1067 (19U 130)
+%0 33177,20430,300 2 161161 -- MSL 1068 (19U 137)
+a- 16587,18603 2 60154 -- MSL 1084 ( 7J 250)
+ab 16587,19110 2 75170 -- MSL 1086 ( 9E 162)
+a. 16587,19140 2 75263 -- MSL 1088 ( 9E 255)
+oe 22443,14310,300 0 161180 -- MSL 1090 (19U 156)
+OE 26346,20430,300 2 161164 -- MSL 1091 (19U 140)
+fo 6831,12450 0 161163 -- MSL 1092 (19U 139)
+fc 6831,12450 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624 0 60091 -- MSL 1094 ( 7J 187)
+/L 16101,20130 2 75171 -- MSL 1095 ( 9E 163)
+/l 9270,20025 2 75187 -- MSL 1096 ( 9E 179)
+a" 16587,19785 2 75197 -- MSL 1097 ( 9E 189)
+ho 16587,297,6417 1 75186 -- MSL 1098 ( 9E 178)
+vZ 16101,24960 2 75150 -- MSL 1106 ( 9E 142)
+IJ 18051,20130,4488 3 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/AOB b/font/devlj4/AOB
new file mode 100644
index 0000000..a3b9b7a
--- /dev/null
+++ b/font/devlj4/AOB
@@ -0,0 +1,720 @@
+# AntiqueOlv Bd
+name AOB
+spacewidth 8781
+pcltypeface 4168
+pclproportional 1
+pclweight 3
+pclstyle 0
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -1460
+P . -5363
+P , -5363
+V A -1949
+A V -1949
+T o -2438
+T c -1949
+T e -1949
+T d -1949
+T s -1460
+T a -1949
+T J -2924
+L T -2924
+L Y -3413
+Y o -3413
+Y e -2924
+Y a -2924
+Y J -2924
+A W -1460
+W A -1460
+T A -2438
+V o -1460
+V e -1460
+V a -1460
+Y A -2924
+F A -485
+F . -3902
+F , -3902
+A T -2438
+A Y -2924
+v . -2924
+v , -2924
+y . -3413
+y , -3413
+T . -3413
+T , -3413
+L W -974
+P A -974
+V J -2924
+V . -3413
+V , -3413
+Y . -3902
+Y , -3902
+W o -974
+W e -974
+W a -974
+W . -2438
+W , -2438
+r . -3413
+r , -3413
+w . -2924
+w , -2924
+Y u -974
+A v -1460
+A y -1460
+A w -1460
+o . -2438
+o , -2438
+p . -1949
+p , -1949
+e . -1460
+e , -1460
+b . -2438
+b , -2438
+O T -485
+O V -974
+O Y -1460
+O . -1949
+O , -1949
+L y -974
+P J -2924
+V y -485
+V u -485
+V O -974
+V G -974
+V C -974
+V Q -974
+D T -485
+D V -974
+D Y -1460
+D . -1949
+D , -1949
+Y O -1460
+Y G -1460
+Y C -1460
+Y Q -1460
+c . -1460
+c , -1460
+O A -485
+O W -974
+R V -485
+R Y -974
+R W -485
+G T -485
+P o -485
+P g -485
+P e -485
+P a -485
+C . -485
+C , -485
+D A -485
+D W -974
+B Y -974
+B . -1460
+B , -1460
+F J -2924
+A O -485
+A G -485
+A C -485
+A U -485
+A Q -485
+W r -485
+W y -485
+W u -485
+W O -974
+W G -974
+W C -974
+W J -1949
+W Q -974
+J A -485
+J . -1949
+J , -1949
+U A -485
+U . -1949
+U , -1949
+Q A -485
+Q W -974
+f . -1460
+f , -1460
+T O -485
+T G -485
+T C -485
+T Q -485
+O X -485
+G V -974
+G Y -1460
+G W -974
+G . -1949
+G , -1949
+P V -485
+P Y -974
+C V -485
+C Y -974
+D X -485
+B V -485
+B X -485
+B A -485
+B W -485
+S . -1460
+S , -1460
+X o -485
+X e -485
+X y -485
+X O -485
+X G -485
+X C -485
+X Q -485
+A o -485
+A e -485
+Q X -485
+K o -485
+K e -485
+K y -485
+K w -485
+K O -485
+K G -485
+K C -485
+K Q -485
+o v -974
+o y -974
+o x -485
+o w -974
+h v -974
+h y -974
+n v -974
+n y -974
+m v -974
+m y -974
+g . -485
+g , -485
+p v -974
+p y -974
+p x -485
+c v -974
+c y -974
+c w -974
+v o -974
+v g -974
+v c -974
+v d -974
+v a -974
+v q -974
+e v -974
+e y -974
+b v -974
+b y -974
+b w -974
+s . -974
+s , -974
+y o -974
+y g -974
+y c -974
+y d -974
+y a -974
+y q -974
+x o -485
+x g -485
+x c -485
+x e -485
+x d -485
+x a -485
+x q -485
+a v -974
+a y -974
+a w -974
+w o -974
+w g -974
+w c -974
+w d -974
+w a -974
+w q -974
+R o -1460
+R O -485
+R G -485
+R C -485
+R Q -485
+G X -485
+G A -485
+P s -485
+P X -485
+P W -485
+C W -485
+V S -485
+S V -485
+S Y -974
+S X -485
+S A -485
+S W -485
+Y S -974
+X a -485
+X u -485
+X S -485
+A t -485
+A g -485
+A c -485
+A d -485
+A a -485
+A u -485
+A q -485
+A S -485
+W S -485
+K c -485
+K u -485
+K S -485
+t . -485
+t , -485
+h w -974
+h . -485
+h , -485
+n w -974
+n . -485
+n , -485
+m w -974
+m . -485
+m , -485
+l . -485
+l , -485
+i . -485
+i , -485
+p w -974
+c x -485
+v e -974
+v s -974
+e x -485
+e w -974
+z . -485
+z , -485
+d . -485
+d , -485
+s v -974
+s y -974
+s x -485
+s w -974
+y e -974
+y s -974
+x s -485
+x . -485
+x , -485
+a . -485
+a , -485
+w e -974
+w s -974
+j . -485
+j , -485
+u . -485
+k o -485
+k g -485
+k c -485
+k e -485
+k d -485
+k a -485
+k q -485
+k . -485
+k , -485
+O Z -485
+O J -1460
+H . -485
+H , -485
+N . -485
+N , -485
+M . -485
+M , -485
+L . -485
+L , -485
+R e -1460
+R a -974
+R . -485
+R , -485
+G Z -485
+I . -485
+I , -485
+P O -485
+P G -485
+P C -485
+P Q -485
+E . -485
+E , -485
+Z o -1949
+Z e -1949
+Z d -1949
+Z s -485
+Z a -974
+Z O -485
+Z G -485
+Z C -485
+Z Q -485
+Z . -485
+Z , -485
+D Z -485
+D J -1460
+B J -974
+S J -974
+X . -485
+X , -485
+A s -485
+A . -485
+A , -485
+J J -1460
+U J -1460
+K a -485
+K . -485
+K , -485
+k s -485
+G J -1460
+A f -485
+A cq -485
+A ' -485
+Y hy -974
+Y - -974
+Y en -974
+Y em -974
+V hy -485
+V - -485
+V en -485
+V em -485
+W hy -485
+W - -485
+W en -485
+W em -485
+X hy -485
+X - -485
+X en -485
+X em -485
+A hy -485
+A - -485
+A en -485
+A em -485
+K hy -485
+K - -485
+K en -485
+K em -485
+hy X -485
+- X -485
+hy A -485
+- A -485
+en X -485
+en A -485
+em X -485
+charset
+! 9759,20205,450 2 161057 -- MSL 1 (19U 33)
+dq 12198,19755 2 161058 -- MSL 2 (19U 34)
+" "
+sh 17565,20730,3630 3 161059 -- MSL 3 (19U 35)
+# "
+Do 17565,22980,3855 3 161060 -- MSL 4 (19U 36)
+$ "
+% 30249,20505,450 2 161061 -- MSL 5 (19U 37)
+& 21468,20205,450 2 161062 -- MSL 6 (19U 38)
+cq 6831,19755 2 161170 -- MSL 8 (19U 146)
+' "
+( 8781,19755 2 161064 -- MSL 9 (19U 40)
+) 8781,19755 2 161065 -- MSL 10 (19U 41)
+* 17565,20205 2 161066 -- MSL 11 (19U 42)
++ 30249,15450,600 0 161067 -- MSL 12 (19U 43)
+, 8781,4080,4710 1 161068 -- MSL 13 (19U 44)
+hy 8781,10965 0 161069 -- MSL 14 (19U 45)
+- "
+. 8781,4170,450 0 161070 -- MSL 15 (19U 46)
+sl 10734,20820,450 2 161071 -- MSL 16 (19U 47)
+/ "
+0 17565,20505,450 2 161072 -- MSL 17 (19U 48)
+1 17565,20055 2 161073 -- MSL 18 (19U 49)
+2 17565,20505 2 161074 -- MSL 19 (19U 50)
+3 17565,20055,450 2 161075 -- MSL 20 (19U 51)
+4 17565,20055 2 161076 -- MSL 21 (19U 52)
+5 17565,20055,450 2 161077 -- MSL 22 (19U 53)
+6 17565,20505,450 2 161078 -- MSL 23 (19U 54)
+7 17565,20055 2 161079 -- MSL 24 (19U 55)
+8 17565,20505,450 2 161080 -- MSL 25 (19U 56)
+9 17565,20505,450 2 161081 -- MSL 26 (19U 57)
+: 8781,15783,450 0 161082 -- MSL 27 (19U 58)
+; 8781,15783,4710 1 161083 -- MSL 28 (19U 59)
+< 26346,16068 0 161084 -- MSL 29 (19U 60)
+= 30249,12984 0 161085 -- MSL 30 (19U 61)
+> 26346,16068 0 161086 -- MSL 31 (19U 62)
+? 16101,20205,450 2 161087 -- MSL 32 (19U 63)
+at 30249,21057,2679 2 161088 -- MSL 33 (19U 64)
+@ "
+A 20004,19755 2 161089 -- MSL 34 (19U 65)
+B 18051,19755 2 161090 -- MSL 35 (19U 66)
+C 17076,20205,450 2 161091 -- MSL 36 (19U 67)
+D 19515,19755 2 161092 -- MSL 37 (19U 68)
+E 16101,19755 2 161093 -- MSL 38 (19U 69)
+F 16101,19755 2 161094 -- MSL 39 (19U 70)
+G 18540,20205,450 2 161095 -- MSL 40 (19U 71)
+H 19515,19755 2 161096 -- MSL 41 (19U 72)
+I 8295,19755 2 161097 -- MSL 42 (19U 73)
+J 13662,19755,450 2 161098 -- MSL 43 (19U 74)
+K 18540,19755 2 161099 -- MSL 44 (19U 75)
+L 14637,19755 2 161100 -- MSL 45 (19U 76)
+M 24396,19755 2 161101 -- MSL 46 (19U 77)
+N 20004,19755 2 161102 -- MSL 47 (19U 78)
+O 20004,20205,450 2 161103 -- MSL 48 (19U 79)
+P 18540,19755 2 161104 -- MSL 49 (19U 80)
+Q 20004,20205,3075 2 161105 -- MSL 50 (19U 81)
+R 18051,19755 2 161106 -- MSL 51 (19U 82)
+S 15612,20205,450 2 161107 -- MSL 52 (19U 83)
+T 17076,19755 2 161108 -- MSL 53 (19U 84)
+U 19029,19755,450 2 161109 -- MSL 54 (19U 85)
+V 19029,19755 2 161110 -- MSL 55 (19U 86)
+W 27321,19755 2 161111 -- MSL 56 (19U 87)
+X 19029,19755 2 161112 -- MSL 57 (19U 88)
+Y 19029,19755 2 161113 -- MSL 58 (19U 89)
+Z 17565,19755 2 161114 -- MSL 59 (19U 90)
+lB 8781,19755 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 10734,20820,450 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 8781,19755 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588 1 161119 -- MSL 64 (19U 95)
+oq 6831,19755 2 161169 -- MSL 66 (19U 145)
+` "
+a 17076,17205,450 0 161121 -- MSL 67 (19U 97)
+b 19029,20820,450 2 161122 -- MSL 68 (19U 98)
+c 15612,17205,450 0 161123 -- MSL 69 (19U 99)
+d 19029,20820,450 2 161124 -- MSL 70 (19U 100)
+e 17565,17205,450 0 161125 -- MSL 71 (19U 101)
+f 13662,20820 2 161126 -- MSL 72 (19U 102)
+g 19029,17205,3930 1 161127 -- MSL 73 (19U 103)
+h 19029,20820 2 161128 -- MSL 74 (19U 104)
+i 8781,21855 2 161129 -- MSL 75 (19U 105)
+j 8781,21855,3930 3 161130 -- MSL 76 (19U 106)
+k 17076,20820 2 161131 -- MSL 77 (19U 107)
+l 8295,20820 2 161132 -- MSL 78 (19U 108)
+m 27810,17205 0 161133 -- MSL 79 (19U 109)
+n 19029,17205 0 161134 -- MSL 80 (19U 110)
+o 18540,17205,450 0 161135 -- MSL 81 (19U 111)
+p 19029,17205,3930 1 161136 -- MSL 82 (19U 112)
+q 19029,17205,3930 1 161137 -- MSL 83 (19U 113)
+r 13662,17205 0 161138 -- MSL 84 (19U 114)
+s 14637,17205,450 0 161139 -- MSL 85 (19U 115)
+t 14148,20970,450 2 161140 -- MSL 86 (19U 116)
+u 18540,16755,450 0 161141 -- MSL 87 (19U 117)
+v 17565,16755 0 161142 -- MSL 88 (19U 118)
+w 26346,16755 0 161143 -- MSL 89 (19U 119)
+x 17565,16755 0 161144 -- MSL 90 (19U 120)
+y 17565,16755,3930 1 161145 -- MSL 91 (19U 121)
+z 15126,16755 0 161146 -- MSL 92 (19U 122)
+{ 13173,20130,6075 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588 3 161148 -- MSL 94 (19U 124)
+ba "
+} 13173,20130,6075 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,9435 0 161150 -- MSL 96 (19U 126)
+`A 20004,24930 2 161216 -- MSL 99 (19U 192)
+^A 20004,24930 2 161218 -- MSL 100 (19U 194)
+`E 16101,24930 2 161224 -- MSL 101 (19U 200)
+^E 16101,24930 2 161226 -- MSL 102 (19U 202)
+:E 16101,25050 2 161227 -- MSL 103 (19U 203)
+^I 8295,24930 2 161230 -- MSL 104 (19U 206)
+:I 8295,25050 2 161231 -- MSL 105 (19U 207)
+aa 17565,22125 2 161204 -- MSL 106 (19U 180)
+ga 17565,22125 2 161120 -- MSL 107 (19U 96)
+a^ 17565,22125 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 17565,22125 2 161192 -- MSL 109 (19U 168)
+~ 17565,22521 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 19029,24930,450 2 161241 -- MSL 111 (19U 217)
+^U 19029,24930,450 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105 2 161199 -- MSL 113 (19U 175)
+'Y 19029,24930 2 161245 -- MSL 114 (19U 221)
+'y 17565,22125,3930 3 161277 -- MSL 115 (19U 253)
+de 17565,20505 2 161200 -- MSL 116 (19U 176)
+,C 17076,20205,5988 3 161223 -- MSL 117 (19U 199)
+,c 15612,17205,5988 1 161255 -- MSL 118 (19U 231)
+~N 20004,25161 2 161233 -- MSL 119 (19U 209)
+~n 19029,22521 2 161265 -- MSL 120 (19U 241)
+r! 9759,17115,3540 1 161185 -- MSL 121 (19U 161)
+r? 16101,17106,3549 1 161215 -- MSL 122 (19U 191)
+Cs 17565,15834 0 161188 -- MSL 123 (19U 164)
+Po 17565,20505 2 161187 -- MSL 124 (19U 163)
+Ye 17565,20055 2 161189 -- MSL 125 (19U 165)
+sc 17565,20205,3930 3 161191 -- MSL 126 (19U 167)
+Fn 17565,20820 2 161155 -- MSL 127 (19U 131)
+ct 17565,21603,1890 2 161186 -- MSL 128 (19U 162)
+^a 17076,22125,450 2 161250 -- MSL 129 (19U 226)
+^e 17565,22125,450 2 161258 -- MSL 130 (19U 234)
+^o 18540,22125,450 2 161268 -- MSL 131 (19U 244)
+^u 18540,22125,450 2 161275 -- MSL 132 (19U 251)
+'a 17076,22125,450 2 161249 -- MSL 133 (19U 225)
+'e 17565,22125,450 2 161257 -- MSL 134 (19U 233)
+'o 18540,22125,450 2 161267 -- MSL 135 (19U 243)
+'u 18540,22125,450 2 161274 -- MSL 136 (19U 250)
+`a 17076,22125,450 2 161248 -- MSL 137 (19U 224)
+`e 17565,22125,450 2 161256 -- MSL 138 (19U 232)
+`o 18540,22125,450 2 161266 -- MSL 139 (19U 242)
+`u 18540,22125,450 2 161273 -- MSL 140 (19U 249)
+:a 17076,22125,450 2 161252 -- MSL 141 (19U 228)
+:e 17565,22125,450 2 161259 -- MSL 142 (19U 235)
+:o 18540,22125,450 2 161270 -- MSL 143 (19U 246)
+:u 18540,22125,450 2 161276 -- MSL 144 (19U 252)
+oA 20004,27354 2 161221 -- MSL 145 (19U 197)
+^i 8781,22125 2 161262 -- MSL 146 (19U 238)
+/O 20004,20205,450 2 161240 -- MSL 147 (19U 216)
+AE 30249,19755 2 161222 -- MSL 148 (19U 198)
+oa 17076,24825,450 2 161253 -- MSL 149 (19U 229)
+'i 8781,22125 2 161261 -- MSL 150 (19U 237)
+/o 18540,17205,450 0 161272 -- MSL 151 (19U 248)
+ae 27321,17205,450 0 161254 -- MSL 152 (19U 230)
+:A 20004,25050 2 161220 -- MSL 153 (19U 196)
+`i 8781,22125 2 161260 -- MSL 154 (19U 236)
+:O 20004,25050,450 2 161238 -- MSL 155 (19U 214)
+:U 19029,25050,450 2 161244 -- MSL 156 (19U 220)
+'E 16101,24930 2 161225 -- MSL 157 (19U 201)
+:i 8781,22125 2 161263 -- MSL 158 (19U 239)
+ss 18540,20820,450 2 161247 -- MSL 159 (19U 223)
+^O 20004,24930,450 2 161236 -- MSL 160 (19U 212)
+'A 20004,24930 2 161217 -- MSL 161 (19U 193)
+~A 20004,25161 2 161219 -- MSL 162 (19U 195)
+~a 17076,22521,450 2 161251 -- MSL 163 (19U 227)
+-D 19515,19755 2 161232 -- MSL 164 (19U 208)
+Sd 18540,21666,450 2 161264 -- MSL 165 (19U 240)
+'I 8295,24930 2 161229 -- MSL 166 (19U 205)
+`I 8295,24930 2 161228 -- MSL 167 (19U 204)
+'O 20004,24930,450 2 161235 -- MSL 168 (19U 211)
+`O 20004,24930,450 2 161234 -- MSL 169 (19U 210)
+~O 20004,25161,450 2 161237 -- MSL 170 (19U 213)
+~o 18540,22521,450 2 161269 -- MSL 171 (19U 245)
+vS 15612,24930,450 2 161162 -- MSL 172 (19U 138)
+vs 14637,22125,450 2 161178 -- MSL 173 (19U 154)
+'U 19029,24930,450 2 161242 -- MSL 174 (19U 218)
+:Y 19029,25050 2 161183 -- MSL 175 (19U 159)
+:y 17565,22125,3930 3 161279 -- MSL 176 (19U 255)
+TP 18540,19755 2 161246 -- MSL 177 (19U 222)
+Tp 19029,20820,3930 3 161278 -- MSL 178 (19U 254)
+mc 15612,12630,4680 1 161205 -- MSL 180 (19U 181)
+ps 17565,19635,4200 1 161206 -- MSL 181 (19U 182)
+34 30249,20610,555 2 161214 -- MSL 182 (19U 190)
+\- 30249,9375 0 60096 -- MSL 183 ( 7J 192)
+14 30249,20610,555 2 161212 -- MSL 184 (19U 188)
+12 30249,20610,555 2 161213 -- MSL 185 (19U 189)
+Of 14637,20505 2 161194 -- MSL 186 (19U 170)
+Om 14637,20505 2 161210 -- MSL 187 (19U 186)
+Fo 15612,14025 0 161195 -- MSL 188 (19U 171)
+Fc 15612,14025 0 161211 -- MSL 190 (19U 187)
+t+- 30249,15450,5895 1 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916 1 161190 -- MSL 192 (19U 166)
+co 13173,19635 0 161193 -- MSL 193 (19U 169)
+tno 30249,11274 0 161196 -- MSL 194 (19U 172)
+u00AD 8781,10965 0 161197 -- MSL 195 (19U 173)
+rg 13173,19635 0 161198 -- MSL 196 (19U 174)
+S2 11709,20385 2 161202 -- MSL 197 (19U 178)
+S3 11709,20055 2 161203 -- MSL 198 (19U 179)
+ac 17565,507,5988 1 161208 -- MSL 199 (19U 184)
+S1 11709,20055 2 161209 -- MSL 200 (19U 185)
+tmu 30249,15225,585 0 161239 -- MSL 201 (19U 215)
+tdi 30249,15885,1035 0 161271 -- MSL 202 (19U 247)
+u203C 18051,20205,450 2 87315 -- MSL 221 (10U 19)
+u20A7 32688,20970,450 2 60121 -- MSL 232 ( 7J 217)
+pc 8781,12759 0 161207 -- MSL 302 (19U 183)
+u013F 14637,19755 2 51943 -- MSL 306 ( 6J 231)
+u0140 14148,20820 2 51959 -- MSL 307 ( 6J 247)
+u2113 17565,18045,765 0 60122 -- MSL 308 ( 7J 218)
+u0149 24882,19755 2 51951 -- MSL 309 ( 6J 239)
+fm 8781,20055 2 60101 -- MSL 310 ( 7J 197)
+sd 17565,20055 2 60102 -- MSL 311 ( 7J 198)
+dg 17565,20205,4095 3 161158 -- MSL 312 (19U 134)
+tm 16101,17850 0 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588 1 60095 -- MSL 314 ( 7J 191)
+ah 17565,22125 2 75169 -- MSL 315 ( 9E 161)
+ao 17565,24825 2 60152 -- MSL 316 ( 7J 248)
+f/ 5367,20610,555 2 60109 -- MSL 324 ( 7J 205)
+em 30249,10440 0 161175 -- MSL 325 (19U 151)
+en 17565,10440 0 161174 -- MSL 326 (19U 150)
+dd 17565,20205,4095 3 161159 -- MSL 327 (19U 135)
+.i 8781,16755 0 46333 -- MSL 328 ( 5T 253)
+aq 6831,19755 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226 0 161173 -- MSL 331 (19U 149)
+u207F 13662,20385 2 87548 -- MSL 332 (10U 252)
+u0111 19029,20820,450 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 20004,25005 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 17076,22200,450 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 20004,19755,4155 3 75173 -- MSL 404 ( 9E 165)
+u0061_0328 17076,17205,4155 1 75193 -- MSL 405 ( 9E 185)
+'C 17076,24930,450 2 75206 -- MSL 406 ( 9E 198)
+'c 15612,22125,450 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 17076,24930,450 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 15612,22125,450 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 19515,24930 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 22443,22290,450 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 16101,24930 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 17565,22125,450 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 16101,19755,4155 3 75210 -- MSL 422 ( 9E 202)
+u0065_0328 17565,17205,4155 1 75242 -- MSL 423 ( 9E 234)
+u004C_0301 14637,24930 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 8295,25530 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 14637,19755 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 11709,22290 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 20004,24930 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 19029,22125 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 20004,24930 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 19029,22125 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 20004,24930,450 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 18540,22125,450 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 18051,24930 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 13662,22125 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 18051,24930 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 13662,22125 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 15612,24930,450 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 14637,22125,450 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 17076,24930 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 14148,22290,450 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 17076,19755,5988 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 14148,20970,5988 3 75262 -- MSL 469 ( 9E 254)
+u0055_030B 19029,24930,450 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 18540,22125,450 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 19029,27354,450 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 18540,24825,450 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 17565,24930 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 15126,22125 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 17565,25515 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 15126,22590 2 75199 -- MSL 485 ( 9E 191)
+u2070 11709,20385 2 51753 -- MSL 1000 ( 6J 41)
+u2074 11709,20055 2 51748 -- MSL 1001 ( 6J 36)
+u2075 11709,20055 2 51749 -- MSL 1002 ( 6J 37)
+u2076 11709,20385 2 51806 -- MSL 1003 ( 6J 94)
+u2077 11709,20055 2 51750 -- MSL 1004 ( 6J 38)
+u2078 11709,20385 2 51754 -- MSL 1005 ( 6J 42)
+u2079 11709,20385 2 51752 -- MSL 1006 ( 6J 40)
+lq 11220,19755 2 161171 -- MSL 1017 (19U 147)
+rq 11220,19755 2 161172 -- MSL 1018 (19U 148)
+Bq 11220,4038,3672 1 161156 -- MSL 1019 (19U 132)
+u2003 30249,0 0 51821 -- MSL 1020 ( 6J 109)
+u2002 17565,0 0 51822 -- MSL 1021 ( 6J 110)
+u2009 8781,0 0 51828 -- MSL 1023 ( 6J 116)
+u2026 30249,3975 0 161157 -- MSL 1028 (19U 133)
+vz 15126,22125 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,18000 0 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056 1 51794 -- MSL 1036 ( 6J 82)
+fi 21954,21855 2 60077 -- MSL 1040 ( 7J 173)
+fl 21954,20820 2 60078 -- MSL 1041 ( 7J 174)
+ff 25371,20820 2 51883 -- MSL 1042 ( 6J 171)
+Fi 33177,21855 2 51884 -- MSL 1043 ( 6J 172)
+Fl 33177,20820 2 51885 -- MSL 1044 ( 6J 173)
+ij 17565,21855,3930 3 60134 -- MSL 1047 ( 7J 230)
+u2105 30249,20385,330 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 18540,25005,450 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 19029,22200,3930 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 15612,20205,5988 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 14637,17205,5988 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 8295,25515 2 46301 -- MSL 1065 ( 5T 221)
+bq 6831,4038,3672 1 161154 -- MSL 1067 (19U 130)
+%0 34152,20505,450 2 161161 -- MSL 1068 (19U 137)
+a- 17565,21675 2 60154 -- MSL 1084 ( 7J 250)
+ab 17565,22200 2 75170 -- MSL 1086 ( 9E 162)
+a. 17565,22590 2 75263 -- MSL 1088 ( 9E 255)
+oe 28785,17205,450 0 161180 -- MSL 1090 (19U 156)
+OE 28785,20205,450 2 161164 -- MSL 1091 (19U 140)
+fo 9270,14025 0 161163 -- MSL 1092 (19U 139)
+fc 9270,14025 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624 0 60091 -- MSL 1094 ( 7J 187)
+/L 14148,19755 2 75171 -- MSL 1095 ( 9E 163)
+/l 9270,20820 2 75187 -- MSL 1096 ( 9E 179)
+a" 17565,22125 2 75197 -- MSL 1097 ( 9E 189)
+ho 17565,1095,4155 1 75186 -- MSL 1098 ( 9E 178)
+vZ 17565,24930 2 75150 -- MSL 1106 ( 9E 142)
+IJ 21954,19755,450 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/AOI b/font/devlj4/AOI
new file mode 100644
index 0000000..84545ac
--- /dev/null
+++ b/font/devlj4/AOI
@@ -0,0 +1,782 @@
+# AntiqueOlv It
+name AOI
+spacewidth 7806
+slant 11.150000
+pcltypeface 4168
+pclproportional 1
+pclweight 0
+pclstyle 1
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -2438
+P . -4877
+P , -4877
+V A -2438
+A V -1949
+T o -2924
+T r -1460
+T c -2924
+T e -2924
+T d -2924
+T s -2438
+T y -1460
+T a -2924
+T w -1460
+T u -1460
+T J -2924
+L T -2924
+L Y -2924
+Y o -2924
+Y e -2924
+Y a -2438
+Y J -2924
+A W -1460
+W A -1460
+T A -2924
+V o -1460
+V e -1460
+V a -1460
+Y A -2924
+F A -1460
+F . -3902
+F , -3902
+A T -2438
+A Y -2438
+v . -2438
+v , -2438
+y . -2924
+y , -2924
+T . -3413
+T , -3413
+L W -1460
+P A -974
+V J -2924
+V . -3413
+V , -3413
+Y . -3413
+Y , -3413
+W o -974
+W e -974
+W a -974
+W . -1949
+W , -1949
+r . -1949
+r , -1949
+w . -2438
+w , -2438
+Y u -974
+A v -1460
+A y -1460
+A w -974
+o . -2438
+o , -2438
+p . -2438
+p , -2438
+e . -1460
+e , -1460
+b . -2438
+b , -2438
+O T -1460
+O V -974
+O Y -1460
+O . -2438
+O , -2438
+L y -1949
+L O -2438
+L G -2438
+L C -2438
+L Q -2438
+P J -2924
+V y -974
+V u -974
+V O -974
+V G -974
+V C -974
+V Q -974
+D T -1460
+D V -974
+D Y -1460
+D . -2438
+D , -2438
+Y O -974
+Y G -974
+Y C -974
+Y Q -974
+F o -485
+F e -485
+F a -485
+c . -1460
+c , -1460
+O A -974
+O W -485
+L U -1949
+R T -974
+R V -974
+R Y -974
+R W -485
+G T -1460
+C A -485
+C . -974
+C , -974
+D A -974
+D W -485
+B T -1460
+B Y -1460
+B . -1460
+B , -1460
+F J -2924
+A O -974
+A G -974
+A C -974
+A U -974
+A Q -974
+W r -485
+W y -485
+W u -485
+W O -485
+W G -485
+W C -485
+W J -1460
+W Q -485
+J A -485
+J . -974
+J , -974
+U A -974
+U . -2438
+U , -2438
+Q W -485
+f . -2438
+f , -2438
+T O -1460
+T G -1460
+T C -1460
+T Q -1460
+O X -974
+L o -2924
+L e -2438
+L q -1949
+G V -974
+G Y -1460
+G W -485
+G . -1949
+G , -1949
+P T -1460
+P V -974
+P Y -1460
+C T -974
+C V -974
+C Y -974
+D X -974
+B V -974
+B X -974
+B A -974
+B W -485
+S . -1949
+S , -1949
+X o -974
+X e -974
+X y -974
+X O -974
+X G -974
+X C -974
+X Q -974
+A o -974
+A e -974
+K o -1460
+K e -1460
+K y -974
+K w -974
+K O -974
+K G -974
+K C -974
+K Q -974
+o v -485
+o y -485
+o x -974
+h v -485
+h y -485
+n v -485
+n y -485
+m v -485
+m y -485
+r g -485
+g . -485
+g , -485
+p v -485
+p y -485
+p x -974
+c v -485
+c y -485
+v o -485
+v g -485
+v c -485
+v d -485
+v a -485
+v q -485
+e v -485
+e y -485
+b v -974
+b y -974
+b w -485
+s . -974
+s , -974
+y o -485
+y g -485
+y c -485
+y d -485
+y a -485
+y q -485
+f g -485
+x o -974
+x c -974
+x e -974
+x d -974
+x a -974
+x q -974
+a v -485
+a y -485
+w o -485
+w g -485
+w c -485
+w d -485
+w a -485
+w q -485
+T S -1460
+L a -974
+L S -1460
+G X -974
+G A -974
+P X -974
+P W -485
+C X -485
+C W -485
+C J -485
+V S -974
+S T -1460
+S V -974
+S Y -1460
+S X -974
+S A -974
+S W -485
+Y S -974
+X a -974
+X u -974
+X S -974
+A t -974
+A c -974
+A d -974
+A a -974
+A u -974
+A q -974
+A S -974
+W S -485
+K c -1460
+K u -974
+K S -974
+t . -485
+t , -485
+h . -485
+h , -485
+n . -485
+n , -485
+m . -485
+m , -485
+l . -485
+l , -485
+r o -485
+r c -485
+r e -485
+r d -485
+r a -485
+r q -485
+i . -485
+i , -485
+c x -974
+v e -485
+v s -485
+e x -974
+z . -485
+z , -485
+d . -485
+d , -485
+b f -485
+s v -485
+s y -485
+s x -485
+y e -485
+y s -485
+f o -485
+f c -485
+f e -485
+f d -485
+f s -485
+f a -485
+f q -485
+x s -485
+x . -485
+x , -485
+a . -485
+a , -485
+w e -485
+w s -485
+j . -485
+j , -485
+u . -485
+k o -974
+k c -974
+k e -974
+k d -974
+k a -974
+k q -974
+k . -485
+k , -485
+O J -1949
+H . -485
+H , -485
+N . -485
+N , -485
+M . -485
+M , -485
+L . -485
+L , -485
+R . -485
+R , -485
+I . -485
+I , -485
+E . -485
+E , -485
+Z o -1460
+Z e -1460
+Z d -1460
+Z s -485
+Z a -974
+Z . -485
+Z , -485
+D J -1949
+B J -974
+S J -1460
+X . -485
+X , -485
+A s -485
+A . -485
+A , -485
+J J -485
+U J -1949
+K a -974
+K . -485
+K , -485
+o z -974
+r s -485
+p z -974
+c z -974
+v f -485
+e z -974
+z o -974
+z c -974
+z e -974
+z d -974
+z s -485
+z a -974
+z q -974
+b t -485
+b g -485
+b z -1460
+b j -485
+s z -485
+y f -485
+w f -485
+k s -485
+G J -1460
+L cq -3413
+L ' -3413
+T hy -1460
+T - -1460
+T en -1460
+T em -1460
+A cq -1949
+A ' -1949
+hy T -1460
+- T -1460
+en T -1460
+em T -1460
+Y hy -974
+Y - -974
+Y en -974
+Y em -974
+p cq -1949
+p ' -1949
+c cq -974
+c ' -974
+e cq -1949
+e ' -1949
+b cq -1949
+b ' -1949
+a cq -1949
+a ' -1949
+V hy -974
+V - -974
+V en -974
+V em -974
+h cq -1949
+h ' -1949
+n cq -1949
+n ' -1949
+m cq -1949
+m ' -1949
+W hy -485
+W - -485
+W en -485
+W em -485
+cq d -1949
+' d -1949
+s cq -974
+s ' -974
+L hy -1949
+L - -1949
+L en -1949
+L em -1949
+X hy -974
+X - -974
+X en -974
+X em -974
+A hy -974
+A - -974
+A en -974
+A em -974
+K hy -974
+K - -974
+K en -974
+K em -974
+cq s -974
+' s -974
+hy X -974
+- X -974
+hy A -974
+- A -974
+en X -974
+en A -974
+em X -974
+b f -485
+charset
+! 7806,20160,405,1176,798,880 2 161057 -- MSL 1 (19U 33)
+dq 11709,19755,0,504,-2438,504 2 161058 -- MSL 2 (19U 34)
+" "
+sh 15612,20460,4296,0,-935 3 161059 -- MSL 3 (19U 35)
+# "
+Do 15612,22065,2295,1062,258,880 2 161060 -- MSL 4 (19U 36)
+$ "
+% 26346,20460,405,0,-1733 2 161061 -- MSL 5 (19U 37)
+& 17565,20160,405,414,381,414 2 161062 -- MSL 6 (19U 38)
+cq 7806,19755,0,744,-1850,744 2 161170 -- MSL 8 (19U 146)
+' "
+( 7806,19755,405,3360,-269,880 2 161064 -- MSL 9 (19U 40)
+) 7806,19755,405,618,2472,618 2 161065 -- MSL 10 (19U 41)
+* 15612,20160,0,0,-2879 2 161066 -- MSL 11 (19U 42)
++ 26346,15255,585,0,-3893 0 161067 -- MSL 12 (19U 43)
+, 7806,2910,4320,0,2160 1 161068 -- MSL 13 (19U 44)
+hy 7806,10230,0,654,468,654 0 161069 -- MSL 14 (19U 45)
+- "
+. 7806,2925,405,0,684 0 161070 -- MSL 15 (19U 46)
+sl 7806,20820,405,4203,3111,880 2 161071 -- MSL 16 (19U 47)
+/ "
+0 15612,20460,405,1371,450,880 2 161072 -- MSL 17 (19U 48)
+1 15612,20055,0,0,-878 2 161073 -- MSL 18 (19U 49)
+2 15612,20460,0,1173,1140,880 2 161074 -- MSL 19 (19U 50)
+3 15612,20055,405,1743,621,880 2 161075 -- MSL 20 (19U 51)
+4 15612,20055,0,1101,1074,880 2 161076 -- MSL 21 (19U 52)
+5 15612,20055,405,1530,453,880 2 161077 -- MSL 22 (19U 53)
+6 15612,20460,405,1863,-5,880 2 161078 -- MSL 23 (19U 54)
+7 15612,20055,0,2184,-212,880 2 161079 -- MSL 24 (19U 55)
+8 15612,20460,405,1362,708,880 2 161080 -- MSL 25 (19U 56)
+9 15612,20460,405,1032,828,880 2 161081 -- MSL 26 (19U 57)
+: 7806,13515,405,0,684 0 161082 -- MSL 27 (19U 58)
+; 7806,13515,4320,0,2160 1 161083 -- MSL 28 (19U 59)
+< 26346,16068,0,0,-3980 0 161084 -- MSL 29 (19U 60)
+= 26346,10800,0,0,-3920 0 161085 -- MSL 30 (19U 61)
+> 26346,16068,0,0,-3980 0 161086 -- MSL 31 (19U 62)
+? 14148,20160,405,1497,-1322,880 2 161087 -- MSL 32 (19U 63)
+at 26346,21030,2745,0,-1082 2 161088 -- MSL 33 (19U 64)
+@ "
+A 18051,19755,0,0,2478 2 161089 -- MSL 34 (19U 65)
+B 16587,19755,0,1230,765,880 2 161090 -- MSL 35 (19U 66)
+C 16101,20160,405,1941,-35,880 2 161091 -- MSL 36 (19U 67)
+D 19029,19755,0,516,657,516 2 161092 -- MSL 37 (19U 68)
+E 15612,19755,0,1971,858,880 2 161093 -- MSL 38 (19U 69)
+F 15126,19755,0,2244,807,880 2 161094 -- MSL 39 (19U 70)
+G 18051,20160,405,1218,-143,880 2 161095 -- MSL 40 (19U 71)
+H 19515,19755,0,1179,558,880 2 161096 -- MSL 41 (19U 72)
+I 6831,19755,0,1557,909,880 2 161097 -- MSL 42 (19U 73)
+J 12198,19755,405,1518,2154,880 2 161098 -- MSL 43 (19U 74)
+K 16101,19755,0,3612,717,880 2 161099 -- MSL 44 (19U 75)
+L 12684,19755,0,0,783 2 161100 -- MSL 45 (19U 76)
+M 22932,19755,0,1287,729,880 2 161101 -- MSL 46 (19U 77)
+N 19515,19755,0,1344,735,880 2 161102 -- MSL 47 (19U 78)
+O 19029,20160,405,732,-38,732 2 161103 -- MSL 48 (19U 79)
+P 16587,19755,0,1425,699,880 2 161104 -- MSL 49 (19U 80)
+Q 19029,20160,993,849,-242,849 2 161105 -- MSL 50 (19U 81)
+R 16101,19755,0,1494,744,880 2 161106 -- MSL 51 (19U 82)
+S 14637,20160,405,1374,888,880 2 161107 -- MSL 52 (19U 83)
+T 14637,19755,0,3165,-824,880 2 161108 -- MSL 53 (19U 84)
+U 18540,19755,405,1449,-452,880 2 161109 -- MSL 54 (19U 85)
+V 17076,19755,0,2931,-1406,880 2 161110 -- MSL 55 (19U 86)
+W 25371,19755,0,3333,-1340,880 2 161111 -- MSL 56 (19U 87)
+X 16587,19755,0,3177,2418,880 2 161112 -- MSL 57 (19U 88)
+Y 16587,19755,0,3216,-1295,880 2 161113 -- MSL 58 (19U 89)
+Z 16101,19755,0,2199,1347,880 2 161114 -- MSL 59 (19U 90)
+lB 7806,19755,405,2646,699,880 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 7806,20820,405,0,-1670 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 7806,19755,405,1341,2004,880 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758,0,36,36,36 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588,1317,1317,880 1 161119 -- MSL 64 (19U 95)
+oq 7806,19755,0,1062,-2168,880 2 161169 -- MSL 66 (19U 145)
+` "
+a 16101,17160,405,0,621 0 161121 -- MSL 67 (19U 97)
+b 18051,20820,405,0,735 2 161122 -- MSL 68 (19U 98)
+c 15126,17160,405,1257,114,880 0 161123 -- MSL 69 (19U 99)
+d 18051,20820,405,1623,207,880 2 161124 -- MSL 70 (19U 100)
+e 16587,17160,405,546,-5,546 0 161125 -- MSL 71 (19U 101)
+f 11220,20820,0,3024,114,880 2 161126 -- MSL 72 (19U 102)
+g 18051,17160,3930,654,102,654 1 161127 -- MSL 73 (19U 103)
+h 18051,20820,0,0,573 2 161128 -- MSL 74 (19U 104)
+i 6831,21105,0,2052,918,880 2 161129 -- MSL 75 (19U 105)
+j 7317,21105,3930,1986,4662,880 3 161130 -- MSL 76 (19U 106)
+k 14637,20820,0,2835,738,880 2 161131 -- MSL 77 (19U 107)
+l 6831,20820,0,1794,891,880 2 161132 -- MSL 78 (19U 108)
+m 26835,17160,0,0,735 0 161133 -- MSL 79 (19U 109)
+n 18051,17160,0,0,567 0 161134 -- MSL 80 (19U 110)
+o 17565,17160,405,90,-29,90 0 161135 -- MSL 81 (19U 111)
+p 18051,17160,3930,51,1440,51 1 161136 -- MSL 82 (19U 112)
+q 18051,17160,3930,855,216,855 1 161137 -- MSL 83 (19U 113)
+r 11220,17160,0,2286,816,880 0 161138 -- MSL 84 (19U 114)
+s 12684,17160,405,1206,1044,880 0 161139 -- MSL 85 (19U 115)
+t 12198,20985,405,2229,-524,880 2 161140 -- MSL 86 (19U 116)
+u 18051,16755,405,603,-236,603 0 161141 -- MSL 87 (19U 117)
+v 16101,16755,0,1950,-617,880 0 161142 -- MSL 88 (19U 118)
+w 24396,16755,0,1749,-734,880 0 161143 -- MSL 89 (19U 119)
+x 15126,16755,0,2667,2142,880 0 161144 -- MSL 90 (19U 120)
+y 15612,16755,3930,2085,-377,880 1 161145 -- MSL 91 (19U 121)
+z 13662,16755,0,1953,1530,880 0 161146 -- MSL 92 (19U 122)
+{ 11709,20130,6075,2580,-1004,880 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588,0,-4595 3 161148 -- MSL 94 (19U 124)
+ba "
+} 11709,20130,6075,0,3153 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,8952,0,0,-4028 0 161150 -- MSL 96 (19U 126)
+`A 18051,25005,0,0,2478 2 161216 -- MSL 99 (19U 192)
+^A 18051,25005,0,0,2478 2 161218 -- MSL 100 (19U 194)
+`E 15612,25005,0,1971,858,880 2 161224 -- MSL 101 (19U 200)
+^E 15612,25005,0,1971,858,880 2 161226 -- MSL 102 (19U 202)
+:E 15612,24645,0,1971,858,880 2 161227 -- MSL 103 (19U 203)
+^I 6831,25005,0,4425,909,880 2 161230 -- MSL 104 (19U 206)
+:I 6831,24645,0,4878,909,880 2 161231 -- MSL 105 (19U 207)
+aa 15612,22080,0,2073,-6260,880 2 161204 -- MSL 106 (19U 180)
+ga 15612,22080,0,0,-3053 2 161120 -- MSL 107 (19U 96)
+a^ 15612,22080,0,0,-4679 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 15612,21795,0,0,-4673 2 161192 -- MSL 109 (19U 168)
+~ 15612,21819,0,1443,-2549,880 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 18540,25005,405,1449,-452,880 2 161241 -- MSL 111 (19U 217)
+^U 18540,25005,405,1449,-452,880 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105,0,1317,1317,880 2 161199 -- MSL 113 (19U 175)
+'Y 16587,25005,0,3216,-1295,880 2 161245 -- MSL 114 (19U 221)
+'y 15612,22080,3930,2085,-377,880 3 161277 -- MSL 115 (19U 253)
+de 15612,20460,0,0,-2747 2 161200 -- MSL 116 (19U 176)
+,C 16101,20160,6285,1941,-35,880 3 161223 -- MSL 117 (19U 199)
+,c 15126,17160,6285,1257,114,880 1 161255 -- MSL 118 (19U 231)
+~N 19515,24744,0,1344,735,880 2 161233 -- MSL 119 (19U 209)
+~n 18051,21819,0,222,567,222 2 161265 -- MSL 120 (19U 241)
+r! 7806,17157,3408,714,1260,714 0 161185 -- MSL 121 (19U 161)
+r? 14148,17175,3390,0,1623 0 161215 -- MSL 122 (19U 191)
+Cs 15612,15684,0,96,-527,96 0 161188 -- MSL 123 (19U 164)
+Po 15612,20460,0,2118,1011,880 2 161187 -- MSL 124 (19U 163)
+Ye 15612,20055,0,3255,-998,880 2 161189 -- MSL 125 (19U 165)
+sc 15612,20160,4095,0,-1919 3 161191 -- MSL 126 (19U 167)
+Fn 15612,20820,0,1578,-2126,880 2 161155 -- MSL 127 (19U 131)
+ct 15612,20547,498,1389,-539,880 2 161186 -- MSL 128 (19U 162)
+^a 16101,22080,405,0,621 2 161250 -- MSL 129 (19U 226)
+^e 16587,22080,405,546,-5,546 2 161258 -- MSL 130 (19U 234)
+^o 17565,22080,405,90,-29,90 2 161268 -- MSL 131 (19U 244)
+^u 18051,22080,405,603,-236,603 2 161275 -- MSL 132 (19U 251)
+'a 16101,22080,405,1827,621,880 2 161249 -- MSL 133 (19U 225)
+'e 16587,22080,405,1584,-5,880 2 161257 -- MSL 134 (19U 233)
+'o 17565,22080,405,1095,-29,880 2 161267 -- MSL 135 (19U 243)
+'u 18051,22080,405,852,-236,852 2 161274 -- MSL 136 (19U 250)
+`a 16101,22080,405,0,621 2 161248 -- MSL 137 (19U 224)
+`e 16587,22080,405,546,-5,546 2 161256 -- MSL 138 (19U 232)
+`o 17565,22080,405,90,-29,90 2 161266 -- MSL 139 (19U 242)
+`u 18051,22080,405,603,-236,603 2 161273 -- MSL 140 (19U 249)
+:a 16101,21795,405,0,621 2 161252 -- MSL 141 (19U 228)
+:e 16587,21795,405,546,-5,546 2 161259 -- MSL 142 (19U 235)
+:o 17565,21795,405,90,-29,90 2 161270 -- MSL 143 (19U 246)
+:u 18051,21795,405,603,-236,603 2 161276 -- MSL 144 (19U 252)
+oA 18051,26850,0,0,2478 2 161221 -- MSL 145 (19U 197)
+^i 6831,22080,0,3831,921,880 2 161262 -- MSL 146 (19U 238)
+/O 19029,20205,450,2472,1920,880 2 161240 -- MSL 147 (19U 216)
+AE 28299,19755,0,2715,2868,880 2 161222 -- MSL 148 (19U 198)
+oa 16101,24390,405,0,621 2 161253 -- MSL 149 (19U 229)
+'i 6831,22080,0,6462,921,880 2 161261 -- MSL 150 (19U 237)
+/o 17565,17232,474,1710,1614,880 0 161272 -- MSL 151 (19U 248)
+ae 25857,17160,405,591,780,591 0 161254 -- MSL 152 (19U 230)
+:A 18051,24645,0,0,2478 2 161220 -- MSL 153 (19U 196)
+`i 6831,22080,0,1335,1338,880 2 161260 -- MSL 154 (19U 236)
+:O 19029,24645,405,732,-38,732 2 161238 -- MSL 155 (19U 214)
+:U 18540,24645,405,1449,-452,880 2 161244 -- MSL 156 (19U 220)
+'E 15612,25005,0,2739,858,880 2 161225 -- MSL 157 (19U 201)
+:i 6831,21795,0,4275,921,880 2 161263 -- MSL 158 (19U 239)
+ss 16101,20820,405,57,780,57 2 161247 -- MSL 159 (19U 223)
+^O 19029,25005,405,732,-38,732 2 161236 -- MSL 160 (19U 212)
+'A 18051,25005,0,1518,2478,880 2 161217 -- MSL 161 (19U 193)
+~A 18051,24744,0,1263,2478,880 2 161219 -- MSL 162 (19U 195)
+~a 16101,21819,405,1197,621,880 2 161251 -- MSL 163 (19U 227)
+-D 19029,19755,0,516,690,516 2 161232 -- MSL 164 (19U 208)
+Sd 17565,21426,405,66,-35,66 2 161264 -- MSL 165 (19U 240)
+'I 6831,25005,0,7128,909,880 2 161229 -- MSL 166 (19U 205)
+`I 6831,25005,0,2073,909,880 2 161228 -- MSL 167 (19U 204)
+'O 19029,25005,405,1029,-38,880 2 161235 -- MSL 168 (19U 211)
+`O 19029,25005,405,732,-38,732 2 161234 -- MSL 169 (19U 210)
+~O 19029,24744,405,774,-38,774 2 161237 -- MSL 170 (19U 213)
+~o 17565,21819,405,465,-29,465 2 161269 -- MSL 171 (19U 245)
+vS 14637,25005,405,1374,888,880 2 161162 -- MSL 172 (19U 138)
+vs 12684,22080,405,1596,1044,880 2 161178 -- MSL 173 (19U 154)
+'U 18540,25005,405,1449,-452,880 2 161242 -- MSL 174 (19U 218)
+:Y 16587,24645,0,3216,-1295,880 2 161183 -- MSL 175 (19U 159)
+:y 15612,21795,3930,2085,-377,880 3 161279 -- MSL 176 (19U 255)
+TP 16587,19755,0,675,753,675 2 161246 -- MSL 177 (19U 222)
+Tp 18051,20820,3930,51,1440,51 3 161278 -- MSL 178 (19U 254)
+mc 14637,12630,4350,1122,2931,880 1 161205 -- MSL 180 (19U 181)
+ps 15612,19635,4200,0,-1343 3 161206 -- MSL 181 (19U 182)
+34 26346,20610,555,0,-1805 2 161214 -- MSL 182 (19U 190)
+\- 26346,8295,0,0,-3890 0 60096 -- MSL 183 ( 7J 192)
+14 26346,20610,555,0,-1754 2 161212 -- MSL 184 (19U 188)
+12 26346,20610,555,0,-1997 2 161213 -- MSL 185 (19U 189)
+Of 15612,20460,0,0,-2657 2 161194 -- MSL 186 (19U 170)
+Om 15612,20460,0,0,-2450 2 161210 -- MSL 187 (19U 186)
+Fo 13662,14145,0,2082,-44,880 0 161195 -- MSL 188 (19U 171)
+Fc 13662,14145,0,267,1770,267 0 161211 -- MSL 190 (19U 187)
+t+- 26346,15255,3900,0,-3905 1 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916,0,-4595 3 161190 -- MSL 192 (19U 166)
+co 13173,19635,0,3903,-2111,880 2 161193 -- MSL 193 (19U 169)
+tno 26346,11679,0,0,-3983 0 161196 -- MSL 194 (19U 172)
+u00AD 7806,10230,0,654,468,654 0 161197 -- MSL 195 (19U 173)
+rg 13173,19635,0,3903,-2111,880 2 161198 -- MSL 196 (19U 174)
+S2 10245,20385,0,2097,-224,880 2 161202 -- MSL 197 (19U 178)
+S3 10245,20055,0,2064,-185,880 2 161203 -- MSL 198 (19U 179)
+ac 15612,375,6285,0,-2348 1 161208 -- MSL 199 (19U 184)
+S1 10245,20055,0,0,-494 2 161209 -- MSL 200 (19U 185)
+tmu 26346,15189,579,0,-3956 0 161239 -- MSL 201 (19U 215)
+tdi 26346,12780,0,0,-3893 0 161271 -- MSL 202 (19U 247)
+u203C 14148,20160,405,1176,798,880 2 87315 -- MSL 221 (10U 19)
+u20A7 28785,20985,405,1929,999,880 2 60121 -- MSL 232 ( 7J 217)
+pc 7806,11760,0,0,-1130 0 161207 -- MSL 302 (19U 183)
+u013F 12684,19755,0,372,783,372 2 51943 -- MSL 306 ( 6J 231)
+u0140 8295,20820,0,2676,891,880 2 51959 -- MSL 307 ( 6J 247)
+u2113 15612,18150,297,0,-1958 0 60122 -- MSL 308 ( 7J 218)
+u0149 21468,19755,0,0,99 2 51951 -- MSL 309 ( 6J 239)
+fm 7806,20055,0,1680,-2321,880 2 60101 -- MSL 310 ( 7J 197)
+sd 15612,20055,0,0,-2321 2 60102 -- MSL 311 ( 7J 198)
+dg 15612,20160,4095,0,-1631 3 161158 -- MSL 312 (19U 134)
+tm 16101,17850,0,1443,-1979,880 0 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588,1317,1317,880 1 60095 -- MSL 314 ( 7J 191)
+ah 15612,22080,0,132,-5369,132 2 75169 -- MSL 315 ( 9E 161)
+ao 15612,24390,0,0,-6086 2 60152 -- MSL 316 ( 7J 248)
+f/ 4392,20610,555,7662,7350,880 2 60109 -- MSL 324 ( 7J 205)
+em 26346,9840,0,462,330,462 0 161175 -- MSL 325 (19U 151)
+en 15612,9840,0,528,336,528 0 161174 -- MSL 326 (19U 150)
+dd 15612,20160,4095,0,-1610 3 161159 -- MSL 327 (19U 135)
+.i 6831,16755,0,975,921,880 0 46333 -- MSL 328 ( 5T 253)
+aq 7806,19755,0,672,-2603,672 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226,0,0,-497 0 161173 -- MSL 331 (19U 149)
+u207F 11220,20385,0,1926,150,880 2 87548 -- MSL 332 (10U 252)
+u0111 18051,20820,405,2829,210,880 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 18051,25155,0,0,2478 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 16101,22230,405,0,621 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 18051,19755,3990,0,2478 3 75173 -- MSL 404 ( 9E 165)
+u0061_0328 16101,17160,3990,0,621 1 75193 -- MSL 405 ( 9E 185)
+'C 16101,25005,405,2718,-35,880 2 75206 -- MSL 406 ( 9E 198)
+'c 15126,22080,405,2466,114,880 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 16101,25005,405,1941,-35,880 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 15126,22080,405,1257,114,880 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 19029,25005,0,516,657,516 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 19515,22290,405,4779,207,880 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 15612,25005,0,1971,858,880 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 16587,22080,405,546,-5,546 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 15612,19755,3990,1971,858,880 3 75210 -- MSL 422 ( 9E 202)
+u0065_0328 16587,17160,3990,546,-5,546 1 75242 -- MSL 423 ( 9E 234)
+u004C_0301 12684,25005,0,2403,783,880 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 6831,25605,0,7578,891,880 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 12684,19755,0,1110,783,880 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 8781,22290,0,4533,891,880 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 19515,25005,0,1344,735,880 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 18051,22080,0,492,567,492 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 19515,25005,0,1344,735,880 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 18051,22080,0,0,567 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 19029,25005,405,3225,-38,880 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 17565,22080,405,3765,-29,880 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 16101,25005,0,2493,744,880 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 11220,22080,0,4269,816,880 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 16101,25005,0,1494,744,880 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 11220,22080,0,2328,816,880 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 14637,25005,405,2625,888,880 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 12684,22080,405,3777,1044,880 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 14637,25005,0,3165,-824,880 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 12198,22290,405,2766,-524,880 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 14637,19755,6285,3165,-659,880 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 12198,20985,6285,2229,-524,880 3 75262 -- MSL 469 ( 9E 254)
+u0055_030B 18540,25005,405,3681,-452,880 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 18051,22080,405,3282,-236,880 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 18540,26850,405,1449,-452,880 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 18051,24390,405,603,-236,603 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 16101,25005,0,2493,1347,880 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 13662,22080,0,3048,1530,880 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 16101,24645,0,2199,1347,880 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 13662,21795,0,1953,1530,880 2 75199 -- MSL 485 ( 9E 191)
+u2070 10245,20385,0,2103,-449,880 2 51753 -- MSL 1000 ( 6J 41)
+u2074 10245,20055,0,1593,-8,880 2 51748 -- MSL 1001 ( 6J 36)
+u2075 10245,20055,0,1968,-410,880 2 51749 -- MSL 1002 ( 6J 37)
+u2076 10245,20385,0,2112,-779,880 2 51806 -- MSL 1003 ( 6J 94)
+u2077 10245,20055,0,2397,-977,880 2 51750 -- MSL 1004 ( 6J 38)
+u2078 10245,20385,0,2109,-389,880 2 51754 -- MSL 1005 ( 6J 42)
+u2079 10245,20385,0,1788,-527,880 2 51752 -- MSL 1006 ( 6J 40)
+lq 11709,19755,0,1344,-2423,880 2 161171 -- MSL 1017 (19U 147)
+rq 11709,19755,0,756,-1835,756 2 161172 -- MSL 1018 (19U 148)
+Bq 11709,2970,3315,0,1494 0 161156 -- MSL 1019 (19U 132)
+u2003 26346,0,0,0,1317 0 51821 -- MSL 1020 ( 6J 109)
+u2002 15612,0,0,0,1317 0 51822 -- MSL 1021 ( 6J 110)
+u2009 7806,0,0,0,1317 0 51828 -- MSL 1023 ( 6J 116)
+u2026 26346,2865,0,0,-347 0 161157 -- MSL 1028 (19U 133)
+vz 13662,22080,0,1953,1530,880 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,18000,0,2628,-1994,880 0 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056,87,-788,87 1 51794 -- MSL 1036 ( 6J 82)
+fi 17076,21105,0,2268,-152,880 2 60077 -- MSL 1040 ( 7J 173)
+fl 17076,20820,0,1668,57,880 2 60078 -- MSL 1041 ( 7J 174)
+ff 20490,20820,0,3111,42,880 2 51883 -- MSL 1042 ( 6J 171)
+Fi 26346,21105,0,2331,-200,880 2 51884 -- MSL 1043 ( 6J 172)
+Fl 26346,20820,0,1692,48,880 2 51885 -- MSL 1044 ( 6J 173)
+ij 13173,21105,3930,1986,918,880 3 60134 -- MSL 1047 ( 7J 230)
+u2105 26346,20610,330,690,-20,690 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 18051,25155,405,1218,-143,880 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 18051,22230,3930,654,102,654 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 14637,20160,6285,1374,888,880 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 12684,17160,6285,1206,1044,880 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 6831,24645,0,2232,909,880 2 46301 -- MSL 1065 ( 5T 221)
+bq 7806,2970,3315,0,1089 0 161154 -- MSL 1067 (19U 130)
+%0 34152,20460,405,684,-158,684 2 161161 -- MSL 1068 (19U 137)
+a- 15612,21210,0,0,-5264 2 60154 -- MSL 1084 ( 7J 250)
+ab 15612,22230,0,0,-5237 2 75170 -- MSL 1086 ( 9E 162)
+a. 15612,21795,0,0,-7031 2 75263 -- MSL 1088 ( 9E 255)
+oe 28299,17160,405,768,270,768 0 161180 -- MSL 1090 (19U 156)
+OE 25857,20160,405,2463,-26,880 2 161164 -- MSL 1091 (19U 140)
+fo 8781,14145,0,1689,279,880 0 161163 -- MSL 1092 (19U 139)
+fc 8781,14145,0,324,1644,324 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624,0,0,-2021 0 60091 -- MSL 1094 ( 7J 187)
+/L 13173,19755,0,21,1839,21 2 75171 -- MSL 1095 ( 9E 163)
+/l 7806,20820,0,3030,2109,880 2 75187 -- MSL 1096 ( 9E 179)
+a" 15612,22080,0,4503,-3530,880 2 75197 -- MSL 1097 ( 9E 189)
+ho 15612,765,3990,0,-6563 1 75186 -- MSL 1098 ( 9E 178)
+vZ 16101,25005,0,2199,1347,880 2 75150 -- MSL 1106 ( 9E 142)
+IJ 18540,19755,405,1518,909,880 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/AOR b/font/devlj4/AOR
new file mode 100644
index 0000000..6c70215
--- /dev/null
+++ b/font/devlj4/AOR
@@ -0,0 +1,708 @@
+# AntiqueOlv
+name AOR
+spacewidth 7806
+pcltypeface 4168
+pclproportional 1
+pclweight 0
+pclstyle 0
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -2438
+P . -4877
+P , -4877
+V A -2438
+A V -1949
+T o -2438
+T r -974
+T c -2438
+T e -2438
+T d -2924
+T s -1949
+T y -974
+T a -1949
+T w -974
+T u -974
+T J -2438
+L T -2438
+L Y -3413
+Y o -2924
+Y e -2924
+Y a -1949
+Y J -2924
+A W -1949
+W A -1949
+T A -2438
+V o -974
+V e -974
+V a -974
+Y A -3413
+F A -1949
+F . -3902
+F , -3902
+A T -2438
+A Y -3413
+v . -2924
+v , -2924
+y . -2924
+y , -2924
+T . -2924
+T , -2924
+L W -1949
+P A -1460
+V J -2438
+V . -2924
+V , -2924
+Y . -3902
+Y , -3902
+W o -974
+W e -974
+W a -974
+W . -2438
+W , -2438
+r . -3902
+r , -3902
+w . -2438
+w , -2438
+Y u -974
+A v -1460
+A y -1949
+A w -1460
+o . -2438
+o , -2438
+p . -2438
+p , -2438
+e . -1949
+e , -1949
+b . -2438
+b , -2438
+O T -974
+O Y -974
+O . -2438
+O , -2438
+L y -2438
+L O -1460
+L G -1460
+L C -1460
+L Q -1460
+P J -2924
+D T -974
+D Y -974
+D . -1949
+D , -1949
+Y O -974
+Y G -974
+Y C -974
+Y Q -974
+F o -485
+F e -485
+F a -485
+c . -1460
+c , -1460
+O A -1460
+L U -1460
+R T -485
+R Y -485
+G T -485
+C A -974
+C . -1460
+C , -1460
+D A -1460
+B T -974
+B Y -974
+B . -1460
+B , -1460
+F J -2924
+A O -974
+A G -974
+A C -974
+A U -974
+A Q -974
+W J -1949
+J A -1460
+J . -1949
+J , -1949
+U A -1460
+U . -1949
+U , -1949
+f . -2924
+f , -2924
+T O -974
+T G -974
+T C -974
+T Q -974
+L o -1460
+L e -1460
+L q -1460
+G Y -485
+G . -1460
+G , -1460
+P T -974
+P Y -974
+C T -485
+C Y -485
+B A -974
+S . -1460
+S , -1460
+X o -1949
+X e -1949
+A o -974
+A e -974
+K o -974
+K e -974
+K y -974
+K w -974
+K O -974
+K G -974
+K C -974
+K Q -974
+o v -485
+o y -974
+o x -485
+o w -485
+h v -485
+h y -974
+n v -485
+n y -974
+m v -485
+m y -974
+r g -485
+g . -485
+g , -485
+p v -485
+p y -974
+p x -485
+c v -485
+c y -974
+c w -485
+v o -485
+v g -485
+v c -485
+v d -974
+v a -485
+v q -485
+e v -485
+e y -974
+b v -1460
+b y -1949
+b w -1460
+s . -1460
+s , -1460
+y o -485
+y g -485
+y c -485
+y d -974
+y a -485
+y q -485
+x o -485
+x g -485
+x c -485
+x e -485
+x d -974
+x a -485
+x q -485
+a v -485
+a y -974
+a w -485
+w o -485
+w g -485
+w c -485
+w d -974
+w a -485
+w q -485
+T S -974
+L a -485
+L S -974
+R o -1949
+G A -974
+C J -974
+S T -974
+S Y -974
+S A -974
+Y S -974
+X a -485
+A t -485
+A g -974
+A c -974
+A d -1460
+A a -485
+A u -974
+A q -974
+A S -974
+K c -974
+K u -974
+K S -974
+t . -485
+t , -485
+h w -485
+h . -485
+h , -485
+n w -485
+n . -485
+n , -485
+m w -485
+m . -485
+m , -485
+l . -485
+l , -485
+r o -485
+r c -485
+r e -485
+r d -974
+r a -485
+r q -485
+i . -485
+i , -485
+p w -485
+c x -485
+v e -485
+v s -485
+e x -485
+e w -485
+z . -485
+z , -485
+d . -485
+d , -485
+b f -974
+y e -485
+y s -485
+f d -485
+x . -485
+x , -485
+a . -485
+a , -485
+w e -485
+w s -485
+j . -485
+j , -485
+u . -485
+k o -974
+k g -974
+k c -974
+k e -974
+k d -1460
+k a -485
+k q -974
+k . -485
+k , -485
+O J -1949
+H . -485
+H , -485
+N . -485
+N , -485
+M . -485
+M , -485
+L . -485
+L , -485
+R e -1949
+R a -485
+R . -485
+R , -485
+I . -485
+I , -485
+E d -485
+E . -485
+E , -485
+Z o -1949
+Z e -1949
+Z d -1949
+Z a -485
+Z . -485
+Z , -485
+D J -1460
+B J -974
+S J -974
+X . -485
+X , -485
+A . -485
+A , -485
+J J -1460
+U J -1460
+K a -485
+K . -485
+K , -485
+t d -485
+r s -485
+g d -485
+z d -485
+b t -974
+b g -974
+b z -974
+b j -974
+G J -974
+A f -485
+U d -485
+L cq -3902
+L ' -3902
+T hy -974
+T - -974
+T en -974
+T em -974
+A cq -2438
+A ' -2438
+hy T -974
+- T -974
+en T -974
+em T -974
+Y hy -974
+Y - -974
+Y en -974
+Y em -974
+p cq -1949
+p ' -1949
+c cq -974
+c ' -974
+e cq -1949
+e ' -1949
+b cq -1949
+b ' -1949
+a cq -1460
+a ' -1460
+h cq -1949
+h ' -1949
+n cq -1460
+n ' -1460
+m cq -1460
+m ' -1460
+cq d -1949
+' d -1949
+L hy -1460
+L - -1460
+L en -1460
+L em -1460
+A hy -974
+A - -974
+A en -974
+A em -974
+K hy -974
+K - -974
+K en -974
+K em -974
+cq s -974
+' s -974
+hy A -1460
+- A -1460
+en A -1460
+b f -974
+charset
+! 8295,20160,405 2 161057 -- MSL 1 (19U 33)
+dq 11220,19755 2 161058 -- MSL 2 (19U 34)
+" "
+sh 15612,20460,4296 3 161059 -- MSL 3 (19U 35)
+# "
+Do 15612,21960,2265 2 161060 -- MSL 4 (19U 36)
+$ "
+% 26835,20460,405 2 161061 -- MSL 5 (19U 37)
+& 19029,20160,405 2 161062 -- MSL 6 (19U 38)
+cq 6831,19755 2 161170 -- MSL 8 (19U 146)
+' "
+( 7806,19755,405 2 161064 -- MSL 9 (19U 40)
+) 7806,19755,405 2 161065 -- MSL 10 (19U 41)
+* 15612,20160 2 161066 -- MSL 11 (19U 42)
++ 26835,15255,585 0 161067 -- MSL 12 (19U 43)
+, 7806,2910,4320 1 161068 -- MSL 13 (19U 44)
+hy 7806,10200 0 161069 -- MSL 14 (19U 45)
+- "
+. 7806,2925,405 0 161070 -- MSL 15 (19U 46)
+sl 8295,20820,405 2 161071 -- MSL 16 (19U 47)
+/ "
+0 15612,20460,405 2 161072 -- MSL 17 (19U 48)
+1 15612,20055 2 161073 -- MSL 18 (19U 49)
+2 15612,20460 2 161074 -- MSL 19 (19U 50)
+3 15612,20055,405 2 161075 -- MSL 20 (19U 51)
+4 15612,20055 2 161076 -- MSL 21 (19U 52)
+5 15612,20055,405 2 161077 -- MSL 22 (19U 53)
+6 15612,20460,405 2 161078 -- MSL 23 (19U 54)
+7 15612,20055 2 161079 -- MSL 24 (19U 55)
+8 15612,20460,405 2 161080 -- MSL 25 (19U 56)
+9 15612,20460,405 2 161081 -- MSL 26 (19U 57)
+: 7806,13647,405 0 161082 -- MSL 27 (19U 58)
+; 7806,13647,4320 1 161083 -- MSL 28 (19U 59)
+< 26346,16068 0 161084 -- MSL 29 (19U 60)
+= 26835,10800 0 161085 -- MSL 30 (19U 61)
+> 26346,16068 0 161086 -- MSL 31 (19U 62)
+? 15126,20160,405 2 161087 -- MSL 32 (19U 63)
+at 26835,21030,2745 2 161088 -- MSL 33 (19U 64)
+@ "
+A 18540,19755 2 161089 -- MSL 34 (19U 65)
+B 17565,19755 2 161090 -- MSL 35 (19U 66)
+C 16101,20160,405 2 161091 -- MSL 36 (19U 67)
+D 18540,19755 2 161092 -- MSL 37 (19U 68)
+E 15612,19755 2 161093 -- MSL 38 (19U 69)
+F 15126,19755 2 161094 -- MSL 39 (19U 70)
+G 18051,20160,405 2 161095 -- MSL 40 (19U 71)
+H 19515,19755 2 161096 -- MSL 41 (19U 72)
+I 7317,19755 2 161097 -- MSL 42 (19U 73)
+J 12198,19755,405 2 161098 -- MSL 43 (19U 74)
+K 16587,19755 2 161099 -- MSL 44 (19U 75)
+L 13662,19755 2 161100 -- MSL 45 (19U 76)
+M 23418,19755 2 161101 -- MSL 46 (19U 77)
+N 19515,19755 2 161102 -- MSL 47 (19U 78)
+O 19029,20160,405 2 161103 -- MSL 48 (19U 79)
+P 16587,19755 2 161104 -- MSL 49 (19U 80)
+Q 19029,20160,636 2 161105 -- MSL 50 (19U 81)
+R 16587,19755 2 161106 -- MSL 51 (19U 82)
+S 14148,20160,405 2 161107 -- MSL 52 (19U 83)
+T 15126,19755 2 161108 -- MSL 53 (19U 84)
+U 19029,19755,405 2 161109 -- MSL 54 (19U 85)
+V 16587,19755 2 161110 -- MSL 55 (19U 86)
+W 25857,19755 2 161111 -- MSL 56 (19U 87)
+X 16587,19755 2 161112 -- MSL 57 (19U 88)
+Y 16587,19755 2 161113 -- MSL 58 (19U 89)
+Z 16101,19755 2 161114 -- MSL 59 (19U 90)
+lB 7806,19755,405 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 8295,20820,405 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 7806,19755,405 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588 1 161119 -- MSL 64 (19U 95)
+oq 6831,19755 2 161169 -- MSL 66 (19U 145)
+` "
+a 15126,17160,405 0 161121 -- MSL 67 (19U 97)
+b 18540,20820,405 2 161122 -- MSL 68 (19U 98)
+c 14637,17160,405 0 161123 -- MSL 69 (19U 99)
+d 18540,20820,405 2 161124 -- MSL 70 (19U 100)
+e 16587,17160,405 0 161125 -- MSL 71 (19U 101)
+f 11709,20820 2 161126 -- MSL 72 (19U 102)
+g 17565,17160,3930 1 161127 -- MSL 73 (19U 103)
+h 18051,20820 2 161128 -- MSL 74 (19U 104)
+i 7806,21105 2 161129 -- MSL 75 (19U 105)
+j 7806,21105,3930 3 161130 -- MSL 76 (19U 106)
+k 15126,20820 2 161131 -- MSL 77 (19U 107)
+l 7317,20820 2 161132 -- MSL 78 (19U 108)
+m 27321,17160 0 161133 -- MSL 79 (19U 109)
+n 18051,17160 0 161134 -- MSL 80 (19U 110)
+o 18051,17160,405 0 161135 -- MSL 81 (19U 111)
+p 18540,17160,3930 1 161136 -- MSL 82 (19U 112)
+q 18540,17160,3930 1 161137 -- MSL 83 (19U 113)
+r 12198,17160 0 161138 -- MSL 84 (19U 114)
+s 12198,17160,405 0 161139 -- MSL 85 (19U 115)
+t 12198,20925,405 2 161140 -- MSL 86 (19U 116)
+u 17565,16755,405 0 161141 -- MSL 87 (19U 117)
+v 15612,16755 0 161142 -- MSL 88 (19U 118)
+w 23907,16755 0 161143 -- MSL 89 (19U 119)
+x 14637,16755 0 161144 -- MSL 90 (19U 120)
+y 15612,16755,3930 1 161145 -- MSL 91 (19U 121)
+z 13662,16755 0 161146 -- MSL 92 (19U 122)
+{ 11709,20130,6075 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588 3 161148 -- MSL 94 (19U 124)
+ba "
+} 11709,20130,6075 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,8952 0 161150 -- MSL 96 (19U 126)
+`A 18540,25005 2 161216 -- MSL 99 (19U 192)
+^A 18540,25005 2 161218 -- MSL 100 (19U 194)
+`E 15612,25005 2 161224 -- MSL 101 (19U 200)
+^E 15612,25005 2 161226 -- MSL 102 (19U 202)
+:E 15612,24690 2 161227 -- MSL 103 (19U 203)
+^I 7317,25005 2 161230 -- MSL 104 (19U 206)
+:I 7317,24690 2 161231 -- MSL 105 (19U 207)
+aa 15612,22080 2 161204 -- MSL 106 (19U 180)
+ga 15612,22080 2 161120 -- MSL 107 (19U 96)
+a^ 15612,22080 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 15612,21840 2 161192 -- MSL 109 (19U 168)
+~ 15612,21873 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 19029,25005,405 2 161241 -- MSL 111 (19U 217)
+^U 19029,25005,405 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105 2 161199 -- MSL 113 (19U 175)
+'Y 16587,25005 2 161245 -- MSL 114 (19U 221)
+'y 15612,22080,3930 3 161277 -- MSL 115 (19U 253)
+de 15612,20460 2 161200 -- MSL 116 (19U 176)
+,C 16101,20160,4896 3 161223 -- MSL 117 (19U 199)
+,c 14637,17160,4896 1 161255 -- MSL 118 (19U 231)
+~N 19515,24915 2 161233 -- MSL 119 (19U 209)
+~n 18051,21873 2 161265 -- MSL 120 (19U 241)
+r! 8295,17124,3441 0 161185 -- MSL 121 (19U 161)
+r? 15126,17124,3441 0 161215 -- MSL 122 (19U 191)
+Cs 15612,15684 0 161188 -- MSL 123 (19U 164)
+Po 15612,20460 2 161187 -- MSL 124 (19U 163)
+Ye 15612,20055 2 161189 -- MSL 125 (19U 165)
+sc 15612,20160,4095 3 161191 -- MSL 126 (19U 167)
+Fn 15612,20820 2 161155 -- MSL 127 (19U 131)
+ct 15612,20526,537 2 161186 -- MSL 128 (19U 162)
+^a 15126,22080,405 2 161250 -- MSL 129 (19U 226)
+^e 16587,22080,405 2 161258 -- MSL 130 (19U 234)
+^o 18051,22080,405 2 161268 -- MSL 131 (19U 244)
+^u 17565,22080,405 2 161275 -- MSL 132 (19U 251)
+'a 15126,22080,405 2 161249 -- MSL 133 (19U 225)
+'e 16587,22080,405 2 161257 -- MSL 134 (19U 233)
+'o 18051,22080,405 2 161267 -- MSL 135 (19U 243)
+'u 17565,22080,405 2 161274 -- MSL 136 (19U 250)
+`a 15126,22080,405 2 161248 -- MSL 137 (19U 224)
+`e 16587,22080,405 2 161256 -- MSL 138 (19U 232)
+`o 18051,22080,405 2 161266 -- MSL 139 (19U 242)
+`u 17565,22080,405 2 161273 -- MSL 140 (19U 249)
+:a 15126,21840,405 2 161252 -- MSL 141 (19U 228)
+:e 16587,21840,405 2 161259 -- MSL 142 (19U 235)
+:o 18051,21840,405 2 161270 -- MSL 143 (19U 246)
+:u 17565,21840,405 2 161276 -- MSL 144 (19U 252)
+oA 18540,26850 2 161221 -- MSL 145 (19U 197)
+^i 7806,22080 2 161262 -- MSL 146 (19U 238)
+/O 19029,20187,501 2 161240 -- MSL 147 (19U 216)
+AE 30738,19755 2 161222 -- MSL 148 (19U 198)
+oa 15126,24390,405 2 161253 -- MSL 149 (19U 229)
+'i 7806,22080 2 161261 -- MSL 150 (19U 237)
+/o 18051,17163,432 0 161272 -- MSL 151 (19U 248)
+ae 26346,17160,405 0 161254 -- MSL 152 (19U 230)
+:A 18540,24690 2 161220 -- MSL 153 (19U 196)
+`i 7806,22080 2 161260 -- MSL 154 (19U 236)
+:O 19029,24690,405 2 161238 -- MSL 155 (19U 214)
+:U 19029,24690,405 2 161244 -- MSL 156 (19U 220)
+'E 15612,25005 2 161225 -- MSL 157 (19U 201)
+:i 7806,21840 2 161263 -- MSL 158 (19U 239)
+ss 16587,20820,405 2 161247 -- MSL 159 (19U 223)
+^O 19029,25005,405 2 161236 -- MSL 160 (19U 212)
+'A 18540,25005 2 161217 -- MSL 161 (19U 193)
+~A 18540,24915 2 161219 -- MSL 162 (19U 195)
+~a 15126,21873,405 2 161251 -- MSL 163 (19U 227)
+-D 18540,19755 2 161232 -- MSL 164 (19U 208)
+Sd 18051,22695,405 2 161264 -- MSL 165 (19U 240)
+'I 7317,25005 2 161229 -- MSL 166 (19U 205)
+`I 7317,25005 2 161228 -- MSL 167 (19U 204)
+'O 19029,25005,405 2 161235 -- MSL 168 (19U 211)
+`O 19029,25005,405 2 161234 -- MSL 169 (19U 210)
+~O 19029,24915,405 2 161237 -- MSL 170 (19U 213)
+~o 18051,21873,405 2 161269 -- MSL 171 (19U 245)
+vS 14148,25005,405 2 161162 -- MSL 172 (19U 138)
+vs 12198,22080,405 2 161178 -- MSL 173 (19U 154)
+'U 19029,25005,405 2 161242 -- MSL 174 (19U 218)
+:Y 16587,24690 2 161183 -- MSL 175 (19U 159)
+:y 15612,21840,3930 3 161279 -- MSL 176 (19U 255)
+TP 16587,19755 2 161246 -- MSL 177 (19U 222)
+Tp 18540,20820,3930 3 161278 -- MSL 178 (19U 254)
+mc 14637,12630,4350 1 161205 -- MSL 180 (19U 181)
+ps 15612,19635,4200 3 161206 -- MSL 181 (19U 182)
+34 26835,20610,555 2 161214 -- MSL 182 (19U 190)
+\- 26835,8295 0 60096 -- MSL 183 ( 7J 192)
+14 26835,20610,555 2 161212 -- MSL 184 (19U 188)
+12 26835,20610,555 2 161213 -- MSL 185 (19U 189)
+Of 15612,20460 2 161194 -- MSL 186 (19U 170)
+Om 15612,20460 2 161210 -- MSL 187 (19U 186)
+Fo 14148,13950 0 161195 -- MSL 188 (19U 171)
+Fc 14148,13950 0 161211 -- MSL 190 (19U 187)
+t+- 26835,15255,3900 1 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916 3 161190 -- MSL 192 (19U 166)
+co 13173,19635 2 161193 -- MSL 193 (19U 169)
+tno 26835,11331 0 161196 -- MSL 194 (19U 172)
+u00AD 7806,10200 0 161197 -- MSL 195 (19U 173)
+rg 13173,19635 2 161198 -- MSL 196 (19U 174)
+S2 10245,20385 2 161202 -- MSL 197 (19U 178)
+S3 10245,20055 2 161203 -- MSL 198 (19U 179)
+ac 15612,324,4896 1 161208 -- MSL 199 (19U 184)
+S1 10245,20055 2 161209 -- MSL 200 (19U 185)
+tmu 26835,15189,579 0 161239 -- MSL 201 (19U 215)
+tdi 26835,12780 0 161271 -- MSL 202 (19U 247)
+u203C 15126,20160,405 2 87315 -- MSL 221 (10U 19)
+u20A7 28785,20925,405 2 60121 -- MSL 232 ( 7J 217)
+pc 7806,11781 0 161207 -- MSL 302 (19U 183)
+u013F 13662,19755 2 51943 -- MSL 306 ( 6J 231)
+u0140 8781,20820 2 51959 -- MSL 307 ( 6J 247)
+u2113 15612,18150,297 0 60122 -- MSL 308 ( 7J 218)
+u0149 20979,19755 2 51951 -- MSL 309 ( 6J 239)
+fm 7806,20055 2 60101 -- MSL 310 ( 7J 197)
+sd 15612,20055 2 60102 -- MSL 311 ( 7J 198)
+dg 15612,20160,4095 3 161158 -- MSL 312 (19U 134)
+tm 16101,17850 0 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588 1 60095 -- MSL 314 ( 7J 191)
+ah 15612,22080 2 75169 -- MSL 315 ( 9E 161)
+ao 15612,24390 2 60152 -- MSL 316 ( 7J 248)
+f/ 4392,20610,555 2 60109 -- MSL 324 ( 7J 205)
+em 26835,9840 0 161175 -- MSL 325 (19U 151)
+en 15612,9840 0 161174 -- MSL 326 (19U 150)
+dd 15612,20160,4095 3 161159 -- MSL 327 (19U 135)
+.i 7806,16755 0 46333 -- MSL 328 ( 5T 253)
+aq 6831,19755 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226 0 161173 -- MSL 331 (19U 149)
+u207F 11220,20385 2 87548 -- MSL 332 (10U 252)
+u0111 18540,20820,405 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 18540,25080 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 15126,22155,405 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 18540,19755,4143 3 75173 -- MSL 404 ( 9E 165)
+u0061_0328 15126,17160,4143 1 75193 -- MSL 405 ( 9E 185)
+'C 16101,25005,405 2 75206 -- MSL 406 ( 9E 198)
+'c 14637,22080,405 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 16101,25005,405 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 14637,22080,405 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 18540,25005 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 20004,22290,405 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 15612,25005 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 16587,22080,405 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 15612,19755,4143 3 75210 -- MSL 422 ( 9E 202)
+u0065_0328 16587,17160,4143 1 75242 -- MSL 423 ( 9E 234)
+u004C_0301 13662,25005 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 7317,25605 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 13662,19755 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 9270,22290 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 19515,25005 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 18051,22080 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 19515,25005 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 18051,22080 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 19029,25005,405 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 18051,22080,405 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 16587,25005 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 12198,22080 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 16587,25005 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 12198,22080 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 14148,25005,405 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 12198,22080,405 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 15126,25005 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 12198,22290,405 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 15126,19755,4896 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 12198,20925,4896 3 75262 -- MSL 469 ( 9E 254)
+u0055_030B 19029,25005,405 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 17565,22080,405 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 19029,26850,405 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 17565,24390,405 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 16101,25005 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 13662,22080 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 16101,24690 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 13662,21840 2 75199 -- MSL 485 ( 9E 191)
+u2070 10245,20385 2 51753 -- MSL 1000 ( 6J 41)
+u2074 10245,20055 2 51748 -- MSL 1001 ( 6J 36)
+u2075 10245,20055 2 51749 -- MSL 1002 ( 6J 37)
+u2076 10245,20385 2 51806 -- MSL 1003 ( 6J 94)
+u2077 10245,20055 2 51750 -- MSL 1004 ( 6J 38)
+u2078 10245,20385 2 51754 -- MSL 1005 ( 6J 42)
+u2079 10245,20385 2 51752 -- MSL 1006 ( 6J 40)
+lq 10245,19755 2 161171 -- MSL 1017 (19U 147)
+rq 10245,19755 2 161172 -- MSL 1018 (19U 148)
+Bq 10245,2868,3417 0 161156 -- MSL 1019 (19U 132)
+u2003 26835,0 0 51821 -- MSL 1020 ( 6J 109)
+u2002 15612,0 0 51822 -- MSL 1021 ( 6J 110)
+u2009 7806,0 0 51828 -- MSL 1023 ( 6J 116)
+u2026 26835,2865 0 161157 -- MSL 1028 (19U 133)
+vz 13662,22080 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,18000 0 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056 1 51794 -- MSL 1036 ( 6J 82)
+fi 18051,21105 2 60077 -- MSL 1040 ( 7J 173)
+fl 18051,20820 2 60078 -- MSL 1041 ( 7J 174)
+ff 20979,20820 2 51883 -- MSL 1042 ( 6J 171)
+Fi 27321,21105 2 51884 -- MSL 1043 ( 6J 172)
+Fl 27321,20820 2 51885 -- MSL 1044 ( 6J 173)
+ij 15126,21105,3930 3 60134 -- MSL 1047 ( 7J 230)
+u2105 26835,20610,330 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 18051,25080,405 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 17565,22155,3930 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 14148,20160,4896 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 12198,17160,4896 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 7317,24690 2 46301 -- MSL 1065 ( 5T 221)
+bq 6831,2868,3417 0 161154 -- MSL 1067 (19U 130)
+%0 34152,20460,405 2 161161 -- MSL 1068 (19U 137)
+a- 15612,21306 2 60154 -- MSL 1084 ( 7J 250)
+ab 15612,22155 2 75170 -- MSL 1086 ( 9E 162)
+a. 15612,21840 2 75263 -- MSL 1088 ( 9E 255)
+oe 29274,17160,405 0 161180 -- MSL 1090 (19U 156)
+OE 26346,20160,405 2 161164 -- MSL 1091 (19U 140)
+fo 9270,13950 0 161163 -- MSL 1092 (19U 139)
+fc 9270,13950 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624 0 60091 -- MSL 1094 ( 7J 187)
+/L 13662,19755 2 75171 -- MSL 1095 ( 9E 163)
+/l 7317,20820 2 75187 -- MSL 1096 ( 9E 179)
+a" 15612,22080 2 75197 -- MSL 1097 ( 9E 189)
+ho 15612,747,4143 1 75186 -- MSL 1098 ( 9E 178)
+vZ 16101,25005 2 75150 -- MSL 1106 ( 9E 142)
+IJ 19029,19755,405 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/AR b/font/devlj4/AR
new file mode 100644
index 0000000..8e4169d
--- /dev/null
+++ b/font/devlj4/AR
@@ -0,0 +1,430 @@
+# M Arial
+name AR
+spacewidth 7351
+pcltypeface 16602
+pclproportional 1
+pclweight 0
+pclstyle 0
+ligatures fi fl 0
+kernpairs
+1 1 -1963
+A T -1963
+A V -1963
+A W -981
+A Y -1963
+A v -477
+A w -477
+A y -477
+A cq -1963
+A ' -1963
+F , -2932
+F . -2932
+F A -1459
+L T -1963
+L V -1963
+L W -1963
+L Y -1963
+L y -981
+L cq -1459
+L ' -1459
+P , -3410
+P . -3410
+P A -1963
+R T -477
+R V -477
+R W -477
+R Y -477
+T , -2932
+T hy -1459
+T - -1459
+T . -2932
+T : -2932
+T ; -2932
+T A -1963
+T O -477
+T a -2932
+T c -2932
+T e -2932
+T i -981
+T o -2932
+T r -981
+T s -2932
+T u -981
+T w -1459
+T y -1459
+V , -2428
+V hy -1459
+V - -1459
+V . -2428
+V : -981
+V ; -981
+V A -1963
+V a -1963
+V e -1459
+V i -477
+V o -1459
+V r -981
+V u -981
+V y -981
+W , -1459
+W hy -477
+W - -477
+W . -1459
+W : -477
+W ; -477
+W A -981
+W a -981
+W e -477
+W i 0
+W o -477
+W r -477
+W u -477
+W y -232
+Y , -3410
+Y hy -2428
+Y - -2428
+Y . -3410
+Y : -1459
+Y ; -1717
+Y A -1963
+Y a -1963
+Y e -2428
+Y i -981
+Y o -2428
+Y p -1963
+Y q -2428
+Y u -1459
+Y v -1459
+f f -477
+f cq 478
+f ' 478
+r , -1459
+r . -1459
+r cq 982
+r ' 982
+v , -1963
+v . -1963
+w , -1459
+w . -1459
+y , -1963
+y . -1963
+oq oq -477
+oq ` -477
+` oq -477
+` ` -477
+cq s -477
+' s -477
+cq cq -477
+cq ' -477
+' cq -477
+' ' -477
+charset
+! 7351,18939 2 161057 -- U+0021 (19U 33)
+dq 9392,18939 2 161058 -- U+0022 (19U 34)
+" "
+sh 14715,19262,323 2 161059 -- U+0023 (19U 35)
+# "
+Do 14715,20683,2726 2 161060 -- U+0024 (19U 36)
+$ "
+% 23526,19262,698 2 161061 -- U+0025 (19U 37)
+& 17648,19262,439 2 161062 -- U+0026 (19U 38)
+aq 5051,18939 2 161063 -- U+0027 (19U 39)
+( 8811,19262,5568 3 161064 -- U+0028 (19U 40)
+) 8811,19262,5568 3 161065 -- U+0029 (19U 41)
+* 10297,19262 2 161066 -- U+002A (19U 42)
++ 15451,15580 0 161067 -- U+002B (19U 43)
+, 7351,2648,3747 0 161068 -- U+002C (19U 44)
+hy 8811,8023 0 161069 -- U+002D (19U 45)
+- "
+. 7351,2648 0 161070 -- U+002E (19U 46)
+sl 7351,19262,323 2 161071 -- U+002F (19U 47)
+/ "
+0 14715,19017,323 2 161072 -- U+0030 (19U 48)
+1 14715,19017 2 161073 -- U+0031 (19U 49)
+2 14715,19017 2 161074 -- U+0032 (19U 50)
+3 14715,19017,336 2 161075 -- U+0033 (19U 51)
+4 14715,18939 2 161076 -- U+0034 (19U 52)
+5 14715,18681,323 2 161077 -- U+0035 (19U 53)
+6 14715,19017,323 2 161078 -- U+0036 (19U 54)
+7 14715,18694 2 161079 -- U+0037 (19U 55)
+8 14715,19017,323 2 161080 -- U+0038 (19U 56)
+9 14715,19017,323 2 161081 -- U+0039 (19U 57)
+: 7351,13720 0 161082 -- U+003A (19U 58)
+; 7351,13720,3747 0 161083 -- U+003B (19U 59)
+< 15451,15748 0 161084 -- U+003C (19U 60)
+= 15451,13307 0 161085 -- U+003D (19U 61)
+> 15451,15748 0 161086 -- U+003E (19U 62)
+? 14715,19262 2 161087 -- U+003F (19U 63)
+at 26859,19288,5568 3 161088 -- U+0040 (19U 64)
+@ "
+A 17648,18939 2 161089 -- U+0041 (19U 65)
+B 17648,18939 2 161090 -- U+0042 (19U 66)
+C 19107,19262,323 2 161091 -- U+0043 (19U 67)
+D 19107,18939 2 161092 -- U+0044 (19U 68)
+E 17648,18939 2 161093 -- U+0045 (19U 69)
+F 16162,18939 2 161094 -- U+0046 (19U 70)
+G 20580,19262,323 2 161095 -- U+0047 (19U 71)
+H 19107,18939 2 161096 -- U+0048 (19U 72)
+I 7351,18939 2 161097 -- U+0049 (19U 73)
+J 13229,18939,323 2 161098 -- U+004A (19U 74)
+K 17648,18939 2 161099 -- U+004B (19U 75)
+L 14715,18939 2 161100 -- U+004C (19U 76)
+M 22040,18939 2 161101 -- U+004D (19U 77)
+N 19107,18939 2 161102 -- U+004E (19U 78)
+O 20580,19275,323 2 161103 -- U+004F (19U 79)
+P 17648,18939 2 161104 -- U+0050 (19U 80)
+Q 20580,19275,1473 2 161105 -- U+0051 (19U 81)
+R 19107,18939 2 161106 -- U+0052 (19U 82)
+S 17648,19262,323 2 161107 -- U+0053 (19U 83)
+T 16162,18939 2 161108 -- U+0054 (19U 84)
+U 19107,18939,323 2 161109 -- U+0055 (19U 85)
+V 17648,18939 2 161110 -- U+0056 (19U 86)
+W 24973,18939 2 161111 -- U+0057 (19U 87)
+X 17648,18939 2 161112 -- U+0058 (19U 88)
+Y 17648,18939 2 161113 -- U+0059 (19U 89)
+Z 16162,18939 2 161114 -- U+005A (19U 90)
+lB 7351,18939,5258 3 161115 -- U+005B (19U 91)
+[ "
+rs 7351,19262,323 2 161116 -- U+005C (19U 92)
+\ "
+rB 7351,18939,5258 3 161117 -- U+005D (19U 93)
+] "
+ha 12415,19262 2 161118 -- U+005E (19U 94)
+_ 14715,0,5258 1 161119 -- U+005F (19U 95)
+ga 8811,19043 2 161120 -- U+0060 (19U 96)
+a 14715,14030,310 0 161121 -- U+0061 (19U 97)
+b 14715,18939,310 2 161122 -- U+0062 (19U 98)
+c 13229,14030,310 0 161123 -- U+0063 (19U 99)
+d 14715,18939,310 2 161124 -- U+0064 (19U 100)
+e 14715,14030,310 0 161125 -- U+0065 (19U 101)
+f 7351,19262 2 161126 -- U+0066 (19U 102)
+g 14715,14030,5568 1 161127 -- U+0067 (19U 103)
+h 14715,18939 2 161128 -- U+0068 (19U 104)
+i 5878,18939 2 161129 -- U+0069 (19U 105)
+j 5878,18939,5568 3 161130 -- U+006A (19U 106)
+k 13229,18939 2 161131 -- U+006B (19U 107)
+l 5878,18939 2 161132 -- U+006C (19U 108)
+m 22040,14030 0 161133 -- U+006D (19U 109)
+n 14715,14030 0 161134 -- U+006E (19U 110)
+o 14715,14030,310 0 161135 -- U+006F (19U 111)
+p 14715,14030,5258 1 161136 -- U+0070 (19U 112)
+q 14715,14030,5258 1 161137 -- U+0071 (19U 113)
+r 8811,14030 0 161138 -- U+0072 (19U 114)
+s 13229,14030,310 0 161139 -- U+0073 (19U 115)
+t 7351,18513,181 2 161140 -- U+0074 (19U 116)
+u 14715,13720,310 0 161141 -- U+0075 (19U 117)
+v 13229,13720 0 161142 -- U+0076 (19U 118)
+w 19107,13720 0 161143 -- U+0077 (19U 119)
+x 13229,13720 0 161144 -- U+0078 (19U 120)
+y 13229,13720,5568 1 161145 -- U+0079 (19U 121)
+z 13229,13720 0 161146 -- U+007A (19U 122)
+{ 8837,19262,5568 3 161147 -- U+007B (19U 123)
+lC "
+| 6873,19262,5568 3 161148 -- U+007C (19U 124)
+ba "
+} 8837,19262,5568 3 161149 -- U+007D (19U 125)
+rC "
+ti 15451,11433 0 161150 -- U+007E (19U 126)
+r! 8811,13720,5219 1 161185 -- U+00A1 (19U 161)
+ct 14715,18939,5284 3 161186 -- U+00A2 (19U 162)
+Po 14715,19262,362 2 161187 -- U+00A3 (19U 163)
+Cs 14715,15710 0 161188 -- U+00A4 (19U 164)
+Ye 14715,18939 2 161189 -- U+00A5 (19U 165)
+bb 6873,19262,5568 3 161190 -- U+00A6 (19U 166)
+sc 14715,19262,5568 3 161191 -- U+00A7 (19U 167)
+ad 8811,19056 2 161192 -- U+00A8 (19U 168)
+co 19495,19262,233 2 161193 -- U+00A9 (19U 169)
+Of 9793,19262 2 161194 -- U+00AA (19U 170)
+Fo 14715,12712 0 161195 -- U+00AB (19U 171)
+tno 15451,13307 0 161196 -- U+00AC (19U 172)
+u00AD 8811,8023 0 161197 -- U+00AD (19U 173)
+rg 19495,19262,233 2 161198 -- U+00AE (19U 174)
+u00AF 14612,21898 2 161199 -- U+00AF (19U 175)
+de 10581,19262 2 161200 -- U+00B0 (19U 176)
+t+- 14521,15878 0 161201 -- U+00B1 (19U 177)
+S2 8811,19172 2 161202 -- U+00B2 (19U 178)
+S3 8811,19172 2 161203 -- U+00B3 (19U 179)
+aa 8811,19043 2 161204 -- U+00B4 (19U 180)
+mc 15245,13720,5258 1 161205 -- U+00B5 (19U 181)
+ps 14211,18939,5258 3 161206 -- U+00B6 (19U 182)
+pc 7351,10645 0 60157 -- U+00B7 ( 7J 253)
+ac 8811,297,5439 1 161208 -- U+00B8 (19U 184)
+S1 8811,19172 2 161209 -- U+00B9 (19U 185)
+Om 9663,19262 2 161210 -- U+00BA (19U 186)
+Fc 14715,12712 0 161211 -- U+00BB (19U 187)
+14 22066,19262,736 2 161212 -- U+00BC (19U 188)
+12 22066,19262,736 2 161213 -- U+00BD (19U 189)
+34 22066,19262,736 2 161214 -- U+00BE (19U 190)
+r? 16162,13720,5542 1 161215 -- U+00BF (19U 191)
+`A 17648,23719 2 161216 -- U+00C0 (19U 192)
+'A 17648,23719 2 161217 -- U+00C1 (19U 193)
+^A 17648,23719 2 161218 -- U+00C2 (19U 194)
+~A 17648,23086 2 161219 -- U+00C3 (19U 195)
+:A 17648,22751 2 161220 -- U+00C4 (19U 196)
+oA 17648,22996 2 161221 -- U+00C5 (19U 197)
+AE 26458,18939 2 161222 -- U+00C6 (19U 198)
+,C 19107,19262,5439 3 161223 -- U+00C7 (19U 199)
+`E 17648,23719 2 161224 -- U+00C8 (19U 200)
+'E 17648,23719 2 161225 -- U+00C9 (19U 201)
+^E 17648,23719 2 161226 -- U+00CA (19U 202)
+:E 17648,22751 2 161227 -- U+00CB (19U 203)
+`I 7351,23719 2 161228 -- U+00CC (19U 204)
+'I 7351,23719 2 161229 -- U+00CD (19U 205)
+^I 7351,23719 2 161230 -- U+00CE (19U 206)
+:I 7351,22751 2 161231 -- U+00CF (19U 207)
+-D 19107,18939 2 161232 -- U+00D0 (19U 208)
+~N 19107,23086 2 161233 -- U+00D1 (19U 209)
+`O 20580,23719,323 2 161234 -- U+00D2 (19U 210)
+'O 20580,23719,323 2 161235 -- U+00D3 (19U 211)
+^O 20580,23719,323 2 161236 -- U+00D4 (19U 212)
+~O 20580,23086,323 2 161237 -- U+00D5 (19U 213)
+:O 20580,22751,323 2 161238 -- U+00D6 (19U 214)
+tmu 15451,14986 0 161239 -- U+00D7 (19U 215)
+/O 20580,19637,762 2 161240 -- U+00D8 (19U 216)
+`U 19107,23719,323 2 161241 -- U+00D9 (19U 217)
+'U 19107,23719,323 2 161242 -- U+00DA (19U 218)
+^U 19107,23719,323 2 161243 -- U+00DB (19U 219)
+:U 19107,22751,323 2 161244 -- U+00DC (19U 220)
+'Y 17648,23719 2 161245 -- U+00DD (19U 221)
+TP 17648,18939 2 161246 -- U+00DE (19U 222)
+ss 16162,19262,323 2 161247 -- U+00DF (19U 223)
+`a 14715,19043,310 2 161248 -- U+00E0 (19U 224)
+'a 14715,19043,310 2 161249 -- U+00E1 (19U 225)
+^a 14715,19043,310 2 161250 -- U+00E2 (19U 226)
+~a 14715,18733,310 2 161251 -- U+00E3 (19U 227)
+:a 14715,19056,310 2 161252 -- U+00E4 (19U 228)
+oa 14715,19598,310 2 161253 -- U+00E5 (19U 229)
+ae 23526,14030,310 0 161254 -- U+00E6 (19U 230)
+,c 13229,14030,5181 1 161255 -- U+00E7 (19U 231)
+`e 14715,19043,310 2 161256 -- U+00E8 (19U 232)
+'e 14715,19043,310 2 161257 -- U+00E9 (19U 233)
+^e 14715,19043,310 2 161258 -- U+00EA (19U 234)
+:e 14715,19056,310 2 161259 -- U+00EB (19U 235)
+`i 7351,19043 2 161260 -- U+00EC (19U 236)
+'i 7351,19043 2 161261 -- U+00ED (19U 237)
+^i 7351,19043 2 161262 -- U+00EE (19U 238)
+:i 7351,19056 2 161263 -- U+00EF (19U 239)
+Sd 14715,18939,323 2 161264 -- U+00F0 (19U 240)
+~n 14715,18733 2 161265 -- U+00F1 (19U 241)
+`o 14715,19043,310 2 161266 -- U+00F2 (19U 242)
+'o 14715,19043,310 2 161267 -- U+00F3 (19U 243)
+^o 14715,19043,310 2 161268 -- U+00F4 (19U 244)
+~o 14715,18733,310 2 161269 -- U+00F5 (19U 245)
+:o 14715,19056,310 2 161270 -- U+00F6 (19U 246)
+tdi 14521,14560 0 161271 -- U+00F7 (19U 247)
+/o 16162,14560,1021 0 161272 -- U+00F8 (19U 248)
+`u 14715,19043,310 2 161273 -- U+00F9 (19U 249)
+'u 14715,19043,310 2 161274 -- U+00FA (19U 250)
+^u 14715,19043,310 2 161275 -- U+00FB (19U 251)
+:u 14715,19056,310 2 161276 -- U+00FC (19U 252)
+'y 13229,19043,5568 3 161277 -- U+00FD (19U 253)
+Tp 14715,18939,5258 3 161278 -- U+00FE (19U 254)
+:y 13229,19056,5568 3 161279 -- U+00FF (19U 255)
+u0041_0306 17648,23448 2 75203 -- U+0102 ( 9E 195)
+u0061_0306 14715,18914,310 2 75235 -- U+0103 ( 9E 227)
+u0041_0328 17648,18939,5374 3 75173 -- U+0104 ( 9E 165)
+u0061_0328 14715,14030,5181 1 75193 -- U+0105 ( 9E 185)
+'C 19107,23719,323 2 75206 -- U+0106 ( 9E 198)
+'c 13229,19043,310 2 75238 -- U+0107 ( 9E 230)
+u0041_030C 19107,23642,323 2 75208 -- U+010C ( 9E 200)
+u0061_030C 13229,19043,310 2 75240 -- U+010D ( 9E 232)
+u0044_030C 19107,23642 2 75215 -- U+010E ( 9E 207)
+u0064_030C 16265,18939,310 2 75247 -- U+010F ( 9E 239)
+u0111 14715,18939,310 2 75248 -- U+0111 ( 9E 240)
+u0045_0328 17648,18939,5504 3 75210 -- U+0118 ( 9E 202)
+u0065_0328 14715,14030,5504 1 75242 -- U+0119 ( 9E 234)
+u0045_030C 17648,23642 2 75212 -- U+011A ( 9E 204)
+u0065_030C 14715,19043,310 2 75244 -- U+011B ( 9E 236)
+u0047_0306 20580,23448,323 2 46288 -- U+011E ( 5T 208)
+u0067_0306 14715,18914,5568 3 46320 -- U+011F ( 5T 240)
+u0049_0307 7351,22996 2 46301 -- U+0130 ( 5T 221)
+.i 7351,13720 0 46333 -- U+0131 ( 5T 253)
+IJ 19443,18939,323 2 60135 -- U+0132 ( 7J 231)
+ij 11743,18939,5568 3 60134 -- U+0133 ( 7J 230)
+u004C_0301 14715,23719 2 75205 -- U+0139 ( 9E 197)
+u006C_0301 5878,23526 2 75237 -- U+013A ( 9E 229)
+u004C_030C 14715,18939 2 75196 -- U+013D ( 9E 188)
+u006C_030C 7713,18939 2 75198 -- U+013E ( 9E 190)
+u013F 14715,18939 2 95646 -- U+013F (11U 158)
+u0140 8837,18939 2 95647 -- U+0140 (11U 159)
+/L 14715,18939 2 75171 -- U+0141 ( 9E 163)
+/l 5878,18939 2 75187 -- U+0142 ( 9E 179)
+u004E_0301 19107,23719 2 75217 -- U+0143 ( 9E 209)
+u006E_0301 14715,19043 2 75249 -- U+0144 ( 9E 241)
+u004E_030C 19107,23719 2 75218 -- U+0147 ( 9E 210)
+u006E_030C 14715,19043 2 75250 -- U+0148 ( 9E 242)
+u0149 15981,19133 2 95660 -- U+0149 (11U 172)
+u004F_030B 20580,23719,323 2 75221 -- U+0150 ( 9E 213)
+u006F_030B 14715,19043,310 2 75253 -- U+0151 ( 9E 245)
+OE 26458,19262,323 2 161164 -- U+0152 (19U 140)
+oe 24973,14030,310 0 161180 -- U+0153 (19U 156)
+u0052_0301 19107,23719 2 75200 -- U+0154 ( 9E 192)
+u0072_0301 8811,19043 2 75232 -- U+0155 ( 9E 224)
+u0052_030C 19107,23642 2 75224 -- U+0158 ( 9E 216)
+u0072_030C 8811,19043 2 75256 -- U+0159 ( 9E 248)
+u0053_0301 17648,23719,323 2 75148 -- U+015A ( 9E 140)
+u0073_0301 13229,19043,310 2 75164 -- U+015B ( 9E 156)
+u0053_0327 17648,19262,5310 3 75178 -- U+015E ( 9E 170)
+u0073_0327 13229,14030,5181 1 75194 -- U+015F ( 9E 186)
+vS 17648,23642,323 2 161162 -- U+0160 (19U 138)
+vs 13229,19043,310 2 161178 -- U+0161 (19U 154)
+u0054_0327 16162,18939,7480 3 75230 -- U+0162 ( 9E 222)
+u0074_0327 7351,18513,6873 3 75262 -- U+0163 ( 9E 254)
+u0054_030C 16162,23642 2 75149 -- U+0164 ( 9E 141)
+u0074_030C 9922,18939,181 2 75165 -- U+0165 ( 9E 157)
+u0055_030A 19107,23707,323 2 75225 -- U+016E ( 9E 217)
+u0075_030A 14715,19598,310 2 75257 -- U+016F ( 9E 249)
+u0055_030B 19107,23719,323 2 75227 -- U+0170 ( 9E 219)
+u0075_030B 14715,19043,310 2 75259 -- U+0171 ( 9E 251)
+:Y 17648,22751 2 161183 -- U+0178 (19U 159)
+u005A_0301 16162,23719 2 75151 -- U+0179 ( 9E 143)
+u007A_0301 13229,19043 2 75167 -- U+017A ( 9E 159)
+u005A_0307 16162,22996 2 75183 -- U+017B ( 9E 175)
+u007A_0307 13229,18319 2 75199 -- U+017C ( 9E 191)
+vZ 16162,23642 2 75150 -- U+017D ( 9E 142)
+vz 13229,19043 2 75166 -- U+017E ( 9E 158)
+Fn 14715,19275,5568 3 161155 -- U+0192 (19U 131)
+a^ 8811,19043 2 161160 -- U+02C6 (19U 136)
+^ "
+ah 8811,19043 2 75169 -- U+02C7 ( 9E 161)
+a- 8811,17764 2 60154 -- U+02C9 ( 7J 250)
+ab 8811,18914 2 75170 -- U+02D8 ( 9E 162)
+a. 8811,18319 2 75263 -- U+02D9 ( 9E 255)
+ao 8811,19598 2 60152 -- U+02DA ( 7J 248)
+ho 8811,310,5504 1 75186 -- U+02DB ( 9E 178)
+~ 8811,18733 2 161176 -- U+02DC (19U 152)
+a~ "
+a" 8811,19043 2 75197 -- U+02DD ( 9E 189)
+en 14715,7790 0 161174 -- U+2013 (19U 150)
+em 26458,7790 0 161175 -- U+2014 (19U 151)
+u2017 14612,0,8591 1 60095 -- U+2017 ( 7J 191)
+oq 5878,19262 2 161169 -- U+2018 (19U 145)
+` "
+cq 5878,19133 2 161170 -- U+2019 (19U 146)
+' "
+bq 5878,2700,3501 0 161154 -- U+201A (19U 130)
+lq 8811,19262 2 161171 -- U+201C (19U 147)
+rq 8811,19133 2 161172 -- U+201D (19U 148)
+Bq 8811,2700,3501 0 161156 -- U+201E (19U 132)
+dg 14715,18500,4470 2 161158 -- U+2020 (19U 134)
+dd 14715,18681,4470 2 161159 -- U+2021 (19U 135)
+bu 9263,12544 0 161173 -- U+2022 (19U 149)
+u2026 26458,2648 0 161157 -- U+2026 (19U 133)
+%0 26458,19262,698 2 161161 -- U+2030 (19U 137)
+fm 4961,18939 2 60101 -- U+2032 ( 7J 197)
+sd 9366,18939 2 60102 -- U+2033 ( 7J 198)
+fo 8811,12712 0 161163 -- U+2039 (19U 139)
+fc 8811,12712 0 161179 -- U+203A (19U 155)
+u203C 13229,18939 2 87315 -- U+203C (10U 19)
+u207F 9651,15477 0 87548 -- U+207F (10U 252)
+u20A7 28939,18939,336 2 60121 -- U+20A7 ( 7J 217)
+Eu 14715,19262,323 2 161152 -- U+20AC (19U 128)
+u2105 23422,19262,698 2 60072 -- U+2105 ( 7J 168)
+u2113 8552,19262,310 2 60122 -- U+2113 ( 7J 218)
+tm 26458,18939 2 161177 -- U+2122 (19U 153)
+\- 15451,10426 0 60096 -- U+2212 ( 7J 192)
+f/ 4418,19262,736 2 60109 -- U+2215 ( 7J 205)
+sq 15981,12196 0 60091 -- U+25A1 ( 7J 187)
+u25CA 13074,18371 2 101079 -- U+25CA (12J 215)
+fi 13229,19262 2 60077 -- U+FB01 ( 7J 173)
+fl 13229,19262 2 60078 -- U+FB02 ( 7J 174)
diff --git a/font/devlj4/CB b/font/devlj4/CB
new file mode 100644
index 0000000..88bfd01
--- /dev/null
+++ b/font/devlj4/CB
@@ -0,0 +1,330 @@
+# Courier Bd
+name CB
+spacewidth 15873
+pcltypeface 4099
+pclproportional 0
+pclweight 3
+pclstyle 0
+charset
+! 15873,15060,330 0 161057 -- MSL 1 (19U 33)
+dq 15873,15060 0 161058 -- MSL 2 (19U 34)
+" "
+sh 15873,17091,1389 2 161059 -- MSL 3 (19U 35)
+# "
+Do 15873,17010,3306 2 161060 -- MSL 4 (19U 36)
+$ "
+% 15873,16275,900 2 161061 -- MSL 5 (19U 37)
+& 15873,14244,330 0 161062 -- MSL 6 (19U 38)
+cq 15873,15060 0 161170 -- MSL 8 (19U 146)
+' "
+( 15873,16935,2295 2 161064 -- MSL 9 (19U 40)
+) 15873,16935,2295 2 161065 -- MSL 10 (19U 41)
+* 15873,15060 0 161066 -- MSL 11 (19U 42)
++ 15873,11535 0 161067 -- MSL 12 (19U 43)
+, 15873,4305,2655 0 161068 -- MSL 13 (19U 44)
+hy 15873,7440 0 161069 -- MSL 14 (19U 45)
+- "
+. 15873,4035,330 0 161070 -- MSL 15 (19U 46)
+sl 15873,18300,3525 2 161071 -- MSL 16 (19U 47)
+/ "
+0 15873,16155,330 2 161072 -- MSL 17 (19U 48)
+1 15873,16155 2 161073 -- MSL 18 (19U 49)
+2 15873,16155 2 161074 -- MSL 19 (19U 50)
+3 15873,16155,330 2 161075 -- MSL 20 (19U 51)
+4 15873,16155 2 161076 -- MSL 21 (19U 52)
+5 15873,15825,330 2 161077 -- MSL 22 (19U 53)
+6 15873,16155,330 2 161078 -- MSL 23 (19U 54)
+7 15873,15825 2 161079 -- MSL 24 (19U 55)
+8 15873,16155,330 2 161080 -- MSL 25 (19U 56)
+9 15873,16155,330 2 161081 -- MSL 26 (19U 57)
+: 15873,10635,330 0 161082 -- MSL 27 (19U 58)
+; 15873,10635,2655 0 161083 -- MSL 28 (19U 59)
+< 15873,11667,243 0 161084 -- MSL 29 (19U 60)
+= 15873,8886 0 161085 -- MSL 30 (19U 61)
+> 15873,11667,243 0 161086 -- MSL 31 (19U 62)
+? 15873,15390,330 2 161087 -- MSL 32 (19U 63)
+at 15873,15276,489 2 161088 -- MSL 33 (19U 64)
+@ "
+A 15873,15060 0 161089 -- MSL 34 (19U 65)
+B 15873,15060 0 161090 -- MSL 35 (19U 66)
+C 15873,15390,330 2 161091 -- MSL 36 (19U 67)
+D 15873,15060 0 161092 -- MSL 37 (19U 68)
+E 15873,15060 0 161093 -- MSL 38 (19U 69)
+F 15873,15060 0 161094 -- MSL 39 (19U 70)
+G 15873,15390,330 2 161095 -- MSL 40 (19U 71)
+H 15873,15060 0 161096 -- MSL 41 (19U 72)
+I 15873,15060 0 161097 -- MSL 42 (19U 73)
+J 15873,15060,330 0 161098 -- MSL 43 (19U 74)
+K 15873,15060 0 161099 -- MSL 44 (19U 75)
+L 15873,15060 0 161100 -- MSL 45 (19U 76)
+M 15873,15060 0 161101 -- MSL 46 (19U 77)
+N 15873,15060,330 0 161102 -- MSL 47 (19U 78)
+O 15873,15390,330 2 161103 -- MSL 48 (19U 79)
+P 15873,15060 0 161104 -- MSL 49 (19U 80)
+Q 15873,15390,3801 2 161105 -- MSL 50 (19U 81)
+R 15873,15060 0 161106 -- MSL 51 (19U 82)
+S 15873,15390,330 2 161107 -- MSL 52 (19U 83)
+T 15873,15060 0 161108 -- MSL 53 (19U 84)
+U 15873,15060,330 0 161109 -- MSL 54 (19U 85)
+V 15873,15060 0 161110 -- MSL 55 (19U 86)
+W 15873,15060 0 161111 -- MSL 56 (19U 87)
+X 15873,15060 0 161112 -- MSL 57 (19U 88)
+Y 15873,15060 0 161113 -- MSL 58 (19U 89)
+Z 15873,15060 0 161114 -- MSL 59 (19U 90)
+lB 15873,16935,2295 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 15873,18300,3525 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 15873,16935,2295 2 161117 -- MSL 62 (19U 93)
+] "
+ha 15873,19758 2 161118 -- MSL 63 (19U 94)
+_ 15873,0,6588 1 161119 -- MSL 64 (19U 95)
+oq 15873,15060 0 161169 -- MSL 66 (19U 145)
+` "
+a 15873,11775,330 0 161121 -- MSL 67 (19U 97)
+b 15873,16350,330 2 161122 -- MSL 68 (19U 98)
+c 15873,11775,330 0 161123 -- MSL 69 (19U 99)
+d 15873,16350,330 2 161124 -- MSL 70 (19U 100)
+e 15873,11775,330 0 161125 -- MSL 71 (19U 101)
+f 15873,16350 2 161126 -- MSL 72 (19U 102)
+g 15873,11775,4845 1 161127 -- MSL 73 (19U 103)
+h 15873,16350 2 161128 -- MSL 74 (19U 104)
+i 15873,16920 2 161129 -- MSL 75 (19U 105)
+j 15873,16920,4845 3 161130 -- MSL 76 (19U 106)
+k 15873,16350 2 161131 -- MSL 77 (19U 107)
+l 15873,16350 2 161132 -- MSL 78 (19U 108)
+m 15873,11775 0 161133 -- MSL 79 (19U 109)
+n 15873,11775 0 161134 -- MSL 80 (19U 110)
+o 15873,11775,330 0 161135 -- MSL 81 (19U 111)
+p 15873,11775,4845 1 161136 -- MSL 82 (19U 112)
+q 15873,11775,4845 1 161137 -- MSL 83 (19U 113)
+r 15873,11775 0 161138 -- MSL 84 (19U 114)
+s 15873,11775,330 0 161139 -- MSL 85 (19U 115)
+t 15873,14940,330 0 161140 -- MSL 86 (19U 116)
+u 15873,11445,330 0 161141 -- MSL 87 (19U 117)
+v 15873,11445 0 161142 -- MSL 88 (19U 118)
+w 15873,11445 0 161143 -- MSL 89 (19U 119)
+x 15873,11445 0 161144 -- MSL 90 (19U 120)
+y 15873,11445,4845 1 161145 -- MSL 91 (19U 121)
+z 15873,11445 0 161146 -- MSL 92 (19U 122)
+{ 15873,20130,6075 3 161147 -- MSL 93 (19U 123)
+lC "
+| 15873,19758,6588 3 161148 -- MSL 94 (19U 124)
+ba "
+} 15873,20130,6075 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 15873,8160 0 161150 -- MSL 96 (19U 126)
+`A 15873,21375 2 161216 -- MSL 99 (19U 192)
+^A 15873,21375 2 161218 -- MSL 100 (19U 194)
+`E 15873,21375 2 161224 -- MSL 101 (19U 200)
+^E 15873,21375 2 161226 -- MSL 102 (19U 202)
+:E 15873,20790 2 161227 -- MSL 103 (19U 203)
+^I 15873,21375 2 161230 -- MSL 104 (19U 206)
+:I 15873,20790 2 161231 -- MSL 105 (19U 207)
+aa 15873,17880 2 161204 -- MSL 106 (19U 180)
+ga 15873,17880 2 161120 -- MSL 107 (19U 96)
+a^ 15873,17880 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 15873,16890 2 161192 -- MSL 109 (19U 168)
+~ 15873,16959 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 15873,21375,330 2 161241 -- MSL 111 (19U 217)
+^U 15873,21375,330 2 161243 -- MSL 112 (19U 219)
+u00AF 15873,21108 2 161199 -- MSL 113 (19U 175)
+'Y 15873,21375 2 161245 -- MSL 114 (19U 221)
+'y 15873,17880,4845 3 161277 -- MSL 115 (19U 253)
+de 15873,16155 2 161200 -- MSL 116 (19U 176)
+,C 15873,15390,5457 3 161223 -- MSL 117 (19U 199)
+,c 15873,11775,5469 1 161255 -- MSL 118 (19U 231)
+~N 15873,20490,330 2 161233 -- MSL 119 (19U 209)
+~n 15873,16959 2 161265 -- MSL 120 (19U 241)
+r! 15873,11784,3606 0 161185 -- MSL 121 (19U 161)
+r? 15873,11751,3969 0 161215 -- MSL 122 (19U 191)
+Cs 15873,15834 2 161188 -- MSL 123 (19U 164)
+Po 15873,16155,741 2 161187 -- MSL 124 (19U 163)
+Ye 15873,15825 2 161189 -- MSL 125 (19U 165)
+sc 15873,15390,1692 2 161191 -- MSL 126 (19U 167)
+Fn 15873,16350,3114 2 161155 -- MSL 127 (19U 131)
+ct 15873,15966,1419 2 161186 -- MSL 128 (19U 162)
+^a 15873,17880,330 2 161250 -- MSL 129 (19U 226)
+^e 15873,17880,330 2 161258 -- MSL 130 (19U 234)
+^o 15873,17880,330 2 161268 -- MSL 131 (19U 244)
+^u 15873,17880,330 2 161275 -- MSL 132 (19U 251)
+'a 15873,17880,330 2 161249 -- MSL 133 (19U 225)
+'e 15873,17880,330 2 161257 -- MSL 134 (19U 233)
+'o 15873,17880,330 2 161267 -- MSL 135 (19U 243)
+'u 15873,17880,330 2 161274 -- MSL 136 (19U 250)
+`a 15873,17880,330 2 161248 -- MSL 137 (19U 224)
+`e 15873,17880,330 2 161256 -- MSL 138 (19U 232)
+`o 15873,17880,330 2 161266 -- MSL 139 (19U 242)
+`u 15873,17880,330 2 161273 -- MSL 140 (19U 249)
+:a 15873,16890,330 2 161252 -- MSL 141 (19U 228)
+:e 15873,16890,330 2 161259 -- MSL 142 (19U 235)
+:o 15873,16890,330 2 161270 -- MSL 143 (19U 246)
+:u 15873,16890,330 2 161276 -- MSL 144 (19U 252)
+oA 15873,21780 2 161221 -- MSL 145 (19U 197)
+^i 15873,17880 2 161262 -- MSL 146 (19U 238)
+/O 15873,15432,492 2 161240 -- MSL 147 (19U 216)
+AE 15873,15060 0 161222 -- MSL 148 (19U 198)
+oa 15873,18900,330 2 161253 -- MSL 149 (19U 229)
+'i 15873,17880 2 161261 -- MSL 150 (19U 237)
+/o 15873,11913,600 0 161272 -- MSL 151 (19U 248)
+ae 15873,11775,330 0 161254 -- MSL 152 (19U 230)
+:A 15873,20790 2 161220 -- MSL 153 (19U 196)
+`i 15873,17880 2 161260 -- MSL 154 (19U 236)
+:O 15873,20790,330 2 161238 -- MSL 155 (19U 214)
+:U 15873,20790,330 2 161244 -- MSL 156 (19U 220)
+'E 15873,21375 2 161225 -- MSL 157 (19U 201)
+:i 15873,16890 2 161263 -- MSL 158 (19U 239)
+ss 15873,16350,330 2 161247 -- MSL 159 (19U 223)
+^O 15873,21375,330 2 161236 -- MSL 160 (19U 212)
+'A 15873,21375 2 161217 -- MSL 161 (19U 193)
+~A 15873,20490 2 161219 -- MSL 162 (19U 195)
+~a 15873,16959,330 2 161251 -- MSL 163 (19U 227)
+-D 15873,15060 0 161232 -- MSL 164 (19U 208)
+Sd 15873,18249,330 2 161264 -- MSL 165 (19U 240)
+'I 15873,21375 2 161229 -- MSL 166 (19U 205)
+`I 15873,21375 2 161228 -- MSL 167 (19U 204)
+'O 15873,21375,330 2 161235 -- MSL 168 (19U 211)
+`O 15873,21375,330 2 161234 -- MSL 169 (19U 210)
+~O 15873,20490,330 2 161237 -- MSL 170 (19U 213)
+~o 15873,16959,330 2 161269 -- MSL 171 (19U 245)
+vS 15873,21375,330 2 161162 -- MSL 172 (19U 138)
+vs 15873,17880,330 2 161178 -- MSL 173 (19U 154)
+'U 15873,21375,330 2 161242 -- MSL 174 (19U 218)
+:Y 15873,20790 2 161183 -- MSL 175 (19U 159)
+:y 15873,16890,4845 3 161279 -- MSL 176 (19U 255)
+TP 15873,15060 0 161246 -- MSL 177 (19U 222)
+Tp 15873,16350,4845 3 161278 -- MSL 178 (19U 254)
+mc 15873,11445,5580 1 161205 -- MSL 180 (19U 181)
+ps 15873,19635,4080 2 161206 -- MSL 181 (19U 182)
+34 15873,16545,2415 2 161214 -- MSL 182 (19U 190)
+\- 15873,7020 0 60096 -- MSL 183 ( 7J 192)
+14 15873,16545,2415 2 161212 -- MSL 184 (19U 188)
+12 15873,16545,2415 2 161213 -- MSL 185 (19U 189)
+Of 15873,16155 2 161194 -- MSL 186 (19U 170)
+Om 15873,16155 2 161210 -- MSL 187 (19U 186)
+Fo 15873,11595 0 161195 -- MSL 188 (19U 171)
+Fc 15873,11595 0 161211 -- MSL 190 (19U 187)
+t+- 15873,11535,3360 0 161201 -- MSL 191 (19U 177)
+bb 15873,19083,5916 3 161190 -- MSL 192 (19U 166)
+co 15873,19635 2 161193 -- MSL 193 (19U 169)
+tno 15873,9420 0 161196 -- MSL 194 (19U 172)
+u00AD 15873,7440 0 161197 -- MSL 195 (19U 173)
+rg 15873,19635 2 161198 -- MSL 196 (19U 174)
+S2 15873,16035 2 161202 -- MSL 197 (19U 178)
+S3 15873,16035 2 161203 -- MSL 198 (19U 179)
+ac 15873,0,5469 1 161208 -- MSL 199 (19U 184)
+S1 15873,16035 2 161209 -- MSL 200 (19U 185)
+tmu 15873,11340 0 161239 -- MSL 201 (19U 215)
+tdi 15873,11190 0 161271 -- MSL 202 (19U 247)
+u203C 15873,15060,330 0 87315 -- MSL 221 (10U 19)
+u20A7 15873,15060,330 0 60121 -- MSL 232 ( 7J 217)
+pc 15873,10176 0 161207 -- MSL 302 (19U 183)
+u013F 15873,15060 0 51943 -- MSL 306 ( 6J 231)
+u0140 15873,16350 2 51959 -- MSL 307 ( 6J 247)
+u2113 15873,18045,765 2 60122 -- MSL 308 ( 7J 218)
+u0149 15873,15060 0 51951 -- MSL 309 ( 6J 239)
+fm 15873,15825 2 60101 -- MSL 310 ( 7J 197)
+sd 15873,15825 2 60102 -- MSL 311 ( 7J 198)
+dg 15873,15060,1185 0 161158 -- MSL 312 (19U 134)
+tm 15873,17850 2 161177 -- MSL 313 (19U 153)
+u2017 15873,0,6588 1 60095 -- MSL 314 ( 7J 191)
+ah 15873,17880 2 75169 -- MSL 315 ( 9E 161)
+ao 15873,18900 2 60152 -- MSL 316 ( 7J 248)
+f/ 15873,16695,2265 2 60109 -- MSL 324 ( 7J 205)
+em 15873,7440 0 161175 -- MSL 325 (19U 151)
+en 15873,7440 0 161174 -- MSL 326 (19U 150)
+dd 15873,15060,1185 0 161159 -- MSL 327 (19U 135)
+.i 15873,11445 0 46333 -- MSL 328 ( 5T 253)
+aq 15873,15060 0 161063 -- MSL 329 (19U 39)
+bu 15873,12714 0 161173 -- MSL 331 (19U 149)
+u207F 15873,16035 2 87548 -- MSL 332 (10U 252)
+u0111 15873,16350,330 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 15873,20805 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 15873,17310,330 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 15873,15060,4437 1 75173 -- MSL 404 ( 9E 165)
+u0061_0328 15873,11775,4680 1 75193 -- MSL 405 ( 9E 185)
+'C 15873,21375,330 2 75206 -- MSL 406 ( 9E 198)
+'c 15873,17880,330 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 15873,21375,330 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 15873,17880,330 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 15873,21375 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 15873,18990,330 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 15873,21375 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 15873,17880,330 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 15873,15060,4437 1 75210 -- MSL 422 ( 9E 202)
+u0065_0328 15873,11775,4680 1 75242 -- MSL 423 ( 9E 234)
+u004C_0301 15873,21375 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 15873,22497 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 15873,18990 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 15873,18990 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 15873,21375,330 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 15873,17880 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 15873,21375,330 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 15873,17880 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 15873,22215,330 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 15873,18720,330 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 15873,21375 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 15873,17880 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 15873,21375 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 15873,17880 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 15873,21375,330 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 15873,17880,330 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 15873,21375 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 15873,18990,330 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 15873,15060,5457 1 75230 -- MSL 468 ( 9E 222)
+u0074_0327 15873,14940,5469 1 75262 -- MSL 469 ( 9E 254)
+u0055_030B 15873,22215,330 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 15873,18720,330 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 15873,21780,330 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 15873,18900,330 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 15873,21375 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 15873,17880 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 15873,20790 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 15873,16890 2 75199 -- MSL 485 ( 9E 191)
+u2070 15873,16035 2 51753 -- MSL 1000 ( 6J 41)
+u2074 15873,16035 2 51748 -- MSL 1001 ( 6J 36)
+u2075 15873,15825 2 51749 -- MSL 1002 ( 6J 37)
+u2076 15873,16035 2 51806 -- MSL 1003 ( 6J 94)
+u2077 15873,15825 2 51750 -- MSL 1004 ( 6J 38)
+u2078 15873,16035 2 51754 -- MSL 1005 ( 6J 42)
+u2079 15873,16035 2 51752 -- MSL 1006 ( 6J 40)
+lq 15873,15060 0 161171 -- MSL 1017 (19U 147)
+rq 15873,15060 0 161172 -- MSL 1018 (19U 148)
+Bq 15873,4602,2358 0 161156 -- MSL 1019 (19U 132)
+u2003 15873,0 0 51821 -- MSL 1020 ( 6J 109)
+u2002 15873,0 0 51822 -- MSL 1021 ( 6J 110)
+u2009 15873,0 0 51828 -- MSL 1023 ( 6J 116)
+u2026 15873,2925,330 0 161157 -- MSL 1028 (19U 133)
+vz 15873,17880 2 75166 -- MSL 1031 ( 9E 158)
+u2120 15873,18000 2 128299 -- MSL 1034 (15U 43)
+u211E 15873,15060,2466 0 51794 -- MSL 1036 ( 6J 82)
+fi 15873,16920 2 60077 -- MSL 1040 ( 7J 173)
+fl 15873,16350 2 60078 -- MSL 1041 ( 7J 174)
+ff 15873,16350 2 51883 -- MSL 1042 ( 6J 171)
+Fi 15873,16350 2 51884 -- MSL 1043 ( 6J 172)
+Fl 15873,16350 2 51885 -- MSL 1044 ( 6J 173)
+ij 15873,16920,4845 3 60134 -- MSL 1047 ( 7J 230)
+u2105 15873,16695,2985 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 15873,20805,330 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 15873,17310,4845 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 15873,15390,5457 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 15873,11775,5469 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 15873,20790 2 46301 -- MSL 1065 ( 5T 221)
+bq 15873,4605,2355 0 161154 -- MSL 1067 (19U 130)
+%0 15873,16275,900 2 161161 -- MSL 1068 (19U 137)
+a- 15873,15567 2 60154 -- MSL 1084 ( 7J 250)
+ab 15873,17310 2 75170 -- MSL 1086 ( 9E 162)
+a. 15873,16890 2 75263 -- MSL 1088 ( 9E 255)
+oe 15873,11775,330 0 161180 -- MSL 1090 (19U 156)
+OE 15873,15060 0 161164 -- MSL 1091 (19U 140)
+fo 15873,11085 0 161163 -- MSL 1092 (19U 139)
+fc 15873,11085 0 161179 -- MSL 1093 (19U 155)
+sq 15873,14106 0 60091 -- MSL 1094 ( 7J 187)
+/L 15873,15060 0 75171 -- MSL 1095 ( 9E 163)
+/l 15873,16350 2 75187 -- MSL 1096 ( 9E 179)
+a" 15873,18720 2 75197 -- MSL 1097 ( 9E 189)
+ho 15873,573,4680 1 75186 -- MSL 1098 ( 9E 178)
+vZ 15873,21375 2 75150 -- MSL 1106 ( 9E 142)
+IJ 15873,15060,3837 0 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/CBI b/font/devlj4/CBI
new file mode 100644
index 0000000..3bb4a75
--- /dev/null
+++ b/font/devlj4/CBI
@@ -0,0 +1,331 @@
+# Courier BdIt
+name CBI
+spacewidth 15873
+slant 11.300000
+pcltypeface 4099
+pclproportional 0
+pclweight 3
+pclstyle 1
+charset
+! 15873,15060,330,0,-3017 0 161057 -- MSL 1 (19U 33)
+dq 15873,15060,0,0,-2660 0 161058 -- MSL 2 (19U 34)
+" "
+sh 15873,17091,1389,279,363,279 2 161059 -- MSL 3 (19U 35)
+# "
+Do 15873,17007,3306,0,279 2 161060 -- MSL 4 (19U 36)
+$ "
+% 15873,16275,900,0,-395 2 161061 -- MSL 5 (19U 37)
+& 15873,14238,330,0,426 0 161062 -- MSL 6 (19U 38)
+cq 15873,15060,0,0,-2744 0 161170 -- MSL 8 (19U 146)
+' "
+( 15873,16935,2295,0,-3092 2 161064 -- MSL 9 (19U 40)
+) 15873,16935,2295,0,-1823 2 161065 -- MSL 10 (19U 41)
+* 15873,15060,0,0,-1496 0 161066 -- MSL 11 (19U 42)
++ 15873,11535,0,0,-890 0 161067 -- MSL 12 (19U 43)
+, 15873,4305,2655,0,-1505 0 161068 -- MSL 13 (19U 44)
+hy 15873,8805,0,0,-2318 0 161069 -- MSL 14 (19U 45)
+- "
+. 15873,3675,330,0,-2804 0 161070 -- MSL 15 (19U 46)
+sl 15873,18300,3525,1224,1512,614 2 161071 -- MSL 16 (19U 47)
+/ "
+0 15873,16155,330,0,-926 2 161072 -- MSL 17 (19U 48)
+1 15873,16155,0,0,324 2 161073 -- MSL 18 (19U 49)
+2 15873,16155,0,0,1044 2 161074 -- MSL 19 (19U 50)
+3 15873,16155,330,0,891 2 161075 -- MSL 20 (19U 51)
+4 15873,16155,0,0,345 2 161076 -- MSL 21 (19U 52)
+5 15873,15825,330,0,621 2 161077 -- MSL 22 (19U 53)
+6 15873,16155,330,342,-761,342 2 161078 -- MSL 23 (19U 54)
+7 15873,15825,0,0,-1226 2 161079 -- MSL 24 (19U 55)
+8 15873,16155,330,0,-464 2 161080 -- MSL 25 (19U 56)
+9 15873,16155,330,0,297 2 161081 -- MSL 26 (19U 57)
+: 15873,10572,330,0,-2801 0 161082 -- MSL 27 (19U 58)
+; 15873,10572,2655,0,-830 0 161083 -- MSL 28 (19U 59)
+< 15873,11667,243,0,-599 0 161084 -- MSL 29 (19U 60)
+= 15873,8886,0,0,-950 0 161085 -- MSL 30 (19U 61)
+> 15873,11667,243,0,-1523 0 161086 -- MSL 31 (19U 62)
+? 15873,15390,330,0,-2030 2 161087 -- MSL 32 (19U 63)
+at 15873,15273,489,1020,1203,614 2 161088 -- MSL 33 (19U 64)
+@ "
+A 15873,15060,0,69,2868,69 0 161089 -- MSL 34 (19U 65)
+B 15873,15060,0,0,1992 0 161090 -- MSL 35 (19U 66)
+C 15873,15390,330,903,228,614 2 161091 -- MSL 36 (19U 67)
+D 15873,15060,0,369,2277,369 0 161092 -- MSL 37 (19U 68)
+E 15873,15060,0,1254,1719,614 0 161093 -- MSL 38 (19U 69)
+F 15873,15060,0,1527,1293,614 0 161094 -- MSL 39 (19U 70)
+G 15873,15390,330,1224,585,614 2 161095 -- MSL 40 (19U 71)
+H 15873,15060,0,1878,2172,614 0 161096 -- MSL 41 (19U 72)
+I 15873,15060,0,321,615,321 0 161097 -- MSL 42 (19U 73)
+J 15873,15060,330,2331,1152,614 0 161098 -- MSL 43 (19U 74)
+K 15873,15060,0,1890,1569,614 0 161099 -- MSL 44 (19U 75)
+L 15873,15060,0,27,1602,27 0 161100 -- MSL 45 (19U 76)
+M 15873,15060,0,2508,3099,614 0 161101 -- MSL 46 (19U 77)
+N 15873,15060,330,2625,2439,614 0 161102 -- MSL 47 (19U 78)
+O 15873,15390,330,447,633,447 2 161103 -- MSL 48 (19U 79)
+P 15873,15060,0,816,774,614 0 161104 -- MSL 49 (19U 80)
+Q 15873,15390,3408,453,678,453 2 161105 -- MSL 50 (19U 81)
+R 15873,15060,0,0,1977 0 161106 -- MSL 51 (19U 82)
+S 15873,15390,330,0,1386 2 161107 -- MSL 52 (19U 83)
+T 15873,15060,0,1578,210,614 0 161108 -- MSL 53 (19U 84)
+U 15873,15060,330,2124,75,614 0 161109 -- MSL 54 (19U 85)
+V 15873,15060,0,2718,504,614 0 161110 -- MSL 55 (19U 86)
+W 15873,15060,0,2757,552,614 0 161111 -- MSL 56 (19U 87)
+X 15873,15060,0,1509,2286,614 0 161112 -- MSL 57 (19U 88)
+Y 15873,15060,0,2043,-167,614 0 161113 -- MSL 58 (19U 89)
+Z 15873,15060,0,159,1026,159 0 161114 -- MSL 59 (19U 90)
+lB 15873,16935,2295,0,-1994 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 15873,18300,3525,0,-2522 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 15873,16935,2295,0,-1631 2 161117 -- MSL 62 (19U 93)
+] "
+ha 15873,19758,0,0,-1313 2 161118 -- MSL 63 (19U 94)
+_ 15873,0,6588,1317,1317,614 1 161119 -- MSL 64 (19U 95)
+oq 15873,15060,0,0,-3344 0 161169 -- MSL 66 (19U 145)
+` "
+a 15873,11775,330,0,837 0 161121 -- MSL 67 (19U 97)
+b 15873,16350,330,390,1974,390 2 161122 -- MSL 68 (19U 98)
+c 15873,11775,330,0,282 0 161123 -- MSL 69 (19U 99)
+d 15873,16350,330,183,1038,183 2 161124 -- MSL 70 (19U 100)
+e 15873,11775,330,0,228 0 161125 -- MSL 71 (19U 101)
+f 15873,16350,0,1308,39,614 2 161126 -- MSL 72 (19U 102)
+g 15873,11775,4845,1260,1542,614 1 161127 -- MSL 73 (19U 103)
+h 15873,16350,0,0,2550 2 161128 -- MSL 74 (19U 104)
+i 15873,16920,0,0,606 2 161129 -- MSL 75 (19U 105)
+j 15873,16920,4845,0,1428 3 161130 -- MSL 76 (19U 106)
+k 15873,16350,0,0,2061 2 161131 -- MSL 77 (19U 107)
+l 15873,16350,0,0,570 2 161132 -- MSL 78 (19U 108)
+m 15873,11775,0,417,3222,417 0 161133 -- MSL 79 (19U 109)
+n 15873,11775,0,0,2292 0 161134 -- MSL 80 (19U 110)
+o 15873,11775,330,0,858 0 161135 -- MSL 81 (19U 111)
+p 15873,11775,4845,330,3072,330 1 161136 -- MSL 82 (19U 112)
+q 15873,11775,4845,1644,810,614 1 161137 -- MSL 83 (19U 113)
+r 15873,11775,0,735,1257,614 0 161138 -- MSL 84 (19U 114)
+s 15873,11775,330,0,798 0 161139 -- MSL 85 (19U 115)
+t 15873,14985,330,0,-1244 0 161140 -- MSL 86 (19U 116)
+u 15873,11445,330,0,432 0 161141 -- MSL 87 (19U 117)
+v 15873,11445,0,1554,936,614 0 161142 -- MSL 88 (19U 118)
+w 15873,11445,0,1896,1278,614 0 161143 -- MSL 89 (19U 119)
+x 15873,11445,0,894,2469,614 0 161144 -- MSL 90 (19U 120)
+y 15873,11445,4845,1887,2409,614 1 161145 -- MSL 91 (19U 121)
+z 15873,11445,0,0,498 0 161146 -- MSL 92 (19U 122)
+{ 15873,20130,6075,1548,-2003,614 3 161147 -- MSL 93 (19U 123)
+lC "
+| 15873,19758,6588,0,-5945 3 161148 -- MSL 94 (19U 124)
+ba "
+} 15873,20130,6075,0,996 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 15873,8160,0,0,-791 0 161150 -- MSL 96 (19U 126)
+`A 15873,21495,0,69,2868,69 2 161216 -- MSL 99 (19U 192)
+^A 15873,21495,0,69,2868,69 2 161218 -- MSL 100 (19U 194)
+`E 15873,21495,0,1254,1719,614 2 161224 -- MSL 101 (19U 200)
+^E 15873,21495,0,1254,1719,614 2 161226 -- MSL 102 (19U 202)
+:E 15873,20520,0,1254,1719,614 2 161227 -- MSL 103 (19U 203)
+^I 15873,21495,0,609,615,609 2 161230 -- MSL 104 (19U 206)
+:I 15873,20520,0,321,615,321 2 161231 -- MSL 105 (19U 207)
+aa 15873,18000,0,0,-3248 2 161204 -- MSL 106 (19U 180)
+ga 15873,18000,0,0,-2834 2 161120 -- MSL 107 (19U 96)
+a^ 15873,18000,0,9,-2342,9 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 15873,16890,0,0,-4019 2 161192 -- MSL 109 (19U 168)
+~ 15873,16959,0,594,-2030,594 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 15873,21495,330,2124,75,614 2 161241 -- MSL 111 (19U 217)
+^U 15873,21495,330,2124,75,614 2 161243 -- MSL 112 (19U 219)
+u00AF 15873,21108,0,1317,1317,614 2 161199 -- MSL 113 (19U 175)
+'Y 15873,21495,0,2043,-167,614 2 161245 -- MSL 114 (19U 221)
+'y 15873,18000,4845,1887,2409,614 3 161277 -- MSL 115 (19U 253)
+de 15873,16155,0,0,-3119 2 161200 -- MSL 116 (19U 176)
+,C 15873,15390,5721,903,228,614 3 161223 -- MSL 117 (19U 199)
+,c 15873,11775,5562,0,282 1 161255 -- MSL 118 (19U 231)
+~N 15873,20487,330,2625,2439,614 2 161233 -- MSL 119 (19U 209)
+~n 15873,16959,0,594,2292,594 2 161265 -- MSL 120 (19U 241)
+r! 15873,11904,3486,0,-3410 0 161185 -- MSL 121 (19U 161)
+r? 15873,11868,3852,0,-746 0 161215 -- MSL 122 (19U 191)
+Cs 15873,15834,0,345,348,345 2 161188 -- MSL 123 (19U 164)
+Po 15873,16155,603,192,-107,192 2 161187 -- MSL 124 (19U 163)
+Ye 15873,15825,0,2160,-341,614 2 161189 -- MSL 125 (19U 165)
+sc 15873,15390,1692,0,-1331 2 161191 -- MSL 126 (19U 167)
+Fn 15873,16350,3135,12,1572,12 2 161155 -- MSL 127 (19U 131)
+ct 15873,15978,1419,0,-1067 2 161186 -- MSL 128 (19U 162)
+^a 15873,18000,330,9,837,9 2 161250 -- MSL 129 (19U 226)
+^e 15873,18000,330,9,228,9 2 161258 -- MSL 130 (19U 234)
+^o 15873,18000,330,9,858,9 2 161268 -- MSL 131 (19U 244)
+^u 15873,18000,330,9,432,9 2 161275 -- MSL 132 (19U 251)
+'a 15873,18000,330,0,837 2 161249 -- MSL 133 (19U 225)
+'e 15873,18000,330,0,228 2 161257 -- MSL 134 (19U 233)
+'o 15873,18000,330,0,858 2 161267 -- MSL 135 (19U 243)
+'u 15873,18000,330,0,432 2 161274 -- MSL 136 (19U 250)
+`a 15873,18000,330,0,837 2 161248 -- MSL 137 (19U 224)
+`e 15873,18000,330,0,228 2 161256 -- MSL 138 (19U 232)
+`o 15873,18000,330,0,858 2 161266 -- MSL 139 (19U 242)
+`u 15873,18000,330,0,432 2 161273 -- MSL 140 (19U 249)
+:a 15873,16890,330,0,837 2 161252 -- MSL 141 (19U 228)
+:e 15873,16890,330,0,228 2 161259 -- MSL 142 (19U 235)
+:o 15873,16890,330,0,858 2 161270 -- MSL 143 (19U 246)
+:u 15873,16890,330,0,432 2 161276 -- MSL 144 (19U 252)
+oA 15873,21780,0,69,2868,69 2 161221 -- MSL 145 (19U 197)
+^i 15873,18000,0,9,606,9 2 161262 -- MSL 146 (19U 238)
+/O 15873,15501,528,1206,1434,614 2 161240 -- MSL 147 (19U 216)
+AE 15873,15060,0,2391,2655,614 0 161222 -- MSL 148 (19U 198)
+oa 15873,18381,330,0,837 2 161253 -- MSL 149 (19U 229)
+'i 15873,18000,0,0,606 2 161261 -- MSL 150 (19U 237)
+/o 15873,11901,591,486,1311,486 0 161272 -- MSL 151 (19U 248)
+ae 15873,11775,330,654,2010,614 0 161254 -- MSL 152 (19U 230)
+:A 15873,20520,0,69,2868,69 2 161220 -- MSL 153 (19U 196)
+`i 15873,18000,0,0,606 2 161260 -- MSL 154 (19U 236)
+:O 15873,20520,330,447,633,447 2 161238 -- MSL 155 (19U 214)
+:U 15873,20520,330,2124,75,614 2 161244 -- MSL 156 (19U 220)
+'E 15873,21495,0,1254,1719,614 2 161225 -- MSL 157 (19U 201)
+:i 15873,16890,0,0,606 2 161263 -- MSL 158 (19U 239)
+ss 15873,16350,330,0,2220 2 161247 -- MSL 159 (19U 223)
+^O 15873,21495,330,609,633,609 2 161236 -- MSL 160 (19U 212)
+'A 15873,21495,0,69,2868,69 2 161217 -- MSL 161 (19U 193)
+~A 15873,20487,0,174,2868,174 2 161219 -- MSL 162 (19U 195)
+~a 15873,16959,330,594,837,594 2 161251 -- MSL 163 (19U 227)
+-D 15873,15060,0,366,2280,366 0 161232 -- MSL 164 (19U 208)
+Sd 15873,18222,330,0,171 2 161264 -- MSL 165 (19U 240)
+'I 15873,21495,0,321,615,321 2 161229 -- MSL 166 (19U 205)
+`I 15873,21495,0,321,615,321 2 161228 -- MSL 167 (19U 204)
+'O 15873,21495,330,591,633,591 2 161235 -- MSL 168 (19U 211)
+`O 15873,21495,330,447,633,447 2 161234 -- MSL 169 (19U 210)
+~O 15873,20487,330,1986,633,614 2 161237 -- MSL 170 (19U 213)
+~o 15873,16959,330,594,858,594 2 161269 -- MSL 171 (19U 245)
+vS 15873,21495,330,984,1386,614 2 161162 -- MSL 172 (19U 138)
+vs 15873,18000,330,9,798,9 2 161178 -- MSL 173 (19U 154)
+'U 15873,21495,330,2124,75,614 2 161242 -- MSL 174 (19U 218)
+:Y 15873,20520,0,2043,-167,614 2 161183 -- MSL 175 (19U 159)
+:y 15873,16890,4845,1887,2409,614 3 161279 -- MSL 176 (19U 255)
+TP 15873,15060,0,222,2166,222 0 161246 -- MSL 177 (19U 222)
+Tp 15873,16350,4845,330,3075,330 3 161278 -- MSL 178 (19U 254)
+mc 15873,11445,5580,114,-11,114 1 161205 -- MSL 180 (19U 181)
+ps 15873,19635,4080,0,-1307 2 161206 -- MSL 181 (19U 182)
+34 15873,16674,2286,4155,1086,614 2 161214 -- MSL 182 (19U 190)
+\- 15873,7020,0,0,-950 0 60096 -- MSL 183 ( 7J 192)
+14 15873,16674,2286,4458,1638,614 2 161212 -- MSL 184 (19U 188)
+12 15873,16674,2286,3384,1857,614 2 161213 -- MSL 185 (19U 189)
+Of 15873,16155,0,0,-3527 2 161194 -- MSL 186 (19U 170)
+Om 15873,16155,0,0,-3587 2 161210 -- MSL 187 (19U 186)
+Fo 15873,11625,0,354,1047,354 0 161195 -- MSL 188 (19U 171)
+Fc 15873,11625,0,0,1605 0 161211 -- MSL 190 (19U 187)
+t+- 15873,11535,3360,0,-890 0 161201 -- MSL 191 (19U 177)
+bb 15873,19083,5916,0,-5945 3 161190 -- MSL 192 (19U 166)
+co 15873,19635,0,225,-1133,225 2 161193 -- MSL 193 (19U 169)
+tno 15873,9420,0,0,-950 0 161196 -- MSL 194 (19U 172)
+u00AD 15873,8805,0,0,-2318 0 161197 -- MSL 195 (19U 173)
+rg 15873,19635,0,225,-1133,225 2 161198 -- MSL 196 (19U 174)
+S2 15873,16170,0,0,-3062 2 161202 -- MSL 197 (19U 178)
+S3 15873,16170,0,0,-3161 2 161203 -- MSL 198 (19U 179)
+ac 15873,0,5562,0,-2264 1 161208 -- MSL 199 (19U 184)
+S1 15873,16170,0,0,-3065 2 161209 -- MSL 200 (19U 185)
+tmu 15873,11646,0,0,-797 0 161239 -- MSL 201 (19U 215)
+tdi 15873,11190,0,0,-1109 0 161271 -- MSL 202 (19U 247)
+u203C 15873,15060,330,0,-167 0 87315 -- MSL 221 (10U 19)
+u20A7 15873,15060,330,792,2466,614 0 60121 -- MSL 232 ( 7J 217)
+pc 15873,10128,0,0,-4289 0 161207 -- MSL 302 (19U 183)
+u013F 15873,15060,0,27,1602,27 0 51943 -- MSL 306 ( 6J 231)
+u0140 15873,16350,0,2742,570,614 2 51959 -- MSL 307 ( 6J 247)
+u2113 15873,18045,765,0,-1820 2 60122 -- MSL 308 ( 7J 218)
+u0149 15873,15060,0,0,2070 0 51951 -- MSL 309 ( 6J 239)
+fm 15873,15825,0,0,-5123 2 60101 -- MSL 310 ( 7J 197)
+sd 15873,15825,0,0,-2747 2 60102 -- MSL 311 ( 7J 198)
+dg 15873,15060,1185,0,-1775 0 161158 -- MSL 312 (19U 134)
+tm 15873,17850,0,108,-416,108 2 161177 -- MSL 313 (19U 153)
+u2017 15873,0,6588,1317,1317,614 1 60095 -- MSL 314 ( 7J 191)
+ah 15873,18000,0,9,-2342,9 2 75169 -- MSL 315 ( 9E 161)
+ao 15873,18381,0,0,-5318 2 60152 -- MSL 316 ( 7J 248)
+f/ 15873,16695,2265,2712,2529,614 2 60109 -- MSL 324 ( 7J 205)
+em 15873,8805,0,1707,1929,614 0 161175 -- MSL 325 (19U 151)
+en 15873,8805,0,0,-362 0 161174 -- MSL 326 (19U 150)
+dd 15873,15060,1185,0,-1775 0 161159 -- MSL 327 (19U 135)
+.i 15873,11445,0,0,606 0 46333 -- MSL 328 ( 5T 253)
+aq 15873,15060,0,0,-4982 0 161063 -- MSL 329 (19U 39)
+bu 15873,12714,0,0,-1847 0 161173 -- MSL 331 (19U 149)
+u207F 15873,16170,0,0,-980 2 87548 -- MSL 332 (10U 252)
+u0111 15873,16350,330,1830,1017,614 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 15873,20805,0,1683,2868,614 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 15873,17340,330,993,837,614 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 15873,15060,4437,69,2868,69 1 75173 -- MSL 404 ( 9E 165)
+u0061_0328 15873,11775,4665,0,837 1 75193 -- MSL 405 ( 9E 185)
+'C 15873,21495,330,903,228,614 2 75206 -- MSL 406 ( 9E 198)
+'c 15873,18000,330,0,282 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 15873,21495,330,1734,228,614 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 15873,18000,330,759,282,614 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 15873,21495,0,984,2277,614 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 15873,18990,330,5229,2244,614 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 15873,21495,0,1284,1719,614 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 15873,18000,330,609,228,609 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 15873,15060,4437,1254,1719,614 1 75210 -- MSL 422 ( 9E 202)
+u0065_0328 15873,11775,4665,0,228 1 75242 -- MSL 423 ( 9E 234)
+u004C_0301 15873,21495,0,27,1602,27 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 15873,22752,0,0,570 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 15873,18990,0,3591,1602,614 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 15873,18990,0,3753,570,614 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 15873,21495,330,2625,2439,614 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 15873,18000,0,0,2292 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 15873,21495,330,2625,2439,614 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 15873,18000,0,9,2292,9 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 15873,22215,330,3525,633,614 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 15873,18720,330,2916,858,614 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 15873,21495,0,141,1977,141 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 15873,18000,0,735,1257,614 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 15873,21495,0,984,1977,614 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 15873,18000,0,735,1257,614 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 15873,21495,330,591,1386,591 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 15873,18000,330,0,798 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 15873,21495,0,1578,210,614 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 15873,18990,330,1344,-1244,614 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 15873,15060,5721,1578,210,614 1 75230 -- MSL 468 ( 9E 222)
+u0074_0327 15873,14985,5562,0,-1244 1 75262 -- MSL 469 ( 9E 254)
+u0055_030B 15873,22215,330,2625,75,614 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 15873,18720,330,1866,432,614 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 15873,21780,330,2124,75,614 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 15873,18381,330,0,432 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 15873,21495,0,591,1026,591 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 15873,18000,0,0,498 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 15873,20520,0,159,1026,159 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 15873,16890,0,0,498 2 75199 -- MSL 485 ( 9E 191)
+u2070 15873,16170,0,0,-4139 2 51753 -- MSL 1000 ( 6J 41)
+u2074 15873,16170,0,0,-3293 2 51748 -- MSL 1001 ( 6J 36)
+u2075 15873,15960,0,0,-3371 2 51749 -- MSL 1002 ( 6J 37)
+u2076 15873,16170,0,0,-3953 2 51806 -- MSL 1003 ( 6J 94)
+u2077 15873,15960,0,0,-4652 2 51750 -- MSL 1004 ( 6J 38)
+u2078 15873,16170,0,0,-3758 2 51754 -- MSL 1005 ( 6J 42)
+u2079 15873,16170,0,0,-3677 2 51752 -- MSL 1006 ( 6J 40)
+lq 15873,15060,0,387,-740,387 0 161171 -- MSL 1017 (19U 147)
+rq 15873,15060,0,0,-143 0 161172 -- MSL 1018 (19U 148)
+Bq 15873,4596,2364,0,1314 0 161156 -- MSL 1019 (19U 132)
+u2003 15873,0,0,0,1317 0 51821 -- MSL 1020 ( 6J 109)
+u2002 15873,0,0,0,1317 0 51822 -- MSL 1021 ( 6J 110)
+u2009 15873,0,0,0,1317 0 51828 -- MSL 1023 ( 6J 116)
+u2026 15873,3675,330,0,2394 0 161157 -- MSL 1028 (19U 133)
+vz 15873,18000,0,9,498,9 2 75166 -- MSL 1031 ( 9E 158)
+u2120 15873,18000,0,1146,-281,614 2 128299 -- MSL 1034 (15U 43)
+u211E 15873,15060,3708,1215,369,614 0 51794 -- MSL 1036 ( 6J 82)
+fi 15873,16920,0,438,2340,438 2 60077 -- MSL 1040 ( 7J 173)
+fl 15873,16350,0,336,2337,336 2 60078 -- MSL 1041 ( 7J 174)
+ff 15873,16350,0,4086,2349,614 2 51883 -- MSL 1042 ( 6J 171)
+Fi 15873,16350,0,2229,2946,614 2 51884 -- MSL 1043 ( 6J 172)
+Fl 15873,16350,0,1425,2949,614 2 51885 -- MSL 1044 ( 6J 173)
+ij 15873,16920,4845,738,1320,614 3 60134 -- MSL 1047 ( 7J 230)
+u2105 15873,16479,2886,681,939,614 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 15873,20805,330,1983,585,614 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 15873,17340,4845,1260,1542,614 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 15873,15390,5721,0,1386 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 15873,11775,5562,0,798 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 15873,20520,0,321,615,321 2 46301 -- MSL 1065 ( 5T 221)
+bq 15873,4596,2364,0,-1646 0 161154 -- MSL 1067 (19U 130)
+%0 15873,16275,900,3066,3417,614 2 161161 -- MSL 1068 (19U 137)
+a- 15873,16032,0,537,-2186,537 2 60154 -- MSL 1084 ( 7J 250)
+ab 15873,17340,0,993,-2840,614 2 75170 -- MSL 1086 ( 9E 162)
+a. 15873,16890,0,0,-6185 2 75263 -- MSL 1088 ( 9E 255)
+oe 15873,11775,330,1284,1977,614 0 161180 -- MSL 1090 (19U 156)
+OE 15873,15060,0,2781,1740,614 0 161164 -- MSL 1091 (19U 140)
+fo 15873,11070,0,0,-2003 0 161163 -- MSL 1092 (19U 139)
+fc 15873,11070,0,0,-1388 0 161179 -- MSL 1093 (19U 155)
+sq 15873,14106,0,0,-443 0 60091 -- MSL 1094 ( 7J 187)
+/L 15873,15060,0,27,1602,27 0 75171 -- MSL 1095 ( 9E 163)
+/l 15873,16350,0,0,570 2 75187 -- MSL 1096 ( 9E 179)
+a" 15873,18720,0,2916,-4082,614 2 75197 -- MSL 1097 ( 9E 189)
+ho 15873,564,4665,0,-4916 1 75186 -- MSL 1098 ( 9E 178)
+vZ 15873,21495,0,984,1026,614 2 75150 -- MSL 1106 ( 9E 142)
+IJ 15873,15060,3849,1506,1941,614 0 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/CI b/font/devlj4/CI
new file mode 100644
index 0000000..556e98c
--- /dev/null
+++ b/font/devlj4/CI
@@ -0,0 +1,331 @@
+# Courier It
+name CI
+spacewidth 15873
+slant 11.300000
+pcltypeface 4099
+pclproportional 0
+pclweight 0
+pclstyle 1
+charset
+! 15873,15060,330,0,-5231 0 161057 -- MSL 1 (19U 33)
+dq 15873,15060,0,0,-4631 0 161058 -- MSL 2 (19U 34)
+" "
+sh 15873,16827,2046,1710,-1472,610 2 161059 -- MSL 3 (19U 35)
+# "
+Do 15873,17259,3642,954,-1643,610 2 161060 -- MSL 4 (19U 36)
+$ "
+% 15873,16380,330,1140,-2168,610 2 161061 -- MSL 5 (19U 37)
+& 15873,14169,330,1563,-1910,610 0 161062 -- MSL 6 (19U 38)
+cq 15873,15060,0,0,-5216 0 161170 -- MSL 8 (19U 146)
+' "
+( 15873,17070,2580,1185,-7562,610 2 161064 -- MSL 9 (19U 40)
+) 15873,17070,2580,0,-2012 2 161065 -- MSL 10 (19U 41)
+* 15873,15060,0,174,-3272,174 0 161066 -- MSL 11 (19U 42)
++ 15873,11385,0,252,-2150,252 0 161067 -- MSL 12 (19U 43)
+, 15873,3195,3420,0,-2999 0 161068 -- MSL 13 (19U 44)
+hy 15873,6570,0,0,-3740 0 161069 -- MSL 14 (19U 45)
+- "
+. 15873,3105,330,0,-5039 0 161070 -- MSL 15 (19U 46)
+sl 15873,18465,3765,2349,-698,610 2 161071 -- MSL 16 (19U 47)
+/ "
+0 15873,15390,330,399,-2831,399 0 161072 -- MSL 17 (19U 48)
+1 15873,15060,0,0,-1493 0 161073 -- MSL 18 (19U 49)
+2 15873,15390,0,423,-785,423 0 161074 -- MSL 19 (19U 50)
+3 15873,15390,330,0,-1112 0 161075 -- MSL 20 (19U 51)
+4 15873,15060,0,0,-1547 0 161076 -- MSL 21 (19U 52)
+5 15873,15060,330,882,-1169,610 0 161077 -- MSL 22 (19U 53)
+6 15873,15390,330,1530,-2435,610 0 161078 -- MSL 23 (19U 54)
+7 15873,15060,0,954,-2828,610 0 161079 -- MSL 24 (19U 55)
+8 15873,15390,330,624,-2225,610 0 161080 -- MSL 25 (19U 56)
+9 15873,15390,330,684,-1658,610 0 161081 -- MSL 26 (19U 57)
+: 15873,9975,330,0,-5042 0 161082 -- MSL 27 (19U 58)
+; 15873,9975,3420,0,-3176 0 161083 -- MSL 28 (19U 59)
+< 15873,10647,3,0,-1154 0 161084 -- MSL 29 (19U 60)
+= 15873,8451,0,252,-2150,252 0 161085 -- MSL 30 (19U 61)
+> 15873,10647,3,0,-1958 0 161086 -- MSL 31 (19U 62)
+? 15873,15390,330,483,-4172,483 0 161087 -- MSL 32 (19U 63)
+at 15873,14391,363,2031,-1358,610 0 161088 -- MSL 33 (19U 64)
+@ "
+A 15873,15060,0,1470,1092,610 0 161089 -- MSL 34 (19U 65)
+B 15873,15060,0,1383,171,610 0 161090 -- MSL 35 (19U 66)
+C 15873,15390,330,2835,-1688,610 0 161091 -- MSL 36 (19U 67)
+D 15873,15060,0,2061,537,610 0 161092 -- MSL 37 (19U 68)
+E 15873,15060,0,2724,-152,610 0 161093 -- MSL 38 (19U 69)
+F 15873,15060,0,3120,-470,610 0 161094 -- MSL 39 (19U 70)
+G 15873,15390,330,2259,-956,610 0 161095 -- MSL 40 (19U 71)
+H 15873,15060,0,3483,285,610 0 161096 -- MSL 41 (19U 72)
+I 15873,15060,0,1764,-1187,610 0 161097 -- MSL 42 (19U 73)
+J 15873,15060,330,3729,-368,610 0 161098 -- MSL 43 (19U 74)
+K 15873,15060,0,3453,-209,610 0 161099 -- MSL 44 (19U 75)
+L 15873,15060,0,1512,-134,610 0 161100 -- MSL 45 (19U 76)
+M 15873,15060,0,4218,1107,610 0 161101 -- MSL 46 (19U 77)
+N 15873,15060,0,4182,738,610 0 161102 -- MSL 47 (19U 78)
+O 15873,15390,330,2058,-1136,610 0 161103 -- MSL 48 (19U 79)
+P 15873,15060,0,2262,-785,610 0 161104 -- MSL 49 (19U 80)
+Q 15873,15390,3357,2037,-1073,610 0 161105 -- MSL 50 (19U 81)
+R 15873,15060,0,1248,234,610 0 161106 -- MSL 51 (19U 82)
+S 15873,15390,330,1893,-803,610 0 161107 -- MSL 52 (19U 83)
+T 15873,15060,0,3183,-1967,610 0 161108 -- MSL 53 (19U 84)
+U 15873,15060,330,4095,-2096,610 0 161109 -- MSL 54 (19U 85)
+V 15873,15060,0,4191,-1724,610 0 161110 -- MSL 55 (19U 86)
+W 15873,15060,0,4260,-1670,610 0 161111 -- MSL 56 (19U 87)
+X 15873,15060,0,3177,522,610 0 161112 -- MSL 57 (19U 88)
+Y 15873,15060,0,3672,-2261,610 0 161113 -- MSL 58 (19U 89)
+Z 15873,15060,0,1707,-806,610 0 161114 -- MSL 59 (19U 90)
+lB 15873,17070,2580,1815,-6344,610 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 15873,18465,3765,0,-4673 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 15873,17070,2580,0,-1220 2 161117 -- MSL 62 (19U 93)
+] "
+ha 15873,19758,0,0,-1313 2 161118 -- MSL 63 (19U 94)
+_ 15873,0,6588,1317,1317,610 1 161119 -- MSL 64 (19U 95)
+oq 15873,15060,0,0,-6266 0 161169 -- MSL 66 (19U 145)
+` "
+a 15873,11775,330,531,-695,531 0 161121 -- MSL 67 (19U 97)
+b 15873,16500,330,1602,723,610 2 161122 -- MSL 68 (19U 98)
+c 15873,11775,330,1542,-1616,610 0 161123 -- MSL 69 (19U 99)
+d 15873,16500,330,2148,-1142,610 2 161124 -- MSL 70 (19U 100)
+e 15873,11775,330,1269,-1610,610 0 161125 -- MSL 71 (19U 101)
+f 15873,16500,0,2262,-1172,610 2 161126 -- MSL 72 (19U 102)
+g 15873,11775,5145,2622,-95,610 1 161127 -- MSL 73 (19U 103)
+h 15873,16500,0,1179,387,610 2 161128 -- MSL 74 (19U 104)
+i 15873,17235,0,0,-1259 2 161129 -- MSL 75 (19U 105)
+j 15873,17235,5145,0,81 3 161130 -- MSL 76 (19U 106)
+k 15873,16500,0,1857,24,610 2 161131 -- MSL 77 (19U 107)
+l 15873,16500,0,0,-1130 2 161132 -- MSL 78 (19U 108)
+m 15873,11775,0,1746,1188,610 0 161133 -- MSL 79 (19U 109)
+n 15873,11775,0,960,585,610 0 161134 -- MSL 80 (19U 110)
+o 15873,11775,330,1443,-1139,610 0 161135 -- MSL 81 (19U 111)
+p 15873,11775,5145,1500,1920,610 1 161136 -- MSL 82 (19U 112)
+q 15873,11775,5145,3354,-983,610 1 161137 -- MSL 83 (19U 113)
+r 15873,11775,0,2475,-596,610 0 161138 -- MSL 84 (19U 114)
+s 15873,11775,330,915,-1355,610 0 161139 -- MSL 85 (19U 115)
+t 15873,14760,330,738,-3215,610 0 161140 -- MSL 86 (19U 116)
+u 15873,11445,330,726,-1403,610 0 161141 -- MSL 87 (19U 117)
+v 15873,11445,0,3342,-1223,610 0 161142 -- MSL 88 (19U 118)
+w 15873,11445,0,3735,-830,610 0 161143 -- MSL 89 (19U 119)
+x 15873,11445,0,2502,648,610 0 161144 -- MSL 90 (19U 120)
+y 15873,11445,5145,3123,903,610 1 161145 -- MSL 91 (19U 121)
+z 15873,11445,0,1101,-1367,610 0 161146 -- MSL 92 (19U 122)
+{ 15873,20130,6075,2940,-5528,610 3 161147 -- MSL 93 (19U 123)
+lC "
+| 15873,19758,6588,0,-5945 3 161148 -- MSL 94 (19U 124)
+ba "
+} 15873,20130,6075,0,-1058 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 15873,7233,0,0,-1088 0 161150 -- MSL 96 (19U 126)
+`A 15873,21255,0,1470,1092,610 2 161216 -- MSL 99 (19U 192)
+^A 15873,21255,0,1707,1092,610 2 161218 -- MSL 100 (19U 194)
+`E 15873,21255,0,2724,-152,610 2 161224 -- MSL 101 (19U 200)
+^E 15873,21255,0,2724,-152,610 2 161226 -- MSL 102 (19U 202)
+:E 15873,20670,0,2724,-152,610 2 161227 -- MSL 103 (19U 203)
+^I 15873,21255,0,2157,-1187,610 2 161230 -- MSL 104 (19U 206)
+:I 15873,20670,0,1764,-1187,610 2 161231 -- MSL 105 (19U 207)
+aa 15873,17640,0,1401,-6674,610 2 161204 -- MSL 106 (19U 180)
+ga 15873,17640,0,0,-4490 2 161120 -- MSL 107 (19U 96)
+a^ 15873,17640,0,1257,-4490,610 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 15873,16905,0,0,-6488 2 161192 -- MSL 109 (19U 168)
+~ 15873,16818,0,1788,-4145,610 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 15873,21255,330,4095,-2096,610 2 161241 -- MSL 111 (19U 217)
+^U 15873,21255,330,4095,-2096,610 2 161243 -- MSL 112 (19U 219)
+u00AF 15873,21108,0,1317,1317,610 2 161199 -- MSL 113 (19U 175)
+'Y 15873,21255,0,3672,-2261,610 2 161245 -- MSL 114 (19U 221)
+'y 15873,17640,5145,3123,903,610 3 161277 -- MSL 115 (19U 253)
+de 15873,15390,0,0,-4463 0 161200 -- MSL 116 (19U 176)
+,C 15873,15390,4815,2835,-1688,610 1 161223 -- MSL 117 (19U 199)
+,c 15873,11775,4815,1542,-1616,610 1 161255 -- MSL 118 (19U 231)
+~N 15873,20580,0,4182,738,610 2 161233 -- MSL 119 (19U 209)
+~n 15873,16818,0,1788,585,610 2 161265 -- MSL 120 (19U 241)
+r! 15873,11946,3444,0,-5714 0 161185 -- MSL 121 (19U 161)
+r? 15873,11946,3774,0,-2576 0 161215 -- MSL 122 (19U 191)
+Cs 15873,15684,0,1560,-2252,610 2 161188 -- MSL 123 (19U 164)
+Po 15873,15390,474,1797,-2231,610 0 161187 -- MSL 124 (19U 163)
+Ye 15873,15060,0,3741,-2177,610 0 161189 -- MSL 125 (19U 165)
+sc 15873,15390,1905,0,-3359 0 161191 -- MSL 126 (19U 167)
+Fn 15873,15090,4350,1704,-773,610 0 161155 -- MSL 127 (19U 131)
+ct 15873,16083,1536,900,-3014,610 2 161186 -- MSL 128 (19U 162)
+^a 15873,17640,330,1257,-695,610 2 161250 -- MSL 129 (19U 226)
+^e 15873,17640,330,1269,-1610,610 2 161258 -- MSL 130 (19U 234)
+^o 15873,17640,330,1443,-1139,610 2 161268 -- MSL 131 (19U 244)
+^u 15873,17640,330,1257,-1403,610 2 161275 -- MSL 132 (19U 251)
+'a 15873,17640,330,1401,-695,610 2 161249 -- MSL 133 (19U 225)
+'e 15873,17640,330,1401,-1610,610 2 161257 -- MSL 134 (19U 233)
+'o 15873,17640,330,1443,-1139,610 2 161267 -- MSL 135 (19U 243)
+'u 15873,17640,330,1401,-1403,610 2 161274 -- MSL 136 (19U 250)
+`a 15873,17640,330,531,-695,531 2 161248 -- MSL 137 (19U 224)
+`e 15873,17640,330,1269,-1610,610 2 161256 -- MSL 138 (19U 232)
+`o 15873,17640,330,1443,-1139,610 2 161266 -- MSL 139 (19U 242)
+`u 15873,17640,330,726,-1403,610 2 161273 -- MSL 140 (19U 249)
+:a 15873,16905,330,531,-695,531 2 161252 -- MSL 141 (19U 228)
+:e 15873,16905,330,1269,-1610,610 2 161259 -- MSL 142 (19U 235)
+:o 15873,16905,330,1443,-1139,610 2 161270 -- MSL 143 (19U 246)
+:u 15873,16905,330,726,-1403,610 2 161276 -- MSL 144 (19U 252)
+oA 15873,21690,0,1470,1092,610 2 161221 -- MSL 145 (19U 197)
+^i 15873,17640,0,1257,-1259,610 2 161262 -- MSL 146 (19U 238)
+/O 15873,15390,453,2697,-332,610 0 161240 -- MSL 147 (19U 216)
+AE 15873,15060,0,2871,855,610 0 161222 -- MSL 148 (19U 198)
+oa 15873,17997,330,531,-695,531 2 161253 -- MSL 149 (19U 229)
+'i 15873,17640,0,1401,-1259,610 2 161261 -- MSL 150 (19U 237)
+/o 15873,11793,330,2241,-290,610 0 161272 -- MSL 151 (19U 248)
+ae 15873,11775,330,2148,-188,610 0 161254 -- MSL 152 (19U 230)
+:A 15873,20670,0,1470,1092,610 2 161220 -- MSL 153 (19U 196)
+`i 15873,17640,0,0,-1259 2 161260 -- MSL 154 (19U 236)
+:O 15873,20670,330,2058,-1136,610 2 161238 -- MSL 155 (19U 214)
+:U 15873,20670,330,4095,-2096,610 2 161244 -- MSL 156 (19U 220)
+'E 15873,21255,0,2724,-152,610 2 161225 -- MSL 157 (19U 201)
+:i 15873,16905,0,0,-1259 2 161263 -- MSL 158 (19U 239)
+ss 15873,16500,330,1746,-65,610 2 161247 -- MSL 159 (19U 223)
+^O 15873,21255,330,2157,-1136,610 2 161236 -- MSL 160 (19U 212)
+'A 15873,21255,0,2217,1092,610 2 161217 -- MSL 161 (19U 193)
+~A 15873,20580,0,2445,1092,610 2 161219 -- MSL 162 (19U 195)
+~a 15873,16818,330,1788,-695,610 2 161251 -- MSL 163 (19U 227)
+-D 15873,15060,0,2061,537,610 0 161232 -- MSL 164 (19U 208)
+Sd 15873,18297,330,1614,-1142,610 2 161264 -- MSL 165 (19U 240)
+'I 15873,21255,0,2217,-1187,610 2 161229 -- MSL 166 (19U 205)
+`I 15873,21255,0,1764,-1187,610 2 161228 -- MSL 167 (19U 204)
+'O 15873,21255,330,2217,-1136,610 2 161235 -- MSL 168 (19U 211)
+`O 15873,21255,330,2058,-1136,610 2 161234 -- MSL 169 (19U 210)
+~O 15873,20580,330,2895,-1136,610 2 161237 -- MSL 170 (19U 213)
+~o 15873,16818,330,1788,-1139,610 2 161269 -- MSL 171 (19U 245)
+vS 15873,21255,330,2157,-803,610 2 161162 -- MSL 172 (19U 138)
+vs 15873,17640,330,1257,-1355,610 2 161178 -- MSL 173 (19U 154)
+'U 15873,21255,330,4095,-2096,610 2 161242 -- MSL 174 (19U 218)
+:Y 15873,20670,0,3672,-2261,610 2 161183 -- MSL 175 (19U 159)
+:y 15873,16905,5145,3123,903,610 3 161279 -- MSL 176 (19U 255)
+TP 15873,15060,0,2421,-755,610 0 161246 -- MSL 177 (19U 222)
+Tp 15873,16500,5145,1380,2037,610 3 161278 -- MSL 178 (19U 254)
+mc 15873,11445,5595,0,-320 1 161205 -- MSL 180 (19U 181)
+ps 15873,19635,4080,150,-2507,150 2 161206 -- MSL 181 (19U 182)
+34 15873,15498,2655,4026,15,610 0 161214 -- MSL 182 (19U 190)
+\- 15873,6435,0,252,-2150,252 0 60096 -- MSL 183 ( 7J 192)
+14 15873,15498,2655,4626,-29,610 0 161212 -- MSL 184 (19U 188)
+12 15873,15498,2655,3426,615,610 0 161213 -- MSL 185 (19U 189)
+Of 15873,15390,0,0,-5309 0 161194 -- MSL 186 (19U 170)
+Om 15873,15390,0,0,-5273 0 161210 -- MSL 187 (19U 186)
+Fo 15873,11010,0,1230,-2183,610 0 161195 -- MSL 188 (19U 171)
+Fc 15873,11010,0,330,-1283,330 0 161211 -- MSL 190 (19U 187)
+t+- 15873,11385,2835,252,-2150,252 0 161201 -- MSL 191 (19U 177)
+bb 15873,19083,5916,0,-5945 3 161190 -- MSL 192 (19U 166)
+co 15873,19635,0,2121,-3029,610 2 161193 -- MSL 193 (19U 169)
+tno 15873,8865,0,252,-2150,252 0 161196 -- MSL 194 (19U 172)
+u00AD 15873,6570,0,0,-3740 0 161197 -- MSL 195 (19U 173)
+rg 15873,19635,0,1839,-2747,610 2 161198 -- MSL 196 (19U 174)
+S2 15873,15240,0,0,-4466 0 161202 -- MSL 197 (19U 178)
+S3 15873,15240,0,0,-4547 0 161203 -- MSL 198 (19U 179)
+ac 15873,0,4815,0,-4625 1 161208 -- MSL 199 (19U 184)
+S1 15873,15060,0,0,-4829 0 161209 -- MSL 200 (19U 185)
+tmu 15873,11340,0,252,-2150,252 0 161239 -- MSL 201 (19U 215)
+tdi 15873,10530,0,306,-2204,306 0 161271 -- MSL 202 (19U 247)
+u203C 15873,15060,330,948,-1778,610 0 87315 -- MSL 221 (10U 19)
+u20A7 15873,15060,330,3744,963,610 0 60121 -- MSL 232 ( 7J 217)
+pc 15873,9657,0,0,-6251 0 161207 -- MSL 302 (19U 183)
+u013F 15873,15060,0,1512,-134,610 0 51943 -- MSL 306 ( 6J 231)
+u0140 15873,16500,0,4167,-1130,610 2 51959 -- MSL 307 ( 6J 247)
+u2113 15873,18150,297,0,-4070 2 60122 -- MSL 308 ( 7J 218)
+u0149 15873,15060,0,1662,663,610 0 51951 -- MSL 309 ( 6J 239)
+fm 15873,15060,0,0,-7595 0 60101 -- MSL 310 ( 7J 197)
+sd 15873,15060,0,0,-5273 0 60102 -- MSL 311 ( 7J 198)
+dg 15873,15060,1290,0,-4490 0 161158 -- MSL 312 (19U 134)
+tm 15873,17850,0,1896,-2204,610 2 161177 -- MSL 313 (19U 153)
+u2017 15873,0,6588,1317,1317,610 1 60095 -- MSL 314 ( 7J 191)
+ah 15873,17640,0,1257,-4490,610 2 75169 -- MSL 315 ( 9E 161)
+ao 15873,17997,0,0,-7364 2 60152 -- MSL 316 ( 7J 248)
+f/ 15873,15498,2655,3126,915,610 0 60109 -- MSL 324 ( 7J 205)
+em 15873,6570,0,3141,264,610 0 161175 -- MSL 325 (19U 151)
+en 15873,6570,0,606,-2141,606 0 161174 -- MSL 326 (19U 150)
+dd 15873,15060,1290,0,-4490 0 161159 -- MSL 327 (19U 135)
+.i 15873,11445,0,0,-1259 0 46333 -- MSL 328 ( 5T 253)
+aq 15873,15060,0,0,-6935 0 161063 -- MSL 329 (19U 39)
+bu 15873,12714,0,0,-1847 0 161173 -- MSL 331 (19U 149)
+u207F 15873,15240,0,507,-2408,507 0 87548 -- MSL 332 (10U 252)
+u0111 15873,16500,300,4020,-1142,610 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 15873,20880,0,2592,1092,610 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 15873,16395,330,2325,-695,610 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 15873,15060,3624,1470,1092,610 0 75173 -- MSL 404 ( 9E 165)
+u0061_0328 15873,11775,4263,531,-695,531 0 75193 -- MSL 405 ( 9E 185)
+'C 15873,21255,330,2835,-1688,610 2 75206 -- MSL 406 ( 9E 198)
+'c 15873,17640,330,1542,-1616,610 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 15873,21255,330,2907,-1688,610 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 15873,17640,330,2007,-1616,610 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 15873,21255,0,2157,537,610 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 15873,18870,300,5790,282,610 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 15873,21255,0,2724,-152,610 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 15873,17640,330,2007,-1610,610 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 15873,15060,3624,2724,-152,610 0 75210 -- MSL 422 ( 9E 202)
+u0065_0328 15873,11775,4263,1269,-1610,610 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 15873,21255,0,2217,-134,610 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 15873,22365,0,651,-1130,610 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 15873,18870,0,3966,-134,610 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 15873,18870,0,4062,-1130,610 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 15873,21255,0,4182,738,610 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 15873,17640,0,1401,585,610 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 15873,21255,0,4182,738,610 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 15873,17640,0,1707,585,610 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 15873,22035,330,3720,-1136,610 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 15873,18420,330,2355,-1139,610 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 15873,21255,0,2217,234,610 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 15873,17640,0,2475,-596,610 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 15873,21255,0,2157,234,610 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 15873,17640,0,2475,-596,610 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 15873,21255,330,2217,-803,610 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 15873,17640,330,1401,-1355,610 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 15873,21255,0,3183,-1967,610 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 15873,18870,330,1236,-3215,610 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 15873,15060,4815,3183,-1967,610 1 75230 -- MSL 468 ( 9E 222)
+u0074_0327 15873,14760,4815,738,-3215,610 1 75262 -- MSL 469 ( 9E 254)
+u0055_030B 15873,22035,330,4095,-2096,610 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 15873,18420,330,1305,-1403,610 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 15873,21690,330,4095,-2096,610 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 15873,17997,330,726,-1403,610 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 15873,21255,0,2217,-806,610 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 15873,17640,0,1401,-1367,610 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 15873,20670,0,1707,-806,610 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 15873,16905,0,1101,-1367,610 2 75199 -- MSL 485 ( 9E 191)
+u2070 15873,15240,0,0,-5027 0 51753 -- MSL 1000 ( 6J 41)
+u2074 15873,15060,0,0,-4940 0 51748 -- MSL 1001 ( 6J 36)
+u2075 15873,15060,0,0,-4292 0 51749 -- MSL 1002 ( 6J 37)
+u2076 15873,15240,0,0,-5099 0 51806 -- MSL 1003 ( 6J 94)
+u2077 15873,15060,0,0,-5291 0 51750 -- MSL 1004 ( 6J 38)
+u2078 15873,15240,0,0,-4859 0 51754 -- MSL 1005 ( 6J 42)
+u2079 15873,15240,0,0,-4685 0 51752 -- MSL 1006 ( 6J 40)
+lq 15873,15060,0,861,-3494,610 0 161171 -- MSL 1017 (19U 147)
+rq 15873,15060,0,1011,-3644,610 0 161172 -- MSL 1018 (19U 148)
+Bq 15873,3495,3120,0,-1490 0 161156 -- MSL 1019 (19U 132)
+u2003 15873,0,0,0,1317 0 51821 -- MSL 1020 ( 6J 109)
+u2002 15873,0,0,0,1317 0 51822 -- MSL 1021 ( 6J 110)
+u2009 15873,0,0,0,1317 0 51828 -- MSL 1023 ( 6J 116)
+u2026 15873,3105,330,1257,474,610 0 161157 -- MSL 1028 (19U 133)
+vz 15873,17640,0,1257,-1367,610 2 75166 -- MSL 1031 ( 9E 158)
+u2120 15873,18000,0,2952,-2087,610 2 128299 -- MSL 1034 (15U 43)
+u211E 15873,15060,2466,2097,-1601,610 0 51794 -- MSL 1036 ( 6J 82)
+fi 15873,17235,0,1983,1185,610 2 60077 -- MSL 1040 ( 7J 173)
+fl 15873,16500,0,1806,1185,610 2 60078 -- MSL 1041 ( 7J 174)
+ff 15873,16500,0,5799,1212,610 2 51883 -- MSL 1042 ( 6J 171)
+Fi 15873,16500,0,3705,846,610 2 51884 -- MSL 1043 ( 6J 172)
+Fl 15873,16500,0,2208,852,610 2 51885 -- MSL 1044 ( 6J 173)
+ij 15873,17235,5145,2958,1278,610 3 60134 -- MSL 1047 ( 7J 230)
+u2105 15873,15498,2655,3846,195,610 0 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 15873,20880,330,3192,-956,610 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 15873,16395,5145,2622,-95,610 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 15873,15390,4815,1893,-803,610 1 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 15873,11775,4815,915,-1355,610 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 15873,20670,0,1764,-1187,610 2 46301 -- MSL 1065 ( 5T 221)
+bq 15873,3495,3120,0,-3497 0 161154 -- MSL 1067 (19U 130)
+%0 15873,16380,330,2361,-470,610 2 161161 -- MSL 1068 (19U 137)
+a- 15873,15666,0,1914,-3452,610 2 60154 -- MSL 1084 ( 7J 250)
+ab 15873,16395,0,2325,-5000,610 2 75170 -- MSL 1086 ( 9E 162)
+a. 15873,16905,0,0,-8291 2 75263 -- MSL 1088 ( 9E 255)
+oe 15873,11775,330,2334,30,610 0 161180 -- MSL 1090 (19U 156)
+OE 15873,15060,0,2799,-389,610 0 161164 -- MSL 1091 (19U 140)
+fo 15873,10365,0,0,-4142 0 161163 -- MSL 1092 (19U 139)
+fc 15873,10365,0,0,-3542 0 161179 -- MSL 1093 (19U 155)
+sq 15873,14106,0,0,-443 0 60091 -- MSL 1094 ( 7J 187)
+/L 15873,15060,0,1515,-134,610 0 75171 -- MSL 1095 ( 9E 163)
+/l 15873,16500,0,0,-1184 2 75187 -- MSL 1096 ( 9E 179)
+a" 15873,18420,0,2355,-6833,610 2 75197 -- MSL 1097 ( 9E 189)
+ho 15873,0,4263,0,-7343 0 75186 -- MSL 1098 ( 9E 178)
+vZ 15873,21255,0,2157,-806,610 2 75150 -- MSL 1106 ( 9E 142)
+IJ 15873,15060,2904,3021,-206,610 0 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/CLARENDON b/font/devlj4/CLARENDON
new file mode 100644
index 0000000..87c5751
--- /dev/null
+++ b/font/devlj4/CLARENDON
@@ -0,0 +1,331 @@
+# Clarendon Cd
+name CLARENDON
+spacewidth 5856
+pcltypeface 4140
+pclproportional 1
+pclweight 3
+pclstyle 4
+ligatures fi fl ff ffi ffl 0
+charset
+! 6342,18300 2 161057 -- MSL 1 (19U 33)
+dq 11709,18645 2 161058 -- MSL 2 (19U 34)
+" "
+sh 11709,18300 2 161059 -- MSL 3 (19U 35)
+# "
+Do 11709,18309,306 2 161060 -- MSL 4 (19U 36)
+$ "
+% 17565,18645,345 2 161061 -- MSL 5 (19U 37)
+& 16587,18645,345 2 161062 -- MSL 6 (19U 38)
+cq 5856,18645 2 161170 -- MSL 8 (19U 146)
+' "
+( 5856,18300,6870 3 161064 -- MSL 9 (19U 40)
+) 5856,18300,6870 3 161065 -- MSL 10 (19U 41)
+* 11709,18645 2 161066 -- MSL 11 (19U 42)
++ 17565,16545 0 161067 -- MSL 12 (19U 43)
+, 5856,3945,3375 0 161068 -- MSL 13 (19U 44)
+hy 5856,8295 0 161069 -- MSL 14 (19U 45)
+- "
+. 5856,3945 0 161070 -- MSL 15 (19U 46)
+sl 5856,18645,345 2 161071 -- MSL 16 (19U 47)
+/ "
+0 11709,18645,345 2 161072 -- MSL 17 (19U 48)
+1 11709,18300 2 161073 -- MSL 18 (19U 49)
+2 11709,18645,345 2 161074 -- MSL 19 (19U 50)
+3 11709,18645,345 2 161075 -- MSL 20 (19U 51)
+4 11709,18300 2 161076 -- MSL 21 (19U 52)
+5 11709,18300,345 2 161077 -- MSL 22 (19U 53)
+6 11709,18645,345 2 161078 -- MSL 23 (19U 54)
+7 11709,18300 2 161079 -- MSL 24 (19U 55)
+8 11709,18645,345 2 161080 -- MSL 25 (19U 56)
+9 11709,18645,345 2 161081 -- MSL 26 (19U 57)
+: 5856,13965 0 161082 -- MSL 27 (19U 58)
+; 5856,13965,3375 0 161083 -- MSL 28 (19U 59)
+< 26346,16068 0 161084 -- MSL 29 (19U 60)
+= 17565,12540 0 161085 -- MSL 30 (19U 61)
+> 26346,16068 0 161086 -- MSL 31 (19U 62)
+? 11709,18300 2 161087 -- MSL 32 (19U 63)
+at 26346,16950,4131 2 161088 -- MSL 33 (19U 64)
+@ "
+A 13662,18300 2 161089 -- MSL 34 (19U 65)
+B 13662,18300 2 161090 -- MSL 35 (19U 66)
+C 12684,18645,345 2 161091 -- MSL 36 (19U 67)
+D 13662,18300 2 161092 -- MSL 37 (19U 68)
+E 13662,18285 2 161093 -- MSL 38 (19U 69)
+F 13173,18300 2 161094 -- MSL 39 (19U 70)
+G 13662,18645,345 2 161095 -- MSL 40 (19U 71)
+H 15126,18300 2 161096 -- MSL 41 (19U 72)
+I 7806,18300 2 161097 -- MSL 42 (19U 73)
+J 11220,18300,345 2 161098 -- MSL 43 (19U 74)
+K 14637,18300 2 161099 -- MSL 44 (19U 75)
+L 12198,18300 2 161100 -- MSL 45 (19U 76)
+M 18051,18300 2 161101 -- MSL 46 (19U 77)
+N 14637,18300 2 161102 -- MSL 47 (19U 78)
+O 13662,18645,345 2 161103 -- MSL 48 (19U 79)
+P 13173,18300 2 161104 -- MSL 49 (19U 80)
+Q 14148,18645,2553 2 161105 -- MSL 50 (19U 81)
+R 15126,18300,345 2 161106 -- MSL 51 (19U 82)
+S 12198,18645,345 2 161107 -- MSL 52 (19U 83)
+T 13662,18300 2 161108 -- MSL 53 (19U 84)
+U 13173,18300,345 2 161109 -- MSL 54 (19U 85)
+V 14148,18300 2 161110 -- MSL 55 (19U 86)
+W 19515,18300 2 161111 -- MSL 56 (19U 87)
+X 13662,18300 2 161112 -- MSL 57 (19U 88)
+Y 13173,18300 2 161113 -- MSL 58 (19U 89)
+Z 12198,18300 2 161114 -- MSL 59 (19U 90)
+lB 5856,18300,5085 3 161115 -- MSL 60 (19U 91)
+[ "
+rs 5856,18645,345 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 5856,18300,5085 3 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588 1 161119 -- MSL 64 (19U 95)
+oq 5856,18645 2 161169 -- MSL 66 (19U 145)
+` "
+a 13662,14250,345 0 161121 -- MSL 67 (19U 97)
+b 12684,18300,345 2 161122 -- MSL 68 (19U 98)
+c 11220,14250,345 0 161123 -- MSL 69 (19U 99)
+d 12684,18300,345 2 161124 -- MSL 70 (19U 100)
+e 11709,14250,345 0 161125 -- MSL 71 (19U 101)
+f 8781,18645 2 161126 -- MSL 72 (19U 102)
+g 13662,15165,4605 1 161127 -- MSL 73 (19U 103)
+h 13173,18300 2 161128 -- MSL 74 (19U 104)
+i 6831,18705 2 161129 -- MSL 75 (19U 105)
+j 8295,18705,4605 3 161130 -- MSL 76 (19U 106)
+k 13173,18300 2 161131 -- MSL 77 (19U 107)
+l 6831,18300 2 161132 -- MSL 78 (19U 108)
+m 19515,14250 0 161133 -- MSL 79 (19U 109)
+n 13173,14250 0 161134 -- MSL 80 (19U 110)
+o 12198,14250,345 0 161135 -- MSL 81 (19U 111)
+p 12684,14250,4290 1 161136 -- MSL 82 (19U 112)
+q 12684,14250,4290 1 161137 -- MSL 83 (19U 113)
+r 9759,14250 0 161138 -- MSL 84 (19U 114)
+s 11220,14250,345 0 161139 -- MSL 85 (19U 115)
+t 8295,17265,345 2 161140 -- MSL 86 (19U 116)
+u 13173,13905,345 0 161141 -- MSL 87 (19U 117)
+v 11709,13905 0 161142 -- MSL 88 (19U 118)
+w 17565,13905 0 161143 -- MSL 89 (19U 119)
+x 12198,13905 0 161144 -- MSL 90 (19U 120)
+y 12198,13905,4605 1 161145 -- MSL 91 (19U 121)
+z 10245,13905 0 161146 -- MSL 92 (19U 122)
+{ 13173,19935,6210 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588 3 161148 -- MSL 94 (19U 124)
+ba "
+} 13173,19935,6210 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,9435 0 161150 -- MSL 96 (19U 126)
+`A 13662,23355 2 161216 -- MSL 99 (19U 192)
+^A 13662,22755 2 161218 -- MSL 100 (19U 194)
+`E 13662,23355 2 161224 -- MSL 101 (19U 200)
+^E 13662,22755 2 161226 -- MSL 102 (19U 202)
+:E 13662,23325 2 161227 -- MSL 103 (19U 203)
+^I 7806,22755 2 161230 -- MSL 104 (19U 206)
+:I 7806,23325 2 161231 -- MSL 105 (19U 207)
+aa 11709,19305 2 161204 -- MSL 106 (19U 180)
+ga 11709,19305 2 161120 -- MSL 107 (19U 96)
+a^ 11709,18180 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 11709,18750 2 161192 -- MSL 109 (19U 168)
+~ 11709,18654 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 13173,23355,345 2 161241 -- MSL 111 (19U 217)
+^U 13173,22755,345 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105 2 161199 -- MSL 113 (19U 175)
+'Y 13173,23355 2 161245 -- MSL 114 (19U 221)
+'y 12198,19305,4605 3 161277 -- MSL 115 (19U 253)
+de 11709,18645 2 161200 -- MSL 116 (19U 176)
+,C 12684,18645,4725 3 161223 -- MSL 117 (19U 199)
+,c 11220,14250,4737 1 161255 -- MSL 118 (19U 231)
+~N 14637,23229 2 161233 -- MSL 119 (19U 209)
+~n 13173,18654 2 161265 -- MSL 120 (19U 241)
+r! 6342,13956,4344 1 161185 -- MSL 121 (19U 161)
+r? 11709,13956,4344 1 161215 -- MSL 122 (19U 191)
+Cs 17565,15834 0 161188 -- MSL 123 (19U 164)
+Po 11709,18645,345 2 161187 -- MSL 124 (19U 163)
+Ye 11709,18300 2 161189 -- MSL 125 (19U 165)
+sc 11709,19605,6420 3 161191 -- MSL 126 (19U 167)
+Fn 11709,18645 2 161155 -- MSL 127 (19U 131)
+ct 11709,16917 2 161186 -- MSL 128 (19U 162)
+^a 13662,18180,345 2 161250 -- MSL 129 (19U 226)
+^e 11709,18180,345 2 161258 -- MSL 130 (19U 234)
+^o 12198,18180,345 2 161268 -- MSL 131 (19U 244)
+^u 13173,18180,345 2 161275 -- MSL 132 (19U 251)
+'a 13662,19305,345 2 161249 -- MSL 133 (19U 225)
+'e 11709,19305,345 2 161257 -- MSL 134 (19U 233)
+'o 12198,19305,345 2 161267 -- MSL 135 (19U 243)
+'u 13173,19305,345 2 161274 -- MSL 136 (19U 250)
+`a 13662,19305,345 2 161248 -- MSL 137 (19U 224)
+`e 11709,19305,345 2 161256 -- MSL 138 (19U 232)
+`o 12198,19305,345 2 161266 -- MSL 139 (19U 242)
+`u 13173,19305,345 2 161273 -- MSL 140 (19U 249)
+:a 13662,18750,345 2 161252 -- MSL 141 (19U 228)
+:e 11709,18750,345 2 161259 -- MSL 142 (19U 235)
+:o 12198,18750,345 2 161270 -- MSL 143 (19U 246)
+:u 13173,18750,345 2 161276 -- MSL 144 (19U 252)
+oA 13662,25200 2 161221 -- MSL 145 (19U 197)
+^i 6831,18180 2 161262 -- MSL 146 (19U 238)
+/O 13662,18645,345 2 161240 -- MSL 147 (19U 216)
+AE 22932,18285 2 161222 -- MSL 148 (19U 198)
+oa 13662,21195,345 2 161253 -- MSL 149 (19U 229)
+'i 6831,19305 2 161261 -- MSL 150 (19U 237)
+/o 12198,14250,345 0 161272 -- MSL 151 (19U 248)
+ae 18051,14250,345 0 161254 -- MSL 152 (19U 230)
+:A 13662,23325 2 161220 -- MSL 153 (19U 196)
+`i 6831,19305 2 161260 -- MSL 154 (19U 236)
+:O 13662,23325,345 2 161238 -- MSL 155 (19U 214)
+:U 13173,23325,345 2 161244 -- MSL 156 (19U 220)
+'E 13662,23355 2 161225 -- MSL 157 (19U 201)
+:i 6831,18750 2 161263 -- MSL 158 (19U 239)
+ss 13173,18645 2 161247 -- MSL 159 (19U 223)
+^O 13662,22755,345 2 161236 -- MSL 160 (19U 212)
+'A 13662,23355 2 161217 -- MSL 161 (19U 193)
+~A 13662,23229 2 161219 -- MSL 162 (19U 195)
+~a 13662,18654,345 2 161251 -- MSL 163 (19U 227)
+-D 13662,18300 2 161232 -- MSL 164 (19U 208)
+Sd 12198,19083,345 2 161264 -- MSL 165 (19U 240)
+'I 7806,23355 2 161229 -- MSL 166 (19U 205)
+`I 7806,23355 2 161228 -- MSL 167 (19U 204)
+'O 13662,23355,345 2 161235 -- MSL 168 (19U 211)
+`O 13662,23355,345 2 161234 -- MSL 169 (19U 210)
+~O 13662,23229,345 2 161237 -- MSL 170 (19U 213)
+~o 12198,18654,345 2 161269 -- MSL 171 (19U 245)
+vS 12198,22755,345 2 161162 -- MSL 172 (19U 138)
+vs 11220,18180,345 2 161178 -- MSL 173 (19U 154)
+'U 13173,23355,345 2 161242 -- MSL 174 (19U 218)
+:Y 13173,23325 2 161183 -- MSL 175 (19U 159)
+:y 12198,18750,4605 3 161279 -- MSL 176 (19U 255)
+TP 13173,18300 2 161246 -- MSL 177 (19U 222)
+Tp 12684,18300,4290 3 161278 -- MSL 178 (19U 254)
+mc 14637,10800,5193 1 161205 -- MSL 180 (19U 181)
+ps 12198,19635,4200 3 161206 -- MSL 181 (19U 182)
+34 17565,18645,345 2 161214 -- MSL 182 (19U 190)
+\- 17565,10200 0 60096 -- MSL 183 ( 7J 192)
+14 17565,18645,345 2 161212 -- MSL 184 (19U 188)
+12 17565,18645,345 2 161213 -- MSL 185 (19U 189)
+Of 11709,18645 2 161194 -- MSL 186 (19U 170)
+Om 11709,18645 2 161210 -- MSL 187 (19U 186)
+Fo 12198,12195 0 161195 -- MSL 188 (19U 171)
+Fc 12198,12195 0 161211 -- MSL 190 (19U 187)
+t+- 17565,16500 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916 3 161190 -- MSL 192 (19U 166)
+co 13173,19725 2 161193 -- MSL 193 (19U 169)
+tno 17565,13479 0 161196 -- MSL 194 (19U 172)
+u00AD 5856,8295 0 161197 -- MSL 195 (19U 173)
+rg 13173,19725 2 161198 -- MSL 196 (19U 174)
+S2 7806,18480 2 161202 -- MSL 197 (19U 178)
+S3 7806,18480 2 161203 -- MSL 198 (19U 179)
+ac 11709,108,4737 1 161208 -- MSL 199 (19U 184)
+S1 7806,18300 2 161209 -- MSL 200 (19U 185)
+tmu 17565,16782 0 161239 -- MSL 201 (19U 215)
+tdi 17565,15045 0 161271 -- MSL 202 (19U 247)
+u203C 12198,18300 2 87315 -- MSL 221 (10U 19)
+u20A7 21468,18300,345 2 60121 -- MSL 232 ( 7J 217)
+pc 5856,11745 0 161207 -- MSL 302 (19U 183)
+u013F 12198,18300 2 51943 -- MSL 306 ( 6J 231)
+u0140 11220,18300 2 51959 -- MSL 307 ( 6J 247)
+u2113 12198,18045,765 2 60122 -- MSL 308 ( 7J 218)
+u0149 19029,18645 2 51951 -- MSL 309 ( 6J 239)
+fm 5856,18645 2 60101 -- MSL 310 ( 7J 197)
+sd 10245,18645 2 60102 -- MSL 311 ( 7J 198)
+dg 11709,18300,4575 3 161158 -- MSL 312 (19U 134)
+tm 16101,17550 2 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588 1 60095 -- MSL 314 ( 7J 191)
+ah 11709,18180 2 75169 -- MSL 315 ( 9E 161)
+ao 11709,21195 2 60152 -- MSL 316 ( 7J 248)
+f/ 3903,18645,345 2 60109 -- MSL 324 ( 7J 205)
+em 17565,8295 0 161175 -- MSL 325 (19U 151)
+en 11709,8295 0 161174 -- MSL 326 (19U 150)
+dd 11709,18300,4575 3 161159 -- MSL 327 (19U 135)
+.i 6831,13905 0 46333 -- MSL 328 ( 5T 253)
+aq 5856,18645 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226 0 161173 -- MSL 331 (19U 149)
+u207F 10734,18480 2 87548 -- MSL 332 (10U 252)
+u0111 12684,18300,345 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 13662,23655 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 13662,19080,345 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 13662,18300,4638 3 75173 -- MSL 404 ( 9E 165)
+u0061_0328 13662,14250,4353 1 75193 -- MSL 405 ( 9E 185)
+'C 12684,23355,345 2 75206 -- MSL 406 ( 9E 198)
+'c 11220,19305,345 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 12684,22755,345 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 11220,18180,345 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 13662,22755 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 15612,19590,345 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 13662,22755 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 11709,18180,345 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 13662,18285,4638 3 75210 -- MSL 422 ( 9E 202)
+u0065_0328 11709,14250,4353 1 75242 -- MSL 423 ( 9E 234)
+u004C_0301 12198,23355 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 6831,23790 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 12198,18645 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 9759,19590 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 14637,23355 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 13173,19305 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 14637,22755 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 13173,18180 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 13662,23640,345 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 12198,19305,345 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 15126,23355,345 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 9759,19305 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 15126,22755,345 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 9759,18180 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 12198,23355,345 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 11220,19305,345 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 13662,22755 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 9270,19590,345 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 13662,18300,4725 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 8295,17265,4737 3 75262 -- MSL 469 ( 9E 254)
+u0055_030B 13173,23640,345 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 13173,19305,345 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 13173,25200,345 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 13173,21195,345 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 12198,23355 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 10245,19305 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 12198,23205 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 10245,18750 2 75199 -- MSL 485 ( 9E 191)
+u2070 7806,18480 2 51753 -- MSL 1000 ( 6J 41)
+u2074 7806,18300 2 51748 -- MSL 1001 ( 6J 36)
+u2075 7806,18300 2 51749 -- MSL 1002 ( 6J 37)
+u2076 7806,18480 2 51806 -- MSL 1003 ( 6J 94)
+u2077 7806,18480 2 51750 -- MSL 1004 ( 6J 38)
+u2078 7806,18480 2 51754 -- MSL 1005 ( 6J 42)
+u2079 7806,18480 2 51752 -- MSL 1006 ( 6J 40)
+lq 10734,18645 2 161171 -- MSL 1017 (19U 147)
+rq 10734,18645 2 161172 -- MSL 1018 (19U 148)
+Bq 10734,3615,3705 0 161156 -- MSL 1019 (19U 132)
+u2003 17565,0 0 51821 -- MSL 1020 ( 6J 109)
+u2002 11709,0 0 51822 -- MSL 1021 ( 6J 110)
+u2009 5856,0 0 51828 -- MSL 1023 ( 6J 116)
+u2026 17565,3150 0 161157 -- MSL 1028 (19U 133)
+vz 10245,18180 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,17703 2 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056 2 51794 -- MSL 1036 ( 6J 82)
+fi 15612,18705 2 60077 -- MSL 1040 ( 7J 173)
+fl 15612,18645 2 60078 -- MSL 1041 ( 7J 174)
+ff 17076,18645 2 51883 -- MSL 1042 ( 6J 171)
+Fi 24396,18705 2 51884 -- MSL 1043 ( 6J 172)
+Fl 24396,18645 2 51885 -- MSL 1044 ( 6J 173)
+ij 14637,18705,4605 3 60134 -- MSL 1047 ( 7J 230)
+u2105 19029,18645,345 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 13662,23655,345 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 13662,19080,4605 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 12198,18645,4725 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 11220,14250,4737 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 7806,23205 2 46301 -- MSL 1065 ( 5T 221)
+bq 5856,3615,3705 0 161154 -- MSL 1067 (19U 130)
+%0 23418,18645,345 2 161161 -- MSL 1068 (19U 137)
+a- 11709,16920 2 60154 -- MSL 1084 ( 7J 250)
+ab 11709,19080 2 75170 -- MSL 1086 ( 9E 162)
+a. 11709,18750 2 75263 -- MSL 1088 ( 9E 255)
+oe 18051,14250,345 0 161180 -- MSL 1090 (19U 156)
+OE 20979,18645,345 2 161164 -- MSL 1091 (19U 140)
+fo 7806,12195 0 161163 -- MSL 1092 (19U 139)
+fc 7806,12195 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624 0 60091 -- MSL 1094 ( 7J 187)
+/L 12198,18300 2 75171 -- MSL 1095 ( 9E 163)
+/l 6831,18300 2 75187 -- MSL 1096 ( 9E 179)
+a" 11709,19305 2 75197 -- MSL 1097 ( 9E 189)
+ho 11709,1062,4353 1 75186 -- MSL 1098 ( 9E 178)
+vZ 12198,22755 2 75150 -- MSL 1106 ( 9E 142)
+IJ 19029,18300,345 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/CORONET b/font/devlj4/CORONET
new file mode 100644
index 0000000..dcd1632
--- /dev/null
+++ b/font/devlj4/CORONET
@@ -0,0 +1,332 @@
+# Coronet
+name CORONET
+spacewidth 5367
+slant 13.000000
+pcltypeface 4116
+pclproportional 1
+pclweight 0
+pclstyle 1
+ligatures fi fl ff ffi ffl 0
+charset
+! 4878,19920,195,7221,-2492,373 2 161057 -- MSL 1 (19U 33)
+dq 7317,18990,0,6453,-5435,373 2 161058 -- MSL 2 (19U 34)
+" "
+sh 10734,12180,0,3747,-4382,373 0 161059 -- MSL 3 (19U 35)
+# "
+Do 10734,13725,2865,4302,-2003,373 0 161060 -- MSL 4 (19U 36)
+$ "
+% 13662,12180,195,2877,-4565,373 0 161061 -- MSL 5 (19U 37)
+& 20490,18330,600,5373,-3329,373 2 161062 -- MSL 6 (19U 38)
+cq 4392,19590,0,6309,-6068,373 2 161170 -- MSL 8 (19U 146)
+' "
+( 5367,19590,6555,8709,-2141,373 3 161064 -- MSL 9 (19U 40)
+) 5367,19590,6555,5466,1101,373 3 161065 -- MSL 10 (19U 41)
+* 10734,19590,0,5157,-8681,373 2 161066 -- MSL 11 (19U 42)
++ 13662,7245,0,1473,-5255,373 0 161067 -- MSL 12 (19U 43)
+, 5367,1950,3360,2172,-1457,373 0 161068 -- MSL 13 (19U 44)
+hy 5367,3600,0,3648,-1853,373 0 161069 -- MSL 14 (19U 45)
+- "
+. 5367,1950,195,2184,-2771,373 0 161070 -- MSL 15 (19U 46)
+sl 5367,19920,195,8472,-518,373 2 161071 -- MSL 16 (19U 47)
+/ "
+0 10734,12180,195,4167,-2945,373 0 161072 -- MSL 17 (19U 48)
+1 10734,12180,195,2073,-4823,373 0 161073 -- MSL 18 (19U 49)
+2 10734,12180,165,4089,-2615,373 0 161074 -- MSL 19 (19U 50)
+3 10734,12180,195,4128,-1925,373 0 161075 -- MSL 20 (19U 51)
+4 10734,12669,633,3570,-2063,373 0 161076 -- MSL 21 (19U 52)
+5 10734,12000,195,3726,-1445,373 0 161077 -- MSL 22 (19U 53)
+6 10734,12987,195,3444,-2783,373 0 161078 -- MSL 23 (19U 54)
+7 10734,12000,195,4359,-4235,373 0 161079 -- MSL 24 (19U 55)
+8 10734,12180,195,4035,-2750,373 0 161080 -- MSL 25 (19U 56)
+9 10734,12180,1329,4101,-3341,373 0 161081 -- MSL 26 (19U 57)
+: 5367,6348,195,3393,-2771,373 0 161082 -- MSL 27 (19U 58)
+; 5367,6348,3360,3393,-1457,373 0 161083 -- MSL 28 (19U 59)
+< 26346,16068,0,0,-3980 0 161084 -- MSL 29 (19U 60)
+= 13662,4953,0,1467,-5264,373 0 161085 -- MSL 30 (19U 61)
+> 26346,16068,0,0,-3980 0 161086 -- MSL 31 (19U 62)
+? 7806,17439,195,6786,-3407,373 0 161087 -- MSL 32 (19U 63)
+at 13662,10044,3552,2940,-2849,373 0 161088 -- MSL 33 (19U 64)
+@ "
+A 23418,19995,600,5910,-1211,373 2 161089 -- MSL 34 (19U 65)
+B 14148,19590,600,6999,-1640,373 2 161090 -- MSL 35 (19U 66)
+C 14637,19590,600,7032,-2972,373 2 161091 -- MSL 36 (19U 67)
+D 23418,19701,0,3345,-2531,373 2 161092 -- MSL 37 (19U 68)
+E 15126,19590,600,7173,-2297,373 2 161093 -- MSL 38 (19U 69)
+F 17076,19590,600,6105,-2996,373 2 161094 -- MSL 39 (19U 70)
+G 15126,19590,6765,7056,-2897,373 3 161095 -- MSL 40 (19U 71)
+H 23907,19596,330,6129,-1355,373 2 161096 -- MSL 41 (19U 72)
+I 15126,19590,600,4941,-1199,373 2 161097 -- MSL 42 (19U 73)
+J 13173,19590,6519,5952,-227,373 3 161098 -- MSL 43 (19U 74)
+K 23418,19590,600,7575,-1202,373 2 161099 -- MSL 44 (19U 75)
+L 18051,19590,600,6657,-1511,373 2 161100 -- MSL 45 (19U 76)
+M 21954,19785,2223,6414,-4793,373 2 161101 -- MSL 46 (19U 77)
+N 15612,19830,2220,6954,-4553,373 2 161102 -- MSL 47 (19U 78)
+O 18051,19590,600,5169,-3554,373 2 161103 -- MSL 48 (19U 79)
+P 14148,19590,3276,6537,-746,373 2 161104 -- MSL 49 (19U 80)
+Q 18051,19590,3249,5169,-3554,373 2 161105 -- MSL 50 (19U 81)
+R 15126,19590,600,6837,-1316,373 2 161106 -- MSL 51 (19U 82)
+S 17565,19590,600,7359,-1559,373 2 161107 -- MSL 52 (19U 83)
+T 15612,19590,600,7557,-3008,373 2 161108 -- MSL 53 (19U 84)
+U 16587,19785,2220,7305,-4907,373 2 161109 -- MSL 54 (19U 85)
+V 16587,19602,600,7923,-5117,373 2 161110 -- MSL 55 (19U 86)
+W 23907,19590,600,7470,-5072,373 2 161111 -- MSL 56 (19U 87)
+X 15126,19590,600,7557,-1046,373 2 161112 -- MSL 57 (19U 88)
+Y 16101,19590,5784,7764,-4358,373 2 161113 -- MSL 58 (19U 89)
+Z 18051,19590,270,7545,-1265,373 2 161114 -- MSL 59 (19U 90)
+lB 5367,19590,6750,8592,-50,373 3 161115 -- MSL 60 (19U 91)
+[ "
+rs 5367,19920,195,3192,-4175,373 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 5367,19590,6750,7695,846,373 3 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758,0,36,36,36 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588,1317,1317,373 1 161119 -- MSL 64 (19U 95)
+oq 4392,19590,0,6309,-6068,373 2 161169 -- MSL 66 (19U 145)
+` "
+a 8781,6240,195,3735,-2093,373 0 161121 -- MSL 67 (19U 97)
+b 8295,18015,195,3219,-2297,373 2 161122 -- MSL 68 (19U 98)
+c 6831,6240,195,3807,-2012,373 0 161123 -- MSL 69 (19U 99)
+d 8781,18015,195,6720,-1985,373 2 161124 -- MSL 70 (19U 100)
+e 6831,6240,195,3648,-1958,373 0 161125 -- MSL 71 (19U 101)
+f 5856,19920,6555,8130,-44,373 3 161126 -- MSL 72 (19U 102)
+g 8295,6240,6555,3243,-1463,373 1 161127 -- MSL 73 (19U 103)
+h 8781,18015,195,4152,-1946,373 2 161128 -- MSL 74 (19U 104)
+i 4878,10050,195,4416,-2342,373 0 161129 -- MSL 75 (19U 105)
+j 4392,10146,6555,4560,1614,373 1 161130 -- MSL 76 (19U 106)
+k 8295,18015,195,3720,-2009,373 2 161131 -- MSL 77 (19U 107)
+l 5367,19920,195,8229,-2354,373 2 161132 -- MSL 78 (19U 108)
+m 12198,6240,195,4164,-2060,373 0 161133 -- MSL 79 (19U 109)
+n 8295,6240,195,4122,-2045,373 0 161134 -- MSL 80 (19U 110)
+o 7317,6240,195,3615,-1922,373 0 161135 -- MSL 81 (19U 111)
+p 8295,6240,6555,3597,-2,373 1 161136 -- MSL 82 (19U 112)
+q 8781,6240,6555,3960,-2009,373 1 161137 -- MSL 83 (19U 113)
+r 5856,6240,0,4149,-1997,373 0 161138 -- MSL 84 (19U 114)
+s 5856,7410,195,3423,-1673,373 0 161139 -- MSL 85 (19U 115)
+t 4878,12324,195,4935,-2210,373 0 161140 -- MSL 86 (19U 116)
+u 8781,6240,195,3834,-2501,373 0 161141 -- MSL 87 (19U 117)
+v 6831,6240,195,4293,-2228,373 0 161142 -- MSL 88 (19U 118)
+w 10734,6240,195,3777,-2201,373 0 161143 -- MSL 89 (19U 119)
+x 5856,6240,0,4203,-1016,373 0 161144 -- MSL 90 (19U 120)
+y 7806,6240,6555,3639,-2132,373 1 161145 -- MSL 91 (19U 121)
+z 5856,6045,0,4245,-1331,373 0 161146 -- MSL 92 (19U 122)
+{ 11709,19935,6210,6660,-5129,373 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588,0,-4595 3 161148 -- MSL 94 (19U 124)
+ba "
+} 11709,19935,6210,2163,-632,373 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,8952,0,0,-4028 0 161150 -- MSL 96 (19U 126)
+`A 23418,24825,600,5910,-1211,373 2 161216 -- MSL 99 (19U 192)
+^A 23418,24975,600,9558,-1211,373 2 161218 -- MSL 100 (19U 194)
+`E 15126,24825,600,7173,-2297,373 2 161224 -- MSL 101 (19U 200)
+^E 15126,24975,600,7404,-2297,373 2 161226 -- MSL 102 (19U 202)
+:E 15126,23370,600,7644,-2297,373 2 161227 -- MSL 103 (19U 203)
+^I 15126,24975,600,7404,-1199,373 2 161230 -- MSL 104 (19U 206)
+:I 15126,23370,600,6744,-1199,373 2 161231 -- MSL 105 (19U 207)
+aa 10734,9885,0,3222,-7334,373 0 161204 -- MSL 106 (19U 180)
+ga 10734,9885,0,1608,-5720,373 0 161120 -- MSL 107 (19U 96)
+a^ 10734,9885,0,2160,-4874,373 0 161160 -- MSL 108 (19U 136)
+^ "
+ad 10734,9240,0,2286,-6035,373 0 161192 -- MSL 109 (19U 168)
+~ 10734,9282,0,2601,-5588,373 0 161176 -- MSL 110 (19U 152)
+a~ "
+`U 16587,24825,2220,7305,-4907,373 2 161241 -- MSL 111 (19U 217)
+^U 16587,24975,2220,7305,-4907,373 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105,0,1317,1317,373 2 161199 -- MSL 113 (19U 175)
+'Y 16101,24825,5784,7764,-4358,373 2 161245 -- MSL 114 (19U 221)
+'y 7806,9885,6555,4086,-2132,373 1 161277 -- MSL 115 (19U 253)
+de 10734,12180,0,3030,-6329,373 0 161200 -- MSL 116 (19U 176)
+,C 14637,19590,4569,7032,-2972,373 2 161223 -- MSL 117 (19U 199)
+,c 6831,6240,4206,3807,-1904,373 0 161255 -- MSL 118 (19U 231)
+~N 15612,23673,2220,6954,-4553,373 2 161233 -- MSL 119 (19U 209)
+~n 8295,9282,195,4122,-2045,373 0 161265 -- MSL 120 (19U 241)
+r! 4878,9900,10215,4278,450,373 1 161185 -- MSL 121 (19U 161)
+r? 7806,8658,8976,3063,315,373 1 161215 -- MSL 122 (19U 191)
+Cs 10734,10530,0,4335,-2807,373 0 161188 -- MSL 123 (19U 164)
+Po 10734,12180,195,4797,-1130,373 0 161187 -- MSL 124 (19U 163)
+Ye 10734,12708,5787,6393,1848,373 0 161189 -- MSL 125 (19U 165)
+sc 10734,12360,360,4200,-2339,373 0 161191 -- MSL 126 (19U 167)
+Fn 10734,19920,6555,4971,-1763,373 3 161155 -- MSL 127 (19U 131)
+ct 10734,11385,0,2574,-4754,373 0 161186 -- MSL 128 (19U 162)
+^a 8781,9885,195,4035,-2093,373 0 161250 -- MSL 129 (19U 226)
+^e 6831,9885,195,5010,-1958,373 0 161258 -- MSL 130 (19U 234)
+^o 7317,9885,195,4467,-1922,373 0 161268 -- MSL 131 (19U 244)
+^u 8781,9885,195,3834,-2501,373 0 161275 -- MSL 132 (19U 251)
+'a 8781,9885,195,4197,-2093,373 0 161249 -- MSL 133 (19U 225)
+'e 6831,9885,195,5622,-1958,373 0 161257 -- MSL 134 (19U 233)
+'o 7317,9885,195,5379,-1922,373 0 161267 -- MSL 135 (19U 243)
+'u 8781,9885,195,4197,-2501,373 0 161274 -- MSL 136 (19U 250)
+`a 8781,9885,195,3735,-2093,373 0 161248 -- MSL 137 (19U 224)
+`e 6831,9885,195,3648,-1958,373 0 161256 -- MSL 138 (19U 232)
+`o 7317,9885,195,3615,-1922,373 0 161266 -- MSL 139 (19U 242)
+`u 8781,9885,195,3834,-2501,373 0 161273 -- MSL 140 (19U 249)
+:a 8781,9240,195,3735,-2093,373 0 161252 -- MSL 141 (19U 228)
+:e 6831,9240,195,4686,-1958,373 0 161259 -- MSL 142 (19U 235)
+:o 7317,9240,195,4593,-1922,373 0 161270 -- MSL 143 (19U 246)
+:u 8781,9240,195,3834,-2501,373 0 161276 -- MSL 144 (19U 252)
+oA 23418,24315,600,7644,-1211,373 2 161221 -- MSL 145 (19U 197)
+^i 4878,9885,195,5088,-1946,373 0 161262 -- MSL 146 (19U 238)
+/O 18051,19638,636,7677,-1427,373 2 161240 -- MSL 147 (19U 216)
+AE 24396,19590,600,7059,309,373 2 161222 -- MSL 148 (19U 198)
+oa 8781,10395,195,3735,-2093,373 0 161253 -- MSL 149 (19U 229)
+'i 4878,9885,195,6150,-2342,373 0 161261 -- MSL 150 (19U 237)
+/o 7317,6240,201,4239,-1160,373 0 161272 -- MSL 151 (19U 248)
+ae 11220,6240,195,3378,-2057,373 0 161254 -- MSL 152 (19U 230)
+:A 23418,23370,600,8598,-1211,373 2 161220 -- MSL 153 (19U 196)
+`i 4878,9885,195,4536,-2342,373 0 161260 -- MSL 154 (19U 236)
+:O 18051,23370,600,5169,-3554,373 2 161238 -- MSL 155 (19U 214)
+:U 16587,23370,2220,7305,-4907,373 2 161244 -- MSL 156 (19U 220)
+'E 15126,24825,600,7515,-2297,373 2 161225 -- MSL 157 (19U 201)
+:i 4878,9240,195,5214,-2342,373 0 161263 -- MSL 158 (19U 239)
+ss 9270,19920,6555,4851,-149,373 3 161247 -- MSL 159 (19U 223)
+^O 18051,24975,600,5169,-3554,373 2 161236 -- MSL 160 (19U 212)
+'A 23418,24825,600,8739,-1211,373 2 161217 -- MSL 161 (19U 193)
+~A 23418,23673,600,9720,-1211,373 2 161219 -- MSL 162 (19U 195)
+~a 8781,9282,195,3735,-2093,373 0 161251 -- MSL 163 (19U 227)
+-D 23418,19698,0,3291,-2582,373 2 161232 -- MSL 164 (19U 208)
+Sd 8781,18015,195,5640,-2606,373 2 161264 -- MSL 165 (19U 240)
+'I 15126,24825,600,6585,-1199,373 2 161229 -- MSL 166 (19U 205)
+`I 15126,24825,600,4941,-1199,373 2 161228 -- MSL 167 (19U 204)
+'O 18051,24825,600,5169,-3554,373 2 161235 -- MSL 168 (19U 211)
+`O 18051,24825,600,5169,-3554,373 2 161234 -- MSL 169 (19U 210)
+~O 18051,23673,600,5202,-3554,373 2 161237 -- MSL 170 (19U 213)
+~o 7317,9282,195,4308,-1922,373 0 161269 -- MSL 171 (19U 245)
+vS 17565,25035,600,8751,-1559,373 2 161162 -- MSL 172 (19U 138)
+vs 5856,11133,195,6582,-1673,373 0 161178 -- MSL 173 (19U 154)
+'U 16587,24825,2220,7305,-4907,373 2 161242 -- MSL 174 (19U 218)
+:Y 16101,23370,5784,7764,-4358,373 2 161183 -- MSL 175 (19U 159)
+:y 7806,9240,6555,3639,-2132,373 1 161279 -- MSL 176 (19U 255)
+TP 14148,19590,3228,5598,-749,373 2 161246 -- MSL 177 (19U 222)
+Tp 8295,18015,6555,3597,-2,373 3 161278 -- MSL 178 (19U 254)
+mc 14637,10800,5595,612,585,373 0 161205 -- MSL 180 (19U 181)
+ps 10734,19635,4200,2865,-4976,373 2 161206 -- MSL 181 (19U 182)
+34 13662,12714,426,4089,-2624,373 0 161214 -- MSL 182 (19U 190)
+\- 13662,4020,0,837,-4634,373 0 60096 -- MSL 183 ( 7J 192)
+14 13662,12714,426,3339,-3749,373 0 161212 -- MSL 184 (19U 188)
+12 13662,12714,426,3726,-3749,373 0 161213 -- MSL 185 (19U 189)
+Of 8295,12180,0,5139,-3017,373 0 161194 -- MSL 186 (19U 170)
+Om 8295,12180,0,4494,-3869,373 0 161210 -- MSL 187 (19U 186)
+Fo 7317,6840,870,5124,-2201,373 0 161195 -- MSL 188 (19U 171)
+Fc 7317,6840,870,3621,-698,373 0 161211 -- MSL 190 (19U 187)
+t+- 13662,7263,432,819,-4601,373 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916,0,-4595 3 161190 -- MSL 192 (19U 166)
+co 13173,19725,0,8436,-6611,373 2 161193 -- MSL 193 (19U 169)
+tno 13662,5640,0,1545,-5342,373 0 161196 -- MSL 194 (19U 172)
+u00AD 5367,3600,0,3648,-1853,373 0 161197 -- MSL 195 (19U 173)
+rg 13173,19725,0,8436,-6611,373 2 161198 -- MSL 196 (19U 174)
+S2 6342,12150,0,4965,-3668,373 0 161202 -- MSL 197 (19U 178)
+S3 6342,12150,0,5163,-3224,373 0 161203 -- MSL 198 (19U 179)
+ac 10734,0,4206,0,-3857 0 161208 -- MSL 199 (19U 184)
+S1 6342,12150,0,4314,-4949,373 0 161209 -- MSL 200 (19U 185)
+tmu 13662,7281,0,1434,-5198,373 0 161239 -- MSL 201 (19U 215)
+tdi 13662,6570,0,1371,-5168,373 0 161271 -- MSL 202 (19U 247)
+u203C 9270,19920,195,7221,-2492,373 2 87315 -- MSL 221 (10U 19)
+u20A7 19029,19590,3276,4932,-746,373 2 60121 -- MSL 232 ( 7J 217)
+pc 5367,6801,0,3285,-3872,373 0 161207 -- MSL 302 (19U 183)
+u013F 18051,19590,600,8766,-1511,373 2 51943 -- MSL 306 ( 6J 231)
+u0140 8295,19920,195,5301,-2354,373 2 51959 -- MSL 307 ( 6J 247)
+u2113 10734,12180,195,2700,-4265,373 0 60122 -- MSL 308 ( 7J 218)
+u0149 10734,14103,195,4125,-4487,373 0 51951 -- MSL 309 ( 6J 239)
+fm 5367,11985,0,4482,-4724,373 0 60101 -- MSL 310 ( 7J 197)
+sd 7806,11985,0,4626,-4724,373 0 60102 -- MSL 311 ( 7J 198)
+dg 10734,12360,2565,3789,-4823,373 0 161158 -- MSL 312 (19U 134)
+tm 16101,17550,0,8922,-6572,373 0 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588,1317,1317,373 1 60095 -- MSL 314 ( 7J 191)
+ah 10734,9993,0,3468,-6182,373 0 75169 -- MSL 315 ( 9E 161)
+ao 10734,10395,0,1947,-6896,373 0 60152 -- MSL 316 ( 7J 248)
+f/ 2439,12714,426,7488,492,373 0 60109 -- MSL 324 ( 7J 205)
+em 13662,3600,0,1644,-3692,373 0 161175 -- MSL 325 (19U 151)
+en 10734,3600,0,1509,-4097,373 0 161174 -- MSL 326 (19U 150)
+dd 10734,12360,2565,3195,-4229,373 0 161159 -- MSL 327 (19U 135)
+.i 4878,6240,195,3915,-2342,373 0 46333 -- MSL 328 ( 5T 253)
+aq 4392,18990,0,6729,-5585,373 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226,0,0,-497 0 161173 -- MSL 331 (19U 149)
+u207F 8295,12237,0,5133,-3017,373 0 87548 -- MSL 332 (10U 252)
+u0111 8781,18015,195,6720,-1985,373 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 23418,23580,600,8793,-1211,373 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 8781,9810,195,4389,-2093,373 0 75235 -- MSL 401 ( 9E 227)
+u0041_0328 23418,19995,2925,5910,-1211,373 2 75173 -- MSL 404 ( 9E 165)
+u0061_0328 8781,6240,2727,3735,-2093,373 0 75193 -- MSL 405 ( 9E 185)
+'C 14637,24825,600,7947,-2972,373 2 75206 -- MSL 406 ( 9E 198)
+'c 6831,9885,195,5622,-2012,373 0 75238 -- MSL 407 ( 9E 230)
+u0041_030C 14637,25035,600,10215,-2972,373 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 6831,9993,195,5574,-2012,373 0 75240 -- MSL 411 ( 9E 232)
+u0044_030C 23418,25035,0,4326,-2531,373 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 10245,19056,195,8436,-1985,373 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 15126,25035,600,9972,-2297,373 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 6831,9993,195,5418,-1958,373 0 75244 -- MSL 417 ( 9E 236)
+u0045_0328 15126,19590,3900,7173,-2297,373 2 75210 -- MSL 422 ( 9E 202)
+u0065_0328 6831,6240,2727,3648,-1958,373 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 18051,24825,600,8421,-1511,373 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 5367,23496,195,11004,-2354,373 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 18051,20106,600,9780,-1511,373 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 7806,20106,195,8715,-2354,373 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 15612,24825,2220,6954,-4553,373 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 8295,9885,195,4122,-2045,373 0 75249 -- MSL 447 ( 9E 241)
+u004E_030C 15612,25035,2220,8529,-4553,373 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 8295,9993,195,4686,-2045,373 0 75250 -- MSL 449 ( 9E 242)
+u004F_030B 18051,24825,600,5169,-3554,373 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 7317,9885,195,6870,-1922,373 0 75253 -- MSL 453 ( 9E 245)
+u0052_0301 15126,24825,600,6837,-1316,373 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 5856,9885,0,5661,-1997,373 0 75232 -- MSL 457 ( 9E 224)
+u0052_030C 15126,25035,600,7422,-1316,373 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 5856,9993,0,5907,-1997,373 0 75256 -- MSL 459 ( 9E 248)
+u0053_0301 17565,24825,600,7359,-1559,373 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 5856,11025,195,6111,-1673,373 0 75164 -- MSL 463 ( 9E 156)
+u0054_030C 15612,25035,600,8829,-3008,373 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 5856,13506,195,6465,-2210,373 0 75165 -- MSL 467 ( 9E 157)
+u0054_0327 15612,19590,4569,7557,-3008,373 2 75230 -- MSL 468 ( 9E 222)
+u0074_0327 4878,12324,4206,4935,-1139,373 0 75262 -- MSL 469 ( 9E 254)
+u0055_030B 16587,24825,2220,7305,-4907,373 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 8781,9885,195,5238,-2501,373 0 75259 -- MSL 475 ( 9E 251)
+u0055_030A 16587,24315,2220,7305,-4907,373 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 8781,10395,195,3834,-2501,373 0 75257 -- MSL 477 ( 9E 249)
+u005A_0301 18051,24825,270,7545,-1265,373 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 5856,9885,0,5901,-1331,373 0 75167 -- MSL 483 ( 9E 159)
+u005A_0307 18051,23370,270,7545,-1265,373 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 5856,9240,0,4245,-1331,373 0 75199 -- MSL 485 ( 9E 191)
+u2070 6342,12150,0,5367,-3551,373 0 51753 -- MSL 1000 ( 6J 41)
+u2074 6342,12504,0,5178,-3602,373 0 51748 -- MSL 1001 ( 6J 36)
+u2075 6342,12000,0,5043,-3029,373 0 51749 -- MSL 1002 ( 6J 37)
+u2076 6342,12642,0,4938,-3590,373 0 51806 -- MSL 1003 ( 6J 94)
+u2077 6342,12000,0,5301,-4556,373 0 51750 -- MSL 1004 ( 6J 38)
+u2078 6342,12150,0,5265,-3677,373 0 51754 -- MSL 1005 ( 6J 42)
+u2079 6342,12150,0,5232,-4034,373 0 51752 -- MSL 1006 ( 6J 40)
+lq 7317,19590,0,6600,-6074,373 2 161171 -- MSL 1017 (19U 147)
+rq 7317,19590,0,6600,-6074,373 2 161172 -- MSL 1018 (19U 148)
+Bq 7317,2064,2151,2220,-1694,373 0 161156 -- MSL 1019 (19U 132)
+u2003 13662,0,0,0,1317 0 51821 -- MSL 1020 ( 6J 109)
+u2002 10734,0,0,0,1317 0 51822 -- MSL 1021 ( 6J 110)
+u2009 5367,0,0,0,1317 0 51828 -- MSL 1023 ( 6J 116)
+u2026 13662,1950,195,2514,-2420,373 0 161157 -- MSL 1028 (19U 133)
+vz 5856,9993,0,5907,-1331,373 0 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,17703,0,8175,-6617,373 0 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056,4212,-4913,373 2 51794 -- MSL 1036 ( 6J 82)
+fi 10245,19920,6555,4416,-41,373 3 60077 -- MSL 1040 ( 7J 173)
+fl 10734,19920,6555,8226,-41,373 3 60078 -- MSL 1041 ( 7J 174)
+ff 11220,19920,6555,8130,-44,373 3 51883 -- MSL 1042 ( 6J 171)
+Fi 15612,19920,6555,4413,-38,373 3 51884 -- MSL 1043 ( 6J 172)
+Fl 16587,19914,6429,8226,-41,373 3 51885 -- MSL 1044 ( 6J 173)
+ij 9270,10146,6555,4560,-2342,373 1 60134 -- MSL 1047 ( 7J 230)
+u2105 15612,12330,600,4140,-4076,373 0 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 15126,23580,6765,7752,-2897,373 3 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 8295,9810,6555,4644,-1463,373 1 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 17565,19590,4569,7359,-1559,373 2 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 5856,7410,4206,3423,-1418,373 0 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 15126,23370,600,5337,-1199,373 2 46301 -- MSL 1065 ( 5T 221)
+bq 4392,2064,2151,2655,-2414,373 0 161154 -- MSL 1067 (19U 130)
+%0 17565,12180,195,3261,-3656,373 0 161161 -- MSL 1068 (19U 137)
+a- 10734,8115,0,2277,-6512,373 0 60154 -- MSL 1084 ( 7J 250)
+ab 10734,9810,0,2814,-6065,373 0 75170 -- MSL 1086 ( 9E 162)
+a. 10734,9240,0,1182,-7526,373 0 75263 -- MSL 1088 ( 9E 255)
+oe 11220,6240,195,3690,-1922,373 0 161180 -- MSL 1090 (19U 156)
+OE 26346,19590,600,4215,-3722,373 2 161164 -- MSL 1091 (19U 140)
+fo 4878,6840,870,4353,-1841,373 0 161163 -- MSL 1092 (19U 139)
+fc 4878,6840,870,3207,-695,373 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624,0,0,-2021 0 60091 -- MSL 1094 ( 7J 187)
+/L 18051,19590,600,6657,-1511,373 2 75171 -- MSL 1095 ( 9E 163)
+/l 6342,19920,195,7704,-1943,373 2 75187 -- MSL 1096 ( 9E 179)
+a" 10734,9885,0,4803,-6143,373 0 75197 -- MSL 1097 ( 9E 189)
+ho 10734,318,2727,1575,-6617,373 0 75186 -- MSL 1098 ( 9E 178)
+vZ 18051,25035,270,7545,-1265,373 2 75150 -- MSL 1106 ( 9E 142)
+IJ 25371,19590,6519,5952,-1199,373 3 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/CR b/font/devlj4/CR
new file mode 100644
index 0000000..08f4856
--- /dev/null
+++ b/font/devlj4/CR
@@ -0,0 +1,330 @@
+# Courier
+name CR
+spacewidth 15873
+pcltypeface 4099
+pclproportional 0
+pclweight 0
+pclstyle 0
+charset
+! 15873,15060,330 0 161057 -- MSL 1 (19U 33)
+dq 15873,15060 0 161058 -- MSL 2 (19U 34)
+" "
+sh 15873,16827,2040 2 161059 -- MSL 3 (19U 35)
+# "
+Do 15873,17247,3642 2 161060 -- MSL 4 (19U 36)
+$ "
+% 15873,16380,330 2 161061 -- MSL 5 (19U 37)
+& 15873,14187,330 0 161062 -- MSL 6 (19U 38)
+cq 15873,15060 0 161170 -- MSL 8 (19U 146)
+' "
+( 15873,17070,2580 2 161064 -- MSL 9 (19U 40)
+) 15873,17070,2580 2 161065 -- MSL 10 (19U 41)
+* 15873,15060 0 161066 -- MSL 11 (19U 42)
++ 15873,11385 0 161067 -- MSL 12 (19U 43)
+, 15873,3195,3420 0 161068 -- MSL 13 (19U 44)
+hy 15873,7275 0 161069 -- MSL 14 (19U 45)
+- "
+. 15873,2805,330 0 161070 -- MSL 15 (19U 46)
+sl 15873,18465,3765 2 161071 -- MSL 16 (19U 47)
+/ "
+0 15873,15390,330 0 161072 -- MSL 17 (19U 48)
+1 15873,15060 0 161073 -- MSL 18 (19U 49)
+2 15873,15390 0 161074 -- MSL 19 (19U 50)
+3 15873,15390,330 0 161075 -- MSL 20 (19U 51)
+4 15873,15060 0 161076 -- MSL 21 (19U 52)
+5 15873,15060,330 0 161077 -- MSL 22 (19U 53)
+6 15873,15390,330 0 161078 -- MSL 23 (19U 54)
+7 15873,15060 0 161079 -- MSL 24 (19U 55)
+8 15873,15390,330 0 161080 -- MSL 25 (19U 56)
+9 15873,15390,330 0 161081 -- MSL 26 (19U 57)
+: 15873,9705,393 0 161082 -- MSL 27 (19U 58)
+; 15873,9705,3420 0 161083 -- MSL 28 (19U 59)
+< 15873,10647,3 0 161084 -- MSL 29 (19U 60)
+= 15873,8451 0 161085 -- MSL 30 (19U 61)
+> 15873,10647,3 0 161086 -- MSL 31 (19U 62)
+? 15873,15390,330 0 161087 -- MSL 32 (19U 63)
+at 15873,14391,363 0 161088 -- MSL 33 (19U 64)
+@ "
+A 15873,15060 0 161089 -- MSL 34 (19U 65)
+B 15873,15060 0 161090 -- MSL 35 (19U 66)
+C 15873,15390,330 0 161091 -- MSL 36 (19U 67)
+D 15873,15060 0 161092 -- MSL 37 (19U 68)
+E 15873,15060 0 161093 -- MSL 38 (19U 69)
+F 15873,15060 0 161094 -- MSL 39 (19U 70)
+G 15873,15390,330 0 161095 -- MSL 40 (19U 71)
+H 15873,15060 0 161096 -- MSL 41 (19U 72)
+I 15873,15060 0 161097 -- MSL 42 (19U 73)
+J 15873,15060,330 0 161098 -- MSL 43 (19U 74)
+K 15873,15060 0 161099 -- MSL 44 (19U 75)
+L 15873,15060 0 161100 -- MSL 45 (19U 76)
+M 15873,15060 0 161101 -- MSL 46 (19U 77)
+N 15873,15060 0 161102 -- MSL 47 (19U 78)
+O 15873,15390,330 0 161103 -- MSL 48 (19U 79)
+P 15873,15060 0 161104 -- MSL 49 (19U 80)
+Q 15873,15390,3360 0 161105 -- MSL 50 (19U 81)
+R 15873,15060 0 161106 -- MSL 51 (19U 82)
+S 15873,15390,330 0 161107 -- MSL 52 (19U 83)
+T 15873,15060 0 161108 -- MSL 53 (19U 84)
+U 15873,15060,330 0 161109 -- MSL 54 (19U 85)
+V 15873,15060 0 161110 -- MSL 55 (19U 86)
+W 15873,15060 0 161111 -- MSL 56 (19U 87)
+X 15873,15060 0 161112 -- MSL 57 (19U 88)
+Y 15873,15060 0 161113 -- MSL 58 (19U 89)
+Z 15873,15060 0 161114 -- MSL 59 (19U 90)
+lB 15873,17070,2580 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 15873,18465,3765 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 15873,17070,2580 2 161117 -- MSL 62 (19U 93)
+] "
+ha 15873,19758 2 161118 -- MSL 63 (19U 94)
+_ 15873,0,6588 1 161119 -- MSL 64 (19U 95)
+oq 15873,15060 0 161169 -- MSL 66 (19U 145)
+` "
+a 15873,11775,330 0 161121 -- MSL 67 (19U 97)
+b 15873,16500,330 2 161122 -- MSL 68 (19U 98)
+c 15873,11775,330 0 161123 -- MSL 69 (19U 99)
+d 15873,16500,330 2 161124 -- MSL 70 (19U 100)
+e 15873,11775,330 0 161125 -- MSL 71 (19U 101)
+f 15873,16500 2 161126 -- MSL 72 (19U 102)
+g 15873,11775,5145 1 161127 -- MSL 73 (19U 103)
+h 15873,16500 2 161128 -- MSL 74 (19U 104)
+i 15873,17235 2 161129 -- MSL 75 (19U 105)
+j 15873,17235,5145 3 161130 -- MSL 76 (19U 106)
+k 15873,16500 2 161131 -- MSL 77 (19U 107)
+l 15873,16500 2 161132 -- MSL 78 (19U 108)
+m 15873,11775 0 161133 -- MSL 79 (19U 109)
+n 15873,11775 0 161134 -- MSL 80 (19U 110)
+o 15873,11775,330 0 161135 -- MSL 81 (19U 111)
+p 15873,11775,5145 1 161136 -- MSL 82 (19U 112)
+q 15873,11775,5145 1 161137 -- MSL 83 (19U 113)
+r 15873,11775 0 161138 -- MSL 84 (19U 114)
+s 15873,11775,330 0 161139 -- MSL 85 (19U 115)
+t 15873,14826,330 0 161140 -- MSL 86 (19U 116)
+u 15873,11445,330 0 161141 -- MSL 87 (19U 117)
+v 15873,11445 0 161142 -- MSL 88 (19U 118)
+w 15873,11445 0 161143 -- MSL 89 (19U 119)
+x 15873,11445 0 161144 -- MSL 90 (19U 120)
+y 15873,11445,5145 1 161145 -- MSL 91 (19U 121)
+z 15873,11445 0 161146 -- MSL 92 (19U 122)
+{ 15873,20130,6075 3 161147 -- MSL 93 (19U 123)
+lC "
+| 15873,19758,6588 3 161148 -- MSL 94 (19U 124)
+ba "
+} 15873,20130,6075 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 15873,7233 0 161150 -- MSL 96 (19U 126)
+`A 15873,21180 2 161216 -- MSL 99 (19U 192)
+^A 15873,21180 2 161218 -- MSL 100 (19U 194)
+`E 15873,21180 2 161224 -- MSL 101 (19U 200)
+^E 15873,21180 2 161226 -- MSL 102 (19U 202)
+:E 15873,20670 2 161227 -- MSL 103 (19U 203)
+^I 15873,21180 2 161230 -- MSL 104 (19U 206)
+:I 15873,20670 2 161231 -- MSL 105 (19U 207)
+aa 15873,17565 2 161204 -- MSL 106 (19U 180)
+ga 15873,17565 2 161120 -- MSL 107 (19U 96)
+a^ 15873,17565 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 15873,16905 2 161192 -- MSL 109 (19U 168)
+~ 15873,16830 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 15873,21180,330 2 161241 -- MSL 111 (19U 217)
+^U 15873,21180,330 2 161243 -- MSL 112 (19U 219)
+u00AF 15873,21108 2 161199 -- MSL 113 (19U 175)
+'Y 15873,21180 2 161245 -- MSL 114 (19U 221)
+'y 15873,17565,5145 3 161277 -- MSL 115 (19U 253)
+de 15873,15390 0 161200 -- MSL 116 (19U 176)
+,C 15873,15390,5175 1 161223 -- MSL 117 (19U 199)
+,c 15873,11775,4815 1 161255 -- MSL 118 (19U 231)
+~N 15873,20571 2 161233 -- MSL 119 (19U 209)
+~n 15873,16830 2 161265 -- MSL 120 (19U 241)
+r! 15873,11880,3510 0 161185 -- MSL 121 (19U 161)
+r? 15873,11898,3822 0 161215 -- MSL 122 (19U 191)
+Cs 15873,15684 2 161188 -- MSL 123 (19U 164)
+Po 15873,15390,330 0 161187 -- MSL 124 (19U 163)
+Ye 15873,15060 0 161189 -- MSL 125 (19U 165)
+sc 15873,15390,1905 0 161191 -- MSL 126 (19U 167)
+Fn 15873,15090,4350 0 161155 -- MSL 127 (19U 131)
+ct 15873,16179,1431 2 161186 -- MSL 128 (19U 162)
+^a 15873,17565,330 2 161250 -- MSL 129 (19U 226)
+^e 15873,17565,330 2 161258 -- MSL 130 (19U 234)
+^o 15873,17565,330 2 161268 -- MSL 131 (19U 244)
+^u 15873,17565,330 2 161275 -- MSL 132 (19U 251)
+'a 15873,17565,330 2 161249 -- MSL 133 (19U 225)
+'e 15873,17565,330 2 161257 -- MSL 134 (19U 233)
+'o 15873,17565,330 2 161267 -- MSL 135 (19U 243)
+'u 15873,17565,330 2 161274 -- MSL 136 (19U 250)
+`a 15873,17565,330 2 161248 -- MSL 137 (19U 224)
+`e 15873,17565,330 2 161256 -- MSL 138 (19U 232)
+`o 15873,17565,330 2 161266 -- MSL 139 (19U 242)
+`u 15873,17565,330 2 161273 -- MSL 140 (19U 249)
+:a 15873,16905,330 2 161252 -- MSL 141 (19U 228)
+:e 15873,16905,330 2 161259 -- MSL 142 (19U 235)
+:o 15873,16905,330 2 161270 -- MSL 143 (19U 246)
+:u 15873,16905,330 2 161276 -- MSL 144 (19U 252)
+oA 15873,21690 2 161221 -- MSL 145 (19U 197)
+^i 15873,17565 2 161262 -- MSL 146 (19U 238)
+/O 15873,15591,612 2 161240 -- MSL 147 (19U 216)
+AE 15873,15060 0 161222 -- MSL 148 (19U 198)
+oa 15873,17997,330 2 161253 -- MSL 149 (19U 229)
+'i 15873,17565 2 161261 -- MSL 150 (19U 237)
+/o 15873,11856,459 0 161272 -- MSL 151 (19U 248)
+ae 15873,11775,330 0 161254 -- MSL 152 (19U 230)
+:A 15873,20670 2 161220 -- MSL 153 (19U 196)
+`i 15873,17565 2 161260 -- MSL 154 (19U 236)
+:O 15873,20670,330 2 161238 -- MSL 155 (19U 214)
+:U 15873,20670,330 2 161244 -- MSL 156 (19U 220)
+'E 15873,21180 2 161225 -- MSL 157 (19U 201)
+:i 15873,16905 2 161263 -- MSL 158 (19U 239)
+ss 15873,16500,330 2 161247 -- MSL 159 (19U 223)
+^O 15873,21180,330 2 161236 -- MSL 160 (19U 212)
+'A 15873,21180 2 161217 -- MSL 161 (19U 193)
+~A 15873,20571 2 161219 -- MSL 162 (19U 195)
+~a 15873,16830,330 2 161251 -- MSL 163 (19U 227)
+-D 15873,15060 0 161232 -- MSL 164 (19U 208)
+Sd 15873,18015,330 2 161264 -- MSL 165 (19U 240)
+'I 15873,21180 2 161229 -- MSL 166 (19U 205)
+`I 15873,21180 2 161228 -- MSL 167 (19U 204)
+'O 15873,21180,330 2 161235 -- MSL 168 (19U 211)
+`O 15873,21180,330 2 161234 -- MSL 169 (19U 210)
+~O 15873,20571,330 2 161237 -- MSL 170 (19U 213)
+~o 15873,16830,330 2 161269 -- MSL 171 (19U 245)
+vS 15873,21180,330 2 161162 -- MSL 172 (19U 138)
+vs 15873,17565,330 2 161178 -- MSL 173 (19U 154)
+'U 15873,21180,330 2 161242 -- MSL 174 (19U 218)
+:Y 15873,20670 2 161183 -- MSL 175 (19U 159)
+:y 15873,16905,5145 3 161279 -- MSL 176 (19U 255)
+TP 15873,15060 0 161246 -- MSL 177 (19U 222)
+Tp 15873,16500,5145 3 161278 -- MSL 178 (19U 254)
+mc 15873,11445,5595 1 161205 -- MSL 180 (19U 181)
+ps 15873,19635,4080 2 161206 -- MSL 181 (19U 182)
+34 15873,15519,2673 2 161214 -- MSL 182 (19U 190)
+\- 15873,6435 0 60096 -- MSL 183 ( 7J 192)
+14 15873,15519,2673 2 161212 -- MSL 184 (19U 188)
+12 15873,15519,2673 2 161213 -- MSL 185 (19U 189)
+Of 15873,15390 0 161194 -- MSL 186 (19U 170)
+Om 15873,15390 0 161210 -- MSL 187 (19U 186)
+Fo 15873,11490 0 161195 -- MSL 188 (19U 171)
+Fc 15873,11490 0 161211 -- MSL 190 (19U 187)
+t+- 15873,11385,2835 0 161201 -- MSL 191 (19U 177)
+bb 15873,19083,5916 3 161190 -- MSL 192 (19U 166)
+co 15873,19635 2 161193 -- MSL 193 (19U 169)
+tno 15873,8865 0 161196 -- MSL 194 (19U 172)
+u00AD 15873,7275 0 161197 -- MSL 195 (19U 173)
+rg 15873,19635 2 161198 -- MSL 196 (19U 174)
+S2 15873,15240 0 161202 -- MSL 197 (19U 178)
+S3 15873,15240 0 161203 -- MSL 198 (19U 179)
+ac 15873,0,4815 1 161208 -- MSL 199 (19U 184)
+S1 15873,15060 0 161209 -- MSL 200 (19U 185)
+tmu 15873,11340 0 161239 -- MSL 201 (19U 215)
+tdi 15873,10530 0 161271 -- MSL 202 (19U 247)
+u203C 15873,15060,330 0 87315 -- MSL 221 (10U 19)
+u20A7 15873,15060,330 0 60121 -- MSL 232 ( 7J 217)
+pc 15873,8931 0 161207 -- MSL 302 (19U 183)
+u013F 15873,15060 0 51943 -- MSL 306 ( 6J 231)
+u0140 15873,16500 2 51959 -- MSL 307 ( 6J 247)
+u2113 15873,18150,297 2 60122 -- MSL 308 ( 7J 218)
+u0149 15873,15060 0 51951 -- MSL 309 ( 6J 239)
+fm 15873,15060 0 60101 -- MSL 310 ( 7J 197)
+sd 15873,15060 0 60102 -- MSL 311 ( 7J 198)
+dg 15873,15060,1290 0 161158 -- MSL 312 (19U 134)
+tm 15873,17850 2 161177 -- MSL 313 (19U 153)
+u2017 15873,0,6588 1 60095 -- MSL 314 ( 7J 191)
+ah 15873,17565 2 75169 -- MSL 315 ( 9E 161)
+ao 15873,17997 2 60152 -- MSL 316 ( 7J 248)
+f/ 15873,15519,2673 2 60109 -- MSL 324 ( 7J 205)
+em 15873,7275 0 161175 -- MSL 325 (19U 151)
+en 15873,7275 0 161174 -- MSL 326 (19U 150)
+dd 15873,15060,1290 0 161159 -- MSL 327 (19U 135)
+.i 15873,11445 0 46333 -- MSL 328 ( 5T 253)
+aq 15873,15060 0 161063 -- MSL 329 (19U 39)
+bu 15873,12714 0 161173 -- MSL 331 (19U 149)
+u207F 15873,15240 0 87548 -- MSL 332 (10U 252)
+u0111 15873,16500,330 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 15873,20133 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 15873,16725,330 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 15873,15060,3624 0 75173 -- MSL 404 ( 9E 165)
+u0061_0328 15873,11775,4263 0 75193 -- MSL 405 ( 9E 185)
+'C 15873,21180,330 2 75206 -- MSL 406 ( 9E 198)
+'c 15873,17565,330 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 15873,21180,330 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 15873,17565,330 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 15873,21180 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 15873,18870,330 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 15873,21180 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 15873,17565,330 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 15873,15060,3624 0 75210 -- MSL 422 ( 9E 202)
+u0065_0328 15873,11775,4263 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 15873,21180 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 15873,22326 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 15873,18870 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 15873,18870 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 15873,21180 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 15873,17565 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 15873,21180 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 15873,17565 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 15873,21810,330 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 15873,18195,330 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 15873,21180 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 15873,17565 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 15873,21180 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 15873,17565 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 15873,21180,330 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 15873,17565,330 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 15873,21180 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 15873,18870,330 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 15873,15060,5175 1 75230 -- MSL 468 ( 9E 222)
+u0074_0327 15873,14826,4815 1 75262 -- MSL 469 ( 9E 254)
+u0055_030B 15873,21810,330 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 15873,18195,330 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 15873,21690,330 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 15873,17997,330 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 15873,21180 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 15873,17565 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 15873,20670 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 15873,16905 2 75199 -- MSL 485 ( 9E 191)
+u2070 15873,15240 0 51753 -- MSL 1000 ( 6J 41)
+u2074 15873,15060 0 51748 -- MSL 1001 ( 6J 36)
+u2075 15873,15060 0 51749 -- MSL 1002 ( 6J 37)
+u2076 15873,15240 0 51806 -- MSL 1003 ( 6J 94)
+u2077 15873,15060 0 51750 -- MSL 1004 ( 6J 38)
+u2078 15873,15240 0 51754 -- MSL 1005 ( 6J 42)
+u2079 15873,15240 0 51752 -- MSL 1006 ( 6J 40)
+lq 15873,15060 0 161171 -- MSL 1017 (19U 147)
+rq 15873,15060 0 161172 -- MSL 1018 (19U 148)
+Bq 15873,3495,3120 0 161156 -- MSL 1019 (19U 132)
+u2003 15873,0 0 51821 -- MSL 1020 ( 6J 109)
+u2002 15873,0 0 51822 -- MSL 1021 ( 6J 110)
+u2009 15873,0 0 51828 -- MSL 1023 ( 6J 116)
+u2026 15873,2805,330 0 161157 -- MSL 1028 (19U 133)
+vz 15873,17565 2 75166 -- MSL 1031 ( 9E 158)
+u2120 15873,18000 2 128299 -- MSL 1034 (15U 43)
+u211E 15873,15060,2466 0 51794 -- MSL 1036 ( 6J 82)
+fi 15873,17235 2 60077 -- MSL 1040 ( 7J 173)
+fl 15873,16500 2 60078 -- MSL 1041 ( 7J 174)
+ff 15873,16500 2 51883 -- MSL 1042 ( 6J 171)
+Fi 15873,16500 2 51884 -- MSL 1043 ( 6J 172)
+Fl 15873,16500 2 51885 -- MSL 1044 ( 6J 173)
+ij 15873,17235,5145 3 60134 -- MSL 1047 ( 7J 230)
+u2105 15873,15543,2634 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 15873,20133,330 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 15873,16725,5145 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 15873,15390,5175 1 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 15873,11775,4815 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 15873,20670 2 46301 -- MSL 1065 ( 5T 221)
+bq 15873,3495,3120 0 161154 -- MSL 1067 (19U 130)
+%0 15873,16380,330 2 161161 -- MSL 1068 (19U 137)
+a- 15873,15726 2 60154 -- MSL 1084 ( 7J 250)
+ab 15873,16725 2 75170 -- MSL 1086 ( 9E 162)
+a. 15873,16905 2 75263 -- MSL 1088 ( 9E 255)
+oe 15873,11775,330 0 161180 -- MSL 1090 (19U 156)
+OE 15873,15060 0 161164 -- MSL 1091 (19U 140)
+fo 15873,10845 0 161163 -- MSL 1092 (19U 139)
+fc 15873,10845 0 161179 -- MSL 1093 (19U 155)
+sq 15873,14106 0 60091 -- MSL 1094 ( 7J 187)
+/L 15873,15060 0 75171 -- MSL 1095 ( 9E 163)
+/l 15873,16500 2 75187 -- MSL 1096 ( 9E 179)
+a" 15873,18195 2 75197 -- MSL 1097 ( 9E 189)
+ho 15873,0,4263 0 75186 -- MSL 1098 ( 9E 178)
+vZ 15873,21180 2 75150 -- MSL 1106 ( 9E 142)
+IJ 15873,15060,2850 0 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/DESC.in b/font/devlj4/DESC.in
new file mode 100644
index 0000000..b726647
--- /dev/null
+++ b/font/devlj4/DESC.in
@@ -0,0 +1,9 @@
+hor 1
+vert 1
+sizescale 4
+sizes 1-3999 0
+styles R I B BI
+fonts 6 0 0 0 0 0 S
+family T
+tcommand
+postpro grolj4
diff --git a/font/devlj4/GB b/font/devlj4/GB
new file mode 100644
index 0000000..55bf288
--- /dev/null
+++ b/font/devlj4/GB
@@ -0,0 +1,718 @@
+# Garmond Hlb
+name GB
+spacewidth 7317
+pcltypeface 4197
+pclproportional 1
+pclweight 3
+pclstyle 0
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -2924
+P . -3902
+P , -3902
+V A -3413
+A V -4388
+T o -4388
+T r -2924
+T c -3902
+T e -3902
+T d -3902
+T s -2924
+T y -3413
+T a -2924
+T w -3413
+T u -2924
+L T -2924
+L Y -2924
+Y o -3902
+Y e -3413
+Y a -3413
+A W -4388
+W A -3413
+T A -2924
+V o -3413
+V e -2924
+V a -2924
+Y A -3413
+F A -2438
+F . -3902
+F , -3902
+A T -2924
+A Y -3413
+v . -2438
+v , -2438
+y . -2438
+y , -2438
+T . -2924
+T , -2924
+L W -2924
+P A -2438
+V . -3902
+V , -3902
+Y . -3413
+Y , -3413
+W o -3413
+W e -2924
+W a -2924
+W . -3902
+W , -3902
+r . -1949
+r , -1949
+w . -974
+w , -974
+Y u -2438
+A v -1949
+A y -1949
+A w -1949
+o . -1460
+o , -1460
+p . -1460
+p , -1460
+e . -974
+e , -974
+b . -1460
+b , -1460
+O T -1949
+O V -1949
+O Y -1949
+O . -1949
+O , -1949
+L y -974
+V y -1949
+V u -1949
+V O -1949
+V G -1949
+V C -1949
+V Q -1949
+D T -1949
+D V -1949
+D Y -1949
+D . -1949
+D , -1949
+Y O -1949
+Y G -1949
+Y C -1949
+Y Q -1949
+F o -1460
+F e -974
+F a -974
+O A -974
+O W -1949
+L U -485
+R T -1949
+R V -1949
+R Y -1949
+R W -1949
+G T -485
+P o -1460
+P g -974
+P e -974
+P a -974
+D A -974
+D W -1949
+B T -974
+B Y -974
+B . -974
+B , -974
+A O -974
+A G -974
+A C -974
+A U -1460
+A Q -974
+W r -1949
+W y -1949
+W u -1949
+W O -1949
+W G -1949
+W C -1949
+W Q -1949
+J A -485
+J . -485
+J , -485
+U A -1460
+U . -1949
+U , -1949
+Q A -974
+Q W -1949
+T O -1949
+T G -1949
+T C -1949
+T Q -1949
+O X -1460
+L o -485
+G V -485
+G Y -485
+G W -485
+G . -485
+G , -485
+P T -974
+P V -974
+P Y -974
+D X -1460
+B V -974
+B X -974
+B A -974
+B W -974
+S . -974
+S , -974
+X o -1460
+X e -974
+X y -1460
+X O -1460
+X G -1460
+X C -1460
+X Q -1460
+A o -1460
+A e -974
+Q X -1460
+K o -1460
+K e -974
+K y -974
+K w -974
+K O -974
+K G -974
+K C -974
+K Q -974
+o v -1460
+o y -1460
+o x -1460
+o w -1460
+h v -974
+h y -974
+n v -974
+n y -974
+m v -974
+m y -974
+r g -974
+p v -974
+p y -974
+p x -974
+v o -1460
+v g -974
+v c -974
+v d -974
+v a -974
+v q -974
+e v -485
+e y -485
+b v -974
+b y -974
+b w -974
+s . -485
+s , -485
+y o -1460
+y g -974
+y c -974
+y d -974
+y a -974
+y q -974
+x o -1460
+x c -974
+x e -974
+x d -974
+x q -974
+a v -974
+a y -974
+a w -974
+w o -1460
+w g -974
+w c -974
+w d -974
+w a -974
+w q -974
+T S -974
+R o -1460
+R y -1460
+R O -1460
+R G -1460
+R C -1460
+R U -1460
+R Q -1460
+G X -485
+G A -485
+P s -485
+P Z -974
+P X -974
+P W -974
+V S -974
+S A -974
+Y S -974
+A t -485
+A c -974
+A d -974
+A q -974
+W S -974
+K c -974
+o f -485
+h w -974
+n w -974
+m w -974
+r o -1460
+r c -974
+r e -974
+r d -974
+r a -974
+r q -974
+p w -974
+v e -974
+v s -485
+e x -485
+e w -485
+y e -974
+y s -485
+f o -1460
+f c -974
+f e -974
+f d -974
+f q -974
+w e -974
+w s -485
+k o -974
+k c -485
+k e -485
+k d -485
+k q -485
+O Z -974
+R e -974
+G Z -485
+E o -485
+E v -974
+E y -974
+E w -974
+Z o -485
+Z y -974
+Z w -974
+D Z -974
+B Z -974
+J o -485
+U g -485
+t o -974
+t c -485
+t e -485
+t d -485
+t q -485
+o t -485
+o g -485
+o z -974
+o j -485
+r s -485
+g o -974
+g c -485
+g e -485
+g d -485
+g q -485
+p z -485
+e z -485
+z o -974
+z c -485
+z e -485
+z d -485
+z q -485
+b z -485
+C o -485
+C y -974
+B o -485
+B y -485
+B S -485
+B U -485
+U o -974
+U c -485
+U e -485
+U d -485
+U s -485
+U a -485
+U q -485
+L cq -2924
+L ' -2924
+T hy -3413
+T - -3413
+T en -3413
+T em -3413
+A cq -2924
+A ' -2924
+hy T -3413
+- T -3413
+en T -3413
+em T -3413
+Y hy -2438
+Y - -2438
+Y en -2438
+Y em -2438
+p cq -1460
+p ' -1460
+e cq -485
+e ' -485
+b cq -974
+b ' -974
+a cq -974
+a ' -974
+V hy -1949
+V - -1949
+V en -1949
+V em -1949
+h cq -974
+h ' -974
+n cq -974
+n ' -974
+m cq -974
+m ' -974
+R cq -1460
+R ' -1460
+W hy -1949
+W - -1949
+W en -1949
+W em -1949
+cq d -1460
+' d -1460
+X hy -1460
+X - -1460
+X en -1460
+X em -1460
+A hy -974
+A - -974
+A en -974
+A em -974
+K hy -974
+K - -974
+K en -974
+K em -974
+cq s -485
+' s -485
+hy X -1460
+- X -1460
+hy A -974
+- A -974
+en X -1460
+en A -974
+em X -1460
+R hy -1460
+R - -1460
+R en -1460
+R em -1460
+G cq -485
+G ' -485
+B cq -485
+B ' -485
+charset
+! 7317,18948,390 2 161057 -- MSL 1 (19U 33)
+dq 10734,18987 2 161058 -- MSL 2 (19U 34)
+" "
+sh 13173,17805,390 0 161059 -- MSL 3 (19U 35)
+# "
+Do 13173,19584,1779 2 161060 -- MSL 4 (19U 36)
+$ "
+% 21954,17805,390 0 161061 -- MSL 5 (19U 37)
+& 22443,18165,390 0 161062 -- MSL 6 (19U 38)
+cq 6831,18555 2 161170 -- MSL 8 (19U 146)
+' "
+( 8295,20250,6705 3 161064 -- MSL 9 (19U 40)
+) 8295,20250,6705 3 161065 -- MSL 10 (19U 41)
+* 13173,18555 2 161066 -- MSL 11 (19U 42)
++ 21954,13467,87 0 161067 -- MSL 12 (19U 43)
+, 7317,3972,4152 0 161068 -- MSL 13 (19U 44)
+hy 7317,7575 0 161069 -- MSL 14 (19U 45)
+- "
+. 7317,3915,390 0 161070 -- MSL 15 (19U 46)
+sl 13173,20250,300 2 161071 -- MSL 16 (19U 47)
+/ "
+0 13173,17805,390 0 161072 -- MSL 17 (19U 48)
+1 13173,17805,150 0 161073 -- MSL 18 (19U 49)
+2 13173,17805,150 0 161074 -- MSL 19 (19U 50)
+3 13173,17805,390 0 161075 -- MSL 20 (19U 51)
+4 13173,17805 0 161076 -- MSL 21 (19U 52)
+5 13173,17490,390 0 161077 -- MSL 22 (19U 53)
+6 13173,17805,390 0 161078 -- MSL 23 (19U 54)
+7 13173,17415,390 0 161079 -- MSL 24 (19U 55)
+8 13173,17805,390 0 161080 -- MSL 25 (19U 56)
+9 13173,17805,390 0 161081 -- MSL 26 (19U 57)
+: 7317,11940,390 0 161082 -- MSL 27 (19U 58)
+; 7317,11940,4152 0 161083 -- MSL 28 (19U 59)
+< 26346,16068 0 161084 -- MSL 29 (19U 60)
+= 21954,9654 0 161085 -- MSL 30 (19U 61)
+> 26346,16068 0 161086 -- MSL 31 (19U 62)
+? 10245,18948,390 2 161087 -- MSL 32 (19U 63)
+at 21954,16950,4131 0 161088 -- MSL 33 (19U 64)
+@ "
+A 20004,18939,150 2 161089 -- MSL 34 (19U 65)
+B 17565,18315,150 2 161090 -- MSL 35 (19U 66)
+C 20004,18555,390 2 161091 -- MSL 36 (19U 67)
+D 21954,18555,150 2 161092 -- MSL 37 (19U 68)
+E 16587,18315,150 2 161093 -- MSL 38 (19U 69)
+F 16587,18315,150 2 161094 -- MSL 39 (19U 70)
+G 21468,18555,390 2 161095 -- MSL 40 (19U 71)
+H 23418,18315,150 2 161096 -- MSL 41 (19U 72)
+I 10245,18315,150 2 161097 -- MSL 42 (19U 73)
+J 9759,18315,6363 3 161098 -- MSL 43 (19U 74)
+K 19515,18315,150 2 161099 -- MSL 44 (19U 75)
+L 16101,18315,150 2 161100 -- MSL 45 (19U 76)
+M 24882,18315,390 2 161101 -- MSL 46 (19U 77)
+N 22443,18315,612 2 161102 -- MSL 47 (19U 78)
+O 22932,18555,390 2 161103 -- MSL 48 (19U 79)
+P 16587,18555,150 2 161104 -- MSL 49 (19U 80)
+Q 22932,18555,5253 2 161105 -- MSL 50 (19U 81)
+R 19515,18315,150 2 161106 -- MSL 51 (19U 82)
+S 14148,18555,390 2 161107 -- MSL 52 (19U 83)
+T 17565,19500,138 2 161108 -- MSL 53 (19U 84)
+U 21468,18315,390 2 161109 -- MSL 54 (19U 85)
+V 19515,18315,390 2 161110 -- MSL 55 (19U 86)
+W 26346,18315,390 2 161111 -- MSL 56 (19U 87)
+X 20004,18315,150 2 161112 -- MSL 57 (19U 88)
+Y 18540,18315,150 2 161113 -- MSL 58 (19U 89)
+Z 17565,19500,150 2 161114 -- MSL 59 (19U 90)
+lB 8295,18165,4905 0 161115 -- MSL 60 (19U 91)
+[ "
+rs 13173,20250,300 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 8295,18165,4905 0 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588 1 161119 -- MSL 64 (19U 95)
+oq 6831,18555 2 161169 -- MSL 66 (19U 145)
+` "
+a 12198,12420,390 0 161121 -- MSL 67 (19U 97)
+b 14637,20250,390 2 161122 -- MSL 68 (19U 98)
+c 11220,12420,390 0 161123 -- MSL 69 (19U 99)
+d 14637,20250,390 2 161124 -- MSL 70 (19U 100)
+e 11709,12420,390 0 161125 -- MSL 71 (19U 101)
+f 9270,20250,150 2 161126 -- MSL 72 (19U 102)
+g 14148,12420,6705 1 161127 -- MSL 73 (19U 103)
+h 15612,20250,150 2 161128 -- MSL 74 (19U 104)
+i 7806,19329,150 2 161129 -- MSL 75 (19U 105)
+j 7317,19329,6705 3 161130 -- MSL 76 (19U 106)
+k 14637,20250,150 2 161131 -- MSL 77 (19U 107)
+l 7806,20250,150 2 161132 -- MSL 78 (19U 108)
+m 22932,12420,150 0 161133 -- MSL 79 (19U 109)
+n 15612,12420,150 0 161134 -- MSL 80 (19U 110)
+o 14148,12420,390 0 161135 -- MSL 81 (19U 111)
+p 14637,12420,6855 1 161136 -- MSL 82 (19U 112)
+q 14637,12420,6855 1 161137 -- MSL 83 (19U 113)
+r 11220,12420,150 0 161138 -- MSL 84 (19U 114)
+s 9759,12420,390 0 161139 -- MSL 85 (19U 115)
+t 9759,15585,390 0 161140 -- MSL 86 (19U 116)
+u 15612,12420,390 0 161141 -- MSL 87 (19U 117)
+v 14148,12180,390 0 161142 -- MSL 88 (19U 118)
+w 20004,12180,390 0 161143 -- MSL 89 (19U 119)
+x 14148,12180,150 0 161144 -- MSL 90 (19U 120)
+y 13662,12180,6705 1 161145 -- MSL 91 (19U 121)
+z 12684,12870,150 0 161146 -- MSL 92 (19U 122)
+{ 13173,19935,6210 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588 3 161148 -- MSL 94 (19U 124)
+ba "
+} 13173,19935,6210 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,9435 0 161150 -- MSL 96 (19U 126)
+`A 20004,24810,150 2 161216 -- MSL 99 (19U 192)
+^A 20004,24810,150 2 161218 -- MSL 100 (19U 194)
+`E 16587,24810,150 2 161224 -- MSL 101 (19U 200)
+^E 16587,24810,150 2 161226 -- MSL 102 (19U 202)
+:E 16587,23505,150 2 161227 -- MSL 103 (19U 203)
+^I 10245,24810,150 2 161230 -- MSL 104 (19U 206)
+:I 10245,23505,150 2 161231 -- MSL 105 (19U 207)
+aa 13173,20475 2 161204 -- MSL 106 (19U 180)
+ga 13173,20475 2 161120 -- MSL 107 (19U 96)
+a^ 13173,20475 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 13173,18090 0 161192 -- MSL 109 (19U 168)
+~ 13173,18324 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 21468,24810,390 2 161241 -- MSL 111 (19U 217)
+^U 21468,24810,390 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105 2 161199 -- MSL 113 (19U 175)
+'Y 18540,24810,150 2 161245 -- MSL 114 (19U 221)
+'y 13662,20475,6705 3 161277 -- MSL 115 (19U 253)
+de 13173,17415 0 161200 -- MSL 116 (19U 176)
+,C 20004,18555,6405 3 161223 -- MSL 117 (19U 199)
+,c 11220,12420,5694 0 161255 -- MSL 118 (19U 231)
+~N 22443,23973,612 2 161233 -- MSL 119 (19U 209)
+~n 15612,18324,150 2 161265 -- MSL 120 (19U 241)
+r! 7317,12330,7008 1 161185 -- MSL 121 (19U 161)
+r? 10245,12330,7008 1 161215 -- MSL 122 (19U 191)
+Cs 13173,15834 0 161188 -- MSL 123 (19U 164)
+Po 13173,17805,390 0 161187 -- MSL 124 (19U 163)
+Ye 13173,18315,150 2 161189 -- MSL 125 (19U 165)
+sc 13173,18555,6705 3 161191 -- MSL 126 (19U 167)
+Fn 13173,20250,6705 3 161155 -- MSL 127 (19U 131)
+ct 13173,18012,57 0 161186 -- MSL 128 (19U 162)
+^a 12198,20475,390 2 161250 -- MSL 129 (19U 226)
+^e 11709,20475,390 2 161258 -- MSL 130 (19U 234)
+^o 14148,20475,390 2 161268 -- MSL 131 (19U 244)
+^u 15612,20475,390 2 161275 -- MSL 132 (19U 251)
+'a 12198,20475,390 2 161249 -- MSL 133 (19U 225)
+'e 11709,20475,390 2 161257 -- MSL 134 (19U 233)
+'o 14148,20475,390 2 161267 -- MSL 135 (19U 243)
+'u 15612,20475,390 2 161274 -- MSL 136 (19U 250)
+`a 12198,20475,390 2 161248 -- MSL 137 (19U 224)
+`e 11709,20475,390 2 161256 -- MSL 138 (19U 232)
+`o 14148,20475,390 2 161266 -- MSL 139 (19U 242)
+`u 15612,20475,390 2 161273 -- MSL 140 (19U 249)
+:a 12198,18090,390 0 161252 -- MSL 141 (19U 228)
+:e 11709,18090,390 0 161259 -- MSL 142 (19U 235)
+:o 14148,18090,390 0 161270 -- MSL 143 (19U 246)
+:u 15612,18090,390 0 161276 -- MSL 144 (19U 252)
+oA 20004,25065,150 2 161221 -- MSL 145 (19U 197)
+^i 7806,20475,150 2 161262 -- MSL 146 (19U 238)
+/O 22932,18729,390 2 161240 -- MSL 147 (19U 216)
+AE 25857,18315,150 2 161222 -- MSL 148 (19U 198)
+oa 12198,19836,390 2 161253 -- MSL 149 (19U 229)
+'i 7806,20475,150 2 161261 -- MSL 150 (19U 237)
+/o 14148,12525,804 0 161272 -- MSL 151 (19U 248)
+ae 18051,12420,390 0 161254 -- MSL 152 (19U 230)
+:A 20004,23505,150 2 161220 -- MSL 153 (19U 196)
+`i 7806,20475,150 2 161260 -- MSL 154 (19U 236)
+:O 22932,23505,390 2 161238 -- MSL 155 (19U 214)
+:U 21468,23505,390 2 161244 -- MSL 156 (19U 220)
+'E 16587,24810,150 2 161225 -- MSL 157 (19U 201)
+:i 7806,18090,150 0 161263 -- MSL 158 (19U 239)
+ss 15612,20250,390 2 161247 -- MSL 159 (19U 223)
+^O 22932,24810,390 2 161236 -- MSL 160 (19U 212)
+'A 20004,24810,150 2 161217 -- MSL 161 (19U 193)
+~A 20004,23973,150 2 161219 -- MSL 162 (19U 195)
+~a 12198,18324,390 2 161251 -- MSL 163 (19U 227)
+-D 21954,18555,150 2 161232 -- MSL 164 (19U 208)
+Sd 14148,20250,390 2 161264 -- MSL 165 (19U 240)
+'I 10245,24810,150 2 161229 -- MSL 166 (19U 205)
+`I 10245,24810,150 2 161228 -- MSL 167 (19U 204)
+'O 22932,24810,390 2 161235 -- MSL 168 (19U 211)
+`O 22932,24810,390 2 161234 -- MSL 169 (19U 210)
+~O 22932,23973,390 2 161237 -- MSL 170 (19U 213)
+~o 14148,18324,390 2 161269 -- MSL 171 (19U 245)
+vS 14148,24810,390 2 161162 -- MSL 172 (19U 138)
+vs 9759,20475,390 2 161178 -- MSL 173 (19U 154)
+'U 21468,24810,390 2 161242 -- MSL 174 (19U 218)
+:Y 18540,23505,150 2 161183 -- MSL 175 (19U 159)
+:y 13662,18090,6705 1 161279 -- MSL 176 (19U 255)
+TP 16587,18315,153 2 161246 -- MSL 177 (19U 222)
+Tp 14637,20250,6855 3 161278 -- MSL 178 (19U 254)
+mc 14637,10800,5193 0 161205 -- MSL 180 (19U 181)
+ps 13173,19635,4200 2 161206 -- MSL 181 (19U 182)
+34 21954,17805,390 0 161214 -- MSL 182 (19U 190)
+\- 21954,7755 0 60096 -- MSL 183 ( 7J 192)
+14 21954,17805,390 0 161212 -- MSL 184 (19U 188)
+12 21954,17805,390 0 161213 -- MSL 185 (19U 189)
+Of 12198,17805 0 161194 -- MSL 186 (19U 170)
+Om 12198,17805 0 161210 -- MSL 187 (19U 186)
+Fo 12684,10605 0 161195 -- MSL 188 (19U 171)
+Fc 12684,10605 0 161211 -- MSL 190 (19U 187)
+t+- 21954,13467,3354 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916 2 161190 -- MSL 192 (19U 166)
+co 13173,19725 2 161193 -- MSL 193 (19U 169)
+tno 21954,10560 0 161196 -- MSL 194 (19U 172)
+u00AD 7317,7575 0 161197 -- MSL 195 (19U 173)
+rg 13173,19725 2 161198 -- MSL 196 (19U 174)
+S2 9270,17805 0 161202 -- MSL 197 (19U 178)
+S3 9270,17805 0 161203 -- MSL 198 (19U 179)
+ac 13173,57,5694 0 161208 -- MSL 199 (19U 184)
+S1 9270,17805 0 161209 -- MSL 200 (19U 185)
+tmu 21954,13470,144 0 161239 -- MSL 201 (19U 215)
+tdi 21954,13383,3 0 161271 -- MSL 202 (19U 247)
+u203C 13662,18948,390 2 87315 -- MSL 221 (10U 19)
+u20A7 26346,18555,390 2 60121 -- MSL 232 ( 7J 217)
+pc 7317,10722 0 161207 -- MSL 302 (19U 183)
+u013F 16101,18315,150 2 51943 -- MSL 306 ( 6J 231)
+u0140 10734,20250,150 2 51959 -- MSL 307 ( 6J 247)
+u2113 13173,18045,765 0 60122 -- MSL 308 ( 7J 218)
+u0149 21468,18555,150 2 51951 -- MSL 309 ( 6J 239)
+fm 13173,17805 0 60101 -- MSL 310 ( 7J 197)
+sd 13173,17805 0 60102 -- MSL 311 ( 7J 198)
+dg 13173,18555,6579 3 161158 -- MSL 312 (19U 134)
+tm 16101,17550 0 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588 1 60095 -- MSL 314 ( 7J 191)
+ah 13173,20475 2 75169 -- MSL 315 ( 9E 161)
+ao 13173,19836 2 60152 -- MSL 316 ( 7J 248)
+f/ 2928,17805,390 0 60109 -- MSL 324 ( 7J 205)
+em 21954,7185 0 161175 -- MSL 325 (19U 151)
+en 13173,7185 0 161174 -- MSL 326 (19U 150)
+dd 13173,18555,4905 2 161159 -- MSL 327 (19U 135)
+.i 7806,12420,150 0 46333 -- MSL 328 ( 5T 253)
+aq 6831,18987 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226 0 161173 -- MSL 331 (19U 149)
+u207F 14637,17805 0 87548 -- MSL 332 (10U 252)
+u0111 14637,20250,390 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 20004,23505,150 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 12198,17079,390 0 75235 -- MSL 401 ( 9E 227)
+u0041_0328 20004,18939,3861 2 75173 -- MSL 404 ( 9E 165)
+u0061_0328 12198,12420,4317 0 75193 -- MSL 405 ( 9E 185)
+'C 20004,24810,390 2 75206 -- MSL 406 ( 9E 198)
+'c 11220,20475,390 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 20004,24810,390 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 11220,20475,390 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 21954,24810,150 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 19029,20250,390 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 16587,24810,150 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 11709,20475,390 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 16587,18315,3861 2 75210 -- MSL 422 ( 9E 202)
+u0065_0328 11709,12420,4317 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 16101,24810,150 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 7806,25500,150 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 16101,18798,150 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 11709,20250,150 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 22443,24810,612 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 15612,20475,150 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 22443,24810,612 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 15612,20475,150 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 22932,24810,390 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 14148,20475,390 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 19515,24810,150 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 11220,20475,150 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 19515,24810,150 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 11220,20475,150 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 14148,24810,390 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 9759,20475,390 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 17565,24810,138 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 11220,20250,390 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 17565,19500,6405 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 9759,15585,5694 0 75262 -- MSL 469 ( 9E 254)
+u0055_030B 21468,24810,390 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 15612,20475,390 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 21468,25065,390 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 15612,19836,390 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 17565,24810,150 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 12684,20475,150 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 17565,23808,150 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 12684,18471,150 2 75199 -- MSL 485 ( 9E 191)
+u2070 9270,17805 0 51753 -- MSL 1000 ( 6J 41)
+u2074 9270,17805 0 51748 -- MSL 1001 ( 6J 36)
+u2075 9270,17625 0 51749 -- MSL 1002 ( 6J 37)
+u2076 9270,17805 0 51806 -- MSL 1003 ( 6J 94)
+u2077 9270,17625 0 51750 -- MSL 1004 ( 6J 38)
+u2078 9270,17805 0 51754 -- MSL 1005 ( 6J 42)
+u2079 9270,17805 0 51752 -- MSL 1006 ( 6J 40)
+lq 12198,18555 2 161171 -- MSL 1017 (19U 147)
+rq 12198,18555 2 161172 -- MSL 1018 (19U 148)
+Bq 12198,3714,3519 0 161156 -- MSL 1019 (19U 132)
+u2003 21954,0 0 51821 -- MSL 1020 ( 6J 109)
+u2002 13173,0 0 51822 -- MSL 1021 ( 6J 110)
+u2009 7317,0 0 51828 -- MSL 1023 ( 6J 116)
+u2026 21954,3261,390 0 161157 -- MSL 1028 (19U 133)
+vz 12684,20475,150 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,17703 0 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056 2 51794 -- MSL 1036 ( 6J 82)
+fi 15612,20250,150 2 60077 -- MSL 1040 ( 7J 173)
+fl 15612,20250,150 2 60078 -- MSL 1041 ( 7J 174)
+ff 17076,20250,150 2 51883 -- MSL 1042 ( 6J 171)
+Fi 23418,20250,150 2 51884 -- MSL 1043 ( 6J 172)
+Fl 23418,20250,150 2 51885 -- MSL 1044 ( 6J 173)
+ij 15126,19329,6705 3 60134 -- MSL 1047 ( 7J 230)
+u2105 25368,20169,300 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 21468,23505,390 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 14148,17079,6705 1 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 14148,18555,6405 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 9759,12420,5694 0 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 10245,23808,150 2 46301 -- MSL 1065 ( 5T 221)
+bq 6831,3714,3519 0 161154 -- MSL 1067 (19U 130)
+%0 30249,17805,180 0 161161 -- MSL 1068 (19U 137)
+a- 13173,17088 0 60154 -- MSL 1084 ( 7J 250)
+ab 13173,17079 0 75170 -- MSL 1086 ( 9E 162)
+a. 13173,18471 2 75263 -- MSL 1088 ( 9E 255)
+oe 20979,12420,390 0 161180 -- MSL 1090 (19U 156)
+OE 28299,18555,390 2 161164 -- MSL 1091 (19U 140)
+fo 8295,10605 0 161163 -- MSL 1092 (19U 139)
+fc 8295,10605 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624 0 60091 -- MSL 1094 ( 7J 187)
+/L 16101,18315,150 2 75171 -- MSL 1095 ( 9E 163)
+/l 7806,20250,150 2 75187 -- MSL 1096 ( 9E 179)
+a" 13173,20475 2 75197 -- MSL 1097 ( 9E 189)
+ho 13173,993,4317 0 75186 -- MSL 1098 ( 9E 178)
+vZ 17565,24810,150 2 75150 -- MSL 1106 ( 9E 142)
+IJ 20004,18315,6363 3 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/GBI b/font/devlj4/GBI
new file mode 100644
index 0000000..8036ae5
--- /dev/null
+++ b/font/devlj4/GBI
@@ -0,0 +1,718 @@
+# Garmond KrsvHlb
+name GBI
+spacewidth 6831
+slant 16.300000
+pcltypeface 4197
+pclproportional 1
+pclweight 3
+pclstyle 1
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -4877
+P . -4388
+P , -4388
+V A -4388
+A V -4388
+T o -4388
+T r -3413
+T c -3902
+T e -3902
+T d -3902
+T s -3413
+T y -3902
+T a -3902
+T w -3902
+T u -3413
+L T -3413
+L Y -3902
+Y o -3902
+Y e -3902
+Y a -4388
+A W -4388
+W A -3413
+T A -3413
+V o -2924
+V e -2924
+V a -3413
+Y A -4388
+F A -2438
+F . -3902
+F , -3902
+A T -3413
+A Y -3902
+v . -1460
+v , -1460
+y . -974
+y , -974
+T . -3413
+T , -3413
+L W -4877
+P A -2924
+V . -3902
+V , -3902
+Y . -3902
+Y , -3902
+W o -2438
+W e -2438
+W a -2924
+W . -3413
+W , -3413
+r . -1949
+r , -1949
+w . -1460
+w , -1460
+Y u -2924
+A v -1949
+A y -1949
+A w -1949
+o . -974
+o , -974
+p . -974
+p , -974
+b . -1949
+b , -1949
+O T -1949
+O V -1949
+O Y -1949
+O . -974
+O , -974
+L y -2924
+L O -1949
+L G -1949
+L C -1949
+L Q -1949
+V y -1949
+V u -1949
+V O -974
+V G -974
+V C -974
+V Q -974
+D T -1949
+D V -1949
+D Y -1949
+D . -974
+D , -974
+Y O -974
+Y G -974
+Y C -974
+Y Q -974
+F o -974
+F e -974
+F a -974
+O A -974
+O W -1949
+L U -1949
+R T -1949
+R V -1949
+R Y -1949
+R W -1949
+G T -974
+P o -974
+P e -974
+P a -1460
+D A -974
+D W -1949
+B T -974
+B Y -974
+B . -974
+B , -974
+A O -1460
+A G -1460
+A C -1460
+A U -1949
+A Q -1460
+W r -1460
+W y -1460
+W u -1460
+W O -974
+W G -974
+W C -974
+W Q -974
+J A -485
+J . -485
+J , -485
+U A -1460
+U . -1460
+U , -1460
+Q A -974
+Q W -1949
+T O -974
+T G -974
+T C -974
+T Q -974
+O X -974
+L o -974
+L e -974
+L q -485
+G V -974
+G Y -974
+G W -974
+P T -974
+P V -974
+P Y -974
+C T -485
+C V -485
+C Y -485
+D X -974
+B V -974
+B X -974
+B A -974
+B W -974
+X o -974
+X e -974
+X y -1460
+X O -974
+X G -974
+X C -974
+X Q -974
+A o -974
+A e -974
+Q X -974
+K o -974
+K e -974
+K y -1460
+K w -1460
+K O -974
+K G -974
+K C -974
+K Q -974
+o v -974
+o y -974
+o x -974
+o w -974
+h v -485
+h y -485
+n v -485
+n y -485
+m v -485
+m y -485
+p v -485
+p y -485
+p x -485
+v o -485
+b v -485
+b y -485
+b w -485
+y o -485
+x o -974
+x c -485
+x e -485
+x d -485
+x a -485
+x q -485
+w o -974
+w g -485
+w c -485
+w d -485
+w a -485
+w q -485
+T i -974
+L a -485
+R o -974
+R y -974
+R O -974
+R G -974
+R C -974
+R U -974
+R Q -974
+P Z -974
+P X -974
+P W -974
+C W -485
+V i -974
+Y i -974
+X a -485
+A g -485
+A c -974
+A d -974
+A a -485
+A q -485
+W i -974
+K c -974
+o f -485
+h w -485
+h . -485
+h , -485
+n w -485
+n . -485
+n , -485
+m w -485
+m . -485
+m , -485
+r o -974
+r c -974
+r e -974
+r d -974
+r a -974
+r q -974
+p w -485
+f o -485
+w e -485
+w s -485
+k o -485
+O Z -974
+L J -485
+R e -974
+R a -485
+E o -485
+E v -485
+E y -485
+E w -485
+Z o -974
+Z e -974
+Z d -974
+Z y -1460
+Z a -485
+Z w -1460
+Z O -974
+Z G -974
+Z C -974
+Z Q -974
+D Z -974
+B Z -974
+A J -485
+J o -485
+K a -485
+t o -485
+o t -485
+o g -485
+o z -485
+o j -485
+g o -485
+v y -485
+v x -485
+v w -485
+z o -485
+w t -485
+w h -485
+w n -485
+w m -485
+w l -485
+w r -485
+w i -485
+w p -485
+w v -485
+w z -485
+w b -485
+w y -485
+w f -485
+w x -485
+w w -485
+w j -485
+w u -485
+w k -485
+R J -485
+C o -485
+E T -485
+E V -485
+E Y -485
+E W -485
+E U -485
+B o -485
+B y -485
+B U -485
+U o -485
+L cq -4877
+L ' -4877
+T hy -3902
+T - -3902
+T en -3902
+T em -3902
+A cq -2438
+A ' -2438
+hy T -3902
+- T -3902
+en T -3902
+em T -3902
+Y hy -2924
+Y - -2924
+Y en -2924
+Y em -2924
+p cq -485
+p ' -485
+b cq -974
+b ' -974
+V hy -1949
+V - -1949
+V en -1949
+V em -1949
+h cq -485
+h ' -485
+n cq -485
+n ' -485
+m cq -485
+m ' -485
+R cq -974
+R ' -974
+W hy -1460
+W - -1460
+W en -1460
+W em -1460
+cq d -974
+' d -974
+L hy -1949
+L - -1949
+L en -1949
+L em -1949
+X hy -1460
+X - -1460
+X en -1460
+X em -1460
+A hy -1460
+A - -1460
+A en -1460
+A em -1460
+K hy -974
+K - -974
+K en -974
+K em -974
+hy X -1460
+- X -1460
+hy A -1460
+- A -1460
+en X -1460
+en A -1460
+em X -1460
+R hy -974
+R - -974
+R en -974
+R em -974
+v cq -485
+v ' -485
+w cq -485
+w ' -485
+E cq -485
+E ' -485
+Z hy -1460
+Z - -1460
+Z en -1460
+Z em -1460
+B cq -485
+B ' -485
+w hy -485
+w - -485
+w en -485
+w em -485
+charset
+! 6831,18717,390,2859,345,962 2 161057 -- MSL 1 (19U 33)
+dq 11220,18555,0,1827,-2345,962 2 161058 -- MSL 2 (19U 34)
+" "
+sh 13173,17415,390,1542,33,962 0 161059 -- MSL 3 (19U 35)
+# "
+Do 13173,19182,2292,1161,255,962 2 161060 -- MSL 4 (19U 36)
+$ "
+% 21954,17805,582,0,-1385 0 161061 -- MSL 5 (19U 37)
+& 18540,18555,390,1743,-671,962 2 161062 -- MSL 6 (19U 38)
+cq 6831,18555,0,2763,-1367,962 2 161170 -- MSL 8 (19U 146)
+' "
+( 7806,20172,6930,4779,306,962 3 161064 -- MSL 9 (19U 40)
+) 7806,20172,6930,822,4263,822 3 161065 -- MSL 10 (19U 41)
+* 13173,18555,0,1908,-1730,962 2 161066 -- MSL 11 (19U 42)
++ 21954,13467,87,0,-2870 0 161067 -- MSL 12 (19U 43)
+, 6831,3381,4077,0,687 0 161068 -- MSL 13 (19U 44)
+hy 6831,7575,0,882,558,882 0 161069 -- MSL 14 (19U 45)
+- "
+. 6831,3486,390,0,-269 0 161070 -- MSL 15 (19U 46)
+sl 13173,18594,390,4080,1101,962 2 161071 -- MSL 16 (19U 47)
+/ "
+0 13173,17805,390,1212,-212,962 0 161072 -- MSL 17 (19U 48)
+1 13173,17805,150,279,-566,279 0 161073 -- MSL 18 (19U 49)
+2 13173,17805,150,1017,1179,962 0 161074 -- MSL 19 (19U 50)
+3 13173,17805,390,336,1731,336 0 161075 -- MSL 20 (19U 51)
+4 13173,17805,0,1485,699,962 0 161076 -- MSL 21 (19U 52)
+5 13173,17415,390,1881,-713,962 0 161077 -- MSL 22 (19U 53)
+6 13173,17805,390,1575,111,962 0 161078 -- MSL 23 (19U 54)
+7 13173,17415,390,2856,-1331,962 0 161079 -- MSL 24 (19U 55)
+8 13173,17805,390,1428,21,962 0 161080 -- MSL 25 (19U 56)
+9 13173,17805,390,1536,72,962 0 161081 -- MSL 26 (19U 57)
+: 6831,12177,390,1032,-269,962 0 161082 -- MSL 27 (19U 58)
+; 6831,12177,4077,1032,687,962 0 161083 -- MSL 28 (19U 59)
+< 26346,16068,0,0,-3980 0 161084 -- MSL 29 (19U 60)
+= 21954,9654,0,0,-2876 0 161085 -- MSL 30 (19U 61)
+> 26346,16068,0,0,-3980 0 161086 -- MSL 31 (19U 62)
+? 10245,18705,390,2250,-1022,962 2 161087 -- MSL 32 (19U 63)
+at 21954,16950,4131,1743,1035,962 0 161088 -- MSL 33 (19U 64)
+@ "
+A 19515,18555,195,15,1764,15 2 161089 -- MSL 34 (19U 65)
+B 16587,18555,195,1047,1806,962 2 161090 -- MSL 35 (19U 66)
+C 19515,18555,390,2028,-836,962 2 161091 -- MSL 36 (19U 67)
+D 20490,18555,195,1566,1323,962 2 161092 -- MSL 37 (19U 68)
+E 16587,18360,195,1848,1476,962 2 161093 -- MSL 38 (19U 69)
+F 15126,18360,195,3372,1542,962 2 161094 -- MSL 39 (19U 70)
+G 20979,18555,390,1476,-1073,962 2 161095 -- MSL 40 (19U 71)
+H 21468,18360,195,3429,1671,962 2 161096 -- MSL 41 (19U 72)
+I 10245,18360,195,3429,1542,962 2 161097 -- MSL 42 (19U 73)
+J 9270,18360,6219,3918,4407,962 3 161098 -- MSL 43 (19U 74)
+K 19029,18360,195,2877,1482,962 2 161099 -- MSL 44 (19U 75)
+L 16587,18360,195,900,1431,900 2 161100 -- MSL 45 (19U 76)
+M 22932,18360,195,2907,2571,962 2 161101 -- MSL 46 (19U 77)
+N 20979,18360,195,3810,1401,962 2 161102 -- MSL 47 (19U 78)
+O 21954,18555,390,1014,-806,962 2 161103 -- MSL 48 (19U 79)
+P 16587,18555,195,1896,1236,962 2 161104 -- MSL 49 (19U 80)
+Q 21954,18555,6639,1014,-806,962 3 161105 -- MSL 50 (19U 81)
+R 19515,18555,195,63,1344,63 2 161106 -- MSL 51 (19U 82)
+S 13173,18555,390,2022,732,962 2 161107 -- MSL 52 (19U 83)
+T 18051,19425,195,4188,-1451,962 2 161108 -- MSL 53 (19U 84)
+U 21468,18360,390,3498,-1760,962 2 161109 -- MSL 54 (19U 85)
+V 19515,18360,390,3597,-1550,962 2 161110 -- MSL 55 (19U 86)
+W 26346,18360,390,4203,-1436,962 2 161111 -- MSL 56 (19U 87)
+X 19029,18360,195,3300,1851,962 2 161112 -- MSL 57 (19U 88)
+Y 19515,18360,195,3228,-2168,962 2 161113 -- MSL 58 (19U 89)
+Z 17565,19425,195,1575,285,962 2 161114 -- MSL 59 (19U 90)
+lB 7806,18165,4614,4290,2805,962 0 161115 -- MSL 60 (19U 91)
+[ "
+rs 13173,18717,390,0,-2867 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 7806,18165,4614,3402,3693,962 0 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758,0,36,36,36 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588,1317,1317,962 1 161119 -- MSL 64 (19U 95)
+oq 6831,18555,0,3195,-1799,962 2 161169 -- MSL 66 (19U 145)
+` "
+a 13662,13143,390,1143,663,962 0 161121 -- MSL 67 (19U 97)
+b 14637,20250,390,714,351,714 2 161122 -- MSL 68 (19U 98)
+c 11220,12420,390,1695,438,962 0 161123 -- MSL 69 (19U 99)
+d 14637,20250,390,2610,417,962 2 161124 -- MSL 70 (19U 100)
+e 11220,12420,390,1365,429,962 0 161125 -- MSL 71 (19U 101)
+f 7806,20250,6705,5985,4074,962 3 161126 -- MSL 72 (19U 102)
+g 12684,12420,6705,2031,2331,962 1 161127 -- MSL 73 (19U 103)
+h 14637,20250,390,555,657,555 2 161128 -- MSL 74 (19U 104)
+i 8295,18765,390,1344,498,962 2 161129 -- MSL 75 (19U 105)
+j 7806,18765,6705,2169,3789,962 3 161130 -- MSL 76 (19U 106)
+k 14148,20250,390,858,426,858 2 161131 -- MSL 77 (19U 107)
+l 7806,20250,390,2595,252,962 2 161132 -- MSL 78 (19U 108)
+m 21468,12420,390,291,255,291 0 161133 -- MSL 79 (19U 109)
+n 14637,12420,390,486,57,486 0 161134 -- MSL 80 (19U 110)
+o 12684,12420,390,459,339,459 0 161135 -- MSL 81 (19U 111)
+p 14637,13893,6735,639,3318,639 1 161136 -- MSL 82 (19U 112)
+q 14148,12420,6900,1143,501,962 1 161137 -- MSL 83 (19U 113)
+r 10245,12420,0,2187,390,962 0 161138 -- MSL 84 (19U 114)
+s 8781,12420,390,873,903,873 0 161139 -- MSL 85 (19U 115)
+t 8295,14937,390,2001,312,962 0 161140 -- MSL 86 (19U 116)
+u 14148,12420,390,813,111,813 0 161141 -- MSL 87 (19U 117)
+v 15126,12420,390,759,324,759 0 161142 -- MSL 88 (19U 118)
+w 20490,12420,390,1065,462,962 0 161143 -- MSL 89 (19U 119)
+x 12684,12420,390,1731,1635,962 0 161144 -- MSL 90 (19U 120)
+y 13173,12420,6705,1029,1767,962 1 161145 -- MSL 91 (19U 121)
+z 11220,12885,195,2064,2046,962 0 161146 -- MSL 92 (19U 122)
+{ 13173,19935,6210,3339,-971,962 2 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588,0,-4595 3 161148 -- MSL 94 (19U 124)
+ba "
+} 13173,19935,6210,63,2304,63 2 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,9435,0,0,-4028 0 161150 -- MSL 96 (19U 126)
+`A 19515,24843,195,15,1764,15 2 161216 -- MSL 99 (19U 192)
+^A 19515,25182,195,15,1764,15 2 161218 -- MSL 100 (19U 194)
+`E 16587,24843,195,1848,1476,962 2 161224 -- MSL 101 (19U 200)
+^E 16587,25182,195,1848,1476,962 2 161226 -- MSL 102 (19U 202)
+:E 16587,23439,195,1848,1476,962 2 161227 -- MSL 103 (19U 203)
+^I 10245,25182,195,4377,1542,962 2 161230 -- MSL 104 (19U 206)
+:I 10245,23439,195,3792,1542,962 2 161231 -- MSL 105 (19U 207)
+aa 13173,19668,0,1317,-6053,962 2 161204 -- MSL 106 (19U 180)
+ga 13173,19668,0,0,-2960 2 161120 -- MSL 107 (19U 96)
+a^ 13173,20514,0,285,-3392,285 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 13173,18057,0,1161,-3668,962 0 161192 -- MSL 109 (19U 168)
+~ 13173,18468,0,1074,-3599,962 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 21468,24843,390,3498,-1760,962 2 161241 -- MSL 111 (19U 217)
+^U 21468,25182,390,3498,-1760,962 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105,0,1317,1317,962 2 161199 -- MSL 113 (19U 175)
+'Y 19515,24843,195,3228,-2168,962 2 161245 -- MSL 114 (19U 221)
+'y 13173,19668,6705,1317,1767,962 3 161277 -- MSL 115 (19U 253)
+de 13173,17415,0,600,-1973,600 0 161200 -- MSL 116 (19U 176)
+,C 19515,18555,6060,2028,-836,962 2 161223 -- MSL 117 (19U 199)
+,c 11220,12420,4776,1695,438,962 0 161255 -- MSL 118 (19U 231)
+~N 20979,24255,195,3810,1401,962 2 161233 -- MSL 119 (19U 209)
+~n 14637,18468,390,486,57,486 2 161265 -- MSL 120 (19U 241)
+r! 6831,12411,6696,834,2370,834 1 161185 -- MSL 121 (19U 161)
+r? 10245,12405,6690,0,1686 1 161215 -- MSL 122 (19U 191)
+Cs 13173,15834,0,2349,1044,962 0 161188 -- MSL 123 (19U 164)
+Po 13173,17262,390,951,1173,951 0 161187 -- MSL 124 (19U 163)
+Ye 13173,18090,150,3885,-1268,962 0 161189 -- MSL 125 (19U 165)
+sc 13173,18555,6705,525,-68,525 3 161191 -- MSL 126 (19U 167)
+Fn 13173,20250,6705,3279,1419,962 3 161155 -- MSL 127 (19U 131)
+ct 13173,17613,417,1263,-1289,962 0 161186 -- MSL 128 (19U 162)
+^a 13662,20514,390,1143,663,962 2 161250 -- MSL 129 (19U 226)
+^e 11220,20514,390,1365,429,962 2 161258 -- MSL 130 (19U 234)
+^o 12684,20514,390,531,339,531 2 161268 -- MSL 131 (19U 244)
+^u 14148,20514,390,813,111,813 2 161275 -- MSL 132 (19U 251)
+'a 13662,19668,390,1143,663,962 2 161249 -- MSL 133 (19U 225)
+'e 11220,19668,390,2295,429,962 2 161257 -- MSL 134 (19U 233)
+'o 12684,19668,390,1563,339,962 2 161267 -- MSL 135 (19U 243)
+'u 14148,19668,390,831,111,831 2 161274 -- MSL 136 (19U 250)
+`a 13662,19668,390,1143,663,962 2 161248 -- MSL 137 (19U 224)
+`e 11220,19668,390,1365,429,962 2 161256 -- MSL 138 (19U 232)
+`o 12684,19668,390,459,339,459 2 161266 -- MSL 139 (19U 242)
+`u 14148,19668,390,813,111,813 2 161273 -- MSL 140 (19U 249)
+:a 13662,18057,390,1143,663,962 0 161252 -- MSL 141 (19U 228)
+:e 11220,18057,390,2139,429,962 0 161259 -- MSL 142 (19U 235)
+:o 12684,18057,390,1407,339,962 0 161270 -- MSL 143 (19U 246)
+:u 14148,18057,390,813,111,813 0 161276 -- MSL 144 (19U 252)
+oA 19515,24900,195,15,1764,15 2 161221 -- MSL 145 (19U 197)
+^i 8295,20514,390,2724,459,962 2 161262 -- MSL 146 (19U 238)
+/O 21954,18555,390,1125,-695,962 2 161240 -- MSL 147 (19U 216)
+AE 25857,18360,195,870,2910,870 2 161222 -- MSL 148 (19U 198)
+oa 13662,18861,390,1377,663,962 2 161253 -- MSL 149 (19U 229)
+'i 8295,19668,390,3756,459,962 2 161261 -- MSL 150 (19U 237)
+/o 12684,12420,390,552,444,552 0 161272 -- MSL 151 (19U 248)
+ae 18540,13047,390,1296,477,962 0 161254 -- MSL 152 (19U 230)
+:A 19515,23439,195,15,1764,15 2 161220 -- MSL 153 (19U 196)
+`i 8295,19668,390,663,459,663 2 161260 -- MSL 154 (19U 236)
+:O 21954,23439,390,1014,-806,962 2 161238 -- MSL 155 (19U 214)
+:U 21468,23439,390,3498,-1760,962 2 161244 -- MSL 156 (19U 220)
+'E 16587,24843,195,1848,1476,962 2 161225 -- MSL 157 (19U 201)
+:i 8295,18057,390,3600,459,962 0 161263 -- MSL 158 (19U 239)
+ss 14148,20250,6705,2916,4902,962 3 161247 -- MSL 159 (19U 223)
+^O 21954,25182,390,1014,-806,962 2 161236 -- MSL 160 (19U 212)
+'A 19515,24843,195,15,1764,15 2 161217 -- MSL 161 (19U 193)
+~A 19515,24255,195,648,1764,648 2 161219 -- MSL 162 (19U 195)
+~a 13662,18468,390,1143,663,962 2 161251 -- MSL 163 (19U 227)
+-D 20490,18555,342,1557,1314,962 2 161232 -- MSL 164 (19U 208)
+Sd 12684,20250,390,600,339,600 2 161264 -- MSL 165 (19U 240)
+'I 10245,24843,195,3540,1542,962 2 161229 -- MSL 166 (19U 205)
+`I 10245,24843,195,3429,1542,962 2 161228 -- MSL 167 (19U 204)
+'O 21954,24843,390,1014,-806,962 2 161235 -- MSL 168 (19U 211)
+`O 21954,24843,390,1014,-806,962 2 161234 -- MSL 169 (19U 210)
+~O 21954,24255,390,1014,-806,962 2 161237 -- MSL 170 (19U 213)
+~o 12684,18468,390,1320,339,962 2 161269 -- MSL 171 (19U 245)
+vS 13173,24657,390,3903,732,962 2 161162 -- MSL 172 (19U 138)
+vs 8781,20526,390,4242,903,962 2 161178 -- MSL 173 (19U 154)
+'U 21468,24843,390,3498,-1760,962 2 161242 -- MSL 174 (19U 218)
+:Y 19515,23439,195,3228,-2168,962 2 161183 -- MSL 175 (19U 159)
+:y 13173,18057,6705,1161,1767,962 1 161279 -- MSL 176 (19U 255)
+TP 16587,18360,195,846,1221,846 2 161246 -- MSL 177 (19U 222)
+Tp 14637,20250,6900,663,3342,663 3 161278 -- MSL 178 (19U 254)
+mc 14637,10800,5193,582,756,582 0 161205 -- MSL 180 (19U 181)
+ps 13173,19635,4200,1032,-689,962 2 161206 -- MSL 181 (19U 182)
+34 21954,17805,180,0,-626 0 161214 -- MSL 182 (19U 190)
+\- 21954,7755,0,0,-2891 0 60096 -- MSL 183 ( 7J 192)
+14 21954,17625,180,0,-1241 0 161212 -- MSL 184 (19U 188)
+12 21954,17625,180,0,-1316 0 161213 -- MSL 185 (19U 189)
+Of 11220,17805,0,1833,-1337,962 0 161194 -- MSL 186 (19U 170)
+Om 11220,17805,0,1218,-1775,962 0 161210 -- MSL 187 (19U 186)
+Fo 11220,9906,0,837,609,837 0 161195 -- MSL 188 (19U 171)
+Fc 11220,9906,0,435,1011,435 0 161211 -- MSL 190 (19U 187)
+t+- 21954,13467,3354,0,-2864 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916,0,-4595 2 161190 -- MSL 192 (19U 166)
+co 13173,19725,0,5022,-3197,962 2 161193 -- MSL 193 (19U 169)
+tno 21954,10560,0,0,-2564 0 161196 -- MSL 194 (19U 172)
+u00AD 6831,7575,0,882,558,882 0 161197 -- MSL 195 (19U 173)
+rg 13173,19725,0,5022,-3197,962 2 161198 -- MSL 196 (19U 174)
+S2 8781,17805,0,2001,-605,962 0 161202 -- MSL 197 (19U 178)
+S3 8781,17805,0,1881,-386,962 0 161203 -- MSL 198 (19U 179)
+ac 13173,657,4776,0,-1790 0 161208 -- MSL 199 (19U 184)
+S1 8781,17625,0,1389,-1589,962 0 161209 -- MSL 200 (19U 185)
+tmu 21954,13530,192,0,-2933 0 161239 -- MSL 201 (19U 215)
+tdi 21954,13383,3,0,-2885 0 161271 -- MSL 202 (19U 247)
+u203C 13662,18717,390,2859,345,962 2 87315 -- MSL 221 (10U 19)
+u20A7 24882,18555,390,2001,1236,962 2 60121 -- MSL 232 ( 7J 217)
+pc 6831,10533,0,336,-1115,336 0 161207 -- MSL 302 (19U 183)
+u013F 16587,18360,195,900,1431,900 2 51943 -- MSL 306 ( 6J 231)
+u0140 10734,20250,390,2328,252,962 2 51959 -- MSL 307 ( 6J 247)
+u2113 13173,18045,765,369,-1043,369 0 60122 -- MSL 308 ( 7J 218)
+u0149 21468,18555,390,486,-737,486 2 51951 -- MSL 309 ( 6J 239)
+fm 13173,17415,0,0,-1460 0 60101 -- MSL 310 ( 7J 197)
+sd 13173,17415,0,1680,-1460,962 0 60102 -- MSL 311 ( 7J 198)
+dg 13173,18555,6657,1035,186,962 3 161158 -- MSL 312 (19U 134)
+tm 16101,17550,0,5508,-3158,962 0 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588,1317,1317,962 1 60095 -- MSL 314 ( 7J 191)
+ah 13173,20526,0,2367,-5474,962 2 75169 -- MSL 315 ( 9E 161)
+ao 13173,18861,0,285,-5312,285 2 60152 -- MSL 316 ( 7J 248)
+f/ 2928,17625,180,8301,6948,962 0 60109 -- MSL 324 ( 7J 205)
+em 21954,7185,0,666,-44,666 0 161175 -- MSL 325 (19U 151)
+en 13173,7185,0,537,-71,537 0 161174 -- MSL 326 (19U 150)
+dd 13173,18555,4989,990,243,962 2 161159 -- MSL 327 (19U 135)
+.i 8295,12420,390,288,459,288 0 46333 -- MSL 328 ( 5T 253)
+aq 6831,18555,0,2289,-2825,962 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226,0,0,-497 0 161173 -- MSL 331 (19U 149)
+u207F 11709,17805,0,2439,-767,962 0 87548 -- MSL 332 (10U 252)
+u0111 14637,20250,390,3219,426,962 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 19515,23706,195,15,1764,15 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 13662,17325,390,1143,663,962 0 75235 -- MSL 401 ( 9E 227)
+u0041_0328 19515,18555,4395,15,1764,15 2 75173 -- MSL 404 ( 9E 165)
+u0061_0328 13662,13143,4791,1143,663,962 0 75193 -- MSL 405 ( 9E 185)
+'C 19515,24843,390,2028,-836,962 2 75206 -- MSL 406 ( 9E 198)
+'c 11220,19668,390,1995,438,962 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 19515,24657,390,2028,-836,962 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 11220,20526,390,3165,438,962 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 20490,24657,195,1566,1323,962 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 19029,20250,390,3315,417,962 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 16587,24657,195,1848,1476,962 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 11220,20526,390,3345,429,962 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 16587,18360,4395,1848,1476,962 2 75210 -- MSL 422 ( 9E 202)
+u0065_0328 11220,12420,4791,1365,429,962 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 16587,24843,195,900,1431,900 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 7806,25743,390,3861,252,962 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 16587,18579,195,2697,1431,962 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 12198,20250,390,3276,252,962 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 20979,24843,195,3810,1401,962 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 14637,19668,390,585,57,585 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 20979,24657,195,3810,1401,962 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 14637,20526,390,1635,57,962 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 21954,24843,390,1014,-806,962 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 12684,19830,390,3876,339,962 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 19515,24843,195,63,1344,63 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 10245,19668,0,2781,390,962 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 19515,24657,195,63,1344,63 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 10245,20526,0,3831,390,962 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 13173,24843,390,2076,732,962 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 8781,19668,390,2763,903,962 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 18051,24657,195,4188,-1451,962 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 11220,20250,390,3714,312,962 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 18051,19425,6060,4188,-1451,962 2 75230 -- MSL 468 ( 9E 222)
+u0074_0327 8295,14937,4776,2001,1173,962 0 75262 -- MSL 469 ( 9E 254)
+u0055_030B 21468,24843,390,3498,-1760,962 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 14148,19830,390,3144,111,962 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 21468,24900,390,3498,-1760,962 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 14148,18861,390,813,111,813 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 17565,24843,195,1575,285,962 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 11220,19668,195,2295,2046,962 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 17565,23439,195,1575,285,962 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 11220,18057,195,2064,2046,962 0 75199 -- MSL 485 ( 9E 191)
+u2070 8781,17805,0,2100,-1385,962 0 51753 -- MSL 1000 ( 6J 41)
+u2074 8781,17625,0,2277,-773,962 0 51748 -- MSL 1001 ( 6J 36)
+u2075 8781,17625,0,2376,-1643,962 0 51749 -- MSL 1002 ( 6J 37)
+u2076 8781,17805,0,2391,-1154,962 0 51806 -- MSL 1003 ( 6J 94)
+u2077 8781,17625,0,3009,-2060,962 0 51750 -- MSL 1004 ( 6J 38)
+u2078 8781,17805,0,2307,-1256,962 0 51754 -- MSL 1005 ( 6J 42)
+u2079 8781,17805,0,2313,-1238,962 0 51752 -- MSL 1006 ( 6J 40)
+lq 11220,18555,0,4245,-1418,962 2 161171 -- MSL 1017 (19U 147)
+rq 11220,18555,0,3423,-596,962 2 161172 -- MSL 1018 (19U 148)
+Bq 11220,3456,4002,0,3399 0 161156 -- MSL 1019 (19U 132)
+u2003 21954,0,0,0,1317 0 51821 -- MSL 1020 ( 6J 109)
+u2002 13173,0,0,0,1317 0 51822 -- MSL 1021 ( 6J 110)
+u2009 6831,0,0,0,1317 0 51828 -- MSL 1023 ( 6J 116)
+u2026 21954,3072,390,0,129 0 161157 -- MSL 1028 (19U 133)
+vz 11220,20526,195,3345,2046,962 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,17703,0,4761,-3203,962 0 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056,453,-1154,453 2 51794 -- MSL 1036 ( 6J 82)
+fi 14637,20250,6705,1566,3645,962 3 60077 -- MSL 1040 ( 7J 173)
+fl 14637,20250,6705,2934,3735,962 3 60078 -- MSL 1041 ( 7J 174)
+ff 14637,20250,6705,5373,3861,962 3 51883 -- MSL 1042 ( 6J 171)
+Fi 21468,20250,6705,1701,3675,962 3 51884 -- MSL 1043 ( 6J 172)
+Fl 21468,20250,6705,2832,3765,962 3 51885 -- MSL 1044 ( 6J 173)
+ij 14637,18765,6705,2169,498,962 3 60134 -- MSL 1047 ( 7J 230)
+u2105 21954,18609,180,1233,-140,962 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 20979,23706,390,1476,-1073,962 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 12684,17325,6705,2031,2331,962 1 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 13173,18555,6060,2022,732,962 2 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 8781,12420,4776,873,903,873 0 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 10245,23439,195,3429,1542,962 2 46301 -- MSL 1065 ( 5T 221)
+bq 6831,3456,4002,0,2925 0 161154 -- MSL 1067 (19U 130)
+%0 30249,17805,450,0,-1385 0 161161 -- MSL 1068 (19U 137)
+a- 13173,16974,0,438,-4106,438 0 60154 -- MSL 1084 ( 7J 250)
+ab 13173,17325,0,1386,-5276,962 0 75170 -- MSL 1086 ( 9E 162)
+a. 13173,18057,0,0,-6509 0 75263 -- MSL 1088 ( 9E 255)
+oe 19029,12420,390,1338,357,962 0 161180 -- MSL 1090 (19U 156)
+OE 27321,18555,390,1932,-527,962 2 161164 -- MSL 1091 (19U 140)
+fo 6831,9906,0,999,792,962 0 161163 -- MSL 1092 (19U 139)
+fc 6831,9906,0,423,1368,423 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624,0,0,-2021 0 60091 -- MSL 1094 ( 7J 187)
+/L 16587,18360,195,900,1431,900 2 75171 -- MSL 1095 ( 9E 163)
+/l 7806,20250,390,2580,444,962 2 75187 -- MSL 1096 ( 9E 179)
+a" 13173,19830,0,3630,-3815,962 2 75197 -- MSL 1097 ( 9E 189)
+ho 13173,711,4791,0,-4010 0 75186 -- MSL 1098 ( 9E 178)
+vZ 17565,24657,195,1707,285,962 2 75150 -- MSL 1106 ( 9E 142)
+IJ 19515,18360,6219,3918,1542,962 3 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/GI b/font/devlj4/GI
new file mode 100644
index 0000000..724c8f6
--- /dev/null
+++ b/font/devlj4/GI
@@ -0,0 +1,653 @@
+# Garmond Krsv
+name GI
+spacewidth 6342
+slant 16.400000
+pcltypeface 4197
+pclproportional 1
+pclweight 0
+pclstyle 1
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -3902
+P . -4388
+P , -4388
+V A -3413
+A V -3413
+T o -4877
+T r -3413
+T c -4388
+T e -4388
+T d -4388
+T s -3413
+T y -4388
+T a -3902
+T w -4388
+T u -3413
+L T -3902
+L Y -3413
+Y o -3902
+Y e -3902
+Y a -3902
+A W -3413
+W A -3413
+T A -3413
+V o -2924
+V e -2924
+V a -2924
+Y A -3413
+F A -2438
+F . -3902
+F , -3902
+A T -3413
+A Y -3413
+v . -1460
+v , -1460
+y . -974
+y , -974
+T . -3413
+T , -3413
+L W -3413
+P A -2924
+V . -3902
+V , -3902
+Y . -3902
+Y , -3902
+W o -2924
+W e -2924
+W a -2924
+W . -3902
+W , -3902
+r . -1949
+r , -1949
+w . -1460
+w , -1460
+Y u -2438
+A v -1949
+A y -1949
+A w -1949
+o . -1460
+o , -1460
+p . -974
+p , -974
+b . -1949
+b , -1949
+O T -1949
+O V -1949
+O Y -1949
+O . -974
+O , -974
+V y -1460
+V u -1460
+V O -974
+V G -974
+V C -974
+V Q -974
+D T -1949
+D V -1949
+D Y -1949
+D . -974
+D , -974
+Y O -974
+Y G -974
+Y C -974
+Y Q -974
+F o -1460
+F e -974
+F a -974
+O A -974
+O W -1949
+R T -2924
+R V -2924
+R Y -2924
+R W -2924
+G T -974
+P o -1460
+P e -1460
+P a -1460
+D A -974
+D W -1949
+B T -974
+B Y -974
+B . -974
+B , -974
+A O -1949
+A G -1949
+A C -1949
+A U -1949
+A Q -1949
+W r -1460
+W y -1460
+W u -1460
+W O -974
+W G -974
+W C -974
+W Q -974
+U A -974
+U . -974
+U , -974
+Q A -974
+Q W -1949
+T O -974
+T G -974
+T C -974
+T Q -974
+O X -974
+L o -485
+G V -974
+G Y -974
+G W -974
+P T -974
+P V -974
+P Y -974
+D X -974
+B V -974
+B X -974
+B A -974
+B W -974
+F r -485
+F y -485
+F u -485
+F O -485
+F G -485
+F C -485
+F Q -485
+X o -1460
+X e -1460
+X y -1460
+X O -974
+X G -974
+X C -974
+X Q -974
+A o -1460
+A e -1460
+Q X -974
+K o -1460
+K e -974
+K y -974
+K w -974
+K O -974
+K G -974
+K C -974
+K Q -974
+o v -485
+o y -485
+o x -485
+o w -485
+v o -485
+y o -485
+x o -974
+x c -485
+x e -485
+x d -485
+x a -485
+x q -485
+w o -485
+R o -1460
+R y -1460
+R O -1460
+R G -1460
+R C -1460
+R U -1460
+R Q -1460
+P Z -974
+P X -974
+P W -974
+X a -485
+A t -974
+A g -485
+A c -1460
+A d -974
+A a -485
+A q -485
+K c -974
+o f -485
+h . -485
+h , -485
+n . -485
+n , -485
+m . -485
+m , -485
+r o -974
+r c -485
+r e -485
+r d -485
+r a -485
+r q -485
+f o -485
+k o -485
+O Z -974
+R e -1460
+R a -485
+G Z -974
+E o -485
+Z o -974
+Z e -485
+Z d -485
+Z y -485
+Z a -485
+Z w -485
+Z O -485
+Z G -485
+Z C -485
+Z Q -485
+D Z -974
+B Z -974
+J o -485
+K a -485
+t o -485
+o t -485
+o g -485
+o z -485
+o j -485
+g o -485
+z o -485
+C o -485
+E T -485
+E V -485
+E Z -485
+E Y -485
+E W -485
+B o -485
+U o -485
+L cq -4877
+L ' -4877
+T hy -4388
+T - -4388
+T en -4388
+T em -4388
+A cq -2438
+A ' -2438
+hy T -3413
+- T -3413
+en T -3413
+em T -3413
+Y hy -2438
+Y - -2438
+Y en -2438
+Y em -2438
+p cq -485
+p ' -485
+b cq -974
+b ' -974
+V hy -1460
+V - -1460
+V en -1460
+V em -1460
+h cq -485
+h ' -485
+n cq -485
+n ' -485
+m cq -485
+m ' -485
+R cq -1949
+R ' -1949
+W hy -1460
+W - -1460
+W en -1460
+W em -1460
+cq d -974
+' d -974
+F hy -485
+F - -485
+F en -485
+F em -485
+X hy -1460
+X - -1460
+X en -1460
+X em -1460
+A hy -1949
+A - -1949
+A en -1949
+A em -1949
+K hy -974
+K - -974
+K en -974
+K em -974
+hy X -1460
+- X -1460
+hy A -1460
+- A -1460
+en X -1460
+en A -1460
+em X -1460
+R hy -1460
+R - -1460
+R en -1460
+R em -1460
+v cq -485
+v ' -485
+w cq -485
+w ' -485
+E cq -485
+E ' -485
+Z cq -974
+Z ' -974
+Z hy -485
+Z - -485
+Z en -485
+Z em -485
+B cq -485
+B ' -485
+charset
+! 6342,18648,390,2823,786,910 2 161057 -- MSL 1 (19U 33)
+dq 11220,18555,0,2325,-3857,910 2 161058 -- MSL 2 (19U 34)
+" "
+sh 12684,17805,390,1377,-71,910 0 161059 -- MSL 3 (19U 35)
+# "
+Do 12684,19380,2415,1467,-53,910 2 161060 -- MSL 4 (19U 36)
+$ "
+% 20490,17805,180,252,-1310,252 0 161061 -- MSL 5 (19U 37)
+& 18051,18555,390,1461,9,910 2 161062 -- MSL 6 (19U 38)
+cq 6342,18555,0,2622,-1661,910 2 161170 -- MSL 8 (19U 146)
+' "
+( 6342,20283,6705,5652,855,910 3 161064 -- MSL 9 (19U 40)
+) 6342,20283,6705,1701,4806,910 3 161065 -- MSL 10 (19U 41)
+* 12684,18555,0,2358,-2588,910 2 161066 -- MSL 11 (19U 42)
++ 20490,13191,261,0,-2495 0 161067 -- MSL 12 (19U 43)
+, 6342,3300,3891,0,1584 0 161068 -- MSL 13 (19U 44)
+hy 6342,6960,0,438,183,438 0 161069 -- MSL 14 (19U 45)
+- "
+. 6342,2985,390,0,861 0 161070 -- MSL 15 (19U 46)
+sl 13173,20250,225,4644,1500,910 2 161071 -- MSL 16 (19U 47)
+/ "
+0 12684,17805,390,1482,-353,910 0 161072 -- MSL 17 (19U 48)
+1 12684,17415,150,0,-842 0 161073 -- MSL 18 (19U 49)
+2 12684,17805,0,633,216,633 0 161074 -- MSL 19 (19U 50)
+3 12684,17805,390,588,1335,588 0 161075 -- MSL 20 (19U 51)
+4 12684,17805,0,1158,18,910 0 161076 -- MSL 21 (19U 52)
+5 12684,17415,390,780,-182,780 0 161077 -- MSL 22 (19U 53)
+6 12684,17805,390,2220,-101,910 0 161078 -- MSL 23 (19U 54)
+7 12684,17415,390,2988,-887,910 0 161079 -- MSL 24 (19U 55)
+8 12684,17805,390,1620,-104,910 0 161080 -- MSL 25 (19U 56)
+9 12684,17805,390,1731,-125,910 0 161081 -- MSL 26 (19U 57)
+: 6342,11586,390,1044,861,910 0 161082 -- MSL 27 (19U 58)
+; 6342,11586,3891,1251,1584,910 0 161083 -- MSL 28 (19U 59)
+< 26346,16068,0,0,-3980 0 161084 -- MSL 29 (19U 60)
+= 20490,8883,0,0,-2687 0 161085 -- MSL 30 (19U 61)
+> 26346,16068,0,0,-3980 0 161086 -- MSL 31 (19U 62)
+? 9270,18648,390,2514,-395,910 2 161087 -- MSL 32 (19U 63)
+at 20619,16980,3654,2277,1044,910 0 161088 -- MSL 33 (19U 64)
+@ "
+A 18540,18555,150,0,2757 2 161089 -- MSL 34 (19U 65)
+B 15126,18555,150,1614,1335,910 2 161090 -- MSL 35 (19U 66)
+C 18540,18555,390,2820,-794,910 2 161091 -- MSL 36 (19U 67)
+D 20004,18555,150,1380,1872,910 2 161092 -- MSL 37 (19U 68)
+E 15612,18315,150,1824,1827,910 2 161093 -- MSL 38 (19U 69)
+F 13173,18315,150,3717,1683,910 2 161094 -- MSL 39 (19U 70)
+G 20490,18555,390,1182,-872,910 2 161095 -- MSL 40 (19U 71)
+H 20490,18315,150,3783,1785,910 2 161096 -- MSL 41 (19U 72)
+I 8781,18315,150,3582,1641,910 2 161097 -- MSL 42 (19U 73)
+J 8295,18315,5814,3522,4017,910 2 161098 -- MSL 43 (19U 74)
+K 18051,18315,150,2922,1755,910 2 161099 -- MSL 44 (19U 75)
+L 15612,18315,150,345,1536,345 2 161100 -- MSL 45 (19U 76)
+M 20490,18315,150,3192,2418,910 2 161101 -- MSL 46 (19U 77)
+N 19515,18315,150,3774,1101,910 2 161102 -- MSL 47 (19U 78)
+O 20979,18555,390,1308,-623,910 2 161103 -- MSL 48 (19U 79)
+P 14637,18555,150,2430,1737,910 2 161104 -- MSL 49 (19U 80)
+Q 20979,18555,6027,1248,-683,910 2 161105 -- MSL 50 (19U 81)
+R 18051,18555,150,0,1965 2 161106 -- MSL 51 (19U 82)
+S 12198,18555,390,1974,759,910 2 161107 -- MSL 52 (19U 83)
+T 16101,19185,150,4656,-1577,910 2 161108 -- MSL 53 (19U 84)
+U 20004,18315,390,3312,-1640,910 2 161109 -- MSL 54 (19U 85)
+V 19029,18315,390,5280,-2375,910 2 161110 -- MSL 55 (19U 86)
+W 25371,18315,390,5025,-2189,910 2 161111 -- MSL 56 (19U 87)
+X 18540,18315,150,3168,1833,910 2 161112 -- MSL 57 (19U 88)
+Y 17565,18315,150,5103,-1385,910 2 161113 -- MSL 58 (19U 89)
+Z 16587,19557,0,1626,78,910 2 161114 -- MSL 59 (19U 90)
+lB 6342,18165,5160,4749,3360,910 0 161115 -- MSL 60 (19U 91)
+[ "
+rs 13173,20250,225,0,-3233 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 6342,18165,5160,3387,4722,910 0 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758,0,36,36,36 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588,1317,1317,910 1 161119 -- MSL 64 (19U 95)
+oq 6342,18555,0,3606,-2645,910 2 161169 -- MSL 66 (19U 145)
+` "
+a 12198,11670,390,687,1335,687 0 161121 -- MSL 67 (19U 97)
+b 12684,20253,390,1776,216,910 2 161122 -- MSL 68 (19U 98)
+c 9759,11670,390,1668,495,910 0 161123 -- MSL 69 (19U 99)
+d 13173,20250,390,2223,915,910 2 161124 -- MSL 70 (19U 100)
+e 9759,11670,390,1515,687,910 0 161125 -- MSL 71 (19U 101)
+f 7317,20250,6705,6675,5391,910 3 161126 -- MSL 72 (19U 102)
+g 11220,11670,6705,1806,1908,910 1 161127 -- MSL 73 (19U 103)
+h 12684,20250,390,801,1086,801 2 161128 -- MSL 74 (19U 104)
+i 7806,18495,390,1020,24,910 2 161129 -- MSL 75 (19U 105)
+j 6342,18495,6705,2055,4209,910 3 161130 -- MSL 76 (19U 106)
+k 13173,20250,390,657,957,657 2 161131 -- MSL 77 (19U 107)
+l 7317,20250,390,1938,606,910 2 161132 -- MSL 78 (19U 108)
+m 21468,11670,390,345,342,345 0 161133 -- MSL 79 (19U 109)
+n 14637,11670,390,513,309,513 0 161134 -- MSL 80 (19U 110)
+o 12198,11670,390,423,288,423 0 161135 -- MSL 81 (19U 111)
+p 12198,13440,6855,963,3558,910 1 161136 -- MSL 82 (19U 112)
+q 12684,11670,6855,1458,1005,910 1 161137 -- MSL 83 (19U 113)
+r 10245,11670,0,2121,417,910 0 161138 -- MSL 84 (19U 114)
+s 7806,11670,390,1242,1449,910 0 161139 -- MSL 85 (19U 115)
+t 8295,13944,390,1638,75,910 0 161140 -- MSL 86 (19U 116)
+u 13662,11670,390,576,381,576 0 161141 -- MSL 87 (19U 117)
+v 13662,11670,390,1317,423,910 0 161142 -- MSL 88 (19U 118)
+w 19029,11670,390,1209,393,910 0 161143 -- MSL 89 (19U 119)
+x 12198,11670,390,936,1476,910 0 161144 -- MSL 90 (19U 120)
+y 11709,11670,6705,867,2037,867 1 161145 -- MSL 91 (19U 121)
+z 11220,12315,0,1359,1530,910 0 161146 -- MSL 92 (19U 122)
+{ 11709,19935,6210,3360,-1691,910 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588,0,-4595 3 161148 -- MSL 94 (19U 124)
+ba "
+} 11709,19935,6210,0,2232 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,8952,0,0,-4028 0 161150 -- MSL 96 (19U 126)
+`A 18540,24930,150,0,2757 2 161216 -- MSL 99 (19U 192)
+^A 18540,24915,150,438,2757,438 2 161218 -- MSL 100 (19U 194)
+`E 15612,24930,150,1824,1827,910 2 161224 -- MSL 101 (19U 200)
+^E 15612,24915,150,1824,1827,910 2 161226 -- MSL 102 (19U 202)
+:E 15612,22620,150,1824,1827,910 2 161227 -- MSL 103 (19U 203)
+^I 8781,24915,150,4425,1641,910 2 161230 -- MSL 104 (19U 206)
+:I 8781,22620,150,4899,1641,910 2 161231 -- MSL 105 (19U 207)
+aa 12684,19590,0,1218,-5837,910 2 161204 -- MSL 106 (19U 180)
+ga 12684,19590,0,0,-3146 2 161120 -- MSL 107 (19U 96)
+a^ 12684,19614,0,210,-3725,210 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 12684,17394,0,153,-3872,153 0 161192 -- MSL 109 (19U 168)
+~ 12684,17481,0,1239,-3269,910 0 161176 -- MSL 110 (19U 152)
+a~ "
+`U 20004,24930,390,3312,-1640,910 2 161241 -- MSL 111 (19U 217)
+^U 20004,24915,390,3312,-1640,910 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105,0,1317,1317,910 2 161199 -- MSL 113 (19U 175)
+'Y 17565,24930,150,5103,-1385,910 2 161245 -- MSL 114 (19U 221)
+'y 11709,19590,6705,2106,2037,910 3 161277 -- MSL 115 (19U 253)
+de 12684,17805,0,828,-2297,828 0 161200 -- MSL 116 (19U 176)
+,C 18540,18555,6018,2820,-794,910 2 161223 -- MSL 117 (19U 199)
+,c 9759,11670,4770,1668,516,910 0 161255 -- MSL 118 (19U 231)
+~N 19515,23727,150,3774,1101,910 2 161233 -- MSL 119 (19U 209)
+~n 14637,17481,390,513,309,513 0 161265 -- MSL 120 (19U 241)
+r! 6831,12000,7038,1113,2007,910 1 161185 -- MSL 121 (19U 161)
+r? 9270,12000,7038,0,2256 1 161215 -- MSL 122 (19U 191)
+Cs 12684,15684,0,2205,291,910 0 161188 -- MSL 123 (19U 164)
+Po 12684,17805,390,1413,1200,910 0 161187 -- MSL 124 (19U 163)
+Ye 12684,18315,150,4137,-485,910 2 161189 -- MSL 125 (19U 165)
+sc 12684,18555,5250,0,66 2 161191 -- MSL 126 (19U 167)
+Fn 12684,20250,6705,3483,3216,910 3 161155 -- MSL 127 (19U 131)
+ct 12684,17568,186,795,-1196,795 0 161186 -- MSL 128 (19U 162)
+^a 12198,19614,390,687,1335,687 2 161250 -- MSL 129 (19U 226)
+^e 9759,19614,390,1671,687,910 2 161258 -- MSL 130 (19U 234)
+^o 12198,19614,390,453,288,453 2 161268 -- MSL 131 (19U 244)
+^u 13662,19614,390,576,381,576 2 161275 -- MSL 132 (19U 251)
+'a 12198,19590,390,1863,1335,910 2 161249 -- MSL 133 (19U 225)
+'e 9759,19590,390,3081,687,910 2 161257 -- MSL 134 (19U 233)
+'o 12198,19590,390,1863,288,910 2 161267 -- MSL 135 (19U 243)
+'u 13662,19590,390,1131,381,910 2 161274 -- MSL 136 (19U 250)
+`a 12198,19590,390,687,1335,687 2 161248 -- MSL 137 (19U 224)
+`e 9759,19590,390,1515,687,910 2 161256 -- MSL 138 (19U 232)
+`o 12198,19590,390,423,288,423 2 161266 -- MSL 139 (19U 242)
+`u 13662,19590,390,576,381,576 2 161273 -- MSL 140 (19U 249)
+:a 12198,17394,390,891,1335,891 0 161252 -- MSL 141 (19U 228)
+:e 9759,17394,390,2109,687,910 0 161259 -- MSL 142 (19U 235)
+:o 12198,17394,390,891,288,891 0 161270 -- MSL 143 (19U 246)
+:u 13662,17394,390,576,381,576 0 161276 -- MSL 144 (19U 252)
+oA 18540,24681,150,150,2757,150 2 161221 -- MSL 145 (19U 197)
+^i 7806,19614,390,2649,24,910 2 161262 -- MSL 146 (19U 238)
+/O 20979,18555,390,2475,1140,910 2 161240 -- MSL 147 (19U 216)
+AE 25371,18315,150,1821,2859,910 2 161222 -- MSL 148 (19U 198)
+oa 12198,19566,390,1257,1335,910 2 161253 -- MSL 149 (19U 229)
+'i 7806,19590,390,4059,24,910 2 161261 -- MSL 150 (19U 237)
+/o 12198,11670,390,2388,2475,910 0 161272 -- MSL 151 (19U 248)
+ae 16587,11670,390,1551,1377,910 0 161254 -- MSL 152 (19U 230)
+:A 18540,22620,150,1191,2757,910 2 161220 -- MSL 153 (19U 196)
+`i 7806,19590,390,966,24,910 2 161260 -- MSL 154 (19U 236)
+:O 20979,22620,390,1308,-623,910 2 161238 -- MSL 155 (19U 214)
+:U 20004,22620,390,3312,-1640,910 2 161244 -- MSL 156 (19U 220)
+'E 15612,24930,150,1824,1827,910 2 161225 -- MSL 157 (19U 201)
+:i 7806,17394,390,2562,24,910 0 161263 -- MSL 158 (19U 239)
+ss 13173,20250,6705,3594,6294,910 3 161247 -- MSL 159 (19U 223)
+^O 20979,24915,390,1308,-623,910 2 161236 -- MSL 160 (19U 212)
+'A 18540,24930,150,1083,2757,910 2 161217 -- MSL 161 (19U 193)
+~A 18540,23727,150,2175,2757,910 2 161219 -- MSL 162 (19U 195)
+~a 12198,17481,390,1482,1335,910 0 161251 -- MSL 163 (19U 227)
+-D 20004,18555,150,1380,1872,910 2 161232 -- MSL 164 (19U 208)
+Sd 12198,20199,327,540,288,540 2 161264 -- MSL 165 (19U 240)
+'I 8781,24930,150,5073,1641,910 2 161229 -- MSL 166 (19U 205)
+`I 8781,24930,150,3582,1641,910 2 161228 -- MSL 167 (19U 204)
+'O 20979,24930,390,1308,-623,910 2 161235 -- MSL 168 (19U 211)
+`O 20979,24930,390,1308,-623,910 2 161234 -- MSL 169 (19U 210)
+~O 20979,23727,390,1308,-623,910 2 161237 -- MSL 170 (19U 213)
+~o 12198,17481,390,1482,288,910 0 161269 -- MSL 171 (19U 245)
+vS 12198,24969,390,2829,759,910 2 161162 -- MSL 172 (19U 138)
+vs 7806,19863,390,4191,1449,910 2 161178 -- MSL 173 (19U 154)
+'U 20004,24930,390,3312,-1640,910 2 161242 -- MSL 174 (19U 218)
+:Y 17565,22620,150,5103,-1385,910 2 161183 -- MSL 175 (19U 159)
+:y 11709,17394,6705,1134,2037,910 1 161279 -- MSL 176 (19U 255)
+TP 14637,18315,150,1383,1722,910 2 161246 -- MSL 177 (19U 222)
+Tp 12198,20250,6855,963,3561,910 3 161278 -- MSL 178 (19U 254)
+mc 14637,10800,5595,612,585,612 0 161205 -- MSL 180 (19U 181)
+ps 12684,19635,4200,1812,-980,910 2 161206 -- MSL 181 (19U 182)
+34 20490,17805,390,0,-1073 0 161214 -- MSL 182 (19U 190)
+\- 20490,7305,0,0,-2531 0 60096 -- MSL 183 ( 7J 192)
+14 20490,17625,390,0,-1142 0 161212 -- MSL 184 (19U 188)
+12 20490,17625,390,33,-203,33 0 161213 -- MSL 185 (19U 189)
+Of 11709,17805,0,1590,-1724,910 0 161194 -- MSL 186 (19U 170)
+Om 11709,17805,0,936,-1988,910 0 161210 -- MSL 187 (19U 186)
+Fo 10734,9945,0,759,-8,759 0 161195 -- MSL 188 (19U 171)
+Fc 10734,9945,0,204,546,204 0 161211 -- MSL 190 (19U 187)
+t+- 20490,13191,3105,0,-2501 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916,0,-4595 2 161190 -- MSL 192 (19U 166)
+co 13173,19725,0,5526,-3701,910 2 161193 -- MSL 193 (19U 169)
+tno 20490,10029,0,0,-2054 0 161196 -- MSL 194 (19U 172)
+u00AD 6342,6960,0,438,183,438 0 161197 -- MSL 195 (19U 173)
+rg 13173,19725,0,5526,-3701,910 2 161198 -- MSL 196 (19U 174)
+S2 8781,17805,0,1725,-689,910 0 161202 -- MSL 197 (19U 178)
+S3 8781,17805,0,1746,-272,910 0 161203 -- MSL 198 (19U 179)
+ac 12684,0,4770,0,-947 0 161208 -- MSL 199 (19U 184)
+S1 8781,17625,0,1257,-1229,910 0 161209 -- MSL 200 (19U 185)
+tmu 20490,12969,189,0,-2792 0 161239 -- MSL 201 (19U 215)
+tdi 20490,12966,36,0,-2423 0 161271 -- MSL 202 (19U 247)
+u203C 11709,18648,390,2664,945,910 2 87315 -- MSL 221 (10U 19)
+u20A7 22932,18555,390,1638,1737,910 2 60121 -- MSL 232 ( 7J 217)
+pc 6342,10350,0,534,-1211,534 0 161207 -- MSL 302 (19U 183)
+u013F 15612,18315,150,345,1536,345 2 51943 -- MSL 306 ( 6J 231)
+u0140 8781,20250,390,2088,606,910 2 51959 -- MSL 307 ( 6J 247)
+u2113 12684,18150,297,306,-1187,306 0 60122 -- MSL 308 ( 7J 218)
+u0149 19515,18555,390,513,-1307,513 2 51951 -- MSL 309 ( 6J 239)
+fm 12684,17805,0,0,-2969 0 60101 -- MSL 310 ( 7J 197)
+sd 12684,17805,0,0,-1373 0 60102 -- MSL 311 ( 7J 198)
+dg 12684,18555,5250,2079,-740,910 2 161158 -- MSL 312 (19U 134)
+tm 16101,17550,0,6012,-3662,910 0 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588,1317,1317,910 1 60095 -- MSL 314 ( 7J 191)
+ah 12684,19863,0,1152,-4667,910 2 75169 -- MSL 315 ( 9E 161)
+ao 12684,19566,0,570,-4964,570 2 60152 -- MSL 316 ( 7J 248)
+f/ 2928,17415,390,8091,6480,910 0 60109 -- MSL 324 ( 7J 205)
+em 20490,6960,0,651,420,651 0 161175 -- MSL 325 (19U 151)
+en 12684,6960,0,756,357,756 0 161174 -- MSL 326 (19U 150)
+dd 12684,18555,5250,1128,210,910 2 161159 -- MSL 327 (19U 135)
+.i 7806,11670,390,657,24,657 0 46333 -- MSL 328 ( 5T 253)
+aq 7317,18555,0,2418,-3857,910 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226,0,0,-497 0 161173 -- MSL 331 (19U 149)
+u207F 11709,17805,0,2733,-869,910 0 87548 -- MSL 332 (10U 252)
+u0111 13173,20250,390,2733,915,910 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 18540,23550,150,1464,2757,910 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 12198,18054,390,1161,1335,910 0 75235 -- MSL 401 ( 9E 227)
+u0041_0328 18540,18555,3990,0,2757 2 75173 -- MSL 404 ( 9E 165)
+u0061_0328 12198,11670,4155,687,1335,687 0 75193 -- MSL 405 ( 9E 185)
+'C 18540,24930,390,2820,-794,910 2 75206 -- MSL 406 ( 9E 198)
+'c 9759,19590,390,3231,495,910 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 18540,24969,390,2820,-794,910 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 9759,19863,390,3513,495,910 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 20004,24969,150,1380,1872,910 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 16587,20250,390,3657,915,910 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 15612,24969,150,1824,1827,910 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 9759,19863,390,3213,687,910 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 15612,18315,3990,1824,1827,910 2 75210 -- MSL 422 ( 9E 202)
+u0065_0328 9759,11670,4155,1515,687,910 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 15612,24930,150,345,1536,345 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 7317,25590,390,3495,606,910 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 15612,18675,150,1992,1536,910 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 9759,20250,390,4095,606,910 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 19515,24930,150,3774,1101,910 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 14637,19590,390,642,309,642 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 19515,24969,150,3774,1101,910 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 14637,19863,390,774,309,774 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 20979,24930,390,1308,-623,910 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 12198,19590,390,4128,288,910 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 18051,24930,150,0,1965 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 10245,19590,0,2838,417,910 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 18051,24969,150,0,1965 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 10245,19863,0,2970,417,910 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 12198,24930,390,3366,759,910 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 7806,19590,390,4059,1449,910 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 16101,24969,150,4656,-1577,910 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 10245,20250,390,3819,75,910 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 16101,19185,6018,4656,-1577,910 2 75230 -- MSL 468 ( 9E 222)
+u0074_0327 8295,13944,4770,1638,1248,910 0 75262 -- MSL 469 ( 9E 254)
+u0055_030B 20004,24930,390,3312,-1640,910 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 13662,19590,390,3486,381,910 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 20004,24681,390,3312,-1640,910 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 13662,19566,390,576,381,576 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 16587,24930,0,1626,78,910 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 11220,19590,0,2352,1530,910 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 16587,22380,0,1626,78,910 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 11220,17034,0,1359,1530,910 0 75199 -- MSL 485 ( 9E 191)
+u2070 8781,17805,0,2151,-1364,910 0 51753 -- MSL 1000 ( 6J 41)
+u2074 8781,17625,0,1854,-737,910 0 51748 -- MSL 1001 ( 6J 36)
+u2075 8781,17625,0,1734,-872,910 0 51749 -- MSL 1002 ( 6J 37)
+u2076 8781,17805,0,2757,-857,910 0 51806 -- MSL 1003 ( 6J 94)
+u2077 8781,17625,0,3267,-1376,910 0 51750 -- MSL 1004 ( 6J 38)
+u2078 8781,17805,0,2412,-869,910 0 51754 -- MSL 1005 ( 6J 42)
+u2079 8781,17805,0,2271,-764,910 0 51752 -- MSL 1006 ( 6J 40)
+lq 10734,18555,0,3054,-1955,910 2 161171 -- MSL 1017 (19U 147)
+rq 10734,18555,0,2940,-1841,910 2 161172 -- MSL 1018 (19U 148)
+Bq 10734,2013,4437,0,2022 0 161156 -- MSL 1019 (19U 132)
+u2003 20490,0,0,0,1317 0 51821 -- MSL 1020 ( 6J 109)
+u2002 12684,0,0,0,1317 0 51822 -- MSL 1021 ( 6J 110)
+u2009 6342,0,0,0,1317 0 51828 -- MSL 1023 ( 6J 116)
+u2026 20490,2706,390,0,522 0 161157 -- MSL 1028 (19U 133)
+vz 11220,19863,0,2484,1530,910 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,17703,0,5265,-3707,910 0 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056,642,-1343,642 2 51794 -- MSL 1036 ( 6J 82)
+fi 13173,20250,6705,1812,5289,910 3 60077 -- MSL 1040 ( 7J 173)
+fl 14148,20250,6705,1464,5172,910 3 60078 -- MSL 1041 ( 7J 174)
+ff 13662,20250,6705,6495,5286,910 3 51883 -- MSL 1042 ( 6J 171)
+Fi 19029,20250,6705,1914,5388,910 3 51884 -- MSL 1043 ( 6J 172)
+Fl 19515,20601,6705,2037,5289,910 3 51885 -- MSL 1044 ( 6J 173)
+ij 14148,18495,6705,2055,24,910 3 60134 -- MSL 1047 ( 7J 230)
+u2105 20490,20268,180,1470,-443,910 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 20490,23550,390,1182,-872,910 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 11220,18054,6705,1806,1908,910 1 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 12198,18555,6018,1974,759,910 2 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 7806,11670,4770,1242,1641,910 0 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 8781,22380,150,3582,1641,910 2 46301 -- MSL 1065 ( 5T 221)
+bq 6342,2013,4437,0,1680 0 161154 -- MSL 1067 (19U 130)
+%0 29760,17805,207,378,-1367,378 0 161161 -- MSL 1068 (19U 137)
+a- 12684,17328,0,609,-3932,609 0 60154 -- MSL 1084 ( 7J 250)
+ab 12684,18054,0,918,-4340,910 0 75170 -- MSL 1086 ( 9E 162)
+a. 12684,17034,0,0,-6227 0 75263 -- MSL 1088 ( 9E 255)
+oe 18051,11670,390,1527,288,910 0 161180 -- MSL 1090 (19U 156)
+OE 27321,18555,390,1800,-635,910 2 161164 -- MSL 1091 (19U 140)
+fo 7806,9945,0,780,-671,780 0 161163 -- MSL 1092 (19U 139)
+fc 7806,9945,0,0,147 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624,0,0,-2021 0 60091 -- MSL 1094 ( 7J 187)
+/L 15612,18315,150,345,1536,345 2 75171 -- MSL 1095 ( 9E 163)
+/l 7317,20250,390,2265,660,910 2 75187 -- MSL 1096 ( 9E 179)
+a" 12684,19590,0,3705,-4451,910 2 75197 -- MSL 1097 ( 9E 189)
+ho 12684,420,4155,0,-3068 0 75186 -- MSL 1098 ( 9E 178)
+vZ 16587,24969,0,1626,78,910 2 75150 -- MSL 1106 ( 9E 142)
+IJ 17076,18315,5814,3522,1641,910 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/GR b/font/devlj4/GR
new file mode 100644
index 0000000..1ba1902
--- /dev/null
+++ b/font/devlj4/GR
@@ -0,0 +1,836 @@
+# Garmond Antiqua
+name GR
+spacewidth 6831
+pcltypeface 4197
+pclproportional 1
+pclweight 0
+pclstyle 0
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -3413
+P . -4388
+P , -4388
+V A -4388
+A V -4388
+T o -3902
+T r -2438
+T c -3413
+T e -3413
+T d -3413
+T s -2438
+T y -4388
+T a -2438
+T w -4388
+T u -3413
+L T -2924
+L Y -2924
+Y o -4388
+Y e -3902
+Y a -2924
+A W -4388
+W A -4388
+T A -2438
+V o -3413
+V e -3413
+V a -2924
+Y A -2924
+F A -2924
+F . -3902
+F , -3902
+A T -2924
+A Y -2924
+v . -2438
+v , -2438
+y . -2924
+y , -2924
+T . -2438
+T , -2438
+L W -3413
+P A -2924
+V . -3902
+V , -3902
+Y . -2924
+Y , -2924
+W o -3413
+W e -3413
+W a -2924
+W . -3902
+W , -3902
+r . -1460
+r , -1460
+w . -2924
+w , -2924
+Y u -3413
+A v -2438
+A y -2438
+A w -2924
+o . -1460
+o , -1460
+p . -1460
+p , -1460
+e . -485
+e , -485
+b . -1460
+b , -1460
+O T -1949
+O V -1949
+O Y -1949
+O . -1949
+O , -1949
+L y -2438
+L O -1949
+L G -1949
+L C -1949
+L Q -1949
+P J -974
+V y -1949
+V u -1949
+V O -1949
+V G -1949
+V C -1949
+V Q -1949
+D T -1949
+D V -1949
+D Y -1949
+D . -1949
+D , -1949
+Y O -1949
+Y G -1949
+Y C -1949
+Y Q -1949
+F o -1460
+F e -1460
+F a -974
+c . -485
+c , -485
+O A -1460
+O W -1949
+L U -1949
+R T -2924
+R V -2924
+R Y -2924
+R W -2924
+G T -485
+P o -1460
+P g -974
+P e -1460
+P a -974
+D A -1460
+D W -1949
+B T -1460
+B Y -1460
+B . -1460
+B , -1460
+A O -1460
+A G -1460
+A C -1460
+A U -1949
+A Q -1460
+W r -1949
+W y -1949
+W u -1949
+W O -1949
+W G -1949
+W C -1949
+W Q -1949
+J A -485
+J . -485
+J , -485
+U A -1949
+U . -1949
+U , -1949
+Q A -1460
+Q W -1949
+T O -1949
+T G -1949
+T C -1949
+T Q -1949
+O X -1460
+L o -1460
+L e -974
+L q -1460
+G V -485
+G Y -485
+G W -485
+P T -974
+P V -974
+P Y -974
+D X -1460
+B V -1460
+B X -1460
+B A -1460
+B W -1460
+S . -974
+S , -974
+X o -1460
+X e -974
+X y -1460
+X O -1460
+X G -1460
+X C -1460
+X Q -1460
+A o -1460
+A e -974
+Q X -1460
+K o -1460
+K e -974
+K y -1460
+K w -1460
+K O -1460
+K G -1460
+K C -1460
+K Q -1460
+o v -1460
+o y -1460
+o x -1460
+o w -1460
+h v -974
+h y -974
+n v -974
+n y -974
+m v -974
+m y -974
+r g -974
+p v -974
+p y -974
+p x -974
+v o -1460
+v g -974
+v c -974
+v d -974
+v a -974
+v q -974
+e v -485
+e y -485
+b v -974
+b y -974
+b w -1460
+s . -485
+s , -485
+y o -1460
+y g -974
+y c -1460
+y d -1460
+y a -974
+y q -1460
+x o -1460
+x c -974
+x e -974
+x d -974
+x q -974
+a v -485
+a y -485
+a w -485
+w o -1460
+w g -974
+w c -1460
+w d -1460
+w a -974
+w q -1460
+T S -974
+R o -1460
+R y -1949
+R O -1949
+R G -1949
+R C -1949
+R U -1949
+R Q -1949
+P s -485
+P Z -974
+P X -974
+P W -974
+V S -974
+S A -974
+Y S -974
+X u -974
+A t -974
+A c -974
+A d -974
+A u -974
+A q -1460
+W S -974
+J y -485
+K c -974
+K u -974
+o f -485
+h w -974
+n w -974
+m w -974
+r o -1460
+r c -974
+r e -974
+r d -974
+r a -974
+r q -974
+p w -974
+v e -974
+v s -485
+e x -485
+e w -485
+y e -1460
+y s -485
+f o -1460
+f c -974
+f e -974
+f d -974
+f q -974
+w e -1460
+w s -485
+k o -1460
+k c -974
+k e -974
+k d -974
+k q -974
+O Z -974
+O J -974
+L J -974
+R e -974
+R u -974
+P H -485
+P N -485
+P M -485
+P L -485
+P R -485
+P I -485
+P P -485
+P E -485
+P D -485
+P B -485
+P F -485
+P U -485
+P K -485
+E t -485
+E o -974
+E c -485
+E v -485
+E e -485
+E d -485
+E y -485
+E w -485
+E u -485
+E q -485
+E O -485
+E G -485
+E C -485
+E J -485
+E Q -485
+Z o -1460
+Z e -974
+Z d -974
+Z y -974
+Z w -974
+Z u -974
+Z O -974
+Z G -974
+Z C -974
+Z Q -974
+D Z -974
+D J -974
+B Z -974
+B J -974
+A J -974
+J o -974
+J e -485
+J a -485
+J u -485
+J O -485
+J G -485
+J C -485
+J S -485
+J Q -485
+U g -485
+K J -485
+t o -1460
+t c -974
+t e -974
+t d -974
+t q -974
+o t -485
+o g -485
+o z -974
+o j -485
+r s -485
+g o -974
+g c -485
+g e -485
+g d -485
+g q -485
+p z -485
+e z -485
+z o -974
+z c -485
+z e -485
+z d -485
+z q -485
+b z -485
+R J -974
+G J -485
+C o -485
+C y -974
+E T -485
+E V -485
+E Y -485
+E W -485
+E U -485
+B o -485
+B y -485
+B a -485
+B H -485
+B N -485
+B M -485
+B L -485
+B R -485
+B I -485
+B P -485
+B E -485
+B D -485
+B B -485
+B F -485
+B U -485
+B K -485
+U t -485
+U o -974
+U n -485
+U m -485
+U r -485
+U p -485
+U c -485
+U v -485
+U e -485
+U z -485
+U d -485
+U s -974
+U y -485
+U f -485
+U x -485
+U a -974
+U w -485
+U q -485
+U O -485
+U G -485
+U C -485
+U S -485
+U Q -485
+K T -485
+K V -485
+K Y -485
+K W -485
+K U -485
+L cq -3413
+L ' -3413
+T hy -4388
+T - -4388
+T en -4388
+T em -4388
+A cq -2924
+A ' -2924
+hy T -4388
+- T -4388
+en T -4388
+em T -4388
+Y hy -3413
+Y - -3413
+Y en -3413
+Y em -3413
+p cq -974
+p ' -974
+e cq -485
+e ' -485
+b cq -1460
+b ' -1460
+a cq -485
+a ' -485
+V hy -1949
+V - -1949
+V en -1949
+V em -1949
+h cq -974
+h ' -974
+n cq -974
+n ' -974
+m cq -974
+m ' -974
+R cq -1949
+R ' -1949
+W hy -1949
+W - -1949
+W en -1949
+W em -1949
+cq d -1460
+' d -1460
+L hy -1949
+L - -1949
+L en -1949
+L em -1949
+X hy -1460
+X - -1460
+X en -1460
+X em -1460
+A hy -1460
+A - -1460
+A en -1460
+A em -1460
+K hy -1460
+K - -1460
+K en -1460
+K em -1460
+cq s -485
+' s -485
+hy X -1460
+- X -1460
+hy A -1460
+- A -1460
+en X -1460
+en A -1460
+em X -1460
+R hy -1949
+R - -1949
+R en -1949
+R em -1949
+K cq -485
+K ' -485
+G cq -485
+G ' -485
+E cq -485
+E ' -485
+E hy -485
+E - -485
+E en -485
+E em -485
+Z hy -974
+Z - -974
+Z en -974
+Z em -974
+B cq -485
+B ' -485
+J hy -485
+J - -485
+J en -485
+J em -485
+U hy -485
+U - -485
+U en -485
+U em -485
+charset
+! 6831,18837,390 2 161057 -- MSL 1 (19U 33)
+dq 11220,18555 2 161058 -- MSL 2 (19U 34)
+" "
+sh 12684,17805,390 0 161059 -- MSL 3 (19U 35)
+# "
+Do 12684,19122,1707 2 161060 -- MSL 4 (19U 36)
+$ "
+% 21468,17415,390 0 161061 -- MSL 5 (19U 37)
+& 21954,18165,390 0 161062 -- MSL 6 (19U 38)
+cq 7317,18555 2 161170 -- MSL 8 (19U 146)
+' "
+( 7806,20250,6705 3 161064 -- MSL 9 (19U 40)
+) 7806,20250,6705 3 161065 -- MSL 10 (19U 41)
+* 12684,18555 2 161066 -- MSL 11 (19U 42)
++ 21468,13191,261 0 161067 -- MSL 12 (19U 43)
+, 6831,3096,4449 0 161068 -- MSL 13 (19U 44)
+hy 6831,6960 0 161069 -- MSL 14 (19U 45)
+- "
+. 6831,2847,390 0 161070 -- MSL 15 (19U 46)
+sl 12684,20250,480 2 161071 -- MSL 16 (19U 47)
+/ "
+0 12684,17805,390 0 161072 -- MSL 17 (19U 48)
+1 12684,17805,150 0 161073 -- MSL 18 (19U 49)
+2 12684,17805,150 0 161074 -- MSL 19 (19U 50)
+3 12684,17805,390 0 161075 -- MSL 20 (19U 51)
+4 12684,17415,390 0 161076 -- MSL 21 (19U 52)
+5 12684,17415,390 0 161077 -- MSL 22 (19U 53)
+6 12684,17811,390 0 161078 -- MSL 23 (19U 54)
+7 12684,17415,390 0 161079 -- MSL 24 (19U 55)
+8 12684,17805,390 0 161080 -- MSL 25 (19U 56)
+9 12684,17805,390 0 161081 -- MSL 26 (19U 57)
+: 6831,10593,390 0 161082 -- MSL 27 (19U 58)
+; 6831,10593,4449 0 161083 -- MSL 28 (19U 59)
+< 26346,16068 0 161084 -- MSL 29 (19U 60)
+= 21468,8883 0 161085 -- MSL 30 (19U 61)
+> 26346,16068 0 161086 -- MSL 31 (19U 62)
+? 9759,18837,390 2 161087 -- MSL 32 (19U 63)
+at 21594,16980,3654 0 161088 -- MSL 33 (19U 64)
+@ "
+A 20004,18555,150 2 161089 -- MSL 34 (19U 65)
+B 16101,18315,150 2 161090 -- MSL 35 (19U 66)
+C 19515,18555,390 2 161091 -- MSL 36 (19U 67)
+D 20979,18555,150 2 161092 -- MSL 37 (19U 68)
+E 16587,18315,150 2 161093 -- MSL 38 (19U 69)
+F 15612,18315,150 2 161094 -- MSL 39 (19U 70)
+G 20979,18555,390 2 161095 -- MSL 40 (19U 71)
+H 22443,18315,150 2 161096 -- MSL 41 (19U 72)
+I 8781,18315,150 2 161097 -- MSL 42 (19U 73)
+J 9759,18315,6060 2 161098 -- MSL 43 (19U 74)
+K 19029,18315,150 2 161099 -- MSL 44 (19U 75)
+L 16101,18315,150 2 161100 -- MSL 45 (19U 76)
+M 23907,18315,390 2 161101 -- MSL 46 (19U 77)
+N 22443,18315,774 2 161102 -- MSL 47 (19U 78)
+O 22443,18555,390 2 161103 -- MSL 48 (19U 79)
+P 15612,18555,150 2 161104 -- MSL 49 (19U 80)
+Q 22443,18555,6339 3 161105 -- MSL 50 (19U 81)
+R 18540,18315,150 2 161106 -- MSL 51 (19U 82)
+S 12684,18555,390 2 161107 -- MSL 52 (19U 83)
+T 18051,19299,150 2 161108 -- MSL 53 (19U 84)
+U 21468,18315,390 2 161109 -- MSL 54 (19U 85)
+V 19029,18315,390 2 161110 -- MSL 55 (19U 86)
+W 25857,18315,390 2 161111 -- MSL 56 (19U 87)
+X 20004,18315,150 2 161112 -- MSL 57 (19U 88)
+Y 19029,18315,150 2 161113 -- MSL 58 (19U 89)
+Z 17565,19299 2 161114 -- MSL 59 (19U 90)
+lB 7806,18165,4905 0 161115 -- MSL 60 (19U 91)
+[ "
+rs 12684,20250,480 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 7806,18165,4905 0 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588 1 161119 -- MSL 64 (19U 95)
+oq 7317,18555 2 161169 -- MSL 66 (19U 145)
+` "
+a 11220,11670,390 0 161121 -- MSL 67 (19U 97)
+b 14148,20265,390 2 161122 -- MSL 68 (19U 98)
+c 11220,11670,390 0 161123 -- MSL 69 (19U 99)
+d 13662,20250,390 2 161124 -- MSL 70 (19U 100)
+e 11220,11670,390 0 161125 -- MSL 71 (19U 101)
+f 8295,20250,150 2 161126 -- MSL 72 (19U 102)
+g 12198,11670,6705 1 161127 -- MSL 73 (19U 103)
+h 14637,20250,150 2 161128 -- MSL 74 (19U 104)
+i 7317,19356,150 2 161129 -- MSL 75 (19U 105)
+j 6831,19356,6705 3 161130 -- MSL 76 (19U 106)
+k 14637,20250,150 2 161131 -- MSL 77 (19U 107)
+l 7317,20262,150 2 161132 -- MSL 78 (19U 108)
+m 21954,11670,153 0 161133 -- MSL 79 (19U 109)
+n 14637,11673,150 0 161134 -- MSL 80 (19U 110)
+o 14148,11670,390 0 161135 -- MSL 81 (19U 111)
+p 14148,11679,6855 1 161136 -- MSL 82 (19U 112)
+q 13662,11670,6855 1 161137 -- MSL 83 (19U 113)
+r 10245,11670,150 0 161138 -- MSL 84 (19U 114)
+s 9270,11670,390 0 161139 -- MSL 85 (19U 115)
+t 8781,13677,390 0 161140 -- MSL 86 (19U 116)
+u 14148,11280,390 0 161141 -- MSL 87 (19U 117)
+v 13173,11430,390 0 161142 -- MSL 88 (19U 118)
+w 20004,11430,390 0 161143 -- MSL 89 (19U 119)
+x 13173,11430,150 0 161144 -- MSL 90 (19U 120)
+y 14148,11430,6705 1 161145 -- MSL 91 (19U 121)
+z 12198,12063 0 161146 -- MSL 92 (19U 122)
+{ 11709,19935,6210 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588 3 161148 -- MSL 94 (19U 124)
+ba "
+} 11709,19935,6210 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,8952 0 161150 -- MSL 96 (19U 126)
+`A 20004,24846,150 2 161216 -- MSL 99 (19U 192)
+^A 20004,24600,150 2 161218 -- MSL 100 (19U 194)
+`E 16587,24846,150 2 161224 -- MSL 101 (19U 200)
+^E 16587,24600,150 2 161226 -- MSL 102 (19U 202)
+:E 16587,23751,150 2 161227 -- MSL 103 (19U 203)
+^I 8781,24600,150 2 161230 -- MSL 104 (19U 206)
+:I 8781,23751,150 2 161231 -- MSL 105 (19U 207)
+aa 12684,20460 2 161204 -- MSL 106 (19U 180)
+ga 12684,20460 2 161120 -- MSL 107 (19U 96)
+a^ 12684,20460 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 12684,17244 0 161192 -- MSL 109 (19U 168)
+~ 12684,18180 0 161176 -- MSL 110 (19U 152)
+a~ "
+`U 21468,24846,390 2 161241 -- MSL 111 (19U 217)
+^U 21468,24600,390 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105 2 161199 -- MSL 113 (19U 175)
+'Y 19029,24846,150 2 161245 -- MSL 114 (19U 221)
+'y 14148,20460,6705 3 161277 -- MSL 115 (19U 253)
+de 12684,17805 0 161200 -- MSL 116 (19U 176)
+,C 19515,18555,5964 2 161223 -- MSL 117 (19U 199)
+,c 11220,11670,5553 0 161255 -- MSL 118 (19U 231)
+~N 22443,24498,774 2 161233 -- MSL 119 (19U 209)
+~n 14637,18180,150 0 161265 -- MSL 120 (19U 241)
+r! 6831,12096,7131 1 161185 -- MSL 121 (19U 161)
+r? 9759,12096,7131 1 161215 -- MSL 122 (19U 191)
+Cs 12684,15684 0 161188 -- MSL 123 (19U 164)
+Po 12684,17805,5424 0 161187 -- MSL 124 (19U 163)
+Ye 12684,18315,150 2 161189 -- MSL 125 (19U 165)
+sc 12684,18555,5250 2 161191 -- MSL 126 (19U 167)
+Fn 12684,20250,6705 3 161155 -- MSL 127 (19U 131)
+ct 12684,17556,126 0 161186 -- MSL 128 (19U 162)
+^a 11220,20460,390 2 161250 -- MSL 129 (19U 226)
+^e 11220,20460,390 2 161258 -- MSL 130 (19U 234)
+^o 14148,20460,390 2 161268 -- MSL 131 (19U 244)
+^u 14148,20460,390 2 161275 -- MSL 132 (19U 251)
+'a 11220,20460,390 2 161249 -- MSL 133 (19U 225)
+'e 11220,20460,390 2 161257 -- MSL 134 (19U 233)
+'o 14148,20460,390 2 161267 -- MSL 135 (19U 243)
+'u 14148,20460,390 2 161274 -- MSL 136 (19U 250)
+`a 11220,20460,390 2 161248 -- MSL 137 (19U 224)
+`e 11220,20460,390 2 161256 -- MSL 138 (19U 232)
+`o 14148,20460,390 2 161266 -- MSL 139 (19U 242)
+`u 14148,20460,390 2 161273 -- MSL 140 (19U 249)
+:a 11220,17244,390 0 161252 -- MSL 141 (19U 228)
+:e 11220,17244,390 0 161259 -- MSL 142 (19U 235)
+:o 14148,17244,390 0 161270 -- MSL 143 (19U 246)
+:u 14148,17244,390 0 161276 -- MSL 144 (19U 252)
+oA 20004,24768,150 2 161221 -- MSL 145 (19U 197)
+^i 7317,20460,150 2 161262 -- MSL 146 (19U 238)
+/O 22443,18948,501 2 161240 -- MSL 147 (19U 216)
+AE 28299,18315,150 2 161222 -- MSL 148 (19U 198)
+oa 11220,19248,390 2 161253 -- MSL 149 (19U 229)
+'i 7317,20460,150 2 161261 -- MSL 150 (19U 237)
+/o 14148,11832,489 0 161272 -- MSL 151 (19U 248)
+ae 17076,11670,390 0 161254 -- MSL 152 (19U 230)
+:A 20004,23751,150 2 161220 -- MSL 153 (19U 196)
+`i 7317,20460,150 2 161260 -- MSL 154 (19U 236)
+:O 22443,23751,390 2 161238 -- MSL 155 (19U 214)
+:U 21468,23751,390 2 161244 -- MSL 156 (19U 220)
+'E 16587,24846,150 2 161225 -- MSL 157 (19U 201)
+:i 7317,17244,150 0 161263 -- MSL 158 (19U 239)
+ss 14637,20250,390 2 161247 -- MSL 159 (19U 223)
+^O 22443,24600,390 2 161236 -- MSL 160 (19U 212)
+'A 20004,24846,150 2 161217 -- MSL 161 (19U 193)
+~A 20004,24498,150 2 161219 -- MSL 162 (19U 195)
+~a 11220,18180,390 0 161251 -- MSL 163 (19U 227)
+-D 20979,18555,150 2 161232 -- MSL 164 (19U 208)
+Sd 14148,20250,390 2 161264 -- MSL 165 (19U 240)
+'I 8781,24846,150 2 161229 -- MSL 166 (19U 205)
+`I 8781,24846,150 2 161228 -- MSL 167 (19U 204)
+'O 22443,24846,390 2 161235 -- MSL 168 (19U 211)
+`O 22443,24846,390 2 161234 -- MSL 169 (19U 210)
+~O 22443,24498,390 2 161237 -- MSL 170 (19U 213)
+~o 14148,18180,390 0 161269 -- MSL 171 (19U 245)
+vS 12684,24612,390 2 161162 -- MSL 172 (19U 138)
+vs 9270,20499,390 2 161178 -- MSL 173 (19U 154)
+'U 21468,24846,390 2 161242 -- MSL 174 (19U 218)
+:Y 19029,23751,150 2 161183 -- MSL 175 (19U 159)
+:y 14148,17244,6705 1 161279 -- MSL 176 (19U 255)
+TP 15612,18315,150 2 161246 -- MSL 177 (19U 222)
+Tp 14148,20250,6855 3 161278 -- MSL 178 (19U 254)
+mc 14637,10800,5595 0 161205 -- MSL 180 (19U 181)
+ps 12684,19635,4200 2 161206 -- MSL 181 (19U 182)
+34 21468,17805,288 0 161214 -- MSL 182 (19U 190)
+\- 21468,7305 0 60096 -- MSL 183 ( 7J 192)
+14 21468,17805,288 0 161212 -- MSL 184 (19U 188)
+12 21468,17805,288 0 161213 -- MSL 185 (19U 189)
+Of 12684,17805 0 161194 -- MSL 186 (19U 170)
+Om 12684,17805 0 161210 -- MSL 187 (19U 186)
+Fo 11220,9945 0 161195 -- MSL 188 (19U 171)
+Fc 11220,9945 0 161211 -- MSL 190 (19U 187)
+t+- 21468,13191,3105 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916 2 161190 -- MSL 192 (19U 166)
+co 13173,19725 2 161193 -- MSL 193 (19U 169)
+tno 21468,10029 0 161196 -- MSL 194 (19U 172)
+u00AD 6831,6960 0 161197 -- MSL 195 (19U 173)
+rg 13173,19725 2 161198 -- MSL 196 (19U 174)
+S2 8781,17805 0 161202 -- MSL 197 (19U 178)
+S3 8781,17805 0 161203 -- MSL 198 (19U 179)
+ac 12684,255,5553 0 161208 -- MSL 199 (19U 184)
+S1 8781,17805 0 161209 -- MSL 200 (19U 185)
+tmu 21468,12969,189 0 161239 -- MSL 201 (19U 215)
+tdi 21468,12966,36 0 161271 -- MSL 202 (19U 247)
+u203C 12684,18837,390 2 87315 -- MSL 221 (10U 19)
+u20A7 24396,18555,390 2 60121 -- MSL 232 ( 7J 217)
+pc 6831,10326 0 161207 -- MSL 302 (19U 183)
+u013F 16101,18315,150 2 51943 -- MSL 306 ( 6J 231)
+u0140 8778,20262,150 2 51959 -- MSL 307 ( 6J 247)
+u2113 12684,18150,297 0 60122 -- MSL 308 ( 7J 218)
+u0149 17079,18555,150 2 51951 -- MSL 309 ( 6J 239)
+fm 12684,17805 0 60101 -- MSL 310 ( 7J 197)
+sd 12684,17805 0 60102 -- MSL 311 ( 7J 198)
+dg 12684,18555,5250 2 161158 -- MSL 312 (19U 134)
+tm 16101,17550 0 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588 1 60095 -- MSL 314 ( 7J 191)
+ah 12684,20499 2 75169 -- MSL 315 ( 9E 161)
+ao 12684,19248 2 60152 -- MSL 316 ( 7J 248)
+f/ 2928,17805,288 0 60109 -- MSL 324 ( 7J 205)
+em 21468,6960 0 161175 -- MSL 325 (19U 151)
+en 12684,6960 0 161174 -- MSL 326 (19U 150)
+dd 12684,18555,5250 2 161159 -- MSL 327 (19U 135)
+.i 7317,11673,150 0 46333 -- MSL 328 ( 5T 253)
+aq 7317,18555 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226 0 161173 -- MSL 331 (19U 149)
+u207F 14637,17808 0 87548 -- MSL 332 (10U 252)
+u0111 13662,20250,390 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 20004,24465,150 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 11220,17796,390 0 75235 -- MSL 401 ( 9E 227)
+u0041_0328 20004,18555,4461 2 75173 -- MSL 404 ( 9E 165)
+u0061_0328 11220,11670,4653 0 75193 -- MSL 405 ( 9E 185)
+'C 19515,24846,390 2 75206 -- MSL 406 ( 9E 198)
+'c 11220,20460,390 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 19515,24612,390 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 11220,20499,390 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 20979,24612,150 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 17076,20250,390 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 16587,24612,150 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 11220,20499,390 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 16587,18315,4461 2 75210 -- MSL 422 ( 9E 202)
+u0065_0328 11220,11670,4653 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 16101,24846,150 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 7317,25626,150 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 16101,18846,150 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 10245,20262,150 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 22443,24846,774 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 14637,20460,150 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 22443,24612,774 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 14637,20499,150 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 22443,24846,390 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 14148,20460,390 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 18540,24846,150 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 10245,20460,150 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 18540,24612,150 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 10245,20499,150 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 12684,24846,390 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 9270,20460,390 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 18051,24612,150 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 9759,20250,390 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 18051,19299,5964 2 75230 -- MSL 468 ( 9E 222)
+u0074_0327 8781,13677,5553 0 75262 -- MSL 469 ( 9E 254)
+u0055_030B 21468,24846,390 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 14148,20460,390 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 21468,24768,390 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 14148,19248,390 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 17565,24846 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 12198,20460 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 17565,23751 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 12198,17244 0 75199 -- MSL 485 ( 9E 191)
+u2070 8781,17805 0 51753 -- MSL 1000 ( 6J 41)
+u2074 8781,17805 0 51748 -- MSL 1001 ( 6J 36)
+u2075 8781,17625 0 51749 -- MSL 1002 ( 6J 37)
+u2076 8781,17805 0 51806 -- MSL 1003 ( 6J 94)
+u2077 8781,17625 0 51750 -- MSL 1004 ( 6J 38)
+u2078 8781,17805 0 51754 -- MSL 1005 ( 6J 42)
+u2079 8781,17805 0 51752 -- MSL 1006 ( 6J 40)
+lq 11220,18555 2 161171 -- MSL 1017 (19U 147)
+rq 11220,18555 2 161172 -- MSL 1018 (19U 148)
+Bq 11220,2811,3939 0 161156 -- MSL 1019 (19U 132)
+u2003 21468,0 0 51821 -- MSL 1020 ( 6J 109)
+u2002 12684,0 0 51822 -- MSL 1021 ( 6J 110)
+u2009 6831,0 0 51828 -- MSL 1023 ( 6J 116)
+u2026 21468,2685,390 0 161157 -- MSL 1028 (19U 133)
+vz 12198,20499 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,17703 0 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056 2 51794 -- MSL 1036 ( 6J 82)
+fi 14637,20250,150 2 60077 -- MSL 1040 ( 7J 173)
+fl 14637,20250,150 2 60078 -- MSL 1041 ( 7J 174)
+ff 15612,20250,150 2 51883 -- MSL 1042 ( 6J 171)
+Fi 21954,20250,150 2 51884 -- MSL 1043 ( 6J 172)
+Fl 21954,20250,150 2 51885 -- MSL 1044 ( 6J 173)
+ij 14148,19356,6705 3 60134 -- MSL 1047 ( 7J 230)
+u2105 23415,19962,474 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 20979,24465,390 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 12198,17796,6705 1 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 12684,18555,5964 2 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 9270,11670,5553 0 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 8781,23751,150 2 46301 -- MSL 1065 ( 5T 221)
+bq 7317,2811,3939 0 161154 -- MSL 1067 (19U 130)
+%0 30738,17805,180 0 161161 -- MSL 1068 (19U 137)
+a- 12684,17367 0 60154 -- MSL 1084 ( 7J 250)
+ab 12684,17796 0 75170 -- MSL 1086 ( 9E 162)
+a. 12684,17244 0 75263 -- MSL 1088 ( 9E 255)
+oe 20004,11670,390 0 161180 -- MSL 1090 (19U 156)
+OE 27321,18555,390 2 161164 -- MSL 1091 (19U 140)
+fo 7317,9945 0 161163 -- MSL 1092 (19U 139)
+fc 7317,9945 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624 0 60091 -- MSL 1094 ( 7J 187)
+/L 16101,18315,150 2 75171 -- MSL 1095 ( 9E 163)
+/l 7317,20262,150 2 75187 -- MSL 1096 ( 9E 179)
+a" 12684,20460 2 75197 -- MSL 1097 ( 9E 189)
+ho 12684,600,4653 0 75186 -- MSL 1098 ( 9E 178)
+vZ 17565,24612 2 75150 -- MSL 1106 ( 9E 142)
+IJ 18540,18315,6060 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/LGB b/font/devlj4/LGB
new file mode 100644
index 0000000..1b6d747
--- /dev/null
+++ b/font/devlj4/LGB
@@ -0,0 +1,330 @@
+# LetterGothic Bd
+name LGB
+spacewidth 13227
+pcltypeface 4102
+pclproportional 0
+pclweight 3
+pclstyle 0
+charset
+! 13227,18990,330 2 161057 -- MSL 1 (19U 33)
+dq 13227,18990 2 161058 -- MSL 2 (19U 34)
+" "
+sh 13227,21345,2391 2 161059 -- MSL 3 (19U 35)
+# "
+Do 13227,19320,993 2 161060 -- MSL 4 (19U 36)
+$ "
+% 13227,19320,330 2 161061 -- MSL 5 (19U 37)
+& 13227,19320,330 2 161062 -- MSL 6 (19U 38)
+cq 13227,19320 2 161170 -- MSL 8 (19U 146)
+' "
+( 13227,19320,2325 2 161064 -- MSL 9 (19U 40)
+) 13227,19320,2325 2 161065 -- MSL 10 (19U 41)
+* 13227,18990 2 161066 -- MSL 11 (19U 42)
++ 13227,15645 0 161067 -- MSL 12 (19U 43)
+, 13227,2925,2640 0 161068 -- MSL 13 (19U 44)
+hy 13227,8775 0 161069 -- MSL 14 (19U 45)
+- "
+. 13227,3180,330 0 161070 -- MSL 15 (19U 46)
+sl 13227,19545,330 2 161071 -- MSL 16 (19U 47)
+/ "
+0 13227,19320,330 2 161072 -- MSL 17 (19U 48)
+1 13227,19320 2 161073 -- MSL 18 (19U 49)
+2 13227,19320 2 161074 -- MSL 19 (19U 50)
+3 13227,19320,330 2 161075 -- MSL 20 (19U 51)
+4 13227,19320 2 161076 -- MSL 21 (19U 52)
+5 13227,18990,330 2 161077 -- MSL 22 (19U 53)
+6 13227,19320,330 2 161078 -- MSL 23 (19U 54)
+7 13227,18990 2 161079 -- MSL 24 (19U 55)
+8 13227,19320,330 2 161080 -- MSL 25 (19U 56)
+9 13227,19320,330 2 161081 -- MSL 26 (19U 57)
+: 13227,12654,330 0 161082 -- MSL 27 (19U 58)
+; 13227,12654,2640 0 161083 -- MSL 28 (19U 59)
+< 13227,15312 0 161084 -- MSL 29 (19U 60)
+= 13227,12534 0 161085 -- MSL 30 (19U 61)
+> 13227,15312 0 161086 -- MSL 31 (19U 62)
+? 13227,19320,330 2 161087 -- MSL 32 (19U 63)
+at 13227,19320,330 2 161088 -- MSL 33 (19U 64)
+@ "
+A 13227,18990 2 161089 -- MSL 34 (19U 65)
+B 13227,18990 2 161090 -- MSL 35 (19U 66)
+C 13227,19320,330 2 161091 -- MSL 36 (19U 67)
+D 13227,18990 2 161092 -- MSL 37 (19U 68)
+E 13227,18990 2 161093 -- MSL 38 (19U 69)
+F 13227,18990 2 161094 -- MSL 39 (19U 70)
+G 13227,19320,330 2 161095 -- MSL 40 (19U 71)
+H 13227,18990 2 161096 -- MSL 41 (19U 72)
+I 13227,18990 2 161097 -- MSL 42 (19U 73)
+J 13227,18990,330 2 161098 -- MSL 43 (19U 74)
+K 13227,18990 2 161099 -- MSL 44 (19U 75)
+L 13227,18990 2 161100 -- MSL 45 (19U 76)
+M 13227,18990 2 161101 -- MSL 46 (19U 77)
+N 13227,18990 2 161102 -- MSL 47 (19U 78)
+O 13227,19320,330 2 161103 -- MSL 48 (19U 79)
+P 13227,18990 2 161104 -- MSL 49 (19U 80)
+Q 13227,19320,2760 2 161105 -- MSL 50 (19U 81)
+R 13227,18990 2 161106 -- MSL 51 (19U 82)
+S 13227,19320,330 2 161107 -- MSL 52 (19U 83)
+T 13227,18990 2 161108 -- MSL 53 (19U 84)
+U 13227,18990,330 2 161109 -- MSL 54 (19U 85)
+V 13227,18990 2 161110 -- MSL 55 (19U 86)
+W 13227,18990 2 161111 -- MSL 56 (19U 87)
+X 13227,18990 2 161112 -- MSL 57 (19U 88)
+Y 13227,18990 2 161113 -- MSL 58 (19U 89)
+Z 13227,18990 2 161114 -- MSL 59 (19U 90)
+lB 13227,18990,3510 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 13227,19545,330 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 13227,18990,3510 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13227,19758 2 161118 -- MSL 63 (19U 94)
+_ 13227,0,6588 1 161119 -- MSL 64 (19U 95)
+oq 13227,19320 2 161169 -- MSL 66 (19U 145)
+` "
+a 13227,14355,330 0 161121 -- MSL 67 (19U 97)
+b 13227,19545,330 2 161122 -- MSL 68 (19U 98)
+c 13227,14355,330 0 161123 -- MSL 69 (19U 99)
+d 13227,19545,330 2 161124 -- MSL 70 (19U 100)
+e 13227,14355,330 0 161125 -- MSL 71 (19U 101)
+f 13227,19335 2 161126 -- MSL 72 (19U 102)
+g 13227,14355,4350 0 161127 -- MSL 73 (19U 103)
+h 13227,19545 2 161128 -- MSL 74 (19U 104)
+i 13227,19095 2 161129 -- MSL 75 (19U 105)
+j 13227,19095,4350 2 161130 -- MSL 76 (19U 106)
+k 13227,19545 2 161131 -- MSL 77 (19U 107)
+l 13227,19545 2 161132 -- MSL 78 (19U 108)
+m 13227,14355 0 161133 -- MSL 79 (19U 109)
+n 13227,14355 0 161134 -- MSL 80 (19U 110)
+o 13227,14355,330 0 161135 -- MSL 81 (19U 111)
+p 13227,14355,5475 1 161136 -- MSL 82 (19U 112)
+q 13227,14355,5475 1 161137 -- MSL 83 (19U 113)
+r 13227,14355 0 161138 -- MSL 84 (19U 114)
+s 13227,14355,330 0 161139 -- MSL 85 (19U 115)
+t 13227,18300,330 2 161140 -- MSL 86 (19U 116)
+u 13227,14025,330 0 161141 -- MSL 87 (19U 117)
+v 13227,14025 0 161142 -- MSL 88 (19U 118)
+w 13227,14025 0 161143 -- MSL 89 (19U 119)
+x 13227,14025 0 161144 -- MSL 90 (19U 120)
+y 13227,14025,4350 0 161145 -- MSL 91 (19U 121)
+z 13227,14025 0 161146 -- MSL 92 (19U 122)
+{ 13227,20130,6141 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13227,19758,6588 3 161148 -- MSL 94 (19U 124)
+ba "
+} 13227,20130,6141 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 13227,11181 0 161150 -- MSL 96 (19U 126)
+`A 13227,25155 2 161216 -- MSL 99 (19U 192)
+^A 13227,25080 2 161218 -- MSL 100 (19U 194)
+`E 13227,25155 2 161224 -- MSL 101 (19U 200)
+^E 13227,25080 2 161226 -- MSL 102 (19U 202)
+:E 13227,24000 2 161227 -- MSL 103 (19U 203)
+^I 13227,25080 2 161230 -- MSL 104 (19U 206)
+:I 13227,24000 2 161231 -- MSL 105 (19U 207)
+aa 13227,20745 2 161204 -- MSL 106 (19U 180)
+ga 13227,20745 2 161120 -- MSL 107 (19U 96)
+a^ 13227,21015 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 13227,19125 2 161192 -- MSL 109 (19U 168)
+~ 13227,19683 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 13227,25155,330 2 161241 -- MSL 111 (19U 217)
+^U 13227,25080,330 2 161243 -- MSL 112 (19U 219)
+u00AF 13227,21105 2 161199 -- MSL 113 (19U 175)
+'Y 13227,25155 2 161245 -- MSL 114 (19U 221)
+'y 13227,20745,4350 2 161277 -- MSL 115 (19U 253)
+de 13227,19320 2 161200 -- MSL 116 (19U 176)
+,C 13227,19320,5787 3 161223 -- MSL 117 (19U 199)
+,c 13227,14355,6060 1 161255 -- MSL 118 (19U 231)
+~N 13227,24552 2 161233 -- MSL 119 (19U 209)
+~n 13227,19683 2 161265 -- MSL 120 (19U 241)
+r! 13227,14319,5001 1 161185 -- MSL 121 (19U 161)
+r? 13227,14265,5385 1 161215 -- MSL 122 (19U 191)
+Cs 13227,15885 0 161188 -- MSL 123 (19U 164)
+Po 13227,18990,330 2 161187 -- MSL 124 (19U 163)
+Ye 13227,18990 2 161189 -- MSL 125 (19U 165)
+sc 13227,19320,1218 2 161191 -- MSL 126 (19U 167)
+Fn 13227,19335,3558 2 161155 -- MSL 127 (19U 131)
+ct 13227,19320,330 2 161186 -- MSL 128 (19U 162)
+^a 13227,21015,330 2 161250 -- MSL 129 (19U 226)
+^e 13227,21015,330 2 161258 -- MSL 130 (19U 234)
+^o 13227,21015,330 2 161268 -- MSL 131 (19U 244)
+^u 13227,21015,330 2 161275 -- MSL 132 (19U 251)
+'a 13227,20745,330 2 161249 -- MSL 133 (19U 225)
+'e 13227,20745,330 2 161257 -- MSL 134 (19U 233)
+'o 13227,20745,330 2 161267 -- MSL 135 (19U 243)
+'u 13227,20745,330 2 161274 -- MSL 136 (19U 250)
+`a 13227,20745,330 2 161248 -- MSL 137 (19U 224)
+`e 13227,20745,330 2 161256 -- MSL 138 (19U 232)
+`o 13227,20745,330 2 161266 -- MSL 139 (19U 242)
+`u 13227,20745,330 2 161273 -- MSL 140 (19U 249)
+:a 13227,19125,330 2 161252 -- MSL 141 (19U 228)
+:e 13227,19125,330 2 161259 -- MSL 142 (19U 235)
+:o 13227,19125,330 2 161270 -- MSL 143 (19U 246)
+:u 13227,19125,330 2 161276 -- MSL 144 (19U 252)
+oA 13227,24882 2 161221 -- MSL 145 (19U 197)
+^i 13227,21015 2 161262 -- MSL 146 (19U 238)
+/O 13227,19320,459 2 161240 -- MSL 147 (19U 216)
+AE 13227,18990 2 161222 -- MSL 148 (19U 198)
+oa 13227,20790,330 2 161253 -- MSL 149 (19U 229)
+'i 13227,20745 2 161261 -- MSL 150 (19U 237)
+/o 13227,14901,957 0 161272 -- MSL 151 (19U 248)
+ae 13227,14355,330 0 161254 -- MSL 152 (19U 230)
+:A 13227,24000 2 161220 -- MSL 153 (19U 196)
+`i 13227,20745 2 161260 -- MSL 154 (19U 236)
+:O 13227,24000,330 2 161238 -- MSL 155 (19U 214)
+:U 13227,24000,330 2 161244 -- MSL 156 (19U 220)
+'E 13227,25155 2 161225 -- MSL 157 (19U 201)
+:i 13227,19125 2 161263 -- MSL 158 (19U 239)
+ss 13227,19335,330 2 161247 -- MSL 159 (19U 223)
+^O 13227,25080,330 2 161236 -- MSL 160 (19U 212)
+'A 13227,25155 2 161217 -- MSL 161 (19U 193)
+~A 13227,24552 2 161219 -- MSL 162 (19U 195)
+~a 13227,19683,330 2 161251 -- MSL 163 (19U 227)
+-D 13227,18990 2 161232 -- MSL 164 (19U 208)
+Sd 13227,19656,330 2 161264 -- MSL 165 (19U 240)
+'I 13227,25155 2 161229 -- MSL 166 (19U 205)
+`I 13227,25155 2 161228 -- MSL 167 (19U 204)
+'O 13227,25155,330 2 161235 -- MSL 168 (19U 211)
+`O 13227,25155,330 2 161234 -- MSL 169 (19U 210)
+~O 13227,24552,330 2 161237 -- MSL 170 (19U 213)
+~o 13227,19683,330 2 161269 -- MSL 171 (19U 245)
+vS 13227,25116,330 2 161162 -- MSL 172 (19U 138)
+vs 13227,21015,330 2 161178 -- MSL 173 (19U 154)
+'U 13227,25155,330 2 161242 -- MSL 174 (19U 218)
+:Y 13227,24000 2 161183 -- MSL 175 (19U 159)
+:y 13227,19125,4350 2 161279 -- MSL 176 (19U 255)
+TP 13227,18990 2 161246 -- MSL 177 (19U 222)
+Tp 13227,19545,5475 3 161278 -- MSL 178 (19U 254)
+mc 13227,14025,4350 0 161205 -- MSL 180 (19U 181)
+ps 13227,19635,4200 2 161206 -- MSL 181 (19U 182)
+34 13227,19110,3825 2 161214 -- MSL 182 (19U 190)
+\- 13227,10425 0 60096 -- MSL 183 ( 7J 192)
+14 13227,19110,3825 2 161212 -- MSL 184 (19U 188)
+12 13227,19110,3825 2 161213 -- MSL 185 (19U 189)
+Of 13227,19320 2 161194 -- MSL 186 (19U 170)
+Om 13227,19320 2 161210 -- MSL 187 (19U 186)
+Fo 13227,14115 0 161195 -- MSL 188 (19U 171)
+Fc 13227,14115 0 161211 -- MSL 190 (19U 187)
+t+- 13227,15645,30 0 161201 -- MSL 191 (19U 177)
+bb 13227,19083,5916 3 161190 -- MSL 192 (19U 166)
+co 13227,19635 2 161193 -- MSL 193 (19U 169)
+tno 13227,13020 0 161196 -- MSL 194 (19U 172)
+u00AD 13227,8775 0 161197 -- MSL 195 (19U 173)
+rg 13227,19635 2 161198 -- MSL 196 (19U 174)
+S2 13227,19110 2 161202 -- MSL 197 (19U 178)
+S3 13227,19110 2 161203 -- MSL 198 (19U 179)
+ac 13227,0,6060 1 161208 -- MSL 199 (19U 184)
+S1 13227,19110 2 161209 -- MSL 200 (19U 185)
+tmu 13227,15549 0 161239 -- MSL 201 (19U 215)
+tdi 13227,15510 0 161271 -- MSL 202 (19U 247)
+u203C 13227,18990,330 2 87315 -- MSL 221 (10U 19)
+u20A7 13227,18990,330 2 60121 -- MSL 232 ( 7J 217)
+pc 13227,11376 0 161207 -- MSL 302 (19U 183)
+u013F 13227,18990 2 51943 -- MSL 306 ( 6J 231)
+u0140 13227,19545 2 51959 -- MSL 307 ( 6J 247)
+u2113 13227,18111,330 2 60122 -- MSL 308 ( 7J 218)
+u0149 13227,19320 2 51951 -- MSL 309 ( 6J 239)
+fm 13227,18990 2 60101 -- MSL 310 ( 7J 197)
+sd 13227,18990 2 60102 -- MSL 311 ( 7J 198)
+dg 13227,18990 2 161158 -- MSL 312 (19U 134)
+tm 13227,17850 2 161177 -- MSL 313 (19U 153)
+u2017 13227,0,6588 1 60095 -- MSL 314 ( 7J 191)
+ah 13227,21015 2 75169 -- MSL 315 ( 9E 161)
+ao 13227,20790 2 60152 -- MSL 316 ( 7J 248)
+f/ 13227,15675 0 60109 -- MSL 324 ( 7J 205)
+em 13227,8430 0 161175 -- MSL 325 (19U 151)
+en 13227,8430 0 161174 -- MSL 326 (19U 150)
+dd 13227,18990 2 161159 -- MSL 327 (19U 135)
+.i 13227,14025 0 46333 -- MSL 328 ( 5T 253)
+aq 13227,18990 2 161063 -- MSL 329 (19U 39)
+bu 13227,12714 0 161173 -- MSL 331 (19U 149)
+u207F 13227,19110 2 87548 -- MSL 332 (10U 252)
+u0111 13227,19545,330 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 13227,24720 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 13227,19830,330 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 13227,18990,5109 3 75173 -- MSL 404 ( 9E 165)
+u0061_0328 13227,14355,5109 1 75193 -- MSL 405 ( 9E 185)
+'C 13227,25155,330 2 75206 -- MSL 406 ( 9E 198)
+'c 13227,20745,330 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 13227,25116,330 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 13227,21015,330 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 13227,25116 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 13227,19545,330 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 13227,25116 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 13227,21015,330 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 13227,18990,5109 3 75210 -- MSL 422 ( 9E 202)
+u0065_0328 13227,14355,5109 1 75242 -- MSL 423 ( 9E 234)
+u004C_0301 13227,25155 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 13227,25155 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 13227,19320 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 13227,19545 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 13227,25155 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 13227,20745 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 13227,25116 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 13227,21015 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 13227,25155,330 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 13227,20745,330 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 13227,25155 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 13227,20745 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 13227,25116 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 13227,21015 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 13227,25155,330 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 13227,20745,330 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 13227,25116 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 13227,19320,330 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 13227,18990,5787 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 13227,18300,6060 3 75262 -- MSL 469 ( 9E 254)
+u0055_030B 13227,25155,330 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 13227,20745,330 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 13227,24882,330 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 13227,20790,330 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 13227,25155 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 13227,20745 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 13227,24000 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 13227,19125 2 75199 -- MSL 485 ( 9E 191)
+u2070 13227,19110 2 51753 -- MSL 1000 ( 6J 41)
+u2074 13227,19110 2 51748 -- MSL 1001 ( 6J 36)
+u2075 13227,18990 2 51749 -- MSL 1002 ( 6J 37)
+u2076 13227,19110 2 51806 -- MSL 1003 ( 6J 94)
+u2077 13227,18990 2 51750 -- MSL 1004 ( 6J 38)
+u2078 13227,19110 2 51754 -- MSL 1005 ( 6J 42)
+u2079 13227,19110 2 51752 -- MSL 1006 ( 6J 40)
+lq 13227,19320 2 161171 -- MSL 1017 (19U 147)
+rq 13227,19320 2 161172 -- MSL 1018 (19U 148)
+Bq 13227,3486,2079 0 161156 -- MSL 1019 (19U 132)
+u2003 13227,0 0 51821 -- MSL 1020 ( 6J 109)
+u2002 13227,0 0 51822 -- MSL 1021 ( 6J 110)
+u2009 13227,0 0 51828 -- MSL 1023 ( 6J 116)
+u2026 13227,2985 0 161157 -- MSL 1028 (19U 133)
+vz 13227,21015 2 75166 -- MSL 1031 ( 9E 158)
+u2120 13227,18000 2 128299 -- MSL 1034 (15U 43)
+u211E 13227,18990,3225 2 51794 -- MSL 1036 ( 6J 82)
+fi 13227,19335 2 60077 -- MSL 1040 ( 7J 173)
+fl 13227,19335 2 60078 -- MSL 1041 ( 7J 174)
+ff 13227,19335 2 51883 -- MSL 1042 ( 6J 171)
+Fi 13227,19335 2 51884 -- MSL 1043 ( 6J 172)
+Fl 13227,19335 2 51885 -- MSL 1044 ( 6J 173)
+ij 13227,19095,4350 2 60134 -- MSL 1047 ( 7J 230)
+u2105 13227,19545,330 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 13227,24720,330 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 13227,19830,4350 2 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 13227,19320,5787 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 13227,14355,6060 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 13227,24000 2 46301 -- MSL 1065 ( 5T 221)
+bq 13227,3486,2079 0 161154 -- MSL 1067 (19U 130)
+%0 13227,19320,330 2 161161 -- MSL 1068 (19U 137)
+a- 13227,19119 2 60154 -- MSL 1084 ( 7J 250)
+ab 13227,19830 2 75170 -- MSL 1086 ( 9E 162)
+a. 13227,19125 2 75263 -- MSL 1088 ( 9E 255)
+oe 13227,14355,330 0 161180 -- MSL 1090 (19U 156)
+OE 13227,19320,330 2 161164 -- MSL 1091 (19U 140)
+fo 13227,14115 0 161163 -- MSL 1092 (19U 139)
+fc 13227,14115 0 161179 -- MSL 1093 (19U 155)
+sq 13227,14106 0 60091 -- MSL 1094 ( 7J 187)
+/L 13227,18990 2 75171 -- MSL 1095 ( 9E 163)
+/l 13227,19545 2 75187 -- MSL 1096 ( 9E 179)
+a" 13227,20745 2 75197 -- MSL 1097 ( 9E 189)
+ho 13227,1026,5109 1 75186 -- MSL 1098 ( 9E 178)
+vZ 13227,25116 2 75150 -- MSL 1106 ( 9E 142)
+IJ 13227,18990,330 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/LGI b/font/devlj4/LGI
new file mode 100644
index 0000000..09bcaeb
--- /dev/null
+++ b/font/devlj4/LGI
@@ -0,0 +1,331 @@
+# LetterGothic It
+name LGI
+spacewidth 13227
+slant 12.000000
+pcltypeface 4102
+pclproportional 0
+pclweight 0
+pclstyle 1
+charset
+! 13227,18990,330,0,-2747 2 161057 -- MSL 1 (19U 33)
+dq 13227,18990,0,372,-3959,372 2 161058 -- MSL 2 (19U 34)
+" "
+sh 13227,21309,2451,1827,1062,790 2 161059 -- MSL 3 (19U 35)
+# "
+Do 13227,19320,1074,762,288,762 2 161060 -- MSL 4 (19U 36)
+$ "
+% 13227,19320,330,2535,882,790 2 161061 -- MSL 5 (19U 37)
+& 13227,19320,330,54,699,54 2 161062 -- MSL 6 (19U 38)
+cq 13227,19320,0,0,-5468 2 161170 -- MSL 8 (19U 146)
+' "
+( 13227,19320,1935,318,-2951,318 2 161064 -- MSL 9 (19U 40)
+) 13227,19320,1935,318,-2951,318 2 161065 -- MSL 10 (19U 41)
+* 13227,18990,0,1995,-827,790 2 161066 -- MSL 11 (19U 42)
++ 13227,15075,0,960,-92,790 0 161067 -- MSL 12 (19U 43)
+, 13227,1785,2250,0,-2768 0 161068 -- MSL 13 (19U 44)
+hy 13227,7995,0,0,-2510 0 161069 -- MSL 14 (19U 45)
+- "
+. 13227,2100,330,0,-3872 0 161070 -- MSL 15 (19U 46)
+sl 13227,19545,330,0,-1409 2 161071 -- MSL 16 (19U 47)
+/ "
+0 13227,19320,330,564,-455,564 2 161072 -- MSL 17 (19U 48)
+1 13227,19320,0,0,60 2 161073 -- MSL 18 (19U 49)
+2 13227,19320,0,1578,1365,790 2 161074 -- MSL 19 (19U 50)
+3 13227,19320,330,420,888,420 2 161075 -- MSL 20 (19U 51)
+4 13227,19320,0,585,750,585 2 161076 -- MSL 21 (19U 52)
+5 13227,18990,330,1215,153,790 2 161077 -- MSL 22 (19U 53)
+6 13227,19320,330,1800,-92,790 2 161078 -- MSL 23 (19U 54)
+7 13227,18990,0,2184,-962,790 2 161079 -- MSL 24 (19U 55)
+8 13227,19320,330,996,423,790 2 161080 -- MSL 25 (19U 56)
+9 13227,19320,330,741,90,741 2 161081 -- MSL 26 (19U 57)
+: 13227,12492,330,0,-3038 0 161082 -- MSL 27 (19U 58)
+; 13227,12492,2250,0,-2771 0 161083 -- MSL 28 (19U 59)
+< 13227,15063,0,390,387,390 0 161084 -- MSL 29 (19U 60)
+= 13227,11721,0,1065,-287,790 0 161085 -- MSL 30 (19U 61)
+> 13227,15063,0,390,387,390 0 161086 -- MSL 31 (19U 62)
+? 13227,19320,330,981,-2729,790 2 161087 -- MSL 32 (19U 63)
+at 13227,19320,330,993,87,790 2 161088 -- MSL 33 (19U 64)
+@ "
+A 13227,18990,0,0,2541 2 161089 -- MSL 34 (19U 65)
+B 13227,18990,0,1095,831,790 2 161090 -- MSL 35 (19U 66)
+C 13227,19320,330,1524,-11,790 2 161091 -- MSL 36 (19U 67)
+D 13227,18990,0,1089,1263,790 2 161092 -- MSL 37 (19U 68)
+E 13227,18990,0,1995,642,790 2 161093 -- MSL 38 (19U 69)
+F 13227,18990,0,2535,594,790 2 161094 -- MSL 39 (19U 70)
+G 13227,19320,330,1350,519,790 2 161095 -- MSL 40 (19U 71)
+H 13227,18990,0,2316,1050,790 2 161096 -- MSL 41 (19U 72)
+I 13227,18990,0,558,-662,558 2 161097 -- MSL 42 (19U 73)
+J 13227,18990,330,2118,-38,790 2 161098 -- MSL 43 (19U 74)
+K 13227,18990,0,1590,765,790 2 161099 -- MSL 44 (19U 75)
+L 13227,18990,0,0,153 2 161100 -- MSL 45 (19U 76)
+M 13227,18990,0,2853,1941,790 2 161101 -- MSL 46 (19U 77)
+N 13227,18990,0,2097,882,790 2 161102 -- MSL 47 (19U 78)
+O 13227,19320,330,1485,273,790 2 161103 -- MSL 48 (19U 79)
+P 13227,18990,0,1152,771,790 2 161104 -- MSL 49 (19U 80)
+Q 13227,19320,2778,1485,273,790 2 161105 -- MSL 50 (19U 81)
+R 13227,18990,0,987,981,790 2 161106 -- MSL 51 (19U 82)
+S 13227,19320,330,1608,1134,790 2 161107 -- MSL 52 (19U 83)
+T 13227,18990,0,3171,-1430,790 2 161108 -- MSL 53 (19U 84)
+U 13227,18990,330,2220,108,790 2 161109 -- MSL 54 (19U 85)
+V 13227,18990,0,2217,-2732,790 2 161110 -- MSL 55 (19U 86)
+W 13227,18990,0,3045,702,790 2 161111 -- MSL 56 (19U 87)
+X 13227,18990,0,2355,1296,790 2 161112 -- MSL 57 (19U 88)
+Y 13227,18990,0,2553,-2396,790 2 161113 -- MSL 58 (19U 89)
+Z 13227,18990,0,1956,1203,790 2 161114 -- MSL 59 (19U 90)
+lB 13227,18990,2940,1110,-32,790 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 13227,19545,330,0,-3071 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 13227,18990,2940,342,735,342 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13227,19758,0,9,9,9 2 161118 -- MSL 63 (19U 94)
+_ 13227,0,6588,1317,1317,790 1 161119 -- MSL 64 (19U 95)
+oq 13227,19326,0,0,-6221 2 161169 -- MSL 66 (19U 145)
+` "
+a 13227,14355,330,0,105 0 161121 -- MSL 67 (19U 97)
+b 13227,19545,330,312,1671,312 2 161122 -- MSL 68 (19U 98)
+c 13227,14355,330,810,261,790 0 161123 -- MSL 69 (19U 99)
+d 13227,19545,330,2121,363,790 2 161124 -- MSL 70 (19U 100)
+e 13227,14355,330,387,303,387 0 161125 -- MSL 71 (19U 101)
+f 13227,19335,0,3231,-1784,790 2 161126 -- MSL 72 (19U 102)
+g 13227,14355,4350,1545,1053,790 0 161127 -- MSL 73 (19U 103)
+h 13227,19545,0,168,723,168 2 161128 -- MSL 74 (19U 104)
+i 13227,18780,0,0,-2318 2 161129 -- MSL 75 (19U 105)
+j 13227,18780,4350,906,936,790 2 161130 -- MSL 76 (19U 106)
+k 13227,19545,0,495,504,495 2 161131 -- MSL 77 (19U 107)
+l 13227,19545,0,0,-3602 2 161132 -- MSL 78 (19U 108)
+m 13227,14355,0,1770,2205,790 0 161133 -- MSL 79 (19U 109)
+n 13227,14355,0,267,774,267 0 161134 -- MSL 80 (19U 110)
+o 13227,14355,330,372,252,372 0 161135 -- MSL 81 (19U 111)
+p 13227,14355,5475,213,2205,213 1 161136 -- MSL 82 (19U 112)
+q 13227,14355,5475,1668,318,790 1 161137 -- MSL 83 (19U 113)
+r 13227,14355,0,684,-80,684 0 161138 -- MSL 84 (19U 114)
+s 13227,14355,330,57,480,57 0 161139 -- MSL 85 (19U 115)
+t 13227,18495,330,0,-932 2 161140 -- MSL 86 (19U 116)
+u 13227,14025,330,714,249,714 0 161141 -- MSL 87 (19U 117)
+v 13227,14025,0,1437,-1766,790 0 161142 -- MSL 88 (19U 118)
+w 13227,14025,0,2574,279,790 0 161143 -- MSL 89 (19U 119)
+x 13227,14025,0,1050,2112,790 0 161144 -- MSL 90 (19U 120)
+y 13227,14025,4350,1986,3579,790 0 161145 -- MSL 91 (19U 121)
+z 13227,14025,0,984,1395,790 0 161146 -- MSL 92 (19U 122)
+{ 13227,20130,6075,1170,-2528,790 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13227,19758,6588,0,-4622 3 161148 -- MSL 94 (19U 124)
+ba "
+} 13227,20130,6075,0,975 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 13227,10485,0,825,822,790 0 161150 -- MSL 96 (19U 126)
+`A 13227,24630,0,0,2541 2 161216 -- MSL 99 (19U 192)
+^A 13227,24810,0,2133,2541,790 2 161218 -- MSL 100 (19U 194)
+`E 13227,24630,0,1995,642,790 2 161224 -- MSL 101 (19U 200)
+^E 13227,24810,0,2133,642,790 2 161226 -- MSL 102 (19U 202)
+:E 13227,23115,0,1995,642,790 2 161227 -- MSL 103 (19U 203)
+^I 13227,24810,0,2133,-662,790 2 161230 -- MSL 104 (19U 206)
+:I 13227,23115,0,1143,-662,790 2 161231 -- MSL 105 (19U 207)
+aa 13227,19725,0,753,-5705,753 2 161204 -- MSL 106 (19U 180)
+ga 13227,19725,0,0,-4727 2 161120 -- MSL 107 (19U 96)
+a^ 13227,19905,0,1089,-3116,790 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 13227,18195,0,0,-4340 2 161192 -- MSL 109 (19U 168)
+~ 13227,18873,0,1833,-2405,790 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 13227,24630,330,2220,108,790 2 161241 -- MSL 111 (19U 217)
+^U 13227,24810,330,2220,108,790 2 161243 -- MSL 112 (19U 219)
+u00AF 13227,21105,0,1317,1317,790 2 161199 -- MSL 113 (19U 175)
+'Y 13227,24630,0,2553,-2396,790 2 161245 -- MSL 114 (19U 221)
+'y 13227,19725,4350,1986,3579,790 2 161277 -- MSL 115 (19U 253)
+de 13227,19320,0,0,-2636 2 161200 -- MSL 116 (19U 176)
+,C 13227,19320,5325,1524,-11,790 3 161223 -- MSL 117 (19U 199)
+,c 13227,14355,5295,810,261,790 1 161255 -- MSL 118 (19U 231)
+~N 13227,23814,0,3201,882,790 2 161233 -- MSL 119 (19U 209)
+~n 13227,18873,0,1833,774,790 2 161265 -- MSL 120 (19U 241)
+r! 13227,14271,5049,0,-1646 1 161185 -- MSL 121 (19U 161)
+r? 13227,14214,5436,0,-125 1 161215 -- MSL 122 (19U 191)
+Cs 13227,15684,0,1425,528,790 0 161188 -- MSL 123 (19U 164)
+Po 13227,19320,330,2433,234,790 2 161187 -- MSL 124 (19U 163)
+Ye 13227,18990,0,2712,-1055,790 2 161189 -- MSL 125 (19U 165)
+sc 13227,19320,1344,66,-890,66 2 161191 -- MSL 126 (19U 167)
+Fn 13227,19335,3540,231,-491,231 2 161155 -- MSL 127 (19U 131)
+ct 13227,19320,330,891,-779,790 2 161186 -- MSL 128 (19U 162)
+^a 13227,19905,330,1089,105,790 2 161250 -- MSL 129 (19U 226)
+^e 13227,19905,330,1089,303,790 2 161258 -- MSL 130 (19U 234)
+^o 13227,19905,330,1089,252,790 2 161268 -- MSL 131 (19U 244)
+^u 13227,19905,330,1089,249,790 2 161275 -- MSL 132 (19U 251)
+'a 13227,19725,330,753,105,753 2 161249 -- MSL 133 (19U 225)
+'e 13227,19725,330,753,303,753 2 161257 -- MSL 134 (19U 233)
+'o 13227,19725,330,753,252,753 2 161267 -- MSL 135 (19U 243)
+'u 13227,19725,330,753,249,753 2 161274 -- MSL 136 (19U 250)
+`a 13227,19725,330,0,105 2 161248 -- MSL 137 (19U 224)
+`e 13227,19725,330,387,303,387 2 161256 -- MSL 138 (19U 232)
+`o 13227,19725,330,372,252,372 2 161266 -- MSL 139 (19U 242)
+`u 13227,19725,330,714,249,714 2 161273 -- MSL 140 (19U 249)
+:a 13227,18195,330,0,105 2 161252 -- MSL 141 (19U 228)
+:e 13227,18195,330,387,303,387 2 161259 -- MSL 142 (19U 235)
+:o 13227,18195,330,372,252,372 2 161270 -- MSL 143 (19U 246)
+:u 13227,18195,330,714,249,714 2 161276 -- MSL 144 (19U 252)
+oA 13227,24810,0,0,2541 2 161221 -- MSL 145 (19U 197)
+^i 13227,19905,0,0,-1916 2 161262 -- MSL 146 (19U 238)
+/O 13227,19320,342,2895,1743,790 2 161240 -- MSL 147 (19U 216)
+AE 13227,18990,0,4059,2670,790 2 161222 -- MSL 148 (19U 198)
+oa 13227,19905,330,0,105 2 161253 -- MSL 149 (19U 229)
+'i 13227,19725,0,3,-2318,3 2 161261 -- MSL 150 (19U 237)
+/o 13227,14895,735,1119,1086,790 0 161272 -- MSL 151 (19U 248)
+ae 13227,14355,330,1530,1950,790 0 161254 -- MSL 152 (19U 230)
+:A 13227,23115,0,1143,2541,790 2 161220 -- MSL 153 (19U 196)
+`i 13227,19725,0,0,-2318 2 161260 -- MSL 154 (19U 236)
+:O 13227,23115,330,1485,273,790 2 161238 -- MSL 155 (19U 214)
+:U 13227,23115,330,2220,108,790 2 161244 -- MSL 156 (19U 220)
+'E 13227,24630,0,1995,642,790 2 161225 -- MSL 157 (19U 201)
+:i 13227,18195,0,0,-2318 2 161263 -- MSL 158 (19U 239)
+ss 13227,19335,330,570,270,570 2 161247 -- MSL 159 (19U 223)
+^O 13227,24810,330,2133,273,790 2 161236 -- MSL 160 (19U 212)
+'A 13227,24630,0,1389,2541,790 2 161217 -- MSL 161 (19U 193)
+~A 13227,23814,0,3201,2541,790 2 161219 -- MSL 162 (19U 195)
+~a 13227,18873,330,1833,105,790 2 161251 -- MSL 163 (19U 227)
+-D 13227,18990,0,1389,963,790 2 161232 -- MSL 164 (19U 208)
+Sd 13227,19545,330,192,237,192 2 161264 -- MSL 165 (19U 240)
+'I 13227,24630,0,1389,-662,790 2 161229 -- MSL 166 (19U 205)
+`I 13227,24630,0,558,-662,558 2 161228 -- MSL 167 (19U 204)
+'O 13227,24630,330,1485,273,790 2 161235 -- MSL 168 (19U 211)
+`O 13227,24630,330,1485,273,790 2 161234 -- MSL 169 (19U 210)
+~O 13227,23814,330,3201,273,790 2 161237 -- MSL 170 (19U 213)
+~o 13227,18873,330,1833,252,790 2 161269 -- MSL 171 (19U 245)
+vS 13227,24810,330,2433,1134,790 2 161162 -- MSL 172 (19U 138)
+vs 13227,19905,330,1539,480,790 2 161178 -- MSL 173 (19U 154)
+'U 13227,24630,330,2220,108,790 2 161242 -- MSL 174 (19U 218)
+:Y 13227,23115,0,2553,-2396,790 2 161183 -- MSL 175 (19U 159)
+:y 13227,18195,4350,1986,3579,790 2 161279 -- MSL 176 (19U 255)
+TP 13227,18990,0,378,771,378 2 161246 -- MSL 177 (19U 222)
+Tp 13227,19545,5475,231,2223,231 3 161278 -- MSL 178 (19U 254)
+mc 13227,14025,4350,765,1659,765 0 161205 -- MSL 180 (19U 181)
+ps 13227,19635,4200,696,-407,696 2 161206 -- MSL 181 (19U 182)
+34 13227,19110,3825,1413,627,790 2 161214 -- MSL 182 (19U 190)
+\- 13227,9945,0,1065,-287,790 0 60096 -- MSL 183 ( 7J 192)
+14 13227,19110,3825,918,873,790 2 161212 -- MSL 184 (19U 188)
+12 13227,19110,3825,1269,1023,790 2 161213 -- MSL 185 (19U 189)
+Of 13227,19320,0,0,-3065 2 161194 -- MSL 186 (19U 170)
+Om 13227,19320,0,0,-3329 2 161210 -- MSL 187 (19U 186)
+Fo 13227,13710,0,2418,1104,790 0 161195 -- MSL 188 (19U 171)
+Fc 13227,13710,0,1107,2415,790 0 161211 -- MSL 190 (19U 187)
+t+- 13227,15075,0,1110,-242,790 0 161201 -- MSL 191 (19U 177)
+bb 13227,19083,5916,0,-4622 3 161190 -- MSL 192 (19U 166)
+co 13227,19635,0,3927,-2189,790 2 161193 -- MSL 193 (19U 169)
+tno 13227,12501,0,1065,-287,790 0 161196 -- MSL 194 (19U 172)
+u00AD 13227,7995,0,0,-2510 0 161197 -- MSL 195 (19U 173)
+rg 13227,19635,0,3927,-2189,790 2 161198 -- MSL 196 (19U 174)
+S2 13227,19110,0,0,-2378 2 161202 -- MSL 197 (19U 178)
+S3 13227,19110,0,0,-2072 2 161203 -- MSL 198 (19U 179)
+ac 13227,0,5295,0,-1199 1 161208 -- MSL 199 (19U 184)
+S1 13227,19110,0,0,-2726 2 161209 -- MSL 200 (19U 185)
+tmu 13227,14814,0,897,-482,790 0 161239 -- MSL 201 (19U 215)
+tdi 13227,14655,0,1104,-251,790 0 161271 -- MSL 202 (19U 247)
+u203C 13227,18990,330,1272,249,790 2 87315 -- MSL 221 (10U 19)
+u20A7 13227,18990,330,3120,2262,790 2 60121 -- MSL 232 ( 7J 217)
+pc 13227,11007,0,0,-4589 0 161207 -- MSL 302 (19U 183)
+u013F 13227,18990,0,255,153,255 2 51943 -- MSL 306 ( 6J 231)
+u0140 13227,19545,0,2202,-1160,790 2 51959 -- MSL 307 ( 6J 247)
+u2113 13227,17964,330,0,-764 2 60122 -- MSL 308 ( 7J 218)
+u0149 13227,19320,0,1437,903,790 2 51951 -- MSL 309 ( 6J 239)
+fm 13227,18990,0,0,-3443 2 60101 -- MSL 310 ( 7J 197)
+sd 13227,18990,0,0,-3443 2 60102 -- MSL 311 ( 7J 198)
+dg 13227,18990,0,0,-2018 2 161158 -- MSL 312 (19U 134)
+tm 13227,17850,0,4395,-2057,790 2 161177 -- MSL 313 (19U 153)
+u2017 13227,0,6588,1317,1317,790 1 60095 -- MSL 314 ( 7J 191)
+ah 13227,19905,0,1539,-3566,790 2 75169 -- MSL 315 ( 9E 161)
+ao 13227,19905,0,0,-5465 2 60152 -- MSL 316 ( 7J 248)
+f/ 13227,15675,777,0,-338 0 60109 -- MSL 324 ( 7J 205)
+em 13227,7710,0,1317,1317,790 0 161175 -- MSL 325 (19U 151)
+en 13227,7710,0,0,-1214 0 161174 -- MSL 326 (19U 150)
+dd 13227,18990,0,0,-1712 2 161159 -- MSL 327 (19U 135)
+.i 13227,14025,0,0,-2318 0 46333 -- MSL 328 ( 5T 253)
+aq 13227,18990,0,0,-6059 2 161063 -- MSL 329 (19U 39)
+bu 13227,12714,0,0,-518 0 161173 -- MSL 331 (19U 149)
+u207F 13227,19110,0,0,-2255 2 87548 -- MSL 332 (10U 252)
+u0111 13227,19545,330,4122,363,790 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 13227,24270,0,1980,2541,790 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 13227,19350,330,2133,105,790 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 13227,18990,4086,0,2541 2 75173 -- MSL 404 ( 9E 165)
+u0061_0328 13227,14355,4086,0,105 0 75193 -- MSL 405 ( 9E 185)
+'C 13227,24630,330,1524,-11,790 2 75206 -- MSL 406 ( 9E 198)
+'c 13227,19725,330,810,261,790 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 13227,24810,330,3333,-11,790 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 13227,19905,330,1839,261,790 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 13227,24810,0,1956,1263,790 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 13227,19545,330,4515,801,790 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 13227,24810,0,2433,642,790 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 13227,19905,330,1539,303,790 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 13227,18990,4086,1995,642,790 2 75210 -- MSL 422 ( 9E 202)
+u0065_0328 13227,14355,4086,387,303,387 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 13227,24630,0,1389,153,790 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 13227,24630,0,1089,-3602,790 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 13227,19545,0,477,153,477 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 13227,19545,0,3177,-3602,790 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 13227,24630,0,2097,882,790 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 13227,19725,0,753,774,753 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 13227,24810,0,2433,882,790 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 13227,19905,0,1539,774,790 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 13227,24630,330,4149,273,790 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 13227,19725,330,3210,252,790 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 13227,24630,0,1389,981,790 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 13227,19725,0,753,-80,753 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 13227,24810,0,1956,981,790 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 13227,19905,0,1539,-80,790 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 13227,24630,330,1608,1134,790 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 13227,19725,330,753,480,753 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 13227,24810,0,3171,-1430,790 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 13227,19545,330,1293,-932,790 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 13227,18990,5325,3171,-437,790 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 13227,18495,5295,0,-932 3 75262 -- MSL 469 ( 9E 254)
+u0055_030B 13227,24630,330,4149,108,790 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 13227,19725,330,3210,249,790 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 13227,24810,330,2220,108,790 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 13227,19905,330,714,249,714 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 13227,24630,0,1956,1203,790 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 13227,19725,0,984,1395,790 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 13227,23115,0,1956,1203,790 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 13227,18195,0,984,1395,790 2 75199 -- MSL 485 ( 9E 191)
+u2070 13227,19110,0,0,-3146 2 51753 -- MSL 1000 ( 6J 41)
+u2074 13227,19110,0,0,-2456 2 51748 -- MSL 1001 ( 6J 36)
+u2075 13227,18990,0,0,-2765 2 51749 -- MSL 1002 ( 6J 37)
+u2076 13227,19110,0,0,-3278 2 51806 -- MSL 1003 ( 6J 94)
+u2077 13227,18990,0,0,-3452 2 51750 -- MSL 1004 ( 6J 38)
+u2078 13227,19110,0,0,-2747 2 51754 -- MSL 1005 ( 6J 42)
+u2079 13227,19110,0,0,-2573 2 51752 -- MSL 1006 ( 6J 40)
+lq 13227,19326,0,1812,-4196,790 2 161171 -- MSL 1017 (19U 147)
+rq 13227,19320,0,1512,-3896,790 2 161172 -- MSL 1018 (19U 148)
+Bq 13227,2214,2091,0,-896 0 161156 -- MSL 1019 (19U 132)
+u2003 13227,0,0,0,1317 0 51821 -- MSL 1020 ( 6J 109)
+u2002 13227,0,0,0,1317 0 51822 -- MSL 1021 ( 6J 110)
+u2009 13227,0,0,0,1317 0 51828 -- MSL 1023 ( 6J 116)
+u2026 13227,2430,0,0,1536 0 161157 -- MSL 1028 (19U 133)
+vz 13227,19905,0,1539,1395,790 2 75166 -- MSL 1031 ( 9E 158)
+u2120 13227,18000,0,5586,-2075,790 2 128299 -- MSL 1034 (15U 43)
+u211E 13227,18990,3225,624,-551,624 2 51794 -- MSL 1036 ( 6J 82)
+fi 13227,19335,0,1065,-338,790 2 60077 -- MSL 1040 ( 7J 173)
+fl 13227,19335,0,1065,-338,790 2 60078 -- MSL 1041 ( 7J 174)
+ff 13227,19335,0,5175,606,790 2 51883 -- MSL 1042 ( 6J 171)
+Fi 13227,19335,0,3579,1149,790 2 51884 -- MSL 1043 ( 6J 172)
+Fl 13227,19335,0,2703,1155,790 2 51885 -- MSL 1044 ( 6J 173)
+ij 13227,18780,4350,2355,645,790 2 60134 -- MSL 1047 ( 7J 230)
+u2105 13227,18990,0,2211,855,790 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 13227,24270,330,2730,519,790 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 13227,19350,4350,1683,1053,790 2 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 13227,19320,5325,1608,1134,790 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 13227,14355,5295,57,480,57 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 13227,23115,0,558,-662,558 2 46301 -- MSL 1065 ( 5T 221)
+bq 13227,2214,2091,0,-2921 0 161154 -- MSL 1067 (19U 130)
+%0 13227,19320,330,1920,4113,790 2 161161 -- MSL 1068 (19U 137)
+a- 13227,18051,0,1086,-3929,790 2 60154 -- MSL 1084 ( 7J 250)
+ab 13227,19350,0,1683,-3296,790 2 75170 -- MSL 1086 ( 9E 162)
+a. 13227,18195,0,0,-6560 2 75263 -- MSL 1088 ( 9E 255)
+oe 13227,14355,330,1629,1671,790 0 161180 -- MSL 1090 (19U 156)
+OE 13227,19320,330,4059,783,790 2 161164 -- MSL 1091 (19U 140)
+fo 13227,13710,0,0,-1181 0 161163 -- MSL 1092 (19U 139)
+fc 13227,13710,0,0,-662 0 161179 -- MSL 1093 (19U 155)
+sq 13227,14106,0,876,876,790 0 60091 -- MSL 1094 ( 7J 187)
+/L 13227,18990,0,0,885 2 75171 -- MSL 1095 ( 9E 163)
+/l 13227,19545,0,0,-2768 2 75187 -- MSL 1096 ( 9E 179)
+a" 13227,19725,0,3210,-3905,790 2 75197 -- MSL 1097 ( 9E 189)
+ho 13227,735,4086,0,-4817 0 75186 -- MSL 1098 ( 9E 178)
+vZ 13227,24810,0,2433,1203,790 2 75150 -- MSL 1106 ( 9E 142)
+IJ 13227,18990,330,2259,3129,790 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/LGR b/font/devlj4/LGR
new file mode 100644
index 0000000..b1e7f87
--- /dev/null
+++ b/font/devlj4/LGR
@@ -0,0 +1,330 @@
+# LetterGothic
+name LGR
+spacewidth 13227
+pcltypeface 4102
+pclproportional 0
+pclweight 0
+pclstyle 0
+charset
+! 13227,18990,330 2 161057 -- MSL 1 (19U 33)
+dq 13227,18990 2 161058 -- MSL 2 (19U 34)
+" "
+sh 13227,21309,2451 2 161059 -- MSL 3 (19U 35)
+# "
+Do 13227,19320,372 2 161060 -- MSL 4 (19U 36)
+$ "
+% 13227,19320,330 2 161061 -- MSL 5 (19U 37)
+& 13227,19320,330 2 161062 -- MSL 6 (19U 38)
+cq 13227,19320 2 161170 -- MSL 8 (19U 146)
+' "
+( 13227,19320,1935 2 161064 -- MSL 9 (19U 40)
+) 13227,19320,1935 2 161065 -- MSL 10 (19U 41)
+* 13227,18990 2 161066 -- MSL 11 (19U 42)
++ 13227,15075 0 161067 -- MSL 12 (19U 43)
+, 13227,2055,2235 0 161068 -- MSL 13 (19U 44)
+hy 13227,7815 0 161069 -- MSL 14 (19U 45)
+- "
+. 13227,2055,330 0 161070 -- MSL 15 (19U 46)
+sl 13227,19545,330 2 161071 -- MSL 16 (19U 47)
+/ "
+0 13227,19320,330 2 161072 -- MSL 17 (19U 48)
+1 13227,19320 2 161073 -- MSL 18 (19U 49)
+2 13227,19320 2 161074 -- MSL 19 (19U 50)
+3 13227,19320,330 2 161075 -- MSL 20 (19U 51)
+4 13227,19320 2 161076 -- MSL 21 (19U 52)
+5 13227,18990,330 2 161077 -- MSL 22 (19U 53)
+6 13227,19320,330 2 161078 -- MSL 23 (19U 54)
+7 13227,18990 2 161079 -- MSL 24 (19U 55)
+8 13227,19320,330 2 161080 -- MSL 25 (19U 56)
+9 13227,19320,330 2 161081 -- MSL 26 (19U 57)
+: 13227,12414,330 0 161082 -- MSL 27 (19U 58)
+; 13227,12414,2235 0 161083 -- MSL 28 (19U 59)
+< 13227,15063 0 161084 -- MSL 29 (19U 60)
+= 13227,11721 0 161085 -- MSL 30 (19U 61)
+> 13227,15063 0 161086 -- MSL 31 (19U 62)
+? 13227,19320,330 2 161087 -- MSL 32 (19U 63)
+at 13227,19320,330 2 161088 -- MSL 33 (19U 64)
+@ "
+A 13227,18990 2 161089 -- MSL 34 (19U 65)
+B 13227,18990 2 161090 -- MSL 35 (19U 66)
+C 13227,19320,330 2 161091 -- MSL 36 (19U 67)
+D 13227,18990 2 161092 -- MSL 37 (19U 68)
+E 13227,18990 2 161093 -- MSL 38 (19U 69)
+F 13227,18990 2 161094 -- MSL 39 (19U 70)
+G 13227,19320,330 2 161095 -- MSL 40 (19U 71)
+H 13227,18990 2 161096 -- MSL 41 (19U 72)
+I 13227,18990 2 161097 -- MSL 42 (19U 73)
+J 13227,18990,330 2 161098 -- MSL 43 (19U 74)
+K 13227,18990 2 161099 -- MSL 44 (19U 75)
+L 13227,18990 2 161100 -- MSL 45 (19U 76)
+M 13227,18990 2 161101 -- MSL 46 (19U 77)
+N 13227,18990 2 161102 -- MSL 47 (19U 78)
+O 13227,19320,330 2 161103 -- MSL 48 (19U 79)
+P 13227,18990 2 161104 -- MSL 49 (19U 80)
+Q 13227,19320,2712 2 161105 -- MSL 50 (19U 81)
+R 13227,18990 2 161106 -- MSL 51 (19U 82)
+S 13227,19320,330 2 161107 -- MSL 52 (19U 83)
+T 13227,18990 2 161108 -- MSL 53 (19U 84)
+U 13227,18990,330 2 161109 -- MSL 54 (19U 85)
+V 13227,18990 2 161110 -- MSL 55 (19U 86)
+W 13227,18990 2 161111 -- MSL 56 (19U 87)
+X 13227,18990 2 161112 -- MSL 57 (19U 88)
+Y 13227,18990 2 161113 -- MSL 58 (19U 89)
+Z 13227,18990 2 161114 -- MSL 59 (19U 90)
+lB 13227,18990,2940 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 13227,19545,330 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 13227,18990,2940 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13227,19758 2 161118 -- MSL 63 (19U 94)
+_ 13227,0,6588 1 161119 -- MSL 64 (19U 95)
+oq 13227,19320 2 161169 -- MSL 66 (19U 145)
+` "
+a 13227,14355,330 0 161121 -- MSL 67 (19U 97)
+b 13227,19545,330 2 161122 -- MSL 68 (19U 98)
+c 13227,14355,330 0 161123 -- MSL 69 (19U 99)
+d 13227,19545,330 2 161124 -- MSL 70 (19U 100)
+e 13227,14355,330 0 161125 -- MSL 71 (19U 101)
+f 13227,19335 2 161126 -- MSL 72 (19U 102)
+g 13227,14355,4350 0 161127 -- MSL 73 (19U 103)
+h 13227,19545 2 161128 -- MSL 74 (19U 104)
+i 13227,18780 2 161129 -- MSL 75 (19U 105)
+j 13227,18780,4350 2 161130 -- MSL 76 (19U 106)
+k 13227,19545 2 161131 -- MSL 77 (19U 107)
+l 13227,19545 2 161132 -- MSL 78 (19U 108)
+m 13227,14355 0 161133 -- MSL 79 (19U 109)
+n 13227,14355 0 161134 -- MSL 80 (19U 110)
+o 13227,14355,330 0 161135 -- MSL 81 (19U 111)
+p 13227,14355,5475 1 161136 -- MSL 82 (19U 112)
+q 13227,14355,5475 1 161137 -- MSL 83 (19U 113)
+r 13227,14355 0 161138 -- MSL 84 (19U 114)
+s 13227,14355,330 0 161139 -- MSL 85 (19U 115)
+t 13227,18495,330 2 161140 -- MSL 86 (19U 116)
+u 13227,14025,330 0 161141 -- MSL 87 (19U 117)
+v 13227,14025 0 161142 -- MSL 88 (19U 118)
+w 13227,14025 0 161143 -- MSL 89 (19U 119)
+x 13227,14025 0 161144 -- MSL 90 (19U 120)
+y 13227,14025,4350 0 161145 -- MSL 91 (19U 121)
+z 13227,14025 0 161146 -- MSL 92 (19U 122)
+{ 13227,20130,6075 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13227,19758,6588 3 161148 -- MSL 94 (19U 124)
+ba "
+} 13227,20130,6075 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 13227,10485 0 161150 -- MSL 96 (19U 126)
+`A 13227,24630 2 161216 -- MSL 99 (19U 192)
+^A 13227,24810 2 161218 -- MSL 100 (19U 194)
+`E 13227,24630 2 161224 -- MSL 101 (19U 200)
+^E 13227,24810 2 161226 -- MSL 102 (19U 202)
+:E 13227,23115 2 161227 -- MSL 103 (19U 203)
+^I 13227,24810 2 161230 -- MSL 104 (19U 206)
+:I 13227,23115 2 161231 -- MSL 105 (19U 207)
+aa 13227,19725 2 161204 -- MSL 106 (19U 180)
+ga 13227,19725 2 161120 -- MSL 107 (19U 96)
+a^ 13227,19905 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 13227,18195 2 161192 -- MSL 109 (19U 168)
+~ 13227,18867 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 13227,24630,330 2 161241 -- MSL 111 (19U 217)
+^U 13227,24810,330 2 161243 -- MSL 112 (19U 219)
+u00AF 13227,21105 2 161199 -- MSL 113 (19U 175)
+'Y 13227,24630 2 161245 -- MSL 114 (19U 221)
+'y 13227,19725,4350 2 161277 -- MSL 115 (19U 253)
+de 13227,19320 2 161200 -- MSL 116 (19U 176)
+,C 13227,19320,5430 3 161223 -- MSL 117 (19U 199)
+,c 13227,14355,5430 1 161255 -- MSL 118 (19U 231)
+~N 13227,23787 2 161233 -- MSL 119 (19U 209)
+~n 13227,18867 2 161265 -- MSL 120 (19U 241)
+r! 13227,14259,5061 1 161185 -- MSL 121 (19U 161)
+r? 13227,14265,5385 1 161215 -- MSL 122 (19U 191)
+Cs 13227,15684 0 161188 -- MSL 123 (19U 164)
+Po 13227,19320,330 2 161187 -- MSL 124 (19U 163)
+Ye 13227,18990 2 161189 -- MSL 125 (19U 165)
+sc 13227,19320,1344 2 161191 -- MSL 126 (19U 167)
+Fn 13227,19335,3540 2 161155 -- MSL 127 (19U 131)
+ct 13227,19320,330 2 161186 -- MSL 128 (19U 162)
+^a 13227,19905,330 2 161250 -- MSL 129 (19U 226)
+^e 13227,19905,330 2 161258 -- MSL 130 (19U 234)
+^o 13227,19905,330 2 161268 -- MSL 131 (19U 244)
+^u 13227,19905,330 2 161275 -- MSL 132 (19U 251)
+'a 13227,19725,330 2 161249 -- MSL 133 (19U 225)
+'e 13227,19725,330 2 161257 -- MSL 134 (19U 233)
+'o 13227,19725,330 2 161267 -- MSL 135 (19U 243)
+'u 13227,19725,330 2 161274 -- MSL 136 (19U 250)
+`a 13227,19725,330 2 161248 -- MSL 137 (19U 224)
+`e 13227,19725,330 2 161256 -- MSL 138 (19U 232)
+`o 13227,19725,330 2 161266 -- MSL 139 (19U 242)
+`u 13227,19725,330 2 161273 -- MSL 140 (19U 249)
+:a 13227,18195,330 2 161252 -- MSL 141 (19U 228)
+:e 13227,18195,330 2 161259 -- MSL 142 (19U 235)
+:o 13227,18195,330 2 161270 -- MSL 143 (19U 246)
+:u 13227,18195,330 2 161276 -- MSL 144 (19U 252)
+oA 13227,24735 2 161221 -- MSL 145 (19U 197)
+^i 13227,19905 2 161262 -- MSL 146 (19U 238)
+/O 13227,19320,444 2 161240 -- MSL 147 (19U 216)
+AE 13227,18990 2 161222 -- MSL 148 (19U 198)
+oa 13227,19830,330 2 161253 -- MSL 149 (19U 229)
+'i 13227,19725 2 161261 -- MSL 150 (19U 237)
+/o 13227,14805,747 0 161272 -- MSL 151 (19U 248)
+ae 13227,14355,330 0 161254 -- MSL 152 (19U 230)
+:A 13227,23115 2 161220 -- MSL 153 (19U 196)
+`i 13227,19725 2 161260 -- MSL 154 (19U 236)
+:O 13227,23115,330 2 161238 -- MSL 155 (19U 214)
+:U 13227,23115,330 2 161244 -- MSL 156 (19U 220)
+'E 13227,24630 2 161225 -- MSL 157 (19U 201)
+:i 13227,18195 2 161263 -- MSL 158 (19U 239)
+ss 13227,19335,330 2 161247 -- MSL 159 (19U 223)
+^O 13227,24810,330 2 161236 -- MSL 160 (19U 212)
+'A 13227,24630 2 161217 -- MSL 161 (19U 193)
+~A 13227,23787 2 161219 -- MSL 162 (19U 195)
+~a 13227,18867,330 2 161251 -- MSL 163 (19U 227)
+-D 13227,18990 2 161232 -- MSL 164 (19U 208)
+Sd 13227,19545,330 2 161264 -- MSL 165 (19U 240)
+'I 13227,24630 2 161229 -- MSL 166 (19U 205)
+`I 13227,24630 2 161228 -- MSL 167 (19U 204)
+'O 13227,24630,330 2 161235 -- MSL 168 (19U 211)
+`O 13227,24630,330 2 161234 -- MSL 169 (19U 210)
+~O 13227,23787,330 2 161237 -- MSL 170 (19U 213)
+~o 13227,18867,330 2 161269 -- MSL 171 (19U 245)
+vS 13227,24810,330 2 161162 -- MSL 172 (19U 138)
+vs 13227,19905,330 2 161178 -- MSL 173 (19U 154)
+'U 13227,24630,330 2 161242 -- MSL 174 (19U 218)
+:Y 13227,23115 2 161183 -- MSL 175 (19U 159)
+:y 13227,18195,4350 2 161279 -- MSL 176 (19U 255)
+TP 13227,18990 2 161246 -- MSL 177 (19U 222)
+Tp 13227,19545,5475 3 161278 -- MSL 178 (19U 254)
+mc 13227,14025,4350 0 161205 -- MSL 180 (19U 181)
+ps 13227,19635,4200 2 161206 -- MSL 181 (19U 182)
+34 13227,19119,3825 2 161214 -- MSL 182 (19U 190)
+\- 13227,9945 0 60096 -- MSL 183 ( 7J 192)
+14 13227,19110,3825 2 161212 -- MSL 184 (19U 188)
+12 13227,19110,3825 2 161213 -- MSL 185 (19U 189)
+Of 13227,19320 2 161194 -- MSL 186 (19U 170)
+Om 13227,19320 2 161210 -- MSL 187 (19U 186)
+Fo 13227,13710 0 161195 -- MSL 188 (19U 171)
+Fc 13227,13710 0 161211 -- MSL 190 (19U 187)
+t+- 13227,15075 0 161201 -- MSL 191 (19U 177)
+bb 13227,19083,5916 3 161190 -- MSL 192 (19U 166)
+co 13227,19635 2 161193 -- MSL 193 (19U 169)
+tno 13227,12501 0 161196 -- MSL 194 (19U 172)
+u00AD 13227,7815 0 161197 -- MSL 195 (19U 173)
+rg 13227,19635 2 161198 -- MSL 196 (19U 174)
+S2 13227,19110 2 161202 -- MSL 197 (19U 178)
+S3 13227,19119 2 161203 -- MSL 198 (19U 179)
+ac 13227,0,5430 1 161208 -- MSL 199 (19U 184)
+S1 13227,19110 2 161209 -- MSL 200 (19U 185)
+tmu 13227,14814 0 161239 -- MSL 201 (19U 215)
+tdi 13227,14655 0 161271 -- MSL 202 (19U 247)
+u203C 13227,18990,330 2 87315 -- MSL 221 (10U 19)
+u20A7 13227,18990,330 2 60121 -- MSL 232 ( 7J 217)
+pc 13227,11025 0 161207 -- MSL 302 (19U 183)
+u013F 13227,18990 2 51943 -- MSL 306 ( 6J 231)
+u0140 13227,19545 2 51959 -- MSL 307 ( 6J 247)
+u2113 13227,17964,330 2 60122 -- MSL 308 ( 7J 218)
+u0149 13227,19320 2 51951 -- MSL 309 ( 6J 239)
+fm 13227,18990 2 60101 -- MSL 310 ( 7J 197)
+sd 13227,18990 2 60102 -- MSL 311 ( 7J 198)
+dg 13227,18990 2 161158 -- MSL 312 (19U 134)
+tm 13227,17850 2 161177 -- MSL 313 (19U 153)
+u2017 13227,0,6588 1 60095 -- MSL 314 ( 7J 191)
+ah 13227,19905 2 75169 -- MSL 315 ( 9E 161)
+ao 13227,19830 2 60152 -- MSL 316 ( 7J 248)
+f/ 13227,15675,858 0 60109 -- MSL 324 ( 7J 205)
+em 13227,7710 0 161175 -- MSL 325 (19U 151)
+en 13227,7710 0 161174 -- MSL 326 (19U 150)
+dd 13227,18990 2 161159 -- MSL 327 (19U 135)
+.i 13227,14025 0 46333 -- MSL 328 ( 5T 253)
+aq 13227,18990 2 161063 -- MSL 329 (19U 39)
+bu 13227,12714 0 161173 -- MSL 331 (19U 149)
+u207F 13227,19110 2 87548 -- MSL 332 (10U 252)
+u0111 13227,19545,330 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 13227,24270 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 13227,19350,330 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 13227,18990,4137 2 75173 -- MSL 404 ( 9E 165)
+u0061_0328 13227,14355,4137 0 75193 -- MSL 405 ( 9E 185)
+'C 13227,24630,330 2 75206 -- MSL 406 ( 9E 198)
+'c 13227,19725,330 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 13227,24810,330 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 13227,19905,330 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 13227,24810 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 13227,19545,330 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 13227,24810 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 13227,19905,330 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 13227,18990,4137 2 75210 -- MSL 422 ( 9E 202)
+u0065_0328 13227,14355,4137 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 13227,24630 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 13227,24630 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 13227,19545 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 13227,19545 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 13227,24630 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 13227,19725 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 13227,24810 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 13227,19905 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 13227,24630,330 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 13227,19725,330 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 13227,24630 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 13227,19725 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 13227,24810 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 13227,19905 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 13227,24630,330 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 13227,19725,330 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 13227,24810 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 13227,19545,330 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 13227,18990,5430 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 13227,18495,5430 3 75262 -- MSL 469 ( 9E 254)
+u0055_030B 13227,24630,330 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 13227,19725,330 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 13227,24735,330 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 13227,19830,330 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 13227,24630 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 13227,19725 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 13227,23115 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 13227,18195 2 75199 -- MSL 485 ( 9E 191)
+u2070 13227,19110 2 51753 -- MSL 1000 ( 6J 41)
+u2074 13227,19110 2 51748 -- MSL 1001 ( 6J 36)
+u2075 13227,18990 2 51749 -- MSL 1002 ( 6J 37)
+u2076 13227,19110 2 51806 -- MSL 1003 ( 6J 94)
+u2077 13227,18990 2 51750 -- MSL 1004 ( 6J 38)
+u2078 13227,19110 2 51754 -- MSL 1005 ( 6J 42)
+u2079 13227,19110 2 51752 -- MSL 1006 ( 6J 40)
+lq 13227,19320 2 161171 -- MSL 1017 (19U 147)
+rq 13227,19320 2 161172 -- MSL 1018 (19U 148)
+Bq 13227,2136,2154 0 161156 -- MSL 1019 (19U 132)
+u2003 13227,0 0 51821 -- MSL 1020 ( 6J 109)
+u2002 13227,0 0 51822 -- MSL 1021 ( 6J 110)
+u2009 13227,0 0 51828 -- MSL 1023 ( 6J 116)
+u2026 13227,2055,330 0 161157 -- MSL 1028 (19U 133)
+vz 13227,19905 2 75166 -- MSL 1031 ( 9E 158)
+u2120 13227,18000 2 128299 -- MSL 1034 (15U 43)
+u211E 13227,18990,3225 2 51794 -- MSL 1036 ( 6J 82)
+fi 13227,19335 2 60077 -- MSL 1040 ( 7J 173)
+fl 13227,19335 2 60078 -- MSL 1041 ( 7J 174)
+ff 13227,19335 2 51883 -- MSL 1042 ( 6J 171)
+Fi 13227,19335 2 51884 -- MSL 1043 ( 6J 172)
+Fl 13227,19335 2 51885 -- MSL 1044 ( 6J 173)
+ij 13227,18780,4350 2 60134 -- MSL 1047 ( 7J 230)
+u2105 13227,18990 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 13227,24270,330 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 13227,19350,4350 2 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 13227,19320,5430 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 13227,14355,5430 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 13227,23115 2 46301 -- MSL 1065 ( 5T 221)
+bq 13227,2136,2154 0 161154 -- MSL 1067 (19U 130)
+%0 13227,19320,330 2 161161 -- MSL 1068 (19U 137)
+a- 13227,18078 2 60154 -- MSL 1084 ( 7J 250)
+ab 13227,19350 2 75170 -- MSL 1086 ( 9E 162)
+a. 13227,18195 2 75263 -- MSL 1088 ( 9E 255)
+oe 13227,14355,330 0 161180 -- MSL 1090 (19U 156)
+OE 13227,19320,330 2 161164 -- MSL 1091 (19U 140)
+fo 13227,13710 0 161163 -- MSL 1092 (19U 139)
+fc 13227,13710 0 161179 -- MSL 1093 (19U 155)
+sq 13227,14106 0 60091 -- MSL 1094 ( 7J 187)
+/L 13227,18990 2 75171 -- MSL 1095 ( 9E 163)
+/l 13227,19545 2 75187 -- MSL 1096 ( 9E 179)
+a" 13227,19725 2 75197 -- MSL 1097 ( 9E 189)
+ho 13227,750,4137 0 75186 -- MSL 1098 ( 9E 178)
+vZ 13227,24810 2 75150 -- MSL 1106 ( 9E 142)
+IJ 13227,18990,330 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/MARIGOLD b/font/devlj4/MARIGOLD
new file mode 100644
index 0000000..a88f188
--- /dev/null
+++ b/font/devlj4/MARIGOLD
@@ -0,0 +1,331 @@
+# Marigold
+name MARIGOLD
+spacewidth 5856
+pcltypeface 4297
+pclproportional 1
+pclweight 0
+pclstyle 0
+ligatures fi fl ff ffi ffl 0
+charset
+! 7806,12570,330 0 161057 -- MSL 1 (19U 33)
+dq 6342,11790 0 161058 -- MSL 2 (19U 34)
+" "
+sh 9759,11610 0 161059 -- MSL 3 (19U 35)
+# "
+Do 9759,14325,3315 0 161060 -- MSL 4 (19U 36)
+$ "
+% 17076,11940,330 0 161061 -- MSL 5 (19U 37)
+& 12684,12120,330 0 161062 -- MSL 6 (19U 38)
+cq 3903,11790 0 161170 -- MSL 8 (19U 146)
+' "
+( 6831,16770,2235 2 161064 -- MSL 9 (19U 40)
+) 6831,16770,2235 2 161065 -- MSL 10 (19U 41)
+* 9759,11940 0 161066 -- MSL 11 (19U 42)
++ 11709,8445,360 0 161067 -- MSL 12 (19U 43)
+, 5856,1650,4590 0 161068 -- MSL 13 (19U 44)
+hy 6831,6345 0 161069 -- MSL 14 (19U 45)
+- "
+. 5856,2535,330 0 161070 -- MSL 15 (19U 46)
+sl 8781,16770,3240 2 161071 -- MSL 16 (19U 47)
+/ "
+0 9759,11940,330 0 161072 -- MSL 17 (19U 48)
+1 9759,11940,60 0 161073 -- MSL 18 (19U 49)
+2 9759,11940,450 0 161074 -- MSL 19 (19U 50)
+3 9759,11940,330 0 161075 -- MSL 20 (19U 51)
+4 9759,11940,1080 0 161076 -- MSL 21 (19U 52)
+5 9759,12060,330 0 161077 -- MSL 22 (19U 53)
+6 9759,12660,330 0 161078 -- MSL 23 (19U 54)
+7 9759,12480,30 0 161079 -- MSL 24 (19U 55)
+8 9759,11940,330 0 161080 -- MSL 25 (19U 56)
+9 9759,11940,1050 0 161081 -- MSL 26 (19U 57)
+: 5856,8475,330 0 161082 -- MSL 27 (19U 58)
+; 5856,8475,4590 0 161083 -- MSL 28 (19U 59)
+< 26346,16068 2 161084 -- MSL 29 (19U 60)
+= 11709,6510 0 161085 -- MSL 30 (19U 61)
+> 26346,16068 2 161086 -- MSL 31 (19U 62)
+? 8295,12120,330 0 161087 -- MSL 32 (19U 63)
+at 18051,12354,3126 0 161088 -- MSL 33 (19U 64)
+@ "
+A 12198,12120,225 0 161089 -- MSL 34 (19U 65)
+B 10734,12120,60 0 161090 -- MSL 35 (19U 66)
+C 10734,12120,330 0 161091 -- MSL 36 (19U 67)
+D 12684,12015,225 0 161092 -- MSL 37 (19U 68)
+E 10245,11910,225 0 161093 -- MSL 38 (19U 69)
+F 9759,12120,60 0 161094 -- MSL 39 (19U 70)
+G 12198,12120,330 0 161095 -- MSL 40 (19U 71)
+H 12198,12015,60 0 161096 -- MSL 41 (19U 72)
+I 6342,11850,60 0 161097 -- MSL 42 (19U 73)
+J 6342,11850,4128 0 161098 -- MSL 43 (19U 74)
+K 12198,11850,60 0 161099 -- MSL 44 (19U 75)
+L 8781,11850,225 0 161100 -- MSL 45 (19U 76)
+M 16101,12120,225 0 161101 -- MSL 46 (19U 77)
+N 13173,12120,330 0 161102 -- MSL 47 (19U 78)
+O 11709,12120,330 0 161103 -- MSL 48 (19U 79)
+P 9759,12120,60 0 161104 -- MSL 49 (19U 80)
+Q 11709,12120,3744 0 161105 -- MSL 50 (19U 81)
+R 11709,12120,330 0 161106 -- MSL 51 (19U 82)
+S 9759,12120,330 0 161107 -- MSL 52 (19U 83)
+T 10245,12120,60 0 161108 -- MSL 53 (19U 84)
+U 12684,11910,330 0 161109 -- MSL 54 (19U 85)
+V 12198,12120,330 0 161110 -- MSL 55 (19U 86)
+W 16101,12120,330 0 161111 -- MSL 56 (19U 87)
+X 12198,11910,120 0 161112 -- MSL 57 (19U 88)
+Y 10734,12120,60 0 161113 -- MSL 58 (19U 89)
+Z 10734,12345,330 0 161114 -- MSL 59 (19U 90)
+lB 6342,16860,1260 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 8781,16770,3240 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 6342,16860,1260 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588 0 161119 -- MSL 64 (19U 95)
+oq 3903,11790 0 161169 -- MSL 66 (19U 145)
+` "
+a 8295,10350,330 0 161121 -- MSL 67 (19U 97)
+b 6831,17430,330 2 161122 -- MSL 68 (19U 98)
+c 6342,10350,330 0 161123 -- MSL 69 (19U 99)
+d 7806,17430,330 2 161124 -- MSL 70 (19U 100)
+e 6342,10350,330 0 161125 -- MSL 71 (19U 101)
+f 3903,17430,7950 3 161126 -- MSL 72 (19U 102)
+g 7806,10350,7950 1 161127 -- MSL 73 (19U 103)
+h 8295,17433,330 2 161128 -- MSL 74 (19U 104)
+i 4878,13635,330 0 161129 -- MSL 75 (19U 105)
+j 3903,13635,7950 1 161130 -- MSL 76 (19U 106)
+k 6831,17430,330 2 161131 -- MSL 77 (19U 107)
+l 3903,17430,330 2 161132 -- MSL 78 (19U 108)
+m 11220,10350,330 0 161133 -- MSL 79 (19U 109)
+n 7806,10350,330 0 161134 -- MSL 80 (19U 110)
+o 6831,10350,330 0 161135 -- MSL 81 (19U 111)
+p 7806,10350,7950 1 161136 -- MSL 82 (19U 112)
+q 7317,10575,7950 1 161137 -- MSL 83 (19U 113)
+r 6342,10350 0 161138 -- MSL 84 (19U 114)
+s 5367,10350,330 0 161139 -- MSL 85 (19U 115)
+t 5367,14325,330 0 161140 -- MSL 86 (19U 116)
+u 7806,10350,330 0 161141 -- MSL 87 (19U 117)
+v 7317,10350,330 0 161142 -- MSL 88 (19U 118)
+w 9759,10350,330 0 161143 -- MSL 89 (19U 119)
+x 7317,13590,330 0 161144 -- MSL 90 (19U 120)
+y 7317,10350,7950 1 161145 -- MSL 91 (19U 121)
+z 7317,10350,330 0 161146 -- MSL 92 (19U 122)
+{ 8295,16380,2670 2 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588 2 161148 -- MSL 94 (19U 124)
+ba "
+} 8295,16380,2670 2 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,8952 0 161150 -- MSL 96 (19U 126)
+`A 12198,17040,225 2 161216 -- MSL 99 (19U 192)
+^A 12198,17520,225 2 161218 -- MSL 100 (19U 194)
+`E 10245,17040,225 2 161224 -- MSL 101 (19U 200)
+^E 10245,17520,225 2 161226 -- MSL 102 (19U 202)
+:E 10245,16320,225 2 161227 -- MSL 103 (19U 203)
+^I 6342,17520,60 2 161230 -- MSL 104 (19U 206)
+:I 6342,16320,60 2 161231 -- MSL 105 (19U 207)
+aa 11709,15030 0 161204 -- MSL 106 (19U 180)
+ga 11709,15030 0 161120 -- MSL 107 (19U 96)
+a^ 11709,15300 0 161160 -- MSL 108 (19U 136)
+^ "
+ad 11709,14580 0 161192 -- MSL 109 (19U 168)
+~ 11709,13782 0 161176 -- MSL 110 (19U 152)
+a~ "
+`U 12684,17040,330 2 161241 -- MSL 111 (19U 217)
+^U 12684,17520,330 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105 2 161199 -- MSL 113 (19U 175)
+'Y 10734,17040,60 2 161245 -- MSL 114 (19U 221)
+'y 7317,15030,7950 1 161277 -- MSL 115 (19U 253)
+de 7806,11940 0 161200 -- MSL 116 (19U 176)
+,C 10734,12120,4140 0 161223 -- MSL 117 (19U 199)
+,c 6342,10350,4320 0 161255 -- MSL 118 (19U 231)
+~N 13173,15828,330 2 161233 -- MSL 119 (19U 209)
+~n 7806,13782,330 0 161265 -- MSL 120 (19U 241)
+r! 7806,8313,4587 0 161185 -- MSL 121 (19U 161)
+r? 8295,8202,4248 0 161215 -- MSL 122 (19U 191)
+Cs 9759,10668 0 161188 -- MSL 123 (19U 164)
+Po 9759,11940,225 0 161187 -- MSL 124 (19U 163)
+Ye 9759,12165,60 0 161189 -- MSL 125 (19U 165)
+sc 9759,12120,4596 0 161191 -- MSL 126 (19U 167)
+Fn 9759,17430,7950 3 161155 -- MSL 127 (19U 131)
+ct 9759,12516,2580 0 161186 -- MSL 128 (19U 162)
+^a 8295,15300,330 0 161250 -- MSL 129 (19U 226)
+^e 6342,15300,330 0 161258 -- MSL 130 (19U 234)
+^o 6831,15300,330 0 161268 -- MSL 131 (19U 244)
+^u 7806,15300,330 0 161275 -- MSL 132 (19U 251)
+'a 8295,15030,330 0 161249 -- MSL 133 (19U 225)
+'e 6342,15030,330 0 161257 -- MSL 134 (19U 233)
+'o 6831,15030,330 0 161267 -- MSL 135 (19U 243)
+'u 7806,15030,330 0 161274 -- MSL 136 (19U 250)
+`a 8295,15030,330 0 161248 -- MSL 137 (19U 224)
+`e 6342,15030,330 0 161256 -- MSL 138 (19U 232)
+`o 6831,15030,330 0 161266 -- MSL 139 (19U 242)
+`u 7806,15030,330 0 161273 -- MSL 140 (19U 249)
+:a 8295,14580,330 0 161252 -- MSL 141 (19U 228)
+:e 6342,14580,330 0 161259 -- MSL 142 (19U 235)
+:o 6831,14580,330 0 161270 -- MSL 143 (19U 246)
+:u 7806,14580,330 0 161276 -- MSL 144 (19U 252)
+oA 12198,16815,225 2 161221 -- MSL 145 (19U 197)
+^i 4878,15300,330 0 161262 -- MSL 146 (19U 238)
+/O 11709,12849,984 0 161240 -- MSL 147 (19U 216)
+AE 17565,11910,225 0 161222 -- MSL 148 (19U 198)
+oa 8295,14685,330 0 161253 -- MSL 149 (19U 229)
+'i 4878,15030,330 0 161261 -- MSL 150 (19U 237)
+/o 6831,11724,1635 0 161272 -- MSL 151 (19U 248)
+ae 10734,10350,330 0 161254 -- MSL 152 (19U 230)
+:A 12198,16320,225 2 161220 -- MSL 153 (19U 196)
+`i 4878,15030,330 0 161260 -- MSL 154 (19U 236)
+:O 11709,16320,330 2 161238 -- MSL 155 (19U 214)
+:U 12684,16320,330 2 161244 -- MSL 156 (19U 220)
+'E 10245,17040,225 2 161225 -- MSL 157 (19U 201)
+:i 4878,14580,330 0 161263 -- MSL 158 (19U 239)
+ss 9270,18135,7350 3 161247 -- MSL 159 (19U 223)
+^O 11709,17520,330 2 161236 -- MSL 160 (19U 212)
+'A 12198,17040,225 2 161217 -- MSL 161 (19U 193)
+~A 12198,15828,225 2 161219 -- MSL 162 (19U 195)
+~a 8295,13782,330 0 161251 -- MSL 163 (19U 227)
+-D 12684,12015,225 0 161232 -- MSL 164 (19U 208)
+Sd 7317,17430,330 2 161264 -- MSL 165 (19U 240)
+'I 6342,17040,60 2 161229 -- MSL 166 (19U 205)
+`I 6342,17040,60 2 161228 -- MSL 167 (19U 204)
+'O 11709,17040,330 2 161235 -- MSL 168 (19U 211)
+`O 11709,17040,330 2 161234 -- MSL 169 (19U 210)
+~O 11709,15828,330 2 161237 -- MSL 170 (19U 213)
+~o 6831,13782,330 0 161269 -- MSL 171 (19U 245)
+vS 9759,17520,330 2 161162 -- MSL 172 (19U 138)
+vs 5367,15330,330 0 161178 -- MSL 173 (19U 154)
+'U 12684,17040,330 2 161242 -- MSL 174 (19U 218)
+:Y 10734,16320,60 2 161183 -- MSL 175 (19U 159)
+:y 7317,14580,7950 1 161279 -- MSL 176 (19U 255)
+TP 9759,11850,60 0 161246 -- MSL 177 (19U 222)
+Tp 7806,17430,7950 3 161278 -- MSL 178 (19U 254)
+mc 14637,10800,5595 0 161205 -- MSL 180 (19U 181)
+ps 11709,12450,4455 0 161206 -- MSL 181 (19U 182)
+34 17076,11940,840 0 161214 -- MSL 182 (19U 190)
+\- 11709,4770 0 60096 -- MSL 183 ( 7J 192)
+14 17076,11940,840 0 161212 -- MSL 184 (19U 188)
+12 17076,11940,330 0 161213 -- MSL 185 (19U 189)
+Of 6342,11940 0 161194 -- MSL 186 (19U 170)
+Om 6342,11940 0 161210 -- MSL 187 (19U 186)
+Fo 9270,8535 0 161195 -- MSL 188 (19U 171)
+Fc 9270,8535 0 161211 -- MSL 190 (19U 187)
+t+- 11709,8445,2595 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916 2 161190 -- MSL 192 (19U 166)
+co 7806,15960 2 161193 -- MSL 193 (19U 169)
+tno 11709,6780 0 161196 -- MSL 194 (19U 172)
+u00AD 6831,6345 0 161197 -- MSL 195 (19U 173)
+rg 7806,15960 2 161198 -- MSL 196 (19U 174)
+S2 7317,11850 0 161202 -- MSL 197 (19U 178)
+S3 7317,11850 0 161203 -- MSL 198 (19U 179)
+ac 11709,0,4320 0 161208 -- MSL 199 (19U 184)
+S1 7317,11850 0 161209 -- MSL 200 (19U 185)
+tmu 11709,7815 0 161239 -- MSL 201 (19U 215)
+tdi 11709,8700,360 0 161271 -- MSL 202 (19U 247)
+u203C 12198,12570,330 0 87315 -- MSL 221 (10U 19)
+u20A7 15126,14325,330 0 60121 -- MSL 232 ( 7J 217)
+pc 5856,7662 0 161207 -- MSL 302 (19U 183)
+u013F 8781,11850,225 0 51943 -- MSL 306 ( 6J 231)
+u0140 6831,17430,330 2 51959 -- MSL 307 ( 6J 247)
+u2113 11709,12120,330 0 60122 -- MSL 308 ( 7J 218)
+u0149 11709,11790,330 0 51951 -- MSL 309 ( 6J 239)
+fm 4878,11610 0 60101 -- MSL 310 ( 7J 197)
+sd 7806,11610 0 60102 -- MSL 311 ( 7J 198)
+dg 9759,12315,3795 0 161158 -- MSL 312 (19U 134)
+tm 9759,14445 0 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588 0 60095 -- MSL 314 ( 7J 191)
+ah 11709,15330 0 75169 -- MSL 315 ( 9E 161)
+ao 11709,14685 0 60152 -- MSL 316 ( 7J 248)
+f/ 1953,11940,330 0 60109 -- MSL 324 ( 7J 205)
+em 18051,6345 0 161175 -- MSL 325 (19U 151)
+en 11709,6345 0 161174 -- MSL 326 (19U 150)
+dd 9759,12315,3795 0 161159 -- MSL 327 (19U 135)
+.i 4878,10350,330 0 46333 -- MSL 328 ( 5T 253)
+aq 3903,11790 0 161063 -- MSL 329 (19U 39)
+bu 13173,14226 0 161173 -- MSL 331 (19U 149)
+u207F 7806,11850 0 87548 -- MSL 332 (10U 252)
+u0111 7806,17430,330 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 12198,16650,225 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 8295,14700,330 0 75235 -- MSL 401 ( 9E 227)
+u0041_0328 12198,12120,4332 0 75173 -- MSL 404 ( 9E 165)
+u0061_0328 8295,10350,4410 0 75193 -- MSL 405 ( 9E 185)
+'C 10734,17040,330 2 75206 -- MSL 406 ( 9E 198)
+'c 6342,15030,330 0 75238 -- MSL 407 ( 9E 230)
+u0041_030C 10734,17520,330 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 6342,15330,330 0 75240 -- MSL 411 ( 9E 232)
+u0044_030C 12684,17520,225 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 10734,17430,330 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 10245,17520,225 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 6342,15330,330 0 75244 -- MSL 417 ( 9E 236)
+u0045_0328 10245,11910,4332 0 75210 -- MSL 422 ( 9E 202)
+u0065_0328 6342,10350,4410 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 8781,17040,225 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 3903,22008,330 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 8781,11850,225 0 75196 -- MSL 442 ( 9E 188)
+u006C_030C 6831,17430,330 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 13173,17040,330 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 7806,15030,330 0 75249 -- MSL 447 ( 9E 241)
+u004E_030C 13173,17520,330 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 7806,15330,330 0 75250 -- MSL 449 ( 9E 242)
+u004F_030B 11709,17040,330 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 6831,15030,330 0 75253 -- MSL 453 ( 9E 245)
+u0052_0301 11709,17040,330 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 6342,15030 0 75232 -- MSL 457 ( 9E 224)
+u0052_030C 11709,17520,330 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 6342,15330 0 75256 -- MSL 459 ( 9E 248)
+u0053_0301 9759,17040,330 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 5367,15030,330 0 75164 -- MSL 463 ( 9E 156)
+u0054_030C 10245,17520,60 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 6831,15330,330 0 75165 -- MSL 467 ( 9E 157)
+u0054_0327 10245,12120,4140 0 75230 -- MSL 468 ( 9E 222)
+u0074_0327 5367,14325,4320 0 75262 -- MSL 469 ( 9E 254)
+u0055_030B 12684,17040,330 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 7806,15030,330 0 75259 -- MSL 475 ( 9E 251)
+u0055_030A 12684,16815,330 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 7806,14685,330 0 75257 -- MSL 477 ( 9E 249)
+u005A_0301 10734,17040,330 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 7317,15030,330 0 75167 -- MSL 483 ( 9E 159)
+u005A_0307 10734,16320,330 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 7317,14580,330 0 75199 -- MSL 485 ( 9E 191)
+u2070 7317,11850 0 51753 -- MSL 1000 ( 6J 41)
+u2074 7317,11850 0 51748 -- MSL 1001 ( 6J 36)
+u2075 7317,11910 0 51749 -- MSL 1002 ( 6J 37)
+u2076 7317,12270 0 51806 -- MSL 1003 ( 6J 94)
+u2077 7317,11910 0 51750 -- MSL 1004 ( 6J 38)
+u2078 7317,11850 0 51754 -- MSL 1005 ( 6J 42)
+u2079 7317,11850 0 51752 -- MSL 1006 ( 6J 40)
+lq 6342,11790 0 161171 -- MSL 1017 (19U 147)
+rq 6342,11790 0 161172 -- MSL 1018 (19U 148)
+Bq 6342,1650,2550 0 161156 -- MSL 1019 (19U 132)
+u2003 18051,0 0 51821 -- MSL 1020 ( 6J 109)
+u2002 11709,0 0 51822 -- MSL 1021 ( 6J 110)
+u2009 5856,0 0 51828 -- MSL 1023 ( 6J 116)
+u2026 18051,2415,330 0 161157 -- MSL 1028 (19U 133)
+vz 7317,15330,330 0 75166 -- MSL 1031 ( 9E 158)
+u2120 9759,14595 0 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056 2 51794 -- MSL 1036 ( 6J 82)
+fi 7806,17430,7950 3 60077 -- MSL 1040 ( 7J 173)
+fl 7806,17430,7950 3 60078 -- MSL 1041 ( 7J 174)
+ff 7806,17430,7950 3 51883 -- MSL 1042 ( 6J 171)
+Fi 11709,17430,7950 3 51884 -- MSL 1043 ( 6J 172)
+Fl 11709,17430,7950 3 51885 -- MSL 1044 ( 6J 173)
+ij 8781,13635,7950 1 60134 -- MSL 1047 ( 7J 230)
+u2105 13662,12120,330 0 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 12198,16650,330 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 7806,14700,7950 1 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 9759,12120,4140 0 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 5367,10350,4320 0 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 6342,16320,60 2 46301 -- MSL 1065 ( 5T 221)
+bq 3903,1650,2550 0 161154 -- MSL 1067 (19U 130)
+%0 22932,11940,330 0 161161 -- MSL 1068 (19U 137)
+a- 11709,13674 0 60154 -- MSL 1084 ( 7J 250)
+ab 11709,14700 0 75170 -- MSL 1086 ( 9E 162)
+a. 11709,14580 0 75263 -- MSL 1088 ( 9E 255)
+oe 10734,10350,330 0 161180 -- MSL 1090 (19U 156)
+OE 16587,12120,330 0 161164 -- MSL 1091 (19U 140)
+fo 5856,8535 0 161163 -- MSL 1092 (19U 139)
+fc 5856,8535 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624 0 60091 -- MSL 1094 ( 7J 187)
+/L 8781,11850,225 0 75171 -- MSL 1095 ( 9E 163)
+/l 4878,17430,330 2 75187 -- MSL 1096 ( 9E 179)
+a" 11709,15030 0 75197 -- MSL 1097 ( 9E 189)
+ho 11709,1341,4410 0 75186 -- MSL 1098 ( 9E 178)
+vZ 10734,17520,330 2 75150 -- MSL 1106 ( 9E 142)
+IJ 12684,11850,4128 0 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/OB b/font/devlj4/OB
new file mode 100644
index 0000000..c0f99ec
--- /dev/null
+++ b/font/devlj4/OB
@@ -0,0 +1,784 @@
+# CG Omega Bd
+name OB
+spacewidth 7317
+pcltypeface 4113
+pclproportional 1
+pclweight 3
+pclstyle 0
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -2924
+P . -3902
+P , -3902
+V A -3902
+A V -3902
+T o -2924
+T r -1949
+T c -2924
+T e -2924
+T d -2924
+T s -2438
+T y -2924
+T a -2924
+T w -2924
+T u -2924
+L T -1949
+L Y -2924
+Y o -3902
+Y e -3902
+Y a -3902
+A W -3413
+W A -3413
+T A -1949
+V o -2924
+V e -2924
+V a -2924
+Y A -3902
+F A -2924
+F . -3902
+F , -3902
+A T -1949
+A Y -3902
+v . -2438
+v , -2438
+y . -2438
+y , -2438
+T . -1949
+T , -1949
+L W -2924
+P A -2924
+V . -3902
+V , -3902
+Y . -3902
+Y , -3902
+W o -2438
+W e -2438
+W a -2438
+W . -3413
+W , -3413
+r . -2438
+r , -2438
+w . -2438
+w , -2438
+Y u -2438
+A v -2438
+A y -2438
+A w -1460
+o . -1460
+o , -1460
+p . -1460
+p , -1460
+e . -974
+e , -974
+b . -1460
+b , -1460
+O T -1460
+O V -1460
+O Y -1460
+O . -1460
+O , -1460
+L y -2438
+L O -1460
+L G -1949
+L C -1949
+L Q -1949
+V y -1460
+V u -1460
+V O -1460
+V G -1460
+V C -1460
+V Q -1460
+D T -1949
+D V -1460
+D Y -1949
+D . -1949
+D , -1949
+Y O -1460
+Y G -1949
+Y C -1949
+Y Q -1949
+F o -1460
+F e -1460
+F a -1460
+c . -485
+c , -485
+O A -1460
+O W -974
+L U -1949
+R T -974
+R V -974
+R Y -974
+R W -974
+G T -974
+P o -1460
+P g -974
+P e -1460
+P a -1460
+C A -485
+C . -485
+C , -485
+D A -1460
+D W -974
+B T -974
+B Y -974
+B . -974
+B , -974
+A O -1460
+A G -1460
+A C -1460
+A U -1460
+A Q -1460
+W r -974
+W y -974
+W u -974
+W O -974
+W G -974
+W C -974
+W Q -974
+J A -974
+J . -974
+J , -974
+U A -1460
+U . -1949
+U , -1949
+Q A -1460
+Q W -974
+f . -485
+f , -485
+T O -1460
+T G -1949
+T C -1949
+T Q -1949
+O X -1460
+L o -1460
+L e -1460
+L q -1460
+G V -974
+G Y -974
+G W -974
+G . -485
+G , -485
+C T -485
+C V -485
+C Y -485
+D X -1460
+B V -974
+B X -974
+B A -974
+B W -974
+S . -974
+S , -974
+X o -1460
+X e -1460
+X y -1460
+X O -1460
+X G -1460
+X C -1460
+X Q -1460
+A o -1460
+A e -1460
+Q X -1460
+K o -1460
+K e -1460
+K y -1460
+K w -1460
+K O -1460
+K G -1460
+K C -1460
+K Q -1460
+o v -974
+o y -974
+o x -974
+h v -974
+h y -974
+n v -974
+n y -974
+m v -974
+m y -974
+r g -485
+g . -485
+g , -485
+p v -974
+p y -974
+p x -974
+c v -485
+c y -485
+v o -974
+v g -974
+v c -974
+v d -974
+v a -974
+v q -974
+e v -974
+e y -974
+b v -974
+b y -974
+s . -974
+s , -974
+y o -974
+y g -974
+y c -974
+y d -974
+y a -974
+y q -974
+f g -485
+x o -974
+x g -974
+x c -974
+x e -974
+x d -974
+x a -974
+x q -974
+a v -974
+a y -974
+T i -974
+T S -974
+L a -974
+L S -485
+G X -485
+G A -485
+P s -974
+C X -485
+C W -485
+V i -974
+V S -974
+S T -485
+S V -485
+S Y -485
+S X -485
+S A -974
+S W -485
+Y i -974
+Y S -974
+X a -974
+X u -974
+X S -485
+A t -974
+A g -974
+A c -1460
+A d -1460
+A a -974
+A u -974
+A q -1460
+A S -485
+W i -974
+W S -974
+K c -1460
+K u -974
+K S -485
+t g -485
+o f -485
+r o -485
+r c -485
+r e -485
+r d -485
+r a -485
+r q -485
+p f -485
+c f -485
+c x -485
+v e -974
+v s -974
+e f -485
+e x -974
+b f -485
+s v -485
+s y -485
+s f -485
+s x -485
+y e -974
+y s -974
+f o -485
+f c -485
+f e -485
+f d -485
+f s -485
+f a -485
+f q -485
+x s -485
+k o -485
+k g -485
+k c -485
+k v -485
+k e -485
+k d -485
+k y -485
+k a -485
+k w -485
+k q -485
+O Z -485
+L J -1460
+G Z -485
+P M -485
+C Z -485
+Z o -485
+Z e -485
+Z d -485
+Z s -485
+Z y -485
+Z a -485
+Z w -485
+Z u -485
+Z O -485
+Z G -485
+Z C -485
+Z S -485
+Z Q -485
+D Z -485
+B Z -485
+S Z -485
+A s -485
+A J -1460
+J o -485
+J e -485
+J a -485
+J M -485
+K a -974
+K J -485
+t o -485
+t c -485
+t e -485
+t d -485
+t s -485
+t a -485
+t q -485
+o z -485
+h f -485
+n f -485
+m f -485
+r s -485
+p z -485
+c z -485
+e z -485
+z o -485
+z g -485
+z c -485
+z e -485
+z d -485
+z s -485
+z a -485
+z q -485
+b z -485
+s z -485
+a f -485
+k t -485
+k s -485
+k f -485
+k u -485
+F M -485
+A f -485
+K T -485
+K V -485
+K Y -485
+K W -485
+K U -485
+L cq -2924
+L ' -2924
+T hy -2924
+T - -2924
+T en -2924
+T em -2924
+A cq -3413
+A ' -3413
+hy T -2924
+- T -2924
+en T -2924
+em T -2924
+Y hy -2438
+Y - -2438
+Y en -2438
+Y em -2438
+p cq -1460
+p ' -1460
+c cq -485
+c ' -485
+e cq -974
+e ' -974
+b cq -1460
+b ' -1460
+a cq -974
+a ' -974
+V hy -1460
+V - -1460
+V en -1460
+V em -1460
+h cq -974
+h ' -974
+n cq -974
+n ' -974
+m cq -974
+m ' -974
+W hy -974
+W - -974
+W en -974
+W em -974
+cq d -1460
+' d -1460
+s cq -485
+s ' -485
+L hy -1949
+L - -1949
+L en -1949
+L em -1949
+X hy -1460
+X - -1460
+X en -1460
+X em -1460
+A hy -1460
+A - -1460
+A en -1460
+A em -1460
+K hy -1460
+K - -1460
+K en -1460
+K em -1460
+cq s -974
+' s -974
+hy X -1460
+- X -1460
+hy A -1460
+- A -1460
+en X -1460
+en A -1460
+em X -1460
+K cq -485
+K ' -485
+t g -485
+b f -485
+k cq -485
+k ' -485
+M cq -485
+M ' -485
+Z hy -485
+Z - -485
+Z en -485
+Z em -485
+cq M -485
+' M -485
+k hy -485
+k - -485
+k en -485
+k em -485
+charset
+! 7317,18000,375 2 161057 -- MSL 1 (19U 33)
+dq 12198,18375 2 161058 -- MSL 2 (19U 34)
+" "
+sh 14637,18069,444 2 161059 -- MSL 3 (19U 35)
+# "
+Do 14637,19755,2988 2 161060 -- MSL 4 (19U 36)
+$ "
+% 23418,17769,444 2 161061 -- MSL 5 (19U 37)
+& 19029,17997,375 2 161062 -- MSL 6 (19U 38)
+cq 7317,18375 2 161170 -- MSL 8 (19U 146)
+' "
+( 7317,18375,3165 2 161064 -- MSL 9 (19U 40)
+) 7317,18375,3165 2 161065 -- MSL 10 (19U 41)
+* 14637,18150 2 161066 -- MSL 11 (19U 42)
++ 23418,13164,534 0 161067 -- MSL 12 (19U 43)
+, 7317,4068,4902 0 161068 -- MSL 13 (19U 44)
+hy 7317,8307 0 161069 -- MSL 14 (19U 45)
+- "
+. 7317,3975,375 0 161070 -- MSL 15 (19U 46)
+sl 7317,19650,525 2 161071 -- MSL 16 (19U 47)
+/ "
+0 14637,17700,375 0 161072 -- MSL 17 (19U 48)
+1 14637,17700,69 0 161073 -- MSL 18 (19U 49)
+2 14637,17700,201 0 161074 -- MSL 19 (19U 50)
+3 14637,17700,375 0 161075 -- MSL 20 (19U 51)
+4 14637,17394,69 0 161076 -- MSL 21 (19U 52)
+5 14637,17526,375 0 161077 -- MSL 22 (19U 53)
+6 14637,17700,375 0 161078 -- MSL 23 (19U 54)
+7 14637,17526,69 0 161079 -- MSL 24 (19U 55)
+8 14637,17700,375 0 161080 -- MSL 25 (19U 56)
+9 14637,17700,375 0 161081 -- MSL 26 (19U 57)
+: 7317,12057,375 0 161082 -- MSL 27 (19U 58)
+; 7317,12057,4902 0 161083 -- MSL 28 (19U 59)
+< 26346,16068 0 161084 -- MSL 29 (19U 60)
+= 23418,9639 0 161085 -- MSL 30 (19U 61)
+> 26346,16068 0 161086 -- MSL 31 (19U 62)
+? 11709,18000,375 2 161087 -- MSL 32 (19U 63)
+at 23418,16950,4131 0 161088 -- MSL 33 (19U 64)
+@ "
+A 17565,18069,69 2 161089 -- MSL 34 (19U 65)
+B 16101,18069,69 2 161090 -- MSL 35 (19U 66)
+C 17565,18375,375 2 161091 -- MSL 36 (19U 67)
+D 20490,18201,201 2 161092 -- MSL 37 (19U 68)
+E 13173,18201,201 2 161093 -- MSL 38 (19U 69)
+F 13173,18201,69 2 161094 -- MSL 39 (19U 70)
+G 20490,18375,375 2 161095 -- MSL 40 (19U 71)
+H 20490,18069,69 2 161096 -- MSL 41 (19U 72)
+I 8781,18069,69 2 161097 -- MSL 42 (19U 73)
+J 8781,18069,4218 2 161098 -- MSL 43 (19U 74)
+K 16587,18069,69 2 161099 -- MSL 44 (19U 75)
+L 13173,18069,201 2 161100 -- MSL 45 (19U 76)
+M 23418,18069,69 2 161101 -- MSL 46 (19U 77)
+N 20490,18069,69 2 161102 -- MSL 47 (19U 78)
+O 21954,18375,375 2 161103 -- MSL 48 (19U 79)
+P 15126,18069,69 2 161104 -- MSL 49 (19U 80)
+Q 21954,18375,5223 3 161105 -- MSL 50 (19U 81)
+R 16101,18069,69 2 161106 -- MSL 51 (19U 82)
+S 13173,18375,375 2 161107 -- MSL 52 (19U 83)
+T 14637,18201,69 2 161108 -- MSL 53 (19U 84)
+U 20490,18069,375 2 161109 -- MSL 54 (19U 85)
+V 17565,18069,69 2 161110 -- MSL 55 (19U 86)
+W 26346,18069,69 2 161111 -- MSL 56 (19U 87)
+X 16101,18069,69 2 161112 -- MSL 57 (19U 88)
+Y 16101,18069,69 2 161113 -- MSL 58 (19U 89)
+Z 16101,18201,201 2 161114 -- MSL 59 (19U 90)
+lB 7317,18201,4701 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 7317,19650,525 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 7317,18201,4701 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588 1 161119 -- MSL 64 (19U 95)
+oq 7317,18375 2 161169 -- MSL 66 (19U 145)
+` "
+a 13173,12840,375 0 161121 -- MSL 67 (19U 97)
+b 14637,19569,375 2 161122 -- MSL 68 (19U 98)
+c 13173,12840,375 0 161123 -- MSL 69 (19U 99)
+d 14637,19569,375 2 161124 -- MSL 70 (19U 100)
+e 13173,12840,375 0 161125 -- MSL 71 (19U 101)
+f 8781,19710,69 2 161126 -- MSL 72 (19U 102)
+g 13173,12840,5400 1 161127 -- MSL 73 (19U 103)
+h 14637,19569,69 2 161128 -- MSL 74 (19U 104)
+i 7317,19332,69 2 161129 -- MSL 75 (19U 105)
+j 7317,19332,5400 3 161130 -- MSL 76 (19U 106)
+k 13173,19569,69 2 161131 -- MSL 77 (19U 107)
+l 7317,19569,69 2 161132 -- MSL 78 (19U 108)
+m 21954,12900,69 0 161133 -- MSL 79 (19U 109)
+n 14637,12840,69 0 161134 -- MSL 80 (19U 110)
+o 14637,12840,375 0 161135 -- MSL 81 (19U 111)
+p 14637,12840,5469 1 161136 -- MSL 82 (19U 112)
+q 14637,12840,5469 1 161137 -- MSL 83 (19U 113)
+r 10245,12780,69 0 161138 -- MSL 84 (19U 114)
+s 10245,12840,375 0 161139 -- MSL 85 (19U 115)
+t 8781,17100,375 0 161140 -- MSL 86 (19U 116)
+u 14637,12534,375 0 161141 -- MSL 87 (19U 117)
+v 13173,12534,69 0 161142 -- MSL 88 (19U 118)
+w 20490,12534,69 0 161143 -- MSL 89 (19U 119)
+x 13173,12534,69 0 161144 -- MSL 90 (19U 120)
+y 13173,12534,5439 1 161145 -- MSL 91 (19U 121)
+z 13173,12666,201 0 161146 -- MSL 92 (19U 122)
+{ 13173,19935,6210 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588 3 161148 -- MSL 94 (19U 124)
+ba "
+} 13173,19935,6210 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,9435 0 161150 -- MSL 96 (19U 126)
+`A 17565,24537,69 2 161216 -- MSL 99 (19U 192)
+^A 17565,24273,69 2 161218 -- MSL 100 (19U 194)
+`E 13173,24537,201 2 161224 -- MSL 101 (19U 200)
+^E 13173,24273,201 2 161226 -- MSL 102 (19U 202)
+:E 13173,23301,201 2 161227 -- MSL 103 (19U 203)
+^I 8781,24273,69 2 161230 -- MSL 104 (19U 206)
+:I 8781,23301,69 2 161231 -- MSL 105 (19U 207)
+aa 14637,18843 2 161204 -- MSL 106 (19U 180)
+ga 14637,18843 2 161120 -- MSL 107 (19U 96)
+a^ 14637,18738 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 14637,17694 0 161192 -- MSL 109 (19U 168)
+~ 14637,17694 0 161176 -- MSL 110 (19U 152)
+a~ "
+`U 20490,24537,375 2 161241 -- MSL 111 (19U 217)
+^U 20490,24273,375 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105 2 161199 -- MSL 113 (19U 175)
+'Y 16101,24537,69 2 161245 -- MSL 114 (19U 221)
+'y 13173,18843,5439 3 161277 -- MSL 115 (19U 253)
+de 14637,17700 0 161200 -- MSL 116 (19U 176)
+,C 17565,18375,6663 3 161223 -- MSL 117 (19U 199)
+,c 13173,12840,5469 1 161255 -- MSL 118 (19U 231)
+~N 20490,23031,69 2 161233 -- MSL 119 (19U 209)
+~n 14637,17694,69 0 161265 -- MSL 120 (19U 241)
+r! 7317,12906,5469 1 161185 -- MSL 121 (19U 161)
+r? 11709,12906,5469 1 161215 -- MSL 122 (19U 191)
+Cs 14637,15834 0 161188 -- MSL 123 (19U 164)
+Po 14637,17700,201 0 161187 -- MSL 124 (19U 163)
+Ye 14637,17769,69 2 161189 -- MSL 125 (19U 165)
+sc 14637,18000,1383 2 161191 -- MSL 126 (19U 167)
+Fn 14637,19710,69 2 161155 -- MSL 127 (19U 131)
+ct 14637,19788,135 2 161186 -- MSL 128 (19U 162)
+^a 13173,18738,375 2 161250 -- MSL 129 (19U 226)
+^e 13173,18738,375 2 161258 -- MSL 130 (19U 234)
+^o 14637,18738,375 2 161268 -- MSL 131 (19U 244)
+^u 14637,18738,375 2 161275 -- MSL 132 (19U 251)
+'a 13173,18843,375 2 161249 -- MSL 133 (19U 225)
+'e 13173,18843,375 2 161257 -- MSL 134 (19U 233)
+'o 14637,18843,375 2 161267 -- MSL 135 (19U 243)
+'u 14637,18843,375 2 161274 -- MSL 136 (19U 250)
+`a 13173,18843,375 2 161248 -- MSL 137 (19U 224)
+`e 13173,18843,375 2 161256 -- MSL 138 (19U 232)
+`o 14637,18843,375 2 161266 -- MSL 139 (19U 242)
+`u 14637,18843,375 2 161273 -- MSL 140 (19U 249)
+:a 13173,17694,375 0 161252 -- MSL 141 (19U 228)
+:e 13173,17694,375 0 161259 -- MSL 142 (19U 235)
+:o 14637,17694,375 0 161270 -- MSL 143 (19U 246)
+:u 14637,17694,375 0 161276 -- MSL 144 (19U 252)
+oA 17565,25002,69 2 161221 -- MSL 145 (19U 197)
+^i 7317,18738,69 2 161262 -- MSL 146 (19U 238)
+/O 21954,18375,375 2 161240 -- MSL 147 (19U 216)
+AE 22932,18201,201 2 161222 -- MSL 148 (19U 198)
+oa 13173,18684,375 2 161253 -- MSL 149 (19U 229)
+'i 7317,18843,69 2 161261 -- MSL 150 (19U 237)
+/o 14637,12849,402 0 161272 -- MSL 151 (19U 248)
+ae 20004,12840,375 0 161254 -- MSL 152 (19U 230)
+:A 17565,23301,69 2 161220 -- MSL 153 (19U 196)
+`i 7317,18843,69 2 161260 -- MSL 154 (19U 236)
+:O 21954,23301,375 2 161238 -- MSL 155 (19U 214)
+:U 20490,23301,375 2 161244 -- MSL 156 (19U 220)
+'E 13173,24537,201 2 161225 -- MSL 157 (19U 201)
+:i 7317,17694,69 0 161263 -- MSL 158 (19U 239)
+ss 14637,19710,375 2 161247 -- MSL 159 (19U 223)
+^O 21954,24273,375 2 161236 -- MSL 160 (19U 212)
+'A 17565,24537,69 2 161217 -- MSL 161 (19U 193)
+~A 17565,23031,69 2 161219 -- MSL 162 (19U 195)
+~a 13173,17694,375 0 161251 -- MSL 163 (19U 227)
+-D 20490,18201,201 2 161232 -- MSL 164 (19U 208)
+Sd 14637,19503,375 2 161264 -- MSL 165 (19U 240)
+'I 8781,24537,69 2 161229 -- MSL 166 (19U 205)
+`I 8781,24537,69 2 161228 -- MSL 167 (19U 204)
+'O 21954,24537,375 2 161235 -- MSL 168 (19U 211)
+`O 21954,24537,375 2 161234 -- MSL 169 (19U 210)
+~O 21954,23031,375 2 161237 -- MSL 170 (19U 213)
+~o 14637,17694,375 0 161269 -- MSL 171 (19U 245)
+vS 13173,24273,375 2 161162 -- MSL 172 (19U 138)
+vs 10245,18738,375 2 161178 -- MSL 173 (19U 154)
+'U 20490,24537,375 2 161242 -- MSL 174 (19U 218)
+:Y 16101,23301,69 2 161183 -- MSL 175 (19U 159)
+:y 13173,17694,5439 1 161279 -- MSL 176 (19U 255)
+TP 15126,18069,69 2 161246 -- MSL 177 (19U 222)
+Tp 14637,19569,5469 3 161278 -- MSL 178 (19U 254)
+mc 15612,12630,4680 0 161205 -- MSL 180 (19U 181)
+ps 14637,19635,4200 2 161206 -- MSL 181 (19U 182)
+34 23418,17700,444 0 161214 -- MSL 182 (19U 190)
+\- 23418,7455 0 60096 -- MSL 183 ( 7J 192)
+14 23418,18099,444 2 161212 -- MSL 184 (19U 188)
+12 23418,18099,444 2 161213 -- MSL 185 (19U 189)
+Of 9759,17700 0 161194 -- MSL 186 (19U 170)
+Om 9759,17700 0 161210 -- MSL 187 (19U 186)
+Fo 11709,11028 0 161195 -- MSL 188 (19U 171)
+Fc 11709,11028 0 161211 -- MSL 190 (19U 187)
+t+- 23418,13164,4314 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916 3 161190 -- MSL 192 (19U 166)
+co 13173,19635 2 161193 -- MSL 193 (19U 169)
+tno 23418,10770 0 161196 -- MSL 194 (19U 172)
+u00AD 7317,8307 0 161197 -- MSL 195 (19U 173)
+rg 13173,19635 2 161198 -- MSL 196 (19U 174)
+S2 9759,17700 0 161202 -- MSL 197 (19U 178)
+S3 9759,17700 0 161203 -- MSL 198 (19U 179)
+ac 14637,0,5469 1 161208 -- MSL 199 (19U 184)
+S1 9759,18099 2 161209 -- MSL 200 (19U 185)
+tmu 23418,13107,567 0 161239 -- MSL 201 (19U 215)
+tdi 23418,13017,387 0 161271 -- MSL 202 (19U 247)
+u203C 14637,18000,375 2 87315 -- MSL 221 (10U 19)
+u20A7 23907,18069,375 2 60121 -- MSL 232 ( 7J 217)
+pc 7317,11274 0 161207 -- MSL 302 (19U 183)
+u013F 13173,18069,201 2 51943 -- MSL 306 ( 6J 231)
+u0140 10245,19569,69 2 51959 -- MSL 307 ( 6J 247)
+u2113 14637,18045,765 2 60122 -- MSL 308 ( 7J 218)
+u0149 20979,18375,69 2 51951 -- MSL 309 ( 6J 239)
+fm 7317,18096 2 60101 -- MSL 310 ( 7J 197)
+sd 14637,18096 2 60102 -- MSL 311 ( 7J 198)
+dg 14637,18201,426 2 161158 -- MSL 312 (19U 134)
+tm 16101,17850 2 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588 1 60095 -- MSL 314 ( 7J 191)
+ah 14637,18738 2 75169 -- MSL 315 ( 9E 161)
+ao 14637,18684 2 60152 -- MSL 316 ( 7J 248)
+f/ 2928,17544,444 0 60109 -- MSL 324 ( 7J 205)
+em 23418,8085 0 161175 -- MSL 325 (19U 151)
+en 14637,8085 0 161174 -- MSL 326 (19U 150)
+dd 14637,18201,426 2 161159 -- MSL 327 (19U 135)
+.i 7317,12534,69 0 46333 -- MSL 328 ( 5T 253)
+aq 7317,18375 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226 0 161173 -- MSL 331 (19U 149)
+u207F 9759,17700 0 87548 -- MSL 332 (10U 252)
+u0111 14637,19569,375 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 17565,23988,69 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 13173,18525,375 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 17565,18069,4134 2 75173 -- MSL 404 ( 9E 165)
+u0061_0328 13173,12840,3774 0 75193 -- MSL 405 ( 9E 185)
+'C 17565,24537,375 2 75206 -- MSL 406 ( 9E 198)
+'c 13173,18843,375 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 17565,24273,375 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 13173,18738,375 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 20490,24273,201 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 18051,19710,375 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 13173,24273,201 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 13173,18738,375 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 13173,18201,4134 2 75210 -- MSL 422 ( 9E 202)
+u0065_0328 13173,12840,3774 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 13173,24537,201 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 7317,25578,69 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 13173,18516,201 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 10245,19710,69 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 20490,24537,69 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 14637,18843,69 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 20490,24273,69 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 14637,18738,69 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 21954,24537,375 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 14637,18843,375 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 16101,24537,69 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 10245,18843,69 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 16101,24273,69 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 10245,18738,69 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 13173,24537,375 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 10245,18843,375 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 14637,24273,69 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 10245,19710,375 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 14637,18201,6663 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 8781,17100,5469 1 75262 -- MSL 469 ( 9E 254)
+u0055_030B 20490,24537,375 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 14637,18843,375 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 20490,25002,375 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 14637,18684,375 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 16101,24537,201 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 13173,18843,201 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 16101,24342,201 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 13173,18792,201 2 75199 -- MSL 485 ( 9E 191)
+u2070 9759,17700 0 51753 -- MSL 1000 ( 6J 41)
+u2074 9759,17544 0 51748 -- MSL 1001 ( 6J 36)
+u2075 9759,17676 0 51749 -- MSL 1002 ( 6J 37)
+u2076 9759,17700 0 51806 -- MSL 1003 ( 6J 94)
+u2077 9759,17676 0 51750 -- MSL 1004 ( 6J 38)
+u2078 9759,17700 0 51754 -- MSL 1005 ( 6J 42)
+u2079 9759,17700 0 51752 -- MSL 1006 ( 6J 40)
+lq 12198,18330 2 161171 -- MSL 1017 (19U 147)
+rq 12198,18375 2 161172 -- MSL 1018 (19U 148)
+Bq 12198,4095,4371 0 161156 -- MSL 1019 (19U 132)
+u2003 23418,0 0 51821 -- MSL 1020 ( 6J 109)
+u2002 14637,0 0 51822 -- MSL 1021 ( 6J 110)
+u2009 7317,0 0 51828 -- MSL 1023 ( 6J 116)
+u2026 23418,3729 0 161157 -- MSL 1028 (19U 133)
+vz 13173,18738,201 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,18000 2 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056 2 51794 -- MSL 1036 ( 6J 82)
+fi 15126,19710,69 2 60077 -- MSL 1040 ( 7J 173)
+fl 15126,19710,69 2 60078 -- MSL 1041 ( 7J 174)
+ff 16587,19710,69 2 51883 -- MSL 1042 ( 6J 171)
+Fi 22932,19710,69 2 51884 -- MSL 1043 ( 6J 172)
+Fl 22932,19710,69 2 51885 -- MSL 1044 ( 6J 173)
+ij 14637,19332,5400 3 60134 -- MSL 1047 ( 7J 230)
+u2105 25371,19656,300 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 20490,23988,375 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 13173,18525,5400 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 13173,18375,6663 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 10245,12840,5469 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 8781,24342,69 2 46301 -- MSL 1065 ( 5T 221)
+bq 7317,4095,4371 0 161154 -- MSL 1067 (19U 130)
+%0 33177,17769,444 2 161161 -- MSL 1068 (19U 137)
+a- 14637,16722 0 60154 -- MSL 1084 ( 7J 250)
+ab 14637,18525 2 75170 -- MSL 1086 ( 9E 162)
+a. 14637,18792 2 75263 -- MSL 1088 ( 9E 255)
+oe 22443,12840,375 0 161180 -- MSL 1090 (19U 156)
+OE 24882,18375,375 2 161164 -- MSL 1091 (19U 140)
+fo 7317,11028 0 161163 -- MSL 1092 (19U 139)
+fc 7317,11028 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624 0 60091 -- MSL 1094 ( 7J 187)
+/L 13173,18069,201 2 75171 -- MSL 1095 ( 9E 163)
+/l 7317,19569,69 2 75187 -- MSL 1096 ( 9E 179)
+a" 14637,18843 2 75197 -- MSL 1097 ( 9E 189)
+ho 14637,654,3774 0 75186 -- MSL 1098 ( 9E 178)
+vZ 16101,24273,201 2 75150 -- MSL 1106 ( 9E 142)
+IJ 17565,18069,4218 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/OBI b/font/devlj4/OBI
new file mode 100644
index 0000000..be1fa3d
--- /dev/null
+++ b/font/devlj4/OBI
@@ -0,0 +1,776 @@
+# CG Omega BdIt
+name OBI
+spacewidth 7317
+slant 12.350000
+pcltypeface 4113
+pclproportional 1
+pclweight 3
+pclstyle 1
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -2438
+P . -3902
+P , -3902
+V A -3902
+A V -4388
+T o -2438
+T r -2438
+T c -2438
+T e -2438
+T d -2438
+T s -2438
+T y -2438
+T a -2438
+T w -2438
+T u -2438
+L T -2438
+L Y -2438
+Y o -3902
+Y e -3413
+Y a -3902
+A W -3902
+W A -3413
+T A -2438
+V o -2924
+V e -2438
+V a -2924
+Y A -3902
+F A -1460
+F . -3902
+F , -3902
+A T -2924
+A Y -4388
+v . -2924
+v , -2924
+y . -2924
+y , -2924
+T . -2438
+T , -2438
+L W -2438
+P A -1949
+V . -3902
+V , -3902
+Y . -3902
+Y , -3902
+W o -2438
+W e -1949
+W a -2438
+W . -3413
+W , -3413
+r . -2438
+r , -2438
+w . -2924
+w , -2924
+Y u -2438
+A v -2924
+A y -2924
+A w -2924
+o . -974
+o , -974
+p . -974
+p , -974
+e . -485
+e , -485
+b . -974
+b , -974
+O T -2438
+O V -1949
+O Y -2438
+O . -1949
+O , -1949
+L y -2438
+L O -2438
+L G -2438
+L C -2438
+L Q -2438
+V y -1460
+V u -1460
+V O -1460
+V G -1460
+V C -1460
+V Q -1460
+D T -2438
+D V -1949
+D Y -2438
+D . -1949
+D , -1949
+Y O -1949
+Y G -1949
+Y C -1949
+Y Q -1949
+F o -485
+F e -485
+F a -485
+c . -485
+c , -485
+O A -974
+O W -1460
+L U -2438
+R T -485
+R V -485
+R Y -485
+R W -485
+G T -974
+P o -974
+P g -974
+P e -974
+P a -974
+C A -485
+C . -485
+C , -485
+D A -974
+D W -1460
+B T -1949
+B Y -1949
+B . -1460
+B , -1460
+A O -1949
+A G -1949
+A C -1949
+A U -1949
+A Q -1949
+W r -974
+W y -974
+W u -974
+W O -974
+W G -974
+W C -974
+W Q -974
+J A -974
+J . -974
+J , -974
+U A -974
+U . -1949
+U , -1949
+Q W -1460
+f . -485
+f , -485
+T O -1949
+T G -1949
+T C -1949
+T Q -1949
+O X -1460
+L o -1949
+L e -1460
+L q -1949
+G V -974
+G Y -974
+G W -974
+G . -485
+G , -485
+P T -974
+P V -974
+P Y -974
+C T -485
+C V -485
+C Y -485
+D X -1460
+B V -1949
+B X -1460
+B A -974
+B W -1460
+S . -485
+S , -485
+X o -1460
+X e -1460
+X y -1460
+X O -1460
+X G -1460
+X C -1460
+X Q -1460
+A o -1949
+A e -1460
+K o -1460
+K e -1460
+K y -1460
+K w -1460
+K O -1460
+K G -1460
+K C -1460
+K Q -1460
+o v -974
+o y -974
+o x -485
+o w -974
+h v -974
+h y -974
+n v -974
+n y -974
+p v -485
+p y -485
+p x -485
+c v -485
+c y -485
+c w -485
+v o -485
+v g -485
+v c -485
+v d -485
+v a -485
+v q -485
+e v -974
+e y -974
+b v -974
+b y -974
+b w -974
+s . -485
+s , -485
+y o -485
+y g -485
+y c -485
+y d -485
+y a -485
+y q -485
+f g -485
+x o -485
+x g -485
+x c -485
+x e -485
+x d -485
+x a -485
+x q -485
+a v -974
+a y -974
+a w -974
+w o -485
+w g -485
+w c -485
+w d -485
+w a -485
+w q -485
+T i -485
+T S -485
+L a -974
+L S -974
+R o -974
+R y -485
+R O -485
+R G -485
+R C -485
+R U -485
+R Q -485
+G X -485
+G A -485
+P s -974
+P Z -974
+P X -974
+P W -974
+C X -485
+C W -485
+V i -485
+V S -485
+S T -974
+S V -974
+S Y -974
+S X -485
+S A -485
+S W -974
+Y i -485
+Y S -485
+X a -974
+X u -974
+X S -485
+A t -974
+A g -974
+A c -1460
+A d -1949
+A a -974
+A u -974
+A q -1949
+A S -974
+W i -485
+W S -485
+K c -1460
+K u -974
+K S -974
+o f -485
+h w -974
+n w -974
+p f -485
+p w -485
+c f -485
+c x -485
+v e -485
+v s -485
+e f -485
+e x -485
+e w -974
+b f -485
+y e -485
+y s -485
+f o -485
+f c -485
+f e -485
+f d -485
+f s -485
+f a -485
+f q -485
+w e -485
+w s -485
+k o -485
+k g -485
+k c -485
+k v -485
+k e -485
+k d -485
+k y -485
+k a -485
+k w -485
+k q -485
+O Z -485
+R e -974
+R a -974
+R u -485
+R S -485
+G Z -485
+C Z -485
+Z o -974
+Z e -974
+Z d -974
+Z y -485
+Z a -974
+Z w -485
+Z u -485
+Z O -485
+Z G -485
+Z C -485
+Z S -485
+Z Q -485
+D Z -485
+B Z -485
+S Z -485
+J o -485
+J e -485
+J a -485
+K a -974
+o z -485
+h f -485
+n f -485
+p z -485
+c z -485
+e z -485
+z o -485
+z g -485
+z c -485
+z e -485
+z d -485
+z a -485
+z q -485
+b z -485
+a f -485
+k t -485
+k f -485
+k u -485
+A f -485
+K T -485
+K V -485
+K Y -485
+K W -485
+K U -485
+L cq -2438
+L ' -2438
+T hy -2438
+T - -2438
+T en -2438
+T em -2438
+A cq -3413
+A ' -3413
+hy T -2924
+- T -2924
+en T -2924
+em T -2924
+Y hy -2438
+Y - -2438
+Y en -2438
+Y em -2438
+p cq -485
+p ' -485
+c cq -485
+c ' -485
+e cq -1460
+e ' -1460
+b cq -1949
+b ' -1949
+a cq -974
+a ' -974
+V hy -1460
+V - -1460
+V en -1460
+V em -1460
+h cq -1460
+h ' -1460
+n cq -1460
+n ' -1460
+R cq -485
+R ' -485
+W hy -974
+W - -974
+W en -974
+W em -974
+cq d -1460
+' d -1460
+L hy -1949
+L - -1949
+L en -1949
+L em -1949
+X hy -1460
+X - -1460
+X en -1460
+X em -1460
+A hy -1949
+A - -1949
+A en -1949
+A em -1949
+K hy -1460
+K - -1460
+K en -1460
+K em -1460
+cq s -974
+' s -974
+hy X -1460
+- X -1460
+hy A -974
+- A -974
+en X -1460
+en A -974
+em X -1460
+R hy -485
+R - -485
+R en -485
+R em -485
+K cq -485
+K ' -485
+b f -485
+k cq -485
+k ' -485
+Z hy -485
+Z - -485
+Z en -485
+Z em -485
+k hy -485
+k - -485
+k en -485
+k em -485
+charset
+! 7317,18000,375,1944,753,737 2 161057 -- MSL 1 (19U 33)
+dq 12198,18375,0,1623,-2621,737 2 161058 -- MSL 2 (19U 34)
+" "
+sh 14637,18069,444,1440,228,737 2 161059 -- MSL 3 (19U 35)
+# "
+Do 14637,19839,3099,1341,702,737 2 161060 -- MSL 4 (19U 36)
+$ "
+% 23418,17769,264,0,-2066 0 161061 -- MSL 5 (19U 37)
+& 19029,18000,375,237,198,237 2 161062 -- MSL 6 (19U 38)
+cq 7317,18375,0,2511,-530,737 2 161170 -- MSL 8 (19U 146)
+' "
+( 7317,18375,3165,3450,135,737 2 161064 -- MSL 9 (19U 40)
+) 7317,18375,3165,1164,2421,737 2 161065 -- MSL 10 (19U 41)
+* 14637,18150,0,63,-2363,63 2 161066 -- MSL 11 (19U 42)
++ 23418,13164,534,0,-3527 0 161067 -- MSL 12 (19U 43)
+, 7317,3966,5040,0,3423 1 161068 -- MSL 13 (19U 44)
+hy 7317,8715,0,1497,1071,737 0 161069 -- MSL 14 (19U 45)
+- "
+. 7317,3849,375,0,627 0 161070 -- MSL 15 (19U 46)
+sl 7317,19575,450,4377,2736,737 2 161071 -- MSL 16 (19U 47)
+/ "
+0 14637,17700,375,933,-158,737 0 161072 -- MSL 17 (19U 48)
+1 14637,17700,69,0,-2429 0 161073 -- MSL 18 (19U 49)
+2 14637,17700,201,921,858,737 0 161074 -- MSL 19 (19U 50)
+3 14637,17700,375,372,819,372 0 161075 -- MSL 20 (19U 51)
+4 14637,17394,69,1008,684,737 0 161076 -- MSL 21 (19U 52)
+5 14637,17526,375,1362,669,737 0 161077 -- MSL 22 (19U 53)
+6 14637,17700,375,399,-581,399 0 161078 -- MSL 23 (19U 54)
+7 14637,17526,69,2931,-122,737 0 161079 -- MSL 24 (19U 55)
+8 14637,17700,375,1155,174,737 0 161080 -- MSL 25 (19U 56)
+9 14637,17700,375,843,-404,737 0 161081 -- MSL 26 (19U 57)
+: 7317,11754,375,759,627,737 0 161082 -- MSL 27 (19U 58)
+; 7317,11754,5040,759,3423,737 1 161083 -- MSL 28 (19U 59)
+< 26346,16068,0,0,-3980 0 161084 -- MSL 29 (19U 60)
+= 23418,9624,0,0,-4067 0 161085 -- MSL 30 (19U 61)
+> 26346,16068,0,0,-3980 0 161086 -- MSL 31 (19U 62)
+? 11709,18000,375,900,-1322,737 2 161087 -- MSL 32 (19U 63)
+at 23418,16950,4131,966,348,737 0 161088 -- MSL 33 (19U 64)
+@ "
+A 17565,18069,69,0,2586 2 161089 -- MSL 34 (19U 65)
+B 16101,18069,69,864,306,737 2 161090 -- MSL 35 (19U 66)
+C 17565,18375,375,2640,-599,737 2 161091 -- MSL 36 (19U 67)
+D 20490,18069,69,720,279,720 2 161092 -- MSL 37 (19U 68)
+E 13173,18201,201,2835,738,737 2 161093 -- MSL 38 (19U 69)
+F 13173,18201,69,3051,612,737 2 161094 -- MSL 39 (19U 70)
+G 20490,18375,375,1230,-797,737 2 161095 -- MSL 40 (19U 71)
+H 20490,18069,69,1671,417,737 2 161096 -- MSL 41 (19U 72)
+I 8781,18069,69,1779,441,737 2 161097 -- MSL 42 (19U 73)
+J 8781,18069,4242,1551,2634,737 2 161098 -- MSL 43 (19U 74)
+K 16101,18069,69,3528,366,737 2 161099 -- MSL 44 (19U 75)
+L 13173,18069,201,201,168,201 2 161100 -- MSL 45 (19U 76)
+M 23418,18069,414,1542,768,737 2 161101 -- MSL 46 (19U 77)
+N 20490,18069,69,1383,192,737 2 161102 -- MSL 47 (19U 78)
+O 21954,18375,375,942,-446,737 2 161103 -- MSL 48 (19U 79)
+P 14637,18069,69,2064,519,737 2 161104 -- MSL 49 (19U 80)
+Q 21954,18375,4200,1008,-395,737 2 161105 -- MSL 50 (19U 81)
+R 16101,18069,69,900,387,737 2 161106 -- MSL 51 (19U 82)
+S 13173,18375,375,1626,879,737 2 161107 -- MSL 52 (19U 83)
+T 14637,18201,69,3006,-1070,737 2 161108 -- MSL 53 (19U 84)
+U 20490,18069,375,1671,-1070,737 2 161109 -- MSL 54 (19U 85)
+V 17565,18069,69,3372,-1445,737 2 161110 -- MSL 55 (19U 86)
+W 24882,18069,69,3120,-1604,737 2 161111 -- MSL 56 (19U 87)
+X 16101,18069,69,2451,1470,737 2 161112 -- MSL 57 (19U 88)
+Y 16101,18069,69,3747,-1418,737 2 161113 -- MSL 58 (19U 89)
+Z 16101,18201,201,2589,2115,737 2 161114 -- MSL 59 (19U 90)
+lB 7317,18249,4749,3699,2235,737 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 7317,19575,450,0,-1610 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 7317,18249,4749,3696,2238,737 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758,0,36,36,36 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588,1317,1317,737 1 161119 -- MSL 64 (19U 95)
+oq 7317,18375,0,2508,-527,737 2 161169 -- MSL 66 (19U 145)
+` "
+a 13173,12840,375,189,954,189 0 161121 -- MSL 67 (19U 97)
+b 14637,19779,375,666,1191,666 2 161122 -- MSL 68 (19U 98)
+c 12684,12840,375,2118,171,737 0 161123 -- MSL 69 (19U 99)
+d 14637,19569,375,2727,594,737 2 161124 -- MSL 70 (19U 100)
+e 13173,12840,375,750,480,737 0 161125 -- MSL 71 (19U 101)
+f 8781,19710,69,3357,996,737 2 161126 -- MSL 72 (19U 102)
+g 13173,12840,5400,1836,1659,737 1 161127 -- MSL 73 (19U 103)
+h 14637,19569,69,423,1242,423 2 161128 -- MSL 74 (19U 104)
+i 7317,19308,69,1794,1131,737 2 161129 -- MSL 75 (19U 105)
+j 7317,19308,5400,1797,3720,737 3 161130 -- MSL 76 (19U 106)
+k 13173,19569,69,2670,1353,737 2 161131 -- MSL 77 (19U 107)
+l 7317,19569,69,2586,1086,737 2 161132 -- MSL 78 (19U 108)
+m 21954,12840,69,375,1272,375 0 161133 -- MSL 79 (19U 109)
+n 14637,12840,69,438,1206,438 0 161134 -- MSL 80 (19U 110)
+o 14637,12840,375,708,618,708 0 161135 -- MSL 81 (19U 111)
+p 14637,12840,5469,663,2349,663 1 161136 -- MSL 82 (19U 112)
+q 14637,12840,5469,1281,558,737 1 161137 -- MSL 83 (19U 113)
+r 10245,12840,69,1326,1107,737 0 161138 -- MSL 84 (19U 114)
+s 10245,12840,375,1188,1230,737 0 161139 -- MSL 85 (19U 115)
+t 8781,17055,375,2148,-188,737 0 161140 -- MSL 86 (19U 116)
+u 14637,12534,375,1230,417,737 0 161141 -- MSL 87 (19U 117)
+v 13173,12534,69,2223,-767,737 0 161142 -- MSL 88 (19U 118)
+w 20490,12534,69,2229,-953,737 0 161143 -- MSL 89 (19U 119)
+x 13173,12534,69,1647,2190,737 0 161144 -- MSL 90 (19U 120)
+y 13173,12534,5469,2040,1176,737 1 161145 -- MSL 91 (19U 121)
+z 13173,12666,201,1464,1689,737 0 161146 -- MSL 92 (19U 122)
+{ 13173,19935,6210,3339,-971,737 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588,0,-4595 3 161148 -- MSL 94 (19U 124)
+ba "
+} 13173,19935,6210,63,2304,63 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,9435,0,0,-4028 0 161150 -- MSL 96 (19U 126)
+`A 17565,24342,69,0,2586 2 161216 -- MSL 99 (19U 192)
+^A 17565,24321,69,0,2586 2 161218 -- MSL 100 (19U 194)
+`E 13173,24342,201,2835,738,737 2 161224 -- MSL 101 (19U 200)
+^E 13173,24321,201,2835,738,737 2 161226 -- MSL 102 (19U 202)
+:E 13173,23610,201,3084,738,737 2 161227 -- MSL 103 (19U 203)
+^I 8781,24321,69,4296,441,737 2 161230 -- MSL 104 (19U 206)
+:I 8781,23610,69,5280,441,737 2 161231 -- MSL 105 (19U 207)
+aa 14637,18801,0,297,-5762,297 2 161204 -- MSL 106 (19U 180)
+ga 14637,18801,0,0,-4418 2 161120 -- MSL 107 (19U 96)
+a^ 14637,18780,0,0,-3455 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 14637,18090,0,429,-4022,429 2 161192 -- MSL 109 (19U 168)
+~ 14637,17847,0,1308,-3437,737 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 20490,24342,375,1671,-1070,737 2 161241 -- MSL 111 (19U 217)
+^U 20490,24321,375,1671,-1070,737 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105,0,1317,1317,737 2 161199 -- MSL 113 (19U 175)
+'Y 16101,24342,69,3747,-1418,737 2 161245 -- MSL 114 (19U 221)
+'y 13173,18801,5469,2040,1176,737 3 161277 -- MSL 115 (19U 253)
+de 14637,17700,0,0,-2585 0 161200 -- MSL 116 (19U 176)
+,C 17565,18375,5988,2640,-599,737 3 161223 -- MSL 117 (19U 199)
+,c 12684,12840,5733,2118,171,737 1 161255 -- MSL 118 (19U 231)
+~N 20490,23382,69,1383,192,737 2 161233 -- MSL 119 (19U 209)
+~n 14637,17847,69,1308,1206,737 2 161265 -- MSL 120 (19U 241)
+r! 7317,12906,5469,861,1836,737 1 161185 -- MSL 121 (19U 161)
+r? 11709,12906,5469,0,90 1 161215 -- MSL 122 (19U 191)
+Cs 14637,15834,0,1452,477,737 0 161188 -- MSL 123 (19U 164)
+Po 14637,17700,201,1260,1419,737 0 161187 -- MSL 124 (19U 163)
+Ye 14637,18069,69,4212,-131,737 2 161189 -- MSL 125 (19U 165)
+sc 14637,18375,1383,0,-932 2 161191 -- MSL 126 (19U 167)
+Fn 14637,19710,69,366,-1862,366 2 161155 -- MSL 127 (19U 131)
+ct 14637,19812,342,2082,-1151,737 2 161186 -- MSL 128 (19U 162)
+^a 13173,18780,375,711,954,711 2 161250 -- MSL 129 (19U 226)
+^e 13173,18780,375,750,480,737 2 161258 -- MSL 130 (19U 234)
+^o 14637,18780,375,708,618,708 2 161268 -- MSL 131 (19U 244)
+^u 14637,18780,375,1230,417,737 2 161275 -- MSL 132 (19U 251)
+'a 13173,18801,375,1029,954,737 2 161249 -- MSL 133 (19U 225)
+'e 13173,18801,375,1029,480,737 2 161257 -- MSL 134 (19U 233)
+'o 14637,18801,375,708,618,708 2 161267 -- MSL 135 (19U 243)
+'u 14637,18801,375,1230,417,737 2 161274 -- MSL 136 (19U 250)
+`a 13173,18801,375,189,954,189 2 161248 -- MSL 137 (19U 224)
+`e 13173,18801,375,750,480,737 2 161256 -- MSL 138 (19U 232)
+`o 14637,18801,375,708,618,708 2 161266 -- MSL 139 (19U 242)
+`u 14637,18801,375,1230,417,737 2 161273 -- MSL 140 (19U 249)
+:a 13173,18090,375,1161,954,737 2 161252 -- MSL 141 (19U 228)
+:e 13173,18090,375,1161,480,737 2 161259 -- MSL 142 (19U 235)
+:o 14637,18090,375,708,618,708 2 161270 -- MSL 143 (19U 246)
+:u 14637,18090,375,1230,417,737 2 161276 -- MSL 144 (19U 252)
+oA 17565,25035,69,0,2586 2 161221 -- MSL 145 (19U 197)
+^i 7317,18780,69,3639,1134,737 2 161262 -- MSL 146 (19U 238)
+/O 21954,18375,1017,1311,-311,737 2 161240 -- MSL 147 (19U 216)
+AE 22932,18201,201,2844,2589,737 2 161222 -- MSL 148 (19U 198)
+oa 13173,18678,375,189,954,189 2 161253 -- MSL 149 (19U 229)
+'i 7317,18801,69,3957,1134,737 2 161261 -- MSL 150 (19U 237)
+/o 14637,13446,843,1227,1224,737 0 161272 -- MSL 151 (19U 248)
+ae 20004,12840,375,744,945,737 0 161254 -- MSL 152 (19U 230)
+:A 17565,23610,69,888,2586,737 2 161220 -- MSL 153 (19U 196)
+`i 7317,18801,69,1116,1134,737 2 161260 -- MSL 154 (19U 236)
+:O 21954,23610,375,942,-446,737 2 161238 -- MSL 155 (19U 214)
+:U 20490,23610,375,1671,-1070,737 2 161244 -- MSL 156 (19U 220)
+'E 13173,24342,201,3348,738,737 2 161225 -- MSL 157 (19U 201)
+:i 7317,18090,69,4089,1134,737 2 161263 -- MSL 158 (19U 239)
+ss 14637,19500,375,396,1206,396 2 161247 -- MSL 159 (19U 223)
+^O 21954,24321,375,942,-446,737 2 161236 -- MSL 160 (19U 212)
+'A 17565,24342,69,1152,2586,737 2 161217 -- MSL 161 (19U 193)
+~A 17565,23382,69,1752,2586,737 2 161219 -- MSL 162 (19U 195)
+~a 13173,17847,375,2040,954,737 2 161251 -- MSL 163 (19U 227)
+-D 20490,18069,69,720,318,720 2 161232 -- MSL 164 (19U 208)
+Sd 14637,19674,375,831,618,737 2 161264 -- MSL 165 (19U 240)
+'I 8781,24342,69,5544,441,737 2 161229 -- MSL 166 (19U 205)
+`I 8781,24342,69,1779,441,737 2 161228 -- MSL 167 (19U 204)
+'O 21954,24342,375,942,-446,737 2 161235 -- MSL 168 (19U 211)
+`O 21954,24342,375,942,-446,737 2 161234 -- MSL 169 (19U 210)
+~O 21954,23382,375,942,-446,737 2 161237 -- MSL 170 (19U 213)
+~o 14637,17847,375,1308,618,737 2 161269 -- MSL 171 (19U 245)
+vS 13173,24321,375,3120,879,737 2 161162 -- MSL 172 (19U 138)
+vs 10245,18780,375,3117,1230,737 2 161178 -- MSL 173 (19U 154)
+'U 20490,24342,375,1671,-1070,737 2 161242 -- MSL 174 (19U 218)
+:Y 16101,23610,69,3747,-1418,737 2 161183 -- MSL 175 (19U 159)
+:y 13173,18090,5469,2040,1176,737 3 161279 -- MSL 176 (19U 255)
+TP 14637,18069,69,1347,384,737 2 161246 -- MSL 177 (19U 222)
+Tp 14637,19779,5469,672,2361,672 3 161278 -- MSL 178 (19U 254)
+mc 15612,12630,4680,1422,2907,737 0 161205 -- MSL 180 (19U 181)
+ps 14637,19635,4200,18,-1139,18 2 161206 -- MSL 181 (19U 182)
+34 23418,17769,444,0,-869 0 161214 -- MSL 182 (19U 190)
+\- 23418,7455,0,0,-3527 0 60096 -- MSL 183 ( 7J 192)
+14 23418,17865,444,0,-2132 2 161212 -- MSL 184 (19U 188)
+12 23418,17865,444,0,-1793 2 161213 -- MSL 185 (19U 189)
+Of 9759,17700,0,765,-257,737 0 161194 -- MSL 186 (19U 170)
+Om 9759,17700,0,1815,-80,737 0 161210 -- MSL 187 (19U 186)
+Fo 11220,10851,0,1272,132,737 0 161195 -- MSL 188 (19U 171)
+Fc 11220,10851,0,588,816,588 0 161211 -- MSL 190 (19U 187)
+t+- 23418,13080,4230,0,-3521 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916,0,-4595 3 161190 -- MSL 192 (19U 166)
+co 13173,19635,0,3885,-2093,737 2 161193 -- MSL 193 (19U 169)
+tno 23418,10770,0,0,-3104 0 161196 -- MSL 194 (19U 172)
+u00AD 7317,8715,0,1497,1071,737 0 161197 -- MSL 195 (19U 173)
+rg 13173,19635,0,3885,-2093,737 2 161198 -- MSL 196 (19U 174)
+S2 9270,17700,0,2130,-161,737 0 161202 -- MSL 197 (19U 178)
+S3 9270,17700,0,1656,-122,737 0 161203 -- MSL 198 (19U 179)
+ac 14637,393,5733,0,-1118 1 161208 -- MSL 199 (19U 184)
+S1 9270,17865,0,708,-1469,708 2 161209 -- MSL 200 (19U 185)
+tmu 23418,13107,567,0,-4625 0 161239 -- MSL 201 (19U 215)
+tdi 23418,12999,369,0,-3530 0 161271 -- MSL 202 (19U 247)
+u203C 14637,18000,375,1941,753,737 2 87315 -- MSL 221 (10U 19)
+u20A7 23418,18069,375,2148,519,737 2 60121 -- MSL 232 ( 7J 217)
+pc 7317,10899,0,282,-740,282 0 161207 -- MSL 302 (19U 183)
+u013F 13173,18069,201,2250,168,737 2 51943 -- MSL 306 ( 6J 231)
+u0140 10245,19569,69,2736,1086,737 2 51959 -- MSL 307 ( 6J 247)
+u2113 14637,18045,765,0,-1712 2 60122 -- MSL 308 ( 7J 218)
+u0149 20979,18375,69,438,-530,438 2 51951 -- MSL 309 ( 6J 239)
+fm 7317,18096,0,1629,-2066,737 2 60101 -- MSL 310 ( 7J 197)
+sd 14637,18096,0,0,-2066 2 60102 -- MSL 311 ( 7J 198)
+dg 14637,18201,426,666,-761,666 2 161158 -- MSL 312 (19U 134)
+tm 16101,17850,0,1425,-1961,737 2 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588,1317,1317,737 1 60095 -- MSL 314 ( 7J 191)
+ah 14637,18780,0,921,-4397,737 2 75169 -- MSL 315 ( 9E 161)
+ao 14637,18678,0,0,-5651 2 60152 -- MSL 316 ( 7J 248)
+f/ 2439,17769,444,7344,7137,737 0 60109 -- MSL 324 ( 7J 205)
+em 23418,8070,0,759,219,737 0 161175 -- MSL 325 (19U 151)
+en 14637,8070,0,681,459,681 0 161174 -- MSL 326 (19U 150)
+dd 14637,18201,426,630,-725,630 2 161159 -- MSL 327 (19U 135)
+.i 7317,12534,69,1116,1134,737 0 46333 -- MSL 328 ( 5T 253)
+aq 7317,18375,0,1659,-2621,737 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226,0,0,-497 0 161173 -- MSL 331 (19U 149)
+u207F 13173,17700,0,1335,-275,737 0 87548 -- MSL 332 (10U 252)
+u0111 14637,19569,375,3939,609,737 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 17565,24138,69,225,2586,225 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 13173,18528,375,1128,954,737 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 17565,18069,4161,0,2586 2 75173 -- MSL 404 ( 9E 165)
+u0061_0328 13173,12840,4140,189,954,189 0 75193 -- MSL 405 ( 9E 185)
+'C 17565,24342,375,2640,-599,737 2 75206 -- MSL 406 ( 9E 198)
+'c 12684,18801,375,2415,171,737 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 17565,24321,375,2640,-599,737 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 12684,18780,375,2118,171,737 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 20490,24321,69,720,279,720 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 18051,19710,375,4032,594,737 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 13173,24321,201,3120,738,737 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 13173,18780,375,993,480,737 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 13173,18201,4161,2835,738,737 2 75210 -- MSL 422 ( 9E 202)
+u0065_0328 13173,12840,4140,750,480,737 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 13173,24342,201,1248,168,737 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 7317,25536,69,5682,1086,737 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 13173,18516,201,2910,168,737 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 10734,19710,69,3789,1086,737 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 20490,24342,69,1383,192,737 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 14637,18801,69,438,1206,438 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 20490,24321,69,1383,192,737 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 14637,18780,69,921,1206,737 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 21954,24342,375,1263,-446,737 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 14637,18801,375,3432,618,737 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 16101,24342,69,984,387,737 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 10245,18801,69,2493,1107,737 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 16101,24321,69,906,387,737 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 10245,18780,69,2967,1107,737 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 13173,24342,375,2148,879,737 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 10245,18801,375,2493,1230,737 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 14637,24321,69,3006,-1070,737 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 11220,19710,375,3813,-188,737 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 14637,18201,5988,3006,-140,737 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 8781,17055,5733,2148,2109,737 1 75262 -- MSL 469 ( 9E 254)
+u0055_030B 20490,24342,375,2655,-1070,737 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 14637,18801,375,3432,417,737 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 20490,25035,375,1671,-1070,737 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 14637,18678,375,1230,417,737 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 16101,24342,201,2589,2115,737 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 13173,18801,201,1464,1689,737 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 16101,24087,201,2589,2115,737 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 13173,18786,201,1464,1689,737 2 75199 -- MSL 485 ( 9E 191)
+u2070 9270,17700,0,1779,-308,737 0 51753 -- MSL 1000 ( 6J 41)
+u2074 9270,17562,0,1926,57,737 0 51748 -- MSL 1001 ( 6J 36)
+u2075 9270,17694,0,2097,-326,737 0 51749 -- MSL 1002 ( 6J 37)
+u2076 9270,17700,0,1608,-776,737 0 51806 -- MSL 1003 ( 6J 94)
+u2077 9270,17694,0,3141,-152,737 0 51750 -- MSL 1004 ( 6J 38)
+u2078 9270,17700,0,1821,-272,737 0 51754 -- MSL 1005 ( 6J 42)
+u2079 9270,17700,0,1653,-359,737 0 51752 -- MSL 1006 ( 6J 40)
+lq 11709,18375,0,2910,-386,737 2 161171 -- MSL 1017 (19U 147)
+rq 11709,18375,0,2895,-371,737 2 161172 -- MSL 1018 (19U 148)
+Bq 12198,3972,4527,0,2505 0 161156 -- MSL 1019 (19U 132)
+u2003 23418,0,0,0,1317 0 51821 -- MSL 1020 ( 6J 109)
+u2002 14637,0,0,0,1317 0 51822 -- MSL 1021 ( 6J 110)
+u2009 7317,0,0,0,1317 0 51828 -- MSL 1023 ( 6J 116)
+u2026 23418,3729,0,0,-413 0 161157 -- MSL 1028 (19U 133)
+vz 13173,18780,201,1653,1689,737 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,18000,0,2610,-1976,737 2 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056,387,-1088,387 2 51794 -- MSL 1036 ( 6J 82)
+fi 15612,19710,69,1506,900,737 2 60077 -- MSL 1040 ( 7J 173)
+fl 15612,19710,69,2385,816,737 2 60078 -- MSL 1041 ( 7J 174)
+ff 16587,19710,69,3507,816,737 2 51883 -- MSL 1042 ( 6J 171)
+Fi 23418,19710,69,1683,684,737 2 51884 -- MSL 1043 ( 6J 172)
+Fl 23418,19710,69,2499,666,737 2 51885 -- MSL 1044 ( 6J 173)
+ij 14637,19308,5400,1794,1131,737 3 60134 -- MSL 1047 ( 7J 230)
+u2105 23418,19599,444,1194,399,737 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 20490,24138,375,1230,-797,737 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 13173,18528,5400,1836,1659,737 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 13173,18375,5988,1626,879,737 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 10245,12840,5733,1188,1797,737 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 8781,24087,69,2430,441,737 2 46301 -- MSL 1065 ( 5T 221)
+bq 7317,3972,4527,0,2502 0 161154 -- MSL 1067 (19U 130)
+%0 33663,17769,264,0,-2288 0 161161 -- MSL 1068 (19U 137)
+a- 14637,17490,0,843,-3734,737 0 60154 -- MSL 1084 ( 7J 250)
+ab 14637,18528,0,396,-3983,396 2 75170 -- MSL 1086 ( 9E 162)
+a. 14637,18786,0,0,-6407 2 75263 -- MSL 1088 ( 9E 255)
+oe 22443,12840,375,720,618,720 0 161180 -- MSL 1090 (19U 156)
+OE 24882,18375,375,2916,-512,737 2 161164 -- MSL 1091 (19U 140)
+fo 6831,10851,0,1296,132,737 0 161163 -- MSL 1092 (19U 139)
+fc 6831,10851,0,609,819,609 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624,0,0,-2021 0 60091 -- MSL 1094 ( 7J 187)
+/L 13173,18069,201,198,1188,198 2 75171 -- MSL 1095 ( 9E 163)
+/l 7317,19569,69,3264,1563,737 2 75187 -- MSL 1096 ( 9E 179)
+a" 14637,18801,0,3432,-3053,737 2 75197 -- MSL 1097 ( 9E 189)
+ho 14637,636,4140,0,-4475 0 75186 -- MSL 1098 ( 9E 178)
+vZ 16101,24321,201,2589,2115,737 2 75150 -- MSL 1106 ( 9E 142)
+IJ 17565,18069,4242,1548,441,737 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/OI b/font/devlj4/OI
new file mode 100644
index 0000000..282d6ff
--- /dev/null
+++ b/font/devlj4/OI
@@ -0,0 +1,887 @@
+# CG Omega It
+name OI
+spacewidth 7317
+slant 9.860000
+pcltypeface 4113
+pclproportional 1
+pclweight 0
+pclstyle 1
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -2438
+P . -3902
+P , -3902
+V A -3902
+A V -4388
+T o -3413
+T r -3413
+T c -3413
+T e -3413
+T d -3413
+T s -3413
+T y -3413
+T a -3902
+T w -3413
+T u -3413
+L T -2438
+L Y -2438
+Y o -2924
+Y e -2924
+Y a -3413
+A W -3902
+W A -2924
+T A -3413
+V o -2924
+V e -2924
+V a -3413
+Y A -2924
+F A -3902
+F . -3902
+F , -3902
+A T -4388
+A Y -4388
+v . -2924
+v , -2924
+y . -2924
+y , -2924
+T . -3413
+T , -3413
+L W -2438
+P A -3413
+V . -3902
+V , -3902
+Y . -2924
+Y , -2924
+W o -1949
+W e -1949
+W a -2438
+W . -2924
+W , -2924
+r . -2924
+r , -2924
+w . -2924
+w , -2924
+Y u -1460
+A v -2438
+A y -2924
+A w -2438
+o . -1460
+o , -1460
+p . -1460
+p , -1460
+e . -485
+e , -485
+b . -1949
+b , -1949
+O T -2924
+O V -1460
+O Y -1460
+O . -2438
+O , -2438
+L y -2438
+L O -2438
+L G -2438
+L C -2438
+L Q -2438
+V y -1460
+V u -1460
+V O -1460
+V G -1460
+V C -1460
+V Q -1460
+D T -2924
+D V -1460
+D Y -1460
+D . -2438
+D , -2438
+Y O -1460
+Y G -1460
+Y C -1460
+Y Q -1460
+F o -1949
+F e -1949
+F a -2438
+c . -485
+c , -485
+O A -1949
+O W -974
+L U -1949
+R T -1460
+R V -1460
+R Y -1460
+R W -1460
+G T -974
+P o -1460
+P g -974
+P e -1460
+P a -1949
+C A -974
+C . -974
+C , -974
+D A -1949
+D W -974
+B T -1949
+B Y -1460
+B . -1460
+B , -1460
+A O -1949
+A G -1949
+A C -1949
+A U -2438
+A Q -1949
+W r -974
+W y -974
+W u -974
+W O -974
+W G -974
+W C -974
+W Q -974
+J A -974
+J . -974
+J , -974
+U A -2438
+U . -2438
+U , -2438
+Q W -974
+f . -485
+f , -485
+T O -2438
+T G -2438
+T C -2438
+T Q -2438
+O X -1460
+L o -1949
+L e -1949
+L q -1949
+G V -974
+G Y -974
+G W -974
+G . -485
+G , -485
+P T -974
+P V -974
+P Y -974
+C T -974
+C V -974
+C Y -974
+D X -1460
+B V -1460
+B X -1460
+B A -1460
+B W -974
+S . -1460
+S , -1460
+F r -485
+F y -485
+F u -485
+F O -485
+F G -485
+F C -485
+F Q -485
+X o -1460
+X e -1460
+X y -1460
+X O -1460
+X G -1460
+X C -1460
+X Q -1460
+A o -1949
+A e -1949
+K o -1460
+K e -1460
+K y -1460
+K w -1460
+K O -1460
+K G -1460
+K C -1460
+K Q -1460
+o v -485
+o y -1460
+o x -974
+o w -485
+h v -485
+h y -1460
+n v -485
+n y -1460
+r g -485
+g . -485
+g , -485
+p v -485
+p y -1460
+p x -974
+c v -485
+c y -485
+c w -485
+v o -485
+v g -485
+v c -485
+v d -485
+v a -974
+v q -485
+e v -485
+e y -974
+b v -485
+b y -1460
+b w -485
+s . -974
+s , -974
+y o -485
+y g -485
+y c -485
+y d -485
+y a -974
+y q -485
+f g -485
+x o -974
+x g -974
+x c -974
+x e -974
+x d -974
+x a -974
+x q -974
+a v -485
+a y -1460
+a w -485
+w o -485
+w g -485
+w c -485
+w d -485
+w a -974
+w q -485
+T i -485
+T S -1460
+L a -974
+L S -485
+R o -974
+R y -974
+R O -974
+R G -974
+R C -974
+R U -1460
+R Q -974
+G X -485
+G A -485
+P s -974
+P Z -974
+P X -974
+P W -974
+C X -974
+C W -974
+V i -485
+V S -1460
+S T -485
+S V -485
+S Y -485
+S X -485
+S A -1460
+S W -485
+Y i -485
+Y S -1460
+X a -974
+X u -1460
+X S -485
+A t -1460
+A g -1460
+A c -1949
+A d -1949
+A a -1460
+A u -1949
+A q -1949
+A S -974
+W i -485
+W S -974
+K c -1460
+K u -1460
+K S -485
+t g -485
+o f -485
+h w -485
+n w -485
+r o -485
+r c -485
+r e -485
+r d -485
+r a -974
+r q -485
+p f -485
+p w -485
+c f -485
+c x -485
+v e -485
+v s -485
+e f -485
+e x -485
+e w -485
+b f -485
+y e -485
+y s -485
+f o -485
+f c -485
+f e -485
+f d -485
+f s -485
+f a -974
+f q -485
+w e -485
+w s -485
+k o -485
+k g -485
+k c -485
+k v -485
+k e -485
+k d -485
+k y -485
+k a -974
+k w -485
+k q -485
+O Z -974
+L J -1460
+R e -974
+R a -974
+R u -974
+R S -485
+G Z -485
+P U -485
+C Z -974
+E a -485
+Z o -974
+Z e -974
+Z d -974
+Z y -974
+Z a -974
+Z w -974
+Z u -974
+Z O -974
+Z G -974
+Z C -974
+Z S -485
+Z Q -974
+D Z -974
+B Z -974
+S Z -485
+F i -485
+F j -485
+F S -485
+A s -485
+A J -1949
+A . -485
+A , -485
+J o -485
+J e -485
+J a -974
+J U -485
+U g -485
+U J -485
+K a -974
+K J -485
+t o -485
+t c -485
+t e -485
+t d -485
+t a -974
+t q -485
+o z -485
+h f -485
+n f -485
+r s -485
+g a -485
+p z -485
+c z -485
+e z -485
+z o -485
+z g -485
+z c -485
+z e -485
+z d -485
+z a -974
+z q -485
+b z -485
+a f -485
+k t -485
+k f -485
+k u -485
+T U -485
+R J -974
+C a -485
+C U -485
+V U -485
+E U -485
+B a -485
+B U -485
+Y U -485
+F U -485
+X U -485
+A b -485
+A f -974
+W U -485
+U t -485
+U o -485
+U h -485
+U n -485
+U m -485
+U l -485
+U r -485
+U i -485
+U p -485
+U c -485
+U v -485
+U e -485
+U z -485
+U d -485
+U b -485
+U s -485
+U y -485
+U f -485
+U x -485
+U a -974
+U w -485
+U j -485
+U q -485
+U k -485
+U T -485
+U O -485
+U H -485
+U N -485
+U M -485
+U L -485
+U R -485
+U G -485
+U I -485
+U P -485
+U C -485
+U V -485
+U E -485
+U Z -485
+U D -485
+U B -485
+U S -485
+U Y -485
+U F -485
+U X -485
+U W -485
+U U -974
+U Q -485
+U K -485
+K T -485
+K V -485
+K Y -485
+K W -485
+K U -974
+L cq -2438
+L ' -2438
+T hy -3413
+T - -3413
+T en -3413
+T em -3413
+A cq -3902
+A ' -3902
+hy T -3902
+- T -3902
+en T -3902
+em T -3902
+Y hy -1460
+Y - -1460
+Y en -1460
+Y em -1460
+p cq -1949
+p ' -1949
+c cq -485
+c ' -485
+e cq -974
+e ' -974
+b cq -1460
+b ' -1460
+a cq -1949
+a ' -1949
+V hy -1460
+V - -1460
+V en -1460
+V em -1460
+h cq -1460
+h ' -1460
+n cq -1460
+n ' -1460
+R cq -974
+R ' -974
+W hy -974
+W - -974
+W en -974
+W em -974
+cq d -1460
+' d -1460
+L hy -1949
+L - -1949
+L en -1949
+L em -1949
+F hy -485
+F - -485
+F en -485
+F em -485
+X hy -1460
+X - -1460
+X en -1460
+X em -1460
+A hy -1949
+A - -1949
+A en -1949
+A em -1949
+K hy -1460
+K - -1460
+K en -1460
+K em -1460
+cq s -974
+' s -974
+hy X -1460
+- X -1460
+hy A -1949
+- A -1949
+en X -1460
+en A -1949
+em X -1460
+R hy -974
+R - -974
+R en -974
+R em -974
+K cq -485
+K ' -485
+t g -485
+b f -485
+k cq -485
+k ' -485
+Z hy -974
+Z - -974
+Z en -974
+Z em -974
+U cq -485
+U ' -485
+k hy -485
+k - -485
+k en -485
+k em -485
+U hy -485
+U - -485
+U en -485
+U em -485
+charset
+! 7317,18000,330,723,-176,586 2 161057 -- MSL 1 (19U 33)
+dq 10734,18375,0,678,-2777,586 2 161058 -- MSL 2 (19U 34)
+" "
+sh 14637,17769,444,1371,570,586 0 161059 -- MSL 3 (19U 35)
+# "
+Do 14637,19515,3105,0,6 2 161060 -- MSL 4 (19U 36)
+$ "
+% 23418,17769,444,0,-2765 0 161061 -- MSL 5 (19U 37)
+& 17565,18000,375,264,174,264 2 161062 -- MSL 6 (19U 38)
+cq 7317,18375,0,1704,-1406,586 2 161170 -- MSL 8 (19U 146)
+' "
+( 7317,18375,3165,2625,-299,586 2 161064 -- MSL 9 (19U 40)
+) 7317,18375,3165,54,2271,54 2 161065 -- MSL 10 (19U 41)
+* 14637,18150,0,0,-2147 2 161066 -- MSL 11 (19U 42)
++ 23418,13260,393,0,-3788 0 161067 -- MSL 12 (19U 43)
+, 7317,2700,4611,0,1776 0 161068 -- MSL 13 (19U 44)
+hy 7317,7170,0,1245,1176,586 0 161069 -- MSL 14 (19U 45)
+- "
+. 7317,2622,330,0,-236 0 161070 -- MSL 15 (19U 46)
+sl 7317,19650,480,2448,1203,586 2 161071 -- MSL 16 (19U 47)
+/ "
+0 14637,17700,375,723,-179,586 0 161072 -- MSL 17 (19U 48)
+1 14637,17700,69,0,-3338 0 161073 -- MSL 18 (19U 49)
+2 14637,17700,201,0,-122 0 161074 -- MSL 19 (19U 50)
+3 14637,17700,375,0,60 0 161075 -- MSL 20 (19U 51)
+4 14637,17769,69,396,285,396 0 161076 -- MSL 21 (19U 52)
+5 14637,17526,375,297,-101,297 0 161077 -- MSL 22 (19U 53)
+6 14637,17700,375,0,-458 0 161078 -- MSL 23 (19U 54)
+7 14637,17526,69,1713,-884,586 0 161079 -- MSL 24 (19U 55)
+8 14637,17700,375,12,-146,12 0 161080 -- MSL 25 (19U 56)
+9 14637,17700,375,267,-962,267 0 161081 -- MSL 26 (19U 57)
+: 7317,11652,330,0,-236 0 161082 -- MSL 27 (19U 58)
+; 7317,11652,4611,0,1776 0 161083 -- MSL 28 (19U 59)
+< 26346,16068,0,0,-3980 0 161084 -- MSL 29 (19U 60)
+= 23418,8622,0,0,-3731 0 161085 -- MSL 30 (19U 61)
+> 26346,16068,0,0,-3980 0 161086 -- MSL 31 (19U 62)
+? 10245,18000,330,1083,-1298,586 2 161087 -- MSL 32 (19U 63)
+at 23418,16980,3654,435,87,435 0 161088 -- MSL 33 (19U 64)
+@ "
+A 17565,18000,69,0,1896 2 161089 -- MSL 34 (19U 65)
+B 16101,18069,69,0,-341 2 161090 -- MSL 35 (19U 66)
+C 17565,18375,375,1455,-410,586 2 161091 -- MSL 36 (19U 67)
+D 20490,18069,69,288,-362,288 2 161092 -- MSL 37 (19U 68)
+E 13173,18201,201,1095,-101,586 2 161093 -- MSL 38 (19U 69)
+F 13173,18201,69,1098,-125,586 2 161094 -- MSL 39 (19U 70)
+G 19515,18375,375,1158,-668,586 2 161095 -- MSL 40 (19U 71)
+H 20490,18069,69,627,-233,586 2 161096 -- MSL 41 (19U 72)
+I 7806,18069,69,609,-248,586 2 161097 -- MSL 42 (19U 73)
+J 7317,18069,3657,1026,2235,586 2 161098 -- MSL 43 (19U 74)
+K 16101,18069,69,2220,-320,586 2 161099 -- MSL 44 (19U 75)
+L 12198,18069,201,414,-221,414 2 161100 -- MSL 45 (19U 76)
+M 23418,18069,69,543,-110,543 2 161101 -- MSL 46 (19U 77)
+N 20490,18069,375,525,-245,525 2 161102 -- MSL 47 (19U 78)
+O 21954,18375,375,555,-371,555 2 161103 -- MSL 48 (19U 79)
+P 14637,18069,69,1464,-359,586 2 161104 -- MSL 49 (19U 80)
+Q 21954,18375,4200,507,-347,507 2 161105 -- MSL 50 (19U 81)
+R 16587,18069,69,498,-158,498 2 161106 -- MSL 51 (19U 82)
+S 13173,18375,375,882,855,586 2 161107 -- MSL 52 (19U 83)
+T 14637,18201,69,2493,-1079,586 2 161108 -- MSL 53 (19U 84)
+U 20490,18069,375,669,-1454,586 2 161109 -- MSL 54 (19U 85)
+V 16101,18069,69,2763,-746,586 2 161110 -- MSL 55 (19U 86)
+W 24882,18069,69,2835,-917,586 2 161111 -- MSL 56 (19U 87)
+X 14637,18069,69,2148,1377,586 2 161112 -- MSL 57 (19U 88)
+Y 14637,18069,69,3225,-542,586 2 161113 -- MSL 58 (19U 89)
+Z 16101,18201,201,1014,921,586 2 161114 -- MSL 59 (19U 90)
+lB 7317,18201,4956,3090,1014,586 3 161115 -- MSL 60 (19U 91)
+[ "
+rs 7317,19650,480,294,-1517,294 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 7317,18201,4956,1338,2766,586 3 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758,0,36,36,36 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588,1317,1317,586 1 161119 -- MSL 64 (19U 95)
+oq 7317,18375,0,1704,-1406,586 2 161169 -- MSL 66 (19U 145)
+` "
+a 13173,12795,330,168,582,168 0 161121 -- MSL 67 (19U 97)
+b 14637,19779,330,279,651,279 2 161122 -- MSL 68 (19U 98)
+c 12684,12795,330,1245,282,586 0 161123 -- MSL 69 (19U 99)
+d 14637,19779,330,2097,-26,586 2 161124 -- MSL 70 (19U 100)
+e 13173,12795,330,588,327,586 0 161125 -- MSL 71 (19U 101)
+f 7317,19710,69,3714,57,586 2 161126 -- MSL 72 (19U 102)
+g 13173,12996,5400,1656,876,586 1 161127 -- MSL 73 (19U 103)
+h 14637,19779,69,0,348 2 161128 -- MSL 74 (19U 104)
+i 7317,18336,69,885,-287,586 2 161129 -- MSL 75 (19U 105)
+j 7317,18336,5400,876,1554,586 3 161130 -- MSL 76 (19U 106)
+k 13173,19779,69,1581,249,586 2 161131 -- MSL 77 (19U 107)
+l 7317,19779,69,1068,-110,586 2 161132 -- MSL 78 (19U 108)
+m 21954,12534,69,0,414 0 161133 -- MSL 79 (19U 109)
+n 14637,12795,69,0,282 0 161134 -- MSL 80 (19U 110)
+o 14637,12795,330,453,351,453 0 161135 -- MSL 81 (19U 111)
+p 14637,12795,5469,216,1740,216 1 161136 -- MSL 82 (19U 112)
+q 14637,12795,5469,828,-50,586 1 161137 -- MSL 83 (19U 113)
+r 8781,12795,69,1512,279,586 0 161138 -- MSL 84 (19U 114)
+s 10245,12795,330,411,960,411 0 161139 -- MSL 85 (19U 115)
+t 7806,15654,330,1212,258,586 0 161140 -- MSL 86 (19U 116)
+u 14637,12534,330,372,-347,372 0 161141 -- MSL 87 (19U 117)
+v 13173,12534,69,1632,-206,586 0 161142 -- MSL 88 (19U 118)
+w 20490,12534,69,1974,-182,586 0 161143 -- MSL 89 (19U 119)
+x 11709,12534,69,1191,1662,586 0 161144 -- MSL 90 (19U 120)
+y 13173,12534,5469,1659,-56,586 1 161145 -- MSL 91 (19U 121)
+z 13173,12666,201,795,714,586 0 161146 -- MSL 92 (19U 122)
+{ 11709,19935,6210,2910,-1241,586 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588,0,-4595 3 161148 -- MSL 94 (19U 124)
+ba "
+} 11709,19935,6210,0,2682 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,8952,0,0,-4028 0 161150 -- MSL 96 (19U 126)
+`A 17565,24042,69,0,1896 2 161216 -- MSL 99 (19U 192)
+^A 17565,23745,69,0,1896 2 161218 -- MSL 100 (19U 194)
+`E 13173,24042,201,1095,-101,586 2 161224 -- MSL 101 (19U 200)
+^E 13173,23745,201,1095,-101,586 2 161226 -- MSL 102 (19U 202)
+:E 13173,22896,201,1455,-101,586 2 161227 -- MSL 103 (19U 203)
+^I 7806,23745,69,3768,-248,586 2 161230 -- MSL 104 (19U 206)
+:I 7806,22896,69,4140,-248,586 2 161231 -- MSL 105 (19U 207)
+aa 14637,18375,0,0,-6179 2 161204 -- MSL 106 (19U 180)
+ga 14637,18378,0,0,-4619 2 161120 -- MSL 107 (19U 96)
+a^ 14637,18225,0,0,-3890 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 14637,17223,0,0,-3716 0 161192 -- MSL 109 (19U 168)
+~ 14637,17166,0,0,-3716 0 161176 -- MSL 110 (19U 152)
+a~ "
+`U 20490,24042,375,669,-1454,586 2 161241 -- MSL 111 (19U 217)
+^U 20490,23745,375,669,-1454,586 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105,0,1317,1317,586 2 161199 -- MSL 113 (19U 175)
+'Y 14637,24048,69,3225,-542,586 2 161245 -- MSL 114 (19U 221)
+'y 13173,18375,5469,1659,-56,586 3 161277 -- MSL 115 (19U 253)
+de 14637,17700,0,0,-2663 0 161200 -- MSL 116 (19U 176)
+,C 17565,18375,5736,1455,-410,586 3 161223 -- MSL 117 (19U 199)
+,c 12684,12795,5193,1245,282,586 1 161255 -- MSL 118 (19U 231)
+~N 20490,22812,375,525,-245,525 2 161233 -- MSL 119 (19U 209)
+~n 14637,17166,69,0,282 0 161265 -- MSL 120 (19U 241)
+r! 7317,12696,5634,0,639 1 161185 -- MSL 121 (19U 161)
+r? 10245,12696,5634,0,795 1 161215 -- MSL 122 (19U 191)
+Cs 14637,15684,0,660,-116,586 0 161188 -- MSL 123 (19U 164)
+Po 14637,17700,201,1269,1179,586 0 161187 -- MSL 124 (19U 163)
+Ye 14637,18069,69,2862,-179,586 2 161189 -- MSL 125 (19U 165)
+sc 14637,17865,3633,0,-959 2 161191 -- MSL 126 (19U 167)
+Fn 14637,19710,69,0,-3317 2 161155 -- MSL 127 (19U 131)
+ct 14637,19782,0,393,-998,393 2 161186 -- MSL 128 (19U 162)
+^a 13173,18225,330,168,582,168 2 161250 -- MSL 129 (19U 226)
+^e 13173,18225,330,588,327,586 2 161258 -- MSL 130 (19U 234)
+^o 14637,18225,330,453,351,453 2 161268 -- MSL 131 (19U 244)
+^u 14637,18225,330,372,-347,372 2 161275 -- MSL 132 (19U 251)
+'a 13173,18375,330,168,582,168 2 161249 -- MSL 133 (19U 225)
+'e 13173,18375,330,588,327,586 2 161257 -- MSL 134 (19U 233)
+'o 14637,18375,330,453,351,453 2 161267 -- MSL 135 (19U 243)
+'u 14637,18375,330,372,-347,372 2 161274 -- MSL 136 (19U 250)
+`a 13173,18378,330,168,582,168 2 161248 -- MSL 137 (19U 224)
+`e 13173,18378,330,588,327,586 2 161256 -- MSL 138 (19U 232)
+`o 14637,18378,330,453,351,453 2 161266 -- MSL 139 (19U 242)
+`u 14637,18378,330,372,-347,372 2 161273 -- MSL 140 (19U 249)
+:a 13173,17223,330,285,582,285 0 161252 -- MSL 141 (19U 228)
+:e 13173,17223,330,588,327,586 0 161259 -- MSL 142 (19U 235)
+:o 14637,17223,330,453,351,453 0 161270 -- MSL 143 (19U 246)
+:u 14637,17223,330,372,-347,372 0 161276 -- MSL 144 (19U 252)
+oA 17565,23979,69,0,1896 2 161221 -- MSL 145 (19U 197)
+^i 7317,18225,69,2628,-230,586 2 161262 -- MSL 146 (19U 238)
+/O 21954,18375,375,1341,588,586 2 161240 -- MSL 147 (19U 216)
+AE 20979,18201,201,1296,3312,586 2 161222 -- MSL 148 (19U 198)
+oa 13173,17973,330,168,582,168 2 161253 -- MSL 149 (19U 229)
+'i 7317,18375,69,2973,-278,586 2 161261 -- MSL 150 (19U 237)
+/o 14637,12795,399,1320,1203,586 0 161272 -- MSL 151 (19U 248)
+ae 20490,12795,330,906,678,586 0 161254 -- MSL 152 (19U 230)
+:A 17565,22896,69,0,1896 2 161220 -- MSL 153 (19U 196)
+`i 7317,18378,69,174,-278,174 2 161260 -- MSL 154 (19U 236)
+:O 21954,22896,375,555,-371,555 2 161238 -- MSL 155 (19U 214)
+:U 20490,22896,375,669,-1454,586 2 161244 -- MSL 156 (19U 220)
+'E 13173,24048,201,1239,-101,586 2 161225 -- MSL 157 (19U 201)
+:i 7317,17223,69,3213,-56,586 0 161263 -- MSL 158 (19U 239)
+ss 14148,19710,330,147,516,147 2 161247 -- MSL 159 (19U 223)
+^O 21954,23745,375,555,-371,555 2 161236 -- MSL 160 (19U 212)
+'A 17565,24048,69,0,1896 2 161217 -- MSL 161 (19U 193)
+~A 17565,22812,69,0,1896 2 161219 -- MSL 162 (19U 195)
+~a 13173,17166,330,168,582,168 0 161251 -- MSL 163 (19U 227)
+-D 20490,18069,69,288,936,288 2 161232 -- MSL 164 (19U 208)
+Sd 14637,19590,330,453,351,453 2 161264 -- MSL 165 (19U 240)
+'I 7806,24048,69,3924,-248,586 2 161229 -- MSL 166 (19U 205)
+`I 7806,24042,69,909,-248,586 2 161228 -- MSL 167 (19U 204)
+'O 21954,24048,375,555,-371,555 2 161235 -- MSL 168 (19U 211)
+`O 21954,24042,375,555,-371,555 2 161234 -- MSL 169 (19U 210)
+~O 21954,22812,375,555,-371,555 2 161237 -- MSL 170 (19U 213)
+~o 14637,17166,330,453,351,453 0 161269 -- MSL 171 (19U 245)
+vS 13173,23745,375,1725,855,586 2 161162 -- MSL 172 (19U 138)
+vs 10245,18225,330,1680,960,586 2 161178 -- MSL 173 (19U 154)
+'U 20490,24048,375,669,-1454,586 2 161242 -- MSL 174 (19U 218)
+:Y 14637,22896,69,3225,-542,586 2 161183 -- MSL 175 (19U 159)
+:y 13173,17223,5469,1659,-56,586 1 161279 -- MSL 176 (19U 255)
+TP 14637,18069,69,834,-350,586 2 161246 -- MSL 177 (19U 222)
+Tp 14637,19779,5469,225,1752,225 3 161278 -- MSL 178 (19U 254)
+mc 14637,12630,4350,1122,2931,586 0 161205 -- MSL 180 (19U 181)
+ps 14637,19635,4200,135,-1256,135 2 161206 -- MSL 181 (19U 182)
+34 23418,17850,525,0,-1325 2 161214 -- MSL 182 (19U 190)
+\- 23418,7122,0,0,-3800 0 60096 -- MSL 183 ( 7J 192)
+14 23418,17850,525,0,-2267 2 161212 -- MSL 184 (19U 188)
+12 23418,17850,525,0,-2138 2 161213 -- MSL 185 (19U 189)
+Of 12198,17700,0,18,-1691,18 0 161194 -- MSL 186 (19U 170)
+Om 12198,17700,0,1029,-1607,586 0 161210 -- MSL 187 (19U 186)
+Fo 9759,10920,0,849,306,586 0 161195 -- MSL 188 (19U 171)
+Fc 9759,10920,0,120,1035,120 0 161211 -- MSL 190 (19U 187)
+t+- 23418,13260,3132,0,-3332 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916,0,-4595 3 161190 -- MSL 192 (19U 166)
+co 13173,19635,0,3384,-1592,586 2 161193 -- MSL 193 (19U 169)
+tno 23418,10671,0,0,-3014 0 161196 -- MSL 194 (19U 172)
+u00AD 7317,7170,0,1245,1176,586 0 161197 -- MSL 195 (19U 173)
+rg 13173,19635,0,3384,-1592,586 2 161198 -- MSL 196 (19U 174)
+S2 10245,17700,0,705,-773,586 0 161202 -- MSL 197 (19U 178)
+S3 10245,17700,0,525,-806,525 0 161203 -- MSL 198 (19U 179)
+ac 14637,300,5193,0,-1904 1 161208 -- MSL 199 (19U 184)
+S1 10245,17700,0,0,-2471 0 161209 -- MSL 200 (19U 185)
+tmu 23418,13137,585,0,-3779 0 161239 -- MSL 201 (19U 215)
+tdi 23418,11139,0,0,-3899 0 161271 -- MSL 202 (19U 247)
+u203C 14637,18000,330,231,-665,231 2 87315 -- MSL 221 (10U 19)
+u20A7 22443,18069,330,1212,-359,586 2 60121 -- MSL 232 ( 7J 217)
+pc 7317,10905,0,0,-1391 0 161207 -- MSL 302 (19U 183)
+u013F 12198,18069,201,1377,-221,586 2 51943 -- MSL 306 ( 6J 231)
+u0140 10245,19779,69,1863,-110,586 2 51959 -- MSL 307 ( 6J 247)
+u2113 14637,18150,297,0,-1787 2 60122 -- MSL 308 ( 7J 218)
+u0149 20490,18375,69,0,-1406 2 51951 -- MSL 309 ( 6J 239)
+fm 7317,17700,0,1092,-1739,586 0 60101 -- MSL 310 ( 7J 197)
+sd 14637,17700,0,0,-1739 0 60102 -- MSL 311 ( 7J 198)
+dg 14637,18213,846,0,-1322 2 161158 -- MSL 312 (19U 134)
+tm 16101,17850,0,924,-1460,586 2 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588,1317,1317,586 1 60095 -- MSL 314 ( 7J 191)
+ah 14637,18225,0,0,-4406 2 75169 -- MSL 315 ( 9E 161)
+ao 14637,17973,0,0,-5852 2 60152 -- MSL 316 ( 7J 248)
+f/ 3414,17850,525,7596,6609,586 2 60109 -- MSL 324 ( 7J 205)
+em 23418,6885,0,390,537,390 0 161175 -- MSL 325 (19U 151)
+en 14637,6885,0,507,537,507 0 161174 -- MSL 326 (19U 150)
+dd 14637,18213,846,0,-1334 2 161159 -- MSL 327 (19U 135)
+.i 7317,12534,69,174,-278,174 0 46333 -- MSL 328 ( 5T 253)
+aq 7317,18375,0,705,-2777,586 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226,0,0,-497 0 161173 -- MSL 331 (19U 149)
+u207F 10734,17700,0,1650,474,586 0 87548 -- MSL 332 (10U 252)
+u0111 14637,19779,330,3444,-20,586 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 17565,23871,69,0,1896 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 13173,18165,330,450,582,450 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 17565,18000,4167,0,1896 2 75173 -- MSL 404 ( 9E 165)
+u0061_0328 13173,12795,3876,750,582,586 0 75193 -- MSL 405 ( 9E 185)
+'C 17565,24048,375,1455,-410,586 2 75206 -- MSL 406 ( 9E 198)
+'c 12684,18375,330,1245,282,586 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 17565,23745,375,1455,-410,586 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 12684,18225,330,1245,282,586 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 20490,23745,69,288,-362,288 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 17076,19779,330,4311,-26,586 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 13173,23745,201,1725,-101,586 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 13173,18225,330,588,327,586 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 13173,18201,4167,1095,-101,586 2 75210 -- MSL 422 ( 9E 202)
+u0065_0328 13173,12795,3876,588,327,586 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 12198,24048,201,414,-221,414 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 7317,25155,69,4473,-110,586 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 12198,18516,201,1668,-221,586 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 8781,19779,69,4260,-110,586 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 20490,24048,375,525,-245,525 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 14637,18375,69,0,282 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 20490,23745,375,525,-245,525 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 14637,18225,69,0,282 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 21954,24048,375,555,-371,555 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 14637,18375,330,1413,351,586 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 16587,24048,69,498,-158,498 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 8781,18375,69,2841,279,586 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 16587,23745,69,498,-158,498 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 8781,18225,69,3012,279,586 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 13173,24048,375,1239,855,586 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 10245,18375,330,1989,960,586 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 14637,23745,69,2493,-1079,586 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 8295,19710,330,4446,258,586 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 14637,18201,5736,2493,-1079,586 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 7806,15654,5193,1212,1509,586 1 75262 -- MSL 469 ( 9E 254)
+u0055_030B 20490,24048,375,669,-1454,586 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 14637,18375,330,1413,-347,586 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 20490,23979,375,669,-1454,586 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 14637,17973,330,372,-347,372 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 16101,24048,201,1014,921,586 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 13173,18375,201,795,714,586 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 16101,22896,201,1014,921,586 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 13173,17400,201,795,714,586 0 75199 -- MSL 485 ( 9E 191)
+u2070 10245,17700,0,1338,-812,586 0 51753 -- MSL 1000 ( 6J 41)
+u2074 10245,17619,0,1230,-617,586 0 51748 -- MSL 1001 ( 6J 36)
+u2075 10245,17619,0,900,-857,586 0 51749 -- MSL 1002 ( 6J 37)
+u2076 10245,17700,0,672,-1037,586 0 51806 -- MSL 1003 ( 6J 94)
+u2077 10245,17619,0,2151,-1151,586 0 51750 -- MSL 1004 ( 6J 38)
+u2078 10245,17700,0,717,-776,586 0 51754 -- MSL 1005 ( 6J 42)
+u2079 10245,17700,0,987,-1367,586 0 51752 -- MSL 1006 ( 6J 40)
+lq 11220,18375,0,1620,-1310,586 2 161171 -- MSL 1017 (19U 147)
+rq 11220,18375,0,1527,-1217,586 2 161172 -- MSL 1018 (19U 148)
+Bq 11220,2535,4482,0,1782 0 161156 -- MSL 1019 (19U 132)
+u2003 23418,0,0,0,1317 0 51821 -- MSL 1020 ( 6J 109)
+u2002 14637,0,0,0,1317 0 51822 -- MSL 1021 ( 6J 110)
+u2009 7317,0,0,0,1317 0 51828 -- MSL 1023 ( 6J 116)
+u2026 23418,2592,0,0,-467 0 161157 -- MSL 1028 (19U 133)
+vz 13173,18225,201,795,714,586 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,18000,0,2109,-1475,586 2 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056,237,-938,237 2 51794 -- MSL 1036 ( 6J 82)
+fi 14637,19710,69,876,45,586 2 60077 -- MSL 1040 ( 7J 173)
+fl 14637,19710,69,1137,117,586 2 60078 -- MSL 1041 ( 7J 174)
+ff 14637,19710,69,3714,57,586 2 51883 -- MSL 1042 ( 6J 171)
+Fi 21954,19710,69,876,48,586 2 51884 -- MSL 1043 ( 6J 172)
+Fl 21954,19710,69,1137,120,586 2 51885 -- MSL 1044 ( 6J 173)
+ij 14148,18336,5400,873,-287,586 3 60134 -- MSL 1047 ( 7J 230)
+u2105 27321,17769,264,159,-632,159 0 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 19515,23871,375,1158,-668,586 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 13173,18165,5400,1656,876,586 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 13173,18375,5736,882,855,586 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 10245,12795,5193,411,960,411 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 7806,22896,69,1458,-248,586 2 46301 -- MSL 1065 ( 5T 221)
+bq 7317,2535,4482,0,1593 0 161154 -- MSL 1067 (19U 130)
+%0 32202,17769,444,0,-2810 0 161161 -- MSL 1068 (19U 137)
+a- 14637,16521,0,0,-3731 0 60154 -- MSL 1084 ( 7J 250)
+ab 14637,18165,0,0,-3656 2 75170 -- MSL 1086 ( 9E 162)
+a. 14637,17400,0,0,-6227 0 75263 -- MSL 1088 ( 9E 255)
+oe 23418,12795,330,696,354,586 0 161180 -- MSL 1090 (19U 156)
+OE 24396,18375,375,1089,-371,586 2 161164 -- MSL 1091 (19U 140)
+fo 6342,10920,0,624,243,586 0 161163 -- MSL 1092 (19U 139)
+fc 6342,10920,0,0,972 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624,0,0,-2021 0 60091 -- MSL 1094 ( 7J 187)
+/L 12198,18069,201,405,1215,405 2 75171 -- MSL 1095 ( 9E 163)
+/l 7317,19779,69,2694,1233,586 2 75187 -- MSL 1096 ( 9E 179)
+a" 14637,18375,0,1413,-3644,586 2 75197 -- MSL 1097 ( 9E 189)
+ho 14637,600,3876,0,-6092 0 75186 -- MSL 1098 ( 9E 178)
+vZ 16101,23745,201,1014,921,586 2 75150 -- MSL 1106 ( 9E 142)
+IJ 15126,18069,3657,1026,-248,586 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/OR b/font/devlj4/OR
new file mode 100644
index 0000000..288f4f3
--- /dev/null
+++ b/font/devlj4/OR
@@ -0,0 +1,863 @@
+# CG Omega
+name OR
+spacewidth 7317
+pcltypeface 4113
+pclproportional 1
+pclweight 0
+pclstyle 0
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -3413
+P . -3902
+P , -3902
+V A -4388
+A V -4388
+T o -3902
+T r -3413
+T c -3902
+T e -3902
+T d -3902
+T s -3902
+T y -3902
+T a -3902
+T w -3902
+T u -3902
+L T -3413
+L Y -3413
+Y o -3902
+Y e -3902
+Y a -3902
+A W -3902
+W A -3902
+T A -3413
+V o -3413
+V e -3413
+V a -3413
+Y A -4388
+F A -3413
+F . -3413
+F , -3413
+A T -3413
+A Y -4388
+v . -2924
+v , -2924
+y . -2924
+y , -2924
+T . -3413
+T , -3413
+L W -3413
+P A -2924
+V . -3902
+V , -3902
+Y . -3902
+Y , -3902
+W o -2924
+W e -2924
+W a -2924
+W . -3902
+W , -3902
+r . -2924
+r , -2924
+w . -1949
+w , -1949
+Y u -2438
+A v -1949
+A y -1949
+A w -1460
+o . -1460
+o , -1460
+p . -1460
+p , -1460
+e . -974
+e , -974
+b . -1460
+b , -1460
+O T -2438
+O V -2438
+O Y -2438
+O . -2438
+O , -2438
+L y -2924
+L O -2438
+L G -2438
+L C -974
+L Q -2438
+V y -2438
+V u -2438
+V O -2438
+V G -2438
+V C -1460
+V Q -2438
+D T -1949
+D V -1949
+D Y -1949
+D . -1949
+D , -1949
+Y O -2438
+Y G -2438
+Y C -1460
+Y Q -2438
+F o -1460
+F e -1460
+F a -1460
+c . -485
+c , -485
+O A -1460
+O W -1460
+L U -1460
+R T -974
+R V -974
+R Y -974
+R W -974
+G T -1460
+P o -1460
+P g -974
+P e -1460
+P a -1460
+C A -485
+C . -485
+C , -485
+D A -1460
+D W -1460
+B T -1460
+B Y -1460
+B . -1460
+B , -1460
+A O -1460
+A G -1460
+A C -974
+A U -1460
+A Q -1460
+W r -1460
+W y -1460
+W u -1460
+W O -1460
+W G -1460
+W C -1460
+W Q -1460
+J A -974
+J . -974
+J , -974
+U A -1460
+U . -1460
+U , -1460
+Q A -1460
+Q W -1460
+f . -485
+f , -485
+T O -2438
+T G -2438
+T C -1460
+T Q -2438
+O X -1460
+L o -1460
+L e -1460
+L q -1460
+G V -1460
+G Y -1460
+G W -1460
+G . -485
+G , -485
+P T -485
+P V -485
+P Y -485
+D X -1460
+B V -1460
+B X -1460
+B A -1460
+B W -1460
+S . -974
+S , -974
+X o -1460
+X e -1460
+X y -1460
+X O -1460
+X G -1460
+X C -974
+X Q -1460
+A o -1460
+A e -1460
+Q X -1460
+K o -1460
+K e -1460
+K y -1460
+K w -1460
+K O -1460
+K G -1460
+K C -974
+K Q -1460
+o v -485
+o y -485
+o x -974
+h v -485
+h y -485
+n v -485
+n y -485
+m v -485
+m y -485
+g . -485
+g , -485
+p v -485
+p y -485
+p x -974
+c v -485
+c y -485
+v o -485
+v g -485
+v c -485
+v d -485
+v a -485
+v q -485
+e v -485
+e y -485
+b v -485
+b y -485
+s . -974
+s , -974
+y o -485
+y g -485
+y c -485
+y d -485
+y a -485
+y q -485
+f g -485
+x o -974
+x g -974
+x c -974
+x e -974
+x d -974
+x a -974
+x q -974
+a v -485
+a y -485
+T i -485
+T S -974
+L a -974
+L S -974
+R o -974
+R y -974
+R O -974
+R G -974
+R C -974
+R U -1460
+R Q -974
+G X -485
+G A -485
+P s -974
+P Z -485
+P X -485
+P W -485
+V i -485
+V S -974
+S T -974
+S V -974
+S Y -974
+S X -974
+S A -974
+S W -974
+Y i -485
+Y S -974
+X a -974
+X u -1460
+X S -974
+A t -1460
+A g -974
+A c -1460
+A d -1460
+A a -974
+A u -1460
+A q -1460
+A S -974
+W i -485
+W S -974
+K c -1460
+K u -1460
+K S -974
+c x -485
+v e -485
+v s -485
+e x -974
+s v -485
+s y -485
+s x -485
+y e -485
+y s -485
+f o -485
+f c -485
+f e -485
+f d -485
+f s -485
+f a -485
+f q -485
+x s -485
+k o -485
+k g -485
+k c -485
+k v -485
+k e -485
+k d -485
+k y -485
+k a -485
+k w -485
+k q -485
+O Z -974
+R e -974
+R a -974
+R u -974
+R S -974
+G Z -485
+P M -485
+P U -485
+Z o -974
+Z e -974
+Z d -974
+Z s -485
+Z y -974
+Z a -974
+Z w -974
+Z u -974
+Z O -974
+Z G -974
+Z C -974
+Z S -974
+Z Q -974
+D Z -974
+B Z -1460
+B J -485
+S Z -974
+A s -485
+J U -485
+U g -485
+U J -485
+K a -974
+o z -485
+p z -485
+c z -485
+e z -485
+z o -485
+z g -485
+z c -485
+z e -485
+z d -485
+z s -485
+z a -485
+z q -485
+b z -485
+s z -485
+k t -485
+k s -485
+k f -485
+k u -485
+T U -485
+G J -485
+C U -485
+V U -485
+E U -485
+B o -485
+B h -485
+B l -485
+B r -485
+B i -485
+B e -485
+B y -485
+B a -485
+B u -485
+B O -485
+B H -485
+B N -485
+B M -485
+B L -485
+B R -485
+B G -485
+B I -485
+B P -485
+B C -485
+B E -485
+B D -485
+B B -485
+B S -485
+B F -485
+B U -974
+B Q -485
+B K -485
+Y U -485
+F M -485
+F U -485
+X U -485
+A f -485
+W U -485
+U t -485
+U o -485
+U h -485
+U n -485
+U m -485
+U l -485
+U r -485
+U i -485
+U p -485
+U c -485
+U v -485
+U e -485
+U z -485
+U d -485
+U b -485
+U s -485
+U y -485
+U f -485
+U x -485
+U a -485
+U w -485
+U j -485
+U q -485
+U k -485
+U T -485
+U O -485
+U H -485
+U N -485
+U M -485
+U L -485
+U R -485
+U G -485
+U I -485
+U P -485
+U C -485
+U V -485
+U E -485
+U Z -485
+U D -485
+U B -485
+U S -485
+U Y -485
+U F -485
+U X -485
+U W -485
+U U -974
+U Q -485
+U K -485
+K U -485
+L cq -3413
+L ' -3413
+T hy -3902
+T - -3902
+T en -3902
+T em -3902
+A cq -3902
+A ' -3902
+hy T -3902
+- T -3902
+en T -3902
+em T -3902
+Y hy -2438
+Y - -2438
+Y en -2438
+Y em -2438
+p cq -1460
+p ' -1460
+c cq -485
+c ' -485
+e cq -974
+e ' -974
+b cq -1460
+b ' -1460
+a cq -1460
+a ' -1460
+V hy -2438
+V - -2438
+V en -2438
+V em -2438
+h cq -1460
+h ' -1460
+n cq -1460
+n ' -1460
+m cq -1460
+m ' -1460
+R cq -974
+R ' -974
+W hy -1460
+W - -1460
+W en -1460
+W em -1460
+cq d -1460
+' d -1460
+s cq -485
+s ' -485
+L hy -1949
+L - -1949
+L en -1949
+L em -1949
+X hy -1460
+X - -1460
+X en -1460
+X em -1460
+A hy -1460
+A - -1460
+A en -1460
+A em -1460
+K hy -1460
+K - -1460
+K en -1460
+K em -1460
+cq s -974
+' s -974
+hy X -1460
+- X -1460
+hy A -1460
+- A -1460
+en X -1460
+en A -1460
+em X -1460
+R hy -974
+R - -974
+R en -974
+R em -974
+k cq -485
+k ' -485
+M cq -485
+M ' -485
+G cq -485
+G ' -485
+Z hy -974
+Z - -974
+Z en -974
+Z em -974
+B cq -485
+B ' -485
+U cq -485
+U ' -485
+cq M -485
+' M -485
+k hy -485
+k - -485
+k en -485
+k em -485
+B hy -485
+B - -485
+B en -485
+B em -485
+U hy -485
+U - -485
+U en -485
+U em -485
+charset
+! 7317,18000,330 2 161057 -- MSL 1 (19U 33)
+dq 10734,18375 2 161058 -- MSL 2 (19U 34)
+" "
+sh 14637,17994,405 2 161059 -- MSL 3 (19U 35)
+# "
+Do 14637,19554,2919 2 161060 -- MSL 4 (19U 36)
+$ "
+% 23418,17961,510 2 161061 -- MSL 5 (19U 37)
+& 19029,17667,375 0 161062 -- MSL 6 (19U 38)
+cq 7317,18375 2 161170 -- MSL 8 (19U 146)
+' "
+( 7317,18375,3165 2 161064 -- MSL 9 (19U 40)
+) 7317,18375,3165 2 161065 -- MSL 10 (19U 41)
+* 14637,18066 2 161066 -- MSL 11 (19U 42)
++ 23418,13260,393 0 161067 -- MSL 12 (19U 43)
+, 7317,2718,4923 1 161068 -- MSL 13 (19U 44)
+hy 7317,7275 0 161069 -- MSL 14 (19U 45)
+- "
+. 7317,2715,330 0 161070 -- MSL 15 (19U 46)
+sl 7317,19566,396 2 161071 -- MSL 16 (19U 47)
+/ "
+0 14637,17700,375 0 161072 -- MSL 17 (19U 48)
+1 14637,17700,69 0 161073 -- MSL 18 (19U 49)
+2 14637,17700,201 0 161074 -- MSL 19 (19U 50)
+3 14637,17700,375 0 161075 -- MSL 20 (19U 51)
+4 14637,17394,69 0 161076 -- MSL 21 (19U 52)
+5 14637,17526,375 0 161077 -- MSL 22 (19U 53)
+6 14637,17700,375 0 161078 -- MSL 23 (19U 54)
+7 14637,17526,69 0 161079 -- MSL 24 (19U 55)
+8 14637,17700,375 0 161080 -- MSL 25 (19U 56)
+9 14637,17700,375 0 161081 -- MSL 26 (19U 57)
+: 7317,11805,330 0 161082 -- MSL 27 (19U 58)
+; 7317,11805,4923 1 161083 -- MSL 28 (19U 59)
+< 26346,16068 0 161084 -- MSL 29 (19U 60)
+= 23418,8634 0 161085 -- MSL 30 (19U 61)
+> 26346,16068 0 161086 -- MSL 31 (19U 62)
+? 10245,18000,330 2 161087 -- MSL 32 (19U 63)
+at 23418,16980,3654 0 161088 -- MSL 33 (19U 64)
+@ "
+A 17565,18000,69 2 161089 -- MSL 34 (19U 65)
+B 16101,18069,69 2 161090 -- MSL 35 (19U 66)
+C 17565,18375,375 2 161091 -- MSL 36 (19U 67)
+D 20490,18069,69 2 161092 -- MSL 37 (19U 68)
+E 13173,18201,201 2 161093 -- MSL 38 (19U 69)
+F 13173,18201,69 2 161094 -- MSL 39 (19U 70)
+G 20490,18375,375 2 161095 -- MSL 40 (19U 71)
+H 20490,18069,69 2 161096 -- MSL 41 (19U 72)
+I 7317,18069,69 2 161097 -- MSL 42 (19U 73)
+J 7317,18069,3855 2 161098 -- MSL 43 (19U 74)
+K 16101,18069,69 2 161099 -- MSL 44 (19U 75)
+L 13173,18069,201 2 161100 -- MSL 45 (19U 76)
+M 23418,18000,69 2 161101 -- MSL 46 (19U 77)
+N 20490,18069,375 2 161102 -- MSL 47 (19U 78)
+O 21954,18375,375 2 161103 -- MSL 48 (19U 79)
+P 14637,18069,69 2 161104 -- MSL 49 (19U 80)
+Q 21954,18375,5400 3 161105 -- MSL 50 (19U 81)
+R 16101,18069,69 2 161106 -- MSL 51 (19U 82)
+S 13173,18375,375 2 161107 -- MSL 52 (19U 83)
+T 14637,18201,69 2 161108 -- MSL 53 (19U 84)
+U 20490,18069,375 2 161109 -- MSL 54 (19U 85)
+V 17565,18069,69 2 161110 -- MSL 55 (19U 86)
+W 26346,18069,69 2 161111 -- MSL 56 (19U 87)
+X 16101,18069,69 2 161112 -- MSL 57 (19U 88)
+Y 16101,18069,69 2 161113 -- MSL 58 (19U 89)
+Z 16101,18201,201 2 161114 -- MSL 59 (19U 90)
+lB 7317,18204,4179 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 7317,19566,396 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 7317,18204,4179 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588 1 161119 -- MSL 64 (19U 95)
+oq 7317,18375 2 161169 -- MSL 66 (19U 145)
+` "
+a 12684,12795,330 0 161121 -- MSL 67 (19U 97)
+b 14637,19569,330 2 161122 -- MSL 68 (19U 98)
+c 12684,12795,330 0 161123 -- MSL 69 (19U 99)
+d 14637,19569,330 2 161124 -- MSL 70 (19U 100)
+e 13173,12795,330 0 161125 -- MSL 71 (19U 101)
+f 7317,19710,69 2 161126 -- MSL 72 (19U 102)
+g 13173,12882,5400 1 161127 -- MSL 73 (19U 103)
+h 14637,19569,69 2 161128 -- MSL 74 (19U 104)
+i 7317,18399,69 2 161129 -- MSL 75 (19U 105)
+j 7317,18399,5400 3 161130 -- MSL 76 (19U 106)
+k 13173,19569,69 2 161131 -- MSL 77 (19U 107)
+l 7317,19569,69 2 161132 -- MSL 78 (19U 108)
+m 21954,12795,69 0 161133 -- MSL 79 (19U 109)
+n 14637,12795,69 0 161134 -- MSL 80 (19U 110)
+o 14637,12795,330 0 161135 -- MSL 81 (19U 111)
+p 14637,12795,5469 1 161136 -- MSL 82 (19U 112)
+q 14637,12795,5469 1 161137 -- MSL 83 (19U 113)
+r 8781,12795,69 0 161138 -- MSL 84 (19U 114)
+s 10245,12795,330 0 161139 -- MSL 85 (19U 115)
+t 7317,16185,330 0 161140 -- MSL 86 (19U 116)
+u 14637,12534,330 0 161141 -- MSL 87 (19U 117)
+v 13173,12534,69 0 161142 -- MSL 88 (19U 118)
+w 20490,12534,69 0 161143 -- MSL 89 (19U 119)
+x 13173,12534,69 0 161144 -- MSL 90 (19U 120)
+y 13173,12534,5469 1 161145 -- MSL 91 (19U 121)
+z 13173,12666,201 0 161146 -- MSL 92 (19U 122)
+{ 11709,19935,6210 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588 3 161148 -- MSL 94 (19U 124)
+ba "
+} 11709,19935,6210 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,8952 0 161150 -- MSL 96 (19U 126)
+`A 17565,23730,69 2 161216 -- MSL 99 (19U 192)
+^A 17565,23760,69 2 161218 -- MSL 100 (19U 194)
+`E 13173,23730,201 2 161224 -- MSL 101 (19U 200)
+^E 13173,23760,201 2 161226 -- MSL 102 (19U 202)
+:E 13173,22902,201 2 161227 -- MSL 103 (19U 203)
+^I 7317,23760,69 2 161230 -- MSL 104 (19U 206)
+:I 7317,22902,69 2 161231 -- MSL 105 (19U 207)
+aa 14637,18189 2 161204 -- MSL 106 (19U 180)
+ga 14637,18189 2 161120 -- MSL 107 (19U 96)
+a^ 14637,18000 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 14637,17223 0 161192 -- MSL 109 (19U 168)
+~ 14637,16980 0 161176 -- MSL 110 (19U 152)
+a~ "
+`U 20490,23730,375 2 161241 -- MSL 111 (19U 217)
+^U 20490,23760,375 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105 2 161199 -- MSL 113 (19U 175)
+'Y 16101,23730,69 2 161245 -- MSL 114 (19U 221)
+'y 13173,18189,5469 3 161277 -- MSL 115 (19U 253)
+de 14637,17700 0 161200 -- MSL 116 (19U 176)
+,C 17565,18375,5988 3 161223 -- MSL 117 (19U 199)
+,c 12684,12795,5673 1 161255 -- MSL 118 (19U 231)
+~N 20490,22707,375 2 161233 -- MSL 119 (19U 209)
+~n 14637,16980,69 0 161265 -- MSL 120 (19U 241)
+r! 7317,12696,5634 1 161185 -- MSL 121 (19U 161)
+r? 10245,12696,5634 1 161215 -- MSL 122 (19U 191)
+Cs 14637,15684 0 161188 -- MSL 123 (19U 164)
+Po 14637,17700,201 0 161187 -- MSL 124 (19U 163)
+Ye 14637,17769,69 2 161189 -- MSL 125 (19U 165)
+sc 14637,18000,3633 2 161191 -- MSL 126 (19U 167)
+Fn 14637,19710,69 2 161155 -- MSL 127 (19U 131)
+ct 14637,19155,93 2 161186 -- MSL 128 (19U 162)
+^a 12684,18000,330 2 161250 -- MSL 129 (19U 226)
+^e 13173,18000,330 2 161258 -- MSL 130 (19U 234)
+^o 14637,18000,330 2 161268 -- MSL 131 (19U 244)
+^u 14637,18000,330 2 161275 -- MSL 132 (19U 251)
+'a 12684,18189,330 2 161249 -- MSL 133 (19U 225)
+'e 13173,18189,330 2 161257 -- MSL 134 (19U 233)
+'o 14637,18189,330 2 161267 -- MSL 135 (19U 243)
+'u 14637,18189,330 2 161274 -- MSL 136 (19U 250)
+`a 12684,18189,330 2 161248 -- MSL 137 (19U 224)
+`e 13173,18189,330 2 161256 -- MSL 138 (19U 232)
+`o 14637,18189,330 2 161266 -- MSL 139 (19U 242)
+`u 14637,18189,330 2 161273 -- MSL 140 (19U 249)
+:a 12684,17223,330 0 161252 -- MSL 141 (19U 228)
+:e 13173,17223,330 0 161259 -- MSL 142 (19U 235)
+:o 14637,17223,330 0 161270 -- MSL 143 (19U 246)
+:u 14637,17223,330 0 161276 -- MSL 144 (19U 252)
+oA 17565,23964,69 2 161221 -- MSL 145 (19U 197)
+^i 7317,18000,69 2 161262 -- MSL 146 (19U 238)
+/O 21954,18375,375 2 161240 -- MSL 147 (19U 216)
+AE 21468,18201,201 2 161222 -- MSL 148 (19U 198)
+oa 12684,18045,330 2 161253 -- MSL 149 (19U 229)
+'i 7317,18189,69 2 161261 -- MSL 150 (19U 237)
+/o 14637,12876,330 0 161272 -- MSL 151 (19U 248)
+ae 20490,12795,330 0 161254 -- MSL 152 (19U 230)
+:A 17565,22902,69 2 161220 -- MSL 153 (19U 196)
+`i 7317,18189,69 2 161260 -- MSL 154 (19U 236)
+:O 21954,22902,375 2 161238 -- MSL 155 (19U 214)
+:U 20490,22902,375 2 161244 -- MSL 156 (19U 220)
+'E 13173,23730,201 2 161225 -- MSL 157 (19U 201)
+:i 7317,17223,69 0 161263 -- MSL 158 (19U 239)
+ss 14637,19710,330 2 161247 -- MSL 159 (19U 223)
+^O 21954,23760,375 2 161236 -- MSL 160 (19U 212)
+'A 17565,23730,69 2 161217 -- MSL 161 (19U 193)
+~A 17565,22707,69 2 161219 -- MSL 162 (19U 195)
+~a 12684,16980,330 0 161251 -- MSL 163 (19U 227)
+-D 20490,18069,69 2 161232 -- MSL 164 (19U 208)
+Sd 14637,19500,330 2 161264 -- MSL 165 (19U 240)
+'I 7317,23730,69 2 161229 -- MSL 166 (19U 205)
+`I 7317,23730,69 2 161228 -- MSL 167 (19U 204)
+'O 21954,23730,375 2 161235 -- MSL 168 (19U 211)
+`O 21954,23730,375 2 161234 -- MSL 169 (19U 210)
+~O 21954,22707,375 2 161237 -- MSL 170 (19U 213)
+~o 14637,16980,330 0 161269 -- MSL 171 (19U 245)
+vS 13173,23760,375 2 161162 -- MSL 172 (19U 138)
+vs 10245,18183,330 2 161178 -- MSL 173 (19U 154)
+'U 20490,23730,375 2 161242 -- MSL 174 (19U 218)
+:Y 16101,22902,69 2 161183 -- MSL 175 (19U 159)
+:y 13173,17223,5469 1 161279 -- MSL 176 (19U 255)
+TP 14637,18069,69 2 161246 -- MSL 177 (19U 222)
+Tp 14637,19569,5469 3 161278 -- MSL 178 (19U 254)
+mc 14637,12630,4350 0 161205 -- MSL 180 (19U 181)
+ps 14637,19635,4200 2 161206 -- MSL 181 (19U 182)
+34 23418,17700,519 0 161214 -- MSL 182 (19U 190)
+\- 23418,7122 0 60096 -- MSL 183 ( 7J 192)
+14 23418,17700,519 0 161212 -- MSL 184 (19U 188)
+12 23418,17700,519 0 161213 -- MSL 185 (19U 189)
+Of 10734,17700 0 161194 -- MSL 186 (19U 170)
+Om 10734,17700 0 161210 -- MSL 187 (19U 186)
+Fo 9759,10809 0 161195 -- MSL 188 (19U 171)
+Fc 9759,10809 0 161211 -- MSL 190 (19U 187)
+t+- 23418,13260,3132 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916 3 161190 -- MSL 192 (19U 166)
+co 13173,19635 2 161193 -- MSL 193 (19U 169)
+tno 23418,10671 0 161196 -- MSL 194 (19U 172)
+u00AD 7317,7275 0 161197 -- MSL 195 (19U 173)
+rg 13173,19635 2 161198 -- MSL 196 (19U 174)
+S2 9759,17700 0 161202 -- MSL 197 (19U 178)
+S3 9759,17700 0 161203 -- MSL 198 (19U 179)
+ac 14637,0,5673 1 161208 -- MSL 199 (19U 184)
+S1 9759,17700 0 161209 -- MSL 200 (19U 185)
+tmu 23418,13137,585 0 161239 -- MSL 201 (19U 215)
+tdi 23418,11139 0 161271 -- MSL 202 (19U 247)
+u203C 13662,18000,330 2 87315 -- MSL 221 (10U 19)
+u20A7 21954,18069,330 2 60121 -- MSL 232 ( 7J 217)
+pc 7317,10407 0 161207 -- MSL 302 (19U 183)
+u013F 13173,18069,201 2 51943 -- MSL 306 ( 6J 231)
+u0140 10245,19569,69 2 51959 -- MSL 307 ( 6J 247)
+u2113 14637,18150,297 2 60122 -- MSL 308 ( 7J 218)
+u0149 20490,18375,69 2 51951 -- MSL 309 ( 6J 239)
+fm 7317,17700 0 60101 -- MSL 310 ( 7J 197)
+sd 14637,17700 0 60102 -- MSL 311 ( 7J 198)
+dg 14637,18213,846 2 161158 -- MSL 312 (19U 134)
+tm 16101,17850 2 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588 1 60095 -- MSL 314 ( 7J 191)
+ah 14637,18183 2 75169 -- MSL 315 ( 9E 161)
+ao 14637,18045 2 60152 -- MSL 316 ( 7J 248)
+f/ 2439,17637,519 0 60109 -- MSL 324 ( 7J 205)
+em 23418,6867 0 161175 -- MSL 325 (19U 151)
+en 14637,6867 0 161174 -- MSL 326 (19U 150)
+dd 14637,18213,846 2 161159 -- MSL 327 (19U 135)
+.i 7317,12534,69 0 46333 -- MSL 328 ( 5T 253)
+aq 7317,18375 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226 0 161173 -- MSL 331 (19U 149)
+u207F 12198,17700 0 87548 -- MSL 332 (10U 252)
+u0111 14637,19569,330 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 17565,23991,69 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 12684,18111,330 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 17565,18000,4761 2 75173 -- MSL 404 ( 9E 165)
+u0061_0328 12684,12795,3885 0 75193 -- MSL 405 ( 9E 185)
+'C 17565,23730,375 2 75206 -- MSL 406 ( 9E 198)
+'c 12684,18189,330 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 17565,23760,375 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 12684,18183,330 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 20490,23760,69 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 16587,19710,330 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 13173,23760,201 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 13173,18183,330 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 13173,18201,4761 2 75210 -- MSL 422 ( 9E 202)
+u0065_0328 13173,12795,4560 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 13173,23730,201 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 7317,25119,69 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 13173,18516,201 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 8781,19710,69 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 20490,23730,375 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 14637,18189,69 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 20490,23760,375 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 14637,18183,69 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 21954,23730,375 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 14637,18189,330 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 16101,23730,69 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 8781,18189,69 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 16101,23760,69 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 8781,18183,69 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 13173,23730,375 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 10245,18189,330 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 14637,23760,69 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 8295,19710,330 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 14637,18201,5988 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 7317,16185,5673 1 75262 -- MSL 469 ( 9E 254)
+u0055_030B 20490,23730,375 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 14637,18189,330 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 20490,23964,375 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 14637,18045,330 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 16101,23730,201 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 13173,18189,201 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 16101,22902,201 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 13173,17223,201 0 75199 -- MSL 485 ( 9E 191)
+u2070 9759,17700 0 51753 -- MSL 1000 ( 6J 41)
+u2074 9759,17562 0 51748 -- MSL 1001 ( 6J 36)
+u2075 9759,17694 0 51749 -- MSL 1002 ( 6J 37)
+u2076 9759,17700 0 51806 -- MSL 1003 ( 6J 94)
+u2077 9759,17655 0 51750 -- MSL 1004 ( 6J 38)
+u2078 9759,17700 0 51754 -- MSL 1005 ( 6J 42)
+u2079 9759,17700 0 51752 -- MSL 1006 ( 6J 40)
+lq 11220,18375 2 161171 -- MSL 1017 (19U 147)
+rq 11220,18375 2 161172 -- MSL 1018 (19U 148)
+Bq 11220,2718,4509 0 161156 -- MSL 1019 (19U 132)
+u2003 23418,0 0 51821 -- MSL 1020 ( 6J 109)
+u2002 14637,0 0 51822 -- MSL 1021 ( 6J 110)
+u2009 7317,0 0 51828 -- MSL 1023 ( 6J 116)
+u2026 23418,2667 0 161157 -- MSL 1028 (19U 133)
+vz 13173,18183,201 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,18000 2 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056 2 51794 -- MSL 1036 ( 6J 82)
+fi 14148,19710,69 2 60077 -- MSL 1040 ( 7J 173)
+fl 14148,19779,69 2 60078 -- MSL 1041 ( 7J 174)
+ff 14637,19710,69 2 51883 -- MSL 1042 ( 6J 171)
+Fi 21468,19710,69 2 51884 -- MSL 1043 ( 6J 172)
+Fl 21468,19779,69 2 51885 -- MSL 1044 ( 6J 173)
+ij 14148,18399,5400 3 60134 -- MSL 1047 ( 7J 230)
+u2105 23418,19668,519 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 20490,23991,375 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 13173,18111,5400 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 13173,18375,5988 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 10245,12795,5673 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 7317,22902,69 2 46301 -- MSL 1065 ( 5T 221)
+bq 7317,2718,4509 0 161154 -- MSL 1067 (19U 130)
+%0 32202,17769,444 2 161161 -- MSL 1068 (19U 137)
+a- 14637,16662 0 60154 -- MSL 1084 ( 7J 250)
+ab 14637,18111 2 75170 -- MSL 1086 ( 9E 162)
+a. 14637,17223 0 75263 -- MSL 1088 ( 9E 255)
+oe 23418,12795,330 0 161180 -- MSL 1090 (19U 156)
+OE 24396,18375,375 2 161164 -- MSL 1091 (19U 140)
+fo 5856,10809 0 161163 -- MSL 1092 (19U 139)
+fc 5856,10809 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624 0 60091 -- MSL 1094 ( 7J 187)
+/L 13173,18069,201 2 75171 -- MSL 1095 ( 9E 163)
+/l 7317,19569,69 2 75187 -- MSL 1096 ( 9E 179)
+a" 14637,18189 2 75197 -- MSL 1097 ( 9E 189)
+ho 14637,1059,3885 0 75186 -- MSL 1098 ( 9E 178)
+vZ 16101,23760,201 2 75150 -- MSL 1106 ( 9E 142)
+IJ 14637,18069,3855 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/S b/font/devlj4/S
new file mode 100644
index 0000000..1dff9f7
--- /dev/null
+++ b/font/devlj4/S
@@ -0,0 +1,319 @@
+# Symbol
+name S
+special
+spacewidth 7806
+pcltypeface 4101 # XXX: same as CG Times? Why?
+pclproportional 1
+pclweight 0
+pclstyle 0
+kernpairs
+*T *A -2924
+*A *T -2924
+*R *A -3902
+*O *T -1949
+*O *A -2438
+*B *T -1949
+*A *O -2438
+*T *O -1949
+*O *X -1460
+*B *X -1460
+*B *A -1949
+*X *O -1460
+*K *O -1460
+*O *Z -485
+*Z *O -485
+*B *Z -485
+*N *A -485
+*K *T -485
+charset
+pl 23418,15750 0 68907 -- MSL 12 ( 8M 43)
+eq 23418,10875 0 68925 -- MSL 30 ( 8M 61)
+*A 19029,18225 2 68929 -- MSL 34 ( 8M 65)
+*B 16587,17895 2 68930 -- MSL 35 ( 8M 66)
+*E 16587,17895 2 68933 -- MSL 38 ( 8M 69)
+*Y 19515,17895 2 68935 -- MSL 41 ( 8M 71)
+*I 8781,17895 2 68937 -- MSL 42 ( 8M 73)
+*K 18540,17895 2 68938 -- MSL 44 ( 8M 74)
+*M 23907,17895 2 68940 -- MSL 46 ( 8M 76)
+*N 19515,17895,330 2 68941 -- MSL 47 ( 8M 77)
+*O 19029,18225,330 2 68943 -- MSL 48 ( 8M 79)
+*R 15126,17895 2 68945 -- MSL 49 ( 8M 81)
+*T 16587,17895 2 68947 -- MSL 53 ( 8M 83)
+*X 19029,17895 2 68950 -- MSL 57 ( 8M 86)
+*Z 17076,17895 2 68934 -- MSL 59 ( 8M 70)
+ap 26346,8952 0 44414 -- MSL 96 ( 5M 126)
+u2592 26346,19758,6588 3 68991 -- MSL 97 ( 8M 127)
+mi 23418,8610 0 68909 -- MSL 183 ( 8M 45)
+u25A0 19029,15624 0 60089 -- MSL 189 ( 7J 185)
++- 23418,15750,2625 0 69118 -- MSL 191 ( 8M 254)
+no 23418,12165 0 69064 -- MSL 194 ( 8M 200)
+mu 23418,15117 0 68906 -- MSL 201 ( 8M 42)
+di 23418,14010 0 68901 -- MSL 202 ( 8M 37)
+u263A 26346,19500 2 87297 -- MSL 203 (10U 1)
+u263B 26346,19500 2 87298 -- MSL 204 (10U 2)
+HE 26346,19500 2 44457 -- MSL 205 ( 5M 169)
+DI 26346,19500,840 2 44456 -- MSL 206 ( 5M 168)
+CL 26346,18951 2 44455 -- MSL 207 ( 5M 167)
+SP 26346,19851 2 44458 -- MSL 208 ( 5M 170)
+u25CF 19029,16005 0 69068 -- MSL 209 ( 8M 204)
+u25D8 26346,22242,4104 2 87304 -- MSL 210 (10U 8)
+u25D9 26346,22242,4104 2 87306 -- MSL 212 (10U 10)
+u2642 19029,19758 2 87307 -- MSL 213 (10U 11)
+u2640 19029,19758 2 87308 -- MSL 214 (10U 12)
+u266A 13173,19476 2 87309 -- MSL 215 (10U 13)
+u266B 19029,19476,5025 2 87310 -- MSL 216 (10U 14)
+u263C 26346,18777 2 87311 -- MSL 217 (10U 15)
+u25BA 19029,12924 0 87312 -- MSL 218 (10U 16)
+u25C4 19029,12924 0 87313 -- MSL 219 (10U 17)
+va 19029,17670 2 69033 -- MSL 220 ( 8M 169)
+u25AC 26346,5229 0 87318 -- MSL 222 (10U 22)
+u21A8 19029,17670,3891 2 87319 -- MSL 223 (10U 23)
+ua 19029,17670 2 69025 -- MSL 224 ( 8M 161)
+da 19029,17670 2 69027 -- MSL 225 ( 8M 163)
+-> 19029,12231 0 69026 -- MSL 226 ( 8M 162)
+<- 19029,12231 0 69028 -- MSL 227 ( 8M 164)
+u221F 23418,12165 0 87324 -- MSL 228 (10U 28)
+<> 19029,12453 0 69034 -- MSL 229 ( 8M 170)
+u25B2 19029,12510 0 87326 -- MSL 230 (10U 30)
+u25BC 19029,12510 0 87327 -- MSL 231 (10U 31)
+u2310 23418,12165 0 87465 -- MSL 233 (10U 169)
+u2591 26346,19758,2196 2 87472 -- MSL 234 (10U 176)
+u2593 26346,19758,6588 3 87474 -- MSL 235 (10U 178)
+u2502 26346,19758,6588 3 128375 -- MSL 236 (15U 119)
+u2524 26346,19758,6588 3 128373 -- MSL 237 (15U 117)
+u2561 26346,19758,6588 3 87477 -- MSL 238 (10U 181)
+u2562 26346,19758,6588 3 87478 -- MSL 239 (10U 182)
+u2556 26346,7410,6588 1 87479 -- MSL 240 (10U 183)
+u2555 26346,9879,6588 1 87480 -- MSL 241 (10U 184)
+u2563 26346,19758,6588 3 87481 -- MSL 242 (10U 185)
+u2551 26346,19758,6588 3 87482 -- MSL 243 (10U 186)
+u2557 26346,9879,6588 1 87483 -- MSL 244 (10U 187)
+u255D 26346,19758 2 87484 -- MSL 245 (10U 188)
+u255C 26346,19758 2 87485 -- MSL 246 (10U 189)
+u255B 26346,19758 2 87486 -- MSL 247 (10U 190)
+u2510 26346,7410,6588 1 128368 -- MSL 248 (15U 112)
+u2514 26346,19758 2 128353 -- MSL 249 (15U 97)
+u2534 26346,19758 2 128374 -- MSL 250 (15U 118)
+u252C 26346,7410,6588 1 128372 -- MSL 251 (15U 116)
+u251C 26346,19758,6588 3 128357 -- MSL 252 (15U 101)
+u2500 26346,7410 0 128358 -- MSL 253 (15U 102)
+u253C 26346,19758,6588 3 128356 -- MSL 254 (15U 100)
+u255E 26346,19758,6588 3 87494 -- MSL 255 (10U 198)
+u255F 26346,19758,6588 3 87495 -- MSL 256 (10U 199)
+u255A 26346,19758 2 87496 -- MSL 257 (10U 200)
+u2554 26346,9879,6588 1 87497 -- MSL 258 (10U 201)
+u2569 26346,19758 2 87498 -- MSL 259 (10U 202)
+u2566 26346,9879,6588 1 87499 -- MSL 260 (10U 203)
+u2560 26346,19758,6588 3 87500 -- MSL 261 (10U 204)
+u2550 26346,9879 0 87501 -- MSL 262 (10U 205)
+u256C 26346,19758,6588 3 87502 -- MSL 263 (10U 206)
+u2567 26346,19758 2 87503 -- MSL 264 (10U 207)
+u2568 26346,19758 2 87504 -- MSL 265 (10U 208)
+u2564 26346,9879,6588 1 87505 -- MSL 266 (10U 209)
+u2565 26346,7410,6588 1 87506 -- MSL 267 (10U 210)
+u2559 26346,19758 2 87507 -- MSL 268 (10U 211)
+u2558 26346,19758 2 87508 -- MSL 269 (10U 212)
+u2552 26346,9879,6588 1 87509 -- MSL 270 (10U 213)
+u2553 26346,7410,6588 1 87510 -- MSL 271 (10U 214)
+u256B 26346,19758,6588 3 87511 -- MSL 272 (10U 215)
+u256A 26346,19758,6588 3 87512 -- MSL 273 (10U 216)
+u2518 26346,19758 2 128369 -- MSL 274 (15U 113)
+u250C 26346,7410,6588 1 128352 -- MSL 275 (15U 96)
+u2588 26346,19758,6588 3 87515 -- MSL 276 (10U 219)
+u2584 26346,6585,6588 1 87516 -- MSL 277 (10U 220)
+u258C 26346,19758,6588 3 87517 -- MSL 278 (10U 221)
+u2590 26346,19758,6588 3 87518 -- MSL 279 (10U 222)
+u2580 26346,19758 2 87519 -- MSL 280 (10U 223)
+if 26346,12846 0 68900 -- MSL 292 ( 8M 36)
+ca 26346,16650 0 69046 -- MSL 295 ( 8M 182)
+== 26346,11634 0 68989 -- MSL 296 ( 8M 125)
+>= 26346,15960 0 68958 -- MSL 297 ( 8M 94)
+<= 26346,15960 0 68956 -- MSL 298 ( 8M 92)
+u2320 19029,19758,6588 3 69093 -- MSL 299 ( 8M 229)
+u2321 19029,19758,6588 3 69095 -- MSL 300 ( 8M 231)
+~~ 26346,11172 0 68927 -- MSL 301 ( 8M 63)
+~= "
+md 8781,10407 0 69066 -- MSL 302 ( 8M 202)
+u221A 19029,19935,4647 2 101059 -- MSL 303 (12J 195)
+u25AA 13173,14232 0 60088 -- MSL 305 ( 7J 184)
+u2302 26346,18960 2 87423 -- MSL 333 (10U 127)
+sr 19029,23322 2 68897 -- MSL 500 ( 8M 33)
+sqrt "
+pt 26346,12723 0 68902 -- MSL 501 ( 8M 38)
+u212F 11709,12180,300 0 68922 -- MSL 502 ( 8M 58)
+*e 11709,12705,555 0 68923 -- MSL 503 ( 8M 59)
+tf 26346,16545 0 68928 -- MSL 504 ( 8M 64)
+3d "
+*G 16101,18045 2 68931 -- MSL 505 ( 8M 67)
+*D 17565,18045 2 68932 -- MSL 506 ( 8M 68)
+*H 19029,18450,405 2 68936 -- MSL 507 ( 8M 72)
+*L 17565,18045 2 68939 -- MSL 508 ( 8M 75)
+*C 17565,19335,1752 2 68942 -- MSL 509 ( 8M 78)
+*P 19029,18045 2 68944 -- MSL 510 ( 8M 80)
+*S 16101,18045 2 68946 -- MSL 511 ( 8M 82)
+*U 16101,18450 2 68948 -- MSL 512 ( 8M 84)
+*F 17565,18045 2 68949 -- MSL 513 ( 8M 85)
+*Q 20490,18045 2 68951 -- MSL 514 ( 8M 87)
+*W 16101,18450 2 68952 -- MSL 515 ( 8M 88)
+gr 17565,18045 2 68953 -- MSL 516 ( 8M 89)
+pd 13173,18450,405 2 68954 -- MSL 517 ( 8M 90)
+ts 13173,12600,4734 0 68955 -- MSL 518 ( 8M 91)
+!= 26346,15396,1197 0 68957 -- MSL 519 ( 8M 93)
+u2235 26346,16545 0 68960 -- MSL 521 ( 8M 96)
+*a 16101,11205,405 0 68961 -- MSL 522 ( 8M 97)
+*b 14637,18450,4260 2 68962 -- MSL 523 ( 8M 98)
+*g 14637,11205,5595 1 68963 -- MSL 524 ( 8M 99)
+*d 11709,18450,405 2 68964 -- MSL 525 ( 8M 100)
++e 10245,11205,405 0 68965 -- MSL 526 ( 8M 101)
+*z 11709,17508,4920 2 68966 -- MSL 527 ( 8M 102)
+*y 13173,11205,5283 1 68967 -- MSL 528 ( 8M 103)
+*h 11709,18450,405 2 68968 -- MSL 529 ( 8M 104)
+*i 7317,10800,405 0 68969 -- MSL 530 ( 8M 105)
+*k 11709,11205,405 0 68970 -- MSL 531 ( 8M 106)
+*l 14637,18450,405 2 68971 -- MSL 532 ( 8M 107)
+*m 14637,10800,5595 1 68972 -- MSL 533 ( 8M 108)
+*n 11709,11205,405 0 68973 -- MSL 534 ( 8M 109)
+*c 13173,18450,4647 2 68974 -- MSL 535 ( 8M 110)
+*o 11709,11205,405 0 68975 -- MSL 536 ( 8M 111)
+*p 16101,11295,405 0 68976 -- MSL 537 ( 8M 112)
+*r 13173,11205,4527 0 68977 -- MSL 538 ( 8M 113)
+*s 13173,11544,405 0 68978 -- MSL 539 ( 8M 114)
+*t 11709,11295,405 0 68979 -- MSL 540 ( 8M 115)
+*u 11709,11205,405 0 68980 -- MSL 541 ( 8M 116)
+*f 16101,17304,4314 2 68981 -- MSL 542 ( 8M 117)
+*x 14637,11205,4734 0 68982 -- MSL 543 ( 8M 118)
+*q 16101,18450,4734 2 68983 -- MSL 544 ( 8M 119)
+*w 16101,11205,405 0 68984 -- MSL 545 ( 8M 120)
++h 16101,18450,405 2 68985 -- MSL 546 ( 8M 121)
++f 16101,11205,4608 0 68986 -- MSL 547 ( 8M 122)
++p 16101,11442,405 0 68987 -- MSL 548 ( 8M 123)
+|= 26346,11436 0 68988 -- MSL 549 ( 8M 124)
+ne 26346,15300,966 0 68990 -- MSL 550 ( 8M 126)
+uA 19029,17553,1536 2 69029 -- MSL 551 ( 8M 165)
+arrowverttp "
+rh 19029,13407 0 69030 -- MSL 552 ( 8M 166)
+rA "
+dA 19029,17553,1536 2 69031 -- MSL 553 ( 8M 167)
+arrowvertbt "
+lh 19029,13407 0 69032 -- MSL 554 ( 8M 168)
+lA "
+vA 19029,17553,1812 2 69035 -- MSL 555 ( 8M 171)
+hA 19029,14346 0 69036 -- MSL 556 ( 8M 172)
+u21C4 26346,17259 2 69037 -- MSL 557 ( 8M 173)
+u21C6 26346,17259 2 69038 -- MSL 558 ( 8M 174)
+u21C0 19029,24993 2 69039 -- MSL 559 ( 8M 175)
+radicalex 19029,23322 2 69040 -- MSL 560 ( 8M 176)
+fa 15612,15153 0 69041 -- MSL 561 ( 8M 177)
+te 11220,15165 0 69042 -- MSL 562 ( 8M 178)
+u22A4 26346,16560 0 69043 -- MSL 563 ( 8M 179)
+pp 26346,16560 0 69044 -- MSL 564 ( 8M 180)
+cu 26346,16650 0 69045 -- MSL 565 ( 8M 181)
+mo 26346,17925 2 69047 -- MSL 566 ( 8M 183)
+u220B 26346,17925 2 69048 -- MSL 567 ( 8M 184)
+nm 26346,20625,2700 2 69049 -- MSL 568 ( 8M 185)
+sb 26346,16290 0 69050 -- MSL 569 ( 8M 186)
+sp 26346,16290 0 69051 -- MSL 570 ( 8M 187)
+nb 26346,18165,1875 2 69052 -- MSL 571 ( 8M 188)
+nc 26346,18165,1875 2 69053 -- MSL 572 ( 8M 189)
+ib 26346,16641 0 69054 -- MSL 573 ( 8M 190)
+ip 26346,16641 0 69055 -- MSL 574 ( 8M 191)
+c+ 26346,18900 2 69056 -- MSL 575 ( 8M 192)
+u2299 26346,18900 2 69057 -- MSL 576 ( 8M 193)
+c* 26346,18900 2 69058 -- MSL 577 ( 8M 194)
+u2296 26346,18900 2 69059 -- MSL 578 ( 8M 195)
+u2298 26346,18900 2 69060 -- MSL 579 ( 8M 196)
+AN 26346,15240 0 69061 -- MSL 580 ( 8M 197)
+OR 26346,15240 0 69062 -- MSL 581 ( 8M 198)
+u22BB 26346,15240,3783 0 69063 -- MSL 582 ( 8M 199)
+u2218 26346,13518 0 69065 -- MSL 583 ( 8M 201)
+ci 26346,18900 2 69069 -- MSL 584 ( 8M 205)
+u22A3 26346,14400 0 69073 -- MSL 585 ( 8M 209)
+u22A2 26346,14400 0 69074 -- MSL 586 ( 8M 210)
+is 26346,20268,5997 3 69077 -- MSL 587 ( 8M 213)
+integral "
+u222E 26346,20268,5997 3 69078 -- MSL 588 ( 8M 214)
+/_ 26346,19365 2 69079 -- MSL 589 ( 8M 215)
+es 26346,18465,435 2 69080 -- MSL 590 ( 8M 216)
+Ah 13173,13980 0 69081 -- MSL 591 ( 8M 217)
+u2136 11709,13980 0 69082 -- MSL 592 ( 8M 218)
+u2137 8781,13980 0 69083 -- MSL 593 ( 8M 219)
+u212D 17565,18255,1890 2 69084 -- MSL 594 ( 8M 220)
+Im 19029,18255,1890 2 69085 -- MSL 595 ( 8M 221)
+Re 20490,18255,1890 2 69086 -- MSL 596 ( 8M 222)
+u2128 16101,18255,5280 3 69087 -- MSL 597 ( 8M 223)
+lc 19029,23322,5124 3 69088 -- MSL 598 ( 8M 224)
+bracketlefttp "
+lf 19029,23322,5124 3 69089 -- MSL 599 ( 8M 225)
+bracketleftbt "
+parenlefttp 19029,22225,3995 3 69090 -- MSL 600 ( 8M 226)
+lt "
+bracelefttp "
+lk 19029,22225,3995 3 69091 -- MSL 601 ( 8M 227)
+braceleftmid "
+parenleftbt 19029,22225,3995 3 69092 -- MSL 602 ( 8M 228)
+lb "
+braceleftbt "
+integralcrvmid 19029,22225,6588 3 69094 -- MSL 603 ( 8M 230)
+arrowvertex 19029,23322,6588 3 69097 -- MSL 605 ( 8M 233)
+rc 19029,23322,5124 3 69104 -- MSL 608 ( 8M 240)
+bracketrighttp "
+rf 19029,23322,5124 3 69105 -- MSL 609 ( 8M 241)
+bracketrightbt "
+rt 19029,22225,3995 3 69106 -- MSL 610 ( 8M 242)
+parenrighttp "
+bracerighttp "
+rk 19029,22225,3995 3 69107 -- MSL 611 ( 8M 243)
+bracerightmid "
+rb 19029,22225,3995 3 69108 -- MSL 612 ( 8M 244)
+parenrightbt "
+bracerightbt "
+parenrightex 19029,22225,3995 3 69109 -- MSL 613 ( 8M 245)
+parenleftex "
+bv "
+bracerightex "
+braceleftex "
+braceex "
+bracketrightex 19029,22225,3995 3 69110 -- MSL 614 ( 8M 246)
+bracketleftex "
+barex "
+u23B7 19029,23322,5298 3 69111 -- MSL 615 ( 8M 247)
+-+ 26346,18366 2 69117 -- MSL 620 ( 8M 253)
+la 8781,21000,4950 2 44513 -- MSL 621 ( 5M 225)
+ra 8781,21000,4950 2 44529 -- MSL 622 ( 5M 241)
+=~ 26346,14187 0 69103 -- MSL 624 ( 8M 239)
+u2197 19029,17445,1557 2 128308 -- MSL 625 (15U 52)
+u2198 19029,17445,1557 2 128309 -- MSL 626 (15U 53)
+u2199 19029,17445,1557 2 128310 -- MSL 627 (15U 54)
+u2196 19029,17445,1557 2 128311 -- MSL 628 (15U 55)
+u25B5 19029,13242 0 128312 -- MSL 629 (15U 56)
+u25B9 19029,13377 0 128313 -- MSL 630 (15U 57)
+u25BF 19029,13242 0 128314 -- MSL 631 (15U 58)
+u25C3 19029,13377 0 128315 -- MSL 632 (15U 59)
+<< 26346,15294,1086 0 128316 -- MSL 633 (15U 60)
+>> 26346,15294,1086 0 128318 -- MSL 634 (15U 62)
+u2237 26346,16545 0 128320 -- MSL 635 (15U 64)
+u225C 19029,13242,2751 0 128321 -- MSL 636 (15U 65)
+u03DD 15126,13008,6534 1 128326 -- MSL 637 (15U 70)
+hbar 15126,18564,486 2 128328 -- MSL 638 (15U 72)
+-h "
+u2112 21954,20142 2 128332 -- MSL 639 (15U 76)
+wp 17076,13026,4218 0 44483 -- MSL 641 ( 5M 195)
+sum 26346,17925,5160 3 44517 -- MSL 642 ( 5M 229)
+u27E6 19029,20838,4077 2 128347 -- MSL 643 (15U 91)
+u27E7 19029,20838,4077 2 128349 -- MSL 645 (15U 93)
+u256D 26346,7410,6588 1 128354 -- MSL 646 (15U 98)
+u2570 26346,19758 2 128355 -- MSL 647 (15U 99)
+lz 26346,17844,294 2 44512 -- MSL 654 ( 5M 224)
+u256E 26346,7410,6588 1 128370 -- MSL 655 (15U 114)
+u256F 26346,19758 2 128371 -- MSL 656 (15U 115)
+u25C6 26346,16536 0 128381 -- MSL 662 (15U 125)
+st 12198,12846,396 0 69076 -- MSL 663 ( 8M 212)
+** 26346,13275 0 69102 -- MSL 664 ( 8M 238)
+an 19029,8676 0 69100 -- MSL 665 ( 8M 236)
+u221F 26346,23184 2 69075 -- MSL 668 ( 8M 211)
+CR 26346,12165 0 44479 -- MSL 1099 ( 5M 191)
+u25AB 13173,14226 0 60090 -- MSL 1108 ( 7J 186)
+u25E6 13173,14226 0 60086 -- MSL 1109 ( 7J 182)
+u25CB 19029,16008 0 60087 -- MSL 1110 ( 7J 183)
+u21B5 17337,20865 2 109211 -- MSL 1112 (13J 155)
+u2423 13173,3141,6369 1 109213 -- MSL 1114 (13J 157)
diff --git a/font/devlj4/SYMBOL b/font/devlj4/SYMBOL
new file mode 100644
index 0000000..1b7cfe0
--- /dev/null
+++ b/font/devlj4/SYMBOL
@@ -0,0 +1,220 @@
+# M Symbol
+name SYMBOL
+spacewidth 6615
+pcltypeface 16686
+pclproportional 1
+pclweight 0
+pclstyle 0
+charset
+! 8811,17919,362 2 159009 -- HP PUA U+F021 (19M 33)
+fa 18862,17518 2 159010 -- HP PUA U+F022 (19M 34)
+sh 13229,17919,362 2 159011 -- HP PUA U+F023 (19M 35)
+# "
+te 14521,17518 2 159012 -- HP PUA U+F024 (19M 36)
+% 22040,17919,723 2 159013 -- HP PUA U+F025 (19M 37)
+& 20580,17919,400 2 159014 -- HP PUA U+F026 (19M 38)
+st 11614,12196,413 0 159015 -- HP PUA U+F027 (19M 39)
+( 8811,18371,5710 3 159016 -- HP PUA U+F028 (19M 40)
+) 8811,18371,5710 3 159017 -- HP PUA U+F029 (19M 41)
+** 13229,14121 0 159018 -- HP PUA U+F02A (19M 42)
+pl 14521,13565 0 159019 -- HP PUA U+F02B (19M 43)
+, 6615,2584,4405 0 159020 -- HP PUA U+F02C (19M 44)
+mi 14521,7441 0 159021 -- HP PUA U+F02D (19M 45)
+. 6615,2506,375 0 159022 -- HP PUA U+F02E (19M 46)
+sl 7351,18371,362 2 159023 -- HP PUA U+F02F (19M 47)
+/ "
+0 13229,17880,362 2 159024 -- HP PUA U+F030 (19M 48)
+1 13229,17880 2 159025 -- HP PUA U+F031 (19M 49)
+2 13229,17880 2 159026 -- HP PUA U+F032 (19M 50)
+3 13229,17880,362 2 159027 -- HP PUA U+F033 (19M 51)
+4 13229,17880 2 159028 -- HP PUA U+F034 (19M 52)
+5 13229,17518,362 2 159029 -- HP PUA U+F035 (19M 53)
+6 13229,17880,362 2 159030 -- HP PUA U+F036 (19M 54)
+7 13229,17518,362 2 159031 -- HP PUA U+F037 (19M 55)
+8 13229,17880,362 2 159032 -- HP PUA U+F038 (19M 56)
+9 13229,17880,362 2 159033 -- HP PUA U+F039 (19M 57)
+: 7351,12196,362 0 159034 -- HP PUA U+F03A (19M 58)
+; 7351,12183,4405 0 159035 -- HP PUA U+F03B (19M 59)
+< 14521,13565 0 159036 -- HP PUA U+F03C (19M 60)
+= 14521,9831 0 159037 -- HP PUA U+F03D (19M 61)
+> 14521,13565 0 159038 -- HP PUA U+F03E (19M 62)
+? 11743,17919,349 2 159039 -- HP PUA U+F03F (19M 63)
+=~ 14521,13500 0 159040 -- HP PUA U+F040 (19M 64)
+*A 19107,17919 2 159041 -- HP PUA U+F041 (19M 65)
+*B 17648,17518 2 159042 -- HP PUA U+F042 (19M 66)
+*X 19107,17518 2 159043 -- HP PUA U+F043 (19M 67)
+*D 16188,17919 2 159044 -- HP PUA U+F044 (19M 68)
+*E 16162,17518 2 159045 -- HP PUA U+F045 (19M 69)
+*F 20193,17518 2 159046 -- HP PUA U+F046 (19M 70)
+*G 15955,17518 2 159047 -- HP PUA U+F047 (19M 71)
+*Y 19107,17518 2 159048 -- HP PUA U+F048 (19M 72)
+*I 8811,17518 2 159049 -- HP PUA U+F049 (19M 73)
++h 16691,18371,400 2 159050 -- HP PUA U+F04A (19M 74)
+*K 19107,17518 2 159051 -- HP PUA U+F04B (19M 75)
+*L 18151,17919 2 159052 -- HP PUA U+F04C (19M 76)
+*M 23526,17518 2 159053 -- HP PUA U+F04D (19M 77)
+*N 19107,17518,284 2 159054 -- HP PUA U+F04E (19M 78)
+*O 19107,17919,400 2 159055 -- HP PUA U+F04F (19M 79)
+*P 20322,17518 2 159056 -- HP PUA U+F050 (19M 80)
+*H 19611,17919,400 2 159057 -- HP PUA U+F051 (19M 81)
+*R 14715,17518 2 159058 -- HP PUA U+F052 (19M 82)
+*S 15658,17518 2 159059 -- HP PUA U+F053 (19M 83)
+*T 16162,17518 2 159060 -- HP PUA U+F054 (19M 84)
+*U 18255,17518 2 159061 -- HP PUA U+F055 (19M 85)
+ts 11614,12183,5710 1 159062 -- HP PUA U+F056 (19M 86)
+*W 20322,17919 2 159063 -- HP PUA U+F057 (19M 87)
+*C 17066,17518 2 159064 -- HP PUA U+F058 (19M 88)
+*Q 21032,17725 2 159065 -- HP PUA U+F059 (19M 89)
+*Z 16162,17518 2 159066 -- HP PUA U+F05A (19M 90)
+lB 8811,17919,5245 3 159067 -- HP PUA U+F05B (19M 91)
+[ "
+tf 22828,13139 0 159068 -- HP PUA U+F05C (19M 92)
+3d "
+rB 8811,17919,5245 3 159069 -- HP PUA U+F05D (19M 93)
+] "
+pp 17415,17518 2 159070 -- HP PUA U+F05E (19M 94)
+_ 13229,0,5710 1 159071 -- HP PUA U+F05F (19M 95)
+--- 13229,24146 2 159072 -- HP PUA U+F060 (19M 96)
+*a 16691,12183,413 0 159073 -- HP PUA U+F061 (19M 97)
+*b 14521,18371,5710 3 159074 -- HP PUA U+F062 (19M 98)
+*x 14521,12054,5710 1 159075 -- HP PUA U+F063 (19M 99)
+*d 13074,18371,400 2 159076 -- HP PUA U+F064 (19M 100)
+*e 11614,12196,400 0 159077 -- HP PUA U+F065 (19M 101)
++f 13785,18371,5710 3 159078 -- HP PUA U+F066 (19M 102)
+*g 10878,12054,5710 1 159079 -- HP PUA U+F067 (19M 103)
+*y 15955,12183,5710 1 159080 -- HP PUA U+F068 (19M 104)
+*i 8707,12183,400 0 159081 -- HP PUA U+F069 (19M 105)
+*f 15955,12183,5710 1 159082 -- HP PUA U+F06A (19M 106)
+*k 14521,12183 0 159083 -- HP PUA U+F06B (19M 107)
+*l 14521,18371,258 2 159084 -- HP PUA U+F06C (19M 108)
+*m 15245,11834,5710 1 159085 -- HP PUA U+F06D (19M 109)
+*n 13785,12196,362 0 159086 -- HP PUA U+F06E (19M 110)
+*o 14521,12183,400 0 159087 -- HP PUA U+F06F (19M 111)
+*p 14521,11834,400 0 159088 -- HP PUA U+F070 (19M 112)
+*h 13785,18371,400 2 159089 -- HP PUA U+F071 (19M 113)
+*r 14521,12196,5710 1 159090 -- HP PUA U+F072 (19M 114)
+*s 15955,11834,400 0 159091 -- HP PUA U+F073 (19M 115)
+*t 11614,11834,400 0 159092 -- HP PUA U+F074 (19M 116)
+*u 15245,12183,400 0 159093 -- HP PUA U+F075 (19M 117)
++p 18862,11834,400 0 159094 -- HP PUA U+F076 (19M 118)
+*w 18151,12183,400 0 159095 -- HP PUA U+F077 (19M 119)
+*c 13048,18371,5710 3 159096 -- HP PUA U+F078 (19M 120)
+*q 18151,12196,5710 1 159097 -- HP PUA U+F079 (19M 121)
+*z 13074,18281,5814 3 159098 -- HP PUA U+F07A (19M 122)
+lC 12699,18371,5710 3 159099 -- HP PUA U+F07B (19M 123)
+{ "
+ba 5297,18371,5710 3 159100 -- HP PUA U+F07C (19M 124)
+| "
+rC 12699,18371,5710 3 159101 -- HP PUA U+F07D (19M 125)
+} "
+ap 14521,8888 0 159102 -- HP PUA U+F07E (19M 126)
+u03D2 16407,17919 2 159137 -- HP PUA U+F0A1 (19M 161)
+fm 6537,17919 2 159138 -- HP PUA U+F0A2 (19M 162)
+<= 14521,16420 0 159139 -- HP PUA U+F0A3 (19M 163)
+f/ 4418,17880,698 2 159140 -- HP PUA U+F0A4 (19M 164)
+if 18862,12196 0 159141 -- HP PUA U+F0A5 (19M 165)
+u0192 13229,18371,5710 3 159142 -- HP PUA U+F0A6 (19M 166)
+CL 19921,14599 0 159143 -- HP PUA U+F0A7 (19M 167)
+DI 19921,14922,400 0 159144 -- HP PUA U+F0A8 (19M 168)
+HE 19921,14340,400 0 159145 -- HP PUA U+F0A9 (19M 169)
+SP 19921,15232 0 159146 -- HP PUA U+F0AA (19M 170)
+<> 27569,13190,362 0 159147 -- HP PUA U+F0AB (19M 171)
+<- 26110,13190,362 0 159148 -- HP PUA U+F0AC (19M 172)
+ua 15955,23810,362 2 159149 -- HP PUA U+F0AD (19M 173)
+-> 26110,13190,362 0 159150 -- HP PUA U+F0AE (19M 174)
+da 15955,23810,362 2 159151 -- HP PUA U+F0AF (19M 175)
+de 10581,17906 2 159152 -- HP PUA U+F0B0 (19M 176)
++- 14521,16407 0 159153 -- HP PUA U+F0B1 (19M 177)
+sd 10878,17919 2 159154 -- HP PUA U+F0B2 (19M 178)
+>= 14521,16420 0 159155 -- HP PUA U+F0B3 (19M 179)
+mu 14521,12454 0 159156 -- HP PUA U+F0B4 (19M 180)
+pt 18862,12196 0 159157 -- HP PUA U+F0B5 (19M 181)
+pd 13074,18371,400 2 159158 -- HP PUA U+F0B6 (19M 182)
+u2219 12170,12170 0 159159 -- HP PUA U+F0B7 (19M 183)
+di 14521,12338 0 159160 -- HP PUA U+F0B8 (19M 184)
+!= 14521,13565 0 159161 -- HP PUA U+F0B9 (19M 185)
+== 14521,11201 0 159162 -- HP PUA U+F0BA (19M 186)
+~~ 14521,11395 0 159163 -- HP PUA U+F0BB (19M 187)
+~= "
+u2026 26458,2506,375 0 159164 -- HP PUA U+F0BC (19M 188)
+u23D0 15955,26600,3139 2 159165 -- HP PUA U+F0BD (19M 189)
+u23AF 26458,7041 0 159166 -- HP PUA U+F0BE (19M 190)
+CR 17415,16420,400 0 159167 -- HP PUA U+F0BF (19M 191)
+Ah 21782,17919,400 2 159168 -- HP PUA U+F0C0 (19M 192)
+Im 18151,17919,400 2 159169 -- HP PUA U+F0C1 (19M 193)
+Re 21032,18151,543 2 159170 -- HP PUA U+F0C2 (19M 194)
+wp 26110,13668,5710 1 159171 -- HP PUA U+F0C3 (19M 195)
+c* 20322,17919,400 2 159172 -- HP PUA U+F0C4 (19M 196)
+c+ 20322,17919,400 2 159173 -- HP PUA U+F0C5 (19M 197)
+es 21782,18875,620 2 159174 -- HP PUA U+F0C6 (19M 198)
+ca 20322,13203 0 159175 -- HP PUA U+F0C7 (19M 199)
+cu 20322,13203 0 159176 -- HP PUA U+F0C8 (19M 200)
+sp 18862,11834 0 159177 -- HP PUA U+F0C9 (19M 201)
+ip 18862,11834,3785 0 159178 -- HP PUA U+F0CA (19M 202)
+nb 18862,13888,2015 0 159179 -- HP PUA U+F0CB (19M 203)
+sb 18862,11834 0 159180 -- HP PUA U+F0CC (19M 204)
+ib 18862,11834,3785 0 159181 -- HP PUA U+F0CD (19M 205)
+mo 18862,11834 0 159182 -- HP PUA U+F0CE (19M 206)
+nm 18862,13888,1860 0 159183 -- HP PUA U+F0CF (19M 207)
+/_ 20322,17919 2 159184 -- HP PUA U+F0D0 (19M 208)
+gr 18862,17518,400 2 159185 -- HP PUA U+F0D1 (19M 209)
+--- 20903,17932,413 2 159186 -- HP PUA U+F0D2 (19M 210)
+--- 20903,17932,413 2 159187 -- HP PUA U+F0D3 (19M 211)
+--- 23552,17518 2 159188 -- HP PUA U+F0D4 (19M 212)
+product 21782,19585,2635 2 159189 -- HP PUA U+F0D5 (19M 213)
+sqrt 14521,24146,1008 2 159190 -- HP PUA U+F0D6 (19M 214)
+sr "
+u22C5 6615,8204 0 159191 -- HP PUA U+F0D7 (19M 215)
+no 18862,7312 0 159192 -- HP PUA U+F0D8 (19M 216)
+AN 15955,11834 0 159193 -- HP PUA U+F0D9 (19M 217)
+OR 15955,11834 0 159194 -- HP PUA U+F0DA (19M 218)
+hA 27569,13177,362 0 159195 -- HP PUA U+F0DB (19M 219)
+lh 26110,13177,362 0 159196 -- HP PUA U+F0DC (19M 220)
+lA "
+uA 15955,23797,362 2 159197 -- HP PUA U+F0DD (19M 221)
+arrowverttp "
+rh 26110,13177,362 0 159198 -- HP PUA U+F0DE (19M 222)
+rA "
+dA 15955,23797,362 2 159199 -- HP PUA U+F0DF (19M 223)
+arrowvertbt "
+lz 13074,18371 2 159200 -- HP PUA U+F0E0 (19M 224)
+la 8707,18371,4858 2 159201 -- HP PUA U+F0E1 (19M 225)
+--- 20903,17932,413 2 159202 -- HP PUA U+F0E2 (19M 226)
+--- 20903,17932,413 2 159203 -- HP PUA U+F0E3 (19M 227)
+--- 20800,17518 2 159204 -- HP PUA U+F0E4 (19M 228)
+sum 18862,19598,2635 2 159205 -- HP PUA U+F0E5 (19M 229)
+parenlefttp 10154,24508,2145 2 159206 -- HP PUA U+F0E6 (19M 230)
+parenleftex 10154,24508,2145 2 159207 -- HP PUA U+F0E7 (19M 231)
+parenleftbt 10154,24508,2145 2 159208 -- HP PUA U+F0E8 (19M 232)
+bracketlefttp 10154,24508,2145 2 159209 -- HP PUA U+F0E9 (19M 233)
+lc "
+bracketleftex 10154,24508,2145 2 159210 -- HP PUA U+F0EA (19M 234)
+bracketleftbt 10154,24508,2145 2 159211 -- HP PUA U+F0EB (19M 235)
+lf "
+bracelefttp 13074,24508,2157 2 159212 -- HP PUA U+F0EC (19M 236)
+lt "
+braceleftex 13074,24508,2145 2 159213 -- HP PUA U+F0ED (19M 237)
+lk "
+braceleftbt 13074,24508,2157 2 159214 -- HP PUA U+F0EE (19M 238)
+lb "
+u23AA 13074,24508,2145 2 159215 -- HP PUA U+F0EF (19M 239)
+ra 8707,18371,4858 2 159217 -- HP PUA U+F0F1 (19M 241)
+is 7248,24068,2842 2 159218 -- HP PUA U+F0F2 (19M 242)
+integral "
+u2320 18151,24508,2157 2 159219 -- HP PUA U+F0F3 (19M 243)
+u23AE 18151,25670,2351 2 159220 -- HP PUA U+F0F4 (19M 244)
+u2321 18151,24495,2157 2 159221 -- HP PUA U+F0F5 (19M 245)
+parenrighttp 10154,24508,2145 2 159222 -- HP PUA U+F0F6 (19M 246)
+parenrightex 10154,24508,2145 2 159223 -- HP PUA U+F0F7 (19M 247)
+parenrightbt 10154,24508,2145 2 159224 -- HP PUA U+F0F8 (19M 248)
+bracketrighttp 10154,24508,2145 2 159225 -- HP PUA U+F0F9 (19M 249)
+rc "
+bracketrightex 10154,24508,2145 2 159226 -- HP PUA U+F0FA (19M 250)
+bracketrightbt 10154,24508,2145 2 159227 -- HP PUA U+F0FB (19M 251)
+rf "
+bracerighttp 13074,24508,2157 2 159228 -- HP PUA U+F0FC (19M 252)
+rt "
+bracerightex 13074,24508,2145 2 159229 -- HP PUA U+F0FD (19M 253)
+rk "
+bracerightbt 13074,24508,2157 2 159230 -- HP PUA U+F0FE (19M 254)
+rb "
diff --git a/font/devlj4/TB b/font/devlj4/TB
new file mode 100644
index 0000000..bcea6fc
--- /dev/null
+++ b/font/devlj4/TB
@@ -0,0 +1,953 @@
+# CG Times Bd
+name TB
+spacewidth 7806
+pcltypeface 4101
+pclproportional 1
+pclweight 3
+pclstyle 0
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -3413
+P . -4388
+P , -4388
+V A -4877
+A V -4877
+T o -2924
+T r -1460
+T c -2438
+T e -2924
+T d -2924
+T s -2438
+T y -1460
+T a -2924
+T w -1460
+T u -1460
+T J -1460
+L T -2438
+L Y -3413
+Y o -4877
+Y e -4877
+Y a -4877
+Y J -1460
+A W -4388
+W A -4388
+T A -2438
+V o -3902
+V e -3902
+V a -3902
+Y A -3902
+F A -3902
+F . -3902
+F , -3902
+A T -2438
+A Y -3902
+v . -3413
+v , -3413
+y . -3413
+y , -3413
+T . -2438
+T , -2438
+L W -3413
+P A -3413
+V J -1460
+V . -3902
+V , -3902
+Y . -3902
+Y , -3902
+W o -3413
+W e -3413
+W a -3413
+W . -3902
+W , -3902
+r . -3413
+r , -3413
+w . -3413
+w , -3413
+Y u -3413
+A v -3413
+A y -3413
+A w -3413
+o . -1460
+o , -1460
+p . -1460
+p , -1460
+e . -974
+e , -974
+b . -485
+b , -485
+O T -1460
+O V -2438
+O Y -2924
+O . -2924
+O , -2924
+L y -1949
+L O -974
+L G -974
+L C -974
+L Q -974
+P J -974
+V y -2438
+V u -2438
+V O -2438
+V G -2438
+V C -2438
+V Q -2438
+D T -1460
+D V -2438
+D Y -2924
+D . -2924
+D , -2924
+Y O -2924
+Y G -2924
+Y C -2924
+Y Q -2924
+F o -1949
+F e -1949
+F a -1949
+c . -974
+c , -974
+O A -2438
+O W -1949
+L U -1460
+R T -1949
+R V -1949
+R Y -1949
+R W -1949
+G T -1460
+P o -974
+P g -974
+P e -974
+P a -974
+C A -2438
+C . -2438
+C , -2438
+D A -2438
+D W -1949
+B T -1460
+B Y -1460
+B . -1460
+B , -1460
+F J -1460
+A O -2438
+A G -2438
+A C -2438
+A U -2438
+A Q -2438
+W r -1949
+W y -1949
+W u -1949
+W O -1949
+W G -1949
+W C -1949
+W J -1460
+W Q -1949
+J A -1460
+J . -1460
+J , -1460
+U A -2438
+U . -2438
+U , -2438
+Q A -2438
+Q W -1949
+T O -1460
+T G -1460
+T C -1460
+T Q -1460
+O X -1949
+L o -974
+L e -974
+L q -974
+G V -1460
+G Y -1460
+G W -1460
+G . -1460
+G , -1460
+P T -485
+P V -485
+P Y -485
+C T -974
+C V -974
+C Y -974
+D X -1949
+B V -1460
+B X -1460
+B A -1460
+B W -1460
+S . -1460
+S , -1460
+F r -485
+F y -485
+F u -485
+F O -485
+F G -485
+F C -485
+F Q -485
+X o -1460
+X e -1460
+X y -1949
+X O -1949
+X G -1949
+X C -1949
+X Q -1949
+A o -1460
+A e -1460
+Q X -1949
+K o -1460
+K e -1460
+K y -1460
+K w -1460
+K O -1460
+K G -1460
+K C -1460
+K Q -1460
+o v -974
+o y -974
+o x -974
+o w -974
+h v -974
+h y -974
+n v -974
+n y -974
+m v -974
+m y -974
+r g -485
+g . -1460
+g , -1460
+c v -974
+c y -974
+c w -974
+v o -974
+v g -974
+v c -974
+v d -974
+v a -974
+v q -974
+e v -974
+e y -974
+b v -485
+b y -485
+b w -485
+s . -974
+s , -974
+y o -974
+y g -974
+y c -974
+y d -974
+y a -974
+y q -974
+f g -485
+x o -974
+x g -485
+x c -974
+x e -974
+x d -974
+x a -974
+x q -974
+a v -974
+a y -974
+a w -974
+w o -974
+w g -974
+w c -974
+w d -974
+w a -974
+w q -974
+T i -974
+T S -1460
+L a -974
+L S -485
+R o -974
+R y -974
+R O -974
+R G -974
+R C -974
+R U -1460
+R Q -974
+G X -1460
+G A -1460
+P s -974
+P Z -485
+P X -485
+P W -485
+C X -974
+C W -974
+C J -485
+V i -974
+V S -1460
+S T -485
+S V -485
+S Y -485
+S X -485
+S A -1460
+S W -485
+Y i -974
+Y S -1460
+X a -974
+X u -974
+X S -485
+A t -974
+A g -485
+A c -974
+A d -1460
+A a -974
+A u -974
+A q -1460
+A S -485
+W i -974
+W S -1460
+K c -974
+K u -974
+K S -485
+t g -485
+t . -485
+t , -485
+o f -485
+h w -974
+n w -974
+m w -974
+r o -485
+r c -485
+r e -485
+r d -485
+r a -485
+r q -485
+c f -485
+c x -974
+v e -974
+v s -974
+e f -485
+e x -974
+e w -974
+b f -485
+s v -485
+s y -485
+s f -485
+s x -485
+s w -485
+y e -974
+y s -974
+f o -485
+f c -485
+f e -485
+f d -485
+f s -485
+f a -485
+f q -485
+x s -485
+w e -974
+w s -974
+k o -485
+k g -485
+k c -485
+k v -485
+k e -485
+k d -485
+k y -485
+k a -485
+k w -485
+k q -485
+O Z -485
+N . -485
+N , -485
+R e -974
+R a -974
+R u -974
+R S -485
+G Z -485
+P U -485
+C Z -974
+E t -485
+E o -485
+E g -485
+E c -485
+E v -485
+E e -485
+E d -485
+E y -485
+E f -485
+E a -485
+E w -485
+E u -485
+E q -485
+E O -485
+E G -485
+E C -485
+E S -485
+E J -485
+E Q -485
+E . -485
+E , -485
+Z o -485
+Z e -485
+Z d -485
+Z s -485
+Z y -974
+Z a -485
+Z w -974
+Z u -485
+Z O -485
+Z G -485
+Z C -485
+Z S -485
+Z Q -485
+D Z -485
+B Z -485
+S Z -485
+F i -485
+F j -974
+F S -485
+A s -485
+U g -485
+U J -485
+K a -974
+t o -485
+t c -485
+t e -485
+t d -485
+t s -485
+t a -485
+t j -485
+t q -485
+o z -485
+r s -485
+r j -485
+c z -485
+v j -485
+e z -485
+z o -485
+z g -485
+z c -485
+z e -485
+z d -485
+z s -485
+z a -485
+z q -485
+b z -485
+s z -485
+y j -485
+w j -485
+k t -485
+k s -485
+k u -485
+N A -485
+C t -485
+C o -485
+C h -485
+C l -485
+C r -485
+C i -485
+C e -485
+C y -485
+C a -485
+C u -485
+C O -485
+C H -485
+C N -485
+C M -485
+C L -485
+C R -485
+C G -485
+C I -485
+C P -485
+C C -485
+C E -485
+C D -485
+C B -485
+C S -485
+C F -485
+C U -974
+C Q -485
+C K -485
+E n -485
+E m -485
+E l -485
+E r -485
+E i -485
+E p -485
+E z -485
+E b -485
+E s -485
+E x -485
+E j -485
+E k -485
+E T -485
+E H -485
+E N -485
+E M -485
+E L -485
+E R -485
+E I -485
+E P -485
+E V -485
+E E -485
+E Z -485
+E D -485
+E B -485
+E Y -485
+E F -485
+E X -485
+E A -485
+E W -485
+E U -485
+E K -485
+B U -485
+U t -485
+U o -485
+U n -485
+U m -485
+U r -485
+U i -485
+U p -485
+U c -485
+U v -485
+U e -485
+U z -485
+U d -485
+U s -485
+U y -485
+U f -485
+U x -485
+U a -485
+U w -485
+U j -485
+U q -485
+U O -485
+U G -485
+U C -485
+U S -485
+U Q -485
+K T -485
+K V -485
+K Y -485
+K W -485
+K U -485
+L cq -3413
+L ' -3413
+T hy -1460
+T - -1460
+T en -1460
+T em -1460
+A cq -3413
+A ' -3413
+hy T -1460
+- T -1460
+en T -1460
+em T -1460
+Y hy -3413
+Y - -3413
+Y en -3413
+Y em -3413
+c cq -974
+c ' -974
+e cq -974
+e ' -974
+b cq -485
+b ' -485
+a cq -1460
+a ' -1460
+V hy -2438
+V - -2438
+V en -2438
+V em -2438
+h cq -974
+h ' -974
+n cq -974
+n ' -974
+m cq -974
+m ' -974
+R cq -974
+R ' -974
+W hy -1949
+W - -1949
+W en -1949
+W em -1949
+cq d -1460
+' d -1460
+s cq -485
+s ' -485
+L hy -974
+L - -974
+L en -974
+L em -974
+F hy -485
+F - -485
+F en -485
+F em -485
+X hy -1949
+X - -1949
+X en -1949
+X em -1949
+A hy -1949
+A - -1949
+A en -1949
+A em -1949
+K hy -1460
+K - -1460
+K en -1460
+K em -1460
+cq s -974
+' s -974
+hy X -1949
+- X -1949
+hy A -1949
+- A -1949
+en X -1949
+en A -1949
+em X -1949
+R hy -974
+R - -974
+R en -974
+R em -974
+K cq -485
+K ' -485
+t g -485
+b f -485
+k cq -485
+k ' -485
+C cq -485
+C ' -485
+E cq -485
+E ' -485
+E hy -485
+E - -485
+E en -485
+E em -485
+Z hy -485
+Z - -485
+Z en -485
+Z em -485
+k hy -485
+k - -485
+k en -485
+k em -485
+C hy -485
+C - -485
+C en -485
+C em -485
+U hy -485
+U - -485
+U en -485
+U em -485
+charset
+! 8781,18045,405 2 161057 -- MSL 1 (19U 33)
+dq 12198,18450 2 161058 -- MSL 2 (19U 34)
+" "
+sh 13173,18450,405 2 161059 -- MSL 3 (19U 35)
+# "
+Do 13173,19755,2610 2 161060 -- MSL 4 (19U 36)
+$ "
+% 23418,18237,405 2 161061 -- MSL 5 (19U 37)
+& 21954,18045,405 2 161062 -- MSL 6 (19U 38)
+cq 8781,18450 2 161170 -- MSL 8 (19U 146)
+' "
+( 8781,18450,4305 2 161064 -- MSL 9 (19U 40)
+) 8781,18450,4305 2 161065 -- MSL 10 (19U 41)
+* 13173,18450 2 161066 -- MSL 11 (19U 42)
++ 23418,15975 0 161067 -- MSL 12 (19U 43)
+, 8781,4380,4560 0 161068 -- MSL 13 (19U 44)
+hy 8781,7740 0 161069 -- MSL 14 (19U 45)
+- "
+. 8781,4125,405 0 161070 -- MSL 15 (19U 46)
+sl 8781,18450,405 2 161071 -- MSL 16 (19U 47)
+/ "
+0 13173,18450,405 2 161072 -- MSL 17 (19U 48)
+1 13173,18450 2 161073 -- MSL 18 (19U 49)
+2 13173,18450 2 161074 -- MSL 19 (19U 50)
+3 13173,18450,405 2 161075 -- MSL 20 (19U 51)
+4 13173,18450 2 161076 -- MSL 21 (19U 52)
+5 13173,18045,405 2 161077 -- MSL 22 (19U 53)
+6 13173,18450,405 2 161078 -- MSL 23 (19U 54)
+7 13173,18045 2 161079 -- MSL 24 (19U 55)
+8 13173,18450,405 2 161080 -- MSL 25 (19U 56)
+9 13173,18450,405 2 161081 -- MSL 26 (19U 57)
+: 8781,12549,405 0 161082 -- MSL 27 (19U 58)
+; 8781,12549,4560 0 161083 -- MSL 28 (19U 59)
+< 26346,16068 0 161084 -- MSL 29 (19U 60)
+= 23418,11370 0 161085 -- MSL 30 (19U 61)
+> 26346,16068 0 161086 -- MSL 31 (19U 62)
+? 13173,18045,405 2 161087 -- MSL 32 (19U 63)
+at 23418,16950,4131 2 161088 -- MSL 33 (19U 64)
+@ "
+A 19029,18450 2 161089 -- MSL 34 (19U 65)
+B 17565,18045 2 161090 -- MSL 35 (19U 66)
+C 19029,18450,405 2 161091 -- MSL 36 (19U 67)
+D 19029,18045 2 161092 -- MSL 37 (19U 68)
+E 17565,18045 2 161093 -- MSL 38 (19U 69)
+F 16101,18045 2 161094 -- MSL 39 (19U 70)
+G 20490,18519,405 2 161095 -- MSL 40 (19U 71)
+H 20490,18045 2 161096 -- MSL 41 (19U 72)
+I 10245,18045 2 161097 -- MSL 42 (19U 73)
+J 12684,18045,405 2 161098 -- MSL 43 (19U 74)
+K 20490,18045 2 161099 -- MSL 44 (19U 75)
+L 17565,18045 2 161100 -- MSL 45 (19U 76)
+M 24882,18045 2 161101 -- MSL 46 (19U 77)
+N 19029,18045,405 2 161102 -- MSL 47 (19U 78)
+O 20490,18450,405 2 161103 -- MSL 48 (19U 79)
+P 16101,18045 2 161104 -- MSL 49 (19U 80)
+Q 20490,18450,4515 2 161105 -- MSL 50 (19U 81)
+R 19029,18045 2 161106 -- MSL 51 (19U 82)
+S 14637,18450,462 2 161107 -- MSL 52 (19U 83)
+T 17565,18045 2 161108 -- MSL 53 (19U 84)
+U 19029,18045,405 2 161109 -- MSL 54 (19U 85)
+V 19029,18045,405 2 161110 -- MSL 55 (19U 86)
+W 26346,18045,405 2 161111 -- MSL 56 (19U 87)
+X 19029,18045 2 161112 -- MSL 57 (19U 88)
+Y 19029,18045 2 161113 -- MSL 58 (19U 89)
+Z 17565,18045 2 161114 -- MSL 59 (19U 90)
+lB 8781,18045,4305 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 8781,18450,405 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 8781,18045,4305 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588 1 161119 -- MSL 64 (19U 95)
+oq 8781,18450 2 161169 -- MSL 66 (19U 145)
+` "
+a 13173,12735,405 0 161121 -- MSL 67 (19U 97)
+b 14637,18090,405 2 161122 -- MSL 68 (19U 98)
+c 11709,12735,405 0 161123 -- MSL 69 (19U 99)
+d 14637,18090,405 2 161124 -- MSL 70 (19U 100)
+e 11709,12735,405 0 161125 -- MSL 71 (19U 101)
+f 9270,18540 2 161126 -- MSL 72 (19U 102)
+g 13173,12735,5484 1 161127 -- MSL 73 (19U 103)
+h 14637,18090 2 161128 -- MSL 74 (19U 104)
+i 7317,18450 2 161129 -- MSL 75 (19U 105)
+j 8781,18450,5490 3 161130 -- MSL 76 (19U 106)
+k 14637,18090 2 161131 -- MSL 77 (19U 107)
+l 7317,18090 2 161132 -- MSL 78 (19U 108)
+m 21954,12735 0 161133 -- MSL 79 (19U 109)
+n 14637,12735 0 161134 -- MSL 80 (19U 110)
+o 13173,12735,405 0 161135 -- MSL 81 (19U 111)
+p 14637,12735,5490 1 161136 -- MSL 82 (19U 112)
+q 14637,12828,5490 1 161137 -- MSL 83 (19U 113)
+r 11709,12735 0 161138 -- MSL 84 (19U 114)
+s 10245,12735,411 0 161139 -- MSL 85 (19U 115)
+t 8781,16773,405 2 161140 -- MSL 86 (19U 116)
+u 14637,12330,405 0 161141 -- MSL 87 (19U 117)
+v 13173,12330,405 0 161142 -- MSL 88 (19U 118)
+w 19029,12330,405 0 161143 -- MSL 89 (19U 119)
+x 13173,12330 0 161144 -- MSL 90 (19U 120)
+y 13173,12330,5490 1 161145 -- MSL 91 (19U 121)
+z 11709,12330 0 161146 -- MSL 92 (19U 122)
+{ 13173,19935,6210 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588 3 161148 -- MSL 94 (19U 124)
+ba "
+} 13173,19935,6210 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,9435 0 161150 -- MSL 96 (19U 126)
+`A 19029,24795 2 161216 -- MSL 99 (19U 192)
+^A 19029,24795 2 161218 -- MSL 100 (19U 194)
+`E 17565,24795 2 161224 -- MSL 101 (19U 200)
+^E 17565,24795 2 161226 -- MSL 102 (19U 202)
+:E 17565,23955 2 161227 -- MSL 103 (19U 203)
+^I 10245,24795 2 161230 -- MSL 104 (19U 206)
+:I 10245,23955 2 161231 -- MSL 105 (19U 207)
+aa 13173,19065 2 161204 -- MSL 106 (19U 180)
+ga 13173,19065 2 161120 -- MSL 107 (19U 96)
+a^ 13173,19065 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 13173,17820 2 161192 -- MSL 109 (19U 168)
+~ 13173,17772 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 19029,24795,405 2 161241 -- MSL 111 (19U 217)
+^U 19029,24795,405 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105 2 161199 -- MSL 113 (19U 175)
+'Y 19029,24795 2 161245 -- MSL 114 (19U 221)
+'y 13173,19065,5490 3 161277 -- MSL 115 (19U 253)
+de 13173,18450 2 161200 -- MSL 116 (19U 176)
+,C 19029,18450,5532 3 161223 -- MSL 117 (19U 199)
+,c 11709,12735,5661 1 161255 -- MSL 118 (19U 231)
+~N 19029,23892,405 2 161233 -- MSL 119 (19U 209)
+~n 14637,17772 2 161265 -- MSL 120 (19U 241)
+r! 8781,12672,5778 1 161185 -- MSL 121 (19U 161)
+r? 13173,12846,5604 1 161215 -- MSL 122 (19U 191)
+Cs 13173,16089 0 161188 -- MSL 123 (19U 164)
+Po 13173,18450,429 2 161187 -- MSL 124 (19U 163)
+Ye 13173,18045 2 161189 -- MSL 125 (19U 165)
+sc 13173,18450,3225 2 161191 -- MSL 126 (19U 167)
+Fn 13173,18540,5490 3 161155 -- MSL 127 (19U 131)
+ct 13173,17682 2 161186 -- MSL 128 (19U 162)
+^a 13173,19065,405 2 161250 -- MSL 129 (19U 226)
+^e 11709,19065,405 2 161258 -- MSL 130 (19U 234)
+^o 13173,19065,405 2 161268 -- MSL 131 (19U 244)
+^u 14637,19065,405 2 161275 -- MSL 132 (19U 251)
+'a 13173,19065,405 2 161249 -- MSL 133 (19U 225)
+'e 11709,19065,405 2 161257 -- MSL 134 (19U 233)
+'o 13173,19065,405 2 161267 -- MSL 135 (19U 243)
+'u 14637,19065,405 2 161274 -- MSL 136 (19U 250)
+`a 13173,19065,405 2 161248 -- MSL 137 (19U 224)
+`e 11709,19065,405 2 161256 -- MSL 138 (19U 232)
+`o 13173,19065,405 2 161266 -- MSL 139 (19U 242)
+`u 14637,19065,405 2 161273 -- MSL 140 (19U 249)
+:a 13173,17820,405 2 161252 -- MSL 141 (19U 228)
+:e 11709,17820,405 2 161259 -- MSL 142 (19U 235)
+:o 13173,17820,405 2 161270 -- MSL 143 (19U 246)
+:u 14637,17820,405 2 161276 -- MSL 144 (19U 252)
+oA 19029,24750 2 161221 -- MSL 145 (19U 197)
+^i 7317,19065 2 161262 -- MSL 146 (19U 238)
+/O 20490,18450,405 2 161240 -- MSL 147 (19U 216)
+AE 27321,18045 2 161222 -- MSL 148 (19U 198)
+oa 13173,19020,405 2 161253 -- MSL 149 (19U 229)
+'i 7317,19065 2 161261 -- MSL 150 (19U 237)
+/o 13173,12750,405 0 161272 -- MSL 151 (19U 248)
+ae 19029,12735,405 0 161254 -- MSL 152 (19U 230)
+:A 19029,23955 2 161220 -- MSL 153 (19U 196)
+`i 7317,19065 2 161260 -- MSL 154 (19U 236)
+:O 20490,23955,405 2 161238 -- MSL 155 (19U 214)
+:U 19029,23955,405 2 161244 -- MSL 156 (19U 220)
+'E 17565,24795 2 161225 -- MSL 157 (19U 201)
+:i 7317,17820 2 161263 -- MSL 158 (19U 239)
+ss 14637,18492,405 2 161247 -- MSL 159 (19U 223)
+^O 20490,24795,405 2 161236 -- MSL 160 (19U 212)
+'A 19029,24795 2 161217 -- MSL 161 (19U 193)
+~A 19029,23892 2 161219 -- MSL 162 (19U 195)
+~a 13173,17772,405 2 161251 -- MSL 163 (19U 227)
+-D 19029,18045 2 161232 -- MSL 164 (19U 208)
+Sd 13173,18090,405 2 161264 -- MSL 165 (19U 240)
+'I 10245,24795 2 161229 -- MSL 166 (19U 205)
+`I 10245,24795 2 161228 -- MSL 167 (19U 204)
+'O 20490,24795,405 2 161235 -- MSL 168 (19U 211)
+`O 20490,24795,405 2 161234 -- MSL 169 (19U 210)
+~O 20490,23892,405 2 161237 -- MSL 170 (19U 213)
+~o 13173,17772,405 2 161269 -- MSL 171 (19U 245)
+vS 14637,24795,462 2 161162 -- MSL 172 (19U 138)
+vs 10245,19065,411 2 161178 -- MSL 173 (19U 154)
+'U 19029,24795,405 2 161242 -- MSL 174 (19U 218)
+:Y 19029,23955 2 161183 -- MSL 175 (19U 159)
+:y 13173,17820,5490 3 161279 -- MSL 176 (19U 255)
+TP 16101,18045 2 161246 -- MSL 177 (19U 222)
+Tp 14637,18090,5490 3 161278 -- MSL 178 (19U 254)
+mc 14637,10800,5193 1 161205 -- MSL 180 (19U 181)
+ps 13173,19635,4200 2 161206 -- MSL 181 (19U 182)
+34 23418,18450,405 2 161214 -- MSL 182 (19U 190)
+\- 23418,9000 0 60096 -- MSL 183 ( 7J 192)
+14 23418,18450,405 2 161212 -- MSL 184 (19U 188)
+12 23418,18450,405 2 161213 -- MSL 185 (19U 189)
+Of 13173,18450 2 161194 -- MSL 186 (19U 170)
+Om 13173,18450 2 161210 -- MSL 187 (19U 186)
+Fo 11220,9861 0 161195 -- MSL 188 (19U 171)
+Fc 11220,9861 0 161211 -- MSL 190 (19U 187)
+t+- 23418,15975,2880 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916 3 161190 -- MSL 192 (19U 166)
+co 13173,19725 2 161193 -- MSL 193 (19U 169)
+tno 23418,12210 0 161196 -- MSL 194 (19U 172)
+u00AD 8781,7740 0 161197 -- MSL 195 (19U 173)
+rg 13173,19725 2 161198 -- MSL 196 (19U 174)
+S2 9270,18285 2 161202 -- MSL 197 (19U 178)
+S3 9270,18285 2 161203 -- MSL 198 (19U 179)
+ac 13173,0,5661 1 161208 -- MSL 199 (19U 184)
+S1 9270,18285 2 161209 -- MSL 200 (19U 185)
+tmu 23418,15033 0 161239 -- MSL 201 (19U 215)
+tdi 23418,14505 0 161271 -- MSL 202 (19U 247)
+u203C 15117,18045,405 2 87315 -- MSL 221 (10U 19)
+u20A7 25701,18045,405 2 60121 -- MSL 232 ( 7J 217)
+pc 8781,11274 0 161207 -- MSL 302 (19U 183)
+u013F 17565,18045 2 51943 -- MSL 306 ( 6J 231)
+u0140 10242,18090 2 51959 -- MSL 307 ( 6J 247)
+u2113 13173,18045,765 2 60122 -- MSL 308 ( 7J 218)
+u0149 20979,18450 2 51951 -- MSL 309 ( 6J 239)
+fm 8781,18450 2 60101 -- MSL 310 ( 7J 197)
+sd 13173,18450 2 60102 -- MSL 311 ( 7J 198)
+dg 13173,18450,3075 2 161158 -- MSL 312 (19U 134)
+tm 16101,17550 2 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588 1 60095 -- MSL 314 ( 7J 191)
+ah 13173,19065 2 75169 -- MSL 315 ( 9E 161)
+ao 13173,19020 2 60152 -- MSL 316 ( 7J 248)
+f/ 3417,18450,405 2 60109 -- MSL 324 ( 7J 205)
+em 23418,7200 0 161175 -- MSL 325 (19U 151)
+en 13173,7200 0 161174 -- MSL 326 (19U 150)
+dd 13173,18450,3075 2 161159 -- MSL 327 (19U 135)
+.i 7317,12330 0 46333 -- MSL 328 ( 5T 253)
+aq 8781,18450 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226 0 161173 -- MSL 331 (19U 149)
+u207F 13173,18285 2 87548 -- MSL 332 (10U 252)
+u0111 14637,18090,405 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 19029,24285 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 13173,18285,405 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 19029,18450,4113 2 75173 -- MSL 404 ( 9E 165)
+u0061_0328 13173,12735,4413 0 75193 -- MSL 405 ( 9E 185)
+'C 19029,24795,405 2 75206 -- MSL 406 ( 9E 198)
+'c 11709,19065,405 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 19029,24795,405 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 11709,19065,405 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 19029,24795 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 18051,19065,405 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 17565,24795 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 11709,19065,405 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 17565,18045,4113 2 75210 -- MSL 422 ( 9E 202)
+u0065_0328 11709,12735,4413 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 17565,24795 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 7317,24885 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 17565,19065 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 10734,19065 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 19029,24795,405 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 14637,19065 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 19029,24795,405 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 14637,19065 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 20490,24795,405 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 13173,19065,405 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 19029,24795 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 11709,19065 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 19029,24795 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 11709,19065 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 14637,24795,462 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 10245,19065,411 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 17565,24795 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 10734,19065,405 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 17565,18045,5532 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 8781,16773,5661 3 75262 -- MSL 469 ( 9E 254)
+u0055_030B 19029,24795,405 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 14637,19065,405 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 19029,24750,405 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 14637,19020,405 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 17565,24795 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 11709,19065 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 17565,23955 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 11709,17820 2 75199 -- MSL 485 ( 9E 191)
+u2070 9270,18285 2 51753 -- MSL 1000 ( 6J 41)
+u2074 9270,18285 2 51748 -- MSL 1001 ( 6J 36)
+u2075 9270,18045 2 51749 -- MSL 1002 ( 6J 37)
+u2076 9270,18285 2 51806 -- MSL 1003 ( 6J 94)
+u2077 9270,18045 2 51750 -- MSL 1004 ( 6J 38)
+u2078 9270,18285 2 51754 -- MSL 1005 ( 6J 42)
+u2079 9270,18285 2 51752 -- MSL 1006 ( 6J 40)
+lq 15126,18450 2 161171 -- MSL 1017 (19U 147)
+rq 15126,18450 2 161172 -- MSL 1018 (19U 148)
+Bq 15126,4134,4806 0 161156 -- MSL 1019 (19U 132)
+u2003 23418,0 0 51821 -- MSL 1020 ( 6J 109)
+u2002 13173,0 0 51822 -- MSL 1021 ( 6J 110)
+u2009 8781,0 0 51828 -- MSL 1023 ( 6J 116)
+u2026 23418,4050 0 161157 -- MSL 1028 (19U 133)
+vz 11709,19065 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,17703 2 128299 -- MSL 1034 (15U 43)
+u211E 20001,18315,4056 2 51794 -- MSL 1036 ( 6J 82)
+fi 14637,18540 2 60077 -- MSL 1040 ( 7J 173)
+fl 14637,19116 2 60078 -- MSL 1041 ( 7J 174)
+ff 16587,18540 2 51883 -- MSL 1042 ( 6J 171)
+Fi 21954,18540 2 51884 -- MSL 1043 ( 6J 172)
+Fl 21954,19116 2 51885 -- MSL 1044 ( 6J 173)
+ij 15075,18450,5490 3 60134 -- MSL 1047 ( 7J 230)
+u2105 24882,18450,405 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 20490,24285,405 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 13173,18285,5484 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 14637,18450,5532 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 10245,12735,5661 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 10245,23955 2 46301 -- MSL 1065 ( 5T 221)
+bq 8781,4134,4806 0 161154 -- MSL 1067 (19U 130)
+%0 30738,18237,405 2 161161 -- MSL 1068 (19U 137)
+a- 13173,17259 2 60154 -- MSL 1084 ( 7J 250)
+ab 13173,18285 2 75170 -- MSL 1086 ( 9E 162)
+a. 13173,17820 2 75263 -- MSL 1088 ( 9E 255)
+oe 19515,12735,405 0 161180 -- MSL 1090 (19U 156)
+OE 29760,18450,405 2 161164 -- MSL 1091 (19U 140)
+fo 6831,9861 0 161163 -- MSL 1092 (19U 139)
+fc 6831,9861 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624 0 60091 -- MSL 1094 ( 7J 187)
+/L 17565,18045 2 75171 -- MSL 1095 ( 9E 163)
+/l 7317,18090 2 75187 -- MSL 1096 ( 9E 179)
+a" 13173,19065 2 75197 -- MSL 1097 ( 9E 189)
+ho 13173,513,4413 0 75186 -- MSL 1098 ( 9E 178)
+vZ 17565,24795 2 75150 -- MSL 1106 ( 9E 142)
+IJ 23904,18045,405 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/TBI b/font/devlj4/TBI
new file mode 100644
index 0000000..dcdd2b3
--- /dev/null
+++ b/font/devlj4/TBI
@@ -0,0 +1,1006 @@
+# CG Times BdIt
+name TBI
+spacewidth 7806
+slant 15.300000
+pcltypeface 4101
+pclproportional 1
+pclweight 3
+pclstyle 1
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -2924
+P . -4388
+P , -4388
+V A -3902
+A V -4388
+T o -2438
+T r -974
+T c -2438
+T e -2438
+T d -1949
+T s -1460
+T y -974
+T a -2438
+T w -974
+T u -974
+T J -1949
+L T -2438
+L Y -2924
+Y o -3902
+Y e -3902
+Y a -3413
+Y J -1949
+A W -3902
+W A -3413
+T A -2438
+V o -3413
+V e -3413
+V a -3413
+Y A -2924
+F A -2438
+F . -3902
+F , -3902
+A T -2438
+A Y -3413
+v . -2438
+v , -2438
+y . -2438
+y , -2438
+T . -2438
+T , -2438
+L W -2924
+P A -2924
+V J -1949
+V . -3902
+V , -3902
+Y . -2924
+Y , -2924
+W o -2924
+W e -2924
+W a -2924
+W . -3413
+W , -3413
+r . -3413
+r , -3413
+w . -2438
+w , -2438
+Y u -2438
+A v -2438
+A y -2924
+A w -2438
+o . -1460
+o , -1460
+p . -1460
+p , -1460
+e . -974
+e , -974
+b . -1460
+b , -1460
+O T -1460
+O V -1949
+O Y -1949
+O . -2438
+O , -2438
+L y -974
+P J -2924
+V y -1949
+V u -1949
+V O -1949
+V G -1949
+V C -1949
+V Q -1949
+D T -1460
+D V -1949
+D Y -1949
+D . -2438
+D , -2438
+Y O -2438
+Y G -2438
+Y C -2438
+Y Q -2438
+F o -1460
+F e -1460
+F a -1460
+c . -974
+c , -974
+O A -974
+O W -1949
+R T -1460
+R V -1460
+R Y -1460
+R W -1460
+G T -1460
+P o -1460
+P g -1460
+P e -1460
+P a -1460
+C A -1460
+C . -2438
+C , -2438
+D A -974
+D W -1949
+B T -1460
+B Y -1949
+B . -1460
+B , -1460
+F J -1949
+A O -1949
+A G -1949
+A C -1949
+A U -1949
+A Q -1949
+W r -1949
+W y -1949
+W u -1949
+W O -1949
+W G -1949
+W C -1949
+W J -1949
+W Q -1949
+J A -974
+J . -974
+J , -974
+U A -974
+U . -1949
+U , -1949
+Q A -974
+Q W -1949
+f . -974
+f , -974
+T O -974
+T G -974
+T C -974
+T Q -974
+O X -1460
+G V -1460
+G Y -1460
+G W -1460
+G . -485
+G , -485
+P T -1460
+P V -1460
+P Y -1460
+C T -974
+C V -974
+C Y -974
+D X -1460
+B V -1949
+B X -1460
+B A -974
+B W -1949
+S . -974
+S , -974
+X o -1460
+X e -1460
+X y -1460
+X O -1460
+X G -1460
+X C -1460
+X Q -1460
+A o -1949
+A e -1949
+Q X -1460
+K o -1460
+K e -1460
+K y -1460
+K w -1460
+K O -1460
+K G -1460
+K C -1460
+K Q -1460
+o v -974
+o y -974
+o x -485
+o w -974
+h v -974
+h y -974
+n v -974
+n y -974
+m v -974
+m y -974
+r g -974
+g . -974
+g , -974
+p v -974
+p y -974
+p x -485
+c v -974
+c y -974
+c w -974
+v o -485
+v g -974
+v c -485
+v d -485
+v a -485
+v q -485
+e v -974
+e y -974
+b v -974
+b y -974
+b w -974
+s . -485
+s , -485
+y o -485
+y g -974
+y c -485
+y d -485
+y a -485
+y q -485
+f g -1460
+x o -485
+x g -485
+x c -485
+x e -485
+x d -485
+x a -485
+x q -485
+w o -485
+w g -974
+w c -485
+w d -485
+w a -485
+w q -485
+T i -974
+T S -974
+R o -485
+R y -485
+R O -485
+R G -485
+R C -485
+R U -485
+R Q -485
+G X -485
+G A -485
+P s -485
+P Z -485
+P X -1460
+P W -1460
+C X -974
+C W -974
+C J -1460
+V i -974
+V S -974
+S T -1460
+S V -1460
+S Y -1460
+S X -974
+S A -974
+S W -1460
+Y i -974
+Y S -974
+X a -485
+X u -974
+X S -485
+A t -485
+A g -485
+A c -1949
+A d -1460
+A a -485
+A u -974
+A q -974
+A S -485
+W i -974
+W S -974
+J y -1460
+K c -1460
+K u -974
+K S -485
+t g -485
+o f -974
+h w -974
+n w -974
+m w -974
+r o -485
+r c -485
+r e -485
+r d -485
+r a -485
+r q -485
+g g -974
+p f -974
+p w -974
+c f -974
+c x -485
+v e -485
+v s -485
+e f -974
+e x -485
+e w -974
+b f -974
+y e -485
+y s -485
+f o -974
+f c -974
+f e -974
+f d -974
+f s -485
+f a -974
+f q -974
+w e -485
+w s -485
+k o -485
+k g -485
+k c -485
+k e -485
+k d -485
+k a -485
+k q -485
+O Z -485
+O J -974
+R e -485
+R a -485
+R u -485
+R S -485
+G Z -485
+C Z -974
+E t -485
+E o -485
+E g -974
+E c -485
+E v -485
+E e -485
+E d -485
+E y -485
+E f -485
+E a -485
+E w -485
+E u -485
+E q -485
+E O -485
+E G -485
+E C -485
+E S -485
+E J -485
+E Q -485
+E . -485
+E , -485
+Z o -485
+Z e -485
+Z d -485
+Z y -974
+Z a -485
+Z w -974
+Z u -485
+Z O -485
+Z G -485
+Z C -485
+Z S -485
+Z Q -485
+D Z -485
+D J -974
+B Z -485
+B J -974
+S Z -485
+S J -974
+J o -974
+J i -974
+J e -974
+J a -974
+J u -974
+J T -974
+J O -974
+J H -974
+J N -974
+J M -974
+J L -974
+J R -974
+J G -974
+J I -974
+J P -974
+J C -974
+J V -974
+J E -974
+J Z -974
+J D -974
+J B -974
+J S -974
+J Y -974
+J F -974
+J X -974
+J W -974
+J J -974
+J U -974
+J Q -974
+J K -974
+U g -485
+U J -974
+K a -485
+o g -485
+o z -485
+h g -485
+h f -485
+n g -485
+n f -485
+m g -485
+m f -485
+l g -485
+r s -485
+g o -485
+g c -485
+g e -485
+g d -485
+g s -485
+g a -485
+g q -485
+i g -485
+p g -485
+p z -485
+c g -485
+c z -485
+v t -485
+v h -485
+v n -485
+v m -485
+v r -485
+v i -485
+v p -485
+v z -485
+v b -485
+v y -485
+v f -485
+v x -485
+v w -485
+v j -485
+v u -485
+v k -485
+e g -485
+e z -485
+z o -485
+z g -485
+z c -485
+z e -485
+z d -485
+z a -485
+z q -485
+d g -485
+b g -485
+b z -485
+s g -485
+y t -485
+y h -485
+y n -485
+y m -485
+y l -485
+y r -485
+y i -485
+y p -485
+y v -485
+y z -485
+y b -485
+y y -485
+y f -485
+y x -485
+y w -485
+y j -485
+y u -485
+y k -485
+a g -485
+w t -485
+w h -485
+w n -485
+w m -485
+w l -485
+w r -485
+w i -485
+w p -485
+w v -485
+w z -485
+w b -485
+w y -485
+w f -485
+w x -485
+w w -485
+w j -485
+w u -485
+w k -485
+j g -485
+u g -485
+q g -485
+O g -485
+M g -485
+G J -485
+I g -485
+C t -485
+C o -485
+C h -485
+C l -485
+C r -485
+C i -485
+C e -485
+C y -485
+C a -485
+C u -485
+C O -485
+C H -485
+C N -485
+C M -485
+C L -485
+C R -485
+C G -485
+C I -485
+C P -485
+C C -485
+C E -485
+C D -485
+C B -485
+C S -485
+C F -485
+C U -485
+C Q -485
+C K -485
+E n -485
+E m -485
+E l -485
+E r -485
+E i -485
+E p -485
+E z -485
+E b -485
+E s -485
+E x -485
+E j -485
+E k -485
+E T -485
+E H -485
+E N -485
+E M -485
+E L -485
+E R -485
+E I -485
+E P -485
+E V -485
+E E -485
+E Z -485
+E D -485
+E B -485
+E Y -485
+E F -485
+E X -485
+E A -485
+E W -485
+E U -485
+E K -485
+A f -485
+K T -485
+K V -485
+K Y -485
+K W -485
+K U -485
+L cq -2924
+L ' -2924
+T hy -974
+T - -974
+T en -974
+T em -974
+A cq -3413
+A ' -3413
+hy T -1460
+- T -1460
+en T -1460
+em T -1460
+Y hy -2438
+Y - -2438
+Y en -2438
+Y em -2438
+p cq -1949
+p ' -1949
+c cq -1460
+c ' -1460
+e cq -1949
+e ' -1949
+b cq -1949
+b ' -1949
+V hy -1949
+V - -1949
+V en -1949
+V em -1949
+h cq -974
+h ' -974
+n cq -974
+n ' -974
+m cq -974
+m ' -974
+R cq -485
+R ' -485
+W hy -1949
+W - -1949
+W en -1949
+W em -1949
+cq d -974
+' d -974
+X hy -1460
+X - -1460
+X en -1460
+X em -1460
+A hy -1949
+A - -1949
+A en -1949
+A em -1949
+K hy -1460
+K - -1460
+K en -1460
+K em -1460
+cq s -485
+' s -485
+hy X -1460
+- X -1460
+hy A -974
+- A -974
+en X -1460
+en A -974
+em X -1460
+R hy -485
+R - -485
+R en -485
+R em -485
+K cq -485
+K ' -485
+t g -485
+v cq -485
+v ' -485
+b f -974
+y cq -485
+y ' -485
+w cq -485
+w ' -485
+C cq -485
+C ' -485
+E cq -485
+E ' -485
+E hy -485
+E - -485
+E en -485
+E em -485
+Z hy -485
+Z - -485
+Z en -485
+Z em -485
+J cq -974
+J ' -974
+J hy -974
+J - -974
+J en -974
+J em -974
+v hy -485
+v - -485
+v en -485
+v em -485
+y hy -485
+y - -485
+y en -485
+y em -485
+w hy -485
+w - -485
+w en -485
+w em -485
+C hy -485
+C - -485
+C en -485
+C em -485
+hy g -485
+- g -485
+en g -485
+em g -485
+charset
+! 10245,18450,405,963,-452,913 2 161057 -- MSL 1 (19U 33)
+dq 13662,18450,0,1380,-3413,913 2 161058 -- MSL 2 (19U 34)
+" "
+sh 13173,18450,405,1902,270,913 2 161059 -- MSL 3 (19U 35)
+# "
+Do 13173,19770,2295,1998,1053,913 2 161060 -- MSL 4 (19U 36)
+$ "
+% 23418,18237,405,288,-1508,288 2 161061 -- MSL 5 (19U 37)
+& 20490,18045,405,234,87,234 2 161062 -- MSL 6 (19U 38)
+cq 8781,18450,0,2001,-2789,913 2 161170 -- MSL 8 (19U 146)
+' "
+( 8781,18450,4761,3096,-317,913 2 161064 -- MSL 9 (19U 40)
+) 8781,18450,4761,846,1932,846 2 161065 -- MSL 10 (19U 41)
+* 13173,18450,0,1518,-1811,913 2 161066 -- MSL 11 (19U 42)
++ 23418,15975,0,0,-3104 0 161067 -- MSL 12 (19U 43)
+, 8781,3612,4728,0,1515 0 161068 -- MSL 13 (19U 44)
+hy 8781,7740,0,660,426,660 0 161069 -- MSL 14 (19U 45)
+- "
+. 8781,3645,405,0,129 0 161070 -- MSL 15 (19U 46)
+sl 8781,18450,405,3012,1209,913 2 161071 -- MSL 16 (19U 47)
+/ "
+0 13173,18450,405,1722,72,913 2 161072 -- MSL 17 (19U 48)
+1 13173,18450,0,0,765 2 161073 -- MSL 18 (19U 49)
+2 13173,18450,0,657,1419,657 2 161074 -- MSL 19 (19U 50)
+3 13173,18450,405,702,1116,702 2 161075 -- MSL 20 (19U 51)
+4 13173,18450,0,1953,1386,913 2 161076 -- MSL 21 (19U 52)
+5 13173,18045,405,1845,855,913 2 161077 -- MSL 22 (19U 53)
+6 13173,18450,405,2286,-8,913 2 161078 -- MSL 23 (19U 54)
+7 13173,18045,0,2997,-968,913 2 161079 -- MSL 24 (19U 55)
+8 13173,18450,405,1548,240,913 2 161080 -- MSL 25 (19U 56)
+9 13173,18450,405,1572,705,913 2 161081 -- MSL 26 (19U 57)
+: 8781,12360,405,0,408 0 161082 -- MSL 27 (19U 58)
+; 8781,12360,4728,0,1515 0 161083 -- MSL 28 (19U 59)
+< 26346,16068,0,0,-3980 0 161084 -- MSL 29 (19U 60)
+= 23418,11370,0,0,-3299 0 161085 -- MSL 30 (19U 61)
+> 26346,16068,0,0,-3980 0 161086 -- MSL 31 (19U 62)
+? 13173,18450,405,1725,-1931,913 2 161087 -- MSL 32 (19U 63)
+at 23418,16950,4131,1095,219,913 2 161088 -- MSL 33 (19U 64)
+@ "
+A 17565,18450,0,546,2412,546 2 161089 -- MSL 34 (19U 65)
+B 17565,18045,0,1257,1167,913 2 161090 -- MSL 35 (19U 66)
+C 17565,18594,405,2331,-392,913 2 161091 -- MSL 36 (19U 67)
+D 19029,18045,0,1707,1611,913 2 161092 -- MSL 37 (19U 68)
+E 17565,18045,0,1974,1428,913 2 161093 -- MSL 38 (19U 69)
+F 16101,18045,0,3384,1536,913 2 161094 -- MSL 39 (19U 70)
+G 19029,18450,405,1863,-11,913 2 161095 -- MSL 40 (19U 71)
+H 20490,18045,0,3006,1266,913 2 161096 -- MSL 41 (19U 72)
+I 10245,18045,0,2997,1338,913 2 161097 -- MSL 42 (19U 73)
+J 13173,18045,405,2652,1491,913 2 161098 -- MSL 43 (19U 74)
+K 17565,18045,0,3312,1326,913 2 161099 -- MSL 44 (19U 75)
+L 16101,18045,0,1188,1815,913 2 161100 -- MSL 45 (19U 76)
+M 23418,18045,0,3132,1362,913 2 161101 -- MSL 46 (19U 77)
+N 19029,18045,405,3270,1227,913 2 161102 -- MSL 47 (19U 78)
+O 19029,18450,405,1503,-182,913 2 161103 -- MSL 48 (19U 79)
+P 16101,18045,0,2490,1233,913 2 161104 -- MSL 49 (19U 80)
+Q 18540,18450,5550,1902,-176,913 3 161105 -- MSL 50 (19U 81)
+R 17565,18045,0,1260,1188,913 2 161106 -- MSL 51 (19U 82)
+S 14637,18525,510,1452,543,913 2 161107 -- MSL 52 (19U 83)
+T 16101,18045,0,3513,-962,913 2 161108 -- MSL 53 (19U 84)
+U 19029,18045,405,3249,-1454,913 2 161109 -- MSL 54 (19U 85)
+V 17565,18045,405,3771,-1355,913 2 161110 -- MSL 55 (19U 86)
+W 23418,18045,405,3891,-1310,913 2 161111 -- MSL 56 (19U 87)
+X 17565,18045,0,2883,1578,913 2 161112 -- MSL 57 (19U 88)
+Y 16101,18045,0,3630,-1253,913 2 161113 -- MSL 58 (19U 89)
+Z 16101,18045,0,1923,876,913 2 161114 -- MSL 59 (19U 90)
+lB 8781,18045,4095,4575,2064,913 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 8781,18450,405,0,-2225 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 8781,18045,4095,2826,3813,913 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758,0,36,36,36 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588,1317,1317,913 1 161119 -- MSL 64 (19U 95)
+oq 8781,18450,0,2001,-2789,913 2 161169 -- MSL 66 (19U 145)
+` "
+a 13173,12735,405,1059,1059,913 0 161121 -- MSL 67 (19U 97)
+b 13173,18540,405,876,948,876 2 161122 -- MSL 68 (19U 98)
+c 11709,12735,405,900,435,900 0 161123 -- MSL 69 (19U 99)
+d 13173,18540,405,2541,1068,913 2 161124 -- MSL 70 (19U 100)
+e 11709,12735,405,687,390,687 0 161125 -- MSL 71 (19U 101)
+f 9270,18540,5490,4809,4866,913 3 161126 -- MSL 72 (19U 102)
+g 13173,12735,5490,1500,1977,913 1 161127 -- MSL 73 (19U 103)
+h 14637,18540,405,345,1146,345 2 161128 -- MSL 74 (19U 104)
+i 7317,18585,405,1734,783,913 2 161129 -- MSL 75 (19U 105)
+j 7317,18585,5490,2319,5745,913 3 161130 -- MSL 76 (19U 106)
+k 13173,18540,405,1923,1194,913 2 161131 -- MSL 77 (19U 107)
+l 7317,18540,405,2166,843,913 2 161132 -- MSL 78 (19U 108)
+m 20490,12735,405,630,1101,630 0 161133 -- MSL 79 (19U 109)
+n 14637,12735,405,321,954,321 0 161134 -- MSL 80 (19U 110)
+o 13173,12735,405,675,714,675 0 161135 -- MSL 81 (19U 111)
+p 13173,12735,5490,843,3888,843 1 161136 -- MSL 82 (19U 112)
+q 13173,12735,5490,1317,672,913 1 161137 -- MSL 83 (19U 113)
+r 10245,12783,0,2421,1005,913 0 161138 -- MSL 84 (19U 114)
+s 10245,12735,405,885,891,885 0 161139 -- MSL 85 (19U 115)
+t 7317,15870,405,2289,1056,913 0 161140 -- MSL 86 (19U 116)
+u 14637,12735,405,426,279,426 0 161141 -- MSL 87 (19U 117)
+v 11709,12735,405,1068,153,913 0 161142 -- MSL 88 (19U 118)
+w 17565,12735,405,822,75,822 0 161143 -- MSL 89 (19U 119)
+x 13173,12735,405,1137,1836,913 0 161144 -- MSL 90 (19U 120)
+y 11709,12735,5490,543,3189,543 1 161145 -- MSL 91 (19U 121)
+z 10245,12330,1935,1404,1839,913 0 161146 -- MSL 92 (19U 122)
+{ 13173,19935,6210,3339,-971,913 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588,0,-4595 3 161148 -- MSL 94 (19U 124)
+ba "
+} 13173,19935,6210,63,2304,63 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,9435,0,0,-4028 0 161150 -- MSL 96 (19U 126)
+`A 17565,24795,0,546,2412,546 2 161216 -- MSL 99 (19U 192)
+^A 17565,24795,0,546,2412,546 2 161218 -- MSL 100 (19U 194)
+`E 17565,24795,0,1974,1428,913 2 161224 -- MSL 101 (19U 200)
+^E 17565,24795,0,1974,1428,913 2 161226 -- MSL 102 (19U 202)
+:E 17565,23955,0,1974,1428,913 2 161227 -- MSL 103 (19U 203)
+^I 10245,24795,0,3930,1338,913 2 161230 -- MSL 104 (19U 206)
+:I 10245,23955,0,4875,1338,913 2 161231 -- MSL 105 (19U 207)
+aa 13173,19065,0,786,-5054,786 2 161204 -- MSL 106 (19U 180)
+ga 13173,19065,0,0,-3539 2 161120 -- MSL 107 (19U 96)
+a^ 13173,19065,0,417,-2930,417 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 13173,17820,0,1179,-2963,913 2 161192 -- MSL 109 (19U 168)
+~ 13173,17703,0,1884,-3212,913 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 19029,24795,405,3249,-1454,913 2 161241 -- MSL 111 (19U 217)
+^U 19029,24795,405,3249,-1454,913 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105,0,1317,1317,913 2 161199 -- MSL 113 (19U 175)
+'Y 16101,24795,0,3630,-1253,913 2 161245 -- MSL 114 (19U 221)
+'y 11709,19065,5490,1518,3189,913 3 161277 -- MSL 115 (19U 253)
+de 13173,18450,0,111,-2969,111 2 161200 -- MSL 116 (19U 176)
+,C 17565,18594,5718,2331,-392,913 3 161223 -- MSL 117 (19U 199)
+,c 11709,12735,5655,900,1278,900 1 161255 -- MSL 118 (19U 231)
+~N 19029,23733,405,3270,1227,913 2 161233 -- MSL 119 (19U 209)
+~n 14637,17703,405,1152,954,913 2 161265 -- MSL 120 (19U 241)
+r! 10245,13050,5805,0,855 1 161185 -- MSL 121 (19U 161)
+r? 13173,13050,5805,0,1680 1 161215 -- MSL 122 (19U 191)
+Cs 13173,15834,0,2598,795,913 0 161188 -- MSL 123 (19U 164)
+Po 13173,18450,429,2508,1473,913 2 161187 -- MSL 124 (19U 163)
+Ye 13173,18045,0,5067,834,913 2 161189 -- MSL 125 (19U 165)
+sc 13173,18450,3225,0,-596 2 161191 -- MSL 126 (19U 167)
+Fn 13173,18540,5490,2607,3165,913 3 161155 -- MSL 127 (19U 131)
+ct 13173,16914,0,1431,-683,913 2 161186 -- MSL 128 (19U 162)
+^a 13173,19065,405,1059,1059,913 2 161250 -- MSL 129 (19U 226)
+^e 11709,19065,405,1149,390,913 2 161258 -- MSL 130 (19U 234)
+^o 13173,19065,405,675,714,675 2 161268 -- MSL 131 (19U 244)
+^u 14637,19065,405,426,279,426 2 161275 -- MSL 132 (19U 251)
+'a 13173,19065,405,1059,1059,913 2 161249 -- MSL 133 (19U 225)
+'e 11709,19065,405,1518,390,913 2 161257 -- MSL 134 (19U 233)
+'o 13173,19065,405,786,714,786 2 161267 -- MSL 135 (19U 243)
+'u 14637,19065,405,426,279,426 2 161274 -- MSL 136 (19U 250)
+`a 13173,19065,405,1059,1059,913 2 161248 -- MSL 137 (19U 224)
+`e 11709,19065,405,687,390,687 2 161256 -- MSL 138 (19U 232)
+`o 13173,19065,405,675,714,675 2 161266 -- MSL 139 (19U 242)
+`u 14637,19065,405,426,279,426 2 161273 -- MSL 140 (19U 249)
+:a 13173,17820,405,1179,1059,913 2 161252 -- MSL 141 (19U 228)
+:e 11709,17820,405,1911,390,913 2 161259 -- MSL 142 (19U 235)
+:o 13173,17820,405,1179,714,913 2 161270 -- MSL 143 (19U 246)
+:u 14637,17820,405,447,279,447 2 161276 -- MSL 144 (19U 252)
+oA 17565,24750,0,546,2412,546 2 161221 -- MSL 145 (19U 197)
+^i 7317,19065,405,3345,723,913 2 161262 -- MSL 146 (19U 238)
+/O 19029,18450,405,3702,2070,913 2 161240 -- MSL 147 (19U 216)
+AE 24396,18045,0,2730,2331,913 2 161222 -- MSL 148 (19U 198)
+oa 13173,19020,405,1059,1059,913 2 161253 -- MSL 149 (19U 229)
+'i 7317,19065,405,3714,723,913 2 161261 -- MSL 150 (19U 237)
+/o 13173,12735,405,2199,2256,913 0 161272 -- MSL 151 (19U 248)
+ae 18540,12735,405,876,1074,876 0 161254 -- MSL 152 (19U 230)
+:A 17565,23955,0,765,2412,765 2 161220 -- MSL 153 (19U 196)
+`i 7317,19065,405,1749,723,913 2 161260 -- MSL 154 (19U 236)
+:O 19029,23955,405,1503,-182,913 2 161238 -- MSL 155 (19U 214)
+:U 19029,23955,405,3249,-1454,913 2 161244 -- MSL 156 (19U 220)
+'E 17565,24795,0,1974,1428,913 2 161225 -- MSL 157 (19U 201)
+:i 7317,17820,405,4107,723,913 2 161263 -- MSL 158 (19U 239)
+ss 13173,18540,5490,1572,5862,913 3 161247 -- MSL 159 (19U 223)
+^O 19029,24795,405,1503,-182,913 2 161236 -- MSL 160 (19U 212)
+'A 17565,24795,0,567,2412,567 2 161217 -- MSL 161 (19U 193)
+~A 17565,23733,0,966,2412,913 2 161219 -- MSL 162 (19U 195)
+~a 13173,17703,405,1884,1059,913 2 161251 -- MSL 163 (19U 227)
+-D 19029,18045,0,1707,1611,913 2 161232 -- MSL 164 (19U 208)
+Sd 13173,18540,405,2235,708,913 2 161264 -- MSL 165 (19U 240)
+'I 10245,24795,0,4227,1338,913 2 161229 -- MSL 166 (19U 205)
+`I 10245,24795,0,2997,1338,913 2 161228 -- MSL 167 (19U 204)
+'O 19029,24795,405,1503,-182,913 2 161235 -- MSL 168 (19U 211)
+`O 19029,24795,405,1503,-182,913 2 161234 -- MSL 169 (19U 210)
+~O 19029,23733,405,1503,-182,913 2 161237 -- MSL 170 (19U 213)
+~o 13173,17703,405,1884,714,913 2 161269 -- MSL 171 (19U 245)
+vS 14637,24798,510,2061,543,913 2 161162 -- MSL 172 (19U 138)
+vs 10245,19065,405,2856,891,913 2 161178 -- MSL 173 (19U 154)
+'U 19029,24795,405,3249,-1454,913 2 161242 -- MSL 174 (19U 218)
+:Y 16101,23955,0,3630,-1253,913 2 161183 -- MSL 175 (19U 159)
+:y 11709,17820,5490,1311,3189,913 3 161279 -- MSL 176 (19U 255)
+TP 16101,18045,0,1203,1227,913 2 161246 -- MSL 177 (19U 222)
+Tp 13173,18540,5490,843,3888,843 3 161278 -- MSL 178 (19U 254)
+mc 14637,10800,5193,582,756,582 1 161205 -- MSL 180 (19U 181)
+ps 13173,19635,4200,1350,-1007,913 2 161206 -- MSL 181 (19U 182)
+34 23418,18450,405,0,-1898 2 161214 -- MSL 182 (19U 190)
+\- 23418,9000,0,0,-3314 0 60096 -- MSL 183 ( 7J 192)
+14 23418,18450,405,0,-1571 2 161212 -- MSL 184 (19U 188)
+12 23418,18450,405,0,-1310 2 161213 -- MSL 185 (19U 189)
+Of 13173,18450,0,1368,-2396,913 2 161194 -- MSL 186 (19U 170)
+Om 13173,18450,0,744,-2294,744 2 161210 -- MSL 187 (19U 186)
+Fo 11709,10200,0,1158,567,913 0 161195 -- MSL 188 (19U 171)
+Fc 11709,10200,0,615,1110,615 0 161211 -- MSL 190 (19U 187)
+t+- 23418,15975,2880,0,-2882 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916,0,-4595 3 161190 -- MSL 192 (19U 166)
+co 13173,19725,0,4398,-2573,913 2 161193 -- MSL 193 (19U 169)
+tno 23418,12225,0,0,-4022 0 161196 -- MSL 194 (19U 172)
+u00AD 8781,7740,0,660,426,660 0 161197 -- MSL 195 (19U 173)
+rg 13173,19725,0,4398,-2573,913 2 161198 -- MSL 196 (19U 174)
+S2 8781,18285,0,1911,-212,913 2 161202 -- MSL 197 (19U 178)
+S3 8781,18285,0,1980,-551,913 2 161203 -- MSL 198 (19U 179)
+ac 13173,0,5655,0,546 1 161208 -- MSL 199 (19U 184)
+S1 8781,18285,0,1173,-470,913 2 161209 -- MSL 200 (19U 185)
+tmu 23418,15033,0,0,-3689 0 161239 -- MSL 201 (19U 215)
+tdi 23418,14505,0,0,-3326 0 161271 -- MSL 202 (19U 247)
+u203C 16593,18450,405,963,-452,913 2 87315 -- MSL 221 (10U 19)
+u20A7 23418,18045,405,2289,1233,913 2 60121 -- MSL 232 ( 7J 217)
+pc 8781,11121,0,0,-1898 0 161207 -- MSL 302 (19U 183)
+u013F 16101,18045,0,1188,1815,913 2 51943 -- MSL 306 ( 6J 231)
+u0140 9270,18540,405,2466,843,913 2 51959 -- MSL 307 ( 6J 247)
+u2113 13173,18045,765,0,-854 2 60122 -- MSL 308 ( 7J 218)
+u0149 19518,18450,405,321,117,321 2 51951 -- MSL 309 ( 6J 239)
+fm 8781,18450,0,930,-3341,913 2 60101 -- MSL 310 ( 7J 197)
+sd 13173,18450,0,873,-3341,873 2 60102 -- MSL 311 ( 7J 198)
+dg 13173,18450,3075,1344,-1187,913 2 161158 -- MSL 312 (19U 134)
+tm 16101,17550,0,4884,-2534,913 2 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588,1317,1317,913 1 60095 -- MSL 314 ( 7J 191)
+ah 13173,19065,0,1392,-3905,913 2 75169 -- MSL 315 ( 9E 161)
+ao 13173,19020,0,0,-4268 2 60152 -- MSL 316 ( 7J 248)
+f/ 3402,18450,405,8832,6945,913 2 60109 -- MSL 324 ( 7J 205)
+em 23418,7200,0,609,459,609 0 161175 -- MSL 325 (19U 151)
+en 13173,7200,0,624,459,624 0 161174 -- MSL 326 (19U 150)
+dd 13173,18450,3075,939,-782,913 2 161159 -- MSL 327 (19U 135)
+.i 7317,12735,405,825,723,825 0 46333 -- MSL 328 ( 5T 253)
+aq 8781,18450,0,1065,-3146,913 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226,0,0,-497 0 161173 -- MSL 331 (19U 149)
+u207F 13173,18285,0,1626,-851,913 2 87548 -- MSL 332 (10U 252)
+u0111 13173,18540,405,2733,1098,913 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 17565,24285,0,774,2412,774 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 13173,18570,405,1581,1059,913 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 17565,18450,2874,546,2412,546 2 75173 -- MSL 404 ( 9E 165)
+u0061_0328 13173,12735,3249,1059,1059,913 0 75193 -- MSL 405 ( 9E 185)
+'C 17565,24795,405,2331,-392,913 2 75206 -- MSL 406 ( 9E 198)
+'c 11709,19065,405,1518,435,913 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 17565,24798,405,2331,-392,913 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 11709,19065,405,2772,435,913 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 19029,24798,0,1707,1611,913 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 17076,19050,405,2988,1068,913 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 17565,24798,0,1974,1428,913 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 11709,19065,405,2934,390,913 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 17565,18045,2874,1974,1428,913 2 75210 -- MSL 422 ( 9E 202)
+u0065_0328 11709,12735,3249,687,390,687 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 16101,24795,0,1188,1815,913 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 7317,24915,405,5295,843,913 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 16101,19050,0,1611,1815,913 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 10734,19050,405,3021,843,913 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 19029,24795,405,3270,1227,913 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 14637,19065,405,321,954,321 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 19029,24798,405,3270,1227,913 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 14637,19065,405,660,954,660 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 19029,24795,405,2526,-182,913 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 13173,19065,405,4053,714,913 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 17565,24795,0,1260,1188,913 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 10245,19065,0,2574,1005,913 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 17565,24798,0,1260,1188,913 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 10245,19065,0,3018,1005,913 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 14637,24795,510,1452,543,913 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 10245,19065,405,2250,891,913 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 16101,24798,0,3513,-962,913 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 10245,19050,405,3108,1056,913 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 16101,18045,5718,3513,-962,913 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 7317,15870,5655,2289,3636,913 1 75262 -- MSL 469 ( 9E 254)
+u0055_030B 19029,24795,405,3249,-1454,913 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 14637,19065,405,2997,279,913 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 19029,24750,405,3249,-1454,913 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 14637,19020,405,426,279,426 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 16101,24795,0,1923,876,913 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 10245,19065,1935,2250,1839,913 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 16101,23955,0,1923,876,913 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 10245,17820,1935,1404,1839,913 2 75199 -- MSL 485 ( 9E 191)
+u2070 8781,18285,0,2436,-785,913 2 51753 -- MSL 1000 ( 6J 41)
+u2074 8781,18285,0,2547,-113,913 2 51748 -- MSL 1001 ( 6J 36)
+u2075 8781,18045,0,2496,-473,913 2 51749 -- MSL 1002 ( 6J 37)
+u2076 8781,18285,0,2868,-911,913 2 51806 -- MSL 1003 ( 6J 94)
+u2077 8781,18045,0,3444,-1556,913 2 51750 -- MSL 1004 ( 6J 38)
+u2078 8781,18285,0,2400,-629,913 2 51754 -- MSL 1005 ( 6J 42)
+u2079 8781,18285,0,2304,-347,913 2 51752 -- MSL 1006 ( 6J 40)
+lq 14148,18450,0,1974,-2789,913 2 161171 -- MSL 1017 (19U 147)
+rq 14148,18450,0,1974,-2789,913 2 161172 -- MSL 1018 (19U 148)
+Bq 14148,3651,4689,0,1425 0 161156 -- MSL 1019 (19U 132)
+u2003 23418,0,0,0,1317 0 51821 -- MSL 1020 ( 6J 109)
+u2002 13173,0,0,0,1317 0 51822 -- MSL 1021 ( 6J 110)
+u2009 8781,0,0,0,1317 0 51828 -- MSL 1023 ( 6J 116)
+u2026 23418,3510,0,0,147 0 161157 -- MSL 1028 (19U 133)
+vz 10245,19065,1935,2856,1839,913 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,17703,0,4137,-2579,913 2 128299 -- MSL 1034 (15U 43)
+u211E 20001,18315,4056,465,-1163,465 2 51794 -- MSL 1036 ( 6J 82)
+fi 15126,18540,5490,726,5055,726 3 60077 -- MSL 1040 ( 7J 173)
+fl 15126,18540,5490,2328,5034,913 3 60078 -- MSL 1041 ( 7J 174)
+ff 15126,18540,5490,5574,5268,913 3 51883 -- MSL 1042 ( 6J 171)
+Fi 21954,18540,5490,738,5223,738 3 51884 -- MSL 1043 ( 6J 172)
+Fl 21954,18540,5490,1959,5583,913 3 51885 -- MSL 1044 ( 6J 173)
+ij 14148,18585,5490,2271,783,913 3 60134 -- MSL 1047 ( 7J 230)
+u2105 23418,18450,405,534,-1265,534 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 19029,24285,405,1863,-11,913 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 13173,18570,5490,1500,1977,913 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 14637,18525,5718,1452,543,913 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 10245,12735,5655,885,2010,885 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 10245,23955,0,2997,1338,913 2 46301 -- MSL 1065 ( 5T 221)
+bq 8781,3651,4689,0,510 0 161154 -- MSL 1067 (19U 130)
+%0 32202,18237,405,612,-1121,612 2 161161 -- MSL 1068 (19U 137)
+a- 13173,16860,0,1341,-2903,913 2 60154 -- MSL 1084 ( 7J 250)
+ab 13173,18570,0,1281,-3689,913 2 75170 -- MSL 1086 ( 9E 162)
+a. 13173,17820,0,0,-5588 2 75263 -- MSL 1088 ( 9E 255)
+oe 19515,12735,405,462,462,462 0 161180 -- MSL 1090 (19U 156)
+OE 28299,18450,405,1695,-155,913 2 161164 -- MSL 1091 (19U 140)
+fo 7317,10200,0,1035,567,913 0 161163 -- MSL 1092 (19U 139)
+fc 7317,10200,0,618,984,618 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624,0,0,-2021 0 60091 -- MSL 1094 ( 7J 187)
+/L 16101,18045,0,1188,1815,913 2 75171 -- MSL 1095 ( 9E 163)
+/l 7317,18540,405,2622,1539,913 2 75187 -- MSL 1096 ( 9E 179)
+a" 13173,19065,0,4053,-3626,913 2 75197 -- MSL 1097 ( 9E 189)
+ho 13173,681,3249,420,-4388,420 0 75186 -- MSL 1098 ( 9E 178)
+vZ 16101,24798,0,1923,876,913 2 75150 -- MSL 1106 ( 9E 142)
+IJ 23418,18045,405,2652,1338,913 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/TI b/font/devlj4/TI
new file mode 100644
index 0000000..c01105a
--- /dev/null
+++ b/font/devlj4/TI
@@ -0,0 +1,1090 @@
+# CG Times It
+name TI
+spacewidth 7806
+slant 15.600000
+pcltypeface 4101
+pclproportional 1
+pclweight 0
+pclstyle 1
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -1949
+P . -4388
+P , -4388
+V A -2924
+A V -2924
+T o -1949
+T r -485
+T c -1460
+T e -1949
+T d -1949
+T s -974
+T y -485
+T a -1949
+T w -485
+T u -485
+T J -1460
+L T -1949
+L Y -1949
+Y o -3413
+Y e -3413
+Y a -3413
+Y J -1460
+A W -2924
+W A -3413
+T A -2438
+V o -1949
+V e -1949
+V a -1949
+Y A -2438
+F A -3902
+F . -3902
+F , -3902
+A T -2438
+A Y -2438
+v . -2438
+v , -2438
+y . -2438
+y , -2438
+T . -2438
+T , -2438
+L W -1949
+P A -3413
+V J -1460
+V . -3902
+V , -3902
+Y . -2438
+Y , -2438
+W o -2438
+W e -2438
+W a -2438
+W . -3902
+W , -3902
+r . -2438
+r , -2438
+w . -2438
+w , -2438
+Y u -1949
+A v -2438
+A y -2438
+A w -2438
+o . -1460
+o , -1460
+p . -1460
+p , -1460
+e . -974
+e , -974
+b . -1460
+b , -1460
+O T -485
+O V -1460
+O Y -1949
+O . -2438
+O , -2438
+L y -974
+P J -1949
+V y -1949
+V u -1949
+V O -1949
+V G -1949
+V C -1949
+V Q -1949
+D T -485
+D V -1460
+D Y -1949
+D . -2438
+D , -2438
+Y O -1949
+Y G -1949
+Y C -1949
+Y Q -1949
+F o -2924
+F e -2924
+F a -2924
+c . -974
+c , -974
+O A -974
+O W -1460
+L U -485
+R T -1460
+R V -1460
+R Y -1460
+R W -1460
+G T -485
+P o -2438
+P g -2438
+P e -2438
+P a -2438
+C A -974
+C . -974
+C , -974
+D A -974
+D W -1460
+B T -974
+B Y -2438
+B . -1949
+B , -1949
+F J -1460
+A O -1460
+A G -1460
+A C -1460
+A U -1949
+A Q -1460
+W r -2438
+W y -2438
+W u -2438
+W O -2438
+W G -2438
+W C -2438
+W J -1460
+W Q -2438
+J A -1460
+J . -1460
+J , -1460
+U A -1460
+U . -2438
+U , -2438
+Q A -974
+Q W -1460
+f . -485
+f , -485
+T O -485
+T G -485
+T C -485
+T Q -485
+O X -1460
+G V -1460
+G Y -1949
+G W -1460
+G . -974
+G , -974
+P T -485
+P V -485
+P Y -485
+C T -485
+C V -485
+C Y -485
+D X -1460
+B V -1949
+B X -1949
+B A -1460
+B W -1949
+S . -485
+S , -485
+F r -1949
+F y -1949
+F u -1949
+F O -1949
+F G -1949
+F C -1949
+F Q -1949
+X o -1949
+X e -1949
+X y -1949
+X O -1949
+X G -1949
+X C -1949
+X Q -1949
+A o -1460
+A e -1460
+Q X -1460
+K o -1949
+K e -1949
+K y -1949
+K w -1949
+K O -1949
+K G -1949
+K C -1949
+K Q -1949
+o v -974
+o y -974
+o x -485
+o w -974
+h v -974
+h y -974
+n v -974
+n y -974
+m v -974
+m y -974
+r g -1460
+g . -485
+g , -485
+p v -974
+p y -974
+p x -485
+c v -974
+c y -974
+c w -974
+v o -485
+v g -974
+v c -485
+v d -485
+v a -485
+v q -485
+e v -974
+e y -974
+b v -974
+b y -974
+b w -974
+s . -485
+s , -485
+y o -485
+y g -974
+y c -485
+y d -485
+y a -485
+y q -485
+f g -485
+x o -485
+x g -485
+x c -485
+x e -485
+x d -485
+x a -485
+x q -485
+w o -485
+w g -974
+w c -485
+w d -485
+w a -485
+w q -485
+T i -485
+T S -485
+R o -974
+R y -1460
+R O -974
+R G -974
+R C -974
+R U -1460
+R Q -974
+G X -974
+G A -974
+P s -1460
+P Z -485
+P X -485
+P W -485
+C X -485
+C W -485
+V i -485
+V S -485
+S T -485
+S V -1460
+S Y -1460
+S X -485
+S A -485
+S W -1460
+Y i -485
+Y S -485
+X a -974
+X u -974
+X S -485
+A t -974
+A g -485
+A c -1460
+A d -1460
+A a -974
+A u -974
+A q -1460
+A S -1460
+W i -485
+W S -485
+J y -485
+K c -1460
+K u -974
+K S -974
+t g -974
+t . -485
+t , -485
+o f -485
+h w -974
+n w -974
+m w -974
+r o -974
+r c -974
+r e -974
+r d -974
+r a -974
+r q -974
+g g -974
+p f -485
+p w -974
+c f -485
+c x -485
+v e -485
+v s -485
+e f -485
+e x -485
+e w -974
+b f -485
+y e -485
+y s -485
+w e -485
+w s -485
+k g -485
+k v -974
+k y -974
+k w -974
+R e -974
+R a -974
+R u -974
+R S -974
+P t -974
+P h -485
+P n -974
+P l -485
+P r -974
+P i -974
+P y -974
+P u -974
+P O -974
+P H -485
+P N -485
+P M -485
+P L -485
+P R -485
+P G -974
+P I -485
+P P -485
+P C -974
+P E -485
+P D -485
+P B -485
+P S -974
+P F -485
+P U -974
+P Q -974
+P K -485
+E t -974
+E o -974
+E g -974
+E c -974
+E v -974
+E e -974
+E d -974
+E y -974
+E f -974
+E a -974
+E w -974
+E u -974
+E q -974
+E O -974
+E G -974
+E C -974
+E S -974
+E J -485
+E Q -974
+E . -485
+E , -485
+B Z -485
+B J -485
+F i -485
+F j -485
+F S -485
+J o -485
+J i -485
+J e -485
+J a -485
+J u -485
+J T -485
+J O -485
+J H -485
+J N -485
+J M -485
+J L -485
+J R -485
+J G -485
+J I -485
+J P -485
+J C -485
+J V -485
+J E -485
+J Z -485
+J D -485
+J B -485
+J S -485
+J Y -485
+J F -485
+J X -485
+J W -485
+J J -485
+J U -974
+J Q -485
+J K -485
+U g -974
+U J -485
+K a -974
+t o -485
+t c -485
+t e -485
+t d -485
+t s -485
+t a -485
+t q -485
+o g -485
+o z -485
+h g -485
+h f -485
+n g -485
+n f -485
+m g -485
+m f -485
+l g -485
+r s -485
+g o -485
+g c -485
+g e -485
+g d -485
+g s -485
+g a -485
+g q -485
+i g -485
+p g -485
+p z -485
+c g -485
+c z -485
+v t -485
+v h -485
+v n -485
+v m -485
+v r -485
+v i -485
+v p -485
+v z -485
+v b -485
+v y -485
+v f -485
+v x -485
+v w -485
+v j -485
+v u -485
+v k -485
+e g -485
+e z -485
+z o -485
+z g -485
+z c -485
+z e -485
+z d -485
+z a -485
+z q -485
+d g -485
+b g -485
+b z -485
+s g -485
+y t -485
+y h -485
+y n -485
+y m -485
+y l -485
+y r -485
+y i -485
+y p -485
+y v -485
+y z -485
+y b -485
+y y -485
+y f -485
+y x -485
+y w -485
+y j -485
+y u -485
+y k -485
+a g -485
+w t -485
+w h -485
+w n -485
+w m -485
+w l -485
+w r -485
+w i -485
+w p -485
+w v -485
+w z -485
+w b -485
+w y -485
+w f -485
+w x -485
+w w -485
+w j -485
+w u -485
+w k -485
+j g -485
+u g -485
+q g -485
+k f -485
+T U -485
+O g -485
+M g -485
+I g -485
+C U -485
+V U -485
+E n -485
+E m -485
+E l -485
+E r -485
+E i -485
+E p -485
+E z -485
+E b -485
+E s -485
+E x -485
+E j -485
+E k -485
+E T -485
+E H -485
+E N -485
+E M -485
+E L -485
+E R -485
+E I -485
+E P -485
+E V -485
+E E -485
+E Z -485
+E D -485
+E B -485
+E Y -485
+E F -485
+E X -485
+E A -485
+E W -485
+E U -974
+E K -485
+B o -485
+B h -485
+B l -485
+B r -485
+B i -485
+B e -485
+B y -485
+B a -485
+B u -485
+B O -485
+B H -485
+B N -485
+B M -485
+B L -485
+B R -485
+B G -485
+B I -485
+B P -485
+B C -485
+B E -485
+B D -485
+B B -485
+B S -485
+B F -485
+B U -974
+B Q -485
+B K -485
+Y U -485
+F U -485
+X U -485
+A b -485
+A f -485
+W U -485
+U t -485
+U o -485
+U h -485
+U n -485
+U m -485
+U l -485
+U r -485
+U i -485
+U p -485
+U c -485
+U v -485
+U e -485
+U z -485
+U d -485
+U b -485
+U s -485
+U y -485
+U f -485
+U x -485
+U a -485
+U w -485
+U j -485
+U q -485
+U k -485
+U T -485
+U O -485
+U H -485
+U N -485
+U M -485
+U L -485
+U R -485
+U G -485
+U I -485
+U P -485
+U C -485
+U V -485
+U E -485
+U Z -485
+U D -485
+U B -485
+U S -485
+U Y -485
+U F -485
+U X -485
+U W -485
+U U -974
+U Q -485
+U K -485
+K T -485
+K V -485
+K Y -485
+K W -485
+K U -974
+L cq -1949
+L ' -1949
+T hy -485
+T - -485
+T en -485
+T em -485
+A cq -2438
+A ' -2438
+hy T -485
+- T -485
+en T -485
+em T -485
+Y hy -1949
+Y - -1949
+Y en -1949
+Y em -1949
+p cq -1949
+p ' -1949
+c cq -1460
+c ' -1460
+e cq -1949
+e ' -1949
+b cq -1949
+b ' -1949
+V hy -1949
+V - -1949
+V en -1949
+V em -1949
+h cq -974
+h ' -974
+n cq -974
+n ' -974
+m cq -974
+m ' -974
+R cq -1460
+R ' -1460
+W hy -2438
+W - -2438
+W en -2438
+W em -2438
+cq d -1460
+' d -1460
+F hy -1949
+F - -1949
+F en -1949
+F em -1949
+X hy -1949
+X - -1949
+X en -1949
+X em -1949
+A hy -1460
+A - -1460
+A en -1460
+A em -1460
+K hy -1949
+K - -1949
+K en -1949
+K em -1949
+cq s -485
+' s -485
+hy X -1460
+- X -1460
+hy A -974
+- A -974
+en X -1460
+en A -974
+em X -1460
+R hy -974
+R - -974
+R en -974
+R em -974
+K cq -485
+K ' -485
+t g -974
+v cq -485
+v ' -485
+b f -485
+y cq -485
+y ' -485
+w cq -485
+w ' -485
+k cq -974
+k ' -974
+P cq -485
+P ' -485
+P hy -974
+P - -974
+P en -974
+P em -974
+E cq -485
+E ' -485
+E hy -974
+E - -974
+E en -974
+E em -974
+B cq -485
+B ' -485
+J cq -485
+J ' -485
+J hy -485
+J - -485
+J en -485
+J em -485
+U cq -485
+U ' -485
+v hy -485
+v - -485
+v en -485
+v em -485
+y hy -485
+y - -485
+y en -485
+y em -485
+w hy -485
+w - -485
+w en -485
+w em -485
+B hy -485
+B - -485
+B en -485
+B em -485
+U hy -485
+U - -485
+U en -485
+U em -485
+hy g -485
+- g -485
+en g -485
+em g -485
+charset
+! 8781,18225,330,1170,-692,899 2 161057 -- MSL 1 (19U 33)
+dq 12684,18225,0,945,-4193,899 2 161058 -- MSL 2 (19U 34)
+" "
+sh 13173,18225,687,2103,-74,899 2 161059 -- MSL 3 (19U 35)
+# "
+Do 13173,19686,2730,1710,507,899 2 161060 -- MSL 4 (19U 36)
+$ "
+% 23418,18894,1026,0,-3053 2 161061 -- MSL 5 (19U 37)
+& 20490,18225,330,0,-320 2 161062 -- MSL 6 (19U 38)
+cq 8781,18225,0,1434,-3581,899 2 161170 -- MSL 8 (19U 146)
+' "
+( 8781,18225,4845,3531,-2057,899 2 161064 -- MSL 9 (19U 40)
+) 8781,18225,4845,0,2067 2 161065 -- MSL 10 (19U 41)
+* 13173,18225,0,927,-1580,899 2 161066 -- MSL 11 (19U 42)
++ 23418,15750,0,0,-2993 0 161067 -- MSL 12 (19U 43)
+, 8781,2835,3360,0,648 0 161068 -- MSL 13 (19U 44)
+hy 8781,7155,0,468,153,468 0 161069 -- MSL 14 (19U 45)
+- "
+. 8781,2685,330,0,-632 0 161070 -- MSL 15 (19U 46)
+sl 8781,18225,330,3183,801,899 2 161071 -- MSL 16 (19U 47)
+/ "
+0 13173,18225,330,1938,237,899 2 161072 -- MSL 17 (19U 48)
+1 13173,18225,0,0,165 2 161073 -- MSL 18 (19U 49)
+2 13173,18225,0,876,567,876 2 161074 -- MSL 19 (19U 50)
+3 13173,18225,330,1020,645,899 2 161075 -- MSL 20 (19U 51)
+4 13173,18225,0,1773,618,899 2 161076 -- MSL 21 (19U 52)
+5 13173,17895,330,1362,1008,899 2 161077 -- MSL 22 (19U 53)
+6 13173,18480,330,2085,147,899 2 161078 -- MSL 23 (19U 54)
+7 13173,17895,330,4029,-1493,899 2 161079 -- MSL 24 (19U 55)
+8 13173,18225,330,1827,306,899 2 161080 -- MSL 25 (19U 56)
+9 13173,18225,570,1785,447,899 2 161081 -- MSL 26 (19U 57)
+: 8781,11988,330,501,-632,501 0 161082 -- MSL 27 (19U 58)
+; 8781,11988,3360,0,1074 0 161083 -- MSL 28 (19U 59)
+< 26346,16068,0,0,-3980 0 161084 -- MSL 29 (19U 60)
+= 23418,10875,0,0,-3182 0 161085 -- MSL 30 (19U 61)
+> 26346,16068,0,0,-3980 0 161086 -- MSL 31 (19U 62)
+? 13173,18225,330,1362,-2849,899 2 161087 -- MSL 32 (19U 63)
+at 23418,16980,3654,750,-227,750 2 161088 -- MSL 33 (19U 64)
+@ "
+A 16101,18225,0,33,2700,33 2 161089 -- MSL 34 (19U 65)
+B 16101,17895,0,1116,1701,899 2 161090 -- MSL 35 (19U 66)
+C 17565,18225,330,2700,-872,899 2 161091 -- MSL 36 (19U 67)
+D 19029,17895,0,594,2298,594 2 161092 -- MSL 37 (19U 68)
+E 16101,17895,0,2091,1800,899 2 161093 -- MSL 38 (19U 69)
+F 15126,17895,0,3180,1725,899 2 161094 -- MSL 39 (19U 70)
+G 19029,18225,330,2301,-605,899 2 161095 -- MSL 40 (19U 71)
+H 19029,17895,0,3057,1614,899 2 161096 -- MSL 41 (19U 72)
+I 8781,17895,0,3165,1716,899 2 161097 -- MSL 42 (19U 73)
+J 11709,17895,330,2847,1797,899 2 161098 -- MSL 43 (19U 74)
+K 17565,17895,0,3273,1425,899 2 161099 -- MSL 44 (19U 75)
+L 14637,17895,0,1023,2487,899 2 161100 -- MSL 45 (19U 76)
+M 21954,17895,0,2712,1983,899 2 161101 -- MSL 46 (19U 77)
+N 17565,17895,330,3843,1578,899 2 161102 -- MSL 47 (19U 78)
+O 19029,18225,330,1356,-491,899 2 161103 -- MSL 48 (19U 79)
+P 16101,17895,0,1950,1116,899 2 161104 -- MSL 49 (19U 80)
+Q 19029,18225,4761,1215,-350,899 2 161105 -- MSL 50 (19U 81)
+R 16101,17895,0,1041,1926,899 2 161106 -- MSL 51 (19U 82)
+S 13173,18225,330,2190,609,899 2 161107 -- MSL 52 (19U 83)
+T 14637,17895,0,3939,-89,899 2 161108 -- MSL 53 (19U 84)
+U 19029,17895,330,3246,-1634,899 2 161109 -- MSL 54 (19U 85)
+V 16101,17895,330,4185,-1169,899 2 161110 -- MSL 55 (19U 86)
+W 21954,17895,330,4353,-821,899 2 161111 -- MSL 56 (19U 87)
+X 16101,17895,0,3276,2067,899 2 161112 -- MSL 57 (19U 88)
+Y 14637,17895,0,4533,-1085,899 2 161113 -- MSL 58 (19U 89)
+Z 14637,17895,0,2856,1710,899 2 161114 -- MSL 59 (19U 90)
+lB 8781,17895,4380,4026,1575,899 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 8781,18225,330,0,-2228 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 8781,17895,4380,1938,3663,899 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758,0,36,36,36 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588,1317,1317,899 1 161119 -- MSL 64 (19U 95)
+oq 8781,18225,0,1422,-3569,899 2 161169 -- MSL 66 (19U 145)
+` "
+a 13173,12669,330,759,1044,759 0 161121 -- MSL 67 (19U 97)
+b 13173,18300,330,732,1038,732 2 161122 -- MSL 68 (19U 98)
+c 11709,12669,330,1275,318,899 0 161123 -- MSL 69 (19U 99)
+d 13173,18300,330,2283,1065,899 2 161124 -- MSL 70 (19U 100)
+e 11709,12669,330,1011,444,899 0 161125 -- MSL 71 (19U 101)
+f 7317,18300,5655,5346,5535,899 3 161126 -- MSL 72 (19U 102)
+g 13173,12669,5655,813,1281,813 1 161127 -- MSL 73 (19U 103)
+h 13173,18300,330,750,1188,750 2 161128 -- MSL 74 (19U 104)
+i 7317,18369,330,1002,435,899 2 161129 -- MSL 75 (19U 105)
+j 7317,18369,5655,1212,5187,899 3 161130 -- MSL 76 (19U 106)
+k 11709,18300,330,1941,1422,899 2 161131 -- MSL 77 (19U 107)
+l 7317,18300,330,1731,276,899 2 161132 -- MSL 78 (19U 108)
+m 19029,12669,330,1080,1098,899 0 161133 -- MSL 79 (19U 109)
+n 13173,12669,330,786,1053,786 0 161134 -- MSL 80 (19U 110)
+o 13173,12669,330,771,732,771 0 161135 -- MSL 81 (19U 111)
+p 13173,12669,5655,471,3981,471 1 161136 -- MSL 82 (19U 112)
+q 13173,12669,5655,1377,651,899 1 161137 -- MSL 83 (19U 113)
+r 10245,12669,0,2094,429,899 0 161138 -- MSL 84 (19U 114)
+s 10245,12669,330,786,1116,786 0 161139 -- MSL 85 (19U 115)
+t 7317,15339,330,1908,672,899 0 161140 -- MSL 86 (19U 116)
+u 13173,12669,330,747,468,747 0 161141 -- MSL 87 (19U 117)
+v 11709,12684,330,1404,399,899 0 161142 -- MSL 88 (19U 118)
+w 17565,12669,330,1461,720,899 0 161143 -- MSL 89 (19U 119)
+x 11709,12669,330,1134,2592,899 0 161144 -- MSL 90 (19U 120)
+y 11709,12669,5655,561,2538,561 1 161145 -- MSL 91 (19U 121)
+z 10245,12339,2163,1122,1815,899 0 161146 -- MSL 92 (19U 122)
+{ 11709,19935,6210,3360,-1691,899 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588,0,-4595 3 161148 -- MSL 94 (19U 124)
+ba "
+} 11709,19935,6210,0,2232 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,8952,0,0,-4028 0 161150 -- MSL 96 (19U 126)
+`A 16101,23955,0,33,2700,33 2 161216 -- MSL 99 (19U 192)
+^A 16101,23955,0,1314,2700,899 2 161218 -- MSL 100 (19U 194)
+`E 16101,23955,0,2091,1800,899 2 161224 -- MSL 101 (19U 200)
+^E 16101,23955,0,2091,1800,899 2 161226 -- MSL 102 (19U 202)
+:E 16101,23085,0,2091,1800,899 2 161227 -- MSL 103 (19U 203)
+^I 8781,23955,0,3984,1716,899 2 161230 -- MSL 104 (19U 206)
+:I 8781,23085,0,4665,1716,899 2 161231 -- MSL 105 (19U 207)
+aa 13173,18399,0,141,-5399,141 2 161204 -- MSL 106 (19U 180)
+ga 13173,18399,0,0,-4313 2 161120 -- MSL 107 (19U 96)
+a^ 13173,18399,0,0,-3452 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 13173,17124,0,624,-4001,624 2 161192 -- MSL 109 (19U 168)
+~ 13173,17145,0,990,-3308,899 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 19029,23955,330,3246,-1634,899 2 161241 -- MSL 111 (19U 217)
+^U 19029,23955,330,3246,-1634,899 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105,0,1317,1317,899 2 161199 -- MSL 113 (19U 175)
+'Y 14637,23955,0,4533,-1085,899 2 161245 -- MSL 114 (19U 221)
+'y 11709,18399,5655,561,2538,561 3 161277 -- MSL 115 (19U 253)
+de 13173,18225,0,543,-3521,543 2 161200 -- MSL 116 (19U 176)
+,C 17565,18225,5019,2700,-872,899 2 161223 -- MSL 117 (19U 199)
+,c 11709,12669,4785,1275,636,899 0 161255 -- MSL 118 (19U 231)
+~N 17565,23079,330,3843,1578,899 2 161233 -- MSL 119 (19U 209)
+~n 13173,17145,330,990,1053,899 2 161265 -- MSL 120 (19U 241)
+r! 8781,12231,6324,33,444,33 1 161185 -- MSL 121 (19U 161)
+r? 13173,12312,6243,0,663 1 161215 -- MSL 122 (19U 191)
+Cs 13173,15684,0,1779,228,899 0 161188 -- MSL 123 (19U 164)
+Po 13173,17895,330,3153,1971,899 2 161187 -- MSL 124 (19U 163)
+Ye 13173,17895,0,4170,-14,899 2 161189 -- MSL 125 (19U 165)
+sc 13173,18225,4200,447,-1358,447 2 161191 -- MSL 126 (19U 167)
+Fn 13173,18300,5655,2388,2691,899 3 161155 -- MSL 127 (19U 131)
+ct 13173,17034,0,996,-776,899 2 161186 -- MSL 128 (19U 162)
+^a 13173,18399,330,759,1044,759 2 161250 -- MSL 129 (19U 226)
+^e 11709,18399,330,1761,444,899 2 161258 -- MSL 130 (19U 234)
+^o 13173,18399,330,771,732,771 2 161268 -- MSL 131 (19U 244)
+^u 13173,18399,330,747,468,747 2 161275 -- MSL 132 (19U 251)
+'a 13173,18399,330,759,1044,759 2 161249 -- MSL 133 (19U 225)
+'e 11709,18399,330,1011,444,899 2 161257 -- MSL 134 (19U 233)
+'o 13173,18399,330,771,732,771 2 161267 -- MSL 135 (19U 243)
+'u 13173,18399,330,747,468,747 2 161274 -- MSL 136 (19U 250)
+`a 13173,18399,330,759,1044,759 2 161248 -- MSL 137 (19U 224)
+`e 11709,18399,330,1011,444,899 2 161256 -- MSL 138 (19U 232)
+`o 13173,18399,330,771,732,771 2 161266 -- MSL 139 (19U 242)
+`u 13173,18399,330,747,468,747 2 161273 -- MSL 140 (19U 249)
+:a 13173,17124,330,759,1044,759 2 161252 -- MSL 141 (19U 228)
+:e 11709,17124,330,1356,444,899 2 161259 -- MSL 142 (19U 235)
+:o 13173,17124,330,1074,732,899 2 161270 -- MSL 143 (19U 246)
+:u 13173,17124,330,747,468,747 2 161276 -- MSL 144 (19U 252)
+oA 16101,23865,0,525,2700,525 2 161221 -- MSL 145 (19U 197)
+^i 7317,18399,330,2907,420,899 2 161262 -- MSL 146 (19U 238)
+/O 19029,18255,330,2082,234,899 2 161240 -- MSL 147 (19U 216)
+AE 23418,17895,0,2961,1959,899 2 161222 -- MSL 148 (19U 198)
+oa 13173,18309,330,759,1044,759 2 161253 -- MSL 149 (19U 229)
+'i 7317,18399,330,3069,420,899 2 161261 -- MSL 150 (19U 237)
+/o 13173,12738,336,1491,1443,899 0 161272 -- MSL 151 (19U 248)
+ae 17565,12669,330,933,771,899 0 161254 -- MSL 152 (19U 230)
+:A 16101,23085,0,2055,2700,899 2 161220 -- MSL 153 (19U 196)
+`i 7317,18399,330,1383,420,899 2 161260 -- MSL 154 (19U 236)
+:O 19029,23085,330,1356,-491,899 2 161238 -- MSL 155 (19U 214)
+:U 19029,23085,330,3246,-1634,899 2 161244 -- MSL 156 (19U 220)
+'E 16101,23955,0,2091,1800,899 2 161225 -- MSL 157 (19U 201)
+:i 7317,17124,330,3552,420,899 2 161263 -- MSL 158 (19U 239)
+ss 13173,18300,5655,1131,5829,899 3 161247 -- MSL 159 (19U 223)
+^O 19029,23955,330,1356,-491,899 2 161236 -- MSL 160 (19U 212)
+'A 16101,23955,0,1914,2700,899 2 161217 -- MSL 161 (19U 193)
+~A 16101,23079,0,2580,2700,899 2 161219 -- MSL 162 (19U 195)
+~a 13173,17145,330,990,1044,899 2 161251 -- MSL 163 (19U 227)
+-D 19029,17895,0,594,2298,594 2 161232 -- MSL 164 (19U 208)
+Sd 13173,18300,330,2040,732,899 2 161264 -- MSL 165 (19U 240)
+'I 8781,23955,0,5124,1716,899 2 161229 -- MSL 166 (19U 205)
+`I 8781,23955,0,3165,1716,899 2 161228 -- MSL 167 (19U 204)
+'O 19029,23955,330,1356,-491,899 2 161235 -- MSL 168 (19U 211)
+`O 19029,23955,330,1356,-491,899 2 161234 -- MSL 169 (19U 210)
+~O 19029,23079,330,1356,-491,899 2 161237 -- MSL 170 (19U 213)
+~o 13173,17145,330,1665,732,899 2 161269 -- MSL 171 (19U 245)
+vS 13173,23955,330,2268,609,899 2 161162 -- MSL 172 (19U 138)
+vs 10245,18399,330,2472,1116,899 2 161178 -- MSL 173 (19U 154)
+'U 19029,23955,330,3246,-1634,899 2 161242 -- MSL 174 (19U 218)
+:Y 14637,23085,0,4533,-1085,899 2 161183 -- MSL 175 (19U 159)
+:y 11709,17124,5655,561,2538,561 3 161279 -- MSL 176 (19U 255)
+TP 16101,17895,0,813,1107,813 2 161246 -- MSL 177 (19U 222)
+Tp 13173,18300,5655,471,3981,471 3 161278 -- MSL 178 (19U 254)
+mc 14637,10800,5595,612,585,612 1 161205 -- MSL 180 (19U 181)
+ps 13173,19635,4200,1650,-1307,899 2 161206 -- MSL 181 (19U 182)
+34 23418,18225,330,0,-2984 2 161214 -- MSL 182 (19U 190)
+\- 23418,8610,0,0,-3026 0 60096 -- MSL 183 ( 7J 192)
+14 23418,18225,330,0,-2471 2 161212 -- MSL 184 (19U 188)
+12 23418,18225,330,0,-1631 2 161213 -- MSL 185 (19U 189)
+Of 13173,18225,0,1119,-1826,899 2 161194 -- MSL 186 (19U 170)
+Om 13173,18225,0,1503,-2639,899 2 161210 -- MSL 187 (19U 186)
+Fo 12198,10095,0,501,330,501 0 161195 -- MSL 188 (19U 171)
+Fc 12198,10095,0,336,495,336 0 161211 -- MSL 190 (19U 187)
+t+- 23418,15750,2625,0,-2948 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916,0,-4595 3 161190 -- MSL 192 (19U 166)
+co 13173,19725,0,5355,-3530,899 2 161193 -- MSL 193 (19U 169)
+tno 23418,12165,0,0,-3044 0 161196 -- MSL 194 (19U 172)
+u00AD 8781,7155,0,468,153,468 0 161197 -- MSL 195 (19U 173)
+rg 13173,19725,0,5355,-3530,899 2 161198 -- MSL 196 (19U 174)
+S2 9270,18060,0,1602,-554,899 2 161202 -- MSL 197 (19U 178)
+S3 9270,18060,0,1980,-770,899 2 161203 -- MSL 198 (19U 179)
+ac 13173,0,4785,0,-95 0 161208 -- MSL 199 (19U 184)
+S1 9270,18060,0,1146,-1232,899 2 161209 -- MSL 200 (19U 185)
+tmu 23418,14658,0,0,-3629 0 161239 -- MSL 201 (19U 215)
+tdi 23418,14010,0,0,-2957 0 161271 -- MSL 202 (19U 247)
+u203C 13125,18225,330,1110,-692,899 2 87315 -- MSL 221 (10U 19)
+u20A7 22935,17895,330,1908,1116,899 2 60121 -- MSL 232 ( 7J 217)
+pc 8781,9945,0,0,-2399 0 161207 -- MSL 302 (19U 183)
+u013F 14637,17895,0,1023,2487,899 2 51943 -- MSL 306 ( 6J 231)
+u0140 7317,18300,330,3285,276,899 2 51959 -- MSL 307 ( 6J 247)
+u2113 13173,18150,297,99,-1469,99 2 60122 -- MSL 308 ( 7J 218)
+u0149 16098,18225,330,786,216,786 2 51951 -- MSL 309 ( 6J 239)
+fm 8781,18225,0,852,-3668,852 2 60101 -- MSL 310 ( 7J 197)
+sd 13173,18225,0,612,-3668,612 2 60102 -- MSL 311 ( 7J 198)
+dg 13173,18225,4200,1470,-1433,899 2 161158 -- MSL 312 (19U 134)
+tm 16101,17550,0,5841,-3491,899 2 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588,1317,1317,899 1 60095 -- MSL 314 ( 7J 191)
+ah 13173,18399,0,1908,-5381,899 2 75169 -- MSL 315 ( 9E 161)
+ao 13173,18309,0,0,-5420 2 60152 -- MSL 316 ( 7J 248)
+f/ 3402,18225,330,8451,6846,899 2 60109 -- MSL 324 ( 7J 205)
+em 23418,6900,0,345,153,345 0 161175 -- MSL 325 (19U 151)
+en 13173,6900,0,393,153,393 0 161174 -- MSL 326 (19U 150)
+dd 13173,18225,4200,1056,-1019,899 2 161159 -- MSL 327 (19U 135)
+.i 7317,12669,330,120,420,120 0 46333 -- MSL 328 ( 5T 253)
+aq 8781,18225,0,585,-3806,585 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226,0,0,-497 0 161173 -- MSL 331 (19U 149)
+u207F 13173,18060,0,1413,-1058,899 2 87548 -- MSL 332 (10U 252)
+u0111 13173,18300,330,2718,1092,899 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 16101,23700,0,2400,2700,899 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 13173,18339,330,1122,1044,899 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 16101,18225,3045,33,2700,33 2 75173 -- MSL 404 ( 9E 165)
+u0061_0328 13173,12669,3186,759,1044,759 0 75193 -- MSL 405 ( 9E 185)
+'C 17565,23955,330,2700,-872,899 2 75206 -- MSL 406 ( 9E 198)
+'c 11709,18399,330,2199,318,899 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 17565,23955,330,2892,-872,899 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 11709,18399,330,2640,318,899 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 19029,23955,0,594,2298,594 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 16101,18339,330,3303,1065,899 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 16101,23955,0,2091,1800,899 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 11709,18399,330,2640,444,899 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 16101,17895,3045,2091,1800,899 2 75210 -- MSL 422 ( 9E 202)
+u0065_0328 11709,12669,3186,1011,444,899 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 14637,23955,0,1719,2487,899 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 7317,24327,330,4212,276,899 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 14637,18339,0,1359,2487,899 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 9759,18339,330,3291,276,899 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 17565,23955,330,3843,1578,899 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 13173,18399,330,786,1053,786 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 17565,23955,330,3843,1578,899 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 13173,18399,330,1107,1053,899 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 19029,23955,330,2832,-491,899 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 13173,18399,330,3321,732,899 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 16101,23955,0,1041,1926,899 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 10245,18399,0,2094,429,899 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 16101,23955,0,1041,1926,899 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 10245,18399,0,2733,429,899 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 13173,23955,330,2928,609,899 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 10245,18399,330,1605,1116,899 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 14637,23955,0,3939,-89,899 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 9270,18339,330,3345,672,899 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 14637,17895,5019,3939,633,899 2 75230 -- MSL 468 ( 9E 222)
+u0074_0327 7317,15339,4785,1908,3291,899 0 75262 -- MSL 469 ( 9E 254)
+u0055_030B 19029,23955,330,3246,-1634,899 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 13173,18399,330,2400,468,899 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 19029,23865,330,3246,-1634,899 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 13173,18309,330,747,468,747 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 14637,23955,0,2856,1710,899 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 10245,18399,2163,1446,1815,899 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 14637,23085,0,2856,1710,899 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 10245,17124,2163,1122,1815,899 2 75199 -- MSL 485 ( 9E 191)
+u2070 9270,18060,0,2427,-944,899 2 51753 -- MSL 1000 ( 6J 41)
+u2074 9270,18060,0,2415,-599,899 2 51748 -- MSL 1001 ( 6J 36)
+u2075 9270,17895,0,2130,-335,899 2 51749 -- MSL 1002 ( 6J 37)
+u2076 9270,18060,0,2892,-791,899 2 51806 -- MSL 1003 ( 6J 94)
+u2077 9270,17895,0,3513,-1637,899 2 51750 -- MSL 1004 ( 6J 38)
+u2078 9270,18060,0,2175,-812,899 2 51754 -- MSL 1005 ( 6J 42)
+u2079 9270,18060,0,2847,-845,899 2 51752 -- MSL 1006 ( 6J 40)
+lq 13173,18225,0,1320,-3569,899 2 161171 -- MSL 1017 (19U 147)
+rq 13173,18225,0,1332,-3581,899 2 161172 -- MSL 1018 (19U 148)
+Bq 13173,3039,3156,0,453 0 161156 -- MSL 1019 (19U 132)
+u2003 23418,0,0,0,1317 0 51821 -- MSL 1020 ( 6J 109)
+u2002 13173,0,0,0,1317 0 51822 -- MSL 1021 ( 6J 110)
+u2009 8781,0,0,0,1317 0 51828 -- MSL 1023 ( 6J 116)
+u2026 23418,3360,0,0,483 0 161157 -- MSL 1028 (19U 133)
+vz 10245,18399,2163,1872,1815,899 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,17703,0,5094,-3536,899 2 128299 -- MSL 1034 (15U 43)
+u211E 20001,18315,4056,315,-1013,315 2 51794 -- MSL 1036 ( 6J 82)
+fi 13173,18300,5655,534,5772,534 3 60077 -- MSL 1040 ( 7J 173)
+fl 13173,18300,5655,1773,5736,899 3 60078 -- MSL 1041 ( 7J 174)
+ff 14148,18300,5655,5796,5352,899 3 51883 -- MSL 1042 ( 6J 171)
+Fi 20004,18300,5655,672,5466,672 3 51884 -- MSL 1043 ( 6J 172)
+Fl 20004,18300,5655,1851,5418,899 3 51885 -- MSL 1044 ( 6J 173)
+ij 13173,18369,5655,1212,435,899 3 60134 -- MSL 1047 ( 7J 230)
+u2105 23418,18225,330,1125,-842,899 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 19029,23700,330,2301,-605,899 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 13173,18339,5655,1122,1281,899 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 13173,18225,5019,2190,609,899 2 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 10245,12669,4785,786,1368,786 0 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 8781,23085,0,3165,1716,899 2 46301 -- MSL 1065 ( 5T 221)
+bq 8781,3039,3156,0,-581 0 161154 -- MSL 1067 (19U 130)
+%0 32202,18894,1026,0,-3134 2 161161 -- MSL 1068 (19U 137)
+a- 13173,15819,0,867,-4256,867 0 60154 -- MSL 1084 ( 7J 250)
+ab 13173,18339,0,1122,-4280,899 2 75170 -- MSL 1086 ( 9E 162)
+a. 13173,17124,0,0,-6221 2 75263 -- MSL 1088 ( 9E 255)
+oe 17565,12669,330,1107,711,899 0 161180 -- MSL 1090 (19U 156)
+OE 24882,18225,330,2016,978,899 2 161164 -- MSL 1091 (19U 140)
+fo 7317,10095,0,939,333,899 0 161163 -- MSL 1092 (19U 139)
+fc 7317,10095,0,774,498,774 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624,0,0,-2021 0 60091 -- MSL 1094 ( 7J 187)
+/L 14637,17895,0,1023,2487,899 2 75171 -- MSL 1095 ( 9E 163)
+/l 7317,18300,330,1749,654,899 2 75187 -- MSL 1096 ( 9E 179)
+a" 13173,18399,0,3321,-4643,899 2 75197 -- MSL 1097 ( 9E 189)
+ho 13173,564,3186,0,-3845 0 75186 -- MSL 1098 ( 9E 178)
+vZ 14637,23955,0,2856,1710,899 2 75150 -- MSL 1106 ( 9E 142)
+IJ 21465,17895,330,1872,1716,899 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/TNRB b/font/devlj4/TNRB
new file mode 100644
index 0000000..5102900
--- /dev/null
+++ b/font/devlj4/TNRB
@@ -0,0 +1,444 @@
+# M Times Bd
+name TNRB
+spacewidth 6615
+pcltypeface 16901
+pclproportional 1
+pclweight 3
+pclstyle 0
+ligatures fi fl 0
+kernpairs
+1 1 -1459
+A T -1963
+A V -3410
+A W -2932
+A Y -2428
+A v -1963
+A w -1963
+A y -1963
+A cq -1963
+A ' -1963
+F , -2428
+F . -2428
+F A -1963
+L T -2428
+L V -2428
+L W -2428
+L Y -2428
+L y -1459
+L cq -2428
+L ' -2428
+P , -2428
+P . -2428
+P A -1963
+R T -929
+R V -929
+R W -929
+R Y -929
+R y -929
+T , -1963
+T hy -2428
+T - -2428
+T . -1963
+T : -1963
+T ; -1963
+T A -1963
+T O -477
+T a -2428
+T c -2428
+T e -2428
+T i -477
+T o -2428
+T r -1963
+T s -2428
+T u -2428
+T w -1963
+T y -1963
+V , -3410
+V hy -1963
+V - -1963
+V . -3410
+V : -2428
+V ; -2428
+V A -3410
+V O -529
+V a -2428
+V e -2428
+V i -981
+V o -2428
+V r -1963
+V u -2428
+V y -2428
+W , -2428
+W hy -981
+W - -981
+W . -2428
+W : -1459
+W ; -1459
+W A -2932
+W a -1459
+W e -1459
+W i -477
+W o -1459
+W r -477
+W u -477
+W y -981
+Y , -2428
+Y hy -2428
+Y - -2428
+Y . -2428
+Y : -2428
+Y ; -2428
+Y A -2428
+Y a -2932
+Y e -2932
+Y i -981
+Y o -2932
+Y p -2428
+Y q -2932
+Y u -2428
+Y v -2932
+f f 0
+f cq 1460
+f ' 1460
+r , -2428
+r hy -981
+r - -981
+r . -2428
+r c -477
+r e -477
+r h 0
+r o -477
+r q -477
+r t 0
+r w 0
+r x 0
+r y 0
+r z 0
+r cq 478
+r ' 478
+v , -1459
+v . -1459
+w , -1459
+w . -1459
+y , -1459
+y . -1459
+oq oq -1963
+oq ` -1963
+` oq -1963
+` ` -1963
+cq s -981
+' s -981
+cq cq -1963
+cq ' -1963
+' cq -1963
+' ' -1963
+charset
+! 8811,17919,349 2 161057 -- U+0021 (19U 33)
+dq 14689,17919 2 161058 -- U+0022 (19U 34)
+" "
+sh 13229,17880,362 2 161059 -- U+0023 (19U 35)
+# "
+Do 13229,17996,1783 2 161060 -- U+0024 (19U 36)
+$ "
+% 26458,17919,736 2 161061 -- U+0025 (19U 37)
+& 22040,17919,400 2 161062 -- U+0026 (19U 38)
+aq 7351,17919 2 161063 -- U+0027 (19U 39)
+( 8811,17919,5297 3 161064 -- U+0028 (19U 40)
+) 8811,17919,5297 3 161065 -- U+0029 (19U 41)
+* 13229,17919 2 161066 -- U+002A (19U 42)
++ 15077,15813 0 161067 -- U+002B (19U 43)
+, 6615,3966,4638 0 161068 -- U+002C (19U 44)
+hy 8811,7416 0 161069 -- U+002D (19U 45)
+- "
+. 6615,3979,323 0 161070 -- U+002E (19U 46)
+sl 7351,17919,400 2 161071 -- U+002F (19U 47)
+/ "
+0 13229,17880,362 2 161072 -- U+0030 (19U 48)
+1 13229,17880 2 161073 -- U+0031 (19U 49)
+2 13229,17880 2 161074 -- U+0032 (19U 50)
+3 13229,17880,375 2 161075 -- U+0033 (19U 51)
+4 13229,17880 2 161076 -- U+0034 (19U 52)
+5 13229,17518,362 2 161077 -- U+0035 (19U 53)
+6 13229,17880,362 2 161078 -- U+0036 (19U 54)
+7 13229,17518,362 2 161079 -- U+0037 (19U 55)
+8 13229,17815,362 2 161080 -- U+0038 (19U 56)
+9 13229,17880,362 2 161081 -- U+0039 (19U 57)
+: 8811,12428,323 0 161082 -- U+003A (19U 58)
+; 8811,12428,4638 0 161083 -- U+003B (19U 59)
+< 15077,15025 0 161084 -- U+003C (19U 60)
+= 15077,11679 0 161085 -- U+003D (19U 61)
+> 15077,15025 0 161086 -- U+003E (19U 62)
+? 13229,17919,349 2 161087 -- U+003F (19U 63)
+at 24611,17919,5710 3 161088 -- U+0040 (19U 64)
+@ "
+A 19107,17880 2 161089 -- U+0041 (19U 65)
+B 17648,17518 2 161090 -- U+0042 (19U 66)
+C 19107,17919,400 2 161091 -- U+0043 (19U 67)
+D 19107,17518 2 161092 -- U+0044 (19U 68)
+E 17648,17518 2 161093 -- U+0045 (19U 69)
+F 16162,17518 2 161094 -- U+0046 (19U 70)
+G 20580,17932,413 2 161095 -- U+0047 (19U 71)
+H 20580,17518 2 161096 -- U+0048 (19U 72)
+I 10297,17518 2 161097 -- U+0049 (19U 73)
+J 13229,17518,400 2 161098 -- U+004A (19U 74)
+K 20580,17518 2 161099 -- U+004B (19U 75)
+L 17648,17518 2 161100 -- U+004C (19U 76)
+M 24973,17518 2 161101 -- U+004D (19U 77)
+N 19107,17518,400 2 161102 -- U+004E (19U 78)
+O 20580,17919,400 2 161103 -- U+004F (19U 79)
+P 16162,17518 2 161104 -- U+0050 (19U 80)
+Q 20580,17919,4780 2 161105 -- U+0051 (19U 81)
+R 19107,17518 2 161106 -- U+0052 (19U 82)
+S 14715,17919,413 2 161107 -- U+0053 (19U 83)
+T 17648,17518 2 161108 -- U+0054 (19U 84)
+U 19107,17518,413 2 161109 -- U+0055 (19U 85)
+V 19107,17518,400 2 161110 -- U+0056 (19U 86)
+W 26458,17518,400 2 161111 -- U+0057 (19U 87)
+X 19107,17518 2 161112 -- U+0058 (19U 88)
+Y 19107,17518 2 161113 -- U+0059 (19U 89)
+Z 17648,17518 2 161114 -- U+005A (19U 90)
+lB 8811,17518,4832 2 161115 -- U+005B (19U 91)
+[ "
+rs 7351,17919,400 2 161116 -- U+005C (19U 92)
+\ "
+rB 8811,17518,4832 2 161117 -- U+005D (19U 93)
+] "
+ha 15374,17880 2 161118 -- U+005E (19U 94)
+_ 13229,0,5710 1 161119 -- U+005F (19U 95)
+ga 8811,18113 2 161120 -- U+0060 (19U 96)
+a 13229,12441,168 0 161121 -- U+0061 (19U 97)
+b 14715,17518,362 2 161122 -- U+0062 (19U 98)
+c 11743,12441,362 0 161123 -- U+0063 (19U 99)
+d 14715,17518,362 2 161124 -- U+0064 (19U 100)
+e 11743,12441,362 0 161125 -- U+0065 (19U 101)
+f 8811,17919 2 161126 -- U+0066 (19U 102)
+g 13229,12441,5710 1 161127 -- U+0067 (19U 103)
+h 14715,17518 2 161128 -- U+0068 (19U 104)
+i 7351,17932 2 161129 -- U+0069 (19U 105)
+j 8811,17919,5710 3 161130 -- U+006A (19U 106)
+k 14715,17518 2 161131 -- U+006B (19U 107)
+l 7351,17518 2 161132 -- U+006C (19U 108)
+m 22040,12441 0 161133 -- U+006D (19U 109)
+n 14715,12441 0 161134 -- U+006E (19U 110)
+o 13229,12441,362 0 161135 -- U+006F (19U 111)
+p 14715,12441,5659 1 161136 -- U+0070 (19U 112)
+q 14715,12441,5659 1 161137 -- U+0071 (19U 113)
+r 11743,12441 0 161138 -- U+0072 (19U 114)
+s 10297,12441,362 0 161139 -- U+0073 (19U 115)
+t 8811,16498,168 2 161140 -- U+0074 (19U 116)
+u 14715,12079,362 0 161141 -- U+0075 (19U 117)
+v 13229,12079,362 0 161142 -- U+0076 (19U 118)
+w 19107,12079,362 0 161143 -- U+0077 (19U 119)
+x 13229,12079 0 161144 -- U+0078 (19U 120)
+y 13229,12079,5710 1 161145 -- U+0079 (19U 121)
+z 11743,12079 0 161146 -- U+007A (19U 122)
+{ 10426,17919,5361 3 161147 -- U+007B (19U 123)
+lC "
+| 5827,17919,5710 3 161148 -- U+007C (19U 124)
+ba "
+} 10426,17945,5349 3 161149 -- U+007D (19U 125)
+rC "
+ti 13759,9173 0 161150 -- U+007E (19U 126)
+r! 8811,12570,5710 1 161185 -- U+00A1 (19U 161)
+ct 13229,17415,4871 2 161186 -- U+00A2 (19U 162)
+Po 13229,17983,362 2 161187 -- U+00A3 (19U 163)
+Cs 13229,15012 0 161188 -- U+00A4 (19U 164)
+Ye 13229,17518 2 161189 -- U+00A5 (19U 165)
+bb 5827,17919,5710 3 161190 -- U+00A6 (19U 166)
+sc 13229,17919,5710 3 161191 -- U+00A7 (19U 167)
+ad 8811,17673 2 161192 -- U+00A8 (19U 168)
+co 19766,17919,400 2 161193 -- U+00A9 (19U 169)
+Of 7932,17880 2 161194 -- U+00AA (19U 170)
+Fo 13229,11976 0 161195 -- U+00AB (19U 171)
+tno 15077,11653 0 161196 -- U+00AC (19U 172)
+u00AD 8811,7416 0 161197 -- U+00AD (19U 173)
+rg 19766,17919,400 2 161198 -- U+00AE (19U 174)
+u00AF 13229,20580 2 161199 -- U+00AF (19U 175)
+de 10581,17880 2 161200 -- U+00B0 (19U 176)
+t+- 14521,15813 0 161201 -- U+00B1 (19U 177)
+S2 7932,17880 2 161202 -- U+00B2 (19U 178)
+S3 7932,17880 2 161203 -- U+00B3 (19U 179)
+aa 8811,18113 2 161204 -- U+00B4 (19U 180)
+mc 15245,12079,5697 1 161205 -- U+00B5 (19U 181)
+ps 14289,17518,5710 3 161206 -- U+00B6 (19U 182)
+pc 6615,10917 0 60157 -- U+00B7 ( 7J 253)
+ac 8811,155,4987 0 161208 -- U+00B8 (19U 184)
+S1 7932,17880 2 161209 -- U+00B9 (19U 185)
+Om 8733,17880 2 161210 -- U+00BA (19U 186)
+Fc 13229,11976 0 161211 -- U+00BB (19U 187)
+14 19844,17880,762 2 161212 -- U+00BC (19U 188)
+12 19844,17880,762 2 161213 -- U+00BD (19U 189)
+34 19844,17880,762 2 161214 -- U+00BE (19U 190)
+r? 13229,12557,5710 1 161215 -- U+00BF (19U 191)
+`A 19107,23500 2 161216 -- U+00C0 (19U 192)
+'A 19107,23500 2 161217 -- U+00C1 (19U 193)
+^A 19107,23500 2 161218 -- U+00C2 (19U 194)
+~A 19107,22660 2 161219 -- U+00C3 (19U 195)
+:A 19107,22686 2 161220 -- U+00C4 (19U 196)
+oA 19107,22247 2 161221 -- U+00C5 (19U 197)
+AE 26458,17518 2 161222 -- U+00C6 (19U 198)
+,C 19107,17919,4987 2 161223 -- U+00C7 (19U 199)
+`E 17648,23500 2 161224 -- U+00C8 (19U 200)
+'E 17648,23500 2 161225 -- U+00C9 (19U 201)
+^E 17648,23500 2 161226 -- U+00CA (19U 202)
+:E 17648,22686 2 161227 -- U+00CB (19U 203)
+`I 10297,23500 2 161228 -- U+00CC (19U 204)
+'I 10297,23500 2 161229 -- U+00CD (19U 205)
+^I 10297,23500 2 161230 -- U+00CE (19U 206)
+:I 10297,22686 2 161231 -- U+00CF (19U 207)
+-D 19107,17518 2 161232 -- U+00D0 (19U 208)
+~N 19107,22686,400 2 161233 -- U+00D1 (19U 209)
+`O 20580,23500,400 2 161234 -- U+00D2 (19U 210)
+'O 20580,23500,400 2 161235 -- U+00D3 (19U 211)
+^O 20580,23500,400 2 161236 -- U+00D4 (19U 212)
+~O 20580,22686,400 2 161237 -- U+00D5 (19U 213)
+:O 20580,22686,400 2 161238 -- U+00D6 (19U 214)
+tmu 15077,14366 0 161239 -- U+00D7 (19U 215)
+/O 20580,18345,995 2 161240 -- U+00D8 (19U 216)
+`U 19107,23500,413 2 161241 -- U+00D9 (19U 217)
+'U 19107,23500,413 2 161242 -- U+00DA (19U 218)
+^U 19107,23500,413 2 161243 -- U+00DB (19U 219)
+:U 19107,22686,413 2 161244 -- U+00DC (19U 220)
+'Y 19107,23500 2 161245 -- U+00DD (19U 221)
+TP 16162,17518 2 161246 -- U+00DE (19U 222)
+ss 14715,17919,129 2 161247 -- U+00DF (19U 223)
+`a 13229,18113,168 2 161248 -- U+00E0 (19U 224)
+'a 13229,18113,168 2 161249 -- U+00E1 (19U 225)
+^a 13229,18436,168 2 161250 -- U+00E2 (19U 226)
+~a 13229,17725,168 2 161251 -- U+00E3 (19U 227)
+:a 13229,17686,168 2 161252 -- U+00E4 (19U 228)
+oa 13229,18565,168 2 161253 -- U+00E5 (19U 229)
+ae 19107,12441,362 0 161254 -- U+00E6 (19U 230)
+,c 11743,12441,4987 0 161255 -- U+00E7 (19U 231)
+`e 11743,18113,362 2 161256 -- U+00E8 (19U 232)
+'e 11743,18113,362 2 161257 -- U+00E9 (19U 233)
+^e 11743,18436,362 2 161258 -- U+00EA (19U 234)
+:e 11743,17686,362 2 161259 -- U+00EB (19U 235)
+`i 7351,18113 2 161260 -- U+00EC (19U 236)
+'i 7351,18113 2 161261 -- U+00ED (19U 237)
+^i 7351,18436 2 161262 -- U+00EE (19U 238)
+:i 7351,17686 2 161263 -- U+00EF (19U 239)
+Sd 13229,17919,362 2 161264 -- U+00F0 (19U 240)
+~n 14715,17725 2 161265 -- U+00F1 (19U 241)
+`o 13229,18113,362 2 161266 -- U+00F2 (19U 242)
+'o 13229,18113,362 2 161267 -- U+00F3 (19U 243)
+^o 13229,18436,362 2 161268 -- U+00F4 (19U 244)
+~o 13229,17725,362 2 161269 -- U+00F5 (19U 245)
+:o 13229,17686,362 2 161270 -- U+00F6 (19U 246)
+tdi 14521,14418 0 161271 -- U+00F7 (19U 247)
+/o 13229,12777,362 0 161272 -- U+00F8 (19U 248)
+`u 14715,18113,362 2 161273 -- U+00F9 (19U 249)
+'u 14715,18113,362 2 161274 -- U+00FA (19U 250)
+^u 14715,18436,362 2 161275 -- U+00FB (19U 251)
+:u 14715,17686,362 2 161276 -- U+00FC (19U 252)
+'y 13229,18113,5710 3 161277 -- U+00FD (19U 253)
+Tp 14715,17919,5710 3 161278 -- U+00FE (19U 254)
+:y 13229,17686,5710 3 161279 -- U+00FF (19U 255)
+u0041_0306 19107,23151 2 75203 -- U+0102 ( 9E 195)
+u0061_0306 13229,17919,168 2 75235 -- U+0103 ( 9E 227)
+u0041_0328 19107,17880,5969 3 75173 -- U+0104 ( 9E 165)
+u0061_0328 13229,12441,5969 1 75193 -- U+0105 ( 9E 185)
+'C 19107,23500,400 2 75206 -- U+0106 ( 9E 198)
+'c 11743,18113,362 2 75238 -- U+0107 ( 9E 230)
+u0041_030C 19107,23577,400 2 75208 -- U+010C ( 9E 200)
+u0061_030C 11743,18436,362 2 75240 -- U+010D ( 9E 232)
+u0044_030C 19107,23577 2 75215 -- U+010E ( 9E 207)
+u0064_030C 19405,17919,362 2 75247 -- U+010F ( 9E 239)
+u0111 14715,17518,362 2 75248 -- U+0111 ( 9E 240)
+u0045_0328 17648,17518,5969 3 75210 -- U+0118 ( 9E 202)
+u0065_0328 11743,12441,5969 1 75242 -- U+0119 ( 9E 234)
+u0045_030C 17648,23577 2 75212 -- U+011A ( 9E 204)
+u0065_030C 11743,18436,362 2 75244 -- U+011B ( 9E 236)
+u0047_0306 20580,23151,413 2 46288 -- U+011E ( 5T 208)
+u0067_0306 13229,17919,5710 3 46320 -- U+011F ( 5T 240)
+u0049_0307 10297,22673 2 46301 -- U+0130 ( 5T 221)
+.i 7351,12079 0 46333 -- U+0131 ( 5T 253)
+IJ 21769,17518,400 2 60135 -- U+0132 ( 7J 231)
+ij 14612,17932,5710 3 60134 -- U+0133 ( 7J 230)
+u004C_0301 17648,23500 2 75205 -- U+0139 ( 9E 197)
+u006C_0301 7351,23500 2 75237 -- U+013A ( 9E 229)
+u004C_030C 17648,17919 2 75196 -- U+013D ( 9E 188)
+u006C_030C 12402,17919 2 75198 -- U+013E ( 9E 190)
+u013F 17648,17518 2 95646 -- U+013F (11U 158)
+u0140 10464,17518 2 95647 -- U+0140 (11U 159)
+/L 17648,17518 2 75171 -- U+0141 ( 9E 163)
+/l 7351,17518 2 75187 -- U+0142 ( 9E 179)
+u004E_0301 19107,23500,400 2 75217 -- U+0143 ( 9E 209)
+u006E_0301 14715,18113 2 75249 -- U+0144 ( 9E 241)
+u004E_030C 19107,23577,400 2 75218 -- U+0147 ( 9E 210)
+u006E_030C 14715,18436 2 75250 -- U+0148 ( 9E 242)
+u0149 19288,17919 2 95660 -- U+0149 (11U 172)
+u004F_030B 20580,23487,400 2 75221 -- U+0150 ( 9E 213)
+u006F_030B 13229,18113,362 2 75253 -- U+0151 ( 9E 245)
+OE 26458,17764,233 2 161164 -- U+0152 (19U 140)
+oe 19107,12441,362 0 161180 -- U+0153 (19U 156)
+u0052_0301 19107,23500 2 75200 -- U+0154 ( 9E 192)
+u0072_0301 11743,18113 2 75232 -- U+0155 ( 9E 224)
+u0052_030C 19107,23577 2 75224 -- U+0158 ( 9E 216)
+u0072_030C 11743,18436 2 75256 -- U+0159 ( 9E 248)
+u0053_0301 14715,23500,413 2 75148 -- U+015A ( 9E 140)
+u0073_0301 10297,18113,362 2 75164 -- U+015B ( 9E 156)
+u0053_0327 14715,17919,4987 2 75178 -- U+015E ( 9E 170)
+u0073_0327 10297,12441,4974 0 75194 -- U+015F ( 9E 186)
+vS 14715,23577,413 2 161162 -- U+0160 (19U 138)
+vs 10297,18436,362 2 161178 -- U+0161 (19U 154)
+u0054_0327 17648,17518,6382 3 75230 -- U+0162 ( 9E 222)
+u0074_0327 8811,16498,6382 3 75262 -- U+0163 ( 9E 254)
+u0054_030C 17648,23577 2 75149 -- U+0164 ( 9E 141)
+u0074_030C 13785,17919,168 2 75165 -- U+0165 ( 9E 157)
+u0055_030A 19107,24004,413 2 75225 -- U+016E ( 9E 217)
+u0075_030A 14715,18565,362 2 75257 -- U+016F ( 9E 249)
+u0055_030B 19107,23487,413 2 75227 -- U+0170 ( 9E 219)
+u0075_030B 14715,18113,362 2 75259 -- U+0171 ( 9E 251)
+:Y 19107,22686 2 161183 -- U+0178 (19U 159)
+u005A_0301 17648,23500 2 75151 -- U+0179 ( 9E 143)
+u007A_0301 11743,18113 2 75167 -- U+017A ( 9E 159)
+u005A_0307 17648,22673 2 75183 -- U+017B ( 9E 175)
+u007A_0307 11743,17673 2 75199 -- U+017C ( 9E 191)
+vZ 17648,23577 2 75150 -- U+017D ( 9E 142)
+vz 11743,18436 2 75166 -- U+017E ( 9E 158)
+Fn 13229,17932,5710 3 161155 -- U+0192 (19U 131)
+a^ 8811,18436 2 161160 -- U+02C6 (19U 136)
+^ "
+ah 8811,18436 2 75169 -- U+02C7 ( 9E 161)
+a- 8811,16201 2 60154 -- U+02C9 ( 7J 250)
+ab 8811,17919 2 75170 -- U+02D8 ( 9E 162)
+a. 8811,17673 2 75263 -- U+02D9 ( 9E 255)
+ao 8811,18565 2 60152 -- U+02DA ( 7J 248)
+ho 8811,220,5969 1 75186 -- U+02DB ( 9E 178)
+~ 8811,17699 2 161176 -- U+02DC (19U 152)
+a~ "
+a" 8811,18113 2 75197 -- U+02DD ( 9E 189)
+en 13229,6899 0 161174 -- U+2013 (19U 150)
+em 26458,6899 0 161175 -- U+2014 (19U 151)
+u2017 13229,0,5710 1 60095 -- U+2017 ( 7J 191)
+oq 8811,17919 2 161169 -- U+2018 (19U 145)
+` "
+cq 8811,17919 2 161170 -- U+2019 (19U 146)
+' "
+bq 8811,3966,4638 0 161154 -- U+201A (19U 130)
+lq 13229,17919 2 161171 -- U+201C (19U 147)
+rq 13229,17919 2 161172 -- U+201D (19U 148)
+Bq 13229,3992,4638 0 161156 -- U+201E (19U 132)
+dg 13229,17518,5181 3 161158 -- U+2020 (19U 134)
+dd 13229,17518,5245 3 161159 -- U+2021 (19U 135)
+bu 9263,12428 0 161173 -- U+2022 (19U 149)
+u2026 26458,3979,349 0 161157 -- U+2026 (19U 133)
+%0 26458,17919,736 2 161161 -- U+2030 (19U 137)
+fm 7441,17919 2 60101 -- U+2032 ( 7J 197)
+sd 14612,17919 2 60102 -- U+2033 ( 7J 198)
+fo 8811,11963 0 161163 -- U+2039 (19U 139)
+fc 8811,11963 0 161179 -- U+203A (19U 155)
+u203C 15981,17919,349 2 87315 -- U+203C (10U 19)
+u207F 9198,14689 0 87548 -- U+207F (10U 252)
+u20A7 25632,17518,336 2 60121 -- U+20A7 ( 7J 217)
+Eu 13229,17880,362 2 161152 -- U+20AC (19U 128)
+u2105 22040,17919,736 2 60072 -- U+2105 ( 7J 168)
+u2113 9922,17919,362 2 60122 -- U+2113 ( 7J 218)
+tm 26458,17518 2 161177 -- U+2122 (19U 153)
+\- 15077,9612 0 60096 -- U+2212 ( 7J 192)
+f/ 4418,17880,762 2 60109 -- U+2215 ( 7J 205)
+sq 15981,12196 0 60091 -- U+25A1 ( 7J 187)
+u25CA 13074,18371 2 101079 -- U+25CA (12J 215)
+fi 14715,17919 2 60077 -- U+FB01 ( 7J 173)
+fl 14715,17919 2 60078 -- U+FB02 ( 7J 174)
diff --git a/font/devlj4/TNRBI b/font/devlj4/TNRBI
new file mode 100644
index 0000000..a7db54e
--- /dev/null
+++ b/font/devlj4/TNRBI
@@ -0,0 +1,433 @@
+# M Times New BdIt
+name TNRBI
+spacewidth 6615
+slant 16.340000
+pcltypeface 16901
+pclproportional 1
+pclweight 3
+pclstyle 1
+ligatures fi fl 0
+kernpairs
+1 1 -1459
+A T -1459
+A V -1963
+A W -2428
+A Y -1459
+A v -1963
+A w -1963
+A y -1963
+A cq -1963
+A ' -1963
+F , -3410
+F . -3410
+F A -2428
+L T -477
+L V -981
+L W -981
+L Y -981
+L y -981
+L cq -1459
+L ' -1459
+P , -3410
+P . -3410
+P A -1963
+R V -477
+R W -477
+R Y -477
+R y -477
+T , -2428
+T hy -2428
+T - -2428
+T . -2428
+T : -1963
+T ; -1963
+T A -1459
+T O -477
+T a -2428
+T c -2428
+T e -2428
+T i -981
+T o -2428
+T r -981
+T s -2428
+T u -981
+T w -981
+T y -981
+V , -3410
+V hy -1459
+V - -1459
+V . -3410
+V : -1963
+V ; -1963
+V A -1963
+V a -2932
+V e -2932
+V i -1459
+V o -2932
+V r -1459
+V u -1459
+V y -1963
+W , -1963
+W hy -981
+W - -981
+W . -1963
+W : -1459
+W ; -1459
+W A -1963
+W a -1963
+W e -1963
+W i -981
+W o -1963
+W r -1963
+W u -1459
+W y -1459
+Y , -2428
+Y hy -2428
+Y - -2428
+Y . -1963
+Y : -2428
+Y ; -2428
+Y A -1963
+Y a -2428
+Y e -2932
+Y i -1459
+Y o -2932
+Y p -1963
+Y q -2932
+Y u -2428
+Y v -2428
+f f -477
+f cq 1460
+f ' 1460
+r , -1459
+r . -1459
+r cq 982
+r ' 982
+v , -981
+v . -981
+w , -981
+w . -981
+y , -981
+y . -981
+oq oq -1963
+oq ` -1963
+` oq -1963
+` ` -1963
+cq s -1963
+' s -1963
+cq t -981
+' t -981
+cq cq -1963
+cq ' -1963
+' cq -1963
+' ' -1963
+charset
+! 10297,17919,362,323,-141,211 2 161057 -- U+0021 (19U 33)
+dq 14689,17919,0,1421,-3035,211 2 161058 -- U+0022 (19U 34)
+" "
+sh 13229,17880,362,1305,284,211 2 161059 -- U+0023 (19U 35)
+# "
+Do 13229,18629,2002,1305,297,211 2 161060 -- U+0024 (19U 36)
+$ "
+% 22040,17919,749,0,-1536 2 161061 -- U+0025 (19U 37)
+& 20580,17919,400,0,103 2 161062 -- U+0026 (19U 38)
+aq 7351,17919,0,2287,-2802,211 2 161063 -- U+0027 (19U 39)
+( 8811,17919,5038,4005,-12,211 2 161064 -- U+0028 (19U 40)
+) 8811,17919,5038,0,4302 2 161065 -- U+0029 (19U 41)
+* 13229,17919,0,1550,-1859,211 2 161066 -- U+002A (19U 42)
++ 15077,15813,0,1395,284,211 0 161067 -- U+002B (19U 43)
+, 6615,3940,4250,0,2067 0 161068 -- U+002C (19U 44)
+hy 8811,7144,0,1034,1150,211 0 161069 -- U+002D (19U 45)
+- "
+. 6615,3876,362,0,1667 0 161070 -- U+002E (19U 46)
+sl 7351,17880,400,4935,3462,211 2 161071 -- U+002F (19U 47)
+/ "
+0 13229,17880,362,1279,-141,211 2 161072 -- U+0030 (19U 48)
+1 13229,17880,0,0,698 2 161073 -- U+0031 (19U 49)
+2 13229,17880,0,866,1214,211 2 161074 -- U+0032 (19U 50)
+3 13229,17880,362,517,995,211 2 161075 -- U+0033 (19U 51)
+4 13229,17880,362,1369,853,211 2 161076 -- U+0034 (19U 52)
+5 13229,17518,375,1421,310,211 2 161077 -- U+0035 (19U 53)
+6 13229,18022,362,1589,-270,211 2 161078 -- U+0036 (19U 54)
+7 13229,17518,362,2739,-1795,211 2 161079 -- U+0037 (19U 55)
+8 13229,17880,362,1072,336,211 2 161080 -- U+0038 (19U 56)
+9 13229,18009,375,1124,194,211 2 161081 -- U+0039 (19U 57)
+: 8811,11950,362,155,258,155 0 161082 -- U+003A (19U 58)
+; 8811,11963,4250,233,1305,211 0 161083 -- U+003B (19U 59)
+< 15077,15025,0,1382,284,211 0 161084 -- U+003C (19U 60)
+= 15077,11679,0,1408,284,211 0 161085 -- U+003D (19U 61)
+> 15077,15025,0,1382,284,211 0 161086 -- U+003E (19U 62)
+? 13229,17919,375,685,-1020,211 2 161087 -- U+003F (19U 63)
+at 22014,17919,5710,2041,1421,211 3 161088 -- U+0040 (19U 64)
+@ "
+A 17648,17919,0,0,2816 2 161089 -- U+0041 (19U 65)
+B 17648,17518,0,736,1990,211 2 161090 -- U+0042 (19U 66)
+C 17648,17919,400,2739,-412,211 2 161091 -- U+0043 (19U 67)
+D 19107,17518,0,775,2274,211 2 161092 -- U+0044 (19U 68)
+E 17648,17518,0,1654,2248,211 2 161093 -- U+0045 (19U 69)
+F 17648,17518,0,2791,1318,211 2 161094 -- U+0046 (19U 70)
+G 19107,17919,400,1977,-516,211 2 161095 -- U+0047 (19U 71)
+H 20580,17518,0,3540,2170,211 2 161096 -- U+0048 (19U 72)
+I 10297,17518,0,3372,2248,211 2 161097 -- U+0049 (19U 73)
+J 13229,17518,400,3902,1524,211 2 161098 -- U+004A (19U 74)
+K 17648,17518,0,3424,2170,211 2 161099 -- U+004B (19U 75)
+L 16162,17518,0,233,2170,211 2 161100 -- U+004C (19U 76)
+M 23526,17518,0,3566,2209,211 2 161101 -- U+004D (19U 77)
+N 19107,17518,194,3669,2170,211 2 161102 -- U+004E (19U 78)
+O 19107,17932,413,1214,-89,211 2 161103 -- U+004F (19U 79)
+P 16162,17518,0,2183,2106,211 2 161104 -- U+0050 (19U 80)
+Q 19107,17919,5504,1201,-89,211 3 161105 -- U+0051 (19U 81)
+R 17648,17518,0,581,2157,211 2 161106 -- U+0052 (19U 82)
+S 14715,17919,400,2041,1899,211 2 161107 -- U+0053 (19U 83)
+T 16162,17518,0,3488,-787,211 2 161108 -- U+0054 (19U 84)
+U 19107,17518,400,3604,-1162,211 2 161109 -- U+0055 (19U 85)
+V 17648,17518,400,4212,-1821,211 2 161110 -- U+0056 (19U 86)
+W 23526,17518,400,4302,-1937,211 2 161111 -- U+0057 (19U 87)
+X 17648,17518,0,3863,2920,211 2 161112 -- U+0058 (19U 88)
+Y 16162,17518,0,4121,-1136,211 2 161113 -- U+0059 (19U 89)
+Z 16162,17518,0,3114,2041,211 2 161114 -- U+005A (19U 90)
+lB 8811,17518,4871,3850,2080,211 2 161115 -- U+005B (19U 91)
+[ "
+rs 7351,17880,400,0,-748 2 161116 -- U+005C (19U 92)
+\ "
+rB 8811,17518,4871,1679,4250,211 2 161117 -- U+005D (19U 93)
+] "
+ha 15077,17880,0,517,-1368,211 2 161118 -- U+005E (19U 94)
+_ 13229,0,5710,0,3643 1 161119 -- U+005F (19U 95)
+ga 8811,17919,0,840,-1834,211 2 161120 -- U+0060 (19U 96)
+a 13229,11976,362,762,801,211 0 161121 -- U+0061 (19U 97)
+b 13229,17919,362,491,1072,211 2 161122 -- U+0062 (19U 98)
+c 11743,11976,362,1098,620,211 0 161123 -- U+0063 (19U 99)
+d 13229,17919,362,2519,788,211 2 161124 -- U+0064 (19U 100)
+e 11743,11976,362,1214,736,211 0 161125 -- U+0065 (19U 101)
+f 8811,17919,5710,5930,5555,211 3 161126 -- U+0066 (19U 102)
+g 13229,11976,5710,1757,2687,211 1 161127 -- U+0067 (19U 103)
+h 14715,17919,155,0,995 2 161128 -- U+0068 (19U 104)
+i 7351,17919,362,1809,788,211 2 161129 -- U+0069 (19U 105)
+j 7351,17919,5710,1835,5581,211 3 161130 -- U+006A (19U 106)
+k 13229,17919,181,1667,1163,211 2 161131 -- U+006B (19U 107)
+l 7351,17919,362,2338,930,211 2 161132 -- U+006C (19U 108)
+m 20580,11976,142,0,1059 0 161133 -- U+006D (19U 109)
+n 14715,11976,155,0,982 0 161134 -- U+006E (19U 110)
+o 13229,11976,362,517,672,211 0 161135 -- U+006F (19U 111)
+p 13229,11976,5659,633,4548,211 1 161136 -- U+0070 (19U 112)
+q 13229,11976,5659,878,814,211 1 161137 -- U+0071 (19U 113)
+r 10297,11976,0,1667,866,211 0 161138 -- U+0072 (19U 114)
+s 10297,11976,362,866,1331,211 0 161139 -- U+0073 (19U 115)
+t 7351,15128,362,2209,814,211 0 161140 -- U+0074 (19U 116)
+u 14715,11976,362,297,413,211 0 161141 -- U+0075 (19U 117)
+v 11743,11976,362,1279,581,211 0 161142 -- U+0076 (19U 118)
+w 17648,11976,362,1214,581,211 0 161143 -- U+0077 (19U 119)
+x 13229,11976,362,1537,2519,211 0 161144 -- U+0078 (19U 120)
+y 11743,11976,5710,1279,3798,211 1 161145 -- U+0079 (19U 121)
+z 10297,11614,2248,1524,1589,211 0 161146 -- U+007A (19U 122)
+{ 9211,17919,5361,4173,194,211 3 161147 -- U+007B (19U 123)
+lC "
+| 5827,17919,5710,0,-735 3 161148 -- U+007C (19U 124)
+ba "
+} 9211,17932,5349,581,3785,211 3 161149 -- U+007D (19U 125)
+rC "
+ti 15077,9173,0,814,814,211 0 161150 -- U+007E (19U 126)
+r! 10297,12583,5710,0,801 1 161185 -- U+00A1 (19U 161)
+ct 13229,17040,4922,323,-89,211 2 161186 -- U+00A2 (19U 162)
+Po 13229,17880,362,1977,375,211 2 161187 -- U+00A3 (19U 163)
+Cs 13229,15012,0,1602,530,211 0 161188 -- U+00A4 (19U 164)
+Ye 13229,17518,0,4341,1563,211 2 161189 -- U+00A5 (19U 165)
+bb 5827,17919,5710,0,-735 3 161190 -- U+00A6 (19U 166)
+sc 13229,17919,5710,2106,1679,211 3 161191 -- U+00A7 (19U 167)
+ad 8811,17402,0,3126,-1071,211 2 161192 -- U+00A8 (19U 168)
+co 19766,17919,400,1305,-102,211 2 161193 -- U+00A9 (19U 169)
+Of 7041,17880,0,3979,-490,211 2 161194 -- U+00AA (19U 170)
+Fo 13229,11769,129,1137,245,211 0 161195 -- U+00AB (19U 171)
+tno 16033,11653,0,362,375,211 0 161196 -- U+00AC (19U 172)
+u00AD 8811,7144,0,1034,1150,211 0 161197 -- U+00AD (19U 173)
+rg 19766,17919,400,1305,-102,211 2 161198 -- U+00AE (19U 174)
+u00AF 13229,20580,0,5129,-2001,211 2 161199 -- U+00AF (19U 175)
+de 10581,17880,0,2002,-1007,211 2 161200 -- U+00B0 (19U 176)
+t+- 14521,15813,0,1318,930,211 0 161201 -- U+00B1 (19U 177)
+S2 7932,17880,0,2480,13,211 2 161202 -- U+00B2 (19U 178)
+S3 7932,17880,0,2274,-115,211 2 161203 -- U+00B3 (19U 179)
+aa 8811,17919,0,3217,-3875,211 2 161204 -- U+00B4 (19U 180)
+mc 15245,11614,5723,78,2971,78 1 161205 -- U+00B5 (19U 181)
+ps 13229,17518,5710,1886,1835,211 3 161206 -- U+00B6 (19U 182)
+pc 6615,10930,0,956,-684,211 0 60157 -- U+00B7 ( 7J 253)
+ac 8811,0,4858,0,1176 0 161208 -- U+00B8 (19U 184)
+S1 7932,17880,0,1925,-270,211 2 161209 -- U+00B9 (19U 185)
+Om 7932,17880,0,3307,-955,211 2 161210 -- U+00BA (19U 186)
+Fc 13229,11769,129,245,1137,211 0 161211 -- U+00BB (19U 187)
+14 19844,17880,762,129,-244,129 2 161212 -- U+00BC (19U 188)
+12 19844,17880,762,0,-244 2 161213 -- U+00BD (19U 189)
+34 19844,17880,762,116,-89,116 2 161214 -- U+00BE (19U 190)
+r? 13229,12596,5710,0,1201 1 161215 -- U+00BF (19U 191)
+`A 17648,23358,0,168,2816,168 2 161216 -- U+00C0 (19U 192)
+'A 17648,23086,0,3178,2816,211 2 161217 -- U+00C1 (19U 193)
+^A 17648,23164,0,1796,2816,211 2 161218 -- U+00C2 (19U 194)
+~A 17648,22776,0,2377,2816,211 2 161219 -- U+00C3 (19U 195)
+:A 17648,22518,0,2752,2816,211 2 161220 -- U+00C4 (19U 196)
+oA 17648,22337,0,1072,2803,211 2 161221 -- U+00C5 (19U 197)
+AE 24973,17518,0,1705,2803,211 2 161222 -- U+00C6 (19U 198)
+,C 17648,17919,4858,2739,-412,211 2 161223 -- U+00C7 (19U 199)
+`E 17648,23358,0,1654,2248,211 2 161224 -- U+00C8 (19U 200)
+'E 17648,23086,0,1654,2248,211 2 161225 -- U+00C9 (19U 201)
+^E 17648,23164,0,1654,2248,211 2 161226 -- U+00CA (19U 202)
+:E 17648,22518,0,1654,2248,211 2 161227 -- U+00CB (19U 203)
+`I 10297,23358,0,3372,2248,211 2 161228 -- U+00CC (19U 204)
+'I 10297,23086,0,4935,2248,211 2 161229 -- U+00CD (19U 205)
+^I 10297,23164,0,3411,2248,211 2 161230 -- U+00CE (19U 206)
+:I 10297,22518,0,3889,2248,211 2 161231 -- U+00CF (19U 207)
+-D 19107,17518,0,943,2170,211 2 161232 -- U+00D0 (19U 208)
+~N 19107,22273,194,3669,2170,211 2 161233 -- U+00D1 (19U 209)
+`O 19107,23358,413,1214,-89,211 2 161234 -- U+00D2 (19U 210)
+'O 19107,23461,413,1214,-89,211 2 161235 -- U+00D3 (19U 211)
+^O 19107,22841,413,1214,-89,211 2 161236 -- U+00D4 (19U 212)
+~O 19107,22273,413,1214,-89,211 2 161237 -- U+00D5 (19U 213)
+:O 19107,22195,413,1214,-89,211 2 161238 -- U+00D6 (19U 214)
+tmu 15077,14366,0,0,-671 0 161239 -- U+00D7 (19U 215)
+/O 19107,17919,413,1434,220,211 2 161240 -- U+00D8 (19U 216)
+`U 19107,23358,400,3604,-1162,211 2 161241 -- U+00D9 (19U 217)
+'U 19107,23461,400,3604,-1162,211 2 161242 -- U+00DA (19U 218)
+^U 19107,22841,400,3604,-1162,211 2 161243 -- U+00DB (19U 219)
+:U 19107,22195,400,3604,-1162,211 2 161244 -- U+00DC (19U 220)
+'Y 16162,23086,0,4121,-1136,211 2 161245 -- U+00DD (19U 221)
+TP 16162,17518,0,1098,2132,211 2 161246 -- U+00DE (19U 222)
+ss 13229,17919,5710,1473,5827,211 3 161247 -- U+00DF (19U 223)
+`a 13229,17919,362,762,801,211 2 161248 -- U+00E0 (19U 224)
+'a 13229,17919,362,866,801,211 2 161249 -- U+00E1 (19U 225)
+^a 13229,17919,362,762,801,211 2 161250 -- U+00E2 (19U 226)
+~a 13229,17518,362,827,801,211 2 161251 -- U+00E3 (19U 227)
+:a 13229,17402,362,956,801,211 2 161252 -- U+00E4 (19U 228)
+oa 13229,18423,362,762,801,211 2 161253 -- U+00E5 (19U 229)
+ae 19107,11976,362,1163,827,211 0 161254 -- U+00E6 (19U 230)
+,c 11743,11976,4858,1150,568,211 0 161255 -- U+00E7 (19U 231)
+`e 11743,17919,362,1266,685,211 2 161256 -- U+00E8 (19U 232)
+'e 11743,17919,362,3759,685,211 2 161257 -- U+00E9 (19U 233)
+^e 11743,17919,362,1266,685,211 2 161258 -- U+00EA (19U 234)
+:e 11743,17402,362,1757,685,211 2 161259 -- U+00EB (19U 235)
+`i 7351,17919,362,1150,736,211 2 161260 -- U+00EC (19U 236)
+'i 7351,17919,362,3527,736,211 2 161261 -- U+00ED (19U 237)
+^i 7351,17919,362,2958,736,211 2 161262 -- U+00EE (19U 238)
+:i 7351,17402,362,3475,736,211 2 161263 -- U+00EF (19U 239)
+Sd 13229,17919,362,956,646,211 2 161264 -- U+00F0 (19U 240)
+~n 14715,17518,155,0,1034 2 161265 -- U+00F1 (19U 241)
+`o 13229,17919,362,517,672,211 2 161266 -- U+00F2 (19U 242)
+'o 13229,17919,362,1344,672,211 2 161267 -- U+00F3 (19U 243)
+^o 13229,17919,362,517,672,211 2 161268 -- U+00F4 (19U 244)
+~o 13229,17518,362,827,672,211 2 161269 -- U+00F5 (19U 245)
+:o 13229,17402,362,956,672,211 2 161270 -- U+00F6 (19U 246)
+tdi 14521,14418,0,1563,672,211 0 161271 -- U+00F7 (19U 247)
+/o 13229,11976,362,917,917,211 0 161272 -- U+00F8 (19U 248)
+`u 14715,17919,362,245,465,211 2 161273 -- U+00F9 (19U 249)
+'u 14715,17919,362,245,465,211 2 161274 -- U+00FA (19U 250)
+^u 14715,17919,362,245,465,211 2 161275 -- U+00FB (19U 251)
+:u 14715,17402,362,245,465,211 2 161276 -- U+00FC (19U 252)
+'y 11743,17919,5710,1951,3747,211 3 161277 -- U+00FD (19U 253)
+Tp 13229,17919,5710,633,4548,211 3 161278 -- U+00FE (19U 254)
+:y 11743,17402,5710,1331,3747,211 3 161279 -- U+00FF (19U 255)
+u0041_0306 17648,23422,0,3088,2816,211 2 75203 -- U+0102 ( 9E 195)
+u0061_0306 13229,17919,362,762,801,211 2 75235 -- U+0103 ( 9E 227)
+u0041_0328 17648,17919,5271,142,2816,142 3 75173 -- U+0104 ( 9E 165)
+u0061_0328 13229,11976,5413,762,801,211 1 75193 -- U+0105 ( 9E 185)
+'C 17648,23086,400,2739,-412,211 2 75206 -- U+0106 ( 9E 198)
+'c 11743,17919,362,2106,568,211 2 75238 -- U+0107 ( 9E 230)
+u0041_030C 17648,23203,400,2739,-412,211 2 75208 -- U+010C ( 9E 200)
+u0061_030C 11743,17919,362,3036,568,211 2 75240 -- U+010D ( 9E 232)
+u0044_030C 19107,23203,0,775,2274,211 2 75215 -- U+010E ( 9E 207)
+u0064_030C 19805,17919,362,1395,788,211 2 75247 -- U+010F ( 9E 239)
+u0111 13229,17919,362,3656,788,211 2 75248 -- U+0111 ( 9E 240)
+u0045_0328 17648,17518,5271,1654,2248,211 3 75210 -- U+0118 ( 9E 202)
+u0065_0328 11743,11976,5271,1266,685,211 1 75242 -- U+0119 ( 9E 234)
+u0045_030C 17648,23203,0,1654,2248,211 2 75212 -- U+011A ( 9E 204)
+u0065_030C 11743,17919,362,2920,685,211 2 75244 -- U+011B ( 9E 236)
+u0047_0306 19107,23422,400,1977,-516,211 2 46288 -- U+011E ( 5T 208)
+u0067_0306 13229,17919,5710,1757,2687,211 3 46320 -- U+011F ( 5T 240)
+u0049_0307 10297,23035,0,3372,2248,211 2 46301 -- U+0130 ( 5T 221)
+.i 7351,11976,362,762,736,211 0 46333 -- U+0131 ( 5T 253)
+IJ 21769,17518,400,4070,2248,211 2 60135 -- U+0132 ( 7J 231)
+ij 14612,17919,5710,1421,349,211 3 60134 -- U+0133 ( 7J 230)
+u004C_0301 16162,23086,0,362,2041,211 2 75205 -- U+0139 ( 9E 197)
+u006C_0301 7351,23086,362,4883,891,211 2 75237 -- U+013A ( 9E 229)
+u004C_030C 16162,17919,0,2765,2041,211 2 75196 -- U+013D ( 9E 188)
+u006C_030C 13785,17919,362,1395,891,211 2 75198 -- U+013E ( 9E 190)
+u013F 16162,17518,0,362,2041,211 2 95646 -- U+013F (11U 158)
+u0140 9922,17919,362,1176,749,211 2 95647 -- U+0140 (11U 159)
+/L 16162,17518,0,362,2041,211 2 75171 -- U+0141 ( 9E 163)
+/l 7351,17919,362,2377,1318,211 2 75187 -- U+0142 ( 9E 179)
+u004E_0301 19107,23086,194,3669,2170,211 2 75217 -- U+0143 ( 9E 209)
+u006E_0301 14715,17919,155,0,1034 2 75249 -- U+0144 ( 9E 241)
+u004E_030C 19107,23203,194,3669,2170,211 2 75218 -- U+0147 ( 9E 210)
+u006E_030C 14715,17919,155,39,1034,39 2 75250 -- U+0148 ( 9E 242)
+u0149 19017,17919,155,0,155 2 95660 -- U+0149 (11U 172)
+u004F_030B 19107,23422,413,2054,-89,211 2 75221 -- U+0150 ( 9E 213)
+u006F_030B 13229,17919,362,4082,672,211 2 75253 -- U+0151 ( 9E 245)
+OE 24973,17660,142,1705,-322,211 2 161164 -- U+0152 (19U 140)
+oe 19107,11976,362,1189,723,211 0 161180 -- U+0153 (19U 156)
+u0052_0301 17648,23086,0,581,2157,211 2 75200 -- U+0154 ( 9E 192)
+u0072_0301 10297,17919,0,2610,866,211 2 75232 -- U+0155 ( 9E 224)
+u0052_030C 17648,23203,0,581,2157,211 2 75224 -- U+0158 ( 9E 216)
+u0072_030C 10297,17919,0,2145,866,211 2 75256 -- U+0159 ( 9E 248)
+u0053_0301 14715,23086,400,2041,1899,211 2 75148 -- U+015A ( 9E 140)
+u0073_0301 10297,17919,362,2183,1382,211 2 75164 -- U+015B ( 9E 156)
+u0053_0327 14715,17919,4858,2041,1899,211 2 75178 -- U+015E ( 9E 170)
+u0073_0327 10297,11976,4858,814,1382,211 0 75194 -- U+015F ( 9E 186)
+vS 14715,23203,400,2041,1899,211 2 161162 -- U+0160 (19U 138)
+vs 10297,17919,362,1705,1369,211 2 161178 -- U+0161 (19U 154)
+u0054_0327 16162,17518,6783,3488,-787,211 3 75230 -- U+0162 ( 9E 222)
+u0074_0327 7351,15128,6783,2248,1434,211 1 75262 -- U+0163 ( 9E 254)
+u0054_030C 16162,23203,0,3488,-787,211 2 75149 -- U+0164 ( 9E 141)
+u0074_030C 14056,17919,362,1667,788,211 2 75165 -- U+0165 ( 9E 157)
+u0055_030A 19107,23229,400,3604,-1162,211 2 75225 -- U+016E ( 9E 217)
+u0075_030A 14715,18423,362,245,465,211 2 75257 -- U+016F ( 9E 249)
+u0055_030B 19107,23422,400,3604,-1162,211 2 75227 -- U+0170 ( 9E 219)
+u0075_030B 14715,17919,362,2455,465,211 2 75259 -- U+0171 ( 9E 251)
+:Y 16162,22518,0,4121,-1136,211 2 161183 -- U+0178 (19U 159)
+u005A_0301 16162,23086,0,3114,2041,211 2 75151 -- U+0179 ( 9E 143)
+u007A_0301 10297,17919,2248,2300,1641,211 2 75167 -- U+017A ( 9E 159)
+u005A_0307 16162,22311,0,3114,2041,211 2 75183 -- U+017B ( 9E 175)
+u007A_0307 10297,17531,2248,1473,1641,211 2 75199 -- U+017C ( 9E 191)
+vZ 16162,23203,0,3114,2041,211 2 75150 -- U+017D ( 9E 142)
+vz 10297,17919,2248,2106,1628,211 2 75166 -- U+017E ( 9E 158)
+Fn 13229,17932,5710,1331,1331,211 3 161155 -- U+0192 (19U 131)
+a^ 8811,17919,0,2661,-632,211 2 161160 -- U+02C6 (19U 136)
+^ "
+ah 8811,17919,0,3579,-1562,211 2 75169 -- U+02C7 ( 9E 161)
+a- 8811,16201,0,4250,-852,211 2 60154 -- U+02C9 ( 7J 250)
+ab 8811,17919,0,3178,-2182,211 2 75170 -- U+02D8 ( 9E 162)
+a. 8811,17531,0,1421,-3784,211 2 75263 -- U+02D9 ( 9E 255)
+ao 8811,18423,0,2222,-3022,211 2 60152 -- U+02DA ( 7J 248)
+ho 8811,245,5271,0,3604 1 75186 -- U+02DB ( 9E 178)
+~ 8811,17518,0,3036,-1033,211 2 161176 -- U+02DC (19U 152)
+a~ "
+a" 8811,17919,0,4431,-2389,211 2 75197 -- U+02DD ( 9E 189)
+en 13229,6899,0,1550,1512,211 0 161174 -- U+2013 (19U 150)
+em 26458,6899,0,1563,1576,211 0 161175 -- U+2014 (19U 151)
+u2017 13229,0,5710,0,3643 1 60095 -- U+2017 ( 7J 191)
+oq 8811,17919,0,1667,-2441,211 2 161169 -- U+2018 (19U 145)
+` "
+cq 8811,17919,0,1705,-2479,211 2 161170 -- U+2019 (19U 146)
+' "
+bq 8811,3940,4250,0,956 0 161154 -- U+201A (19U 130)
+lq 13229,17919,0,2338,-1808,211 2 161171 -- U+201C (19U 147)
+rq 13229,17919,0,2351,-1808,211 2 161172 -- U+201D (19U 148)
+Bq 13229,3979,4276,0,2093 0 161156 -- U+201E (19U 132)
+dg 13229,17932,5659,1576,-968,211 3 161158 -- U+2020 (19U 134)
+dd 13229,17919,5710,1524,1473,211 3 161159 -- U+2021 (19U 135)
+bu 9263,12415,0,723,26,211 0 161173 -- U+2022 (19U 149)
+u2026 26458,3979,349,0,-942 0 161157 -- U+2026 (19U 133)
+%0 26458,17919,723,840,646,211 2 161161 -- U+2030 (19U 137)
+fm 7441,17919,0,2196,-2802,211 2 60101 -- U+2032 ( 7J 197)
+sd 14612,17919,0,1499,-3035,211 2 60102 -- U+2033 ( 7J 198)
+fo 8811,11782,142,594,-232,211 0 161163 -- U+2039 (19U 139)
+fc 8811,11782,142,0,581 0 161179 -- U+203A (19U 155)
+u203C 17441,17919,362,439,-193,211 2 87315 -- U+203C (10U 19)
+u207F 9198,14418,0,556,1201,211 0 87548 -- U+207F (10U 252)
+u20A7 25632,17518,297,995,853,211 2 60121 -- U+20A7 ( 7J 217)
+Eu 13229,17880,362,3940,891,211 2 161152 -- U+20AC (19U 128)
+u2105 22053,17919,711,698,-658,211 2 60072 -- U+2105 ( 7J 168)
+u2113 11304,17919,362,1628,853,211 2 60122 -- U+2113 ( 7J 218)
+tm 26458,17518,0,1460,1357,211 2 161177 -- U+2122 (19U 153)
+\- 16033,9612,0,336,388,211 0 60096 -- U+2212 ( 7J 192)
+f/ 4418,17880,762,6175,6188,211 2 60109 -- U+2215 ( 7J 205)
+sq 15981,12196,0,0,-567 0 60091 -- U+25A1 ( 7J 187)
+u25CA 13074,18371,0,736,711,211 2 101079 -- U+25CA (12J 215)
+fi 14715,17919,5710,594,6059,211 3 60077 -- U+FB01 ( 7J 173)
+fl 14715,17919,5710,2157,6072,211 3 60078 -- U+FB02 ( 7J 174)
diff --git a/font/devlj4/TNRI b/font/devlj4/TNRI
new file mode 100644
index 0000000..8abc3da
--- /dev/null
+++ b/font/devlj4/TNRI
@@ -0,0 +1,450 @@
+# M Times New It
+name TNRI
+spacewidth 6615
+slant 16.340000
+pcltypeface 16901
+pclproportional 1
+pclweight 0
+pclstyle 1
+ligatures fi fl 0
+kernpairs
+1 1 -1963
+A T -981
+A V -1317
+A W -981
+A Y -1459
+A v -1459
+A w -1459
+A y -1459
+A cq -981
+A ' -981
+F , -3410
+F . -3410
+F A -3410
+L T -529
+L V -981
+L W -981
+L Y -529
+L y -787
+L cq -981
+L ' -981
+P , -3410
+P . -3410
+P A -3410
+R T 0
+R V -477
+R W -477
+R Y -477
+R y -477
+T , -1963
+T hy -1963
+T - -1963
+T . -1963
+T : -1459
+T ; -1717
+T A -1963
+T O -477
+T a -2428
+T c -2428
+T e -2428
+T i -1459
+T o -2428
+T r -1459
+T s -2428
+T u -1459
+T w -1963
+T y -1963
+V , -3410
+V hy -1459
+V - -1459
+V . -3410
+V : -1717
+V ; -1963
+V A -1963
+V O -787
+V a -2932
+V e -2932
+V i -1963
+V o -2932
+V r -1963
+V u -1963
+V y -2428
+W , -2428
+W hy -981
+W - -981
+W . -2428
+W : -1717
+W ; -1717
+W A -1846
+W a -2428
+W e -2428
+W i -1459
+W o -2428
+W r -1459
+W u -1459
+W y -2428
+Y , -2428
+Y hy -1963
+Y - -1963
+Y . -2428
+Y : -1717
+Y ; -1717
+Y A -1846
+Y a -2428
+Y e -2428
+Y i -1963
+Y o -2428
+Y p -2428
+Y q -2932
+Y u -2428
+Y v -2428
+f cq 2429
+f ' 2429
+r , -2932
+r hy -529
+r - -529
+r . -2932
+r c -981
+r d -981
+r e -981
+r g -981
+r h -477
+r o -981
+r q -981
+r r 0
+r t 0
+r u 0
+r v 0
+r w 0
+r x 0
+r y 0
+r cq 982
+r ' 982
+v , -1963
+v . -1963
+w , -1963
+w . -1963
+y , -1459
+y . -1459
+oq oq -2932
+oq ` -2932
+` oq -2932
+` ` -2932
+cq s -3410
+' s -3410
+cq t -2932
+' t -2932
+cq cq -2932
+cq ' -2932
+' cq -2932
+' ' -2932
+charset
+! 8811,17919,426,904,-671,207 2 161057 -- U+0021 (19U 33)
+dq 11110,17919,0,2170,-2479,207 2 161058 -- U+0022 (19U 34)
+" "
+sh 13229,17919,362,2261,-580,207 2 161059 -- U+0023 (19U 35)
+# "
+Do 13229,18526,1744,1021,207,207 2 161060 -- U+0024 (19U 36)
+$ "
+% 22040,17919,711,891,-542,207 2 161061 -- U+0025 (19U 37)
+& 20580,17919,400,129,52,129 2 161062 -- U+0026 (19U 38)
+aq 5659,17919,0,2571,-2156,207 2 161063 -- U+0027 (19U 39)
+( 8811,18371,5659,4212,-490,207 3 161064 -- U+0028 (19U 40)
+) 8811,18371,5659,0,4199 3 161065 -- U+0029 (19U 41)
+* 13229,18371,0,1331,-2428,207 2 161066 -- U+002A (19U 42)
++ 17854,15748,0,0,-1136 0 161067 -- U+002B (19U 43)
+, 6615,2325,3320,0,1589 0 161068 -- U+002C (19U 44)
+hy 8811,6602,0,426,620,207 0 161069 -- U+002D (19U 45)
+- "
+. 6615,2313,297,0,426 0 161070 -- U+002E (19U 46)
+sl 7351,18371,400,4057,2209,207 2 161071 -- U+002F (19U 47)
+/ "
+0 13229,17880,310,1150,-257,207 2 161072 -- U+0030 (19U 48)
+1 13229,17880,0,0,-296 2 161073 -- U+0031 (19U 49)
+2 13229,17880,0,491,904,207 2 161074 -- U+0032 (19U 50)
+3 13229,17880,310,90,439,90 2 161075 -- U+0033 (19U 51)
+4 13229,17518,310,969,491,207 2 161076 -- U+0034 (19U 52)
+5 13229,17518,310,762,375,207 2 161077 -- U+0035 (19U 53)
+6 13229,17880,310,1990,-348,207 2 161078 -- U+0036 (19U 54)
+7 13229,17518,310,1938,-1678,207 2 161079 -- U+0037 (19U 55)
+8 13229,17880,310,1021,310,207 2 161080 -- U+0038 (19U 56)
+9 13229,17880,310,1072,556,207 2 161081 -- U+0039 (19U 57)
+: 8811,11705,245,0,-257 0 161082 -- U+003A (19U 58)
+; 8811,11679,3320,0,853 0 161083 -- U+003B (19U 59)
+< 17854,15141,0,0,-619 0 161084 -- U+003C (19U 60)
+= 17854,11408,0,0,-1265 0 161085 -- U+003D (19U 61)
+> 17854,15141,0,0,-619 0 161086 -- U+003E (19U 62)
+? 13229,17919,400,220,-1239,207 2 161087 -- U+003F (19U 63)
+at 24340,18371,5710,698,65,207 3 161088 -- U+0040 (19U 64)
+@ "
+A 16162,17919,0,0,2610 2 161089 -- U+0041 (19U 65)
+B 16162,17518,0,775,1925,207 2 161090 -- U+0042 (19U 66)
+C 17648,17919,400,2287,-464,207 2 161091 -- U+0043 (19U 67)
+D 19107,17518,0,853,2106,207 2 161092 -- U+0044 (19U 68)
+E 16162,17518,0,1886,1912,207 2 161093 -- U+0045 (19U 69)
+F 16162,17518,0,2842,1964,207 2 161094 -- U+0046 (19U 70)
+G 19107,17919,413,1382,-516,207 2 161095 -- U+0047 (19U 71)
+H 19107,17518,0,3669,2015,207 2 161096 -- U+0048 (19U 72)
+I 8811,17518,0,3359,2145,207 2 161097 -- U+0049 (19U 73)
+J 11743,17518,400,4044,2222,207 2 161098 -- U+004A (19U 74)
+K 17648,17518,0,2946,2028,207 2 161099 -- U+004B (19U 75)
+L 14715,17518,0,439,2170,207 2 161100 -- U+004C (19U 76)
+M 22040,17518,0,3721,2183,207 2 161101 -- U+004D (19U 77)
+N 17648,17518,400,3824,2054,207 2 161102 -- U+004E (19U 78)
+O 19107,17919,400,1201,-257,207 2 161103 -- U+004F (19U 79)
+P 16162,17518,0,1589,1951,207 2 161104 -- U+0050 (19U 80)
+Q 19107,17919,5581,1189,65,207 3 161105 -- U+0051 (19U 81)
+R 16162,17518,0,478,1925,207 2 161106 -- U+0052 (19U 82)
+S 13229,17919,400,2429,1137,207 2 161107 -- U+0053 (19U 83)
+T 14715,17518,0,3785,-529,207 2 161108 -- U+0054 (19U 84)
+U 19107,17518,400,3747,-1498,207 2 161109 -- U+0055 (19U 85)
+V 16162,17518,400,4289,-1989,207 2 161110 -- U+0056 (19U 86)
+W 22040,17518,400,4250,-1898,207 2 161111 -- U+0057 (19U 87)
+X 16162,17518,0,4754,3088,207 2 161112 -- U+0058 (19U 88)
+Y 14715,17518,0,4250,-1058,207 2 161113 -- U+0059 (19U 89)
+Z 14715,17518,0,2765,1369,207 2 161114 -- U+005A (19U 90)
+lB 10297,17919,5271,3488,1150,207 3 161115 -- U+005B (19U 91)
+[ "
+rs 7351,18371,400,90,-1498,90 2 161116 -- U+005C (19U 92)
+\ "
+rB 10297,17919,5271,672,3966,207 3 161117 -- U+005D (19U 93)
+] "
+ha 11162,17919,0,2325,594,207 2 161118 -- U+005E (19U 94)
+_ 13229,0,5710,1550,1537,207 1 161119 -- U+005F (19U 95)
+ga 8811,18113,0,1421,-3332,207 2 161120 -- U+0060 (19U 96)
+a 13229,11692,310,504,698,207 0 161121 -- U+0061 (19U 97)
+b 13229,18371,310,504,620,207 2 161122 -- U+0062 (19U 98)
+c 11743,11692,310,840,594,207 0 161123 -- U+0063 (19U 99)
+d 13229,18371,310,2403,814,207 2 161124 -- U+0064 (19U 100)
+e 11743,11692,310,956,491,207 0 161125 -- U+0065 (19U 101)
+f 7351,18371,5710,6434,5930,207 3 161126 -- U+0066 (19U 102)
+g 13229,11692,5710,1873,2028,207 1 161127 -- U+0067 (19U 103)
+h 13229,18371,310,233,788,207 2 161128 -- U+0068 (19U 104)
+i 7351,16821,310,1176,181,207 2 161129 -- U+0069 (19U 105)
+j 7351,16808,5710,1331,5865,207 3 161130 -- U+006A (19U 106)
+k 11743,18371,310,2480,1059,207 2 161131 -- U+006B (19U 107)
+l 7351,18371,310,1835,297,207 2 161132 -- U+006C (19U 108)
+m 19107,11692,310,168,866,168 0 161133 -- U+006D (19U 109)
+n 13229,11692,310,245,814,207 0 161134 -- U+006E (19U 110)
+o 13229,11692,310,323,543,207 0 161135 -- U+006F (19U 111)
+p 13229,11692,5659,594,4237,207 1 161136 -- U+0070 (19U 112)
+q 13229,11692,5659,633,736,207 1 161137 -- U+0071 (19U 113)
+r 10297,11692,0,1731,775,207 0 161138 -- U+0072 (19U 114)
+s 10297,11692,310,620,1563,207 0 161139 -- U+0073 (19U 115)
+t 7351,14896,310,1860,233,207 0 161140 -- U+0074 (19U 116)
+u 13229,11692,310,543,543,207 0 161141 -- U+0075 (19U 117)
+v 11743,11692,310,1279,749,207 0 161142 -- U+0076 (19U 118)
+w 17648,11692,310,1176,866,207 0 161143 -- U+0077 (19U 119)
+x 11743,11692,310,1150,2248,207 0 161144 -- U+0078 (19U 120)
+y 11743,11692,5710,1176,3436,207 1 161145 -- U+0079 (19U 121)
+z 10297,11382,0,1447,2054,207 0 161146 -- U+007A (19U 122)
+{ 10581,18371,5710,3294,-503,207 3 161147 -- U+007B (19U 123)
+lC "
+| 7273,18371,5710,0,-1743 3 161148 -- U+007C (19U 124)
+ba "
+} 10581,18371,5710,0,3294 3 161149 -- U+007D (19U 125)
+rC "
+ti 14314,8759,0,1046,1059,207 0 161150 -- U+007E (19U 126)
+r! 10297,12648,5710,0,-542 1 161185 -- U+00A1 (19U 161)
+ct 13229,16834,4871,78,-154,78 2 161186 -- U+00A2 (19U 162)
+Po 13229,17880,400,1964,685,207 2 161187 -- U+00A3 (19U 163)
+Cs 13229,14999,0,1757,155,207 0 161188 -- U+00A4 (19U 164)
+Ye 13229,17518,0,4560,1499,207 2 161189 -- U+00A5 (19U 165)
+bb 7273,18371,5710,0,-1743 3 161190 -- U+00A6 (19U 166)
+sc 13229,18074,5374,1576,1369,207 3 161191 -- U+00A7 (19U 167)
+ad 8811,17312,0,3333,-2144,207 2 161192 -- U+00A8 (19U 168)
+co 20102,17919,400,1344,-477,207 2 161193 -- U+00A9 (19U 169)
+Of 7299,17919,0,3979,-981,207 2 161194 -- U+00AA (19U 170)
+Fo 13229,11886,400,853,233,207 0 161195 -- U+00AB (19U 171)
+tno 17854,11343,0,0,-619 0 161196 -- U+00AC (19U 172)
+u00AD 8811,6602,0,426,620,207 0 161197 -- U+00AD (19U 173)
+rg 20102,17919,400,1344,-477,207 2 161198 -- U+00AE (19U 174)
+u00AF 13229,19973,0,4315,-1226,207 2 161199 -- U+00AF (19U 175)
+de 10581,17906,0,1421,-1420,207 2 161200 -- U+00B0 (19U 176)
+t+- 14521,15748,0,1421,633,207 0 161201 -- U+00B1 (19U 177)
+S2 7932,17880,0,2209,-115,207 2 161202 -- U+00B2 (19U 178)
+S3 7932,17880,0,1964,-387,207 2 161203 -- U+00B3 (19U 179)
+aa 8811,18113,0,2028,-3965,207 2 161204 -- U+00B4 (19U 180)
+mc 15245,11382,5697,0,1912 1 161205 -- U+00B5 (19U 181)
+ps 13836,17518,5710,1085,-77,207 3 161206 -- U+00B6 (19U 182)
+pc 6615,10193,0,0,-555 0 60157 -- U+00B7 ( 7J 253)
+ac 8811,388,4780,0,1796 0 161208 -- U+00B8 (19U 184)
+S1 7932,17880,0,1434,-787,207 2 161209 -- U+00B9 (19U 185)
+Om 8204,17919,0,3514,-1627,207 2 161210 -- U+00BA (19U 186)
+Fc 13229,11886,400,245,840,207 0 161211 -- U+00BB (19U 187)
+14 19844,17880,711,0,-761 2 161212 -- U+00BC (19U 188)
+12 19844,17880,711,0,-761 2 161213 -- U+00BD (19U 189)
+34 19844,17880,711,0,-361 2 161214 -- U+00BE (19U 190)
+r? 13229,12622,5710,0,375 1 161215 -- U+00BF (19U 191)
+`A 16162,23280,0,594,2610,207 2 161216 -- U+00C0 (19U 192)
+'A 16162,23280,0,1512,2610,207 2 161217 -- U+00C1 (19U 193)
+^A 16162,22841,0,1576,2610,207 2 161218 -- U+00C2 (19U 194)
+~A 16162,22415,0,2829,2610,207 2 161219 -- U+00C3 (19U 195)
+:A 16162,22118,0,2855,2610,207 2 161220 -- U+00C4 (19U 196)
+oA 16162,22234,0,1214,2584,207 2 161221 -- U+00C5 (19U 197)
+AE 23526,17518,0,1847,2713,207 2 161222 -- U+00C6 (19U 198)
+,C 17648,17919,4780,2287,-464,207 2 161223 -- U+00C7 (19U 199)
+`E 16162,23280,0,1886,1912,207 2 161224 -- U+00C8 (19U 200)
+'E 16162,23280,0,1886,1912,207 2 161225 -- U+00C9 (19U 201)
+^E 16162,22841,0,1886,1912,207 2 161226 -- U+00CA (19U 202)
+:E 16162,22118,0,1886,1912,207 2 161227 -- U+00CB (19U 203)
+`I 8811,23280,0,3359,2145,207 2 161228 -- U+00CC (19U 204)
+'I 8811,23280,0,3359,2145,207 2 161229 -- U+00CD (19U 205)
+^I 8811,22841,0,3643,2145,207 2 161230 -- U+00CE (19U 206)
+:I 8811,22118,0,4315,2145,207 2 161231 -- U+00CF (19U 207)
+-D 19107,17518,0,1034,1938,207 2 161232 -- U+00D0 (19U 208)
+~N 17648,22415,400,3824,2054,207 2 161233 -- U+00D1 (19U 209)
+`O 19107,23280,400,1201,-257,207 2 161234 -- U+00D2 (19U 210)
+'O 19107,23280,400,1201,-257,207 2 161235 -- U+00D3 (19U 211)
+^O 19107,22841,400,1201,-257,207 2 161236 -- U+00D4 (19U 212)
+~O 19107,22415,400,1201,-257,207 2 161237 -- U+00D5 (19U 213)
+:O 19107,22118,400,1201,-257,207 2 161238 -- U+00D6 (19U 214)
+tmu 17854,14095,0,0,-3565 0 161239 -- U+00D7 (19U 215)
+/O 19107,18229,930,1718,388,207 2 161240 -- U+00D8 (19U 216)
+`U 19107,23280,400,3747,-1498,207 2 161241 -- U+00D9 (19U 217)
+'U 19107,23280,400,3747,-1498,207 2 161242 -- U+00DA (19U 218)
+^U 19107,22841,400,3747,-1498,207 2 161243 -- U+00DB (19U 219)
+:U 19107,22118,400,3747,-1498,207 2 161244 -- U+00DC (19U 220)
+'Y 14715,23280,0,4237,-1045,207 2 161245 -- U+00DD (19U 221)
+TP 16162,17518,0,1176,1951,207 2 161246 -- U+00DE (19U 222)
+ss 13229,18371,5710,1266,5568,207 3 161247 -- U+00DF (19U 223)
+`a 13229,18113,310,504,698,207 2 161248 -- U+00E0 (19U 224)
+'a 13229,18113,310,504,698,207 2 161249 -- U+00E1 (19U 225)
+^a 13229,17919,310,504,698,207 2 161250 -- U+00E2 (19U 226)
+~a 13229,17648,310,1124,698,207 2 161251 -- U+00E3 (19U 227)
+:a 13229,17312,310,1163,698,207 2 161252 -- U+00E4 (19U 228)
+oa 13229,18358,310,504,698,207 2 161253 -- U+00E5 (19U 229)
+ae 17648,11692,310,930,736,207 0 161254 -- U+00E6 (19U 230)
+,c 11743,11692,4780,891,543,207 0 161255 -- U+00E7 (19U 231)
+`e 11743,18113,310,956,491,207 2 161256 -- U+00E8 (19U 232)
+'e 11743,18113,310,956,491,207 2 161257 -- U+00E9 (19U 233)
+^e 11743,17919,310,1292,491,207 2 161258 -- U+00EA (19U 234)
+:e 11743,17312,310,1951,491,207 2 161259 -- U+00EB (19U 235)
+`i 7351,18113,310,1266,181,207 2 161260 -- U+00EC (19U 236)
+'i 7351,18113,310,2803,181,207 2 161261 -- U+00ED (19U 237)
+^i 7351,17919,310,3010,181,207 2 161262 -- U+00EE (19U 238)
+:i 7351,17312,310,3682,181,207 2 161263 -- U+00EF (19U 239)
+Sd 13229,18319,310,827,607,207 2 161264 -- U+00F0 (19U 240)
+~n 13229,17648,310,1124,814,207 2 161265 -- U+00F1 (19U 241)
+`o 13229,18113,310,323,543,207 2 161266 -- U+00F2 (19U 242)
+'o 13229,18113,310,323,543,207 2 161267 -- U+00F3 (19U 243)
+^o 13229,17919,310,491,543,207 2 161268 -- U+00F4 (19U 244)
+~o 13229,17648,310,1124,543,207 2 161269 -- U+00F5 (19U 245)
+:o 13229,17312,310,1163,543,207 2 161270 -- U+00F6 (19U 246)
+tdi 14521,13888,0,1408,633,207 0 161271 -- U+00F7 (19U 247)
+/o 13229,12467,943,1021,1253,207 0 161272 -- U+00F8 (19U 248)
+`u 13229,18113,310,543,543,207 2 161273 -- U+00F9 (19U 249)
+'u 13229,18113,310,543,543,207 2 161274 -- U+00FA (19U 250)
+^u 13229,17919,310,543,543,207 2 161275 -- U+00FB (19U 251)
+:u 13229,17312,310,853,543,207 2 161276 -- U+00FC (19U 252)
+'y 11743,18113,5710,1227,3385,207 3 161277 -- U+00FD (19U 253)
+Tp 13229,18371,5710,594,4237,207 3 161278 -- U+00FE (19U 254)
+:y 11743,17312,5710,1486,3385,207 3 161279 -- U+00FF (19U 255)
+u0041_0306 16162,22854,0,3398,2610,207 2 75203 -- U+0102 ( 9E 195)
+u0061_0306 13229,18164,310,801,698,207 2 75235 -- U+0103 ( 9E 227)
+u0041_0328 16162,17919,4909,0,2610 2 75173 -- U+0104 ( 9E 165)
+u0061_0328 13229,11692,4883,1034,698,207 0 75193 -- U+0105 ( 9E 185)
+'C 17648,23280,400,2287,-464,207 2 75206 -- U+0106 ( 9E 198)
+'c 11743,18113,310,917,543,207 2 75238 -- U+0107 ( 9E 230)
+u0041_030C 17648,22841,400,2287,-464,207 2 75208 -- U+010C ( 9E 200)
+u0061_030C 11743,17919,310,3152,543,207 2 75240 -- U+010D ( 9E 232)
+u0044_030C 19107,22841,0,853,2106,207 2 75215 -- U+010E ( 9E 207)
+u0064_030C 16097,18371,310,3643,814,207 2 75247 -- U+010F ( 9E 239)
+u0111 13229,18371,310,3630,814,207 2 75248 -- U+0111 ( 9E 240)
+u0045_0328 16162,17518,4883,1886,1912,207 2 75210 -- U+0118 ( 9E 202)
+u0065_0328 11743,11692,4883,956,491,207 0 75242 -- U+0119 ( 9E 234)
+u0045_030C 16162,22841,0,1886,1912,207 2 75212 -- U+011A ( 9E 204)
+u0065_030C 11743,17919,310,3010,491,207 2 75244 -- U+011B ( 9E 236)
+u0047_0306 19107,22841,413,1382,-516,207 2 46288 -- U+011E ( 5T 208)
+u0067_0306 13229,18164,5710,1873,2028,207 3 46320 -- U+011F ( 5T 240)
+u0049_0307 8811,22234,0,3359,2145,207 2 46301 -- U+0130 ( 5T 221)
+.i 7351,11692,310,52,181,52 0 46333 -- U+0131 ( 5T 253)
+IJ 19844,17518,400,3411,2106,207 2 60135 -- U+0132 ( 7J 231)
+ij 13242,16821,5710,1331,349,207 3 60134 -- U+0133 ( 7J 230)
+u004C_0301 14715,23280,0,439,2170,207 2 75205 -- U+0139 ( 9E 197)
+u006C_0301 7351,23280,310,3695,297,207 2 75237 -- U+013A ( 9E 229)
+u004C_030C 14715,17919,0,2506,2170,207 2 75196 -- U+013D ( 9E 188)
+u006C_030C 9625,18371,310,3656,310,207 2 75198 -- U+013E ( 9E 190)
+u013F 14715,17518,0,439,2170,207 2 95646 -- U+013F (11U 158)
+u0140 8540,18371,310,2726,375,207 2 95647 -- U+0140 (11U 159)
+/L 14715,17518,0,452,2067,207 2 75171 -- U+0141 ( 9E 163)
+/l 7351,18371,310,1912,659,207 2 75187 -- U+0142 ( 9E 179)
+u004E_0301 17648,23280,400,3824,2054,207 2 75217 -- U+0143 ( 9E 209)
+u006E_0301 13229,18113,310,245,814,207 2 75249 -- U+0144 ( 9E 241)
+u004E_030C 17648,22841,400,3824,2054,207 2 75218 -- U+0147 ( 9E 210)
+u006E_030C 13229,17919,310,245,814,207 2 75250 -- U+0148 ( 9E 242)
+u0149 15270,17919,310,0,-167 2 95660 -- U+0149 (11U 172)
+u004F_030B 19107,23280,400,1253,-257,207 2 75221 -- U+0150 ( 9E 213)
+u006F_030B 13229,18113,310,2429,543,207 2 75253 -- U+0151 ( 9E 245)
+OE 24973,17673,181,1990,736,207 2 161164 -- U+0152 (19U 140)
+oe 17648,11692,323,827,620,207 0 161180 -- U+0153 (19U 156)
+u0052_0301 16162,23280,0,478,1925,207 2 75200 -- U+0154 ( 9E 192)
+u0072_0301 10297,18113,0,1679,827,207 2 75232 -- U+0155 ( 9E 224)
+u0052_030C 16162,22841,0,478,1925,207 2 75224 -- U+0158 ( 9E 216)
+u0072_030C 10297,17919,0,2364,827,207 2 75256 -- U+0159 ( 9E 248)
+u0053_0301 13229,23280,400,2429,1137,207 2 75148 -- U+015A ( 9E 140)
+u0073_0301 10297,18113,310,995,1563,207 2 75164 -- U+015B ( 9E 156)
+u0053_0327 13229,17919,4780,2429,1137,207 2 75178 -- U+015E ( 9E 170)
+u0073_0327 10297,11692,4780,620,1563,207 0 75194 -- U+015F ( 9E 186)
+vS 13229,22841,400,2532,1137,207 2 161162 -- U+0160 (19U 138)
+vs 10297,17919,310,1951,1524,207 2 161178 -- U+0161 (19U 154)
+u0054_0327 14715,17518,5736,3785,-529,207 3 75230 -- U+0162 ( 9E 222)
+u0074_0327 7351,14896,5736,1899,1770,207 1 75262 -- U+0163 ( 9E 254)
+u0054_030C 14715,22841,0,3785,-529,207 2 75149 -- U+0164 ( 9E 141)
+u0074_030C 9625,18371,310,3656,207,207 2 75165 -- U+0165 ( 9E 157)
+u0055_030A 19107,23371,400,3747,-1498,207 2 75225 -- U+016E ( 9E 217)
+u0075_030A 13229,18358,310,543,543,207 2 75257 -- U+016F ( 9E 249)
+u0055_030B 19107,23280,400,3747,-1498,207 2 75227 -- U+0170 ( 9E 219)
+u0075_030B 13229,18113,310,1912,543,207 2 75259 -- U+0171 ( 9E 251)
+:Y 14715,22118,0,4237,-1045,207 2 161183 -- U+0178 (19U 159)
+u005A_0301 14715,23280,0,2765,1369,207 2 75151 -- U+0179 ( 9E 143)
+u007A_0301 10297,18113,0,1395,2106,207 2 75167 -- U+017A ( 9E 159)
+u005A_0307 14715,22105,0,2765,1369,207 2 75183 -- U+017B ( 9E 175)
+u007A_0307 10297,17312,0,1395,2106,207 2 75199 -- U+017C ( 9E 191)
+vZ 14715,22841,0,2765,1369,207 2 75150 -- U+017D ( 9E 142)
+vz 10297,17919,0,1628,2390,207 2 75166 -- U+017E ( 9E 158)
+Fn 13229,17919,5568,995,1292,207 3 161155 -- U+0192 (19U 131)
+a^ 8811,17919,0,2713,-1963,207 2 161160 -- U+02C6 (19U 136)
+^ "
+ah 8811,17919,0,3798,-3048,207 2 75169 -- U+02C7 ( 9E 161)
+a- 8811,17415,0,3902,-1859,207 2 60154 -- U+02C9 ( 7J 250)
+ab 8811,18164,0,3656,-2479,207 2 75170 -- U+02D8 ( 9E 162)
+a. 8811,17312,0,1072,-4482,207 2 75263 -- U+02D9 ( 9E 255)
+ao 8811,18358,0,2313,-3603,207 2 60152 -- U+02DA ( 7J 248)
+ho 8811,0,4883,0,310 0 75186 -- U+02DB ( 9E 178)
+~ 8811,17648,0,3333,-1239,207 2 161176 -- U+02DC (19U 152)
+a~ "
+a" 8811,18113,0,4431,-2596,207 2 75197 -- U+02DD ( 9E 189)
+en 13229,6795,0,1537,1550,207 0 161174 -- U+2013 (19U 150)
+em 23526,6808,0,1563,1563,207 0 161175 -- U+2014 (19U 151)
+u2017 13229,0,5710,1550,1537,207 1 60095 -- U+2017 ( 7J 191)
+oq 8811,17919,0,1899,-4288,207 2 161169 -- U+2018 (19U 145)
+` "
+cq 8811,17919,0,1473,-3862,207 2 161170 -- U+2019 (19U 146)
+' "
+bq 8811,2325,3320,0,478 0 161154 -- U+201A (19U 130)
+lq 14715,17919,0,1395,-3771,207 2 161171 -- U+201C (19U 147)
+rq 14715,17932,0,1124,-3500,207 2 161172 -- U+201D (19U 148)
+Bq 14715,2338,3385,0,930 0 161156 -- U+201E (19U 132)
+dg 13229,17919,5361,1886,-1536,207 3 161158 -- U+2020 (19U 134)
+dd 13229,18371,5710,1421,1692,207 3 161159 -- U+2021 (19U 135)
+bu 9263,11989,0,775,-916,207 0 161173 -- U+2022 (19U 149)
+u2026 23526,2506,362,0,-2118 0 161157 -- U+2026 (19U 133)
+%0 26458,17919,698,956,-322,207 2 161161 -- U+2030 (19U 137)
+fm 5788,17919,0,2442,-2156,207 2 60101 -- U+2032 ( 7J 197)
+sd 11020,17919,0,2261,-2479,207 2 60102 -- U+2033 ( 7J 198)
+fo 8811,11886,400,749,-180,207 0 161163 -- U+2039 (19U 139)
+fc 8811,11886,400,0,723 0 161179 -- U+203A (19U 155)
+u203C 15154,17919,426,904,-671,207 2 87315 -- U+203C (10U 19)
+u207F 8333,14431,0,723,1059,207 0 87548 -- U+207F (10U 252)
+u20A7 26187,17518,310,1034,711,207 2 60121 -- U+20A7 ( 7J 217)
+Eu 13229,17880,310,3604,1098,207 2 161152 -- U+20AC (19U 128)
+u2105 22053,17919,698,543,-77,207 2 60072 -- U+2105 ( 7J 168)
+u2113 11020,17919,310,1731,930,207 2 60122 -- U+2113 ( 7J 218)
+tm 25929,17518,0,2946,-1136,207 2 161177 -- U+2122 (19U 153)
+\- 17854,9328,0,0,-619 0 60096 -- U+2212 ( 7J 192)
+f/ 4418,17880,711,5723,5723,207 2 60109 -- U+2215 ( 7J 205)
+sq 15981,12196,0,0,-567 0 60091 -- U+25A1 ( 7J 187)
+u25CA 13074,18371,0,736,711,207 2 101079 -- U+25CA (12J 215)
+fi 13229,18371,5710,1318,6317,207 3 60077 -- U+FB01 ( 7J 173)
+fl 13229,18371,5710,2635,6317,207 3 60078 -- U+FB02 ( 7J 174)
diff --git a/font/devlj4/TNRR b/font/devlj4/TNRR
new file mode 100644
index 0000000..8c45bcb
--- /dev/null
+++ b/font/devlj4/TNRR
@@ -0,0 +1,436 @@
+# M Times
+name TNRR
+spacewidth 6615
+pcltypeface 16901
+pclproportional 1
+pclweight 0
+pclstyle 0
+ligatures fi fl 0
+kernpairs
+1 1 -981
+A T -2932
+A V -3410
+A W -2118
+A Y -2428
+A v -1963
+A w -2428
+A y -2428
+A cq -2932
+A ' -2932
+F , -2118
+F . -2118
+F A -1963
+L T -2428
+L V -2428
+L W -1963
+L Y -2647
+L y -1459
+L cq -2428
+L ' -2428
+P , -2932
+P . -2932
+P A -2428
+R T -1588
+R V -2118
+R W -1459
+R Y -1459
+R y -1058
+T , -1963
+T hy -2428
+T - -2428
+T . -1963
+T : -1317
+T ; -1459
+T A -2118
+T O -477
+T a -1846
+T c -1846
+T e -1846
+T i -929
+T o -1846
+T r -929
+T s -1846
+T u -929
+T w -1846
+T y -1846
+V , -3410
+V hy -2428
+V - -2428
+V . -3410
+V : -1963
+V ; -1963
+V A -3410
+V a -2932
+V e -2932
+V i -1588
+V o -3410
+V r -1588
+V u -1588
+V y -2932
+W , -2428
+W hy -1459
+W - -1459
+W . -2428
+W : -981
+W ; -981
+W A -2932
+W a -2118
+W e -2118
+W i -1058
+W o -2118
+W r -1058
+W u -1058
+W y -1588
+Y , -3410
+Y hy -2932
+Y - -2932
+Y . -3410
+Y : -2428
+Y ; -2428
+Y A -2932
+Y a -2647
+Y e -2647
+Y i -1459
+Y o -2647
+Y p -2428
+Y q -2932
+Y u -2932
+Y v -2647
+f f -477
+f cq 1460
+f ' 1460
+r , -1058
+r hy -529
+r - -529
+r . -1459
+r g -477
+r cq 982
+r ' 982
+v , -1717
+v . -1717
+w , -1717
+w . -1717
+y , -1717
+y . -1717
+oq oq -1963
+oq ` -1963
+` oq -1963
+` ` -1963
+cq s -1459
+' s -1459
+cq t -477
+' t -477
+cq cq -1963
+cq ' -1963
+' cq -1963
+' ' -1963
+charset
+! 8811,17919,362 2 161057 -- U+0021 (19U 33)
+dq 10800,17919 2 161058 -- U+0022 (19U 34)
+" "
+sh 13229,17919,362 2 161059 -- U+0023 (19U 35)
+# "
+Do 13229,18991,2015 2 161060 -- U+0024 (19U 36)
+$ "
+% 22040,17919,723 2 161061 -- U+0025 (19U 37)
+& 20580,17919,400 2 161062 -- U+0026 (19U 38)
+aq 4767,17919 2 161063 -- U+0027 (19U 39)
+( 8811,18371,5659 3 161064 -- U+0028 (19U 40)
+) 8811,18371,5659 3 161065 -- U+0029 (19U 41)
+* 13229,18371 2 161066 -- U+002A (19U 42)
++ 14922,15748 0 161067 -- U+002B (19U 43)
+, 6615,2584,4405 0 161068 -- U+002C (19U 44)
+hy 8811,6912 0 161069 -- U+002D (19U 45)
+- "
+. 6615,2506,362 0 161070 -- U+002E (19U 46)
+sl 7351,18371,362 2 161071 -- U+002F (19U 47)
+/ "
+0 13229,17880,310 2 161072 -- U+0030 (19U 48)
+1 13229,17880 2 161073 -- U+0031 (19U 49)
+2 13229,17880 2 161074 -- U+0032 (19U 50)
+3 13229,17880,310 2 161075 -- U+0033 (19U 51)
+4 13229,17880 2 161076 -- U+0034 (19U 52)
+5 13229,17518,310 2 161077 -- U+0035 (19U 53)
+6 13229,17880,310 2 161078 -- U+0036 (19U 54)
+7 13229,17518,362 2 161079 -- U+0037 (19U 55)
+8 13229,17880,310 2 161080 -- U+0038 (19U 56)
+9 13229,17880,362 2 161081 -- U+0039 (19U 57)
+: 7351,12196,362 0 161082 -- U+003A (19U 58)
+; 7351,12209,4405 0 161083 -- U+003B (19U 59)
+< 14922,15141 0 161084 -- U+003C (19U 60)
+= 14922,11408 0 161085 -- U+003D (19U 61)
+> 14922,15141 0 161086 -- U+003E (19U 62)
+? 11743,17919,349 2 161087 -- U+003F (19U 63)
+at 24365,18371,5710 3 161088 -- U+0040 (19U 64)
+@ "
+A 19107,17919 2 161089 -- U+0041 (19U 65)
+B 17648,17518 2 161090 -- U+0042 (19U 66)
+C 17648,17919,400 2 161091 -- U+0043 (19U 67)
+D 19107,17518 2 161092 -- U+0044 (19U 68)
+E 16162,17518 2 161093 -- U+0045 (19U 69)
+F 14715,17518 2 161094 -- U+0046 (19U 70)
+G 19107,17919,400 2 161095 -- U+0047 (19U 71)
+H 19107,17518 2 161096 -- U+0048 (19U 72)
+I 8811,17518 2 161097 -- U+0049 (19U 73)
+J 10297,17518,400 2 161098 -- U+004A (19U 74)
+K 19107,17518 2 161099 -- U+004B (19U 75)
+L 16162,17518 2 161100 -- U+004C (19U 76)
+M 23526,17518 2 161101 -- U+004D (19U 77)
+N 19107,17518,284 2 161102 -- U+004E (19U 78)
+O 19107,17919,400 2 161103 -- U+004F (19U 79)
+P 14715,17518 2 161104 -- U+0050 (19U 80)
+Q 19107,17919,5181 3 161105 -- U+0051 (19U 81)
+R 17648,17518 2 161106 -- U+0052 (19U 82)
+S 14715,17919,400 2 161107 -- U+0053 (19U 83)
+T 16162,17518 2 161108 -- U+0054 (19U 84)
+U 19107,17518,413 2 161109 -- U+0055 (19U 85)
+V 19107,17518,400 2 161110 -- U+0056 (19U 86)
+W 24973,17518,400 2 161111 -- U+0057 (19U 87)
+X 19107,17518 2 161112 -- U+0058 (19U 88)
+Y 19107,17518 2 161113 -- U+0059 (19U 89)
+Z 16162,17518 2 161114 -- U+005A (19U 90)
+lB 8811,17919,5245 3 161115 -- U+005B (19U 91)
+[ "
+rs 7351,18371,362 2 161116 -- U+005C (19U 92)
+\ "
+rB 8811,17919,5258 3 161117 -- U+005D (19U 93)
+] "
+ha 12415,17880 2 161118 -- U+005E (19U 94)
+_ 13229,0,5710 1 161119 -- U+005F (19U 95)
+ga 8811,17958 2 161120 -- U+0060 (19U 96)
+a 11743,12183,245 0 161121 -- U+0061 (19U 97)
+b 13229,18371,362 2 161122 -- U+0062 (19U 98)
+c 11743,12183,362 0 161123 -- U+0063 (19U 99)
+d 13229,18371,362 2 161124 -- U+0064 (19U 100)
+e 11743,12196,362 0 161125 -- U+0065 (19U 101)
+f 8811,18345 2 161126 -- U+0066 (19U 102)
+g 13229,12183,5710 1 161127 -- U+0067 (19U 103)
+h 13229,18371 2 161128 -- U+0068 (19U 104)
+i 7351,18371 2 161129 -- U+0069 (19U 105)
+j 7351,18384,5710 3 161130 -- U+006A (19U 106)
+k 13229,18371 2 161131 -- U+006B (19U 107)
+l 7351,18371 2 161132 -- U+006C (19U 108)
+m 20580,12183 0 161133 -- U+006D (19U 109)
+n 13229,12183 0 161134 -- U+006E (19U 110)
+o 13229,12183,362 0 161135 -- U+006F (19U 111)
+p 13229,12183,5659 1 161136 -- U+0070 (19U 112)
+q 13229,12183,5659 1 161137 -- U+0071 (19U 113)
+r 8811,12183 0 161138 -- U+0072 (19U 114)
+s 10297,12183,362 0 161139 -- U+0073 (19U 115)
+t 7351,15723,194 0 161140 -- U+0074 (19U 116)
+u 13229,11834,362 0 161141 -- U+0075 (19U 117)
+v 13229,11834,362 0 161142 -- U+0076 (19U 118)
+w 19107,11834,362 0 161143 -- U+0077 (19U 119)
+x 13229,11834 0 161144 -- U+0078 (19U 120)
+y 13229,11834,5710 1 161145 -- U+0079 (19U 121)
+z 11743,11834 0 161146 -- U+007A (19U 122)
+{ 12699,18371,5710 3 161147 -- U+007B (19U 123)
+lC "
+| 5297,18371,5710 3 161148 -- U+007C (19U 124)
+ba "
+} 12699,18371,5710 3 161149 -- U+007D (19U 125)
+rC "
+ti 14314,8759 0 161150 -- U+007E (19U 126)
+r! 8811,12583,5710 1 161185 -- U+00A1 (19U 161)
+ct 13229,17131,4896 2 161186 -- U+00A2 (19U 162)
+Po 13229,17880,310 2 161187 -- U+00A3 (19U 163)
+Cs 13229,14999 0 161188 -- U+00A4 (19U 164)
+Ye 13229,17518 2 161189 -- U+00A5 (19U 165)
+bb 5297,18371,5710 3 161190 -- U+00A6 (19U 166)
+sc 13229,17880,5168 3 161191 -- U+00A7 (19U 167)
+ad 8811,17273 2 161192 -- U+00A8 (19U 168)
+co 20102,17919,400 2 161193 -- U+00A9 (19U 169)
+Of 7299,17880 2 161194 -- U+00AA (19U 170)
+Fo 13229,12066,103 0 161195 -- U+00AB (19U 171)
+tno 14922,11343 0 161196 -- U+00AC (19U 172)
+u00AD 8811,6912 0 161197 -- U+00AD (19U 173)
+rg 20102,17919,400 2 161198 -- U+00AE (19U 174)
+u00AF 13229,19973 2 161199 -- U+00AF (19U 175)
+de 10581,17906 2 161200 -- U+00B0 (19U 176)
+t+- 14521,15748 0 161201 -- U+00B1 (19U 177)
+S2 7932,17880 2 161202 -- U+00B2 (19U 178)
+S3 7932,17880 2 161203 -- U+00B3 (19U 179)
+aa 8811,17958 2 161204 -- U+00B4 (19U 180)
+mc 15245,11834,5710 1 161205 -- U+00B5 (19U 181)
+ps 11989,17518,5710 3 161206 -- U+00B6 (19U 182)
+pc 6615,10193 0 60157 -- U+00B7 ( 7J 253)
+ac 8811,207,5038 0 161208 -- U+00B8 (19U 184)
+S1 7932,17880 2 161209 -- U+00B9 (19U 185)
+Om 8204,17880 2 161210 -- U+00BA (19U 186)
+Fc 13229,12066,103 0 161211 -- U+00BB (19U 187)
+14 19844,17880,698 2 161212 -- U+00BC (19U 188)
+12 19844,17880,698 2 161213 -- U+00BD (19U 189)
+34 19844,17880,698 2 161214 -- U+00BE (19U 190)
+r? 11743,12596,5710 1 161215 -- U+00BF (19U 191)
+`A 19107,23216 2 161216 -- U+00C0 (19U 192)
+'A 19107,23216 2 161217 -- U+00C1 (19U 193)
+^A 19107,23164 2 161218 -- U+00C2 (19U 194)
+~A 19107,22273 2 161219 -- U+00C3 (19U 195)
+:A 19107,22066 2 161220 -- U+00C4 (19U 196)
+oA 19107,21975 2 161221 -- U+00C5 (19U 197)
+AE 23526,17518 2 161222 -- U+00C6 (19U 198)
+,C 17648,17919,5038 2 161223 -- U+00C7 (19U 199)
+`E 16162,23216 2 161224 -- U+00C8 (19U 200)
+'E 16162,23216 2 161225 -- U+00C9 (19U 201)
+^E 16162,23164 2 161226 -- U+00CA (19U 202)
+:E 16162,22066 2 161227 -- U+00CB (19U 203)
+`I 8811,23216 2 161228 -- U+00CC (19U 204)
+'I 8811,23216 2 161229 -- U+00CD (19U 205)
+^I 8811,23164 2 161230 -- U+00CE (19U 206)
+:I 8811,22066 2 161231 -- U+00CF (19U 207)
+-D 19107,17518 2 161232 -- U+00D0 (19U 208)
+~N 19107,22273,284 2 161233 -- U+00D1 (19U 209)
+`O 19107,23216,400 2 161234 -- U+00D2 (19U 210)
+'O 19107,23216,400 2 161235 -- U+00D3 (19U 211)
+^O 19107,23164,400 2 161236 -- U+00D4 (19U 212)
+~O 19107,22273,400 2 161237 -- U+00D5 (19U 213)
+:O 19107,22066,400 2 161238 -- U+00D6 (19U 214)
+tmu 14922,14095 0 161239 -- U+00D7 (19U 215)
+/O 19107,18087,607 2 161240 -- U+00D8 (19U 216)
+`U 19107,23216,413 2 161241 -- U+00D9 (19U 217)
+'U 19107,23216,413 2 161242 -- U+00DA (19U 218)
+^U 19107,23164,413 2 161243 -- U+00DB (19U 219)
+:U 19107,22066,413 2 161244 -- U+00DC (19U 220)
+'Y 19107,23216 2 161245 -- U+00DD (19U 221)
+TP 14715,17518 2 161246 -- U+00DE (19U 222)
+ss 13229,18371,168 2 161247 -- U+00DF (19U 223)
+`a 11743,17958,245 2 161248 -- U+00E0 (19U 224)
+'a 11743,17958,245 2 161249 -- U+00E1 (19U 225)
+^a 11743,17893,245 2 161250 -- U+00E2 (19U 226)
+~a 11743,17518,245 2 161251 -- U+00E3 (19U 227)
+:a 11743,17273,245 2 161252 -- U+00E4 (19U 228)
+oa 11743,18423,245 2 161253 -- U+00E5 (19U 229)
+ae 17648,12196,362 0 161254 -- U+00E6 (19U 230)
+,c 11743,12183,5038 0 161255 -- U+00E7 (19U 231)
+`e 11743,17958,362 2 161256 -- U+00E8 (19U 232)
+'e 11743,17958,362 2 161257 -- U+00E9 (19U 233)
+^e 11743,17893,362 2 161258 -- U+00EA (19U 234)
+:e 11743,17260,362 2 161259 -- U+00EB (19U 235)
+`i 7351,17958 2 161260 -- U+00EC (19U 236)
+'i 7351,17958 2 161261 -- U+00ED (19U 237)
+^i 7351,17893 2 161262 -- U+00EE (19U 238)
+:i 7351,17260 2 161263 -- U+00EF (19U 239)
+Sd 13229,18371,362 2 161264 -- U+00F0 (19U 240)
+~n 13229,17518 2 161265 -- U+00F1 (19U 241)
+`o 13229,17958,362 2 161266 -- U+00F2 (19U 242)
+'o 13229,17958,362 2 161267 -- U+00F3 (19U 243)
+^o 13229,17893,362 2 161268 -- U+00F4 (19U 244)
+~o 13229,17518,362 2 161269 -- U+00F5 (19U 245)
+:o 13229,17260,362 2 161270 -- U+00F6 (19U 246)
+tdi 14521,13888 0 161271 -- U+00F7 (19U 247)
+/o 13229,12648,866 0 161272 -- U+00F8 (19U 248)
+`u 13229,17958,362 2 161273 -- U+00F9 (19U 249)
+'u 13229,17958,362 2 161274 -- U+00FA (19U 250)
+^u 13229,17893,362 2 161275 -- U+00FB (19U 251)
+:u 13229,17260,362 2 161276 -- U+00FC (19U 252)
+'y 13229,17958,5710 3 161277 -- U+00FD (19U 253)
+Tp 13229,18371,5646 3 161278 -- U+00FE (19U 254)
+:y 13229,17273,5710 3 161279 -- U+00FF (19U 255)
+u0041_0306 19107,22725 2 75203 -- U+0102 ( 9E 195)
+u0061_0306 11743,17544,245 2 75235 -- U+0103 ( 9E 227)
+u0041_0328 19107,17919,4690 2 75173 -- U+0104 ( 9E 165)
+u0061_0328 11743,12183,4690 0 75193 -- U+0105 ( 9E 185)
+'C 17648,23216,400 2 75206 -- U+0106 ( 9E 198)
+'c 11743,17958,362 2 75238 -- U+0107 ( 9E 230)
+u0041_030C 17648,23164,400 2 75208 -- U+010C ( 9E 200)
+u0061_030C 11743,17893,362 2 75240 -- U+010D ( 9E 232)
+u0044_030C 19107,23164 2 75215 -- U+010E ( 9E 207)
+u0064_030C 17105,18371,362 2 75247 -- U+010F ( 9E 239)
+u0111 13229,18371,362 2 75248 -- U+0111 ( 9E 240)
+u0045_0328 16162,17518,4690 2 75210 -- U+0118 ( 9E 202)
+u0065_0328 11743,12196,4690 0 75242 -- U+0119 ( 9E 234)
+u0045_030C 16162,23164 2 75212 -- U+011A ( 9E 204)
+u0065_030C 11743,17893,362 2 75244 -- U+011B ( 9E 236)
+u0047_0306 19107,22686,400 2 46288 -- U+011E ( 5T 208)
+u0067_0306 13229,17544,5710 3 46320 -- U+011F ( 5T 240)
+u0049_0307 8811,22079 2 46301 -- U+0130 ( 5T 221)
+.i 7351,12183 0 46333 -- U+0131 ( 5T 253)
+IJ 18746,17518,400 2 60135 -- U+0132 ( 7J 231)
+ij 14612,18384,5710 3 60134 -- U+0133 ( 7J 230)
+u004C_0301 16162,23216 2 75205 -- U+0139 ( 9E 197)
+u006C_0301 7351,23216 2 75237 -- U+013A ( 9E 229)
+u004C_030C 16162,17919 2 75196 -- U+013D ( 9E 188)
+u006C_030C 10749,18371 2 75198 -- U+013E ( 9E 190)
+u013F 16162,17518 2 95646 -- U+013F (11U 158)
+u0140 9095,18371 2 95647 -- U+0140 (11U 159)
+/L 16162,17518 2 75171 -- U+0141 ( 9E 163)
+/l 7351,18371 2 75187 -- U+0142 ( 9E 179)
+u004E_0301 19107,23216,284 2 75217 -- U+0143 ( 9E 209)
+u006E_0301 13229,17958 2 75249 -- U+0144 ( 9E 241)
+u004E_030C 19107,23164,284 2 75218 -- U+0147 ( 9E 210)
+u006E_030C 13229,17893 2 75250 -- U+0148 ( 9E 242)
+u0149 15981,17919 2 95660 -- U+0149 (11U 172)
+u004F_030B 19107,23216,400 2 75221 -- U+0150 ( 9E 213)
+u006F_030B 13229,17958,362 2 75253 -- U+0151 ( 9E 245)
+OE 23526,17673,207 2 161164 -- U+0152 (19U 140)
+oe 19107,12196,362 0 161180 -- U+0153 (19U 156)
+u0052_0301 17648,23216 2 75200 -- U+0154 ( 9E 192)
+u0072_0301 8811,17958 2 75232 -- U+0155 ( 9E 224)
+u0052_030C 17648,23164 2 75224 -- U+0158 ( 9E 216)
+u0072_030C 8811,17893 2 75256 -- U+0159 ( 9E 248)
+u0053_0301 14715,23216,400 2 75148 -- U+015A ( 9E 140)
+u0073_0301 10297,17958,362 2 75164 -- U+015B ( 9E 156)
+u0053_0327 14715,17919,5038 2 75178 -- U+015E ( 9E 170)
+u0073_0327 10297,12183,5038 0 75194 -- U+015F ( 9E 186)
+vS 14715,23164,400 2 161162 -- U+0160 (19U 138)
+vs 10297,17893,362 2 161178 -- U+0161 (19U 154)
+u0054_0327 16162,17518,5969 3 75230 -- U+0162 ( 9E 222)
+u0074_0327 7351,15723,5969 1 75262 -- U+0163 ( 9E 254)
+u0054_030C 16162,23164 2 75149 -- U+0164 ( 9E 141)
+u0074_030C 11304,18371,194 2 75165 -- U+0165 ( 9E 157)
+u0055_030A 19107,23435,413 2 75225 -- U+016E ( 9E 217)
+u0075_030A 13229,18397,362 2 75257 -- U+016F ( 9E 249)
+u0055_030B 19107,23216,413 2 75227 -- U+0170 ( 9E 219)
+u0075_030B 13229,17958,362 2 75259 -- U+0171 ( 9E 251)
+:Y 19107,22066 2 161183 -- U+0178 (19U 159)
+u005A_0301 16162,23216 2 75151 -- U+0179 ( 9E 143)
+u007A_0301 11743,17958 2 75167 -- U+017A ( 9E 159)
+u005A_0307 16162,22079 2 75183 -- U+017B ( 9E 175)
+u007A_0307 11743,17273 2 75199 -- U+017C ( 9E 191)
+vZ 16162,23164 2 75150 -- U+017D ( 9E 142)
+vz 11743,17893 2 75166 -- U+017E ( 9E 158)
+Fn 13229,17919,5568 3 161155 -- U+0192 (19U 131)
+a^ 8811,17893 2 161160 -- U+02C6 (19U 136)
+^ "
+ah 8811,17893 2 75169 -- U+02C7 ( 9E 161)
+a- 8811,17480 2 60154 -- U+02C9 ( 7J 250)
+ab 8811,17544 2 75170 -- U+02D8 ( 9E 162)
+a. 8811,17273 2 75263 -- U+02D9 ( 9E 255)
+ao 8811,18397 2 60152 -- U+02DA ( 7J 248)
+ho 8811,207,4690 0 75186 -- U+02DB ( 9E 178)
+~ 8811,17518 2 161176 -- U+02DC (19U 152)
+a~ "
+a" 8811,17958 2 75197 -- U+02DD ( 9E 189)
+en 13229,6795 0 161174 -- U+2013 (19U 150)
+em 26458,6808 0 161175 -- U+2014 (19U 151)
+u2017 13229,0,5710 1 60095 -- U+2017 ( 7J 191)
+oq 8811,17919 2 161169 -- U+2018 (19U 145)
+` "
+cq 8811,17919 2 161170 -- U+2019 (19U 146)
+' "
+bq 8811,2584,4405 0 161154 -- U+201A (19U 130)
+lq 11743,17919 2 161171 -- U+201C (19U 147)
+rq 11743,17919 2 161172 -- U+201D (19U 148)
+Bq 11743,2584,4082 0 161156 -- U+201E (19U 132)
+dg 13229,18126,5439 3 161158 -- U+2020 (19U 134)
+dd 13229,18371,5710 3 161159 -- U+2021 (19U 135)
+bu 9263,11989 0 161173 -- U+2022 (19U 149)
+u2026 26458,2506,362 0 161157 -- U+2026 (19U 133)
+%0 26458,17919,711 2 161161 -- U+2030 (19U 137)
+fm 5788,17919 2 60101 -- U+2032 ( 7J 197)
+sd 11020,17919 2 60102 -- U+2033 ( 7J 198)
+fo 8811,12066,103 0 161163 -- U+2039 (19U 139)
+fc 8811,12066,103 0 161179 -- U+203A (19U 155)
+u203C 15154,17919,362 2 87315 -- U+203C (10U 19)
+u207F 8333,14728 0 87548 -- U+207F (10U 252)
+u20A7 25632,17518,349 2 60121 -- U+20A7 ( 7J 217)
+Eu 13229,17880,310 2 161152 -- U+20AC (19U 128)
+u2105 22053,17919,723 2 60072 -- U+2105 ( 7J 168)
+u2113 12674,17919,362 2 60122 -- U+2113 ( 7J 218)
+tm 25929,17518 2 161177 -- U+2122 (19U 153)
+\- 14922,9328 0 60096 -- U+2212 ( 7J 192)
+f/ 4418,17880,698 2 60109 -- U+2215 ( 7J 205)
+sq 15981,12196 0 60091 -- U+25A1 ( 7J 187)
+u25CA 13074,18371 2 101079 -- U+25CA (12J 215)
+fi 14715,18371 2 60077 -- U+FB01 ( 7J 173)
+fl 14715,18371 2 60078 -- U+FB02 ( 7J 174)
diff --git a/font/devlj4/TR b/font/devlj4/TR
new file mode 100644
index 0000000..b27cef2
--- /dev/null
+++ b/font/devlj4/TR
@@ -0,0 +1,843 @@
+# CG Times
+name TR
+spacewidth 7806
+pcltypeface 4101
+pclproportional 1
+pclweight 0
+pclstyle 0
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -3902
+P . -3902
+P , -3902
+V A -5363
+A V -5363
+T o -3413
+T r -1949
+T c -3413
+T e -2924
+T d -2924
+T s -2924
+T y -1949
+T a -3413
+T w -1949
+T u -1949
+T J -1460
+L T -2924
+L Y -3902
+Y o -4877
+Y e -4388
+Y a -4877
+Y J -1460
+A W -4877
+W A -4877
+T A -2924
+V o -3902
+V e -3902
+V a -3902
+Y A -4388
+F A -3902
+F . -3902
+F , -3902
+A T -2924
+A Y -4388
+v . -3413
+v , -3413
+y . -3413
+y , -3413
+T . -2924
+T , -2924
+L W -3413
+P A -3902
+V J -1460
+V . -3902
+V , -3902
+Y . -3902
+Y , -3902
+W o -3413
+W e -3413
+W a -3413
+W . -3902
+W , -3902
+r . -2438
+r , -2438
+w . -3413
+w , -3413
+Y u -3413
+A v -3413
+A y -3413
+A w -3413
+o . -1460
+o , -1460
+p . -1460
+p , -1460
+e . -974
+e , -974
+b . -1460
+b , -1460
+O T -1949
+O V -2924
+O Y -2924
+O . -2924
+O , -2924
+L y -1460
+P J -1460
+V y -2924
+V u -2924
+V O -2924
+V G -2924
+V C -2924
+V Q -2924
+D T -1949
+D V -2924
+D Y -2924
+D . -2924
+D , -2924
+Y O -2924
+Y G -2924
+Y C -2924
+Y Q -2924
+F o -1460
+F e -1460
+F a -1460
+c . -1460
+c , -1460
+O A -2438
+O W -2438
+R T -2438
+R V -2438
+R Y -2438
+R W -2438
+G T -1949
+P o -1460
+P g -1460
+P e -974
+P a -1460
+C A -1949
+C . -1949
+C , -1949
+D A -2438
+D W -2438
+B T -1949
+B Y -1949
+B . -1949
+B , -1949
+F J -1460
+A O -2438
+A G -2438
+A C -2438
+A U -2438
+A Q -2438
+W r -2438
+W y -2438
+W u -2438
+W O -2438
+W G -2438
+W C -2438
+W J -1460
+W Q -2438
+J A -2438
+J . -2438
+J , -2438
+U A -2438
+U . -2438
+U , -2438
+Q A -2438
+Q W -2438
+T O -1949
+T G -1949
+T C -1949
+T Q -1949
+O X -1460
+G V -1949
+G Y -1949
+G W -1949
+G . -1460
+G , -1460
+C T -974
+C V -974
+C Y -974
+D X -1460
+B V -1949
+B X -1460
+B A -1949
+B W -1949
+S . -1460
+S , -1460
+F r -485
+F y -485
+F u -485
+F O -485
+F G -485
+F C -485
+F Q -485
+X o -1460
+X e -974
+X y -1460
+X O -1460
+X G -1460
+X C -1460
+X Q -1460
+A o -1460
+A e -974
+Q X -1460
+K o -1460
+K e -974
+K y -1460
+K w -1460
+K O -1460
+K G -1460
+K C -1460
+K Q -1460
+o v -1460
+o y -1460
+o x -974
+o w -1460
+h v -974
+h y -974
+n v -974
+n y -974
+m v -974
+m y -974
+r g -974
+g . -974
+g , -974
+p v -974
+p y -974
+p x -974
+c v -1460
+c y -1460
+c w -1460
+v o -1460
+v g -1460
+v c -1460
+v d -1460
+v a -1460
+v q -1460
+e v -974
+e y -974
+b v -1460
+b y -1460
+b w -1460
+s . -974
+s , -974
+y o -1460
+y g -1460
+y c -1460
+y d -1460
+y a -1460
+y q -1460
+f g -485
+x o -974
+x g -485
+x c -974
+x e -974
+x d -974
+x a -974
+x q -974
+a v -1460
+a y -1460
+a w -1460
+w o -1460
+w g -1460
+w c -1460
+w d -1460
+w a -1460
+w q -1460
+T i -1460
+T S -1460
+R o -1460
+R y -1460
+R O -1460
+R G -1460
+R C -1460
+R U -1460
+R Q -1460
+G X -1460
+G A -1460
+P s -974
+C X -974
+C W -974
+V i -1460
+V S -1460
+S T -485
+S V -485
+S Y -485
+S X -485
+S A -1460
+S W -485
+Y i -1460
+Y S -1460
+X a -974
+X u -974
+X S -485
+A t -974
+A g -485
+A c -1460
+A d -1460
+A a -974
+A u -974
+A q -1460
+A S -485
+W i -1460
+W S -1460
+J y -485
+K c -1460
+K u -974
+K S -485
+t g -485
+o f -974
+h w -974
+n w -974
+m w -974
+r o -485
+r c -485
+r e -485
+r d -485
+r a -485
+r q -485
+g g -974
+p f -974
+p w -974
+c f -974
+c x -974
+v e -974
+v s -974
+e f -974
+e x -974
+e w -974
+b f -974
+s v -974
+s y -974
+s f -974
+s x -974
+s w -974
+y e -974
+y s -974
+f o -974
+f c -974
+f e -974
+f d -974
+f s -974
+f a -974
+f q -974
+x s -974
+w e -974
+w s -974
+k o -485
+k g -485
+k c -485
+k e -485
+k d -485
+k a -485
+k q -485
+O Z -485
+N . -485
+N , -485
+R e -974
+R a -974
+R u -974
+R S -485
+G Z -485
+C Z -485
+E g -485
+Z o -485
+Z e -485
+Z d -485
+Z s -485
+Z y -485
+Z a -485
+Z w -485
+Z u -485
+Z O -485
+Z G -485
+Z C -485
+Z S -485
+Z J -485
+Z Q -485
+D Z -485
+B Z -485
+S Z -485
+F i -485
+F j -485
+F S -485
+X J -485
+A s -974
+A J -485
+J o -485
+J i -485
+J e -485
+J a -485
+J u -485
+J O -485
+J G -485
+J C -485
+J S -485
+J J -485
+J Q -485
+U g -485
+K a -974
+K J -485
+o g -485
+o z -485
+h g -485
+n g -485
+m g -485
+l g -485
+r s -485
+g o -485
+g c -485
+g e -485
+g d -485
+g s -485
+g a -485
+g q -485
+i g -485
+p g -485
+p z -485
+c g -485
+c z -485
+e g -485
+e z -485
+z o -485
+z g -485
+z c -485
+z e -485
+z d -485
+z s -485
+z a -485
+z q -485
+d g -485
+b g -485
+b z -485
+s g -485
+s z -485
+a g -485
+j g -485
+u g -485
+q g -485
+k s -485
+O g -485
+N A -485
+M g -485
+R J -485
+I g -485
+K T -485
+K V -485
+K Y -485
+K W -485
+K U -485
+L cq -3902
+L ' -3902
+T hy -1949
+T - -1949
+T en -1949
+T em -1949
+A cq -3902
+A ' -3902
+hy T -1949
+- T -1949
+en T -1949
+em T -1949
+Y hy -3413
+Y - -3413
+Y en -3413
+Y em -3413
+p cq -974
+p ' -974
+c cq -1460
+c ' -1460
+e cq -974
+e ' -974
+b cq -1460
+b ' -1460
+a cq -1460
+a ' -1460
+V hy -2924
+V - -2924
+V en -2924
+V em -2924
+h cq -974
+h ' -974
+n cq -974
+n ' -974
+m cq -974
+m ' -974
+R cq -1460
+R ' -1460
+W hy -2438
+W - -2438
+W en -2438
+W em -2438
+cq d -1460
+' d -1460
+s cq -974
+s ' -974
+F hy -485
+F - -485
+F en -485
+F em -485
+X hy -1460
+X - -1460
+X en -1460
+X em -1460
+A hy -1949
+A - -1949
+A en -1949
+A em -1949
+K hy -1460
+K - -1460
+K en -1460
+K em -1460
+cq s -974
+' s -974
+hy X -1460
+- X -1460
+hy A -1949
+- A -1949
+en X -1460
+en A -1949
+em X -1460
+R hy -1460
+R - -1460
+R en -1460
+R em -1460
+K cq -485
+K ' -485
+t g -485
+b f -974
+Z hy -485
+Z - -485
+Z en -485
+Z em -485
+J hy -485
+J - -485
+J en -485
+J em -485
+hy g -485
+- g -485
+en g -485
+em g -485
+charset
+! 8781,18225,330 2 161057 -- MSL 1 (19U 33)
+dq 12198,18225 2 161058 -- MSL 2 (19U 34)
+" "
+sh 13173,18225,837 2 161059 -- MSL 3 (19U 35)
+# "
+Do 13173,19845,2370 2 161060 -- MSL 4 (19U 36)
+$ "
+% 23418,18894,1026 2 161061 -- MSL 5 (19U 37)
+& 20490,18225,330 2 161062 -- MSL 6 (19U 38)
+cq 8781,18225 2 161170 -- MSL 8 (19U 146)
+' "
+( 8781,18225,4845 2 161064 -- MSL 9 (19U 40)
+) 8781,18225,4845 2 161065 -- MSL 10 (19U 41)
+* 13173,18225 2 161066 -- MSL 11 (19U 42)
++ 23418,15750 0 161067 -- MSL 12 (19U 43)
+, 8781,2565,4005 0 161068 -- MSL 13 (19U 44)
+hy 8781,7155 0 161069 -- MSL 14 (19U 45)
+- "
+. 8781,2685,330 0 161070 -- MSL 15 (19U 46)
+sl 8781,18225,330 2 161071 -- MSL 16 (19U 47)
+/ "
+0 13173,18225,330 2 161072 -- MSL 17 (19U 48)
+1 13173,18225 2 161073 -- MSL 18 (19U 49)
+2 13173,18225 2 161074 -- MSL 19 (19U 50)
+3 13173,18225,330 2 161075 -- MSL 20 (19U 51)
+4 13173,18225 2 161076 -- MSL 21 (19U 52)
+5 13173,17895,330 2 161077 -- MSL 22 (19U 53)
+6 13173,18225,330 2 161078 -- MSL 23 (19U 54)
+7 13173,17895 2 161079 -- MSL 24 (19U 55)
+8 13173,18225,330 2 161080 -- MSL 25 (19U 56)
+9 13173,18225,330 2 161081 -- MSL 26 (19U 57)
+: 8781,12252,330 0 161082 -- MSL 27 (19U 58)
+; 8781,12252,4005 0 161083 -- MSL 28 (19U 59)
+< 26346,16068 0 161084 -- MSL 29 (19U 60)
+= 23418,10875 0 161085 -- MSL 30 (19U 61)
+> 26346,16068 0 161086 -- MSL 31 (19U 62)
+? 11709,18225,330 2 161087 -- MSL 32 (19U 63)
+at 23418,16980,3654 2 161088 -- MSL 33 (19U 64)
+@ "
+A 19029,18225 2 161089 -- MSL 34 (19U 65)
+B 16587,17895 2 161090 -- MSL 35 (19U 66)
+C 18051,18225,330 2 161091 -- MSL 36 (19U 67)
+D 19515,17895 2 161092 -- MSL 37 (19U 68)
+E 16587,17895 2 161093 -- MSL 38 (19U 69)
+F 15612,17895 2 161094 -- MSL 39 (19U 70)
+G 19029,18225,330 2 161095 -- MSL 40 (19U 71)
+H 19515,17895 2 161096 -- MSL 41 (19U 72)
+I 8781,17895 2 161097 -- MSL 42 (19U 73)
+J 10245,17895,330 2 161098 -- MSL 43 (19U 74)
+K 18540,17895 2 161099 -- MSL 44 (19U 75)
+L 16587,17895 2 161100 -- MSL 45 (19U 76)
+M 23907,17895 2 161101 -- MSL 46 (19U 77)
+N 19515,17895,330 2 161102 -- MSL 47 (19U 78)
+O 19029,18225,330 2 161103 -- MSL 48 (19U 79)
+P 15126,17895 2 161104 -- MSL 49 (19U 80)
+Q 19029,18225,4605 2 161105 -- MSL 50 (19U 81)
+R 17565,17895 2 161106 -- MSL 51 (19U 82)
+S 14148,18225,330 2 161107 -- MSL 52 (19U 83)
+T 16587,17895 2 161108 -- MSL 53 (19U 84)
+U 19515,17895,330 2 161109 -- MSL 54 (19U 85)
+V 19029,17895,330 2 161110 -- MSL 55 (19U 86)
+W 24882,17895,330 2 161111 -- MSL 56 (19U 87)
+X 19029,17895 2 161112 -- MSL 57 (19U 88)
+Y 19029,17895 2 161113 -- MSL 58 (19U 89)
+Z 17076,17895 2 161114 -- MSL 59 (19U 90)
+lB 8781,17895,4380 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 8781,18225,330 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 8781,17895,4380 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588 1 161119 -- MSL 64 (19U 95)
+oq 8781,18225 2 161169 -- MSL 66 (19U 145)
+` "
+a 11709,12669,330 0 161121 -- MSL 67 (19U 97)
+b 13173,18300,330 2 161122 -- MSL 68 (19U 98)
+c 11709,12669,330 0 161123 -- MSL 69 (19U 99)
+d 13173,18300,330 2 161124 -- MSL 70 (19U 100)
+e 11709,12669,330 0 161125 -- MSL 71 (19U 101)
+f 8781,18300 2 161126 -- MSL 72 (19U 102)
+g 13173,12669,5655 1 161127 -- MSL 73 (19U 103)
+h 13173,18300 2 161128 -- MSL 74 (19U 104)
+i 7317,18534 2 161129 -- MSL 75 (19U 105)
+j 7317,18534,5655 3 161130 -- MSL 76 (19U 106)
+k 13173,18300 2 161131 -- MSL 77 (19U 107)
+l 7317,18300 2 161132 -- MSL 78 (19U 108)
+m 20490,12669 0 161133 -- MSL 79 (19U 109)
+n 13173,12669 0 161134 -- MSL 80 (19U 110)
+o 13173,12669,330 0 161135 -- MSL 81 (19U 111)
+p 13173,12669,5655 1 161136 -- MSL 82 (19U 112)
+q 13173,12669,5655 1 161137 -- MSL 83 (19U 113)
+r 9759,12669 0 161138 -- MSL 84 (19U 114)
+s 10245,12669,330 0 161139 -- MSL 85 (19U 115)
+t 7317,15465,330 0 161140 -- MSL 86 (19U 116)
+u 13173,12339,330 0 161141 -- MSL 87 (19U 117)
+v 13173,12339,330 0 161142 -- MSL 88 (19U 118)
+w 19029,12339,330 0 161143 -- MSL 89 (19U 119)
+x 13173,12339 0 161144 -- MSL 90 (19U 120)
+y 13173,12339,5655 1 161145 -- MSL 91 (19U 121)
+z 11709,12339 0 161146 -- MSL 92 (19U 122)
+{ 11709,19935,6210 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588 3 161148 -- MSL 94 (19U 124)
+ba "
+} 11709,19935,6210 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,8952 0 161150 -- MSL 96 (19U 126)
+`A 19029,23955 2 161216 -- MSL 99 (19U 192)
+^A 19029,23955 2 161218 -- MSL 100 (19U 194)
+`E 16587,23955 2 161224 -- MSL 101 (19U 200)
+^E 16587,23955 2 161226 -- MSL 102 (19U 202)
+:E 16587,23085 2 161227 -- MSL 103 (19U 203)
+^I 8781,23955 2 161230 -- MSL 104 (19U 206)
+:I 8781,23085 2 161231 -- MSL 105 (19U 207)
+aa 13173,18399 2 161204 -- MSL 106 (19U 180)
+ga 13173,18399 2 161120 -- MSL 107 (19U 96)
+a^ 13173,18399 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 13173,17124 2 161192 -- MSL 109 (19U 168)
+~ 13173,17064 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 19515,23955,330 2 161241 -- MSL 111 (19U 217)
+^U 19515,23955,330 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105 2 161199 -- MSL 113 (19U 175)
+'Y 19029,23955 2 161245 -- MSL 114 (19U 221)
+'y 13173,18399,5655 3 161277 -- MSL 115 (19U 253)
+de 13173,18225 2 161200 -- MSL 116 (19U 176)
+,C 18051,18225,4908 2 161223 -- MSL 117 (19U 199)
+,c 11709,12669,4572 0 161255 -- MSL 118 (19U 231)
+~N 19515,23034,330 2 161233 -- MSL 119 (19U 209)
+~n 13173,17064 2 161265 -- MSL 120 (19U 241)
+r! 8781,12783,5772 1 161185 -- MSL 121 (19U 161)
+r? 11709,12783,5772 1 161215 -- MSL 122 (19U 191)
+Cs 13173,15684 0 161188 -- MSL 123 (19U 164)
+Po 13173,18225,330 2 161187 -- MSL 124 (19U 163)
+Ye 13173,17895 2 161189 -- MSL 125 (19U 165)
+sc 13173,18225,4230 2 161191 -- MSL 126 (19U 167)
+Fn 13173,18300,5655 3 161155 -- MSL 127 (19U 131)
+ct 13173,16866 2 161186 -- MSL 128 (19U 162)
+^a 11709,18399,330 2 161250 -- MSL 129 (19U 226)
+^e 11709,18399,330 2 161258 -- MSL 130 (19U 234)
+^o 13173,18399,330 2 161268 -- MSL 131 (19U 244)
+^u 13173,18399,330 2 161275 -- MSL 132 (19U 251)
+'a 11709,18399,330 2 161249 -- MSL 133 (19U 225)
+'e 11709,18399,330 2 161257 -- MSL 134 (19U 233)
+'o 13173,18399,330 2 161267 -- MSL 135 (19U 243)
+'u 13173,18399,330 2 161274 -- MSL 136 (19U 250)
+`a 11709,18399,330 2 161248 -- MSL 137 (19U 224)
+`e 11709,18399,330 2 161256 -- MSL 138 (19U 232)
+`o 13173,18399,330 2 161266 -- MSL 139 (19U 242)
+`u 13173,18399,330 2 161273 -- MSL 140 (19U 249)
+:a 11709,17124,330 2 161252 -- MSL 141 (19U 228)
+:e 11709,17124,330 2 161259 -- MSL 142 (19U 235)
+:o 13173,17124,330 2 161270 -- MSL 143 (19U 246)
+:u 13173,17124,330 2 161276 -- MSL 144 (19U 252)
+oA 19029,23865 2 161221 -- MSL 145 (19U 197)
+^i 7317,18399 2 161262 -- MSL 146 (19U 238)
+/O 19029,18225,339 2 161240 -- MSL 147 (19U 216)
+AE 23418,17895 2 161222 -- MSL 148 (19U 198)
+oa 11709,18309,330 2 161253 -- MSL 149 (19U 229)
+'i 7317,18399 2 161261 -- MSL 150 (19U 237)
+/o 13173,12765,330 0 161272 -- MSL 151 (19U 248)
+ae 17565,12669,330 0 161254 -- MSL 152 (19U 230)
+:A 19029,23085 2 161220 -- MSL 153 (19U 196)
+`i 7317,18399 2 161260 -- MSL 154 (19U 236)
+:O 19029,23085,330 2 161238 -- MSL 155 (19U 214)
+:U 19515,23085,330 2 161244 -- MSL 156 (19U 220)
+'E 16587,23955 2 161225 -- MSL 157 (19U 201)
+:i 7317,17124 2 161263 -- MSL 158 (19U 239)
+ss 13173,18300,330 2 161247 -- MSL 159 (19U 223)
+^O 19029,23955,330 2 161236 -- MSL 160 (19U 212)
+'A 19029,23955 2 161217 -- MSL 161 (19U 193)
+~A 19029,23034 2 161219 -- MSL 162 (19U 195)
+~a 11709,17064,330 2 161251 -- MSL 163 (19U 227)
+-D 19515,17895 2 161232 -- MSL 164 (19U 208)
+Sd 13173,18456,330 2 161264 -- MSL 165 (19U 240)
+'I 8781,23955 2 161229 -- MSL 166 (19U 205)
+`I 8781,23955 2 161228 -- MSL 167 (19U 204)
+'O 19029,23955,330 2 161235 -- MSL 168 (19U 211)
+`O 19029,23955,330 2 161234 -- MSL 169 (19U 210)
+~O 19029,23034,330 2 161237 -- MSL 170 (19U 213)
+~o 13173,17064,330 2 161269 -- MSL 171 (19U 245)
+vS 14148,23955,330 2 161162 -- MSL 172 (19U 138)
+vs 10245,18399,330 2 161178 -- MSL 173 (19U 154)
+'U 19515,23955,330 2 161242 -- MSL 174 (19U 218)
+:Y 19029,23085 2 161183 -- MSL 175 (19U 159)
+:y 13173,17124,5655 3 161279 -- MSL 176 (19U 255)
+TP 15126,17895 2 161246 -- MSL 177 (19U 222)
+Tp 13173,18300,5655 3 161278 -- MSL 178 (19U 254)
+mc 14637,10800,5595 1 161205 -- MSL 180 (19U 181)
+ps 13173,19635,4200 2 161206 -- MSL 181 (19U 182)
+34 23418,18225,330 2 161214 -- MSL 182 (19U 190)
+\- 23418,8610 0 60096 -- MSL 183 ( 7J 192)
+14 23418,18225,330 2 161212 -- MSL 184 (19U 188)
+12 23418,18225,330 2 161213 -- MSL 185 (19U 189)
+Of 13173,18225 2 161194 -- MSL 186 (19U 170)
+Om 13173,18225 2 161210 -- MSL 187 (19U 186)
+Fo 10734,10095 0 161195 -- MSL 188 (19U 171)
+Fc 10734,10095 0 161211 -- MSL 190 (19U 187)
+t+- 23418,15750,2625 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916 3 161190 -- MSL 192 (19U 166)
+co 13173,19725 2 161193 -- MSL 193 (19U 169)
+tno 23418,12165 0 161196 -- MSL 194 (19U 172)
+u00AD 8781,7155 0 161197 -- MSL 195 (19U 173)
+rg 13173,19725 2 161198 -- MSL 196 (19U 174)
+S2 9270,18060 2 161202 -- MSL 197 (19U 178)
+S3 9270,18060 2 161203 -- MSL 198 (19U 179)
+ac 13173,258,4572 0 161208 -- MSL 199 (19U 184)
+S1 9270,18060 2 161209 -- MSL 200 (19U 185)
+tmu 23418,15117 0 161239 -- MSL 201 (19U 215)
+tdi 23418,14010 0 161271 -- MSL 202 (19U 247)
+u203C 13701,18225,330 2 87315 -- MSL 221 (10U 19)
+u20A7 23124,17895,330 2 60121 -- MSL 232 ( 7J 217)
+pc 8781,10407 0 161207 -- MSL 302 (19U 183)
+u013F 16587,17895 2 51943 -- MSL 306 ( 6J 231)
+u0140 7317,18300 2 51959 -- MSL 307 ( 6J 247)
+u2113 13173,18150,297 2 60122 -- MSL 308 ( 7J 218)
+u0149 15609,18225 2 51951 -- MSL 309 ( 6J 239)
+fm 8781,18225 2 60101 -- MSL 310 ( 7J 197)
+sd 13173,18225 2 60102 -- MSL 311 ( 7J 198)
+dg 13173,18225,4200 2 161158 -- MSL 312 (19U 134)
+tm 16101,17550 2 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588 1 60095 -- MSL 314 ( 7J 191)
+ah 13173,18399 2 75169 -- MSL 315 ( 9E 161)
+ao 13173,18309 2 60152 -- MSL 316 ( 7J 248)
+f/ 3423,18225,330 2 60109 -- MSL 324 ( 7J 205)
+em 23418,6900 0 161175 -- MSL 325 (19U 151)
+en 13173,6900 0 161174 -- MSL 326 (19U 150)
+dd 13173,18225,4200 2 161159 -- MSL 327 (19U 135)
+.i 7317,12669 0 46333 -- MSL 328 ( 5T 253)
+aq 8781,18225 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226 0 161173 -- MSL 331 (19U 149)
+u207F 13173,18060 2 87548 -- MSL 332 (10U 252)
+u0111 13173,18300,330 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 19029,23925 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 11709,17769,330 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 19029,18225,3450 2 75173 -- MSL 404 ( 9E 165)
+u0061_0328 11709,12669,3165 0 75193 -- MSL 405 ( 9E 185)
+'C 18051,23955,330 2 75206 -- MSL 406 ( 9E 198)
+'c 11709,18399,330 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 18051,23955,330 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 11709,18399,330 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 19515,23955 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 16101,18339,330 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 16587,23955 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 11709,18399,330 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 16587,17895,3450 2 75210 -- MSL 422 ( 9E 202)
+u0065_0328 11709,12669,3165 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 16587,23955 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 7317,24153 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 16587,18339 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 9759,18339 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 19515,23955,330 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 13173,18399 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 19515,23955,330 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 13173,18399 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 19029,23955,330 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 13173,18399,330 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 17565,23955 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 9759,18399 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 17565,23955 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 9759,18399 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 14148,23955,330 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 10245,18399,330 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 16587,23955 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 9270,18339,330 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 16587,17895,4908 2 75230 -- MSL 468 ( 9E 222)
+u0074_0327 7317,15465,4572 0 75262 -- MSL 469 ( 9E 254)
+u0055_030B 19515,23955,330 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 13173,18399,330 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 19515,23865,330 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 13173,18309,330 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 17076,23955 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 11709,18399 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 17076,23085 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 11709,17124 2 75199 -- MSL 485 ( 9E 191)
+u2070 9270,18060 2 51753 -- MSL 1000 ( 6J 41)
+u2074 9270,18060 2 51748 -- MSL 1001 ( 6J 36)
+u2075 9270,17895 2 51749 -- MSL 1002 ( 6J 37)
+u2076 9270,18060 2 51806 -- MSL 1003 ( 6J 94)
+u2077 9270,17895 2 51750 -- MSL 1004 ( 6J 38)
+u2078 9270,18060 2 51754 -- MSL 1005 ( 6J 42)
+u2079 9270,18060 2 51752 -- MSL 1006 ( 6J 40)
+lq 13662,18231 2 161171 -- MSL 1017 (19U 147)
+rq 13662,18225 2 161172 -- MSL 1018 (19U 148)
+Bq 13662,3009,3576 0 161156 -- MSL 1019 (19U 132)
+u2003 23418,0 0 51821 -- MSL 1020 ( 6J 109)
+u2002 13173,0 0 51822 -- MSL 1021 ( 6J 110)
+u2009 8781,0 0 51828 -- MSL 1023 ( 6J 116)
+u2026 23418,2880 0 161157 -- MSL 1028 (19U 133)
+vz 11709,18399 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,17703 2 128299 -- MSL 1034 (15U 43)
+u211E 20001,18315,4056 2 51794 -- MSL 1036 ( 6J 82)
+fi 14637,18300 2 60077 -- MSL 1040 ( 7J 173)
+fl 14637,18300 2 60078 -- MSL 1041 ( 7J 174)
+ff 15612,18300 2 51883 -- MSL 1042 ( 6J 171)
+Fi 21954,18300 2 51884 -- MSL 1043 ( 6J 172)
+Fl 21954,18300 2 51885 -- MSL 1044 ( 6J 173)
+ij 14637,18534,5655 3 60134 -- MSL 1047 ( 7J 230)
+u2105 24882,18225,330 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 19029,23925,330 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 13173,17769,5655 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 14148,18225,4908 2 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 10245,12669,4572 0 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 8781,23085 2 46301 -- MSL 1065 ( 5T 221)
+bq 8781,3009,3561 0 161154 -- MSL 1067 (19U 130)
+%0 31713,18894,1026 2 161161 -- MSL 1068 (19U 137)
+a- 13173,16539 0 60154 -- MSL 1084 ( 7J 250)
+ab 13173,17769 2 75170 -- MSL 1086 ( 9E 162)
+a. 13173,17124 2 75263 -- MSL 1088 ( 9E 255)
+oe 19029,12669,330 0 161180 -- MSL 1090 (19U 156)
+OE 23418,18225,330 2 161164 -- MSL 1091 (19U 140)
+fo 6831,10095 0 161163 -- MSL 1092 (19U 139)
+fc 6831,10095 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624 0 60091 -- MSL 1094 ( 7J 187)
+/L 16587,17895 2 75171 -- MSL 1095 ( 9E 163)
+/l 7317,18300 2 75187 -- MSL 1096 ( 9E 179)
+a" 13173,18399 2 75197 -- MSL 1097 ( 9E 189)
+ho 13173,750,3165 0 75186 -- MSL 1098 ( 9E 178)
+vZ 17076,23955 2 75150 -- MSL 1106 ( 9E 142)
+IJ 19245,17895,330 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/UB b/font/devlj4/UB
new file mode 100644
index 0000000..9ef2e87
--- /dev/null
+++ b/font/devlj4/UB
@@ -0,0 +1,797 @@
+# Univers Bd
+name UB
+spacewidth 8781
+pcltypeface 4148
+pclproportional 1
+pclweight 3
+pclstyle 0
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -3413
+P . -4877
+P , -4877
+V A -3413
+A V -3413
+T o -4388
+T r -4388
+T c -4388
+T e -4388
+T d -4388
+T s -4388
+T y -4388
+T a -4388
+T w -4388
+T u -4388
+T J -4388
+L T -4388
+L Y -3902
+Y o -3902
+Y e -3902
+Y a -3413
+Y J -3902
+A W -2438
+W A -2438
+T A -3413
+V o -2924
+V e -2924
+V a -2438
+Y A -3413
+F A -1949
+F . -3902
+F , -3902
+A T -3413
+A Y -3413
+v . -2438
+v , -2438
+y . -2438
+y , -2438
+T . -3902
+T , -3902
+L W -2438
+P A -2438
+V J -3413
+V . -3902
+V , -3902
+Y . -3902
+Y , -3902
+W o -1949
+W e -1949
+W a -1949
+W . -2924
+W , -2924
+r . -2438
+r , -2438
+w . -2438
+w , -2438
+Y u -2438
+A v -1949
+A y -1949
+A w -1949
+o . -1949
+o , -1949
+p . -1460
+p , -1460
+e . -1460
+e , -1460
+b . -1460
+b , -1460
+O T -1949
+O V -1460
+O Y -1949
+O . -2438
+O , -2438
+L y -1949
+L O -974
+L G -974
+L C -974
+L Q -974
+P J -1949
+V y -1460
+V u -1460
+V O -1460
+V G -1460
+V C -1460
+V Q -1460
+D T -2438
+D V -1460
+D Y -2438
+D . -2924
+D , -2924
+Y O -1949
+Y G -1949
+Y C -1949
+Y Q -1949
+F o -485
+F e -485
+F a -485
+c . -1460
+c , -1460
+O A -1460
+O W -974
+L U -974
+R T -1460
+R V -1460
+R Y -1460
+R W -974
+G T -1460
+P o -1460
+P g -1460
+P e -1460
+P a -974
+C A -1460
+C . -1949
+C , -1949
+D A -1460
+D W -974
+B T -1460
+B Y -1460
+B . -1460
+B , -1460
+F J -974
+A O -1460
+A G -1460
+A C -1460
+A U -1460
+A Q -1460
+W r -974
+W y -974
+W u -974
+W O -974
+W G -974
+W C -974
+W J -2438
+W Q -974
+J A -1460
+J . -1949
+J , -1949
+U A -1460
+U . -2438
+U , -2438
+Q W -974
+f . -485
+f , -485
+T O -1949
+T G -1949
+T C -1949
+T Q -1949
+O X -1460
+L o -974
+L e -974
+L q -974
+G V -1460
+G Y -1460
+G W -974
+G . -1460
+G , -1460
+P T -974
+P V -974
+P Y -974
+C T -1460
+C V -1460
+C Y -1460
+D X -1460
+B V -1460
+B X -974
+B A -974
+B W -974
+S . -1949
+S , -1949
+X o -1460
+X e -1460
+X y -1460
+X O -1460
+X G -1460
+X C -1460
+X Q -1460
+A o -1460
+A e -1460
+K o -1460
+K e -1460
+K y -1460
+K w -1460
+K O -1460
+K G -1460
+K C -1460
+K Q -1460
+o v -974
+o y -974
+o x -974
+o w -974
+h v -974
+h y -974
+n v -974
+n y -974
+m v -974
+m y -974
+g . -485
+g , -485
+p v -974
+p y -974
+p x -974
+c v -974
+c y -974
+c w -974
+v o -974
+v g -974
+v c -974
+v d -974
+v a -974
+v q -974
+e v -974
+e y -974
+b v -974
+b y -974
+b w -974
+s . -974
+s , -974
+y o -974
+y g -974
+y c -974
+y d -974
+y a -974
+y q -974
+x o -974
+x c -974
+x e -974
+x d -974
+x a -485
+x q -974
+a v -974
+a y -974
+a w -974
+w o -974
+w g -974
+w c -974
+w d -974
+w a -974
+w q -974
+T S -1460
+L a -485
+L S -974
+G X -974
+G A -974
+P s -485
+P Z -974
+P X -974
+P W -974
+C X -1460
+C W -974
+C J -485
+V S -1460
+S T -1460
+S V -1460
+S Y -1460
+S X -1460
+S A -1460
+S W -974
+Y S -1460
+X a -485
+X u -974
+X S -974
+A t -485
+A c -1460
+A d -974
+A a -485
+A u -974
+A q -974
+A S -974
+W S -974
+K c -1460
+K u -974
+K S -974
+t . -485
+t , -485
+o f -485
+h w -974
+h . -485
+h , -485
+n w -974
+n . -485
+n , -485
+m w -974
+m . -485
+m , -485
+l . -485
+l , -485
+i . -485
+i , -485
+p f -485
+p w -974
+c f -485
+c x -974
+v e -974
+v s -485
+e f -485
+e x -974
+e w -974
+z . -485
+z , -485
+d . -485
+d , -485
+b f -485
+s v -485
+s y -485
+s f -485
+s x -485
+s w -485
+y e -974
+y s -485
+x s -485
+x . -485
+x , -485
+a . -485
+a , -485
+w e -974
+w s -485
+j . -485
+j , -485
+u . -485
+k o -974
+k c -974
+k e -974
+k d -974
+k a -485
+k q -974
+k . -485
+k , -485
+O Z -974
+O J -485
+H . -485
+H , -485
+N . -485
+N , -485
+M . -485
+M , -485
+L . -485
+L , -485
+R . -485
+R , -485
+G Z -974
+I . -485
+I , -485
+C Z -974
+E . -485
+E , -485
+Z o -974
+Z e -974
+Z d -974
+Z s -485
+Z y -974
+Z a -485
+Z w -974
+Z u -974
+Z O -974
+Z G -974
+Z C -974
+Z S -974
+Z Q -974
+Z . -485
+Z , -485
+D Z -974
+D J -485
+B Z -974
+B J -485
+S Z -974
+S J -485
+X . -485
+X , -485
+A s -485
+A . -485
+A , -485
+J J -485
+U J -485
+K a -485
+K . -485
+K , -485
+h f -485
+n f -485
+m f -485
+a f -485
+k s -485
+G J -485
+A f -485
+L cq -6341
+L ' -6341
+T hy -4388
+T - -4388
+T en -4388
+T em -4388
+A cq -2438
+A ' -2438
+hy T -4388
+- T -4388
+en T -4388
+em T -4388
+Y hy -2438
+Y - -2438
+Y en -2438
+Y em -2438
+p cq -1460
+p ' -1460
+c cq -974
+c ' -974
+e cq -1460
+e ' -1460
+b cq -1460
+b ' -1460
+a cq -974
+a ' -974
+V hy -1460
+V - -1460
+V en -1460
+V em -1460
+h cq -974
+h ' -974
+n cq -974
+n ' -974
+m cq -974
+m ' -974
+W hy -974
+W - -974
+W en -974
+W em -974
+cq d -2438
+' d -2438
+s cq -485
+s ' -485
+L hy -974
+L - -974
+L en -974
+L em -974
+X hy -1460
+X - -1460
+X en -1460
+X em -1460
+A hy -1460
+A - -1460
+A en -1460
+A em -1460
+K hy -1460
+K - -1460
+K en -1460
+K em -1460
+cq s -1949
+' s -1949
+hy X -1460
+- X -1460
+hy A -1460
+- A -1460
+en X -1460
+en A -1460
+em X -1460
+b f -485
+Z hy -974
+Z - -974
+Z en -974
+Z em -974
+cq n -1460
+' n -1460
+cq m -1460
+' m -1460
+cq r -1460
+' r -1460
+cq v -1460
+' v -1460
+charset
+! 8781,18165 2 161057 -- MSL 1 (19U 33)
+dq 13662,18135 2 161058 -- MSL 2 (19U 34)
+" "
+sh 16587,18105 2 161059 -- MSL 3 (19U 35)
+# "
+Do 16587,18750,645 2 161060 -- MSL 4 (19U 36)
+$ "
+% 26346,18720,840 2 161061 -- MSL 5 (19U 37)
+& 20004,18495 2 161062 -- MSL 6 (19U 38)
+cq 8781,18135 2 161170 -- MSL 8 (19U 146)
+' "
+( 8781,18135,2355 2 161064 -- MSL 9 (19U 40)
+) 8781,18135,2355 2 161065 -- MSL 10 (19U 41)
+* 16587,18495 2 161066 -- MSL 11 (19U 42)
++ 26346,14940 0 161067 -- MSL 12 (19U 43)
+, 8781,3390,2355 0 161068 -- MSL 13 (19U 44)
+hy 8781,7875 0 161069 -- MSL 14 (19U 45)
+- "
+. 8781,3390 0 161070 -- MSL 15 (19U 46)
+sl 8781,18495,885 2 161071 -- MSL 16 (19U 47)
+/ "
+0 16587,18465,360 2 161072 -- MSL 17 (19U 48)
+1 16587,18105 2 161073 -- MSL 18 (19U 49)
+2 16587,18465 2 161074 -- MSL 19 (19U 50)
+3 16587,18465,360 2 161075 -- MSL 20 (19U 51)
+4 16587,18105 2 161076 -- MSL 21 (19U 52)
+5 16587,18105,360 2 161077 -- MSL 22 (19U 53)
+6 16587,18465,360 2 161078 -- MSL 23 (19U 54)
+7 16587,18105 2 161079 -- MSL 24 (19U 55)
+8 16587,18465,360 2 161080 -- MSL 25 (19U 56)
+9 16587,18465,360 2 161081 -- MSL 26 (19U 57)
+: 8781,12627 0 161082 -- MSL 27 (19U 58)
+; 8781,12627,2355 0 161083 -- MSL 28 (19U 59)
+< 26346,16068 0 161084 -- MSL 29 (19U 60)
+= 26346,10563 0 161085 -- MSL 30 (19U 61)
+> 26346,16068 0 161086 -- MSL 31 (19U 62)
+? 13662,18315 2 161087 -- MSL 32 (19U 63)
+at 26346,21057,2679 2 161088 -- MSL 33 (19U 64)
+@ "
+A 19515,18135 2 161089 -- MSL 34 (19U 65)
+B 16587,18135 2 161090 -- MSL 35 (19U 66)
+C 18540,18495,360 2 161091 -- MSL 36 (19U 67)
+D 19029,18135 2 161092 -- MSL 37 (19U 68)
+E 15126,18135 2 161093 -- MSL 38 (19U 69)
+F 14637,18135 2 161094 -- MSL 39 (19U 70)
+G 19515,18495,360 2 161095 -- MSL 40 (19U 71)
+H 19029,18135 2 161096 -- MSL 41 (19U 72)
+I 7317,18135 2 161097 -- MSL 42 (19U 73)
+J 14637,18135,360 2 161098 -- MSL 43 (19U 74)
+K 17565,18135 2 161099 -- MSL 44 (19U 75)
+L 14148,18135 2 161100 -- MSL 45 (19U 76)
+M 23907,18135 2 161101 -- MSL 46 (19U 77)
+N 19029,18135 2 161102 -- MSL 47 (19U 78)
+O 20004,18495,360 2 161103 -- MSL 48 (19U 79)
+P 15612,18135 2 161104 -- MSL 49 (19U 80)
+Q 20490,18495,360 2 161105 -- MSL 50 (19U 81)
+R 17076,18135 2 161106 -- MSL 51 (19U 82)
+S 17076,18495,360 2 161107 -- MSL 52 (19U 83)
+T 16587,18135 2 161108 -- MSL 53 (19U 84)
+U 19029,18135,360 2 161109 -- MSL 54 (19U 85)
+V 19029,18135 2 161110 -- MSL 55 (19U 86)
+W 26346,18135 2 161111 -- MSL 56 (19U 87)
+X 19029,18135 2 161112 -- MSL 57 (19U 88)
+Y 18051,18135 2 161113 -- MSL 58 (19U 89)
+Z 16101,18135 2 161114 -- MSL 59 (19U 90)
+lB 8781,18135,2355 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 8781,18495,885 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 8781,18135,2355 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588 1 161119 -- MSL 64 (19U 95)
+oq 8781,18135 2 161169 -- MSL 66 (19U 145)
+` "
+a 14148,12990,360 0 161121 -- MSL 67 (19U 97)
+b 15126,18165,360 2 161122 -- MSL 68 (19U 98)
+c 14148,12990,360 0 161123 -- MSL 69 (19U 99)
+d 15126,18165,360 2 161124 -- MSL 70 (19U 100)
+e 14148,12990,360 0 161125 -- MSL 71 (19U 101)
+f 9759,18315 2 161126 -- MSL 72 (19U 102)
+g 15126,12990,5313 1 161127 -- MSL 73 (19U 103)
+h 15126,18165 2 161128 -- MSL 74 (19U 104)
+i 6342,18165 2 161129 -- MSL 75 (19U 105)
+j 6342,18165,4995 3 161130 -- MSL 76 (19U 106)
+k 14148,18165 2 161131 -- MSL 77 (19U 107)
+l 6342,18165 2 161132 -- MSL 78 (19U 108)
+m 22932,12990 0 161133 -- MSL 79 (19U 109)
+n 15126,12990 0 161134 -- MSL 80 (19U 110)
+o 15126,12990,360 0 161135 -- MSL 81 (19U 111)
+p 15126,12990,4680 0 161136 -- MSL 82 (19U 112)
+q 15126,12990,4680 0 161137 -- MSL 83 (19U 113)
+r 9270,13005 0 161138 -- MSL 84 (19U 114)
+s 13173,12990,360 0 161139 -- MSL 85 (19U 115)
+t 9759,16110,360 0 161140 -- MSL 86 (19U 116)
+u 15126,12630,360 0 161141 -- MSL 87 (19U 117)
+v 14637,12630 0 161142 -- MSL 88 (19U 118)
+w 22932,12630 0 161143 -- MSL 89 (19U 119)
+x 14637,12630 0 161144 -- MSL 90 (19U 120)
+y 14637,12630,4680 0 161145 -- MSL 91 (19U 121)
+z 12684,12630 0 161146 -- MSL 92 (19U 122)
+{ 13173,20130,6075 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588 3 161148 -- MSL 94 (19U 124)
+ba "
+} 13173,20130,6075 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,9435 0 161150 -- MSL 96 (19U 126)
+`A 19515,23130 2 161216 -- MSL 99 (19U 192)
+^A 19515,23130 2 161218 -- MSL 100 (19U 194)
+`E 15126,23130 2 161224 -- MSL 101 (19U 200)
+^E 15126,23130 2 161226 -- MSL 102 (19U 202)
+:E 15126,23040 2 161227 -- MSL 103 (19U 203)
+^I 7317,23130 2 161230 -- MSL 104 (19U 206)
+:I 7317,23040 2 161231 -- MSL 105 (19U 207)
+aa 16587,18090 2 161204 -- MSL 106 (19U 180)
+ga 16587,18090 2 161120 -- MSL 107 (19U 96)
+a^ 16587,18090 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 16587,17910 2 161192 -- MSL 109 (19U 168)
+~ 16587,17946 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 19029,23130,360 2 161241 -- MSL 111 (19U 217)
+^U 19029,23130,360 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105 2 161199 -- MSL 113 (19U 175)
+'Y 18051,23130 2 161245 -- MSL 114 (19U 221)
+'y 14637,18090,4680 2 161277 -- MSL 115 (19U 253)
+de 16587,18465 2 161200 -- MSL 116 (19U 176)
+,C 18540,18495,5175 3 161223 -- MSL 117 (19U 199)
+,c 14148,12990,5160 1 161255 -- MSL 118 (19U 231)
+~N 19029,23130 2 161233 -- MSL 119 (19U 209)
+~n 15126,17946 2 161265 -- MSL 120 (19U 241)
+r! 8781,12645,5520 1 161185 -- MSL 121 (19U 161)
+r? 13662,12480,5835 1 161215 -- MSL 122 (19U 191)
+Cs 16587,15834 0 161188 -- MSL 123 (19U 164)
+Po 16587,18465 2 161187 -- MSL 124 (19U 163)
+Ye 16587,18105 2 161189 -- MSL 125 (19U 165)
+sc 16587,18495,360 2 161191 -- MSL 126 (19U 167)
+Fn 16587,18315 2 161155 -- MSL 127 (19U 131)
+ct 16587,18750,645 2 161186 -- MSL 128 (19U 162)
+^a 14148,18090,360 2 161250 -- MSL 129 (19U 226)
+^e 14148,18090,360 2 161258 -- MSL 130 (19U 234)
+^o 15126,18090,360 2 161268 -- MSL 131 (19U 244)
+^u 15126,18090,360 2 161275 -- MSL 132 (19U 251)
+'a 14148,18090,360 2 161249 -- MSL 133 (19U 225)
+'e 14148,18090,360 2 161257 -- MSL 134 (19U 233)
+'o 15126,18090,360 2 161267 -- MSL 135 (19U 243)
+'u 15126,18090,360 2 161274 -- MSL 136 (19U 250)
+`a 14148,18090,360 2 161248 -- MSL 137 (19U 224)
+`e 14148,18090,360 2 161256 -- MSL 138 (19U 232)
+`o 15126,18090,360 2 161266 -- MSL 139 (19U 242)
+`u 15126,18090,360 2 161273 -- MSL 140 (19U 249)
+:a 14148,17910,360 2 161252 -- MSL 141 (19U 228)
+:e 14148,17910,360 2 161259 -- MSL 142 (19U 235)
+:o 15126,17910,360 2 161270 -- MSL 143 (19U 246)
+:u 15126,17910,360 2 161276 -- MSL 144 (19U 252)
+oA 19515,25830 2 161221 -- MSL 145 (19U 197)
+^i 6342,18090 2 161262 -- MSL 146 (19U 238)
+/O 20004,18495,366 2 161240 -- MSL 147 (19U 216)
+AE 25857,18135 2 161222 -- MSL 148 (19U 198)
+oa 14148,20100,360 2 161253 -- MSL 149 (19U 229)
+'i 6342,18090 2 161261 -- MSL 150 (19U 237)
+/o 15126,13047,360 0 161272 -- MSL 151 (19U 248)
+ae 22443,12990,360 0 161254 -- MSL 152 (19U 230)
+:A 19515,23040 2 161220 -- MSL 153 (19U 196)
+`i 6342,18090 2 161260 -- MSL 154 (19U 236)
+:O 20004,23040,360 2 161238 -- MSL 155 (19U 214)
+:U 19029,23040,360 2 161244 -- MSL 156 (19U 220)
+'E 15126,23130 2 161225 -- MSL 157 (19U 201)
+:i 6342,17910 2 161263 -- MSL 158 (19U 239)
+ss 16101,17790,360 2 161247 -- MSL 159 (19U 223)
+^O 20004,23130,360 2 161236 -- MSL 160 (19U 212)
+'A 19515,23130 2 161217 -- MSL 161 (19U 193)
+~A 19515,23130 2 161219 -- MSL 162 (19U 195)
+~a 14148,17946,360 2 161251 -- MSL 163 (19U 227)
+-D 19029,18135 2 161232 -- MSL 164 (19U 208)
+Sd 15126,18747,360 2 161264 -- MSL 165 (19U 240)
+'I 7317,23130 2 161229 -- MSL 166 (19U 205)
+`I 7317,23130 2 161228 -- MSL 167 (19U 204)
+'O 20004,23130,360 2 161235 -- MSL 168 (19U 211)
+`O 20004,23130,360 2 161234 -- MSL 169 (19U 210)
+~O 20004,23130,360 2 161237 -- MSL 170 (19U 213)
+~o 15126,17946,360 2 161269 -- MSL 171 (19U 245)
+vS 17076,23130,360 2 161162 -- MSL 172 (19U 138)
+vs 13173,18090,360 2 161178 -- MSL 173 (19U 154)
+'U 19029,23130,360 2 161242 -- MSL 174 (19U 218)
+:Y 18051,23040 2 161183 -- MSL 175 (19U 159)
+:y 14637,17910,4680 2 161279 -- MSL 176 (19U 255)
+TP 15612,18135 2 161246 -- MSL 177 (19U 222)
+Tp 15126,18165,4680 2 161278 -- MSL 178 (19U 254)
+mc 15612,12630,4680 0 161205 -- MSL 180 (19U 181)
+ps 16590,19635,4200 2 161206 -- MSL 181 (19U 182)
+34 26346,18465,900 2 161214 -- MSL 182 (19U 190)
+\- 26346,8445 0 60096 -- MSL 183 ( 7J 192)
+14 26346,18465,900 2 161212 -- MSL 184 (19U 188)
+12 26346,18465,900 2 161213 -- MSL 185 (19U 189)
+Of 10734,18465 2 161194 -- MSL 186 (19U 170)
+Om 10734,18465 2 161210 -- MSL 187 (19U 186)
+Fo 14637,11250 0 161195 -- MSL 188 (19U 171)
+Fc 14637,11250 0 161211 -- MSL 190 (19U 187)
+t+- 26346,14670 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916 3 161190 -- MSL 192 (19U 166)
+co 13173,19635 2 161193 -- MSL 193 (19U 169)
+tno 26346,11787 0 161196 -- MSL 194 (19U 172)
+u00AD 8781,7875 0 161197 -- MSL 195 (19U 173)
+rg 13173,19635 2 161198 -- MSL 196 (19U 174)
+S2 10245,18465 2 161202 -- MSL 197 (19U 178)
+S3 10245,18465 2 161203 -- MSL 198 (19U 179)
+ac 16587,0,5160 1 161208 -- MSL 199 (19U 184)
+S1 10245,18345 2 161209 -- MSL 200 (19U 185)
+tmu 26346,14154 0 161239 -- MSL 201 (19U 215)
+tdi 26346,12870 0 161271 -- MSL 202 (19U 247)
+u203C 14637,18165 2 87315 -- MSL 221 (10U 19)
+u20A7 25371,18135,360 2 60121 -- MSL 232 ( 7J 217)
+pc 8781,10740 0 161207 -- MSL 302 (19U 183)
+u013F 14148,18135 2 51943 -- MSL 306 ( 6J 231)
+u0140 10329,18165 2 51959 -- MSL 307 ( 6J 247)
+u2113 16590,18045,765 2 60122 -- MSL 308 ( 7J 218)
+u0149 19029,18135 2 51951 -- MSL 309 ( 6J 239)
+fm 8781,18054 2 60101 -- MSL 310 ( 7J 197)
+sd 16587,18054 2 60102 -- MSL 311 ( 7J 198)
+dg 16587,18135 2 161158 -- MSL 312 (19U 134)
+tm 16128,17850 2 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588 1 60095 -- MSL 314 ( 7J 191)
+ah 16587,18090 2 75169 -- MSL 315 ( 9E 161)
+ao 16587,20100 2 60152 -- MSL 316 ( 7J 248)
+f/ 1464,18465,900 2 60109 -- MSL 324 ( 7J 205)
+em 26346,7650 0 161175 -- MSL 325 (19U 151)
+en 16587,7650 0 161174 -- MSL 326 (19U 150)
+dd 16587,18135 2 161159 -- MSL 327 (19U 135)
+.i 6342,12630 0 46333 -- MSL 328 ( 5T 253)
+aq 8781,18135 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226 0 161173 -- MSL 331 (19U 149)
+u207F 10248,18465 2 87548 -- MSL 332 (10U 252)
+u0111 15126,18165,360 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 19515,23130 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 14148,18147,360 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 19515,18135,4662 2 75173 -- MSL 404 ( 9E 165)
+u0061_0328 14148,12990,4299 0 75193 -- MSL 405 ( 9E 185)
+'C 18540,23130,360 2 75206 -- MSL 406 ( 9E 198)
+'c 14148,18090,360 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 18540,23130,360 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 14148,18090,360 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 19029,23130 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 19515,19650,360 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 15126,23130 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 14148,18090,360 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 15126,18135,4662 2 75210 -- MSL 422 ( 9E 202)
+u0065_0328 14148,12990,4299 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 14148,23130 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 6342,23145 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 14148,19650 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 10734,19650 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 19029,23130 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 15126,18090 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 19029,23130 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 15126,18090 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 20004,23130,360 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 15126,18090,360 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 17076,23130 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 9270,18090 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 17076,23130 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 9270,18090 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 17076,23130,360 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 13173,18090,360 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 16587,23130 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 12198,19650,360 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 16587,18135,5175 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 9759,16110,5160 1 75262 -- MSL 469 ( 9E 254)
+u0055_030B 19029,23130,360 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 15126,18090,360 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 19029,25080,360 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 15126,20100,360 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 16101,23130 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 12684,18090 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 16101,23280 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 12684,18405 2 75199 -- MSL 485 ( 9E 191)
+u2070 10245,18465 2 51753 -- MSL 1000 ( 6J 41)
+u2074 10245,18345 2 51748 -- MSL 1001 ( 6J 36)
+u2075 10245,18345 2 51749 -- MSL 1002 ( 6J 37)
+u2076 10245,18465 2 51806 -- MSL 1003 ( 6J 94)
+u2077 10245,18345 2 51750 -- MSL 1004 ( 6J 38)
+u2078 10245,18465 2 51754 -- MSL 1005 ( 6J 42)
+u2079 10245,18465 2 51752 -- MSL 1006 ( 6J 40)
+lq 13173,18135 2 161171 -- MSL 1017 (19U 147)
+rq 13173,18135 2 161172 -- MSL 1018 (19U 148)
+Bq 13173,3348,2292 0 161156 -- MSL 1019 (19U 132)
+u2003 26346,0 0 51821 -- MSL 1020 ( 6J 109)
+u2002 16587,0 0 51822 -- MSL 1021 ( 6J 110)
+u2009 8781,0 0 51828 -- MSL 1023 ( 6J 116)
+u2026 26346,3090 0 161157 -- MSL 1028 (19U 133)
+vz 12684,18090 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16128,18000 2 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056 2 51794 -- MSL 1036 ( 6J 82)
+fi 16101,18315 2 60077 -- MSL 1040 ( 7J 173)
+fl 16101,18315 2 60078 -- MSL 1041 ( 7J 174)
+ff 18051,18315 2 51883 -- MSL 1042 ( 6J 171)
+Fi 24396,18315 2 51884 -- MSL 1043 ( 6J 172)
+Fl 24396,18315 2 51885 -- MSL 1044 ( 6J 173)
+ij 12684,18165,4995 3 60134 -- MSL 1047 ( 7J 230)
+u2105 26358,18495,360 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 19515,23130,360 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 15126,18147,5313 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 17076,18495,5175 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 13173,12990,5160 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 7317,23280 2 46301 -- MSL 1065 ( 5T 221)
+bq 8781,3348,2307 0 161154 -- MSL 1067 (19U 130)
+%0 26346,18720,840 2 161161 -- MSL 1068 (19U 137)
+a- 16587,16950 2 60154 -- MSL 1084 ( 7J 250)
+ab 16587,18147 2 75170 -- MSL 1086 ( 9E 162)
+a. 16587,18405 2 75263 -- MSL 1088 ( 9E 255)
+oe 23907,12990,360 0 161180 -- MSL 1090 (19U 156)
+OE 26346,18270,135 2 161164 -- MSL 1091 (19U 140)
+fo 9759,11277 0 161163 -- MSL 1092 (19U 139)
+fc 9759,11277 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624 0 60091 -- MSL 1094 ( 7J 187)
+/L 14148,18135 2 75171 -- MSL 1095 ( 9E 163)
+/l 7320,18165 2 75187 -- MSL 1096 ( 9E 179)
+a" 16587,18090 2 75197 -- MSL 1097 ( 9E 189)
+ho 16587,1197,4299 0 75186 -- MSL 1098 ( 9E 178)
+vZ 16101,23130 2 75150 -- MSL 1106 ( 9E 142)
+IJ 21954,18135,360 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/UBI b/font/devlj4/UBI
new file mode 100644
index 0000000..53f5ee0
--- /dev/null
+++ b/font/devlj4/UBI
@@ -0,0 +1,748 @@
+# Univers BdIt
+name UBI
+spacewidth 8781
+slant 16.750000
+pcltypeface 4148
+pclproportional 1
+pclweight 3
+pclstyle 1
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -2924
+P . -4388
+P , -4388
+V A -2438
+A V -2924
+T o -3902
+T r -2924
+T c -3413
+T e -3413
+T d -3413
+T s -2924
+T y -3413
+T a -3413
+T w -3413
+T u -2924
+T J -2924
+L T -3413
+L Y -3902
+Y o -3413
+Y e -3413
+Y a -3413
+Y J -2924
+A W -2924
+W A -974
+T A -2924
+V o -1949
+V e -1949
+V a -1949
+Y A -2924
+F A -1949
+F . -1949
+F , -1949
+A T -3413
+A Y -3413
+v . -1949
+v , -1949
+y . -1460
+y , -1460
+T . -2924
+T , -2924
+L W -2924
+P A -1949
+V J -1949
+V . -2438
+V , -2438
+Y . -2924
+Y , -2924
+W o -1460
+W e -974
+W a -974
+W . -974
+W , -974
+r . -1460
+r , -1460
+w . -1460
+w , -1460
+Y u -2438
+A v -1460
+A y -1460
+A w -1460
+o . -974
+o , -974
+p . -974
+p , -974
+e . -974
+e , -974
+b . -974
+b , -974
+O T -2924
+O V -1949
+O Y -1949
+O . -1949
+O , -1949
+L y -1460
+L O -2924
+L G -2924
+L C -2924
+L Q -2924
+P J -1460
+V y -1460
+V u -974
+V O -974
+V G -974
+V C -974
+V Q -974
+D T -2924
+D V -1949
+D Y -1949
+D . -2438
+D , -2438
+Y O -1949
+Y G -1949
+Y C -1949
+Y Q -1949
+F o -974
+F e -974
+F a -974
+c . -974
+c , -974
+O A -974
+O W -1460
+L U -2438
+R T -974
+R V -974
+R Y -974
+R W -974
+G T -2438
+P o -974
+P g -485
+P e -974
+P a -974
+C A -974
+C . -1460
+C , -1460
+D A -1460
+D W -1460
+B T -2438
+B Y -1949
+B . -485
+B , -485
+F J -974
+A O -1949
+A G -1949
+A C -1949
+A U -1949
+A Q -1949
+W r -485
+W y -974
+W u -485
+W O -485
+W G -485
+W C -485
+W J -974
+W Q -485
+U A -974
+U . -1949
+U , -1949
+Q W -1460
+T O -1949
+T G -1949
+T C -1949
+T Q -1949
+O X -1460
+L o -1460
+L e -1460
+L q -1460
+G V -1949
+G Y -1949
+G W -1460
+P T -1949
+P V -1949
+P Y -1949
+C T -1949
+C V -1949
+C Y -1949
+D X -1460
+B V -1949
+B X -485
+B A -485
+B W -1460
+S . -974
+S , -974
+F y -485
+X o -1460
+X e -1460
+X y -1460
+X O -1460
+X G -1460
+X C -1460
+X Q -1460
+A o -1460
+A e -1460
+K o -1460
+K e -1460
+K y -1460
+K w -1460
+K O -1460
+K G -1460
+K C -1460
+K Q -1460
+o v -974
+o y -1460
+o x -974
+o w -1460
+h v -485
+h y -974
+n v -485
+n y -974
+m v -485
+m y -974
+p v -485
+p y -974
+p x -974
+c v -485
+c y -974
+c w -974
+v o -974
+v g -485
+v c -485
+v d -485
+v a -485
+v q -485
+e v -485
+e y -974
+b v -974
+b y -1460
+b w -1460
+y o -974
+y g -485
+y c -974
+y d -974
+y a -974
+y q -974
+x o -974
+x c -974
+x e -974
+x d -974
+x a -974
+x q -974
+a v -485
+a y -974
+a w -974
+w o -974
+w g -485
+w c -485
+w d -485
+w a -485
+w q -485
+T S -974
+L a -974
+L S -1460
+R o -485
+R y -485
+P Z -1460
+P X -1460
+P W -1460
+C X -1460
+C W -1460
+V S -974
+S T -1460
+S V -1460
+S Y -1460
+S X -974
+S A -974
+S W -1460
+Y S -974
+X a -974
+X u -974
+X S -974
+A t -1460
+A c -1460
+A d -974
+A a -974
+A u -974
+A q -1460
+A S -1460
+W S -485
+J y -485
+K c -1460
+K u -974
+K S -974
+o f -485
+h w -974
+n w -974
+m w -974
+r o -485
+p w -974
+c x -974
+v e -485
+e x -974
+e w -974
+b f -485
+s v -485
+s y -974
+s w -974
+y e -974
+f o -485
+w e -485
+k o -974
+k c -485
+k v -485
+k e -485
+k d -485
+k y -485
+k a -485
+k w -485
+k q -485
+O Z -485
+P y -485
+C Z -485
+E o -485
+E v -485
+E y -485
+E w -485
+Z o -974
+Z e -974
+Z d -974
+Z y -485
+Z a -974
+Z w -485
+D Z -974
+D J -485
+B Z -485
+S Z -485
+A s -485
+J o -485
+K a -974
+t o -485
+o t -485
+o g -485
+o z -485
+o j -485
+g o -485
+v y -485
+v w -485
+z o -485
+b t -485
+b g -485
+b z -485
+b j -485
+y v -485
+y y -485
+y w -485
+x v -485
+x y -485
+x w -485
+w v -485
+w y -485
+w w -485
+C o -485
+C y -485
+B o -485
+B y -485
+U o -485
+U v -485
+U y -485
+U w -485
+L cq -6341
+L ' -6341
+T hy -2924
+T - -2924
+T en -2924
+T em -2924
+A cq -2438
+A ' -2438
+hy T -3413
+- T -3413
+en T -3413
+em T -3413
+Y hy -2438
+Y - -2438
+Y en -2438
+Y em -2438
+p cq -974
+p ' -974
+c cq -1460
+c ' -1460
+e cq -1460
+e ' -1460
+b cq -1460
+b ' -1460
+a cq -1460
+a ' -1460
+V hy -974
+V - -974
+V en -974
+V em -974
+h cq -1460
+h ' -1460
+n cq -974
+n ' -974
+m cq -974
+m ' -974
+W hy -485
+W - -485
+W en -485
+W em -485
+cq d -2438
+' d -2438
+s cq -485
+s ' -485
+L hy -1949
+L - -1949
+L en -1949
+L em -1949
+X hy -1460
+X - -1460
+X en -1460
+X em -1460
+A hy -1949
+A - -1949
+A en -1949
+A em -1949
+K hy -1460
+K - -1460
+K en -1460
+K em -1460
+cq s -1460
+' s -1460
+hy X -1460
+- X -1460
+hy A -974
+- A -974
+en X -1460
+en A -974
+em X -1460
+b f -485
+cq n -1460
+' n -1460
+cq m -1460
+' m -1460
+cq r -1460
+' r -1460
+cq v -1949
+' v -1949
+charset
+! 8781,18165,0,2643,33,1012 2 161057 -- MSL 1 (19U 33)
+dq 14148,18135,0,1890,-3296,1012 2 161058 -- MSL 2 (19U 34)
+" "
+sh 16587,18105,0,1677,-98,1012 2 161059 -- MSL 3 (19U 35)
+# "
+Do 16587,18738,630,495,-1427,495 2 161060 -- MSL 4 (19U 36)
+$ "
+% 26346,18720,840,0,-2069 2 161061 -- MSL 5 (19U 37)
+& 20004,18495,360,54,-230,54 2 161062 -- MSL 6 (19U 38)
+cq 8781,18135,0,3414,-2600,1012 2 161170 -- MSL 8 (19U 146)
+' "
+( 8781,18135,2445,3198,-833,1012 2 161064 -- MSL 9 (19U 40)
+) 8781,18135,2445,180,2184,180 2 161065 -- MSL 10 (19U 41)
+* 16587,18582,0,0,-3290 2 161066 -- MSL 11 (19U 42)
++ 26346,14940,0,0,-4727 0 161067 -- MSL 12 (19U 43)
+, 8781,3255,2580,0,1794 0 161068 -- MSL 13 (19U 44)
+hy 8781,7737,0,624,270,624 0 161069 -- MSL 14 (19U 45)
+- "
+. 8781,3255,0,0,453 0 161070 -- MSL 15 (19U 46)
+sl 8781,18135,1470,4308,2982,1012 2 161071 -- MSL 16 (19U 47)
+/ "
+0 16587,18465,360,1398,-356,1012 2 161072 -- MSL 17 (19U 48)
+1 16587,18105,0,0,-3770 2 161073 -- MSL 18 (19U 49)
+2 16587,18465,0,984,414,984 2 161074 -- MSL 19 (19U 50)
+3 16587,18465,360,1794,363,1012 2 161075 -- MSL 20 (19U 51)
+4 16587,18105,0,1389,1245,1012 2 161076 -- MSL 21 (19U 52)
+5 16587,18105,360,2424,-38,1012 2 161077 -- MSL 22 (19U 53)
+6 16587,18465,360,2316,-344,1012 2 161078 -- MSL 23 (19U 54)
+7 16587,18105,0,1770,-1454,1012 2 161079 -- MSL 24 (19U 55)
+8 16587,18465,360,1776,435,1012 2 161080 -- MSL 25 (19U 56)
+9 16587,18465,360,1464,369,1012 2 161081 -- MSL 26 (19U 57)
+: 8781,12612,0,540,453,540 0 161082 -- MSL 27 (19U 58)
+; 8781,12612,2580,732,1794,732 0 161083 -- MSL 28 (19U 59)
+< 26346,16068,0,0,-3980 0 161084 -- MSL 29 (19U 60)
+= 26346,10563,0,0,-5078 0 161085 -- MSL 30 (19U 61)
+> 26346,16068,0,0,-3980 0 161086 -- MSL 31 (19U 62)
+? 13662,18315,0,1908,-950,1012 2 161087 -- MSL 32 (19U 63)
+at 26346,21057,2679,1164,-887,1012 2 161088 -- MSL 33 (19U 64)
+@ "
+A 19515,18135,0,0,2535 2 161089 -- MSL 34 (19U 65)
+B 16587,18135,0,1848,1233,1012 2 161090 -- MSL 35 (19U 66)
+C 18540,18495,360,1737,-632,1012 2 161091 -- MSL 36 (19U 67)
+D 19029,18135,0,924,1227,924 2 161092 -- MSL 37 (19U 68)
+E 15126,18135,0,3285,1188,1012 2 161093 -- MSL 38 (19U 69)
+F 14637,18135,0,3723,1200,1012 2 161094 -- MSL 39 (19U 70)
+G 19515,18495,360,1380,-785,1012 2 161095 -- MSL 40 (19U 71)
+H 19029,18135,0,2856,1161,1012 2 161096 -- MSL 41 (19U 72)
+I 7317,18135,0,3219,1521,1012 2 161097 -- MSL 42 (19U 73)
+J 14637,18135,360,3054,1341,1012 2 161098 -- MSL 43 (19U 74)
+K 17565,18135,0,3273,534,1012 2 161099 -- MSL 44 (19U 75)
+L 14148,18135,0,0,1185 2 161100 -- MSL 45 (19U 76)
+M 23907,18135,0,2730,1281,1012 2 161101 -- MSL 46 (19U 77)
+N 19029,18135,0,2883,1248,1012 2 161102 -- MSL 47 (19U 78)
+O 20004,18495,360,969,-704,969 2 161103 -- MSL 48 (19U 79)
+P 15612,18135,0,2871,1203,1012 2 161104 -- MSL 49 (19U 80)
+Q 20490,18495,360,531,-713,531 2 161105 -- MSL 50 (19U 81)
+R 17076,18135,0,2247,1200,1012 2 161106 -- MSL 51 (19U 82)
+S 17076,18495,360,1797,117,1012 2 161107 -- MSL 52 (19U 83)
+T 16587,18135,0,3990,-2165,1012 2 161108 -- MSL 53 (19U 84)
+U 19029,18135,360,2898,-383,1012 2 161109 -- MSL 54 (19U 85)
+V 19029,18135,0,4005,-2603,1012 2 161110 -- MSL 55 (19U 86)
+W 26346,18135,0,3900,-2477,1012 2 161111 -- MSL 56 (19U 87)
+X 19029,18135,0,3222,1893,1012 2 161112 -- MSL 57 (19U 88)
+Y 18051,18135,0,3942,-2615,1012 2 161113 -- MSL 58 (19U 89)
+Z 16101,18135,0,3348,1491,1012 2 161114 -- MSL 59 (19U 90)
+lB 8781,18135,2445,4068,1977,1012 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 8781,18135,1470,540,-1631,540 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 8781,18135,2445,2919,3126,1012 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758,0,36,36,36 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588,1317,1317,1012 1 161119 -- MSL 64 (19U 95)
+oq 8781,18135,0,2880,-2066,1012 2 161169 -- MSL 66 (19U 145)
+` "
+a 14148,12990,360,651,978,651 0 161121 -- MSL 67 (19U 97)
+b 15126,18165,360,498,1566,498 2 161122 -- MSL 68 (19U 98)
+c 14148,12990,360,903,411,903 0 161123 -- MSL 69 (19U 99)
+d 15126,18165,360,3291,477,1012 2 161124 -- MSL 70 (19U 100)
+e 14148,12990,360,924,600,924 0 161125 -- MSL 71 (19U 101)
+f 9759,18315,0,4158,297,1012 2 161126 -- MSL 72 (19U 102)
+g 15126,12990,5187,1683,2037,1012 1 161127 -- MSL 73 (19U 103)
+h 15126,18165,0,684,1527,684 2 161128 -- MSL 74 (19U 104)
+i 6342,18165,0,3591,1872,1012 2 161129 -- MSL 75 (19U 105)
+j 6342,18165,4995,3681,5787,1012 3 161130 -- MSL 76 (19U 106)
+k 14148,18165,0,2109,1359,1012 2 161131 -- MSL 77 (19U 107)
+l 6342,18165,0,3579,1839,1012 2 161132 -- MSL 78 (19U 108)
+m 22932,12990,0,609,1551,609 0 161133 -- MSL 79 (19U 109)
+n 15126,12990,0,729,1482,729 0 161134 -- MSL 80 (19U 110)
+o 15126,12990,360,492,465,492 0 161135 -- MSL 81 (19U 111)
+p 15126,12990,4680,531,2868,531 1 161136 -- MSL 82 (19U 112)
+q 15126,12990,4680,1671,471,1012 1 161137 -- MSL 83 (19U 113)
+r 9270,12990,0,2751,1533,1012 0 161138 -- MSL 84 (19U 114)
+s 13173,12990,360,984,1026,984 0 161139 -- MSL 85 (19U 115)
+t 9759,16146,360,2166,-521,1012 0 161140 -- MSL 86 (19U 116)
+u 15126,12630,360,1557,666,1012 0 161141 -- MSL 87 (19U 117)
+v 14637,12630,0,2502,-836,1012 0 161142 -- MSL 88 (19U 118)
+w 22932,12630,0,2004,-1310,1012 0 161143 -- MSL 89 (19U 119)
+x 14637,12630,0,2088,2364,1012 0 161144 -- MSL 90 (19U 120)
+y 14637,12630,4680,2472,-527,1012 1 161145 -- MSL 91 (19U 121)
+z 12684,12630,0,1701,1482,1012 0 161146 -- MSL 92 (19U 122)
+{ 13173,20130,6075,3600,-1355,1012 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588,0,-4595 3 161148 -- MSL 94 (19U 124)
+ba "
+} 13173,20130,6075,0,3360 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,9435,0,0,-4028 0 161150 -- MSL 96 (19U 126)
+`A 19515,23220,0,0,2535 2 161216 -- MSL 99 (19U 192)
+^A 19515,23220,0,0,2535 2 161218 -- MSL 100 (19U 194)
+`E 15126,23220,0,3285,1188,1012 2 161224 -- MSL 101 (19U 200)
+^E 15126,23220,0,3285,1188,1012 2 161226 -- MSL 102 (19U 202)
+:E 15126,22830,0,3285,1188,1012 2 161227 -- MSL 103 (19U 203)
+^I 7317,23220,0,5631,1521,1012 2 161230 -- MSL 104 (19U 206)
+:I 7317,22830,0,6792,1521,1012 2 161231 -- MSL 105 (19U 207)
+aa 16587,18105,0,360,-7358,360 2 161204 -- MSL 106 (19U 180)
+ga 16587,18105,0,0,-6008 2 161120 -- MSL 107 (19U 96)
+a^ 16587,18105,0,0,-4517 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 16587,18180,0,693,-5456,693 2 161192 -- MSL 109 (19U 168)
+~ 16587,17994,0,771,-5168,771 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 19029,23220,360,2898,-383,1012 2 161241 -- MSL 111 (19U 217)
+^U 19029,23220,360,2898,-383,1012 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105,0,1317,1317,1012 2 161199 -- MSL 113 (19U 175)
+'Y 18051,23220,0,3942,-2615,1012 2 161245 -- MSL 114 (19U 221)
+'y 14637,18105,4680,2472,-527,1012 3 161277 -- MSL 115 (19U 253)
+de 16587,18465,0,0,-3641 2 161200 -- MSL 116 (19U 176)
+,C 18540,18495,5409,1737,-632,1012 3 161223 -- MSL 117 (19U 199)
+,c 14148,12990,5046,903,411,903 1 161255 -- MSL 118 (19U 231)
+~N 19029,23124,0,2883,1248,1012 2 161233 -- MSL 119 (19U 209)
+~n 15126,17994,0,1503,1482,1012 2 161265 -- MSL 120 (19U 241)
+r! 8781,12651,5514,432,2244,432 1 161185 -- MSL 121 (19U 161)
+r? 13662,12486,5829,0,1398 1 161215 -- MSL 122 (19U 191)
+Cs 16587,15834,0,753,-773,753 0 161188 -- MSL 123 (19U 164)
+Po 16587,18465,0,2046,663,1012 2 161187 -- MSL 124 (19U 163)
+Ye 16587,18105,0,4872,-29,1012 2 161189 -- MSL 125 (19U 165)
+sc 16587,18495,360,0,-2660 2 161191 -- MSL 126 (19U 167)
+Fn 16587,18315,0,1008,-3098,1008 2 161155 -- MSL 127 (19U 131)
+ct 16587,18750,630,678,-1457,678 2 161186 -- MSL 128 (19U 162)
+^a 14148,18105,360,651,978,651 2 161250 -- MSL 129 (19U 226)
+^e 14148,18105,360,924,600,924 2 161258 -- MSL 130 (19U 234)
+^o 15126,18105,360,492,465,492 2 161268 -- MSL 131 (19U 244)
+^u 15126,18105,360,1557,666,1012 2 161275 -- MSL 132 (19U 251)
+'a 14148,18105,360,1581,978,1012 2 161249 -- MSL 133 (19U 225)
+'e 14148,18105,360,1581,600,1012 2 161257 -- MSL 134 (19U 233)
+'o 15126,18105,360,1092,465,1012 2 161267 -- MSL 135 (19U 243)
+'u 15126,18105,360,1557,666,1012 2 161274 -- MSL 136 (19U 250)
+`a 14148,18105,360,651,978,651 2 161248 -- MSL 137 (19U 224)
+`e 14148,18105,360,924,600,924 2 161256 -- MSL 138 (19U 232)
+`o 15126,18105,360,492,465,492 2 161266 -- MSL 139 (19U 242)
+`u 15126,18105,360,1557,666,1012 2 161273 -- MSL 140 (19U 249)
+:a 14148,18180,360,1914,978,1012 2 161252 -- MSL 141 (19U 228)
+:e 14148,18180,360,1914,600,1012 2 161259 -- MSL 142 (19U 235)
+:o 15126,18180,360,1425,465,1012 2 161270 -- MSL 143 (19U 246)
+:u 15126,18180,360,1557,666,1012 2 161276 -- MSL 144 (19U 252)
+oA 19515,25830,0,0,2535 2 161221 -- MSL 145 (19U 197)
+^i 6342,18105,0,4479,1860,1012 2 161262 -- MSL 146 (19U 238)
+/O 20004,18495,360,2802,1200,1012 2 161240 -- MSL 147 (19U 216)
+AE 25857,18135,0,3294,2781,1012 2 161222 -- MSL 148 (19U 198)
+oa 14148,20100,360,651,978,651 2 161253 -- MSL 149 (19U 229)
+'i 6342,18105,0,5484,1860,1012 2 161261 -- MSL 150 (19U 237)
+/o 15126,12990,360,1764,1686,1012 0 161272 -- MSL 151 (19U 248)
+ae 22443,12990,360,840,906,840 0 161254 -- MSL 152 (19U 230)
+:A 19515,22830,0,693,2535,693 2 161220 -- MSL 153 (19U 196)
+`i 6342,18105,0,2136,1860,1012 2 161260 -- MSL 154 (19U 236)
+:O 20004,22830,360,969,-704,969 2 161238 -- MSL 155 (19U 214)
+:U 19029,22830,360,2898,-383,1012 2 161244 -- MSL 156 (19U 220)
+'E 15126,23220,0,3285,1188,1012 2 161225 -- MSL 157 (19U 201)
+:i 6342,18180,0,5817,1860,1012 2 161263 -- MSL 158 (19U 239)
+ss 16101,18315,360,795,1515,795 2 161247 -- MSL 159 (19U 223)
+^O 20004,23220,360,969,-704,969 2 161236 -- MSL 160 (19U 212)
+'A 19515,23220,0,0,2535 2 161217 -- MSL 161 (19U 193)
+~A 19515,23124,0,1020,2535,1012 2 161219 -- MSL 162 (19U 195)
+~a 14148,17994,360,1992,978,1012 2 161251 -- MSL 163 (19U 227)
+-D 19029,18135,0,924,1227,924 2 161232 -- MSL 164 (19U 208)
+Sd 15126,18693,360,492,465,492 2 161264 -- MSL 165 (19U 240)
+'I 7317,23220,0,5907,1521,1012 2 161229 -- MSL 166 (19U 205)
+`I 7317,23220,0,3219,1521,1012 2 161228 -- MSL 167 (19U 204)
+'O 20004,23220,360,969,-704,969 2 161235 -- MSL 168 (19U 211)
+`O 20004,23220,360,969,-704,969 2 161234 -- MSL 169 (19U 210)
+~O 20004,23124,360,969,-704,969 2 161237 -- MSL 170 (19U 213)
+~o 15126,17994,360,1503,465,1012 2 161269 -- MSL 171 (19U 245)
+vS 17076,23220,360,2220,117,1012 2 161162 -- MSL 172 (19U 138)
+vs 13173,18105,360,2985,1026,1012 2 161178 -- MSL 173 (19U 154)
+'U 19029,23220,360,2898,-383,1012 2 161242 -- MSL 174 (19U 218)
+:Y 18051,22830,0,3942,-2615,1012 2 161183 -- MSL 175 (19U 159)
+:y 14637,18180,4680,2472,-527,1012 3 161279 -- MSL 176 (19U 255)
+TP 15612,18135,0,1857,1209,1012 2 161246 -- MSL 177 (19U 222)
+Tp 15126,18165,4680,516,2856,516 3 161278 -- MSL 178 (19U 254)
+mc 15612,12630,4680,1422,2907,1012 1 161205 -- MSL 180 (19U 181)
+ps 16590,19635,4200,0,-2528 2 161206 -- MSL 181 (19U 182)
+34 26346,18465,990,0,-2624 2 161214 -- MSL 182 (19U 190)
+\- 26346,8445,0,0,-4745 0 60096 -- MSL 183 ( 7J 192)
+14 26346,18465,990,0,-2681 2 161212 -- MSL 184 (19U 188)
+12 26346,18465,990,0,-3167 2 161213 -- MSL 185 (19U 189)
+Of 10734,18465,0,2211,-1463,1012 2 161194 -- MSL 186 (19U 170)
+Om 10734,18465,0,2520,-1472,1012 2 161210 -- MSL 187 (19U 186)
+Fo 14637,11115,0,1530,180,1012 0 161195 -- MSL 188 (19U 171)
+Fc 14637,11115,0,243,1467,243 0 161211 -- MSL 190 (19U 187)
+t+- 26346,14670,0,0,-4694 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916,0,-4595 3 161190 -- MSL 192 (19U 166)
+co 13173,19635,0,4881,-3089,1012 2 161193 -- MSL 193 (19U 169)
+tno 26346,11787,0,0,-4328 0 161196 -- MSL 194 (19U 172)
+u00AD 8781,7737,0,624,270,624 0 161197 -- MSL 195 (19U 173)
+rg 13173,19635,0,4881,-3089,1012 2 161198 -- MSL 196 (19U 174)
+S2 10245,18465,0,2217,-932,1012 2 161202 -- MSL 197 (19U 178)
+S3 10245,18465,0,2439,-956,1012 2 161203 -- MSL 198 (19U 179)
+ac 16587,0,5046,0,-1808 1 161208 -- MSL 199 (19U 184)
+S1 10245,18345,0,1083,-2879,1012 2 161209 -- MSL 200 (19U 185)
+tmu 26346,14154,0,0,-5957 0 161239 -- MSL 201 (19U 215)
+tdi 26346,12870,0,0,-4766 0 161271 -- MSL 202 (19U 247)
+u203C 15912,18165,0,2643,33,1012 2 87315 -- MSL 221 (10U 19)
+u20A7 25857,18135,360,2166,1203,1012 2 60121 -- MSL 232 ( 7J 217)
+pc 8781,10692,0,276,-2054,276 0 161207 -- MSL 302 (19U 183)
+u013F 14148,18135,0,1644,1185,1012 2 51943 -- MSL 306 ( 6J 231)
+u0140 11070,18165,0,2091,1839,1012 2 51959 -- MSL 307 ( 6J 247)
+u2113 16590,18045,765,0,-2804 2 60122 -- MSL 308 ( 7J 218)
+u0149 20493,18135,0,729,-1823,729 2 51951 -- MSL 309 ( 6J 239)
+fm 8781,18105,0,2145,-2915,1012 2 60101 -- MSL 310 ( 7J 197)
+sd 16587,18105,0,0,-2915 2 60102 -- MSL 311 ( 7J 198)
+dg 16587,18135,0,0,-2717 2 161158 -- MSL 312 (19U 134)
+tm 16101,17850,0,2421,-2957,1012 2 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588,1317,1317,1012 1 60095 -- MSL 314 ( 7J 191)
+ah 16587,18105,0,1278,-6440,1012 2 75169 -- MSL 315 ( 9E 161)
+ao 16587,20100,0,0,-7412 2 60152 -- MSL 316 ( 7J 248)
+f/ 2439,18465,990,9276,7884,1012 2 60109 -- MSL 324 ( 7J 205)
+em 26346,7620,0,0,-2225 0 161175 -- MSL 325 (19U 151)
+en 16587,7620,0,72,-371,72 0 161174 -- MSL 326 (19U 150)
+dd 16587,18135,0,0,-2717 2 161159 -- MSL 327 (19U 135)
+.i 6342,12630,0,1857,1860,1012 0 46333 -- MSL 328 ( 5T 253)
+aq 8781,18135,0,2100,-3296,1012 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226,0,0,-497 0 161173 -- MSL 331 (19U 149)
+u207F 10248,18465,0,3501,39,1012 2 87548 -- MSL 332 (10U 252)
+u0111 15126,18165,360,4062,474,1012 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 19515,23397,0,672,2535,672 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 14148,18147,360,1842,978,1012 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 19515,18135,4686,0,2535 3 75173 -- MSL 404 ( 9E 165)
+u0061_0328 14148,12990,4248,651,978,651 0 75193 -- MSL 405 ( 9E 185)
+'C 18540,23220,360,1737,-632,1012 2 75206 -- MSL 406 ( 9E 198)
+'c 14148,18105,360,1581,411,1012 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 18540,23220,360,1737,-632,1012 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 14148,18105,360,2823,411,1012 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 19029,23220,0,924,1227,924 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 19515,19650,360,5760,477,1012 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 15126,23220,0,3285,1188,1012 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 14148,18105,360,2499,600,1012 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 15126,18135,4686,3285,1188,1012 3 75210 -- MSL 422 ( 9E 202)
+u0065_0328 14148,12990,4248,924,600,924 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 14148,23220,0,243,1185,243 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 6342,23160,0,7134,1839,1012 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 14148,19650,0,3507,1185,1012 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 10734,19650,0,6051,1839,1012 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 19029,23220,0,2883,1248,1012 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 15126,18105,0,1092,1482,1012 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 19029,23220,0,2883,1248,1012 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 15126,18105,0,1848,1482,1012 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 20004,23220,360,2433,-704,1012 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 15126,18105,360,3918,465,1012 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 17076,23220,0,2247,1200,1012 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 9270,18105,0,4020,1533,1012 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 17076,23220,0,2247,1200,1012 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 9270,18105,0,4938,1533,1012 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 17076,23220,360,1797,117,1012 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 13173,18105,360,2067,1026,1012 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 16587,23220,0,3990,-2165,1012 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 12198,19650,360,5877,-521,1012 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 16587,18135,5409,3990,-1289,1012 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 9759,16146,5046,2166,1605,1012 1 75262 -- MSL 469 ( 9E 254)
+u0055_030B 19029,23220,360,3240,-383,1012 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 15126,18105,360,3918,666,1012 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 19029,25080,360,2898,-383,1012 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 15126,20100,360,1557,666,1012 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 16101,23220,0,3348,1491,1012 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 12684,18105,0,2313,1482,1012 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 16101,23157,0,3348,1491,1012 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 12684,18222,0,1701,1482,1012 2 75199 -- MSL 485 ( 9E 191)
+u2070 10245,18465,0,2238,-1328,1012 2 51753 -- MSL 1000 ( 6J 41)
+u2074 10245,18345,0,2259,-785,1012 2 51748 -- MSL 1001 ( 6J 36)
+u2075 10245,18345,0,2859,-1298,1012 2 51749 -- MSL 1002 ( 6J 37)
+u2076 10245,18465,0,2739,-1358,1012 2 51806 -- MSL 1003 ( 6J 94)
+u2077 10245,18345,0,2625,-2168,1012 2 51750 -- MSL 1004 ( 6J 38)
+u2078 10245,18465,0,2544,-1085,1012 2 51754 -- MSL 1005 ( 6J 42)
+u2079 10245,18465,0,2424,-1079,1012 2 51752 -- MSL 1006 ( 6J 40)
+lq 13173,18135,0,3480,-1523,1012 2 161171 -- MSL 1017 (19U 147)
+rq 13173,18135,0,4002,-2045,1012 2 161172 -- MSL 1018 (19U 148)
+Bq 13173,3234,2241,0,2283 0 161156 -- MSL 1019 (19U 132)
+u2003 26346,0,0,0,1317 0 51821 -- MSL 1020 ( 6J 109)
+u2002 16587,0,0,0,1317 0 51822 -- MSL 1021 ( 6J 110)
+u2009 8781,0,0,0,1317 0 51828 -- MSL 1023 ( 6J 116)
+u2026 26346,3255,0,0,-488 0 161157 -- MSL 1028 (19U 133)
+vz 12684,18105,0,3231,1482,1012 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,18000,0,3609,-2975,1012 2 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056,462,-1163,462 2 51794 -- MSL 1036 ( 6J 82)
+fi 16101,18315,0,3693,-32,1012 2 60077 -- MSL 1040 ( 7J 173)
+fl 16101,18315,0,3678,-131,1012 2 60078 -- MSL 1041 ( 7J 174)
+ff 18051,18315,0,4557,-113,1012 2 51883 -- MSL 1042 ( 6J 171)
+Fi 24396,18315,0,3795,-125,1012 2 51884 -- MSL 1043 ( 6J 172)
+Fl 24396,18315,0,3666,-41,1012 2 51885 -- MSL 1044 ( 6J 173)
+ij 12684,18165,4995,3681,1872,1012 3 60134 -- MSL 1047 ( 7J 230)
+u2105 26346,18495,360,204,-1595,204 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 19515,23397,360,1380,-785,1012 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 15126,18147,5187,1683,2037,1012 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 17076,18495,5409,1797,117,1012 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 13173,12990,5046,984,1026,984 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 7317,23157,0,4410,1521,1012 2 46301 -- MSL 1065 ( 5T 221)
+bq 8781,3234,2241,0,1878 0 161154 -- MSL 1067 (19U 130)
+%0 26346,18720,840,696,51,696 2 161161 -- MSL 1068 (19U 137)
+a- 16587,17778,0,102,-5930,102 2 60154 -- MSL 1084 ( 7J 250)
+ab 16587,18147,0,771,-5873,771 2 75170 -- MSL 1086 ( 9E 162)
+a. 16587,18222,0,0,-7886 2 75263 -- MSL 1088 ( 9E 255)
+oe 23907,12990,360,525,258,525 0 161180 -- MSL 1090 (19U 156)
+OE 26346,18270,135,3186,-818,1012 2 161164 -- MSL 1091 (19U 140)
+fo 9759,11142,0,1299,-1028,1012 0 161163 -- MSL 1092 (19U 139)
+fc 9759,11142,0,27,243,27 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624,0,0,-2021 0 60091 -- MSL 1094 ( 7J 187)
+/L 14148,18135,0,0,1692 2 75171 -- MSL 1095 ( 9E 163)
+/l 7320,18165,0,3519,1320,1012 2 75187 -- MSL 1096 ( 9E 179)
+a" 16587,18105,0,3672,-5375,1012 2 75197 -- MSL 1097 ( 9E 189)
+ho 16587,279,4248,0,-6179 0 75186 -- MSL 1098 ( 9E 178)
+vZ 16101,23220,0,3348,1491,1012 2 75150 -- MSL 1106 ( 9E 142)
+IJ 21954,18135,360,3054,1521,1012 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/UCB b/font/devlj4/UCB
new file mode 100644
index 0000000..d2c3c4e
--- /dev/null
+++ b/font/devlj4/UCB
@@ -0,0 +1,758 @@
+# Univers BdCd
+name UCB
+spacewidth 5856
+pcltypeface 4148
+pclproportional 1
+pclweight 3
+pclstyle 4
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -2924
+P . -4388
+P , -4388
+V A -1949
+A V -1949
+T o -2924
+T r -2924
+T c -2924
+T e -2924
+T d -2924
+T s -2924
+T y -2924
+T a -2924
+T w -2924
+T u -2924
+T J -3413
+L T -2924
+L Y -2924
+Y o -2924
+Y e -2924
+Y a -2438
+Y J -3413
+A W -1460
+W A -1460
+T A -2438
+V o -1460
+V e -1460
+V a -1460
+Y A -2438
+F A -1460
+F . -2924
+F , -2924
+A T -2438
+A Y -2438
+v . -1460
+v , -1460
+y . -1460
+y , -1460
+T . -2924
+T , -2924
+L W -1460
+P A -1460
+V J -1949
+V . -2924
+V , -2924
+Y . -2924
+Y , -2924
+W o -974
+W e -974
+W a -974
+W . -1460
+W , -1460
+r . -1460
+r , -1460
+w . -974
+w , -974
+Y u -1460
+A v -1460
+A y -974
+A w -974
+o . -1460
+o , -1460
+p . -974
+p , -974
+e . -974
+e , -974
+b . -974
+b , -974
+O T -1460
+O V -485
+O Y -1460
+O . -1460
+O , -1460
+L y -974
+L O -1460
+L G -1949
+L C -1460
+L Q -1460
+P J -1949
+V y -485
+V u -485
+V O -485
+V G -485
+V C -485
+V Q -485
+D T -1949
+D V -485
+D Y -1460
+D . -1949
+D , -1949
+Y O -1460
+Y G -1460
+Y C -1460
+Y Q -1460
+F o -974
+F e -974
+F a -974
+c . -974
+c , -974
+O A -974
+O W -485
+L U -1460
+R T -974
+R V -485
+R Y -974
+R W -485
+G T -1460
+P o -1460
+P g -1460
+P e -1460
+P a -974
+C A -974
+C . -1460
+C , -1460
+D A -974
+D W -485
+B T -1460
+B Y -1460
+B . -1460
+B , -1460
+F J -1460
+A O -974
+A G -974
+A C -974
+A U -974
+A Q -974
+W r -485
+W y -485
+W u -485
+W O -485
+W G -485
+W C -485
+W J -1460
+W Q -485
+J A -974
+J . -1460
+J , -1460
+U A -974
+U . -1460
+U , -1460
+Q W -485
+f . -485
+f , -485
+T O -1460
+T G -1949
+T C -1460
+T Q -1460
+O X -1460
+L o -1460
+L e -1460
+L q -974
+G V -485
+G Y -1460
+G W -485
+P T -974
+P V -485
+P Y -974
+C T -1460
+C V -485
+C Y -1460
+D X -1460
+B V -485
+B X -1460
+B A -974
+B W -485
+S . -974
+S , -974
+X o -1460
+X e -1460
+X y -974
+X O -1460
+X G -1460
+X C -1460
+X Q -1460
+A o -974
+A e -974
+K o -1460
+K e -1460
+K y -974
+K w -974
+K O -1460
+K G -1460
+K C -1460
+K Q -1460
+o v -485
+o y -485
+o x -485
+o w -485
+h v -485
+h y -485
+n v -485
+n y -485
+m v -485
+m y -485
+r g -485
+p v -485
+p y -485
+p x -485
+c v -485
+c y -485
+c w -485
+v o -485
+v g -485
+v c -485
+v d -485
+v a -485
+v q -485
+e v -485
+e y -485
+b v -485
+b y -485
+b w -485
+s . -485
+s , -485
+y o -485
+y g -485
+y c -485
+y d -485
+y a -485
+y q -485
+f g -485
+x o -485
+x c -485
+x e -485
+x d -485
+x a -485
+x q -485
+a v -485
+a y -485
+a w -485
+w o -485
+w g -485
+w c -485
+w d -485
+w a -485
+w q -485
+T S -974
+L a -485
+L S -974
+P s -974
+P Z -974
+P X -974
+P W -485
+C X -1460
+C W -485
+C J -485
+V S -485
+S T -974
+S V -485
+S Y -974
+S X -974
+S A -974
+S W -485
+Y S -974
+X a -485
+X u -974
+X S -974
+A t -974
+A c -974
+A d -974
+A a -485
+A u -974
+A q -974
+A S -974
+W S -485
+K c -1460
+K u -974
+K S -974
+o f -485
+h w -485
+n w -485
+m w -485
+r o -485
+r c -485
+r e -485
+r d -485
+r a -485
+r q -485
+p f -485
+p w -485
+c f -485
+c x -485
+v e -485
+v s -485
+e f -485
+e x -485
+e w -485
+b f -485
+s v -485
+s y -485
+s f -485
+s x -485
+s w -485
+y e -485
+y s -485
+f o -485
+f c -485
+f e -485
+f d -485
+f s -485
+f a -485
+f q -485
+x s -485
+w e -485
+w s -485
+k o -974
+k c -974
+k e -974
+k d -974
+k a -485
+k q -974
+O Z -485
+O J -485
+L J -485
+C Z -485
+E J -485
+Z o -1460
+Z e -1460
+Z d -974
+Z s -974
+Z y -485
+Z a -485
+Z w -485
+Z u -485
+Z O -485
+Z G -485
+Z C -485
+Z S -485
+Z J -485
+Z Q -485
+D Z -485
+D J -485
+B Z -485
+B J -485
+S Z -485
+S J -485
+X J -485
+A s -974
+A J -485
+J J -485
+U J -485
+K a -485
+K J -485
+h f -485
+n f -485
+m f -485
+r s -485
+a f -485
+k s -974
+R J -485
+G J -485
+A f -485
+L cq -4388
+L ' -4388
+T hy -2924
+T - -2924
+T en -2924
+T em -2924
+A cq -1460
+A ' -1460
+hy T -2924
+- T -2924
+en T -2924
+em T -2924
+Y hy -1460
+Y - -1460
+Y en -1460
+Y em -1460
+p cq -1460
+p ' -1460
+c cq -974
+c ' -974
+e cq -1460
+e ' -1460
+b cq -1460
+b ' -1460
+a cq -974
+a ' -974
+V hy -485
+V - -485
+V en -485
+V em -485
+h cq -974
+h ' -974
+n cq -974
+n ' -974
+m cq -974
+m ' -974
+W hy -485
+W - -485
+W en -485
+W em -485
+cq d -974
+' d -974
+s cq -974
+s ' -974
+L hy -1949
+L - -1949
+L en -1949
+L em -1949
+X hy -1460
+X - -1460
+X en -1460
+X em -1460
+A hy -974
+A - -974
+A en -974
+A em -974
+K hy -1460
+K - -1460
+K en -1460
+K em -1460
+cq s -974
+' s -974
+hy X -1460
+- X -1460
+hy A -974
+- A -974
+en X -1460
+en A -974
+em X -1460
+b f -485
+Z hy -485
+Z - -485
+Z en -485
+Z em -485
+charset
+! 7806,18135 2 161057 -- MSL 1 (19U 33)
+dq 10734,18135 2 161058 -- MSL 2 (19U 34)
+" "
+sh 12684,18360,825 2 161059 -- MSL 3 (19U 35)
+# "
+Do 12684,18705,765 2 161060 -- MSL 4 (19U 36)
+$ "
+% 17565,18765,900 2 161061 -- MSL 5 (19U 37)
+& 16587,18390,255 2 161062 -- MSL 6 (19U 38)
+cq 5856,18135 2 161170 -- MSL 8 (19U 146)
+' "
+( 5856,18135,2430 2 161064 -- MSL 9 (19U 40)
+) 5856,18135,2430 2 161065 -- MSL 10 (19U 41)
+* 12684,18495 2 161066 -- MSL 11 (19U 42)
++ 17565,12810 0 161067 -- MSL 12 (19U 43)
+, 5856,3465,2430 0 161068 -- MSL 13 (19U 44)
+hy 5856,7710 0 161069 -- MSL 14 (19U 45)
+- "
+. 5856,3330 0 161070 -- MSL 15 (19U 46)
+sl 5856,18165,2430 2 161071 -- MSL 16 (19U 47)
+/ "
+0 12684,18360,255 2 161072 -- MSL 17 (19U 48)
+1 12684,18105 2 161073 -- MSL 18 (19U 49)
+2 12684,18360 2 161074 -- MSL 19 (19U 50)
+3 12684,18360,255 2 161075 -- MSL 20 (19U 51)
+4 12684,18105 2 161076 -- MSL 21 (19U 52)
+5 12684,18105,255 2 161077 -- MSL 22 (19U 53)
+6 12684,18360,255 2 161078 -- MSL 23 (19U 54)
+7 12684,18105 2 161079 -- MSL 24 (19U 55)
+8 12684,18360,255 2 161080 -- MSL 25 (19U 56)
+9 12684,18360,255 2 161081 -- MSL 26 (19U 57)
+: 5856,12378 0 161082 -- MSL 27 (19U 58)
+; 5856,12378,2430 0 161083 -- MSL 28 (19U 59)
+< 26346,16068 0 161084 -- MSL 29 (19U 60)
+= 17565,9792 0 161085 -- MSL 30 (19U 61)
+> 26346,16068 0 161086 -- MSL 31 (19U 62)
+? 11709,18390 2 161087 -- MSL 32 (19U 63)
+at 17565,18357,3219 2 161088 -- MSL 33 (19U 64)
+@ "
+A 14637,18135 2 161089 -- MSL 34 (19U 65)
+B 14148,18135 2 161090 -- MSL 35 (19U 66)
+C 13662,18390,255 2 161091 -- MSL 36 (19U 67)
+D 14637,18135 2 161092 -- MSL 37 (19U 68)
+E 12198,18135 2 161093 -- MSL 38 (19U 69)
+F 11709,18135 2 161094 -- MSL 39 (19U 70)
+G 14637,18390,255 2 161095 -- MSL 40 (19U 71)
+H 14637,18135 2 161096 -- MSL 41 (19U 72)
+I 6831,18135 2 161097 -- MSL 42 (19U 73)
+J 12684,18135,255 2 161098 -- MSL 43 (19U 74)
+K 14148,18135 2 161099 -- MSL 44 (19U 75)
+L 11220,18135 2 161100 -- MSL 45 (19U 76)
+M 19515,18135 2 161101 -- MSL 46 (19U 77)
+N 15126,18135 2 161102 -- MSL 47 (19U 78)
+O 14637,18390,255 2 161103 -- MSL 48 (19U 79)
+P 13662,18135 2 161104 -- MSL 49 (19U 80)
+Q 15126,18390,255 2 161105 -- MSL 50 (19U 81)
+R 13662,18135 2 161106 -- MSL 51 (19U 82)
+S 14148,18390,255 2 161107 -- MSL 52 (19U 83)
+T 13173,18135 2 161108 -- MSL 53 (19U 84)
+U 14637,18135,255 2 161109 -- MSL 54 (19U 85)
+V 13662,18135 2 161110 -- MSL 55 (19U 86)
+W 20490,18135 2 161111 -- MSL 56 (19U 87)
+X 14637,18135 2 161112 -- MSL 57 (19U 88)
+Y 13662,18135 2 161113 -- MSL 58 (19U 89)
+Z 12198,18135 2 161114 -- MSL 59 (19U 90)
+lB 5856,18135,2430 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 5856,18165,2430 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 5856,18135,2430 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588 1 161119 -- MSL 64 (19U 95)
+oq 5856,18135 2 161169 -- MSL 66 (19U 145)
+` "
+a 11709,12885,255 0 161121 -- MSL 67 (19U 97)
+b 11709,18165,255 2 161122 -- MSL 68 (19U 98)
+c 10734,12885,255 0 161123 -- MSL 69 (19U 99)
+d 11709,18165,255 2 161124 -- MSL 70 (19U 100)
+e 11220,12885,255 0 161125 -- MSL 71 (19U 101)
+f 8295,18315 2 161126 -- MSL 72 (19U 102)
+g 11709,12885,4995 1 161127 -- MSL 73 (19U 103)
+h 12198,18165 2 161128 -- MSL 74 (19U 104)
+i 6342,18165 2 161129 -- MSL 75 (19U 105)
+j 6342,18165,4995 3 161130 -- MSL 76 (19U 106)
+k 11709,18165 2 161131 -- MSL 77 (19U 107)
+l 6342,18165 2 161132 -- MSL 78 (19U 108)
+m 17565,12885 0 161133 -- MSL 79 (19U 109)
+n 12198,12885 0 161134 -- MSL 80 (19U 110)
+o 11709,12885,255 0 161135 -- MSL 81 (19U 111)
+p 11709,12885,4995 1 161136 -- MSL 82 (19U 112)
+q 11709,12885,4995 1 161137 -- MSL 83 (19U 113)
+r 8781,12885 0 161138 -- MSL 84 (19U 114)
+s 10734,12885,255 0 161139 -- MSL 85 (19U 115)
+t 8295,16086,255 0 161140 -- MSL 86 (19U 116)
+u 12198,12630,255 0 161141 -- MSL 87 (19U 117)
+v 11709,12630 0 161142 -- MSL 88 (19U 118)
+w 18540,12630 0 161143 -- MSL 89 (19U 119)
+x 11709,12630 0 161144 -- MSL 90 (19U 120)
+y 11709,12630,4680 1 161145 -- MSL 91 (19U 121)
+z 9759,12630 0 161146 -- MSL 92 (19U 122)
+{ 13173,20130,6075 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588 3 161148 -- MSL 94 (19U 124)
+ba "
+} 13173,20130,6075 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,9435 0 161150 -- MSL 96 (19U 126)
+`A 14637,23130 2 161216 -- MSL 99 (19U 192)
+^A 14637,23130 2 161218 -- MSL 100 (19U 194)
+`E 12198,23130 2 161224 -- MSL 101 (19U 200)
+^E 12198,23130 2 161226 -- MSL 102 (19U 202)
+:E 12198,22815 2 161227 -- MSL 103 (19U 203)
+^I 6831,23130 2 161230 -- MSL 104 (19U 206)
+:I 6831,22815 2 161231 -- MSL 105 (19U 207)
+aa 12684,18285 2 161204 -- MSL 106 (19U 180)
+ga 12684,18285 2 161120 -- MSL 107 (19U 96)
+a^ 12684,18285 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 12684,18225 2 161192 -- MSL 109 (19U 168)
+~ 12684,17874 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 14637,23130,255 2 161241 -- MSL 111 (19U 217)
+^U 14637,23130,255 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105 2 161199 -- MSL 113 (19U 175)
+'Y 13662,23130 2 161245 -- MSL 114 (19U 221)
+'y 11709,18285,4680 3 161277 -- MSL 115 (19U 253)
+de 12684,18360 2 161200 -- MSL 116 (19U 176)
+,C 13662,18390,5580 3 161223 -- MSL 117 (19U 199)
+,c 10734,12885,5190 1 161255 -- MSL 118 (19U 231)
+~N 15126,23031 2 161233 -- MSL 119 (19U 209)
+~n 12198,17874 2 161265 -- MSL 120 (19U 241)
+r! 7806,12630,5505 1 161185 -- MSL 121 (19U 161)
+r? 11709,12576,5814 1 161215 -- MSL 122 (19U 191)
+Cs 12684,15834 0 161188 -- MSL 123 (19U 164)
+Po 12684,18360 2 161187 -- MSL 124 (19U 163)
+Ye 12684,18105 2 161189 -- MSL 125 (19U 165)
+sc 12684,18495,600 2 161191 -- MSL 126 (19U 167)
+Fn 12684,18315 2 161155 -- MSL 127 (19U 131)
+ct 12684,18705,765 2 161186 -- MSL 128 (19U 162)
+^a 11709,18285,255 2 161250 -- MSL 129 (19U 226)
+^e 11220,18285,255 2 161258 -- MSL 130 (19U 234)
+^o 11709,18285,255 2 161268 -- MSL 131 (19U 244)
+^u 12198,18285,255 2 161275 -- MSL 132 (19U 251)
+'a 11709,18285,255 2 161249 -- MSL 133 (19U 225)
+'e 11220,18285,255 2 161257 -- MSL 134 (19U 233)
+'o 11709,18285,255 2 161267 -- MSL 135 (19U 243)
+'u 12198,18285,255 2 161274 -- MSL 136 (19U 250)
+`a 11709,18285,255 2 161248 -- MSL 137 (19U 224)
+`e 11220,18285,255 2 161256 -- MSL 138 (19U 232)
+`o 11709,18285,255 2 161266 -- MSL 139 (19U 242)
+`u 12198,18285,255 2 161273 -- MSL 140 (19U 249)
+:a 11709,18225,255 2 161252 -- MSL 141 (19U 228)
+:e 11220,18225,255 2 161259 -- MSL 142 (19U 235)
+:o 11709,18225,255 2 161270 -- MSL 143 (19U 246)
+:u 12198,18225,255 2 161276 -- MSL 144 (19U 252)
+oA 14637,25080 2 161221 -- MSL 145 (19U 197)
+^i 6342,18285 2 161262 -- MSL 146 (19U 238)
+/O 14637,19890,2019 2 161240 -- MSL 147 (19U 216)
+AE 20490,18135 2 161222 -- MSL 148 (19U 198)
+oa 11709,19455,255 2 161253 -- MSL 149 (19U 229)
+'i 6342,18285 2 161261 -- MSL 150 (19U 237)
+/o 11709,14256,2172 0 161272 -- MSL 151 (19U 248)
+ae 17565,12885,255 0 161254 -- MSL 152 (19U 230)
+:A 14637,22815 2 161220 -- MSL 153 (19U 196)
+`i 6342,18285 2 161260 -- MSL 154 (19U 236)
+:O 14637,22815,255 2 161238 -- MSL 155 (19U 214)
+:U 14637,22815,255 2 161244 -- MSL 156 (19U 220)
+'E 12198,23130 2 161225 -- MSL 157 (19U 201)
+:i 6342,18225 2 161263 -- MSL 158 (19U 239)
+ss 13173,18315,255 2 161247 -- MSL 159 (19U 223)
+^O 14637,23130,255 2 161236 -- MSL 160 (19U 212)
+'A 14637,23130 2 161217 -- MSL 161 (19U 193)
+~A 14637,23031 2 161219 -- MSL 162 (19U 195)
+~a 11709,17874,255 2 161251 -- MSL 163 (19U 227)
+-D 14637,18135 2 161232 -- MSL 164 (19U 208)
+Sd 11709,18573,255 2 161264 -- MSL 165 (19U 240)
+'I 6831,23130 2 161229 -- MSL 166 (19U 205)
+`I 6831,23130 2 161228 -- MSL 167 (19U 204)
+'O 14637,23130,255 2 161235 -- MSL 168 (19U 211)
+`O 14637,23130,255 2 161234 -- MSL 169 (19U 210)
+~O 14637,23031,255 2 161237 -- MSL 170 (19U 213)
+~o 11709,17874,255 2 161269 -- MSL 171 (19U 245)
+vS 14148,23130,255 2 161162 -- MSL 172 (19U 138)
+vs 10734,18285,255 2 161178 -- MSL 173 (19U 154)
+'U 14637,23130,255 2 161242 -- MSL 174 (19U 218)
+:Y 13662,22815 2 161183 -- MSL 175 (19U 159)
+:y 11709,18225,4680 3 161279 -- MSL 176 (19U 255)
+TP 13662,18135 2 161246 -- MSL 177 (19U 222)
+Tp 11709,18165,4995 3 161278 -- MSL 178 (19U 254)
+mc 15612,12630,4680 1 161205 -- MSL 180 (19U 181)
+ps 12684,19635,4200 2 161206 -- MSL 181 (19U 182)
+34 17565,18765,900 2 161214 -- MSL 182 (19U 190)
+\- 17565,7740 0 60096 -- MSL 183 ( 7J 192)
+14 17565,18765,900 2 161212 -- MSL 184 (19U 188)
+12 17565,18765,900 2 161213 -- MSL 185 (19U 189)
+Of 10734,18360 2 161194 -- MSL 186 (19U 170)
+Om 10734,18360 2 161210 -- MSL 187 (19U 186)
+Fo 11709,11070 0 161195 -- MSL 188 (19U 171)
+Fc 11709,11070 0 161211 -- MSL 190 (19U 187)
+t+- 17565,12810,2520 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916 3 161190 -- MSL 192 (19U 166)
+co 13173,19635 2 161193 -- MSL 193 (19U 169)
+tno 17565,10320 0 161196 -- MSL 194 (19U 172)
+u00AD 5856,7710 0 161197 -- MSL 195 (19U 173)
+rg 13173,19635 2 161198 -- MSL 196 (19U 174)
+S2 8295,18465 2 161202 -- MSL 197 (19U 178)
+S3 8295,18465 2 161203 -- MSL 198 (19U 179)
+ac 12684,0,5190 1 161208 -- MSL 199 (19U 184)
+S1 8295,18345 2 161209 -- MSL 200 (19U 185)
+tmu 17565,12345 0 161239 -- MSL 201 (19U 215)
+tdi 17565,12015 0 161271 -- MSL 202 (19U 247)
+u203C 13173,18135 2 87315 -- MSL 221 (10U 19)
+u20A7 20979,18135,255 2 60121 -- MSL 232 ( 7J 217)
+pc 5856,10251 0 161207 -- MSL 302 (19U 183)
+u013F 11220,18135 2 51943 -- MSL 306 ( 6J 231)
+u0140 9270,18165 2 51959 -- MSL 307 ( 6J 247)
+u2113 12684,18045,765 2 60122 -- MSL 308 ( 7J 218)
+u0149 15612,18135 2 51951 -- MSL 309 ( 6J 239)
+fm 5856,18105 2 60101 -- MSL 310 ( 7J 197)
+sd 12684,18105 2 60102 -- MSL 311 ( 7J 198)
+dg 12684,18135 2 161158 -- MSL 312 (19U 134)
+tm 16101,17850 2 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588 1 60095 -- MSL 314 ( 7J 191)
+ah 12684,18285 2 75169 -- MSL 315 ( 9E 161)
+ao 12684,19455 2 60152 -- MSL 316 ( 7J 248)
+f/ 2928,18765,900 2 60109 -- MSL 324 ( 7J 205)
+em 17565,7530 0 161175 -- MSL 325 (19U 151)
+en 12684,7530 0 161174 -- MSL 326 (19U 150)
+dd 12684,18135 2 161159 -- MSL 327 (19U 135)
+.i 6342,12630 0 46333 -- MSL 328 ( 5T 253)
+aq 5856,18135 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226 0 161173 -- MSL 331 (19U 149)
+u207F 8295,18465 2 87548 -- MSL 332 (10U 252)
+u0111 11709,18165,255 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 14637,23298 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 11709,18285,255 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 14637,18135,4860 3 75173 -- MSL 404 ( 9E 165)
+u0061_0328 11709,12885,4335 0 75193 -- MSL 405 ( 9E 185)
+'C 13662,23130,255 2 75206 -- MSL 406 ( 9E 198)
+'c 10734,18285,255 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 13662,23130,255 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 10734,18285,255 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 14637,23130 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 14637,18165,255 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 12198,23130 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 11220,18285,255 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 12198,18135,4860 3 75210 -- MSL 422 ( 9E 202)
+u0065_0328 11220,12885,4335 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 11220,23130 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 6342,23745 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 11220,18165 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 8781,18165 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 15126,23130 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 12198,18285 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 15126,23130 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 12198,18285 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 14637,23130,255 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 11709,18285,255 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 13662,23130 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 8781,18285 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 13662,23130 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 8781,18285 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 14148,23130,255 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 10734,18285,255 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 13173,23130 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 9759,18165,255 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 13173,18135,5580 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 8295,16086,5190 1 75262 -- MSL 469 ( 9E 254)
+u0055_030B 14637,23130,255 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 12198,18285,255 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 14637,25080,255 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 12198,19455,255 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 12198,23130 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 9759,18285 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 12198,22920 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 9759,18345 2 75199 -- MSL 485 ( 9E 191)
+u2070 8295,18465 2 51753 -- MSL 1000 ( 6J 41)
+u2074 8295,18345 2 51748 -- MSL 1001 ( 6J 36)
+u2075 8295,18345 2 51749 -- MSL 1002 ( 6J 37)
+u2076 8295,18465 2 51806 -- MSL 1003 ( 6J 94)
+u2077 8295,18345 2 51750 -- MSL 1004 ( 6J 38)
+u2078 8295,18465 2 51754 -- MSL 1005 ( 6J 42)
+u2079 8295,18465 2 51752 -- MSL 1006 ( 6J 40)
+lq 10245,18135 2 161171 -- MSL 1017 (19U 147)
+rq 10245,18135 2 161172 -- MSL 1018 (19U 148)
+Bq 10245,3513,2382 0 161156 -- MSL 1019 (19U 132)
+u2003 17565,0 0 51821 -- MSL 1020 ( 6J 109)
+u2002 12684,0 0 51822 -- MSL 1021 ( 6J 110)
+u2009 5856,0 0 51828 -- MSL 1023 ( 6J 116)
+u2026 17565,3210 0 161157 -- MSL 1028 (19U 133)
+vz 9759,18285 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,18000 2 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056 2 51794 -- MSL 1036 ( 6J 82)
+fi 14148,18315 2 60077 -- MSL 1040 ( 7J 173)
+fl 14148,18315 2 60078 -- MSL 1041 ( 7J 174)
+ff 15126,18315 2 51883 -- MSL 1042 ( 6J 171)
+Fi 20979,18315 2 51884 -- MSL 1043 ( 6J 172)
+Fl 20979,18315 2 51885 -- MSL 1044 ( 6J 173)
+ij 12684,18165,4995 3 60134 -- MSL 1047 ( 7J 230)
+u2105 20979,18390,255 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 14637,23298,255 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 11709,18285,4995 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 14148,18390,5580 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 10734,12885,5190 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 6831,22920 2 46301 -- MSL 1065 ( 5T 221)
+bq 5856,3513,2382 0 161154 -- MSL 1067 (19U 130)
+%0 26346,18765,900 2 161161 -- MSL 1068 (19U 137)
+a- 12684,17595 2 60154 -- MSL 1084 ( 7J 250)
+ab 12684,18285 2 75170 -- MSL 1086 ( 9E 162)
+a. 12684,18345 2 75263 -- MSL 1088 ( 9E 255)
+oe 17565,12885,255 0 161180 -- MSL 1090 (19U 156)
+OE 20490,18270,135 2 161164 -- MSL 1091 (19U 140)
+fo 6342,11070 0 161163 -- MSL 1092 (19U 139)
+fc 6342,11070 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624 0 60091 -- MSL 1094 ( 7J 187)
+/L 11709,18135 2 75171 -- MSL 1095 ( 9E 163)
+/l 6831,18165 2 75187 -- MSL 1096 ( 9E 179)
+a" 12684,18285 2 75197 -- MSL 1097 ( 9E 189)
+ho 12684,300,4335 0 75186 -- MSL 1098 ( 9E 178)
+vZ 12198,23130 2 75150 -- MSL 1106 ( 9E 142)
+IJ 18540,18135,255 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/UCBI b/font/devlj4/UCBI
new file mode 100644
index 0000000..1373e84
--- /dev/null
+++ b/font/devlj4/UCBI
@@ -0,0 +1,666 @@
+# Univers BdCdIt
+name UCBI
+spacewidth 5856
+slant 16.500000
+pcltypeface 4148
+pclproportional 1
+pclweight 3
+pclstyle 5
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -2438
+P . -4388
+P , -4388
+V A -1460
+A V -1949
+T o -2438
+T r -1949
+T c -2438
+T e -2438
+T d -2438
+T s -1949
+T y -1949
+T a -2438
+T w -1949
+T u -1949
+T J -1949
+L T -2438
+L Y -2924
+Y o -1949
+Y e -1460
+Y a -1460
+Y J -1949
+A W -1460
+W A -974
+T A -1949
+V o -974
+V e -974
+V a -974
+Y A -1949
+F A -974
+F . -3413
+F , -3413
+A T -2438
+A Y -2438
+v . -974
+v , -974
+y . -974
+y , -974
+T . -1949
+T , -1949
+L W -1460
+P A -1460
+V J -974
+V . -1949
+V , -1949
+Y . -1949
+Y , -1949
+W o -974
+W e -974
+W a -974
+W . -974
+W , -974
+r . -1460
+r , -1460
+w . -974
+w , -974
+Y u -974
+A v -485
+A y -974
+A w -485
+o . -974
+o , -974
+p . -974
+p , -974
+e . -485
+e , -485
+b . -974
+b , -974
+O T -1949
+O V -485
+O Y -974
+O . -1460
+O , -1460
+L y -1460
+L O -1949
+L G -1949
+L C -1949
+L Q -1949
+P J -1460
+V y -485
+V u -485
+V O -485
+V G -485
+V C -485
+V Q -485
+D T -1460
+D V -485
+D Y -974
+D . -1949
+D , -1949
+Y O -974
+Y G -974
+Y C -974
+Y Q -974
+F o -485
+F e -485
+F a -485
+c . -485
+c , -485
+O A -485
+O W -485
+L U -1460
+R T -1460
+R V -485
+R Y -974
+R W -485
+G T -1460
+P o -974
+P g -485
+P e -485
+P a -485
+C A -485
+C . -1460
+C , -1460
+D A -485
+D W -485
+B T -1949
+B Y -974
+B . -485
+B , -485
+F J -485
+A O -485
+A G -485
+A C -485
+A U -485
+A Q -485
+W r -485
+W y -485
+W u -485
+W O -485
+W G -485
+W C -485
+W J -974
+W Q -485
+U A -485
+U . -974
+U , -974
+Q W -485
+T O -1460
+T G -1460
+T C -1460
+T Q -1460
+O X -974
+L o -1460
+L e -1460
+L q -1460
+G V -485
+G Y -974
+G W -485
+P T -1460
+P V -485
+P Y -974
+C T -1949
+C V -485
+C Y -974
+D X -974
+B V -485
+B X -485
+B A -485
+B W -485
+S . -485
+S , -485
+X o -974
+X e -974
+X y -974
+X O -974
+X G -974
+X C -974
+X Q -974
+A o -485
+A e -485
+K o -974
+K e -974
+K y -974
+K w -974
+K O -974
+K G -974
+K C -974
+K Q -974
+o y -485
+o x -974
+h y -485
+n y -485
+m y -485
+r g -485
+p y -485
+p x -974
+c y -485
+e y -485
+b y -485
+x o -974
+x c -974
+x e -485
+x d -974
+x a -485
+x q -974
+a y -485
+T S -485
+L a -485
+L S -974
+P Z -485
+P X -974
+P W -485
+C X -974
+C W -485
+V S -485
+S T -974
+S V -485
+S Y -974
+S X -485
+S A -485
+S W -485
+Y S -485
+X a -485
+X u -974
+X S -485
+A t -485
+A c -485
+A d -485
+A a -485
+A u -485
+A q -485
+A S -485
+W S -485
+K c -974
+K u -974
+K S -485
+r o -485
+r c -485
+r e -485
+r d -485
+r a -485
+r q -485
+c x -485
+e x -485
+s y -485
+k o -485
+k c -485
+k e -485
+k d -485
+k a -485
+k q -485
+O Z -485
+C Z -485
+Z o -485
+Z e -485
+Z d -485
+Z s -485
+Z y -485
+Z a -485
+Z w -485
+Z u -485
+Z O -485
+Z G -485
+Z C -485
+Z S -485
+Z Q -485
+D Z -485
+B Z -485
+S Z -485
+A s -485
+K a -485
+L cq -3902
+L ' -3902
+T hy -1949
+T - -1949
+T en -1949
+T em -1949
+A cq -1460
+A ' -1460
+hy T -2438
+- T -2438
+en T -2438
+em T -2438
+Y hy -974
+Y - -974
+Y en -974
+Y em -974
+p cq -974
+p ' -974
+c cq -974
+c ' -974
+e cq -1460
+e ' -1460
+b cq -1460
+b ' -1460
+a cq -974
+a ' -974
+V hy -485
+V - -485
+V en -485
+V em -485
+h cq -1460
+h ' -1460
+n cq -974
+n ' -974
+m cq -974
+m ' -974
+W hy -485
+W - -485
+W en -485
+W em -485
+cq d -974
+' d -974
+s cq -485
+s ' -485
+L hy -1949
+L - -1949
+L en -1949
+L em -1949
+X hy -974
+X - -974
+X en -974
+X em -974
+A hy -485
+A - -485
+A en -485
+A em -485
+K hy -974
+K - -974
+K en -974
+K em -974
+hy X -974
+- X -974
+hy A -485
+- A -485
+en X -974
+en A -485
+em X -974
+Z hy -485
+Z - -485
+Z en -485
+Z em -485
+charset
+! 7806,18135,0,2628,993,994 2 161057 -- MSL 1 (19U 33)
+dq 10734,18135,0,3669,-2132,994 2 161058 -- MSL 2 (19U 34)
+" "
+sh 12684,18360,825,2676,684,994 2 161059 -- MSL 3 (19U 35)
+# "
+Do 12684,18840,570,1326,-290,994 2 161060 -- MSL 4 (19U 36)
+$ "
+% 17565,18465,1050,1386,228,994 2 161061 -- MSL 5 (19U 37)
+& 16587,18390,255,609,471,609 2 161062 -- MSL 6 (19U 38)
+cq 5856,18135,0,4215,-1391,994 2 161170 -- MSL 8 (19U 146)
+' "
+( 5856,18135,2430,4416,744,994 2 161064 -- MSL 9 (19U 40)
+) 5856,18135,2430,1812,3348,994 2 161065 -- MSL 10 (19U 41)
+* 12684,18390,0,1635,-3464,994 2 161066 -- MSL 11 (19U 42)
++ 17565,12810,0,0,-1430 0 161067 -- MSL 12 (19U 43)
+, 5856,3465,2370,0,3042 0 161068 -- MSL 13 (19U 44)
+hy 5856,7785,0,726,585,726 0 161069 -- MSL 14 (19U 45)
+- "
+. 5856,3465,0,0,1917 0 161070 -- MSL 15 (19U 46)
+sl 5856,18165,2430,4518,3396,994 2 161071 -- MSL 16 (19U 47)
+/ "
+0 12684,18360,255,2343,627,994 2 161072 -- MSL 17 (19U 48)
+1 12684,18105,0,1020,-2306,994 2 161073 -- MSL 18 (19U 49)
+2 12684,18360,0,2235,1779,994 2 161074 -- MSL 19 (19U 50)
+3 12684,18360,255,2184,687,994 2 161075 -- MSL 20 (19U 51)
+4 12684,18105,0,2082,1284,994 2 161076 -- MSL 21 (19U 52)
+5 12684,18105,255,2490,525,994 2 161077 -- MSL 22 (19U 53)
+6 12684,18360,255,2397,546,994 2 161078 -- MSL 23 (19U 54)
+7 12684,18105,0,3309,315,994 2 161079 -- MSL 24 (19U 55)
+8 12684,18360,255,2274,600,994 2 161080 -- MSL 25 (19U 56)
+9 12684,18360,255,2289,819,994 2 161081 -- MSL 26 (19U 57)
+: 5856,12570,0,1947,1917,994 0 161082 -- MSL 27 (19U 58)
+; 5856,12570,2370,1836,3042,994 0 161083 -- MSL 28 (19U 59)
+< 26346,16068,0,0,-3980 0 161084 -- MSL 29 (19U 60)
+= 17565,9792,0,0,-1454 0 161085 -- MSL 30 (19U 61)
+> 26346,16068,0,0,-3980 0 161086 -- MSL 31 (19U 62)
+? 11709,18390,0,2205,-737,994 2 161087 -- MSL 32 (19U 63)
+at 17565,18372,3231,2163,1152,994 2 161088 -- MSL 33 (19U 64)
+@ "
+A 14637,18135,0,0,2460 2 161089 -- MSL 34 (19U 65)
+B 14148,18135,0,1668,1362,994 2 161090 -- MSL 35 (19U 66)
+C 13662,18390,255,2247,375,994 2 161091 -- MSL 36 (19U 67)
+D 14637,18135,0,1851,1398,994 2 161092 -- MSL 37 (19U 68)
+E 12198,18135,0,3423,1440,994 2 161093 -- MSL 38 (19U 69)
+F 11709,18135,0,3855,1584,994 2 161094 -- MSL 39 (19U 70)
+G 14637,18390,255,1926,117,994 2 161095 -- MSL 40 (19U 71)
+H 14637,18135,0,3243,1542,994 2 161096 -- MSL 41 (19U 72)
+I 6831,18135,0,3342,1641,994 2 161097 -- MSL 42 (19U 73)
+J 12684,18135,255,3231,1059,994 2 161098 -- MSL 43 (19U 74)
+K 14148,18135,0,3366,1374,994 2 161099 -- MSL 44 (19U 75)
+L 11220,18135,0,0,1488 2 161100 -- MSL 45 (19U 76)
+M 19515,18135,0,2958,1551,994 2 161101 -- MSL 46 (19U 77)
+N 15126,18135,0,3003,1431,994 2 161102 -- MSL 47 (19U 78)
+O 14637,18390,255,1872,204,994 2 161103 -- MSL 48 (19U 79)
+P 13662,18135,0,2412,1506,994 2 161104 -- MSL 49 (19U 80)
+Q 15126,18390,255,1449,189,994 2 161105 -- MSL 50 (19U 81)
+R 13662,18135,0,1968,1545,994 2 161106 -- MSL 51 (19U 82)
+S 14148,18390,255,2079,495,994 2 161107 -- MSL 52 (19U 83)
+T 13173,18135,0,3891,-1553,994 2 161108 -- MSL 53 (19U 84)
+U 14637,18135,255,3147,72,994 2 161109 -- MSL 54 (19U 85)
+V 13662,18135,0,4206,-1619,994 2 161110 -- MSL 55 (19U 86)
+W 20490,18135,0,3927,-698,994 2 161111 -- MSL 56 (19U 87)
+X 14637,18135,0,3828,2505,994 2 161112 -- MSL 57 (19U 88)
+Y 13662,18135,0,4230,-1766,994 2 161113 -- MSL 58 (19U 89)
+Z 12198,18135,0,3639,2217,994 2 161114 -- MSL 59 (19U 90)
+lB 5856,18135,2430,4086,2592,994 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 8295,18165,2430,534,-1679,534 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 5856,18135,2430,3555,3123,994 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758,0,36,36,36 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588,1317,1317,994 1 161119 -- MSL 64 (19U 95)
+oq 5856,18135,0,3957,-1133,994 2 161169 -- MSL 66 (19U 145)
+` "
+a 11709,12885,255,999,1161,994 0 161121 -- MSL 67 (19U 97)
+b 11709,18165,255,1164,1920,994 2 161122 -- MSL 68 (19U 98)
+c 10734,12885,255,1290,990,994 0 161123 -- MSL 69 (19U 99)
+d 11709,18165,255,3657,1038,994 2 161124 -- MSL 70 (19U 100)
+e 11220,12885,255,1140,1023,994 0 161125 -- MSL 71 (19U 101)
+f 8295,18315,0,4233,960,994 2 161126 -- MSL 72 (19U 102)
+g 11709,12885,4995,2007,2487,994 1 161127 -- MSL 73 (19U 103)
+h 12198,18165,0,987,1677,987 2 161128 -- MSL 74 (19U 104)
+i 6342,18165,0,3393,1722,994 2 161129 -- MSL 75 (19U 105)
+j 6342,18165,4995,3432,4620,994 3 161130 -- MSL 76 (19U 106)
+k 11709,18165,0,2241,1605,994 2 161131 -- MSL 77 (19U 107)
+l 6342,18165,0,3426,1746,994 2 161132 -- MSL 78 (19U 108)
+m 17565,12885,0,1053,1842,994 0 161133 -- MSL 79 (19U 109)
+n 12198,12885,0,915,1734,915 0 161134 -- MSL 80 (19U 110)
+o 11709,12885,255,990,927,990 0 161135 -- MSL 81 (19U 111)
+p 11709,12885,4680,1098,3417,994 1 161136 -- MSL 82 (19U 112)
+q 11709,12885,4680,1926,1122,994 1 161137 -- MSL 83 (19U 113)
+r 8781,12885,0,2637,1686,994 0 161138 -- MSL 84 (19U 114)
+s 10734,12885,255,1116,1380,994 0 161139 -- MSL 85 (19U 115)
+t 8295,15693,255,2280,354,994 0 161140 -- MSL 86 (19U 116)
+u 12198,12630,255,1764,849,994 0 161141 -- MSL 87 (19U 117)
+v 11709,12630,0,2337,-545,994 0 161142 -- MSL 88 (19U 118)
+w 18540,12630,0,2337,-170,994 0 161143 -- MSL 89 (19U 119)
+x 11709,12630,0,2193,2526,994 0 161144 -- MSL 90 (19U 120)
+y 11709,12630,4680,2457,1983,994 1 161145 -- MSL 91 (19U 121)
+z 9759,12630,0,1977,2220,994 0 161146 -- MSL 92 (19U 122)
+{ 13173,20130,6075,3150,-905,994 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588,0,-4595 3 161148 -- MSL 94 (19U 124)
+ba "
+} 13173,20130,6075,0,3510 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,9435,0,0,-4028 0 161150 -- MSL 96 (19U 126)
+`A 14637,23100,0,0,2460 2 161216 -- MSL 99 (19U 192)
+^A 14637,23100,0,1626,2460,994 2 161218 -- MSL 100 (19U 194)
+`E 12198,23100,0,3423,1440,994 2 161224 -- MSL 101 (19U 200)
+^E 12198,23100,0,3423,1440,994 2 161226 -- MSL 102 (19U 202)
+:E 12198,23265,0,3948,1440,994 2 161227 -- MSL 103 (19U 203)
+^I 6831,23100,0,5529,1641,994 2 161230 -- MSL 104 (19U 206)
+:I 6831,23265,0,6630,1641,994 2 161231 -- MSL 105 (19U 207)
+aa 12684,18225,0,1785,-5264,994 2 161204 -- MSL 106 (19U 180)
+ga 12684,18225,0,0,-5270 2 161120 -- MSL 107 (19U 96)
+a^ 12684,18225,0,702,-3896,702 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 12684,18120,0,2067,-3989,994 2 161192 -- MSL 109 (19U 168)
+~ 12684,17811,0,1560,-3785,994 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 14637,23100,255,3147,72,994 2 161241 -- MSL 111 (19U 217)
+^U 14637,23100,255,3147,72,994 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105,0,1317,1317,994 2 161199 -- MSL 113 (19U 175)
+'Y 13662,23100,0,4230,-1766,994 2 161245 -- MSL 114 (19U 221)
+'y 11709,18225,4680,2457,1983,994 3 161277 -- MSL 115 (19U 253)
+de 12684,18360,0,1377,-3200,994 2 161200 -- MSL 116 (19U 176)
+,C 13662,18390,5295,2247,375,994 3 161223 -- MSL 117 (19U 199)
+,c 10734,12885,5205,1290,1419,994 1 161255 -- MSL 118 (19U 231)
+~N 15126,22833,0,3003,1431,994 2 161233 -- MSL 119 (19U 209)
+~n 12198,17811,0,1803,1734,994 2 161265 -- MSL 120 (19U 241)
+r! 7806,12615,5520,936,2685,936 1 161185 -- MSL 121 (19U 161)
+r? 11709,12600,5790,0,2256 1 161215 -- MSL 122 (19U 191)
+Cs 12684,15834,0,2757,1125,994 0 161188 -- MSL 123 (19U 164)
+Po 12684,18360,0,2571,1257,994 2 161187 -- MSL 124 (19U 163)
+Ye 12684,18105,0,4791,834,994 2 161189 -- MSL 125 (19U 165)
+sc 12684,18390,255,174,-1544,174 2 161191 -- MSL 126 (19U 167)
+Fn 12684,18315,0,2196,-1391,994 2 161155 -- MSL 127 (19U 131)
+ct 12684,18840,570,1299,-635,994 2 161186 -- MSL 128 (19U 162)
+^a 11709,18225,255,1188,1161,994 2 161250 -- MSL 129 (19U 226)
+^e 11220,18225,255,1434,1023,994 2 161258 -- MSL 130 (19U 234)
+^o 11709,18225,255,1188,927,994 2 161268 -- MSL 131 (19U 244)
+^u 12198,18225,255,1764,849,994 2 161275 -- MSL 132 (19U 251)
+'a 11709,18225,255,2271,1161,994 2 161249 -- MSL 133 (19U 225)
+'e 11220,18225,255,2517,1023,994 2 161257 -- MSL 134 (19U 233)
+'o 11709,18225,255,2271,927,994 2 161267 -- MSL 135 (19U 243)
+'u 12198,18225,255,2028,849,994 2 161274 -- MSL 136 (19U 250)
+`a 11709,18225,255,999,1161,994 2 161248 -- MSL 137 (19U 224)
+`e 11220,18225,255,1140,1023,994 2 161256 -- MSL 138 (19U 232)
+`o 11709,18225,255,990,927,990 2 161266 -- MSL 139 (19U 242)
+`u 12198,18225,255,1764,849,994 2 161273 -- MSL 140 (19U 249)
+:a 11709,18120,255,2553,1161,994 2 161252 -- MSL 141 (19U 228)
+:e 11220,18120,255,2799,1023,994 2 161259 -- MSL 142 (19U 235)
+:o 11709,18120,255,2553,927,994 2 161270 -- MSL 143 (19U 246)
+:u 12198,18120,255,2310,849,994 2 161276 -- MSL 144 (19U 252)
+oA 14637,25164,0,1713,2460,994 2 161221 -- MSL 145 (19U 197)
+^i 6342,18225,0,3873,1713,994 2 161262 -- MSL 146 (19U 238)
+/O 14637,19854,1755,1872,204,994 2 161240 -- MSL 147 (19U 216)
+AE 20490,18135,0,2688,3147,994 2 161222 -- MSL 148 (19U 198)
+oa 11709,19089,255,1488,1161,994 2 161253 -- MSL 149 (19U 229)
+'i 6342,18225,0,5760,1713,994 2 161261 -- MSL 150 (19U 237)
+/o 11709,14208,1830,993,927,993 0 161272 -- MSL 151 (19U 248)
+ae 17565,12885,255,924,966,924 0 161254 -- MSL 152 (19U 230)
+:A 14637,23265,0,2727,2460,994 2 161220 -- MSL 153 (19U 196)
+`i 6342,18225,0,2367,1713,994 2 161260 -- MSL 154 (19U 236)
+:O 14637,23265,255,2727,204,994 2 161238 -- MSL 155 (19U 214)
+:U 14637,23265,255,3147,72,994 2 161244 -- MSL 156 (19U 220)
+'E 12198,23100,0,3660,1440,994 2 161225 -- MSL 157 (19U 201)
+:i 6342,18120,0,5238,1713,994 2 161263 -- MSL 158 (19U 239)
+ss 13173,18165,0,1956,1704,994 2 161247 -- MSL 159 (19U 223)
+^O 14637,23100,255,1872,204,994 2 161236 -- MSL 160 (19U 212)
+'A 14637,23100,0,2439,2460,994 2 161217 -- MSL 161 (19U 193)
+~A 14637,22833,0,2379,2460,994 2 161219 -- MSL 162 (19U 195)
+~a 11709,17811,255,2046,1161,994 2 161251 -- MSL 163 (19U 227)
+-D 14637,18135,0,1851,1398,994 2 161232 -- MSL 164 (19U 208)
+Sd 11709,18756,255,1419,936,994 2 161264 -- MSL 165 (19U 240)
+'I 6831,23100,0,6342,1641,994 2 161229 -- MSL 166 (19U 205)
+`I 6831,23100,0,3732,1641,994 2 161228 -- MSL 167 (19U 204)
+'O 14637,23100,255,2439,204,994 2 161235 -- MSL 168 (19U 211)
+`O 14637,23100,255,1872,204,994 2 161234 -- MSL 169 (19U 210)
+~O 14637,22833,255,2379,204,994 2 161237 -- MSL 170 (19U 213)
+~o 11709,17811,255,2046,927,994 2 161269 -- MSL 171 (19U 245)
+vS 14148,23100,255,2754,495,994 2 161162 -- MSL 172 (19U 138)
+vs 10734,18225,255,2754,1380,994 2 161178 -- MSL 173 (19U 154)
+'U 14637,23100,255,3147,72,994 2 161242 -- MSL 174 (19U 218)
+:Y 13662,23265,0,4230,-1766,994 2 161183 -- MSL 175 (19U 159)
+:y 11709,18120,4680,2553,1983,994 3 161279 -- MSL 176 (19U 255)
+TP 13662,18135,0,1518,1470,994 2 161246 -- MSL 177 (19U 222)
+Tp 11709,18165,4680,1098,3417,994 3 161278 -- MSL 178 (19U 254)
+mc 15612,12630,4680,1422,2907,994 1 161205 -- MSL 180 (19U 181)
+ps 12684,19635,4200,2046,-1214,994 2 161206 -- MSL 181 (19U 182)
+34 17565,18465,1050,1788,-173,994 2 161214 -- MSL 182 (19U 190)
+\- 17565,7740,0,0,-1454 0 60096 -- MSL 183 ( 7J 192)
+14 17565,18345,1050,639,975,639 2 161212 -- MSL 184 (19U 188)
+12 17565,18345,1050,165,1449,165 2 161213 -- MSL 185 (19U 189)
+Of 10734,18360,0,1965,-2321,994 2 161194 -- MSL 186 (19U 170)
+Om 10734,18360,0,1956,-2495,994 2 161210 -- MSL 187 (19U 186)
+Fo 11709,10965,0,1749,306,994 0 161195 -- MSL 188 (19U 171)
+Fc 11709,10965,0,219,1836,219 0 161211 -- MSL 190 (19U 187)
+t+- 17565,12810,2520,0,-1430 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916,0,-4595 3 161190 -- MSL 192 (19U 166)
+co 13173,19635,0,4629,-2837,994 2 161193 -- MSL 193 (19U 169)
+tno 17565,10320,0,0,-1454 0 161196 -- MSL 194 (19U 172)
+u00AD 5856,7785,0,726,585,726 0 161197 -- MSL 195 (19U 173)
+rg 13173,19635,0,4629,-2837,994 2 161198 -- MSL 196 (19U 174)
+S2 8295,18465,0,2814,-431,994 2 161202 -- MSL 197 (19U 178)
+S3 8295,18465,0,2817,-1046,994 2 161203 -- MSL 198 (19U 179)
+ac 12684,0,5205,0,444 1 161208 -- MSL 199 (19U 184)
+S1 8295,18345,0,1920,-2585,994 2 161209 -- MSL 200 (19U 185)
+tmu 17565,12345,0,0,-2447 0 161239 -- MSL 201 (19U 215)
+tdi 17565,12015,0,0,-1445 0 161271 -- MSL 202 (19U 247)
+u203C 13662,18135,0,2628,990,994 2 87315 -- MSL 221 (10U 19)
+u20A7 21954,18135,255,2283,1506,994 2 60121 -- MSL 232 ( 7J 217)
+pc 5856,10671,0,1371,-188,994 0 161207 -- MSL 302 (19U 183)
+u013F 11220,18135,0,2700,1488,994 2 51943 -- MSL 306 ( 6J 231)
+u0140 9270,18165,0,3120,1746,994 2 51959 -- MSL 307 ( 6J 247)
+u2113 17562,18045,765,0,-3065 2 60122 -- MSL 308 ( 7J 218)
+u0149 15615,18135,0,915,-452,915 2 51951 -- MSL 309 ( 6J 239)
+fm 5856,18105,0,3432,-2123,994 2 60101 -- MSL 310 ( 7J 197)
+sd 12684,18105,0,1554,-2123,994 2 60102 -- MSL 311 ( 7J 198)
+dg 12684,18135,0,318,-1352,318 2 161158 -- MSL 312 (19U 134)
+tm 16101,17850,0,2169,-2705,994 2 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588,1317,1317,994 1 60095 -- MSL 314 ( 7J 191)
+ah 12684,18225,0,1779,-4973,994 2 75169 -- MSL 315 ( 9E 161)
+ao 12684,19089,0,1002,-4802,994 2 60152 -- MSL 316 ( 7J 248)
+f/ 2928,18345,1050,8775,7476,994 2 60109 -- MSL 324 ( 7J 205)
+em 17565,7605,0,426,354,426 0 161175 -- MSL 325 (19U 151)
+en 12684,7605,0,753,546,753 0 161174 -- MSL 326 (19U 150)
+dd 12684,18135,0,399,-1433,399 2 161159 -- MSL 327 (19U 135)
+.i 6342,12630,0,1770,1713,994 0 46333 -- MSL 328 ( 5T 253)
+aq 5856,18135,0,3546,-2132,994 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226,0,0,-497 0 161173 -- MSL 331 (19U 149)
+u207F 8295,18465,0,3612,90,994 2 87548 -- MSL 332 (10U 252)
+u0111 11709,18165,255,4527,1038,994 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 14637,23205,0,1980,2460,994 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 11709,18195,255,2160,1161,994 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 14637,18135,4956,0,2460 3 75173 -- MSL 404 ( 9E 165)
+u0061_0328 11709,12885,4755,999,1161,994 1 75193 -- MSL 405 ( 9E 185)
+'C 13662,23100,255,3378,375,994 2 75206 -- MSL 406 ( 9E 198)
+'c 10734,18225,255,2910,990,994 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 13662,23100,255,2997,375,994 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 10734,18225,255,2754,990,994 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 14637,23100,0,1851,1398,994 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 15126,18165,255,4908,1038,994 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 12198,23100,0,3939,1440,994 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 11220,18225,255,2511,1023,994 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 12198,18135,4956,3423,1440,994 3 75210 -- MSL 422 ( 9E 202)
+u0065_0328 11220,12885,4755,1140,1023,994 1 75242 -- MSL 423 ( 9E 234)
+u004C_0301 11220,23100,0,2889,1488,994 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 6342,23685,0,7113,1746,994 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 11220,18165,0,3954,1488,994 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 9270,18165,0,5064,1746,994 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 15126,23100,0,3003,1431,994 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 12198,18225,0,2028,1734,994 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 15126,23100,0,3003,1431,994 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 12198,18225,0,2022,1734,994 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 14637,23100,255,4542,204,994 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 11709,18225,255,4101,927,994 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 13662,23100,0,2928,1545,994 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 8781,18225,0,4185,1686,994 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 13662,23100,0,2997,1545,994 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 8781,18225,0,4179,1686,994 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 14148,23100,255,2910,495,994 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 10734,18225,255,2895,1380,994 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 13173,23100,0,3891,-1553,994 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 9759,18165,255,4995,354,994 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 13173,18135,5295,3891,609,994 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 8295,15693,5205,2280,2040,994 1 75262 -- MSL 469 ( 9E 254)
+u0055_030B 14637,23100,255,4722,72,994 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 12198,18225,255,4308,849,994 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 14637,25164,255,3147,72,994 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 12198,19089,255,1764,849,994 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 12198,23100,0,3660,2217,994 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 9759,18225,0,3246,2220,994 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 12198,23265,0,3639,2217,994 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 9759,18120,0,1977,2220,994 2 75199 -- MSL 485 ( 9E 191)
+u2070 8295,18465,0,2832,-1037,994 2 51753 -- MSL 1000 ( 6J 41)
+u2074 8295,18345,0,2883,-743,994 2 51748 -- MSL 1001 ( 6J 36)
+u2075 8295,18345,0,3312,-1241,994 2 51749 -- MSL 1002 ( 6J 37)
+u2076 8295,18465,0,3012,-1421,994 2 51806 -- MSL 1003 ( 6J 94)
+u2077 8295,18345,0,3186,-1427,994 2 51750 -- MSL 1004 ( 6J 38)
+u2078 8295,18465,0,2895,-1160,994 2 51754 -- MSL 1005 ( 6J 42)
+u2079 8295,18465,0,2748,-1034,994 2 51752 -- MSL 1006 ( 6J 40)
+lq 10245,18135,0,3945,-1130,994 2 161171 -- MSL 1017 (19U 147)
+rq 10245,18135,0,4314,-1499,994 2 161172 -- MSL 1018 (19U 148)
+Bq 10245,3459,2376,0,3000 0 161156 -- MSL 1019 (19U 132)
+u2003 17565,0,0,0,1317 0 51821 -- MSL 1020 ( 6J 109)
+u2002 12684,0,0,0,1317 0 51822 -- MSL 1021 ( 6J 110)
+u2009 5856,0,0,0,1317 0 51828 -- MSL 1023 ( 6J 116)
+u2026 17565,3105,0,0,756 0 161157 -- MSL 1028 (19U 133)
+vz 9759,18225,0,3240,2220,994 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,18000,0,3354,-2720,994 2 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056,537,-1238,537 2 51794 -- MSL 1036 ( 6J 82)
+fi 14148,18315,0,3318,981,994 2 60077 -- MSL 1040 ( 7J 173)
+fl 14148,18315,0,3378,978,994 2 60078 -- MSL 1041 ( 7J 174)
+ff 15126,18315,0,4389,963,994 2 51883 -- MSL 1042 ( 6J 171)
+Fi 20979,18315,0,3477,981,994 2 51884 -- MSL 1043 ( 6J 172)
+Fl 20979,18315,0,3537,978,994 2 51885 -- MSL 1044 ( 6J 173)
+ij 12684,18165,4995,3432,1722,994 3 60134 -- MSL 1047 ( 7J 230)
+u2105 21468,18390,255,324,-1499,324 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 14637,23205,255,2310,117,994 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 11709,18195,4995,2160,2487,994 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 14148,18390,5295,2079,495,994 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 10734,12885,5205,1116,1419,994 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 6831,23265,0,4509,1641,994 2 46301 -- MSL 1065 ( 5T 221)
+bq 5856,3459,2376,57,2766,57 0 161154 -- MSL 1067 (19U 130)
+%0 26346,18465,1050,450,-200,450 2 161161 -- MSL 1068 (19U 137)
+a- 12684,16386,0,927,-4565,927 0 60154 -- MSL 1084 ( 7J 250)
+ab 12684,18195,0,1674,-4343,994 2 75170 -- MSL 1086 ( 9E 162)
+a. 12684,18120,0,0,-5504 2 75263 -- MSL 1088 ( 9E 255)
+oe 17565,12885,255,903,948,903 0 161180 -- MSL 1090 (19U 156)
+OE 20490,18270,135,2994,153,994 2 161164 -- MSL 1091 (19U 140)
+fo 6342,10965,0,1878,399,994 0 161163 -- MSL 1092 (19U 139)
+fc 6342,10965,0,453,1824,453 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624,0,0,-2021 0 60091 -- MSL 1094 ( 7J 187)
+/L 13173,18135,0,951,96,951 2 75171 -- MSL 1095 ( 9E 163)
+/l 8781,18165,0,2745,807,994 2 75187 -- MSL 1096 ( 9E 179)
+a" 12684,18225,0,4065,-4166,994 2 75197 -- MSL 1097 ( 9E 189)
+ho 12684,918,4755,0,-2396 1 75186 -- MSL 1098 ( 9E 178)
+vZ 12198,23100,0,3729,2217,994 2 75150 -- MSL 1106 ( 9E 142)
+IJ 19515,18135,255,3231,1641,994 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/UCI b/font/devlj4/UCI
new file mode 100644
index 0000000..f8b40d2
--- /dev/null
+++ b/font/devlj4/UCI
@@ -0,0 +1,806 @@
+# Univers MdCdIt
+name UCI
+spacewidth 5856
+slant 16.500000
+pcltypeface 4148
+pclproportional 1
+pclweight 0
+pclstyle 5
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -2924
+P . -5363
+P , -5363
+V A -1949
+A V -1949
+T o -3413
+T r -3413
+T c -3413
+T e -3413
+T d -3413
+T s -3902
+T y -3413
+T a -3413
+T w -3413
+T u -3413
+T J -3413
+L T -3413
+L Y -2924
+Y o -2924
+Y e -2924
+Y a -2438
+Y J -2924
+A W -1949
+W A -1949
+T A -2924
+V o -1949
+V e -1949
+V a -1460
+Y A -2924
+F A -1460
+F . -3902
+F , -3902
+A T -2924
+A Y -2924
+v . -1949
+v , -1949
+y . -2438
+y , -2438
+T . -3413
+T , -3413
+L W -1949
+P A -1460
+V J -1949
+V . -2924
+V , -2924
+Y . -2924
+Y , -2924
+W o -1460
+W e -1460
+W a -1460
+W . -1949
+W , -1949
+r . -1460
+r , -1460
+w . -1949
+w , -1949
+Y u -1460
+A v -974
+A y -974
+A w -974
+o . -485
+o , -485
+p . -485
+p , -485
+e . -485
+e , -485
+b . -485
+b , -485
+O T -1460
+O V -485
+O Y -1460
+O . -974
+O , -974
+L y -2438
+L O -1460
+L G -1460
+L C -1460
+L Q -1460
+P J -1949
+V y -485
+V u -485
+V O -485
+V G -485
+V C -485
+V Q -485
+D T -1460
+D V -485
+D Y -1460
+D . -974
+D , -974
+Y O -974
+Y G -974
+Y C -974
+Y Q -974
+F o -974
+F e -974
+F a -974
+c . -485
+c , -485
+O A -485
+O W -485
+L U -1460
+R T -1460
+R V -485
+R Y -1460
+R W -485
+G T -1460
+P o -1460
+P g -1460
+P e -1460
+P a -974
+C A -974
+C . -974
+C , -974
+D A -485
+D W -485
+B T -1460
+B Y -1460
+B . -974
+B , -974
+F J -974
+A O -485
+A G -485
+A C -485
+A U -485
+A Q -485
+W r -485
+W y -485
+W u -485
+W O -485
+W G -485
+W C -485
+W J -1460
+W Q -485
+J A -485
+J . -1460
+J , -1460
+U A -485
+U . -974
+U , -974
+Q W -485
+f . -974
+f , -974
+T O -974
+T G -974
+T C -974
+T Q -974
+O X -485
+L o -1949
+L e -1949
+L q -1949
+G V -485
+G Y -1460
+G W -485
+P T -1460
+P V -485
+P Y -1460
+C T -1460
+C V -974
+C Y -1460
+D X -485
+B V -485
+B X -485
+B A -485
+B W -485
+S . -485
+S , -485
+X o -485
+X e -485
+X y -485
+X O -485
+X G -485
+X C -485
+X Q -485
+A o -485
+A e -485
+K o -974
+K e -974
+K y -974
+K w -974
+K O -974
+K G -974
+K C -974
+K Q -974
+o v -485
+o y -485
+o x -485
+o w -485
+h v -485
+h y -485
+n v -485
+n y -485
+m v -485
+m y -485
+r g -485
+p v -485
+p y -485
+p x -485
+c v -485
+c y -485
+c w -485
+v o -485
+v g -485
+v c -485
+v d -485
+v a -485
+v q -485
+e v -485
+e y -485
+b v -485
+b y -485
+b w -485
+s . -485
+s , -485
+y o -485
+y g -485
+y c -485
+y d -485
+y a -485
+y q -485
+f g -485
+x o -485
+x g -485
+x c -485
+x e -485
+x d -485
+x a -485
+x q -485
+a v -485
+a y -485
+a w -485
+w o -485
+w g -485
+w c -485
+w d -485
+w a -485
+w q -485
+T i -485
+T S -485
+L a -1460
+L S -974
+P s -485
+P Z -485
+P X -485
+P W -485
+C X -974
+C W -974
+C J -485
+V i -485
+V S -485
+S T -974
+S V -485
+S Y -974
+S X -485
+S A -485
+S W -485
+Y i -485
+Y S -485
+X a -485
+X u -485
+X S -485
+A t -485
+A g -485
+A c -485
+A d -485
+A a -485
+A u -485
+A q -485
+A S -485
+W i -485
+W S -485
+K c -974
+K u -974
+K S -485
+h w -485
+n w -485
+m w -485
+r o -485
+r c -485
+r e -485
+r d -485
+r a -485
+r q -485
+p w -485
+c x -485
+v e -485
+v s -974
+e x -485
+e w -485
+s v -485
+s y -485
+s x -485
+s w -485
+y e -485
+y s -485
+f o -485
+f c -485
+f e -485
+f d -485
+f s -485
+f a -485
+f q -485
+x s -485
+w e -485
+w s -485
+k o -485
+k g -485
+k c -485
+k e -485
+k d -485
+k a -485
+k q -485
+O Z -485
+L J -974
+C Z -974
+Z o -485
+Z e -485
+Z d -485
+Z s -974
+Z y -485
+Z a -485
+Z w -485
+Z u -485
+Z O -485
+Z G -485
+Z C -485
+Z S -485
+Z J -485
+Z Q -485
+D Z -485
+B Z -485
+S Z -485
+X J -485
+A s -974
+A J -485
+K a -974
+K J -974
+t s -485
+r s -485
+g s -485
+v t -485
+v h -485
+v n -485
+v m -485
+v r -485
+v i -485
+v p -485
+v z -485
+v b -485
+v y -485
+v f -485
+v x -485
+v w -485
+v j -485
+v u -485
+v k -485
+z s -485
+k s -485
+C t -485
+C o -485
+C h -485
+C l -485
+C r -485
+C i -485
+C e -485
+C y -485
+C a -485
+C u -485
+C O -485
+C H -485
+C N -485
+C M -485
+C L -485
+C R -485
+C G -485
+C I -485
+C P -485
+C C -485
+C E -485
+C D -485
+C B -485
+C S -485
+C F -485
+C U -485
+C Q -485
+C K -485
+E s -485
+U s -485
+L cq -3413
+L ' -3413
+T hy -3413
+T - -3413
+T en -3413
+T em -3413
+A cq -1460
+A ' -1460
+hy T -3413
+- T -3413
+en T -3413
+em T -3413
+Y hy -1460
+Y - -1460
+Y en -1460
+Y em -1460
+p cq -1949
+p ' -1949
+c cq -1949
+c ' -1949
+e cq -1949
+e ' -1949
+b cq -1949
+b ' -1949
+a cq -1949
+a ' -1949
+V hy -485
+V - -485
+V en -485
+V em -485
+h cq -1460
+h ' -1460
+n cq -1460
+n ' -1460
+m cq -1460
+m ' -1460
+W hy -485
+W - -485
+W en -485
+W em -485
+cq d -485
+' d -485
+s cq -974
+s ' -974
+L hy -1949
+L - -1949
+L en -1949
+L em -1949
+X hy -485
+X - -485
+X en -485
+X em -485
+A hy -485
+A - -485
+A en -485
+A em -485
+K hy -974
+K - -974
+K en -974
+K em -974
+cq s -485
+' s -485
+hy X -485
+- X -485
+hy A -485
+- A -485
+en X -485
+en A -485
+em X -485
+v cq -485
+v ' -485
+C cq -485
+C ' -485
+Z hy -485
+Z - -485
+Z en -485
+Z em -485
+v hy -485
+v - -485
+v en -485
+v em -485
+C hy -485
+C - -485
+C en -485
+C em -485
+charset
+! 7806,18135,0,2241,591,996 2 161057 -- MSL 1 (19U 33)
+dq 9759,18135,0,3060,-2390,996 2 161058 -- MSL 2 (19U 34)
+" "
+sh 12198,18360,975,1389,3,996 2 161059 -- MSL 3 (19U 35)
+# "
+Do 12198,18465,630,843,-734,843 2 161060 -- MSL 4 (19U 36)
+$ "
+% 17565,18675,975,576,-671,576 2 161061 -- MSL 5 (19U 37)
+& 16101,18390,255,210,177,210 2 161062 -- MSL 6 (19U 38)
+cq 5856,18135,0,3690,-1481,996 2 161170 -- MSL 8 (19U 146)
+' "
+( 5856,18135,2325,3999,699,996 2 161064 -- MSL 9 (19U 40)
+) 5856,18135,2325,1524,3174,996 2 161065 -- MSL 10 (19U 41)
+* 12198,18390,0,1251,-3044,996 2 161066 -- MSL 11 (19U 42)
++ 17565,12495,0,0,-2096 0 161067 -- MSL 12 (19U 43)
+, 5856,2970,2730,0,2856 0 161068 -- MSL 13 (19U 44)
+hy 5856,7560,0,534,348,534 0 161069 -- MSL 14 (19U 45)
+- "
+. 5856,2970,0,0,1347 0 161070 -- MSL 15 (19U 46)
+sl 5856,18165,1980,4254,3456,996 2 161071 -- MSL 16 (19U 47)
+/ "
+0 12198,18360,255,2505,636,996 2 161072 -- MSL 17 (19U 48)
+1 12198,18105,0,309,-2084,309 2 161073 -- MSL 18 (19U 49)
+2 12198,18360,0,1968,1710,996 2 161074 -- MSL 19 (19U 50)
+3 12198,18360,255,2127,735,996 2 161075 -- MSL 20 (19U 51)
+4 12198,18105,0,3057,699,996 2 161076 -- MSL 21 (19U 52)
+5 12198,18105,255,3717,123,996 2 161077 -- MSL 22 (19U 53)
+6 12198,18360,255,3078,21,996 2 161078 -- MSL 23 (19U 54)
+7 12198,18105,0,3684,138,996 2 161079 -- MSL 24 (19U 55)
+8 12198,18360,255,3024,132,996 2 161080 -- MSL 25 (19U 56)
+9 12198,18360,255,2850,480,996 2 161081 -- MSL 26 (19U 57)
+: 5856,12621,0,1656,1347,996 0 161082 -- MSL 27 (19U 58)
+; 5856,12621,2730,1737,2856,996 0 161083 -- MSL 28 (19U 59)
+< 26346,16068,0,0,-3980 0 161084 -- MSL 29 (19U 60)
+= 17565,9375,0,0,-2114 0 161085 -- MSL 30 (19U 61)
+> 26346,16068,0,0,-3980 0 161086 -- MSL 31 (19U 62)
+? 11220,18390,0,2100,-608,996 2 161087 -- MSL 32 (19U 63)
+at 17565,18357,3849,1746,1029,996 2 161088 -- MSL 33 (19U 64)
+@ "
+A 13662,18135,0,0,2325 2 161089 -- MSL 34 (19U 65)
+B 13173,18135,0,1743,1536,996 2 161090 -- MSL 35 (19U 66)
+C 13173,18390,255,1860,513,996 2 161091 -- MSL 36 (19U 67)
+D 13662,18135,0,1749,1557,996 2 161092 -- MSL 37 (19U 68)
+E 11220,18135,0,3267,1563,996 2 161093 -- MSL 38 (19U 69)
+F 10734,18135,0,3414,1449,996 2 161094 -- MSL 39 (19U 70)
+G 13662,18390,255,1893,333,996 2 161095 -- MSL 40 (19U 71)
+H 13662,18135,0,2958,1509,996 2 161096 -- MSL 41 (19U 72)
+I 5856,18135,0,3066,1566,996 2 161097 -- MSL 42 (19U 73)
+J 11220,18135,255,2781,1866,996 2 161098 -- MSL 43 (19U 74)
+K 13173,18135,0,2982,1341,996 2 161099 -- MSL 44 (19U 75)
+L 10245,18135,0,0,1506 2 161100 -- MSL 45 (19U 76)
+M 18051,18135,0,2886,1590,996 2 161101 -- MSL 46 (19U 77)
+N 14148,18135,0,3030,1638,996 2 161102 -- MSL 47 (19U 78)
+O 13662,18390,255,1875,447,996 2 161103 -- MSL 48 (19U 79)
+P 12198,18135,0,2514,1401,996 2 161104 -- MSL 49 (19U 80)
+Q 13662,18390,255,1773,495,996 2 161105 -- MSL 50 (19U 81)
+R 13173,18135,0,2247,1515,996 2 161106 -- MSL 51 (19U 82)
+S 12684,18390,255,2274,978,996 2 161107 -- MSL 52 (19U 83)
+T 12684,18135,0,3735,-1889,996 2 161108 -- MSL 53 (19U 84)
+U 13662,18135,255,2892,363,996 2 161109 -- MSL 54 (19U 85)
+V 12198,18135,0,4140,-1262,996 2 161110 -- MSL 55 (19U 86)
+W 18051,18135,0,3870,-1208,996 2 161111 -- MSL 56 (19U 87)
+X 13662,18135,0,3108,2223,996 2 161112 -- MSL 57 (19U 88)
+Y 12198,18135,0,4026,-1472,996 2 161113 -- MSL 58 (19U 89)
+Z 12198,18135,0,3390,2130,996 2 161114 -- MSL 59 (19U 90)
+lB 5856,18135,2325,4227,2679,996 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 7806,18165,1980,420,-1229,420 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 5856,18135,2325,3114,3792,996 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758,0,36,36,36 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588,1317,1317,996 1 161119 -- MSL 64 (19U 95)
+oq 5856,18135,0,3690,-1481,996 2 161169 -- MSL 66 (19U 145)
+` "
+a 10734,12885,255,918,1242,918 0 161121 -- MSL 67 (19U 97)
+b 10734,18165,255,1200,1791,996 2 161122 -- MSL 68 (19U 98)
+c 10245,12885,255,1047,816,996 0 161123 -- MSL 69 (19U 99)
+d 10734,18165,255,3501,1155,996 2 161124 -- MSL 70 (19U 100)
+e 10245,12885,255,1245,1065,996 0 161125 -- MSL 71 (19U 101)
+f 7806,18315,0,3972,753,996 2 161126 -- MSL 72 (19U 102)
+g 10734,12885,4995,1737,2589,996 1 161127 -- MSL 73 (19U 103)
+h 10734,18165,0,1167,1812,996 2 161128 -- MSL 74 (19U 104)
+i 4878,18165,0,3690,1905,996 2 161129 -- MSL 75 (19U 105)
+j 4878,18165,4995,3777,5010,996 3 161130 -- MSL 76 (19U 106)
+k 10734,18165,0,2250,1443,996 2 161131 -- MSL 77 (19U 107)
+l 4878,18165,0,3627,1932,996 2 161132 -- MSL 78 (19U 108)
+m 16101,12885,0,1227,1803,996 0 161133 -- MSL 79 (19U 109)
+n 10734,12885,0,1218,1824,996 0 161134 -- MSL 80 (19U 110)
+o 10734,12885,255,1047,825,996 0 161135 -- MSL 81 (19U 111)
+p 10734,12885,4680,972,3273,972 1 161136 -- MSL 82 (19U 112)
+q 10734,12885,4680,1965,1020,996 1 161137 -- MSL 83 (19U 113)
+r 7317,12885,0,2601,1803,996 0 161138 -- MSL 84 (19U 114)
+s 9759,12885,255,1320,1314,996 0 161139 -- MSL 85 (19U 115)
+t 7806,15879,255,1989,144,996 0 161140 -- MSL 86 (19U 116)
+u 10734,12630,255,1800,1011,996 0 161141 -- MSL 87 (19U 117)
+v 10245,12630,0,2412,-422,996 0 161142 -- MSL 88 (19U 118)
+w 17076,12630,0,2343,-368,996 0 161143 -- MSL 89 (19U 119)
+x 10245,12630,0,2328,2280,996 0 161144 -- MSL 90 (19U 120)
+y 10734,12630,4680,2364,1923,996 1 161145 -- MSL 91 (19U 121)
+z 8781,12630,0,2136,2154,996 0 161146 -- MSL 92 (19U 122)
+{ 11709,20130,6075,2865,-1289,996 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588,0,-4595 3 161148 -- MSL 94 (19U 124)
+ba "
+} 11709,20130,6075,0,2577 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,8952,0,0,-4028 0 161150 -- MSL 96 (19U 126)
+`A 13662,23640,0,0,2325 2 161216 -- MSL 99 (19U 192)
+^A 13662,23415,0,1611,2325,996 2 161218 -- MSL 100 (19U 194)
+`E 11220,23640,0,3267,1563,996 2 161224 -- MSL 101 (19U 200)
+^E 11220,23415,0,3267,1563,996 2 161226 -- MSL 102 (19U 202)
+:E 11220,22560,0,3693,1563,996 2 161227 -- MSL 103 (19U 203)
+^I 5856,23415,0,5514,1566,996 2 161230 -- MSL 104 (19U 206)
+:I 5856,22560,0,6375,1566,996 2 161231 -- MSL 105 (19U 207)
+aa 12198,18165,0,1326,-5684,996 2 161204 -- MSL 106 (19U 180)
+ga 12198,18165,0,0,-4538 2 161120 -- MSL 107 (19U 96)
+a^ 12198,17940,0,795,-3728,795 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 12198,17355,0,1464,-3698,996 2 161192 -- MSL 109 (19U 168)
+~ 12198,17652,0,1776,-3728,996 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 13662,23640,255,2892,363,996 2 161241 -- MSL 111 (19U 217)
+^U 13662,23415,255,2892,363,996 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105,0,1317,1317,996 2 161199 -- MSL 113 (19U 175)
+'Y 12198,23640,0,4026,-1472,996 2 161245 -- MSL 114 (19U 221)
+'y 10734,18165,4680,2364,1923,996 3 161277 -- MSL 115 (19U 253)
+de 12198,18360,0,1284,-2981,996 2 161200 -- MSL 116 (19U 176)
+,C 13173,18390,4995,1860,540,996 3 161223 -- MSL 117 (19U 199)
+,c 10245,12885,4995,1047,2838,996 1 161255 -- MSL 118 (19U 231)
+~N 14148,22743,0,3030,1638,996 2 161233 -- MSL 119 (19U 209)
+~n 10734,17652,0,2508,1824,996 2 161265 -- MSL 120 (19U 241)
+r! 7806,13041,5094,861,1971,861 1 161185 -- MSL 121 (19U 161)
+r? 11220,12591,5799,0,2016 1 161215 -- MSL 122 (19U 191)
+Cs 12198,15684,0,2514,468,996 0 161188 -- MSL 123 (19U 164)
+Po 12198,18360,0,2223,522,996 2 161187 -- MSL 124 (19U 163)
+Ye 12198,18105,0,4137,1266,996 2 161189 -- MSL 125 (19U 165)
+sc 12198,18390,255,96,-1508,96 2 161191 -- MSL 126 (19U 167)
+Fn 12198,18315,0,1662,-1328,996 2 161155 -- MSL 127 (19U 131)
+ct 12198,18465,630,873,-1004,873 2 161186 -- MSL 128 (19U 162)
+^a 10734,17940,255,1527,1242,996 2 161250 -- MSL 129 (19U 226)
+^e 10245,17940,255,1770,1065,996 2 161258 -- MSL 130 (19U 234)
+^o 10734,17940,255,1527,825,996 2 161268 -- MSL 131 (19U 244)
+^u 10734,17940,255,1800,1011,996 2 161275 -- MSL 132 (19U 251)
+'a 10734,18165,255,2058,1242,996 2 161249 -- MSL 133 (19U 225)
+'e 10245,18165,255,2301,1065,996 2 161257 -- MSL 134 (19U 233)
+'o 10734,18165,255,2058,825,996 2 161267 -- MSL 135 (19U 243)
+'u 10734,18165,255,2058,1011,996 2 161274 -- MSL 136 (19U 250)
+`a 10734,18165,255,918,1242,918 2 161248 -- MSL 137 (19U 224)
+`e 10245,18165,255,1245,1065,996 2 161256 -- MSL 138 (19U 232)
+`o 10734,18165,255,1047,825,996 2 161266 -- MSL 139 (19U 242)
+`u 10734,18165,255,1800,1011,996 2 161273 -- MSL 140 (19U 249)
+:a 10734,17355,255,2478,1242,996 2 161252 -- MSL 141 (19U 228)
+:e 10245,17355,255,2721,1065,996 2 161259 -- MSL 142 (19U 235)
+:o 10734,17355,255,2478,825,996 2 161270 -- MSL 143 (19U 246)
+:u 10734,17355,255,2478,1011,996 2 161276 -- MSL 144 (19U 252)
+oA 13662,24480,0,1125,2325,996 2 161221 -- MSL 145 (19U 197)
+^i 5856,17940,0,3966,1425,996 2 161262 -- MSL 146 (19U 238)
+/O 13662,19944,1833,1989,555,996 2 161240 -- MSL 147 (19U 216)
+AE 18540,18135,0,2904,2310,996 2 161222 -- MSL 148 (19U 198)
+oa 10734,19005,255,918,1242,918 2 161253 -- MSL 149 (19U 229)
+'i 5856,18165,0,4779,1425,996 2 161261 -- MSL 150 (19U 237)
+/o 10734,14238,1866,1050,930,996 0 161272 -- MSL 151 (19U 248)
+ae 16587,12885,255,681,957,681 0 161254 -- MSL 152 (19U 230)
+:A 13662,22560,0,2472,2325,996 2 161220 -- MSL 153 (19U 196)
+`i 5856,18165,0,1461,1425,996 2 161260 -- MSL 154 (19U 236)
+:O 13662,22560,255,2472,447,996 2 161238 -- MSL 155 (19U 214)
+:U 13662,22560,255,2892,363,996 2 161244 -- MSL 156 (19U 220)
+'E 11220,23640,0,3267,1563,996 2 161225 -- MSL 157 (19U 201)
+:i 5856,17355,0,5118,1425,996 2 161263 -- MSL 158 (19U 239)
+ss 11709,18315,255,1839,1917,996 2 161247 -- MSL 159 (19U 223)
+^O 13662,23415,255,1875,447,996 2 161236 -- MSL 160 (19U 212)
+'A 13662,23640,0,1884,2325,996 2 161217 -- MSL 161 (19U 193)
+~A 13662,22743,0,2355,2325,996 2 161219 -- MSL 162 (19U 195)
+~a 10734,17652,255,2508,1242,996 2 161251 -- MSL 163 (19U 227)
+-D 13662,18135,0,1749,1557,996 2 161232 -- MSL 164 (19U 208)
+Sd 10734,18579,255,2247,927,996 2 161264 -- MSL 165 (19U 240)
+'I 5856,23640,0,6393,1566,996 2 161229 -- MSL 166 (19U 205)
+`I 5856,23640,0,3258,1566,996 2 161228 -- MSL 167 (19U 204)
+'O 13662,23640,255,1884,447,996 2 161235 -- MSL 168 (19U 211)
+`O 13662,23640,255,1875,447,996 2 161234 -- MSL 169 (19U 210)
+~O 13662,22743,255,2355,447,996 2 161237 -- MSL 170 (19U 213)
+~o 10734,17652,255,2508,825,996 2 161269 -- MSL 171 (19U 245)
+vS 12684,23415,255,3015,978,996 2 161162 -- MSL 172 (19U 138)
+vs 9759,17940,255,2751,1314,996 2 161178 -- MSL 173 (19U 154)
+'U 13662,23640,255,2892,363,996 2 161242 -- MSL 174 (19U 218)
+:Y 12198,22560,0,4026,-1472,996 2 161183 -- MSL 175 (19U 159)
+:y 10734,17355,4680,2364,1923,996 3 161279 -- MSL 176 (19U 255)
+TP 12198,18135,0,1260,1407,996 2 161246 -- MSL 177 (19U 222)
+Tp 10734,18165,4680,969,3273,969 3 161278 -- MSL 178 (19U 254)
+mc 14637,12630,4350,1122,2931,996 0 161205 -- MSL 180 (19U 181)
+ps 12198,19635,4200,1923,-605,996 2 161206 -- MSL 181 (19U 182)
+34 17565,18675,918,891,-986,891 2 161214 -- MSL 182 (19U 190)
+\- 17565,8175,0,0,-2096 0 60096 -- MSL 183 ( 7J 192)
+14 17565,18675,918,183,-278,183 2 161212 -- MSL 184 (19U 188)
+12 17565,18675,918,0,156 2 161213 -- MSL 185 (19U 189)
+Of 7806,18360,0,3285,-1187,996 2 161194 -- MSL 186 (19U 170)
+Om 7806,18360,0,3303,-1196,996 2 161210 -- MSL 187 (19U 186)
+Fo 11709,11160,0,741,-425,741 0 161195 -- MSL 188 (19U 171)
+Fc 11709,11160,0,0,777 0 161211 -- MSL 190 (19U 187)
+t+- 17565,12210,213,0,-2132 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916,0,-4595 3 161190 -- MSL 192 (19U 166)
+co 13173,19635,0,4470,-2678,996 2 161193 -- MSL 193 (19U 169)
+tno 17565,10185,0,0,-2096 0 161196 -- MSL 194 (19U 172)
+u00AD 5856,7560,0,534,348,534 0 161197 -- MSL 195 (19U 173)
+rg 13173,19635,0,4470,-2678,996 2 161198 -- MSL 196 (19U 174)
+S2 7317,18465,0,3258,-299,996 2 161202 -- MSL 197 (19U 178)
+S3 7317,18465,0,3042,-956,996 2 161203 -- MSL 198 (19U 179)
+ac 12198,0,4995,0,1860 1 161208 -- MSL 199 (19U 184)
+S1 7317,18345,0,2562,-2492,996 2 161209 -- MSL 200 (19U 185)
+tmu 17565,12216,0,0,-2849 0 161239 -- MSL 201 (19U 215)
+tdi 17565,11610,0,0,-2666 0 161271 -- MSL 202 (19U 247)
+u203C 13173,18135,0,2241,591,996 2 87315 -- MSL 221 (10U 19)
+u20A7 20004,18135,255,1989,1401,996 2 60121 -- MSL 232 ( 7J 217)
+pc 5856,10578,0,1095,-722,996 0 161207 -- MSL 302 (19U 183)
+u013F 10245,18135,0,1734,1506,996 2 51943 -- MSL 306 ( 6J 231)
+u0140 8295,18165,0,2043,1932,996 2 51959 -- MSL 307 ( 6J 247)
+u2113 12198,18150,297,477,-1010,477 2 60122 -- MSL 308 ( 7J 218)
+u0149 15612,18135,0,1218,-1481,996 2 51951 -- MSL 309 ( 6J 239)
+fm 5856,18105,0,3918,-1724,996 2 60101 -- MSL 310 ( 7J 197)
+sd 12198,18105,0,2577,-2924,996 2 60102 -- MSL 311 ( 7J 198)
+dg 12198,18135,0,315,-1853,315 2 161158 -- MSL 312 (19U 134)
+tm 16101,17850,0,2010,-2546,996 2 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588,1317,1317,996 1 60095 -- MSL 314 ( 7J 191)
+ah 12198,17940,0,1533,-4466,996 2 75169 -- MSL 315 ( 9E 161)
+ao 12198,19005,0,114,-4877,114 2 60152 -- MSL 316 ( 7J 248)
+f/ 2928,18675,918,8010,6531,996 2 60109 -- MSL 324 ( 7J 205)
+em 17565,7350,0,423,330,423 0 161175 -- MSL 325 (19U 151)
+en 12198,7350,0,936,786,936 0 161174 -- MSL 326 (19U 150)
+dd 12198,18135,0,315,-1853,315 2 161159 -- MSL 327 (19U 135)
+.i 5856,12630,0,1461,1425,996 0 46333 -- MSL 328 ( 5T 253)
+aq 5856,18135,0,3051,-2387,996 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226,0,0,-497 0 161173 -- MSL 331 (19U 149)
+u207F 7317,18465,0,3843,-35,996 2 87548 -- MSL 332 (10U 252)
+u0111 10734,18165,255,4488,1152,996 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 13662,23415,0,2628,2325,996 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 10734,17940,255,2622,1242,996 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 13662,18135,4839,0,2325 3 75173 -- MSL 404 ( 9E 165)
+u0061_0328 10734,12885,4716,918,1242,918 1 75193 -- MSL 405 ( 9E 185)
+'C 13173,23640,255,2427,513,996 2 75206 -- MSL 406 ( 9E 198)
+'c 10245,18165,255,2301,816,996 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 13173,23415,255,2769,513,996 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 10245,17940,255,2508,816,996 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 13662,23415,0,1926,1557,996 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 13662,18165,255,4695,1155,996 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 11220,23415,0,3897,1563,996 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 10245,17940,255,2508,1065,996 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 11220,18135,4839,3267,1563,996 3 75210 -- MSL 422 ( 9E 202)
+u0065_0328 10245,12885,4716,1245,1065,996 1 75242 -- MSL 423 ( 9E 234)
+u004C_0301 10245,23640,0,2691,1506,996 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 4878,23385,0,6975,1932,996 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 10245,18165,0,3507,1506,996 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 7806,18165,0,4851,1932,996 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 14148,23640,0,3030,1638,996 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 10734,18165,0,2358,1824,996 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 14148,23415,0,3030,1638,996 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 10734,17940,0,2415,1824,996 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 13662,23640,255,4017,447,996 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 10734,18165,255,3987,825,996 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 13173,23640,0,2247,1515,996 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 7317,18165,0,4065,1803,996 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 13173,23415,0,2769,1515,996 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 7317,17940,0,4272,1803,996 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 12684,23640,255,2748,978,996 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 9759,18165,255,2544,1314,996 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 12684,23415,0,3735,-1889,996 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 8781,18165,255,4746,144,996 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 12684,18135,4995,3735,1143,996 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 7806,15879,4995,1989,2856,996 1 75262 -- MSL 469 ( 9E 254)
+u0055_030B 13662,23640,255,4107,363,996 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 10734,18165,255,4077,1011,996 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 13662,24480,255,2892,363,996 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 10734,19005,255,1800,1011,996 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 12198,23640,0,3390,2130,996 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 8781,18165,0,3033,2154,996 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 12198,22740,0,3390,2130,996 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 8781,17355,0,2136,2154,996 2 75199 -- MSL 485 ( 9E 191)
+u2070 7317,18465,0,3273,-968,996 2 51753 -- MSL 1000 ( 6J 41)
+u2074 7317,18345,0,3249,-479,996 2 51748 -- MSL 1001 ( 6J 36)
+u2075 7317,18345,0,3420,-1022,996 2 51749 -- MSL 1002 ( 6J 37)
+u2076 7317,18465,0,3300,-1043,996 2 51806 -- MSL 1003 ( 6J 94)
+u2077 7317,18345,0,3513,-1061,996 2 51750 -- MSL 1004 ( 6J 38)
+u2078 7317,18465,0,3288,-872,996 2 51754 -- MSL 1005 ( 6J 42)
+u2079 7317,18465,0,3120,-869,996 2 51752 -- MSL 1006 ( 6J 40)
+lq 9270,18135,0,4254,-1484,996 2 161171 -- MSL 1017 (19U 147)
+rq 9270,18135,0,4254,-1484,996 2 161172 -- MSL 1018 (19U 148)
+Bq 9270,2916,2784,0,3018 0 161156 -- MSL 1019 (19U 132)
+u2003 17565,0,0,0,1317 0 51821 -- MSL 1020 ( 6J 109)
+u2002 12198,0,0,0,1317 0 51822 -- MSL 1021 ( 6J 110)
+u2009 5856,0,0,0,1317 0 51828 -- MSL 1023 ( 6J 116)
+u2026 17565,2310,0,0,822 0 161157 -- MSL 1028 (19U 133)
+vz 8781,17940,0,3240,2154,996 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,18000,0,3195,-2561,996 2 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056,537,-1238,537 2 51794 -- MSL 1036 ( 6J 82)
+fi 12684,18315,0,2934,795,996 2 60077 -- MSL 1040 ( 7J 173)
+fl 12684,18315,0,2949,744,996 2 60078 -- MSL 1041 ( 7J 174)
+ff 13662,18315,0,3921,888,996 2 51883 -- MSL 1042 ( 6J 171)
+Fi 18540,18315,0,2892,921,996 2 51884 -- MSL 1043 ( 6J 172)
+Fl 18540,18315,0,2928,849,996 2 51885 -- MSL 1044 ( 6J 173)
+ij 9759,18165,4995,3777,1905,996 3 60134 -- MSL 1047 ( 7J 230)
+u2105 17565,18390,255,510,-803,510 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 13662,23415,255,2838,333,996 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 10734,17940,4995,2622,2589,996 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 12684,18390,4995,2274,978,996 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 9759,12885,4995,1320,2271,996 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 5856,22740,0,4563,1566,996 2 46301 -- MSL 1065 ( 5T 221)
+bq 5856,2916,2784,0,3330 0 161154 -- MSL 1067 (19U 130)
+%0 22443,18675,975,1293,267,996 2 161161 -- MSL 1068 (19U 137)
+a- 12198,16434,0,1257,-3452,996 0 60154 -- MSL 1084 ( 7J 250)
+ab 12198,17940,0,1890,-4328,996 2 75170 -- MSL 1086 ( 9E 162)
+a. 12198,17355,0,0,-6068 2 75263 -- MSL 1088 ( 9E 255)
+oe 16587,12885,255,912,783,912 0 161180 -- MSL 1090 (19U 156)
+OE 18051,18270,135,3174,363,996 2 161164 -- MSL 1091 (19U 140)
+fo 6342,11160,0,1608,-185,996 0 161163 -- MSL 1092 (19U 139)
+fc 6342,11160,0,537,885,537 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624,0,0,-2021 0 60091 -- MSL 1094 ( 7J 187)
+/L 10245,18135,0,0,1620 2 75171 -- MSL 1095 ( 9E 163)
+/l 4878,18165,0,3627,1932,996 2 75187 -- MSL 1096 ( 9E 179)
+a" 12198,18165,0,3174,-3893,996 2 75197 -- MSL 1097 ( 9E 189)
+ho 12198,879,4716,0,-2141 1 75186 -- MSL 1098 ( 9E 178)
+vZ 12198,23415,0,3390,2130,996 2 75150 -- MSL 1106 ( 9E 142)
+IJ 17076,18135,255,2781,1566,996 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/UCR b/font/devlj4/UCR
new file mode 100644
index 0000000..c90be0d
--- /dev/null
+++ b/font/devlj4/UCR
@@ -0,0 +1,727 @@
+# Univers MdCd
+name UCR
+spacewidth 5856
+pcltypeface 4148
+pclproportional 1
+pclweight 0
+pclstyle 4
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -2438
+P . -4877
+P , -4877
+V A -1949
+A V -1949
+T o -3413
+T r -3413
+T c -3413
+T e -3413
+T d -3413
+T s -3413
+T y -3413
+T a -3413
+T w -3413
+T u -3413
+T J -3413
+L T -3413
+L Y -2924
+Y o -1949
+Y e -1949
+Y a -2438
+Y J -2924
+A W -1460
+W A -1460
+T A -2438
+V o -1460
+V e -1460
+V a -1460
+Y A -2438
+F A -974
+F . -2924
+F , -2924
+A T -2438
+A Y -2438
+v . -1949
+v , -1949
+y . -1949
+y , -1949
+T . -3413
+T , -3413
+L W -1460
+P A -1460
+V J -1460
+V . -2438
+V , -2438
+Y . -2924
+Y , -2924
+W o -974
+W e -974
+W a -974
+W . -1460
+W , -1460
+r . -1460
+r , -1460
+w . -1949
+w , -1949
+Y u -974
+A v -974
+A y -974
+A w -974
+o . -974
+o , -974
+p . -974
+p , -974
+e . -974
+e , -974
+b . -974
+b , -974
+O T -1460
+O V -485
+O Y -974
+O . -1460
+O , -1460
+L y -1949
+L O -1460
+L G -1460
+L C -1460
+L Q -1460
+P J -1460
+V y -485
+V u -485
+V O -485
+V G -485
+V C -485
+V Q -485
+D T -1460
+D V -485
+D Y -974
+D . -1460
+D , -1460
+Y O -974
+Y G -974
+Y C -974
+Y Q -974
+F o -485
+F e -485
+F a -485
+c . -974
+c , -974
+O A -485
+O W -485
+L U -1460
+R T -1460
+R V -485
+R Y -974
+R W -485
+G T -1460
+P o -974
+P g -1460
+P e -974
+P a -1460
+C A -485
+C . -1460
+C , -1460
+D A -485
+D W -485
+B T -1460
+B Y -974
+B . -1460
+B , -1460
+F J -485
+A O -485
+A G -485
+A C -485
+A U -485
+A Q -485
+W r -485
+W y -485
+W u -485
+W O -485
+W G -485
+W C -485
+W J -974
+W Q -485
+J A -485
+J . -485
+J , -485
+U A -485
+U . -1460
+U , -1460
+Q W -485
+f . -974
+f , -974
+T O -1460
+T G -1460
+T C -1460
+T Q -1460
+O X -485
+L o -974
+L e -974
+L q -1949
+G V -485
+G Y -974
+G W -485
+P T -974
+P V -485
+P Y -974
+C T -1460
+C V -485
+C Y -974
+D X -485
+B V -485
+B X -485
+B A -485
+B W -485
+S . -485
+S , -485
+X o -485
+X e -485
+X y -485
+X O -485
+X G -485
+X C -485
+X Q -485
+A o -485
+A e -485
+K o -974
+K e -974
+K y -974
+K w -974
+K O -974
+K G -974
+K C -974
+K Q -974
+o v -485
+o y -485
+o w -485
+h v -485
+h y -485
+n v -485
+n y -485
+m v -485
+m y -485
+r g -485
+p v -485
+p y -485
+c v -485
+c y -485
+c w -485
+v o -485
+v g -485
+v c -485
+v d -485
+v a -485
+v q -485
+e v -485
+e y -485
+b v -485
+b y -485
+b w -485
+s . -485
+s , -485
+y o -485
+y g -485
+y c -485
+y d -485
+y a -485
+y q -485
+a v -485
+a y -485
+a w -485
+w o -485
+w g -485
+w c -485
+w d -485
+w a -485
+w q -485
+T S -485
+L a -485
+L S -485
+P s -485
+P Z -485
+P X -485
+P W -485
+C X -485
+C W -485
+V S -485
+S T -485
+S V -485
+S Y -485
+S X -485
+S A -485
+S W -485
+Y S -485
+X a -485
+X u -485
+X S -485
+A t -485
+A g -485
+A c -485
+A d -485
+A a -485
+A u -485
+A q -485
+A S -485
+W S -485
+K c -974
+K u -974
+K S -974
+h w -485
+n w -485
+m w -485
+r o -485
+r c -485
+r e -485
+r d -485
+r a -485
+r q -485
+p w -485
+v e -485
+v s -485
+e w -485
+s v -485
+s y -485
+s w -485
+y e -485
+y s -485
+w e -485
+w s -485
+k o -485
+k g -485
+k c -485
+k e -485
+k d -485
+k a -485
+k q -485
+O Z -485
+L J -485
+C Z -485
+Z o -485
+Z e -485
+Z d -485
+Z s -485
+Z y -485
+Z a -485
+Z w -485
+Z u -485
+Z O -485
+Z G -485
+Z C -485
+Z S -485
+Z J -485
+Z Q -485
+D Z -485
+B Z -485
+S Z -485
+X J -485
+A s -485
+A J -485
+K a -974
+K J -974
+K . -485
+K , -485
+r s -485
+k s -485
+K T -485
+K V -485
+K Y -485
+K W -485
+K U -485
+L cq -5363
+L ' -5363
+T hy -3413
+T - -3413
+T en -3413
+T em -3413
+A cq -1460
+A ' -1460
+hy T -3413
+- T -3413
+en T -3413
+em T -3413
+Y hy -974
+Y - -974
+Y en -974
+Y em -974
+p cq -974
+p ' -974
+c cq -974
+c ' -974
+e cq -974
+e ' -974
+b cq -974
+b ' -974
+a cq -1460
+a ' -1460
+V hy -485
+V - -485
+V en -485
+V em -485
+h cq -1460
+h ' -1460
+n cq -1460
+n ' -1460
+m cq -1460
+m ' -1460
+W hy -485
+W - -485
+W en -485
+W em -485
+cq d -1949
+' d -1949
+s cq -485
+s ' -485
+L hy -1949
+L - -1949
+L en -1949
+L em -1949
+X hy -485
+X - -485
+X en -485
+X em -485
+A hy -485
+A - -485
+A en -485
+A em -485
+K hy -974
+K - -974
+K en -974
+K em -974
+cq s -485
+' s -485
+hy X -485
+- X -485
+hy A -485
+- A -485
+en X -485
+en A -485
+em X -485
+K cq -485
+K ' -485
+Z hy -485
+Z - -485
+Z en -485
+Z em -485
+charset
+! 7806,18135 2 161057 -- MSL 1 (19U 33)
+dq 9759,18135 2 161058 -- MSL 2 (19U 34)
+" "
+sh 12198,18360,975 2 161059 -- MSL 3 (19U 35)
+# "
+Do 12198,18360,630 2 161060 -- MSL 4 (19U 36)
+$ "
+% 17565,18675,975 2 161061 -- MSL 5 (19U 37)
+& 16101,18390,255 2 161062 -- MSL 6 (19U 38)
+cq 5856,18135 2 161170 -- MSL 8 (19U 146)
+' "
+( 5856,18135,2520 2 161064 -- MSL 9 (19U 40)
+) 5856,18135,2520 2 161065 -- MSL 10 (19U 41)
+* 12198,18390 2 161066 -- MSL 11 (19U 42)
++ 17565,12495 0 161067 -- MSL 12 (19U 43)
+, 5856,2970,2730 0 161068 -- MSL 13 (19U 44)
+hy 5856,7560 0 161069 -- MSL 14 (19U 45)
+- "
+. 5856,2760 0 161070 -- MSL 15 (19U 46)
+sl 5856,18165,1980 2 161071 -- MSL 16 (19U 47)
+/ "
+0 12198,18360,255 2 161072 -- MSL 17 (19U 48)
+1 12198,18105 2 161073 -- MSL 18 (19U 49)
+2 12198,18360 2 161074 -- MSL 19 (19U 50)
+3 12198,18360,255 2 161075 -- MSL 20 (19U 51)
+4 12198,18105 2 161076 -- MSL 21 (19U 52)
+5 12198,18105,255 2 161077 -- MSL 22 (19U 53)
+6 12198,18360,255 2 161078 -- MSL 23 (19U 54)
+7 12198,18105 2 161079 -- MSL 24 (19U 55)
+8 12198,18360,255 2 161080 -- MSL 25 (19U 56)
+9 12198,18360,255 2 161081 -- MSL 26 (19U 57)
+: 5856,12333 0 161082 -- MSL 27 (19U 58)
+; 5856,12333,2730 0 161083 -- MSL 28 (19U 59)
+< 26346,16068 0 161084 -- MSL 29 (19U 60)
+= 17565,9570 0 161085 -- MSL 30 (19U 61)
+> 26346,16068 0 161086 -- MSL 31 (19U 62)
+? 11220,18390 2 161087 -- MSL 32 (19U 63)
+at 17565,18438,3246 2 161088 -- MSL 33 (19U 64)
+@ "
+A 13662,18135 2 161089 -- MSL 34 (19U 65)
+B 13173,18135 2 161090 -- MSL 35 (19U 66)
+C 13173,18390,255 2 161091 -- MSL 36 (19U 67)
+D 13662,18135 2 161092 -- MSL 37 (19U 68)
+E 11220,18135 2 161093 -- MSL 38 (19U 69)
+F 10734,18135 2 161094 -- MSL 39 (19U 70)
+G 13662,18390,255 2 161095 -- MSL 40 (19U 71)
+H 13662,18135 2 161096 -- MSL 41 (19U 72)
+I 5856,18135 2 161097 -- MSL 42 (19U 73)
+J 11220,18135,255 2 161098 -- MSL 43 (19U 74)
+K 13173,18135 2 161099 -- MSL 44 (19U 75)
+L 10245,18135 2 161100 -- MSL 45 (19U 76)
+M 18051,18135 2 161101 -- MSL 46 (19U 77)
+N 14148,18135 2 161102 -- MSL 47 (19U 78)
+O 13662,18390,255 2 161103 -- MSL 48 (19U 79)
+P 12198,18135 2 161104 -- MSL 49 (19U 80)
+Q 13662,18390,255 2 161105 -- MSL 50 (19U 81)
+R 13173,18135 2 161106 -- MSL 51 (19U 82)
+S 12684,18390,255 2 161107 -- MSL 52 (19U 83)
+T 12684,18135 2 161108 -- MSL 53 (19U 84)
+U 13662,18135,255 2 161109 -- MSL 54 (19U 85)
+V 12198,18135 2 161110 -- MSL 55 (19U 86)
+W 18051,18135 2 161111 -- MSL 56 (19U 87)
+X 13662,18135 2 161112 -- MSL 57 (19U 88)
+Y 12198,18135 2 161113 -- MSL 58 (19U 89)
+Z 12198,18135 2 161114 -- MSL 59 (19U 90)
+lB 5856,18135,2520 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 5856,18165,1980 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 5856,18135,2520 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588 1 161119 -- MSL 64 (19U 95)
+oq 5856,18135 2 161169 -- MSL 66 (19U 145)
+` "
+a 10734,12885,255 0 161121 -- MSL 67 (19U 97)
+b 10734,18165,255 2 161122 -- MSL 68 (19U 98)
+c 10245,12885,255 0 161123 -- MSL 69 (19U 99)
+d 10734,18165,255 2 161124 -- MSL 70 (19U 100)
+e 10245,12885,255 0 161125 -- MSL 71 (19U 101)
+f 7806,18315 2 161126 -- MSL 72 (19U 102)
+g 10734,12885,4995 1 161127 -- MSL 73 (19U 103)
+h 10734,18165 2 161128 -- MSL 74 (19U 104)
+i 4878,18165 2 161129 -- MSL 75 (19U 105)
+j 4878,18165,4995 3 161130 -- MSL 76 (19U 106)
+k 10734,18165 2 161131 -- MSL 77 (19U 107)
+l 4878,18165 2 161132 -- MSL 78 (19U 108)
+m 16101,12885 0 161133 -- MSL 79 (19U 109)
+n 10734,12885 0 161134 -- MSL 80 (19U 110)
+o 10734,12885,255 0 161135 -- MSL 81 (19U 111)
+p 10734,12885,4680 1 161136 -- MSL 82 (19U 112)
+q 10734,12885,4680 1 161137 -- MSL 83 (19U 113)
+r 7317,12885 0 161138 -- MSL 84 (19U 114)
+s 9759,12885,255 0 161139 -- MSL 85 (19U 115)
+t 7806,15954,255 0 161140 -- MSL 86 (19U 116)
+u 10734,12630,255 0 161141 -- MSL 87 (19U 117)
+v 10245,12630 0 161142 -- MSL 88 (19U 118)
+w 17076,12630 0 161143 -- MSL 89 (19U 119)
+x 10245,12630 0 161144 -- MSL 90 (19U 120)
+y 10734,12630,4680 1 161145 -- MSL 91 (19U 121)
+z 8781,12630 0 161146 -- MSL 92 (19U 122)
+{ 11709,20130,6075 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588 3 161148 -- MSL 94 (19U 124)
+ba "
+} 11709,20130,6075 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,8952 0 161150 -- MSL 96 (19U 126)
+`A 13662,23640 2 161216 -- MSL 99 (19U 192)
+^A 13662,23415 2 161218 -- MSL 100 (19U 194)
+`E 11220,23640 2 161224 -- MSL 101 (19U 200)
+^E 11220,23415 2 161226 -- MSL 102 (19U 202)
+:E 11220,22710 2 161227 -- MSL 103 (19U 203)
+^I 5856,23415 2 161230 -- MSL 104 (19U 206)
+:I 5856,22710 2 161231 -- MSL 105 (19U 207)
+aa 12198,18165 2 161204 -- MSL 106 (19U 180)
+ga 12198,18165 2 161120 -- MSL 107 (19U 96)
+a^ 12198,17940 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 12198,17355 2 161192 -- MSL 109 (19U 168)
+~ 12198,17844 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 13662,23640,255 2 161241 -- MSL 111 (19U 217)
+^U 13662,23415,255 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105 2 161199 -- MSL 113 (19U 175)
+'Y 12198,23640 2 161245 -- MSL 114 (19U 221)
+'y 10734,18165,4680 3 161277 -- MSL 115 (19U 253)
+de 12198,18360 2 161200 -- MSL 116 (19U 176)
+,C 13173,18390,4755 3 161223 -- MSL 117 (19U 199)
+,c 10245,12885,4755 1 161255 -- MSL 118 (19U 231)
+~N 14148,23121 2 161233 -- MSL 119 (19U 209)
+~n 10734,17844 2 161265 -- MSL 120 (19U 241)
+r! 7806,12591,5544 1 161185 -- MSL 121 (19U 161)
+r? 11220,12480,5910 1 161215 -- MSL 122 (19U 191)
+Cs 12198,15684 0 161188 -- MSL 123 (19U 164)
+Po 12198,18360 2 161187 -- MSL 124 (19U 163)
+Ye 12198,18105 2 161189 -- MSL 125 (19U 165)
+sc 12198,18390,255 2 161191 -- MSL 126 (19U 167)
+Fn 12198,18315 2 161155 -- MSL 127 (19U 131)
+ct 12198,18360,630 2 161186 -- MSL 128 (19U 162)
+^a 10734,17940,255 2 161250 -- MSL 129 (19U 226)
+^e 10245,17940,255 2 161258 -- MSL 130 (19U 234)
+^o 10734,17940,255 2 161268 -- MSL 131 (19U 244)
+^u 10734,17940,255 2 161275 -- MSL 132 (19U 251)
+'a 10734,18165,255 2 161249 -- MSL 133 (19U 225)
+'e 10245,18165,255 2 161257 -- MSL 134 (19U 233)
+'o 10734,18165,255 2 161267 -- MSL 135 (19U 243)
+'u 10734,18165,255 2 161274 -- MSL 136 (19U 250)
+`a 10734,18165,255 2 161248 -- MSL 137 (19U 224)
+`e 10245,18165,255 2 161256 -- MSL 138 (19U 232)
+`o 10734,18165,255 2 161266 -- MSL 139 (19U 242)
+`u 10734,18165,255 2 161273 -- MSL 140 (19U 249)
+:a 10734,17355,255 2 161252 -- MSL 141 (19U 228)
+:e 10245,17355,255 2 161259 -- MSL 142 (19U 235)
+:o 10734,17355,255 2 161270 -- MSL 143 (19U 246)
+:u 10734,17355,255 2 161276 -- MSL 144 (19U 252)
+oA 13662,24480 2 161221 -- MSL 145 (19U 197)
+^i 5856,17940 2 161262 -- MSL 146 (19U 238)
+/O 13662,19767,1851 2 161240 -- MSL 147 (19U 216)
+AE 18540,18135 2 161222 -- MSL 148 (19U 198)
+oa 10734,19005,255 2 161253 -- MSL 149 (19U 229)
+'i 5856,18165 2 161261 -- MSL 150 (19U 237)
+/o 10734,14274,2115 0 161272 -- MSL 151 (19U 248)
+ae 16587,12885,255 0 161254 -- MSL 152 (19U 230)
+:A 13662,22710 2 161220 -- MSL 153 (19U 196)
+`i 5856,18165 2 161260 -- MSL 154 (19U 236)
+:O 13662,22710,255 2 161238 -- MSL 155 (19U 214)
+:U 13662,22710,255 2 161244 -- MSL 156 (19U 220)
+'E 11220,23640 2 161225 -- MSL 157 (19U 201)
+:i 5856,17355 2 161263 -- MSL 158 (19U 239)
+ss 11709,18315,255 2 161247 -- MSL 159 (19U 223)
+^O 13662,23415,255 2 161236 -- MSL 160 (19U 212)
+'A 13662,23640 2 161217 -- MSL 161 (19U 193)
+~A 13662,23121 2 161219 -- MSL 162 (19U 195)
+~a 10734,17844,255 2 161251 -- MSL 163 (19U 227)
+-D 13662,18135 2 161232 -- MSL 164 (19U 208)
+Sd 10734,18531,255 2 161264 -- MSL 165 (19U 240)
+'I 5856,23640 2 161229 -- MSL 166 (19U 205)
+`I 5856,23640 2 161228 -- MSL 167 (19U 204)
+'O 13662,23640,255 2 161235 -- MSL 168 (19U 211)
+`O 13662,23640,255 2 161234 -- MSL 169 (19U 210)
+~O 13662,23121,255 2 161237 -- MSL 170 (19U 213)
+~o 10734,17844,255 2 161269 -- MSL 171 (19U 245)
+vS 12684,23415,255 2 161162 -- MSL 172 (19U 138)
+vs 9759,17940,255 2 161178 -- MSL 173 (19U 154)
+'U 13662,23640,255 2 161242 -- MSL 174 (19U 218)
+:Y 12198,22710 2 161183 -- MSL 175 (19U 159)
+:y 10734,17355,4680 3 161279 -- MSL 176 (19U 255)
+TP 12198,18135 2 161246 -- MSL 177 (19U 222)
+Tp 10734,18165,4680 3 161278 -- MSL 178 (19U 254)
+mc 14637,12630,4350 0 161205 -- MSL 180 (19U 181)
+ps 12198,19635,4200 2 161206 -- MSL 181 (19U 182)
+34 17565,18675,975 2 161214 -- MSL 182 (19U 190)
+\- 17565,8175 0 60096 -- MSL 183 ( 7J 192)
+14 17565,18675,975 2 161212 -- MSL 184 (19U 188)
+12 17565,18675,975 2 161213 -- MSL 185 (19U 189)
+Of 7317,18360 2 161194 -- MSL 186 (19U 170)
+Om 7317,18360 2 161210 -- MSL 187 (19U 186)
+Fo 11709,11010 0 161195 -- MSL 188 (19U 171)
+Fc 11709,11010 0 161211 -- MSL 190 (19U 187)
+t+- 17565,12210,213 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916 3 161190 -- MSL 192 (19U 166)
+co 13173,19635 2 161193 -- MSL 193 (19U 169)
+tno 17565,10185 0 161196 -- MSL 194 (19U 172)
+u00AD 5856,7560 0 161197 -- MSL 195 (19U 173)
+rg 13173,19635 2 161198 -- MSL 196 (19U 174)
+S2 7317,18465 2 161202 -- MSL 197 (19U 178)
+S3 7317,18465 2 161203 -- MSL 198 (19U 179)
+ac 12198,0,4755 1 161208 -- MSL 199 (19U 184)
+S1 7317,18345 2 161209 -- MSL 200 (19U 185)
+tmu 17565,12216 0 161239 -- MSL 201 (19U 215)
+tdi 17565,11610 0 161271 -- MSL 202 (19U 247)
+u203C 11709,18135 2 87315 -- MSL 221 (10U 19)
+u20A7 20004,18135,255 2 60121 -- MSL 232 ( 7J 217)
+pc 5856,10755 0 161207 -- MSL 302 (19U 183)
+u013F 10245,18135 2 51943 -- MSL 306 ( 6J 231)
+u0140 7788,18165 2 51959 -- MSL 307 ( 6J 247)
+u2113 12684,18150,297 2 60122 -- MSL 308 ( 7J 218)
+u0149 15612,18135 2 51951 -- MSL 309 ( 6J 239)
+fm 5856,18105 2 60101 -- MSL 310 ( 7J 197)
+sd 12198,18105 2 60102 -- MSL 311 ( 7J 198)
+dg 12198,18135 2 161158 -- MSL 312 (19U 134)
+tm 16101,17850 2 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588 1 60095 -- MSL 314 ( 7J 191)
+ah 12198,17940 2 75169 -- MSL 315 ( 9E 161)
+ao 12198,19005 2 60152 -- MSL 316 ( 7J 248)
+f/ 2439,18675,975 2 60109 -- MSL 324 ( 7J 205)
+em 17565,7350 0 161175 -- MSL 325 (19U 151)
+en 12198,7350 0 161174 -- MSL 326 (19U 150)
+dd 12198,18135 2 161159 -- MSL 327 (19U 135)
+.i 5856,12630 0 46333 -- MSL 328 ( 5T 253)
+aq 5856,18135 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226 0 161173 -- MSL 331 (19U 149)
+u207F 7317,18465 2 87548 -- MSL 332 (10U 252)
+u0111 10734,18165,255 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 13662,23415 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 10734,17940,255 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 13662,18135,4668 3 75173 -- MSL 404 ( 9E 165)
+u0061_0328 10734,12885,4077 0 75193 -- MSL 405 ( 9E 185)
+'C 13173,23640,255 2 75206 -- MSL 406 ( 9E 198)
+'c 10245,18165,255 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 13173,23415,255 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 10245,17940,255 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 13662,23415 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 13662,18165,255 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 11220,23415 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 10245,17940,255 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 11220,18135,4668 3 75210 -- MSL 422 ( 9E 202)
+u0065_0328 10245,12885,4077 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 10245,23640 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 4878,23385 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 10245,18165 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 7806,18165 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 14148,23640 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 10734,18165 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 14148,23415 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 10734,17940 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 13662,23640,255 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 10734,18165,255 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 13173,23640 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 7317,18165 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 13173,23415 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 7317,17940 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 12684,23640,255 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 9759,18165,255 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 12684,23415 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 8781,18165,255 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 12684,18135,4755 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 7806,15954,4755 1 75262 -- MSL 469 ( 9E 254)
+u0055_030B 13662,23640,255 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 10734,18165,255 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 13662,24480,255 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 10734,19005,255 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 12198,23640 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 8781,18165 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 12198,22905 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 8781,17700 2 75199 -- MSL 485 ( 9E 191)
+u2070 7317,18465 2 51753 -- MSL 1000 ( 6J 41)
+u2074 7317,18345 2 51748 -- MSL 1001 ( 6J 36)
+u2075 7317,18345 2 51749 -- MSL 1002 ( 6J 37)
+u2076 7317,18465 2 51806 -- MSL 1003 ( 6J 94)
+u2077 7317,18345 2 51750 -- MSL 1004 ( 6J 38)
+u2078 7317,18465 2 51754 -- MSL 1005 ( 6J 42)
+u2079 7317,18465 2 51752 -- MSL 1006 ( 6J 40)
+lq 9270,18135 2 161171 -- MSL 1017 (19U 147)
+rq 9270,18135 2 161172 -- MSL 1018 (19U 148)
+Bq 9270,3006,2694 0 161156 -- MSL 1019 (19U 132)
+u2003 17565,0 0 51821 -- MSL 1020 ( 6J 109)
+u2002 12198,0 0 51822 -- MSL 1021 ( 6J 110)
+u2009 5856,0 0 51828 -- MSL 1023 ( 6J 116)
+u2026 17565,2310 0 161157 -- MSL 1028 (19U 133)
+vz 8781,17940 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16101,18000 2 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056 2 51794 -- MSL 1036 ( 6J 82)
+fi 12198,18315 2 60077 -- MSL 1040 ( 7J 173)
+fl 12684,18315 2 60078 -- MSL 1041 ( 7J 174)
+ff 13662,18315 2 51883 -- MSL 1042 ( 6J 171)
+Fi 17826,18315 2 51884 -- MSL 1043 ( 6J 172)
+Fl 17694,18315 2 51885 -- MSL 1044 ( 6J 173)
+ij 9759,18165,4995 3 60134 -- MSL 1047 ( 7J 230)
+u2105 18540,18390,255 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 13662,23415,255 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 10734,17940,4995 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 12684,18390,4755 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 9759,12885,4755 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 5856,22905 2 46301 -- MSL 1065 ( 5T 221)
+bq 5856,3006,2694 0 161154 -- MSL 1067 (19U 130)
+%0 22443,18675,975 2 161161 -- MSL 1068 (19U 137)
+a- 12198,16440 0 60154 -- MSL 1084 ( 7J 250)
+ab 12198,17940 2 75170 -- MSL 1086 ( 9E 162)
+a. 12198,17700 2 75263 -- MSL 1088 ( 9E 255)
+oe 16587,12885,255 0 161180 -- MSL 1090 (19U 156)
+OE 18051,18270,135 2 161164 -- MSL 1091 (19U 140)
+fo 6342,11010 0 161163 -- MSL 1092 (19U 139)
+fc 6342,11010 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624 0 60091 -- MSL 1094 ( 7J 187)
+/L 10245,18135 2 75171 -- MSL 1095 ( 9E 163)
+/l 4878,18165 2 75187 -- MSL 1096 ( 9E 179)
+a" 12198,18165 2 75197 -- MSL 1097 ( 9E 189)
+ho 12198,363,4077 0 75186 -- MSL 1098 ( 9E 178)
+vZ 12198,23415 2 75150 -- MSL 1106 ( 9E 142)
+IJ 17076,18135,255 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/UI b/font/devlj4/UI
new file mode 100644
index 0000000..e200e32
--- /dev/null
+++ b/font/devlj4/UI
@@ -0,0 +1,950 @@
+# Univers MdIt
+name UI
+spacewidth 8781
+slant 16.500000
+pcltypeface 4148
+pclproportional 1
+pclweight 0
+pclstyle 1
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -5852
+P . -5363
+P , -5363
+V A -3413
+A V -4388
+T o -4388
+T r -4388
+T c -4388
+T e -4388
+T d -4388
+T s -4388
+T y -4388
+T a -4388
+T w -4388
+T u -4388
+T J -4388
+L T -4388
+L Y -4877
+Y o -3902
+Y e -3902
+Y a -3413
+Y J -3902
+A W -3902
+W A -1949
+T A -3413
+V o -2438
+V e -2438
+V a -2438
+Y A -3413
+F A -2924
+F . -3902
+F , -3902
+A T -4388
+A Y -4388
+v . -3902
+v , -3902
+y . -3902
+y , -3902
+T . -3902
+T , -3902
+L W -3902
+P A -2438
+V J -2438
+V . -3902
+V , -3902
+Y . -3902
+Y , -3902
+W o -974
+W e -974
+W a -974
+W . -2924
+W , -2924
+r . -2438
+r , -2438
+w . -3413
+w , -3413
+Y u -2438
+A v -2924
+A y -2438
+A w -2438
+o . -2438
+o , -2438
+p . -2438
+p , -2438
+e . -1949
+e , -1949
+b . -2438
+b , -2438
+O T -2438
+O V -1949
+O Y -2438
+O . -1949
+O , -1949
+L y -2924
+L O -2438
+L G -1949
+L C -1949
+L Q -1460
+P J -974
+V y -1460
+V u -1460
+V O -974
+V G -974
+V C -974
+V Q -974
+D T -2438
+D V -1949
+D Y -2438
+D . -1949
+D , -1949
+Y O -974
+Y G -974
+Y C -974
+Y Q -974
+F o -1460
+F e -1460
+F a -974
+c . -1949
+c , -1949
+O A -974
+O W -974
+L U -1460
+R T -1460
+R V -1460
+R Y -1460
+R W -974
+G T -1949
+P o -974
+P g -974
+P e -974
+P a -974
+C A -974
+C . -1949
+C , -1949
+D A -974
+D W -974
+B T -1460
+B Y -1460
+B . -1949
+B , -1949
+F J -1460
+A O -1460
+A G -1460
+A C -1460
+A U -1460
+A Q -1460
+W r -485
+W y -485
+W u -485
+W O -485
+W G -485
+W C -485
+W J -974
+W Q -485
+J A -1460
+J . -2438
+J , -2438
+U A -974
+U . -1949
+U , -1949
+Q W -974
+f . -1949
+f , -1949
+T O -974
+T G -974
+T C -974
+T Q -974
+O X -974
+L o -1949
+L e -1949
+L q -1949
+G V -1949
+G Y -1949
+G W -974
+G . -1460
+G , -1460
+P T -1460
+P V -1460
+P Y -1460
+C T -1460
+C V -1460
+C Y -1460
+D X -974
+B V -1460
+B X -974
+B A -974
+B W -974
+S . -1949
+S , -1949
+X o -1460
+X e -1460
+X y -1460
+X O -1460
+X G -1460
+X C -1460
+X Q -1460
+A o -1460
+A e -1460
+K o -974
+K e -974
+K y -974
+K w -974
+K O -974
+K G -974
+K C -974
+K Q -974
+o v -1460
+o y -974
+o x -1460
+o w -974
+h v -1460
+h y -974
+n v -1460
+n y -974
+m v -1460
+m y -974
+r g -485
+g . -974
+g , -974
+p v -1460
+p y -974
+p x -1460
+c v -1460
+c y -974
+c w -974
+v o -974
+v g -974
+v c -974
+v d -974
+v a -974
+v q -974
+e v -1460
+e y -974
+b v -1460
+b y -974
+b w -974
+s . -1460
+s , -1460
+y o -974
+y g -974
+y c -974
+y d -974
+y a -974
+y q -974
+f g -485
+x o -1460
+x g -1460
+x c -1460
+x e -1460
+x d -1460
+x a -1460
+x q -1460
+a v -1460
+a y -974
+a w -974
+w o -974
+w g -974
+w c -974
+w d -974
+w a -974
+w q -974
+T i -974
+T S -974
+L a -1460
+L S -1460
+G X -485
+G A -485
+P s -485
+P Z -974
+P X -1460
+P W -974
+C X -974
+C W -974
+V i -974
+V S -974
+S T -1460
+S V -1460
+S Y -1460
+S X -974
+S A -974
+S W -974
+Y i -974
+Y S -974
+X a -1460
+X u -1460
+X S -1460
+A t -974
+A g -1460
+A c -1460
+A d -1460
+A a -1460
+A u -1460
+A q -1460
+A S -1460
+W i -485
+W S -485
+K c -974
+K u -974
+K S -974
+t g -485
+t . -974
+t , -974
+h w -974
+h . -974
+h , -974
+n w -974
+n . -974
+n , -974
+m w -974
+m . -974
+m , -974
+l . -974
+l , -974
+r o -485
+r c -485
+r e -485
+r d -485
+r a -485
+r q -485
+i . -974
+i , -974
+p w -974
+c x -974
+v e -974
+v s -485
+e x -974
+e w -974
+z . -974
+z , -974
+d . -974
+d , -974
+s v -974
+s y -974
+s x -485
+s w -974
+y e -974
+y s -485
+f o -485
+f c -485
+f e -485
+f d -485
+f s -485
+f a -485
+f q -485
+x s -974
+x . -974
+x , -974
+a . -974
+a , -974
+w e -974
+w s -485
+j . -974
+j , -974
+u . -974
+k o -485
+k g -485
+k c -485
+k e -485
+k d -485
+k a -485
+k q -485
+k . -974
+k , -974
+O Z -974
+H . -974
+H , -974
+N . -974
+N , -974
+M . -974
+M , -974
+L J -974
+L . -974
+L , -974
+R . -974
+R , -974
+G Z -485
+I . -974
+I , -974
+C Z -974
+E . -974
+E , -974
+Z o -974
+Z e -974
+Z d -974
+Z s -974
+Z y -974
+Z a -974
+Z w -974
+Z u -974
+Z O -974
+Z G -974
+Z C -974
+Z S -974
+Z J -974
+Z Q -974
+Z . -974
+Z , -974
+D Z -974
+B Z -974
+S Z -974
+X J -974
+X . -974
+X , -974
+A s -974
+A J -974
+A . -974
+A , -974
+K a -974
+K J -974
+K . -974
+K , -974
+t o -485
+t c -485
+t e -485
+t d -485
+t s -485
+t a -485
+t q -485
+o t -485
+o z -485
+h t -485
+n t -485
+m t -485
+r s -485
+p t -485
+p z -485
+c t -485
+c z -485
+e t -485
+e z -485
+z o -485
+z g -485
+z c -485
+z e -485
+z d -485
+z s -485
+z a -485
+z q -485
+b t -485
+b z -485
+s t -485
+s z -485
+x t -485
+x v -485
+x y -485
+x w -485
+x u -485
+a t -485
+k s -485
+X T -485
+X V -485
+X Y -485
+X W -485
+X U -485
+K T -485
+K V -485
+K Y -485
+K W -485
+K U -485
+L cq -7316
+L ' -7316
+T hy -4388
+T - -4388
+T en -4388
+T em -4388
+A cq -3902
+A ' -3902
+hy T -4388
+- T -4388
+en T -4388
+em T -4388
+Y hy -2438
+Y - -2438
+Y en -2438
+Y em -2438
+p cq -2924
+p ' -2924
+c cq -2924
+c ' -2924
+e cq -2924
+e ' -2924
+b cq -2924
+b ' -2924
+a cq -2924
+a ' -2924
+V hy -1460
+V - -1460
+V en -1460
+V em -1460
+h cq -2438
+h ' -2438
+n cq -2438
+n ' -2438
+m cq -2438
+m ' -2438
+R cq -974
+R ' -974
+W hy -485
+W - -485
+W en -485
+W em -485
+cq d -2924
+' d -2924
+s cq -1949
+s ' -1949
+L hy -1949
+L - -1949
+L en -1949
+L em -1949
+X hy -1460
+X - -1460
+X en -1460
+X em -1460
+A hy -1460
+A - -1460
+A en -1460
+A em -1460
+K hy -974
+K - -974
+K en -974
+K em -974
+cq s -1949
+' s -1949
+hy X -1460
+- X -1460
+hy A -1460
+- A -1460
+en X -1460
+en A -1460
+em X -1460
+x cq -1460
+x ' -1460
+X cq -1460
+X ' -1460
+K cq -1460
+K ' -1460
+t g -485
+t cq -974
+t ' -974
+l cq -974
+l ' -974
+r cq -974
+r ' -974
+g cq -974
+g ' -974
+i cq -974
+i ' -974
+v cq -974
+v ' -974
+z cq -974
+z ' -974
+d cq -974
+d ' -974
+y cq -974
+y ' -974
+f cq -974
+f ' -974
+w cq -974
+w ' -974
+j cq -974
+j ' -974
+u cq -974
+u ' -974
+k cq -974
+k ' -974
+T cq -974
+T ' -974
+O cq -974
+O ' -974
+H cq -974
+H ' -974
+N cq -974
+N ' -974
+M cq -974
+M ' -974
+G cq -974
+G ' -974
+I cq -974
+I ' -974
+P cq -974
+P ' -974
+C cq -974
+C ' -974
+V cq -974
+V ' -974
+E cq -974
+E ' -974
+Z cq -974
+Z ' -974
+Z hy -974
+Z - -974
+Z en -974
+Z em -974
+D cq -974
+D ' -974
+B cq -974
+B ' -974
+S cq -974
+S ' -974
+Y cq -974
+Y ' -974
+F cq -974
+F ' -974
+W cq -974
+W ' -974
+J cq -974
+J ' -974
+U cq -974
+U ' -974
+cq t -1460
+' t -1460
+cq n -1460
+' n -1460
+cq m -1460
+' m -1460
+cq l -974
+' l -974
+cq r -1460
+' r -1460
+cq v -1460
+' v -1460
+cq T -974
+' T -974
+cq N -974
+' N -974
+cq M -974
+' M -974
+cq L -974
+' L -974
+cq R -974
+' R -974
+cq D -974
+' D -974
+x hy -485
+x - -485
+x en -485
+x em -485
+charset
+! 8781,18165,0,1956,81,1000 2 161057 -- MSL 1 (19U 33)
+dq 13173,18246,0,2049,-4232,1000 2 161058 -- MSL 2 (19U 34)
+" "
+sh 16587,18105,0,1020,-1136,1000 2 161059 -- MSL 3 (19U 35)
+# "
+Do 16587,18750,765,0,-2390 2 161060 -- MSL 4 (19U 36)
+$ "
+% 26346,18720,840,0,-3194 2 161061 -- MSL 5 (19U 37)
+& 20004,18495,360,0,-941 2 161062 -- MSL 6 (19U 38)
+cq 8781,18135,0,3114,-2750,1000 2 161170 -- MSL 8 (19U 146)
+' "
+( 8781,18135,2397,2823,-1442,1000 2 161064 -- MSL 9 (19U 40)
+) 8781,18135,2397,0,1764 2 161065 -- MSL 10 (19U 41)
+* 16587,18495,0,0,-4154 2 161066 -- MSL 11 (19U 42)
++ 26346,14745,105,0,-4859 0 161067 -- MSL 12 (19U 43)
+, 8781,3000,3135,0,1794 0 161068 -- MSL 13 (19U 44)
+hy 8781,7680,0,561,147,561 0 161069 -- MSL 14 (19U 45)
+- "
+. 8781,2970,0,0,192 0 161070 -- MSL 15 (19U 46)
+sl 8781,18135,1500,4326,3072,1000 2 161071 -- MSL 16 (19U 47)
+/ "
+0 16587,18465,360,1602,-242,1000 2 161072 -- MSL 17 (19U 48)
+1 16587,18105,0,0,-4466 2 161073 -- MSL 18 (19U 49)
+2 16587,18465,0,540,78,540 2 161074 -- MSL 19 (19U 50)
+3 16587,18465,360,1374,-353,1000 2 161075 -- MSL 20 (19U 51)
+4 16587,18105,0,843,609,843 2 161076 -- MSL 21 (19U 52)
+5 16587,18105,360,1494,-395,1000 2 161077 -- MSL 22 (19U 53)
+6 16587,18465,360,1632,-965,1000 2 161078 -- MSL 23 (19U 54)
+7 16587,18105,0,1188,-2582,1000 2 161079 -- MSL 24 (19U 55)
+8 16587,18465,360,1356,-176,1000 2 161080 -- MSL 25 (19U 56)
+9 16587,18465,360,630,171,630 2 161081 -- MSL 26 (19U 57)
+: 8781,12615,0,330,192,330 0 161082 -- MSL 27 (19U 58)
+; 8781,12615,3135,405,1794,405 0 161083 -- MSL 28 (19U 59)
+< 26346,16068,0,0,-3980 0 161084 -- MSL 29 (19U 60)
+= 26346,10500,0,0,-4949 0 161085 -- MSL 30 (19U 61)
+> 26346,16068,0,0,-3980 0 161086 -- MSL 31 (19U 62)
+? 13662,18315,0,1380,-1016,1000 2 161087 -- MSL 32 (19U 63)
+at 26349,21030,2745,243,-1712,243 2 161088 -- MSL 33 (19U 64)
+@ "
+A 19515,18135,0,0,2400 2 161089 -- MSL 34 (19U 65)
+B 16587,18135,0,1641,684,1000 2 161090 -- MSL 35 (19U 66)
+C 18540,18495,360,1554,-989,1000 2 161091 -- MSL 36 (19U 67)
+D 19029,18135,0,477,804,477 2 161092 -- MSL 37 (19U 68)
+E 15126,18135,0,3099,699,1000 2 161093 -- MSL 38 (19U 69)
+F 14637,18135,0,3549,702,1000 2 161094 -- MSL 39 (19U 70)
+G 19515,18495,360,1095,-1046,1000 2 161095 -- MSL 40 (19U 71)
+H 19029,18135,0,2322,852,1000 2 161096 -- MSL 41 (19U 72)
+I 7317,18135,0,2439,852,1000 2 161097 -- MSL 42 (19U 73)
+J 14637,18135,360,2559,1242,1000 2 161098 -- MSL 43 (19U 74)
+K 17565,18135,0,2910,417,1000 2 161099 -- MSL 44 (19U 75)
+L 14148,18135,0,0,693 2 161100 -- MSL 45 (19U 76)
+M 23907,18135,0,2115,669,1000 2 161101 -- MSL 46 (19U 77)
+N 19029,18135,0,2688,750,1000 2 161102 -- MSL 47 (19U 78)
+O 20004,18495,360,582,-947,582 2 161103 -- MSL 48 (19U 79)
+P 15612,18135,0,2715,708,1000 2 161104 -- MSL 49 (19U 80)
+Q 20490,18495,360,168,-1079,168 2 161105 -- MSL 50 (19U 81)
+R 17076,18135,0,1728,729,1000 2 161106 -- MSL 51 (19U 82)
+S 17076,18495,360,1455,-20,1000 2 161107 -- MSL 52 (19U 83)
+T 16587,18135,0,3801,-2426,1000 2 161108 -- MSL 53 (19U 84)
+U 19029,18135,360,2250,-800,1000 2 161109 -- MSL 54 (19U 85)
+V 19029,18135,0,3789,-2918,1000 2 161110 -- MSL 55 (19U 86)
+W 26346,18135,0,4122,-2540,1000 2 161111 -- MSL 56 (19U 87)
+X 19029,18135,0,3081,1605,1000 2 161112 -- MSL 57 (19U 88)
+Y 18051,18135,0,3720,-2762,1000 2 161113 -- MSL 58 (19U 89)
+Z 16101,18135,0,2598,1719,1000 2 161114 -- MSL 59 (19U 90)
+lB 8781,18135,2397,3690,1038,1000 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 8781,18135,1500,0,-2546 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 8781,18135,2397,2013,2715,1000 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758,0,36,36,36 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588,1317,1317,1000 1 161119 -- MSL 64 (19U 95)
+oq 8781,18135,0,2658,-2294,1000 2 161169 -- MSL 66 (19U 145)
+` "
+a 14148,12990,360,87,729,87 0 161121 -- MSL 67 (19U 97)
+b 15126,18165,360,129,1092,129 2 161122 -- MSL 68 (19U 98)
+c 14148,12990,360,534,114,534 0 161123 -- MSL 69 (19U 99)
+d 15126,18165,360,2658,144,1000 2 161124 -- MSL 70 (19U 100)
+e 14148,12990,360,567,153,567 0 161125 -- MSL 71 (19U 101)
+f 9759,18315,0,3546,-32,1000 2 161126 -- MSL 72 (19U 102)
+g 15126,12990,5169,1059,1470,1000 1 161127 -- MSL 73 (19U 103)
+h 15126,18165,0,126,1185,126 2 161128 -- MSL 74 (19U 104)
+i 6342,18165,0,3060,1143,1000 2 161129 -- MSL 75 (19U 105)
+j 6342,18165,4995,2970,4578,1000 3 161130 -- MSL 76 (19U 106)
+k 14148,18165,0,1248,1092,1000 2 161131 -- MSL 77 (19U 107)
+l 6342,18165,0,2937,1137,1000 2 161132 -- MSL 78 (19U 108)
+m 22932,12990,0,363,1182,363 0 161133 -- MSL 79 (19U 109)
+n 15126,12990,0,117,1182,117 0 161134 -- MSL 80 (19U 110)
+o 15126,12990,360,12,261,12 0 161135 -- MSL 81 (19U 111)
+p 15126,12990,4680,9,2592,9 1 161136 -- MSL 82 (19U 112)
+q 15126,12990,4680,1146,132,1000 1 161137 -- MSL 83 (19U 113)
+r 9270,12990,0,2499,1026,1000 0 161138 -- MSL 84 (19U 114)
+s 13173,12990,360,579,960,579 0 161139 -- MSL 85 (19U 115)
+t 9759,15843,360,2022,-863,1000 0 161140 -- MSL 86 (19U 116)
+u 15126,12630,360,1023,261,1000 0 161141 -- MSL 87 (19U 117)
+v 14637,12630,0,1902,-1085,1000 0 161142 -- MSL 88 (19U 118)
+w 22932,12630,0,1953,-1577,1000 0 161143 -- MSL 89 (19U 119)
+x 14637,12630,0,1035,1767,1000 0 161144 -- MSL 90 (19U 120)
+y 14637,12630,4680,1992,-962,1000 1 161145 -- MSL 91 (19U 121)
+z 12684,12630,0,1344,1365,1000 0 161146 -- MSL 92 (19U 122)
+{ 11709,20130,6075,3315,-1739,1000 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588,0,-4595 3 161148 -- MSL 94 (19U 124)
+ba "
+} 11709,20130,6075,0,3183 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,8952,0,0,-4028 0 161150 -- MSL 96 (19U 126)
+`A 19515,23100,0,0,2400 2 161216 -- MSL 99 (19U 192)
+^A 19515,23085,0,0,2400 2 161218 -- MSL 100 (19U 194)
+`E 15126,23100,0,3099,699,1000 2 161224 -- MSL 101 (19U 200)
+^E 15126,23085,0,3099,699,1000 2 161226 -- MSL 102 (19U 202)
+:E 15126,22638,0,3099,699,1000 2 161227 -- MSL 103 (19U 203)
+^I 7317,23085,0,5385,852,1000 2 161230 -- MSL 104 (19U 206)
+:I 7317,22638,0,6231,852,1000 2 161231 -- MSL 105 (19U 207)
+aa 16587,17970,0,0,-7478 2 161204 -- MSL 106 (19U 180)
+ga 16587,17970,0,0,-6620 2 161120 -- MSL 107 (19U 96)
+a^ 16587,18105,0,0,-5333 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 16587,17943,0,174,-6260,174 2 161192 -- MSL 109 (19U 168)
+~ 16587,17724,0,312,-5603,312 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 19029,23100,360,2250,-800,1000 2 161241 -- MSL 111 (19U 217)
+^U 19029,23085,360,2250,-800,1000 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105,0,1317,1317,1000 2 161199 -- MSL 113 (19U 175)
+'Y 18051,23100,0,3720,-2762,1000 2 161245 -- MSL 114 (19U 221)
+'y 14637,17970,4680,1992,-962,1000 3 161277 -- MSL 115 (19U 253)
+de 16587,18465,0,0,-4103 2 161200 -- MSL 116 (19U 176)
+,C 18540,18495,4875,1554,-989,1000 3 161223 -- MSL 117 (19U 199)
+,c 14148,12990,4875,534,114,534 1 161255 -- MSL 118 (19U 231)
+~N 19029,23019,0,2688,750,1000 2 161233 -- MSL 119 (19U 209)
+~n 15126,17724,0,1044,1182,1000 2 161265 -- MSL 120 (19U 241)
+r! 8781,12576,5589,54,1983,54 1 161185 -- MSL 121 (19U 161)
+r? 13662,12573,5742,0,921 1 161215 -- MSL 122 (19U 191)
+Cs 16587,15684,0,126,-1532,126 0 161188 -- MSL 123 (19U 164)
+Po 16587,18465,0,2265,291,1000 2 161187 -- MSL 124 (19U 163)
+Ye 16587,18105,0,4818,-1088,1000 2 161189 -- MSL 125 (19U 165)
+sc 16587,18495,360,0,-3749 2 161191 -- MSL 126 (19U 167)
+Fn 16587,18315,0,330,-3527,330 2 161155 -- MSL 127 (19U 131)
+ct 16587,18750,765,0,-2321 2 161186 -- MSL 128 (19U 162)
+^a 14148,18105,360,711,729,711 2 161250 -- MSL 129 (19U 226)
+^e 14148,18105,360,711,153,711 2 161258 -- MSL 130 (19U 234)
+^o 15126,18105,360,222,261,222 2 161268 -- MSL 131 (19U 244)
+^u 15126,18105,360,1023,261,1000 2 161275 -- MSL 132 (19U 251)
+'a 14148,17970,360,690,729,690 2 161249 -- MSL 133 (19U 225)
+'e 14148,17970,360,690,153,690 2 161257 -- MSL 134 (19U 233)
+'o 15126,17970,360,201,261,201 2 161267 -- MSL 135 (19U 243)
+'u 15126,17970,360,1023,261,1000 2 161274 -- MSL 136 (19U 250)
+`a 14148,17970,360,87,729,87 2 161248 -- MSL 137 (19U 224)
+`e 14148,17970,360,567,153,567 2 161256 -- MSL 138 (19U 232)
+`o 15126,17970,360,12,261,12 2 161266 -- MSL 139 (19U 242)
+`u 15126,17970,360,1023,261,1000 2 161273 -- MSL 140 (19U 249)
+:a 14148,17943,360,1395,729,1000 2 161252 -- MSL 141 (19U 228)
+:e 14148,17943,360,1395,153,1000 2 161259 -- MSL 142 (19U 235)
+:o 15126,17943,360,906,261,906 2 161270 -- MSL 143 (19U 246)
+:u 15126,17943,360,1023,261,1000 2 161276 -- MSL 144 (19U 252)
+oA 19515,25923,0,0,2400 2 161221 -- MSL 145 (19U 197)
+^i 6342,18105,0,4614,1155,1000 2 161262 -- MSL 146 (19U 238)
+/O 20004,18495,360,2847,1161,1000 2 161240 -- MSL 147 (19U 216)
+AE 25857,18135,0,3231,2919,1000 2 161222 -- MSL 148 (19U 198)
+oa 14148,20490,360,87,729,87 2 161253 -- MSL 149 (19U 229)
+'i 6342,17970,0,4593,1155,1000 2 161261 -- MSL 150 (19U 237)
+/o 15126,12990,360,1242,1386,1000 0 161272 -- MSL 151 (19U 248)
+ae 22443,12990,360,165,384,165 0 161254 -- MSL 152 (19U 230)
+:A 19515,22638,0,132,2400,132 2 161220 -- MSL 153 (19U 196)
+`i 6342,17970,0,1737,1155,1000 2 161260 -- MSL 154 (19U 236)
+:O 20004,22638,360,582,-947,582 2 161238 -- MSL 155 (19U 214)
+:U 19029,22638,360,2250,-800,1000 2 161244 -- MSL 156 (19U 220)
+'E 15126,23100,0,3099,699,1000 2 161225 -- MSL 157 (19U 201)
+:i 6342,17943,0,5298,1155,1000 2 161263 -- MSL 158 (19U 239)
+ss 16101,18315,360,1320,939,1000 2 161247 -- MSL 159 (19U 223)
+^O 20004,23085,360,582,-947,582 2 161236 -- MSL 160 (19U 212)
+'A 19515,23100,0,0,2400 2 161217 -- MSL 161 (19U 193)
+~A 19515,23019,0,936,2400,936 2 161219 -- MSL 162 (19U 195)
+~a 14148,17724,360,1533,729,1000 2 161251 -- MSL 163 (19U 227)
+-D 19029,18135,0,477,804,477 2 161232 -- MSL 164 (19U 208)
+Sd 15126,18315,360,357,108,357 2 161264 -- MSL 165 (19U 240)
+'I 7317,23100,0,5619,852,1000 2 161229 -- MSL 166 (19U 205)
+`I 7317,23100,0,2787,852,1000 2 161228 -- MSL 167 (19U 204)
+'O 20004,23100,360,582,-947,582 2 161235 -- MSL 168 (19U 211)
+`O 20004,23100,360,582,-947,582 2 161234 -- MSL 169 (19U 210)
+~O 20004,23019,360,693,-947,693 2 161237 -- MSL 170 (19U 213)
+~o 15126,17724,360,1044,261,1000 2 161269 -- MSL 171 (19U 245)
+vS 17076,23085,360,1629,-20,1000 2 161162 -- MSL 172 (19U 138)
+vs 13173,18234,360,2241,960,1000 2 161178 -- MSL 173 (19U 154)
+'U 19029,23100,360,2250,-800,1000 2 161242 -- MSL 174 (19U 218)
+:Y 18051,22638,0,3720,-2762,1000 2 161183 -- MSL 175 (19U 159)
+:y 14637,17943,4680,1992,-962,1000 3 161279 -- MSL 176 (19U 255)
+TP 15612,18135,0,1692,717,1000 2 161246 -- MSL 177 (19U 222)
+Tp 15126,18165,4680,9,2592,9 3 161278 -- MSL 178 (19U 254)
+mc 14637,12630,4350,1122,2931,1000 0 161205 -- MSL 180 (19U 181)
+ps 16590,19635,4200,0,-2378 2 161206 -- MSL 181 (19U 182)
+34 26346,18465,945,0,-3290 2 161214 -- MSL 182 (19U 190)
+\- 26346,8070,0,0,-4868 0 60096 -- MSL 183 ( 7J 192)
+14 26346,18465,945,0,-3620 2 161212 -- MSL 184 (19U 188)
+12 26346,18465,945,0,-3086 2 161213 -- MSL 185 (19U 189)
+Of 10734,18465,0,1791,-1670,1000 2 161194 -- MSL 186 (19U 170)
+Om 10734,18465,0,2232,-1598,1000 2 161210 -- MSL 187 (19U 186)
+Fo 14637,11046,0,468,-875,468 0 161195 -- MSL 188 (19U 171)
+Fc 14637,11046,0,0,537 0 161211 -- MSL 190 (19U 187)
+t+- 26346,14910,0,0,-4769 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916,0,-4595 3 161190 -- MSL 192 (19U 166)
+co 13173,19635,0,4683,-2891,1000 2 161193 -- MSL 193 (19U 169)
+tno 26346,11697,0,0,-4424 0 161196 -- MSL 194 (19U 172)
+u00AD 8781,7680,0,561,147,561 0 161197 -- MSL 195 (19U 173)
+rg 13173,19635,0,4683,-2891,1000 2 161198 -- MSL 196 (19U 174)
+S2 10245,18465,0,1800,-1064,1000 2 161202 -- MSL 197 (19U 178)
+S3 10245,18465,0,1941,-1133,1000 2 161203 -- MSL 198 (19U 179)
+ac 16587,0,4875,0,-1796 1 161208 -- MSL 199 (19U 184)
+S1 10245,18345,0,693,-3386,693 2 161209 -- MSL 200 (19U 185)
+tmu 26346,14010,0,0,-6080 0 161239 -- MSL 201 (19U 215)
+tdi 26346,12255,0,0,-4844 0 161271 -- MSL 202 (19U 247)
+u203C 14439,18165,0,1956,81,1000 2 87315 -- MSL 221 (10U 19)
+u20A7 25371,18135,360,2022,708,1000 2 60121 -- MSL 232 ( 7J 217)
+pc 8781,10935,0,0,-2135 0 161207 -- MSL 302 (19U 183)
+u013F 14148,18135,0,708,693,708 2 51943 -- MSL 306 ( 6J 231)
+u0140 8295,18165,0,3105,1137,1000 2 51959 -- MSL 307 ( 6J 247)
+u2113 16587,18150,297,0,-3104 2 60122 -- MSL 308 ( 7J 218)
+u0149 19515,18135,0,117,-1310,117 2 51951 -- MSL 309 ( 6J 239)
+fm 8781,18105,0,1911,-2999,1000 2 60101 -- MSL 310 ( 7J 197)
+sd 16587,18105,0,0,-2999 2 60102 -- MSL 311 ( 7J 198)
+dg 16587,18135,0,0,-2771 2 161158 -- MSL 312 (19U 134)
+tm 16128,17850,0,2196,-2759,1000 2 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588,1317,1317,1000 1 60095 -- MSL 314 ( 7J 191)
+ah 16587,18234,0,534,-6377,534 2 75169 -- MSL 315 ( 9E 161)
+ao 16587,20490,0,0,-6317 2 60152 -- MSL 316 ( 7J 248)
+f/ 2439,18465,945,8739,7344,1000 2 60109 -- MSL 324 ( 7J 205)
+em 26346,7380,0,0,-2342 0 161175 -- MSL 325 (19U 151)
+en 16587,7470,0,24,-377,24 0 161174 -- MSL 326 (19U 150)
+dd 16587,18135,0,0,-2798 2 161159 -- MSL 327 (19U 135)
+.i 6342,12630,0,1374,1155,1000 0 46333 -- MSL 328 ( 5T 253)
+aq 8781,18246,0,2136,-4232,1000 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226,0,0,-497 0 161173 -- MSL 331 (19U 149)
+u207F 10248,18465,0,2817,30,1000 2 87548 -- MSL 332 (10U 252)
+u0111 15126,18165,360,3759,159,1000 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 19515,23130,0,261,2400,261 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 14148,17937,360,1122,729,1000 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 19515,18135,4467,0,2400 2 75173 -- MSL 404 ( 9E 165)
+u0061_0328 14148,12990,4458,87,729,87 0 75193 -- MSL 405 ( 9E 185)
+'C 18540,23100,360,1554,-989,1000 2 75206 -- MSL 406 ( 9E 198)
+'c 14148,17970,360,690,114,690 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 18540,23085,360,1554,-989,1000 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 14148,18234,360,1755,114,1000 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 19029,23085,0,477,804,477 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 17565,19635,360,6540,144,1000 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 15126,23085,0,3114,699,1000 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 14148,18234,360,1755,153,1000 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 15126,18135,4467,3099,699,1000 2 75210 -- MSL 422 ( 9E 202)
+u0065_0328 14148,12990,4458,567,153,567 0 75242 -- MSL 423 ( 9E 234)
+u004C_0301 14148,23100,0,0,693 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 6342,23025,0,6393,1137,1000 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 14148,19635,0,2082,693,1000 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 8781,19635,0,6834,1137,1000 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 19029,23100,0,2688,750,1000 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 15126,17970,0,201,1182,201 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 19029,23085,0,2688,750,1000 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 15126,18234,0,942,1182,942 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 20004,23100,360,1959,-947,1000 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 15126,17970,360,3192,261,1000 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 17076,23100,0,1728,729,1000 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 9270,17970,0,3129,1026,1000 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 17076,23085,0,1728,729,1000 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 9270,18234,0,4194,1026,1000 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 17076,23100,360,1455,-20,1000 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 13173,17970,360,1176,960,1000 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 16587,23085,0,3801,-2426,1000 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 10734,19635,360,6291,-863,1000 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 16587,18135,4875,3801,-1589,1000 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 9759,15843,4875,2022,1617,1000 1 75262 -- MSL 469 ( 9E 254)
+u0055_030B 19029,23100,360,2445,-800,1000 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 15126,17970,360,2592,261,1000 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 19029,25173,360,2250,-800,1000 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 15126,20490,360,1023,261,1000 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 16101,23100,0,2598,1719,1000 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 12684,17970,0,1422,1365,1000 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 16101,22650,0,2598,1719,1000 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 12684,17943,0,1344,1365,1000 2 75199 -- MSL 485 ( 9E 191)
+u2070 10245,18465,0,2388,-1205,1000 2 51753 -- MSL 1000 ( 6J 41)
+u2074 10245,18345,0,1842,-857,1000 2 51748 -- MSL 1001 ( 6J 36)
+u2075 10245,18345,0,2226,-1361,1000 2 51749 -- MSL 1002 ( 6J 37)
+u2076 10245,18465,0,2094,-1640,1000 2 51806 -- MSL 1003 ( 6J 94)
+u2077 10245,18345,0,2004,-2096,1000 2 51750 -- MSL 1004 ( 6J 38)
+u2078 10245,18465,0,2007,-1160,1000 2 51754 -- MSL 1005 ( 6J 42)
+u2079 10245,18465,0,1710,-1265,1000 2 51752 -- MSL 1006 ( 6J 40)
+lq 13173,18135,0,3186,-2321,1000 2 161171 -- MSL 1017 (19U 147)
+rq 13173,18135,0,3246,-2381,1000 2 161172 -- MSL 1018 (19U 148)
+Bq 13173,2925,3150,0,1596 0 161156 -- MSL 1019 (19U 132)
+u2003 26346,0,0,0,1317 0 51821 -- MSL 1020 ( 6J 109)
+u2002 16587,0,0,0,1317 0 51822 -- MSL 1021 ( 6J 110)
+u2009 8781,0,0,0,1317 0 51828 -- MSL 1023 ( 6J 116)
+u2026 26346,2760,0,0,-314 0 161157 -- MSL 1028 (19U 133)
+vz 12684,18234,0,2487,1365,1000 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16128,18000,0,3384,-2777,1000 2 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056,342,-1043,342 2 51794 -- MSL 1036 ( 6J 82)
+fi 16101,18315,0,2976,-248,1000 2 60077 -- MSL 1040 ( 7J 173)
+fl 16101,18315,0,2811,-215,1000 2 60078 -- MSL 1041 ( 7J 174)
+ff 18051,18315,0,3666,-164,1000 2 51883 -- MSL 1042 ( 6J 171)
+Fi 24396,18315,0,2886,-173,1000 2 51884 -- MSL 1043 ( 6J 172)
+Fl 24396,18315,0,2748,-167,1000 2 51885 -- MSL 1044 ( 6J 173)
+ij 12684,18165,4995,2970,1143,1000 3 60134 -- MSL 1047 ( 7J 230)
+u2105 26349,18495,360,0,-1991 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 19515,23130,360,1095,-1046,1000 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 15126,17937,5169,1059,1470,1000 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 17076,18495,4875,1455,-20,1000 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 13173,12990,4875,579,960,579 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 7317,22650,0,3942,852,1000 2 46301 -- MSL 1065 ( 5T 221)
+bq 8781,2925,3150,0,2349 0 161154 -- MSL 1067 (19U 130)
+%0 26346,18720,840,426,-314,426 2 161161 -- MSL 1068 (19U 137)
+a- 16587,17040,0,327,-5009,327 2 60154 -- MSL 1084 ( 7J 250)
+ab 16587,17937,0,0,-5468 2 75170 -- MSL 1086 ( 9E 162)
+a. 16587,17943,0,0,-8354 2 75263 -- MSL 1088 ( 9E 255)
+oe 23907,12990,360,141,-242,141 0 161180 -- MSL 1090 (19U 156)
+OE 26346,18270,135,3102,-986,1000 2 161164 -- MSL 1091 (19U 140)
+fo 9759,11046,0,438,-1292,438 0 161163 -- MSL 1092 (19U 139)
+fc 9759,11046,0,0,-362 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624,0,0,-2021 0 60091 -- MSL 1094 ( 7J 187)
+/L 14148,18135,0,0,693 2 75171 -- MSL 1095 ( 9E 163)
+/l 6342,18165,0,2937,1122,1000 2 75187 -- MSL 1096 ( 9E 179)
+a" 16587,17970,0,2460,-5864,1000 2 75197 -- MSL 1097 ( 9E 189)
+ho 16587,696,4458,0,-6956 0 75186 -- MSL 1098 ( 9E 178)
+vZ 16101,23085,0,2598,1719,1000 2 75150 -- MSL 1106 ( 9E 142)
+IJ 20976,18135,360,2559,852,1000 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/UR b/font/devlj4/UR
new file mode 100644
index 0000000..4934593
--- /dev/null
+++ b/font/devlj4/UR
@@ -0,0 +1,848 @@
+# Univers Md
+name UR
+spacewidth 8781
+pcltypeface 4148
+pclproportional 1
+pclweight 0
+pclstyle 0
+ligatures fi fl ff ffi ffl 0
+kernpairs
+L V -3902
+P . -4388
+P , -4388
+V A -3902
+A V -3902
+T o -4877
+T r -4877
+T c -4877
+T e -4877
+T d -4877
+T s -4877
+T y -4877
+T a -4877
+T w -4877
+T u -4877
+T J -4877
+L T -4877
+L Y -4388
+Y o -4388
+Y e -4388
+Y a -4388
+Y J -4388
+A W -2438
+W A -2438
+T A -4388
+V o -2924
+V e -2924
+V a -2924
+Y A -4388
+F A -2924
+F . -3902
+F , -3902
+A T -4388
+A Y -4388
+v . -3902
+v , -3902
+y . -3902
+y , -3902
+T . -3902
+T , -3902
+L W -2438
+P A -2924
+V J -3902
+V . -3902
+V , -3902
+Y . -3902
+Y , -3902
+W o -1949
+W e -1949
+W a -1949
+W . -3413
+W , -3413
+r . -2438
+r , -2438
+w . -3413
+w , -3413
+Y u -2924
+A v -2438
+A y -1949
+A w -2438
+o . -2924
+o , -2924
+p . -2924
+p , -2924
+e . -2924
+e , -2924
+b . -2924
+b , -2924
+O T -1949
+O V -1460
+O Y -1949
+O . -2924
+O , -2924
+L y -2438
+L O -1949
+L G -1949
+L C -1949
+L Q -1949
+P J -2438
+V y -1460
+V u -1460
+V O -1460
+V G -1460
+V C -1460
+V Q -1460
+D T -1949
+D V -1460
+D Y -1949
+D . -2924
+D , -2924
+Y O -1949
+Y G -1949
+Y C -1949
+Y Q -1949
+F o -1460
+F e -1460
+F a -1460
+c . -2438
+c , -2438
+O A -1460
+O W -974
+L U -1460
+R T -1460
+R V -1460
+R Y -1460
+R W -974
+G T -1460
+P o -1460
+P g -1460
+P e -1460
+P a -1460
+C A -1460
+C . -2438
+C , -2438
+D A -1460
+D W -974
+B T -1460
+B Y -1460
+B . -1949
+B , -1949
+F J -2438
+A O -1460
+A G -1460
+A C -1460
+A U -1460
+A Q -1460
+W r -974
+W y -974
+W u -974
+W O -974
+W G -974
+W C -974
+W J -2438
+W Q -974
+J A -1460
+J . -2438
+J , -2438
+U A -1460
+U . -2438
+U , -2438
+Q W -974
+f . -1949
+f , -1949
+T O -1949
+T G -1949
+T C -1949
+T Q -1949
+O X -1460
+L o -1949
+L e -1949
+L q -1949
+G V -1460
+G Y -1460
+G W -974
+G . -974
+G , -974
+P T -485
+P V -485
+P Y -485
+C T -1460
+C V -1460
+C Y -1460
+D X -1460
+B V -1460
+B X -974
+B A -974
+B W -974
+S . -1949
+S , -1949
+X o -1460
+X e -1460
+X y -1460
+X O -1460
+X G -1460
+X C -1460
+X Q -1460
+A o -1460
+A e -1460
+K o -1460
+K e -1460
+K y -1460
+K w -1460
+K O -1460
+K G -1460
+K C -1460
+K Q -1460
+o v -974
+o y -485
+o x -974
+o w -974
+h v -974
+h y -485
+n v -974
+n y -485
+m v -974
+m y -485
+r g -485
+g . -974
+g , -974
+p v -974
+p y -485
+p x -974
+c v -974
+c y -485
+c w -974
+v o -974
+v g -974
+v c -974
+v d -974
+v a -974
+v q -974
+e v -974
+e y -485
+b v -974
+b y -485
+b w -974
+s . -1460
+s , -1460
+y o -974
+y g -974
+y c -974
+y d -974
+y a -974
+y q -974
+f g -485
+x o -974
+x g -974
+x c -974
+x e -974
+x d -974
+x a -974
+x q -974
+a v -974
+a y -485
+a w -974
+w o -974
+w g -974
+w c -974
+w d -974
+w a -974
+w q -974
+T i -974
+T S -974
+L a -974
+L S -974
+P s -485
+P Z -485
+P X -485
+P W -485
+C X -1460
+C W -974
+C J -974
+V i -974
+V S -974
+S T -974
+S V -974
+S Y -974
+S X -974
+S A -974
+S W -974
+Y i -974
+Y S -974
+X a -974
+X u -1460
+X S -974
+A t -974
+A g -1460
+A c -1460
+A d -1460
+A a -974
+A u -1460
+A q -1460
+A S -974
+W i -974
+W S -974
+K c -1460
+K u -1460
+K S -974
+t g -485
+t . -974
+t , -974
+o f -485
+h w -974
+h . -974
+h , -974
+n w -974
+n . -974
+n , -974
+m w -974
+m . -974
+m , -974
+l . -974
+l , -974
+r o -485
+r c -485
+r e -485
+r d -485
+r a -485
+r q -485
+i . -974
+i , -974
+p f -485
+p w -974
+c f -485
+c x -974
+v e -974
+v s -485
+e f -485
+e x -974
+e w -974
+z . -974
+z , -974
+d . -974
+d , -974
+b f -485
+s v -485
+s y -485
+s f -485
+s x -485
+s w -485
+y e -974
+y s -485
+f o -485
+f c -485
+f e -485
+f d -485
+f s -485
+f a -485
+f q -485
+x s -485
+x . -974
+x , -974
+a . -974
+a , -974
+w e -974
+w s -485
+j . -974
+j , -974
+u . -974
+k o -974
+k g -974
+k c -974
+k e -974
+k d -974
+k a -974
+k q -974
+k . -974
+k , -974
+O Z -485
+O J -974
+H . -974
+H , -974
+N . -974
+N , -974
+M . -974
+M , -974
+L . -974
+L , -974
+R . -974
+R , -974
+I . -974
+I , -974
+C Z -485
+E . -974
+E , -974
+Z o -485
+Z e -485
+Z d -485
+Z s -485
+Z y -485
+Z a -485
+Z w -485
+Z u -485
+Z O -485
+Z G -485
+Z C -485
+Z S -485
+Z Q -485
+Z . -974
+Z , -974
+D Z -485
+D J -974
+B Z -485
+B J -974
+S Z -485
+S J -974
+X . -974
+X , -974
+A s -485
+A . -974
+A , -974
+J J -974
+U J -974
+K a -974
+K . -974
+K , -974
+t o -485
+t c -485
+t e -485
+t d -485
+t s -485
+t a -485
+t q -485
+o z -485
+h f -485
+n f -485
+m f -485
+r s -485
+p z -485
+c z -485
+e z -485
+z o -485
+z g -485
+z c -485
+z e -485
+z d -485
+z s -485
+z a -485
+z q -485
+b z -485
+s z -485
+a f -485
+k s -485
+A f -485
+K T -485
+K V -485
+K Y -485
+K W -485
+K U -485
+L cq -6341
+L ' -6341
+T hy -4877
+T - -4877
+T en -4877
+T em -4877
+A cq -2924
+A ' -2924
+hy T -4877
+- T -4877
+en T -4877
+em T -4877
+Y hy -2924
+Y - -2924
+Y en -2924
+Y em -2924
+p cq -1949
+p ' -1949
+c cq -1460
+c ' -1460
+e cq -1949
+e ' -1949
+b cq -1949
+b ' -1949
+a cq -1460
+a ' -1460
+V hy -1460
+V - -1460
+V en -1460
+V em -1460
+h cq -1460
+h ' -1460
+n cq -1460
+n ' -1460
+m cq -1460
+m ' -1460
+W hy -974
+W - -974
+W en -974
+W em -974
+cq d -3413
+' d -3413
+s cq -485
+s ' -485
+L hy -1949
+L - -1949
+L en -1949
+L em -1949
+X hy -1460
+X - -1460
+X en -1460
+X em -1460
+A hy -1460
+A - -1460
+A en -1460
+A em -1460
+K hy -1460
+K - -1460
+K en -1460
+K em -1460
+cq s -1949
+' s -1949
+hy X -1460
+- X -1460
+hy A -1460
+- A -1460
+en X -1460
+en A -1460
+em X -1460
+K cq -485
+K ' -485
+t g -485
+b f -485
+Z hy -485
+Z - -485
+Z en -485
+Z em -485
+cq t -974
+' t -974
+cq n -1460
+' n -1460
+cq m -1460
+' m -1460
+cq r -1460
+' r -1460
+cq v -1460
+' v -1460
+charset
+! 8781,18165 2 161057 -- MSL 1 (19U 33)
+dq 13173,18237 2 161058 -- MSL 2 (19U 34)
+" "
+sh 16587,18105 2 161059 -- MSL 3 (19U 35)
+# "
+Do 16587,18825,720 2 161060 -- MSL 4 (19U 36)
+$ "
+% 26346,18720,840 2 161061 -- MSL 5 (19U 37)
+& 20004,18495,360 2 161062 -- MSL 6 (19U 38)
+cq 8781,18135 2 161170 -- MSL 8 (19U 146)
+' "
+( 8781,18135,2550 2 161064 -- MSL 9 (19U 40)
+) 8781,18135,2550 2 161065 -- MSL 10 (19U 41)
+* 16587,18495 2 161066 -- MSL 11 (19U 42)
++ 26346,14775,105 0 161067 -- MSL 12 (19U 43)
+, 8781,3030,3075 0 161068 -- MSL 13 (19U 44)
+hy 8781,7755 0 161069 -- MSL 14 (19U 45)
+- "
+. 8781,3030 0 161070 -- MSL 15 (19U 46)
+sl 8781,18135,1380 2 161071 -- MSL 16 (19U 47)
+/ "
+0 16587,18465,360 2 161072 -- MSL 17 (19U 48)
+1 16587,18105 2 161073 -- MSL 18 (19U 49)
+2 16587,18465 2 161074 -- MSL 19 (19U 50)
+3 16587,18465,360 2 161075 -- MSL 20 (19U 51)
+4 16587,18105 2 161076 -- MSL 21 (19U 52)
+5 16587,18105,360 2 161077 -- MSL 22 (19U 53)
+6 16587,18465,360 2 161078 -- MSL 23 (19U 54)
+7 16587,18105 2 161079 -- MSL 24 (19U 55)
+8 16587,18465,360 2 161080 -- MSL 25 (19U 56)
+9 16587,18465,360 2 161081 -- MSL 26 (19U 57)
+: 8781,12630 0 161082 -- MSL 27 (19U 58)
+; 8781,12630,3075 0 161083 -- MSL 28 (19U 59)
+< 26346,16068 0 161084 -- MSL 29 (19U 60)
+= 26346,10566 0 161085 -- MSL 30 (19U 61)
+> 26346,16068 0 161086 -- MSL 31 (19U 62)
+? 13662,18315 2 161087 -- MSL 32 (19U 63)
+at 26352,21030,2745 2 161088 -- MSL 33 (19U 64)
+@ "
+A 19515,18135 2 161089 -- MSL 34 (19U 65)
+B 16587,18135 2 161090 -- MSL 35 (19U 66)
+C 18540,18495,360 2 161091 -- MSL 36 (19U 67)
+D 19029,18135 2 161092 -- MSL 37 (19U 68)
+E 15126,18135 2 161093 -- MSL 38 (19U 69)
+F 14637,18135 2 161094 -- MSL 39 (19U 70)
+G 19515,18495,360 2 161095 -- MSL 40 (19U 71)
+H 19029,18135 2 161096 -- MSL 41 (19U 72)
+I 7317,18135 2 161097 -- MSL 42 (19U 73)
+J 14637,18135,360 2 161098 -- MSL 43 (19U 74)
+K 17565,18135 2 161099 -- MSL 44 (19U 75)
+L 14148,18135 2 161100 -- MSL 45 (19U 76)
+M 23907,18135 2 161101 -- MSL 46 (19U 77)
+N 19029,18135 2 161102 -- MSL 47 (19U 78)
+O 20004,18495,360 2 161103 -- MSL 48 (19U 79)
+P 15612,18135 2 161104 -- MSL 49 (19U 80)
+Q 20490,18495,360 2 161105 -- MSL 50 (19U 81)
+R 17076,18135 2 161106 -- MSL 51 (19U 82)
+S 17076,18495,360 2 161107 -- MSL 52 (19U 83)
+T 16587,18135 2 161108 -- MSL 53 (19U 84)
+U 19029,18135,360 2 161109 -- MSL 54 (19U 85)
+V 19029,18135 2 161110 -- MSL 55 (19U 86)
+W 26346,18135 2 161111 -- MSL 56 (19U 87)
+X 19029,18135 2 161112 -- MSL 57 (19U 88)
+Y 18051,18135 2 161113 -- MSL 58 (19U 89)
+Z 16101,18135 2 161114 -- MSL 59 (19U 90)
+lB 8781,18135,2370 2 161115 -- MSL 60 (19U 91)
+[ "
+rs 8781,18135,1380 2 161116 -- MSL 61 (19U 92)
+\ "
+rB 8781,18135,2370 2 161117 -- MSL 62 (19U 93)
+] "
+ha 13173,19758 2 161118 -- MSL 63 (19U 94)
+_ 13173,0,6588 1 161119 -- MSL 64 (19U 95)
+oq 8781,18135 2 161169 -- MSL 66 (19U 145)
+` "
+a 14148,12990,360 0 161121 -- MSL 67 (19U 97)
+b 15126,18165,360 2 161122 -- MSL 68 (19U 98)
+c 14148,12990,360 0 161123 -- MSL 69 (19U 99)
+d 15126,18165,360 2 161124 -- MSL 70 (19U 100)
+e 14148,12990,360 0 161125 -- MSL 71 (19U 101)
+f 9759,18315 2 161126 -- MSL 72 (19U 102)
+g 15126,12990,5088 1 161127 -- MSL 73 (19U 103)
+h 15126,18165 2 161128 -- MSL 74 (19U 104)
+i 6342,18165 2 161129 -- MSL 75 (19U 105)
+j 6342,18165,4995 3 161130 -- MSL 76 (19U 106)
+k 14148,18165 2 161131 -- MSL 77 (19U 107)
+l 6342,18165 2 161132 -- MSL 78 (19U 108)
+m 22932,12990 0 161133 -- MSL 79 (19U 109)
+n 15126,12990 0 161134 -- MSL 80 (19U 110)
+o 15126,12990,360 0 161135 -- MSL 81 (19U 111)
+p 15126,12990,4680 1 161136 -- MSL 82 (19U 112)
+q 15126,12990,4680 1 161137 -- MSL 83 (19U 113)
+r 9270,12990 0 161138 -- MSL 84 (19U 114)
+s 13173,12990,360 0 161139 -- MSL 85 (19U 115)
+t 9759,15963,360 0 161140 -- MSL 86 (19U 116)
+u 15126,12630,360 0 161141 -- MSL 87 (19U 117)
+v 14637,12630 0 161142 -- MSL 88 (19U 118)
+w 22932,12630 0 161143 -- MSL 89 (19U 119)
+x 14637,12630 0 161144 -- MSL 90 (19U 120)
+y 14637,12630,4680 1 161145 -- MSL 91 (19U 121)
+z 12684,12630 0 161146 -- MSL 92 (19U 122)
+{ 11712,20130,6075 3 161147 -- MSL 93 (19U 123)
+lC "
+| 13173,19758,6588 3 161148 -- MSL 94 (19U 124)
+ba "
+} 11712,20130,6075 3 161149 -- MSL 95 (19U 125)
+rC "
+ti 26346,8952 0 161150 -- MSL 96 (19U 126)
+`A 19515,23085 2 161216 -- MSL 99 (19U 192)
+^A 19515,23085 2 161218 -- MSL 100 (19U 194)
+`E 15126,23085 2 161224 -- MSL 101 (19U 200)
+^E 15126,23085 2 161226 -- MSL 102 (19U 202)
+:E 15126,22755 2 161227 -- MSL 103 (19U 203)
+^I 7317,23085 2 161230 -- MSL 104 (19U 206)
+:I 7317,22755 2 161231 -- MSL 105 (19U 207)
+aa 16587,18075 2 161204 -- MSL 106 (19U 180)
+ga 16587,18075 2 161120 -- MSL 107 (19U 96)
+a^ 16587,17985 2 161160 -- MSL 108 (19U 136)
+^ "
+ad 16587,17775 2 161192 -- MSL 109 (19U 168)
+~ 16587,18294 2 161176 -- MSL 110 (19U 152)
+a~ "
+`U 19029,23085,360 2 161241 -- MSL 111 (19U 217)
+^U 19029,23085,360 2 161243 -- MSL 112 (19U 219)
+u00AF 13173,21105 2 161199 -- MSL 113 (19U 175)
+'Y 18051,23085 2 161245 -- MSL 114 (19U 221)
+'y 14637,18075,4680 3 161277 -- MSL 115 (19U 253)
+de 16587,18465 2 161200 -- MSL 116 (19U 176)
+,C 18540,18495,5025 3 161223 -- MSL 117 (19U 199)
+,c 14148,12990,5025 1 161255 -- MSL 118 (19U 231)
+~N 19029,22959 2 161233 -- MSL 119 (19U 209)
+~n 15126,18294 2 161265 -- MSL 120 (19U 241)
+r! 8781,12645,5520 1 161185 -- MSL 121 (19U 161)
+r? 13662,12516,5799 1 161215 -- MSL 122 (19U 191)
+Cs 16587,15684 0 161188 -- MSL 123 (19U 164)
+Po 16587,18465 2 161187 -- MSL 124 (19U 163)
+Ye 16587,18105 2 161189 -- MSL 125 (19U 165)
+sc 16587,18495,360 2 161191 -- MSL 126 (19U 167)
+Fn 16587,18315 2 161155 -- MSL 127 (19U 131)
+ct 16587,18825,720 2 161186 -- MSL 128 (19U 162)
+^a 14148,17985,360 2 161250 -- MSL 129 (19U 226)
+^e 14148,17985,360 2 161258 -- MSL 130 (19U 234)
+^o 15126,17985,360 2 161268 -- MSL 131 (19U 244)
+^u 15126,17985,360 2 161275 -- MSL 132 (19U 251)
+'a 14148,18075,360 2 161249 -- MSL 133 (19U 225)
+'e 14148,18075,360 2 161257 -- MSL 134 (19U 233)
+'o 15126,18075,360 2 161267 -- MSL 135 (19U 243)
+'u 15126,18075,360 2 161274 -- MSL 136 (19U 250)
+`a 14148,18075,360 2 161248 -- MSL 137 (19U 224)
+`e 14148,18075,360 2 161256 -- MSL 138 (19U 232)
+`o 15126,18075,360 2 161266 -- MSL 139 (19U 242)
+`u 15126,18075,360 2 161273 -- MSL 140 (19U 249)
+:a 14148,17775,360 2 161252 -- MSL 141 (19U 228)
+:e 14148,17775,360 2 161259 -- MSL 142 (19U 235)
+:o 15126,17775,360 2 161270 -- MSL 143 (19U 246)
+:u 15126,17775,360 2 161276 -- MSL 144 (19U 252)
+oA 19515,25923 2 161221 -- MSL 145 (19U 197)
+^i 6342,17985 2 161262 -- MSL 146 (19U 238)
+/O 20004,18495,375 2 161240 -- MSL 147 (19U 216)
+AE 25857,18165 2 161222 -- MSL 148 (19U 198)
+oa 14148,20412,360 2 161253 -- MSL 149 (19U 229)
+'i 6342,18075 2 161261 -- MSL 150 (19U 237)
+/o 15126,13008,408 0 161272 -- MSL 151 (19U 248)
+ae 22443,12990,360 0 161254 -- MSL 152 (19U 230)
+:A 19515,22755 2 161220 -- MSL 153 (19U 196)
+`i 6342,18075 2 161260 -- MSL 154 (19U 236)
+:O 20004,22755,360 2 161238 -- MSL 155 (19U 214)
+:U 19029,22755,360 2 161244 -- MSL 156 (19U 220)
+'E 15126,23085 2 161225 -- MSL 157 (19U 201)
+:i 6342,17775 2 161263 -- MSL 158 (19U 239)
+ss 16101,18165,360 2 161247 -- MSL 159 (19U 223)
+^O 20004,23085,360 2 161236 -- MSL 160 (19U 212)
+'A 19515,23085 2 161217 -- MSL 161 (19U 193)
+~A 19515,22959 2 161219 -- MSL 162 (19U 195)
+~a 14148,18294,360 2 161251 -- MSL 163 (19U 227)
+-D 19029,18135 2 161232 -- MSL 164 (19U 208)
+Sd 15126,18315,360 2 161264 -- MSL 165 (19U 240)
+'I 7317,23085 2 161229 -- MSL 166 (19U 205)
+`I 7317,23085 2 161228 -- MSL 167 (19U 204)
+'O 20004,23085,360 2 161235 -- MSL 168 (19U 211)
+`O 20004,23085,360 2 161234 -- MSL 169 (19U 210)
+~O 20004,22959,360 2 161237 -- MSL 170 (19U 213)
+~o 15126,18294,360 2 161269 -- MSL 171 (19U 245)
+vS 17076,23085,360 2 161162 -- MSL 172 (19U 138)
+vs 13173,17985,360 2 161178 -- MSL 173 (19U 154)
+'U 19029,23085,360 2 161242 -- MSL 174 (19U 218)
+:Y 18051,22755 2 161183 -- MSL 175 (19U 159)
+:y 14637,17775,4680 3 161279 -- MSL 176 (19U 255)
+TP 15612,18135 2 161246 -- MSL 177 (19U 222)
+Tp 15126,18165,4680 3 161278 -- MSL 178 (19U 254)
+mc 14637,12630,4350 0 161205 -- MSL 180 (19U 181)
+ps 16587,19635,4200 2 161206 -- MSL 181 (19U 182)
+34 26346,18465,1020 2 161214 -- MSL 182 (19U 190)
+\- 26346,8100 0 60096 -- MSL 183 ( 7J 192)
+14 26346,18465,1020 2 161212 -- MSL 184 (19U 188)
+12 26346,18465,1020 2 161213 -- MSL 185 (19U 189)
+Of 10734,18465 2 161194 -- MSL 186 (19U 170)
+Om 10734,18465 2 161210 -- MSL 187 (19U 186)
+Fo 14637,11085 0 161195 -- MSL 188 (19U 171)
+Fc 14637,11085 0 161211 -- MSL 190 (19U 187)
+t+- 26346,14985 0 161201 -- MSL 191 (19U 177)
+bb 13173,19083,5916 3 161190 -- MSL 192 (19U 166)
+co 13173,19635 2 161193 -- MSL 193 (19U 169)
+tno 26346,11607 0 161196 -- MSL 194 (19U 172)
+u00AD 8781,7755 0 161197 -- MSL 195 (19U 173)
+rg 13173,19635 2 161198 -- MSL 196 (19U 174)
+S2 10245,18465 2 161202 -- MSL 197 (19U 178)
+S3 10245,18465 2 161203 -- MSL 198 (19U 179)
+ac 16587,0,5025 1 161208 -- MSL 199 (19U 184)
+S1 10245,18345 2 161209 -- MSL 200 (19U 185)
+tmu 26346,14010 0 161239 -- MSL 201 (19U 215)
+tdi 26346,12315 0 161271 -- MSL 202 (19U 247)
+u203C 13917,18165 2 87315 -- MSL 221 (10U 19)
+u20A7 25371,18135,360 2 60121 -- MSL 232 ( 7J 217)
+pc 8781,10509 0 161207 -- MSL 302 (19U 183)
+u013F 14148,18135 2 51943 -- MSL 306 ( 6J 231)
+u0140 9570,18165 2 51959 -- MSL 307 ( 6J 247)
+u2113 16587,18150,297 2 60122 -- MSL 308 ( 7J 218)
+u0149 18054,18135 2 51951 -- MSL 309 ( 6J 239)
+fm 8781,18105 2 60101 -- MSL 310 ( 7J 197)
+sd 16587,18105 2 60102 -- MSL 311 ( 7J 198)
+dg 16587,18135 2 161158 -- MSL 312 (19U 134)
+tm 16128,17850 2 161177 -- MSL 313 (19U 153)
+u2017 13173,0,6588 1 60095 -- MSL 314 ( 7J 191)
+ah 16587,17985 2 75169 -- MSL 315 ( 9E 161)
+ao 16587,20412 2 60152 -- MSL 316 ( 7J 248)
+f/ 1464,18465,1020 2 60109 -- MSL 324 ( 7J 205)
+em 26346,7425 0 161175 -- MSL 325 (19U 151)
+en 16587,7425 0 161174 -- MSL 326 (19U 150)
+dd 16587,18135 2 161159 -- MSL 327 (19U 135)
+.i 6342,12630 0 46333 -- MSL 328 ( 5T 253)
+aq 8781,18237 2 161063 -- MSL 329 (19U 39)
+bu 13173,14226 0 161173 -- MSL 331 (19U 149)
+u207F 10245,18465 2 87548 -- MSL 332 (10U 252)
+u0111 15126,18165,360 2 75248 -- MSL 342 ( 9E 240)
+u0041_0306 19515,23160 2 75203 -- MSL 400 ( 9E 195)
+u0061_0306 14148,17985,360 2 75235 -- MSL 401 ( 9E 227)
+u0041_0328 19515,18135,4530 2 75173 -- MSL 404 ( 9E 165)
+u0061_0328 14148,12990,4704 1 75193 -- MSL 405 ( 9E 185)
+'C 18540,23085,360 2 75206 -- MSL 406 ( 9E 198)
+'c 14148,18075,360 2 75238 -- MSL 407 ( 9E 230)
+u0041_030C 18540,23085,360 2 75208 -- MSL 410 ( 9E 200)
+u0061_030C 14148,17985,360 2 75240 -- MSL 411 ( 9E 232)
+u0044_030C 19029,23085 2 75215 -- MSL 414 ( 9E 207)
+u0064_030C 17565,19650,360 2 75247 -- MSL 415 ( 9E 239)
+u0045_030C 15126,23085 2 75212 -- MSL 416 ( 9E 204)
+u0065_030C 14148,17985,360 2 75244 -- MSL 417 ( 9E 236)
+u0045_0328 15126,18135,4530 2 75210 -- MSL 422 ( 9E 202)
+u0065_0328 14148,12990,4704 1 75242 -- MSL 423 ( 9E 234)
+u004C_0301 14148,23085 2 75205 -- MSL 440 ( 9E 197)
+u006C_0301 6342,23130 2 75237 -- MSL 441 ( 9E 229)
+u004C_030C 14148,19650 2 75196 -- MSL 442 ( 9E 188)
+u006C_030C 8781,19650 2 75198 -- MSL 443 ( 9E 190)
+u004E_0301 19029,23085 2 75217 -- MSL 446 ( 9E 209)
+u006E_0301 15126,18075 2 75249 -- MSL 447 ( 9E 241)
+u004E_030C 19029,23085 2 75218 -- MSL 448 ( 9E 210)
+u006E_030C 15126,17985 2 75250 -- MSL 449 ( 9E 242)
+u004F_030B 20004,23085,360 2 75221 -- MSL 452 ( 9E 213)
+u006F_030B 15126,18075,360 2 75253 -- MSL 453 ( 9E 245)
+u0052_0301 17076,23085 2 75200 -- MSL 456 ( 9E 192)
+u0072_0301 9270,18075 2 75232 -- MSL 457 ( 9E 224)
+u0052_030C 17076,23085 2 75224 -- MSL 458 ( 9E 216)
+u0072_030C 9270,17985 2 75256 -- MSL 459 ( 9E 248)
+u0053_0301 17076,23085,360 2 75148 -- MSL 462 ( 9E 140)
+u0073_0301 13173,18075,360 2 75164 -- MSL 463 ( 9E 156)
+u0054_030C 16587,23085 2 75149 -- MSL 466 ( 9E 141)
+u0074_030C 10734,19650,360 2 75165 -- MSL 467 ( 9E 157)
+u0054_0327 16587,18135,5025 3 75230 -- MSL 468 ( 9E 222)
+u0074_0327 9759,15963,5025 1 75262 -- MSL 469 ( 9E 254)
+u0055_030B 19029,23085,360 2 75227 -- MSL 474 ( 9E 219)
+u0075_030B 15126,18075,360 2 75259 -- MSL 475 ( 9E 251)
+u0055_030A 19029,25173,360 2 75225 -- MSL 476 ( 9E 217)
+u0075_030A 15126,20412,360 2 75257 -- MSL 477 ( 9E 249)
+u005A_0301 16101,23085 2 75151 -- MSL 482 ( 9E 143)
+u007A_0301 12684,18075 2 75167 -- MSL 483 ( 9E 159)
+u005A_0307 16101,22755 2 75183 -- MSL 484 ( 9E 175)
+u007A_0307 12684,17775 2 75199 -- MSL 485 ( 9E 191)
+u2070 10245,18465 2 51753 -- MSL 1000 ( 6J 41)
+u2074 10245,18345 2 51748 -- MSL 1001 ( 6J 36)
+u2075 10245,18345 2 51749 -- MSL 1002 ( 6J 37)
+u2076 10245,18465 2 51806 -- MSL 1003 ( 6J 94)
+u2077 10245,18345 2 51750 -- MSL 1004 ( 6J 38)
+u2078 10245,18465 2 51754 -- MSL 1005 ( 6J 42)
+u2079 10245,18465 2 51752 -- MSL 1006 ( 6J 40)
+lq 13173,18135 2 161171 -- MSL 1017 (19U 147)
+rq 13173,18135 2 161172 -- MSL 1018 (19U 148)
+Bq 13173,3015,3060 0 161156 -- MSL 1019 (19U 132)
+u2003 26346,0 0 51821 -- MSL 1020 ( 6J 109)
+u2002 16587,0 0 51822 -- MSL 1021 ( 6J 110)
+u2009 8781,0 0 51828 -- MSL 1023 ( 6J 116)
+u2026 26346,2745 0 161157 -- MSL 1028 (19U 133)
+vz 12684,17985 2 75166 -- MSL 1031 ( 9E 158)
+u2120 16128,18000 2 128299 -- MSL 1034 (15U 43)
+u211E 20004,18315,4056 2 51794 -- MSL 1036 ( 6J 82)
+fi 16101,18315 2 60077 -- MSL 1040 ( 7J 173)
+fl 16101,18315 2 60078 -- MSL 1041 ( 7J 174)
+ff 18051,18315 2 51883 -- MSL 1042 ( 6J 171)
+Fi 24396,18315 2 51884 -- MSL 1043 ( 6J 172)
+Fl 24396,18315 2 51885 -- MSL 1044 ( 6J 173)
+ij 12684,18165,4995 3 60134 -- MSL 1047 ( 7J 230)
+u2105 25374,18495,360 2 60072 -- MSL 1060 ( 7J 168)
+u0047_0306 19515,23160,360 2 46288 -- MSL 1061 ( 5T 208)
+u0067_0306 15126,17985,5088 3 46320 -- MSL 1062 ( 5T 240)
+u0053_0327 17076,18495,5025 3 75178 -- MSL 1063 ( 9E 170)
+u0073_0327 13173,12990,5025 1 75194 -- MSL 1064 ( 9E 186)
+u0049_0307 7317,22755 2 46301 -- MSL 1065 ( 5T 221)
+bq 8781,3015,3060 0 161154 -- MSL 1067 (19U 130)
+%0 26346,18720,840 2 161161 -- MSL 1068 (19U 137)
+a- 16587,16845 2 60154 -- MSL 1084 ( 7J 250)
+ab 16587,17985 2 75170 -- MSL 1086 ( 9E 162)
+a. 16587,17775 2 75263 -- MSL 1088 ( 9E 255)
+oe 23907,12990,360 0 161180 -- MSL 1090 (19U 156)
+OE 26346,18270,135 2 161164 -- MSL 1091 (19U 140)
+fo 9759,11085 0 161163 -- MSL 1092 (19U 139)
+fc 9759,11085 0 161179 -- MSL 1093 (19U 155)
+sq 19029,15624 0 60091 -- MSL 1094 ( 7J 187)
+/L 14148,18135 2 75171 -- MSL 1095 ( 9E 163)
+/l 6342,18165 2 75187 -- MSL 1096 ( 9E 179)
+a" 16587,18075 2 75197 -- MSL 1097 ( 9E 189)
+ho 16587,1425,4704 1 75186 -- MSL 1098 ( 9E 178)
+vZ 16101,23085 2 75150 -- MSL 1106 ( 9E 142)
+IJ 21354,18135,360 2 60135 -- MSL 1107 ( 7J 231)
diff --git a/font/devlj4/WINGDINGS b/font/devlj4/WINGDINGS
new file mode 100644
index 0000000..ae03702
--- /dev/null
+++ b/font/devlj4/WINGDINGS
@@ -0,0 +1,230 @@
+# Wingdings
+name WINGDINGS
+spacewidth 26458
+pcltypeface 31402
+pclproportional 1
+pclweight 0
+pclstyle 0
+charset
+u270F 27259,19598,478 2 4746273 -- HP PUA U+F021 (579L 33)
+u2702 30282,19120 2 4746274 -- HP PUA U+F022 (579L 34)
+u2701 34429,20451 2 4746275 -- HP PUA U+F023 (579L 35)
+--- 35553,13255 0 4746276 -- HP PUA U+F024 (579L 36)
+--- 23642,19598,478 2 4746277 -- HP PUA U+F025 (579L 37)
+--- 32194,20399,323 2 4746278 -- HP PUA U+F026 (579L 38)
+--- 12118,19521,478 2 4746279 -- HP PUA U+F027 (579L 39)
+u260E 28680,19598 2 4746280 -- HP PUA U+F028 (579L 40)
+u2706 23590,19120 2 4746281 -- HP PUA U+F029 (579L 41)
+u2709 29959,19120 2 4746282 -- HP PUA U+F02A (579L 42)
+--- 29959,19120 2 4746283 -- HP PUA U+F02B (579L 43)
+--- 30993,19120 2 4746284 -- HP PUA U+F02C (579L 44)
+--- 30993,20942 2 4746285 -- HP PUA U+F02D (579L 45)
+--- 38124,20942 2 4746286 -- HP PUA U+F02E (579L 46)
+--- 38189,19069 2 4746287 -- HP PUA U+F02F (579L 47)
+--- 29003,19120 2 4746288 -- HP PUA U+F030 (579L 48)
+--- 35540,19120 2 4746289 -- HP PUA U+F031 (579L 49)
+--- 18487,19120 2 4746290 -- HP PUA U+F032 (579L 50)
+--- 18487,19120 2 4746291 -- HP PUA U+F033 (579L 51)
+--- 23590,19120,5103 3 4746292 -- HP PUA U+F034 (579L 52)
+--- 14663,19120 2 4746293 -- HP PUA U+F035 (579L 53)
+u231B 15929,19598,478 2 4746294 -- HP PUA U+F036 (579L 54)
+u2328 28370,19598 2 4746295 -- HP PUA U+F037 (579L 55)
+--- 25076,20877,478 2 4746296 -- HP PUA U+F038 (579L 56)
+--- 28525,15787 0 4746297 -- HP PUA U+F039 (579L 57)
+--- 24856,19120 2 4746298 -- HP PUA U+F03A (579L 58)
+--- 23577,8927 0 4746299 -- HP PUA U+F03B (579L 59)
+--- 23590,19120 2 4746300 -- HP PUA U+F03C (579L 60)
+--- 23590,19120 2 4746301 -- HP PUA U+F03D (579L 61)
+u2707 23577,19120 2 4746302 -- HP PUA U+F03E (579L 62)
+u270D 24068,14159 0 4746303 -- HP PUA U+F03F (579L 63)
+--- 24068,14159 0 4746304 -- HP PUA U+F040 (579L 64)
+u270C 15542,20722,323 2 4746305 -- HP PUA U+F041 (579L 65)
+--- 20981,20722,930 2 4746306 -- HP PUA U+F042 (579L 66)
+--- 17841,19598 2 4746307 -- HP PUA U+F043 (579L 67)
+--- 17841,16033,478 0 4746308 -- HP PUA U+F044 (579L 68)
+u261C 24921,15477 0 4746309 -- HP PUA U+F045 (579L 69)
+u261E 24921,15477 0 4746310 -- HP PUA U+F046 (579L 70)
+u261D 14521,19973,478 2 4746311 -- HP PUA U+F047 (579L 71)
+u261F 14521,19973,478 2 4746312 -- HP PUA U+F048 (579L 72)
+--- 23590,20722,323 2 4746313 -- HP PUA U+F049 (579L 73)
+u263A 22311,19598,478 2 4746314 -- HP PUA U+F04A (579L 74)
+--- 22311,19598,478 2 4746315 -- HP PUA U+F04B (579L 75)
+u2639 22311,19598,478 2 4746316 -- HP PUA U+F04C (579L 76)
+--- 29391,19598,478 2 4746317 -- HP PUA U+F04D (579L 77)
+u2620 17467,19598,478 2 4746318 -- HP PUA U+F04E (579L 78)
+--- 22466,20399,2713 2 4746319 -- HP PUA U+F04F (579L 79)
+--- 28810,21523 2 4746320 -- HP PUA U+F050 (579L 80)
+u2708 23500,19120 2 4746321 -- HP PUA U+F051 (579L 81)
+u263C 23293,19120 2 4746322 -- HP PUA U+F052 (579L 82)
+--- 17208,19120 2 4746323 -- HP PUA U+F053 (579L 83)
+u2744 21510,19120 2 4746324 -- HP PUA U+F054 (579L 84)
+--- 19753,19120 2 4746325 -- HP PUA U+F055 (579L 85)
+u271E 19753,19120 2 4746326 -- HP PUA U+F056 (579L 86)
+--- 19120,19120 2 4746327 -- HP PUA U+F057 (579L 87)
+u2720 18345,16498 0 4746328 -- HP PUA U+F058 (579L 88)
+u2721 21019,19120 2 4746329 -- HP PUA U+F059 (579L 89)
+u262A 23422,19120 2 4746330 -- HP PUA U+F05A (579L 90)
+u262F 23590,19120 2 4746331 -- HP PUA U+F05B (579L 91)
+u0950 23694,19598,491 2 4746332 -- HP PUA U+F05C (579L 92)
+u2638 23577,19120 2 4746333 -- HP PUA U+F05D (579L 93)
+u2648 30592,19611,5103 3 4746334 -- HP PUA U+F05E (579L 94)
+u2649 27892,19120,5413 3 4746335 -- HP PUA U+F05F (579L 95)
+u264A 25502,20309,1279 2 4746336 -- HP PUA U+F060 (579L 96)
+u264B 28848,19133 2 4746337 -- HP PUA U+F061 (579L 97)
+u264C 24895,20722,5413 3 4746338 -- HP PUA U+F062 (579L 98)
+u264D 24688,19469,5103 3 4746339 -- HP PUA U+F063 (579L 99)
+u264E 25024,19120 2 4746340 -- HP PUA U+F064 (579L 100)
+u264F 27117,19495,5361 3 4746341 -- HP PUA U+F065 (579L 101)
+u2650 24572,19598,478 2 4746342 -- HP PUA U+F066 (579L 102)
+u2651 29003,19611,3824 2 4746343 -- HP PUA U+F067 (579L 103)
+u2652 28177,17531 0 4746344 -- HP PUA U+F068 (579L 104)
+u2653 20632,19598,478 2 4746345 -- HP PUA U+F069 (579L 105)
+u0026 27776,15167,2713 0 4746346 -- HP PUA U+F06A (579L 106)
+u0026 33628,19598,4147 2 4746347 -- HP PUA U+F06B (579L 107)
+u25CF 19753,17208 0 4746348 -- HP PUA U+F06C (579L 108)
+u274D 25205,19120 2 4746349 -- HP PUA U+F06D (579L 109)
+u25A0 19753,17208 0 4746350 -- HP PUA U+F06E (579L 110)
+u25A1 23577,19120 2 4746351 -- HP PUA U+F06F (579L 111)
+--- 23577,19120 2 4746352 -- HP PUA U+F070 (579L 112)
+u2751 23577,19120 2 4746353 -- HP PUA U+F071 (579L 113)
+u2752 23577,19120 2 4746354 -- HP PUA U+F072 (579L 114)
+--- 12105,14973 0 4746355 -- HP PUA U+F073 (579L 115)
+u2666 19753,20386,1253 2 4746356 -- HP PUA U+F074 (579L 116)
+u25C6 26097,20386,1253 2 4746357 -- HP PUA U+F075 (579L 117)
+u2756 23577,19120 2 4746358 -- HP PUA U+F076 (579L 118)
+--- 15283,14973 0 4746359 -- HP PUA U+F077 (579L 119)
+u2327 28047,19120 2 4746360 -- HP PUA U+F078 (579L 120)
+u2353 28047,19120 2 4746361 -- HP PUA U+F079 (579L 121)
+u2318 23577,19120 2 4746362 -- HP PUA U+F07A (579L 122)
+u2740 23590,18746 0 4746363 -- HP PUA U+F07B (579L 123)
+u273F 23590,19017 2 4746364 -- HP PUA U+F07C (579L 124)
+u275D 14030,20399 2 4746365 -- HP PUA U+F07D (579L 125)
+u275E 14030,20399 2 4746366 -- HP PUA U+F07E (579L 126)
+u24EA 23590,19120 2 4746368 -- HP PUA U+F080 (579L 128)
+u2460 23590,19120 2 4746369 -- HP PUA U+F081 (579L 129)
+u2461 23590,19120 2 4746370 -- HP PUA U+F082 (579L 130)
+u2462 23590,19120 2 4746371 -- HP PUA U+F083 (579L 131)
+u2463 23590,19120 2 4746372 -- HP PUA U+F084 (579L 132)
+u2464 23590,19120 2 4746373 -- HP PUA U+F085 (579L 133)
+u2465 23590,19120 2 4746374 -- HP PUA U+F086 (579L 134)
+u2466 23590,19120 2 4746375 -- HP PUA U+F087 (579L 135)
+u2467 23590,19120 2 4746376 -- HP PUA U+F088 (579L 136)
+u2468 23590,19120 2 4746377 -- HP PUA U+F089 (579L 137)
+u2469 23590,19120 2 4746378 -- HP PUA U+F08A (579L 138)
+u24FF 23590,19120 2 4746379 -- HP PUA U+F08B (579L 139)
+u2776 23590,19120 2 4746380 -- HP PUA U+F08C (579L 140)
+u2777 23590,19120 2 4746381 -- HP PUA U+F08D (579L 141)
+u2778 23590,19120 2 4746382 -- HP PUA U+F08E (579L 142)
+u2779 23590,19120 2 4746383 -- HP PUA U+F08F (579L 143)
+u277A 23590,19120 2 4746384 -- HP PUA U+F090 (579L 144)
+u277B 23590,19120 2 4746385 -- HP PUA U+F091 (579L 145)
+u277C 23590,19120 2 4746386 -- HP PUA U+F092 (579L 146)
+u277D 23590,19120 2 4746387 -- HP PUA U+F093 (579L 147)
+u277E 23590,19120 2 4746388 -- HP PUA U+F094 (579L 148)
+u277F 23590,19120 2 4746389 -- HP PUA U+F095 (579L 149)
+--- 26458,14030 0 4746390 -- HP PUA U+F096 (579L 150)
+--- 26458,14030 0 4746391 -- HP PUA U+F097 (579L 151)
+--- 26458,14030 0 4746392 -- HP PUA U+F098 (579L 152)
+--- 26458,14030 0 4746393 -- HP PUA U+F099 (579L 153)
+--- 26458,14030 0 4746394 -- HP PUA U+F09A (579L 154)
+--- 26458,14030 0 4746395 -- HP PUA U+F09B (579L 155)
+--- 26458,14030 0 4746396 -- HP PUA U+F09C (579L 156)
+--- 26458,14030 0 4746397 -- HP PUA U+F09D (579L 157)
+u00B7 8281,11472 0 4746398 -- HP PUA U+F09E (579L 158)
+u2022 12105,13384 0 4746399 -- HP PUA U+F09F (579L 159)
+u25AA 8281,11472 0 4746400 -- HP PUA U+F0A0 (579L 160)
+u25CB 23577,19120 2 4746401 -- HP PUA U+F0A1 (579L 161)
+--- 23577,19120 2 4746402 -- HP PUA U+F0A2 (579L 162)
+--- 23577,19120 2 4746403 -- HP PUA U+F0A3 (579L 163)
+u25C9 23577,19120 2 4746404 -- HP PUA U+F0A4 (579L 164)
+u25CE 23577,19120 2 4746405 -- HP PUA U+F0A5 (579L 165)
+--- 25205,19120 2 4746406 -- HP PUA U+F0A6 (579L 166)
+u25AA 12105,13384 0 4746407 -- HP PUA U+F0A7 (579L 167)
+u25FB 23577,19120 2 4746408 -- HP PUA U+F0A8 (579L 168)
+--- 23577,19120 2 4746409 -- HP PUA U+F0A9 (579L 169)
+u2726 23577,19120 2 4746410 -- HP PUA U+F0AA (579L 170)
+u2605 23577,19120 2 4746411 -- HP PUA U+F0AB (579L 171)
+u2736 23577,19120 2 4746412 -- HP PUA U+F0AC (579L 172)
+u2734 23577,19120 2 4746413 -- HP PUA U+F0AD (579L 173)
+u2739 23577,19120 2 4746414 -- HP PUA U+F0AE (579L 174)
+u2735 23577,19120 2 4746415 -- HP PUA U+F0AF (579L 175)
+--- 23577,19120 2 4746416 -- HP PUA U+F0B0 (579L 176)
+u2316 23577,19120 2 4746417 -- HP PUA U+F0B1 (579L 177)
+u2727 23577,19120 2 4746418 -- HP PUA U+F0B2 (579L 178)
+u2311 23577,16769 0 4746419 -- HP PUA U+F0B3 (579L 179)
+--- 23577,19120 2 4746420 -- HP PUA U+F0B4 (579L 180)
+u272A 23577,19120 2 4746421 -- HP PUA U+F0B5 (579L 181)
+u2730 23577,19120 2 4746422 -- HP PUA U+F0B6 (579L 182)
+--- 23577,19120 2 4746423 -- HP PUA U+F0B7 (579L 183)
+--- 23577,19120 2 4746424 -- HP PUA U+F0B8 (579L 184)
+--- 23577,19120 2 4746425 -- HP PUA U+F0B9 (579L 185)
+--- 23577,19120 2 4746426 -- HP PUA U+F0BA (579L 186)
+--- 23577,19120 2 4746427 -- HP PUA U+F0BB (579L 187)
+--- 23577,19120 2 4746428 -- HP PUA U+F0BC (579L 188)
+--- 23577,19120 2 4746429 -- HP PUA U+F0BD (579L 189)
+--- 23577,19120 2 4746430 -- HP PUA U+F0BE (579L 190)
+--- 23577,19120 2 4746431 -- HP PUA U+F0BF (579L 191)
+--- 23577,19120 2 4746432 -- HP PUA U+F0C0 (579L 192)
+--- 23577,19120 2 4746433 -- HP PUA U+F0C1 (579L 193)
+--- 23577,19120 2 4746434 -- HP PUA U+F0C2 (579L 194)
+--- 23577,20877,2390 2 4746435 -- HP PUA U+F0C3 (579L 195)
+--- 23577,20877,2390 2 4746436 -- HP PUA U+F0C4 (579L 196)
+--- 23577,20877,2390 2 4746437 -- HP PUA U+F0C5 (579L 197)
+--- 23577,20877,2390 2 4746438 -- HP PUA U+F0C6 (579L 198)
+--- 27724,19120 2 4746439 -- HP PUA U+F0C7 (579L 199)
+--- 27724,19120 2 4746440 -- HP PUA U+F0C8 (579L 200)
+--- 27724,19120 2 4746441 -- HP PUA U+F0C9 (579L 201)
+--- 27724,19120 2 4746442 -- HP PUA U+F0CA (579L 202)
+--- 26458,20244,5103 3 4746443 -- HP PUA U+F0CB (579L 203)
+--- 26458,20877,5581 3 4746444 -- HP PUA U+F0CC (579L 204)
+--- 26458,20244,4935 3 4746445 -- HP PUA U+F0CD (579L 205)
+--- 26458,20244,4935 3 4746446 -- HP PUA U+F0CE (579L 206)
+--- 26458,20244,4935 3 4746447 -- HP PUA U+F0CF (579L 207)
+--- 26458,20244,4935 3 4746448 -- HP PUA U+F0D0 (579L 208)
+--- 26458,20244,4948 3 4746449 -- HP PUA U+F0D1 (579L 209)
+--- 26458,20244,4935 3 4746450 -- HP PUA U+F0D2 (579L 210)
+--- 26458,20244,4935 3 4746451 -- HP PUA U+F0D3 (579L 211)
+--- 26458,20257,4935 3 4746452 -- HP PUA U+F0D4 (579L 212)
+u232B 33150,19120 2 4746453 -- HP PUA U+F0D5 (579L 213)
+u2326 33150,19120 2 4746454 -- HP PUA U+F0D6 (579L 214)
+--- 21019,19120 2 4746455 -- HP PUA U+F0D7 (579L 215)
+u27A2 21019,19120 2 4746456 -- HP PUA U+F0D8 (579L 216)
+--- 23577,19120 2 4746457 -- HP PUA U+F0D9 (579L 217)
+--- 23577,16562 0 4746458 -- HP PUA U+F0DA (579L 218)
+--- 23577,19120 2 4746459 -- HP PUA U+F0DB (579L 219)
+u27B2 23577,19120 2 4746460 -- HP PUA U+F0DC (579L 220)
+--- 23577,19120 2 4746461 -- HP PUA U+F0DD (579L 221)
+--- 23577,18578 0 4746462 -- HP PUA U+F0DE (579L 222)
+--- 25916,19120 2 4746463 -- HP PUA U+F0DF (579L 223)
+--- 25916,19120 2 4746464 -- HP PUA U+F0E0 (579L 224)
+--- 23577,19120,2338 2 4746465 -- HP PUA U+F0E1 (579L 225)
+--- 23577,21459 2 4746466 -- HP PUA U+F0E2 (579L 226)
+--- 20528,17596 0 4746467 -- HP PUA U+F0E3 (579L 227)
+--- 20528,17596 0 4746468 -- HP PUA U+F0E4 (579L 228)
+--- 20528,17596 0 4746469 -- HP PUA U+F0E5 (579L 229)
+--- 20528,17596 0 4746470 -- HP PUA U+F0E6 (579L 230)
+--- 28241,19120 2 4746471 -- HP PUA U+F0E7 (579L 231)
+u2794 28241,19120 2 4746472 -- HP PUA U+F0E8 (579L 232)
+--- 23577,19120,4664 3 4746473 -- HP PUA U+F0E9 (579L 233)
+--- 23577,23784 2 4746474 -- HP PUA U+F0EA (579L 234)
+--- 23086,18875 2 4746475 -- HP PUA U+F0EB (579L 235)
+--- 23086,18875 2 4746476 -- HP PUA U+F0EC (579L 236)
+--- 23086,18875 2 4746477 -- HP PUA U+F0ED (579L 237)
+--- 23086,18875 2 4746478 -- HP PUA U+F0EE (579L 238)
+u21E6 23577,17738 0 4746479 -- HP PUA U+F0EF (579L 239)
+u21E8 23577,17738 0 4746480 -- HP PUA U+F0F0 (579L 240)
+u21E7 21446,19120 2 4746481 -- HP PUA U+F0F1 (579L 241)
+u21E9 21446,19120 2 4746482 -- HP PUA U+F0F2 (579L 242)
+u2B04 28047,17738 0 4746483 -- HP PUA U+F0F3 (579L 243)
+u21F3 21446,19120,4470 2 4746484 -- HP PUA U+F0F4 (579L 244)
+u2B00 20683,19120 2 4746485 -- HP PUA U+F0F5 (579L 245)
+u2B01 20683,19120 2 4746486 -- HP PUA U+F0F6 (579L 246)
+u2B03 20683,16226 0 4746487 -- HP PUA U+F0F7 (579L 247)
+u2B02 20683,16226 0 4746488 -- HP PUA U+F0F8 (579L 248)
+u25AD 12751,13384 0 4746489 -- HP PUA U+F0F9 (579L 249)
+u25AB 10193,13384 0 4746490 -- HP PUA U+F0FA (579L 250)
+u2717 16808,15852 0 4746491 -- HP PUA U+F0FB (579L 251)
+u2713 20787,20257 2 4746492 -- HP PUA U+F0FC (579L 252)
+u2612 23590,19120 2 4746493 -- HP PUA U+F0FD (579L 253)
+u2611 23590,20167 2 4746494 -- HP PUA U+F0FE (579L 254)
+--- 27376,19844 2 4746495 -- HP PUA U+F0FF (579L 255)
diff --git a/font/devlj4/devlj4.am b/font/devlj4/devlj4.am
new file mode 100644
index 0000000..9f17c4d
--- /dev/null
+++ b/font/devlj4/devlj4.am
@@ -0,0 +1,111 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+devlj4_srcdir = $(top_srcdir)/font/devlj4
+LJ4RES = 1200
+LJ4PRINT = $(PSPRINT)
+DEVLJ4FONTFILES = \
+ font/devlj4/AB \
+ font/devlj4/ABI \
+ font/devlj4/AI \
+ font/devlj4/AR \
+ font/devlj4/ALBB \
+ font/devlj4/ALBR \
+ font/devlj4/AOB \
+ font/devlj4/AOI \
+ font/devlj4/AOR \
+ font/devlj4/CB \
+ font/devlj4/CBI \
+ font/devlj4/CI \
+ font/devlj4/CR \
+ font/devlj4/GB \
+ font/devlj4/GBI \
+ font/devlj4/GI \
+ font/devlj4/GR \
+ font/devlj4/LGB \
+ font/devlj4/LGI \
+ font/devlj4/LGR \
+ font/devlj4/OB \
+ font/devlj4/OBI \
+ font/devlj4/OI \
+ font/devlj4/OR \
+ font/devlj4/TB \
+ font/devlj4/TBI \
+ font/devlj4/TI \
+ font/devlj4/TR \
+ font/devlj4/TNRB \
+ font/devlj4/TNRBI \
+ font/devlj4/TNRI \
+ font/devlj4/TNRR \
+ font/devlj4/UB \
+ font/devlj4/UBI \
+ font/devlj4/UI \
+ font/devlj4/UR \
+ font/devlj4/UCB \
+ font/devlj4/UCBI \
+ font/devlj4/UCI \
+ font/devlj4/UCR \
+ font/devlj4/CLARENDON \
+ font/devlj4/CORONET \
+ font/devlj4/MARIGOLD \
+ font/devlj4/S \
+ font/devlj4/SYMBOL \
+ font/devlj4/WINGDINGS
+
+devlj4fontdir = $(fontdir)/devlj4
+dist_devlj4font_DATA = $(DEVLJ4FONTFILES)
+nodist_devlj4font_DATA = font/devlj4/DESC
+
+DEVLJ4GENFILES = \
+ font/devlj4/generate/Makefile \
+ font/devlj4/generate/special.map \
+ font/devlj4/generate/symbol.map \
+ font/devlj4/generate/text.map \
+ font/devlj4/generate/wingdings.map \
+ font/devlj4/generate/special.awk
+devlj4fontgendir = $(devlj4fontdir)/generate
+dist_devlj4fontgen_DATA = $(DEVLJ4GENFILES)
+
+EXTRA_DIST += font/devlj4/DESC.in
+
+MOSTLYCLEANFILES += font/devlj4/DESC
+
+font/devlj4/DESC: $(devlj4_srcdir)/DESC.in
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && echo "res $(LJ4RES)" >$@ \
+ && echo "unitwidth `expr 7620000 / $(LJ4RES)`" >>$@ \
+ && cat $(devlj4_srcdir)/DESC.in >>$@ \
+ && if test "$(PAGE)" = A4; then \
+ echo "papersize a4" >>$@; \
+ else \
+ echo "papersize letter" >>$@; \
+ fi \
+ && (test -z '$(LJ4PRINT)' \
+ || echo print '$(LJ4PRINT)' >>$@)
+
+fonts: devlj4_fonts
+devlj4_fonts: hpftodit font/devlj4/DESC
+ $(MAKE) -f $(devlj4_srcdir)/generate/Makefile \
+ srcdir=$(devlj4_srcdir)/generate \
+ HPFTODIT=$(top_builddir)/hpftodit
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/font/devlj4/generate/Makefile b/font/devlj4/generate/Makefile
new file mode 100644
index 0000000..0b179b6
--- /dev/null
+++ b/font/devlj4/generate/Makefile
@@ -0,0 +1,274 @@
+# Makefile for 'font devlj4 generate'
+#
+# Copyright (C) 1994-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Directory containing Autofont TFM files.
+# The TFM files used are available for ftp as
+#
+# ftp://ftp.hp.com/pub/faxes/software/tfmlj4p.exe
+#
+# This is a self-extracting MS-DOS archive (in ZIP format).
+#
+# Metric files for the Arial and Times New Roman families and the Symbol
+# font have been replaced with versions which have more glyphs and/or
+# kerning pairs:
+#
+# ftp://ftp.ffii.org/pub/groff/contrib/lj4/tfmlj4x.zip
+
+# This is set up so you can do
+# make -f generate/Makefile
+# in the parent directory of this directory.
+
+AUTOFONT=/usr/local/lib/groff-lj4
+HPFTODIT=hpftodit
+# .05 em
+IFLAG=-i 50
+SFLAG=-s
+srcdir=generate
+TEXTMAP=$(srcdir)/text.map
+SPECIALMAP=$(srcdir)/special.map
+SYMBOLMAP=$(srcdir)/symbol.map
+WINGDINGSMAP=$(srcdir)/wingdings.map
+
+FONTS=\
+ AB ABI AI AR \
+ ALBB ALBR \
+ AOB AOI AOR \
+ CB CBI CI CR \
+ GB GBI GI GR \
+ LGB LGI LGR \
+ OB OBI OI OR \
+ TB TBI TI TR \
+ TNRB TNRBI TNRI TNRR \
+ UB UBI UI UR \
+ UCB UCBI UCI UCR \
+ CLARENDON CORONET MARIGOLD S \
+ SYMBOL WINGDINGS
+
+RM=rm -f
+
+all: $(FONTS)
+
+#
+# Intellifont
+#
+
+# CG Times
+TR: $(AUTOFONT)/9nb00086.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb00086.tfm $(TEXTMAP) $@
+
+# CG Times Italic
+TI: $(AUTOFONT)/9nb00084.tfm $(TEXTMAP)
+ $(HPFTODIT) $(IFLAG) $(AUTOFONT)/9nb00084.tfm $(TEXTMAP) $@
+
+# CG Times Bold
+TB: $(AUTOFONT)/9nb00083.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb00083.tfm $(TEXTMAP) $@
+
+# CG Times Bold Italic
+TBI: $(AUTOFONT)/9nb00085.tfm $(TEXTMAP)
+ $(HPFTODIT) $(IFLAG) $(AUTOFONT)/9nb00085.tfm $(TEXTMAP) $@
+
+# Courier
+CR: $(AUTOFONT)/9nb00064.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb00064.tfm $(TEXTMAP) $@
+
+# Courier Italic
+CI: $(AUTOFONT)/9nb00062.tfm $(TEXTMAP)
+ $(HPFTODIT) $(IFLAG) $(AUTOFONT)/9nb00062.tfm $(TEXTMAP) $@
+
+# Courier Bold
+CB: $(AUTOFONT)/9nb00061.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb00061.tfm $(TEXTMAP) $@
+
+# Courier Bold Italic
+CBI: $(AUTOFONT)/9nb00063.tfm $(TEXTMAP)
+ $(HPFTODIT) $(IFLAG) $(AUTOFONT)/9nb00063.tfm $(TEXTMAP) $@
+
+# Garamond Antiqua
+GR: $(AUTOFONT)/9nb00068.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb00068.tfm $(TEXTMAP) $@
+
+# Garamond Kursiv
+GI: $(AUTOFONT)/9nb00066.tfm $(TEXTMAP)
+ $(HPFTODIT) $(IFLAG) $(AUTOFONT)/9nb00066.tfm $(TEXTMAP) $@
+
+# Garamond Halbfett
+GB: $(AUTOFONT)/9nb00065.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb00065.tfm $(TEXTMAP) $@
+
+# Garamond Kursiv Halbfett
+GBI: $(AUTOFONT)/9nb00067.tfm $(TEXTMAP)
+ $(HPFTODIT) $(IFLAG) $(AUTOFONT)/9nb00067.tfm $(TEXTMAP) $@
+
+# Omega
+OR: $(AUTOFONT)/9nb00076.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb00076.tfm $(TEXTMAP) $@
+
+# Omega Italic
+OI: $(AUTOFONT)/9nb00074.tfm $(TEXTMAP)
+ $(HPFTODIT) $(IFLAG) $(AUTOFONT)/9nb00074.tfm $(TEXTMAP) $@
+
+# Omega Bold
+OB: $(AUTOFONT)/9nb00073.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb00073.tfm $(TEXTMAP) $@
+
+# Omega Bold Italic
+OBI: $(AUTOFONT)/9nb00075.tfm $(TEXTMAP)
+ $(HPFTODIT) $(IFLAG) $(AUTOFONT)/9nb00075.tfm $(TEXTMAP) $@
+
+# Univers
+UR: $(AUTOFONT)/9nb00094.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb00094.tfm $(TEXTMAP) $@
+
+# Univers Italic
+UI: $(AUTOFONT)/9nb00092.tfm $(TEXTMAP)
+ $(HPFTODIT) $(IFLAG) $(AUTOFONT)/9nb00092.tfm $(TEXTMAP) $@
+
+# Univers Bold
+UB: $(AUTOFONT)/9nb00088.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb00088.tfm $(TEXTMAP) $@
+
+# Univers Bold Italic
+UBI: $(AUTOFONT)/9nb00093.tfm $(TEXTMAP)
+ $(HPFTODIT) $(IFLAG) $(AUTOFONT)/9nb00093.tfm $(TEXTMAP) $@
+
+# Univers Condensed
+UCR: $(AUTOFONT)/9nb00089.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb00089.tfm $(TEXTMAP) $@
+
+# Univers Condensed Italic
+UCI: $(AUTOFONT)/9nb00087.tfm $(TEXTMAP)
+ $(HPFTODIT) $(IFLAG) $(AUTOFONT)/9nb00087.tfm $(TEXTMAP) $@
+
+# Univers Condensed Bold
+UCB: $(AUTOFONT)/9nb00090.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb00090.tfm $(TEXTMAP) $@
+
+# Univers Condensed Bold Italic
+UCBI: $(AUTOFONT)/9nb00091.tfm $(TEXTMAP)
+ $(HPFTODIT) $(IFLAG) $(AUTOFONT)/9nb00091.tfm $(TEXTMAP) $@
+
+# Albertus
+ALBR: $(AUTOFONT)/9nb00052.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb00052.tfm $(TEXTMAP) $@
+
+# Albertus Extrabold
+ALBB: $(AUTOFONT)/9nb00051.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb00051.tfm $(TEXTMAP) $@
+
+# Letter Gothic
+LGR: $(AUTOFONT)/9nb00071.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb00071.tfm $(TEXTMAP) $@
+
+# Letter Gothic Italic
+LGI: $(AUTOFONT)/9nb00070.tfm $(TEXTMAP)
+ $(HPFTODIT) $(IFLAG) $(AUTOFONT)/9nb00070.tfm $(TEXTMAP) $@
+
+# Letter Gothic Bold
+LGB: $(AUTOFONT)/9nb00069.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb00069.tfm $(TEXTMAP) $@
+
+# Antique Olive
+AOR: $(AUTOFONT)/9nb00055.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb00055.tfm $(TEXTMAP) $@
+
+# Antique Olive Italic
+AOI: $(AUTOFONT)/9nb00054.tfm $(TEXTMAP)
+ $(HPFTODIT) $(IFLAG) $(AUTOFONT)/9nb00054.tfm $(TEXTMAP) $@
+
+# Antique Olive Bold
+AOB: $(AUTOFONT)/9nb00053.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb00053.tfm $(TEXTMAP) $@
+
+# Marigold
+MARIGOLD: $(AUTOFONT)/9nb00072.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb00072.tfm $(TEXTMAP) $@
+
+# Coronet
+CORONET: $(AUTOFONT)/9nb00077.tfm $(TEXTMAP)
+ $(HPFTODIT) $(IFLAG) $(AUTOFONT)/9nb00077.tfm $(TEXTMAP) $@
+
+# Clarendon Condensed
+CLARENDON: $(AUTOFONT)/9nb00060.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb00060.tfm $(TEXTMAP) $@
+
+S: $(AUTOFONT)/9nb00086.tfm $(SPECIALMAP) $(srcdir)/special.awk
+ $(HPFTODIT) $(SFLAG) $(AUTOFONT)/9nb00086.tfm $(SPECIALMAP) - \
+ | awk -f $(srcdir)/special.awk > $@
+
+#
+# TrueType
+#
+
+# Times New Roman
+TNRR: $(AUTOFONT)/tmnr000s.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/tmnr000s.tfm $(TEXTMAP) $@
+
+# Times New Roman Italic
+TNRI: $(AUTOFONT)/tmni000s.tfm $(TEXTMAP)
+ $(HPFTODIT) $(IFLAG) $(AUTOFONT)/tmni000s.tfm $(TEXTMAP) $@
+
+# Times New Roman Bold
+TNRB: $(AUTOFONT)/tmnb000s.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/tmnb000s.tfm $(TEXTMAP) $@
+
+# Times New Roman Bold Italic
+TNRBI: $(AUTOFONT)/tmnj000s.tfm $(TEXTMAP)
+ $(HPFTODIT) $(IFLAG) $(AUTOFONT)/tmnj000s.tfm $(TEXTMAP) $@
+
+# Arial
+AR: $(AUTOFONT)/arlr000s.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/arlr000s.tfm $(TEXTMAP) $@
+
+# Arial Italic
+AI: $(AUTOFONT)/arli000s.tfm $(TEXTMAP)
+ $(HPFTODIT) $(IFLAG) $(AUTOFONT)/arli000s.tfm $(TEXTMAP) $@
+
+# Arial Bold
+AB: $(AUTOFONT)/arlb000s.tfm $(TEXTMAP)
+ $(HPFTODIT) $(AUTOFONT)/arlb000s.tfm $(TEXTMAP) $@
+
+# Arial Bold Italic
+ABI: $(AUTOFONT)/arlj000s.tfm $(TEXTMAP)
+ $(HPFTODIT) $(IFLAG) $(AUTOFONT)/arlj000s.tfm $(TEXTMAP) $@
+
+# Symbol
+SYMBOL: $(AUTOFONT)/9nb28703.tfm $(SYMBOLMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb28703.tfm $(SYMBOLMAP) $@
+
+# Wingdings
+WINGDINGS: $(AUTOFONT)/9nb00095.tfm $(WINGDINGSMAP)
+ $(HPFTODIT) $(AUTOFONT)/9nb00095.tfm $(WINGDINGSMAP) $@
+
+clean:
+
+realclean:
+ $(RM) $(FONTS)
+
+extraclean: realclean
+ $(RM) core *~ "#*"
+
+.PHONY: clean realclean extraclean all
+
+# Local Variables:
+# mode: makefile
+# fill-column: 72
+# End:
+# vim: set textwidth=72:
diff --git a/font/devlj4/generate/special.awk b/font/devlj4/generate/special.awk
new file mode 100644
index 0000000..8e3c702
--- /dev/null
+++ b/font/devlj4/generate/special.awk
@@ -0,0 +1,80 @@
+# Correct Intellifont-based height metrics for several glyphs in
+# special font for TrueType CG Times (LaserJet 4000 and later).
+
+function scale(num)
+{
+ return int(num * em + 0.5)
+}
+
+BEGIN {
+ FS = "\t"
+ OFS = "\t"
+ em = 26346 # Intellifont (8782 DU/em) and hpftodit(1) multiplier of 3
+
+ ascent["integralcrvmid"] = scale(0.84358)
+ descent["integralcrvmid"] = scale(0.25006)
+ ascent["integralbt"] = scale(0.84358)
+ descent["integralbt"] = scale(0.15164)
+ ascent["lt"] = scale(0.84358)
+ descent["lt"] = scale(0.15164)
+ ascent["parenlefttp"] = scale(0.84358)
+ descent["parenlefttp"] = scale(0.15164)
+ ascent["bracelefttp"] = scale(0.84358)
+ descent["bracelefttp"] = scale(0.15164)
+ ascent["lk"] = scale(0.84358)
+ descent["lk"] = scale(0.15164)
+ ascent["braceleftmid"] = scale(0.84358)
+ descent["braceleftmid"] = scale(0.15164)
+ ascent["lb"] = scale(0.84358)
+ descent["lb"] = scale(0.15164)
+ ascent["parenleftbt"] = scale(0.84358)
+ descent["parenleftbt"] = scale(0.15164)
+ ascent["braceleftbt"] = scale(0.84358)
+ descent["braceleftbt"] = scale(0.15164)
+ ascent["rt"] = scale(0.84358)
+ descent["rt"] = scale(0.15164)
+ ascent["parenrighttp"] = scale(0.84358)
+ descent["parenrighttp"] = scale(0.15164)
+ ascent["bracerighttp"] = scale(0.84358)
+ descent["bracerighttp"] = scale(0.15164)
+ ascent["rk"] = scale(0.84358)
+ descent["rk"] = scale(0.15164)
+ ascent["bracerightmid"] = scale(0.84358)
+ descent["bracerightmid"] = scale(0.15164)
+ ascent["rb"] = scale(0.84358)
+ descent["rb"] = scale(0.15164)
+ ascent["parenrightbt"] = scale(0.84358)
+ descent["parenrightbt"] = scale(0.15164)
+ ascent["bracerightbt"] = scale(0.84358)
+ descent["bracerightbt"] = scale(0.15164)
+ ascent["parenrightex"] = scale(0.84358)
+ descent["parenrightex"] = scale(0.15164)
+ ascent["parenleftex"] = scale(0.84358)
+ descent["parenleftex"] = scale(0.15164)
+ ascent["bv"] = scale(0.84358)
+ descent["bv"] = scale(0.15164)
+ ascent["bracerightex"] = scale(0.84358)
+ descent["bracerightex"] = scale(0.15164)
+ ascent["braceleftex"] = scale(0.84358)
+ descent["braceleftex"] = scale(0.15164)
+ ascent["integralex"] = scale(0.84358)
+ descent["integralex"] = scale(0.15164)
+ ascent["bracketrightex"] = scale(0.84358)
+ descent["bracketrightex"] = scale(0.15164)
+ ascent["bracketleftex"] = scale(0.84358)
+ descent["bracketleftex"] = scale(0.15164)
+ ascent["barex"] = scale(0.84358)
+ descent["barex"] = scale(0.15164)
+}
+{
+ if ($2 != "\"" && ascent[$1]) {
+ n = split($2, temp, ",")
+ $2 = sprintf("%d,%d,%d", temp[1], ascent[$1], descent[$1])
+ # just in case there are additional metrics
+ for (i = 4; i <= n; i++)
+ $2 = $2 "," temp[i]
+ }
+ print $0
+}
+
+# EOF
diff --git a/font/devlj4/generate/special.map b/font/devlj4/generate/special.map
new file mode 100644
index 0000000..1315672
--- /dev/null
+++ b/font/devlj4/generate/special.map
@@ -0,0 +1,271 @@
+# Map HP MSL numbers and HP Unicode values to troff names for a special font.
+#
+# Created 30 December 2003 -- you need hpftodit from groff 1.19.1 or newer!
+
+12 002B pl
+30 003D eq
+34 0041 *A
+35 0042 *B
+38 0045 *E
+41 0048 *Y
+42 0049 *I
+44 004B *K
+46 004D *M
+47 004E *N
+48 004F *O
+49 0050 *R
+53 0054 *T
+57 0058 *X
+59 005A *Z
+96 007E ap
+97 2592 u2592
+183 2212 mi
+189 25A0 u25A0
+191 00B1 +-
+194 00AC no
+201 00D7 mu
+202 00F7 di
+203 263A u263A
+204 263B u263B
+205 2665 HE
+206 2666 DI
+207 2663 CL
+208 2660 SP
+209 25CF u25CF
+210 25D8 u25D8
+212 25D9 u25D9
+213 2642 u2642
+214 2640 u2640
+215 266A u266A
+216 266B u266B
+217 263C u263C
+218 25BA u25BA
+219 25C4 u25C4
+220 2195 va
+222 25AC u25AC
+223 21A8 u21A8
+224 2191 ua
+225 2193 da
+226 2192 ->
+227 2190 <-
+# U+2319 would be the right code for MSL 228, according to the description
+# and used glyph shape in the PCL 5 comparison guide, but this neither
+# reflects the actual look nor the mapping value used in recent HP printers.
+228 221F u221F
+229 2194 <>
+230 25B2 u25B2
+231 25BC u25BC
+233 2310 u2310
+234 2591 u2591
+235 2593 u2593
+236 2502 u2502
+237 2524 u2524
+238 2561 u2561
+239 2562 u2562
+240 2556 u2556
+241 2555 u2555
+242 2563 u2563
+243 2551 u2551
+244 2557 u2557
+245 255D u255D
+246 255C u255C
+247 255B u255B
+248 2510 u2510
+249 2514 u2514
+250 2534 u2534
+251 252C u252C
+252 251C u251C
+253 2500 u2500
+254 253C u253C
+255 255E u255E
+256 255F u255F
+257 255A u255A
+258 2554 u2554
+259 2569 u2569
+260 2566 u2566
+261 2560 u2560
+262 2550 u2550
+263 256C u256C
+264 2567 u2567
+265 2568 u2568
+266 2564 u2564
+267 2565 u2565
+268 2559 u2559
+269 2558 u2558
+270 2552 u2552
+271 2553 u2553
+272 256B u256B
+273 256A u256A
+274 2518 u2518
+275 250C u250C
+276 2588 u2588
+277 2584 u2584
+278 258C u258C
+279 2590 u2590
+280 2580 u2580
+292 221E if
+295 2229 ca
+296 2261 ==
+297 2265 >=
+298 2264 <=
+299 2320 u2320
+300 2321 u2321
+301 2248 ~= ~~
+302 00B7 md
+303 221A u221A
+305 25AA u25AA
+333 2302 u2302
+500 EFBF sqrt sr
+501 221D pt
+502 212F u212F
+503 EFEC *e
+504 2234 3d tf
+505 0393 *G
+506 2206 *D
+507 0398 *H
+508 039B *L
+509 039E *C
+510 03A0 *P
+511 03A3 *S
+512 03A5 *U
+513 03A6 *F
+514 03A8 *Q
+515 03A9 *W
+516 2207 gr
+517 2202 pd
+518 03C2 ts
+519 2260 !=
+521 2235 u2235
+522 03B1 *a
+523 03B2 *b
+524 03B3 *g
+525 03B4 *d
+526 03B5 +e
+527 03B6 *z
+528 03B7 *y
+529 03B8 *h
+530 03B9 *i
+531 03BA *k
+532 03BB *l
+533 03BC *m
+534 03BD *n
+535 03BE *c
+536 03BF *o
+537 03C0 *p
+538 03C1 *r
+539 03C3 *s
+540 03C4 *t
+541 03C5 *u
+542 03C6 *f
+543 03C7 *x
+544 03C8 *q
+545 03C9 *w
+546 03D1 +h
+547 03D5 +f
+548 03D6 +p
+549 2243 |=
+550 2262 ne
+551 21D1 arrowverttp uA
+552 21D2 rA rh
+553 21D3 arrowvertbt dA
+554 21D0 lA lh
+555 21D5 vA
+556 21D4 hA
+557 21C4 u21C4
+558 21C6 u21C6
+559 EFE9 u21C0
+560 EFEA radicalex
+561 2200 fa
+562 2203 te
+563 22A4 u22A4
+564 22A5 pp
+565 222A cu
+566 2208 mo
+567 220B u220B
+568 2209 nm
+569 2282 sb
+570 2283 sp
+571 2284 nb
+572 2285 nc
+573 2286 ib
+574 2287 ip
+575 2295 c+
+576 2299 u2299
+577 2297 c*
+578 2296 u2296
+579 2298 u2298
+580 2227 AN
+581 2228 OR
+582 22BB u22BB
+583 2218 u2218
+584 20DD ci
+585 22A3 u22A3
+586 22A2 u22A2
+587 222B integral is
+588 222E u222E
+589 2220 /_
+590 2205 es
+591 2135 Ah
+592 2136 u2136
+593 2137 u2137
+594 212D u212D
+595 2111 Im
+596 211C Re
+597 2128 u2128
+598 EFE7 bracketlefttp lc
+599 EFE6 bracketleftbt lf
+600 EFE3 bracelefttp lt parenlefttp
+601 EFE2 braceleftmid lk
+602 EFE1 braceleftbt lb parenleftbt
+603 EFD4 integralcrvmid
+605 2225 arrowvertex
+608 EFE5 bracketrighttp rc
+609 EFE4 bracketrightbt rf
+610 EFE0 bracerighttp parenrighttp rt
+611 EFDF bracerightmid rk
+612 EFDE bracerightbt parenrightbt rb
+613 EFDD braceex braceleftex bracerightex bv parenleftex parenrightex
+614 2223 barex bracketleftex bracketrightex
+615 EFDC u23B7
+620 2213 -+
+621 2329 la
+622 232A ra
+624 2245 =~
+625 2197 u2197
+626 2198 u2198
+627 2199 u2199
+628 2196 u2196
+629 25B5 u25B5
+630 25B9 u25B9
+631 25BF u25BF
+632 25C3 u25C3
+633 226A <<
+634 226B >>
+635 2237 u2237
+636 EFCA u225C
+637 EFD5 u03DD
+638 210F -h hbar
+639 2112 u2112
+641 2118 wp
+642 2211 sum
+643 301A u27E6
+645 301B u27E7
+646 256D u256D
+647 2570 u2570
+654 25C7 lz
+655 256E u256E
+656 256F u256F
+662 25C6 u25C6
+663 220D st
+664 2217 **
+665 EFE8 an
+668 221F u221F
+669 220F product
+1099 21B5 CR
+1108 25AB u25AB
+1109 25E6 u25E6
+1110 25CB u25CB
+1112 21B5 u21B5
+1114 2423 u2423
+
+# EOF
diff --git a/font/devlj4/generate/symbol.map b/font/devlj4/generate/symbol.map
new file mode 100644
index 0000000..068a4f8
--- /dev/null
+++ b/font/devlj4/generate/symbol.map
@@ -0,0 +1,199 @@
+# Map HP Unicode values to groff names for Monotype Symbol font.
+#
+# This font is TrueType only, so the MSL values are dummies.
+#
+# Created 16 January 2004. Some mappings are taken from Alan Wood's
+# website (www.alanwood.net)
+#
+# You need hpftodit from groff 1.19.1 or newer!
+
+-1 F021 ! # exclamation point
+-1 F022 fa # for all (u2200)
+-1 F023 # sh # number sign
+-1 F024 te # there exists (u2203)
+-1 F025 % # per cent
+-1 F026 & # ampersand
+-1 F027 st # such that, small contains as member (u220D)
+-1 F028 ( # left parenthesis
+-1 F029 ) # right parenthesis
+-1 F02A ** # math asterisk operator (u2217)
+-1 F02B pl # plus
+-1 F02C , # comma
+-1 F02D mi # minus (- is hyphen) (u2212)
+-1 F02E . # period
+-1 F02F / sl # solidus
+-1 F030 0 # numeral 0
+-1 F031 1 # numeral 1
+-1 F032 2 # numeral 2
+-1 F033 3 # numeral 3
+-1 F034 4 # numeral 4
+-1 F035 5 # numeral 5
+-1 F036 6 # numeral 6
+-1 F037 7 # numeral 7
+-1 F038 8 # numeral 8
+-1 F039 9 # numeral 9
+-1 F03A : # colon
+-1 F03B ; # semicolon
+-1 F03C < # less than
+-1 F03D = # equals
+-1 F03E > # greater than
+-1 F03F ? # question mark
+-1 F040 =~ # approximately equal to, congruent (u2245)
+-1 F041 *A # capital Alpha (u0391)
+-1 F042 *B # capital Beta (u0392)
+-1 F043 *X # capital Chi (u03A7)
+-1 F044 *D # capital Delta (u0394)
+-1 F045 *E # capital Epsilon (u0395)
+-1 F046 *F # capital Phi (u03A6)
+-1 F047 *G # capital Gamma (u0393)
+-1 F048 *Y # capital Eta (u0397)
+-1 F049 *I # capital Iota (u0399)
+-1 F04A +h # theta symbol (u03D1)
+-1 F04B *K # capital Kappa (u039A)
+-1 F04C *L # capital Lambda (u039B)
+-1 F04D *M # capital Mu (u039C)
+-1 F04E *N # capital Nu (u039D)
+-1 F04F *O # capital Omicron (u039F)
+-1 F050 *P # capital Pi (u03A0)
+-1 F051 *H # capital Theta (u0398)
+-1 F052 *R # capital Rho (u03A1)
+-1 F053 *S # capital Sigma (u03A3)
+-1 F054 *T # capital Tau (u03A4)
+-1 F055 *U # capital Upsilon (u03A5)
+-1 F056 ts # lower case sigma (terminal) (u03C2)
+-1 F057 *W # capital Omega (u03A9)
+-1 F058 *C # capital Xi (u039E)
+-1 F059 *Q # capital Psi (u03A8)
+-1 F05A *Z # capital Zeta (u0396)
+-1 F05B [ lB # left bracket
+-1 F05C 3d tf # therefore (u2234)
+-1 F05D ] rB # right bracket
+-1 F05E pp # perpendicular (u22A5)
+-1 F05F _ # underscore
+-1 F060 --- # radical extender
+-1 F061 *a # lower case alpha (u03B1)
+-1 F062 *b # lower case beta (u03B2)
+-1 F063 *x # lower case chi (u03C7)
+-1 F064 *d # lower case delta (u03B4)
+-1 F065 *e # lower case epsilon (u03B5)
+-1 F066 +f # lower case phi (stroked) (u03D5)
+-1 F067 *g # lower case gamma (u03B3)
+-1 F068 *y # lower case eta (u03B7)
+-1 F069 *i # lower case iota (u03B9)
+-1 F06A *f # lower case phi (curly) (u03C6)
+-1 F06B *k # lower case kappa (u03BA)
+-1 F06C *l # lower case lambda (u03BB)
+-1 F06D *m # lower case mu (u03BC)
+-1 F06E *n # lower case nu (u03BD)
+-1 F06F *o # lower case omicron (u03BF)
+-1 F070 *p # lower case pi (u03C0)
+-1 F071 *h # lower case theta (u03B8)
+-1 F072 *r # lower case rho (u03C1)
+-1 F073 *s # lower case sigma (u03C3)
+-1 F074 *t # lower case tau (u03C4)
+-1 F075 *u # lower case upsilon (u03C5)
+-1 F076 +p # pi symbol (u03D6)
+-1 F077 *w # lower case omega (u03C9)
+-1 F078 *c # lower case xi (u03BE)
+-1 F079 *q # lower case psi (u03C8)
+-1 F07A *z # lower case zeta (u03B6)
+-1 F07B { lC # left brace
+-1 F07C | ba # vertical bar
+-1 F07D } rC # right brace
+-1 F07E ap # similar, tilde operator (u223C)
+-1 F0A1 u03D2 # upsilon with hook symbol (u03D2)
+-1 F0A2 fm # prime or minutes or feet (u2032)
+-1 F0A3 <= # less than or equal to (u2264)
+-1 F0A4 f/ # figure slash (fraction) (/ is normal slash) (u2044)
+-1 F0A5 if # infinity (u221E)
+-1 F0A6 u0192 # Florin or Guilder
+-1 F0A7 CL # clubs (u2663)
+-1 F0A8 DI # diamonds (u2666)
+-1 F0A9 HE # hearts (u2665)
+-1 F0AA SP # spades (u2660)
+-1 F0AB <> # arrow left and right (u2194)
+-1 F0AC <- # arrow left (u2190)
+-1 F0AD ua # arrow up (u2191)
+-1 F0AE -> # arrow right (u2192)
+-1 F0AF da # arrow down (u2193)
+-1 F0B0 de # degree
+-1 F0B1 +- # plus minus (u00B1)
+-1 F0B2 sd # double prime or seconds or inches (u2033)
+-1 F0B3 >= # greater than or equal to (u2265)
+-1 F0B4 mu # multiply (u00D7)
+-1 F0B5 pt # proportional (u221D)
+-1 F0B6 pd # partial derivative / partial differential (u2202)
+-1 F0B7 u2219 # bullet operator (u2219)
+-1 F0B8 di # divide (u00F7)
+-1 F0B9 != # not equal (u2260)
+-1 F0BA == # equivalent (u2261)
+-1 F0BB ~= ~~ # almost equal to, asymptotic to (u2248)
+-1 F0BC u2026 # ellipsis (u2026)
+-1 F0BD u23D0 # vertical arrow extender (u23D0)
+-1 F0BE u23AF # horizontal arrow extender (u23AF)
+-1 F0BF CR # carriage return (u21B5)
+-1 F0C0 Ah # alef symbol (u2135)
+-1 F0C1 Im # I fraktur (u2111)
+-1 F0C2 Re # R fraktur (u211C)
+-1 F0C3 wp # Weierstrass (u2118)
+-1 F0C4 c* # circle multiply (u2297)
+-1 F0C5 c+ # circle plus (u2295)
+-1 F0C6 es # empty set (u2205)
+-1 F0C7 ca # intersection (u2229)
+-1 F0C8 cu # union (u222A)
+-1 F0C9 sp # proper superset, superset of (u2283)
+-1 F0CA ip # reflex superset (contains or equals), superset of or equal to (u2287)
+-1 F0CB nb # not subset (u2284)
+-1 F0CC sb # proper subset, subset of (u2282)
+-1 F0CD ib # reflex subset (contained in or equals), subset of or equal to (u2286)
+-1 F0CE mo # member (element) (u2208)
+-1 F0CF nm # not a member (not an element) (u2209)
+-1 F0D0 /_ # angle (u2220)
+-1 F0D1 gr # nabla or gradient (u2207)
+-1 F0D2 --- # registered (serif) (u00AE)
+-1 F0D3 --- # copyright (serif) (u00A9)
+-1 F0D4 --- # trade mark (serif)
+-1 F0D5 product # product of (u220F)
+-1 F0D6 sr sqrt # square root (u221A)
+-1 F0D7 u22C5 # dot operator (u22C5)
+-1 F0D8 no # not (u00AC)
+-1 F0D9 AN # logical and (u2227)
+-1 F0DA OR # logical or (u2228)
+-1 F0DB hA # double arrow left and right (u21D4)
+-1 F0DC lA lh # double arrow left (implied by) (u21D0)
+-1 F0DD arrowverttp uA # double arrow up (u21D1)
+-1 F0DE rA rh # double arrow right (implies) (u21D2)
+-1 F0DF arrowvertbt dA # double arrow down (u21D3)
+-1 F0E0 lz # lozenge (u25CA)
+-1 F0E1 la # left angle bracket (u2329)
+-1 F0E2 --- # registered (sans serif) (u00AE)
+-1 F0E3 --- # copyright (sans serif) (u00A9)
+-1 F0E4 --- # trade mark (sans serif)
+-1 F0E5 sum # sum of (u2211)
+-1 F0E6 parenlefttp # composite left parenthesis (top) (u239B)
+-1 F0E7 parenleftex # composite left parenthesis (extender) (u239C)
+-1 F0E8 parenleftbt # composite left parenthesis (bottom) (u239D)
+-1 F0E9 lc bracketlefttp # composite left bracket (top) (u23A1)
+-1 F0EA bracketleftex # composite left bracket (extender) (u23A2)
+-1 F0EB lf bracketleftbt # composite left bracket (bottom) (u23A3)
+-1 F0EC lt bracelefttp # composite left brace (top) (u23A7)
+-1 F0ED lk braceleftex # composite left brace (middle) (u23A8)
+-1 F0EE lb braceleftbt # composite left brace (bottom) (u23A9)
+-1 F0EF u23AA # composite brace extender (u23AA)
+-1 F0F0 Eu # euro sign (u20AC)
+-1 F0F1 ra # right angle bracket (u232A)
+-1 F0F2 integral is # integral (u222B)
+-1 F0F3 u2320 # composite integral (top) (u2320)
+-1 F0F4 u23AE # composite integral extender (u23AE)
+-1 F0F5 u2321 # composite integral (bottom) (u2321)
+-1 F0F6 parenrighttp # composite right parenthesis (top) (u239E)
+-1 F0F7 parenrightex # composite right parenthesis (extender) (u239F)
+-1 F0F8 parenrightbt # composite right parenthesis (bottom) (u23A0)
+-1 F0F9 rc bracketrighttp # composite right bracket (top) (u23A4)
+-1 F0FA bracketrightex # composite right bracket (extender) (u23A5)
+-1 F0FB rf bracketrightbt # composite right bracket (bottom) (u23A6)
+-1 F0FC rt bracerighttp # composite right brace (top) (u23AB)
+-1 F0FD rk bracerightex # composite right brace (middle) (u23AC)
+-1 F0FE rb bracerightbt # composite right brace (bottom) (u23AD)
+
+# EOF
diff --git a/font/devlj4/generate/text.map b/font/devlj4/generate/text.map
new file mode 100644
index 0000000..18170ff
--- /dev/null
+++ b/font/devlj4/generate/text.map
@@ -0,0 +1,845 @@
+# Map HP MSL numbers and HP Unicode values to troff names for a text font.
+#
+# Created 30 December 2003 -- you need hpftodit from groff 1.19.1 or newer!
+#
+# Glyphs marked with an asterisk have (also) an entry in 'special.umap'.
+# Unknown MSL numbers are marked with a question mark; glyphs with an
+# uncertain Unicode mapping are tagged also with a question mark.
+
+# 0 space -- unused
+1 0021 !
+2 0022 " dq
+3 0023 # sh
+4 0024 $ Do
+5 0025 %
+6 0026 &
+# 7 ?
+8 2019 ' cq
+9 0028 (
+
+10 0029 )
+11 002A *
+# 12 *
+12 002B +
+13 002C ,
+14 002D - hy
+15 002E .
+16 002F / sl
+17 0030 0
+18 0031 1
+19 0032 2
+
+20 0033 3
+21 0034 4
+22 0035 5
+23 0036 6
+24 0037 7
+25 0038 8
+26 0039 9
+27 003A :
+28 003B ;
+29 003C <
+
+# 30 *
+30 003D =
+31 003E >
+32 003F ?
+33 0040 @ at
+# 34 *
+34 0041 A
+# 35 *
+35 0042 B
+36 0043 C
+37 0044 D
+# 38 *
+38 0045 E
+39 0046 F
+
+40 0047 G
+# 41 *
+41 0048 H
+# 42 *
+42 0049 I
+43 004A J
+# 44 *
+44 004B K
+45 004C L
+# 46 *
+46 004D M
+# 47 *
+47 004E N
+# 48 *
+48 004F O
+# 49 *
+49 0050 P
+
+50 0051 Q
+51 0052 R
+52 0053 S
+# 53 *
+53 0054 T
+54 0055 U
+55 0056 V
+56 0057 W
+# 57 *
+57 0058 X
+58 0059 Y
+# 59 *
+59 005A Z
+
+60 005B [ lB
+61 005C \ rs
+62 005D ] rB
+63 005E ha
+64 005F _
+# 65 ?
+66 2018 ` oq
+67 0061 a
+68 0062 b
+69 0063 c
+
+70 0064 d
+71 0065 e
+72 0066 f
+73 0067 g
+74 0068 h
+75 0069 i
+76 006A j
+77 006B k
+78 006C l
+79 006D m
+
+80 006E n
+81 006F o
+82 0070 p
+83 0071 q
+84 0072 r
+85 0073 s
+86 0074 t
+87 0075 u
+88 0076 v
+89 0077 w
+
+90 0078 x
+91 0079 y
+92 007A z
+93 007B lC {
+94 007C ba |
+95 007D rC }
+# 96 *
+96 007E ti
+# 97 medium shading *
+# 98 uppercase greek delta -- unused
+99 00C0 `A
+
+100 00C2 ^A
+101 00C8 `E
+102 00CA ^E
+103 00CB :E
+104 00CE ^I
+105 00CF :I
+106 00B4 aa
+107 0060 ga
+108 02C6 ^ a^
+109 00A8 ad
+
+110 02DC a~ ~
+111 00D9 `U
+112 00DB ^U
+113 00AF u00AF
+114 00DD 'Y
+115 00FD 'y
+116 00B0 de
+117 00C7 ,C
+118 00E7 ,c
+119 00D1 ~N
+
+120 00F1 ~n
+121 00A1 r!
+122 00BF r?
+123 00A4 Cs
+124 00A3 Po
+125 00A5 Ye
+126 00A7 sc
+127 0192 Fn
+128 00A2 ct
+129 00E2 ^a
+
+130 00EA ^e
+131 00F4 ^o
+132 00FB ^u
+133 00E1 'a
+134 00E9 'e
+135 00F3 'o
+136 00FA 'u
+137 00E0 `a
+138 00E8 `e
+139 00F2 `o
+
+140 00F9 `u
+141 00E4 :a
+142 00EB :e
+143 00F6 :o
+144 00FC :u
+145 00C5 oA
+146 00EE ^i
+147 00D8 /O
+148 00C6 AE
+149 00E5 oa
+
+150 00ED 'i
+151 00F8 /o
+152 00E6 ae
+153 00C4 :A
+154 00EC `i
+155 00D6 :O
+156 00DC :U
+157 00C9 'E
+158 00EF :i
+159 00DF ss
+
+160 00D4 ^O
+161 00C1 'A
+162 00C3 ~A
+163 00E3 ~a
+164 00D0 -D
+165 00F0 Sd
+166 00CD 'I
+167 00CC `I
+168 00D3 'O
+169 00D2 `O
+
+170 00D5 ~O
+171 00F5 ~o
+172 0160 vS
+173 0161 vs
+174 00DA 'U
+175 0178 :Y
+176 00FF :y
+177 00DE TP
+178 00FE Tp
+# 179 lowercase middle dot -- unused (no Unicode mapping)
+
+180 00B5 mc
+181 00B6 ps
+182 00BE 34
+# 183 *
+183 2212 \-
+184 00BC 14
+185 00BD 12
+186 00AA Of
+187 00BA Om
+188 00AB Fo
+# 189 medium solid box *
+
+190 00BB Fc
+# 191 *
+191 00B1 t+-
+192 00A6 bb
+193 00A9 co
+# 194 *
+194 00AC tno
+195 00AD u00AD
+196 00AE rg
+197 00B2 S2
+198 00B3 S3
+199 00B8 ac
+
+200 00B9 S1
+# 201 *
+201 00D7 tmu
+# 202 *
+202 00F7 tdi
+# 203 open smiling face *
+# 204 solid smiling face *
+# 205 solid heart *
+# 206 solid diamond *
+# 207 solid club *
+# 208 solid spade *
+# 209 medium solid bullet *
+
+# 210 large solid square/open dot *
+# 211 large open bullet ?
+# 212 large solid square/open ring *
+# 213 male symbol *
+# 214 female symbol *
+# 215 musical note *
+# 216 pair of musical notes *
+# 217 compass, 8 pointed sun *
+# 218 right solid arrowhead *
+# 219 left solid arrowhead *
+
+# 220 up/down arrow *
+221 203C u203C
+# 222 thick horizontal mark *
+# 223 up/down arrow baseline *
+# 224 up arrow *
+# 225 down arrow *
+# 226 right arrow *
+# 227 left arrow *
+# 228 tick up at left ('logicalnotflopped') *
+# 229 left/right arrow *
+
+# 230 up solid arrowhead *
+# 231 down solid arrowhead *
+232 20A7 u20A7
+# 233 tick down at left *
+# 234 light shading *
+# 235 dark shading *
+# 236 vertical 1 *
+# 237 left 1 vertical 1 *
+# 238 left 2 vertical 1 *
+# 239 left 1 vertical 2 *
+
+# 240 left 1 down 2 *
+# 241 left 2 down 1 *
+# 242 left 2 vertical 2 *
+# 243 vertical 2 *
+# 244 left 2 down 2 *
+# 245 left 2 up 2 *
+# 246 left 1 up 2 *
+# 247 left 2 up 1 *
+# 248 left 1 down 1 *
+# 249 right 1 up 1 *
+
+# 250 horizontal 1 up 1 *
+# 251 horizontal 1 down 1 *
+# 252 right 1 vertical 1 *
+# 253 horizontal 1 *
+# 254 horizontal 1 vertical 1 *
+# 255 right 2 vertical 1 *
+# 256 right 1 vertical 2 *
+# 257 right 2 up 2 *
+# 258 right 2 down 2 *
+# 259 horizontal 2 up 2 *
+
+# 260 horizontal 2 down 2 *
+# 261 right 2 vertical 2 *
+# 262 horizontal 2 *
+# 263 horizontal 2 vertical 2 *
+# 264 horizontal 2 up 1 *
+# 265 horizontal 1 up 2 *
+# 266 horizontal 2 down 1 *
+# 267 horizontal 1 down 2 *
+# 268 right 1 up 2 *
+# 269 right 2 up 1 *
+
+# 270 right 2 down 1 *
+# 271 right 1 down 2 *
+# 272 horizontal 1 vertical 2 *
+# 273 horizontal 2 vertical 1 *
+# 274 left 1 up 1 *
+# 275 right 1 down 1 *
+# 276 solid full rectangle *
+# 277 bottom 1/2 solid rectangle *
+# 278 left 1/2 solid rectangle *
+# 279 right 1/2 solid rectangle *
+
+# 280 top 1/2 solid rectangle *
+# 281 lowercase greek alpha -- unused
+# 282 lowercase greek beta -- unused
+# 283 uppercase greek gamma -- unused
+# 284 lowercase greek pi -- unused
+# 285 uppercase greek sigma -- unused
+# 286 lowercase greek sigma -- unused
+# 287 lowercase greek tau -- unused
+# 288 uppercase greek phi -- unused
+# 289 uppercase greek theta -- unused
+
+# 290 uppercase omega, ohms -- unused
+# 291 lowercase greek delta -- unused
+# 292 infinity sign *
+# 293 lowercase greek phi -- unused
+# 294 lowercase greek epsilon -- unused
+# 295 set intersection *
+# 296 exactly equals *
+# 297 greater than/equal to *
+# 298 less than/equal to *
+# 299 top segment integral *
+
+# 300 bottom segment integral *
+# 301 2 wavy line approximation *
+# 302 *
+302 00B7 pc
+# 303 radical symbol *
+# 304 lowercase greek eta -- unused
+# 305 small solid box *
+306 013F u013F
+307 0140 u0140
+308 2113 u2113
+309 0149 u0149
+
+310 2032 fm
+311 2033 sd
+312 2020 dg
+313 2122 tm
+314 2017 u2017
+315 02C7 ah
+316 02DA ao
+# 317 uppercase acute accent -- unused
+# 318 uppercase grave accent -- unused
+# 319 uppercase circumflex accent -- unused
+
+# 320 uppercase dieresis accent -- unused
+# 321 uppercase tilde accent -- unused
+# 322 uppercase hacek accent -- unused
+# 323 uppercase ring accent -- unused
+324 2215 f/
+325 2014 em
+326 2013 en
+327 2021 dd
+328 0131 .i
+329 0027 aq
+
+# 330 uppercase cedilla -- unused
+331 2022 bu
+332 207F u207F
+# 333 home plate *
+# 334 ?
+335 0138 u0138
+# 336 ?
+# 337 ?
+338 0166 u0166
+339 0167 u0167
+
+340 014A u014A
+341 014B u014B
+342 0111 u0111
+# 343-369 ?
+
+# 370 'lira' ?
+# 371-374 ?
+# 375 'asciigrave' ?
+
+# 376-399 ?
+
+400 0102 u0041_0306
+401 0103 u0061_0306
+402 0100 u0041_0304
+403 0101 u0061_0304
+404 0104 u0041_0328
+405 0105 u0061_0328
+406 0106 'C
+407 0107 'c
+# 408 ?
+# 409 ?
+
+410 010C u0041_030C
+411 010D u0061_030C
+# 412 ?
+# 413 ?
+414 010E u0044_030C
+415 010F u0064_030C
+416 011A u0045_030C
+417 011B u0065_030C
+418 0116 u0045_0307
+419 0117 u0065_0307
+
+420 0112 u0045_0304
+421 0113 u0065_0304
+422 0118 u0045_0328
+423 0119 u0065_0328
+# 424-427 ?
+428 0122 u0047_0327
+429 0123 u0067_0327
+
+# 430 ?
+# 431 ?
+432 012E u0049_0328
+433 012F u0069_0328
+434 012A u0049_0304
+435 012B u0069_0304
+# 436 ?
+# 437 ?
+438 0136 u004B_0327
+439 0137 u006B_0327
+
+440 0139 u004C_0301
+441 013A u006C_0301
+442 013D u004C_030C
+443 013E u006C_030C
+444 013B u004C_0327
+445 013C u006C_0327
+446 0143 u004E_0301
+447 0144 u006E_0301
+448 0147 u004E_030C
+449 0148 u006E_030C
+
+450 0145 u004E_0327
+451 0146 u006E_0327
+452 0150 u004F_030B
+453 0151 u006F_030B
+454 014C u004F_0304
+455 014D u006F_0304
+456 0154 u0052_0301
+457 0155 u0072_0301
+458 0158 u0052_030C
+459 0159 u0072_030C
+
+460 0156 u0052_0327
+461 0157 u0072_0327
+462 015A u0053_0301
+463 015B u0073_0301
+# 464 ?
+# 465 ?
+466 0164 u0054_030C
+467 0165 u0074_030C
+468 0162 u0054_0327
+469 0163 u0074_0327
+
+470 0168 u0055_0303
+471 0169 u0075_0303
+# 472 ?
+# 473 ?
+474 0170 u0055_030B
+475 0171 u0075_030B
+476 016E u0055_030A
+477 016F u0075_030A
+478 016A u0055_0304
+479 016B u0075_0304
+
+480 0172 u0055_0328
+481 0173 u0075_0328
+482 0179 u005A_0301
+483 017A u007A_0301
+484 017B u005A_0307
+485 017C u007A_0307
+486 0128 u0049_0303
+487 0129 u0069_0303
+# 488 ?
+# 489 ?
+
+# 490-499 ?
+
+# 500 radical segment *
+# 501 proportional to symbol *
+# 502 lowercase italic e *
+# 503 alternate lowercase epsilon *
+# 504 therefore *
+# 505 uppercase greek gamma *
+# 506 uppercase greek delta *
+# 507 uppercase greek theta *
+# 508 uppercase greek lambda *
+# 509 uppercase greek xi *
+
+# 510 uppercase greek pi *
+# 511 uppercase greek sigma *
+# 512 uppercase greek upsilon *
+# 513 uppercase greek phi *
+# 514 uppercase greek psi *
+# 515 uppercase greek omega *
+# 516 nabla symbol *
+# 517 partial diff symbol *
+# 518 terminal sigma *
+# 519 not equal to symbol *
+
+# 520 underline, composite ?
+# 521 because *
+# 522 lowercase greek alpha *
+# 523 lowercase greek beta *
+# 524 lowercase greek gamma *
+# 525 lowercase greek delta *
+# 526 lowercase greek epsilon *
+# 527 lowercase greek zeta *
+# 528 lowercase greek eta *
+# 529 lowercase greek theta *
+
+# 530 lowercase greek iota *
+# 531 lowercase greek kappa *
+# 532 lowercase greek lambda *
+# 533 lowercase greek mu *
+# 534 lowercase greek nu *
+# 535 lowercase greek xi *
+# 536 lowercase greek omicron *
+# 537 lowercase greek pi *
+# 538 lowercase greek rho *
+# 539 lowercase greek sigma *
+
+# 540 lowercase greek tau *
+# 541 lowercase greek upsilon *
+# 542 lowercase greek phi *
+# 543 lowercase greek chi *
+# 544 lowercase greek psi *
+# 545 lowercase greek omega *
+# 546 open lowercase greek theta *
+# 547 open lowercase greek phi *
+# 548 alternate lowercase pi *
+# 549 wavy/straight approximation *
+
+# 550 not exactly equal to *
+# 551 up arrow double stroke *
+# 552 right arrow double stroke *
+# 553 down arrow double stroke *
+# 554 left arrow double stroke *
+# 555 up/down arrow double stroke *
+# 556 left/right arrow double stroke *
+# 557 right over left arrow *
+# 558 left over right arrow *
+# 559 vector symbol *
+
+# 560 overline, composite *
+# 561 for all symbol *
+# 562 there exists symbol *
+# 563 top symbol *
+# 564 bottom symbol *
+# 565 set union symbol *
+# 566 element of symbol *
+# 567 contains symbol *
+# 568 not element of symbol *
+# 569 proper subset symbol *
+
+# 570 proper superset symbol *
+# 571 not proper subset symbol *
+# 572 not proper superset symbol *
+# 573 subset symbol *
+# 574 superset symbol *
+# 575 plus in circle symbol *
+# 576 dot in circle *
+# 577 times in circle *
+# 578 minus in circle *
+# 579 slash in circle *
+
+# 580 logical and symbol *
+# 581 logical or symbol *
+# 582 exclusive or symbol *
+# 583 function composition symbol *
+# 584 large open circle *
+# 585 assertion symbol *
+# 586 backwards assertion symbol *
+# 587 integral symbol *
+# 588 curvilinear integral symbol *
+# 589 angle symbol *
+
+# 590 empty set *
+# 591 hebrew aleph *
+# 592 hebrew beth *
+# 593 hebrew gimmel *
+# 594 fractur uppercase c *
+# 595 fractur uppercase i *
+# 596 fractur uppercase r *
+# 597 fractur uppercase z *
+# 598 top left bracket *
+# 599 bottom left bracket *
+
+# 600 top left brace *
+# 601 middle left brace *
+# 602 bottom left brace *
+# 603 middle curvature integral -- no Unicode mapping!
+# 604 top left summation -- no Unicode mapping!
+# 605 double vertical line, composite *
+# 606 bottom left summation -- no Unicode mapping!
+# 607 bottom diagonal summation -- no Unicode mapping!
+# 608 top right bracket *
+# 609 bottom right bracket *
+
+# 610 top right brace *
+# 611 middle right brace *
+# 612 bottom right brace *
+# 613 thick vertical line, composite *
+# 614 thin vertical line, composite *
+# 615 bottom radical, vert *
+# 616 top right summation -- no Unicode mapping!
+# 617 middle summation -- no Unicode mapping!
+# 618 bottom right summation -- no Unicode mapping!
+# 619 top diagonal summation -- no Unicode mapping!
+
+# 620 minus over plus sign *
+# 621 left angle bracket *
+# 622 right angle bracket *
+# 623 mask symbol, superior -- no Unicode mapping!
+# 624 wavy/2 straight approximation *
+# 625 45 degrees arrow *
+# 626 -45 degrees arrow *
+# 627 -135 degrees arrow *
+# 628 135 degrees arrow *
+# 629 up open triangle *
+
+# 630 right open triangle *
+# 631 down open triangle *
+# 632 left open triangle *
+# 633 much less than sign *
+# 634 much greater than sign *
+# 635 proportional to symbol *
+# 636 defined as symbol *
+# 637 lowercase greek digamma *
+# 638 planck's constant/2 pi *
+# 639 laplace transform symbol *
+
+# 640 power set symbol ?
+# 641 weierstrassian symbol *
+# 642 summation symbol, sigma *
+# 643 left double bracket *
+# 644 middle double bracket -- no Unicode mapping!
+# 645 right double bracket *
+# 646 left top round corner *
+# 647 left bottom round corner *
+# 648 extension large union/product -- no Unicode mapping!
+# 649 bottom large union -- no Unicode mapping!
+
+# 650 top large intersection -- no Unicode mapping!
+# 651 top left double bracket -- no Unicode mapping!
+# 652 bottom left double bracket -- no Unicode mapping!
+# 653 large open box ?
+# 654 open diamond *
+# 655 right top round corner *
+# 656 right bottom round corner *
+# 657 bottom large bottom product -- no Unicode mapping!
+# 658 top large top product -- no Unicode mapping!
+# 659 top right double bracket -- no Unicode mapping!
+
+# 660 bottom right double bracket -- no Unicode mapping!
+# 661 large solid box ?
+# 662 solid diamond *
+# 663 such that *
+# 664 math asterisk sign *
+# 665 horizontal arrow extension *
+# 666 double horizontal arrow extension -- no Unicode mapping!
+# 667 complement of #617 -- no Unicode mapping!
+# 668 right angle symbol *
+# 669 product symbol *
+
+# 670-683 ?
+
+684 25CA u25CA
+
+# 684-999 ?
+
+1000 2070 u2070
+1001 2074 u2074
+1002 2075 u2075
+1003 2076 u2076
+1004 2077 u2077
+1005 2078 u2078
+1006 2079 u2079
+# 1007-1009 ?
+
+# 1010-1016 ?
+1017 201C lq
+1018 201D rq
+1019 201E Bq
+
+1020 2003 u2003
+1021 2002 u2002
+# 1022 ?
+1023 2009 u2009
+# 1024-1027 ?
+1028 2026 u2026
+# 1029 ?
+
+# 1030 uppercase ogonek -- unused
+1031 017E vz
+# 1032-1033 ?
+1034 2120 u2120
+# 1035 ?
+1036 211E u211E
+# 1037-1039 ?
+
+# older HP TrueType TFM files use Unicode value U+F001 instead
+1040 FB01 fi
+# older HP TrueType TFM files use Unicode value U+F002 instead
+1041 FB02 fl
+1042 FB00 ff
+1043 FB03 Fi
+1044 FB04 Fl
+# 1045 uppercase double acute accent -- unused
+# 1046 ?
+1047 0133 ij
+# 1048 ?
+# 1049 ?
+
+# 1050-1059 ?
+
+1060 2105 u2105
+1061 011E u0047_0306
+1062 011F u0067_0306
+1063 015E u0053_0327
+1064 015F u0073_0327
+1065 0130 u0049_0307
+# 1066 ?
+1067 201A bq
+1068 2030 %0
+1069 20AC Eu
+
+# 1070-1079 ?
+
+# 1080-1083 ?
+1084 02C9 a-
+# 1085 uppercase macron accent -- unused
+1086 02D8 ab
+# 1087 uppercase breve accent -- unused
+1088 02D9 a.
+# 1089 uppercase overdot accent -- unused
+
+1090 0153 oe
+1091 0152 OE
+1092 2039 fo
+1093 203A fc
+1094 25A1 sq
+1095 0141 /L
+1096 0142 /l
+1097 02DD a"
+1098 02DB ho
+# 1099 carriage return symbol *
+
+# 1100 registered, full, serif -- unused
+# 1101 copyright, full, serif -- unused
+# 1102 trademark, full, serif -- unused
+# 1103 registered, full, sans -- unused
+# 1104 copyright, full, sans -- unused
+# 1105 trademark, full, sans -- unused
+1106 017D vZ
+1107 0132 IJ
+# 1108 small open box *
+# 1109 small open bullet *
+
+# 1110 medium open bullet *
+# 1111 large solid bullet ?
+# 1112 visible carriage return *
+# 1113 visible tab ('arrowtab') ?
+# 1114 visible space *
+# 1115 visible soft hyphen -- unused
+# 1116 visible end-of-file ('embox')?
+# 1117 'enspacereverse' ?
+# 1118 'emspacereverse' ?
+# 1119 ?
+
+# 1120-1399 ?
+
+1400 0301 u0301
+1401 0300 u0300
+1402 0302 u0302
+1403 0308 u0308
+1404 0303 u0303
+1405 030C u030C
+1406 0306 u0306
+1407 030B u030B
+1408 030A u030A
+1409 0307 u0307
+
+1410 0304 u0304
+1411 0327 u0327
+1412 0328 u0328
+# 1413 combining uppercase acute accent -- unused
+# 1414 combining uppercase grave accent -- unused
+# 1415 combining uppercase circumflex accent -- unused
+# 1416 combining uppercase dieresis accent -- unused
+# 1417 combining uppercase tilde accent -- unused
+# 1418 combining uppercase caron accent -- unused
+# 1419 combining uppercase breve accent -- unused
+
+# 1420 combining uppercase double acute accent -- unused
+# 1421 combining uppercase ring accent -- unused
+# 1422 combining uppercase dot accent -- unused
+# 1423 combining uppercase macron accent -- unused
+# 1424 combining uppercase cedilla -- unused
+# 1425 combining uppercase ogonek -- unused
+# 1426 ?
+# 1427 uppercase middle dot -- unused (no Unicode mapping)
+# 1428 ?
+# 1429 ?
+
+# 1430-3811 ?
+
+# 3812 ornament, apple ?
+
+# EOF
diff --git a/font/devlj4/generate/wingdings.map b/font/devlj4/generate/wingdings.map
new file mode 100644
index 0000000..d868ac2
--- /dev/null
+++ b/font/devlj4/generate/wingdings.map
@@ -0,0 +1,233 @@
+# Map HP Unicode values to troff names for Wingding font.
+#
+# This font is TrueType only, so the MSL values are dummies.
+#
+# Created 16 January 2004 from data on Alan Wood's website
+# (www.alanwood.net).
+#
+# You need hpftodit from groff 1.19.1 or newer!
+
+-1 F021 u270F # Pencil
+-1 F022 u2702 # Black scissors
+-1 F023 u2701 # Upper blade scissors
+-1 F024 ---
+-1 F025 ---
+-1 F026 ---
+-1 F027 ---
+-1 F028 u260E # Black telephone
+-1 F029 u2706 # Telephone location sign
+-1 F02A u2709 # Envelope
+-1 F02B ---
+-1 F02C ---
+-1 F02D ---
+-1 F02E ---
+-1 F02F ---
+-1 F030 ---
+-1 F031 ---
+-1 F032 ---
+-1 F033 ---
+-1 F034 ---
+-1 F035 ---
+-1 F036 u231B # Hourglass
+-1 F037 u2328 # Keyboard
+-1 F038 ---
+-1 F039 ---
+-1 F03A ---
+-1 F03B ---
+-1 F03C ---
+-1 F03D ---
+-1 F03E u2707 # Tape drive
+-1 F03F u270D # Writing hand
+-1 F040 ---
+-1 F041 u270C # Victory hand
+-1 F042 ---
+-1 F043 ---
+-1 F044 ---
+-1 F045 u261C # White left pointing index
+-1 F046 u261E # White right pointing index
+-1 F047 u261D # White up pointing index
+-1 F048 u261F # White down pointing index
+-1 F049 ---
+-1 F04A u263A # White smiling face
+-1 F04B ---
+-1 F04C u2639 # White frowning face
+-1 F04D ---
+-1 F04E u2620 # Skull and crossbones
+-1 F04F ---
+-1 F050 ---
+-1 F051 u2708 # Airplane
+-1 F052 u263C # White sun with rays
+-1 F053 ---
+-1 F054 u2744 # Snowflake
+-1 F055 ---
+-1 F056 u271E # Shadowed white Latin cross
+-1 F057 ---
+-1 F058 u2720 # Maltese cross
+-1 F059 u2721 # Star of David
+-1 F05A u262A # Star and crescent
+-1 F05B u262F # Yin Yang
+-1 F05C u0950 # Devanagari Om
+-1 F05D u2638 # Wheel of Dharma
+-1 F05E u2648 # Aries
+-1 F05F u2649 # Taurus
+-1 F060 u264A # Gemini
+-1 F061 u264B # Cancer
+-1 F062 u264C # Leo
+-1 F063 u264D # Virgo
+-1 F064 u264E # Libra
+-1 F065 u264F # Scorpio
+-1 F066 u2650 # Sagittarius
+-1 F067 u2651 # Capricorn
+-1 F068 u2652 # Aquarius
+-1 F069 u2653 # Pisces
+-1 F06A u0026 # Ampersand
+-1 F06B u0026 # Ampersand
+-1 F06C u25CF # Black circle
+-1 F06D u274D # Shadowed white circle
+-1 F06E u25A0 # Black square
+-1 F06F u25A1 # White square
+-1 F070 ---
+-1 F071 u2751 # Lower right shadowed white square
+-1 F072 u2752 # Upper right shadowed white square
+-1 F073 ---
+-1 F074 u2666 # Black diamond suit
+-1 F075 u25C6 # Black diamond
+-1 F076 u2756 # Black diamond minus white X
+-1 F077 ---
+-1 F078 u2327 # X in a rectangle box
+-1 F079 u2353 # APL functional symbol quad up caret
+-1 F07A u2318 # Place of interest sign
+-1 F07B u2740 # White florette
+-1 F07C u273F # Black florette
+-1 F07D u275D # Heavy double turned comma quotation mark ornament
+-1 F07E u275E # Heavy double comma quotation mark ornament
+-1 F080 u24EA # Circled digit zero
+-1 F081 u2460 # Circled digit one
+-1 F082 u2461 # Circled digit two
+-1 F083 u2462 # Circled digit three
+-1 F084 u2463 # Circled digit four
+-1 F085 u2464 # Circled digit five
+-1 F086 u2465 # Circled digit six
+-1 F087 u2466 # Circled digit seven
+-1 F088 u2467 # Circled digit eight
+-1 F089 u2468 # Circled digit nine
+-1 F08A u2469 # Circled number ten
+-1 F08B u24FF # Negative circled digit zero
+-1 F08C u2776 # Dingbat negative circled digit one
+-1 F08D u2777 # Dingbat negative circled digit two
+-1 F08E u2778 # Dingbat negative circled digit three
+-1 F08F u2779 # Dingbat negative circled digit four
+-1 F090 u277A # Dingbat negative circled digit five
+-1 F091 u277B # Dingbat negative circled digit six
+-1 F092 u277C # Dingbat negative circled digit seven
+-1 F093 u277D # Dingbat negative circled digit eight
+-1 F094 u277E # Dingbat negative circled digit nine
+-1 F095 u277F # Dingbat negative circled number ten
+-1 F096 ---
+-1 F097 ---
+-1 F098 ---
+-1 F099 ---
+-1 F09A ---
+-1 F09B ---
+-1 F09C ---
+-1 F09D ---
+-1 F09E u00B7 # Middle dot
+-1 F09F u2022 # Bullet
+-1 F0A0 u25AA # Black small square
+-1 F0A1 u25CB # White circle
+-1 F0A2 ---
+-1 F0A3 ---
+-1 F0A4 u25C9 # Fisheye
+-1 F0A5 u25CE # Bullseye
+-1 F0A6 ---
+-1 F0A7 u25AA # Black small square
+-1 F0A8 u25FB # White medium square
+-1 F0A9 ---
+-1 F0AA u2726 # Black four pointed star
+-1 F0AB u2605 # Black star
+-1 F0AC u2736 # Six pointed black star
+-1 F0AD u2734 # Eight pointed black star
+-1 F0AE u2739 # Twelve pointed black star
+-1 F0AF u2735 # Eight pointed pinwheel star
+-1 F0B0 ---
+-1 F0B1 u2316 # Position indicator
+-1 F0B2 u2727 # White four pointed star
+-1 F0B3 u2311 # Square lozenge
+-1 F0B4 ---
+-1 F0B5 u272A # Circled white star
+-1 F0B6 u2730 # Shadowed white star
+-1 F0B7 ---
+-1 F0B8 ---
+-1 F0B9 ---
+-1 F0BA ---
+-1 F0BB ---
+-1 F0BC ---
+-1 F0BD ---
+-1 F0BE ---
+-1 F0BF ---
+-1 F0C0 ---
+-1 F0C1 ---
+-1 F0C2 ---
+-1 F0C3 ---
+-1 F0C4 ---
+-1 F0C5 ---
+-1 F0C6 ---
+-1 F0C7 ---
+-1 F0C8 ---
+-1 F0C9 ---
+-1 F0CA ---
+-1 F0CB ---
+-1 F0CC ---
+-1 F0CD ---
+-1 F0CE ---
+-1 F0CF ---
+-1 F0D0 ---
+-1 F0D1 ---
+-1 F0D2 ---
+-1 F0D3 ---
+-1 F0D4 ---
+-1 F0D5 u232B # Erase to the left
+-1 F0D6 u2326 # Erase to the right
+-1 F0D7 ---
+-1 F0D8 u27A2 # Three-D top-lighted rightwards arrowhead
+-1 F0D9 ---
+-1 F0DA ---
+-1 F0DB ---
+-1 F0DC u27B2 # Circled heavy white rightwards arrow
+-1 F0DD ---
+-1 F0DE ---
+-1 F0DF ---
+-1 F0E0 ---
+-1 F0E1 ---
+-1 F0E2 ---
+-1 F0E3 ---
+-1 F0E4 ---
+-1 F0E5 ---
+-1 F0E6 ---
+-1 F0E7 ---
+-1 F0E8 u2794 # Heavy wide-headed rightwards arrow
+-1 F0E9 ---
+-1 F0EA ---
+-1 F0EB ---
+-1 F0EC ---
+-1 F0ED ---
+-1 F0EE ---
+-1 F0EF u21E6 # Leftwards white arrow
+-1 F0F0 u21E8 # Rightwards white arrow
+-1 F0F1 u21E7 # Upwards white arrow
+-1 F0F2 u21E9 # Downwards white arrow
+-1 F0F3 u2B04 # Left right white arrow
+-1 F0F4 u21F3 # Up down white arrow
+-1 F0F5 u2B00 # North east white arrow
+-1 F0F6 u2B01 # North west white arrow
+-1 F0F7 u2B03 # South west white arrow
+-1 F0F8 u2B02 # South east white arrow
+-1 F0F9 u25AD # White rectangle
+-1 F0FA u25AB # White small square
+-1 F0FB u2717 # Ballot X
+-1 F0FC u2713 # Check mark
+-1 F0FD u2612 # Ballot box with X
+-1 F0FE u2611 # Ballot box with check
+-1 F0FF ---
+
+# EOF
diff --git a/font/devpdf/DESC.in b/font/devpdf/DESC.in
new file mode 100644
index 0000000..5cb254f
--- /dev/null
+++ b/font/devpdf/DESC.in
@@ -0,0 +1,11 @@
+res 72000
+hor 1
+vert 1
+sizescale 1000
+unitwidth 1000
+sizes 1000-10000000 0
+styles R I B BI
+family T
+fonts 8 0 0 0 0 0 0 S ZD
+tcommand
+postpro gropdf
diff --git a/font/devpdf/Foundry.in b/font/devpdf/Foundry.in
new file mode 100644
index 0000000..e5aba65
--- /dev/null
+++ b/font/devpdf/Foundry.in
@@ -0,0 +1,121 @@
+# Foundry file
+
+# Copyright (C) 2011-2020 Free Software Foundation, Inc.
+# Written by Deri James <deri@chuzzlewit.myzen.co.uk>
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+#=======================================================================
+#Foundry|Name|Search path
+foundry||@urwfontsdir@:(gs):/usr/share/fonts/type1/gsfonts:/usr/share/fonts/default/Type1:/usr/share/fonts/default/Type1/adobestd35:/usr/share/fonts/type1/urw-base35:/opt/local/share/fonts/urw-fonts:/usr/local/share/fonts/ghostscript
+
+# Enable the font description files for grops (generated from Adobe
+# foundry font files) to be used with gropdf. afmtodit must not be
+# called with any flags. URW fonts are substituted for Adobe fonts in
+# the download file by default. If you have Adobe Type 1 fonts, you can
+# update the foundry search path above if necessary and replace the
+# contents of the file fields below with their file names.
+
+#Font|IsBase14|Flags|Map|Encoding|File(!file)...
+AB|N||||URWGothic-Demi.t1!URWGothic-Demi!URWGothicL-Demi!a010015l.pfb
+ABI|N||||URWGothic-DemiOblique.t1!URWGothic-DemiOblique!URWGothicL-DemiObli!a010035l.pfb
+AI|N||||URWGothic-BookOblique.t1!URWGothic-BookOblique!URWGothicL-BookObli!a010033l.pfb
+AR|N||||URWGothic-Book.t1!URWGothic-Book!URWGothicL-Book!a010013l.pfb
+BMB|N||||URWBookman-Demi.t1!URWBookman-Demi!URWBookmanL-DemiBold!b018015l.pfb
+BMBI|N||||URWBookman-DemiItalic.t1!URWBookman-DemiItalic!URWBookmanL-DemiBoldItal!b018035l.pfb
+BMI|N||||URWBookman-LightItalic.t1!URWBookman-LightItalic!URWBookmanL-LighItal!b018032l.pfb
+BMR|N||||URWBookman-Light.t1!URWBookman-Light!URWBookmanL-Ligh!b018012l.pfb
+CB|Y||||NimbusMonoPS-Bold.t1!NimbusMonoPS-Bold!NimbusMonL-Bold!n022004l.pfb
+CBI|Y||||NimbusMonoPS-BoldItalic.t1!NimbusMonoPS-BoldItalic!NimbusMonL-BoldObli!n022024l.pfb
+CI|Y||||NimbusMonoPS-Italic.t1!NimbusMonoPS-Italic!NimbusMonL-ReguObli!n022023l.pfb
+CR|Y||||NimbusMonoPS-Regular.t1!NimbusMonoPS-Regular!NimbusMonL-Regu!n022003l.pfb
+HB|Y||||NimbusSans-Bold.t1!NimbusSans-Bold!NimbusSanL-Bold!n019004l.pfb
+HBI|Y||||NimbusSans-BoldItalic.t1!NimbusSans-BoldItalic!NimbusSans-BoldOblique.t1!NimbusSans-BoldOblique!NimbusSanL-BoldItal!n019024l.pfb
+HI|Y||||NimbusSans-Italic.t1!NimbusSans-Italic!NimbusSans-Oblique.t1!NimbusSans-Oblique!NimbusSanL-ReguItal!n019023l.pfb
+HNB|N||||NimbusSansNarrow-Bold.t1!NimbusSansNarrow-Bold!NimbusSanL-BoldCond!n019044l.pfb
+HNBI|N||||NimbusSansNarrow-BoldOblique.t1!NimbusSansNarrow-BoldOblique!NimbusSansNarrow-BdOblique!NimbusSanL-BoldCondItal.t1!NimbusSanL-BoldCondItal!n019064l.pfb
+HNI|N||||NimbusSansNarrow-Oblique.t1!NimbusSansNarrow-Oblique!NimbusSanL-ReguCondItal!n019063l.pfb
+HNR|N||||NimbusSansNarrow-Regular.t1!NimbusSansNarrow-Regular!NimbusSanL-ReguCond!n019043l.pfb
+HR|Y||||NimbusSans-Regular.t1!NimbusSans-Regular!NimbusSans-Regular!NimbusSanL-Regu!n019003l.pfb
+NB|N||||C059-Bold.t1!C059-Bold!CenturySchL-Bold!c059016l.pfb
+NBI|N||||C059-BdIta.t1!C059-BdIta!CenturySchL-BoldItal!c059036l.pfb
+NI|N||||C059-Italic.t1!C059-Italic!CenturySchL-Ital!c059033l.pfb
+NR|N||||C059-Roman.t1!C059-Roman!CenturySchL-Roma!c059013l.pfb
+PB|N||||P052-Bold.t1!P052-Bold!URWPalladioL-Bold!p052004l.pfb
+PBI|N||||P052-BoldItalic.t1!P052-BoldItalic!URWPalladioL-BoldItal!p052024l.pfb
+PI|N||||P052-Italic.t1!P052-Italic!URWPalladioL-Ital!p052023l.pfb
+PR|N||||P052-Roman.t1!P052-Roman!URWPalladioL-Roma!p052003l.pfb
+S|Y||||StandardSymbolsPS.t1!StandardSymbolsPS!StandardSymL!s050000l.pfb
+TB|Y||||NimbusRoman-Bold.t1!NimbusRoman-Bold!NimbusRomNo9L-Medi!n021004l.pfb
+TBI|Y||||NimbusRoman-BoldItalic.t1!NimbusRoman-BoldItalic!NimbusRomNo9L-MediItal!n021024l.pfb
+TI|Y||||NimbusRoman-Italic.t1!NimbusRoman-Italic!NimbusRomNo9L-ReguItal!n021023l.pfb
+TR|Y||||NimbusRoman-Regular.t1!NimbusRoman-Regular!NimbusRomNo9L-Regu!n021003l.pfb
+ZCMI|N||||Z003-MediumItalic.t1!Z003-MediumItalic!URWChanceryL-MediItal!z003034l.pfb
+ZD|Y||||D050000L!D050000L.t1!Dingbats!d050000l.pfb
+EURO|N||||*../devps/freeeuro.pfa
+
+# BEGIN URW ============================================================
+
+# URW fonts are typically shipped with Ghostscript, but can be replaced.
+
+#Foundry|Name|Search path
+foundry|U|@urwfontsdir@:/usr/share/fonts/type1/gsfonts:/usr/share/fonts/default/Type1:/usr/share/fonts/default/Type1/adobestd35:/usr/share/fonts/type1/urw-base35:/opt/local/share/fonts/urw-fonts:/usr/local/share/fonts/ghostscript:(gs)
+
+# Define flags for afmtodit.
+
+r=-i 0 -m
+i=-i 50
+n=-n
+s=-s
+
+#Font|IsBase14|Flags|Map|Encoding|File(!file)...
+AB|N|r|text.map|text.enc|URWGothic-Demi.t1!URWGothic-Demi!URWGothicL-Demi!a010015l.pfb
+ABI|N|i|text.map|text.enc|URWGothic-DemiOblique.t1!URWGothic-DemiOblique!URWGothicL-DemiObli!a010035l.pfb
+AI|N|i|text.map|text.enc|URWGothic-BookOblique.t1!URWGothic-BookOblique!URWGothicL-BookObli!a010033l.pfb
+AR|N|r|text.map|text.enc|URWGothic-Book.t1!URWGothic-Book!URWGothicL-Book!a010013l.pfb
+BMB|N|r|text.map|text.enc|URWBookman-Demi.t1!URWBookman-Demi!URWBookmanL-DemiBold!b018015l.pfb
+BMBI|N|i|text.map|text.enc|URWBookman-DemiItalic.t1!URWBookman-DemiItalic!URWBookmanL-DemiBoldItal!b018035l.pfb
+BMI|N|i|text.map|text.enc|URWBookman-Light.t1!URWBookman-Light!URWBookmanL-LighItal!b018032l.pfb
+BMR|N|r|text.map|text.enc|URWBookman-LightItalic.t1!URWBookman-LightItalic!URWBookmanL-Ligh!b018012l.pfb
+CB|N|nr|text.map|text.enc|NimbusMonoPS-Bold.t1!NimbusMonoPS-Bold!NimbusMonL-Bold!n022004l.pfb
+CBI|N|ni|text.map|text.enc|NimbusMonoPS-BoldItalic.t1!NimbusMonoPS-BoldItalic!NimbusMonL-BoldObli!n022024l.pfb
+CI|N|ni|text.map|text.enc|NimbusMonoPS-Italic.t1!NimbusMonoPS-Italic!NimbusMonL-ReguObli!n022023l.pfb
+CR|N|nr|text.map|text.enc|NimbusMonoPS-Regular.t1!NimbusMonoPS-Regular!NimbusMonL-Regu!n022003l.pfb
+HB|N|r|text.map|text.enc|NimbusSans-Bold.t1!NimbusSans-Bold!NimbusSanL-Bold!n019004l.pfb
+HBI|N|i|text.map|text.enc|NimbusSans-BoldItalic!NimbusSans-BoldItalic.t1!NimbusSans-BoldOblique!NimbusSanL-BoldItal!n019024l.pfb
+HI|N|i|text.map|text.enc|NimbusSans-Italic!NimbusSans-Italic.t1!NimbusSans-Oblique!NimbusSanL-ReguItal!n019023l.pfb
+HNB|N|r|text.map|text.enc|NimbusSansNarrow-Bold.t1!NimbusSansNarrow-Bold!NimbusSanL-BoldCond!n019044l.pfb
+HNBI|N|i|text.map|text.enc|NimbusSansNarrow-BoldOblique.t1!NimbusSansNarrow-BoldOblique!NimbusSansNarrow-BdOblique!NimbusSanL-BoldCondItal.t1!NimbusSanL-BoldCondItal!n019064l.pfb
+HNI|N|i|text.map|text.enc|NimbusSansNarrow-Oblique.t1!NimbusSansNarrow-Oblique!NimbusSanL-ReguCondItal!n019063l.pfb
+HNR|N|r|text.map|text.enc|NimbusSansNarrow-Regular.t1!NimbusSansNarrow-Regular!NimbusSanL-ReguCond!n019043l.pfb
+HR|N|r|text.map|text.enc|NimbusSans-Regular.t1!NimbusSans-Regular!NimbusSans-Regular!NimbusSanL-Regu!n019003l.pfb
+NB|N|r|text.map|text.enc|C059-Bold.t1!C059-Bold!CenturySchL-Bold!c059016l.pfb
+NBI|N|i|text.map|text.enc|C059-BdIta.t1!C059-BdIta!CenturySchL-BoldItal!c059036l.pfb
+NI|N|i|text.map|text.enc|C059-Italic.t1!C059-Italic!CenturySchL-Ital!c059033l.pfb
+NR|N|r|text.map|text.enc|C059-Roman.t1!C059-Roman!CenturySchL-Roma!c059013l.pfb
+PB|N|r|text.map|text.enc|P052-Bold.t1!P052-Bold!URWPalladioL-Bold!p052004l.pfb
+PBI|N|i|text.map|text.enc|P052-BoldItalic.t1!P052-BoldItalic!URWPalladioL-BoldItal!p052024l.pfb
+PI|N|i|text.map|text.enc|P052-Italic.t1!P052-Italic!URWPalladioL-Ital!p052023l.pfb
+PR|N|r|text.map|text.enc|P052-Roman.t1!P052-Roman!URWPalladioL-Roma!p052003l.pfb
+S|N|sr|symbol.map||StandardSymbolsPS.t1!StandardSymbolsPS!StandardSymL!s050000l.pfb
+TB|N|r|text.map|text.enc|NimbusRoman-Bold.t1!NimbusRoman-Bold!NimbusRomNo9L-Medi!n021004l.pfb
+TBI|N|i|text.map|text.enc|NimbusRoman-BoldItalic.t1!NimbusRoman-BoldItalic!NimbusRomNo9L-MediItal!n021024l.pfb
+TI|N|i|text.map|text.enc|NimbusRoman-Italic.t1!NimbusRoman-Italic!NimbusRomNo9L-ReguItal!n021023l.pfb
+TR|N|r|text.map|text.enc|NimbusRoman-Regular.t1!NimbusRoman-Regular!NimbusRomNo9L-Regu!n021003l.pfb
+ZCMI|N|i|text.map|text.enc|Z003-MediumItalic.t1!Z003-MediumItalic!URWChanceryL-MediItal!z003034l.pfb
+ZD|N|sr|dingbats.map||D050000L!D050000L.t1!Dingbats!d050000l.pfb
+
+# END URW ==============================================================
diff --git a/font/devpdf/devpdf.am b/font/devpdf/devpdf.am
new file mode 100644
index 0000000..edce365
--- /dev/null
+++ b/font/devpdf/devpdf.am
@@ -0,0 +1,210 @@
+# Copyright (C) 2011-2020 Free Software Foundation, Inc.
+# Written by Deri James <deri@chuzzlewit.myzen.co.uk>
+# Automake migration by Bertrand Garrigues
+# <bertrand.garrigues@laposte.net>
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+devpdf_srcdir = $(top_srcdir)/font/devpdf
+GROFF_FONT_FILES=`cd $(top_builddir)/font/devpdf \
+ && grep -ls internalname [A-CEG-Z]*`
+ENC_FILES=`cd $(top_builddir)/font/devpdf; ls enc/*`
+MAP_FILES=`cd $(top_builddir)/font/devpdf; ls map/*`
+
+MOSTLYCLEANFILES += \
+ font/devpdf/download \
+ font/devpdf/DESC \
+ font/devpdf/Foundry \
+ font/devpdf/util/BuildFoundries
+
+devpdffontdir = $(fontdir)/devpdf
+devpdffont_DATA = \
+ font/devpdf/DESC \
+ font/devpdf/Foundry
+
+devpdffontencdir = $(devpdffontdir)/enc
+devpdffontenc_DATA = font/devpdf/enc/text.enc
+
+devpdffontmapdir = $(devpdffontdir)/map
+devpdffontmapdata = \
+ font/devpdf/map/dingbats.map \
+ font/devpdf/map/symbol.map \
+ font/devpdf/map/symbolchars \
+ font/devpdf/map/text.map
+devpdffontmap_DATA = $(devpdffontmapdata)
+
+EXTRA_DIST += \
+ font/devpdf/DESC.in \
+ font/devpdf/Foundry.in \
+ font/devpdf/util/BuildFoundries.pl
+
+all: font/devpdf/stamp
+
+font/devpdf/enc/text.enc:
+ $(AM_V_at)$(MKDIR_P) $(top_builddir)/font/devpdf/enc
+ $(AM_V_at)cp -f $(top_srcdir)/font/devps/text.enc \
+ $(top_builddir)/font/devpdf/enc
+
+$(devpdffontmapdata):
+ $(AM_V_at)$(MKDIR_P) $(top_builddir)/font/devpdf/map
+ $(AM_V_at)cp -f \
+ $(top_srcdir)/font/devps/generate/`basename $@` \
+ $(top_builddir)/font/devpdf/map
+
+MOSTLYCLEANFILES += font/devpdf/util/BuildFoundries
+font/devpdf/util/BuildFoundries: \
+ $(devpdf_srcdir)/util/BuildFoundries.pl $(SH_DEPS_SED_SCRIPT) afmtodit
+ $(AM_V_GEN)$(MKDIR_P) $(top_builddir)/font/devpdf/util \
+ && if test -n "$(PERL)"; then \
+ sed -f $(SH_DEPS_SED_SCRIPT) \
+ -e "s|/usr/bin/perl|$(PERL)|" \
+ -e "s|[@]GHOSTSCRIPT[@]|$(GHOSTSCRIPT)|" \
+ -e "s|[@]PATH_SEPARATOR[@]|$(PATH_SEPARATOR)|" \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e "s|[@]GROFF_FONT_DIR[@]|$(fontdir)|" \
+ $(devpdf_srcdir)/util/BuildFoundries.pl \
+ >$(top_builddir)/font/devpdf/util/BuildFoundries; \
+ else \
+ sed -f $(SH_DEPS_SED_SCRIPT) \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e "s|[@]GROFF_FONT_DIR[@]|$(fontdir)|" \
+ $(devpdf_srcdir)/util/BuildFoundries.pl \
+ >$(top_builddir)/font/devpdf/util/BuildFoundries; \
+ fi \
+ && chmod +x $(top_builddir)/font/devpdf/util/BuildFoundries
+
+MOSTLYCLEANFILES += font/devpdf/DESC
+font/devpdf/DESC: $(devpdf_srcdir)/DESC.in
+ $(AM_V_GEN)$(MKDIR_P) $(top_builddir)/font/devpdf \
+ && cat $(devpdf_srcdir)/DESC.in \
+ >$(top_builddir)/font/devpdf/DESC \
+ && if test "$(PAGE)" = A4; then \
+ echo "papersize a4" >>$(top_builddir)/font/devpdf/DESC; \
+ else \
+ echo "papersize letter" \
+ >>$(top_builddir)/font/devpdf/DESC; \
+ fi
+
+font/devpdf/Foundry: $(devpdf_srcdir)/Foundry.in
+ $(AM_V_at)$(MKDIR_P) $(top_builddir)/font/devpdf/
+if HAVE_URW_FONTS
+ $(AM_V_GEN)sed "s|[@]urwfontsdir[@]|$(urwfontsdir)|" \
+ $(devpdf_srcdir)/Foundry.in >$@
+else
+ $(AM_V_GEN)sed "/BEGIN URW/,/END URW/d" \
+ $(devpdf_srcdir)/Foundry.in >$@
+endif
+
+# This is kind of a cheat, but works because BuildFoundries produces so
+# many artifacts.
+$(DEFAULT_BASE35_FONTS) $(URW_BASE35_FONTS): font/devpdf/download
+
+MOSTLYCLEANFILES += font/devpdf/download
+font/devpdf/download: $(devpdffontmapdata) font/devpdf/DESC \
+ font/devpdf/Foundry font/devpdf/enc/text.enc \
+ font/devpdf/util/BuildFoundries
+ $(AM_V_GEN)$(MKDIR_P) $(top_builddir)/font/devpdf \
+ && echo "# foundry ps-font-name ps-font-file" >$@.tmp \
+ && echo "# A blank foundry is the default." >>$@.tmp \
+ && PATH="$(abs_top_builddir)$(GROFF_PATH_SEPARATOR)$(abs_top_builddir)/build-aux$(GROFF_PATH_SEPARATOR)$(PATH)" \
+ $(abs_top_builddir)/font/devpdf/util/BuildFoundries \
+ --strict $(abs_top_builddir)/font/devpdf \
+ '$(abs_top_srcdir)/font/devps:$(abs_top_builddir)/font/devps' \
+ >>$@.tmp \
+ && mv $@.tmp $@
+
+# PDFs to be produced by troff should depend on this stamp file to
+# ensure that gropdf's device and font description files are available.
+MOSTLYCLEANFILES += font/devpdf/stamp
+font/devpdf/stamp: font/devpdf/DESC font/devpdf/download \
+ $(devpdffontenc_DATA) $(devpdffontmap_DATA) $(devpdffont_DATA)
+ $(AM_V_at)>$@
+
+mostlyclean-local: mostlyclean_devpdf_extra
+mostlyclean_devpdf_extra:
+ @echo Cleaning font/devpdf
+ rm -rf $(top_builddir)/font/devpdf/enc \
+ $(top_builddir)/font/devpdf/map;
+ if test -d $(top_builddir)/font/devpdf; then \
+ for f in $(GROFF_FONT_FILES); do \
+ rm -f $(top_builddir)/font/devpdf/$$f; \
+ done; \
+ fi
+
+install-data-local: install_devpdf
+install_devpdf:
+ @echo Installing devpdf files
+ -@test -d $(DESTDIR)$(devpdffontdir) \
+ || $(mkinstalldirs) $(DESTDIR)$(devpdffontdir)
+ @for f in $(GROFF_FONT_FILES); do \
+ $(RM) $(DESTDIR)$(devpdffontdir)/$$f; \
+ if test -f $$f; then \
+ $(INSTALL_DATA) $$f $(DESTDIR)$(devpdffontdir)/$$f; \
+ else \
+ $(INSTALL_DATA) $(top_builddir)/font/devpdf/$$f \
+ $(DESTDIR)$(devpdffontdir)/$$f; \
+ fi; \
+ done
+ $(INSTALL_DATA) $(top_builddir)/font/devpdf/download \
+ $(DESTDIR)$(devpdffontdir)/
+
+uninstall_groffdirs: uninstall_devpdf
+uninstall_devpdf:
+ @echo Uninstalling devpdf files
+ if test -d $(DESTDIR)$(devpdffontdir); then \
+ for f in $(GROFF_FONT_FILES); do \
+ rm -f $(DESTDIR)$(devpdffontdir)/$$f; \
+ done; \
+ if test -d $(DESTDIR)$(devpdffontencdir); then \
+ rmdir $(DESTDIR)$(devpdffontencdir); \
+ fi; \
+ if test -d $(DESTDIR)$(devpdffontmapdir); then \
+ rmdir $(DESTDIR)$(devpdffontmapdir); \
+ fi; \
+ rm -f $(DESTDIR)$(devpdffontdir)/download; \
+ rmdir $(DESTDIR)$(devpdffontdir); \
+ fi
+
+font_devpdf_default_test=\
+ $(devpdf_srcdir)/tests/check-default-foundry.sh.in
+font_devpdf_urw_test=$(devpdf_srcdir)/tests/check-urw-foundry.sh.in
+
+font/devpdf/tests/check-default-foundry.sh: $(font_devpdf_default_test)
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && sed -e "s|[@]GHOSTSCRIPT[@]|$(GHOSTSCRIPT)|g" \
+ $(font_devpdf_default_test) > $@ \
+ && chmod +x $@
+
+font/devpdf/tests/check-urw-foundry.sh: $(font_devpdf_urw_test)
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && sed -e "s|[@]urwfontsdir[@]|$(urwfontsdir)|g" \
+ $(font_devpdf_urw_test) > $@ \
+ && chmod +x $@
+
+font_devpdf_TESTS = \
+ font/devpdf/tests/check-default-foundry.sh \
+ font/devpdf/tests/check-urw-foundry.sh
+
+TESTS += $(font_devpdf_TESTS)
+MOSTLYCLEANFILES += $(font_devpdf_TESTS)
+EXTRA_DIST += $(font_devpdf_default_test) $(font_devpdf_urw_test)
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/font/devpdf/tests/check-default-foundry.sh.in b/font/devpdf/tests/check-default-foundry.sh.in
new file mode 100755
index 0000000..026cc01
--- /dev/null
+++ b/font/devpdf/tests/check-default-foundry.sh.in
@@ -0,0 +1,99 @@
+#!/bin/sh
+#
+# Copyright (C) 2022-2023 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+devpdf_fontbuilddir="${abs_top_builddir:-.}"/font/devpdf
+ghostscript=@GHOSTSCRIPT@
+
+wail () {
+ echo ...FAILED >&2
+ fail=yes
+}
+
+fail=
+
+# The are the base 14 fonts required by the PDF standard. They should
+# _always_ be present and supported. If their corresponding Type 1 font
+# files are available, they too can be embedded in a PDF using gropdf's
+# "-e" option. groff's "EURO" font is always available; we ship it.
+mandatory_fonts='CB
+CBI
+CI
+CR
+HB
+HBI
+HI
+HR
+S
+TB
+TBI
+TI
+TR
+ZD'
+
+# These fonts are commonly, but not universally, available; if used,
+# their corresponding Type 1 font files must be embedded in a document.
+#
+# Their groff font descriptions will always be available: we ship them.
+# But they are not usable with gropdf(1) if the Type 1 files are absent.
+# We thus will not test them if they are not expected to work.
+supplementary_fonts='AB
+ABI
+AI
+AR
+BMB
+BMBI
+BMI
+BMR
+HNB
+HNBI
+HNI
+HNR
+NB
+NBI
+NI
+NR
+PB
+PBI
+PI
+PR
+ZCMI'
+
+for f in $mandatory_fonts
+do
+ printf "checking for font description %s...\n" "$f" >&2
+ test -f "$devpdf_fontbuilddir"/"$f" || wail
+done
+
+if [ "$ghostscript" = no ] || [ "$ghostscript" = missing ]
+then
+ echo "Ghostscript not available; skipping check for any further" \
+ "fonts in the default foundry" >&2
+ exit 77 # skip
+fi
+
+for f in $supplementary_fonts
+do
+ printf "checking for font description %s...\n" "$f" >&2
+ test -f "$devpdf_fontbuilddir"/"$f" || wail
+done
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/font/devpdf/tests/check-urw-foundry.sh.in b/font/devpdf/tests/check-urw-foundry.sh.in
new file mode 100755
index 0000000..d31b3aa
--- /dev/null
+++ b/font/devpdf/tests/check-urw-foundry.sh.in
@@ -0,0 +1,86 @@
+#!/bin/sh
+#
+# Copyright (C) 2022-2023 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+# Ensure that groff's PDF device has URW font descriptions it expects.
+# These are generated at build time by afmtodit(1) if a URW font
+# directory was discovered at configuration time.
+
+devpdf_fontbuilddir="${abs_top_builddir:-.}"/font/devpdf
+urwfontsdir=@urwfontsdir@
+
+if [ -z "$urwfontsdir" ]
+then
+ echo "URW fonts not found at configuration time; skipping" >&2
+ exit 77 # skip
+fi
+
+fonts='AB
+ABI
+AI
+AR
+BMB
+BMBI
+BMI
+BMR
+CB
+CBI
+CI
+CR
+HB
+HBI
+HI
+HNB
+HNBI
+HNI
+HNR
+HR
+NB
+NBI
+NI
+NR
+PB
+PBI
+PI
+PR
+S
+TB
+TBI
+TI
+TR
+ZCMI
+ZD'
+
+fail=
+
+for basefontname in $fonts
+do
+ f=U-$basefontname
+ printf "checking for font description %s...\n" $f >&2
+ if ! test -f "$devpdf_fontbuilddir"/$f
+ then
+ echo test -f "$devpdf_fontbuilddir"/$f
+ echo ...FAILED >&2
+ fail=yes
+ fi
+done
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/font/devpdf/util/BuildFoundries.pl b/font/devpdf/util/BuildFoundries.pl
new file mode 100644
index 0000000..2815c37
--- /dev/null
+++ b/font/devpdf/util/BuildFoundries.pl
@@ -0,0 +1,578 @@
+#!/usr/bin/perl
+#
+# BuildFoundries: Given a Foundry file, generate groff font description
+# files and a "download" file so gropdf can embed fonts in PDF output.
+#
+# Copyright (C) 2011-2020 Free Software Foundation, Inc.
+# Written by Deri James <deri@chuzzlewit.myzen.co.uk>
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+use strict;
+use Getopt::Long;
+use warnings;
+
+my $pathsep='@PATH_SEPARATOR@';
+
+my $check=0;
+my $dirURW='';
+my $beStrict=0;
+
+GetOptions("check" => \$check, "dirURW=s" => \$dirURW,
+ "strict" => \$beStrict);
+
+(my $progname = $0) =~s @.*/@@;
+my $where=shift||'';
+my @d=(split(':',shift||'../devps'));
+my $devps=\@d;
+chdir $where if $where ne '';
+my (%flg,@downloadpreamble,%download);
+my $GSpath=FindGSpath();
+my $lct=0;
+my $foundry=''; # the default foundry
+my $notFoundFont=0;
+
+if ($check)
+{
+ CheckFoundry("Foundry.in");
+ exit $notFoundFont;
+}
+else
+{
+ LoadDownload("download"); # not required
+ LoadFoundry("Foundry");
+ WriteDownload();
+}
+exit 0;
+
+
+
+sub LoadFoundry
+{
+ my $fn=shift;
+ my $foundrypath;
+ $notFoundFont=0;
+
+ open(F,"<$fn") or Die("file '$fn' not found or not readable");
+
+ while (<F>)
+ {
+ chomp;
+ $lct++;
+ s/\r$//; # in case edited in windows
+
+ s/\s*#.*?$//; # remove comments
+
+ next if $_ eq '';
+
+ if (m/^[A-Za-z]=/)
+ {
+ my (@f)=split('=');
+ $flg{$f[0]}=$f[1];
+ next;
+ }
+
+ my (@r)=split('\|');
+
+ if (lc($r[0]) eq 'foundry')
+ {
+ Warn("\nThe path(s) used for searching:\n".join(':',@{$foundrypath})."\n") if $notFoundFont;
+ $foundry=uc($r[1]);
+ $foundrypath=[];
+ push(@{$foundrypath},$dirURW) if $dirURW;
+ push(@{$foundrypath},(split(':',$r[2])),@{$devps});
+ foreach my $j (0..$#{$foundrypath})
+ {
+ if (defined($foundrypath->[$j])
+ && $foundrypath->[$j]=~m'\s*\(gs\)')
+ {
+ splice(@{$foundrypath},$j,1,@{$GSpath});
+ }
+ }
+ $notFoundFont=0;
+ }
+ else
+ {
+ # 0=groff font name
+ # 1=IsBase Y/N (one of PDFs 14 base fonts)
+ # 2=afmtodit flag
+ # 3=map file
+ # 4=encoding file
+ # 5=font file
+
+ my $gfont=($foundry eq '')?$r[0]:"$foundry-$r[0]";
+
+ if ($r[2] eq '')
+ {
+ # Don't run afmtodit; just copy the groff font
+ # description file for grops.
+ my $gotf=1;
+ my $gropsfnt=LocateFile($devps,$r[0],0);
+ if ($gropsfnt ne '' and -r "$gropsfnt")
+ {
+ my $psfont=UseGropsVersion($gropsfnt);
+ # To be embeddable in PDF, the font file name itself
+ # needs to be located and written to "download".
+ if (!PutDownload($psfont,
+ LocatePF($foundrypath,$r[5]),
+ uc($r[1])))
+ {
+ if (uc($r[1]) ne 'Y')
+ {
+ $gotf=0;
+ my $fns=join(', ',split('!',$r[5]));
+ Warn("groff font '$gfont' will not be"
+ . " available for PDF output; unable"
+ . " to locate font file(s): $fns");
+ $notFoundFont=1;
+ unlink $gfont;
+ }
+ }
+ Notice("copied grops font $gfont") if $gotf;
+
+ }
+ else
+ {
+ Warn("Can't read grops font '$r[0]' for Foundry '$foundry'");
+ }
+ }
+ else
+ {
+ # Use afmtodit to create a groff font description file.
+ my $afmfile=LocateAF($foundrypath,$r[5]);
+ if (!$afmfile) {
+ my $sub=\&Warn;
+ $sub=\&Die if ($beStrict);
+ &$sub("cannot locate AFM file for font '$gfont'");
+ next;
+ }
+ my $psfont=RunAfmtodit($gfont,$afmfile,$r[2],$r[3],$r[4]);
+
+ if ($psfont)
+ {
+ if (!PutDownload($psfont,LocatePF($foundrypath,$r[5]),uc($r[1])))
+ {
+ unlink $gfont; # Unable to find the postscript file for the font just created by afmtodit
+ }
+ else
+ {
+ Notice("generated $gfont");
+ }
+ }
+ else
+ {
+ Warn("Failed to create groff font '$gfont' by running afmtodit");
+ $notFoundFont=1;
+ }
+ }
+ }
+ }
+
+ close(F);
+ Warn("\nThe path(s) used for searching:\n".join(':',@{$foundrypath})."\n") if $notFoundFont;
+}
+
+sub RunAfmtodit
+{
+ my $gfont=shift;
+ my $afmfile=shift;
+ my $flags=shift;
+ my $map=shift||'';
+ my $enc=shift||'';
+ my $psfont='';
+
+ $enc="-e 'enc/$enc'" if $enc;
+ $map="'map/$map'" if $map;
+
+ my $cmd='afmtodit -c -dDESC';
+
+ foreach my $f (split('',$flags))
+ {
+ if (!exists($flg{$f}))
+ {
+ Warn("Can't use undefined flag '$f' in calling afmtodit for groff font '$gfont'");
+ return('');
+ }
+
+ $cmd.=" $flg{$f}";
+ }
+
+ system("$cmd $enc '$afmfile' $map $gfont");
+
+ if ($?)
+ {
+ unlink $gfont;
+ return('');
+ }
+
+ if (open(GF,"<$gfont"))
+ {
+ my (@gf)=(<GF>);
+ my @ps=grep(/^internalname /,@gf);
+ if ($#ps == 0) # Just 1 match
+ {
+ (undef,$psfont)=split(' ',$ps[0],2);
+ chomp($psfont);
+ }
+ else
+ {
+ Warn("Unexpected format for grops font '$gfont' for Foundry '$foundry' - ignoring");
+ }
+
+ close(GF);
+ }
+
+ return($psfont);
+}
+
+sub LocateAF
+{
+ my $path=shift;
+ my $file=shift;
+
+ return(LocateFile($path,$file,1));
+}
+
+sub LocatePF
+{
+ my $path=shift;
+ my $file=shift;
+
+ return(LocateFile($path,$file,0));
+}
+
+sub LocateFile
+{
+ my $path=shift;
+ my $files=shift;
+ my $tryafm=shift;
+ return(substr($files,1)) if substr($files,0,1) eq '*';
+
+ foreach my $p (@{$path})
+ {
+ next if !defined($p) or $p eq ';' or $p eq ':';
+ $p=~s/^\s+//;
+ $p=~s/\s+$//;
+ $p=~s@/+$@@;
+
+ next if $p=~m/^\%rom\%/; # exclude %rom% paths (from (gs))
+
+ foreach my $file (reverse(split('!',$files)))
+ {
+ if ($tryafm)
+ {
+ if (!($file=~s/\..+$/.afm/))
+ {
+ # no extenaion
+ $file.='.afm';
+ }
+ }
+
+ if ($file=~m'/')
+ {
+ # path given with file name so no need to search the paths
+
+ if (-r $file)
+ {
+ return($file);
+ }
+
+ if ($tryafm and $file=~s'type1/'afm/'i)
+ {
+ if (-r "$file")
+ {
+ return($file);
+ }
+ }
+
+ return('');
+ }
+
+ if ($path eq '(tex)')
+ {
+ my $res=`kpsewhich $file`;
+ return '' if $?;
+ chomp($res);
+ return($res);
+ }
+
+ if (-r "$p/$file")
+ {
+ return("$p/$file");
+ }
+
+ my $ap=$p;
+
+ if ($tryafm and $ap=~s'type1/'afm/'i)
+ {
+ if (-r "$ap/$file")
+ {
+ return("$ap/$file");
+ }
+ }
+ }
+ }
+
+ return('');
+}
+
+sub FindGSpath
+{
+ my (@res)=`@GHOSTSCRIPT@ -h 2>/dev/null`;
+ return [] if $?;
+ my $buildpath=[];
+ my $stg=1;
+
+ foreach my $l (@res)
+ {
+ chomp($l);
+
+ if ($stg==1 and $l=~m/^Search path:/)
+ {
+ $stg=2;
+ }
+ elsif ($stg == 2)
+ {
+ if (substr($l,0,1) ne ' ')
+ {
+ $stg=3;
+ }
+ else
+ {
+ $l=~s/^\s+//;
+ $pathsep=';' if substr($l,-1) eq ';';
+ push(@{$buildpath},(split("$pathsep",$l)));
+ }
+ }
+ }
+
+ return($buildpath);
+}
+
+sub UseGropsVersion
+{
+ my $gfont=shift;
+ my $psfont='';
+ my (@gfa)=split('/',$gfont);
+ my $gfontbase=pop(@gfa);
+
+ if (open(GF,"<$gfont"))
+ {
+ my (@gf)=(<GF>);
+ my @ps=grep(/^internalname /,@gf);
+ if ($#ps == 0) # Just 1 match
+ {
+ (undef,$psfont)=split(' ',$ps[0],2);
+ chomp($psfont);
+ }
+ else
+ {
+ Warn("Unexpected format for grops font '$gfont' for Foundry '$foundry' - ignoring");
+ }
+
+ close(GF);
+
+ if ($psfont)
+ {
+ if (open(GF,">$gfontbase"))
+ {
+ local $"='';
+ print GF "@gf";
+ close(GF);
+ }
+ else
+ {
+ $psfont='';
+ Warn("Failed to create new font '$gfont' for Foundry '$foundry'");
+ }
+ }
+ else
+ {
+ Warn("Failed to locate postscript internalname in grops font '$gfont' for Foundry '$foundry'");
+ }
+
+ close(GF);
+ }
+ else
+ {
+ Warn("Failed to open grops font '$gfont' for Foundry '$foundry'");
+ }
+
+ return($psfont);
+}
+
+sub PutDownload
+{
+ my $psfont=shift;
+ my $pffile=shift;
+ my $IsBase14=shift;
+ my $key="$foundry $psfont";
+
+ delete($download{$key}), return 0 if ($pffile eq '');
+
+ $pffile='*'.$pffile if $IsBase14 eq 'Y'; # This signals to gropdf to only edmbed if -e given
+ $download{$key}=$pffile;
+
+ return 1;
+}
+
+sub LoadDownload
+{
+ my $fn=shift;
+
+ return if !open(F,"<$fn");
+
+ while (<F>)
+ {
+ chomp;
+ s/\r$//; # in case edited in windows
+
+ if (substr($_,0,1) eq '#' or $_ eq '')
+ {
+ # Preserve comments at top of download file
+
+ push(@downloadpreamble,$_);
+ next;
+ }
+
+ s/\s*#.*?$//; # remove comments
+
+ next if $_ eq '';
+
+ my (@r)=split(/\t+/);
+ my $key=$r[1];
+ $key="$r[0] $r[1]";
+ $download{$key}=$r[2];
+ }
+
+ close(F);
+}
+
+sub WriteDownload
+{
+ print join("\n",@downloadpreamble),"\n";
+
+ foreach my $k (sort keys %download)
+ {
+ my ($f,$ps)=split(/ /,$k);
+ print "$f\t$ps\t$download{$k}\n";
+ }
+}
+
+sub Notice {
+ my $msg=shift;
+ Msg("notice: $msg");
+}
+
+sub Warn {
+ my $msg=shift;
+ Msg("warning: line $lct: $msg");
+}
+
+sub Die {
+ my $msg=shift;
+ Msg("error: $msg");
+ exit 2;
+}
+
+sub Msg {
+ my $msg=shift;
+ print STDERR "$progname: $msg\n";
+}
+
+sub CheckFoundry
+{
+ my $fn=shift;
+ my $foundrypath=[];
+ $notFoundFont=0;
+
+ open(F,"<$fn") or Die("file '$fn' not found or not readable");
+
+ while (<F>)
+ {
+ chomp;
+ s/\r$//; # in case edited in windows
+
+ s/\s*#.*?$//; # remove comments
+
+ next if $_ eq '';
+
+ if (m/^[A-Za-z]=/)
+ {
+ next;
+ }
+
+ my (@r)=split('\|');
+
+ if (lc($r[0]) eq 'foundry')
+ {
+ $foundry=uc($r[1]);
+ $foundrypath=[];
+ push(@{$foundrypath},$dirURW) if $dirURW;
+ push(@{$foundrypath},(split(':',$r[2])),$devps);
+ foreach my $j (0..$#{$foundrypath})
+ {
+ if ($foundrypath->[$j]=~m'\s*\(gs\)')
+ {
+ splice(@{$foundrypath},$j,1,@{$GSpath});
+ }
+ }
+ $notFoundFont=0;
+ }
+ else
+ {
+ # 0=groff font name
+ # 1=IsBase Y/N (one of PDFs 14 base fonts)
+ # 2=afmtodit flag
+ # 3=map file
+ # 4=encoding file
+ # 5=font file
+
+ my $gfont=($foundry eq '')?$r[0]:"$foundry-$r[0]";
+
+ if ($r[2] eq '')
+ {
+ # Don't run afmtodit, just copy the grops font file
+
+ my $gotf=1;
+ my $gropsfnt=LocateFile([$devps],$r[0],0);
+
+ if ($gropsfnt ne '' and -r "$gropsfnt")
+ {
+
+ }
+ else
+ {
+ $notFoundFont|=1;
+ }
+ }
+ else
+ {
+ # We need to run afmtodit to create this groff font
+ $notFoundFont|=2 if !LocateAF($foundrypath,$r[5]);
+ $notFoundFont|=1 if !LocatePF($foundrypath,$r[5]);
+ }
+ }
+ }
+
+ close(F);
+}
+
+# Local Variables:
+# fill-column: 72
+# mode: CPerl
+# End:
+# vim: set cindent noexpandtab shiftwidth=4 softtabstop=4 textwidth=72:
diff --git a/font/devps/AB b/font/devps/AB
new file mode 100644
index 0000000..44d8805
--- /dev/null
+++ b/font/devps/AB
@@ -0,0 +1,700 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName ITC Avant Garde Gothic Demi
+# Version 003.001
+# FamilyName ITC Avant Garde Gothic
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1991, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.ITC Avant Garde Gothic is a registered trademark of International Typeface Corporation.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1991, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:42:33 1999
+# Comment UniqueID 44726
+# Comment VMusage 27573 34509
+
+name AB
+internalname AvantGarde-Demi
+spacewidth 280
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A T -73
+A V -127
+A W -96
+A Y -139
+A 'Y -139
+A :Y -139
+A v -50
+A w -50
+A y -50
+A 'y -50
+A :y -50
+'A T -73
+'A V -127
+'A W -96
+'A Y -139
+'A 'Y -139
+'A :Y -139
+'A v -50
+'A w -50
+'A y -50
+'A 'y -50
+'A :y -50
+^A T -73
+^A V -127
+^A W -96
+^A Y -139
+^A 'Y -139
+^A :Y -139
+^A v -50
+^A w -50
+^A y -50
+^A 'y -50
+^A :y -50
+:A T -73
+:A V -127
+:A W -96
+:A Y -139
+:A 'Y -139
+:A :Y -139
+:A v -50
+:A w -50
+:A y -50
+:A 'y -50
+:A :y -50
+`A T -73
+`A V -127
+`A W -96
+`A Y -139
+`A 'Y -139
+`A :Y -139
+`A v -50
+`A w -50
+`A y -50
+`A 'y -50
+`A :y -50
+oA T -73
+oA V -127
+oA W -96
+oA Y -139
+oA 'Y -139
+oA :Y -139
+oA v -50
+oA w -50
+oA y -50
+oA 'y -50
+oA :y -50
+~A T -73
+~A V -127
+~A W -96
+~A Y -139
+~A 'Y -139
+~A :Y -139
+~A v -50
+~A w -50
+~A y -50
+~A 'y -50
+~A :y -50
+F A -95
+F 'A -95
+F ^A -95
+F :A -95
+F `A -95
+F oA -95
+F ~A -95
+F , -42
+F . -42
+F u2026 -42
+L T -50
+L V -90
+L W -90
+L Y -90
+L 'Y -90
+L :Y -90
+L y -75
+L 'y -75
+L :y -75
+/L T -50
+/L V -90
+/L W -90
+/L Y -90
+/L 'Y -90
+/L :Y -90
+/L y -75
+/L 'y -75
+/L :y -75
+P A -100
+P 'A -100
+P ^A -100
+P :A -100
+P `A -100
+P oA -100
+P ~A -100
+P , -16
+P . -16
+P u2026 -16
+R T 16
+R V -26
+R W -20
+R Y -20
+R 'Y -20
+R :Y -20
+R y 31
+R 'y 31
+R :y 31
+T A -70
+T 'A -70
+T ^A -70
+T :A -70
+T `A -70
+T oA -70
+T ~A -70
+T a -40
+T 'a -40
+T ^a -40
+T :a -40
+T `a -40
+T oa -40
+T ~a -40
+T c -50
+T ,c -50
+T : -12
+T , 4
+T e -50
+T 'e -50
+T ^e -50
+T :e -50
+T `e -50
+T - -10
+T hy -10
+T i -5
+T 'i 10
+T ^i 10
+T :i 10
+T `i 10
+T o -50
+T 'o -50
+T ^o -50
+T :o -50
+T `o -50
+T /o -50
+T ~o -50
+T . 4
+T u2026 4
+T r -42
+T s -43
+T ; -12
+T u -56
+T 'u -56
+T ^u -56
+T :u -56
+T `u -56
+T w -15
+T y -12
+T 'y -12
+T :y -12
+V A -125
+V 'A -125
+V ^A -125
+V :A -125
+V `A -125
+V oA -125
+V ~A -125
+V a -80
+V 'a -80
+V ^a -80
+V :a -80
+V `a -80
+V oa -80
+V ~a -80
+V : -13
+V , -13
+V e -80
+V 'e -80
+V ^e -80
+V :e -80
+V `e -80
+V - -20
+V hy -20
+V i -9
+V 'i -9
+V o -80
+V 'o -80
+V ^o -80
+V :o -80
+V `o -80
+V /o -80
+V ~o -80
+V . -13
+V u2026 -13
+V r -40
+V ; -13
+V u -68
+V 'u -68
+V ^u -68
+V :u -68
+V `u -68
+V y -15
+V 'y -15
+V :y -15
+W A -94
+W 'A -94
+W ^A -94
+W :A -94
+W `A -94
+W oA -94
+W ~A -94
+W a -50
+W 'a -50
+W ^a -50
+W :a -50
+W `a -50
+W oa -50
+W ~a -50
+W : -12
+W , -12
+W e -50
+W 'e -50
+W ^e -50
+W :e -50
+W `e -50
+W - -10
+W hy -10
+W i -7
+W 'i 10
+W ^i 10
+W :i 10
+W `i 10
+W o -50
+W 'o -50
+W ^o -50
+W :o -50
+W `o -50
+W /o -50
+W ~o -50
+W . -12
+W u2026 -12
+W r -39
+W ; -12
+W u -40
+W 'u -40
+W ^u -40
+W :u -40
+W `u -40
+W y 1
+W 'y 1
+W :y 1
+Y A -138
+Y 'A -138
+Y ^A -138
+Y :A -138
+Y `A -138
+Y oA -138
+Y ~A -138
+Y a -100
+Y 'a -100
+Y ^a -100
+Y :a -100
+Y `a -100
+Y oa -100
+Y ~a -100
+Y : -8
+Y , -8
+Y e -100
+Y 'e -100
+Y ^e -100
+Y :e -100
+Y `e -100
+Y - -60
+Y hy -60
+Y i -5
+Y 'i -5
+Y ^i 10
+Y :i 10
+Y `i 10
+Y o -100
+Y 'o -100
+Y ^o -100
+Y :o -100
+Y `o -100
+Y /o -100
+Y ~o -100
+Y p -60
+Y . -8
+Y u2026 -8
+Y q -100
+Y ; -8
+Y u -82
+Y 'u -82
+Y ^u -82
+Y :u -82
+Y `u -82
+Y v -25
+'Y A -138
+'Y 'A -138
+'Y ^A -138
+'Y :A -138
+'Y `A -138
+'Y oA -138
+'Y ~A -138
+'Y a -100
+'Y 'a -100
+'Y ^a -100
+'Y :a -100
+'Y `a -100
+'Y oa -100
+'Y ~a -100
+'Y : -8
+'Y , -8
+'Y e -100
+'Y 'e -100
+'Y ^e -100
+'Y :e -100
+'Y `e -100
+'Y - -60
+'Y hy -60
+'Y i -5
+'Y 'i -5
+'Y ^i 10
+'Y :i 10
+'Y `i 10
+'Y o -100
+'Y 'o -100
+'Y ^o -100
+'Y :o -100
+'Y `o -100
+'Y /o -100
+'Y ~o -100
+'Y p -60
+'Y . -8
+'Y u2026 -8
+'Y q -100
+'Y ; -8
+'Y u -82
+'Y 'u -82
+'Y ^u -82
+'Y :u -82
+'Y `u -82
+'Y v -25
+:Y A -138
+:Y 'A -138
+:Y ^A -138
+:Y :A -138
+:Y `A -138
+:Y oA -138
+:Y ~A -138
+:Y a -100
+:Y 'a -100
+:Y ^a -100
+:Y :a -100
+:Y `a -100
+:Y oa -100
+:Y ~a -100
+:Y : -8
+:Y , -8
+:Y e -100
+:Y 'e -100
+:Y ^e -100
+:Y :e -100
+:Y `e -100
+:Y - -60
+:Y hy -60
+:Y i -5
+:Y 'i -5
+:Y ^i 10
+:Y :i 10
+:Y `i 10
+:Y o -100
+:Y 'o -100
+:Y ^o -100
+:Y :o -100
+:Y `o -100
+:Y /o -100
+:Y ~o -100
+:Y p -60
+:Y . -8
+:Y u2026 -8
+:Y q -100
+:Y ; -8
+:Y u -82
+:Y 'u -82
+:Y ^u -82
+:Y :u -82
+:Y `u -82
+:Y v -25
+f f 38
+r c -27
+r ,c -27
+r , 9
+r d -8
+r e -8
+r 'e -8
+r ^e -8
+r :e -8
+r `e -8
+r f 38
+r g -8
+r - -10
+r hy -10
+r m 5
+r n 5
+r ~n 5
+r o -18
+r 'o -18
+r ^o -18
+r :o -18
+r `o -18
+r /o -18
+r ~o -18
+r . 9
+r u2026 9
+r q -18
+
+charset
+ha 600,740 2 0 asciicircum
+ti 600,347 0 1 asciitilde
+vS 520,944,15 2 2 Scaron
+vZ 500,944 2 3 Zcaron
+vs 440,774,18 2 4 scaron
+vz 460,774 2 5 zcaron
+:Y 620,939,0,2,2 2 6 Ydieresis
+tm 1000,740 2 7 trademark
+aq 220,740 2 8 quotesingle
+Eu 560,755,15,1 2 9 Euro
+space 280 0 32 space
+! 280,740 2 33 exclam
+" 360,740 2 34 quotedbl
+dq "
+# 560,700 0 35 numbersign
+sh "
+$ 560,857,86 2 36 dollar
+Do "
+% 860,755,15 2 37 percent
+& 680,755,15 2 38 ampersand
+' 280,740 2 39 quoteright
+cq "
+( 380,754,157 2 40 parenleft
+) 380,754,157 2 41 parenright
+* 440,755 2 42 asterisk
++ 600,506 0 43 plus
+, 280,133,141 0 44 comma
+- 420,348 0 45 hyphen
+hy "
+. 280,133 0 46 period
+/ 460,740,100 2 47 slash
+sl "
+0 560,755,15 2 48 zero
+1 560,740 2 49 one
+2 560,755 2 50 two
+3 560,755,15 2 51 three
+4 560,740 2 52 four
+5 560,740,15 2 53 five
+6 560,739,15 2 54 six
+7 560,740 2 55 seven
+8 560,755,15 2 56 eight
+9 560,754 2 57 nine
+: 280,555 0 58 colon
+; 280,555,141 0 59 semicolon
+< 600,514,8 0 60 less
+= 600,425 0 61 equal
+> 600,514,8 0 62 greater
+? 560,755 2 63 question
+@ 740,712,12,10 0 64 at
+at "
+A 740,740 2 65 A
+B 580,740 2 66 B
+C 780,755,15 2 67 C
+D 700,740 2 68 D
+E 520,740 2 69 E
+F 480,740 2 70 F
+G 840,755,15 2 71 G
+H 680,740 2 72 H
+I 280,740 2 73 I
+J 480,740,15 2 74 J
+K 620,740 2 75 K
+L 440,740 2 76 L
+M 900,740 2 77 M
+N 740,740 2 78 N
+O 840,755,15 2 79 O
+P 560,740 2 80 P
+Q 840,755,15 2 81 Q
+R 580,740 2 82 R
+S 520,755,15 2 83 S
+T 420,740 2 84 T
+U 640,740,15 2 85 U
+V 700,740 2 86 V
+W 900,740 2 87 W
+X 680,740 2 88 X
+Y 620,740,0,2,2 2 89 Y
+Z 500,740 2 90 Z
+[ 320,754,157 2 91 bracketleft
+lB "
+\ 640,740,100 2 92 backslash
+rs "
+] 320,754,157 2 93 bracketright
+rB "
+^ 540,774 2 94 circumflex
+a^ "
+_ 500,0,125 0 95 underscore
+` 280,740 2 96 quoteleft
+oq "
+a 660,574,18 0 97 a
+b 660,740,18 2 98 b
+c 640,574,18 0 99 c
+d 660,740,18 2 100 d
+e 640,574,18 0 101 e
+f 280,755 2 102 f
+g 660,574,226 1 103 g
+h 600,740 2 104 h
+i 240,740 2 105 i
+j 260,740,185 3 106 j
+k 580,740 2 107 k
+l 240,740 2 108 l
+m 940,574 0 109 m
+n 600,574 0 110 n
+o 640,574,18 0 111 o
+p 660,574,185 1 112 p
+q 660,574,185 1 113 q
+r 320,574 0 114 r
+s 440,574,18 0 115 s
+t 300,740 2 116 t
+u 600,555,18 0 117 u
+v 560,555 0 118 v
+w 800,555 0 119 w
+x 560,555 0 120 x
+y 580,555,185 1 121 y
+z 460,555 0 122 z
+{ 340,747,191,0,3 3 123 braceleft
+lC "
+| 600,750,250 3 124 bar
+ba "
+} 340,747,191,3 3 125 braceright
+rC "
+~ 480,767 2 126 tilde
+a~ "
+bq 280,133,141 0 128 quotesinglbase
+Fo 460,469 0 129 guillemotleft
+Fc 460,469 0 130 guillemotright
+bu 600,532 0 131 bullet
+Fn 560,824,151 2 132 florin
+f/ 160,740,0,122,123 2 133 fraction
+%0 1280,755,15 2 134 perthousand
+dg 560,740,142 2 135 dagger
+dd 560,740,142 2 136 daggerdbl
+en 500,348 0 137 endash
+em 1000,348 0 138 emdash
+fi 520,755 2 140 fi
+fl 520,755 2 141 fl
+.i 240,555 0 144 dotlessi
+ga 420,851 2 146 grave
+a" 700,849 2 147 hungarumlaut
+a. 280,769 2 148 dotaccent
+ab 480,770 2 149 breve
+ah 540,774 2 150 caron
+ao 360,834 2 151 ring
+ho 340,9,195 1 152 ogonek
+lq 480,740 2 153 quotedblleft
+rq 480,740 2 154 quotedblright
+oe 1080,574,18 0 155 oe
+/l 320,740 2 156 lslash
+Bq 480,133,141 0 157 quotedblbase
+OE 1060,755,15 2 158 OE
+/L 480,740 2 159 Lslash
+r! 280,555,185 1 161 exclamdown
+ct 560,715 0 162 cent
+Po 560,755,0,2,2 2 163 sterling
+Cs 560,577 0 164 currency
+Ye 560,740,0,10,10 2 165 yen
+bb 600,675,175 0 166 brokenbar
+sc 560,755,158 2 167 section
+ad 500,769 2 168 dieresis
+co 740,752,12,12,12 2 169 copyright
+Of 360,755 2 170 ordfeminine
+fo 240,469 0 171 guilsinglleft
+tno 600,425 0 172 logicalnot
+\- 600,313 0 173 minus
+rg 740,752,12,12,12 2 174 registered
+a- 420,759 2 175 macron
+de 400,712 0 176 degree
+t+- 600,556,62 0 177 plusminus
+S2 336,749 2 178 twosuperior
+S3 336,749 2 179 threesuperior
+aa 420,851 2 180 acute
+*m 600,555,192 1 181 mu
+mc "
+ps 600,740,103,7,7 2 182 paragraph
+pc 280,320 0 183 periodcentered
+ac 340,6,251 1 184 cedilla
+S1 336,740 2 185 onesuperior
+Om 360,755 2 186 ordmasculine
+fc 240,469 0 187 guilsinglright
+14 840,740 2 188 onequarter
+12 840,740 2 189 onehalf
+34 840,749 2 190 threequarters
+r? 560,555,200 1 191 questiondown
+`A 740,1021 2 192 Agrave
+'A 740,1021 2 193 Aacute
+^A 740,944 2 194 Acircumflex
+~A 740,937 2 195 Atilde
+:A 740,939 2 196 Adieresis
+oA 740,969 2 197 Aring
+AE 900,740,0,0,5 2 198 AE
+,C 780,755,251 3 199 Ccedilla
+`E 520,1021 2 200 Egrave
+'E 520,1021 2 201 Eacute
+^E 520,944 2 202 Ecircumflex
+:E 520,939 2 203 Edieresis
+`I 280,1021,0,0,45 2 204 Igrave
+'I 280,1021,0,43 2 205 Iacute
+^I 280,944,0,60,59 2 206 Icircumflex
+:I 280,939,0,32,32 2 207 Idieresis
+-D 742,740 2 208 Eth
+~N 740,937 2 209 Ntilde
+`O 840,1021,15 2 210 Ograve
+'O 840,1021,15 2 211 Oacute
+^O 840,944,15 2 212 Ocircumflex
+~O 840,937,15 2 213 Otilde
+:O 840,939,15 2 214 Odieresis
+tmu 600,494 0 215 multiply
+/O 840,814,71 2 216 Oslash
+`U 640,1021,15 2 217 Ugrave
+'U 640,1021,15 2 218 Uacute
+^U 640,944,15 2 219 Ucircumflex
+:U 640,939,15 2 220 Udieresis
+'Y 620,1021,0,2,2 2 221 Yacute
+TP 560,740 2 222 Thorn
+ss 600,755,18 2 223 germandbls
+`a 660,851,18 2 224 agrave
+'a 660,851,18 2 225 aacute
+^a 660,774,18 2 226 acircumflex
+~a 660,767,18 2 227 atilde
+:a 660,769,18 2 228 adieresis
+oa 660,834,18 2 229 aring
+ae 1080,574,18 0 230 ae
+,c 640,574,251 1 231 ccedilla
+`e 640,851,18 2 232 egrave
+'e 640,851,18 2 233 eacute
+^e 640,774,18 2 234 ecircumflex
+:e 640,769,18 2 235 edieresis
+`i 240,851,0,0,65 2 236 igrave
+'i 240,851,0,63 2 237 iacute
+^i 240,774,0,80,79 2 238 icircumflex
+:i 240,769,0,52,52 2 239 idieresis
+Sd 640,754,18 2 240 eth
+~n 600,767 2 241 ntilde
+`o 640,851,18 2 242 ograve
+'o 640,851,18 2 243 oacute
+^o 640,774,18 2 244 ocircumflex
+~o 640,767,18 2 245 otilde
+:o 640,769,18 2 246 odieresis
+tdi 600,526,20 0 247 divide
+/o 660,608,50 0 248 oslash
+`u 600,851,18 2 249 ugrave
+'u 600,851,18 2 250 uacute
+^u 600,774,18 2 251 ucircumflex
+:u 600,769,18 2 252 udieresis
+'y 580,851,185 3 253 yacute
+Tp 660,740,185 3 254 thorn
+:y 580,769,185 3 255 ydieresis
+u2026 1000,133 0 256 ellipsis
diff --git a/font/devps/ABI b/font/devps/ABI
new file mode 100644
index 0000000..e3b517d
--- /dev/null
+++ b/font/devps/ABI
@@ -0,0 +1,701 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName ITC Avant Garde Gothic Demi Oblique
+# Version 003.001
+# FamilyName ITC Avant Garde Gothic
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1991, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.ITC Avant Garde Gothic is a registered trademark of International Typeface Corporation.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1991, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:43:21 1999
+# Comment UniqueID 44727
+# Comment VMusage 9292 47373
+
+name ABI
+internalname AvantGarde-DemiOblique
+slant 10.5
+spacewidth 280
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A T -73
+A V -127
+A W -96
+A Y -139
+A 'Y -139
+A :Y -139
+A v -50
+A w -50
+A y -50
+A 'y -50
+A :y -50
+'A T -73
+'A V -127
+'A W -96
+'A Y -139
+'A 'Y -139
+'A :Y -139
+'A v -50
+'A w -50
+'A y -50
+'A 'y -50
+'A :y -50
+^A T -73
+^A V -127
+^A W -96
+^A Y -139
+^A 'Y -139
+^A :Y -139
+^A v -50
+^A w -50
+^A y -50
+^A 'y -50
+^A :y -50
+:A T -73
+:A V -127
+:A W -96
+:A Y -139
+:A 'Y -139
+:A :Y -139
+:A v -50
+:A w -50
+:A y -50
+:A 'y -50
+:A :y -50
+`A T -73
+`A V -127
+`A W -96
+`A Y -139
+`A 'Y -139
+`A :Y -139
+`A v -50
+`A w -50
+`A y -50
+`A 'y -50
+`A :y -50
+oA T -73
+oA V -127
+oA W -96
+oA Y -139
+oA 'Y -139
+oA :Y -139
+oA v -50
+oA w -50
+oA y -50
+oA 'y -50
+oA :y -50
+~A T -73
+~A V -127
+~A W -96
+~A Y -139
+~A 'Y -139
+~A :Y -139
+~A v -50
+~A w -50
+~A y -50
+~A 'y -50
+~A :y -50
+F A -95
+F 'A -95
+F ^A -95
+F :A -95
+F `A -95
+F oA -95
+F ~A -95
+F , -42
+F . -42
+F u2026 -42
+L T -50
+L V -90
+L W -90
+L Y -90
+L 'Y -90
+L :Y -90
+L y -75
+L 'y -75
+L :y -75
+/L T -50
+/L V -90
+/L W -90
+/L Y -90
+/L 'Y -90
+/L :Y -90
+/L y -75
+/L 'y -75
+/L :y -75
+P A -100
+P 'A -100
+P ^A -100
+P :A -100
+P `A -100
+P oA -100
+P ~A -100
+P , -16
+P . -16
+P u2026 -16
+R T 16
+R V -26
+R W -20
+R Y -20
+R 'Y -20
+R :Y -20
+R y 31
+R 'y 31
+R :y 31
+T A -70
+T 'A -70
+T ^A -70
+T :A -70
+T `A -70
+T oA -70
+T ~A -70
+T a -40
+T 'a -40
+T ^a -40
+T :a -40
+T `a -40
+T oa -40
+T ~a -40
+T c -50
+T ,c -50
+T : -12
+T , 4
+T e -50
+T 'e -50
+T ^e -50
+T :e -50
+T `e -50
+T - -10
+T hy -10
+T i -5
+T 'i 10
+T ^i 10
+T :i 10
+T `i 10
+T o -50
+T 'o -50
+T ^o -50
+T :o -50
+T `o -50
+T /o -50
+T ~o -50
+T . 4
+T u2026 4
+T r -42
+T s -43
+T ; -12
+T u -56
+T 'u -56
+T ^u -56
+T :u -56
+T `u -56
+T w -15
+T y -12
+T 'y -12
+T :y -12
+V A -125
+V 'A -125
+V ^A -125
+V :A -125
+V `A -125
+V oA -125
+V ~A -125
+V a -80
+V 'a -80
+V ^a -80
+V :a -80
+V `a -80
+V oa -80
+V ~a -80
+V : -13
+V , -13
+V e -80
+V 'e -80
+V ^e -80
+V :e -80
+V `e -80
+V - -20
+V hy -20
+V i -9
+V 'i -9
+V o -80
+V 'o -80
+V ^o -80
+V :o -80
+V `o -80
+V /o -80
+V ~o -80
+V . -13
+V u2026 -13
+V r -40
+V ; -13
+V u -68
+V 'u -68
+V ^u -68
+V :u -68
+V `u -68
+V y -15
+V 'y -15
+V :y -15
+W A -94
+W 'A -94
+W ^A -94
+W :A -94
+W `A -94
+W oA -94
+W ~A -94
+W a -50
+W 'a -50
+W ^a -50
+W :a -50
+W `a -50
+W oa -50
+W ~a -50
+W : -12
+W , -12
+W e -50
+W 'e -50
+W ^e -50
+W :e -50
+W `e -50
+W - -10
+W hy -10
+W i -7
+W 'i 10
+W ^i 10
+W :i 10
+W `i 10
+W o -50
+W 'o -50
+W ^o -50
+W :o -50
+W `o -50
+W /o -50
+W ~o -50
+W . -12
+W u2026 -12
+W r -39
+W ; -12
+W u -40
+W 'u -40
+W ^u -40
+W :u -40
+W `u -40
+W y 1
+W 'y 1
+W :y 1
+Y A -138
+Y 'A -138
+Y ^A -138
+Y :A -138
+Y `A -138
+Y oA -138
+Y ~A -138
+Y a -100
+Y 'a -100
+Y ^a -100
+Y :a -100
+Y `a -100
+Y oa -100
+Y ~a -100
+Y : -8
+Y , -8
+Y e -100
+Y 'e -100
+Y ^e -100
+Y :e -100
+Y `e -100
+Y - -60
+Y hy -60
+Y i -5
+Y 'i -5
+Y ^i 10
+Y :i 10
+Y `i 10
+Y o -100
+Y 'o -100
+Y ^o -100
+Y :o -100
+Y `o -100
+Y /o -100
+Y ~o -100
+Y p -60
+Y . -8
+Y u2026 -8
+Y q -100
+Y ; -8
+Y u -82
+Y 'u -82
+Y ^u -82
+Y :u -82
+Y `u -82
+Y v -25
+'Y A -138
+'Y 'A -138
+'Y ^A -138
+'Y :A -138
+'Y `A -138
+'Y oA -138
+'Y ~A -138
+'Y a -100
+'Y 'a -100
+'Y ^a -100
+'Y :a -100
+'Y `a -100
+'Y oa -100
+'Y ~a -100
+'Y : -8
+'Y , -8
+'Y e -100
+'Y 'e -100
+'Y ^e -100
+'Y :e -100
+'Y `e -100
+'Y - -60
+'Y hy -60
+'Y i -5
+'Y 'i -5
+'Y ^i 10
+'Y :i 10
+'Y `i 10
+'Y o -100
+'Y 'o -100
+'Y ^o -100
+'Y :o -100
+'Y `o -100
+'Y /o -100
+'Y ~o -100
+'Y p -60
+'Y . -8
+'Y u2026 -8
+'Y q -100
+'Y ; -8
+'Y u -82
+'Y 'u -82
+'Y ^u -82
+'Y :u -82
+'Y `u -82
+'Y v -25
+:Y A -138
+:Y 'A -138
+:Y ^A -138
+:Y :A -138
+:Y `A -138
+:Y oA -138
+:Y ~A -138
+:Y a -100
+:Y 'a -100
+:Y ^a -100
+:Y :a -100
+:Y `a -100
+:Y oa -100
+:Y ~a -100
+:Y : -8
+:Y , -8
+:Y e -100
+:Y 'e -100
+:Y ^e -100
+:Y :e -100
+:Y `e -100
+:Y - -60
+:Y hy -60
+:Y i -5
+:Y 'i -5
+:Y ^i 10
+:Y :i 10
+:Y `i 10
+:Y o -100
+:Y 'o -100
+:Y ^o -100
+:Y :o -100
+:Y `o -100
+:Y /o -100
+:Y ~o -100
+:Y p -60
+:Y . -8
+:Y u2026 -8
+:Y q -100
+:Y ; -8
+:Y u -82
+:Y 'u -82
+:Y ^u -82
+:Y :u -82
+:Y `u -82
+:Y v -25
+f f 38
+r c -27
+r ,c -27
+r , 9
+r d -8
+r e -8
+r 'e -8
+r ^e -8
+r :e -8
+r `e -8
+r f 38
+r g -8
+r - -10
+r hy -10
+r m 5
+r n 5
+r ~n 5
+r o -18
+r 'o -18
+r ^o -18
+r :o -18
+r `o -18
+r /o -18
+r ~o -18
+r . 9
+r u2026 9
+r q -18
+
+charset
+ha 600,740,0,47,-92,47 2 0 asciicircum
+ti 600,347,0,30,-64,30 0 1 asciitilde
+vS 520,944,15,165,2,82 2 2 Scaron
+vZ 500,944,0,200,31,82 2 3 Zcaron
+vs 440,774,18,174,1,82 2 4 scaron
+vz 460,774,0,169,30,82 2 5 zcaron
+:Y 620,939,0,190,-85,82 2 6 Ydieresis
+tm 1000,740,0,9,-80,9 2 7 trademark
+aq 220,740,0,145,-102,82 2 8 quotesingle
+Eu 560,755,15,172,3,82 2 9 Euro
+space 280 0 32 space
+! 280,740,0,114,-23,82 2 33 exclam
+" 360,740,0,169,-77,82 2 34 quotedbl
+dq "
+# 560,700,0,109,-15,82 0 35 numbersign
+sh "
+$ 560,857,86,72,-49,72 2 36 dollar
+Do "
+% 860,755,15,46,-89,46 2 37 percent
+& 680,755,15,112,-20,82 2 38 ampersand
+' 280,740,0,113,-109,82 2 39 quoteright
+cq "
+( 380,754,157,160,-69,82 2 40 parenleft
+) 380,754,157,48,43,48 2 41 parenright
+* 440,755,0,103,-123,82 2 42 asterisk
++ 600,506,0,61,-33,61 0 43 plus
+, 280,133,141,1,3,1 0 44 comma
+- 420,348,0,44,-63,44 0 45 hyphen
+hy "
+. 280,133,0,1,-23,1 0 46 period
+/ 460,740,100,182,63,82 2 47 slash
+sl "
+0 560,755,15,118,-19,82 2 48 zero
+1 560,740,0,0,-180 2 49 one
+2 560,755,0,112,6,82 2 50 two
+3 560,755,15,76,-17,76 2 51 three
+4 560,740,0,95,15,82 2 52 four
+5 560,740,15,91,-13,82 2 53 five
+6 560,739,15,78,-14,78 2 54 six
+7 560,740,0,126,-33,82 2 55 seven
+8 560,755,15,80,-20,80 2 56 eight
+9 560,754,0,123,-59,82 2 57 nine
+: 280,555,0,79,-23,79 0 58 colon
+; 280,555,141,79,3,79 0 59 semicolon
+< 600,514,8,100,-34,82 0 60 less
+= 600,425,0,81,-13,81 0 61 equal
+> 600,514,8,60,6,60 0 62 greater
+? 560,755,0,84,-85,82 2 63 question
+@ 740,712,12,142,-58,82 0 64 at
+at "
+A 740,740,0,42,43,42 2 65 A
+B 580,740,0,81,-20,81 2 66 B
+C 780,755,15,135,-46,82 2 67 C
+D 700,740,0,82,-13,82 2 68 D
+E 520,740,0,127,-11,82 2 69 E
+F 480,740,0,146,-11,82 2 70 F
+G 840,755,15,97,-39,82 2 71 G
+H 680,740,0,118,-21,82 2 72 H
+I 280,740,0,117,-22,82 2 73 I
+J 480,740,15,117,16,82 2 74 J
+K 620,740,0,188,-39,82 2 75 K
+L 440,740,0,69,-22,69 2 76 L
+M 900,740,0,125,-13,82 2 77 M
+N 740,740,0,119,-20,82 2 78 N
+O 840,755,15,92,-44,82 2 79 O
+P 560,740,0,135,-22,82 2 80 P
+Q 840,755,15,92,-43,82 2 81 Q
+R 580,740,0,127,-14,82 2 82 R
+S 520,755,15,109,2,82 2 83 S
+T 420,740,0,186,-69,82 2 84 T
+U 640,740,15,133,-46,82 2 85 U
+V 700,740,0,183,-95,82 2 86 V
+W 900,740,0,187,-94,82 2 87 W
+X 680,740,0,184,46,82 2 88 X
+Y 620,740,0,190,-85,82 2 89 Y
+Z 500,740,0,150,31,82 2 90 Z
+[ 320,754,157,154,-38,82 2 91 bracketleft
+lB "
+\ 640,740,100,0,-183 2 92 backslash
+rs "
+] 320,754,157,72,44,72 2 93 bracketright
+rB "
+^ 540,774,0,98,-138,82 2 94 circumflex
+a^ "
+_ 500,0,125,37,74,37 0 95 underscore
+` 280,740,0,112,-108,82 2 96 quoteleft
+oq "
+a 660,574,18,106,-22,82 0 97 a
+b 660,740,18,79,3,79 2 98 b
+c 640,574,18,89,-33,82 0 99 c
+d 660,740,18,146,-29,82 2 100 d
+e 640,574,18,78,-26,78 0 101 e
+f 280,755,0,190,-12,82 2 102 f
+g 660,574,226,116,17,82 1 103 g
+h 600,740,0,64,-4,64 2 104 h
+i 240,740,0,134,-3,82 2 105 i
+j 260,740,185,133,69,82 3 106 j
+k 580,740,0,118,-30,82 2 107 k
+l 240,740,0,135,-4,82 2 108 l
+m 940,574,0,65,-4,65 0 109 m
+n 600,574,0,64,-4,64 0 110 n
+o 640,574,18,82,-21,82 0 111 o
+p 660,574,185,77,38,77 1 112 p
+q 660,574,185,106,-28,82 1 113 q
+r 320,574,0,154,-13,82 0 114 r
+s 440,574,18,93,1,82 0 115 s
+t 300,740,0,152,-36,82 2 116 t
+u 600,555,18,97,-36,82 0 117 u
+v 560,555,0,149,-55,82 0 118 v
+w 800,555,0,142,-63,82 0 119 w
+x 560,555,0,122,47,82 0 120 x
+y 580,555,185,144,-24,82 1 121 y
+z 460,555,0,118,30,82 0 122 z
+{ 340,747,191,166,10,82 3 123 braceleft
+lC "
+| 600,750,250,0,-136 3 124 bar
+ba "
+} 340,747,191,115,63,82 3 125 braceright
+rC "
+~ 480,767,0,134,-128,82 2 126 tilde
+a~ "
+bq 280,133,141,0,4 0 128 quotesinglbase
+Fo 460,469,0,77,-55,77 0 129 guillemotleft
+Fc 460,469,0,54,-31,54 0 130 guillemotright
+bu 600,532,0,0,-165 0 131 bullet
+Fn 560,824,151,155,77,82 2 132 florin
+f/ 160,740,0,310,173,82 2 133 fraction
+%0 1280,755,15,26,-89,26 2 134 perthousand
+dg 560,740,142,102,-82,82 2 135 dagger
+dd 560,740,142,108,-13,82 2 136 daggerdbl
+en 500,348,0,80,-27,80 0 137 endash
+em 1000,348,0,80,-27,80 0 138 emdash
+fi 520,755,0,129,-22,82 2 140 fi
+fl 520,755,0,129,-22,82 2 141 fl
+.i 240,555,0,99,-3,82 0 144 dotlessi
+ga 420,851,0,92,-138,82 2 146 grave
+a" 700,849,0,117,-197,82 2 147 hungarumlaut
+a. 280,769,0,120,-141,82 2 148 dotaccent
+ab 480,770,0,152,-134,82 2 149 breve
+ah 540,774,0,124,-164,82 2 150 caron
+ao 360,834,0,115,-155,82 2 151 ring
+ho 340,9,195,0,-9 1 152 ogonek
+lq 480,740,0,117,-106,82 2 153 quotedblleft
+rq 480,740,0,118,-107,82 2 154 quotedblright
+oe 1080,574,18,79,-26,79 0 155 oe
+/l 320,740,0,135,-24,82 2 156 lslash
+Bq 480,133,141,5,6,5 0 157 quotedblbase
+OE 1060,755,15,135,-48,82 2 158 OE
+/L 480,740,0,54,-17,54 2 159 Lslash
+r! 280,555,185,80,11,80 1 161 exclamdown
+ct 560,715,0,90,-60,82 0 162 cent
+Po 560,755,0,106,12,82 2 163 sterling
+Cs 560,577,0,118,-2,82 0 164 currency
+Ye 560,740,0,198,-33,82 2 165 yen
+bb 600,675,175,0,-150 0 166 brokenbar
+sc 560,755,158,92,-15,82 2 167 section
+ad 500,769,0,115,-145,82 2 168 dieresis
+co 740,752,12,138,0,82 2 169 copyright
+Of 360,755,0,163,-76,82 2 170 ordfeminine
+fo 240,469,0,87,-44,82 0 171 guilsinglleft
+tno 600,425,0,81,-54,81 0 172 logicalnot
+\- 600,313,0,61,-33,61 0 173 minus
+rg 740,752,12,138,0,82 2 174 registered
+a- 420,759,0,120,-142,82 2 175 macron
+de 400,712,0,101,-109,82 0 176 degree
+t+- 600,556,62,77,14,77 0 177 plusminus
+S2 336,749,0,150,-22,82 2 178 twosuperior
+S3 336,749,0,128,-37,82 2 179 threesuperior
+aa 420,851,0,137,-171,82 2 180 acute
+*m 600,555,192,97,36,82 1 181 mu
+mc "
+ps 600,740,103,195,-39,82 2 182 paragraph
+pc 280,320,0,36,-57,36 0 183 periodcentered
+ac 340,6,251,0,-16 1 184 cedilla
+S1 336,740,0,75,-131,75 2 185 onesuperior
+Om 360,755,0,142,-80,82 2 186 ordmasculine
+fc 240,469,0,64,-20,64 0 187 guilsinglright
+14 840,740,0,0,-137 2 188 onequarter
+12 840,740,0,41,-107,41 2 189 onehalf
+34 840,749,0,47,-47,47 2 190 threequarters
+r? 560,555,200,17,-18,17 1 191 questiondown
+`A 740,1021,0,42,43,42 2 192 Agrave
+'A 740,1021,0,42,43,42 2 193 Aacute
+^A 740,944,0,42,43,42 2 194 Acircumflex
+~A 740,937,0,42,43,42 2 195 Atilde
+:A 740,939,0,42,43,42 2 196 Adieresis
+oA 740,969,0,42,43,42 2 197 Aring
+AE 900,740,0,112,55,82 2 198 AE
+,C 780,755,251,135,-46,82 3 199 Ccedilla
+`E 520,1021,0,127,-11,82 2 200 Egrave
+'E 520,1021,0,127,-11,82 2 201 Eacute
+^E 520,944,0,140,-11,82 2 202 Ecircumflex
+:E 520,939,0,137,-11,82 2 203 Edieresis
+`I 280,1021,0,169,-22,82 2 204 Igrave
+'I 280,1021,0,264,-22,82 2 205 Iacute
+^I 280,944,0,260,-22,82 2 206 Icircumflex
+:I 280,939,0,257,-22,82 2 207 Idieresis
+-D 742,740,0,74,-32,74 2 208 Eth
+~N 740,937,0,119,-20,82 2 209 Ntilde
+`O 840,1021,15,92,-44,82 2 210 Ograve
+'O 840,1021,15,92,-44,82 2 211 Oacute
+^O 840,944,15,92,-44,82 2 212 Ocircumflex
+~O 840,937,15,92,-44,82 2 213 Otilde
+:O 840,939,15,92,-44,82 2 214 Odieresis
+tmu 600,494,0,68,-26,68 0 215 multiply
+/O 840,814,71,101,-43,82 2 216 Oslash
+`U 640,1021,15,133,-46,82 2 217 Ugrave
+'U 640,1021,15,133,-46,82 2 218 Uacute
+^U 640,944,15,133,-46,82 2 219 Ucircumflex
+:U 640,939,15,133,-46,82 2 220 Udieresis
+'Y 620,1021,0,190,-85,82 2 221 Yacute
+TP 560,740,0,109,-22,82 2 222 Thorn
+ss 600,755,18,79,-1,79 2 223 germandbls
+`a 660,851,18,106,-22,82 2 224 agrave
+'a 660,851,18,106,-22,82 2 225 aacute
+^a 660,774,18,106,-22,82 2 226 acircumflex
+~a 660,767,18,106,-22,82 2 227 atilde
+:a 660,769,18,106,-22,82 2 228 adieresis
+oa 660,834,18,106,-22,82 2 229 aring
+ae 1080,574,18,76,-25,76 0 230 ae
+,c 640,574,251,89,-33,82 1 231 ccedilla
+`e 640,851,18,78,-26,78 2 232 egrave
+'e 640,851,18,78,-26,78 2 233 eacute
+^e 640,774,18,78,-26,78 2 234 ecircumflex
+:e 640,769,18,78,-26,78 2 235 edieresis
+`i 240,851,0,157,-3,82 2 236 igrave
+'i 240,851,0,252,-3,82 2 237 iacute
+^i 240,774,0,248,12,82 2 238 icircumflex
+:i 240,769,0,245,-3,82 2 239 idieresis
+Sd 640,754,18,109,-23,82 2 240 eth
+~n 600,767,0,74,-4,74 2 241 ntilde
+`o 640,851,18,82,-21,82 2 242 ograve
+'o 640,851,18,82,-21,82 2 243 oacute
+^o 640,774,18,82,-21,82 2 244 ocircumflex
+~o 640,767,18,82,-21,82 2 245 otilde
+:o 640,769,18,82,-21,82 2 246 odieresis
+tdi 600,526,20,61,-33,61 0 247 divide
+/o 660,608,50,75,-31,75 0 248 oslash
+`u 600,851,18,97,-36,82 2 249 ugrave
+'u 600,851,18,97,-36,82 2 250 uacute
+^u 600,774,18,97,-36,82 2 251 ucircumflex
+:u 600,769,18,97,-36,82 2 252 udieresis
+'y 580,851,185,144,-24,82 3 253 yacute
+Tp 660,740,185,77,38,77 3 254 thorn
+:y 580,769,185,144,-24,82 3 255 ydieresis
+u2026 1000,133,0,0,-50 0 256 ellipsis
diff --git a/font/devps/AI b/font/devps/AI
new file mode 100644
index 0000000..8c07ed2
--- /dev/null
+++ b/font/devps/AI
@@ -0,0 +1,688 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName ITC Avant Garde Gothic Book Oblique
+# Version 003.001
+# FamilyName ITC Avant Garde Gothic
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1991, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.ITC Avant Garde Gothic is a registered trademark of International Typeface Corporation.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1991, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:40:18 1999
+# Comment UniqueID 44725
+# Comment VMusage 9065 45991
+
+name AI
+internalname AvantGarde-BookOblique
+slant 10.5
+spacewidth 277
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A T -81
+A V -122
+A W -95
+A Y -122
+A 'Y -122
+A :Y -122
+A v -73
+A w -65
+A y -72
+A 'y -72
+A :y -72
+'A T -81
+'A V -122
+'A W -95
+'A Y -122
+'A 'Y -122
+'A :Y -122
+'A v -73
+'A w -65
+'A y -72
+'A 'y -72
+'A :y -72
+^A T -81
+^A V -122
+^A W -95
+^A Y -122
+^A 'Y -122
+^A :Y -122
+^A v -73
+^A w -65
+^A y -72
+^A 'y -72
+^A :y -72
+:A T -81
+:A V -122
+:A W -95
+:A Y -122
+:A 'Y -122
+:A :Y -122
+:A v -73
+:A w -65
+:A y -72
+:A 'y -72
+:A :y -72
+`A T -81
+`A V -122
+`A W -95
+`A Y -122
+`A 'Y -122
+`A :Y -122
+`A v -73
+`A w -65
+`A y -72
+`A 'y -72
+`A :y -72
+oA T -81
+oA V -122
+oA W -95
+oA Y -122
+oA 'Y -122
+oA :Y -122
+oA v -73
+oA w -65
+oA y -72
+oA 'y -72
+oA :y -72
+~A T -81
+~A V -122
+~A W -95
+~A Y -122
+~A 'Y -122
+~A :Y -122
+~A v -73
+~A w -65
+~A y -72
+~A 'y -72
+~A :y -72
+F A -60
+F 'A -60
+F ^A -60
+F :A -60
+F `A -60
+F oA -60
+F ~A -60
+F , -122
+F . -79
+F u2026 -79
+L T -46
+L V -113
+L W -67
+L Y -91
+L 'Y -91
+L :Y -91
+L y -23
+L 'y -23
+L :y -23
+/L T -46
+/L V -113
+/L W -67
+/L Y -91
+/L 'Y -91
+/L :Y -91
+/L y -23
+/L 'y -23
+/L :y -23
+P A -74
+P 'A -74
+P ^A -74
+P :A -74
+P `A -74
+P oA -74
+P ~A -74
+P , -123
+P . -91
+P u2026 -91
+R T 6
+R V -39
+R W 2
+R Y -20
+R 'Y -20
+R :Y -20
+R y 32
+R 'y 32
+R :y 32
+T A -81
+T 'A -81
+T ^A -81
+T :A -81
+T `A -81
+T oA -81
+T ~A -81
+T a -52
+T 'a -52
+T ^a -52
+T :a -52
+T `a -52
+T oa -52
+T ~a -52
+T c -51
+T ,c -51
+T : 3
+T , -102
+T e -49
+T 'e -49
+T ^e -49
+T :e -49
+T `e -49
+T i 31
+T 'i 31
+T ^i 31
+T :i 31
+T `i 31
+T o -49
+T 'o -49
+T ^o -49
+T :o -49
+T `o -49
+T /o -49
+T ~o -49
+T . -71
+T u2026 -71
+T r -30
+T s -23
+T ; -29
+T u -46
+T 'u -46
+T ^u -46
+T :u -46
+T `u -46
+T w 7
+T y 5
+T 'y 5
+T :y 5
+V A -122
+V 'A -122
+V ^A -122
+V :A -122
+V `A -122
+V oA -122
+V ~A -122
+V a -104
+V 'a -104
+V ^a -104
+V :a -104
+V `a -104
+V oa -104
+V ~a -104
+V : -1
+V , -106
+V e -101
+V 'e -101
+V ^e -101
+V :e -101
+V `e -101
+V i 5
+V 'i 5
+V o -101
+V 'o -101
+V ^o -101
+V :o -101
+V `o -101
+V /o -101
+V ~o -101
+V . -75
+V u2026 -75
+V r -40
+V ; -33
+V u -40
+V 'u -40
+V ^u -40
+V :u -40
+V `u -40
+V y -25
+V 'y -25
+V :y -25
+W A -73
+W 'A -73
+W ^A -73
+W :A -73
+W `A -73
+W oA -73
+W ~A -73
+W a -50
+W 'a -50
+W ^a -50
+W :a -50
+W `a -50
+W oa -50
+W ~a -50
+W : -1
+W , -106
+W e -47
+W 'e -47
+W ^e -47
+W :e -47
+W `e -47
+W i 6
+W 'i 6
+W ^i 16
+W :i 16
+W `i 16
+W o -46
+W 'o -46
+W ^o -46
+W :o -46
+W `o -46
+W /o -46
+W ~o -46
+W . -74
+W u2026 -74
+W r -29
+W ; -33
+W u -30
+W 'u -30
+W ^u -30
+W :u -30
+W `u -30
+W y -2
+W 'y -2
+W :y -2
+Y A -122
+Y 'A -122
+Y ^A -122
+Y :A -122
+Y `A -122
+Y oA -122
+Y ~A -122
+Y a -93
+Y 'a -93
+Y ^a -93
+Y :a -93
+Y `a -93
+Y oa -93
+Y ~a -93
+Y : 9
+Y , -97
+Y e -89
+Y 'e -89
+Y ^e -89
+Y :e -89
+Y `e -89
+Y i 13
+Y 'i 13
+Y ^i 23
+Y :i 23
+Y `i 23
+Y o -89
+Y 'o -89
+Y ^o -89
+Y :o -89
+Y `o -89
+Y /o -89
+Y ~o -89
+Y p -67
+Y . -65
+Y u2026 -65
+Y q -93
+Y ; -23
+Y u -69
+Y 'u -69
+Y ^u -69
+Y :u -69
+Y `u -69
+Y v -17
+'Y A -122
+'Y 'A -122
+'Y ^A -122
+'Y :A -122
+'Y `A -122
+'Y oA -122
+'Y ~A -122
+'Y a -93
+'Y 'a -93
+'Y ^a -93
+'Y :a -93
+'Y `a -93
+'Y oa -93
+'Y ~a -93
+'Y : 9
+'Y , -97
+'Y e -89
+'Y 'e -89
+'Y ^e -89
+'Y :e -89
+'Y `e -89
+'Y i 13
+'Y 'i 13
+'Y ^i 23
+'Y :i 23
+'Y `i 23
+'Y o -89
+'Y 'o -89
+'Y ^o -89
+'Y :o -89
+'Y `o -89
+'Y /o -89
+'Y ~o -89
+'Y p -67
+'Y . -65
+'Y u2026 -65
+'Y q -93
+'Y ; -23
+'Y u -69
+'Y 'u -69
+'Y ^u -69
+'Y :u -69
+'Y `u -69
+'Y v -17
+:Y A -122
+:Y 'A -122
+:Y ^A -122
+:Y :A -122
+:Y `A -122
+:Y oA -122
+:Y ~A -122
+:Y a -93
+:Y 'a -93
+:Y ^a -93
+:Y :a -93
+:Y `a -93
+:Y oa -93
+:Y ~a -93
+:Y : 9
+:Y , -97
+:Y e -89
+:Y 'e -89
+:Y ^e -89
+:Y :e -89
+:Y `e -89
+:Y i 13
+:Y 'i 13
+:Y ^i 23
+:Y :i 23
+:Y `i 23
+:Y o -89
+:Y 'o -89
+:Y ^o -89
+:Y :o -89
+:Y `o -89
+:Y /o -89
+:Y ~o -89
+:Y p -67
+:Y . -65
+:Y u2026 -65
+:Y q -93
+:Y ; -23
+:Y u -69
+:Y 'u -69
+:Y ^u -69
+:Y :u -69
+:Y `u -69
+:Y v -17
+f f 3
+r c -7
+r ,c -7
+r , -105
+r d -6
+r e -4
+r 'e -4
+r ^e -4
+r :e -4
+r `e -4
+r f 48
+r g 1
+r h 29
+r m 28
+r n 21
+r ~n 21
+r o -4
+r 'o -4
+r ^o -4
+r :o -4
+r `o -4
+r /o -4
+r ~o -4
+r . -73
+r u2026 -73
+r q -8
+
+charset
+ha 606,740,0,54,-59,54 2 0 asciicircum
+ti 606,319,0,28,-64,28 0 1 asciitilde
+vS 498,927,13,145,-6,81 2 2 Scaron
+vZ 480,927,0,167,38,81 2 3 Zcaron
+vs 388,764,13,170,1,81 2 4 scaron
+vz 425,764,0,152,40,81 2 5 zcaron
+:Y 592,928,0,188,-88,81 2 6 Ydieresis
+tm 1000,740,0,4,-87,4 2 7 trademark
+aq 198,740,0,130,-103,81 2 8 quotesingle
+Eu 554,753,13,177,-8,81 2 9 Euro
+space 277 0 32 space
+! 295,740,0,78,-61,78 2 33 exclam
+" 309,740,0,152,-80,81 2 34 quotedbl
+dq "
+# 554,740,0,116,-21,81 2 35 numbersign
+sh "
+$ 554,811,70,78,-56,78 2 36 dollar
+Do "
+% 775,751,13,62,-74,62 2 37 percent
+& 757,753,12,69,-42,69 2 38 ampersand
+' 351,740,0,93,-145,81 2 39 quoteright
+cq "
+( 369,757,205,177,-39,81 3 40 parenleft
+) 369,757,205,64,74,64 3 41 parenright
+* 425,740,0,105,-120,81 2 42 asterisk
++ 606,506,0,53,-41,53 0 43 plus
+, 277,126,67,0,49 0 44 comma
+- 332,315,0,79,-25,79 0 45 hyphen
+hy "
+. 277,126,0,0,-52 0 46 period
+/ 437,740,100,154,25,81 2 47 slash
+sl "
+0 554,753,13,118,-20,81 2 48 zero
+1 554,740,0,0,-209 2 49 one
+2 554,753,0,112,10,81 2 50 two
+3 554,753,13,61,-23,61 2 51 three
+4 554,740,0,95,11,81 2 52 four
+5 554,740,13,102,-18,81 2 53 five
+6 554,739,13,77,-15,77 2 54 six
+7 554,740,0,125,-60,81 2 55 seven
+8 554,753,13,76,-27,76 2 56 eight
+9 554,752,0,122,-60,81 2 57 nine
+: 277,548,0,51,-52,51 0 58 colon
+; 277,548,67,51,49,51 0 59 semicolon
+< 606,514,8,94,-37,81 0 60 less
+= 606,388,0,71,-22,71 0 61 equal
+> 606,514,8,57,0,57 0 62 greater
+? 591,752,0,88,-108,81 2 63 question
+@ 867,753,13,72,-76,72 2 64 at
+at "
+A 740,740,0,39,38,39 2 65 A
+B 574,740,0,82,-24,81 2 66 B
+C 813,752,13,107,-54,81 2 67 C
+D 744,740,0,80,-24,80 2 68 D
+E 536,740,0,127,-20,81 2 69 E
+F 485,740,0,147,-20,81 2 70 F
+G 872,753,13,70,-52,70 2 71 G
+H 683,740,0,112,-26,81 2 72 H
+I 226,740,0,112,-26,81 2 73 I
+J 482,740,13,108,14,81 2 74 J
+K 591,740,0,188,-31,81 2 75 K
+L 462,740,0,63,-32,63 2 76 L
+M 919,740,0,112,-26,81 2 77 M
+N 740,740,0,112,-25,81 2 78 N
+O 869,753,13,82,-54,81 2 79 O
+P 592,740,0,123,-25,81 2 80 P
+Q 871,753,13,91,-51,81 2 81 Q
+R 607,740,0,113,-20,81 2 82 R
+S 498,753,13,113,-6,81 2 83 S
+T 426,740,0,181,-80,81 2 84 T
+U 655,740,13,112,-68,81 2 85 U
+V 702,740,0,179,-95,81 2 86 V
+W 960,740,0,178,-98,81 2 87 W
+X 609,740,0,166,42,81 2 88 X
+Y 592,740,0,188,-88,81 2 89 Y
+Z 480,740,0,167,38,81 2 90 Z
+[ 351,753,179,176,-94,81 2 91 bracketleft
+lB "
+\ 605,740,100,0,-205 2 92 backslash
+rs "
+] 351,753,179,12,70,12 2 93 bracketright
+rB "
+^ 502,764,0,95,-142,81 2 94 circumflex
+a^ "
+_ 500,0,125,37,74,37 0 95 underscore
+` 351,740,0,58,-182,58 2 96 quoteleft
+oq "
+a 683,561,13,90,-37,81 0 97 a
+b 682,740,13,71,-18,71 2 98 b
+c 647,561,13,81,-36,81 0 99 c
+d 685,740,13,121,-34,81 2 100 d
+e 650,561,13,64,-33,64 0 101 e
+f 314,753,0,190,-54,81 2 102 f
+g 673,561,215,85,-6,81 1 103 g
+h 610,740,0,46,-12,46 2 104 h
+i 200,740,0,123,-15,81 2 105 i
+j 203,740,192,122,130,81 3 106 j
+k 502,740,0,137,-20,81 2 107 k
+l 200,740,0,123,-15,81 2 108 l
+m 938,561,0,50,-16,50 0 109 m
+n 610,561,0,49,-15,49 0 110 n
+o 655,561,13,65,-37,65 0 111 o
+p 682,561,192,67,22,67 1 112 p
+q 682,561,192,86,-32,81 1 113 q
+r 301,561,0,144,-15,81 0 114 r
+s 388,561,13,87,1,81 0 115 s
+t 339,740,0,143,-53,81 2 116 t
+u 608,547,13,85,-49,81 0 117 u
+v 554,547,0,144,-58,81 0 118 v
+w 831,547,0,141,-64,81 0 119 w
+x 480,547,0,140,38,81 0 120 x
+y 536,547,192,139,-47,81 1 121 y
+z 425,547,0,124,40,81 0 122 z
+{ 351,740,189,168,-65,81 2 123 braceleft
+lC "
+| 672,778,222,0,-207 3 124 bar
+ba "
+} 351,740,189,37,66,37 2 125 braceright
+rC "
+~ 439,754,0,131,-128,81 2 126 tilde
+a~ "
+bq 354,126,68,0,-26 0 128 quotesinglbase
+Fo 425,481,0,95,-42,81 0 129 guillemotleft
+Fc 425,481,0,63,-10,63 0 130 guillemotright
+bu 606,532,0,0,-167 0 131 bullet
+Fn 554,818,153,166,90,81 2 132 florin
+f/ 166,740,0,302,163,81 2 133 fraction
+%0 1174,751,13,58,-78,58 2 134 perthousand
+dg 553,740,133,90,-96,81 2 135 dagger
+dd 553,740,133,90,-21,81 2 136 daggerdbl
+en 500,315,0,74,-30,74 0 137 endash
+em 1000,315,0,74,-30,74 0 138 emdash
+fi 487,753,0,123,-54,81 2 140 fi
+fl 485,753,0,123,-54,81 2 141 fl
+.i 200,547,0,87,-15,81 0 144 dotlessi
+ga 378,786,0,98,-153,81 2 146 grave
+a" 552,786,0,122,-179,81 2 147 hungarumlaut
+a. 222,765,0,118,-142,81 2 148 dotaccent
+ab 453,754,0,138,-141,81 2 149 breve
+ah 502,764,0,113,-159,81 2 150 caron
+ao 332,807,0,120,-140,81 2 151 ring
+ho 302,0,191,0,-2 1 152 ogonek
+lq 502,740,0,56,-184,56 2 153 quotedblleft
+rq 484,740,0,109,-147,81 2 154 quotedblright
+oe 1137,561,13,73,-29,73 0 155 oe
+/l 300,740,0,104,-45,81 2 156 lslash
+Bq 502,126,68,0,-26 0 157 quotedblbase
+OE 1194,753,13,136,-56,81 2 158 OE
+/L 517,740,0,63,-56,63 2 159 Lslash
+r! 295,548,192,41,-24,41 1 161 exclamdown
+ct 554,707,0,92,-64,81 0 162 cent
+Po 554,753,0,110,21,81 2 163 sterling
+Cs 554,580,0,142,27,81 0 164 currency
+Ye 554,740,0,184,-25,81 2 165 yen
+bb 672,703,147,0,-221 0 166 brokenbar
+sc 615,753,141,33,-67,33 2 167 section
+ad 369,765,0,118,-141,81 2 168 dieresis
+co 747,752,12,134,-3,81 2 169 copyright
+Of 369,753,0,176,-51,81 2 170 ordfeminine
+fo 251,481,0,95,-42,81 0 171 guilsinglleft
+tno 606,388,0,71,-60,71 0 172 logicalnot
+\- 606,287,0,53,-41,53 0 173 minus
+rg 747,752,12,134,-3,81 2 174 registered
+a- 485,736,0,113,-146,81 0 175 macron
+de 400,709,0,102,-108,81 0 176 degree
+t+- 606,518,24,63,4,63 0 177 plusminus
+S2 332,747,0,152,-23,81 2 178 twosuperior
+S3 332,747,0,126,-47,81 2 179 threesuperior
+aa 375,786,0,119,-153,81 2 180 acute
+*m 608,547,192,85,24,81 1 181 mu
+mc "
+ps 564,740,110,175,-68,81 2 182 paragraph
+pc 277,316,0,8,-87,8 0 183 periodcentered
+ac 324,3,222,0,-2 1 184 cedilla
+S1 332,740,0,54,-140,54 2 185 onesuperior
+Om 369,753,0,148,-66,81 2 186 ordmasculine
+fc 251,481,0,63,-10,63 0 187 guilsinglright
+14 831,740,0,0,-133 2 188 onequarter
+12 831,740,0,30,-114,30 2 189 onehalf
+34 831,747,0,45,-75,45 2 190 threequarters
+r? 591,548,205,0,-14 1 191 questiondown
+`A 740,949,0,39,38,39 2 192 Agrave
+'A 740,949,0,39,38,39 2 193 Aacute
+^A 740,927,0,39,38,39 2 194 Acircumflex
+~A 740,917,0,39,38,39 2 195 Atilde
+:A 740,928,0,39,38,39 2 196 Adieresis
+oA 740,955,0,39,38,39 2 197 Aring
+AE 992,740,0,103,70,81 2 198 AE
+,C 813,752,222,107,-54,81 3 199 Ccedilla
+`E 536,949,0,127,-20,81 2 200 Egrave
+'E 536,949,0,127,-20,81 2 201 Eacute
+^E 536,927,0,127,-20,81 2 202 Ecircumflex
+:E 536,928,0,127,-20,81 2 203 Edieresis
+`I 226,949,0,164,-26,81 2 204 Igrave
+'I 226,949,0,263,-26,81 2 205 Iacute
+^I 226,927,0,263,-26,81 2 206 Icircumflex
+:I 226,928,0,220,-26,81 2 207 Idieresis
+-D 790,740,0,73,-54,73 2 208 Eth
+~N 740,917,0,112,-25,81 2 209 Ntilde
+`O 869,949,13,82,-54,81 2 210 Ograve
+'O 869,949,13,82,-54,81 2 211 Oacute
+^O 869,927,13,82,-54,81 2 212 Ocircumflex
+~O 869,917,13,82,-54,81 2 213 Otilde
+:O 869,928,13,82,-54,81 2 214 Odieresis
+tmu 606,482,0,57,-37,57 0 215 multiply
+/O 868,819,83,112,-26,81 2 216 Oslash
+`U 655,949,13,112,-68,81 2 217 Ugrave
+'U 655,949,13,112,-68,81 2 218 Uacute
+^U 655,927,13,112,-68,81 2 219 Ucircumflex
+:U 655,928,13,112,-68,81 2 220 Udieresis
+'Y 592,949,0,188,-88,81 2 221 Yacute
+TP 592,740,0,80,-10,80 2 222 Thorn
+ss 554,753,13,75,-11,75 2 223 germandbls
+`a 683,786,13,90,-37,81 2 224 agrave
+'a 683,786,13,90,-37,81 2 225 aacute
+^a 683,764,13,90,-37,81 2 226 acircumflex
+~a 683,754,13,90,-37,81 2 227 atilde
+:a 683,765,13,90,-37,81 2 228 adieresis
+oa 683,807,13,90,-37,81 2 229 aring
+ae 1157,561,13,63,-30,63 0 230 ae
+,c 647,561,222,81,-36,81 1 231 ccedilla
+`e 650,786,13,64,-33,64 2 232 egrave
+'e 650,786,13,64,-33,64 2 233 eacute
+^e 650,764,13,64,-33,64 2 234 ecircumflex
+:e 650,765,13,64,-33,64 2 235 edieresis
+`i 200,786,0,147,-15,81 2 236 igrave
+'i 200,786,0,246,-15,81 2 237 iacute
+^i 200,764,0,246,9,81 2 238 icircumflex
+:i 200,765,0,203,-15,81 2 239 idieresis
+Sd 655,753,12,70,-38,70 2 240 eth
+~n 610,754,0,49,-15,49 2 241 ntilde
+`o 655,786,13,65,-37,65 2 242 ograve
+'o 655,786,13,65,-37,65 2 243 oacute
+^o 655,764,13,65,-37,65 2 244 ocircumflex
+~o 655,754,13,65,-37,65 2 245 otilde
+:o 655,765,13,65,-37,65 2 246 odieresis
+tdi 606,519,13,53,-41,53 0 247 divide
+/o 653,614,64,101,-1,81 0 248 oslash
+`u 608,786,13,85,-49,81 2 249 ugrave
+'u 608,786,13,85,-49,81 2 250 uacute
+^u 608,764,13,85,-49,81 2 251 ucircumflex
+:u 608,765,13,85,-49,81 2 252 udieresis
+'y 536,786,192,139,-47,81 3 253 yacute
+Tp 682,740,192,67,22,67 3 254 thorn
+:y 536,765,192,139,-47,81 3 255 ydieresis
+u2026 1000,126,0,0,-80 0 256 ellipsis
diff --git a/font/devps/AR b/font/devps/AR
new file mode 100644
index 0000000..2baf617
--- /dev/null
+++ b/font/devps/AR
@@ -0,0 +1,687 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName ITC Avant Garde Gothic Book
+# Version 003.001
+# FamilyName ITC Avant Garde Gothic
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1991, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.ITC Avant Garde Gothic is a registered trademark of International Typeface Corporation.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1991, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:39:30 1999
+# Comment UniqueID 44724
+# Comment VMusage 26533 33469
+
+name AR
+internalname AvantGarde-Book
+spacewidth 277
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A T -81
+A V -122
+A W -95
+A Y -122
+A 'Y -122
+A :Y -122
+A v -73
+A w -65
+A y -72
+A 'y -72
+A :y -72
+'A T -81
+'A V -122
+'A W -95
+'A Y -122
+'A 'Y -122
+'A :Y -122
+'A v -73
+'A w -65
+'A y -72
+'A 'y -72
+'A :y -72
+^A T -81
+^A V -122
+^A W -95
+^A Y -122
+^A 'Y -122
+^A :Y -122
+^A v -73
+^A w -65
+^A y -72
+^A 'y -72
+^A :y -72
+:A T -81
+:A V -122
+:A W -95
+:A Y -122
+:A 'Y -122
+:A :Y -122
+:A v -73
+:A w -65
+:A y -72
+:A 'y -72
+:A :y -72
+`A T -81
+`A V -122
+`A W -95
+`A Y -122
+`A 'Y -122
+`A :Y -122
+`A v -73
+`A w -65
+`A y -72
+`A 'y -72
+`A :y -72
+oA T -81
+oA V -122
+oA W -95
+oA Y -122
+oA 'Y -122
+oA :Y -122
+oA v -73
+oA w -65
+oA y -72
+oA 'y -72
+oA :y -72
+~A T -81
+~A V -122
+~A W -95
+~A Y -122
+~A 'Y -122
+~A :Y -122
+~A v -73
+~A w -65
+~A y -72
+~A 'y -72
+~A :y -72
+F A -60
+F 'A -60
+F ^A -60
+F :A -60
+F `A -60
+F oA -60
+F ~A -60
+F , -122
+F . -79
+F u2026 -79
+L T -46
+L V -113
+L W -67
+L Y -91
+L 'Y -91
+L :Y -91
+L y -23
+L 'y -23
+L :y -23
+/L T -46
+/L V -113
+/L W -67
+/L Y -91
+/L 'Y -91
+/L :Y -91
+/L y -23
+/L 'y -23
+/L :y -23
+P A -74
+P 'A -74
+P ^A -74
+P :A -74
+P `A -74
+P oA -74
+P ~A -74
+P , -123
+P . -91
+P u2026 -91
+R T 6
+R V -39
+R W 2
+R Y -20
+R 'Y -20
+R :Y -20
+R y 32
+R 'y 32
+R :y 32
+T A -81
+T 'A -81
+T ^A -81
+T :A -81
+T `A -81
+T oA -81
+T ~A -81
+T a -52
+T 'a -52
+T ^a -52
+T :a -52
+T `a -52
+T oa -52
+T ~a -52
+T c -51
+T ,c -51
+T : 3
+T , -102
+T e -49
+T 'e -49
+T ^e -49
+T :e -49
+T `e -49
+T i 31
+T 'i 31
+T ^i 31
+T :i 31
+T `i 31
+T o -49
+T 'o -49
+T ^o -49
+T :o -49
+T `o -49
+T /o -49
+T ~o -49
+T . -71
+T u2026 -71
+T r -30
+T s -23
+T ; -29
+T u -46
+T 'u -46
+T ^u -46
+T :u -46
+T `u -46
+T w 7
+T y 5
+T 'y 5
+T :y 5
+V A -122
+V 'A -122
+V ^A -122
+V :A -122
+V `A -122
+V oA -122
+V ~A -122
+V a -104
+V 'a -104
+V ^a -104
+V :a -104
+V `a -104
+V oa -104
+V ~a -104
+V : -1
+V , -106
+V e -101
+V 'e -101
+V ^e -101
+V :e -101
+V `e -101
+V i 5
+V 'i 5
+V o -101
+V 'o -101
+V ^o -101
+V :o -101
+V `o -101
+V /o -101
+V ~o -101
+V . -75
+V u2026 -75
+V r -40
+V ; -33
+V u -40
+V 'u -40
+V ^u -40
+V :u -40
+V `u -40
+V y -25
+V 'y -25
+V :y -25
+W A -73
+W 'A -73
+W ^A -73
+W :A -73
+W `A -73
+W oA -73
+W ~A -73
+W a -50
+W 'a -50
+W ^a -50
+W :a -50
+W `a -50
+W oa -50
+W ~a -50
+W : -1
+W , -106
+W e -47
+W 'e -47
+W ^e -47
+W :e -47
+W `e -47
+W i 6
+W 'i 6
+W ^i 16
+W :i 16
+W `i 16
+W o -46
+W 'o -46
+W ^o -46
+W :o -46
+W `o -46
+W /o -46
+W ~o -46
+W . -74
+W u2026 -74
+W r -29
+W ; -33
+W u -30
+W 'u -30
+W ^u -30
+W :u -30
+W `u -30
+W y -2
+W 'y -2
+W :y -2
+Y A -122
+Y 'A -122
+Y ^A -122
+Y :A -122
+Y `A -122
+Y oA -122
+Y ~A -122
+Y a -93
+Y 'a -93
+Y ^a -93
+Y :a -93
+Y `a -93
+Y oa -93
+Y ~a -93
+Y : 9
+Y , -97
+Y e -89
+Y 'e -89
+Y ^e -89
+Y :e -89
+Y `e -89
+Y i 13
+Y 'i 13
+Y ^i 23
+Y :i 23
+Y `i 23
+Y o -89
+Y 'o -89
+Y ^o -89
+Y :o -89
+Y `o -89
+Y /o -89
+Y ~o -89
+Y p -67
+Y . -65
+Y u2026 -65
+Y q -93
+Y ; -23
+Y u -69
+Y 'u -69
+Y ^u -69
+Y :u -69
+Y `u -69
+Y v -17
+'Y A -122
+'Y 'A -122
+'Y ^A -122
+'Y :A -122
+'Y `A -122
+'Y oA -122
+'Y ~A -122
+'Y a -93
+'Y 'a -93
+'Y ^a -93
+'Y :a -93
+'Y `a -93
+'Y oa -93
+'Y ~a -93
+'Y : 9
+'Y , -97
+'Y e -89
+'Y 'e -89
+'Y ^e -89
+'Y :e -89
+'Y `e -89
+'Y i 13
+'Y 'i 13
+'Y ^i 23
+'Y :i 23
+'Y `i 23
+'Y o -89
+'Y 'o -89
+'Y ^o -89
+'Y :o -89
+'Y `o -89
+'Y /o -89
+'Y ~o -89
+'Y p -67
+'Y . -65
+'Y u2026 -65
+'Y q -93
+'Y ; -23
+'Y u -69
+'Y 'u -69
+'Y ^u -69
+'Y :u -69
+'Y `u -69
+'Y v -17
+:Y A -122
+:Y 'A -122
+:Y ^A -122
+:Y :A -122
+:Y `A -122
+:Y oA -122
+:Y ~A -122
+:Y a -93
+:Y 'a -93
+:Y ^a -93
+:Y :a -93
+:Y `a -93
+:Y oa -93
+:Y ~a -93
+:Y : 9
+:Y , -97
+:Y e -89
+:Y 'e -89
+:Y ^e -89
+:Y :e -89
+:Y `e -89
+:Y i 13
+:Y 'i 13
+:Y ^i 23
+:Y :i 23
+:Y `i 23
+:Y o -89
+:Y 'o -89
+:Y ^o -89
+:Y :o -89
+:Y `o -89
+:Y /o -89
+:Y ~o -89
+:Y p -67
+:Y . -65
+:Y u2026 -65
+:Y q -93
+:Y ; -23
+:Y u -69
+:Y 'u -69
+:Y ^u -69
+:Y :u -69
+:Y `u -69
+:Y v -17
+f f 3
+r c -7
+r ,c -7
+r , -105
+r d -6
+r e -4
+r 'e -4
+r ^e -4
+r :e -4
+r `e -4
+r f 48
+r g 1
+r h 29
+r m 28
+r n 21
+r ~n 21
+r o -4
+r 'o -4
+r ^o -4
+r :o -4
+r `o -4
+r /o -4
+r ~o -4
+r . -73
+r u2026 -73
+r q -8
+
+charset
+ha 606,740 2 0 asciicircum
+ti 606,319 0 1 asciitilde
+vS 498,927,13 2 2 Scaron
+vZ 480,927 2 3 Zcaron
+vs 388,764,13 2 4 scaron
+vz 425,764 2 5 zcaron
+:Y 592,928 2 6 Ydieresis
+tm 1000,740 2 7 trademark
+aq 198,740 2 8 quotesingle
+Eu 554,753,13,4 2 9 Euro
+space 277 0 32 space
+! 295,740 2 33 exclam
+" 309,740 2 34 quotedbl
+dq "
+# 554,740 2 35 numbersign
+sh "
+$ 554,811,70 2 36 dollar
+Do "
+% 775,751,13 2 37 percent
+& 757,753,12 2 38 ampersand
+' 351,740 2 39 quoteright
+cq "
+( 369,757,205 3 40 parenleft
+) 369,757,205 3 41 parenright
+* 425,740 2 42 asterisk
++ 606,506 0 43 plus
+, 277,126,67 0 44 comma
+- 332,315 0 45 hyphen
+hy "
+. 277,126 0 46 period
+/ 437,740,100 2 47 slash
+sl "
+0 554,753,13 2 48 zero
+1 554,740 2 49 one
+2 554,753 2 50 two
+3 554,753,13 2 51 three
+4 554,740 2 52 four
+5 554,740,13 2 53 five
+6 554,739,13 2 54 six
+7 554,740 2 55 seven
+8 554,753,13 2 56 eight
+9 554,752 2 57 nine
+: 277,548 0 58 colon
+; 277,548,67 0 59 semicolon
+< 606,514,8 0 60 less
+= 606,388 0 61 equal
+> 606,514,8 0 62 greater
+? 591,752 2 63 question
+@ 867,753,13 2 64 at
+at "
+A 740,740 2 65 A
+B 574,740 2 66 B
+C 813,752,13 2 67 C
+D 744,740 2 68 D
+E 536,740 2 69 E
+F 485,740 2 70 F
+G 872,753,13 2 71 G
+H 683,740 2 72 H
+I 226,740 2 73 I
+J 482,740,13 2 74 J
+K 591,740 2 75 K
+L 462,740 2 76 L
+M 919,740 2 77 M
+N 740,740 2 78 N
+O 869,753,13 2 79 O
+P 592,740 2 80 P
+Q 871,753,13 2 81 Q
+R 607,740 2 82 R
+S 498,753,13 2 83 S
+T 426,740 2 84 T
+U 655,740,13 2 85 U
+V 702,740 2 86 V
+W 960,740 2 87 W
+X 609,740 2 88 X
+Y 592,740 2 89 Y
+Z 480,740 2 90 Z
+[ 351,753,179 2 91 bracketleft
+lB "
+\ 605,740,100 2 92 backslash
+rs "
+] 351,753,179 2 93 bracketright
+rB "
+^ 502,764 2 94 circumflex
+a^ "
+_ 500,0,125 0 95 underscore
+` 351,740 2 96 quoteleft
+oq "
+a 683,561,13 0 97 a
+b 682,740,13 2 98 b
+c 647,561,13 0 99 c
+d 685,740,13 2 100 d
+e 650,561,13 0 101 e
+f 314,753 2 102 f
+g 673,561,215 1 103 g
+h 610,740 2 104 h
+i 200,740 2 105 i
+j 203,740,192,0,44 3 106 j
+k 502,740 2 107 k
+l 200,740 2 108 l
+m 938,561 0 109 m
+n 610,561 0 110 n
+o 655,561,13 0 111 o
+p 682,561,192 1 112 p
+q 682,561,192 1 113 q
+r 301,561 0 114 r
+s 388,561,13 0 115 s
+t 339,740 2 116 t
+u 608,547,13 0 117 u
+v 554,547 0 118 v
+w 831,547 0 119 w
+x 480,547 0 120 x
+y 536,547,192 1 121 y
+z 425,547 0 122 z
+{ 351,740,189 2 123 braceleft
+lC "
+| 672,778,222 3 124 bar
+ba "
+} 351,740,189 2 125 braceright
+rC "
+~ 439,754 2 126 tilde
+a~ "
+bq 354,126,68 0 128 quotesinglbase
+Fo 425,481 0 129 guillemotleft
+Fc 425,481 0 130 guillemotright
+bu 606,532 0 131 bullet
+Fn 554,818,153,0,12 2 132 florin
+f/ 166,740,0,114,113 2 133 fraction
+%0 1174,751,13 2 134 perthousand
+dg 553,740,133 2 135 dagger
+dd 553,740,133 2 136 daggerdbl
+en 500,315 0 137 endash
+em 1000,315 0 138 emdash
+fi 487,753 2 140 fi
+fl 485,753 2 141 fl
+.i 200,547 0 144 dotlessi
+ga 378,786 2 146 grave
+a" 552,786 2 147 hungarumlaut
+a. 222,765 2 148 dotaccent
+ab 453,754 2 149 breve
+ah 502,764 2 150 caron
+ao 332,807 2 151 ring
+ho 302,0,191 1 152 ogonek
+lq 502,740 2 153 quotedblleft
+rq 484,740 2 154 quotedblright
+oe 1137,561,13 0 155 oe
+/l 300,740 2 156 lslash
+Bq 502,126,68 0 157 quotedblbase
+OE 1194,753,13 2 158 OE
+/L 517,740 2 159 Lslash
+r! 295,548,192 1 161 exclamdown
+ct 554,707 0 162 cent
+Po 554,753 2 163 sterling
+Cs 554,580 0 164 currency
+Ye 554,740 2 165 yen
+bb 672,703,147 0 166 brokenbar
+sc 615,753,141 2 167 section
+ad 369,765 2 168 dieresis
+co 747,752,12,8,9 2 169 copyright
+Of 369,753,0,0,3 2 170 ordfeminine
+fo 251,481 0 171 guilsinglleft
+tno 606,388 0 172 logicalnot
+\- 606,287 0 173 minus
+rg 747,752,12,8,9 2 174 registered
+a- 485,736 0 175 macron
+de 400,709 0 176 degree
+t+- 606,518,24 0 177 plusminus
+S2 332,747 2 178 twosuperior
+S3 332,747 2 179 threesuperior
+aa 375,786 2 180 acute
+*m 608,547,192 1 181 mu
+mc "
+ps 564,740,110 2 182 paragraph
+pc 277,316 0 183 periodcentered
+ac 324,3,222 1 184 cedilla
+S1 332,740 2 185 onesuperior
+Om 369,753 2 186 ordmasculine
+fc 251,481 0 187 guilsinglright
+14 831,740 2 188 onequarter
+12 831,740 2 189 onehalf
+34 831,747 2 190 threequarters
+r? 591,548,205 1 191 questiondown
+`A 740,949 2 192 Agrave
+'A 740,949 2 193 Aacute
+^A 740,927 2 194 Acircumflex
+~A 740,917 2 195 Atilde
+:A 740,928 2 196 Adieresis
+oA 740,955 2 197 Aring
+AE 992,740,0,0,20 2 198 AE
+,C 813,752,222 3 199 Ccedilla
+`E 536,949 2 200 Egrave
+'E 536,949 2 201 Eacute
+^E 536,927 2 202 Ecircumflex
+:E 536,928 2 203 Edieresis
+`I 226,949,0,0,47 2 204 Igrave
+'I 226,949,0,48 2 205 Iacute
+^I 226,927,0,64,64 2 206 Icircumflex
+:I 226,928 2 207 Idieresis
+-D 790,740 2 208 Eth
+~N 740,917 2 209 Ntilde
+`O 869,949,13 2 210 Ograve
+'O 869,949,13 2 211 Oacute
+^O 869,927,13 2 212 Ocircumflex
+~O 869,917,13 2 213 Otilde
+:O 869,928,13 2 214 Odieresis
+tmu 606,482 0 215 multiply
+/O 868,819,83 2 216 Oslash
+`U 655,949,13 2 217 Ugrave
+'U 655,949,13 2 218 Uacute
+^U 655,927,13 2 219 Ucircumflex
+:U 655,928,13 2 220 Udieresis
+'Y 592,949 2 221 Yacute
+TP 592,740 2 222 Thorn
+ss 554,753,13 2 223 germandbls
+`a 683,786,13 2 224 agrave
+'a 683,786,13 2 225 aacute
+^a 683,764,13 2 226 acircumflex
+~a 683,754,13 2 227 atilde
+:a 683,765,13 2 228 adieresis
+oa 683,807,13 2 229 aring
+ae 1157,561,13 0 230 ae
+,c 647,561,222 1 231 ccedilla
+`e 650,786,13 2 232 egrave
+'e 650,786,13 2 233 eacute
+^e 650,764,13 2 234 ecircumflex
+:e 650,765,13 2 235 edieresis
+`i 200,786,0,0,60 2 236 igrave
+'i 200,786,0,61 2 237 iacute
+^i 200,764,0,77,77 2 238 icircumflex
+:i 200,765,0,11,11 2 239 idieresis
+Sd 655,753,12 2 240 eth
+~n 610,754 2 241 ntilde
+`o 655,786,13 2 242 ograve
+'o 655,786,13 2 243 oacute
+^o 655,764,13 2 244 ocircumflex
+~o 655,754,13 2 245 otilde
+:o 655,765,13 2 246 odieresis
+tdi 606,519,13 0 247 divide
+/o 653,614,64 0 248 oslash
+`u 608,786,13 2 249 ugrave
+'u 608,786,13 2 250 uacute
+^u 608,764,13 2 251 ucircumflex
+:u 608,765,13 2 252 udieresis
+'y 536,786,192 3 253 yacute
+Tp 682,740,192 3 254 thorn
+:y 536,765,192 3 255 ydieresis
+u2026 1000,126 0 256 ellipsis
diff --git a/font/devps/BMB b/font/devps/BMB
new file mode 100644
index 0000000..087eee0
--- /dev/null
+++ b/font/devps/BMB
@@ -0,0 +1,696 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName ITC Bookman Demi
+# Version 003.001
+# FamilyName ITC Bookman
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.ITC Bookman is a registered trademark of International Typeface Corporation.
+# Comment Copyright (c) 1985, 1987, 1989, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:32:33 1999
+# Comment UniqueID 44721
+# Comment VMusage 35828 42764
+
+name BMB
+internalname Bookman-Demi
+spacewidth 340
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A T -40
+A V -68
+A W -20
+A Y -52
+A 'Y -52
+A :Y -52
+A v -8
+A w -9
+A y -1
+A 'y -1
+A :y -1
+'A T -40
+'A V -68
+'A W -20
+'A Y -52
+'A 'Y -52
+'A :Y -52
+'A v -8
+'A w -9
+'A y -1
+'A 'y -1
+'A :y -1
+^A T -40
+^A V -68
+^A W -20
+^A Y -52
+^A 'Y -52
+^A :Y -52
+^A v -8
+^A w -9
+^A y -1
+^A 'y -1
+^A :y -1
+:A T -40
+:A V -68
+:A W -20
+:A Y -52
+:A 'Y -52
+:A :Y -52
+:A v -8
+:A w -9
+:A y -1
+:A 'y -1
+:A :y -1
+`A T -40
+`A V -68
+`A W -20
+`A Y -52
+`A 'Y -52
+`A :Y -52
+`A v -8
+`A w -9
+`A y -1
+`A 'y -1
+`A :y -1
+oA T -40
+oA V -68
+oA W -20
+oA Y -52
+oA 'Y -52
+oA :Y -52
+oA v -8
+oA w -9
+oA y -1
+oA 'y -1
+oA :y -1
+~A T -40
+~A V -68
+~A W -20
+~A Y -52
+~A 'Y -52
+~A :Y -52
+~A v -8
+~A w -9
+~A y -1
+~A 'y -1
+~A :y -1
+F A -59
+F 'A -59
+F ^A -59
+F :A -59
+F `A -59
+F oA -59
+F ~A -59
+F , -130
+F . -132
+F u2026 -132
+L T -4
+L V -50
+L W -41
+L Y -35
+L 'Y -35
+L :Y -35
+L y 19
+L 'y 19
+L :y 19
+/L T -4
+/L V -50
+/L W -41
+/L Y -35
+/L 'Y -35
+/L :Y -35
+/L y 19
+/L 'y 19
+/L :y 19
+P A -46
+P 'A -46
+P ^A -46
+P :A -46
+P `A -46
+P oA -46
+P ~A -46
+P , -129
+P . -128
+P u2026 -128
+R T -4
+R V -29
+R W -24
+R Y -20
+R 'Y -20
+R :Y -20
+R y -8
+R 'y -8
+R :y -8
+T A -42
+T 'A -42
+T ^A -42
+T :A -42
+T `A -42
+T oA -42
+T ~A -42
+T a -24
+T 'a -24
+T ^a -24
+T :a -24
+T `a -24
+T oa -24
+T ~a -24
+T c -29
+T ,c -29
+T : 7
+T , -122
+T e -29
+T 'e -29
+T ^e -29
+T :e -29
+T `e -29
+T - -10
+T hy -10
+T i 27
+T 'i 27
+T ^i 27
+T :i 27
+T `i 27
+T o -28
+T 'o -28
+T ^o -28
+T :o -28
+T `o -28
+T /o -28
+T ~o -28
+T . -122
+T u2026 -122
+T r 27
+T s -10
+T vs -10
+T ; 5
+V A -88
+V 'A -88
+V ^A -88
+V :A -88
+V `A -88
+V oA -88
+V ~A -88
+V a -74
+V 'a -74
+V ^a -74
+V :a -74
+V `a -74
+V oa -74
+V ~a -74
+V : -37
+V , -103
+V e -80
+V 'e -80
+V ^e -80
+V :e -80
+V `e -80
+V - -10
+V hy -10
+V i 15
+V 'i 15
+V ^i 15
+V :i 15
+V `i 15
+V o -79
+V 'o -79
+V ^o -79
+V :o -79
+V `o -79
+V /o -79
+V ~o -79
+V . -105
+V u2026 -105
+V r -15
+V ; -38
+V u -11
+V 'u -11
+V ^u -11
+V :u -11
+V `u -11
+V y 12
+V 'y 12
+V :y 12
+W A -60
+W 'A -60
+W ^A -60
+W :A -60
+W `A -60
+W oA -60
+W ~A -60
+W a -73
+W 'a -73
+W ^a -73
+W :a -73
+W `a -73
+W oa -73
+W ~a -73
+W : -37
+W , -103
+W e -79
+W 'e -79
+W ^e -79
+W :e -79
+W `e -79
+W - -10
+W hy -10
+W i 15
+W 'i 15
+W ^i 15
+W :i 15
+W `i 15
+W o -78
+W 'o -78
+W ^o -78
+W :o -78
+W `o -78
+W /o -78
+W ~o -78
+W . -105
+W u2026 -105
+W r -15
+W ; -38
+W u -11
+W 'u -11
+W ^u -11
+W :u -11
+W `u -11
+W y 12
+W 'y 12
+W :y 12
+Y A -56
+Y 'A -56
+Y ^A -56
+Y :A -56
+Y `A -56
+Y oA -56
+Y ~A -56
+Y a -60
+Y 'a -60
+Y ^a -60
+Y :a -60
+Y `a -60
+Y oa -60
+Y ~a -60
+Y : -32
+Y , -103
+Y e -67
+Y 'e -67
+Y ^e -67
+Y :e -67
+Y `e -67
+Y - -10
+Y hy -10
+Y i 2
+Y 'i 2
+Y ^i 12
+Y :i 12
+Y `i 12
+Y o -66
+Y 'o -66
+Y ^o -66
+Y :o -66
+Y `o -66
+Y /o -66
+Y ~o -66
+Y p -23
+Y . -105
+Y u2026 -105
+Y q -66
+Y ; -34
+Y u -13
+Y 'u -13
+Y ^u -13
+Y :u -13
+Y `u -13
+Y v 24
+'Y A -56
+'Y 'A -56
+'Y ^A -56
+'Y :A -56
+'Y `A -56
+'Y oA -56
+'Y ~A -56
+'Y a -60
+'Y 'a -60
+'Y ^a -60
+'Y :a -60
+'Y `a -60
+'Y oa -60
+'Y ~a -60
+'Y : -32
+'Y , -103
+'Y e -67
+'Y 'e -67
+'Y ^e -67
+'Y :e -67
+'Y `e -67
+'Y - -10
+'Y hy -10
+'Y i 2
+'Y 'i 2
+'Y ^i 12
+'Y :i 12
+'Y `i 12
+'Y o -66
+'Y 'o -66
+'Y ^o -66
+'Y :o -66
+'Y `o -66
+'Y /o -66
+'Y ~o -66
+'Y p -23
+'Y . -105
+'Y u2026 -105
+'Y q -66
+'Y ; -34
+'Y u -13
+'Y 'u -13
+'Y ^u -13
+'Y :u -13
+'Y `u -13
+'Y v 24
+:Y A -56
+:Y 'A -56
+:Y ^A -56
+:Y :A -56
+:Y `A -56
+:Y oA -56
+:Y ~A -56
+:Y a -60
+:Y 'a -60
+:Y ^a -60
+:Y :a -60
+:Y `a -60
+:Y oa -60
+:Y ~a -60
+:Y : -32
+:Y , -103
+:Y e -67
+:Y 'e -67
+:Y ^e -67
+:Y :e -67
+:Y `e -67
+:Y - -10
+:Y hy -10
+:Y i 2
+:Y 'i 2
+:Y ^i 12
+:Y :i 12
+:Y `i 12
+:Y o -66
+:Y 'o -66
+:Y ^o -66
+:Y :o -66
+:Y `o -66
+:Y /o -66
+:Y ~o -66
+:Y p -23
+:Y . -105
+:Y u2026 -105
+:Y q -66
+:Y ; -34
+:Y u -13
+:Y 'u -13
+:Y ^u -13
+:Y :u -13
+:Y `u -13
+:Y v 24
+f f 21
+r c -9
+r ,c -9
+r , -101
+r d -10
+r e -10
+r 'e -10
+r ^e -10
+r :e -10
+r `e -10
+r f 20
+r g -9
+r h -23
+r - -10
+r hy -10
+r m 20
+r n 20
+r ~n 20
+r o -9
+r 'o -9
+r ^o -9
+r :o -9
+r `o -9
+r /o -9
+r ~o -9
+r . -102
+r u2026 -102
+r q -9
+
+charset
+ha 600,681 2 0 asciicircum
+ti 600,368 0 1 asciitilde
+vS 660,896,17 2 2 Scaron
+vZ 640,896 2 3 Zcaron
+vs 520,717,8 2 4 scaron
+vz 560,717 2 5 zcaron
+:Y 700,877,0,18,20 2 6 Ydieresis
+tm 980,681,0,2 2 7 trademark
+aq 240,698 2 8 quotesingle
+Eu 660,698,17 2 9 Euro
+space 340 0 32 space
+! 360,698,8 2 33 exclam
+" 420,698 2 34 quotedbl
+dq "
+# 660,681 2 35 numbersign
+sh "
+$ 660,805,119 2 36 dollar
+Do "
+% 940,698,8 2 37 percent
+& 800,698,17 2 38 ampersand
+' 320,698 2 39 quoteright
+cq "
+( 320,750,150 2 40 parenleft
+) 320,750,151 2 41 parenright
+* 460,698 2 42 asterisk
++ 600,514 0 43 plus
+, 340,162,124 0 44 comma
+- 360,318 0 45 hyphen
+hy "
+. 340,172,8 0 46 period
+/ 600,725,149 2 47 slash
+sl "
+0 660,698,17 2 48 zero
+1 660,681 2 49 one
+2 660,698 2 50 two
+3 660,698,17 2 51 three
+4 660,681 2 52 four
+5 660,723,17 2 53 five
+6 660,698,17 2 54 six
+7 660,681 2 55 seven
+8 660,698,17 2 56 eight
+9 660,698,17 2 57 nine
+: 340,515,8 0 58 colon
+; 340,515,124 0 59 semicolon
+< 600,542,9 0 60 less
+= 600,421 0 61 equal
+> 600,542,9 0 62 greater
+? 660,698,8 2 63 question
+@ 820,698,17 2 64 at
+at "
+A 720,681,0,43,34 2 65 A
+B 720,681 2 66 B
+C 740,698,17 2 67 C
+D 780,681 2 68 D
+E 720,681,0,4 2 69 E
+F 680,681,0,6 2 70 F
+G 780,698,17 2 71 G
+H 820,681 2 72 H
+I 400,681 2 73 I
+J 640,681,17,0,12 2 74 J
+K 800,681 2 75 K
+L 640,681,0,28 2 76 L
+M 940,681 2 77 M
+N 740,681 2 78 N
+O 800,698,17 2 79 O
+P 660,681 2 80 P
+Q 800,698,226 3 81 Q
+R 780,681,0,3 2 82 R
+S 660,698,17 2 83 S
+T 700,681,0,3,4 2 84 T
+U 740,681,17 2 85 U
+V 720,681,0,10,20 2 86 V
+W 940,681,0,23,20 2 87 W
+X 780,681 2 88 X
+Y 700,681,0,18,20 2 89 Y
+Z 640,681 2 90 Z
+[ 300,725,138 2 91 bracketleft
+lB "
+\ 600,725 2 92 backslash
+rs "
+] 300,725,138 2 93 bracketright
+rB "
+^ 500,731 2 94 circumflex
+a^ "
+_ 500,0,125 0 95 underscore
+` 320,698 2 96 quoteleft
+oq "
+a 580,515,8,8 0 97 a
+b 600,725,8,0,20 2 98 b
+c 580,515,8 0 99 c
+d 640,725,8 2 100 d
+e 580,515,8 0 101 e
+f 380,741,0,81 2 102 f
+g 580,595,243,3 1 103 g
+h 680,725 2 104 h
+i 360,729 2 105 i
+j 340,729,221,0,94 3 106 j
+k 660,725 2 107 k
+l 340,725 2 108 l
+m 1000,515 0 109 m
+n 680,515 0 110 n
+o 620,515,8 0 111 o
+p 640,515,212 1 112 p
+q 620,515,212,13 1 113 q
+r 460,502,0,2 0 114 r
+s 520,515,8 0 115 s
+t 460,660,8 2 116 t
+u 660,502,8 0 117 u
+v 600,502,0,0,6 0 118 v
+w 800,502,0,10,6 0 119 w
+x 600,502 0 120 x
+y 620,502,221 1 121 y
+z 560,502 0 122 z
+{ 320,726,139 2 123 braceleft
+lC "
+| 600,750,250 3 124 bar
+ba "
+} 320,725,140 2 125 braceright
+rC "
+~ 480,691 2 126 tilde
+a~ "
+bq 320,144,114 0 128 quotesinglbase
+Fo 400,457 0 129 guillemotleft
+Fc 400,457 0 130 guillemotright
+bu 460,511 0 131 bullet
+Fn 660,749,209,14,46 2 132 florin
+f/ 120,681,0,192,194 2 133 fraction
+%0 1360,698,8 2 134 perthousand
+dg 440,698,156 2 135 dagger
+dd 380,698,156 2 136 daggerdbl
+en 500,318,0,25,25 0 137 endash
+em 1000,318,0,25,25 0 138 emdash
+fi 740,741 2 140 fi
+fl 740,741 2 141 fl
+.i 360,502 0 144 dotlessi
+ga 400,730 2 146 grave
+a" 440,741 2 147 hungarumlaut
+a. 320,729 2 148 dotaccent
+ab 500,722 2 149 breve
+ah 500,717 2 150 caron
+ao 340,755 2 151 ring
+ho 320,0,199 0 152 ogonek
+lq 540,698 2 153 quotedblleft
+rq 540,698 2 154 quotedblright
+oe 940,515,8 0 155 oe
+/l 340,725 2 156 lslash
+Bq 540,144,114 0 157 quotedblbase
+OE 1220,698,17 2 158 OE
+/L 640,681,0,28 2 159 Lslash
+r! 360,515,191 0 161 exclamdown
+ct 660,674 2 162 cent
+Po 660,698,17 2 163 sterling
+Cs 660,593 0 164 currency
+Ye 660,681,0,36,28 2 165 yen
+bb 600,675,175 2 166 brokenbar
+sc 600,698,153 2 167 section
+ad 500,673 2 168 dieresis
+co 740,698,17 2 169 copyright
+Of 400,698 2 170 ordfeminine
+fo 220,457 0 171 guilsinglleft
+tno 600,421 0 172 logicalnot
+\- 600,323 0 173 minus
+rg 740,698,17 2 174 registered
+a- 460,663 2 175 macron
+de 400,698 2 176 degree
+t+- 600,514 0 177 plusminus
+S2 396,698 2 178 twosuperior
+S3 396,698 2 179 threesuperior
+aa 400,731 2 180 acute
+*m 679,502,205,3 0 181 mu
+mc "
+ps 800,681 2 182 paragraph
+pc 340,355 0 183 periodcentered
+ac 360,0,213 1 184 cedilla
+S1 396,687 2 185 onesuperior
+Om 400,698 2 186 ordmasculine
+fc 220,457 0 187 guilsinglright
+14 990,681 2 188 onequarter
+12 990,681 2 189 onehalf
+34 990,692 2 190 threequarters
+r? 660,515,191 0 191 questiondown
+`A 720,909,0,43,34 2 192 Agrave
+'A 720,910,0,43,34 2 193 Aacute
+^A 720,910,0,43,34 2 194 Acircumflex
+~A 720,870,0,43,34 2 195 Atilde
+:A 720,877,0,43,34 2 196 Adieresis
+oA 720,934,0,43,34 2 197 Aring
+AE 1140,681,0,9,34 2 198 AE
+,C 740,698,213 3 199 Ccedilla
+`E 720,909,0,4 2 200 Egrave
+'E 720,910,0,4 2 201 Eacute
+^E 720,910,0,4 2 202 Ecircumflex
+:E 720,877,0,4 2 203 Edieresis
+`I 400,909 2 204 Igrave
+'I 400,910 2 205 Iacute
+^I 400,910 2 206 Icircumflex
+:I 400,877 2 207 Idieresis
+-D 780,681 2 208 Eth
+~N 740,870 2 209 Ntilde
+`O 800,909,17 2 210 Ograve
+'O 800,910,17 2 211 Oacute
+^O 800,910,17 2 212 Ocircumflex
+~O 800,870,17 2 213 Otilde
+:O 800,877,17 2 214 Odieresis
+tmu 600,514 0 215 multiply
+/O 800,781,110 2 216 Oslash
+`U 740,909,17 2 217 Ugrave
+'U 740,910,17 2 218 Uacute
+^U 740,910,17 2 219 Ucircumflex
+:U 740,877,17 2 220 Udieresis
+'Y 700,910,0,18,20 2 221 Yacute
+TP 660,681 2 222 Thorn
+ss 660,699,91,0,61 2 223 germandbls
+`a 580,730,8,8 2 224 agrave
+'a 580,731,8,8 2 225 aacute
+^a 580,731,8,8 2 226 acircumflex
+~a 580,691,8,8 2 227 atilde
+:a 580,698,8,8 2 228 adieresis
+oa 580,755,8,8 2 229 aring
+ae 880,515,8 0 230 ae
+,c 580,515,213 1 231 ccedilla
+`e 580,730,8 2 232 egrave
+'e 580,731,8 2 233 eacute
+^e 580,731,8 2 234 ecircumflex
+:e 580,698,8 2 235 edieresis
+`i 360,730 2 236 igrave
+'i 360,731 2 237 iacute
+^i 360,731,0,0,2 2 238 icircumflex
+:i 360,698,0,11,2 2 239 idieresis
+Sd 620,741,8 2 240 eth
+~n 680,691 2 241 ntilde
+`o 620,730,8 2 242 ograve
+'o 620,731,8 2 243 oacute
+^o 620,731,8 2 244 ocircumflex
+~o 620,691,8 2 245 otilde
+:o 620,698,8 2 246 odieresis
+tdi 600,521 0 247 divide
+/o 620,551,40 0 248 oslash
+`u 660,730,8 2 249 ugrave
+'u 660,731,8 2 250 uacute
+^u 660,731,8 2 251 ucircumflex
+:u 660,698,8 2 252 udieresis
+'y 620,731,221 3 253 yacute
+Tp 640,725,212 3 254 thorn
+:y 620,698,221 3 255 ydieresis
+u2026 1000,172,8 0 256 ellipsis
diff --git a/font/devps/BMBI b/font/devps/BMBI
new file mode 100644
index 0000000..e38bd33
--- /dev/null
+++ b/font/devps/BMBI
@@ -0,0 +1,697 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName ITC Bookman Demi Italic
+# Version 003.001
+# FamilyName ITC Bookman
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.ITC Bookman is a registered trademark of International Typeface Corporation.
+# Comment Copyright (c) 1985, 1987, 1989, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:35:00 1999
+# Comment UniqueID 44722
+# Comment VMusage 35568 42504
+
+name BMBI
+internalname Bookman-DemiItalic
+slant 10
+spacewidth 340
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A T -17
+A V -40
+A W -35
+A Y -25
+A 'Y -25
+A :Y -25
+A v 20
+A w 20
+A y 20
+A 'y 20
+A :y 20
+'A T -17
+'A V -40
+'A W -35
+'A Y -25
+'A 'Y -25
+'A :Y -25
+'A v 20
+'A w 20
+'A y 20
+'A 'y 20
+'A :y 20
+^A T -17
+^A V -40
+^A W -35
+^A Y -25
+^A 'Y -25
+^A :Y -25
+^A v 20
+^A w 20
+^A y 20
+^A 'y 20
+^A :y 20
+:A T -17
+:A V -40
+:A W -35
+:A Y -25
+:A 'Y -25
+:A :Y -25
+:A v 20
+:A w 20
+:A y 20
+:A 'y 20
+:A :y 20
+`A T -17
+`A V -40
+`A W -35
+`A Y -25
+`A 'Y -25
+`A :Y -25
+`A v 20
+`A w 20
+`A y 20
+`A 'y 20
+`A :y 20
+oA T -17
+oA V -40
+oA W -35
+oA Y -25
+oA 'Y -25
+oA :Y -25
+oA v 20
+oA w 20
+oA y 20
+oA 'y 20
+oA :y 20
+~A T -17
+~A V -40
+~A W -35
+~A Y -25
+~A 'Y -25
+~A :Y -25
+~A v 20
+~A w 20
+~A y 20
+~A 'y 20
+~A :y 20
+F A -35
+F 'A -35
+F ^A -35
+F :A -35
+F `A -35
+F oA -35
+F ~A -35
+F , -98
+F . -105
+F u2026 -105
+L T -26
+L V -19
+L W -15
+L Y -5
+L 'Y -5
+L :Y -5
+L y 62
+L 'y 62
+L :y 62
+/L T -26
+/L V -19
+/L W -15
+/L Y -5
+/L 'Y -5
+/L :Y -5
+/L y 62
+/L 'y 62
+/L :y 62
+P A -31
+P 'A -31
+P ^A -31
+P :A -31
+P `A -31
+P oA -31
+P ~A -31
+P , -98
+P . -105
+P u2026 -105
+R T -3
+R V -8
+R W -4
+R Y 4
+R 'Y 4
+R :Y 4
+R y 27
+R 'y 27
+R :y 27
+T A -42
+T 'A -42
+T ^A -42
+T :A -42
+T `A -42
+T oA -42
+T ~A -42
+T a -8
+T 'a -8
+T ^a -8
+T :a -8
+T `a -8
+T oa -8
+T ~a -8
+T c -8
+T ,c -8
+T : 26
+T , -100
+T e -10
+T 'e -10
+T ^e -10
+T :e -10
+T `e -10
+T - -20
+T hy -20
+T i 42
+T 'i 42
+T ^i 42
+T :i 42
+T `i 42
+T o -5
+T 'o -5
+T ^o -5
+T :o -5
+T `o -5
+T /o -5
+T ~o -5
+T . -107
+T u2026 -107
+T r 41
+T s -1
+T vs -1
+T ; 31
+T u 42
+T 'u 42
+T ^u 42
+T :u 42
+T `u 42
+T w 69
+T y 56
+T 'y 56
+T :y 56
+V A -50
+V 'A -50
+V ^A -50
+V :A -50
+V `A -50
+V oA -50
+V ~A -50
+V a -50
+V 'a -50
+V ^a -50
+V :a -50
+V `a -50
+V oa -50
+V ~a -50
+V : -28
+V , -137
+V e -50
+V 'e -50
+V ^e -50
+V `e -50
+V - -20
+V hy -20
+V i 32
+V 'i 32
+V ^i 48
+V :i 48
+V `i 32
+V o -50
+V 'o -50
+V ^o -50
+V :o -50
+V `o -50
+V /o -50
+V ~o -20
+V . -115
+V u2026 -115
+V r 2
+V ; -22
+V u -1
+V 'u -1
+V ^u -1
+V :u -1
+V `u -1
+V y 17
+V 'y 17
+V :y 17
+W A -77
+W 'A -77
+W ^A -77
+W :A -77
+W `A -77
+W oA -77
+W ~A -77
+W a -100
+W 'a -100
+W ^a -100
+W :a -100
+W `a -100
+W oa -100
+W ~a -100
+W : -86
+W , -201
+W e -100
+W 'e -100
+W ^e -100
+W :e -100
+W `e -100
+W - -22
+W hy -22
+W i -36
+W 'i -36
+W `i -36
+W o -100
+W 'o -100
+W ^o -100
+W :o -100
+W `o -100
+W /o -100
+W ~o -100
+W . -183
+W u2026 -183
+W r -66
+W ; -81
+W u -69
+W 'u -69
+W ^u -69
+W :u -69
+W `u -69
+W y -51
+W 'y -51
+W :y -51
+Y A -30
+Y 'A -30
+Y ^A -30
+Y :A -30
+Y `A -30
+Y oA -30
+Y ~A -30
+Y a -45
+Y 'a -45
+Y ^a -45
+Y :a -45
+Y `a -45
+Y oa -45
+Y ~a -45
+Y : -9
+Y , -106
+Y e -46
+Y 'e -46
+Y ^e -46
+Y `e -46
+Y - -20
+Y hy -20
+Y i 20
+Y 'i 20
+Y ^i 40
+Y :i 40
+Y `i 40
+Y o -41
+Y 'o -41
+Y ^o -41
+Y :o -21
+Y `o -41
+Y /o -41
+Y ~o -41
+Y . -113
+Y u2026 -113
+Y q -43
+Y ; -4
+Y u -1
+Y 'u -1
+Y ^u -1
+Y :u -1
+Y `u -1
+Y v 26
+'Y A -30
+'Y 'A -30
+'Y ^A -30
+'Y :A -30
+'Y `A -30
+'Y oA -30
+'Y ~A -30
+'Y a -45
+'Y 'a -45
+'Y ^a -45
+'Y :a -45
+'Y `a -45
+'Y oa -45
+'Y ~a -45
+'Y : -9
+'Y , -106
+'Y e -46
+'Y 'e -46
+'Y ^e -46
+'Y `e -46
+'Y - -20
+'Y hy -20
+'Y i 20
+'Y 'i 20
+'Y ^i 40
+'Y :i 40
+'Y `i 40
+'Y o -41
+'Y 'o -41
+'Y ^o -41
+'Y :o -21
+'Y `o -41
+'Y /o -41
+'Y ~o -41
+'Y . -113
+'Y u2026 -113
+'Y q -43
+'Y ; -4
+'Y u -1
+'Y 'u -1
+'Y ^u -1
+'Y :u -1
+'Y `u -1
+'Y v 26
+:Y A -30
+:Y 'A -30
+:Y ^A -30
+:Y :A -30
+:Y `A -30
+:Y oA -30
+:Y ~A -30
+:Y a -45
+:Y 'a -45
+:Y ^a -45
+:Y :a -45
+:Y `a -45
+:Y oa -45
+:Y ~a -45
+:Y : -9
+:Y , -106
+:Y e -46
+:Y 'e -46
+:Y ^e -46
+:Y `e -46
+:Y - -20
+:Y hy -20
+:Y i 20
+:Y 'i 20
+:Y ^i 40
+:Y :i 40
+:Y `i 40
+:Y o -41
+:Y 'o -41
+:Y ^o -41
+:Y :o -21
+:Y `o -41
+:Y /o -41
+:Y ~o -41
+:Y . -113
+:Y u2026 -113
+:Y q -43
+:Y ; -4
+:Y u -1
+:Y 'u -1
+:Y ^u -1
+:Y :u -1
+:Y `u -1
+:Y v 26
+f f 10
+r c -5
+r ,c -5
+r , -113
+r d -3
+r e -6
+r 'e -6
+r ^e -6
+r :e -6
+r `e -6
+r f 42
+r g -23
+r h -35
+r - -20
+r hy -20
+r m 39
+r n 39
+r ~n 39
+r o -1
+r 'o -1
+r ^o -1
+r :o -1
+r `o -1
+r /o -1
+r ~o -1
+r . -120
+r u2026 -120
+r q -3
+
+charset
+ha 620,681,0,24,-42,24 2 0 asciicircum
+ti 620,368,0,35,-51,35 0 1 asciitilde
+vS 700,915,17,81,-9,73 2 2 Scaron
+vZ 680,915,0,110,27,73 2 3 Zcaron
+vs 540,749,8,83,18,73 2 4 scaron
+vz 560,749,8,76,14,73 2 5 zcaron
+:Y 660,900,0,207,-22,73 2 6 Ydieresis
+tm 940,681,0,92,8,73 2 7 trademark
+aq 180,696,0,165,-76,73 2 8 quotesingle
+Eu 680,698,17,105,-28,73 2 9 Euro
+space 340 0 32 space
+! 320,698,8,96,-36,73 2 33 exclam
+" 380,697,0,177,-90,73 2 34 quotedbl
+dq "
+# 680,681,0,19,-107,19 2 35 numbersign
+sh "
+$ 680,790,164,67,5,67 2 36 dollar
+Do "
+% 880,698,17,69,-56,69 2 37 percent
+& 980,698,17,86,2,73 2 38 ampersand
+' 320,698,0,79,-121,73 2 39 quoteright
+cq "
+( 260,741,135,178,19,73 2 40 parenleft
+) 260,742,134,112,85,73 2 41 parenright
+* 460,698,0,98,-76,73 2 42 asterisk
++ 600,514,0,45,-41,45 0 43 plus
+, 340,185,124,8,-50,8 0 44 comma
+- 280,313,0,89,-9,73 0 45 hyphen
+hy "
+. 340,177,8,6,-56,6 0 46 period
+/ 360,742,106,192,41,73 2 47 slash
+sl "
+0 680,698,17,73,-37,73 2 48 zero
+1 680,681,0,0,-73 2 49 one
+2 680,698,0,44,-17,44 2 50 two
+3 680,698,17,53,-22,53 2 51 three
+4 680,681,0,78,-13,73 2 52 four
+5 680,681,17,39,-28,39 2 53 five
+6 680,698,17,74,-38,73 2 54 six
+7 680,681,0,109,-73,73 2 55 seven
+8 680,698,17,56,-18,56 2 56 eight
+9 680,698,17,82,-21,73 2 57 nine
+: 340,515,8,66,-56,66 0 58 colon
+; 340,515,124,62,-50,62 0 59 semicolon
+< 620,540,9,18,-29,18 0 60 less
+= 600,421,0,45,-41,45 0 61 equal
+> 620,540,9,28,-39,28 0 62 greater
+? 620,698,8,98,-95,73 2 63 question
+@ 780,698,17,60,-30,60 2 64 at
+at "
+A 720,681,0,99,77,73 2 65 A
+B 720,681,0,92,36,73 2 66 B
+C 700,698,17,104,-28,73 2 67 C
+D 760,681,0,95,36,73 2 68 D
+E 720,681,0,107,36,73 2 69 E
+F 660,681,0,153,36,73 2 70 F
+G 760,698,17,118,-27,73 2 71 G
+H 800,681,0,160,36,73 2 72 H
+I 380,681,0,155,36,73 2 73 I
+J 620,681,17,151,42,73 2 74 J
+K 780,681,0,149,36,73 2 75 K
+L 640,681,0,135,36,73 2 76 L
+M 860,681,0,160,36,73 2 77 M
+N 740,681,0,155,36,73 2 78 N
+O 760,698,17,96,-28,73 2 79 O
+P 640,681,0,134,56,73 2 80 P
+Q 760,698,213,95,13,73 3 81 Q
+R 740,681,0,75,36,73 2 82 R
+S 700,698,17,81,-9,73 2 83 S
+T 700,681,0,152,-20,73 2 84 T
+U 740,681,17,165,-62,73 2 85 U
+V 660,681,0,209,-22,73 2 86 V
+W 1000,681,0,140,-22,73 2 87 W
+X 740,681,0,145,57,73 2 88 X
+Y 660,681,0,207,-22,73 2 89 Y
+Z 680,681,0,110,27,73 2 90 Z
+[ 260,741,118,164,41,73 2 91 bracketleft
+lB "
+\ 580,741,0,45,-23,45 2 92 backslash
+rs "
+] 260,741,118,137,68,73 2 93 bracketright
+rB "
+^ 480,749,0,93,-133,73 2 94 circumflex
+a^ "
+_ 500,0,125,50,50,50 0 95 underscore
+` 320,698,0,63,-105,63 2 96 quoteleft
+oq "
+a 680,515,8,105,-34,73 0 97 a
+b 600,732,8,83,-7,73 2 98 b
+c 560,515,8,87,-8,73 0 99 c
+d 680,732,8,84,-10,73 2 100 d
+e 560,515,8,86,-9,73 0 101 e
+f 420,741,213,271,242,73 3 102 f
+g 620,515,213,99,29,73 1 103 g
+h 700,732,8,86,-43,73 2 104 h
+i 380,755,8,90,-33,73 2 105 i
+j 320,755,213,122,210,73 3 106 j
+k 700,732,8,82,-47,73 2 107 k
+l 380,732,8,80,-59,73 2 108 l
+m 960,515,8,86,-33,73 0 109 m
+n 680,515,8,85,-33,73 0 110 n
+o 600,515,8,77,-9,73 0 111 o
+p 660,515,213,72,74,72 1 112 p
+q 620,515,213,70,-10,70 1 113 q
+r 500,515,0,132,-34,73 0 114 r
+s 540,515,8,83,18,73 0 115 s
+t 440,658,8,98,-56,73 2 116 t
+u 680,507,8,90,-33,73 0 117 u
+v 540,515,8,82,-6,73 0 118 v
+w 860,515,8,81,-6,73 0 119 w
+x 620,515,8,84,40,73 0 120 x
+y 600,507,213,92,25,73 1 121 y
+z 560,515,8,76,14,73 0 122 z
+{ 300,742,123,163,1,73 2 123 braceleft
+lC "
+| 620,750,250,0,-253 3 124 bar
+ba "
+} 300,751,114,106,58,73 2 125 braceright
+rC "
+~ 480,709,0,103,-128,73 2 126 tilde
+a~ "
+bq 300,166,112,34,-56,34 0 128 quotesinglbase
+Fo 380,503,0,76,-12,73 0 129 guillemotleft
+Fc 380,503,0,76,-12,73 0 130 guillemotright
+bu 360,511,0,94,-10,73 0 131 bullet
+Fn 680,741,199,113,78,73 2 132 florin
+f/ 120,681,0,312,194,73 2 133 fraction
+%0 1360,698,17,23,-56,23 2 134 perthousand
+dg 420,698,137,96,-39,73 2 135 dagger
+dd 420,698,137,116,-29,73 2 136 daggerdbl
+en 500,311,0,123,10,73 0 137 endash
+em 1000,311,0,123,10,73 0 138 emdash
+fi 820,741,213,80,241,73 3 140 fi
+fl 820,741,213,80,241,73 3 141 fl
+.i 380,507,8,90,-33,73 0 144 dotlessi
+ga 380,771,0,94,-143,73 2 146 grave
+a" 560,775,0,106,-131,73 2 147 hungarumlaut
+a. 380,755,0,35,-117,35 2 148 dotaccent
+ab 460,707,0,106,-127,73 2 149 breve
+ah 480,749,0,93,-133,73 2 150 caron
+ao 360,775,0,96,-135,73 2 151 ring
+ho 320,0,199,23,-8,23 0 152 ogonek
+lq 520,698,0,75,-106,73 2 153 quotedblleft
+rq 520,698,0,90,-121,73 2 154 quotedblright
+oe 920,515,8,91,2,73 0 155 oe
+/l 380,732,8,94,-25,73 2 156 lslash
+Bq 520,166,112,25,-56,25 0 157 quotedblbase
+OE 1180,698,17,115,-44,73 2 158 OE
+/L 640,681,0,134,36,73 2 159 Lslash
+r! 320,515,191,74,-14,73 0 161 exclamdown
+ct 680,718,0,0,-111 2 162 cent
+Po 680,698,17,157,50,73 2 163 sterling
+Cs 680,571,0,7,-98,7 0 164 currency
+Ye 680,681,0,152,-42,73 2 165 yen
+bb 620,675,175,0,-253 2 166 brokenbar
+sc 620,698,137,68,4,68 2 167 section
+ad 520,727,0,99,-130,73 2 168 dieresis
+co 780,698,17,53,-33,53 2 169 copyright
+Of 440,685,0,105,-68,73 2 170 ordfeminine
+fo 220,503,0,79,-12,73 0 171 guilsinglleft
+tno 620,421,0,15,-31,15 0 172 logicalnot
+\- 600,323,0,45,-41,45 0 173 minus
+rg 780,698,17,53,-33,53 2 174 registered
+a- 480,691,0,101,-127,73 2 175 macron
+de 400,698,0,80,-80,73 2 176 degree
+t+- 600,514,0,45,-41,45 0 177 plusminus
+S2 408,698,0,127,-41,73 2 178 twosuperior
+S3 408,698,0,125,-36,73 2 179 threesuperior
+aa 340,771,0,117,-126,73 2 180 acute
+*m 679,507,205,98,-44,73 0 181 mu
+mc "
+ps 680,681,0,85,-87,73 2 182 paragraph
+pc 340,358,0,26,-76,26 0 183 periodcentered
+ac 360,0,220,0,-18 1 184 cedilla
+S1 408,688,0,48,-68,48 2 185 onesuperior
+Om 440,685,0,65,-77,65 2 186 ordmasculine
+fc 220,503,0,79,-12,73 0 187 guilsinglright
+14 1020,681,0,84,-68,73 2 188 onequarter
+12 1020,681,0,66,-68,66 2 189 onehalf
+34 1020,691,0,84,-36,73 2 190 threequarters
+r? 620,515,189,36,-33,36 0 191 questiondown
+`A 720,937,0,99,77,73 2 192 Agrave
+'A 720,937,0,99,77,73 2 193 Aacute
+^A 720,915,0,99,77,73 2 194 Acircumflex
+~A 720,875,0,99,77,73 2 195 Atilde
+:A 720,900,0,99,77,73 2 196 Adieresis
+oA 720,941,0,99,77,73 2 197 Aring
+AE 1140,681,0,117,77,73 2 198 AE
+,C 700,698,220,104,-28,73 3 199 Ccedilla
+`E 720,937,0,107,36,73 2 200 Egrave
+'E 720,937,0,107,36,73 2 201 Eacute
+^E 720,915,0,107,36,73 2 202 Ecircumflex
+:E 720,900,0,107,36,73 2 203 Edieresis
+`I 380,937,0,155,36,73 2 204 Igrave
+'I 380,937,0,157,36,73 2 205 Iacute
+^I 380,915,0,163,36,73 2 206 Icircumflex
+:I 380,900,0,169,36,73 2 207 Idieresis
+-D 760,681,0,95,36,73 2 208 Eth
+~N 740,875,0,155,36,73 2 209 Ntilde
+`O 760,937,17,96,-28,73 2 210 Ograve
+'O 760,937,17,96,-28,73 2 211 Oacute
+^O 760,915,17,96,-28,73 2 212 Ocircumflex
+~O 760,875,17,96,-28,73 2 213 Otilde
+:O 760,900,17,96,-28,73 2 214 Odieresis
+tmu 600,514,0,45,-41,45 0 215 multiply
+/O 760,725,29,137,29,73 2 216 Oslash
+`U 740,937,17,165,-62,73 2 217 Ugrave
+'U 740,937,17,165,-62,73 2 218 Uacute
+^U 740,915,17,165,-62,73 2 219 Ucircumflex
+:U 740,900,17,165,-62,73 2 220 Udieresis
+'Y 660,937,0,207,-22,73 2 221 Yacute
+TP 640,681,0,111,56,73 2 222 Thorn
+ss 660,741,213,92,281,73 3 223 germandbls
+`a 680,771,8,105,-34,73 2 224 agrave
+'a 680,771,8,105,-34,73 2 225 aacute
+^a 680,749,8,105,-34,73 2 226 acircumflex
+~a 680,709,8,105,-34,73 2 227 atilde
+:a 680,734,8,105,-34,73 2 228 adieresis
+oa 680,775,8,105,-34,73 2 229 aring
+ae 880,515,8,83,11,73 0 230 ae
+,c 560,515,220,87,-8,73 1 231 ccedilla
+`e 560,771,8,86,-9,73 2 232 egrave
+'e 560,771,8,86,-9,73 2 233 eacute
+^e 560,749,8,86,-9,73 2 234 ecircumflex
+:e 560,734,8,86,-9,73 2 235 edieresis
+`i 380,771,8,90,-33,73 2 236 igrave
+'i 380,771,8,90,-33,73 2 237 iacute
+^i 380,749,8,103,-33,73 2 238 icircumflex
+:i 380,734,8,149,-33,73 2 239 idieresis
+Sd 600,741,8,112,-9,73 2 240 eth
+~n 680,709,8,85,-33,73 2 241 ntilde
+`o 600,771,8,77,-9,73 2 242 ograve
+'o 600,771,8,77,-9,73 2 243 oacute
+^o 600,749,8,77,-9,73 2 244 ocircumflex
+~o 600,709,8,77,-9,73 2 245 otilde
+:o 600,734,8,77,-9,73 2 246 odieresis
+tdi 600,521,0,45,-41,45 0 247 divide
+/o 600,571,54,111,33,73 0 248 oslash
+`u 680,771,8,90,-33,73 2 249 ugrave
+'u 680,771,8,90,-33,73 2 250 uacute
+^u 680,749,8,90,-33,73 2 251 ucircumflex
+:u 680,734,8,90,-33,73 2 252 udieresis
+'y 600,771,213,92,25,73 3 253 yacute
+Tp 660,732,213,72,74,72 3 254 thorn
+:y 600,734,213,92,25,73 3 255 ydieresis
+u2026 1000,177,8,0,-36 0 256 ellipsis
diff --git a/font/devps/BMI b/font/devps/BMI
new file mode 100644
index 0000000..e78f03d
--- /dev/null
+++ b/font/devps/BMI
@@ -0,0 +1,648 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName ITC Bookman Light Italic
+# Version 003.001
+# FamilyName ITC Bookman
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.ITC Bookman is a registered trademark of International Typeface Corporation.
+# Comment Copyright (c) 1985, 1987, 1989, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:30:03 1999
+# Comment UniqueID 44720
+# Comment VMusage 36234 43170
+
+name BMI
+internalname Bookman-LightItalic
+slant 10
+spacewidth 300
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A T -5
+A V -78
+A W -73
+A Y -62
+A 'Y -62
+A :Y -62
+'A T -5
+'A V -78
+'A W -73
+'A Y -62
+'A 'Y -62
+'A :Y -62
+^A T -5
+^A V -78
+^A W -73
+^A Y -62
+^A 'Y -62
+^A :Y -62
+:A T -5
+:A V -78
+:A W -73
+:A Y -62
+:A 'Y -62
+:A :Y -62
+`A T -5
+`A V -78
+`A W -73
+`A Y -62
+`A 'Y -62
+`A :Y -62
+oA T -5
+oA V -78
+oA W -73
+oA Y -62
+oA 'Y -62
+oA :Y -62
+~A T -5
+~A V -78
+~A W -73
+~A Y -62
+~A 'Y -62
+~A :Y -62
+F A -16
+F 'A -16
+F ^A -16
+F :A -16
+F `A -16
+F oA -16
+F ~A -16
+F , -98
+F . -97
+F u2026 -97
+L V 4
+L W 9
+L Y 7
+L 'Y 7
+L :Y 7
+L y 20
+L 'y 20
+L :y 20
+/L V 4
+/L W 9
+/L Y 7
+/L 'Y 7
+/L :Y 7
+/L y 20
+/L 'y 20
+/L :y 20
+P A -30
+P 'A -30
+P ^A -30
+P :A -30
+P `A -30
+P oA -30
+P ~A -30
+P , -106
+P . -105
+P u2026 -105
+R T 65
+R V 2
+R W 2
+R Y 11
+R 'Y 11
+R :Y 11
+T A -14
+T 'A -14
+T ^A -14
+T :A -14
+T `A -14
+T oA -14
+T ~A -14
+T a 9
+T 'a 9
+T ^a 9
+T :a 9
+T `a 9
+T oa 9
+T ~a 9
+T c 16
+T ,c 16
+T : 48
+T , -79
+T e 10
+T 'e 10
+T ^e 10
+T :e 10
+T `e 10
+T - 20
+T hy 20
+T i 71
+T 'i 71
+T ^i 71
+T :i 71
+T `i 71
+T o 14
+T 'o 14
+T ^o 14
+T :o 14
+T `o 14
+T /o 14
+T ~o 14
+T . -78
+T u2026 -78
+T r 67
+T s -7
+T vs -7
+T ; 48
+V A -70
+V 'A -70
+V ^A -70
+V :A -70
+V `A -70
+V oA -70
+V ~A -70
+V a -70
+V 'a -70
+V ^a -70
+V :a -70
+V `a -70
+V oa -70
+V ~a -70
+V : -35
+V , -109
+V e -70
+V 'e -70
+V ^e -70
+V :e -70
+V `e -70
+V - 20
+V hy 20
+V i 3
+V 'i 3
+V ^i 3
+V :i 13
+V `i 13
+V o -70
+V 'o -70
+V ^o -70
+V :o -70
+V `o -70
+V /o -70
+V ~o -70
+V . -100
+V u2026 -100
+V r -20
+V ; -44
+V u -10
+V 'u -10
+V ^u -10
+V :u -10
+V `u -10
+V y -14
+V 'y -14
+V :y -14
+W A -60
+W 'A -60
+W ^A -60
+W :A -60
+W `A -60
+W oA -60
+W ~A -60
+W a -60
+W 'a -60
+W ^a -60
+W :a -60
+W `a -60
+W oa -60
+W ~a -60
+W : -35
+W , -109
+W e -60
+W 'e -60
+W ^e -60
+W :e -60
+W `e -60
+W - 20
+W hy 20
+W i 3
+W 'i 3
+W ^i 13
+W :i 13
+W `i 13
+W o -60
+W 'o -60
+W ^o -60
+W :o -60
+W `o -60
+W /o -60
+W ~o -60
+W . -100
+W u2026 -100
+W r -30
+W ; -42
+W u -20
+W 'u -20
+W ^u -20
+W :u -20
+W `u -20
+W y -14
+W 'y -14
+W :y -14
+Y A -82
+Y 'A -82
+Y ^A -82
+Y :A -82
+Y `A -82
+Y oA -82
+Y ~A -82
+Y a -79
+Y 'a -79
+Y ^a -79
+Y :a -79
+Y `a -79
+Y oa -79
+Y ~a -79
+Y : -35
+Y , -109
+Y e -78
+Y 'e -78
+Y ^e -78
+Y :e -78
+Y `e -78
+Y - 20
+Y hy 20
+Y i -11
+Y 'i -11
+Y o -75
+Y 'o -75
+Y ^o -75
+Y :o -75
+Y `o -75
+Y /o -75
+Y ~o -75
+Y p -37
+Y . -100
+Y u2026 -100
+Y q -72
+Y ; -40
+Y u -31
+Y 'u -31
+Y ^u -31
+Y :u -31
+Y `u -31
+Y v -19
+'Y A -82
+'Y 'A -82
+'Y ^A -82
+'Y :A -82
+'Y `A -82
+'Y oA -82
+'Y ~A -82
+'Y a -79
+'Y 'a -79
+'Y ^a -79
+'Y :a -79
+'Y `a -79
+'Y oa -79
+'Y ~a -79
+'Y : -35
+'Y , -109
+'Y e -78
+'Y 'e -78
+'Y ^e -78
+'Y :e -78
+'Y `e -78
+'Y - 20
+'Y hy 20
+'Y i -11
+'Y 'i -11
+'Y o -75
+'Y 'o -75
+'Y ^o -75
+'Y :o -75
+'Y `o -75
+'Y /o -75
+'Y ~o -75
+'Y p -37
+'Y . -100
+'Y u2026 -100
+'Y q -72
+'Y ; -40
+'Y u -31
+'Y 'u -31
+'Y ^u -31
+'Y :u -31
+'Y `u -31
+'Y v -19
+:Y A -82
+:Y 'A -82
+:Y ^A -82
+:Y :A -82
+:Y `A -82
+:Y oA -82
+:Y ~A -82
+:Y a -79
+:Y 'a -79
+:Y ^a -79
+:Y :a -79
+:Y `a -79
+:Y oa -79
+:Y ~a -79
+:Y : -35
+:Y , -109
+:Y e -78
+:Y 'e -78
+:Y ^e -78
+:Y :e -78
+:Y `e -78
+:Y - 20
+:Y hy 20
+:Y i -11
+:Y 'i -11
+:Y o -75
+:Y 'o -75
+:Y ^o -75
+:Y :o -75
+:Y `o -75
+:Y /o -75
+:Y ~o -75
+:Y p -37
+:Y . -100
+:Y u2026 -100
+:Y q -72
+:Y ; -40
+:Y u -31
+:Y 'u -31
+:Y ^u -31
+:Y :u -31
+:Y `u -31
+:Y v -19
+f f -19
+r c -8
+r ,c -8
+r , -143
+r d -9
+r e -15
+r 'e -15
+r ^e -15
+r :e -15
+r `e -15
+r f -9
+r g -3
+r h -20
+r - 20
+r hy 20
+r m 37
+r n 38
+r ~n 38
+r o -10
+r 'o -10
+r ^o -10
+r :o -10
+r `o -10
+r /o -10
+r ~o -10
+r . -134
+r u2026 -134
+r q -14
+
+charset
+ha 600,681,0,49,-47,49 2 0 asciicircum
+ti 600,386,0,45,-41,45 0 1 asciitilde
+vS 640,861,17,78,-11,70 2 2 Scaron
+vZ 580,861,0,165,42,70 2 3 Zcaron
+vs 540,684,8,61,-15,61 2 4 scaron
+vz 520,684,8,91,12,70 2 5 zcaron
+:Y 660,865,0,199,-37,70 2 6 Ydieresis
+tm 980,681,0,35,-19,35 2 7 trademark
+aq 200,698,0,97,-49,70 2 8 quotesingle
+Eu 620,698,17,125,8,70 2 9 Euro
+space 300 0 32 space
+! 320,698,8,72,-53,70 2 33 exclam
+" 360,699,0,92,-57,70 2 34 quotedbl
+dq "
+# 620,681,0,28,-57,28 2 35 numbersign
+sh "
+$ 620,762,85,49,-28,49 2 36 dollar
+Do "
+% 800,691,8,61,-6,61 2 37 percent
+& 820,698,18,78,-15,70 2 38 ampersand
+' 280,698,0,58,-98,58 2 39 quoteright
+cq "
+( 280,727,146,153,-46,70 2 40 parenleft
+) 280,727,146,49,58,49 2 41 parenright
+* 440,698,0,115,-89,70 2 42 asterisk
++ 600,548,0,45,-41,45 0 43 plus
+, 300,112,115,0,-38 0 44 comma
+- 320,325,0,66,-28,66 0 45 hyphen
+hy "
+. 300,127,8,0,-46 0 46 period
+/ 600,717,149,12,-54,12 2 47 slash
+sl "
+0 620,698,17,76,-36,70 2 48 zero
+1 620,681,0,0,-104 2 49 one
+2 620,698,0,66,-16,66 2 50 two
+3 620,698,17,52,-5,52 2 51 three
+4 620,681,0,64,-19,64 2 52 four
+5 620,681,17,44,-20,44 2 53 five
+6 620,698,17,87,-39,70 2 54 six
+7 620,681,0,102,-93,70 2 55 seven
+8 620,698,17,85,-11,70 2 56 eight
+9 620,698,17,79,-27,70 2 57 nine
+: 300,494,8,42,-46,42 0 58 colon
+; 300,494,114,42,-38,42 0 59 semicolon
+< 600,561,0,38,-29,38 0 60 less
+= 600,433,0,45,-41,45 0 61 equal
+> 600,561,0,52,-43,52 0 62 greater
+? 540,698,8,114,-64,70 2 63 question
+@ 780,698,17,72,-52,70 2 64 at
+at "
+A 700,681,0,70,75,70 2 65 A
+B 720,681,0,76,29,70 2 66 B
+C 720,698,17,76,-38,70 2 67 C
+D 740,681,0,92,29,70 2 68 D
+E 680,681,0,106,29,70 2 69 E
+F 620,681,0,173,29,70 2 70 F
+G 760,698,17,103,-38,70 2 71 G
+H 800,681,0,138,29,70 2 72 H
+I 320,681,0,142,29,70 2 73 I
+J 560,681,17,156,52,70 2 74 J
+K 720,681,0,134,29,70 2 75 K
+L 580,681,0,126,29,70 2 76 L
+M 860,681,0,146,32,70 2 77 M
+N 720,681,0,153,32,70 2 78 N
+O 760,698,17,89,-38,70 2 79 O
+P 600,681,0,131,29,70 2 80 P
+Q 780,698,191,82,-11,70 2 81 Q
+R 700,681,0,86,29,70 2 82 R
+S 640,698,17,78,-11,70 2 83 S
+T 600,681,0,175,0,70 2 84 T
+U 720,681,17,172,-68,70 2 85 U
+V 680,681,0,185,-37,70 2 86 V
+W 960,681,0,185,-37,70 2 87 W
+X 700,681,0,165,75,70 2 88 X
+Y 660,681,0,199,-37,70 2 89 Y
+Z 580,681,0,165,42,70 2 90 Z
+[ 260,717,136,141,-6,70 2 91 bracketleft
+lB "
+\ 600,717,0,0,-34 2 92 backslash
+rs "
+] 260,717,136,99,35,70 2 93 bracketright
+rB "
+^ 440,685,0,89,-126,70 2 94 circumflex
+a^ "
+_ 500,0,125,50,50,50 0 95 underscore
+` 280,698,0,100,-141,70 2 96 quoteleft
+oq "
+a 620,494,8,116,-21,70 0 97 a
+b 600,717,8,71,-38,70 2 98 b
+c 480,494,8,92,-15,70 0 99 c
+d 640,717,8,105,-15,70 2 100 d
+e 540,494,8,85,-15,70 0 101 e
+f 340,725,218,267,210,70 3 102 f
+g 560,494,221,71,46,70 1 103 g
+h 620,717,8,119,-38,70 2 104 h
+i 280,663,8,121,-38,70 2 105 i
+j 280,663,221,78,250,70 3 106 j
+k 600,717,8,107,-38,70 2 107 k
+l 280,717,8,112,-50,70 2 108 l
+m 880,494,8,122,-38,70 0 109 m
+n 620,494,8,103,-38,70 0 110 n
+o 540,494,8,82,-15,70 0 111 o
+p 600,494,212,70,74,70 1 112 p
+q 560,494,212,74,-15,70 1 113 q
+r 400,494,0,131,-38,70 0 114 r
+s 540,494,8,57,-15,57 0 115 s
+t 340,664,8,121,-38,70 2 116 t
+u 620,484,8,116,-38,70 0 117 u
+v 540,494,8,72,-38,70 0 118 v
+w 880,494,8,63,-38,63 0 119 w
+x 540,494,8,136,41,70 0 120 x
+y 600,484,221,59,-10,59 1 121 y
+z 520,494,8,91,12,70 0 122 z
+{ 360,717,191,132,-72,70 2 123 braceleft
+lC "
+| 600,750,250,0,-244 3 124 bar
+ba "
+} 380,717,191,3,37,3 2 125 braceright
+rC "
+~ 440,671,0,98,-130,70 2 126 tilde
+a~ "
+bq 320,113,114,0,-37 0 128 quotesinglbase
+Fo 300,434,0,63,-20,63 0 129 guillemotleft
+Fc 300,434,0,53,-10,53 0 130 guillemotright
+bu 460,511,0,34,-50,34 0 131 bullet
+Fn 620,725,218,122,76,70 3 132 florin
+f/ 20,681,0,353,278,70 2 133 fraction
+%0 1180,691,8,69,-6,69 2 134 perthousand
+dg 620,698,130,0,-142 2 135 dagger
+dd 620,698,122,0,-94 2 136 daggerdbl
+en 500,325,0,111,17,70 0 137 endash
+em 1000,325,0,111,17,70 0 138 emdash
+fi 640,725,222,119,209,70 3 140 fi
+fl 660,725,218,103,209,70 3 141 fl
+.i 280,484,8,121,-38,70 0 144 dotlessi
+ga 340,706,0,87,-132,70 2 146 grave
+a" 340,694,0,230,-138,70 2 147 hungarumlaut
+a. 260,693,0,100,-139,70 2 148 dotaccent
+ab 440,680,0,110,-141,70 2 149 breve
+ah 440,684,0,131,-168,70 2 150 caron
+ao 300,706,0,84,-128,70 2 151 ring
+ho 260,0,153,72,-21,70 0 152 ogonek
+lq 440,698,0,103,-141,70 2 153 quotedblleft
+rq 440,698,0,61,-98,61 2 154 quotedblright
+oe 900,494,8,98,-15,70 0 155 oe
+/l 340,717,8,83,17,70 2 156 lslash
+Bq 480,113,114,0,-37 0 157 quotedblbase
+OE 1180,698,17,107,-38,70 2 158 OE
+/L 580,681,0,126,29,70 2 159 Lslash
+r! 320,494,213,31,-23,31 1 161 exclamdown
+ct 620,715,29,26,-98,26 2 162 cent
+Po 620,698,17,132,46,70 2 163 sterling
+Cs 620,591,0,35,-50,35 0 164 currency
+Ye 620,681,0,165,-21,70 2 165 yen
+bb 600,675,175,0,-244 2 166 brokenbar
+sc 620,698,178,68,12,68 2 167 section
+ad 420,661,0,97,-135,70 0 168 dieresis
+co 740,698,17,94,-34,70 2 169 copyright
+Of 440,698,0,123,-80,70 2 170 ordfeminine
+fo 180,434,0,78,-25,70 0 171 guilsinglleft
+tno 600,433,0,45,-41,45 0 172 logicalnot
+\- 600,335,0,45,-41,45 0 173 minus
+rg 740,698,17,94,-34,70 2 174 registered
+a- 440,658,0,94,-128,70 0 175 macron
+de 400,698,0,70,-70,70 2 176 degree
+t+- 600,548,0,45,-41,45 0 177 plusminus
+S2 372,698,0,117,-18,70 2 178 twosuperior
+S3 372,698,0,117,-20,70 2 179 threesuperior
+aa 320,706,0,133,-158,70 2 180 acute
+*m 640,484,205,79,-48,70 0 181 mu
+mc "
+ps 620,681,0,148,-62,70 2 182 paragraph
+pc 300,364,0,22,-87,22 0 183 periodcentered
+ac 320,0,178,0,5 0 184 cedilla
+S1 372,688,0,17,-64,17 2 185 onesuperior
+Om 400,698,0,105,-89,70 2 186 ordmasculine
+fc 180,434,0,73,-20,70 0 187 guilsinglright
+14 930,681,0,33,-41,33 2 188 onequarter
+12 930,681,0,45,-41,45 2 189 onehalf
+34 930,691,0,33,-49,33 2 190 threequarters
+r? 540,494,212,18,32,18 1 191 questiondown
+`A 700,883,0,70,75,70 2 192 Agrave
+'A 700,883,0,70,75,70 2 193 Aacute
+^A 700,862,0,70,75,70 2 194 Acircumflex
+~A 700,848,0,70,75,70 2 195 Atilde
+:A 700,865,0,70,75,70 2 196 Adieresis
+oA 700,883,0,70,75,70 2 197 Aring
+AE 1220,681,0,99,95,70 2 198 AE
+,C 720,698,178,76,-38,70 2 199 Ccedilla
+`E 680,883,0,106,29,70 2 200 Egrave
+'E 680,883,0,106,29,70 2 201 Eacute
+^E 680,862,0,106,29,70 2 202 Ecircumflex
+:E 680,865,0,106,29,70 2 203 Edieresis
+`I 320,883,0,142,29,70 2 204 Igrave
+'I 320,883,0,163,29,70 2 205 Iacute
+^I 320,862,0,179,29,70 2 206 Icircumflex
+:I 320,865,0,177,29,70 2 207 Idieresis
+-D 740,681,0,92,29,70 2 208 Eth
+~N 720,848,0,153,32,70 2 209 Ntilde
+`O 760,883,17,89,-38,70 2 210 Ograve
+'O 760,883,17,89,-38,70 2 211 Oacute
+^O 760,862,17,89,-38,70 2 212 Ocircumflex
+~O 760,848,17,89,-38,70 2 213 Otilde
+:O 760,865,17,89,-38,70 2 214 Odieresis
+tmu 600,548,0,45,-41,45 0 215 multiply
+/O 760,777,95,89,-38,70 2 216 Oslash
+`U 720,883,17,172,-68,70 2 217 Ugrave
+'U 720,883,17,172,-68,70 2 218 Uacute
+^U 720,862,17,172,-68,70 2 219 Ucircumflex
+:U 720,865,17,172,-68,70 2 220 Udieresis
+'Y 660,883,0,199,-37,70 2 221 Yacute
+TP 600,681,0,106,29,70 2 222 Thorn
+ss 620,698,111,83,171,70 2 223 germandbls
+`a 620,706,8,116,-21,70 2 224 agrave
+'a 620,706,8,116,-21,70 2 225 aacute
+^a 620,685,8,116,-21,70 2 226 acircumflex
+~a 620,671,8,116,-21,70 2 227 atilde
+:a 620,688,8,116,-21,70 2 228 adieresis
+oa 620,706,8,116,-21,70 2 229 aring
+ae 880,494,8,88,-21,70 0 230 ae
+,c 480,494,178,92,-15,70 0 231 ccedilla
+`e 540,706,8,85,-15,70 2 232 egrave
+'e 540,706,8,85,-15,70 2 233 eacute
+^e 540,685,8,85,-15,70 2 234 ecircumflex
+:e 540,688,8,85,-15,70 2 235 edieresis
+`i 280,706,8,121,-38,70 2 236 igrave
+'i 280,706,8,133,-38,70 2 237 iacute
+^i 280,685,8,149,-26,70 2 238 icircumflex
+:i 280,688,8,147,-38,70 2 239 idieresis
+Sd 540,725,8,152,-15,70 2 240 eth
+~n 620,671,8,103,-38,70 2 241 ntilde
+`o 540,706,8,82,-15,70 2 242 ograve
+'o 540,706,8,82,-15,70 2 243 oacute
+^o 540,685,8,82,-15,70 2 244 ocircumflex
+~o 540,671,8,82,-15,70 2 245 otilde
+:o 540,688,8,82,-15,70 2 246 odieresis
+tdi 600,548,0,45,-41,45 0 247 divide
+/o 540,532,49,81,-15,70 0 248 oslash
+`u 620,706,8,116,-38,70 2 249 ugrave
+'u 620,706,8,116,-38,70 2 250 uacute
+^u 620,685,8,116,-38,70 2 251 ucircumflex
+:u 620,688,8,116,-38,70 2 252 udieresis
+'y 600,706,221,59,-10,59 3 253 yacute
+Tp 600,717,212,70,74,70 3 254 thorn
+:y 600,688,221,59,-10,59 3 255 ydieresis
+u2026 1000,127,8,0,-49 0 256 ellipsis
diff --git a/font/devps/BMR b/font/devps/BMR
new file mode 100644
index 0000000..fc1a476
--- /dev/null
+++ b/font/devps/BMR
@@ -0,0 +1,670 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName ITC Bookman Light
+# Version 003.001
+# FamilyName ITC Bookman
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.ITC Bookman is a registered trademark of International Typeface Corporation.
+# Comment Copyright (c) 1985, 1987, 1989, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:27:36 1999
+# Comment UniqueID 44719
+# Comment VMusage 35588 42524
+
+name BMR
+internalname Bookman-Light
+spacewidth 320
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A T 1
+A V -56
+A W -40
+A Y -35
+A 'Y -35
+A :Y -35
+A v 7
+A w 4
+A y 32
+A 'y 32
+A :y 32
+'A T 1
+'A V -56
+'A W -40
+'A Y -35
+'A 'Y -35
+'A :Y -35
+'A v 7
+'A w 4
+'A y 32
+'A 'y 32
+'A :y 32
+^A T 1
+^A V -56
+^A W -40
+^A Y -35
+^A 'Y -35
+^A :Y -35
+^A v 7
+^A w 4
+^A y 32
+^A 'y 32
+^A :y 32
+:A T 1
+:A V -56
+:A W -40
+:A Y -35
+:A 'Y -35
+:A :Y -35
+:A v 7
+:A w 4
+:A y 32
+:A 'y 32
+:A :y 32
+`A T 1
+`A V -56
+`A W -40
+`A Y -35
+`A 'Y -35
+`A :Y -35
+`A v 7
+`A w 4
+`A y 32
+`A 'y 32
+`A :y 32
+oA T 1
+oA V -56
+oA W -40
+oA Y -35
+oA 'Y -35
+oA :Y -35
+oA v 7
+oA w 4
+oA y 32
+oA 'y 32
+oA :y 32
+~A T 1
+~A V -56
+~A W -40
+~A Y -35
+~A 'Y -35
+~A :Y -35
+~A v 7
+~A w 4
+~A y 32
+~A 'y 32
+~A :y 32
+F A -21
+F 'A -21
+F ^A -21
+F :A -21
+F `A -21
+F oA -21
+F ~A -21
+F , -41
+F . -46
+F u2026 -46
+L T 28
+L V -4
+L W 1
+L Y 13
+L 'Y 13
+L :Y 13
+L y 79
+L 'y 79
+L :y 79
+/L T 28
+/L V -4
+/L W 1
+/L Y 13
+/L 'Y 13
+/L :Y 13
+/L y 79
+/L 'y 79
+/L :y 79
+P A -8
+P 'A -8
+P ^A -8
+P :A -8
+P `A -8
+P oA -8
+P ~A -8
+P , -55
+P . -60
+P u2026 -60
+R T 71
+R V 8
+R W 13
+R Y 26
+R 'Y 26
+R :Y 26
+R y 59
+R 'y 59
+R :y 59
+T A 1
+T 'A 1
+T ^A 1
+T :A 1
+T `A 1
+T oA 1
+T ~A 1
+T a 17
+T 'a 17
+T ^a 17
+T :a 17
+T `a 17
+T oa 17
+T ~a 17
+T c 14
+T ,c 14
+T , -28
+T e 13
+T 'e 13
+T ^e 13
+T :e 13
+T `e 13
+T - 90
+T hy 90
+T i 42
+T 'i 42
+T ^i 42
+T :i 42
+T `i 42
+T o 15
+T 'o 15
+T ^o 15
+T :o 15
+T `o 15
+T /o 15
+T ~o 15
+T . -33
+T u2026 -33
+T r 38
+T s 16
+T vs 16
+V A -66
+V 'A -66
+V ^A -66
+V :A -66
+V `A -66
+V oA -66
+V ~A -66
+V a -69
+V 'a -69
+V ^a -69
+V :a -69
+V `a -69
+V oa -69
+V ~a -69
+V , -34
+V e -72
+V 'e -72
+V ^e -72
+V :e -72
+V `e -72
+V - 11
+V hy 11
+V i -20
+V 'i -20
+V o -71
+V 'o -71
+V ^o -71
+V :o -71
+V `o -71
+V /o -71
+V ~o -71
+V . -40
+V u2026 -40
+V r -41
+V u -38
+V 'u -38
+V ^u -38
+V :u -38
+V `u -38
+V y 15
+V 'y 15
+V :y 15
+W A -64
+W 'A -64
+W ^A -64
+W :A -64
+W `A -64
+W oA -64
+W ~A -64
+W a -66
+W 'a -66
+W ^a -66
+W :a -66
+W `a -66
+W oa -66
+W ~a -66
+W , -34
+W e -69
+W 'e -69
+W ^e -69
+W :e -69
+W `e -69
+W - 11
+W hy 11
+W i -20
+W 'i -20
+W o -68
+W 'o -68
+W ^o -68
+W :o -68
+W `o -68
+W /o -68
+W ~o -68
+W . -40
+W u2026 -40
+W r -41
+W u -38
+W 'u -38
+W ^u -38
+W :u -38
+W `u -38
+W y 15
+W 'y 15
+W :y 15
+Y A -53
+Y 'A -53
+Y ^A -53
+Y :A -53
+Y `A -53
+Y oA -53
+Y ~A -53
+Y a -54
+Y 'a -54
+Y ^a -54
+Y :a -54
+Y `a -54
+Y oa -54
+Y ~a -54
+Y , -34
+Y e -58
+Y 'e -58
+Y ^e -58
+Y :e -58
+Y `e -58
+Y - 11
+Y hy 11
+Y i -37
+Y 'i -37
+Y ^i -37
+Y o -57
+Y 'o -57
+Y ^o -57
+Y :o -57
+Y `o -57
+Y /o -57
+Y ~o -57
+Y p -31
+Y . -40
+Y u2026 -40
+Y q -55
+Y u -38
+Y 'u -38
+Y ^u -38
+Y :u -38
+Y `u -38
+Y v 15
+'Y A -53
+'Y 'A -53
+'Y ^A -53
+'Y :A -53
+'Y `A -53
+'Y oA -53
+'Y ~A -53
+'Y a -54
+'Y 'a -54
+'Y ^a -54
+'Y :a -54
+'Y `a -54
+'Y oa -54
+'Y ~a -54
+'Y , -34
+'Y e -58
+'Y 'e -58
+'Y ^e -58
+'Y :e -58
+'Y `e -58
+'Y - 11
+'Y hy 11
+'Y i -37
+'Y 'i -37
+'Y o -57
+'Y 'o -57
+'Y ^o -57
+'Y :o -57
+'Y `o -57
+'Y /o -57
+'Y ~o -57
+'Y p -31
+'Y . -40
+'Y u2026 -40
+'Y q -55
+'Y u -38
+'Y 'u -38
+'Y ^u -38
+'Y :u -38
+'Y `u -38
+'Y v 15
+:Y A -53
+:Y 'A -53
+:Y ^A -53
+:Y :A -53
+:Y `A -53
+:Y oA -53
+:Y ~A -53
+:Y a -54
+:Y 'a -54
+:Y ^a -54
+:Y :a -54
+:Y `a -54
+:Y oa -54
+:Y ~a -54
+:Y , -34
+:Y e -58
+:Y 'e -58
+:Y ^e -58
+:Y :e -58
+:Y `e -58
+:Y - 11
+:Y hy 11
+:Y i -37
+:Y 'i -37
+:Y o -57
+:Y 'o -57
+:Y ^o -57
+:Y :o -57
+:Y `o -57
+:Y /o -57
+:Y ~o -57
+:Y p -31
+:Y . -40
+:Y u2026 -40
+:Y q -55
+:Y u -38
+:Y 'u -38
+:Y ^u -38
+:Y :u -38
+:Y `u -38
+:Y v 15
+f f 29
+r c 7
+r ,c 7
+r , -58
+r d 7
+r e 7
+r 'e 7
+r ^e 7
+r :e 7
+r `e 7
+r f 33
+r g -4
+r h -21
+r - 70
+r hy 70
+r m 31
+r n 31
+r ~n 31
+r o 8
+r 'o 8
+r ^o 8
+r :o 8
+r `o 8
+r /o 8
+r ~o 8
+r . -64
+r u2026 -64
+r q 9
+
+charset
+ha 600,681 2 0 asciicircum
+ti 600,352 0 1 asciitilde
+vS 660,849,17 2 2 Scaron
+vZ 640,849,0,16 2 3 Zcaron
+vs 520,672,8 2 4 scaron
+vz 480,672 2 5 zcaron
+:Y 640,851,0,26,30 2 6 Ydieresis
+tm 980,681 2 7 trademark
+aq 220,698 2 8 quotesingle
+Eu 620,698,17 2 9 Euro
+space 320 0 32 space
+! 300,698,8 2 33 exclam
+" 380,698 2 34 quotedbl
+dq "
+# 620,681 2 35 numbersign
+sh "
+$ 620,791,109 2 36 dollar
+Do "
+% 900,698,8 2 37 percent
+& 800,698,17 2 38 ampersand
+' 220,698 2 39 quoteright
+cq "
+( 300,727,145 2 40 parenleft
+) 300,727,146 2 41 parenright
+* 440,698 2 42 asterisk
++ 600,513 0 43 plus
+, 320,114,114 0 44 comma
+- 400,292 0 45 hyphen
+hy "
+. 320,123,8 0 46 period
+/ 600,717,149 2 47 slash
+sl "
+0 620,698,17 2 48 zero
+1 620,681 2 49 one
+2 620,698 2 50 two
+3 620,698,17 2 51 three
+4 620,681 2 52 four
+5 620,717,17 2 53 five
+6 620,698,17 2 54 six
+7 620,681 2 55 seven
+8 620,698,17 2 56 eight
+9 620,698,17 2 57 nine
+: 320,494,8 0 58 colon
+; 320,494,114 0 59 semicolon
+< 600,526,2 0 60 less
+= 600,398 0 61 equal
+> 600,526,2 0 62 greater
+? 540,698,8 2 63 question
+@ 820,698,17 2 64 at
+at "
+A 680,681,0,34,37 2 65 A
+B 740,681 2 66 B
+C 740,698,17 2 67 C
+D 800,681 2 68 D
+E 720,681 2 69 E
+F 640,681,0,14 2 70 F
+G 800,698,17 2 71 G
+H 800,681 2 72 H
+I 340,681 2 73 I
+J 600,681,17,0,23 2 74 J
+K 720,681,0,30 2 75 K
+L 600,681,0,29 2 76 L
+M 920,681 2 77 M
+N 740,681 2 78 N
+O 800,698,17 2 79 O
+P 620,681 2 80 P
+Q 820,698,189 2 81 Q
+R 720,681,0,37 2 82 R
+S 660,698,17 2 83 S
+T 620,681,0,36,37 2 84 T
+U 780,681,17 2 85 U
+V 700,681,0,25,30 2 86 V
+W 960,681,0,24,30 2 87 W
+X 720,681,0,35,30 2 88 X
+Y 640,681,0,26,30 2 89 Y
+Z 640,681,0,16 2 90 Z
+[ 300,717,136 2 91 bracketleft
+lB "
+\ 600,717 2 92 backslash
+rs "
+] 300,717,136 2 93 bracketright
+rB "
+^ 420,685 2 94 circumflex
+a^ "
+_ 500,0,125 0 95 underscore
+` 220,698 2 96 quoteleft
+oq "
+a 580,494,8,7 0 97 a
+b 620,717,8,0,2 2 98 b
+c 520,494,8 0 99 c
+d 620,717,8 2 100 d
+e 520,494,8 0 101 e
+f 320,734,0,94 2 102 f
+g 540,567,243,2 1 103 g
+h 660,717 2 104 h
+i 300,654 0 105 i
+j 300,654,251,0,109 1 106 j
+k 620,717,0,8 2 107 k
+l 300,717 2 108 l
+m 940,494 0 109 m
+n 660,494 0 110 n
+o 560,494,8 0 111 o
+p 620,494,228 1 112 p
+q 580,494,228,9 1 113 q
+r 440,494,0,7 0 114 r
+s 520,494,8 0 115 s
+t 380,667,8,8 2 116 t
+u 680,484,8 0 117 u
+v 520,484,0,14,23 0 118 v
+w 780,484,0,24,19 0 119 w
+x 560,484,0,16,16 0 120 x
+y 540,484,236,9,23 1 121 y
+z 480,484 0 122 z
+{ 280,717,136 2 123 braceleft
+lC "
+| 600,750,250 3 124 bar
+ba "
+} 280,717,136 2 125 braceright
+rC "
+~ 440,661 0 126 tilde
+a~ "
+bq 220,110,108 0 128 quotesinglbase
+Fo 360,437 0 129 guillemotleft
+Fc 360,437 0 130 guillemotright
+bu 460,511 0 131 bullet
+Fn 620,749,155,13,29 2 132 florin
+f/ 140,681,0,195,188 2 133 fraction
+%0 1280,698,8 2 134 perthousand
+dg 540,698,156 2 135 dagger
+dd 540,698,156 2 136 daggerdbl
+en 500,292,0,15,15 0 137 endash
+em 1000,292,0,15,15 0 138 emdash
+fi 620,734 2 140 fi
+fl 620,734 2 141 fl
+.i 300,484 0 144 dotlessi
+ga 340,689 2 146 grave
+a" 380,698 2 147 hungarumlaut
+a. 260,684 2 148 dotaccent
+ab 460,687 2 149 breve
+ah 420,672 2 150 caron
+ao 320,731 2 151 ring
+ho 320,0,153 0 152 ogonek
+lq 400,698 2 153 quotedblleft
+rq 400,698 2 154 quotedblright
+oe 900,494,8 0 155 oe
+/l 320,717 2 156 lslash
+Bq 400,110,108 0 157 quotedblbase
+OE 1240,698,17 2 158 OE
+/L 600,681,0,29 2 159 Lslash
+r! 300,494,214 0 161 exclamdown
+ct 620,651 0 162 cent
+Po 620,698,17,11 2 163 sterling
+Cs 620,591 0 164 currency
+Ye 620,681,0,27,22 2 165 yen
+bb 600,675,175 2 166 brokenbar
+sc 520,698,178 2 167 section
+ad 420,655 0 168 dieresis
+co 740,698,17 2 169 copyright
+Of 420,698 2 170 ordfeminine
+fo 240,437 0 171 guilsinglleft
+tno 600,398 0 172 logicalnot
+\- 600,300 0 173 minus
+rg 740,698,17 2 174 registered
+a- 440,635 0 175 macron
+de 400,698 2 176 degree
+t+- 600,513 0 177 plusminus
+S2 372,698 2 178 twosuperior
+S3 372,698 2 179 threesuperior
+aa 340,689 2 180 acute
+*m 627,484,205 0 181 mu
+mc "
+ps 600,681 2 182 paragraph
+pc 320,327 0 183 periodcentered
+ac 320,0,200 0 184 cedilla
+S1 372,688 2 185 onesuperior
+Om 420,698 2 186 ordmasculine
+fc 240,437 0 187 guilsinglright
+14 930,681 2 188 onequarter
+12 930,681 2 189 onehalf
+34 930,691 2 190 threequarters
+r? 540,494,217 0 191 questiondown
+`A 680,866,0,34,37 2 192 Agrave
+'A 680,866,0,34,37 2 193 Aacute
+^A 680,862,0,34,37 2 194 Acircumflex
+~A 680,838,0,34,37 2 195 Atilde
+:A 680,851,0,34,37 2 196 Adieresis
+oA 680,908,0,34,37 2 197 Aring
+AE 1260,681,0,0,36 2 198 AE
+,C 740,698,200 2 199 Ccedilla
+`E 720,866 2 200 Egrave
+'E 720,866 2 201 Eacute
+^E 720,862 2 202 Ecircumflex
+:E 720,851 2 203 Edieresis
+`I 340,866 2 204 Igrave
+'I 340,866 2 205 Iacute
+^I 340,862 2 206 Icircumflex
+:I 340,851 2 207 Idieresis
+-D 800,681 2 208 Eth
+~N 740,838 2 209 Ntilde
+`O 800,866,17 2 210 Ograve
+'O 800,866,17 2 211 Oacute
+^O 800,862,17 2 212 Ocircumflex
+~O 800,838,17 2 213 Otilde
+:O 800,851,17 2 214 Odieresis
+tmu 600,513 0 215 multiply
+/O 800,733,53 2 216 Oslash
+`U 780,866,17 2 217 Ugrave
+'U 780,866,17 2 218 Uacute
+^U 780,862,17 2 219 Ucircumflex
+:U 780,851,17 2 220 Udieresis
+'Y 640,866,0,26,30 2 221 Yacute
+TP 620,681 2 222 Thorn
+ss 660,698,110,0,109 2 223 germandbls
+`a 580,689,8,7 2 224 agrave
+'a 580,689,8,7 2 225 aacute
+^a 580,685,8,7 2 226 acircumflex
+~a 580,661,8,7 0 227 atilde
+:a 580,674,8,7 2 228 adieresis
+oa 580,731,8,7 2 229 aring
+ae 860,494,8 0 230 ae
+,c 520,494,200 0 231 ccedilla
+`e 520,689,8 2 232 egrave
+'e 520,689,8 2 233 eacute
+^e 520,685,8 2 234 ecircumflex
+:e 520,674,8 2 235 edieresis
+`i 300,689 2 236 igrave
+'i 300,689 2 237 iacute
+^i 300,685 2 238 icircumflex
+:i 300,674 2 239 idieresis
+Sd 560,734,8 2 240 eth
+~n 660,661 0 241 ntilde
+`o 560,689,8 2 242 ograve
+'o 560,689,8 2 243 oacute
+^o 560,685,8 2 244 ocircumflex
+~o 560,661,8 0 245 otilde
+:o 560,674,8 2 246 odieresis
+tdi 600,514 0 247 divide
+/o 560,534,40 0 248 oslash
+`u 680,689,8 2 249 ugrave
+'u 680,689,8 2 250 uacute
+^u 680,685,8 2 251 ucircumflex
+:u 680,674,8 2 252 udieresis
+'y 540,689,236,9,23 3 253 yacute
+Tp 620,717,228 3 254 thorn
+:y 540,674,236,9,23 3 255 ydieresis
+u2026 1000,123,8 0 256 ellipsis
diff --git a/font/devps/CB b/font/devps/CB
new file mode 100644
index 0000000..c5b1d98
--- /dev/null
+++ b/font/devps/CB
@@ -0,0 +1,266 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Courier Bold
+# Version 004.000
+# FamilyName Courier
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1989, 1990, 1991, 1993, 1996, 1997, 1998 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Copyright (c) 1989, 1990, 1991, 1993, 1996, 1997, 1998 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Wed Aug 26 16:51:38 1998
+# Comment UniqueID 44053
+# Comment VMusage 32181 39117
+
+name CB
+internalname Courier-Bold
+spacewidth 600
+encoding text.enc
+
+charset
+ha 600,750 2 0 asciicircum
+ti 600,311 0 1 asciitilde
+vS 600,811,13 2 2 Scaron
+vZ 600,811 2 3 Zcaron
+vs 600,679,12 2 4 scaron
+vz 600,679 2 5 zcaron
+:Y 600,789 2 6 Ydieresis
+tm 600,678 2 7 trademark
+aq 600,572 2 8 quotesingle
+Eu 600,612,12 2 9 Euro
+space 600 0 32 space
+! 600,572,12 2 33 exclam
+" 600,572 2 34 quotedbl
+dq "
+# 600,649,52 2 35 numbersign
+sh "
+$ 600,646,124 2 36 dollar
+Do "
+% 600,617,33 2 37 percent
+& 600,539,12 0 38 ampersand
+' 600,572 2 39 quoteright
+cq "
+( 600,643,86 2 40 parenleft
+) 600,643,86 2 41 parenright
+* 600,570 2 42 asterisk
++ 600,438 0 43 plus
+, 600,163,100 0 44 comma
+- 600,282 0 45 hyphen
+hy "
+. 600,153,12 0 46 period
+/ 600,696,133 2 47 slash
+sl "
+0 600,612,12 2 48 zero
+1 600,615 2 49 one
+2 600,613 2 50 two
+3 600,612,12 2 51 three
+4 600,613 2 52 four
+5 600,601,12 2 53 five
+6 600,612,12 2 54 six
+7 600,601 2 55 seven
+8 600,613,11 2 56 eight
+9 600,612,14 2 57 nine
+: 600,403,12 0 58 colon
+; 600,403,100 0 59 semicolon
+< 600,446,8 0 60 less
+= 600,339 0 61 equal
+> 600,446,8 0 62 greater
+? 600,582,13 2 63 question
+@ 600,579,18 2 64 at
+at "
+A 600,572 2 65 A
+B 600,572 2 66 B
+C 600,583,12 2 67 C
+D 600,572 2 68 D
+E 600,572 2 69 E
+F 600,572 2 70 F
+G 600,583,12 2 71 G
+H 600,572 2 72 H
+I 600,572 2 73 I
+J 600,572,12 2 74 J
+K 600,572 2 75 K
+L 600,572 2 76 L
+M 600,572,0,12 2 77 M
+N 600,572,0,5 2 78 N
+O 600,583,12 2 79 O
+P 600,572 2 80 P
+Q 600,584,143 2 81 Q
+R 600,572 2 82 R
+S 600,583,13 2 83 S
+T 600,572 2 84 T
+U 600,572,12 2 85 U
+V 600,572,0,1,1 2 86 V
+W 600,572,0,6,2 2 87 W
+X 600,572 2 88 X
+Y 600,572 2 89 Y
+Z 600,572 2 90 Z
+[ 600,643,86 2 91 bracketleft
+lB "
+\ 600,695,133 2 92 backslash
+rs "
+] 600,643,86 2 93 bracketright
+rB "
+^ 600,679 2 94 circumflex
+a^ "
+_ 600,0,249 1 95 underscore
+` 600,572 2 96 quoteleft
+oq "
+a 600,448,12 0 97 a
+b 600,621,12 2 98 b
+c 600,448,12 0 99 c
+d 600,621,12 2 100 d
+e 600,447,12 0 101 e
+f 600,621 2 102 f
+g 600,447,184 1 103 g
+h 600,621 2 104 h
+i 600,642 2 105 i
+j 600,641,184 3 106 j
+k 600,621 2 107 k
+l 600,621 2 108 l
+m 600,447,0,15,15 0 109 m
+n 600,447 0 110 n
+o 600,448,12 0 111 o
+p 600,447,183 1 112 p
+q 600,447,183 1 113 q
+r 600,448 0 114 r
+s 600,448,12 0 115 s
+t 600,567,12 2 116 t
+u 600,434,12 0 117 u
+v 600,434 0 118 v
+w 600,434,0,7,6 0 119 w
+x 600,434 0 120 x
+y 600,434,183 1 121 y
+z 600,434 0 122 z
+{ 600,764,228 3 123 braceleft
+lC "
+| 600,750,249 3 124 bar
+ba "
+} 600,764,228 3 125 braceright
+rC "
+~ 600,644 2 126 tilde
+a~ "
+bq 600,163,100 0 128 quotesinglbase
+Fo 600,423 0 129 guillemotleft
+Fc 600,423 0 130 guillemotright
+bu 600,482 0 131 bullet
+Fn 600,618,119,0,18 2 132 florin
+f/ 600,634,85 2 133 fraction
+%0 600,617,33,97,88 2 134 perthousand
+dg 600,572,44 2 135 dagger
+dd 600,572,42 2 136 daggerdbl
+en 600,282 0 137 endash
+em 600,282 0 138 emdash
+fi 600,642 2 140 fi
+fl 600,621 2 141 fl
+.i 600,434 0 144 dotlessi
+ga 600,678 2 146 grave
+a" 600,710 2 147 hungarumlaut
+a. 600,641 2 148 dotaccent
+ab 600,657 2 149 breve
+ah 600,679 2 150 caron
+ao 600,717 2 151 ring
+ho 600,22,177 0 152 ogonek
+lq 600,572 2 153 quotedblleft
+rq 600,572 2 154 quotedblright
+oe 600,446,12,6 0 155 oe
+/l 600,621 2 156 lslash
+Bq 600,163,101 0 157 quotedblbase
+OE 600,572,0,8 2 158 OE
+/L 600,572 2 159 Lslash
+r! 600,447,136 0 161 exclamdown
+ct 600,605,52 2 162 cent
+Po 600,612,27 2 163 sterling
+Cs 600,605 2 164 currency
+Ye 600,601 2 165 yen
+bb 600,724,224 3 166 brokenbar
+sc 600,584,63 2 167 section
+ad 600,640 2 168 dieresis
+co 600,744 2 169 copyright
+Of 600,612 2 170 ordfeminine
+fo 600,423 0 171 guilsinglleft
+tno 600,358 0 172 logicalnot
+\- 600,266 0 173 minus
+rg 600,744 2 174 registered
+a- 600,591 2 175 macron
+de 600,612 2 176 degree
+t+- 600,438,127 0 177 plusminus
+S2 600,607 2 178 twosuperior
+S3 600,607 2 179 threesuperior
+aa 600,678 2 180 acute
+*m 600,434,167 0 181 mu
+mc "
+ps 600,745,154 2 182 paragraph
+pc 600,386 0 183 periodcentered
+ac 600,0,207 1 184 cedilla
+S1 600,607 2 185 onesuperior
+Om 600,612 2 186 ordmasculine
+fc 600,423 0 187 guilsinglright
+14 600,625,91,45 2 188 onequarter
+12 600,625,91,33,25 2 189 onehalf
+34 600,626,91,24,2 2 190 threequarters
+r? 600,446,149 0 191 questiondown
+`A 600,811 2 192 Agrave
+'A 600,811 2 193 Aacute
+^A 600,811 2 194 Acircumflex
+~A 600,777 2 195 Atilde
+:A 600,789 2 196 Adieresis
+oA 600,800 2 197 Aring
+AE 600,572 2 198 AE
+,C 600,583,204 3 199 Ccedilla
+`E 600,811 2 200 Egrave
+'E 600,811 2 201 Eacute
+^E 600,811 2 202 Ecircumflex
+:E 600,789 2 203 Edieresis
+`I 600,811 2 204 Igrave
+'I 600,811 2 205 Iacute
+^I 600,811 2 206 Icircumflex
+:I 600,789 2 207 Idieresis
+-D 600,572 2 208 Eth
+~N 600,777,0,5 2 209 Ntilde
+`O 600,811,12 2 210 Ograve
+'O 600,811,12 2 211 Oacute
+^O 600,811,12 2 212 Ocircumflex
+~O 600,777,12 2 213 Otilde
+:O 600,789,12 2 214 Odieresis
+tmu 600,441 0 215 multiply
+/O 600,585,19 2 216 Oslash
+`U 600,811,12 2 217 Ugrave
+'U 600,811,12 2 218 Uacute
+^U 600,811,12 2 219 Ucircumflex
+:U 600,789,12 2 220 Udieresis
+'Y 600,811 2 221 Yacute
+TP 600,572 2 222 Thorn
+ss 600,621,12 2 223 germandbls
+`a 600,678,12 2 224 agrave
+'a 600,678,12 2 225 aacute
+^a 600,679,12 2 226 acircumflex
+~a 600,644,12 2 227 atilde
+:a 600,640,12 2 228 adieresis
+oa 600,717,12 2 229 aring
+ae 600,446,12 0 230 ae
+,c 600,448,206 1 231 ccedilla
+`e 600,678,12 2 232 egrave
+'e 600,678,12 2 233 eacute
+^e 600,679,12 2 234 ecircumflex
+:e 600,640,12 2 235 edieresis
+`i 600,678 2 236 igrave
+'i 600,678 2 237 iacute
+^i 600,679 2 238 icircumflex
+:i 600,640 2 239 idieresis
+Sd 600,693,12 2 240 eth
+~n 600,644 2 241 ntilde
+`o 600,678,12 2 242 ograve
+'o 600,678,12 2 243 oacute
+^o 600,679,12 2 244 ocircumflex
+~o 600,644,12 2 245 otilde
+:o 600,640,12 2 246 odieresis
+tdi 600,425 0 247 divide
+/o 600,452,22 0 248 oslash
+`u 600,678,12 2 249 ugrave
+'u 600,678,12 2 250 uacute
+^u 600,679,12 2 251 ucircumflex
+:u 600,640,12 2 252 udieresis
+'y 600,678,183 3 253 yacute
+Tp 600,618,183 3 254 thorn
+:y 600,640,183 3 255 ydieresis
+u2026 600,111,12 0 256 ellipsis
diff --git a/font/devps/CBI b/font/devps/CBI
new file mode 100644
index 0000000..cd87125
--- /dev/null
+++ b/font/devps/CBI
@@ -0,0 +1,267 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Courier Bold Oblique
+# Version 004.000
+# FamilyName Courier
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1989, 1990, 1991, 1993, 1996, 1997, 1998 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Copyright (c) 1989, 1990, 1991, 1993, 1996, 1997, 1998 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Wed Aug 26 16:53:05 1998
+# Comment UniqueID 44055
+# Comment VMusage 11931 56737
+
+name CBI
+internalname Courier-BoldOblique
+slant 11
+spacewidth 600
+encoding text.enc
+
+charset
+ha 600,750,0,57,-146,57 2 0 asciicircum
+ti 600,311,0,24,-64,24 0 1 asciitilde
+vS 600,811,13,112,-21,67 2 2 Scaron
+vZ 600,811,0,102,-26,67 2 3 Zcaron
+vs 600,679,12,92,-34,67 2 4 scaron
+vz 600,679,0,81,-42,67 2 5 zcaron
+:Y 600,789,0,145,-69,67 2 6 Ydieresis
+tm 600,678,0,128,-129,67 2 7 trademark
+aq 600,572,0,0,-246 2 8 quotesingle
+Eu 600,612,12,148,7,67 2 9 Euro
+space 600 0 32 space
+! 600,572,12,0,-172 2 33 exclam
+" 600,572,0,24,-163,24 2 34 quotedbl
+dq "
+# 600,649,52,66,-48,66 2 35 numbersign
+sh "
+$ 600,646,124,54,-58,54 2 36 dollar
+Do "
+% 600,617,33,50,-74,50 2 37 percent
+& 600,539,12,41,-39,41 0 38 ampersand
+' 600,572,0,0,-162 2 39 quoteright
+cq "
+( 600,643,86,59,-259,59 2 40 parenleft
+) 600,643,86,0,-50 2 41 parenright
+* 600,570,0,28,-114,28 2 42 asterisk
++ 600,438,0,19,-67,19 0 43 plus
+, 600,163,100,0,-83 0 44 comma
+- 600,282,0,0,-127 0 45 hyphen
+hy "
+. 600,153,12,0,-168 0 46 period
+/ 600,696,133,108,-4,67 2 47 slash
+sl "
+0 600,612,12,24,-94,24 2 48 zero
+1 600,615,0,0,-44 2 49 one
+2 600,613,0,20,-22,20 2 50 two
+3 600,612,12,0,-27 2 51 three
+4 600,613,0,0,-48 2 52 four
+5 600,601,12,50,-36,50 2 53 five
+6 600,612,12,68,-92,67 2 54 six
+7 600,601,0,52,-106,52 2 55 seven
+8 600,613,11,33,-74,33 2 56 eight
+9 600,612,14,26,-51,26 2 57 nine
+: 600,403,12,0,-168 0 58 colon
+; 600,403,100,0,-83 0 59 semicolon
+< 600,446,8,41,-55,41 0 60 less
+= 600,339,0,31,-52,31 0 61 equal
+> 600,446,8,43,-56,43 0 62 greater
+? 600,582,13,24,-141,24 2 63 question
+@ 600,579,18,100,-15,67 2 64 at
+at "
+A 600,572,0,65,46,65 2 65 A
+B 600,572,0,55,14,55 2 66 B
+C 600,583,12,128,-51,67 2 67 C
+D 600,572,0,79,24,67 2 68 D
+E 600,572,0,113,2,67 2 69 E
+F 600,572,0,120,-13,67 2 70 F
+G 600,583,12,114,-38,67 2 71 G
+H 600,572,0,141,25,67 2 72 H
+I 600,572,0,74,-40,67 2 73 I
+J 600,572,12,151,-15,67 2 74 J
+K 600,572,0,111,20,67 2 75 K
+L 600,572,0,61,-1,61 2 76 L
+M 600,572,0,174,39,67 2 77 M
+N 600,572,0,167,36,67 2 78 N
+O 600,583,12,78,-33,67 2 79 O
+P 600,572,0,74,-10,67 2 80 P
+Q 600,584,143,76,-33,67 2 81 Q
+R 600,572,0,54,4,54 2 82 R
+S 600,583,13,76,-21,67 2 83 S
+T 600,572,0,125,-58,67 2 84 T
+U 600,572,12,160,-63,67 2 85 U
+V 600,572,0,163,-42,67 2 86 V
+W 600,572,0,168,-41,67 2 87 W
+X 600,572,0,119,25,67 2 88 X
+Y 600,572,0,145,-69,67 2 89 Y
+Z 600,572,0,67,-26,67 2 90 Z
+[ 600,643,86,74,-222,67 2 91 bracketleft
+lB "
+\ 600,695,133,0,-156 2 92 backslash
+rs "
+] 600,643,86,0,-34 2 93 bracketright
+rB "
+^ 600,679,0,60,-153,60 2 94 circumflex
+a^ "
+_ 600,0,249,12,99,12 1 95 underscore
+` 600,572,0,0,-271 2 96 quoteleft
+oq "
+a 600,448,12,33,-31,33 0 97 a
+b 600,621,12,50,40,50 2 98 b
+c 600,448,12,48,-46,48 0 99 c
+d 600,621,12,85,-32,67 2 100 d
+e 600,447,12,43,-52,43 0 101 e
+f 600,621,0,107,-62,67 2 102 f
+g 600,447,184,113,12,67 1 103 g
+h 600,621,0,57,11,57 2 104 h
+i 600,642,0,0,-40 2 105 i
+j 600,641,184,0,-4 3 106 j
+k 600,621,0,77,0,67 2 107 k
+l 600,621,0,0,-41 2 108 l
+m 600,447,0,84,65,67 0 109 m
+n 600,447,0,45,25,45 0 110 n
+o 600,448,12,52,-31,52 0 111 o
+p 600,447,183,56,72,56 1 112 p
+q 600,447,183,128,-37,67 1 113 q
+r 600,448,0,86,-20,67 0 114 r
+s 600,448,12,43,-34,43 0 115 s
+t 600,567,12,23,-110,23 2 116 t
+u 600,434,12,42,-38,42 0 117 u
+v 600,434,0,123,-28,67 0 118 v
+w 600,434,0,142,-10,67 0 119 w
+x 600,434,0,91,32,67 0 120 x
+y 600,434,183,124,39,67 1 121 y
+z 600,434,0,41,-42,41 0 122 z
+{ 600,764,228,78,-113,67 3 123 braceleft
+lC "
+| 600,750,249,0,-176 3 124 bar
+ba "
+} 600,764,228,0,-26 3 125 braceright
+rC "
+~ 600,644,0,98,-150,67 2 126 tilde
+a~ "
+bq 600,163,100,0,-83 0 128 quotesinglbase
+Fo 600,423,0,80,-34,67 0 129 guillemotleft
+Fc 600,423,0,53,-7,53 0 130 guillemotright
+bu 600,482,0,0,-125 0 131 bullet
+Fn 600,618,119,126,90,67 2 132 florin
+f/ 600,634,85,163,31,67 2 133 fraction
+%0 600,617,33,171,64,67 2 134 perthousand
+dg 600,572,44,16,-131,16 2 135 dagger
+dd 600,572,42,16,-95,16 2 136 daggerdbl
+en 600,282,0,27,-63,27 0 137 endash
+em 600,282,0,104,14,67 0 138 emdash
+fi 600,642,0,74,41,67 2 140 fi
+fl 600,621,0,67,44,67 2 141 fl
+.i 600,434,0,0,-38 0 144 dotlessi
+ga 600,678,0,37,-214,37 2 146 grave
+a" 600,710,0,175,-214,67 2 147 hungarumlaut
+a. 600,641,0,0,-299 2 148 dotaccent
+ab 600,657,0,102,-169,67 2 149 breve
+ah 600,679,0,81,-175,67 2 150 caron
+ao 600,717,0,0,-268 2 151 ring
+ho 600,22,177,0,-253 0 152 ogonek
+lq 600,572,0,54,-169,54 2 153 quotedblleft
+rq 600,572,0,47,-61,47 2 154 quotedblright
+oe 600,446,12,100,12,67 0 155 oe
+/l 600,621,0,0,-39 2 156 lslash
+Bq 600,163,101,0,18 0 157 quotedblbase
+OE 600,572,0,170,2,67 2 158 OE
+/L 600,572,0,61,-1,61 2 159 Lslash
+r! 600,447,136,0,-162 0 161 exclamdown
+ct 600,605,52,50,-97,50 2 162 cent
+Po 600,612,27,81,-69,67 2 163 sterling
+Cs 600,605,0,123,-12,67 2 164 currency
+Ye 600,601,0,145,-72,67 2 165 yen
+bb 600,724,224,0,-181 3 166 brokenbar
+sc 600,584,63,52,-58,52 2 167 section
+ad 600,640,0,17,-209,17 2 168 dieresis
+co 600,744,0,87,-111,67 2 169 copyright
+Of 600,612,0,0,-208 2 170 ordfeminine
+fo 600,423,0,0,-122 0 171 guilsinglleft
+tno 600,358,0,35,-87,35 0 172 logicalnot
+\- 600,266,0,17,-69,17 0 173 minus
+rg 600,744,0,87,-111,67 2 174 registered
+a- 600,591,0,75,-137,67 2 175 macron
+de 600,612,0,0,-186 2 176 degree
+t+- 600,438,127,20,-9,20 0 177 plusminus
+S2 600,607,0,0,-141 2 178 twosuperior
+S3 600,607,0,0,-140 2 179 threesuperior
+aa 600,678,0,64,-233,64 2 180 acute
+*m 600,434,167,46,-18,46 0 181 mu
+mc "
+ps 600,745,154,105,-143,67 2 182 paragraph
+pc 600,386,0,0,-213 0 183 periodcentered
+ac 600,0,207,0,-154 1 184 cedilla
+S1 600,607,0,0,-156 2 185 onesuperior
+Om 600,612,0,0,-206 2 186 ordmasculine
+fc 600,423,0,0,-112 0 187 guilsinglright
+14 600,625,91,208,-9,67 2 188 onequarter
+12 600,625,91,172,24,67 2 189 onehalf
+34 600,626,91,187,9,67 2 190 threequarters
+r? 600,446,149,0,-58 0 191 questiondown
+`A 600,811,0,65,46,65 2 192 Agrave
+'A 600,811,0,76,46,67 2 193 Aacute
+^A 600,811,0,74,46,67 2 194 Acircumflex
+~A 600,777,0,114,46,67 2 195 Atilde
+:A 600,789,0,65,46,65 2 196 Adieresis
+oA 600,800,0,65,46,65 2 197 Aring
+AE 600,572,0,158,34,67 2 198 AE
+,C 600,583,204,123,-50,67 3 199 Ccedilla
+`E 600,811,0,113,2,67 2 200 Egrave
+'E 600,811,0,113,2,67 2 201 Eacute
+^E 600,811,0,113,2,67 2 202 Ecircumflex
+:E 600,789,0,113,2,67 2 203 Edieresis
+`I 600,811,0,74,-40,67 2 204 Igrave
+'I 600,811,0,88,-40,67 2 205 Iacute
+^I 600,811,0,86,-40,67 2 206 Icircumflex
+:I 600,789,0,74,-40,67 2 207 Idieresis
+-D 600,572,0,79,24,67 2 208 Eth
+~N 600,777,0,167,36,67 2 209 Ntilde
+`O 600,811,12,78,-33,67 2 210 Ograve
+'O 600,811,12,88,-33,67 2 211 Oacute
+^O 600,811,12,86,-33,67 2 212 Ocircumflex
+~O 600,777,12,126,-33,67 2 213 Otilde
+:O 600,789,12,78,-33,67 2 214 Odieresis
+tmu 600,441,0,48,-48,48 0 215 multiply
+/O 600,585,19,108,-3,67 2 216 Oslash
+`U 600,811,12,160,-63,67 2 217 Ugrave
+'U 600,811,12,160,-63,67 2 218 Uacute
+^U 600,811,12,160,-63,67 2 219 Ucircumflex
+:U 600,789,12,160,-63,67 2 220 Udieresis
+'Y 600,811,0,145,-69,67 2 221 Yacute
+TP 600,572,0,83,41,67 2 222 Thorn
+ss 600,621,12,53,23,53 2 223 germandbls
+`a 600,678,12,33,-31,33 2 224 agrave
+'a 600,678,12,59,-31,59 2 225 aacute
+^a 600,679,12,55,-31,55 2 226 acircumflex
+~a 600,644,12,93,-31,67 2 227 atilde
+:a 600,640,12,33,-31,33 2 228 adieresis
+oa 600,717,12,33,-31,33 2 229 aring
+ae 600,446,12,86,18,67 0 230 ae
+,c 600,448,206,48,-46,48 1 231 ccedilla
+`e 600,678,12,44,-52,44 2 232 egrave
+'e 600,678,12,71,-52,67 2 233 eacute
+^e 600,679,12,67,-52,67 2 234 ecircumflex
+:e 600,640,12,43,-52,43 2 235 edieresis
+`i 600,678,0,24,-38,24 2 236 igrave
+'i 600,678,0,51,-38,51 2 237 iacute
+^i 600,679,0,47,-38,47 2 238 icircumflex
+:i 600,640,0,4,-38,4 2 239 idieresis
+Sd 600,693,12,49,-41,49 2 240 eth
+~n 600,644,0,98,25,67 2 241 ntilde
+`o 600,678,12,52,-31,52 2 242 ograve
+'o 600,678,12,64,-31,64 2 243 oacute
+^o 600,679,12,60,-31,60 2 244 ocircumflex
+~o 600,644,12,98,-31,67 2 245 otilde
+:o 600,640,12,52,-31,52 2 246 odieresis
+tdi 600,425,0,15,-75,15 0 247 divide
+/o 600,452,22,75,-7,67 0 248 oslash
+`u 600,678,12,42,-38,42 2 249 ugrave
+'u 600,678,12,44,-38,44 2 250 uacute
+^u 600,679,12,42,-38,42 2 251 ucircumflex
+:u 600,640,12,42,-38,42 2 252 udieresis
+'y 600,678,183,124,39,67 3 253 yacute
+Tp 600,618,183,56,72,56 3 254 thorn
+:y 600,640,183,124,39,67 3 255 ydieresis
+u2026 600,111,12,47,19,47 0 256 ellipsis
diff --git a/font/devps/CI b/font/devps/CI
new file mode 100644
index 0000000..9455c1e
--- /dev/null
+++ b/font/devps/CI
@@ -0,0 +1,267 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Courier Oblique
+# Version 004.000
+# FamilyName Courier
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1996, 1997, 1998 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1996, 1997, 1998 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Wed Aug 26 16:52:23 1998
+# Comment UniqueID 44054
+# Comment VMusage 11074 54655
+
+name CI
+internalname Courier-Oblique
+slant 11
+spacewidth 600
+encoding text.enc
+
+charset
+ha 600,750,0,55,-144,55 2 0 asciicircum
+ti 600,274,0,22,-77,22 0 1 asciitilde
+vS 600,803,12,101,-21,67 2 2 Scaron
+vZ 600,803,0,109,-32,67 2 3 Zcaron
+vs 600,667,12,67,-40,67 2 4 scaron
+vz 600,667,0,74,-53,67 2 5 zcaron
+:Y 600,785,0,137,-85,67 2 6 Ydieresis
+tm 600,678,0,128,-129,67 2 7 trademark
+aq 600,572,0,0,-278 2 8 quotesingle
+Eu 600,584,12,140,-6,67 2 9 Euro
+space 600 0 32 space
+! 600,572,12,0,-196 2 33 exclam
+" 600,572,0,0,-194 2 34 quotedbl
+dq "
+# 600,639,77,53,-45,53 2 35 numbersign
+sh "
+$ 600,655,137,41,-55,41 2 36 dollar
+Do "
+% 600,622,12,43,-92,43 2 37 percent
+& 600,539,12,53,-66,53 0 38 ampersand
+' 600,572,0,0,-190 2 39 quoteright
+cq "
+( 600,648,97,38,-281,38 2 40 parenleft
+) 600,648,97,0,-73 2 41 parenright
+* 600,572,0,15,-131,15 2 42 asterisk
++ 600,432,0,12,-71,12 0 43 plus
+, 600,121,129,0,-105 0 44 comma
+- 600,276,0,0,-131 0 45 hyphen
+hy "
+. 600,107,12,0,-192 0 46 period
+/ 600,701,143,87,-18,67 2 47 slash
+sl "
+0 600,584,12,16,-106,16 2 48 zero
+1 600,584,0,0,-55 2 49 one
+2 600,584,0,11,-25,11 2 50 two
+3 600,584,12,0,-37 2 51 three
+4 600,572,0,0,-42 2 52 four
+5 600,572,12,31,-45,31 2 53 five
+6 600,584,13,54,-86,54 2 54 six
+7 600,572,0,65,-135,65 2 55 seven
+8 600,585,13,10,-80,10 2 56 eight
+9 600,584,13,28,-58,28 2 57 nine
+: 600,368,14,0,-194 0 58 colon
+; 600,368,129,0,-115 0 59 semicolon
+< 600,404,1,20,-74,20 0 60 less
+= 600,321,0,27,-56,27 0 61 equal
+> 600,404,0,19,-74,19 0 62 greater
+? 600,584,12,15,-156,15 2 63 question
+@ 600,543,14,79,-33,67 0 64 at
+at "
+A 600,572,0,64,56,64 2 65 A
+B 600,572,0,43,8,43 2 66 B
+C 600,584,13,119,-65,67 2 67 C
+D 600,572,0,75,16,67 2 68 D
+E 600,572,0,96,-7,67 2 69 E
+F 600,572,0,116,-27,67 2 70 F
+G 600,584,12,92,-33,67 2 71 G
+H 600,572,0,131,20,67 2 72 H
+I 600,572,0,53,-59,53 2 73 I
+J 600,572,12,139,-10,67 2 74 J
+K 600,572,0,138,-11,67 2 75 K
+L 600,572,0,54,-2,54 2 76 L
+M 600,572,0,138,29,67 2 77 M
+N 600,572,0,148,35,67 2 78 N
+O 600,585,12,72,-37,67 2 79 O
+P 600,572,0,83,-33,67 2 80 P
+Q 600,584,126,76,-38,67 2 81 Q
+R 600,572,0,41,7,41 2 82 R
+S 600,584,12,64,-21,64 2 83 S
+T 600,572,0,124,-69,67 2 84 T
+U 600,572,12,162,-68,67 2 85 U
+V 600,572,0,161,-60,67 2 86 V
+W 600,572,0,143,-70,67 2 87 W
+X 600,572,0,112,28,67 2 88 X
+Y 600,572,0,137,-85,67 2 89 Y
+Z 600,572,0,87,-32,67 2 90 Z
+[ 600,648,97,66,-240,66 2 91 bracketleft
+lB "
+\ 600,701,142,0,-174 2 92 backslash
+rs "
+] 600,648,97,0,-43 2 93 bracketright
+rB "
+^ 600,667,0,40,-162,40 2 94 circumflex
+a^ "
+_ 600,0,249,12,99,12 1 95 underscore
+` 600,572,0,0,-285 2 96 quoteleft
+oq "
+a 600,447,12,13,-29,13 0 97 a
+b 600,627,12,54,26,54 2 98 b
+c 600,447,12,58,-60,58 0 99 c
+d 600,627,12,75,-38,67 2 100 d
+e 600,447,12,27,-49,27 0 101 e
+f 600,626,0,89,-48,67 2 102 f
+g 600,447,194,100,2,67 1 103 g
+h 600,627,0,43,11,43 2 104 h
+i 600,654,0,0,-52 2 105 i
+j 600,654,193 3 106 j
+k 600,627,0,63,5,63 2 107 k
+l 600,627,0,0,-47 2 108 l
+m 600,447,0,64,-17,64 0 109 m
+n 600,447,0,37,17,37 0 110 n
+o 600,447,12,51,-39,51 0 111 o
+p 600,447,194,48,71,48 1 112 p
+q 600,447,194,117,-36,67 1 113 q
+r 600,447,0,88,-24,67 0 114 r
+s 600,447,12,29,-40,29 0 115 s
+t 600,563,12,0,-95 2 116 t
+u 600,434,12,30,-49,30 0 117 u
+v 600,434,0,121,-38,67 0 118 v
+w 600,434,0,124,-48,67 0 119 w
+x 600,434,0,90,28,67 0 120 x
+y 600,434,194,125,22,67 1 121 y
+z 600,434,0,41,-53,41 0 122 z
+{ 600,764,230,19,-176,19 3 123 braceleft
+lC "
+| 600,750,249,0,-176 3 124 bar
+ba "
+} 600,764,230,0,-85 3 125 braceright
+rC "
+~ 600,639,0,71,-155,67 2 126 tilde
+a~ "
+bq 600,127,123,0,-111 0 128 quotesinglbase
+Fo 600,414,0,38,-78,38 0 129 guillemotleft
+Fc 600,414,0,9,-49,9 0 130 guillemotright
+bu 600,478,0,0,-124 0 131 bullet
+Fn 600,574,164,121,55,67 2 132 florin
+f/ 600,589,100,108,42,67 2 133 fraction
+%0 600,622,12,62,-12,62 2 134 perthousand
+dg 600,572,48,0,-182 2 135 dagger
+dd 600,572,48,0,-145 2 136 daggerdbl
+en 600,276,0,21,-74,21 0 137 endash
+em 600,276,0,121,7,67 0 138 emdash
+fi 600,654,0,63,50,63 2 140 fi
+fl 600,626,0,61,46,61 2 141 fl
+.i 600,434,0,0,-52 0 144 dotlessi
+ga 600,667,0,10,-223,10 2 146 grave
+a" 600,690,0,82,-257,67 2 147 hungarumlaut
+a. 600,642,0,0,-311 2 148 dotaccent
+ab 600,634,0,79,-180,67 2 149 breve
+ah 600,667,0,67,-189,67 2 150 caron
+ao 600,681,0,0,-272 2 151 ring
+ho 600,0,161,0,-276 0 152 ogonek
+lq 600,572,0,9,-211,9 2 153 quotedblleft
+rq 600,572,0,2,-106,2 2 154 quotedblright
+oe 600,448,12,84,4,67 0 155 oe
+/l 600,627,0,0,-47 2 156 lslash
+Bq 600,127,124,0,-18 0 157 quotedblbase
+OE 600,572,0,122,-8,67 2 158 OE
+/L 600,572,0,49,3,49 2 159 Lslash
+r! 600,451,132,0,-192 0 161 exclamdown
+ct 600,614,53,35,-104,35 2 162 cent
+Po 600,584,13,48,-73,48 2 163 sterling
+Cs 600,595,0,96,-42,67 2 164 currency
+Ye 600,572,0,137,-76,67 2 165 yen
+bb 600,724,224,0,-181 3 166 brokenbar
+sc 600,584,71,31,-61,31 2 167 section
+ad 600,642,0,0,-231 2 168 dieresis
+co 600,745,0,88,-111,67 2 169 copyright
+Of 600,584,0,0,-185 2 170 ordfeminine
+fo 600,414,0,0,-158 0 171 guilsinglleft
+tno 600,336,0,31,-90,31 0 172 logicalnot
+\- 600,244,0,13,-72,13 0 173 minus
+rg 600,745,0,88,-111,67 2 174 registered
+a- 600,597,0,84,-136,67 2 175 macron
+de 600,584,0,0,-169 2 176 degree
+t+- 600,433,107,13,-15,13 0 177 plusminus
+S2 600,579,0,0,-181 2 178 twosuperior
+S3 600,579,0,0,-186 2 179 threesuperior
+aa 600,666,0,32,-219,32 2 180 acute
+*m 600,434,167,34,-27,34 0 181 mu
+mc "
+ps 600,745,154,105,-143,67 2 182 paragraph
+pc 600,338,0,0,-239 0 183 periodcentered
+ac 600,0,182,0,-161 0 184 cedilla
+S1 600,576,0,0,-180 2 185 onesuperior
+Om 600,584,0,0,-210 2 186 ordmasculine
+fc 600,414,0,0,-136 0 187 guilsinglright
+14 600,589,100,199,-43,67 2 188 onequarter
+12 600,589,100,160,-13,67 2 189 onehalf
+34 600,589,100,164,-17,67 2 190 threequarters
+r? 600,452,144,0,-72 0 191 questiondown
+`A 600,803,0,64,56,64 2 192 Agrave
+'A 600,803,0,64,56,64 2 193 Aacute
+^A 600,803,0,64,56,64 2 194 Acircumflex
+~A 600,782,0,103,56,67 2 195 Atilde
+:A 600,785,0,64,56,64 2 196 Adieresis
+oA 600,801,0,64,56,64 2 197 Aring
+AE 600,572,0,119,39,67 2 198 AE
+,C 600,584,194,119,-65,67 3 199 Ccedilla
+`E 600,803,0,96,-7,67 2 200 Egrave
+'E 600,803,0,96,-7,67 2 201 Eacute
+^E 600,803,0,96,-7,67 2 202 Ecircumflex
+:E 600,785,0,96,-7,67 2 203 Edieresis
+`I 600,803,0,53,-59,53 2 204 Igrave
+'I 600,803,0,67,-59,67 2 205 Iacute
+^I 600,803,0,67,-59,67 2 206 Icircumflex
+:I 600,785,0,53,-59,53 2 207 Idieresis
+-D 600,572,0,75,16,67 2 208 Eth
+~N 600,782,0,148,35,67 2 209 Ntilde
+`O 600,803,12,72,-37,67 2 210 Ograve
+'O 600,803,12,72,-37,67 2 211 Oacute
+^O 600,803,12,72,-37,67 2 212 Ocircumflex
+~O 600,782,12,110,-37,67 2 213 Otilde
+:O 600,785,12,72,-37,67 2 214 Odieresis
+tmu 600,430,0,41,-43,41 0 215 multiply
+/O 600,585,27,100,-10,67 2 216 Oslash
+`U 600,803,12,162,-68,67 2 217 Ugrave
+'U 600,803,12,162,-68,67 2 218 Uacute
+^U 600,803,12,162,-68,67 2 219 Ucircumflex
+:U 600,785,12,162,-68,67 2 220 Udieresis
+'Y 600,803,0,137,-85,67 2 221 Yacute
+TP 600,572,0,95,-19,67 2 222 Thorn
+ss 600,626,12,65,3,65 2 223 germandbls
+`a 600,667,12,13,-29,13 2 224 agrave
+'a 600,666,12,17,-29,17 2 225 aacute
+^a 600,667,12,25,-29,25 2 226 acircumflex
+~a 600,639,12,56,-29,56 2 227 atilde
+:a 600,642,12,13,-29,13 2 228 adieresis
+oa 600,681,12,13,-29,13 2 229 aring
+ae 600,447,12,68,8,67 0 230 ae
+,c 600,447,182,58,-60,58 0 231 ccedilla
+`e 600,667,12,27,-49,27 2 232 egrave
+'e 600,666,12,32,-49,32 2 233 eacute
+^e 600,667,12,40,-49,40 2 234 ecircumflex
+:e 600,642,12,27,-49,27 2 235 edieresis
+`i 600,667,0,0,-52 2 236 igrave
+'i 600,666,0,15,-52,15 2 237 iacute
+^i 600,667,0,23,-52,23 2 238 icircumflex
+:i 600,642,0,0,-52 2 239 idieresis
+Sd 600,684,12,58,-35,58 2 240 eth
+~n 600,639,0,71,17,67 2 241 ntilde
+`o 600,667,12,51,-39,51 2 242 ograve
+'o 600,666,12,51,-39,51 2 243 oacute
+^o 600,667,12,51,-39,51 2 244 ocircumflex
+~o 600,639,12,71,-39,67 2 245 otilde
+:o 600,642,12,51,-39,51 2 246 odieresis
+tdi 600,400,0,15,-74,15 0 247 divide
+/o 600,451,17,90,-6,67 0 248 oslash
+`u 600,667,12,30,-49,30 2 249 ugrave
+'u 600,666,12,30,-49,30 2 250 uacute
+^u 600,667,12,31,-49,31 2 251 ucircumflex
+:u 600,642,12,30,-49,30 2 252 udieresis
+'y 600,666,194,125,22,67 3 253 yacute
+Tp 600,627,194,48,71,48 3 254 thorn
+:y 600,642,194,125,22,67 3 255 ydieresis
+u2026 600,107,12,43,13,43 0 256 ellipsis
diff --git a/font/devps/CR b/font/devps/CR
new file mode 100644
index 0000000..0ee79aa
--- /dev/null
+++ b/font/devps/CR
@@ -0,0 +1,266 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Courier
+# Version 004.000
+# FamilyName Courier
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1996, 1997, 1998 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1996, 1997, 1998 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Wed Aug 26 16:50:02 1998
+# Comment UniqueID 44052
+# Comment VMusage 31569 38505
+
+name CR
+internalname Courier
+spacewidth 600
+encoding text.enc
+
+charset
+ha 600,750 2 0 asciicircum
+ti 600,274 0 1 asciitilde
+vS 600,803,12 2 2 Scaron
+vZ 600,803 2 3 Zcaron
+vs 600,667,12 2 4 scaron
+vz 600,667 2 5 zcaron
+:Y 600,785 2 6 Ydieresis
+tm 600,678 2 7 trademark
+aq 600,572 2 8 quotesingle
+Eu 600,584,12 2 9 Euro
+space 600 0 32 space
+! 600,572,12 2 33 exclam
+" 600,572 2 34 quotedbl
+dq "
+# 600,639,77 2 35 numbersign
+sh "
+$ 600,655,137 2 36 dollar
+Do "
+% 600,622,12 2 37 percent
+& 600,539,12 0 38 ampersand
+' 600,572 2 39 quoteright
+cq "
+( 600,648,97 2 40 parenleft
+) 600,648,97 2 41 parenright
+* 600,572 2 42 asterisk
++ 600,432 0 43 plus
+, 600,121,129 0 44 comma
+- 600,276 0 45 hyphen
+hy "
+. 600,107,12 0 46 period
+/ 600,701,143 2 47 slash
+sl "
+0 600,584,12 2 48 zero
+1 600,584 2 49 one
+2 600,584 2 50 two
+3 600,584,12 2 51 three
+4 600,572 2 52 four
+5 600,572,12 2 53 five
+6 600,584,13 2 54 six
+7 600,572 2 55 seven
+8 600,585,13 2 56 eight
+9 600,584,13 2 57 nine
+: 600,368,14 0 58 colon
+; 600,368,129 0 59 semicolon
+< 600,404,1 0 60 less
+= 600,321 0 61 equal
+> 600,404 0 62 greater
+? 600,584,12 2 63 question
+@ 600,543,14 0 64 at
+at "
+A 600,572,0,3,6 2 65 A
+B 600,572 2 66 B
+C 600,584,13 2 67 C
+D 600,572 2 68 D
+E 600,572 2 69 E
+F 600,572 2 70 F
+G 600,584,12 2 71 G
+H 600,572 2 72 H
+I 600,572 2 73 I
+J 600,572,12 2 74 J
+K 600,572,0,12 2 75 K
+L 600,572 2 76 L
+M 600,572 2 77 M
+N 600,572 2 78 N
+O 600,585,12 2 79 O
+P 600,572 2 80 P
+Q 600,584,126 2 81 Q
+R 600,572 2 82 R
+S 600,584,12 2 83 S
+T 600,572 2 84 T
+U 600,572,12 2 85 U
+V 600,572 2 86 V
+W 600,572 2 87 W
+X 600,572 2 88 X
+Y 600,572 2 89 Y
+Z 600,572 2 90 Z
+[ 600,648,97 2 91 bracketleft
+lB "
+\ 600,701,142 2 92 backslash
+rs "
+] 600,648,97 2 93 bracketright
+rB "
+^ 600,667 2 94 circumflex
+a^ "
+_ 600,0,249 1 95 underscore
+` 600,572 2 96 quoteleft
+oq "
+a 600,447,12 0 97 a
+b 600,627,12 2 98 b
+c 600,447,12 0 99 c
+d 600,627,12 2 100 d
+e 600,447,12 0 101 e
+f 600,626 2 102 f
+g 600,447,194 1 103 g
+h 600,627 2 104 h
+i 600,654 2 105 i
+j 600,654,193 3 106 j
+k 600,627 2 107 k
+l 600,627 2 108 l
+m 600,447 0 109 m
+n 600,447 0 110 n
+o 600,447,12 0 111 o
+p 600,447,194 1 112 p
+q 600,447,194 1 113 q
+r 600,447 0 114 r
+s 600,447,12 0 115 s
+t 600,563,12 2 116 t
+u 600,434,12 0 117 u
+v 600,434 0 118 v
+w 600,434 0 119 w
+x 600,434 0 120 x
+y 600,434,194 1 121 y
+z 600,434 0 122 z
+{ 600,764,230 3 123 braceleft
+lC "
+| 600,750,249 3 124 bar
+ba "
+} 600,764,230 3 125 braceright
+rC "
+~ 600,639 2 126 tilde
+a~ "
+bq 600,127,123 0 128 quotesinglbase
+Fo 600,414 0 129 guillemotleft
+Fc 600,414 0 130 guillemotright
+bu 600,478 0 131 bullet
+Fn 600,574,164 2 132 florin
+f/ 600,589,100 2 133 fraction
+%0 600,622,12 2 134 perthousand
+dg 600,572,48 2 135 dagger
+dd 600,572,48 2 136 daggerdbl
+en 600,276 0 137 endash
+em 600,276,0,17 0 138 emdash
+fi 600,654 2 140 fi
+fl 600,626 2 141 fl
+.i 600,434 0 144 dotlessi
+ga 600,667 2 146 grave
+a" 600,690 2 147 hungarumlaut
+a. 600,642 2 148 dotaccent
+ab 600,634 2 149 breve
+ah 600,667 2 150 caron
+ao 600,681 2 151 ring
+ho 600,0,161 0 152 ogonek
+lq 600,572 2 153 quotedblleft
+rq 600,572 2 154 quotedblright
+oe 600,448,12 0 155 oe
+/l 600,627 2 156 lslash
+Bq 600,127,124 0 157 quotedblbase
+OE 600,572 2 158 OE
+/L 600,572 2 159 Lslash
+r! 600,451,132 0 161 exclamdown
+ct 600,614,53 2 162 cent
+Po 600,584,13 2 163 sterling
+Cs 600,595 2 164 currency
+Ye 600,572 2 165 yen
+bb 600,724,224 3 166 brokenbar
+sc 600,584,71 2 167 section
+ad 600,642 2 168 dieresis
+co 600,745 2 169 copyright
+Of 600,584 2 170 ordfeminine
+fo 600,414 0 171 guilsinglleft
+tno 600,336 0 172 logicalnot
+\- 600,244 0 173 minus
+rg 600,745 2 174 registered
+a- 600,597 2 175 macron
+de 600,584 2 176 degree
+t+- 600,433,107 0 177 plusminus
+S2 600,579 2 178 twosuperior
+S3 600,579 2 179 threesuperior
+aa 600,666 2 180 acute
+*m 600,434,167 0 181 mu
+mc "
+ps 600,745,154 2 182 paragraph
+pc 600,338 0 183 periodcentered
+ac 600,0,182 0 184 cedilla
+S1 600,576 2 185 onesuperior
+Om 600,584 2 186 ordmasculine
+fc 600,414 0 187 guilsinglright
+14 600,589,100,39 2 188 onequarter
+12 600,589,100 2 189 onehalf
+34 600,589,100,4 2 190 threequarters
+r? 600,452,144 0 191 questiondown
+`A 600,803,0,3,6 2 192 Agrave
+'A 600,803,0,3,6 2 193 Aacute
+^A 600,803,0,3,6 2 194 Acircumflex
+~A 600,782,0,3,6 2 195 Atilde
+:A 600,785,0,3,6 2 196 Adieresis
+oA 600,801,0,3,6 2 197 Aring
+AE 600,572 2 198 AE
+,C 600,584,194 3 199 Ccedilla
+`E 600,803 2 200 Egrave
+'E 600,803 2 201 Eacute
+^E 600,803 2 202 Ecircumflex
+:E 600,785 2 203 Edieresis
+`I 600,803 2 204 Igrave
+'I 600,803 2 205 Iacute
+^I 600,803 2 206 Icircumflex
+:I 600,785 2 207 Idieresis
+-D 600,572 2 208 Eth
+~N 600,782 2 209 Ntilde
+`O 600,803,12 2 210 Ograve
+'O 600,803,12 2 211 Oacute
+^O 600,803,12 2 212 Ocircumflex
+~O 600,782,12 2 213 Otilde
+:O 600,785,12 2 214 Odieresis
+tmu 600,430 0 215 multiply
+/O 600,585,27 2 216 Oslash
+`U 600,803,12 2 217 Ugrave
+'U 600,803,12 2 218 Uacute
+^U 600,803,12 2 219 Ucircumflex
+:U 600,785,12 2 220 Udieresis
+'Y 600,803 2 221 Yacute
+TP 600,572 2 222 Thorn
+ss 600,626,12 2 223 germandbls
+`a 600,667,12 2 224 agrave
+'a 600,666,12 2 225 aacute
+^a 600,667,12 2 226 acircumflex
+~a 600,639,12 2 227 atilde
+:a 600,642,12 2 228 adieresis
+oa 600,681,12 2 229 aring
+ae 600,447,12 0 230 ae
+,c 600,447,182 0 231 ccedilla
+`e 600,667,12 2 232 egrave
+'e 600,666,12 2 233 eacute
+^e 600,667,12 2 234 ecircumflex
+:e 600,642,12 2 235 edieresis
+`i 600,667 2 236 igrave
+'i 600,666 2 237 iacute
+^i 600,667 2 238 icircumflex
+:i 600,642 2 239 idieresis
+Sd 600,684,12 2 240 eth
+~n 600,639 2 241 ntilde
+`o 600,667,12 2 242 ograve
+'o 600,666,12 2 243 oacute
+^o 600,667,12 2 244 ocircumflex
+~o 600,639,12 2 245 otilde
+:o 600,642,12 2 246 odieresis
+tdi 600,400 0 247 divide
+/o 600,451,17 0 248 oslash
+`u 600,667,12 2 249 ugrave
+'u 600,666,12 2 250 uacute
+^u 600,667,12 2 251 ucircumflex
+:u 600,642,12 2 252 udieresis
+'y 600,666,194 3 253 yacute
+Tp 600,627,194 3 254 thorn
+:y 600,642,194 3 255 ydieresis
+u2026 600,107,12 0 256 ellipsis
diff --git a/font/devps/DESC.in b/font/devps/DESC.in
new file mode 100644
index 0000000..e9d26c8
--- /dev/null
+++ b/font/devps/DESC.in
@@ -0,0 +1,11 @@
+res 72000
+hor 1
+vert 1
+sizescale 1000
+unitwidth 1000
+sizes 1000-10000000 0
+styles R I B BI
+family T
+fonts 9 0 0 0 0 0 SS S ZD ZDR
+tcommand
+postpro grops
diff --git a/font/devps/EURO b/font/devps/EURO
new file mode 100644
index 0000000..841c9c7
--- /dev/null
+++ b/font/devps/EURO
@@ -0,0 +1,33 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName FreeEuro
+# Version 001.001
+# FamilyName FreeEuro
+#
+# The original AFM file contains the following comments:
+#
+# Notice (Created by Werner Lemberg with PfaEdit 1.0 (http://pfaedit.sf.net); the serif shapes are based on the Omega fonts created by Yannis Haralambous.)
+# Comment Generated by FontForge 20060105
+# Comment Creation Date: Sun Jan 8 10:14:22 2006
+
+name EURO
+spacewidth 333
+internalname FreeEuro
+
+charset
+--- 750,685,12 3 0 Euro.symbol
+--- 750,685,12 3 1 Euro.symbol.bold
+--- 750,685,12,92 3 2 Euro.symbol.slanted
+--- 750,685,12,100 3 3 Euro.symbol.bold.slanted
+--- 741,676,14 3 4 Euro.serif
+--- 800,691,19 3 5 Euro.serif.bold
+--- 734,666,18,11 3 6 Euro.serif.italic
+--- 800,691,19,8 3 7 Euro.serif.bold.italic
+--- 756,709,23 3 8 Euro.sansserif
+--- 796,710,22 3 9 Euro.sansserif.bold
+--- 756,709,23,106 3 10 Euro.sansserif.slanted
+--- 796,710,22,107 3 11 Euro.sansserif.bold.slanted
+--- 600,576,16 3 12 Euro.mono
+--- 600,597,14 3 13 Euro.mono.bold
+--- 600,576,16,31 3 14 Euro.mono.slanted
+--- 600,597,14,43 3 15 Euro.mono.bold.slanted
diff --git a/font/devps/HB b/font/devps/HB
new file mode 100644
index 0000000..7662906
--- /dev/null
+++ b/font/devps/HB
@@ -0,0 +1,1513 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Helvetica Bold
+# Version 003.001
+# FamilyName Helvetica
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 12:45:17 1999
+# Comment UniqueID 44699
+# Comment VMusage 29305 36241
+
+name HB
+internalname Helvetica-Bold
+spacewidth 278
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A C -40
+A ,C -40
+A G -50
+A O -40
+A 'O -40
+A ^O -40
+A :O -40
+A `O -40
+A /O -40
+A ~O -40
+A Q -40
+A T -90
+A U -50
+A 'U -50
+A ^U -50
+A :U -50
+A `U -50
+A V -80
+A W -60
+A Y -110
+A 'Y -110
+A :Y -110
+A u -30
+A 'u -30
+A ^u -30
+A :u -30
+A `u -30
+A v -40
+A w -30
+A y -30
+A 'y -30
+A :y -30
+'A C -40
+'A ,C -40
+'A G -50
+'A O -40
+'A 'O -40
+'A ^O -40
+'A :O -40
+'A `O -40
+'A /O -40
+'A ~O -40
+'A Q -40
+'A T -90
+'A U -50
+'A 'U -50
+'A ^U -50
+'A :U -50
+'A `U -50
+'A V -80
+'A W -60
+'A Y -110
+'A 'Y -110
+'A :Y -110
+'A u -30
+'A 'u -30
+'A ^u -30
+'A :u -30
+'A `u -30
+'A v -40
+'A w -30
+'A y -30
+'A 'y -30
+'A :y -30
+^A C -40
+^A ,C -40
+^A G -50
+^A O -40
+^A 'O -40
+^A ^O -40
+^A :O -40
+^A `O -40
+^A /O -40
+^A ~O -40
+^A Q -40
+^A T -90
+^A U -50
+^A 'U -50
+^A ^U -50
+^A :U -50
+^A `U -50
+^A V -80
+^A W -60
+^A Y -110
+^A 'Y -110
+^A :Y -110
+^A u -30
+^A 'u -30
+^A ^u -30
+^A :u -30
+^A `u -30
+^A v -40
+^A w -30
+^A y -30
+^A 'y -30
+^A :y -30
+:A C -40
+:A ,C -40
+:A G -50
+:A O -40
+:A 'O -40
+:A ^O -40
+:A :O -40
+:A `O -40
+:A /O -40
+:A ~O -40
+:A Q -40
+:A T -90
+:A U -50
+:A 'U -50
+:A ^U -50
+:A :U -50
+:A `U -50
+:A V -80
+:A W -60
+:A Y -110
+:A 'Y -110
+:A :Y -110
+:A u -30
+:A 'u -30
+:A ^u -30
+:A :u -30
+:A `u -30
+:A v -40
+:A w -30
+:A y -30
+:A 'y -30
+:A :y -30
+`A C -40
+`A ,C -40
+`A G -50
+`A O -40
+`A 'O -40
+`A ^O -40
+`A :O -40
+`A `O -40
+`A /O -40
+`A ~O -40
+`A Q -40
+`A T -90
+`A U -50
+`A 'U -50
+`A ^U -50
+`A :U -50
+`A `U -50
+`A V -80
+`A W -60
+`A Y -110
+`A 'Y -110
+`A :Y -110
+`A u -30
+`A 'u -30
+`A ^u -30
+`A :u -30
+`A `u -30
+`A v -40
+`A w -30
+`A y -30
+`A 'y -30
+`A :y -30
+oA C -40
+oA ,C -40
+oA G -50
+oA O -40
+oA 'O -40
+oA ^O -40
+oA :O -40
+oA `O -40
+oA /O -40
+oA ~O -40
+oA Q -40
+oA T -90
+oA U -50
+oA 'U -50
+oA ^U -50
+oA :U -50
+oA `U -50
+oA V -80
+oA W -60
+oA Y -110
+oA 'Y -110
+oA :Y -110
+oA u -30
+oA 'u -30
+oA ^u -30
+oA :u -30
+oA `u -30
+oA v -40
+oA w -30
+oA y -30
+oA 'y -30
+oA :y -30
+~A C -40
+~A ,C -40
+~A G -50
+~A O -40
+~A 'O -40
+~A ^O -40
+~A :O -40
+~A `O -40
+~A /O -40
+~A ~O -40
+~A Q -40
+~A T -90
+~A U -50
+~A 'U -50
+~A ^U -50
+~A :U -50
+~A `U -50
+~A V -80
+~A W -60
+~A Y -110
+~A 'Y -110
+~A :Y -110
+~A u -30
+~A 'u -30
+~A ^u -30
+~A :u -30
+~A `u -30
+~A v -40
+~A w -30
+~A y -30
+~A 'y -30
+~A :y -30
+B A -30
+B 'A -30
+B ^A -30
+B :A -30
+B `A -30
+B oA -30
+B ~A -30
+B U -10
+B 'U -10
+B ^U -10
+B :U -10
+B `U -10
+D A -40
+D 'A -40
+D ^A -40
+D :A -40
+D `A -40
+D oA -40
+D ~A -40
+D V -40
+D W -40
+D Y -70
+D 'Y -70
+D :Y -70
+D , -30
+D . -30
+D u2026 -30
+F A -80
+F 'A -80
+F ^A -80
+F :A -80
+F `A -80
+F oA -80
+F ~A -80
+F a -20
+F 'a -20
+F ^a -20
+F :a -20
+F `a -20
+F oa -20
+F ~a -20
+F , -100
+F . -100
+F u2026 -100
+J A -20
+J 'A -20
+J ^A -20
+J :A -20
+J `A -20
+J oA -20
+J ~A -20
+J , -20
+J . -20
+J u2026 -20
+J u -20
+J 'u -20
+J ^u -20
+J :u -20
+J `u -20
+K O -30
+K 'O -30
+K ^O -30
+K :O -30
+K `O -30
+K /O -30
+K ~O -30
+K e -15
+K 'e -15
+K ^e -15
+K :e -15
+K `e -15
+K o -35
+K 'o -35
+K ^o -35
+K :o -35
+K `o -35
+K /o -35
+K ~o -35
+K u -30
+K 'u -30
+K ^u -30
+K :u -30
+K `u -30
+K y -40
+K 'y -40
+K :y -40
+L T -90
+L V -110
+L W -80
+L Y -120
+L 'Y -120
+L :Y -120
+L rq -140
+L ' -140
+L cq -140
+L y -30
+L 'y -30
+L :y -30
+/L T -90
+/L V -110
+/L W -80
+/L Y -120
+/L 'Y -120
+/L :Y -120
+/L rq -140
+/L ' -140
+/L cq -140
+/L y -30
+/L 'y -30
+/L :y -30
+O A -50
+O 'A -50
+O ^A -50
+O :A -50
+O `A -50
+O oA -50
+O ~A -50
+O T -40
+O V -50
+O W -50
+O X -50
+O Y -70
+O 'Y -70
+O :Y -70
+O , -40
+O . -40
+O u2026 -40
+'O A -50
+'O 'A -50
+'O ^A -50
+'O :A -50
+'O `A -50
+'O oA -50
+'O ~A -50
+'O T -40
+'O V -50
+'O W -50
+'O X -50
+'O Y -70
+'O 'Y -70
+'O :Y -70
+'O , -40
+'O . -40
+'O u2026 -40
+^O A -50
+^O 'A -50
+^O ^A -50
+^O :A -50
+^O `A -50
+^O oA -50
+^O ~A -50
+^O T -40
+^O V -50
+^O W -50
+^O X -50
+^O Y -70
+^O 'Y -70
+^O :Y -70
+^O , -40
+^O . -40
+^O u2026 -40
+:O A -50
+:O 'A -50
+:O ^A -50
+:O :A -50
+:O `A -50
+:O oA -50
+:O ~A -50
+:O T -40
+:O V -50
+:O W -50
+:O X -50
+:O Y -70
+:O 'Y -70
+:O :Y -70
+:O , -40
+:O . -40
+:O u2026 -40
+`O A -50
+`O 'A -50
+`O ^A -50
+`O :A -50
+`O `A -50
+`O oA -50
+`O ~A -50
+`O T -40
+`O V -50
+`O W -50
+`O X -50
+`O Y -70
+`O 'Y -70
+`O :Y -70
+`O , -40
+`O . -40
+`O u2026 -40
+/O A -50
+/O 'A -50
+/O ^A -50
+/O :A -50
+/O `A -50
+/O oA -50
+/O ~A -50
+/O T -40
+/O V -50
+/O W -50
+/O X -50
+/O Y -70
+/O 'Y -70
+/O :Y -70
+/O , -40
+/O . -40
+/O u2026 -40
+~O A -50
+~O 'A -50
+~O ^A -50
+~O :A -50
+~O `A -50
+~O oA -50
+~O ~A -50
+~O T -40
+~O V -50
+~O W -50
+~O X -50
+~O Y -70
+~O 'Y -70
+~O :Y -70
+~O , -40
+~O . -40
+~O u2026 -40
+P A -100
+P 'A -100
+P ^A -100
+P :A -100
+P `A -100
+P oA -100
+P ~A -100
+P a -30
+P 'a -30
+P ^a -30
+P :a -30
+P `a -30
+P oa -30
+P ~a -30
+P , -120
+P e -30
+P 'e -30
+P ^e -30
+P :e -30
+P `e -30
+P o -40
+P 'o -40
+P ^o -40
+P :o -40
+P `o -40
+P /o -40
+P ~o -40
+P . -120
+P u2026 -120
+Q U -10
+Q 'U -10
+Q ^U -10
+Q :U -10
+Q `U -10
+Q , 20
+Q . 20
+Q u2026 20
+R O -20
+R 'O -20
+R ^O -20
+R :O -20
+R `O -20
+R /O -20
+R ~O -20
+R T -20
+R U -20
+R 'U -20
+R ^U -20
+R :U -20
+R `U -20
+R V -50
+R W -40
+R Y -50
+R 'Y -50
+R :Y -50
+T A -90
+T 'A -90
+T ^A -90
+T :A -90
+T `A -90
+T oA -90
+T ~A -90
+T O -40
+T 'O -40
+T ^O -40
+T :O -40
+T `O -40
+T /O -40
+T ~O -40
+T a -80
+T 'a -80
+T ^a -80
+T :a -80
+T `a -80
+T oa -80
+T ~a -80
+T : -40
+T , -80
+T e -60
+T 'e -60
+T ^e -60
+T :e -60
+T `e -60
+T - -120
+T hy -120
+T o -80
+T 'o -80
+T ^o -80
+T :o -80
+T `o -80
+T /o -80
+T ~o -80
+T . -80
+T u2026 -80
+T r -80
+T ; -40
+T u -90
+T 'u -90
+T ^u -90
+T :u -90
+T `u -90
+T w -60
+T y -60
+T 'y -60
+T :y -60
+U A -50
+U 'A -50
+U ^A -50
+U :A -50
+U `A -50
+U oA -50
+U ~A -50
+U , -30
+U . -30
+U u2026 -30
+'U A -50
+'U 'A -50
+'U ^A -50
+'U :A -50
+'U `A -50
+'U oA -50
+'U ~A -50
+'U , -30
+'U . -30
+'U u2026 -30
+^U A -50
+^U 'A -50
+^U ^A -50
+^U :A -50
+^U `A -50
+^U oA -50
+^U ~A -50
+^U , -30
+^U . -30
+^U u2026 -30
+:U A -50
+:U 'A -50
+:U ^A -50
+:U :A -50
+:U `A -50
+:U oA -50
+:U ~A -50
+:U , -30
+:U . -30
+:U u2026 -30
+`U A -50
+`U 'A -50
+`U ^A -50
+`U :A -50
+`U `A -50
+`U oA -50
+`U ~A -50
+`U , -30
+`U . -30
+`U u2026 -30
+V A -80
+V 'A -80
+V ^A -80
+V :A -80
+V `A -80
+V oA -80
+V ~A -80
+V G -50
+V O -50
+V 'O -50
+V ^O -50
+V :O -50
+V `O -50
+V /O -50
+V ~O -50
+V a -60
+V 'a -60
+V ^a -60
+V :a -60
+V `a -60
+V oa -60
+V ~a -60
+V : -40
+V , -120
+V e -50
+V 'e -50
+V ^e -50
+V :e -50
+V `e -50
+V - -80
+V hy -80
+V o -90
+V 'o -90
+V ^o -90
+V :o -90
+V `o -90
+V /o -90
+V ~o -90
+V . -120
+V u2026 -120
+V ; -40
+V u -60
+V 'u -60
+V ^u -60
+V :u -60
+V `u -60
+W A -60
+W 'A -60
+W ^A -60
+W :A -60
+W `A -60
+W oA -60
+W ~A -60
+W O -20
+W 'O -20
+W ^O -20
+W :O -20
+W `O -20
+W /O -20
+W ~O -20
+W a -40
+W 'a -40
+W ^a -40
+W :a -40
+W `a -40
+W oa -40
+W ~a -40
+W : -10
+W , -80
+W e -35
+W 'e -35
+W ^e -35
+W :e -35
+W `e -35
+W - -40
+W hy -40
+W o -60
+W 'o -60
+W ^o -60
+W :o -60
+W `o -60
+W /o -60
+W ~o -60
+W . -80
+W u2026 -80
+W ; -10
+W u -45
+W 'u -45
+W ^u -45
+W :u -45
+W `u -45
+W y -20
+W 'y -20
+W :y -20
+Y A -110
+Y 'A -110
+Y ^A -110
+Y :A -110
+Y `A -110
+Y oA -110
+Y ~A -110
+Y O -70
+Y 'O -70
+Y ^O -70
+Y :O -70
+Y `O -70
+Y /O -70
+Y ~O -70
+Y a -90
+Y 'a -90
+Y ^a -90
+Y :a -90
+Y `a -90
+Y oa -90
+Y ~a -90
+Y : -50
+Y , -100
+Y e -80
+Y 'e -80
+Y ^e -80
+Y :e -80
+Y `e -80
+Y o -100
+Y 'o -100
+Y ^o -100
+Y :o -100
+Y `o -100
+Y /o -100
+Y ~o -100
+Y . -100
+Y u2026 -100
+Y ; -50
+Y u -100
+Y 'u -100
+Y ^u -100
+Y :u -100
+Y `u -100
+'Y A -110
+'Y 'A -110
+'Y ^A -110
+'Y :A -110
+'Y `A -110
+'Y oA -110
+'Y ~A -110
+'Y O -70
+'Y 'O -70
+'Y ^O -70
+'Y :O -70
+'Y `O -70
+'Y /O -70
+'Y ~O -70
+'Y a -90
+'Y 'a -90
+'Y ^a -90
+'Y :a -90
+'Y `a -90
+'Y oa -90
+'Y ~a -90
+'Y : -50
+'Y , -100
+'Y e -80
+'Y 'e -80
+'Y ^e -80
+'Y :e -80
+'Y `e -80
+'Y o -100
+'Y 'o -100
+'Y ^o -100
+'Y :o -100
+'Y `o -100
+'Y /o -100
+'Y ~o -100
+'Y . -100
+'Y u2026 -100
+'Y ; -50
+'Y u -100
+'Y 'u -100
+'Y ^u -100
+'Y :u -100
+'Y `u -100
+:Y A -110
+:Y 'A -110
+:Y ^A -110
+:Y :A -110
+:Y `A -110
+:Y oA -110
+:Y ~A -110
+:Y O -70
+:Y 'O -70
+:Y ^O -70
+:Y :O -70
+:Y `O -70
+:Y /O -70
+:Y ~O -70
+:Y a -90
+:Y 'a -90
+:Y ^a -90
+:Y :a -90
+:Y `a -90
+:Y oa -90
+:Y ~a -90
+:Y : -50
+:Y , -100
+:Y e -80
+:Y 'e -80
+:Y ^e -80
+:Y :e -80
+:Y `e -80
+:Y o -100
+:Y 'o -100
+:Y ^o -100
+:Y :o -100
+:Y `o -100
+:Y /o -100
+:Y ~o -100
+:Y . -100
+:Y u2026 -100
+:Y ; -50
+:Y u -100
+:Y 'u -100
+:Y ^u -100
+:Y :u -100
+:Y `u -100
+a g -10
+a v -15
+a w -15
+a y -20
+a 'y -20
+a :y -20
+'a g -10
+'a v -15
+'a w -15
+'a y -20
+'a 'y -20
+'a :y -20
+^a g -10
+^a v -15
+^a w -15
+^a y -20
+^a 'y -20
+^a :y -20
+:a g -10
+:a v -15
+:a w -15
+:a y -20
+:a 'y -20
+:a :y -20
+`a g -10
+`a v -15
+`a w -15
+`a y -20
+`a 'y -20
+`a :y -20
+oa g -10
+oa v -15
+oa w -15
+oa y -20
+oa 'y -20
+oa :y -20
+~a g -10
+~a v -15
+~a w -15
+~a y -20
+~a 'y -20
+~a :y -20
+b l -10
+b /l -10
+b u -20
+b 'u -20
+b ^u -20
+b :u -20
+b `u -20
+b v -20
+b y -20
+b 'y -20
+b :y -20
+c h -10
+c k -20
+c l -20
+c /l -20
+c y -10
+c 'y -10
+c :y -10
+,c h -10
+,c k -20
+,c l -20
+,c /l -20
+,c y -10
+,c 'y -10
+,c :y -10
+: u0020 -40
+, rq -120
+, ' -120
+, cq -120
+, u0020 -40
+d d -10
+d v -15
+d w -15
+d y -15
+d 'y -15
+d :y -15
+e , 10
+e . 20
+e u2026 20
+e v -15
+e w -15
+e x -15
+e y -15
+e 'y -15
+e :y -15
+'e , 10
+'e . 20
+'e u2026 20
+'e v -15
+'e w -15
+'e x -15
+'e y -15
+'e 'y -15
+'e :y -15
+^e , 10
+^e . 20
+^e u2026 20
+^e v -15
+^e w -15
+^e x -15
+^e y -15
+^e 'y -15
+^e :y -15
+:e , 10
+:e . 20
+:e u2026 20
+:e v -15
+:e w -15
+:e x -15
+:e y -15
+:e 'y -15
+:e :y -15
+`e , 10
+`e . 20
+`e u2026 20
+`e v -15
+`e w -15
+`e x -15
+`e y -15
+`e 'y -15
+`e :y -15
+f , -10
+f e -10
+f 'e -10
+f ^e -10
+f :e -10
+f `e -10
+f o -20
+f 'o -20
+f ^o -20
+f :o -20
+f `o -20
+f /o -20
+f ~o -20
+f . -10
+f u2026 -10
+f rq 30
+f ' 30
+f cq 30
+g e 10
+g 'e 10
+g ^e 10
+g :e 10
+g `e 10
+g g -10
+h y -20
+h 'y -20
+h :y -20
+k o -15
+k 'o -15
+k ^o -15
+k :o -15
+k `o -15
+k /o -15
+k ~o -15
+l w -15
+l y -15
+l 'y -15
+l :y -15
+/l w -15
+/l y -15
+/l 'y -15
+/l :y -15
+m u -20
+m 'u -20
+m ^u -20
+m :u -20
+m `u -20
+m y -30
+m 'y -30
+m :y -30
+n u -10
+n 'u -10
+n ^u -10
+n :u -10
+n `u -10
+n v -40
+n y -20
+n 'y -20
+n :y -20
+~n u -10
+~n 'u -10
+~n ^u -10
+~n :u -10
+~n `u -10
+~n v -40
+~n y -20
+~n 'y -20
+~n :y -20
+o v -20
+o w -15
+o x -30
+o y -20
+o 'y -20
+o :y -20
+'o v -20
+'o w -15
+'o x -30
+'o y -20
+'o 'y -20
+'o :y -20
+^o v -20
+^o w -15
+^o x -30
+^o y -20
+^o 'y -20
+^o :y -20
+:o v -20
+:o w -15
+:o x -30
+:o y -20
+:o 'y -20
+:o :y -20
+`o v -20
+`o w -15
+`o x -30
+`o y -20
+`o 'y -20
+`o :y -20
+/o v -20
+/o w -15
+/o x -30
+/o y -20
+/o 'y -20
+/o :y -20
+~o v -20
+~o w -15
+~o x -30
+~o y -20
+~o 'y -20
+~o :y -20
+p y -15
+p 'y -15
+p :y -15
+. rq -120
+u2026 rq -120
+. ' -120
+u2026 ' -120
+. cq -120
+u2026 cq -120
+. u0020 -40
+u2026 u0020 -40
+rq u0020 -80
+` ` -46
+` oq -46
+oq ` -46
+oq oq -46
+' d -80
+cq d -80
+' l -20
+cq l -20
+' /l -20
+cq /l -20
+' ' -46
+' cq -46
+cq ' -46
+cq cq -46
+' r -40
+cq r -40
+' s -60
+cq s -60
+' vs -60
+cq vs -60
+' u0020 -80
+cq u0020 -80
+' v -20
+cq v -20
+r c -20
+r ,c -20
+r , -60
+r d -20
+r g -15
+r - -20
+r hy -20
+r o -20
+r 'o -20
+r ^o -20
+r :o -20
+r `o -20
+r /o -20
+r ~o -20
+r . -60
+r u2026 -60
+r q -20
+r s -15
+r vs -15
+r t 20
+r v 10
+r y 10
+r 'y 10
+r :y 10
+s w -15
+vs w -15
+; u0020 -40
+u0020 T -100
+u0020 V -80
+u0020 W -80
+u0020 Y -120
+u0020 'Y -120
+u0020 :Y -120
+u0020 lq -80
+u0020 ` -60
+u0020 oq -60
+v a -20
+v 'a -20
+v ^a -20
+v :a -20
+v `a -20
+v oa -20
+v ~a -20
+v , -80
+v o -30
+v 'o -30
+v ^o -30
+v :o -30
+v `o -30
+v /o -30
+v ~o -30
+v . -80
+v u2026 -80
+w , -40
+w o -20
+w 'o -20
+w ^o -20
+w :o -20
+w `o -20
+w /o -20
+w ~o -20
+w . -40
+w u2026 -40
+x e -10
+x 'e -10
+x ^e -10
+x :e -10
+x `e -10
+y a -30
+y 'a -30
+y ^a -30
+y :a -30
+y `a -30
+y oa -30
+y ~a -30
+y , -80
+y e -10
+y 'e -10
+y ^e -10
+y :e -10
+y `e -10
+y o -25
+y 'o -25
+y ^o -25
+y :o -25
+y `o -25
+y /o -25
+y ~o -25
+y . -80
+y u2026 -80
+'y a -30
+'y 'a -30
+'y ^a -30
+'y :a -30
+'y `a -30
+'y oa -30
+'y ~a -30
+'y , -80
+'y e -10
+'y 'e -10
+'y ^e -10
+'y :e -10
+'y `e -10
+'y o -25
+'y 'o -25
+'y ^o -25
+'y :o -25
+'y `o -25
+'y /o -25
+'y ~o -25
+'y . -80
+'y u2026 -80
+:y a -30
+:y 'a -30
+:y ^a -30
+:y :a -30
+:y `a -30
+:y oa -30
+:y ~a -30
+:y , -80
+:y e -10
+:y 'e -10
+:y ^e -10
+:y :e -10
+:y `e -10
+:y o -25
+:y 'o -25
+:y ^o -25
+:y :o -25
+:y `o -25
+:y /o -25
+:y ~o -25
+:y . -80
+:y u2026 -80
+z e 10
+z 'e 10
+z ^e 10
+z :e 10
+z `e 10
+vz e 10
+vz 'e 10
+vz ^e 10
+vz :e 10
+vz `e 10
+
+charset
+ha 584,698 2 0 asciicircum
+ti 584,343 0 1 asciitilde
+vS 667,936,19 2 2 Scaron
+vZ 611,936 2 3 Zcaron
+vs 556,750,14 2 4 scaron
+vz 500,750 2 5 zcaron
+:Y 667,915 2 6 Ydieresis
+tm 1000,718 2 7 trademark
+aq 238,718 2 8 quotesingle
+Eu 556,710,19,7 2 9 Euro
+space 278 0 32 space
+! 333,718 2 33 exclam
+" 474,718 2 34 quotedbl
+dq "
+# 556,698 2 35 numbersign
+sh "
+$ 556,775,115 2 36 dollar
+Do "
+% 889,710,19 2 37 percent
+& 722,718,19 2 38 ampersand
+' 278,718 2 39 quoteright
+cq "
+( 333,734,208 3 40 parenleft
+) 333,734,208 3 41 parenright
+* 389,718 2 42 asterisk
++ 584,506 0 43 plus
+, 278,146,168 0 44 comma
+- 333,345 0 45 hyphen
+hy "
+. 278,146 0 46 period
+/ 278,737,19,33,33 2 47 slash
+sl "
+0 556,710,19 2 48 zero
+1 556,710 2 49 one
+2 556,710 2 50 two
+3 556,710,19 2 51 three
+4 556,710 2 52 four
+5 556,698,19 2 53 five
+6 556,710,19 2 54 six
+7 556,698 2 55 seven
+8 556,710,19 2 56 eight
+9 556,710,19 2 57 nine
+: 333,512 0 58 colon
+; 333,512,168 0 59 semicolon
+< 584,514,8 0 60 less
+= 584,419 0 61 equal
+> 584,514,8 0 62 greater
+? 611,727 2 63 question
+@ 975,737,19 2 64 at
+at "
+A 722,718 2 65 A
+B 722,718 2 66 B
+C 722,737,19 2 67 C
+D 722,718 2 68 D
+E 667,718 2 69 E
+F 611,718 2 70 F
+G 778,737,19 2 71 G
+H 722,718 2 72 H
+I 278,718 2 73 I
+J 556,718,18 2 74 J
+K 722,718 2 75 K
+L 611,718 2 76 L
+M 833,718 2 77 M
+N 722,718 2 78 N
+O 778,737,19 2 79 O
+P 667,718 2 80 P
+Q 778,737,52 2 81 Q
+R 722,718 2 82 R
+S 667,737,19 2 83 S
+T 611,718 2 84 T
+U 722,718,19 2 85 U
+V 667,718 2 86 V
+W 944,718 2 87 W
+X 667,718 2 88 X
+Y 667,718 2 89 Y
+Z 611,718 2 90 Z
+[ 333,722,196 2 91 bracketleft
+lB "
+\ 278,737,19,33,33 2 92 backslash
+rs "
+] 333,722,196 2 93 bracketright
+rB "
+^ 333,750,0,10,10 2 94 circumflex
+a^ "
+_ 556,0,125 0 95 underscore
+` 278,727 2 96 quoteleft
+oq "
+a 556,546,14 0 97 a
+b 611,718,14 2 98 b
+c 556,546,14 0 99 c
+d 611,718,14 2 100 d
+e 556,546,14 0 101 e
+f 333,727 2 102 f
+g 611,546,217 1 103 g
+h 611,718 2 104 h
+i 278,725 2 105 i
+j 278,725,214 3 106 j
+k 556,718,0,6 2 107 k
+l 278,718 2 108 l
+m 889,546 0 109 m
+n 611,546 0 110 n
+o 611,546,14 0 111 o
+p 611,546,207 1 112 p
+q 611,546,207 1 113 q
+r 389,546 0 114 r
+s 556,546,14 0 115 s
+t 333,676,6 2 116 t
+u 611,532,14 0 117 u
+v 556,532 0 118 v
+w 778,532 0 119 w
+x 556,532 0 120 x
+y 556,532,214 1 121 y
+z 500,532 0 122 z
+{ 389,722,196 2 123 braceleft
+lC "
+| 280,775,225 3 124 bar
+ba "
+} 389,722,196 2 125 braceright
+rC "
+~ 333,737,0,17,17 2 126 tilde
+a~ "
+bq 278,127,146 0 128 quotesinglbase
+Fo 556,484 0 129 guillemotleft
+Fc 556,484 0 130 guillemotright
+bu 350,524 0 131 bullet
+Fn 556,737,210,0,10 3 132 florin
+f/ 167,710,19,169,170 2 133 fraction
+%0 1000,710,19,3,3 2 134 perthousand
+dg 556,718,171 2 135 dagger
+dd 556,718,171 2 136 daggerdbl
+en 556,333 0 137 endash
+em 1000,333 0 138 emdash
+fi 611,727 2 140 fi
+fl 611,727 2 141 fl
+.i 278,532 0 144 dotlessi
+ga 333,750,0,0,23 2 146 grave
+a" 333,750,0,153 2 147 hungarumlaut
+a. 333,729 2 148 dotaccent
+ab 333,750,0,2,2 2 149 breve
+ah 333,750,0,10,10 2 150 caron
+ao 333,776 2 151 ring
+ho 333,0,228 1 152 ogonek
+lq 500,727 2 153 quotedblleft
+rq 500,718 2 154 quotedblright
+oe 944,546,14 0 155 oe
+/l 278,718,0,18,18 2 156 lslash
+Bq 500,127,146 0 157 quotedblbase
+OE 1000,737,19 2 158 OE
+/L 611,718,0,0,20 2 159 Lslash
+r! 333,532,186 0 161 exclamdown
+ct 556,628,118 0 162 cent
+Po 556,718,16 2 163 sterling
+Cs 556,636,0,3,3 0 164 currency
+Ye 556,698,0,9,9 2 165 yen
+bb 280,700,150 2 166 brokenbar
+sc 556,727,184 2 167 section
+ad 333,729 2 168 dieresis
+co 737,737,19,12,11 2 169 copyright
+Of 370,737 2 170 ordfeminine
+fo 333,484 0 171 guilsinglleft
+tno 584,419 0 172 logicalnot
+\- 584,309 0 173 minus
+rg 737,737,19,11,11 2 174 registered
+a- 333,678,0,6,6 2 175 macron
+de 400,712 2 176 degree
+t+- 584,506 0 177 plusminus
+S2 333,710 2 178 twosuperior
+S3 333,710 2 179 threesuperior
+aa 333,750,0,23 2 180 acute
+*m 611,532,207 1 181 mu
+mc "
+ps 556,700,191,0,8 2 182 paragraph
+pc 278,334 0 183 periodcentered
+ac 333,0,228 1 184 cedilla
+S1 333,710 2 185 onesuperior
+Om 365,737 2 186 ordmasculine
+fc 333,484 0 187 guilsinglright
+14 834,710,19 2 188 onequarter
+12 834,710,19 2 189 onehalf
+34 834,710,19 2 190 threequarters
+r? 611,532,195 0 191 questiondown
+`A 722,936 2 192 Agrave
+'A 722,936 2 193 Aacute
+^A 722,936 2 194 Acircumflex
+~A 722,923 2 195 Atilde
+:A 722,915 2 196 Adieresis
+oA 722,962 2 197 Aring
+AE 1000,718 2 198 AE
+,C 722,737,228 3 199 Ccedilla
+`E 667,936 2 200 Egrave
+'E 667,936 2 201 Eacute
+^E 667,936 2 202 Ecircumflex
+:E 667,915 2 203 Edieresis
+`I 278,936,0,0,50 2 204 Igrave
+'I 278,936,0,51 2 205 Iacute
+^I 278,936,0,38,37 2 206 Icircumflex
+:I 278,915,0,22,21 2 207 Idieresis
+-D 722,718,0,0,5 2 208 Eth
+~N 722,923 2 209 Ntilde
+`O 778,936,19 2 210 Ograve
+'O 778,936,19 2 211 Oacute
+^O 778,936,19 2 212 Ocircumflex
+~O 778,923,19 2 213 Otilde
+:O 778,915,19 2 214 Odieresis
+tmu 584,505 0 215 multiply
+/O 778,745,27 2 216 Oslash
+`U 722,936,19 2 217 Ugrave
+'U 722,936,19 2 218 Uacute
+^U 722,936,19 2 219 Ucircumflex
+:U 722,915,19 2 220 Udieresis
+'Y 667,936 2 221 Yacute
+TP 667,718 2 222 Thorn
+ss 611,731,14 2 223 germandbls
+`a 556,750,14 2 224 agrave
+'a 556,750,14 2 225 aacute
+^a 556,750,14 2 226 acircumflex
+~a 556,737,14 2 227 atilde
+:a 556,729,14 2 228 adieresis
+oa 556,776,14 2 229 aring
+ae 889,546,14 0 230 ae
+,c 556,546,228 1 231 ccedilla
+`e 556,750,14 2 232 egrave
+'e 556,750,14 2 233 eacute
+^e 556,750,14 2 234 ecircumflex
+:e 556,729,14 2 235 edieresis
+`i 278,750,0,0,50 2 236 igrave
+'i 278,750,0,51 2 237 iacute
+^i 278,750,0,38,37 2 238 icircumflex
+:i 278,729,0,22,21 2 239 idieresis
+Sd 611,737,14 2 240 eth
+~n 611,737 2 241 ntilde
+`o 611,750,14 2 242 ograve
+'o 611,750,14 2 243 oacute
+^o 611,750,14 2 244 ocircumflex
+~o 611,737,14 2 245 otilde
+:o 611,729,14 2 246 odieresis
+tdi 584,548,42 0 247 divide
+/o 611,560,29 0 248 oslash
+`u 611,750,14 2 249 ugrave
+'u 611,750,14 2 250 uacute
+^u 611,750,14 2 251 ucircumflex
+:u 611,729,14 2 252 udieresis
+'y 556,750,214 3 253 yacute
+Tp 611,718,208 3 254 thorn
+:y 556,729,214 3 255 ydieresis
+u2026 1000,146 0 256 ellipsis
diff --git a/font/devps/HBI b/font/devps/HBI
new file mode 100644
index 0000000..2ebe703
--- /dev/null
+++ b/font/devps/HBI
@@ -0,0 +1,1514 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Helvetica Bold Oblique
+# Version 003.001
+# FamilyName Helvetica
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 12:46:09 1999
+# Comment UniqueID 44700
+# Comment VMusage 10926 50493
+
+name HBI
+internalname Helvetica-BoldOblique
+slant 12
+spacewidth 278
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A C -40
+A ,C -40
+A G -50
+A O -40
+A 'O -40
+A ^O -40
+A :O -40
+A `O -40
+A /O -40
+A ~O -40
+A Q -40
+A T -90
+A U -50
+A 'U -50
+A ^U -50
+A :U -50
+A `U -50
+A V -80
+A W -60
+A Y -110
+A 'Y -110
+A :Y -110
+A u -30
+A 'u -30
+A ^u -30
+A :u -30
+A `u -30
+A v -40
+A w -30
+A y -30
+A 'y -30
+A :y -30
+'A C -40
+'A ,C -40
+'A G -50
+'A O -40
+'A 'O -40
+'A ^O -40
+'A :O -40
+'A `O -40
+'A /O -40
+'A ~O -40
+'A Q -40
+'A T -90
+'A U -50
+'A 'U -50
+'A ^U -50
+'A :U -50
+'A `U -50
+'A V -80
+'A W -60
+'A Y -110
+'A 'Y -110
+'A :Y -110
+'A u -30
+'A 'u -30
+'A ^u -30
+'A :u -30
+'A `u -30
+'A v -40
+'A w -30
+'A y -30
+'A 'y -30
+'A :y -30
+^A C -40
+^A ,C -40
+^A G -50
+^A O -40
+^A 'O -40
+^A ^O -40
+^A :O -40
+^A `O -40
+^A /O -40
+^A ~O -40
+^A Q -40
+^A T -90
+^A U -50
+^A 'U -50
+^A ^U -50
+^A :U -50
+^A `U -50
+^A V -80
+^A W -60
+^A Y -110
+^A 'Y -110
+^A :Y -110
+^A u -30
+^A 'u -30
+^A ^u -30
+^A :u -30
+^A `u -30
+^A v -40
+^A w -30
+^A y -30
+^A 'y -30
+^A :y -30
+:A C -40
+:A ,C -40
+:A G -50
+:A O -40
+:A 'O -40
+:A ^O -40
+:A :O -40
+:A `O -40
+:A /O -40
+:A ~O -40
+:A Q -40
+:A T -90
+:A U -50
+:A 'U -50
+:A ^U -50
+:A :U -50
+:A `U -50
+:A V -80
+:A W -60
+:A Y -110
+:A 'Y -110
+:A :Y -110
+:A u -30
+:A 'u -30
+:A ^u -30
+:A :u -30
+:A `u -30
+:A v -40
+:A w -30
+:A y -30
+:A 'y -30
+:A :y -30
+`A C -40
+`A ,C -40
+`A G -50
+`A O -40
+`A 'O -40
+`A ^O -40
+`A :O -40
+`A `O -40
+`A /O -40
+`A ~O -40
+`A Q -40
+`A T -90
+`A U -50
+`A 'U -50
+`A ^U -50
+`A :U -50
+`A `U -50
+`A V -80
+`A W -60
+`A Y -110
+`A 'Y -110
+`A :Y -110
+`A u -30
+`A 'u -30
+`A ^u -30
+`A :u -30
+`A `u -30
+`A v -40
+`A w -30
+`A y -30
+`A 'y -30
+`A :y -30
+oA C -40
+oA ,C -40
+oA G -50
+oA O -40
+oA 'O -40
+oA ^O -40
+oA :O -40
+oA `O -40
+oA /O -40
+oA ~O -40
+oA Q -40
+oA T -90
+oA U -50
+oA 'U -50
+oA ^U -50
+oA :U -50
+oA `U -50
+oA V -80
+oA W -60
+oA Y -110
+oA 'Y -110
+oA :Y -110
+oA u -30
+oA 'u -30
+oA ^u -30
+oA :u -30
+oA `u -30
+oA v -40
+oA w -30
+oA y -30
+oA 'y -30
+oA :y -30
+~A C -40
+~A ,C -40
+~A G -50
+~A O -40
+~A 'O -40
+~A ^O -40
+~A :O -40
+~A `O -40
+~A /O -40
+~A ~O -40
+~A Q -40
+~A T -90
+~A U -50
+~A 'U -50
+~A ^U -50
+~A :U -50
+~A `U -50
+~A V -80
+~A W -60
+~A Y -110
+~A 'Y -110
+~A :Y -110
+~A u -30
+~A 'u -30
+~A ^u -30
+~A :u -30
+~A `u -30
+~A v -40
+~A w -30
+~A y -30
+~A 'y -30
+~A :y -30
+B A -30
+B 'A -30
+B ^A -30
+B :A -30
+B `A -30
+B oA -30
+B ~A -30
+B U -10
+B 'U -10
+B ^U -10
+B :U -10
+B `U -10
+D A -40
+D 'A -40
+D ^A -40
+D :A -40
+D `A -40
+D oA -40
+D ~A -40
+D V -40
+D W -40
+D Y -70
+D 'Y -70
+D :Y -70
+D , -30
+D . -30
+D u2026 -30
+F A -80
+F 'A -80
+F ^A -80
+F :A -80
+F `A -80
+F oA -80
+F ~A -80
+F a -20
+F 'a -20
+F ^a -20
+F :a -20
+F `a -20
+F oa -20
+F ~a -20
+F , -100
+F . -100
+F u2026 -100
+J A -20
+J 'A -20
+J ^A -20
+J :A -20
+J `A -20
+J oA -20
+J ~A -20
+J , -20
+J . -20
+J u2026 -20
+J u -20
+J 'u -20
+J ^u -20
+J :u -20
+J `u -20
+K O -30
+K 'O -30
+K ^O -30
+K :O -30
+K `O -30
+K /O -30
+K ~O -30
+K e -15
+K 'e -15
+K ^e -15
+K :e -15
+K `e -15
+K o -35
+K 'o -35
+K ^o -35
+K :o -35
+K `o -35
+K /o -35
+K ~o -35
+K u -30
+K 'u -30
+K ^u -30
+K :u -30
+K `u -30
+K y -40
+K 'y -40
+K :y -40
+L T -90
+L V -110
+L W -80
+L Y -120
+L 'Y -120
+L :Y -120
+L rq -140
+L ' -140
+L cq -140
+L y -30
+L 'y -30
+L :y -30
+/L T -90
+/L V -110
+/L W -80
+/L Y -120
+/L 'Y -120
+/L :Y -120
+/L rq -140
+/L ' -140
+/L cq -140
+/L y -30
+/L 'y -30
+/L :y -30
+O A -50
+O 'A -50
+O ^A -50
+O :A -50
+O `A -50
+O oA -50
+O ~A -50
+O T -40
+O V -50
+O W -50
+O X -50
+O Y -70
+O 'Y -70
+O :Y -70
+O , -40
+O . -40
+O u2026 -40
+'O A -50
+'O 'A -50
+'O ^A -50
+'O :A -50
+'O `A -50
+'O oA -50
+'O ~A -50
+'O T -40
+'O V -50
+'O W -50
+'O X -50
+'O Y -70
+'O 'Y -70
+'O :Y -70
+'O , -40
+'O . -40
+'O u2026 -40
+^O A -50
+^O 'A -50
+^O ^A -50
+^O :A -50
+^O `A -50
+^O oA -50
+^O ~A -50
+^O T -40
+^O V -50
+^O W -50
+^O X -50
+^O Y -70
+^O 'Y -70
+^O :Y -70
+^O , -40
+^O . -40
+^O u2026 -40
+:O A -50
+:O 'A -50
+:O ^A -50
+:O :A -50
+:O `A -50
+:O oA -50
+:O ~A -50
+:O T -40
+:O V -50
+:O W -50
+:O X -50
+:O Y -70
+:O 'Y -70
+:O :Y -70
+:O , -40
+:O . -40
+:O u2026 -40
+`O A -50
+`O 'A -50
+`O ^A -50
+`O :A -50
+`O `A -50
+`O oA -50
+`O ~A -50
+`O T -40
+`O V -50
+`O W -50
+`O X -50
+`O Y -70
+`O 'Y -70
+`O :Y -70
+`O , -40
+`O . -40
+`O u2026 -40
+/O A -50
+/O 'A -50
+/O ^A -50
+/O :A -50
+/O `A -50
+/O oA -50
+/O ~A -50
+/O T -40
+/O V -50
+/O W -50
+/O X -50
+/O Y -70
+/O 'Y -70
+/O :Y -70
+/O , -40
+/O . -40
+/O u2026 -40
+~O A -50
+~O 'A -50
+~O ^A -50
+~O :A -50
+~O `A -50
+~O oA -50
+~O ~A -50
+~O T -40
+~O V -50
+~O W -50
+~O X -50
+~O Y -70
+~O 'Y -70
+~O :Y -70
+~O , -40
+~O . -40
+~O u2026 -40
+P A -100
+P 'A -100
+P ^A -100
+P :A -100
+P `A -100
+P oA -100
+P ~A -100
+P a -30
+P 'a -30
+P ^a -30
+P :a -30
+P `a -30
+P oa -30
+P ~a -30
+P , -120
+P e -30
+P 'e -30
+P ^e -30
+P :e -30
+P `e -30
+P o -40
+P 'o -40
+P ^o -40
+P :o -40
+P `o -40
+P /o -40
+P ~o -40
+P . -120
+P u2026 -120
+Q U -10
+Q 'U -10
+Q ^U -10
+Q :U -10
+Q `U -10
+Q , 20
+Q . 20
+Q u2026 20
+R O -20
+R 'O -20
+R ^O -20
+R :O -20
+R `O -20
+R /O -20
+R ~O -20
+R T -20
+R U -20
+R 'U -20
+R ^U -20
+R :U -20
+R `U -20
+R V -50
+R W -40
+R Y -50
+R 'Y -50
+R :Y -50
+T A -90
+T 'A -90
+T ^A -90
+T :A -90
+T `A -90
+T oA -90
+T ~A -90
+T O -40
+T 'O -40
+T ^O -40
+T :O -40
+T `O -40
+T /O -40
+T ~O -40
+T a -80
+T 'a -80
+T ^a -80
+T :a -80
+T `a -80
+T oa -80
+T ~a -80
+T : -40
+T , -80
+T e -60
+T 'e -60
+T ^e -60
+T :e -60
+T `e -60
+T - -120
+T hy -120
+T o -80
+T 'o -80
+T ^o -80
+T :o -80
+T `o -80
+T /o -80
+T ~o -80
+T . -80
+T u2026 -80
+T r -80
+T ; -40
+T u -90
+T 'u -90
+T ^u -90
+T :u -90
+T `u -90
+T w -60
+T y -60
+T 'y -60
+T :y -60
+U A -50
+U 'A -50
+U ^A -50
+U :A -50
+U `A -50
+U oA -50
+U ~A -50
+U , -30
+U . -30
+U u2026 -30
+'U A -50
+'U 'A -50
+'U ^A -50
+'U :A -50
+'U `A -50
+'U oA -50
+'U ~A -50
+'U , -30
+'U . -30
+'U u2026 -30
+^U A -50
+^U 'A -50
+^U ^A -50
+^U :A -50
+^U `A -50
+^U oA -50
+^U ~A -50
+^U , -30
+^U . -30
+^U u2026 -30
+:U A -50
+:U 'A -50
+:U ^A -50
+:U :A -50
+:U `A -50
+:U oA -50
+:U ~A -50
+:U , -30
+:U . -30
+:U u2026 -30
+`U A -50
+`U 'A -50
+`U ^A -50
+`U :A -50
+`U `A -50
+`U oA -50
+`U ~A -50
+`U , -30
+`U . -30
+`U u2026 -30
+V A -80
+V 'A -80
+V ^A -80
+V :A -80
+V `A -80
+V oA -80
+V ~A -80
+V G -50
+V O -50
+V 'O -50
+V ^O -50
+V :O -50
+V `O -50
+V /O -50
+V ~O -50
+V a -60
+V 'a -60
+V ^a -60
+V :a -60
+V `a -60
+V oa -60
+V ~a -60
+V : -40
+V , -120
+V e -50
+V 'e -50
+V ^e -50
+V :e -50
+V `e -50
+V - -80
+V hy -80
+V o -90
+V 'o -90
+V ^o -90
+V :o -90
+V `o -90
+V /o -90
+V ~o -90
+V . -120
+V u2026 -120
+V ; -40
+V u -60
+V 'u -60
+V ^u -60
+V :u -60
+V `u -60
+W A -60
+W 'A -60
+W ^A -60
+W :A -60
+W `A -60
+W oA -60
+W ~A -60
+W O -20
+W 'O -20
+W ^O -20
+W :O -20
+W `O -20
+W /O -20
+W ~O -20
+W a -40
+W 'a -40
+W ^a -40
+W :a -40
+W `a -40
+W oa -40
+W ~a -40
+W : -10
+W , -80
+W e -35
+W 'e -35
+W ^e -35
+W :e -35
+W `e -35
+W - -40
+W hy -40
+W o -60
+W 'o -60
+W ^o -60
+W :o -60
+W `o -60
+W /o -60
+W ~o -60
+W . -80
+W u2026 -80
+W ; -10
+W u -45
+W 'u -45
+W ^u -45
+W :u -45
+W `u -45
+W y -20
+W 'y -20
+W :y -20
+Y A -110
+Y 'A -110
+Y ^A -110
+Y :A -110
+Y `A -110
+Y oA -110
+Y ~A -110
+Y O -70
+Y 'O -70
+Y ^O -70
+Y :O -70
+Y `O -70
+Y /O -70
+Y ~O -70
+Y a -90
+Y 'a -90
+Y ^a -90
+Y :a -90
+Y `a -90
+Y oa -90
+Y ~a -90
+Y : -50
+Y , -100
+Y e -80
+Y 'e -80
+Y ^e -80
+Y :e -80
+Y `e -80
+Y o -100
+Y 'o -100
+Y ^o -100
+Y :o -100
+Y `o -100
+Y /o -100
+Y ~o -100
+Y . -100
+Y u2026 -100
+Y ; -50
+Y u -100
+Y 'u -100
+Y ^u -100
+Y :u -100
+Y `u -100
+'Y A -110
+'Y 'A -110
+'Y ^A -110
+'Y :A -110
+'Y `A -110
+'Y oA -110
+'Y ~A -110
+'Y O -70
+'Y 'O -70
+'Y ^O -70
+'Y :O -70
+'Y `O -70
+'Y /O -70
+'Y ~O -70
+'Y a -90
+'Y 'a -90
+'Y ^a -90
+'Y :a -90
+'Y `a -90
+'Y oa -90
+'Y ~a -90
+'Y : -50
+'Y , -100
+'Y e -80
+'Y 'e -80
+'Y ^e -80
+'Y :e -80
+'Y `e -80
+'Y o -100
+'Y 'o -100
+'Y ^o -100
+'Y :o -100
+'Y `o -100
+'Y /o -100
+'Y ~o -100
+'Y . -100
+'Y u2026 -100
+'Y ; -50
+'Y u -100
+'Y 'u -100
+'Y ^u -100
+'Y :u -100
+'Y `u -100
+:Y A -110
+:Y 'A -110
+:Y ^A -110
+:Y :A -110
+:Y `A -110
+:Y oA -110
+:Y ~A -110
+:Y O -70
+:Y 'O -70
+:Y ^O -70
+:Y :O -70
+:Y `O -70
+:Y /O -70
+:Y ~O -70
+:Y a -90
+:Y 'a -90
+:Y ^a -90
+:Y :a -90
+:Y `a -90
+:Y oa -90
+:Y ~a -90
+:Y : -50
+:Y , -100
+:Y e -80
+:Y 'e -80
+:Y ^e -80
+:Y :e -80
+:Y `e -80
+:Y o -100
+:Y 'o -100
+:Y ^o -100
+:Y :o -100
+:Y `o -100
+:Y /o -100
+:Y ~o -100
+:Y . -100
+:Y u2026 -100
+:Y ; -50
+:Y u -100
+:Y 'u -100
+:Y ^u -100
+:Y :u -100
+:Y `u -100
+a g -10
+a v -15
+a w -15
+a y -20
+a 'y -20
+a :y -20
+'a g -10
+'a v -15
+'a w -15
+'a y -20
+'a 'y -20
+'a :y -20
+^a g -10
+^a v -15
+^a w -15
+^a y -20
+^a 'y -20
+^a :y -20
+:a g -10
+:a v -15
+:a w -15
+:a y -20
+:a 'y -20
+:a :y -20
+`a g -10
+`a v -15
+`a w -15
+`a y -20
+`a 'y -20
+`a :y -20
+oa g -10
+oa v -15
+oa w -15
+oa y -20
+oa 'y -20
+oa :y -20
+~a g -10
+~a v -15
+~a w -15
+~a y -20
+~a 'y -20
+~a :y -20
+b l -10
+b /l -10
+b u -20
+b 'u -20
+b ^u -20
+b :u -20
+b `u -20
+b v -20
+b y -20
+b 'y -20
+b :y -20
+c h -10
+c k -20
+c l -20
+c /l -20
+c y -10
+c 'y -10
+c :y -10
+,c h -10
+,c k -20
+,c l -20
+,c /l -20
+,c y -10
+,c 'y -10
+,c :y -10
+: u0020 -40
+, rq -120
+, ' -120
+, cq -120
+, u0020 -40
+d d -10
+d v -15
+d w -15
+d y -15
+d 'y -15
+d :y -15
+e , 10
+e . 20
+e u2026 20
+e v -15
+e w -15
+e x -15
+e y -15
+e 'y -15
+e :y -15
+'e , 10
+'e . 20
+'e u2026 20
+'e v -15
+'e w -15
+'e x -15
+'e y -15
+'e 'y -15
+'e :y -15
+^e , 10
+^e . 20
+^e u2026 20
+^e v -15
+^e w -15
+^e x -15
+^e y -15
+^e 'y -15
+^e :y -15
+:e , 10
+:e . 20
+:e u2026 20
+:e v -15
+:e w -15
+:e x -15
+:e y -15
+:e 'y -15
+:e :y -15
+`e , 10
+`e . 20
+`e u2026 20
+`e v -15
+`e w -15
+`e x -15
+`e y -15
+`e 'y -15
+`e :y -15
+f , -10
+f e -10
+f 'e -10
+f ^e -10
+f :e -10
+f `e -10
+f o -20
+f 'o -20
+f ^o -20
+f :o -20
+f `o -20
+f /o -20
+f ~o -20
+f . -10
+f u2026 -10
+f rq 30
+f ' 30
+f cq 30
+g e 10
+g 'e 10
+g ^e 10
+g :e 10
+g `e 10
+g g -10
+h y -20
+h 'y -20
+h :y -20
+k o -15
+k 'o -15
+k ^o -15
+k :o -15
+k `o -15
+k /o -15
+k ~o -15
+l w -15
+l y -15
+l 'y -15
+l :y -15
+/l w -15
+/l y -15
+/l 'y -15
+/l :y -15
+m u -20
+m 'u -20
+m ^u -20
+m :u -20
+m `u -20
+m y -30
+m 'y -30
+m :y -30
+n u -10
+n 'u -10
+n ^u -10
+n :u -10
+n `u -10
+n v -40
+n y -20
+n 'y -20
+n :y -20
+~n u -10
+~n 'u -10
+~n ^u -10
+~n :u -10
+~n `u -10
+~n v -40
+~n y -20
+~n 'y -20
+~n :y -20
+o v -20
+o w -15
+o x -30
+o y -20
+o 'y -20
+o :y -20
+'o v -20
+'o w -15
+'o x -30
+'o y -20
+'o 'y -20
+'o :y -20
+^o v -20
+^o w -15
+^o x -30
+^o y -20
+^o 'y -20
+^o :y -20
+:o v -20
+:o w -15
+:o x -30
+:o y -20
+:o 'y -20
+:o :y -20
+`o v -20
+`o w -15
+`o x -30
+`o y -20
+`o 'y -20
+`o :y -20
+/o v -20
+/o w -15
+/o x -30
+/o y -20
+/o 'y -20
+/o :y -20
+~o v -20
+~o w -15
+~o x -30
+~o y -20
+~o 'y -20
+~o :y -20
+p y -15
+p 'y -15
+p :y -15
+. rq -120
+u2026 rq -120
+. ' -120
+u2026 ' -120
+. cq -120
+u2026 cq -120
+. u0020 -40
+u2026 u0020 -40
+rq u0020 -80
+` ` -46
+` oq -46
+oq ` -46
+oq oq -46
+' d -80
+cq d -80
+' l -20
+cq l -20
+' /l -20
+cq /l -20
+' ' -46
+' cq -46
+cq ' -46
+cq cq -46
+' r -40
+cq r -40
+' s -60
+cq s -60
+' vs -60
+cq vs -60
+' u0020 -80
+cq u0020 -80
+' v -20
+cq v -20
+r c -20
+r ,c -20
+r , -60
+r d -20
+r g -15
+r - -20
+r hy -20
+r o -20
+r 'o -20
+r ^o -20
+r :o -20
+r `o -20
+r /o -20
+r ~o -20
+r . -60
+r u2026 -60
+r q -20
+r s -15
+r vs -15
+r t 20
+r v 10
+r y 10
+r 'y 10
+r :y 10
+s w -15
+vs w -15
+; u0020 -40
+u0020 T -100
+u0020 V -80
+u0020 W -80
+u0020 Y -120
+u0020 'Y -120
+u0020 :Y -120
+u0020 lq -80
+u0020 ` -60
+u0020 oq -60
+v a -20
+v 'a -20
+v ^a -20
+v :a -20
+v `a -20
+v oa -20
+v ~a -20
+v , -80
+v o -30
+v 'o -30
+v ^o -30
+v :o -30
+v `o -30
+v /o -30
+v ~o -30
+v . -80
+v u2026 -80
+w , -40
+w o -20
+w 'o -20
+w ^o -20
+w :o -20
+w `o -20
+w /o -20
+w ~o -20
+w . -40
+w u2026 -40
+x e -10
+x 'e -10
+x ^e -10
+x :e -10
+x `e -10
+y a -30
+y 'a -30
+y ^a -30
+y :a -30
+y `a -30
+y oa -30
+y ~a -30
+y , -80
+y e -10
+y 'e -10
+y ^e -10
+y :e -10
+y `e -10
+y o -25
+y 'o -25
+y ^o -25
+y :o -25
+y `o -25
+y /o -25
+y ~o -25
+y . -80
+y u2026 -80
+'y a -30
+'y 'a -30
+'y ^a -30
+'y :a -30
+'y `a -30
+'y oa -30
+'y ~a -30
+'y , -80
+'y e -10
+'y 'e -10
+'y ^e -10
+'y :e -10
+'y `e -10
+'y o -25
+'y 'o -25
+'y ^o -25
+'y :o -25
+'y `o -25
+'y /o -25
+'y ~o -25
+'y . -80
+'y u2026 -80
+:y a -30
+:y 'a -30
+:y ^a -30
+:y :a -30
+:y `a -30
+:y oa -30
+:y ~a -30
+:y , -80
+:y e -10
+:y 'e -10
+:y ^e -10
+:y :e -10
+:y `e -10
+:y o -25
+:y 'o -25
+:y ^o -25
+:y :o -25
+:y `o -25
+:y /o -25
+:y ~o -25
+:y . -80
+:y u2026 -80
+z e 10
+z 'e 10
+z ^e 10
+z :e 10
+z `e 10
+vz e 10
+vz 'e 10
+vz ^e 10
+vz :e 10
+vz `e 10
+
+charset
+ha 584,698,0,57,-80,57 2 0 asciicircum
+ti 584,343,0,43,-64,43 0 1 asciitilde
+vS 667,936,19,101,-30,90 2 2 Scaron
+vZ 611,936,0,176,25,90 2 3 Zcaron
+vs 556,750,14,109,-12,90 2 4 scaron
+vz 500,750,0,137,30,90 2 5 zcaron
+:Y 667,915,0,189,-117,90 2 6 Ydieresis
+tm 1000,718,0,159,-128,90 2 7 trademark
+aq 238,718,0,133,-115,90 2 8 quotesingle
+Eu 556,710,19,189,-9,90 2 9 Euro
+space 278 0 32 space
+! 333,718,0,114,-44,90 2 33 exclam
+" 474,718,0,105,-143,90 2 34 quotedbl
+dq "
+# 556,698,0,139,-10,90 2 35 numbersign
+sh "
+$ 556,775,115,116,-16,90 2 36 dollar
+Do "
+% 889,710,19,63,-86,63 2 37 percent
+& 722,718,19,61,-38,61 2 38 ampersand
+' 278,718,0,134,-116,90 2 39 quoteright
+cq "
+( 333,734,208,188,-25,90 3 40 parenleft
+) 333,734,208,86,76,86 3 41 parenright
+* 389,718,0,143,-96,90 2 42 asterisk
++ 584,506,0,76,-31,76 0 43 plus
+, 278,146,168,18,22,18 0 44 comma
+- 333,345,0,97,-22,90 0 45 hyphen
+hy "
+. 278,146,0,18,-14,18 0 46 period
+/ 278,737,19,240,88,90 2 47 slash
+sl "
+0 556,710,19,112,-36,90 2 48 zero
+1 556,710,0,23,-122,23 2 49 one
+2 556,710,0,114,24,90 2 50 two
+3 556,710,19,103,-15,90 2 51 three
+4 556,710,0,92,-10,90 2 52 four
+5 556,698,19,131,-14,90 2 53 five
+6 556,710,19,114,-34,90 2 54 six
+7 556,698,0,171,-75,90 2 55 seven
+8 556,710,19,110,-19,90 2 56 eight
+9 556,710,19,109,-27,90 2 57 nine
+: 333,512,0,68,-42,68 0 58 colon
+; 333,512,168,68,-6,68 0 59 semicolon
+< 584,514,8,122,-32,90 0 60 less
+= 584,419,0,100,-8,90 0 61 equal
+> 584,514,8,76,14,76 0 62 greater
+? 611,727,0,111,-114,90 2 63 question
+@ 975,737,19,29,-135,29 2 64 at
+at "
+A 722,718,0,30,30,30 2 65 A
+B 722,718,0,92,-26,90 2 66 B
+C 722,737,19,117,-57,90 2 67 C
+D 722,718,0,105,-26,90 2 68 D
+E 667,718,0,140,-26,90 2 69 E
+F 611,718,0,179,-26,90 2 70 F
+G 778,737,19,89,-57,89 2 71 G
+H 722,718,0,132,-21,90 2 72 H
+I 278,718,0,139,-14,90 2 73 I
+J 556,718,18,131,-9,90 2 74 J
+K 722,718,0,186,-37,90 2 75 K
+L 611,718,0,50,-26,50 2 76 L
+M 833,718,0,135,-19,90 2 77 M
+N 722,718,0,135,-19,90 2 78 N
+O 778,737,19,96,-57,90 2 79 O
+P 667,718,0,121,-26,90 2 80 P
+Q 778,737,52,96,-57,90 2 81 Q
+R 722,718,0,107,-26,90 2 82 R
+S 667,737,19,101,-30,90 2 83 S
+T 611,718,0,190,-89,90 2 84 T
+U 722,718,19,132,-65,90 2 85 U
+V 667,718,0,184,-121,90 2 86 V
+W 944,718,0,188,-118,90 2 87 W
+X 667,718,0,174,36,90 2 88 X
+Y 667,718,0,189,-117,90 2 89 Y
+Z 611,718,0,176,25,90 2 90 Z
+[ 333,722,196,180,29,90 2 91 bracketleft
+lB "
+\ 278,737,19,79,-73,79 2 92 backslash
+rs "
+] 333,722,196,141,68,90 2 93 bracketright
+rB "
+^ 333,750,0,189,-68,90 2 94 circumflex
+a^ "
+_ 556,0,125,35,77,35 0 95 underscore
+` 278,727,0,133,-115,90 2 96 quoteleft
+oq "
+a 556,546,14,78,-4,78 0 97 a
+b 611,718,14,85,-11,85 2 98 b
+c 556,546,14,94,-28,90 0 99 c
+d 611,718,14,143,-31,90 2 100 d
+e 556,546,14,88,-20,88 0 101 e
+f 333,727,0,187,-37,90 2 102 f
+g 611,546,217,106,13,90 1 103 g
+h 611,718,0,69,-15,69 2 104 h
+i 278,725,0,136,-19,90 2 105 i
+j 278,725,214,136,93,90 3 106 j
+k 556,718,0,165,-19,90 2 107 k
+l 278,718,0,134,-19,90 2 108 l
+m 889,546,0,71,-14,71 0 109 m
+n 611,546,0,69,-15,69 0 110 n
+o 611,546,14,82,-32,82 0 111 o
+p 611,546,207,85,32,85 1 112 p
+q 611,546,207,105,-30,90 1 113 q
+r 389,546,0,150,-14,90 0 114 r
+s 556,546,14,78,-12,78 0 115 s
+t 333,676,6,140,-50,90 2 116 t
+u 611,532,14,98,-47,90 0 117 u
+v 556,532,0,151,-76,90 0 118 v
+w 778,532,0,155,-73,90 0 119 w
+x 556,532,0,143,35,90 0 120 x
+y 556,532,214,147,9,90 1 121 y
+z 500,532,0,134,30,90 0 122 z
+{ 389,722,196,180,-44,90 2 123 braceleft
+lC "
+| 280,775,225,131,14,90 3 124 bar
+ba "
+} 389,722,196,68,68,68 2 125 braceright
+rC "
+~ 333,737,0,224,-62,90 2 126 tilde
+a~ "
+bq 278,127,146,8,10,8 0 128 quotesinglbase
+Fo 556,484,0,65,-84,65 0 129 guillemotleft
+Fc 556,484,0,35,-54,35 0 130 guillemotright
+bu 350,524,0,121,-32,90 0 131 bullet
+Fn 556,737,210,163,101,90 3 132 florin
+f/ 167,710,19,370,225,90 2 133 fraction
+%0 1000,710,19,89,-25,89 2 134 perthousand
+dg 556,718,171,121,-68,90 2 135 dagger
+dd 556,718,171,123,5,90 2 136 daggerdbl
+en 556,333,0,121,2,90 0 137 endash
+em 1000,333,0,121,2,90 0 138 emdash
+fi 611,727,0,136,-37,90 2 140 fi
+fl 611,727,0,134,-37,90 2 141 fl
+.i 278,532,0,95,-19,90 0 144 dotlessi
+ga 333,750,0,71,-86,71 2 146 grave
+a" 333,750,0,363,-87,90 2 147 hungarumlaut
+a. 333,729,0,102,-184,90 2 148 dotaccent
+ab 333,750,0,212,-105,90 2 149 breve
+ah 333,750,0,220,-99,90 2 150 caron
+ao 333,776,0,138,-149,90 2 151 ring
+ho 333,0,228,0,10 1 152 ogonek
+lq 500,727,0,138,-110,90 2 153 quotedblleft
+rq 500,718,0,139,-111,90 2 154 quotedblright
+oe 944,546,14,84,-32,84 0 155 oe
+/l 278,718,0,180,10,90 2 156 lslash
+Bq 500,127,146,13,15,13 0 157 quotedblbase
+OE 1000,737,19,164,-48,90 2 158 OE
+/L 611,718,0,50,16,50 2 159 Lslash
+r! 333,532,186,71,0,71 0 161 exclamdown
+ct 556,628,118,94,-28,90 0 162 cent
+Po 556,718,16,129,0,90 2 163 sterling
+Cs 556,636,0,175,23,90 0 164 currency
+Ye 556,698,0,208,-9,90 2 165 yen
+bb 280,700,150,115,-2,90 2 166 brokenbar
+sc 556,727,184,93,-10,90 2 167 section
+ad 333,729,0,199,-86,90 2 168 dieresis
+co 737,737,19,149,-5,90 2 169 copyright
+Of 370,737,0,145,-74,90 2 170 ordfeminine
+fo 333,484,0,70,-79,70 0 171 guilsinglleft
+tno 584,419,0,100,-55,90 0 172 logicalnot
+\- 584,309,0,76,-31,76 0 173 minus
+rg 737,737,19,148,-5,90 2 174 registered
+a- 333,678,0,201,-72,90 2 175 macron
+de 400,712,0,118,-124,90 2 176 degree
+t+- 584,506,0,91,10,90 0 177 plusminus
+S2 333,710,0,166,-19,90 2 178 twosuperior
+S3 333,710,0,158,-41,90 2 179 threesuperior
+aa 333,750,0,233,-186,90 2 180 acute
+*m 611,532,207,99,29,90 1 181 mu
+mc "
+ps 556,700,191,182,-48,90 2 182 paragraph
+pc 278,334,0,48,-59,48 0 183 periodcentered
+ac 333,0,228,0,88 1 184 cedilla
+S1 333,710,0,105,-98,90 2 185 onesuperior
+Om 365,737,0,170,-73,90 2 186 ordmasculine
+fc 333,484,0,40,-49,40 0 187 guilsinglright
+14 834,710,19,23,-81,23 2 188 onequarter
+12 834,710,19,75,-81,75 2 189 onehalf
+34 834,710,19,56,-49,56 2 190 threequarters
+r? 611,532,195,0,-2 0 191 questiondown
+`A 722,936,0,30,30,30 2 192 Agrave
+'A 722,936,0,78,30,78 2 193 Aacute
+^A 722,936,0,34,30,34 2 194 Acircumflex
+~A 722,923,0,70,30,70 2 195 Atilde
+:A 722,915,0,45,30,45 2 196 Adieresis
+oA 722,962,0,30,30,30 2 197 Aring
+AE 1000,718,0,150,45,90 2 198 AE
+,C 722,737,228,117,-56,90 3 199 Ccedilla
+`E 667,936,0,140,-26,90 2 200 Egrave
+'E 667,936,0,140,-26,90 2 201 Eacute
+^E 667,936,0,140,-26,90 2 202 Ecircumflex
+:E 667,915,0,140,-26,90 2 203 Edieresis
+`I 278,936,0,139,-14,90 2 204 Igrave
+'I 278,936,0,300,-14,90 2 205 Iacute
+^I 278,936,0,256,-14,90 2 206 Icircumflex
+:I 278,915,0,267,-14,90 2 207 Idieresis
+-D 722,718,0,105,-12,90 2 208 Eth
+~N 722,923,0,135,-19,90 2 209 Ntilde
+`O 778,936,19,96,-57,90 2 210 Ograve
+'O 778,936,19,96,-57,90 2 211 Oacute
+^O 778,936,19,96,-57,90 2 212 Ocircumflex
+~O 778,923,19,96,-57,90 2 213 Otilde
+:O 778,915,19,96,-57,90 2 214 Odieresis
+tmu 584,505,0,101,-7,90 0 215 multiply
+/O 778,745,27,167,15,90 2 216 Oslash
+`U 722,936,19,132,-65,90 2 217 Ugrave
+'U 722,936,19,132,-65,90 2 218 Uacute
+^U 722,936,19,132,-65,90 2 219 Ucircumflex
+:U 722,915,19,132,-65,90 2 220 Udieresis
+'Y 667,936,0,189,-117,90 2 221 Yacute
+TP 667,718,0,100,-26,90 2 222 Thorn
+ss 611,731,14,97,-19,90 2 223 germandbls
+`a 556,750,14,78,-4,78 2 224 agrave
+'a 556,750,14,122,-4,90 2 225 aacute
+^a 556,750,14,78,-4,78 2 226 acircumflex
+~a 556,737,14,113,-4,90 2 227 atilde
+:a 556,729,14,88,-4,88 2 228 adieresis
+oa 556,776,14,78,-4,78 2 229 aring
+ae 889,546,14,85,-5,85 0 230 ae
+,c 556,546,228,94,-28,90 1 231 ccedilla
+`e 556,750,14,88,-20,88 2 232 egrave
+'e 556,750,14,122,-20,90 2 233 eacute
+^e 556,750,14,88,-20,88 2 234 ecircumflex
+:e 556,729,14,88,-20,88 2 235 edieresis
+`i 278,750,0,99,-19,90 2 236 igrave
+'i 278,750,0,261,-19,90 2 237 iacute
+^i 278,750,0,217,-19,90 2 238 icircumflex
+:i 278,729,0,227,-19,90 2 239 idieresis
+Sd 611,737,14,109,-31,90 2 240 eth
+~n 611,737,0,85,-15,85 2 241 ntilde
+`o 611,750,14,82,-32,82 2 242 ograve
+'o 611,750,14,94,-32,90 2 243 oacute
+^o 611,750,14,82,-32,82 2 244 ocircumflex
+~o 611,737,14,85,-32,85 2 245 otilde
+:o 611,729,14,82,-32,82 2 246 odieresis
+tdi 584,548,42,76,-31,76 0 247 divide
+/o 611,560,29,141,28,90 0 248 oslash
+`u 611,750,14,98,-47,90 2 249 ugrave
+'u 611,750,14,98,-47,90 2 250 uacute
+^u 611,750,14,98,-47,90 2 251 ucircumflex
+:u 611,729,14,98,-47,90 2 252 udieresis
+'y 556,750,214,147,9,90 3 253 yacute
+Tp 611,718,208,85,33,85 3 254 thorn
+:y 556,729,214,147,9,90 3 255 ydieresis
+u2026 1000,146,0,0,-42 0 256 ellipsis
diff --git a/font/devps/HI b/font/devps/HI
new file mode 100644
index 0000000..7ea1f6d
--- /dev/null
+++ b/font/devps/HI
@@ -0,0 +1,1645 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Helvetica Oblique
+# Version 003.001
+# FamilyName Helvetica
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 12:49:11 1999
+# Comment UniqueID 44702
+# Comment VMusage 11195 50629
+
+name HI
+internalname Helvetica-Oblique
+slant 12
+spacewidth 278
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A C -30
+A ,C -30
+A G -30
+A O -30
+A 'O -30
+A ^O -30
+A :O -30
+A `O -30
+A /O -30
+A ~O -30
+A Q -30
+A T -120
+A U -50
+A 'U -50
+A ^U -50
+A :U -50
+A `U -50
+A V -70
+A W -50
+A Y -100
+A 'Y -100
+A :Y -100
+A u -30
+A 'u -30
+A ^u -30
+A :u -30
+A `u -30
+A v -40
+A w -40
+A y -40
+A 'y -40
+A :y -40
+'A C -30
+'A ,C -30
+'A G -30
+'A O -30
+'A 'O -30
+'A ^O -30
+'A :O -30
+'A `O -30
+'A /O -30
+'A ~O -30
+'A Q -30
+'A T -120
+'A U -50
+'A 'U -50
+'A ^U -50
+'A :U -50
+'A `U -50
+'A V -70
+'A W -50
+'A Y -100
+'A 'Y -100
+'A :Y -100
+'A u -30
+'A 'u -30
+'A ^u -30
+'A :u -30
+'A `u -30
+'A v -40
+'A w -40
+'A y -40
+'A 'y -40
+'A :y -40
+^A C -30
+^A ,C -30
+^A G -30
+^A O -30
+^A 'O -30
+^A ^O -30
+^A :O -30
+^A `O -30
+^A /O -30
+^A ~O -30
+^A Q -30
+^A T -120
+^A U -50
+^A 'U -50
+^A ^U -50
+^A :U -50
+^A `U -50
+^A V -70
+^A W -50
+^A Y -100
+^A 'Y -100
+^A :Y -100
+^A u -30
+^A 'u -30
+^A ^u -30
+^A :u -30
+^A `u -30
+^A v -40
+^A w -40
+^A y -40
+^A 'y -40
+^A :y -40
+:A C -30
+:A ,C -30
+:A G -30
+:A O -30
+:A 'O -30
+:A ^O -30
+:A :O -30
+:A `O -30
+:A /O -30
+:A ~O -30
+:A Q -30
+:A T -120
+:A U -50
+:A 'U -50
+:A ^U -50
+:A :U -50
+:A `U -50
+:A V -70
+:A W -50
+:A Y -100
+:A 'Y -100
+:A :Y -100
+:A u -30
+:A 'u -30
+:A ^u -30
+:A :u -30
+:A `u -30
+:A v -40
+:A w -40
+:A y -40
+:A 'y -40
+:A :y -40
+`A C -30
+`A ,C -30
+`A G -30
+`A O -30
+`A 'O -30
+`A ^O -30
+`A :O -30
+`A `O -30
+`A /O -30
+`A ~O -30
+`A Q -30
+`A T -120
+`A U -50
+`A 'U -50
+`A ^U -50
+`A :U -50
+`A `U -50
+`A V -70
+`A W -50
+`A Y -100
+`A 'Y -100
+`A :Y -100
+`A u -30
+`A 'u -30
+`A ^u -30
+`A :u -30
+`A `u -30
+`A v -40
+`A w -40
+`A y -40
+`A 'y -40
+`A :y -40
+oA C -30
+oA ,C -30
+oA G -30
+oA O -30
+oA 'O -30
+oA ^O -30
+oA :O -30
+oA `O -30
+oA /O -30
+oA ~O -30
+oA Q -30
+oA T -120
+oA U -50
+oA 'U -50
+oA ^U -50
+oA :U -50
+oA `U -50
+oA V -70
+oA W -50
+oA Y -100
+oA 'Y -100
+oA :Y -100
+oA u -30
+oA 'u -30
+oA ^u -30
+oA :u -30
+oA `u -30
+oA v -40
+oA w -40
+oA y -40
+oA 'y -40
+oA :y -40
+~A C -30
+~A ,C -30
+~A G -30
+~A O -30
+~A 'O -30
+~A ^O -30
+~A :O -30
+~A `O -30
+~A /O -30
+~A ~O -30
+~A Q -30
+~A T -120
+~A U -50
+~A 'U -50
+~A ^U -50
+~A :U -50
+~A `U -50
+~A V -70
+~A W -50
+~A Y -100
+~A 'Y -100
+~A :Y -100
+~A u -30
+~A 'u -30
+~A ^u -30
+~A :u -30
+~A `u -30
+~A v -40
+~A w -40
+~A y -40
+~A 'y -40
+~A :y -40
+B U -10
+B 'U -10
+B ^U -10
+B :U -10
+B `U -10
+B , -20
+B . -20
+B u2026 -20
+C , -30
+C . -30
+C u2026 -30
+,C , -30
+,C . -30
+,C u2026 -30
+D A -40
+D 'A -40
+D ^A -40
+D :A -40
+D `A -40
+D oA -40
+D ~A -40
+D V -70
+D W -40
+D Y -90
+D 'Y -90
+D :Y -90
+D , -70
+D . -70
+D u2026 -70
+F A -80
+F 'A -80
+F ^A -80
+F :A -80
+F `A -80
+F oA -80
+F ~A -80
+F a -50
+F 'a -50
+F ^a -50
+F :a -50
+F `a -50
+F oa -50
+F ~a -50
+F , -150
+F e -30
+F 'e -30
+F ^e -30
+F :e -30
+F `e -30
+F o -30
+F 'o -30
+F ^o -30
+F :o -30
+F `o -30
+F /o -30
+F ~o -30
+F . -150
+F u2026 -150
+F r -45
+J A -20
+J 'A -20
+J ^A -20
+J :A -20
+J `A -20
+J oA -20
+J ~A -20
+J a -20
+J 'a -20
+J ^a -20
+J :a -20
+J `a -20
+J oa -20
+J ~a -20
+J , -30
+J . -30
+J u2026 -30
+J u -20
+J 'u -20
+J ^u -20
+J :u -20
+J `u -20
+K O -50
+K 'O -50
+K ^O -50
+K :O -50
+K `O -50
+K /O -50
+K ~O -50
+K e -40
+K 'e -40
+K ^e -40
+K :e -40
+K `e -40
+K o -40
+K 'o -40
+K ^o -40
+K :o -40
+K `o -40
+K /o -40
+K ~o -40
+K u -30
+K 'u -30
+K ^u -30
+K :u -30
+K `u -30
+K y -50
+K 'y -50
+K :y -50
+L T -110
+L V -110
+L W -70
+L Y -140
+L 'Y -140
+L :Y -140
+L rq -140
+L ' -160
+L cq -160
+L y -30
+L 'y -30
+L :y -30
+/L T -110
+/L V -110
+/L W -70
+/L Y -140
+/L 'Y -140
+/L :Y -140
+/L rq -140
+/L ' -160
+/L cq -160
+/L y -30
+/L 'y -30
+/L :y -30
+O A -20
+O 'A -20
+O ^A -20
+O :A -20
+O `A -20
+O oA -20
+O ~A -20
+O T -40
+O V -50
+O W -30
+O X -60
+O Y -70
+O 'Y -70
+O :Y -70
+O , -40
+O . -40
+O u2026 -40
+'O A -20
+'O 'A -20
+'O ^A -20
+'O :A -20
+'O `A -20
+'O oA -20
+'O ~A -20
+'O T -40
+'O V -50
+'O W -30
+'O X -60
+'O Y -70
+'O 'Y -70
+'O :Y -70
+'O , -40
+'O . -40
+'O u2026 -40
+^O A -20
+^O 'A -20
+^O ^A -20
+^O :A -20
+^O `A -20
+^O oA -20
+^O ~A -20
+^O T -40
+^O V -50
+^O W -30
+^O X -60
+^O Y -70
+^O 'Y -70
+^O :Y -70
+^O , -40
+^O . -40
+^O u2026 -40
+:O A -20
+:O 'A -20
+:O ^A -20
+:O :A -20
+:O `A -20
+:O oA -20
+:O ~A -20
+:O T -40
+:O V -50
+:O W -30
+:O X -60
+:O Y -70
+:O 'Y -70
+:O :Y -70
+:O , -40
+:O . -40
+:O u2026 -40
+`O A -20
+`O 'A -20
+`O ^A -20
+`O :A -20
+`O `A -20
+`O oA -20
+`O ~A -20
+`O T -40
+`O V -50
+`O W -30
+`O X -60
+`O Y -70
+`O 'Y -70
+`O :Y -70
+`O , -40
+`O . -40
+`O u2026 -40
+/O A -20
+/O 'A -20
+/O ^A -20
+/O :A -20
+/O `A -20
+/O oA -20
+/O ~A -20
+/O T -40
+/O V -50
+/O W -30
+/O X -60
+/O Y -70
+/O 'Y -70
+/O :Y -70
+/O , -40
+/O . -40
+/O u2026 -40
+~O A -20
+~O 'A -20
+~O ^A -20
+~O :A -20
+~O `A -20
+~O oA -20
+~O ~A -20
+~O T -40
+~O V -50
+~O W -30
+~O X -60
+~O Y -70
+~O 'Y -70
+~O :Y -70
+~O , -40
+~O . -40
+~O u2026 -40
+P A -120
+P 'A -120
+P ^A -120
+P :A -120
+P `A -120
+P oA -120
+P ~A -120
+P a -40
+P 'a -40
+P ^a -40
+P :a -40
+P `a -40
+P oa -40
+P ~a -40
+P , -180
+P e -50
+P 'e -50
+P ^e -50
+P :e -50
+P `e -50
+P o -50
+P 'o -50
+P ^o -50
+P :o -50
+P `o -50
+P /o -50
+P ~o -50
+P . -180
+P u2026 -180
+Q U -10
+Q 'U -10
+Q ^U -10
+Q :U -10
+Q `U -10
+R O -20
+R 'O -20
+R ^O -20
+R :O -20
+R `O -20
+R /O -20
+R ~O -20
+R T -30
+R U -40
+R 'U -40
+R ^U -40
+R :U -40
+R `U -40
+R V -50
+R W -30
+R Y -50
+R 'Y -50
+R :Y -50
+S , -20
+S . -20
+S u2026 -20
+vS , -20
+vS . -20
+vS u2026 -20
+T A -120
+T 'A -120
+T ^A -120
+T :A -120
+T `A -120
+T oA -120
+T ~A -120
+T O -40
+T 'O -40
+T ^O -40
+T :O -40
+T `O -40
+T /O -40
+T ~O -40
+T a -120
+T 'a -120
+T ^a -120
+T :a -120
+T `a -120
+T oa -120
+T ~a -60
+T : -20
+T , -120
+T e -120
+T 'e -120
+T ^e -120
+T :e -120
+T `e -60
+T - -140
+T hy -140
+T o -120
+T 'o -120
+T ^o -120
+T :o -120
+T `o -120
+T /o -120
+T ~o -60
+T . -120
+T u2026 -120
+T r -120
+T ; -20
+T u -120
+T 'u -120
+T ^u -120
+T :u -120
+T `u -120
+T w -120
+T y -120
+T 'y -120
+T :y -60
+U A -40
+U 'A -40
+U ^A -40
+U :A -40
+U `A -40
+U oA -40
+U ~A -40
+U , -40
+U . -40
+U u2026 -40
+'U A -40
+'U 'A -40
+'U ^A -40
+'U :A -40
+'U `A -40
+'U oA -40
+'U ~A -40
+'U , -40
+'U . -40
+'U u2026 -40
+^U A -40
+^U 'A -40
+^U ^A -40
+^U :A -40
+^U `A -40
+^U oA -40
+^U ~A -40
+^U , -40
+^U . -40
+^U u2026 -40
+:U A -40
+:U 'A -40
+:U ^A -40
+:U :A -40
+:U `A -40
+:U oA -40
+:U ~A -40
+:U , -40
+:U . -40
+:U u2026 -40
+`U A -40
+`U 'A -40
+`U ^A -40
+`U :A -40
+`U `A -40
+`U oA -40
+`U ~A -40
+`U , -40
+`U . -40
+`U u2026 -40
+V A -80
+V 'A -80
+V ^A -80
+V :A -80
+V `A -80
+V oA -80
+V ~A -80
+V G -40
+V O -40
+V 'O -40
+V ^O -40
+V :O -40
+V `O -40
+V /O -40
+V ~O -40
+V a -70
+V 'a -70
+V ^a -70
+V :a -70
+V `a -70
+V oa -70
+V ~a -70
+V : -40
+V , -125
+V e -80
+V 'e -80
+V ^e -80
+V :e -80
+V `e -80
+V - -80
+V hy -80
+V o -80
+V 'o -80
+V ^o -80
+V :o -80
+V `o -80
+V /o -80
+V ~o -80
+V . -125
+V u2026 -125
+V ; -40
+V u -70
+V 'u -70
+V ^u -70
+V :u -70
+V `u -70
+W A -50
+W 'A -50
+W ^A -50
+W :A -50
+W `A -50
+W oA -50
+W ~A -50
+W O -20
+W 'O -20
+W ^O -20
+W :O -20
+W `O -20
+W /O -20
+W ~O -20
+W a -40
+W 'a -40
+W ^a -40
+W :a -40
+W `a -40
+W oa -40
+W ~a -40
+W , -80
+W e -30
+W 'e -30
+W ^e -30
+W :e -30
+W `e -30
+W - -40
+W hy -40
+W o -30
+W 'o -30
+W ^o -30
+W :o -30
+W `o -30
+W /o -30
+W ~o -30
+W . -80
+W u2026 -80
+W u -30
+W 'u -30
+W ^u -30
+W :u -30
+W `u -30
+W y -20
+W 'y -20
+W :y -20
+Y A -110
+Y 'A -110
+Y ^A -110
+Y :A -110
+Y `A -110
+Y oA -110
+Y ~A -110
+Y O -85
+Y 'O -85
+Y ^O -85
+Y :O -85
+Y `O -85
+Y /O -85
+Y ~O -85
+Y a -140
+Y 'a -140
+Y ^a -140
+Y :a -140
+Y `a -140
+Y oa -140
+Y ~a -140
+Y : -60
+Y , -140
+Y e -140
+Y 'e -140
+Y ^e -140
+Y :e -140
+Y `e -140
+Y - -140
+Y hy -140
+Y i -20
+Y 'i -20
+Y o -140
+Y 'o -140
+Y ^o -140
+Y :o -140
+Y `o -140
+Y /o -140
+Y ~o -140
+Y . -140
+Y u2026 -140
+Y ; -60
+Y u -110
+Y 'u -110
+Y ^u -110
+Y :u -110
+Y `u -110
+'Y A -110
+'Y 'A -110
+'Y ^A -110
+'Y :A -110
+'Y `A -110
+'Y oA -110
+'Y ~A -110
+'Y O -85
+'Y 'O -85
+'Y ^O -85
+'Y :O -85
+'Y `O -85
+'Y /O -85
+'Y ~O -85
+'Y a -140
+'Y 'a -140
+'Y ^a -140
+'Y :a -140
+'Y `a -140
+'Y oa -140
+'Y ~a -70
+'Y : -60
+'Y , -140
+'Y e -140
+'Y 'e -140
+'Y ^e -140
+'Y :e -140
+'Y `e -140
+'Y - -140
+'Y hy -140
+'Y i -20
+'Y 'i -20
+'Y o -140
+'Y 'o -140
+'Y ^o -140
+'Y :o -140
+'Y `o -140
+'Y /o -140
+'Y ~o -140
+'Y . -140
+'Y u2026 -140
+'Y ; -60
+'Y u -110
+'Y 'u -110
+'Y ^u -110
+'Y :u -110
+'Y `u -110
+:Y A -110
+:Y 'A -110
+:Y ^A -110
+:Y :A -110
+:Y `A -110
+:Y oA -110
+:Y ~A -110
+:Y O -85
+:Y 'O -85
+:Y ^O -85
+:Y :O -85
+:Y `O -85
+:Y /O -85
+:Y ~O -85
+:Y a -140
+:Y 'a -140
+:Y ^a -140
+:Y :a -140
+:Y `a -140
+:Y oa -140
+:Y ~a -70
+:Y : -60
+:Y , -140
+:Y e -140
+:Y 'e -140
+:Y ^e -140
+:Y :e -140
+:Y `e -140
+:Y - -140
+:Y hy -140
+:Y i -20
+:Y 'i -20
+:Y o -140
+:Y 'o -140
+:Y ^o -140
+:Y :o -140
+:Y `o -140
+:Y /o -140
+:Y ~o -140
+:Y . -140
+:Y u2026 -140
+:Y ; -60
+:Y u -110
+:Y 'u -110
+:Y ^u -110
+:Y :u -110
+:Y `u -110
+a v -20
+a w -20
+a y -30
+a 'y -30
+a :y -30
+'a v -20
+'a w -20
+'a y -30
+'a 'y -30
+'a :y -30
+^a v -20
+^a w -20
+^a y -30
+^a 'y -30
+^a :y -30
+:a v -20
+:a w -20
+:a y -30
+:a 'y -30
+:a :y -30
+`a v -20
+`a w -20
+`a y -30
+`a 'y -30
+`a :y -30
+oa v -20
+oa w -20
+oa y -30
+oa 'y -30
+oa :y -30
+~a v -20
+~a w -20
+~a y -30
+~a 'y -30
+~a :y -30
+b b -10
+b , -40
+b l -20
+b /l -20
+b . -40
+b u2026 -40
+b u -20
+b 'u -20
+b ^u -20
+b :u -20
+b `u -20
+b v -20
+b y -20
+b 'y -20
+b :y -20
+c , -15
+c k -20
+,c , -15
+,c k -20
+: u0020 -50
+, rq -100
+, ' -100
+, cq -100
+e , -15
+e . -15
+e u2026 -15
+e v -30
+e w -20
+e x -30
+e y -20
+e 'y -20
+e :y -20
+'e , -15
+'e . -15
+'e u2026 -15
+'e v -30
+'e w -20
+'e x -30
+'e y -20
+'e 'y -20
+'e :y -20
+^e , -15
+^e . -15
+^e u2026 -15
+^e v -30
+^e w -20
+^e x -30
+^e y -20
+^e 'y -20
+^e :y -20
+:e , -15
+:e . -15
+:e u2026 -15
+:e v -30
+:e w -20
+:e x -30
+:e y -20
+:e 'y -20
+:e :y -20
+`e , -15
+`e . -15
+`e u2026 -15
+`e v -30
+`e w -20
+`e x -30
+`e y -20
+`e 'y -20
+`e :y -20
+f a -30
+f 'a -30
+f ^a -30
+f :a -30
+f `a -30
+f oa -30
+f ~a -30
+f , -30
+f .i -28
+f e -30
+f 'e -30
+f ^e -30
+f :e -30
+f `e -30
+f o -30
+f 'o -30
+f ^o -30
+f :o -30
+f `o -30
+f /o -30
+f ~o -30
+f . -30
+f u2026 -30
+f rq 60
+f ' 50
+f cq 50
+g r -10
+h y -30
+h 'y -30
+h :y -30
+k e -20
+k 'e -20
+k ^e -20
+k :e -20
+k `e -20
+k o -20
+k 'o -20
+k ^o -20
+k :o -20
+k `o -20
+k /o -20
+k ~o -20
+m u -10
+m 'u -10
+m ^u -10
+m :u -10
+m `u -10
+m y -15
+m 'y -15
+m :y -15
+n u -10
+n 'u -10
+n ^u -10
+n :u -10
+n `u -10
+n v -20
+n y -15
+n 'y -15
+n :y -15
+~n u -10
+~n 'u -10
+~n ^u -10
+~n :u -10
+~n `u -10
+~n v -20
+~n y -15
+~n 'y -15
+~n :y -15
+o , -40
+o . -40
+o u2026 -40
+o v -15
+o w -15
+o x -30
+o y -30
+o 'y -30
+o :y -30
+'o , -40
+'o . -40
+'o u2026 -40
+'o v -15
+'o w -15
+'o x -30
+'o y -30
+'o 'y -30
+'o :y -30
+^o , -40
+^o . -40
+^o u2026 -40
+^o v -15
+^o w -15
+^o x -30
+^o y -30
+^o 'y -30
+^o :y -30
+:o , -40
+:o . -40
+:o u2026 -40
+:o v -15
+:o w -15
+:o x -30
+:o y -30
+:o 'y -30
+:o :y -30
+`o , -40
+`o . -40
+`o u2026 -40
+`o v -15
+`o w -15
+`o x -30
+`o y -30
+`o 'y -30
+`o :y -30
+/o a -55
+/o 'a -55
+/o ^a -55
+/o :a -55
+/o `a -55
+/o oa -55
+/o ~a -55
+/o b -55
+/o c -55
+/o ,c -55
+/o , -95
+/o d -55
+/o e -55
+/o 'e -55
+/o ^e -55
+/o :e -55
+/o `e -55
+/o f -55
+/o g -55
+/o h -55
+/o i -55
+/o 'i -55
+/o ^i -55
+/o :i -55
+/o `i -55
+/o j -55
+/o k -55
+/o l -55
+/o /l -55
+/o m -55
+/o n -55
+/o ~n -55
+/o o -55
+/o 'o -55
+/o ^o -55
+/o :o -55
+/o `o -55
+/o /o -55
+/o ~o -55
+/o p -55
+/o . -95
+/o u2026 -95
+/o q -55
+/o r -55
+/o s -55
+/o vs -55
+/o t -55
+/o u -55
+/o 'u -55
+/o ^u -55
+/o :u -55
+/o `u -55
+/o v -70
+/o w -70
+/o x -85
+/o y -70
+/o 'y -70
+/o :y -70
+/o z -55
+/o vz -55
+~o , -40
+~o . -40
+~o u2026 -40
+~o v -15
+~o w -15
+~o x -30
+~o y -30
+~o 'y -30
+~o :y -30
+p , -35
+p . -35
+p u2026 -35
+p y -30
+p 'y -30
+p :y -30
+. rq -100
+u2026 rq -100
+. ' -100
+u2026 ' -100
+. cq -100
+u2026 cq -100
+. u0020 -60
+u2026 u0020 -60
+rq u0020 -40
+` ` -57
+` oq -57
+oq ` -57
+oq oq -57
+' d -50
+cq d -50
+' ' -57
+' cq -57
+cq ' -57
+cq cq -57
+' r -50
+cq r -50
+' s -50
+cq s -50
+' vs -50
+cq vs -50
+' u0020 -70
+cq u0020 -70
+r a -10
+r 'a -10
+r ^a -10
+r :a -10
+r `a -10
+r oa -10
+r ~a -10
+r : 30
+r , -50
+r i 15
+r 'i 15
+r ^i 15
+r :i 15
+r `i 15
+r k 15
+r l 15
+r /l 15
+r m 25
+r n 25
+r ~n 25
+r p 30
+r . -50
+r u2026 -50
+r ; 30
+r t 40
+r u 15
+r 'u 15
+r ^u 15
+r :u 15
+r `u 15
+r v 30
+r y 30
+r 'y 30
+r :y 30
+s , -15
+s . -15
+s u2026 -15
+s w -30
+vs , -15
+vs . -15
+vs u2026 -15
+vs w -30
+; u0020 -50
+u0020 T -50
+u0020 V -50
+u0020 W -40
+u0020 Y -90
+u0020 'Y -90
+u0020 :Y -90
+u0020 lq -30
+u0020 ` -60
+u0020 oq -60
+v a -25
+v 'a -25
+v ^a -25
+v :a -25
+v `a -25
+v oa -25
+v ~a -25
+v , -80
+v e -25
+v 'e -25
+v ^e -25
+v :e -25
+v `e -25
+v o -25
+v 'o -25
+v ^o -25
+v :o -25
+v `o -25
+v /o -25
+v ~o -25
+v . -80
+v u2026 -80
+w a -15
+w 'a -15
+w ^a -15
+w :a -15
+w `a -15
+w oa -15
+w ~a -15
+w , -60
+w e -10
+w 'e -10
+w ^e -10
+w :e -10
+w `e -10
+w o -10
+w 'o -10
+w ^o -10
+w :o -10
+w `o -10
+w /o -10
+w ~o -10
+w . -60
+w u2026 -60
+x e -30
+x 'e -30
+x ^e -30
+x :e -30
+x `e -30
+y a -20
+y 'a -20
+y ^a -20
+y :a -20
+y `a -20
+y oa -20
+y ~a -20
+y , -100
+y e -20
+y 'e -20
+y ^e -20
+y :e -20
+y `e -20
+y o -20
+y 'o -20
+y ^o -20
+y :o -20
+y `o -20
+y /o -20
+y ~o -20
+y . -100
+y u2026 -100
+'y a -20
+'y 'a -20
+'y ^a -20
+'y :a -20
+'y `a -20
+'y oa -20
+'y ~a -20
+'y , -100
+'y e -20
+'y 'e -20
+'y ^e -20
+'y :e -20
+'y `e -20
+'y o -20
+'y 'o -20
+'y ^o -20
+'y :o -20
+'y `o -20
+'y /o -20
+'y ~o -20
+'y . -100
+'y u2026 -100
+:y a -20
+:y 'a -20
+:y ^a -20
+:y :a -20
+:y `a -20
+:y oa -20
+:y ~a -20
+:y , -100
+:y e -20
+:y 'e -20
+:y ^e -20
+:y :e -20
+:y `e -20
+:y o -20
+:y 'o -20
+:y ^o -20
+:y :o -20
+:y `o -20
+:y /o -20
+:y ~o -20
+:y . -100
+:y u2026 -100
+z e -15
+z 'e -15
+z ^e -15
+z :e -15
+z `e -15
+z o -15
+z 'o -15
+z ^o -15
+z :o -15
+z `o -15
+z /o -15
+z ~o -15
+vz e -15
+vz 'e -15
+vz ^e -15
+vz :e -15
+vz `e -15
+vz o -15
+vz 'o -15
+vz ^o -15
+vz :o -15
+vz `o -15
+vz /o -15
+vz ~o -15
+
+charset
+ha 469,688,0,121,8,89 2 0 asciicircum
+ti 584,326,0,47,-61,47 0 1 asciitilde
+vS 667,929,19,96,-39,89 2 2 Scaron
+vZ 611,929,0,180,27,89 2 3 Zcaron
+vs 500,734,15,103,-13,89 2 4 scaron
+vz 500,734,0,122,19,89 2 5 zcaron
+:Y 667,901,0,189,-116,89 2 6 Ydieresis
+tm 1000,718,0,106,-135,89 2 7 trademark
+aq 191,718,0,144,-107,89 2 8 quotesingle
+Eu 556,703,19,169,-22,89 2 9 Euro
+space 278 0 32 space
+! 278,718,0,112,-40,89 2 33 exclam
+" 355,718,0,133,-118,89 2 34 quotedbl
+dq "
+# 556,688,0,125,-22,89 2 35 numbersign
+sh "
+$ 556,775,115,112,-18,89 2 36 dollar
+Do "
+% 889,703,19,50,-96,50 2 37 percent
+& 667,718,15,30,-26,30 2 38 ampersand
+' 222,718,0,138,-101,89 2 39 quoteright
+cq "
+( 333,733,207,171,-58,89 3 40 parenleft
+) 333,733,207,54,59,54 3 41 parenright
+* 389,718,0,136,-114,89 2 42 asterisk
++ 584,505,0,73,-34,73 0 43 plus
+, 278,106,147,0,-5 0 44 comma
+- 333,322,0,75,-43,75 0 45 hyphen
+hy "
+. 278,106,0,0,-37 0 46 period
+/ 278,737,19,224,72,89 2 47 slash
+sl "
+0 556,703,19,103,-43,89 2 48 zero
+1 556,703,0,3,-157,3 2 49 one
+2 556,703,0,112,24,89 2 50 two
+3 556,703,19,104,-24,89 2 51 three
+4 556,703,0,70,-11,70 2 52 four
+5 556,688,19,116,-17,89 2 53 five
+6 556,703,19,110,-40,89 2 54 six
+7 556,688,0,164,-87,89 2 55 seven
+8 556,703,19,101,-23,89 2 56 eight
+9 556,703,19,104,-32,89 2 57 nine
+: 278,516,0,73,-37,73 0 58 colon
+; 278,516,147,73,-5,73 0 59 semicolon
+< 584,495,0,108,-44,89 0 60 less
+= 584,390,0,94,-13,89 0 61 equal
+> 584,495,0,64,0,64 0 62 greater
+? 556,727,0,104,-110,89 2 63 question
+@ 1015,737,19,1,-164,1 2 64 at
+at "
+A 667,718,0,37,36,37 2 65 A
+B 667,718,0,95,-24,89 2 66 B
+C 722,737,19,110,-57,89 2 67 C
+D 722,718,0,92,-31,89 2 68 D
+E 667,718,0,145,-36,89 2 69 E
+F 611,718,0,175,-36,89 2 70 F
+G 778,737,19,72,-60,72 2 71 G
+H 722,718,0,127,-27,89 2 72 H
+I 278,718,0,113,-41,89 2 73 I
+J 500,718,19,131,4,89 2 74 J
+K 667,718,0,191,-26,89 2 75 K
+L 556,718,0,50,-26,50 2 76 L
+M 833,718,0,131,-23,89 2 77 M
+N 722,718,0,127,-26,89 2 78 N
+O 778,737,19,98,-54,89 2 79 O
+P 667,718,0,120,-36,89 2 80 P
+Q 778,737,56,98,-54,89 2 81 Q
+R 722,718,0,102,-38,89 2 82 R
+S 667,737,19,96,-39,89 2 83 S
+T 611,718,0,189,-98,89 2 84 T
+U 722,718,19,125,-73,89 2 85 U
+V 667,718,0,183,-122,89 2 86 V
+W 944,718,0,187,-118,89 2 87 W
+X 667,718,0,173,31,89 2 88 X
+Y 667,718,0,189,-116,89 2 89 Y
+Z 611,718,0,180,27,89 2 90 Z
+[ 278,722,196,176,29,89 2 91 bracketleft
+lB "
+\ 278,737,19,63,-89,63 2 92 backslash
+rs "
+] 278,722,196,141,64,89 2 93 bracketright
+rB "
+^ 333,734,0,156,-97,89 2 94 circumflex
+a^ "
+_ 556,0,125,35,77,35 0 95 underscore
+` 222,725,0,152,-114,89 2 96 quoteleft
+oq "
+a 556,538,15,53,-11,53 0 97 a
+b 556,718,15,79,-8,79 2 98 b
+c 500,538,15,104,-24,89 0 99 c
+d 556,718,15,146,-33,89 2 100 d
+e 556,538,15,73,-34,73 0 101 e
+f 278,728,0,189,-36,89 2 102 f
+g 556,538,220,105,9,89 1 103 g
+h 556,718,0,67,-15,67 2 104 h
+i 222,718,0,136,-17,89 2 105 i
+j 222,718,210,136,110,89 3 106 j
+k 500,718,0,151,-17,89 2 107 k
+l 222,718,0,136,-17,89 2 108 l
+m 833,538,0,69,-15,69 0 109 m
+n 556,538,0,67,-15,67 0 110 n
+o 556,538,14,79,-32,79 0 111 o
+p 556,538,207,79,36,79 1 112 p
+q 556,538,207,100,-33,89 1 113 q
+r 333,538,0,163,-27,89 0 114 r
+s 500,538,15,80,-13,80 0 115 s
+t 278,669,7,141,-52,89 2 116 t
+u 556,523,15,95,-44,89 0 117 u
+v 500,523,0,154,-69,89 0 118 v
+w 722,523,0,149,-75,89 0 119 w
+x 500,523,0,145,39,89 0 120 x
+y 500,523,214,151,35,89 1 121 y
+z 500,523,0,122,19,89 0 122 z
+{ 334,722,196,162,-41,89 2 123 braceleft
+lC "
+| 260,775,225,122,4,89 3 124 bar
+ba "
+} 334,722,196,71,50,71 2 125 braceright
+rC "
+~ 333,722,0,208,-74,89 2 126 tilde
+a~ "
+bq 222,106,149,8,29,8 0 128 quotesinglbase
+Fo 556,446,0,48,-96,48 0 129 guillemotleft
+Fc 556,446,0,22,-69,22 0 130 guillemotright
+bu 350,517,0,113,-40,89 0 131 bullet
+Fn 556,737,207,149,103,89 3 132 florin
+f/ 167,703,19,366,221,89 2 133 fraction
+%0 1000,703,19,80,-37,80 2 134 perthousand
+dg 556,718,159,116,-84,89 2 135 dagger
+dd 556,718,159,118,-2,89 2 136 daggerdbl
+en 556,313,0,117,-1,89 0 137 endash
+em 1000,313,0,117,-1,89 0 138 emdash
+fi 500,728,0,137,-36,89 2 140 fi
+fl 500,728,0,135,-36,89 2 141 fl
+.i 278,523,0,67,-45,67 0 144 dotlessi
+ga 333,734,0,55,-120,55 2 146 grave
+a" 333,734,0,283,-107,89 2 147 hungarumlaut
+a. 333,706,0,80,-199,80 2 148 dotaccent
+ab 333,731,0,194,-117,89 2 149 breve
+ah 333,734,0,186,-127,89 2 150 caron
+ao 333,756,0,120,-163,89 2 151 ring
+ho 333,0,225,0,8 1 152 ogonek
+lq 333,725,0,179,-87,89 2 153 quotedblleft
+rq 333,718,0,165,-74,89 2 154 quotedblright
+oe 944,538,15,71,-32,71 0 155 oe
+/l 222,718,0,175,9,89 2 156 lslash
+Bq 333,106,149,35,56,35 0 157 quotedblbase
+OE 1000,737,19,166,-47,89 2 158 OE
+/L 556,718,0,50,9,50 2 159 Lslash
+r! 333,523,195,44,-26,44 0 161 exclamdown
+ct 556,623,115,78,-44,78 0 162 cent
+Po 556,718,16,128,1,89 2 163 sterling
+Cs 556,603,0,140,-9,89 0 164 currency
+Ye 556,688,0,194,-31,89 2 165 yen
+bb 260,700,150,106,-12,89 2 166 brokenbar
+sc 556,737,191,78,-26,78 2 167 section
+ad 333,706,0,161,-118,89 2 168 dieresis
+co 737,737,19,151,-3,89 2 169 copyright
+Of 370,737,0,129,-77,89 2 170 ordfeminine
+fo 333,446,0,57,-87,57 0 171 guilsinglleft
+tno 584,390,0,94,-56,89 0 172 logicalnot
+\- 584,289,0,73,-34,73 0 173 minus
+rg 737,737,19,151,-3,89 2 174 registered
+a- 333,684,0,186,-93,89 2 175 macron
+de 400,703,0,118,-118,89 2 176 degree
+t+- 584,506,0,85,11,85 0 177 plusminus
+S2 333,703,0,166,-13,89 2 178 twosuperior
+S3 333,703,0,154,-39,89 2 179 threesuperior
+aa 333,734,0,193,-198,89 2 180 acute
+*m 578,523,207,74,26,74 1 181 mu
+mc "
+ps 537,718,173,163,-76,89 2 182 paragraph
+pc 278,315,0,29,-79,29 0 183 periodcentered
+ac 333,0,225,0,49 1 184 cedilla
+S1 333,703,0,89,-115,89 2 185 onesuperior
+Om 365,737,0,154,-90,89 2 186 ordmasculine
+fc 333,446,0,31,-60,31 0 187 guilsinglright
+14 834,703,19,19,-99,19 2 188 onequarter
+12 834,703,19,55,-63,55 2 189 onehalf
+34 834,703,19,78,-79,78 2 190 threequarters
+r? 611,525,201,0,-34 0 191 questiondown
+`A 667,929,0,37,36,37 2 192 Agrave
+'A 667,929,0,67,36,67 2 193 Aacute
+^A 667,929,0,37,36,37 2 194 Acircumflex
+~A 667,917,0,82,36,82 2 195 Atilde
+:A 667,901,0,37,36,37 2 196 Adieresis
+oA 667,931,0,37,36,37 2 197 Aring
+AE 1000,718,0,147,42,89 2 198 AE
+,C 722,737,225,110,-57,89 3 199 Ccedilla
+`E 667,929,0,145,-36,89 2 200 Egrave
+'E 667,929,0,145,-36,89 2 201 Eacute
+^E 667,929,0,145,-36,89 2 202 Ecircumflex
+:E 667,901,0,145,-36,89 2 203 Edieresis
+`I 278,929,0,124,-41,89 2 204 Igrave
+'I 278,929,0,262,-41,89 2 205 Iacute
+^I 278,929,0,225,-41,89 2 206 Icircumflex
+:I 278,901,0,230,-41,89 2 207 Idieresis
+-D 722,718,0,92,-19,89 2 208 Eth
+~N 722,917,0,127,-26,89 2 209 Ntilde
+`O 778,929,19,98,-54,89 2 210 Ograve
+'O 778,929,19,98,-54,89 2 211 Oacute
+^O 778,929,19,98,-54,89 2 212 Ocircumflex
+~O 778,917,19,98,-54,89 2 213 Otilde
+:O 778,901,19,98,-54,89 2 214 Odieresis
+tmu 584,506,0,108,1,89 0 215 multiply
+/O 778,737,19,163,8,89 2 216 Oslash
+`U 722,929,19,125,-73,89 2 217 Ugrave
+'U 722,929,19,125,-73,89 2 218 Uacute
+^U 722,929,19,125,-73,89 2 219 Ucircumflex
+:U 722,901,19,125,-73,89 2 220 Udieresis
+'Y 667,929,0,189,-116,89 2 221 Yacute
+TP 667,718,0,95,-36,89 2 222 Thorn
+ss 611,728,15,97,-17,89 2 223 germandbls
+`a 556,734,15,53,-11,53 2 224 agrave
+'a 556,734,15,82,-11,82 2 225 aacute
+^a 556,734,15,53,-11,53 2 226 acircumflex
+~a 556,722,15,87,-11,87 2 227 atilde
+:a 556,706,15,53,-11,53 2 228 adieresis
+oa 556,756,15,53,-11,53 2 229 aring
+ae 889,538,15,71,-11,71 0 230 ae
+,c 500,538,225,104,-24,89 1 231 ccedilla
+`e 556,734,15,73,-34,73 2 232 egrave
+'e 556,734,15,82,-34,82 2 233 eacute
+^e 556,734,15,73,-34,73 2 234 ecircumflex
+:e 556,706,15,73,-34,73 2 235 edieresis
+`i 278,734,0,83,-45,83 2 236 igrave
+'i 278,734,0,221,-45,89 2 237 iacute
+^i 278,734,0,184,-45,89 2 238 icircumflex
+:i 278,706,0,189,-45,89 2 239 idieresis
+Sd 556,737,15,112,-31,89 2 240 eth
+~n 556,722,0,87,-15,87 2 241 ntilde
+`o 556,734,14,79,-32,79 2 242 ograve
+'o 556,734,14,82,-32,82 2 243 oacute
+^o 556,734,14,79,-32,79 2 244 ocircumflex
+~o 556,722,14,97,-32,89 2 245 otilde
+:o 556,706,14,79,-32,79 2 246 odieresis
+tdi 584,524,19,73,-34,73 0 247 divide
+/o 611,545,22,87,22,87 0 248 oslash
+`u 556,734,15,95,-44,89 2 249 ugrave
+'u 556,734,15,95,-44,89 2 250 uacute
+^u 556,734,15,95,-44,89 2 251 ucircumflex
+:u 556,706,15,95,-44,89 2 252 udieresis
+'y 500,734,214,151,35,89 3 253 yacute
+Tp 556,718,207,79,36,79 3 254 thorn
+:y 500,706,214,151,35,89 3 255 ydieresis
+u2026 1000,106,0,0,-65 0 256 ellipsis
diff --git a/font/devps/HNB b/font/devps/HNB
new file mode 100644
index 0000000..480339d
--- /dev/null
+++ b/font/devps/HNB
@@ -0,0 +1,1513 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Helvetica Narrow Bold
+# Version 003.001
+# FamilyName Helvetica
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:08:06 1999
+# Comment UniqueID 44712
+# Comment VMusage 10926 50493
+
+name HNB
+internalname Helvetica-Narrow-Bold
+spacewidth 228
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A C -40
+A ,C -40
+A G -50
+A O -40
+A 'O -40
+A ^O -40
+A :O -40
+A `O -40
+A /O -40
+A ~O -40
+A Q -40
+A T -90
+A U -50
+A 'U -50
+A ^U -50
+A :U -50
+A `U -50
+A V -80
+A W -60
+A Y -110
+A 'Y -110
+A :Y -110
+A u -30
+A 'u -30
+A ^u -30
+A :u -30
+A `u -30
+A v -40
+A w -30
+A y -30
+A 'y -30
+A :y -30
+'A C -40
+'A ,C -40
+'A G -50
+'A O -40
+'A 'O -40
+'A ^O -40
+'A :O -40
+'A `O -40
+'A /O -40
+'A ~O -40
+'A Q -40
+'A T -90
+'A U -50
+'A 'U -50
+'A ^U -50
+'A :U -50
+'A `U -50
+'A V -80
+'A W -60
+'A Y -110
+'A 'Y -110
+'A :Y -110
+'A u -30
+'A 'u -30
+'A ^u -30
+'A :u -30
+'A `u -30
+'A v -40
+'A w -30
+'A y -30
+'A 'y -30
+'A :y -30
+^A C -40
+^A ,C -40
+^A G -50
+^A O -40
+^A 'O -40
+^A ^O -40
+^A :O -40
+^A `O -40
+^A /O -40
+^A ~O -40
+^A Q -40
+^A T -90
+^A U -50
+^A 'U -50
+^A ^U -50
+^A :U -50
+^A `U -50
+^A V -80
+^A W -60
+^A Y -110
+^A 'Y -110
+^A :Y -110
+^A u -30
+^A 'u -30
+^A ^u -30
+^A :u -30
+^A `u -30
+^A v -40
+^A w -30
+^A y -30
+^A 'y -30
+^A :y -30
+:A C -40
+:A ,C -40
+:A G -50
+:A O -40
+:A 'O -40
+:A ^O -40
+:A :O -40
+:A `O -40
+:A /O -40
+:A ~O -40
+:A Q -40
+:A T -90
+:A U -50
+:A 'U -50
+:A ^U -50
+:A :U -50
+:A `U -50
+:A V -80
+:A W -60
+:A Y -110
+:A 'Y -110
+:A :Y -110
+:A u -30
+:A 'u -30
+:A ^u -30
+:A :u -30
+:A `u -30
+:A v -40
+:A w -30
+:A y -30
+:A 'y -30
+:A :y -30
+`A C -40
+`A ,C -40
+`A G -50
+`A O -40
+`A 'O -40
+`A ^O -40
+`A :O -40
+`A `O -40
+`A /O -40
+`A ~O -40
+`A Q -40
+`A T -90
+`A U -50
+`A 'U -50
+`A ^U -50
+`A :U -50
+`A `U -50
+`A V -80
+`A W -60
+`A Y -110
+`A 'Y -110
+`A :Y -110
+`A u -30
+`A 'u -30
+`A ^u -30
+`A :u -30
+`A `u -30
+`A v -40
+`A w -30
+`A y -30
+`A 'y -30
+`A :y -30
+oA C -40
+oA ,C -40
+oA G -50
+oA O -40
+oA 'O -40
+oA ^O -40
+oA :O -40
+oA `O -40
+oA /O -40
+oA ~O -40
+oA Q -40
+oA T -90
+oA U -50
+oA 'U -50
+oA ^U -50
+oA :U -50
+oA `U -50
+oA V -80
+oA W -60
+oA Y -110
+oA 'Y -110
+oA :Y -110
+oA u -30
+oA 'u -30
+oA ^u -30
+oA :u -30
+oA `u -30
+oA v -40
+oA w -30
+oA y -30
+oA 'y -30
+oA :y -30
+~A C -40
+~A ,C -40
+~A G -50
+~A O -40
+~A 'O -40
+~A ^O -40
+~A :O -40
+~A `O -40
+~A /O -40
+~A ~O -40
+~A Q -40
+~A T -90
+~A U -50
+~A 'U -50
+~A ^U -50
+~A :U -50
+~A `U -50
+~A V -80
+~A W -60
+~A Y -110
+~A 'Y -110
+~A :Y -110
+~A u -30
+~A 'u -30
+~A ^u -30
+~A :u -30
+~A `u -30
+~A v -40
+~A w -30
+~A y -30
+~A 'y -30
+~A :y -30
+B A -30
+B 'A -30
+B ^A -30
+B :A -30
+B `A -30
+B oA -30
+B ~A -30
+B U -10
+B 'U -10
+B ^U -10
+B :U -10
+B `U -10
+D A -40
+D 'A -40
+D ^A -40
+D :A -40
+D `A -40
+D oA -40
+D ~A -40
+D V -40
+D W -40
+D Y -70
+D 'Y -70
+D :Y -70
+D , -30
+D . -30
+D u2026 -30
+F A -80
+F 'A -80
+F ^A -80
+F :A -80
+F `A -80
+F oA -80
+F ~A -80
+F a -20
+F 'a -20
+F ^a -20
+F :a -20
+F `a -20
+F oa -20
+F ~a -20
+F , -100
+F . -100
+F u2026 -100
+J A -20
+J 'A -20
+J ^A -20
+J :A -20
+J `A -20
+J oA -20
+J ~A -20
+J , -20
+J . -20
+J u2026 -20
+J u -20
+J 'u -20
+J ^u -20
+J :u -20
+J `u -20
+K O -30
+K 'O -30
+K ^O -30
+K :O -30
+K `O -30
+K /O -30
+K ~O -30
+K e -15
+K 'e -15
+K ^e -15
+K :e -15
+K `e -15
+K o -35
+K 'o -35
+K ^o -35
+K :o -35
+K `o -35
+K /o -35
+K ~o -35
+K u -30
+K 'u -30
+K ^u -30
+K :u -30
+K `u -30
+K y -40
+K 'y -40
+K :y -40
+L T -90
+L V -110
+L W -80
+L Y -120
+L 'Y -120
+L :Y -120
+L rq -140
+L ' -140
+L cq -140
+L y -30
+L 'y -30
+L :y -30
+/L T -90
+/L V -110
+/L W -80
+/L Y -120
+/L 'Y -120
+/L :Y -120
+/L rq -140
+/L ' -140
+/L cq -140
+/L y -30
+/L 'y -30
+/L :y -30
+O A -50
+O 'A -50
+O ^A -50
+O :A -50
+O `A -50
+O oA -50
+O ~A -50
+O T -40
+O V -50
+O W -50
+O X -50
+O Y -70
+O 'Y -70
+O :Y -70
+O , -40
+O . -40
+O u2026 -40
+'O A -50
+'O 'A -50
+'O ^A -50
+'O :A -50
+'O `A -50
+'O oA -50
+'O ~A -50
+'O T -40
+'O V -50
+'O W -50
+'O X -50
+'O Y -70
+'O 'Y -70
+'O :Y -70
+'O , -40
+'O . -40
+'O u2026 -40
+^O A -50
+^O 'A -50
+^O ^A -50
+^O :A -50
+^O `A -50
+^O oA -50
+^O ~A -50
+^O T -40
+^O V -50
+^O W -50
+^O X -50
+^O Y -70
+^O 'Y -70
+^O :Y -70
+^O , -40
+^O . -40
+^O u2026 -40
+:O A -50
+:O 'A -50
+:O ^A -50
+:O :A -50
+:O `A -50
+:O oA -50
+:O ~A -50
+:O T -40
+:O V -50
+:O W -50
+:O X -50
+:O Y -70
+:O 'Y -70
+:O :Y -70
+:O , -40
+:O . -40
+:O u2026 -40
+`O A -50
+`O 'A -50
+`O ^A -50
+`O :A -50
+`O `A -50
+`O oA -50
+`O ~A -50
+`O T -40
+`O V -50
+`O W -50
+`O X -50
+`O Y -70
+`O 'Y -70
+`O :Y -70
+`O , -40
+`O . -40
+`O u2026 -40
+/O A -50
+/O 'A -50
+/O ^A -50
+/O :A -50
+/O `A -50
+/O oA -50
+/O ~A -50
+/O T -40
+/O V -50
+/O W -50
+/O X -50
+/O Y -70
+/O 'Y -70
+/O :Y -70
+/O , -40
+/O . -40
+/O u2026 -40
+~O A -50
+~O 'A -50
+~O ^A -50
+~O :A -50
+~O `A -50
+~O oA -50
+~O ~A -50
+~O T -40
+~O V -50
+~O W -50
+~O X -50
+~O Y -70
+~O 'Y -70
+~O :Y -70
+~O , -40
+~O . -40
+~O u2026 -40
+P A -100
+P 'A -100
+P ^A -100
+P :A -100
+P `A -100
+P oA -100
+P ~A -100
+P a -30
+P 'a -30
+P ^a -30
+P :a -30
+P `a -30
+P oa -30
+P ~a -30
+P , -120
+P e -30
+P 'e -30
+P ^e -30
+P :e -30
+P `e -30
+P o -40
+P 'o -40
+P ^o -40
+P :o -40
+P `o -40
+P /o -40
+P ~o -40
+P . -120
+P u2026 -120
+Q U -10
+Q 'U -10
+Q ^U -10
+Q :U -10
+Q `U -10
+Q , 20
+Q . 20
+Q u2026 20
+R O -20
+R 'O -20
+R ^O -20
+R :O -20
+R `O -20
+R /O -20
+R ~O -20
+R T -20
+R U -20
+R 'U -20
+R ^U -20
+R :U -20
+R `U -20
+R V -50
+R W -40
+R Y -50
+R 'Y -50
+R :Y -50
+T A -90
+T 'A -90
+T ^A -90
+T :A -90
+T `A -90
+T oA -90
+T ~A -90
+T O -40
+T 'O -40
+T ^O -40
+T :O -40
+T `O -40
+T /O -40
+T ~O -40
+T a -80
+T 'a -80
+T ^a -80
+T :a -80
+T `a -80
+T oa -80
+T ~a -80
+T : -40
+T , -80
+T e -60
+T 'e -60
+T ^e -60
+T :e -60
+T `e -60
+T - -120
+T hy -120
+T o -80
+T 'o -80
+T ^o -80
+T :o -80
+T `o -80
+T /o -80
+T ~o -80
+T . -80
+T u2026 -80
+T r -80
+T ; -40
+T u -90
+T 'u -90
+T ^u -90
+T :u -90
+T `u -90
+T w -60
+T y -60
+T 'y -60
+T :y -60
+U A -50
+U 'A -50
+U ^A -50
+U :A -50
+U `A -50
+U oA -50
+U ~A -50
+U , -30
+U . -30
+U u2026 -30
+'U A -50
+'U 'A -50
+'U ^A -50
+'U :A -50
+'U `A -50
+'U oA -50
+'U ~A -50
+'U , -30
+'U . -30
+'U u2026 -30
+^U A -50
+^U 'A -50
+^U ^A -50
+^U :A -50
+^U `A -50
+^U oA -50
+^U ~A -50
+^U , -30
+^U . -30
+^U u2026 -30
+:U A -50
+:U 'A -50
+:U ^A -50
+:U :A -50
+:U `A -50
+:U oA -50
+:U ~A -50
+:U , -30
+:U . -30
+:U u2026 -30
+`U A -50
+`U 'A -50
+`U ^A -50
+`U :A -50
+`U `A -50
+`U oA -50
+`U ~A -50
+`U , -30
+`U . -30
+`U u2026 -30
+V A -80
+V 'A -80
+V ^A -80
+V :A -80
+V `A -80
+V oA -80
+V ~A -80
+V G -50
+V O -50
+V 'O -50
+V ^O -50
+V :O -50
+V `O -50
+V /O -50
+V ~O -50
+V a -60
+V 'a -60
+V ^a -60
+V :a -60
+V `a -60
+V oa -60
+V ~a -60
+V : -40
+V , -120
+V e -50
+V 'e -50
+V ^e -50
+V :e -50
+V `e -50
+V - -80
+V hy -80
+V o -90
+V 'o -90
+V ^o -90
+V :o -90
+V `o -90
+V /o -90
+V ~o -90
+V . -120
+V u2026 -120
+V ; -40
+V u -60
+V 'u -60
+V ^u -60
+V :u -60
+V `u -60
+W A -60
+W 'A -60
+W ^A -60
+W :A -60
+W `A -60
+W oA -60
+W ~A -60
+W O -20
+W 'O -20
+W ^O -20
+W :O -20
+W `O -20
+W /O -20
+W ~O -20
+W a -40
+W 'a -40
+W ^a -40
+W :a -40
+W `a -40
+W oa -40
+W ~a -40
+W : -10
+W , -80
+W e -35
+W 'e -35
+W ^e -35
+W :e -35
+W `e -35
+W - -40
+W hy -40
+W o -60
+W 'o -60
+W ^o -60
+W :o -60
+W `o -60
+W /o -60
+W ~o -60
+W . -80
+W u2026 -80
+W ; -10
+W u -45
+W 'u -45
+W ^u -45
+W :u -45
+W `u -45
+W y -20
+W 'y -20
+W :y -20
+Y A -110
+Y 'A -110
+Y ^A -110
+Y :A -110
+Y `A -110
+Y oA -110
+Y ~A -110
+Y O -70
+Y 'O -70
+Y ^O -70
+Y :O -70
+Y `O -70
+Y /O -70
+Y ~O -70
+Y a -90
+Y 'a -90
+Y ^a -90
+Y :a -90
+Y `a -90
+Y oa -90
+Y ~a -90
+Y : -50
+Y , -100
+Y e -80
+Y 'e -80
+Y ^e -80
+Y :e -80
+Y `e -80
+Y o -100
+Y 'o -100
+Y ^o -100
+Y :o -100
+Y `o -100
+Y /o -100
+Y ~o -100
+Y . -100
+Y u2026 -100
+Y ; -50
+Y u -100
+Y 'u -100
+Y ^u -100
+Y :u -100
+Y `u -100
+'Y A -110
+'Y 'A -110
+'Y ^A -110
+'Y :A -110
+'Y `A -110
+'Y oA -110
+'Y ~A -110
+'Y O -70
+'Y 'O -70
+'Y ^O -70
+'Y :O -70
+'Y `O -70
+'Y /O -70
+'Y ~O -70
+'Y a -90
+'Y 'a -90
+'Y ^a -90
+'Y :a -90
+'Y `a -90
+'Y oa -90
+'Y ~a -90
+'Y : -50
+'Y , -100
+'Y e -80
+'Y 'e -80
+'Y ^e -80
+'Y :e -80
+'Y `e -80
+'Y o -100
+'Y 'o -100
+'Y ^o -100
+'Y :o -100
+'Y `o -100
+'Y /o -100
+'Y ~o -100
+'Y . -100
+'Y u2026 -100
+'Y ; -50
+'Y u -100
+'Y 'u -100
+'Y ^u -100
+'Y :u -100
+'Y `u -100
+:Y A -110
+:Y 'A -110
+:Y ^A -110
+:Y :A -110
+:Y `A -110
+:Y oA -110
+:Y ~A -110
+:Y O -70
+:Y 'O -70
+:Y ^O -70
+:Y :O -70
+:Y `O -70
+:Y /O -70
+:Y ~O -70
+:Y a -90
+:Y 'a -90
+:Y ^a -90
+:Y :a -90
+:Y `a -90
+:Y oa -90
+:Y ~a -90
+:Y : -50
+:Y , -100
+:Y e -80
+:Y 'e -80
+:Y ^e -80
+:Y :e -80
+:Y `e -80
+:Y o -100
+:Y 'o -100
+:Y ^o -100
+:Y :o -100
+:Y `o -100
+:Y /o -100
+:Y ~o -100
+:Y . -100
+:Y u2026 -100
+:Y ; -50
+:Y u -100
+:Y 'u -100
+:Y ^u -100
+:Y :u -100
+:Y `u -100
+a g -10
+a v -15
+a w -15
+a y -20
+a 'y -20
+a :y -20
+'a g -10
+'a v -15
+'a w -15
+'a y -20
+'a 'y -20
+'a :y -20
+^a g -10
+^a v -15
+^a w -15
+^a y -20
+^a 'y -20
+^a :y -20
+:a g -10
+:a v -15
+:a w -15
+:a y -20
+:a 'y -20
+:a :y -20
+`a g -10
+`a v -15
+`a w -15
+`a y -20
+`a 'y -20
+`a :y -20
+oa g -10
+oa v -15
+oa w -15
+oa y -20
+oa 'y -20
+oa :y -20
+~a g -10
+~a v -15
+~a w -15
+~a y -20
+~a 'y -20
+~a :y -20
+b l -10
+b /l -10
+b u -20
+b 'u -20
+b ^u -20
+b :u -20
+b `u -20
+b v -20
+b y -20
+b 'y -20
+b :y -20
+c h -10
+c k -20
+c l -20
+c /l -20
+c y -10
+c 'y -10
+c :y -10
+,c h -10
+,c k -20
+,c l -20
+,c /l -20
+,c y -10
+,c 'y -10
+,c :y -10
+: u0020 -40
+, rq -120
+, ' -120
+, cq -120
+, u0020 -40
+d d -10
+d v -15
+d w -15
+d y -15
+d 'y -15
+d :y -15
+e , 10
+e . 20
+e u2026 20
+e v -15
+e w -15
+e x -15
+e y -15
+e 'y -15
+e :y -15
+'e , 10
+'e . 20
+'e u2026 20
+'e v -15
+'e w -15
+'e x -15
+'e y -15
+'e 'y -15
+'e :y -15
+^e , 10
+^e . 20
+^e u2026 20
+^e v -15
+^e w -15
+^e x -15
+^e y -15
+^e 'y -15
+^e :y -15
+:e , 10
+:e . 20
+:e u2026 20
+:e v -15
+:e w -15
+:e x -15
+:e y -15
+:e 'y -15
+:e :y -15
+`e , 10
+`e . 20
+`e u2026 20
+`e v -15
+`e w -15
+`e x -15
+`e y -15
+`e 'y -15
+`e :y -15
+f , -10
+f e -10
+f 'e -10
+f ^e -10
+f :e -10
+f `e -10
+f o -20
+f 'o -20
+f ^o -20
+f :o -20
+f `o -20
+f /o -20
+f ~o -20
+f . -10
+f u2026 -10
+f rq 30
+f ' 30
+f cq 30
+g e 10
+g 'e 10
+g ^e 10
+g :e 10
+g `e 10
+g g -10
+h y -20
+h 'y -20
+h :y -20
+k o -15
+k 'o -15
+k ^o -15
+k :o -15
+k `o -15
+k /o -15
+k ~o -15
+l w -15
+l y -15
+l 'y -15
+l :y -15
+/l w -15
+/l y -15
+/l 'y -15
+/l :y -15
+m u -20
+m 'u -20
+m ^u -20
+m :u -20
+m `u -20
+m y -30
+m 'y -30
+m :y -30
+n u -10
+n 'u -10
+n ^u -10
+n :u -10
+n `u -10
+n v -40
+n y -20
+n 'y -20
+n :y -20
+~n u -10
+~n 'u -10
+~n ^u -10
+~n :u -10
+~n `u -10
+~n v -40
+~n y -20
+~n 'y -20
+~n :y -20
+o v -20
+o w -15
+o x -30
+o y -20
+o 'y -20
+o :y -20
+'o v -20
+'o w -15
+'o x -30
+'o y -20
+'o 'y -20
+'o :y -20
+^o v -20
+^o w -15
+^o x -30
+^o y -20
+^o 'y -20
+^o :y -20
+:o v -20
+:o w -15
+:o x -30
+:o y -20
+:o 'y -20
+:o :y -20
+`o v -20
+`o w -15
+`o x -30
+`o y -20
+`o 'y -20
+`o :y -20
+/o v -20
+/o w -15
+/o x -30
+/o y -20
+/o 'y -20
+/o :y -20
+~o v -20
+~o w -15
+~o x -30
+~o y -20
+~o 'y -20
+~o :y -20
+p y -15
+p 'y -15
+p :y -15
+. rq -120
+u2026 rq -120
+. ' -120
+u2026 ' -120
+. cq -120
+u2026 cq -120
+. u0020 -40
+u2026 u0020 -40
+rq u0020 -80
+` ` -46
+` oq -46
+oq ` -46
+oq oq -46
+' d -80
+cq d -80
+' l -20
+cq l -20
+' /l -20
+cq /l -20
+' ' -46
+' cq -46
+cq ' -46
+cq cq -46
+' r -40
+cq r -40
+' s -60
+cq s -60
+' vs -60
+cq vs -60
+' u0020 -80
+cq u0020 -80
+' v -20
+cq v -20
+r c -20
+r ,c -20
+r , -60
+r d -20
+r g -15
+r - -20
+r hy -20
+r o -20
+r 'o -20
+r ^o -20
+r :o -20
+r `o -20
+r /o -20
+r ~o -20
+r . -60
+r u2026 -60
+r q -20
+r s -15
+r vs -15
+r t 20
+r v 10
+r y 10
+r 'y 10
+r :y 10
+s w -15
+vs w -15
+; u0020 -40
+u0020 T -100
+u0020 V -80
+u0020 W -80
+u0020 Y -120
+u0020 'Y -120
+u0020 :Y -120
+u0020 lq -80
+u0020 ` -60
+u0020 oq -60
+v a -20
+v 'a -20
+v ^a -20
+v :a -20
+v `a -20
+v oa -20
+v ~a -20
+v , -80
+v o -30
+v 'o -30
+v ^o -30
+v :o -30
+v `o -30
+v /o -30
+v ~o -30
+v . -80
+v u2026 -80
+w , -40
+w o -20
+w 'o -20
+w ^o -20
+w :o -20
+w `o -20
+w /o -20
+w ~o -20
+w . -40
+w u2026 -40
+x e -10
+x 'e -10
+x ^e -10
+x :e -10
+x `e -10
+y a -30
+y 'a -30
+y ^a -30
+y :a -30
+y `a -30
+y oa -30
+y ~a -30
+y , -80
+y e -10
+y 'e -10
+y ^e -10
+y :e -10
+y `e -10
+y o -25
+y 'o -25
+y ^o -25
+y :o -25
+y `o -25
+y /o -25
+y ~o -25
+y . -80
+y u2026 -80
+'y a -30
+'y 'a -30
+'y ^a -30
+'y :a -30
+'y `a -30
+'y oa -30
+'y ~a -30
+'y , -80
+'y e -10
+'y 'e -10
+'y ^e -10
+'y :e -10
+'y `e -10
+'y o -25
+'y 'o -25
+'y ^o -25
+'y :o -25
+'y `o -25
+'y /o -25
+'y ~o -25
+'y . -80
+'y u2026 -80
+:y a -30
+:y 'a -30
+:y ^a -30
+:y :a -30
+:y `a -30
+:y oa -30
+:y ~a -30
+:y , -80
+:y e -10
+:y 'e -10
+:y ^e -10
+:y :e -10
+:y `e -10
+:y o -25
+:y 'o -25
+:y ^o -25
+:y :o -25
+:y `o -25
+:y /o -25
+:y ~o -25
+:y . -80
+:y u2026 -80
+z e 10
+z 'e 10
+z ^e 10
+z :e 10
+z `e 10
+vz e 10
+vz 'e 10
+vz ^e 10
+vz :e 10
+vz `e 10
+
+charset
+ha 479,698 2 0 asciicircum
+ti 479,343 0 1 asciitilde
+vS 547,936,19 2 2 Scaron
+vZ 501,936 2 3 Zcaron
+vs 456,750,14 2 4 scaron
+vz 410,750 2 5 zcaron
+:Y 547,915 2 6 Ydieresis
+tm 820,718 2 7 trademark
+aq 195,718 2 8 quotesingle
+Eu 456,710,19,6 2 9 Euro
+space 228 0 32 space
+! 273,718 2 33 exclam
+" 389,718 2 34 quotedbl
+dq "
+# 456,698 2 35 numbersign
+sh "
+$ 456,775,115 2 36 dollar
+Do "
+% 729,710,19 2 37 percent
+& 592,718,19 2 38 ampersand
+' 228,718 2 39 quoteright
+cq "
+( 273,734,208 3 40 parenleft
+) 273,734,208 3 41 parenright
+* 319,718 2 42 asterisk
++ 479,506 0 43 plus
+, 228,146,168 0 44 comma
+- 273,345 0 45 hyphen
+hy "
+. 228,146 0 46 period
+/ 228,737,19,28,28 2 47 slash
+sl "
+0 456,710,19 2 48 zero
+1 456,710 2 49 one
+2 456,710 2 50 two
+3 456,710,19 2 51 three
+4 456,710 2 52 four
+5 456,698,19 2 53 five
+6 456,710,19 2 54 six
+7 456,698 2 55 seven
+8 456,710,19 2 56 eight
+9 456,710,19 2 57 nine
+: 273,512 0 58 colon
+; 273,512,168 0 59 semicolon
+< 479,514,8 0 60 less
+= 479,419 0 61 equal
+> 479,514,8 0 62 greater
+? 501,727 2 63 question
+@ 800,737,19 2 64 at
+at "
+A 592,718 2 65 A
+B 592,718 2 66 B
+C 592,737,19 2 67 C
+D 592,718 2 68 D
+E 547,718 2 69 E
+F 501,718 2 70 F
+G 638,737,19 2 71 G
+H 592,718 2 72 H
+I 228,718 2 73 I
+J 456,718,18 2 74 J
+K 592,718,0,1 2 75 K
+L 501,718 2 76 L
+M 683,718 2 77 M
+N 592,718 2 78 N
+O 638,737,19 2 79 O
+P 547,718 2 80 P
+Q 638,737,52 2 81 Q
+R 592,718 2 82 R
+S 547,737,19 2 83 S
+T 501,718 2 84 T
+U 592,718,19 2 85 U
+V 547,718 2 86 V
+W 774,718 2 87 W
+X 547,718 2 88 X
+Y 547,718 2 89 Y
+Z 501,718 2 90 Z
+[ 273,722,196 2 91 bracketleft
+lB "
+\ 228,737,19,28,28 2 92 backslash
+rs "
+] 273,722,196 2 93 bracketright
+rB "
+^ 273,750,0,9,9 2 94 circumflex
+a^ "
+_ 456,0,125 0 95 underscore
+` 228,727 2 96 quoteleft
+oq "
+a 456,546,14 0 97 a
+b 501,718,14 2 98 b
+c 456,546,14 0 99 c
+d 501,718,14 2 100 d
+e 456,546,14 0 101 e
+f 273,727 2 102 f
+g 501,546,217 1 103 g
+h 501,718 2 104 h
+i 228,725 2 105 i
+j 228,725,214 3 106 j
+k 456,718,0,5 2 107 k
+l 228,718 2 108 l
+m 729,546 0 109 m
+n 501,546 0 110 n
+o 501,546,14 0 111 o
+p 501,546,207 1 112 p
+q 501,546,207 1 113 q
+r 319,546 0 114 r
+s 456,546,14 0 115 s
+t 273,676,6 2 116 t
+u 501,532,14 0 117 u
+v 456,532 0 118 v
+w 638,532 0 119 w
+x 456,532 0 120 x
+y 456,532,214 1 121 y
+z 410,532 0 122 z
+{ 319,722,196 2 123 braceleft
+lC "
+| 230,775,225 3 124 bar
+ba "
+} 319,722,196 2 125 braceright
+rC "
+~ 273,737,0,15,14 2 126 tilde
+a~ "
+bq 228,127,146 0 128 quotesinglbase
+Fo 456,484 0 129 guillemotleft
+Fc 456,484 0 130 guillemotright
+bu 287,524 0 131 bullet
+Fn 456,737,210,0,9 3 132 florin
+f/ 137,710,19,139,140 2 133 fraction
+%0 820,710,19,3,3 2 134 perthousand
+dg 456,718,171 2 135 dagger
+dd 456,718,171 2 136 daggerdbl
+en 456,333 0 137 endash
+em 820,333,0,1 0 138 emdash
+fi 501,727 2 140 fi
+fl 501,727 2 141 fl
+.i 228,532 0 144 dotlessi
+ga 273,750,0,0,19 2 146 grave
+a" 273,750,0,126 2 147 hungarumlaut
+a. 273,729 2 148 dotaccent
+ab 273,750,0,2,2 2 149 breve
+ah 273,750,0,9,9 2 150 caron
+ao 273,776 2 151 ring
+ho 273,0,228 1 152 ogonek
+lq 410,727 2 153 quotedblleft
+rq 410,718 2 154 quotedblright
+oe 774,546,14 0 155 oe
+/l 228,718,0,15,15 2 156 lslash
+Bq 410,127,146 0 157 quotedblbase
+OE 820,737,19 2 158 OE
+/L 501,718,0,0,17 2 159 Lslash
+r! 273,532,186 0 161 exclamdown
+ct 456,628,118 0 162 cent
+Po 456,718,16 2 163 sterling
+Cs 456,636,0,3,3 0 164 currency
+Ye 456,698,0,8,8 2 165 yen
+bb 230,700,150 2 166 brokenbar
+sc 456,727,184 2 167 section
+ad 273,729 2 168 dieresis
+co 604,737,19,11,10 2 169 copyright
+Of 303,737 2 170 ordfeminine
+fo 273,484 0 171 guilsinglleft
+tno 479,419 0 172 logicalnot
+\- 479,309 0 173 minus
+rg 604,737,19,10,10 2 174 registered
+a- 273,678,0,5,5 2 175 macron
+de 328,712 2 176 degree
+t+- 479,506 0 177 plusminus
+S2 273,710 2 178 twosuperior
+S3 273,710 2 179 threesuperior
+aa 273,750,0,19 2 180 acute
+*m 501,532,207 1 181 mu
+mc "
+ps 456,700,191,0,7 2 182 paragraph
+pc 228,334 0 183 periodcentered
+ac 273,0,228 1 184 cedilla
+S1 273,710 2 185 onesuperior
+Om 299,737 2 186 ordmasculine
+fc 273,484 0 187 guilsinglright
+14 684,710,19 2 188 onequarter
+12 684,710,19 2 189 onehalf
+34 684,710,19 2 190 threequarters
+r? 501,532,195 0 191 questiondown
+`A 592,936 2 192 Agrave
+'A 592,936 2 193 Aacute
+^A 592,936 2 194 Acircumflex
+~A 592,923 2 195 Atilde
+:A 592,915 2 196 Adieresis
+oA 592,962 2 197 Aring
+AE 820,718 2 198 AE
+,C 592,737,228 3 199 Ccedilla
+`E 547,936 2 200 Egrave
+'E 547,936 2 201 Eacute
+^E 547,936 2 202 Ecircumflex
+:E 547,915 2 203 Edieresis
+`I 228,936,0,0,42 2 204 Igrave
+'I 228,936,0,42 2 205 Iacute
+^I 228,936,0,32,31 2 206 Icircumflex
+:I 228,915,0,19,18 2 207 Idieresis
+-D 592,718,0,0,5 2 208 Eth
+~N 592,923 2 209 Ntilde
+`O 638,936,19 2 210 Ograve
+'O 638,936,19 2 211 Oacute
+^O 638,936,19 2 212 Ocircumflex
+~O 638,923,19 2 213 Otilde
+:O 638,915,19 2 214 Odieresis
+tmu 479,505 0 215 multiply
+/O 638,745,27 2 216 Oslash
+`U 592,936,19 2 217 Ugrave
+'U 592,936,19 2 218 Uacute
+^U 592,936,19 2 219 Ucircumflex
+:U 592,915,19 2 220 Udieresis
+'Y 547,936 2 221 Yacute
+TP 547,718 2 222 Thorn
+ss 501,731,14 2 223 germandbls
+`a 456,750,14 2 224 agrave
+'a 456,750,14 2 225 aacute
+^a 456,750,14 2 226 acircumflex
+~a 456,737,14 2 227 atilde
+:a 456,729,14 2 228 adieresis
+oa 456,776,14 2 229 aring
+ae 729,546,14 0 230 ae
+,c 456,546,228 1 231 ccedilla
+`e 456,750,14 2 232 egrave
+'e 456,750,14 2 233 eacute
+^e 456,750,14 2 234 ecircumflex
+:e 456,729,14 2 235 edieresis
+`i 228,750,0,0,42 2 236 igrave
+'i 228,750,0,42 2 237 iacute
+^i 228,750,0,32,31 2 238 icircumflex
+:i 228,729,0,19,18 2 239 idieresis
+Sd 501,737,14 2 240 eth
+~n 501,737 2 241 ntilde
+`o 501,750,14 2 242 ograve
+'o 501,750,14 2 243 oacute
+^o 501,750,14 2 244 ocircumflex
+~o 501,737,14 2 245 otilde
+:o 501,729,14 2 246 odieresis
+tdi 479,548,42 0 247 divide
+/o 501,560,29 0 248 oslash
+`u 501,750,14 2 249 ugrave
+'u 501,750,14 2 250 uacute
+^u 501,750,14 2 251 ucircumflex
+:u 501,729,14 2 252 udieresis
+'y 456,750,214 3 253 yacute
+Tp 501,718,208 3 254 thorn
+:y 456,729,214 3 255 ydieresis
+u2026 820,146 0 256 ellipsis
diff --git a/font/devps/HNBI b/font/devps/HNBI
new file mode 100644
index 0000000..84b7dab
--- /dev/null
+++ b/font/devps/HNBI
@@ -0,0 +1,1514 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Helvetica Narrow Bold Oblique
+# Version 003.001
+# FamilyName Helvetica
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:08:56 1999
+# Comment UniqueID 44713
+# Comment VMusage 10926 50493
+
+name HNBI
+internalname Helvetica-Narrow-BoldOblique
+slant 12
+spacewidth 228
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A C -40
+A ,C -40
+A G -50
+A O -40
+A 'O -40
+A ^O -40
+A :O -40
+A `O -40
+A /O -40
+A ~O -40
+A Q -40
+A T -90
+A U -50
+A 'U -50
+A ^U -50
+A :U -50
+A `U -50
+A V -80
+A W -60
+A Y -110
+A 'Y -110
+A :Y -110
+A u -30
+A 'u -30
+A ^u -30
+A :u -30
+A `u -30
+A v -40
+A w -30
+A y -30
+A 'y -30
+A :y -30
+'A C -40
+'A ,C -40
+'A G -50
+'A O -40
+'A 'O -40
+'A ^O -40
+'A :O -40
+'A `O -40
+'A /O -40
+'A ~O -40
+'A Q -40
+'A T -90
+'A U -50
+'A 'U -50
+'A ^U -50
+'A :U -50
+'A `U -50
+'A V -80
+'A W -60
+'A Y -110
+'A 'Y -110
+'A :Y -110
+'A u -30
+'A 'u -30
+'A ^u -30
+'A :u -30
+'A `u -30
+'A v -40
+'A w -30
+'A y -30
+'A 'y -30
+'A :y -30
+^A C -40
+^A ,C -40
+^A G -50
+^A O -40
+^A 'O -40
+^A ^O -40
+^A :O -40
+^A `O -40
+^A /O -40
+^A ~O -40
+^A Q -40
+^A T -90
+^A U -50
+^A 'U -50
+^A ^U -50
+^A :U -50
+^A `U -50
+^A V -80
+^A W -60
+^A Y -110
+^A 'Y -110
+^A :Y -110
+^A u -30
+^A 'u -30
+^A ^u -30
+^A :u -30
+^A `u -30
+^A v -40
+^A w -30
+^A y -30
+^A 'y -30
+^A :y -30
+:A C -40
+:A ,C -40
+:A G -50
+:A O -40
+:A 'O -40
+:A ^O -40
+:A :O -40
+:A `O -40
+:A /O -40
+:A ~O -40
+:A Q -40
+:A T -90
+:A U -50
+:A 'U -50
+:A ^U -50
+:A :U -50
+:A `U -50
+:A V -80
+:A W -60
+:A Y -110
+:A 'Y -110
+:A :Y -110
+:A u -30
+:A 'u -30
+:A ^u -30
+:A :u -30
+:A `u -30
+:A v -40
+:A w -30
+:A y -30
+:A 'y -30
+:A :y -30
+`A C -40
+`A ,C -40
+`A G -50
+`A O -40
+`A 'O -40
+`A ^O -40
+`A :O -40
+`A `O -40
+`A /O -40
+`A ~O -40
+`A Q -40
+`A T -90
+`A U -50
+`A 'U -50
+`A ^U -50
+`A :U -50
+`A `U -50
+`A V -80
+`A W -60
+`A Y -110
+`A 'Y -110
+`A :Y -110
+`A u -30
+`A 'u -30
+`A ^u -30
+`A :u -30
+`A `u -30
+`A v -40
+`A w -30
+`A y -30
+`A 'y -30
+`A :y -30
+oA C -40
+oA ,C -40
+oA G -50
+oA O -40
+oA 'O -40
+oA ^O -40
+oA :O -40
+oA `O -40
+oA /O -40
+oA ~O -40
+oA Q -40
+oA T -90
+oA U -50
+oA 'U -50
+oA ^U -50
+oA :U -50
+oA `U -50
+oA V -80
+oA W -60
+oA Y -110
+oA 'Y -110
+oA :Y -110
+oA u -30
+oA 'u -30
+oA ^u -30
+oA :u -30
+oA `u -30
+oA v -40
+oA w -30
+oA y -30
+oA 'y -30
+oA :y -30
+~A C -40
+~A ,C -40
+~A G -50
+~A O -40
+~A 'O -40
+~A ^O -40
+~A :O -40
+~A `O -40
+~A /O -40
+~A ~O -40
+~A Q -40
+~A T -90
+~A U -50
+~A 'U -50
+~A ^U -50
+~A :U -50
+~A `U -50
+~A V -80
+~A W -60
+~A Y -110
+~A 'Y -110
+~A :Y -110
+~A u -30
+~A 'u -30
+~A ^u -30
+~A :u -30
+~A `u -30
+~A v -40
+~A w -30
+~A y -30
+~A 'y -30
+~A :y -30
+B A -30
+B 'A -30
+B ^A -30
+B :A -30
+B `A -30
+B oA -30
+B ~A -30
+B U -10
+B 'U -10
+B ^U -10
+B :U -10
+B `U -10
+D A -40
+D 'A -40
+D ^A -40
+D :A -40
+D `A -40
+D oA -40
+D ~A -40
+D V -40
+D W -40
+D Y -70
+D 'Y -70
+D :Y -70
+D , -30
+D . -30
+D u2026 -30
+F A -80
+F 'A -80
+F ^A -80
+F :A -80
+F `A -80
+F oA -80
+F ~A -80
+F a -20
+F 'a -20
+F ^a -20
+F :a -20
+F `a -20
+F oa -20
+F ~a -20
+F , -100
+F . -100
+F u2026 -100
+J A -20
+J 'A -20
+J ^A -20
+J :A -20
+J `A -20
+J oA -20
+J ~A -20
+J , -20
+J . -20
+J u2026 -20
+J u -20
+J 'u -20
+J ^u -20
+J :u -20
+J `u -20
+K O -30
+K 'O -30
+K ^O -30
+K :O -30
+K `O -30
+K /O -30
+K ~O -30
+K e -15
+K 'e -15
+K ^e -15
+K :e -15
+K `e -15
+K o -35
+K 'o -35
+K ^o -35
+K :o -35
+K `o -35
+K /o -35
+K ~o -35
+K u -30
+K 'u -30
+K ^u -30
+K :u -30
+K `u -30
+K y -40
+K 'y -40
+K :y -40
+L T -90
+L V -110
+L W -80
+L Y -120
+L 'Y -120
+L :Y -120
+L rq -140
+L ' -140
+L cq -140
+L y -30
+L 'y -30
+L :y -30
+/L T -90
+/L V -110
+/L W -80
+/L Y -120
+/L 'Y -120
+/L :Y -120
+/L rq -140
+/L ' -140
+/L cq -140
+/L y -30
+/L 'y -30
+/L :y -30
+O A -50
+O 'A -50
+O ^A -50
+O :A -50
+O `A -50
+O oA -50
+O ~A -50
+O T -40
+O V -50
+O W -50
+O X -50
+O Y -70
+O 'Y -70
+O :Y -70
+O , -40
+O . -40
+O u2026 -40
+'O A -50
+'O 'A -50
+'O ^A -50
+'O :A -50
+'O `A -50
+'O oA -50
+'O ~A -50
+'O T -40
+'O V -50
+'O W -50
+'O X -50
+'O Y -70
+'O 'Y -70
+'O :Y -70
+'O , -40
+'O . -40
+'O u2026 -40
+^O A -50
+^O 'A -50
+^O ^A -50
+^O :A -50
+^O `A -50
+^O oA -50
+^O ~A -50
+^O T -40
+^O V -50
+^O W -50
+^O X -50
+^O Y -70
+^O 'Y -70
+^O :Y -70
+^O , -40
+^O . -40
+^O u2026 -40
+:O A -50
+:O 'A -50
+:O ^A -50
+:O :A -50
+:O `A -50
+:O oA -50
+:O ~A -50
+:O T -40
+:O V -50
+:O W -50
+:O X -50
+:O Y -70
+:O 'Y -70
+:O :Y -70
+:O , -40
+:O . -40
+:O u2026 -40
+`O A -50
+`O 'A -50
+`O ^A -50
+`O :A -50
+`O `A -50
+`O oA -50
+`O ~A -50
+`O T -40
+`O V -50
+`O W -50
+`O X -50
+`O Y -70
+`O 'Y -70
+`O :Y -70
+`O , -40
+`O . -40
+`O u2026 -40
+/O A -50
+/O 'A -50
+/O ^A -50
+/O :A -50
+/O `A -50
+/O oA -50
+/O ~A -50
+/O T -40
+/O V -50
+/O W -50
+/O X -50
+/O Y -70
+/O 'Y -70
+/O :Y -70
+/O , -40
+/O . -40
+/O u2026 -40
+~O A -50
+~O 'A -50
+~O ^A -50
+~O :A -50
+~O `A -50
+~O oA -50
+~O ~A -50
+~O T -40
+~O V -50
+~O W -50
+~O X -50
+~O Y -70
+~O 'Y -70
+~O :Y -70
+~O , -40
+~O . -40
+~O u2026 -40
+P A -100
+P 'A -100
+P ^A -100
+P :A -100
+P `A -100
+P oA -100
+P ~A -100
+P a -30
+P 'a -30
+P ^a -30
+P :a -30
+P `a -30
+P oa -30
+P ~a -30
+P , -120
+P e -30
+P 'e -30
+P ^e -30
+P :e -30
+P `e -30
+P o -40
+P 'o -40
+P ^o -40
+P :o -40
+P `o -40
+P /o -40
+P ~o -40
+P . -120
+P u2026 -120
+Q U -10
+Q 'U -10
+Q ^U -10
+Q :U -10
+Q `U -10
+Q , 20
+Q . 20
+Q u2026 20
+R O -20
+R 'O -20
+R ^O -20
+R :O -20
+R `O -20
+R /O -20
+R ~O -20
+R T -20
+R U -20
+R 'U -20
+R ^U -20
+R :U -20
+R `U -20
+R V -50
+R W -40
+R Y -50
+R 'Y -50
+R :Y -50
+T A -90
+T 'A -90
+T ^A -90
+T :A -90
+T `A -90
+T oA -90
+T ~A -90
+T O -40
+T 'O -40
+T ^O -40
+T :O -40
+T `O -40
+T /O -40
+T ~O -40
+T a -80
+T 'a -80
+T ^a -80
+T :a -80
+T `a -80
+T oa -80
+T ~a -80
+T : -40
+T , -80
+T e -60
+T 'e -60
+T ^e -60
+T :e -60
+T `e -60
+T - -120
+T hy -120
+T o -80
+T 'o -80
+T ^o -80
+T :o -80
+T `o -80
+T /o -80
+T ~o -80
+T . -80
+T u2026 -80
+T r -80
+T ; -40
+T u -90
+T 'u -90
+T ^u -90
+T :u -90
+T `u -90
+T w -60
+T y -60
+T 'y -60
+T :y -60
+U A -50
+U 'A -50
+U ^A -50
+U :A -50
+U `A -50
+U oA -50
+U ~A -50
+U , -30
+U . -30
+U u2026 -30
+'U A -50
+'U 'A -50
+'U ^A -50
+'U :A -50
+'U `A -50
+'U oA -50
+'U ~A -50
+'U , -30
+'U . -30
+'U u2026 -30
+^U A -50
+^U 'A -50
+^U ^A -50
+^U :A -50
+^U `A -50
+^U oA -50
+^U ~A -50
+^U , -30
+^U . -30
+^U u2026 -30
+:U A -50
+:U 'A -50
+:U ^A -50
+:U :A -50
+:U `A -50
+:U oA -50
+:U ~A -50
+:U , -30
+:U . -30
+:U u2026 -30
+`U A -50
+`U 'A -50
+`U ^A -50
+`U :A -50
+`U `A -50
+`U oA -50
+`U ~A -50
+`U , -30
+`U . -30
+`U u2026 -30
+V A -80
+V 'A -80
+V ^A -80
+V :A -80
+V `A -80
+V oA -80
+V ~A -80
+V G -50
+V O -50
+V 'O -50
+V ^O -50
+V :O -50
+V `O -50
+V /O -50
+V ~O -50
+V a -60
+V 'a -60
+V ^a -60
+V :a -60
+V `a -60
+V oa -60
+V ~a -60
+V : -40
+V , -120
+V e -50
+V 'e -50
+V ^e -50
+V :e -50
+V `e -50
+V - -80
+V hy -80
+V o -90
+V 'o -90
+V ^o -90
+V :o -90
+V `o -90
+V /o -90
+V ~o -90
+V . -120
+V u2026 -120
+V ; -40
+V u -60
+V 'u -60
+V ^u -60
+V :u -60
+V `u -60
+W A -60
+W 'A -60
+W ^A -60
+W :A -60
+W `A -60
+W oA -60
+W ~A -60
+W O -20
+W 'O -20
+W ^O -20
+W :O -20
+W `O -20
+W /O -20
+W ~O -20
+W a -40
+W 'a -40
+W ^a -40
+W :a -40
+W `a -40
+W oa -40
+W ~a -40
+W : -10
+W , -80
+W e -35
+W 'e -35
+W ^e -35
+W :e -35
+W `e -35
+W - -40
+W hy -40
+W o -60
+W 'o -60
+W ^o -60
+W :o -60
+W `o -60
+W /o -60
+W ~o -60
+W . -80
+W u2026 -80
+W ; -10
+W u -45
+W 'u -45
+W ^u -45
+W :u -45
+W `u -45
+W y -20
+W 'y -20
+W :y -20
+Y A -110
+Y 'A -110
+Y ^A -110
+Y :A -110
+Y `A -110
+Y oA -110
+Y ~A -110
+Y O -70
+Y 'O -70
+Y ^O -70
+Y :O -70
+Y `O -70
+Y /O -70
+Y ~O -70
+Y a -90
+Y 'a -90
+Y ^a -90
+Y :a -90
+Y `a -90
+Y oa -90
+Y ~a -90
+Y : -50
+Y , -100
+Y e -80
+Y 'e -80
+Y ^e -80
+Y :e -80
+Y `e -80
+Y o -100
+Y 'o -100
+Y ^o -100
+Y :o -100
+Y `o -100
+Y /o -100
+Y ~o -100
+Y . -100
+Y u2026 -100
+Y ; -50
+Y u -100
+Y 'u -100
+Y ^u -100
+Y :u -100
+Y `u -100
+'Y A -110
+'Y 'A -110
+'Y ^A -110
+'Y :A -110
+'Y `A -110
+'Y oA -110
+'Y ~A -110
+'Y O -70
+'Y 'O -70
+'Y ^O -70
+'Y :O -70
+'Y `O -70
+'Y /O -70
+'Y ~O -70
+'Y a -90
+'Y 'a -90
+'Y ^a -90
+'Y :a -90
+'Y `a -90
+'Y oa -90
+'Y ~a -90
+'Y : -50
+'Y , -100
+'Y e -80
+'Y 'e -80
+'Y ^e -80
+'Y :e -80
+'Y `e -80
+'Y o -100
+'Y 'o -100
+'Y ^o -100
+'Y :o -100
+'Y `o -100
+'Y /o -100
+'Y ~o -100
+'Y . -100
+'Y u2026 -100
+'Y ; -50
+'Y u -100
+'Y 'u -100
+'Y ^u -100
+'Y :u -100
+'Y `u -100
+:Y A -110
+:Y 'A -110
+:Y ^A -110
+:Y :A -110
+:Y `A -110
+:Y oA -110
+:Y ~A -110
+:Y O -70
+:Y 'O -70
+:Y ^O -70
+:Y :O -70
+:Y `O -70
+:Y /O -70
+:Y ~O -70
+:Y a -90
+:Y 'a -90
+:Y ^a -90
+:Y :a -90
+:Y `a -90
+:Y oa -90
+:Y ~a -90
+:Y : -50
+:Y , -100
+:Y e -80
+:Y 'e -80
+:Y ^e -80
+:Y :e -80
+:Y `e -80
+:Y o -100
+:Y 'o -100
+:Y ^o -100
+:Y :o -100
+:Y `o -100
+:Y /o -100
+:Y ~o -100
+:Y . -100
+:Y u2026 -100
+:Y ; -50
+:Y u -100
+:Y 'u -100
+:Y ^u -100
+:Y :u -100
+:Y `u -100
+a g -10
+a v -15
+a w -15
+a y -20
+a 'y -20
+a :y -20
+'a g -10
+'a v -15
+'a w -15
+'a y -20
+'a 'y -20
+'a :y -20
+^a g -10
+^a v -15
+^a w -15
+^a y -20
+^a 'y -20
+^a :y -20
+:a g -10
+:a v -15
+:a w -15
+:a y -20
+:a 'y -20
+:a :y -20
+`a g -10
+`a v -15
+`a w -15
+`a y -20
+`a 'y -20
+`a :y -20
+oa g -10
+oa v -15
+oa w -15
+oa y -20
+oa 'y -20
+oa :y -20
+~a g -10
+~a v -15
+~a w -15
+~a y -20
+~a 'y -20
+~a :y -20
+b l -10
+b /l -10
+b u -20
+b 'u -20
+b ^u -20
+b :u -20
+b `u -20
+b v -20
+b y -20
+b 'y -20
+b :y -20
+c h -10
+c k -20
+c l -20
+c /l -20
+c y -10
+c 'y -10
+c :y -10
+,c h -10
+,c k -20
+,c l -20
+,c /l -20
+,c y -10
+,c 'y -10
+,c :y -10
+: u0020 -40
+, rq -120
+, ' -120
+, cq -120
+, u0020 -40
+d d -10
+d v -15
+d w -15
+d y -15
+d 'y -15
+d :y -15
+e , 10
+e . 20
+e u2026 20
+e v -15
+e w -15
+e x -15
+e y -15
+e 'y -15
+e :y -15
+'e , 10
+'e . 20
+'e u2026 20
+'e v -15
+'e w -15
+'e x -15
+'e y -15
+'e 'y -15
+'e :y -15
+^e , 10
+^e . 20
+^e u2026 20
+^e v -15
+^e w -15
+^e x -15
+^e y -15
+^e 'y -15
+^e :y -15
+:e , 10
+:e . 20
+:e u2026 20
+:e v -15
+:e w -15
+:e x -15
+:e y -15
+:e 'y -15
+:e :y -15
+`e , 10
+`e . 20
+`e u2026 20
+`e v -15
+`e w -15
+`e x -15
+`e y -15
+`e 'y -15
+`e :y -15
+f , -10
+f e -10
+f 'e -10
+f ^e -10
+f :e -10
+f `e -10
+f o -20
+f 'o -20
+f ^o -20
+f :o -20
+f `o -20
+f /o -20
+f ~o -20
+f . -10
+f u2026 -10
+f rq 30
+f ' 30
+f cq 30
+g e 10
+g 'e 10
+g ^e 10
+g :e 10
+g `e 10
+g g -10
+h y -20
+h 'y -20
+h :y -20
+k o -15
+k 'o -15
+k ^o -15
+k :o -15
+k `o -15
+k /o -15
+k ~o -15
+l w -15
+l y -15
+l 'y -15
+l :y -15
+/l w -15
+/l y -15
+/l 'y -15
+/l :y -15
+m u -20
+m 'u -20
+m ^u -20
+m :u -20
+m `u -20
+m y -30
+m 'y -30
+m :y -30
+n u -10
+n 'u -10
+n ^u -10
+n :u -10
+n `u -10
+n v -40
+n y -20
+n 'y -20
+n :y -20
+~n u -10
+~n 'u -10
+~n ^u -10
+~n :u -10
+~n `u -10
+~n v -40
+~n y -20
+~n 'y -20
+~n :y -20
+o v -20
+o w -15
+o x -30
+o y -20
+o 'y -20
+o :y -20
+'o v -20
+'o w -15
+'o x -30
+'o y -20
+'o 'y -20
+'o :y -20
+^o v -20
+^o w -15
+^o x -30
+^o y -20
+^o 'y -20
+^o :y -20
+:o v -20
+:o w -15
+:o x -30
+:o y -20
+:o 'y -20
+:o :y -20
+`o v -20
+`o w -15
+`o x -30
+`o y -20
+`o 'y -20
+`o :y -20
+/o v -20
+/o w -15
+/o x -30
+/o y -20
+/o 'y -20
+/o :y -20
+~o v -20
+~o w -15
+~o x -30
+~o y -20
+~o 'y -20
+~o :y -20
+p y -15
+p 'y -15
+p :y -15
+. rq -120
+u2026 rq -120
+. ' -120
+u2026 ' -120
+. cq -120
+u2026 cq -120
+. u0020 -40
+u2026 u0020 -40
+rq u0020 -80
+` ` -46
+` oq -46
+oq ` -46
+oq oq -46
+' d -80
+cq d -80
+' l -20
+cq l -20
+' /l -20
+cq /l -20
+' ' -46
+' cq -46
+cq ' -46
+cq cq -46
+' r -40
+cq r -40
+' s -60
+cq s -60
+' vs -60
+cq vs -60
+' u0020 -80
+cq u0020 -80
+' v -20
+cq v -20
+r c -20
+r ,c -20
+r , -60
+r d -20
+r g -15
+r - -20
+r hy -20
+r o -20
+r 'o -20
+r ^o -20
+r :o -20
+r `o -20
+r /o -20
+r ~o -20
+r . -60
+r u2026 -60
+r q -20
+r s -15
+r vs -15
+r t 20
+r v 10
+r y 10
+r 'y 10
+r :y 10
+s w -15
+vs w -15
+; u0020 -40
+u0020 T -100
+u0020 V -80
+u0020 W -80
+u0020 Y -120
+u0020 'Y -120
+u0020 :Y -120
+u0020 lq -80
+u0020 ` -60
+u0020 oq -60
+v a -20
+v 'a -20
+v ^a -20
+v :a -20
+v `a -20
+v oa -20
+v ~a -20
+v , -80
+v o -30
+v 'o -30
+v ^o -30
+v :o -30
+v `o -30
+v /o -30
+v ~o -30
+v . -80
+v u2026 -80
+w , -40
+w o -20
+w 'o -20
+w ^o -20
+w :o -20
+w `o -20
+w /o -20
+w ~o -20
+w . -40
+w u2026 -40
+x e -10
+x 'e -10
+x ^e -10
+x :e -10
+x `e -10
+y a -30
+y 'a -30
+y ^a -30
+y :a -30
+y `a -30
+y oa -30
+y ~a -30
+y , -80
+y e -10
+y 'e -10
+y ^e -10
+y :e -10
+y `e -10
+y o -25
+y 'o -25
+y ^o -25
+y :o -25
+y `o -25
+y /o -25
+y ~o -25
+y . -80
+y u2026 -80
+'y a -30
+'y 'a -30
+'y ^a -30
+'y :a -30
+'y `a -30
+'y oa -30
+'y ~a -30
+'y , -80
+'y e -10
+'y 'e -10
+'y ^e -10
+'y :e -10
+'y `e -10
+'y o -25
+'y 'o -25
+'y ^o -25
+'y :o -25
+'y `o -25
+'y /o -25
+'y ~o -25
+'y . -80
+'y u2026 -80
+:y a -30
+:y 'a -30
+:y ^a -30
+:y :a -30
+:y `a -30
+:y oa -30
+:y ~a -30
+:y , -80
+:y e -10
+:y 'e -10
+:y ^e -10
+:y :e -10
+:y `e -10
+:y o -25
+:y 'o -25
+:y ^o -25
+:y :o -25
+:y `o -25
+:y /o -25
+:y ~o -25
+:y . -80
+:y u2026 -80
+z e 10
+z 'e 10
+z ^e 10
+z :e 10
+z `e 10
+vz e 10
+vz 'e 10
+vz ^e 10
+vz :e 10
+vz `e 10
+
+charset
+ha 479,698,0,56,-57,56 2 0 asciicircum
+ti 479,343,0,44,-44,44 0 1 asciitilde
+vS 547,936,19,92,-15,90 2 2 Scaron
+vZ 501,936,0,154,30,90 2 3 Zcaron
+vs 456,750,14,98,-1,90 2 4 scaron
+vz 410,750,0,121,34,90 2 5 zcaron
+:Y 547,915,0,164,-87,90 2 6 Ydieresis
+tm 820,718,0,140,-96,90 2 7 trademark
+aq 195,718,0,118,-85,90 2 8 quotesingle
+Eu 456,710,19,164,2,90 2 9 Euro
+space 228 0 32 space
+! 273,718,0,103,-27,90 2 33 exclam
+" 389,718,0,95,-108,90 2 34 quotedbl
+dq "
+# 456,698,0,123,1,90 2 35 numbersign
+sh "
+$ 456,775,115,104,-4,90 2 36 dollar
+Do "
+% 729,710,19,60,-61,60 2 37 percent
+& 592,718,19,59,-22,59 2 38 ampersand
+' 228,718,0,119,-86,90 2 39 quoteright
+cq "
+( 273,734,208,163,-12,90 3 40 parenleft
+) 273,734,208,80,71,80 3 41 parenright
+* 319,718,0,126,-69,90 2 42 asterisk
++ 479,506,0,71,-17,71 0 43 plus
+, 228,146,168,23,27,23 0 44 comma
+- 273,345,0,89,-9,89 0 45 hyphen
+hy "
+. 228,146,0,23,-2,23 0 46 period
+/ 228,737,19,206,81,90 2 47 slash
+sl "
+0 456,710,19,100,-20,90 2 48 zero
+1 456,710,0,28,-91,28 2 49 one
+2 456,710,0,102,29,90 2 50 two
+3 456,710,19,93,-3,90 2 51 three
+4 456,710,0,85,1,85 2 52 four
+5 456,698,19,116,-2,90 2 53 five
+6 456,710,19,102,-19,90 2 54 six
+7 456,698,0,149,-52,90 2 55 seven
+8 456,710,19,99,-6,90 2 56 eight
+9 456,710,19,99,-13,90 2 57 nine
+: 273,512,0,65,-25,65 0 58 colon
+; 273,512,168,65,4,65 0 59 semicolon
+< 479,514,8,109,-17,90 0 60 less
+= 479,419,0,91,3,90 0 61 equal
+> 479,514,8,71,21,71 0 62 greater
+? 501,727,0,100,-85,90 2 63 question
+@ 800,737,19,32,-102,32 2 64 at
+at "
+A 592,718,0,34,34,34 2 65 A
+B 592,718,0,85,-12,85 2 66 B
+C 592,737,19,105,-37,90 2 67 C
+D 592,718,0,96,-12,90 2 68 D
+E 547,718,0,124,-12,90 2 69 E
+F 501,718,0,156,-12,90 2 70 F
+G 638,737,19,82,-38,82 2 71 G
+H 592,718,0,117,-8,90 2 72 H
+I 228,718,0,123,-2,90 2 73 I
+J 456,718,18,117,2,90 2 74 J
+K 592,718,0,162,-21,90 2 75 K
+L 501,718,0,50,-12,50 2 76 L
+M 683,718,0,120,-6,90 2 77 M
+N 592,718,0,120,-6,90 2 78 N
+O 638,737,19,88,-37,88 2 79 O
+P 547,718,0,108,-12,90 2 80 P
+Q 638,737,52,88,-37,88 2 81 Q
+R 592,718,0,97,-12,90 2 82 R
+S 547,737,19,92,-15,90 2 83 S
+T 501,718,0,165,-64,90 2 84 T
+U 592,718,19,117,-44,90 2 85 U
+V 547,718,0,160,-90,90 2 86 V
+W 774,718,0,163,-88,90 2 87 W
+X 547,718,0,152,39,90 2 88 X
+Y 547,718,0,164,-87,90 2 89 Y
+Z 501,718,0,154,30,90 2 90 Z
+[ 273,722,196,157,33,90 2 91 bracketleft
+lB "
+\ 228,737,19,74,-51,74 2 92 backslash
+rs "
+] 273,722,196,125,65,90 2 93 bracketright
+rB "
+^ 273,750,0,164,-47,90 2 94 circumflex
+a^ "
+_ 456,0,125,37,72,37 0 95 underscore
+` 228,727,0,118,-85,90 2 96 quoteleft
+oq "
+a 456,546,14,72,6,72 0 97 a
+b 501,718,14,79,0,79 2 98 b
+c 456,546,14,86,-14,86 0 99 c
+d 501,718,14,126,-17,90 2 100 d
+e 456,546,14,81,-7,81 0 101 e
+f 273,727,0,162,-21,90 2 102 f
+g 501,546,217,96,19,90 1 103 g
+h 501,718,0,66,-3,66 2 104 h
+i 228,725,0,120,-6,90 2 105 i
+j 228,725,214,120,85,90 3 106 j
+k 456,718,0,144,-6,90 2 107 k
+l 228,718,0,119,-6,90 2 108 l
+m 729,546,0,67,-2,67 0 109 m
+n 501,546,0,66,-3,66 0 110 n
+o 501,546,14,77,-17,77 0 111 o
+p 501,546,207,79,36,79 1 112 p
+q 501,546,207,95,-15,90 1 113 q
+r 319,546,0,132,-2,90 0 114 r
+s 456,546,14,73,-1,73 0 115 s
+t 273,676,6,124,-32,90 2 116 t
+u 501,532,14,89,-30,89 0 117 u
+v 456,532,0,132,-53,90 0 118 v
+w 638,532,0,136,-50,90 0 119 w
+x 456,532,0,126,38,90 0 120 x
+y 456,532,214,129,16,90 1 121 y
+z 410,532,0,119,34,90 0 122 z
+{ 319,722,196,157,-27,90 2 123 braceleft
+lC "
+| 230,775,225,116,21,90 3 124 bar
+ba "
+} 319,722,196,65,65,65 2 125 braceright
+rC "
+~ 273,737,0,193,-42,90 2 126 tilde
+a~ "
+bq 228,127,146,16,17,16 0 128 quotesinglbase
+Fo 456,484,0,63,-60,63 0 129 guillemotleft
+Fc 456,484,0,38,-35,38 0 130 guillemotright
+bu 287,524,0,108,-17,90 0 131 bullet
+Fn 456,737,210,143,92,90 3 132 florin
+f/ 137,710,19,313,193,90 2 133 fraction
+%0 820,710,19,82,-12,82 2 134 perthousand
+dg 456,718,171,108,-46,90 2 135 dagger
+dd 456,718,171,110,13,90 2 136 daggerdbl
+en 456,333,0,108,11,90 0 137 endash
+em 820,333,0,109,11,90 0 138 emdash
+fi 501,727,0,120,-21,90 2 140 fi
+fl 501,727,0,119,-21,90 2 141 fl
+.i 228,532,0,87,-6,87 0 144 dotlessi
+ga 273,750,0,67,-61,67 2 146 grave
+a" 273,750,0,307,-62,90 2 147 hungarumlaut
+a. 273,729,0,93,-142,90 2 148 dotaccent
+ab 273,750,0,183,-77,90 2 149 breve
+ah 273,750,0,189,-72,90 2 150 caron
+ao 273,776,0,122,-113,90 2 151 ring
+ho 273,0,228,0,17 1 152 ogonek
+lq 410,727,0,122,-81,90 2 153 quotedblleft
+rq 410,718,0,123,-82,90 2 154 quotedblright
+oe 774,546,14,78,-17,78 0 155 oe
+/l 228,718,0,156,18,90 2 156 lslash
+Bq 410,127,146,20,21,20 0 157 quotedblbase
+OE 820,737,19,144,-30,90 2 158 OE
+/L 501,718,0,50,22,50 2 159 Lslash
+r! 273,532,186,67,9,67 0 161 exclamdown
+ct 456,628,118,86,-14,86 0 162 cent
+Po 456,718,16,115,9,90 2 163 sterling
+Cs 456,636,0,152,28,90 0 164 currency
+Ye 456,698,0,179,2,90 2 165 yen
+bb 230,700,150,103,8,90 2 166 brokenbar
+sc 456,727,184,85,1,85 2 167 section
+ad 273,729,0,173,-61,90 2 168 dieresis
+co 604,737,19,132,5,90 2 169 copyright
+Of 303,737,0,129,-52,90 2 170 ordfeminine
+fo 273,484,0,67,-56,67 0 171 guilsinglleft
+tno 479,419,0,91,-36,90 0 172 logicalnot
+\- 479,309,0,71,-17,71 0 173 minus
+rg 604,737,19,131,5,90 2 174 registered
+a- 273,678,0,174,-50,90 2 175 macron
+de 328,712,0,106,-93,90 2 176 degree
+t+- 479,506,0,84,18,84 0 177 plusminus
+S2 273,710,0,145,-6,90 2 178 twosuperior
+S3 273,710,0,139,-25,90 2 179 threesuperior
+aa 273,750,0,200,-143,90 2 180 acute
+*m 501,532,207,90,33,90 1 181 mu
+mc "
+ps 456,700,191,158,-30,90 2 182 paragraph
+pc 228,334,0,49,-40,49 0 183 periodcentered
+ac 273,0,228,0,81 1 184 cedilla
+S1 273,710,0,96,-71,90 2 185 onesuperior
+Om 299,737,0,149,-50,90 2 186 ordmasculine
+fc 273,484,0,42,-31,42 0 187 guilsinglright
+14 684,710,19,28,-58,28 2 188 onequarter
+12 684,710,19,70,-58,70 2 189 onehalf
+34 684,710,19,55,-31,55 2 190 threequarters
+r? 501,532,195,8,7,8 0 191 questiondown
+`A 592,936,0,34,34,34 2 192 Agrave
+'A 592,936,0,73,34,73 2 193 Aacute
+^A 592,936,0,37,34,37 2 194 Acircumflex
+~A 592,923,0,66,34,66 2 195 Atilde
+:A 592,915,0,46,34,46 2 196 Adieresis
+oA 592,962,0,34,34,34 2 197 Aring
+AE 820,718,0,132,46,90 2 198 AE
+,C 592,737,228,105,-37,90 3 199 Ccedilla
+`E 547,936,0,124,-12,90 2 200 Egrave
+'E 547,936,0,124,-12,90 2 201 Eacute
+^E 547,936,0,124,-12,90 2 202 Ecircumflex
+:E 547,915,0,124,-12,90 2 203 Edieresis
+`I 228,936,0,123,-2,90 2 204 Igrave
+'I 228,936,0,255,-2,90 2 205 Iacute
+^I 228,936,0,219,-2,90 2 206 Icircumflex
+:I 228,915,0,228,-2,90 2 207 Idieresis
+-D 592,718,0,96,0,90 2 208 Eth
+~N 592,923,0,120,-6,90 2 209 Ntilde
+`O 638,936,19,88,-37,88 2 210 Ograve
+'O 638,936,19,88,-37,88 2 211 Oacute
+^O 638,936,19,88,-37,88 2 212 Ocircumflex
+~O 638,923,19,88,-37,88 2 213 Otilde
+:O 638,915,19,88,-37,88 2 214 Odieresis
+tmu 479,505,0,92,4,90 0 215 multiply
+/O 638,745,27,146,22,90 2 216 Oslash
+`U 592,936,19,117,-44,90 2 217 Ugrave
+'U 592,936,19,117,-44,90 2 218 Uacute
+^U 592,936,19,117,-44,90 2 219 Ucircumflex
+:U 592,915,19,117,-44,90 2 220 Udieresis
+'Y 547,936,0,164,-87,90 2 221 Yacute
+TP 547,718,0,91,-12,90 2 222 Thorn
+ss 501,731,14,88,-6,88 2 223 germandbls
+`a 456,750,14,72,6,72 2 224 agrave
+'a 456,750,14,109,6,90 2 225 aacute
+^a 456,750,14,73,6,73 2 226 acircumflex
+~a 456,737,14,102,6,90 2 227 atilde
+:a 456,729,14,82,6,82 2 228 adieresis
+oa 456,776,14,72,6,72 2 229 aring
+ae 729,546,14,78,5,78 0 230 ae
+,c 456,546,228,86,-14,86 1 231 ccedilla
+`e 456,750,14,81,-7,81 2 232 egrave
+'e 456,750,14,109,-7,90 2 233 eacute
+^e 456,750,14,81,-7,81 2 234 ecircumflex
+:e 456,729,14,82,-7,82 2 235 edieresis
+`i 228,750,0,90,-6,90 2 236 igrave
+'i 228,750,0,223,-6,90 2 237 iacute
+^i 228,750,0,187,-6,90 2 238 icircumflex
+:i 228,729,0,196,-6,90 2 239 idieresis
+Sd 501,737,14,99,-16,90 2 240 eth
+~n 501,737,0,79,-3,79 2 241 ntilde
+`o 501,750,14,77,-17,77 2 242 ograve
+'o 501,750,14,86,-17,86 2 243 oacute
+^o 501,750,14,77,-17,77 2 244 ocircumflex
+~o 501,737,14,79,-17,79 2 245 otilde
+:o 501,729,14,77,-17,77 2 246 odieresis
+tdi 479,548,42,71,-17,71 0 247 divide
+/o 501,560,29,125,32,90 0 248 oslash
+`u 501,750,14,89,-30,89 2 249 ugrave
+'u 501,750,14,89,-30,89 2 250 uacute
+^u 501,750,14,89,-30,89 2 251 ucircumflex
+:u 501,729,14,89,-30,89 2 252 udieresis
+'y 456,750,214,129,16,90 3 253 yacute
+Tp 501,718,208,79,36,79 3 254 thorn
+:y 456,729,214,129,16,90 3 255 ydieresis
+u2026 820,146,0,1,-25,1 0 256 ellipsis
diff --git a/font/devps/HNI b/font/devps/HNI
new file mode 100644
index 0000000..2046e16
--- /dev/null
+++ b/font/devps/HNI
@@ -0,0 +1,1645 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Helvetica Narrow Oblique
+# Version 003.001
+# FamilyName Helvetica
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:09:51 1999
+# Comment UniqueID 44714
+# Comment VMusage 11195 50629
+
+name HNI
+internalname Helvetica-Narrow-Oblique
+slant 12
+spacewidth 228
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A C -30
+A ,C -30
+A G -30
+A O -30
+A 'O -30
+A ^O -30
+A :O -30
+A `O -30
+A /O -30
+A ~O -30
+A Q -30
+A T -120
+A U -50
+A 'U -50
+A ^U -50
+A :U -50
+A `U -50
+A V -70
+A W -50
+A Y -100
+A 'Y -100
+A :Y -100
+A u -30
+A 'u -30
+A ^u -30
+A :u -30
+A `u -30
+A v -40
+A w -40
+A y -40
+A 'y -40
+A :y -40
+'A C -30
+'A ,C -30
+'A G -30
+'A O -30
+'A 'O -30
+'A ^O -30
+'A :O -30
+'A `O -30
+'A /O -30
+'A ~O -30
+'A Q -30
+'A T -120
+'A U -50
+'A 'U -50
+'A ^U -50
+'A :U -50
+'A `U -50
+'A V -70
+'A W -50
+'A Y -100
+'A 'Y -100
+'A :Y -100
+'A u -30
+'A 'u -30
+'A ^u -30
+'A :u -30
+'A `u -30
+'A v -40
+'A w -40
+'A y -40
+'A 'y -40
+'A :y -40
+^A C -30
+^A ,C -30
+^A G -30
+^A O -30
+^A 'O -30
+^A ^O -30
+^A :O -30
+^A `O -30
+^A /O -30
+^A ~O -30
+^A Q -30
+^A T -120
+^A U -50
+^A 'U -50
+^A ^U -50
+^A :U -50
+^A `U -50
+^A V -70
+^A W -50
+^A Y -100
+^A 'Y -100
+^A :Y -100
+^A u -30
+^A 'u -30
+^A ^u -30
+^A :u -30
+^A `u -30
+^A v -40
+^A w -40
+^A y -40
+^A 'y -40
+^A :y -40
+:A C -30
+:A ,C -30
+:A G -30
+:A O -30
+:A 'O -30
+:A ^O -30
+:A :O -30
+:A `O -30
+:A /O -30
+:A ~O -30
+:A Q -30
+:A T -120
+:A U -50
+:A 'U -50
+:A ^U -50
+:A :U -50
+:A `U -50
+:A V -70
+:A W -50
+:A Y -100
+:A 'Y -100
+:A :Y -100
+:A u -30
+:A 'u -30
+:A ^u -30
+:A :u -30
+:A `u -30
+:A v -40
+:A w -40
+:A y -40
+:A 'y -40
+:A :y -40
+`A C -30
+`A ,C -30
+`A G -30
+`A O -30
+`A 'O -30
+`A ^O -30
+`A :O -30
+`A `O -30
+`A /O -30
+`A ~O -30
+`A Q -30
+`A T -120
+`A U -50
+`A 'U -50
+`A ^U -50
+`A :U -50
+`A `U -50
+`A V -70
+`A W -50
+`A Y -100
+`A 'Y -100
+`A :Y -100
+`A u -30
+`A 'u -30
+`A ^u -30
+`A :u -30
+`A `u -30
+`A v -40
+`A w -40
+`A y -40
+`A 'y -40
+`A :y -40
+oA C -30
+oA ,C -30
+oA G -30
+oA O -30
+oA 'O -30
+oA ^O -30
+oA :O -30
+oA `O -30
+oA /O -30
+oA ~O -30
+oA Q -30
+oA T -120
+oA U -50
+oA 'U -50
+oA ^U -50
+oA :U -50
+oA `U -50
+oA V -70
+oA W -50
+oA Y -100
+oA 'Y -100
+oA :Y -100
+oA u -30
+oA 'u -30
+oA ^u -30
+oA :u -30
+oA `u -30
+oA v -40
+oA w -40
+oA y -40
+oA 'y -40
+oA :y -40
+~A C -30
+~A ,C -30
+~A G -30
+~A O -30
+~A 'O -30
+~A ^O -30
+~A :O -30
+~A `O -30
+~A /O -30
+~A ~O -30
+~A Q -30
+~A T -120
+~A U -50
+~A 'U -50
+~A ^U -50
+~A :U -50
+~A `U -50
+~A V -70
+~A W -50
+~A Y -100
+~A 'Y -100
+~A :Y -100
+~A u -30
+~A 'u -30
+~A ^u -30
+~A :u -30
+~A `u -30
+~A v -40
+~A w -40
+~A y -40
+~A 'y -40
+~A :y -40
+B U -10
+B 'U -10
+B ^U -10
+B :U -10
+B `U -10
+B , -20
+B . -20
+B u2026 -20
+C , -30
+C . -30
+C u2026 -30
+,C , -30
+,C . -30
+,C u2026 -30
+D A -40
+D 'A -40
+D ^A -40
+D :A -40
+D `A -40
+D oA -40
+D ~A -40
+D V -70
+D W -40
+D Y -90
+D 'Y -90
+D :Y -90
+D , -70
+D . -70
+D u2026 -70
+F A -80
+F 'A -80
+F ^A -80
+F :A -80
+F `A -80
+F oA -80
+F ~A -80
+F a -50
+F 'a -50
+F ^a -50
+F :a -50
+F `a -50
+F oa -50
+F ~a -50
+F , -150
+F e -30
+F 'e -30
+F ^e -30
+F :e -30
+F `e -30
+F o -30
+F 'o -30
+F ^o -30
+F :o -30
+F `o -30
+F /o -30
+F ~o -30
+F . -150
+F u2026 -150
+F r -45
+J A -20
+J 'A -20
+J ^A -20
+J :A -20
+J `A -20
+J oA -20
+J ~A -20
+J a -20
+J 'a -20
+J ^a -20
+J :a -20
+J `a -20
+J oa -20
+J ~a -20
+J , -30
+J . -30
+J u2026 -30
+J u -20
+J 'u -20
+J ^u -20
+J :u -20
+J `u -20
+K O -50
+K 'O -50
+K ^O -50
+K :O -50
+K `O -50
+K /O -50
+K ~O -50
+K e -40
+K 'e -40
+K ^e -40
+K :e -40
+K `e -40
+K o -40
+K 'o -40
+K ^o -40
+K :o -40
+K `o -40
+K /o -40
+K ~o -40
+K u -30
+K 'u -30
+K ^u -30
+K :u -30
+K `u -30
+K y -50
+K 'y -50
+K :y -50
+L T -110
+L V -110
+L W -70
+L Y -140
+L 'Y -140
+L :Y -140
+L rq -140
+L ' -160
+L cq -160
+L y -30
+L 'y -30
+L :y -30
+/L T -110
+/L V -110
+/L W -70
+/L Y -140
+/L 'Y -140
+/L :Y -140
+/L rq -140
+/L ' -160
+/L cq -160
+/L y -30
+/L 'y -30
+/L :y -30
+O A -20
+O 'A -20
+O ^A -20
+O :A -20
+O `A -20
+O oA -20
+O ~A -20
+O T -40
+O V -50
+O W -30
+O X -60
+O Y -70
+O 'Y -70
+O :Y -70
+O , -40
+O . -40
+O u2026 -40
+'O A -20
+'O 'A -20
+'O ^A -20
+'O :A -20
+'O `A -20
+'O oA -20
+'O ~A -20
+'O T -40
+'O V -50
+'O W -30
+'O X -60
+'O Y -70
+'O 'Y -70
+'O :Y -70
+'O , -40
+'O . -40
+'O u2026 -40
+^O A -20
+^O 'A -20
+^O ^A -20
+^O :A -20
+^O `A -20
+^O oA -20
+^O ~A -20
+^O T -40
+^O V -50
+^O W -30
+^O X -60
+^O Y -70
+^O 'Y -70
+^O :Y -70
+^O , -40
+^O . -40
+^O u2026 -40
+:O A -20
+:O 'A -20
+:O ^A -20
+:O :A -20
+:O `A -20
+:O oA -20
+:O ~A -20
+:O T -40
+:O V -50
+:O W -30
+:O X -60
+:O Y -70
+:O 'Y -70
+:O :Y -70
+:O , -40
+:O . -40
+:O u2026 -40
+`O A -20
+`O 'A -20
+`O ^A -20
+`O :A -20
+`O `A -20
+`O oA -20
+`O ~A -20
+`O T -40
+`O V -50
+`O W -30
+`O X -60
+`O Y -70
+`O 'Y -70
+`O :Y -70
+`O , -40
+`O . -40
+`O u2026 -40
+/O A -20
+/O 'A -20
+/O ^A -20
+/O :A -20
+/O `A -20
+/O oA -20
+/O ~A -20
+/O T -40
+/O V -50
+/O W -30
+/O X -60
+/O Y -70
+/O 'Y -70
+/O :Y -70
+/O , -40
+/O . -40
+/O u2026 -40
+~O A -20
+~O 'A -20
+~O ^A -20
+~O :A -20
+~O `A -20
+~O oA -20
+~O ~A -20
+~O T -40
+~O V -50
+~O W -30
+~O X -60
+~O Y -70
+~O 'Y -70
+~O :Y -70
+~O , -40
+~O . -40
+~O u2026 -40
+P A -120
+P 'A -120
+P ^A -120
+P :A -120
+P `A -120
+P oA -120
+P ~A -120
+P a -40
+P 'a -40
+P ^a -40
+P :a -40
+P `a -40
+P oa -40
+P ~a -40
+P , -180
+P e -50
+P 'e -50
+P ^e -50
+P :e -50
+P `e -50
+P o -50
+P 'o -50
+P ^o -50
+P :o -50
+P `o -50
+P /o -50
+P ~o -50
+P . -180
+P u2026 -180
+Q U -10
+Q 'U -10
+Q ^U -10
+Q :U -10
+Q `U -10
+R O -20
+R 'O -20
+R ^O -20
+R :O -20
+R `O -20
+R /O -20
+R ~O -20
+R T -30
+R U -40
+R 'U -40
+R ^U -40
+R :U -40
+R `U -40
+R V -50
+R W -30
+R Y -50
+R 'Y -50
+R :Y -50
+S , -20
+S . -20
+S u2026 -20
+vS , -20
+vS . -20
+vS u2026 -20
+T A -120
+T 'A -120
+T ^A -120
+T :A -120
+T `A -120
+T oA -120
+T ~A -120
+T O -40
+T 'O -40
+T ^O -40
+T :O -40
+T `O -40
+T /O -40
+T ~O -40
+T a -120
+T 'a -120
+T ^a -120
+T :a -120
+T `a -120
+T oa -120
+T ~a -60
+T : -20
+T , -120
+T e -120
+T 'e -120
+T ^e -120
+T :e -120
+T `e -60
+T - -140
+T hy -140
+T o -120
+T 'o -120
+T ^o -120
+T :o -120
+T `o -120
+T /o -120
+T ~o -60
+T . -120
+T u2026 -120
+T r -120
+T ; -20
+T u -120
+T 'u -120
+T ^u -120
+T :u -120
+T `u -120
+T w -120
+T y -120
+T 'y -120
+T :y -60
+U A -40
+U 'A -40
+U ^A -40
+U :A -40
+U `A -40
+U oA -40
+U ~A -40
+U , -40
+U . -40
+U u2026 -40
+'U A -40
+'U 'A -40
+'U ^A -40
+'U :A -40
+'U `A -40
+'U oA -40
+'U ~A -40
+'U , -40
+'U . -40
+'U u2026 -40
+^U A -40
+^U 'A -40
+^U ^A -40
+^U :A -40
+^U `A -40
+^U oA -40
+^U ~A -40
+^U , -40
+^U . -40
+^U u2026 -40
+:U A -40
+:U 'A -40
+:U ^A -40
+:U :A -40
+:U `A -40
+:U oA -40
+:U ~A -40
+:U , -40
+:U . -40
+:U u2026 -40
+`U A -40
+`U 'A -40
+`U ^A -40
+`U :A -40
+`U `A -40
+`U oA -40
+`U ~A -40
+`U , -40
+`U . -40
+`U u2026 -40
+V A -80
+V 'A -80
+V ^A -80
+V :A -80
+V `A -80
+V oA -80
+V ~A -80
+V G -40
+V O -40
+V 'O -40
+V ^O -40
+V :O -40
+V `O -40
+V /O -40
+V ~O -40
+V a -70
+V 'a -70
+V ^a -70
+V :a -70
+V `a -70
+V oa -70
+V ~a -70
+V : -40
+V , -125
+V e -80
+V 'e -80
+V ^e -80
+V :e -80
+V `e -80
+V - -80
+V hy -80
+V o -80
+V 'o -80
+V ^o -80
+V :o -80
+V `o -80
+V /o -80
+V ~o -80
+V . -125
+V u2026 -125
+V ; -40
+V u -70
+V 'u -70
+V ^u -70
+V :u -70
+V `u -70
+W A -50
+W 'A -50
+W ^A -50
+W :A -50
+W `A -50
+W oA -50
+W ~A -50
+W O -20
+W 'O -20
+W ^O -20
+W :O -20
+W `O -20
+W /O -20
+W ~O -20
+W a -40
+W 'a -40
+W ^a -40
+W :a -40
+W `a -40
+W oa -40
+W ~a -40
+W , -80
+W e -30
+W 'e -30
+W ^e -30
+W :e -30
+W `e -30
+W - -40
+W hy -40
+W o -30
+W 'o -30
+W ^o -30
+W :o -30
+W `o -30
+W /o -30
+W ~o -30
+W . -80
+W u2026 -80
+W u -30
+W 'u -30
+W ^u -30
+W :u -30
+W `u -30
+W y -20
+W 'y -20
+W :y -20
+Y A -110
+Y 'A -110
+Y ^A -110
+Y :A -110
+Y `A -110
+Y oA -110
+Y ~A -110
+Y O -85
+Y 'O -85
+Y ^O -85
+Y :O -85
+Y `O -85
+Y /O -85
+Y ~O -85
+Y a -140
+Y 'a -140
+Y ^a -140
+Y :a -140
+Y `a -140
+Y oa -140
+Y ~a -140
+Y : -60
+Y , -140
+Y e -140
+Y 'e -140
+Y ^e -140
+Y :e -140
+Y `e -140
+Y - -140
+Y hy -140
+Y i -20
+Y 'i -20
+Y o -140
+Y 'o -140
+Y ^o -140
+Y :o -140
+Y `o -140
+Y /o -140
+Y ~o -140
+Y . -140
+Y u2026 -140
+Y ; -60
+Y u -110
+Y 'u -110
+Y ^u -110
+Y :u -110
+Y `u -110
+'Y A -110
+'Y 'A -110
+'Y ^A -110
+'Y :A -110
+'Y `A -110
+'Y oA -110
+'Y ~A -110
+'Y O -85
+'Y 'O -85
+'Y ^O -85
+'Y :O -85
+'Y `O -85
+'Y /O -85
+'Y ~O -85
+'Y a -140
+'Y 'a -140
+'Y ^a -140
+'Y :a -140
+'Y `a -140
+'Y oa -140
+'Y ~a -70
+'Y : -60
+'Y , -140
+'Y e -140
+'Y 'e -140
+'Y ^e -140
+'Y :e -140
+'Y `e -140
+'Y - -140
+'Y hy -140
+'Y i -20
+'Y 'i -20
+'Y o -140
+'Y 'o -140
+'Y ^o -140
+'Y :o -140
+'Y `o -140
+'Y /o -140
+'Y ~o -140
+'Y . -140
+'Y u2026 -140
+'Y ; -60
+'Y u -110
+'Y 'u -110
+'Y ^u -110
+'Y :u -110
+'Y `u -110
+:Y A -110
+:Y 'A -110
+:Y ^A -110
+:Y :A -110
+:Y `A -110
+:Y oA -110
+:Y ~A -110
+:Y O -85
+:Y 'O -85
+:Y ^O -85
+:Y :O -85
+:Y `O -85
+:Y /O -85
+:Y ~O -85
+:Y a -140
+:Y 'a -140
+:Y ^a -140
+:Y :a -140
+:Y `a -140
+:Y oa -140
+:Y ~a -70
+:Y : -60
+:Y , -140
+:Y e -140
+:Y 'e -140
+:Y ^e -140
+:Y :e -140
+:Y `e -140
+:Y - -140
+:Y hy -140
+:Y i -20
+:Y 'i -20
+:Y o -140
+:Y 'o -140
+:Y ^o -140
+:Y :o -140
+:Y `o -140
+:Y /o -140
+:Y ~o -140
+:Y . -140
+:Y u2026 -140
+:Y ; -60
+:Y u -110
+:Y 'u -110
+:Y ^u -110
+:Y :u -110
+:Y `u -110
+a v -20
+a w -20
+a y -30
+a 'y -30
+a :y -30
+'a v -20
+'a w -20
+'a y -30
+'a 'y -30
+'a :y -30
+^a v -20
+^a w -20
+^a y -30
+^a 'y -30
+^a :y -30
+:a v -20
+:a w -20
+:a y -30
+:a 'y -30
+:a :y -30
+`a v -20
+`a w -20
+`a y -30
+`a 'y -30
+`a :y -30
+oa v -20
+oa w -20
+oa y -30
+oa 'y -30
+oa :y -30
+~a v -20
+~a w -20
+~a y -30
+~a 'y -30
+~a :y -30
+b b -10
+b , -40
+b l -20
+b /l -20
+b . -40
+b u2026 -40
+b u -20
+b 'u -20
+b ^u -20
+b :u -20
+b `u -20
+b v -20
+b y -20
+b 'y -20
+b :y -20
+c , -15
+c k -20
+,c , -15
+,c k -20
+: u0020 -50
+, rq -100
+, ' -100
+, cq -100
+e , -15
+e . -15
+e u2026 -15
+e v -30
+e w -20
+e x -30
+e y -20
+e 'y -20
+e :y -20
+'e , -15
+'e . -15
+'e u2026 -15
+'e v -30
+'e w -20
+'e x -30
+'e y -20
+'e 'y -20
+'e :y -20
+^e , -15
+^e . -15
+^e u2026 -15
+^e v -30
+^e w -20
+^e x -30
+^e y -20
+^e 'y -20
+^e :y -20
+:e , -15
+:e . -15
+:e u2026 -15
+:e v -30
+:e w -20
+:e x -30
+:e y -20
+:e 'y -20
+:e :y -20
+`e , -15
+`e . -15
+`e u2026 -15
+`e v -30
+`e w -20
+`e x -30
+`e y -20
+`e 'y -20
+`e :y -20
+f a -30
+f 'a -30
+f ^a -30
+f :a -30
+f `a -30
+f oa -30
+f ~a -30
+f , -30
+f .i -28
+f e -30
+f 'e -30
+f ^e -30
+f :e -30
+f `e -30
+f o -30
+f 'o -30
+f ^o -30
+f :o -30
+f `o -30
+f /o -30
+f ~o -30
+f . -30
+f u2026 -30
+f rq 60
+f ' 50
+f cq 50
+g r -10
+h y -30
+h 'y -30
+h :y -30
+k e -20
+k 'e -20
+k ^e -20
+k :e -20
+k `e -20
+k o -20
+k 'o -20
+k ^o -20
+k :o -20
+k `o -20
+k /o -20
+k ~o -20
+m u -10
+m 'u -10
+m ^u -10
+m :u -10
+m `u -10
+m y -15
+m 'y -15
+m :y -15
+n u -10
+n 'u -10
+n ^u -10
+n :u -10
+n `u -10
+n v -20
+n y -15
+n 'y -15
+n :y -15
+~n u -10
+~n 'u -10
+~n ^u -10
+~n :u -10
+~n `u -10
+~n v -20
+~n y -15
+~n 'y -15
+~n :y -15
+o , -40
+o . -40
+o u2026 -40
+o v -15
+o w -15
+o x -30
+o y -30
+o 'y -30
+o :y -30
+'o , -40
+'o . -40
+'o u2026 -40
+'o v -15
+'o w -15
+'o x -30
+'o y -30
+'o 'y -30
+'o :y -30
+^o , -40
+^o . -40
+^o u2026 -40
+^o v -15
+^o w -15
+^o x -30
+^o y -30
+^o 'y -30
+^o :y -30
+:o , -40
+:o . -40
+:o u2026 -40
+:o v -15
+:o w -15
+:o x -30
+:o y -30
+:o 'y -30
+:o :y -30
+`o , -40
+`o . -40
+`o u2026 -40
+`o v -15
+`o w -15
+`o x -30
+`o y -30
+`o 'y -30
+`o :y -30
+/o a -55
+/o 'a -55
+/o ^a -55
+/o :a -55
+/o `a -55
+/o oa -55
+/o ~a -55
+/o b -55
+/o c -55
+/o ,c -55
+/o , -95
+/o d -55
+/o e -55
+/o 'e -55
+/o ^e -55
+/o :e -55
+/o `e -55
+/o f -55
+/o g -55
+/o h -55
+/o i -55
+/o 'i -55
+/o ^i -55
+/o :i -55
+/o `i -55
+/o j -55
+/o k -55
+/o l -55
+/o /l -55
+/o m -55
+/o n -55
+/o ~n -55
+/o o -55
+/o 'o -55
+/o ^o -55
+/o :o -55
+/o `o -55
+/o /o -55
+/o ~o -55
+/o p -55
+/o . -95
+/o u2026 -95
+/o q -55
+/o r -55
+/o s -55
+/o vs -55
+/o t -55
+/o u -55
+/o 'u -55
+/o ^u -55
+/o :u -55
+/o `u -55
+/o v -70
+/o w -70
+/o x -85
+/o y -70
+/o 'y -70
+/o :y -70
+/o z -55
+/o vz -55
+~o , -40
+~o . -40
+~o u2026 -40
+~o v -15
+~o w -15
+~o x -30
+~o y -30
+~o 'y -30
+~o :y -30
+p , -35
+p . -35
+p u2026 -35
+p y -30
+p 'y -30
+p :y -30
+. rq -100
+u2026 rq -100
+. ' -100
+u2026 ' -100
+. cq -100
+u2026 cq -100
+. u0020 -60
+u2026 u0020 -60
+rq u0020 -40
+` ` -57
+` oq -57
+oq ` -57
+oq oq -57
+' d -50
+cq d -50
+' ' -57
+' cq -57
+cq ' -57
+cq cq -57
+' r -50
+cq r -50
+' s -50
+cq s -50
+' vs -50
+cq vs -50
+' u0020 -70
+cq u0020 -70
+r a -10
+r 'a -10
+r ^a -10
+r :a -10
+r `a -10
+r oa -10
+r ~a -10
+r : 30
+r , -50
+r i 15
+r 'i 15
+r ^i 15
+r :i 15
+r `i 15
+r k 15
+r l 15
+r /l 15
+r m 25
+r n 25
+r ~n 25
+r p 30
+r . -50
+r u2026 -50
+r ; 30
+r t 40
+r u 15
+r 'u 15
+r ^u 15
+r :u 15
+r `u 15
+r v 30
+r y 30
+r 'y 30
+r :y 30
+s , -15
+s . -15
+s u2026 -15
+s w -30
+vs , -15
+vs . -15
+vs u2026 -15
+vs w -30
+; u0020 -50
+u0020 T -50
+u0020 V -50
+u0020 W -40
+u0020 Y -90
+u0020 'Y -90
+u0020 :Y -90
+u0020 lq -30
+u0020 ` -60
+u0020 oq -60
+v a -25
+v 'a -25
+v ^a -25
+v :a -25
+v `a -25
+v oa -25
+v ~a -25
+v , -80
+v e -25
+v 'e -25
+v ^e -25
+v :e -25
+v `e -25
+v o -25
+v 'o -25
+v ^o -25
+v :o -25
+v `o -25
+v /o -25
+v ~o -25
+v . -80
+v u2026 -80
+w a -15
+w 'a -15
+w ^a -15
+w :a -15
+w `a -15
+w oa -15
+w ~a -15
+w , -60
+w e -10
+w 'e -10
+w ^e -10
+w :e -10
+w `e -10
+w o -10
+w 'o -10
+w ^o -10
+w :o -10
+w `o -10
+w /o -10
+w ~o -10
+w . -60
+w u2026 -60
+x e -30
+x 'e -30
+x ^e -30
+x :e -30
+x `e -30
+y a -20
+y 'a -20
+y ^a -20
+y :a -20
+y `a -20
+y oa -20
+y ~a -20
+y , -100
+y e -20
+y 'e -20
+y ^e -20
+y :e -20
+y `e -20
+y o -20
+y 'o -20
+y ^o -20
+y :o -20
+y `o -20
+y /o -20
+y ~o -20
+y . -100
+y u2026 -100
+'y a -20
+'y 'a -20
+'y ^a -20
+'y :a -20
+'y `a -20
+'y oa -20
+'y ~a -20
+'y , -100
+'y e -20
+'y 'e -20
+'y ^e -20
+'y :e -20
+'y `e -20
+'y o -20
+'y 'o -20
+'y ^o -20
+'y :o -20
+'y `o -20
+'y /o -20
+'y ~o -20
+'y . -100
+'y u2026 -100
+:y a -20
+:y 'a -20
+:y ^a -20
+:y :a -20
+:y `a -20
+:y oa -20
+:y ~a -20
+:y , -100
+:y e -20
+:y 'e -20
+:y ^e -20
+:y :e -20
+:y `e -20
+:y o -20
+:y 'o -20
+:y ^o -20
+:y :o -20
+:y `o -20
+:y /o -20
+:y ~o -20
+:y . -100
+:y u2026 -100
+z e -15
+z 'e -15
+z ^e -15
+z :e -15
+z `e -15
+z o -15
+z 'o -15
+z ^o -15
+z :o -15
+z `o -15
+z /o -15
+z ~o -15
+vz e -15
+vz 'e -15
+vz ^e -15
+vz :e -15
+vz `e -15
+vz o -15
+vz 'o -15
+vz ^o -15
+vz :o -15
+vz `o -15
+vz /o -15
+vz ~o -15
+
+charset
+ha 385,688,0,108,16,89 2 0 asciicircum
+ti 479,326,0,47,-41,47 0 1 asciitilde
+vS 547,929,19,88,-23,88 2 2 Scaron
+vZ 501,929,0,157,32,89 2 3 Zcaron
+vs 410,734,15,93,-1,89 2 4 scaron
+vz 410,734,0,109,25,89 2 5 zcaron
+:Y 547,901,0,164,-86,89 2 6 Ydieresis
+tm 820,718,0,96,-102,89 2 7 trademark
+aq 157,718,0,127,-79,89 2 8 quotesingle
+Eu 456,703,19,148,-9,89 2 9 Euro
+space 228 0 32 space
+! 228,718,0,101,-23,89 2 33 exclam
+" 291,718,0,118,-88,89 2 34 quotedbl
+dq "
+# 456,688,0,112,-9,89 2 35 numbersign
+sh "
+$ 456,775,115,101,-6,89 2 36 dollar
+Do "
+% 729,703,19,50,-70,50 2 37 percent
+& 547,718,15,34,-13,34 2 38 ampersand
+' 182,718,0,122,-74,89 2 39 quoteright
+cq "
+( 273,733,207,150,-38,89 3 40 parenleft
+) 273,733,207,54,58,54 3 41 parenright
+* 319,718,0,121,-84,89 2 42 asterisk
++ 479,505,0,69,-19,69 0 43 plus
+, 228,106,147,0,5 0 44 comma
+- 273,322,0,71,-26,71 0 45 hyphen
+hy "
+. 228,106,0,0,-21 0 46 period
+/ 228,737,19,193,68,89 2 47 slash
+sl "
+0 456,703,19,93,-26,89 2 48 zero
+1 456,703,0,11,-119,11 2 49 one
+2 456,703,0,101,29,89 2 50 two
+3 456,703,19,94,-11,89 2 51 three
+4 456,703,0,66,0,66 2 52 four
+5 456,688,19,104,-5,89 2 53 five
+6 456,703,19,99,-24,89 2 54 six
+7 456,688,0,143,-62,89 2 55 seven
+8 456,703,19,92,-10,89 2 56 eight
+9 456,703,19,94,-17,89 2 57 nine
+: 228,516,0,69,-21,69 0 58 colon
+; 228,516,147,69,5,69 0 59 semicolon
+< 479,495,0,97,-27,89 0 60 less
+= 479,390,0,86,-2,86 0 61 equal
+> 479,495,0,61,9,61 0 62 greater
+? 456,727,0,95,-81,89 2 63 question
+@ 832,737,19,10,-126,10 2 64 at
+at "
+A 547,718,0,40,39,40 2 65 A
+B 547,718,0,87,-10,87 2 66 B
+C 592,737,19,100,-38,89 2 67 C
+D 592,718,0,85,-16,85 2 68 D
+E 547,718,0,128,-20,89 2 69 E
+F 501,718,0,153,-20,89 2 70 F
+G 638,737,19,68,-40,68 2 71 G
+H 592,718,0,113,-13,89 2 72 H
+I 228,718,0,102,-24,89 2 73 I
+J 410,718,19,117,12,89 2 74 J
+K 547,718,0,166,-12,89 2 75 K
+L 456,718,0,50,-12,50 2 76 L
+M 683,718,0,117,-9,89 2 77 M
+N 592,718,0,113,-12,89 2 78 N
+O 638,737,19,90,-36,89 2 79 O
+P 547,718,0,108,-20,89 2 80 P
+Q 638,737,56,90,-36,89 2 81 Q
+R 592,718,0,93,-22,89 2 82 R
+S 547,737,19,88,-23,88 2 83 S
+T 501,718,0,164,-71,89 2 84 T
+U 592,718,19,112,-50,89 2 85 U
+V 547,718,0,159,-91,89 2 86 V
+W 774,718,0,163,-88,89 2 87 W
+X 547,718,0,151,35,89 2 88 X
+Y 547,718,0,164,-86,89 2 89 Y
+Z 501,718,0,157,32,89 2 90 Z
+[ 228,722,196,153,33,89 2 91 bracketleft
+lB "
+\ 228,737,19,61,-64,61 2 92 backslash
+rs "
+] 228,722,196,125,62,89 2 93 bracketright
+rB "
+^ 273,734,0,137,-70,89 2 94 circumflex
+a^ "
+_ 456,0,125,37,72,37 0 95 underscore
+` 182,725,0,133,-85,89 2 96 quoteleft
+oq "
+a 456,538,15,53,0,53 0 97 a
+b 456,718,15,74,3,74 2 98 b
+c 410,538,15,94,-11,89 0 99 c
+d 456,718,15,129,-18,89 2 100 d
+e 456,538,15,69,-19,69 0 101 e
+f 228,728,0,164,-20,89 2 102 f
+g 456,538,220,95,16,89 1 103 g
+h 456,718,0,64,-3,64 2 104 h
+i 182,718,0,121,-4,89 2 105 i
+j 182,718,210,121,100,89 3 106 j
+k 410,718,0,133,-4,89 2 107 k
+l 182,718,0,121,-4,89 2 108 l
+m 683,538,0,66,-3,66 0 109 m
+n 456,538,0,64,-3,64 0 110 n
+o 456,538,14,74,-17,74 0 111 o
+p 456,538,207,74,39,74 1 112 p
+q 456,538,207,91,-18,89 1 113 q
+r 273,538,0,143,-13,89 0 114 r
+s 410,538,15,75,-1,75 0 115 s
+t 228,669,7,124,-33,89 2 116 t
+u 456,523,15,87,-27,87 0 117 u
+v 410,523,0,135,-47,89 0 118 v
+w 592,523,0,131,-52,89 0 119 w
+x 410,523,0,128,41,89 0 120 x
+y 410,523,214,133,38,89 1 121 y
+z 410,523,0,109,25,89 0 122 z
+{ 274,722,196,142,-25,89 2 123 braceleft
+lC "
+| 213,775,225,110,13,89 3 124 bar
+ba "
+} 274,722,196,67,50,67 2 125 braceright
+rC "
+~ 273,722,0,180,-52,89 2 126 tilde
+a~ "
+bq 182,106,149,16,33,16 0 128 quotesinglbase
+Fo 456,446,0,49,-69,49 0 129 guillemotleft
+Fc 456,446,0,27,-48,27 0 130 guillemotright
+bu 287,517,0,102,-24,89 0 131 bullet
+Fn 456,737,207,131,94,89 3 132 florin
+f/ 137,703,19,309,190,89 2 133 fraction
+%0 820,703,19,74,-22,74 2 134 perthousand
+dg 456,718,159,104,-60,89 2 135 dagger
+dd 456,718,159,106,8,89 2 136 daggerdbl
+en 456,313,0,105,9,89 0 137 endash
+em 820,313,0,105,9,89 0 138 emdash
+fi 410,728,0,122,-20,89 2 140 fi
+fl 410,728,0,120,-20,89 2 141 fl
+.i 228,523,0,64,-27,64 0 144 dotlessi
+ga 273,734,0,54,-89,54 2 146 grave
+a" 273,734,0,241,-78,89 2 147 hungarumlaut
+a. 273,706,0,74,-154,74 2 148 dotaccent
+ab 273,731,0,168,-87,89 2 149 breve
+ah 273,734,0,161,-95,89 2 150 caron
+ao 273,756,0,108,-125,89 2 151 ring
+ho 273,0,225,0,15 1 152 ogonek
+lq 273,725,0,156,-63,89 2 153 quotedblleft
+rq 273,718,0,145,-52,89 2 154 quotedblright
+oe 774,538,15,67,-17,67 0 155 oe
+/l 182,718,0,153,17,89 2 156 lslash
+Bq 273,106,149,38,55,38 0 157 quotedblbase
+OE 820,737,19,145,-30,89 2 158 OE
+/L 456,718,0,50,17,50 2 159 Lslash
+r! 273,523,195,45,-12,45 0 161 exclamdown
+ct 456,623,115,73,-27,73 0 162 cent
+Po 456,718,16,114,10,89 2 163 sterling
+Cs 456,603,0,124,2,89 0 164 currency
+Ye 456,688,0,168,-16,89 2 165 yen
+bb 213,700,150,96,0,89 2 166 brokenbar
+sc 456,737,191,73,-12,73 2 167 section
+ad 273,706,0,141,-88,89 2 168 dieresis
+co 604,737,19,133,6,89 2 169 copyright
+Of 303,737,0,116,-54,89 2 170 ordfeminine
+fo 273,446,0,56,-62,56 0 171 guilsinglleft
+tno 479,390,0,86,-37,86 0 172 logicalnot
+\- 479,289,0,69,-19,69 0 173 minus
+rg 604,737,19,133,6,89 2 174 registered
+a- 273,684,0,162,-67,89 2 175 macron
+de 328,703,0,106,-88,89 2 176 degree
+t+- 479,506,0,79,19,79 0 177 plusminus
+S2 273,703,0,145,-2,89 2 178 twosuperior
+S3 273,703,0,135,-23,89 2 179 threesuperior
+aa 273,734,0,167,-153,89 2 180 acute
+*m 474,523,207,69,31,69 1 181 mu
+mc "
+ps 440,718,173,143,-53,89 2 182 paragraph
+pc 228,315,0,33,-55,33 0 183 periodcentered
+ac 273,0,225,0,49 1 184 cedilla
+S1 273,703,0,82,-85,82 2 185 onesuperior
+Om 299,737,0,135,-65,89 2 186 ordmasculine
+fc 273,446,0,35,-40,35 0 187 guilsinglright
+14 684,703,19,24,-72,24 2 188 onequarter
+12 684,703,19,54,-43,54 2 189 onehalf
+34 684,703,19,73,-56,73 2 190 threequarters
+r? 501,525,201,0,-19 0 191 questiondown
+`A 547,929,0,40,39,40 2 192 Agrave
+'A 547,929,0,64,39,64 2 193 Aacute
+^A 547,929,0,40,39,40 2 194 Acircumflex
+~A 547,917,0,77,39,77 2 195 Atilde
+:A 547,901,0,40,39,40 2 196 Adieresis
+oA 547,931,0,40,39,40 2 197 Aring
+AE 820,718,0,130,44,89 2 198 AE
+,C 592,737,225,100,-38,89 3 199 Ccedilla
+`E 547,929,0,128,-20,89 2 200 Egrave
+'E 547,929,0,128,-20,89 2 201 Eacute
+^E 547,929,0,128,-20,89 2 202 Ecircumflex
+:E 547,901,0,128,-20,89 2 203 Edieresis
+`I 228,929,0,111,-24,89 2 204 Igrave
+'I 228,929,0,224,-24,89 2 205 Iacute
+^I 228,929,0,194,-24,89 2 206 Icircumflex
+:I 228,901,0,198,-24,89 2 207 Idieresis
+-D 592,718,0,85,-6,85 2 208 Eth
+~N 592,917,0,113,-12,89 2 209 Ntilde
+`O 638,929,19,90,-36,89 2 210 Ograve
+'O 638,929,19,90,-36,89 2 211 Oacute
+^O 638,929,19,90,-36,89 2 212 Ocircumflex
+~O 638,917,19,90,-36,89 2 213 Otilde
+:O 638,901,19,90,-36,89 2 214 Odieresis
+tmu 479,506,0,98,10,89 0 215 multiply
+/O 638,737,19,143,15,89 2 216 Oslash
+`U 592,929,19,112,-50,89 2 217 Ugrave
+'U 592,929,19,112,-50,89 2 218 Uacute
+^U 592,929,19,112,-50,89 2 219 Ucircumflex
+:U 592,901,19,112,-50,89 2 220 Udieresis
+'Y 547,929,0,164,-86,89 2 221 Yacute
+TP 547,718,0,87,-20,87 2 222 Thorn
+ss 501,728,15,89,-4,89 2 223 germandbls
+`a 456,734,15,53,0,53 2 224 agrave
+'a 456,734,15,76,0,76 2 225 aacute
+^a 456,734,15,53,0,53 2 226 acircumflex
+~a 456,722,15,80,0,80 2 227 atilde
+:a 456,706,15,53,0,53 2 228 adieresis
+oa 456,756,15,53,0,53 2 229 aring
+ae 729,538,15,67,0,67 0 230 ae
+,c 410,538,225,94,-10,89 1 231 ccedilla
+`e 456,734,15,69,-19,69 2 232 egrave
+'e 456,734,15,76,-19,76 2 233 eacute
+^e 456,734,15,69,-19,69 2 234 ecircumflex
+:e 456,706,15,69,-19,69 2 235 edieresis
+`i 228,734,0,77,-27,77 2 236 igrave
+'i 228,734,0,190,-27,89 2 237 iacute
+^i 228,734,0,160,-27,89 2 238 icircumflex
+:i 228,706,0,164,-27,89 2 239 idieresis
+Sd 456,737,15,101,-16,89 2 240 eth
+~n 456,722,0,80,-3,80 2 241 ntilde
+`o 456,734,14,74,-17,74 2 242 ograve
+'o 456,734,14,76,-17,76 2 243 oacute
+^o 456,734,14,74,-17,74 2 244 ocircumflex
+~o 456,722,14,89,-17,89 2 245 otilde
+:o 456,706,14,74,-17,74 2 246 odieresis
+tdi 479,524,19,69,-19,69 0 247 divide
+/o 501,545,22,80,27,80 0 248 oslash
+`u 456,734,15,87,-27,87 2 249 ugrave
+'u 456,734,15,87,-27,87 2 250 uacute
+^u 456,734,15,87,-27,87 2 251 ucircumflex
+:u 456,706,15,87,-27,87 2 252 udieresis
+'y 410,734,214,133,38,89 3 253 yacute
+Tp 456,718,207,74,39,74 3 254 thorn
+:y 410,706,214,133,38,89 3 255 ydieresis
+u2026 820,106,0,0,-44 0 256 ellipsis
diff --git a/font/devps/HNR b/font/devps/HNR
new file mode 100644
index 0000000..92a1a05
--- /dev/null
+++ b/font/devps/HNR
@@ -0,0 +1,1644 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Helvetica Narrow
+# Version 003.001
+# FamilyName Helvetica
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:07:10 1999
+# Comment UniqueID 44711
+# Comment VMusage 11195 50629
+
+name HNR
+internalname Helvetica-Narrow
+spacewidth 228
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A C -30
+A ,C -30
+A G -30
+A O -30
+A 'O -30
+A ^O -30
+A :O -30
+A `O -30
+A /O -30
+A ~O -30
+A Q -30
+A T -120
+A U -50
+A 'U -50
+A ^U -50
+A :U -50
+A `U -50
+A V -70
+A W -50
+A Y -100
+A 'Y -100
+A :Y -100
+A u -30
+A 'u -30
+A ^u -30
+A :u -30
+A `u -30
+A v -40
+A w -40
+A y -40
+A 'y -40
+A :y -40
+'A C -30
+'A ,C -30
+'A G -30
+'A O -30
+'A 'O -30
+'A ^O -30
+'A :O -30
+'A `O -30
+'A /O -30
+'A ~O -30
+'A Q -30
+'A T -120
+'A U -50
+'A 'U -50
+'A ^U -50
+'A :U -50
+'A `U -50
+'A V -70
+'A W -50
+'A Y -100
+'A 'Y -100
+'A :Y -100
+'A u -30
+'A 'u -30
+'A ^u -30
+'A :u -30
+'A `u -30
+'A v -40
+'A w -40
+'A y -40
+'A 'y -40
+'A :y -40
+^A C -30
+^A ,C -30
+^A G -30
+^A O -30
+^A 'O -30
+^A ^O -30
+^A :O -30
+^A `O -30
+^A /O -30
+^A ~O -30
+^A Q -30
+^A T -120
+^A U -50
+^A 'U -50
+^A ^U -50
+^A :U -50
+^A `U -50
+^A V -70
+^A W -50
+^A Y -100
+^A 'Y -100
+^A :Y -100
+^A u -30
+^A 'u -30
+^A ^u -30
+^A :u -30
+^A `u -30
+^A v -40
+^A w -40
+^A y -40
+^A 'y -40
+^A :y -40
+:A C -30
+:A ,C -30
+:A G -30
+:A O -30
+:A 'O -30
+:A ^O -30
+:A :O -30
+:A `O -30
+:A /O -30
+:A ~O -30
+:A Q -30
+:A T -120
+:A U -50
+:A 'U -50
+:A ^U -50
+:A :U -50
+:A `U -50
+:A V -70
+:A W -50
+:A Y -100
+:A 'Y -100
+:A :Y -100
+:A u -30
+:A 'u -30
+:A ^u -30
+:A :u -30
+:A `u -30
+:A v -40
+:A w -40
+:A y -40
+:A 'y -40
+:A :y -40
+`A C -30
+`A ,C -30
+`A G -30
+`A O -30
+`A 'O -30
+`A ^O -30
+`A :O -30
+`A `O -30
+`A /O -30
+`A ~O -30
+`A Q -30
+`A T -120
+`A U -50
+`A 'U -50
+`A ^U -50
+`A :U -50
+`A `U -50
+`A V -70
+`A W -50
+`A Y -100
+`A 'Y -100
+`A :Y -100
+`A u -30
+`A 'u -30
+`A ^u -30
+`A :u -30
+`A `u -30
+`A v -40
+`A w -40
+`A y -40
+`A 'y -40
+`A :y -40
+oA C -30
+oA ,C -30
+oA G -30
+oA O -30
+oA 'O -30
+oA ^O -30
+oA :O -30
+oA `O -30
+oA /O -30
+oA ~O -30
+oA Q -30
+oA T -120
+oA U -50
+oA 'U -50
+oA ^U -50
+oA :U -50
+oA `U -50
+oA V -70
+oA W -50
+oA Y -100
+oA 'Y -100
+oA :Y -100
+oA u -30
+oA 'u -30
+oA ^u -30
+oA :u -30
+oA `u -30
+oA v -40
+oA w -40
+oA y -40
+oA 'y -40
+oA :y -40
+~A C -30
+~A ,C -30
+~A G -30
+~A O -30
+~A 'O -30
+~A ^O -30
+~A :O -30
+~A `O -30
+~A /O -30
+~A ~O -30
+~A Q -30
+~A T -120
+~A U -50
+~A 'U -50
+~A ^U -50
+~A :U -50
+~A `U -50
+~A V -70
+~A W -50
+~A Y -100
+~A 'Y -100
+~A :Y -100
+~A u -30
+~A 'u -30
+~A ^u -30
+~A :u -30
+~A `u -30
+~A v -40
+~A w -40
+~A y -40
+~A 'y -40
+~A :y -40
+B U -10
+B 'U -10
+B ^U -10
+B :U -10
+B `U -10
+B , -20
+B . -20
+B u2026 -20
+C , -30
+C . -30
+C u2026 -30
+,C , -30
+,C . -30
+,C u2026 -30
+D A -40
+D 'A -40
+D ^A -40
+D :A -40
+D `A -40
+D oA -40
+D ~A -40
+D V -70
+D W -40
+D Y -90
+D 'Y -90
+D :Y -90
+D , -70
+D . -70
+D u2026 -70
+F A -80
+F 'A -80
+F ^A -80
+F :A -80
+F `A -80
+F oA -80
+F ~A -80
+F a -50
+F 'a -50
+F ^a -50
+F :a -50
+F `a -50
+F oa -50
+F ~a -50
+F , -150
+F e -30
+F 'e -30
+F ^e -30
+F :e -30
+F `e -30
+F o -30
+F 'o -30
+F ^o -30
+F :o -30
+F `o -30
+F /o -30
+F ~o -30
+F . -150
+F u2026 -150
+F r -45
+J A -20
+J 'A -20
+J ^A -20
+J :A -20
+J `A -20
+J oA -20
+J ~A -20
+J a -20
+J 'a -20
+J ^a -20
+J :a -20
+J `a -20
+J oa -20
+J ~a -20
+J , -30
+J . -30
+J u2026 -30
+J u -20
+J 'u -20
+J ^u -20
+J :u -20
+J `u -20
+K O -50
+K 'O -50
+K ^O -50
+K :O -50
+K `O -50
+K /O -50
+K ~O -50
+K e -40
+K 'e -40
+K ^e -40
+K :e -40
+K `e -40
+K o -40
+K 'o -40
+K ^o -40
+K :o -40
+K `o -40
+K /o -40
+K ~o -40
+K u -30
+K 'u -30
+K ^u -30
+K :u -30
+K `u -30
+K y -50
+K 'y -50
+K :y -50
+L T -110
+L V -110
+L W -70
+L Y -140
+L 'Y -140
+L :Y -140
+L rq -140
+L ' -160
+L cq -160
+L y -30
+L 'y -30
+L :y -30
+/L T -110
+/L V -110
+/L W -70
+/L Y -140
+/L 'Y -140
+/L :Y -140
+/L rq -140
+/L ' -160
+/L cq -160
+/L y -30
+/L 'y -30
+/L :y -30
+O A -20
+O 'A -20
+O ^A -20
+O :A -20
+O `A -20
+O oA -20
+O ~A -20
+O T -40
+O V -50
+O W -30
+O X -60
+O Y -70
+O 'Y -70
+O :Y -70
+O , -40
+O . -40
+O u2026 -40
+'O A -20
+'O 'A -20
+'O ^A -20
+'O :A -20
+'O `A -20
+'O oA -20
+'O ~A -20
+'O T -40
+'O V -50
+'O W -30
+'O X -60
+'O Y -70
+'O 'Y -70
+'O :Y -70
+'O , -40
+'O . -40
+'O u2026 -40
+^O A -20
+^O 'A -20
+^O ^A -20
+^O :A -20
+^O `A -20
+^O oA -20
+^O ~A -20
+^O T -40
+^O V -50
+^O W -30
+^O X -60
+^O Y -70
+^O 'Y -70
+^O :Y -70
+^O , -40
+^O . -40
+^O u2026 -40
+:O A -20
+:O 'A -20
+:O ^A -20
+:O :A -20
+:O `A -20
+:O oA -20
+:O ~A -20
+:O T -40
+:O V -50
+:O W -30
+:O X -60
+:O Y -70
+:O 'Y -70
+:O :Y -70
+:O , -40
+:O . -40
+:O u2026 -40
+`O A -20
+`O 'A -20
+`O ^A -20
+`O :A -20
+`O `A -20
+`O oA -20
+`O ~A -20
+`O T -40
+`O V -50
+`O W -30
+`O X -60
+`O Y -70
+`O 'Y -70
+`O :Y -70
+`O , -40
+`O . -40
+`O u2026 -40
+/O A -20
+/O 'A -20
+/O ^A -20
+/O :A -20
+/O `A -20
+/O oA -20
+/O ~A -20
+/O T -40
+/O V -50
+/O W -30
+/O X -60
+/O Y -70
+/O 'Y -70
+/O :Y -70
+/O , -40
+/O . -40
+/O u2026 -40
+~O A -20
+~O 'A -20
+~O ^A -20
+~O :A -20
+~O `A -20
+~O oA -20
+~O ~A -20
+~O T -40
+~O V -50
+~O W -30
+~O X -60
+~O Y -70
+~O 'Y -70
+~O :Y -70
+~O , -40
+~O . -40
+~O u2026 -40
+P A -120
+P 'A -120
+P ^A -120
+P :A -120
+P `A -120
+P oA -120
+P ~A -120
+P a -40
+P 'a -40
+P ^a -40
+P :a -40
+P `a -40
+P oa -40
+P ~a -40
+P , -180
+P e -50
+P 'e -50
+P ^e -50
+P :e -50
+P `e -50
+P o -50
+P 'o -50
+P ^o -50
+P :o -50
+P `o -50
+P /o -50
+P ~o -50
+P . -180
+P u2026 -180
+Q U -10
+Q 'U -10
+Q ^U -10
+Q :U -10
+Q `U -10
+R O -20
+R 'O -20
+R ^O -20
+R :O -20
+R `O -20
+R /O -20
+R ~O -20
+R T -30
+R U -40
+R 'U -40
+R ^U -40
+R :U -40
+R `U -40
+R V -50
+R W -30
+R Y -50
+R 'Y -50
+R :Y -50
+S , -20
+S . -20
+S u2026 -20
+vS , -20
+vS . -20
+vS u2026 -20
+T A -120
+T 'A -120
+T ^A -120
+T :A -120
+T `A -120
+T oA -120
+T ~A -120
+T O -40
+T 'O -40
+T ^O -40
+T :O -40
+T `O -40
+T /O -40
+T ~O -40
+T a -120
+T 'a -120
+T ^a -120
+T :a -120
+T `a -120
+T oa -120
+T ~a -60
+T : -20
+T , -120
+T e -120
+T 'e -120
+T ^e -120
+T :e -120
+T `e -60
+T - -140
+T hy -140
+T o -120
+T 'o -120
+T ^o -120
+T :o -120
+T `o -120
+T /o -120
+T ~o -60
+T . -120
+T u2026 -120
+T r -120
+T ; -20
+T u -120
+T 'u -120
+T ^u -120
+T :u -120
+T `u -120
+T w -120
+T y -120
+T 'y -120
+T :y -60
+U A -40
+U 'A -40
+U ^A -40
+U :A -40
+U `A -40
+U oA -40
+U ~A -40
+U , -40
+U . -40
+U u2026 -40
+'U A -40
+'U 'A -40
+'U ^A -40
+'U :A -40
+'U `A -40
+'U oA -40
+'U ~A -40
+'U , -40
+'U . -40
+'U u2026 -40
+^U A -40
+^U 'A -40
+^U ^A -40
+^U :A -40
+^U `A -40
+^U oA -40
+^U ~A -40
+^U , -40
+^U . -40
+^U u2026 -40
+:U A -40
+:U 'A -40
+:U ^A -40
+:U :A -40
+:U `A -40
+:U oA -40
+:U ~A -40
+:U , -40
+:U . -40
+:U u2026 -40
+`U A -40
+`U 'A -40
+`U ^A -40
+`U :A -40
+`U `A -40
+`U oA -40
+`U ~A -40
+`U , -40
+`U . -40
+`U u2026 -40
+V A -80
+V 'A -80
+V ^A -80
+V :A -80
+V `A -80
+V oA -80
+V ~A -80
+V G -40
+V O -40
+V 'O -40
+V ^O -40
+V :O -40
+V `O -40
+V /O -40
+V ~O -40
+V a -70
+V 'a -70
+V ^a -70
+V :a -70
+V `a -70
+V oa -70
+V ~a -70
+V : -40
+V , -125
+V e -80
+V 'e -80
+V ^e -80
+V :e -80
+V `e -80
+V - -80
+V hy -80
+V o -80
+V 'o -80
+V ^o -80
+V :o -80
+V `o -80
+V /o -80
+V ~o -80
+V . -125
+V u2026 -125
+V ; -40
+V u -70
+V 'u -70
+V ^u -70
+V :u -70
+V `u -70
+W A -50
+W 'A -50
+W ^A -50
+W :A -50
+W `A -50
+W oA -50
+W ~A -50
+W O -20
+W 'O -20
+W ^O -20
+W :O -20
+W `O -20
+W /O -20
+W ~O -20
+W a -40
+W 'a -40
+W ^a -40
+W :a -40
+W `a -40
+W oa -40
+W ~a -40
+W , -80
+W e -30
+W 'e -30
+W ^e -30
+W :e -30
+W `e -30
+W - -40
+W hy -40
+W o -30
+W 'o -30
+W ^o -30
+W :o -30
+W `o -30
+W /o -30
+W ~o -30
+W . -80
+W u2026 -80
+W u -30
+W 'u -30
+W ^u -30
+W :u -30
+W `u -30
+W y -20
+W 'y -20
+W :y -20
+Y A -110
+Y 'A -110
+Y ^A -110
+Y :A -110
+Y `A -110
+Y oA -110
+Y ~A -110
+Y O -85
+Y 'O -85
+Y ^O -85
+Y :O -85
+Y `O -85
+Y /O -85
+Y ~O -85
+Y a -140
+Y 'a -140
+Y ^a -140
+Y :a -140
+Y `a -140
+Y oa -140
+Y ~a -140
+Y : -60
+Y , -140
+Y e -140
+Y 'e -140
+Y ^e -140
+Y :e -140
+Y `e -140
+Y - -140
+Y hy -140
+Y i -20
+Y 'i -20
+Y o -140
+Y 'o -140
+Y ^o -140
+Y :o -140
+Y `o -140
+Y /o -140
+Y ~o -140
+Y . -140
+Y u2026 -140
+Y ; -60
+Y u -110
+Y 'u -110
+Y ^u -110
+Y :u -110
+Y `u -110
+'Y A -110
+'Y 'A -110
+'Y ^A -110
+'Y :A -110
+'Y `A -110
+'Y oA -110
+'Y ~A -110
+'Y O -85
+'Y 'O -85
+'Y ^O -85
+'Y :O -85
+'Y `O -85
+'Y /O -85
+'Y ~O -85
+'Y a -140
+'Y 'a -140
+'Y ^a -140
+'Y :a -140
+'Y `a -140
+'Y oa -140
+'Y ~a -70
+'Y : -60
+'Y , -140
+'Y e -140
+'Y 'e -140
+'Y ^e -140
+'Y :e -140
+'Y `e -140
+'Y - -140
+'Y hy -140
+'Y i -20
+'Y 'i -20
+'Y o -140
+'Y 'o -140
+'Y ^o -140
+'Y :o -140
+'Y `o -140
+'Y /o -140
+'Y ~o -140
+'Y . -140
+'Y u2026 -140
+'Y ; -60
+'Y u -110
+'Y 'u -110
+'Y ^u -110
+'Y :u -110
+'Y `u -110
+:Y A -110
+:Y 'A -110
+:Y ^A -110
+:Y :A -110
+:Y `A -110
+:Y oA -110
+:Y ~A -110
+:Y O -85
+:Y 'O -85
+:Y ^O -85
+:Y :O -85
+:Y `O -85
+:Y /O -85
+:Y ~O -85
+:Y a -140
+:Y 'a -140
+:Y ^a -140
+:Y :a -140
+:Y `a -140
+:Y oa -140
+:Y ~a -70
+:Y : -60
+:Y , -140
+:Y e -140
+:Y 'e -140
+:Y ^e -140
+:Y :e -140
+:Y `e -140
+:Y - -140
+:Y hy -140
+:Y i -20
+:Y 'i -20
+:Y o -140
+:Y 'o -140
+:Y ^o -140
+:Y :o -140
+:Y `o -140
+:Y /o -140
+:Y ~o -140
+:Y . -140
+:Y u2026 -140
+:Y ; -60
+:Y u -110
+:Y 'u -110
+:Y ^u -110
+:Y :u -110
+:Y `u -110
+a v -20
+a w -20
+a y -30
+a 'y -30
+a :y -30
+'a v -20
+'a w -20
+'a y -30
+'a 'y -30
+'a :y -30
+^a v -20
+^a w -20
+^a y -30
+^a 'y -30
+^a :y -30
+:a v -20
+:a w -20
+:a y -30
+:a 'y -30
+:a :y -30
+`a v -20
+`a w -20
+`a y -30
+`a 'y -30
+`a :y -30
+oa v -20
+oa w -20
+oa y -30
+oa 'y -30
+oa :y -30
+~a v -20
+~a w -20
+~a y -30
+~a 'y -30
+~a :y -30
+b b -10
+b , -40
+b l -20
+b /l -20
+b . -40
+b u2026 -40
+b u -20
+b 'u -20
+b ^u -20
+b :u -20
+b `u -20
+b v -20
+b y -20
+b 'y -20
+b :y -20
+c , -15
+c k -20
+,c , -15
+,c k -20
+: u0020 -50
+, rq -100
+, ' -100
+, cq -100
+e , -15
+e . -15
+e u2026 -15
+e v -30
+e w -20
+e x -30
+e y -20
+e 'y -20
+e :y -20
+'e , -15
+'e . -15
+'e u2026 -15
+'e v -30
+'e w -20
+'e x -30
+'e y -20
+'e 'y -20
+'e :y -20
+^e , -15
+^e . -15
+^e u2026 -15
+^e v -30
+^e w -20
+^e x -30
+^e y -20
+^e 'y -20
+^e :y -20
+:e , -15
+:e . -15
+:e u2026 -15
+:e v -30
+:e w -20
+:e x -30
+:e y -20
+:e 'y -20
+:e :y -20
+`e , -15
+`e . -15
+`e u2026 -15
+`e v -30
+`e w -20
+`e x -30
+`e y -20
+`e 'y -20
+`e :y -20
+f a -30
+f 'a -30
+f ^a -30
+f :a -30
+f `a -30
+f oa -30
+f ~a -30
+f , -30
+f .i -28
+f e -30
+f 'e -30
+f ^e -30
+f :e -30
+f `e -30
+f o -30
+f 'o -30
+f ^o -30
+f :o -30
+f `o -30
+f /o -30
+f ~o -30
+f . -30
+f u2026 -30
+f rq 60
+f ' 50
+f cq 50
+g r -10
+h y -30
+h 'y -30
+h :y -30
+k e -20
+k 'e -20
+k ^e -20
+k :e -20
+k `e -20
+k o -20
+k 'o -20
+k ^o -20
+k :o -20
+k `o -20
+k /o -20
+k ~o -20
+m u -10
+m 'u -10
+m ^u -10
+m :u -10
+m `u -10
+m y -15
+m 'y -15
+m :y -15
+n u -10
+n 'u -10
+n ^u -10
+n :u -10
+n `u -10
+n v -20
+n y -15
+n 'y -15
+n :y -15
+~n u -10
+~n 'u -10
+~n ^u -10
+~n :u -10
+~n `u -10
+~n v -20
+~n y -15
+~n 'y -15
+~n :y -15
+o , -40
+o . -40
+o u2026 -40
+o v -15
+o w -15
+o x -30
+o y -30
+o 'y -30
+o :y -30
+'o , -40
+'o . -40
+'o u2026 -40
+'o v -15
+'o w -15
+'o x -30
+'o y -30
+'o 'y -30
+'o :y -30
+^o , -40
+^o . -40
+^o u2026 -40
+^o v -15
+^o w -15
+^o x -30
+^o y -30
+^o 'y -30
+^o :y -30
+:o , -40
+:o . -40
+:o u2026 -40
+:o v -15
+:o w -15
+:o x -30
+:o y -30
+:o 'y -30
+:o :y -30
+`o , -40
+`o . -40
+`o u2026 -40
+`o v -15
+`o w -15
+`o x -30
+`o y -30
+`o 'y -30
+`o :y -30
+/o a -55
+/o 'a -55
+/o ^a -55
+/o :a -55
+/o `a -55
+/o oa -55
+/o ~a -55
+/o b -55
+/o c -55
+/o ,c -55
+/o , -95
+/o d -55
+/o e -55
+/o 'e -55
+/o ^e -55
+/o :e -55
+/o `e -55
+/o f -55
+/o g -55
+/o h -55
+/o i -55
+/o 'i -55
+/o ^i -55
+/o :i -55
+/o `i -55
+/o j -55
+/o k -55
+/o l -55
+/o /l -55
+/o m -55
+/o n -55
+/o ~n -55
+/o o -55
+/o 'o -55
+/o ^o -55
+/o :o -55
+/o `o -55
+/o /o -55
+/o ~o -55
+/o p -55
+/o . -95
+/o u2026 -95
+/o q -55
+/o r -55
+/o s -55
+/o vs -55
+/o t -55
+/o u -55
+/o 'u -55
+/o ^u -55
+/o :u -55
+/o `u -55
+/o v -70
+/o w -70
+/o x -85
+/o y -70
+/o 'y -70
+/o :y -70
+/o z -55
+/o vz -55
+~o , -40
+~o . -40
+~o u2026 -40
+~o v -15
+~o w -15
+~o x -30
+~o y -30
+~o 'y -30
+~o :y -30
+p , -35
+p . -35
+p u2026 -35
+p y -30
+p 'y -30
+p :y -30
+. rq -100
+u2026 rq -100
+. ' -100
+u2026 ' -100
+. cq -100
+u2026 cq -100
+. u0020 -60
+u2026 u0020 -60
+rq u0020 -40
+` ` -57
+` oq -57
+oq ` -57
+oq oq -57
+' d -50
+cq d -50
+' ' -57
+' cq -57
+cq ' -57
+cq cq -57
+' r -50
+cq r -50
+' s -50
+cq s -50
+' vs -50
+cq vs -50
+' u0020 -70
+cq u0020 -70
+r a -10
+r 'a -10
+r ^a -10
+r :a -10
+r `a -10
+r oa -10
+r ~a -10
+r : 30
+r , -50
+r i 15
+r 'i 15
+r ^i 15
+r :i 15
+r `i 15
+r k 15
+r l 15
+r /l 15
+r m 25
+r n 25
+r ~n 25
+r p 30
+r . -50
+r u2026 -50
+r ; 30
+r t 40
+r u 15
+r 'u 15
+r ^u 15
+r :u 15
+r `u 15
+r v 30
+r y 30
+r 'y 30
+r :y 30
+s , -15
+s . -15
+s u2026 -15
+s w -30
+vs , -15
+vs . -15
+vs u2026 -15
+vs w -30
+; u0020 -50
+u0020 T -50
+u0020 V -50
+u0020 W -40
+u0020 Y -90
+u0020 'Y -90
+u0020 :Y -90
+u0020 lq -30
+u0020 ` -60
+u0020 oq -60
+v a -25
+v 'a -25
+v ^a -25
+v :a -25
+v `a -25
+v oa -25
+v ~a -25
+v , -80
+v e -25
+v 'e -25
+v ^e -25
+v :e -25
+v `e -25
+v o -25
+v 'o -25
+v ^o -25
+v :o -25
+v `o -25
+v /o -25
+v ~o -25
+v . -80
+v u2026 -80
+w a -15
+w 'a -15
+w ^a -15
+w :a -15
+w `a -15
+w oa -15
+w ~a -15
+w , -60
+w e -10
+w 'e -10
+w ^e -10
+w :e -10
+w `e -10
+w o -10
+w 'o -10
+w ^o -10
+w :o -10
+w `o -10
+w /o -10
+w ~o -10
+w . -60
+w u2026 -60
+x e -30
+x 'e -30
+x ^e -30
+x :e -30
+x `e -30
+y a -20
+y 'a -20
+y ^a -20
+y :a -20
+y `a -20
+y oa -20
+y ~a -20
+y , -100
+y e -20
+y 'e -20
+y ^e -20
+y :e -20
+y `e -20
+y o -20
+y 'o -20
+y ^o -20
+y :o -20
+y `o -20
+y /o -20
+y ~o -20
+y . -100
+y u2026 -100
+'y a -20
+'y 'a -20
+'y ^a -20
+'y :a -20
+'y `a -20
+'y oa -20
+'y ~a -20
+'y , -100
+'y e -20
+'y 'e -20
+'y ^e -20
+'y :e -20
+'y `e -20
+'y o -20
+'y 'o -20
+'y ^o -20
+'y :o -20
+'y `o -20
+'y /o -20
+'y ~o -20
+'y . -100
+'y u2026 -100
+:y a -20
+:y 'a -20
+:y ^a -20
+:y :a -20
+:y `a -20
+:y oa -20
+:y ~a -20
+:y , -100
+:y e -20
+:y 'e -20
+:y ^e -20
+:y :e -20
+:y `e -20
+:y o -20
+:y 'o -20
+:y ^o -20
+:y :o -20
+:y `o -20
+:y /o -20
+:y ~o -20
+:y . -100
+:y u2026 -100
+z e -15
+z 'e -15
+z ^e -15
+z :e -15
+z `e -15
+z o -15
+z 'o -15
+z ^o -15
+z :o -15
+z `o -15
+z /o -15
+z ~o -15
+vz e -15
+vz 'e -15
+vz ^e -15
+vz :e -15
+vz `e -15
+vz o -15
+vz 'o -15
+vz ^o -15
+vz :o -15
+vz `o -15
+vz /o -15
+vz ~o -15
+
+charset
+ha 385,688,0,12,12 2 0 asciicircum
+ti 479,326 0 1 asciitilde
+vS 547,929,19 2 2 Scaron
+vZ 501,929 2 3 Zcaron
+vs 410,734,15 2 4 scaron
+vz 410,734 2 5 zcaron
+:Y 547,901 2 6 Ydieresis
+tm 820,718 2 7 trademark
+aq 157,718 2 8 quotesingle
+Eu 456,703,19 2 9 Euro
+space 228 0 32 space
+! 228,718 2 33 exclam
+" 291,718 2 34 quotedbl
+dq "
+# 456,688 2 35 numbersign
+sh "
+$ 456,775,115 2 36 dollar
+Do "
+% 729,703,19 2 37 percent
+& 547,718,15 2 38 ampersand
+' 182,718 2 39 quoteright
+cq "
+( 273,733,207 3 40 parenleft
+) 273,733,207 3 41 parenright
+* 319,718 2 42 asterisk
++ 479,505 0 43 plus
+, 228,106,147 0 44 comma
+- 273,322 0 45 hyphen
+hy "
+. 228,106 0 46 period
+/ 228,737,19,14,14 2 47 slash
+sl "
+0 456,703,19 2 48 zero
+1 456,703 2 49 one
+2 456,703 2 50 two
+3 456,703,19 2 51 three
+4 456,703 2 52 four
+5 456,688,19 2 53 five
+6 456,703,19 2 54 six
+7 456,688 2 55 seven
+8 456,703,19 2 56 eight
+9 456,703,19 2 57 nine
+: 228,516 0 58 colon
+; 228,516,147 0 59 semicolon
+< 479,495 0 60 less
+= 479,390 0 61 equal
+> 479,495 0 62 greater
+? 456,727 2 63 question
+@ 832,737,19 2 64 at
+at "
+A 547,718 2 65 A
+B 547,718 2 66 B
+C 592,737,19 2 67 C
+D 592,718 2 68 D
+E 547,718 2 69 E
+F 501,718 2 70 F
+G 638,737,19 2 71 G
+H 592,718 2 72 H
+I 228,718 2 73 I
+J 410,718,19 2 74 J
+K 547,718 2 75 K
+L 456,718 2 76 L
+M 683,718 2 77 M
+N 592,718 2 78 N
+O 638,737,19 2 79 O
+P 547,718 2 80 P
+Q 638,737,56 2 81 Q
+R 592,718 2 82 R
+S 547,737,19 2 83 S
+T 501,718 2 84 T
+U 592,718,19 2 85 U
+V 547,718 2 86 V
+W 774,718 2 87 W
+X 547,718 2 88 X
+Y 547,718 2 89 Y
+Z 501,718 2 90 Z
+[ 228,722,196 2 91 bracketleft
+lB "
+\ 228,737,19,14,14 2 92 backslash
+rs "
+] 228,722,196 2 93 bracketright
+rB "
+^ 273,734 2 94 circumflex
+a^ "
+_ 456,0,125 0 95 underscore
+` 182,725 2 96 quoteleft
+oq "
+a 456,538,15 0 97 a
+b 456,718,15 2 98 b
+c 410,538,15 0 99 c
+d 456,718,15 2 100 d
+e 456,538,15 0 101 e
+f 228,728 2 102 f
+g 456,538,220 1 103 g
+h 456,718 2 104 h
+i 182,718 2 105 i
+j 182,718,210,0,14 3 106 j
+k 410,718,0,1 2 107 k
+l 182,718 2 108 l
+m 683,538 0 109 m
+n 456,538 0 110 n
+o 456,538,14 0 111 o
+p 456,538,207 1 112 p
+q 456,538,207 1 113 q
+r 273,538 0 114 r
+s 410,538,15 0 115 s
+t 228,669,7 2 116 t
+u 456,523,15 0 117 u
+v 410,523 0 118 v
+w 592,523 0 119 w
+x 410,523 0 120 x
+y 410,523,214 1 121 y
+z 410,523 0 122 z
+{ 274,722,196 2 123 braceleft
+lC "
+| 213,775,225 3 124 bar
+ba "
+} 274,722,196 2 125 braceright
+rC "
+~ 273,722,0,4,4 2 126 tilde
+a~ "
+bq 182,106,149 0 128 quotesinglbase
+Fo 456,446 0 129 guillemotleft
+Fc 456,446 0 130 guillemotright
+bu 287,517 0 131 bullet
+Fn 456,737,207,0,10 3 132 florin
+f/ 137,703,19,137,137 2 133 fraction
+%0 820,703,19 2 134 perthousand
+dg 456,718,159 2 135 dagger
+dd 456,718,159 2 136 daggerdbl
+en 456,313 0 137 endash
+em 820,313,0,1 0 138 emdash
+fi 410,728 2 140 fi
+fl 410,728 2 141 fl
+.i 228,523 0 144 dotlessi
+ga 273,734 2 146 grave
+a" 273,734,0,63 2 147 hungarumlaut
+a. 273,706 2 148 dotaccent
+ab 273,731 2 149 breve
+ah 273,734 2 150 caron
+ao 273,756 2 151 ring
+ho 273,0,225 1 152 ogonek
+lq 273,725 2 153 quotedblleft
+rq 273,718 2 154 quotedblright
+oe 774,538,15 0 155 oe
+/l 182,718,0,17,17 2 156 lslash
+Bq 273,106,149 0 157 quotedblbase
+OE 820,737,19 2 158 OE
+/L 456,718,0,0,17 2 159 Lslash
+r! 273,523,195 0 161 exclamdown
+ct 456,623,115 0 162 cent
+Po 456,718,16 2 163 sterling
+Cs 456,603 0 164 currency
+Ye 456,688 2 165 yen
+bb 213,700,150 2 166 brokenbar
+sc 456,737,191 2 167 section
+ad 273,706 2 168 dieresis
+co 604,737,19,13,12 2 169 copyright
+Of 303,737 2 170 ordfeminine
+fo 273,446 0 171 guilsinglleft
+tno 479,390 0 172 logicalnot
+\- 479,289 0 173 minus
+rg 604,737,19,13,12 2 174 registered
+a- 273,684 2 175 macron
+de 328,703 2 176 degree
+t+- 479,506 0 177 plusminus
+S2 273,703 2 178 twosuperior
+S3 273,703 2 179 threesuperior
+aa 273,734 2 180 acute
+*m 474,523,207 1 181 mu
+mc "
+ps 440,718,173 2 182 paragraph
+pc 228,315 0 183 periodcentered
+ac 273,0,225 1 184 cedilla
+S1 273,703 2 185 onesuperior
+Om 299,737 2 186 ordmasculine
+fc 273,446 0 187 guilsinglright
+14 684,703,19 2 188 onequarter
+12 684,703,19 2 189 onehalf
+34 684,703,19 2 190 threequarters
+r? 501,525,201 0 191 questiondown
+`A 547,929 2 192 Agrave
+'A 547,929 2 193 Aacute
+^A 547,929 2 194 Acircumflex
+~A 547,917 2 195 Atilde
+:A 547,901 2 196 Adieresis
+oA 547,931 2 197 Aring
+AE 820,718 2 198 AE
+,C 592,737,225 3 199 Ccedilla
+`E 547,929 2 200 Egrave
+'E 547,929 2 201 Eacute
+^E 547,929 2 202 Ecircumflex
+:E 547,901 2 203 Edieresis
+`I 228,929,0,0,11 2 204 Igrave
+'I 228,929,0,12 2 205 Iacute
+^I 228,929,0,6,5 2 206 Icircumflex
+:I 228,901 2 207 Idieresis
+-D 592,718 2 208 Eth
+~N 592,917 2 209 Ntilde
+`O 638,929,19 2 210 Ograve
+'O 638,929,19 2 211 Oacute
+^O 638,929,19 2 212 Ocircumflex
+~O 638,917,19 2 213 Otilde
+:O 638,901,19 2 214 Odieresis
+tmu 479,506 0 215 multiply
+/O 638,737,19 2 216 Oslash
+`U 592,929,19 2 217 Ugrave
+'U 592,929,19 2 218 Uacute
+^U 592,929,19 2 219 Ucircumflex
+:U 592,901,19 2 220 Udieresis
+'Y 547,929 2 221 Yacute
+TP 547,718 2 222 Thorn
+ss 501,728,15 2 223 germandbls
+`a 456,734,15 2 224 agrave
+'a 456,734,15 2 225 aacute
+^a 456,734,15 2 226 acircumflex
+~a 456,722,15 2 227 atilde
+:a 456,706,15 2 228 adieresis
+oa 456,756,15 2 229 aring
+ae 729,538,15 0 230 ae
+,c 410,538,225 1 231 ccedilla
+`e 456,734,15 2 232 egrave
+'e 456,734,15 2 233 eacute
+^e 456,734,15 2 234 ecircumflex
+:e 456,706,15 2 235 edieresis
+`i 228,734,0,0,11 2 236 igrave
+'i 228,734,0,12 2 237 iacute
+^i 228,734,0,6,5 2 238 icircumflex
+:i 228,706 2 239 idieresis
+Sd 456,737,15 2 240 eth
+~n 456,722 2 241 ntilde
+`o 456,734,14 2 242 ograve
+'o 456,734,14 2 243 oacute
+^o 456,734,14 2 244 ocircumflex
+~o 456,722,14 2 245 otilde
+:o 456,706,14 2 246 odieresis
+tdi 479,524,19 0 247 divide
+/o 501,545,22 0 248 oslash
+`u 456,734,15 2 249 ugrave
+'u 456,734,15 2 250 uacute
+^u 456,734,15 2 251 ucircumflex
+:u 456,706,15 2 252 udieresis
+'y 410,734,214 3 253 yacute
+Tp 456,718,207 3 254 thorn
+:y 410,706,214 3 255 ydieresis
+u2026 820,106 0 256 ellipsis
diff --git a/font/devps/HR b/font/devps/HR
new file mode 100644
index 0000000..e8e34ca
--- /dev/null
+++ b/font/devps/HR
@@ -0,0 +1,1644 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Helvetica
+# Version 003.001
+# FamilyName Helvetica
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 12:48:21 1999
+# Comment UniqueID 44701
+# Comment VMusage 28955 35891
+
+name HR
+internalname Helvetica
+spacewidth 278
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A C -30
+A ,C -30
+A G -30
+A O -30
+A 'O -30
+A ^O -30
+A :O -30
+A `O -30
+A /O -30
+A ~O -30
+A Q -30
+A T -120
+A U -50
+A 'U -50
+A ^U -50
+A :U -50
+A `U -50
+A V -70
+A W -50
+A Y -100
+A 'Y -100
+A :Y -100
+A u -30
+A 'u -30
+A ^u -30
+A :u -30
+A `u -30
+A v -40
+A w -40
+A y -40
+A 'y -40
+A :y -40
+'A C -30
+'A ,C -30
+'A G -30
+'A O -30
+'A 'O -30
+'A ^O -30
+'A :O -30
+'A `O -30
+'A /O -30
+'A ~O -30
+'A Q -30
+'A T -120
+'A U -50
+'A 'U -50
+'A ^U -50
+'A :U -50
+'A `U -50
+'A V -70
+'A W -50
+'A Y -100
+'A 'Y -100
+'A :Y -100
+'A u -30
+'A 'u -30
+'A ^u -30
+'A :u -30
+'A `u -30
+'A v -40
+'A w -40
+'A y -40
+'A 'y -40
+'A :y -40
+^A C -30
+^A ,C -30
+^A G -30
+^A O -30
+^A 'O -30
+^A ^O -30
+^A :O -30
+^A `O -30
+^A /O -30
+^A ~O -30
+^A Q -30
+^A T -120
+^A U -50
+^A 'U -50
+^A ^U -50
+^A :U -50
+^A `U -50
+^A V -70
+^A W -50
+^A Y -100
+^A 'Y -100
+^A :Y -100
+^A u -30
+^A 'u -30
+^A ^u -30
+^A :u -30
+^A `u -30
+^A v -40
+^A w -40
+^A y -40
+^A 'y -40
+^A :y -40
+:A C -30
+:A ,C -30
+:A G -30
+:A O -30
+:A 'O -30
+:A ^O -30
+:A :O -30
+:A `O -30
+:A /O -30
+:A ~O -30
+:A Q -30
+:A T -120
+:A U -50
+:A 'U -50
+:A ^U -50
+:A :U -50
+:A `U -50
+:A V -70
+:A W -50
+:A Y -100
+:A 'Y -100
+:A :Y -100
+:A u -30
+:A 'u -30
+:A ^u -30
+:A :u -30
+:A `u -30
+:A v -40
+:A w -40
+:A y -40
+:A 'y -40
+:A :y -40
+`A C -30
+`A ,C -30
+`A G -30
+`A O -30
+`A 'O -30
+`A ^O -30
+`A :O -30
+`A `O -30
+`A /O -30
+`A ~O -30
+`A Q -30
+`A T -120
+`A U -50
+`A 'U -50
+`A ^U -50
+`A :U -50
+`A `U -50
+`A V -70
+`A W -50
+`A Y -100
+`A 'Y -100
+`A :Y -100
+`A u -30
+`A 'u -30
+`A ^u -30
+`A :u -30
+`A `u -30
+`A v -40
+`A w -40
+`A y -40
+`A 'y -40
+`A :y -40
+oA C -30
+oA ,C -30
+oA G -30
+oA O -30
+oA 'O -30
+oA ^O -30
+oA :O -30
+oA `O -30
+oA /O -30
+oA ~O -30
+oA Q -30
+oA T -120
+oA U -50
+oA 'U -50
+oA ^U -50
+oA :U -50
+oA `U -50
+oA V -70
+oA W -50
+oA Y -100
+oA 'Y -100
+oA :Y -100
+oA u -30
+oA 'u -30
+oA ^u -30
+oA :u -30
+oA `u -30
+oA v -40
+oA w -40
+oA y -40
+oA 'y -40
+oA :y -40
+~A C -30
+~A ,C -30
+~A G -30
+~A O -30
+~A 'O -30
+~A ^O -30
+~A :O -30
+~A `O -30
+~A /O -30
+~A ~O -30
+~A Q -30
+~A T -120
+~A U -50
+~A 'U -50
+~A ^U -50
+~A :U -50
+~A `U -50
+~A V -70
+~A W -50
+~A Y -100
+~A 'Y -100
+~A :Y -100
+~A u -30
+~A 'u -30
+~A ^u -30
+~A :u -30
+~A `u -30
+~A v -40
+~A w -40
+~A y -40
+~A 'y -40
+~A :y -40
+B U -10
+B 'U -10
+B ^U -10
+B :U -10
+B `U -10
+B , -20
+B . -20
+B u2026 -20
+C , -30
+C . -30
+C u2026 -30
+,C , -30
+,C . -30
+,C u2026 -30
+D A -40
+D 'A -40
+D ^A -40
+D :A -40
+D `A -40
+D oA -40
+D ~A -40
+D V -70
+D W -40
+D Y -90
+D 'Y -90
+D :Y -90
+D , -70
+D . -70
+D u2026 -70
+F A -80
+F 'A -80
+F ^A -80
+F :A -80
+F `A -80
+F oA -80
+F ~A -80
+F a -50
+F 'a -50
+F ^a -50
+F :a -50
+F `a -50
+F oa -50
+F ~a -50
+F , -150
+F e -30
+F 'e -30
+F ^e -30
+F :e -30
+F `e -30
+F o -30
+F 'o -30
+F ^o -30
+F :o -30
+F `o -30
+F /o -30
+F ~o -30
+F . -150
+F u2026 -150
+F r -45
+J A -20
+J 'A -20
+J ^A -20
+J :A -20
+J `A -20
+J oA -20
+J ~A -20
+J a -20
+J 'a -20
+J ^a -20
+J :a -20
+J `a -20
+J oa -20
+J ~a -20
+J , -30
+J . -30
+J u2026 -30
+J u -20
+J 'u -20
+J ^u -20
+J :u -20
+J `u -20
+K O -50
+K 'O -50
+K ^O -50
+K :O -50
+K `O -50
+K /O -50
+K ~O -50
+K e -40
+K 'e -40
+K ^e -40
+K :e -40
+K `e -40
+K o -40
+K 'o -40
+K ^o -40
+K :o -40
+K `o -40
+K /o -40
+K ~o -40
+K u -30
+K 'u -30
+K ^u -30
+K :u -30
+K `u -30
+K y -50
+K 'y -50
+K :y -50
+L T -110
+L V -110
+L W -70
+L Y -140
+L 'Y -140
+L :Y -140
+L rq -140
+L ' -160
+L cq -160
+L y -30
+L 'y -30
+L :y -30
+/L T -110
+/L V -110
+/L W -70
+/L Y -140
+/L 'Y -140
+/L :Y -140
+/L rq -140
+/L ' -160
+/L cq -160
+/L y -30
+/L 'y -30
+/L :y -30
+O A -20
+O 'A -20
+O ^A -20
+O :A -20
+O `A -20
+O oA -20
+O ~A -20
+O T -40
+O V -50
+O W -30
+O X -60
+O Y -70
+O 'Y -70
+O :Y -70
+O , -40
+O . -40
+O u2026 -40
+'O A -20
+'O 'A -20
+'O ^A -20
+'O :A -20
+'O `A -20
+'O oA -20
+'O ~A -20
+'O T -40
+'O V -50
+'O W -30
+'O X -60
+'O Y -70
+'O 'Y -70
+'O :Y -70
+'O , -40
+'O . -40
+'O u2026 -40
+^O A -20
+^O 'A -20
+^O ^A -20
+^O :A -20
+^O `A -20
+^O oA -20
+^O ~A -20
+^O T -40
+^O V -50
+^O W -30
+^O X -60
+^O Y -70
+^O 'Y -70
+^O :Y -70
+^O , -40
+^O . -40
+^O u2026 -40
+:O A -20
+:O 'A -20
+:O ^A -20
+:O :A -20
+:O `A -20
+:O oA -20
+:O ~A -20
+:O T -40
+:O V -50
+:O W -30
+:O X -60
+:O Y -70
+:O 'Y -70
+:O :Y -70
+:O , -40
+:O . -40
+:O u2026 -40
+`O A -20
+`O 'A -20
+`O ^A -20
+`O :A -20
+`O `A -20
+`O oA -20
+`O ~A -20
+`O T -40
+`O V -50
+`O W -30
+`O X -60
+`O Y -70
+`O 'Y -70
+`O :Y -70
+`O , -40
+`O . -40
+`O u2026 -40
+/O A -20
+/O 'A -20
+/O ^A -20
+/O :A -20
+/O `A -20
+/O oA -20
+/O ~A -20
+/O T -40
+/O V -50
+/O W -30
+/O X -60
+/O Y -70
+/O 'Y -70
+/O :Y -70
+/O , -40
+/O . -40
+/O u2026 -40
+~O A -20
+~O 'A -20
+~O ^A -20
+~O :A -20
+~O `A -20
+~O oA -20
+~O ~A -20
+~O T -40
+~O V -50
+~O W -30
+~O X -60
+~O Y -70
+~O 'Y -70
+~O :Y -70
+~O , -40
+~O . -40
+~O u2026 -40
+P A -120
+P 'A -120
+P ^A -120
+P :A -120
+P `A -120
+P oA -120
+P ~A -120
+P a -40
+P 'a -40
+P ^a -40
+P :a -40
+P `a -40
+P oa -40
+P ~a -40
+P , -180
+P e -50
+P 'e -50
+P ^e -50
+P :e -50
+P `e -50
+P o -50
+P 'o -50
+P ^o -50
+P :o -50
+P `o -50
+P /o -50
+P ~o -50
+P . -180
+P u2026 -180
+Q U -10
+Q 'U -10
+Q ^U -10
+Q :U -10
+Q `U -10
+R O -20
+R 'O -20
+R ^O -20
+R :O -20
+R `O -20
+R /O -20
+R ~O -20
+R T -30
+R U -40
+R 'U -40
+R ^U -40
+R :U -40
+R `U -40
+R V -50
+R W -30
+R Y -50
+R 'Y -50
+R :Y -50
+S , -20
+S . -20
+S u2026 -20
+vS , -20
+vS . -20
+vS u2026 -20
+T A -120
+T 'A -120
+T ^A -120
+T :A -120
+T `A -120
+T oA -120
+T ~A -120
+T O -40
+T 'O -40
+T ^O -40
+T :O -40
+T `O -40
+T /O -40
+T ~O -40
+T a -120
+T 'a -120
+T ^a -120
+T :a -120
+T `a -120
+T oa -120
+T ~a -60
+T : -20
+T , -120
+T e -120
+T 'e -120
+T ^e -120
+T :e -120
+T `e -60
+T - -140
+T hy -140
+T o -120
+T 'o -120
+T ^o -120
+T :o -120
+T `o -120
+T /o -120
+T ~o -60
+T . -120
+T u2026 -120
+T r -120
+T ; -20
+T u -120
+T 'u -120
+T ^u -120
+T :u -120
+T `u -120
+T w -120
+T y -120
+T 'y -120
+T :y -60
+U A -40
+U 'A -40
+U ^A -40
+U :A -40
+U `A -40
+U oA -40
+U ~A -40
+U , -40
+U . -40
+U u2026 -40
+'U A -40
+'U 'A -40
+'U ^A -40
+'U :A -40
+'U `A -40
+'U oA -40
+'U ~A -40
+'U , -40
+'U . -40
+'U u2026 -40
+^U A -40
+^U 'A -40
+^U ^A -40
+^U :A -40
+^U `A -40
+^U oA -40
+^U ~A -40
+^U , -40
+^U . -40
+^U u2026 -40
+:U A -40
+:U 'A -40
+:U ^A -40
+:U :A -40
+:U `A -40
+:U oA -40
+:U ~A -40
+:U , -40
+:U . -40
+:U u2026 -40
+`U A -40
+`U 'A -40
+`U ^A -40
+`U :A -40
+`U `A -40
+`U oA -40
+`U ~A -40
+`U , -40
+`U . -40
+`U u2026 -40
+V A -80
+V 'A -80
+V ^A -80
+V :A -80
+V `A -80
+V oA -80
+V ~A -80
+V G -40
+V O -40
+V 'O -40
+V ^O -40
+V :O -40
+V `O -40
+V /O -40
+V ~O -40
+V a -70
+V 'a -70
+V ^a -70
+V :a -70
+V `a -70
+V oa -70
+V ~a -70
+V : -40
+V , -125
+V e -80
+V 'e -80
+V ^e -80
+V :e -80
+V `e -80
+V - -80
+V hy -80
+V o -80
+V 'o -80
+V ^o -80
+V :o -80
+V `o -80
+V /o -80
+V ~o -80
+V . -125
+V u2026 -125
+V ; -40
+V u -70
+V 'u -70
+V ^u -70
+V :u -70
+V `u -70
+W A -50
+W 'A -50
+W ^A -50
+W :A -50
+W `A -50
+W oA -50
+W ~A -50
+W O -20
+W 'O -20
+W ^O -20
+W :O -20
+W `O -20
+W /O -20
+W ~O -20
+W a -40
+W 'a -40
+W ^a -40
+W :a -40
+W `a -40
+W oa -40
+W ~a -40
+W , -80
+W e -30
+W 'e -30
+W ^e -30
+W :e -30
+W `e -30
+W - -40
+W hy -40
+W o -30
+W 'o -30
+W ^o -30
+W :o -30
+W `o -30
+W /o -30
+W ~o -30
+W . -80
+W u2026 -80
+W u -30
+W 'u -30
+W ^u -30
+W :u -30
+W `u -30
+W y -20
+W 'y -20
+W :y -20
+Y A -110
+Y 'A -110
+Y ^A -110
+Y :A -110
+Y `A -110
+Y oA -110
+Y ~A -110
+Y O -85
+Y 'O -85
+Y ^O -85
+Y :O -85
+Y `O -85
+Y /O -85
+Y ~O -85
+Y a -140
+Y 'a -140
+Y ^a -140
+Y :a -140
+Y `a -140
+Y oa -140
+Y ~a -140
+Y : -60
+Y , -140
+Y e -140
+Y 'e -140
+Y ^e -140
+Y :e -140
+Y `e -140
+Y - -140
+Y hy -140
+Y i -20
+Y 'i -20
+Y o -140
+Y 'o -140
+Y ^o -140
+Y :o -140
+Y `o -140
+Y /o -140
+Y ~o -140
+Y . -140
+Y u2026 -140
+Y ; -60
+Y u -110
+Y 'u -110
+Y ^u -110
+Y :u -110
+Y `u -110
+'Y A -110
+'Y 'A -110
+'Y ^A -110
+'Y :A -110
+'Y `A -110
+'Y oA -110
+'Y ~A -110
+'Y O -85
+'Y 'O -85
+'Y ^O -85
+'Y :O -85
+'Y `O -85
+'Y /O -85
+'Y ~O -85
+'Y a -140
+'Y 'a -140
+'Y ^a -140
+'Y :a -140
+'Y `a -140
+'Y oa -140
+'Y ~a -70
+'Y : -60
+'Y , -140
+'Y e -140
+'Y 'e -140
+'Y ^e -140
+'Y :e -140
+'Y `e -140
+'Y - -140
+'Y hy -140
+'Y i -20
+'Y 'i -20
+'Y o -140
+'Y 'o -140
+'Y ^o -140
+'Y :o -140
+'Y `o -140
+'Y /o -140
+'Y ~o -140
+'Y . -140
+'Y u2026 -140
+'Y ; -60
+'Y u -110
+'Y 'u -110
+'Y ^u -110
+'Y :u -110
+'Y `u -110
+:Y A -110
+:Y 'A -110
+:Y ^A -110
+:Y :A -110
+:Y `A -110
+:Y oA -110
+:Y ~A -110
+:Y O -85
+:Y 'O -85
+:Y ^O -85
+:Y :O -85
+:Y `O -85
+:Y /O -85
+:Y ~O -85
+:Y a -140
+:Y 'a -140
+:Y ^a -140
+:Y :a -140
+:Y `a -140
+:Y oa -140
+:Y ~a -70
+:Y : -60
+:Y , -140
+:Y e -140
+:Y 'e -140
+:Y ^e -140
+:Y :e -140
+:Y `e -140
+:Y - -140
+:Y hy -140
+:Y i -20
+:Y 'i -20
+:Y o -140
+:Y 'o -140
+:Y ^o -140
+:Y :o -140
+:Y `o -140
+:Y /o -140
+:Y ~o -140
+:Y . -140
+:Y u2026 -140
+:Y ; -60
+:Y u -110
+:Y 'u -110
+:Y ^u -110
+:Y :u -110
+:Y `u -110
+a v -20
+a w -20
+a y -30
+a 'y -30
+a :y -30
+'a v -20
+'a w -20
+'a y -30
+'a 'y -30
+'a :y -30
+^a v -20
+^a w -20
+^a y -30
+^a 'y -30
+^a :y -30
+:a v -20
+:a w -20
+:a y -30
+:a 'y -30
+:a :y -30
+`a v -20
+`a w -20
+`a y -30
+`a 'y -30
+`a :y -30
+oa v -20
+oa w -20
+oa y -30
+oa 'y -30
+oa :y -30
+~a v -20
+~a w -20
+~a y -30
+~a 'y -30
+~a :y -30
+b b -10
+b , -40
+b l -20
+b /l -20
+b . -40
+b u2026 -40
+b u -20
+b 'u -20
+b ^u -20
+b :u -20
+b `u -20
+b v -20
+b y -20
+b 'y -20
+b :y -20
+c , -15
+c k -20
+,c , -15
+,c k -20
+: u0020 -50
+, rq -100
+, ' -100
+, cq -100
+e , -15
+e . -15
+e u2026 -15
+e v -30
+e w -20
+e x -30
+e y -20
+e 'y -20
+e :y -20
+'e , -15
+'e . -15
+'e u2026 -15
+'e v -30
+'e w -20
+'e x -30
+'e y -20
+'e 'y -20
+'e :y -20
+^e , -15
+^e . -15
+^e u2026 -15
+^e v -30
+^e w -20
+^e x -30
+^e y -20
+^e 'y -20
+^e :y -20
+:e , -15
+:e . -15
+:e u2026 -15
+:e v -30
+:e w -20
+:e x -30
+:e y -20
+:e 'y -20
+:e :y -20
+`e , -15
+`e . -15
+`e u2026 -15
+`e v -30
+`e w -20
+`e x -30
+`e y -20
+`e 'y -20
+`e :y -20
+f a -30
+f 'a -30
+f ^a -30
+f :a -30
+f `a -30
+f oa -30
+f ~a -30
+f , -30
+f .i -28
+f e -30
+f 'e -30
+f ^e -30
+f :e -30
+f `e -30
+f o -30
+f 'o -30
+f ^o -30
+f :o -30
+f `o -30
+f /o -30
+f ~o -30
+f . -30
+f u2026 -30
+f rq 60
+f ' 50
+f cq 50
+g r -10
+h y -30
+h 'y -30
+h :y -30
+k e -20
+k 'e -20
+k ^e -20
+k :e -20
+k `e -20
+k o -20
+k 'o -20
+k ^o -20
+k :o -20
+k `o -20
+k /o -20
+k ~o -20
+m u -10
+m 'u -10
+m ^u -10
+m :u -10
+m `u -10
+m y -15
+m 'y -15
+m :y -15
+n u -10
+n 'u -10
+n ^u -10
+n :u -10
+n `u -10
+n v -20
+n y -15
+n 'y -15
+n :y -15
+~n u -10
+~n 'u -10
+~n ^u -10
+~n :u -10
+~n `u -10
+~n v -20
+~n y -15
+~n 'y -15
+~n :y -15
+o , -40
+o . -40
+o u2026 -40
+o v -15
+o w -15
+o x -30
+o y -30
+o 'y -30
+o :y -30
+'o , -40
+'o . -40
+'o u2026 -40
+'o v -15
+'o w -15
+'o x -30
+'o y -30
+'o 'y -30
+'o :y -30
+^o , -40
+^o . -40
+^o u2026 -40
+^o v -15
+^o w -15
+^o x -30
+^o y -30
+^o 'y -30
+^o :y -30
+:o , -40
+:o . -40
+:o u2026 -40
+:o v -15
+:o w -15
+:o x -30
+:o y -30
+:o 'y -30
+:o :y -30
+`o , -40
+`o . -40
+`o u2026 -40
+`o v -15
+`o w -15
+`o x -30
+`o y -30
+`o 'y -30
+`o :y -30
+/o a -55
+/o 'a -55
+/o ^a -55
+/o :a -55
+/o `a -55
+/o oa -55
+/o ~a -55
+/o b -55
+/o c -55
+/o ,c -55
+/o , -95
+/o d -55
+/o e -55
+/o 'e -55
+/o ^e -55
+/o :e -55
+/o `e -55
+/o f -55
+/o g -55
+/o h -55
+/o i -55
+/o 'i -55
+/o ^i -55
+/o :i -55
+/o `i -55
+/o j -55
+/o k -55
+/o l -55
+/o /l -55
+/o m -55
+/o n -55
+/o ~n -55
+/o o -55
+/o 'o -55
+/o ^o -55
+/o :o -55
+/o `o -55
+/o /o -55
+/o ~o -55
+/o p -55
+/o . -95
+/o u2026 -95
+/o q -55
+/o r -55
+/o s -55
+/o vs -55
+/o t -55
+/o u -55
+/o 'u -55
+/o ^u -55
+/o :u -55
+/o `u -55
+/o v -70
+/o w -70
+/o x -85
+/o y -70
+/o 'y -70
+/o :y -70
+/o z -55
+/o vz -55
+~o , -40
+~o . -40
+~o u2026 -40
+~o v -15
+~o w -15
+~o x -30
+~o y -30
+~o 'y -30
+~o :y -30
+p , -35
+p . -35
+p u2026 -35
+p y -30
+p 'y -30
+p :y -30
+. rq -100
+u2026 rq -100
+. ' -100
+u2026 ' -100
+. cq -100
+u2026 cq -100
+. u0020 -60
+u2026 u0020 -60
+rq u0020 -40
+` ` -57
+` oq -57
+oq ` -57
+oq oq -57
+' d -50
+cq d -50
+' ' -57
+' cq -57
+cq ' -57
+cq cq -57
+' r -50
+cq r -50
+' s -50
+cq s -50
+' vs -50
+cq vs -50
+' u0020 -70
+cq u0020 -70
+r a -10
+r 'a -10
+r ^a -10
+r :a -10
+r `a -10
+r oa -10
+r ~a -10
+r : 30
+r , -50
+r i 15
+r 'i 15
+r ^i 15
+r :i 15
+r `i 15
+r k 15
+r l 15
+r /l 15
+r m 25
+r n 25
+r ~n 25
+r p 30
+r . -50
+r u2026 -50
+r ; 30
+r t 40
+r u 15
+r 'u 15
+r ^u 15
+r :u 15
+r `u 15
+r v 30
+r y 30
+r 'y 30
+r :y 30
+s , -15
+s . -15
+s u2026 -15
+s w -30
+vs , -15
+vs . -15
+vs u2026 -15
+vs w -30
+; u0020 -50
+u0020 T -50
+u0020 V -50
+u0020 W -40
+u0020 Y -90
+u0020 'Y -90
+u0020 :Y -90
+u0020 lq -30
+u0020 ` -60
+u0020 oq -60
+v a -25
+v 'a -25
+v ^a -25
+v :a -25
+v `a -25
+v oa -25
+v ~a -25
+v , -80
+v e -25
+v 'e -25
+v ^e -25
+v :e -25
+v `e -25
+v o -25
+v 'o -25
+v ^o -25
+v :o -25
+v `o -25
+v /o -25
+v ~o -25
+v . -80
+v u2026 -80
+w a -15
+w 'a -15
+w ^a -15
+w :a -15
+w `a -15
+w oa -15
+w ~a -15
+w , -60
+w e -10
+w 'e -10
+w ^e -10
+w :e -10
+w `e -10
+w o -10
+w 'o -10
+w ^o -10
+w :o -10
+w `o -10
+w /o -10
+w ~o -10
+w . -60
+w u2026 -60
+x e -30
+x 'e -30
+x ^e -30
+x :e -30
+x `e -30
+y a -20
+y 'a -20
+y ^a -20
+y :a -20
+y `a -20
+y oa -20
+y ~a -20
+y , -100
+y e -20
+y 'e -20
+y ^e -20
+y :e -20
+y `e -20
+y o -20
+y 'o -20
+y ^o -20
+y :o -20
+y `o -20
+y /o -20
+y ~o -20
+y . -100
+y u2026 -100
+'y a -20
+'y 'a -20
+'y ^a -20
+'y :a -20
+'y `a -20
+'y oa -20
+'y ~a -20
+'y , -100
+'y e -20
+'y 'e -20
+'y ^e -20
+'y :e -20
+'y `e -20
+'y o -20
+'y 'o -20
+'y ^o -20
+'y :o -20
+'y `o -20
+'y /o -20
+'y ~o -20
+'y . -100
+'y u2026 -100
+:y a -20
+:y 'a -20
+:y ^a -20
+:y :a -20
+:y `a -20
+:y oa -20
+:y ~a -20
+:y , -100
+:y e -20
+:y 'e -20
+:y ^e -20
+:y :e -20
+:y `e -20
+:y o -20
+:y 'o -20
+:y ^o -20
+:y :o -20
+:y `o -20
+:y /o -20
+:y ~o -20
+:y . -100
+:y u2026 -100
+z e -15
+z 'e -15
+z ^e -15
+z :e -15
+z `e -15
+z o -15
+z 'o -15
+z ^o -15
+z :o -15
+z `o -15
+z /o -15
+z ~o -15
+vz e -15
+vz 'e -15
+vz ^e -15
+vz :e -15
+vz `e -15
+vz o -15
+vz 'o -15
+vz ^o -15
+vz :o -15
+vz `o -15
+vz /o -15
+vz ~o -15
+
+charset
+ha 469,688,0,14,14 2 0 asciicircum
+ti 584,326 0 1 asciitilde
+vS 667,929,19 2 2 Scaron
+vZ 611,929 2 3 Zcaron
+vs 500,734,15 2 4 scaron
+vz 500,734 2 5 zcaron
+:Y 667,901 2 6 Ydieresis
+tm 1000,718 2 7 trademark
+aq 191,718 2 8 quotesingle
+Eu 556,703,19 2 9 Euro
+space 278 0 32 space
+! 278,718 2 33 exclam
+" 355,718 2 34 quotedbl
+dq "
+# 556,688 2 35 numbersign
+sh "
+$ 556,775,115 2 36 dollar
+Do "
+% 889,703,19 2 37 percent
+& 667,718,15 2 38 ampersand
+' 222,718 2 39 quoteright
+cq "
+( 333,733,207 3 40 parenleft
+) 333,733,207 3 41 parenright
+* 389,718 2 42 asterisk
++ 584,505 0 43 plus
+, 278,106,147 0 44 comma
+- 333,322 0 45 hyphen
+hy "
+. 278,106 0 46 period
+/ 278,737,19,17,17 2 47 slash
+sl "
+0 556,703,19 2 48 zero
+1 556,703 2 49 one
+2 556,703 2 50 two
+3 556,703,19 2 51 three
+4 556,703 2 52 four
+5 556,688,19 2 53 five
+6 556,703,19 2 54 six
+7 556,688 2 55 seven
+8 556,703,19 2 56 eight
+9 556,703,19 2 57 nine
+: 278,516 0 58 colon
+; 278,516,147 0 59 semicolon
+< 584,495 0 60 less
+= 584,390 0 61 equal
+> 584,495 0 62 greater
+? 556,727 2 63 question
+@ 1015,737,19 2 64 at
+at "
+A 667,718 2 65 A
+B 667,718 2 66 B
+C 722,737,19 2 67 C
+D 722,718 2 68 D
+E 667,718 2 69 E
+F 611,718 2 70 F
+G 778,737,19 2 71 G
+H 722,718 2 72 H
+I 278,718 2 73 I
+J 500,718,19 2 74 J
+K 667,718 2 75 K
+L 556,718 2 76 L
+M 833,718 2 77 M
+N 722,718 2 78 N
+O 778,737,19 2 79 O
+P 667,718 2 80 P
+Q 778,737,56 2 81 Q
+R 722,718 2 82 R
+S 667,737,19 2 83 S
+T 611,718 2 84 T
+U 722,718,19 2 85 U
+V 667,718 2 86 V
+W 944,718 2 87 W
+X 667,718 2 88 X
+Y 667,718 2 89 Y
+Z 611,718 2 90 Z
+[ 278,722,196 2 91 bracketleft
+lB "
+\ 278,737,19,17,17 2 92 backslash
+rs "
+] 278,722,196 2 93 bracketright
+rB "
+^ 333,734 2 94 circumflex
+a^ "
+_ 556,0,125 0 95 underscore
+` 222,725 2 96 quoteleft
+oq "
+a 556,538,15 0 97 a
+b 556,718,15 2 98 b
+c 500,538,15 0 99 c
+d 556,718,15 2 100 d
+e 556,538,15 0 101 e
+f 278,728 2 102 f
+g 556,538,220 1 103 g
+h 556,718 2 104 h
+i 222,718 2 105 i
+j 222,718,210,0,16 3 106 j
+k 500,718,0,1 2 107 k
+l 222,718 2 108 l
+m 833,538 0 109 m
+n 556,538 0 110 n
+o 556,538,14 0 111 o
+p 556,538,207 1 112 p
+q 556,538,207 1 113 q
+r 333,538 0 114 r
+s 500,538,15 0 115 s
+t 278,669,7 2 116 t
+u 556,523,15 0 117 u
+v 500,523 0 118 v
+w 722,523 0 119 w
+x 500,523 0 120 x
+y 500,523,214 1 121 y
+z 500,523 0 122 z
+{ 334,722,196 2 123 braceleft
+lC "
+| 260,775,225 3 124 bar
+ba "
+} 334,722,196 2 125 braceright
+rC "
+~ 333,722,0,4,4 2 126 tilde
+a~ "
+bq 222,106,149 0 128 quotesinglbase
+Fo 556,446 0 129 guillemotleft
+Fc 556,446 0 130 guillemotright
+bu 350,517 0 131 bullet
+Fn 556,737,207,0,11 3 132 florin
+f/ 167,703,19,166,166 2 133 fraction
+%0 1000,703,19 2 134 perthousand
+dg 556,718,159 2 135 dagger
+dd 556,718,159 2 136 daggerdbl
+en 556,313 0 137 endash
+em 1000,313 0 138 emdash
+fi 500,728 2 140 fi
+fl 500,728 2 141 fl
+.i 278,523 0 144 dotlessi
+ga 333,734 2 146 grave
+a" 333,734,0,76 2 147 hungarumlaut
+a. 333,706 2 148 dotaccent
+ab 333,731 2 149 breve
+ah 333,734 2 150 caron
+ao 333,756 2 151 ring
+ho 333,0,225 1 152 ogonek
+lq 333,725 2 153 quotedblleft
+rq 333,718 2 154 quotedblright
+oe 944,538,15 0 155 oe
+/l 222,718,0,20,20 2 156 lslash
+Bq 333,106,149 0 157 quotedblbase
+OE 1000,737,19 2 158 OE
+/L 556,718,0,0,20 2 159 Lslash
+r! 333,523,195 0 161 exclamdown
+ct 556,623,115 0 162 cent
+Po 556,718,16 2 163 sterling
+Cs 556,603 0 164 currency
+Ye 556,688 2 165 yen
+bb 260,700,150 2 166 brokenbar
+sc 556,737,191 2 167 section
+ad 333,706 2 168 dieresis
+co 737,737,19,15,14 2 169 copyright
+Of 370,737 2 170 ordfeminine
+fo 333,446 0 171 guilsinglleft
+tno 584,390 0 172 logicalnot
+\- 584,289 0 173 minus
+rg 737,737,19,15,14 2 174 registered
+a- 333,684 2 175 macron
+de 400,703 2 176 degree
+t+- 584,506 0 177 plusminus
+S2 333,703 2 178 twosuperior
+S3 333,703 2 179 threesuperior
+aa 333,734 2 180 acute
+*m 578,523,207 1 181 mu
+mc "
+ps 537,718,173 2 182 paragraph
+pc 278,315 0 183 periodcentered
+ac 333,0,225 1 184 cedilla
+S1 333,703 2 185 onesuperior
+Om 365,737 2 186 ordmasculine
+fc 333,446 0 187 guilsinglright
+14 834,703,19 2 188 onequarter
+12 834,703,19 2 189 onehalf
+34 834,703,19 2 190 threequarters
+r? 611,525,201 0 191 questiondown
+`A 667,929 2 192 Agrave
+'A 667,929 2 193 Aacute
+^A 667,929 2 194 Acircumflex
+~A 667,917 2 195 Atilde
+:A 667,901 2 196 Adieresis
+oA 667,931 2 197 Aring
+AE 1000,718 2 198 AE
+,C 722,737,225 3 199 Ccedilla
+`E 667,929 2 200 Egrave
+'E 667,929 2 201 Eacute
+^E 667,929 2 202 Ecircumflex
+:E 667,901 2 203 Edieresis
+`I 278,929,0,0,13 2 204 Igrave
+'I 278,929,0,14 2 205 Iacute
+^I 278,929,0,7,6 2 206 Icircumflex
+:I 278,901 2 207 Idieresis
+-D 722,718 2 208 Eth
+~N 722,917 2 209 Ntilde
+`O 778,929,19 2 210 Ograve
+'O 778,929,19 2 211 Oacute
+^O 778,929,19 2 212 Ocircumflex
+~O 778,917,19 2 213 Otilde
+:O 778,901,19 2 214 Odieresis
+tmu 584,506 0 215 multiply
+/O 778,737,19 2 216 Oslash
+`U 722,929,19 2 217 Ugrave
+'U 722,929,19 2 218 Uacute
+^U 722,929,19 2 219 Ucircumflex
+:U 722,901,19 2 220 Udieresis
+'Y 667,929 2 221 Yacute
+TP 667,718 2 222 Thorn
+ss 611,728,15 2 223 germandbls
+`a 556,734,15 2 224 agrave
+'a 556,734,15 2 225 aacute
+^a 556,734,15 2 226 acircumflex
+~a 556,722,15 2 227 atilde
+:a 556,706,15 2 228 adieresis
+oa 556,756,15 2 229 aring
+ae 889,538,15 0 230 ae
+,c 500,538,225 1 231 ccedilla
+`e 556,734,15 2 232 egrave
+'e 556,734,15 2 233 eacute
+^e 556,734,15 2 234 ecircumflex
+:e 556,706,15 2 235 edieresis
+`i 278,734,0,0,13 2 236 igrave
+'i 278,734,0,14 2 237 iacute
+^i 278,734,0,7,6 2 238 icircumflex
+:i 278,706 2 239 idieresis
+Sd 556,737,15 2 240 eth
+~n 556,722 2 241 ntilde
+`o 556,734,14 2 242 ograve
+'o 556,734,14 2 243 oacute
+^o 556,734,14 2 244 ocircumflex
+~o 556,722,14 2 245 otilde
+:o 556,706,14 2 246 odieresis
+tdi 584,524,19 0 247 divide
+/o 611,545,22 0 248 oslash
+`u 556,734,15 2 249 ugrave
+'u 556,734,15 2 250 uacute
+^u 556,734,15 2 251 ucircumflex
+:u 556,706,15 2 252 udieresis
+'y 500,734,214 3 253 yacute
+Tp 556,718,207 3 254 thorn
+:y 500,706,214 3 255 ydieresis
+u2026 1000,106 0 256 ellipsis
diff --git a/font/devps/NB b/font/devps/NB
new file mode 100644
index 0000000..d994c35
--- /dev/null
+++ b/font/devps/NB
@@ -0,0 +1,964 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName New Century Schoolbook Bold
+# Version 003.001
+# FamilyName New Century Schoolbook
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1988, 1991, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Copyright (c) 1985, 1987, 1988, 1991, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:51:41 1999
+# Comment UniqueID 44730
+# Comment VMusage 34691 41627
+
+name NB
+internalname NewCenturySchlbk-Bold
+spacewidth 287
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A T -55
+A U -18
+A 'U -18
+A ^U -18
+A :U -18
+A `U -18
+A V -74
+A W -74
+A Y -91
+A 'Y -91
+A :Y -91
+A rq -74
+A ' -74
+A cq -74
+A v -18
+A w -18
+A y -18
+A 'y -18
+A :y -18
+'A T -55
+'A U -18
+'A 'U -18
+'A ^U -18
+'A :U -18
+'A `U -18
+'A V -74
+'A W -74
+'A Y -91
+'A 'Y -91
+'A :Y -91
+'A rq -74
+'A ' -74
+'A cq -74
+'A v -18
+'A w -18
+'A y -18
+'A 'y -18
+'A :y -18
+^A T -55
+^A U -18
+^A 'U -18
+^A ^U -18
+^A :U -18
+^A `U -18
+^A V -74
+^A W -74
+^A Y -91
+^A 'Y -91
+^A :Y -91
+^A rq -74
+^A ' -74
+^A cq -74
+^A v -18
+^A w -18
+^A y -18
+^A 'y -18
+^A :y -18
+:A T -55
+:A U -18
+:A 'U -18
+:A ^U -18
+:A :U -18
+:A `U -18
+:A V -74
+:A W -74
+:A Y -91
+:A 'Y -91
+:A :Y -91
+:A rq -74
+:A ' -74
+:A cq -74
+:A v -18
+:A w -18
+:A y -18
+:A 'y -18
+:A :y -18
+`A T -55
+`A U -18
+`A 'U -18
+`A ^U -18
+`A :U -18
+`A `U -18
+`A V -74
+`A W -74
+`A Y -91
+`A 'Y -91
+`A :Y -91
+`A rq -74
+`A ' -74
+`A cq -74
+`A v -18
+`A w -18
+`A y -18
+`A 'y -18
+`A :y -18
+oA T -55
+oA U -18
+oA 'U -18
+oA ^U -18
+oA :U -18
+oA `U -18
+oA V -74
+oA W -74
+oA Y -91
+oA 'Y -91
+oA :Y -91
+oA rq -74
+oA ' -74
+oA cq -74
+oA v -18
+oA w -18
+oA y -18
+oA 'y -18
+oA :y -18
+~A T -55
+~A U -18
+~A 'U -18
+~A ^U -18
+~A :U -18
+~A `U -18
+~A V -74
+~A W -74
+~A Y -91
+~A 'Y -91
+~A :Y -91
+~A rq -74
+~A ' -74
+~A cq -74
+~A v -18
+~A w -18
+~A y -18
+~A 'y -18
+~A :y -18
+C , -18
+C . -18
+C u2026 -18
+,C , -18
+,C . -18
+,C u2026 -18
+D , -25
+D . -25
+D u2026 -25
+F a -74
+F 'a -74
+F ^a -74
+F :a -74
+F `a -74
+F oa -74
+F ~a -74
+F , -125
+F e -55
+F 'e -55
+F ^e -55
+F :e -55
+F `e -55
+F i -18
+F 'i -18
+F ^i -18
+F :i -18
+F `i -18
+F o -55
+F 'o -55
+F ^o -55
+F :o -55
+F `o -55
+F /o -55
+F ~o -55
+F . -125
+F u2026 -125
+F r -18
+J A -18
+J 'A -18
+J ^A -18
+J :A -18
+J `A -18
+J oA -18
+J ~A -18
+J a -18
+J 'a -18
+J ^a -18
+J :a -18
+J `a -18
+J oa -18
+J ~a -18
+J , -55
+J e -18
+J 'e -18
+J ^e -18
+J :e -18
+J `e -18
+J o -18
+J 'o -18
+J ^o -18
+J :o -18
+J `o -18
+J /o -18
+J ~o -18
+J . -55
+J u2026 -55
+J u -18
+J 'u -18
+J ^u -18
+J :u -18
+J `u -18
+K u -18
+K 'u -18
+K ^u -18
+K :u -18
+K `u -18
+K y -25
+K 'y -25
+K :y -25
+L T -100
+L V -100
+L W -74
+L Y -74
+L 'Y -74
+L :Y -74
+L rq -100
+L ' -100
+L cq -100
+L y -25
+L 'y -25
+L :y -25
+/L T -100
+/L V -100
+/L W -74
+/L Y -74
+/L 'Y -74
+/L :Y -74
+/L rq -100
+/L ' -100
+/L cq -100
+/L y -25
+/L 'y -25
+/L :y -25
+N , -18
+N . -18
+N u2026 -18
+~N , -18
+~N . -18
+~N u2026 -18
+O T 10
+O , -25
+O . -25
+O u2026 -25
+'O T 10
+'O , -25
+'O . -25
+'O u2026 -25
+^O T 10
+^O , -25
+^O . -25
+^O u2026 -25
+:O T 10
+:O , -25
+:O . -25
+:O u2026 -25
+`O T 10
+`O , -25
+`O . -25
+`O u2026 -25
+/O T 10
+/O , -25
+/O . -25
+/O u2026 -25
+~O T 10
+~O , -25
+~O . -25
+~O u2026 -25
+P A -74
+P 'A -74
+P ^A -74
+P :A -74
+P `A -74
+P oA -74
+P ~A -74
+P a -55
+P 'a -55
+P ^a -55
+P :a -55
+P `a -55
+P oa -55
+P ~a -55
+P , -150
+P e -55
+P 'e -55
+P ^e -55
+P :e -55
+P `e -55
+P o -55
+P 'o -55
+P ^o -55
+P :o -55
+P `o -55
+P /o -55
+P ~o -55
+P . -150
+P u2026 -150
+S , -18
+S . -18
+S u2026 -18
+vS , -18
+vS . -18
+vS u2026 -18
+T A -55
+T 'A -55
+T ^A -55
+T :A -55
+T `A -55
+T oA -55
+T ~A -55
+T O 10
+T 'O 10
+T ^O 10
+T :O 10
+T `O 10
+T /O 10
+T ~O 10
+T a -74
+T 'a -74
+T ^a -74
+T :a -74
+T `a -74
+T oa -74
+T ~a -74
+T , -100
+T e -74
+T 'e -74
+T ^e -74
+T :e -74
+T `e -74
+T - -125
+T hy -125
+T i -18
+T 'i -18
+T ^i -18
+T :i -18
+T `i -18
+T o -74
+T 'o -74
+T ^o -74
+T :o -74
+T `o -74
+T /o -74
+T ~o -74
+T . -100
+T u2026 -100
+T r -18
+T u -18
+T 'u -18
+T ^u -18
+T :u -18
+T `u -18
+U A -18
+U 'A -18
+U ^A -18
+U :A -18
+U `A -18
+U oA -18
+U ~A -18
+U , -25
+U . -25
+U u2026 -25
+'U A -18
+'U 'A -18
+'U ^A -18
+'U :A -18
+'U `A -18
+'U oA -18
+'U ~A -18
+'U , -25
+'U . -25
+'U u2026 -25
+^U A -18
+^U 'A -18
+^U ^A -18
+^U :A -18
+^U `A -18
+^U oA -18
+^U ~A -18
+^U , -25
+^U . -25
+^U u2026 -25
+:U A -18
+:U 'A -18
+:U ^A -18
+:U :A -18
+:U `A -18
+:U oA -18
+:U ~A -18
+:U , -25
+:U . -25
+:U u2026 -25
+`U A -18
+`U 'A -18
+`U ^A -18
+`U :A -18
+`U `A -18
+`U oA -18
+`U ~A -18
+`U , -25
+`U . -25
+`U u2026 -25
+V A -74
+V 'A -74
+V ^A -74
+V :A -74
+V `A -74
+V oA -74
+V ~A -74
+V a -74
+V 'a -74
+V ^a -74
+V :a -74
+V `a -74
+V oa -74
+V ~a -74
+V : -37
+V , -125
+V e -74
+V 'e -74
+V ^e -74
+V :e -74
+V `e -74
+V - -100
+V hy -100
+V i -18
+V 'i -18
+V ^i -18
+V :i -18
+V `i -18
+V o -74
+V 'o -74
+V ^o -74
+V :o -74
+V `o -74
+V /o -74
+V ~o -74
+V . -125
+V u2026 -125
+V ; -37
+V u -55
+V 'u -55
+V ^u -55
+V :u -55
+V `u -55
+W A -74
+W 'A -74
+W ^A -74
+W :A -74
+W `A -74
+W oA -74
+W ~A -74
+W a -74
+W 'a -74
+W ^a -74
+W :a -74
+W `a -74
+W oa -74
+W ~a -74
+W : -55
+W , -100
+W e -74
+W 'e -74
+W ^e -74
+W :e -74
+W `e -74
+W - -100
+W hy -100
+W i -18
+W 'i -18
+W ^i -18
+W :i -18
+W `i -18
+W o -74
+W 'o -74
+W ^o -74
+W :o -74
+W `o -74
+W /o -74
+W ~o -74
+W . -100
+W u2026 -100
+W ; -55
+W u -37
+W 'u -37
+W ^u -37
+W :u -37
+W `u -37
+W y -25
+W 'y -25
+W :y -25
+Y A -91
+Y 'A -91
+Y ^A -91
+Y :A -91
+Y `A -91
+Y oA -91
+Y ~A -91
+Y a -100
+Y 'a -100
+Y ^a -100
+Y :a -100
+Y `a -100
+Y oa -100
+Y ~a -100
+Y : -25
+Y , -100
+Y e -100
+Y 'e -100
+Y ^e -100
+Y :e -40
+Y `e -40
+Y - -125
+Y hy -125
+Y i -18
+Y 'i -18
+Y ^i -18
+Y o -100
+Y 'o -100
+Y ^o -100
+Y :o -40
+Y `o -40
+Y /o -100
+Y ~o -100
+Y . -100
+Y u2026 -100
+Y ; -25
+Y u -55
+Y 'u -55
+Y ^u -55
+Y :u -55
+Y `u -55
+'Y A -91
+'Y 'A -91
+'Y ^A -91
+'Y :A -91
+'Y `A -91
+'Y oA -91
+'Y ~A -91
+'Y a -100
+'Y 'a -100
+'Y ^a -100
+'Y :a -100
+'Y `a -100
+'Y oa -100
+'Y ~a -100
+'Y : -25
+'Y , -100
+'Y e -100
+'Y 'e -100
+'Y ^e -100
+'Y :e -40
+'Y `e -40
+'Y - -125
+'Y hy -125
+'Y i -18
+'Y 'i -18
+'Y ^i -18
+'Y o -100
+'Y 'o -100
+'Y ^o -100
+'Y :o -40
+'Y `o -40
+'Y /o -100
+'Y ~o -100
+'Y . -100
+'Y u2026 -100
+'Y ; -25
+'Y u -55
+'Y 'u -55
+'Y ^u -55
+'Y :u -55
+'Y `u -55
+:Y A -91
+:Y 'A -91
+:Y ^A -91
+:Y :A -91
+:Y `A -91
+:Y oA -91
+:Y ~A -91
+:Y a -100
+:Y 'a -100
+:Y ^a -100
+:Y :a -100
+:Y `a -100
+:Y oa -100
+:Y ~a -100
+:Y : -25
+:Y , -100
+:Y e -100
+:Y 'e -100
+:Y ^e -100
+:Y :e -40
+:Y `e -40
+:Y - -125
+:Y hy -125
+:Y i -18
+:Y 'i -18
+:Y ^i -18
+:Y o -100
+:Y 'o -100
+:Y ^o -100
+:Y :o -40
+:Y `o -40
+:Y /o -100
+:Y ~o -100
+:Y . -100
+:Y u2026 -100
+:Y ; -25
+:Y u -55
+:Y 'u -55
+:Y ^u -55
+:Y :u -55
+:Y `u -55
+: u0020 -18
+, rq -18
+, ' -18
+, cq -18
+, u0020 -18
+f rq 75
+f ' 75
+f cq 75
+. rq -18
+u2026 rq -18
+. ' -18
+u2026 ' -18
+. cq -18
+u2026 cq -18
+. u0020 -18
+u2026 u0020 -18
+lq A -74
+lq 'A -74
+lq ^A -74
+lq :A -74
+lq `A -74
+lq oA -74
+lq ~A -74
+rq u0020 -18
+` A -74
+oq A -74
+` 'A -74
+oq 'A -74
+` ^A -74
+oq ^A -74
+` :A -74
+oq :A -74
+` `A -74
+oq `A -74
+` oA -74
+oq oA -74
+` ~A -74
+oq ~A -74
+' d -25
+cq d -25
+' s -25
+cq s -25
+' vs -25
+cq vs -25
+r , -74
+r . -74
+r u2026 -74
+; u0020 -18
+u0020 A -18
+u0020 'A -18
+u0020 ^A -18
+u0020 :A -18
+u0020 `A -18
+u0020 oA -18
+u0020 ~A -18
+u0020 T -18
+u0020 V -18
+u0020 W -18
+u0020 Y -18
+u0020 'Y -18
+u0020 :Y -18
+u0020 lq -18
+u0020 ` -18
+u0020 oq -18
+v , -100
+v . -100
+v u2026 -100
+w , -100
+w . -100
+w u2026 -100
+y , -100
+y . -100
+y u2026 -100
+'y , -100
+'y . -100
+'y u2026 -100
+:y , -100
+:y . -100
+:y u2026 -100
+
+charset
+ha 606,690 2 0 asciicircum
+ti 606,346 0 1 asciitilde
+vS 667,952,15 2 2 Scaron
+vZ 667,952 2 3 Zcaron
+vs 500,725,15 2 4 scaron
+vz 537,725 2 5 zcaron
+:Y 722,921,0,12,12 2 6 Ydieresis
+tm 1000,722 2 7 trademark
+aq 241,737 2 8 quotesingle
+Eu 574,705,15 2 9 Euro
+space 287 0 32 space
+! 296,737,15 2 33 exclam
+" 333,737 2 34 quotedbl
+dq "
+# 574,690 2 35 numbersign
+sh "
+$ 574,810,141 2 36 dollar
+Do "
+% 833,705,15 2 37 percent
+& 852,737,15 2 38 ampersand
+' 241,737 2 39 quoteright
+cq "
+( 389,745,117 2 40 parenleft
+) 389,745,117 2 41 parenright
+* 500,737 2 42 asterisk
++ 606,506 0 43 plus
+, 278,175,184 0 44 comma
+- 333,302 0 45 hyphen
+hy "
+. 278,175,15 0 46 period
+/ 278,737,15,42,42 2 47 slash
+sl "
+0 574,705,15 2 48 zero
+1 574,705 2 49 one
+2 574,705 2 50 two
+3 574,705,15 2 51 three
+4 574,705 2 52 four
+5 574,705,15 2 53 five
+6 574,705,15 2 54 six
+7 574,705,15 2 55 seven
+8 574,705,15 2 56 eight
+9 574,705,15 2 57 nine
+: 278,485,15 0 58 colon
+; 278,485,184 0 59 semicolon
+< 606,515,9 0 60 less
+= 606,403 0 61 equal
+> 606,515,9 0 62 greater
+? 500,737,15 2 63 question
+@ 747,737,15,3,2 2 64 at
+at "
+A 759,737,0,19,19 2 65 A
+B 778,722 2 66 B
+C 778,737,15 2 67 C
+D 833,722 2 68 D
+E 759,722 2 69 E
+F 722,722 2 70 F
+G 833,737,15 2 71 G
+H 870,722 2 72 H
+I 444,722 2 73 I
+J 648,722,15 2 74 J
+K 815,722,0,7 2 75 K
+L 722,722 2 76 L
+M 981,722 2 77 M
+N 833,722,10 2 78 N
+O 833,737,15 2 79 O
+P 759,722 2 80 P
+Q 833,737,189 2 81 Q
+R 815,722,15 2 82 R
+S 667,737,15 2 83 S
+T 722,722 2 84 T
+U 833,722,15 2 85 U
+V 759,722,10,19,19 2 86 V
+W 981,722,10 2 87 W
+X 722,722,0,12,12 2 88 X
+Y 722,722,0,12,12 2 89 Y
+Z 667,722 2 90 Z
+[ 389,737,109 2 91 bracketleft
+lB "
+\ 606,737,15 2 92 backslash
+rs "
+] 389,737,109 2 93 bracketright
+rB "
+^ 333,725,0,11,10 2 94 circumflex
+a^ "
+_ 500,0,125 0 95 underscore
+` 241,737 2 96 quoteleft
+oq "
+a 611,485,15 0 97 a
+b 648,737,15 2 98 b
+c 556,485,15 0 99 c
+d 667,737,15 2 100 d
+e 574,485,15 0 101 e
+f 389,737,0,72 2 102 f
+g 611,535,205,12 1 103 g
+h 685,737 2 104 h
+i 370,737 2 105 i
+j 352,737,205,0,86 3 106 j
+k 667,737 2 107 k
+l 352,737 2 108 l
+m 963,485 0 109 m
+n 685,485 0 110 n
+o 611,485,15 0 111 o
+p 667,485,205 1 112 p
+q 648,485,205 1 113 q
+r 519,485 0 114 r
+s 500,485,15 0 115 s
+t 426,675,15 2 116 t
+u 685,475,15 0 117 u
+v 611,475,10 0 118 v
+w 889,475,10 0 119 w
+x 611,475 0 120 x
+y 611,475,205 1 121 y
+z 537,475 0 122 z
+{ 389,737,109 2 123 braceleft
+lC "
+| 606,750,250 3 124 bar
+ba "
+} 389,737,109 2 125 braceright
+rC "
+~ 333,705,0,24,24 2 126 tilde
+a~ "
+bq 241,175,184 0 128 quotesinglbase
+Fo 500,397 0 129 guillemotleft
+Fc 500,397 0 130 guillemotright
+bu 606,542 0 131 bullet
+Fn 574,737,205 3 132 florin
+f/ 167,705,15,165,165 2 133 fraction
+%0 1000,705,15 2 134 perthousand
+dg 500,737,101 2 135 dagger
+dd 500,737,89 2 136 daggerdbl
+en 500,292 0 137 endash
+em 1000,292 0 138 emdash
+fi 685,737 2 140 fi
+fl 685,737 2 141 fl
+.i 370,475 0 144 dotlessi
+ga 333,737 2 146 grave
+a" 333,737,0,98,16 2 147 hungarumlaut
+a. 333,737 2 148 dotaccent
+ab 333,714 2 149 breve
+ah 333,725,0,11,10 2 150 caron
+ao 333,761 2 151 ring
+ho 333,4,220 1 152 ogonek
+lq 481,737 2 153 quotedblleft
+rq 481,737 2 154 quotedblright
+oe 907,485,15 0 155 oe
+/l 352,737 2 156 lslash
+Bq 481,175,184 0 157 quotedblbase
+OE 1000,722 2 158 OE
+/L 722,722 2 159 Lslash
+r! 296,547,205 1 161 exclamdown
+ct 574,572,102 0 162 cent
+Po 574,705,15 2 163 sterling
+Cs 574,605 0 164 currency
+Ye 574,690,0,10,10 2 165 yen
+bb 606,675,175 2 166 brokenbar
+sc 500,737,86 2 167 section
+ad 333,707,0,12,12 2 168 dieresis
+co 747,737,15,3,2 2 169 copyright
+Of 367,705,0,26 2 170 ordfeminine
+fo 333,397 0 171 guilsinglleft
+tno 606,403 0 172 logicalnot
+\- 606,307 0 173 minus
+rg 747,737,15,3,2 2 174 registered
+a- 333,664,0,6,6 0 175 macron
+de 400,705 2 176 degree
+t+- 606,506 0 177 plusminus
+S2 344,705,0,6,3 2 178 twosuperior
+S3 344,705,0,11,3 2 179 threesuperior
+aa 333,737 2 180 acute
+*m 685,475,205 1 181 mu
+mc "
+ps 747,722,71 2 182 paragraph
+pc 278,372 0 183 periodcentered
+ac 333,2,224 1 184 cedilla
+S1 344,705 2 185 onesuperior
+Om 367,705 2 186 ordmasculine
+fc 333,397 0 187 guilsinglright
+14 861,705,15 2 188 onequarter
+12 861,705,15 2 189 onehalf
+34 861,705,15 2 190 threequarters
+r? 500,547,205 1 191 questiondown
+`A 759,964,0,19,19 2 192 Agrave
+'A 759,964,0,19,19 2 193 Aacute
+^A 759,952,0,19,19 2 194 Acircumflex
+~A 759,932,0,19,19 2 195 Atilde
+:A 759,921,0,19,19 2 196 Adieresis
+oA 759,988,0,19,19 2 197 Aring
+AE 981,722,0,0,29 2 198 AE
+,C 778,737,224 3 199 Ccedilla
+`E 759,964 2 200 Egrave
+'E 759,964 2 201 Eacute
+^E 759,952 2 202 Ecircumflex
+:E 759,921 2 203 Edieresis
+`I 444,964 2 204 Igrave
+'I 444,964 2 205 Iacute
+^I 444,952 2 206 Icircumflex
+:I 444,921 2 207 Idieresis
+-D 833,722 2 208 Eth
+~N 833,932,10 2 209 Ntilde
+`O 833,964,15 2 210 Ograve
+'O 833,964,15 2 211 Oacute
+^O 833,952,15 2 212 Ocircumflex
+~O 833,932,15 2 213 Otilde
+:O 833,921,15 2 214 Odieresis
+tmu 606,491 0 215 multiply
+/O 833,775,53 2 216 Oslash
+`U 833,964,15 2 217 Ugrave
+'U 833,964,15 2 218 Uacute
+^U 833,952,15 2 219 Ucircumflex
+:U 833,921,15 2 220 Udieresis
+'Y 722,964,0,12,12 2 221 Yacute
+TP 759,722 2 222 Thorn
+ss 611,737,15,0,2 2 223 germandbls
+`a 611,737,15 2 224 agrave
+'a 611,737,15 2 225 aacute
+^a 611,725,15 2 226 acircumflex
+~a 611,705,15 2 227 atilde
+:a 611,694,15 2 228 adieresis
+oa 611,761,15 2 229 aring
+ae 870,485,15 0 230 ae
+,c 556,485,224 1 231 ccedilla
+`e 574,737,15 2 232 egrave
+'e 574,737,15 2 233 eacute
+^e 574,725,15 2 234 ecircumflex
+:e 574,694,15 2 235 edieresis
+`i 370,737 2 236 igrave
+'i 370,737 2 237 iacute
+^i 370,725 2 238 icircumflex
+:i 370,694 2 239 idieresis
+Sd 611,737,15 2 240 eth
+~n 685,705 2 241 ntilde
+`o 611,737,15 2 242 ograve
+'o 611,737,15 2 243 oacute
+^o 611,725,15 2 244 ocircumflex
+~o 611,705,15 2 245 otilde
+:o 611,694,15 2 246 odieresis
+tdi 606,546,40 0 247 divide
+/o 611,573,103 0 248 oslash
+`u 685,737,15 2 249 ugrave
+'u 685,737,15 2 250 uacute
+^u 685,725,15 2 251 ucircumflex
+:u 685,694,15 2 252 udieresis
+'y 611,737,205 3 253 yacute
+Tp 667,737,205 3 254 thorn
+:y 611,694,205 3 255 ydieresis
+u2026 1000,175,15 0 256 ellipsis
diff --git a/font/devps/NBI b/font/devps/NBI
new file mode 100644
index 0000000..f941832
--- /dev/null
+++ b/font/devps/NBI
@@ -0,0 +1,1614 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName New Century Schoolbook Bold Italic
+# Version 003.001
+# FamilyName New Century Schoolbook
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1991, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Copyright (c) 1985, 1987, 1989, 1991, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:54:27 1999
+# Comment UniqueID 44731
+# Comment VMusage 35376 42312
+
+name NBI
+internalname NewCenturySchlbk-BoldItalic
+slant 16
+spacewidth 287
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A C 5
+A ,C 5
+A G 5
+A O 5
+A 'O 5
+A ^O 5
+A :O 5
+A `O 5
+A /O 5
+A ~O 5
+A Q 5
+A T 5
+A U -32
+A 'U -32
+A ^U -32
+A :U -32
+A `U -32
+A V -100
+A W -84
+A Y -70
+A 'Y -70
+A :Y -70
+A rq -95
+A ' -95
+A cq -95
+A u -15
+A 'u -15
+A ^u -15
+A :u -15
+A `u -15
+A v -10
+A w -25
+A y -33
+A 'y -33
+A :y -33
+'A C 5
+'A ,C 5
+'A G 5
+'A O 5
+'A 'O 5
+'A ^O 5
+'A :O 5
+'A `O 5
+'A /O 5
+'A ~O 5
+'A Q 5
+'A T 5
+'A U -32
+'A 'U -32
+'A ^U -32
+'A :U -32
+'A `U -32
+'A V -100
+'A W -84
+'A Y -70
+'A 'Y -70
+'A :Y -70
+'A rq -95
+'A ' -95
+'A cq -95
+'A u -15
+'A 'u -15
+'A ^u -15
+'A :u -15
+'A `u -15
+'A v -10
+'A w -25
+'A y -33
+'A 'y -33
+'A :y -33
+^A C 5
+^A ,C 5
+^A G 5
+^A O 5
+^A 'O 5
+^A ^O 5
+^A :O 5
+^A `O 5
+^A /O 5
+^A ~O 5
+^A Q 5
+^A T 5
+^A U -32
+^A 'U -32
+^A ^U -32
+^A :U -32
+^A `U -32
+^A V -100
+^A W -84
+^A Y -70
+^A 'Y -70
+^A :Y -70
+^A rq -95
+^A ' -95
+^A cq -95
+^A u -15
+^A 'u -15
+^A ^u -15
+^A :u -15
+^A `u -15
+^A v -10
+^A w -25
+^A y -33
+^A 'y -33
+^A :y -33
+:A C 5
+:A ,C 5
+:A G 5
+:A O 5
+:A 'O 5
+:A ^O 5
+:A :O 5
+:A `O 5
+:A /O 5
+:A ~O 5
+:A Q 5
+:A T 5
+:A U -32
+:A 'U -32
+:A ^U -32
+:A :U -32
+:A `U -32
+:A V -100
+:A W -84
+:A Y -70
+:A 'Y -70
+:A :Y -70
+:A rq -95
+:A ' -95
+:A cq -95
+:A u -15
+:A 'u -15
+:A ^u -15
+:A :u -15
+:A `u -15
+:A v -10
+:A w -25
+:A y -33
+:A 'y -33
+:A :y -33
+`A C 5
+`A ,C 5
+`A G 5
+`A O 5
+`A 'O 5
+`A ^O 5
+`A :O 5
+`A `O 5
+`A /O 5
+`A ~O 5
+`A Q 5
+`A T 5
+`A U -32
+`A 'U -32
+`A ^U -32
+`A :U -32
+`A `U -32
+`A V -100
+`A W -84
+`A Y -70
+`A 'Y -70
+`A :Y -70
+`A rq -95
+`A ' -95
+`A cq -95
+`A u -15
+`A 'u -15
+`A ^u -15
+`A :u -15
+`A `u -15
+`A v -10
+`A w -25
+`A y -33
+`A 'y -33
+`A :y -33
+oA C 5
+oA ,C 5
+oA G 5
+oA O 5
+oA 'O 5
+oA ^O 5
+oA :O 5
+oA `O 5
+oA /O 5
+oA ~O 5
+oA Q 5
+oA T 5
+oA U -32
+oA 'U -32
+oA ^U -32
+oA :U -32
+oA `U -32
+oA V -100
+oA W -84
+oA Y -70
+oA 'Y -70
+oA :Y -70
+oA rq -95
+oA ' -95
+oA cq -95
+oA u -15
+oA 'u -15
+oA ^u -15
+oA :u -15
+oA `u -15
+oA v -10
+oA w -25
+oA y -33
+oA 'y -33
+oA :y -33
+~A C 5
+~A ,C 5
+~A G 5
+~A O 5
+~A 'O 5
+~A ^O 5
+~A :O 5
+~A `O 5
+~A /O 5
+~A ~O 5
+~A Q 5
+~A T 5
+~A U -32
+~A 'U -32
+~A ^U -32
+~A :U -32
+~A `U -32
+~A V -100
+~A W -84
+~A Y -70
+~A 'Y -70
+~A :Y -70
+~A rq -95
+~A ' -95
+~A cq -95
+~A u -15
+~A 'u -15
+~A ^u -15
+~A :u -15
+~A `u -15
+~A v -10
+~A w -25
+~A y -33
+~A 'y -33
+~A :y -33
+B A -11
+B 'A -11
+B ^A -11
+B :A -11
+B `A -11
+B oA -11
+B ~A -11
+B U 15
+B 'U 15
+B ^U 15
+B :U 15
+B `U 15
+B , 15
+B . 15
+B u2026 15
+C A -5
+C 'A -5
+C ^A -5
+C :A -5
+C `A -5
+C oA -5
+C ~A -5
+,C A -5
+,C 'A -5
+,C ^A -5
+,C :A -5
+,C `A -5
+,C oA -5
+,C ~A -5
+D V -18
+D W -11
+D Y 6
+D 'Y 6
+D :Y 6
+D , -11
+D . -11
+D u2026 -11
+F A -79
+F 'A -79
+F ^A -79
+F :A -79
+F `A -79
+F oA -79
+F ~A -79
+F a -47
+F 'a -47
+F ^a -47
+F :a -47
+F `a -47
+F oa -47
+F ~a -47
+F , -91
+F e -41
+F 'e -41
+F ^e -41
+F :e -41
+F `e -41
+F i -41
+F 'i -41
+F ^i -41
+F :i -41
+F `i -41
+F o -47
+F 'o -47
+F ^o -47
+F :o -47
+F `o -47
+F /o -47
+F ~o -47
+F . -91
+F u2026 -91
+F r -27
+J A -30
+J 'A -30
+J ^A -30
+J :A -30
+J `A -30
+J oA -30
+J ~A -30
+J a -40
+J 'a -40
+J ^a -40
+J :a -40
+J `a -40
+J oa -40
+J ~a -40
+J , -74
+J e -33
+J 'e -33
+J ^e -33
+J :e -33
+J `e -33
+J o -40
+J 'o -40
+J ^o -40
+J :o -40
+J `o -40
+J /o -40
+J ~o -40
+J . -74
+J u2026 -74
+J u -39
+J 'u -39
+J ^u -39
+J :u -39
+J `u -39
+K e 18
+K 'e 18
+K ^e 18
+K :e 18
+K `e 18
+K o -4
+K 'o -4
+K ^o -4
+K :o -4
+K `o -4
+K /o -4
+K ~o -4
+K u -4
+K 'u -4
+K ^u -4
+K :u -4
+K `u -4
+K y -48
+K 'y -48
+K :y -48
+L T -75
+L V -97
+L W -69
+L Y -55
+L 'Y -55
+L :Y -55
+L rq -100
+L ' -100
+L cq -100
+L y -30
+L 'y -30
+L :y -30
+/L T -75
+/L V -97
+/L W -69
+/L Y -55
+/L 'Y -55
+/L :Y -55
+/L rq -100
+/L ' -100
+/L cq -100
+/L y -30
+/L 'y -30
+/L :y -30
+N , -49
+N . -49
+N u2026 -49
+~N , -49
+~N . -49
+~N u2026 -49
+O A -5
+O 'A -5
+O ^A -5
+O :A -5
+O `A -5
+O oA -5
+O ~A -5
+O V -24
+O W -15
+O X -18
+O , -18
+O . -18
+O u2026 -18
+'O A -5
+'O 'A -5
+'O ^A -5
+'O :A -5
+'O `A -5
+'O oA -5
+'O ~A -5
+'O V -24
+'O W -15
+'O X -18
+'O , -18
+'O . -18
+'O u2026 -18
+^O A -5
+^O 'A -5
+^O ^A -5
+^O :A -5
+^O `A -5
+^O oA -5
+^O ~A -5
+^O V -24
+^O W -15
+^O X -18
+^O , -18
+^O . -18
+^O u2026 -18
+:O A -5
+:O 'A -5
+:O ^A -5
+:O :A -5
+:O `A -5
+:O oA -5
+:O ~A -5
+:O V -24
+:O W -15
+:O X -18
+:O , -18
+:O . -18
+:O u2026 -18
+`O A -5
+`O 'A -5
+`O ^A -5
+`O :A -5
+`O `A -5
+`O oA -5
+`O ~A -5
+`O V -24
+`O W -15
+`O X -18
+`O , -18
+`O . -18
+`O u2026 -18
+/O A -5
+/O 'A -5
+/O ^A -5
+/O :A -5
+/O `A -5
+/O oA -5
+/O ~A -5
+/O V -24
+/O W -15
+/O X -18
+/O , -18
+/O . -18
+/O u2026 -18
+~O A -5
+~O 'A -5
+~O ^A -5
+~O :A -5
+~O `A -5
+~O oA -5
+~O ~A -5
+~O V -24
+~O W -15
+~O X -18
+~O , -18
+~O . -18
+~O u2026 -18
+P A -80
+P 'A -80
+P ^A -80
+P :A -80
+P `A -80
+P oA -80
+P ~A -80
+P a -40
+P 'a -40
+P ^a -40
+P :a -40
+P `a -40
+P oa -40
+P ~a -40
+P , -100
+P e -33
+P 'e -33
+P ^e -33
+P :e -33
+P `e -33
+P o -40
+P 'o -40
+P ^o -40
+P :o -40
+P `o -40
+P /o -40
+P ~o -40
+P . -100
+P u2026 -100
+R V -24
+R W -14
+S , -18
+S . -18
+S u2026 -18
+vS , -18
+vS . -18
+vS u2026 -18
+T A -60
+T 'A -60
+T ^A -60
+T :A -60
+T `A -60
+T oA -60
+T ~A -60
+T O 11
+T 'O 11
+T ^O 11
+T :O 11
+T `O 11
+T /O 11
+T ~O 11
+T a -40
+T 'a -40
+T ^a -40
+T :a -40
+T `a -40
+T oa -40
+T ~a -40
+T , -55
+T e -33
+T 'e -33
+T ^e -33
+T :e -33
+T `e -33
+T h -9
+T - -75
+T hy -75
+T i -22
+T 'i -22
+T ^i -22
+T :i -22
+T `i -22
+T o -40
+T 'o -40
+T ^o -40
+T :o -40
+T `o -40
+T /o -40
+T ~o -40
+T . -55
+T u2026 -55
+T r -9
+T u -22
+T 'u -22
+T ^u -22
+T :u -22
+T `u -22
+T w -30
+T y -30
+T 'y -30
+T :y -30
+U A -42
+U 'A -42
+U ^A -42
+U :A -42
+U `A -42
+U oA -42
+U ~A -42
+U , -25
+U . -25
+U u2026 -25
+'U A -42
+'U 'A -42
+'U ^A -42
+'U :A -42
+'U `A -42
+'U oA -42
+'U ~A -42
+'U , -25
+'U . -25
+'U u2026 -25
+^U A -42
+^U 'A -42
+^U ^A -42
+^U :A -42
+^U `A -42
+^U oA -42
+^U ~A -42
+^U , -25
+^U . -25
+^U u2026 -25
+:U A -42
+:U 'A -42
+:U ^A -42
+:U :A -42
+:U `A -42
+:U oA -42
+:U ~A -42
+:U , -25
+:U . -25
+:U u2026 -25
+`U A -42
+`U 'A -42
+`U ^A -42
+`U :A -42
+`U `A -42
+`U oA -42
+`U ~A -42
+`U , -25
+`U . -25
+`U u2026 -25
+V A -100
+V 'A -100
+V ^A -100
+V :A -100
+V `A -100
+V oA -100
+V ~A -100
+V G -12
+V O -19
+V 'O -19
+V ^O -19
+V :O -19
+V `O -19
+V /O -19
+V ~O -19
+V a -55
+V 'a -55
+V ^a -55
+V :a -55
+V `a -55
+V oa -55
+V ~a -55
+V : -49
+V , -94
+V e -66
+V 'e -66
+V ^e -66
+V :e -66
+V `e -66
+V - -94
+V hy -94
+V i -35
+V 'i -35
+V o -71
+V 'o -71
+V ^o -71
+V :o -71
+V `o -71
+V /o -71
+V ~o -71
+V . -94
+V u2026 -94
+V ; 6
+V u -70
+V 'u -70
+V ^u -70
+V :u -70
+V `u -70
+W A -66
+W 'A -66
+W ^A -66
+W :A -66
+W `A -66
+W oA -66
+W ~A -66
+W O -11
+W 'O -11
+W ^O -11
+W :O -11
+W `O -11
+W /O -11
+W ~O -11
+W a -33
+W 'a -33
+W ^a -33
+W :a -33
+W `a -33
+W oa -33
+W ~a -33
+W : -22
+W , -86
+W e -39
+W 'e -39
+W ^e -39
+W :e -39
+W `e -39
+W h 5
+W - -61
+W hy -61
+W i -27
+W 'i -27
+W o -33
+W 'o -33
+W ^o -33
+W :o -33
+W `o -33
+W /o -33
+W ~o -33
+W . -86
+W u2026 -86
+W ; -22
+W u -25
+W 'u -25
+W ^u -25
+W :u -25
+W `u -25
+W y -41
+W 'y -41
+W :y -41
+Y A -79
+Y 'A -79
+Y ^A -79
+Y :A -79
+Y `A -79
+Y oA -79
+Y ~A -79
+Y a -77
+Y 'a -77
+Y ^a -77
+Y :a -77
+Y `a -77
+Y oa -77
+Y ~a -77
+Y : -55
+Y , -91
+Y e -71
+Y 'e -71
+Y ^e -71
+Y :e -31
+Y `e -31
+Y - -91
+Y hy -91
+Y i -22
+Y 'i -22
+Y ^i -22
+Y o -77
+Y 'o -77
+Y ^o -77
+Y :o -77
+Y `o -77
+Y /o -77
+Y ~o -77
+Y . -91
+Y u2026 -91
+Y ; -55
+Y u -58
+Y 'u -58
+Y ^u -58
+Y :u -58
+Y `u -58
+'Y A -79
+'Y 'A -79
+'Y ^A -79
+'Y :A -79
+'Y `A -79
+'Y oA -79
+'Y ~A -79
+'Y a -77
+'Y 'a -77
+'Y ^a -77
+'Y :a -77
+'Y `a -77
+'Y oa -77
+'Y ~a -77
+'Y : -55
+'Y , -91
+'Y e -71
+'Y 'e -71
+'Y ^e -71
+'Y :e -31
+'Y `e -31
+'Y - -91
+'Y hy -91
+'Y i -22
+'Y 'i -22
+'Y ^i -22
+'Y o -77
+'Y 'o -77
+'Y ^o -77
+'Y :o -77
+'Y `o -77
+'Y /o -77
+'Y ~o -77
+'Y . -91
+'Y u2026 -91
+'Y ; -55
+'Y u -58
+'Y 'u -58
+'Y ^u -58
+'Y :u -58
+'Y `u -58
+:Y A -79
+:Y 'A -79
+:Y ^A -79
+:Y :A -79
+:Y `A -79
+:Y oA -79
+:Y ~A -79
+:Y a -77
+:Y 'a -77
+:Y ^a -77
+:Y :a -77
+:Y `a -77
+:Y oa -77
+:Y ~a -77
+:Y : -55
+:Y , -91
+:Y e -71
+:Y 'e -71
+:Y ^e -71
+:Y :e -31
+:Y `e -31
+:Y - -91
+:Y hy -91
+:Y i -22
+:Y 'i -22
+:Y ^i -22
+:Y o -77
+:Y 'o -77
+:Y ^o -77
+:Y :o -77
+:Y `o -77
+:Y /o -77
+:Y ~o -77
+:Y . -91
+:Y u2026 -91
+:Y ; -55
+:Y u -58
+:Y 'u -58
+:Y ^u -58
+:Y :u -58
+:Y `u -58
+a v 6
+a w -8
+a y -8
+a 'y -8
+a :y -8
+'a v 6
+'a w -8
+'a y -8
+'a 'y -8
+'a :y -8
+^a v 6
+^a w -8
+^a y -8
+^a 'y -8
+^a :y -8
+:a v 6
+:a w -8
+:a y -8
+:a 'y -8
+:a :y -8
+`a v 6
+`a w -8
+`a y -8
+`a 'y -8
+`a :y -8
+oa v 6
+oa w -8
+oa y -8
+oa 'y -8
+oa :y -8
+~a v 6
+~a w -8
+~a y -8
+~a 'y -8
+~a :y -8
+b , 6
+b . 6
+b u2026 6
+b v 8
+b y -6
+b 'y -6
+b :y -6
+c , -8
+c h -18
+c k -8
+c l -13
+c /l -13
+c . -8
+c u2026 -8
+c y -20
+c 'y -20
+c :y -20
+,c , -8
+,c h -18
+,c k -8
+,c l -13
+,c /l -13
+,c . -8
+,c u2026 -8
+,c y -20
+,c 'y -20
+,c :y -20
+: u0020 -18
+, rq -18
+, ' -18
+, cq -18
+, u0020 -18
+d w -15
+d y -15
+d 'y -15
+d :y -15
+e b -8
+e g -4
+e p -11
+e w -15
+e x -5
+e y -15
+e 'y -15
+e :y -15
+'e b -8
+'e g -4
+'e p -11
+'e w -15
+'e x -5
+'e y -15
+'e 'y -15
+'e :y -15
+^e b -8
+^e g -4
+^e p -11
+^e w -15
+^e x -5
+^e y -15
+^e 'y -15
+^e :y -15
+:e b -8
+:e g -4
+:e p -11
+:e w -15
+:e x -5
+:e y -15
+:e 'y -15
+:e :y -15
+`e b -8
+`e g -4
+`e p -11
+`e w -15
+`e x -5
+`e y -15
+`e 'y -15
+`e :y -15
+f a 8
+f 'a 8
+f ^a 8
+f :a 8
+f `a 8
+f oa 8
+f ~a 8
+f , -28
+f .i 7
+f e 14
+f 'e 14
+f ^e 34
+f :e 34
+f `e 34
+f i 7
+f 'i 27
+f ^i 27
+f :i 27
+f `i 27
+f l 7
+f /l 7
+f o 7
+f 'o 7
+f ^o 7
+f :o 7
+f `o 7
+f /o 7
+f ~o 7
+f . -28
+f u2026 -28
+f rq 105
+f ' 105
+f cq 105
+g , -5
+g . -5
+g u2026 -5
+g r 11
+g y -11
+g 'y -11
+g :y -11
+h y -20
+h 'y -20
+h :y -20
+i v 7
+'i v 7
+^i v 7
+:i v 7
+`i v 7
+k e -16
+k 'e -16
+k ^e -16
+k :e -16
+k `e -16
+k o -22
+k 'o -22
+k ^o -22
+k :o -22
+k `o -22
+k /o -22
+k ~o -22
+k y -15
+k 'y -15
+k :y -15
+l w -7
+l y -7
+l 'y -7
+l :y -7
+/l w -7
+/l y -7
+/l 'y -7
+/l :y -7
+m u -11
+m 'u -11
+m ^u -11
+m :u -11
+m `u -11
+m y -20
+m 'y -20
+m :y -20
+n u -11
+n 'u -11
+n ^u -11
+n :u -11
+n `u -11
+n v -7
+n y -20
+n 'y -20
+n :y -20
+~n u -11
+~n 'u -11
+~n ^u -11
+~n :u -11
+~n `u -11
+~n v -7
+~n y -20
+~n 'y -20
+~n :y -20
+o v 6
+o w -8
+o y -11
+o 'y -11
+o :y -11
+'o v 6
+'o w -8
+'o y -11
+'o 'y -11
+'o :y -11
+^o v 6
+^o w -8
+^o y -11
+^o 'y -11
+^o :y -11
+:o v 6
+:o w -8
+:o y -11
+:o 'y -11
+:o :y -11
+`o v 6
+`o w -8
+`o y -11
+`o 'y -11
+`o :y -11
+/o v 6
+/o w -8
+/o y -11
+/o 'y -11
+/o :y -11
+~o v 6
+~o w -8
+~o y -11
+~o 'y -11
+~o :y -11
+p , 8
+p . 8
+p u2026 8
+p y -4
+p 'y -4
+p :y -4
+. rq -18
+u2026 rq -18
+. ' -18
+u2026 ' -18
+. cq -18
+u2026 cq -18
+. u0020 -18
+u2026 u0020 -18
+lq A -60
+lq 'A -60
+lq ^A -60
+lq :A -60
+lq `A -60
+lq oA -60
+lq ~A -60
+lq ` 20
+lq oq 20
+rq u0020 -18
+` A -80
+oq A -80
+` 'A -80
+oq 'A -80
+` ^A -80
+oq ^A -80
+` :A -80
+oq :A -80
+` `A -80
+oq `A -80
+` oA -80
+oq oA -80
+` ~A -80
+oq ~A -80
+' d -41
+cq d -41
+' l -22
+cq l -22
+' /l -22
+cq /l -22
+' r -9
+cq r -9
+' s -46
+cq s -46
+' vs -46
+cq vs -46
+' t -22
+cq t -22
+' v -16
+cq v -16
+r a -11
+r 'a -11
+r ^a -11
+r :a -11
+r `a -11
+r oa -11
+r ~a -11
+r : 9
+r , -90
+r d -7
+r e -7
+r 'e -7
+r ^e -7
+r :e -7
+r `e -7
+r g -11
+r - -16
+r hy -16
+r i -14
+r 'i -14
+r ^i -14
+r :i -14
+r `i -14
+r k 9
+r l -14
+r /l -14
+r o -11
+r 'o -11
+r ^o -11
+r :o -11
+r `o -11
+r /o -11
+r ~o -11
+r p -17
+r . -90
+r u2026 -90
+r ' 9
+r cq 9
+r s -20
+r vs -20
+r ; 9
+r t -11
+r u -11
+r 'u -11
+r ^u -11
+r :u -11
+r `u -11
+r v -7
+r y -20
+r 'y -20
+r :y -20
+s , 11
+s . 11
+s u2026 11
+vs , 11
+vs . 11
+vs u2026 11
+; u0020 -18
+u0020 A -22
+u0020 'A -22
+u0020 ^A -22
+u0020 :A -22
+u0020 `A -22
+u0020 oA -22
+u0020 ~A -22
+u0020 T -18
+u0020 V -24
+u0020 W -33
+u0020 Y -18
+u0020 'Y -18
+u0020 :Y -18
+u0020 lq -18
+v a -6
+v 'a -6
+v ^a -6
+v :a -6
+v `a -6
+v oa -6
+v ~a -6
+v , -11
+v o -6
+v 'o -6
+v ^o -6
+v :o -6
+v `o -6
+v /o -6
+v ~o -6
+v . -11
+v u2026 -11
+w a -14
+w 'a -14
+w ^a -14
+w :a -14
+w `a -14
+w oa -14
+w ~a -14
+w , -17
+w e -8
+w 'e -8
+w ^e -8
+w :e -8
+w `e -8
+w o -14
+w 'o -14
+w ^o -14
+w :o -14
+w `o -14
+w /o -14
+w ~o -14
+w . -17
+w u2026 -17
+x e 5
+x 'e 5
+x ^e 5
+x :e 5
+x `e 5
+y a 8
+y 'a 8
+y ^a 8
+y :a 8
+y `a 8
+y oa 8
+y ~a 8
+y , -25
+y e 15
+y 'e 15
+y ^e 15
+y :e 15
+y `e 15
+y o 8
+y 'o 8
+y ^o 8
+y :o 8
+y `o 8
+y /o 8
+y ~o 8
+y . -25
+y u2026 -25
+'y a 8
+'y 'a 8
+'y ^a 8
+'y :a 8
+'y `a 8
+'y oa 8
+'y ~a 8
+'y , -25
+'y e 15
+'y 'e 15
+'y ^e 15
+'y :e 15
+'y `e 15
+'y o 8
+'y 'o 8
+'y ^o 8
+'y :o 8
+'y `o 8
+'y /o 8
+'y ~o 8
+'y . -25
+'y u2026 -25
+:y a 8
+:y 'a 8
+:y ^a 8
+:y :a 8
+:y `a 8
+:y oa 8
+:y ~a 8
+:y , -25
+:y e 15
+:y 'e 15
+:y ^e 15
+:y :e 15
+:y `e 15
+:y o 8
+:y 'o 8
+:y ^o 8
+:y :o 8
+:y `o 8
+:y /o 8
+:y ~o 8
+:y . -25
+:y u2026 -25
+z e 4
+z 'e 4
+z ^e 4
+z :e 4
+z `e 4
+vz e 4
+vz 'e 4
+vz ^e 4
+vz :e 4
+vz `e 4
+
+charset
+ha 606,690,0,0,-16 2 0 asciicircum
+ti 606,346,0,0,-22 0 1 asciitilde
+vS 685,930,15,31,49,31 2 2 Scaron
+vZ 704,930,0,57,83,57 2 3 Zcaron
+vs 481,705,15,46,50,46 2 4 scaron
+vz 519,695,15,4,69,4 2 5 zcaron
+:Y 704,915,0,121,37,109 2 6 Ydieresis
+tm 950,722,0,117,8,109 2 7 trademark
+aq 287,737,0,13,-62,13 2 8 quotesingle
+Eu 574,705,15,117,68,109 2 9 Euro
+space 287 0 32 space
+! 333,737,15,50,50,50 2 33 exclam
+" 400,737,0,78,-16,78 2 34 quotedbl
+dq "
+# 574,690,0,20,20,20 2 35 numbersign
+sh "
+$ 574,810,120,41,41,41 2 36 dollar
+Do "
+% 889,727,28,0,-4 2 37 percent
+& 889,737,15,0,18 2 38 ampersand
+' 259,737,0,66,2,66 2 39 quoteright
+cq "
+( 407,745,117,97,-22,97 2 40 parenleft
+) 407,745,117,0,120 2 41 parenright
+* 500,737,0,48,-8,48 2 42 asterisk
++ 606,506 0 43 plus
+, 287,157,192,0,107 0 44 comma
+- 333,299,0,0,48 0 45 hyphen
+hy "
+. 287,157,15,0,70 0 46 period
+/ 278,737,15,92,91,92 2 47 slash
+sl "
+0 574,705,15,29,29,29 2 48 zero
+1 574,705,0,0,25 2 49 one
+2 574,705,3,14,88,14 2 50 two
+3 574,705,15,12,57,12 2 51 three
+4 574,705,0,20,63,20 2 52 four
+5 574,705,15,50,50,50 2 53 five
+6 574,705,15,50,19,50 2 54 six
+7 574,705,15,69,-14,69 2 55 seven
+8 574,705,15,28,50,28 2 56 eight
+9 574,705,15,19,50,19 2 57 nine
+: 287,477,15,0,70 0 58 colon
+; 287,477,192,0,107 0 59 semicolon
+< 606,515,9 0 60 less
+= 606,403 0 61 equal
+> 606,514,8 0 62 greater
+? 481,737,15,20,-29,20 2 63 question
+@ 747,737,15,54,54,54 2 64 at
+at "
+A 741,737,0,25,125,25 2 65 A
+B 759,722,0,12,100,12 2 66 B
+C 759,737,15,50,13,50 2 67 C
+D 833,722,0,13,97,13 2 68 D
+E 741,722,0,39,91,39 2 69 E
+F 704,722,0,76,91,76 2 70 F
+G 815,737,15,40,13,40 2 71 G
+H 870,722,0,91,91,91 2 72 H
+I 444,722,0,91,91,91 2 73 I
+J 667,722,15,91,70,91 2 74 J
+K 778,722,0,104,91,104 2 75 K
+L 704,722,0,16,91,16 2 76 L
+M 944,722,0,94,94,94 2 77 M
+N 852,722,10,111,111,109 2 78 N
+O 833,737,15,13,13,13 2 79 O
+P 741,722,0,39,91,39 2 80 P
+Q 833,737,189,13,13,13 2 81 Q
+R 796,722,15,3,91,3 2 82 R
+S 685,737,15,31,49,31 2 83 S
+T 722,722,0,87,9,87 2 84 T
+U 833,722,15,117,-38,109 2 85 U
+V 741,722,10,111,18,109 2 86 V
+W 944,722,10,106,10,106 2 87 W
+X 741,722,0,110,132,109 2 88 X
+Y 704,722,0,121,37,109 2 89 Y
+Z 704,722,0,57,83,57 2 90 Z
+[ 407,737,109,107,49,107 2 91 bracketleft
+lB "
+\ 606,737,15,0,-111 2 92 backslash
+rs "
+] 407,737,109,5,151,5 2 93 bracketright
+rB "
+^ 333,705,0,82,27,82 2 94 circumflex
+a^ "
+_ 500,0,125,50,50,50 0 95 underscore
+` 259,737,0,65,3,65 2 96 quoteleft
+oq "
+a 667,477,15,19,44,19 0 97 a
+b 611,737,15,0,21 2 98 b
+c 537,477,15,0,50 0 99 c
+d 667,737,15,43,50,43 2 100 d
+e 519,477,15,10,50,10 0 101 e
+f 389,737,205,211,98,109 3 102 f
+g 611,528,205,43,113,43 1 103 g
+h 685,737,15,4,50,4 2 104 h
+i 389,737,15,6,18,6 2 105 i
+j 370,737,205,27,255,27 3 106 j
+k 648,737,15,0,61 2 107 k
+l 389,737,15,36,18,36 2 108 l
+m 944,477,15,15,50,15 0 109 m
+n 685,477,15,4,50,4 0 110 n
+o 574,477,15,6,50,6 0 111 o
+p 648,477,205,0,169 1 112 p
+q 630,477,205,7,50,7 1 113 q
+r 519,486,0,58,50,58 0 114 r
+s 481,477,15,4,50,4 0 115 s
+t 407,650,15,46,26,46 2 116 t
+u 685,477,15,0,20 0 117 u
+v 556,477,15,0,20 0 118 v
+w 833,477,15,0,20 0 119 w
+x 574,477,15,50,96,50 0 120 x
+y 519,477,205,24,116,24 1 121 y
+z 519,477,15,4,69,4 0 122 z
+{ 407,737,109,51,-2,51 2 123 braceleft
+lC "
+| 606,750,250,0,-199 3 124 bar
+ba "
+} 407,737,109,0,75 2 125 braceright
+rC "
+~ 333,690,0,115,22,109 2 126 tilde
+a~ "
+bq 259,157,192,0,107 0 128 quotesinglbase
+Fo 481,407,0,18,85,18 0 129 guillemotleft
+Fc 481,407,0,22,81,22 0 130 guillemotright
+bu 606,542,0,0,-72 0 131 bullet
+Fn 574,737,205,51,93,51 3 132 florin
+f/ 167,705,15,216,216,109 2 133 fraction
+%0 1167,727,28,30,30,30 2 134 perthousand
+dg 500,737,146,58,2,58 2 135 dagger
+dd 500,737,150,58,110,58 2 136 daggerdbl
+en 500,287,0,29,97,29 0 137 endash
+em 1000,287,0,29,97,29 0 138 emdash
+fi 685,737,205,6,120,6 3 140 fi
+fl 685,737,205,36,120,36 3 141 fl
+.i 389,477,15,6,18,6 0 144 dotlessi
+ga 333,722,0,11,-24,11 2 146 grave
+a" 333,722,0,197,35,109 2 147 hungarumlaut
+a. 333,737,0,28,-95,28 2 148 dotaccent
+ab 333,698,0,107,-17,107 2 149 breve
+ah 333,705,0,120,-10,109 2 150 caron
+ao 333,746,0,52,-61,52 2 151 ring
+ho 333,4,220,55,14,55 1 152 ogonek
+lq 481,737,0,90,-4,90 2 153 quotedblleft
+rq 481,737,0,79,7,79 2 154 quotedblright
+oe 852,477,15,10,56,10 0 155 oe
+/l 389,737,15,48,26,48 2 156 lslash
+Bq 481,157,192,0,107 0 157 quotedblbase
+OE 963,722,0,76,21,76 2 158 OE
+/L 704,722,0,16,91,16 2 159 Lslash
+r! 333,547,205,6,94,6 1 161 exclamdown
+ct 574,578,144,0,20 0 162 cent
+Po 574,705,15,42,68,42 2 163 sterling
+Cs 574,605,0,23,23,23 0 164 currency
+Ye 574,690,0,105,33,105 2 165 yen
+bb 606,675,175,0,-199 2 166 brokenbar
+sc 500,737,146,65,80,65 2 167 section
+ad 333,715,0,110,17,109 2 168 dieresis
+co 747,737,15,53,52,53 2 169 copyright
+Of 412,705,0,98,3,98 2 170 ordfeminine
+fo 278,407,0,16,75,16 0 171 guilsinglleft
+tno 606,403 0 172 logicalnot
+\- 606,307 0 173 minus
+rg 747,737,15,53,52,53 2 174 registered
+a- 333,649,0,121,3,109 2 175 macron
+de 400,705,0,22,-36,22 2 176 degree
+t+- 606,506 0 177 plusminus
+S2 344,705,0,68,67,68 2 178 twosuperior
+S3 344,705,0,67,47,67 2 179 threesuperior
+aa 333,722,0,89,-73,89 2 180 acute
+*m 685,477,205,0,178 1 181 mu
+mc "
+ps 650,722,131,81,25,81 2 182 paragraph
+pc 287,372,0,0,-7 0 183 periodcentered
+ac 333,3,220,0,71 1 184 cedilla
+S1 344,705,0,32,31,32 2 185 onesuperior
+Om 356,705,0,88,8,88 2 186 ordmasculine
+fc 278,407,0,15,76,15 0 187 guilsinglright
+14 861,705,15,0,33 2 188 onequarter
+12 861,705,15,0,33 2 189 onehalf
+34 861,705,15,0,15 2 190 threequarters
+r? 481,547,205,0,50 1 191 questiondown
+`A 741,947,0,25,125,25 2 192 Agrave
+'A 741,947,0,25,125,25 2 193 Aacute
+^A 741,930,0,25,125,25 2 194 Acircumflex
+~A 741,915,0,25,125,25 2 195 Atilde
+:A 741,915,0,25,125,25 2 196 Adieresis
+oA 741,991,0,25,125,25 2 197 Aring
+AE 889,722,0,76,136,76 2 198 AE
+,C 759,737,220,50,13,50 3 199 Ccedilla
+`E 741,947,0,39,91,39 2 200 Egrave
+'E 741,947,0,39,91,39 2 201 Eacute
+^E 741,930,0,39,91,39 2 202 Ecircumflex
+:E 741,915,0,39,91,39 2 203 Edieresis
+`I 444,947,0,91,91,91 2 204 Igrave
+'I 444,947,0,94,91,94 2 205 Iacute
+^I 444,930,0,91,91,91 2 206 Icircumflex
+:I 444,915,0,115,91,109 2 207 Idieresis
+-D 833,722,0,13,97,13 2 208 Eth
+~N 852,915,10,111,111,109 2 209 Ntilde
+`O 833,947,15,13,13,13 2 210 Ograve
+'O 833,947,15,13,13,13 2 211 Oacute
+^O 833,930,15,13,13,13 2 212 Ocircumflex
+~O 833,915,15,13,13,13 2 213 Otilde
+:O 833,915,15,13,13,13 2 214 Odieresis
+tmu 606,491,0,0,-15 0 215 multiply
+/O 833,790,68,15,15,15 2 216 Oslash
+`U 833,947,15,117,-38,109 2 217 Ugrave
+'U 833,947,15,117,-38,109 2 218 Uacute
+^U 833,930,15,117,-38,109 2 219 Ucircumflex
+:U 833,915,15,117,-38,109 2 220 Udieresis
+'Y 704,947,0,121,37,109 2 221 Yacute
+TP 741,722,0,0,91 2 222 Thorn
+ss 574,737,205,16,141,16 3 223 germandbls
+`a 667,722,15,19,44,19 2 224 agrave
+'a 667,722,15,19,44,19 2 225 aacute
+^a 667,705,15,19,44,19 2 226 acircumflex
+~a 667,690,15,19,44,19 2 227 atilde
+:a 667,690,15,19,44,19 2 228 adieresis
+oa 667,746,15,19,44,19 2 229 aring
+ae 815,477,15,10,68,10 0 230 ae
+,c 537,477,220,0,50 1 231 ccedilla
+`e 519,722,15,10,50,10 2 232 egrave
+'e 519,722,15,10,50,10 2 233 eacute
+^e 519,705,15,10,50,10 2 234 ecircumflex
+:e 519,690,15,17,50,17 2 235 edieresis
+`i 389,715,15,6,18,6 2 236 igrave
+'i 389,715,15,31,18,31 2 237 iacute
+^i 389,698,15,24,29,24 2 238 icircumflex
+:i 389,690,15,52,19,52 2 239 idieresis
+Sd 574,752,15,6,50,6 2 240 eth
+~n 685,690,15,4,50,4 2 241 ntilde
+`o 574,722,15,6,50,6 2 242 ograve
+'o 574,722,15,6,50,6 2 243 oacute
+^o 574,705,15,6,50,6 2 244 ocircumflex
+~o 574,690,15,6,50,6 2 245 otilde
+:o 574,690,15,6,50,6 2 246 odieresis
+tdi 606,546,40 0 247 divide
+/o 574,583,121,6,50,6 0 248 oslash
+`u 685,722,15,0,20 2 249 ugrave
+'u 685,722,15,0,20 2 250 uacute
+^u 685,705,15,0,20 2 251 ucircumflex
+:u 685,690,15,0,20 2 252 udieresis
+'y 519,722,205,24,116,24 3 253 yacute
+Tp 648,737,205,0,169 3 254 thorn
+:y 519,690,205,24,116,24 3 255 ydieresis
+u2026 1000,157,15,0,-31 0 256 ellipsis
diff --git a/font/devps/NI b/font/devps/NI
new file mode 100644
index 0000000..c4b676f
--- /dev/null
+++ b/font/devps/NI
@@ -0,0 +1,1222 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName New Century Schoolbook Italic
+# Version 003.001
+# FamilyName New Century Schoolbook
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1991, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Copyright (c) 1985, 1987, 1989, 1991, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:48:41 1999
+# Comment UniqueID 44729
+# Comment VMusage 35170 42106
+
+name NI
+internalname NewCenturySchlbk-Italic
+slant 16
+spacewidth 278
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A C -18
+A ,C -18
+A G -18
+A O -18
+A 'O -18
+A ^O -18
+A :O -18
+A `O -18
+A /O -18
+A ~O -18
+A Q -18
+A T -30
+A U -37
+A 'U -37
+A ^U -37
+A :U -37
+A `U -37
+A V -74
+A W -74
+A Y -55
+A 'Y -55
+A :Y -55
+A rq -125
+A ' -125
+A cq -125
+A u -18
+A 'u -18
+A ^u -18
+A :u -18
+A `u -18
+A v -18
+A w -18
+A y -55
+A 'y -55
+A :y -55
+'A C -18
+'A ,C -18
+'A G -18
+'A O -18
+'A 'O -18
+'A ^O -18
+'A :O -18
+'A `O -18
+'A /O -18
+'A ~O -18
+'A Q -18
+'A T -30
+'A U -37
+'A 'U -37
+'A ^U -37
+'A :U -37
+'A `U -37
+'A V -74
+'A W -74
+'A Y -55
+'A 'Y -55
+'A :Y -55
+'A rq -125
+'A ' -125
+'A cq -125
+'A u -18
+'A 'u -18
+'A ^u -18
+'A :u -18
+'A `u -18
+'A v -18
+'A w -18
+'A y -55
+'A 'y -55
+'A :y -55
+^A C -18
+^A ,C -18
+^A G -18
+^A O -18
+^A 'O -18
+^A ^O -18
+^A :O -18
+^A `O -18
+^A /O -18
+^A ~O -18
+^A Q -18
+^A T -30
+^A U -37
+^A 'U -37
+^A ^U -37
+^A :U -37
+^A `U -37
+^A V -74
+^A W -74
+^A Y -55
+^A 'Y -55
+^A :Y -55
+^A rq -125
+^A ' -125
+^A cq -125
+^A u -18
+^A 'u -18
+^A ^u -18
+^A :u -18
+^A `u -18
+^A v -18
+^A w -18
+^A y -55
+^A 'y -55
+^A :y -55
+:A C -18
+:A ,C -18
+:A G -18
+:A O -18
+:A 'O -18
+:A ^O -18
+:A :O -18
+:A `O -18
+:A /O -18
+:A ~O -18
+:A Q -18
+:A T -30
+:A U -37
+:A 'U -37
+:A ^U -37
+:A :U -37
+:A `U -37
+:A V -74
+:A W -74
+:A Y -55
+:A 'Y -55
+:A :Y -55
+:A rq -125
+:A ' -125
+:A cq -125
+:A u -18
+:A 'u -18
+:A ^u -18
+:A :u -18
+:A `u -18
+:A v -18
+:A w -18
+:A y -55
+:A 'y -55
+:A :y -55
+`A C -18
+`A ,C -18
+`A G -18
+`A O -18
+`A 'O -18
+`A ^O -18
+`A :O -18
+`A `O -18
+`A /O -18
+`A ~O -18
+`A Q -18
+`A T -30
+`A U -37
+`A 'U -37
+`A ^U -37
+`A :U -37
+`A `U -37
+`A V -74
+`A W -74
+`A Y -55
+`A 'Y -55
+`A :Y -55
+`A rq -125
+`A ' -125
+`A cq -125
+`A u -18
+`A 'u -18
+`A ^u -18
+`A :u -18
+`A `u -18
+`A v -18
+`A w -18
+`A y -55
+`A 'y -55
+`A :y -55
+oA C -18
+oA ,C -18
+oA G -18
+oA O -18
+oA 'O -18
+oA ^O -18
+oA :O -18
+oA `O -18
+oA /O -18
+oA ~O -18
+oA Q -18
+oA T -30
+oA U -37
+oA 'U -37
+oA ^U -37
+oA :U -37
+oA `U -37
+oA V -74
+oA W -74
+oA Y -55
+oA 'Y -55
+oA :Y -55
+oA rq -125
+oA ' -125
+oA cq -125
+oA u -18
+oA 'u -18
+oA ^u -18
+oA :u -18
+oA `u -18
+oA v -18
+oA w -18
+oA y -55
+oA 'y -55
+oA :y -55
+~A C -18
+~A ,C -18
+~A G -18
+~A O -18
+~A 'O -18
+~A ^O -18
+~A :O -18
+~A `O -18
+~A /O -18
+~A ~O -18
+~A Q -18
+~A T -30
+~A U -37
+~A 'U -37
+~A ^U -37
+~A :U -37
+~A `U -37
+~A V -74
+~A W -74
+~A Y -55
+~A 'Y -55
+~A :Y -55
+~A rq -125
+~A ' -125
+~A cq -125
+~A u -18
+~A 'u -18
+~A ^u -18
+~A :u -18
+~A `u -18
+~A v -18
+~A w -18
+~A y -55
+~A 'y -55
+~A :y -55
+B , -50
+B . -50
+B u2026 -50
+C , -50
+C . -50
+C u2026 -50
+,C , -50
+,C . -50
+,C u2026 -50
+D V -18
+D W -18
+D Y -18
+D 'Y -18
+D :Y -18
+D , -50
+D . -50
+D u2026 -50
+F A -35
+F 'A -35
+F ^A -35
+F :A -35
+F `A -35
+F oA -35
+F ~A -35
+F a -55
+F 'a -55
+F ^a -55
+F :a -55
+F `a -55
+F oa -55
+F ~a -55
+F , -125
+F e -55
+F 'e -55
+F ^e -55
+F :e -55
+F `e -55
+F i -10
+F 'i -10
+F ^i -10
+F :i -10
+F `i -10
+F o -55
+F 'o -55
+F ^o -55
+F :o -55
+F `o -55
+F /o -55
+F ~o -55
+F . -125
+F u2026 -125
+F r -55
+G , -50
+G . -50
+G u2026 -50
+J A -18
+J 'A -18
+J ^A -18
+J :A -18
+J `A -18
+J oA -18
+J ~A -18
+J a -37
+J 'a -37
+J ^a -37
+J :a -37
+J `a -37
+J oa -37
+J ~a -37
+J , -100
+J e -37
+J 'e -37
+J ^e -37
+J :e -37
+J `e -37
+J o -37
+J 'o -37
+J ^o -37
+J :o -37
+J `o -37
+J /o -37
+J ~o -37
+J . -100
+J u2026 -100
+J u -18
+J 'u -18
+J ^u -18
+J :u -18
+J `u -18
+L T -100
+L V -100
+L W -100
+L Y -100
+L 'Y -100
+L :Y -100
+L rq -125
+L ' -125
+L cq -125
+L y -50
+L 'y -50
+L :y -50
+/L T -100
+/L V -100
+/L W -100
+/L Y -100
+/L 'Y -100
+/L :Y -100
+/L rq -125
+/L ' -125
+/L cq -125
+/L y -50
+/L 'y -50
+/L :y -50
+N , -60
+N . -60
+N u2026 -60
+~N , -60
+~N . -60
+~N u2026 -60
+O T 18
+O V -18
+O X -18
+O Y -18
+O 'Y -18
+O :Y -18
+O , -50
+O . -50
+O u2026 -50
+'O T 18
+'O V -18
+'O X -18
+'O Y -18
+'O 'Y -18
+'O :Y -18
+'O , -50
+'O . -50
+'O u2026 -50
+^O T 18
+^O V -18
+^O X -18
+^O Y -18
+^O 'Y -18
+^O :Y -18
+^O , -50
+^O . -50
+^O u2026 -50
+:O T 18
+:O V -18
+:O X -18
+:O Y -18
+:O 'Y -18
+:O :Y -18
+:O , -50
+:O . -50
+:O u2026 -50
+`O T 18
+`O V -18
+`O X -18
+`O Y -18
+`O 'Y -18
+`O :Y -18
+`O , -50
+`O . -50
+`O u2026 -50
+/O T 18
+/O V -18
+/O X -18
+/O Y -18
+/O 'Y -18
+/O :Y -18
+/O , -50
+/O . -50
+/O u2026 -50
+~O T 18
+~O V -18
+~O X -18
+~O Y -18
+~O 'Y -18
+~O :Y -18
+~O , -50
+~O . -50
+~O u2026 -50
+P A -50
+P 'A -50
+P ^A -50
+P :A -50
+P `A -50
+P oA -50
+P ~A -50
+P a -55
+P 'a -55
+P ^a -55
+P :a -55
+P `a -55
+P oa -55
+P ~a -55
+P , -125
+P e -55
+P 'e -55
+P ^e -55
+P :e -55
+P `e -55
+P o -55
+P 'o -55
+P ^o -55
+P :o -55
+P `o -55
+P /o -55
+P ~o -55
+P . -125
+P u2026 -125
+Q , -20
+Q . -20
+Q u2026 -20
+R U -18
+R 'U -18
+R ^U -18
+R :U -18
+R `U -18
+R V -18
+R W -18
+R Y -18
+R 'Y -18
+R :Y -18
+S , -50
+S . -50
+S u2026 -50
+vS , -50
+vS . -50
+vS u2026 -50
+T O 18
+T 'O 18
+T ^O 18
+T :O 18
+T `O 18
+T /O 18
+T ~O 18
+T a -74
+T 'a -74
+T ^a -74
+T :a -74
+T `a -74
+T oa -74
+T ~a -74
+T : -50
+T , -100
+T e -74
+T 'e -74
+T ^e -34
+T :e -34
+T `e -34
+T h -25
+T - -100
+T hy -100
+T i -18
+T 'i -18
+T ^i -18
+T o -74
+T 'o -74
+T ^o -74
+T :o -34
+T `o -34
+T /o -74
+T ~o -34
+T . -100
+T u2026 -100
+T r -50
+T ; -50
+T u -50
+T 'u -50
+T ^u -50
+T :u -50
+T `u -50
+T w -50
+T y -50
+T 'y -50
+T :y -50
+U A -18
+U 'A -18
+U ^A -18
+U :A -18
+U `A -18
+U oA -18
+U ~A -18
+U , -100
+U . -100
+U u2026 -100
+'U A -18
+'U 'A -18
+'U ^A -18
+'U :A -18
+'U `A -18
+'U oA -18
+'U ~A -18
+'U , -100
+'U . -100
+'U u2026 -100
+^U A -18
+^U 'A -18
+^U ^A -18
+^U :A -18
+^U `A -18
+^U oA -18
+^U ~A -18
+^U , -100
+^U . -100
+^U u2026 -100
+:U A -18
+:U 'A -18
+:U ^A -18
+:U :A -18
+:U `A -18
+:U oA -18
+:U ~A -18
+:U , -100
+:U . -100
+:U u2026 -100
+`U A -18
+`U 'A -18
+`U ^A -18
+`U :A -18
+`U `A -18
+`U oA -18
+`U ~A -18
+`U , -100
+`U . -100
+`U u2026 -100
+V A -37
+V 'A -37
+V ^A -37
+V :A -37
+V `A -37
+V oA -37
+V ~A -37
+V a -75
+V 'a -75
+V ^a -75
+V :a -75
+V `a -75
+V oa -75
+V ~a -75
+V : -75
+V , -100
+V e -75
+V 'e -75
+V ^e -35
+V :e -35
+V `e -35
+V - -100
+V hy -100
+V i -50
+V 'i -50
+V ^i -10
+V :i -10
+V `i -10
+V o -75
+V 'o -75
+V ^o -75
+V :o -35
+V `o -35
+V /o -75
+V ~o -35
+V . -100
+V u2026 -100
+V ; -75
+V u -75
+V 'u -75
+V ^u -75
+V :u -75
+V `u -75
+W A -55
+W 'A -55
+W ^A -55
+W :A -55
+W `A -55
+W oA -55
+W ~A -55
+W a -55
+W 'a -55
+W ^a -55
+W :a -55
+W `a -55
+W oa -55
+W ~a -55
+W : -75
+W , -100
+W e -55
+W 'e -55
+W ^e -55
+W :e -35
+W `e -35
+W h -20
+W - -75
+W hy -75
+W i -20
+W 'i -20
+W ^i -20
+W o -55
+W 'o -55
+W ^o -55
+W :o -55
+W `o -55
+W /o -55
+W ~o -55
+W . -100
+W u2026 -100
+W ; -75
+W u -55
+W 'u -55
+W ^u -55
+W :u -55
+W `u -55
+W y -55
+W 'y -55
+W :y -55
+Y A -55
+Y 'A -55
+Y ^A -55
+Y :A -55
+Y `A -55
+Y oA -55
+Y ~A -55
+Y a -100
+Y 'a -100
+Y ^a -100
+Y :a -60
+Y `a -60
+Y oa -100
+Y ~a -100
+Y : -75
+Y , -100
+Y e -100
+Y 'e -100
+Y ^e -60
+Y :e -60
+Y `e -60
+Y - -100
+Y hy -100
+Y i -25
+Y 'i -25
+Y o -100
+Y 'o -100
+Y ^o -100
+Y :o -60
+Y `o -60
+Y /o -100
+Y ~o -60
+Y . -100
+Y u2026 -100
+Y ; -75
+Y u -100
+Y 'u -100
+Y ^u -100
+Y :u -100
+Y `u -100
+'Y A -55
+'Y 'A -55
+'Y ^A -55
+'Y :A -55
+'Y `A -55
+'Y oA -55
+'Y ~A -55
+'Y a -100
+'Y 'a -100
+'Y ^a -100
+'Y :a -60
+'Y `a -60
+'Y oa -100
+'Y ~a -100
+'Y : -75
+'Y , -100
+'Y e -100
+'Y 'e -100
+'Y ^e -60
+'Y :e -60
+'Y `e -60
+'Y - -100
+'Y hy -100
+'Y i -25
+'Y 'i -25
+'Y o -100
+'Y 'o -100
+'Y ^o -60
+'Y :o -60
+'Y `o -60
+'Y /o -100
+'Y ~o -60
+'Y . -100
+'Y u2026 -100
+'Y ; -75
+'Y u -100
+'Y 'u -100
+'Y ^u -100
+'Y :u -100
+'Y `u -100
+:Y A -55
+:Y 'A -55
+:Y ^A -55
+:Y :A -55
+:Y `A -55
+:Y oA -55
+:Y ~A -55
+:Y a -100
+:Y 'a -100
+:Y ^a -100
+:Y :a -60
+:Y `a -60
+:Y oa -100
+:Y ~a -100
+:Y : -75
+:Y , -100
+:Y e -100
+:Y 'e -100
+:Y ^e -60
+:Y :e -60
+:Y `e -60
+:Y - -100
+:Y hy -100
+:Y i -25
+:Y 'i -25
+:Y o -100
+:Y 'o -100
+:Y ^o -100
+:Y :o -60
+:Y `o -60
+:Y /o -100
+:Y ~o -60
+:Y . -100
+:Y u2026 -100
+:Y ; -75
+:Y u -100
+:Y 'u -100
+:Y ^u -100
+:Y :u -100
+:Y `u -100
+b b -10
+b , -50
+b . -50
+b u2026 -50
+c , -50
+c h -18
+c k -18
+c . -50
+c u2026 -50
+,c , -50
+,c h -18
+,c k -18
+,c . -50
+,c u2026 -50
+: u0020 -37
+, rq -37
+, ' -37
+, cq -37
+, u0020 -37
+e , -37
+e . -37
+e u2026 -37
+'e , -37
+'e . -37
+'e u2026 -37
+^e , -37
+^e . -37
+^e u2026 -37
+:e , -37
+:e . -37
+:e u2026 -37
+`e , -37
+`e . -37
+`e u2026 -37
+f , -75
+f o -10
+f 'o -10
+f ^o -10
+f :o -10
+f `o -10
+f /o -10
+f ~o -10
+f . -75
+f u2026 -75
+f rq 75
+f ' 75
+f cq 75
+g , -50
+g . -50
+g u2026 -50
+l y -10
+l 'y -10
+l :y -10
+/l y -10
+/l 'y -10
+/l :y -10
+o , -50
+o . -50
+o u2026 -50
+'o , -50
+'o . -50
+'o u2026 -50
+^o , -50
+^o . -50
+^o u2026 -50
+:o , -50
+:o . -50
+:o u2026 -50
+`o , -50
+`o . -50
+`o u2026 -50
+/o , -50
+/o . -50
+/o u2026 -50
+~o , -50
+~o . -50
+~o u2026 -50
+p , -50
+p . -50
+p u2026 -50
+. rq -37
+u2026 rq -37
+. ' -37
+u2026 ' -37
+. cq -37
+u2026 cq -37
+. u0020 -37
+u2026 u0020 -37
+lq A -75
+lq 'A -75
+lq ^A -75
+lq :A -75
+lq `A -75
+lq oA -75
+lq ~A -75
+rq u0020 -37
+` A -75
+oq A -75
+` 'A -75
+oq 'A -75
+` ^A -75
+oq ^A -75
+` :A -75
+oq :A -75
+` `A -75
+oq `A -75
+` oA -75
+oq oA -75
+` ~A -75
+oq ~A -75
+` ` -37
+` oq -37
+oq ` -37
+oq oq -37
+' d -37
+cq d -37
+' ' -37
+' cq -37
+cq ' -37
+cq cq -37
+' s -25
+cq s -25
+' vs -25
+cq vs -25
+r : -25
+r , -125
+r - -75
+r hy -75
+r k -18
+r . -125
+r u2026 -125
+r s -10
+r vs -10
+r ; -25
+s , -50
+s . -50
+s u2026 -50
+vs , -50
+vs . -50
+vs u2026 -50
+; u0020 -37
+u0020 A -37
+u0020 'A -37
+u0020 ^A -37
+u0020 :A -37
+u0020 `A -37
+u0020 oA -37
+u0020 ~A -37
+u0020 T -37
+u0020 V -37
+u0020 W -37
+u0020 Y -37
+u0020 'Y -37
+u0020 :Y -37
+u0020 lq -37
+u0020 ` -37
+u0020 oq -37
+v , -75
+v . -75
+v u2026 -75
+w , -75
+w . -75
+w u2026 -75
+y , -75
+y . -75
+y u2026 -75
+'y , -75
+'y . -75
+'y u2026 -75
+:y , -75
+:y . -75
+:y u2026 -75
+
+charset
+ha 606,690,0,0,-39 2 0 asciicircum
+ti 606,322,0,0,-22 0 1 asciitilde
+vS 667,946,15,21,56,21 2 2 Scaron
+vZ 667,946,0,50,75,50 2 3 Zcaron
+vs 444,690,15,40,48,40 2 4 scaron
+vz 463,690,15,30,83,30 2 5 zcaron
+:Y 685,902,0,125,19,107 2 6 Ydieresis
+tm 950,722,0,68,18,68 2 7 trademark
+aq 278,737,0,9,-101,9 2 8 quotesingle
+Eu 556,705,16,101,75,101 2 9 Euro
+space 278 0 32 space
+! 333,737,15,20,33,20 2 33 exclam
+" 400,737,0,13,-77,13 2 34 quotedbl
+dq "
+# 556,690,0,22,22,22 2 35 numbersign
+sh "
+$ 556,808,142,30,46,30 2 36 dollar
+Do "
+% 833,705,15,7,7,7 2 37 percent
+& 852,737,15,0,26 2 38 ampersand
+' 204,737,0,75,11,75 2 39 quoteright
+cq "
+( 333,745,117,128,-3,107 2 40 parenleft
+) 333,745,117,0,143 2 41 parenright
+* 500,737,0,50,-30,50 2 42 asterisk
++ 606,506 0 43 plus
+, 278,109,165,0,89 0 44 comma
+- 333,274,0,0,18 0 45 hyphen
+hy "
+. 278,109,15,0,33 0 46 period
+/ 606,737,15,0,-82 2 47 slash
+sl "
+0 556,705,15,20,20,20 2 48 zero
+1 556,705 2 49 one
+2 556,705,0,0,87 2 50 two
+3 556,705,15,0,52 2 51 three
+4 556,705,0,6,58,6 2 52 four
+5 556,705,15,34,46,34 2 53 five
+6 556,705,15,42,14,42 2 54 six
+7 556,705,15,55,-19,55 2 55 seven
+8 556,705,15,20,44,20 2 56 eight
+9 556,705,15,14,42,14 2 57 nine
+: 278,466,15,1,33,1 0 58 colon
+; 278,466,165,1,89,1 0 59 semicolon
+< 606,514,8,0,14 0 60 less
+= 606,389 0 61 equal
+> 606,514,8,14,-14,14 0 62 greater
+? 444,737,15,23,-52,23 2 63 question
+@ 747,737,15,53,52,53 2 64 at
+at "
+A 704,737,0,14,137,14 2 65 A
+B 722,722,0,0,83 2 66 B
+C 722,737,15,40,10,40 2 67 C
+D 778,722,0,10,83,10 2 68 D
+E 722,722,0,28,83,28 2 69 E
+F 667,722,0,83,83,83 2 70 F
+G 778,737,15,35,10,35 2 71 G
+H 833,722,0,83,83,83 2 72 H
+I 407,722,0,78,83,78 2 73 I
+J 611,722,15,90,64,90 2 74 J
+K 741,722,0,125,83,107 2 75 K
+L 667,722,0,10,83,10 2 76 L
+M 944,722,0,83,83,83 2 77 M
+N 815,722,15,101,101,101 2 78 N
+O 778,737,15,10,10,10 2 79 O
+P 667,722,0,50,83,50 2 80 P
+Q 778,737,190,10,10,10 2 81 Q
+R 741,722,15,1,95,1 2 82 R
+S 667,737,15,21,56,21 2 83 S
+T 685,722,0,90,10,90 2 84 T
+U 815,722,15,102,-43,102 2 85 U
+V 704,722,10,125,14,107 2 86 V
+W 926,722,10,102,-3,102 2 87 W
+X 704,722,0,125,125,107 2 88 X
+Y 685,722,0,125,19,107 2 89 Y
+Z 667,722,0,50,75,50 2 90 Z
+[ 333,737,109,105,105,105 2 91 bracketleft
+lB "
+\ 606,737,15,0,-82 2 92 backslash
+rs "
+] 333,737,109,83,127,83 2 93 bracketright
+rB "
+^ 333,690,0,48,13,48 2 94 circumflex
+a^ "
+_ 500,0,125,50,50,50 0 95 underscore
+` 204,737,0,75,11,75 2 96 quoteleft
+oq "
+a 574,466,15,0,48 0 97 a
+b 556,737,15,0,18 2 98 b
+c 444,466,15,0,48 0 99 c
+d 611,737,15,24,48,24 2 100 d
+e 444,466,15,0,56 0 101 e
+f 333,737,205,187,118,107 3 102 f
+g 537,497,205,36,129,36 1 103 g
+h 611,737,15,1,36,1 2 104 h
+i 333,715,15,0,21 2 105 i
+j 315,715,205,53,216,53 3 106 j
+k 556,737,15,0,50 2 107 k
+l 333,737,15,9,36,9 2 108 l
+m 889,466,15,1,36,1 0 109 m
+n 611,466,15,1,36,1 0 110 n
+o 500,466,15,0,48 0 111 o
+p 574,466,205,0,151 1 112 p
+q 556,466,205,0,48 1 113 q
+r 444,466,0,40,40,40 0 114 r
+s 444,466,15,0,48 0 115 s
+t 352,619,15,26,26,26 2 116 t
+u 611,466,15,0,6 0 117 u
+v 519,466,15,0,19 0 118 v
+w 778,466,15,0,19 0 119 w
+x 500,466,15,21,83,21 0 120 x
+y 500,466,205,0,133 1 121 y
+z 463,466,15,3,83,3 0 122 z
+{ 333,737,109,111,12,107 2 123 braceleft
+lC "
+| 606,750,250,0,-217 3 124 bar
+ba "
+} 333,737,109,0,137 2 125 braceright
+rC "
+~ 333,649,0,100,-2,100 2 126 tilde
+a~ "
+bq 204,109,165,0,128 0 128 quotesinglbase
+Fo 426,402,0,26,65,26 0 129 guillemotleft
+Fc 426,402,0,26,65,26 0 130 guillemotright
+bu 606,542,0,0,-72 0 131 bullet
+Fn 556,737,205,63,108,63 3 132 florin
+f/ 167,705,15,184,184,107 2 133 fraction
+%0 1000,705,15,44,44,44 2 134 perthousand
+dg 500,737,147,56,-1,56 2 135 dagger
+dd 500,737,147,56,104,56 2 136 daggerdbl
+en 500,268,0,37,77,37 0 137 endash
+em 1000,268,0,37,77,37 0 138 emdash
+fi 611,737,205,0,118 3 140 fi
+fl 611,737,205,26,118,26 3 141 fl
+.i 333,466,15,0,21 0 144 dotlessi
+ga 333,690,0,0,-21 2 146 grave
+a" 333,690,0,172,18,107 2 147 hungarumlaut
+a. 333,715,0,0,-96 2 148 dotaccent
+ab 333,677,0,87,-19,87 2 149 breve
+ah 333,690,0,95,-23,95 2 150 caron
+ao 333,712,0,31,-64,31 2 151 ring
+ho 333,4,220,51,4,51 1 152 ogonek
+lq 389,737,0,67,11,67 2 153 quotedblleft
+rq 389,737,0,67,11,67 2 154 quotedblright
+oe 778,466,15,0,48 0 155 oe
+/l 333,737,15,11,52,11 2 156 lslash
+Bq 389,109,165,0,128 0 157 quotedblbase
+OE 981,722,0,44,10,44 2 158 OE
+/L 667,722,0,10,83,10 2 159 Lslash
+r! 333,547,205,0,72 1 161 exclamdown
+ct 556,580,144,0,-12 0 162 cent
+Po 556,705,15,38,63,38 2 163 sterling
+Cs 556,597,0,24,24,24 0 164 currency
+Ye 556,690,0,118,10,107 2 165 yen
+bb 606,675,175,0,-217 2 166 brokenbar
+sc 500,737,147,30,60,30 2 167 section
+ad 333,708,0,76,-9,76 2 168 dieresis
+co 747,737,15,53,52,53 2 169 copyright
+Of 422,705,0,48,-22,48 2 170 ordfeminine
+fo 333,402,0,0,10 0 171 guilsinglleft
+tno 606,389 0 172 logicalnot
+\- 606,289 0 173 minus
+rg 747,737,15,53,52,53 2 174 registered
+a- 333,610,0,80,-2,80 0 175 macron
+de 400,705,0,22,-36,22 2 176 degree
+t+- 606,506 0 177 plusminus
+S2 333,705,0,76,50,76 2 178 twosuperior
+S3 333,705,0,76,28,76 2 179 threesuperior
+aa 333,690,0,72,-82,72 2 180 acute
+*m 611,466,205,0,150 1 181 mu
+mc "
+ps 650,722,132,65,2,65 2 182 paragraph
+pc 278,374,0,0,-21 0 183 periodcentered
+ac 333,0,215,0,47 1 184 cedilla
+S1 333,705,0,28,16,28 2 185 onesuperior
+Om 372,705,0,48,-16,48 2 186 ordmasculine
+fc 333,402,0,0,10 0 187 guilsinglright
+14 834,705,15,0,16 2 188 onequarter
+12 834,705,15,0,16 2 189 onehalf
+34 834,705,15,0,28 2 190 threequarters
+r? 444,547,205,0,53 1 191 questiondown
+`A 704,946,0,14,137,14 2 192 Agrave
+'A 704,946,0,14,137,14 2 193 Aacute
+^A 704,946,0,14,137,14 2 194 Acircumflex
+~A 704,905,0,14,137,14 2 195 Atilde
+:A 704,902,0,14,137,14 2 196 Adieresis
+oA 704,958,0,14,137,14 2 197 Aring
+AE 870,722,0,68,137,68 2 198 AE
+,C 722,737,215,40,10,40 3 199 Ccedilla
+`E 722,946,0,28,83,28 2 200 Egrave
+'E 722,946,0,28,83,28 2 201 Eacute
+^E 722,946,0,28,83,28 2 202 Ecircumflex
+:E 722,902,0,28,83,28 2 203 Edieresis
+`I 407,946,0,78,83,78 2 204 Igrave
+'I 407,946,0,95,83,95 2 205 Iacute
+^I 407,946,0,78,83,78 2 206 Icircumflex
+:I 407,902,0,99,83,99 2 207 Idieresis
+-D 778,722,0,10,83,10 2 208 Eth
+~N 815,905,15,101,101,101 2 209 Ntilde
+`O 778,946,15,10,10,10 2 210 Ograve
+'O 778,946,15,10,10,10 2 211 Oacute
+^O 778,946,15,10,10,10 2 212 Ocircumflex
+~O 778,905,15,10,10,10 2 213 Otilde
+:O 778,902,15,10,10,10 2 214 Odieresis
+tmu 606,482,0,0,-24 0 215 multiply
+/O 778,780,68,20,34,20 2 216 Oslash
+`U 815,946,15,102,-43,102 2 217 Ugrave
+'U 815,946,15,102,-43,102 2 218 Uacute
+^U 815,946,15,102,-43,102 2 219 Ucircumflex
+:U 815,902,15,102,-43,102 2 220 Udieresis
+'Y 685,946,0,125,19,107 2 221 Yacute
+TP 667,722,0,10,83,10 2 222 Thorn
+ss 556,737,205,19,126,19 3 223 germandbls
+`a 574,690,15,0,48 2 224 agrave
+'a 574,690,15,0,48 2 225 aacute
+^a 574,690,15,0,48 2 226 acircumflex
+~a 574,649,15,0,48 2 227 atilde
+:a 574,646,15,0,48 2 228 adieresis
+oa 574,712,15,0,48 2 229 aring
+ae 722,466,15,0,68 0 230 ae
+,c 444,466,215,0,48 1 231 ccedilla
+`e 444,690,15,0,56 2 232 egrave
+'e 444,690,15,17,56,17 2 233 eacute
+^e 444,690,15,0,56 2 234 ecircumflex
+:e 444,646,15,21,56,21 2 235 edieresis
+`i 333,690,15,0,21 2 236 igrave
+'i 333,690,15,72,21,72 2 237 iacute
+^i 333,690,15,48,21,48 2 238 icircumflex
+:i 333,646,15,76,21,76 2 239 idieresis
+Sd 500,737,15,0,48 2 240 eth
+~n 611,649,15,1,36,1 2 241 ntilde
+`o 500,690,15,0,48 2 242 ograve
+'o 500,690,15,0,48 2 243 oacute
+^o 500,690,15,0,48 2 244 ocircumflex
+~o 500,649,15,17,48,17 2 245 otilde
+:o 500,646,15,0,48 2 246 odieresis
+tdi 606,528,22 0 247 divide
+/o 500,549,121,0,48 0 248 oslash
+`u 611,690,15,0,6 2 249 ugrave
+'u 611,690,15,0,6 2 250 uacute
+^u 611,690,15,0,6 2 251 ucircumflex
+:u 611,646,15,0,6 2 252 udieresis
+'y 500,690,205,0,133 3 253 yacute
+Tp 574,737,205,0,151 3 254 thorn
+:y 500,646,205,0,133 3 255 ydieresis
+u2026 1000,109,15,0,-9 0 256 ellipsis
diff --git a/font/devps/NR b/font/devps/NR
new file mode 100644
index 0000000..3446593
--- /dev/null
+++ b/font/devps/NR
@@ -0,0 +1,1175 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName New Century Schoolbook Roman
+# Version 003.001
+# FamilyName New Century Schoolbook
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1991, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Copyright (c) 1985, 1987, 1989, 1991, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:45:59 1999
+# Comment UniqueID 44728
+# Comment VMusage 33757 40693
+
+name NR
+internalname NewCenturySchlbk-Roman
+spacewidth 278
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A T -18
+A U -30
+A 'U -30
+A ^U -30
+A :U -30
+A `U -30
+A V -75
+A W -50
+A Y -75
+A 'Y -75
+A :Y -75
+A rq -74
+A ' -74
+A cq -74
+A v -37
+A w -25
+A y -37
+A 'y -37
+A :y -37
+'A T -18
+'A U -30
+'A 'U -30
+'A ^U -30
+'A :U -30
+'A `U -30
+'A V -75
+'A W -50
+'A Y -75
+'A 'Y -75
+'A :Y -75
+'A rq -74
+'A ' -74
+'A cq -74
+'A v -37
+'A w -25
+'A y -37
+'A 'y -37
+'A :y -37
+^A T -18
+^A U -30
+^A 'U -30
+^A ^U -30
+^A :U -30
+^A `U -30
+^A V -75
+^A W -50
+^A Y -75
+^A 'Y -75
+^A :Y -75
+^A rq -74
+^A ' -74
+^A cq -74
+^A v -37
+^A w -25
+^A y -37
+^A 'y -37
+^A :y -37
+:A T -18
+:A U -30
+:A 'U -30
+:A ^U -30
+:A :U -30
+:A `U -30
+:A V -75
+:A W -50
+:A Y -75
+:A 'Y -75
+:A :Y -75
+:A rq -74
+:A ' -74
+:A cq -74
+:A v -37
+:A w -25
+:A y -37
+:A 'y -37
+:A :y -37
+`A T -18
+`A U -30
+`A 'U -30
+`A ^U -30
+`A :U -30
+`A `U -30
+`A V -75
+`A W -50
+`A Y -75
+`A 'Y -75
+`A :Y -75
+`A rq -74
+`A ' -74
+`A cq -74
+`A v -37
+`A w -25
+`A y -37
+`A 'y -37
+`A :y -37
+oA T -18
+oA U -30
+oA 'U -30
+oA ^U -30
+oA :U -30
+oA `U -30
+oA V -75
+oA W -50
+oA Y -75
+oA 'Y -75
+oA :Y -75
+oA rq -74
+oA ' -74
+oA cq -74
+oA v -37
+oA w -25
+oA y -37
+oA 'y -37
+oA :y -37
+~A T -18
+~A U -30
+~A 'U -30
+~A ^U -30
+~A :U -30
+~A `U -30
+~A V -75
+~A W -50
+~A Y -75
+~A 'Y -75
+~A :Y -75
+~A rq -74
+~A ' -74
+~A cq -74
+~A v -37
+~A w -25
+~A y -37
+~A 'y -37
+~A :y -37
+B A -18
+B 'A -18
+B ^A -18
+B :A -18
+B `A -18
+B oA -18
+B ~A -18
+B , -37
+B . -37
+B u2026 -37
+C A -18
+C 'A -18
+C ^A -18
+C :A -18
+C `A -18
+C oA -18
+C ~A -18
+C , -37
+C . -37
+C u2026 -37
+,C A -18
+,C 'A -18
+,C ^A -18
+,C :A -18
+,C `A -18
+,C oA -18
+,C ~A -18
+,C , -37
+,C . -37
+,C u2026 -37
+D V -18
+D Y -18
+D 'Y -18
+D :Y -18
+D , -37
+D . -37
+D u2026 -37
+F A -50
+F 'A -50
+F ^A -50
+F :A -50
+F `A -50
+F oA -50
+F ~A -50
+F a -65
+F 'a -65
+F ^a -65
+F :a -65
+F `a -65
+F oa -65
+F ~a -65
+F , -125
+F e -55
+F 'e -55
+F ^e -55
+F :e -55
+F `e -55
+F i -10
+F 'i -10
+F ^i -10
+F :i -10
+F `i -10
+F o -55
+F 'o -55
+F ^o -55
+F :o -55
+F `o -55
+F /o -55
+F ~o -55
+F . -125
+F u2026 -125
+F r -10
+G , -37
+G . -37
+G u2026 -37
+J A -18
+J 'A -18
+J ^A -18
+J :A -18
+J `A -18
+J oA -18
+J ~A -18
+J a -25
+J 'a -25
+J ^a -25
+J :a -25
+J `a -25
+J oa -25
+J ~a -25
+J , -74
+J e -25
+J 'e -25
+J ^e -25
+J :e -25
+J `e -25
+J o -25
+J 'o -25
+J ^o -25
+J :o -25
+J `o -25
+J /o -25
+J ~o -25
+J . -74
+J u2026 -74
+J u -25
+J 'u -25
+J ^u -25
+J :u -25
+J `u -25
+K e 10
+K 'e 10
+K ^e 10
+K :e 10
+K `e 10
+K o 10
+K 'o 10
+K ^o 10
+K :o 10
+K `o 10
+K /o 10
+K ~o 10
+K y -25
+K 'y -25
+K :y -25
+L T -75
+L V -91
+L W -74
+L Y -74
+L 'Y -74
+L :Y -74
+L rq -100
+L ' -100
+L cq -100
+L y -25
+L 'y -25
+L :y -25
+/L T -75
+/L V -91
+/L W -74
+/L Y -74
+/L 'Y -74
+/L :Y -74
+/L rq -100
+/L ' -100
+/L cq -100
+/L y -25
+/L 'y -25
+/L :y -25
+N , -55
+N . -55
+N u2026 -55
+~N , -55
+~N . -55
+~N u2026 -55
+O T 10
+O V -18
+O Y -18
+O 'Y -18
+O :Y -18
+O , -37
+O . -37
+O u2026 -37
+'O T 10
+'O V -18
+'O Y -18
+'O 'Y -18
+'O :Y -18
+'O , -37
+'O . -37
+'O u2026 -37
+^O T 10
+^O V -18
+^O Y -18
+^O 'Y -18
+^O :Y -18
+^O , -37
+^O . -37
+^O u2026 -37
+:O T 10
+:O V -18
+:O Y -18
+:O 'Y -18
+:O :Y -18
+:O , -37
+:O . -37
+:O u2026 -37
+`O T 10
+`O V -18
+`O Y -18
+`O 'Y -18
+`O :Y -18
+`O , -37
+`O . -37
+`O u2026 -37
+/O T 10
+/O V -18
+/O Y -18
+/O 'Y -18
+/O :Y -18
+/O , -37
+/O . -37
+/O u2026 -37
+~O T 10
+~O V -18
+~O Y -18
+~O 'Y -18
+~O :Y -18
+~O , -37
+~O . -37
+~O u2026 -37
+P A -55
+P 'A -55
+P ^A -55
+P :A -55
+P `A -55
+P oA -55
+P ~A -55
+P a -37
+P 'a -37
+P ^a -37
+P :a -37
+P `a -37
+P oa -37
+P ~a -37
+P , -125
+P e -37
+P 'e -37
+P ^e -37
+P :e -37
+P `e -37
+P o -37
+P 'o -37
+P ^o -37
+P :o -37
+P `o -37
+P /o -37
+P ~o -37
+P . -125
+P u2026 -125
+Q , -25
+Q . -25
+Q u2026 -25
+S , -37
+S . -37
+S u2026 -37
+vS , -37
+vS . -37
+vS u2026 -37
+T A -18
+T 'A -18
+T ^A -18
+T :A -18
+T `A -18
+T oA -18
+T ~A -18
+T O 10
+T 'O 10
+T ^O 10
+T :O 10
+T `O 10
+T /O 10
+T ~O 10
+T a -55
+T 'a -55
+T ^a -55
+T :a -55
+T `a -55
+T oa -55
+T ~a -55
+T : -37
+T , -125
+T e -55
+T 'e -55
+T ^e -55
+T :e -55
+T `e -55
+T - -100
+T hy -100
+T o -55
+T 'o -55
+T ^o -55
+T :o -55
+T `o -55
+T /o -55
+T ~o -55
+T . -125
+T u2026 -125
+T ; -37
+U A -30
+U 'A -30
+U ^A -30
+U :A -30
+U `A -30
+U oA -30
+U ~A -30
+U , -100
+U . -100
+U u2026 -100
+'U A -30
+'U 'A -30
+'U ^A -30
+'U :A -30
+'U `A -30
+'U oA -30
+'U ~A -30
+'U , -100
+'U . -100
+'U u2026 -100
+^U A -30
+^U 'A -30
+^U ^A -30
+^U :A -30
+^U `A -30
+^U oA -30
+^U ~A -30
+^U , -100
+^U . -100
+^U u2026 -100
+:U A -30
+:U 'A -30
+:U ^A -30
+:U :A -30
+:U `A -30
+:U oA -30
+:U ~A -30
+:U , -100
+:U . -100
+:U u2026 -100
+`U A -30
+`U 'A -30
+`U ^A -30
+`U :A -30
+`U `A -30
+`U oA -30
+`U ~A -30
+`U , -100
+`U . -100
+`U u2026 -100
+V A -74
+V 'A -74
+V ^A -74
+V :A -74
+V `A -74
+V oA -74
+V ~A -74
+V O -18
+V 'O -18
+V ^O -18
+V :O -18
+V `O -18
+V /O -18
+V ~O -18
+V a -85
+V 'a -85
+V ^a -85
+V :a -85
+V `a -85
+V oa -85
+V ~a -85
+V : -75
+V , -125
+V e -75
+V 'e -75
+V ^e -75
+V :e -75
+V `e -75
+V - -100
+V hy -100
+V i -18
+V 'i -18
+V ^i -18
+V o -75
+V 'o -75
+V ^o -75
+V :o -75
+V `o -75
+V /o -75
+V ~o -75
+V . -125
+V u2026 -125
+V ; -75
+V u -75
+V 'u -75
+V ^u -75
+V :u -75
+V `u -75
+W A -50
+W 'A -50
+W ^A -50
+W :A -50
+W `A -50
+W oA -50
+W ~A -50
+W a -75
+W 'a -75
+W ^a -75
+W :a -75
+W `a -75
+W oa -75
+W ~a -75
+W : -100
+W , -125
+W e -60
+W 'e -60
+W ^e -60
+W :e -60
+W `e -60
+W - -100
+W hy -100
+W i -18
+W 'i -18
+W ^i -18
+W o -60
+W 'o -60
+W ^o -60
+W :o -60
+W `o -60
+W /o -60
+W ~o -60
+W . -125
+W u2026 -125
+W ; -100
+W u -55
+W 'u -55
+W ^u -55
+W :u -55
+W `u -55
+W y -55
+W 'y -55
+W :y -55
+Y A -75
+Y 'A -75
+Y ^A -75
+Y :A -75
+Y `A -75
+Y oA -75
+Y ~A -75
+Y O -18
+Y 'O -18
+Y ^O -18
+Y :O -18
+Y `O -18
+Y /O -18
+Y ~O -18
+Y a -100
+Y 'a -100
+Y ^a -100
+Y :a -100
+Y `a -60
+Y oa -100
+Y ~a -100
+Y : -75
+Y , -100
+Y e -100
+Y 'e -100
+Y ^e -100
+Y :e -60
+Y `e -60
+Y - -125
+Y hy -125
+Y i -18
+Y 'i -18
+Y ^i -18
+Y o -100
+Y 'o -100
+Y ^o -100
+Y :o -60
+Y `o -60
+Y /o -100
+Y ~o -100
+Y . -100
+Y u2026 -100
+Y ; -75
+Y u -91
+Y 'u -91
+Y ^u -91
+Y :u -91
+Y `u -91
+'Y A -75
+'Y 'A -75
+'Y ^A -75
+'Y :A -75
+'Y `A -75
+'Y oA -75
+'Y ~A -75
+'Y O -18
+'Y 'O -18
+'Y ^O -18
+'Y :O -18
+'Y `O -18
+'Y /O -18
+'Y ~O -18
+'Y a -100
+'Y 'a -100
+'Y ^a -100
+'Y :a -100
+'Y `a -60
+'Y oa -100
+'Y ~a -100
+'Y : -75
+'Y , -100
+'Y e -100
+'Y 'e -100
+'Y ^e -100
+'Y :e -60
+'Y `e -60
+'Y - -125
+'Y hy -125
+'Y i -18
+'Y 'i -18
+'Y ^i -18
+'Y o -100
+'Y 'o -100
+'Y ^o -100
+'Y :o -60
+'Y `o -60
+'Y /o -100
+'Y ~o -100
+'Y . -100
+'Y u2026 -100
+'Y ; -75
+'Y u -91
+'Y 'u -91
+'Y ^u -91
+'Y :u -91
+'Y `u -91
+:Y A -75
+:Y 'A -75
+:Y ^A -75
+:Y :A -75
+:Y `A -75
+:Y oA -75
+:Y ~A -75
+:Y O -18
+:Y 'O -18
+:Y ^O -18
+:Y :O -18
+:Y `O -18
+:Y /O -18
+:Y ~O -18
+:Y a -100
+:Y 'a -100
+:Y ^a -100
+:Y :a -100
+:Y `a -60
+:Y oa -100
+:Y ~a -100
+:Y : -75
+:Y , -100
+:Y e -100
+:Y 'e -100
+:Y ^e -100
+:Y :e -60
+:Y `e -60
+:Y - -125
+:Y hy -125
+:Y i -18
+:Y 'i -18
+:Y ^i -18
+:Y o -100
+:Y 'o -100
+:Y ^o -100
+:Y :o -60
+:Y `o -60
+:Y /o -100
+:Y ~o -100
+:Y . -100
+:Y u2026 -100
+:Y ; -75
+:Y u -91
+:Y 'u -91
+:Y ^u -91
+:Y :u -91
+:Y `u -91
+a v -10
+a w -10
+a y -10
+a 'y -10
+a :y -10
+'a v -10
+'a w -10
+'a y -10
+'a 'y -10
+'a :y -10
+^a v -10
+^a w -10
+^a y -10
+^a 'y -10
+^a :y -10
+:a v -10
+:a w -10
+:a y -10
+:a 'y -10
+:a :y -10
+`a v -10
+`a w -10
+`a y -10
+`a 'y -10
+`a :y -10
+oa v -10
+oa w -10
+oa y -10
+oa 'y -10
+oa :y -10
+~a v -10
+~a w -10
+~a y -10
+~a 'y -10
+~a :y -10
+b , -18
+b . -18
+b u2026 -18
+c , -18
+c h -7
+c k -7
+c l -7
+c /l -7
+c . -18
+c u2026 -18
+,c , -18
+,c h -7
+,c k -7
+,c l -7
+,c /l -7
+,c . -18
+,c u2026 -18
+: u0020 -37
+, rq -37
+, ' -37
+, cq -37
+, u0020 -37
+e , -18
+e . -18
+e u2026 -18
+'e , -18
+'e . -18
+'e u2026 -18
+^e , -18
+^e . -18
+^e u2026 -18
+:e , -18
+:e . -18
+:e u2026 -18
+`e , -18
+`e . -18
+`e u2026 -18
+f , -37
+f . -37
+f u2026 -37
+f rq 100
+f ' 100
+f cq 100
+g , -25
+g . -25
+g u2026 -25
+o , -18
+o . -18
+o u2026 -18
+'o , -18
+'o . -18
+'o u2026 -18
+^o , -18
+^o . -18
+^o u2026 -18
+:o , -18
+:o . -18
+:o u2026 -18
+`o , -18
+`o . -18
+`o u2026 -18
+/o , -18
+/o . -18
+/o u2026 -18
+~o , -18
+~o . -18
+~o u2026 -18
+p , -18
+p . -18
+p u2026 -18
+. rq -37
+u2026 rq -37
+. ' -37
+u2026 ' -37
+. cq -37
+u2026 cq -37
+. u0020 -37
+u2026 u0020 -37
+lq A -74
+lq 'A -74
+lq ^A -74
+lq :A -74
+lq `A -74
+lq oA -74
+lq ~A -74
+rq u0020 -37
+` A -74
+oq A -74
+` 'A -74
+oq 'A -74
+` ^A -74
+oq ^A -74
+` :A -74
+oq :A -74
+` `A -74
+oq `A -74
+` oA -74
+oq oA -74
+` ~A -74
+oq ~A -74
+` ` -25
+` oq -25
+oq ` -25
+oq oq -25
+' d -37
+cq d -37
+' ' -25
+' cq -25
+cq ' -25
+cq cq -25
+' s -25
+cq s -25
+' vs -25
+cq vs -25
+r , -100
+r - -37
+r hy -37
+r . -100
+r u2026 -100
+s , -25
+s . -25
+s u2026 -25
+vs , -25
+vs . -25
+vs u2026 -25
+; u0020 -37
+u0020 A -37
+u0020 'A -37
+u0020 ^A -37
+u0020 :A -37
+u0020 `A -37
+u0020 oA -37
+u0020 ~A -37
+u0020 T -37
+u0020 V -37
+u0020 W -37
+u0020 Y -37
+u0020 'Y -37
+u0020 :Y -37
+u0020 lq -37
+u0020 ` -37
+u0020 oq -37
+v , -125
+v . -125
+v u2026 -125
+w a -18
+w 'a -18
+w ^a -18
+w :a -18
+w `a -18
+w oa -18
+w ~a -18
+w , -125
+w . -125
+w u2026 -125
+y , -125
+y . -125
+y u2026 -125
+'y , -125
+'y . -125
+'y u2026 -125
+:y , -125
+:y . -125
+:y u2026 -125
+
+charset
+ha 606,690 2 0 asciicircum
+ti 606,322 0 1 asciitilde
+vS 630,933,15 2 2 Scaron
+vZ 611,933 2 3 Zcaron
+vs 463,695,15 2 4 scaron
+vz 481,695 2 5 zcaron
+:Y 704,883,0,11,11 2 6 Ydieresis
+tm 1000,722 2 7 trademark
+aq 204,737 2 8 quotesingle
+Eu 556,705,15 2 9 Euro
+space 278 0 32 space
+! 296,737,15 2 33 exclam
+" 389,737 2 34 quotedbl
+dq "
+# 556,690 2 35 numbersign
+sh "
+$ 556,813,138 2 36 dollar
+Do "
+% 833,705,15 2 37 percent
+& 815,737,15 2 38 ampersand
+' 204,737 2 39 quoteright
+cq "
+( 333,745,117 2 40 parenleft
+) 333,745,117 2 41 parenright
+* 500,737 2 42 asterisk
++ 606,506 0 43 plus
+, 278,109,185 0 44 comma
+- 333,277 0 45 hyphen
+hy "
+. 278,109,15 0 46 period
+/ 278,737,15,32,32 2 47 slash
+sl "
+0 556,705,15 2 48 zero
+1 556,705 2 49 one
+2 556,705 2 50 two
+3 556,705,15 2 51 three
+4 556,705 2 52 four
+5 556,705,15 2 53 five
+6 556,705,15 2 54 six
+7 556,705,15 2 55 seven
+8 556,705,15 2 56 eight
+9 556,705,15 2 57 nine
+: 278,474,15 0 58 colon
+; 278,474,185 0 59 semicolon
+< 606,514,8 0 60 less
+= 606,389 0 61 equal
+> 606,514,8 0 62 greater
+? 444,737,15 2 63 question
+@ 737,737,15,7,8 2 64 at
+at "
+A 722,737,0,8,8 2 65 A
+B 722,722 2 66 B
+C 722,737,15 2 67 C
+D 778,722 2 68 D
+E 722,722 2 69 E
+F 667,722 2 70 F
+G 778,737,15 2 71 G
+H 833,722 2 72 H
+I 407,722 2 73 I
+J 556,722,15 2 74 J
+K 778,722,0,25 2 75 K
+L 667,722 2 76 L
+M 944,722 2 77 M
+N 815,722,15 2 78 N
+O 778,737,15 2 79 O
+P 667,722 2 80 P
+Q 778,737,190 2 81 Q
+R 722,722,15 2 82 R
+S 630,737,15 2 83 S
+T 667,722 2 84 T
+U 815,722,15 2 85 U
+V 722,722,10,8,8 2 86 V
+W 981,722,10 2 87 W
+X 704,722,0,8,8 2 88 X
+Y 704,722,0,11,11 2 89 Y
+Z 611,722 2 90 Z
+[ 333,737,109 2 91 bracketleft
+lB "
+\ 606,737,15 2 92 backslash
+rs "
+] 333,737,109 2 93 bracketright
+rB "
+^ 333,695 2 94 circumflex
+a^ "
+_ 500,0,125 0 95 underscore
+` 204,737 2 96 quoteleft
+oq "
+a 556,479,15 0 97 a
+b 556,737,15 2 98 b
+c 444,479,15 0 99 c
+d 574,737,15 2 100 d
+e 500,479,15 0 101 e
+f 333,737,0,104 2 102 f
+g 537,494,205,5 1 103 g
+h 611,737 2 104 h
+i 315,722 2 105 i
+j 296,722,205,0,86 3 106 j
+k 593,737 2 107 k
+l 315,737 2 108 l
+m 889,479 0 109 m
+n 611,479 0 110 n
+o 500,479,15 0 111 o
+p 574,479,205 1 112 p
+q 556,479,205 1 113 q
+r 444,479 0 114 r
+s 463,479,15 0 115 s
+t 389,666,15 2 116 t
+u 611,464,15 0 117 u
+v 537,464,10,0,6 0 118 v
+w 778,464,10 0 119 w
+x 537,464 0 120 x
+y 537,464,205 1 121 y
+z 481,464 0 122 z
+{ 333,737,109 2 123 braceleft
+lC "
+| 606,750,250 3 124 bar
+ba "
+} 333,737,109 2 125 braceright
+rC "
+~ 333,655 0 126 tilde
+a~ "
+bq 204,109,185 0 128 quotesinglbase
+Fo 426,398 0 129 guillemotleft
+Fc 426,398 0 130 guillemotright
+bu 606,542 0 131 bullet
+Fn 556,737,205 3 132 florin
+f/ 167,705,15,195,195 2 133 fraction
+%0 1000,705,15 2 134 perthousand
+dg 500,737,147 2 135 dagger
+dd 500,737,149 2 136 daggerdbl
+en 556,268 0 137 endash
+em 1000,268 0 138 emdash
+fi 611,737 2 140 fi
+fl 611,737 2 141 fl
+.i 315,464 0 144 dotlessi
+ga 333,699 2 146 grave
+a" 333,699,0,83,9 2 147 hungarumlaut
+a. 333,704 2 148 dotaccent
+ab 333,685 2 149 breve
+ah 333,695 2 150 caron
+ao 333,722 2 151 ring
+ho 333,4,220 1 152 ogonek
+lq 389,737 2 153 quotedblleft
+rq 389,737 2 154 quotedblright
+oe 833,479,15 0 155 oe
+/l 315,737 2 156 lslash
+Bq 389,109,185 0 157 quotedblbase
+OE 1000,722 2 158 OE
+/L 667,722 2 159 Lslash
+r! 296,547,205 1 161 exclamdown
+ct 556,584,141 0 162 cent
+Po 556,705,15 2 163 sterling
+Cs 556,597 0 164 currency
+Ye 556,690,0,1,1 2 165 yen
+bb 606,675,175 2 166 brokenbar
+sc 500,737,147 2 167 section
+ad 333,704 2 168 dieresis
+co 737,737,15,7,8 2 169 copyright
+Of 334,705,0,4,4 2 170 ordfeminine
+fo 259,398 0 171 guilsinglleft
+tno 606,389 0 172 logicalnot
+\- 606,289 0 173 minus
+rg 737,737,15,7,8 2 174 registered
+a- 333,623 0 175 macron
+de 400,705 2 176 degree
+t+- 606,506 0 177 plusminus
+S2 333,705 2 178 twosuperior
+S3 333,705 2 179 threesuperior
+aa 333,699 2 180 acute
+*m 611,464,205 1 181 mu
+mc "
+ps 606,722,132 2 182 paragraph
+pc 278,374 0 183 periodcentered
+ac 333,0,215 1 184 cedilla
+S1 333,705 2 185 onesuperior
+Om 300,705 2 186 ordmasculine
+fc 259,398 0 187 guilsinglright
+14 834,705,15 2 188 onequarter
+12 834,705,15 2 189 onehalf
+34 834,705,15 2 190 threequarters
+r? 444,547,205 1 191 questiondown
+`A 722,937,0,8,8 2 192 Agrave
+'A 722,937,0,8,8 2 193 Aacute
+^A 722,933,0,8,8 2 194 Acircumflex
+~A 722,893,0,8,8 2 195 Atilde
+:A 722,883,0,8,8 2 196 Adieresis
+oA 722,965,0,8,8 2 197 Aring
+AE 1000,722 2 198 AE
+,C 722,737,215 3 199 Ccedilla
+`E 722,937 2 200 Egrave
+'E 722,937 2 201 Eacute
+^E 722,933 2 202 Ecircumflex
+:E 722,883 2 203 Edieresis
+`I 407,937 2 204 Igrave
+'I 407,937 2 205 Iacute
+^I 407,933 2 206 Icircumflex
+:I 407,883 2 207 Idieresis
+-D 778,722 2 208 Eth
+~N 815,893,15 2 209 Ntilde
+`O 778,937,15 2 210 Ograve
+'O 778,937,15 2 211 Oacute
+^O 778,933,15 2 212 Ocircumflex
+~O 778,893,15 2 213 Otilde
+:O 778,883,15 2 214 Odieresis
+tmu 606,482 0 215 multiply
+/O 778,778,56 2 216 Oslash
+`U 815,937,15 2 217 Ugrave
+'U 815,937,15 2 218 Uacute
+^U 815,933,15 2 219 Ucircumflex
+:U 815,883,15 2 220 Udieresis
+'Y 704,937,0,11,11 2 221 Yacute
+TP 667,722 2 222 Thorn
+ss 574,737,15 2 223 germandbls
+`a 556,699,15 2 224 agrave
+'a 556,699,15 2 225 aacute
+^a 556,695,15 2 226 acircumflex
+~a 556,655,15 0 227 atilde
+:a 556,645,15 0 228 adieresis
+oa 556,732,15 2 229 aring
+ae 796,479,15 0 230 ae
+,c 444,479,215 1 231 ccedilla
+`e 500,699,15 2 232 egrave
+'e 500,699,15 2 233 eacute
+^e 500,695,15 2 234 ecircumflex
+:e 500,645,15 0 235 edieresis
+`i 315,699 2 236 igrave
+'i 315,699 2 237 iacute
+^i 315,695 2 238 icircumflex
+:i 315,645 0 239 idieresis
+Sd 500,737,15 2 240 eth
+~n 611,655 0 241 ntilde
+`o 500,699,15 2 242 ograve
+'o 500,699,15 2 243 oacute
+^o 500,695,15 2 244 ocircumflex
+~o 500,655,15 0 245 otilde
+:o 500,645,15 0 246 odieresis
+tdi 606,528,22 0 247 divide
+/o 500,561,97 0 248 oslash
+`u 611,699,15 2 249 ugrave
+'u 611,699,15 2 250 uacute
+^u 611,695,15 2 251 ucircumflex
+:u 611,645,15 0 252 udieresis
+'y 537,699,205 3 253 yacute
+Tp 574,737,205 3 254 thorn
+:y 537,645,205 1 255 ydieresis
+u2026 1000,109,15 0 256 ellipsis
diff --git a/font/devps/PB b/font/devps/PB
new file mode 100644
index 0000000..4c3c332
--- /dev/null
+++ b/font/devps/PB
@@ -0,0 +1,728 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Palatino Bold
+# Version 003.001
+# FamilyName Palatino
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Palatino is a trademark of Linotype-Hell AG and/or its subsidiaries.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:21:36 1999
+# Comment UniqueID 44717
+# Comment VMusage 41560 52496
+
+name PB
+internalname Palatino-Bold
+spacewidth 250
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A T -92
+A V -129
+A W -90
+A Y -111
+A 'Y -111
+A :Y -111
+A ' -92
+A cq -92
+A u0020 -18
+A v -70
+A w -70
+A y -70
+A 'y -70
+A :y -70
+'A T -92
+'A V -129
+'A W -90
+'A Y -111
+'A 'Y -111
+'A :Y -111
+'A ' -92
+'A cq -92
+'A u0020 -18
+'A v -70
+'A w -70
+'A y -70
+'A 'y -70
+'A :y -70
+^A T -92
+^A V -129
+^A W -90
+^A Y -111
+^A 'Y -111
+^A :Y -111
+^A ' -92
+^A cq -92
+^A u0020 -18
+^A v -70
+^A w -70
+^A y -70
+^A 'y -70
+^A :y -70
+:A T -92
+:A V -129
+:A W -90
+:A Y -111
+:A 'Y -111
+:A :Y -111
+:A ' -92
+:A cq -92
+:A u0020 -18
+:A v -70
+:A w -70
+:A y -70
+:A 'y -70
+:A :y -70
+`A T -92
+`A V -129
+`A W -90
+`A Y -111
+`A 'Y -111
+`A :Y -111
+`A ' -92
+`A cq -92
+`A u0020 -18
+`A v -70
+`A w -70
+`A y -70
+`A 'y -70
+`A :y -70
+oA T -92
+oA V -129
+oA W -90
+oA Y -111
+oA 'Y -111
+oA :Y -111
+oA ' -92
+oA cq -92
+oA u0020 -18
+oA v -70
+oA w -70
+oA y -70
+oA 'y -70
+oA :y -70
+~A T -92
+~A V -129
+~A W -90
+~A Y -111
+~A 'Y -111
+~A :Y -111
+~A ' -92
+~A cq -92
+~A u0020 -18
+~A v -70
+~A w -70
+~A y -70
+~A 'y -70
+~A :y -70
+F A -55
+F 'A -55
+F ^A -55
+F :A -55
+F `A -55
+F oA -55
+F ~A -55
+F , -111
+F . -111
+F u2026 -111
+L T -74
+L V -92
+L W -92
+L Y -92
+L 'Y -92
+L :Y -92
+L ' -74
+L cq -74
+L u0020 -18
+L y -74
+L 'y -74
+L :y -74
+/L T -74
+/L V -92
+/L W -92
+/L Y -92
+/L 'Y -92
+/L :Y -92
+/L ' -74
+/L cq -74
+/L u0020 -18
+/L y -74
+/L 'y -74
+/L :y -74
+P A -74
+P 'A -74
+P ^A -74
+P :A -74
+P `A -74
+P oA -74
+P ~A -74
+P , -129
+P . -129
+P u2026 -129
+R T -55
+R V -74
+R W -37
+R Y -55
+R 'Y -55
+R :Y -55
+R y -30
+R 'y -30
+R :y -30
+T A -92
+T 'A -92
+T ^A -92
+T :A -92
+T `A -92
+T oA -92
+T ~A -92
+T a -111
+T 'a -111
+T ^a -71
+T :a -71
+T `a -71
+T oa -111
+T ~a -111
+T c -129
+T ,c -129
+T : -74
+T , -92
+T e -111
+T 'e -111
+T ^e -71
+T :e -71
+T `e -71
+T - -92
+T hy -92
+T i -55
+T 'i -55
+T o -111
+T 'o -111
+T ^o -111
+T :o -111
+T `o -111
+T /o -111
+T ~o -111
+T . -92
+T u2026 -92
+T r -111
+T s -111
+T vs -71
+T ; -74
+T u -129
+T 'u -129
+T ^u -129
+T :u -129
+T `u -129
+T w -90
+T y -90
+T 'y -90
+T :y -90
+V A -129
+V 'A -129
+V ^A -129
+V :A -129
+V `A -129
+V oA -129
+V ~A -129
+V a -111
+V 'a -111
+V ^a -111
+V :a -111
+V `a -111
+V oa -111
+V ~a -71
+V : -74
+V , -129
+V e -111
+V 'e -111
+V ^e -111
+V :e -111
+V `e -111
+V - -92
+V hy -92
+V i -55
+V 'i -55
+V o -111
+V 'o -111
+V ^o -111
+V :o -111
+V `o -111
+V /o -111
+V ~o -111
+V . -129
+V u2026 -129
+V r -111
+V ; -74
+V u -92
+V 'u -92
+V ^u -92
+V :u -92
+V `u -92
+V y -90
+V 'y -90
+V :y -90
+W A -90
+W 'A -90
+W ^A -90
+W :A -90
+W `A -90
+W oA -90
+W ~A -90
+W a -74
+W 'a -74
+W ^a -74
+W :a -74
+W `a -74
+W oa -74
+W ~a -74
+W : -37
+W , -92
+W e -74
+W 'e -74
+W ^e -74
+W :e -74
+W `e -74
+W - -37
+W hy -37
+W i -37
+W 'i -37
+W o -74
+W 'o -74
+W ^o -74
+W :o -74
+W `o -74
+W /o -74
+W ~o -74
+W . -37
+W u2026 -37
+W r -74
+W ; -37
+W u -74
+W 'u -74
+W ^u -74
+W :u -74
+W `u -74
+W y -74
+W 'y -74
+W :y -74
+Y A -55
+Y 'A -55
+Y ^A -55
+Y :A -55
+Y `A -55
+Y oA -55
+Y ~A -55
+Y a -74
+Y 'a -74
+Y ^a -74
+Y :a -74
+Y `a -74
+Y oa -74
+Y ~a -74
+Y : -55
+Y , -74
+Y e -74
+Y 'e -74
+Y ^e -74
+Y :e -74
+Y `e -74
+Y - -74
+Y hy -74
+Y i -55
+Y 'i -55
+Y o -74
+Y 'o -74
+Y ^o -74
+Y :o -74
+Y `o -74
+Y /o -74
+Y ~o -74
+Y p -74
+Y . -74
+Y u2026 -74
+Y q -92
+Y ; -55
+Y u -74
+Y 'u -74
+Y ^u -74
+Y :u -74
+Y `u -74
+Y v -74
+'Y A -55
+'Y 'A -55
+'Y ^A -55
+'Y :A -55
+'Y `A -55
+'Y oA -55
+'Y ~A -55
+'Y a -74
+'Y 'a -74
+'Y ^a -74
+'Y :a -74
+'Y `a -74
+'Y oa -74
+'Y ~a -74
+'Y : -55
+'Y , -74
+'Y e -74
+'Y 'e -74
+'Y ^e -74
+'Y :e -74
+'Y `e -74
+'Y - -74
+'Y hy -74
+'Y i -55
+'Y 'i -55
+'Y o -74
+'Y 'o -74
+'Y ^o -74
+'Y :o -74
+'Y `o -74
+'Y /o -74
+'Y ~o -74
+'Y p -74
+'Y . -74
+'Y u2026 -74
+'Y q -92
+'Y ; -55
+'Y u -74
+'Y 'u -74
+'Y ^u -74
+'Y :u -74
+'Y `u -74
+'Y v -74
+:Y A -55
+:Y 'A -55
+:Y ^A -55
+:Y :A -55
+:Y `A -55
+:Y oA -55
+:Y ~A -55
+:Y a -74
+:Y 'a -74
+:Y ^a -74
+:Y :a -74
+:Y `a -74
+:Y oa -74
+:Y ~a -74
+:Y : -55
+:Y , -74
+:Y e -74
+:Y 'e -74
+:Y ^e -74
+:Y :e -74
+:Y `e -74
+:Y - -74
+:Y hy -74
+:Y i -55
+:Y 'i -55
+:Y o -74
+:Y 'o -74
+:Y ^o -74
+:Y :o -74
+:Y `o -74
+:Y /o -74
+:Y ~o -74
+:Y p -74
+:Y . -74
+:Y u2026 -74
+:Y q -92
+:Y ; -55
+:Y u -74
+:Y 'u -74
+:Y ^u -74
+:Y :u -74
+:Y `u -74
+:Y v -74
+f f -18
+f ' 37
+f cq 37
+1 1 -37
+` ` -55
+` oq -55
+oq ` -55
+oq oq -55
+' ' -55
+' cq -55
+cq ' -55
+cq cq -55
+' s -55
+cq s -55
+' vs -55
+cq vs -55
+' u0020 -55
+cq u0020 -55
+' t -18
+cq t -18
+r , -55
+r - -18
+r hy -18
+r . -55
+r u2026 -55
+r ' 55
+r cq 55
+v , -111
+v . -111
+v u2026 -111
+w , -92
+w . -92
+w u2026 -92
+y , -92
+y . -92
+y u2026 -92
+'y , -92
+'y . -92
+'y u2026 -92
+:y , -92
+:y . -92
+:y u2026 -92
+
+charset
+ha 606,678 2 0 asciicircum
+ti 606,342 0 1 asciitilde
+vS 611,909,17 2 2 Scaron
+vZ 667,909,3 2 3 Zcaron
+vs 444,705,17 2 4 scaron
+vz 500,705,3 2 5 zcaron
+:Y 667,895,3 2 6 Ydieresis
+tm 998,678 2 7 trademark
+aq 227,695 2 8 quotesingle
+Eu 500,660,17,8 2 9 Euro
+space 250 0 32 space
+! 278,688,12 2 33 exclam
+" 402,695 2 34 quotedbl
+dq "
+# 500,673 2 35 numbersign
+sh "
+$ 500,721,114 2 36 dollar
+Do "
+% 889,714,9 2 37 percent
+& 833,684,17 2 38 ampersand
+' 278,695 2 39 quoteright
+cq "
+( 333,723,104 2 40 parenleft
+) 333,723,104 2 41 parenright
+* 444,695 2 42 asterisk
++ 606,505 0 43 plus
+, 250,141,166,0,6 0 44 comma
+- 333,305 0 45 hyphen
+hy "
+. 250,144,12 0 46 period
+/ 296,720,17,9,9 2 47 slash
+sl "
+0 500,660,17 2 48 zero
+1 500,670,3 2 49 one
+2 500,660,3 2 50 two
+3 500,660,17 2 51 three
+4 500,672,3 2 52 four
+5 500,656,17 2 53 five
+6 500,660,17 2 54 six
+7 500,656,3 2 55 seven
+8 500,660,17 2 56 eight
+9 500,660,17 2 57 nine
+: 250,454,12 0 58 colon
+; 250,454,166,0,6 0 59 semicolon
+< 606,519,15 0 60 less
+= 606,396 0 61 equal
+> 606,519,15 0 62 greater
+? 444,687,12 2 63 question
+@ 747,681,12 2 64 at
+at "
+A 778,686,3 2 65 A
+B 667,681,3 2 66 B
+C 722,695,17 2 67 C
+D 833,681,3 2 68 D
+E 611,682,4 2 69 E
+F 556,682,3 2 70 F
+G 833,695,17 2 71 G
+H 833,681,3 2 72 H
+I 389,681,3 2 73 I
+J 389,681,213,0,11 2 74 J
+K 778,681,3 2 75 K
+L 611,681,4 2 76 L
+M 1000,681,10 2 77 M
+N 833,681,16 2 78 N
+O 833,695,17 2 79 O
+P 611,681,3 2 80 P
+Q 833,695,184 2 81 Q
+R 722,681,3 2 82 R
+S 611,695,17 2 83 S
+T 667,681,3 2 84 T
+U 778,681,17 2 85 U
+V 778,681,3 2 86 V
+W 1000,686,3 2 87 W
+X 667,695,3 2 88 X
+Y 667,695,3 2 89 Y
+Z 667,681,3 2 90 Z
+[ 333,720,104 2 91 bracketleft
+lB "
+\ 606,720 2 92 backslash
+rs "
+] 333,720,104 2 93 bracketright
+rB "
+^ 333,681,0,2,2 2 94 circumflex
+a^ "
+_ 500,0,125 0 95 underscore
+` 278,695 2 96 quoteleft
+oq "
+a 500,471,17 0 97 a
+b 611,720,17 2 98 b
+c 444,471,17 0 99 c
+d 611,720,17 2 100 d
+e 500,471,17 0 101 e
+f 389,720,3 2 102 f
+g 556,471,266 1 103 g
+h 611,720,3 2 104 h
+i 333,706,3 2 105 i
+j 333,706,266 3 106 j
+k 611,720,3 2 107 k
+l 333,720,3 2 108 l
+m 889,471,3 0 109 m
+n 611,471,3 0 110 n
+o 556,471,17 0 111 o
+p 611,471,258 1 112 p
+q 611,471,258 1 113 q
+r 389,471,3 0 114 r
+s 444,471,17 0 115 s
+t 333,632,17 2 116 t
+u 611,471,17 0 117 u
+v 556,459,3 0 118 v
+w 833,471,3 0 119 w
+x 500,471,3 0 120 x
+y 556,459,266 1 121 y
+z 500,459,3 0 122 z
+{ 310,725,117 2 123 braceleft
+lC "
+| 606,750,250 2 124 bar
+ba "
+} 310,725,117 2 125 braceright
+rC "
+~ 333,661,0,16,16 2 126 tilde
+a~ "
+bq 333,130,160 0 128 quotesinglbase
+Fo 500,438 0 129 guillemotleft
+Fc 500,438 0 130 guillemotright
+bu 606,516 0 131 bullet
+Fn 500,703,242 2 132 florin
+f/ 167,660,0,153,152 2 133 fraction
+%0 1000,724,9 2 134 perthousand
+dg 500,682,6 2 135 dagger
+dd 500,682,245 2 136 daggerdbl
+en 500,291 0 137 endash
+em 1000,291 0 138 emdash
+fi 611,720,3 2 140 fi
+fl 611,720,3 2 141 fl
+.i 333,471,3 0 144 dotlessi
+ga 333,691 2 146 grave
+a" 333,691,0,57,56 2 147 hungarumlaut
+a. 333,706 2 148 dotaccent
+ab 333,669 2 149 breve
+ah 333,685,0,2,2 2 150 caron
+ao 333,700 2 151 ring
+ho 333,0,225 0 152 ogonek
+lq 500,695 2 153 quotedblleft
+rq 500,695 2 154 quotedblright
+oe 833,471,17 0 155 oe
+/l 333,720,3,1,4 2 156 lslash
+Bq 500,130,160 0 157 quotedblbase
+OE 1000,695,17 2 158 OE
+/L 611,681,4 2 159 Lslash
+r! 278,471,227 0 161 exclamdown
+ct 500,554,106 0 162 cent
+Po 500,676,19,1,2 2 163 sterling
+Cs 500,533 0 164 currency
+Ye 500,695,3 2 165 yen
+bb 606,675,175 2 166 brokenbar
+sc 500,695,217 2 167 section
+ad 333,690,0,8,8 2 168 dieresis
+co 747,695,17 2 169 copyright
+Of 438,660 2 170 ordfeminine
+fo 389,438 0 171 guilsinglleft
+tno 606,396 0 172 logicalnot
+\- 606,298 0 173 minus
+rg 747,695,17 2 174 registered
+a- 333,609 0 175 macron
+de 400,660 2 176 degree
+t+- 606,505 0 177 plusminus
+S2 300,660 2 178 twosuperior
+S3 300,667 2 179 threesuperior
+aa 333,691 2 180 acute
+*m 611,471,211 0 181 mu
+mc "
+ps 641,683,161 2 182 paragraph
+pc 250,335 0 183 periodcentered
+ac 333,0,225 0 184 cedilla
+S1 300,665 2 185 onesuperior
+Om 488,660 2 186 ordmasculine
+fc 389,438 0 187 guilsinglright
+14 750,665,2 2 188 onequarter
+12 750,665,2 2 189 onehalf
+34 750,667,2 2 190 threequarters
+r? 444,471,231 0 191 questiondown
+`A 778,915,3 2 192 Agrave
+'A 778,915,3 2 193 Aacute
+^A 778,905,3 2 194 Acircumflex
+~A 778,885,3 2 195 Atilde
+:A 778,895,3 2 196 Adieresis
+oA 778,924,3 2 197 Aring
+AE 1000,682,4 2 198 AE
+,C 722,695,225 2 199 Ccedilla
+`E 611,915,4 2 200 Egrave
+'E 611,915,4 2 201 Eacute
+^E 611,905,4 2 202 Ecircumflex
+:E 611,895,4 2 203 Edieresis
+`I 389,915,3 2 204 Igrave
+'I 389,915,3 2 205 Iacute
+^I 389,905,3 2 206 Icircumflex
+:I 389,895,3 2 207 Idieresis
+-D 833,681,3 2 208 Eth
+~N 833,885,16 2 209 Ntilde
+`O 833,915,17 2 210 Ograve
+'O 833,915,17 2 211 Oacute
+^O 833,905,17 2 212 Ocircumflex
+~O 833,885,17 2 213 Otilde
+:O 833,895,17 2 214 Odieresis
+tmu 606,483 0 215 multiply
+/O 833,698,20 2 216 Oslash
+`U 778,915,17 2 217 Ugrave
+'U 778,915,17 2 218 Uacute
+^U 778,905,17 2 219 Ucircumflex
+:U 778,895,17 2 220 Udieresis
+'Y 667,915,3 2 221 Yacute
+TP 611,681,3 2 222 Thorn
+ss 611,720,17 2 223 germandbls
+`a 500,711,17 2 224 agrave
+'a 500,711,17 2 225 aacute
+^a 500,701,17 2 226 acircumflex
+~a 500,693,17 2 227 atilde
+:a 500,691,17 2 228 adieresis
+oa 500,720,17 2 229 aring
+ae 778,471,17 0 230 ae
+,c 444,471,225 0 231 ccedilla
+`e 500,711,17 2 232 egrave
+'e 500,711,17 2 233 eacute
+^e 500,721,17 2 234 ecircumflex
+:e 500,691,17 2 235 edieresis
+`i 333,711,3 2 236 igrave
+'i 333,711,3 2 237 iacute
+^i 333,701,3,2,2 2 238 icircumflex
+:i 333,710,3,8,8 2 239 idieresis
+Sd 556,720,17 2 240 eth
+~n 611,693,3 2 241 ntilde
+`o 556,711,17 2 242 ograve
+'o 556,711,17 2 243 oacute
+^o 556,701,17 2 244 ocircumflex
+~o 556,693,17 2 245 otilde
+:o 556,710,17 2 246 odieresis
+tdi 606,510 0 247 divide
+/o 556,471,18 0 248 oslash
+`u 611,711,17 2 249 ugrave
+'u 611,711,17 2 250 uacute
+^u 611,701,17 2 251 ucircumflex
+:u 611,710,17 2 252 udieresis
+'y 556,711,266 3 253 yacute
+Tp 611,720,258 3 254 thorn
+:y 556,710,266 3 255 ydieresis
+u2026 1000,144,12 0 256 ellipsis
diff --git a/font/devps/PBI b/font/devps/PBI
new file mode 100644
index 0000000..df65790
--- /dev/null
+++ b/font/devps/PBI
@@ -0,0 +1,754 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Palatino Bold Italic
+# Version 003.001
+# FamilyName Palatino
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Palatino is a trademark of Linotype-Hell AG and/or its subsidiaries.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:25:04 1999
+# Comment UniqueID 44718
+# Comment VMusage 42609 53545
+
+name PBI
+internalname Palatino-BoldItalic
+slant 10
+spacewidth 250
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A T -55
+A V -74
+A W -74
+A Y -74
+A 'Y -74
+A :Y -74
+A ' -55
+A cq -55
+A u0020 -55
+A v -55
+A w -37
+A y -55
+A 'y -55
+A :y -55
+'A T -55
+'A V -74
+'A W -74
+'A Y -74
+'A 'Y -74
+'A :Y -74
+'A ' -55
+'A cq -55
+'A u0020 -55
+'A v -55
+'A w -37
+'A y -55
+'A 'y -55
+'A :y -55
+^A T -55
+^A V -74
+^A W -74
+^A Y -74
+^A 'Y -74
+^A :Y -74
+^A ' -55
+^A cq -55
+^A u0020 -55
+^A v -55
+^A w -37
+^A y -55
+^A 'y -55
+^A :y -55
+:A T -55
+:A V -74
+:A W -74
+:A Y -74
+:A 'Y -74
+:A :Y -74
+:A ' -55
+:A cq -55
+:A u0020 -55
+:A v -55
+:A w -37
+:A y -55
+:A 'y -55
+:A :y -55
+`A T -55
+`A V -74
+`A W -74
+`A Y -74
+`A 'Y -74
+`A :Y -74
+`A ' -55
+`A cq -55
+`A u0020 -55
+`A v -55
+`A w -37
+`A y -55
+`A 'y -55
+`A :y -55
+oA T -55
+oA V -74
+oA W -74
+oA Y -74
+oA 'Y -74
+oA :Y -74
+oA ' -55
+oA cq -55
+oA u0020 -55
+oA v -55
+oA w -37
+oA y -55
+oA 'y -55
+oA :y -55
+~A T -55
+~A V -74
+~A W -74
+~A Y -74
+~A 'Y -74
+~A :Y -74
+~A ' -55
+~A cq -55
+~A u0020 -55
+~A v -55
+~A w -37
+~A y -55
+~A 'y -55
+~A :y -55
+F A -74
+F 'A -74
+F ^A -74
+F :A -74
+F `A -74
+F oA -74
+F ~A -74
+F , -111
+F . -111
+F u2026 -111
+F u0020 -18
+L T -74
+L V -74
+L W -74
+L Y -74
+L 'Y -74
+L :Y -74
+L ' -55
+L cq -55
+L u0020 -18
+L y -37
+L 'y -37
+L :y -37
+/L T -74
+/L V -74
+/L W -74
+/L Y -74
+/L 'Y -74
+/L :Y -74
+/L ' -55
+/L cq -55
+/L u0020 -18
+/L y -37
+/L 'y -37
+/L :y -37
+P A -92
+P 'A -92
+P ^A -92
+P :A -92
+P `A -92
+P oA -92
+P ~A -92
+P , -129
+P . -129
+P u2026 -129
+P u0020 -55
+R T -37
+R V -55
+R W -55
+R Y -37
+R 'Y -37
+R :Y -37
+R y -20
+R 'y -20
+R :y -20
+T A -55
+T 'A -55
+T ^A -55
+T :A -55
+T `A -55
+T oA -55
+T ~A -55
+T O -18
+T 'O -18
+T ^O -18
+T :O -18
+T `O -18
+T /O -18
+T ~O -18
+T a -111
+T 'a -111
+T ^a -111
+T :a -111
+T `a -111
+T oa -111
+T ~a -111
+T c -92
+T ,c -92
+T : -55
+T , -55
+T e -111
+T 'e -111
+T ^e -71
+T :e -71
+T `e -71
+T - -92
+T hy -92
+T i -74
+T 'i -74
+T ^i -34
+T :i -34
+T `i -34
+T o -111
+T 'o -111
+T ^o -111
+T :o -111
+T `o -111
+T /o -111
+T ~o -111
+T . -55
+T u2026 -55
+T r -92
+T s -92
+T vs -92
+T ; -55
+T u -92
+T 'u -92
+T ^u -92
+T :u -92
+T `u -92
+T w -50
+T y -80
+T 'y -80
+T :y -80
+V A -74
+V 'A -74
+V ^A -74
+V :A -74
+V `A -74
+V oA -74
+V ~A -74
+V a -92
+V 'a -92
+V ^a -92
+V :a -92
+V `a -92
+V oa -92
+V ~a -92
+V : -37
+V , -111
+V e -74
+V 'e -74
+V ^e -74
+V :e -74
+V `e -34
+V - -37
+V hy -37
+V i -50
+V 'i -50
+V o -74
+V 'o -74
+V ^o -74
+V :o -74
+V `o -74
+V /o -74
+V ~o -74
+V . -111
+V u2026 -111
+V r -74
+V ; -37
+V u -50
+V 'u -50
+V ^u -50
+V :u -50
+V `u -50
+V y -50
+V 'y -50
+V :y -50
+W A -74
+W 'A -74
+W ^A -74
+W :A -74
+W `A -74
+W oA -74
+W ~A -74
+W a -74
+W 'a -74
+W ^a -74
+W :a -74
+W `a -74
+W oa -74
+W ~a -74
+W : -28
+W , -55
+W e -55
+W 'e -55
+W ^e -55
+W :e -55
+W `e -55
+W i -30
+W 'i -30
+W o -55
+W 'o -55
+W ^o -55
+W :o -55
+W `o -55
+W /o -55
+W ~o -55
+W . -55
+W u2026 -55
+W r -30
+W ; -18
+W u -30
+W 'u -30
+W ^u -30
+W :u -30
+W `u -30
+W y -30
+W 'y -30
+W :y -30
+Y A -55
+Y 'A -55
+Y ^A -55
+Y :A -55
+Y `A -55
+Y oA -55
+Y ~A -55
+Y a -111
+Y 'a -111
+Y ^a -111
+Y :a -111
+Y `a -111
+Y oa -111
+Y ~a -111
+Y : -55
+Y , -55
+Y e -92
+Y 'e -92
+Y ^e -92
+Y :e -92
+Y `e -92
+Y - -55
+Y hy -55
+Y i -54
+Y 'i -54
+Y o -111
+Y 'o -111
+Y ^o -111
+Y :o -111
+Y `o -111
+Y /o -111
+Y ~o -111
+Y p -74
+Y . -55
+Y u2026 -55
+Y q -92
+Y ; -55
+Y u -50
+Y 'u -50
+Y ^u -50
+Y :u -50
+Y `u -50
+Y v -30
+'Y A -55
+'Y 'A -55
+'Y ^A -55
+'Y :A -55
+'Y `A -55
+'Y oA -55
+'Y ~A -55
+'Y a -111
+'Y 'a -111
+'Y ^a -111
+'Y :a -111
+'Y `a -111
+'Y oa -111
+'Y ~a -111
+'Y : -55
+'Y , -55
+'Y e -92
+'Y 'e -92
+'Y ^e -92
+'Y :e -92
+'Y `e -92
+'Y - -55
+'Y hy -55
+'Y i -54
+'Y 'i -54
+'Y o -111
+'Y 'o -111
+'Y ^o -111
+'Y :o -111
+'Y `o -111
+'Y /o -111
+'Y ~o -111
+'Y p -74
+'Y . -55
+'Y u2026 -55
+'Y q -92
+'Y ; -55
+'Y u -50
+'Y 'u -50
+'Y ^u -50
+'Y :u -50
+'Y `u -50
+'Y v -30
+:Y A -55
+:Y 'A -55
+:Y ^A -55
+:Y :A -55
+:Y `A -55
+:Y oA -55
+:Y ~A -55
+:Y a -111
+:Y 'a -111
+:Y ^a -111
+:Y :a -111
+:Y `a -111
+:Y oa -111
+:Y ~a -111
+:Y : -55
+:Y , -55
+:Y e -92
+:Y 'e -92
+:Y ^e -92
+:Y :e -92
+:Y `e -92
+:Y - -55
+:Y hy -55
+:Y i -54
+:Y 'i -54
+:Y o -111
+:Y 'o -111
+:Y ^o -111
+:Y :o -111
+:Y `o -111
+:Y /o -111
+:Y ~o -111
+:Y p -74
+:Y . -55
+:Y u2026 -55
+:Y q -92
+:Y ; -55
+:Y u -50
+:Y 'u -50
+:Y ^u -50
+:Y :u -50
+:Y `u -50
+:Y v -30
+f f -37
+f ' 37
+f cq 37
+1 1 -55
+` ` -55
+` oq -55
+oq ` -55
+oq oq -55
+' ' -55
+' cq -55
+cq ' -55
+cq cq -55
+' s -37
+cq s -37
+' vs -37
+cq vs -37
+' u0020 -37
+cq u0020 -37
+' t -18
+cq t -18
+r c -18
+r ,c -18
+r , -55
+r e -18
+r 'e -18
+r ^e -18
+r :e -18
+r `e -18
+r g -18
+r h -18
+r o -18
+r 'o -18
+r ^o -18
+r :o -18
+r `o -18
+r /o -18
+r ~o -18
+r . -55
+r u2026 -55
+r q -18
+r ' 55
+r cq 55
+v , -55
+v . -55
+v u2026 -55
+w , -55
+w . -55
+w u2026 -55
+y , -37
+y . -37
+y u2026 -37
+'y , -37
+'y . -37
+'y u2026 -37
+:y , -37
+:y . -37
+:y u2026 -37
+
+charset
+ha 606,678,0,0,-13 2 0 asciicircum
+ti 606,346,0,0,-1 0 1 asciitilde
+vS 556,904,17,51,0,51 2 2 Scaron
+vZ 667,904,3,59,49,59 2 3 Zcaron
+vs 444,712,17,95,25,66 2 4 scaron
+vz 500,712,17,67,19,66 2 5 zcaron
+:Y 611,880,3,114,-4,66 2 6 Ydieresis
+tm 1000,678,0,11,12,11 2 7 trademark
+aq 250,720,0,93,-77,66 2 8 quotesingle
+Eu 500,683,18,118,58,66 2 9 Euro
+space 250 0 32 space
+! 333,695,17,39,-8,39 2 33 exclam
+" 500,720,0,43,-87,43 2 34 quotedbl
+dq "
+# 500,673,0,46,46,46 2 35 numbersign
+sh "
+$ 500,737,108,27,30,27 2 36 dollar
+Do "
+% 889,697,17,0,-6 2 37 percent
+& 833,695,17,28,-24,28 2 38 ampersand
+' 278,720,0,74,-26,66 2 39 quoteright
+cq "
+( 333,723,129,85,-8,66 2 40 parenleft
+) 333,723,129,15,62,15 2 41 parenright
+* 444,695,0,45,-34,45 2 42 asterisk
++ 606,501,5 0 43 plus
+, 250,147,164,8,83,8 0 44 comma
+- 389,300,0,23,13,23 0 45 hyphen
+hy "
+. 250,135,17,0,2 0 46 period
+/ 315,720,17,50,49,50 2 47 slash
+sl "
+0 500,683,17,40,8,40 2 48 zero
+1 500,678,3,0,9 2 49 one
+2 500,683,3,4,49,4 2 50 two
+3 500,683,17,0,42 2 51 three
+4 500,683,3,37,47,37 2 52 four
+5 500,675,17,31,36,31 2 53 five
+6 500,683,17,38,11,38 2 54 six
+7 500,674,3,94,-19,66 2 55 seven
+8 500,683,17,34,24,34 2 56 eight
+9 500,683,17,41,23,41 2 57 nine
+: 250,452,17,36,12,36 0 58 colon
+; 250,452,164,47,83,47 0 59 semicolon
+< 606,517,21,2,1,2 0 60 less
+= 606,390,0,0,-1 0 61 equal
+> 606,517,21,1,2,1 0 62 greater
+? 444,695,17,56,-41,56 2 63 question
+@ 833,681,12,0,-32 2 64 at
+at "
+A 722,683,3,13,85,13 2 65 A
+B 667,681,3,12,42,12 2 66 B
+C 685,695,17,60,-19,60 2 67 C
+D 778,682,3,19,50,19 2 68 D
+E 611,681,3,45,39,45 2 69 E
+F 556,681,3,87,56,66 2 70 F
+G 778,695,17,22,-22,22 2 71 G
+H 778,681,3,98,62,66 2 72 H
+I 389,681,3,73,51,66 2 73 I
+J 389,681,207,78,79,66 2 74 J
+K 722,681,3,74,60,66 2 75 K
+L 611,681,3,17,24,17 2 76 L
+M 944,681,17,91,73,66 2 77 M
+N 778,681,3,101,52,66 2 78 N
+O 833,695,17,11,-26,11 2 79 O
+P 667,681,3,56,39,56 2 80 P
+Q 833,695,222,11,-26,11 2 81 Q
+R 722,681,3,25,46,25 2 82 R
+S 556,695,17,11,0,11 2 83 S
+T 611,681,3,113,-6,66 2 84 T
+U 778,681,17,97,-33,66 2 85 U
+V 667,681,3,128,-17,66 2 86 V
+W 1000,689,3,123,-17,66 2 87 W
+X 722,681,3,100,59,66 2 88 X
+Y 611,695,3,114,-4,66 2 89 Y
+Z 667,681,3,59,49,59 2 90 Z
+[ 333,723,102,98,5,66 2 91 bracketleft
+lB "
+\ 606,720,0,0,-22 2 92 backslash
+rs "
+] 333,723,102,32,71,32 2 93 bracketright
+rB "
+^ 333,692,0,132,-38,66 2 94 circumflex
+a^ "
+_ 500,0,125,50,50,50 0 95 underscore
+` 278,720,0,63,-15,63 2 96 quoteleft
+oq "
+a 556,470,17,13,6,13 0 97 a
+b 537,726,17,7,6,7 2 98 b
+c 444,469,17,42,18,42 0 99 c
+d 556,726,17,44,12,44 2 100 d
+e 444,469,17,24,22,24 0 101 e
+f 333,726,271,166,180,66 3 102 f
+g 500,469,271,79,100,66 1 103 g
+h 556,726,17,16,28,16 2 104 h
+i 333,695,17,29,24,29 2 105 i
+j 333,695,271,40,114,40 3 106 j
+k 556,726,17,22,16,22 2 107 k
+l 333,726,17,35,-14,35 2 108 l
+m 833,469,17,20,31,20 0 109 m
+n 556,469,17,15,33,15 0 110 n
+o 556,469,17,0,2 0 111 o
+p 556,469,271,10,71,10 1 112 p
+q 537,469,271,26,18,26 1 113 q
+r 389,469,17,72,30,66 0 114 r
+s 444,469,17,12,25,12 0 115 s
+t 389,636,17,70,8,66 2 116 t
+u 556,469,17,15,28,15 0 117 u
+v 556,469,17,7,31,7 0 118 v
+w 833,469,17,19,23,19 0 119 w
+x 500,469,17,50,58,50 0 120 x
+y 556,469,271,35,37,35 1 121 y
+z 500,469,17,20,19,20 0 122 z
+{ 333,720,105,51,32,51 2 123 braceleft
+lC "
+| 606,750,250,0,-209 2 124 bar
+ba "
+} 333,720,105,32,51,32 2 125 braceright
+rC "
+~ 333,656,0,158,-32,66 2 126 tilde
+a~ "
+bq 250,145,144,20,53,20 0 128 quotesinglbase
+Fo 500,446,0,8,15,8 0 129 guillemotleft
+Fc 500,443,0,8,15,8 0 130 guillemotright
+bu 606,516,0,0,-81 0 131 bullet
+Fn 500,690,242,29,42,29 2 132 florin
+f/ 167,683,0,221,220,66 2 133 fraction
+%0 1000,691,17,0,-15 2 134 perthousand
+dg 556,685,3,0,-17 2 135 dagger
+dd 556,693,153,31,17,31 2 136 daggerdbl
+en 500,282,0,62,62,62 0 137 endash
+em 1000,282,0,62,62,62 0 138 emdash
+fi 611,726,271,27,180,27 3 140 fi
+fl 611,726,271,70,180,66 3 141 fl
+.i 333,469,17,10,24,10 0 144 dotlessi
+ga 333,699,0,39,-60,39 2 146 grave
+a" 333,699,0,126,78,66 2 147 hungarumlaut
+a. 333,695,0,42,-152,42 2 148 dotaccent
+ab 333,680,0,129,-46,66 2 149 breve
+ah 333,692,0,162,-63,66 2 150 caron
+ao 556,714,0,0,-227 2 151 ring
+ho 333,0,226,0,-26 0 152 ogonek
+lq 500,720,0,61,-15,61 2 153 quotedblleft
+rq 500,720,0,69,-23,66 2 154 quotedblright
+oe 778,469,17,27,2,27 0 155 oe
+/l 333,726,17,82,37,66 2 156 lslash
+Bq 500,145,144,0,68 0 157 quotedblbase
+OE 944,695,17,67,11,66 2 158 OE
+/L 611,681,3,17,44,17 2 159 Lslash
+r! 333,479,225,0,48 0 161 exclamdown
+ct 500,547,105,6,-2,6 0 162 cent
+Po 500,683,5,51,29,51 2 163 sterling
+Cs 500,533,0,18,18,18 0 164 currency
+Ye 500,695,3,88,39,66 2 165 yen
+bb 606,675,175,0,-209 2 166 brokenbar
+sc 556,695,151,0,3 2 167 section
+ad 333,695,0,143,-40,66 2 168 dieresis
+co 747,695,17,23,24,23 2 169 copyright
+Of 333,684,0,72,3,66 2 170 ordfeminine
+fo 333,446,0,9,-10,9 0 171 guilsinglleft
+tno 606,390,0,0,-1 0 172 logicalnot
+\- 606,292,0,0,-1 0 173 minus
+rg 747,695,17,23,24,23 2 174 registered
+a- 333,608,0,135,-26,66 0 175 macron
+de 400,683 2 176 degree
+t+- 606,501 0 177 plusminus
+S2 300,683,0,71,24,66 2 178 twosuperior
+S3 300,683,0,60,27,60 2 179 threesuperior
+aa 333,699,0,109,-103,66 2 180 acute
+*m 541,465,212,15,97,15 0 181 mu
+mc "
+ps 556,681,204,123,36,66 2 182 paragraph
+pc 250,324,0,6,-17,6 0 183 periodcentered
+ac 333,5,218,0,38 0 184 cedilla
+S1 300,680,0,48,9,48 2 185 onesuperior
+Om 333,683,0,63,-1,63 2 186 ordmasculine
+fc 333,443,0,0,15 0 187 guilsinglright
+14 750,683,2,32,32,32 2 188 onequarter
+12 750,683,2,36,36,36 2 189 onehalf
+34 750,683,2,32,32,32 2 190 threequarters
+r? 444,479,226,0,62 0 191 questiondown
+`A 722,911,3,13,85,13 2 192 Agrave
+'A 722,911,3,13,85,13 2 193 Aacute
+^A 722,904,3,13,85,13 2 194 Acircumflex
+~A 722,868,3,13,85,13 2 195 Atilde
+:A 722,880,3,13,85,13 2 196 Adieresis
+oA 722,926,3,13,85,13 2 197 Aring
+AE 944,681,3,33,79,33 2 198 AE
+,C 685,695,218,60,-19,60 2 199 Ccedilla
+`E 611,911,3,45,39,45 2 200 Egrave
+'E 611,911,3,45,39,45 2 201 Eacute
+^E 611,904,3,45,39,45 2 202 Ecircumflex
+:E 611,880,3,45,39,45 2 203 Edieresis
+`I 389,911,3,73,51,66 2 204 Igrave
+'I 389,911,3,81,51,66 2 205 Iacute
+^I 389,904,3,104,51,66 2 206 Icircumflex
+:I 389,880,3,115,51,66 2 207 Idieresis
+-D 778,682,3,19,50,19 2 208 Eth
+~N 778,868,3,101,52,66 2 209 Ntilde
+`O 833,911,17,11,-26,11 2 210 Ograve
+'O 833,911,17,11,-26,11 2 211 Oacute
+^O 833,904,17,11,-26,11 2 212 Ocircumflex
+~O 833,868,17,11,-26,11 2 213 Otilde
+:O 833,880,17,11,-26,11 2 214 Odieresis
+tmu 606,479,0,0,-22 0 215 multiply
+/O 833,730,54,14,-7,14 2 216 Oslash
+`U 778,911,17,97,-33,66 2 217 Ugrave
+'U 778,911,17,97,-33,66 2 218 Uacute
+^U 778,904,17,97,-33,66 2 219 Ucircumflex
+:U 778,880,17,97,-33,66 2 220 Udieresis
+'Y 611,911,3,114,-4,66 2 221 Yacute
+TP 667,681,3,27,39,27 2 222 Thorn
+ss 556,726,271,43,181,43 3 223 germandbls
+`a 556,719,17,13,6,13 2 224 agrave
+'a 556,719,17,13,6,13 2 225 aacute
+^a 556,712,17,21,6,21 2 226 acircumflex
+~a 556,676,17,47,6,47 2 227 atilde
+:a 556,688,17,32,6,32 2 228 adieresis
+oa 556,734,17,13,6,13 2 229 aring
+ae 738,469,17,23,6,23 0 230 ae
+,c 444,469,218,42,23,42 0 231 ccedilla
+`e 444,719,17,24,22,24 2 232 egrave
+'e 444,719,17,54,22,54 2 233 eacute
+^e 444,712,17,77,22,66 2 234 ecircumflex
+:e 444,668,17,88,22,66 2 235 edieresis
+`i 333,719,17,39,24,39 2 236 igrave
+'i 333,719,17,109,24,66 2 237 iacute
+^i 333,712,17,120,24,66 2 238 icircumflex
+:i 333,668,17,143,24,66 2 239 idieresis
+Sd 556,726,17,40,2,40 2 240 eth
+~n 556,676,17,47,33,47 2 241 ntilde
+`o 556,719,17,0,2 2 242 ograve
+'o 556,719,17,0,2 2 243 oacute
+^o 556,712,17,21,2,21 2 244 ocircumflex
+~o 556,676,17,47,2,47 2 245 otilde
+:o 556,668,17,32,2,32 2 246 odieresis
+tdi 606,501,5 0 247 divide
+/o 556,506,50,16,36,16 0 248 oslash
+`u 556,719,17,15,28,15 2 249 ugrave
+'u 556,719,17,15,28,15 2 250 uacute
+^u 556,712,17,15,28,15 2 251 ucircumflex
+:u 556,668,17,32,28,32 2 252 udieresis
+'y 556,719,271,35,37,35 3 253 yacute
+Tp 556,726,271,10,71,10 3 254 thorn
+:y 556,668,271,35,37,35 3 255 ydieresis
+u2026 1000,135,17,0,-41 0 256 ellipsis
diff --git a/font/devps/PI b/font/devps/PI
new file mode 100644
index 0000000..65362bc
--- /dev/null
+++ b/font/devps/PI
@@ -0,0 +1,753 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Palatino Italic
+# Version 003.001
+# FamilyName Palatino
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Palatino is a trademark of Linotype-Hell AG and/or its subsidiaries.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:17:38 1999
+# Comment UniqueID 44716
+# Comment VMusage 44424 55360
+
+name PI
+internalname Palatino-Italic
+slant 10
+spacewidth 250
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A T -55
+A V -74
+A W -55
+A Y -55
+A 'Y -55
+A :Y -55
+A ' -55
+A cq -55
+A u0020 -37
+A v -37
+A w -37
+A y -55
+A 'y -55
+A :y -55
+'A T -55
+'A V -74
+'A W -55
+'A Y -55
+'A 'Y -55
+'A :Y -55
+'A ' -55
+'A cq -55
+'A u0020 -37
+'A v -37
+'A w -37
+'A y -55
+'A 'y -55
+'A :y -55
+^A T -55
+^A V -74
+^A W -55
+^A Y -55
+^A 'Y -55
+^A :Y -55
+^A ' -55
+^A cq -55
+^A u0020 -37
+^A v -37
+^A w -37
+^A y -55
+^A 'y -55
+^A :y -55
+:A T -55
+:A V -74
+:A W -55
+:A Y -55
+:A 'Y -55
+:A :Y -55
+:A ' -55
+:A cq -55
+:A u0020 -37
+:A v -37
+:A w -37
+:A y -55
+:A 'y -55
+:A :y -55
+`A T -55
+`A V -74
+`A W -55
+`A Y -55
+`A 'Y -55
+`A :Y -55
+`A ' -55
+`A cq -55
+`A u0020 -37
+`A v -37
+`A w -37
+`A y -55
+`A 'y -55
+`A :y -55
+oA T -55
+oA V -74
+oA W -55
+oA Y -55
+oA 'Y -55
+oA :Y -55
+oA ' -55
+oA cq -55
+oA u0020 -37
+oA v -37
+oA w -37
+oA y -55
+oA 'y -55
+oA :y -55
+~A T -55
+~A V -74
+~A W -55
+~A Y -55
+~A 'Y -55
+~A :Y -55
+~A ' -55
+~A cq -55
+~A u0020 -37
+~A v -37
+~A w -37
+~A y -55
+~A 'y -55
+~A :y -55
+F A -111
+F 'A -111
+F ^A -111
+F :A -111
+F `A -111
+F oA -111
+F ~A -111
+F , -111
+F . -111
+F u2026 -111
+L T -74
+L V -74
+L W -74
+L Y -74
+L 'Y -74
+L :Y -74
+L ' -37
+L cq -37
+L u0020 -18
+L y -37
+L 'y -37
+L :y -37
+/L T -74
+/L V -74
+/L W -74
+/L Y -74
+/L 'Y -74
+/L :Y -74
+/L ' -37
+/L cq -37
+/L u0020 -18
+/L y -37
+/L 'y -37
+/L :y -37
+P A -129
+P 'A -129
+P ^A -129
+P :A -129
+P `A -129
+P oA -129
+P ~A -129
+P , -129
+P . -129
+P u2026 -129
+R T -55
+R V -74
+R W -55
+R Y -55
+R 'Y -55
+R :Y -55
+R y -37
+R 'y -37
+R :y -37
+T A -92
+T 'A -92
+T ^A -92
+T :A -92
+T `A -92
+T oA -92
+T ~A -92
+T O -18
+T 'O -18
+T ^O -18
+T :O -18
+T `O -18
+T /O -18
+T ~O -18
+T a -111
+T 'a -111
+T ^a -71
+T :a -71
+T `a -71
+T oa -71
+T ~a -71
+T c -111
+T ,c -111
+T : -74
+T , -74
+T e -111
+T 'e -111
+T ^e -71
+T :e -71
+T `e -71
+T - -55
+T hy -55
+T i -55
+T 'i -55
+T o -111
+T 'o -111
+T ^o -71
+T :o -71
+T `o -71
+T /o -111
+T ~o -71
+T . -74
+T u2026 -74
+T r -111
+T s -111
+T vs -71
+T ; -74
+T u -111
+T 'u -111
+T ^u -111
+T :u -111
+T `u -111
+T w -92
+T y -92
+T 'y -92
+T :y -92
+V A -210
+V 'A -210
+V ^A -210
+V :A -210
+V `A -210
+V oA -210
+V ~A -210
+V a -74
+V 'a -74
+V ^a -74
+V :a -74
+V `a -74
+V oa -74
+V ~a -74
+V : -37
+V , -129
+V e -92
+V 'e -92
+V ^e -52
+V :e -52
+V `e -52
+V - -55
+V hy -55
+V i -74
+V 'i -74
+V ^i -34
+V :i -34
+V `i -34
+V o -74
+V 'o -74
+V ^o -74
+V :o -74
+V `o -74
+V /o -74
+V ~o -74
+V . -129
+V u2026 -129
+V r -92
+V ; -37
+V u -74
+V 'u -74
+V ^u -74
+V :u -74
+V `u -74
+V y -74
+V 'y -74
+V :y -74
+W A -92
+W 'A -92
+W ^A -92
+W :A -92
+W `A -92
+W oA -92
+W ~A -92
+W a -20
+W 'a -20
+W ^a -20
+W :a -20
+W `a -20
+W oa -20
+W ~a -20
+W : -18
+W , -55
+W e -20
+W 'e -20
+W ^e -20
+W :e -20
+W `e -20
+W - -18
+W hy -18
+W i -20
+W 'i -20
+W o -20
+W 'o -20
+W ^o -20
+W :o -20
+W `o -20
+W /o -20
+W ~o -20
+W . -55
+W u2026 -55
+W r -20
+W ; -18
+W u -20
+W 'u -20
+W ^u -20
+W :u -20
+W `u -20
+W y -20
+W 'y -20
+W :y -20
+Y A -92
+Y 'A -92
+Y ^A -92
+Y :A -92
+Y `A -92
+Y oA -92
+Y ~A -92
+Y a -92
+Y 'a -92
+Y ^a -92
+Y :a -92
+Y `a -92
+Y oa -92
+Y ~a -92
+Y : -74
+Y , -92
+Y e -111
+Y 'e -111
+Y ^e -71
+Y :e -71
+Y `e -71
+Y - -74
+Y hy -74
+Y i -55
+Y 'i -55
+Y o -111
+Y 'o -111
+Y ^o -111
+Y :o -111
+Y `o -111
+Y /o -111
+Y ~o -111
+Y p -74
+Y . -92
+Y u2026 -92
+Y q -92
+Y ; -74
+Y u -92
+Y 'u -92
+Y ^u -92
+Y :u -92
+Y `u -92
+Y v -74
+'Y A -92
+'Y 'A -92
+'Y ^A -92
+'Y :A -92
+'Y `A -92
+'Y oA -92
+'Y ~A -92
+'Y a -92
+'Y 'a -92
+'Y ^a -92
+'Y :a -92
+'Y `a -92
+'Y oa -92
+'Y ~a -92
+'Y : -74
+'Y , -92
+'Y e -111
+'Y 'e -111
+'Y ^e -71
+'Y :e -71
+'Y `e -71
+'Y - -74
+'Y hy -74
+'Y i -55
+'Y 'i -55
+'Y o -111
+'Y 'o -111
+'Y ^o -111
+'Y :o -111
+'Y `o -111
+'Y /o -111
+'Y ~o -111
+'Y p -74
+'Y . -92
+'Y u2026 -92
+'Y q -92
+'Y ; -74
+'Y u -92
+'Y 'u -92
+'Y ^u -92
+'Y :u -92
+'Y `u -92
+'Y v -74
+:Y A -92
+:Y 'A -92
+:Y ^A -92
+:Y :A -92
+:Y `A -92
+:Y oA -92
+:Y ~A -92
+:Y a -92
+:Y 'a -92
+:Y ^a -92
+:Y :a -92
+:Y `a -92
+:Y oa -92
+:Y ~a -92
+:Y : -74
+:Y , -92
+:Y e -111
+:Y 'e -111
+:Y ^e -71
+:Y :e -71
+:Y `e -71
+:Y - -74
+:Y hy -74
+:Y i -55
+:Y 'i -55
+:Y o -111
+:Y 'o -111
+:Y ^o -111
+:Y :o -111
+:Y `o -111
+:Y /o -111
+:Y ~o -111
+:Y p -74
+:Y . -92
+:Y u2026 -92
+:Y q -92
+:Y ; -74
+:Y u -92
+:Y 'u -92
+:Y ^u -92
+:Y :u -92
+:Y `u -92
+:Y v -74
+f ' 55
+f cq 55
+1 1 -55
+` ` -74
+` oq -74
+oq ` -74
+oq oq -74
+' ' -74
+' cq -74
+cq ' -74
+cq cq -74
+' s -55
+cq s -55
+' vs -55
+cq vs -55
+' u0020 -55
+cq u0020 -55
+' t -37
+cq t -37
+r c -18
+r ,c -18
+r , -74
+r e -18
+r 'e -18
+r ^e -18
+r :e -18
+r `e -18
+r g -18
+r h -18
+r o -18
+r 'o -18
+r ^o -18
+r :o -18
+r `o -18
+r /o -18
+r ~o -18
+r . -74
+r u2026 -74
+r q -18
+r ' 37
+r cq 37
+v , -55
+v . -55
+v u2026 -55
+w , -55
+w . -55
+w u2026 -55
+y , -37
+y . -37
+y u2026 -37
+'y , -37
+'y . -37
+'y u2026 -37
+:y , -37
+:y . -37
+:y u2026 -37
+
+charset
+ha 606,689,0,0,-1 2 0 asciicircum
+ti 606,339,0,0,-1 0 1 asciitilde
+vS 556,889,18,33,8,33 2 2 Scaron
+vZ 667,889,3,20,30,20 2 3 Zcaron
+vs 389,699,11,50,41,50 2 4 scaron
+vz 444,699,11,53,51,53 2 5 zcaron
+:Y 667,847,3,58,-2,58 2 6 Ydieresis
+tm 1000,689,0,1,-2,1 2 7 trademark
+aq 333,733,0,5,-90,5 2 8 quotesingle
+Eu 500,699,12,97,39,68 2 9 Euro
+space 250 0 32 space
+! 333,733,8,9,-26,9 2 33 exclam
+" 500,733,0,5,-90,5 2 34 quotedbl
+dq "
+# 500,692,0,45,46,45 2 35 numbersign
+sh "
+$ 500,733,113,2,35,2 2 36 dollar
+Do "
+% 889,710,7,0,-24 2 37 percent
+& 778,692,18,38,3,38 2 38 ampersand
+' 278,733,0,30,-28,30 2 39 quoteright
+cq "
+( 333,733,106,48,-4,48 2 40 parenleft
+) 333,733,106,0,48 2 41 parenright
+* 389,706,0,61,-26,61 2 42 asterisk
++ 606,504,0,0,-1 0 43 plus
+, 250,123,143,3,42,3 0 44 comma
+- 333,281,0,21,31,21 0 45 hyphen
+hy "
+. 250,112,5,0,-3 0 46 period
+/ 296,733,119,146,90,68 2 47 slash
+sl "
+0 500,699,11,30,14,30 2 48 zero
+1 500,699,3,0,-4 2 49 one
+2 500,699,3,0,38 2 50 two
+3 500,699,11,0,28 2 51 three
+4 500,699,3,28,35,28 2 52 four
+5 500,693,11,41,36,41 2 53 five
+6 500,699,11,19,1,19 2 54 six
+7 500,692,3,52,-3,52 2 55 seven
+8 500,699,11,19,14,19 2 56 eight
+9 500,699,11,18,18,18 2 57 nine
+: 250,458,5,7,6,7 0 58 colon
+; 250,456,146,19,59,19 0 59 semicolon
+< 606,516,6,0,-3 0 60 less
+= 606,378,0,0,-1 0 61 equal
+> 606,516,6,0,-3 0 62 greater
+? 500,706,8,0,-64 2 63 question
+@ 747,706,18,21,23,21 2 64 at
+at "
+A 722,705,3,5,69,5 2 65 A
+B 611,692,6,0,24 2 66 B
+C 667,706,18,34,5,34 2 67 C
+D 778,692,3,13,22,13 2 68 D
+E 611,692,3,9,20,9 2 69 E
+F 556,692,3,42,50,42 2 70 F
+G 722,706,18,22,0,22 2 71 G
+H 778,692,3,72,53,68 2 72 H
+I 333,692,3,71,43,68 2 73 I
+J 333,692,206,75,85,68 2 74 J
+K 667,692,3,66,37,66 2 75 K
+L 556,692,3,17,34,17 2 76 L
+M 944,692,18,46,69,46 2 77 M
+N 778,692,11,76,48,68 2 78 N
+O 778,706,18,20,-3,20 2 79 O
+P 611,692,3,33,41,33 2 80 P
+Q 778,706,201,20,-3,20 2 81 Q
+R 667,692,3,22,41,22 2 82 R
+S 556,706,18,0,8 2 83 S
+T 611,692,3,74,-3,68 2 84 T
+U 778,692,18,70,-38,68 2 85 U
+V 722,692,8,82,-25,68 2 86 V
+W 944,700,8,86,-21,68 2 87 W
+X 722,692,3,62,30,62 2 88 X
+Y 667,705,3,58,-2,58 2 89 Y
+Z 667,692,3,20,30,20 2 90 Z
+[ 333,733,100,43,32,43 2 91 bracketleft
+lB "
+\ 606,733,0,0,-31 2 92 backslash
+rs "
+] 333,733,100,32,43,32 2 93 bracketright
+rB "
+^ 333,679,0,67,-6,67 2 94 circumflex
+a^ "
+_ 500,0,125,50,50,50 0 95 underscore
+` 278,733,0,30,-28,30 2 96 quoteleft
+oq "
+a 444,482,11,12,46,12 0 97 a
+b 463,733,11,20,14,20 2 98 b
+c 407,482,11,32,25,32 0 99 c
+d 500,733,11,33,33,33 2 100 d
+e 389,482,11,35,35,35 0 101 e
+f 278,733,276,185,212,68 3 102 f
+g 500,482,276,48,87,48 1 103 g
+h 500,733,9,21,40,21 2 104 h
+i 278,712,9,36,16,36 2 105 i
+j 278,712,276,37,120,37 3 106 j
+k 444,733,9,55,42,55 2 107 k
+l 278,733,9,23,14,23 2 108 l
+m 778,482,9,12,26,12 0 109 m
+n 556,482,9,8,26,8 0 110 n
+o 444,482,11,17,33,17 0 111 o
+p 500,482,276,15,57,15 1 112 p
+q 463,482,276,19,26,19 1 113 q
+r 389,482,9,45,24,45 0 114 r
+s 389,482,11,6,41,6 0 115 s
+t 333,646,9,27,9,27 2 116 t
+u 556,482,11,6,18,6 0 117 u
+v 500,482,11,27,29,27 0 118 v
+w 722,482,11,27,29,27 0 119 w
+x 500,482,11,34,41,34 0 120 x
+y 500,482,276,40,58,40 1 121 y
+z 444,482,11,22,51,22 0 122 z
+{ 333,733,100,36,35,36 2 123 braceleft
+lC "
+| 606,750,250,0,-225 2 124 bar
+ba "
+} 333,733,100,35,36,35 2 125 braceright
+rC "
+~ 333,638,0,107,-13,68 0 126 tilde
+a~ "
+bq 278,120,122,0,23 0 128 quotesinglbase
+Fo 500,440,0,0,-7 0 129 guillemotleft
+Fc 500,440,0,0,-13 0 130 guillemotright
+bu 500,526,0,0,-36 0 131 bullet
+Fn 500,708,276,20,45,20 3 132 florin
+f/ 167,699,0,220,220,68 2 133 fraction
+%0 1000,717,6,0,-22 2 134 perthousand
+dg 500,692,0,19,2,19 2 135 dagger
+dd 500,692,162,44,40,44 2 136 daggerdbl
+en 500,278,0,60,60,60 0 137 endash
+em 1000,278,0,60,60,60 0 138 emdash
+fi 528,733,276,24,212,24 3 140 fi
+fl 545,733,276,25,212,25 3 141 fl
+.i 278,482,9,13,16,13 0 144 dotlessi
+ga 333,687,0,27,-36,27 2 146 grave
+a" 333,687,0,124,34,68 2 147 hungarumlaut
+a. 333,712,0,0,-139 2 148 dotaccent
+ab 333,677,0,110,-42,68 2 149 breve
+ah 333,679,0,126,-54,68 2 150 caron
+ao 333,708,0,76,-109,68 2 151 ring
+ho 333,0,226,0,19 0 152 ogonek
+lq 500,733,0,25,-48,25 2 153 quotedblleft
+rq 500,733,0,25,-48,25 2 154 quotedblright
+oe 669,482,11,35,33,35 0 155 oe
+/l 278,733,9,74,60,68 2 156 lslash
+Bq 500,120,122,0,7 0 157 quotedblbase
+OE 1028,706,18,11,-6,11 2 158 OE
+/L 556,692,3,17,66,17 2 159 Lslash
+r! 333,467,276,0,35 1 161 exclamdown
+ct 500,551,96,0,-6 0 162 cent
+Po 500,708,18,29,48,29 2 163 sterling
+Cs 500,577,0,36,36,36 0 164 currency
+Ye 500,699,3,62,15,62 2 165 yen
+bb 606,675,175,0,-225 2 166 brokenbar
+sc 500,706,220,13,36,13 2 167 section
+ad 333,712,0,99,-38,68 2 168 dieresis
+co 747,706,18,39,39,39 2 169 copyright
+Of 333,699,0,38,-10,38 2 170 ordfeminine
+fo 333,440,0,0,-7 0 171 guilsinglleft
+tno 606,378,0,0,-1 0 172 logicalnot
+\- 606,280,0,0,-1 0 173 minus
+rg 747,706,18,39,39,39 2 174 registered
+a- 333,589,0,103,-24,68 0 175 macron
+de 400,689,0,40,-40,40 2 176 degree
+t+- 606,504,0,0,-1 0 177 plusminus
+S2 300,699,0,40,37,40 2 178 twosuperior
+S3 300,699,0,54,22,54 2 179 threesuperior
+aa 333,687,0,63,-72,63 2 180 acute
+*m 504,482,211,21,110,21 0 181 mu
+mc "
+ps 500,692,224,161,17,68 2 182 paragraph
+pc 250,312,0,0,-3 0 183 periodcentered
+ac 333,0,216,0,59 0 184 cedilla
+S1 300,699,0,35,-11,35 2 185 onesuperior
+Om 333,699,0,39,-16,39 2 186 ordmasculine
+fc 333,440,0,0,-13 0 187 guilsinglright
+14 750,699,2,15,19,15 2 188 onequarter
+12 750,699,2,21,19,21 2 189 onehalf
+34 750,699,2,15,15,15 2 190 threequarters
+r? 500,467,246,0,-7 0 191 questiondown
+`A 722,897,3,5,69,5 2 192 Agrave
+'A 722,897,3,5,69,5 2 193 Aacute
+^A 722,889,3,5,69,5 2 194 Acircumflex
+~A 722,848,3,5,69,5 2 195 Atilde
+:A 722,847,3,5,69,5 2 196 Adieresis
+oA 722,918,3,5,69,5 2 197 Aring
+AE 941,692,3,11,54,11 2 198 AE
+,C 667,706,216,34,5,34 2 199 Ccedilla
+`E 611,897,3,9,20,9 2 200 Egrave
+'E 611,897,3,9,20,9 2 201 Eacute
+^E 611,889,3,9,20,9 2 202 Ecircumflex
+:E 611,847,3,9,20,9 2 203 Edieresis
+`I 333,897,3,71,43,68 2 204 Igrave
+'I 333,897,3,123,43,68 2 205 Iacute
+^I 333,889,3,107,43,68 2 206 Icircumflex
+:I 333,847,3,139,43,68 2 207 Idieresis
+-D 778,692,3,13,31,13 2 208 Eth
+~N 778,848,11,76,48,68 2 209 Ntilde
+`O 778,897,18,20,-3,20 2 210 Ograve
+'O 778,897,18,20,-3,20 2 211 Oacute
+^O 778,889,18,20,-3,20 2 212 Ocircumflex
+~O 778,848,18,20,-3,20 2 213 Otilde
+:O 778,847,18,20,-3,20 2 214 Odieresis
+tmu 606,474,0,0,-33 0 215 multiply
+/O 778,721,39,34,18,34 2 216 Oslash
+`U 778,897,18,70,-38,68 2 217 Ugrave
+'U 778,897,18,70,-38,68 2 218 Uacute
+^U 778,889,18,70,-38,68 2 219 Ucircumflex
+:U 778,847,18,70,-38,68 2 220 Udieresis
+'Y 667,897,3,58,-2,58 2 221 Yacute
+TP 611,692,3,9,41,9 2 222 Thorn
+ss 500,733,276,38,210,38 3 223 germandbls
+`a 444,707,11,12,46,12 2 224 agrave
+'a 444,707,11,20,46,20 2 225 aacute
+^a 444,699,11,12,46,12 2 226 acircumflex
+~a 444,658,11,52,46,52 2 227 atilde
+:a 444,657,11,44,46,44 2 228 adieresis
+oa 444,728,11,12,46,12 2 229 aring
+ae 638,482,11,35,49,35 0 230 ae
+,c 407,482,216,32,31,32 0 231 ccedilla
+`e 389,707,11,35,35,35 2 232 egrave
+'e 389,707,11,55,35,55 2 233 eacute
+^e 389,699,11,59,35,59 2 234 ecircumflex
+:e 389,657,11,71,35,68 2 235 edieresis
+`i 278,707,9,42,16,42 2 236 igrave
+'i 278,707,9,102,16,68 2 237 iacute
+^i 278,699,9,95,21,68 2 238 icircumflex
+:i 278,657,9,127,16,68 2 239 idieresis
+Sd 444,733,11,84,33,68 2 240 eth
+~n 556,658,9,8,26,8 2 241 ntilde
+`o 444,707,11,17,33,17 2 242 ograve
+'o 444,707,11,20,33,20 2 243 oacute
+^o 444,699,11,17,33,17 2 244 ocircumflex
+~o 444,658,11,52,33,52 2 245 otilde
+:o 444,657,11,44,33,44 2 246 odieresis
+tdi 606,504,0,0,-1 0 247 divide
+/o 444,510,24,66,68,66 0 248 oslash
+`u 556,707,11,6,18,6 2 249 ugrave
+'u 556,707,11,14,18,14 2 250 uacute
+^u 556,699,11,6,18,6 2 251 ucircumflex
+:u 556,657,11,6,18,6 2 252 udieresis
+'y 500,707,276,42,58,42 3 253 yacute
+Tp 500,733,276,0,89 3 254 thorn
+:y 500,657,276,40,58,40 3 255 ydieresis
+u2026 1000,112,5,0,-52 0 256 ellipsis
diff --git a/font/devps/PR b/font/devps/PR
new file mode 100644
index 0000000..63395db
--- /dev/null
+++ b/font/devps/PR
@@ -0,0 +1,767 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Palatino Roman
+# Version 003.001
+# FamilyName Palatino
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Palatino is a trademark of Linotype-Hell AG and/or its subsidiaries.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1992, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:13:46 1999
+# Comment UniqueID 44715
+# Comment VMusage 42362 53298
+
+name PR
+internalname Palatino-Roman
+spacewidth 250
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A T -74
+A V -111
+A W -74
+A Y -111
+A 'Y -111
+A :Y -111
+A ' -74
+A cq -74
+A u0020 -55
+A v -92
+A w -74
+A y -74
+A 'y -74
+A :y -74
+'A T -74
+'A V -111
+'A W -74
+'A Y -111
+'A 'Y -111
+'A :Y -111
+'A ' -74
+'A cq -74
+'A u0020 -55
+'A v -92
+'A w -74
+'A y -74
+'A 'y -74
+'A :y -74
+^A T -74
+^A V -111
+^A W -74
+^A Y -111
+^A 'Y -111
+^A :Y -111
+^A ' -74
+^A cq -74
+^A u0020 -55
+^A v -92
+^A w -74
+^A y -74
+^A 'y -74
+^A :y -74
+:A T -74
+:A V -111
+:A W -74
+:A Y -111
+:A 'Y -111
+:A :Y -111
+:A ' -74
+:A cq -74
+:A u0020 -55
+:A v -92
+:A w -74
+:A y -74
+:A 'y -74
+:A :y -74
+`A T -74
+`A V -111
+`A W -74
+`A Y -111
+`A 'Y -111
+`A :Y -111
+`A ' -74
+`A cq -74
+`A u0020 -55
+`A v -92
+`A w -74
+`A y -74
+`A 'y -74
+`A :y -74
+oA T -74
+oA V -111
+oA W -74
+oA Y -111
+oA 'Y -111
+oA :Y -111
+oA ' -74
+oA cq -74
+oA u0020 -55
+oA v -92
+oA w -74
+oA y -74
+oA 'y -74
+oA :y -74
+~A T -74
+~A V -111
+~A W -74
+~A Y -111
+~A 'Y -111
+~A :Y -111
+~A ' -74
+~A cq -74
+~A u0020 -55
+~A v -92
+~A w -74
+~A y -74
+~A 'y -74
+~A :y -74
+F A -74
+F 'A -74
+F ^A -74
+F :A -74
+F `A -74
+F oA -74
+F ~A -74
+F , -92
+F . -92
+F u2026 -92
+L T -74
+L V -92
+L W -74
+L Y -92
+L 'Y -92
+L :Y -92
+L ' -74
+L cq -74
+L u0020 -37
+L y -55
+L 'y -55
+L :y -55
+/L T -74
+/L V -92
+/L W -74
+/L Y -92
+/L 'Y -92
+/L :Y -92
+/L ' -74
+/L cq -74
+/L u0020 -37
+/L y -55
+/L 'y -55
+/L :y -55
+P A -92
+P 'A -92
+P ^A -92
+P :A -92
+P `A -92
+P oA -92
+P ~A -92
+P , -129
+P . -129
+P u2026 -129
+P u0020 -18
+R T -37
+R V -55
+R W -37
+R Y -37
+R 'Y -37
+R :Y -37
+R y -37
+R 'y -37
+R :y -37
+T A -74
+T 'A -74
+T ^A -74
+T :A -74
+T `A -74
+T oA -74
+T ~A -74
+T O -18
+T 'O -18
+T ^O -18
+T :O -18
+T `O -18
+T /O -18
+T ~O -18
+T a -92
+T 'a -92
+T ^a -92
+T :a -52
+T `a -52
+T oa -92
+T ~a -52
+T c -111
+T ,c -111
+T : -55
+T , -74
+T e -92
+T 'e -92
+T ^e -92
+T :e -52
+T `e -92
+T - -55
+T hy -55
+T i -55
+T 'i -55
+T o -92
+T 'o -92
+T ^o -92
+T :o -92
+T `o -92
+T /o -92
+T ~o -92
+T . -74
+T u2026 -74
+T r -90
+T s -90
+T vs -50
+T ; -55
+T u -90
+T 'u -90
+T ^u -90
+T :u -90
+T `u -90
+T w -90
+T y -90
+T 'y -90
+T :y -90
+V A -111
+V 'A -111
+V ^A -111
+V :A -111
+V `A -111
+V oA -111
+V ~A -111
+V a -92
+V 'a -92
+V ^a -92
+V :a -92
+V `a -92
+V oa -92
+V ~a -92
+V : -55
+V , -129
+V e -111
+V 'e -111
+V ^e -111
+V :e -71
+V `e -71
+V - -74
+V hy -74
+V i -55
+V 'i -55
+V o -111
+V 'o -111
+V ^o -111
+V :o -111
+V `o -71
+V /o -111
+V ~o -111
+V . -129
+V u2026 -129
+V r -92
+V ; -55
+V u -92
+V 'u -92
+V ^u -92
+V :u -92
+V `u -92
+V y -92
+V 'y -92
+V :y -92
+W A -92
+W 'A -92
+W ^A -92
+W :A -92
+W `A -92
+W oA -92
+W ~A -92
+W a -92
+W 'a -92
+W ^a -92
+W :a -92
+W `a -92
+W oa -92
+W ~a -92
+W : -18
+W , -92
+W e -92
+W 'e -92
+W ^e -92
+W :e -92
+W `e -92
+W - -55
+W hy -55
+W i -55
+W 'i -55
+W ^i -55
+W :i -55
+W `i -55
+W o -92
+W 'o -92
+W ^o -92
+W :o -92
+W `o -92
+W /o -92
+W ~o -92
+W . -92
+W u2026 -92
+W r -74
+W ; -18
+W u -50
+W 'u -50
+W ^u -50
+W :u -50
+W `u -50
+W y -50
+W 'y -50
+W :y -50
+Y A -92
+Y 'A -92
+Y ^A -92
+Y :A -92
+Y `A -92
+Y oA -92
+Y ~A -92
+Y a -92
+Y 'a -92
+Y ^a -92
+Y :a -92
+Y `a -92
+Y oa -92
+Y ~a -92
+Y : -74
+Y , -111
+Y e -92
+Y 'e -92
+Y ^e -92
+Y :e -92
+Y `e -92
+Y - -92
+Y hy -92
+Y i -55
+Y 'i -55
+Y o -92
+Y 'o -92
+Y ^o -92
+Y :o -92
+Y `o -92
+Y /o -92
+Y ~o -92
+Y p -111
+Y . -111
+Y u2026 -111
+Y q -90
+Y ; -74
+Y u0020 -18
+Y u -90
+Y 'u -90
+Y ^u -90
+Y :u -90
+Y `u -90
+Y v -90
+'Y A -92
+'Y 'A -92
+'Y ^A -92
+'Y :A -92
+'Y `A -92
+'Y oA -92
+'Y ~A -92
+'Y a -92
+'Y 'a -92
+'Y ^a -92
+'Y :a -92
+'Y `a -92
+'Y oa -92
+'Y ~a -92
+'Y : -74
+'Y , -111
+'Y e -92
+'Y 'e -92
+'Y ^e -92
+'Y :e -92
+'Y `e -92
+'Y - -92
+'Y hy -92
+'Y i -55
+'Y 'i -55
+'Y o -92
+'Y 'o -92
+'Y ^o -92
+'Y :o -92
+'Y `o -92
+'Y /o -92
+'Y ~o -92
+'Y p -111
+'Y . -111
+'Y u2026 -111
+'Y q -90
+'Y ; -74
+'Y u0020 -18
+'Y u -90
+'Y 'u -90
+'Y ^u -90
+'Y :u -90
+'Y `u -90
+'Y v -90
+:Y A -92
+:Y 'A -92
+:Y ^A -92
+:Y :A -92
+:Y `A -92
+:Y oA -92
+:Y ~A -92
+:Y a -92
+:Y 'a -92
+:Y ^a -92
+:Y :a -92
+:Y `a -92
+:Y oa -92
+:Y ~a -92
+:Y : -74
+:Y , -111
+:Y e -92
+:Y 'e -92
+:Y ^e -92
+:Y :e -92
+:Y `e -92
+:Y - -92
+:Y hy -92
+:Y i -55
+:Y 'i -55
+:Y o -92
+:Y 'o -92
+:Y ^o -92
+:Y :o -92
+:Y `o -92
+:Y /o -92
+:Y ~o -92
+:Y p -111
+:Y . -111
+:Y u2026 -111
+:Y q -90
+:Y ; -74
+:Y u0020 -18
+:Y u -90
+:Y 'u -90
+:Y ^u -90
+:Y :u -90
+:Y `u -90
+:Y v -90
+f f -18
+f ' 55
+f cq 55
+1 1 -55
+` ` -37
+` oq -37
+oq ` -37
+oq oq -37
+' ' -37
+' cq -37
+cq ' -37
+cq cq -37
+r c -18
+r ,c -18
+r , -74
+r d -18
+r e -18
+r 'e -18
+r ^e -18
+r :e -18
+r `e -18
+r g -18
+r h -18
+r - -18
+r hy -18
+r o -18
+r 'o -18
+r ^o -18
+r :o -18
+r `o -18
+r /o -18
+r ~o -18
+r . -74
+r u2026 -74
+r q -18
+r ' 74
+r cq 74
+r u -8
+r 'u -8
+r ^u -8
+r :u -8
+r `u -8
+u0020 A -37
+u0020 'A -37
+u0020 ^A -37
+u0020 :A -37
+u0020 `A -37
+u0020 oA -37
+u0020 ~A -37
+u0020 Y -18
+u0020 'Y -18
+u0020 :Y -18
+v , -111
+v . -111
+v u2026 -111
+w , -92
+w . -92
+w u2026 -92
+y , -111
+y . -111
+y u2026 -111
+'y , -111
+'y . -111
+'y u2026 -111
+:y , -111
+:y . -111
+:y u2026 -111
+
+charset
+ha 606,689 2 0 asciicircum
+ti 606,347 0 1 asciitilde
+vS 525,908,20 2 2 Scaron
+vZ 667,908,3 2 3 Zcaron
+vs 424,697,20 2 4 scaron
+vz 500,697,3 2 5 zcaron
+:Y 667,868,3 2 6 Ydieresis
+tm 979,689 2 7 trademark
+aq 208,709 2 8 quotesingle
+Eu 500,689,20,1,2 2 9 Euro
+space 250 0 32 space
+! 278,694,5 2 33 exclam
+" 371,709 2 34 quotedbl
+dq "
+# 500,684 2 35 numbersign
+sh "
+$ 500,731,116 2 36 dollar
+Do "
+% 840,709,20 2 37 percent
+& 778,689,20 2 38 ampersand
+' 278,709 2 39 quoteright
+cq "
+( 333,726,215 2 40 parenleft
+) 333,726,215 2 41 parenright
+* 389,689 2 42 asterisk
++ 606,512 0 43 plus
+, 250,123,155 0 44 comma
+- 333,287 0 45 hyphen
+hy "
+. 250,111,5 0 46 period
+/ 606,726,119 2 47 slash
+sl "
+0 500,689,20 2 48 zero
+1 500,694,3 2 49 one
+2 500,689,3 2 50 two
+3 500,689,20 2 51 three
+4 500,694,3 2 52 four
+5 500,689,20 2 53 five
+6 500,689,20 2 54 six
+7 500,689,3 2 55 seven
+8 500,689,20 2 56 eight
+9 500,689,20 2 57 nine
+: 250,456,5 0 58 colon
+; 250,456,153 0 59 semicolon
+< 606,522 0 60 less
+= 606,386 0 61 equal
+> 606,522 0 62 greater
+? 444,694,5 2 63 question
+@ 747,694,20 2 64 at
+at "
+A 778,700,3 2 65 A
+B 611,692,3 2 66 B
+C 709,709,20 2 67 C
+D 774,692,3 2 68 D
+E 611,692,3 2 69 E
+F 556,692,3 2 70 F
+G 763,709,20 2 71 G
+H 832,692,3 2 72 H
+I 337,692,3 2 73 I
+J 333,692,194,0,15 2 74 J
+K 726,692,3 2 75 K
+L 611,692,3 2 76 L
+M 946,692,13 2 77 M
+N 831,692,20 2 78 N
+O 786,709,20 2 79 O
+P 604,692,3 2 80 P
+Q 786,709,176 2 81 Q
+R 668,692,3,1 2 82 R
+S 525,709,20 2 83 S
+T 613,692,3 2 84 T
+U 778,692,20 2 85 U
+V 722,692,9 2 86 V
+W 1000,700,9 2 87 W
+X 667,700,3 2 88 X
+Y 667,705,3 2 89 Y
+Z 667,692,3 2 90 Z
+[ 333,726,184 2 91 bracketleft
+lB "
+\ 606,726 2 92 backslash
+rs "
+] 333,726,184 2 93 bracketright
+rB "
+^ 333,677 2 94 circumflex
+a^ "
+_ 500,0,125 0 95 underscore
+` 278,709 2 96 quoteleft
+oq "
+a 500,469,12 0 97 a
+b 553,726,12,0,15 2 98 b
+c 444,469,20 0 99 c
+d 611,726,12 2 100 d
+e 479,469,20 0 101 e
+f 333,728,3,8 2 102 f
+g 556,469,283 1 103 g
+h 582,726,3 2 104 h
+i 291,687,3 2 105 i
+j 234,688,283,0,40 3 106 j
+k 556,726,12 2 107 k
+l 291,726,3 2 108 l
+m 883,469,3 0 109 m
+n 582,469,3 0 110 n
+o 546,469,20 0 111 o
+p 601,469,281 1 112 p
+q 560,469,281 1 113 q
+r 395,469,3 0 114 r
+s 424,469,20 0 115 s
+t 326,621,12 2 116 t
+u 603,469,12 0 117 u
+v 565,459,7 0 118 v
+w 834,469,7 0 119 w
+x 516,469,3 0 120 x
+y 556,459,283 1 121 y
+z 500,462,3 0 122 z
+{ 333,726,175 2 123 braceleft
+lC "
+| 606,750,250 2 124 bar
+ba "
+} 333,726,175 2 125 braceright
+rC "
+~ 333,640 2 126 tilde
+a~ "
+bq 278,110,153 0 128 quotesinglbase
+Fo 500,428 0 129 guillemotleft
+Fc 500,428 0 130 guillemotright
+bu 606,516 0 131 bullet
+Fn 500,706,262 2 132 florin
+f/ 167,689,0,170,166 2 133 fraction
+%0 1144,709,20 2 134 perthousand
+dg 500,694,5 2 135 dagger
+dd 500,694,249 2 136 daggerdbl
+en 500,277 0 137 endash
+em 1000,277 0 138 emdash
+fi 605,728,3 2 140 fi
+fl 608,728,3 2 141 fl
+.i 287,469,3 0 144 dotlessi
+ga 333,677 2 146 grave
+a" 380,687 2 147 hungarumlaut
+a. 250,687 2 148 dotaccent
+ab 333,664 2 149 breve
+ah 333,677 2 150 caron
+ao 333,696 2 151 ring
+ho 313,0,225 0 152 ogonek
+lq 500,709 2 153 quotedblleft
+rq 500,709 2 154 quotedblright
+oe 827,469,20 0 155 oe
+/l 291,726,3,15,14 2 156 lslash
+Bq 500,110,153 0 157 quotedblbase
+OE 998,709,20 2 158 OE
+/L 611,692,3 2 159 Lslash
+r! 278,469,225 0 161 exclamdown
+ct 500,562,101 0 162 cent
+Po 500,694,13 2 163 sterling
+Cs 500,531 0 164 currency
+Ye 500,701,3 2 165 yen
+bb 606,675,175 2 166 brokenbar
+sc 500,709,219 2 167 section
+ad 333,687 2 168 dieresis
+co 747,706,18 2 169 copyright
+Of 333,709 2 170 ordfeminine
+fo 331,428 0 171 guilsinglleft
+tno 606,386 0 172 logicalnot
+\- 606,289 0 173 minus
+rg 747,706,18 2 174 registered
+a- 333,591 0 175 macron
+de 400,689 2 176 degree
+t+- 606,512 0 177 plusminus
+S2 300,689,0,1 2 178 twosuperior
+S3 300,689 2 179 threesuperior
+aa 333,677 2 180 acute
+*m 574,470,216 0 181 mu
+mc "
+ps 628,694,150 2 182 paragraph
+pc 250,319 0 183 periodcentered
+ac 333,0,225 0 184 cedilla
+S1 300,692 2 185 onesuperior
+Om 333,709 2 186 ordmasculine
+fc 331,428 0 187 guilsinglright
+14 750,692,3 2 188 onequarter
+12 750,692,3 2 189 onehalf
+34 750,689,3 2 190 threequarters
+r? 444,469,231 0 191 questiondown
+`A 778,908,3 2 192 Agrave
+'A 778,908,3 2 193 Aacute
+^A 778,908,3 2 194 Acircumflex
+~A 778,871,3 2 195 Atilde
+:A 778,868,3 2 196 Adieresis
+oA 778,927,3 2 197 Aring
+AE 944,692,3,0,10 2 198 AE
+,C 709,709,225 2 199 Ccedilla
+`E 611,908,3 2 200 Egrave
+'E 611,908,3 2 201 Eacute
+^E 611,908,3 2 202 Ecircumflex
+:E 611,868,3 2 203 Edieresis
+`I 337,908,3 2 204 Igrave
+'I 337,908,3 2 205 Iacute
+^I 337,908,3 2 206 Icircumflex
+:I 337,868,3 2 207 Idieresis
+-D 774,692,3 2 208 Eth
+~N 831,871,20 2 209 Ntilde
+`O 786,908,20 2 210 Ograve
+'O 786,908,20 2 211 Oacute
+^O 786,908,20 2 212 Ocircumflex
+~O 786,883,20 2 213 Otilde
+:O 786,868,20 2 214 Odieresis
+tmu 606,474 0 215 multiply
+/O 833,709,20 2 216 Oslash
+`U 778,908,20 2 217 Ugrave
+'U 778,908,20 2 218 Uacute
+^U 778,908,20 2 219 Ucircumflex
+:U 778,868,20 2 220 Udieresis
+'Y 667,908,3 2 221 Yacute
+TP 604,692,3 2 222 Thorn
+ss 556,731,9 2 223 germandbls
+`a 500,697,12 2 224 agrave
+'a 500,697,12 2 225 aacute
+^a 500,697,12 2 226 acircumflex
+~a 500,672,12 2 227 atilde
+:a 500,657,12 2 228 adieresis
+oa 500,716,12 2 229 aring
+ae 758,469,20 0 230 ae
+,c 444,469,225 0 231 ccedilla
+`e 479,697,20 2 232 egrave
+'e 479,697,20 2 233 eacute
+^e 479,697,20 2 234 ecircumflex
+:e 479,657,20 2 235 edieresis
+`i 287,697,3 2 236 igrave
+'i 287,697,3 2 237 iacute
+^i 287,697,3,13,12 2 238 icircumflex
+:i 287,657,3,12,11 2 239 idieresis
+Sd 546,728,20 2 240 eth
+~n 582,672,3 2 241 ntilde
+`o 546,697,20 2 242 ograve
+'o 546,697,20 2 243 oacute
+^o 546,697,20 2 244 ocircumflex
+~o 546,672,20 2 245 otilde
+:o 546,657,20 2 246 odieresis
+tdi 606,512 0 247 divide
+/o 556,474,23 0 248 oslash
+`u 603,697,12 2 249 ugrave
+'u 603,697,12 2 250 uacute
+^u 603,697,12 2 251 ucircumflex
+:u 603,657,12 2 252 udieresis
+'y 556,697,283 3 253 yacute
+Tp 601,726,281,0,2 3 254 thorn
+:y 556,657,283 3 255 ydieresis
+u2026 1000,111,5 0 256 ellipsis
diff --git a/font/devps/S b/font/devps/S
new file mode 100644
index 0000000..ae8b3a9
--- /dev/null
+++ b/font/devps/S
@@ -0,0 +1,244 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Symbol
+# Version 001.008
+# FamilyName Symbol
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved.
+# Comment Creation Date: Thu May 1 15:12:25 1997
+# Comment UniqueID 43064
+# Comment VMusage 30820 39997
+
+name S
+internalname Symbol
+special
+spacewidth 250
+
+charset
+space 250 0 32 space
+! 333,672,17 3 33 exclam
+fa 713,705 3 34 universal
+# 500,673,16 3 35 numbersign
+sh "
+te 549,707 3 36 existential
+% 833,655,36 3 37 percent
+& 778,661,18 3 38 ampersand
+st 439,500,17 3 39 suchthat
+( 333,673,191 3 40 parenleft
+) 333,673,191 3 41 parenright
+** 500,551 3 42 asteriskmath
++ 549,533 3 43 plus
+pl "
+, 250,104,152 3 44 comma
+\- 549,288 3 45 minus
+mi "
+. 250,95,17 3 46 period
+/ 278,646,18 3 47 slash
+sl "
+0 500,685,14 3 48 zero
+1 500,673 3 49 one
+2 500,685 3 50 two
+3 500,685,14 3 51 three
+4 500,685 3 52 four
+5 500,690,14 3 53 five
+6 500,685,14 3 54 six
+7 500,673,16 3 55 seven
+8 500,685,14 3 56 eight
+9 500,685,18 3 57 nine
+: 278,460,17 3 58 colon
+; 278,460,152 3 59 semicolon
+< 549,522 3 60 less
+= 549,390 3 61 equal
+eq "
+> 549,522 3 62 greater
+? 444,686,17 3 63 question
+=~ 549,475 3 64 congruent
+*A 722,673 3 65 Alpha
+*B 667,673 3 66 Beta
+*X 722,673,0,0,9 3 67 Chi
+*D 612,688 3 68 Delta
+*E 611,673,0,6 3 69 Epsilon
+*F 763,673 3 70 Phi
+*G 603,673,0,6 3 71 Gamma
+*Y 722,673,0,7 3 72 Eta
+*I 333,673 3 73 Iota
++h 631,689,18 3 74 theta1
+*K 722,673 3 75 Kappa
+*L 686,688 3 76 Lambda
+*M 889,673 3 77 Mu
+*N 722,673,8 3 78 Nu
+*O 722,685,17 3 79 Omicron
+*P 768,673 3 80 Pi
+*H 741,685,17 3 81 Theta
+*R 556,673,0,7 3 82 Rho
+*S 592,673 3 83 Sigma
+*T 611,673 3 84 Tau
+ts 439,500,233 3 86 sigma1
+*W 768,688 3 87 Omega
+*C 645,673 3 88 Xi
+*Q 795,684 3 89 Psi
+*Z 611,673,0,25 3 90 Zeta
+[ 333,674,155 3 91 bracketleft
+lB "
+3d 863,487 3 92 therefore
+tf "
+] 333,674,155 3 93 bracketright
+rB "
+pp 658,674 3 94 perpendicular
+_ 500,0,125,2,2 3 95 underscore
+radicalex 500,917,0,590 3 96 radicalex
+*a 631,500,18 3 97 alpha
+*b 549,741,223 3 98 beta
+*x 549,499,231 3 99 chi
+*d 494,740,19 3 100 delta
+*e 439,502,19 3 101 epsilon
+*f 521,673,224 3 102 phi
+*g 411,499,225,73 3 103 gamma
+*y 603,514,202 3 104 eta
+*i 329,503,17 3 105 iota
++f 603,499,224 3 106 phi1
+*k 549,501,0,9 3 107 kappa
+*l 549,739,17 3 108 lambda
+*m 576,500,223 3 109 mu
+mc "
+*n 521,507,16,0,9 3 110 nu
+*o 549,499,19 3 111 omicron
+*p 549,487,19 3 112 pi
+*h 521,690,17 3 113 theta
+*r 549,499,230 3 114 rho
+*s 603,500,21 3 115 sigma
+*t 439,500,19 3 116 tau
+*u 576,507,18 3 117 upsilon
++p 713,583,18 3 118 omega1
+*w 686,500,17 3 119 omega
+*c 493,766,224 3 120 xi
+*q 686,500,228,15 3 121 psi
+*z 494,756,225 3 122 zeta
+{ 480,673,183 3 123 braceleft
+lC "
+| 200,707,293 3 124 bar
+ba "
+} 480,673,183 3 125 braceright
+rC "
+ap 549,307 3 126 similar
+Eu 750,685,12 3 160 Euro
+*U 620,685,0,0,2 3 161 Upsilon1
+fm 247,735 3 162 minute
+<= 549,639 3 163 lessequal
+f/ 167,677,12,173,180 3 164 fraction
+if 713,404 3 165 infinity
+Fn 500,686,193 3 166 florin
+CL 753,533,26 3 167 club
+DI 753,550,36 3 168 diamond
+HE 753,532,33 3 169 heart
+SP 753,548,36 3 170 spade
+<> 1042,511,15 3 171 arrowboth
+<- 987,511,15 3 172 arrowleft
+ua 603,910 3 173 arrowup
+arrowverttp "
+-> 987,511,15 3 174 arrowright
+da 603,888,22 3 175 arrowdown
+arrowvertbt "
+de 400,685 3 176 degree
+t+- 549,645 3 177 plusminus
++- "
+sd 411,737,0,2 3 178 second
+>= 549,639 3 179 greaterequal
+tmu 549,524 3 180 multiply
+mu "
+pt 713,404 3 181 proportional
+pd 494,746,20 3 182 partialdiff
+bu 460,473 3 183 bullet
+tdi 549,456 3 184 divide
+di "
+!= 549,549,25 3 185 notequal
+== 549,443 3 186 equivalence
+~~ 549,394 3 187 approxequal
+~= "
+u2026 1000,95,17 3 188 ellipsis
+arrowvertex 603,1010,120 3 189 arrowvertex
+an 1000,276,0,50,60 3 190 arrowhorizex
+CR 658,629,16 3 191 carriagereturn
+Ah 823,658,18 3 192 aleph
+Im 686,740,53 3 193 Ifraktur
+Re 795,734,15 3 194 Rfraktur
+wp 987,573,211 3 195 weierstrass
+c* 768,673,17 3 196 circlemultiply
+c+ 768,675,15 3 197 circleplus
+es 823,719,24 3 198 emptyset
+ca 768,509 3 199 intersection
+cu 768,492,17 3 200 union
+sp 713,470 3 201 propersuperset
+ip 713,470,125 3 202 reflexsuperset
+nb 713,540,70 3 203 notsubset
+sb 713,470 3 204 propersubset
+ib 713,470,125 3 205 reflexsubset
+mo 713,468 3 206 element
+nm 713,555,58 3 207 notelement
+/_ 768,673 3 208 angle
+gr 713,718,19 3 209 gradient
+--- 790,673,17 3 210 registerserif
+--- 790,675,15 3 211 copyrightserif
+--- 890,673 3 212 trademarkserif
+product 823,751,101 3 213 product
+sqrt 549,917,38 3 214 radical
+sr "
+md 250,310 3 215 dotmath
+tno 713,288 3 216 logicalnot
+no "
+AN 603,454 3 217 logicaland
+OR 603,477 3 218 logicalor
+hA 1042,510,20 3 219 arrowdblboth
+lA 987,513,15 3 220 arrowdblleft
+uA 603,911 3 221 arrowdblup
+rA 987,508,20 3 222 arrowdblright
+dA 603,890,19 3 223 arrowdbldown
+lz 494,745 3 224 lozenge
+la 329,746,198 3 225 angleleft
+--- 790,670,20 3 226 registersans
+--- 790,675,15 3 227 copyrightsans
+--- 786,673 3 228 trademarksans
+sum 713,752,108 3 229 summation
+parenlefttp 384,926,293,52 3 230 parenlefttp
+parenleftex 384,920,80 3 231 parenleftex
+parenleftbt 384,920,293,52 3 232 parenleftbt
+bracketlefttp 384,925,75 3 233 bracketlefttp
+lc "
+bracketleftex 384,925,75 3 234 bracketleftex
+bracketleftbt 384,925,75 3 235 bracketleftbt
+lf "
+bracelefttp 494,925,75 3 236 bracelefttp
+lt "
+braceleftmid 494,925,75 3 237 braceleftmid
+lk "
+braceleftbt 494,925,75 3 238 braceleftbt
+lb "
+barex 494,925,75 3 239 braceex
+braceex "
+braceleftex "
+bracerightex "
+bv "
+ra 329,746,198 3 241 angleright
+integral 274,916,107,67,52,-10 3 242 integral
+is "
+u2320 686,920,88 3 243 integraltp
+u23AE 686,975,88 3 244 integralex
+u2321 686,921,87 3 245 integralbt
+parenrighttp 384,926,293,82 3 246 parenrighttp
+parenrightex 384,920,80,82 3 247 parenrightex
+parenrightbt 384,920,293,82 3 248 parenrightbt
+bracketrighttp 384,925,75 3 249 bracketrighttp
+rc "
+bracketrightex 384,925,75 3 250 bracketrightex
+bracketrightbt 384,925,75 3 251 bracketrightbt
+rf "
+bracerighttp 494,925,75 3 252 bracerighttp
+rt "
+bracerightmid 494,925,75 3 253 bracerightmid
+rk "
+bracerightbt 494,925,75 3 254 bracerightbt
+rb "
+--- 790,808,3 3 256 apple
diff --git a/font/devps/SS b/font/devps/SS
new file mode 100644
index 0000000..232594e
--- /dev/null
+++ b/font/devps/SS
@@ -0,0 +1,210 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Symbol Slanted
+# Version 001.008
+# FamilyName Symbol
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved.
+# Comment Creation Date: Thu May 1 15:12:25 1997
+# Comment UniqueID 43064
+# Comment VMusage 30820 39997
+
+name SS
+internalname Symbol-Slanted
+special
+slant 15.5
+spacewidth 223
+
+charset
+space 223 0 32 space
+--- 296,598,15,137,-73,99 3 33 exclam
+--- 635,627,0,217,-173,99 3 34 universal
+--- 445,599,14,162,-21,99 3 35 numbersign
+--- 489,629,0,182,28,99 3 36 existential
+--- 741,583,32,75,-97,75 3 37 percent
+--- 692,589,16,103,-18,99 3 38 ampersand
+--- 391,445,15,109,6,99 3 39 suchthat
+--- 296,599,170,203,-39,99 3 40 parenleft
+--- 296,599,170,93,72,93 3 41 parenright
+--- 445,490,0,105,-76,99 3 42 asteriskmath
+--- 489,474,0,123,-26,99 3 43 plus
+--- 223,93,136,10,41,10 3 44 comma
+--- 489,256,0,117,-24,99 3 45 minus
+--- 223,85,15,1,-20,1 3 46 period
+--- 247,575,16,208,55,99 3 47 slash
+--- 445,610,12,147,-39,99 3 48 zero
+--- 445,599,0,56,-57,56 3 49 one
+--- 445,610,0,129,28,99 3 50 two
+--- 445,610,12,116,1,99 3 51 three
+--- 445,610,0,135,-7,99 3 52 four
+--- 445,614,12,191,10,99 3 53 five
+--- 445,610,12,191,-39,99 3 54 six
+--- 445,599,14,190,-101,99 3 55 seven
+--- 445,610,12,139,-34,99 3 56 eight
+--- 445,610,16,141,2,99 3 57 nine
+--- 247,409,15,89,-31,89 3 58 colon
+--- 247,409,136,99,17,99 3 59 semicolon
+--- 489,465,0,171,-37,99 3 60 less
+--- 489,347,0,147,1,99 3 61 equal
+--- 489,465,0,107,27,99 3 62 greater
+--- 395,611,15,172,-114,99 3 63 question
+--- 489,423,0,158,40,99 3 64 congruent
+--- 643,599,0,21,46,21 3 65 Alpha
+--- 594,599,0,104,24,99 3 66 Beta
+--- 643,599,0,205,58,99 3 67 Chi
+--- 545,612,0,46,45,46 3 68 Delta
+--- 544,599,0,194,22,99 3 69 Epsilon
+--- 679,599,0,133,-56,99 3 70 Phi
+--- 537,599,0,227,19,99 3 71 Gamma
+--- 643,599,0,242,15,99 3 72 Eta
+--- 296,599,0,222,22,99 3 73 Iota
++h 562,614,16,133,-58,99 3 74 theta1
+--- 643,599,0,185,19,99 3 75 Kappa
+--- 611,612,0,49,45,49 3 76 Lambda
+--- 791,599,0,233,22,99 3 77 Mu
+--- 643,599,7,234,24,99 3 78 Nu
+--- 643,610,15,154,-62,99 3 79 Omicron
+--- 684,599,0,213,28,99 3 80 Pi
+--- 659,610,15,138,-62,99 3 81 Theta
+--- 495,599,0,200,25,99 3 82 Rho
+--- 527,599,0,186,46,99 3 83 Sigma
+--- 544,599,0,228,-108,99 3 84 Tau
+--- 614,599,0,240,-125,99 3 85 Upsilon
+ts 391,445,208,151,-28,99 3 86 sigma1
+--- 684,612,0,126,20,99 3 87 Omega
+--- 574,599,0,176,14,99 3 88 Xi
+--- 708,609,0,227,-138,99 3 89 Psi
+--- 544,599,0,231,11,99 3 90 Zeta
+--- 296,600,138,207,16,99 3 91 bracketleft
+--- 768,433,0,0,-111 3 92 therefore
+--- 296,600,138,160,64,99 3 93 bracketright
+--- 586,600,0,60,37,60 3 94 perpendicular
+--- 445,0,111,31,86,31 3 95 underscore
+--- 445,816,0,829,-622,99 3 96 radicalex
+*a 562,445,16,145,-34,99 3 97 alpha
+*b 489,659,198,139,58,99 3 98 beta
+*x 489,445,206,134,98,99 3 99 chi
+*d 440,658,17,181,-32,99 3 100 delta
+*e 391,447,17,127,1,99 3 101 epsilon
+*f 464,599,199,106,-28,99 3 102 phi
+*g 366,444,200,252,-42,99 3 103 gamma
+*y 537,457,180,68,-50,68 3 104 eta
+*i 293,448,15,53,-47,53 3 105 iota
++f 537,444,199,117,-42,99 3 106 phi1
+*k 489,446,0,182,-56,99 3 107 kappa
+*l 489,658,15,91,29,91 3 108 lambda
+*m 513,445,198,70,68,70 3 109 mu
+*n 464,451,14,134,-69,99 3 110 nu
+*o 489,444,17,86,-36,86 3 111 omicron
+*p 489,433,17,161,-8,99 3 112 pi
+*h 464,614,15,140,-53,99 3 113 theta
+*r 489,444,205,82,69,82 3 114 rho
+*s 537,445,19,175,-37,99 3 115 sigma
+*t 391,445,17,170,-45,99 3 116 tau
+*u 513,451,16,95,-55,95 3 117 upsilon
++p 635,519,16,173,-28,99 3 118 omega1
+*w 611,445,15,126,-35,99 3 119 omega
+*c 439,681,200,126,-20,99 3 120 xi
+*q 611,445,203,198,-91,99 3 121 psi
+*z 440,673,200,190,-50,99 3 122 zeta
+--- 427,599,163,163,-66,99 3 123 braceleft
+--- 178,629,261,188,73,99 3 124 bar
+--- 427,599,163,67,30,67 3 125 braceright
+--- 489,273,0,110,-28,99 3 126 similar
+--- 668,610,11,179,-35,99 3 160 Euro
+--- 552,610,0,208,-84,99 3 161 Upsilon1
+--- 220,654,0,223,-106,99 3 162 minute
+--- 489,569,0,206,24,99 3 163 lessequal
+--- 149,603,11,391,214,99 3 164 fraction
+--- 635,360,0,107,-41,99 3 165 infinity
+--- 445,611,172,219,86,99 3 166 florin
+--- 670,474,23,25,-69,25 3 167 club
+--- 670,489,32,0,-148 3 168 diamond
+--- 670,473,29,59,-155,59 3 169 heart
+--- 670,488,32,0,-82 3 170 spade
+--- 927,455,13,103,-40,99 3 171 arrowboth
+--- 878,455,13,87,-47,87 3 172 arrowleft
+--- 537,810,0,204,-173,99 3 173 arrowup
+--- 878,455,13,94,-55,94 3 174 arrowright
+--- 537,790,20,85,-54,85 3 175 arrowdown
+--- 356,610,0,160,-136,99 3 176 degree
+--- 489,574,0,154,41,99 3 177 plusminus
+--- 366,656,0,244,-100,99 3 178 second
+--- 489,569,0,143,24,99 3 179 greaterequal
+--- 489,466,0,170,22,99 3 180 multiply
+--- 635,360,0,82,-40,82 3 181 proportional
+--- 440,664,18,152,-12,99 3 182 partialdiff
+--- 409,421,0,95,-68,95 3 183 bullet
+--- 489,406,0,119,-24,99 3 184 divide
+--- 489,489,22,148,-1,99 3 185 notequal
+--- 489,394,0,163,15,99 3 186 equivalence
+--- 489,351,0,133,-7,99 3 187 approxequal
+--- 890,85,15,0,-57 3 188 ellipsis
+--- 537,899,107,92,-166,92 3 189 arrowvertex
+--- 890,246,0,171,42,99 3 190 arrowhorizex
+--- 586,560,14,174,10,99 3 191 carriagereturn
+--- 732,586,16,58,-109,58 3 192 aleph
+--- 611,659,47,123,24,99 3 193 Ifraktur
+--- 708,653,13,175,-21,99 3 194 Rfraktur
+--- 878,510,188,50,-62,50 3 195 weierstrass
+--- 684,599,15,124,-65,99 3 196 circlemultiply
+--- 684,601,13,125,-65,99 3 197 circleplus
+--- 732,640,21,202,12,99 3 198 emptyset
+--- 684,453,0,80,14,80 3 199 intersection
+--- 684,438,15,154,-60,99 3 200 union
+--- 635,418,0,90,32,90 3 201 propersuperset
+--- 635,418,111,89,67,89 3 202 reflexsuperset
+--- 635,481,62,159,-37,99 3 203 notsubset
+--- 635,418,0,159,-37,99 3 204 propersubset
+--- 635,418,111,159,34,99 3 205 reflexsubset
+--- 635,417,0,0,-43 3 206 element
+--- 635,494,52,0,-25 3 207 notelement
+--- 684,599,0,199,27,99 3 208 angle
+--- 635,639,17,220,-181,99 3 209 gradient
+--- 703,599,15,111,-71,99 3 210 registerserif
+--- 703,601,13,113,-72,99 3 211 copyrightserif
+--- 792,599,0,205,-119,99 3 212 trademarkserif
+--- 732,668,90,238,56,99 3 213 product
+--- 489,816,34,272,-84,99 3 214 radical
+--- 223,276,0,51,-82,51 3 215 dotmath
+--- 635,256,0,100,-28,99 3 216 logicalnot
+--- 537,404,0,32,30,32 3 217 logicaland
+--- 537,425,0,152,-101,99 3 218 logicalor
+--- 927,454,18,101,-42,99 3 219 arrowdblboth
+--- 878,457,13,114,-46,99 3 220 arrowdblleft
+--- 537,811,0,201,-102,99 3 221 arrowdblup
+--- 878,452,18,89,-21,89 3 222 arrowdblright
+--- 537,792,17,152,-53,99 3 223 arrowdbldown
+--- 440,663,0,129,-71,99 3 224 lozenge
+--- 293,664,176,229,-48,99 3 225 angleleft
+--- 703,596,18,110,-70,99 3 226 registersans
+--- 703,601,13,111,-70,99 3 227 copyrightsans
+--- 700,599,0,182,-129,99 3 228 trademarksans
+--- 635,669,96,171,65,99 3 229 summation
+--- 342,824,261,350,110,99 3 230 parenlefttp
+--- 342,823,76,61,52,61 3 231 parenleftex
+--- 342,824,261,61,-53,61 3 232 parenleftbt
+--- 342,824,71,275,72,99 3 233 bracketlefttp
+--- 342,823,70,33,72,33 3 234 bracketleftex
+--- 342,824,71,33,72,33 3 235 bracketleftbt
+--- 440,823,76,263,-112,99 3 236 bracelefttp
+--- 440,832,76,122,-82,99 3 237 braceleftmid
+--- 440,832,67,122,-147,99 3 238 braceleftbt
+--- 440,832,76,122,-112,99 3 239 braceex
+--- 293,664,176,102,79,99 3 241 angleright
+--- 244,815,95,305,63,99 3 242 integral
+--- 611,819,78,277,-200,99 3 243 integraltp
+--- 611,868,78,46,-200,46 3 244 integralex
+--- 611,820,77,31,47,31 3 245 integralbt
+--- 342,824,261,217,-209,99 3 246 parenrighttp
+--- 342,823,76,379,-266,99 3 247 parenrightex
+--- 342,824,261,380,80,99 3 248 parenrightbt
+--- 342,824,71,295,-189,99 3 249 bracketrighttp
+--- 342,823,70,295,-190,99 3 250 bracketrightex
+--- 342,824,71,295,53,99 3 251 bracketrightbt
+--- 440,823,76,87,-112,87 3 252 bracerighttp
+--- 440,832,76,153,-112,99 3 253 bracerightmid
+--- 440,832,67,122,28,99 3 254 bracerightbt
diff --git a/font/devps/TB b/font/devps/TB
new file mode 100644
index 0000000..a9fbff8
--- /dev/null
+++ b/font/devps/TB
@@ -0,0 +1,573 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Times Bold
+# Version 003.001
+# FamilyName Times
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 12:58:13 1999
+# Comment UniqueID 44707
+# Comment VMusage 33130 40066
+
+name TB
+internalname Times-Bold
+spacewidth 250
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A C -55
+A ,C -55
+A G -55
+A O -45
+A /O -45
+A Q -45
+A T -95
+A U -50
+A V -145
+A W -130
+A Y -100
+A p -25
+A ' -74
+A cq -74
+A u -50
+A v -100
+A w -90
+A y -74
+oA C -55
+oA ,C -55
+oA G -55
+oA O -45
+oA /O -45
+oA Q -45
+oA T -95
+oA U -50
+oA V -145
+oA W -130
+oA Y -100
+oA p -25
+oA ' -74
+oA cq -74
+oA u -50
+oA v -100
+oA w -90
+oA y -74
+B A -30
+B oA -30
+B U -10
+D A -35
+D oA -35
+D V -40
+D W -40
+D Y -40
+D . -20
+D u2026 -20
+F A -90
+F oA -90
+F a -25
+F oa -25
+F , -92
+F e -25
+F o -25
+F /o -25
+F . -110
+F u2026 -110
+J A -30
+J oA -30
+J a -15
+J oa -15
+J e -15
+J o -15
+J /o -15
+J . -20
+J u2026 -20
+J u -15
+K O -30
+K /O -30
+K e -25
+K o -25
+K /o -25
+K u -15
+K y -45
+L T -92
+L V -92
+L W -92
+L Y -92
+L rq -20
+L ' -110
+L cq -110
+L y -55
+/L T -92
+/L V -92
+/L W -92
+/L Y -92
+/L rq -20
+/L ' -110
+/L cq -110
+/L y -55
+N A -20
+N oA -20
+O A -40
+O oA -40
+O T -40
+O V -50
+O W -50
+O X -40
+O Y -50
+/O A -40
+/O oA -40
+/O T -40
+/O V -50
+/O W -50
+/O X -40
+/O Y -50
+P A -74
+P oA -74
+P a -10
+P oa -10
+P , -92
+P e -20
+P o -20
+P /o -20
+P . -110
+P u2026 -110
+Q U -10
+Q . -20
+Q u2026 -20
+R O -30
+R /O -30
+R T -40
+R U -30
+R V -55
+R W -35
+R Y -35
+T A -90
+T oA -90
+T O -18
+T /O -18
+T a -92
+T oa -92
+T : -74
+T , -74
+T e -92
+T - -92
+T hy -92
+T i -18
+T o -92
+T /o -92
+T . -90
+T u2026 -90
+T r -74
+T ; -74
+T u -92
+T w -74
+T y -34
+U A -60
+U oA -60
+U , -50
+U . -50
+U u2026 -50
+V A -135
+V oA -135
+V G -30
+V O -45
+V /O -45
+V a -92
+V oa -92
+V : -92
+V , -129
+V e -100
+V - -74
+V hy -74
+V i -37
+V o -100
+V /o -100
+V . -145
+V u2026 -145
+V ; -92
+V u -92
+W A -120
+W oA -120
+W O -10
+W /O -10
+W a -65
+W oa -65
+W : -55
+W , -92
+W e -65
+W - -37
+W hy -37
+W i -18
+W o -75
+W /o -75
+W . -92
+W u2026 -92
+W ; -55
+W u -50
+W y -60
+Y A -110
+Y oA -110
+Y O -35
+Y /O -35
+Y a -85
+Y oa -85
+Y : -92
+Y , -92
+Y e -111
+Y - -92
+Y hy -92
+Y i -37
+Y o -111
+Y /o -111
+Y . -92
+Y u2026 -92
+Y ; -92
+Y u -92
+a v -25
+oa v -25
+b b -10
+b . -40
+b u2026 -40
+b u -20
+b v -15
+, rq -45
+, ' -55
+, cq -55
+d w -15
+e v -15
+f , -15
+f .i -35
+f i -25
+f o -25
+f /o -25
+f . -15
+f u2026 -15
+f rq 50
+f ' 55
+f cq 55
+g . -15
+g u2026 -15
+h y -15
+i v -10
+k e -10
+k o -15
+k /o -15
+k y -15
+n v -40
+o v -10
+o w -10
+/o v -10
+/o w -10
+. rq -55
+u2026 rq -55
+. ' -55
+u2026 ' -55
+. cq -55
+u2026 cq -55
+lq A -10
+lq oA -10
+` A -10
+oq A -10
+` oA -10
+oq oA -10
+` ` -63
+` oq -63
+oq ` -63
+oq oq -63
+' d -20
+cq d -20
+' ' -63
+' cq -63
+cq ' -63
+cq cq -63
+' r -20
+cq r -20
+' s -37
+cq s -37
+' v -20
+cq v -20
+r c -18
+r ,c -18
+r , -92
+r e -18
+r g -10
+r - -37
+r hy -37
+r n -15
+r o -18
+r /o -18
+r p -10
+r . -100
+r u2026 -100
+r q -18
+r v -10
+v a -10
+v oa -10
+v , -55
+v e -10
+v o -10
+v /o -10
+v . -70
+v u2026 -70
+w , -55
+w o -10
+w /o -10
+w . -70
+w u2026 -70
+y , -55
+y e -10
+y o -25
+y /o -25
+y . -70
+y u2026 -70
+
+charset
+ha 581,676 2 0 asciicircum
+ti 520,333 0 1 asciitilde
+vS 556,914,19 2 2 Scaron
+vZ 667,914 2 3 Zcaron
+vs 389,704,14 2 4 scaron
+vz 444,704 2 5 zcaron
+:Y 722,877 2 6 Ydieresis
+tm 1000,676 2 7 trademark
+aq 278,691 2 8 quotesingle
+Eu 500,688,13 2 9 Euro
+space 250 0 32 space
+! 333,691,13 2 33 exclam
+" 555,691 2 34 quotedbl
+dq "
+# 500,700 2 35 numbersign
+sh "
+$ 500,750,99 2 36 dollar
+Do "
+% 1000,692,14 2 37 percent
+& 833,691,16 2 38 ampersand
+' 333,691 2 39 quoteright
+cq "
+( 333,694,168 2 40 parenleft
+) 333,694,168 2 41 parenright
+* 500,691 2 42 asterisk
++ 570,506 0 43 plus
+, 250,155,180 0 44 comma
+- 333,287 0 45 hyphen
+hy "
+. 250,156,13 0 46 period
+/ 278,691,19,24,24 2 47 slash
+sl "
+0 500,688,13 2 48 zero
+1 500,688 2 49 one
+2 500,688 2 50 two
+3 500,688,14 2 51 three
+4 500,688 2 52 four
+5 500,676,8 2 53 five
+6 500,688,13 2 54 six
+7 500,676 2 55 seven
+8 500,688,13 2 56 eight
+9 500,688,13 2 57 nine
+: 333,472,13 0 58 colon
+; 333,472,180 0 59 semicolon
+< 570,514,8 0 60 less
+= 570,399 0 61 equal
+> 570,514,8 0 62 greater
+? 500,689,13 2 63 question
+@ 930,691,19 2 64 at
+at "
+A 722,690 2 65 A
+B 667,676 2 66 B
+C 722,691,19 2 67 C
+D 722,676 2 68 D
+E 667,676 2 69 E
+F 611,676 2 70 F
+G 778,691,19 2 71 G
+H 778,676 2 72 H
+I 389,676 2 73 I
+J 500,676,96 2 74 J
+K 778,676 2 75 K
+L 667,676 2 76 L
+M 944,676 2 77 M
+N 722,676,18 2 78 N
+O 778,691,19 2 79 O
+P 611,676 2 80 P
+Q 778,691,176 2 81 Q
+R 722,676 2 82 R
+S 556,692,19 2 83 S
+T 667,676 2 84 T
+U 722,676,19 2 85 U
+V 722,676,18 2 86 V
+W 1000,676,15 2 87 W
+X 722,676 2 88 X
+Y 722,676 2 89 Y
+Z 667,676 2 90 Z
+[ 333,678,149 2 91 bracketleft
+lB "
+\ 278,691,19,25,25 2 92 backslash
+rs "
+] 333,678,149 2 93 bracketright
+rB "
+^ 333,704,0,2,2 2 94 circumflex
+a^ "
+_ 500,0,125 0 95 underscore
+` 333,691 2 96 quoteleft
+oq "
+a 500,473,14 0 97 a
+b 556,676,14 2 98 b
+c 444,473,14 0 99 c
+d 556,676,14 2 100 d
+e 444,473,14 0 101 e
+f 333,691,0,56 2 102 f
+g 500,473,206 1 103 g
+h 556,676 2 104 h
+i 278,691 2 105 i
+j 333,691,203,0,57 3 106 j
+k 556,676 2 107 k
+l 278,676 2 108 l
+m 833,473 0 109 m
+n 556,473 0 110 n
+o 500,473,14 0 111 o
+p 556,473,205 1 112 p
+q 556,473,205 1 113 q
+r 444,473 0 114 r
+s 389,473,14 0 115 s
+t 333,630,12 2 116 t
+u 556,461,14 0 117 u
+v 500,461,14 0 118 v
+w 722,461,14 0 119 w
+x 500,461 0 120 x
+y 500,461,205 1 121 y
+z 444,461 0 122 z
+{ 394,698,175 2 123 braceleft
+lC "
+| 220,782,218 3 124 bar
+ba "
+} 394,698,175 2 125 braceright
+rC "
+~ 333,674,0,16,16 2 126 tilde
+a~ "
+bq 333,155,180 0 128 quotesinglbase
+Fo 500,415 0 129 guillemotleft
+Fc 500,415 0 130 guillemotright
+bu 350,478 0 131 bullet
+Fn 500,706,155 2 132 florin
+f/ 167,688,12,162,168 2 133 fraction
+%0 1000,706,29 2 134 perthousand
+dg 500,691,134 2 135 dagger
+dd 500,691,132 2 136 daggerdbl
+en 500,271 0 137 endash
+em 1000,271 0 138 emdash
+fi 556,691 2 140 fi
+fl 556,691 2 141 fl
+.i 278,461 0 144 dotlessi
+ga 333,713 2 146 grave
+a" 333,713,0,92,13 2 147 hungarumlaut
+a. 333,691 2 148 dotaccent
+ab 333,691 2 149 breve
+ah 333,704,0,2,2 2 150 caron
+ao 333,740 2 151 ring
+ho 333,24,193 0 152 ogonek
+lq 500,691 2 153 quotedblleft
+rq 500,691 2 154 quotedblright
+oe 722,473,14 0 155 oe
+/l 278,676,0,25,22 2 156 lslash
+Bq 500,155,180 0 157 quotedblbase
+OE 1000,684,5 2 158 OE
+/L 667,676 2 159 Lslash
+r! 333,501,203 1 161 exclamdown
+ct 500,588,140 0 162 cent
+Po 500,684,14 2 163 sterling
+Cs 500,613,0,26,26 0 164 currency
+Ye 500,676,0,47,64 2 165 yen
+bb 220,707,143 2 166 brokenbar
+sc 500,691,132 2 167 section
+ad 333,667,0,2,2 2 168 dieresis
+co 747,691,19 2 169 copyright
+Of 300,688,0,1,1 2 170 ordfeminine
+fo 333,415 0 171 guilsinglleft
+tno 570,399 0 172 logicalnot
+\- 570,297 0 173 minus
+rg 747,691,19 2 174 registered
+a- 333,637 2 175 macron
+de 400,688 2 176 degree
+t+- 570,506 0 177 plusminus
+S2 300,688 2 178 twosuperior
+S3 300,688 2 179 threesuperior
+aa 333,713 2 180 acute
+*m 601,461,212 1 181 mu
+mc "
+ps 540,676,186 2 182 paragraph
+pc 250,417 0 183 periodcentered
+ac 333,0,218 1 184 cedilla
+S1 300,688 2 185 onesuperior
+Om 330,688 2 186 ordmasculine
+fc 333,415 0 187 guilsinglright
+14 750,688,12 2 188 onequarter
+12 750,688,12,25,7 2 189 onehalf
+34 750,688,12 2 190 threequarters
+r? 500,501,201 0 191 questiondown
+`A 722,923 2 192 Agrave
+'A 722,923 2 193 Aacute
+^A 722,914 2 194 Acircumflex
+~A 722,884 2 195 Atilde
+:A 722,877 2 196 Adieresis
+oA 722,935 2 197 Aring
+AE 1000,676 2 198 AE
+,C 722,691,218 3 199 Ccedilla
+`E 667,923 2 200 Egrave
+'E 667,923 2 201 Eacute
+^E 667,914 2 202 Ecircumflex
+:E 667,877 2 203 Edieresis
+`I 389,923 2 204 Igrave
+'I 389,923 2 205 Iacute
+^I 389,914 2 206 Icircumflex
+:I 389,877 2 207 Idieresis
+-D 722,676 2 208 Eth
+~N 722,884,18 2 209 Ntilde
+`O 778,923,19 2 210 Ograve
+'O 778,923,19 2 211 Oacute
+^O 778,914,19 2 212 Ocircumflex
+~O 778,884,19 2 213 Otilde
+:O 778,877,19 2 214 Odieresis
+tmu 570,490 0 215 multiply
+/O 778,737,74 2 216 Oslash
+`U 722,923,19 2 217 Ugrave
+'U 722,923,19 2 218 Uacute
+^U 722,914,19 2 219 Ucircumflex
+:U 722,877,19 2 220 Udieresis
+'Y 722,923 2 221 Yacute
+TP 611,676 2 222 Thorn
+ss 556,691,12 2 223 germandbls
+`a 500,713,14 2 224 agrave
+'a 500,713,14 2 225 aacute
+^a 500,704,14 2 226 acircumflex
+~a 500,674,14 2 227 atilde
+:a 500,667,14 2 228 adieresis
+oa 500,740,14 2 229 aring
+ae 722,473,14 0 230 ae
+,c 444,473,218 1 231 ccedilla
+`e 444,713,14 2 232 egrave
+'e 444,713,14 2 233 eacute
+^e 444,704,14 2 234 ecircumflex
+:e 444,667,14 2 235 edieresis
+`i 278,713,0,0,27 2 236 igrave
+'i 278,713,0,11 2 237 iacute
+^i 278,704,0,22,37 2 238 icircumflex
+:i 278,667,0,22,37 2 239 idieresis
+Sd 500,691,14 2 240 eth
+~n 556,674 2 241 ntilde
+`o 500,713,14 2 242 ograve
+'o 500,713,14 2 243 oacute
+^o 500,704,14 2 244 ocircumflex
+~o 500,674,14 2 245 otilde
+:o 500,667,14 2 246 odieresis
+tdi 570,537,31 0 247 divide
+/o 500,549,92 0 248 oslash
+`u 556,713,14 2 249 ugrave
+'u 556,713,14 2 250 uacute
+^u 556,704,14 2 251 ucircumflex
+:u 556,667,14 2 252 udieresis
+'y 500,713,205 3 253 yacute
+Tp 556,676,205 3 254 thorn
+:y 500,667,205 3 255 ydieresis
+u2026 1000,156,13 0 256 ellipsis
diff --git a/font/devps/TBI b/font/devps/TBI
new file mode 100644
index 0000000..e2c41d7
--- /dev/null
+++ b/font/devps/TBI
@@ -0,0 +1,548 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Times Bold Italic
+# Version 003.001
+# FamilyName Times
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:00:52 1999
+# Comment UniqueID 44708
+# Comment VMusage 36699 43635
+
+name TBI
+internalname Times-BoldItalic
+slant 15
+spacewidth 250
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A C -65
+A ,C -65
+A G -60
+A O -50
+A /O -50
+A Q -55
+A T -55
+A U -50
+A V -95
+A W -100
+A Y -70
+A ' -74
+A cq -74
+A u -30
+A v -74
+A w -74
+A y -74
+oA C -65
+oA ,C -65
+oA G -60
+oA O -50
+oA /O -50
+oA Q -55
+oA T -55
+oA U -50
+oA V -95
+oA W -100
+oA Y -70
+oA ' -74
+oA cq -74
+oA u -30
+oA v -74
+oA w -74
+oA y -74
+B A -25
+B oA -25
+B U -10
+D A -25
+D oA -25
+D V -50
+D W -40
+D Y -50
+F A -100
+F oA -100
+F a -95
+F oa -95
+F , -129
+F e -100
+F i -40
+F o -70
+F /o -70
+F . -129
+F u2026 -129
+F r -50
+J A -25
+J oA -25
+J a -40
+J oa -40
+J , -10
+J e -40
+J o -40
+J /o -40
+J . -10
+J u2026 -10
+J u -40
+K O -30
+K /O -30
+K e -25
+K o -25
+K /o -25
+K u -20
+K y -20
+L T -18
+L V -37
+L W -37
+L Y -37
+L ' -55
+L cq -55
+L y -37
+/L T -18
+/L V -37
+/L W -37
+/L Y -37
+/L ' -55
+/L cq -55
+/L y -37
+N A -30
+N oA -30
+O A -40
+O oA -40
+O T -40
+O V -50
+O W -50
+O X -40
+O Y -50
+/O A -40
+/O oA -40
+/O T -40
+/O V -50
+/O W -50
+/O X -40
+/O Y -50
+P A -85
+P oA -85
+P a -40
+P oa -40
+P , -129
+P e -50
+P o -55
+P /o -55
+P . -129
+P u2026 -129
+Q U -10
+R O -40
+R /O -40
+R T -30
+R U -40
+R V -18
+R W -18
+R Y -18
+T A -55
+T oA -55
+T O -18
+T /O -18
+T a -92
+T oa -92
+T : -74
+T , -92
+T e -92
+T - -92
+T hy -92
+T i -37
+T o -95
+T /o -95
+T . -92
+T u2026 -92
+T r -37
+T ; -74
+T u -37
+T w -37
+T y -37
+U A -45
+U oA -45
+V A -85
+V oA -85
+V G -10
+V O -30
+V /O -30
+V a -111
+V oa -111
+V : -74
+V , -129
+V e -111
+V - -70
+V hy -70
+V i -55
+V o -111
+V /o -111
+V . -129
+V u2026 -129
+V ; -74
+V u -55
+W A -74
+W oA -74
+W O -15
+W /O -15
+W a -85
+W oa -85
+W : -55
+W , -74
+W e -90
+W - -50
+W hy -50
+W i -37
+W o -80
+W /o -80
+W . -74
+W u2026 -74
+W ; -55
+W u -55
+W y -55
+Y A -74
+Y oA -74
+Y O -25
+Y /O -25
+Y a -92
+Y oa -92
+Y : -92
+Y , -92
+Y e -111
+Y - -92
+Y hy -92
+Y i -55
+Y o -111
+Y /o -111
+Y . -74
+Y u2026 -74
+Y ; -92
+Y u -92
+b b -10
+b . -40
+b u2026 -40
+b u -20
+c h -10
+c k -10
+,c h -10
+,c k -10
+, rq -95
+, ' -95
+, cq -95
+e b -10
+f , -10
+f .i -30
+f e -10
+f f -18
+f o -10
+f /o -10
+f . -10
+f u2026 -10
+f ' 55
+f cq 55
+k e -30
+k o -10
+k /o -10
+n v -40
+o v -15
+o w -25
+o x -10
+o y -10
+/o v -15
+/o w -25
+/o x -10
+/o y -10
+. rq -95
+u2026 rq -95
+. ' -95
+u2026 ' -95
+. cq -95
+u2026 cq -95
+` ` -74
+` oq -74
+oq ` -74
+oq oq -74
+' d -15
+cq d -15
+' ' -74
+' cq -74
+cq ' -74
+cq cq -74
+' r -15
+cq r -15
+' s -74
+cq s -74
+' t -37
+cq t -37
+' v -15
+cq v -15
+r , -65
+r . -65
+r u2026 -65
+v , -37
+v e -15
+v o -15
+v /o -15
+v . -37
+v u2026 -37
+w a -10
+w oa -10
+w , -37
+w e -10
+w o -15
+w /o -15
+w . -37
+w u2026 -37
+x e -10
+y , -37
+y . -37
+y u2026 -37
+
+charset
+ha 570,669,0,0,-17 2 0 asciicircum
+ti 570,333,0,0,-4 0 1 asciitilde
+vS 556,897,18,47,48,47 2 2 Scaron
+vZ 611,897,0,29,61,29 2 3 Zcaron
+vs 389,690,13,85,69,85 2 4 scaron
+vz 389,690,78,85,93,85 2 5 zcaron
+:Y 611,862,0,98,-23,98 2 6 Ydieresis
+tm 1000,669,0,18,18,18 2 7 trademark
+aq 278,685,0,40,-78,40 2 8 quotesingle
+Eu 500,686,20,92,41,92 2 9 Euro
+space 250 0 32 space
+! 389,684,13,31,-17,31 2 33 exclam
+" 555,685,0,31,-86,31 2 34 quotedbl
+dq "
+# 500,700,0,83,83,83 2 35 numbersign
+sh "
+$ 500,733,100,47,70,47 2 36 dollar
+Do "
+% 833,692,10,10,11,10 2 37 percent
+& 778,682,19,0,45 2 38 ampersand
+' 333,685,0,19,-48,19 2 39 quoteright
+cq "
+( 333,685,179,61,22,61 2 40 parenleft
+) 333,685,179,0,94 2 41 parenright
+* 500,685,0,6,-15,6 2 42 asterisk
++ 570,506,0,17,17,17 0 43 plus
+, 250,134,182,0,110 0 44 comma
+- 333,282,0,0,48 0 45 hyphen
+hy "
+. 250,135,13,0,59 0 46 period
+/ 278,685,18,114,114,99 2 47 slash
+sl "
+0 500,683,14,27,33,27 2 48 zero
+1 500,683,0,0,45 2 49 one
+2 500,683,0,0,77 2 50 two
+3 500,683,13,0,65 2 51 three
+4 500,683,0,53,65,53 2 52 four
+5 500,669,13,37,61,37 2 53 five
+6 500,679,15,59,27,59 2 54 six
+7 500,669,0,75,-2,75 2 55 seven
+8 500,683,13,26,47,26 2 56 eight
+9 500,683,10,25,62,25 2 57 nine
+: 333,459,13,0,27 0 58 colon
+; 333,459,183,0,75 0 59 semicolon
+< 570,514,8,19,19,19 0 60 less
+= 570,399,0,17,17,17 0 61 equal
+> 570,514,8,19,19,19 0 62 greater
+? 500,684,13,20,-29,20 2 63 question
+@ 832,685,18,0,-13 2 64 at
+at "
+A 667,683,0,0,117 2 65 A
+B 667,669,0,7,74,7 2 66 B
+C 667,685,18,60,18,60 2 67 C
+D 722,669,0,13,96,13 2 68 D
+E 667,669,0,36,77,36 2 69 E
+F 667,669,0,43,63,43 2 70 F
+G 722,685,18,34,29,34 2 71 G
+H 778,669,0,71,74,71 2 72 H
+I 389,669,0,67,82,67 2 73 I
+J 500,669,99,74,96,74 2 74 J
+K 667,669,0,85,71,85 2 75 K
+L 611,669,0,29,72,29 2 76 L
+M 889,669,12,78,79,78 2 77 M
+N 722,669,15,76,77,76 2 78 N
+O 722,685,18,19,23,19 2 79 O
+P 611,669,0,52,77,52 2 80 P
+Q 722,685,208,19,23,19 3 81 Q
+R 667,669,0,6,79,6 2 82 R
+S 556,685,18,20,48,20 2 83 S
+T 611,669,0,89,0,89 2 84 T
+U 722,669,18,72,-17,72 2 85 U
+V 667,669,18,98,-15,98 2 86 V
+W 889,669,18,101,-15,99 2 87 W
+X 667,669,0,77,74,77 2 88 X
+Y 611,669,0,98,-23,98 2 89 Y
+Z 611,669,0,29,61,29 2 90 Z
+[ 333,674,159,79,87,79 2 91 bracketleft
+lB "
+\ 278,685,18,51,51,51 2 92 backslash
+rs "
+] 333,674,157,60,106,60 2 93 bracketright
+rB "
+^ 333,690,0,84,10,84 2 94 circumflex
+a^ "
+_ 500,0,125,50,50,50 0 95 underscore
+` 333,685,0,49,-78,49 2 96 quoteleft
+oq "
+a 500,462,14,5,71,5 0 97 a
+b 500,699,13,0,64 2 98 b
+c 444,462,13,0,55 0 99 c
+d 500,699,13,67,71,67 2 100 d
+e 444,462,13,4,45,4 0 101 e
+f 333,698,205,163,219,99 3 102 f
+g 500,462,203,28,102,28 1 103 g
+h 556,699,9,0,63 2 104 h
+i 278,684,9,35,48,35 2 105 i
+j 278,684,207,51,239,51 3 106 j
+k 500,699,8,33,73,33 2 107 k
+l 278,699,9,62,48,62 2 108 l
+m 778,462,9,0,64 0 109 m
+n 556,462,9,0,56 0 110 n
+o 500,462,13,0,53 0 111 o
+p 500,462,205,0,170 1 112 p
+q 500,462,205,21,49,21 1 113 q
+r 389,462,0,50,71,50 0 114 r
+s 389,462,13,0,69 0 115 s
+t 278,594,9,53,61,53 2 116 t
+u 556,462,9,0,35 0 117 u
+v 444,462,13,7,34,7 0 118 v
+w 667,462,13,0,34 0 119 w
+x 500,462,13,19,96,19 0 120 x
+y 444,462,205,0,144 1 121 y
+z 389,449,78,29,93,29 0 122 z
+{ 348,686,187,138,45,99 2 123 braceleft
+lC "
+| 220,782,218,0,-16 3 124 bar
+ba "
+} 348,686,187,4,179,4 2 125 braceright
+rC "
+~ 333,655,0,124,2,99 2 126 tilde
+a~ "
+bq 333,134,182,0,55 0 128 quotesinglbase
+Fo 500,415,0,18,38,18 0 129 guillemotleft
+Fc 500,415,0,18,38,18 0 130 guillemotright
+bu 350,525,0,50,50,50 0 131 bullet
+Fn 500,707,156,87,137,87 2 132 florin
+f/ 167,683,14,207,219,99 2 133 fraction
+%0 1000,706,29,46,43,46 2 134 perthousand
+dg 500,685,145,44,-41,44 2 135 dagger
+dd 500,685,139,43,40,43 2 136 daggerdbl
+en 500,269,0,27,90,27 0 137 endash
+em 1000,269,0,27,90,27 0 138 emdash
+fi 556,703,205,8,238,8 3 140 fi
+fl 556,704,205,47,236,47 3 141 fl
+.i 278,462,9,10,48,10 0 144 dotlessi
+ga 333,697,0,14,-35,14 2 146 grave
+a" 333,697,0,215,-19,99 2 147 hungarumlaut
+a. 333,684,0,15,-113,15 2 148 dotaccent
+ab 333,678,0,104,-21,99 2 149 breve
+ah 333,690,0,128,-29,99 2 150 caron
+ao 333,729,0,57,-77,57 2 151 ring
+ho 333,34,183,0,35 0 152 ogonek
+lq 500,685,0,63,-3,63 2 153 quotedblleft
+rq 500,685,0,63,-3,63 2 154 quotedblright
+oe 722,462,13,2,44,2 0 155 oe
+/l 278,699,9,79,57,79 2 156 lslash
+Bq 500,134,182,0,107 0 157 quotedblbase
+OE 944,677,8,52,27,52 2 158 OE
+/L 611,669,0,29,72,29 2 159 Lslash
+r! 389,492,205,0,31 1 161 exclamdown
+ct 500,576,143,0,8 0 162 cent
+Po 500,683,12,60,82,60 2 163 sterling
+Cs 500,586,0,76,76,76 0 164 currency
+Ye 500,669,0,178,17,99 2 165 yen
+bb 220,707,143,0,-16 2 166 brokenbar
+sc 500,685,143,9,14,9 2 167 section
+ad 333,684,0,119,-5,99 2 168 dieresis
+co 747,685,18,21,20,21 2 169 copyright
+Of 266,685,0,114,34,99 2 170 ordfeminine
+fo 333,415,0,20,18,20 0 171 guilsinglleft
+tno 606,399,0,0,-1 0 172 logicalnot
+\- 606,297,0,0,-1 0 173 minus
+rg 747,685,18,21,20,21 2 174 registered
+a- 333,623,0,110,-1,99 2 175 macron
+de 400,683,0,19,-33,19 2 176 degree
+t+- 570,506,0,17,17,17 0 177 plusminus
+S2 300,683,0,63,48,63 2 178 twosuperior
+S3 300,683,0,71,33,71 2 179 threesuperior
+aa 333,697,0,96,-89,96 2 180 acute
+*m 532,449,206,0,155 1 181 mu
+mc "
+ps 500,669,193,112,107,99 2 182 paragraph
+pc 250,405,0,0,-1 0 183 periodcentered
+ac 333,5,218,0,130 1 184 cedilla
+S1 300,683,0,51,20,51 2 185 onesuperior
+Om 300,685,0,97,-6,97 2 186 ordmasculine
+fc 333,415,0,0,40 0 187 guilsinglright
+14 750,683,14,21,43,21 2 188 onequarter
+12 750,683,14,23,59,23 2 189 onehalf
+34 750,683,14,26,43,26 2 190 threequarters
+r? 500,492,205,0,20 1 191 questiondown
+`A 667,904,0,0,117 2 192 Agrave
+'A 667,904,0,0,117 2 193 Aacute
+^A 667,897,0,0,117 2 194 Acircumflex
+~A 667,862,0,0,117 2 195 Atilde
+:A 667,862,0,0,117 2 196 Adieresis
+oA 667,921,0,0,117 2 197 Aring
+AE 944,669,0,24,114,24 2 198 AE
+,C 667,685,218,60,18,60 3 199 Ccedilla
+`E 667,904,0,36,77,36 2 200 Egrave
+'E 667,904,0,36,77,36 2 201 Eacute
+^E 667,897,0,36,77,36 2 202 Ecircumflex
+:E 667,862,0,36,77,36 2 203 Edieresis
+`I 389,904,0,67,82,67 2 204 Igrave
+'I 389,904,0,93,82,93 2 205 Iacute
+^I 389,897,0,111,82,99 2 206 Icircumflex
+:I 389,862,0,111,82,99 2 207 Idieresis
+-D 722,669,0,28,81,28 2 208 Eth
+~N 722,862,15,76,77,76 2 209 Ntilde
+`O 722,904,18,19,23,19 2 210 Ograve
+'O 722,904,18,19,23,19 2 211 Oacute
+^O 722,897,18,19,23,19 2 212 Ocircumflex
+~O 722,862,18,19,23,19 2 213 Otilde
+:O 722,862,18,19,23,19 2 214 Odieresis
+tmu 570,490,0,2,2,2 0 215 multiply
+/O 722,764,125,19,23,19 2 216 Oslash
+`U 722,904,18,72,-17,72 2 217 Ugrave
+'U 722,904,18,72,-17,72 2 218 Uacute
+^U 722,897,18,72,-17,72 2 219 Ucircumflex
+:U 722,862,18,72,-17,72 2 220 Udieresis
+'Y 611,904,0,98,-23,98 2 221 Yacute
+TP 611,669,0,12,77,12 2 222 Thorn
+ss 500,705,200,23,250,23 2 223 germandbls
+`a 500,697,14,5,71,5 2 224 agrave
+'a 500,697,14,13,71,13 2 225 aacute
+^a 500,690,14,5,71,5 2 226 acircumflex
+~a 500,655,14,41,71,41 2 227 atilde
+:a 500,655,14,26,71,26 2 228 adieresis
+oa 500,729,14,5,71,5 2 229 aring
+ae 722,462,13,1,55,1 0 230 ae
+,c 444,462,218,0,55 1 231 ccedilla
+`e 444,697,13,4,45,4 2 232 egrave
+'e 444,697,13,41,45,41 2 233 eacute
+^e 444,690,13,29,45,29 2 234 ecircumflex
+:e 444,655,13,54,45,54 2 235 edieresis
+`i 278,697,9,31,48,31 2 236 igrave
+'i 278,697,9,124,48,99 2 237 iacute
+^i 278,690,9,96,53,96 2 238 icircumflex
+:i 278,655,9,136,48,99 2 239 idieresis
+Sd 500,699,13,4,53,4 2 240 eth
+~n 556,655,9,0,56 2 241 ntilde
+`o 500,697,13,0,53 2 242 ograve
+'o 500,697,13,13,53,13 2 243 oacute
+^o 500,690,13,1,53,1 2 244 ocircumflex
+~o 500,655,13,41,53,41 2 245 otilde
+:o 500,655,13,21,53,21 2 246 odieresis
+tdi 570,535,29,17,17,17 0 247 divide
+/o 500,560,119,0,53 0 248 oslash
+`u 556,697,9,0,35 2 249 ugrave
+'u 556,697,9,0,35 2 250 uacute
+^u 556,690,9,0,35 2 251 ucircumflex
+:u 556,655,9,0,35 2 252 udieresis
+'y 444,697,205,41,144,41 3 253 yacute
+Tp 500,699,205,0,170 3 254 thorn
+:y 444,655,205,49,144,49 3 255 ydieresis
+u2026 1000,135,13,0,10 0 256 ellipsis
diff --git a/font/devps/TI b/font/devps/TI
new file mode 100644
index 0000000..2785d03
--- /dev/null
+++ b/font/devps/TI
@@ -0,0 +1,561 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Times Italic
+# Version 003.001
+# FamilyName Times
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:03:40 1999
+# Comment UniqueID 44709
+# Comment VMusage 38051 44987
+
+name TI
+internalname Times-Italic
+slant 7
+spacewidth 250
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A C -30
+A ,C -30
+A G -35
+A O -40
+A /O -40
+A Q -40
+A T -37
+A U -50
+A V -105
+A W -95
+A Y -55
+A ' -37
+A cq -37
+A u -20
+A v -55
+A w -55
+A y -55
+oA C -30
+oA ,C -30
+oA G -35
+oA O -40
+oA /O -40
+oA Q -40
+oA T -37
+oA U -50
+oA V -105
+oA W -95
+oA Y -55
+oA ' -37
+oA cq -37
+oA u -20
+oA v -55
+oA w -55
+oA y -55
+B A -25
+B oA -25
+B U -10
+D A -35
+D oA -35
+D V -40
+D W -40
+D Y -40
+F A -115
+F oA -115
+F a -75
+F oa -75
+F , -135
+F e -75
+F i -45
+F o -105
+F /o -105
+F . -135
+F u2026 -135
+F r -55
+J A -40
+J oA -40
+J a -35
+J oa -35
+J , -25
+J e -25
+J o -25
+J /o -25
+J . -25
+J u2026 -25
+J u -35
+K O -50
+K /O -50
+K e -35
+K o -40
+K /o -40
+K u -40
+K y -40
+L T -20
+L V -55
+L W -55
+L Y -20
+L ' -37
+L cq -37
+L y -30
+/L T -20
+/L V -55
+/L W -55
+/L Y -20
+/L ' -37
+/L cq -37
+/L y -30
+N A -27
+N oA -27
+O A -55
+O oA -55
+O T -40
+O V -50
+O W -50
+O X -40
+O Y -50
+/O A -55
+/O oA -55
+/O T -40
+/O V -50
+/O W -50
+/O X -40
+/O Y -50
+P A -90
+P oA -90
+P a -80
+P oa -80
+P , -135
+P e -80
+P o -80
+P /o -80
+P . -135
+P u2026 -135
+Q U -10
+R O -40
+R /O -40
+R U -40
+R V -18
+R W -18
+R Y -18
+T A -50
+T oA -50
+T O -18
+T /O -18
+T a -92
+T oa -92
+T : -55
+T , -74
+T e -92
+T - -74
+T hy -74
+T i -55
+T o -92
+T /o -92
+T . -74
+T u2026 -74
+T r -55
+T ; -65
+T u -55
+T w -74
+T y -74
+U A -40
+U oA -40
+U , -25
+U . -25
+U u2026 -25
+V A -60
+V oA -60
+V O -30
+V /O -30
+V a -111
+V oa -111
+V : -65
+V , -129
+V e -111
+V - -55
+V hy -55
+V i -74
+V o -111
+V /o -111
+V . -129
+V u2026 -129
+V ; -74
+V u -74
+W A -60
+W oA -60
+W O -25
+W /O -25
+W a -92
+W oa -92
+W : -65
+W , -92
+W e -92
+W - -37
+W hy -37
+W i -55
+W o -92
+W /o -92
+W . -92
+W u2026 -92
+W ; -65
+W u -55
+W y -70
+Y A -50
+Y oA -50
+Y O -15
+Y /O -15
+Y a -92
+Y oa -92
+Y : -65
+Y , -92
+Y e -92
+Y - -74
+Y hy -74
+Y i -74
+Y o -92
+Y /o -92
+Y . -92
+Y u2026 -92
+Y ; -65
+Y u -92
+a g -10
+oa g -10
+b . -40
+b u2026 -40
+b u -20
+c h -15
+c k -20
+,c h -15
+,c k -20
+, rq -140
+, ' -140
+, cq -140
+e , -10
+e g -40
+e . -15
+e u2026 -15
+e v -15
+e w -15
+e x -20
+e y -30
+f , -10
+f .i -60
+f f -18
+f i -20
+f . -15
+f u2026 -15
+f ' 92
+f cq 92
+g , -10
+g e -10
+g g -10
+g . -15
+g u2026 -15
+k e -10
+k o -10
+k /o -10
+k y -10
+n v -40
+o g -10
+o v -10
+/o g -10
+/o v -10
+. rq -140
+u2026 rq -140
+. ' -140
+u2026 ' -140
+. cq -140
+u2026 cq -140
+` ` -111
+` oq -111
+oq ` -111
+oq oq -111
+' d -25
+cq d -25
+' ' -111
+' cq -111
+cq ' -111
+cq cq -111
+' r -25
+cq r -25
+' s -40
+cq s -40
+' t -30
+cq t -30
+' v -10
+cq v -10
+r a -15
+r oa -15
+r c -37
+r ,c -37
+r , -111
+r d -37
+r e -37
+r g -37
+r - -20
+r hy -20
+r o -45
+r /o -45
+r . -111
+r u2026 -111
+r q -37
+r s -10
+v , -74
+v . -74
+v u2026 -74
+w , -74
+w . -74
+w u2026 -74
+y , -55
+y . -55
+y u2026 -55
+
+charset
+ha 422,666,0,50,50,43 2 0 asciicircum
+ti 541,323,0,11,10,11 0 1 asciitilde
+vS 500,873,18,70,33,43 2 2 Scaron
+vZ 556,873,0,100,56,43 2 3 Zcaron
+vs 389,661,13,115,34,43 2 4 scaron
+vz 389,661,81,95,52,43 2 5 zcaron
+:Y 556,818,0,127,-28,43 2 6 Ydieresis
+tm 980,653,0,27,20,27 2 7 trademark
+aq 214,666,0,77,-82,43 2 8 quotesingle
+Eu 500,676,7,128,27,43 2 9 Euro
+space 250 0 32 space
+! 333,667,11,19,11,19 2 33 exclam
+" 420,666,0,62,-94,43 2 34 quotedbl
+dq "
+# 500,676,0,90,48,43 2 35 numbersign
+sh "
+$ 500,731,89,47,19,43 2 36 dollar
+Do "
+% 833,676,13,7,-29,7 2 37 percent
+& 778,666,18,0,-26 2 38 ampersand
+' 333,666,0,7,-101,7 2 39 quoteright
+cq "
+( 333,669,181,32,8,32 2 40 parenleft
+) 333,669,180,6,34,6 2 41 parenright
+* 500,666,0,42,-78,42 2 42 asterisk
++ 675,506,0,0,-36 0 43 plus
+, 250,101,129,0,54 0 44 comma
+- 333,255,0,0,1 0 45 hyphen
+hy "
+. 250,100,11,0,23 0 46 period
+/ 278,666,18,158,115,43 2 47 slash
+sl "
+0 500,676,7,47,18,43 2 48 zero
+1 500,676,0,0,1 2 49 one
+2 500,676,0,2,38,2 2 50 two
+3 500,676,7,15,35,15 2 51 three
+4 500,676,0,29,49,29 2 52 four
+5 500,666,7,41,35,41 2 53 five
+6 500,686,7,71,20,43 2 54 six
+7 500,666,8,87,-25,43 2 55 seven
+8 500,676,7,43,20,43 2 56 eight
+9 500,676,17,42,27,42 2 57 nine
+: 333,441,11 0 58 colon
+; 333,441,129,0,23 0 59 semicolon
+< 675,514,8,0,-34 0 60 less
+= 675,386,0,0,-36 0 61 equal
+> 675,514,8,0,-34 0 62 greater
+? 500,664,12,22,-82,22 2 63 question
+@ 920,666,18,0,-68 2 64 at
+at "
+A 611,668,0,3,101,3 2 65 A
+B 611,653,0,27,58,27 2 66 B
+C 667,666,18,72,-16,43 2 67 C
+D 722,653,0,28,58,28 2 68 D
+E 611,653,0,73,51,43 2 69 E
+F 611,653,0,84,42,43 2 70 F
+G 722,666,18,50,-2,43 2 71 G
+H 722,653,0,95,58,43 2 72 H
+I 333,653,0,101,58,43 2 73 I
+J 444,653,18,97,56,43 2 74 J
+K 667,653,0,105,43,43 2 75 K
+L 556,653,0,53,58,43 2 76 L
+M 833,653,0,90,68,43 2 77 M
+N 667,653,15,110,70,43 2 78 N
+O 722,666,18,27,-10,27 2 79 O
+P 611,653,0,44,50,43 2 80 P
+Q 722,666,182,27,-9,27 2 81 Q
+R 611,653,0,27,63,27 2 82 R
+S 500,667,18,58,33,43 2 83 S
+T 556,653,0,127,-9,43 2 84 T
+U 722,653,18,93,-52,43 2 85 U
+V 611,653,18,127,-26,43 2 86 V
+W 833,653,18,123,-21,43 2 87 W
+X 611,653,0,94,79,43 2 88 X
+Y 556,653,0,127,-28,43 2 89 Y
+Z 556,653,0,100,56,43 2 90 Z
+[ 389,663,153,52,29,43 2 91 bracketleft
+lB "
+\ 278,666,18,91,91,43 2 92 backslash
+rs "
+] 389,663,153,43,38,43 2 93 bracketright
+rB "
+^ 333,661,0,102,-41,43 2 94 circumflex
+a^ "
+_ 500,0,125,50,50,43 0 95 underscore
+` 333,666,0,27,-121,27 2 96 quoteleft
+oq "
+a 500,441,11,26,33,26 0 97 a
+b 500,683,11,23,27,23 2 98 b
+c 444,441,11,31,20,31 0 99 c
+d 500,683,13,77,35,43 2 100 d
+e 444,441,11,18,19,18 0 101 e
+f 278,678,207,196,197,43 3 102 f
+g 500,441,206,22,42,22 1 103 g
+h 500,683,9,28,31,28 2 104 h
+i 278,654,11,36,1,36 2 105 i
+j 278,654,207,48,174,43 3 106 j
+k 444,683,11,67,36,43 2 107 k
+l 278,683,11,51,9,43 2 108 l
+m 722,441,9,32,38,32 0 109 m
+n 500,441,9,24,36,24 0 110 n
+o 500,441,11,18,23,18 0 111 o
+p 500,441,205,19,125,19 1 112 p
+q 500,441,209,33,25,33 1 113 q
+r 389,441,0,73,5,43 0 114 r
+s 389,442,13,27,34,27 0 115 s
+t 278,546,11,68,13,43 2 116 t
+u 500,441,11,25,8,25 0 117 u
+v 444,441,18,32,29,32 0 118 v
+w 667,441,18,31,34,31 0 119 w
+x 444,441,11,53,77,43 0 120 x
+y 444,441,206,32,74,32 1 121 y
+z 389,428,81,41,52,41 0 122 z
+{ 400,687,177,57,-1,43 2 123 braceleft
+lC "
+| 275,783,217,0,-55 3 124 bar
+ba "
+} 400,687,177,0,57 2 125 braceright
+rC "
+~ 333,624,0,144,-50,43 2 126 tilde
+a~ "
+bq 333,101,129,0,6 0 128 quotesinglbase
+Fo 500,403,0,0,-3 0 129 guillemotleft
+Fc 500,403,0,0,-5 0 130 guillemotright
+bu 350,461,0,10,10,10 0 131 bullet
+Fn 500,682,182,57,25,43 2 132 florin
+f/ 167,676,10,220,219,43 2 133 fraction
+%0 1000,706,19,60,25,43 2 134 perthousand
+dg 500,666,159,38,-51,38 2 135 dagger
+dd 500,666,143,41,28,41 2 136 daggerdbl
+en 500,243,0,55,56,43 0 137 endash
+em 889,243,0,55,56,43 0 138 emdash
+fi 500,681,207,31,191,31 3 140 fi
+fl 500,682,204,68,191,43 3 141 fl
+.i 278,441,11,7,1,7 0 144 dotlessi
+ga 333,664,0,28,-71,28 2 146 grave
+a" 333,664,0,203,-43,43 2 147 hungarumlaut
+a. 333,646,0,22,-157,22 2 148 dotaccent
+ab 333,650,0,135,-67,43 2 149 breve
+ah 333,661,0,143,-71,43 2 150 caron
+ao 333,691,0,72,-105,43 2 151 ring
+ho 333,40,169,0,30 0 152 ogonek
+lq 556,666,0,8,-116,8 2 153 quotedblleft
+rq 556,666,0,0,-101 2 154 quotedblright
+oe 667,441,12,29,30,29 0 155 oe
+/l 278,683,11,84,9,43 2 156 lslash
+Bq 556,101,129,0,-7 0 157 quotedblbase
+OE 944,666,8,70,1,43 2 158 OE
+/L 556,653,0,53,58,43 2 159 Lslash
+r! 389,473,205,0,-9 1 161 exclamdown
+ct 500,560,143,22,-27,22 2 162 cent
+Po 500,670,6,67,40,43 2 163 sterling
+Cs 500,597,0,72,72,43 2 164 currency
+Ye 500,653,0,153,23,43 2 165 yen
+bb 275,708,142,0,-55 2 166 brokenbar
+sc 500,666,162,11,-3,11 2 167 section
+ad 333,646,0,122,-57,43 2 168 dieresis
+co 760,666,18,9,9,9 2 169 copyright
+Of 276,676,0,126,8,43 2 170 ordfeminine
+fo 333,403,0,0,-1 0 171 guilsinglleft
+tno 675,386,0,0,-36 0 172 logicalnot
+\- 675,286,0,0,-36 0 173 minus
+rg 760,666,18,9,9,9 2 174 registered
+a- 333,583,0,128,-49,43 2 175 macron
+de 400,676,0,37,-51,37 2 176 degree
+t+- 675,506,0,0,-36 0 177 plusminus
+S2 300,676,0,74,17,43 2 178 twosuperior
+S3 300,676,0,89,7,43 2 179 threesuperior
+aa 333,664,0,120,-130,43 2 180 acute
+*m 514,428,208,15,93,15 1 181 mu
+mc "
+ps 523,653,123,143,-5,43 2 182 paragraph
+pc 250,310,0,0,-20 0 183 periodcentered
+ac 333,0,217,0,80 1 184 cedilla
+S1 300,676,0,34,7,34 2 185 onesuperior
+Om 310,676,0,102,-17,43 2 186 ordmasculine
+fc 333,403,0,0,-2 0 187 guilsinglright
+14 750,676,10,36,17,36 2 188 onequarter
+12 750,676,10,49,16,43 2 189 onehalf
+34 750,676,10,36,27,36 2 190 threequarters
+r? 500,471,205,0,22 1 191 questiondown
+`A 611,876,0,3,101,3 2 192 Agrave
+'A 611,876,0,3,101,3 2 193 Aacute
+^A 611,873,0,3,101,3 2 194 Acircumflex
+~A 611,836,0,5,101,5 2 195 Atilde
+:A 611,818,0,3,101,3 2 196 Adieresis
+oA 611,883,0,3,101,3 2 197 Aring
+AE 889,653,0,72,77,43 2 198 AE
+,C 667,666,217,72,-16,43 3 199 Ccedilla
+`E 611,876,0,73,51,43 2 200 Egrave
+'E 611,876,0,73,51,43 2 201 Eacute
+^E 611,873,0,73,51,43 2 202 Ecircumflex
+:E 611,818,0,73,51,43 2 203 Edieresis
+`I 333,876,0,101,58,43 2 204 Igrave
+'I 333,876,0,150,58,43 2 205 Iacute
+^I 333,873,0,142,58,43 2 206 Icircumflex
+:I 333,818,0,152,58,43 2 207 Idieresis
+-D 722,653,0,28,58,28 2 208 Eth
+~N 667,836,15,110,70,43 2 209 Ntilde
+`O 722,876,18,27,-10,27 2 210 Ograve
+'O 722,876,18,27,-10,27 2 211 Oacute
+^O 722,873,18,27,-10,27 2 212 Ocircumflex
+~O 722,836,18,27,-10,27 2 213 Otilde
+:O 722,818,18,27,-10,27 2 214 Odieresis
+tmu 675,497,0,0,-43 0 215 multiply
+/O 722,722,105,27,-10,27 2 216 Oslash
+`U 722,876,18,93,-52,43 2 217 Ugrave
+'U 722,876,18,93,-52,43 2 218 Uacute
+^U 722,873,18,93,-52,43 2 219 Ucircumflex
+:U 722,818,18,93,-52,43 2 220 Udieresis
+'Y 556,876,0,127,-28,43 2 221 Yacute
+TP 611,653,0,8,50,8 2 222 Thorn
+ss 500,679,207,43,218,43 3 223 germandbls
+`a 500,664,11,26,33,26 2 224 agrave
+'a 500,664,11,37,33,37 2 225 aacute
+^a 500,661,11,26,33,26 2 226 acircumflex
+~a 500,624,11,61,33,43 2 227 atilde
+:a 500,606,11,39,33,39 2 228 adieresis
+oa 500,691,11,26,33,26 2 229 aring
+ae 667,441,11,23,27,23 0 230 ae
+,c 444,441,217,31,20,31 1 231 ccedilla
+`e 444,664,11,18,19,18 2 232 egrave
+'e 444,664,11,65,19,43 2 233 eacute
+^e 444,661,11,47,19,43 2 234 ecircumflex
+:e 444,606,11,57,19,43 2 235 edieresis
+`i 278,664,11,56,1,43 2 236 igrave
+'i 278,664,11,127,1,43 2 237 iacute
+^i 278,661,11,99,17,43 2 238 icircumflex
+:i 278,606,11,124,1,43 2 239 idieresis
+Sd 500,683,11,32,23,32 2 240 eth
+~n 500,624,9,26,36,26 2 241 ntilde
+`o 500,664,11,18,23,18 2 242 ograve
+'o 500,664,11,37,23,37 2 243 oacute
+^o 500,661,11,18,23,18 2 244 ocircumflex
+~o 500,624,11,46,23,43 2 245 otilde
+:o 500,606,11,39,23,39 2 246 odieresis
+tdi 675,517,11,0,-36 0 247 divide
+/o 500,554,135,19,22,19 2 248 oslash
+`u 500,664,11,25,8,25 2 249 ugrave
+'u 500,664,11,27,8,27 2 250 uacute
+^u 500,661,11,25,8,25 2 251 ucircumflex
+:u 500,606,11,29,8,29 2 252 udieresis
+'y 444,664,206,65,74,43 3 253 yacute
+Tp 500,683,205,19,125,19 3 254 thorn
+:y 444,606,206,47,74,43 3 255 ydieresis
+u2026 889,100,11,0,-7 0 256 ellipsis
diff --git a/font/devps/TR b/font/devps/TR
new file mode 100644
index 0000000..3ce236f
--- /dev/null
+++ b/font/devps/TR
@@ -0,0 +1,554 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName Times Roman
+# Version 003.001
+# FamilyName Times
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:06:12 1999
+# Comment UniqueID 44710
+# Comment VMusage 35112 42048
+
+name TR
+internalname Times-Roman
+spacewidth 250
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A C -40
+A ,C -40
+A G -40
+A O -55
+A /O -55
+A Q -55
+A T -111
+A U -55
+A V -135
+A W -90
+A Y -105
+A ' -111
+A cq -111
+A v -74
+A w -92
+A y -92
+oA C -40
+oA ,C -40
+oA G -40
+oA O -55
+oA /O -55
+oA Q -55
+oA T -111
+oA U -55
+oA V -135
+oA W -90
+oA Y -105
+oA ' -111
+oA cq -111
+oA v -74
+oA w -92
+oA y -92
+B A -35
+B oA -35
+B U -10
+D A -40
+D oA -40
+D V -40
+D W -30
+D Y -55
+F A -74
+F oA -74
+F a -15
+F oa -15
+F , -80
+F o -15
+F /o -15
+F . -80
+F u2026 -80
+J A -60
+J oA -60
+K O -30
+K /O -30
+K e -25
+K o -35
+K /o -35
+K u -15
+K y -25
+L T -92
+L V -100
+L W -74
+L Y -100
+L ' -92
+L cq -92
+L y -55
+/L T -92
+/L V -100
+/L W -74
+/L Y -100
+/L ' -92
+/L cq -92
+/L y -55
+N A -35
+N oA -35
+O A -35
+O oA -35
+O T -40
+O V -50
+O W -35
+O X -40
+O Y -50
+/O A -35
+/O oA -35
+/O T -40
+/O V -50
+/O W -35
+/O X -40
+/O Y -50
+P A -92
+P oA -92
+P a -15
+P oa -15
+P , -111
+P . -111
+P u2026 -111
+Q U -10
+R O -40
+R /O -40
+R T -60
+R U -40
+R V -80
+R W -55
+R Y -65
+T A -93
+T oA -93
+T O -18
+T /O -18
+T a -80
+T oa -80
+T : -50
+T , -74
+T e -70
+T - -92
+T hy -92
+T i -35
+T o -80
+T /o -80
+T . -74
+T u2026 -74
+T r -35
+T ; -55
+T u -45
+T w -80
+T y -80
+U A -40
+U oA -40
+V A -135
+V oA -135
+V G -15
+V O -40
+V /O -40
+V a -111
+V oa -111
+V : -74
+V , -129
+V e -111
+V - -100
+V hy -100
+V i -60
+V o -129
+V /o -129
+V . -129
+V u2026 -129
+V ; -74
+V u -75
+W A -120
+W oA -120
+W O -10
+W /O -10
+W a -80
+W oa -80
+W : -37
+W , -92
+W e -80
+W - -65
+W hy -65
+W i -40
+W o -80
+W /o -80
+W . -92
+W u2026 -92
+W ; -37
+W u -50
+W y -73
+Y A -120
+Y oA -120
+Y O -30
+Y /O -30
+Y a -100
+Y oa -100
+Y : -92
+Y , -129
+Y e -100
+Y - -111
+Y hy -111
+Y i -55
+Y o -110
+Y /o -110
+Y . -129
+Y u2026 -129
+Y ; -92
+Y u -111
+a v -20
+a w -15
+oa v -20
+oa w -15
+b . -40
+b u2026 -40
+b u -20
+b v -15
+c y -15
+,c y -15
+, rq -70
+, ' -70
+, cq -70
+e g -15
+e v -25
+e w -25
+e x -15
+e y -15
+f a -10
+f oa -10
+f .i -50
+f f -25
+f i -20
+f ' 55
+f cq 55
+g a -5
+g oa -5
+h y -5
+i v -25
+k e -10
+k o -10
+k /o -10
+k y -15
+l w -10
+/l w -10
+n v -40
+n y -15
+o v -15
+o w -25
+o y -10
+/o v -15
+/o w -25
+/o y -10
+p y -10
+. rq -70
+u2026 rq -70
+. ' -70
+u2026 ' -70
+. cq -70
+u2026 cq -70
+lq A -80
+lq oA -80
+` A -80
+oq A -80
+` oA -80
+oq oA -80
+` ` -74
+` oq -74
+oq ` -74
+oq oq -74
+' d -50
+cq d -50
+' l -10
+cq l -10
+' /l -10
+cq /l -10
+' ' -74
+' cq -74
+cq ' -74
+cq cq -74
+' r -50
+cq r -50
+' s -55
+cq s -55
+' t -18
+cq t -18
+' v -50
+cq v -50
+r , -40
+r g -18
+r - -20
+r hy -20
+r . -55
+r u2026 -55
+v a -25
+v oa -25
+v , -65
+v e -15
+v o -20
+v /o -20
+v . -65
+v u2026 -65
+w a -10
+w oa -10
+w , -65
+w o -10
+w /o -10
+w . -65
+w u2026 -65
+x e -15
+y , -65
+y . -65
+y u2026 -65
+
+charset
+ha 469,662 2 0 asciicircum
+ti 541,323 0 1 asciitilde
+vS 556,886,14 2 2 Scaron
+vZ 611,886 2 3 Zcaron
+vs 389,674,10 2 4 scaron
+vz 444,674 2 5 zcaron
+:Y 722,835 2 6 Ydieresis
+tm 980,662 2 7 trademark
+aq 180,676 2 8 quotesingle
+Eu 500,676,14 2 9 Euro
+space 250 0 32 space
+! 333,676,9 2 33 exclam
+" 408,676 2 34 quotedbl
+dq "
+# 500,662 2 35 numbersign
+sh "
+$ 500,727,87 2 36 dollar
+Do "
+% 833,676,13 2 37 percent
+& 778,676,13 2 38 ampersand
+' 333,676 2 39 quoteright
+cq "
+( 333,676,177 2 40 parenleft
+) 333,676,177 2 41 parenright
+* 500,676 2 42 asterisk
++ 564,506 0 43 plus
+, 250,102,141 0 44 comma
+- 333,257 0 45 hyphen
+hy "
+. 250,100,11 0 46 period
+/ 278,676,14,9,9 2 47 slash
+sl "
+0 500,676,14 2 48 zero
+1 500,676 2 49 one
+2 500,676 2 50 two
+3 500,676,14 2 51 three
+4 500,676 2 52 four
+5 500,688,14 2 53 five
+6 500,684,14 2 54 six
+7 500,662,8 2 55 seven
+8 500,676,14 2 56 eight
+9 500,676,22 2 57 nine
+: 278,459,11 0 58 colon
+; 278,459,141 0 59 semicolon
+< 564,514,8 0 60 less
+= 564,386 0 61 equal
+> 564,514,8 0 62 greater
+? 444,676,8 2 63 question
+@ 921,676,14 2 64 at
+at "
+A 722,674 2 65 A
+B 667,662 2 66 B
+C 667,676,14 2 67 C
+D 722,662 2 68 D
+E 611,662 2 69 E
+F 556,662 2 70 F
+G 722,676,14 2 71 G
+H 722,662 2 72 H
+I 333,662 2 73 I
+J 389,662,14 2 74 J
+K 722,662,0,1 2 75 K
+L 611,662 2 76 L
+M 889,662 2 77 M
+N 722,662,11 2 78 N
+O 722,676,14 2 79 O
+P 556,662 2 80 P
+Q 722,676,178 2 81 Q
+R 667,662 2 82 R
+S 556,676,14 2 83 S
+T 611,662 2 84 T
+U 722,662,14 2 85 U
+V 722,662,11 2 86 V
+W 944,662,11 2 87 W
+X 722,662 2 88 X
+Y 722,662 2 89 Y
+Z 611,662 2 90 Z
+[ 333,662,156 2 91 bracketleft
+lB "
+\ 278,676,14,9,9 2 92 backslash
+rs "
+] 333,662,156 2 93 bracketright
+rB "
+^ 333,674 2 94 circumflex
+a^ "
+_ 500,0,125 0 95 underscore
+` 333,676 2 96 quoteleft
+oq "
+a 444,460,10 0 97 a
+b 500,683,10 2 98 b
+c 444,460,10 0 99 c
+d 500,683,10 2 100 d
+e 444,460,10 0 101 e
+f 333,683,0,50 2 102 f
+g 500,460,218 1 103 g
+h 500,683 2 104 h
+i 278,683 2 105 i
+j 278,683,218,0,70 3 106 j
+k 500,683,0,5 2 107 k
+l 278,683 2 108 l
+m 778,460 0 109 m
+n 500,460 0 110 n
+o 500,460,10 0 111 o
+p 500,460,217 1 112 p
+q 500,460,217 1 113 q
+r 333,460,0,2 0 114 r
+s 389,460,10 0 115 s
+t 278,579,10,1 2 116 t
+u 500,450,10 0 117 u
+v 500,450,14 0 118 v
+w 722,450,14 0 119 w
+x 500,450 0 120 x
+y 500,450,218 1 121 y
+z 444,450 0 122 z
+{ 480,680,181 2 123 braceleft
+lC "
+| 200,782,218 3 124 bar
+ba "
+} 480,680,181 2 125 braceright
+rC "
+~ 333,638 2 126 tilde
+a~ "
+bq 333,102,141 0 128 quotesinglbase
+Fo 500,416 0 129 guillemotleft
+Fc 500,416 0 130 guillemotright
+bu 350,466 0 131 bullet
+Fn 500,676,189 2 132 florin
+f/ 167,676,14,164,168 2 133 fraction
+%0 1000,706,19 2 134 perthousand
+dg 500,676,149 2 135 dagger
+dd 500,676,153 2 136 daggerdbl
+en 500,250 0 137 endash
+em 1000,250 0 138 emdash
+fi 556,683 2 140 fi
+fl 556,683 2 141 fl
+.i 278,460 0 144 dotlessi
+ga 333,678 2 146 grave
+a" 333,678,0,44,3 2 147 hungarumlaut
+a. 333,681 2 148 dotaccent
+ab 333,664 2 149 breve
+ah 333,674 2 150 caron
+ao 333,711 2 151 ring
+ho 333,0,165 0 152 ogonek
+lq 444,676 2 153 quotedblleft
+rq 444,676 2 154 quotedblright
+oe 722,460,10 0 155 oe
+/l 278,683 2 156 lslash
+Bq 444,102,141 0 157 quotedblbase
+OE 889,668,6 2 158 OE
+/L 611,662 2 159 Lslash
+r! 333,467,218 1 161 exclamdown
+ct 500,579,138 2 162 cent
+Po 500,676,8 2 163 sterling
+Cs 500,602,0,22,22 2 164 currency
+Ye 500,662,0,12,53 2 165 yen
+bb 200,707,143 2 166 brokenbar
+sc 500,676,148 2 167 section
+ad 333,681 2 168 dieresis
+co 760,676,14 2 169 copyright
+Of 276,676 2 170 ordfeminine
+fo 333,416 0 171 guilsinglleft
+tno 564,386 0 172 logicalnot
+\- 564,286 0 173 minus
+rg 760,676,14 2 174 registered
+a- 333,601 2 175 macron
+de 400,676 2 176 degree
+t+- 564,506 0 177 plusminus
+S2 300,676 2 178 twosuperior
+S3 300,676 2 179 threesuperior
+aa 333,678 2 180 acute
+*m 510,450,210 0 181 mu
+mc "
+ps 453,662,154,0,22 2 182 paragraph
+pc 250,310 0 183 periodcentered
+ac 333,0,215 0 184 cedilla
+S1 300,676 2 185 onesuperior
+Om 310,676 2 186 ordmasculine
+fc 333,416 0 187 guilsinglright
+14 750,676,14 2 188 onequarter
+12 750,676,14 2 189 onehalf
+34 750,676,14 2 190 threequarters
+r? 444,466,218 1 191 questiondown
+`A 722,890 2 192 Agrave
+'A 722,890 2 193 Aacute
+^A 722,886 2 194 Acircumflex
+~A 722,850 2 195 Atilde
+:A 722,835 2 196 Adieresis
+oA 722,898 2 197 Aring
+AE 889,662 2 198 AE
+,C 667,676,215 2 199 Ccedilla
+`E 611,890 2 200 Egrave
+'E 611,890 2 201 Eacute
+^E 611,886 2 202 Ecircumflex
+:E 611,835 2 203 Edieresis
+`I 333,890 2 204 Igrave
+'I 333,890 2 205 Iacute
+^I 333,886 2 206 Icircumflex
+:I 333,835 2 207 Idieresis
+-D 722,662 2 208 Eth
+~N 722,850,11 2 209 Ntilde
+`O 722,890,14 2 210 Ograve
+'O 722,890,14 2 211 Oacute
+^O 722,886,14 2 212 Ocircumflex
+~O 722,850,14 2 213 Otilde
+:O 722,835,14 2 214 Odieresis
+tmu 564,497 0 215 multiply
+/O 722,734,80 2 216 Oslash
+`U 722,890,14 2 217 Ugrave
+'U 722,890,14 2 218 Uacute
+^U 722,886,14 2 219 Ucircumflex
+:U 722,835,14 2 220 Udieresis
+'Y 722,890 2 221 Yacute
+TP 556,662 2 222 Thorn
+ss 500,683,9 2 223 germandbls
+`a 444,678,10 2 224 agrave
+'a 444,678,10 2 225 aacute
+^a 444,674,10 2 226 acircumflex
+~a 444,638,10 2 227 atilde
+:a 444,623,10 2 228 adieresis
+oa 444,711,10 2 229 aring
+ae 667,460,10 0 230 ae
+,c 444,460,215 0 231 ccedilla
+`e 444,678,10 2 232 egrave
+'e 444,678,10 2 233 eacute
+^e 444,674,10 2 234 ecircumflex
+:e 444,623,10 2 235 edieresis
+`i 278,678,0,0,8 2 236 igrave
+'i 278,678,0,12 2 237 iacute
+^i 278,674,0,17,16 2 238 icircumflex
+:i 278,623,0,10,9 2 239 idieresis
+Sd 500,686,10 2 240 eth
+~n 500,638 2 241 ntilde
+`o 500,678,10 2 242 ograve
+'o 500,678,10 2 243 oacute
+^o 500,674,10 2 244 ocircumflex
+~o 500,638,10 2 245 otilde
+:o 500,623,10 2 246 odieresis
+tdi 564,516,10 0 247 divide
+/o 500,551,112 0 248 oslash
+`u 500,678,10 2 249 ugrave
+'u 500,678,10 2 250 uacute
+^u 500,674,10 2 251 ucircumflex
+:u 500,623,10 2 252 udieresis
+'y 500,678,218 3 253 yacute
+Tp 500,683,217 3 254 thorn
+:y 500,623,218 3 255 ydieresis
+u2026 1000,100,11 0 256 ellipsis
diff --git a/font/devps/ZCMI b/font/devps/ZCMI
new file mode 100644
index 0000000..6d1723f
--- /dev/null
+++ b/font/devps/ZCMI
@@ -0,0 +1,910 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName ITC Zapf Chancery Medium Italic
+# Version 003.001
+# FamilyName ITC Zapf Chancery
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1989, 1990, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.ITC Zapf Chancery is a registered trademark of International Typeface Corporation.
+# Comment Copyright (c) 1985, 1987, 1989, 1990, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Mon Aug 23 13:37:27 1999
+# Comment UniqueID 44723
+# Comment VMusage 36306 43242
+
+name ZCMI
+internalname ZapfChancery-MediumItalic
+slant 14
+spacewidth 220
+encoding text.enc
+ligatures fi fl 0
+
+kernpairs
+A C 20
+A ,C 20
+A G -30
+A O 10
+A 'O 10
+A ^O 10
+A :O 10
+A `O 10
+A /O 10
+A ~O 10
+A Q 10
+A T 10
+A U -10
+A 'U -10
+A ^U -10
+A :U -10
+A `U -10
+A rq -40
+A ' -40
+A cq -40
+'A C 20
+'A ,C 20
+'A G -30
+'A O 10
+'A 'O 10
+'A ^O 10
+'A :O 10
+'A `O 10
+'A /O 10
+'A ~O 10
+'A Q 10
+'A T 10
+'A U -10
+'A 'U -10
+'A ^U -10
+'A :U -10
+'A `U -10
+^A C 20
+^A ,C 20
+^A G -30
+^A O 10
+^A 'O 10
+^A ^O 10
+^A :O 10
+^A `O 10
+^A /O 10
+^A ~O 10
+^A Q 10
+^A T 10
+^A U -10
+^A 'U -10
+^A ^U -10
+^A :U -10
+^A `U -10
+:A C 20
+:A ,C 20
+:A G -30
+:A O 10
+:A 'O 10
+:A ^O 10
+:A :O 10
+:A `O 10
+:A /O 10
+:A ~O 10
+:A Q 10
+:A T 10
+:A U -10
+:A 'U -10
+:A ^U -10
+:A :U -10
+:A `U -10
+`A C 20
+`A ,C 20
+`A G -30
+`A O 10
+`A 'O 10
+`A ^O 10
+`A :O 10
+`A `O 10
+`A /O 10
+`A ~O 10
+`A Q 10
+`A T 10
+`A U -10
+`A 'U -10
+`A ^U -10
+`A :U -10
+`A `U -10
+oA C 20
+oA ,C 20
+oA G -30
+oA O 10
+oA 'O 10
+oA ^O 10
+oA :O 10
+oA `O 10
+oA /O 10
+oA ~O 10
+oA Q 10
+oA T 10
+oA U -10
+oA 'U -10
+oA ^U -10
+oA :U -10
+oA `U -10
+~A C 20
+~A ,C 20
+~A G -30
+~A O 10
+~A 'O 10
+~A ^O 10
+~A :O 10
+~A `O 10
+~A /O 10
+~A ~O 10
+~A Q 10
+~A T 10
+~A U -10
+~A 'U -10
+~A ^U -10
+~A :U -10
+~A `U -10
+D A -10
+D 'A -10
+D ^A -10
+D :A -10
+D `A -10
+D oA -10
+D ~A -10
+D Y 10
+D 'Y 10
+D :Y 10
+D , -20
+D . -30
+D u2026 -30
+F , -30
+F i 10
+F . -40
+F u2026 -40
+G , -10
+G . -20
+G u2026 -20
+J , -10
+J . -20
+J u2026 -20
+K e -20
+K 'e -20
+K ^e -20
+K :e -20
+K `e -20
+K o -20
+K 'o -20
+K ^o -20
+K :o -20
+K `o -20
+K ~o -20
+K u -20
+K 'u -20
+K ^u -20
+K :u -20
+K `u -20
+L V -20
+L W -10
+L rq -25
+L ' -25
+L cq -25
+L y -10
+L 'y -10
+L :y -10
+O A -20
+O 'A -20
+O ^A -20
+O :A -20
+O `A -20
+O oA -20
+O ~A -20
+O T 20
+O Y 10
+O 'Y 10
+O :Y 10
+O , -10
+O . -20
+O u2026 -20
+'O A -20
+'O 'A -20
+'O ^A -20
+'O :A -20
+'O `A -20
+'O oA -20
+'O ~A -20
+'O T 20
+'O Y 10
+'O 'Y 10
+'O :Y 10
+'O , -10
+'O . -20
+'O u2026 -20
+^O A -20
+^O 'A -20
+^O ^A -20
+^O :A -20
+^O `A -20
+^O oA -20
+^O ~A -20
+^O T 20
+^O Y 10
+^O 'Y 10
+^O :Y 10
+^O , -10
+^O . -20
+^O u2026 -20
+:O A -20
+:O 'A -20
+:O ^A -20
+:O :A -20
+:O `A -20
+:O oA -20
+:O ~A -20
+:O T 20
+:O Y 10
+:O 'Y 10
+:O :Y 10
+:O , -10
+:O . -20
+:O u2026 -20
+`O A -20
+`O 'A -20
+`O ^A -20
+`O :A -20
+`O `A -20
+`O oA -20
+`O ~A -20
+`O T 20
+`O Y 10
+`O 'Y 10
+`O :Y 10
+`O , -10
+`O . -20
+`O u2026 -20
+/O A -20
+/O 'A -20
+/O ^A -20
+/O :A -20
+/O `A -20
+/O oA -20
+/O ~A -20
+/O T 20
+/O Y 10
+/O 'Y 10
+/O :Y 10
+/O , -10
+/O . -20
+/O u2026 -20
+~O A -20
+~O 'A -20
+~O ^A -20
+~O :A -20
+~O `A -20
+~O oA -20
+~O ~A -20
+~O T 20
+~O Y 10
+~O 'Y 10
+~O :Y 10
+~O , -10
+~O . -20
+~O u2026 -20
+P A -10
+P 'A -10
+P ^A -10
+P :A -10
+P `A -10
+P oA -10
+P ~A -10
+P a -20
+P 'a -20
+P ^a -20
+P :a -20
+P `a -20
+P oa -20
+P ~a -20
+P , -40
+P e -10
+P 'e -10
+P ^e -10
+P :e -10
+P `e -10
+P o -10
+P 'o -10
+P ^o -10
+P :o -10
+P `o -10
+P ~o -10
+P . -50
+P u2026 -50
+Q U -10
+Q 'U -10
+Q ^U -10
+Q :U -10
+Q `U -10
+R T 20
+R W 10
+R Y 10
+R 'Y 10
+R :Y 10
+T A 10
+T 'A 10
+T ^A 10
+T :A 10
+T `A 10
+T oA 10
+T ~A 10
+T O 30
+T 'O 30
+T ^O 30
+T :O 30
+T `O 30
+T /O 30
+T ~O 30
+T a -20
+T 'a -20
+T ^a -20
+T `a -20
+T oa -20
+T e -20
+T 'e -20
+T h 20
+T - -20
+T hy -20
+T i 20
+T o -20
+T 'o -20
+T ^o -20
+V G -20
+V O 10
+V 'O 10
+V ^O 10
+V :O 10
+V `O 10
+V /O 10
+V ~O 10
+V a -20
+V 'a -20
+V ^a -20
+V :a -20
+V `a -20
+V oa -20
+V ~a -20
+V , -90
+V e -20
+V 'e -20
+V ^e -20
+V :e -20
+V `e -20
+V o -20
+V 'o -20
+V ^o -20
+V :o -20
+V `o -20
+V ~o -20
+V . -100
+V u2026 -100
+W O 10
+W 'O 10
+W ^O 10
+W :O 10
+W `O 10
+W /O 10
+W ~O 10
+W a -20
+W 'a -20
+W ^a -20
+W :a -20
+W `a -20
+W oa -20
+W ~a -20
+W , -40
+W e -20
+W 'e -20
+W ^e -20
+W :e -20
+W `e -20
+W h 10
+W i 10
+W o -20
+W 'o -20
+W ^o -20
+W :o -20
+W `o -20
+W ~o -20
+W . -50
+W u2026 -50
+Y a -60
+Y 'a -60
+Y ^a -20
+Y :a -20
+Y `a -20
+Y oa -60
+Y ~a -20
+Y , -40
+Y e -40
+Y 'e -40
+Y i 10
+Y 'i 10
+Y ^i 30
+Y :i 30
+Y `i 30
+Y o -50
+Y 'o -20
+Y ^o -20
+Y :o -20
+Y `o -20
+Y ~o -20
+Y . -50
+Y u2026 -50
+Y u -20
+Y 'u -20
+Y ^u -20
+Y :u -20
+Y `u -20
+'Y a -60
+'Y 'a -60
+'Y ^a -60
+'Y :a -20
+'Y `a -20
+'Y oa -60
+'Y ~a -20
+'Y , -40
+'Y e -40
+'Y 'e -40
+'Y ^e -40
+'Y i 10
+'Y 'i 10
+'Y ^i 10
+'Y :i 30
+'Y `i 30
+'Y o -50
+'Y 'o -50
+'Y ^o -20
+'Y :o -20
+'Y `o -20
+'Y ~o -20
+'Y . -50
+'Y u2026 -50
+'Y u -20
+'Y 'u -20
+'Y ^u -20
+'Y :u -20
+'Y `u -20
+:Y a -60
+:Y 'a -60
+:Y ^a -20
+:Y :a -20
+:Y `a -20
+:Y oa -60
+:Y ~a -20
+:Y , -40
+:Y e -40
+:Y 'e -40
+:Y ^e -40
+:Y i 10
+:Y 'i 10
+:Y ^i 30
+:Y :i 30
+:Y `i 30
+:Y o -50
+:Y 'o -50
+:Y ^o -50
+:Y :o -20
+:Y `o -20
+:Y ~o -20
+:Y . -50
+:Y u2026 -50
+:Y u -20
+:Y 'u -20
+:Y ^u -20
+:Y :u -20
+:Y `u -20
+b b -20
+b , -20
+b l -20
+b . -30
+b u2026 -30
+c k -10
+,c k -10
+, rq -70
+, ' -70
+, cq -70
+d d -40
+d v -10
+d w -20
+e y 10
+e 'y 10
+e :y 10
+'e y 10
+'e 'y 10
+'e :y 10
+^e y 10
+^e 'y 10
+^e :y 10
+:e y 10
+:e 'y 10
+:e :y 10
+`e y 10
+`e 'y 10
+`e :y 10
+f a -20
+f 'a -20
+f ^a -20
+f :a -20
+f `a -20
+f oa -20
+f ~a -20
+f , -40
+f e -10
+f 'e -10
+f ^e -10
+f :e -10
+f `e -10
+f f -50
+f . -50
+f u2026 -50
+f rq 30
+f ' 30
+f cq 30
+g a 10
+g , -20
+g e 10
+g i 10
+g . -30
+g u2026 -30
+g y 10
+k e -20
+k 'e -20
+k ^e -20
+k :e -20
+k `e -20
+k o -10
+k 'o -10
+k ^o -10
+k :o -10
+k `o -10
+k ~o -10
+k y 10
+m u 10
+m 'u 10
+m ^u 10
+m :u 10
+m `u 10
+m y 10
+m 'y 10
+m :y 10
+n y 20
+n 'y 20
+n :y 20
+~n y 20
+~n 'y 20
+~n :y 20
+o , -20
+o . -30
+o u2026 -30
+'o , -20
+'o . -30
+'o u2026 -30
+^o , -20
+^o . -30
+^o u2026 -30
+:o , -20
+:o . -30
+:o u2026 -30
+`o , -20
+`o . -30
+`o u2026 -30
+~o , -20
+~o . -30
+~o u2026 -30
+p , -20
+p p -10
+p . -30
+p u2026 -30
+. rq -80
+u2026 rq -80
+. ' -80
+u2026 ' -80
+. cq -80
+u2026 cq -80
+lq A 10
+lq ` 20
+lq oq 20
+` A 10
+oq A 10
+` ` -115
+` oq -115
+oq ` -115
+oq oq -115
+' l 20
+cq l 20
+' rq 20
+cq rq 20
+' ' -115
+' cq -115
+cq ' -115
+cq cq -115
+' r 30
+cq r 30
+' s -25
+cq s -25
+' vs -25
+cq vs -25
+' t 20
+cq t 20
+' v 30
+cq v 30
+r , -40
+r i 10
+r 'i 10
+r ^i 10
+r :i 10
+r `i 10
+r . -50
+r u2026 -50
+s , -10
+s . -20
+s u2026 -20
+vs , -10
+vs . -20
+vs u2026 -20
+v , -20
+v . -30
+v u2026 -30
+w , -20
+w h 20
+w o 10
+w 'o 10
+w ^o 10
+w :o 10
+w `o 10
+w ~o 10
+w . -30
+w u2026 -30
+
+charset
+ha 520,594,0,62,-82,62 2 0 asciicircum
+ti 520,320,0,69,-73,69 0 1 asciitilde
+vS 460,821,81,184,5,87 2 2 Scaron
+vZ 620,821,19,99,8,87 2 3 Zcaron
+vs 320,659,14,194,4,87 2 4 scaron
+vz 440,659,14,124,24,87 2 5 zcaron
+:Y 560,762,168,264,9,87 2 6 Ydieresis
+tm 1000,594,0,96,-77,87 2 7 trademark
+aq 160,610,0,105,-95,87 2 8 quotesingle
+Eu 440,610,16,221,-21,87 2 9 Euro
+space 220 0 32 space
+! 280,610,14,123,-69,87 2 33 exclam
+" 220,610,0,163,-70,87 2 34 quotedbl
+dq "
+# 440,594,0,131,-33,87 2 35 numbersign
+sh "
+$ 440,709,144,118,-10,87 2 36 dollar
+Do "
+% 680,700,160,80,-82,80 2 37 percent
+& 780,610,16,185,-76,87 2 38 ampersand
+' 240,610,0,148,-118,87 2 39 quoteright
+cq "
+( 260,664,216,201,-46,87 2 40 parenleft
+) 220,664,216,132,63,87 2 41 parenright
+* 420,610,0,109,-89,87 2 42 asterisk
++ 520,426,0,73,-67,73 0 43 plus
+, 220,148,140,43,25,43 0 44 comma
+- 280,248,0,104,-19,87 0 45 hyphen
+hy "
+. 220,128,14,58,-52,58 0 46 period
+/ 340,610,16,168,-24,87 2 47 slash
+sl "
+0 440,610,16,148,-29,87 2 48 zero
+1 440,610,0,38,9,38 2 49 one
+2 440,610,16,95,33,87 2 50 two
+3 440,610,16,95,49,87 2 51 three
+4 440,610,35,109,-27,87 2 52 four
+5 440,679,16,205,-10,87 2 53 five
+6 440,610,16,166,-40,87 2 54 six
+7 440,645,33,171,-107,87 2 55 seven
+8 440,610,16,139,-15,87 2 56 eight
+9 440,610,16,127,18,87 2 57 nine
+: 260,438,14,86,-48,86 0 58 colon
+; 240,438,140,109,21,87 0 59 semicolon
+< 520,468,0,57,-89,57 0 60 less
+= 520,340,0,73,-67,73 0 61 equal
+> 520,468,0,57,-89,57 0 62 greater
+? 380,610,14,125,-100,87 2 63 question
+@ 700,610,16,103,-77,87 2 64 at
+at "
+A 620,632,16,127,37,87 2 65 A
+B 600,640,6,124,-35,87 2 66 B
+C 520,610,16,161,-43,87 2 67 C
+D 700,640,6,118,-36,87 2 68 D
+E 620,618,12,139,-41,87 2 69 E
+F 580,629,118,263,-70,87 2 70 F
+G 620,610,242,139,-98,87 2 71 G
+H 680,708,16,248,32,87 2 72 H
+I 380,594,0,174,-49,87 2 73 I
+J 400,594,147,188,64,87 2 74 J
+K 660,610,153,234,-3,87 2 75 K
+L 580,610,16,127,-3,87 2 76 L
+M 840,722,16,230,-8,87 2 77 M
+N 700,708,168,265,-35,87 2 78 N
+O 600,610,16,110,-44,87 2 79 O
+P 540,628,0,168,8,87 2 80 P
+Q 600,610,177,225,-34,87 2 81 Q
+R 600,640,168,255,-8,87 2 82 R
+S 460,610,81,148,5,87 2 83 S
+T 500,667,0,294,-13,87 2 84 T
+U 740,617,16,102,-76,87 2 85 U
+V 640,714,16,220,-74,87 2 86 V
+W 880,723,16,216,-44,87 2 87 W
+X 560,610,16,189,80,87 2 88 X
+Y 560,647,168,264,9,87 2 89 Y
+Z 620,624,19,99,8,87 2 90 Z
+[ 240,655,207,215,63,87 2 91 bracketleft
+lB "
+\ 480,610,16,94,-90,87 2 92 backslash
+rs "
+] 320,655,207,121,77,87 2 93 bracketright
+rB "
+^ 340,649,0,153,-173,87 2 94 circumflex
+a^ "
+_ 500,0,125,50,50,50 0 95 underscore
+` 240,610,0,149,-119,87 2 96 quoteleft
+oq "
+a 420,438,15,115,-42,87 0 97 a
+b 420,714,23,122,-32,87 2 98 b
+c 340,438,14,116,-37,87 0 99 c
+d 440,714,14,261,-52,87 2 100 d
+e 340,438,14,113,-37,87 0 101 e
+f 320,714,314,277,169,87 3 102 f
+g 400,438,314,153,158,87 1 103 g
+h 440,714,14,134,-5,87 2 104 h
+i 240,635,14,151,-50,87 2 105 i
+j 220,635,314,162,162,87 3 106 j
+k 440,714,184,238,-37,87 2 107 k
+l 240,714,14,290,-52,87 2 108 l
+m 620,438,14,134,-36,87 0 109 m
+n 460,438,14,134,-51,87 0 110 n
+o 400,438,14,99,-37,87 0 111 o
+p 440,432,314,94,73,87 1 112 p
+q 400,510,300,140,-37,87 1 113 q
+r 300,438,14,174,-51,87 0 114 r
+s 320,438,14,133,4,87 0 115 s
+t 320,539,14,156,-56,87 2 116 t
+u 460,438,14,118,-52,87 0 117 u
+v 440,488,14,143,-37,87 0 118 v
+w 680,488,14,152,-37,87 0 119 w
+x 420,438,195,219,-20,87 0 120 x
+y 400,438,314,133,74,87 1 121 y
+z 440,445,14,118,24,87 0 122 z
+{ 240,655,207,193,-5,87 2 123 braceleft
+lC "
+| 520,750,250,0,-270 2 124 bar
+ba "
+} 240,655,207,128,60,87 2 125 braceright
+rC "
+~ 440,619,0,132,-193,87 2 126 tilde
+a~ "
+bq 180,146,121,61,29,61 0 128 quotesinglbase
+Fo 340,414,0,66,-48,66 0 129 guillemotleft
+Fc 380,414,0,45,-67,45 0 130 guillemotright
+bu 600,445,0,0,-178 0 131 bullet
+Fn 440,610,314,192,114,87 3 132 florin
+f/ 60,610,16,310,231,87 2 133 fraction
+%0 960,700,160,95,-62,87 2 134 perthousand
+dg 460,610,37,158,-88,87 2 135 dagger
+dd 480,610,59,103,-88,87 2 136 daggerdbl
+en 500,239,0,115,-1,87 0 137 endash
+em 1000,239,0,115,-1,87 0 138 emdash
+fi 520,714,314,135,174,87 3 140 fi
+fl 520,714,314,200,174,87 3 141 fl
+.i 240,438,14,116,-50,87 0 144 dotlessi
+ga 220,659,0,169,-143,87 2 146 grave
+a" 400,659,0,145,-158,87 2 147 hungarumlaut
+a. 220,635,0,172,-186,87 2 148 dotaccent
+ab 440,631,0,111,-203,87 2 149 breve
+ah 340,659,0,184,-204,87 2 150 caron
+ao 300,659,0,166,-190,87 2 151 ring
+ho 280,40,191,90,-64,87 0 152 ogonek
+lq 340,610,0,174,-119,87 2 153 quotedblleft
+rq 360,610,0,143,-108,87 2 154 quotedblright
+oe 560,438,14,118,-28,87 0 155 oe
+/l 300,714,14,230,-24,87 2 156 lslash
+Bq 280,146,121,51,64,51 0 157 quotedblbase
+OE 820,610,16,139,-13,87 2 158 OE
+/L 580,610,16,127,1,87 2 159 Lslash
+r! 280,438,186,76,-22,76 0 161 exclamdown
+ct 440,543,134,86,-72,86 2 162 cent
+Po 440,610,52,116,66,87 2 163 sterling
+Cs 440,509,0,84,0,84 0 164 currency
+Ye 440,647,168,223,51,87 2 165 yen
+bb 520,675,175,0,-270 2 166 brokenbar
+sc 420,610,215,144,-3,87 2 167 section
+ad 360,635,0,193,-183,87 2 168 dieresis
+co 740,610,16,73,-87,73 2 169 copyright
+Of 260,610,0,176,-61,87 2 170 ordfeminine
+fo 240,414,0,68,-48,68 0 171 guilsinglleft
+tno 520,340,0,73,-67,73 0 172 logicalnot
+\- 520,242,0,73,-67,73 0 173 minus
+rg 740,610,16,73,-87,73 2 174 registered
+a- 440,584,0,147,-242,87 2 175 macron
+de 400,610,0,107,-121,87 2 176 degree
+t+- 520,436,0,73,-67,73 0 177 plusminus
+S2 264,610,0,140,-22,87 2 178 twosuperior
+S3 264,610,0,134,-9,87 2 179 threesuperior
+aa 300,659,0,172,-215,87 2 180 acute
+*m 458,438,314,113,8,87 1 181 mu
+mc "
+ps 500,594,199,188,-55,87 2 182 paragraph
+pc 220,310,0,71,-89,71 0 183 periodcentered
+ac 300,6,191,0,38 0 184 cedilla
+S1 264,610,0,97,-33,87 2 185 onesuperior
+Om 260,610,0,163,-78,87 2 186 ordmasculine
+fc 260,414,0,56,-56,56 0 187 guilsinglright
+14 660,610,16,92,-6,87 2 188 onequarter
+12 660,610,16,92,-6,87 2 189 onehalf
+34 660,610,16,96,11,87 2 190 threequarters
+r? 400,438,186,37,-32,37 0 191 questiondown
+`A 620,821,16,127,37,87 2 192 Agrave
+'A 620,821,16,132,37,87 2 193 Aacute
+^A 620,821,16,127,37,87 2 194 Acircumflex
+~A 620,781,16,132,37,87 2 195 Atilde
+:A 620,762,16,173,37,87 2 196 Adieresis
+oA 620,831,16,127,37,87 2 197 Aring
+AE 740,594,16,109,71,87 2 198 AE
+,C 520,610,191,161,-43,87 2 199 Ccedilla
+`E 620,821,12,139,-41,87 2 200 Egrave
+'E 620,821,12,139,-41,87 2 201 Eacute
+^E 620,821,12,139,-41,87 2 202 Ecircumflex
+:E 620,762,12,139,-41,87 2 203 Edieresis
+`I 380,821,0,174,-49,87 2 204 Igrave
+'I 380,821,0,202,-49,87 2 205 Iacute
+^I 380,821,0,174,-49,87 2 206 Icircumflex
+:I 380,762,0,223,-49,87 2 207 Idieresis
+-D 700,640,6,118,-36,87 2 208 Eth
+~N 700,781,168,265,-35,87 2 209 Ntilde
+`O 600,821,16,110,-44,87 2 210 Ograve
+'O 600,821,16,110,-44,87 2 211 Oacute
+^O 600,821,16,110,-44,87 2 212 Ocircumflex
+~O 600,781,16,110,-44,87 2 213 Otilde
+:O 600,762,16,110,-44,87 2 214 Odieresis
+tmu 520,410,0,57,-83,57 0 215 multiply
+/O 660,672,78,141,-33,87 2 216 Oslash
+`U 740,821,16,102,-76,87 2 217 Ugrave
+'U 740,821,16,102,-76,87 2 218 Uacute
+^U 740,821,16,102,-76,87 2 219 Ucircumflex
+:U 740,762,16,102,-76,87 2 220 Udieresis
+'Y 560,821,168,264,9,87 2 221 Yacute
+TP 540,623,0,157,-2,87 2 222 Thorn
+ss 420,714,314,172,177,87 3 223 germandbls
+`a 420,659,15,115,-42,87 2 224 agrave
+'a 420,659,15,122,-42,87 2 225 aacute
+^a 420,649,15,115,-42,87 2 226 acircumflex
+~a 420,619,15,152,-42,87 2 227 atilde
+:a 420,610,15,143,-42,87 2 228 adieresis
+oa 420,659,15,115,-42,87 2 229 aring
+ae 540,468,14,134,-17,87 0 230 ae
+,c 340,438,191,116,-12,87 0 231 ccedilla
+`e 340,659,14,113,-37,87 2 232 egrave
+'e 340,659,14,172,-37,87 2 233 eacute
+^e 340,649,14,143,-37,87 2 234 ecircumflex
+:e 340,610,14,193,-37,87 2 235 edieresis
+`i 240,659,14,116,-50,87 2 236 igrave
+'i 240,659,14,202,-50,87 2 237 iacute
+^i 240,649,14,173,-50,87 2 238 icircumflex
+:i 240,610,14,213,-50,87 2 239 idieresis
+Sd 400,714,14,172,-37,87 2 240 eth
+~n 460,619,14,134,-51,87 2 241 ntilde
+`o 400,659,14,99,-37,87 2 242 ograve
+'o 400,659,14,132,-37,87 2 243 oacute
+^o 400,649,14,103,-37,87 2 244 ocircumflex
+~o 400,619,14,152,-37,87 2 245 otilde
+:o 400,610,14,163,-37,87 2 246 odieresis
+tdi 520,440,14,73,-67,73 0 247 divide
+/o 440,488,64,150,4,87 0 248 oslash
+`u 460,659,14,118,-52,87 2 249 ugrave
+'u 460,659,14,118,-52,87 2 250 uacute
+^u 460,649,14,118,-52,87 2 251 ucircumflex
+:u 460,610,14,118,-52,87 2 252 udieresis
+'y 400,659,314,133,74,87 3 253 yacute
+Tp 440,714,314,115,88,87 3 254 thorn
+:y 400,610,314,153,74,87 3 255 ydieresis
+u2026 1000,128,14,0,-74 0 256 ellipsis
diff --git a/font/devps/ZD b/font/devps/ZD
new file mode 100644
index 0000000..2ffaf6b
--- /dev/null
+++ b/font/devps/ZD
@@ -0,0 +1,222 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName ITC Zapf Dingbats
+# Version 002.000
+# FamilyName ITC Zapf Dingbats
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Zapf Dingbats is a registered trademark of International Typeface Corporation.
+# Comment Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Thu May 1 15:14:13 1997
+# Comment UniqueID 43082
+# Comment VMusage 45775 55535
+
+name ZD
+internalname ZapfDingbats
+special
+spacewidth 278
+
+charset
+space 278 0 32 space
+--- 974,621 3 33 a1
+--- 961,611 3 34 a2
+--- 974,621 3 35 a202
+--- 980,692 3 36 a3
+--- 719,566 3 37 a4
+--- 789,705,14 3 38 a5
+--- 790,705,14 3 39 a119
+--- 791,705,13 3 40 a118
+--- 690,553 3 41 a117
+--- 960,568 3 42 a11
+rh 939,559 3 43 a12
+--- 549,705,11 3 44 a13
+--- 855,632 3 45 a14
+--- 911,642 3 46 a15
+--- 933,550 3 47 a16
+--- 911,642 3 48 a105
+--- 945,553 3 49 a17
+--- 974,587 3 50 a18
+OK 755,705,13 3 51 a19
+--- 846,705,14 3 52 a20
+--- 762,692 3 53 a21
+--- 761,692 3 54 a22
+--- 571,661,68,0,1 3 55 a23
+--- 677,705,13 3 56 a24
+--- 763,692 3 57 a25
+--- 760,692 3 58 a26
+--- 759,692 3 59 a27
+--- 754,692 3 60 a28
+--- 494,692 3 61 a6
+--- 552,692 3 62 a7
+--- 537,692 3 63 a8
+--- 577,596 3 64 a9
+--- 692,705,14 3 65 a10
+--- 786,705,14 3 66 a29
+--- 788,705,14 3 67 a30
+--- 788,705,14 3 68 a31
+--- 790,705,14 3 69 a32
+--- 793,705,13 3 70 a33
+--- 794,705,13 3 71 a34
+--- 816,705,14 3 72 a35
+--- 823,705,14 3 73 a36
+--- 789,705,14 3 74 a37
+--- 841,705,14 3 75 a38
+--- 823,705,14 3 76 a39
+--- 833,705,14 3 77 a40
+--- 816,705,13 3 78 a41
+--- 831,705,14 3 79 a42
+--- 923,705,14 3 80 a43
+--- 744,692 3 81 a44
+--- 723,692 3 82 a45
+--- 749,692 3 83 a46
+--- 790,705,14 3 84 a47
+--- 792,705,14 3 85 a48
+--- 695,706,14 3 86 a49
+--- 776,699,6 3 87 a50
+--- 768,699,7 3 88 a51
+--- 792,705,14 3 89 a52
+--- 759,692 3 90 a53
+--- 707,704,13 3 91 a54
+--- 708,705,14 3 92 a55
+--- 682,705,14 3 93 a56
+--- 701,705,14 3 94 a57
+--- 826,705,14 3 95 a58
+--- 815,705,14 3 96 a59
+--- 789,705,14 3 97 a60
+--- 789,705,14 3 98 a61
+--- 707,705,14 3 99 a62
+--- 687,692 3 100 a63
+--- 696,691 3 101 a64
+--- 689,692 3 102 a65
+--- 786,705,14 3 103 a66
+--- 787,705,14 3 104 a67
+--- 713,705,14 3 105 a68
+--- 791,705,14 3 106 a69
+--- 785,705,14 3 107 a70
+--- 791,705,14 3 108 a71
+--- 873,705,14 3 109 a72
+--- 761,692 3 110 a73
+--- 762,692 3 111 a74
+--- 762,692 3 112 a203
+--- 759,692 3 113 a75
+--- 759,692 3 114 a204
+--- 892,705 3 115 a76
+--- 892,692,14 3 116 a77
+--- 788,705,14 3 117 a78
+--- 784,705,14 3 118 a79
+--- 438,705,14 3 119 a81
+--- 138,692 3 120 a82
+--- 277,692 3 121 a83
+--- 415,692 3 122 a84
+--- 392,705 3 123 a97
+--- 392,705 3 124 a98
+--- 668,705 3 125 a99
+--- 668,705 3 126 a100
+--- 390,705,14 3 128 a89
+--- 390,705,14 3 129 a90
+--- 317,692 3 130 a93
+--- 317,692 3 131 a94
+--- 276,692 3 132 a91
+--- 276,692 3 133 a92
+--- 509,692 3 134 a205
+--- 509,692 3 135 a85
+--- 410,692 3 136 a206
+--- 410,692 3 137 a86
+--- 234,705,14 3 138 a87
+--- 234,705,14 3 139 a88
+--- 334,692 3 140 a95
+--- 334,692 3 141 a96
+--- 732,806,143 3 161 a101
+--- 544,706,14 3 162 a102
+--- 544,705,14 3 163 a103
+--- 910,651 3 164 a104
+--- 667,705,14 3 165 a106
+--- 760,705,14 3 166 a107
+--- 760,569 3 167 a108
+--- 776,705 3 168 a112
+--- 595,705,14 3 169 a111
+--- 694,705,14 3 170 a110
+--- 626,705 3 171 a109
+--- 788,705,14 3 172 a120
+--- 788,705,14 3 173 a121
+--- 788,705,14 3 174 a122
+--- 788,705,14 3 175 a123
+--- 788,705,14 3 176 a124
+--- 788,705,14 3 177 a125
+--- 788,705,14 3 178 a126
+--- 788,705,14 3 179 a127
+--- 788,705,14 3 180 a128
+--- 788,705,14 3 181 a129
+--- 788,705,14 3 182 a130
+--- 788,705,14 3 183 a131
+--- 788,705,14 3 184 a132
+--- 788,705,14 3 185 a133
+--- 788,705,14 3 186 a134
+--- 788,705,14 3 187 a135
+--- 788,705,14 3 188 a136
+--- 788,705,14 3 189 a137
+--- 788,705,14 3 190 a138
+--- 788,705,14 3 191 a139
+--- 788,705,14 3 192 a140
+--- 788,705,14 3 193 a141
+--- 788,705,14 3 194 a142
+--- 788,705,14 3 195 a143
+--- 788,705,14 3 196 a144
+--- 788,705,14 3 197 a145
+--- 788,705,14 3 198 a146
+--- 788,705,14 3 199 a147
+--- 788,705,14 3 200 a148
+--- 788,705,14 3 201 a149
+--- 788,705,14 3 202 a150
+--- 788,705,14 3 203 a151
+--- 788,705,14 3 204 a152
+--- 788,705,14 3 205 a153
+--- 788,705,14 3 206 a154
+--- 788,705,14 3 207 a155
+--- 788,705,14 3 208 a156
+--- 788,705,14 3 209 a157
+--- 788,705,14 3 210 a158
+--- 788,705,14 3 211 a159
+--- 894,634 3 212 a160
+--- 838,540 3 213 a161
+--- 1016,540 3 214 a163
+--- 458,820,127 3 215 a164
+--- 748,597 3 216 a196
+--- 924,552 3 217 a165
+--- 748,597 3 218 a192
+--- 918,526 3 219 a166
+--- 927,660 3 220 a167
+--- 928,562 3 221 a168
+--- 928,563 3 222 a169
+--- 834,537 3 223 a170
+--- 873,599 3 224 a171
+--- 828,588 3 225 a172
+--- 924,594 3 226 a173
+--- 924,594 3 227 a162
+--- 917,692 3 228 a174
+--- 930,608 3 229 a175
+--- 931,608 3 230 a176
+--- 463,791,99 3 231 a177
+--- 883,623 3 232 a178
+--- 836,648 3 233 a179
+--- 836,648 3 234 a193
+--- 867,591 3 235 a180
+--- 867,591 3 236 a199
+--- 696,648 3 237 a181
+--- 696,648 3 238 a200
+--- 874,619 3 239 a182
+--- 874,615 3 241 a201
+--- 760,692 3 242 a183
+--- 946,533 3 243 a184
+--- 771,655 3 244 a197
+--- 865,481 3 245 a185
+--- 771,655 3 246 a194
+--- 888,712,19 3 247 a198
+--- 967,568 3 248 a186
+--- 888,712,19 3 249 a195
+--- 831,579 3 250 a187
+--- 873,578 3 251 a188
+--- 927,542 3 252 a189
+--- 970,616 3 253 a190
+--- 918,593 3 254 a191
diff --git a/font/devps/ZDR b/font/devps/ZDR
new file mode 100644
index 0000000..a9ce980
--- /dev/null
+++ b/font/devps/ZDR
@@ -0,0 +1,222 @@
+# This file has been generated with GNU afmtodit (groff) version 1.20.1
+#
+# FullName ITC Zapf Dingbats Reverse
+# Version 002.000
+# FamilyName ITC Zapf Dingbats
+#
+# The original AFM file contains the following comments:
+#
+# Notice Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Zapf Dingbats is a registered trademark of International Typeface Corporation.
+# Comment Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.
+# Comment Creation Date: Thu May 1 15:14:13 1997
+# Comment UniqueID 43082
+# Comment VMusage 45775 55535
+
+name ZDR
+internalname ZapfDingbats-Reverse
+special
+spacewidth 278
+
+charset
+space 278 0 32 space
+--- 974,621 3 33 a1
+--- 961,611 3 34 a2
+--- 974,621 3 35 a202
+--- 980,692 3 36 a3
+--- 719,566 3 37 a4
+--- 789,705,14 3 38 a5
+--- 790,705,14 3 39 a119
+--- 791,705,13 3 40 a118
+--- 690,553 3 41 a117
+--- 960,568 3 42 a11
+lh 939,559 3 43 a12
+--- 549,705,11 3 44 a13
+--- 855,632 3 45 a14
+--- 911,642 3 46 a15
+--- 933,550 3 47 a16
+--- 911,642 3 48 a105
+--- 945,553 3 49 a17
+--- 974,587 3 50 a18
+--- 755,705,13 3 51 a19
+--- 846,705,14 3 52 a20
+--- 762,692 3 53 a21
+--- 761,692 3 54 a22
+--- 571,661,68,0,1 3 55 a23
+--- 677,705,13 3 56 a24
+--- 763,692 3 57 a25
+--- 760,692 3 58 a26
+--- 759,692 3 59 a27
+--- 754,692 3 60 a28
+--- 494,692 3 61 a6
+--- 552,692 3 62 a7
+--- 537,692 3 63 a8
+--- 577,596 3 64 a9
+--- 692,705,14 3 65 a10
+--- 786,705,14 3 66 a29
+--- 788,705,14 3 67 a30
+--- 788,705,14 3 68 a31
+--- 790,705,14 3 69 a32
+--- 793,705,13 3 70 a33
+--- 794,705,13 3 71 a34
+--- 816,705,14 3 72 a35
+--- 823,705,14 3 73 a36
+--- 789,705,14 3 74 a37
+--- 841,705,14 3 75 a38
+--- 823,705,14 3 76 a39
+--- 833,705,14 3 77 a40
+--- 816,705,13 3 78 a41
+--- 831,705,14 3 79 a42
+--- 923,705,14 3 80 a43
+--- 744,692 3 81 a44
+--- 723,692 3 82 a45
+--- 749,692 3 83 a46
+--- 790,705,14 3 84 a47
+--- 792,705,14 3 85 a48
+--- 695,706,14 3 86 a49
+--- 776,699,6 3 87 a50
+--- 768,699,7 3 88 a51
+--- 792,705,14 3 89 a52
+--- 759,692 3 90 a53
+--- 707,704,13 3 91 a54
+--- 708,705,14 3 92 a55
+--- 682,705,14 3 93 a56
+--- 701,705,14 3 94 a57
+--- 826,705,14 3 95 a58
+--- 815,705,14 3 96 a59
+--- 789,705,14 3 97 a60
+--- 789,705,14 3 98 a61
+--- 707,705,14 3 99 a62
+--- 687,692 3 100 a63
+--- 696,691 3 101 a64
+--- 689,692 3 102 a65
+--- 786,705,14 3 103 a66
+--- 787,705,14 3 104 a67
+--- 713,705,14 3 105 a68
+--- 791,705,14 3 106 a69
+--- 785,705,14 3 107 a70
+--- 791,705,14 3 108 a71
+--- 873,705,14 3 109 a72
+--- 761,692 3 110 a73
+--- 762,692 3 111 a74
+--- 762,692 3 112 a203
+--- 759,692 3 113 a75
+--- 759,692 3 114 a204
+--- 892,705 3 115 a76
+--- 892,692,14 3 116 a77
+--- 788,705,14 3 117 a78
+--- 784,705,14 3 118 a79
+--- 438,705,14 3 119 a81
+--- 138,692 3 120 a82
+--- 277,692 3 121 a83
+--- 415,692 3 122 a84
+--- 392,705 3 123 a97
+--- 392,705 3 124 a98
+--- 668,705 3 125 a99
+--- 668,705 3 126 a100
+--- 390,705,14 3 128 a89
+--- 390,705,14 3 129 a90
+--- 317,692 3 130 a93
+--- 317,692 3 131 a94
+--- 276,692 3 132 a91
+--- 276,692 3 133 a92
+--- 509,692 3 134 a205
+--- 509,692 3 135 a85
+--- 410,692 3 136 a206
+--- 410,692 3 137 a86
+--- 234,705,14 3 138 a87
+--- 234,705,14 3 139 a88
+--- 334,692 3 140 a95
+--- 334,692 3 141 a96
+--- 732,806,143 3 161 a101
+--- 544,706,14 3 162 a102
+--- 544,705,14 3 163 a103
+--- 910,651 3 164 a104
+--- 667,705,14 3 165 a106
+--- 760,705,14 3 166 a107
+--- 760,569 3 167 a108
+--- 776,705 3 168 a112
+--- 595,705,14 3 169 a111
+--- 694,705,14 3 170 a110
+--- 626,705 3 171 a109
+--- 788,705,14 3 172 a120
+--- 788,705,14 3 173 a121
+--- 788,705,14 3 174 a122
+--- 788,705,14 3 175 a123
+--- 788,705,14 3 176 a124
+--- 788,705,14 3 177 a125
+--- 788,705,14 3 178 a126
+--- 788,705,14 3 179 a127
+--- 788,705,14 3 180 a128
+--- 788,705,14 3 181 a129
+--- 788,705,14 3 182 a130
+--- 788,705,14 3 183 a131
+--- 788,705,14 3 184 a132
+--- 788,705,14 3 185 a133
+--- 788,705,14 3 186 a134
+--- 788,705,14 3 187 a135
+--- 788,705,14 3 188 a136
+--- 788,705,14 3 189 a137
+--- 788,705,14 3 190 a138
+--- 788,705,14 3 191 a139
+--- 788,705,14 3 192 a140
+--- 788,705,14 3 193 a141
+--- 788,705,14 3 194 a142
+--- 788,705,14 3 195 a143
+--- 788,705,14 3 196 a144
+--- 788,705,14 3 197 a145
+--- 788,705,14 3 198 a146
+--- 788,705,14 3 199 a147
+--- 788,705,14 3 200 a148
+--- 788,705,14 3 201 a149
+--- 788,705,14 3 202 a150
+--- 788,705,14 3 203 a151
+--- 788,705,14 3 204 a152
+--- 788,705,14 3 205 a153
+--- 788,705,14 3 206 a154
+--- 788,705,14 3 207 a155
+--- 788,705,14 3 208 a156
+--- 788,705,14 3 209 a157
+--- 788,705,14 3 210 a158
+--- 788,705,14 3 211 a159
+--- 894,634 3 212 a160
+--- 838,540 3 213 a161
+--- 1016,540 3 214 a163
+--- 458,820,127 3 215 a164
+--- 748,597 3 216 a196
+--- 924,552 3 217 a165
+--- 748,597 3 218 a192
+--- 918,526 3 219 a166
+--- 927,660 3 220 a167
+--- 928,562 3 221 a168
+--- 928,563 3 222 a169
+--- 834,537 3 223 a170
+--- 873,599 3 224 a171
+--- 828,588 3 225 a172
+--- 924,594 3 226 a173
+--- 924,594 3 227 a162
+--- 917,692 3 228 a174
+--- 930,608 3 229 a175
+--- 931,608 3 230 a176
+--- 463,791,99 3 231 a177
+--- 883,623 3 232 a178
+--- 836,648 3 233 a179
+--- 836,648 3 234 a193
+--- 867,591 3 235 a180
+--- 867,591 3 236 a199
+--- 696,648 3 237 a181
+--- 696,648 3 238 a200
+--- 874,619 3 239 a182
+--- 874,615 3 241 a201
+--- 760,692 3 242 a183
+--- 946,533 3 243 a184
+--- 771,655 3 244 a197
+--- 865,481 3 245 a185
+--- 771,655 3 246 a194
+--- 888,712,19 3 247 a198
+--- 967,568 3 248 a186
+--- 888,712,19 3 249 a195
+--- 831,579 3 250 a187
+--- 873,578 3 251 a188
+--- 927,542 3 252 a189
+--- 970,616 3 253 a190
+--- 918,593 3 254 a191
diff --git a/font/devps/devps.am b/font/devps/devps.am
new file mode 100644
index 0000000..2664f3c
--- /dev/null
+++ b/font/devps/devps.am
@@ -0,0 +1,193 @@
+# Copyright (C) 2014-2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+devps_srcdir = $(top_srcdir)/font/devps
+devps_builddir = $(top_builddir)/font/devps
+DEVPSFONTFILES = \
+ font/devps/S \
+ font/devps/SS \
+ font/devps/ZD \
+ font/devps/ZDR \
+ font/devps/ZCMI \
+ font/devps/AB \
+ font/devps/ABI \
+ font/devps/AI \
+ font/devps/AR \
+ font/devps/BMB \
+ font/devps/BMBI \
+ font/devps/BMI \
+ font/devps/BMR \
+ font/devps/CB \
+ font/devps/CBI \
+ font/devps/CI \
+ font/devps/CR \
+ font/devps/HB \
+ font/devps/HBI \
+ font/devps/HI \
+ font/devps/HR \
+ font/devps/HNB \
+ font/devps/HNBI \
+ font/devps/HNI \
+ font/devps/HNR \
+ font/devps/NB \
+ font/devps/NBI \
+ font/devps/NI \
+ font/devps/NR \
+ font/devps/PB \
+ font/devps/PBI \
+ font/devps/PI \
+ font/devps/PR \
+ font/devps/TB \
+ font/devps/TBI \
+ font/devps/TI \
+ font/devps/TR \
+ font/devps/EURO \
+ font/devps/freeeuro.afm \
+ font/devps/symbolsl.afm \
+ font/devps/text.enc \
+ font/devps/zapfdr.afm \
+ font/devps/download
+
+DEVPSFONTFILES_GENERATED = \
+ font/devps/DESC \
+ font/devps/prologue \
+ font/devps/freeeuro.pfa \
+ font/devps/zapfdr.pfa \
+ font/devps/symbolsl.pfa
+devpsfontdir = $(fontdir)/devps
+dist_devpsfont_DATA = $(DEVPSFONTFILES)
+nodist_devpsfont_DATA = $(DEVPSFONTFILES_GENERATED)
+
+# these files will be installed in oldfontdir
+OLDDEVPSFONTFILES = \
+ font/devps/old/S \
+ font/devps/old/SS \
+ font/devps/old/CB \
+ font/devps/old/CBI \
+ font/devps/old/CI \
+ font/devps/old/CR \
+ font/devps/old/HB \
+ font/devps/old/HBI \
+ font/devps/old/HI \
+ font/devps/old/HR \
+ font/devps/old/HNB \
+ font/devps/old/HNBI \
+ font/devps/old/HNI \
+ font/devps/old/HNR \
+ font/devps/old/NB \
+ font/devps/old/NBI \
+ font/devps/old/NI \
+ font/devps/old/NR \
+ font/devps/old/PB \
+ font/devps/old/PBI \
+ font/devps/old/PI \
+ font/devps/old/PR \
+ font/devps/old/TB \
+ font/devps/old/TBI \
+ font/devps/old/TI \
+ font/devps/old/TR \
+ font/devps/old/symbol.afm \
+ font/devps/old/symbolsl.afm \
+ font/devps/old/zapfdr.afm \
+ font/devps/old/zapfdr.ps
+olddevpsfontdir = $(oldfontdir)/devps
+dist_olddevpsfont_DATA = $(OLDDEVPSFONTFILES)
+
+# Files installed in $(devfontdir)/generate
+DEVPSGENFILES = \
+ font/devps/generate/Makefile \
+ font/devps/generate/dingbats.map \
+ font/devps/generate/dingbats-reversed.map \
+ font/devps/generate/slanted-symbol.map \
+ font/devps/generate/symbol.map \
+ font/devps/generate/symbolchars \
+ font/devps/generate/text.map
+DEVPSGENSCRIPTS = \
+ font/devps/generate/afmname \
+ font/devps/generate/symbol.sed
+devpsgendir = $(devpsfontdir)/generate
+dist_devpsgen_DATA = $(DEVPSGENFILES) $(DEVPSGENSCRIPTS)
+
+MOSTLYCLEANFILES += $(DEVPSFONTFILES_GENERATED)
+EXTRA_DIST += \
+ font/devps/DESC.in \
+ font/devps/prologue.ps \
+ font/devps/psstrip.sed \
+ font/devps/freeeuro.ps \
+ font/devps/symbol.afm \
+ font/devps/symbolsl.afm \
+ font/devps/symbolsl.ps \
+ font/devps/zapfdr.afm \
+ font/devps/zapfdr.ps \
+ font/devps/generate/freeeuro.sfd \
+ font/devps/generate/make-zapfdr \
+ font/devps/generate/symbolsl.awk \
+ font/devps/generate/sfdtopfa.pe \
+ font/devps/generate/zapfdr.sed
+
+font/devps/DESC: $(devps_srcdir)/DESC.in
+ $(AM_V_GEN)$(MKDIR_P) font/devps \
+ && cat $(devps_srcdir)/DESC.in >$@.tmp \
+ && echo broken $(BROKEN_SPOOLER_FLAGS) >>$@.tmp \
+ && if test "$(PAGE)" = A4; then \
+ echo "papersize a4" >>$@.tmp; \
+ else \
+ echo "papersize letter" >>$@.tmp; \
+ fi \
+ && (test -z '$(PSPRINT)' \
+ || echo print '$(PSPRINT)' >>$@.tmp)
+ $(AM_V_at)mv $@.tmp $@
+
+# PostScript documents to be produced by troff should depend on this
+# stamp file to ensure that grops's device and font description files
+# are available.
+MOSTLYCLEANFILES += font/devps/stamp
+font/devps/stamp: font/devps/DESC \
+ $(DEVPSFONTFILES) $(DEVPSFONTFILES_GENERATED)
+ $(AM_V_at)>$@
+
+maintainer-font-descriptions: devps_font-descriptions
+# This target generates font descriptions from installed Type 1 AFM
+# files; these are _not_ normally generated during a build, but provided
+# with the groff source distribution.
+#
+# We add top_builddir to the PATH in case the only afmtodit available is
+# the one in the current build.
+#
+# The AFM files from which these descriptions are produced must be
+# obtained elsewhere, so this target runs only in "maintainer mode".
+devps_font-descriptions: afmtodit font/devps/DESC
+ PATH=$(top_builddir)$(GROFF_PATH_SEPARATOR)$(PATH) \
+ $(MAKE) -f $(devps_srcdir)/generate/Makefile \
+ srcdir=$(devps_srcdir)/generate DESC=$(devps_srcdir)/DESC.in
+
+font/devps/prologue: $(devps_srcdir)/prologue.ps
+ $(AM_V_GEN)$(MKDIR_P) font/devps \
+ && $(RM) $@ \
+ && sed -f $(devps_srcdir)/psstrip.sed $? >$@
+
+.ps.pfa:
+ $(AM_V_GEN)$(MKDIR_P) font/devps \
+ && $(RM) $@ \
+ && sed -f $(devps_srcdir)/psstrip.sed $? >$@
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/font/devps/download b/font/devps/download
new file mode 100644
index 0000000..3f77716
--- /dev/null
+++ b/font/devps/download
@@ -0,0 +1,6 @@
+# List of downloadable fonts
+# PostScript-name Filename
+
+Symbol-Slanted symbolsl.pfa
+ZapfDingbats-Reverse zapfdr.pfa
+FreeEuro freeeuro.pfa
diff --git a/font/devps/freeeuro.afm b/font/devps/freeeuro.afm
new file mode 100644
index 0000000..7a8c9ff
--- /dev/null
+++ b/font/devps/freeeuro.afm
@@ -0,0 +1,34 @@
+StartFontMetrics 2.0
+Comment Generated by FontForge 20060105
+Comment Creation Date: Sun Jan 8 10:14:22 2006
+FontName FreeEuro
+FullName FreeEuro
+FamilyName FreeEuro
+Weight Medium
+Notice (Created by Werner Lemberg with PfaEdit 1.0 (http://pfaedit.sf.net); the serif shapes are based on the Omega fonts created by Yannis Haralambous.)
+ItalicAngle 0
+IsFixedPitch false
+UnderlinePosition -100
+UnderlineThickness 50
+Version 001.001
+EncodingScheme FontSpecific
+FontBBox 4 -23 903 710
+StartCharMetrics 16
+C 0 ; WX 750 ; N Euro.symbol ; B 32 -12 718 685 ;
+C 1 ; WX 750 ; N Euro.symbol.bold ; B 26 -12 724 685 ;
+C 2 ; WX 750 ; N Euro.symbol.slanted ; B 85 -12 842 685 ;
+C 3 ; WX 750 ; N Euro.symbol.bold.slanted ; B 73 -12 850 685 ;
+C 4 ; WX 741 ; N Euro.serif ; B 34 -14 707 676 ;
+C 5 ; WX 800 ; N Euro.serif.bold ; B 45 -19 767 691 ;
+C 6 ; WX 734 ; N Euro.serif.italic ; B 66 -18 745 666 ;
+C 7 ; WX 800 ; N Euro.serif.bold.italic ; B 17 -19 808 691 ;
+C 8 ; WX 756 ; N Euro.sansserif ; B 38 -23 731 709 ;
+C 9 ; WX 796 ; N Euro.sansserif.bold ; B 36 -22 763 710 ;
+C 10 ; WX 756 ; N Euro.sansserif.slanted ; B 86 -23 862 709 ;
+C 11 ; WX 796 ; N Euro.sansserif.bold.slanted ; B 82 -22 903 710 ;
+C 12 ; WX 600 ; N Euro.mono ; B 11 -16 534 576 ;
+C 13 ; WX 600 ; N Euro.mono.bold ; B 4 -14 539 597 ;
+C 14 ; WX 600 ; N Euro.mono.slanted ; B 61 -16 631 576 ;
+C 15 ; WX 600 ; N Euro.mono.bold.slanted ; B 54 -14 643 597 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/font/devps/freeeuro.ps b/font/devps/freeeuro.ps
new file mode 100644
index 0000000..1a7c433
--- /dev/null
+++ b/font/devps/freeeuro.ps
@@ -0,0 +1,321 @@
+%!PS-AdobeFont-1.0: FreeEuro 001.001
+%%Title: FreeEuro
+%Version: 001.001
+%%CreationDate: Sun Jan 8 10:14:22 2006
+%%Creator: root
+%Copyright: Created by Werner Lemberg with PfaEdit 1.0
+%Copyright: (http://pfaedit.sf.net); the serif shapes are based on the
+%Copyright: Omega fonts created by Yannis Haralambous.
+% Generated by FontForge 20060105 (http://fontforge.sf.net/)
+%%EndComments
+
+FontDirectory/FreeEuro known{/FreeEuro findfont dup/UniqueID known{dup
+/UniqueID get 4166882 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /FreeEuro def
+/FontBBox {4 -23 903 710 }readonly def
+/UniqueID 4166882 def
+/PaintType 0 def
+/FontInfo 10 dict dup begin
+ /version (001.001) readonly def
+ /Notice (Created by Werner Lemberg with PfaEdit 1.0 \050http://pfaedit.sf.net\051; the serif shapes are based on the Omega fonts created by Yannis Haralambous.) readonly def
+ /FullName (FreeEuro) readonly def
+ /FamilyName (FreeEuro) readonly def
+ /Weight (Medium) readonly def
+ /FSType 12 def
+ /ItalicAngle 0 def
+ /isFixedPitch false def
+ /UnderlinePosition -100 def
+ /UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+ 0 1 255 { 1 index exch /.notdef put} for
+dup 0/Euro.symbol put
+dup 1/Euro.symbol.bold put
+dup 2/Euro.symbol.slanted put
+dup 3/Euro.symbol.bold.slanted put
+dup 4/Euro.serif put
+dup 5/Euro.serif.bold put
+dup 6/Euro.serif.italic put
+dup 7/Euro.serif.bold.italic put
+dup 8/Euro.sansserif put
+dup 9/Euro.sansserif.bold put
+dup 10/Euro.sansserif.slanted put
+dup 11/Euro.sansserif.bold.slanted put
+dup 12/Euro.mono put
+dup 13/Euro.mono.bold put
+dup 14/Euro.mono.slanted put
+dup 15/Euro.mono.bold.slanted put
+readonly def
+currentdict end
+currentfile eexec
+743F8413F3636CA85A9FFEFB50B4BB27302A5A63F932884E18BF5153AD36053037D1C6CD
+04294AF6A35612DB9108AC8514CB5C4A8469971B75A09F9E662068B0685490EA8C73F2DE
+2FBBCF85D15AB9385E529DAB15A40D408002E88D0C107F711BC66BF0F2E92FDDC6B188F9
+1EEB6B86050D5032E6ABCB11E343C6D795217B5973972E99A9420651ACF3B8FD4CAD1DA4
+B00642AD077A5B86240F89F2BC011009CB2CF173FF68E9A88F0018F187D5E036FE8D904F
+211842FF01AA7CAADDEB9E5A534FA3F90BDB8F6FFE24F7AC6E7BD0A74CF29EBBA51871F0
+D1FF3262EA3CAFF583545FAB762B8D9BF14C8845C4EDB387B1248A4BCCB70AEDC6C67CF6
+C4648FA00124C44166D66DE1573C926CD9C6AE4F8B89E5987035D23195432204B648D458
+39F1769201B7C68828B3E49DFEF3065D705C2EBFFFB05B8A865CE4888872146C99671EFA
+EE1F514B94B86A47AAA5F21A39786E77D443FA4CF8B525C98FC02459528C08410C679440
+CC3A160C40B14E03FAB3E267943E1FBACDD4C082777B31AD3591DAEA25DC60E0EE11AB59
+52C58879FCB35A54009A156730AF209A8D4F00CF7DD9870C8DC3E48C19BED68742376268
+0408FFD4A34A0D8659D44FADC9FC9D3084601C93FD9FCA770B1191500ECB12C8DBDB2032
+007CECE3C6A2CC8593386DC1464B94A09EA2A83438C71ACC7CAD72D074ABF6FB98EFC81B
+6A3D672D2DCC637F34ACF18D469ED29FE2C49062380E6A32850F696834FC8E46A924164A
+C64DF8F848D4D000EB6FD06A44D0320975A8EEE85173E4D7E39EC9DB03A8ED20DAED86D2
+73CE5762A5D35D1A81987F9CD9921E39C2C5CEDD661C3B3EE86B703C101C410E41648347
+7599C4CCB91234510ABAC16898D9D10E30B5FC1BABE78DF2A009E09E52816F2413899184
+AB8F942A496B56C9FDE630B13AD9F0996ADE29CABAF1443452B427A2280AD00B85F4657C
+65B47E929FB0A2A31F257B24FE4ECBAFC878C306094088E00DB2DA6D36CECE30971846B6
+39DA9BA989109507FF21FD7198736278ED1CD021BFE7689D93B425D8B6CCCF07D37C22D7
+966FB87EFBE8F6A86D4F0C4BD38F5F3A41DCEDA924FD5F0D8FF089A0F44DFD37498507D3
+2A383FC717537744CC6868EB913D5C08CD0A3F935145FD5D811F01870F6136F4EFF757C5
+D03E73FC22F88624116C08C225C1711C96A01656999AAF7414163E75548AB89F8AA85F20
+9FA6EC242ECDA0953DC61EAE4107610380DFE2807101BDBA51391685990B3D1FFEFEC97E
+0F0DE04283920370575AC06B8597EE756EEF7A3543A3E5F1B74343702A201C43411E7B76
+DC6422E2529E740A6BC6BD44ABAACD955406734AF0852471CC7B49325286AFFD2F9CFD04
+BB9CA4D0F6F0494CED1D2984E2C607FD2CE5C5A1F538CF9107771E691FAD51AE5DA70748
+F14F2FF7CE61292F6FA50D4510E4100360A4A2EBF7F9A03F7A4DAC981C6DE582BAFEBC23
+AD97EB56656A218B24D47C4345B398C14ECF5B76037D83FEB71E65F89C01133A5228496C
+DF4BCC8BD4C615C9725511A2376A01C80F1EF38757CF104DD0809121EF1A2B9F11B5BDC7
+8E4F5A1463F37E952891370E1887644D26751A261FB5EE78BEA745F4F44A9B00098EDC4E
+3547F5AE50DCBF29EF5BF82D653A148D340BC600EB411F4EA8A6A2D0B548D0B217E78943
+BDAED70072716A4406D685B55C2C0F490D2B472C49B278DB78E9914C3623825E595A541F
+509F0E7BB1A827F4E6B0EA42C668932AB48D7B4A21AC0DA7451924D1AA7CDBE80C94F109
+1A4D91C3B908060FEB07D1B454A4CE4A60F8FACA6930313E09D5F11D1D8437E6B65EEE5B
+B5570C3B66ABC491BD8CF63C2C62BC7B38A0CDFFE9D75627E6D3B23B608C7EEBD8FC655C
+D197D28E8EB319814EA71B6AD63A966DB61D9C3C7D788683559C49338D037A235FD56FA0
+059DDC6017F0919926C323327C204139F07810575A8749877FB2C0C53AF4E3962613A0E8
+7D7C37A9974105992FC6B754CF23017C2E5851BCC90F48D6847EF1EF59E42032AFE03A98
+DB363827CA07E337A5852BE832772A2981864B8C1EDAD8759ACBC132ADD0BB360F40BAFD
+FC7E5D32D724CF82FD3342D431F8F4CD9BDE2B07C8D8EED411E3A5889A8163CD1E2C2786
+F78AD3C1D9879FD6E93BD1FD8949DE47A8BCD219422B2F1316950B72E1E5170701795A0A
+80709E894C218AA64DF5684719830066B995785AB9F1603FFDCEA945FEC09F57BF886F01
+A95811C7D4200E11C7CB373AAA4301E58F74E77519E11A89751A338B38D115B365547271
+DB19E51B85B30D1EB8E3E0B95436262D52471D65BBCF5DD94F6FF1210BF09628191F8F04
+3ED7109DE2AD284954564A1C80811B9AF1686DB799D36B50EB095AF37B9117992BB6B8F9
+0CE43ED10F9D0CE4B8ED76549239A626809ECA3D5A90E23D3CFBC776D6D816A293F2A80B
+7267D1842FA102BAD77A2A775CB55473F40D3976AFC77ECDA131FF663A12795528A7EC15
+1D7854E759321709A8F4750716C949D71D332F9B0B80130916826F07E0165A5A1C5F3D8E
+EF8CDB4EE3F688867FDDD47B4D67AD677F3134D90E07A1F0A8690169AC2E176BCB7CF260
+A70E374F3EC834E3B83D19CE3A52883024D2976E8E02C0B320CFD7B8BF66D11FBBF49353
+647AC4AB23A2A5689506AB83AD60AF8783E04815CABE60A3243FC633FD12D6DA50036691
+D3A0FBD4AD1309289565FC0C449510AD58085356AD829538B97A501FA73CEB693F09D551
+8FEAE6DE59FD7871AAED96A27127286C09FDD5A1EAE421CC38F56A4AF6AD5FA9BF96BF00
+2BE0A49BE6F27636DEB364A0762BCFF054020850C9222940B0E8A08E6A77240E1A0F42DC
+07DAD0283BCD9DAC20E2A7542F5D74FC90D2661AD95350566F27125160C0525364D8B764
+E06FBC0F85531185F8B92B4ADE928B2CF0DD4736CAA76F6659D128E416E9792F24CB6B41
+CF369FF2BF9C360FA006938067DA606B2B19C8599FB28306FDACBF29841A169F6368384E
+32B6BAD4179E345AB2B3CAB35E29E154228DCDC3D4C3317295A050A8AA86273BF7178A07
+65B598EE7061AE13B11B670F2E5F90F9FDD2F09A84F247DF9C90698A44A29BEC87B3C606
+E46A35D94986363CFEB26524FD7FB88092978128B0D246934D93BF90CDD94F7D243113C0
+8BDD1E09E4AC9F6E7A5A4FDB89150632CA41E3320D6B5AC722B27984D238D29A20F69BFD
+1AB94BFA39EE52371CBEC64E16E37319ED189F2CC3992EC03A780AE4AFAEAC4FFB7A8340
+36F307F1BAB17477BF14809DA90E0AFBD0E3182D7E40A1EB1AABA8C64D9CA02044E85A82
+7FDB6C215F77FADC0443A04083E23DF21523DE178DF165F369E93AD21F34B4D72C24D5F4
+D6D19BE8F5B01AFCBBEC537C509FD7B388AA66A3E4CBCAA85601C20BEBBD2D3F11CE1CBC
+E7D8FA53FA83710A80D8795AA5FF3C2E7F063DC05DC002E8278DCC1FAF9909FFE55A633D
+86BE4C570BD9820327490CA61CA4FDDE381CDF70D97FF279F6A458E5D7B8DE5E1384F894
+3064F4F17D369F014D5A68C9F2E170BB59634AF060678CB4DC84450B94E34CA704B5DCE3
+67125FEE35A1B0A27F40E38D00CB779ACB34284080D5D78E30DE6233F0AD3FC22D170A60
+E2B7D4F206862D1890D16E3C9D720CCA05930814E00337AD8607098C68CBEB919504277D
+B3AB769CD77745B375945BC4246B813F828099DAB82512936FE106B368F189ACE1A2EAE1
+4CF5FE1C91BD0D79CE179D34A0E85F8F1BFDEF9F28C1F26924D630E845CAA19BADC44B7B
+ED9C6452C0AD01D108967D85E0779AEE557A9207164D22DFF7BCCE92D5CB9809ADFD332F
+9567C92510CFC94796AA5A312C4484183B66C44DED8476F974CE6FEBFE86178B99F1820B
+07B3D7C80F5CCCAE591BD8920814B4398A502756D3C945D07C6CD9FC2414086434151E87
+30C14D38764C532BDD5830E24C16BFF8CC19181621DD26E67259711E6CC43ED8AAE343B4
+B728BFD242C6C314B3D453DD3B3BC3986E736B4085C8D7498C9778538AC0F2DE17B9F89A
+60082B571BE433119A9522F93A4C1222A26F94A199D71F50FA5BA94CDA733E26A43A3002
+564A841FCCC267EF8F1556CF85C8AF4A649F0AC533E0E859E3E2723525FCEC1B6E6A3CE9
+0B66D585B1E7C4B953ECF941B12D3003FE14852B7978126BE4B58DF8924651697B79F333
+F2D5BC34458DFD36826F8DFD374D0D59DD01FFC2C455B1A12AC80380F48A742013D0C3D9
+C7E040364633F0476D1ECE1870386871CE95099A30F881EBE00F6E140FE58F8C1D5F2B37
+35D12A9FF60157F8691DD64E60EF9B957C586D4E2E9D5474634F7AA44D50B11B001C66CC
+F283185C6E65E32D2F2B8127B986CF62455067A5E621738C8A381D2B6A033F6C389BE878
+3179A54AD38D69223AD779A159B2D7D0AD1670A03171EB4C27930E1878037813CBC46214
+7486F3B8E9F7016C9E2E4C60B03A4C976D48EE3A20131AA00F4B79707FD801B3F7A7759A
+3AFF3F6CEE749F2B32B01A582DC408384B8749307794914EAF7A0300E1C9AEF42DFFD828
+C5EE7D9730CE489F0A98C81E166B2B1EED3BCFACC370709947CFD29DEAD86C58FCF6AEA4
+8D670583BCA7018853B781340D7F4D1F2FA5703EDA8F1815F74407B4617016AD9BDF1F49
+340E7D89AF7CB5818B996201512968AA2B3D71C468C69DB46E514EC3CCBA360B3E80972D
+86145148DC0BDD4ADDDFDC7D835DAAC0AA9B96DDD91973288B3A2A28BD6BB415C2A79818
+7F58F3402DA53B0600FA53A01AEEBCE5081BCC0645348BD1772C54A608E88499CE0103EA
+C4ABC7FD74256C4F16A977BDF7F13843BFC6CCF16092740D9C1E7561EFD4EC6A3A30460E
+A434D1921727FA26D9F56627DCD6AF95951E602936C4AC6C7A6F6DFEF2C0CE0571458B27
+BB31DA11C9E09DD3917F61140EFC4F059AC2FAC839BDDC0695B293C42BD17B1895A6B2B2
+F955821C5CE356B1AA33C5F361BB0F43828A20B9F193E71E057F45B6CC8ABE53EEFF801F
+2B6CFB31B6DEB5D84EB8525B938AC424B3486DEA14982E5CF7F2D2C92F2D9B28033DE0C3
+4B610505771E0B1BE6AF03552EB8B44EC1190DAEB15DAAF21E7F2D437780484F0535D8ED
+941A8FA13D379B911FC7AC99E4657DABD37891C467E8854DEAD2E34E05962F0EEC30B5D4
+B8FA6EBA42C102564A2FCDF679AFB7FC145C98EDCC81BF33DCFEB593CF8E7C2F6E9E22B7
+8B1DEE3B75C0E87AB95C6341A1D09948BF338B682F515D89230F8CDBFC72D56A00003EAD
+F5BC0A6CC1A802A80480D6CEBA34631C7892909E049473E8328295069C0845571ECC9980
+CD8BCEB4C930C06601BFBE690FA0BB34631C7FF64D91A31BDF9035EC6E44EA12A79DF384
+FD82092DEAFB2D2E1B0C8ED903BCA55382F98FA5346ACC20900D86E64FF528C604D6815E
+3DEFC5F71EBBBAC2B5787B2F25AE820AFDD4038CD58B0F1710C1EEC7DA521071DCCFB9BF
+24C9EA1049EF59E61D20BFD50BCB5D8CBD0DC266B8836F34EB94858A54CE0C9E6088188A
+EDE0BE39FAFE697AA6C8805CAD63DEE8A0CA226C91405DE5FE7FE8820124D6D79EA5F956
+8C5CBFEA24C4F3D601428329453F226C4C3E3E429E429C2E96DF25EE1DD7B5B12B2C1DA7
+CB0EE6EB0D018C2DD437A6883D2C2E57B9CB264CD3369C20AB831CDDAC5F57E550727C0B
+CC9715B2C87C26C0A9A6A2F173C7B03F12F993B217466E7896E4764C6AF20CDF0634205F
+3E38E6C8C6DE3A4269C5C6CF03E49D60F0E2F3D7B3ED302C3BDA4EC6332867A19C9CE8FD
+6E2D0F2C597E11896A3E6EDC4B616F76B3355DFBF26DB2199963252C93AE423F1AE6683F
+115E9B68672BFF4C9134EED4C51AE587CC859F742A283F3C9B6088B0B9E65A1EA521578A
+E67D7396907129B83C1C9E2302D5FF46FCBF408E0FA69AA8F6E7193AE9E9DD5254201317
+B3D304BDCA689B683568BCAD9539C4D6BDA50814D8F251A70E76E7A5EECF719DD1655DA0
+605D9EFC940A8CF0FDEBC7146DE12F108959280903C34C69DC92F8205F2EE1D52F483AA7
+7E02F277A1186849056036CB24AB238AF08C903C4CEB4851991C24A8158EAE8D8F3BE56C
+355FC26D7BBD2849B7ED9E1A25DFE98BC62A6797615BCE59DEAAFD5B6D08298E2DDAA611
+3DE60AB83FF7687B7ADD6706822270ECA925B559F2F9EC59C9AB0F365868DEC3122EE67F
+BAFE7EBFACEC14D4D40C55F94ABBE8CE82CEA67FC1415D127786071CC06DCB653CCDED0B
+40A9D49994865CF45BA494AC11543A0546DC37417BD01DB100273EE3F0E7D12093E50FD0
+E71B9A0326E8F35FCD86B3285781008ED03FCA1850D685CA5B62518C9194A0C7E8CFD5A9
+FF6A0EF508ADBCEDAB7C7144272F8C7DB274CE7AA09CFABCCA3E6967EF259A72C3B8F4FD
+4605CBB99CE88B679F3EC9486C442B05D776B9D7FA8C04203DBDF33C0CF45B15E68C9376
+168229CC5176BC1E9707853192BD0C394E2D8880050594675F5B83488026791AEB1E6D79
+A424B8F90149F4855EF1BDF6CF0137D459D2A22DA3FF00743B52B2F9C316262EE53AE760
+43E2F267C2598CE66CFEAEF1459C307CA9B3FD8E897C93426545B80834EA16764633B2C5
+5B31557E6B5398F17D0BE5CC1348FE71014EF3BA2F917589AE4A4C9D8EF22A6D0A288557
+C4B2F2ABF2C30E778A5F21AA16BDD04CD8433514FBC7F81583F5D9CE3DE38542DCA55FFC
+9142EB3B797946A7A121C134C82DAED820D3FF0E7053B40134353012A44B15506385533D
+0702662BC8545130B7717B5E99BDC18E8473D2920C80CAD8F61D352C2B3718567B0BDFDF
+F063D2E1A568D6B17412149E4C9AFE3FD3F8186A8274FC01CA07504BE6751A7BDE74719E
+970A9F1744917E3521C4988E547EC1B63D33AD86390DB6CDBA9436884CEAA6064E383B61
+68BD405523A23D32B571E534354E1BD4EA3EDB7D1BBF2D0F6D6B36993DB0DF94C18BEBE2
+6F4B6475306784C091E139A759F627843CED43666D95AE257E650DDA0F6C0458CF27885F
+25D59FE5601777ADCCB42ABC20F960B17A2669B4277AEE51A3D33BB1914FC5985236A6E0
+0C32956A1CAB55DD020DAFA2BAE36638E5F5866AEAB8E3439EFEA9266CB28B9DBA4B1746
+046A71E3BF05F37FF84CEFD66479640C3BB43D915BFA3AF6F3916F2AAAE39DD4317563C2
+26E361EE278E9FE076EE6B4733720C53918CA5CC9C5F4C6C7A36D8E49A591074AEFF0363
+09E5834A3978ACEB9016F116D20B6854BC59484F344D069768C6DFC503EB95C9FEA0521B
+FD6E1C99FCD1268D18C1DD428C66DE9145071190FB17464C8C4FE87D9C0F3DA5FC3E933D
+7375E88DC3BA96858D671A6616F52E70EC6B5795114C3F03F8C78CC388AC01866B347196
+40705C2EA04CC1369A88B3A242FFCB32B48024742A03C94A6E715EF09F06CC999CA1E593
+AB6013B7E25685C4FA93429EE0613E3DA07C94D82B9A739B954BD6EA1E2A9DE55461211B
+4FBCCFF6BD480C845DC4B075B33551C760FE3D8F5EDB1201269AF48C8F8E96AFB5C7F767
+20AD3F9BDB225AF317770F1C2644589EDB5639376E30DB053930511FEE7C9FF81F6B76ED
+57E4C6CF157AF5EE0D8E05F0B9F1276385B3C4EF779593B0120AAE0073880C0DE6F76906
+8B96E92133050EF7BA0A6585AB37880501F42477E0AB8A5D314F7A5A1B760142A42A40F2
+2A12F0F79C747F8C57C688C5937BCCF9B217647EA1D7C16936055814F9260C647045F3C8
+997D40B7BB690B654B9F243D2FC9343C7BAEC4F79AC5CA9C8A43E414B4BC6A6B02828CC2
+1432BBC6E49EAB7DAE35926C6B0BFBC6AC3831834CF54A732E8531AC7D0A3AF62A5FF8F2
+4B59EF71698824E2AC5E4DC2D5C58B9FFA80817C4DA7638CE5B6F0F33164FCCDA6F82933
+AE42A26BA9AA939A7DBD55F35C29BB9D192251E945D9890F48F63D7BB58269031899F7D5
+A52C1747CBEE945D55154AD30301FCC6345DF34A177E9CAB110D7A52B63B131A1F7D7165
+BB5AC4B1842B9A1F3D86F521E4107B40963BB34CC61B10F79D936736DEAC7F25BBDEC228
+E7838F1032154ADF35F333077483AFCDD50410C07707A47F9306BF794A15B5452EEB34FA
+48A8C1BAA627EBB16BEBE9369AE7D100CF8D14E5B70613C8C8A53CA82495E8BAE8990ABE
+0ACC0B2E9CC44191A50417657662385821B1C897C88AB2A0B149090CE11B940AC6DDB64D
+0BF745858A1A56F811F1DE81458F50A704EA30F5F1918D9B5481E6E4681B389C447A65E3
+56A12C8592C8709C09135B06994590DD0B87D2952C871EF0B7365D04928A7B19AB3A10EF
+40B0BA1DAB4D3DC5789EBDB23E98698963FBD74DAAB6C8885A88634E9857CBCB163B1D0E
+32DF259DFEF7217D6744CC6F34E0D96C7BC93CC0A19F4EFBDAB6338CB56B46E538EE92B4
+353AA6663AC42A2EF78E4A228886577678FF36E5ED221A807E009D33A737F89F80461FA5
+5741EEF636D19FAD5870AF6F436DFCEA130C102156F134F77DFE4933628DBE64B477555D
+81CE6131866AA5712347043CF70634F92D5B984445D32A545607B62BA1C12D37FB6B17F3
+84838E274818032AD7A07CDF1F504B3CB5C5C9D8D16342CAB18697A5821B2E219D14F15C
+AAFB33A44E4E6D18C4DC64F79DDCBF2BFF7B3FE05709420DBBC24B8C23822755062B9784
+69AF6B01CDC9C45E55A71BC5BE1EDFDC23C430D61FF776BB4B2AB69BD391758462A9700E
+21B81CE478207D443C5A868946969DA1E63AA939D3563605C83C2AB2C5E7551169F466D7
+41FDCEE57EEE7897C41F0409AB61E86C947C83850C23DE579ED1A7EF7F941522F41337A7
+F2FF06D4D5CC4A9436A2CEB91B1D9218F46BCC3A1A5C57539BD6A56C6755A8ADD89884F1
+2FF46C13248D02EACB04008BCE1CCC3DA9CB7D4EF0AF02A97734C95D8C45CC360AAA467E
+97858E0B66978BB46353E9C0A653E49CC1E63C119FA50441846E5AE38D551BDF3A7CBD2B
+8E51C2C088A617B68E21DD2F44EF5033CD252A75C80F16F6C45EBC84E17FA58F8DA6800B
+8F61B060F54124F1B1F12AE75059159AF036C25DD06F4EEF5D8048079AC6CCB1BD5DA270
+005EC1428BC3F7A6369EC13EC8F99F77892D163FE605B8609940E1B27D784C57B7842BD7
+10C78480BF7EE7CF9BC29064CBCBE8B3B584C453C29851C39438E10BB9CAD4B2776B0899
+EDFF8CC4D35C8DF827743DC5D85681F4A7B9EAB43E133384B072F0D7A86EC6BFD5989503
+A95AA4DFF2FCB6BCEC468DFF75D20F9FD35015D4F98D65160E9EF8E1AE723433114B5458
+7B0A7314D320A942440D3D37F3BE4164C5D796C5D3597222EC88C7A14503EF964643B095
+E2F113FA22EA7999905633109628F97982451A9810D6A1DD84EB108D7A26E04C1C00488D
+322774F47B555B28D24732E6C0D4D701933C9506D379B3E5BC10609B167C1064F34A4327
+A50D0D2FB470994714FB881EE3B88B054633BFF034650C0C4E4AE5720C35C7F3E4CD30E3
+6B26D8CD1813A7703867952488E01B23FDF799AE3AB35E4880E41B4DDBCF8CB4FA68423E
+2D5E122264F8378BB8EA414C83D95A4A6D85995CE64A50B39C8E5F94955CDDBD88804D42
+279515FC1129FD2F50A170B214BED20695CCE59EAE0ACE91FCE6DD217B3A737A9DCAE11E
+A0C746306AA9447F469BE68D8488E392D00583BAF1E63782C73D5201359CE7A768F24489
+0FA50098398CB006F74E9877E9E4373228269506F44931115C0E44654AFD6B48E3E2F6DD
+47E738DE4CDC5344E1C26FAE5B73B9844F5CB2292D675CE88C2078DBDA11C2A9A58F4B10
+42850802766C9387734F22288F12E1F0D211FE150294FDD1744D8001AB95D9D63FD5C916
+B7886A1D6A076D14AD0B6D65E63D49CBC825E85CCFE3E6119DD05D6450980900600A0A07
+4BE3EE6801DAA9670D1BD6F7FE3332BF9B16C9D7DF782547006BF79DD5286A899E1153F1
+077B7AD8CDAC2724E1689A95B958D24566EA5759AF2276E2558AC8A110EA5CAB9C1BE598
+4031BBCA618B7EA15E87379927AF1D58AF01217B45B9CC67F79D96977624A9A01B1AA7A3
+1D0E4B61F6FC96A620867BAB29A7331DE35BC73E29DD89DEC1B5CA163679017FD5D52D6E
+F359C8ACD7D149B509EB1E9EA1EBDDD572720F11A390AC61F898295FCCA27F466787CE24
+3C889A45EB97AE0AD87B5DB995DECB80D8A73592C9E17F02ED6BEFD6CFC5E56275366022
+E3EE687762FDB605B7221C7004DA9E8B594D6CA0B0AA5AD97D0231C228E38D21F2652470
+2524A76555EA690062A1C811C7708F33A432E4B93683D416BC6BFD9A3A9CD114ECEAD652
+98376657CFC1B1826B77B533314A3962ABA6137CF6502713BDA51FFC763CF78C7A0AFC99
+CD496DFE069FACD2669351BED17106952A3E55A13210C5024885CAF002343A31D1E64745
+E973853B94DE520B204922CE2063140C7403D7E038EA2D21D86A72E417DEF576BC60ED61
+B74A8237ABEBD176625ADC0B1475EF4D985D05148D0233041FB5F02920F4F4C769E2DF96
+8463AB7054465464844A2A1F1C427B9369BBF6221B0D557C1F1AFF62F710BA060FAA89D7
+3C6E7F5B09B2D1E192F47743BE288AB84682254C54ECDB6FB52E1013CFD075D0430D321D
+C0A9B30AA8D1BF0676816E3FB7BB53E19B9C782E3B15732AF9A233408CD12FCBB1D3A963
+3910D9E4F84F1D89B0A26AFC1DF439654005CEDFD46A9B5FC815C91E72631D255475710A
+CADB424EC5D2A86681422B36B8A6BE4DCA28EA5A919D9EE1B4F722518925484A59C6A972
+F68A0BC736BEBEF281DFA37F4F51BE2746644CAAC585DE766DCDF6443263C9A403E4E110
+32721D8C79C005B982D7B1A3E19AEAF0C89A2AB06841D677F79C3152E4B130B122BFC8ED
+D6EFFAC69BA8C66C47F3D5321FB8A9C7156CFA2F0F577DF1CA2D8E9C6D854B401FF8DCF3
+BFBA7C98B11B3F128EA81DD1BB7B4FC24943B43772A6E731876CF46608CB88EB143AE9B1
+7D72DE503210705410B26CF1D70D7D4B98A2C4AC6F7AEBCE59BAB09F1C4D4E97EC3A9D91
+15554C98E2FC7DF130D4548875C0ECF16614BFDAC96E9230FAAB82C6EBDAA0EBCCD1ABC9
+F9DB0B987DF58240B927A6AF8BF1CA62C39DA2DFDF36DA884F67553F058CE4718777EDED
+34E30501AC3DD9B8F9008463A33AA8612595E855D009CF9F7C1BDAC1DBD1483BCFF8A7DD
+346DC22F31646C0CF07C753596AFC285F6136BF7E3C83B0FB75D9BDFA9979C0930A245D2
+7899ECA0F64F12C390EA7293E5EFA7A1D0721AAF72B313E6A14FD20B1B5AD9F3BE0F071E
+33E89D4F5CC7111B4C06F18782A5A8F840CF27EE20B8BDC0B16E295D4AC30C2E079F75CB
+23A338BB99D059095BE8E7D2FEE1BC421BEAFC536D2E2C40E05B6EF3CF483A34CE506816
+2CE04C4F2D9F17748F9FAFB67F046A168F4545D80ECF05266556DA6E75B018F790D5B821
+B5F9D115BA8E3A7B273B92E6E111CD257A6B12F4F25956AF908C8CEC671DBB796FA93893
+18D5B8473A04B63E0F751744D8050A1D266A15656A016697A9CA765660B5728E9BAC77CE
+F7EFA339B522C2C52E6C678C550388136C678B2CD1027214D0D086028A29DD4785EEB512
+BD60CF2132746757559BE4C6B802792700B911D098F4A95A758B6E30285F906B6EE7B60D
+991F86B1961FDC2BD5A9FA8F68E488AD57494765D9822A469FCAC1BDCE3F3685B09550D4
+49CE97D9FA83F187923C4DE772464EFE98A9789B93E5691C621E9B79F227041D22CB05A0
+22282BAA61BFC04863CEB7BA282CE68AE91CCDC2717747B3BCD808136F779DADFDBEECFF
+E610CEE002874E4B33EF0ED4602073C56693BA2479D885F53FE4F5C68DF9C6B09D021342
+C117F488BFC7F2A7BADC2E059F0BF05AED5F6B8467CBE018D7AC442BC3526F8566A71B4A
+69E93874F74F3B751B8C6811992D47DC4D080461269C6EB18AE76ECC66479B6A53E1984F
+A17E13F546FD4AC12024A1ACE29C9BDCD47274E480017759381B2081349FF3AC5BAA1902
+2D9EB3DDC8471B0D2D58E3717973F7B7CD8E8AEAA301A676579AD57D112CF6D8F659B8CC
+E055A155AB0F6C6B8A3254ADBD5E6BBAA336327F3AE20C109CA8C46EF35814473457E3F2
+EC80EE99547B84377DF391B0A9B2F60B818A0A3D49D5E36A2D7A05F4F77F964F81CC51D2
+272CD30B52AFB7AEE06129977A0AF98BFF236EADF92CD7508A2F3FE853EE26530922A59B
+639571AA10FA5FC0E1315B7215B76045E18141403E4B0B2A9EB724E69BB40AC1AB479216
+1686D2B0DF545D0FA08CFACB8C8145AA9FB982222EE247B7DF2D5F2B33A9B6AE29CC6166
+3F642883EB6757DB8F1845E1727B7AADAE2FD8E560922467E79EF1803A03C9D51F649DD4
+16C75835F9EEB1FA6FAE978B1B7B7792FB24EDFD9EF55E67CB02D5C23C9628F126BD3A12
+31869DAE5FBBCE60133DEB7D33F1E0ADFD9927A3E9E42B6AB0E5D703BD7271A179985FC3
+D91C2D161B76F70987073647B26542C83A34172663F6793DE8B8D9BCD72CCD48DF5563C0
+FBFA6CC45D99AB78CD6ED8B861948E54DFE9C99E169E35A88D03C1C9A7C84720A3956B00
+0842CF8C515E3A722DDD0B6627926110B335744866564CC638901758FE0EFA98F4E3F4CF
+DF911E5E395EC3D17807D7483008A95BA603AB80FB6A359BA3F0A8ADFE60F9CBADF67441
+1D0BE41B802B3EC9075DC1EB375EDCD27E113B4B1EA3C8ED0B1BBB2A3DB934CDC5CDA9B6
+0F85B33DD71FCA5B25B0AAA6B528229D84E1E7B97CB72C0F20248509A2B6CC53E5B7B694
+24FD8BFAE39C66E86DCEE0B602C9102A0575F15693B3C0A268C1C3F897F57E1CC5A58ADA
+4222A57B2A53B234BA19ADA37208C16B1B757E106D5D8AF0AFFD6BBA6E753805BBC2E9A4
+450A78025400D18B8FDCA54A18440331E48E52E3C4CA80FC171B02293CED081E887215EA
+D34DCF1D6FC2FE86502262006977878E4960326634F1A1EC8D2D96CF51EECDDD6D7CB410
+6D2B37136A13B4D2B67A2DCC74365A27E72B263FCF506B34116BB93BF76DA0C813CE6F63
+639BA86D000BEEED941AC2096A7F1C714615CE20F920BC4427BBB157105FC8FCC3D5FA6C
+9C0D797AB7ECA5DA2B5DF210C4523E406821B704383C63055EB87E8C82E68ABB062487C8
+834EB35BA973902999E27D9A7D143536CB253195A3801FAF741C1588C808A1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
diff --git a/font/devps/generate/Makefile b/font/devps/generate/Makefile
new file mode 100644
index 0000000..0eba6b1
--- /dev/null
+++ b/font/devps/generate/Makefile
@@ -0,0 +1,314 @@
+# Copyright (C) 1989-2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# This is set up so you can do
+# make -f generate/Makefile
+# in the parent directory of this directory.
+
+# The following line is required for DOS/Windows systems, since
+# this Makefile needs a Unixy shell to run.
+SHELL = /bin/sh
+
+# Directory containing AFM files. Must not be current directory.
+# Either long names (e.g., Times-Roman.afm) or short names (e.g.,
+# timesr.afm) may be used. See the afmname script.
+afmdir=/usr/local/lib/afm
+
+# Write font descriptions to this directory.
+outdir=$(srcdir)/..
+
+# The symbol font which fits to 'Symbol.afm'. For the creation of
+# 'symbolsl.afm' we need the 'printafm' script from ghostscript.
+symbolfont=/usr/local/lib/fonts/Symbol.pfb
+
+PRINTAFM=printafm
+
+srcdir=generate
+
+SPECIALFONTS=S
+DINGBATSFONTS=ZD ZDR
+GREEKFONTS=SS
+TEXTFONTS=AB ABI AI AR \
+ BMB BMBI BMI BMR \
+ CB CBI CI CR \
+ HB HBI HI HR \
+ HNB HNBI HNI HNR \
+ NB NBI NI NR \
+ PB PBI PI PR \
+ TB TBI TI TR \
+ ZCMI
+
+FONTS=$(TEXTFONTS) $(SPECIALFONTS) $(GREEKFONTS) $(DINGBATSFONTS) EURO
+
+DESC=$(srcdir)/../DESC
+AFMTODIT=afmtodit -c -d$(DESC)
+IFLAG=-i 50
+RFLAG=-i 0 -m
+NOLIGFLAG=-n
+TEXTENC=$(srcdir)/../text.enc
+EFLAG=-e $(TEXTENC)
+TEXTMAP=$(srcdir)/text.map
+AFMNAME=$(srcdir)/afmname
+
+RM=rm -f
+
+all: $(FONTS)
+
+TR:
+ $(AFMTODIT) $(EFLAG) $(RFLAG) \
+ `$(AFMNAME) $(afmdir)/Times-Roman.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+TB:
+ $(AFMTODIT) $(EFLAG) $(RFLAG) \
+ `$(AFMNAME) $(afmdir)/Times-Bold.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+TI:
+ $(AFMTODIT) $(EFLAG) $(IFLAG) -a 7 \
+ `$(AFMNAME) $(afmdir)/Times-Italic.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+TBI:
+ $(AFMTODIT) $(EFLAG) $(IFLAG) \
+ `$(AFMNAME) $(afmdir)/Times-BoldItalic.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+HR:
+ $(AFMTODIT) $(EFLAG) $(RFLAG) \
+ `$(AFMNAME) $(afmdir)/Helvetica.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+HB:
+ $(AFMTODIT) $(EFLAG) $(RFLAG) \
+ `$(AFMNAME) $(afmdir)/Helvetica-Bold.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+HI:
+ $(AFMTODIT) $(EFLAG) $(IFLAG) \
+ `$(AFMNAME) $(afmdir)/Helvetica-Oblique.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+HBI:
+ $(AFMTODIT) $(EFLAG) $(IFLAG) \
+ `$(AFMNAME) $(afmdir)/Helvetica-BoldOblique.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+CR:
+ $(AFMTODIT) $(NOLIGFLAG) $(EFLAG) $(RFLAG) \
+ `$(AFMNAME) $(afmdir)/Courier.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+CB:
+ $(AFMTODIT) $(NOLIGFLAG) $(EFLAG) $(RFLAG) \
+ `$(AFMNAME) $(afmdir)/Courier-Bold.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+CI:
+ $(AFMTODIT) $(NOLIGFLAG) $(EFLAG) $(IFLAG) \
+ `$(AFMNAME) $(afmdir)/Courier-Oblique.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+CBI:
+ $(AFMTODIT) $(NOLIGFLAG) $(EFLAG) $(IFLAG) \
+ `$(AFMNAME) $(afmdir)/Courier-BoldOblique.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+PR:
+ $(AFMTODIT) $(EFLAG) $(RFLAG) \
+ `$(AFMNAME) $(afmdir)/Palatino-Roman.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+PB:
+ $(AFMTODIT) $(EFLAG) $(RFLAG) \
+ `$(AFMNAME) $(afmdir)/Palatino-Bold.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+PI:
+ $(AFMTODIT) $(EFLAG) $(IFLAG) \
+ `$(AFMNAME) $(afmdir)/Palatino-Italic.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+PBI:
+ $(AFMTODIT) $(EFLAG) $(IFLAG) \
+ `$(AFMNAME) $(afmdir)/Palatino-BoldItalic.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+NR:
+ $(AFMTODIT) $(EFLAG) $(RFLAG) \
+ `$(AFMNAME) $(afmdir)/NewCenturySchlbk-Roman.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+NB:
+ $(AFMTODIT) $(EFLAG) $(RFLAG) \
+ `$(AFMNAME) $(afmdir)/NewCenturySchlbk-Bold.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+NI:
+ $(AFMTODIT) $(EFLAG) $(IFLAG) \
+ `$(AFMNAME) $(afmdir)/NewCenturySchlbk-Italic.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+NBI:
+ $(AFMTODIT) $(EFLAG) $(IFLAG) \
+ `$(AFMNAME) $(afmdir)/NewCenturySchlbk-BoldItalic.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+BMR:
+ $(AFMTODIT) $(EFLAG) $(RFLAG) \
+ `$(AFMNAME) $(afmdir)/Bookman-Light.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+BMB:
+ $(AFMTODIT) $(EFLAG) $(RFLAG) \
+ `$(AFMNAME) $(afmdir)/Bookman-Demi.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+BMI:
+ $(AFMTODIT) $(EFLAG) $(IFLAG) \
+ `$(AFMNAME) $(afmdir)/Bookman-LightItalic.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+BMBI:
+ $(AFMTODIT) $(EFLAG) $(IFLAG) \
+ `$(AFMNAME) $(afmdir)/Bookman-DemiItalic.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+AR:
+ $(AFMTODIT) $(EFLAG) $(RFLAG) \
+ `$(AFMNAME) $(afmdir)/AvantGarde-Book.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+AB:
+ $(AFMTODIT) $(EFLAG) $(RFLAG) \
+ `$(AFMNAME) $(afmdir)/AvantGarde-Demi.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+AI:
+ $(AFMTODIT) $(EFLAG) $(IFLAG) \
+ `$(AFMNAME) $(afmdir)/AvantGarde-BookOblique.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+ABI:
+ $(AFMTODIT) $(EFLAG) $(IFLAG) \
+ `$(AFMNAME) $(afmdir)/AvantGarde-DemiOblique.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+HNR:
+ $(AFMTODIT) $(EFLAG) $(RFLAG) \
+ `$(AFMNAME) $(afmdir)/Helvetica-Narrow.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+HNB:
+ $(AFMTODIT) $(EFLAG) $(RFLAG) \
+ `$(AFMNAME) $(afmdir)/Helvetica-Narrow-Bold.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+HNI:
+ $(AFMTODIT) $(EFLAG) $(IFLAG) \
+ `$(AFMNAME) $(afmdir)/Helvetica-Narrow-Oblique.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+HNBI:
+ $(AFMTODIT) $(EFLAG) $(IFLAG) \
+ `$(AFMNAME) $(afmdir)/Helvetica-Narrow-BoldOblique.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+ZCMI:
+ $(AFMTODIT) $(EFLAG) $(IFLAG) \
+ `$(AFMNAME) $(afmdir)/ZapfChancery-MediumItalic.afm` \
+ $(TEXTMAP) $(OUTDIR)/$@
+
+ZD:
+ $(AFMTODIT) -s $(RFLAG) \
+ `$(AFMNAME) $(afmdir)/ZapfDingbats.afm` \
+ $(srcdir)/dingbats.map $(OUTDIR)/$@
+
+SS: $(OUTDIR)/symbolsl.afm
+ $(AFMTODIT) -s -x $(IFLAG) \
+ $(OUTDIR)/symbolsl.afm $(srcdir)/slanted-symbol.map \
+ $(OUTDIR)/$@
+
+S: symbol.afm
+ $(AFMTODIT) -s $(RFLAG) \
+ symbol.afm $(srcdir)/symbol.map $(OUTDIR)/$@
+
+ZDR: $(OUTDIR)/zapfdr.afm
+ $(AFMTODIT) -s $(RFLAG) \
+ $(OUTDIR)/zapfdr.afm $(srcdir)/dingbats-reversed.map \
+ $(OUTDIR)/$@
+
+# the map is just a dummy
+EURO: freeeuro.afm
+ $(AFMTODIT) $(RFLAG) \
+ freeeuro.afm $(srcdir)/symbol.map $(OUTDIR)/$@
+
+freeeuro.afm freeeuro.pfa: $(srcdir)/freeeuro.sfd
+ fontforge -script $(srcdir)/sfdtopfa.pe $(srcdir)/freeeuro.sfd \
+ && mv freeeuro.afm freeeuro.pfa $(OUTDIR)
+
+symbol.afm: $(srcdir)/symbol.sed
+ sed -f $(srcdir)/symbol.sed `$(AFMNAME) $(afmdir)/Symbol.afm` \
+ >$(OUTDIR)/$@
+
+symbolsl.afm: $(srcdir)/symbolsl.awk $(srcdir)/../symbolsl.ps
+ $(RM) Fontmap \
+ && echo "/Symbol-Slanted ($(srcdir)/../symbolsl.ps) ;" \
+ > Fontmap \
+ && echo "/Symbol ($(symbolfont)) ;" >> Fontmap \
+ && $(PRINTAFM) Symbol-Slanted > tmp.afm \
+ && awk -f $(srcdir)/symbolsl.awk -v SYMAFM=`$(AFMNAME) \
+ $(afmdir)/Symbol.afm` tmp.afm >$(OUTDIR)/$@ \
+ && $(RM) Fontmap tmp.afm
+
+zapfdr.afm: $(srcdir)/apfdr.sed
+ sed -f $(srcdir)/zapfdr.sed \
+ `$(AFMNAME) $(afmdir)/ZapfDingbats.afm` >$(OUTDIR)/$@
+
+ZD: $(srcdir)/dingbats.map
+ZDR: $(srcdir)/dingbats-reversed.map
+$(TEXTFONTS): $(TEXTMAP) $(TEXTENC)
+$(SPECIALFONTS): $(srcdir)/symbol.map
+$(GREEKFONTS): $(srcdir)/slanted-symbol.map
+$(FONTS): $(DESC)
+
+$(srcdir)/symbol.map: $(TEXTMAP) $(srcdir)/symbolchars
+ printf \
+ '#\n# This is a list of all predefined groff symbols.\n#\n' \
+ > $(OUTDIR)/$@ \
+ && cat $(TEXTMAP) $(srcdir)/symbolchars >>$@
+
+clean:
+ cd $(OUTDIR) \
+ && $(RM) freeeuro.afm freeeuro.pfa symbol.afm \
+ $(srcdir)/symbol.map symbolsl.afm zapfdr.afm
+
+realclean: clean
+ cd $(OUTDIR) \
+ && $(RM) $(FONTS)
+
+extraclean: realclean
+ $(RM) core *~ "#*"
+
+.PHONY: all clean realclean extraclean
+
+# Local Variables:
+# mode: makefile
+# fill-column: 72
+# End:
+# vim: set textwidth=72:
diff --git a/font/devps/generate/afmname b/font/devps/generate/afmname
new file mode 100755
index 0000000..7d19349
--- /dev/null
+++ b/font/devps/generate/afmname
@@ -0,0 +1,44 @@
+#! /bin/sh
+# Fix the path name of an AFM file.
+if test -f "$1"
+then
+ echo "$1"
+else
+ echo `dirname $1`/`basename $1 .afm | awk '
+/^AvantGarde-Book$/ { print "avangbk" }
+/^AvantGarde-BookOblique$/ { print "avangbko" }
+/^AvantGarde-Demi$/ { print "avangd" }
+/^AvantGarde-DemiOblique$/ { print "avangdo" }
+/^Bookman-Demi$/ { print "bookmd" }
+/^Bookman-DemiItalic$/ { print "bookmdi" }
+/^Bookman-Light$/ { print "bookml" }
+/^Bookman-LightItalic$/ { print "bookmli" }
+/^Courier$/ { print "couri" }
+/^Courier-Bold$/ { print "courib" }
+/^Courier-BoldOblique$/ { print "couribo" }
+/^Courier-Oblique$/ { print "courio" }
+/^Helvetica$/ { print "helve" }
+/^Helvetica-Bold$/ { print "helveb" }
+/^Helvetica-BoldOblique$/ { print "helvebo" }
+/^Helvetica-Narrow$/ { print "helven" }
+/^Helvetica-Narrow-Bold$/ { print "helvenb" }
+/^Helvetica-Narrow-BoldOblique$/ { print "helvenbo" }
+/^Helvetica-Narrow-Oblique$/ { print "helveno" }
+/^Helvetica-Oblique$/ { print "helveo" }
+/^NewCenturySchlbk-Bold$/ { print "newcsb" }
+/^NewCenturySchlbk-BoldItalic$/ { print "newcsbi" }
+/^NewCenturySchlbk-Italic$/ { print "newcsi" }
+/^NewCenturySchlbk-Roman$/ { print "newcsr" }
+/^Palatino-Bold$/ { print "palatb" }
+/^Palatino-BoldItalic$/ { print "palatbi" }
+/^Palatino-Italic$/ { print "palati" }
+/^Palatino-Roman$/ { print "palatr" }
+/^Symbol$/ { print "symbol" }
+/^Times-Bold$/ { print "timesb" }
+/^Times-BoldItalic$/ { print "timesbi" }
+/^Times-Italic$/ { print "timesi" }
+/^Times-Roman$/ { print "timesr" }
+/^ZapfChancery-MediumItalic$/ { print "zapfcmi" }
+/^ZapfDingbats$/ { print "zapfd" }
+' `.afm
+fi
diff --git a/font/devps/generate/dingbats-reversed.map b/font/devps/generate/dingbats-reversed.map
new file mode 100644
index 0000000..2c69968
--- /dev/null
+++ b/font/devps/generate/dingbats-reversed.map
@@ -0,0 +1,4 @@
+#
+# Predefined groff symbols for the reversed dingbats font.
+#
+a12 lh
diff --git a/font/devps/generate/dingbats.map b/font/devps/generate/dingbats.map
new file mode 100644
index 0000000..c5459ce
--- /dev/null
+++ b/font/devps/generate/dingbats.map
@@ -0,0 +1,5 @@
+#
+# Predefined groff symbols for the dingbats font.
+#
+a19 OK
+a12 rh
diff --git a/font/devps/generate/freeeuro.sfd b/font/devps/generate/freeeuro.sfd
new file mode 100644
index 0000000..882d5db
--- /dev/null
+++ b/font/devps/generate/freeeuro.sfd
@@ -0,0 +1,623 @@
+SplineFontDB: 1.0
+FontName: FreeEuro
+FullName: FreeEuro
+FamilyName: FreeEuro
+Weight: Medium
+Copyright: Created by Werner Lemberg with PfaEdit 1.0 (http://pfaedit.sf.net); the serif shapes are based on the Omega fonts created by Yannis Haralambous.
+Version: 001.001
+ItalicAngle: 0
+UnderlinePosition: -100
+UnderlineWidth: 50
+Ascent: 800
+Descent: 200
+NeedsXUIDChange: 1
+FSType: 12
+PfmFamily: 65
+TTFWeight: 500
+TTFWidth: 5
+LineGap: 90
+VLineGap: 0
+Panose: 3 0 6 3 0 0 0 0 0 0
+OS2TypoAscent: 0
+OS2TypoAOffset: 1
+OS2TypoDescent: 0
+OS2TypoDOffset: 1
+OS2TypoLinegap: 0
+OS2WinAscent: 0
+OS2WinAOffset: 1
+OS2WinDescent: 0
+OS2WinDOffset: 1
+HheadAscent: 0
+HheadAOffset: 1
+HheadDescent: 0
+HheadDOffset: 1
+OS2Vendor: 'PfEd'
+Encoding: Custom
+UnicodeInterp: none
+DisplaySize: -96
+AntiAlias: 1
+FitToEm: 1
+WinInfo: 0 8 2
+BeginChars: 256 16
+StartChar: Euro.symbol
+Encoding: 0 8364 0
+Width: 750
+Flags: W
+HStem: -12 58<398.5 519.5> 250 57<56 134 183 580> 366 57<56 134 183 628> 627 58<383.5 543.5>
+VStem: 124 58<332 341.5>
+Fore
+134 250 m 9
+ 32 250 l 17
+ 56 307 l 1
+ 125 307 l 1
+ 124 317 124 327 124 337 c 0
+ 124 346 124 356 125 366 c 1
+ 32 366 l 1
+ 56 423 l 1
+ 134 423 l 17
+ 165 555 294 685 473 685 c 0
+ 614 685 701 601 718 582 c 9
+ 694 523 l 17
+ 644 581 567 627 472 627 c 1
+ 334 627 230 534 195 423 c 1
+ 652 423 l 9
+ 628 366 l 25
+ 183 366 l 273
+ 182 356 182 346 182 337 c 0
+ 182 327 182 317 183 307 c 1
+ 604 307 l 9
+ 580 250 l 25
+ 195 250 l 17
+ 234 124 350 46 471 46 c 1
+ 568 46 641 90 694 150 c 9
+ 694 68 l 17
+ 639 23 562 -12 472 -12 c 1
+ 325 -12 177 83 134 250 c 9
+EndSplineSet
+EndChar
+StartChar: Euro.symbol.bold
+Encoding: 1 8364 1
+Width: 750
+Flags: W
+HStem: -12 87<406 533> 220 87<60 160 230 578> 366 87<60 142 254 634> 598 87<404 542>
+VStem: 140 88<329.5 341.5>
+Fore
+254 220 m 9
+ 578 220 l 25
+ 612 307 l 17
+ 230 307 l 1
+ 228 316 228 325 228 334 c 256
+ 228 345 228 356 230 366 c 9
+ 634 366 l 25
+ 670 453 l 17
+ 254 453 l 1
+ 304 552 402 598 488 598 c 0
+ 596 598 662 535 688 504 c 9
+ 724 594 l 17
+ 640 668 552 685 488 685 c 0
+ 320 685 198 566 160 453 c 9
+ 60 453 l 25
+ 26 366 l 1
+ 142 366 l 1
+ 142 356 140 346 140 337 c 0
+ 140 327 142 317 142 307 c 1
+ 60 307 l 1
+ 26 220 l 1
+ 160 220 l 17
+ 206 100 316 -12 496 -12 c 1
+ 564 -12 640 17 688 52 c 9
+ 688 169 l 17
+ 642 116 576 75 490 75 c 0
+ 414 75 312 110 254 220 c 9
+EndSplineSet
+EndChar
+StartChar: Euro.symbol.slanted
+Encoding: 2 8364 2
+Width: 750
+Flags: W
+HStem: -12 58<395.5 529.5> 250 57<121 190 248 633> 366 57<146 224 261 706> 627 58<529.5 689.5>
+Fore
+187 250 m 9
+ 85 250 l 17
+ 121 307 l 1
+ 190 307 l 1
+ 193 327 198 346 203 366 c 1
+ 110 366 l 1
+ 146 423 l 5
+ 224 423 l 17
+ 283 555 440 685 619 685 c 0
+ 760 685 829 601 842 582 c 9
+ 805 523 l 17
+ 767 581 700 627 605 627 c 1
+ 467 627 344 534 285 423 c 1
+ 742 423 l 9
+ 706 366 l 25
+ 261 366 l 17
+ 256 346 251 328 248 307 c 1
+ 669 307 l 9
+ 633 250 l 25
+ 248 250 l 17
+ 260 124 360 46 481 46 c 1
+ 578 46 660 90 726 150 c 9
+ 708 68 l 17
+ 644 23 559 -12 469 -12 c 1
+ 322 -12 195 83 187 250 c 9
+EndSplineSet
+EndChar
+StartChar: Euro.symbol.bold.slanted
+Encoding: 3 8364 3
+Width: 750
+Flags: W
+HStem: -12 87<404 548.5> 220 87<126 207 295 625> 366 87<157 219 351 712> 598 87<550 670>
+Fore
+301 220 m 9
+ 625 220 l 25
+ 678 307 l 17
+ 295 307 l 1
+ 296 329 301 349 307 366 c 9
+ 712 366 l 25
+ 766 453 l 17
+ 351 453 l 1
+ 422 552 529 598 616 598 c 0
+ 724 598 776 535 796 504 c 9
+ 850 594 l 17
+ 782 668 698 685 634 685 c 0
+ 466 685 319 566 257 453 c 9
+ 157 453 l 25
+ 104 366 l 1
+ 219 366 l 1
+ 214 346 210 328 207 307 c 1
+ 126 307 l 1
+ 73 220 l 1
+ 207 220 l 17
+ 227 100 314 -12 494 -12 c 1
+ 561 -12 644 17 700 52 c 9
+ 724 169 l 17
+ 667 116 592 75 505 75 c 0
+ 430 75 335 110 301 220 c 9
+EndSplineSet
+EndChar
+StartChar: Euro.serif
+Encoding: 4 8364 4
+Width: 741
+Flags: W
+HStem: -14 44<346.5 509> 253 46<54 109 219 568> 369 46<54 111 219 618> 636 40<357 497>
+Fore
+224 253 m 1
+ 245 130 319 30 463 30 c 0
+ 555 30 625 68 689 131 c 1
+ 707 113 l 1
+ 651 30 532 -14 436 -14 c 0
+ 257 -14 138 91 109 253 c 1
+ 34 253 l 1
+ 54 299 l 1
+ 103 299 l 1
+ 102 308 102 319 102 331 c 0
+ 102 344 103 357 104 369 c 1
+ 34 369 l 1
+ 54 415 l 1
+ 111 415 l 1
+ 145 569 272 676 442 676 c 0
+ 537 676 653 631 707 549 c 1
+ 689 531 l 1
+ 624 594 543 636 451 636 c 0
+ 394 636 342 613 301 575 c 0
+ 256 534 234 476 224 415 c 1
+ 638 415 l 1
+ 618 369 l 1
+ 219 369 l 257
+ 218 356 218 342 218 329 c 0
+ 218 319 218 309 219 299 c 1
+ 588 299 l 1
+ 568 253 l 1
+ 224 253 l 1
+EndSplineSet
+EndChar
+StartChar: Euro.serif.bold
+Encoding: 5 8364 5
+Width: 800
+Flags: W
+HStem: -19 48<394 552> 231 69<73 142 307 612> 368 69<73 143 307 669> 649 42<396.5 547>
+Fore
+142 231 m 1
+ 45 231 l 1
+ 73 300 l 1
+ 130 300 l 1
+ 129 310 129 321 129 332 c 0
+ 129 344 130 356 131 368 c 1
+ 45 368 l 1
+ 73 437 l 1
+ 143 437 l 1
+ 183 586 310 691 483 691 c 0
+ 611 691 689 628 762 545 c 1
+ 732 520 l 1
+ 649 613 572 649 494 649 c 0
+ 377 649 328 560 312 437 c 1
+ 697 437 l 1
+ 669 368 l 1
+ 307 368 l 257
+ 306 359 306 348 306 336 c 0
+ 306 325 306 312 307 300 c 1
+ 640 300 l 1
+ 612 231 l 1
+ 313 231 l 1
+ 319 190 330 149 349 116 c 0
+ 391 44 470 29 501 29 c 0
+ 579 29 654 59 737 152 c 1
+ 767 127 l 1
+ 694 44 616 -19 488 -19 c 0
+ 300 -19 181 89 142 231 c 1
+EndSplineSet
+EndChar
+StartChar: Euro.serif.italic
+Encoding: 6 8364 6
+Width: 734
+Flags: W
+HStem: -18 45<344 482.5> 253 46<86 143 252 565> 369 46<118 179 272 636> 630 36<463 620>
+VStem: 140 112<152.5 253>
+Fore
+143 299 m 1
+ 147 322 152 346 161 369 c 1
+ 98 369 l 1
+ 118 415 l 1
+ 179 415 l 1
+ 243 551 380 666 546 666 c 0
+ 694 666 734 560 745 516 c 1
+ 720 502 l 1
+ 700 549 668 630 554 630 c 0
+ 425 630 336 528 289 415 c 1
+ 656 415 l 1
+ 636 369 l 1
+ 272 369 l 1
+ 266 347 261 323 257 299 c 1
+ 585 299 l 1
+ 565 253 l 1
+ 252 253 l 1
+ 248 118 301 27 426 27 c 0
+ 539 27 609 98 657 145 c 1
+ 674 131 l 1
+ 637 87 548 -18 402 -18 c 0
+ 286 -18 140 52 140 253 c 1
+ 66 253 l 1
+ 86 299 l 1
+ 143 299 l 1
+EndSplineSet
+EndChar
+StartChar: Euro.serif.bold.italic
+Encoding: 7 8364 7
+Width: 800
+Flags: W
+HStem: -19 48<307 465> 231 69<61 118 285 584> 368 69<93 163 311 673> 649 42<476.5 627>
+Fore
+114 231 m 1
+ 17 231 l 1
+ 61 300 l 1
+ 118 300 l 1
+ 121 324 128 347 135 368 c 1
+ 49 368 l 1
+ 93 437 l 1
+ 163 437 l 1
+ 239 586 390 691 563 691 c 0
+ 691 691 754 628 808 545 c 1
+ 772 520 l 1
+ 711 613 642 649 564 649 c 0
+ 447 649 377 560 332 437 c 1
+ 717 437 l 1
+ 673 368 l 1
+ 311 368 l 1
+ 305 349 299 323 295 300 c 1
+ 628 300 l 1
+ 584 231 l 1
+ 285 231 l 1
+ 281 190 282 149 293 116 c 0
+ 318 44 394 29 425 29 c 0
+ 503 29 585 59 690 152 c 1
+ 714 127 l 1
+ 621 44 529 -19 401 -19 c 0
+ 213 -19 119 89 114 231 c 1
+EndSplineSet
+EndChar
+StartChar: Euro.sansserif
+Encoding: 8 8364 8
+Width: 756
+Flags: W
+HStem: -23 79<405 536.5> 225 84<69 171 246 585> 378 84<69 157 264 643> 630 79<395 543>
+VStem: 156 89<338 355>
+Fore
+263 225 m 9
+ 585 225 l 25
+ 617 309 l 17
+ 246 309 l 257
+ 245 320 245 332 245 344 c 0
+ 245 356 245 369 246 378 c 9
+ 643 378 l 25
+ 675 462 l 17
+ 264 462 l 1
+ 299 565 386 630 488 630 c 0
+ 598 630 659 578 696 520 c 9
+ 731 614 l 17
+ 655 692 560 709 494 709 c 0
+ 296 709 199 573 172 462 c 9
+ 69 462 l 25
+ 38 378 l 1
+ 157 378 l 1
+ 156 371 156 360 156 350 c 0
+ 156 335 156 321 157 309 c 1
+ 69 309 l 1
+ 38 225 l 1
+ 171 225 l 17
+ 207 90 318 -23 492 -23 c 1
+ 560 -23 631 -12 697 33 c 9
+ 697 136 l 17
+ 620 72 579 56 494 56 c 0
+ 389 56 300 118 263 225 c 9
+EndSplineSet
+EndChar
+StartChar: Euro.sansserif.bold
+Encoding: 9 8364 9
+Width: 796
+Flags: W
+HStem: -22 123<436 594.5> 218 100<68 161 284 619> 372 98<69 161 284 669> 587 123<413.5 587>
+Fore
+724 540 m 1
+ 665 577 617 587 537 587 c 0
+ 489 587 364 571 310 470 c 1
+ 701 470 l 9
+ 669 372 l 25
+ 284 372 l 273
+ 284 362 283 354 283 345 c 0
+ 283 337 284 329 284 318 c 1
+ 651 318 l 9
+ 619 218 l 25
+ 310 218 l 17
+ 336 168 422 101 543 101 c 0
+ 646 101 686 125 716 144 c 9
+ 716 6 l 17
+ 682 -7 623 -22 540 -22 c 1
+ 332 -22 206 86 161 218 c 9
+ 36 218 l 1
+ 68 318 l 1
+ 141 318 l 1
+ 140 329 139 338 139 348 c 0
+ 139 355 140 363 141 372 c 1
+ 36 372 l 1
+ 69 470 l 25
+ 161 470 l 17
+ 192 555 283 710 544 710 c 0
+ 630 710 703 692 763 660 c 0
+ 724 540 l 1
+EndSplineSet
+EndChar
+StartChar: Euro.sansserif.slanted
+Encoding: 10 8364 10
+Width: 756
+Flags: W
+HStem: -23 79<400 548.5> 225 84<135 219 312 633> 378 84<167 237 362 723> 630 79<546 678>
+Fore
+311 225 m 9
+ 633 225 l 25
+ 683 309 l 17
+ 312 309 l 1
+ 315 331 321 359 326 378 c 13
+ 723 378 l 25
+ 773 462 l 17
+ 362 462 l 1
+ 419 565 520 630 622 630 c 0
+ 732 630 782 578 807 520 c 9
+ 862 614 l 17
+ 802 692 711 709 645 709 c 0
+ 447 709 321 573 270 462 c 9
+ 167 462 l 25
+ 118 378 l 1
+ 237 378 l 1
+ 233 360 225 329 223 309 c 1
+ 135 309 l 1
+ 86 225 l 1
+ 219 225 l 17
+ 226 90 313 -23 487 -23 c 1
+ 555 -23 628 -12 704 33 c 9
+ 726 136 l 17
+ 635 72 591 56 506 56 c 0
+ 401 56 325 118 311 225 c 9
+EndSplineSet
+EndChar
+StartChar: Euro.sansserif.bold.slanted
+Encoding: 11 8364 11
+Width: 796
+Flags: W
+HStem: -22 123<431 615.5> 218 100<136 209 352 665> 372 98<169 261 363 748> 587 123<564.5 738>
+Fore
+839 540 m 1
+ 788 577 742 587 662 587 c 0
+ 614 587 485 571 410 470 c 1
+ 801 470 l 9
+ 748 372 l 25
+ 363 372 l 17
+ 358 353 355 341 352 318 c 1
+ 719 318 l 9
+ 665 218 l 25
+ 356 218 l 17
+ 372 168 443 101 564 101 c 0
+ 667 101 713 125 747 144 c 9
+ 717 6 l 17
+ 681 -7 618 -22 535 -22 c 1
+ 327 -22 224 86 207 218 c 9
+ 82 218 l 1
+ 136 318 l 1
+ 209 318 l 1
+ 211 339 213 354 220 372 c 1
+ 115 372 l 1
+ 169 470 l 25
+ 261 470 l 17
+ 310 555 434 710 695 710 c 0
+ 781 710 850 692 903 660 c 0
+ 839 540 l 1
+EndSplineSet
+EndChar
+StartChar: Euro.mono
+Encoding: 12 8364 12
+Width: 600
+Flags: W
+HStem: -16 41<259 356.5> 217 37<33 65 104 383> 314 37<24.5 65 104 436> 535 41<259 356.5>
+VStem: 63 41<254 314>
+Fore
+322 576 m 0
+ 196 576 80 480 65 351 c 1
+ 33 351 l 258
+ 16 351 11 346 11 333 c 0
+ 11 319 17 314 33 314 c 258
+ 63 314 l 257
+ 63 254 l 257
+ 33 254 l 258
+ 17 254 11 249 11 236 c 0
+ 11 222 17 217 33 217 c 258
+ 65 217 l 1
+ 80 89 196 -16 322 -16 c 0
+ 386 -16 446 9 496 55 c 0
+ 522 79 534 96 534 106 c 0
+ 534 117 526 125 514 125 c 0
+ 507 125 503 123 496 115 c 0
+ 442 51 391 25 322 25 c 0
+ 216 25 124 107 106 217 c 1
+ 383 217 l 258
+ 398 217 404 222 404 236 c 0
+ 404 249 399 254 383 254 c 258
+ 104 254 l 257
+ 104 314 l 257
+ 428 314 l 258
+ 444 314 450 319 450 333 c 0
+ 450 346 444 351 428 351 c 258
+ 106 351 l 1
+ 124 460 216 535 322 535 c 0
+ 391 535 442 509 496 445 c 0
+ 503 437 507 435 514 435 c 0
+ 526 435 534 443 534 454 c 0
+ 534 464 522 481 496 505 c 0
+ 446 551 386 576 322 576 c 0
+EndSplineSet
+EndChar
+StartChar: Euro.mono.bold
+Encoding: 13 8364 13
+Width: 600
+Flags: W
+HStem: -14 100<256 357> 205 56<22 62 169 395> 303 56<31 62 169 424> 497 100<256 361.5>
+Fore
+173 359 m 1
+ 424 359 l 2
+ 442 359 452 349 452 331 c 0
+ 452 313 442 303 424 303 c 2
+ 169 303 l 1
+ 169 261 l 1
+ 386 261 l 2
+ 404 261 414 251 414 233 c 0
+ 414 215 404 205 386 205 c 2
+ 174 205 l 1
+ 190 130 247 86 329 86 c 0
+ 382 86 429 98 461 143 c 0
+ 469 154 481 159 492 159 c 0
+ 517 159 538 136 538 109 c 0
+ 538 86 521 60 490 36 c 0
+ 451 5 389 -14 325 -14 c 0
+ 187 -14 84 72 62 205 c 1
+ 31 205 l 2
+ 14 205 4 215 4 233 c 0
+ 4 251 13 261 31 261 c 2
+ 59 261 l 1
+ 59 303 l 1
+ 31 303 l 2
+ 14 303 4 313 4 331 c 0
+ 4 349 13 359 31 359 c 2
+ 62 359 l 1
+ 78 498 187 597 325 597 c 0
+ 389 597 451 582 490 551 c 1
+ 521 527 539 505 539 478 c 0
+ 539 455 517 426 492 426 c 1
+ 481 426 469 431 461 442 c 0
+ 431 482 394 497 329 497 c 0
+ 247 497 188 444 173 359 c 1
+EndSplineSet
+EndChar
+StartChar: Euro.mono.slanted
+Encoding: 14 8364 14
+Width: 600
+Flags: W
+HStem: -16 41<258.5 362.5> 217 37<72.5 117 153 444> 314 37<92.5 140 171 511> 535 41<382 477>
+Fore
+541 125 m 0
+ 534 125 530 123 521 115 c 0
+ 453 51 397 25 328 25 c 0
+ 210 25 148 121 153 217 c 1
+ 430 217 l 2
+ 445 217 455 225 455 241 c 0
+ 455 250 451 254 437 254 c 2
+ 158 254 l 1
+ 171 314 l 257
+ 496 314 l 2
+ 520 314 522 333 522 339 c 0
+ 522 348 518 351 504 351 c 2
+ 181 351 l 1
+ 222 460 330 535 436 535 c 0
+ 505 535 551 509 591 445 c 0
+ 596 437 600 435 607 435 c 0
+ 619 435 631 443 631 457 c 0
+ 631 467 623 483 604 505 c 0
+ 564 551 509 576 445 576 c 0
+ 319 576 183 480 140 351 c 1
+ 108 351 l 2
+ 84 351 81 335 81 329 c 0
+ 81 317 85 314 100 314 c 2
+ 130 314 l 1
+ 117 254 l 1
+ 87 254 l 2
+ 63 254 61 238 61 232 c 0
+ 61 220 65 217 80 217 c 2
+ 112 217 l 1
+ 99 84 198 -16 319 -16 c 0
+ 383 -16 448 9 508 55 c 0
+ 538 78 557 96 557 108 c 0
+ 557 123 547 125 541 125 c 0
+EndSplineSet
+EndChar
+StartChar: Euro.mono.bold.slanted
+Encoding: 15 8364 15
+Width: 600
+Flags: W
+HStem: -14 100<249.5 375.5> 205 56<76 116 219 443> 303 56<96 139 234 501> 497 100<384 485>
+Fore
+250 359 m 1
+ 501 359 l 2
+ 516 359 524 352 524 339 c 0
+ 524 317 509 303 489 303 c 2
+ 234 303 l 1
+ 226 261 l 1
+ 443 261 l 2
+ 458 261 465 254 465 242 c 0
+ 465 219 450 205 431 205 c 2
+ 219 205 l 1
+ 219 130 266 86 348 86 c 0
+ 403 86 457 103 492 143 c 0
+ 501 153 516 159 527 159 c 0
+ 548 159 563 142 563 120 c 0
+ 563 89 536 61 499 36 c 0
+ 453 5 387 -14 323 -14 c 0
+ 176 -14 100 80 107 205 c 1
+ 76 205 l 2
+ 62 205 54 212 54 225 c 0
+ 54 247 68 261 88 261 c 2
+ 116 261 l 1
+ 124 303 l 1
+ 96 303 l 2
+ 82 303 74 310 74 323 c 0
+ 74 346 89 359 108 359 c 2
+ 139 359 l 1
+ 185 498 315 597 453 597 c 0
+ 517 597 576 582 608 551 c 1
+ 630 530 643 511 643 489 c 0
+ 643 459 612 426 584 426 c 1
+ 573 426 560 433 556 442 c 0
+ 535 484 497 497 436 497 c 0
+ 354 497 283 444 250 359 c 1
+EndSplineSet
+EndChar
+EndChars
+EndSplineFont
diff --git a/font/devps/generate/make-zapfdr b/font/devps/generate/make-zapfdr
new file mode 100755
index 0000000..ee80bf0
--- /dev/null
+++ b/font/devps/generate/make-zapfdr
@@ -0,0 +1,89 @@
+#! /bin/sh
+#
+# make-zapfdr -- script for creating the file zapfdr.ps
+#
+# Copyright (C) 2006-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+#
+# usage:
+#
+# make-zapfdr < ZapfDingbats.afm > zapfdr.ps
+#
+
+
+# Write preamble.
+cat <<END
+%!PS-Adobe-3.0 Resource-Font
+%%DocumentNeededResources: font ZapfDingbats
+%%EndComments
+%%IncludeResource: font ZapfDingbats
+
+/ZapfDingbats findfont [-1 0 0 1 0 0] makefont
+
+dup length 1 add dict begin
+{
+ exch dup dup /FID ne exch /UniqueID ne and {
+ exch def
+ } {
+ pop pop
+ } ifelse
+} forall
+
+/FontName /ZapfDingbats-Reverse def
+END
+
+
+# Emit reverse metrics.
+sed '
+ /^StartCharMetrics/ {
+ s|StartCharMetrics \([0-9]*\)|/Metrics \1 dict dup begin|
+ H
+ d
+ }
+
+ /^C / {
+ s|^.*$|&@|
+ s|^.* N \([^ ]*\) ;.*$|&/\1 [|
+ s|^.* B [0-9-]* [0-9-]* \([0-9]*\) [0-9-]* ;.*$|&-\1 |
+ s|^.* B [0-9-]* [0-9-]* -\([0-9]*\) [0-9-]* ;.*$|&\1 |
+ s|^.* WX \([0-9]*\) ;.*$|&-\1] def|
+ s|^.* WX -\([0-9]*\) ;.*$|&\1] def|
+ s|^.*@| |
+ H
+ d
+ }
+
+ $ {
+ g
+ p
+ }
+
+ d
+'
+
+
+# Write postamble.
+cat <<END
+
+end def
+
+/ZapfDingbats-Reverse currentdict end definefont pop
+END
+
+# EOF
diff --git a/font/devps/generate/sfdtopfa.pe b/font/devps/generate/sfdtopfa.pe
new file mode 100644
index 0000000..b495458
--- /dev/null
+++ b/font/devps/generate/sfdtopfa.pe
@@ -0,0 +1,9 @@
+# sfdtopfa.pe
+#
+# This script generates a PFA file from the master SFD using pfaedit.
+#
+# The argument is the name of the SFD without extension;
+# the PFA file is created in the current directory.
+
+Open($1:r + ".sfd");
+Generate(($1:t):r + ".pfa");
diff --git a/font/devps/generate/slanted-symbol.map b/font/devps/generate/slanted-symbol.map
new file mode 100644
index 0000000..f8eda6a
--- /dev/null
+++ b/font/devps/generate/slanted-symbol.map
@@ -0,0 +1,31 @@
+#
+# This is the list of greek symbols for the SS special font.
+#
+alpha *a
+beta *b
+chi *x
+delta *d
+epsilon *e
+eta *y
+gamma *g
+iota *i
+kappa *k
+lambda *l
+mu *m
+nu *n
+omega *w
+omega1 +p
+omicron *o
+phi *f
+phi1 +f
+pi *p
+psi *q
+rho *r
+sigma *s
+tau *t
+theta *h
+theta1 +h
+upsilon *u
+xi *c
+zeta *z
+sigma1 ts
diff --git a/font/devps/generate/symbol.map b/font/devps/generate/symbol.map
new file mode 100644
index 0000000..8f1d2f1
--- /dev/null
+++ b/font/devps/generate/symbol.map
@@ -0,0 +1,449 @@
+#
+# This is a list of all predefined groff symbols.
+#
+#
+# Predefined groff symbols for textual fonts.
+#
+a14 rh
+a a
+A A
+aacute 'a
+Aacute 'A
+acircumflex ^a
+Acircumflex ^A
+acute aa
+adieresis :a
+Adieresis :A
+ae ae
+AE AE
+agrave `a
+Agrave `A
+aleph Ah
+alpha *a
+Alpha *A
+ampersand &
+angle /_
+angleleft la
+angleright ra
+approxequal ~~
+approxequal ~=
+aring oa
+Aring oA
+arrowboth <>
+arrowdblboth hA
+arrowdbldown dA
+arrowdblleft lA
+arrowdblright rA
+arrowdblup uA
+arrowdown da
+arrowhorizex an
+arrowleft <-
+arrowright ->
+arrowupdn va
+arrowup ua
+arrowvertex arrowvertex
+asciicircum ha
+asciitilde ti
+asterisk *
+asteriskmath **
+at @
+at at
+atilde ~a
+Atilde ~A
+backslash \
+backslash rs
+bar |
+bar ba
+b b
+B B
+beta *b
+Beta *B
+braceex barex
+braceex braceex
+braceex braceleftex
+braceex bracerightex
+braceex bv
+braceleft {
+braceleftbt braceleftbt
+braceleftbt lb
+braceleft lC
+braceleftmid braceleftmid
+braceleftmid lk
+bracelefttp bracelefttp
+bracelefttp lt
+braceright }
+bracerightbt bracerightbt
+bracerightbt rb
+bracerightmid bracerightmid
+bracerightmid rk
+braceright rC
+bracerighttp bracerighttp
+bracerighttp rt
+bracketleft [
+bracketleftbt bracketleftbt
+bracketleftbt lf
+bracketleftex bracketleftex
+bracketleft lB
+bracketlefttp bracketlefttp
+bracketlefttp lc
+bracketright ]
+bracketrightbt bracketrightbt
+bracketrightbt rf
+bracketrightex bracketrightex
+bracketright rB
+bracketrighttp bracketrighttp
+bracketrighttp rc
+breve ab
+brokenbar bb
+bullet bu
+cacute 'c
+Cacute 'C
+caron ah
+carriagereturn CR
+c c
+C C
+ccedilla ,c
+Ccedilla ,C
+cedilla ac
+cent ct
+checkmark OK
+chi *x
+Chi *X
+circle ci
+circlemultiply c*
+circleplus c+
+circumflex ^
+circumflex a^
+club CL
+colon :
+comma ,
+congruent =~
+copyright co
+currency Cs
+daggerdbl dd
+dagger dg
+d d
+D D
+degree de
+delta *d
+Delta *D
+diamond DI
+dieresis ad
+divide tdi
+dollar $
+dollar Do
+dotaccent a.
+dotlessi .i
+dotlessj .j
+dotmath md
+eacute 'e
+Eacute 'E
+ecircumflex ^e
+Ecircumflex ^E
+edieresis :e
+Edieresis :E
+e e
+E E
+egrave `e
+Egrave `E
+eight 8
+element mo
+emdash em
+emptyset es
+endash en
+epsilon *e
+Epsilon *E
+equal =
+equivalence ==
+eta *y
+Eta *Y
+Eth -D
+eth Sd
+Euro Eu
+exclam !
+exclamdown r!
+existential te
+f f
+F F
+ff ff
+ffi Fi
+ffl Fl
+fi fi
+five 5
+fiveeighths 58
+fl fl
+florin Fn
+four 4
+fraction f/
+gamma *g
+Gamma *G
+germandbls ss
+g g
+G G
+gradient gr
+grave ga
+greater >
+greaterequal >=
+guillemotleft Fo
+guillemotright Fc
+guilsinglleft fo
+guilsinglright fc
+heart HE
+h h
+H H
+hungarumlaut a"
+hyphen -
+hyphen hy
+iacute 'i
+Iacute 'I
+icircumflex ^i
+Icircumflex ^I
+idieresis :i
+Idieresis :I
+Ifraktur Im
+igrave `i
+Igrave `I
+i i
+I I
+ij ij
+IJ IJ
+infinity if
+# the next line overrides the (old) PUA value of the AGL
+integralex u23AE
+integral integral
+integral is
+intersection ca
+iota *i
+Iota *I
+j j
+J J
+kappa *k
+Kappa *K
+k k
+K K
+lambda *l
+Lambda *L
+less <
+lessequal <=
+l l
+L L
+logicaland AN
+logicalnot tno
+logicalor OR
+lozenge lz
+lslash /l
+Lslash /L
+macron a-
+minus \-
+minute fm
+m m
+M M
+mu1 mc
+multiply tmu
+mu *m
+Mu *M
+# if there is "mu1" glyph in the font - comment out the following line
+mu mc
+nine 9
+n n
+N N
+notelement nm
+notequal !=
+notsubset nb
+ntilde ~n
+Ntilde ~N
+numbersign #
+numbersign sh
+nu *n
+Nu *N
+oacute 'o
+Oacute 'O
+ocircumflex ^o
+Ocircumflex ^O
+odieresis :o
+Odieresis :O
+oe oe
+OE OE
+ogonek ho
+ograve `o
+Ograve `O
+omega1 +p
+omega *w
+Omega *W
+omicron *o
+Omicron *O
+one 1
+oneeighth 18
+onehalf 12
+onequarter 14
+onesuperior S1
+o o
+O O
+ordfeminine Of
+ordmasculine Om
+oslash /o
+Oslash /O
+otilde ~o
+Otilde ~O
+overline rn
+paragraph ps
+parenleft (
+parenleftbt parenleftbt
+parenleftex parenleftex
+parenlefttp parenlefttp
+parenright )
+parenrightbt parenrightbt
+parenrightex parenrightex
+parenrighttp parenrighttp
+partialdiff pd
+percent %
+period .
+periodcentered pc
+perpendicular pp
+perthousand %0
+phi1 +f
+phi *f
+Phi *F
+pi *p
+Pi *P
+plus +
+plusminus t+-
+p p
+P P
+product product
+propersubset sb
+propersuperset sp
+proportional pt
+psi *q
+Psi *Q
+q q
+Q Q
+question ?
+questiondown r?
+quotedbl "
+quotedblbase Bq
+quotedbl dq
+quotedblleft lq
+quotedblright rq
+quoteleft `
+quoteleft oq
+quoteright '
+quoteright cq
+quotesinglbase bq
+quotesingle aq
+radicalex radicalex
+radical sqrt
+radical sr
+reflexsubset ib
+reflexsuperset ip
+registered rg
+Rfraktur Re
+rho *r
+Rho *R
+ring ao
+r r
+R R
+scaron vs
+Scaron vS
+second sd
+section sc
+semicolon ;
+seven 7
+seveneighths 78
+SF110000 br
+sigma1 ts
+sigma *s
+Sigma *S
+similar ap
+six 6
+slash /
+slash sl
+spade SP
+s s
+S S
+sterling Po
+suchthat st
+summation sum
+tau *t
+Tau *T
+therefore 3d
+therefore tf
+theta1 +h
+theta *h
+Theta *H
+thorn Tp
+Thorn TP
+three 3
+threeeighths 38
+threequarters 34
+threesuperior S3
+tilde ~
+tilde a~
+trademark tm
+t t
+T T
+two 2
+twosuperior S2
+uacute 'u
+Uacute 'U
+ucircumflex ^u
+Ucircumflex ^U
+udieresis :u
+Udieresis :U
+ugrave `u
+Ugrave `U
+underscore _
+uni03F5 +e
+uni210F -h
+uni210F hbar
+uni21D5 vA
+uni2210 coproduct
+uni2213 -+
+uni2243 |=
+uni2262 ne
+uni226A >>
+uni226B <<
+uni2285 nc
+uni25A1 sq
+uni261C lh
+union cu
+universal fa
+upsilon *u
+u u
+U U
+v v
+V V
+weierstrass wp
+w w
+W W
+xi *c
+Xi *C
+x x
+X X
+yacute 'y
+Yacute 'Y
+ydieresis :y
+Ydieresis :Y
+yen Ye
+y y
+Y Y
+zcaron vz
+Zcaron vZ
+zero 0
+zeta *z
+Zeta *Z
+z z
+Z Z
+#
+# Additional predefined groff symbols for special fonts.
+#
+arrowdown arrowvertbt
+arrowup arrowverttp
+divide di
+equal eq
+logicalnot no
+minus mi
+multiply mu
+plusminus +-
+plus pl
+Upsilon1 *U
diff --git a/font/devps/generate/symbol.sed b/font/devps/generate/symbol.sed
new file mode 100644
index 0000000..0bc4fb9
--- /dev/null
+++ b/font/devps/generate/symbol.sed
@@ -0,0 +1,32 @@
+# Set up uniform vertical dimensions for extensible glyphs (needed by eqn).
+/^C .*[ ;]N bracketlefttp[ ;]/bx
+/^C .*[ ;]N bracketleftex[ ;]/bx
+/^C .*[ ;]N bracketleftbt[ ;]/bx
+/^C .*[ ;]N bracketrighttp[ ;]/bx
+/^C .*[ ;]N bracketrightex[ ;]/bx
+/^C .*[ ;]N bracketrightbt[ ;]/bx
+/^C .*[ ;]N bracelefttp[ ;]/bx
+/^C .*[ ;]N braceleftmid[ ;]/bx
+/^C .*[ ;]N braceleftbt[ ;]/bx
+/^C .*[ ;]N bracerighttp[ ;]/bx
+/^C .*[ ;]N bracerightmid[ ;]/bx
+/^C .*[ ;]N bracerightbt[ ;]/bx
+/^C .*[ ;]N braceex[ ;]/bx
+/^C .*[ ;]N parenleftex[ ;]/by
+/^C .*[ ;]N parenrightex[ ;]/by
+/^C .*[ ;]N parenleftbt[ ;]/bz
+/^C .*[ ;]N parenrightbt[ ;]/bz
+/^EndCharMetrics/a\
+italicCorrection integral 67\
+leftItalicCorrection integral 52\
+subscriptCorrection integral -10
+b
+:x
+s/B \([-0-9][0-9]*\) [-0-9][0-9]* \([-0-9][0-9]*\) [-0-9][0-9]*/B \1 -75 \2 925/
+b
+:y
+s/B \([-0-9][0-9]*\) [-0-9][0-9]* \([-0-9][0-9]*\) [-0-9][0-9]*/B \1 -80 \2 920/
+b
+:z
+s/B \([-0-9][0-9]*\) \([-0-9][0-9]*\) \([-0-9][0-9]*\) [-0-9][0-9]*/B \1 \2 \3 920/
+b
diff --git a/font/devps/generate/symbolchars b/font/devps/generate/symbolchars
new file mode 100644
index 0000000..015c534
--- /dev/null
+++ b/font/devps/generate/symbolchars
@@ -0,0 +1,13 @@
+#
+# Additional predefined groff symbols for special fonts.
+#
+arrowdown arrowvertbt
+arrowup arrowverttp
+divide di
+equal eq
+logicalnot no
+minus mi
+multiply mu
+plusminus +-
+plus pl
+Upsilon1 *U
diff --git a/font/devps/generate/symbolsl.awk b/font/devps/generate/symbolsl.awk
new file mode 100644
index 0000000..ad36995
--- /dev/null
+++ b/font/devps/generate/symbolsl.awk
@@ -0,0 +1,19 @@
+/^StartFontMetrics / {
+ print
+ while ((getline < SYMAFM) > 0) {
+ if (/^CharacterSet / || /^EncodingScheme / || /^Comment /) { print }
+ }
+ next
+}
+/^ItalicAngle 0$/ {
+ print "ItalicAngle -15.5"
+ next
+}
+/^FullName / {
+ print $0 " Slanted"
+ next
+}
+/^FSType / {
+ next
+}
+{ print }
diff --git a/font/devps/generate/text.map b/font/devps/generate/text.map
new file mode 100644
index 0000000..84182a3
--- /dev/null
+++ b/font/devps/generate/text.map
@@ -0,0 +1,434 @@
+#
+# Predefined groff symbols for textual fonts.
+#
+a14 rh
+a a
+A A
+aacute 'a
+Aacute 'A
+acircumflex ^a
+Acircumflex ^A
+acute aa
+adieresis :a
+Adieresis :A
+ae ae
+AE AE
+agrave `a
+Agrave `A
+aleph Ah
+alpha *a
+Alpha *A
+ampersand &
+angle /_
+angleleft la
+angleright ra
+approxequal ~~
+approxequal ~=
+aring oa
+Aring oA
+arrowboth <>
+arrowdblboth hA
+arrowdbldown dA
+arrowdblleft lA
+arrowdblright rA
+arrowdblup uA
+arrowdown da
+arrowhorizex an
+arrowleft <-
+arrowright ->
+arrowupdn va
+arrowup ua
+arrowvertex arrowvertex
+asciicircum ha
+asciitilde ti
+asterisk *
+asteriskmath **
+at @
+at at
+atilde ~a
+Atilde ~A
+backslash \
+backslash rs
+bar |
+bar ba
+b b
+B B
+beta *b
+Beta *B
+braceex barex
+braceex braceex
+braceex braceleftex
+braceex bracerightex
+braceex bv
+braceleft {
+braceleftbt braceleftbt
+braceleftbt lb
+braceleft lC
+braceleftmid braceleftmid
+braceleftmid lk
+bracelefttp bracelefttp
+bracelefttp lt
+braceright }
+bracerightbt bracerightbt
+bracerightbt rb
+bracerightmid bracerightmid
+bracerightmid rk
+braceright rC
+bracerighttp bracerighttp
+bracerighttp rt
+bracketleft [
+bracketleftbt bracketleftbt
+bracketleftbt lf
+bracketleftex bracketleftex
+bracketleft lB
+bracketlefttp bracketlefttp
+bracketlefttp lc
+bracketright ]
+bracketrightbt bracketrightbt
+bracketrightbt rf
+bracketrightex bracketrightex
+bracketright rB
+bracketrighttp bracketrighttp
+bracketrighttp rc
+breve ab
+brokenbar bb
+bullet bu
+cacute 'c
+Cacute 'C
+caron ah
+carriagereturn CR
+c c
+C C
+ccedilla ,c
+Ccedilla ,C
+cedilla ac
+cent ct
+checkmark OK
+chi *x
+Chi *X
+circle ci
+circlemultiply c*
+circleplus c+
+circumflex ^
+circumflex a^
+club CL
+colon :
+comma ,
+congruent =~
+copyright co
+currency Cs
+daggerdbl dd
+dagger dg
+d d
+D D
+degree de
+delta *d
+Delta *D
+diamond DI
+dieresis ad
+divide tdi
+dollar $
+dollar Do
+dotaccent a.
+dotlessi .i
+dotlessj .j
+dotmath md
+eacute 'e
+Eacute 'E
+ecircumflex ^e
+Ecircumflex ^E
+edieresis :e
+Edieresis :E
+e e
+E E
+egrave `e
+Egrave `E
+eight 8
+element mo
+emdash em
+emptyset es
+endash en
+epsilon *e
+Epsilon *E
+equal =
+equivalence ==
+eta *y
+Eta *Y
+Eth -D
+eth Sd
+Euro Eu
+exclam !
+exclamdown r!
+existential te
+f f
+F F
+ff ff
+ffi Fi
+ffl Fl
+fi fi
+five 5
+fiveeighths 58
+fl fl
+florin Fn
+four 4
+fraction f/
+gamma *g
+Gamma *G
+germandbls ss
+g g
+G G
+gradient gr
+grave ga
+greater >
+greaterequal >=
+guillemotleft Fo
+guillemotright Fc
+guilsinglleft fo
+guilsinglright fc
+heart HE
+h h
+H H
+hungarumlaut a"
+hyphen -
+hyphen hy
+iacute 'i
+Iacute 'I
+icircumflex ^i
+Icircumflex ^I
+idieresis :i
+Idieresis :I
+Ifraktur Im
+igrave `i
+Igrave `I
+i i
+I I
+ij ij
+IJ IJ
+infinity if
+# the next line overrides the (old) PUA value of the AGL
+integralex u23AE
+integral integral
+integral is
+intersection ca
+iota *i
+Iota *I
+j j
+J J
+kappa *k
+Kappa *K
+k k
+K K
+lambda *l
+Lambda *L
+less <
+lessequal <=
+l l
+L L
+logicaland AN
+logicalnot tno
+logicalor OR
+lozenge lz
+lslash /l
+Lslash /L
+macron a-
+minus \-
+minute fm
+m m
+M M
+mu1 mc
+multiply tmu
+mu *m
+Mu *M
+# if there is "mu1" glyph in the font - comment out the following line
+mu mc
+nine 9
+n n
+N N
+notelement nm
+notequal !=
+notsubset nb
+ntilde ~n
+Ntilde ~N
+numbersign #
+numbersign sh
+nu *n
+Nu *N
+oacute 'o
+Oacute 'O
+ocircumflex ^o
+Ocircumflex ^O
+odieresis :o
+Odieresis :O
+oe oe
+OE OE
+ogonek ho
+ograve `o
+Ograve `O
+omega1 +p
+omega *w
+Omega *W
+omicron *o
+Omicron *O
+one 1
+oneeighth 18
+onehalf 12
+onequarter 14
+onesuperior S1
+o o
+O O
+ordfeminine Of
+ordmasculine Om
+oslash /o
+Oslash /O
+otilde ~o
+Otilde ~O
+overline rn
+paragraph ps
+parenleft (
+parenleftbt parenleftbt
+parenleftex parenleftex
+parenlefttp parenlefttp
+parenright )
+parenrightbt parenrightbt
+parenrightex parenrightex
+parenrighttp parenrighttp
+partialdiff pd
+percent %
+period .
+periodcentered pc
+perpendicular pp
+perthousand %0
+phi1 +f
+phi *f
+Phi *F
+pi *p
+Pi *P
+plus +
+plusminus t+-
+p p
+P P
+product product
+propersubset sb
+propersuperset sp
+proportional pt
+psi *q
+Psi *Q
+q q
+Q Q
+question ?
+questiondown r?
+quotedbl "
+quotedblbase Bq
+quotedbl dq
+quotedblleft lq
+quotedblright rq
+quoteleft `
+quoteleft oq
+quoteright '
+quoteright cq
+quotesinglbase bq
+quotesingle aq
+radicalex radicalex
+radical sqrt
+radical sr
+reflexsubset ib
+reflexsuperset ip
+registered rg
+Rfraktur Re
+rho *r
+Rho *R
+ring ao
+r r
+R R
+scaron vs
+Scaron vS
+second sd
+section sc
+semicolon ;
+seven 7
+seveneighths 78
+SF110000 br
+sigma1 ts
+sigma *s
+Sigma *S
+similar ap
+six 6
+slash /
+slash sl
+spade SP
+s s
+S S
+sterling Po
+suchthat st
+summation sum
+tau *t
+Tau *T
+therefore 3d
+therefore tf
+theta1 +h
+theta *h
+Theta *H
+thorn Tp
+Thorn TP
+three 3
+threeeighths 38
+threequarters 34
+threesuperior S3
+tilde ~
+tilde a~
+trademark tm
+t t
+T T
+two 2
+twosuperior S2
+uacute 'u
+Uacute 'U
+ucircumflex ^u
+Ucircumflex ^U
+udieresis :u
+Udieresis :U
+ugrave `u
+Ugrave `U
+underscore _
+uni03F5 +e
+uni210F -h
+uni210F hbar
+uni21D5 vA
+uni2210 coproduct
+uni2213 -+
+uni2243 |=
+uni2262 ne
+uni226A >>
+uni226B <<
+uni2285 nc
+uni25A1 sq
+uni261C lh
+union cu
+universal fa
+upsilon *u
+Upsilon *U
+u u
+U U
+v v
+V V
+weierstrass wp
+w w
+W W
+xi *c
+Xi *C
+x x
+X X
+yacute 'y
+Yacute 'Y
+ydieresis :y
+Ydieresis :Y
+yen Ye
+y y
+Y Y
+zcaron vz
+Zcaron vZ
+zero 0
+zeta *z
+Zeta *Z
+z z
+Z Z
diff --git a/font/devps/generate/zapfdr.sed b/font/devps/generate/zapfdr.sed
new file mode 100644
index 0000000..157ddff
--- /dev/null
+++ b/font/devps/generate/zapfdr.sed
@@ -0,0 +1,2 @@
+/^FontName /s/$/-Reverse/
+/^FullName /s/$/ Reverse/
diff --git a/font/devps/old/CB b/font/devps/old/CB
new file mode 100644
index 0000000..31f19b7
--- /dev/null
+++ b/font/devps/old/CB
@@ -0,0 +1,281 @@
+name CB
+internalname Courier-Bold
+spacewidth 600
+encoding text.enc
+charset
+ha 600,616 2 0 asciicircum
+ti 600,356 0 1 asciitilde
+vS 600,790,22 2 2 Scaron
+vZ 600,790 2 3 Zcaron
+vs 600,667,17 2 4 scaron
+vz 600,667 2 5 zcaron
+:Y 600,748 2 6 Ydieresis
+tm 600,562,0,149,9 2 7 trademark
+aq 600,562 2 8 quotesingle
+space 600 0 32 space
+! 600,572,15 2 33 exclam
+" 600,562 2 34 quotedbl
+dq "
+# 600,651,45 2 35 numbersign
+sh "
+$ 600,666,126 2 36 dollar
+Do "
+% 600,616,15 2 37 percent
+& 600,543,15 0 38 ampersand
+' 600,562 2 39 quoteright
+cq "
+( 600,616,102 2 40 parenleft
+) 600,616,102 2 41 parenright
+* 600,601 2 42 asterisk
++ 600,478 0 43 plus
+, 600,174,111 0 44 comma
+- 600,313 0 45 hyphen
+hy "
+. 600,171,15 0 46 period
+/ 600,626,77 2 47 slash
+sl "
+0 600,616,15 2 48 zero
+1 600,616 2 49 one
+2 600,616 2 50 two
+3 600,616,15 2 51 three
+4 600,616 2 52 four
+5 600,601,15 2 53 five
+6 600,616,15 2 54 six
+7 600,601 2 55 seven
+8 600,616,15 2 56 eight
+9 600,616,15 2 57 nine
+: 600,425,15 0 58 colon
+; 600,425,111 0 59 semicolon
+< 600,501 0 60 less
+= 600,398 0 61 equal
+> 600,501 0 62 greater
+? 600,580,14 2 63 question
+@ 600,616,15 2 64 at
+at "
+A 600,562,0,9,9 2 65 A
+B 600,562 2 66 B
+C 600,580,18 2 67 C
+D 600,562 2 68 D
+E 600,562 2 69 E
+F 600,562 2 70 F
+G 600,580,18 2 71 G
+H 600,562 2 72 H
+I 600,562 2 73 I
+J 600,562,18,1 2 74 J
+K 600,562 2 75 K
+L 600,562 2 76 L
+M 600,562,0,2,2 2 77 M
+N 600,562,12,10 2 78 N
+O 600,580,18 2 79 O
+P 600,562 2 80 P
+Q 600,580,138 2 81 Q
+R 600,562 2 82 R
+S 600,582,22 2 83 S
+T 600,562 2 84 T
+U 600,562,18 2 85 U
+V 600,562,0,13,13 2 86 V
+W 600,562,0,18,18 2 87 W
+X 600,562 2 88 X
+Y 600,562 2 89 Y
+Z 600,562 2 90 Z
+[ 600,616,102 2 91 bracketleft
+lB "
+\ 600,626,77 2 92 backslash
+rs "
+] 600,616,102 2 93 bracketright
+rB "
+a^ 600,657 2 94 circumflex
+^ "
+_ 600,0,125 0 95 underscore
+` 600,562 2 96 quoteleft
+oq "
+a 600,454,15 0 97 a
+b 600,626,15 2 98 b
+c 600,459,15 0 99 c
+d 600,626,15 2 100 d
+e 600,454,15 0 101 e
+f 600,626 2 102 f
+g 600,454,146 1 103 g
+h 600,626 2 104 h
+i 600,658 2 105 i
+j 600,658,146 3 106 j
+k 600,626 2 107 k
+l 600,626 2 108 l
+m 600,454,0,26,22 0 109 m
+n 600,454 0 110 n
+o 600,454,15 0 111 o
+p 600,454,142,0,1 1 112 p
+q 600,454,142 1 113 q
+r 600,454 0 114 r
+s 600,459,17 0 115 s
+t 600,562,15 2 116 t
+u 600,439,15,0,1 0 117 u
+v 600,439,0,1,1 0 118 v
+w 600,439,0,18,18 0 119 w
+x 600,439 0 120 x
+y 600,439,142,1,4 1 121 y
+z 600,439 0 122 z
+lC 600,616,102 2 123 braceleft
+{ "
+ba 600,750,250 3 124 bar
+| "
+rC 600,616,102 2 125 braceright
+} "
+a~ 600,636 2 126 tilde
+~ "
+bq 600,143,142 1 128 quotesinglbase
+Fo 600,446 0 129 guillemotleft
+Fc 600,446 0 130 guillemotright
+bu 600,430 0 131 bullet
+Fn 600,616,131,0,30 2 132 florin
+f/ 600,661,60 2 133 fraction
+%0 600,616,15,113,113 2 134 perthousand
+dg 600,580,70 2 135 dagger
+dd 600,580,70 2 136 daggerdbl
+en 600,313 0 137 endash
+em 600,313,0,10,10 0 138 emdash
+fi 600,626 2 140 fi
+fl 600,626 2 141 fl
+.i 600,439 0 144 dotlessi
+ga 600,661 2 146 grave
+a" 600,661 2 147 hungarumlaut
+a. 600,625 2 148 dotaccent
+ab 600,631 2 149 breve
+ah 600,667 2 150 caron
+ao 600,678 2 151 ring
+ho 600,0,199 1 152 ogonek
+lq 600,562 2 153 quotedblleft
+rq 600,562 2 154 quotedblright
+oe 600,454,15,11,18 0 155 oe
+/l 600,626 2 156 lslash
+Bq 600,143,142 1 157 quotedblbase
+OE 600,562,0,0,25 2 158 OE
+/L 600,562 2 159 Lslash
+r! 600,449,146 1 161 exclamdown
+ct 600,614,49 2 162 cent
+Po 600,611,28 2 163 sterling
+Cs 600,517 0 164 currency
+Ye 600,562 2 165 yen
+bb 600,675,175 3 166 brokenbar
+sc 600,580,70 2 167 section
+ad 600,625 2 168 dieresis
+co 600,580,18 2 169 copyright
+Of 600,580 2 170 ordfeminine
+fo 600,446 0 171 guilsinglleft
+tno 600,413 0 172 logicalnot
+\- 600,313 0 173 minus
+rg 600,580,18 2 174 registered
+a- 600,585 2 175 macron
+de 600,616 2 176 degree
+t+- 600,515 0 177 plusminus
+S2 600,616 2 178 twosuperior
+S3 600,616 2 179 threesuperior
+aa 600,661 2 180 acute
+mc 600,439,142,0,1 1 181 mu
+ps 600,580,70 2 182 paragraph
+pc 600,351 0 183 periodcentered
+ac 600,0,206 1 184 cedilla
+S1 600,616 2 185 onesuperior
+Om 600,580 2 186 ordmasculine
+fc 600,446 0 187 guilsinglright
+14 600,661,60,56,56 2 188 onequarter
+12 600,661,60,48,47 2 189 onehalf
+34 600,661,60,48,47 2 190 threequarters
+r? 600,449,146 1 191 questiondown
+`A 600,784,0,9,9 2 192 Agrave
+'A 600,784,0,9,9 2 193 Aacute
+^A 600,780,0,9,9 2 194 Acircumflex
+~A 600,759,0,9,9 2 195 Atilde
+:A 600,748,0,9,9 2 196 Adieresis
+oA 600,801,0,9,9 2 197 Aring
+AE 600,562,0,2,29 2 198 AE
+,C 600,580,206 3 199 Ccedilla
+`E 600,784 2 200 Egrave
+'E 600,784 2 201 Eacute
+^E 600,780 2 202 Ecircumflex
+:E 600,748 2 203 Edieresis
+`I 600,784 2 204 Igrave
+'I 600,784 2 205 Iacute
+^I 600,780 2 206 Icircumflex
+:I 600,748 2 207 Idieresis
+-D 600,562 2 208 Eth
+~N 600,759,12,10 2 209 Ntilde
+`O 600,784,18 2 210 Ograve
+'O 600,784,18 2 211 Oacute
+^O 600,780,18 2 212 Ocircumflex
+~O 600,759,18 2 213 Otilde
+:O 600,748,18 2 214 Odieresis
+tmu 600,478 0 215 multiply
+/O 600,584,22 2 216 Oslash
+`U 600,784,18 2 217 Ugrave
+'U 600,784,18 2 218 Uacute
+^U 600,780,18 2 219 Ucircumflex
+:U 600,748,18 2 220 Udieresis
+'Y 600,784 2 221 Yacute
+TP 600,562 2 222 Thorn
+ss 600,626,15 2 223 germandbls
+`a 600,661,15 2 224 agrave
+'a 600,661,15 2 225 aacute
+^a 600,657,15 2 226 acircumflex
+~a 600,636,15 2 227 atilde
+:a 600,625,15 2 228 adieresis
+oa 600,678,15 2 229 aring
+ae 600,454,15,1,4 0 230 ae
+,c 600,459,206 1 231 ccedilla
+`e 600,661,15 2 232 egrave
+'e 600,661,15 2 233 eacute
+^e 600,657,15 2 234 ecircumflex
+:e 600,625,15 2 235 edieresis
+`i 600,661 2 236 igrave
+'i 600,661 2 237 iacute
+^i 600,657 2 238 icircumflex
+:i 600,625 2 239 idieresis
+Sd 600,626,27 2 240 eth
+~n 600,636 2 241 ntilde
+`o 600,661,15 2 242 ograve
+'o 600,661,15 2 243 oacute
+^o 600,657,15 2 244 ocircumflex
+~o 600,636,15 2 245 otilde
+:o 600,625,15 2 246 odieresis
+tdi 600,500 0 247 divide
+/o 600,463,24 0 248 oslash
+`u 600,661,15,0,1 2 249 ugrave
+'u 600,661,15,0,1 2 250 uacute
+^u 600,657,15,0,1 2 251 ucircumflex
+:u 600,625,15,0,1 2 252 udieresis
+'y 600,661,142,1,4 3 253 yacute
+Tp 600,626,142,0,14 3 254 thorn
+:y 600,625,142,1,4 3 255 ydieresis
+IJ 600,562,18,22,8 2 256 IJ
+--- 600,447 0 257 up
+--- 600,320 0 258 dectab
+u0047_030C 600,790,18 2 259 Gcaron
+--- 600,562 2 260 stop
+--- 600,562 2 261 tab
+u2026 600,116,15 0 262 ellipsis
+--- 600,333 0 263 largebullet
+u0073_0327 600,459,206 1 264 scedilla
+--- 600,562 2 265 return
+ij 600,658,146 3 266 ij
+--- 600,562,0,45,45 2 267 LL
+--- 600,562 2 268 square
+da 600,608,15 2 269 arrowdown
+<- 600,455,0,34,24 0 270 arrowleft
+<> 600,455,0,24,24 0 271 arrowboth
+--- 600,599 2 272 graybox
+-> 600,455,0,24,34 0 273 arrowright
+u00AF 600,629 2 274 overscore
+--- 600,626,0,0,12 2 275 ll
+u0067_030C 600,667,146 3 276 gcaron
+u20A4 600,611,28 2 277 lira
+--- 600,580 2 278 center
+u0053_0327 600,582,206 3 279 Scedilla
+--- 600,601,146 3 280 format
+ua 600,626 2 281 arrowup
+--- 600,572,15 2 282 notegraphic
+u211E 600,562,15 2 283 prescription
+--- 600,372 0 284 indent
+--- 600,439,15 0 285 down
+--- 600,371 0 286 left
+u0049_0307 600,748 2 287 Idot
+--- 600,487,15 0 288 merge
diff --git a/font/devps/old/CBI b/font/devps/old/CBI
new file mode 100644
index 0000000..27976db
--- /dev/null
+++ b/font/devps/old/CBI
@@ -0,0 +1,282 @@
+name CBI
+internalname Courier-BoldOblique
+slant 12
+spacewidth 600
+encoding text.enc
+charset
+ha 600,616,0,5,-121,5 2 0 asciicircum
+ti 600,356,0,39,-70,39 0 1 asciitilde
+vS 600,790,22,122,-4,75 2 2 Scaron
+vZ 600,790,0,109,-12,75 2 3 Zcaron
+vs 600,667,17,82,-17,75 2 4 scaron
+vz 600,667,0,82,-31,75 2 5 zcaron
+:Y 600,748,0,158,-59,75 2 6 Ydieresis
+tm 600,562,0,318,-36,75 2 7 trademark
+aq 600,562,0,0,-254 2 8 quotesingle
+space 600 0 32 space
+! 600,572,15,0,-166 2 33 exclam
+" 600,562,0,34,-162,34 2 34 quotedbl
+dq "
+# 600,651,45,90,-38,75 2 35 numbersign
+sh "
+$ 600,666,126,79,-37,75 2 36 dollar
+Do "
+% 600,616,15,74,-52,74 2 37 percent
+& 600,543,15,44,-12,44 0 38 ampersand
+' 600,562,0,0,-180 2 39 quoteright
+cq "
+( 600,616,102,42,-216,42 2 40 parenleft
+) 600,616,102,0,-67 2 41 parenright
+* 600,601,0,47,-129,47 2 42 asterisk
++ 600,478,0,46,-64,46 0 43 plus
+, 600,174,111,0,-49 0 44 comma
+- 600,313,0,17,-93,17 0 45 hyphen
+hy "
+. 600,171,15,0,-157 0 46 period
+/ 600,626,77,76,-41,75 2 47 slash
+sl "
+0 600,616,15,42,-86,42 2 48 zero
+1 600,616,0,11,-43,11 2 49 one
+2 600,616,0,43,-11,43 2 50 two
+3 600,616,15,21,-22,21 2 51 three
+4 600,616,0,8,-32,8 2 52 four
+5 600,601,15,71,-27,71 2 53 five
+6 600,616,15,102,-86,75 2 54 six
+7 600,601,0,72,-97,72 2 55 seven
+8 600,616,15,54,-65,54 2 56 eight
+9 600,616,15,42,-26,42 2 57 nine
+: 600,425,15,0,-156 0 58 colon
+; 600,425,111,0,-49 0 59 semicolon
+< 600,501,0,62,-71,62 0 60 less
+= 600,398,0,64,-46,64 0 61 equal
+> 600,501,0,39,-47,39 0 62 greater
+? 600,580,14,41,-133,41 2 63 question
+@ 600,616,15,91,-16,75 2 64 at
+at "
+A 600,562,0,81,59,75 2 65 A
+B 600,562,0,79,20,75 2 66 B
+C 600,580,18,124,-25,75 2 67 C
+D 600,562,0,114,20,75 2 68 D
+E 600,562,0,119,25,75 2 69 E
+F 600,562,0,133,11,75 2 70 F
+G 600,580,18,124,-25,75 2 71 G
+H 600,562,0,149,30,75 2 72 H
+I 600,562,0,92,-27,75 2 73 I
+J 600,562,18,170,-9,75 2 74 J
+K 600,562,0,141,29,75 2 75 K
+L 600,562,0,85,11,75 2 76 L
+M 600,562,0,171,52,75 2 77 M
+N 600,562,12,179,42,75 2 78 N
+O 600,580,18,95,-24,75 2 79 O
+P 600,562,0,92,2,75 2 80 P
+Q 600,580,138,86,-34,75 2 81 Q
+R 600,562,0,67,26,67 2 82 R
+S 600,582,22,122,-4,75 2 83 S
+T 600,562,0,128,-36,75 2 84 T
+U 600,562,18,165,-51,75 2 85 U
+V 600,562,0,182,-34,75 2 86 V
+W 600,562,0,187,-34,75 2 87 W
+X 600,562,0,139,38,75 2 88 X
+Y 600,562,0,158,-59,75 2 89 Y
+Z 600,562,0,86,-12,75 2 90 Z
+[ 600,616,102,56,-173,56 2 91 bracketleft
+lB "
+\ 600,626,77,0,-173 2 92 backslash
+rs "
+] 600,616,102,0,-53 2 93 bracketright
+rB "
+a^ 600,657,0,56,-162,56 2 94 circumflex
+^ "
+_ 600,0,125,34,77,34 0 95 underscore
+` 600,562,0,0,-247 2 96 quoteleft
+oq "
+a 600,454,15,42,-12,42 0 97 a
+b 600,626,15,86,37,75 2 98 b
+c 600,459,15,81,-31,75 0 99 c
+d 600,626,15,94,-11,75 2 100 d
+e 600,454,15,54,-31,54 0 101 e
+f 600,626,0,127,-33,75 2 102 f
+g 600,454,146,123,9,75 1 103 g
+h 600,626,0,64,32,64 2 104 h
+i 600,658,0,0,-27 2 105 i
+j 600,658,146,30,13,30 3 106 j
+k 600,626,0,92,17,75 2 107 k
+l 600,626,0,0,-27 2 108 l
+m 600,454,0,98,72,75 0 109 m
+n 600,454,0,64,32,64 0 110 n
+o 600,454,15,72,-21,72 0 111 o
+p 600,454,142,72,81,72 1 112 p
+q 600,454,142,134,-11,75 1 113 q
+r 600,454,0,104,3,75 0 114 r
+s 600,459,17,57,-17,57 0 115 s
+t 600,562,15,16,-68,16 2 116 t
+u 600,439,15,41,-20,41 0 117 u
+v 600,439,0,144,-20,75 0 118 v
+w 600,439,0,161,-3,75 0 119 w
+x 600,439,0,120,44,75 0 120 x
+y 600,439,142,144,70,75 1 121 y
+z 600,439,0,63,-31,63 0 122 z
+lC 600,616,102,45,-154,45 2 123 braceleft
+{ "
+ba 600,750,250,0,-152 3 124 bar
+| "
+rC 600,616,102,0,-64 2 125 braceright
+} "
+a~ 600,636,0,92,-150,75 2 126 tilde
+~ "
+bq 600,143,142,0,-95 1 128 quotesinglbase
+Fo 600,446,0,88,-13,75 0 129 guillemotleft
+Fc 600,446,0,97,-22,75 0 130 guillemotright
+bu 600,430,0,0,-147 0 131 bullet
+Fn 600,616,131,151,106,75 2 132 florin
+f/ 600,661,60,157,28,75 2 133 fraction
+%0 600,616,15,192,94,75 2 134 perthousand
+dg 600,580,70,36,-126,36 2 135 dagger
+dd 600,580,70,36,-72,36 2 136 daggerdbl
+en 600,313,0,52,-58,52 0 137 endash
+em 600,313,0,127,17,75 0 138 emdash
+fi 600,626,0,93,38,75 2 140 fi
+fl 600,626,0,93,38,75 2 141 fl
+.i 600,439,0,0,-27 0 144 dotlessi
+ga 600,661,0,0,-222 2 146 grave
+a" 600,661,0,178,-122,75 2 147 hungarumlaut
+a. 600,625,0,0,-296 2 148 dotaccent
+ab 600,631,0,101,-167,75 2 149 breve
+ah 600,667,0,82,-188,75 2 150 caron
+ao 600,678,0,0,-269 2 151 ring
+ho 600,0,199,0,-94 1 152 ogonek
+lq 600,562,0,44,-140,44 2 153 quotedblleft
+rq 600,562,0,94,-70,75 2 154 quotedblright
+oe 600,454,15,111,31,75 0 155 oe
+/l 600,626,0,28,-27,28 2 156 lslash
+Bq 600,143,142,9,15,9 1 157 quotedblbase
+OE 600,562,0,150,24,75 2 158 OE
+/L 600,562,0,85,11,75 2 159 Lslash
+r! 600,449,146,0,-147 1 161 exclamdown
+ct 600,614,49,54,-71,54 2 162 cent
+Po 600,611,28,100,-57,75 2 163 sterling
+Cs 600,517,0,93,-27,75 0 164 currency
+Ye 600,562,0,159,-48,75 2 165 yen
+bb 600,675,175,0,-168 3 166 brokenbar
+sc 600,580,70,69,-24,69 2 167 section
+ad 600,625,0,42,-194,42 2 168 dieresis
+co 600,580,18,117,-3,75 2 169 copyright
+Of 600,580,0,0,-139 2 170 ordfeminine
+fo 600,446,0,0,-146 0 171 guilsinglleft
+tno 600,413,0,67,-85,67 0 172 logicalnot
+\- 600,313,0,46,-64,46 0 173 minus
+rg 600,580,18,117,-3,75 2 174 registered
+a- 600,585,0,86,-145,75 2 175 macron
+de 600,616,0,19,-123,19 2 176 degree
+t+- 600,515,0,64,-26,64 0 177 plusminus
+S2 600,616,0,0,-142 2 178 twosuperior
+S3 600,616,0,0,-143 2 179 threesuperior
+aa 600,661,0,58,-263,58 2 180 acute
+mc 600,439,142,41,0,41 1 181 mu
+ps 600,580,70,149,-11,75 2 182 paragraph
+pc 600,351,0,0,-199 0 183 periodcentered
+ac 600,0,206,0,-119 1 184 cedilla
+S1 600,616,0,0,-163 2 185 onesuperior
+Om 600,580,0,0,-139 2 186 ordmasculine
+fc 600,446,0,0,-116 0 187 guilsinglright
+14 600,661,60,156,36,75 2 188 onequarter
+12 600,661,60,165,27,75 2 189 onehalf
+34 600,661,60,148,42,75 2 190 threequarters
+r? 600,449,146,0,-51 1 191 questiondown
+`A 600,784,0,81,59,75 2 192 Agrave
+'A 600,784,0,115,59,75 2 193 Aacute
+^A 600,780,0,81,59,75 2 194 Acircumflex
+~A 600,759,0,88,59,75 2 195 Atilde
+:A 600,748,0,81,59,75 2 196 Adieresis
+oA 600,801,0,81,59,75 2 197 Aring
+AE 600,562,0,157,79,75 2 198 AE
+,C 600,580,206,124,-24,75 3 199 Ccedilla
+`E 600,784,0,119,25,75 2 200 Egrave
+'E 600,784,0,119,25,75 2 201 Eacute
+^E 600,780,0,119,25,75 2 202 Ecircumflex
+:E 600,748,0,119,25,75 2 203 Edieresis
+`I 600,784,0,92,-27,75 2 204 Igrave
+'I 600,784,0,92,-27,75 2 205 Iacute
+^I 600,780,0,92,-27,75 2 206 Icircumflex
+:I 600,748,0,92,-27,75 2 207 Idieresis
+-D 600,562,0,114,20,75 2 208 Eth
+~N 600,759,12,179,42,75 2 209 Ntilde
+`O 600,784,18,95,-24,75 2 210 Ograve
+'O 600,784,18,95,-24,75 2 211 Oacute
+^O 600,780,18,95,-24,75 2 212 Ocircumflex
+~O 600,759,18,118,-24,75 2 213 Otilde
+:O 600,748,18,95,-24,75 2 214 Odieresis
+tmu 600,478,0,56,-55,56 0 215 multiply
+/O 600,584,22,122,2,75 2 216 Oslash
+`U 600,784,18,165,-51,75 2 217 Ugrave
+'U 600,784,18,165,-51,75 2 218 Uacute
+^U 600,780,18,165,-51,75 2 219 Ucircumflex
+:U 600,748,18,165,-51,75 2 220 Udieresis
+'Y 600,784,0,158,-59,75 2 221 Yacute
+TP 600,562,0,69,2,69 2 222 Thorn
+ss 600,626,15,78,28,75 2 223 germandbls
+`a 600,661,15,42,-12,42 2 224 agrave
+'a 600,661,15,58,-12,58 2 225 aacute
+^a 600,657,15,42,-12,42 2 226 acircumflex
+~a 600,636,15,92,-12,75 2 227 atilde
+:a 600,625,15,42,-12,42 2 228 adieresis
+oa 600,678,15,42,-12,42 2 229 aring
+ae 600,454,15,101,29,75 0 230 ae
+,c 600,459,206,81,-31,75 1 231 ccedilla
+`e 600,661,15,54,-31,54 2 232 egrave
+'e 600,661,15,58,-31,58 2 233 eacute
+^e 600,657,15,56,-31,56 2 234 ecircumflex
+:e 600,625,15,54,-31,54 2 235 edieresis
+`i 600,661,0,0,-27 2 236 igrave
+'i 600,661,0,58,-27,58 2 237 iacute
+^i 600,657,0,16,-27,16 2 238 icircumflex
+:i 600,625,0,2,-27,2 2 239 idieresis
+Sd 600,626,27,111,-43,75 2 240 eth
+~n 600,636,0,92,32,75 2 241 ntilde
+`o 600,661,15,72,-21,72 2 242 ograve
+'o 600,661,15,72,-21,72 2 243 oacute
+^o 600,657,15,72,-21,72 2 244 ocircumflex
+~o 600,636,15,92,-21,75 2 245 otilde
+:o 600,625,15,72,-21,72 2 246 odieresis
+tdi 600,500,0,46,-64,46 0 247 divide
+/o 600,463,24,87,-5,75 0 248 oslash
+`u 600,661,15,41,-20,41 2 249 ugrave
+'u 600,661,15,58,-20,58 2 250 uacute
+^u 600,657,15,41,-20,41 2 251 ucircumflex
+:u 600,625,15,41,-20,41 2 252 udieresis
+'y 600,661,142,144,70,75 3 253 yacute
+Tp 600,626,142,72,81,72 3 254 thorn
+:y 600,625,142,144,70,75 3 255 ydieresis
+IJ 600,562,18,191,58,75 2 256 IJ
+--- 600,447,0,0,-146 0 257 up
+--- 600,320,0,65,42,65 0 258 dectab
+u0047_030C 600,790,18,124,-25,75 2 259 Gcaron
+--- 600,562,0,150,31,75 2 260 stop
+--- 600,562,0,91,31,75 2 261 tab
+u2026 600,116,15,36,15,36 0 262 ellipsis
+--- 600,333,0,0,-257 0 263 largebullet
+u0073_0327 600,459,206,57,-17,57 1 264 scedilla
+--- 600,562,0,150,-29,75 2 265 return
+ij 600,658,146,164,44,75 3 266 ij
+--- 600,562,0,144,95,75 2 267 LL
+--- 600,562,0,150,31,75 2 268 square
+da 600,608,15,0,-124 2 269 arrowdown
+<- 600,455,0,158,10,75 0 270 arrowleft
+<> 600,455,0,138,10,75 0 271 arrowboth
+--- 600,599,0,102,-26,75 2 272 graybox
+-> 600,455,0,138,30,75 0 273 arrowright
+u00AF 600,629,0,184,-73,75 2 274 overscore
+--- 600,626,0,103,49,75 2 275 ll
+u0067_030C 600,667,146,123,9,75 3 276 gcaron
+u20A4 600,611,28,100,-57,75 2 277 lira
+--- 600,580,0,73,-53,73 2 278 center
+u0053_0327 600,582,206,122,-4,75 3 279 Scedilla
+--- 600,601,146,0,76 3 280 format
+ua 600,626,0,6,-194,6 2 281 arrowup
+--- 600,572,15,69,-41,69 2 282 notegraphic
+u211E 600,562,15,82,26,75 2 283 prescription
+--- 600,372,0,29,-49,29 0 284 indent
+--- 600,439,15,0,-118 0 285 down
+--- 600,371,0,39,-59,39 0 286 left
+u0049_0307 600,748,0,92,-27,75 2 287 Idot
+--- 600,487,15,0,-118 0 288 merge
diff --git a/font/devps/old/CI b/font/devps/old/CI
new file mode 100644
index 0000000..7d7582d
--- /dev/null
+++ b/font/devps/old/CI
@@ -0,0 +1,282 @@
+name CI
+internalname Courier-Oblique
+slant 12
+spacewidth 600
+encoding text.enc
+charset
+ha 600,622,0,37,-125,37 2 0 asciicircum
+ti 600,320,0,50,-66,50 0 1 asciitilde
+vS 600,805,20,123,-26,72 2 2 Scaron
+vZ 600,805,0,93,-36,72 2 3 Zcaron
+vs 600,669,15,64,-28,64 2 4 scaron
+vz 600,669,0,74,-49,72 2 5 zcaron
+:Y 600,731,0,145,-83,72 2 6 Ydieresis
+tm 600,562,0,192,-25,72 2 7 trademark
+aq 600,562,0,0,-295 2 8 quotesingle
+space 600 0 32 space
+! 600,572,15,0,-193 2 33 exclam
+" 600,562,0,0,-223 2 34 quotedbl
+dq "
+# 600,639,32,46,-83,46 2 35 numbersign
+sh "
+$ 600,662,126,46,-58,46 2 36 dollar
+Do "
+% 600,622,15,49,-84,49 2 37 percent
+& 600,543,15,30,-37,30 0 38 ampersand
+' 600,562,0,0,-233 2 39 quoteright
+cq "
+( 600,622,108,22,-263,22 2 40 parenleft
+) 600,622,108,0,-87 2 41 parenright
+* 600,607,0,30,-162,30 2 42 asterisk
++ 600,470,0,30,-79,30 0 43 plus
+, 600,122,112,0,-107 0 44 comma
+- 600,285,0,8,-102,8 0 45 hyphen
+hy "
+. 600,109,15,0,-188 0 46 period
+/ 600,629,80,54,-62,54 2 47 slash
+sl "
+0 600,622,15,25,-104,25 2 48 zero
+1 600,622,0,0,-48 2 49 one
+2 600,622,0,18,-20,18 2 50 two
+3 600,622,15,0,-32 2 51 three
+4 600,622,0,0,-58 2 52 four
+5 600,607,15,39,-49,39 2 53 five
+6 600,622,15,79,-105,72 2 54 six
+7 600,607,0,62,-132,62 2 55 seven
+8 600,622,15,38,-82,38 2 56 eight
+9 600,622,15,24,-43,24 2 57 nine
+: 600,385,15,0,-188 0 58 colon
+; 600,385,112,0,-107 0 59 semicolon
+< 600,472,0,60,-46,60 0 60 less
+= 600,376,0,50,-59,50 0 61 equal
+> 600,472,0,49,-35,49 0 62 greater
+? 600,572,15,33,-172,33 2 63 question
+@ 600,622,15,32,-77,32 2 64 at
+at "
+A 600,562,0,57,47,57 2 65 A
+B 600,562,0,66,7,66 2 66 B
+C 600,580,18,105,-43,72 2 67 C
+D 600,562,0,95,7,72 2 68 D
+E 600,562,0,110,-3,72 2 69 E
+F 600,562,0,110,-3,72 2 70 F
+G 600,580,18,95,-33,72 2 71 G
+H 600,562,0,137,18,72 2 72 H
+I 600,562,0,73,-46,72 2 73 I
+J 600,562,18,135,-2,72 2 74 J
+K 600,562,0,121,12,72 2 75 K
+L 600,562,0,57,3,57 2 76 L
+M 600,562,0,165,46,72 2 77 M
+N 600,562,13,162,43,72 2 78 N
+O 600,580,18,75,-44,72 2 79 O
+P 600,562,0,94,-29,72 2 80 P
+Q 600,580,138,75,-45,72 2 81 Q
+R 600,562,0,48,12,48 2 82 R
+S 600,580,20,100,-26,72 2 83 S
+T 600,562,0,115,-58,72 2 84 T
+U 600,562,18,152,-75,72 2 85 U
+V 600,562,13,173,-55,72 2 86 V
+W 600,562,13,172,-56,72 2 87 W
+X 600,562,0,125,27,72 2 88 X
+Y 600,562,0,145,-83,72 2 89 Y
+Z 600,562,0,60,-36,60 2 90 Z
+[ 600,622,108,24,-196,24 2 91 bracketleft
+lB "
+\ 600,629,80,0,-199 2 92 backslash
+rs "
+] 600,622,108,0,-85 2 93 bracketright
+rB "
+a^ 600,654,0,31,-179,31 2 94 circumflex
+^ "
+_ 600,0,125,34,77,34 0 95 underscore
+` 600,562,0,0,-293 2 96 quoteleft
+oq "
+a 600,441,15,19,-26,19 0 97 a
+b 600,629,15,75,21,72 2 98 b
+c 600,441,15,58,-56,58 0 99 c
+d 600,629,15,90,-35,72 2 100 d
+e 600,441,15,48,-56,48 0 101 e
+f 600,629,0,112,-64,72 2 102 f
+g 600,441,157,107,-11,72 1 103 g
+h 600,629,0,42,17,42 2 104 h
+i 600,657,0,0,-45 2 105 i
+j 600,657,157,0,-2 3 106 j
+k 600,629,0,83,-8,72 2 107 k
+l 600,629,0,0,-45 2 108 l
+m 600,441,0,65,55,65 0 109 m
+n 600,441,0,35,24,35 0 110 n
+o 600,441,15,38,-52,38 0 111 o
+p 600,441,157,55,74,55 1 112 p
+q 600,441,157,132,-35,72 1 113 q
+r 600,441,0,86,-10,72 0 114 r
+s 600,441,15,34,-28,34 0 115 s
+t 600,561,15,11,-117,11 2 116 t
+u 600,426,15,22,-51,22 0 117 u
+v 600,426,10,131,-40,72 0 118 v
+w 600,426,10,145,-26,72 0 119 w
+x 600,426,0,105,30,72 0 120 x
+y 600,426,157,133,54,72 1 121 y
+z 600,426,0,43,-49,43 0 122 z
+lC 600,622,108,19,-183,19 2 123 braceleft
+{ "
+ba 600,750,250,0,-172 3 124 bar
+| "
+rC 600,622,108,0,-90 2 125 braceright
+} "
+a~ 600,606,0,79,-162,72 2 126 tilde
+~ "
+bq 600,100,134,0,-135 0 128 quotesinglbase
+Fo 600,446,0,102,-42,72 0 129 guillemotleft
+Fc 600,446,0,68,-8,68 0 130 guillemotright
+bu 600,383,0,0,-174 0 131 bullet
+Fn 600,622,143,121,76,72 2 132 florin
+f/ 600,665,57,96,-34,72 2 133 fraction
+%0 600,622,15,77,-9,72 2 134 perthousand
+dg 600,580,78,0,-167 2 135 dagger
+dd 600,580,78,0,-113 2 136 daggerdbl
+en 600,285,0,36,-74,36 0 137 endash
+em 600,285,0,111,1,72 0 138 emdash
+fi 600,629,0,69,47,69 2 140 fi
+fl 600,629,0,69,47,69 2 141 fl
+.i 600,426,0,0,-45 0 144 dotlessi
+ga 600,672,0,0,-244 2 146 grave
+a" 600,672,0,133,-189,72 2 147 hungarumlaut
+a. 600,580,0,0,-310 2 148 dotaccent
+ab 600,609,0,26,-229,26 2 149 breve
+ah 600,669,0,64,-212,64 2 150 caron
+ao 600,627,0,0,-282 2 151 ring
+ho 600,0,151,0,-157 0 152 ogonek
+lq 600,562,0,0,-212 2 153 quotedblleft
+rq 600,562,0,26,-163,26 2 154 quotedblright
+oe 600,441,15,65,-4,65 0 155 oe
+/l 600,629,0,33,-45,33 2 156 lslash
+Bq 600,100,134,0,-65 0 157 quotedblbase
+OE 600,562,0,122,-9,72 2 158 OE
+/L 600,562,0,57,3,57 2 159 Lslash
+r! 600,430,157,0,-175 1 161 exclamdown
+ct 600,614,49,38,-101,38 2 162 cent
+Po 600,611,21,71,-74,71 2 163 sterling
+Cs 600,506,0,78,-44,72 0 164 currency
+Ye 600,562,0,143,-70,72 2 165 yen
+bb 600,675,175,0,-188 3 166 brokenbar
+sc 600,580,78,40,-54,40 2 167 section
+ad 600,595,0,20,-212,20 2 168 dieresis
+co 600,580,18,117,-3,72 2 169 copyright
+Of 600,580,0,0,-159 2 170 ordfeminine
+fo 600,446,0,0,-154 0 171 guilsinglleft
+tno 600,369,0,41,-105,41 0 172 logicalnot
+\- 600,283,0,30,-79,30 0 173 minus
+rg 600,580,18,117,-3,72 2 174 registered
+a- 600,565,0,50,-182,50 2 175 macron
+de 600,622,0,26,-164,26 2 176 degree
+t+- 600,558,0,44,-46,44 0 177 plusminus
+S2 600,622,0,0,-180 2 178 twosuperior
+S3 600,622,0,0,-163 2 179 threesuperior
+aa 600,672,0,62,-298,62 2 180 acute
+mc 600,426,157,22,-22,22 1 181 mu
+ps 600,562,78,80,-50,72 2 182 paragraph
+pc 600,327,0,0,-225 0 183 periodcentered
+ac 600,10,151,0,-147 0 184 cedilla
+S1 600,622,0,0,-181 2 185 onesuperior
+Om 600,580,0,0,-160 2 186 ordmasculine
+fc 600,446,0,0,-120 0 187 guilsinglright
+14 600,665,57,124,-15,72 2 188 onequarter
+12 600,665,57,119,-15,72 2 189 onehalf
+34 600,666,56,109,-23,72 2 190 threequarters
+r? 600,430,157,0,-55 1 191 questiondown
+`A 600,793,0,57,47,57 2 192 Agrave
+'A 600,793,0,108,47,72 2 193 Aacute
+^A 600,775,0,57,47,57 2 194 Acircumflex
+~A 600,732,0,106,47,72 2 195 Atilde
+:A 600,731,0,57,47,57 2 196 Adieresis
+oA 600,753,0,57,47,57 2 197 Aring
+AE 600,562,0,105,47,72 2 198 AE
+,C 600,580,151,108,-43,72 2 199 Ccedilla
+`E 600,793,0,110,-3,72 2 200 Egrave
+'E 600,793,0,118,-3,72 2 201 Eacute
+^E 600,775,0,110,-3,72 2 202 Ecircumflex
+:E 600,731,0,110,-3,72 2 203 Edieresis
+`I 600,793,0,73,-46,72 2 204 Igrave
+'I 600,793,0,88,-46,72 2 205 Iacute
+^I 600,775,0,73,-46,72 2 206 Icircumflex
+:I 600,731,0,73,-46,72 2 207 Idieresis
+-D 600,562,0,95,7,72 2 208 Eth
+~N 600,732,13,162,43,72 2 209 Ntilde
+`O 600,793,18,75,-44,72 2 210 Ograve
+'O 600,793,18,88,-44,72 2 211 Oacute
+^O 600,775,18,75,-44,72 2 212 Ocircumflex
+~O 600,732,18,106,-44,72 2 213 Otilde
+:O 600,731,18,75,-44,72 2 214 Odieresis
+tmu 600,470,0,57,-53,57 0 215 multiply
+/O 600,629,80,75,-44,72 2 216 Oslash
+`U 600,793,18,152,-75,72 2 217 Ugrave
+'U 600,793,18,152,-75,72 2 218 Uacute
+^U 600,775,18,152,-75,72 2 219 Ucircumflex
+:U 600,731,18,152,-75,72 2 220 Udieresis
+'Y 600,793,0,145,-83,72 2 221 Yacute
+TP 600,562,0,56,-29,56 2 222 Thorn
+ss 600,629,15,67,2,67 2 223 germandbls
+`a 600,672,15,19,-26,19 2 224 agrave
+'a 600,672,15,62,-26,62 2 225 aacute
+^a 600,654,15,31,-26,31 2 226 acircumflex
+~a 600,606,15,79,-26,72 2 227 atilde
+:a 600,595,15,20,-26,20 2 228 adieresis
+oa 600,627,15,19,-26,19 2 229 aring
+ae 600,441,15,76,9,72 0 230 ae
+,c 600,441,151,64,-56,64 0 231 ccedilla
+`e 600,672,15,48,-56,48 2 232 egrave
+'e 600,672,15,62,-56,62 2 233 eacute
+^e 600,654,15,48,-56,48 2 234 ecircumflex
+:e 600,595,15,48,-56,48 2 235 edieresis
+`i 600,672,0,0,-45 2 236 igrave
+'i 600,672,0,62,-45,62 2 237 iacute
+^i 600,654,0,1,-45,1 2 238 icircumflex
+:i 600,595,0,0,-45 2 239 idieresis
+Sd 600,629,15,89,-52,72 2 240 eth
+~n 600,606,0,79,24,72 2 241 ntilde
+`o 600,672,15,38,-52,38 2 242 ograve
+'o 600,672,15,62,-52,62 2 243 oacute
+^o 600,654,15,38,-52,38 2 244 ocircumflex
+~o 600,606,15,79,-52,72 2 245 otilde
+:o 600,595,15,38,-52,38 2 246 odieresis
+tdi 600,467,0,23,-86,23 0 247 divide
+/o 600,506,80,38,-52,38 0 248 oslash
+`u 600,672,15,22,-51,22 2 249 ugrave
+'u 600,672,15,52,-51,52 2 250 uacute
+^u 600,654,15,22,-51,22 2 251 ucircumflex
+:u 600,595,15,22,-51,22 2 252 udieresis
+'y 600,672,157,133,54,72 3 253 yacute
+Tp 600,629,157,55,74,55 3 254 thorn
+:y 600,595,157,133,54,72 3 255 ydieresis
+IJ 600,562,18,152,18,72 2 256 IJ
+--- 600,437,0,0,-173 0 257 up
+--- 600,227,0,43,32,43 0 258 dectab
+u0047_030C 600,805,18,95,-33,72 2 259 Gcaron
+--- 600,562,0,150,31,72 2 260 stop
+--- 600,562,0,91,31,72 2 261 tab
+u2026 600,111,15,25,4,25 0 262 ellipsis
+--- 600,297,0,0,-265 0 263 largebullet
+u0073_0327 600,441,151,34,-28,34 0 264 scedilla
+--- 600,562,0,150,-29,72 2 265 return
+ij 600,657,157,80,13,72 3 266 ij
+--- 600,562,0,97,42,72 2 267 LL
+--- 600,562,0,150,31,72 2 268 square
+da 600,608,15,0,-102 2 269 arrowdown
+<- 600,483,0,143,10,72 0 270 arrowleft
+<> 600,483,0,142,14,72 0 271 arrowboth
+--- 600,599,0,102,-26,72 2 272 graybox
+-> 600,483,0,138,16,72 0 273 arrowright
+u00AF 600,629,0,184,-73,72 2 274 overscore
+--- 600,629,0,66,17,66 2 275 ll
+u0067_030C 600,669,157,107,-11,72 3 276 gcaron
+u20A4 600,611,21,71,-68,71 2 277 lira
+--- 600,580,0,73,-53,72 2 278 center
+u0053_0327 600,580,151,100,-26,72 2 279 Scedilla
+--- 600,607,157,0,78 3 280 format
+ua 600,623,0,27,-159,27 2 281 arrowup
+--- 600,572,15,14,-93,14 2 282 notegraphic
+u211E 600,562,15,67,23,67 2 283 prescription
+--- 600,348,0,24,-58,24 0 284 indent
+--- 600,426,15,0,-137 0 285 down
+--- 600,348,0,30,-64,30 0 286 left
+u0049_0307 600,716,0,73,-46,72 2 287 Idot
+--- 600,436,15,0,-137 0 288 merge
diff --git a/font/devps/old/CR b/font/devps/old/CR
new file mode 100644
index 0000000..df19421
--- /dev/null
+++ b/font/devps/old/CR
@@ -0,0 +1,281 @@
+name CR
+internalname Courier
+spacewidth 600
+encoding text.enc
+charset
+ha 600,622 2 0 asciicircum
+ti 600,320 0 1 asciitilde
+vS 600,805,20 2 2 Scaron
+vZ 600,805 2 3 Zcaron
+vs 600,669,15 2 4 scaron
+vz 600,669 2 5 zcaron
+:Y 600,731 2 6 Ydieresis
+tm 600,562,0,23,23 2 7 trademark
+aq 600,562 2 8 quotesingle
+space 600 0 32 space
+! 600,572,15 2 33 exclam
+" 600,562 2 34 quotedbl
+dq "
+# 600,639,32 2 35 numbersign
+sh "
+$ 600,662,126 2 36 dollar
+Do "
+% 600,622,15 2 37 percent
+& 600,543,15 0 38 ampersand
+' 600,562 2 39 quoteright
+cq "
+( 600,622,108 2 40 parenleft
+) 600,622,108 2 41 parenright
+* 600,607 2 42 asterisk
++ 600,470 0 43 plus
+, 600,122,112 0 44 comma
+- 600,285 0 45 hyphen
+hy "
+. 600,109,15 0 46 period
+/ 600,629,80 2 47 slash
+sl "
+0 600,622,15 2 48 zero
+1 600,622 2 49 one
+2 600,622 2 50 two
+3 600,622,15 2 51 three
+4 600,622 2 52 four
+5 600,607,15 2 53 five
+6 600,622,15 2 54 six
+7 600,607 2 55 seven
+8 600,622,15 2 56 eight
+9 600,622,15 2 57 nine
+: 600,385,15 0 58 colon
+; 600,385,112 0 59 semicolon
+< 600,472 0 60 less
+= 600,376 0 61 equal
+> 600,472 0 62 greater
+? 600,572,15 2 63 question
+@ 600,622,15 2 64 at
+at "
+A 600,562 2 65 A
+B 600,562 2 66 B
+C 600,580,18 2 67 C
+D 600,562 2 68 D
+E 600,562 2 69 E
+F 600,562 2 70 F
+G 600,580,18 2 71 G
+H 600,562 2 72 H
+I 600,562 2 73 I
+J 600,562,18 2 74 J
+K 600,562 2 75 K
+L 600,562 2 76 L
+M 600,562 2 77 M
+N 600,562,13 2 78 N
+O 600,580,18 2 79 O
+P 600,562 2 80 P
+Q 600,580,138 2 81 Q
+R 600,562 2 82 R
+S 600,580,20 2 83 S
+T 600,562 2 84 T
+U 600,562,18 2 85 U
+V 600,562,13,4,4 2 86 V
+W 600,562,13,3,3 2 87 W
+X 600,562 2 88 X
+Y 600,562 2 89 Y
+Z 600,562 2 90 Z
+[ 600,622,108 2 91 bracketleft
+lB "
+\ 600,629,80 2 92 backslash
+rs "
+] 600,622,108 2 93 bracketright
+rB "
+a^ 600,654 2 94 circumflex
+^ "
+_ 600,0,125 0 95 underscore
+` 600,562 2 96 quoteleft
+oq "
+a 600,441,15 0 97 a
+b 600,629,15 2 98 b
+c 600,441,15 0 99 c
+d 600,629,15 2 100 d
+e 600,441,15 0 101 e
+f 600,629 2 102 f
+g 600,441,157 1 103 g
+h 600,629 2 104 h
+i 600,657 2 105 i
+j 600,657,157 3 106 j
+k 600,629 2 107 k
+l 600,629 2 108 l
+m 600,441,0,5,5 0 109 m
+n 600,441 0 110 n
+o 600,441,15 0 111 o
+p 600,441,157 1 112 p
+q 600,441,157 1 113 q
+r 600,441 0 114 r
+s 600,441,15 0 115 s
+t 600,561,15 2 116 t
+u 600,426,15 0 117 u
+v 600,426,10 0 118 v
+w 600,426,10,4,4 0 119 w
+x 600,426 0 120 x
+y 600,426,157 1 121 y
+z 600,426 0 122 z
+lC 600,622,108 2 123 braceleft
+{ "
+ba 600,750,250 3 124 bar
+| "
+rC 600,622,108 2 125 braceright
+} "
+a~ 600,606 2 126 tilde
+~ "
+bq 600,100,134 0 128 quotesinglbase
+Fo 600,446 0 129 guillemotleft
+Fc 600,446 0 130 guillemotright
+bu 600,383 0 131 bullet
+Fn 600,622,143 2 132 florin
+f/ 600,665,57 2 133 fraction
+%0 600,622,15 2 134 perthousand
+dg 600,580,78 2 135 dagger
+dd 600,580,78 2 136 daggerdbl
+en 600,285 0 137 endash
+em 600,285 0 138 emdash
+fi 600,629 2 140 fi
+fl 600,629 2 141 fl
+.i 600,426 0 144 dotlessi
+ga 600,672 2 146 grave
+a" 600,672 2 147 hungarumlaut
+a. 600,580 2 148 dotaccent
+ab 600,609 2 149 breve
+ah 600,669 2 150 caron
+ao 600,627 2 151 ring
+ho 600,0,151 0 152 ogonek
+lq 600,562 2 153 quotedblleft
+rq 600,562 2 154 quotedblright
+oe 600,441,15 0 155 oe
+/l 600,629 2 156 lslash
+Bq 600,100,134 0 157 quotedblbase
+OE 600,562 2 158 OE
+/L 600,562 2 159 Lslash
+r! 600,430,157 1 161 exclamdown
+ct 600,614,49 2 162 cent
+Po 600,611,21 2 163 sterling
+Cs 600,506 0 164 currency
+Ye 600,562 2 165 yen
+bb 600,675,175 3 166 brokenbar
+sc 600,580,78 2 167 section
+ad 600,595 2 168 dieresis
+co 600,580,18 2 169 copyright
+Of 600,580 2 170 ordfeminine
+fo 600,446 0 171 guilsinglleft
+tno 600,369 0 172 logicalnot
+\- 600,283 0 173 minus
+rg 600,580,18 2 174 registered
+a- 600,565 2 175 macron
+de 600,622 2 176 degree
+t+- 600,558 0 177 plusminus
+S2 600,622 2 178 twosuperior
+S3 600,622 2 179 threesuperior
+aa 600,672 2 180 acute
+mc 600,426,157 1 181 mu
+ps 600,562,78 2 182 paragraph
+pc 600,327 0 183 periodcentered
+ac 600,10,151 0 184 cedilla
+S1 600,622 2 185 onesuperior
+Om 600,580 2 186 ordmasculine
+fc 600,446 0 187 guilsinglright
+14 600,665,57 2 188 onequarter
+12 600,665,57,11 2 189 onehalf
+34 600,666,56 2 190 threequarters
+r? 600,430,157 1 191 questiondown
+`A 600,793 2 192 Agrave
+'A 600,793 2 193 Aacute
+^A 600,775 2 194 Acircumflex
+~A 600,732 2 195 Atilde
+:A 600,731 2 196 Adieresis
+oA 600,753 2 197 Aring
+AE 600,562 2 198 AE
+,C 600,580,151 2 199 Ccedilla
+`E 600,793 2 200 Egrave
+'E 600,793 2 201 Eacute
+^E 600,775 2 202 Ecircumflex
+:E 600,731 2 203 Edieresis
+`I 600,793 2 204 Igrave
+'I 600,793 2 205 Iacute
+^I 600,775 2 206 Icircumflex
+:I 600,731 2 207 Idieresis
+-D 600,562 2 208 Eth
+~N 600,732,13 2 209 Ntilde
+`O 600,793,18 2 210 Ograve
+'O 600,793,18 2 211 Oacute
+^O 600,775,18 2 212 Ocircumflex
+~O 600,732,18 2 213 Otilde
+:O 600,731,18 2 214 Odieresis
+tmu 600,470 0 215 multiply
+/O 600,629,80 2 216 Oslash
+`U 600,793,18 2 217 Ugrave
+'U 600,793,18 2 218 Uacute
+^U 600,775,18 2 219 Ucircumflex
+:U 600,731,18 2 220 Udieresis
+'Y 600,793 2 221 Yacute
+TP 600,562 2 222 Thorn
+ss 600,629,15 2 223 germandbls
+`a 600,672,15 2 224 agrave
+'a 600,672,15 2 225 aacute
+^a 600,654,15 2 226 acircumflex
+~a 600,606,15 2 227 atilde
+:a 600,595,15 2 228 adieresis
+oa 600,627,15 2 229 aring
+ae 600,441,15 0 230 ae
+,c 600,441,151 0 231 ccedilla
+`e 600,672,15 2 232 egrave
+'e 600,672,15 2 233 eacute
+^e 600,654,15 2 234 ecircumflex
+:e 600,595,15 2 235 edieresis
+`i 600,672 2 236 igrave
+'i 600,672 2 237 iacute
+^i 600,654 2 238 icircumflex
+:i 600,595 2 239 idieresis
+Sd 600,629,15 2 240 eth
+~n 600,606 2 241 ntilde
+`o 600,672,15 2 242 ograve
+'o 600,672,15 2 243 oacute
+^o 600,654,15 2 244 ocircumflex
+~o 600,606,15 2 245 otilde
+:o 600,595,15 2 246 odieresis
+tdi 600,467 0 247 divide
+/o 600,506,80 0 248 oslash
+`u 600,672,15 2 249 ugrave
+'u 600,672,15 2 250 uacute
+^u 600,654,15 2 251 ucircumflex
+:u 600,595,15 2 252 udieresis
+'y 600,672,157 3 253 yacute
+Tp 600,629,157,0,6 3 254 thorn
+:y 600,595,157 3 255 ydieresis
+IJ 600,562,18 2 256 IJ
+--- 600,437 0 257 up
+--- 600,227 0 258 dectab
+u0047_030C 600,805,18 2 259 Gcaron
+--- 600,562 2 260 stop
+--- 600,562 2 261 tab
+u2026 600,111,15 0 262 ellipsis
+--- 600,297 0 263 largebullet
+u0073_0327 600,441,151 0 264 scedilla
+--- 600,562 2 265 return
+ij 600,657,157 3 266 ij
+--- 600,562 2 267 LL
+--- 600,562 2 268 square
+da 600,608,15 2 269 arrowdown
+<- 600,483,0,24,24 0 270 arrowleft
+<> 600,483,0,28,28 0 271 arrowboth
+--- 600,599 2 272 graybox
+-> 600,483,0,24,24 0 273 arrowright
+u00AF 600,629 2 274 overscore
+--- 600,629 2 275 ll
+u0067_030C 600,669,157 3 276 gcaron
+u20A4 600,611,21 2 277 lira
+--- 600,580 2 278 center
+u0053_0327 600,580,151 2 279 Scedilla
+--- 600,607,157 3 280 format
+ua 600,623 2 281 arrowup
+--- 600,572,15 2 282 notegraphic
+u211E 600,562,15 2 283 prescription
+--- 600,348 0 284 indent
+--- 600,426,15 0 285 down
+--- 600,348 0 286 left
+u0049_0307 600,716 2 287 Idot
+--- 600,436,15 0 288 merge
diff --git a/font/devps/old/HB b/font/devps/old/HB
new file mode 100644
index 0000000..ac3c1f3
--- /dev/null
+++ b/font/devps/old/HB
@@ -0,0 +1,481 @@
+name HB
+internalname Helvetica-Bold
+spacewidth 278
+encoding text.enc
+ligatures fi fl 0
+kernpairs
+A y -30
+A w -30
+A v -40
+A u -30
+A Y -110
+A W -60
+A V -80
+A U -50
+A T -90
+A Q -40
+A O -40
+A G -50
+A C -40
+B U -10
+B A -30
+D . -30
+D , -30
+D Y -70
+D W -40
+D V -40
+D A -40
+F . -100
+F , -100
+F a -20
+F A -80
+J u -20
+J . -20
+J , -20
+J A -20
+K y -40
+K u -30
+K o -35
+K e -15
+K O -30
+L y -30
+L ' -140
+L cq -140
+L rq -140
+L Y -120
+L W -80
+L V -110
+L T -90
+O . -40
+O , -40
+O Y -70
+O X -50
+O W -50
+O V -50
+O T -40
+O A -50
+P . -120
+P o -40
+P e -30
+P , -120
+P a -30
+P A -100
+Q . 20
+Q , 20
+Q U -10
+R Y -50
+R W -40
+R V -50
+R U -20
+R T -20
+R O -20
+T y -60
+T w -60
+T u -90
+T ; -40
+T r -80
+T . -80
+T o -80
+T - -120
+T hy -120
+T e -60
+T , -80
+T : -40
+T a -80
+T O -40
+T A -90
+U . -30
+U , -30
+U A -50
+V u -60
+V ; -40
+V . -120
+V o -90
+V - -80
+V hy -80
+V e -50
+V , -120
+V : -40
+V a -60
+V O -50
+V G -50
+V A -80
+W y -20
+W u -45
+W ; -10
+W . -80
+W o -60
+W - -40
+W hy -40
+W e -35
+W , -80
+W : -10
+W a -40
+W O -20
+W A -60
+Y u -100
+Y ; -50
+Y . -100
+Y o -100
+Y e -80
+Y , -100
+Y : -50
+Y a -90
+Y O -70
+Y A -110
+a y -20
+a w -15
+a v -15
+a g -10
+b y -20
+b v -20
+b u -20
+b l -10
+c y -10
+c l -20
+c k -20
+c h -10
+: u0020 -40
+, u0020 -40
+, ' -120
+, cq -120
+, rq -120
+d y -15
+d w -15
+d v -15
+d d -10
+e y -15
+e x -15
+e w -15
+e v -15
+e . 20
+e , 10
+f ' 30
+f cq 30
+f rq 30
+f . -10
+f o -20
+f e -10
+f , -10
+g g -10
+g e 10
+h y -20
+k o -15
+l y -15
+l w -15
+m y -30
+m u -20
+n y -20
+n v -40
+n u -10
+o y -20
+o x -30
+o w -15
+o v -20
+p y -15
+. u0020 -40
+. ' -120
+. cq -120
+. rq -120
+rq u0020 -80
+` ` -46
+` oq -46
+oq ` -46
+oq oq -46
+' v -20
+cq v -20
+' u0020 -80
+cq u0020 -80
+' s -60
+cq s -60
+' r -40
+cq r -40
+' ' -46
+' cq -46
+cq ' -46
+cq cq -46
+' l -20
+cq l -20
+' d -80
+cq d -80
+r y 10
+r v 10
+r t 20
+r s -15
+r q -20
+r . -60
+r o -20
+r - -20
+r hy -20
+r g -15
+r d -20
+r , -60
+r c -20
+s w -15
+; u0020 -40
+u0020 ` -60
+u0020 oq -60
+u0020 lq -80
+u0020 Y -120
+u0020 W -80
+u0020 V -80
+u0020 T -100
+v . -80
+v o -30
+v , -80
+v a -20
+w . -40
+w o -20
+w , -40
+x e -10
+y . -80
+y o -25
+y e -10
+y , -80
+y a -30
+z e 10
+charset
+ha 584,698 2 0 asciicircum
+ti 584,343 0 1 asciitilde
+vS 667,936,19 2 2 Scaron
+vZ 611,936 2 3 Zcaron
+vs 556,750,14 2 4 scaron
+vz 500,750 2 5 zcaron
+:Y 667,915 2 6 Ydieresis
+tm 1000,718 2 7 trademark
+aq 238,718 2 8 quotesingle
+space 278 0 32 space
+! 333,718 2 33 exclam
+" 474,718 2 34 quotedbl
+dq "
+# 556,698 2 35 numbersign
+sh "
+$ 556,775,115 2 36 dollar
+Do "
+% 889,710,19 2 37 percent
+& 722,718,19 2 38 ampersand
+' 278,718 2 39 quoteright
+cq "
+( 333,734,208 3 40 parenleft
+) 333,734,208 3 41 parenright
+* 389,718 2 42 asterisk
++ 584,506 0 43 plus
+, 278,146,168 0 44 comma
+- 333,345 0 45 hyphen
+hy "
+. 278,146 0 46 period
+/ 278,737,19,33,33 2 47 slash
+sl "
+0 556,710,19 2 48 zero
+1 556,710 2 49 one
+2 556,710 2 50 two
+3 556,710,19 2 51 three
+4 556,710 2 52 four
+5 556,698,19 2 53 five
+6 556,710,19 2 54 six
+7 556,698 2 55 seven
+8 556,710,19 2 56 eight
+9 556,710,19 2 57 nine
+: 333,512 0 58 colon
+; 333,512,168 0 59 semicolon
+< 584,514,8 0 60 less
+= 584,419 0 61 equal
+> 584,514,8 0 62 greater
+? 611,727 2 63 question
+@ 975,737,19 2 64 at
+at "
+A 722,718 2 65 A
+B 722,718 2 66 B
+C 722,737,19 2 67 C
+D 722,718 2 68 D
+E 667,718 2 69 E
+F 611,718 2 70 F
+G 778,737,19 2 71 G
+H 722,718 2 72 H
+I 278,718 2 73 I
+J 556,718,18 2 74 J
+K 722,718 2 75 K
+L 611,718 2 76 L
+M 833,718 2 77 M
+N 722,718 2 78 N
+O 778,737,19 2 79 O
+P 667,718 2 80 P
+Q 778,737,52 2 81 Q
+R 722,718 2 82 R
+S 667,737,19 2 83 S
+T 611,718 2 84 T
+U 722,718,19 2 85 U
+V 667,718 2 86 V
+W 944,718 2 87 W
+X 667,718 2 88 X
+Y 667,718 2 89 Y
+Z 611,718 2 90 Z
+[ 333,722,196 2 91 bracketleft
+lB "
+\ 278,737,19,33,33 2 92 backslash
+rs "
+] 333,722,196 2 93 bracketright
+rB "
+a^ 333,750,0,10,10 2 94 circumflex
+^ "
+_ 556,0,125 0 95 underscore
+` 278,727 2 96 quoteleft
+oq "
+a 556,546,14 0 97 a
+b 611,718,14 2 98 b
+c 556,546,14 0 99 c
+d 611,718,14 2 100 d
+e 556,546,14 0 101 e
+f 333,727 2 102 f
+g 611,546,217 1 103 g
+h 611,718 2 104 h
+i 278,725 2 105 i
+j 278,725,214 3 106 j
+k 556,718,0,6 2 107 k
+l 278,718 2 108 l
+m 889,546 0 109 m
+n 611,546 0 110 n
+o 611,546,14 0 111 o
+p 611,546,207 1 112 p
+q 611,546,207 1 113 q
+r 389,546 0 114 r
+s 556,546,14 0 115 s
+t 333,676,6 2 116 t
+u 611,532,14 0 117 u
+v 556,532 0 118 v
+w 778,532 0 119 w
+x 556,532 0 120 x
+y 556,532,214 1 121 y
+z 500,532 0 122 z
+lC 389,722,196 2 123 braceleft
+{ "
+ba 280,737,19 2 124 bar
+| "
+rC 389,722,196 2 125 braceright
+} "
+a~ 333,737,0,17,17 2 126 tilde
+~ "
+bq 278,127,146 0 128 quotesinglbase
+Fo 556,484 0 129 guillemotleft
+Fc 556,484 0 130 guillemotright
+bu 350,524 0 131 bullet
+Fn 556,737,210,0,10 3 132 florin
+f/ 167,710,19,169,170 2 133 fraction
+%0 1000,710,19,3,3 2 134 perthousand
+dg 556,718,171 2 135 dagger
+dd 556,718,171 2 136 daggerdbl
+en 556,333 0 137 endash
+em 1000,333 0 138 emdash
+fi 611,727 2 140 fi
+fl 611,727 2 141 fl
+.i 278,532 0 144 dotlessi
+ga 333,750,0,0,23 2 146 grave
+a" 333,750,0,153 2 147 hungarumlaut
+a. 333,729 2 148 dotaccent
+ab 333,750,0,2,2 2 149 breve
+ah 333,750,0,10,10 2 150 caron
+ao 333,776 2 151 ring
+ho 333,0,228 1 152 ogonek
+lq 500,727 2 153 quotedblleft
+rq 500,718 2 154 quotedblright
+oe 944,546,14 0 155 oe
+/l 278,718,0,18,18 2 156 lslash
+Bq 500,127,146 0 157 quotedblbase
+OE 1000,737,19 2 158 OE
+/L 611,718,0,0,20 2 159 Lslash
+r! 333,532,186 0 161 exclamdown
+ct 556,628,118 0 162 cent
+Po 556,718,16 2 163 sterling
+Cs 556,636,0,3,3 0 164 currency
+Ye 556,698,0,9,9 2 165 yen
+bb 280,737,19 2 166 brokenbar
+sc 556,727,184 2 167 section
+ad 333,729 2 168 dieresis
+co 737,737,19,12,11 2 169 copyright
+Of 370,737 2 170 ordfeminine
+fo 333,484 0 171 guilsinglleft
+tno 584,419 0 172 logicalnot
+\- 584,309 0 173 minus
+rg 737,737,19,11,11 2 174 registered
+a- 333,678,0,6,6 2 175 macron
+de 400,712 2 176 degree
+t+- 584,506 0 177 plusminus
+S2 333,710 2 178 twosuperior
+S3 333,710 2 179 threesuperior
+aa 333,750,0,23 2 180 acute
+mc 611,532,207 1 181 mu
+ps 556,700,191,0,8 2 182 paragraph
+pc 278,334 0 183 periodcentered
+ac 333,0,228 1 184 cedilla
+S1 333,710 2 185 onesuperior
+Om 365,737 2 186 ordmasculine
+fc 333,484 0 187 guilsinglright
+14 834,710,19 2 188 onequarter
+12 834,710,19 2 189 onehalf
+34 834,710,19 2 190 threequarters
+r? 611,532,195 0 191 questiondown
+`A 722,936 2 192 Agrave
+'A 722,936 2 193 Aacute
+^A 722,936 2 194 Acircumflex
+~A 722,923 2 195 Atilde
+:A 722,915 2 196 Adieresis
+oA 722,962 2 197 Aring
+AE 1000,718 2 198 AE
+,C 722,737,228 3 199 Ccedilla
+`E 667,936 2 200 Egrave
+'E 667,936 2 201 Eacute
+^E 667,936 2 202 Ecircumflex
+:E 667,915 2 203 Edieresis
+`I 278,936,0,0,50 2 204 Igrave
+'I 278,936,0,51 2 205 Iacute
+^I 278,936,0,38,37 2 206 Icircumflex
+:I 278,915,0,22,21 2 207 Idieresis
+-D 722,718,0,0,5 2 208 Eth
+~N 722,923 2 209 Ntilde
+`O 778,936,19 2 210 Ograve
+'O 778,936,19 2 211 Oacute
+^O 778,936,19 2 212 Ocircumflex
+~O 778,923,19 2 213 Otilde
+:O 778,915,19 2 214 Odieresis
+tmu 584,505 0 215 multiply
+/O 778,745,27 2 216 Oslash
+`U 722,936,19 2 217 Ugrave
+'U 722,936,19 2 218 Uacute
+^U 722,936,19 2 219 Ucircumflex
+:U 722,915,19 2 220 Udieresis
+'Y 667,936 2 221 Yacute
+TP 667,718 2 222 Thorn
+ss 611,731,14 2 223 germandbls
+`a 556,750,14 2 224 agrave
+'a 556,750,14 2 225 aacute
+^a 556,750,14 2 226 acircumflex
+~a 556,737,14 2 227 atilde
+:a 556,729,14 2 228 adieresis
+oa 556,776,14 2 229 aring
+ae 889,546,14 0 230 ae
+,c 556,546,228 1 231 ccedilla
+`e 556,750,14 2 232 egrave
+'e 556,750,14 2 233 eacute
+^e 556,750,14 2 234 ecircumflex
+:e 556,729,14 2 235 edieresis
+`i 278,750,0,0,50 2 236 igrave
+'i 278,750,0,51 2 237 iacute
+^i 278,750,0,38,37 2 238 icircumflex
+:i 278,729,0,22,21 2 239 idieresis
+Sd 611,737,14 2 240 eth
+~n 611,737 2 241 ntilde
+`o 611,750,14 2 242 ograve
+'o 611,750,14 2 243 oacute
+^o 611,750,14 2 244 ocircumflex
+~o 611,737,14 2 245 otilde
+:o 611,729,14 2 246 odieresis
+tdi 584,548,42 0 247 divide
+/o 611,560,29 0 248 oslash
+`u 611,750,14 2 249 ugrave
+'u 611,750,14 2 250 uacute
+^u 611,750,14 2 251 ucircumflex
+:u 611,729,14 2 252 udieresis
+'y 556,750,214 3 253 yacute
+Tp 611,718,208 3 254 thorn
+:y 556,729,214 3 255 ydieresis
+u2026 1000,146 0 256 ellipsis
diff --git a/font/devps/old/HBI b/font/devps/old/HBI
new file mode 100644
index 0000000..72d5872
--- /dev/null
+++ b/font/devps/old/HBI
@@ -0,0 +1,482 @@
+name HBI
+internalname Helvetica-BoldOblique
+slant 12
+spacewidth 278
+encoding text.enc
+ligatures fi fl 0
+kernpairs
+A y -30
+A w -30
+A v -40
+A u -30
+A Y -110
+A W -60
+A V -80
+A U -50
+A T -90
+A Q -40
+A O -40
+A G -50
+A C -40
+B U -10
+B A -30
+D . -30
+D , -30
+D Y -70
+D W -40
+D V -40
+D A -40
+F . -100
+F , -100
+F a -20
+F A -80
+J u -20
+J . -20
+J , -20
+J A -20
+K y -40
+K u -30
+K o -35
+K e -15
+K O -30
+L y -30
+L ' -140
+L cq -140
+L rq -140
+L Y -120
+L W -80
+L V -110
+L T -90
+O . -40
+O , -40
+O Y -70
+O X -50
+O W -50
+O V -50
+O T -40
+O A -50
+P . -120
+P o -40
+P e -30
+P , -120
+P a -30
+P A -100
+Q . 20
+Q , 20
+Q U -10
+R Y -50
+R W -40
+R V -50
+R U -20
+R T -20
+R O -20
+T y -60
+T w -60
+T u -90
+T ; -40
+T r -80
+T . -80
+T o -80
+T - -120
+T hy -120
+T e -60
+T , -80
+T : -40
+T a -80
+T O -40
+T A -90
+U . -30
+U , -30
+U A -50
+V u -60
+V ; -40
+V . -120
+V o -90
+V - -80
+V hy -80
+V e -50
+V , -120
+V : -40
+V a -60
+V O -50
+V G -50
+V A -80
+W y -20
+W u -45
+W ; -10
+W . -80
+W o -60
+W - -40
+W hy -40
+W e -35
+W , -80
+W : -10
+W a -40
+W O -20
+W A -60
+Y u -100
+Y ; -50
+Y . -100
+Y o -100
+Y e -80
+Y , -100
+Y : -50
+Y a -90
+Y O -70
+Y A -110
+a y -20
+a w -15
+a v -15
+a g -10
+b y -20
+b v -20
+b u -20
+b l -10
+c y -10
+c l -20
+c k -20
+c h -10
+: u0020 -40
+, u0020 -40
+, ' -120
+, cq -120
+, rq -120
+d y -15
+d w -15
+d v -15
+d d -10
+e y -15
+e x -15
+e w -15
+e v -15
+e . 20
+e , 10
+f ' 30
+f cq 30
+f rq 30
+f . -10
+f o -20
+f e -10
+f , -10
+g g -10
+g e 10
+h y -20
+k o -15
+l y -15
+l w -15
+m y -30
+m u -20
+n y -20
+n v -40
+n u -10
+o y -20
+o x -30
+o w -15
+o v -20
+p y -15
+. u0020 -40
+. ' -120
+. cq -120
+. rq -120
+rq u0020 -80
+` ` -46
+` oq -46
+oq ` -46
+oq oq -46
+' v -20
+cq v -20
+' u0020 -80
+cq u0020 -80
+' s -60
+cq s -60
+' r -40
+cq r -40
+' ' -46
+' cq -46
+cq ' -46
+cq cq -46
+' l -20
+cq l -20
+' d -80
+cq d -80
+r y 10
+r v 10
+r t 20
+r s -15
+r q -20
+r . -60
+r o -20
+r - -20
+r hy -20
+r g -15
+r d -20
+r , -60
+r c -20
+s w -15
+; u0020 -40
+u0020 ` -60
+u0020 oq -60
+u0020 lq -80
+u0020 Y -120
+u0020 W -80
+u0020 V -80
+u0020 T -100
+v . -80
+v o -30
+v , -80
+v a -20
+w . -40
+w o -20
+w , -40
+x e -10
+y . -80
+y o -25
+y e -10
+y , -80
+y a -30
+z e 10
+charset
+ha 584,698,0,57,-81,57 2 0 asciicircum
+ti 584,343,0,43,-65,43 0 1 asciitilde
+vS 667,936,19,101,-31,90 2 2 Scaron
+vZ 611,936,0,176,25,90 2 3 Zcaron
+vs 556,750,14,108,-13,90 2 4 scaron
+vz 500,750,0,136,30,90 2 5 zcaron
+:Y 667,915,0,189,-118,90 2 6 Ydieresis
+tm 1000,718,0,159,-129,90 2 7 trademark
+aq 238,718,0,133,-115,90 2 8 quotesingle
+space 278 0 32 space
+! 333,718,0,114,-44,90 2 33 exclam
+" 474,718,0,105,-143,90 2 34 quotedbl
+dq "
+# 556,698,0,138,-10,90 2 35 numbersign
+sh "
+$ 556,775,115,116,-17,90 2 36 dollar
+Do "
+% 889,710,19,62,-86,62 2 37 percent
+& 722,718,19,60,-39,60 2 38 ampersand
+' 278,718,0,134,-117,90 2 39 quoteright
+cq "
+( 333,734,208,187,-26,90 3 40 parenleft
+) 333,734,208,86,75,86 3 41 parenright
+* 389,718,0,142,-96,90 2 42 asterisk
++ 584,506,0,76,-32,76 0 43 plus
+, 278,146,168,17,22,17 0 44 comma
+- 333,345,0,96,-23,90 0 45 hyphen
+hy "
+. 278,146,0,17,-14,17 0 46 period
+/ 278,737,19,240,87,90 2 47 slash
+sl "
+0 556,710,19,111,-36,90 2 48 zero
+1 556,710,0,23,-123,23 2 49 one
+2 556,710,0,113,24,90 2 50 two
+3 556,710,19,102,-15,90 2 51 three
+4 556,710,0,92,-10,90 2 52 four
+5 556,698,19,130,-14,90 2 53 five
+6 556,710,19,113,-35,90 2 54 six
+7 556,698,0,170,-75,90 2 55 seven
+8 556,710,19,110,-19,90 2 56 eight
+9 556,710,19,109,-28,90 2 57 nine
+: 333,512,0,68,-42,68 0 58 colon
+; 333,512,168,68,-6,68 0 59 semicolon
+< 584,514,8,121,-32,90 0 60 less
+= 584,419,0,99,-8,90 0 61 equal
+> 584,514,8,75,14,75 0 62 greater
+? 611,727,0,110,-115,90 2 63 question
+@ 975,737,19,29,-136,29 2 64 at
+at "
+A 722,718,0,30,30,30 2 65 A
+B 722,718,0,92,-26,90 2 66 B
+C 722,737,19,117,-57,90 2 67 C
+D 722,718,0,105,-26,90 2 68 D
+E 667,718,0,140,-26,90 2 69 E
+F 611,718,0,179,-26,90 2 70 F
+G 778,737,19,89,-58,89 2 71 G
+H 722,718,0,132,-21,90 2 72 H
+I 278,718,0,139,-14,90 2 73 I
+J 556,718,18,131,-10,90 2 74 J
+K 722,718,0,186,-37,90 2 75 K
+L 611,718,0,50,-26,50 2 76 L
+M 833,718,0,135,-19,90 2 77 M
+N 722,718,0,135,-19,90 2 78 N
+O 778,737,19,95,-57,90 2 79 O
+P 667,718,0,121,-26,90 2 80 P
+Q 778,737,52,95,-57,90 2 81 Q
+R 722,718,0,106,-26,90 2 82 R
+S 667,737,19,101,-31,90 2 83 S
+T 611,718,0,190,-90,90 2 84 T
+U 722,718,19,132,-66,90 2 85 U
+V 667,718,0,184,-122,90 2 86 V
+W 944,718,0,188,-119,90 2 87 W
+X 667,718,0,174,36,90 2 88 X
+Y 667,718,0,189,-118,90 2 89 Y
+Z 611,718,0,176,25,90 2 90 Z
+[ 333,722,196,179,29,90 2 91 bracketleft
+lB "
+\ 278,737,19,79,-74,79 2 92 backslash
+rs "
+] 333,722,196,140,68,90 2 93 bracketright
+rB "
+a^ 333,750,0,188,-68,90 2 94 circumflex
+^ "
+_ 556,0,125,34,77,34 0 95 underscore
+` 278,727,0,133,-115,90 2 96 quoteleft
+oq "
+a 556,546,14,77,-5,77 0 97 a
+b 611,718,14,84,-11,84 2 98 b
+c 556,546,14,93,-29,90 0 99 c
+d 611,718,14,143,-32,90 2 100 d
+e 556,546,14,87,-20,87 0 101 e
+f 333,727,0,186,-37,90 2 102 f
+g 611,546,217,105,12,90 1 103 g
+h 611,718,0,68,-15,68 2 104 h
+i 278,725,0,135,-19,90 2 105 i
+j 278,725,214,135,92,90 3 106 j
+k 556,718,0,164,-19,90 2 107 k
+l 278,718,0,134,-19,90 2 108 l
+m 889,546,0,70,-14,70 0 109 m
+n 611,546,0,68,-15,68 0 110 n
+o 611,546,14,82,-32,82 0 111 o
+p 611,546,207,84,32,84 1 112 p
+q 611,546,207,104,-30,90 1 113 q
+r 389,546,0,150,-14,90 0 114 r
+s 556,546,14,78,-13,78 0 115 s
+t 333,676,6,139,-50,90 2 116 t
+u 611,532,14,97,-48,90 0 117 u
+v 556,532,0,150,-76,90 0 118 v
+w 778,532,0,154,-73,90 0 119 w
+x 556,532,0,142,35,90 0 120 x
+y 556,532,214,146,8,90 1 121 y
+z 500,532,0,133,30,90 0 122 z
+lC 389,722,196,179,-44,90 2 123 braceleft
+{ "
+ba 280,737,19,123,-30,90 2 124 bar
+| "
+rC 389,722,196,68,68,68 2 125 braceright
+} "
+a~ 333,737,0,224,-63,90 2 126 tilde
+~ "
+bq 278,127,146,8,9,8 0 128 quotesinglbase
+Fo 556,484,0,65,-85,65 0 129 guillemotleft
+Fc 556,484,0,34,-54,34 0 130 guillemotright
+bu 350,524,0,120,-33,90 0 131 bullet
+Fn 556,737,210,163,100,90 3 132 florin
+f/ 167,710,19,370,224,90 2 133 fraction
+%0 1000,710,19,88,-26,88 2 134 perthousand
+dg 556,718,171,120,-68,90 2 135 dagger
+dd 556,718,171,122,4,90 2 136 daggerdbl
+en 556,333,0,121,2,90 0 137 endash
+em 1000,333,0,121,2,90 0 138 emdash
+fi 611,727,0,135,-37,90 2 140 fi
+fl 611,727,0,134,-37,90 2 141 fl
+.i 278,532,0,94,-19,90 0 144 dotlessi
+ga 333,750,0,70,-86,70 2 146 grave
+a" 333,750,0,362,-87,90 2 147 hungarumlaut
+a. 333,729,0,102,-185,90 2 148 dotaccent
+ab 333,750,0,211,-106,90 2 149 breve
+ah 333,750,0,219,-99,90 2 150 caron
+ao 333,776,0,137,-150,90 2 151 ring
+ho 333,0,228,0,9 1 152 ogonek
+lq 500,727,0,138,-110,90 2 153 quotedblleft
+rq 500,718,0,139,-112,90 2 154 quotedblright
+oe 944,546,14,83,-32,83 0 155 oe
+/l 278,718,0,179,10,90 2 156 lslash
+Bq 500,127,146,13,14,13 0 157 quotedblbase
+OE 1000,737,19,164,-49,90 2 158 OE
+/L 611,718,0,50,16,50 2 159 Lslash
+r! 333,532,186,70,0,70 0 161 exclamdown
+ct 556,628,118,93,-29,90 0 162 cent
+Po 556,718,16,129,0,90 2 163 sterling
+Cs 556,636,0,174,23,90 0 164 currency
+Ye 556,698,0,207,-10,90 2 165 yen
+bb 280,737,19,123,-30,90 2 166 brokenbar
+sc 556,727,184,92,-11,90 2 167 section
+ad 333,729,0,199,-87,90 2 168 dieresis
+co 737,737,19,148,-6,90 2 169 copyright
+Of 370,737,0,145,-42,90 2 170 ordfeminine
+fo 333,484,0,70,-80,70 0 171 guilsinglleft
+tno 584,419,0,99,-55,90 0 172 logicalnot
+\- 584,309,0,76,-32,76 0 173 minus
+rg 737,737,19,147,-5,90 2 174 registered
+a- 333,678,0,200,-72,90 2 175 macron
+de 400,712,0,117,-125,90 2 176 degree
+t+- 584,506,0,91,10,90 0 177 plusminus
+S2 333,710,0,166,-19,90 2 178 twosuperior
+S3 333,710,0,158,-41,90 2 179 threesuperior
+aa 333,750,0,232,-186,90 2 180 acute
+mc 611,532,207,97,28,90 1 181 mu
+ps 556,700,191,182,-48,90 2 182 paragraph
+pc 278,334,0,48,-60,48 0 183 periodcentered
+ac 333,0,228,0,87 1 184 cedilla
+S1 333,710,0,105,-98,90 2 185 onesuperior
+Om 365,737,0,170,-42,90 2 186 ordmasculine
+fc 333,484,0,39,-49,39 0 187 guilsinglright
+14 834,710,19,22,-82,22 2 188 onequarter
+12 834,710,19,74,-82,74 2 189 onehalf
+34 834,710,19,55,-49,55 2 190 threequarters
+r? 611,532,195,0,-3 0 191 questiondown
+`A 722,936,0,30,30,30 2 192 Agrave
+'A 722,936,0,78,30,78 2 193 Aacute
+^A 722,936,0,34,30,34 2 194 Acircumflex
+~A 722,923,0,69,30,69 2 195 Atilde
+:A 722,915,0,44,30,44 2 196 Adieresis
+oA 722,962,0,30,30,30 2 197 Aring
+AE 1000,718,0,150,45,90 2 198 AE
+,C 722,737,228,117,-57,90 3 199 Ccedilla
+`E 667,936,0,140,-26,90 2 200 Egrave
+'E 667,936,0,140,-26,90 2 201 Eacute
+^E 667,936,0,140,-26,90 2 202 Ecircumflex
+:E 667,915,0,140,-26,90 2 203 Edieresis
+`I 278,936,0,139,-14,90 2 204 Igrave
+'I 278,936,0,300,-14,90 2 205 Iacute
+^I 278,936,0,256,-14,90 2 206 Icircumflex
+:I 278,915,0,266,-14,90 2 207 Idieresis
+-D 722,718,0,105,-12,90 2 208 Eth
+~N 722,923,0,135,-19,90 2 209 Ntilde
+`O 778,936,19,95,-57,90 2 210 Ograve
+'O 778,936,19,95,-57,90 2 211 Oacute
+^O 778,936,19,95,-57,90 2 212 Ocircumflex
+~O 778,923,19,95,-57,90 2 213 Otilde
+:O 778,915,19,95,-57,90 2 214 Odieresis
+tmu 584,505,0,101,-7,90 0 215 multiply
+/O 778,745,27,166,15,90 2 216 Oslash
+`U 722,936,19,132,-66,90 2 217 Ugrave
+'U 722,936,19,132,-66,90 2 218 Uacute
+^U 722,936,19,132,-66,90 2 219 Ucircumflex
+:U 722,915,19,132,-66,90 2 220 Udieresis
+'Y 667,936,0,189,-118,90 2 221 Yacute
+TP 667,718,0,99,-26,90 2 222 Thorn
+ss 611,731,14,96,-19,90 2 223 germandbls
+`a 556,750,14,77,-5,77 2 224 agrave
+'a 556,750,14,121,-5,90 2 225 aacute
+^a 556,750,14,77,-5,77 2 226 acircumflex
+~a 556,737,14,113,-5,90 2 227 atilde
+:a 556,729,14,88,-5,88 2 228 adieresis
+oa 556,776,14,77,-5,77 2 229 aring
+ae 889,546,14,84,-6,84 0 230 ae
+,c 556,546,228,93,-29,90 1 231 ccedilla
+`e 556,750,14,87,-20,87 2 232 egrave
+'e 556,750,14,121,-20,90 2 233 eacute
+^e 556,750,14,87,-20,87 2 234 ecircumflex
+:e 556,729,14,88,-20,88 2 235 edieresis
+`i 278,750,0,98,-19,90 2 236 igrave
+'i 278,750,0,260,-19,90 2 237 iacute
+^i 278,750,0,216,-19,90 2 238 icircumflex
+:i 278,729,0,227,-19,90 2 239 idieresis
+Sd 611,737,14,109,-32,90 2 240 eth
+~n 611,737,0,85,-15,85 2 241 ntilde
+`o 611,750,14,82,-32,82 2 242 ograve
+'o 611,750,14,93,-32,90 2 243 oacute
+^o 611,750,14,82,-32,82 2 244 ocircumflex
+~o 611,737,14,85,-32,85 2 245 otilde
+:o 611,729,14,82,-32,82 2 246 odieresis
+tdi 584,548,42,76,-32,76 0 247 divide
+/o 611,560,29,140,28,90 0 248 oslash
+`u 611,750,14,97,-48,90 2 249 ugrave
+'u 611,750,14,97,-48,90 2 250 uacute
+^u 611,750,14,97,-48,90 2 251 ucircumflex
+:u 611,729,14,97,-48,90 2 252 udieresis
+'y 556,750,214,146,8,90 3 253 yacute
+Tp 611,718,208,84,32,84 3 254 thorn
+:y 556,729,214,146,8,90 3 255 ydieresis
+u2026 1000,146,0,0,-42 0 256 ellipsis
diff --git a/font/devps/old/HI b/font/devps/old/HI
new file mode 100644
index 0000000..20055df
--- /dev/null
+++ b/font/devps/old/HI
@@ -0,0 +1,521 @@
+name HI
+internalname Helvetica-Oblique
+slant 12
+spacewidth 278
+encoding text.enc
+ligatures fi fl 0
+kernpairs
+A y -40
+A w -40
+A v -40
+A u -30
+A Y -100
+A W -50
+A V -70
+A U -50
+A T -120
+A Q -30
+A O -30
+A G -30
+A C -30
+B . -20
+B , -20
+B U -10
+C . -30
+C , -30
+D . -70
+D , -70
+D Y -90
+D W -40
+D V -70
+D A -40
+F r -45
+F . -150
+F o -30
+F e -30
+F , -150
+F a -50
+F A -80
+J u -20
+J . -30
+J , -30
+J a -20
+J A -20
+K y -50
+K u -30
+K o -40
+K e -40
+K O -50
+L y -30
+L ' -160
+L cq -160
+L rq -140
+L Y -140
+L W -70
+L V -110
+L T -110
+O . -40
+O , -40
+O Y -70
+O X -60
+O W -30
+O V -50
+O T -40
+O A -20
+P . -180
+P o -50
+P e -50
+P , -180
+P a -40
+P A -120
+Q U -10
+R Y -50
+R W -30
+R V -50
+R U -40
+R T -30
+R O -20
+S . -20
+S , -20
+T y -120
+T w -120
+T u -120
+T ; -20
+T r -120
+T . -120
+T o -120
+T - -140
+T hy -140
+T e -120
+T , -120
+T : -20
+T a -120
+T O -40
+T A -120
+U . -40
+U , -40
+U A -40
+V u -70
+V ; -40
+V . -125
+V o -80
+V - -80
+V hy -80
+V e -80
+V , -125
+V : -40
+V a -70
+V O -40
+V G -40
+V A -80
+W y -20
+W u -30
+W . -80
+W o -30
+W - -40
+W hy -40
+W e -30
+W , -80
+W a -40
+W O -20
+W A -50
+Y u -110
+Y ; -60
+Y . -140
+Y o -140
+Y i -20
+Y - -140
+Y hy -140
+Y e -140
+Y , -140
+Y : -60
+Y a -140
+Y O -85
+Y A -110
+a y -30
+a w -20
+a v -20
+b y -20
+b v -20
+b u -20
+b . -40
+b l -20
+b , -40
+b b -10
+c k -20
+c , -15
+: u0020 -50
+, ' -100
+, cq -100
+, rq -100
+e y -20
+e x -30
+e w -20
+e v -30
+e . -15
+e , -15
+f ' 50
+f cq 50
+f rq 60
+f . -30
+f o -30
+f e -30
+f .i -28
+f , -30
+f a -30
+g r -10
+h y -30
+k o -20
+k e -20
+m y -15
+m u -10
+n y -15
+n v -20
+n u -10
+o y -30
+o x -30
+o w -15
+o v -15
+o . -40
+o , -40
+/o z -55
+/o y -70
+/o x -85
+/o w -70
+/o v -70
+/o u -55
+/o t -55
+/o s -55
+/o r -55
+/o q -55
+/o . -95
+/o p -55
+/o o -55
+/o n -55
+/o m -55
+/o l -55
+/o k -55
+/o j -55
+/o i -55
+/o h -55
+/o g -55
+/o f -55
+/o e -55
+/o d -55
+/o , -95
+/o c -55
+/o b -55
+/o a -55
+p y -30
+p . -35
+p , -35
+. u0020 -60
+. ' -100
+. cq -100
+. rq -100
+rq u0020 -40
+` ` -57
+` oq -57
+oq ` -57
+oq oq -57
+' u0020 -70
+cq u0020 -70
+' s -50
+cq s -50
+' r -50
+cq r -50
+' ' -57
+' cq -57
+cq ' -57
+cq cq -57
+' d -50
+cq d -50
+r y 30
+r v 30
+r u 15
+r t 40
+r ; 30
+r . -50
+r p 30
+r n 25
+r m 25
+r l 15
+r k 15
+r i 15
+r , -50
+r : 30
+r a -10
+s w -30
+s . -15
+s , -15
+; u0020 -50
+u0020 ` -60
+u0020 oq -60
+u0020 lq -30
+u0020 Y -90
+u0020 W -40
+u0020 V -50
+u0020 T -50
+v . -80
+v o -25
+v e -25
+v , -80
+v a -25
+w . -60
+w o -10
+w e -10
+w , -60
+w a -15
+x e -30
+y . -100
+y o -20
+y e -20
+y , -100
+y a -20
+z o -15
+z e -15
+charset
+ha 469,688,0,120,8,89 2 0 asciicircum
+ti 584,326,0,46,-61,46 0 1 asciitilde
+vS 667,929,19,96,-40,89 2 2 Scaron
+vZ 611,929,0,180,27,89 2 3 Zcaron
+vs 500,734,15,102,-13,89 2 4 scaron
+vz 500,734,0,121,19,89 2 5 zcaron
+:Y 667,901,0,189,-117,89 2 6 Ydieresis
+tm 1000,718,0,106,-136,89 2 7 trademark
+aq 191,718,0,144,-107,89 2 8 quotesingle
+space 278 0 32 space
+! 278,718,0,112,-40,89 2 33 exclam
+" 355,718,0,133,-118,89 2 34 quotedbl
+dq "
+# 556,688,0,125,-23,89 2 35 numbersign
+sh "
+$ 556,775,115,111,-19,89 2 36 dollar
+Do "
+% 889,703,19,50,-97,50 2 37 percent
+& 667,718,15,30,-27,30 2 38 ampersand
+' 222,718,0,138,-101,89 2 39 quoteright
+cq "
+( 333,733,207,171,-58,89 3 40 parenleft
+) 333,733,207,54,59,54 3 41 parenright
+* 389,718,0,136,-115,89 2 42 asterisk
++ 584,505,0,72,-35,72 0 43 plus
+, 278,106,147,0,-6 0 44 comma
+- 333,322,0,74,-43,74 0 45 hyphen
+hy "
+. 278,106,0,0,-37 0 46 period
+/ 278,737,19,224,71,89 2 47 slash
+sl "
+0 556,703,19,102,-43,89 2 48 zero
+1 556,703,0,2,-157,2 2 49 one
+2 556,703,0,111,24,89 2 50 two
+3 556,703,19,104,-25,89 2 51 three
+4 556,703,0,70,-11,70 2 52 four
+5 556,688,19,115,-18,89 2 53 five
+6 556,703,19,109,-41,89 2 54 six
+7 556,688,0,163,-87,89 2 55 seven
+8 556,703,19,101,-24,89 2 56 eight
+9 556,703,19,103,-32,89 2 57 nine
+: 278,516,0,73,-37,73 0 58 colon
+; 278,516,147,73,-6,73 0 59 semicolon
+< 584,495,0,107,-44,89 0 60 less
+= 584,390,0,94,-13,89 0 61 equal
+> 584,495,0,63,0,63 0 62 greater
+? 556,727,0,104,-111,89 2 63 question
+@ 1015,737,19,0,-165 2 64 at
+at "
+A 667,718,0,37,36,37 2 65 A
+B 667,718,0,95,-24,89 2 66 B
+C 722,737,19,110,-58,89 2 67 C
+D 722,718,0,92,-31,89 2 68 D
+E 667,718,0,145,-36,89 2 69 E
+F 611,718,0,175,-36,89 2 70 F
+G 778,737,19,71,-61,71 2 71 G
+H 722,718,0,127,-27,89 2 72 H
+I 278,718,0,113,-41,89 2 73 I
+J 500,718,19,131,3,89 2 74 J
+K 667,718,0,191,-26,89 2 75 K
+L 556,718,0,49,-26,49 2 76 L
+M 833,718,0,131,-23,89 2 77 M
+N 722,718,0,127,-26,89 2 78 N
+O 778,737,19,98,-55,89 2 79 O
+P 667,718,0,120,-36,89 2 80 P
+Q 778,737,56,98,-55,89 2 81 Q
+R 722,718,0,101,-38,89 2 82 R
+S 667,737,19,96,-40,89 2 83 S
+T 611,718,0,189,-98,89 2 84 T
+U 722,718,19,125,-73,89 2 85 U
+V 667,718,0,183,-123,89 2 86 V
+W 944,718,0,187,-119,89 2 87 W
+X 667,718,0,173,31,89 2 88 X
+Y 667,718,0,189,-117,89 2 89 Y
+Z 611,718,0,180,27,89 2 90 Z
+[ 278,722,196,175,29,89 2 91 bracketleft
+lB "
+\ 278,737,19,63,-90,63 2 92 backslash
+rs "
+] 278,722,196,140,64,89 2 93 bracketright
+rB "
+a^ 333,734,0,155,-97,89 2 94 circumflex
+^ "
+_ 556,0,125,34,77,34 0 95 underscore
+` 222,725,0,151,-115,89 2 96 quoteleft
+oq "
+a 556,538,15,53,-11,53 0 97 a
+b 556,718,15,78,-8,78 2 98 b
+c 500,538,15,103,-24,89 0 99 c
+d 556,718,15,146,-34,89 2 100 d
+e 556,538,15,72,-34,72 0 101 e
+f 278,728,0,188,-36,89 2 102 f
+g 556,538,220,104,8,89 1 103 g
+h 556,718,0,67,-15,67 2 104 h
+i 222,718,0,136,-17,89 2 105 i
+j 222,718,210,136,110,89 3 106 j
+k 500,718,0,150,-17,89 2 107 k
+l 222,718,0,136,-17,89 2 108 l
+m 833,538,0,69,-15,69 0 109 m
+n 556,538,0,67,-15,67 0 110 n
+o 556,538,14,79,-33,79 0 111 o
+p 556,538,207,78,36,78 1 112 p
+q 556,538,207,99,-34,89 1 113 q
+r 333,538,0,163,-27,89 0 114 r
+s 500,538,15,79,-13,79 0 115 s
+t 278,669,7,140,-52,89 2 116 t
+u 556,523,15,94,-44,89 0 117 u
+v 500,523,0,153,-69,89 0 118 v
+w 722,523,0,148,-75,89 0 119 w
+x 500,523,0,144,39,89 0 120 x
+y 500,523,214,150,35,89 1 121 y
+z 500,523,0,121,19,89 0 122 z
+lC 334,722,196,161,-42,89 2 123 braceleft
+{ "
+ba 260,737,19,114,-40,89 2 124 bar
+| "
+rC 334,722,196,70,50,70 2 125 braceright
+} "
+a~ 333,722,0,207,-75,89 2 126 tilde
+~ "
+bq 222,106,149,8,29,8 0 128 quotesinglbase
+Fo 556,446,0,48,-96,48 0 129 guillemotleft
+Fc 556,446,0,22,-70,22 0 130 guillemotright
+bu 350,517,0,113,-41,89 0 131 bullet
+Fn 556,737,207,148,102,89 3 132 florin
+f/ 167,703,19,365,220,89 2 133 fraction
+%0 1000,703,19,79,-38,79 2 134 perthousand
+dg 556,718,159,116,-85,89 2 135 dagger
+dd 556,718,159,117,-2,89 2 136 daggerdbl
+en 556,313,0,117,-1,89 0 137 endash
+em 1000,313,0,117,-1,89 0 138 emdash
+fi 500,728,0,137,-36,89 2 140 fi
+fl 500,728,0,135,-36,89 2 141 fl
+.i 278,523,0,66,-45,66 0 144 dotlessi
+ga 333,734,0,54,-120,54 2 146 grave
+a" 333,734,0,282,-107,89 2 147 hungarumlaut
+a. 333,706,0,79,-199,79 2 148 dotaccent
+ab 333,731,0,193,-117,89 2 149 breve
+ah 333,734,0,185,-127,89 2 150 caron
+ao 333,756,0,119,-164,89 2 151 ring
+ho 333,0,225,0,7 1 152 ogonek
+lq 333,725,0,178,-88,89 2 153 quotedblleft
+rq 333,718,0,165,-74,89 2 154 quotedblright
+oe 944,538,15,70,-33,70 0 155 oe
+/l 222,718,0,175,9,89 2 156 lslash
+Bq 333,106,149,35,56,35 0 157 quotedblbase
+OE 1000,737,19,166,-48,89 2 158 OE
+/L 556,718,0,49,9,49 2 159 Lslash
+r! 333,523,195,43,-27,43 0 161 exclamdown
+ct 556,623,115,78,-45,78 0 162 cent
+Po 556,718,16,128,1,89 2 163 sterling
+Cs 556,603,0,140,-10,89 0 164 currency
+Ye 556,688,0,193,-31,89 2 165 yen
+bb 260,737,19,114,-40,89 2 166 brokenbar
+sc 556,737,191,78,-26,78 2 167 section
+ad 333,706,0,160,-118,89 2 168 dieresis
+co 737,737,19,150,-4,89 2 169 copyright
+Of 370,737,0,129,-50,89 2 170 ordfeminine
+fo 333,446,0,57,-87,57 0 171 guilsinglleft
+tno 584,390,0,94,-56,89 0 172 logicalnot
+\- 584,289,0,72,-35,72 0 173 minus
+rg 737,737,19,150,-4,89 2 174 registered
+a- 333,684,0,185,-93,89 2 175 macron
+de 400,703,0,118,-119,89 2 176 degree
+t+- 584,506,0,84,11,84 0 177 plusminus
+S2 333,703,0,166,-14,89 2 178 twosuperior
+S3 333,703,0,153,-40,89 2 179 threesuperior
+aa 333,734,0,192,-198,89 2 180 acute
+mc 556,523,207,94,26,89 1 181 mu
+ps 537,718,173,163,-76,89 2 182 paragraph
+pc 278,315,0,29,-79,29 0 183 periodcentered
+ac 333,0,225,0,48 1 184 cedilla
+S1 333,703,0,88,-116,88 2 185 onesuperior
+Om 365,737,0,153,-50,89 2 186 ordmasculine
+fc 333,446,0,31,-61,31 0 187 guilsinglright
+14 834,703,19,18,-100,18 2 188 onequarter
+12 834,703,19,55,-64,55 2 189 onehalf
+34 834,703,19,77,-80,77 2 190 threequarters
+r? 611,525,201,0,-35 0 191 questiondown
+`A 667,929,0,37,36,37 2 192 Agrave
+'A 667,929,0,66,36,66 2 193 Aacute
+^A 667,929,0,37,36,37 2 194 Acircumflex
+~A 667,917,0,82,36,82 2 195 Atilde
+:A 667,901,0,37,36,37 2 196 Adieresis
+oA 667,931,0,37,36,37 2 197 Aring
+AE 1000,718,0,147,42,89 2 198 AE
+,C 722,737,225,110,-58,89 3 199 Ccedilla
+`E 667,929,0,145,-36,89 2 200 Egrave
+'E 667,929,0,145,-36,89 2 201 Eacute
+^E 667,929,0,145,-36,89 2 202 Ecircumflex
+:E 667,901,0,145,-36,89 2 203 Edieresis
+`I 278,929,0,123,-41,89 2 204 Igrave
+'I 278,929,0,261,-41,89 2 205 Iacute
+^I 278,929,0,224,-41,89 2 206 Icircumflex
+:I 278,901,0,230,-41,89 2 207 Idieresis
+-D 722,718,0,92,-19,89 2 208 Eth
+~N 722,917,0,127,-26,89 2 209 Ntilde
+`O 778,929,19,98,-55,89 2 210 Ograve
+'O 778,929,19,98,-55,89 2 211 Oacute
+^O 778,929,19,98,-55,89 2 212 Ocircumflex
+~O 778,917,19,98,-55,89 2 213 Otilde
+:O 778,901,19,98,-55,89 2 214 Odieresis
+tmu 584,506,0,108,0,89 0 215 multiply
+/O 778,737,19,162,7,89 2 216 Oslash
+`U 722,929,19,125,-73,89 2 217 Ugrave
+'U 722,929,19,125,-73,89 2 218 Uacute
+^U 722,929,19,125,-73,89 2 219 Ucircumflex
+:U 722,901,19,125,-73,89 2 220 Udieresis
+'Y 667,929,0,189,-117,89 2 221 Yacute
+TP 667,718,0,95,-36,89 2 222 Thorn
+ss 611,728,15,97,-17,89 2 223 germandbls
+`a 556,734,15,53,-11,53 2 224 agrave
+'a 556,734,15,81,-11,81 2 225 aacute
+^a 556,734,15,53,-11,53 2 226 acircumflex
+~a 556,722,15,86,-11,86 2 227 atilde
+:a 556,706,15,53,-11,53 2 228 adieresis
+oa 556,756,15,53,-11,53 2 229 aring
+ae 889,538,15,70,-11,70 0 230 ae
+,c 500,538,225,103,-24,89 1 231 ccedilla
+`e 556,734,15,72,-34,72 2 232 egrave
+'e 556,734,15,81,-34,81 2 233 eacute
+^e 556,734,15,72,-34,72 2 234 ecircumflex
+:e 556,706,15,72,-34,72 2 235 edieresis
+`i 278,734,0,82,-45,82 2 236 igrave
+'i 278,734,0,220,-45,89 2 237 iacute
+^i 278,734,0,183,-45,89 2 238 icircumflex
+:i 278,706,0,188,-45,89 2 239 idieresis
+Sd 556,737,15,111,-31,89 2 240 eth
+~n 556,722,0,86,-15,86 2 241 ntilde
+`o 556,734,14,79,-33,79 2 242 ograve
+'o 556,734,14,81,-33,81 2 243 oacute
+^o 556,734,14,79,-33,79 2 244 ocircumflex
+~o 556,722,14,96,-33,89 2 245 otilde
+:o 556,706,14,79,-33,79 2 246 odieresis
+tdi 584,524,19,72,-35,72 0 247 divide
+/o 611,545,22,86,21,86 0 248 oslash
+`u 556,734,15,94,-44,89 2 249 ugrave
+'u 556,734,15,94,-44,89 2 250 uacute
+^u 556,734,15,94,-44,89 2 251 ucircumflex
+:u 556,706,15,94,-44,89 2 252 udieresis
+'y 500,734,214,150,35,89 3 253 yacute
+Tp 556,718,207,78,36,78 3 254 thorn
+:y 500,706,214,150,35,89 3 255 ydieresis
+u2026 1000,106,0,0,-65 0 256 ellipsis
diff --git a/font/devps/old/HNB b/font/devps/old/HNB
new file mode 100644
index 0000000..5e86bb4
--- /dev/null
+++ b/font/devps/old/HNB
@@ -0,0 +1,481 @@
+name HNB
+internalname Helvetica-Narrow-Bold
+spacewidth 228
+encoding text.enc
+ligatures fi fl 0
+kernpairs
+A y -24
+A w -24
+A v -32
+A u -24
+A Y -89
+A W -48
+A V -65
+A U -40
+A T -73
+A Q -32
+A O -32
+A G -40
+A C -32
+B U -7
+B A -24
+D . -24
+D , -24
+D Y -56
+D W -32
+D V -32
+D A -32
+F . -81
+F , -81
+F a -15
+F A -65
+J u -15
+J . -15
+J , -15
+J A -15
+K y -32
+K u -24
+K o -28
+K e -11
+K O -24
+L y -24
+L ' -114
+L cq -114
+L rq -114
+L Y -97
+L W -65
+L V -89
+L T -73
+O . -32
+O , -32
+O Y -56
+O X -40
+O W -40
+O V -40
+O T -32
+O A -40
+P . -97
+P o -32
+P e -24
+P , -97
+P a -24
+P A -81
+Q . 16
+Q , 16
+Q U -7
+R Y -40
+R W -32
+R V -40
+R U -15
+R T -15
+R O -15
+T y -48
+T w -48
+T u -73
+T ; -32
+T r -65
+T . -65
+T o -65
+T - -97
+T hy -97
+T e -48
+T , -65
+T : -32
+T a -65
+T O -32
+T A -73
+U . -24
+U , -24
+U A -40
+V u -48
+V ; -32
+V . -97
+V o -73
+V - -65
+V hy -65
+V e -40
+V , -97
+V : -32
+V a -48
+V O -40
+V G -40
+V A -65
+W y -15
+W u -36
+W ; -7
+W . -65
+W o -48
+W - -32
+W hy -32
+W e -28
+W , -65
+W : -7
+W a -32
+W O -15
+W A -48
+Y u -81
+Y ; -40
+Y . -81
+Y o -81
+Y e -65
+Y , -81
+Y : -40
+Y a -73
+Y O -56
+Y A -89
+a y -15
+a w -11
+a v -11
+a g -7
+b y -15
+b v -15
+b u -15
+b l -7
+c y -7
+c l -15
+c k -15
+c h -7
+: u0020 -32
+, u0020 -32
+, ' -97
+, cq -97
+, rq -97
+d y -11
+d w -11
+d v -11
+d d -7
+e y -11
+e x -11
+e w -11
+e v -11
+e . 16
+e , 8
+f ' 25
+f cq 25
+f rq 25
+f . -7
+f o -15
+f e -7
+f , -7
+g g -7
+g e 8
+h y -15
+k o -11
+l y -11
+l w -11
+m y -24
+m u -15
+n y -15
+n v -32
+n u -7
+o y -15
+o x -24
+o w -11
+o v -15
+p y -11
+. u0020 -32
+. ' -97
+. cq -97
+. rq -97
+rq u0020 -65
+` ` -37
+` oq -37
+oq ` -37
+oq oq -37
+' v -15
+cq v -15
+' u0020 -65
+cq u0020 -65
+' s -48
+cq s -48
+' r -32
+cq r -32
+' ' -37
+' cq -37
+cq ' -37
+cq cq -37
+' l -15
+cq l -15
+' d -65
+cq d -65
+r y 8
+r v 8
+r t 16
+r s -11
+r q -15
+r . -48
+r o -15
+r - -15
+r hy -15
+r g -11
+r d -15
+r , -48
+r c -15
+s w -11
+; u0020 -32
+u0020 ` -48
+u0020 oq -48
+u0020 lq -65
+u0020 Y -97
+u0020 W -65
+u0020 V -65
+u0020 T -81
+v . -65
+v o -24
+v , -65
+v a -15
+w . -32
+w o -15
+w , -32
+x e -7
+y . -65
+y o -20
+y e -7
+y , -65
+y a -24
+z e 8
+charset
+ha 479,698 2 0 asciicircum
+ti 479,343 0 1 asciitilde
+vS 547,936,19 2 2 Scaron
+vZ 501,936 2 3 Zcaron
+vs 456,750,14 2 4 scaron
+vz 410,750 2 5 zcaron
+:Y 547,915 2 6 Ydieresis
+tm 820,718 2 7 trademark
+aq 195,718 2 8 quotesingle
+space 228 0 32 space
+! 273,718 2 33 exclam
+" 389,718 2 34 quotedbl
+dq "
+# 456,698 2 35 numbersign
+sh "
+$ 456,775,115 2 36 dollar
+Do "
+% 729,710,19 2 37 percent
+& 592,718,19 2 38 ampersand
+' 228,718 2 39 quoteright
+cq "
+( 273,734,208 3 40 parenleft
+) 273,734,208 3 41 parenright
+* 319,718 2 42 asterisk
++ 479,506 0 43 plus
+, 228,146,168 0 44 comma
+- 273,345 0 45 hyphen
+hy "
+. 228,146 0 46 period
+/ 228,737,19,27,27 2 47 slash
+sl "
+0 456,710,19 2 48 zero
+1 456,710 2 49 one
+2 456,710 2 50 two
+3 456,710,19 2 51 three
+4 456,710 2 52 four
+5 456,698,19 2 53 five
+6 456,710,19 2 54 six
+7 456,698 2 55 seven
+8 456,710,19 2 56 eight
+9 456,710,19 2 57 nine
+: 273,512 0 58 colon
+; 273,512,168 0 59 semicolon
+< 479,514,8 0 60 less
+= 479,419 0 61 equal
+> 479,514,8 0 62 greater
+? 501,727 2 63 question
+@ 800,737,19 2 64 at
+at "
+A 592,718 2 65 A
+B 592,718 2 66 B
+C 592,737,19 2 67 C
+D 592,718 2 68 D
+E 547,718 2 69 E
+F 501,718 2 70 F
+G 638,737,19 2 71 G
+H 592,718 2 72 H
+I 228,718 2 73 I
+J 456,718,18 2 74 J
+K 592,718 2 75 K
+L 501,718 2 76 L
+M 683,718 2 77 M
+N 592,718 2 78 N
+O 638,737,19 2 79 O
+P 547,718 2 80 P
+Q 638,737,52 2 81 Q
+R 592,718 2 82 R
+S 547,737,19 2 83 S
+T 501,718 2 84 T
+U 592,718,19 2 85 U
+V 547,718 2 86 V
+W 774,718 2 87 W
+X 547,718 2 88 X
+Y 547,718 2 89 Y
+Z 501,718 2 90 Z
+[ 273,722,196 2 91 bracketleft
+lB "
+\ 228,737,19,27,27 2 92 backslash
+rs "
+] 273,722,196 2 93 bracketright
+rB "
+a^ 273,750,0,8,8 2 94 circumflex
+^ "
+_ 456,0,125 0 95 underscore
+` 228,727 2 96 quoteleft
+oq "
+a 456,546,14 0 97 a
+b 501,718,14 2 98 b
+c 456,546,14 0 99 c
+d 501,718,14 2 100 d
+e 456,546,14 0 101 e
+f 273,727 2 102 f
+g 501,546,217 1 103 g
+h 501,718 2 104 h
+i 228,725 2 105 i
+j 228,725,214 3 106 j
+k 456,718,0,5 2 107 k
+l 228,718 2 108 l
+m 729,546 0 109 m
+n 501,546 0 110 n
+o 501,546,14 0 111 o
+p 501,546,207 1 112 p
+q 501,546,207 1 113 q
+r 319,546 0 114 r
+s 456,546,14 0 115 s
+t 273,676,6 2 116 t
+u 501,532,14 0 117 u
+v 456,532 0 118 v
+w 638,532 0 119 w
+x 456,532 0 120 x
+y 456,532,214 1 121 y
+z 410,532 0 122 z
+lC 319,722,196 2 123 braceleft
+{ "
+ba 230,737,19 2 124 bar
+| "
+rC 319,722,196 2 125 braceright
+} "
+a~ 273,737,0,14,14 2 126 tilde
+~ "
+bq 228,127,146 0 128 quotesinglbase
+Fo 456,484 0 129 guillemotleft
+Fc 456,484 0 130 guillemotright
+bu 287,524 0 131 bullet
+Fn 456,737,210,0,8 3 132 florin
+f/ 137,710,19,139,139 2 133 fraction
+%0 820,710,19,2,2 2 134 perthousand
+dg 456,718,171 2 135 dagger
+dd 456,718,171 2 136 daggerdbl
+en 456,333 0 137 endash
+em 820,333 0 138 emdash
+fi 501,727 2 140 fi
+fl 501,727 2 141 fl
+.i 228,532 0 144 dotlessi
+ga 273,750,0,0,19 2 146 grave
+a" 273,750,0,126 2 147 hungarumlaut
+a. 273,729 2 148 dotaccent
+ab 273,750,0,2,2 2 149 breve
+ah 273,750,0,8,8 2 150 caron
+ao 273,776 2 151 ring
+ho 273,0,228 1 152 ogonek
+lq 410,727 2 153 quotedblleft
+rq 410,718 2 154 quotedblright
+oe 774,546,14 0 155 oe
+/l 228,718,0,15,15 2 156 lslash
+Bq 410,127,146 0 157 quotedblbase
+OE 820,737,19 2 158 OE
+/L 501,718,0,0,16 2 159 Lslash
+r! 273,532,186 0 161 exclamdown
+ct 456,628,118 0 162 cent
+Po 456,718,16 2 163 sterling
+Cs 456,636,0,2,2 0 164 currency
+Ye 456,698,0,7,7 2 165 yen
+bb 230,737,19 2 166 brokenbar
+sc 456,727,184 2 167 section
+ad 273,729 2 168 dieresis
+co 604,737,19,10,9 2 169 copyright
+Of 303,737 2 170 ordfeminine
+fo 273,484 0 171 guilsinglleft
+tno 479,419 0 172 logicalnot
+\- 479,309 0 173 minus
+rg 604,737,19,9,9 2 174 registered
+a- 273,678,0,5,5 2 175 macron
+de 328,712 2 176 degree
+t+- 479,506 0 177 plusminus
+S2 273,710 2 178 twosuperior
+S3 273,710 2 179 threesuperior
+aa 273,750,0,19 2 180 acute
+mc 501,532,207 1 181 mu
+ps 456,700,191,0,7 2 182 paragraph
+pc 228,334 0 183 periodcentered
+ac 273,0,228 1 184 cedilla
+S1 273,710 2 185 onesuperior
+Om 299,737 2 186 ordmasculine
+fc 273,484 0 187 guilsinglright
+14 684,710,19 2 188 onequarter
+12 684,710,19 2 189 onehalf
+34 684,710,19 2 190 threequarters
+r? 501,532,195 0 191 questiondown
+`A 592,936 2 192 Agrave
+'A 592,936 2 193 Aacute
+^A 592,936 2 194 Acircumflex
+~A 592,923 2 195 Atilde
+:A 592,915 2 196 Adieresis
+oA 592,962 2 197 Aring
+AE 820,718 2 198 AE
+,C 592,737,228 3 199 Ccedilla
+`E 547,936 2 200 Egrave
+'E 547,936 2 201 Eacute
+^E 547,936 2 202 Ecircumflex
+:E 547,915 2 203 Edieresis
+`I 228,936,0,0,41 2 204 Igrave
+'I 228,936,0,42 2 205 Iacute
+^I 228,936,0,31,30 2 206 Icircumflex
+:I 228,915,0,18,17 2 207 Idieresis
+-D 592,718,0,0,4 2 208 Eth
+~N 592,923 2 209 Ntilde
+`O 638,936,19 2 210 Ograve
+'O 638,936,19 2 211 Oacute
+^O 638,936,19 2 212 Ocircumflex
+~O 638,923,19 2 213 Otilde
+:O 638,915,19 2 214 Odieresis
+tmu 479,505 0 215 multiply
+/O 638,745,27 2 216 Oslash
+`U 592,936,19 2 217 Ugrave
+'U 592,936,19 2 218 Uacute
+^U 592,936,19 2 219 Ucircumflex
+:U 592,915,19 2 220 Udieresis
+'Y 547,936 2 221 Yacute
+TP 547,718 2 222 Thorn
+ss 501,731,14 2 223 germandbls
+`a 456,750,14 2 224 agrave
+'a 456,750,14 2 225 aacute
+^a 456,750,14 2 226 acircumflex
+~a 456,737,14 2 227 atilde
+:a 456,729,14 2 228 adieresis
+oa 456,776,14 2 229 aring
+ae 729,546,14 0 230 ae
+,c 456,546,228 1 231 ccedilla
+`e 456,750,14 2 232 egrave
+'e 456,750,14 2 233 eacute
+^e 456,750,14 2 234 ecircumflex
+:e 456,729,14 2 235 edieresis
+`i 228,750,0,0,41 2 236 igrave
+'i 228,750,0,42 2 237 iacute
+^i 228,750,0,31,30 2 238 icircumflex
+:i 228,729,0,18,17 2 239 idieresis
+Sd 501,737,14 2 240 eth
+~n 501,737 2 241 ntilde
+`o 501,750,14 2 242 ograve
+'o 501,750,14 2 243 oacute
+^o 501,750,14 2 244 ocircumflex
+~o 501,737,14 2 245 otilde
+:o 501,729,14 2 246 odieresis
+tdi 479,548,42 0 247 divide
+/o 501,560,29 0 248 oslash
+`u 501,750,14 2 249 ugrave
+'u 501,750,14 2 250 uacute
+^u 501,750,14 2 251 ucircumflex
+:u 501,729,14 2 252 udieresis
+'y 456,750,214 3 253 yacute
+Tp 501,718,208 3 254 thorn
+:y 456,729,214 3 255 ydieresis
+u2026 820,146 0 256 ellipsis
diff --git a/font/devps/old/HNBI b/font/devps/old/HNBI
new file mode 100644
index 0000000..74414b4
--- /dev/null
+++ b/font/devps/old/HNBI
@@ -0,0 +1,482 @@
+name HNBI
+internalname Helvetica-Narrow-BoldOblique
+slant 12
+spacewidth 228
+encoding text.enc
+ligatures fi fl 0
+kernpairs
+A y -30
+A w -30
+A v -40
+A u -30
+A Y -110
+A W -60
+A V -80
+A U -50
+A T -90
+A Q -40
+A O -40
+A G -50
+A C -40
+B U -10
+B A -30
+D . -30
+D , -30
+D Y -70
+D W -40
+D V -40
+D A -40
+F . -100
+F , -100
+F a -20
+F A -80
+J u -20
+J . -20
+J , -20
+J A -20
+K y -40
+K u -30
+K o -35
+K e -15
+K O -30
+L y -30
+L ' -140
+L cq -140
+L rq -140
+L Y -120
+L W -80
+L V -110
+L T -90
+O . -40
+O , -40
+O Y -70
+O X -50
+O W -50
+O V -50
+O T -40
+O A -50
+P . -120
+P o -40
+P e -30
+P , -120
+P a -30
+P A -100
+Q . 20
+Q , 20
+Q U -10
+R Y -50
+R W -40
+R V -50
+R U -20
+R T -20
+R O -20
+T y -60
+T w -60
+T u -90
+T ; -40
+T r -80
+T . -80
+T o -80
+T - -120
+T hy -120
+T e -60
+T , -80
+T : -40
+T a -80
+T O -40
+T A -90
+U . -30
+U , -30
+U A -50
+V u -60
+V ; -40
+V . -120
+V o -90
+V - -80
+V hy -80
+V e -50
+V , -120
+V : -40
+V a -60
+V O -50
+V G -50
+V A -80
+W y -20
+W u -45
+W ; -10
+W . -80
+W o -60
+W - -40
+W hy -40
+W e -35
+W , -80
+W : -10
+W a -40
+W O -20
+W A -60
+Y u -100
+Y ; -50
+Y . -100
+Y o -100
+Y e -80
+Y , -100
+Y : -50
+Y a -90
+Y O -70
+Y A -110
+a y -20
+a w -15
+a v -15
+a g -10
+b y -20
+b v -20
+b u -20
+b l -10
+c y -10
+c l -20
+c k -20
+c h -10
+: u0020 -40
+, u0020 -40
+, ' -120
+, cq -120
+, rq -120
+d y -15
+d w -15
+d v -15
+d d -10
+e y -15
+e x -15
+e w -15
+e v -15
+e . 20
+e , 10
+f ' 30
+f cq 30
+f rq 30
+f . -10
+f o -20
+f e -10
+f , -10
+g g -10
+g e 10
+h y -20
+k o -15
+l y -15
+l w -15
+m y -30
+m u -20
+n y -20
+n v -40
+n u -10
+o y -20
+o x -30
+o w -15
+o v -20
+p y -15
+. u0020 -40
+. ' -120
+. cq -120
+. rq -120
+rq u0020 -80
+` ` -46
+` oq -46
+oq ` -46
+oq oq -46
+' v -20
+cq v -20
+' u0020 -80
+cq u0020 -80
+' s -60
+cq s -60
+' r -40
+cq r -40
+' ' -46
+' cq -46
+cq ' -46
+cq cq -46
+' l -20
+cq l -20
+' d -80
+cq d -80
+r y 10
+r v 10
+r t 20
+r s -15
+r q -20
+r . -60
+r o -20
+r - -20
+r hy -20
+r g -15
+r d -20
+r , -60
+r c -20
+s w -15
+; u0020 -40
+u0020 ` -60
+u0020 oq -60
+u0020 lq -80
+u0020 Y -120
+u0020 W -80
+u0020 V -80
+u0020 T -100
+v . -80
+v o -30
+v , -80
+v a -20
+w . -40
+w o -20
+w , -40
+x e -10
+y . -80
+y o -25
+y e -10
+y , -80
+y a -30
+z e 10
+charset
+ha 479,698,0,55,-57,55 2 0 asciicircum
+ti 479,343,0,44,-44,44 0 1 asciitilde
+vS 547,936,19,91,-16,90 2 2 Scaron
+vZ 501,936,0,153,30,90 2 3 Zcaron
+vs 456,750,14,98,-2,90 2 4 scaron
+vz 410,750,0,121,34,90 2 5 zcaron
+:Y 547,915,0,164,-87,90 2 6 Ydieresis
+tm 820,718,0,139,-96,90 2 7 trademark
+aq 195,718,0,118,-85,90 2 8 quotesingle
+space 228 0 32 space
+! 273,718,0,102,-27,90 2 33 exclam
+" 389,718,0,94,-108,90 2 34 quotedbl
+dq "
+# 456,698,0,122,1,90 2 35 numbersign
+sh "
+$ 456,775,115,104,-5,90 2 36 dollar
+Do "
+% 729,710,19,60,-62,60 2 37 percent
+& 592,718,19,58,-23,58 2 38 ampersand
+' 228,718,0,119,-87,90 2 39 quoteright
+cq "
+( 273,734,208,162,-12,90 3 40 parenleft
+) 273,734,208,79,71,79 3 41 parenright
+* 319,718,0,125,-70,90 2 42 asterisk
++ 479,506,0,71,-17,71 0 43 plus
+, 228,146,168,23,27,23 0 44 comma
+- 273,345,0,88,-10,88 0 45 hyphen
+hy "
+. 228,146,0,23,-2,23 0 46 period
+/ 228,737,19,205,80,90 2 47 slash
+sl "
+0 456,710,19,100,-21,90 2 48 zero
+1 456,710,0,28,-92,28 2 49 one
+2 456,710,0,102,29,90 2 50 two
+3 456,710,19,93,-4,90 2 51 three
+4 456,710,0,84,0,84 2 52 four
+5 456,698,19,116,-3,90 2 53 five
+6 456,710,19,101,-20,90 2 54 six
+7 456,698,0,149,-52,90 2 55 seven
+8 456,710,19,99,-7,90 2 56 eight
+9 456,710,19,98,-14,90 2 57 nine
+: 273,512,0,65,-25,65 0 58 colon
+; 273,512,168,65,4,65 0 59 semicolon
+< 479,514,8,108,-17,90 0 60 less
+= 479,419,0,90,2,90 0 61 equal
+> 479,514,8,71,20,71 0 62 greater
+? 501,727,0,99,-85,90 2 63 question
+@ 800,737,19,32,-102,32 2 64 at
+at "
+A 592,718,0,34,34,34 2 65 A
+B 592,718,0,84,-12,84 2 66 B
+C 592,737,19,105,-38,90 2 67 C
+D 592,718,0,95,-12,90 2 68 D
+E 547,718,0,123,-12,90 2 69 E
+F 501,718,0,155,-12,90 2 70 F
+G 638,737,19,82,-39,82 2 71 G
+H 592,718,0,117,-8,90 2 72 H
+I 228,718,0,123,-2,90 2 73 I
+J 456,718,18,116,1,90 2 74 J
+K 592,718,0,161,-21,90 2 75 K
+L 501,718,0,50,-12,50 2 76 L
+M 683,718,0,119,-7,90 2 77 M
+N 592,718,0,119,-7,90 2 78 N
+O 638,737,19,87,-38,87 2 79 O
+P 547,718,0,108,-12,90 2 80 P
+Q 638,737,52,87,-38,87 2 81 Q
+R 592,718,0,96,-12,90 2 82 R
+S 547,737,19,91,-16,90 2 83 S
+T 501,718,0,164,-64,90 2 84 T
+U 592,718,19,117,-46,90 2 85 U
+V 547,718,0,159,-91,90 2 86 V
+W 774,718,0,163,-88,90 2 87 W
+X 547,718,0,151,39,90 2 88 X
+Y 547,718,0,164,-87,90 2 89 Y
+Z 501,718,0,153,30,90 2 90 Z
+[ 273,722,196,156,33,90 2 91 bracketleft
+lB "
+\ 228,737,19,74,-51,74 2 92 backslash
+rs "
+] 273,722,196,124,64,90 2 93 bracketright
+rB "
+a^ 273,750,0,164,-47,90 2 94 circumflex
+^ "
+_ 456,0,125,37,72,37 0 95 underscore
+` 228,727,0,118,-86,90 2 96 quoteleft
+oq "
+a 456,546,14,72,5,72 0 97 a
+b 501,718,14,78,0,78 2 98 b
+c 456,546,14,85,-15,85 0 99 c
+d 501,718,14,126,-17,90 2 100 d
+e 456,546,14,80,-8,80 0 101 e
+f 273,727,0,162,-21,90 2 102 f
+g 501,546,217,95,19,90 1 103 g
+h 501,718,0,65,-3,65 2 104 h
+i 228,725,0,120,-7,90 2 105 i
+j 228,725,214,120,85,90 3 106 j
+k 456,718,0,143,-7,90 2 107 k
+l 228,718,0,119,-7,90 2 108 l
+m 729,546,0,67,-2,67 0 109 m
+n 501,546,0,65,-3,65 0 110 n
+o 501,546,14,76,-17,76 0 111 o
+p 501,546,207,78,35,78 1 112 p
+q 501,546,207,94,-16,90 1 113 q
+r 319,546,0,132,-2,90 0 114 r
+s 456,546,14,73,-2,73 0 115 s
+t 273,676,6,123,-32,90 2 116 t
+u 501,532,14,89,-30,89 0 117 u
+v 456,532,0,132,-53,90 0 118 v
+w 638,532,0,135,-51,90 0 119 w
+x 456,532,0,125,38,90 0 120 x
+y 456,532,214,129,16,90 1 121 y
+z 410,532,0,118,34,90 0 122 z
+lC 319,722,196,156,-27,90 2 123 braceleft
+{ "
+ba 230,737,19,109,-16,90 2 124 bar
+| "
+rC 319,722,196,64,64,64 2 125 braceright
+} "
+a~ 273,737,0,192,-42,90 2 126 tilde
+~ "
+bq 228,127,146,16,16,16 0 128 quotesinglbase
+Fo 456,484,0,62,-61,62 0 129 guillemotleft
+Fc 456,484,0,37,-35,37 0 130 guillemotright
+bu 287,524,0,108,-18,90 0 131 bullet
+Fn 456,737,210,142,91,90 3 132 florin
+f/ 137,710,19,312,193,90 2 133 fraction
+%0 820,710,19,81,-12,81 2 134 perthousand
+dg 456,718,171,107,-47,90 2 135 dagger
+dd 456,718,171,109,12,90 2 136 daggerdbl
+en 456,333,0,108,10,90 0 137 endash
+em 820,333,0,108,10,90 0 138 emdash
+fi 501,727,0,120,-21,90 2 140 fi
+fl 501,727,0,119,-21,90 2 141 fl
+.i 228,532,0,86,-7,86 0 144 dotlessi
+ga 273,750,0,67,-62,67 2 146 grave
+a" 273,750,0,306,-63,90 2 147 hungarumlaut
+a. 273,729,0,93,-142,90 2 148 dotaccent
+ab 273,750,0,182,-78,90 2 149 breve
+ah 273,750,0,189,-73,90 2 150 caron
+ao 273,776,0,121,-114,90 2 151 ring
+ho 273,0,228,0,17 1 152 ogonek
+lq 410,727,0,122,-82,90 2 153 quotedblleft
+rq 410,718,0,123,-82,90 2 154 quotedblright
+oe 774,546,14,77,-17,77 0 155 oe
+/l 228,718,0,156,17,90 2 156 lslash
+Bq 410,127,146,20,21,20 0 157 quotedblbase
+OE 820,737,19,143,-31,90 2 158 OE
+/L 501,718,0,50,22,50 2 159 Lslash
+r! 273,532,186,67,9,67 0 161 exclamdown
+ct 456,628,118,85,-15,85 0 162 cent
+Po 456,718,16,114,9,90 2 163 sterling
+Cs 456,636,0,152,28,90 0 164 currency
+Ye 456,698,0,179,1,90 2 165 yen
+bb 230,737,19,109,-16,90 2 166 brokenbar
+sc 456,727,184,85,0,85 2 167 section
+ad 273,729,0,172,-62,90 2 168 dieresis
+co 604,737,19,131,4,90 2 169 copyright
+Of 303,737,0,128,-25,90 2 170 ordfeminine
+fo 273,484,0,66,-56,66 0 171 guilsinglleft
+tno 479,419,0,90,-36,90 0 172 logicalnot
+\- 479,309,0,71,-17,71 0 173 minus
+rg 604,737,19,130,5,90 2 174 registered
+a- 273,678,0,173,-50,90 2 175 macron
+de 328,712,0,105,-93,90 2 176 degree
+t+- 479,506,0,83,17,83 0 177 plusminus
+S2 273,710,0,145,-7,90 2 178 twosuperior
+S3 273,710,0,138,-25,90 2 179 threesuperior
+aa 273,750,0,200,-144,90 2 180 acute
+mc 501,532,207,89,32,89 1 181 mu
+ps 456,700,191,158,-30,90 2 182 paragraph
+pc 228,334,0,48,-40,48 0 183 periodcentered
+ac 273,0,228,0,80 1 184 cedilla
+S1 273,710,0,95,-71,90 2 185 onesuperior
+Om 299,737,0,149,-25,90 2 186 ordmasculine
+fc 273,484,0,41,-31,41 0 187 guilsinglright
+14 684,710,19,27,-58,27 2 188 onequarter
+12 684,710,19,70,-58,70 2 189 onehalf
+34 684,710,19,54,-32,54 2 190 threequarters
+r? 501,532,195,8,6,8 0 191 questiondown
+`A 592,936,0,34,34,34 2 192 Agrave
+'A 592,936,0,73,34,73 2 193 Aacute
+^A 592,936,0,37,34,37 2 194 Acircumflex
+~A 592,923,0,66,34,66 2 195 Atilde
+:A 592,915,0,46,34,46 2 196 Adieresis
+oA 592,962,0,34,34,34 2 197 Aring
+AE 820,718,0,132,46,90 2 198 AE
+,C 592,737,228,105,-38,90 3 199 Ccedilla
+`E 547,936,0,123,-12,90 2 200 Egrave
+'E 547,936,0,123,-12,90 2 201 Eacute
+^E 547,936,0,123,-12,90 2 202 Ecircumflex
+:E 547,915,0,123,-12,90 2 203 Edieresis
+`I 228,936,0,123,-2,90 2 204 Igrave
+'I 228,936,0,255,-2,90 2 205 Iacute
+^I 228,936,0,219,-2,90 2 206 Icircumflex
+:I 228,915,0,227,-2,90 2 207 Idieresis
+-D 592,718,0,95,-1,90 2 208 Eth
+~N 592,923,0,119,-7,90 2 209 Ntilde
+`O 638,936,19,87,-38,87 2 210 Ograve
+'O 638,936,19,87,-38,87 2 211 Oacute
+^O 638,936,19,87,-38,87 2 212 Ocircumflex
+~O 638,923,19,87,-38,87 2 213 Otilde
+:O 638,915,19,87,-38,87 2 214 Odieresis
+tmu 479,505,0,91,3,90 0 215 multiply
+/O 638,745,27,145,21,90 2 216 Oslash
+`U 592,936,19,117,-46,90 2 217 Ugrave
+'U 592,936,19,117,-46,90 2 218 Uacute
+^U 592,936,19,117,-46,90 2 219 Ucircumflex
+:U 592,915,19,117,-46,90 2 220 Udieresis
+'Y 547,936,0,164,-87,90 2 221 Yacute
+TP 547,718,0,91,-12,90 2 222 Thorn
+ss 501,731,14,88,-7,88 2 223 germandbls
+`a 456,750,14,72,5,72 2 224 agrave
+'a 456,750,14,108,5,90 2 225 aacute
+^a 456,750,14,72,5,72 2 226 acircumflex
+~a 456,737,14,101,5,90 2 227 atilde
+:a 456,729,14,81,5,81 2 228 adieresis
+oa 456,776,14,72,5,72 2 229 aring
+ae 729,546,14,78,4,78 0 230 ae
+,c 456,546,228,85,-15,85 1 231 ccedilla
+`e 456,750,14,80,-8,80 2 232 egrave
+'e 456,750,14,108,-8,90 2 233 eacute
+^e 456,750,14,80,-8,80 2 234 ecircumflex
+:e 456,729,14,81,-8,81 2 235 edieresis
+`i 228,750,0,90,-7,90 2 236 igrave
+'i 228,750,0,222,-7,90 2 237 iacute
+^i 228,750,0,186,-7,90 2 238 icircumflex
+:i 228,729,0,195,-7,90 2 239 idieresis
+Sd 501,737,14,98,-17,90 2 240 eth
+~n 501,737,0,78,-3,78 2 241 ntilde
+`o 501,750,14,76,-17,76 2 242 ograve
+'o 501,750,14,86,-17,86 2 243 oacute
+^o 501,750,14,76,-17,76 2 244 ocircumflex
+~o 501,737,14,78,-17,78 2 245 otilde
+:o 501,729,14,76,-17,76 2 246 odieresis
+tdi 479,548,42,71,-17,71 0 247 divide
+/o 501,560,29,124,32,90 0 248 oslash
+`u 501,750,14,89,-30,89 2 249 ugrave
+'u 501,750,14,89,-30,89 2 250 uacute
+^u 501,750,14,89,-30,89 2 251 ucircumflex
+:u 501,729,14,89,-30,89 2 252 udieresis
+'y 456,750,214,129,16,90 3 253 yacute
+Tp 501,718,208,78,35,78 3 254 thorn
+:y 456,729,214,129,16,90 3 255 ydieresis
+u2026 820,146,0,0,-25 0 256 ellipsis
diff --git a/font/devps/old/HNI b/font/devps/old/HNI
new file mode 100644
index 0000000..a9c39ed
--- /dev/null
+++ b/font/devps/old/HNI
@@ -0,0 +1,521 @@
+name HNI
+internalname Helvetica-Narrow-Oblique
+slant 12
+spacewidth 228
+encoding text.enc
+ligatures fi fl 0
+kernpairs
+A y -40
+A w -40
+A v -40
+A u -30
+A Y -100
+A W -50
+A V -70
+A U -50
+A T -120
+A Q -30
+A O -30
+A G -30
+A C -30
+B . -20
+B , -20
+B U -10
+C . -30
+C , -30
+D . -70
+D , -70
+D Y -90
+D W -40
+D V -70
+D A -40
+F r -45
+F . -150
+F o -30
+F e -30
+F , -150
+F a -50
+F A -80
+J u -20
+J . -30
+J , -30
+J a -20
+J A -20
+K y -50
+K u -30
+K o -40
+K e -40
+K O -50
+L y -30
+L ' -160
+L cq -160
+L rq -140
+L Y -140
+L W -70
+L V -110
+L T -110
+O . -40
+O , -40
+O Y -70
+O X -60
+O W -30
+O V -50
+O T -40
+O A -20
+P . -180
+P o -50
+P e -50
+P , -180
+P a -40
+P A -120
+Q U -10
+R Y -50
+R W -30
+R V -50
+R U -40
+R T -30
+R O -20
+S . -20
+S , -20
+T y -120
+T w -120
+T u -120
+T ; -20
+T r -120
+T . -120
+T o -120
+T - -140
+T hy -140
+T e -120
+T , -120
+T : -20
+T a -120
+T O -40
+T A -120
+U . -40
+U , -40
+U A -40
+V u -70
+V ; -40
+V . -125
+V o -80
+V - -80
+V hy -80
+V e -80
+V , -125
+V : -40
+V a -70
+V O -40
+V G -40
+V A -80
+W y -20
+W u -30
+W . -80
+W o -30
+W - -40
+W hy -40
+W e -30
+W , -80
+W a -40
+W O -20
+W A -50
+Y u -110
+Y ; -60
+Y . -140
+Y o -140
+Y i -20
+Y - -140
+Y hy -140
+Y e -140
+Y , -140
+Y : -60
+Y a -140
+Y O -85
+Y A -110
+a y -30
+a w -20
+a v -20
+b y -20
+b v -20
+b u -20
+b . -40
+b l -20
+b , -40
+b b -10
+c k -20
+c , -15
+: u0020 -50
+, ' -100
+, cq -100
+, rq -100
+e y -20
+e x -30
+e w -20
+e v -30
+e . -15
+e , -15
+f ' 50
+f cq 50
+f rq 60
+f . -30
+f o -30
+f e -30
+f .i -28
+f , -30
+f a -30
+g r -10
+h y -30
+k o -20
+k e -20
+m y -15
+m u -10
+n y -15
+n v -20
+n u -10
+o y -30
+o x -30
+o w -15
+o v -15
+o . -40
+o , -40
+/o z -55
+/o y -70
+/o x -85
+/o w -70
+/o v -70
+/o u -55
+/o t -55
+/o s -55
+/o r -55
+/o q -55
+/o . -95
+/o p -55
+/o o -55
+/o n -55
+/o m -55
+/o l -55
+/o k -55
+/o j -55
+/o i -55
+/o h -55
+/o g -55
+/o f -55
+/o e -55
+/o d -55
+/o , -95
+/o c -55
+/o b -55
+/o a -55
+p y -30
+p . -35
+p , -35
+. u0020 -60
+. ' -100
+. cq -100
+. rq -100
+rq u0020 -40
+` ` -57
+` oq -57
+oq ` -57
+oq oq -57
+' u0020 -70
+cq u0020 -70
+' s -50
+cq s -50
+' r -50
+cq r -50
+' ' -57
+' cq -57
+cq ' -57
+cq cq -57
+' d -50
+cq d -50
+r y 30
+r v 30
+r u 15
+r t 40
+r ; 30
+r . -50
+r p 30
+r n 25
+r m 25
+r l 15
+r k 15
+r i 15
+r , -50
+r : 30
+r a -10
+s w -30
+s . -15
+s , -15
+; u0020 -50
+u0020 ` -60
+u0020 oq -60
+u0020 lq -30
+u0020 Y -90
+u0020 W -40
+u0020 V -50
+u0020 T -50
+v . -80
+v o -25
+v e -25
+v , -80
+v a -25
+w . -60
+w o -10
+w e -10
+w , -60
+w a -15
+x e -30
+y . -100
+y o -20
+y e -20
+y , -100
+y a -20
+z o -15
+z e -15
+charset
+ha 385,688,0,107,15,89 2 0 asciicircum
+ti 479,326,0,47,-41,47 0 1 asciitilde
+vS 547,929,19,87,-24,87 2 2 Scaron
+vZ 501,929,0,156,31,89 2 3 Zcaron
+vs 410,734,15,93,-2,89 2 4 scaron
+vz 410,734,0,108,25,89 2 5 zcaron
+:Y 547,901,0,164,-87,89 2 6 Ydieresis
+tm 820,718,0,96,-102,89 2 7 trademark
+aq 157,718,0,126,-79,89 2 8 quotesingle
+space 228 0 32 space
+! 228,718,0,100,-24,89 2 33 exclam
+" 291,718,0,118,-88,89 2 34 quotedbl
+dq "
+# 456,688,0,111,-10,89 2 35 numbersign
+sh "
+$ 456,775,115,100,-7,89 2 36 dollar
+Do "
+% 729,703,19,50,-70,50 2 37 percent
+& 547,718,15,33,-13,33 2 38 ampersand
+' 182,718,0,122,-74,89 2 39 quoteright
+cq "
+( 273,733,207,149,-39,89 3 40 parenleft
+) 273,733,207,53,57,53 3 41 parenright
+* 319,718,0,120,-85,89 2 42 asterisk
++ 479,505,0,68,-20,68 0 43 plus
+, 228,106,147,0,4 0 44 comma
+- 273,322,0,70,-27,70 0 45 hyphen
+hy "
+. 228,106,0,0,-21 0 46 period
+/ 228,737,19,192,67,89 2 47 slash
+sl "
+0 456,703,19,93,-27,89 2 48 zero
+1 456,703,0,11,-120,11 2 49 one
+2 456,703,0,100,29,89 2 50 two
+3 456,703,19,94,-11,89 2 51 three
+4 456,703,0,66,0,66 2 52 four
+5 456,688,19,103,-5,89 2 53 five
+6 456,703,19,98,-24,89 2 54 six
+7 456,688,0,143,-62,89 2 55 seven
+8 456,703,19,91,-10,89 2 56 eight
+9 456,703,19,93,-17,89 2 57 nine
+: 228,516,0,69,-21,69 0 58 colon
+; 228,516,147,69,4,69 0 59 semicolon
+< 479,495,0,97,-27,89 0 60 less
+= 479,390,0,86,-2,86 0 61 equal
+> 479,495,0,61,9,61 0 62 greater
+? 456,727,0,94,-82,89 2 63 question
+@ 832,737,19,9,-126,9 2 64 at
+at "
+A 547,718,0,39,39,39 2 65 A
+B 547,718,0,86,-11,86 2 66 B
+C 592,737,19,98,-38,89 2 67 C
+D 592,718,0,84,-16,84 2 68 D
+E 547,718,0,128,-21,89 2 69 E
+F 501,718,0,152,-21,89 2 70 F
+G 638,737,19,67,-41,67 2 71 G
+H 592,718,0,113,-13,89 2 72 H
+I 228,718,0,101,-25,89 2 73 I
+J 410,718,19,116,11,89 2 74 J
+K 547,718,0,165,-12,89 2 75 K
+L 456,718,0,49,-12,49 2 76 L
+M 683,718,0,116,-10,89 2 77 M
+N 592,718,0,113,-12,89 2 78 N
+O 638,737,19,89,-36,89 2 79 O
+P 547,718,0,107,-21,89 2 80 P
+Q 638,737,56,89,-36,89 2 81 Q
+R 592,718,0,92,-22,89 2 82 R
+S 547,737,19,87,-24,87 2 83 S
+T 501,718,0,164,-72,89 2 84 T
+U 592,718,19,111,-51,89 2 85 U
+V 547,718,0,159,-92,89 2 86 V
+W 774,718,0,162,-88,89 2 87 W
+X 547,718,0,150,34,89 2 88 X
+Y 547,718,0,164,-87,89 2 89 Y
+Z 501,718,0,156,31,89 2 90 Z
+[ 228,722,196,153,33,89 2 91 bracketleft
+lB "
+\ 228,737,19,61,-65,61 2 92 backslash
+rs "
+] 228,722,196,124,61,89 2 93 bracketright
+rB "
+a^ 273,734,0,136,-71,89 2 94 circumflex
+^ "
+_ 456,0,125,37,72,37 0 95 underscore
+` 182,725,0,133,-85,89 2 96 quoteleft
+oq "
+a 456,538,15,52,0,52 0 97 a
+b 456,718,15,73,2,73 2 98 b
+c 410,538,15,94,-11,89 0 99 c
+d 456,718,15,128,-19,89 2 100 d
+e 456,538,15,68,-19,68 0 101 e
+f 228,728,0,163,-21,89 2 102 f
+g 456,538,220,94,16,89 1 103 g
+h 456,718,0,64,-3,64 2 104 h
+i 182,718,0,120,-5,89 2 105 i
+j 182,718,210,120,99,89 3 106 j
+k 410,718,0,132,-5,89 2 107 k
+l 182,718,0,120,-5,89 2 108 l
+m 683,538,0,66,-3,66 0 109 m
+n 456,538,0,64,-3,64 0 110 n
+o 456,538,14,73,-18,73 0 111 o
+p 456,538,207,73,39,73 1 112 p
+q 456,538,207,90,-19,89 1 113 q
+r 273,538,0,142,-13,89 0 114 r
+s 410,538,15,74,-2,74 0 115 s
+t 228,669,7,124,-34,89 2 116 t
+u 456,523,15,86,-27,86 0 117 u
+v 410,523,0,135,-48,89 0 118 v
+w 592,523,0,131,-53,89 0 119 w
+x 410,523,0,127,41,89 0 120 x
+y 410,523,214,132,38,89 1 121 y
+z 410,523,0,108,25,89 0 122 z
+lC 274,722,196,141,-25,89 2 123 braceleft
+{ "
+ba 213,737,19,102,-24,89 2 124 bar
+| "
+rC 274,722,196,67,50,67 2 125 braceright
+} "
+a~ 273,722,0,179,-52,89 2 126 tilde
+~ "
+bq 182,106,149,15,33,15 0 128 quotesinglbase
+Fo 456,446,0,48,-70,48 0 129 guillemotleft
+Fc 456,446,0,27,-48,27 0 130 guillemotright
+bu 287,517,0,102,-24,89 0 131 bullet
+Fn 456,737,207,131,93,89 3 132 florin
+f/ 137,703,19,309,189,89 2 133 fraction
+%0 820,703,19,74,-22,74 2 134 perthousand
+dg 456,718,159,104,-60,89 2 135 dagger
+dd 456,718,159,105,7,89 2 136 daggerdbl
+en 456,313,0,104,8,89 0 137 endash
+em 820,313,0,105,8,89 0 138 emdash
+fi 410,728,0,121,-21,89 2 140 fi
+fl 410,728,0,119,-21,89 2 141 fl
+.i 228,523,0,63,-28,63 0 144 dotlessi
+ga 273,734,0,53,-89,53 2 146 grave
+a" 273,734,0,240,-79,89 2 147 hungarumlaut
+a. 273,706,0,74,-154,74 2 148 dotaccent
+ab 273,731,0,168,-87,89 2 149 breve
+ah 273,734,0,161,-95,89 2 150 caron
+ao 273,756,0,107,-125,89 2 151 ring
+ho 273,0,225,0,15 1 152 ogonek
+lq 273,725,0,155,-63,89 2 153 quotedblleft
+rq 273,718,0,144,-52,89 2 154 quotedblright
+oe 774,538,15,67,-18,67 0 155 oe
+/l 182,718,0,152,16,89 2 156 lslash
+Bq 273,106,149,37,55,37 0 157 quotedblbase
+OE 820,737,19,145,-30,89 2 158 OE
+/L 456,718,0,49,16,49 2 159 Lslash
+r! 273,523,195,44,-13,44 0 161 exclamdown
+ct 456,623,115,73,-28,73 0 162 cent
+Po 456,718,16,114,10,89 2 163 sterling
+Cs 456,603,0,124,1,89 0 164 currency
+Ye 456,688,0,167,-17,89 2 165 yen
+bb 213,737,19,102,-24,89 2 166 brokenbar
+sc 456,737,191,73,-13,73 2 167 section
+ad 273,706,0,140,-88,89 2 168 dieresis
+co 604,737,19,133,6,89 2 169 copyright
+Of 303,737,0,115,-32,89 2 170 ordfeminine
+fo 273,446,0,56,-62,56 0 171 guilsinglleft
+tno 479,390,0,86,-37,86 0 172 logicalnot
+\- 479,289,0,68,-20,68 0 173 minus
+rg 604,737,19,133,6,89 2 174 registered
+a- 273,684,0,161,-67,89 2 175 macron
+de 328,703,0,106,-88,89 2 176 degree
+t+- 479,506,0,78,18,78 0 177 plusminus
+S2 273,703,0,145,-2,89 2 178 twosuperior
+S3 273,703,0,135,-24,89 2 179 threesuperior
+aa 273,734,0,167,-153,89 2 180 acute
+mc 456,523,207,86,30,86 1 181 mu
+ps 440,718,173,143,-53,89 2 182 paragraph
+pc 228,315,0,33,-56,33 0 183 periodcentered
+ac 273,0,225,0,48 1 184 cedilla
+S1 273,703,0,82,-86,82 2 185 onesuperior
+Om 299,737,0,135,-32,89 2 186 ordmasculine
+fc 273,446,0,34,-41,34 0 187 guilsinglright
+14 684,703,19,24,-73,24 2 188 onequarter
+12 684,703,19,54,-43,54 2 189 onehalf
+34 684,703,19,72,-56,72 2 190 threequarters
+r? 501,525,201,0,-20 0 191 questiondown
+`A 547,929,0,39,39,39 2 192 Agrave
+'A 547,929,0,63,39,63 2 193 Aacute
+^A 547,929,0,39,39,39 2 194 Acircumflex
+~A 547,917,0,76,39,76 2 195 Atilde
+:A 547,901,0,39,39,39 2 196 Adieresis
+oA 547,931,0,39,39,39 2 197 Aring
+AE 820,718,0,129,43,89 2 198 AE
+,C 592,737,225,98,-38,89 3 199 Ccedilla
+`E 547,929,0,128,-21,89 2 200 Egrave
+'E 547,929,0,128,-21,89 2 201 Eacute
+^E 547,929,0,128,-21,89 2 202 Ecircumflex
+:E 547,901,0,128,-21,89 2 203 Edieresis
+`I 228,929,0,110,-25,89 2 204 Igrave
+'I 228,929,0,223,-25,89 2 205 Iacute
+^I 228,929,0,193,-25,89 2 206 Icircumflex
+:I 228,901,0,197,-25,89 2 207 Idieresis
+-D 592,718,0,84,-7,84 2 208 Eth
+~N 592,917,0,113,-12,89 2 209 Ntilde
+`O 638,929,19,89,-36,89 2 210 Ograve
+'O 638,929,19,89,-36,89 2 211 Oacute
+^O 638,929,19,89,-36,89 2 212 Ocircumflex
+~O 638,917,19,89,-36,89 2 213 Otilde
+:O 638,901,19,89,-36,89 2 214 Odieresis
+tmu 479,506,0,97,9,89 0 215 multiply
+/O 638,737,19,142,15,89 2 216 Oslash
+`U 592,929,19,111,-51,89 2 217 Ugrave
+'U 592,929,19,111,-51,89 2 218 Uacute
+^U 592,929,19,111,-51,89 2 219 Ucircumflex
+:U 592,901,19,111,-51,89 2 220 Udieresis
+'Y 547,929,0,164,-87,89 2 221 Yacute
+TP 547,718,0,87,-21,87 2 222 Thorn
+ss 501,728,15,88,-5,88 2 223 germandbls
+`a 456,734,15,52,0,52 2 224 agrave
+'a 456,734,15,75,0,75 2 225 aacute
+^a 456,734,15,52,0,52 2 226 acircumflex
+~a 456,722,15,80,0,80 2 227 atilde
+:a 456,706,15,52,0,52 2 228 adieresis
+oa 456,756,15,52,0,52 2 229 aring
+ae 729,538,15,67,0,67 0 230 ae
+,c 410,538,225,94,-11,89 1 231 ccedilla
+`e 456,734,15,68,-19,68 2 232 egrave
+'e 456,734,15,75,-19,75 2 233 eacute
+^e 456,734,15,68,-19,68 2 234 ecircumflex
+:e 456,706,15,68,-19,68 2 235 edieresis
+`i 228,734,0,76,-28,76 2 236 igrave
+'i 228,734,0,189,-28,89 2 237 iacute
+^i 228,734,0,159,-28,89 2 238 icircumflex
+:i 228,706,0,163,-28,89 2 239 idieresis
+Sd 456,737,15,100,-17,89 2 240 eth
+~n 456,722,0,80,-3,80 2 241 ntilde
+`o 456,734,14,73,-18,73 2 242 ograve
+'o 456,734,14,75,-18,75 2 243 oacute
+^o 456,734,14,73,-18,73 2 244 ocircumflex
+~o 456,722,14,88,-18,88 2 245 otilde
+:o 456,706,14,73,-18,73 2 246 odieresis
+tdi 479,524,19,68,-20,68 0 247 divide
+/o 501,545,22,80,26,80 0 248 oslash
+`u 456,734,15,86,-27,86 2 249 ugrave
+'u 456,734,15,86,-27,86 2 250 uacute
+^u 456,734,15,86,-27,86 2 251 ucircumflex
+:u 456,706,15,86,-27,86 2 252 udieresis
+'y 410,734,214,132,38,89 3 253 yacute
+Tp 456,718,207,73,39,73 3 254 thorn
+:y 410,706,214,132,38,89 3 255 ydieresis
+u2026 820,106,0,0,-44 0 256 ellipsis
diff --git a/font/devps/old/HNR b/font/devps/old/HNR
new file mode 100644
index 0000000..989bdf0
--- /dev/null
+++ b/font/devps/old/HNR
@@ -0,0 +1,520 @@
+name HNR
+internalname Helvetica-Narrow
+spacewidth 228
+encoding text.enc
+ligatures fi fl 0
+kernpairs
+A y -32
+A w -32
+A v -32
+A u -24
+A Y -81
+A W -40
+A V -56
+A U -40
+A T -97
+A Q -24
+A O -24
+A G -24
+A C -24
+B . -15
+B , -15
+B U -7
+C . -24
+C , -24
+D . -56
+D , -56
+D Y -73
+D W -32
+D V -56
+D A -32
+F r -36
+F . -122
+F o -24
+F e -24
+F , -122
+F a -40
+F A -65
+J u -15
+J . -24
+J , -24
+J a -15
+J A -15
+K y -40
+K u -24
+K o -32
+K e -32
+K O -40
+L y -24
+L ' -130
+L cq -130
+L rq -114
+L Y -114
+L W -56
+L V -89
+L T -89
+O . -32
+O , -32
+O Y -56
+O X -48
+O W -24
+O V -40
+O T -32
+O A -15
+P . -147
+P o -40
+P e -40
+P , -147
+P a -32
+P A -97
+Q U -7
+R Y -40
+R W -24
+R V -40
+R U -32
+R T -24
+R O -15
+S . -15
+S , -15
+T y -97
+T w -97
+T u -97
+T ; -15
+T r -97
+T . -97
+T o -97
+T - -114
+T hy -114
+T e -97
+T , -97
+T : -15
+T a -97
+T O -32
+T A -97
+U . -32
+U , -32
+U A -32
+V u -56
+V ; -32
+V . -102
+V o -65
+V - -65
+V hy -65
+V e -65
+V , -102
+V : -32
+V a -56
+V O -32
+V G -32
+V A -65
+W y -15
+W u -24
+W . -65
+W o -24
+W - -32
+W hy -32
+W e -24
+W , -65
+W a -32
+W O -15
+W A -40
+Y u -89
+Y ; -48
+Y . -114
+Y o -114
+Y i -15
+Y - -114
+Y hy -114
+Y e -114
+Y , -114
+Y : -48
+Y a -114
+Y O -69
+Y A -89
+a y -24
+a w -15
+a v -15
+b y -15
+b v -15
+b u -15
+b . -32
+b l -15
+b , -32
+b b -7
+c k -15
+c , -11
+: u0020 -40
+, ' -81
+, cq -81
+, rq -81
+e y -15
+e x -24
+e w -15
+e v -24
+e . -11
+e , -11
+f ' 41
+f cq 41
+f rq 49
+f . -24
+f o -24
+f e -24
+f .i -22
+f , -24
+f a -24
+g r -7
+h y -24
+k o -15
+k e -15
+m y -11
+m u -7
+n y -11
+n v -15
+n u -7
+o y -24
+o x -24
+o w -11
+o v -11
+o . -32
+o , -32
+/o z -44
+/o y -56
+/o x -69
+/o w -56
+/o v -56
+/o u -44
+/o t -44
+/o s -44
+/o r -44
+/o q -44
+/o . -77
+/o p -44
+/o o -44
+/o n -44
+/o m -44
+/o l -44
+/o k -44
+/o j -44
+/o i -44
+/o h -44
+/o g -44
+/o f -44
+/o e -44
+/o d -44
+/o , -77
+/o c -44
+/o b -44
+/o a -44
+p y -24
+p . -28
+p , -28
+. u0020 -48
+. ' -81
+. cq -81
+. rq -81
+rq u0020 -32
+` ` -46
+` oq -46
+oq ` -46
+oq oq -46
+' u0020 -56
+cq u0020 -56
+' s -40
+cq s -40
+' r -40
+cq r -40
+' ' -46
+' cq -46
+cq ' -46
+cq cq -46
+' d -40
+cq d -40
+r y 25
+r v 25
+r u 12
+r t 33
+r ; 25
+r . -40
+r p 25
+r n 21
+r m 21
+r l 12
+r k 12
+r i 12
+r , -40
+r : 25
+r a -7
+s w -24
+s . -11
+s , -11
+; u0020 -40
+u0020 ` -48
+u0020 oq -48
+u0020 lq -24
+u0020 Y -73
+u0020 W -32
+u0020 V -40
+u0020 T -40
+v . -65
+v o -20
+v e -20
+v , -65
+v a -20
+w . -48
+w o -7
+w e -7
+w , -48
+w a -11
+x e -24
+y . -81
+y o -15
+y e -15
+y , -81
+y a -15
+z o -11
+z e -11
+charset
+ha 385,688,0,11,11 2 0 asciicircum
+ti 479,326 0 1 asciitilde
+vS 547,929,19 2 2 Scaron
+vZ 501,929 2 3 Zcaron
+vs 410,734,15 2 4 scaron
+vz 410,734 2 5 zcaron
+:Y 547,901 2 6 Ydieresis
+tm 820,718 2 7 trademark
+aq 157,718 2 8 quotesingle
+space 228 0 32 space
+! 228,718 2 33 exclam
+" 291,718 2 34 quotedbl
+dq "
+# 456,688 2 35 numbersign
+sh "
+$ 456,775,115 2 36 dollar
+Do "
+% 729,703,19 2 37 percent
+& 547,718,15 2 38 ampersand
+' 182,718 2 39 quoteright
+cq "
+( 273,733,207 3 40 parenleft
+) 273,733,207 3 41 parenright
+* 319,718 2 42 asterisk
++ 479,505 0 43 plus
+, 228,106,147 0 44 comma
+- 273,322 0 45 hyphen
+hy "
+. 228,106 0 46 period
+/ 228,737,19,14,14 2 47 slash
+sl "
+0 456,703,19 2 48 zero
+1 456,703 2 49 one
+2 456,703 2 50 two
+3 456,703,19 2 51 three
+4 456,703 2 52 four
+5 456,688,19 2 53 five
+6 456,703,19 2 54 six
+7 456,688 2 55 seven
+8 456,703,19 2 56 eight
+9 456,703,19 2 57 nine
+: 228,516 0 58 colon
+; 228,516,147 0 59 semicolon
+< 479,495 0 60 less
+= 479,390 0 61 equal
+> 479,495 0 62 greater
+? 456,727 2 63 question
+@ 832,737,19 2 64 at
+at "
+A 547,718 2 65 A
+B 547,718 2 66 B
+C 592,737,19 2 67 C
+D 592,718 2 68 D
+E 547,718 2 69 E
+F 501,718 2 70 F
+G 638,737,19 2 71 G
+H 592,718 2 72 H
+I 228,718 2 73 I
+J 410,718,19 2 74 J
+K 547,718 2 75 K
+L 456,718 2 76 L
+M 683,718 2 77 M
+N 592,718 2 78 N
+O 638,737,19 2 79 O
+P 547,718 2 80 P
+Q 638,737,56 2 81 Q
+R 592,718 2 82 R
+S 547,737,19 2 83 S
+T 501,718 2 84 T
+U 592,718,19 2 85 U
+V 547,718 2 86 V
+W 774,718 2 87 W
+X 547,718 2 88 X
+Y 547,718 2 89 Y
+Z 501,718 2 90 Z
+[ 228,722,196 2 91 bracketleft
+lB "
+\ 228,737,19,14,14 2 92 backslash
+rs "
+] 228,722,196 2 93 bracketright
+rB "
+a^ 273,734 2 94 circumflex
+^ "
+_ 456,0,125 0 95 underscore
+` 182,725 2 96 quoteleft
+oq "
+a 456,538,15 0 97 a
+b 456,718,15 2 98 b
+c 410,538,15 0 99 c
+d 456,718,15 2 100 d
+e 456,538,15 0 101 e
+f 228,728 2 102 f
+g 456,538,220 1 103 g
+h 456,718 2 104 h
+i 182,718 2 105 i
+j 182,718,210,0,13 3 106 j
+k 410,718,0,1 2 107 k
+l 182,718 2 108 l
+m 683,538 0 109 m
+n 456,538 0 110 n
+o 456,538,14 0 111 o
+p 456,538,207 1 112 p
+q 456,538,207 1 113 q
+r 273,538 0 114 r
+s 410,538,15 0 115 s
+t 228,669,7 2 116 t
+u 456,523,15 0 117 u
+v 410,523 0 118 v
+w 592,523 0 119 w
+x 410,523 0 120 x
+y 410,523,214 1 121 y
+z 410,523 0 122 z
+lC 274,722,196 2 123 braceleft
+{ "
+ba 213,737,19 2 124 bar
+| "
+rC 274,722,196 2 125 braceright
+} "
+a~ 273,722,0,3,3 2 126 tilde
+~ "
+bq 182,106,149 0 128 quotesinglbase
+Fo 456,446 0 129 guillemotleft
+Fc 456,446 0 130 guillemotright
+bu 287,517 0 131 bullet
+Fn 456,737,207,0,9 3 132 florin
+f/ 137,703,19,136,136 2 133 fraction
+%0 820,703,19 2 134 perthousand
+dg 456,718,159 2 135 dagger
+dd 456,718,159 2 136 daggerdbl
+en 456,313 0 137 endash
+em 820,313 0 138 emdash
+fi 410,728 2 140 fi
+fl 410,728 2 141 fl
+.i 228,523 0 144 dotlessi
+ga 273,734 2 146 grave
+a" 273,734,0,62 2 147 hungarumlaut
+a. 273,706 2 148 dotaccent
+ab 273,731 2 149 breve
+ah 273,734 2 150 caron
+ao 273,756 2 151 ring
+ho 273,0,225 1 152 ogonek
+lq 273,725 2 153 quotedblleft
+rq 273,718 2 154 quotedblright
+oe 774,538,15 0 155 oe
+/l 182,718,0,16,16 2 156 lslash
+Bq 273,106,149 0 157 quotedblbase
+OE 820,737,19 2 158 OE
+/L 456,718,0,0,16 2 159 Lslash
+r! 273,523,195 0 161 exclamdown
+ct 456,623,115 0 162 cent
+Po 456,718,16 2 163 sterling
+Cs 456,603 0 164 currency
+Ye 456,688 2 165 yen
+bb 213,737,19 2 166 brokenbar
+sc 456,737,191 2 167 section
+ad 273,706 2 168 dieresis
+co 604,737,19,13,11 2 169 copyright
+Of 303,737 2 170 ordfeminine
+fo 273,446 0 171 guilsinglleft
+tno 479,390 0 172 logicalnot
+\- 479,289 0 173 minus
+rg 604,737,19,13,11 2 174 registered
+a- 273,684 2 175 macron
+de 328,703 2 176 degree
+t+- 479,506 0 177 plusminus
+S2 273,703 2 178 twosuperior
+S3 273,703 2 179 threesuperior
+aa 273,734 2 180 acute
+mc 456,523,207 1 181 mu
+ps 440,718,173 2 182 paragraph
+pc 228,315 0 183 periodcentered
+ac 273,0,225 1 184 cedilla
+S1 273,703 2 185 onesuperior
+Om 299,737 2 186 ordmasculine
+fc 273,446 0 187 guilsinglright
+14 684,703,19 2 188 onequarter
+12 684,703,19 2 189 onehalf
+34 684,703,19 2 190 threequarters
+r? 501,525,201 0 191 questiondown
+`A 547,929 2 192 Agrave
+'A 547,929 2 193 Aacute
+^A 547,929 2 194 Acircumflex
+~A 547,917 2 195 Atilde
+:A 547,901 2 196 Adieresis
+oA 547,931 2 197 Aring
+AE 820,718 2 198 AE
+,C 592,737,225 3 199 Ccedilla
+`E 547,929 2 200 Egrave
+'E 547,929 2 201 Eacute
+^E 547,929 2 202 Ecircumflex
+:E 547,901 2 203 Edieresis
+`I 228,929,0,0,11 2 204 Igrave
+'I 228,929,0,11 2 205 Iacute
+^I 228,929,0,6,5 2 206 Icircumflex
+:I 228,901 2 207 Idieresis
+-D 592,718 2 208 Eth
+~N 592,917 2 209 Ntilde
+`O 638,929,19 2 210 Ograve
+'O 638,929,19 2 211 Oacute
+^O 638,929,19 2 212 Ocircumflex
+~O 638,917,19 2 213 Otilde
+:O 638,901,19 2 214 Odieresis
+tmu 479,506 0 215 multiply
+/O 638,737,19 2 216 Oslash
+`U 592,929,19 2 217 Ugrave
+'U 592,929,19 2 218 Uacute
+^U 592,929,19 2 219 Ucircumflex
+:U 592,901,19 2 220 Udieresis
+'Y 547,929 2 221 Yacute
+TP 547,718 2 222 Thorn
+ss 501,728,15 2 223 germandbls
+`a 456,734,15 2 224 agrave
+'a 456,734,15 2 225 aacute
+^a 456,734,15 2 226 acircumflex
+~a 456,722,15 2 227 atilde
+:a 456,706,15 2 228 adieresis
+oa 456,756,15 2 229 aring
+ae 729,538,15 0 230 ae
+,c 410,538,225 1 231 ccedilla
+`e 456,734,15 2 232 egrave
+'e 456,734,15 2 233 eacute
+^e 456,734,15 2 234 ecircumflex
+:e 456,706,15 2 235 edieresis
+`i 228,734,0,0,11 2 236 igrave
+'i 228,734,0,11 2 237 iacute
+^i 228,734,0,6,5 2 238 icircumflex
+:i 228,706 2 239 idieresis
+Sd 456,737,15 2 240 eth
+~n 456,722 2 241 ntilde
+`o 456,734,14 2 242 ograve
+'o 456,734,14 2 243 oacute
+^o 456,734,14 2 244 ocircumflex
+~o 456,722,14 2 245 otilde
+:o 456,706,14 2 246 odieresis
+tdi 479,524,19 0 247 divide
+/o 501,545,22 0 248 oslash
+`u 456,734,15 2 249 ugrave
+'u 456,734,15 2 250 uacute
+^u 456,734,15 2 251 ucircumflex
+:u 456,706,15 2 252 udieresis
+'y 410,734,214 3 253 yacute
+Tp 456,718,207 3 254 thorn
+:y 410,706,214 3 255 ydieresis
+u2026 820,106 0 256 ellipsis
diff --git a/font/devps/old/HR b/font/devps/old/HR
new file mode 100644
index 0000000..cbf1ab8
--- /dev/null
+++ b/font/devps/old/HR
@@ -0,0 +1,520 @@
+name HR
+internalname Helvetica
+spacewidth 278
+encoding text.enc
+ligatures fi fl 0
+kernpairs
+A y -40
+A w -40
+A v -40
+A u -30
+A Y -100
+A W -50
+A V -70
+A U -50
+A T -120
+A Q -30
+A O -30
+A G -30
+A C -30
+B . -20
+B , -20
+B U -10
+C . -30
+C , -30
+D . -70
+D , -70
+D Y -90
+D W -40
+D V -70
+D A -40
+F r -45
+F . -150
+F o -30
+F e -30
+F , -150
+F a -50
+F A -80
+J u -20
+J . -30
+J , -30
+J a -20
+J A -20
+K y -50
+K u -30
+K o -40
+K e -40
+K O -50
+L y -30
+L ' -160
+L cq -160
+L rq -140
+L Y -140
+L W -70
+L V -110
+L T -110
+O . -40
+O , -40
+O Y -70
+O X -60
+O W -30
+O V -50
+O T -40
+O A -20
+P . -180
+P o -50
+P e -50
+P , -180
+P a -40
+P A -120
+Q U -10
+R Y -50
+R W -30
+R V -50
+R U -40
+R T -30
+R O -20
+S . -20
+S , -20
+T y -120
+T w -120
+T u -120
+T ; -20
+T r -120
+T . -120
+T o -120
+T - -140
+T hy -140
+T e -120
+T , -120
+T : -20
+T a -120
+T O -40
+T A -120
+U . -40
+U , -40
+U A -40
+V u -70
+V ; -40
+V . -125
+V o -80
+V - -80
+V hy -80
+V e -80
+V , -125
+V : -40
+V a -70
+V O -40
+V G -40
+V A -80
+W y -20
+W u -30
+W . -80
+W o -30
+W - -40
+W hy -40
+W e -30
+W , -80
+W a -40
+W O -20
+W A -50
+Y u -110
+Y ; -60
+Y . -140
+Y o -140
+Y i -20
+Y - -140
+Y hy -140
+Y e -140
+Y , -140
+Y : -60
+Y a -140
+Y O -85
+Y A -110
+a y -30
+a w -20
+a v -20
+b y -20
+b v -20
+b u -20
+b . -40
+b l -20
+b , -40
+b b -10
+c k -20
+c , -15
+: u0020 -50
+, ' -100
+, cq -100
+, rq -100
+e y -20
+e x -30
+e w -20
+e v -30
+e . -15
+e , -15
+f ' 50
+f cq 50
+f rq 60
+f . -30
+f o -30
+f e -30
+f .i -28
+f , -30
+f a -30
+g r -10
+h y -30
+k o -20
+k e -20
+m y -15
+m u -10
+n y -15
+n v -20
+n u -10
+o y -30
+o x -30
+o w -15
+o v -15
+o . -40
+o , -40
+/o z -55
+/o y -70
+/o x -85
+/o w -70
+/o v -70
+/o u -55
+/o t -55
+/o s -55
+/o r -55
+/o q -55
+/o . -95
+/o p -55
+/o o -55
+/o n -55
+/o m -55
+/o l -55
+/o k -55
+/o j -55
+/o i -55
+/o h -55
+/o g -55
+/o f -55
+/o e -55
+/o d -55
+/o , -95
+/o c -55
+/o b -55
+/o a -55
+p y -30
+p . -35
+p , -35
+. u0020 -60
+. ' -100
+. cq -100
+. rq -100
+rq u0020 -40
+` ` -57
+` oq -57
+oq ` -57
+oq oq -57
+' u0020 -70
+cq u0020 -70
+' s -50
+cq s -50
+' r -50
+cq r -50
+' ' -57
+' cq -57
+cq ' -57
+cq cq -57
+' d -50
+cq d -50
+r y 30
+r v 30
+r u 15
+r t 40
+r ; 30
+r . -50
+r p 30
+r n 25
+r m 25
+r l 15
+r k 15
+r i 15
+r , -50
+r : 30
+r a -10
+s w -30
+s . -15
+s , -15
+; u0020 -50
+u0020 ` -60
+u0020 oq -60
+u0020 lq -30
+u0020 Y -90
+u0020 W -40
+u0020 V -50
+u0020 T -50
+v . -80
+v o -25
+v e -25
+v , -80
+v a -25
+w . -60
+w o -10
+w e -10
+w , -60
+w a -15
+x e -30
+y . -100
+y o -20
+y e -20
+y , -100
+y a -20
+z o -15
+z e -15
+charset
+ha 469,688,0,14,14 2 0 asciicircum
+ti 584,326 0 1 asciitilde
+vS 667,929,19 2 2 Scaron
+vZ 611,929 2 3 Zcaron
+vs 500,734,15 2 4 scaron
+vz 500,734 2 5 zcaron
+:Y 667,901 2 6 Ydieresis
+tm 1000,718 2 7 trademark
+aq 191,718 2 8 quotesingle
+space 278 0 32 space
+! 278,718 2 33 exclam
+" 355,718 2 34 quotedbl
+dq "
+# 556,688 2 35 numbersign
+sh "
+$ 556,775,115 2 36 dollar
+Do "
+% 889,703,19 2 37 percent
+& 667,718,15 2 38 ampersand
+' 222,718 2 39 quoteright
+cq "
+( 333,733,207 3 40 parenleft
+) 333,733,207 3 41 parenright
+* 389,718 2 42 asterisk
++ 584,505 0 43 plus
+, 278,106,147 0 44 comma
+- 333,322 0 45 hyphen
+hy "
+. 278,106 0 46 period
+/ 278,737,19,17,17 2 47 slash
+sl "
+0 556,703,19 2 48 zero
+1 556,703 2 49 one
+2 556,703 2 50 two
+3 556,703,19 2 51 three
+4 556,703 2 52 four
+5 556,688,19 2 53 five
+6 556,703,19 2 54 six
+7 556,688 2 55 seven
+8 556,703,19 2 56 eight
+9 556,703,19 2 57 nine
+: 278,516 0 58 colon
+; 278,516,147 0 59 semicolon
+< 584,495 0 60 less
+= 584,390 0 61 equal
+> 584,495 0 62 greater
+? 556,727 2 63 question
+@ 1015,737,19 2 64 at
+at "
+A 667,718 2 65 A
+B 667,718 2 66 B
+C 722,737,19 2 67 C
+D 722,718 2 68 D
+E 667,718 2 69 E
+F 611,718 2 70 F
+G 778,737,19 2 71 G
+H 722,718 2 72 H
+I 278,718 2 73 I
+J 500,718,19 2 74 J
+K 667,718 2 75 K
+L 556,718 2 76 L
+M 833,718 2 77 M
+N 722,718 2 78 N
+O 778,737,19 2 79 O
+P 667,718 2 80 P
+Q 778,737,56 2 81 Q
+R 722,718 2 82 R
+S 667,737,19 2 83 S
+T 611,718 2 84 T
+U 722,718,19 2 85 U
+V 667,718 2 86 V
+W 944,718 2 87 W
+X 667,718 2 88 X
+Y 667,718 2 89 Y
+Z 611,718 2 90 Z
+[ 278,722,196 2 91 bracketleft
+lB "
+\ 278,737,19,17,17 2 92 backslash
+rs "
+] 278,722,196 2 93 bracketright
+rB "
+a^ 333,734 2 94 circumflex
+^ "
+_ 556,0,125 0 95 underscore
+` 222,725 2 96 quoteleft
+oq "
+a 556,538,15 0 97 a
+b 556,718,15 2 98 b
+c 500,538,15 0 99 c
+d 556,718,15 2 100 d
+e 556,538,15 0 101 e
+f 278,728 2 102 f
+g 556,538,220 1 103 g
+h 556,718 2 104 h
+i 222,718 2 105 i
+j 222,718,210,0,16 3 106 j
+k 500,718,0,1 2 107 k
+l 222,718 2 108 l
+m 833,538 0 109 m
+n 556,538 0 110 n
+o 556,538,14 0 111 o
+p 556,538,207 1 112 p
+q 556,538,207 1 113 q
+r 333,538 0 114 r
+s 500,538,15 0 115 s
+t 278,669,7 2 116 t
+u 556,523,15 0 117 u
+v 500,523 0 118 v
+w 722,523 0 119 w
+x 500,523 0 120 x
+y 500,523,214 1 121 y
+z 500,523 0 122 z
+lC 334,722,196 2 123 braceleft
+{ "
+ba 260,737,19 2 124 bar
+| "
+rC 334,722,196 2 125 braceright
+} "
+a~ 333,722,0,4,4 2 126 tilde
+~ "
+bq 222,106,149 0 128 quotesinglbase
+Fo 556,446 0 129 guillemotleft
+Fc 556,446 0 130 guillemotright
+bu 350,517 0 131 bullet
+Fn 556,737,207,0,11 3 132 florin
+f/ 167,703,19,166,166 2 133 fraction
+%0 1000,703,19 2 134 perthousand
+dg 556,718,159 2 135 dagger
+dd 556,718,159 2 136 daggerdbl
+en 556,313 0 137 endash
+em 1000,313 0 138 emdash
+fi 500,728 2 140 fi
+fl 500,728 2 141 fl
+.i 278,523 0 144 dotlessi
+ga 333,734 2 146 grave
+a" 333,734,0,76 2 147 hungarumlaut
+a. 333,706 2 148 dotaccent
+ab 333,731 2 149 breve
+ah 333,734 2 150 caron
+ao 333,756 2 151 ring
+ho 333,0,225 1 152 ogonek
+lq 333,725 2 153 quotedblleft
+rq 333,718 2 154 quotedblright
+oe 944,538,15 0 155 oe
+/l 222,718,0,20,20 2 156 lslash
+Bq 333,106,149 0 157 quotedblbase
+OE 1000,737,19 2 158 OE
+/L 556,718,0,0,20 2 159 Lslash
+r! 333,523,195 0 161 exclamdown
+ct 556,623,115 0 162 cent
+Po 556,718,16 2 163 sterling
+Cs 556,603 0 164 currency
+Ye 556,688 2 165 yen
+bb 260,737,19 2 166 brokenbar
+sc 556,737,191 2 167 section
+ad 333,706 2 168 dieresis
+co 737,737,19,15,14 2 169 copyright
+Of 370,737 2 170 ordfeminine
+fo 333,446 0 171 guilsinglleft
+tno 584,390 0 172 logicalnot
+\- 584,289 0 173 minus
+rg 737,737,19,15,14 2 174 registered
+a- 333,684 2 175 macron
+de 400,703 2 176 degree
+t+- 584,506 0 177 plusminus
+S2 333,703 2 178 twosuperior
+S3 333,703 2 179 threesuperior
+aa 333,734 2 180 acute
+mc 556,523,207 1 181 mu
+ps 537,718,173 2 182 paragraph
+pc 278,315 0 183 periodcentered
+ac 333,0,225 1 184 cedilla
+S1 333,703 2 185 onesuperior
+Om 365,737 2 186 ordmasculine
+fc 333,446 0 187 guilsinglright
+14 834,703,19 2 188 onequarter
+12 834,703,19 2 189 onehalf
+34 834,703,19 2 190 threequarters
+r? 611,525,201 0 191 questiondown
+`A 667,929 2 192 Agrave
+'A 667,929 2 193 Aacute
+^A 667,929 2 194 Acircumflex
+~A 667,917 2 195 Atilde
+:A 667,901 2 196 Adieresis
+oA 667,931 2 197 Aring
+AE 1000,718 2 198 AE
+,C 722,737,225 3 199 Ccedilla
+`E 667,929 2 200 Egrave
+'E 667,929 2 201 Eacute
+^E 667,929 2 202 Ecircumflex
+:E 667,901 2 203 Edieresis
+`I 278,929,0,0,13 2 204 Igrave
+'I 278,929,0,14 2 205 Iacute
+^I 278,929,0,7,6 2 206 Icircumflex
+:I 278,901 2 207 Idieresis
+-D 722,718 2 208 Eth
+~N 722,917 2 209 Ntilde
+`O 778,929,19 2 210 Ograve
+'O 778,929,19 2 211 Oacute
+^O 778,929,19 2 212 Ocircumflex
+~O 778,917,19 2 213 Otilde
+:O 778,901,19 2 214 Odieresis
+tmu 584,506 0 215 multiply
+/O 778,737,19 2 216 Oslash
+`U 722,929,19 2 217 Ugrave
+'U 722,929,19 2 218 Uacute
+^U 722,929,19 2 219 Ucircumflex
+:U 722,901,19 2 220 Udieresis
+'Y 667,929 2 221 Yacute
+TP 667,718 2 222 Thorn
+ss 611,728,15 2 223 germandbls
+`a 556,734,15 2 224 agrave
+'a 556,734,15 2 225 aacute
+^a 556,734,15 2 226 acircumflex
+~a 556,722,15 2 227 atilde
+:a 556,706,15 2 228 adieresis
+oa 556,756,15 2 229 aring
+ae 889,538,15 0 230 ae
+,c 500,538,225 1 231 ccedilla
+`e 556,734,15 2 232 egrave
+'e 556,734,15 2 233 eacute
+^e 556,734,15 2 234 ecircumflex
+:e 556,706,15 2 235 edieresis
+`i 278,734,0,0,13 2 236 igrave
+'i 278,734,0,14 2 237 iacute
+^i 278,734,0,7,6 2 238 icircumflex
+:i 278,706 2 239 idieresis
+Sd 556,737,15 2 240 eth
+~n 556,722 2 241 ntilde
+`o 556,734,14 2 242 ograve
+'o 556,734,14 2 243 oacute
+^o 556,734,14 2 244 ocircumflex
+~o 556,722,14 2 245 otilde
+:o 556,706,14 2 246 odieresis
+tdi 584,524,19 0 247 divide
+/o 611,545,22 0 248 oslash
+`u 556,734,15 2 249 ugrave
+'u 556,734,15 2 250 uacute
+^u 556,734,15 2 251 ucircumflex
+:u 556,706,15 2 252 udieresis
+'y 500,734,214 3 253 yacute
+Tp 556,718,207 3 254 thorn
+:y 500,706,214 3 255 ydieresis
+u2026 1000,106 0 256 ellipsis
diff --git a/font/devps/old/NB b/font/devps/old/NB
new file mode 100644
index 0000000..bc81dd0
--- /dev/null
+++ b/font/devps/old/NB
@@ -0,0 +1,392 @@
+name NB
+internalname NewCenturySchlbk-Bold
+spacewidth 287
+encoding text.enc
+ligatures fi fl 0
+kernpairs
+A y -18
+A w -18
+A v -18
+A ' -74
+A cq -74
+A rq -74
+A Y -91
+A W -74
+A V -74
+A U -18
+A T -55
+C . -18
+C , -18
+D . -25
+D , -25
+F r -18
+F . -125
+F o -55
+F i -18
+F e -55
+F , -125
+F a -74
+J u -18
+J . -55
+J o -18
+J e -18
+J , -55
+J a -18
+J A -18
+K y -25
+K u -18
+L y -25
+L ' -100
+L cq -100
+L rq -100
+L Y -74
+L W -74
+L V -100
+L T -100
+N . -18
+N , -18
+O . -25
+O , -25
+O T 10
+P . -150
+P o -55
+P e -55
+P , -150
+P a -55
+P A -74
+S . -18
+S , -18
+T u -18
+T r -18
+T . -100
+T o -74
+T i -18
+T - -125
+T hy -125
+T e -74
+T , -100
+T a -74
+T O 10
+T A -55
+U . -25
+U , -25
+U A -18
+V u -55
+V ; -37
+V . -125
+V o -74
+V i -18
+V - -100
+V hy -100
+V e -74
+V , -125
+V : -37
+V a -74
+V A -74
+W y -25
+W u -37
+W ; -55
+W . -100
+W o -74
+W i -18
+W - -100
+W hy -100
+W e -74
+W , -100
+W : -55
+W a -74
+W A -74
+Y u -55
+Y ; -25
+Y . -100
+Y o -100
+Y i -18
+Y - -125
+Y hy -125
+Y e -100
+Y , -100
+Y : -25
+Y a -100
+Y A -91
+: u0020 -18
+, u0020 -18
+, ' -18
+, cq -18
+, rq -18
+f ' 75
+f cq 75
+f rq 75
+. u0020 -18
+. ' -18
+. cq -18
+. rq -18
+lq A -74
+rq u0020 -18
+` A -74
+oq A -74
+' s -25
+cq s -25
+' d -25
+cq d -25
+r . -74
+r , -74
+; u0020 -18
+u0020 ` -18
+u0020 oq -18
+u0020 lq -18
+u0020 Y -18
+u0020 W -18
+u0020 V -18
+u0020 T -18
+u0020 A -18
+v . -100
+v , -100
+w . -100
+w , -100
+y . -100
+y , -100
+charset
+ha 606,690 2 0 asciicircum
+ti 606,346 0 1 asciitilde
+vS 667,952,15 2 2 Scaron
+vZ 667,952 2 3 Zcaron
+vs 500,725,15 2 4 scaron
+vz 537,725 2 5 zcaron
+:Y 722,921,0,12,12 2 6 Ydieresis
+tm 1000,722 2 7 trademark
+aq 241,737 2 8 quotesingle
+space 287 0 32 space
+! 296,737,15 2 33 exclam
+" 333,737 2 34 quotedbl
+dq "
+# 574,690 2 35 numbersign
+sh "
+$ 574,810,141 2 36 dollar
+Do "
+% 833,705,15 2 37 percent
+& 852,737,15 2 38 ampersand
+' 241,737 2 39 quoteright
+cq "
+( 389,745,117 2 40 parenleft
+) 389,745,117 2 41 parenright
+* 500,737 2 42 asterisk
++ 606,506 0 43 plus
+, 278,175,184 0 44 comma
+- 333,302 0 45 hyphen
+hy "
+. 278,175,15 0 46 period
+/ 278,737,15,42,42 2 47 slash
+sl "
+0 574,705,15 2 48 zero
+1 574,705 2 49 one
+2 574,705 2 50 two
+3 574,705,15 2 51 three
+4 574,705 2 52 four
+5 574,705,15 2 53 five
+6 574,705,15 2 54 six
+7 574,705,15 2 55 seven
+8 574,705,15 2 56 eight
+9 574,705,15 2 57 nine
+: 278,485,15 0 58 colon
+; 278,485,184 0 59 semicolon
+< 606,515,9 0 60 less
+= 606,403 0 61 equal
+> 606,515,9 0 62 greater
+? 500,737,15 2 63 question
+@ 747,737,15,3,2 2 64 at
+at "
+A 759,737,0,19,19 2 65 A
+B 778,722 2 66 B
+C 778,737,15 2 67 C
+D 833,722 2 68 D
+E 759,722 2 69 E
+F 722,722 2 70 F
+G 833,737,15 2 71 G
+H 870,722 2 72 H
+I 444,722 2 73 I
+J 648,722,15 2 74 J
+K 815,722,0,7 2 75 K
+L 722,722 2 76 L
+M 981,722 2 77 M
+N 833,722,10 2 78 N
+O 833,737,15 2 79 O
+P 759,722 2 80 P
+Q 833,737,189 2 81 Q
+R 815,722,15 2 82 R
+S 667,737,15 2 83 S
+T 722,722 2 84 T
+U 833,722,15 2 85 U
+V 759,722,10,19,19 2 86 V
+W 981,722,10 2 87 W
+X 722,722,0,12,12 2 88 X
+Y 722,722,0,12,12 2 89 Y
+Z 667,722 2 90 Z
+[ 389,737,109 2 91 bracketleft
+lB "
+\ 606,737,15 2 92 backslash
+rs "
+] 389,737,109 2 93 bracketright
+rB "
+a^ 333,725,0,11,10 2 94 circumflex
+^ "
+_ 500,0,125 0 95 underscore
+` 241,737 2 96 quoteleft
+oq "
+a 611,485,15 0 97 a
+b 648,737,15 2 98 b
+c 556,485,15 0 99 c
+d 667,737,15 2 100 d
+e 574,485,15 0 101 e
+f 389,737,0,72 2 102 f
+g 611,535,205,12 1 103 g
+h 685,737 2 104 h
+i 370,737 2 105 i
+j 352,737,205,0,86 3 106 j
+k 667,737 2 107 k
+l 352,737 2 108 l
+m 963,485 0 109 m
+n 685,485 0 110 n
+o 611,485,15 0 111 o
+p 667,485,205 1 112 p
+q 648,485,205 1 113 q
+r 519,485 0 114 r
+s 500,485,15 0 115 s
+t 426,675,15 2 116 t
+u 685,475,15 0 117 u
+v 611,475,10 0 118 v
+w 889,475,10 0 119 w
+x 611,475 0 120 x
+y 611,475,205 1 121 y
+z 537,475 0 122 z
+lC 389,737,109 2 123 braceleft
+{ "
+ba 606,750,250 3 124 bar
+| "
+rC 389,737,109 2 125 braceright
+} "
+a~ 333,705,0,24,24 2 126 tilde
+~ "
+bq 241,175,184 0 128 quotesinglbase
+Fo 500,397 0 129 guillemotleft
+Fc 500,397 0 130 guillemotright
+bu 606,542 0 131 bullet
+Fn 574,737,205 3 132 florin
+f/ 167,705,15,165,165 2 133 fraction
+%0 1000,705,15 2 134 perthousand
+dg 500,737,101 2 135 dagger
+dd 500,737,89 2 136 daggerdbl
+en 500,292 0 137 endash
+em 1000,292 0 138 emdash
+fi 685,737 2 140 fi
+fl 685,737 2 141 fl
+.i 370,475 0 144 dotlessi
+ga 333,737 2 146 grave
+a" 333,737,0,98,16 2 147 hungarumlaut
+a. 333,694 2 148 dotaccent
+ab 333,714 2 149 breve
+ah 333,725,0,11,10 2 150 caron
+ao 333,761 2 151 ring
+ho 333,3,163,13 0 152 ogonek
+lq 481,737 2 153 quotedblleft
+rq 481,737 2 154 quotedblright
+oe 907,485,15 0 155 oe
+/l 352,737 2 156 lslash
+Bq 481,175,184 0 157 quotedblbase
+OE 1000,722 2 158 OE
+/L 722,722 2 159 Lslash
+r! 296,547,205 1 161 exclamdown
+ct 574,572,102 0 162 cent
+Po 574,705,15 2 163 sterling
+Cs 574,605 0 164 currency
+Ye 574,690,0,10,10 2 165 yen
+bb 606,675,175 2 166 brokenbar
+sc 500,737,86 2 167 section
+ad 333,694,0,12,12 2 168 dieresis
+co 747,737,15,3,2 2 169 copyright
+Of 367,705,0,26 2 170 ordfeminine
+fo 333,397 0 171 guilsinglleft
+tno 606,403 0 172 logicalnot
+\- 606,307 0 173 minus
+rg 747,737,15,3,2 2 174 registered
+a- 333,664,0,6,6 0 175 macron
+de 400,705 2 176 degree
+t+- 606,506 0 177 plusminus
+S2 344,705,0,6,3 2 178 twosuperior
+S3 344,705,0,11,3 2 179 threesuperior
+aa 333,737 2 180 acute
+mc 685,475,205 1 181 mu
+ps 747,722,71 2 182 paragraph
+pc 278,372 0 183 periodcentered
+ac 333,0,224 1 184 cedilla
+S1 344,705 2 185 onesuperior
+Om 367,705 2 186 ordmasculine
+fc 333,397 0 187 guilsinglright
+14 861,705,15 2 188 onequarter
+12 861,705,15 2 189 onehalf
+34 861,705,15 2 190 threequarters
+r? 500,547,205 1 191 questiondown
+`A 759,964,0,19,19 2 192 Agrave
+'A 759,964,0,19,19 2 193 Aacute
+^A 759,952,0,19,19 2 194 Acircumflex
+~A 759,932,0,19,19 2 195 Atilde
+:A 759,921,0,19,19 2 196 Adieresis
+oA 759,988,0,19,19 2 197 Aring
+AE 981,722,0,0,29 2 198 AE
+,C 778,737,224 3 199 Ccedilla
+`E 759,964 2 200 Egrave
+'E 759,964 2 201 Eacute
+^E 759,952 2 202 Ecircumflex
+:E 759,921 2 203 Edieresis
+`I 444,964 2 204 Igrave
+'I 444,964 2 205 Iacute
+^I 444,952 2 206 Icircumflex
+:I 444,921 2 207 Idieresis
+-D 833,722 2 208 Eth
+~N 833,932,10 2 209 Ntilde
+`O 833,964,15 2 210 Ograve
+'O 833,964,15 2 211 Oacute
+^O 833,952,15 2 212 Ocircumflex
+~O 833,932,15 2 213 Otilde
+:O 833,921,15 2 214 Odieresis
+tmu 606,491 0 215 multiply
+/O 833,775,53 2 216 Oslash
+`U 833,964,15 2 217 Ugrave
+'U 833,964,15 2 218 Uacute
+^U 833,952,15 2 219 Ucircumflex
+:U 833,921,15 2 220 Udieresis
+'Y 722,964,0,12,12 2 221 Yacute
+TP 759,722 2 222 Thorn
+ss 611,737,15,0,2 2 223 germandbls
+`a 611,737,15 2 224 agrave
+'a 611,737,15 2 225 aacute
+^a 611,725,15 2 226 acircumflex
+~a 611,705,15 2 227 atilde
+:a 611,694,15 2 228 adieresis
+oa 611,761,15 2 229 aring
+ae 870,485,15 0 230 ae
+,c 556,485,224 1 231 ccedilla
+`e 574,737,15 2 232 egrave
+'e 574,737,15 2 233 eacute
+^e 574,725,15 2 234 ecircumflex
+:e 574,694,15 2 235 edieresis
+`i 370,737 2 236 igrave
+'i 370,737 2 237 iacute
+^i 370,725 2 238 icircumflex
+:i 370,694 2 239 idieresis
+Sd 611,737,15 2 240 eth
+~n 685,705 2 241 ntilde
+`o 611,737,15 2 242 ograve
+'o 611,737,15 2 243 oacute
+^o 611,725,15 2 244 ocircumflex
+~o 611,705,15 2 245 otilde
+:o 611,694,15 2 246 odieresis
+tdi 606,546,40 0 247 divide
+/o 611,573,103 0 248 oslash
+`u 685,737,15 2 249 ugrave
+'u 685,737,15 2 250 uacute
+^u 685,725,15 2 251 ucircumflex
+:u 685,694,15 2 252 udieresis
+'y 611,737,205 3 253 yacute
+Tp 667,737,205 3 254 thorn
+:y 611,694,205 3 255 ydieresis
+u2026 1000,175,15 0 256 ellipsis
diff --git a/font/devps/old/NBI b/font/devps/old/NBI
new file mode 100644
index 0000000..aa4b09e
--- /dev/null
+++ b/font/devps/old/NBI
@@ -0,0 +1,510 @@
+name NBI
+internalname NewCenturySchlbk-BoldItalic
+slant 16
+spacewidth 287
+encoding text.enc
+ligatures fi fl 0
+kernpairs
+A y -33
+A w -25
+A v -10
+A u -15
+A ' -95
+A cq -95
+A rq -95
+A Y -70
+A W -84
+A V -100
+A U -32
+A T 5
+A Q 5
+A O 5
+A G 5
+A C 5
+B . 15
+B , 15
+B U 15
+B A -11
+C A -5
+D . -11
+D , -11
+D Y 6
+D W -11
+D V -18
+F r -27
+F . -91
+F o -47
+F i -41
+F e -41
+F , -91
+F a -47
+F A -79
+J u -39
+J . -74
+J o -40
+J e -33
+J , -74
+J a -40
+J A -30
+K y -48
+K u -4
+K o -4
+K e 18
+L y -30
+L ' -100
+L cq -100
+L rq -100
+L Y -55
+L W -69
+L V -97
+L T -75
+N . -49
+N , -49
+O . -18
+O , -18
+O X -18
+O W -15
+O V -24
+O A -5
+P . -100
+P o -40
+P e -33
+P , -100
+P a -40
+P A -80
+R W -14
+R V -24
+S . -18
+S , -18
+T y -30
+T w -30
+T u -22
+T r -9
+T . -55
+T o -40
+T i -22
+T - -75
+T hy -75
+T h -9
+T e -33
+T , -55
+T a -40
+T O 11
+T A -60
+U . -25
+U , -25
+U A -42
+V u -70
+V ; 6
+V . -94
+V o -71
+V i -35
+V - -94
+V hy -94
+V e -66
+V , -94
+V : -49
+V a -55
+V O -19
+V G -12
+V A -100
+W y -41
+W u -25
+W ; -22
+W . -86
+W o -33
+W i -27
+W - -61
+W hy -61
+W h 5
+W e -39
+W , -86
+W : -22
+W a -33
+W O -11
+W A -66
+Y u -58
+Y ; -55
+Y . -91
+Y o -77
+Y i -22
+Y - -91
+Y hy -91
+Y e -71
+Y , -91
+Y : -55
+Y a -77
+Y A -79
+a y -8
+a w -8
+a v 6
+b y -6
+b v 8
+b . 6
+b , 6
+c y -20
+c . -8
+c l -13
+c k -8
+c h -18
+c , -8
+: u0020 -18
+, u0020 -18
+, ' -18
+, cq -18
+, rq -18
+d y -15
+d w -15
+e y -15
+e x -5
+e w -15
+e p -11
+e g -4
+e b -8
+f ' 105
+f cq 105
+f rq 105
+f . -28
+f o 7
+f l 7
+f i 7
+f e 14
+f .i 7
+f , -28
+f a 8
+g y -11
+g r 11
+g . -5
+g , -5
+h y -20
+i v 7
+k y -15
+k o -22
+k e -16
+l y -7
+l w -7
+m y -20
+m u -11
+n y -20
+n v -7
+n u -11
+o y -11
+o w -8
+o v 6
+p y -4
+p . 8
+p , 8
+. u0020 -18
+. ' -18
+. cq -18
+. rq -18
+lq ` 20
+lq oq 20
+lq A -60
+rq u0020 -18
+` A -80
+oq A -80
+' v -16
+cq v -16
+' t -22
+cq t -22
+' s -46
+cq s -46
+' r -9
+cq r -9
+' l -22
+cq l -22
+' d -41
+cq d -41
+r y -20
+r v -7
+r u -11
+r t -11
+r ; 9
+r s -20
+r ' 9
+r cq 9
+r . -90
+r p -17
+r o -11
+r l -14
+r k 9
+r i -14
+r - -16
+r hy -16
+r g -11
+r e -7
+r d -7
+r , -90
+r : 9
+r a -11
+s . 11
+s , 11
+; u0020 -18
+u0020 lq -18
+u0020 Y -18
+u0020 W -33
+u0020 V -24
+u0020 T -18
+u0020 A -22
+v . -11
+v o -6
+v , -11
+v a -6
+w . -17
+w o -14
+w e -8
+w , -17
+w a -14
+x e 5
+y . -25
+y o 8
+y e 15
+y , -25
+y a 8
+z e 4
+charset
+ha 606,690,0,0,-16 2 0 asciicircum
+ti 606,346,0,0,-22 0 1 asciitilde
+vS 685,930,15,31,49,31 2 2 Scaron
+vZ 704,930,0,57,83,57 2 3 Zcaron
+vs 481,705,15,46,50,46 2 4 scaron
+vz 519,695,15,4,69,4 2 5 zcaron
+:Y 704,915,0,121,37,109 2 6 Ydieresis
+tm 950,722,0,117,8,109 2 7 trademark
+aq 287,737,0,13,-62,13 2 8 quotesingle
+space 287 0 32 space
+! 333,737,15,50,50,50 2 33 exclam
+" 400,737,0,78,-16,78 2 34 quotedbl
+dq "
+# 574,690,0,20,20,20 2 35 numbersign
+sh "
+$ 574,810,120,41,41,41 2 36 dollar
+Do "
+% 889,727,28,0,-4 2 37 percent
+& 889,737,15,0,18 2 38 ampersand
+' 259,737,0,66,2,66 2 39 quoteright
+cq "
+( 407,745,117,97,-22,97 2 40 parenleft
+) 407,745,117,0,120 2 41 parenright
+* 500,737,0,48,-8,48 2 42 asterisk
++ 606,506 0 43 plus
+, 287,157,192,0,107 0 44 comma
+- 333,299,0,0,48 0 45 hyphen
+hy "
+. 287,157,15,0,70 0 46 period
+/ 278,737,15,92,91,92 2 47 slash
+sl "
+0 574,705,15,29,29,29 2 48 zero
+1 574,705,0,0,25 2 49 one
+2 574,705,3,14,88,14 2 50 two
+3 574,705,15,12,57,12 2 51 three
+4 574,705,0,20,63,20 2 52 four
+5 574,705,15,50,50,50 2 53 five
+6 574,705,15,50,19,50 2 54 six
+7 574,705,15,69,-14,69 2 55 seven
+8 574,705,15,28,50,28 2 56 eight
+9 574,705,15,19,50,19 2 57 nine
+: 287,477,15,0,70 0 58 colon
+; 287,477,192,0,107 0 59 semicolon
+< 606,515,9 0 60 less
+= 606,403 0 61 equal
+> 606,514,8 0 62 greater
+? 481,737,15,20,-29,20 2 63 question
+@ 747,737,15,54,54,54 2 64 at
+at "
+A 741,737,0,25,125,25 2 65 A
+B 759,722,0,12,100,12 2 66 B
+C 759,737,15,50,13,50 2 67 C
+D 833,722,0,13,97,13 2 68 D
+E 741,722,0,39,91,39 2 69 E
+F 704,722,0,76,91,76 2 70 F
+G 815,737,15,40,13,40 2 71 G
+H 870,722,0,91,91,91 2 72 H
+I 444,722,0,91,91,91 2 73 I
+J 667,722,15,91,70,91 2 74 J
+K 778,722,0,104,91,104 2 75 K
+L 704,722,0,16,91,16 2 76 L
+M 944,722,0,94,94,94 2 77 M
+N 852,722,10,111,111,109 2 78 N
+O 833,737,15,13,13,13 2 79 O
+P 741,722,0,39,91,39 2 80 P
+Q 833,737,189,13,13,13 2 81 Q
+R 796,722,15,3,91,3 2 82 R
+S 685,737,15,31,49,31 2 83 S
+T 722,722,0,87,9,87 2 84 T
+U 833,722,15,117,-38,109 2 85 U
+V 741,722,10,111,18,109 2 86 V
+W 944,722,10,106,10,106 2 87 W
+X 741,722,0,110,132,109 2 88 X
+Y 704,722,0,121,37,109 2 89 Y
+Z 704,722,0,57,83,57 2 90 Z
+[ 407,737,109,107,49,107 2 91 bracketleft
+lB "
+\ 606,737,15,0,-111 2 92 backslash
+rs "
+] 407,737,109,5,151,5 2 93 bracketright
+rB "
+a^ 333,705,0,82,27,82 2 94 circumflex
+^ "
+_ 500,0,125,50,50,50 0 95 underscore
+` 259,737,0,65,3,65 2 96 quoteleft
+oq "
+a 667,477,15,19,44,19 0 97 a
+b 611,737,15,0,21 2 98 b
+c 537,477,15,0,50 0 99 c
+d 667,737,15,43,50,43 2 100 d
+e 519,477,15,10,50,10 0 101 e
+f 389,737,205,211,98,109 3 102 f
+g 611,528,205,43,113,43 1 103 g
+h 685,737,15,4,50,4 2 104 h
+i 389,737,15,6,18,6 2 105 i
+j 370,737,205,27,255,27 3 106 j
+k 648,737,15,0,61 2 107 k
+l 389,737,15,36,18,36 2 108 l
+m 944,477,15,15,50,15 0 109 m
+n 685,477,15,4,50,4 0 110 n
+o 574,477,15,6,50,6 0 111 o
+p 648,477,205,0,169 1 112 p
+q 630,477,205,7,50,7 1 113 q
+r 519,486,0,58,50,58 0 114 r
+s 481,477,15,4,50,4 0 115 s
+t 407,650,15,46,26,46 2 116 t
+u 685,477,15,0,20 0 117 u
+v 556,477,15,0,20 0 118 v
+w 833,477,15,0,20 0 119 w
+x 574,477,15,50,96,50 0 120 x
+y 519,477,205,24,116,24 1 121 y
+z 519,477,15,4,69,4 0 122 z
+lC 407,737,109,51,-2,51 2 123 braceleft
+{ "
+ba 606,750,250,0,-199 3 124 bar
+| "
+rC 407,737,109,0,75 2 125 braceright
+} "
+a~ 333,690,0,115,22,109 2 126 tilde
+~ "
+bq 259,157,192,0,107 0 128 quotesinglbase
+Fo 481,407,0,18,85,18 0 129 guillemotleft
+Fc 481,407,0,22,81,22 0 130 guillemotright
+bu 606,542,0,0,-72 0 131 bullet
+Fn 574,737,205,51,93,51 3 132 florin
+f/ 167,705,15,216,216,109 2 133 fraction
+%0 1167,727,28,30,30,30 2 134 perthousand
+dg 500,737,146,58,2,58 2 135 dagger
+dd 500,737,150,58,110,58 2 136 daggerdbl
+en 500,287,0,29,97,29 0 137 endash
+em 1000,287,0,29,97,29 0 138 emdash
+fi 685,737,205,6,120,6 3 140 fi
+fl 685,737,205,36,120,36 3 141 fl
+.i 389,477,15,6,18,6 0 144 dotlessi
+ga 333,722,0,11,-24,11 2 146 grave
+a" 333,722,0,197,35,109 2 147 hungarumlaut
+a. 333,690,0,6,-95,6 2 148 dotaccent
+ab 333,698,0,107,-17,107 2 149 breve
+ah 333,705,0,120,-10,109 2 150 caron
+ao 333,746,0,52,-61,52 2 151 ring
+ho 333,0,155,0,-18 0 152 ogonek
+lq 481,737,0,90,-4,90 2 153 quotedblleft
+rq 481,737,0,79,7,79 2 154 quotedblright
+oe 852,477,15,10,56,10 0 155 oe
+/l 389,737,15,51,45,51 2 156 lslash
+Bq 481,157,192,0,107 0 157 quotedblbase
+OE 963,722,0,76,21,76 2 158 OE
+/L 704,722,0,16,91,16 2 159 Lslash
+r! 333,547,205,6,94,6 1 161 exclamdown
+ct 574,578,144,0,20 0 162 cent
+Po 574,705,15,42,68,42 2 163 sterling
+Cs 574,605,0,23,23,23 0 164 currency
+Ye 574,690,0,105,33,105 2 165 yen
+bb 606,675,175,0,-199 2 166 brokenbar
+sc 500,737,146,65,80,65 2 167 section
+ad 333,690,0,110,17,109 2 168 dieresis
+co 747,737,15,53,52,53 2 169 copyright
+Of 412,705,0,98,3,98 2 170 ordfeminine
+fo 278,407,0,16,75,16 0 171 guilsinglleft
+tno 606,403 0 172 logicalnot
+\- 606,307 0 173 minus
+rg 747,737,15,53,52,53 2 174 registered
+a- 333,649,0,121,3,109 2 175 macron
+de 400,705,0,22,-36,22 2 176 degree
+t+- 606,506 0 177 plusminus
+S2 344,705,0,68,67,68 2 178 twosuperior
+S3 344,705,0,67,47,67 2 179 threesuperior
+aa 333,722,0,89,-73,89 2 180 acute
+mc 685,477,205,0,139 1 181 mu
+ps 650,722,131,81,25,81 2 182 paragraph
+pc 287,372,0,0,-7 0 183 periodcentered
+ac 333,3,220,0,71 1 184 cedilla
+S1 344,705,0,32,31,32 2 185 onesuperior
+Om 356,705,0,88,8,88 2 186 ordmasculine
+fc 278,407,0,15,76,15 0 187 guilsinglright
+14 861,705,15,0,33 2 188 onequarter
+12 861,705,15,0,33 2 189 onehalf
+34 861,705,15,0,15 2 190 threequarters
+r? 481,547,205,0,50 1 191 questiondown
+`A 741,947,0,25,125,25 2 192 Agrave
+'A 741,947,0,25,125,25 2 193 Aacute
+^A 741,930,0,25,125,25 2 194 Acircumflex
+~A 741,915,0,25,125,25 2 195 Atilde
+:A 741,915,0,25,125,25 2 196 Adieresis
+oA 741,991,0,25,125,25 2 197 Aring
+AE 889,722,0,76,136,76 2 198 AE
+,C 759,737,220,50,13,50 3 199 Ccedilla
+`E 741,947,0,39,91,39 2 200 Egrave
+'E 741,947,0,39,91,39 2 201 Eacute
+^E 741,930,0,39,91,39 2 202 Ecircumflex
+:E 741,915,0,39,91,39 2 203 Edieresis
+`I 444,947,0,91,91,91 2 204 Igrave
+'I 444,947,0,94,91,94 2 205 Iacute
+^I 444,930,0,91,91,91 2 206 Icircumflex
+:I 444,915,0,115,91,109 2 207 Idieresis
+-D 833,722,0,13,97,13 2 208 Eth
+~N 852,915,10,111,111,109 2 209 Ntilde
+`O 833,947,15,13,13,13 2 210 Ograve
+'O 833,947,15,13,13,13 2 211 Oacute
+^O 833,930,15,13,13,13 2 212 Ocircumflex
+~O 833,915,15,13,13,13 2 213 Otilde
+:O 833,915,15,13,13,13 2 214 Odieresis
+tmu 606,491,0,0,-15 0 215 multiply
+/O 833,790,68,15,15,15 2 216 Oslash
+`U 833,947,15,117,-38,109 2 217 Ugrave
+'U 833,947,15,117,-38,109 2 218 Uacute
+^U 833,930,15,117,-38,109 2 219 Ucircumflex
+:U 833,915,15,117,-38,109 2 220 Udieresis
+'Y 704,947,0,121,37,109 2 221 Yacute
+TP 741,722,0,0,91 2 222 Thorn
+ss 574,737,205,16,141,16 3 223 germandbls
+`a 667,722,15,19,44,19 2 224 agrave
+'a 667,722,15,19,44,19 2 225 aacute
+^a 667,705,15,19,44,19 2 226 acircumflex
+~a 667,690,15,19,44,19 2 227 atilde
+:a 667,690,15,19,44,19 2 228 adieresis
+oa 667,746,15,19,44,19 2 229 aring
+ae 815,477,15,10,68,10 0 230 ae
+,c 537,477,220,0,50 1 231 ccedilla
+`e 519,722,15,10,50,10 2 232 egrave
+'e 519,722,15,10,50,10 2 233 eacute
+^e 519,705,15,10,50,10 2 234 ecircumflex
+:e 519,690,15,17,50,17 2 235 edieresis
+`i 389,715,15,6,18,6 2 236 igrave
+'i 389,715,15,31,18,31 2 237 iacute
+^i 389,698,15,24,29,24 2 238 icircumflex
+:i 389,683,15,52,19,52 2 239 idieresis
+Sd 574,752,15,6,50,6 2 240 eth
+~n 685,690,15,4,50,4 2 241 ntilde
+`o 574,722,15,6,50,6 2 242 ograve
+'o 574,722,15,6,50,6 2 243 oacute
+^o 574,705,15,6,50,6 2 244 ocircumflex
+~o 574,690,15,6,50,6 2 245 otilde
+:o 574,690,15,6,50,6 2 246 odieresis
+tdi 606,546,40 0 247 divide
+/o 574,583,121,6,50,6 0 248 oslash
+`u 685,722,15,0,20 2 249 ugrave
+'u 685,722,15,0,20 2 250 uacute
+^u 685,705,15,0,20 2 251 ucircumflex
+:u 685,690,15,0,20 2 252 udieresis
+'y 519,722,205,24,116,24 3 253 yacute
+Tp 648,737,205,0,169 3 254 thorn
+:y 519,690,205,24,116,24 3 255 ydieresis
+u2026 1000,157,15,0,-31 0 256 ellipsis
diff --git a/font/devps/old/NI b/font/devps/old/NI
new file mode 100644
index 0000000..aab0a0b
--- /dev/null
+++ b/font/devps/old/NI
@@ -0,0 +1,453 @@
+name NI
+internalname NewCenturySchlbk-Italic
+slant 16
+spacewidth 278
+encoding text.enc
+ligatures fi fl 0
+kernpairs
+A y -55
+A w -18
+A v -18
+A u -18
+A ' -125
+A cq -125
+A rq -125
+A Y -55
+A W -74
+A V -74
+A U -37
+A T -30
+A Q -18
+A O -18
+A G -18
+A C -18
+B . -50
+B , -50
+C . -50
+C , -50
+D . -50
+D , -50
+D Y -18
+D W -18
+D V -18
+F r -55
+F . -125
+F o -55
+F i -10
+F e -55
+F , -125
+F a -55
+F A -35
+G . -50
+G , -50
+J u -18
+J . -100
+J o -37
+J e -37
+J , -100
+J a -37
+J A -18
+L y -50
+L ' -125
+L cq -125
+L rq -125
+L Y -100
+L W -100
+L V -100
+L T -100
+N . -60
+N , -60
+O . -50
+O , -50
+O Y -18
+O X -18
+O V -18
+O T 18
+P . -125
+P o -55
+P e -55
+P , -125
+P a -55
+P A -50
+Q . -20
+Q , -20
+R Y -18
+R W -18
+R V -18
+R U -18
+S . -50
+S , -50
+T y -50
+T w -50
+T u -50
+T ; -50
+T r -50
+T . -100
+T o -74
+T i -18
+T - -100
+T hy -100
+T h -25
+T e -74
+T , -100
+T : -50
+T a -74
+T O 18
+U . -100
+U , -100
+U A -18
+V u -75
+V ; -75
+V . -100
+V o -75
+V i -50
+V - -100
+V hy -100
+V e -75
+V , -100
+V : -75
+V a -75
+V A -37
+W y -55
+W u -55
+W ; -75
+W . -100
+W o -55
+W i -20
+W - -75
+W hy -75
+W h -20
+W e -55
+W , -100
+W : -75
+W a -55
+W A -55
+Y u -100
+Y ; -75
+Y . -100
+Y o -100
+Y i -25
+Y - -100
+Y hy -100
+Y e -100
+Y , -100
+Y : -75
+Y a -100
+Y A -55
+b . -50
+b , -50
+b b -10
+c . -50
+c k -18
+c h -18
+c , -50
+: u0020 -37
+, u0020 -37
+, ' -37
+, cq -37
+, rq -37
+e . -37
+e , -37
+f ' 75
+f cq 75
+f rq 75
+f . -75
+f o -10
+f , -75
+g . -50
+g , -50
+l y -10
+o . -50
+o , -50
+p . -50
+p , -50
+. u0020 -37
+. ' -37
+. cq -37
+. rq -37
+lq A -75
+rq u0020 -37
+` ` -37
+` oq -37
+oq ` -37
+oq oq -37
+` A -75
+oq A -75
+' s -25
+cq s -25
+' ' -37
+' cq -37
+cq ' -37
+cq cq -37
+' d -37
+cq d -37
+r ; -25
+r s -10
+r . -125
+r k -18
+r - -75
+r hy -75
+r , -125
+r : -25
+s . -50
+s , -50
+; u0020 -37
+u0020 ` -37
+u0020 oq -37
+u0020 lq -37
+u0020 Y -37
+u0020 W -37
+u0020 V -37
+u0020 T -37
+u0020 A -37
+v . -75
+v , -75
+w . -75
+w , -75
+y . -75
+y , -75
+charset
+ha 606,690,0,0,-39 2 0 asciicircum
+ti 606,322,0,0,-22 0 1 asciitilde
+vS 667,946,15,21,56,21 2 2 Scaron
+vZ 667,946,0,50,75,50 2 3 Zcaron
+vs 444,690,15,40,48,40 2 4 scaron
+vz 463,690,15,30,83,30 2 5 zcaron
+:Y 685,902,0,125,19,107 2 6 Ydieresis
+tm 950,722,0,68,18,68 2 7 trademark
+aq 278,737,0,9,-101,9 2 8 quotesingle
+space 278 0 32 space
+! 333,737,15,20,33,20 2 33 exclam
+" 400,737,0,13,-77,13 2 34 quotedbl
+dq "
+# 556,690,0,22,22,22 2 35 numbersign
+sh "
+$ 556,808,142,30,46,30 2 36 dollar
+Do "
+% 833,705,15,7,7,7 2 37 percent
+& 852,737,15,0,26 2 38 ampersand
+' 204,737,0,75,11,75 2 39 quoteright
+cq "
+( 333,745,117,128,-3,107 2 40 parenleft
+) 333,745,117,0,143 2 41 parenright
+* 500,737,0,50,-30,50 2 42 asterisk
++ 606,506 0 43 plus
+, 278,109,165,0,89 0 44 comma
+- 333,274,0,0,18 0 45 hyphen
+hy "
+. 278,109,15,0,33 0 46 period
+/ 606,737,15,0,-82 2 47 slash
+sl "
+0 556,705,15,20,20,20 2 48 zero
+1 556,705 2 49 one
+2 556,705,0,0,87 2 50 two
+3 556,705,15,0,52 2 51 three
+4 556,705,0,6,58,6 2 52 four
+5 556,705,15,34,46,34 2 53 five
+6 556,705,15,42,14,42 2 54 six
+7 556,705,15,55,-19,55 2 55 seven
+8 556,705,15,20,44,20 2 56 eight
+9 556,705,15,14,42,14 2 57 nine
+: 278,466,15,1,33,1 0 58 colon
+; 278,466,165,1,89,1 0 59 semicolon
+< 606,514,8,0,14 0 60 less
+= 606,389 0 61 equal
+> 606,514,8,14,-14,14 0 62 greater
+? 444,737,15,23,-52,23 2 63 question
+@ 747,737,15,53,52,53 2 64 at
+at "
+A 704,737,0,14,137,14 2 65 A
+B 722,722,0,0,83 2 66 B
+C 722,737,15,40,10,40 2 67 C
+D 778,722,0,10,83,10 2 68 D
+E 722,722,0,28,83,28 2 69 E
+F 667,722,0,83,83,83 2 70 F
+G 778,737,15,35,10,35 2 71 G
+H 833,722,0,83,83,83 2 72 H
+I 407,722,0,78,83,78 2 73 I
+J 611,722,15,90,64,90 2 74 J
+K 741,722,0,125,83,107 2 75 K
+L 667,722,0,10,83,10 2 76 L
+M 944,722,0,83,83,83 2 77 M
+N 815,722,15,101,101,101 2 78 N
+O 778,737,15,10,10,10 2 79 O
+P 667,722,0,50,83,50 2 80 P
+Q 778,737,190,10,10,10 2 81 Q
+R 741,722,15,1,95,1 2 82 R
+S 667,737,15,21,56,21 2 83 S
+T 685,722,0,90,10,90 2 84 T
+U 815,722,15,102,-43,102 2 85 U
+V 704,722,10,125,14,107 2 86 V
+W 926,722,10,102,-3,102 2 87 W
+X 704,722,0,125,125,107 2 88 X
+Y 685,722,0,125,19,107 2 89 Y
+Z 667,722,0,50,75,50 2 90 Z
+[ 333,737,109,105,105,105 2 91 bracketleft
+lB "
+\ 606,737,15,0,-82 2 92 backslash
+rs "
+] 333,737,109,83,127,83 2 93 bracketright
+rB "
+a^ 333,690,0,48,13,48 2 94 circumflex
+^ "
+_ 500,0,125,50,50,50 0 95 underscore
+` 204,737,0,75,11,75 2 96 quoteleft
+oq "
+a 574,466,15,0,48 0 97 a
+b 556,737,15,0,18 2 98 b
+c 444,466,15,0,48 0 99 c
+d 611,737,15,24,48,24 2 100 d
+e 444,466,15,0,56 0 101 e
+f 333,737,205,187,118,107 3 102 f
+g 537,497,205,36,129,36 1 103 g
+h 611,737,15,1,36,1 2 104 h
+i 333,715,15,0,21 2 105 i
+j 315,715,205,53,216,53 3 106 j
+k 556,737,15,0,50 2 107 k
+l 333,737,15,9,36,9 2 108 l
+m 889,466,15,1,36,1 0 109 m
+n 611,466,15,1,36,1 0 110 n
+o 500,466,15,0,48 0 111 o
+p 574,466,205,0,151 1 112 p
+q 556,466,205,0,48 1 113 q
+r 444,466,0,40,40,40 0 114 r
+s 444,466,15,0,48 0 115 s
+t 352,619,15,26,26,26 2 116 t
+u 611,466,15,0,6 0 117 u
+v 519,466,15,0,19 0 118 v
+w 778,466,15,0,19 0 119 w
+x 500,466,15,21,83,21 0 120 x
+y 500,466,205,0,133 1 121 y
+z 463,466,15,3,83,3 0 122 z
+lC 333,737,109,111,12,107 2 123 braceleft
+{ "
+ba 606,750,250,0,-217 3 124 bar
+| "
+rC 333,737,109,0,137 2 125 braceright
+} "
+a~ 333,649,0,100,-2,100 2 126 tilde
+~ "
+bq 204,109,165,0,128 0 128 quotesinglbase
+Fo 426,402,0,26,65,26 0 129 guillemotleft
+Fc 426,402,0,26,65,26 0 130 guillemotright
+bu 606,542,0,0,-72 0 131 bullet
+Fn 556,737,205,63,108,63 3 132 florin
+f/ 167,705,15,184,184,107 2 133 fraction
+%0 1000,705,15,44,44,44 2 134 perthousand
+dg 500,737,147,56,-1,56 2 135 dagger
+dd 500,737,147,56,104,56 2 136 daggerdbl
+en 500,268,0,37,77,37 0 137 endash
+em 1000,268,0,37,77,37 0 138 emdash
+fi 611,737,205,0,118 3 140 fi
+fl 611,737,205,26,118,26 3 141 fl
+.i 333,466,15,0,21 0 144 dotlessi
+ga 333,690,0,0,-21 2 146 grave
+a" 333,690,0,172,18,107 2 147 hungarumlaut
+a. 333,646,0,0,-96 2 148 dotaccent
+ab 333,677,0,87,-19,87 2 149 breve
+ah 333,690,0,95,-23,95 2 150 caron
+ao 333,712,0,31,-64,31 2 151 ring
+ho 333,0,215,0,-18 1 152 ogonek
+lq 389,737,0,67,11,67 2 153 quotedblleft
+rq 389,737,0,67,11,67 2 154 quotedblright
+oe 778,466,15,0,48 0 155 oe
+/l 333,737,15,57,75,57 2 156 lslash
+Bq 389,109,165,0,128 0 157 quotedblbase
+OE 981,722,0,44,10,44 2 158 OE
+/L 667,722,0,10,83,10 2 159 Lslash
+r! 333,547,205,0,72 1 161 exclamdown
+ct 556,580,144,0,-12 0 162 cent
+Po 556,705,15,38,63,38 2 163 sterling
+Cs 556,597,0,24,24,24 0 164 currency
+Ye 556,690,0,118,10,107 2 165 yen
+bb 606,675,175,0,-217 2 166 brokenbar
+sc 500,737,147,30,60,30 2 167 section
+ad 333,646,0,76,-9,76 2 168 dieresis
+co 747,737,15,53,52,53 2 169 copyright
+Of 422,705,0,48,-22,48 2 170 ordfeminine
+fo 333,402,0,0,10 0 171 guilsinglleft
+tno 606,389 0 172 logicalnot
+\- 606,289 0 173 minus
+rg 747,737,15,53,52,53 2 174 registered
+a- 333,610,0,80,-2,80 0 175 macron
+de 400,705,0,22,-36,22 2 176 degree
+t+- 606,506 0 177 plusminus
+S2 333,705,0,76,50,76 2 178 twosuperior
+S3 333,705,0,76,28,76 2 179 threesuperior
+aa 333,690,0,72,-82,72 2 180 acute
+mc 611,466,205,0,110 1 181 mu
+ps 650,722,132,65,2,65 2 182 paragraph
+pc 278,374,0,0,-21 0 183 periodcentered
+ac 333,0,215,0,47 1 184 cedilla
+S1 333,705,0,28,16,28 2 185 onesuperior
+Om 372,705,0,48,-16,48 2 186 ordmasculine
+fc 333,402,0,0,10 0 187 guilsinglright
+14 834,705,15,0,16 2 188 onequarter
+12 834,705,15,0,16 2 189 onehalf
+34 834,705,15,0,28 2 190 threequarters
+r? 444,547,205,0,53 1 191 questiondown
+`A 704,946,0,14,137,14 2 192 Agrave
+'A 704,946,0,14,137,14 2 193 Aacute
+^A 704,946,0,14,137,14 2 194 Acircumflex
+~A 704,905,0,14,137,14 2 195 Atilde
+:A 704,902,0,14,137,14 2 196 Adieresis
+oA 704,958,0,14,137,14 2 197 Aring
+AE 870,722,0,68,137,68 2 198 AE
+,C 722,737,215,40,10,40 3 199 Ccedilla
+`E 722,946,0,28,83,28 2 200 Egrave
+'E 722,946,0,28,83,28 2 201 Eacute
+^E 722,946,0,28,83,28 2 202 Ecircumflex
+:E 722,902,0,28,83,28 2 203 Edieresis
+`I 407,946,0,78,83,78 2 204 Igrave
+'I 407,946,0,95,83,95 2 205 Iacute
+^I 407,946,0,78,83,78 2 206 Icircumflex
+:I 407,902,0,99,83,99 2 207 Idieresis
+-D 778,722,0,10,83,10 2 208 Eth
+~N 815,905,15,101,101,101 2 209 Ntilde
+`O 778,946,15,10,10,10 2 210 Ograve
+'O 778,946,15,10,10,10 2 211 Oacute
+^O 778,946,15,10,10,10 2 212 Ocircumflex
+~O 778,905,15,10,10,10 2 213 Otilde
+:O 778,902,15,10,10,10 2 214 Odieresis
+tmu 606,482,0,0,-24 0 215 multiply
+/O 778,780,68,20,34,20 2 216 Oslash
+`U 815,946,15,102,-43,102 2 217 Ugrave
+'U 815,946,15,102,-43,102 2 218 Uacute
+^U 815,946,15,102,-43,102 2 219 Ucircumflex
+:U 815,902,15,102,-43,102 2 220 Udieresis
+'Y 685,946,0,125,19,107 2 221 Yacute
+TP 667,722,0,10,83,10 2 222 Thorn
+ss 556,737,205,19,126,19 3 223 germandbls
+`a 574,690,15,0,48 2 224 agrave
+'a 574,690,15,0,48 2 225 aacute
+^a 574,690,15,0,48 2 226 acircumflex
+~a 574,649,15,0,48 2 227 atilde
+:a 574,646,15,0,48 2 228 adieresis
+oa 574,712,15,0,48 2 229 aring
+ae 722,466,15,0,68 0 230 ae
+,c 444,466,215,0,48 1 231 ccedilla
+`e 444,690,15,0,56 2 232 egrave
+'e 444,690,15,17,56,17 2 233 eacute
+^e 444,690,15,0,56 2 234 ecircumflex
+:e 444,646,15,21,56,21 2 235 edieresis
+`i 333,690,15,0,21 2 236 igrave
+'i 333,690,15,72,21,72 2 237 iacute
+^i 333,690,15,48,21,48 2 238 icircumflex
+:i 333,646,15,76,21,76 2 239 idieresis
+Sd 500,737,15,0,48 2 240 eth
+~n 611,649,15,1,36,1 2 241 ntilde
+`o 500,690,15,0,48 2 242 ograve
+'o 500,690,15,0,48 2 243 oacute
+^o 500,690,15,0,48 2 244 ocircumflex
+~o 500,649,15,17,48,17 2 245 otilde
+:o 500,646,15,0,48 2 246 odieresis
+tdi 606,528,22 0 247 divide
+/o 500,549,121,0,48 0 248 oslash
+`u 611,690,15,0,6 2 249 ugrave
+'u 611,690,15,0,6 2 250 uacute
+^u 611,690,15,0,6 2 251 ucircumflex
+:u 611,646,15,0,6 2 252 udieresis
+'y 500,690,205,0,133 3 253 yacute
+Tp 574,737,205,0,151 3 254 thorn
+:y 500,646,205,0,133 3 255 ydieresis
+u2026 1000,109,15,0,-9 0 256 ellipsis
diff --git a/font/devps/old/NR b/font/devps/old/NR
new file mode 100644
index 0000000..0f4a683
--- /dev/null
+++ b/font/devps/old/NR
@@ -0,0 +1,440 @@
+name NR
+internalname NewCenturySchlbk-Roman
+spacewidth 278
+encoding text.enc
+ligatures fi fl 0
+kernpairs
+A y -37
+A w -25
+A v -37
+A ' -74
+A cq -74
+A rq -74
+A Y -75
+A W -50
+A V -75
+A U -30
+A T -18
+B . -37
+B , -37
+B A -18
+C . -37
+C , -37
+C A -18
+D . -37
+D , -37
+D Y -18
+D V -18
+F r -10
+F . -125
+F o -55
+F i -10
+F e -55
+F , -125
+F a -65
+F A -50
+G . -37
+G , -37
+J u -25
+J . -74
+J o -25
+J e -25
+J , -74
+J a -25
+J A -18
+K y -25
+K o 10
+K e 10
+L y -25
+L ' -100
+L cq -100
+L rq -100
+L Y -74
+L W -74
+L V -91
+L T -75
+N . -55
+N , -55
+O . -37
+O , -37
+O Y -18
+O V -18
+O T 10
+P . -125
+P o -37
+P e -37
+P , -125
+P a -37
+P A -55
+Q . -25
+Q , -25
+S . -37
+S , -37
+T ; -37
+T . -125
+T o -55
+T - -100
+T hy -100
+T e -55
+T , -125
+T : -37
+T a -55
+T O 10
+T A -18
+U . -100
+U , -100
+U A -30
+V u -75
+V ; -75
+V . -125
+V o -75
+V i -18
+V - -100
+V hy -100
+V e -75
+V , -125
+V : -75
+V a -85
+V O -18
+V A -74
+W y -55
+W u -55
+W ; -100
+W . -125
+W o -60
+W i -18
+W - -100
+W hy -100
+W e -60
+W , -125
+W : -100
+W a -75
+W A -50
+Y u -91
+Y ; -75
+Y . -100
+Y o -100
+Y i -18
+Y - -125
+Y hy -125
+Y e -100
+Y , -100
+Y : -75
+Y a -100
+Y O -18
+Y A -75
+a y -10
+a w -10
+a v -10
+b . -18
+b , -18
+c . -18
+c l -7
+c k -7
+c h -7
+c , -18
+: u0020 -37
+, u0020 -37
+, ' -37
+, cq -37
+, rq -37
+e . -18
+e , -18
+f ' 100
+f cq 100
+f rq 100
+f . -37
+f , -37
+g . -25
+g , -25
+o . -18
+o , -18
+p . -18
+p , -18
+. u0020 -37
+. ' -37
+. cq -37
+. rq -37
+lq A -74
+rq u0020 -37
+` ` -25
+` oq -25
+oq ` -25
+oq oq -25
+` A -74
+oq A -74
+' s -25
+cq s -25
+' ' -25
+' cq -25
+cq ' -25
+cq cq -25
+' d -37
+cq d -37
+r . -100
+r - -37
+r hy -37
+r , -100
+s . -25
+s , -25
+; u0020 -37
+u0020 ` -37
+u0020 oq -37
+u0020 lq -37
+u0020 Y -37
+u0020 W -37
+u0020 V -37
+u0020 T -37
+u0020 A -37
+v . -125
+v , -125
+w . -125
+w , -125
+w a -18
+y . -125
+y , -125
+charset
+ha 606,690 2 0 asciicircum
+ti 606,322 0 1 asciitilde
+vS 630,933,15 2 2 Scaron
+vZ 611,933 2 3 Zcaron
+vs 463,695,15 2 4 scaron
+vz 481,695 2 5 zcaron
+:Y 704,883,0,11,11 2 6 Ydieresis
+tm 1000,722 2 7 trademark
+aq 204,737 2 8 quotesingle
+space 278 0 32 space
+! 296,737,15 2 33 exclam
+" 389,737 2 34 quotedbl
+dq "
+# 556,690 2 35 numbersign
+sh "
+$ 556,813,138 2 36 dollar
+Do "
+% 833,705,15 2 37 percent
+& 815,737,15 2 38 ampersand
+' 204,737 2 39 quoteright
+cq "
+( 333,745,117 2 40 parenleft
+) 333,745,117 2 41 parenright
+* 500,737 2 42 asterisk
++ 606,506 0 43 plus
+, 278,109,185 0 44 comma
+- 333,277 0 45 hyphen
+hy "
+. 278,109,15 0 46 period
+/ 278,737,15,32,32 2 47 slash
+sl "
+0 556,705,15 2 48 zero
+1 556,705 2 49 one
+2 556,705 2 50 two
+3 556,705,15 2 51 three
+4 556,705 2 52 four
+5 556,705,15 2 53 five
+6 556,705,15 2 54 six
+7 556,705,15 2 55 seven
+8 556,705,15 2 56 eight
+9 556,705,15 2 57 nine
+: 278,474,15 0 58 colon
+; 278,474,185 0 59 semicolon
+< 606,514,8 0 60 less
+= 606,389 0 61 equal
+> 606,514,8 0 62 greater
+? 444,737,15 2 63 question
+@ 737,737,15,7,8 2 64 at
+at "
+A 722,737,0,8,8 2 65 A
+B 722,722 2 66 B
+C 722,737,15 2 67 C
+D 778,722 2 68 D
+E 722,722 2 69 E
+F 667,722 2 70 F
+G 778,737,15 2 71 G
+H 833,722 2 72 H
+I 407,722 2 73 I
+J 556,722,15 2 74 J
+K 778,722,0,25 2 75 K
+L 667,722 2 76 L
+M 944,722 2 77 M
+N 815,722,15 2 78 N
+O 778,737,15 2 79 O
+P 667,722 2 80 P
+Q 778,737,190 2 81 Q
+R 722,722,15 2 82 R
+S 630,737,15 2 83 S
+T 667,722 2 84 T
+U 815,722,15 2 85 U
+V 722,722,10,8,8 2 86 V
+W 981,722,10 2 87 W
+X 704,722,0,8,8 2 88 X
+Y 704,722,0,11,11 2 89 Y
+Z 611,722 2 90 Z
+[ 333,737,109 2 91 bracketleft
+lB "
+\ 606,737,15 2 92 backslash
+rs "
+] 333,737,109 2 93 bracketright
+rB "
+a^ 333,695 2 94 circumflex
+^ "
+_ 500,0,125 0 95 underscore
+` 204,737 2 96 quoteleft
+oq "
+a 556,479,15 0 97 a
+b 556,737,15 2 98 b
+c 444,479,15 0 99 c
+d 574,737,15 2 100 d
+e 500,479,15 0 101 e
+f 333,737,0,104 2 102 f
+g 537,494,205,5 1 103 g
+h 611,737 2 104 h
+i 315,722 2 105 i
+j 296,722,205,0,86 3 106 j
+k 593,737 2 107 k
+l 315,737 2 108 l
+m 889,479 0 109 m
+n 611,479 0 110 n
+o 500,479,15 0 111 o
+p 574,479,205 1 112 p
+q 556,479,205 1 113 q
+r 444,479 0 114 r
+s 463,479,15 0 115 s
+t 389,666,15 2 116 t
+u 611,464,15 0 117 u
+v 537,464,10,0,6 0 118 v
+w 778,464,10 0 119 w
+x 537,464 0 120 x
+y 537,464,205 1 121 y
+z 481,464 0 122 z
+lC 333,737,109 2 123 braceleft
+{ "
+ba 606,750,250 3 124 bar
+| "
+rC 333,737,109 2 125 braceright
+} "
+a~ 333,655 0 126 tilde
+~ "
+bq 204,109,185 0 128 quotesinglbase
+Fo 426,398 0 129 guillemotleft
+Fc 426,398 0 130 guillemotright
+bu 606,542 0 131 bullet
+Fn 556,737,205 3 132 florin
+f/ 167,705,15,195,195 2 133 fraction
+%0 1000,705,15 2 134 perthousand
+dg 500,737,147 2 135 dagger
+dd 500,737,149 2 136 daggerdbl
+en 556,268 0 137 endash
+em 1000,268 0 138 emdash
+fi 611,737 2 140 fi
+fl 611,737 2 141 fl
+.i 315,464 0 144 dotlessi
+ga 333,699 2 146 grave
+a" 333,699,0,83,9 2 147 hungarumlaut
+a. 333,645 0 148 dotaccent
+ab 333,685 2 149 breve
+ah 333,695 2 150 caron
+ao 333,722 2 151 ring
+ho 333,0,215 1 152 ogonek
+lq 389,737 2 153 quotedblleft
+rq 389,737 2 154 quotedblright
+oe 833,479,15 0 155 oe
+/l 315,737 2 156 lslash
+Bq 389,109,185 0 157 quotedblbase
+OE 1000,722 2 158 OE
+/L 667,722 2 159 Lslash
+r! 296,547,205 1 161 exclamdown
+ct 556,584,141 0 162 cent
+Po 556,705,15 2 163 sterling
+Cs 556,597 0 164 currency
+Ye 556,690,0,1,1 2 165 yen
+bb 606,675,175 2 166 brokenbar
+sc 500,737,147 2 167 section
+ad 333,645 0 168 dieresis
+co 737,737,15,7,8 2 169 copyright
+Of 334,705,0,4,4 2 170 ordfeminine
+fo 259,398 0 171 guilsinglleft
+tno 606,389 0 172 logicalnot
+\- 606,289 0 173 minus
+rg 737,737,15,7,8 2 174 registered
+a- 333,623 0 175 macron
+de 400,705 2 176 degree
+t+- 606,506 0 177 plusminus
+S2 333,705 2 178 twosuperior
+S3 333,705 2 179 threesuperior
+aa 333,699 2 180 acute
+mc 611,464,205 1 181 mu
+ps 606,722,132 2 182 paragraph
+pc 278,374 0 183 periodcentered
+ac 333,0,215 1 184 cedilla
+S1 333,705 2 185 onesuperior
+Om 300,705 2 186 ordmasculine
+fc 259,398 0 187 guilsinglright
+14 834,705,15 2 188 onequarter
+12 834,705,15 2 189 onehalf
+34 834,705,15 2 190 threequarters
+r? 444,547,205 1 191 questiondown
+`A 722,937,0,8,8 2 192 Agrave
+'A 722,937,0,8,8 2 193 Aacute
+^A 722,933,0,8,8 2 194 Acircumflex
+~A 722,893,0,8,8 2 195 Atilde
+:A 722,883,0,8,8 2 196 Adieresis
+oA 722,965,0,8,8 2 197 Aring
+AE 1000,722 2 198 AE
+,C 722,737,215 3 199 Ccedilla
+`E 722,937 2 200 Egrave
+'E 722,937 2 201 Eacute
+^E 722,933 2 202 Ecircumflex
+:E 722,883 2 203 Edieresis
+`I 407,937 2 204 Igrave
+'I 407,937 2 205 Iacute
+^I 407,933 2 206 Icircumflex
+:I 407,883 2 207 Idieresis
+-D 778,722 2 208 Eth
+~N 815,893,15 2 209 Ntilde
+`O 778,937,15 2 210 Ograve
+'O 778,937,15 2 211 Oacute
+^O 778,933,15 2 212 Ocircumflex
+~O 778,893,15 2 213 Otilde
+:O 778,883,15 2 214 Odieresis
+tmu 606,482 0 215 multiply
+/O 778,778,56 2 216 Oslash
+`U 815,937,15 2 217 Ugrave
+'U 815,937,15 2 218 Uacute
+^U 815,933,15 2 219 Ucircumflex
+:U 815,883,15 2 220 Udieresis
+'Y 704,937,0,11,11 2 221 Yacute
+TP 667,722 2 222 Thorn
+ss 574,737,15 2 223 germandbls
+`a 556,699,15 2 224 agrave
+'a 556,699,15 2 225 aacute
+^a 556,695,15 2 226 acircumflex
+~a 556,655,15 0 227 atilde
+:a 556,645,15 0 228 adieresis
+oa 556,732,15 2 229 aring
+ae 796,479,15 0 230 ae
+,c 444,479,215 1 231 ccedilla
+`e 500,699,15 2 232 egrave
+'e 500,699,15 2 233 eacute
+^e 500,695,15 2 234 ecircumflex
+:e 500,645,15 0 235 edieresis
+`i 315,699 2 236 igrave
+'i 315,699 2 237 iacute
+^i 315,695 2 238 icircumflex
+:i 315,645 0 239 idieresis
+Sd 500,752,15 2 240 eth
+~n 611,655 0 241 ntilde
+`o 500,699,15 2 242 ograve
+'o 500,699,15 2 243 oacute
+^o 500,695,15 2 244 ocircumflex
+~o 500,655,15 0 245 otilde
+:o 500,645,15 0 246 odieresis
+tdi 606,528,22 0 247 divide
+/o 500,561,97 0 248 oslash
+`u 611,699,15 2 249 ugrave
+'u 611,699,15 2 250 uacute
+^u 611,695,15 2 251 ucircumflex
+:u 611,645,15 0 252 udieresis
+'y 537,699,205 3 253 yacute
+Tp 574,737,205 3 254 thorn
+:y 537,645,205 1 255 ydieresis
+u2026 1000,109,15 0 256 ellipsis
diff --git a/font/devps/old/PB b/font/devps/old/PB
new file mode 100644
index 0000000..bed42bf
--- /dev/null
+++ b/font/devps/old/PB
@@ -0,0 +1,370 @@
+name PB
+internalname Palatino-Bold
+spacewidth 250
+encoding text.enc
+ligatures fi fl 0
+kernpairs
+A y -70
+A w -70
+A v -70
+A u0020 -18
+A ' -92
+A cq -92
+A Y -111
+A W -90
+A V -129
+A T -92
+F . -111
+F , -111
+F A -55
+L y -74
+L u0020 -18
+L ' -74
+L cq -74
+L Y -92
+L W -92
+L V -92
+L T -74
+P . -129
+P , -129
+P A -74
+R y -30
+R Y -55
+R W -37
+R V -74
+R T -55
+T y -90
+T w -90
+T u -129
+T ; -74
+T s -111
+T r -111
+T . -92
+T o -111
+T i -55
+T - -92
+T hy -92
+T e -111
+T , -92
+T : -74
+T c -129
+T a -111
+T A -92
+V y -90
+V u -92
+V ; -74
+V r -111
+V . -129
+V o -111
+V i -55
+V - -92
+V hy -92
+V e -111
+V , -129
+V : -74
+V a -111
+V A -129
+W y -74
+W u -74
+W ; -37
+W r -74
+W . -37
+W o -74
+W i -37
+W - -37
+W hy -37
+W e -74
+W , -92
+W : -37
+W a -74
+W A -90
+Y v -74
+Y u -74
+Y ; -55
+Y q -92
+Y . -74
+Y p -74
+Y o -74
+Y i -55
+Y - -74
+Y hy -74
+Y e -74
+Y , -74
+Y : -55
+Y a -74
+Y A -55
+f ' 37
+f cq 37
+f f -18
+1 1 -37
+` ` -55
+` oq -55
+oq ` -55
+oq oq -55
+' t -18
+cq t -18
+' u0020 -55
+cq u0020 -55
+' s -55
+cq s -55
+' ' -55
+' cq -55
+cq ' -55
+cq cq -55
+r ' 55
+r cq 55
+r . -55
+r - -18
+r hy -18
+r , -55
+v . -111
+v , -111
+w . -92
+w , -92
+y . -92
+y , -92
+charset
+ha 606,678 2 0 asciicircum
+ti 606,342 0 1 asciitilde
+vS 611,909,17 2 2 Scaron
+vZ 667,909,3 2 3 Zcaron
+vs 444,693,17 2 4 scaron
+vz 500,693,3 2 5 zcaron
+:Y 667,895,3 2 6 Ydieresis
+tm 998,678 2 7 trademark
+aq 227,695 2 8 quotesingle
+space 250 0 32 space
+! 278,688,12 2 33 exclam
+" 402,695 2 34 quotedbl
+dq "
+# 500,673 2 35 numbersign
+sh "
+$ 500,721,114 2 36 dollar
+Do "
+% 889,714,9 2 37 percent
+& 833,684,17 2 38 ampersand
+' 278,695 2 39 quoteright
+cq "
+( 333,723,104 2 40 parenleft
+) 333,723,104 2 41 parenright
+* 444,695 2 42 asterisk
++ 606,505 0 43 plus
+, 250,141,166,0,6 0 44 comma
+- 333,305 0 45 hyphen
+hy "
+. 250,144,12 0 46 period
+/ 296,720,17,9,9 2 47 slash
+sl "
+0 500,660,17 2 48 zero
+1 500,670,3 2 49 one
+2 500,660,3 2 50 two
+3 500,660,17 2 51 three
+4 500,672,3 2 52 four
+5 500,656,17 2 53 five
+6 500,660,17 2 54 six
+7 500,656,3 2 55 seven
+8 500,660,17 2 56 eight
+9 500,660,17 2 57 nine
+: 250,454,12 0 58 colon
+; 250,454,166,0,6 0 59 semicolon
+< 606,519,15 0 60 less
+= 606,396 0 61 equal
+> 606,519,15 0 62 greater
+? 444,687,12 2 63 question
+@ 747,681,12 2 64 at
+at "
+A 778,686,3 2 65 A
+B 667,681,3 2 66 B
+C 722,695,17 2 67 C
+D 833,681,3 2 68 D
+E 611,681,4 2 69 E
+F 556,681,3 2 70 F
+G 833,695,17 2 71 G
+H 833,681,3 2 72 H
+I 389,681,3 2 73 I
+J 389,681,213,0,11 2 74 J
+K 778,681,3 2 75 K
+L 611,681,4 2 76 L
+M 1000,681,10 2 77 M
+N 833,681,16 2 78 N
+O 833,695,17 2 79 O
+P 611,681,3 2 80 P
+Q 833,695,184 2 81 Q
+R 722,681,3 2 82 R
+S 611,695,17 2 83 S
+T 667,681,3 2 84 T
+U 778,681,17 2 85 U
+V 778,681,3 2 86 V
+W 1000,686,3 2 87 W
+X 667,695,3 2 88 X
+Y 667,695,3 2 89 Y
+Z 667,681,3 2 90 Z
+[ 333,720,104 2 91 bracketleft
+lB "
+\ 606,720 2 92 backslash
+rs "
+] 333,720,104 2 93 bracketright
+rB "
+a^ 333,681,0,2,2 2 94 circumflex
+^ "
+_ 500,0,125 0 95 underscore
+` 278,695 2 96 quoteleft
+oq "
+a 500,471,17 0 97 a
+b 611,720,17 2 98 b
+c 444,471,17 0 99 c
+d 611,720,17 2 100 d
+e 500,471,17 0 101 e
+f 389,720,3 2 102 f
+g 556,471,266 1 103 g
+h 611,720,3 2 104 h
+i 333,706,3 2 105 i
+j 333,706,266 3 106 j
+k 611,720,3 2 107 k
+l 333,720,3 2 108 l
+m 889,471,3 0 109 m
+n 611,471,3 0 110 n
+o 556,471,17 0 111 o
+p 611,471,258 1 112 p
+q 611,471,258 1 113 q
+r 389,471,3 0 114 r
+s 444,471,17 0 115 s
+t 333,632,17 2 116 t
+u 611,471,17 0 117 u
+v 556,459,3 0 118 v
+w 833,471,3 0 119 w
+x 500,471,3 0 120 x
+y 556,459,266 1 121 y
+z 500,459,3 0 122 z
+lC 310,725,117 2 123 braceleft
+{ "
+ba 606,720 2 124 bar
+| "
+rC 310,725,117 2 125 braceright
+} "
+a~ 333,661,0,16,16 2 126 tilde
+~ "
+bq 333,130,160 0 128 quotesinglbase
+Fo 500,438 0 129 guillemotleft
+Fc 500,438 0 130 guillemotright
+bu 606,516 0 131 bullet
+Fn 500,703,242 2 132 florin
+f/ 167,660,0,153,152 2 133 fraction
+%0 1000,724,9 2 134 perthousand
+dg 500,682,6 2 135 dagger
+dd 500,682,245 2 136 daggerdbl
+en 500,291 0 137 endash
+em 1000,291 0 138 emdash
+fi 611,720,3 2 140 fi
+fl 611,720,3 2 141 fl
+.i 333,471,3 0 144 dotlessi
+ga 333,691 2 146 grave
+a" 333,691,0,57,56 2 147 hungarumlaut
+a. 333,671 2 148 dotaccent
+ab 333,669 2 149 breve
+ah 333,685,0,2,2 2 150 caron
+ao 333,700 2 151 ring
+ho 333,0,246 0 152 ogonek
+lq 500,695 2 153 quotedblleft
+rq 500,695 2 154 quotedblright
+oe 833,471,17 0 155 oe
+/l 333,720,3,1,4 2 156 lslash
+Bq 500,130,160 0 157 quotedblbase
+OE 1000,695,17 2 158 OE
+/L 611,681,4 2 159 Lslash
+r! 278,471,227 0 161 exclamdown
+ct 500,554,106 0 162 cent
+Po 500,676,19,1,2 2 163 sterling
+Cs 500,533 0 164 currency
+Ye 500,695,3 2 165 yen
+bb 606,720 2 166 brokenbar
+sc 500,695,217 2 167 section
+ad 333,671,0,8,8 2 168 dieresis
+co 747,695,17 2 169 copyright
+Of 438,660 2 170 ordfeminine
+fo 389,438 0 171 guilsinglleft
+tno 606,396 0 172 logicalnot
+\- 606,298 0 173 minus
+rg 747,695,17 2 174 registered
+a- 333,609 0 175 macron
+de 400,660 2 176 degree
+t+- 606,505 0 177 plusminus
+S2 300,660 2 178 twosuperior
+S3 300,667 2 179 threesuperior
+aa 333,691 2 180 acute
+mc 611,471,225 0 181 mu
+ps 641,683,161 2 182 paragraph
+pc 250,335 0 183 periodcentered
+ac 333,0,225 0 184 cedilla
+S1 300,665 2 185 onesuperior
+Om 488,660 2 186 ordmasculine
+fc 389,438 0 187 guilsinglright
+14 750,665,2 2 188 onequarter
+12 750,665,2 2 189 onehalf
+34 750,667,2 2 190 threequarters
+r? 444,471,231 0 191 questiondown
+`A 778,915,3 2 192 Agrave
+'A 778,915,3 2 193 Aacute
+^A 778,905,3 2 194 Acircumflex
+~A 778,885,3 2 195 Atilde
+:A 778,895,3 2 196 Adieresis
+oA 778,924,3 2 197 Aring
+AE 1000,681,4 2 198 AE
+,C 722,695,225 2 199 Ccedilla
+`E 611,915,4 2 200 Egrave
+'E 611,915,4 2 201 Eacute
+^E 611,905,4 2 202 Ecircumflex
+:E 611,895,4 2 203 Edieresis
+`I 389,915,3 2 204 Igrave
+'I 389,915,3 2 205 Iacute
+^I 389,905,3 2 206 Icircumflex
+:I 389,895,3 2 207 Idieresis
+-D 833,681,3 2 208 Eth
+~N 833,885,16 2 209 Ntilde
+`O 833,915,17 2 210 Ograve
+'O 833,915,17 2 211 Oacute
+^O 833,905,17 2 212 Ocircumflex
+~O 833,885,17 2 213 Otilde
+:O 833,895,17 2 214 Odieresis
+tmu 606,483 0 215 multiply
+/O 833,698,20 2 216 Oslash
+`U 778,915,17 2 217 Ugrave
+'U 778,915,17 2 218 Uacute
+^U 778,905,17 2 219 Ucircumflex
+:U 778,895,17 2 220 Udieresis
+'Y 667,915,3 2 221 Yacute
+TP 611,681,3 2 222 Thorn
+ss 611,720,17 2 223 germandbls
+`a 500,711,17 2 224 agrave
+'a 500,711,17 2 225 aacute
+^a 500,701,17 2 226 acircumflex
+~a 500,673,17 2 227 atilde
+:a 500,691,17 2 228 adieresis
+oa 500,700,17 2 229 aring
+ae 778,471,17 0 230 ae
+,c 444,471,225 0 231 ccedilla
+`e 500,711,17 2 232 egrave
+'e 500,711,17 2 233 eacute
+^e 500,701,17 2 234 ecircumflex
+:e 500,691,17 2 235 edieresis
+`i 333,711,3 2 236 igrave
+'i 333,711,3 2 237 iacute
+^i 333,701,3,2,2 2 238 icircumflex
+:i 333,691,3,8,8 2 239 idieresis
+Sd 556,720,17 2 240 eth
+~n 611,673,3 2 241 ntilde
+`o 556,711,17 2 242 ograve
+'o 556,711,17 2 243 oacute
+^o 556,701,17 2 244 ocircumflex
+~o 556,673,17 2 245 otilde
+:o 556,691,17 2 246 odieresis
+tdi 606,510 0 247 divide
+/o 556,471,18 0 248 oslash
+`u 611,711,17 2 249 ugrave
+'u 611,711,17 2 250 uacute
+^u 611,701,17 2 251 ucircumflex
+:u 611,691,17 2 252 udieresis
+'y 556,711,266 3 253 yacute
+Tp 611,720,258 3 254 thorn
+:y 556,691,266 3 255 ydieresis
+u2026 1000,144,12 0 256 ellipsis
diff --git a/font/devps/old/PBI b/font/devps/old/PBI
new file mode 100644
index 0000000..602c4e4
--- /dev/null
+++ b/font/devps/old/PBI
@@ -0,0 +1,376 @@
+name PBI
+internalname Palatino-BoldItalic
+slant 10
+spacewidth 250
+encoding text.enc
+ligatures fi fl 0
+kernpairs
+A y -55
+A w -37
+A v -55
+A u0020 -55
+A ' -55
+A cq -55
+A Y -74
+A W -74
+A V -74
+A T -55
+F u0020 -18
+F . -111
+F , -111
+F A -74
+L y -37
+L u0020 -18
+L ' -55
+L cq -55
+L Y -74
+L W -74
+L V -74
+L T -74
+P u0020 -55
+P . -129
+P , -129
+P A -92
+R y -20
+R Y -37
+R W -55
+R V -55
+R T -37
+T y -80
+T w -50
+T u -92
+T ; -55
+T s -92
+T r -92
+T . -55
+T o -111
+T i -74
+T - -92
+T hy -92
+T e -111
+T , -55
+T : -55
+T c -92
+T a -111
+T O -18
+T A -55
+V y -50
+V u -50
+V ; -37
+V r -74
+V . -111
+V o -74
+V i -50
+V - -37
+V hy -37
+V e -74
+V , -111
+V : -37
+V a -92
+V A -74
+W y -30
+W u -30
+W ; -18
+W r -30
+W . -55
+W o -55
+W i -30
+W e -55
+W , -55
+W : -28
+W a -74
+W A -74
+Y v -30
+Y u -50
+Y ; -55
+Y q -92
+Y . -55
+Y p -74
+Y o -111
+Y i -54
+Y - -55
+Y hy -55
+Y e -92
+Y , -55
+Y : -55
+Y a -111
+Y A -55
+f ' 37
+f cq 37
+f f -37
+1 1 -55
+` ` -55
+` oq -55
+oq ` -55
+oq oq -55
+' t -18
+cq t -18
+' u0020 -37
+cq u0020 -37
+' s -37
+cq s -37
+' ' -55
+' cq -55
+cq ' -55
+cq cq -55
+r ' 55
+r cq 55
+r q -18
+r . -55
+r o -18
+r h -18
+r g -18
+r e -18
+r , -55
+r c -18
+v . -55
+v , -55
+w . -55
+w , -55
+y . -37
+y , -37
+charset
+ha 606,678,0,0,-13 2 0 asciicircum
+ti 606,346,0,0,-1 0 1 asciitilde
+vS 556,896,17,51,0,51 2 2 Scaron
+vZ 667,896,3,59,49,59 2 3 Zcaron
+vs 444,692,17,95,25,66 2 4 scaron
+vz 500,692,17,67,19,66 2 5 zcaron
+:Y 611,880,3,114,-4,66 2 6 Ydieresis
+tm 1000,678,0,11,12,11 2 7 trademark
+aq 250,720,0,93,-77,66 2 8 quotesingle
+space 250 0 32 space
+! 333,695,17,39,-8,39 2 33 exclam
+" 500,720,0,43,-87,43 2 34 quotedbl
+dq "
+# 500,673,0,46,46,46 2 35 numbersign
+sh "
+$ 500,737,108,27,30,27 2 36 dollar
+Do "
+% 889,697,17,0,-6 2 37 percent
+& 833,695,17,28,-24,28 2 38 ampersand
+' 278,720,0,74,-26,66 2 39 quoteright
+cq "
+( 333,723,129,85,-8,66 2 40 parenleft
+) 333,723,129,15,62,15 2 41 parenright
+* 444,695,0,45,-34,45 2 42 asterisk
++ 606,501,5 0 43 plus
+, 250,147,164,8,83,8 0 44 comma
+- 389,300,0,23,13,23 0 45 hyphen
+hy "
+. 250,135,17,0,2 0 46 period
+/ 315,720,17,50,49,50 2 47 slash
+sl "
+0 500,683,17,40,8,40 2 48 zero
+1 500,678,3,0,9 2 49 one
+2 500,683,3,4,49,4 2 50 two
+3 500,683,17,0,42 2 51 three
+4 500,683,3,37,47,37 2 52 four
+5 500,675,17,31,36,31 2 53 five
+6 500,683,17,38,11,38 2 54 six
+7 500,674,3,94,-19,66 2 55 seven
+8 500,683,17,34,24,34 2 56 eight
+9 500,683,17,41,23,41 2 57 nine
+: 250,452,17,36,12,36 0 58 colon
+; 250,452,164,47,83,47 0 59 semicolon
+< 606,517,21,2,1,2 0 60 less
+= 606,390,0,0,-1 0 61 equal
+> 606,517,21,1,2,1 0 62 greater
+? 444,695,17,56,-41,56 2 63 question
+@ 833,681,12,0,-32 2 64 at
+at "
+A 722,683,3,13,85,13 2 65 A
+B 667,681,3,12,42,12 2 66 B
+C 685,695,17,60,-19,60 2 67 C
+D 778,682,3,19,50,19 2 68 D
+E 611,681,3,45,39,45 2 69 E
+F 556,681,3,87,56,66 2 70 F
+G 778,695,17,22,-22,22 2 71 G
+H 778,681,3,98,62,66 2 72 H
+I 389,681,3,73,51,66 2 73 I
+J 389,681,207,78,79,66 2 74 J
+K 722,681,3,74,60,66 2 75 K
+L 611,681,3,17,24,17 2 76 L
+M 944,681,17,91,73,66 2 77 M
+N 778,681,3,101,52,66 2 78 N
+O 833,695,17,11,-26,11 2 79 O
+P 667,681,3,56,39,56 2 80 P
+Q 833,695,222,11,-26,11 2 81 Q
+R 722,681,3,25,46,25 2 82 R
+S 556,695,17,11,0,11 2 83 S
+T 611,681,3,113,-6,66 2 84 T
+U 778,681,17,97,-33,66 2 85 U
+V 667,681,3,128,-17,66 2 86 V
+W 1000,689,3,123,-17,66 2 87 W
+X 722,681,3,100,59,66 2 88 X
+Y 611,695,3,114,-4,66 2 89 Y
+Z 667,681,3,59,49,59 2 90 Z
+[ 333,723,102,98,5,66 2 91 bracketleft
+lB "
+\ 606,720,0,0,-22 2 92 backslash
+rs "
+] 333,723,102,32,71,32 2 93 bracketright
+rB "
+a^ 333,684,0,132,-38,66 2 94 circumflex
+^ "
+_ 500,0,125,50,50,50 0 95 underscore
+` 278,720,0,63,-15,63 2 96 quoteleft
+oq "
+a 556,470,17,13,6,13 0 97 a
+b 537,726,17,7,6,7 2 98 b
+c 444,469,17,42,18,42 0 99 c
+d 556,726,17,44,12,44 2 100 d
+e 444,469,17,24,22,24 0 101 e
+f 333,726,271,166,180,66 3 102 f
+g 500,469,271,79,100,66 1 103 g
+h 556,726,17,16,28,16 2 104 h
+i 333,695,17,29,24,29 2 105 i
+j 333,695,271,40,114,40 3 106 j
+k 556,726,17,22,16,22 2 107 k
+l 333,726,17,35,-14,35 2 108 l
+m 833,469,17,20,31,20 0 109 m
+n 556,469,17,15,33,15 0 110 n
+o 556,469,17,0,2 0 111 o
+p 556,469,271,10,71,10 1 112 p
+q 537,469,271,26,18,26 1 113 q
+r 389,469,17,72,30,66 0 114 r
+s 444,469,17,12,25,12 0 115 s
+t 389,636,17,70,8,66 2 116 t
+u 556,469,17,15,28,15 0 117 u
+v 556,469,17,7,31,7 0 118 v
+w 833,469,17,19,23,19 0 119 w
+x 500,469,17,50,58,50 0 120 x
+y 556,469,271,35,37,35 1 121 y
+z 500,469,17,20,19,20 0 122 z
+lC 333,720,105,51,32,51 2 123 braceleft
+{ "
+ba 606,720,0,0,-209 2 124 bar
+| "
+rC 333,720,105,32,51,32 2 125 braceright
+} "
+a~ 333,654,0,158,-32,66 2 126 tilde
+~ "
+bq 250,145,144,20,53,20 0 128 quotesinglbase
+Fo 500,446,0,8,15,8 0 129 guillemotleft
+Fc 500,443,0,8,15,8 0 130 guillemotright
+bu 606,516,0,0,-81 0 131 bullet
+Fn 500,690,242,29,42,29 2 132 florin
+f/ 167,683,0,221,220,66 2 133 fraction
+%0 1000,691,17,0,-15 2 134 perthousand
+dg 556,685,3,0,-17 2 135 dagger
+dd 556,693,153,31,17,31 2 136 daggerdbl
+en 500,282,0,62,62,62 0 137 endash
+em 1000,282,0,62,62,62 0 138 emdash
+fi 611,726,271,27,180,27 3 140 fi
+fl 611,726,271,70,180,66 3 141 fl
+.i 333,469,17,10,24,10 0 144 dotlessi
+ga 333,699,0,39,-60,39 2 146 grave
+a" 333,699,0,126,78,66 2 147 hungarumlaut
+a. 333,668,0,42,-152,42 2 148 dotaccent
+ab 333,680,0,129,-46,66 2 149 breve
+ah 333,684,0,162,-63,66 2 150 caron
+ao 556,714,0,0,-227 2 151 ring
+ho 333,0,206,0,18 0 152 ogonek
+lq 500,720,0,61,-15,61 2 153 quotedblleft
+rq 500,720,0,69,-23,66 2 154 quotedblright
+oe 778,469,17,27,2,27 0 155 oe
+/l 333,726,17,82,37,66 2 156 lslash
+Bq 500,145,144,0,68 0 157 quotedblbase
+OE 944,695,17,67,11,66 2 158 OE
+/L 611,681,3,17,44,17 2 159 Lslash
+r! 333,479,225,0,48 0 161 exclamdown
+ct 500,547,105,6,-2,6 0 162 cent
+Po 500,683,5,51,29,51 2 163 sterling
+Cs 500,533,0,18,18,18 0 164 currency
+Ye 500,695,3,88,39,66 2 165 yen
+bb 606,720,0,0,-209 2 166 brokenbar
+sc 556,695,151,0,3 2 167 section
+ad 333,668,0,143,-40,66 2 168 dieresis
+co 747,695,17,23,24,23 2 169 copyright
+Of 333,684,0,72,3,66 2 170 ordfeminine
+fo 333,446,0,9,-10,9 0 171 guilsinglleft
+tno 606,390,0,0,-1 0 172 logicalnot
+\- 606,292,0,0,-1 0 173 minus
+rg 747,695,17,23,24,23 2 174 registered
+a- 333,608,0,135,-26,66 0 175 macron
+de 400,683 2 176 degree
+t+- 606,501 0 177 plusminus
+S2 300,683,0,71,24,66 2 178 twosuperior
+S3 300,683,0,60,27,60 2 179 threesuperior
+aa 333,699,0,109,-103,66 2 180 acute
+mc 556,469,232,15,65,15 0 181 mu
+ps 556,681,204,123,36,66 2 182 paragraph
+pc 250,324,0,6,-17,6 0 183 periodcentered
+ac 333,5,218,0,38 0 184 cedilla
+S1 300,680,0,48,9,48 2 185 onesuperior
+Om 333,683,0,63,-1,63 2 186 ordmasculine
+fc 333,443,0,0,15 0 187 guilsinglright
+14 750,683,2,32,32,32 2 188 onequarter
+12 750,683,2,36,36,36 2 189 onehalf
+34 750,683,2,32,32,32 2 190 threequarters
+r? 444,479,226,0,62 0 191 questiondown
+`A 722,911,3,13,85,13 2 192 Agrave
+'A 722,911,3,13,85,13 2 193 Aacute
+^A 722,896,3,13,85,13 2 194 Acircumflex
+~A 722,866,3,13,85,13 2 195 Atilde
+:A 722,880,3,13,85,13 2 196 Adieresis
+oA 722,926,3,13,85,13 2 197 Aring
+AE 944,681,3,33,79,33 2 198 AE
+,C 685,695,218,60,-19,60 2 199 Ccedilla
+`E 611,911,3,45,39,45 2 200 Egrave
+'E 611,911,3,45,39,45 2 201 Eacute
+^E 611,896,3,45,39,45 2 202 Ecircumflex
+:E 611,880,3,45,39,45 2 203 Edieresis
+`I 389,911,3,73,51,66 2 204 Igrave
+'I 389,911,3,81,51,66 2 205 Iacute
+^I 389,896,3,104,51,66 2 206 Icircumflex
+:I 389,880,3,115,51,66 2 207 Idieresis
+-D 778,682,3,19,50,19 2 208 Eth
+~N 778,866,3,101,52,66 2 209 Ntilde
+`O 833,911,17,11,-26,11 2 210 Ograve
+'O 833,911,17,11,-26,11 2 211 Oacute
+^O 833,896,17,11,-26,11 2 212 Ocircumflex
+~O 833,866,17,11,-26,11 2 213 Otilde
+:O 833,880,17,11,-26,11 2 214 Odieresis
+tmu 606,479,0,0,-22 0 215 multiply
+/O 833,730,54,14,-7,14 2 216 Oslash
+`U 778,911,17,97,-33,66 2 217 Ugrave
+'U 778,911,17,97,-33,66 2 218 Uacute
+^U 778,896,17,97,-33,66 2 219 Ucircumflex
+:U 778,880,17,97,-33,66 2 220 Udieresis
+'Y 611,911,3,114,-4,66 2 221 Yacute
+TP 667,681,3,27,39,27 2 222 Thorn
+ss 556,726,271,43,181,43 3 223 germandbls
+`a 556,719,17,13,6,13 2 224 agrave
+'a 556,719,17,13,6,13 2 225 aacute
+^a 556,704,17,21,6,21 2 226 acircumflex
+~a 556,666,17,47,6,47 2 227 atilde
+:a 556,688,17,32,6,32 2 228 adieresis
+oa 556,714,17,13,6,13 2 229 aring
+ae 738,469,17,23,6,23 0 230 ae
+,c 444,469,218,42,18,42 0 231 ccedilla
+`e 444,719,17,24,22,24 2 232 egrave
+'e 444,719,17,54,22,54 2 233 eacute
+^e 444,704,17,77,22,66 2 234 ecircumflex
+:e 444,688,17,88,22,66 2 235 edieresis
+`i 333,719,17,39,24,39 2 236 igrave
+'i 333,719,17,109,24,66 2 237 iacute
+^i 333,704,17,120,24,66 2 238 icircumflex
+:i 333,688,17,143,24,66 2 239 idieresis
+Sd 556,726,17,40,2,40 2 240 eth
+~n 556,666,17,47,33,47 2 241 ntilde
+`o 556,719,17,0,2 2 242 ograve
+'o 556,719,17,0,2 2 243 oacute
+^o 556,704,17,9,2,9 2 244 ocircumflex
+~o 556,666,17,47,2,47 2 245 otilde
+:o 556,688,17,32,2,32 2 246 odieresis
+tdi 606,501,5 0 247 divide
+/o 556,506,50,16,36,16 0 248 oslash
+`u 556,719,17,15,28,15 2 249 ugrave
+'u 556,719,17,15,28,15 2 250 uacute
+^u 556,704,17,15,28,15 2 251 ucircumflex
+:u 556,688,17,32,28,32 2 252 udieresis
+'y 556,719,271,35,37,35 3 253 yacute
+Tp 556,726,271,10,71,10 3 254 thorn
+:y 556,688,271,35,37,35 3 255 ydieresis
+u2026 1000,135,17,0,-41 0 256 ellipsis
diff --git a/font/devps/old/PI b/font/devps/old/PI
new file mode 100644
index 0000000..53bc303
--- /dev/null
+++ b/font/devps/old/PI
@@ -0,0 +1,375 @@
+name PI
+internalname Palatino-Italic
+slant 10
+spacewidth 250
+encoding text.enc
+ligatures fi fl 0
+kernpairs
+A y -55
+A w -37
+A v -37
+A u0020 -37
+A ' -55
+A cq -55
+A Y -55
+A W -55
+A V -74
+A T -55
+F . -111
+F , -111
+F A -111
+L y -37
+L u0020 -18
+L ' -37
+L cq -37
+L Y -74
+L W -74
+L V -74
+L T -74
+P . -129
+P , -129
+P A -129
+R y -37
+R Y -55
+R W -55
+R V -74
+R T -55
+T y -92
+T w -92
+T u -111
+T ; -74
+T s -111
+T r -111
+T . -74
+T o -111
+T i -55
+T - -55
+T hy -55
+T e -111
+T , -74
+T : -74
+T c -111
+T a -111
+T O -18
+T A -92
+V y -74
+V u -74
+V ; -37
+V r -92
+V . -129
+V o -74
+V i -74
+V - -55
+V hy -55
+V e -92
+V , -129
+V : -37
+V a -74
+V A -210
+W y -20
+W u -20
+W ; -18
+W r -20
+W . -55
+W o -20
+W i -20
+W - -18
+W hy -18
+W e -20
+W , -55
+W : -18
+W a -20
+W A -92
+Y v -74
+Y u -92
+Y ; -74
+Y q -92
+Y . -92
+Y p -74
+Y o -111
+Y i -55
+Y - -74
+Y hy -74
+Y e -111
+Y , -92
+Y : -74
+Y a -92
+Y A -92
+f ' 55
+f cq 55
+1 1 -55
+` ` -74
+` oq -74
+oq ` -74
+oq oq -74
+' t -37
+cq t -37
+' u0020 -55
+cq u0020 -55
+' s -55
+cq s -55
+' ' -74
+' cq -74
+cq ' -74
+cq cq -74
+r ' 37
+r cq 37
+r q -18
+r . -74
+r o -18
+r h -18
+r g -18
+r e -18
+r , -74
+r c -18
+v . -55
+v , -55
+w . -55
+w , -55
+y . -37
+y , -37
+charset
+ha 606,689,0,0,-1 2 0 asciicircum
+ti 606,339,0,0,-1 0 1 asciitilde
+vS 556,907,18,33,8,33 2 2 Scaron
+vZ 667,907,3,20,30,20 2 3 Zcaron
+vs 389,687,11,80,41,68 2 4 scaron
+vz 444,687,11,53,51,53 2 5 zcaron
+:Y 667,847,3,58,-2,58 2 6 Ydieresis
+tm 1000,689,0,1,-2,1 2 7 trademark
+aq 333,733,0,5,-90,5 2 8 quotesingle
+space 250 0 32 space
+! 333,733,8,9,-26,9 2 33 exclam
+" 500,733,0,5,-90,5 2 34 quotedbl
+dq "
+# 500,692,0,45,46,45 2 35 numbersign
+sh "
+$ 500,733,113,2,35,2 2 36 dollar
+Do "
+% 889,710,7,0,-24 2 37 percent
+& 778,692,18,38,3,38 2 38 ampersand
+' 278,733,0,30,-28,30 2 39 quoteright
+cq "
+( 333,733,106,48,-4,48 2 40 parenleft
+) 333,733,106,0,48 2 41 parenright
+* 389,706,0,61,-26,61 2 42 asterisk
++ 606,504,0,0,-1 0 43 plus
+, 250,123,143,3,42,3 0 44 comma
+- 333,281,0,21,31,21 0 45 hyphen
+hy "
+. 250,112,5,0,-3 0 46 period
+/ 296,733,119,146,90,68 2 47 slash
+sl "
+0 500,699,11,30,14,30 2 48 zero
+1 500,699,3,0,-4 2 49 one
+2 500,699,3,0,38 2 50 two
+3 500,699,11,0,28 2 51 three
+4 500,699,3,28,35,28 2 52 four
+5 500,693,11,41,36,41 2 53 five
+6 500,699,11,19,1,19 2 54 six
+7 500,692,3,52,-3,52 2 55 seven
+8 500,699,11,19,14,19 2 56 eight
+9 500,699,11,18,18,18 2 57 nine
+: 250,458,5,7,6,7 0 58 colon
+; 250,456,146,19,59,19 0 59 semicolon
+< 606,516,6,0,-3 0 60 less
+= 606,378,0,0,-1 0 61 equal
+> 606,516,6,0,-3 0 62 greater
+? 500,706,8,0,-64 2 63 question
+@ 747,706,18,21,23,21 2 64 at
+at "
+A 722,705,3,5,69,5 2 65 A
+B 611,692,6,0,24 2 66 B
+C 667,706,18,34,5,34 2 67 C
+D 778,692,3,13,22,13 2 68 D
+E 611,692,3,9,20,9 2 69 E
+F 556,692,3,42,50,42 2 70 F
+G 722,706,18,22,0,22 2 71 G
+H 778,692,3,72,53,68 2 72 H
+I 333,692,3,71,43,68 2 73 I
+J 333,692,206,75,85,68 2 74 J
+K 667,692,3,66,37,66 2 75 K
+L 556,692,3,17,34,17 2 76 L
+M 944,692,18,46,69,46 2 77 M
+N 778,692,11,76,48,68 2 78 N
+O 778,706,18,20,-3,20 2 79 O
+P 611,692,3,33,41,33 2 80 P
+Q 778,706,201,20,-3,20 2 81 Q
+R 667,692,3,22,41,22 2 82 R
+S 556,706,18,0,8 2 83 S
+T 611,692,3,74,-3,68 2 84 T
+U 778,692,18,70,-38,68 2 85 U
+V 722,692,8,82,-25,68 2 86 V
+W 944,700,8,86,-21,68 2 87 W
+X 722,692,3,62,30,62 2 88 X
+Y 667,705,3,58,-2,58 2 89 Y
+Z 667,692,3,20,30,20 2 90 Z
+[ 333,733,100,43,32,43 2 91 bracketleft
+lB "
+\ 606,733,0,0,-31 2 92 backslash
+rs "
+] 333,733,100,32,43,32 2 93 bracketright
+rB "
+a^ 333,679,0,67,-6,67 2 94 circumflex
+^ "
+_ 500,0,125,50,50,50 0 95 underscore
+` 278,733,0,30,-28,30 2 96 quoteleft
+oq "
+a 444,482,11,12,46,12 0 97 a
+b 463,733,11,20,13,20 2 98 b
+c 407,482,11,32,25,32 0 99 c
+d 500,733,11,33,33,33 2 100 d
+e 389,482,11,35,35,35 0 101 e
+f 278,733,276,185,212,68 3 102 f
+g 500,482,276,48,87,48 1 103 g
+h 500,733,9,21,40,21 2 104 h
+i 278,712,9,36,16,36 2 105 i
+j 278,712,276,37,120,37 3 106 j
+k 444,733,9,55,42,55 2 107 k
+l 278,733,9,23,14,23 2 108 l
+m 778,482,9,12,26,12 0 109 m
+n 556,482,9,8,26,8 0 110 n
+o 444,482,11,17,33,17 0 111 o
+p 500,482,276,15,57,15 1 112 p
+q 463,482,276,19,26,19 1 113 q
+r 389,482,9,45,24,45 0 114 r
+s 389,482,11,6,41,6 0 115 s
+t 333,646,9,27,9,27 2 116 t
+u 556,482,11,6,18,6 0 117 u
+v 500,482,11,27,29,27 0 118 v
+w 722,482,11,27,29,27 0 119 w
+x 500,482,11,34,41,34 0 120 x
+y 500,482,276,40,58,40 1 121 y
+z 444,482,11,22,51,22 0 122 z
+lC 333,733,100,36,35,36 2 123 braceleft
+{ "
+ba 606,733,0,0,-225 2 124 bar
+| "
+rC 333,733,100,35,36,35 2 125 braceright
+} "
+a~ 333,638,0,107,-13,68 0 126 tilde
+~ "
+bq 278,120,122,0,23 0 128 quotesinglbase
+Fo 500,440,0,0,-7 0 129 guillemotleft
+Fc 500,440,0,0,-13 0 130 guillemotright
+bu 500,526,0,0,-36 0 131 bullet
+Fn 500,708,276,20,45,20 3 132 florin
+f/ 167,699,0,220,220,68 2 133 fraction
+%0 1000,717,6,0,-22 2 134 perthousand
+dg 500,692,0,19,2,19 2 135 dagger
+dd 500,692,162,44,40,44 2 136 daggerdbl
+en 500,278,0,60,60,60 0 137 endash
+em 1000,278,0,60,60,60 0 138 emdash
+fi 528,733,276,24,212,24 3 140 fi
+fl 545,733,276,25,212,25 3 141 fl
+.i 278,482,9,13,16,13 0 144 dotlessi
+ga 333,687,0,27,-36,27 2 146 grave
+a" 333,730,0,102,4,68 2 147 hungarumlaut
+a. 333,645,0,0,-125 2 148 dotaccent
+ab 333,677,0,110,-42,68 2 149 breve
+ah 333,679,0,126,-54,68 2 150 caron
+ao 333,708,0,76,-109,68 2 151 ring
+ho 333,0,207,0,12 0 152 ogonek
+lq 500,733,0,25,-48,25 2 153 quotedblleft
+rq 500,733,0,25,-48,25 2 154 quotedblright
+oe 669,482,11,35,33,35 0 155 oe
+/l 278,733,9,74,60,68 2 156 lslash
+Bq 500,120,122,0,7 0 157 quotedblbase
+OE 1028,706,18,11,-6,11 2 158 OE
+/L 556,692,3,17,66,17 2 159 Lslash
+r! 333,467,276,0,35 1 161 exclamdown
+ct 500,551,96,0,-6 0 162 cent
+Po 500,708,18,29,48,29 2 163 sterling
+Cs 500,577,0,36,36,36 0 164 currency
+Ye 500,699,3,62,15,62 2 165 yen
+bb 606,733,0,0,-225 2 166 brokenbar
+sc 500,706,220,13,36,13 2 167 section
+ad 333,637,0,95,-28,68 0 168 dieresis
+co 747,706,18,39,39,39 2 169 copyright
+Of 333,699,0,38,-10,38 2 170 ordfeminine
+fo 333,440,0,0,-7 0 171 guilsinglleft
+tno 606,378,0,0,-1 0 172 logicalnot
+\- 606,280,0,0,-1 0 173 minus
+rg 747,706,18,39,39,39 2 174 registered
+a- 333,589,0,103,-24,68 0 175 macron
+de 400,689,0,40,-40,40 2 176 degree
+t+- 606,504,0,0,-1 0 177 plusminus
+S2 300,699,0,40,37,40 2 178 twosuperior
+S3 300,699,0,54,22,54 2 179 threesuperior
+aa 333,687,0,63,-72,63 2 180 acute
+mc 556,482,226,6,35,6 0 181 mu
+ps 500,692,224,161,17,68 2 182 paragraph
+pc 250,312,0,0,-3 0 183 periodcentered
+ac 333,0,216,0,59 0 184 cedilla
+S1 300,699,0,35,-11,35 2 185 onesuperior
+Om 333,699,0,39,-16,39 2 186 ordmasculine
+fc 333,440,0,0,-13 0 187 guilsinglright
+14 750,699,2,15,19,15 2 188 onequarter
+12 750,699,2,21,19,21 2 189 onehalf
+34 750,699,2,15,15,15 2 190 threequarters
+r? 500,467,246,0,-7 0 191 questiondown
+`A 722,897,3,5,69,5 2 192 Agrave
+'A 722,897,3,5,69,5 2 193 Aacute
+^A 722,889,3,5,69,5 2 194 Acircumflex
+~A 722,866,3,5,69,5 2 195 Atilde
+:A 722,847,3,5,69,5 2 196 Adieresis
+oA 722,918,3,5,69,5 2 197 Aring
+AE 941,692,3,11,54,11 2 198 AE
+,C 667,706,216,34,5,34 2 199 Ccedilla
+`E 611,897,3,9,20,9 2 200 Egrave
+'E 611,897,3,9,20,9 2 201 Eacute
+^E 611,889,3,9,20,9 2 202 Ecircumflex
+:E 611,847,3,9,20,9 2 203 Edieresis
+`I 333,897,3,71,43,68 2 204 Igrave
+'I 333,897,3,123,43,68 2 205 Iacute
+^I 333,889,3,107,43,68 2 206 Icircumflex
+:I 333,847,3,135,43,68 2 207 Idieresis
+-D 778,692,3,13,31,13 2 208 Eth
+~N 778,866,11,76,48,68 2 209 Ntilde
+`O 778,897,18,20,-3,20 2 210 Ograve
+'O 778,897,18,20,-3,20 2 211 Oacute
+^O 778,889,18,20,-3,20 2 212 Ocircumflex
+~O 778,866,18,20,-3,20 2 213 Otilde
+:O 778,847,18,20,-3,20 2 214 Odieresis
+tmu 606,474,0,0,-33 0 215 multiply
+/O 778,721,39,34,18,34 2 216 Oslash
+`U 778,897,18,70,-38,68 2 217 Ugrave
+'U 778,897,18,70,-38,68 2 218 Uacute
+^U 778,889,18,70,-38,68 2 219 Ucircumflex
+:U 778,847,18,70,-38,68 2 220 Udieresis
+'Y 667,897,3,58,-2,58 2 221 Yacute
+TP 611,692,3,9,41,9 2 222 Thorn
+ss 500,733,276,38,210,38 3 223 germandbls
+`a 444,707,11,12,46,12 2 224 agrave
+'a 444,707,11,20,46,20 2 225 aacute
+^a 444,699,11,12,46,12 2 226 acircumflex
+~a 444,650,11,52,46,52 2 227 atilde
+:a 444,657,11,40,46,40 2 228 adieresis
+oa 444,728,11,12,46,12 2 229 aring
+ae 638,482,11,35,49,35 0 230 ae
+,c 407,482,216,32,25,32 0 231 ccedilla
+`e 389,707,11,35,35,35 2 232 egrave
+'e 389,707,11,55,35,55 2 233 eacute
+^e 389,699,11,59,35,59 2 234 ecircumflex
+:e 389,657,11,67,35,67 2 235 edieresis
+`i 278,707,9,43,16,43 2 236 igrave
+'i 278,707,9,103,16,68 2 237 iacute
+^i 278,699,9,95,21,68 2 238 icircumflex
+:i 278,657,9,123,16,68 2 239 idieresis
+Sd 444,733,11,84,33,68 2 240 eth
+~n 556,650,9,8,26,8 2 241 ntilde
+`o 444,707,11,17,33,17 2 242 ograve
+'o 444,707,11,20,33,20 2 243 oacute
+^o 444,699,11,17,33,17 2 244 ocircumflex
+~o 444,650,11,52,33,52 2 245 otilde
+:o 444,657,11,40,33,40 2 246 odieresis
+tdi 606,504,0,0,-1 0 247 divide
+/o 444,510,24,66,68,66 0 248 oslash
+`u 556,707,11,6,18,6 2 249 ugrave
+'u 556,707,11,6,18,6 2 250 uacute
+^u 556,699,11,6,18,6 2 251 ucircumflex
+:u 556,657,11,6,18,6 2 252 udieresis
+'y 500,707,276,40,58,40 3 253 yacute
+Tp 500,733,276,0,89 3 254 thorn
+:y 500,657,276,40,58,40 3 255 ydieresis
+u2026 1000,112,5,0,-52 0 256 ellipsis
diff --git a/font/devps/old/PR b/font/devps/old/PR
new file mode 100644
index 0000000..2f005e7
--- /dev/null
+++ b/font/devps/old/PR
@@ -0,0 +1,377 @@
+name PR
+internalname Palatino-Roman
+spacewidth 250
+encoding text.enc
+ligatures fi fl 0
+kernpairs
+A y -74
+A w -74
+A v -92
+A u0020 -55
+A ' -74
+A cq -74
+A Y -111
+A W -74
+A V -111
+A T -74
+F . -92
+F , -92
+F A -74
+L y -55
+L u0020 -37
+L ' -74
+L cq -74
+L Y -92
+L W -74
+L V -92
+L T -74
+P u0020 -18
+P . -129
+P , -129
+P A -92
+R y -37
+R Y -37
+R W -37
+R V -55
+R T -37
+T y -90
+T w -90
+T u -90
+T ; -55
+T s -90
+T r -90
+T . -74
+T o -92
+T i -55
+T - -55
+T hy -55
+T e -92
+T , -74
+T : -55
+T c -111
+T a -92
+T O -18
+T A -74
+V y -92
+V u -92
+V ; -55
+V r -92
+V . -129
+V o -111
+V i -55
+V - -74
+V hy -74
+V e -111
+V , -129
+V : -55
+V a -92
+V A -111
+W y -50
+W u -50
+W ; -18
+W r -74
+W . -92
+W o -92
+W i -55
+W - -55
+W hy -55
+W e -92
+W , -92
+W : -18
+W a -92
+W A -92
+Y v -90
+Y u -90
+Y u0020 -18
+Y ; -74
+Y q -90
+Y . -111
+Y p -111
+Y o -92
+Y i -55
+Y - -92
+Y hy -92
+Y e -92
+Y , -111
+Y : -74
+Y a -92
+Y A -92
+f ' 55
+f cq 55
+f f -18
+1 1 -55
+` ` -37
+` oq -37
+oq ` -37
+oq oq -37
+' ' -37
+' cq -37
+cq ' -37
+cq cq -37
+r u -8
+r ' 74
+r cq 74
+r q -18
+r . -74
+r o -18
+r - -18
+r hy -18
+r h -18
+r g -18
+r e -18
+r d -18
+r , -74
+r c -18
+u0020 Y -18
+u0020 A -37
+v . -111
+v , -111
+w . -92
+w , -92
+y . -111
+y , -111
+charset
+ha 606,689 2 0 asciicircum
+ti 606,347 0 1 asciitilde
+vS 525,908,20 2 2 Scaron
+vZ 667,908,3 2 3 Zcaron
+vs 424,685,20 2 4 scaron
+vz 500,685,3 2 5 zcaron
+:Y 667,868,3 2 6 Ydieresis
+tm 979,689 2 7 trademark
+aq 208,709 2 8 quotesingle
+space 250 0 32 space
+! 278,694,5 2 33 exclam
+" 371,709 2 34 quotedbl
+dq "
+# 500,684 2 35 numbersign
+sh "
+$ 500,731,116 2 36 dollar
+Do "
+% 840,709,20 2 37 percent
+& 778,689,20 2 38 ampersand
+' 278,709 2 39 quoteright
+cq "
+( 333,726,215 2 40 parenleft
+) 333,726,215 2 41 parenright
+* 389,689 2 42 asterisk
++ 606,512 0 43 plus
+, 250,123,155 0 44 comma
+- 333,287 0 45 hyphen
+hy "
+. 250,111,5 0 46 period
+/ 606,726,119 2 47 slash
+sl "
+0 500,689,20 2 48 zero
+1 500,694,3 2 49 one
+2 500,689,3 2 50 two
+3 500,689,20 2 51 three
+4 500,694,3 2 52 four
+5 500,689,20 2 53 five
+6 500,689,20 2 54 six
+7 500,689,3 2 55 seven
+8 500,689,20 2 56 eight
+9 500,689,20 2 57 nine
+: 250,456,5 0 58 colon
+; 250,456,153 0 59 semicolon
+< 606,522 0 60 less
+= 606,386 0 61 equal
+> 606,522 0 62 greater
+? 444,694,5 2 63 question
+@ 747,694,20 2 64 at
+at "
+A 778,700,3 2 65 A
+B 611,692,3 2 66 B
+C 709,709,20 2 67 C
+D 774,692,3 2 68 D
+E 611,692,3 2 69 E
+F 556,692,3 2 70 F
+G 763,709,20 2 71 G
+H 832,692,3 2 72 H
+I 337,692,3 2 73 I
+J 333,692,194,0,15 2 74 J
+K 726,692,3 2 75 K
+L 611,692,3 2 76 L
+M 946,692,13 2 77 M
+N 831,692,20 2 78 N
+O 786,709,20 2 79 O
+P 604,692,3 2 80 P
+Q 786,709,176 2 81 Q
+R 668,692,3,1 2 82 R
+S 525,709,20 2 83 S
+T 613,692,3 2 84 T
+U 778,692,20 2 85 U
+V 722,692,9 2 86 V
+W 1000,700,9 2 87 W
+X 667,700,3 2 88 X
+Y 667,704,3 2 89 Y
+Z 667,692,3 2 90 Z
+[ 333,726,184 2 91 bracketleft
+lB "
+\ 606,726 2 92 backslash
+rs "
+] 333,726,184 2 93 bracketright
+rB "
+a^ 333,677 2 94 circumflex
+^ "
+_ 500,0,125 0 95 underscore
+` 278,709 2 96 quoteleft
+oq "
+a 500,469,12 0 97 a
+b 553,726,12,0,15 2 98 b
+c 444,469,20 0 99 c
+d 611,726,12 2 100 d
+e 479,469,20 0 101 e
+f 333,728,3,8 2 102 f
+g 556,469,283 1 103 g
+h 582,726,3 2 104 h
+i 291,687,3 2 105 i
+j 234,688,283,0,40 3 106 j
+k 556,726,12 2 107 k
+l 291,726,3 2 108 l
+m 883,469,3 0 109 m
+n 582,469,3 0 110 n
+o 546,469,20 0 111 o
+p 601,469,281 1 112 p
+q 560,469,281 1 113 q
+r 395,469,3 0 114 r
+s 424,469,20 0 115 s
+t 326,621,12 2 116 t
+u 603,469,12 0 117 u
+v 565,459,7 0 118 v
+w 834,469,7 0 119 w
+x 516,469,3 0 120 x
+y 556,459,283 1 121 y
+z 500,462,3 0 122 z
+lC 333,726,175 2 123 braceleft
+{ "
+ba 606,726 2 124 bar
+| "
+rC 333,726,175 2 125 braceright
+} "
+a~ 333,640 2 126 tilde
+~ "
+bq 278,110,153 0 128 quotesinglbase
+Fo 500,428 0 129 guillemotleft
+Fc 500,428 0 130 guillemotright
+bu 606,516 0 131 bullet
+Fn 500,706,262 2 132 florin
+f/ 167,689,0,170,166 2 133 fraction
+%0 1144,709,20 2 134 perthousand
+dg 500,694,5 2 135 dagger
+dd 500,694,249 2 136 daggerdbl
+en 500,277 0 137 endash
+em 1000,277 0 138 emdash
+fi 605,728,3 2 140 fi
+fl 608,728,3 2 141 fl
+.i 287,469,3 0 144 dotlessi
+ga 333,677 2 146 grave
+a" 380,687 2 147 hungarumlaut
+a. 250,637 2 148 dotaccent
+ab 333,664 2 149 breve
+ah 333,677 2 150 caron
+ao 333,696 2 151 ring
+ho 313,0,165 0 152 ogonek
+lq 500,709 2 153 quotedblleft
+rq 500,709 2 154 quotedblright
+oe 827,469,20 0 155 oe
+/l 291,726,3,15,14 2 156 lslash
+Bq 500,110,153 0 157 quotedblbase
+OE 998,709,20 2 158 OE
+/L 611,692,3 2 159 Lslash
+r! 278,469,225 0 161 exclamdown
+ct 500,562,101 0 162 cent
+Po 500,694,13 2 163 sterling
+Cs 500,531 0 164 currency
+Ye 500,701,3 2 165 yen
+bb 606,726 2 166 brokenbar
+sc 500,709,219 2 167 section
+ad 333,637 2 168 dieresis
+co 747,706,18 2 169 copyright
+Of 333,709 2 170 ordfeminine
+fo 331,428 0 171 guilsinglleft
+tno 606,386 0 172 logicalnot
+\- 606,289 0 173 minus
+rg 747,706,18 2 174 registered
+a- 333,591 0 175 macron
+de 400,689 2 176 degree
+t+- 606,512 0 177 plusminus
+S2 300,689,0,1 2 178 twosuperior
+S3 300,689 2 179 threesuperior
+aa 333,677 2 180 acute
+mc 603,469,236 0 181 mu
+ps 628,694,150 2 182 paragraph
+pc 250,319 0 183 periodcentered
+ac 333,0,225 0 184 cedilla
+S1 300,692 2 185 onesuperior
+Om 333,709 2 186 ordmasculine
+fc 331,428 0 187 guilsinglright
+14 750,692,3 2 188 onequarter
+12 750,692,3 2 189 onehalf
+34 750,689,3 2 190 threequarters
+r? 444,469,231 0 191 questiondown
+`A 778,908,3 2 192 Agrave
+'A 778,908,3 2 193 Aacute
+^A 778,908,3 2 194 Acircumflex
+~A 778,871,3 2 195 Atilde
+:A 778,868,3 2 196 Adieresis
+oA 778,927,3 2 197 Aring
+AE 944,692,3,0,10 2 198 AE
+,C 709,709,225 2 199 Ccedilla
+`E 611,908,3 2 200 Egrave
+'E 611,908,3 2 201 Eacute
+^E 611,908,3 2 202 Ecircumflex
+:E 611,868,3 2 203 Edieresis
+`I 337,908,3 2 204 Igrave
+'I 337,908,3 2 205 Iacute
+^I 337,908,3 2 206 Icircumflex
+:I 337,868,3 2 207 Idieresis
+-D 774,692,3 2 208 Eth
+~N 831,871,20 2 209 Ntilde
+`O 786,908,20 2 210 Ograve
+'O 786,908,20 2 211 Oacute
+^O 786,908,20 2 212 Ocircumflex
+~O 786,883,20 2 213 Otilde
+:O 786,868,20 2 214 Odieresis
+tmu 606,474 0 215 multiply
+/O 833,709,20 2 216 Oslash
+`U 778,908,20 2 217 Ugrave
+'U 778,908,20 2 218 Uacute
+^U 778,908,20 2 219 Ucircumflex
+:U 778,868,20 2 220 Udieresis
+'Y 667,908,3 2 221 Yacute
+TP 604,692,3 2 222 Thorn
+ss 556,731,9 2 223 germandbls
+`a 500,697,12 2 224 agrave
+'a 500,697,12 2 225 aacute
+^a 500,697,12 2 226 acircumflex
+~a 500,652,12 2 227 atilde
+:a 500,657,12 2 228 adieresis
+oa 500,716,12 2 229 aring
+ae 758,469,20 0 230 ae
+,c 444,469,225 0 231 ccedilla
+`e 479,697,20 2 232 egrave
+'e 479,697,20 2 233 eacute
+^e 479,697,20 2 234 ecircumflex
+:e 479,657,20 2 235 edieresis
+`i 287,697,3 2 236 igrave
+'i 287,697,3 2 237 iacute
+^i 287,697,3,13,12 2 238 icircumflex
+:i 287,657,3,6,6 2 239 idieresis
+Sd 546,728,20 2 240 eth
+~n 582,652,3 2 241 ntilde
+`o 546,697,20 2 242 ograve
+'o 546,697,20 2 243 oacute
+^o 546,697,20 2 244 ocircumflex
+~o 546,652,20 2 245 otilde
+:o 546,657,20 2 246 odieresis
+tdi 606,512 0 247 divide
+/o 556,474,23 0 248 oslash
+`u 603,697,12 2 249 ugrave
+'u 603,697,12 2 250 uacute
+^u 603,697,12 2 251 ucircumflex
+:u 603,657,12 2 252 udieresis
+'y 556,697,283 3 253 yacute
+Tp 601,726,281,0,2 3 254 thorn
+:y 556,657,283 3 255 ydieresis
+u2026 1000,111,5 0 256 ellipsis
diff --git a/font/devps/old/S b/font/devps/old/S
new file mode 100644
index 0000000..7ed54bc
--- /dev/null
+++ b/font/devps/old/S
@@ -0,0 +1,229 @@
+name S
+internalname Symbol
+special
+spacewidth 250
+charset
+space 250 0 32 space
+! 333,672,17 3 33 exclam
+fa 713,705 3 34 universal
+# 500,673,16 3 35 numbersign
+sh "
+te 549,707 3 36 existential
+% 833,655,36 3 37 percent
+& 778,661,18 3 38 ampersand
+st 439,500,17 3 39 suchthat
+( 333,673,191 3 40 parenleft
+) 333,673,191 3 41 parenright
+** 500,551 3 42 asteriskmath
++ 549,533 3 43 plus
+pl "
+, 250,104,152 3 44 comma
+\- 549,288 3 45 minus
+mi "
+. 250,95,17 3 46 period
+/ 278,646,18 3 47 slash
+sl "
+0 500,685,17 3 48 zero
+1 500,673 3 49 one
+2 500,686 3 50 two
+3 500,685,17 3 51 three
+4 500,685 3 52 four
+5 500,685,17 3 53 five
+6 500,685,17 3 54 six
+7 500,673,16 3 55 seven
+8 500,685,18 3 56 eight
+9 500,685,18 3 57 nine
+: 278,460,17 3 58 colon
+; 278,460,152 3 59 semicolon
+< 549,522 3 60 less
+= 549,390 3 61 equal
+eq "
+> 549,522 3 62 greater
+? 444,686,17 3 63 question
+=~ 549,475 3 64 congruent
+*A 722,673 3 65 Alpha
+*B 667,673 3 66 Beta
+*X 722,673,0,0,9 3 67 Chi
+*D 612,688 3 68 Delta
+*E 611,673,0,6 3 69 Epsilon
+*F 763,673 3 70 Phi
+*G 603,673,0,6 3 71 Gamma
+*Y 722,673,0,7 3 72 Eta
+*I 333,673 3 73 Iota
++h 631,689,18 3 74 theta1
+*K 722,673 3 75 Kappa
+*L 686,688 3 76 Lambda
+*M 889,673 3 77 Mu
+*N 722,673,8 3 78 Nu
+*O 722,685,17 3 79 Omicron
+*P 768,673 3 80 Pi
+*H 741,685,17 3 81 Theta
+*R 556,673,0,7 3 82 Rho
+*S 592,673 3 83 Sigma
+*T 611,673 3 84 Tau
+u03A5 690,673,0,4,8 3 85 Upsilon
+ts 439,500,233 3 86 sigma1
+*W 768,688 3 87 Omega
+*C 645,673 3 88 Xi
+*Q 795,684 3 89 Psi
+*Z 611,673,0,25 3 90 Zeta
+[ 333,674,155 3 91 bracketleft
+lB "
+3d 863,478 3 92 therefore
+tf "
+] 333,674,155 3 93 bracketright
+rB "
+pp 658,674 3 94 perpendicular
+_ 500,0,252,2,2 3 95 underscore
+radicalex 500,917,0,590 3 96 radicalex
+*a 631,500,18 3 97 alpha
+*b 549,741,223 3 98 beta
+*x 549,499,231 3 99 chi
+*d 494,740,19 3 100 delta
+*e 439,502,19 3 101 epsilon
+*f 521,671,224 3 102 phi
+*g 411,499,225,73 3 103 gamma
+*y 603,514,202 3 104 eta
+*i 329,503,17 3 105 iota
++f 603,499,224 3 106 phi1
+*k 549,501,0,9 3 107 kappa
+*l 549,739,17 3 108 lambda
+mc 576,500,223 3 109 mu
+*m "
+*n 521,507,16,0,9 3 110 nu
+*o 549,499,19 3 111 omicron
+*p 549,487,19 3 112 pi
+*h 521,690,17 3 113 theta
+*r 549,499,230 3 114 rho
+*s 603,500,21 3 115 sigma
+*t 439,500,19 3 116 tau
+*u 576,507,18 3 117 upsilon
++p 713,583,18 3 118 omega1
+*w 686,500,17 3 119 omega
+*c 493,766,224 3 120 xi
+*q 686,500,228,15 3 121 psi
+*z 494,756,225 3 122 zeta
+lC 480,673,183 3 123 braceleft
+{ "
+ba 200,673,177 3 124 bar
+| "
+rC 480,673,183 3 125 braceright
+} "
+ap 549,307 3 126 similar
+*U 620,685,0,0,2 3 161 Upsilon1
+fm 247,735 3 162 minute
+<= 549,639 3 163 lessequal
+f/ 167,677,12,173,180 3 164 fraction
+if 713,404 3 165 infinity
+Fn 500,686,193 3 166 florin
+CL 753,533,26 3 167 club
+DI 753,550,36 3 168 diamond
+HE 753,532,33 3 169 heart
+SP 753,548,36 3 170 spade
+<> 1042,511,15 3 171 arrowboth
+<- 987,511,15 3 172 arrowleft
+ua 603,910 3 173 arrowup
+arrowverttp "
+-> 987,511,15 3 174 arrowright
+da 603,888,22 3 175 arrowdown
+arrowvertbt "
+de 400,685 3 176 degree
+t+- 549,645 3 177 plusminus
++- "
+sd 411,737,0,2 3 178 second
+>= 549,639 3 179 greaterequal
+tmu 549,524 3 180 multiply
+mu "
+pt 713,404 3 181 proportional
+pd 494,746,20 3 182 partialdiff
+bu 460,473 3 183 bullet
+tdi 549,456 3 184 divide
+di "
+!= 549,549,25 3 185 notequal
+== 549,443 3 186 equivalence
+~~ 549,394 3 187 approxequal
+~= "
+u2026 1000,95,17 3 188 ellipsis
+arrowvertex 603,1010,120 3 189 arrowvertex
+an 1000,276,0,50,60 3 190 arrowhorizex
+CR 658,629,16 3 191 carriagereturn
+Ah 823,658,18 3 192 aleph
+Im 686,740,53 3 193 Ifraktur
+Re 795,734,15 3 194 Rfraktur
+wp 987,573,211 3 195 weierstrass
+c* 768,673,17 3 196 circlemultiply
+c+ 768,675,15 3 197 circleplus
+es 823,719,24 3 198 emptyset
+ca 768,509 3 199 intersection
+cu 768,492,17 3 200 union
+sp 713,470 3 201 propersuperset
+ip 713,470,125 3 202 reflexsuperset
+nb 713,540,70 3 203 notsubset
+sb 713,470 3 204 propersubset
+ib 713,470,125 3 205 reflexsubset
+mo 713,468 3 206 element
+nm 713,555,58 3 207 notelement
+/_ 768,673 3 208 angle
+gr 713,718,19 3 209 gradient
+--- 790,673,17 3 210 registerserif
+--- 790,675,15 3 211 copyrightserif
+--- 890,673 3 212 trademarkserif
+product 823,751,101 3 213 product
+sr 549,917,38 3 214 radical
+sqrt "
+md 250,310 3 215 dotmath
+tno 713,288 3 216 logicalnot
+no "
+AN 603,454 3 217 logicaland
+OR 603,477 3 218 logicalor
+hA 1042,510,20 3 219 arrowdblboth
+lA 987,513,15 3 220 arrowdblleft
+uA 603,911 3 221 arrowdblup
+rA 987,508,20 3 222 arrowdblright
+dA 603,890,19 3 223 arrowdbldown
+lz 494,745 3 224 lozenge
+la 329,746,198 3 225 angleleft
+--- 790,670,20 3 226 registersans
+--- 790,675,15 3 227 copyrightsans
+--- 786,673 3 228 trademarksans
+sum 713,752,108 3 229 summation
+parenlefttp 384,926,293,52 3 230 parenlefttp
+parenleftex 384,920,80 3 231 parenleftex
+parenleftbt 384,920,293,52 3 232 parenleftbt
+bracketlefttp 384,925,75 3 233 bracketlefttp
+lc "
+bracketleftex 384,925,75 3 234 bracketleftex
+bracketleftbt 384,925,75 3 235 bracketleftbt
+lf "
+bracelefttp 494,925,75 3 236 bracelefttp
+lt "
+braceleftmid 494,925,75 3 237 braceleftmid
+lk "
+braceleftbt 494,925,75 3 238 braceleftbt
+lb "
+braceex 494,925,75 3 239 braceex
+bracerightex "
+braceleftex "
+barex "
+bv "
+ra 329,746,198 3 241 angleright
+is 274,916,107,67,52,-10 3 242 integral
+integral "
+u2320 686,921,83,29 3 243 integraltp
+u23AE 686,975,88 3 244 integralex
+u2321 686,921,81 3 245 integralbt
+parenrighttp 384,926,293,66 3 246 parenrighttp
+parenrightex 384,920,80,66 3 247 parenrightex
+parenrightbt 384,920,293,66 3 248 parenrightbt
+bracketrighttp 384,925,75 3 249 bracketrighttp
+rc "
+bracketrightex 384,925,75 3 250 bracketrightex
+bracketrightbt 384,925,75 3 251 bracketrightbt
+rf "
+bracerighttp 494,925,75 3 252 bracerighttp
+rt "
+bracerightmid 494,925,75 3 253 bracerightmid
+rk "
+bracerightbt 494,925,75 3 254 bracerightbt
+rb "
+--- 790,808,3 3 256 apple
diff --git a/font/devps/old/SS b/font/devps/old/SS
new file mode 100644
index 0000000..92c3c54
--- /dev/null
+++ b/font/devps/old/SS
@@ -0,0 +1,194 @@
+name SS
+internalname Symbol-Slanted
+special
+slant 15.5
+spacewidth 223
+charset
+space 223 0 32 space
+--- 296,599,15,137,-72,99 3 33 exclam
+--- 635,627,0,216,-173,99 3 34 universal
+--- 445,599,15,162,-21,99 3 35 numbersign
+--- 489,629,0,183,28,99 3 36 existential
+--- 741,583,32,75,-97,75 3 37 percent
+--- 692,589,16,103,-18,99 3 38 ampersand
+--- 391,444,15,109,6,99 3 39 suchthat
+--- 296,599,170,203,-39,99 3 40 parenleft
+--- 296,600,170,93,72,93 3 41 parenright
+--- 445,490,0,105,-76,99 3 42 asteriskmath
+--- 489,474,0,123,-26,99 3 43 plus
+--- 223,93,136,10,41,10 3 44 comma
+--- 489,256,0,117,-24,99 3 45 minus
+--- 223,85,15,1,-20,1 3 46 period
+--- 247,575,15,208,55,99 3 47 slash
+--- 445,610,15,142,-40,99 3 48 zero
+--- 445,599,0,56,-57,56 3 49 one
+--- 445,611,0,129,28,99 3 50 two
+--- 445,611,16,115,-6,99 3 51 three
+--- 445,610,0,135,-8,99 3 52 four
+--- 445,610,15,188,14,99 3 53 five
+--- 445,610,16,193,-37,99 3 54 six
+--- 445,599,15,190,-101,99 3 55 seven
+--- 445,611,16,141,-32,99 3 56 eight
+--- 445,609,15,140,-2,99 3 57 nine
+--- 247,409,15,89,-31,89 3 58 colon
+--- 247,409,136,99,17,99 3 59 semicolon
+--- 489,464,0,171,-37,99 3 60 less
+--- 489,347,0,147,1,99 3 61 equal
+--- 489,464,0,108,27,99 3 62 greater
+--- 395,610,15,172,-113,99 3 63 question
+--- 489,423,0,158,40,99 3 64 congruent
+--- 643,599,0,21,47,21 3 65 Alpha
+--- 594,598,0,101,24,99 3 66 Beta
+--- 643,599,0,205,58,99 3 67 Chi
+--- 545,612,0,46,45,46 3 68 Delta
+--- 544,599,0,194,22,99 3 69 Epsilon
+--- 679,598,0,132,-55,99 3 70 Phi
+--- 537,599,0,227,19,99 3 71 Gamma
+--- 643,599,0,243,15,99 3 72 Eta
+--- 296,599,0,222,22,99 3 73 Iota
++h 562,614,15,133,-58,99 3 74 theta1
+--- 643,598,0,185,19,99 3 75 Kappa
+--- 611,612,0,49,45,49 3 76 Lambda
+--- 791,599,0,233,22,99 3 77 Mu
+--- 643,599,7,234,24,99 3 78 Nu
+--- 643,610,15,154,-62,99 3 79 Omicron
+--- 684,599,0,213,28,99 3 80 Pi
+--- 659,610,15,138,-62,99 3 81 Theta
+--- 495,599,0,200,25,99 3 82 Rho
+--- 527,599,0,186,45,99 3 83 Sigma
+--- 544,599,0,229,-109,99 3 84 Tau
+--- 614,599,0,240,-125,99 3 85 Upsilon
+ts 391,445,208,151,-28,99 3 86 sigma1
+--- 684,612,0,126,20,99 3 87 Omega
+--- 574,598,0,176,14,99 3 88 Xi
+--- 708,608,0,227,-138,99 3 89 Psi
+--- 544,599,0,231,11,99 3 90 Zeta
+--- 296,599,138,207,16,99 3 91 bracketleft
+--- 768,426,0,0,-110 3 92 therefore
+--- 296,599,138,159,64,99 3 93 bracketright
+--- 586,600,0,60,37,60 3 94 perpendicular
+--- 445,0,224,0,122 3 95 underscore
+--- 445,816,0,829,-622,99 3 96 radicalex
+*a 562,445,15,146,-34,99 3 97 alpha
+*b 489,659,198,139,57,99 3 98 beta
+*x 489,445,206,134,98,99 3 99 chi
+*d 440,658,16,181,-33,99 3 100 delta
+*e 391,447,17,127,1,99 3 101 epsilon
+*f 464,596,200,103,-28,99 3 102 phi
+*g 366,444,200,252,-42,99 3 103 gamma
+*y 537,457,180,68,-50,68 3 104 eta
+*i 293,448,16,53,-47,53 3 105 iota
++f 537,444,199,117,-42,99 3 106 phi1
+*k 489,447,0,182,-56,99 3 107 kappa
+*l 489,658,16,91,29,91 3 108 lambda
+*m 513,445,198,70,68,70 3 109 mu
+*n 464,451,15,134,-69,99 3 110 nu
+*o 489,444,17,87,-36,87 3 111 omicron
+*p 489,433,18,160,-8,99 3 112 pi
+*h 464,614,16,140,-53,99 3 113 theta
+*r 489,444,205,82,69,82 3 114 rho
+*s 537,445,19,175,-37,99 3 115 sigma
+*t 391,445,16,170,-45,99 3 116 tau
+*u 513,451,15,95,-55,95 3 117 upsilon
++p 635,519,15,173,-28,99 3 118 omega1
+*w 611,445,16,126,-35,99 3 119 omega
+*c 439,681,200,126,-20,99 3 120 xi
+*q 611,445,203,198,-91,99 3 121 psi
+*z 440,673,200,190,-50,99 3 122 zeta
+--- 427,599,163,163,-66,99 3 123 braceleft
+--- 178,599,158,179,41,99 3 124 bar
+--- 427,599,163,67,31,67 3 125 braceright
+--- 489,273,0,110,-28,99 3 126 similar
+--- 552,609,0,208,-84,99 3 161 Upsilon1
+--- 220,654,0,223,-106,99 3 162 minute
+--- 489,569,0,206,24,99 3 163 lessequal
+--- 149,603,11,391,214,99 3 164 fraction
+--- 635,360,0,107,-41,99 3 165 infinity
+--- 445,612,172,219,86,99 3 166 florin
+--- 670,474,23,25,-69,25 3 167 club
+--- 670,490,32,0,-148 3 168 diamond
+--- 670,473,29,59,-155,59 3 169 heart
+--- 670,488,32,0,-82 3 170 spade
+--- 927,455,13,103,-40,99 3 171 arrowboth
+--- 878,455,13,87,-47,87 3 172 arrowleft
+--- 537,810,0,204,-173,99 3 173 arrowup
+--- 878,455,13,94,-55,94 3 174 arrowright
+--- 537,790,20,85,-54,85 3 175 arrowdown
+--- 356,609,0,160,-137,99 3 176 degree
+--- 489,574,0,154,41,99 3 177 plusminus
+--- 366,656,0,244,-100,99 3 178 second
+--- 489,569,0,143,24,99 3 179 greaterequal
+--- 489,466,0,170,22,99 3 180 multiply
+--- 635,360,0,82,-40,82 3 181 proportional
+--- 440,664,18,152,-12,99 3 182 partialdiff
+--- 409,421,0,95,-68,95 3 183 bullet
+--- 489,406,0,119,-24,99 3 184 divide
+--- 489,489,22,148,-1,99 3 185 notequal
+--- 489,394,0,163,15,99 3 186 equivalence
+--- 489,351,0,133,-7,99 3 187 approxequal
+--- 890,85,15,0,-57 3 188 ellipsis
+--- 537,899,107,92,-166,92 3 189 arrowvertex
+--- 890,246,0,171,42,99 3 190 arrowhorizex
+--- 586,560,14,174,10,99 3 191 carriagereturn
+--- 732,586,16,58,-109,58 3 192 aleph
+--- 611,659,47,123,24,99 3 193 Ifraktur
+--- 708,653,13,175,-21,99 3 194 Rfraktur
+--- 878,510,188,50,-62,50 3 195 weierstrass
+--- 684,599,15,124,-64,99 3 196 circlemultiply
+--- 684,601,13,125,-65,99 3 197 circleplus
+--- 732,640,21,202,12,99 3 198 emptyset
+--- 684,453,0,80,14,80 3 199 intersection
+--- 684,438,15,154,-60,99 3 200 union
+--- 635,418,0,90,32,90 3 201 propersuperset
+--- 635,418,111,89,67,89 3 202 reflexsuperset
+--- 635,481,62,159,-37,99 3 203 notsubset
+--- 635,418,0,159,-37,99 3 204 propersubset
+--- 635,418,111,159,34,99 3 205 reflexsubset
+--- 635,417,0,0,-43 3 206 element
+--- 635,494,52,0,-24 3 207 notelement
+--- 684,599,0,199,27,99 3 208 angle
+--- 635,639,17,220,-181,99 3 209 gradient
+--- 703,596,18,110,-70,99 3 210 registerserif
+--- 703,601,13,113,-72,99 3 211 copyrightserif
+--- 792,599,0,205,-119,99 3 212 trademarkserif
+--- 732,668,90,238,56,99 3 213 product
+--- 489,816,34,272,-84,99 3 214 radical
+--- 223,276,0,52,-81,52 3 215 dotmath
+--- 635,256,0,100,-28,99 3 216 logicalnot
+--- 537,404,0,32,29,32 3 217 logicaland
+--- 537,424,0,152,-101,99 3 218 logicalor
+--- 927,454,18,101,-42,99 3 219 arrowdblboth
+--- 878,457,13,114,-46,99 3 220 arrowdblleft
+--- 537,811,0,201,-102,99 3 221 arrowdblup
+--- 878,452,18,89,-21,89 3 222 arrowdblright
+--- 537,792,17,152,-53,99 3 223 arrowdbldown
+--- 440,663,0,129,-71,99 3 224 lozenge
+--- 293,664,176,229,-48,99 3 225 angleleft
+--- 703,596,18,110,-70,99 3 226 registersans
+--- 703,601,13,111,-70,99 3 227 copyrightsans
+--- 700,599,0,182,-129,99 3 228 trademarksans
+--- 635,669,96,171,65,99 3 229 summation
+--- 342,824,261,350,96,99 3 230 parenlefttp
+--- 342,823,76,46,38,46 3 231 parenleftex
+--- 342,824,261,47,-63,47 3 232 parenleftbt
+--- 342,824,71,268,72,99 3 233 bracketlefttp
+--- 342,823,70,13,72,13 3 234 bracketleftex
+--- 342,824,71,14,72,14 3 235 bracketleftbt
+--- 440,824,67,258,-108,99 3 236 bracelefttp
+--- 440,832,76,96,-76,96 3 237 braceleftmid
+--- 440,824,62,94,-169,94 3 238 braceleftbt
+--- 440,832,71,96,-107,96 3 239 braceex
+--- 293,664,176,102,79,99 3 241 angleright
+--- 244,815,95,305,63,99 3 242 integral
+--- 611,820,74,312,-222,99 3 243 integraltp
+--- 611,868,78,79,-221,79 3 244 integralex
+--- 611,820,72,64,20,64 3 245 integralbt
+--- 342,824,261,206,-223,99 3 246 parenrighttp
+--- 342,823,76,365,-281,99 3 247 parenrightex
+--- 342,824,261,365,80,99 3 248 parenrightbt
+--- 342,824,71,285,-199,99 3 249 bracketrighttp
+--- 342,823,70,285,-200,99 3 250 bracketrightex
+--- 342,824,71,285,54,99 3 251 bracketrightbt
+--- 440,824,67,35,-108,35 3 252 bracerighttp
+--- 440,832,76,127,-105,99 3 253 bracerightmid
+--- 440,824,62,94,54,94 3 254 bracerightbt
diff --git a/font/devps/old/TB b/font/devps/old/TB
new file mode 100644
index 0000000..e9f11c7
--- /dev/null
+++ b/font/devps/old/TB
@@ -0,0 +1,460 @@
+name TB
+internalname Times-Bold
+spacewidth 250
+encoding text.enc
+ligatures fi fl 0
+kernpairs
+A y -74
+A w -90
+A v -100
+A u -50
+A ' -74
+A cq -74
+A p -25
+A Y -100
+A W -130
+A V -145
+A U -50
+A T -95
+A Q -45
+A O -45
+A G -55
+A C -55
+B U -10
+B A -30
+D . -20
+D Y -40
+D W -40
+D V -40
+D A -35
+F . -110
+F o -25
+F e -25
+F , -92
+F a -25
+F A -90
+J u -15
+J . -20
+J o -15
+J e -15
+J a -15
+J A -30
+K y -45
+K u -15
+K o -25
+K e -25
+K O -30
+L y -55
+L ' -110
+L cq -110
+L rq -20
+L Y -92
+L W -92
+L V -92
+L T -92
+N A -20
+O Y -50
+O X -40
+O W -50
+O V -50
+O T -40
+O A -40
+P . -110
+P o -20
+P e -20
+P , -92
+P a -10
+P A -74
+Q . -20
+Q U -10
+R Y -35
+R W -35
+R V -55
+R U -30
+R T -40
+R O -30
+T y -74
+T w -74
+T u -92
+T ; -74
+T r -74
+T . -90
+T o -92
+T i -18
+T - -92
+T hy -92
+T e -92
+T , -74
+T : -74
+T a -92
+T O -18
+T A -90
+U . -50
+U , -50
+U A -60
+V u -92
+V ; -92
+V . -145
+V o -100
+V i -37
+V - -74
+V hy -74
+V e -100
+V , -129
+V : -92
+V a -92
+V O -45
+V G -30
+V A -135
+W y -60
+W u -50
+W ; -55
+W . -92
+W o -75
+W i -18
+W - -37
+W hy -37
+W e -65
+W , -92
+W : -55
+W a -65
+W O -10
+W A -120
+Y u -92
+Y ; -92
+Y . -92
+Y o -111
+Y i -37
+Y - -92
+Y hy -92
+Y e -111
+Y , -92
+Y : -92
+Y a -85
+Y O -35
+Y A -110
+a v -25
+b v -15
+b u -20
+b . -40
+b b -10
+, ' -55
+, cq -55
+, rq -45
+d w -15
+e v -15
+f ' 55
+f cq 55
+f rq 50
+f . -15
+f o -25
+f i -25
+f .i -35
+f , -15
+g . -15
+h y -15
+i v -10
+k y -15
+k o -15
+k e -10
+n v -40
+o w -10
+o v -10
+. ' -55
+. cq -55
+. rq -55
+lq A -10
+` ` -63
+` oq -63
+oq ` -63
+oq oq -63
+` A -10
+oq A -10
+' v -20
+cq v -20
+' u0020 -74
+cq u0020 -74
+' s -37
+cq s -37
+' r -20
+cq r -20
+' ' -63
+' cq -63
+cq ' -63
+cq cq -63
+' d -20
+cq d -20
+r v -10
+r q -18
+r . -100
+r p -10
+r o -18
+r n -15
+r - -37
+r hy -37
+r g -10
+r e -18
+r , -92
+r c -18
+u0020 Y -55
+u0020 W -30
+u0020 V -45
+u0020 T -30
+u0020 A -55
+v . -70
+v o -10
+v e -10
+v , -55
+v a -10
+w . -70
+w o -10
+w , -55
+y . -70
+y o -25
+y e -10
+y , -55
+charset
+ha 581,676 2 0 asciicircum
+ti 520,333 0 1 asciitilde
+vS 556,914,19 2 2 Scaron
+vZ 667,914 2 3 Zcaron
+vs 389,704,14 2 4 scaron
+vz 444,704 2 5 zcaron
+:Y 722,877 2 6 Ydieresis
+tm 1000,676 2 7 trademark
+aq 278,691 2 8 quotesingle
+space 250 0 32 space
+! 333,691,13 2 33 exclam
+" 555,691 2 34 quotedbl
+dq "
+# 500,700 2 35 numbersign
+sh "
+$ 500,750,99 2 36 dollar
+Do "
+% 1000,692,14 2 37 percent
+& 833,691,16 2 38 ampersand
+' 333,691 2 39 quoteright
+cq "
+( 333,694,168 2 40 parenleft
+) 333,694,168 2 41 parenright
+* 500,691 2 42 asterisk
++ 570,506 0 43 plus
+, 250,155,180 0 44 comma
+- 333,287 0 45 hyphen
+hy "
+. 250,156,13 0 46 period
+/ 278,691,19,24,24 2 47 slash
+sl "
+0 500,688,13 2 48 zero
+1 500,688 2 49 one
+2 500,688 2 50 two
+3 500,688,14 2 51 three
+4 500,688 2 52 four
+5 500,676,8 2 53 five
+6 500,688,13 2 54 six
+7 500,676 2 55 seven
+8 500,688,13 2 56 eight
+9 500,688,13 2 57 nine
+: 333,472,13 0 58 colon
+; 333,472,180 0 59 semicolon
+< 570,514,8 0 60 less
+= 570,399 0 61 equal
+> 570,514,8 0 62 greater
+? 500,689,13 2 63 question
+@ 930,691,19 2 64 at
+at "
+A 722,690 2 65 A
+B 667,676 2 66 B
+C 722,691,19 2 67 C
+D 722,676 2 68 D
+E 667,676 2 69 E
+F 611,676 2 70 F
+G 778,691,19 2 71 G
+H 778,676 2 72 H
+I 389,676 2 73 I
+J 500,676,96 2 74 J
+K 778,676 2 75 K
+L 667,676 2 76 L
+M 944,676 2 77 M
+N 722,676,18 2 78 N
+O 778,691,19 2 79 O
+P 611,676 2 80 P
+Q 778,691,176 2 81 Q
+R 722,676 2 82 R
+S 556,692,19 2 83 S
+T 667,676 2 84 T
+U 722,676,19 2 85 U
+V 722,676,18 2 86 V
+W 1000,676,15 2 87 W
+X 722,676 2 88 X
+Y 722,676 2 89 Y
+Z 667,676 2 90 Z
+[ 333,678,149 2 91 bracketleft
+lB "
+\ 278,691,19,25,25 2 92 backslash
+rs "
+] 333,678,149 2 93 bracketright
+rB "
+a^ 333,704,0,2,2 2 94 circumflex
+^ "
+_ 500,0,125 0 95 underscore
+` 333,691 2 96 quoteleft
+oq "
+a 500,473,14 0 97 a
+b 556,676,14 2 98 b
+c 444,473,14 0 99 c
+d 556,676,14 2 100 d
+e 444,473,14 0 101 e
+f 333,691,0,56 2 102 f
+g 500,473,206 1 103 g
+h 556,676 2 104 h
+i 278,691 2 105 i
+j 333,691,203,0,57 3 106 j
+k 556,676 2 107 k
+l 278,676 2 108 l
+m 833,473 0 109 m
+n 556,473 0 110 n
+o 500,473,14 0 111 o
+p 556,473,205 1 112 p
+q 556,473,205 1 113 q
+r 444,473 0 114 r
+s 389,473,14 0 115 s
+t 333,630,12 2 116 t
+u 556,461,14 0 117 u
+v 500,461,14 0 118 v
+w 722,461,14 0 119 w
+x 500,461 0 120 x
+y 500,461,205 1 121 y
+z 444,461 0 122 z
+lC 394,698,175 2 123 braceleft
+{ "
+ba 220,691,19 2 124 bar
+| "
+rC 394,698,175 2 125 braceright
+} "
+a~ 333,674,0,16,16 2 126 tilde
+~ "
+bq 333,155,180 0 128 quotesinglbase
+Fo 500,415 0 129 guillemotleft
+Fc 500,415 0 130 guillemotright
+bu 350,478 0 131 bullet
+Fn 500,706,155 2 132 florin
+f/ 167,688,12,162,168 2 133 fraction
+%0 1000,706,29 2 134 perthousand
+dg 500,691,134 2 135 dagger
+dd 500,691,132 2 136 daggerdbl
+en 500,271 0 137 endash
+em 1000,271 0 138 emdash
+fi 556,691 2 140 fi
+fl 556,691 2 141 fl
+.i 278,461 0 144 dotlessi
+ga 333,713 2 146 grave
+a" 333,713,0,92,13 2 147 hungarumlaut
+a. 333,667 2 148 dotaccent
+ab 333,691 2 149 breve
+ah 333,704,0,2,2 2 150 caron
+ao 333,740 2 151 ring
+ho 333,44,173 0 152 ogonek
+lq 500,691 2 153 quotedblleft
+rq 500,691 2 154 quotedblright
+oe 722,473,14 0 155 oe
+/l 278,676,0,25,22 2 156 lslash
+Bq 500,155,180 0 157 quotedblbase
+OE 1000,684,5 2 158 OE
+/L 667,676 2 159 Lslash
+r! 333,501,203 1 161 exclamdown
+ct 500,588,140 0 162 cent
+Po 500,684,14 2 163 sterling
+Cs 500,613,0,26,26 0 164 currency
+Ye 500,676,0,47,64 2 165 yen
+bb 220,691,19 2 166 brokenbar
+sc 500,691,132 2 167 section
+ad 333,667,0,2,2 2 168 dieresis
+co 747,691,19 2 169 copyright
+Of 300,688,0,1,1 2 170 ordfeminine
+fo 333,415 0 171 guilsinglleft
+tno 570,399 0 172 logicalnot
+\- 570,297 0 173 minus
+rg 747,691,19 2 174 registered
+a- 333,637 2 175 macron
+de 400,688 2 176 degree
+t+- 570,506 0 177 plusminus
+S2 300,688 2 178 twosuperior
+S3 300,688 2 179 threesuperior
+aa 333,713 2 180 acute
+mc 556,461,206 1 181 mu
+ps 540,676,186 2 182 paragraph
+pc 250,417 0 183 periodcentered
+ac 333,0,218 1 184 cedilla
+S1 300,688 2 185 onesuperior
+Om 330,688 2 186 ordmasculine
+fc 333,415 0 187 guilsinglright
+14 750,688,12 2 188 onequarter
+12 750,688,12,25,7 2 189 onehalf
+34 750,688,12 2 190 threequarters
+r? 500,501,201 0 191 questiondown
+`A 722,923 2 192 Agrave
+'A 722,923 2 193 Aacute
+^A 722,914 2 194 Acircumflex
+~A 722,884 2 195 Atilde
+:A 722,877 2 196 Adieresis
+oA 722,935 2 197 Aring
+AE 1000,676 2 198 AE
+,C 722,691,218 3 199 Ccedilla
+`E 667,923 2 200 Egrave
+'E 667,923 2 201 Eacute
+^E 667,914 2 202 Ecircumflex
+:E 667,877 2 203 Edieresis
+`I 389,923 2 204 Igrave
+'I 389,923 2 205 Iacute
+^I 389,914 2 206 Icircumflex
+:I 389,877 2 207 Idieresis
+-D 722,676 2 208 Eth
+~N 722,884,18 2 209 Ntilde
+`O 778,923,19 2 210 Ograve
+'O 778,923,19 2 211 Oacute
+^O 778,914,19 2 212 Ocircumflex
+~O 778,884,19 2 213 Otilde
+:O 778,877,19 2 214 Odieresis
+tmu 570,490 0 215 multiply
+/O 778,737,74 2 216 Oslash
+`U 722,923,19 2 217 Ugrave
+'U 722,923,19 2 218 Uacute
+^U 722,914,19 2 219 Ucircumflex
+:U 722,877,19 2 220 Udieresis
+'Y 722,928 2 221 Yacute
+TP 611,676 2 222 Thorn
+ss 556,691,12 2 223 germandbls
+`a 500,713,14 2 224 agrave
+'a 500,713,14 2 225 aacute
+^a 500,704,14 2 226 acircumflex
+~a 500,674,14 2 227 atilde
+:a 500,667,14 2 228 adieresis
+oa 500,740,14 2 229 aring
+ae 722,473,14 0 230 ae
+,c 444,473,218 1 231 ccedilla
+`e 444,713,14 2 232 egrave
+'e 444,713,14 2 233 eacute
+^e 444,704,14 2 234 ecircumflex
+:e 444,667,14 2 235 edieresis
+`i 278,713,0,0,26 2 236 igrave
+'i 278,713,0,12 2 237 iacute
+^i 278,704,0,23,36 2 238 icircumflex
+:i 278,667,0,23,36 2 239 idieresis
+Sd 500,691,14 2 240 eth
+~n 556,674 2 241 ntilde
+`o 500,713,14 2 242 ograve
+'o 500,713,14 2 243 oacute
+^o 500,704,14 2 244 ocircumflex
+~o 500,674,14 2 245 otilde
+:o 500,667,14 2 246 odieresis
+tdi 570,537,31 0 247 divide
+/o 500,549,92 0 248 oslash
+`u 556,713,14 2 249 ugrave
+'u 556,713,14 2 250 uacute
+^u 556,704,14 2 251 ucircumflex
+:u 556,667,14 2 252 udieresis
+'y 500,713,205 3 253 yacute
+Tp 556,676,205 3 254 thorn
+:y 500,667,205 3 255 ydieresis
+u2026 1000,156,13 0 256 ellipsis
diff --git a/font/devps/old/TBI b/font/devps/old/TBI
new file mode 100644
index 0000000..abda491
--- /dev/null
+++ b/font/devps/old/TBI
@@ -0,0 +1,443 @@
+name TBI
+internalname Times-BoldItalic
+slant 15
+spacewidth 250
+encoding text.enc
+ligatures fi fl 0
+kernpairs
+A y -74
+A w -74
+A v -74
+A u -30
+A ' -74
+A cq -74
+A Y -70
+A W -100
+A V -95
+A U -50
+A T -55
+A Q -55
+A O -50
+A G -60
+A C -65
+B U -10
+B A -25
+D Y -50
+D W -40
+D V -50
+D A -25
+F r -50
+F . -129
+F o -70
+F i -40
+F e -100
+F , -129
+F a -95
+F A -100
+J u -40
+J . -10
+J o -40
+J e -40
+J , -10
+J a -40
+J A -25
+K y -20
+K u -20
+K o -25
+K e -25
+K O -30
+L y -37
+L ' -55
+L cq -55
+L Y -37
+L W -37
+L V -37
+L T -18
+N A -30
+O Y -50
+O X -40
+O W -50
+O V -50
+O T -40
+O A -40
+P . -129
+P o -55
+P e -50
+P , -129
+P a -40
+P A -85
+Q U -10
+R Y -18
+R W -18
+R V -18
+R U -40
+R T -30
+R O -40
+T y -37
+T w -37
+T u -37
+T ; -74
+T r -37
+T . -92
+T o -95
+T i -37
+T - -92
+T hy -92
+T e -92
+T , -92
+T : -74
+T a -92
+T O -18
+T A -55
+U A -45
+V u -55
+V ; -74
+V . -129
+V o -111
+V i -55
+V - -70
+V hy -70
+V e -111
+V , -129
+V : -74
+V a -111
+V O -30
+V G -10
+V A -85
+W y -55
+W u -55
+W ; -55
+W . -74
+W o -80
+W i -37
+W - -50
+W hy -50
+W e -90
+W , -74
+W : -55
+W a -85
+W O -15
+W A -74
+Y u -92
+Y ; -92
+Y . -74
+Y o -111
+Y i -55
+Y - -92
+Y hy -92
+Y e -111
+Y , -92
+Y : -92
+Y a -92
+Y O -25
+Y A -74
+b u -20
+b . -40
+b b -10
+c k -10
+c h -10
+, ' -95
+, cq -95
+, rq -95
+e b -10
+f ' 55
+f cq 55
+f . -10
+f o -10
+f f -18
+f e -10
+f .i -30
+f , -10
+k o -10
+k e -30
+n v -40
+o y -10
+o x -10
+o w -25
+o v -15
+. ' -95
+. cq -95
+. rq -95
+` ` -74
+` oq -74
+oq ` -74
+oq oq -74
+' v -15
+cq v -15
+' t -37
+cq t -37
+' u0020 -74
+cq u0020 -74
+' s -74
+cq s -74
+' r -15
+cq r -15
+' ' -74
+' cq -74
+cq ' -74
+cq cq -74
+' d -15
+cq d -15
+r . -65
+r , -65
+u0020 Y -70
+u0020 W -70
+u0020 V -70
+u0020 A -37
+v . -37
+v o -15
+v e -15
+v , -37
+w . -37
+w o -15
+w e -10
+w , -37
+w a -10
+x e -10
+y . -37
+y , -37
+charset
+ha 570,669,0,0,-17 2 0 asciicircum
+ti 570,333,0,0,-4 0 1 asciitilde
+vS 556,897,18,20,48,20 2 2 Scaron
+vZ 611,897,0,29,61,29 2 3 Zcaron
+vs 389,690,13,100,69,99 2 4 scaron
+vz 389,690,78,85,93,85 2 5 zcaron
+:Y 611,862,0,98,-23,98 2 6 Ydieresis
+tm 1000,669,0,18,18,18 2 7 trademark
+aq 278,685,0,40,-78,40 2 8 quotesingle
+space 250 0 32 space
+! 389,684,13,31,-17,31 2 33 exclam
+" 555,685,0,31,-86,31 2 34 quotedbl
+dq "
+# 500,700,0,83,83,83 2 35 numbersign
+sh "
+$ 500,733,100,47,70,47 2 36 dollar
+Do "
+% 833,692,10,10,11,10 2 37 percent
+& 778,682,19,0,45 2 38 ampersand
+' 333,685,0,19,-48,19 2 39 quoteright
+cq "
+( 333,685,179,61,22,61 2 40 parenleft
+) 333,685,179,0,94 2 41 parenright
+* 500,685,0,6,-15,6 2 42 asterisk
++ 570,506,0,17,17,17 0 43 plus
+, 250,134,182,0,110 0 44 comma
+- 333,282,0,0,48 0 45 hyphen
+hy "
+. 250,135,13,0,59 0 46 period
+/ 278,685,18,114,114,99 2 47 slash
+sl "
+0 500,683,14,27,33,27 2 48 zero
+1 500,683,0,0,45 2 49 one
+2 500,683,0,0,77 2 50 two
+3 500,683,13,0,65 2 51 three
+4 500,683,0,53,65,53 2 52 four
+5 500,669,13,37,61,37 2 53 five
+6 500,679,15,59,27,59 2 54 six
+7 500,669,0,75,-2,75 2 55 seven
+8 500,683,13,26,47,26 2 56 eight
+9 500,683,10,25,62,25 2 57 nine
+: 333,459,13,0,27 0 58 colon
+; 333,459,183,0,75 0 59 semicolon
+< 570,514,8,19,19,19 0 60 less
+= 570,399,0,17,17,17 0 61 equal
+> 570,514,8,19,19,19 0 62 greater
+? 500,684,13,20,-29,20 2 63 question
+@ 832,685,18,0,-13 2 64 at
+at "
+A 667,683,0,0,117 2 65 A
+B 667,669,0,7,74,7 2 66 B
+C 667,685,18,60,18,60 2 67 C
+D 722,669,0,13,96,13 2 68 D
+E 667,669,0,36,77,36 2 69 E
+F 667,669,0,43,63,43 2 70 F
+G 722,685,18,34,29,34 2 71 G
+H 778,669,0,71,74,71 2 72 H
+I 389,669,0,67,82,67 2 73 I
+J 500,669,99,74,96,74 2 74 J
+K 667,669,0,85,71,85 2 75 K
+L 611,669,0,29,72,29 2 76 L
+M 889,669,12,78,79,78 2 77 M
+N 722,669,15,76,77,76 2 78 N
+O 722,685,18,19,23,19 2 79 O
+P 611,669,0,52,77,52 2 80 P
+Q 722,685,208,19,23,19 3 81 Q
+R 667,669,0,6,79,6 2 82 R
+S 556,685,18,20,48,20 2 83 S
+T 611,669,0,89,0,89 2 84 T
+U 722,669,18,72,-17,72 2 85 U
+V 667,669,18,98,-15,98 2 86 V
+W 889,669,18,101,-15,99 2 87 W
+X 667,669,0,77,74,77 2 88 X
+Y 611,669,0,98,-23,98 2 89 Y
+Z 611,669,0,29,61,29 2 90 Z
+[ 333,674,159,79,87,79 2 91 bracketleft
+lB "
+\ 278,685,18,51,51,51 2 92 backslash
+rs "
+] 333,674,157,60,106,60 2 93 bracketright
+rB "
+a^ 333,690,0,84,10,84 2 94 circumflex
+^ "
+_ 500,0,125,50,50,50 0 95 underscore
+` 333,685,0,49,-78,49 2 96 quoteleft
+oq "
+a 500,462,14,5,71,5 0 97 a
+b 500,699,13,0,64 2 98 b
+c 444,462,13,0,55 0 99 c
+d 500,699,13,67,71,67 2 100 d
+e 444,462,13,4,45,4 0 101 e
+f 333,698,205,163,219,99 3 102 f
+g 500,462,203,28,102,28 1 103 g
+h 556,699,9,0,63 2 104 h
+i 278,684,9,35,48,35 2 105 i
+j 278,684,207,51,239,51 3 106 j
+k 500,699,8,33,73,33 2 107 k
+l 278,699,9,62,48,62 2 108 l
+m 778,462,9,0,64 0 109 m
+n 556,462,9,0,56 0 110 n
+o 500,462,13,0,53 0 111 o
+p 500,462,205,0,170 1 112 p
+q 500,462,205,21,49,21 1 113 q
+r 389,462,0,50,71,50 0 114 r
+s 389,462,13,0,69 0 115 s
+t 278,594,9,53,61,53 2 116 t
+u 556,462,9,0,35 0 117 u
+v 444,462,13,7,34,7 0 118 v
+w 667,462,13,0,34 0 119 w
+x 500,462,13,19,96,19 0 120 x
+y 444,462,205,0,144 1 121 y
+z 389,449,78,29,93,29 0 122 z
+lC 348,686,187,138,45,99 2 123 braceleft
+{ "
+ba 220,685,18,0,-16 2 124 bar
+| "
+rC 348,686,187,4,179,4 2 125 braceright
+} "
+a~ 333,655,0,124,2,99 2 126 tilde
+~ "
+bq 333,134,182,0,55 0 128 quotesinglbase
+Fo 500,415,0,18,38,18 0 129 guillemotleft
+Fc 500,415,0,18,38,18 0 130 guillemotright
+bu 350,525,0,50,50,50 0 131 bullet
+Fn 500,707,156,87,137,87 2 132 florin
+f/ 167,683,14,207,219,99 2 133 fraction
+%0 1000,706,29,46,43,46 2 134 perthousand
+dg 500,685,145,44,-41,44 2 135 dagger
+dd 500,685,139,43,40,43 2 136 daggerdbl
+en 500,269,0,27,90,27 0 137 endash
+em 1000,269,0,27,90,27 0 138 emdash
+fi 556,703,205,8,238,8 3 140 fi
+fl 556,704,205,47,236,47 3 141 fl
+.i 278,462,9,10,48,10 0 144 dotlessi
+ga 333,697,0,14,-35,14 2 146 grave
+a" 333,697,0,215,-19,99 2 147 hungarumlaut
+a. 333,655,0,10,-113,10 2 148 dotaccent
+ab 333,678,0,104,-21,99 2 149 breve
+ah 333,690,0,128,-29,99 2 150 caron
+ao 333,729,0,57,-77,57 2 151 ring
+ho 333,44,173,0,90 0 152 ogonek
+lq 500,685,0,63,-3,63 2 153 quotedblleft
+rq 500,685,0,63,-3,63 2 154 quotedblright
+oe 722,462,13,2,44,2 0 155 oe
+/l 278,699,9,73,63,73 2 156 lslash
+Bq 500,134,182,0,107 0 157 quotedblbase
+OE 944,677,8,52,27,52 2 158 OE
+/L 611,669,0,29,72,29 2 159 Lslash
+r! 389,492,205,0,31 1 161 exclamdown
+ct 500,576,143,0,8 0 162 cent
+Po 500,683,12,60,82,60 2 163 sterling
+Cs 500,586,0,76,76,76 0 164 currency
+Ye 500,669,0,178,17,99 2 165 yen
+bb 220,685,18,0,-16 2 166 brokenbar
+sc 500,685,143,9,14,9 2 167 section
+ad 333,655,0,114,-5,99 2 168 dieresis
+co 747,685,18,21,20,21 2 169 copyright
+Of 266,685,0,114,34,99 2 170 ordfeminine
+fo 333,415,0,20,18,20 0 171 guilsinglleft
+tno 606,399,0,0,-1 0 172 logicalnot
+\- 606,297,0,0,-1 0 173 minus
+rg 747,685,18,21,20,21 2 174 registered
+a- 333,623,0,110,-1,99 2 175 macron
+de 400,683,0,19,-33,19 2 176 degree
+t+- 570,506,0,17,17,17 0 177 plusminus
+S2 300,683,0,63,48,63 2 178 twosuperior
+S3 300,683,0,71,33,71 2 179 threesuperior
+aa 333,697,0,96,-89,96 2 180 acute
+mc 576,449,207,0,110 1 181 mu
+ps 500,669,193,112,107,99 2 182 paragraph
+pc 250,405,0,0,-1 0 183 periodcentered
+ac 333,5,218,0,130 1 184 cedilla
+S1 300,683,0,51,20,51 2 185 onesuperior
+Om 300,685,0,97,-6,97 2 186 ordmasculine
+fc 333,415,0,0,40 0 187 guilsinglright
+14 750,683,14,21,43,21 2 188 onequarter
+12 750,683,14,23,59,23 2 189 onehalf
+34 750,683,14,26,43,26 2 190 threequarters
+r? 500,492,205,0,20 1 191 questiondown
+`A 667,904,0,0,117 2 192 Agrave
+'A 667,904,0,0,117 2 193 Aacute
+^A 667,897,0,0,117 2 194 Acircumflex
+~A 667,862,0,0,117 2 195 Atilde
+:A 667,862,0,0,117 2 196 Adieresis
+oA 667,921,0,0,117 2 197 Aring
+AE 944,669,0,24,114,24 2 198 AE
+,C 667,685,218,60,18,60 3 199 Ccedilla
+`E 667,904,0,36,77,36 2 200 Egrave
+'E 667,904,0,36,77,36 2 201 Eacute
+^E 667,897,0,36,77,36 2 202 Ecircumflex
+:E 667,862,0,36,77,36 2 203 Edieresis
+`I 389,904,0,67,82,67 2 204 Igrave
+'I 389,904,0,73,82,73 2 205 Iacute
+^I 389,897,0,81,82,81 2 206 Icircumflex
+:I 389,862,0,106,82,99 2 207 Idieresis
+-D 722,669,0,28,81,28 2 208 Eth
+~N 722,862,15,76,77,76 2 209 Ntilde
+`O 722,904,18,19,23,19 2 210 Ograve
+'O 722,904,18,19,23,19 2 211 Oacute
+^O 722,897,18,19,23,19 2 212 Ocircumflex
+~O 722,862,18,19,23,19 2 213 Otilde
+:O 722,862,18,19,23,19 2 214 Odieresis
+tmu 570,490,0,2,2,2 0 215 multiply
+/O 722,764,125,19,23,19 2 216 Oslash
+`U 722,904,18,72,-17,72 2 217 Ugrave
+'U 722,904,18,72,-17,72 2 218 Uacute
+^U 722,897,18,72,-17,72 2 219 Ucircumflex
+:U 722,862,18,72,-17,72 2 220 Udieresis
+'Y 611,904,0,98,-23,98 2 221 Yacute
+TP 611,669,0,12,77,12 2 222 Thorn
+ss 500,705,200,23,250,23 2 223 germandbls
+`a 500,697,14,5,71,5 2 224 agrave
+'a 500,697,14,13,71,13 2 225 aacute
+^a 500,690,14,5,71,5 2 226 acircumflex
+~a 500,655,14,41,71,41 2 227 atilde
+:a 500,655,14,21,71,21 2 228 adieresis
+oa 500,729,14,5,71,5 2 229 aring
+ae 722,462,13,1,55,1 0 230 ae
+,c 444,462,218,0,74 1 231 ccedilla
+`e 444,697,13,4,45,4 2 232 egrave
+'e 444,697,13,41,45,41 2 233 eacute
+^e 444,690,13,29,45,29 2 234 ecircumflex
+:e 444,655,13,49,45,49 2 235 edieresis
+`i 278,697,9,32,48,32 2 236 igrave
+'i 278,697,9,124,48,99 2 237 iacute
+^i 278,690,9,97,52,97 2 238 icircumflex
+:i 278,655,9,132,48,99 2 239 idieresis
+Sd 500,699,13,4,53,4 2 240 eth
+~n 556,655,9,0,56 2 241 ntilde
+`o 500,697,13,0,53 2 242 ograve
+'o 500,697,13,13,53,13 2 243 oacute
+^o 500,690,13,1,53,1 2 244 ocircumflex
+~o 500,655,13,41,53,41 2 245 otilde
+:o 500,655,13,16,53,16 2 246 odieresis
+tdi 570,535,29,17,17,17 0 247 divide
+/o 500,560,119,0,53 0 248 oslash
+`u 556,697,9,0,35 2 249 ugrave
+'u 556,697,9,0,35 2 250 uacute
+^u 556,690,9,0,35 2 251 ucircumflex
+:u 556,655,9,0,35 2 252 udieresis
+'y 444,697,205,41,144,41 3 253 yacute
+Tp 500,699,205,0,170 3 254 thorn
+:y 444,655,205,44,144,44 3 255 ydieresis
+u2026 1000,135,13,0,10 0 256 ellipsis
diff --git a/font/devps/old/TI b/font/devps/old/TI
new file mode 100644
index 0000000..c5dc3af
--- /dev/null
+++ b/font/devps/old/TI
@@ -0,0 +1,456 @@
+name TI
+internalname Times-Italic
+slant 7
+spacewidth 250
+encoding text.enc
+ligatures fi fl 0
+kernpairs
+A y -55
+A w -55
+A v -55
+A u -20
+A ' -37
+A cq -37
+A Y -55
+A W -95
+A V -105
+A U -50
+A T -37
+A Q -40
+A O -40
+A G -35
+A C -30
+B U -10
+B A -25
+D Y -40
+D W -40
+D V -40
+D A -35
+F r -55
+F . -135
+F o -105
+F i -45
+F e -75
+F , -135
+F a -75
+F A -115
+J u -35
+J . -25
+J o -25
+J e -25
+J , -25
+J a -35
+J A -40
+K y -40
+K u -40
+K o -40
+K e -35
+K O -50
+L y -30
+L ' -37
+L cq -37
+L Y -20
+L W -55
+L V -55
+L T -20
+N A -27
+O Y -50
+O X -40
+O W -50
+O V -50
+O T -40
+O A -55
+P . -135
+P o -80
+P e -80
+P , -135
+P a -80
+P A -90
+Q U -10
+R Y -18
+R W -18
+R V -18
+R U -40
+R O -40
+T y -74
+T w -74
+T u -55
+T ; -65
+T r -55
+T . -74
+T o -92
+T i -55
+T - -74
+T hy -74
+T e -92
+T , -74
+T : -55
+T a -92
+T O -18
+T A -50
+U . -25
+U , -25
+U A -40
+V u -74
+V ; -74
+V . -129
+V o -111
+V i -74
+V - -55
+V hy -55
+V e -111
+V , -129
+V : -65
+V a -111
+V O -30
+V A -60
+W y -70
+W u -55
+W ; -65
+W . -92
+W o -92
+W i -55
+W - -37
+W hy -37
+W e -92
+W , -92
+W : -65
+W a -92
+W O -25
+W A -60
+Y u -92
+Y ; -65
+Y . -92
+Y o -92
+Y i -74
+Y - -74
+Y hy -74
+Y e -92
+Y , -92
+Y : -65
+Y a -92
+Y O -15
+Y A -50
+a g -10
+b u -20
+b . -40
+c k -20
+c h -15
+, ' -140
+, cq -140
+, rq -140
+e y -30
+e x -20
+e w -15
+e v -15
+e . -15
+e g -40
+e , -10
+f ' 92
+f cq 92
+f . -15
+f i -20
+f f -18
+f .i -60
+f , -10
+g . -15
+g g -10
+g e -10
+g , -10
+k y -10
+k o -10
+k e -10
+n v -40
+o v -10
+o g -10
+. ' -140
+. cq -140
+. rq -140
+` ` -111
+` oq -111
+oq ` -111
+oq oq -111
+' v -10
+cq v -10
+' t -30
+cq t -30
+' u0020 -111
+cq u0020 -111
+' s -40
+cq s -40
+' r -25
+cq r -25
+' ' -111
+' cq -111
+cq ' -111
+cq cq -111
+' d -25
+cq d -25
+r s -10
+r q -37
+r . -111
+r o -45
+r - -20
+r hy -20
+r g -37
+r e -37
+r d -37
+r , -111
+r c -37
+r a -15
+u0020 Y -75
+u0020 W -40
+u0020 V -35
+u0020 T -18
+u0020 A -18
+v . -74
+v , -74
+w . -74
+w , -74
+y . -55
+y , -55
+charset
+ha 422,666,0,50,50,43 2 0 asciicircum
+ti 541,323,0,11,10,11 0 1 asciitilde
+vS 500,873,18,70,33,43 2 2 Scaron
+vZ 556,873,0,100,56,43 2 3 Zcaron
+vs 389,661,13,115,34,43 2 4 scaron
+vz 389,661,81,95,52,43 2 5 zcaron
+:Y 556,818,0,127,-28,43 2 6 Ydieresis
+tm 980,653,0,27,20,27 2 7 trademark
+aq 214,666,0,77,-82,43 2 8 quotesingle
+space 250 0 32 space
+! 333,667,11,19,11,19 2 33 exclam
+" 420,666,0,62,-94,43 2 34 quotedbl
+dq "
+# 500,676,0,90,48,43 2 35 numbersign
+sh "
+$ 500,731,89,47,19,43 2 36 dollar
+Do "
+% 833,676,13,7,-29,7 2 37 percent
+& 778,666,18,0,-26 2 38 ampersand
+' 333,666,0,7,-101,7 2 39 quoteright
+cq "
+( 333,669,181,32,8,32 2 40 parenleft
+) 333,669,180,6,34,6 2 41 parenright
+* 500,666,0,42,-78,42 2 42 asterisk
++ 675,506,0,0,-36 0 43 plus
+, 250,101,129,0,54 0 44 comma
+- 333,255,0,0,1 0 45 hyphen
+hy "
+. 250,100,11,0,23 0 46 period
+/ 278,666,18,158,115,43 2 47 slash
+sl "
+0 500,676,7,47,18,43 2 48 zero
+1 500,676,0,0,1 2 49 one
+2 500,676,0,2,38,2 2 50 two
+3 500,676,7,15,35,15 2 51 three
+4 500,676,0,29,49,29 2 52 four
+5 500,666,7,41,35,41 2 53 five
+6 500,686,7,71,20,43 2 54 six
+7 500,666,8,87,-25,43 2 55 seven
+8 500,676,7,43,20,43 2 56 eight
+9 500,676,17,42,27,42 2 57 nine
+: 333,441,11 0 58 colon
+; 333,441,129,0,23 0 59 semicolon
+< 675,514,8,0,-34 0 60 less
+= 675,386,0,0,-36 0 61 equal
+> 675,514,8,0,-34 0 62 greater
+? 500,664,12,22,-82,22 2 63 question
+@ 920,666,18,0,-68 2 64 at
+at "
+A 611,668,0,3,101,3 2 65 A
+B 611,653,0,27,58,27 2 66 B
+C 667,666,18,72,-16,43 2 67 C
+D 722,653,0,28,58,28 2 68 D
+E 611,653,0,73,51,43 2 69 E
+F 611,653,0,84,42,43 2 70 F
+G 722,666,18,50,-2,43 2 71 G
+H 722,653,0,95,58,43 2 72 H
+I 333,653,0,101,58,43 2 73 I
+J 444,653,18,97,56,43 2 74 J
+K 667,653,0,105,43,43 2 75 K
+L 556,653,0,53,58,43 2 76 L
+M 833,653,0,90,68,43 2 77 M
+N 667,653,15,110,70,43 2 78 N
+O 722,666,18,27,-10,27 2 79 O
+P 611,653,0,44,50,43 2 80 P
+Q 722,666,182,27,-9,27 2 81 Q
+R 611,653,0,27,63,27 2 82 R
+S 500,667,18,58,33,43 2 83 S
+T 556,653,0,127,-9,43 2 84 T
+U 722,653,18,93,-52,43 2 85 U
+V 611,653,18,127,-26,43 2 86 V
+W 833,653,18,123,-21,43 2 87 W
+X 611,653,0,94,79,43 2 88 X
+Y 556,653,0,127,-28,43 2 89 Y
+Z 556,653,0,100,56,43 2 90 Z
+[ 389,663,153,52,29,43 2 91 bracketleft
+lB "
+\ 278,666,18,91,91,43 2 92 backslash
+rs "
+] 389,663,153,43,38,43 2 93 bracketright
+rB "
+a^ 333,661,0,102,-41,43 2 94 circumflex
+^ "
+_ 500,0,125,50,50,43 0 95 underscore
+` 333,666,0,27,-121,27 2 96 quoteleft
+oq "
+a 500,441,11,26,33,26 0 97 a
+b 500,683,11,23,27,23 2 98 b
+c 444,441,11,31,20,31 0 99 c
+d 500,683,13,77,35,43 2 100 d
+e 444,441,11,18,19,18 0 101 e
+f 278,678,207,196,197,43 3 102 f
+g 500,441,206,22,42,22 1 103 g
+h 500,683,9,28,31,28 2 104 h
+i 278,654,11,36,1,36 2 105 i
+j 278,654,207,48,174,43 3 106 j
+k 444,683,11,67,36,43 2 107 k
+l 278,683,11,51,9,43 2 108 l
+m 722,441,9,32,38,32 0 109 m
+n 500,441,9,24,36,24 0 110 n
+o 500,441,11,18,23,18 0 111 o
+p 500,441,205,19,125,19 1 112 p
+q 500,441,209,33,25,33 1 113 q
+r 389,441,0,73,5,43 0 114 r
+s 389,442,13,27,34,27 0 115 s
+t 278,546,11,68,13,43 2 116 t
+u 500,441,11,25,8,25 0 117 u
+v 444,441,18,32,29,32 0 118 v
+w 667,441,18,31,34,31 0 119 w
+x 444,441,11,53,77,43 0 120 x
+y 444,441,206,32,74,32 1 121 y
+z 389,428,81,41,52,41 0 122 z
+lC 400,687,177,57,-1,43 2 123 braceleft
+{ "
+ba 275,666,18,0,-55 2 124 bar
+| "
+rC 400,687,177,0,57 2 125 braceright
+} "
+a~ 333,624,0,144,-50,43 2 126 tilde
+~ "
+bq 333,101,129,0,6 0 128 quotesinglbase
+Fo 500,403,0,0,-3 0 129 guillemotleft
+Fc 500,403,0,0,-5 0 130 guillemotright
+bu 350,461,0,10,10,10 0 131 bullet
+Fn 500,682,182,57,25,43 2 132 florin
+f/ 167,676,10,220,219,43 2 133 fraction
+%0 1000,706,19,60,25,43 2 134 perthousand
+dg 500,666,159,38,-51,38 2 135 dagger
+dd 500,666,143,41,28,41 2 136 daggerdbl
+en 500,243,0,55,56,43 0 137 endash
+em 889,243,0,55,56,43 0 138 emdash
+fi 500,681,207,31,191,31 3 140 fi
+fl 500,682,204,68,191,43 3 141 fl
+.i 278,441,11,7,1,7 0 144 dotlessi
+ga 333,664,0,28,-71,28 2 146 grave
+a" 333,664,0,203,-43,43 2 147 hungarumlaut
+a. 333,606,0,22,-157,22 2 148 dotaccent
+ab 333,650,0,135,-67,43 2 149 breve
+ah 333,661,0,143,-71,43 2 150 caron
+ao 333,691,0,72,-105,43 2 151 ring
+ho 333,40,169,0,70 0 152 ogonek
+lq 556,666,0,8,-116,8 2 153 quotedblleft
+rq 556,666,0,0,-101 2 154 quotedblright
+oe 667,441,12,29,30,29 0 155 oe
+/l 278,683,11,79,13,43 2 156 lslash
+Bq 556,101,129,0,-7 0 157 quotedblbase
+OE 944,666,8,70,1,43 2 158 OE
+/L 556,653,0,53,58,43 2 159 Lslash
+r! 389,473,205,0,-9 1 161 exclamdown
+ct 500,560,143,22,-27,22 2 162 cent
+Po 500,670,6,67,40,43 2 163 sterling
+Cs 500,597,0,72,72,43 2 164 currency
+Ye 500,653,0,153,23,43 2 165 yen
+bb 275,666,18,0,-55 2 166 brokenbar
+sc 500,666,162,11,-3,11 2 167 section
+ad 333,606,0,122,-57,43 2 168 dieresis
+co 760,666,18,9,9,9 2 169 copyright
+Of 276,676,0,126,8,43 2 170 ordfeminine
+fo 333,403,0,0,-1 0 171 guilsinglleft
+tno 675,386,0,0,-36 0 172 logicalnot
+\- 675,286,0,0,-36 0 173 minus
+rg 760,666,18,9,9,9 2 174 registered
+a- 333,583,0,128,-49,43 2 175 macron
+de 400,676,0,37,-51,37 2 176 degree
+t+- 675,506,0,0,-36 0 177 plusminus
+S2 300,676,0,74,17,43 2 178 twosuperior
+S3 300,676,0,89,7,43 2 179 threesuperior
+aa 333,664,0,120,-130,43 2 180 acute
+mc 500,428,209,47,80,43 1 181 mu
+ps 523,653,123,143,-5,43 2 182 paragraph
+pc 250,310,0,0,-20 0 183 periodcentered
+ac 333,0,217,0,80 1 184 cedilla
+S1 300,676,0,34,7,34 2 185 onesuperior
+Om 310,676,0,102,-17,43 2 186 ordmasculine
+fc 333,403,0,0,-2 0 187 guilsinglright
+14 750,676,10,36,17,36 2 188 onequarter
+12 750,676,10,49,16,43 2 189 onehalf
+34 750,676,10,36,27,36 2 190 threequarters
+r? 500,471,205,0,22 1 191 questiondown
+`A 611,876,0,3,101,3 2 192 Agrave
+'A 611,876,0,3,101,3 2 193 Aacute
+^A 611,873,0,3,101,3 2 194 Acircumflex
+~A 611,836,0,5,101,5 2 195 Atilde
+:A 611,818,0,3,101,3 2 196 Adieresis
+oA 611,883,0,3,101,3 2 197 Aring
+AE 889,653,0,72,77,43 2 198 AE
+,C 667,666,217,72,-16,43 3 199 Ccedilla
+`E 611,876,0,73,51,43 2 200 Egrave
+'E 611,876,0,73,51,43 2 201 Eacute
+^E 611,873,0,73,51,43 2 202 Ecircumflex
+:E 611,818,0,73,51,43 2 203 Edieresis
+`I 333,876,0,101,58,43 2 204 Igrave
+'I 333,876,0,130,58,43 2 205 Iacute
+^I 333,873,0,142,58,43 2 206 Icircumflex
+:I 333,818,0,152,58,43 2 207 Idieresis
+-D 722,653,0,28,58,28 2 208 Eth
+~N 667,836,15,110,70,43 2 209 Ntilde
+`O 722,876,18,27,-10,27 2 210 Ograve
+'O 722,876,18,27,-10,27 2 211 Oacute
+^O 722,873,18,27,-10,27 2 212 Ocircumflex
+~O 722,836,18,27,-10,27 2 213 Otilde
+:O 722,818,18,27,-10,27 2 214 Odieresis
+tmu 675,497,0,0,-43 0 215 multiply
+/O 722,722,105,27,-10,27 2 216 Oslash
+`U 722,876,18,93,-52,43 2 217 Ugrave
+'U 722,876,18,93,-52,43 2 218 Uacute
+^U 722,873,18,93,-52,43 2 219 Ucircumflex
+:U 722,818,18,93,-52,43 2 220 Udieresis
+'Y 556,876,0,127,-28,43 2 221 Yacute
+TP 611,653,0,8,50,8 2 222 Thorn
+ss 500,679,207,43,218,43 3 223 germandbls
+`a 500,664,11,26,33,26 2 224 agrave
+'a 500,664,11,37,33,37 2 225 aacute
+^a 500,661,11,26,33,26 2 226 acircumflex
+~a 500,624,11,61,33,43 2 227 atilde
+:a 500,606,11,39,33,39 2 228 adieresis
+oa 500,691,11,26,33,26 2 229 aring
+ae 667,441,11,23,27,23 0 230 ae
+,c 444,441,217,31,24,31 1 231 ccedilla
+`e 444,664,11,18,19,18 2 232 egrave
+'e 444,664,11,65,19,43 2 233 eacute
+^e 444,661,11,47,19,43 2 234 ecircumflex
+:e 444,606,11,57,19,43 2 235 edieresis
+`i 278,664,11,56,1,43 2 236 igrave
+'i 278,664,11,128,1,43 2 237 iacute
+^i 278,661,11,100,16,43 2 238 icircumflex
+:i 278,606,11,125,1,43 2 239 idieresis
+Sd 500,683,11,32,23,32 2 240 eth
+~n 500,624,9,26,36,26 2 241 ntilde
+`o 500,664,11,18,23,18 2 242 ograve
+'o 500,664,11,37,23,37 2 243 oacute
+^o 500,661,11,18,23,18 2 244 ocircumflex
+~o 500,624,11,46,23,43 2 245 otilde
+:o 500,606,11,39,23,39 2 246 odieresis
+tdi 675,517,11,0,-36 0 247 divide
+/o 500,554,135,19,22,19 2 248 oslash
+`u 500,664,11,25,8,25 2 249 ugrave
+'u 500,664,11,27,8,27 2 250 uacute
+^u 500,661,11,25,8,25 2 251 ucircumflex
+:u 500,606,11,29,8,29 2 252 udieresis
+'y 444,664,206,65,74,43 3 253 yacute
+Tp 500,683,205,19,125,19 3 254 thorn
+:y 444,606,206,47,74,43 3 255 ydieresis
+u2026 889,100,11,0,-7 0 256 ellipsis
diff --git a/font/devps/old/TR b/font/devps/old/TR
new file mode 100644
index 0000000..5096c94
--- /dev/null
+++ b/font/devps/old/TR
@@ -0,0 +1,448 @@
+name TR
+internalname Times-Roman
+spacewidth 250
+encoding text.enc
+ligatures fi fl 0
+kernpairs
+A y -92
+A w -92
+A v -74
+A ' -111
+A cq -111
+A Y -105
+A W -90
+A V -135
+A U -55
+A T -111
+A Q -55
+A O -55
+A G -40
+A C -40
+B U -10
+B A -35
+D Y -55
+D W -30
+D V -40
+D A -40
+F . -80
+F o -15
+F , -80
+F a -15
+F A -74
+J A -60
+K y -25
+K u -15
+K o -35
+K e -25
+K O -30
+L y -55
+L ' -92
+L cq -92
+L Y -100
+L W -74
+L V -100
+L T -92
+N A -35
+O Y -50
+O X -40
+O W -35
+O V -50
+O T -40
+O A -35
+P . -111
+P , -111
+P a -15
+P A -92
+Q U -10
+R Y -65
+R W -55
+R V -80
+R U -40
+R T -60
+R O -40
+T y -80
+T w -80
+T u -45
+T ; -55
+T r -35
+T . -74
+T o -80
+T i -35
+T - -92
+T hy -92
+T e -70
+T , -74
+T : -50
+T a -80
+T O -18
+T A -93
+U A -40
+V u -75
+V ; -74
+V . -129
+V o -129
+V i -60
+V - -100
+V hy -100
+V e -111
+V , -129
+V : -74
+V a -111
+V O -40
+V G -15
+V A -135
+W y -73
+W u -50
+W ; -37
+W . -92
+W o -80
+W i -40
+W - -65
+W hy -65
+W e -80
+W , -92
+W : -37
+W a -80
+W O -10
+W A -120
+Y u -111
+Y ; -92
+Y . -129
+Y o -110
+Y i -55
+Y - -111
+Y hy -111
+Y e -100
+Y , -129
+Y : -92
+Y a -100
+Y O -30
+Y A -120
+a w -15
+a v -20
+b v -15
+b u -20
+b . -40
+c y -15
+, ' -70
+, cq -70
+, rq -70
+e y -15
+e x -15
+e w -25
+e v -25
+e g -15
+f ' 55
+f cq 55
+f i -20
+f f -25
+f .i -50
+f a -10
+g a -5
+h y -5
+i v -25
+k y -15
+k o -10
+k e -10
+l w -10
+n y -15
+n v -40
+o y -10
+o w -25
+o v -15
+p y -10
+. ' -70
+. cq -70
+. rq -70
+lq A -80
+` ` -74
+` oq -74
+oq ` -74
+oq oq -74
+` A -80
+oq A -80
+' v -50
+cq v -50
+' t -18
+cq t -18
+' u0020 -74
+cq u0020 -74
+' s -55
+cq s -55
+' r -50
+cq r -50
+' ' -74
+' cq -74
+cq ' -74
+cq cq -74
+' l -10
+cq l -10
+' d -50
+cq d -50
+r . -55
+r - -20
+r hy -20
+r g -18
+r , -40
+u0020 Y -90
+u0020 W -30
+u0020 V -50
+u0020 T -18
+u0020 A -55
+v . -65
+v o -20
+v e -15
+v , -65
+v a -25
+w . -65
+w o -10
+w , -65
+w a -10
+x e -15
+y . -65
+y , -65
+charset
+ha 469,662 2 0 asciicircum
+ti 541,323 0 1 asciitilde
+vS 556,886,14 2 2 Scaron
+vZ 611,886 2 3 Zcaron
+vs 389,674,10 2 4 scaron
+vz 444,674 2 5 zcaron
+:Y 722,835 2 6 Ydieresis
+tm 980,662 2 7 trademark
+aq 180,676 2 8 quotesingle
+space 250 0 32 space
+! 333,676,9 2 33 exclam
+" 408,676 2 34 quotedbl
+dq "
+# 500,662 2 35 numbersign
+sh "
+$ 500,727,87 2 36 dollar
+Do "
+% 833,676,13 2 37 percent
+& 778,676,13 2 38 ampersand
+' 333,676 2 39 quoteright
+cq "
+( 333,676,177 2 40 parenleft
+) 333,676,177 2 41 parenright
+* 500,676 2 42 asterisk
++ 564,506 0 43 plus
+, 250,102,141 0 44 comma
+- 333,257 0 45 hyphen
+hy "
+. 250,100,11 0 46 period
+/ 278,676,14,9,9 2 47 slash
+sl "
+0 500,676,14 2 48 zero
+1 500,676 2 49 one
+2 500,676 2 50 two
+3 500,676,14 2 51 three
+4 500,676 2 52 four
+5 500,688,14 2 53 five
+6 500,684,14 2 54 six
+7 500,662,8 2 55 seven
+8 500,676,14 2 56 eight
+9 500,676,22 2 57 nine
+: 278,459,11 0 58 colon
+; 278,459,141 0 59 semicolon
+< 564,514,8 0 60 less
+= 564,386 0 61 equal
+> 564,514,8 0 62 greater
+? 444,676,8 2 63 question
+@ 921,676,14 2 64 at
+at "
+A 722,674 2 65 A
+B 667,662 2 66 B
+C 667,676,14 2 67 C
+D 722,662 2 68 D
+E 611,662 2 69 E
+F 556,662 2 70 F
+G 722,676,14 2 71 G
+H 722,662 2 72 H
+I 333,662 2 73 I
+J 389,662,14 2 74 J
+K 722,662,0,1 2 75 K
+L 611,662 2 76 L
+M 889,662 2 77 M
+N 722,662,11 2 78 N
+O 722,676,14 2 79 O
+P 556,662 2 80 P
+Q 722,676,178 2 81 Q
+R 667,662 2 82 R
+S 556,676,14 2 83 S
+T 611,662 2 84 T
+U 722,662,14 2 85 U
+V 722,662,11 2 86 V
+W 944,662,11 2 87 W
+X 722,662 2 88 X
+Y 722,662 2 89 Y
+Z 611,662 2 90 Z
+[ 333,662,156 2 91 bracketleft
+lB "
+\ 278,676,14,9,9 2 92 backslash
+rs "
+] 333,662,156 2 93 bracketright
+rB "
+a^ 333,674 2 94 circumflex
+^ "
+_ 500,0,125 0 95 underscore
+` 333,676 2 96 quoteleft
+oq "
+a 444,460,10 0 97 a
+b 500,683,10 2 98 b
+c 444,460,10 0 99 c
+d 500,683,10 2 100 d
+e 444,460,10 0 101 e
+f 333,683,0,50 2 102 f
+g 500,460,218 1 103 g
+h 500,683 2 104 h
+i 278,683 2 105 i
+j 278,683,218,0,70 3 106 j
+k 500,683,0,5 2 107 k
+l 278,683 2 108 l
+m 778,460 0 109 m
+n 500,460 0 110 n
+o 500,460,10 0 111 o
+p 500,460,217 1 112 p
+q 500,460,217 1 113 q
+r 333,460,0,2 0 114 r
+s 389,460,10 0 115 s
+t 278,579,10,1 2 116 t
+u 500,450,10 0 117 u
+v 500,450,14 0 118 v
+w 722,450,14 0 119 w
+x 500,450 0 120 x
+y 500,450,218 1 121 y
+z 444,450 0 122 z
+lC 480,680,181 2 123 braceleft
+{ "
+ba 200,676,14 2 124 bar
+| "
+rC 480,680,181 2 125 braceright
+} "
+a~ 333,638 2 126 tilde
+~ "
+bq 333,102,141 0 128 quotesinglbase
+Fo 500,416 0 129 guillemotleft
+Fc 500,416 0 130 guillemotright
+bu 350,466 0 131 bullet
+Fn 500,676,189 2 132 florin
+f/ 167,676,14,164,168 2 133 fraction
+%0 1000,706,19 2 134 perthousand
+dg 500,676,149 2 135 dagger
+dd 500,676,153 2 136 daggerdbl
+en 500,250 0 137 endash
+em 1000,250 0 138 emdash
+fi 556,683 2 140 fi
+fl 556,683 2 141 fl
+.i 278,460 0 144 dotlessi
+ga 333,678 2 146 grave
+a" 333,678,0,44,3 2 147 hungarumlaut
+a. 333,623 2 148 dotaccent
+ab 333,664 2 149 breve
+ah 333,674 2 150 caron
+ao 333,711 2 151 ring
+ho 333,0,165 0 152 ogonek
+lq 444,676 2 153 quotedblleft
+rq 444,676 2 154 quotedblright
+oe 722,460,10 0 155 oe
+/l 278,683 2 156 lslash
+Bq 444,102,141 0 157 quotedblbase
+OE 889,668,6 2 158 OE
+/L 611,662 2 159 Lslash
+r! 333,467,218 1 161 exclamdown
+ct 500,579,138 2 162 cent
+Po 500,676,8 2 163 sterling
+Cs 500,602,0,22,22 2 164 currency
+Ye 500,662,0,12,53 2 165 yen
+bb 200,676,14 2 166 brokenbar
+sc 500,676,148 2 167 section
+ad 333,623 2 168 dieresis
+co 760,676,14 2 169 copyright
+Of 276,676 2 170 ordfeminine
+fo 333,416 0 171 guilsinglleft
+tno 564,386 0 172 logicalnot
+\- 564,286 0 173 minus
+rg 760,676,14 2 174 registered
+a- 333,601 2 175 macron
+de 400,676 2 176 degree
+t+- 564,506 0 177 plusminus
+S2 300,676 2 178 twosuperior
+S3 300,676 2 179 threesuperior
+aa 333,678 2 180 acute
+mc 500,450,218,12 1 181 mu
+ps 453,662,154,0,22 2 182 paragraph
+pc 250,310 0 183 periodcentered
+ac 333,0,215 0 184 cedilla
+S1 300,676 2 185 onesuperior
+Om 310,676 2 186 ordmasculine
+fc 333,416 0 187 guilsinglright
+14 750,676,14 2 188 onequarter
+12 750,676,14 2 189 onehalf
+34 750,676,14 2 190 threequarters
+r? 444,466,218 1 191 questiondown
+`A 722,890 2 192 Agrave
+'A 722,890 2 193 Aacute
+^A 722,886 2 194 Acircumflex
+~A 722,850 2 195 Atilde
+:A 722,835 2 196 Adieresis
+oA 722,898 2 197 Aring
+AE 889,662 2 198 AE
+,C 667,676,215 2 199 Ccedilla
+`E 611,890 2 200 Egrave
+'E 611,890 2 201 Eacute
+^E 611,886 2 202 Ecircumflex
+:E 611,835 2 203 Edieresis
+`I 333,890 2 204 Igrave
+'I 333,890 2 205 Iacute
+^I 333,886 2 206 Icircumflex
+:I 333,835 2 207 Idieresis
+-D 722,662 2 208 Eth
+~N 722,850,11 2 209 Ntilde
+`O 722,890,14 2 210 Ograve
+'O 722,890,14 2 211 Oacute
+^O 722,886,14 2 212 Ocircumflex
+~O 722,850,14 2 213 Otilde
+:O 722,835,14 2 214 Odieresis
+tmu 564,497 0 215 multiply
+/O 722,734,80 2 216 Oslash
+`U 722,890,14 2 217 Ugrave
+'U 722,890,14 2 218 Uacute
+^U 722,886,14 2 219 Ucircumflex
+:U 722,835,14 2 220 Udieresis
+'Y 722,890 2 221 Yacute
+TP 556,662 2 222 Thorn
+ss 500,683,9 2 223 germandbls
+`a 444,678,10 2 224 agrave
+'a 444,678,10 2 225 aacute
+^a 444,674,10 2 226 acircumflex
+~a 444,638,10 2 227 atilde
+:a 444,623,10 2 228 adieresis
+oa 444,711,10 2 229 aring
+ae 667,460,10 0 230 ae
+,c 444,460,215 0 231 ccedilla
+`e 444,678,10 2 232 egrave
+'e 444,678,10 2 233 eacute
+^e 444,674,10 2 234 ecircumflex
+:e 444,623,10 2 235 edieresis
+`i 278,678,0,0,8 2 236 igrave
+'i 278,678,0,12 2 237 iacute
+^i 278,674,0,17,16 2 238 icircumflex
+:i 278,623,0,10,9 2 239 idieresis
+Sd 500,686,10 2 240 eth
+~n 500,638 2 241 ntilde
+`o 500,678,10 2 242 ograve
+'o 500,678,10 2 243 oacute
+^o 500,674,10 2 244 ocircumflex
+~o 500,638,10 2 245 otilde
+:o 500,623,10 2 246 odieresis
+tdi 564,516,10 0 247 divide
+/o 500,551,112 0 248 oslash
+`u 500,678,10 2 249 ugrave
+'u 500,678,10 2 250 uacute
+^u 500,674,10 2 251 ucircumflex
+:u 500,623,10 2 252 udieresis
+'y 500,678,218 3 253 yacute
+Tp 500,683,217 3 254 thorn
+:y 500,623,218 3 255 ydieresis
+u2026 1000,100,11 0 256 ellipsis
diff --git a/font/devps/old/symbol.afm b/font/devps/old/symbol.afm
new file mode 100644
index 0000000..33cba6a
--- /dev/null
+++ b/font/devps/old/symbol.afm
@@ -0,0 +1,212 @@
+StartFontMetrics 2.0
+Comment Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated. All rights reserved.
+Comment Creation Date: Wed Jan 17 21:48:26 1990
+Comment UniqueID 27004
+Comment VMusage 28489 37622
+FontName Symbol
+FullName Symbol
+FamilyName Symbol
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -180 -293 1090 1010
+UnderlinePosition -98
+UnderlineThickness 54
+Version 001.007
+Notice Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated. All rights reserved.
+EncodingScheme FontSpecific
+StartCharMetrics 189
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 128 -17 240 672 ;
+C 34 ; WX 713 ; N universal ; B 31 0 681 705 ;
+C 35 ; WX 500 ; N numbersign ; B 20 -16 481 673 ;
+C 36 ; WX 549 ; N existential ; B 25 0 478 707 ;
+C 37 ; WX 833 ; N percent ; B 63 -36 771 655 ;
+C 38 ; WX 778 ; N ampersand ; B 41 -18 750 661 ;
+C 39 ; WX 439 ; N suchthat ; B 48 -17 414 500 ;
+C 40 ; WX 333 ; N parenleft ; B 53 -191 300 673 ;
+C 41 ; WX 333 ; N parenright ; B 30 -191 277 673 ;
+C 42 ; WX 500 ; N asteriskmath ; B 65 134 427 551 ;
+C 43 ; WX 549 ; N plus ; B 10 0 539 533 ;
+C 44 ; WX 250 ; N comma ; B 56 -152 194 104 ;
+C 45 ; WX 549 ; N minus ; B 11 233 535 288 ;
+C 46 ; WX 250 ; N period ; B 69 -17 181 95 ;
+C 47 ; WX 278 ; N slash ; B 0 -18 254 646 ;
+C 48 ; WX 500 ; N zero ; B 23 -17 471 685 ;
+C 49 ; WX 500 ; N one ; B 117 0 390 673 ;
+C 50 ; WX 500 ; N two ; B 25 0 475 686 ;
+C 51 ; WX 500 ; N three ; B 39 -17 435 685 ;
+C 52 ; WX 500 ; N four ; B 16 0 469 685 ;
+C 53 ; WX 500 ; N five ; B 29 -17 443 685 ;
+C 54 ; WX 500 ; N six ; B 36 -17 467 685 ;
+C 55 ; WX 500 ; N seven ; B 24 -16 448 673 ;
+C 56 ; WX 500 ; N eight ; B 54 -18 440 685 ;
+C 57 ; WX 500 ; N nine ; B 31 -18 460 685 ;
+C 58 ; WX 278 ; N colon ; B 81 -17 193 460 ;
+C 59 ; WX 278 ; N semicolon ; B 83 -152 221 460 ;
+C 60 ; WX 549 ; N less ; B 26 0 523 522 ;
+C 61 ; WX 549 ; N equal ; B 11 141 537 390 ;
+C 62 ; WX 549 ; N greater ; B 26 0 523 522 ;
+C 63 ; WX 444 ; N question ; B 70 -17 412 686 ;
+C 64 ; WX 549 ; N congruent ; B 11 0 537 475 ;
+C 65 ; WX 722 ; N Alpha ; B 4 0 684 673 ;
+C 66 ; WX 667 ; N Beta ; B 29 0 592 673 ;
+C 67 ; WX 722 ; N Chi ; B -9 0 704 673 ;
+C 68 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C 69 ; WX 611 ; N Epsilon ; B 32 0 617 673 ;
+C 70 ; WX 763 ; N Phi ; B 26 0 741 673 ;
+C 71 ; WX 603 ; N Gamma ; B 24 0 609 673 ;
+C 72 ; WX 722 ; N Eta ; B 39 0 729 673 ;
+C 73 ; WX 333 ; N Iota ; B 32 0 316 673 ;
+C 74 ; WX 631 ; N theta1 ; B 18 -18 623 689 ;
+C 75 ; WX 722 ; N Kappa ; B 35 0 722 673 ;
+C 76 ; WX 686 ; N Lambda ; B 6 0 680 688 ;
+C 77 ; WX 889 ; N Mu ; B 28 0 887 673 ;
+C 78 ; WX 722 ; N Nu ; B 29 -8 720 673 ;
+C 79 ; WX 722 ; N Omicron ; B 41 -17 715 685 ;
+C 80 ; WX 768 ; N Pi ; B 25 0 745 673 ;
+C 81 ; WX 741 ; N Theta ; B 41 -17 715 685 ;
+C 82 ; WX 556 ; N Rho ; B 28 0 563 673 ;
+C 83 ; WX 592 ; N Sigma ; B 5 0 589 673 ;
+C 84 ; WX 611 ; N Tau ; B 33 0 607 673 ;
+C 85 ; WX 690 ; N Upsilon ; B -8 0 694 673 ;
+C 86 ; WX 439 ; N sigma1 ; B 40 -233 436 500 ;
+C 87 ; WX 768 ; N Omega ; B 34 0 736 688 ;
+C 88 ; WX 645 ; N Xi ; B 40 0 599 673 ;
+C 89 ; WX 795 ; N Psi ; B 15 0 781 684 ;
+C 90 ; WX 611 ; N Zeta ; B 44 0 636 673 ;
+C 91 ; WX 333 ; N bracketleft ; B 86 -155 299 674 ;
+C 92 ; WX 863 ; N therefore ; B 163 0 701 478 ;
+C 93 ; WX 333 ; N bracketright ; B 33 -155 246 674 ;
+C 94 ; WX 658 ; N perpendicular ; B 15 0 652 674 ;
+C 95 ; WX 500 ; N underscore ; B -2 -252 502 -206 ;
+C 96 ; WX 500 ; N radicalex ; B 480 881 1090 917 ;
+C 97 ; WX 631 ; N alpha ; B 41 -18 622 500 ;
+C 98 ; WX 549 ; N beta ; B 61 -223 515 741 ;
+C 99 ; WX 549 ; N chi ; B 12 -231 522 499 ;
+C 100 ; WX 494 ; N delta ; B 40 -19 481 740 ;
+C 101 ; WX 439 ; N epsilon ; B 22 -19 427 502 ;
+C 102 ; WX 521 ; N phi ; B 27 -224 490 671 ;
+C 103 ; WX 411 ; N gamma ; B 5 -225 484 499 ;
+C 104 ; WX 603 ; N eta ; B 0 -202 527 514 ;
+C 105 ; WX 329 ; N iota ; B 0 -17 301 503 ;
+C 106 ; WX 603 ; N phi1 ; B 36 -224 587 499 ;
+C 107 ; WX 549 ; N kappa ; B 33 0 558 501 ;
+C 108 ; WX 549 ; N lambda ; B 24 -17 548 739 ;
+C 109 ; WX 576 ; N mu ; B 33 -223 567 500 ;
+C 110 ; WX 521 ; N nu ; B -9 -16 475 507 ;
+C 111 ; WX 549 ; N omicron ; B 35 -19 501 499 ;
+C 112 ; WX 549 ; N pi ; B 10 -19 530 487 ;
+C 113 ; WX 521 ; N theta ; B 43 -17 485 690 ;
+C 114 ; WX 549 ; N rho ; B 50 -230 490 499 ;
+C 115 ; WX 603 ; N sigma ; B 30 -21 588 500 ;
+C 116 ; WX 439 ; N tau ; B 10 -19 418 500 ;
+C 117 ; WX 576 ; N upsilon ; B 7 -18 535 507 ;
+C 118 ; WX 713 ; N omega1 ; B 12 -18 671 583 ;
+C 119 ; WX 686 ; N omega ; B 42 -17 684 500 ;
+C 120 ; WX 493 ; N xi ; B 27 -224 469 766 ;
+C 121 ; WX 686 ; N psi ; B 12 -228 701 500 ;
+C 122 ; WX 494 ; N zeta ; B 60 -225 467 756 ;
+C 123 ; WX 480 ; N braceleft ; B 58 -183 397 673 ;
+C 124 ; WX 200 ; N bar ; B 65 -177 135 673 ;
+C 125 ; WX 480 ; N braceright ; B 79 -183 418 673 ;
+C 126 ; WX 549 ; N similar ; B 17 203 529 307 ;
+C 161 ; WX 620 ; N Upsilon1 ; B -2 0 610 685 ;
+C 162 ; WX 247 ; N minute ; B 27 459 228 735 ;
+C 163 ; WX 549 ; N lessequal ; B 29 0 526 639 ;
+C 164 ; WX 167 ; N fraction ; B -180 -12 340 677 ;
+C 165 ; WX 713 ; N infinity ; B 26 124 688 404 ;
+C 166 ; WX 500 ; N florin ; B 2 -193 494 686 ;
+C 167 ; WX 753 ; N club ; B 86 -26 660 533 ;
+C 168 ; WX 753 ; N diamond ; B 142 -36 600 550 ;
+C 169 ; WX 753 ; N heart ; B 117 -33 631 532 ;
+C 170 ; WX 753 ; N spade ; B 113 -36 629 548 ;
+C 171 ; WX 1042 ; N arrowboth ; B 24 -15 1024 511 ;
+C 172 ; WX 987 ; N arrowleft ; B 32 -15 942 511 ;
+C 173 ; WX 603 ; N arrowup ; B 45 0 571 910 ;
+C 174 ; WX 987 ; N arrowright ; B 49 -15 959 511 ;
+C 175 ; WX 603 ; N arrowdown ; B 45 -22 571 888 ;
+C 176 ; WX 400 ; N degree ; B 50 385 350 685 ;
+C 177 ; WX 549 ; N plusminus ; B 10 0 539 645 ;
+C 178 ; WX 411 ; N second ; B 20 459 413 737 ;
+C 179 ; WX 549 ; N greaterequal ; B 29 0 526 639 ;
+C 180 ; WX 549 ; N multiply ; B 17 8 533 524 ;
+C 181 ; WX 713 ; N proportional ; B 27 123 639 404 ;
+C 182 ; WX 494 ; N partialdiff ; B 26 -20 462 746 ;
+C 183 ; WX 460 ; N bullet ; B 50 113 410 473 ;
+C 184 ; WX 549 ; N divide ; B 10 71 536 456 ;
+C 185 ; WX 549 ; N notequal ; B 15 -25 540 549 ;
+C 186 ; WX 549 ; N equivalence ; B 14 82 538 443 ;
+C 187 ; WX 549 ; N approxequal ; B 14 135 527 394 ;
+C 188 ; WX 1000 ; N ellipsis ; B 111 -17 889 95 ;
+C 189 ; WX 603 ; N arrowvertex ; B 280 -120 336 1010 ;
+C 190 ; WX 1000 ; N arrowhorizex ; B -60 220 1050 276 ;
+C 191 ; WX 658 ; N carriagereturn ; B 15 -16 602 629 ;
+C 192 ; WX 823 ; N aleph ; B 175 -18 661 658 ;
+C 193 ; WX 686 ; N Ifraktur ; B 10 -53 578 740 ;
+C 194 ; WX 795 ; N Rfraktur ; B 26 -15 759 734 ;
+C 195 ; WX 987 ; N weierstrass ; B 159 -211 870 573 ;
+C 196 ; WX 768 ; N circlemultiply ; B 43 -17 733 673 ;
+C 197 ; WX 768 ; N circleplus ; B 43 -15 733 675 ;
+C 198 ; WX 823 ; N emptyset ; B 39 -24 781 719 ;
+C 199 ; WX 768 ; N intersection ; B 40 0 732 509 ;
+C 200 ; WX 768 ; N union ; B 40 -17 732 492 ;
+C 201 ; WX 713 ; N propersuperset ; B 20 0 673 470 ;
+C 202 ; WX 713 ; N reflexsuperset ; B 20 -125 673 470 ;
+C 203 ; WX 713 ; N notsubset ; B 36 -70 690 540 ;
+C 204 ; WX 713 ; N propersubset ; B 37 0 690 470 ;
+C 205 ; WX 713 ; N reflexsubset ; B 37 -125 690 470 ;
+C 206 ; WX 713 ; N element ; B 45 0 505 468 ;
+C 207 ; WX 713 ; N notelement ; B 45 -58 505 555 ;
+C 208 ; WX 768 ; N angle ; B 26 0 738 673 ;
+C 209 ; WX 713 ; N gradient ; B 36 -19 681 718 ;
+C 210 ; WX 790 ; N registerserif ; B 50 -17 740 673 ;
+C 211 ; WX 790 ; N copyrightserif ; B 51 -15 741 675 ;
+C 212 ; WX 890 ; N trademarkserif ; B 18 293 855 673 ;
+C 213 ; WX 823 ; N product ; B 25 -101 803 751 ;
+C 214 ; WX 549 ; N radical ; B 10 -38 515 917 ;
+C 215 ; WX 250 ; N dotmath ; B 69 210 169 310 ;
+C 216 ; WX 713 ; N logicalnot ; B 15 0 680 288 ;
+C 217 ; WX 603 ; N logicaland ; B 23 0 583 454 ;
+C 218 ; WX 603 ; N logicalor ; B 30 0 578 477 ;
+C 219 ; WX 1042 ; N arrowdblboth ; B 27 -20 1023 510 ;
+C 220 ; WX 987 ; N arrowdblleft ; B 30 -15 939 513 ;
+C 221 ; WX 603 ; N arrowdblup ; B 39 2 567 911 ;
+C 222 ; WX 987 ; N arrowdblright ; B 45 -20 954 508 ;
+C 223 ; WX 603 ; N arrowdbldown ; B 44 -19 572 890 ;
+C 224 ; WX 494 ; N lozenge ; B 18 0 466 745 ;
+C 225 ; WX 329 ; N angleleft ; B 25 -198 306 746 ;
+C 226 ; WX 790 ; N registersans ; B 50 -20 740 670 ;
+C 227 ; WX 790 ; N copyrightsans ; B 49 -15 739 675 ;
+C 228 ; WX 786 ; N trademarksans ; B 5 293 725 673 ;
+C 229 ; WX 713 ; N summation ; B 14 -108 695 752 ;
+C 230 ; WX 384 ; N parenlefttp ; B 40 -293 436 926 ;
+C 231 ; WX 384 ; N parenleftex ; B 40 -80 92 920 ;
+C 232 ; WX 384 ; N parenleftbt ; B 40 -293 436 920 ;
+C 233 ; WX 384 ; N bracketlefttp ; B 0 -75 341 925 ;
+C 234 ; WX 384 ; N bracketleftex ; B 0 -75 55 925 ;
+C 235 ; WX 384 ; N bracketleftbt ; B 0 -75 340 925 ;
+C 236 ; WX 494 ; N bracelefttp ; B 201 -75 439 925 ;
+C 237 ; WX 494 ; N braceleftmid ; B 14 -75 255 925 ;
+C 238 ; WX 494 ; N braceleftbt ; B 201 -75 439 925 ;
+C 239 ; WX 494 ; N braceex ; B 201 -75 255 925 ;
+C 241 ; WX 329 ; N angleright ; B 21 -198 302 746 ;
+C 242 ; WX 274 ; N integral ; B 2 -107 291 916 ;
+C 243 ; WX 686 ; N integraltp ; B 332 -83 715 921 ;
+C 244 ; WX 686 ; N integralex ; B 332 -88 415 975 ;
+C 245 ; WX 686 ; N integralbt ; B 39 -81 415 921 ;
+C 246 ; WX 384 ; N parenrighttp ; B 54 -293 450 926 ;
+C 247 ; WX 384 ; N parenrightex ; B 398 -80 450 920 ;
+C 248 ; WX 384 ; N parenrightbt ; B 54 -293 450 920 ;
+C 249 ; WX 384 ; N bracketrighttp ; B 22 -75 360 925 ;
+C 250 ; WX 384 ; N bracketrightex ; B 305 -75 360 925 ;
+C 251 ; WX 384 ; N bracketrightbt ; B 20 -75 360 925 ;
+C 252 ; WX 494 ; N bracerighttp ; B 17 -75 255 925 ;
+C 253 ; WX 494 ; N bracerightmid ; B 201 -75 442 925 ;
+C 254 ; WX 494 ; N bracerightbt ; B 17 -75 255 925 ;
+C -1 ; WX 790 ; N apple ; B 56 -3 733 808 ;
+EndCharMetrics
+italicCorrection integral 67
+leftItalicCorrection integral 52
+subscriptCorrection integral -10
+EndFontMetrics
diff --git a/font/devps/old/symbolsl.afm b/font/devps/old/symbolsl.afm
new file mode 100644
index 0000000..90939ad
--- /dev/null
+++ b/font/devps/old/symbolsl.afm
@@ -0,0 +1,203 @@
+StartFontMetrics 2.0
+FontName Symbol-Slanted
+Version 001.001
+FamilyName Symbol
+ItalicAngle -15.5
+IsFixedPitch false
+UnderlineThickness 54
+Weight Medium
+UnderlinePosition -98
+FullName Symbol
+FontBBox -241 -261 1250 899
+StartCharMetrics 189
+C 32 ; WX 223 ; N space ; B 223 0 223 0 ;
+C 33 ; WX 296 ; N exclam ; B 122 -15 383 599 ;
+C 34 ; WX 635 ; N universal ; B 223 0 801 627 ;
+C 35 ; WX 445 ; N numbersign ; B 71 -15 557 599 ;
+C 36 ; WX 489 ; N existential ; B 22 0 622 629 ;
+C 37 ; WX 741 ; N percent ; B 147 -32 766 583 ;
+C 38 ; WX 692 ; N ampersand ; B 68 -16 745 589 ;
+C 39 ; WX 391 ; N suchthat ; B 44 -15 450 444 ;
+C 40 ; WX 296 ; N parenleft ; B 89 -170 449 599 ;
+C 41 ; WX 296 ; N parenright ; B -22 -170 339 600 ;
+C 42 ; WX 445 ; N asteriskmath ; B 126 119 500 490 ;
+C 43 ; WX 489 ; N plus ; B 76 0 562 474 ;
+C 44 ; WX 223 ; N comma ; B 9 -136 183 93 ;
+C 45 ; WX 489 ; N minus ; B 74 207 556 256 ;
+C 46 ; WX 223 ; N period ; B 70 -15 174 85 ;
+C 47 ; WX 247 ; N slash ; B -5 -15 405 575 ;
+C 48 ; WX 445 ; N zero ; B 90 -15 537 610 ;
+C 49 ; WX 445 ; N one ; B 107 0 451 599 ;
+C 50 ; WX 445 ; N two ; B 22 0 524 611 ;
+C 51 ; WX 445 ; N three ; B 56 -16 510 611 ;
+C 52 ; WX 445 ; N four ; B 58 0 530 610 ;
+C 53 ; WX 445 ; N five ; B 36 -15 583 610 ;
+C 54 ; WX 445 ; N six ; B 87 -16 588 610 ;
+C 55 ; WX 445 ; N seven ; B 151 -15 585 599 ;
+C 56 ; WX 445 ; N eight ; B 82 -16 536 611 ;
+C 57 ; WX 445 ; N nine ; B 52 -15 535 609 ;
+C 58 ; WX 247 ; N colon ; B 81 -15 286 409 ;
+C 59 ; WX 247 ; N semicolon ; B 33 -136 296 409 ;
+C 60 ; WX 489 ; N less ; B 87 0 610 464 ;
+C 61 ; WX 489 ; N equal ; B 49 126 586 347 ;
+C 62 ; WX 489 ; N greater ; B 23 0 547 464 ;
+C 63 ; WX 395 ; N question ; B 163 -15 517 610 ;
+C 64 ; WX 489 ; N congruent ; B 10 0 597 423 ;
+C 65 ; WX 643 ; N Alpha ; B 3 0 614 599 ;
+C 66 ; WX 594 ; N Beta ; B 26 0 645 598 ;
+C 67 ; WX 643 ; N Chi ; B -8 0 798 599 ;
+C 68 ; WX 545 ; N Delta ; B 5 0 541 612 ;
+C 69 ; WX 544 ; N Epsilon ; B 28 0 688 599 ;
+C 70 ; WX 679 ; N Phi ; B 105 0 761 598 ;
+C 71 ; WX 537 ; N Gamma ; B 31 0 714 599 ;
+C 72 ; WX 643 ; N Eta ; B 35 0 836 599 ;
+C 73 ; WX 296 ; N Iota ; B 28 0 468 599 ;
+C 74 ; WX 562 ; N theta1 ; B 108 -15 645 614 ;
+C 75 ; WX 643 ; N Kappa ; B 31 0 778 598 ;
+C 76 ; WX 611 ; N Lambda ; B 5 0 610 612 ;
+C 77 ; WX 791 ; N Mu ; B 28 0 974 599 ;
+C 78 ; WX 643 ; N Nu ; B 26 -7 827 599 ;
+C 79 ; WX 643 ; N Omicron ; B 112 -15 747 610 ;
+C 80 ; WX 684 ; N Pi ; B 22 0 847 599 ;
+C 81 ; WX 659 ; N Theta ; B 112 -15 747 610 ;
+C 82 ; WX 495 ; N Rho ; B 25 0 645 599 ;
+C 83 ; WX 527 ; N Sigma ; B 5 0 663 599 ;
+C 84 ; WX 544 ; N Tau ; B 159 0 723 599 ;
+C 85 ; WX 614 ; N Upsilon ; B 175 0 804 599 ;
+C 86 ; WX 391 ; N sigma1 ; B 78 -208 492 445 ;
+C 87 ; WX 684 ; N Omega ; B 30 0 760 612 ;
+C 88 ; WX 574 ; N Xi ; B 36 0 700 598 ;
+C 89 ; WX 708 ; N Psi ; B 188 0 885 608 ;
+C 90 ; WX 544 ; N Zeta ; B 39 0 725 599 ;
+C 91 ; WX 296 ; N bracketleft ; B 34 -138 453 599 ;
+C 92 ; WX 768 ; N therefore ; B 160 0 645 426 ;
+C 93 ; WX 296 ; N bracketright ; B -14 -138 405 599 ;
+C 94 ; WX 586 ; N perpendicular ; B 13 0 596 600 ;
+C 95 ; WX 445 ; N underscore ; B -72 -224 390 -183 ;
+C 96 ; WX 445 ; N radicalex ; B 672 784 1224 816 ;
+C 97 ; WX 562 ; N alpha ; B 84 -15 658 445 ;
+C 98 ; WX 489 ; N beta ; B -7 -198 578 659 ;
+C 99 ; WX 489 ; N chi ; B -48 -206 573 445 ;
+C 100 ; WX 440 ; N delta ; B 83 -16 571 658 ;
+C 101 ; WX 391 ; N epsilon ; B 49 -17 468 447 ;
+C 102 ; WX 464 ; N phi ; B 78 -200 517 596 ;
+C 103 ; WX 366 ; N gamma ; B 92 -200 568 444 ;
+C 104 ; WX 537 ; N eta ; B 100 -180 555 457 ;
+C 105 ; WX 293 ; N iota ; B 97 -16 296 448 ;
+C 106 ; WX 537 ; N phi1 ; B 92 -199 604 444 ;
+C 107 ; WX 489 ; N kappa ; B 106 0 621 447 ;
+C 108 ; WX 489 ; N lambda ; B 21 -16 530 658 ;
+C 109 ; WX 513 ; N mu ; B -18 -198 533 445 ;
+C 110 ; WX 464 ; N nu ; B 119 -15 548 451 ;
+C 111 ; WX 489 ; N omicron ; B 86 -17 526 444 ;
+C 112 ; WX 489 ; N pi ; B 58 -18 599 433 ;
+C 113 ; WX 464 ; N theta ; B 103 -16 554 614 ;
+C 114 ; WX 489 ; N rho ; B -19 -205 521 444 ;
+C 115 ; WX 537 ; N sigma ; B 87 -19 662 445 ;
+C 116 ; WX 391 ; N tau ; B 95 -16 511 445 ;
+C 117 ; WX 513 ; N upsilon ; B 105 -15 558 451 ;
+C 118 ; WX 635 ; N omega1 ; B 78 -15 758 519 ;
+C 119 ; WX 611 ; N omega ; B 85 -16 687 445 ;
+C 120 ; WX 439 ; N xi ; B 70 -200 515 681 ;
+C 121 ; WX 611 ; N psi ; B 141 -203 759 445 ;
+C 122 ; WX 440 ; N zeta ; B 100 -200 580 673 ;
+C 123 ; WX 427 ; N braceleft ; B 116 -163 540 599 ;
+C 124 ; WX 178 ; N bar ; B 9 -158 307 599 ;
+C 125 ; WX 427 ; N braceright ; B 19 -163 444 599 ;
+C 126 ; WX 489 ; N similar ; B 78 181 549 273 ;
+C 161 ; WX 552 ; N Upsilon1 ; B 134 0 710 609 ;
+C 162 ; WX 220 ; N minute ; B 156 408 393 654 ;
+C 163 ; WX 489 ; N lessequal ; B 26 0 645 569 ;
+C 164 ; WX 149 ; N fraction ; B -164 -11 490 603 ;
+C 165 ; WX 635 ; N infinity ; B 91 111 692 360 ;
+C 166 ; WX 445 ; N florin ; B -36 -172 614 612 ;
+C 167 ; WX 670 ; N club ; B 119 -23 645 474 ;
+C 168 ; WX 670 ; N diamond ; B 198 -32 605 490 ;
+C 169 ; WX 670 ; N heart ; B 205 -29 679 473 ;
+C 170 ; WX 670 ; N spade ; B 132 -32 604 488 ;
+C 171 ; WX 927 ; N arrowboth ; B 90 -13 980 455 ;
+C 172 ; WX 878 ; N arrowleft ; B 97 -13 915 455 ;
+C 173 ; WX 537 ; N arrowup ; B 223 0 691 810 ;
+C 174 ; WX 878 ; N arrowright ; B 105 -13 922 455 ;
+C 175 ; WX 537 ; N arrowdown ; B 104 -20 572 790 ;
+C 176 ; WX 356 ; N degree ; B 187 343 466 609 ;
+C 177 ; WX 489 ; N plusminus ; B 9 0 593 574 ;
+C 178 ; WX 366 ; N second ; B 150 408 560 656 ;
+C 179 ; WX 489 ; N greaterequal ; B 26 0 582 569 ;
+C 180 ; WX 489 ; N multiply ; B 28 7 609 466 ;
+C 181 ; WX 635 ; N proportional ; B 90 110 667 360 ;
+C 182 ; WX 440 ; N partialdiff ; B 62 -18 542 664 ;
+C 183 ; WX 409 ; N bullet ; B 118 101 454 421 ;
+C 184 ; WX 489 ; N divide ; B 74 63 558 406 ;
+C 185 ; WX 489 ; N notequal ; B 51 -22 587 489 ;
+C 186 ; WX 489 ; N equivalence ; B 35 73 602 394 ;
+C 187 ; WX 489 ; N approxequal ; B 57 120 572 351 ;
+C 188 ; WX 890 ; N ellipsis ; B 107 -15 804 85 ;
+C 189 ; WX 537 ; N arrowvertex ; B 216 -107 579 899 ;
+C 190 ; WX 890 ; N arrowhorizex ; B 8 196 1011 246 ;
+C 191 ; WX 586 ; N carriagereturn ; B 40 -14 710 560 ;
+C 192 ; WX 732 ; N aleph ; B 159 -16 740 586 ;
+C 193 ; WX 611 ; N Ifraktur ; B 26 -47 684 659 ;
+C 194 ; WX 708 ; N Rfraktur ; B 71 -13 833 653 ;
+C 195 ; WX 878 ; N weierstrass ; B 112 -188 878 510 ;
+C 196 ; WX 684 ; N circlemultiply ; B 114 -15 758 599 ;
+C 197 ; WX 684 ; N circleplus ; B 115 -13 759 601 ;
+C 198 ; WX 732 ; N emptyset ; B 38 -21 884 640 ;
+C 199 ; WX 684 ; N intersection ; B 36 0 714 453 ;
+C 200 ; WX 684 ; N union ; B 110 -15 788 438 ;
+C 201 ; WX 635 ; N propersuperset ; B 18 0 675 418 ;
+C 202 ; WX 635 ; N reflexsuperset ; B -17 -111 674 418 ;
+C 203 ; WX 635 ; N notsubset ; B 87 -62 744 481 ;
+C 204 ; WX 635 ; N propersubset ; B 87 0 744 418 ;
+C 205 ; WX 635 ; N reflexsubset ; B 16 -111 744 418 ;
+C 206 ; WX 635 ; N element ; B 93 0 579 417 ;
+C 207 ; WX 635 ; N notelement ; B 74 -52 579 494 ;
+C 208 ; WX 684 ; N angle ; B 23 0 833 599 ;
+C 209 ; WX 635 ; N gradient ; B 231 -17 805 639 ;
+C 210 ; WX 703 ; N registerserif ; B 120 -18 763 596 ;
+C 211 ; WX 703 ; N copyrightserif ; B 122 -13 766 601 ;
+C 212 ; WX 792 ; N trademarkserif ; B 169 261 947 599 ;
+C 213 ; WX 732 ; N product ; B -6 -90 920 668 ;
+C 214 ; WX 489 ; N radical ; B 134 -34 711 816 ;
+C 215 ; WX 223 ; N dotmath ; B 131 187 225 276 ;
+C 216 ; WX 635 ; N logicalnot ; B 78 0 685 256 ;
+C 217 ; WX 537 ; N logicaland ; B 21 0 519 404 ;
+C 218 ; WX 537 ; N logicalor ; B 151 0 639 424 ;
+C 219 ; WX 927 ; N arrowdblboth ; B 92 -18 978 454 ;
+C 220 ; WX 878 ; N arrowdblleft ; B 96 -13 942 457 ;
+C 221 ; WX 537 ; N arrowdblup ; B 152 2 688 811 ;
+C 222 ; WX 878 ; N arrowdblright ; B 71 -18 917 452 ;
+C 223 ; WX 537 ; N arrowdbldown ; B 103 -17 639 792 ;
+C 224 ; WX 440 ; N lozenge ; B 121 0 519 663 ;
+C 225 ; WX 293 ; N angleleft ; B 98 -176 472 664 ;
+C 226 ; WX 703 ; N registersans ; B 120 -18 763 596 ;
+C 227 ; WX 703 ; N copyrightsans ; B 120 -13 764 601 ;
+C 228 ; WX 700 ; N trademarksans ; B 179 261 832 599 ;
+C 229 ; WX 635 ; N summation ; B -15 -96 756 669 ;
+C 230 ; WX 342 ; N parenlefttp ; B -46 -261 642 824 ;
+C 231 ; WX 342 ; N parenleftex ; B 12 -76 338 823 ;
+C 232 ; WX 342 ; N parenleftbt ; B 113 -261 339 824 ;
+C 233 ; WX 342 ; N bracketlefttp ; B -22 -71 560 824 ;
+C 234 ; WX 342 ; N bracketleftex ; B -22 -70 305 823 ;
+C 235 ; WX 342 ; N bracketleftbt ; B -22 -71 306 824 ;
+C 236 ; WX 440 ; N bracelefttp ; B 158 -67 648 824 ;
+C 237 ; WX 440 ; N braceleftmid ; B 126 -76 486 832 ;
+C 238 ; WX 440 ; N braceleftbt ; B 219 -62 484 824 ;
+C 239 ; WX 440 ; N braceex ; B 157 -71 486 832 ;
+C 241 ; WX 293 ; N angleright ; B -29 -176 345 664 ;
+C 242 ; WX 244 ; N integral ; B -13 -95 499 815 ;
+C 243 ; WX 611 ; N integraltp ; B 272 -74 873 820 ;
+C 244 ; WX 611 ; N integralex ; B 271 -78 640 868 ;
+C 245 ; WX 611 ; N integralbt ; B 30 -72 625 820 ;
+C 246 ; WX 342 ; N parenrighttp ; B 273 -261 498 824 ;
+C 247 ; WX 342 ; N parenrightex ; B 331 -76 657 823 ;
+C 248 ; WX 342 ; N parenrightbt ; B -30 -261 657 824 ;
+C 249 ; WX 342 ; N bracketrighttp ; B 249 -71 577 824 ;
+C 250 ; WX 342 ; N bracketrightex ; B 250 -70 577 823 ;
+C 251 ; WX 342 ; N bracketrightbt ; B -4 -71 577 824 ;
+C 252 ; WX 440 ; N bracerighttp ; B 158 -67 425 824 ;
+C 253 ; WX 440 ; N bracerightmid ; B 155 -76 517 832 ;
+C 254 ; WX 440 ; N bracerightbt ; B -4 -62 484 824 ;
+C -1 ; WX 703 ; N apple ; B 136 -2 784 719 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/font/devps/old/zapfdr.afm b/font/devps/old/zapfdr.afm
new file mode 100644
index 0000000..ce216de
--- /dev/null
+++ b/font/devps/old/zapfdr.afm
@@ -0,0 +1,222 @@
+StartFontMetrics 2.0
+Comment Copyright (c) 1985, 1987, 1988, 1989 Adobe Systems Incorporated. All rights reserved.
+Comment Creation Date: Fri Dec 1 12:57:42 1989
+Comment UniqueID 26200
+Comment VMusage 39281 49041
+FontName ZapfDingbats-Reverse
+FullName ITC Zapf Dingbats
+FamilyName ITC Zapf Dingbats
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -1 -143 981 820
+UnderlinePosition -98
+UnderlineThickness 54
+Version 001.004
+Notice Copyright (c) 1985, 1987, 1988, 1989 Adobe Systems Incorporated. All rights reserved.ITC Zapf Dingbats is a registered trademark of International Typeface Corporation.
+EncodingScheme FontSpecific
+StartCharMetrics 202
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 974 ; N a1 ; B 35 72 939 621 ;
+C 34 ; WX 961 ; N a2 ; B 35 81 927 611 ;
+C 35 ; WX 974 ; N a202 ; B 35 72 939 621 ;
+C 36 ; WX 980 ; N a3 ; B 35 0 945 692 ;
+C 37 ; WX 719 ; N a4 ; B 34 139 685 566 ;
+C 38 ; WX 789 ; N a5 ; B 35 -14 755 705 ;
+C 39 ; WX 790 ; N a119 ; B 35 -14 755 705 ;
+C 40 ; WX 791 ; N a118 ; B 35 -13 761 705 ;
+C 41 ; WX 690 ; N a117 ; B 35 138 655 553 ;
+C 42 ; WX 960 ; N a11 ; B 35 123 925 568 ;
+C 43 ; WX 939 ; N a12 ; B 35 134 904 559 ;
+C 44 ; WX 549 ; N a13 ; B 29 -11 516 705 ;
+C 45 ; WX 855 ; N a14 ; B 34 59 820 632 ;
+C 46 ; WX 911 ; N a15 ; B 35 50 876 642 ;
+C 47 ; WX 933 ; N a16 ; B 35 139 899 550 ;
+C 48 ; WX 911 ; N a105 ; B 35 50 876 642 ;
+C 49 ; WX 945 ; N a17 ; B 35 139 909 553 ;
+C 50 ; WX 974 ; N a18 ; B 35 104 938 587 ;
+C 51 ; WX 755 ; N a19 ; B 34 -13 721 705 ;
+C 52 ; WX 846 ; N a20 ; B 36 -14 811 705 ;
+C 53 ; WX 762 ; N a21 ; B 35 0 727 692 ;
+C 54 ; WX 761 ; N a22 ; B 35 0 727 692 ;
+C 55 ; WX 571 ; N a23 ; B -1 -68 571 661 ;
+C 56 ; WX 677 ; N a24 ; B 36 -13 642 705 ;
+C 57 ; WX 763 ; N a25 ; B 35 0 728 692 ;
+C 58 ; WX 760 ; N a26 ; B 35 0 726 692 ;
+C 59 ; WX 759 ; N a27 ; B 35 0 725 692 ;
+C 60 ; WX 754 ; N a28 ; B 35 0 720 692 ;
+C 61 ; WX 494 ; N a6 ; B 35 0 460 692 ;
+C 62 ; WX 552 ; N a7 ; B 35 0 517 692 ;
+C 63 ; WX 537 ; N a8 ; B 35 0 503 692 ;
+C 64 ; WX 577 ; N a9 ; B 35 96 542 596 ;
+C 65 ; WX 692 ; N a10 ; B 35 -14 657 705 ;
+C 66 ; WX 786 ; N a29 ; B 35 -14 751 705 ;
+C 67 ; WX 788 ; N a30 ; B 35 -14 752 705 ;
+C 68 ; WX 788 ; N a31 ; B 35 -14 753 705 ;
+C 69 ; WX 790 ; N a32 ; B 35 -14 756 705 ;
+C 70 ; WX 793 ; N a33 ; B 35 -13 759 705 ;
+C 71 ; WX 794 ; N a34 ; B 35 -13 759 705 ;
+C 72 ; WX 816 ; N a35 ; B 35 -14 782 705 ;
+C 73 ; WX 823 ; N a36 ; B 35 -14 787 705 ;
+C 74 ; WX 789 ; N a37 ; B 35 -14 754 705 ;
+C 75 ; WX 841 ; N a38 ; B 35 -14 807 705 ;
+C 76 ; WX 823 ; N a39 ; B 35 -14 789 705 ;
+C 77 ; WX 833 ; N a40 ; B 35 -14 798 705 ;
+C 78 ; WX 816 ; N a41 ; B 35 -13 782 705 ;
+C 79 ; WX 831 ; N a42 ; B 35 -14 796 705 ;
+C 80 ; WX 923 ; N a43 ; B 35 -14 888 705 ;
+C 81 ; WX 744 ; N a44 ; B 35 0 710 692 ;
+C 82 ; WX 723 ; N a45 ; B 35 0 688 692 ;
+C 83 ; WX 749 ; N a46 ; B 35 0 714 692 ;
+C 84 ; WX 790 ; N a47 ; B 34 -14 756 705 ;
+C 85 ; WX 792 ; N a48 ; B 35 -14 758 705 ;
+C 86 ; WX 695 ; N a49 ; B 35 -14 661 706 ;
+C 87 ; WX 776 ; N a50 ; B 35 -6 741 699 ;
+C 88 ; WX 768 ; N a51 ; B 35 -7 734 699 ;
+C 89 ; WX 792 ; N a52 ; B 35 -14 757 705 ;
+C 90 ; WX 759 ; N a53 ; B 35 0 725 692 ;
+C 91 ; WX 707 ; N a54 ; B 35 -13 672 704 ;
+C 92 ; WX 708 ; N a55 ; B 35 -14 672 705 ;
+C 93 ; WX 682 ; N a56 ; B 35 -14 647 705 ;
+C 94 ; WX 701 ; N a57 ; B 35 -14 666 705 ;
+C 95 ; WX 826 ; N a58 ; B 35 -14 791 705 ;
+C 96 ; WX 815 ; N a59 ; B 35 -14 780 705 ;
+C 97 ; WX 789 ; N a60 ; B 35 -14 754 705 ;
+C 98 ; WX 789 ; N a61 ; B 35 -14 754 705 ;
+C 99 ; WX 707 ; N a62 ; B 34 -14 673 705 ;
+C 100 ; WX 687 ; N a63 ; B 36 0 651 692 ;
+C 101 ; WX 696 ; N a64 ; B 35 0 661 691 ;
+C 102 ; WX 689 ; N a65 ; B 35 0 655 692 ;
+C 103 ; WX 786 ; N a66 ; B 34 -14 751 705 ;
+C 104 ; WX 787 ; N a67 ; B 35 -14 752 705 ;
+C 105 ; WX 713 ; N a68 ; B 35 -14 678 705 ;
+C 106 ; WX 791 ; N a69 ; B 35 -14 756 705 ;
+C 107 ; WX 785 ; N a70 ; B 36 -14 751 705 ;
+C 108 ; WX 791 ; N a71 ; B 35 -14 757 705 ;
+C 109 ; WX 873 ; N a72 ; B 35 -14 838 705 ;
+C 110 ; WX 761 ; N a73 ; B 35 0 726 692 ;
+C 111 ; WX 762 ; N a74 ; B 35 0 727 692 ;
+C 112 ; WX 762 ; N a203 ; B 35 0 727 692 ;
+C 113 ; WX 759 ; N a75 ; B 35 0 725 692 ;
+C 114 ; WX 759 ; N a204 ; B 35 0 725 692 ;
+C 115 ; WX 892 ; N a76 ; B 35 0 858 705 ;
+C 116 ; WX 892 ; N a77 ; B 35 -14 858 692 ;
+C 117 ; WX 788 ; N a78 ; B 35 -14 754 705 ;
+C 118 ; WX 784 ; N a79 ; B 35 -14 749 705 ;
+C 119 ; WX 438 ; N a81 ; B 35 -14 403 705 ;
+C 120 ; WX 138 ; N a82 ; B 35 0 104 692 ;
+C 121 ; WX 277 ; N a83 ; B 35 0 242 692 ;
+C 122 ; WX 415 ; N a84 ; B 35 0 380 692 ;
+C 123 ; WX 392 ; N a97 ; B 35 263 357 705 ;
+C 124 ; WX 392 ; N a98 ; B 34 263 357 705 ;
+C 125 ; WX 668 ; N a99 ; B 35 263 633 705 ;
+C 126 ; WX 668 ; N a100 ; B 36 263 634 705 ;
+C 161 ; WX 732 ; N a101 ; B 35 -143 697 806 ;
+C 162 ; WX 544 ; N a102 ; B 56 -14 488 706 ;
+C 163 ; WX 544 ; N a103 ; B 34 -14 508 705 ;
+C 164 ; WX 910 ; N a104 ; B 35 40 875 651 ;
+C 165 ; WX 667 ; N a106 ; B 35 -14 633 705 ;
+C 166 ; WX 760 ; N a107 ; B 35 -14 726 705 ;
+C 167 ; WX 760 ; N a108 ; B 0 121 758 569 ;
+C 168 ; WX 776 ; N a112 ; B 35 0 741 705 ;
+C 169 ; WX 595 ; N a111 ; B 34 -14 560 705 ;
+C 170 ; WX 694 ; N a110 ; B 35 -14 659 705 ;
+C 171 ; WX 626 ; N a109 ; B 34 0 591 705 ;
+C 172 ; WX 788 ; N a120 ; B 35 -14 754 705 ;
+C 173 ; WX 788 ; N a121 ; B 35 -14 754 705 ;
+C 174 ; WX 788 ; N a122 ; B 35 -14 754 705 ;
+C 175 ; WX 788 ; N a123 ; B 35 -14 754 705 ;
+C 176 ; WX 788 ; N a124 ; B 35 -14 754 705 ;
+C 177 ; WX 788 ; N a125 ; B 35 -14 754 705 ;
+C 178 ; WX 788 ; N a126 ; B 35 -14 754 705 ;
+C 179 ; WX 788 ; N a127 ; B 35 -14 754 705 ;
+C 180 ; WX 788 ; N a128 ; B 35 -14 754 705 ;
+C 181 ; WX 788 ; N a129 ; B 35 -14 754 705 ;
+C 182 ; WX 788 ; N a130 ; B 35 -14 754 705 ;
+C 183 ; WX 788 ; N a131 ; B 35 -14 754 705 ;
+C 184 ; WX 788 ; N a132 ; B 35 -14 754 705 ;
+C 185 ; WX 788 ; N a133 ; B 35 -14 754 705 ;
+C 186 ; WX 788 ; N a134 ; B 35 -14 754 705 ;
+C 187 ; WX 788 ; N a135 ; B 35 -14 754 705 ;
+C 188 ; WX 788 ; N a136 ; B 35 -14 754 705 ;
+C 189 ; WX 788 ; N a137 ; B 35 -14 754 705 ;
+C 190 ; WX 788 ; N a138 ; B 35 -14 754 705 ;
+C 191 ; WX 788 ; N a139 ; B 35 -14 754 705 ;
+C 192 ; WX 788 ; N a140 ; B 35 -14 754 705 ;
+C 193 ; WX 788 ; N a141 ; B 35 -14 754 705 ;
+C 194 ; WX 788 ; N a142 ; B 35 -14 754 705 ;
+C 195 ; WX 788 ; N a143 ; B 35 -14 754 705 ;
+C 196 ; WX 788 ; N a144 ; B 35 -14 754 705 ;
+C 197 ; WX 788 ; N a145 ; B 35 -14 754 705 ;
+C 198 ; WX 788 ; N a146 ; B 35 -14 754 705 ;
+C 199 ; WX 788 ; N a147 ; B 35 -14 754 705 ;
+C 200 ; WX 788 ; N a148 ; B 35 -14 754 705 ;
+C 201 ; WX 788 ; N a149 ; B 35 -14 754 705 ;
+C 202 ; WX 788 ; N a150 ; B 35 -14 754 705 ;
+C 203 ; WX 788 ; N a151 ; B 35 -14 754 705 ;
+C 204 ; WX 788 ; N a152 ; B 35 -14 754 705 ;
+C 205 ; WX 788 ; N a153 ; B 35 -14 754 705 ;
+C 206 ; WX 788 ; N a154 ; B 35 -14 754 705 ;
+C 207 ; WX 788 ; N a155 ; B 35 -14 754 705 ;
+C 208 ; WX 788 ; N a156 ; B 35 -14 754 705 ;
+C 209 ; WX 788 ; N a157 ; B 35 -14 754 705 ;
+C 210 ; WX 788 ; N a158 ; B 35 -14 754 705 ;
+C 211 ; WX 788 ; N a159 ; B 35 -14 754 705 ;
+C 212 ; WX 894 ; N a160 ; B 35 58 860 634 ;
+C 213 ; WX 838 ; N a161 ; B 35 152 803 540 ;
+C 214 ; WX 1016 ; N a163 ; B 34 152 981 540 ;
+C 215 ; WX 458 ; N a164 ; B 35 -127 422 820 ;
+C 216 ; WX 748 ; N a196 ; B 35 94 698 597 ;
+C 217 ; WX 924 ; N a165 ; B 35 140 890 552 ;
+C 218 ; WX 748 ; N a192 ; B 35 94 698 597 ;
+C 219 ; WX 918 ; N a166 ; B 35 166 884 526 ;
+C 220 ; WX 927 ; N a167 ; B 35 32 892 660 ;
+C 221 ; WX 928 ; N a168 ; B 35 129 891 562 ;
+C 222 ; WX 928 ; N a169 ; B 35 128 893 563 ;
+C 223 ; WX 834 ; N a170 ; B 35 155 799 537 ;
+C 224 ; WX 873 ; N a171 ; B 35 93 838 599 ;
+C 225 ; WX 828 ; N a172 ; B 35 104 791 588 ;
+C 226 ; WX 924 ; N a173 ; B 35 98 889 594 ;
+C 227 ; WX 924 ; N a162 ; B 35 98 889 594 ;
+C 228 ; WX 917 ; N a174 ; B 35 0 882 692 ;
+C 229 ; WX 930 ; N a175 ; B 35 84 896 608 ;
+C 230 ; WX 931 ; N a176 ; B 35 84 896 608 ;
+C 231 ; WX 463 ; N a177 ; B 35 -99 429 791 ;
+C 232 ; WX 883 ; N a178 ; B 35 71 848 623 ;
+C 233 ; WX 836 ; N a179 ; B 35 44 802 648 ;
+C 234 ; WX 836 ; N a193 ; B 35 44 802 648 ;
+C 235 ; WX 867 ; N a180 ; B 35 101 832 591 ;
+C 236 ; WX 867 ; N a199 ; B 35 101 832 591 ;
+C 237 ; WX 696 ; N a181 ; B 35 44 661 648 ;
+C 238 ; WX 696 ; N a200 ; B 35 44 661 648 ;
+C 239 ; WX 874 ; N a182 ; B 35 77 840 619 ;
+C 241 ; WX 874 ; N a201 ; B 35 73 840 615 ;
+C 242 ; WX 760 ; N a183 ; B 35 0 725 692 ;
+C 243 ; WX 946 ; N a184 ; B 35 160 911 533 ;
+C 244 ; WX 771 ; N a197 ; B 34 37 736 655 ;
+C 245 ; WX 865 ; N a185 ; B 35 207 830 481 ;
+C 246 ; WX 771 ; N a194 ; B 34 37 736 655 ;
+C 247 ; WX 888 ; N a198 ; B 34 -19 853 712 ;
+C 248 ; WX 967 ; N a186 ; B 35 124 932 568 ;
+C 249 ; WX 888 ; N a195 ; B 34 -19 853 712 ;
+C 250 ; WX 831 ; N a187 ; B 35 113 796 579 ;
+C 251 ; WX 873 ; N a188 ; B 36 118 838 578 ;
+C 252 ; WX 927 ; N a189 ; B 35 150 891 542 ;
+C 253 ; WX 970 ; N a190 ; B 35 76 931 616 ;
+C 254 ; WX 918 ; N a191 ; B 34 99 884 593 ;
+C -1 ; WX 410 ; N a86 ; B 35 0 375 692 ;
+C -1 ; WX 509 ; N a85 ; B 35 0 475 692 ;
+C -1 ; WX 334 ; N a95 ; B 35 0 299 692 ;
+C -1 ; WX 509 ; N a205 ; B 35 0 475 692 ;
+C -1 ; WX 390 ; N a89 ; B 35 -14 356 705 ;
+C -1 ; WX 234 ; N a87 ; B 35 -14 199 705 ;
+C -1 ; WX 276 ; N a91 ; B 35 0 242 692 ;
+C -1 ; WX 390 ; N a90 ; B 35 -14 355 705 ;
+C -1 ; WX 410 ; N a206 ; B 35 0 375 692 ;
+C -1 ; WX 317 ; N a94 ; B 35 0 283 692 ;
+C -1 ; WX 317 ; N a93 ; B 35 0 283 692 ;
+C -1 ; WX 276 ; N a92 ; B 35 0 242 692 ;
+C -1 ; WX 334 ; N a96 ; B 35 0 299 692 ;
+C -1 ; WX 234 ; N a88 ; B 35 -14 199 705 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/font/devps/old/zapfdr.ps b/font/devps/old/zapfdr.ps
new file mode 100644
index 0000000..d7ec086
--- /dev/null
+++ b/font/devps/old/zapfdr.ps
@@ -0,0 +1,225 @@
+%!PS-Adobe-3.0 Resource-Font
+%%DocumentNeededResources: font ZapfDingbats
+%%EndComments
+%%IncludeResource: font ZapfDingbats
+
+/ZapfDingbats findfont [-1 0 0 1 0 0] makefont
+
+dup length 1 add dict begin
+{
+ exch dup dup /FID ne exch /UniqueID ne and {
+ exch def
+ } {
+ pop pop
+ } ifelse
+} forall
+
+/FontName /ZapfDingbats-Reverse def
+
+/Metrics 202 dict dup begin
+ /space [0 -278] def
+ /a1 [-939 -974] def
+ /a2 [-926 -961] def
+ /a202 [-939 -974] def
+ /a3 [-945 -980] def
+ /a4 [-685 -719] def
+ /a5 [-754 -789] def
+ /a119 [-755 -790] def
+ /a118 [-756 -791] def
+ /a117 [-655 -690] def
+ /a11 [-925 -960] def
+ /a12 [-904 -939] def
+ /a13 [-520 -549] def
+ /a14 [-821 -855] def
+ /a15 [-876 -911] def
+ /a16 [-898 -933] def
+ /a105 [-876 -911] def
+ /a17 [-910 -945] def
+ /a18 [-939 -974] def
+ /a19 [-721 -755] def
+ /a20 [-811 -846] def
+ /a21 [-727 -762] def
+ /a22 [-726 -761] def
+ /a23 [-572 -571] def
+ /a24 [-641 -677] def
+ /a25 [-728 -763] def
+ /a26 [-725 -760] def
+ /a27 [-724 -759] def
+ /a28 [-719 -754] def
+ /a6 [-459 -494] def
+ /a7 [-517 -552] def
+ /a8 [-502 -537] def
+ /a9 [-542 -577] def
+ /a10 [-657 -692] def
+ /a29 [-751 -786] def
+ /a30 [-753 -788] def
+ /a31 [-753 -788] def
+ /a32 [-755 -790] def
+ /a33 [-758 -793] def
+ /a34 [-759 -794] def
+ /a35 [-781 -816] def
+ /a36 [-788 -823] def
+ /a37 [-754 -789] def
+ /a38 [-806 -841] def
+ /a39 [-788 -823] def
+ /a40 [-798 -833] def
+ /a41 [-781 -816] def
+ /a42 [-796 -831] def
+ /a43 [-888 -923] def
+ /a44 [-709 -744] def
+ /a45 [-688 -723] def
+ /a46 [-714 -749] def
+ /a47 [-756 -790] def
+ /a48 [-757 -792] def
+ /a49 [-660 -695] def
+ /a50 [-741 -776] def
+ /a51 [-733 -768] def
+ /a52 [-757 -792] def
+ /a53 [-724 -759] def
+ /a54 [-672 -707] def
+ /a55 [-673 -708] def
+ /a56 [-647 -682] def
+ /a57 [-666 -701] def
+ /a58 [-791 -826] def
+ /a59 [-780 -815] def
+ /a60 [-754 -789] def
+ /a61 [-754 -789] def
+ /a62 [-673 -707] def
+ /a63 [-651 -687] def
+ /a64 [-661 -696] def
+ /a65 [-654 -689] def
+ /a66 [-752 -786] def
+ /a67 [-752 -787] def
+ /a68 [-678 -713] def
+ /a69 [-756 -791] def
+ /a70 [-749 -785] def
+ /a71 [-756 -791] def
+ /a72 [-838 -873] def
+ /a73 [-726 -761] def
+ /a74 [-727 -762] def
+ /a203 [-727 -762] def
+ /a75 [-724 -759] def
+ /a204 [-724 -759] def
+ /a76 [-857 -892] def
+ /a77 [-857 -892] def
+ /a78 [-753 -788] def
+ /a79 [-749 -784] def
+ /a81 [-403 -438] def
+ /a82 [-103 -138] def
+ /a83 [-242 -277] def
+ /a84 [-380 -415] def
+ /a97 [-357 -392] def
+ /a98 [-358 -392] def
+ /a99 [-633 -668] def
+ /a100 [-632 -668] def
+ /a101 [-697 -732] def
+ /a102 [-488 -544] def
+ /a103 [-510 -544] def
+ /a104 [-875 -910] def
+ /a106 [-632 -667] def
+ /a107 [-725 -760] def
+ /a108 [-760 -760] def
+ /a112 [-741 -776] def
+ /a111 [-561 -595] def
+ /a110 [-659 -694] def
+ /a109 [-592 -626] def
+ /a120 [-753 -788] def
+ /a121 [-753 -788] def
+ /a122 [-753 -788] def
+ /a123 [-753 -788] def
+ /a124 [-753 -788] def
+ /a125 [-753 -788] def
+ /a126 [-753 -788] def
+ /a127 [-753 -788] def
+ /a128 [-753 -788] def
+ /a129 [-753 -788] def
+ /a130 [-753 -788] def
+ /a131 [-753 -788] def
+ /a132 [-753 -788] def
+ /a133 [-753 -788] def
+ /a134 [-753 -788] def
+ /a135 [-753 -788] def
+ /a136 [-753 -788] def
+ /a137 [-753 -788] def
+ /a138 [-753 -788] def
+ /a139 [-753 -788] def
+ /a140 [-753 -788] def
+ /a141 [-753 -788] def
+ /a142 [-753 -788] def
+ /a143 [-753 -788] def
+ /a144 [-753 -788] def
+ /a145 [-753 -788] def
+ /a146 [-753 -788] def
+ /a147 [-753 -788] def
+ /a148 [-753 -788] def
+ /a149 [-753 -788] def
+ /a150 [-753 -788] def
+ /a151 [-753 -788] def
+ /a152 [-753 -788] def
+ /a153 [-753 -788] def
+ /a154 [-753 -788] def
+ /a155 [-753 -788] def
+ /a156 [-753 -788] def
+ /a157 [-753 -788] def
+ /a158 [-753 -788] def
+ /a159 [-753 -788] def
+ /a160 [-859 -894] def
+ /a161 [-803 -838] def
+ /a163 [-982 -1016] def
+ /a164 [-423 -458] def
+ /a196 [-713 -748] def
+ /a165 [-889 -924] def
+ /a192 [-713 -748] def
+ /a166 [-883 -918] def
+ /a167 [-892 -927] def
+ /a168 [-893 -928] def
+ /a169 [-893 -928] def
+ /a170 [-799 -834] def
+ /a171 [-838 -873] def
+ /a172 [-793 -828] def
+ /a173 [-889 -924] def
+ /a162 [-889 -924] def
+ /a174 [-882 -917] def
+ /a175 [-895 -930] def
+ /a176 [-896 -931] def
+ /a177 [-428 -463] def
+ /a178 [-848 -883] def
+ /a179 [-801 -836] def
+ /a193 [-801 -836] def
+ /a180 [-832 -867] def
+ /a199 [-832 -867] def
+ /a181 [-661 -696] def
+ /a200 [-661 -696] def
+ /a182 [-839 -874] def
+ /a201 [-839 -874] def
+ /a183 [-725 -760] def
+ /a184 [-911 -946] def
+ /a197 [-737 -771] def
+ /a185 [-830 -865] def
+ /a194 [-737 -771] def
+ /a198 [-854 -888] def
+ /a186 [-932 -967] def
+ /a195 [-854 -888] def
+ /a187 [-796 -831] def
+ /a188 [-837 -873] def
+ /a189 [-892 -927] def
+ /a190 [-935 -970] def
+ /a191 [-884 -918] def
+ /a205 [-474 -509] def
+ /a206 [-375 -410] def
+ /a85 [-474 -509] def
+ /a86 [-375 -410] def
+ /a87 [-199 -234] def
+ /a88 [-199 -234] def
+ /a89 [-355 -390] def
+ /a90 [-355 -390] def
+ /a91 [-241 -276] def
+ /a92 [-241 -276] def
+ /a93 [-282 -317] def
+ /a94 [-282 -317] def
+ /a95 [-299 -334] def
+ /a96 [-299 -334] def
+
+end def
+
+/ZapfDingbats-Reverse currentdict end definefont pop
diff --git a/font/devps/prologue.ps b/font/devps/prologue.ps
new file mode 100644
index 0000000..a69a15a
--- /dev/null
+++ b/font/devps/prologue.ps
@@ -0,0 +1,261 @@
+%!PS-Adobe-3.0 Resource-ProcSet
+
+/setpacking where {
+ pop
+ currentpacking
+ true setpacking
+} if
+
+/grops 120 dict dup begin
+
+% The ASCII code of the space character.
+/SC 32 def
+
+/A /show load def
+/B { 0 SC 3 -1 roll widthshow } bind def
+/C { 0 exch ashow } bind def
+/D { 0 exch 0 SC 5 2 roll awidthshow } bind def
+/E { 0 rmoveto show } bind def
+/F { 0 rmoveto 0 SC 3 -1 roll widthshow } bind def
+/G { 0 rmoveto 0 exch ashow } bind def
+/H { 0 rmoveto 0 exch 0 SC 5 2 roll awidthshow } bind def
+/I { 0 exch rmoveto show } bind def
+/J { 0 exch rmoveto 0 SC 3 -1 roll widthshow } bind def
+/K { 0 exch rmoveto 0 exch ashow } bind def
+/L { 0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow } bind def
+/M { rmoveto show } bind def
+/N { rmoveto 0 SC 3 -1 roll widthshow } bind def
+/O { rmoveto 0 exch ashow } bind def
+/P { rmoveto 0 exch 0 SC 5 2 roll awidthshow } bind def
+/Q { moveto show } bind def
+/R { moveto 0 SC 3 -1 roll widthshow } bind def
+/S { moveto 0 exch ashow } bind def
+/T { moveto 0 exch 0 SC 5 2 roll awidthshow } bind def
+
+% name size font SF -
+
+/SF {
+ findfont exch
+ [ exch dup 0 exch 0 exch neg 0 0 ] makefont
+ dup setfont
+ [ exch /setfont cvx ] cvx bind def
+} bind def
+
+% name a c d font MF -
+
+/MF {
+ findfont
+ [ 5 2 roll
+ 0 3 1 roll % b
+ neg 0 0 ] makefont
+ dup setfont
+ [ exch /setfont cvx ] cvx bind def
+} bind def
+
+/level0 0 def
+/RES 0 def
+/PL 0 def
+/LS 0 def
+
+% Enable manual feed.
+% MANUAL -
+
+/MANUAL {
+ statusdict begin /manualfeed true store end
+} bind def
+
+% Guess the page length.
+% This assumes that the imageable area is vertically centered on the page.
+% PLG - length
+
+/PLG {
+ gsave newpath clippath pathbbox grestore
+ exch pop add exch pop
+} bind def
+
+% BP -
+
+/BP {
+ /level0 save def
+ 1 setlinecap
+ 1 setlinejoin
+ DEFS /BPhook known { DEFS begin BPhook end } if
+ 72 RES div dup scale
+ LS {
+ 90 rotate
+ } {
+ 0 PL translate
+ } ifelse
+ 1 -1 scale
+} bind def
+
+/EP {
+ level0 restore
+ showpage
+} def
+
+
+% centerx centery radius startangle endangle DA -
+
+/DA {
+ newpath arcn stroke
+} bind def
+
+% x y SN - x' y'
+% round a position to nearest (pixel + (.25,.25))
+
+/SN {
+ transform
+ .25 sub exch .25 sub exch
+ round .25 add exch round .25 add exch
+ itransform
+} bind def
+
+% endx endy startx starty DL -
+% we round the endpoints of the line, so that parallel horizontal
+% and vertical lines will appear even
+
+/DL {
+ SN
+ moveto
+ SN
+ lineto stroke
+} bind def
+
+% centerx centery radius DC -
+
+/DC {
+ newpath 0 360 arc closepath
+} bind def
+
+
+/TM matrix def
+
+% width height centerx centery DE -
+
+/DE {
+ TM currentmatrix pop
+ translate scale newpath 0 0 .5 0 360 arc closepath
+ TM setmatrix
+} bind def
+
+% these are for splines
+
+/RC /rcurveto load def
+/RL /rlineto load def
+/ST /stroke load def
+/MT /moveto load def
+/CL /closepath load def
+
+% fill the last path
+
+% r g b Fr -
+
+/Fr {
+ setrgbcolor fill
+} bind def
+
+% c m y k Fk -
+
+/setcmykcolor where {
+ pop
+ /Fk {
+ setcmykcolor fill
+ } bind def
+} if
+
+% g Fg -
+
+/Fg {
+ setgray fill
+} bind def
+
+% fill with the "current color"
+
+/FL /fill load def
+
+/LW /setlinewidth load def
+
+/Cr /setrgbcolor load def
+/setcmykcolor where {
+ pop
+ /Ck /setcmykcolor load def
+} if
+/Cg /setgray load def
+
+% new_font_name encoding_vector old_font_name RE -
+
+/RE {
+ findfont
+ dup maxlength 1 index /FontName known not { 1 add } if dict begin
+ {
+ 1 index /FID ne
+ 2 index /UniqueID ne
+ and
+ { def } { pop pop } ifelse
+ } forall
+ /Encoding exch def
+ dup /FontName exch def
+ currentdict end definefont pop
+} bind def
+
+/DEFS 0 def
+
+% hpos vpos EBEGIN -
+
+/EBEGIN {
+ moveto
+ DEFS begin
+} bind def
+
+/EEND /end load def
+
+/CNT 0 def
+/level1 0 def
+
+% llx lly newwid wid newht ht newllx newlly PBEGIN -
+
+/PBEGIN {
+ /level1 save def
+ translate
+ div 3 1 roll div exch scale
+ neg exch neg exch translate
+ % set the graphics state to default values
+ 0 setgray
+ 0 setlinecap
+ 1 setlinewidth
+ 0 setlinejoin
+ 10 setmiterlimit
+ [] 0 setdash
+ /setstrokeadjust where {
+ pop
+ false setstrokeadjust
+ } if
+ /setoverprint where {
+ pop
+ false setoverprint
+ } if
+ newpath
+ /CNT countdictstack def
+ userdict begin
+ /showpage {} def
+ %
+ % Any included setpagedevice should be ignored.
+ % See: http://www.w-beer.de/doc/ps/.
+ %
+ /setpagedevice {} def
+ mark
+} bind def
+
+/PEND {
+ cleartomark
+ countdictstack CNT sub { end } repeat
+ level1 restore
+} bind def
+
+end def
+
+/setpacking where {
+ pop
+ setpacking
+} if
diff --git a/font/devps/psstrip.sed b/font/devps/psstrip.sed
new file mode 100644
index 0000000..47501d1
--- /dev/null
+++ b/font/devps/psstrip.sed
@@ -0,0 +1,6 @@
+/^%/b
+s/^[ ][ ]*//
+s/[ ][ ]*$//
+/^$/d
+s|[ ]*\([][}{/]\)|\1|g
+s|\([][}{/]\)[ ]*|\1|g
diff --git a/font/devps/symbol.afm b/font/devps/symbol.afm
new file mode 100644
index 0000000..c39c2d9
--- /dev/null
+++ b/font/devps/symbol.afm
@@ -0,0 +1,215 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved.
+Comment Creation Date: Thu May 1 15:12:25 1997
+Comment UniqueID 43064
+Comment VMusage 30820 39997
+FontName Symbol
+FullName Symbol
+FamilyName Symbol
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -180 -293 1090 1010
+UnderlinePosition -100
+UnderlineThickness 50
+Version 001.008
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved.
+EncodingScheme FontSpecific
+StdHW 92
+StdVW 85
+StartCharMetrics 190
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 128 -17 240 672 ;
+C 34 ; WX 713 ; N universal ; B 31 0 681 705 ;
+C 35 ; WX 500 ; N numbersign ; B 20 -16 481 673 ;
+C 36 ; WX 549 ; N existential ; B 25 0 478 707 ;
+C 37 ; WX 833 ; N percent ; B 63 -36 771 655 ;
+C 38 ; WX 778 ; N ampersand ; B 41 -18 750 661 ;
+C 39 ; WX 439 ; N suchthat ; B 48 -17 414 500 ;
+C 40 ; WX 333 ; N parenleft ; B 53 -191 300 673 ;
+C 41 ; WX 333 ; N parenright ; B 30 -191 277 673 ;
+C 42 ; WX 500 ; N asteriskmath ; B 65 134 427 551 ;
+C 43 ; WX 549 ; N plus ; B 10 0 539 533 ;
+C 44 ; WX 250 ; N comma ; B 56 -152 194 104 ;
+C 45 ; WX 549 ; N minus ; B 11 233 535 288 ;
+C 46 ; WX 250 ; N period ; B 69 -17 181 95 ;
+C 47 ; WX 278 ; N slash ; B 0 -18 254 646 ;
+C 48 ; WX 500 ; N zero ; B 24 -14 476 685 ;
+C 49 ; WX 500 ; N one ; B 117 0 390 673 ;
+C 50 ; WX 500 ; N two ; B 25 0 475 685 ;
+C 51 ; WX 500 ; N three ; B 43 -14 435 685 ;
+C 52 ; WX 500 ; N four ; B 15 0 469 685 ;
+C 53 ; WX 500 ; N five ; B 32 -14 445 690 ;
+C 54 ; WX 500 ; N six ; B 34 -14 468 685 ;
+C 55 ; WX 500 ; N seven ; B 24 -16 448 673 ;
+C 56 ; WX 500 ; N eight ; B 56 -14 445 685 ;
+C 57 ; WX 500 ; N nine ; B 30 -18 459 685 ;
+C 58 ; WX 278 ; N colon ; B 81 -17 193 460 ;
+C 59 ; WX 278 ; N semicolon ; B 83 -152 221 460 ;
+C 60 ; WX 549 ; N less ; B 26 0 523 522 ;
+C 61 ; WX 549 ; N equal ; B 11 141 537 390 ;
+C 62 ; WX 549 ; N greater ; B 26 0 523 522 ;
+C 63 ; WX 444 ; N question ; B 70 -17 412 686 ;
+C 64 ; WX 549 ; N congruent ; B 11 0 537 475 ;
+C 65 ; WX 722 ; N Alpha ; B 4 0 684 673 ;
+C 66 ; WX 667 ; N Beta ; B 29 0 592 673 ;
+C 67 ; WX 722 ; N Chi ; B -9 0 704 673 ;
+C 68 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C 69 ; WX 611 ; N Epsilon ; B 32 0 617 673 ;
+C 70 ; WX 763 ; N Phi ; B 26 0 741 673 ;
+C 71 ; WX 603 ; N Gamma ; B 24 0 609 673 ;
+C 72 ; WX 722 ; N Eta ; B 39 0 729 673 ;
+C 73 ; WX 333 ; N Iota ; B 32 0 316 673 ;
+C 74 ; WX 631 ; N theta1 ; B 18 -18 623 689 ;
+C 75 ; WX 722 ; N Kappa ; B 35 0 722 673 ;
+C 76 ; WX 686 ; N Lambda ; B 6 0 680 688 ;
+C 77 ; WX 889 ; N Mu ; B 28 0 887 673 ;
+C 78 ; WX 722 ; N Nu ; B 29 -8 720 673 ;
+C 79 ; WX 722 ; N Omicron ; B 41 -17 715 685 ;
+C 80 ; WX 768 ; N Pi ; B 25 0 745 673 ;
+C 81 ; WX 741 ; N Theta ; B 41 -17 715 685 ;
+C 82 ; WX 556 ; N Rho ; B 28 0 563 673 ;
+C 83 ; WX 592 ; N Sigma ; B 5 0 589 673 ;
+C 84 ; WX 611 ; N Tau ; B 33 0 607 673 ;
+C 85 ; WX 690 ; N Upsilon ; B -8 0 694 673 ;
+C 86 ; WX 439 ; N sigma1 ; B 40 -233 436 500 ;
+C 87 ; WX 768 ; N Omega ; B 34 0 736 688 ;
+C 88 ; WX 645 ; N Xi ; B 40 0 599 673 ;
+C 89 ; WX 795 ; N Psi ; B 15 0 781 684 ;
+C 90 ; WX 611 ; N Zeta ; B 44 0 636 673 ;
+C 91 ; WX 333 ; N bracketleft ; B 86 -155 299 674 ;
+C 92 ; WX 863 ; N therefore ; B 163 0 701 487 ;
+C 93 ; WX 333 ; N bracketright ; B 33 -155 246 674 ;
+C 94 ; WX 658 ; N perpendicular ; B 15 0 652 674 ;
+C 95 ; WX 500 ; N underscore ; B -2 -125 502 -75 ;
+C 96 ; WX 500 ; N radicalex ; B 480 881 1090 917 ;
+C 97 ; WX 631 ; N alpha ; B 41 -18 622 500 ;
+C 98 ; WX 549 ; N beta ; B 61 -223 515 741 ;
+C 99 ; WX 549 ; N chi ; B 12 -231 522 499 ;
+C 100 ; WX 494 ; N delta ; B 40 -19 481 740 ;
+C 101 ; WX 439 ; N epsilon ; B 22 -19 427 502 ;
+C 102 ; WX 521 ; N phi ; B 28 -224 492 673 ;
+C 103 ; WX 411 ; N gamma ; B 5 -225 484 499 ;
+C 104 ; WX 603 ; N eta ; B 0 -202 527 514 ;
+C 105 ; WX 329 ; N iota ; B 0 -17 301 503 ;
+C 106 ; WX 603 ; N phi1 ; B 36 -224 587 499 ;
+C 107 ; WX 549 ; N kappa ; B 33 0 558 501 ;
+C 108 ; WX 549 ; N lambda ; B 24 -17 548 739 ;
+C 109 ; WX 576 ; N mu ; B 33 -223 567 500 ;
+C 110 ; WX 521 ; N nu ; B -9 -16 475 507 ;
+C 111 ; WX 549 ; N omicron ; B 35 -19 501 499 ;
+C 112 ; WX 549 ; N pi ; B 10 -19 530 487 ;
+C 113 ; WX 521 ; N theta ; B 43 -17 485 690 ;
+C 114 ; WX 549 ; N rho ; B 50 -230 490 499 ;
+C 115 ; WX 603 ; N sigma ; B 30 -21 588 500 ;
+C 116 ; WX 439 ; N tau ; B 10 -19 418 500 ;
+C 117 ; WX 576 ; N upsilon ; B 7 -18 535 507 ;
+C 118 ; WX 713 ; N omega1 ; B 12 -18 671 583 ;
+C 119 ; WX 686 ; N omega ; B 42 -17 684 500 ;
+C 120 ; WX 493 ; N xi ; B 27 -224 469 766 ;
+C 121 ; WX 686 ; N psi ; B 12 -228 701 500 ;
+C 122 ; WX 494 ; N zeta ; B 60 -225 467 756 ;
+C 123 ; WX 480 ; N braceleft ; B 58 -183 397 673 ;
+C 124 ; WX 200 ; N bar ; B 65 -293 135 707 ;
+C 125 ; WX 480 ; N braceright ; B 79 -183 418 673 ;
+C 126 ; WX 549 ; N similar ; B 17 203 529 307 ;
+C 160 ; WX 750 ; N Euro ; B 20 -12 714 685 ;
+C 161 ; WX 620 ; N Upsilon1 ; B -2 0 610 685 ;
+C 162 ; WX 247 ; N minute ; B 27 459 228 735 ;
+C 163 ; WX 549 ; N lessequal ; B 29 0 526 639 ;
+C 164 ; WX 167 ; N fraction ; B -180 -12 340 677 ;
+C 165 ; WX 713 ; N infinity ; B 26 124 688 404 ;
+C 166 ; WX 500 ; N florin ; B 2 -193 494 686 ;
+C 167 ; WX 753 ; N club ; B 86 -26 660 533 ;
+C 168 ; WX 753 ; N diamond ; B 142 -36 600 550 ;
+C 169 ; WX 753 ; N heart ; B 117 -33 631 532 ;
+C 170 ; WX 753 ; N spade ; B 113 -36 629 548 ;
+C 171 ; WX 1042 ; N arrowboth ; B 24 -15 1024 511 ;
+C 172 ; WX 987 ; N arrowleft ; B 32 -15 942 511 ;
+C 173 ; WX 603 ; N arrowup ; B 45 0 571 910 ;
+C 174 ; WX 987 ; N arrowright ; B 49 -15 959 511 ;
+C 175 ; WX 603 ; N arrowdown ; B 45 -22 571 888 ;
+C 176 ; WX 400 ; N degree ; B 50 385 350 685 ;
+C 177 ; WX 549 ; N plusminus ; B 10 0 539 645 ;
+C 178 ; WX 411 ; N second ; B 20 459 413 737 ;
+C 179 ; WX 549 ; N greaterequal ; B 29 0 526 639 ;
+C 180 ; WX 549 ; N multiply ; B 17 8 533 524 ;
+C 181 ; WX 713 ; N proportional ; B 27 123 639 404 ;
+C 182 ; WX 494 ; N partialdiff ; B 26 -20 462 746 ;
+C 183 ; WX 460 ; N bullet ; B 50 113 410 473 ;
+C 184 ; WX 549 ; N divide ; B 10 71 536 456 ;
+C 185 ; WX 549 ; N notequal ; B 15 -25 540 549 ;
+C 186 ; WX 549 ; N equivalence ; B 14 82 538 443 ;
+C 187 ; WX 549 ; N approxequal ; B 14 135 527 394 ;
+C 188 ; WX 1000 ; N ellipsis ; B 111 -17 889 95 ;
+C 189 ; WX 603 ; N arrowvertex ; B 280 -120 336 1010 ;
+C 190 ; WX 1000 ; N arrowhorizex ; B -60 220 1050 276 ;
+C 191 ; WX 658 ; N carriagereturn ; B 15 -16 602 629 ;
+C 192 ; WX 823 ; N aleph ; B 175 -18 661 658 ;
+C 193 ; WX 686 ; N Ifraktur ; B 10 -53 578 740 ;
+C 194 ; WX 795 ; N Rfraktur ; B 26 -15 759 734 ;
+C 195 ; WX 987 ; N weierstrass ; B 159 -211 870 573 ;
+C 196 ; WX 768 ; N circlemultiply ; B 43 -17 733 673 ;
+C 197 ; WX 768 ; N circleplus ; B 43 -15 733 675 ;
+C 198 ; WX 823 ; N emptyset ; B 39 -24 781 719 ;
+C 199 ; WX 768 ; N intersection ; B 40 0 732 509 ;
+C 200 ; WX 768 ; N union ; B 40 -17 732 492 ;
+C 201 ; WX 713 ; N propersuperset ; B 20 0 673 470 ;
+C 202 ; WX 713 ; N reflexsuperset ; B 20 -125 673 470 ;
+C 203 ; WX 713 ; N notsubset ; B 36 -70 690 540 ;
+C 204 ; WX 713 ; N propersubset ; B 37 0 690 470 ;
+C 205 ; WX 713 ; N reflexsubset ; B 37 -125 690 470 ;
+C 206 ; WX 713 ; N element ; B 45 0 505 468 ;
+C 207 ; WX 713 ; N notelement ; B 45 -58 505 555 ;
+C 208 ; WX 768 ; N angle ; B 26 0 738 673 ;
+C 209 ; WX 713 ; N gradient ; B 36 -19 681 718 ;
+C 210 ; WX 790 ; N registerserif ; B 50 -17 740 673 ;
+C 211 ; WX 790 ; N copyrightserif ; B 51 -15 741 675 ;
+C 212 ; WX 890 ; N trademarkserif ; B 18 293 855 673 ;
+C 213 ; WX 823 ; N product ; B 25 -101 803 751 ;
+C 214 ; WX 549 ; N radical ; B 10 -38 515 917 ;
+C 215 ; WX 250 ; N dotmath ; B 69 210 169 310 ;
+C 216 ; WX 713 ; N logicalnot ; B 15 0 680 288 ;
+C 217 ; WX 603 ; N logicaland ; B 23 0 583 454 ;
+C 218 ; WX 603 ; N logicalor ; B 30 0 578 477 ;
+C 219 ; WX 1042 ; N arrowdblboth ; B 27 -20 1023 510 ;
+C 220 ; WX 987 ; N arrowdblleft ; B 30 -15 939 513 ;
+C 221 ; WX 603 ; N arrowdblup ; B 39 2 567 911 ;
+C 222 ; WX 987 ; N arrowdblright ; B 45 -20 954 508 ;
+C 223 ; WX 603 ; N arrowdbldown ; B 44 -19 572 890 ;
+C 224 ; WX 494 ; N lozenge ; B 18 0 466 745 ;
+C 225 ; WX 329 ; N angleleft ; B 25 -198 306 746 ;
+C 226 ; WX 790 ; N registersans ; B 50 -20 740 670 ;
+C 227 ; WX 790 ; N copyrightsans ; B 49 -15 739 675 ;
+C 228 ; WX 786 ; N trademarksans ; B 5 293 725 673 ;
+C 229 ; WX 713 ; N summation ; B 14 -108 695 752 ;
+C 230 ; WX 384 ; N parenlefttp ; B 24 -293 436 926 ;
+C 231 ; WX 384 ; N parenleftex ; B 24 -80 108 920 ;
+C 232 ; WX 384 ; N parenleftbt ; B 24 -293 436 920 ;
+C 233 ; WX 384 ; N bracketlefttp ; B 0 -75 349 925 ;
+C 234 ; WX 384 ; N bracketleftex ; B 0 -75 77 925 ;
+C 235 ; WX 384 ; N bracketleftbt ; B 0 -75 349 925 ;
+C 236 ; WX 494 ; N bracelefttp ; B 209 -75 445 925 ;
+C 237 ; WX 494 ; N braceleftmid ; B 20 -75 284 925 ;
+C 238 ; WX 494 ; N braceleftbt ; B 209 -75 445 925 ;
+C 239 ; WX 494 ; N braceex ; B 209 -75 284 925 ;
+C 241 ; WX 329 ; N angleright ; B 21 -198 302 746 ;
+C 242 ; WX 274 ; N integral ; B 2 -107 291 916 ;
+C 243 ; WX 686 ; N integraltp ; B 308 -88 675 920 ;
+C 244 ; WX 686 ; N integralex ; B 308 -88 378 975 ;
+C 245 ; WX 686 ; N integralbt ; B 11 -87 378 921 ;
+C 246 ; WX 384 ; N parenrighttp ; B 54 -293 466 926 ;
+C 247 ; WX 384 ; N parenrightex ; B 382 -80 466 920 ;
+C 248 ; WX 384 ; N parenrightbt ; B 54 -293 466 920 ;
+C 249 ; WX 384 ; N bracketrighttp ; B 22 -75 371 925 ;
+C 250 ; WX 384 ; N bracketrightex ; B 294 -75 371 925 ;
+C 251 ; WX 384 ; N bracketrightbt ; B 22 -75 371 925 ;
+C 252 ; WX 494 ; N bracerighttp ; B 48 -75 284 925 ;
+C 253 ; WX 494 ; N bracerightmid ; B 209 -75 473 925 ;
+C 254 ; WX 494 ; N bracerightbt ; B 48 -75 284 925 ;
+C -1 ; WX 790 ; N apple ; B 56 -3 733 808 ;
+EndCharMetrics
+italicCorrection integral 67
+leftItalicCorrection integral 52
+subscriptCorrection integral -10
+EndFontMetrics
diff --git a/font/devps/symbolsl.afm b/font/devps/symbolsl.afm
new file mode 100644
index 0000000..2a28880
--- /dev/null
+++ b/font/devps/symbolsl.afm
@@ -0,0 +1,225 @@
+StartFontMetrics 2.0
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved.
+Comment Creation Date: Thu May 1 15:12:25 1997
+Comment UniqueID 43064
+Comment VMusage 30820 39997
+EncodingScheme FontSpecific
+Comment UniqueID 5021339
+FontName Symbol-Slanted
+Weight Regular
+IsFixedPitch false
+UnderlinePosition -229
+FamilyName Standard Symbols PS
+FullName Standard Symbols PS Slanted
+Version 2.00
+Copyright Copyright URW Software, Copyright 2015 by URW
+ItalicAngle 0.0
+UnderlineThickness 46
+Notice URW Software, Copyright 2015 by URW
+FontBBox -180 -293 1090 1010
+StartCharMetrics 203
+C 32 ; WX 250 ; N space ; B 250 0 250 0 ;
+C 33 ; WX 333 ; N exclam ; B 128 -13 240 686 ;
+C 34 ; WX 713 ; N universal ; B 31 0 681 673 ;
+C 35 ; WX 500 ; N numbersign ; B 20 0 481 631 ;
+C 36 ; WX 549 ; N existential ; B 25 0 478 673 ;
+C 37 ; WX 833 ; N percent ; B 63 -7 771 673 ;
+C 38 ; WX 778 ; N ampersand ; B 41 -13 750 675 ;
+C 39 ; WX 439 ; N suchthat ; B 48 -13 414 503 ;
+C 40 ; WX 333 ; N parenleft ; B 53 -172 300 680 ;
+C 41 ; WX 333 ; N parenright ; B 30 -172 277 680 ;
+C 42 ; WX 500 ; N asteriskmath ; B 65 127 427 546 ;
+C 43 ; WX 549 ; N plus ; B 10 0 539 533 ;
+C 44 ; WX 250 ; N comma ; B 56 -120 194 102 ;
+C 45 ; WX 549 ; N minus ; B 11 239 535 294 ;
+C 46 ; WX 250 ; N period ; B 69 -13 181 100 ;
+C 47 ; WX 278 ; N slash ; B 0 0 254 673 ;
+C 48 ; WX 500 ; N zero ; B 23 -13 471 686 ;
+C 49 ; WX 500 ; N one ; B 117 0 390 673 ;
+C 50 ; WX 500 ; N two ; B 25 0 475 686 ;
+C 51 ; WX 500 ; N three ; B 39 -13 435 686 ;
+C 52 ; WX 500 ; N four ; B 16 0 469 680 ;
+C 53 ; WX 500 ; N five ; B 29 -13 443 699 ;
+C 54 ; WX 500 ; N six ; B 36 -13 467 685 ;
+C 55 ; WX 500 ; N seven ; B 24 -7 448 673 ;
+C 56 ; WX 500 ; N eight ; B 54 -13 440 686 ;
+C 57 ; WX 500 ; N nine ; B 31 -13 460 686 ;
+C 58 ; WX 278 ; N colon ; B 81 -13 193 463 ;
+C 59 ; WX 278 ; N semicolon ; B 83 -120 221 463 ;
+C 60 ; WX 549 ; N less ; B 26 0 523 522 ;
+C 61 ; WX 549 ; N equal ; B 11 142 537 391 ;
+C 62 ; WX 549 ; N greater ; B 26 0 523 522 ;
+C 63 ; WX 444 ; N question ; B 70 -13 412 686 ;
+C 64 ; WX 549 ; N congruent ; B 11 0 537 475 ;
+C 65 ; WX 722 ; N Alpha ; B 4 0 684 673 ;
+C 66 ; WX 667 ; N Beta ; B 29 0 592 673 ;
+C 67 ; WX 722 ; N Chi ; B -9 0 704 673 ;
+C 68 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C 69 ; WX 611 ; N Epsilon ; B 32 0 617 673 ;
+C 70 ; WX 763 ; N Phi ; B 26 0 742 673 ;
+C 71 ; WX 603 ; N Gamma ; B 24 0 609 673 ;
+C 72 ; WX 722 ; N Eta ; B 39 0 729 673 ;
+C 73 ; WX 333 ; N Iota ; B 32 0 316 673 ;
+C 74 ; WX 631 ; N theta1 ; B 18 -13 623 686 ;
+C 75 ; WX 722 ; N Kappa ; B 35 0 722 673 ;
+C 76 ; WX 686 ; N Lambda ; B 6 0 680 688 ;
+C 77 ; WX 889 ; N Mu ; B 28 0 887 673 ;
+C 78 ; WX 722 ; N Nu ; B 29 0 720 673 ;
+C 79 ; WX 722 ; N Omicron ; B 41 -13 715 686 ;
+C 80 ; WX 768 ; N Pi ; B 25 0 745 673 ;
+C 81 ; WX 741 ; N Theta ; B 41 -13 715 686 ;
+C 82 ; WX 556 ; N Rho ; B 28 0 563 673 ;
+C 83 ; WX 592 ; N Sigma ; B 5 0 589 673 ;
+C 84 ; WX 611 ; N Tau ; B 33 0 607 673 ;
+C 85 ; WX 690 ; N Upsilon ; B -8 0 694 673 ;
+C 86 ; WX 439 ; N sigma1 ; B 40 -222 436 513 ;
+C 87 ; WX 768 ; N Omega ; B 34 0 736 686 ;
+C 88 ; WX 645 ; N Xi ; B 40 0 599 673 ;
+C 89 ; WX 795 ; N Psi ; B 15 0 780 686 ;
+C 90 ; WX 611 ; N Zeta ; B 44 0 636 673 ;
+C 91 ; WX 333 ; N bracketleft ; B 86 -165 299 673 ;
+C 92 ; WX 863 ; N therefore ; B 163 -13 701 433 ;
+C 93 ; WX 333 ; N bracketright ; B 33 -165 246 673 ;
+C 94 ; WX 658 ; N perpendicular ; B 15 0 652 673 ;
+C 95 ; WX 500 ; N underscore ; B -2 -252 502 -206 ;
+C 96 ; WX 500 ; N radicalex ; B 480 857 1090 913 ;
+C 97 ; WX 631 ; N alpha ; B 41 -13 622 513 ;
+C 98 ; WX 549 ; N beta ; B 61 -222 515 740 ;
+C 99 ; WX 549 ; N chi ; B 12 -210 522 513 ;
+C 100 ; WX 494 ; N delta ; B 40 -13 481 740 ;
+C 101 ; WX 439 ; N epsilon ; B 22 -13 427 513 ;
+C 102 ; WX 521 ; N phi ; B 27 -222 490 686 ;
+C 103 ; WX 411 ; N gamma ; B 5 -219 484 513 ;
+C 104 ; WX 603 ; N eta ; B 0 -222 527 513 ;
+C 105 ; WX 329 ; N iota ; B 0 -13 301 513 ;
+C 106 ; WX 603 ; N phi1 ; B 36 -222 587 513 ;
+C 107 ; WX 549 ; N kappa ; B 33 0 558 513 ;
+C 108 ; WX 549 ; N lambda ; B 24 -13 548 740 ;
+C 109 ; WX 576 ; N mu ; B 33 -219 567 500 ;
+C 110 ; WX 521 ; N nu ; B -9 -13 475 513 ;
+C 111 ; WX 549 ; N omicron ; B 35 -13 501 513 ;
+C 112 ; WX 549 ; N pi ; B 10 -13 530 500 ;
+C 113 ; WX 521 ; N theta ; B 43 -13 485 686 ;
+C 114 ; WX 549 ; N rho ; B 50 -220 490 513 ;
+C 115 ; WX 603 ; N sigma ; B 30 -13 588 500 ;
+C 116 ; WX 439 ; N tau ; B 10 -13 418 500 ;
+C 117 ; WX 576 ; N upsilon ; B 7 -13 535 513 ;
+C 118 ; WX 713 ; N omega1 ; B 12 -13 671 583 ;
+C 119 ; WX 686 ; N omega ; B 42 -13 684 513 ;
+C 120 ; WX 493 ; N xi ; B 27 -222 469 766 ;
+C 121 ; WX 686 ; N psi ; B 12 -222 701 513 ;
+C 122 ; WX 494 ; N zeta ; B 60 -222 467 756 ;
+C 123 ; WX 480 ; N braceleft ; B 58 -165 397 673 ;
+C 124 ; WX 200 ; N bar ; B 65 -177 135 673 ;
+C 125 ; WX 480 ; N braceright ; B 79 -165 418 673 ;
+C 126 ; WX 549 ; N similar ; B 17 196 529 325 ;
+C 128 ; WX 790 ; N apple ; B 56 -4 733 808 ;
+C 160 ; WX 750 ; N Euro ; B 47 -4 716 671 ;
+C 161 ; WX 620 ; N Upsilon1 ; B -2 0 610 687 ;
+C 162 ; WX 247 ; N minute ; B 27 476 228 735 ;
+C 163 ; WX 549 ; N lessequal ; B 29 0 526 639 ;
+C 164 ; WX 167 ; N fraction ; B -180 0 340 673 ;
+C 165 ; WX 713 ; N infinity ; B 26 115 688 414 ;
+C 166 ; WX 500 ; N florin ; B 2 -174 494 687 ;
+C 167 ; WX 753 ; N club ; B 86 -26 660 544 ;
+C 168 ; WX 753 ; N diamond ; B 142 -36 600 550 ;
+C 169 ; WX 753 ; N heart ; B 117 -33 631 528 ;
+C 170 ; WX 753 ; N spade ; B 113 -36 629 591 ;
+C 171 ; WX 1042 ; N arrowboth ; B 24 -16 1024 512 ;
+C 172 ; WX 987 ; N arrowleft ; B 32 -15 942 511 ;
+C 173 ; WX 603 ; N arrowup ; B 45 0 571 910 ;
+C 174 ; WX 987 ; N arrowright ; B 49 -15 959 511 ;
+C 175 ; WX 603 ; N arrowdown ; B 45 -22 571 888 ;
+C 176 ; WX 400 ; N degree ; B 50 380 350 686 ;
+C 177 ; WX 549 ; N plusminus ; B 10 0 539 662 ;
+C 178 ; WX 411 ; N second ; B 20 476 413 735 ;
+C 179 ; WX 549 ; N greaterequal ; B 29 0 526 639 ;
+C 180 ; WX 549 ; N multiply ; B 17 9 533 525 ;
+C 181 ; WX 713 ; N proportional ; B 27 114 639 413 ;
+C 182 ; WX 494 ; N partialdiff ; B 26 -10 462 753 ;
+C 183 ; WX 460 ; N bullet ; B 50 155 410 518 ;
+C 184 ; WX 549 ; N divide ; B 10 2 536 525 ;
+C 185 ; WX 549 ; N notequal ; B 15 -25 540 549 ;
+C 186 ; WX 549 ; N equivalence ; B 14 87 538 446 ;
+C 187 ; WX 549 ; N approxequal ; B 14 121 527 408 ;
+C 188 ; WX 1000 ; N ellipsis ; B 111 -13 889 100 ;
+C 189 ; WX 603 ; N arrowvertex ; B 280 -120 336 1010 ;
+C 190 ; WX 1000 ; N arrowhorizex ; B -60 220 1050 276 ;
+C 191 ; WX 658 ; N carriagereturn ; B 15 -16 602 629 ;
+C 192 ; WX 823 ; N aleph ; B 175 0 661 689 ;
+C 193 ; WX 686 ; N Ifraktur ; B 10 -54 578 736 ;
+C 194 ; WX 795 ; N Rfraktur ; B 26 -16 759 730 ;
+C 195 ; WX 987 ; N weierstrass ; B 159 -211 870 574 ;
+C 196 ; WX 768 ; N circlemultiply ; B 43 0 733 691 ;
+C 197 ; WX 768 ; N circleplus ; B 43 0 733 689 ;
+C 198 ; WX 823 ; N emptyset ; B 39 -24 781 718 ;
+C 199 ; WX 768 ; N intersection ; B 40 0 732 507 ;
+C 200 ; WX 768 ; N union ; B 40 -18 732 489 ;
+C 201 ; WX 713 ; N propersuperset ; B 20 0 673 470 ;
+C 202 ; WX 713 ; N reflexsuperset ; B 20 -125 673 470 ;
+C 203 ; WX 713 ; N notsubset ; B 36 -70 690 540 ;
+C 204 ; WX 713 ; N propersubset ; B 37 0 690 470 ;
+C 205 ; WX 713 ; N reflexsubset ; B 37 -125 690 470 ;
+C 206 ; WX 713 ; N element ; B 45 0 505 470 ;
+C 207 ; WX 713 ; N notelement ; B 45 -58 505 555 ;
+C 208 ; WX 768 ; N angle ; B 26 -1 738 672 ;
+C 209 ; WX 713 ; N gradient ; B 36 0 681 687 ;
+C 210 ; WX 790 ; N registerserif ; B 50 -13 740 690 ;
+C 211 ; WX 790 ; N copyrightserif ; B 51 -13 741 690 ;
+C 212 ; WX 890 ; N trademarkserif ; B 18 269 855 673 ;
+C 213 ; WX 823 ; N product ; B 25 -124 803 751 ;
+C 214 ; WX 549 ; N radical ; B 10 -35 515 913 ;
+C 215 ; WX 250 ; N dotmath ; B 69 209 169 311 ;
+C 216 ; WX 713 ; N logicalnot ; B 15 40 680 367 ;
+C 217 ; WX 603 ; N logicaland ; B 23 -1 583 476 ;
+C 218 ; WX 603 ; N logicalor ; B 30 -1 578 476 ;
+C 219 ; WX 1042 ; N arrowdblboth ; B 27 -19 1023 506 ;
+C 220 ; WX 987 ; N arrowdblleft ; B 30 -19 939 506 ;
+C 221 ; WX 603 ; N arrowdblup ; B 39 0 567 909 ;
+C 222 ; WX 987 ; N arrowdblright ; B 45 -19 954 506 ;
+C 223 ; WX 603 ; N arrowdbldown ; B 44 0 572 909 ;
+C 224 ; WX 494 ; N lozenge ; B 18 -1 466 740 ;
+C 225 ; WX 329 ; N angleleft ; B 25 -152 306 757 ;
+C 226 ; WX 790 ; N registersans ; B 50 -12 740 679 ;
+C 227 ; WX 790 ; N copyrightsans ; B 49 -12 739 679 ;
+C 228 ; WX 786 ; N trademarksans ; B 5 277 725 673 ;
+C 229 ; WX 713 ; N summation ; B 14 -123 695 752 ;
+C 230 ; WX 384 ; N parenlefttp ; B 40 -293 436 926 ;
+C 231 ; WX 384 ; N parenleftex ; B 40 -79 92 925 ;
+C 232 ; WX 384 ; N parenleftbt ; B 40 -293 436 926 ;
+C 233 ; WX 384 ; N bracketlefttp ; B 0 -80 341 926 ;
+C 234 ; WX 384 ; N bracketleftex ; B 0 -85 55 925 ;
+C 235 ; WX 384 ; N bracketleftbt ; B 0 -80 340 926 ;
+C 236 ; WX 494 ; N bracelefttp ; B 201 -75 439 926 ;
+C 237 ; WX 494 ; N braceleftmid ; B 14 -85 255 935 ;
+C 238 ; WX 494 ; N braceleftbt ; B 201 -70 439 926 ;
+C 239 ; WX 494 ; N braceex ; B 201 -79 255 925 ;
+C 241 ; WX 329 ; N angleright ; B 21 -152 302 757 ;
+C 242 ; WX 274 ; N integral ; B 2 -107 291 916 ;
+C 243 ; WX 686 ; N integraltp ; B 332 -83 715 922 ;
+C 244 ; WX 686 ; N integralex ; B 332 -88 415 975 ;
+C 245 ; WX 686 ; N integralbt ; B 39 -81 415 921 ;
+C 246 ; WX 384 ; N parenrighttp ; B 54 -293 450 926 ;
+C 247 ; WX 384 ; N parenrightex ; B 398 -70 450 935 ;
+C 248 ; WX 384 ; N parenrightbt ; B 54 -293 450 926 ;
+C 249 ; WX 384 ; N bracketrighttp ; B 22 -80 360 926 ;
+C 250 ; WX 384 ; N bracketrightex ; B 305 -85 360 925 ;
+C 251 ; WX 384 ; N bracketrightbt ; B 20 -80 360 926 ;
+C 252 ; WX 494 ; N bracerighttp ; B 17 -75 255 926 ;
+C 253 ; WX 494 ; N bracerightmid ; B 204 -85 445 935 ;
+C 254 ; WX 494 ; N bracerightbt ; B 17 -70 255 926 ;
+C -1 ; WX 549 ; N thereexists ; B 25 0 478 673 ;
+C -1 ; WX 713 ; N superset ; B 20 0 673 470 ;
+C -1 ; WX 750 ; N euro ; B 47 -4 716 671 ;
+C -1 ; WX 768 ; N Ohm ; B 34 0 736 686 ;
+C -1 ; WX 250 ; N spacehackarabic ; B 250 0 250 0 ;
+C -1 ; WX 549 ; N tildeoperator ; B 17 196 529 325 ;
+C -1 ; WX 753 ; N heartsuitblack ; B 117 -33 631 528 ;
+C -1 ; WX 713 ; N subset ; B 37 0 690 470 ;
+C -1 ; WX 620 ; N Upsilonhooksymbol ; B -2 0 610 687 ;
+C -1 ; WX 713 ; N notelementof ; B 45 -58 505 555 ;
+C -1 ; WX 753 ; N clubsuitblack ; B 86 -26 660 544 ;
+C -1 ; WX 631 ; N thetasymbolgreek ; B 18 -13 623 686 ;
+C -1 ; WX 713 ; N pisymbolgreek ; B 12 -13 671 583 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/font/devps/symbolsl.ps b/font/devps/symbolsl.ps
new file mode 100644
index 0000000..ac3810e
--- /dev/null
+++ b/font/devps/symbolsl.ps
@@ -0,0 +1,42 @@
+%!PS-Adobe-3.0 Resource-Font
+%%DocumentNeededResources: font Symbol
+%%EndComments
+
+% newfontname matrix oldfontname MakeTransformedFont
+
+/MakeTransformedFont {
+ findfont dup maxlength dict begin
+ {
+ exch dup dup /FID ne exch /UniqueID ne and {
+ exch def
+ } {
+ pop pop
+ } ifelse
+ } forall
+ % first copy FontBBox
+ /FontBBox
+ % FontBBox sometimes seems to have the executable
+ % attribute set
+ % so to get the array on the stack, we have to do this
+ currentdict /FontBBox get
+ 4 array copy def
+ % now transform it
+ FontBBox aload pop
+ 4 index transform 4 2 roll
+ 4 index transform 4 2 roll
+ FontBBox astore pop
+ % matrix
+ % now transform FontMatrix
+ FontMatrix exch matrix concatmatrix
+ /FontMatrix exch def
+ dup /FontName exch def
+ currentdict end
+ definefont pop
+} bind def
+
+%%IncludeResource: font Symbol
+
+/Symbol-Slanted
+[.89 0.0 15.5 dup sin exch cos div .89 0.0 0.0]
+/Symbol
+MakeTransformedFont
diff --git a/font/devps/text.enc b/font/devps/text.enc
new file mode 100644
index 0000000..b915736
--- /dev/null
+++ b/font/devps/text.enc
@@ -0,0 +1,236 @@
+#
+# This is the font encoding used by grops to encode the standard PS text
+# fonts (excluding special fonts).
+#
+asciicircum 0
+asciitilde 1
+Scaron 2
+Zcaron 3
+scaron 4
+zcaron 5
+Ydieresis 6
+trademark 7
+quotesingle 8
+Euro 9
+space 32
+exclam 33
+quotedbl 34
+numbersign 35
+dollar 36
+percent 37
+ampersand 38
+quoteright 39
+parenleft 40
+parenright 41
+asterisk 42
+plus 43
+comma 44
+hyphen 45
+period 46
+slash 47
+zero 48
+one 49
+two 50
+three 51
+four 52
+five 53
+six 54
+seven 55
+eight 56
+nine 57
+colon 58
+semicolon 59
+less 60
+equal 61
+greater 62
+question 63
+at 64
+A 65
+B 66
+C 67
+D 68
+E 69
+F 70
+G 71
+H 72
+I 73
+J 74
+K 75
+L 76
+M 77
+N 78
+O 79
+P 80
+Q 81
+R 82
+S 83
+T 84
+U 85
+V 86
+W 87
+X 88
+Y 89
+Z 90
+bracketleft 91
+backslash 92
+bracketright 93
+circumflex 94
+underscore 95
+quoteleft 96
+a 97
+b 98
+c 99
+d 100
+e 101
+f 102
+g 103
+h 104
+i 105
+j 106
+k 107
+l 108
+m 109
+n 110
+o 111
+p 112
+q 113
+r 114
+s 115
+t 116
+u 117
+v 118
+w 119
+x 120
+y 121
+z 122
+braceleft 123
+bar 124
+braceright 125
+tilde 126
+quotesinglbase 128
+guillemotleft 129
+guillemotright 130
+bullet 131
+florin 132
+fraction 133
+perthousand 134
+dagger 135
+daggerdbl 136
+endash 137
+emdash 138
+ff 139
+fi 140
+fl 141
+ffi 142
+ffl 143
+dotlessi 144
+dotlessj 145
+grave 146
+hungarumlaut 147
+dotaccent 148
+breve 149
+caron 150
+ring 151
+ogonek 152
+quotedblleft 153
+quotedblright 154
+oe 155
+lslash 156
+quotedblbase 157
+OE 158
+Lslash 159
+exclamdown 161
+cent 162
+sterling 163
+currency 164
+yen 165
+brokenbar 166
+section 167
+dieresis 168
+copyright 169
+ordfeminine 170
+guilsinglleft 171
+logicalnot 172
+minus 173
+registered 174
+macron 175
+degree 176
+plusminus 177
+twosuperior 178
+threesuperior 179
+acute 180
+mu 181
+paragraph 182
+periodcentered 183
+cedilla 184
+onesuperior 185
+ordmasculine 186
+guilsinglright 187
+onequarter 188
+onehalf 189
+threequarters 190
+questiondown 191
+Agrave 192
+Aacute 193
+Acircumflex 194
+Atilde 195
+Adieresis 196
+Aring 197
+AE 198
+Ccedilla 199
+Egrave 200
+Eacute 201
+Ecircumflex 202
+Edieresis 203
+Igrave 204
+Iacute 205
+Icircumflex 206
+Idieresis 207
+Eth 208
+Ntilde 209
+Ograve 210
+Oacute 211
+Ocircumflex 212
+Otilde 213
+Odieresis 214
+multiply 215
+Oslash 216
+Ugrave 217
+Uacute 218
+Ucircumflex 219
+Udieresis 220
+Yacute 221
+Thorn 222
+germandbls 223
+agrave 224
+aacute 225
+acircumflex 226
+atilde 227
+adieresis 228
+aring 229
+ae 230
+ccedilla 231
+egrave 232
+eacute 233
+ecircumflex 234
+edieresis 235
+igrave 236
+iacute 237
+icircumflex 238
+idieresis 239
+eth 240
+ntilde 241
+ograve 242
+oacute 243
+ocircumflex 244
+otilde 245
+odieresis 246
+divide 247
+oslash 248
+ugrave 249
+uacute 250
+ucircumflex 251
+udieresis 252
+yacute 253
+thorn 254
+ydieresis 255
diff --git a/font/devps/zapfdr.afm b/font/devps/zapfdr.afm
new file mode 100644
index 0000000..67c73f2
--- /dev/null
+++ b/font/devps/zapfdr.afm
@@ -0,0 +1,224 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 15:14:13 1997
+Comment UniqueID 43082
+Comment VMusage 45775 55535
+FontName ZapfDingbats-Reverse
+FullName ITC Zapf Dingbats Reverse
+FamilyName ITC Zapf Dingbats
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -1 -143 981 820
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Zapf Dingbats is a registered trademark of International Typeface Corporation.
+EncodingScheme FontSpecific
+StdHW 28
+StdVW 90
+StartCharMetrics 202
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 974 ; N a1 ; B 35 72 939 621 ;
+C 34 ; WX 961 ; N a2 ; B 35 81 927 611 ;
+C 35 ; WX 974 ; N a202 ; B 35 72 939 621 ;
+C 36 ; WX 980 ; N a3 ; B 35 0 945 692 ;
+C 37 ; WX 719 ; N a4 ; B 34 139 685 566 ;
+C 38 ; WX 789 ; N a5 ; B 35 -14 755 705 ;
+C 39 ; WX 790 ; N a119 ; B 35 -14 755 705 ;
+C 40 ; WX 791 ; N a118 ; B 35 -13 761 705 ;
+C 41 ; WX 690 ; N a117 ; B 34 138 655 553 ;
+C 42 ; WX 960 ; N a11 ; B 35 123 925 568 ;
+C 43 ; WX 939 ; N a12 ; B 35 134 904 559 ;
+C 44 ; WX 549 ; N a13 ; B 29 -11 516 705 ;
+C 45 ; WX 855 ; N a14 ; B 34 59 820 632 ;
+C 46 ; WX 911 ; N a15 ; B 35 50 876 642 ;
+C 47 ; WX 933 ; N a16 ; B 35 139 899 550 ;
+C 48 ; WX 911 ; N a105 ; B 35 50 876 642 ;
+C 49 ; WX 945 ; N a17 ; B 35 139 909 553 ;
+C 50 ; WX 974 ; N a18 ; B 35 104 938 587 ;
+C 51 ; WX 755 ; N a19 ; B 34 -13 721 705 ;
+C 52 ; WX 846 ; N a20 ; B 36 -14 811 705 ;
+C 53 ; WX 762 ; N a21 ; B 35 0 727 692 ;
+C 54 ; WX 761 ; N a22 ; B 35 0 727 692 ;
+C 55 ; WX 571 ; N a23 ; B -1 -68 571 661 ;
+C 56 ; WX 677 ; N a24 ; B 36 -13 642 705 ;
+C 57 ; WX 763 ; N a25 ; B 35 0 728 692 ;
+C 58 ; WX 760 ; N a26 ; B 35 0 726 692 ;
+C 59 ; WX 759 ; N a27 ; B 35 0 725 692 ;
+C 60 ; WX 754 ; N a28 ; B 35 0 720 692 ;
+C 61 ; WX 494 ; N a6 ; B 35 0 460 692 ;
+C 62 ; WX 552 ; N a7 ; B 35 0 517 692 ;
+C 63 ; WX 537 ; N a8 ; B 35 0 503 692 ;
+C 64 ; WX 577 ; N a9 ; B 35 96 542 596 ;
+C 65 ; WX 692 ; N a10 ; B 35 -14 657 705 ;
+C 66 ; WX 786 ; N a29 ; B 35 -14 751 705 ;
+C 67 ; WX 788 ; N a30 ; B 35 -14 752 705 ;
+C 68 ; WX 788 ; N a31 ; B 35 -14 753 705 ;
+C 69 ; WX 790 ; N a32 ; B 35 -14 756 705 ;
+C 70 ; WX 793 ; N a33 ; B 35 -13 759 705 ;
+C 71 ; WX 794 ; N a34 ; B 35 -13 759 705 ;
+C 72 ; WX 816 ; N a35 ; B 35 -14 782 705 ;
+C 73 ; WX 823 ; N a36 ; B 35 -14 787 705 ;
+C 74 ; WX 789 ; N a37 ; B 35 -14 754 705 ;
+C 75 ; WX 841 ; N a38 ; B 35 -14 807 705 ;
+C 76 ; WX 823 ; N a39 ; B 35 -14 789 705 ;
+C 77 ; WX 833 ; N a40 ; B 35 -14 798 705 ;
+C 78 ; WX 816 ; N a41 ; B 35 -13 782 705 ;
+C 79 ; WX 831 ; N a42 ; B 35 -14 796 705 ;
+C 80 ; WX 923 ; N a43 ; B 35 -14 888 705 ;
+C 81 ; WX 744 ; N a44 ; B 35 0 710 692 ;
+C 82 ; WX 723 ; N a45 ; B 35 0 688 692 ;
+C 83 ; WX 749 ; N a46 ; B 35 0 714 692 ;
+C 84 ; WX 790 ; N a47 ; B 34 -14 756 705 ;
+C 85 ; WX 792 ; N a48 ; B 35 -14 758 705 ;
+C 86 ; WX 695 ; N a49 ; B 35 -14 661 706 ;
+C 87 ; WX 776 ; N a50 ; B 35 -6 741 699 ;
+C 88 ; WX 768 ; N a51 ; B 35 -7 734 699 ;
+C 89 ; WX 792 ; N a52 ; B 35 -14 757 705 ;
+C 90 ; WX 759 ; N a53 ; B 35 0 725 692 ;
+C 91 ; WX 707 ; N a54 ; B 35 -13 672 704 ;
+C 92 ; WX 708 ; N a55 ; B 35 -14 672 705 ;
+C 93 ; WX 682 ; N a56 ; B 35 -14 647 705 ;
+C 94 ; WX 701 ; N a57 ; B 35 -14 666 705 ;
+C 95 ; WX 826 ; N a58 ; B 35 -14 791 705 ;
+C 96 ; WX 815 ; N a59 ; B 35 -14 780 705 ;
+C 97 ; WX 789 ; N a60 ; B 35 -14 754 705 ;
+C 98 ; WX 789 ; N a61 ; B 35 -14 754 705 ;
+C 99 ; WX 707 ; N a62 ; B 34 -14 673 705 ;
+C 100 ; WX 687 ; N a63 ; B 36 0 651 692 ;
+C 101 ; WX 696 ; N a64 ; B 35 0 661 691 ;
+C 102 ; WX 689 ; N a65 ; B 35 0 655 692 ;
+C 103 ; WX 786 ; N a66 ; B 34 -14 751 705 ;
+C 104 ; WX 787 ; N a67 ; B 35 -14 752 705 ;
+C 105 ; WX 713 ; N a68 ; B 35 -14 678 705 ;
+C 106 ; WX 791 ; N a69 ; B 35 -14 756 705 ;
+C 107 ; WX 785 ; N a70 ; B 36 -14 751 705 ;
+C 108 ; WX 791 ; N a71 ; B 35 -14 757 705 ;
+C 109 ; WX 873 ; N a72 ; B 35 -14 838 705 ;
+C 110 ; WX 761 ; N a73 ; B 35 0 726 692 ;
+C 111 ; WX 762 ; N a74 ; B 35 0 727 692 ;
+C 112 ; WX 762 ; N a203 ; B 35 0 727 692 ;
+C 113 ; WX 759 ; N a75 ; B 35 0 725 692 ;
+C 114 ; WX 759 ; N a204 ; B 35 0 725 692 ;
+C 115 ; WX 892 ; N a76 ; B 35 0 858 705 ;
+C 116 ; WX 892 ; N a77 ; B 35 -14 858 692 ;
+C 117 ; WX 788 ; N a78 ; B 35 -14 754 705 ;
+C 118 ; WX 784 ; N a79 ; B 35 -14 749 705 ;
+C 119 ; WX 438 ; N a81 ; B 35 -14 403 705 ;
+C 120 ; WX 138 ; N a82 ; B 35 0 104 692 ;
+C 121 ; WX 277 ; N a83 ; B 35 0 242 692 ;
+C 122 ; WX 415 ; N a84 ; B 35 0 380 692 ;
+C 123 ; WX 392 ; N a97 ; B 35 263 357 705 ;
+C 124 ; WX 392 ; N a98 ; B 34 263 357 705 ;
+C 125 ; WX 668 ; N a99 ; B 35 263 633 705 ;
+C 126 ; WX 668 ; N a100 ; B 36 263 634 705 ;
+C 128 ; WX 390 ; N a89 ; B 35 -14 356 705 ;
+C 129 ; WX 390 ; N a90 ; B 35 -14 355 705 ;
+C 130 ; WX 317 ; N a93 ; B 35 0 283 692 ;
+C 131 ; WX 317 ; N a94 ; B 35 0 283 692 ;
+C 132 ; WX 276 ; N a91 ; B 35 0 242 692 ;
+C 133 ; WX 276 ; N a92 ; B 35 0 242 692 ;
+C 134 ; WX 509 ; N a205 ; B 35 0 475 692 ;
+C 135 ; WX 509 ; N a85 ; B 35 0 475 692 ;
+C 136 ; WX 410 ; N a206 ; B 35 0 375 692 ;
+C 137 ; WX 410 ; N a86 ; B 35 0 375 692 ;
+C 138 ; WX 234 ; N a87 ; B 35 -14 199 705 ;
+C 139 ; WX 234 ; N a88 ; B 35 -14 199 705 ;
+C 140 ; WX 334 ; N a95 ; B 35 0 299 692 ;
+C 141 ; WX 334 ; N a96 ; B 35 0 299 692 ;
+C 161 ; WX 732 ; N a101 ; B 35 -143 697 806 ;
+C 162 ; WX 544 ; N a102 ; B 56 -14 488 706 ;
+C 163 ; WX 544 ; N a103 ; B 34 -14 508 705 ;
+C 164 ; WX 910 ; N a104 ; B 35 40 875 651 ;
+C 165 ; WX 667 ; N a106 ; B 35 -14 633 705 ;
+C 166 ; WX 760 ; N a107 ; B 35 -14 726 705 ;
+C 167 ; WX 760 ; N a108 ; B 0 121 758 569 ;
+C 168 ; WX 776 ; N a112 ; B 35 0 741 705 ;
+C 169 ; WX 595 ; N a111 ; B 34 -14 560 705 ;
+C 170 ; WX 694 ; N a110 ; B 35 -14 659 705 ;
+C 171 ; WX 626 ; N a109 ; B 34 0 591 705 ;
+C 172 ; WX 788 ; N a120 ; B 35 -14 754 705 ;
+C 173 ; WX 788 ; N a121 ; B 35 -14 754 705 ;
+C 174 ; WX 788 ; N a122 ; B 35 -14 754 705 ;
+C 175 ; WX 788 ; N a123 ; B 35 -14 754 705 ;
+C 176 ; WX 788 ; N a124 ; B 35 -14 754 705 ;
+C 177 ; WX 788 ; N a125 ; B 35 -14 754 705 ;
+C 178 ; WX 788 ; N a126 ; B 35 -14 754 705 ;
+C 179 ; WX 788 ; N a127 ; B 35 -14 754 705 ;
+C 180 ; WX 788 ; N a128 ; B 35 -14 754 705 ;
+C 181 ; WX 788 ; N a129 ; B 35 -14 754 705 ;
+C 182 ; WX 788 ; N a130 ; B 35 -14 754 705 ;
+C 183 ; WX 788 ; N a131 ; B 35 -14 754 705 ;
+C 184 ; WX 788 ; N a132 ; B 35 -14 754 705 ;
+C 185 ; WX 788 ; N a133 ; B 35 -14 754 705 ;
+C 186 ; WX 788 ; N a134 ; B 35 -14 754 705 ;
+C 187 ; WX 788 ; N a135 ; B 35 -14 754 705 ;
+C 188 ; WX 788 ; N a136 ; B 35 -14 754 705 ;
+C 189 ; WX 788 ; N a137 ; B 35 -14 754 705 ;
+C 190 ; WX 788 ; N a138 ; B 35 -14 754 705 ;
+C 191 ; WX 788 ; N a139 ; B 35 -14 754 705 ;
+C 192 ; WX 788 ; N a140 ; B 35 -14 754 705 ;
+C 193 ; WX 788 ; N a141 ; B 35 -14 754 705 ;
+C 194 ; WX 788 ; N a142 ; B 35 -14 754 705 ;
+C 195 ; WX 788 ; N a143 ; B 35 -14 754 705 ;
+C 196 ; WX 788 ; N a144 ; B 35 -14 754 705 ;
+C 197 ; WX 788 ; N a145 ; B 35 -14 754 705 ;
+C 198 ; WX 788 ; N a146 ; B 35 -14 754 705 ;
+C 199 ; WX 788 ; N a147 ; B 35 -14 754 705 ;
+C 200 ; WX 788 ; N a148 ; B 35 -14 754 705 ;
+C 201 ; WX 788 ; N a149 ; B 35 -14 754 705 ;
+C 202 ; WX 788 ; N a150 ; B 35 -14 754 705 ;
+C 203 ; WX 788 ; N a151 ; B 35 -14 754 705 ;
+C 204 ; WX 788 ; N a152 ; B 35 -14 754 705 ;
+C 205 ; WX 788 ; N a153 ; B 35 -14 754 705 ;
+C 206 ; WX 788 ; N a154 ; B 35 -14 754 705 ;
+C 207 ; WX 788 ; N a155 ; B 35 -14 754 705 ;
+C 208 ; WX 788 ; N a156 ; B 35 -14 754 705 ;
+C 209 ; WX 788 ; N a157 ; B 35 -14 754 705 ;
+C 210 ; WX 788 ; N a158 ; B 35 -14 754 705 ;
+C 211 ; WX 788 ; N a159 ; B 35 -14 754 705 ;
+C 212 ; WX 894 ; N a160 ; B 35 58 860 634 ;
+C 213 ; WX 838 ; N a161 ; B 35 152 803 540 ;
+C 214 ; WX 1016 ; N a163 ; B 34 152 981 540 ;
+C 215 ; WX 458 ; N a164 ; B 35 -127 422 820 ;
+C 216 ; WX 748 ; N a196 ; B 35 94 698 597 ;
+C 217 ; WX 924 ; N a165 ; B 35 140 890 552 ;
+C 218 ; WX 748 ; N a192 ; B 35 94 698 597 ;
+C 219 ; WX 918 ; N a166 ; B 35 166 884 526 ;
+C 220 ; WX 927 ; N a167 ; B 35 32 892 660 ;
+C 221 ; WX 928 ; N a168 ; B 35 129 891 562 ;
+C 222 ; WX 928 ; N a169 ; B 35 128 893 563 ;
+C 223 ; WX 834 ; N a170 ; B 35 155 799 537 ;
+C 224 ; WX 873 ; N a171 ; B 35 93 838 599 ;
+C 225 ; WX 828 ; N a172 ; B 35 104 791 588 ;
+C 226 ; WX 924 ; N a173 ; B 35 98 889 594 ;
+C 227 ; WX 924 ; N a162 ; B 35 98 889 594 ;
+C 228 ; WX 917 ; N a174 ; B 35 0 882 692 ;
+C 229 ; WX 930 ; N a175 ; B 35 84 896 608 ;
+C 230 ; WX 931 ; N a176 ; B 35 84 896 608 ;
+C 231 ; WX 463 ; N a177 ; B 35 -99 429 791 ;
+C 232 ; WX 883 ; N a178 ; B 35 71 848 623 ;
+C 233 ; WX 836 ; N a179 ; B 35 44 802 648 ;
+C 234 ; WX 836 ; N a193 ; B 35 44 802 648 ;
+C 235 ; WX 867 ; N a180 ; B 35 101 832 591 ;
+C 236 ; WX 867 ; N a199 ; B 35 101 832 591 ;
+C 237 ; WX 696 ; N a181 ; B 35 44 661 648 ;
+C 238 ; WX 696 ; N a200 ; B 35 44 661 648 ;
+C 239 ; WX 874 ; N a182 ; B 35 77 840 619 ;
+C 241 ; WX 874 ; N a201 ; B 35 73 840 615 ;
+C 242 ; WX 760 ; N a183 ; B 35 0 725 692 ;
+C 243 ; WX 946 ; N a184 ; B 35 160 911 533 ;
+C 244 ; WX 771 ; N a197 ; B 34 37 736 655 ;
+C 245 ; WX 865 ; N a185 ; B 35 207 830 481 ;
+C 246 ; WX 771 ; N a194 ; B 34 37 736 655 ;
+C 247 ; WX 888 ; N a198 ; B 34 -19 853 712 ;
+C 248 ; WX 967 ; N a186 ; B 35 124 932 568 ;
+C 249 ; WX 888 ; N a195 ; B 34 -19 853 712 ;
+C 250 ; WX 831 ; N a187 ; B 35 113 796 579 ;
+C 251 ; WX 873 ; N a188 ; B 36 118 838 578 ;
+C 252 ; WX 927 ; N a189 ; B 35 150 891 542 ;
+C 253 ; WX 970 ; N a190 ; B 35 76 931 616 ;
+C 254 ; WX 918 ; N a191 ; B 34 99 884 593 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/font/devps/zapfdr.ps b/font/devps/zapfdr.ps
new file mode 100644
index 0000000..406ee5a
--- /dev/null
+++ b/font/devps/zapfdr.ps
@@ -0,0 +1,225 @@
+%!PS-Adobe-3.0 Resource-Font
+%%DocumentNeededResources: font ZapfDingbats
+%%EndComments
+%%IncludeResource: font ZapfDingbats
+
+/ZapfDingbats findfont [-1 0 0 1 0 0] makefont
+
+dup length 1 add dict begin
+{
+ exch dup dup /FID ne exch /UniqueID ne and {
+ exch def
+ } {
+ pop pop
+ } ifelse
+} forall
+
+/FontName /ZapfDingbats-Reverse def
+
+/Metrics 202 dict dup begin
+ /space [-0 -278] def
+ /a1 [-939 -974] def
+ /a2 [-927 -961] def
+ /a202 [-939 -974] def
+ /a3 [-945 -980] def
+ /a4 [-685 -719] def
+ /a5 [-755 -789] def
+ /a119 [-755 -790] def
+ /a118 [-761 -791] def
+ /a117 [-655 -690] def
+ /a11 [-925 -960] def
+ /a12 [-904 -939] def
+ /a13 [-516 -549] def
+ /a14 [-820 -855] def
+ /a15 [-876 -911] def
+ /a16 [-899 -933] def
+ /a105 [-876 -911] def
+ /a17 [-909 -945] def
+ /a18 [-938 -974] def
+ /a19 [-721 -755] def
+ /a20 [-811 -846] def
+ /a21 [-727 -762] def
+ /a22 [-727 -761] def
+ /a23 [-571 -571] def
+ /a24 [-642 -677] def
+ /a25 [-728 -763] def
+ /a26 [-726 -760] def
+ /a27 [-725 -759] def
+ /a28 [-720 -754] def
+ /a6 [-460 -494] def
+ /a7 [-517 -552] def
+ /a8 [-503 -537] def
+ /a9 [-542 -577] def
+ /a10 [-657 -692] def
+ /a29 [-751 -786] def
+ /a30 [-752 -788] def
+ /a31 [-753 -788] def
+ /a32 [-756 -790] def
+ /a33 [-759 -793] def
+ /a34 [-759 -794] def
+ /a35 [-782 -816] def
+ /a36 [-787 -823] def
+ /a37 [-754 -789] def
+ /a38 [-807 -841] def
+ /a39 [-789 -823] def
+ /a40 [-798 -833] def
+ /a41 [-782 -816] def
+ /a42 [-796 -831] def
+ /a43 [-888 -923] def
+ /a44 [-710 -744] def
+ /a45 [-688 -723] def
+ /a46 [-714 -749] def
+ /a47 [-756 -790] def
+ /a48 [-758 -792] def
+ /a49 [-661 -695] def
+ /a50 [-741 -776] def
+ /a51 [-734 -768] def
+ /a52 [-757 -792] def
+ /a53 [-725 -759] def
+ /a54 [-672 -707] def
+ /a55 [-672 -708] def
+ /a56 [-647 -682] def
+ /a57 [-666 -701] def
+ /a58 [-791 -826] def
+ /a59 [-780 -815] def
+ /a60 [-754 -789] def
+ /a61 [-754 -789] def
+ /a62 [-673 -707] def
+ /a63 [-651 -687] def
+ /a64 [-661 -696] def
+ /a65 [-655 -689] def
+ /a66 [-751 -786] def
+ /a67 [-752 -787] def
+ /a68 [-678 -713] def
+ /a69 [-756 -791] def
+ /a70 [-751 -785] def
+ /a71 [-757 -791] def
+ /a72 [-838 -873] def
+ /a73 [-726 -761] def
+ /a74 [-727 -762] def
+ /a203 [-727 -762] def
+ /a75 [-725 -759] def
+ /a204 [-725 -759] def
+ /a76 [-858 -892] def
+ /a77 [-858 -892] def
+ /a78 [-754 -788] def
+ /a79 [-749 -784] def
+ /a81 [-403 -438] def
+ /a82 [-104 -138] def
+ /a83 [-242 -277] def
+ /a84 [-380 -415] def
+ /a97 [-357 -392] def
+ /a98 [-357 -392] def
+ /a99 [-633 -668] def
+ /a100 [-634 -668] def
+ /a89 [-356 -390] def
+ /a90 [-355 -390] def
+ /a93 [-283 -317] def
+ /a94 [-283 -317] def
+ /a91 [-242 -276] def
+ /a92 [-242 -276] def
+ /a205 [-475 -509] def
+ /a85 [-475 -509] def
+ /a206 [-375 -410] def
+ /a86 [-375 -410] def
+ /a87 [-199 -234] def
+ /a88 [-199 -234] def
+ /a95 [-299 -334] def
+ /a96 [-299 -334] def
+ /a101 [-697 -732] def
+ /a102 [-488 -544] def
+ /a103 [-508 -544] def
+ /a104 [-875 -910] def
+ /a106 [-633 -667] def
+ /a107 [-726 -760] def
+ /a108 [-758 -760] def
+ /a112 [-741 -776] def
+ /a111 [-560 -595] def
+ /a110 [-659 -694] def
+ /a109 [-591 -626] def
+ /a120 [-754 -788] def
+ /a121 [-754 -788] def
+ /a122 [-754 -788] def
+ /a123 [-754 -788] def
+ /a124 [-754 -788] def
+ /a125 [-754 -788] def
+ /a126 [-754 -788] def
+ /a127 [-754 -788] def
+ /a128 [-754 -788] def
+ /a129 [-754 -788] def
+ /a130 [-754 -788] def
+ /a131 [-754 -788] def
+ /a132 [-754 -788] def
+ /a133 [-754 -788] def
+ /a134 [-754 -788] def
+ /a135 [-754 -788] def
+ /a136 [-754 -788] def
+ /a137 [-754 -788] def
+ /a138 [-754 -788] def
+ /a139 [-754 -788] def
+ /a140 [-754 -788] def
+ /a141 [-754 -788] def
+ /a142 [-754 -788] def
+ /a143 [-754 -788] def
+ /a144 [-754 -788] def
+ /a145 [-754 -788] def
+ /a146 [-754 -788] def
+ /a147 [-754 -788] def
+ /a148 [-754 -788] def
+ /a149 [-754 -788] def
+ /a150 [-754 -788] def
+ /a151 [-754 -788] def
+ /a152 [-754 -788] def
+ /a153 [-754 -788] def
+ /a154 [-754 -788] def
+ /a155 [-754 -788] def
+ /a156 [-754 -788] def
+ /a157 [-754 -788] def
+ /a158 [-754 -788] def
+ /a159 [-754 -788] def
+ /a160 [-860 -894] def
+ /a161 [-803 -838] def
+ /a163 [-981 -1016] def
+ /a164 [-422 -458] def
+ /a196 [-698 -748] def
+ /a165 [-890 -924] def
+ /a192 [-698 -748] def
+ /a166 [-884 -918] def
+ /a167 [-892 -927] def
+ /a168 [-891 -928] def
+ /a169 [-893 -928] def
+ /a170 [-799 -834] def
+ /a171 [-838 -873] def
+ /a172 [-791 -828] def
+ /a173 [-889 -924] def
+ /a162 [-889 -924] def
+ /a174 [-882 -917] def
+ /a175 [-896 -930] def
+ /a176 [-896 -931] def
+ /a177 [-429 -463] def
+ /a178 [-848 -883] def
+ /a179 [-802 -836] def
+ /a193 [-802 -836] def
+ /a180 [-832 -867] def
+ /a199 [-832 -867] def
+ /a181 [-661 -696] def
+ /a200 [-661 -696] def
+ /a182 [-840 -874] def
+ /a201 [-840 -874] def
+ /a183 [-725 -760] def
+ /a184 [-911 -946] def
+ /a197 [-736 -771] def
+ /a185 [-830 -865] def
+ /a194 [-736 -771] def
+ /a198 [-853 -888] def
+ /a186 [-932 -967] def
+ /a195 [-853 -888] def
+ /a187 [-796 -831] def
+ /a188 [-838 -873] def
+ /a189 [-891 -927] def
+ /a190 [-931 -970] def
+ /a191 [-884 -918] def
+
+end def
+
+/ZapfDingbats-Reverse currentdict end definefont pop
diff --git a/font/devutf8/DESC.proto b/font/devutf8/DESC.proto
new file mode 100644
index 0000000..8cb978d
--- /dev/null
+++ b/font/devutf8/DESC.proto
@@ -0,0 +1,9 @@
+res 240
+hor 24
+vert 40
+unitwidth 10
+sizes 10 0
+fonts 4 R I B BI
+tcommand
+postpro grotty
+unicode
diff --git a/font/devutf8/NOTES b/font/devutf8/NOTES
new file mode 100644
index 0000000..c20edeb
--- /dev/null
+++ b/font/devutf8/NOTES
@@ -0,0 +1,47 @@
+All \[charXXX] special character names have been removed from the font
+files. They don't make sense for Unicode.
+
+The following special character name from the AT&T troff manual by
+Ossanna and Kernighan is unmapped:
+
+ bs shaded solid ball (Bell System logo, AT&T logo)
+
+Code point 0x002D has not been given a name because its Unicode name
+HYPHEN-MINUS is so ambiguous that it is unusable for serious typographic
+work.
+
+\[wp] has been mapped to 0x2118, because according to Unicode 4.1's
+NamesList.txt, U+2118 SCRIPT CAPITAL P is really a Weierstrass 'p',
+neither SCRIPT nor CAPITAL.
+
+The following line could be added; \[space] is known to devps but is not
+documented and not known to devdvi (actually, there is no space glyph
+within the TeX system).
+
+ space 24 0 0x0020
+
+devps maps \[*U] to 'Upsilon1', which is equivalent to 0x03D2. We map
+it to 0x03A5 instead.
+
+devps maps \[*W] to 'Omega', which is equivalent to either 0x2126 or
+0x03A9. We map it to 0x03A9.
+
+devps maps \[*D] to 'Delta', which is equivalent to either 0x2206 or
+0x0394. We map it to 0x0394.
+
+
+Adding Unicode characters
+-------------------------
+
+Assume you want to use a Unicode character not provided in the list, say
+U+20AC. You need to do two things:
+
+- Add a line
+
+ u20AC 24 0 0x20AC
+
+ (the second column is computed as 24 * wcwidth(0x20AC)) to the file
+ R.proto, or, when groff is already installed, to the four font
+ description files in $(prefix)/share/groff/<version>/font/devutf8/.
+
+- In your source file, use the notation \[u20AC] to access it.
diff --git a/font/devutf8/R.in b/font/devutf8/R.in
new file mode 100644
index 0000000..1df5e30
--- /dev/null
+++ b/font/devutf8/R.in
@@ -0,0 +1,4 @@
+name R
+internalname 0
+spacewidth 24
+charset
diff --git a/font/devutf8/R.proto b/font/devutf8/R.proto
new file mode 100644
index 0000000..3233af8
--- /dev/null
+++ b/font/devutf8/R.proto
@@ -0,0 +1,1029 @@
+name R
+internalname 0
+spacewidth 24
+charset
+' 24 0 0x2019
+- 24 0 0x2010
+` 24 0 0x2018
+^ 24 0 0x02C6
+~ 24 0 0x02DC
+u0041_0300 24 0 0x00C0
+u0041_0301 24 0 0x00C1
+u0041_0302 24 0 0x00C2
+u0041_0303 24 0 0x00C3
+u0041_0308 24 0 0x00C4
+u0041_030A 24 0 0x00C5
+u0043_0327 24 0 0x00C7
+u0045_0300 24 0 0x00C8
+u0045_0301 24 0 0x00C9
+u0045_0302 24 0 0x00CA
+u0045_0308 24 0 0x00CB
+u0049_0300 24 0 0x00CC
+u0049_0301 24 0 0x00CD
+u0049_0302 24 0 0x00CE
+u0049_0308 24 0 0x00CF
+u004E_0303 24 0 0x00D1
+u004F_0300 24 0 0x00D2
+u004F_0301 24 0 0x00D3
+u004F_0302 24 0 0x00D4
+u004F_0303 24 0 0x00D5
+u004F_0308 24 0 0x00D6
+u0055_0300 24 0 0x00D9
+u0055_0301 24 0 0x00DA
+u0055_0302 24 0 0x00DB
+u0055_0308 24 0 0x00DC
+u0059_0301 24 0 0x00DD
+u0061_0300 24 0 0x00E0
+u0061_0301 24 0 0x00E1
+u0061_0302 24 0 0x00E2
+u0061_0303 24 0 0x00E3
+u0061_0308 24 0 0x00E4
+u0061_030A 24 0 0x00E5
+u0063_0327 24 0 0x00E7
+u0065_0300 24 0 0x00E8
+u0065_0301 24 0 0x00E9
+u0065_0302 24 0 0x00EA
+u0065_0308 24 0 0x00EB
+u0069_0300 24 0 0x00EC
+u0069_0301 24 0 0x00ED
+u0069_0302 24 0 0x00EE
+u0069_0308 24 0 0x00EF
+u006E_0303 24 0 0x00F1
+u006F_0300 24 0 0x00F2
+u006F_0301 24 0 0x00F3
+u006F_0302 24 0 0x00F4
+u006F_0303 24 0 0x00F5
+u006F_0308 24 0 0x00F6
+u0075_0300 24 0 0x00F9
+u0075_0301 24 0 0x00FA
+u0075_0302 24 0 0x00FB
+u0075_0308 24 0 0x00FC
+u0079_0301 24 0 0x00FD
+u0079_0308 24 0 0x00FF
+u0041_0304 24 0 0x0100
+u0061_0304 24 0 0x0101
+u0041_0306 24 0 0x0102
+u0061_0306 24 0 0x0103
+u0041_0328 24 0 0x0104
+u0061_0328 24 0 0x0105
+u0043_0301 24 0 0x0106
+u0063_0301 24 0 0x0107
+u0043_0302 24 0 0x0108
+u0063_0302 24 0 0x0109
+u0043_0307 24 0 0x010A
+u0063_0307 24 0 0x010B
+u0043_030C 24 0 0x010C
+u0063_030C 24 0 0x010D
+u0044_030C 24 0 0x010E
+u0064_030C 24 0 0x010F
+u0045_0304 24 0 0x0112
+u0065_0304 24 0 0x0113
+u0045_0306 24 0 0x0114
+u0065_0306 24 0 0x0115
+u0045_0307 24 0 0x0116
+u0065_0307 24 0 0x0117
+u0045_0328 24 0 0x0118
+u0065_0328 24 0 0x0119
+u0045_030C 24 0 0x011A
+u0065_030C 24 0 0x011B
+u0047_0302 24 0 0x011C
+u0067_0302 24 0 0x011D
+u0047_0306 24 0 0x011E
+u0067_0306 24 0 0x011F
+u0047_0307 24 0 0x0120
+u0067_0307 24 0 0x0121
+u0047_0327 24 0 0x0122
+u0067_0327 24 0 0x0123
+u0048_0302 24 0 0x0124
+u0068_0302 24 0 0x0125
+u0049_0303 24 0 0x0128
+u0069_0303 24 0 0x0129
+u0049_0304 24 0 0x012A
+u0069_0304 24 0 0x012B
+u0049_0306 24 0 0x012C
+u0069_0306 24 0 0x012D
+u0049_0328 24 0 0x012E
+u0069_0328 24 0 0x012F
+u0049_0307 24 0 0x0130
+u004A_0302 24 0 0x0134
+u006A_0302 24 0 0x0135
+u004B_0327 24 0 0x0136
+u006B_0327 24 0 0x0137
+u004C_0301 24 0 0x0139
+u006C_0301 24 0 0x013A
+u004C_0327 24 0 0x013B
+u006C_0327 24 0 0x013C
+u004C_030C 24 0 0x013D
+u006C_030C 24 0 0x013E
+u004E_0301 24 0 0x0143
+u006E_0301 24 0 0x0144
+u004E_0327 24 0 0x0145
+u006E_0327 24 0 0x0146
+u004E_030C 24 0 0x0147
+u006E_030C 24 0 0x0148
+u004F_0304 24 0 0x014C
+u006F_0304 24 0 0x014D
+u004F_0306 24 0 0x014E
+u006F_0306 24 0 0x014F
+u004F_030B 24 0 0x0150
+u006F_030B 24 0 0x0151
+u0052_0301 24 0 0x0154
+u0072_0301 24 0 0x0155
+u0052_0327 24 0 0x0156
+u0072_0327 24 0 0x0157
+u0052_030C 24 0 0x0158
+u0072_030C 24 0 0x0159
+u0053_0301 24 0 0x015A
+u0073_0301 24 0 0x015B
+u0053_0302 24 0 0x015C
+u0073_0302 24 0 0x015D
+u0053_0327 24 0 0x015E
+u0073_0327 24 0 0x015F
+u0053_030C 24 0 0x0160
+u0073_030C 24 0 0x0161
+u0054_0327 24 0 0x0162
+u0074_0327 24 0 0x0163
+u0054_030C 24 0 0x0164
+u0074_030C 24 0 0x0165
+u0055_0303 24 0 0x0168
+u0075_0303 24 0 0x0169
+u0055_0304 24 0 0x016A
+u0075_0304 24 0 0x016B
+u0055_0306 24 0 0x016C
+u0075_0306 24 0 0x016D
+u0055_030A 24 0 0x016E
+u0075_030A 24 0 0x016F
+u0055_030B 24 0 0x0170
+u0075_030B 24 0 0x0171
+u0055_0328 24 0 0x0172
+u0075_0328 24 0 0x0173
+u0057_0302 24 0 0x0174
+u0077_0302 24 0 0x0175
+u0059_0302 24 0 0x0176
+u0079_0302 24 0 0x0177
+u0059_0308 24 0 0x0178
+u005A_0301 24 0 0x0179
+u007A_0301 24 0 0x017A
+u005A_0307 24 0 0x017B
+u007A_0307 24 0 0x017C
+u005A_030C 24 0 0x017D
+u007A_030C 24 0 0x017E
+u004F_031B 24 0 0x01A0
+u006F_031B 24 0 0x01A1
+u0055_031B 24 0 0x01AF
+u0075_031B 24 0 0x01B0
+u0041_030C 24 0 0x01CD
+u0061_030C 24 0 0x01CE
+u0049_030C 24 0 0x01CF
+u0069_030C 24 0 0x01D0
+u004F_030C 24 0 0x01D1
+u006F_030C 24 0 0x01D2
+u0055_030C 24 0 0x01D3
+u0075_030C 24 0 0x01D4
+u0055_0308_0304 24 0 0x01D5
+u0075_0308_0304 24 0 0x01D6
+u0055_0308_0301 24 0 0x01D7
+u0075_0308_0301 24 0 0x01D8
+u0055_0308_030C 24 0 0x01D9
+u0075_0308_030C 24 0 0x01DA
+u0055_0308_0300 24 0 0x01DB
+u0075_0308_0300 24 0 0x01DC
+u0041_0308_0304 24 0 0x01DE
+u0061_0308_0304 24 0 0x01DF
+u0041_0307_0304 24 0 0x01E0
+u0061_0307_0304 24 0 0x01E1
+u00C6_0304 24 0 0x01E2
+u00E6_0304 24 0 0x01E3
+u0047_030C 24 0 0x01E6
+u0067_030C 24 0 0x01E7
+u004B_030C 24 0 0x01E8
+u006B_030C 24 0 0x01E9
+u004F_0328 24 0 0x01EA
+u006F_0328 24 0 0x01EB
+u004F_0328_0304 24 0 0x01EC
+u006F_0328_0304 24 0 0x01ED
+u01B7_030C 24 0 0x01EE
+u0292_030C 24 0 0x01EF
+u006A_030C 24 0 0x01F0
+u0047_0301 24 0 0x01F4
+u0067_0301 24 0 0x01F5
+u004E_0300 24 0 0x01F8
+u006E_0300 24 0 0x01F9
+u0041_030A_0301 24 0 0x01FA
+u0061_030A_0301 24 0 0x01FB
+u00C6_0301 24 0 0x01FC
+u00E6_0301 24 0 0x01FD
+u00D8_0301 24 0 0x01FE
+u00F8_0301 24 0 0x01FF
+u0041_030F 24 0 0x0200
+u0061_030F 24 0 0x0201
+u0041_0311 24 0 0x0202
+u0061_0311 24 0 0x0203
+u0045_030F 24 0 0x0204
+u0065_030F 24 0 0x0205
+u0045_0311 24 0 0x0206
+u0065_0311 24 0 0x0207
+u0049_030F 24 0 0x0208
+u0069_030F 24 0 0x0209
+u0049_0311 24 0 0x020A
+u0069_0311 24 0 0x020B
+u004F_030F 24 0 0x020C
+u006F_030F 24 0 0x020D
+u004F_0311 24 0 0x020E
+u006F_0311 24 0 0x020F
+u0052_030F 24 0 0x0210
+u0072_030F 24 0 0x0211
+u0052_0311 24 0 0x0212
+u0072_0311 24 0 0x0213
+u0055_030F 24 0 0x0214
+u0075_030F 24 0 0x0215
+u0055_0311 24 0 0x0216
+u0075_0311 24 0 0x0217
+u0053_0326 24 0 0x0218
+u0073_0326 24 0 0x0219
+u0054_0326 24 0 0x021A
+u0074_0326 24 0 0x021B
+u0048_030C 24 0 0x021E
+u0068_030C 24 0 0x021F
+u0041_0307 24 0 0x0226
+u0061_0307 24 0 0x0227
+u0045_0327 24 0 0x0228
+u0065_0327 24 0 0x0229
+u004F_0308_0304 24 0 0x022A
+u006F_0308_0304 24 0 0x022B
+u004F_0303_0304 24 0 0x022C
+u006F_0303_0304 24 0 0x022D
+u004F_0307 24 0 0x022E
+u006F_0307 24 0 0x022F
+u004F_0307_0304 24 0 0x0230
+u006F_0307_0304 24 0 0x0231
+u0059_0304 24 0 0x0232
+u0079_0304 24 0 0x0233
+u0308_0301 24 0 0x0344
+u00A8_0301 24 0 0x0385
+u0391_0301 24 0 0x0386
+u0395_0301 24 0 0x0388
+u0397_0301 24 0 0x0389
+u0399_0301 24 0 0x038A
+u039F_0301 24 0 0x038C
+u03A5_0301 24 0 0x038E
+u03A9_0301 24 0 0x038F
+u03B9_0308_0301 24 0 0x0390
+u0399_0308 24 0 0x03AA
+u03A5_0308 24 0 0x03AB
+u03B1_0301 24 0 0x03AC
+u03B5_0301 24 0 0x03AD
+u03B7_0301 24 0 0x03AE
+u03B9_0301 24 0 0x03AF
+u03C5_0308_0301 24 0 0x03B0
+u03B9_0308 24 0 0x03CA
+u03C5_0308 24 0 0x03CB
+u03BF_0301 24 0 0x03CC
+u03C5_0301 24 0 0x03CD
+u03C9_0301 24 0 0x03CE
+u03D2_0301 24 0 0x03D3
+u03D2_0308 24 0 0x03D4
+u0415_0300 24 0 0x0400
+u0415_0308 24 0 0x0401
+u0413_0301 24 0 0x0403
+u0406_0308 24 0 0x0407
+u041A_0301 24 0 0x040C
+u0418_0300 24 0 0x040D
+u0423_0306 24 0 0x040E
+u0418_0306 24 0 0x0419
+u0438_0306 24 0 0x0439
+u0435_0300 24 0 0x0450
+u0435_0308 24 0 0x0451
+u0433_0301 24 0 0x0453
+u0456_0308 24 0 0x0457
+u043A_0301 24 0 0x045C
+u0438_0300 24 0 0x045D
+u0443_0306 24 0 0x045E
+u0474_030F 24 0 0x0476
+u0475_030F 24 0 0x0477
+u0416_0306 24 0 0x04C1
+u0436_0306 24 0 0x04C2
+u0410_0306 24 0 0x04D0
+u0430_0306 24 0 0x04D1
+u0410_0308 24 0 0x04D2
+u0430_0308 24 0 0x04D3
+u0415_0306 24 0 0x04D6
+u0435_0306 24 0 0x04D7
+u04D8_0308 24 0 0x04DA
+u04D9_0308 24 0 0x04DB
+u0416_0308 24 0 0x04DC
+u0436_0308 24 0 0x04DD
+u0417_0308 24 0 0x04DE
+u0437_0308 24 0 0x04DF
+u0418_0304 24 0 0x04E2
+u0438_0304 24 0 0x04E3
+u0418_0308 24 0 0x04E4
+u0438_0308 24 0 0x04E5
+u041E_0308 24 0 0x04E6
+u043E_0308 24 0 0x04E7
+u04E8_0308 24 0 0x04EA
+u04E9_0308 24 0 0x04EB
+u042D_0308 24 0 0x04EC
+u044D_0308 24 0 0x04ED
+u0423_0304 24 0 0x04EE
+u0443_0304 24 0 0x04EF
+u0423_0308 24 0 0x04F0
+u0443_0308 24 0 0x04F1
+u0423_030B 24 0 0x04F2
+u0443_030B 24 0 0x04F3
+u0427_0308 24 0 0x04F4
+u0447_0308 24 0 0x04F5
+u042B_0308 24 0 0x04F8
+u044B_0308 24 0 0x04F9
+u0627_0653 24 0 0x0622
+u0627_0654 24 0 0x0623
+u0648_0654 24 0 0x0624
+u0627_0655 24 0 0x0625
+u064A_0654 24 0 0x0626
+u06D5_0654 24 0 0x06C0
+u06C1_0654 24 0 0x06C2
+u06D2_0654 24 0 0x06D3
+u0928_093C 24 0 0x0929
+u0930_093C 24 0 0x0931
+u0933_093C 24 0 0x0934
+u0915_093C 24 0 0x0958
+u0916_093C 24 0 0x0959
+u0917_093C 24 0 0x095A
+u091C_093C 24 0 0x095B
+u0921_093C 24 0 0x095C
+u0922_093C 24 0 0x095D
+u092B_093C 24 0 0x095E
+u092F_093C 24 0 0x095F
+u09C7_09BE 24 0 0x09CB
+u09C7_09D7 24 0 0x09CC
+u09A1_09BC 24 0 0x09DC
+u09A2_09BC 24 0 0x09DD
+u09AF_09BC 24 0 0x09DF
+u0A32_0A3C 24 0 0x0A33
+u0A38_0A3C 24 0 0x0A36
+u0A16_0A3C 24 0 0x0A59
+u0A17_0A3C 24 0 0x0A5A
+u0A1C_0A3C 24 0 0x0A5B
+u0A2B_0A3C 24 0 0x0A5E
+u0B47_0B56 24 0 0x0B48
+u0B47_0B3E 24 0 0x0B4B
+u0B47_0B57 24 0 0x0B4C
+u0B21_0B3C 24 0 0x0B5C
+u0B22_0B3C 24 0 0x0B5D
+u0B92_0BD7 24 0 0x0B94
+u0BC6_0BBE 24 0 0x0BCA
+u0BC7_0BBE 24 0 0x0BCB
+u0BC6_0BD7 24 0 0x0BCC
+u0C46_0C56 24 0 0x0C48
+u0CBF_0CD5 24 0 0x0CC0
+u0CC6_0CD5 24 0 0x0CC7
+u0CC6_0CD6 24 0 0x0CC8
+u0CC6_0CC2 24 0 0x0CCA
+u0CC6_0CC2_0CD5 24 0 0x0CCB
+u0D46_0D3E 24 0 0x0D4A
+u0D47_0D3E 24 0 0x0D4B
+u0D46_0D57 24 0 0x0D4C
+u0DD9_0DCA 24 0 0x0DDA
+u0DD9_0DCF 24 0 0x0DDC
+u0DD9_0DCF_0DCA 24 0 0x0DDD
+u0DD9_0DDF 24 0 0x0DDE
+u0F42_0FB7 24 0 0x0F43
+u0F4C_0FB7 24 0 0x0F4D
+u0F51_0FB7 24 0 0x0F52
+u0F56_0FB7 24 0 0x0F57
+u0F5B_0FB7 24 0 0x0F5C
+u0F40_0FB5 24 0 0x0F69
+u0F71_0F72 24 0 0x0F73
+u0F71_0F74 24 0 0x0F75
+u0FB2_0F80 24 0 0x0F76
+u0FB3_0F80 24 0 0x0F78
+u0F71_0F80 24 0 0x0F81
+u0F92_0FB7 24 0 0x0F93
+u0F9C_0FB7 24 0 0x0F9D
+u0FA1_0FB7 24 0 0x0FA2
+u0FA6_0FB7 24 0 0x0FA7
+u0FAB_0FB7 24 0 0x0FAC
+u0F90_0FB5 24 0 0x0FB9
+u1025_102E 24 0 0x1026
+u0041_0325 24 0 0x1E00
+u0061_0325 24 0 0x1E01
+u0042_0307 24 0 0x1E02
+u0062_0307 24 0 0x1E03
+u0042_0323 24 0 0x1E04
+u0062_0323 24 0 0x1E05
+u0042_0331 24 0 0x1E06
+u0062_0331 24 0 0x1E07
+u0043_0327_0301 24 0 0x1E08
+u0063_0327_0301 24 0 0x1E09
+u0044_0307 24 0 0x1E0A
+u0064_0307 24 0 0x1E0B
+u0044_0323 24 0 0x1E0C
+u0064_0323 24 0 0x1E0D
+u0044_0331 24 0 0x1E0E
+u0064_0331 24 0 0x1E0F
+u0044_0327 24 0 0x1E10
+u0064_0327 24 0 0x1E11
+u0044_032D 24 0 0x1E12
+u0064_032D 24 0 0x1E13
+u0045_0304_0300 24 0 0x1E14
+u0065_0304_0300 24 0 0x1E15
+u0045_0304_0301 24 0 0x1E16
+u0065_0304_0301 24 0 0x1E17
+u0045_032D 24 0 0x1E18
+u0065_032D 24 0 0x1E19
+u0045_0330 24 0 0x1E1A
+u0065_0330 24 0 0x1E1B
+u0045_0327_0306 24 0 0x1E1C
+u0065_0327_0306 24 0 0x1E1D
+u0046_0307 24 0 0x1E1E
+u0066_0307 24 0 0x1E1F
+u0047_0304 24 0 0x1E20
+u0067_0304 24 0 0x1E21
+u0048_0307 24 0 0x1E22
+u0068_0307 24 0 0x1E23
+u0048_0323 24 0 0x1E24
+u0068_0323 24 0 0x1E25
+u0048_0308 24 0 0x1E26
+u0068_0308 24 0 0x1E27
+u0048_0327 24 0 0x1E28
+u0068_0327 24 0 0x1E29
+u0048_032E 24 0 0x1E2A
+u0068_032E 24 0 0x1E2B
+u0049_0330 24 0 0x1E2C
+u0069_0330 24 0 0x1E2D
+u0049_0308_0301 24 0 0x1E2E
+u0069_0308_0301 24 0 0x1E2F
+u004B_0301 24 0 0x1E30
+u006B_0301 24 0 0x1E31
+u004B_0323 24 0 0x1E32
+u006B_0323 24 0 0x1E33
+u004B_0331 24 0 0x1E34
+u006B_0331 24 0 0x1E35
+u004C_0323 24 0 0x1E36
+u006C_0323 24 0 0x1E37
+u004C_0323_0304 24 0 0x1E38
+u006C_0323_0304 24 0 0x1E39
+u004C_0331 24 0 0x1E3A
+u006C_0331 24 0 0x1E3B
+u004C_032D 24 0 0x1E3C
+u006C_032D 24 0 0x1E3D
+u004D_0301 24 0 0x1E3E
+u006D_0301 24 0 0x1E3F
+u004D_0307 24 0 0x1E40
+u006D_0307 24 0 0x1E41
+u004D_0323 24 0 0x1E42
+u006D_0323 24 0 0x1E43
+u004E_0307 24 0 0x1E44
+u006E_0307 24 0 0x1E45
+u004E_0323 24 0 0x1E46
+u006E_0323 24 0 0x1E47
+u004E_0331 24 0 0x1E48
+u006E_0331 24 0 0x1E49
+u004E_032D 24 0 0x1E4A
+u006E_032D 24 0 0x1E4B
+u004F_0303_0301 24 0 0x1E4C
+u006F_0303_0301 24 0 0x1E4D
+u004F_0303_0308 24 0 0x1E4E
+u006F_0303_0308 24 0 0x1E4F
+u004F_0304_0300 24 0 0x1E50
+u006F_0304_0300 24 0 0x1E51
+u004F_0304_0301 24 0 0x1E52
+u006F_0304_0301 24 0 0x1E53
+u0050_0301 24 0 0x1E54
+u0070_0301 24 0 0x1E55
+u0050_0307 24 0 0x1E56
+u0070_0307 24 0 0x1E57
+u0052_0307 24 0 0x1E58
+u0072_0307 24 0 0x1E59
+u0052_0323 24 0 0x1E5A
+u0072_0323 24 0 0x1E5B
+u0052_0323_0304 24 0 0x1E5C
+u0072_0323_0304 24 0 0x1E5D
+u0052_0331 24 0 0x1E5E
+u0072_0331 24 0 0x1E5F
+u0053_0307 24 0 0x1E60
+u0073_0307 24 0 0x1E61
+u0053_0323 24 0 0x1E62
+u0073_0323 24 0 0x1E63
+u0053_0301_0307 24 0 0x1E64
+u0073_0301_0307 24 0 0x1E65
+u0053_030C_0307 24 0 0x1E66
+u0073_030C_0307 24 0 0x1E67
+u0053_0323_0307 24 0 0x1E68
+u0073_0323_0307 24 0 0x1E69
+u0054_0307 24 0 0x1E6A
+u0074_0307 24 0 0x1E6B
+u0054_0323 24 0 0x1E6C
+u0074_0323 24 0 0x1E6D
+u0054_0331 24 0 0x1E6E
+u0074_0331 24 0 0x1E6F
+u0054_032D 24 0 0x1E70
+u0074_032D 24 0 0x1E71
+u0055_0324 24 0 0x1E72
+u0075_0324 24 0 0x1E73
+u0055_0330 24 0 0x1E74
+u0075_0330 24 0 0x1E75
+u0055_032D 24 0 0x1E76
+u0075_032D 24 0 0x1E77
+u0055_0303_0301 24 0 0x1E78
+u0075_0303_0301 24 0 0x1E79
+u0055_0304_0308 24 0 0x1E7A
+u0075_0304_0308 24 0 0x1E7B
+u0056_0303 24 0 0x1E7C
+u0076_0303 24 0 0x1E7D
+u0056_0323 24 0 0x1E7E
+u0076_0323 24 0 0x1E7F
+u0057_0300 24 0 0x1E80
+u0077_0300 24 0 0x1E81
+u0057_0301 24 0 0x1E82
+u0077_0301 24 0 0x1E83
+u0057_0308 24 0 0x1E84
+u0077_0308 24 0 0x1E85
+u0057_0307 24 0 0x1E86
+u0077_0307 24 0 0x1E87
+u0057_0323 24 0 0x1E88
+u0077_0323 24 0 0x1E89
+u0058_0307 24 0 0x1E8A
+u0078_0307 24 0 0x1E8B
+u0058_0308 24 0 0x1E8C
+u0078_0308 24 0 0x1E8D
+u0059_0307 24 0 0x1E8E
+u0079_0307 24 0 0x1E8F
+u005A_0302 24 0 0x1E90
+u007A_0302 24 0 0x1E91
+u005A_0323 24 0 0x1E92
+u007A_0323 24 0 0x1E93
+u005A_0331 24 0 0x1E94
+u007A_0331 24 0 0x1E95
+u0068_0331 24 0 0x1E96
+u0074_0308 24 0 0x1E97
+u0077_030A 24 0 0x1E98
+u0079_030A 24 0 0x1E99
+u017F_0307 24 0 0x1E9B
+u0041_0323 24 0 0x1EA0
+u0061_0323 24 0 0x1EA1
+u0041_0309 24 0 0x1EA2
+u0061_0309 24 0 0x1EA3
+u0041_0302_0301 24 0 0x1EA4
+u0061_0302_0301 24 0 0x1EA5
+u0041_0302_0300 24 0 0x1EA6
+u0061_0302_0300 24 0 0x1EA7
+u0041_0302_0309 24 0 0x1EA8
+u0061_0302_0309 24 0 0x1EA9
+u0041_0302_0303 24 0 0x1EAA
+u0061_0302_0303 24 0 0x1EAB
+u0041_0323_0302 24 0 0x1EAC
+u0061_0323_0302 24 0 0x1EAD
+u0041_0306_0301 24 0 0x1EAE
+u0061_0306_0301 24 0 0x1EAF
+u0041_0306_0300 24 0 0x1EB0
+u0061_0306_0300 24 0 0x1EB1
+u0041_0306_0309 24 0 0x1EB2
+u0061_0306_0309 24 0 0x1EB3
+u0041_0306_0303 24 0 0x1EB4
+u0061_0306_0303 24 0 0x1EB5
+u0041_0323_0306 24 0 0x1EB6
+u0061_0323_0306 24 0 0x1EB7
+u0045_0323 24 0 0x1EB8
+u0065_0323 24 0 0x1EB9
+u0045_0309 24 0 0x1EBA
+u0065_0309 24 0 0x1EBB
+u0045_0303 24 0 0x1EBC
+u0065_0303 24 0 0x1EBD
+u0045_0302_0301 24 0 0x1EBE
+u0065_0302_0301 24 0 0x1EBF
+u0045_0302_0300 24 0 0x1EC0
+u0065_0302_0300 24 0 0x1EC1
+u0045_0302_0309 24 0 0x1EC2
+u0065_0302_0309 24 0 0x1EC3
+u0045_0302_0303 24 0 0x1EC4
+u0065_0302_0303 24 0 0x1EC5
+u0045_0323_0302 24 0 0x1EC6
+u0065_0323_0302 24 0 0x1EC7
+u0049_0309 24 0 0x1EC8
+u0069_0309 24 0 0x1EC9
+u0049_0323 24 0 0x1ECA
+u0069_0323 24 0 0x1ECB
+u004F_0323 24 0 0x1ECC
+u006F_0323 24 0 0x1ECD
+u004F_0309 24 0 0x1ECE
+u006F_0309 24 0 0x1ECF
+u004F_0302_0301 24 0 0x1ED0
+u006F_0302_0301 24 0 0x1ED1
+u004F_0302_0300 24 0 0x1ED2
+u006F_0302_0300 24 0 0x1ED3
+u004F_0302_0309 24 0 0x1ED4
+u006F_0302_0309 24 0 0x1ED5
+u004F_0302_0303 24 0 0x1ED6
+u006F_0302_0303 24 0 0x1ED7
+u004F_0323_0302 24 0 0x1ED8
+u006F_0323_0302 24 0 0x1ED9
+u004F_031B_0301 24 0 0x1EDA
+u006F_031B_0301 24 0 0x1EDB
+u004F_031B_0300 24 0 0x1EDC
+u006F_031B_0300 24 0 0x1EDD
+u004F_031B_0309 24 0 0x1EDE
+u006F_031B_0309 24 0 0x1EDF
+u004F_031B_0303 24 0 0x1EE0
+u006F_031B_0303 24 0 0x1EE1
+u004F_031B_0323 24 0 0x1EE2
+u006F_031B_0323 24 0 0x1EE3
+u0055_0323 24 0 0x1EE4
+u0075_0323 24 0 0x1EE5
+u0055_0309 24 0 0x1EE6
+u0075_0309 24 0 0x1EE7
+u0055_031B_0301 24 0 0x1EE8
+u0075_031B_0301 24 0 0x1EE9
+u0055_031B_0300 24 0 0x1EEA
+u0075_031B_0300 24 0 0x1EEB
+u0055_031B_0309 24 0 0x1EEC
+u0075_031B_0309 24 0 0x1EED
+u0055_031B_0303 24 0 0x1EEE
+u0075_031B_0303 24 0 0x1EEF
+u0055_031B_0323 24 0 0x1EF0
+u0075_031B_0323 24 0 0x1EF1
+u0059_0300 24 0 0x1EF2
+u0079_0300 24 0 0x1EF3
+u0059_0323 24 0 0x1EF4
+u0079_0323 24 0 0x1EF5
+u0059_0309 24 0 0x1EF6
+u0079_0309 24 0 0x1EF7
+u0059_0303 24 0 0x1EF8
+u0079_0303 24 0 0x1EF9
+u03B1_0313 24 0 0x1F00
+u03B1_0314 24 0 0x1F01
+u03B1_0313_0300 24 0 0x1F02
+u03B1_0314_0300 24 0 0x1F03
+u03B1_0313_0301 24 0 0x1F04
+u03B1_0314_0301 24 0 0x1F05
+u03B1_0313_0342 24 0 0x1F06
+u03B1_0314_0342 24 0 0x1F07
+u0391_0313 24 0 0x1F08
+u0391_0314 24 0 0x1F09
+u0391_0313_0300 24 0 0x1F0A
+u0391_0314_0300 24 0 0x1F0B
+u0391_0313_0301 24 0 0x1F0C
+u0391_0314_0301 24 0 0x1F0D
+u0391_0313_0342 24 0 0x1F0E
+u0391_0314_0342 24 0 0x1F0F
+u03B5_0313 24 0 0x1F10
+u03B5_0314 24 0 0x1F11
+u03B5_0313_0300 24 0 0x1F12
+u03B5_0314_0300 24 0 0x1F13
+u03B5_0313_0301 24 0 0x1F14
+u03B5_0314_0301 24 0 0x1F15
+u0395_0313 24 0 0x1F18
+u0395_0314 24 0 0x1F19
+u0395_0313_0300 24 0 0x1F1A
+u0395_0314_0300 24 0 0x1F1B
+u0395_0313_0301 24 0 0x1F1C
+u0395_0314_0301 24 0 0x1F1D
+u03B7_0313 24 0 0x1F20
+u03B7_0314 24 0 0x1F21
+u03B7_0313_0300 24 0 0x1F22
+u03B7_0314_0300 24 0 0x1F23
+u03B7_0313_0301 24 0 0x1F24
+u03B7_0314_0301 24 0 0x1F25
+u03B7_0313_0342 24 0 0x1F26
+u03B7_0314_0342 24 0 0x1F27
+u0397_0313 24 0 0x1F28
+u0397_0314 24 0 0x1F29
+u0397_0313_0300 24 0 0x1F2A
+u0397_0314_0300 24 0 0x1F2B
+u0397_0313_0301 24 0 0x1F2C
+u0397_0314_0301 24 0 0x1F2D
+u0397_0313_0342 24 0 0x1F2E
+u0397_0314_0342 24 0 0x1F2F
+u03B9_0313 24 0 0x1F30
+u03B9_0314 24 0 0x1F31
+u03B9_0313_0300 24 0 0x1F32
+u03B9_0314_0300 24 0 0x1F33
+u03B9_0313_0301 24 0 0x1F34
+u03B9_0314_0301 24 0 0x1F35
+u03B9_0313_0342 24 0 0x1F36
+u03B9_0314_0342 24 0 0x1F37
+u0399_0313 24 0 0x1F38
+u0399_0314 24 0 0x1F39
+u0399_0313_0300 24 0 0x1F3A
+u0399_0314_0300 24 0 0x1F3B
+u0399_0313_0301 24 0 0x1F3C
+u0399_0314_0301 24 0 0x1F3D
+u0399_0313_0342 24 0 0x1F3E
+u0399_0314_0342 24 0 0x1F3F
+u03BF_0313 24 0 0x1F40
+u03BF_0314 24 0 0x1F41
+u03BF_0313_0300 24 0 0x1F42
+u03BF_0314_0300 24 0 0x1F43
+u03BF_0313_0301 24 0 0x1F44
+u03BF_0314_0301 24 0 0x1F45
+u039F_0313 24 0 0x1F48
+u039F_0314 24 0 0x1F49
+u039F_0313_0300 24 0 0x1F4A
+u039F_0314_0300 24 0 0x1F4B
+u039F_0313_0301 24 0 0x1F4C
+u039F_0314_0301 24 0 0x1F4D
+u03C5_0313 24 0 0x1F50
+u03C5_0314 24 0 0x1F51
+u03C5_0313_0300 24 0 0x1F52
+u03C5_0314_0300 24 0 0x1F53
+u03C5_0313_0301 24 0 0x1F54
+u03C5_0314_0301 24 0 0x1F55
+u03C5_0313_0342 24 0 0x1F56
+u03C5_0314_0342 24 0 0x1F57
+u03A5_0314 24 0 0x1F59
+u03A5_0314_0300 24 0 0x1F5B
+u03A5_0314_0301 24 0 0x1F5D
+u03A5_0314_0342 24 0 0x1F5F
+u03C9_0313 24 0 0x1F60
+u03C9_0314 24 0 0x1F61
+u03C9_0313_0300 24 0 0x1F62
+u03C9_0314_0300 24 0 0x1F63
+u03C9_0313_0301 24 0 0x1F64
+u03C9_0314_0301 24 0 0x1F65
+u03C9_0313_0342 24 0 0x1F66
+u03C9_0314_0342 24 0 0x1F67
+u03A9_0313 24 0 0x1F68
+u03A9_0314 24 0 0x1F69
+u03A9_0313_0300 24 0 0x1F6A
+u03A9_0314_0300 24 0 0x1F6B
+u03A9_0313_0301 24 0 0x1F6C
+u03A9_0314_0301 24 0 0x1F6D
+u03A9_0313_0342 24 0 0x1F6E
+u03A9_0314_0342 24 0 0x1F6F
+u03B1_0300 24 0 0x1F70
+u03B1_0301 24 0 0x1F71
+u03B5_0300 24 0 0x1F72
+u03B5_0301 24 0 0x1F73
+u03B7_0300 24 0 0x1F74
+u03B7_0301 24 0 0x1F75
+u03B9_0300 24 0 0x1F76
+u03B9_0301 24 0 0x1F77
+u03BF_0300 24 0 0x1F78
+u03BF_0301 24 0 0x1F79
+u03C5_0300 24 0 0x1F7A
+u03C5_0301 24 0 0x1F7B
+u03C9_0300 24 0 0x1F7C
+u03C9_0301 24 0 0x1F7D
+u03B1_0313_0345 24 0 0x1F80
+u03B1_0314_0345 24 0 0x1F81
+u03B1_0313_0300_0345 24 0 0x1F82
+u03B1_0314_0300_0345 24 0 0x1F83
+u03B1_0313_0301_0345 24 0 0x1F84
+u03B1_0314_0301_0345 24 0 0x1F85
+u03B1_0313_0342_0345 24 0 0x1F86
+u03B1_0314_0342_0345 24 0 0x1F87
+u0391_0313_0345 24 0 0x1F88
+u0391_0314_0345 24 0 0x1F89
+u0391_0313_0300_0345 24 0 0x1F8A
+u0391_0314_0300_0345 24 0 0x1F8B
+u0391_0313_0301_0345 24 0 0x1F8C
+u0391_0314_0301_0345 24 0 0x1F8D
+u0391_0313_0342_0345 24 0 0x1F8E
+u0391_0314_0342_0345 24 0 0x1F8F
+u03B7_0313_0345 24 0 0x1F90
+u03B7_0314_0345 24 0 0x1F91
+u03B7_0313_0300_0345 24 0 0x1F92
+u03B7_0314_0300_0345 24 0 0x1F93
+u03B7_0313_0301_0345 24 0 0x1F94
+u03B7_0314_0301_0345 24 0 0x1F95
+u03B7_0313_0342_0345 24 0 0x1F96
+u03B7_0314_0342_0345 24 0 0x1F97
+u0397_0313_0345 24 0 0x1F98
+u0397_0314_0345 24 0 0x1F99
+u0397_0313_0300_0345 24 0 0x1F9A
+u0397_0314_0300_0345 24 0 0x1F9B
+u0397_0313_0301_0345 24 0 0x1F9C
+u0397_0314_0301_0345 24 0 0x1F9D
+u0397_0313_0342_0345 24 0 0x1F9E
+u0397_0314_0342_0345 24 0 0x1F9F
+u03C9_0313_0345 24 0 0x1FA0
+u03C9_0314_0345 24 0 0x1FA1
+u03C9_0313_0300_0345 24 0 0x1FA2
+u03C9_0314_0300_0345 24 0 0x1FA3
+u03C9_0313_0301_0345 24 0 0x1FA4
+u03C9_0314_0301_0345 24 0 0x1FA5
+u03C9_0313_0342_0345 24 0 0x1FA6
+u03C9_0314_0342_0345 24 0 0x1FA7
+u03A9_0313_0345 24 0 0x1FA8
+u03A9_0314_0345 24 0 0x1FA9
+u03A9_0313_0300_0345 24 0 0x1FAA
+u03A9_0314_0300_0345 24 0 0x1FAB
+u03A9_0313_0301_0345 24 0 0x1FAC
+u03A9_0314_0301_0345 24 0 0x1FAD
+u03A9_0313_0342_0345 24 0 0x1FAE
+u03A9_0314_0342_0345 24 0 0x1FAF
+u03B1_0306 24 0 0x1FB0
+u03B1_0304 24 0 0x1FB1
+u03B1_0300_0345 24 0 0x1FB2
+u03B1_0345 24 0 0x1FB3
+u03B1_0301_0345 24 0 0x1FB4
+u03B1_0342 24 0 0x1FB6
+u03B1_0342_0345 24 0 0x1FB7
+u0391_0306 24 0 0x1FB8
+u0391_0304 24 0 0x1FB9
+u0391_0300 24 0 0x1FBA
+u0391_0301 24 0 0x1FBB
+u0391_0345 24 0 0x1FBC
+u00A8_0342 24 0 0x1FC1
+u03B7_0300_0345 24 0 0x1FC2
+u03B7_0345 24 0 0x1FC3
+u03B7_0301_0345 24 0 0x1FC4
+u03B7_0342 24 0 0x1FC6
+u03B7_0342_0345 24 0 0x1FC7
+u0395_0300 24 0 0x1FC8
+u0395_0301 24 0 0x1FC9
+u0397_0300 24 0 0x1FCA
+u0397_0301 24 0 0x1FCB
+u0397_0345 24 0 0x1FCC
+u1FBF_0300 24 0 0x1FCD
+u1FBF_0301 24 0 0x1FCE
+u1FBF_0342 24 0 0x1FCF
+u03B9_0306 24 0 0x1FD0
+u03B9_0304 24 0 0x1FD1
+u03B9_0308_0300 24 0 0x1FD2
+u03B9_0308_0301 24 0 0x1FD3
+u03B9_0342 24 0 0x1FD6
+u03B9_0308_0342 24 0 0x1FD7
+u0399_0306 24 0 0x1FD8
+u0399_0304 24 0 0x1FD9
+u0399_0300 24 0 0x1FDA
+u0399_0301 24 0 0x1FDB
+u1FFE_0300 24 0 0x1FDD
+u1FFE_0301 24 0 0x1FDE
+u1FFE_0342 24 0 0x1FDF
+u03C5_0306 24 0 0x1FE0
+u03C5_0304 24 0 0x1FE1
+u03C5_0308_0300 24 0 0x1FE2
+u03C5_0308_0301 24 0 0x1FE3
+u03C1_0313 24 0 0x1FE4
+u03C1_0314 24 0 0x1FE5
+u03C5_0342 24 0 0x1FE6
+u03C5_0308_0342 24 0 0x1FE7
+u03A5_0306 24 0 0x1FE8
+u03A5_0304 24 0 0x1FE9
+u03A5_0300 24 0 0x1FEA
+u03A5_0301 24 0 0x1FEB
+u03A1_0314 24 0 0x1FEC
+u00A8_0300 24 0 0x1FED
+u00A8_0301 24 0 0x1FEE
+u03C9_0300_0345 24 0 0x1FF2
+u03C9_0345 24 0 0x1FF3
+u03C9_0301_0345 24 0 0x1FF4
+u03C9_0342 24 0 0x1FF6
+u03C9_0342_0345 24 0 0x1FF7
+u039F_0300 24 0 0x1FF8
+u039F_0301 24 0 0x1FF9
+u03A9_0300 24 0 0x1FFA
+u03A9_0301 24 0 0x1FFB
+u03A9_0345 24 0 0x1FFC
+u0041_030A 24 0 0x212B
+u2190_0338 24 0 0x219A
+u2192_0338 24 0 0x219B
+u2194_0338 24 0 0x21AE
+u21D0_0338 24 0 0x21CD
+u21D4_0338 24 0 0x21CE
+u21D2_0338 24 0 0x21CF
+u2203_0338 24 0 0x2204
+u2208_0338 24 0 0x2209
+u220B_0338 24 0 0x220C
+u2223_0338 24 0 0x2224
+u2225_0338 24 0 0x2226
+u223C_0338 24 0 0x2241
+u2243_0338 24 0 0x2244
+u2245_0338 24 0 0x2247
+u2248_0338 24 0 0x2249
+u003D_0338 24 0 0x2260
+u2261_0338 24 0 0x2262
+u224D_0338 24 0 0x226D
+u003C_0338 24 0 0x226E
+u003E_0338 24 0 0x226F
+u2264_0338 24 0 0x2270
+u2265_0338 24 0 0x2271
+u2272_0338 24 0 0x2274
+u2273_0338 24 0 0x2275
+u2276_0338 24 0 0x2278
+u2277_0338 24 0 0x2279
+u227A_0338 24 0 0x2280
+u227B_0338 24 0 0x2281
+u2282_0338 24 0 0x2284
+u2283_0338 24 0 0x2285
+u2286_0338 24 0 0x2288
+u2287_0338 24 0 0x2289
+u22A2_0338 24 0 0x22AC
+u22A8_0338 24 0 0x22AD
+u22A9_0338 24 0 0x22AE
+u22AB_0338 24 0 0x22AF
+u227C_0338 24 0 0x22E0
+u227D_0338 24 0 0x22E1
+u2291_0338 24 0 0x22E2
+u2292_0338 24 0 0x22E3
+u22B2_0338 24 0 0x22EA
+u22B3_0338 24 0 0x22EB
+u22B4_0338 24 0 0x22EC
+u22B5_0338 24 0 0x22ED
+u2ADD_0338 24 0 0x2ADC
+u304B_3099 24 0 0x304C
+u304D_3099 24 0 0x304E
+u304F_3099 24 0 0x3050
+u3051_3099 24 0 0x3052
+u3053_3099 24 0 0x3054
+u3055_3099 24 0 0x3056
+u3057_3099 24 0 0x3058
+u3059_3099 24 0 0x305A
+u305B_3099 24 0 0x305C
+u305D_3099 24 0 0x305E
+u305F_3099 24 0 0x3060
+u3061_3099 24 0 0x3062
+u3064_3099 24 0 0x3065
+u3066_3099 24 0 0x3067
+u3068_3099 24 0 0x3069
+u306F_3099 24 0 0x3070
+u306F_309A 24 0 0x3071
+u3072_3099 24 0 0x3073
+u3072_309A 24 0 0x3074
+u3075_3099 24 0 0x3076
+u3075_309A 24 0 0x3077
+u3078_3099 24 0 0x3079
+u3078_309A 24 0 0x307A
+u307B_3099 24 0 0x307C
+u307B_309A 24 0 0x307D
+u3046_3099 24 0 0x3094
+u309D_3099 24 0 0x309E
+u30AB_3099 24 0 0x30AC
+u30AD_3099 24 0 0x30AE
+u30AF_3099 24 0 0x30B0
+u30B1_3099 24 0 0x30B2
+u30B3_3099 24 0 0x30B4
+u30B5_3099 24 0 0x30B6
+u30B7_3099 24 0 0x30B8
+u30B9_3099 24 0 0x30BA
+u30BB_3099 24 0 0x30BC
+u30BD_3099 24 0 0x30BE
+u30BF_3099 24 0 0x30C0
+u30C1_3099 24 0 0x30C2
+u30C4_3099 24 0 0x30C5
+u30C6_3099 24 0 0x30C7
+u30C8_3099 24 0 0x30C9
+u30CF_3099 24 0 0x30D0
+u30CF_309A 24 0 0x30D1
+u30D2_3099 24 0 0x30D3
+u30D2_309A 24 0 0x30D4
+u30D5_3099 24 0 0x30D6
+u30D5_309A 24 0 0x30D7
+u30D8_3099 24 0 0x30D9
+u30D8_309A 24 0 0x30DA
+u30DB_3099 24 0 0x30DC
+u30DB_309A 24 0 0x30DD
+u30A6_3099 24 0 0x30F4
+u30EF_3099 24 0 0x30F7
+u30F0_3099 24 0 0x30F8
+u30F1_3099 24 0 0x30F9
+u30F2_3099 24 0 0x30FA
+u30FD_3099 24 0 0x30FE
+u05D9_05B4 24 0 0xFB1D
+u05F2_05B7 24 0 0xFB1F
+u05E9_05C1 24 0 0xFB2A
+u05E9_05C2 24 0 0xFB2B
+u05E9_05BC_05C1 24 0 0xFB2C
+u05E9_05BC_05C2 24 0 0xFB2D
+u05D0_05B7 24 0 0xFB2E
+u05D0_05B8 24 0 0xFB2F
+u05D0_05BC 24 0 0xFB30
+u05D1_05BC 24 0 0xFB31
+u05D2_05BC 24 0 0xFB32
+u05D3_05BC 24 0 0xFB33
+u05D4_05BC 24 0 0xFB34
+u05D5_05BC 24 0 0xFB35
+u05D6_05BC 24 0 0xFB36
+u05D8_05BC 24 0 0xFB38
+u05D9_05BC 24 0 0xFB39
+u05DA_05BC 24 0 0xFB3A
+u05DB_05BC 24 0 0xFB3B
+u05DC_05BC 24 0 0xFB3C
+u05DE_05BC 24 0 0xFB3E
+u05E0_05BC 24 0 0xFB40
+u05E1_05BC 24 0 0xFB41
+u05E3_05BC 24 0 0xFB43
+u05E4_05BC 24 0 0xFB44
+u05E6_05BC 24 0 0xFB46
+u05E7_05BC 24 0 0xFB47
+u05E8_05BC 24 0 0xFB48
+u05E9_05BC 24 0 0xFB49
+u05EA_05BC 24 0 0xFB4A
+u05D5_05B9 24 0 0xFB4B
+u05D1_05BF 24 0 0xFB4C
+u05DB_05BF 24 0 0xFB4D
+u05E4_05BF 24 0 0xFB4E
+u1D157_1D165 24 0 0x1D15E
+u1D158_1D165 24 0 0x1D15F
+u1D158_1D165_1D16E 24 0 0x1D160
+u1D158_1D165_1D16F 24 0 0x1D161
+u1D158_1D165_1D170 24 0 0x1D162
+u1D158_1D165_1D171 24 0 0x1D163
+u1D158_1D165_1D172 24 0 0x1D164
+u1D1B9_1D165 24 0 0x1D1BB
+u1D1BA_1D165 24 0 0x1D1BC
+u1D1B9_1D165_1D16E 24 0 0x1D1BD
+u1D1BA_1D165_1D16E 24 0 0x1D1BE
+u1D1B9_1D165_1D16F 24 0 0x1D1BF
+u1D1BA_1D165_1D16F 24 0 0x1D1C0
diff --git a/font/devutf8/devutf8.am b/font/devutf8/devutf8.am
new file mode 100644
index 0000000..b8f642f
--- /dev/null
+++ b/font/devutf8/devutf8.am
@@ -0,0 +1,59 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+devutf8_srcdir = $(top_srcdir)/font/devutf8
+DEVUTF8FONTS = R I B BI
+DEVUTF8FONTSFILES = \
+ font/devutf8/R font/devutf8/I font/devutf8/B font/devutf8/BI
+
+DEVUTF8RES = 240
+DEVUTF8CPI = 10
+DEVUTF8LPI = 6
+
+devutf8fontdir = $(fontdir)/devutf8
+devutf8font_DATA = $(DEVUTF8FONTSFILES) font/devutf8/DESC
+MOSTLYCLEANFILES += $(DEVUTF8FONTSFILES) font/devutf8/DESC
+EXTRA_DIST += \
+ font/devutf8/R.proto \
+ font/devutf8/DESC.proto \
+ font/devutf8/NOTES \
+ font/devutf8/R.in
+
+$(DEVUTF8FONTSFILES): $(devutf8_srcdir)/R.proto
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && $(RM) $@ \
+ && $(SHELL) $(GENFONTSSH) $(devutf8_srcdir)/R.proto \
+ $(DEVUTF8RES) $(DEVUTF8CPI) `basename $@` >$@
+
+font/devutf8/DESC: $(devutf8_srcdir)/DESC.proto
+ $(AM_V_GEN)$(MKDIR_P) `dirname $@` \
+ && $(SHELL) $(GENDESCSH) $(devutf8_srcdir)/DESC.proto \
+ $(DEVUTF8RES) $(DEVUTF8CPI) $(DEVUTF8LPI) $(DEVUTF8FONTS) >$@
+
+# (UTF-8-encoded) text documents to be produced by troff should depend
+# on this stamp file to ensure that grotty's device and font description
+# files are available.
+MOSTLYCLEANFILES += font/devutf8/stamp
+font/devutf8/stamp: font/devutf8/DESC $(DEVUTF8FONTSFILES)
+ $(AM_V_at)>$@
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/font/scripts/gendesc.sh b/font/scripts/gendesc.sh
new file mode 100755
index 0000000..5bf5376
--- /dev/null
+++ b/font/scripts/gendesc.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+# Usage: gendesc.sh <input .proto> <RES> <CPI> <LPI> <list of fonts>
+if test -z "$1" || test -z "$2" || test -z "$3" || test -z "$4" || \
+ test -z "$5"; then
+ echo "genfonts.sh: missing parameter"; exit 255;
+fi
+INPUT=$1
+RES=$2
+CPI=$3
+LPI=$4
+shift 4
+NBFONTS=`echo $#`
+FONTS=`echo $*`
+sed -e "s/^res .*$/res $RES/" \
+ -e "s/^hor .*$/hor `expr $RES / $CPI`/" \
+ -e "s/^vert .*$/vert `expr $RES / $LPI`/" \
+ -e "s/^fonts .*$/fonts $NBFONTS $FONTS/" \
+ $INPUT
diff --git a/font/scripts/genfonts.sh b/font/scripts/genfonts.sh
new file mode 100755
index 0000000..ad45612
--- /dev/null
+++ b/font/scripts/genfonts.sh
@@ -0,0 +1,23 @@
+#!/bin/sh -xv
+# Usage:
+# genfonts.sh <input .proto file> <RES> <CPI> <FONT name>
+if test -z "$1" || test -z "$2" || test -z "$3" || test -z "$4"; then
+ echo "genfonts.sh: missing parameter"; exit 255;
+fi
+
+INPUT=$1
+RES=$2
+CPI=$3
+FONT=$4
+charwidth=`expr $RES / $CPI` ;
+sed -e "s|^name [A-Z]*$|name $FONT|" \
+ -e \
+ "s/^\\([^ ]*\\) [0-9][0-9]* /\\1 $charwidth /" \
+ -e "s/^spacewidth [0-9][0-9]*$/spacewidth $charwidth/" \
+ -e "s|^internalname .*$|internalname $FONT|" \
+ -e "/^internalname/s/CR/4/" \
+ -e "/^internalname/s/BI/3/" \
+ -e "/^internalname/s/B/2/" \
+ -e "/^internalname/s/I/1/" \
+ -e "/^internalname .*[^ 0-9]/d" \
+ $INPUT
diff --git a/font/scripts/scripts.am b/font/scripts/scripts.am
new file mode 100644
index 0000000..5b63f15
--- /dev/null
+++ b/font/scripts/scripts.am
@@ -0,0 +1,27 @@
+# Copyright (C) 2015-2020 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 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Scripts for font files generation
+GENFONTSSH=$(top_srcdir)/font/scripts/genfonts.sh
+GENDESCSH = $(top_srcdir)/font/scripts/gendesc.sh
+EXTRA_DIST += $(GENFONTSSH) $(GENDESCSH)
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/font/util/make-Rproto b/font/util/make-Rproto
new file mode 100755
index 0000000..9c8aca5
--- /dev/null
+++ b/font/util/make-Rproto
@@ -0,0 +1,47 @@
+#! /bin/sh
+#
+# make-Rproto -- script for creating an R.proto file
+#
+# Copyright (C) 2006-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+#
+# usage:
+#
+# make-Rproto R.proto.in < uniuni.cpp > R.proto
+#
+# 'R.proto.in' contains the device specific part of the R.proto file; it
+# should end with a line containing the word 'charset'.
+#
+# 'uniuni.cpp' is located in directory 'src/libs/libgroff'.
+
+prog="$0"
+
+if test $# -ne 1; then
+ echo "usage: $0 R.proto.in < uniuni.cpp > R.proto"
+ exit 1
+fi
+
+# Emit preamble.
+cat "$1"
+
+# Extract composite characters.
+grep '^ { ".*", ".*_.*" },' \
+| sed 's/ { "\(.*\)", ".\(.*\)" },/u\2 24 0 0x\1/'
+
+# EOF
diff --git a/gendef.sh b/gendef.sh
new file mode 100644
index 0000000..bb30a4f
--- /dev/null
+++ b/gendef.sh
@@ -0,0 +1,52 @@
+#! /bin/sh
+#
+# Copyright (C) 1991-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+#
+# gendef filename var=val var=val ...
+#
+# This script is used to generate src/include/defs.h.
+#
+file=$1
+shift
+
+defs="#define $1"
+shift
+for def
+do
+ defs="$defs
+#define $def"
+done
+
+# Use $TMPDIR if defined. Default to cwd, for non-Unix systems
+# which don't have /tmp on each drive (we are going to remove
+# the file before we exit anyway). Put the PID in the basename,
+# since the extension can only hold 3 characters on MS-DOS.
+t=${TMPDIR-.}/gro$$.tmp
+
+sed -e 's/=/ /' >$t <<EOF
+$defs
+EOF
+
+test -r $file && cmp -s $t $file || cp $t $file
+
+rm -f $t
+
+exit 0
+
+# eof
diff --git a/gnulib_m4/00gnulib.m4 b/gnulib_m4/00gnulib.m4
new file mode 100644
index 0000000..7fe03e0
--- /dev/null
+++ b/gnulib_m4/00gnulib.m4
@@ -0,0 +1,85 @@
+# 00gnulib.m4 serial 8
+dnl Copyright (C) 2009-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This file must be named something that sorts before all other
+dnl gnulib-provided .m4 files. It is needed until the clang fix has
+dnl been included in Autoconf.
+
+# The following definitions arrange to use a compiler option
+# -Werror=implicit-function-declaration in AC_CHECK_DECL, when the
+# compiler is clang. Without it, clang implicitly declares "known"
+# library functions in C mode, but not in C++ mode, which would cause
+# Gnulib to omit a declaration and thus later produce an error in C++
+# mode. As of clang 9.0, these "known" functions are identified through
+# LIBBUILTIN invocations in the LLVM source file
+# llvm/tools/clang/include/clang/Basic/Builtins.def.
+# It's not possible to AC_REQUIRE the extra tests from AC_CHECK_DECL,
+# because AC_CHECK_DECL, like other Autoconf built-ins, is not supposed
+# to AC_REQUIRE anything: some configure.ac files have their first
+# AC_CHECK_DECL executed conditionally. Therefore append the extra tests
+# to AC_PROG_CC.
+AC_DEFUN([gl_COMPILER_CLANG],
+[
+dnl AC_REQUIRE([AC_PROG_CC])
+ AC_CACHE_CHECK([whether the compiler is clang],
+ [gl_cv_compiler_clang],
+ [dnl Use _AC_COMPILE_IFELSE instead of AC_EGREP_CPP, to avoid error
+ dnl "circular dependency of AC_LANG_COMPILER(C)" if AC_PROG_CC has
+ dnl not yet been invoked.
+ _AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[
+ #ifdef __clang__
+ barfbarf
+ #endif
+ ]],[[]])
+ ],
+ [gl_cv_compiler_clang=no],
+ [gl_cv_compiler_clang=yes])
+ ])
+])
+AC_DEFUN([gl_COMPILER_PREPARE_CHECK_DECL],
+[
+dnl AC_REQUIRE([AC_PROG_CC])
+dnl AC_REQUIRE([gl_COMPILER_CLANG])
+ AC_CACHE_CHECK([for compiler option needed when checking for declarations],
+ [gl_cv_compiler_check_decl_option],
+ [if test $gl_cv_compiler_clang = yes; then
+ dnl Test whether the compiler supports the option
+ dnl '-Werror=implicit-function-declaration'.
+ save_ac_compile="$ac_compile"
+ ac_compile="$ac_compile -Werror=implicit-function-declaration"
+ dnl Use _AC_COMPILE_IFELSE instead of AC_COMPILE_IFELSE, to avoid a
+ dnl warning "AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS".
+ _AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],[[]])],
+ [gl_cv_compiler_check_decl_option='-Werror=implicit-function-declaration'],
+ [gl_cv_compiler_check_decl_option=none])
+ ac_compile="$save_ac_compile"
+ else
+ gl_cv_compiler_check_decl_option=none
+ fi
+ ])
+ if test "x$gl_cv_compiler_check_decl_option" != xnone; then
+ ac_compile_for_check_decl="$ac_compile $gl_cv_compiler_check_decl_option"
+ else
+ ac_compile_for_check_decl="$ac_compile"
+ fi
+])
+dnl Redefine _AC_CHECK_DECL_BODY so that it references ac_compile_for_check_decl
+dnl instead of ac_compile. If, for whatever reason, the override of AC_PROG_CC
+dnl in zzgnulib.m4 is inactive, use the original ac_compile.
+m4_define([_AC_CHECK_DECL_BODY],
+[ ac_save_ac_compile="$ac_compile"
+ if test -n "$ac_compile_for_check_decl"; then
+ ac_compile="$ac_compile_for_check_decl"
+ fi]
+m4_defn([_AC_CHECK_DECL_BODY])[ ac_compile="$ac_save_ac_compile"
+])
+
+# gl_00GNULIB
+# -----------
+# Witness macro that this file has been included. Needed to force
+# Automake to include this file prior to all other gnulib .m4 files.
+AC_DEFUN([gl_00GNULIB])
diff --git a/gnulib_m4/absolute-header.m4 b/gnulib_m4/absolute-header.m4
new file mode 100644
index 0000000..e794764
--- /dev/null
+++ b/gnulib_m4/absolute-header.m4
@@ -0,0 +1,100 @@
+# absolute-header.m4 serial 17
+dnl Copyright (C) 2006-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Derek Price.
+
+# gl_ABSOLUTE_HEADER(HEADER1 HEADER2 ...)
+# ---------------------------------------
+# Find the absolute name of a header file, testing first if the header exists.
+# If the header were sys/inttypes.h, this macro would define
+# ABSOLUTE_SYS_INTTYPES_H to the '""' quoted absolute name of sys/inttypes.h
+# in config.h
+# (e.g. '#define ABSOLUTE_SYS_INTTYPES_H "///usr/include/sys/inttypes.h"').
+# The three "///" are to pacify Sun C 5.8, which otherwise would say
+# "warning: #include of /usr/include/... may be non-portable".
+# Use '""', not '<>', so that the /// cannot be confused with a C99 comment.
+# Note: This macro assumes that the header file is not empty after
+# preprocessing, i.e. it does not only define preprocessor macros but also
+# provides some type/enum definitions or function/variable declarations.
+AC_DEFUN([gl_ABSOLUTE_HEADER],
+[AC_REQUIRE([AC_CANONICAL_HOST])
+AC_LANG_PREPROC_REQUIRE()dnl
+m4_foreach_w([gl_HEADER_NAME], [$1],
+ [AS_VAR_PUSHDEF([gl_absolute_header],
+ [gl_cv_absolute_]m4_defn([gl_HEADER_NAME]))dnl
+ AC_CACHE_CHECK([absolute name of <]m4_defn([gl_HEADER_NAME])[>],
+ [gl_absolute_header],
+ [AS_VAR_PUSHDEF([ac_header_exists],
+ [ac_cv_header_]m4_defn([gl_HEADER_NAME]))dnl
+ AC_CHECK_HEADERS_ONCE(m4_defn([gl_HEADER_NAME]))dnl
+ if test AS_VAR_GET([ac_header_exists]) = yes; then
+ gl_ABSOLUTE_HEADER_ONE(m4_defn([gl_HEADER_NAME]))
+ fi
+ AS_VAR_POPDEF([ac_header_exists])dnl
+ ])dnl
+ AC_DEFINE_UNQUOTED(AS_TR_CPP([ABSOLUTE_]m4_defn([gl_HEADER_NAME])),
+ ["AS_VAR_GET([gl_absolute_header])"],
+ [Define this to an absolute name of <]m4_defn([gl_HEADER_NAME])[>.])
+ AS_VAR_POPDEF([gl_absolute_header])dnl
+])dnl
+])# gl_ABSOLUTE_HEADER
+
+# gl_ABSOLUTE_HEADER_ONE(HEADER)
+# ------------------------------
+# Like gl_ABSOLUTE_HEADER, except that:
+# - it assumes that the header exists,
+# - it uses the current CPPFLAGS,
+# - it does not cache the result,
+# - it is silent.
+AC_DEFUN([gl_ABSOLUTE_HEADER_ONE],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_LANG_CONFTEST([AC_LANG_SOURCE([[#include <]]m4_dquote([$1])[[>]])])
+ dnl AIX "xlc -E" and "cc -E" omit #line directives for header files
+ dnl that contain only a #include of other header files and no
+ dnl non-comment tokens of their own. This leads to a failure to
+ dnl detect the absolute name of <dirent.h>, <signal.h>, <poll.h>
+ dnl and others. The workaround is to force preservation of comments
+ dnl through option -C. This ensures all necessary #line directives
+ dnl are present. GCC supports option -C as well.
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+changequote(,)
+ case "$host_os" in
+ mingw*)
+ dnl For the sake of native Windows compilers (excluding gcc),
+ dnl treat backslash as a directory separator, like /.
+ dnl Actually, these compilers use a double-backslash as
+ dnl directory separator, inside the
+ dnl # line "filename"
+ dnl directives.
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ dnl A sed expression that turns a string into a basic regular
+ dnl expression, for use within "/.../".
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo '$1' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+changequote([,])
+ dnl eval is necessary to expand gl_absname_cpp.
+ dnl Ultrix and Pyramid sh refuse to redirect output of eval,
+ dnl so use subshell.
+ AS_VAR_SET([gl_cv_absolute_]AS_TR_SH([[$1]]),
+[`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD |
+ sed -n "$gl_absolute_header_sed"`])
+])
diff --git a/gnulib_m4/alloca.m4 b/gnulib_m4/alloca.m4
new file mode 100644
index 0000000..c685fac
--- /dev/null
+++ b/gnulib_m4/alloca.m4
@@ -0,0 +1,106 @@
+# alloca.m4 serial 21
+dnl Copyright (C) 2002-2004, 2006-2007, 2009-2023 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ALLOCA],
+[
+ AC_REQUIRE([AC_FUNC_ALLOCA])
+ if test $ac_cv_func_alloca_works = no; then
+ gl_PREREQ_ALLOCA
+ fi
+
+ # Define an additional variable used in the Makefile substitution.
+ if test $ac_cv_working_alloca_h = yes; then
+ AC_CACHE_CHECK([for alloca as a compiler built-in], [gl_cv_rpl_alloca], [
+ AC_EGREP_CPP([Need own alloca], [
+#if defined __GNUC__ || defined _AIX || defined _MSC_VER
+ Need own alloca
+#endif
+ ], [gl_cv_rpl_alloca=yes], [gl_cv_rpl_alloca=no])
+ ])
+ if test $gl_cv_rpl_alloca = yes; then
+ dnl OK, alloca can be implemented through a compiler built-in.
+ AC_DEFINE([HAVE_ALLOCA], [1],
+ [Define to 1 if you have 'alloca' after including <alloca.h>,
+ a header that may be supplied by this distribution.])
+ GL_GENERATE_ALLOCA_H=true
+ else
+ dnl alloca exists as a library function, i.e. it is slow and probably
+ dnl a memory leak. Don't define HAVE_ALLOCA in this case.
+ GL_GENERATE_ALLOCA_H=false
+ fi
+ else
+ GL_GENERATE_ALLOCA_H=true
+ fi
+
+ if test $ac_cv_working_alloca_h = yes; then
+ HAVE_ALLOCA_H=1
+ else
+ HAVE_ALLOCA_H=0
+ fi
+ AC_SUBST([HAVE_ALLOCA_H])
+])
+
+# Prerequisites of lib/alloca.c.
+# STACK_DIRECTION is already handled by AC_FUNC_ALLOCA.
+AC_DEFUN([gl_PREREQ_ALLOCA], [:])
+
+m4_version_prereq([2.70], [], [
+
+# This works around a bug in autoconf <= 2.68 and has simplifications
+# from 2.70. See:
+# https://lists.gnu.org/r/bug-gnulib/2011-06/msg00277.html
+# https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=6cd9f12520b0d6f76d3230d7565feba1ecf29497
+# https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=15edf7fd8094fd14a89d9891dd72a9624762597a
+
+# _AC_LIBOBJ_ALLOCA
+# -----------------
+# Set up the LIBOBJ replacement of 'alloca'. Well, not exactly
+# AC_LIBOBJ since we actually set the output variable 'ALLOCA'.
+# Nevertheless, for Automake, AC_LIBSOURCES it.
+m4_define([_AC_LIBOBJ_ALLOCA],
+[# The SVR3 libPW and SVR4 libucb both contain incompatible functions
+# that cause trouble. Some versions do not even contain alloca or
+# contain a buggy version. If you still want to use their alloca,
+# use ar to extract alloca.o from them instead of compiling alloca.c.
+AC_LIBSOURCES(alloca.c)
+AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.$ac_objext])dnl
+AC_DEFINE(C_ALLOCA, 1, [Define to 1 if using 'alloca.c'.])
+
+AC_CACHE_CHECK([stack direction for C alloca],
+ [ac_cv_c_stack_direction],
+[AC_RUN_IFELSE([AC_LANG_SOURCE(
+[AC_INCLUDES_DEFAULT
+int
+find_stack_direction (int *addr, int depth)
+{
+ int dir, dummy = 0;
+ if (! addr)
+ addr = &dummy;
+ *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
+ dir = depth ? find_stack_direction (addr, depth - 1) : 0;
+ return dir + dummy;
+}
+
+int
+main (int argc, char **argv)
+{
+ return find_stack_direction (0, argc + !argv + 20) < 0;
+}])],
+ [ac_cv_c_stack_direction=1],
+ [ac_cv_c_stack_direction=-1],
+ [ac_cv_c_stack_direction=0])])
+AH_VERBATIM([STACK_DIRECTION],
+[/* If using the C implementation of alloca, define if you know the
+ direction of stack growth for your system; otherwise it will be
+ automatically deduced at runtime.
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown */
+#undef STACK_DIRECTION])dnl
+AC_DEFINE_UNQUOTED(STACK_DIRECTION, $ac_cv_c_stack_direction)
+])# _AC_LIBOBJ_ALLOCA
+])
diff --git a/gnulib_m4/assert_h.m4 b/gnulib_m4/assert_h.m4
new file mode 100644
index 0000000..3801452
--- /dev/null
+++ b/gnulib_m4/assert_h.m4
@@ -0,0 +1,67 @@
+# assert-h.m4
+dnl Copyright (C) 2011-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+AC_DEFUN([gl_ASSERT_H],
+[
+ AC_CACHE_CHECK([for static_assert], [gl_cv_static_assert],
+ [gl_save_CFLAGS=$CFLAGS
+ for gl_working in "yes, a keyword" "yes, an <assert.h> macro"; do
+ AS_CASE([$gl_working],
+ [*assert.h*], [CFLAGS="$gl_save_CFLAGS -DINCLUDE_ASSERT_H"])
+
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#if defined __clang__ && __STDC_VERSION__ < 202311
+ #pragma clang diagnostic error "-Wc2x-extensions"
+ #pragma clang diagnostic error "-Wc++1z-extensions"
+ #endif
+ #ifdef INCLUDE_ASSERT_H
+ #include <assert.h>
+ #endif
+ static_assert (2 + 2 == 4, "arithmetic does not work");
+ static_assert (2 + 2 == 4);
+ ]],
+ [[
+ static_assert (sizeof (char) == 1, "sizeof does not work");
+ static_assert (sizeof (char) == 1);
+ ]])],
+ [gl_cv_static_assert=$gl_working],
+ [gl_cv_static_assert=no])
+ CFLAGS=$gl_save_CFLAGS
+ test "$gl_cv_static_assert" != no && break
+ done])
+
+ GL_GENERATE_ASSERT_H=false
+ AS_CASE([$gl_cv_static_assert],
+ [yes*keyword*],
+ [AC_DEFINE([HAVE_C_STATIC_ASSERT], [1],
+ [Define to 1 if the static_assert keyword works.])],
+ [no],
+ [GL_GENERATE_ASSERT_H=true
+ gl_NEXT_HEADERS([assert.h])])
+
+ dnl The "zz" puts this toward config.h's end, to avoid potential
+ dnl collisions with other definitions. #undef assert so that
+ dnl programs are not tempted to use it without specifically
+ dnl including assert.h. Break the #undef apart with a comment
+ dnl so that 'configure' does not comment it out.
+ AH_VERBATIM([zzstatic_assert],
+[#if (!defined HAVE_C_STATIC_ASSERT && !defined assert \
+ && (!defined __cplusplus \
+ || (__cpp_static_assert < 201411 \
+ && __GNUG__ < 6 && __clang_major__ < 6)))
+ #include <assert.h>
+ #undef/**/assert
+ /* Solaris 11.4 <assert.h> defines static_assert as a macro with 2 arguments.
+ We need it also to be invocable with a single argument. */
+ #if defined __sun && (__STDC_VERSION__ - 0 >= 201112L) && !defined __cplusplus
+ #undef/**/static_assert
+ #define static_assert _Static_assert
+ #endif
+#endif])
+])
diff --git a/gnulib_m4/errno_h.m4 b/gnulib_m4/errno_h.m4
new file mode 100644
index 0000000..4c70d22
--- /dev/null
+++ b/gnulib_m4/errno_h.m4
@@ -0,0 +1,131 @@
+# errno_h.m4 serial 14
+dnl Copyright (C) 2004, 2006, 2008-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_PREREQ([2.61])
+
+AC_DEFUN_ONCE([gl_HEADER_ERRNO_H],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_CACHE_CHECK([for complete errno.h], [gl_cv_header_errno_h_complete], [
+ AC_EGREP_CPP([booboo],[
+#include <errno.h>
+#if !defined ETXTBSY
+booboo
+#endif
+#if !defined ENOMSG
+booboo
+#endif
+#if !defined EIDRM
+booboo
+#endif
+#if !defined ENOLINK
+booboo
+#endif
+#if !defined EPROTO
+booboo
+#endif
+#if !defined EMULTIHOP
+booboo
+#endif
+#if !defined EBADMSG
+booboo
+#endif
+#if !defined EOVERFLOW
+booboo
+#endif
+#if !defined ENOTSUP
+booboo
+#endif
+#if !defined ENETRESET
+booboo
+#endif
+#if !defined ECONNABORTED
+booboo
+#endif
+#if !defined ESTALE
+booboo
+#endif
+#if !defined EDQUOT
+booboo
+#endif
+#if !defined ECANCELED
+booboo
+#endif
+#if !defined EOWNERDEAD
+booboo
+#endif
+#if !defined ENOTRECOVERABLE
+booboo
+#endif
+#if !defined EILSEQ
+booboo
+#endif
+ ],
+ [gl_cv_header_errno_h_complete=no],
+ [gl_cv_header_errno_h_complete=yes])
+ ])
+ if test $gl_cv_header_errno_h_complete = yes; then
+ GL_GENERATE_ERRNO_H=false
+ else
+ gl_NEXT_HEADERS([errno.h])
+ GL_GENERATE_ERRNO_H=true
+ fi
+ gl_REPLACE_ERRNO_VALUE([EMULTIHOP])
+ gl_REPLACE_ERRNO_VALUE([ENOLINK])
+ gl_REPLACE_ERRNO_VALUE([EOVERFLOW])
+])
+
+# Assuming $1 = EOVERFLOW.
+# The EOVERFLOW errno value ought to be defined in <errno.h>, according to
+# POSIX. But some systems (like OpenBSD 4.0 or AIX 3) don't define it, and
+# some systems (like OSF/1) define it when _XOPEN_SOURCE_EXTENDED is defined.
+# Check for the value of EOVERFLOW.
+# Set the variables EOVERFLOW_HIDDEN and EOVERFLOW_VALUE.
+AC_DEFUN([gl_REPLACE_ERRNO_VALUE],
+[
+ if $GL_GENERATE_ERRNO_H; then
+ AC_CACHE_CHECK([for ]$1[ value], [gl_cv_header_errno_h_]$1, [
+ AC_EGREP_CPP([yes],[
+#include <errno.h>
+#ifdef ]$1[
+yes
+#endif
+ ],
+ [gl_cv_header_errno_h_]$1[=yes],
+ [gl_cv_header_errno_h_]$1[=no])
+ if test $gl_cv_header_errno_h_]$1[ = no; then
+ AC_EGREP_CPP([yes],[
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+#ifdef ]$1[
+yes
+#endif
+ ], [gl_cv_header_errno_h_]$1[=hidden])
+ if test $gl_cv_header_errno_h_]$1[ = hidden; then
+ dnl The macro exists but is hidden.
+ dnl Define it to the same value.
+ AC_COMPUTE_INT([gl_cv_header_errno_h_]$1, $1, [
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+/* The following two lines are a workaround against an autoconf-2.52 bug. */
+#include <stdio.h>
+#include <stdlib.h>
+])
+ fi
+ fi
+ ])
+ case $gl_cv_header_errno_h_]$1[ in
+ yes | no)
+ ]$1[_HIDDEN=0; ]$1[_VALUE=
+ ;;
+ *)
+ ]$1[_HIDDEN=1; ]$1[_VALUE="$gl_cv_header_errno_h_]$1["
+ ;;
+ esac
+ AC_SUBST($1[_HIDDEN])
+ AC_SUBST($1[_VALUE])
+ fi
+])
diff --git a/gnulib_m4/exponentd.m4 b/gnulib_m4/exponentd.m4
new file mode 100644
index 0000000..2ef4643
--- /dev/null
+++ b/gnulib_m4/exponentd.m4
@@ -0,0 +1,116 @@
+# exponentd.m4 serial 3
+dnl Copyright (C) 2007-2008, 2010-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+AC_DEFUN([gl_DOUBLE_EXPONENT_LOCATION],
+[
+ AC_CACHE_CHECK([where to find the exponent in a 'double'],
+ [gl_cv_cc_double_expbit0],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <float.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#define NWORDS \
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { double value; unsigned int word[NWORDS]; } memory_double;
+static unsigned int ored_words[NWORDS];
+static unsigned int anded_words[NWORDS];
+static void add_to_ored_words (double x)
+{
+ memory_double m;
+ size_t i;
+ /* Clear it first, in case sizeof (double) < sizeof (memory_double). */
+ memset (&m, 0, sizeof (memory_double));
+ m.value = x;
+ for (i = 0; i < NWORDS; i++)
+ {
+ ored_words[i] |= m.word[i];
+ anded_words[i] &= m.word[i];
+ }
+}
+int main ()
+{
+ size_t j;
+ FILE *fp = fopen ("conftest.out", "w");
+ if (fp == NULL)
+ return 1;
+ for (j = 0; j < NWORDS; j++)
+ anded_words[j] = ~ (unsigned int) 0;
+ add_to_ored_words (0.25);
+ add_to_ored_words (0.5);
+ add_to_ored_words (1.0);
+ add_to_ored_words (2.0);
+ add_to_ored_words (4.0);
+ /* Remove bits that are common (e.g. if representation of the first mantissa
+ bit is explicit). */
+ for (j = 0; j < NWORDS; j++)
+ ored_words[j] &= ~anded_words[j];
+ /* Now find the nonzero word. */
+ for (j = 0; j < NWORDS; j++)
+ if (ored_words[j] != 0)
+ break;
+ if (j < NWORDS)
+ {
+ size_t i;
+ for (i = j + 1; i < NWORDS; i++)
+ if (ored_words[i] != 0)
+ {
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+ }
+ for (i = 0; ; i++)
+ if ((ored_words[j] >> i) & 1)
+ {
+ fprintf (fp, "word %d bit %d", (int) j, (int) i);
+ return (fclose (fp) != 0);
+ }
+ }
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+}
+ ]])],
+ [gl_cv_cc_double_expbit0=`cat conftest.out`],
+ [gl_cv_cc_double_expbit0="unknown"],
+ [
+ dnl On ARM, there are two 'double' floating-point formats, used by
+ dnl different sets of instructions: The older FPA instructions assume
+ dnl that they are stored in big-endian word order, while the words
+ dnl (like integer types) are stored in little-endian byte order.
+ dnl The newer VFP instructions assume little-endian order
+ dnl consistently.
+ AC_EGREP_CPP([mixed_endianness], [
+#if defined arm || defined __arm || defined __arm__
+ mixed_endianness
+#endif
+ ],
+ [gl_cv_cc_double_expbit0="unknown"],
+ [
+ pushdef([AC_MSG_CHECKING],[:])dnl
+ pushdef([AC_MSG_RESULT],[:])dnl
+ pushdef([AC_MSG_RESULT_UNQUOTED],[:])dnl
+ AC_C_BIGENDIAN(
+ [gl_cv_cc_double_expbit0="word 0 bit 20"],
+ [gl_cv_cc_double_expbit0="word 1 bit 20"],
+ [gl_cv_cc_double_expbit0="unknown"])
+ popdef([AC_MSG_RESULT_UNQUOTED])dnl
+ popdef([AC_MSG_RESULT])dnl
+ popdef([AC_MSG_CHECKING])dnl
+ ])
+ ])
+ rm -f conftest.out
+ ])
+ case "$gl_cv_cc_double_expbit0" in
+ word*bit*)
+ word=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
+ bit=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word.*bit //'`
+ AC_DEFINE_UNQUOTED([DBL_EXPBIT0_WORD], [$word],
+ [Define as the word index where to find the exponent of 'double'.])
+ AC_DEFINE_UNQUOTED([DBL_EXPBIT0_BIT], [$bit],
+ [Define as the bit index in the word where to find bit 0 of the exponent of 'double'.])
+ ;;
+ esac
+])
diff --git a/gnulib_m4/exponentf.m4 b/gnulib_m4/exponentf.m4
new file mode 100644
index 0000000..f6395f2
--- /dev/null
+++ b/gnulib_m4/exponentf.m4
@@ -0,0 +1,92 @@
+# exponentf.m4 serial 2
+dnl Copyright (C) 2007-2008, 2010-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+AC_DEFUN([gl_FLOAT_EXPONENT_LOCATION],
+[
+ AC_CACHE_CHECK([where to find the exponent in a 'float'],
+ [gl_cv_cc_float_expbit0],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <float.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#define NWORDS \
+ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { float value; unsigned int word[NWORDS]; } memory_float;
+static unsigned int ored_words[NWORDS];
+static unsigned int anded_words[NWORDS];
+static void add_to_ored_words (float x)
+{
+ memory_float m;
+ size_t i;
+ /* Clear it first, in case
+ sizeof (float) < sizeof (memory_float). */
+ memset (&m, 0, sizeof (memory_float));
+ m.value = x;
+ for (i = 0; i < NWORDS; i++)
+ {
+ ored_words[i] |= m.word[i];
+ anded_words[i] &= m.word[i];
+ }
+}
+int main ()
+{
+ size_t j;
+ FILE *fp = fopen ("conftest.out", "w");
+ if (fp == NULL)
+ return 1;
+ for (j = 0; j < NWORDS; j++)
+ anded_words[j] = ~ (unsigned int) 0;
+ add_to_ored_words (0.25f);
+ add_to_ored_words (0.5f);
+ add_to_ored_words (1.0f);
+ add_to_ored_words (2.0f);
+ add_to_ored_words (4.0f);
+ /* Remove bits that are common (e.g. if representation of the first mantissa
+ bit is explicit). */
+ for (j = 0; j < NWORDS; j++)
+ ored_words[j] &= ~anded_words[j];
+ /* Now find the nonzero word. */
+ for (j = 0; j < NWORDS; j++)
+ if (ored_words[j] != 0)
+ break;
+ if (j < NWORDS)
+ {
+ size_t i;
+ for (i = j + 1; i < NWORDS; i++)
+ if (ored_words[i] != 0)
+ {
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+ }
+ for (i = 0; ; i++)
+ if ((ored_words[j] >> i) & 1)
+ {
+ fprintf (fp, "word %d bit %d", (int) j, (int) i);
+ return (fclose (fp) != 0);
+ }
+ }
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+}
+ ]])],
+ [gl_cv_cc_float_expbit0=`cat conftest.out`],
+ [gl_cv_cc_float_expbit0="unknown"],
+ [gl_cv_cc_float_expbit0="word 0 bit 23"])
+ rm -f conftest.out
+ ])
+ case "$gl_cv_cc_float_expbit0" in
+ word*bit*)
+ word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
+ bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'`
+ AC_DEFINE_UNQUOTED([FLT_EXPBIT0_WORD], [$word],
+ [Define as the word index where to find the exponent of 'float'.])
+ AC_DEFINE_UNQUOTED([FLT_EXPBIT0_BIT], [$bit],
+ [Define as the bit index in the word where to find bit 0 of the exponent of 'float'.])
+ ;;
+ esac
+])
diff --git a/gnulib_m4/exponentl.m4 b/gnulib_m4/exponentl.m4
new file mode 100644
index 0000000..e1fa5c4
--- /dev/null
+++ b/gnulib_m4/exponentl.m4
@@ -0,0 +1,112 @@
+# exponentl.m4 serial 5
+dnl Copyright (C) 2007-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+AC_DEFUN([gl_LONG_DOUBLE_EXPONENT_LOCATION],
+[
+ AC_REQUIRE([gl_BIGENDIAN])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([where to find the exponent in a 'long double'],
+ [gl_cv_cc_long_double_expbit0],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <float.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#define NWORDS \
+ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { long double value; unsigned int word[NWORDS]; }
+ memory_long_double;
+static unsigned int ored_words[NWORDS];
+static unsigned int anded_words[NWORDS];
+static void add_to_ored_words (long double *x)
+{
+ memory_long_double m;
+ size_t i;
+ /* Clear it first, in case
+ sizeof (long double) < sizeof (memory_long_double). */
+ memset (&m, 0, sizeof (memory_long_double));
+ m.value = *x;
+ for (i = 0; i < NWORDS; i++)
+ {
+ ored_words[i] |= m.word[i];
+ anded_words[i] &= m.word[i];
+ }
+}
+int main ()
+{
+ static long double samples[5] = { 0.25L, 0.5L, 1.0L, 2.0L, 4.0L };
+ size_t j;
+ FILE *fp = fopen ("conftest.out", "w");
+ if (fp == NULL)
+ return 1;
+ for (j = 0; j < NWORDS; j++)
+ anded_words[j] = ~ (unsigned int) 0;
+ for (j = 0; j < 5; j++)
+ add_to_ored_words (&samples[j]);
+ /* Remove bits that are common (e.g. if representation of the first mantissa
+ bit is explicit). */
+ for (j = 0; j < NWORDS; j++)
+ ored_words[j] &= ~anded_words[j];
+ /* Now find the nonzero word. */
+ for (j = 0; j < NWORDS; j++)
+ if (ored_words[j] != 0)
+ break;
+ if (j < NWORDS)
+ {
+ size_t i;
+ for (i = j + 1; i < NWORDS; i++)
+ if (ored_words[i] != 0)
+ {
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+ }
+ for (i = 0; ; i++)
+ if ((ored_words[j] >> i) & 1)
+ {
+ fprintf (fp, "word %d bit %d", (int) j, (int) i);
+ return (fclose (fp) != 0);
+ }
+ }
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+}
+ ]])],
+ [gl_cv_cc_long_double_expbit0=`cat conftest.out`],
+ [gl_cv_cc_long_double_expbit0="unknown"],
+ [
+ dnl When cross-compiling, in general we don't know. It depends on the
+ dnl ABI and compiler version. There are too many cases.
+ gl_cv_cc_long_double_expbit0="unknown"
+ case "$host_os" in
+ mingw*) # On native Windows (little-endian), we know the result
+ # in two cases: mingw, MSVC.
+ AC_EGREP_CPP([Known], [
+#ifdef __MINGW32__
+ Known
+#endif
+ ], [gl_cv_cc_long_double_expbit0="word 2 bit 0"])
+ AC_EGREP_CPP([Known], [
+#ifdef _MSC_VER
+ Known
+#endif
+ ], [gl_cv_cc_long_double_expbit0="word 1 bit 20"])
+ ;;
+ esac
+ ])
+ rm -f conftest.out
+ ])
+ case "$gl_cv_cc_long_double_expbit0" in
+ word*bit*)
+ word=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
+ bit=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word.*bit //'`
+ AC_DEFINE_UNQUOTED([LDBL_EXPBIT0_WORD], [$word],
+ [Define as the word index where to find the exponent of 'long double'.])
+ AC_DEFINE_UNQUOTED([LDBL_EXPBIT0_BIT], [$bit],
+ [Define as the bit index in the word where to find bit 0 of the exponent of 'long double'.])
+ ;;
+ esac
+])
diff --git a/gnulib_m4/extensions.m4 b/gnulib_m4/extensions.m4
new file mode 100644
index 0000000..5336b8d
--- /dev/null
+++ b/gnulib_m4/extensions.m4
@@ -0,0 +1,232 @@
+# serial 23 -*- Autoconf -*-
+# Enable extensions on systems that normally disable them.
+
+# Copyright (C) 2003, 2006-2023 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+dnl Define to empty for the benefit of Autoconf 2.69 and earlier, so that
+dnl AC_USE_SYSTEM_EXTENSIONS (below) can be used unchanged from Autoconf 2.70+.
+m4_ifndef([AC_CHECK_INCLUDES_DEFAULT],
+ [AC_DEFUN([AC_CHECK_INCLUDES_DEFAULT], [])])
+
+# This definition of AC_USE_SYSTEM_EXTENSIONS is stolen from git
+# Autoconf. Perhaps we can remove this once we can assume Autoconf
+# is recent-enough everywhere, but since Autoconf mutates rapidly
+# enough in this area it's likely we'll need to redefine
+# AC_USE_SYSTEM_EXTENSIONS for quite some time.
+
+# If autoconf reports a warning
+# warning: AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS
+# or warning: AC_RUN_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS
+# the fix is
+# 1) to ensure that AC_USE_SYSTEM_EXTENSIONS is never directly invoked
+# but always AC_REQUIREd,
+# 2) to ensure that for each occurrence of
+# AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+# or
+# AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+# the corresponding gnulib module description has 'extensions' among
+# its dependencies. This will ensure that the gl_USE_SYSTEM_EXTENSIONS
+# invocation occurs in gl_EARLY, not in gl_INIT.
+
+m4_version_prereq([2.72], [], [
+
+# AC_USE_SYSTEM_EXTENSIONS
+# ------------------------
+# Enable extensions on systems that normally disable them,
+# typically due to standards-conformance issues.
+# We unconditionally define as many of the known feature-enabling
+# as possible, reserving conditional behavior for macros that are
+# known to cause problems on some platforms (such as __EXTENSIONS__).
+AC_DEFUN_ONCE([AC_USE_SYSTEM_EXTENSIONS],
+[AC_BEFORE([$0], [AC_PREPROC_IFELSE])dnl
+AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl
+AC_BEFORE([$0], [AC_LINK_IFELSE])dnl
+AC_BEFORE([$0], [AC_RUN_IFELSE])dnl
+AC_BEFORE([$0], [AC_CHECK_INCLUDES_DEFAULT])dnl
+dnl #undef in AH_VERBATIM gets replaced with #define by AC_DEFINE.
+dnl Use a different key than __EXTENSIONS__, as that name broke existing
+dnl configure.ac when using autoheader 2.62.
+dnl The macros below are in alphabetical order ignoring leading _ or __
+dnl prefixes.
+AH_VERBATIM([USE_SYSTEM_EXTENSIONS],
+[/* Enable extensions on AIX 3, Interix. */
+#ifndef _ALL_SOURCE
+# undef _ALL_SOURCE
+#endif
+/* Enable general extensions on macOS. */
+#ifndef _DARWIN_C_SOURCE
+# undef _DARWIN_C_SOURCE
+#endif
+/* Enable general extensions on Solaris. */
+#ifndef __EXTENSIONS__
+# undef __EXTENSIONS__
+#endif
+/* Enable GNU extensions on systems that have them. */
+#ifndef _GNU_SOURCE
+# undef _GNU_SOURCE
+#endif
+/* Enable X/Open compliant socket functions that do not require linking
+ with -lxnet on HP-UX 11.11. */
+#ifndef _HPUX_ALT_XOPEN_SOCKET_API
+# undef _HPUX_ALT_XOPEN_SOCKET_API
+#endif
+/* Identify the host operating system as Minix.
+ This macro does not affect the system headers' behavior.
+ A future release of Autoconf may stop defining this macro. */
+#ifndef _MINIX
+# undef _MINIX
+#endif
+/* Enable general extensions on NetBSD.
+ Enable NetBSD compatibility extensions on Minix. */
+#ifndef _NETBSD_SOURCE
+# undef _NETBSD_SOURCE
+#endif
+/* Enable OpenBSD compatibility extensions on NetBSD.
+ Oddly enough, this does nothing on OpenBSD. */
+#ifndef _OPENBSD_SOURCE
+# undef _OPENBSD_SOURCE
+#endif
+/* Define to 1 if needed for POSIX-compatible behavior. */
+#ifndef _POSIX_SOURCE
+# undef _POSIX_SOURCE
+#endif
+/* Define to 2 if needed for POSIX-compatible behavior. */
+#ifndef _POSIX_1_SOURCE
+# undef _POSIX_1_SOURCE
+#endif
+/* Enable POSIX-compatible threading on Solaris. */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# undef _POSIX_PTHREAD_SEMANTICS
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-5:2014. */
+#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
+# undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-1:2014. */
+#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+# undef __STDC_WANT_IEC_60559_BFP_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-2:2015. */
+#ifndef __STDC_WANT_IEC_60559_DFP_EXT__
+# undef __STDC_WANT_IEC_60559_DFP_EXT__
+#endif
+/* Enable extensions specified by C23 Annex F. */
+#ifndef __STDC_WANT_IEC_60559_EXT__
+# undef __STDC_WANT_IEC_60559_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-4:2015. */
+#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__
+# undef __STDC_WANT_IEC_60559_FUNCS_EXT__
+#endif
+/* Enable extensions specified by C23 Annex H and ISO/IEC TS 18661-3:2015. */
+#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__
+# undef __STDC_WANT_IEC_60559_TYPES_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TR 24731-2:2010. */
+#ifndef __STDC_WANT_LIB_EXT2__
+# undef __STDC_WANT_LIB_EXT2__
+#endif
+/* Enable extensions specified by ISO/IEC 24747:2009. */
+#ifndef __STDC_WANT_MATH_SPEC_FUNCS__
+# undef __STDC_WANT_MATH_SPEC_FUNCS__
+#endif
+/* Enable extensions on HP NonStop. */
+#ifndef _TANDEM_SOURCE
+# undef _TANDEM_SOURCE
+#endif
+/* Enable X/Open extensions. Define to 500 only if necessary
+ to make mbstate_t available. */
+#ifndef _XOPEN_SOURCE
+# undef _XOPEN_SOURCE
+#endif
+])dnl
+
+ AC_REQUIRE([AC_CHECK_INCLUDES_DEFAULT])dnl
+ _AC_CHECK_HEADER_ONCE([wchar.h])
+ _AC_CHECK_HEADER_ONCE([minix/config.h])
+
+dnl Defining __EXTENSIONS__ may break the system headers on some systems.
+dnl (FIXME: Which ones?)
+ AC_CACHE_CHECK([whether it is safe to define __EXTENSIONS__],
+ [ac_cv_safe_to_define___extensions__],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[
+# define __EXTENSIONS__ 1
+ ]AC_INCLUDES_DEFAULT])],
+ [ac_cv_safe_to_define___extensions__=yes],
+ [ac_cv_safe_to_define___extensions__=no])])
+
+dnl HP-UX 11.11 defines mbstate_t only if _XOPEN_SOURCE is defined to
+dnl 500, regardless of whether compiling with -Ae or -D_HPUX_SOURCE=1.
+dnl But defining _XOPEN_SOURCE may turn *off* extensions on platforms
+dnl not covered by turn-on-extensions macros (notably Dragonfly, Free,
+dnl and OpenBSD, which don't have any equivalent of _NETBSD_SOURCE) so
+dnl it should only be defined when necessary.
+ AC_CACHE_CHECK([whether _XOPEN_SOURCE should be defined],
+ [ac_cv_should_define__xopen_source],
+ [ac_cv_should_define__xopen_source=no
+ AS_IF([test $ac_cv_header_wchar_h = yes],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[
+ #include <wchar.h>
+ mbstate_t x;]])],
+ [],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[
+ #define _XOPEN_SOURCE 500
+ #include <wchar.h>
+ mbstate_t x;]])],
+ [ac_cv_should_define__xopen_source=yes])])])])
+
+ AC_DEFINE([_ALL_SOURCE])
+ AC_DEFINE([_DARWIN_C_SOURCE])
+ AC_DEFINE([_GNU_SOURCE])
+ AC_DEFINE([_HPUX_ALT_XOPEN_SOCKET_API])
+ AC_DEFINE([_NETBSD_SOURCE])
+ AC_DEFINE([_OPENBSD_SOURCE])
+ AC_DEFINE([_POSIX_PTHREAD_SEMANTICS])
+ AC_DEFINE([__STDC_WANT_IEC_60559_ATTRIBS_EXT__])
+ AC_DEFINE([__STDC_WANT_IEC_60559_BFP_EXT__])
+ AC_DEFINE([__STDC_WANT_IEC_60559_DFP_EXT__])
+ AC_DEFINE([__STDC_WANT_IEC_60559_EXT__])
+ AC_DEFINE([__STDC_WANT_IEC_60559_FUNCS_EXT__])
+ AC_DEFINE([__STDC_WANT_IEC_60559_TYPES_EXT__])
+ AC_DEFINE([__STDC_WANT_LIB_EXT2__])
+ AC_DEFINE([__STDC_WANT_MATH_SPEC_FUNCS__])
+ AC_DEFINE([_TANDEM_SOURCE])
+ AS_IF([test $ac_cv_header_minix_config_h = yes],
+ [MINIX=yes
+ AC_DEFINE([_MINIX])
+ AC_DEFINE([_POSIX_SOURCE])
+ AC_DEFINE([_POSIX_1_SOURCE], [2])],
+ [MINIX=])
+ AS_IF([test $ac_cv_safe_to_define___extensions__ = yes],
+ [AC_DEFINE([__EXTENSIONS__])])
+ AS_IF([test $ac_cv_should_define__xopen_source = yes],
+ [AC_DEFINE([_XOPEN_SOURCE], [500])])
+])# AC_USE_SYSTEM_EXTENSIONS
+])
+
+# gl_USE_SYSTEM_EXTENSIONS
+# ------------------------
+# Enable extensions on systems that normally disable them,
+# typically due to standards-conformance issues.
+AC_DEFUN_ONCE([gl_USE_SYSTEM_EXTENSIONS],
+[
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ dnl On OpenBSD 6.8 with GCC, the include files contain a couple of
+ dnl definitions that are only activated with an explicit -D_ISOC11_SOURCE.
+ dnl That's because this version of GCC (4.2.1) supports the option
+ dnl '-std=gnu99' but not the option '-std=gnu11'.
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ case "$host_os" in
+ openbsd*)
+ AC_DEFINE([_ISOC11_SOURCE], [1],
+ [Define to enable the declarations of ISO C 11 types and functions.])
+ ;;
+ esac
+])
diff --git a/gnulib_m4/extern-inline.m4 b/gnulib_m4/extern-inline.m4
new file mode 100644
index 0000000..c001b1c
--- /dev/null
+++ b/gnulib_m4/extern-inline.m4
@@ -0,0 +1,130 @@
+dnl 'extern inline' a la ISO C99.
+
+dnl Copyright 2012-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_EXTERN_INLINE],
+[
+ AC_CACHE_CHECK([whether ctype.h defines __header_inline],
+ [gl_cv_have___header_inline],
+ [AC_PREPROC_IFELSE(
+ [AC_LANG_SOURCE([[#include <ctype.h>
+ #ifndef __header_inline
+ #error "<ctype.h> does not define __header_inline"
+ #endif
+ ]])],
+ [gl_cv_have___header_inline=yes],
+ [gl_cv_have___header_inline=no])])
+ if test "$gl_cv_have___header_inline" = yes; then
+ AC_DEFINE([HAVE___HEADER_INLINE], [1],
+ [Define to 1 if ctype.h defines __header_inline.])
+ fi
+
+ AH_VERBATIM([HAVE___HEADER_INLINE_1],
+[/* Please see the Gnulib manual for how to use these macros.
+
+ Suppress extern inline with HP-UX cc, as it appears to be broken; see
+ <https://lists.gnu.org/r/bug-texinfo/2013-02/msg00030.html>.
+
+ Suppress extern inline with Sun C in standards-conformance mode, as it
+ mishandles inline functions that call each other. E.g., for 'inline void f
+ (void) { } inline void g (void) { f (); }', c99 incorrectly complains
+ 'reference to static identifier "f" in extern inline function'.
+ This bug was observed with Oracle Developer Studio 12.6
+ (Sun C 5.15 SunOS_sparc 2017/05/30).
+
+ Suppress extern inline (with or without __attribute__ ((__gnu_inline__)))
+ on configurations that mistakenly use 'static inline' to implement
+ functions or macros in standard C headers like <ctype.h>. For example,
+ if isdigit is mistakenly implemented via a static inline function,
+ a program containing an extern inline function that calls isdigit
+ may not work since the C standard prohibits extern inline functions
+ from calling static functions (ISO C 99 section 6.7.4.(3).
+ This bug is known to occur on:
+
+ OS X 10.8 and earlier; see:
+ https://lists.gnu.org/r/bug-gnulib/2012-12/msg00023.html
+
+ DragonFly; see
+ http://muscles.dragonflybsd.org/bulk/clang-master-potential/20141111_102002/logs/ah-tty-0.3.12.log
+
+ FreeBSD; see:
+ https://lists.gnu.org/r/bug-gnulib/2014-07/msg00104.html
+
+ OS X 10.9 has a macro __header_inline indicating the bug is fixed for C and
+ for clang but remains for g++; see <https://trac.macports.org/ticket/41033>.
+ Assume DragonFly and FreeBSD will be similar.
+
+ GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
+ inline semantics, unless -fgnu89-inline is used. It defines a macro
+ __GNUC_STDC_INLINE__ to indicate this situation or a macro
+ __GNUC_GNU_INLINE__ to indicate the opposite situation.
+ GCC 4.2 with -std=c99 or -std=gnu99 implements the GNU C inline
+ semantics but warns, unless -fgnu89-inline is used:
+ warning: C99 inline functions are not supported; using GNU89
+ warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute
+ It defines a macro __GNUC_GNU_INLINE__ to indicate this situation.
+ */
+#if (((defined __APPLE__ && defined __MACH__) \
+ || defined __DragonFly__ || defined __FreeBSD__) \
+ && (defined HAVE___HEADER_INLINE \
+ ? (defined __cplusplus && defined __GNUC_STDC_INLINE__ \
+ && ! defined __clang__) \
+ : ((! defined _DONT_USE_CTYPE_INLINE_ \
+ && (defined __GNUC__ || defined __cplusplus)) \
+ || (defined _FORTIFY_SOURCE && 0 < _FORTIFY_SOURCE \
+ && defined __GNUC__ && ! defined __cplusplus))))
+# define _GL_EXTERN_INLINE_STDHEADER_BUG
+#endif
+#if ((__GNUC__ \
+ ? defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ \
+ : (199901L <= __STDC_VERSION__ \
+ && !defined __HP_cc \
+ && !defined __PGI \
+ && !(defined __SUNPRO_C && __STDC__))) \
+ && !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
+# define _GL_INLINE inline
+# define _GL_EXTERN_INLINE extern inline
+# define _GL_EXTERN_INLINE_IN_USE
+#elif (2 < __GNUC__ + (7 <= __GNUC_MINOR__) && !defined __STRICT_ANSI__ \
+ && !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
+# if defined __GNUC_GNU_INLINE__ && __GNUC_GNU_INLINE__
+ /* __gnu_inline__ suppresses a GCC 4.2 diagnostic. */
+# define _GL_INLINE extern inline __attribute__ ((__gnu_inline__))
+# else
+# define _GL_INLINE extern inline
+# endif
+# define _GL_EXTERN_INLINE extern
+# define _GL_EXTERN_INLINE_IN_USE
+#else
+# define _GL_INLINE _GL_UNUSED static
+# define _GL_EXTERN_INLINE _GL_UNUSED static
+#endif
+
+/* In GCC 4.6 (inclusive) to 5.1 (exclusive),
+ suppress bogus "no previous prototype for 'FOO'"
+ and "no previous declaration for 'FOO'" diagnostics,
+ when FOO is an inline function in the header; see
+ <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54113> and
+ <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63877>. */
+#if __GNUC__ == 4 && 6 <= __GNUC_MINOR__
+# if defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__
+# define _GL_INLINE_HEADER_CONST_PRAGMA
+# else
+# define _GL_INLINE_HEADER_CONST_PRAGMA \
+ _Pragma ("GCC diagnostic ignored \"-Wsuggest-attribute=const\"")
+# endif
+# define _GL_INLINE_HEADER_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wmissing-prototypes\"") \
+ _Pragma ("GCC diagnostic ignored \"-Wmissing-declarations\"") \
+ _GL_INLINE_HEADER_CONST_PRAGMA
+# define _GL_INLINE_HEADER_END \
+ _Pragma ("GCC diagnostic pop")
+#else
+# define _GL_INLINE_HEADER_BEGIN
+# define _GL_INLINE_HEADER_END
+#endif])
+])
diff --git a/gnulib_m4/float_h.m4 b/gnulib_m4/float_h.m4
new file mode 100644
index 0000000..2f0c9c4
--- /dev/null
+++ b/gnulib_m4/float_h.m4
@@ -0,0 +1,106 @@
+# float_h.m4 serial 13
+dnl Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FLOAT_H],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ GL_GENERATE_FLOAT_H=false
+ REPLACE_FLOAT_LDBL=0
+ case "$host_os" in
+ aix* | beos* | openbsd* | mirbsd* | irix*)
+ GL_GENERATE_FLOAT_H=true
+ ;;
+ freebsd* | dragonfly*)
+ case "$host_cpu" in
+changequote(,)dnl
+ i[34567]86 )
+changequote([,])dnl
+ GL_GENERATE_FLOAT_H=true
+ ;;
+ x86_64 )
+ # On x86_64 systems, the C compiler may still be generating
+ # 32-bit code.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __LP64__ || defined __x86_64__ || defined __amd64__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [],
+ [GL_GENERATE_FLOAT_H=true])
+ ;;
+ esac
+ ;;
+ linux*)
+ case "$host_cpu" in
+ powerpc*)
+ GL_GENERATE_FLOAT_H=true
+ ;;
+ esac
+ ;;
+ esac
+ case "$host_os" in
+ aix* | freebsd* | dragonfly* | linux*)
+ if $GL_GENERATE_FLOAT_H; then
+ REPLACE_FLOAT_LDBL=1
+ fi
+ ;;
+ esac
+
+ dnl Test against glibc-2.7 Linux/SPARC64 bug.
+ REPLACE_ITOLD=0
+ AC_CACHE_CHECK([whether conversion from 'int' to 'long double' works],
+ [gl_cv_func_itold_works],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+int i = -1;
+volatile long double ld;
+int main ()
+{
+ ld += i * 1.0L;
+ if (ld > 0)
+ return 1;
+ return 0;
+}]])],
+ [gl_cv_func_itold_works=yes],
+ [gl_cv_func_itold_works=no],
+ [case "$host" in
+ sparc*-*-linux*)
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __LP64__ || defined __arch64__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_func_itold_works="guessing no"],
+ [gl_cv_func_itold_works="guessing yes"])
+ ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_itold_works="guessing yes" ;;
+ *) gl_cv_func_itold_works="guessing yes" ;;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_itold_works" in
+ *no)
+ REPLACE_ITOLD=1
+ dnl We add the workaround to <float.h> but also to <math.h>,
+ dnl to increase the chances that the fix function gets pulled in.
+ GL_GENERATE_FLOAT_H=true
+ ;;
+ esac
+
+ if $GL_GENERATE_FLOAT_H; then
+ gl_NEXT_HEADERS([float.h])
+ fi
+ AC_SUBST([REPLACE_ITOLD])
+])
diff --git a/gnulib_m4/fpieee.m4 b/gnulib_m4/fpieee.m4
new file mode 100644
index 0000000..706b331
--- /dev/null
+++ b/gnulib_m4/fpieee.m4
@@ -0,0 +1,54 @@
+# fpieee.m4 serial 2 -*- coding: utf-8 -*-
+dnl Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl IEEE 754 standardized three items:
+dnl - The formats of single-float and double-float - nowadays commonly
+dnl available as 'float' and 'double' in C and C++.
+dnl No autoconf test needed.
+dnl - The overflow and division by zero behaviour: The result are values
+dnl '±Inf' and 'NaN', rather than exceptions as it was before.
+dnl This file provides an autoconf macro for ensuring this behaviour of
+dnl floating-point operations.
+dnl - A set of conditions (overflow, underflow, inexact, etc.) which can
+dnl be configured to trigger an exception.
+dnl This cannot be done in a portable way: it depends on the compiler,
+dnl libc, kernel, and CPU. No autoconf macro is provided for this.
+
+dnl Ensure non-trapping behaviour of floating-point overflow and
+dnl floating-point division by zero.
+dnl (For integer overflow, see gcc's -ftrapv option; for integer division by
+dnl zero, see the autoconf macro in intdiv0.m4.)
+
+AC_DEFUN([gl_FP_IEEE],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ # IEEE behaviour is the default on all CPUs except Alpha and SH
+ # (according to the test results of Bruno Haible's ieeefp/fenv_default.m4
+ # and the GCC 4.1.2 manual).
+ case "$host_cpu" in
+ alpha*)
+ # On Alpha systems, a compiler option provides the behaviour.
+ # See the ieee(3) manual page, also available at
+ # <https://backdrift.org/man/tru64/man3/ieee.3.html>
+ if test -n "$GCC"; then
+ # GCC has the option -mieee.
+ # For full IEEE compliance (rarely needed), use option -mieee-with-inexact.
+ CPPFLAGS="$CPPFLAGS -mieee"
+ else
+ # Compaq (ex-DEC) C has the option -ieee, equivalent to -ieee_with_no_inexact.
+ # For full IEEE compliance (rarely needed), use option -ieee_with_inexact.
+ CPPFLAGS="$CPPFLAGS -ieee"
+ fi
+ ;;
+ sh*)
+ if test -n "$GCC"; then
+ # GCC has the option -mieee.
+ CPPFLAGS="$CPPFLAGS -mieee"
+ fi
+ ;;
+ esac
+])
diff --git a/gnulib_m4/fprintf-posix.m4 b/gnulib_m4/fprintf-posix.m4
new file mode 100644
index 0000000..3a51bcf
--- /dev/null
+++ b/gnulib_m4/fprintf-posix.m4
@@ -0,0 +1,110 @@
+# fprintf-posix.m4 serial 14
+dnl Copyright (C) 2007-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FPRINTF_POSIX],
+[
+ AC_REQUIRE([gl_PRINTF_SIZES_C99])
+ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_INFINITE])
+ AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS])
+ AC_REQUIRE([gl_PRINTF_POSITIONS])
+ AC_REQUIRE([gl_PRINTF_FLAG_GROUPING])
+ AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST])
+ AC_REQUIRE([gl_PRINTF_FLAG_ZERO])
+ AC_REQUIRE([gl_PRINTF_PRECISION])
+ AC_REQUIRE([gl_PRINTF_ENOMEM])
+ gl_cv_func_fprintf_posix=no
+ case "$gl_cv_func_printf_sizes_c99" in
+ *yes)
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_infinite" in
+ *yes)
+ case "$gl_cv_func_printf_infinite_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_directive_a" in
+ *yes)
+ case "$gl_cv_func_printf_directive_f" in
+ *yes)
+ case "$gl_cv_func_printf_directive_n" in
+ *yes)
+ case "$gl_cv_func_printf_directive_ls" in
+ *yes)
+ case "$gl_cv_func_printf_positions" in
+ *yes)
+ case "$gl_cv_func_printf_flag_grouping" in
+ *yes)
+ case "$gl_cv_func_printf_flag_leftadjust" in
+ *yes)
+ case "$gl_cv_func_printf_flag_zero" in
+ *yes)
+ case "$gl_cv_func_printf_precision" in
+ *yes)
+ case "$gl_cv_func_printf_enomem" in
+ *yes)
+ # fprintf exists and is
+ # already POSIX compliant.
+ gl_cv_func_fprintf_posix=yes
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ if test $gl_cv_func_fprintf_posix = no; then
+ gl_PREREQ_VASNPRINTF_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_LS
+ gl_PREREQ_VASNPRINTF_FLAG_GROUPING
+ gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST
+ gl_PREREQ_VASNPRINTF_FLAG_ZERO
+ gl_PREREQ_VASNPRINTF_PRECISION
+ gl_PREREQ_VASNPRINTF_ENOMEM
+ gl_REPLACE_VASNPRINTF
+ gl_REPLACE_FPRINTF
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_FPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_LIBOBJ([fprintf])
+ REPLACE_FPRINTF=1
+ AC_DEFINE([REPLACE_FPRINTF_POSIX], [1],
+ [Define if fprintf is overridden by a POSIX compliant gnulib implementation.])
+ gl_PREREQ_FPRINTF
+])
+
+AC_DEFUN([gl_PREREQ_FPRINTF], [:])
diff --git a/gnulib_m4/free.m4 b/gnulib_m4/free.m4
new file mode 100644
index 0000000..0389dea
--- /dev/null
+++ b/gnulib_m4/free.m4
@@ -0,0 +1,52 @@
+# free.m4 serial 6
+# Copyright (C) 2003-2005, 2009-2023 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Written by Paul Eggert and Bruno Haible.
+
+AC_DEFUN([gl_FUNC_FREE],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+
+ dnl In the next release of POSIX, free must preserve errno.
+ dnl https://www.austingroupbugs.net/view.php?id=385
+ dnl https://sourceware.org/bugzilla/show_bug.cgi?id=17924
+ dnl So far, we know of three platforms that do this:
+ dnl * glibc >= 2.33, thanks to the fix for this bug:
+ dnl <https://sourceware.org/bugzilla/show_bug.cgi?id=17924>
+ dnl * OpenBSD >= 4.5, thanks to this commit:
+ dnl <https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdlib/malloc.c.diff?r1=1.100&r2=1.101&f=h>
+ dnl * Solaris, because its malloc() implementation is based on brk(),
+ dnl not mmap(); hence its free() implementation makes no system calls.
+ dnl For other platforms, you can only be sure if they state it in their
+ dnl documentation, or by code inspection of the free() implementation in libc.
+ AC_CACHE_CHECK([whether free is known to preserve errno],
+ [gl_cv_func_free_preserves_errno],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdlib.h>
+ ]],
+ [[#if 2 < __GLIBC__ + (33 <= __GLIBC_MINOR__)
+ #elif defined __OpenBSD__
+ #elif defined __sun
+ #else
+ #error "'free' is not known to preserve errno"
+ #endif
+ ]])],
+ [gl_cv_func_free_preserves_errno=yes],
+ [gl_cv_func_free_preserves_errno=no])
+ ])
+
+ case $gl_cv_func_free_preserves_errno in
+ *yes)
+ AC_DEFINE([HAVE_FREE_POSIX], [1],
+ [Define if the 'free' function is guaranteed to preserve errno.])
+ ;;
+ *) REPLACE_FREE=1 ;;
+ esac
+])
+
+# Prerequisites of lib/free.c.
+AC_DEFUN([gl_PREREQ_FREE], [:])
diff --git a/gnulib_m4/frexp.m4 b/gnulib_m4/frexp.m4
new file mode 100644
index 0000000..0480d98
--- /dev/null
+++ b/gnulib_m4/frexp.m4
@@ -0,0 +1,181 @@
+# frexp.m4 serial 16
+dnl Copyright (C) 2007-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FREXP],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ AC_REQUIRE([gl_CHECK_FREXP_NO_LIBM])
+ FREXP_LIBM=
+ if test $gl_cv_func_frexp_no_libm = no; then
+ AC_CACHE_CHECK([whether frexp() can be used with libm],
+ [gl_cv_func_frexp_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <math.h>
+ double x;]],
+ [[int e; return frexp (x, &e) > 0;]])],
+ [gl_cv_func_frexp_in_libm=yes],
+ [gl_cv_func_frexp_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+ if test $gl_cv_func_frexp_in_libm = yes; then
+ FREXP_LIBM=-lm
+ fi
+ fi
+ if test $gl_cv_func_frexp_no_libm = yes \
+ || test $gl_cv_func_frexp_in_libm = yes; then
+ save_LIBS="$LIBS"
+ LIBS="$LIBS $FREXP_LIBM"
+ gl_FUNC_FREXP_WORKS
+ LIBS="$save_LIBS"
+ case "$gl_cv_func_frexp_works" in
+ *yes) gl_func_frexp=yes ;;
+ *) gl_func_frexp=no; REPLACE_FREXP=1; FREXP_LIBM= ;;
+ esac
+ else
+ gl_func_frexp=no
+ fi
+ if test $gl_func_frexp = yes; then
+ AC_DEFINE([HAVE_FREXP], [1],
+ [Define if the frexp() function is available and works.])
+ fi
+ AC_SUBST([FREXP_LIBM])
+])
+
+AC_DEFUN([gl_FUNC_FREXP_NO_LIBM],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ AC_REQUIRE([gl_CHECK_FREXP_NO_LIBM])
+ if test $gl_cv_func_frexp_no_libm = yes; then
+ gl_FUNC_FREXP_WORKS
+ case "$gl_cv_func_frexp_works" in
+ *yes) gl_func_frexp_no_libm=yes ;;
+ *) gl_func_frexp_no_libm=no; REPLACE_FREXP=1 ;;
+ esac
+ else
+ gl_func_frexp_no_libm=no
+ dnl Set REPLACE_FREXP here because the system may have frexp in libm.
+ REPLACE_FREXP=1
+ fi
+ if test $gl_func_frexp_no_libm = yes; then
+ AC_DEFINE([HAVE_FREXP_IN_LIBC], [1],
+ [Define if the frexp() function is available in libc.])
+ fi
+])
+
+dnl Test whether frexp() can be used without linking with libm.
+dnl Set gl_cv_func_frexp_no_libm to 'yes' or 'no' accordingly.
+AC_DEFUN([gl_CHECK_FREXP_NO_LIBM],
+[
+ AC_CACHE_CHECK([whether frexp() can be used without linking with libm],
+ [gl_cv_func_frexp_no_libm],
+ [
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <math.h>
+ double x;]],
+ [[int e; return frexp (x, &e) > 0;]])],
+ [gl_cv_func_frexp_no_libm=yes],
+ [gl_cv_func_frexp_no_libm=no])
+ ])
+])
+
+dnl Test whether frexp() works also on denormalized numbers (this fails e.g. on
+dnl NetBSD 3.0), on infinite numbers (this fails e.g. on IRIX 6.5 and mingw),
+dnl and on negative zero (this fails e.g. on NetBSD 4.99 and mingw).
+AC_DEFUN([gl_FUNC_FREXP_WORKS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CHECK_DECLS_ONCE([alarm])
+ AC_CACHE_CHECK([whether frexp works], [gl_cv_func_frexp_works],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <float.h>
+#include <math.h>
+#include <string.h>
+#if HAVE_DECL_ALARM
+# include <signal.h>
+# include <unistd.h>
+#endif
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+ ICC 10.0 has a bug when optimizing the expression -zero.
+ The expression -DBL_MIN * DBL_MIN does not work when cross-compiling
+ to PowerPC on Mac OS X 10.5. */
+#if defined __hpux || defined __sgi || defined __ICC
+static double
+compute_minus_zero (void)
+{
+ return -DBL_MIN * DBL_MIN;
+}
+# define minus_zero compute_minus_zero ()
+#else
+double minus_zero = -0.0;
+#endif
+int main()
+{
+ int result = 0;
+ int i;
+ volatile double x;
+ double zero = 0.0;
+#if HAVE_DECL_ALARM
+ /* NeXTstep 3.3 frexp() runs into an endless loop when called on an infinite
+ number. Let the test fail in this case. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (5);
+#endif
+ /* Test on denormalized numbers. */
+ for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5)
+ ;
+ if (x > 0.0)
+ {
+ int exp;
+ double y = frexp (x, &exp);
+ /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022.
+ On NetBSD: y = 0.75. Correct: y = 0.5. */
+ if (y != 0.5)
+ result |= 1;
+ }
+ /* Test on infinite numbers. */
+ x = 1.0 / zero;
+ {
+ int exp;
+ double y = frexp (x, &exp);
+ if (y != x)
+ result |= 2;
+ }
+ /* Test on negative zero. */
+ x = minus_zero;
+ {
+ int exp;
+ double y = frexp (x, &exp);
+ if (memcmp (&y, &x, sizeof x))
+ result |= 4;
+ }
+ return result;
+}]])],
+ [gl_cv_func_frexp_works=yes],
+ [gl_cv_func_frexp_works=no],
+ [case "$host_os" in
+ netbsd* | irix*) gl_cv_func_frexp_works="guessing no" ;;
+ mingw*) # Guess yes with MSVC, no with mingw.
+ AC_EGREP_CPP([Good], [
+#ifdef _MSC_VER
+ Good
+#endif
+ ],
+ [gl_cv_func_frexp_works="guessing yes"],
+ [gl_cv_func_frexp_works="guessing no"])
+ ;;
+ *) gl_cv_func_frexp_works="guessing yes" ;;
+ esac
+ ])
+ ])
+])
diff --git a/gnulib_m4/frexpl.m4 b/gnulib_m4/frexpl.m4
new file mode 100644
index 0000000..b4cf0ca
--- /dev/null
+++ b/gnulib_m4/frexpl.m4
@@ -0,0 +1,233 @@
+# frexpl.m4 serial 22
+dnl Copyright (C) 2007-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FREXPL],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
+
+ dnl Persuade glibc <math.h> to declare frexpl().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ dnl Check whether it's declared.
+ dnl Mac OS X 10.3 has frexpl() in libc but doesn't declare it in <math.h>.
+ AC_CHECK_DECL([frexpl], , [HAVE_DECL_FREXPL=0], [[#include <math.h>]])
+
+ FREXPL_LIBM=
+ if test $HAVE_DECL_FREXPL = 1; then
+ gl_CHECK_FREXPL_NO_LIBM
+ if test $gl_cv_func_frexpl_no_libm = no; then
+ AC_CACHE_CHECK([whether frexpl() can be used with libm],
+ [gl_cv_func_frexpl_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <math.h>
+ long double x;]],
+ [[int e; return frexpl (x, &e) > 0;]])],
+ [gl_cv_func_frexpl_in_libm=yes],
+ [gl_cv_func_frexpl_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+ if test $gl_cv_func_frexpl_in_libm = yes; then
+ FREXPL_LIBM=-lm
+ fi
+ fi
+ if test $gl_cv_func_frexpl_no_libm = yes \
+ || test $gl_cv_func_frexpl_in_libm = yes; then
+ save_LIBS="$LIBS"
+ LIBS="$LIBS $FREXPL_LIBM"
+ gl_FUNC_FREXPL_WORKS
+ LIBS="$save_LIBS"
+ case "$gl_cv_func_frexpl_works" in
+ *yes) gl_func_frexpl=yes ;;
+ *) gl_func_frexpl=no; REPLACE_FREXPL=1 ;;
+ esac
+ else
+ gl_func_frexpl=no
+ fi
+ if test $gl_func_frexpl = yes; then
+ AC_DEFINE([HAVE_FREXPL], [1],
+ [Define if the frexpl() function is available.])
+ fi
+ fi
+ if test $HAVE_DECL_FREXPL = 0 || test $gl_func_frexpl = no; then
+ dnl Find libraries needed to link lib/frexpl.c.
+ if test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then
+ AC_REQUIRE([gl_FUNC_FREXP])
+ FREXPL_LIBM="$FREXP_LIBM"
+ else
+ FREXPL_LIBM=
+ fi
+ fi
+ AC_SUBST([FREXPL_LIBM])
+])
+
+AC_DEFUN([gl_FUNC_FREXPL_NO_LIBM],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
+ dnl Check whether it's declared.
+ dnl Mac OS X 10.3 has frexpl() in libc but doesn't declare it in <math.h>.
+ AC_CHECK_DECL([frexpl], , [HAVE_DECL_FREXPL=0], [[#include <math.h>]])
+ if test $HAVE_DECL_FREXPL = 1; then
+ gl_CHECK_FREXPL_NO_LIBM
+ if test $gl_cv_func_frexpl_no_libm = yes; then
+ gl_FUNC_FREXPL_WORKS
+ case "$gl_cv_func_frexpl_works" in
+ *yes) gl_func_frexpl_no_libm=yes ;;
+ *) gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;;
+ esac
+ else
+ gl_func_frexpl_no_libm=no
+ dnl Set REPLACE_FREXPL here because the system may have frexpl in libm.
+ REPLACE_FREXPL=1
+ fi
+ if test $gl_func_frexpl_no_libm = yes; then
+ AC_DEFINE([HAVE_FREXPL_IN_LIBC], [1],
+ [Define if the frexpl() function is available in libc.])
+ fi
+ fi
+])
+
+dnl Test whether frexpl() can be used without linking with libm.
+dnl Set gl_cv_func_frexpl_no_libm to 'yes' or 'no' accordingly.
+AC_DEFUN([gl_CHECK_FREXPL_NO_LIBM],
+[
+ AC_CACHE_CHECK([whether frexpl() can be used without linking with libm],
+ [gl_cv_func_frexpl_no_libm],
+ [
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <math.h>
+ long double x;]],
+ [[int e; return frexpl (x, &e) > 0;]])],
+ [gl_cv_func_frexpl_no_libm=yes],
+ [gl_cv_func_frexpl_no_libm=no])
+ ])
+])
+
+dnl Test whether frexpl() works on finite numbers (this fails on
+dnl Mac OS X 10.4/PowerPC, on AIX 5.1, and on BeOS), on denormalized numbers
+dnl (this fails on Mac OS X 10.5/i386), and also on infinite numbers (this
+dnl fails e.g. on IRIX 6.5 and mingw).
+AC_DEFUN([gl_FUNC_FREXPL_WORKS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether frexpl works], [gl_cv_func_frexpl_works],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <float.h>
+#include <math.h>
+/* Override the values of <float.h>, like done in float.in.h. */
+#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP (-16381)
+#endif
+#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__)
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP (-16381)
+#endif
+#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP DBL_MIN_EXP
+#endif
+#if defined __sgi && (LDBL_MANT_DIG >= 106)
+# if defined __GNUC__
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP DBL_MIN_EXP
+# endif
+#endif
+extern
+#ifdef __cplusplus
+"C"
+#endif
+long double frexpl (long double, int *);
+long double zero = 0.0L;
+int main()
+{
+ int result = 0;
+ volatile long double x;
+ /* Test on finite numbers that fails on AIX 5.1. */
+ x = 16.0L;
+ {
+ int exp = -9999;
+ frexpl (x, &exp);
+ if (exp != 5)
+ result |= 1;
+ }
+ /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl
+ function returns an invalid (incorrectly normalized) value: it returns
+ y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 }
+ but the correct result is
+ 0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 } */
+ x = 1.01L;
+ {
+ int exp = -9999;
+ long double y = frexpl (x, &exp);
+ if (!(exp == 1 && y == 0.505L))
+ result |= 2;
+ }
+ /* Test on large finite numbers. This fails on BeOS at i = 16322, while
+ LDBL_MAX_EXP = 16384.
+ In the loop end test, we test x against Infinity, rather than comparing
+ i with LDBL_MAX_EXP, because BeOS <float.h> has a wrong LDBL_MAX_EXP. */
+ {
+ int i;
+ for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L)
+ {
+ int exp = -9999;
+ frexpl (x, &exp);
+ if (exp != i)
+ {
+ result |= 4;
+ break;
+ }
+ }
+ }
+ /* Test on denormalized numbers. */
+ {
+ int i;
+ for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L)
+ ;
+ if (x > 0.0L)
+ {
+ int exp;
+ long double y = frexpl (x, &exp);
+ /* On machines with IEEE854 arithmetic: x = 1.68105e-4932,
+ exp = -16382, y = 0.5. On Mac OS X 10.5: exp = -16384, y = 0.5. */
+ if (exp != LDBL_MIN_EXP - 1)
+ result |= 8;
+ }
+ }
+ /* Test on infinite numbers. */
+ /* The Microsoft MSVC 14 compiler chokes on the expression 1.0 / 0.0. */
+ x = 1.0L / zero;
+ {
+ int exp;
+ long double y = frexpl (x, &exp);
+ if (y != x)
+ result |= 16;
+ }
+ return result;
+}]])],
+ [gl_cv_func_frexpl_works=yes],
+ [gl_cv_func_frexpl_works=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ aix | aix[3-6]* | beos* | darwin* | irix* | mingw* | pw*)
+ gl_cv_func_frexpl_works="guessing no";;
+ *) gl_cv_func_frexpl_works="guessing yes";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
diff --git a/gnulib_m4/fseterr.m4 b/gnulib_m4/fseterr.m4
new file mode 100644
index 0000000..61ac03d
--- /dev/null
+++ b/gnulib_m4/fseterr.m4
@@ -0,0 +1,13 @@
+# fseterr.m4 serial 2
+dnl Copyright (C) 2012-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FSETERR],
+[
+ gl_CHECK_FUNCS_ANDROID([__fseterr],
+ [[#include <stdio.h>
+ #include <stdio_ext.h>
+ ]])
+])
diff --git a/gnulib_m4/gnulib-cache.m4 b/gnulib_m4/gnulib-cache.m4
new file mode 100644
index 0000000..c5cacf2
--- /dev/null
+++ b/gnulib_m4/gnulib-cache.m4
@@ -0,0 +1,74 @@
+# Copyright (C) 2002-2023 Free Software Foundation, Inc.
+#
+# This file 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 3 of the License, or
+# (at your option) any later version.
+#
+# This file 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 file. If not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License,
+# this file may be distributed as part of a program that
+# contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# Generated by gnulib-tool.
+#
+# This file represents the specification of how gnulib-tool is used.
+# It acts as a cache: It is written and read by gnulib-tool.
+# In projects that use version control, this file is meant to be put under
+# version control, like the configure.ac and various Makefile.am files.
+
+
+# Specification in the form of a command-line invocation:
+# gnulib-tool --import --local-dir=gl \
+# --lib=libgnu \
+# --source-base=lib \
+# --m4-base=gnulib_m4 \
+# --doc-base=doc \
+# --tests-base=tests \
+# --aux-dir=build-aux \
+# --makefile-name=gnulib.mk \
+# --automake-subdir \
+# --no-conditional-dependencies \
+# --no-libtool \
+# --macro-prefix=gl \
+# fprintf-posix \
+# git-version-gen \
+# havelib \
+# snprintf \
+# stdbool-c99 \
+# stdint \
+# vsnprintf \
+# wcwidth
+
+# Specification in the form of a few gnulib-tool.m4 macro invocations:
+gl_LOCAL_DIR([gl])
+gl_MODULES([
+ fprintf-posix
+ git-version-gen
+ havelib
+ snprintf
+ stdbool-c99
+ stdint
+ vsnprintf
+ wcwidth
+])
+gl_AVOID([])
+gl_SOURCE_BASE([lib])
+gl_M4_BASE([gnulib_m4])
+gl_PO_BASE([])
+gl_DOC_BASE([doc])
+gl_TESTS_BASE([tests])
+gl_LIB([libgnu])
+gl_MAKEFILE_NAME([gnulib.mk])
+gl_AUTOMAKE_SUBDIR
+gl_MACRO_PREFIX([gl])
+gl_PO_DOMAIN([])
+gl_WITNESS_C_MACRO([])
diff --git a/gnulib_m4/gnulib-common.m4 b/gnulib_m4/gnulib-common.m4
new file mode 100644
index 0000000..c0181ab
--- /dev/null
+++ b/gnulib_m4/gnulib-common.m4
@@ -0,0 +1,1243 @@
+# gnulib-common.m4 serial 80
+dnl Copyright (C) 2007-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_PREREQ([2.62])
+
+# gl_COMMON
+# is expanded unconditionally through gnulib-tool magic.
+AC_DEFUN([gl_COMMON], [
+ dnl Use AC_REQUIRE here, so that the code is expanded once only.
+ AC_REQUIRE([gl_00GNULIB])
+ AC_REQUIRE([gl_COMMON_BODY])
+ AC_REQUIRE([gl_ZZGNULIB])
+])
+AC_DEFUN([gl_COMMON_BODY], [
+ AH_VERBATIM([_GL_GNUC_PREREQ],
+[/* True if the compiler says it groks GNU C version MAJOR.MINOR. */
+#if defined __GNUC__ && defined __GNUC_MINOR__
+# define _GL_GNUC_PREREQ(major, minor) \
+ ((major) < __GNUC__ + ((minor) <= __GNUC_MINOR__))
+#else
+# define _GL_GNUC_PREREQ(major, minor) 0
+#endif
+])
+ AH_VERBATIM([_Noreturn],
+[/* The _Noreturn keyword of C11. */
+#ifndef _Noreturn
+# if (defined __cplusplus \
+ && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \
+ || (defined _MSC_VER && 1900 <= _MSC_VER)) \
+ && 0)
+ /* [[noreturn]] is not practically usable, because with it the syntax
+ extern _Noreturn void func (...);
+ would not be valid; such a declaration would only be valid with 'extern'
+ and '_Noreturn' swapped, or without the 'extern' keyword. However, some
+ AIX system header files and several gnulib header files use precisely
+ this syntax with 'extern'. */
+# define _Noreturn [[noreturn]]
+# elif (defined __clang__ && __clang_major__ < 16 \
+ && defined _GL_WORK_AROUND_LLVM_BUG_59792)
+ /* Compile with -D_GL_WORK_AROUND_LLVM_BUG_59792 to work around
+ that rare LLVM bug, though you may get many false-alarm warnings. */
+# define _Noreturn
+# elif ((!defined __cplusplus || defined __clang__) \
+ && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
+ || (!defined __STRICT_ANSI__ \
+ && (_GL_GNUC_PREREQ (4, 7) \
+ || (defined __apple_build_version__ \
+ ? 6000000 <= __apple_build_version__ \
+ : 3 < __clang_major__ + (5 <= __clang_minor__))))))
+ /* _Noreturn works as-is. */
+# elif _GL_GNUC_PREREQ (2, 8) || defined __clang__ || 0x5110 <= __SUNPRO_C
+# define _Noreturn __attribute__ ((__noreturn__))
+# elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
+# define _Noreturn __declspec (noreturn)
+# else
+# define _Noreturn
+# endif
+#endif
+])
+ AH_VERBATIM([isoc99_inline],
+[/* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports
+ the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of
+ earlier versions), but does not display it by setting __GNUC_STDC_INLINE__.
+ __APPLE__ && __MACH__ test for Mac OS X.
+ __APPLE_CC__ tests for the Apple compiler and its version.
+ __STDC_VERSION__ tests for the C99 mode. */
+#if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__
+# define __GNUC_STDC_INLINE__ 1
+#endif])
+ AH_VERBATIM([attribute],
+[/* Attributes. */
+#if (defined __has_attribute \
+ && (!defined __clang_minor__ \
+ || (defined __apple_build_version__ \
+ ? 6000000 <= __apple_build_version__ \
+ : 5 <= __clang_major__)))
+# define _GL_HAS_ATTRIBUTE(attr) __has_attribute (__##attr##__)
+#else
+# define _GL_HAS_ATTRIBUTE(attr) _GL_ATTR_##attr
+# define _GL_ATTR_alloc_size _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_always_inline _GL_GNUC_PREREQ (3, 2)
+# define _GL_ATTR_artificial _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_cold _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_const _GL_GNUC_PREREQ (2, 95)
+# define _GL_ATTR_deprecated _GL_GNUC_PREREQ (3, 1)
+# define _GL_ATTR_diagnose_if 0
+# define _GL_ATTR_error _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_externally_visible _GL_GNUC_PREREQ (4, 1)
+# define _GL_ATTR_fallthrough _GL_GNUC_PREREQ (7, 0)
+# define _GL_ATTR_format _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_leaf _GL_GNUC_PREREQ (4, 6)
+# define _GL_ATTR_malloc _GL_GNUC_PREREQ (3, 0)
+# ifdef _ICC
+# define _GL_ATTR_may_alias 0
+# else
+# define _GL_ATTR_may_alias _GL_GNUC_PREREQ (3, 3)
+# endif
+# define _GL_ATTR_noinline _GL_GNUC_PREREQ (3, 1)
+# define _GL_ATTR_nonnull _GL_GNUC_PREREQ (3, 3)
+# define _GL_ATTR_nonstring _GL_GNUC_PREREQ (8, 0)
+# define _GL_ATTR_nothrow _GL_GNUC_PREREQ (3, 3)
+# define _GL_ATTR_packed _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_pure _GL_GNUC_PREREQ (2, 96)
+# define _GL_ATTR_returns_nonnull _GL_GNUC_PREREQ (4, 9)
+# define _GL_ATTR_sentinel _GL_GNUC_PREREQ (4, 0)
+# define _GL_ATTR_unused _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_warn_unused_result _GL_GNUC_PREREQ (3, 4)
+#endif
+
+/* Disable GCC -Wpedantic if using __has_c_attribute and this is not C23+. */
+#if (defined __has_c_attribute && _GL_GNUC_PREREQ (4, 6) \
+ && (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) <= 201710)
+# pragma GCC diagnostic ignored "-Wpedantic"
+#endif
+
+]dnl There is no _GL_ATTRIBUTE_ALIGNED; use stdalign's alignas instead.
+[
+/* _GL_ATTRIBUTE_ALLOC_SIZE ((N)) declares that the Nth argument of the function
+ is the size of the returned memory block.
+ _GL_ATTRIBUTE_ALLOC_SIZE ((M, N)) declares that the Mth argument multiplied
+ by the Nth argument of the function is the size of the returned memory block.
+ */
+/* Applies to: function, pointer to function, function types. */
+#ifndef _GL_ATTRIBUTE_ALLOC_SIZE
+# if _GL_HAS_ATTRIBUTE (alloc_size)
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args))
+# else
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_ALWAYS_INLINE tells that the compiler should always inline the
+ function and report an error if it cannot do so. */
+/* Applies to: function. */
+#ifndef _GL_ATTRIBUTE_ALWAYS_INLINE
+# if _GL_HAS_ATTRIBUTE (always_inline)
+# define _GL_ATTRIBUTE_ALWAYS_INLINE __attribute__ ((__always_inline__))
+# else
+# define _GL_ATTRIBUTE_ALWAYS_INLINE
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_ARTIFICIAL declares that the function is not important to show
+ in stack traces when debugging. The compiler should omit the function from
+ stack traces. */
+/* Applies to: function. */
+#ifndef _GL_ATTRIBUTE_ARTIFICIAL
+# if _GL_HAS_ATTRIBUTE (artificial)
+# define _GL_ATTRIBUTE_ARTIFICIAL __attribute__ ((__artificial__))
+# else
+# define _GL_ATTRIBUTE_ARTIFICIAL
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_COLD declares that the function is rarely executed. */
+/* Applies to: functions. */
+/* Avoid __attribute__ ((cold)) on MinGW; see thread starting at
+ <https://lists.gnu.org/r/emacs-devel/2019-04/msg01152.html>.
+ Also, Oracle Studio 12.6 requires 'cold' not '__cold__'. */
+#ifndef _GL_ATTRIBUTE_COLD
+# if _GL_HAS_ATTRIBUTE (cold) && !defined __MINGW32__
+# ifndef __SUNPRO_C
+# define _GL_ATTRIBUTE_COLD __attribute__ ((__cold__))
+# else
+# define _GL_ATTRIBUTE_COLD __attribute__ ((cold))
+# endif
+# else
+# define _GL_ATTRIBUTE_COLD
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_CONST declares that it is OK for a compiler to omit duplicate
+ calls to the function with the same arguments.
+ This attribute is safe for a function that neither depends on nor affects
+ observable state, and always returns exactly once - e.g., does not loop
+ forever, and does not call longjmp.
+ (This attribute is stricter than _GL_ATTRIBUTE_PURE.) */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_CONST
+# if _GL_HAS_ATTRIBUTE (const)
+# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
+# else
+# define _GL_ATTRIBUTE_CONST
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+ that can be freed by passing them as the Ith argument to the
+ function F.
+ _GL_ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
+ can be freed via 'free'; it can be used only after declaring 'free'. */
+/* Applies to: functions. Cannot be used on inline functions. */
+#ifndef _GL_ATTRIBUTE_DEALLOC
+# if _GL_GNUC_PREREQ (11, 0)
+# define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+# else
+# define _GL_ATTRIBUTE_DEALLOC(f, i)
+# endif
+#endif
+/* If gnulib's <string.h> or <wchar.h> has already defined this macro, continue
+ to use this earlier definition, since <stdlib.h> may not have been included
+ yet. */
+#ifndef _GL_ATTRIBUTE_DEALLOC_FREE
+# if defined __cplusplus && defined __GNUC__ && !defined __clang__
+/* Work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108231> */
+# define _GL_ATTRIBUTE_DEALLOC_FREE \
+ _GL_ATTRIBUTE_DEALLOC ((void (*) (void *)) free, 1)
+# else
+# define _GL_ATTRIBUTE_DEALLOC_FREE \
+ _GL_ATTRIBUTE_DEALLOC (free, 1)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_DEPRECATED: Declares that an entity is deprecated.
+ The compiler may warn if the entity is used. */
+/* Applies to:
+ - function, variable,
+ - struct, union, struct/union member,
+ - enumeration, enumeration item,
+ - typedef,
+ in C++ also: namespace, class, template specialization. */
+#ifndef _GL_ATTRIBUTE_DEPRECATED
+# ifdef __has_c_attribute
+# if __has_c_attribute (__deprecated__)
+# define _GL_ATTRIBUTE_DEPRECATED [[__deprecated__]]
+# endif
+# endif
+# if !defined _GL_ATTRIBUTE_DEPRECATED && _GL_HAS_ATTRIBUTE (deprecated)
+# define _GL_ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__))
+# endif
+# ifndef _GL_ATTRIBUTE_DEPRECATED
+# define _GL_ATTRIBUTE_DEPRECATED
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_ERROR(msg) requests an error if a function is called and
+ the function call is not optimized away.
+ _GL_ATTRIBUTE_WARNING(msg) requests a warning if a function is called and
+ the function call is not optimized away. */
+/* Applies to: functions. */
+#if !(defined _GL_ATTRIBUTE_ERROR && defined _GL_ATTRIBUTE_WARNING)
+# if _GL_HAS_ATTRIBUTE (error)
+# define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__error__ (msg)))
+# define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__warning__ (msg)))
+# elif _GL_HAS_ATTRIBUTE (diagnose_if)
+# define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__diagnose_if__ (1, msg, "error")))
+# define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+# else
+# define _GL_ATTRIBUTE_ERROR(msg)
+# define _GL_ATTRIBUTE_WARNING(msg)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_EXTERNALLY_VISIBLE declares that the entity should remain
+ visible to debuggers etc., even with '-fwhole-program'. */
+/* Applies to: functions, variables. */
+#ifndef _GL_ATTRIBUTE_EXTERNALLY_VISIBLE
+# if _GL_HAS_ATTRIBUTE (externally_visible)
+# define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((externally_visible))
+# else
+# define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_FALLTHROUGH declares that it is not a programming mistake if
+ the control flow falls through to the immediately following 'case' or
+ 'default' label. The compiler should not warn in this case. */
+/* Applies to: Empty statement (;), inside a 'switch' statement. */
+/* Always expands to something. */
+#ifndef _GL_ATTRIBUTE_FALLTHROUGH
+# ifdef __has_c_attribute
+# if __has_c_attribute (__fallthrough__)
+# define _GL_ATTRIBUTE_FALLTHROUGH [[__fallthrough__]]
+# endif
+# endif
+# if !defined _GL_ATTRIBUTE_FALLTHROUGH && _GL_HAS_ATTRIBUTE (fallthrough)
+# define _GL_ATTRIBUTE_FALLTHROUGH __attribute__ ((__fallthrough__))
+# endif
+# ifndef _GL_ATTRIBUTE_FALLTHROUGH
+# define _GL_ATTRIBUTE_FALLTHROUGH ((void) 0)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT ((ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK))
+ declares that the STRING-INDEXth function argument is a format string of
+ style ARCHETYPE, which is one of:
+ printf, gnu_printf
+ scanf, gnu_scanf,
+ strftime, gnu_strftime,
+ strfmon,
+ or the same thing prefixed and suffixed with '__'.
+ If FIRST-TO-CHECK is not 0, arguments starting at FIRST-TO_CHECK
+ are suitable for the format string. */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_FORMAT
+# if _GL_HAS_ATTRIBUTE (format)
+# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+# else
+# define _GL_ATTRIBUTE_FORMAT(spec)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_LEAF declares that if the function is called from some other
+ compilation unit, it executes code from that unit only by return or by
+ exception handling. This declaration lets the compiler optimize that unit
+ more aggressively. */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_LEAF
+# if _GL_HAS_ATTRIBUTE (leaf)
+# define _GL_ATTRIBUTE_LEAF __attribute__ ((__leaf__))
+# else
+# define _GL_ATTRIBUTE_LEAF
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly
+ allocated memory. */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_MALLOC
+# if _GL_HAS_ATTRIBUTE (malloc)
+# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+# else
+# define _GL_ATTRIBUTE_MALLOC
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_MAY_ALIAS declares that pointers to the type may point to the
+ same storage as pointers to other types. Thus this declaration disables
+ strict aliasing optimization. */
+/* Applies to: types. */
+/* Oracle Studio 12.6 mishandles may_alias despite __has_attribute OK. */
+#ifndef _GL_ATTRIBUTE_MAY_ALIAS
+# if _GL_HAS_ATTRIBUTE (may_alias) && !defined __SUNPRO_C
+# define _GL_ATTRIBUTE_MAY_ALIAS __attribute__ ((__may_alias__))
+# else
+# define _GL_ATTRIBUTE_MAY_ALIAS
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_MAYBE_UNUSED declares that it is not a programming mistake if
+ the entity is not used. The compiler should not warn if the entity is not
+ used. */
+/* Applies to:
+ - function, variable,
+ - struct, union, struct/union member,
+ - enumeration, enumeration item,
+ - typedef,
+ in C++ also: class. */
+/* In C++ and C23, this is spelled [[__maybe_unused__]].
+ GCC's syntax is __attribute__ ((__unused__)).
+ clang supports both syntaxes. Except that with clang ≥ 6, < 10, in C++ mode,
+ __has_c_attribute (__maybe_unused__) yields true but the use of
+ [[__maybe_unused__]] nevertheless produces a warning. */
+#ifndef _GL_ATTRIBUTE_MAYBE_UNUSED
+# if defined __clang__ && defined __cplusplus
+# if __clang_major__ >= 10
+# define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]]
+# endif
+# elif defined __has_c_attribute
+# if __has_c_attribute (__maybe_unused__)
+# define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]]
+# endif
+# endif
+# ifndef _GL_ATTRIBUTE_MAYBE_UNUSED
+# define _GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_UNUSED
+# endif
+#endif
+/* Alternative spelling of this macro, for convenience and for
+ compatibility with glibc/include/libc-symbols.h. */
+#define _GL_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED
+/* Earlier spellings of this macro. */
+#define _UNUSED_PARAMETER_ _GL_ATTRIBUTE_MAYBE_UNUSED
+
+/* _GL_ATTRIBUTE_NODISCARD declares that the caller of the function should not
+ discard the return value. The compiler may warn if the caller does not use
+ the return value, unless the caller uses something like ignore_value. */
+/* Applies to: function, enumeration, class. */
+#ifndef _GL_ATTRIBUTE_NODISCARD
+# if defined __clang__ && defined __cplusplus
+ /* With clang up to 15.0.6 (at least), in C++ mode, [[__nodiscard__]] produces
+ a warning.
+ The 1000 below means a yet unknown threshold. When clang++ version X
+ starts supporting [[__nodiscard__]] without warning about it, you can
+ replace the 1000 with X. */
+# if __clang_major__ >= 1000
+# define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]]
+# endif
+# elif defined __has_c_attribute
+# if __has_c_attribute (__nodiscard__)
+# define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]]
+# endif
+# endif
+# if !defined _GL_ATTRIBUTE_NODISCARD && _GL_HAS_ATTRIBUTE (warn_unused_result)
+# define _GL_ATTRIBUTE_NODISCARD __attribute__ ((__warn_unused_result__))
+# endif
+# ifndef _GL_ATTRIBUTE_NODISCARD
+# define _GL_ATTRIBUTE_NODISCARD
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_NOINLINE tells that the compiler should not inline the
+ function. */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_NOINLINE
+# if _GL_HAS_ATTRIBUTE (noinline)
+# define _GL_ATTRIBUTE_NOINLINE __attribute__ ((__noinline__))
+# else
+# define _GL_ATTRIBUTE_NOINLINE
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_NONNULL ((N1, N2,...)) declares that the arguments N1, N2,...
+ must not be NULL.
+ _GL_ATTRIBUTE_NONNULL () declares that all pointer arguments must not be
+ null. */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_NONNULL
+# if _GL_HAS_ATTRIBUTE (nonnull)
+# define _GL_ATTRIBUTE_NONNULL(args) __attribute__ ((__nonnull__ args))
+# else
+# define _GL_ATTRIBUTE_NONNULL(args)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_NONSTRING declares that the contents of a character array is
+ not meant to be NUL-terminated. */
+/* Applies to: struct/union members and variables that are arrays of element
+ type '[[un]signed] char'. */
+#ifndef _GL_ATTRIBUTE_NONSTRING
+# if _GL_HAS_ATTRIBUTE (nonstring)
+# define _GL_ATTRIBUTE_NONSTRING __attribute__ ((__nonstring__))
+# else
+# define _GL_ATTRIBUTE_NONSTRING
+# endif
+#endif
+
+/* There is no _GL_ATTRIBUTE_NORETURN; use _Noreturn instead. */
+
+/* _GL_ATTRIBUTE_NOTHROW declares that the function does not throw exceptions.
+ */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_NOTHROW
+# if _GL_HAS_ATTRIBUTE (nothrow) && !defined __cplusplus
+# define _GL_ATTRIBUTE_NOTHROW __attribute__ ((__nothrow__))
+# else
+# define _GL_ATTRIBUTE_NOTHROW
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_PACKED declares:
+ For struct members: The member has the smallest possible alignment.
+ For struct, union, class: All members have the smallest possible alignment,
+ minimizing the memory required. */
+/* Applies to: struct members, struct, union,
+ in C++ also: class. */
+#ifndef _GL_ATTRIBUTE_PACKED
+# if _GL_HAS_ATTRIBUTE (packed)
+# define _GL_ATTRIBUTE_PACKED __attribute__ ((__packed__))
+# else
+# define _GL_ATTRIBUTE_PACKED
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_PURE declares that It is OK for a compiler to omit duplicate
+ calls to the function with the same arguments if observable state is not
+ changed between calls.
+ This attribute is safe for a function that does not affect
+ observable state, and always returns exactly once.
+ (This attribute is looser than _GL_ATTRIBUTE_CONST.) */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_PURE
+# if _GL_HAS_ATTRIBUTE (pure)
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+# define _GL_ATTRIBUTE_PURE
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_RETURNS_NONNULL declares that the function's return value is
+ a non-NULL pointer. */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_RETURNS_NONNULL
+# if _GL_HAS_ATTRIBUTE (returns_nonnull)
+# define _GL_ATTRIBUTE_RETURNS_NONNULL __attribute__ ((__returns_nonnull__))
+# else
+# define _GL_ATTRIBUTE_RETURNS_NONNULL
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_SENTINEL(pos) declares that the variadic function expects a
+ trailing NULL argument.
+ _GL_ATTRIBUTE_SENTINEL () - The last argument is NULL (requires C99).
+ _GL_ATTRIBUTE_SENTINEL ((N)) - The (N+1)st argument from the end is NULL. */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_SENTINEL
+# if _GL_HAS_ATTRIBUTE (sentinel)
+# define _GL_ATTRIBUTE_SENTINEL(pos) __attribute__ ((__sentinel__ pos))
+# else
+# define _GL_ATTRIBUTE_SENTINEL(pos)
+# endif
+#endif
+
+/* A helper macro. Don't use it directly. */
+#ifndef _GL_ATTRIBUTE_UNUSED
+# if _GL_HAS_ATTRIBUTE (unused)
+# define _GL_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+# else
+# define _GL_ATTRIBUTE_UNUSED
+# endif
+#endif
+
+]dnl There is no _GL_ATTRIBUTE_VISIBILITY; see m4/visibility.m4 instead.
+[
+/* _GL_UNUSED_LABEL; declares that it is not a programming mistake if the
+ immediately preceding label is not used. The compiler should not warn
+ if the label is not used. */
+/* Applies to: label (both in C and C++). */
+/* Note that g++ < 4.5 does not support the '__attribute__ ((__unused__)) ;'
+ syntax. But clang does. */
+#ifndef _GL_UNUSED_LABEL
+# if !(defined __cplusplus && !_GL_GNUC_PREREQ (4, 5)) || defined __clang__
+# define _GL_UNUSED_LABEL _GL_ATTRIBUTE_UNUSED
+# else
+# define _GL_UNUSED_LABEL
+# endif
+#endif
+])
+ AH_VERBATIM([async_safe],
+[/* The _GL_ASYNC_SAFE marker should be attached to functions that are
+ signal handlers (for signals other than SIGABRT, SIGPIPE) or can be
+ invoked from such signal handlers. Such functions have some restrictions:
+ * All functions that it calls should be marked _GL_ASYNC_SAFE as well,
+ or should be listed as async-signal-safe in POSIX
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04>
+ section 2.4.3. Note that malloc(), sprintf(), and fwrite(), in
+ particular, are NOT async-signal-safe.
+ * All memory locations (variables and struct fields) that these functions
+ access must be marked 'volatile'. This holds for both read and write
+ accesses. Otherwise the compiler might optimize away stores to and
+ reads from such locations that occur in the program, depending on its
+ data flow analysis. For example, when the program contains a loop
+ that is intended to inspect a variable set from within a signal handler
+ while (!signal_occurred)
+ ;
+ the compiler is allowed to transform this into an endless loop if the
+ variable 'signal_occurred' is not declared 'volatile'.
+ Additionally, recall that:
+ * A signal handler should not modify errno (except if it is a handler
+ for a fatal signal and ends by raising the same signal again, thus
+ provoking the termination of the process). If it invokes a function
+ that may clobber errno, it needs to save and restore the value of
+ errno. */
+#define _GL_ASYNC_SAFE
+])
+ AH_VERBATIM([micro_optimizations],
+[/* _GL_CMP (n1, n2) performs a three-valued comparison on n1 vs. n2, where
+ n1 and n2 are expressions without side effects, that evaluate to real
+ numbers (excluding NaN).
+ It returns
+ 1 if n1 > n2
+ 0 if n1 == n2
+ -1 if n1 < n2
+ The naïve code (n1 > n2 ? 1 : n1 < n2 ? -1 : 0) produces a conditional
+ jump with nearly all GCC versions up to GCC 10.
+ This variant (n1 < n2 ? -1 : n1 > n2) produces a conditional with many
+ GCC versions up to GCC 9.
+ The better code (n1 > n2) - (n1 < n2) from Hacker's Delight § 2-9
+ avoids conditional jumps in all GCC versions >= 3.4. */
+#define _GL_CMP(n1, n2) (((n1) > (n2)) - ((n1) < (n2)))
+])
+ dnl Hint which direction to take regarding cross-compilation guesses:
+ dnl When a user installs a program on a platform they are not intimately
+ dnl familiar with, --enable-cross-guesses=conservative is the appropriate
+ dnl choice. It implements the "If we don't know, assume the worst" principle.
+ dnl However, when an operating system developer (on a platform which is not
+ dnl yet known to gnulib) builds packages for their platform, they want to
+ dnl expose, not hide, possible platform bugs; in this case,
+ dnl --enable-cross-guesses=risky is the appropriate choice.
+ dnl Sets the variables
+ dnl gl_cross_guess_normal (to be used when 'yes' is good and 'no' is bad),
+ dnl gl_cross_guess_inverted (to be used when 'no' is good and 'yes' is bad).
+ AC_ARG_ENABLE([cross-guesses],
+ [AS_HELP_STRING([--enable-cross-guesses={conservative|risky}],
+ [specify policy for cross-compilation guesses])],
+ [if test "x$enableval" != xconservative && test "x$enableval" != xrisky; then
+ AC_MSG_WARN([invalid argument supplied to --enable-cross-guesses])
+ enableval=conservative
+ fi
+ gl_cross_guesses="$enableval"],
+ [gl_cross_guesses=conservative])
+ if test $gl_cross_guesses = risky; then
+ gl_cross_guess_normal="guessing yes"
+ gl_cross_guess_inverted="guessing no"
+ else
+ gl_cross_guess_normal="guessing no"
+ gl_cross_guess_inverted="guessing yes"
+ fi
+ dnl Preparation for running test programs:
+ dnl Tell glibc to write diagnostics from -D_FORTIFY_SOURCE=2 to stderr, not
+ dnl to /dev/tty, so they can be redirected to log files. Such diagnostics
+ dnl arise e.g., in the macros gl_PRINTF_DIRECTIVE_N, gl_SNPRINTF_DIRECTIVE_N.
+ LIBC_FATAL_STDERR_=1
+ export LIBC_FATAL_STDERR_
+])
+
+# gl_MODULE_INDICATOR_INIT_VARIABLE([variablename])
+# gl_MODULE_INDICATOR_INIT_VARIABLE([variablename], [initialvalue])
+# initializes the shell variable that indicates the presence of the given module
+# as a C preprocessor expression.
+AC_DEFUN([gl_MODULE_INDICATOR_INIT_VARIABLE],
+[
+ GL_MODULE_INDICATOR_PREFIX[]_[$1]=m4_if([$2], , [0], [$2])
+ AC_SUBST(GL_MODULE_INDICATOR_PREFIX[]_[$1])
+])
+
+# gl_MODULE_INDICATOR_CONDITION
+# expands to a C preprocessor expression that evaluates to 1 or 0, depending
+# whether a gnulib module that has been requested shall be considered present
+# or not.
+m4_define([gl_MODULE_INDICATOR_CONDITION], [1])
+
+# gl_MODULE_INDICATOR_SET_VARIABLE([modulename])
+# sets the shell variable that indicates the presence of the given module to
+# a C preprocessor expression that will evaluate to 1.
+AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE],
+[
+ gl_MODULE_INDICATOR_SET_VARIABLE_AUX(
+ [GL_MODULE_INDICATOR_PREFIX[]_GNULIB_[]m4_translit([[$1]],
+ [abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])],
+ [gl_MODULE_INDICATOR_CONDITION])
+])
+
+# gl_MODULE_INDICATOR_SET_VARIABLE_AUX([variable])
+# modifies the shell variable to include the gl_MODULE_INDICATOR_CONDITION.
+# The shell variable's value is a C preprocessor expression that evaluates
+# to 0 or 1.
+AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX],
+[
+ m4_if(m4_defn([gl_MODULE_INDICATOR_CONDITION]), [1],
+ [
+ dnl Simplify the expression VALUE || 1 to 1.
+ $1=1
+ ],
+ [gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([$1],
+ [gl_MODULE_INDICATOR_CONDITION])])
+])
+
+# gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([variable], [condition])
+# modifies the shell variable to include the given condition. The shell
+# variable's value is a C preprocessor expression that evaluates to 0 or 1.
+AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR],
+[
+ dnl Simplify the expression 1 || CONDITION to 1.
+ if test "$[]$1" != 1; then
+ dnl Simplify the expression 0 || CONDITION to CONDITION.
+ if test "$[]$1" = 0; then
+ $1=$2
+ else
+ $1="($[]$1 || $2)"
+ fi
+ fi
+])
+
+# gl_MODULE_INDICATOR([modulename])
+# defines a C macro indicating the presence of the given module
+# in a location where it can be used.
+# | Value | Value |
+# | in lib/ | in tests/ |
+# --------------------------------------------+---------+-----------+
+# Module present among main modules: | 1 | 1 |
+# --------------------------------------------+---------+-----------+
+# Module present among tests-related modules: | 0 | 1 |
+# --------------------------------------------+---------+-----------+
+# Module not present at all: | 0 | 0 |
+# --------------------------------------------+---------+-----------+
+AC_DEFUN([gl_MODULE_INDICATOR],
+[
+ AC_DEFINE_UNQUOTED([GNULIB_]m4_translit([[$1]],
+ [abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]),
+ [gl_MODULE_INDICATOR_CONDITION],
+ [Define to a C preprocessor expression that evaluates to 1 or 0,
+ depending whether the gnulib module $1 shall be considered present.])
+])
+
+# gl_MODULE_INDICATOR_FOR_TESTS([modulename])
+# defines a C macro indicating the presence of the given module
+# in lib or tests. This is useful to determine whether the module
+# should be tested.
+# | Value | Value |
+# | in lib/ | in tests/ |
+# --------------------------------------------+---------+-----------+
+# Module present among main modules: | 1 | 1 |
+# --------------------------------------------+---------+-----------+
+# Module present among tests-related modules: | 1 | 1 |
+# --------------------------------------------+---------+-----------+
+# Module not present at all: | 0 | 0 |
+# --------------------------------------------+---------+-----------+
+AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS],
+[
+ AC_DEFINE([GNULIB_TEST_]m4_translit([[$1]],
+ [abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]), [1],
+ [Define to 1 when the gnulib module $1 should be tested.])
+])
+
+# gl_ASSERT_NO_GNULIB_POSIXCHECK
+# asserts that there will never be a need to #define GNULIB_POSIXCHECK.
+# and thereby enables an optimization of configure and config.h.
+# Used by Emacs.
+AC_DEFUN([gl_ASSERT_NO_GNULIB_POSIXCHECK],
+[
+ dnl Override gl_WARN_ON_USE_PREPARE.
+ dnl But hide this definition from 'aclocal'.
+ AC_DEFUN([gl_W][ARN_ON_USE_PREPARE], [])
+])
+
+# gl_ASSERT_NO_GNULIB_TESTS
+# asserts that there will be no gnulib tests in the scope of the configure.ac
+# and thereby enables an optimization of config.h.
+# Used by Emacs.
+AC_DEFUN([gl_ASSERT_NO_GNULIB_TESTS],
+[
+ dnl Override gl_MODULE_INDICATOR_FOR_TESTS.
+ AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS], [])
+])
+
+# Test whether <features.h> exists.
+# Set HAVE_FEATURES_H.
+AC_DEFUN([gl_FEATURES_H],
+[
+ AC_CHECK_HEADERS_ONCE([features.h])
+ if test $ac_cv_header_features_h = yes; then
+ HAVE_FEATURES_H=1
+ else
+ HAVE_FEATURES_H=0
+ fi
+ AC_SUBST([HAVE_FEATURES_H])
+])
+
+# gl_PROG_CC_C99
+# Modifies the value of the shell variable CC in an attempt to make $CC
+# understand ISO C99 source code.
+AC_DEFUN([gl_PROG_CC_C99],
+[
+ dnl Just use AC_PROG_CC_C99.
+ dnl When AC_PROG_CC_C99 and AC_PROG_CC_STDC are used together, the substituted
+ dnl value of CC will contain the C99 enabling options twice. But this is only
+ dnl a cosmetic problem.
+ dnl With Autoconf >= 2.70, use AC_PROG_CC since it implies AC_PROG_CC_C99;
+ dnl this avoids a "warning: The macro `AC_PROG_CC_C99' is obsolete."
+ m4_version_prereq([2.70],
+ [AC_REQUIRE([AC_PROG_CC])],
+ [AC_REQUIRE([AC_PROG_CC_C99])])
+])
+
+# gl_PROG_AR_RANLIB
+# Determines the values for AR, ARFLAGS, RANLIB that fit with the compiler.
+# The user can set the variables AR, ARFLAGS, RANLIB if he wants to override
+# the values.
+AC_DEFUN([gl_PROG_AR_RANLIB],
+[
+ dnl Minix 3 comes with two toolchains: The Amsterdam Compiler Kit compiler
+ dnl as "cc", and GCC as "gcc". They have different object file formats and
+ dnl library formats. In particular, the GNU binutils programs ar and ranlib
+ dnl produce libraries that work only with gcc, not with cc.
+ AC_REQUIRE([AC_PROG_CC])
+ dnl The '][' hides this use from 'aclocal'.
+ AC_BEFORE([$0], [A][M_PROG_AR])
+ AC_CACHE_CHECK([for Minix Amsterdam compiler], [gl_cv_c_amsterdam_compiler],
+ [
+ AC_EGREP_CPP([Amsterdam],
+ [
+#ifdef __ACK__
+Amsterdam
+#endif
+ ],
+ [gl_cv_c_amsterdam_compiler=yes],
+ [gl_cv_c_amsterdam_compiler=no])
+ ])
+
+ dnl Don't compete with AM_PROG_AR's decision about AR/ARFLAGS if we are not
+ dnl building with __ACK__.
+ if test $gl_cv_c_amsterdam_compiler = yes; then
+ if test -z "$AR"; then
+ AR='cc -c.a'
+ fi
+ if test -z "$ARFLAGS"; then
+ ARFLAGS='-o'
+ fi
+ else
+ dnl AM_PROG_AR was added in automake v1.11.2. AM_PROG_AR does not AC_SUBST
+ dnl ARFLAGS variable (it is filed into Makefile.in directly by automake
+ dnl script on-demand, if not specified by ./configure of course).
+ dnl Don't AC_REQUIRE the AM_PROG_AR otherwise the code for __ACK__ above
+ dnl will be ignored. Also, pay attention to call AM_PROG_AR in else block
+ dnl because AM_PROG_AR is written so it could re-set AR variable even for
+ dnl __ACK__. It may seem like its easier to avoid calling the macro here,
+ dnl but we need to AC_SUBST both AR/ARFLAGS (thus those must have some good
+ dnl default value and automake should usually know them).
+ dnl
+ dnl The '][' hides this use from 'aclocal'.
+ m4_ifdef([A][M_PROG_AR], [A][M_PROG_AR], [:])
+ fi
+
+ dnl In case the code above has not helped with setting AR/ARFLAGS, use
+ dnl Automake-documented default values for AR and ARFLAGS, but prefer
+ dnl ${host}-ar over ar (useful for cross-compiling).
+ AC_CHECK_TOOL([AR], [ar], [ar])
+ if test -z "$ARFLAGS"; then
+ ARFLAGS='cr'
+ fi
+
+ AC_SUBST([AR])
+ AC_SUBST([ARFLAGS])
+ if test -z "$RANLIB"; then
+ if test $gl_cv_c_amsterdam_compiler = yes; then
+ RANLIB=':'
+ else
+ dnl Use the ranlib program if it is available.
+ AC_PROG_RANLIB
+ fi
+ fi
+ AC_SUBST([RANLIB])
+])
+
+# AC_C_RESTRICT
+# This definition is copied from post-2.70 Autoconf and overrides the
+# AC_C_RESTRICT macro from autoconf 2.60..2.70.
+m4_version_prereq([2.70.1], [], [
+AC_DEFUN([AC_C_RESTRICT],
+[AC_CACHE_CHECK([for C/C++ restrict keyword], [ac_cv_c_restrict],
+ [ac_cv_c_restrict=no
+ # Put '__restrict__' first, to avoid problems with glibc and non-GCC; see:
+ # https://lists.gnu.org/archive/html/bug-autoconf/2016-02/msg00006.html
+ # Put 'restrict' last, because C++ lacks it.
+ for ac_kw in __restrict__ __restrict _Restrict restrict; do
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[typedef int *int_ptr;
+ int foo (int_ptr $ac_kw ip) { return ip[0]; }
+ int bar (int [$ac_kw]); /* Catch GCC bug 14050. */
+ int bar (int ip[$ac_kw]) { return ip[0]; }
+ ]],
+ [[int s[1];
+ int *$ac_kw t = s;
+ t[0] = 0;
+ return foo (t) + bar (t);
+ ]])],
+ [ac_cv_c_restrict=$ac_kw])
+ test "$ac_cv_c_restrict" != no && break
+ done
+ ])
+ AH_VERBATIM([restrict],
+[/* Define to the equivalent of the C99 'restrict' keyword, or to
+ nothing if this is not supported. Do not define if restrict is
+ supported only directly. */
+#undef restrict
+/* Work around a bug in older versions of Sun C++, which did not
+ #define __restrict__ or support _Restrict or __restrict__
+ even though the corresponding Sun C compiler ended up with
+ "#define restrict _Restrict" or "#define restrict __restrict__"
+ in the previous line. This workaround can be removed once
+ we assume Oracle Developer Studio 12.5 (2016) or later. */
+#if defined __SUNPRO_CC && !defined __RESTRICT && !defined __restrict__
+# define _Restrict
+# define __restrict__
+#endif])
+ case $ac_cv_c_restrict in
+ restrict) ;;
+ no) AC_DEFINE([restrict], []) ;;
+ *) AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;;
+ esac
+])# AC_C_RESTRICT
+])
+
+# gl_BIGENDIAN
+# is like AC_C_BIGENDIAN, except that it can be AC_REQUIREd.
+# Note that AC_REQUIRE([AC_C_BIGENDIAN]) does not work reliably because some
+# macros invoke AC_C_BIGENDIAN with arguments.
+AC_DEFUN([gl_BIGENDIAN],
+[
+ AC_C_BIGENDIAN
+])
+
+# A temporary file descriptor.
+# Must be less than 10, because dash 0.5.8 does not support redirections
+# with multi-digit file descriptors.
+m4_define([GL_TMP_FD], 9)
+
+# gl_SILENT(command)
+# executes command, but without the normal configure output.
+# This is useful when you want to invoke AC_CACHE_CHECK (or AC_CHECK_FUNC etc.)
+# inside another AC_CACHE_CHECK.
+AC_DEFUN([gl_SILENT],
+[
+ exec GL_TMP_FD>&AS_MESSAGE_FD AS_MESSAGE_FD>/dev/null
+ $1
+ exec AS_MESSAGE_FD>&GL_TMP_FD GL_TMP_FD>&-
+])
+
+# gl_CACHE_VAL_SILENT(cache-id, command-to-set-it)
+# is like AC_CACHE_VAL(cache-id, command-to-set-it), except that it does not
+# output a spurious "(cached)" mark in the midst of other configure output.
+# This macro should be used instead of AC_CACHE_VAL when it is not surrounded
+# by an AC_MSG_CHECKING/AC_MSG_RESULT pair.
+AC_DEFUN([gl_CACHE_VAL_SILENT],
+[
+ gl_SILENT([
+ AC_CACHE_VAL([$1], [$2])
+ ])
+])
+
+# gl_CONDITIONAL(conditional, condition)
+# is like AM_CONDITIONAL(conditional, condition), except that it does not
+# produce an error
+# configure: error: conditional "..." was never defined.
+# Usually this means the macro was only invoked conditionally.
+# when only invoked conditionally. Instead, in that case, both the _TRUE
+# and the _FALSE case are disabled.
+AC_DEFUN([gl_CONDITIONAL],
+[
+ pushdef([AC_CONFIG_COMMANDS_PRE], [:])dnl
+ AM_CONDITIONAL([$1], [$2])
+ popdef([AC_CONFIG_COMMANDS_PRE])dnl
+ if test -z "${[$1]_TRUE}" && test -z "${[$1]_FALSE}"; then
+ [$1]_TRUE='#'
+ [$1]_FALSE='#'
+ fi
+])
+
+# gl_CC_ALLOW_WARNINGS
+# sets and substitutes a variable GL_CFLAG_ALLOW_WARNINGS, to a $(CC) option
+# that reverts a preceding '-Werror' option, if available.
+# This is expected to be '-Wno-error' on gcc, clang (except clang/MSVC), xlclang
+# and empty otherwise.
+AC_DEFUN([gl_CC_ALLOW_WARNINGS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_CACHE_CHECK([for C compiler option to allow warnings],
+ [gl_cv_cc_wallow],
+ [rm -f conftest*
+ echo 'int dummy;' > conftest.c
+ AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -c conftest.c 2>conftest1.err]) >/dev/null
+ AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -Wno-error -c conftest.c 2>conftest2.err]) >/dev/null
+ dnl Test the number of error output lines, because AIX xlc accepts the
+ dnl option '-Wno-error', just to produce a warning
+ dnl "Option -Wno-error was incorrectly specified. The option will be ignored."
+ dnl afterwards.
+ if test $? = 0 && test `wc -l < conftest1.err` = `wc -l < conftest2.err`; then
+ gl_cv_cc_wallow='-Wno-error'
+ else
+ gl_cv_cc_wallow=none
+ fi
+ rm -f conftest*
+ ])
+ case "$gl_cv_cc_wallow" in
+ none) GL_CFLAG_ALLOW_WARNINGS='' ;;
+ *) GL_CFLAG_ALLOW_WARNINGS="$gl_cv_cc_wallow" ;;
+ esac
+ AC_SUBST([GL_CFLAG_ALLOW_WARNINGS])
+])
+
+# gl_CXX_ALLOW_WARNINGS
+# sets and substitutes a variable GL_CXXFLAG_ALLOW_WARNINGS, to a $(CC) option
+# that reverts a preceding '-Werror' option, if available.
+AC_DEFUN([gl_CXX_ALLOW_WARNINGS],
+[
+ dnl Requires AC_PROG_CXX or gl_PROG_ANSI_CXX.
+ if test -n "$CXX" && test "$CXX" != no; then
+ AC_CACHE_CHECK([for C++ compiler option to allow warnings],
+ [gl_cv_cxx_wallow],
+ [rm -f conftest*
+ echo 'int dummy;' > conftest.cc
+ AC_TRY_COMMAND([${CXX-c++} $CXXFLAGS $CPPFLAGS -c conftest.cc 2>conftest1.err]) >/dev/null
+ AC_TRY_COMMAND([${CXX-c++} $CXXFLAGS $CPPFLAGS -Wno-error -c conftest.cc 2>conftest2.err]) >/dev/null
+ dnl Test the number of error output lines, because AIX xlC accepts the
+ dnl option '-Wno-error', just to produce a warning
+ dnl "Option -Wno-error was incorrectly specified. The option will be ignored."
+ dnl afterwards.
+ if test $? = 0 && test `wc -l < conftest1.err` = `wc -l < conftest2.err`; then
+ gl_cv_cxx_wallow='-Wno-error'
+ else
+ gl_cv_cxx_wallow=none
+ fi
+ rm -f conftest*
+ ])
+ case "$gl_cv_cxx_wallow" in
+ none) GL_CXXFLAG_ALLOW_WARNINGS='' ;;
+ *) GL_CXXFLAG_ALLOW_WARNINGS="$gl_cv_cxx_wallow" ;;
+ esac
+ else
+ GL_CXXFLAG_ALLOW_WARNINGS=''
+ fi
+ AC_SUBST([GL_CXXFLAG_ALLOW_WARNINGS])
+])
+
+# gl_CC_GNULIB_WARNINGS
+# sets and substitutes a variable GL_CFLAG_GNULIB_WARNINGS, to a $(CC) option
+# set that enables or disables warnings as suitable for the Gnulib coding style.
+AC_DEFUN([gl_CC_GNULIB_WARNINGS],
+[
+ AC_REQUIRE([gl_CC_ALLOW_WARNINGS])
+ dnl Assume that the compiler supports -Wno-* options only if it also supports
+ dnl -Wno-error.
+ GL_CFLAG_GNULIB_WARNINGS=''
+ if test -n "$GL_CFLAG_ALLOW_WARNINGS"; then
+ dnl Enable these warning options:
+ dnl
+ dnl GCC clang
+ dnl -Wno-cast-qual >= 3 >= 3.9
+ dnl -Wno-conversion >= 3 >= 3.9
+ dnl -Wno-float-conversion >= 4.9 >= 3.9
+ dnl -Wno-float-equal >= 3 >= 3.9
+ dnl -Wimplicit-fallthrough >= 7 >= 3.9
+ dnl -Wno-pedantic >= 4.8 >= 3.9
+ dnl -Wno-sign-compare >= 3 >= 3.9
+ dnl -Wno-sign-conversion >= 4.3 >= 3.9
+ dnl -Wno-type-limits >= 4.3 >= 3.9
+ dnl -Wno-undef >= 3 >= 3.9
+ dnl -Wno-unsuffixed-float-constants >= 4.5
+ dnl -Wno-unused-function >= 3 >= 3.9
+ dnl -Wno-unused-parameter >= 3 >= 3.9
+ dnl
+ cat > conftest.c <<\EOF
+ #if __GNUC__ >= 3 || (__clang_major__ + (__clang_minor__ >= 9) > 3)
+ -Wno-cast-qual
+ -Wno-conversion
+ -Wno-float-equal
+ -Wno-sign-compare
+ -Wno-undef
+ -Wno-unused-function
+ -Wno-unused-parameter
+ #endif
+ #if __GNUC__ + (__GNUC_MINOR__ >= 9) > 4 || (__clang_major__ + (__clang_minor__ >= 9) > 3)
+ -Wno-float-conversion
+ #endif
+ #if __GNUC__ >= 7 || (__clang_major__ + (__clang_minor__ >= 9) > 3)
+ -Wimplicit-fallthrough
+ #endif
+ #if __GNUC__ + (__GNUC_MINOR__ >= 8) > 4 || (__clang_major__ + (__clang_minor__ >= 9) > 3)
+ -Wno-pedantic
+ #endif
+ #if __GNUC__ + (__GNUC_MINOR__ >= 3) > 4 || (__clang_major__ + (__clang_minor__ >= 9) > 3)
+ -Wno-sign-conversion
+ -Wno-type-limits
+ #endif
+ #if __GNUC__ + (__GNUC_MINOR__ >= 5) > 4
+ -Wno-unsuffixed-float-constants
+ #endif
+EOF
+ gl_command="$CC $CFLAGS $CPPFLAGS -E conftest.c > conftest.out"
+ if AC_TRY_EVAL([gl_command]); then
+ gl_options=`grep -v '#' conftest.out`
+ for word in $gl_options; do
+ GL_CFLAG_GNULIB_WARNINGS="$GL_CFLAG_GNULIB_WARNINGS $word"
+ done
+ fi
+ rm -f conftest.c conftest.out
+ fi
+ AC_SUBST([GL_CFLAG_GNULIB_WARNINGS])
+])
+
+dnl gl_CONDITIONAL_HEADER([foo.h])
+dnl takes a shell variable GL_GENERATE_FOO_H (with value true or false) as input
+dnl and produces
+dnl - an AC_SUBSTed variable FOO_H that is either a file name or empty, based
+dnl on whether GL_GENERATE_FOO_H is true or false,
+dnl - an Automake conditional GL_GENERATE_FOO_H that evaluates to the value of
+dnl the shell variable GL_GENERATE_FOO_H.
+AC_DEFUN([gl_CONDITIONAL_HEADER],
+[
+ m4_pushdef([gl_header_name], AS_TR_SH(m4_toupper($1)))
+ m4_pushdef([gl_generate_var], [GL_GENERATE_]AS_TR_SH(m4_toupper($1)))
+ m4_pushdef([gl_generate_cond], [GL_GENERATE_]AS_TR_SH(m4_toupper($1)))
+ case "$gl_generate_var" in
+ false) gl_header_name='' ;;
+ true)
+ dnl It is OK to use a .h file in lib/ from within tests/, but not vice
+ dnl versa.
+ if test -z "$gl_header_name"; then
+ gl_header_name="${gl_source_base_prefix}$1"
+ fi
+ ;;
+ *) echo "*** gl_generate_var is not set correctly" 1>&2; exit 1 ;;
+ esac
+ AC_SUBST(gl_header_name)
+ gl_CONDITIONAL(gl_generate_cond, [$gl_generate_var])
+ m4_popdef([gl_generate_cond])
+ m4_popdef([gl_generate_var])
+ m4_popdef([gl_header_name])
+])
+
+dnl gl_CHECK_FUNCS_ANDROID([func], [[#include <foo.h>]])
+dnl is like AC_CHECK_FUNCS([func]), taking into account a portability problem
+dnl on Android.
+dnl
+dnl When code is compiled on Android, it is in the context of a certain
+dnl "Android API level", which indicates the minimum version of Android on
+dnl which the app can be installed. In other words, you don't compile for a
+dnl specific version of Android. You compile for all versions of Android,
+dnl onwards from the given API level.
+dnl Thus, the question "does the OS have the function func" has three possible
+dnl answers:
+dnl - yes, in all versions starting from the given API level,
+dnl - no, in no version,
+dnl - not in the given API level, but in a later version of Android.
+dnl
+dnl In detail, this works as follows:
+dnl If func was added to Android API level, say, 28, then the libc.so has the
+dnl symbol func always, whereas the header file <foo.h> declares func
+dnl conditionally:
+dnl #if __ANDROID_API__ >= 28
+dnl ... func (...) __INTRODUCED_IN(28);
+dnl #endif
+dnl Thus, when compiling with "clang -target armv7a-unknown-linux-android28",
+dnl the function func is declared and exists in libc.
+dnl Whereas when compiling with "clang -target armv7a-unknown-linux-android27",
+dnl the function func is not declared but exists in libc.
+dnl
+dnl This macro sets two variables:
+dnl - gl_cv_onwards_func_<func> to yes / no / "future OS version"
+dnl - ac_cv_func_<func> to yes / no / no
+dnl The first variable allows to distinguish all three cases.
+dnl The second variable is set, so that an invocation
+dnl gl_CHECK_FUNCS_ANDROID([func], [[#include <foo.h>]])
+dnl can be used as a drop-in replacement for
+dnl AC_CHECK_FUNCS([func]).
+AC_DEFUN([gl_CHECK_FUNCS_ANDROID],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CACHE_CHECK([for [$1]],
+ [[gl_cv_onwards_func_][$1]],
+ [gl_SILENT([
+ case "$host_os" in
+ linux*-android*)
+ AC_CHECK_DECL([$1], , , [$2])
+ if test $[ac_cv_have_decl_][$1] = yes; then
+ AC_CHECK_FUNC([[$1]])
+ if test $[ac_cv_func_][$1] = yes; then
+ [gl_cv_onwards_func_][$1]=yes
+ else
+ dnl The function is declared but does not exist. This should not
+ dnl happen normally. But anyway, we know that a future version
+ dnl of Android will have the function.
+ [gl_cv_onwards_func_][$1]='future OS version'
+ fi
+ else
+ [gl_cv_onwards_func_][$1]='future OS version'
+ fi
+ ;;
+ *)
+ AC_CHECK_FUNC([$1])
+ [gl_cv_onwards_func_][$1]=$[ac_cv_func_][$1]
+ ;;
+ esac
+ ])
+ ])
+ case "$[gl_cv_onwards_func_][$1]" in
+ future*) [ac_cv_func_][$1]=no ;;
+ *) [ac_cv_func_][$1]=$[gl_cv_onwards_func_][$1] ;;
+ esac
+ if test $[ac_cv_func_][$1] = yes; then
+ AC_DEFINE([HAVE_]m4_translit([[$1]],
+ [abcdefghijklmnopqrstuvwxyz],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ]),
+ [1], [Define to 1 if you have the `$1' function.])
+ fi
+])
+
+dnl Expands to some code for use in .c programs that, on native Windows, defines
+dnl the Microsoft deprecated alias function names to the underscore-prefixed
+dnl actual function names. With this macro, these function names are available
+dnl without linking with '-loldnames' and without generating warnings.
+dnl Usage: Use it after all system header files are included.
+dnl #include <...>
+dnl #include <...>
+dnl ]GL_MDA_DEFINES[
+dnl ...
+AC_DEFUN([GL_MDA_DEFINES],[
+AC_REQUIRE([_GL_MDA_DEFINES])
+[$gl_mda_defines]
+])
+AC_DEFUN([_GL_MDA_DEFINES],
+[gl_mda_defines='
+#if defined _WIN32 && !defined __CYGWIN__
+#define access _access
+#define chdir _chdir
+#define chmod _chmod
+#define close _close
+#define creat _creat
+#define dup _dup
+#define dup2 _dup2
+#define ecvt _ecvt
+#define execl _execl
+#define execle _execle
+#define execlp _execlp
+#define execv _execv
+#define execve _execve
+#define execvp _execvp
+#define execvpe _execvpe
+#define fcloseall _fcloseall
+#define fcvt _fcvt
+#define fdopen _fdopen
+#define fileno _fileno
+#define gcvt _gcvt
+#define getcwd _getcwd
+#define getpid _getpid
+#define getw _getw
+#define isatty _isatty
+#define j0 _j0
+#define j1 _j1
+#define jn _jn
+#define lfind _lfind
+#define lsearch _lsearch
+#define lseek _lseek
+#define memccpy _memccpy
+#define mkdir _mkdir
+#define mktemp _mktemp
+#define open _open
+#define putenv _putenv
+#define putw _putw
+#define read _read
+#define rmdir _rmdir
+#define strdup _strdup
+#define swab _swab
+#define tempnam _tempnam
+#define tzset _tzset
+#define umask _umask
+#define unlink _unlink
+#define utime _utime
+#define wcsdup _wcsdup
+#define write _write
+#define y0 _y0
+#define y1 _y1
+#define yn _yn
+#endif
+'
+])
diff --git a/gnulib_m4/gnulib-comp.m4 b/gnulib_m4/gnulib-comp.m4
new file mode 100644
index 0000000..e6af458
--- /dev/null
+++ b/gnulib_m4/gnulib-comp.m4
@@ -0,0 +1,616 @@
+# DO NOT EDIT! GENERATED AUTOMATICALLY!
+# Copyright (C) 2002-2023 Free Software Foundation, Inc.
+#
+# This file 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 3 of the License, or
+# (at your option) any later version.
+#
+# This file 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 file. If not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License,
+# this file may be distributed as part of a program that
+# contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# Generated by gnulib-tool.
+#
+# This file represents the compiled summary of the specification in
+# gnulib-cache.m4. It lists the computed macro invocations that need
+# to be invoked from configure.ac.
+# In projects that use version control, this file can be treated like
+# other built files.
+
+
+# This macro should be invoked from ./configure.ac, in the section
+# "Checks for programs", right after AC_PROG_CC, and certainly before
+# any checks for libraries, header files, types and library functions.
+AC_DEFUN([gl_EARLY],
+[
+ m4_pattern_forbid([^gl_[A-Z]])dnl the gnulib macro namespace
+ m4_pattern_allow([^gl_ES$])dnl a valid locale name
+ m4_pattern_allow([^gl_LIBOBJS$])dnl a variable
+ m4_pattern_allow([^gl_LTLIBOBJS$])dnl a variable
+
+ # Pre-early section.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_REQUIRE([gl_PROG_AR_RANLIB])
+
+ # Code from module absolute-header:
+ # Code from module alloca-opt:
+ # Code from module assert-h:
+ # Code from module attribute:
+ # Code from module errno:
+ # Code from module extensions:
+ # Code from module extern-inline:
+ # Code from module float:
+ # Code from module fpieee:
+ AC_REQUIRE([gl_FP_IEEE])
+ # Code from module fprintf-posix:
+ # Code from module fpucw:
+ # Code from module free-posix:
+ # Code from module frexp-nolibm:
+ # Code from module frexpl-nolibm:
+ # Code from module fseterr:
+ # Code from module gen-header:
+ # Code from module git-version-gen:
+ # Code from module havelib:
+ # Code from module include_next:
+ # Code from module inttypes-incomplete:
+ # Code from module isnand-nolibm:
+ # Code from module isnanf-nolibm:
+ # Code from module isnanl-nolibm:
+ # Code from module limits-h:
+ # Code from module localcharset:
+ # Code from module math:
+ # Code from module memchr:
+ # Code from module multiarch:
+ # Code from module nocrash:
+ # Code from module printf-frexp:
+ # Code from module printf-frexpl:
+ # Code from module printf-safe:
+ # Code from module signbit:
+ # Code from module size_max:
+ # Code from module snippet/_Noreturn:
+ # Code from module snippet/arg-nonnull:
+ # Code from module snippet/c++defs:
+ # Code from module snippet/warn-on-use:
+ # Code from module snprintf:
+ # Code from module ssize_t:
+ # Code from module stdbool-c99:
+ # Code from module stddef:
+ # Code from module stdint:
+ # Code from module stdio:
+ # Code from module stdlib:
+ # Code from module streq:
+ # Code from module string:
+ # Code from module sys_types:
+ # Code from module unistd:
+ # Code from module unitypes:
+ # Code from module uniwidth/base:
+ # Code from module uniwidth/width:
+ # Code from module vasnprintf:
+ # Code from module vsnprintf:
+ # Code from module wchar:
+ # Code from module wctype-h:
+ # Code from module wcwidth:
+ # Code from module xsize:
+])
+
+# This macro should be invoked from ./configure.ac, in the section
+# "Check for header files, types and library functions".
+AC_DEFUN([gl_INIT],
+[
+ AM_CONDITIONAL([GL_COND_LIBTOOL], [false])
+ gl_cond_libtool=false
+ gl_libdeps=
+ gl_ltlibdeps=
+ gl_m4_base='gnulib_m4'
+ m4_pushdef([AC_LIBOBJ], m4_defn([gl_LIBOBJ]))
+ m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gl_REPLACE_FUNCS]))
+ m4_pushdef([AC_LIBSOURCES], m4_defn([gl_LIBSOURCES]))
+ m4_pushdef([gl_LIBSOURCES_LIST], [])
+ m4_pushdef([gl_LIBSOURCES_DIR], [])
+ m4_pushdef([GL_MACRO_PREFIX], [gl])
+ m4_pushdef([GL_MODULE_INDICATOR_PREFIX], [GL])
+ gl_COMMON
+ gl_source_base='lib'
+ gl_source_base_prefix='$(top_build_prefix)lib/'
+ gl_FUNC_ALLOCA
+ gl_CONDITIONAL_HEADER([alloca.h])
+ AC_PROG_MKDIR_P
+ gl_ASSERT_H
+ gl_CONDITIONAL_HEADER([assert.h])
+ AC_PROG_MKDIR_P
+ gl_HEADER_ERRNO_H
+ gl_CONDITIONAL_HEADER([errno.h])
+ AC_PROG_MKDIR_P
+ AC_REQUIRE([gl_EXTERN_INLINE])
+ gl_FLOAT_H
+ gl_CONDITIONAL_HEADER([float.h])
+ AC_PROG_MKDIR_P
+ gl_CONDITIONAL([GL_COND_OBJ_FLOAT], [test $REPLACE_FLOAT_LDBL = 1])
+ gl_CONDITIONAL([GL_COND_OBJ_ITOLD], [test $REPLACE_ITOLD = 1])
+ gl_FUNC_FPRINTF_POSIX
+ gl_STDIO_MODULE_INDICATOR([fprintf-posix])
+ gl_FUNC_FREE
+ gl_CONDITIONAL([GL_COND_OBJ_FREE], [test $REPLACE_FREE = 1])
+ AM_COND_IF([GL_COND_OBJ_FREE], [
+ gl_PREREQ_FREE
+ ])
+ gl_STDLIB_MODULE_INDICATOR([free-posix])
+ gl_FUNC_FREXP_NO_LIBM
+ if test $gl_func_frexp_no_libm != yes; then
+ AC_LIBOBJ([frexp])
+ fi
+ gl_MATH_MODULE_INDICATOR([frexp])
+ gl_FUNC_FREXPL_NO_LIBM
+ if test $HAVE_DECL_FREXPL = 0 || test $gl_func_frexpl_no_libm = no; then
+ AC_LIBOBJ([frexpl])
+ fi
+ gl_MATH_MODULE_INDICATOR([frexpl])
+ gl_FUNC_FSETERR
+ gl_CONDITIONAL([GL_COND_OBJ_FSETERR], [test $ac_cv_func___fseterr = no])
+ AC_DEFUN([gl_HAVE_MODULE_HAVELIB])
+ gl_INTTYPES_INCOMPLETE
+ gl_INTTYPES_H_REQUIRE_DEFAULTS
+ AC_PROG_MKDIR_P
+ gl_FUNC_ISNAND_NO_LIBM
+ if test $gl_func_isnand_no_libm != yes; then
+ AC_LIBOBJ([isnand])
+ gl_PREREQ_ISNAND
+ fi
+ gl_FUNC_ISNANF_NO_LIBM
+ if test $gl_func_isnanf_no_libm != yes; then
+ AC_LIBOBJ([isnanf])
+ gl_PREREQ_ISNANF
+ fi
+ gl_FUNC_ISNANL_NO_LIBM
+ if test $gl_func_isnanl_no_libm != yes; then
+ AC_LIBOBJ([isnanl])
+ gl_PREREQ_ISNANL
+ fi
+ gl_LIMITS_H
+ gl_CONDITIONAL_HEADER([limits.h])
+ AC_PROG_MKDIR_P
+ gl_LOCALCHARSET
+ dnl For backward compatibility. Some packages still use this.
+ LOCALCHARSET_TESTS_ENVIRONMENT=
+ AC_SUBST([LOCALCHARSET_TESTS_ENVIRONMENT])
+ gl_MATH_H
+ gl_MATH_H_REQUIRE_DEFAULTS
+ AC_PROG_MKDIR_P
+ gl_FUNC_MEMCHR
+ gl_CONDITIONAL([GL_COND_OBJ_MEMCHR], [test $REPLACE_MEMCHR = 1])
+ AM_COND_IF([GL_COND_OBJ_MEMCHR], [
+ gl_PREREQ_MEMCHR
+ ])
+ gl_STRING_MODULE_INDICATOR([memchr])
+ gl_MULTIARCH
+ gl_FUNC_PRINTF_FREXP
+ gl_FUNC_PRINTF_FREXPL
+ m4_divert_text([INIT_PREPARE], [gl_printf_safe=yes])
+ gl_SIGNBIT
+ gl_CONDITIONAL([GL_COND_OBJ_SIGNBIT3], [test $REPLACE_SIGNBIT = 1])
+ gl_MATH_MODULE_INDICATOR([signbit])
+ gl_SIZE_MAX
+ gl_FUNC_SNPRINTF
+ gl_STDIO_MODULE_INDICATOR([snprintf])
+ gl_MODULE_INDICATOR([snprintf])
+ gt_TYPE_SSIZE_T
+ gl_STDBOOL_H
+ gl_CONDITIONAL_HEADER([stdbool.h])
+ AC_PROG_MKDIR_P
+ gl_STDDEF_H
+ gl_STDDEF_H_REQUIRE_DEFAULTS
+ gl_CONDITIONAL_HEADER([stddef.h])
+ AC_PROG_MKDIR_P
+ gl_STDINT_H
+ gl_CONDITIONAL_HEADER([stdint.h])
+ dnl Because of gl_REPLACE_LIMITS_H:
+ gl_CONDITIONAL_HEADER([limits.h])
+ AC_PROG_MKDIR_P
+ gl_STDIO_H
+ gl_STDIO_H_REQUIRE_DEFAULTS
+ AC_PROG_MKDIR_P
+ gl_CONDITIONAL([GL_COND_OBJ_STDIO_READ], [test $REPLACE_STDIO_READ_FUNCS = 1])
+ gl_CONDITIONAL([GL_COND_OBJ_STDIO_WRITE], [test $REPLACE_STDIO_WRITE_FUNCS = 1])
+ dnl No need to create extra modules for these functions. Everyone who uses
+ dnl <stdio.h> likely needs them.
+ gl_STDIO_MODULE_INDICATOR([fscanf])
+ gl_MODULE_INDICATOR([fscanf])
+ gl_STDIO_MODULE_INDICATOR([scanf])
+ gl_MODULE_INDICATOR([scanf])
+ gl_STDIO_MODULE_INDICATOR([fgetc])
+ gl_STDIO_MODULE_INDICATOR([getc])
+ gl_STDIO_MODULE_INDICATOR([getchar])
+ gl_STDIO_MODULE_INDICATOR([fgets])
+ gl_STDIO_MODULE_INDICATOR([fread])
+ dnl No need to create extra modules for these functions. Everyone who uses
+ dnl <stdio.h> likely needs them.
+ gl_STDIO_MODULE_INDICATOR([fprintf])
+ gl_STDIO_MODULE_INDICATOR([printf])
+ gl_STDIO_MODULE_INDICATOR([vfprintf])
+ gl_STDIO_MODULE_INDICATOR([vprintf])
+ gl_STDIO_MODULE_INDICATOR([fputc])
+ gl_STDIO_MODULE_INDICATOR([putc])
+ gl_STDIO_MODULE_INDICATOR([putchar])
+ gl_STDIO_MODULE_INDICATOR([fputs])
+ gl_STDIO_MODULE_INDICATOR([puts])
+ gl_STDIO_MODULE_INDICATOR([fwrite])
+ gl_STDLIB_H
+ gl_STDLIB_H_REQUIRE_DEFAULTS
+ AC_PROG_MKDIR_P
+ gl_STRING_H
+ gl_STRING_H_REQUIRE_DEFAULTS
+ AC_PROG_MKDIR_P
+ gl_SYS_TYPES_H
+ gl_SYS_TYPES_H_REQUIRE_DEFAULTS
+ AC_PROG_MKDIR_P
+ gl_UNISTD_H
+ gl_UNISTD_H_REQUIRE_DEFAULTS
+ AC_PROG_MKDIR_P
+ gl_LIBUNISTRING_LIBHEADER([0.9.11], [unitypes.h])
+ AC_PROG_MKDIR_P
+ AH_VERBATIM([unitypes_restrict], [
+ /* This definition is a duplicate of the one in unitypes.h.
+ It is here so that we can cope with an older version of unitypes.h
+ that does not contain this definition and that is pre-installed among
+ the public header files. */
+ # if defined __restrict \
+ || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
+ || __clang_major__ >= 3
+ # define _UC_RESTRICT __restrict
+ # elif 199901L <= __STDC_VERSION__ || defined restrict
+ # define _UC_RESTRICT restrict
+ # else
+ # define _UC_RESTRICT
+ # endif
+ ])
+ gl_LIBUNISTRING_LIBHEADER([0.9.11], [uniwidth.h])
+ AC_PROG_MKDIR_P
+ gl_LIBUNISTRING_MODULE([1.1], [uniwidth/width])
+ AC_REQUIRE([AC_C_RESTRICT])
+ gl_FUNC_VASNPRINTF
+ gl_FUNC_VSNPRINTF
+ gl_STDIO_MODULE_INDICATOR([vsnprintf])
+ gl_WCHAR_H
+ gl_WCHAR_H_REQUIRE_DEFAULTS
+ AC_PROG_MKDIR_P
+ gl_WCTYPE_H
+ gl_WCTYPE_H_REQUIRE_DEFAULTS
+ AC_PROG_MKDIR_P
+ gl_FUNC_WCWIDTH
+ gl_CONDITIONAL([GL_COND_OBJ_WCWIDTH],
+ [test $HAVE_WCWIDTH = 0 || test $REPLACE_WCWIDTH = 1])
+ AM_COND_IF([GL_COND_OBJ_WCWIDTH], [
+ gl_PREREQ_WCWIDTH
+ ])
+ gl_WCHAR_MODULE_INDICATOR([wcwidth])
+ gl_XSIZE
+ # End of code from modules
+ m4_ifval(gl_LIBSOURCES_LIST, [
+ m4_syscmd([test ! -d ]m4_defn([gl_LIBSOURCES_DIR])[ ||
+ for gl_file in ]gl_LIBSOURCES_LIST[ ; do
+ if test ! -r ]m4_defn([gl_LIBSOURCES_DIR])[/$gl_file ; then
+ echo "missing file ]m4_defn([gl_LIBSOURCES_DIR])[/$gl_file" >&2
+ exit 1
+ fi
+ done])dnl
+ m4_if(m4_sysval, [0], [],
+ [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])])
+ ])
+ m4_popdef([GL_MODULE_INDICATOR_PREFIX])
+ m4_popdef([GL_MACRO_PREFIX])
+ m4_popdef([gl_LIBSOURCES_DIR])
+ m4_popdef([gl_LIBSOURCES_LIST])
+ m4_popdef([AC_LIBSOURCES])
+ m4_popdef([AC_REPLACE_FUNCS])
+ m4_popdef([AC_LIBOBJ])
+ AC_CONFIG_COMMANDS_PRE([
+ gl_libobjs=
+ gl_ltlibobjs=
+ gl_libobjdeps=
+ if test -n "$gl_LIBOBJS"; then
+ # Remove the extension.
+changequote(,)dnl
+ sed_drop_objext='s/\.o$//;s/\.obj$//'
+ sed_dirname1='s,//*,/,g'
+ sed_dirname2='s,\(.\)/$,\1,'
+ sed_dirname3='s,^[^/]*$,.,'
+ sed_dirname4='s,\(.\)/[^/]*$,\1,'
+ sed_basename1='s,.*/,,'
+changequote([, ])dnl
+ for i in `for i in $gl_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do
+ gl_libobjs="$gl_libobjs lib/$i.$ac_objext"
+ gl_ltlibobjs="$gl_ltlibobjs lib/$i.lo"
+ i_dir=`echo "$i" | sed -e "$sed_dirname1" -e "$sed_dirname2" -e "$sed_dirname3" -e "$sed_dirname4"`
+ i_base=`echo "$i" | sed -e "$sed_basename1"`
+ gl_libobjdeps="$gl_libobjdeps lib/$i_dir/\$(DEPDIR)/$i_base.Po"
+ done
+ fi
+ AC_SUBST([gl_LIBOBJS], [$gl_libobjs])
+ AC_SUBST([gl_LTLIBOBJS], [$gl_ltlibobjs])
+ AC_SUBST([gl_LIBOBJDEPS], [$gl_libobjdeps])
+ ])
+ gltests_libdeps=
+ gltests_ltlibdeps=
+ m4_pushdef([AC_LIBOBJ], m4_defn([gltests_LIBOBJ]))
+ m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gltests_REPLACE_FUNCS]))
+ m4_pushdef([AC_LIBSOURCES], m4_defn([gltests_LIBSOURCES]))
+ m4_pushdef([gltests_LIBSOURCES_LIST], [])
+ m4_pushdef([gltests_LIBSOURCES_DIR], [])
+ m4_pushdef([GL_MACRO_PREFIX], [gltests])
+ m4_pushdef([GL_MODULE_INDICATOR_PREFIX], [GL])
+ gl_COMMON
+ gl_source_base='tests'
+ gl_source_base_prefix=
+changequote(,)dnl
+ gltests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS
+changequote([, ])dnl
+ AC_SUBST([gltests_WITNESS])
+ gl_module_indicator_condition=$gltests_WITNESS
+ m4_pushdef([gl_MODULE_INDICATOR_CONDITION], [$gl_module_indicator_condition])
+ m4_popdef([gl_MODULE_INDICATOR_CONDITION])
+ m4_ifval(gltests_LIBSOURCES_LIST, [
+ m4_syscmd([test ! -d ]m4_defn([gltests_LIBSOURCES_DIR])[ ||
+ for gl_file in ]gltests_LIBSOURCES_LIST[ ; do
+ if test ! -r ]m4_defn([gltests_LIBSOURCES_DIR])[/$gl_file ; then
+ echo "missing file ]m4_defn([gltests_LIBSOURCES_DIR])[/$gl_file" >&2
+ exit 1
+ fi
+ done])dnl
+ m4_if(m4_sysval, [0], [],
+ [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])])
+ ])
+ m4_popdef([GL_MODULE_INDICATOR_PREFIX])
+ m4_popdef([GL_MACRO_PREFIX])
+ m4_popdef([gltests_LIBSOURCES_DIR])
+ m4_popdef([gltests_LIBSOURCES_LIST])
+ m4_popdef([AC_LIBSOURCES])
+ m4_popdef([AC_REPLACE_FUNCS])
+ m4_popdef([AC_LIBOBJ])
+ AC_CONFIG_COMMANDS_PRE([
+ gltests_libobjs=
+ gltests_ltlibobjs=
+ gltests_libobjdeps=
+ if test -n "$gltests_LIBOBJS"; then
+ # Remove the extension.
+changequote(,)dnl
+ sed_drop_objext='s/\.o$//;s/\.obj$//'
+ sed_dirname1='s,//*,/,g'
+ sed_dirname2='s,\(.\)/$,\1,'
+ sed_dirname3='s,^[^/]*$,.,'
+ sed_dirname4='s,\(.\)/[^/]*$,\1,'
+ sed_basename1='s,.*/,,'
+changequote([, ])dnl
+ for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do
+ gltests_libobjs="$gltests_libobjs lib/$i.$ac_objext"
+ gltests_ltlibobjs="$gltests_ltlibobjs lib/$i.lo"
+ i_dir=`echo "$i" | sed -e "$sed_dirname1" -e "$sed_dirname2" -e "$sed_dirname3" -e "$sed_dirname4"`
+ i_base=`echo "$i" | sed -e "$sed_basename1"`
+ gltests_libobjdeps="$gltests_libobjdeps lib/$i_dir/\$(DEPDIR)/$i_base.Po"
+ done
+ fi
+ AC_SUBST([gltests_LIBOBJS], [$gltests_libobjs])
+ AC_SUBST([gltests_LTLIBOBJS], [$gltests_ltlibobjs])
+ AC_SUBST([gltests_LIBOBJDEPS], [$gltests_libobjdeps])
+ ])
+ AC_REQUIRE([gl_CC_GNULIB_WARNINGS])
+ LIBGNU_LIBDEPS="$gl_libdeps"
+ AC_SUBST([LIBGNU_LIBDEPS])
+ LIBGNU_LTLIBDEPS="$gl_ltlibdeps"
+ AC_SUBST([LIBGNU_LTLIBDEPS])
+])
+
+# Like AC_LIBOBJ, except that the module name goes
+# into gl_LIBOBJS instead of into LIBOBJS.
+AC_DEFUN([gl_LIBOBJ], [
+ AS_LITERAL_IF([$1], [gl_LIBSOURCES([$1.c])])dnl
+ gl_LIBOBJS="$gl_LIBOBJS $1.$ac_objext"
+])
+
+# Like AC_REPLACE_FUNCS, except that the module name goes
+# into gl_LIBOBJS instead of into LIBOBJS.
+AC_DEFUN([gl_REPLACE_FUNCS], [
+ m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl
+ AC_CHECK_FUNCS([$1], , [gl_LIBOBJ($ac_func)])
+])
+
+# Like AC_LIBSOURCES, except the directory where the source file is
+# expected is derived from the gnulib-tool parameterization,
+# and alloca is special cased (for the alloca-opt module).
+# We could also entirely rely on EXTRA_lib..._SOURCES.
+AC_DEFUN([gl_LIBSOURCES], [
+ m4_foreach([_gl_NAME], [$1], [
+ m4_if(_gl_NAME, [alloca.c], [], [
+ m4_define([gl_LIBSOURCES_DIR], [lib])
+ m4_append([gl_LIBSOURCES_LIST], _gl_NAME, [ ])
+ ])
+ ])
+])
+
+# Like AC_LIBOBJ, except that the module name goes
+# into gltests_LIBOBJS instead of into LIBOBJS.
+AC_DEFUN([gltests_LIBOBJ], [
+ AS_LITERAL_IF([$1], [gltests_LIBSOURCES([$1.c])])dnl
+ gltests_LIBOBJS="$gltests_LIBOBJS $1.$ac_objext"
+])
+
+# Like AC_REPLACE_FUNCS, except that the module name goes
+# into gltests_LIBOBJS instead of into LIBOBJS.
+AC_DEFUN([gltests_REPLACE_FUNCS], [
+ m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl
+ AC_CHECK_FUNCS([$1], , [gltests_LIBOBJ($ac_func)])
+])
+
+# Like AC_LIBSOURCES, except the directory where the source file is
+# expected is derived from the gnulib-tool parameterization,
+# and alloca is special cased (for the alloca-opt module).
+# We could also entirely rely on EXTRA_lib..._SOURCES.
+AC_DEFUN([gltests_LIBSOURCES], [
+ m4_foreach([_gl_NAME], [$1], [
+ m4_if(_gl_NAME, [alloca.c], [], [
+ m4_define([gltests_LIBSOURCES_DIR], [tests])
+ m4_append([gltests_LIBSOURCES_LIST], _gl_NAME, [ ])
+ ])
+ ])
+])
+
+# This macro records the list of files which have been installed by
+# gnulib-tool and may be removed by future gnulib-tool invocations.
+AC_DEFUN([gl_FILE_LIST], [
+ build-aux/config.rpath
+ build-aux/git-version-gen
+ lib/_Noreturn.h
+ lib/alloca.in.h
+ lib/arg-nonnull.h
+ lib/asnprintf.c
+ lib/assert.in.h
+ lib/attribute.h
+ lib/c++defs.h
+ lib/errno.in.h
+ lib/float+.h
+ lib/float.c
+ lib/float.in.h
+ lib/fprintf.c
+ lib/fpucw.h
+ lib/free.c
+ lib/frexp.c
+ lib/frexpl.c
+ lib/fseterr.c
+ lib/fseterr.h
+ lib/inttypes.in.h
+ lib/isnan.c
+ lib/isnand-nolibm.h
+ lib/isnand.c
+ lib/isnanf-nolibm.h
+ lib/isnanf.c
+ lib/isnanl-nolibm.h
+ lib/isnanl.c
+ lib/itold.c
+ lib/limits.in.h
+ lib/localcharset.c
+ lib/localcharset.h
+ lib/math.c
+ lib/math.in.h
+ lib/memchr.c
+ lib/memchr.valgrind
+ lib/printf-args.c
+ lib/printf-args.h
+ lib/printf-frexp.c
+ lib/printf-frexp.h
+ lib/printf-frexpl.c
+ lib/printf-frexpl.h
+ lib/printf-parse.c
+ lib/printf-parse.h
+ lib/signbitd.c
+ lib/signbitf.c
+ lib/signbitl.c
+ lib/size_max.h
+ lib/snprintf.c
+ lib/stdbool.in.h
+ lib/stddef.in.h
+ lib/stdint.in.h
+ lib/stdio-impl.h
+ lib/stdio-read.c
+ lib/stdio-write.c
+ lib/stdio.in.h
+ lib/stdlib.in.h
+ lib/streq.h
+ lib/string.in.h
+ lib/sys_types.in.h
+ lib/unictype/bitmap.h
+ lib/unistd.c
+ lib/unistd.in.h
+ lib/unitypes.in.h
+ lib/uniwidth.in.h
+ lib/uniwidth/cjk.h
+ lib/uniwidth/width.c
+ lib/uniwidth/width0.h
+ lib/uniwidth/width2.h
+ lib/vasnprintf.c
+ lib/vasnprintf.h
+ lib/verify.h
+ lib/vsnprintf.c
+ lib/warn-on-use.h
+ lib/wchar.in.h
+ lib/wctype-h.c
+ lib/wctype.in.h
+ lib/wcwidth.c
+ lib/xsize.c
+ lib/xsize.h
+ m4/00gnulib.m4
+ m4/absolute-header.m4
+ m4/alloca.m4
+ m4/assert_h.m4
+ m4/codeset.m4
+ m4/errno_h.m4
+ m4/exponentd.m4
+ m4/exponentf.m4
+ m4/exponentl.m4
+ m4/extensions.m4
+ m4/extern-inline.m4
+ m4/float_h.m4
+ m4/fpieee.m4
+ m4/fprintf-posix.m4
+ m4/free.m4
+ m4/frexp.m4
+ m4/frexpl.m4
+ m4/fseterr.m4
+ m4/gnulib-common.m4
+ m4/host-cpu-c-abi.m4
+ m4/include_next.m4
+ m4/intmax_t.m4
+ m4/inttypes.m4
+ m4/inttypes_h.m4
+ m4/isnand.m4
+ m4/isnanf.m4
+ m4/isnanl.m4
+ m4/ldexpl.m4
+ m4/lib-ld.m4
+ m4/lib-link.m4
+ m4/lib-prefix.m4
+ m4/libunistring-base.m4
+ m4/limits-h.m4
+ m4/localcharset.m4
+ m4/math_h.m4
+ m4/memchr.m4
+ m4/mmap-anon.m4
+ m4/multiarch.m4
+ m4/nocrash.m4
+ m4/off_t.m4
+ m4/pid_t.m4
+ m4/printf-frexp.m4
+ m4/printf-frexpl.m4
+ m4/printf.m4
+ m4/signbit.m4
+ m4/size_max.m4
+ m4/snprintf.m4
+ m4/ssize_t.m4
+ m4/stdbool.m4
+ m4/stddef_h.m4
+ m4/stdint.m4
+ m4/stdint_h.m4
+ m4/stdio_h.m4
+ m4/stdlib_h.m4
+ m4/string_h.m4
+ m4/sys_types_h.m4
+ m4/unistd_h.m4
+ m4/vasnprintf.m4
+ m4/vsnprintf.m4
+ m4/warn-on-use.m4
+ m4/wchar_h.m4
+ m4/wchar_t.m4
+ m4/wctype_h.m4
+ m4/wcwidth.m4
+ m4/wint_t.m4
+ m4/xsize.m4
+ m4/zzgnulib.m4
+])
diff --git a/gnulib_m4/include_next.m4 b/gnulib_m4/include_next.m4
new file mode 100644
index 0000000..9f19215
--- /dev/null
+++ b/gnulib_m4/include_next.m4
@@ -0,0 +1,224 @@
+# include_next.m4 serial 26
+dnl Copyright (C) 2006-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert and Derek Price.
+
+dnl Sets INCLUDE_NEXT, INCLUDE_NEXT_AS_FIRST_DIRECTIVE, PRAGMA_SYSTEM_HEADER,
+dnl and PRAGMA_COLUMNS.
+dnl
+dnl INCLUDE_NEXT expands to 'include_next' if the compiler supports it, or to
+dnl 'include' otherwise.
+dnl
+dnl INCLUDE_NEXT_AS_FIRST_DIRECTIVE expands to 'include_next' if the compiler
+dnl supports it in the special case that it is the first include directive in
+dnl the given file, or to 'include' otherwise.
+dnl
+dnl PRAGMA_SYSTEM_HEADER can be used in files that contain #include_next,
+dnl so as to avoid GCC warnings when the gcc option -pedantic is used.
+dnl '#pragma GCC system_header' has the same effect as if the file was found
+dnl through the include search path specified with '-isystem' options (as
+dnl opposed to the search path specified with '-I' options). Namely, gcc
+dnl does not warn about some things, and on some systems (Solaris and Interix)
+dnl __STDC__ evaluates to 0 instead of to 1. The latter is an undesired side
+dnl effect; we are therefore careful to use 'defined __STDC__' or '1' instead
+dnl of plain '__STDC__'.
+dnl
+dnl PRAGMA_COLUMNS can be used in files that override system header files, so
+dnl as to avoid compilation errors on HP NonStop systems when the gnulib file
+dnl is included by a system header file that does a "#pragma COLUMNS 80" (which
+dnl has the effect of truncating the lines of that file and all files that it
+dnl includes to 80 columns) and the gnulib file has lines longer than 80
+dnl columns.
+
+AC_DEFUN([gl_INCLUDE_NEXT],
+[
+ AC_LANG_PREPROC_REQUIRE()
+ AC_CACHE_CHECK([whether the preprocessor supports include_next],
+ [gl_cv_have_include_next],
+ [rm -rf conftestd1a conftestd1b conftestd2
+ mkdir conftestd1a conftestd1b conftestd2
+ dnl IBM C 9.0, 10.1 (original versions, prior to the 2009-01 updates) on
+ dnl AIX 6.1 support include_next when used as first preprocessor directive
+ dnl in a file, but not when preceded by another include directive. Check
+ dnl for this bug by including <stdio.h>.
+ dnl Additionally, with this same compiler, include_next is a no-op when
+ dnl used in a header file that was included by specifying its absolute
+ dnl file name. Despite these two bugs, include_next is used in the
+ dnl compiler's <math.h>. By virtue of the second bug, we need to use
+ dnl include_next as well in this case.
+ cat <<EOF > conftestd1a/conftest.h
+#define DEFINED_IN_CONFTESTD1
+#include_next <conftest.h>
+#ifdef DEFINED_IN_CONFTESTD2
+int foo;
+#else
+#error "include_next doesn't work"
+#endif
+EOF
+ cat <<EOF > conftestd1b/conftest.h
+#define DEFINED_IN_CONFTESTD1
+#include <stdio.h>
+#include_next <conftest.h>
+#ifdef DEFINED_IN_CONFTESTD2
+int foo;
+#else
+#error "include_next doesn't work"
+#endif
+EOF
+ cat <<EOF > conftestd2/conftest.h
+#ifndef DEFINED_IN_CONFTESTD1
+#error "include_next test doesn't work"
+#endif
+#define DEFINED_IN_CONFTESTD2
+EOF
+ gl_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2"
+dnl We intentionally avoid using AC_LANG_SOURCE here.
+ AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[#include <conftest.h>]],
+ [gl_cv_have_include_next=yes],
+ [CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2"
+ AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[#include <conftest.h>]],
+ [gl_cv_have_include_next=buggy],
+ [gl_cv_have_include_next=no])
+ ])
+ CPPFLAGS="$gl_save_CPPFLAGS"
+ rm -rf conftestd1a conftestd1b conftestd2
+ ])
+ PRAGMA_SYSTEM_HEADER=
+ if test $gl_cv_have_include_next = yes; then
+ INCLUDE_NEXT=include_next
+ INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
+ if test -n "$GCC"; then
+ PRAGMA_SYSTEM_HEADER='#pragma GCC system_header'
+ fi
+ else
+ if test $gl_cv_have_include_next = buggy; then
+ INCLUDE_NEXT=include
+ INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
+ else
+ INCLUDE_NEXT=include
+ INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include
+ fi
+ fi
+ AC_SUBST([INCLUDE_NEXT])
+ AC_SUBST([INCLUDE_NEXT_AS_FIRST_DIRECTIVE])
+ AC_SUBST([PRAGMA_SYSTEM_HEADER])
+
+ dnl HP NonStop systems, which define __TANDEM, limit the line length
+ dnl after including some system header files.
+ AC_CACHE_CHECK([whether source code line length is unlimited],
+ [gl_cv_source_line_length_unlimited],
+ [AC_EGREP_CPP([choke me],
+ [
+#ifdef __TANDEM
+choke me
+#endif
+ ],
+ [gl_cv_source_line_length_unlimited=no],
+ [gl_cv_source_line_length_unlimited=yes])
+ ])
+ if test $gl_cv_source_line_length_unlimited = no; then
+ PRAGMA_COLUMNS="#pragma COLUMNS 10000"
+ else
+ PRAGMA_COLUMNS=
+ fi
+ AC_SUBST([PRAGMA_COLUMNS])
+])
+
+# gl_CHECK_NEXT_HEADERS(HEADER1 HEADER2 ...)
+# ------------------------------------------
+# For each arg foo.h, if #include_next works, define NEXT_FOO_H to be
+# '<foo.h>'; otherwise define it to be
+# '"///usr/include/foo.h"', or whatever other absolute file name is suitable.
+# Also, if #include_next works as first preprocessing directive in a file,
+# define NEXT_AS_FIRST_DIRECTIVE_FOO_H to be '<foo.h>'; otherwise define it to
+# be
+# '"///usr/include/foo.h"', or whatever other absolute file name is suitable.
+# That way, a header file with the following line:
+# #@INCLUDE_NEXT@ @NEXT_FOO_H@
+# or
+# #@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_FOO_H@
+# behaves (after sed substitution) as if it contained
+# #include_next <foo.h>
+# even if the compiler does not support include_next.
+# The three "///" are to pacify Sun C 5.8, which otherwise would say
+# "warning: #include of /usr/include/... may be non-portable".
+# Use '""', not '<>', so that the /// cannot be confused with a C99 comment.
+# Note: This macro assumes that the header file is not empty after
+# preprocessing, i.e. it does not only define preprocessor macros but also
+# provides some type/enum definitions or function/variable declarations.
+#
+# This macro also checks whether each header exists, by invoking
+# AC_CHECK_HEADERS_ONCE or AC_CHECK_HEADERS on each argument.
+AC_DEFUN([gl_CHECK_NEXT_HEADERS],
+[
+ gl_NEXT_HEADERS_INTERNAL([$1], [check])
+])
+
+# gl_NEXT_HEADERS(HEADER1 HEADER2 ...)
+# ------------------------------------
+# Like gl_CHECK_NEXT_HEADERS, except do not check whether the headers exist.
+# This is suitable for headers like <stddef.h> that are standardized by C89
+# and therefore can be assumed to exist.
+AC_DEFUN([gl_NEXT_HEADERS],
+[
+ gl_NEXT_HEADERS_INTERNAL([$1], [assume])
+])
+
+# The guts of gl_CHECK_NEXT_HEADERS and gl_NEXT_HEADERS.
+AC_DEFUN([gl_NEXT_HEADERS_INTERNAL],
+[
+ AC_REQUIRE([gl_INCLUDE_NEXT])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+
+ m4_if([$2], [check],
+ [AC_CHECK_HEADERS_ONCE([$1])
+ ])
+
+ m4_foreach_w([gl_HEADER_NAME], [$1],
+ [AS_VAR_PUSHDEF([gl_next_header],
+ [gl_cv_next_]m4_defn([gl_HEADER_NAME]))
+ if test $gl_cv_have_include_next = yes; then
+ AS_VAR_SET([gl_next_header], ['<'gl_HEADER_NAME'>'])
+ else
+ AC_CACHE_CHECK(
+ [absolute name of <]m4_defn([gl_HEADER_NAME])[>],
+ [gl_next_header],
+ [m4_if([$2], [check],
+ [AS_VAR_PUSHDEF([gl_header_exists],
+ [ac_cv_header_]m4_defn([gl_HEADER_NAME]))
+ if test AS_VAR_GET([gl_header_exists]) = yes; then
+ AS_VAR_POPDEF([gl_header_exists])
+ ])
+ gl_ABSOLUTE_HEADER_ONE(gl_HEADER_NAME)
+ AS_VAR_COPY([gl_header], [gl_cv_absolute_]AS_TR_SH(gl_HEADER_NAME))
+ AS_VAR_SET([gl_next_header], ['"'$gl_header'"'])
+ m4_if([$2], [check],
+ [else
+ AS_VAR_SET([gl_next_header], ['<'gl_HEADER_NAME'>'])
+ fi
+ ])
+ ])
+ fi
+ AC_SUBST(
+ AS_TR_CPP([NEXT_]m4_defn([gl_HEADER_NAME])),
+ [AS_VAR_GET([gl_next_header])])
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'gl_HEADER_NAME'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=AS_VAR_GET([gl_next_header])
+ fi
+ AC_SUBST(
+ AS_TR_CPP([NEXT_AS_FIRST_DIRECTIVE_]m4_defn([gl_HEADER_NAME])),
+ [$gl_next_as_first_directive])
+ AS_VAR_POPDEF([gl_next_header])])
+])
+
+# Autoconf 2.68 added warnings for our use of AC_COMPILE_IFELSE;
+# this fallback is safe for all earlier autoconf versions.
+m4_define_default([AC_LANG_DEFINES_PROVIDED])
diff --git a/gnulib_m4/intmax_t.m4 b/gnulib_m4/intmax_t.m4
new file mode 100644
index 0000000..ef32e1b
--- /dev/null
+++ b/gnulib_m4/intmax_t.m4
@@ -0,0 +1,59 @@
+# intmax_t.m4 serial 9
+dnl Copyright (C) 1997-2004, 2006-2007, 2009-2023 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+AC_PREREQ([2.53])
+
+# Define intmax_t to 'long' or 'long long'
+# if it is not already defined in <stdint.h> or <inttypes.h>.
+
+AC_DEFUN([gl_AC_TYPE_INTMAX_T],
+[
+ dnl For simplicity, we assume that a header file defines 'intmax_t' if and
+ dnl only if it defines 'uintmax_t'.
+ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+ if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then
+ AC_DEFINE_UNQUOTED([intmax_t], [long long],
+ [Define to long or long long if <inttypes.h> and <stdint.h> don't define.])
+ else
+ AC_DEFINE([HAVE_INTMAX_T], [1],
+ [Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
+ fi
+])
+
+dnl An alternative would be to explicitly test for 'intmax_t'.
+
+AC_DEFUN([gt_AC_TYPE_INTMAX_T],
+[
+ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+ AC_CACHE_CHECK([for intmax_t], [gt_cv_c_intmax_t],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <stddef.h>
+#include <stdlib.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+#include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+#include <inttypes.h>
+#endif
+ ]],
+ [[intmax_t x = -1; return !x;]])],
+ [gt_cv_c_intmax_t=yes],
+ [gt_cv_c_intmax_t=no])])
+ if test $gt_cv_c_intmax_t = yes; then
+ AC_DEFINE([HAVE_INTMAX_T], [1],
+ [Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
+ else
+ AC_DEFINE_UNQUOTED([intmax_t], [long long],
+ [Define to long or long long if <stdint.h> and <inttypes.h> don't define.])
+ fi
+])
diff --git a/gnulib_m4/inttypes.m4 b/gnulib_m4/inttypes.m4
new file mode 100644
index 0000000..e7efbe9
--- /dev/null
+++ b/gnulib_m4/inttypes.m4
@@ -0,0 +1,184 @@
+# inttypes.m4 serial 37
+dnl Copyright (C) 2006-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Derek Price, Bruno Haible.
+dnl Test whether <inttypes.h> is supported or must be substituted.
+
+AC_DEFUN_ONCE([gl_INTTYPES_H],
+[
+ AC_REQUIRE([gl_INTTYPES_INCOMPLETE])
+ gl_INTTYPES_PRI_SCN
+])
+
+AC_DEFUN_ONCE([gl_INTTYPES_INCOMPLETE],
+[
+ AC_REQUIRE([gl_STDINT_H])
+ AC_CHECK_HEADERS_ONCE([inttypes.h])
+
+ dnl Override <inttypes.h> always, so that the portability warnings work.
+ AC_REQUIRE([gl_INTTYPES_H_DEFAULTS])
+ gl_CHECK_NEXT_HEADERS([inttypes.h])
+
+ AC_REQUIRE([gl_MULTIARCH])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <inttypes.h>
+ ]], [imaxabs imaxdiv strtoimax strtoumax])
+
+ AC_REQUIRE([AC_C_RESTRICT])
+])
+
+# Ensure that the PRI* and SCN* macros are defined appropriately.
+AC_DEFUN([gl_INTTYPES_PRI_SCN],
+[
+ PRIPTR_PREFIX=
+ if $GL_GENERATE_STDINT_H; then
+ dnl Using the gnulib <stdint.h>. It defines intptr_t to 'long' or
+ dnl 'long long', depending on _WIN64.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[
+ #ifdef _WIN64
+ LLP64
+ #endif
+ ]])
+ ],
+ [PRIPTR_PREFIX='"l"'],
+ [PRIPTR_PREFIX='"ll"'])
+ else
+ dnl Using the system's <stdint.h>.
+ for glpfx in '' l ll I64; do
+ case $glpfx in
+ '') gltype1='int';;
+ l) gltype1='long int';;
+ ll) gltype1='long long int';;
+ I64) gltype1='__int64';;
+ esac
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#include <stdint.h>
+ extern intptr_t foo;
+ extern $gltype1 foo;]])],
+ [PRIPTR_PREFIX='"'$glpfx'"'])
+ test -n "$PRIPTR_PREFIX" && break
+ done
+ fi
+ AC_SUBST([PRIPTR_PREFIX])
+
+ gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION(
+ [INT32_MAX_LT_INTMAX_MAX],
+ [defined INT32_MAX && defined INTMAX_MAX],
+ [INT32_MAX < INTMAX_MAX],
+ [sizeof (int) < sizeof (long long int)])
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+ gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION(
+ [INT64_MAX_EQ_LONG_MAX],
+ [defined INT64_MAX],
+ [INT64_MAX == LONG_MAX],
+ [sizeof (long long int) == sizeof (long int)])
+ else
+ INT64_MAX_EQ_LONG_MAX=-1
+ fi
+ gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION(
+ [UINT32_MAX_LT_UINTMAX_MAX],
+ [defined UINT32_MAX && defined UINTMAX_MAX],
+ [UINT32_MAX < UINTMAX_MAX],
+ [sizeof (unsigned int) < sizeof (unsigned long long int)])
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+ gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION(
+ [UINT64_MAX_EQ_ULONG_MAX],
+ [defined UINT64_MAX],
+ [UINT64_MAX == ULONG_MAX],
+ [sizeof (unsigned long long int) == sizeof (unsigned long int)])
+ else
+ UINT64_MAX_EQ_ULONG_MAX=-1
+ fi
+])
+
+# Define the symbol $1 to be 1 if the condition is true, 0 otherwise.
+# If $2 is true, the condition is $3; otherwise if long long int is supported
+# approximate the condition with $4; otherwise, assume the condition is false.
+# The condition should work on all C99 platforms; the approximations should be
+# good enough to work on all practical pre-C99 platforms.
+# $2 is evaluated by the C preprocessor, $3 and $4 as compile-time constants.
+AC_DEFUN([gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION],
+[
+ AC_CACHE_CHECK([whether $3],
+ [gl_cv_test_$1],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[/* Work also in C++ mode. */
+ #define __STDC_LIMIT_MACROS 1
+
+ /* Work if build is not clean. */
+ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H
+
+ #include <limits.h>
+ #if HAVE_STDINT_H
+ #include <stdint.h>
+ #endif
+
+ #if $2
+ #define CONDITION ($3)
+ #else
+ #define CONDITION ($4)
+ #endif
+ int test[CONDITION ? 1 : -1];]])],
+ [gl_cv_test_$1=yes],
+ [gl_cv_test_$1=no])])
+ if test $gl_cv_test_$1 = yes; then
+ $1=1;
+ else
+ $1=0;
+ fi
+ AC_SUBST([$1])
+])
+
+# gl_INTTYPES_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
+AC_DEFUN([gl_INTTYPES_MODULE_INDICATOR],
+[
+ dnl Ensure to expand the default settings once only.
+ gl_INTTYPES_H_REQUIRE_DEFAULTS
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+])
+
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd. It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_INTTYPES_H_REQUIRE_DEFAULTS],
+[
+ m4_defun(GL_MODULE_INDICATOR_PREFIX[_INTTYPES_H_MODULE_INDICATOR_DEFAULTS], [
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_IMAXABS])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_IMAXDIV])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOIMAX])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOUMAX])
+ ])
+ m4_require(GL_MODULE_INDICATOR_PREFIX[_INTTYPES_H_MODULE_INDICATOR_DEFAULTS])
+ AC_REQUIRE([gl_INTTYPES_H_DEFAULTS])
+])
+
+AC_DEFUN([gl_INTTYPES_H_DEFAULTS],
+[
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_DECL_IMAXABS=1; AC_SUBST([HAVE_DECL_IMAXABS])
+ HAVE_DECL_IMAXDIV=1; AC_SUBST([HAVE_DECL_IMAXDIV])
+ HAVE_DECL_STRTOIMAX=1; AC_SUBST([HAVE_DECL_STRTOIMAX])
+ HAVE_DECL_STRTOUMAX=1; AC_SUBST([HAVE_DECL_STRTOUMAX])
+ HAVE_IMAXDIV_T=1; AC_SUBST([HAVE_IMAXDIV_T])
+ HAVE_IMAXABS=1; AC_SUBST([HAVE_IMAXABS])
+ HAVE_IMAXDIV=1; AC_SUBST([HAVE_IMAXDIV])
+ REPLACE_IMAXABS=0; AC_SUBST([REPLACE_IMAXABS])
+ REPLACE_IMAXDIV=0; AC_SUBST([REPLACE_IMAXDIV])
+ REPLACE_STRTOIMAX=0; AC_SUBST([REPLACE_STRTOIMAX])
+ REPLACE_STRTOUMAX=0; AC_SUBST([REPLACE_STRTOUMAX])
+ INT32_MAX_LT_INTMAX_MAX=1; AC_SUBST([INT32_MAX_LT_INTMAX_MAX])
+ INT64_MAX_EQ_LONG_MAX='defined _LP64'; AC_SUBST([INT64_MAX_EQ_LONG_MAX])
+ PRIPTR_PREFIX=__PRIPTR_PREFIX; AC_SUBST([PRIPTR_PREFIX])
+ UINT32_MAX_LT_UINTMAX_MAX=1; AC_SUBST([UINT32_MAX_LT_UINTMAX_MAX])
+ UINT64_MAX_EQ_ULONG_MAX='defined _LP64'; AC_SUBST([UINT64_MAX_EQ_ULONG_MAX])
+])
diff --git a/gnulib_m4/inttypes_h.m4 b/gnulib_m4/inttypes_h.m4
new file mode 100644
index 0000000..68c60e9
--- /dev/null
+++ b/gnulib_m4/inttypes_h.m4
@@ -0,0 +1,29 @@
+# inttypes_h.m4 serial 10
+dnl Copyright (C) 1997-2004, 2006, 2008-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+# Define HAVE_INTTYPES_H_WITH_UINTMAX if <inttypes.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([gl_AC_HEADER_INTTYPES_H],
+[
+ AC_CACHE_CHECK([for inttypes.h], [gl_cv_header_inttypes_h],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <sys/types.h>
+#include <inttypes.h>
+ ]],
+ [[uintmax_t i = (uintmax_t) -1; return !i;]])],
+ [gl_cv_header_inttypes_h=yes],
+ [gl_cv_header_inttypes_h=no])])
+ if test $gl_cv_header_inttypes_h = yes; then
+ AC_DEFINE_UNQUOTED([HAVE_INTTYPES_H_WITH_UINTMAX], [1],
+ [Define if <inttypes.h> exists, doesn't clash with <sys/types.h>,
+ and declares uintmax_t. ])
+ fi
+])
diff --git a/gnulib_m4/isnand.m4 b/gnulib_m4/isnand.m4
new file mode 100644
index 0000000..95346f4
--- /dev/null
+++ b/gnulib_m4/isnand.m4
@@ -0,0 +1,96 @@
+# isnand.m4 serial 12
+dnl Copyright (C) 2007-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Check how to get or define isnand().
+
+AC_DEFUN([gl_FUNC_ISNAND],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ ISNAND_LIBM=
+ gl_HAVE_ISNAND_NO_LIBM
+ if test $gl_cv_func_isnand_no_libm = no; then
+ gl_HAVE_ISNAND_IN_LIBM
+ if test $gl_cv_func_isnand_in_libm = yes; then
+ ISNAND_LIBM=-lm
+ fi
+ fi
+ dnl The variable gl_func_isnand set here is used by isnan.m4.
+ if test $gl_cv_func_isnand_no_libm = yes \
+ || test $gl_cv_func_isnand_in_libm = yes; then
+ gl_func_isnand=yes
+ else
+ gl_func_isnand=no
+ HAVE_ISNAND=0
+ fi
+ AC_SUBST([ISNAND_LIBM])
+])
+
+dnl Check how to get or define isnand() without linking with libm.
+
+AC_DEFUN([gl_FUNC_ISNAND_NO_LIBM],
+[
+ gl_HAVE_ISNAND_NO_LIBM
+ gl_func_isnand_no_libm=$gl_cv_func_isnand_no_libm
+ if test $gl_cv_func_isnand_no_libm = yes; then
+ AC_DEFINE([HAVE_ISNAND_IN_LIBC], [1],
+ [Define if the isnan(double) function is available in libc.])
+ fi
+])
+
+dnl Prerequisites of replacement isnand definition. It does not need -lm.
+AC_DEFUN([gl_PREREQ_ISNAND],
+[
+ AC_REQUIRE([gl_DOUBLE_EXPONENT_LOCATION])
+])
+
+dnl Test whether isnand() can be used with libm.
+
+AC_DEFUN([gl_HAVE_ISNAND_IN_LIBM],
+[
+ AC_CACHE_CHECK([whether isnan(double) can be used with libm],
+ [gl_cv_func_isnand_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <math.h>
+ #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+ # undef isnand
+ # define isnand(x) __builtin_isnan ((double)(x))
+ #elif defined isnan
+ # undef isnand
+ # define isnand(x) isnan ((double)(x))
+ #endif
+ double x;]],
+ [[return isnand (x);]])],
+ [gl_cv_func_isnand_in_libm=yes],
+ [gl_cv_func_isnand_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+])
+
+AC_DEFUN([gl_HAVE_ISNAND_NO_LIBM],
+[
+ AC_CACHE_CHECK([whether isnan(double) can be used without linking with libm],
+ [gl_cv_func_isnand_no_libm],
+ [
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <math.h>
+ #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+ # undef isnand
+ # define isnand(x) __builtin_isnan ((double)(x))
+ #else
+ # undef isnand
+ # define isnand(x) isnan ((double)(x))
+ #endif
+ double x;]],
+ [[return isnand (x);]])],
+ [gl_cv_func_isnand_no_libm=yes],
+ [gl_cv_func_isnand_no_libm=no])
+ ])
+])
diff --git a/gnulib_m4/isnanf.m4 b/gnulib_m4/isnanf.m4
new file mode 100644
index 0000000..01f7bbd
--- /dev/null
+++ b/gnulib_m4/isnanf.m4
@@ -0,0 +1,197 @@
+# isnanf.m4 serial 18
+dnl Copyright (C) 2007-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Check how to get or define isnanf().
+
+AC_DEFUN([gl_FUNC_ISNANF],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ ISNANF_LIBM=
+ gl_HAVE_ISNANF_NO_LIBM
+ if test $gl_cv_func_isnanf_no_libm = no; then
+ gl_HAVE_ISNANF_IN_LIBM
+ if test $gl_cv_func_isnanf_in_libm = yes; then
+ ISNANF_LIBM=-lm
+ fi
+ fi
+ dnl The variable gl_func_isnanf set here is used by isnan.m4.
+ if test $gl_cv_func_isnanf_no_libm = yes \
+ || test $gl_cv_func_isnanf_in_libm = yes; then
+ save_LIBS="$LIBS"
+ LIBS="$LIBS $ISNANF_LIBM"
+ gl_ISNANF_WORKS
+ LIBS="$save_LIBS"
+ case "$gl_cv_func_isnanf_works" in
+ *yes) gl_func_isnanf=yes ;;
+ *) gl_func_isnanf=no; ISNANF_LIBM= ;;
+ esac
+ else
+ gl_func_isnanf=no
+ fi
+ if test $gl_func_isnanf != yes; then
+ HAVE_ISNANF=0
+ fi
+ AC_SUBST([ISNANF_LIBM])
+])
+
+dnl Check how to get or define isnanf() without linking with libm.
+
+AC_DEFUN([gl_FUNC_ISNANF_NO_LIBM],
+[
+ gl_HAVE_ISNANF_NO_LIBM
+ if test $gl_cv_func_isnanf_no_libm = yes; then
+ gl_ISNANF_WORKS
+ fi
+ if test $gl_cv_func_isnanf_no_libm = yes \
+ && { case "$gl_cv_func_isnanf_works" in
+ *yes) true;;
+ *) false;;
+ esac
+ }; then
+ gl_func_isnanf_no_libm=yes
+ AC_DEFINE([HAVE_ISNANF_IN_LIBC], [1],
+ [Define if the isnan(float) function is available in libc.])
+ else
+ gl_func_isnanf_no_libm=no
+ fi
+])
+
+dnl Prerequisites of replacement isnanf definition. It does not need -lm.
+AC_DEFUN([gl_PREREQ_ISNANF],
+[
+ gl_FLOAT_EXPONENT_LOCATION
+])
+
+dnl Test whether isnanf() can be used without libm.
+AC_DEFUN([gl_HAVE_ISNANF_NO_LIBM],
+[
+ AC_CACHE_CHECK([whether isnan(float) can be used without linking with libm],
+ [gl_cv_func_isnanf_no_libm],
+ [
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <math.h>
+ #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+ # undef isnanf
+ # define isnanf(x) __builtin_isnan ((float)(x))
+ #elif defined isnan
+ # undef isnanf
+ # define isnanf(x) isnan ((float)(x))
+ #endif
+ float x;]],
+ [[return isnanf (x);]])],
+ [gl_cv_func_isnanf_no_libm=yes],
+ [gl_cv_func_isnanf_no_libm=no])
+ ])
+])
+
+dnl Test whether isnanf() can be used with libm.
+AC_DEFUN([gl_HAVE_ISNANF_IN_LIBM],
+[
+ AC_CACHE_CHECK([whether isnan(float) can be used with libm],
+ [gl_cv_func_isnanf_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <math.h>
+ #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+ # undef isnanf
+ # define isnanf(x) __builtin_isnan ((float)(x))
+ #elif defined isnan
+ # undef isnanf
+ # define isnanf(x) isnan ((float)(x))
+ #endif
+ float x;]],
+ [[return isnanf (x);]])],
+ [gl_cv_func_isnanf_in_libm=yes],
+ [gl_cv_func_isnanf_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+])
+
+dnl Test whether isnanf() rejects Infinity (this fails on Solaris 2.5.1),
+dnl recognizes a NaN (this fails on IRIX 6.5 with cc), and recognizes a NaN
+dnl with in-memory representation 0x7fbfffff (this fails on IRIX 6.5).
+AC_DEFUN([gl_ISNANF_WORKS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_REQUIRE([gl_FLOAT_EXPONENT_LOCATION])
+ AC_CACHE_CHECK([whether isnan(float) works], [gl_cv_func_isnanf_works],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <math.h>
+#if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+# undef isnanf
+# define isnanf(x) __builtin_isnan ((float)(x))
+#elif defined isnan
+# undef isnanf
+# define isnanf(x) isnan ((float)(x))
+#endif
+/* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0. */
+#ifdef __DECC
+static float
+NaN ()
+{
+ static float zero = 0.0f;
+ return zero / zero;
+}
+#else
+# define NaN() (0.0f / 0.0f)
+#endif
+#define NWORDS \
+ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { unsigned int word[NWORDS]; float value; } memory_float;
+int main()
+{
+ int result = 0;
+
+ if (isnanf (1.0f / 0.0f))
+ result |= 1;
+
+ if (!isnanf (NaN ()))
+ result |= 2;
+
+#if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
+ /* The isnanf function should be immune against changes in the sign bit and
+ in the mantissa bits. The xor operation twiddles a bit that can only be
+ a sign bit or a mantissa bit. */
+ if (FLT_EXPBIT0_WORD == 0 && FLT_EXPBIT0_BIT > 0)
+ {
+ memory_float m;
+
+ m.value = NaN ();
+ /* Set the bits below the exponent to 01111...111. */
+ m.word[0] &= -1U << FLT_EXPBIT0_BIT;
+ m.word[0] |= (1U << (FLT_EXPBIT0_BIT - 1)) - 1;
+ if (!isnanf (m.value))
+ result |= 4;
+ }
+#endif
+
+ return result;
+}]])],
+ [gl_cv_func_isnanf_works=yes],
+ [gl_cv_func_isnanf_works=no],
+ [case "$host_os" in
+ irix* | solaris*) gl_cv_func_isnanf_works="guessing no" ;;
+ mingw*) # Guess yes on mingw, no on MSVC.
+ AC_EGREP_CPP([Known], [
+#ifdef __MINGW32__
+ Known
+#endif
+ ],
+ [gl_cv_func_isnanf_works="guessing yes"],
+ [gl_cv_func_isnanf_works="guessing no"])
+ ;;
+ *) gl_cv_func_isnanf_works="guessing yes" ;;
+ esac
+ ])
+ ])
+])
diff --git a/gnulib_m4/isnanl.m4 b/gnulib_m4/isnanl.m4
new file mode 100644
index 0000000..bb39d02
--- /dev/null
+++ b/gnulib_m4/isnanl.m4
@@ -0,0 +1,248 @@
+# isnanl.m4 serial 22
+dnl Copyright (C) 2007-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ISNANL],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ ISNANL_LIBM=
+ gl_HAVE_ISNANL_NO_LIBM
+ if test $gl_cv_func_isnanl_no_libm = no; then
+ gl_HAVE_ISNANL_IN_LIBM
+ if test $gl_cv_func_isnanl_in_libm = yes; then
+ ISNANL_LIBM=-lm
+ fi
+ fi
+ dnl The variable gl_func_isnanl set here is used by isnan.m4.
+ if test $gl_cv_func_isnanl_no_libm = yes \
+ || test $gl_cv_func_isnanl_in_libm = yes; then
+ save_LIBS="$LIBS"
+ LIBS="$LIBS $ISNANL_LIBM"
+ gl_FUNC_ISNANL_WORKS
+ LIBS="$save_LIBS"
+ case "$gl_cv_func_isnanl_works" in
+ *yes) gl_func_isnanl=yes ;;
+ *) gl_func_isnanl=no; ISNANL_LIBM= ;;
+ esac
+ else
+ gl_func_isnanl=no
+ fi
+ if test $gl_func_isnanl != yes; then
+ HAVE_ISNANL=0
+ fi
+ AC_SUBST([ISNANL_LIBM])
+])
+
+AC_DEFUN([gl_FUNC_ISNANL_NO_LIBM],
+[
+ gl_HAVE_ISNANL_NO_LIBM
+ gl_func_isnanl_no_libm=$gl_cv_func_isnanl_no_libm
+ if test $gl_func_isnanl_no_libm = yes; then
+ gl_FUNC_ISNANL_WORKS
+ case "$gl_cv_func_isnanl_works" in
+ *yes) ;;
+ *) gl_func_isnanl_no_libm=no ;;
+ esac
+ fi
+ if test $gl_func_isnanl_no_libm = yes; then
+ AC_DEFINE([HAVE_ISNANL_IN_LIBC], [1],
+ [Define if the isnan(long double) function is available in libc.])
+ fi
+])
+
+dnl Prerequisites of replacement isnanl definition. It does not need -lm.
+AC_DEFUN([gl_PREREQ_ISNANL],
+[
+ gl_LONG_DOUBLE_EXPONENT_LOCATION
+ AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
+])
+
+dnl Test whether isnanl() can be used without libm.
+AC_DEFUN([gl_HAVE_ISNANL_NO_LIBM],
+[
+ AC_CACHE_CHECK([whether isnan(long double) can be used without linking with libm],
+ [gl_cv_func_isnanl_no_libm],
+ [
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <math.h>
+ #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+ # undef isnanl
+ # define isnanl(x) __builtin_isnan ((long double)(x))
+ #elif defined isnan
+ # undef isnanl
+ # define isnanl(x) isnan ((long double)(x))
+ #endif
+ long double x;]],
+ [[return isnanl (x);]])],
+ [gl_cv_func_isnanl_no_libm=yes],
+ [gl_cv_func_isnanl_no_libm=no])
+ ])
+])
+
+dnl Test whether isnanl() can be used with libm.
+AC_DEFUN([gl_HAVE_ISNANL_IN_LIBM],
+[
+ AC_CACHE_CHECK([whether isnan(long double) can be used with libm],
+ [gl_cv_func_isnanl_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <math.h>
+ #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+ # undef isnanl
+ # define isnanl(x) __builtin_isnan ((long double)(x))
+ #elif defined isnan
+ # undef isnanl
+ # define isnanl(x) isnan ((long double)(x))
+ #endif
+ long double x;]],
+ [[return isnanl (x);]])],
+ [gl_cv_func_isnanl_in_libm=yes],
+ [gl_cv_func_isnanl_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+])
+
+dnl Test whether isnanl() recognizes all canonical numbers which are neither
+dnl finite nor infinite.
+AC_DEFUN([gl_FUNC_ISNANL_WORKS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gl_BIGENDIAN])
+ AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether isnanl works], [gl_cv_func_isnanl_works],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+#if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+# undef isnanl
+# define isnanl(x) __builtin_isnan ((long double)(x))
+#elif defined isnan
+# undef isnanl
+# define isnanl(x) isnan ((long double)(x))
+#endif
+#define NWORDS \
+ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { unsigned int word[NWORDS]; long double value; }
+ memory_long_double;
+/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the
+ runtime type conversion. */
+#ifdef __sgi
+static long double NaNl ()
+{
+ double zero = 0.0;
+ return zero / zero;
+}
+#else
+# define NaNl() (0.0L / 0.0L)
+#endif
+int main ()
+{
+ int result = 0;
+
+ if (!isnanl (NaNl ()))
+ result |= 1;
+
+ {
+ memory_long_double m;
+ unsigned int i;
+
+ /* The isnanl function should be immune against changes in the sign bit and
+ in the mantissa bits. The xor operation twiddles a bit that can only be
+ a sign bit or a mantissa bit (since the exponent never extends to
+ bit 31). */
+ m.value = NaNl ();
+ m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+ for (i = 0; i < NWORDS; i++)
+ m.word[i] |= 1;
+ if (!isnanl (m.value))
+ result |= 1;
+ }
+
+#if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+/* Representation of an 80-bit 'long double' as an initializer for a sequence
+ of 'unsigned int' words. */
+# ifdef WORDS_BIGENDIAN
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+ ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \
+ (unsigned int) (mantlo) << 16 \
+ }
+# else
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { mantlo, manthi, exponent }
+# endif
+ { /* Quiet NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ if (!isnanl (x.value))
+ result |= 2;
+ }
+ {
+ /* Signalling NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ if (!isnanl (x.value))
+ result |= 2;
+ }
+ /* isnanl should return something even for noncanonical values. */
+ { /* Pseudo-NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ if (isnanl (x.value) && !isnanl (x.value))
+ result |= 4;
+ }
+ { /* Pseudo-Infinity. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ if (isnanl (x.value) && !isnanl (x.value))
+ result |= 8;
+ }
+ { /* Pseudo-Zero. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ if (isnanl (x.value) && !isnanl (x.value))
+ result |= 16;
+ }
+ { /* Unnormalized number. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ if (isnanl (x.value) && !isnanl (x.value))
+ result |= 32;
+ }
+ { /* Pseudo-Denormal. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ if (isnanl (x.value) && !isnanl (x.value))
+ result |= 64;
+ }
+#endif
+
+ return result;
+}]])],
+ [gl_cv_func_isnanl_works=yes],
+ [gl_cv_func_isnanl_works=no],
+ [case "$host_os" in
+ mingw*) # Guess yes on mingw, no on MSVC.
+ AC_EGREP_CPP([Known], [
+#ifdef __MINGW32__
+ Known
+#endif
+ ],
+ [gl_cv_func_isnanl_works="guessing yes"],
+ [gl_cv_func_isnanl_works="guessing no"])
+ ;;
+ *) gl_cv_func_isnanl_works="guessing yes" ;;
+ esac
+ ])
+ ])
+])
diff --git a/gnulib_m4/ldexpl.m4 b/gnulib_m4/ldexpl.m4
new file mode 100644
index 0000000..f2785d6
--- /dev/null
+++ b/gnulib_m4/ldexpl.m4
@@ -0,0 +1,135 @@
+# ldexpl.m4 serial 17
+dnl Copyright (C) 2007-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_LDEXPL],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
+ AC_REQUIRE([gl_FUNC_ISNANL]) dnl for ISNANL_LIBM
+
+ dnl Persuade glibc <math.h> to declare ldexpl().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ dnl Check whether it's declared.
+ dnl Mac OS X 10.3 has ldexpl() in libc but doesn't declare it in <math.h>.
+ AC_CHECK_DECL([ldexpl], , [HAVE_DECL_LDEXPL=0], [[#include <math.h>]])
+
+ LDEXPL_LIBM=
+ if test $HAVE_DECL_LDEXPL = 1; then
+ gl_CHECK_LDEXPL_NO_LIBM
+ if test $gl_cv_func_ldexpl_no_libm = no; then
+ AC_CACHE_CHECK([whether ldexpl() can be used with libm],
+ [gl_cv_func_ldexpl_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <math.h>
+ long double x;]],
+ [[return ldexpl (x, -1) > 0;]])],
+ [gl_cv_func_ldexpl_in_libm=yes],
+ [gl_cv_func_ldexpl_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+ if test $gl_cv_func_ldexpl_in_libm = yes; then
+ LDEXPL_LIBM=-lm
+ fi
+ fi
+ if test $gl_cv_func_ldexpl_no_libm = yes \
+ || test $gl_cv_func_ldexpl_in_libm = yes; then
+ save_LIBS="$LIBS"
+ LIBS="$LIBS $LDEXPL_LIBM"
+ gl_FUNC_LDEXPL_WORKS
+ LIBS="$save_LIBS"
+ case "$gl_cv_func_ldexpl_works" in
+ *yes) gl_func_ldexpl=yes ;;
+ *) gl_func_ldexpl=no; REPLACE_LDEXPL=1 ;;
+ esac
+ else
+ gl_func_ldexpl=no
+ fi
+ if test $gl_func_ldexpl = yes; then
+ AC_DEFINE([HAVE_LDEXPL], [1],
+ [Define if the ldexpl() function is available.])
+ fi
+ fi
+ if test $HAVE_DECL_LDEXPL = 0 || test $gl_func_ldexpl = no; then
+ dnl Find libraries needed to link lib/ldexpl.c.
+ if test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then
+ AC_REQUIRE([gl_FUNC_LDEXP])
+ LDEXPL_LIBM="$LDEXP_LIBM"
+ else
+ LDEXPL_LIBM="$ISNANL_LIBM"
+ fi
+ fi
+ AC_SUBST([LDEXPL_LIBM])
+])
+
+dnl Test whether ldexpl() can be used without linking with libm.
+dnl Set gl_cv_func_ldexpl_no_libm to 'yes' or 'no' accordingly.
+AC_DEFUN([gl_CHECK_LDEXPL_NO_LIBM],
+[
+ AC_CACHE_CHECK([whether ldexpl() can be used without linking with libm],
+ [gl_cv_func_ldexpl_no_libm],
+ [
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <math.h>
+ long double x;]],
+ [[return ldexpl (x, -1) > 0;]])],
+ [gl_cv_func_ldexpl_no_libm=yes],
+ [gl_cv_func_ldexpl_no_libm=no])
+ ])
+])
+
+dnl Test whether ldexpl() works on finite numbers (this fails on AIX 5.1
+dnl and Mac OS X 10.4/PowerPC).
+AC_DEFUN([gl_FUNC_LDEXPL_WORKS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether ldexpl works], [gl_cv_func_ldexpl_works],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <math.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+long double ldexpl (long double, int);
+int main()
+{
+ int result = 0;
+ {
+ volatile long double x = 1.0;
+ volatile long double y = ldexpl (x, -1);
+ if (y != 0.5L)
+ result |= 1;
+ }
+ {
+ volatile long double x = 1.73205L;
+ volatile long double y = ldexpl (x, 0);
+ if (y != x)
+ result |= 2;
+ }
+ return result;
+}]])],
+ [gl_cv_func_ldexpl_works=yes],
+ [gl_cv_func_ldexpl_works=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ aix | aix[3-6]*) gl_cv_func_ldexpl_works="guessing no" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_ldexpl_works="guessing yes" ;;
+ *) gl_cv_func_ldexpl_works="guessing yes" ;;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
diff --git a/gnulib_m4/libunistring-base.m4 b/gnulib_m4/libunistring-base.m4
new file mode 100644
index 0000000..fc6d023
--- /dev/null
+++ b/gnulib_m4/libunistring-base.m4
@@ -0,0 +1,145 @@
+# libunistring-base.m4 serial 7
+dnl Copyright (C) 2010-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paolo Bonzini and Bruno Haible.
+
+dnl gl_LIBUNISTRING_MODULE([VERSION], [Module])
+dnl Declares that the source files of Module should be compiled, unless we
+dnl are linking with libunistring and its version is >= the given VERSION.
+dnl Defines an automake conditional LIBUNISTRING_COMPILE_$MODULE that is
+dnl true if the source files of Module should be compiled.
+dnl This macro is to be used for public libunistring API, not for
+dnl undocumented API.
+dnl
+dnl You have to bump the VERSION argument to the next projected version
+dnl number each time you make a change that affects the behaviour of the
+dnl functions defined in Module (even if the sources of Module itself do not
+dnl change).
+
+AC_DEFUN([gl_LIBUNISTRING_MODULE],
+[
+ AC_REQUIRE([gl_LIBUNISTRING_LIB_PREPARE])
+ dnl Use the variables HAVE_LIBUNISTRING, LIBUNISTRING_VERSION from
+ dnl gl_LIBUNISTRING_CORE if that macro has been run.
+ gl_CONDITIONAL(AS_TR_CPP([LIBUNISTRING_COMPILE_$2]),
+ [gl_LIBUNISTRING_VERSION_CMP([$1])])
+])
+
+dnl gl_LIBUNISTRING_LIBHEADER([VERSION], [HeaderFile])
+dnl Declares that HeaderFile should be created, unless we are linking
+dnl with libunistring and its version is >= the given VERSION.
+dnl HeaderFile should be relative to the lib directory and end in '.h'.
+dnl Prepares for substituting LIBUNISTRING_HEADERFILE (to HeaderFile or empty).
+dnl
+dnl When we are linking with the already installed libunistring and its version
+dnl is < VERSION, we create HeaderFile here, because we may compile functions
+dnl (via gl_LIBUNISTRING_MODULE above) that are not contained in the installed
+dnl version.
+dnl When we are linking with the already installed libunistring and its version
+dnl is > VERSION, we don't create HeaderFile here: it could cause compilation
+dnl errors in other libunistring header files if some types are missing.
+dnl
+dnl You have to bump the VERSION argument to the next projected version
+dnl number each time you make a non-comment change to the HeaderFile.
+
+AC_DEFUN([gl_LIBUNISTRING_LIBHEADER],
+[
+ AC_REQUIRE([gl_LIBUNISTRING_LIB_PREPARE])
+ dnl Use the variables HAVE_LIBUNISTRING, LIBUNISTRING_VERSION from
+ dnl gl_LIBUNISTRING_CORE if that macro has been run.
+ if gl_LIBUNISTRING_VERSION_CMP([$1]); then
+ dnl It is OK to use a .h file in lib/ from within tests/, but not vice
+ dnl versa.
+ if test -z "$LIBUNISTRING_[]AS_TR_CPP([$2])"; then
+ LIBUNISTRING_[]AS_TR_CPP([$2])="${gl_source_base_prefix}$2"
+ fi
+ else
+ LIBUNISTRING_[]AS_TR_CPP([$2])=
+ fi
+ AC_SUBST([LIBUNISTRING_]AS_TR_CPP([$2]))
+])
+
+dnl Miscellaneous preparations/initializations.
+
+AC_DEFUN([gl_LIBUNISTRING_LIB_PREPARE],
+[
+ dnl Ensure that HAVE_LIBUNISTRING is fully determined at this point.
+ m4_ifdef([gl_LIBUNISTRING], [AC_REQUIRE([gl_LIBUNISTRING])])
+
+ AC_REQUIRE([AC_PROG_AWK])
+
+dnl Sed expressions to extract the parts of a version number.
+changequote(,)
+gl_libunistring_sed_extract_major='/^[0-9]/{s/^\([0-9]*\).*/\1/p;q;}
+i\
+0
+q
+'
+gl_libunistring_sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{s/^[0-9]*[.]\([0-9]*\).*/\1/p;q;}
+i\
+0
+q
+'
+gl_libunistring_sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{s/^[0-9]*[.][0-9]*[.]\([0-9]*\).*/\1/p;q;}
+i\
+0
+q
+'
+changequote([,])
+
+ if test "$HAVE_LIBUNISTRING" = yes; then
+ LIBUNISTRING_VERSION_MAJOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_major"`
+ LIBUNISTRING_VERSION_MINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_minor"`
+ LIBUNISTRING_VERSION_SUBMINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_subminor"`
+ fi
+])
+
+dnl gl_LIBUNISTRING_VERSION_CMP([VERSION])
+dnl Expands to a shell statement that evaluates to true if LIBUNISTRING_VERSION
+dnl is less than the VERSION argument.
+AC_DEFUN([gl_LIBUNISTRING_VERSION_CMP],
+[ { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+ dnl AS_LITERAL_IF exists and works fine since autoconf-2.59 at least.
+ AS_LITERAL_IF([$1],
+ [dnl This is the optimized variant, that assumes the argument is a literal:
+ m4_pushdef([requested_version_major],
+ [gl_LIBUNISTRING_ARG_OR_ZERO(m4_bpatsubst([$1], [^\([0-9]*\).*], [\1]), [])])
+ m4_pushdef([requested_version_minor],
+ [gl_LIBUNISTRING_ARG_OR_ZERO(m4_bpatsubst([$1], [^[0-9]*[.]\([0-9]*\).*], [\1]), [$1])])
+ m4_pushdef([requested_version_subminor],
+ [gl_LIBUNISTRING_ARG_OR_ZERO(m4_bpatsubst([$1], [^[0-9]*[.][0-9]*[.]\([0-9]*\).*], [\1]), [$1])])
+ test $LIBUNISTRING_VERSION_MAJOR -lt requested_version_major \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq requested_version_major \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt requested_version_minor \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq requested_version_minor \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt requested_version_subminor
+ }
+ }
+ }
+ m4_popdef([requested_version_subminor])
+ m4_popdef([requested_version_minor])
+ m4_popdef([requested_version_major])
+ ],
+ [dnl This is the unoptimized variant:
+ requested_version_major=`echo '$1' | sed -n -e "$gl_libunistring_sed_extract_major"`
+ requested_version_minor=`echo '$1' | sed -n -e "$gl_libunistring_sed_extract_minor"`
+ requested_version_subminor=`echo '$1' | sed -n -e "$gl_libunistring_sed_extract_subminor"`
+ test $LIBUNISTRING_VERSION_MAJOR -lt $requested_version_major \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq $requested_version_major \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt $requested_version_minor \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq $requested_version_minor \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt $requested_version_subminor
+ }
+ }
+ }
+ ])
+ }
+ }])
+
+dnl gl_LIBUNISTRING_ARG_OR_ZERO([ARG], [ORIG]) expands to ARG if it is not the
+dnl same as ORIG, otherwise to 0.
+m4_define([gl_LIBUNISTRING_ARG_OR_ZERO], [m4_if([$1], [$2], [0], [$1])])
diff --git a/gnulib_m4/limits-h.m4 b/gnulib_m4/limits-h.m4
new file mode 100644
index 0000000..5088fa1
--- /dev/null
+++ b/gnulib_m4/limits-h.m4
@@ -0,0 +1,41 @@
+dnl Check whether limits.h has needed features.
+
+dnl Copyright 2016-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+AC_DEFUN_ONCE([gl_LIMITS_H],
+[
+ gl_CHECK_NEXT_HEADERS([limits.h])
+
+ AC_CACHE_CHECK([whether limits.h has WORD_BIT, BOOL_WIDTH etc.],
+ [gl_cv_header_limits_width],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+ #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
+ #endif
+ #include <limits.h>
+ long long llm = LLONG_MAX;
+ int wb = WORD_BIT;
+ int ullw = ULLONG_WIDTH;
+ int bw = BOOL_WIDTH;
+ ]])],
+ [gl_cv_header_limits_width=yes],
+ [gl_cv_header_limits_width=no])])
+ if test "$gl_cv_header_limits_width" = yes; then
+ GL_GENERATE_LIMITS_H=false
+ else
+ GL_GENERATE_LIMITS_H=true
+ fi
+])
+
+dnl Unconditionally enables the replacement of <limits.h>.
+AC_DEFUN([gl_REPLACE_LIMITS_H],
+[
+ AC_REQUIRE([gl_LIMITS_H])
+ GL_GENERATE_LIMITS_H=true
+])
diff --git a/gnulib_m4/math_h.m4 b/gnulib_m4/math_h.m4
new file mode 100644
index 0000000..d2e90ff
--- /dev/null
+++ b/gnulib_m4/math_h.m4
@@ -0,0 +1,391 @@
+# math_h.m4 serial 125
+dnl Copyright (C) 2007-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN_ONCE([gl_MATH_H],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ gl_CHECK_NEXT_HEADERS([math.h])
+
+ AC_CACHE_CHECK([whether NAN macro works], [gl_cv_header_math_nan_works],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <math.h>]],
+ [[/* Solaris 10 has a broken definition of NAN. Other platforms
+ fail to provide NAN, or provide it only in C99 mode; this
+ test only needs to fail when NAN is provided but wrong. */
+ float f = 1.0f;
+#ifdef NAN
+ f = NAN;
+#endif
+ return f == 0;]])],
+ [gl_cv_header_math_nan_works=yes],
+ [gl_cv_header_math_nan_works=no])])
+ if test $gl_cv_header_math_nan_works = no; then
+ REPLACE_NAN=1
+ fi
+ AC_CACHE_CHECK([whether HUGE_VAL works], [gl_cv_header_math_huge_val_works],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <math.h>]],
+ [[/* Solaris 10 has a broken definition of HUGE_VAL. */
+ double d = HUGE_VAL;
+ return d == 0;]])],
+ [gl_cv_header_math_huge_val_works=yes],
+ [gl_cv_header_math_huge_val_works=no])])
+ if test $gl_cv_header_math_huge_val_works = no; then
+ REPLACE_HUGE_VAL=1
+ fi
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <math.h>]],
+ [acosf acosl asinf asinl atanf atanl
+ cbrt cbrtf cbrtl ceilf ceill copysign copysignf copysignl cosf cosl coshf
+ expf expl exp2 exp2f exp2l expm1 expm1f expm1l
+ fabsf fabsl floorf floorl fma fmaf fmal
+ fmod fmodf fmodl frexpf frexpl hypotf hypotl
+ ilogb ilogbf ilogbl
+ ldexpf ldexpl
+ log logf logl log10 log10f log10l log1p log1pf log1pl log2 log2f log2l
+ logb logbf logbl
+ modf modff modfl powf
+ remainder remainderf remainderl
+ rint rintf rintl round roundf roundl sinf sinl sinhf sqrtf sqrtl
+ tanf tanl tanhf trunc truncf truncl])
+])
+
+# gl_MATH_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
+AC_DEFUN([gl_MATH_MODULE_INDICATOR],
+[
+ dnl Ensure to expand the default settings once only.
+ gl_MATH_H_REQUIRE_DEFAULTS
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd. It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_MATH_H_REQUIRE_DEFAULTS],
+[
+ m4_defun(GL_MODULE_INDICATOR_PREFIX[_MATH_H_MODULE_INDICATOR_DEFAULTS], [
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ACOSF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ACOSL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ASINF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ASINL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ATANF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ATANL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ATAN2F])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CBRT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CBRTF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CBRTL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CEIL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CEILF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CEILL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_COPYSIGN])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_COPYSIGNF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_COPYSIGNL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_COSF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_COSL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_COSHF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXPF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXPL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXP2])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXP2F])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXP2L])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXPM1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXPM1F])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXPM1L])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FABSF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FABSL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FLOOR])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FLOORF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FLOORL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FMA])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FMAF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FMAL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FMOD])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FMODF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FMODL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FREXPF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FREXP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FREXPL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_HYPOT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_HYPOTF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_HYPOTL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ILOGB])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ILOGBF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ILOGBL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISFINITE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISINF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISNAN])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISNANF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISNAND])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISNANL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LDEXPF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LDEXPL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOGF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOGL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG10])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG10F])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG10L])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG1P])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG1PF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG1PL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG2])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG2F])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG2L])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOGB])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOGBF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOGBL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MODF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MODFF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MODFL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POWF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REMAINDER])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REMAINDERF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REMAINDERL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RINT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RINTF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RINTL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ROUND])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ROUNDF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ROUNDL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SIGNBIT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SINF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SINL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SINHF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SQRTF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SQRTL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TANF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TANL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TANHF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TRUNC])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TRUNCF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TRUNCL])
+ dnl Support Microsoft deprecated alias function names by default.
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_J0], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_J1], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_JN], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_Y0], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_Y1], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_YN], [1])
+ ])
+ m4_require(GL_MODULE_INDICATOR_PREFIX[_MATH_H_MODULE_INDICATOR_DEFAULTS])
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+])
+
+AC_DEFUN([gl_MATH_H_DEFAULTS],
+[
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_ACOSF=1; AC_SUBST([HAVE_ACOSF])
+ HAVE_ACOSL=1; AC_SUBST([HAVE_ACOSL])
+ HAVE_ASINF=1; AC_SUBST([HAVE_ASINF])
+ HAVE_ASINL=1; AC_SUBST([HAVE_ASINL])
+ HAVE_ATANF=1; AC_SUBST([HAVE_ATANF])
+ HAVE_ATANL=1; AC_SUBST([HAVE_ATANL])
+ HAVE_ATAN2F=1; AC_SUBST([HAVE_ATAN2F])
+ HAVE_CBRT=1; AC_SUBST([HAVE_CBRT])
+ HAVE_CBRTF=1; AC_SUBST([HAVE_CBRTF])
+ HAVE_CBRTL=1; AC_SUBST([HAVE_CBRTL])
+ HAVE_COPYSIGN=1; AC_SUBST([HAVE_COPYSIGN])
+ HAVE_COPYSIGNL=1; AC_SUBST([HAVE_COPYSIGNL])
+ HAVE_COSF=1; AC_SUBST([HAVE_COSF])
+ HAVE_COSL=1; AC_SUBST([HAVE_COSL])
+ HAVE_COSHF=1; AC_SUBST([HAVE_COSHF])
+ HAVE_EXPF=1; AC_SUBST([HAVE_EXPF])
+ HAVE_EXPL=1; AC_SUBST([HAVE_EXPL])
+ HAVE_EXPM1=1; AC_SUBST([HAVE_EXPM1])
+ HAVE_EXPM1F=1; AC_SUBST([HAVE_EXPM1F])
+ HAVE_FABSF=1; AC_SUBST([HAVE_FABSF])
+ HAVE_FABSL=1; AC_SUBST([HAVE_FABSL])
+ HAVE_FMA=1; AC_SUBST([HAVE_FMA])
+ HAVE_FMAF=1; AC_SUBST([HAVE_FMAF])
+ HAVE_FMAL=1; AC_SUBST([HAVE_FMAL])
+ HAVE_FMODF=1; AC_SUBST([HAVE_FMODF])
+ HAVE_FMODL=1; AC_SUBST([HAVE_FMODL])
+ HAVE_FREXPF=1; AC_SUBST([HAVE_FREXPF])
+ HAVE_HYPOTF=1; AC_SUBST([HAVE_HYPOTF])
+ HAVE_HYPOTL=1; AC_SUBST([HAVE_HYPOTL])
+ HAVE_ILOGB=1; AC_SUBST([HAVE_ILOGB])
+ HAVE_ILOGBF=1; AC_SUBST([HAVE_ILOGBF])
+ HAVE_ILOGBL=1; AC_SUBST([HAVE_ILOGBL])
+ HAVE_ISNANF=1; AC_SUBST([HAVE_ISNANF])
+ HAVE_ISNAND=1; AC_SUBST([HAVE_ISNAND])
+ HAVE_ISNANL=1; AC_SUBST([HAVE_ISNANL])
+ HAVE_LDEXPF=1; AC_SUBST([HAVE_LDEXPF])
+ HAVE_LOGF=1; AC_SUBST([HAVE_LOGF])
+ HAVE_LOGL=1; AC_SUBST([HAVE_LOGL])
+ HAVE_LOG10F=1; AC_SUBST([HAVE_LOG10F])
+ HAVE_LOG10L=1; AC_SUBST([HAVE_LOG10L])
+ HAVE_LOG1P=1; AC_SUBST([HAVE_LOG1P])
+ HAVE_LOG1PF=1; AC_SUBST([HAVE_LOG1PF])
+ HAVE_LOG1PL=1; AC_SUBST([HAVE_LOG1PL])
+ HAVE_LOGBF=1; AC_SUBST([HAVE_LOGBF])
+ HAVE_LOGBL=1; AC_SUBST([HAVE_LOGBL])
+ HAVE_MODFF=1; AC_SUBST([HAVE_MODFF])
+ HAVE_MODFL=1; AC_SUBST([HAVE_MODFL])
+ HAVE_POWF=1; AC_SUBST([HAVE_POWF])
+ HAVE_REMAINDER=1; AC_SUBST([HAVE_REMAINDER])
+ HAVE_REMAINDERF=1; AC_SUBST([HAVE_REMAINDERF])
+ HAVE_RINT=1; AC_SUBST([HAVE_RINT])
+ HAVE_RINTL=1; AC_SUBST([HAVE_RINTL])
+ HAVE_SINF=1; AC_SUBST([HAVE_SINF])
+ HAVE_SINL=1; AC_SUBST([HAVE_SINL])
+ HAVE_SINHF=1; AC_SUBST([HAVE_SINHF])
+ HAVE_SQRTF=1; AC_SUBST([HAVE_SQRTF])
+ HAVE_SQRTL=1; AC_SUBST([HAVE_SQRTL])
+ HAVE_TANF=1; AC_SUBST([HAVE_TANF])
+ HAVE_TANL=1; AC_SUBST([HAVE_TANL])
+ HAVE_TANHF=1; AC_SUBST([HAVE_TANHF])
+ HAVE_DECL_ACOSL=1; AC_SUBST([HAVE_DECL_ACOSL])
+ HAVE_DECL_ASINL=1; AC_SUBST([HAVE_DECL_ASINL])
+ HAVE_DECL_ATANL=1; AC_SUBST([HAVE_DECL_ATANL])
+ HAVE_DECL_CBRTF=1; AC_SUBST([HAVE_DECL_CBRTF])
+ HAVE_DECL_CBRTL=1; AC_SUBST([HAVE_DECL_CBRTL])
+ HAVE_DECL_CEILF=1; AC_SUBST([HAVE_DECL_CEILF])
+ HAVE_DECL_CEILL=1; AC_SUBST([HAVE_DECL_CEILL])
+ HAVE_DECL_COPYSIGNF=1; AC_SUBST([HAVE_DECL_COPYSIGNF])
+ HAVE_DECL_COSL=1; AC_SUBST([HAVE_DECL_COSL])
+ HAVE_DECL_EXPL=1; AC_SUBST([HAVE_DECL_EXPL])
+ HAVE_DECL_EXP2=1; AC_SUBST([HAVE_DECL_EXP2])
+ HAVE_DECL_EXP2F=1; AC_SUBST([HAVE_DECL_EXP2F])
+ HAVE_DECL_EXP2L=1; AC_SUBST([HAVE_DECL_EXP2L])
+ HAVE_DECL_EXPM1L=1; AC_SUBST([HAVE_DECL_EXPM1L])
+ HAVE_DECL_FLOORF=1; AC_SUBST([HAVE_DECL_FLOORF])
+ HAVE_DECL_FLOORL=1; AC_SUBST([HAVE_DECL_FLOORL])
+ HAVE_DECL_FREXPL=1; AC_SUBST([HAVE_DECL_FREXPL])
+ HAVE_DECL_LDEXPL=1; AC_SUBST([HAVE_DECL_LDEXPL])
+ HAVE_DECL_LOGL=1; AC_SUBST([HAVE_DECL_LOGL])
+ HAVE_DECL_LOG10L=1; AC_SUBST([HAVE_DECL_LOG10L])
+ HAVE_DECL_LOG2=1; AC_SUBST([HAVE_DECL_LOG2])
+ HAVE_DECL_LOG2F=1; AC_SUBST([HAVE_DECL_LOG2F])
+ HAVE_DECL_LOG2L=1; AC_SUBST([HAVE_DECL_LOG2L])
+ HAVE_DECL_LOGB=1; AC_SUBST([HAVE_DECL_LOGB])
+ HAVE_DECL_REMAINDER=1; AC_SUBST([HAVE_DECL_REMAINDER])
+ HAVE_DECL_REMAINDERL=1; AC_SUBST([HAVE_DECL_REMAINDERL])
+ HAVE_DECL_RINTF=1; AC_SUBST([HAVE_DECL_RINTF])
+ HAVE_DECL_ROUND=1; AC_SUBST([HAVE_DECL_ROUND])
+ HAVE_DECL_ROUNDF=1; AC_SUBST([HAVE_DECL_ROUNDF])
+ HAVE_DECL_ROUNDL=1; AC_SUBST([HAVE_DECL_ROUNDL])
+ HAVE_DECL_SINL=1; AC_SUBST([HAVE_DECL_SINL])
+ HAVE_DECL_SQRTL=1; AC_SUBST([HAVE_DECL_SQRTL])
+ HAVE_DECL_TANL=1; AC_SUBST([HAVE_DECL_TANL])
+ HAVE_DECL_TRUNC=1; AC_SUBST([HAVE_DECL_TRUNC])
+ HAVE_DECL_TRUNCF=1; AC_SUBST([HAVE_DECL_TRUNCF])
+ HAVE_DECL_TRUNCL=1; AC_SUBST([HAVE_DECL_TRUNCL])
+ REPLACE_ACOSF=0; AC_SUBST([REPLACE_ACOSF])
+ REPLACE_ASINF=0; AC_SUBST([REPLACE_ASINF])
+ REPLACE_ATANF=0; AC_SUBST([REPLACE_ATANF])
+ REPLACE_ATAN2F=0; AC_SUBST([REPLACE_ATAN2F])
+ REPLACE_CBRTF=0; AC_SUBST([REPLACE_CBRTF])
+ REPLACE_CBRTL=0; AC_SUBST([REPLACE_CBRTL])
+ REPLACE_CEIL=0; AC_SUBST([REPLACE_CEIL])
+ REPLACE_CEILF=0; AC_SUBST([REPLACE_CEILF])
+ REPLACE_CEILL=0; AC_SUBST([REPLACE_CEILL])
+ REPLACE_COSF=0; AC_SUBST([REPLACE_COSF])
+ REPLACE_COSHF=0; AC_SUBST([REPLACE_COSHF])
+ REPLACE_EXPF=0; AC_SUBST([REPLACE_EXPF])
+ REPLACE_EXPL=0; AC_SUBST([REPLACE_EXPL])
+ REPLACE_EXPM1=0; AC_SUBST([REPLACE_EXPM1])
+ REPLACE_EXPM1F=0; AC_SUBST([REPLACE_EXPM1F])
+ REPLACE_EXPM1L=0; AC_SUBST([REPLACE_EXPM1L])
+ REPLACE_EXP2=0; AC_SUBST([REPLACE_EXP2])
+ REPLACE_EXP2L=0; AC_SUBST([REPLACE_EXP2L])
+ REPLACE_FABSL=0; AC_SUBST([REPLACE_FABSL])
+ REPLACE_FLOOR=0; AC_SUBST([REPLACE_FLOOR])
+ REPLACE_FLOORF=0; AC_SUBST([REPLACE_FLOORF])
+ REPLACE_FLOORL=0; AC_SUBST([REPLACE_FLOORL])
+ REPLACE_FMA=0; AC_SUBST([REPLACE_FMA])
+ REPLACE_FMAF=0; AC_SUBST([REPLACE_FMAF])
+ REPLACE_FMAL=0; AC_SUBST([REPLACE_FMAL])
+ REPLACE_FMOD=0; AC_SUBST([REPLACE_FMOD])
+ REPLACE_FMODF=0; AC_SUBST([REPLACE_FMODF])
+ REPLACE_FMODL=0; AC_SUBST([REPLACE_FMODL])
+ REPLACE_FREXPF=0; AC_SUBST([REPLACE_FREXPF])
+ REPLACE_FREXP=0; AC_SUBST([REPLACE_FREXP])
+ REPLACE_FREXPL=0; AC_SUBST([REPLACE_FREXPL])
+ REPLACE_HUGE_VAL=0; AC_SUBST([REPLACE_HUGE_VAL])
+ REPLACE_HYPOT=0; AC_SUBST([REPLACE_HYPOT])
+ REPLACE_HYPOTF=0; AC_SUBST([REPLACE_HYPOTF])
+ REPLACE_HYPOTL=0; AC_SUBST([REPLACE_HYPOTL])
+ REPLACE_ILOGB=0; AC_SUBST([REPLACE_ILOGB])
+ REPLACE_ILOGBF=0; AC_SUBST([REPLACE_ILOGBF])
+ REPLACE_ILOGBL=0; AC_SUBST([REPLACE_ILOGBL])
+ REPLACE_ISFINITE=0; AC_SUBST([REPLACE_ISFINITE])
+ REPLACE_ISINF=0; AC_SUBST([REPLACE_ISINF])
+ REPLACE_ISNAN=0; AC_SUBST([REPLACE_ISNAN])
+ REPLACE_LDEXPL=0; AC_SUBST([REPLACE_LDEXPL])
+ REPLACE_LOG=0; AC_SUBST([REPLACE_LOG])
+ REPLACE_LOGF=0; AC_SUBST([REPLACE_LOGF])
+ REPLACE_LOGL=0; AC_SUBST([REPLACE_LOGL])
+ REPLACE_LOG10=0; AC_SUBST([REPLACE_LOG10])
+ REPLACE_LOG10F=0; AC_SUBST([REPLACE_LOG10F])
+ REPLACE_LOG10L=0; AC_SUBST([REPLACE_LOG10L])
+ REPLACE_LOG1P=0; AC_SUBST([REPLACE_LOG1P])
+ REPLACE_LOG1PF=0; AC_SUBST([REPLACE_LOG1PF])
+ REPLACE_LOG1PL=0; AC_SUBST([REPLACE_LOG1PL])
+ REPLACE_LOG2=0; AC_SUBST([REPLACE_LOG2])
+ REPLACE_LOG2F=0; AC_SUBST([REPLACE_LOG2F])
+ REPLACE_LOG2L=0; AC_SUBST([REPLACE_LOG2L])
+ REPLACE_LOGB=0; AC_SUBST([REPLACE_LOGB])
+ REPLACE_LOGBF=0; AC_SUBST([REPLACE_LOGBF])
+ REPLACE_LOGBL=0; AC_SUBST([REPLACE_LOGBL])
+ REPLACE_MODF=0; AC_SUBST([REPLACE_MODF])
+ REPLACE_MODFF=0; AC_SUBST([REPLACE_MODFF])
+ REPLACE_MODFL=0; AC_SUBST([REPLACE_MODFL])
+ REPLACE_NAN=0; AC_SUBST([REPLACE_NAN])
+ REPLACE_REMAINDER=0; AC_SUBST([REPLACE_REMAINDER])
+ REPLACE_REMAINDERF=0; AC_SUBST([REPLACE_REMAINDERF])
+ REPLACE_REMAINDERL=0; AC_SUBST([REPLACE_REMAINDERL])
+ REPLACE_RINTL=0; AC_SUBST([REPLACE_RINTL])
+ REPLACE_ROUND=0; AC_SUBST([REPLACE_ROUND])
+ REPLACE_ROUNDF=0; AC_SUBST([REPLACE_ROUNDF])
+ REPLACE_ROUNDL=0; AC_SUBST([REPLACE_ROUNDL])
+ REPLACE_SIGNBIT=0; AC_SUBST([REPLACE_SIGNBIT])
+ REPLACE_SIGNBIT_USING_BUILTINS=0; AC_SUBST([REPLACE_SIGNBIT_USING_BUILTINS])
+ REPLACE_SINF=0; AC_SUBST([REPLACE_SINF])
+ REPLACE_SINHF=0; AC_SUBST([REPLACE_SINHF])
+ REPLACE_SQRTF=0; AC_SUBST([REPLACE_SQRTF])
+ REPLACE_SQRTL=0; AC_SUBST([REPLACE_SQRTL])
+ REPLACE_TANF=0; AC_SUBST([REPLACE_TANF])
+ REPLACE_TANHF=0; AC_SUBST([REPLACE_TANHF])
+ REPLACE_TRUNC=0; AC_SUBST([REPLACE_TRUNC])
+ REPLACE_TRUNCF=0; AC_SUBST([REPLACE_TRUNCF])
+ REPLACE_TRUNCL=0; AC_SUBST([REPLACE_TRUNCL])
+])
+
+# gl_LONG_DOUBLE_VS_DOUBLE
+# determines whether 'long double' and 'double' have the same representation.
+# Sets variable HAVE_SAME_LONG_DOUBLE_AS_DOUBLE to 0 or 1, and defines
+# HAVE_SAME_LONG_DOUBLE_AS_DOUBLE accordingly.
+# The currently known platforms where this is the case are:
+# Linux/HPPA, Minix 3.1.8, AIX 5, AIX 6 and 7 with xlc, MSVC 9.
+AC_DEFUN([gl_LONG_DOUBLE_VS_DOUBLE],
+[
+ AC_CACHE_CHECK([whether long double and double are the same],
+ [gl_cv_long_double_equals_double],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#include <float.h>]],
+ [[typedef int check[sizeof (long double) == sizeof (double)
+ && LDBL_MANT_DIG == DBL_MANT_DIG
+ && LDBL_MAX_EXP == DBL_MAX_EXP
+ && LDBL_MIN_EXP == DBL_MIN_EXP
+ ? 1 : -1];
+ ]])],
+ [gl_cv_long_double_equals_double=yes],
+ [gl_cv_long_double_equals_double=no])
+ ])
+ if test $gl_cv_long_double_equals_double = yes; then
+ AC_DEFINE([HAVE_SAME_LONG_DOUBLE_AS_DOUBLE], [1],
+ [Define to 1 if 'long double' and 'double' have the same representation.])
+ HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=1
+ else
+ HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=0
+ fi
+ AC_SUBST([HAVE_SAME_LONG_DOUBLE_AS_DOUBLE])
+])
diff --git a/gnulib_m4/memchr.m4 b/gnulib_m4/memchr.m4
new file mode 100644
index 0000000..4f1aed0
--- /dev/null
+++ b/gnulib_m4/memchr.m4
@@ -0,0 +1,106 @@
+# memchr.m4 serial 18
+dnl Copyright (C) 2002-2004, 2009-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN_ONCE([gl_FUNC_MEMCHR],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ dnl Check for prerequisites for memory fence checks.
+ gl_FUNC_MMAP_ANON
+ AC_CHECK_HEADERS_ONCE([sys/mman.h])
+ AC_CHECK_FUNCS_ONCE([mprotect])
+
+ AC_REQUIRE([gl_STRING_H_DEFAULTS])
+ # Detect platform-specific bugs in some versions of glibc:
+ # memchr should not dereference anything with length 0
+ # https://bugzilla.redhat.com/show_bug.cgi?id=499689
+ # memchr should not dereference overestimated length after a match
+ # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737
+ # https://sourceware.org/bugzilla/show_bug.cgi?id=10162
+ # memchr should cast the second argument to 'unsigned char'.
+ # This bug exists in Android 4.3.
+ # Assume that memchr works on platforms that lack mprotect.
+ AC_CACHE_CHECK([whether memchr works], [gl_cv_func_memchr_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <string.h>
+#if HAVE_SYS_MMAN_H
+# include <fcntl.h>
+# include <unistd.h>
+# include <sys/types.h>
+# include <sys/mman.h>
+# ifndef MAP_FILE
+# define MAP_FILE 0
+# endif
+#endif
+]], [[
+ int result = 0;
+ char *fence = NULL;
+#if HAVE_SYS_MMAN_H && HAVE_MPROTECT
+# if HAVE_MAP_ANONYMOUS
+ const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
+ const int fd = -1;
+# else /* !HAVE_MAP_ANONYMOUS */
+ const int flags = MAP_FILE | MAP_PRIVATE;
+ int fd = open ("/dev/zero", O_RDONLY, 0666);
+ if (fd >= 0)
+# endif
+ {
+ int pagesize = getpagesize ();
+ char *two_pages =
+ (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE,
+ flags, fd, 0);
+ if (two_pages != (char *)(-1)
+ && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0)
+ fence = two_pages + pagesize;
+ }
+#endif
+ if (fence)
+ {
+ /* Test against bugs on glibc systems. */
+ if (memchr (fence, 0, 0))
+ result |= 1;
+ strcpy (fence - 9, "12345678");
+ if (memchr (fence - 9, 0, 79) != fence - 1)
+ result |= 2;
+ if (memchr (fence - 1, 0, 3) != fence - 1)
+ result |= 4;
+ /* Test against bug on AIX 7.2. */
+ if (memchr (fence - 4, '6', 16) != fence - 4)
+ result |= 8;
+ }
+ /* Test against bug on Android 4.3. */
+ {
+ char input[3];
+ input[0] = 'a';
+ input[1] = 'b';
+ input[2] = 'c';
+ if (memchr (input, 0x789abc00 | 'b', 3) != input + 1)
+ result |= 16;
+ }
+ return result;
+]])],
+ [gl_cv_func_memchr_works=yes],
+ [gl_cv_func_memchr_works=no],
+ [case "$host_os" in
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_memchr_works="guessing no" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_memchr_works="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_memchr_works="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_memchr_works" in
+ *yes) ;;
+ *) REPLACE_MEMCHR=1 ;;
+ esac
+])
+
+# Prerequisites of lib/memchr.c.
+AC_DEFUN([gl_PREREQ_MEMCHR], [
+ AC_CHECK_HEADERS([bp-sym.h])
+])
diff --git a/gnulib_m4/mmap-anon.m4 b/gnulib_m4/mmap-anon.m4
new file mode 100644
index 0000000..d07d26e
--- /dev/null
+++ b/gnulib_m4/mmap-anon.m4
@@ -0,0 +1,55 @@
+# mmap-anon.m4 serial 12
+dnl Copyright (C) 2005, 2007, 2009-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Detect how mmap can be used to create anonymous (not file-backed) memory
+# mappings.
+# - On Linux, AIX, OSF/1, Solaris, Cygwin, Interix, Haiku, both MAP_ANONYMOUS
+# and MAP_ANON exist and have the same value.
+# - On HP-UX, only MAP_ANONYMOUS exists.
+# - On Mac OS X, FreeBSD, NetBSD, OpenBSD, Minix, only MAP_ANON exists.
+# - On IRIX, neither exists, and a file descriptor opened to /dev/zero must be
+# used.
+
+AC_DEFUN_ONCE([gl_FUNC_MMAP_ANON],
+[
+ dnl Persuade glibc <sys/mman.h> to define MAP_ANONYMOUS.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ # Check for mmap(). Don't use AC_FUNC_MMAP, because it checks too much: it
+ # fails on HP-UX 11, because MAP_FIXED mappings do not work. But this is
+ # irrelevant for anonymous mappings.
+ AC_CHECK_FUNC([mmap], [gl_have_mmap=yes], [gl_have_mmap=no])
+
+ # Try to allow MAP_ANONYMOUS.
+ gl_have_mmap_anonymous=no
+ if test $gl_have_mmap = yes; then
+ AC_MSG_CHECKING([for MAP_ANONYMOUS])
+ AC_EGREP_CPP([I cannot identify this map], [
+#include <sys/mman.h>
+#ifdef MAP_ANONYMOUS
+ I cannot identify this map
+#endif
+],
+ [gl_have_mmap_anonymous=yes])
+ if test $gl_have_mmap_anonymous != yes; then
+ AC_EGREP_CPP([I cannot identify this map], [
+#include <sys/mman.h>
+#ifdef MAP_ANON
+ I cannot identify this map
+#endif
+],
+ [AC_DEFINE([MAP_ANONYMOUS], [MAP_ANON],
+ [Define to a substitute value for mmap()'s MAP_ANONYMOUS flag.])
+ gl_have_mmap_anonymous=yes])
+ fi
+ AC_MSG_RESULT([$gl_have_mmap_anonymous])
+ if test $gl_have_mmap_anonymous = yes; then
+ AC_DEFINE([HAVE_MAP_ANONYMOUS], [1],
+ [Define to 1 if mmap()'s MAP_ANONYMOUS flag is available after including
+ config.h and <sys/mman.h>.])
+ fi
+ fi
+])
diff --git a/gnulib_m4/multiarch.m4 b/gnulib_m4/multiarch.m4
new file mode 100644
index 0000000..3ba5b0f
--- /dev/null
+++ b/gnulib_m4/multiarch.m4
@@ -0,0 +1,65 @@
+# multiarch.m4 serial 9
+dnl Copyright (C) 2008-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Determine whether the compiler is or may be producing universal binaries.
+#
+# On Mac OS X 10.5 and later systems, the user can create libraries and
+# executables that work on multiple system types--known as "fat" or
+# "universal" binaries--by specifying multiple '-arch' options to the
+# compiler but only a single '-arch' option to the preprocessor. Like
+# this:
+#
+# ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+# CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+# CPP="gcc -E" CXXCPP="g++ -E"
+#
+# Detect this situation and set APPLE_UNIVERSAL_BUILD accordingly.
+
+AC_DEFUN_ONCE([gl_MULTIARCH],
+[
+ dnl Code similar to autoconf-2.63 AC_C_BIGENDIAN.
+ AC_CACHE_CHECK([whether the compiler produces multi-arch binaries],
+ [gl_cv_c_multiarch],
+ [gl_cv_c_multiarch=no
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#ifndef __APPLE_CC__
+ not a universal capable compiler
+ #endif
+ typedef int dummy;
+ ]])],
+ [
+ dnl Check for potential -arch flags. It is not universal unless
+ dnl there are at least two -arch flags with different values.
+ arch=
+ prev=
+ for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do
+ if test -n "$prev"; then
+ case $word in
+ i?86 | x86_64 | ppc | ppc64 | arm | arm64)
+ if test -z "$arch" || test "$arch" = "$word"; then
+ arch="$word"
+ else
+ gl_cv_c_multiarch=yes
+ fi
+ ;;
+ esac
+ prev=
+ else
+ if test "x$word" = "x-arch"; then
+ prev=arch
+ fi
+ fi
+ done
+ ])
+ ])
+ if test $gl_cv_c_multiarch = yes; then
+ APPLE_UNIVERSAL_BUILD=1
+ else
+ APPLE_UNIVERSAL_BUILD=0
+ fi
+ AC_SUBST([APPLE_UNIVERSAL_BUILD])
+])
diff --git a/gnulib_m4/nocrash.m4 b/gnulib_m4/nocrash.m4
new file mode 100644
index 0000000..6a76638
--- /dev/null
+++ b/gnulib_m4/nocrash.m4
@@ -0,0 +1,131 @@
+# nocrash.m4 serial 5
+dnl Copyright (C) 2005, 2009-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Based on libsigsegv, from Bruno Haible and Paolo Bonzini.
+
+AC_PREREQ([2.13])
+
+dnl Expands to some code for use in .c programs that will cause the configure
+dnl test to exit instead of crashing. This is useful to avoid triggering
+dnl action from a background debugger and to avoid core dumps.
+dnl Usage: ...
+dnl ]GL_NOCRASH[
+dnl ...
+dnl int main() { nocrash_init(); ... }
+AC_DEFUN([GL_NOCRASH],[[
+#include <stdlib.h>
+#if defined __MACH__ && defined __APPLE__
+/* Avoid a crash on Mac OS X. */
+#include <mach/mach.h>
+#include <mach/mach_error.h>
+#include <mach/thread_status.h>
+#include <mach/exception.h>
+#include <mach/task.h>
+#include <pthread.h>
+/* The exception port on which our thread listens. */
+static mach_port_t our_exception_port;
+/* The main function of the thread listening for exceptions of type
+ EXC_BAD_ACCESS. */
+static void *
+mach_exception_thread (void *arg)
+{
+ /* Buffer for a message to be received. */
+ struct {
+ mach_msg_header_t head;
+ mach_msg_body_t msgh_body;
+ char data[1024];
+ } msg;
+ mach_msg_return_t retval;
+ /* Wait for a message on the exception port. */
+ retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg),
+ our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
+ if (retval != MACH_MSG_SUCCESS)
+ abort ();
+ exit (1);
+}
+static void
+nocrash_init (void)
+{
+ mach_port_t self = mach_task_self ();
+ /* Allocate a port on which the thread shall listen for exceptions. */
+ if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port)
+ == KERN_SUCCESS) {
+ /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */
+ if (mach_port_insert_right (self, our_exception_port, our_exception_port,
+ MACH_MSG_TYPE_MAKE_SEND)
+ == KERN_SUCCESS) {
+ /* The exceptions we want to catch. Only EXC_BAD_ACCESS is interesting
+ for us. */
+ exception_mask_t mask = EXC_MASK_BAD_ACCESS;
+ /* Create the thread listening on the exception port. */
+ pthread_attr_t attr;
+ pthread_t thread;
+ if (pthread_attr_init (&attr) == 0
+ && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0
+ && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) {
+ pthread_attr_destroy (&attr);
+ /* Replace the exception port info for these exceptions with our own.
+ Note that we replace the exception port for the entire task, not only
+ for a particular thread. This has the effect that when our exception
+ port gets the message, the thread specific exception port has already
+ been asked, and we don't need to bother about it.
+ See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html. */
+ task_set_exception_ports (self, mask, our_exception_port,
+ EXCEPTION_DEFAULT, MACHINE_THREAD_STATE);
+ }
+ }
+ }
+}
+#elif defined _WIN32 && ! defined __CYGWIN__
+/* Avoid a crash on native Windows. */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <winerror.h>
+static LONG WINAPI
+exception_filter (EXCEPTION_POINTERS *ExceptionInfo)
+{
+ switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
+ {
+ case EXCEPTION_ACCESS_VIOLATION:
+ case EXCEPTION_IN_PAGE_ERROR:
+ case EXCEPTION_STACK_OVERFLOW:
+ case EXCEPTION_GUARD_PAGE:
+ case EXCEPTION_PRIV_INSTRUCTION:
+ case EXCEPTION_ILLEGAL_INSTRUCTION:
+ case EXCEPTION_DATATYPE_MISALIGNMENT:
+ case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
+ case EXCEPTION_NONCONTINUABLE_EXCEPTION:
+ exit (1);
+ }
+ return EXCEPTION_CONTINUE_SEARCH;
+}
+static void
+nocrash_init (void)
+{
+ SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter);
+}
+#else
+/* Avoid a crash on POSIX systems. */
+#include <signal.h>
+#include <unistd.h>
+/* A POSIX signal handler. */
+static void
+exception_handler (int sig)
+{
+ _exit (1);
+}
+static void
+nocrash_init (void)
+{
+#ifdef SIGSEGV
+ signal (SIGSEGV, exception_handler);
+#endif
+#ifdef SIGBUS
+ signal (SIGBUS, exception_handler);
+#endif
+}
+#endif
+]])
diff --git a/gnulib_m4/off_t.m4 b/gnulib_m4/off_t.m4
new file mode 100644
index 0000000..880f347
--- /dev/null
+++ b/gnulib_m4/off_t.m4
@@ -0,0 +1,18 @@
+# off_t.m4 serial 1
+dnl Copyright (C) 2012-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Check whether to override the 'off_t' type.
+dnl Set WINDOWS_64_BIT_OFF_T.
+
+AC_DEFUN([gl_TYPE_OFF_T],
+[
+ m4_ifdef([gl_LARGEFILE], [
+ AC_REQUIRE([gl_LARGEFILE])
+ ], [
+ WINDOWS_64_BIT_OFF_T=0
+ ])
+ AC_SUBST([WINDOWS_64_BIT_OFF_T])
+])
diff --git a/gnulib_m4/printf-frexp.m4 b/gnulib_m4/printf-frexp.m4
new file mode 100644
index 0000000..8f5844a
--- /dev/null
+++ b/gnulib_m4/printf-frexp.m4
@@ -0,0 +1,38 @@
+# printf-frexp.m4 serial 5
+dnl Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Check how to define printf_frexp() without linking with libm.
+
+AC_DEFUN([gl_FUNC_PRINTF_FREXP],
+[
+ AC_REQUIRE([gl_CHECK_FREXP_NO_LIBM])
+ if test $gl_cv_func_frexp_no_libm = yes; then
+ gl_FUNC_FREXP_WORKS
+ case "$gl_cv_func_frexp_works" in
+ *yes)
+ AC_DEFINE([HAVE_FREXP_IN_LIBC], [1],
+ [Define if the frexp function is available in libc.])
+ ;;
+ esac
+ fi
+
+ AC_CACHE_CHECK([whether ldexp can be used without linking with libm],
+ [gl_cv_func_ldexp_no_libm],
+ [
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <math.h>
+ double x;
+ int y;]],
+ [[return ldexp (x, y) < 1;]])],
+ [gl_cv_func_ldexp_no_libm=yes],
+ [gl_cv_func_ldexp_no_libm=no])
+ ])
+ if test $gl_cv_func_ldexp_no_libm = yes; then
+ AC_DEFINE([HAVE_LDEXP_IN_LIBC], [1],
+ [Define if the ldexp function is available in libc.])
+ fi
+])
diff --git a/gnulib_m4/printf-frexpl.m4 b/gnulib_m4/printf-frexpl.m4
new file mode 100644
index 0000000..aee170f
--- /dev/null
+++ b/gnulib_m4/printf-frexpl.m4
@@ -0,0 +1,48 @@
+# printf-frexpl.m4 serial 10
+dnl Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Check how to define printf_frexpl() without linking with libm.
+
+AC_DEFUN([gl_FUNC_PRINTF_FREXPL],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
+
+ dnl Subset of gl_FUNC_FREXPL_NO_LIBM.
+ gl_CHECK_FREXPL_NO_LIBM
+ if test $gl_cv_func_frexpl_no_libm = yes; then
+ gl_FUNC_FREXPL_WORKS
+ case "$gl_cv_func_frexpl_works" in
+ *yes) gl_func_frexpl_no_libm=yes ;;
+ *) gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;;
+ esac
+ else
+ gl_func_frexpl_no_libm=no
+ dnl Set REPLACE_FREXPL here because the system may have frexpl in libm.
+ REPLACE_FREXPL=1
+ fi
+ if test $gl_func_frexpl_no_libm = yes; then
+ AC_DEFINE([HAVE_FREXPL_IN_LIBC], [1],
+ [Define if the frexpl function is available in libc.])
+ dnl Also check whether it's declared.
+ dnl Mac OS X 10.3 has frexpl() in libc but doesn't declare it in <math.h>.
+ AC_CHECK_DECL([frexpl], , [HAVE_DECL_FREXPL=0], [[#include <math.h>]])
+ fi
+
+ gl_CHECK_LDEXPL_NO_LIBM
+ if test $gl_cv_func_ldexpl_no_libm = yes; then
+ gl_FUNC_LDEXPL_WORKS
+ case "$gl_cv_func_ldexpl_works" in
+ *yes)
+ AC_DEFINE([HAVE_LDEXPL_IN_LIBC], [1],
+ [Define if the ldexpl function is available in libc.])
+ dnl Also check whether it's declared.
+ dnl Mac OS X 10.3 has ldexpl() in libc but doesn't declare it in <math.h>.
+ AC_CHECK_DECL([ldexpl], , [HAVE_DECL_LDEXPL=0], [[#include <math.h>]])
+ ;;
+ esac
+ fi
+])
diff --git a/gnulib_m4/printf.m4 b/gnulib_m4/printf.m4
new file mode 100644
index 0000000..4e65abc
--- /dev/null
+++ b/gnulib_m4/printf.m4
@@ -0,0 +1,1728 @@
+# printf.m4 serial 73
+dnl Copyright (C) 2003, 2007-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Test whether the *printf family of functions supports the 'j', 'z', 't',
+dnl 'L' size specifiers. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_sizes_c99.
+
+AC_DEFUN([gl_PRINTF_SIZES_C99],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports size specifiers as in C99],
+ [gl_cv_func_printf_sizes_c99],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+# include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+# include <inttypes.h>
+#endif
+static char buf[100];
+int main ()
+{
+ int result = 0;
+#if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX
+ buf[0] = '\0';
+ if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0
+ || strcmp (buf, "12345671 33") != 0)
+ result |= 1;
+#else
+ result |= 1;
+#endif
+ buf[0] = '\0';
+ if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0
+ || strcmp (buf, "12345672 33") != 0)
+ result |= 2;
+ buf[0] = '\0';
+ if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0
+ || strcmp (buf, "12345673 33") != 0)
+ result |= 4;
+ buf[0] = '\0';
+ if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0
+ || strcmp (buf, "1.5 33") != 0)
+ result |= 8;
+ return result;
+}]])],
+ [gl_cv_func_printf_sizes_c99=yes],
+ [gl_cv_func_printf_sizes_c99=no],
+ [
+ case "$host_os" in
+changequote(,)dnl
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on FreeBSD >= 5.
+ freebsd[1-4].*) gl_cv_func_printf_sizes_c99="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ midnightbsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on Mac OS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_printf_sizes_c99="guessing no";;
+ darwin*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on OpenBSD >= 3.9.
+ openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
+ gl_cv_func_printf_sizes_c99="guessing no";;
+ openbsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on Solaris >= 2.10.
+ solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ solaris*) gl_cv_func_printf_sizes_c99="guessing no";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_printf_sizes_c99="guessing no";;
+ netbsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_printf_sizes_c99="guessing yes";;
+changequote([,])dnl
+ # Guess yes on MSVC, no on mingw.
+ mingw*) AC_EGREP_CPP([Known], [
+#ifdef _MSC_VER
+ Known
+#endif
+ ],
+ [gl_cv_func_printf_sizes_c99="guessing yes"],
+ [gl_cv_func_printf_sizes_c99="guessing no"])
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_printf_sizes_c99="$gl_cross_guess_normal";;
+ esac
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports 'long double'
+dnl arguments together with the 'L' size specifier. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_long_double.
+
+AC_DEFUN([gl_PRINTF_LONG_DOUBLE],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports 'long double' arguments],
+ [gl_cv_func_printf_long_double],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+static char buf[10000];
+int main ()
+{
+ int result = 0;
+ buf[0] = '\0';
+ if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0
+ || strcmp (buf, "1.750000 33") != 0)
+ result |= 1;
+ buf[0] = '\0';
+ if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0
+ || strcmp (buf, "1.750000e+00 33") != 0)
+ result |= 2;
+ buf[0] = '\0';
+ if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0
+ || strcmp (buf, "1.75 33") != 0)
+ result |= 4;
+ return result;
+}]])],
+ [gl_cv_func_printf_long_double=yes],
+ [gl_cv_func_printf_long_double=no],
+ [case "$host_os" in
+ # Guess no on BeOS.
+ beos*) gl_cv_func_printf_long_double="guessing no";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_printf_long_double="guessing yes";;
+ # Guess yes on MSVC, no on mingw.
+ mingw*) AC_EGREP_CPP([Known], [
+#ifdef _MSC_VER
+ Known
+#endif
+ ],
+ [gl_cv_func_printf_long_double="guessing yes"],
+ [gl_cv_func_printf_long_double="guessing no"])
+ ;;
+ *) gl_cv_func_printf_long_double="guessing yes";;
+ esac
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports infinite and NaN
+dnl 'double' arguments and negative zero arguments in the %f, %e, %g
+dnl directives. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_infinite.
+
+AC_DEFUN([gl_PRINTF_INFINITE],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports infinite 'double' arguments],
+ [gl_cv_func_printf_infinite],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+static int
+strisnan (const char *string, size_t start_index, size_t end_index)
+{
+ if (start_index < end_index)
+ {
+ if (string[start_index] == '-')
+ start_index++;
+ if (start_index + 3 <= end_index
+ && memcmp (string + start_index, "nan", 3) == 0)
+ {
+ start_index += 3;
+ if (start_index == end_index
+ || (string[start_index] == '(' && string[end_index - 1] == ')'))
+ return 1;
+ }
+ }
+ return 0;
+}
+static int
+have_minus_zero ()
+{
+ static double plus_zero = 0.0;
+ double minus_zero = - plus_zero;
+ return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
+}
+static char buf[10000];
+static double zero = 0.0;
+int main ()
+{
+ int result = 0;
+ if (sprintf (buf, "%f", 1.0 / zero) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%f", -1.0 / zero) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%f", zero / zero) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 2;
+ if (sprintf (buf, "%e", 1.0 / zero) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ result |= 4;
+ if (sprintf (buf, "%e", -1.0 / zero) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ result |= 4;
+ if (sprintf (buf, "%e", zero / zero) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 8;
+ if (sprintf (buf, "%g", 1.0 / zero) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ result |= 16;
+ if (sprintf (buf, "%g", -1.0 / zero) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ result |= 16;
+ if (sprintf (buf, "%g", zero / zero) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 32;
+ /* This test fails on HP-UX 10.20. */
+ if (have_minus_zero ())
+ if (sprintf (buf, "%g", - zero) < 0
+ || strcmp (buf, "-0") != 0)
+ result |= 64;
+ return result;
+}]])],
+ [gl_cv_func_printf_infinite=yes],
+ [gl_cv_func_printf_infinite=no],
+ [
+ case "$host_os" in
+changequote(,)dnl
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on FreeBSD >= 6.
+ freebsd[1-5].*) gl_cv_func_printf_infinite="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_printf_infinite="guessing yes";;
+ midnightbsd*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on Mac OS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_printf_infinite="guessing no";;
+ darwin*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on HP-UX >= 11.
+ hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite="guessing no";;
+ hpux*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_printf_infinite="guessing no";;
+ netbsd*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on OpenBSD >= 6.0.
+ openbsd[1-5].*) gl_cv_func_printf_infinite="guessing no";;
+ openbsd*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_infinite="guessing no";;
+changequote([,])dnl
+ # Guess yes on MSVC, no on mingw.
+ mingw*) AC_EGREP_CPP([Known], [
+#ifdef _MSC_VER
+ Known
+#endif
+ ],
+ [gl_cv_func_printf_infinite="guessing yes"],
+ [gl_cv_func_printf_infinite="guessing no"])
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_printf_infinite="$gl_cross_guess_normal";;
+ esac
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports infinite and NaN
+dnl 'long double' arguments in the %f, %e, %g directives. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_infinite_long_double.
+
+AC_DEFUN([gl_PRINTF_INFINITE_LONG_DOUBLE],
+[
+ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gl_BIGENDIAN])
+ AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ dnl The user can set or unset the variable gl_printf_safe to indicate
+ dnl that he wishes a safe handling of non-IEEE-754 'long double' values.
+ if test -n "$gl_printf_safe"; then
+ AC_DEFINE([CHECK_PRINTF_SAFE], [1],
+ [Define if you wish *printf() functions that have a safe handling of
+ non-IEEE-754 'long double' values.])
+ fi
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ AC_CACHE_CHECK([whether printf supports infinite 'long double' arguments],
+ [gl_cv_func_printf_infinite_long_double],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+]GL_NOCRASH[
+#include <float.h>
+#include <stdio.h>
+#include <string.h>
+static int
+strisnan (const char *string, size_t start_index, size_t end_index)
+{
+ if (start_index < end_index)
+ {
+ if (string[start_index] == '-')
+ start_index++;
+ if (start_index + 3 <= end_index
+ && memcmp (string + start_index, "nan", 3) == 0)
+ {
+ start_index += 3;
+ if (start_index == end_index
+ || (string[start_index] == '(' && string[end_index - 1] == ')'))
+ return 1;
+ }
+ }
+ return 0;
+}
+static char buf[10000];
+static long double zeroL = 0.0L;
+int main ()
+{
+ int result = 0;
+ nocrash_init();
+ if (sprintf (buf, "%Lf", 1.0L / zeroL) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%Lf", -1.0L / zeroL) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%Lf", zeroL / zeroL) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 1;
+ if (sprintf (buf, "%Le", 1.0L / zeroL) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%Le", -1.0L / zeroL) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%Le", zeroL / zeroL) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 1;
+ if (sprintf (buf, "%Lg", 1.0L / zeroL) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%Lg", -1.0L / zeroL) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%Lg", zeroL / zeroL) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 1;
+#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+/* Representation of an 80-bit 'long double' as an initializer for a sequence
+ of 'unsigned int' words. */
+# ifdef WORDS_BIGENDIAN
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+ ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \
+ (unsigned int) (mantlo) << 16 \
+ }
+# else
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { mantlo, manthi, exponent }
+# endif
+ { /* Quiet NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 2;
+ if (sprintf (buf, "%Le", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 2;
+ if (sprintf (buf, "%Lg", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 2;
+ }
+ {
+ /* Signalling NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 2;
+ if (sprintf (buf, "%Le", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 2;
+ if (sprintf (buf, "%Lg", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 2;
+ }
+ { /* Pseudo-NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) <= 0)
+ result |= 4;
+ if (sprintf (buf, "%Le", x.value) <= 0)
+ result |= 4;
+ if (sprintf (buf, "%Lg", x.value) <= 0)
+ result |= 4;
+ }
+ { /* Pseudo-Infinity. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) <= 0)
+ result |= 8;
+ if (sprintf (buf, "%Le", x.value) <= 0)
+ result |= 8;
+ if (sprintf (buf, "%Lg", x.value) <= 0)
+ result |= 8;
+ }
+ { /* Pseudo-Zero. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) <= 0)
+ result |= 16;
+ if (sprintf (buf, "%Le", x.value) <= 0)
+ result |= 16;
+ if (sprintf (buf, "%Lg", x.value) <= 0)
+ result |= 16;
+ }
+ { /* Unnormalized number. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) <= 0)
+ result |= 32;
+ if (sprintf (buf, "%Le", x.value) <= 0)
+ result |= 32;
+ if (sprintf (buf, "%Lg", x.value) <= 0)
+ result |= 32;
+ }
+ { /* Pseudo-Denormal. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) <= 0)
+ result |= 64;
+ if (sprintf (buf, "%Le", x.value) <= 0)
+ result |= 64;
+ if (sprintf (buf, "%Lg", x.value) <= 0)
+ result |= 64;
+ }
+#endif
+ return result;
+}]])],
+ [gl_cv_func_printf_infinite_long_double=yes],
+ [gl_cv_func_printf_infinite_long_double=no],
+ [case "$host_cpu" in
+ # Guess no on ia64, x86_64, i386.
+ ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";;
+ *)
+ case "$host_os" in
+changequote(,)dnl
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ # Guess yes on FreeBSD >= 6.
+ freebsd[1-5].*) gl_cv_func_printf_infinite_long_double="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ midnightbsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ # Guess yes on HP-UX >= 11.
+ hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";;
+ hpux*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ # Guess yes on OpenBSD >= 6.0.
+ openbsd[1-5].*) gl_cv_func_printf_infinite_long_double="guessing no";;
+ openbsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_infinite_long_double="guessing no";;
+changequote([,])dnl
+ # Guess yes on MSVC, no on mingw.
+ mingw*) AC_EGREP_CPP([Known], [
+#ifdef _MSC_VER
+ Known
+#endif
+ ],
+ [gl_cv_func_printf_infinite_long_double="guessing yes"],
+ [gl_cv_func_printf_infinite_long_double="guessing no"])
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_printf_infinite_long_double="$gl_cross_guess_normal";;
+ esac
+ ;;
+ esac
+ ])
+ ])
+ ;;
+ *)
+ gl_cv_func_printf_infinite_long_double="irrelevant"
+ ;;
+ esac
+])
+
+dnl Test whether the *printf family of functions supports the 'a' and 'A'
+dnl conversion specifier for hexadecimal output of floating-point numbers.
+dnl (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_directive_a.
+
+AC_DEFUN([gl_PRINTF_DIRECTIVE_A],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports the 'a' and 'A' directives],
+ [gl_cv_func_printf_directive_a],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+static double zero = 0.0;
+int main ()
+{
+ int result = 0;
+ if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0
+ || (strcmp (buf, "0x1.922p+1 33") != 0
+ && strcmp (buf, "0x3.244p+0 33") != 0
+ && strcmp (buf, "0x6.488p-1 33") != 0
+ && strcmp (buf, "0xc.91p-2 33") != 0))
+ result |= 1;
+ if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0
+ || (strcmp (buf, "-0X1.922P+1 33") != 0
+ && strcmp (buf, "-0X3.244P+0 33") != 0
+ && strcmp (buf, "-0X6.488P-1 33") != 0
+ && strcmp (buf, "-0XC.91P-2 33") != 0))
+ result |= 2;
+ /* This catches a FreeBSD 13.0 bug: it doesn't round. */
+ if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0
+ || (strcmp (buf, "0x1.83p+0 33") != 0
+ && strcmp (buf, "0x3.05p-1 33") != 0
+ && strcmp (buf, "0x6.0ap-2 33") != 0
+ && strcmp (buf, "0xc.14p-3 33") != 0))
+ result |= 4;
+ /* This catches a Mac OS X 10.12.4 (Darwin 16.5) bug: it doesn't round. */
+ if (sprintf (buf, "%.0a %d", 1.51, 33, 44, 55) < 0
+ || (strcmp (buf, "0x2p+0 33") != 0
+ && strcmp (buf, "0x3p-1 33") != 0
+ && strcmp (buf, "0x6p-2 33") != 0
+ && strcmp (buf, "0xcp-3 33") != 0))
+ result |= 4;
+ /* This catches a FreeBSD 6.1 bug. See
+ <https://lists.gnu.org/r/bug-gnulib/2007-04/msg00107.html> */
+ if (sprintf (buf, "%010a %d", 1.0 / zero, 33, 44, 55) < 0
+ || buf[0] == '0')
+ result |= 8;
+ /* This catches a Mac OS X 10.3.9 (Darwin 7.9) bug. */
+ if (sprintf (buf, "%.1a", 1.999) < 0
+ || (strcmp (buf, "0x1.0p+1") != 0
+ && strcmp (buf, "0x2.0p+0") != 0
+ && strcmp (buf, "0x4.0p-1") != 0
+ && strcmp (buf, "0x8.0p-2") != 0))
+ result |= 16;
+ /* This catches the same Mac OS X 10.3.9 (Darwin 7.9) bug and also a
+ glibc 2.4 bug <https://sourceware.org/bugzilla/show_bug.cgi?id=2908>. */
+ if (sprintf (buf, "%.1La", 1.999L) < 0
+ || (strcmp (buf, "0x1.0p+1") != 0
+ && strcmp (buf, "0x2.0p+0") != 0
+ && strcmp (buf, "0x4.0p-1") != 0
+ && strcmp (buf, "0x8.0p-2") != 0))
+ result |= 32;
+ return result;
+}]])],
+ [gl_cv_func_printf_directive_a=yes],
+ [gl_cv_func_printf_directive_a=no],
+ [
+ case "$host_os" in
+ # Guess yes on glibc >= 2.5 systems.
+ *-gnu* | gnu*)
+ AC_EGREP_CPP([BZ2908], [
+ #include <features.h>
+ #ifdef __GNU_LIBRARY__
+ #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)) && !defined __UCLIBC__
+ BZ2908
+ #endif
+ #endif
+ ],
+ [gl_cv_func_printf_directive_a="guessing yes"],
+ [gl_cv_func_printf_directive_a="guessing no"])
+ ;;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_printf_directive_a="guessing yes";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_directive_a="guessing no";;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_printf_directive_a="guessing no";;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_printf_directive_a="$gl_cross_guess_normal";;
+ esac
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports the %F format
+dnl directive. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_directive_f.
+
+AC_DEFUN([gl_PRINTF_DIRECTIVE_F],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports the 'F' directive],
+ [gl_cv_func_printf_directive_f],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+static double zero = 0.0;
+int main ()
+{
+ int result = 0;
+ if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0
+ || strcmp (buf, "1234567.000000 33") != 0)
+ result |= 1;
+ if (sprintf (buf, "%F", 1.0 / zero) < 0
+ || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0))
+ result |= 2;
+ /* This catches a Cygwin 1.5.x bug. */
+ if (sprintf (buf, "%.F", 1234.0) < 0
+ || strcmp (buf, "1234") != 0)
+ result |= 4;
+ return result;
+}]])],
+ [gl_cv_func_printf_directive_f=yes],
+ [gl_cv_func_printf_directive_f=no],
+ [
+ case "$host_os" in
+changequote(,)dnl
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_printf_directive_f="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_printf_directive_f="guessing yes";;
+ # Guess yes on FreeBSD >= 6.
+ freebsd[1-5].*) gl_cv_func_printf_directive_f="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";;
+ midnightbsd*) gl_cv_func_printf_directive_f="guessing yes";;
+ # Guess yes on Mac OS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_printf_directive_f="guessing no";;
+ darwin*) gl_cv_func_printf_directive_f="guessing yes";;
+ # Guess yes on OpenBSD >= 6.0.
+ openbsd[1-5].*) gl_cv_func_printf_directive_f="guessing no";;
+ openbsd*) gl_cv_func_printf_directive_f="guessing yes";;
+ # Guess yes on Solaris >= 2.10.
+ solaris2.[1-9][0-9]*) gl_cv_func_printf_directive_f="guessing yes";;
+ solaris*) gl_cv_func_printf_directive_f="guessing no";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_directive_f="guessing no";;
+changequote([,])dnl
+ # Guess yes on MSVC, no on mingw.
+ mingw*) AC_EGREP_CPP([Known], [
+#ifdef _MSC_VER
+ Known
+#endif
+ ],
+ [gl_cv_func_printf_directive_f="guessing yes"],
+ [gl_cv_func_printf_directive_f="guessing no"])
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_printf_directive_f="$gl_cross_guess_normal";;
+ esac
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports the %n format
+dnl directive. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_directive_n.
+
+AC_DEFUN([gl_PRINTF_DIRECTIVE_N],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports the 'n' directive],
+ [gl_cv_func_printf_directive_n],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef _MSC_VER
+#include <inttypes.h>
+/* See page about "Parameter Validation" on msdn.microsoft.com.
+ <https://docs.microsoft.com/en-us/cpp/c-runtime-library/parameter-validation>
+ <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/set-invalid-parameter-handler-set-thread-local-invalid-parameter-handler> */
+static void cdecl
+invalid_parameter_handler (const wchar_t *expression,
+ const wchar_t *function,
+ const wchar_t *file, unsigned int line,
+ uintptr_t dummy)
+{
+ exit (1);
+}
+#endif
+static char fmtstring[10];
+static char buf[100];
+int main ()
+{
+ int count = -1;
+#ifdef _MSC_VER
+ _set_invalid_parameter_handler (invalid_parameter_handler);
+#endif
+ /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2)
+ support %n in format strings in read-only memory but not in writable
+ memory. */
+ strcpy (fmtstring, "%d %n");
+ if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0
+ || strcmp (buf, "123 ") != 0
+ || count != 4)
+ return 1;
+ return 0;
+}]])],
+ [gl_cv_func_printf_directive_n=yes],
+ [gl_cv_func_printf_directive_n=no],
+ [case "$host_os" in
+ # Guess no on glibc when _FORTIFY_SOURCE >= 2.
+ *-gnu* | gnu*) AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if _FORTIFY_SOURCE >= 2
+ error fail
+ #endif
+ ]])],
+ [gl_cv_func_printf_directive_n="guessing yes"],
+ [gl_cv_func_printf_directive_n="guessing no"])
+ ;;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_directive_n="guessing no";;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_printf_directive_n="guessing no";;
+ *) gl_cv_func_printf_directive_n="guessing yes";;
+ esac
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports the %ls format
+dnl directive and in particular, when a precision is specified, whether
+dnl the functions stop converting the wide string argument when the number
+dnl of bytes that have been produced by this conversion equals or exceeds
+dnl the precision.
+dnl Result is gl_cv_func_printf_directive_ls.
+
+AC_DEFUN([gl_PRINTF_DIRECTIVE_LS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports the 'ls' directive],
+ [gl_cv_func_printf_directive_ls],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <wchar.h>
+#include <string.h>
+int main ()
+{
+ int result = 0;
+ char buf[100];
+ /* Test whether %ls works at all.
+ This test fails on OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku, but not on
+ Cygwin 1.5. */
+ {
+ static const wchar_t wstring[] = { 'a', 'b', 'c', 0 };
+ buf[0] = '\0';
+ if (sprintf (buf, "%ls", wstring) < 0
+ || strcmp (buf, "abc") != 0)
+ result |= 1;
+ }
+ /* This test fails on IRIX 6.5, Solaris 2.6, Cygwin 1.5, Haiku (with an
+ assertion failure inside libc), but not on OpenBSD 4.0. */
+ {
+ static const wchar_t wstring[] = { 'a', 0 };
+ buf[0] = '\0';
+ if (sprintf (buf, "%ls", wstring) < 0
+ || strcmp (buf, "a") != 0)
+ result |= 2;
+ }
+ /* Test whether precisions in %ls are supported as specified in ISO C 99
+ section 7.19.6.1:
+ "If a precision is specified, no more than that many bytes are written
+ (including shift sequences, if any), and the array shall contain a
+ null wide character if, to equal the multibyte character sequence
+ length given by the precision, the function would need to access a
+ wide character one past the end of the array."
+ This test fails on Solaris 10. */
+ {
+ static const wchar_t wstring[] = { 'a', 'b', (wchar_t) 0xfdfdfdfd, 0 };
+ buf[0] = '\0';
+ if (sprintf (buf, "%.2ls", wstring) < 0
+ || strcmp (buf, "ab") != 0)
+ result |= 8;
+ }
+ return result;
+}]])],
+ [gl_cv_func_printf_directive_ls=yes],
+ [gl_cv_func_printf_directive_ls=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on OpenBSD >= 6.0.
+ openbsd[1-5].*) gl_cv_func_printf_directive_ls="guessing no";;
+ openbsd*) gl_cv_func_printf_directive_ls="guessing yes";;
+ irix*) gl_cv_func_printf_directive_ls="guessing no";;
+ solaris*) gl_cv_func_printf_directive_ls="guessing no";;
+ cygwin*) gl_cv_func_printf_directive_ls="guessing no";;
+ beos* | haiku*) gl_cv_func_printf_directive_ls="guessing no";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_directive_ls="guessing no";;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_printf_directive_ls="guessing yes";;
+ *) gl_cv_func_printf_directive_ls="guessing yes";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports POSIX/XSI format
+dnl strings with positions. (POSIX:2001)
+dnl Result is gl_cv_func_printf_positions.
+
+AC_DEFUN([gl_PRINTF_POSITIONS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports POSIX/XSI format strings with positions],
+ [gl_cv_func_printf_positions],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+/* The string "%2$d %1$d", with dollar characters protected from the shell's
+ dollar expansion (possibly an autoconf bug). */
+static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
+static char buf[100];
+int main ()
+{
+ sprintf (buf, format, 33, 55);
+ return (strcmp (buf, "55 33") != 0);
+}]])],
+ [gl_cv_func_printf_positions=yes],
+ [gl_cv_func_printf_positions=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
+ gl_cv_func_printf_positions="guessing no";;
+ beos*) gl_cv_func_printf_positions="guessing no";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_printf_positions="guessing yes";;
+ # Guess no on native Windows.
+ mingw* | pw*) gl_cv_func_printf_positions="guessing no";;
+ *) gl_cv_func_printf_positions="guessing yes";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports POSIX/XSI format
+dnl strings with the ' flag for grouping of decimal digits. (POSIX:2001)
+dnl Result is gl_cv_func_printf_flag_grouping.
+
+AC_DEFUN([gl_PRINTF_FLAG_GROUPING],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports the grouping flag],
+ [gl_cv_func_printf_flag_grouping],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+int main ()
+{
+ if (sprintf (buf, "%'d %d", 1234567, 99) < 0
+ || buf[strlen (buf) - 1] != '9')
+ return 1;
+ return 0;
+}]])],
+ [gl_cv_func_printf_flag_grouping=yes],
+ [gl_cv_func_printf_flag_grouping=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ cygwin*) gl_cv_func_printf_flag_grouping="guessing no";;
+ netbsd*) gl_cv_func_printf_flag_grouping="guessing no";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_flag_grouping="guessing no";;
+ # Guess no on native Windows.
+ mingw* | pw*) gl_cv_func_printf_flag_grouping="guessing no";;
+ *) gl_cv_func_printf_flag_grouping="guessing yes";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports the - flag correctly.
+dnl (ISO C99.) See
+dnl <https://lists.gnu.org/r/bug-coreutils/2008-02/msg00035.html>
+dnl Result is gl_cv_func_printf_flag_leftadjust.
+
+AC_DEFUN([gl_PRINTF_FLAG_LEFTADJUST],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports the left-adjust flag correctly],
+ [gl_cv_func_printf_flag_leftadjust],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+int main ()
+{
+ /* Check that a '-' flag is not annihilated by a negative width. */
+ if (sprintf (buf, "a%-*sc", -3, "b") < 0
+ || strcmp (buf, "ab c") != 0)
+ return 1;
+ return 0;
+}]])],
+ [gl_cv_func_printf_flag_leftadjust=yes],
+ [gl_cv_func_printf_flag_leftadjust=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on HP-UX 11.
+ hpux11*) gl_cv_func_printf_flag_leftadjust="guessing yes";;
+ # Guess no on HP-UX 10 and older.
+ hpux*) gl_cv_func_printf_flag_leftadjust="guessing no";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_printf_flag_leftadjust="guessing yes";;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_printf_flag_leftadjust="guessing yes";;
+ # Guess yes otherwise.
+ *) gl_cv_func_printf_flag_leftadjust="guessing yes";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports padding of non-finite
+dnl values with the 0 flag correctly. (ISO C99 + TC1 + TC2.) See
+dnl <https://lists.gnu.org/r/bug-gnulib/2007-04/msg00107.html>
+dnl Result is gl_cv_func_printf_flag_zero.
+
+AC_DEFUN([gl_PRINTF_FLAG_ZERO],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports the zero flag correctly],
+ [gl_cv_func_printf_flag_zero],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+static double zero = 0.0;
+int main ()
+{
+ if (sprintf (buf, "%010f", 1.0 / zero, 33, 44, 55) < 0
+ || (strcmp (buf, " inf") != 0
+ && strcmp (buf, " infinity") != 0))
+ return 1;
+ return 0;
+}]])],
+ [gl_cv_func_printf_flag_zero=yes],
+ [gl_cv_func_printf_flag_zero=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_printf_flag_zero="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_printf_flag_zero="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_printf_flag_zero="guessing yes";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_flag_zero="guessing no";;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_printf_flag_zero="guessing no";;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_printf_flag_zero="$gl_cross_guess_normal";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports large precisions.
+dnl On mingw, precisions larger than 512 are treated like 512, in integer,
+dnl floating-point or pointer output. On Solaris 10/x86, precisions larger
+dnl than 510 in floating-point output crash the program. On Solaris 10/SPARC,
+dnl precisions larger than 510 in floating-point output yield wrong results.
+dnl On AIX 7.1, precisions larger than 998 in floating-point output yield
+dnl wrong results. On BeOS, precisions larger than 1044 crash the program.
+dnl Result is gl_cv_func_printf_precision.
+
+AC_DEFUN([gl_PRINTF_PRECISION],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports large precisions],
+ [gl_cv_func_printf_precision],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+static char buf[5000];
+int main ()
+{
+ int result = 0;
+#ifdef __BEOS__
+ /* On BeOS, this would crash and show a dialog box. Avoid the crash. */
+ return 1;
+#endif
+ if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3)
+ result |= 1;
+ if (sprintf (buf, "%.4000f %d", 1.0, 33, 44) < 4000 + 5)
+ result |= 2;
+ if (sprintf (buf, "%.511f %d", 1.0, 33, 44) < 511 + 5
+ || buf[0] != '1')
+ result |= 4;
+ if (sprintf (buf, "%.999f %d", 1.0, 33, 44) < 999 + 5
+ || buf[0] != '1')
+ result |= 4;
+ return result;
+}]])],
+ [gl_cv_func_printf_precision=yes],
+ [gl_cv_func_printf_precision=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no only on Solaris, native Windows, and BeOS systems.
+ solaris*) gl_cv_func_printf_precision="guessing no" ;;
+ mingw* | pw*) gl_cv_func_printf_precision="guessing no" ;;
+ beos*) gl_cv_func_printf_precision="guessing no" ;;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_printf_precision="guessing yes" ;;
+ *) gl_cv_func_printf_precision="guessing yes" ;;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions recovers gracefully in case
+dnl of an out-of-memory condition, or whether it crashes the entire program.
+dnl Result is gl_cv_func_printf_enomem.
+
+AC_DEFUN([gl_PRINTF_ENOMEM],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gl_MULTIARCH])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf survives out-of-memory conditions],
+ [gl_cv_func_printf_enomem],
+ [
+ gl_cv_func_printf_enomem="guessing no"
+ if test "$cross_compiling" = no; then
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+ AC_LANG_CONFTEST([AC_LANG_SOURCE([[
+]GL_NOCRASH[
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <errno.h>
+int main()
+{
+ struct rlimit limit;
+ int ret;
+ nocrash_init ();
+ /* Some printf implementations allocate temporary space with malloc. */
+ /* On BSD systems, malloc() is limited by RLIMIT_DATA. */
+#ifdef RLIMIT_DATA
+ if (getrlimit (RLIMIT_DATA, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
+ limit.rlim_max = 5000000;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_DATA, &limit) < 0)
+ return 77;
+#endif
+ /* On Linux systems, malloc() is limited by RLIMIT_AS. */
+#ifdef RLIMIT_AS
+ if (getrlimit (RLIMIT_AS, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
+ limit.rlim_max = 5000000;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_AS, &limit) < 0)
+ return 77;
+#endif
+ /* Some printf implementations allocate temporary space on the stack. */
+#ifdef RLIMIT_STACK
+ if (getrlimit (RLIMIT_STACK, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
+ limit.rlim_max = 5000000;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_STACK, &limit) < 0)
+ return 77;
+#endif
+ ret = printf ("%.5000000f", 1.0);
+ return !(ret == 5000002 || (ret < 0 && errno == ENOMEM));
+}
+ ]])])
+ if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
+ (./conftest 2>&AS_MESSAGE_LOG_FD
+ result=$?
+ _AS_ECHO_LOG([\$? = $result])
+ if test $result != 0 && test $result != 77; then result=1; fi
+ exit $result
+ ) >/dev/null 2>/dev/null
+ case $? in
+ 0) gl_cv_func_printf_enomem="yes" ;;
+ 77) gl_cv_func_printf_enomem="guessing no" ;;
+ *) gl_cv_func_printf_enomem="no" ;;
+ esac
+ else
+ gl_cv_func_printf_enomem="guessing no"
+ fi
+ rm -fr conftest*
+ else
+ dnl A universal build on Apple Mac OS X platforms.
+ dnl The result would be 'no' in 32-bit mode and 'yes' in 64-bit mode.
+ dnl But we need a configuration result that is valid in both modes.
+ gl_cv_func_printf_enomem="guessing no"
+ fi
+ fi
+ if test "$gl_cv_func_printf_enomem" = "guessing no"; then
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on Solaris.
+ solaris*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on AIX.
+ aix*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on HP-UX/hppa.
+ hpux*) case "$host_cpu" in
+ hppa*) gl_cv_func_printf_enomem="guessing yes";;
+ *) gl_cv_func_printf_enomem="guessing no";;
+ esac
+ ;;
+ # Guess yes on IRIX.
+ irix*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on OSF/1.
+ osf*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on Haiku.
+ haiku*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_enomem="guessing no";;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_printf_enomem="$gl_cross_guess_normal";;
+ esac
+changequote([,])dnl
+ fi
+ ])
+])
+
+dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001)
+dnl Result is ac_cv_func_snprintf.
+
+AC_DEFUN([gl_SNPRINTF_PRESENCE],
+[
+ AC_CHECK_FUNCS_ONCE([snprintf])
+])
+
+dnl Test whether the string produced by the snprintf function is always NUL
+dnl terminated. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_snprintf_truncation_c99.
+
+AC_DEFUN_ONCE([gl_SNPRINTF_TRUNCATION_C99],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_REQUIRE([gl_SNPRINTF_PRESENCE])
+ AC_CACHE_CHECK([whether snprintf truncates the result as in C99],
+ [gl_cv_func_snprintf_truncation_c99],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+ va_list args;
+ int ret;
+ va_start (args, format);
+ ret = vsnprintf (buf, size, format, args);
+ va_end (args);
+ return ret;
+}
+#endif
+static char buf[100];
+int main ()
+{
+ strcpy (buf, "ABCDEF");
+ my_snprintf (buf, 3, "%d %d", 4567, 89);
+ if (memcmp (buf, "45\0DEF", 6) != 0)
+ return 1;
+ return 0;
+}]])],
+ [gl_cv_func_snprintf_truncation_c99=yes],
+ [gl_cv_func_snprintf_truncation_c99=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on FreeBSD >= 5.
+ freebsd[1-4].*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ midnightbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on Mac OS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ darwin*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on OpenBSD >= 3.9.
+ openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
+ gl_cv_func_snprintf_truncation_c99="guessing no";;
+ openbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on Solaris >= 2.6.
+ solaris2.[0-5] | solaris2.[0-5].*)
+ gl_cv_func_snprintf_truncation_c99="guessing no";;
+ solaris*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on AIX >= 4.
+ aix[1-3]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ aix*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on HP-UX >= 11.
+ hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ hpux*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on IRIX >= 6.5.
+ irix6.5) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on OSF/1 >= 5.
+ osf[3-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ osf*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_snprintf_truncation_c99="guessing no";;
+ netbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_snprintf_truncation_c99="$gl_cross_guess_normal";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the return value of the snprintf function is the number
+dnl of bytes (excluding the terminating NUL) that would have been produced
+dnl if the buffer had been large enough. (ISO C99, POSIX:2001)
+dnl For example, this test program fails on IRIX 6.5:
+dnl ---------------------------------------------------------------------
+dnl #include <stdio.h>
+dnl int main()
+dnl {
+dnl static char buf[8];
+dnl int retval = snprintf (buf, 3, "%d", 12345);
+dnl return retval >= 0 && retval < 3;
+dnl }
+dnl ---------------------------------------------------------------------
+dnl Result is gl_cv_func_snprintf_retval_c99.
+
+AC_DEFUN_ONCE([gl_SNPRINTF_RETVAL_C99],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_REQUIRE([gl_SNPRINTF_PRESENCE])
+ AC_CACHE_CHECK([whether snprintf returns a byte count as in C99],
+ [gl_cv_func_snprintf_retval_c99],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+ va_list args;
+ int ret;
+ va_start (args, format);
+ ret = vsnprintf (buf, size, format, args);
+ va_end (args);
+ return ret;
+}
+#endif
+static char buf[100];
+int main ()
+{
+ strcpy (buf, "ABCDEF");
+ if (my_snprintf (buf, 3, "%d %d", 4567, 89) != 7)
+ return 1;
+ if (my_snprintf (buf, 0, "%d %d", 4567, 89) != 7)
+ return 2;
+ if (my_snprintf (NULL, 0, "%d %d", 4567, 89) != 7)
+ return 3;
+ return 0;
+}]])],
+ [gl_cv_func_snprintf_retval_c99=yes],
+ [gl_cv_func_snprintf_retval_c99=no],
+ [case "$host_os" in
+changequote(,)dnl
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on FreeBSD >= 5.
+ freebsd[1-4].*) gl_cv_func_snprintf_retval_c99="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ midnightbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on Mac OS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_snprintf_retval_c99="guessing no";;
+ darwin*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on OpenBSD >= 3.9.
+ openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
+ gl_cv_func_snprintf_retval_c99="guessing no";;
+ openbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on Solaris >= 2.10.
+ solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ solaris*) gl_cv_func_printf_sizes_c99="guessing no";;
+ # Guess yes on AIX >= 4.
+ aix[1-3]*) gl_cv_func_snprintf_retval_c99="guessing no";;
+ aix*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_snprintf_retval_c99="guessing no";;
+ netbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+changequote([,])dnl
+ # Guess yes on MSVC, no on mingw.
+ mingw*) AC_EGREP_CPP([Known], [
+#ifdef _MSC_VER
+ Known
+#endif
+ ],
+ [gl_cv_func_snprintf_retval_c99="guessing yes"],
+ [gl_cv_func_snprintf_retval_c99="guessing no"])
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_snprintf_retval_c99="$gl_cross_guess_normal";;
+ esac
+ ])
+ ])
+])
+
+dnl Test whether the snprintf function supports the %n format directive
+dnl also in truncated portions of the format string. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_snprintf_directive_n.
+
+AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_REQUIRE([gl_SNPRINTF_PRESENCE])
+ AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive],
+ [gl_cv_func_snprintf_directive_n],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+ va_list args;
+ int ret;
+ va_start (args, format);
+ ret = vsnprintf (buf, size, format, args);
+ va_end (args);
+ return ret;
+}
+#endif
+static char fmtstring[10];
+static char buf[100];
+int main ()
+{
+ int count = -1;
+ /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2)
+ support %n in format strings in read-only memory but not in writable
+ memory. */
+ strcpy (fmtstring, "%d %n");
+ my_snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55);
+ if (count != 6)
+ return 1;
+ return 0;
+}]])],
+ [gl_cv_func_snprintf_directive_n=yes],
+ [gl_cv_func_snprintf_directive_n=no],
+ [
+ case "$host_os" in
+ # Guess no on glibc when _FORTIFY_SOURCE >= 2.
+ *-gnu* | gnu*) AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if _FORTIFY_SOURCE >= 2
+ error fail
+ #endif
+ ]])],
+ [gl_cv_func_snprintf_directive_n="guessing yes"],
+ [gl_cv_func_snprintf_directive_n="guessing no"])
+ ;;
+changequote(,)dnl
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on FreeBSD >= 5.
+ freebsd[1-4].*) gl_cv_func_snprintf_directive_n="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ midnightbsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on Mac OS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_snprintf_directive_n="guessing no";;
+ darwin*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on Solaris >= 2.6.
+ solaris2.[0-5] | solaris2.[0-5].*)
+ gl_cv_func_snprintf_directive_n="guessing no";;
+ solaris*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on AIX >= 4.
+ aix[1-3]*) gl_cv_func_snprintf_directive_n="guessing no";;
+ aix*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on IRIX >= 6.5.
+ irix6.5) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on OSF/1 >= 5.
+ osf[3-4]*) gl_cv_func_snprintf_directive_n="guessing no";;
+ osf*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_snprintf_directive_n="guessing no";;
+ netbsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_snprintf_directive_n="guessing no";;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_snprintf_directive_n="guessing no";;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_snprintf_directive_n="$gl_cross_guess_normal";;
+changequote([,])dnl
+ esac
+ ])
+ ])
+])
+
+dnl Test whether the snprintf function, when passed a size = 1, writes any
+dnl output without bounds in this case, behaving like sprintf. This is the
+dnl case on Linux libc5.
+dnl Result is gl_cv_func_snprintf_size1.
+
+AC_DEFUN([gl_SNPRINTF_SIZE1],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_REQUIRE([gl_SNPRINTF_PRESENCE])
+ AC_CACHE_CHECK([whether snprintf respects a size of 1],
+ [gl_cv_func_snprintf_size1],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+ va_list args;
+ int ret;
+ va_start (args, format);
+ ret = vsnprintf (buf, size, format, args);
+ va_end (args);
+ return ret;
+}
+#endif
+int main()
+{
+ static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+ my_snprintf (buf, 1, "%d", 12345);
+ return buf[1] != 'E';
+}]])],
+ [gl_cv_func_snprintf_size1=yes],
+ [gl_cv_func_snprintf_size1=no],
+ [case "$host_os" in
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_snprintf_size1="guessing yes" ;;
+ *) gl_cv_func_snprintf_size1="guessing yes" ;;
+ esac
+ ])
+ ])
+])
+
+dnl Test whether the vsnprintf function, when passed a zero size, produces no
+dnl output. (ISO C99, POSIX:2001)
+dnl For example, snprintf nevertheless writes a NUL byte in this case
+dnl on OSF/1 5.1:
+dnl ---------------------------------------------------------------------
+dnl #include <stdio.h>
+dnl int main()
+dnl {
+dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+dnl snprintf (buf, 0, "%d", 12345);
+dnl return buf[0] != 'D';
+dnl }
+dnl ---------------------------------------------------------------------
+dnl And vsnprintf writes any output without bounds in this case, behaving like
+dnl vsprintf, on HP-UX 11 and OSF/1 5.1:
+dnl ---------------------------------------------------------------------
+dnl #include <stdarg.h>
+dnl #include <stdio.h>
+dnl static int my_snprintf (char *buf, int size, const char *format, ...)
+dnl {
+dnl va_list args;
+dnl int ret;
+dnl va_start (args, format);
+dnl ret = vsnprintf (buf, size, format, args);
+dnl va_end (args);
+dnl return ret;
+dnl }
+dnl int main()
+dnl {
+dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+dnl my_snprintf (buf, 0, "%d", 12345);
+dnl return buf[0] != 'D';
+dnl }
+dnl ---------------------------------------------------------------------
+dnl Result is gl_cv_func_vsnprintf_zerosize_c99.
+
+AC_DEFUN([gl_VSNPRINTF_ZEROSIZE_C99],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether vsnprintf respects a zero size as in C99],
+ [gl_cv_func_vsnprintf_zerosize_c99],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdarg.h>
+#include <stdio.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+ va_list args;
+ int ret;
+ va_start (args, format);
+ ret = vsnprintf (buf, size, format, args);
+ va_end (args);
+ return ret;
+}
+int main()
+{
+ static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+ my_snprintf (buf, 0, "%d", 12345);
+ return buf[0] != 'D';
+}]])],
+ [gl_cv_func_vsnprintf_zerosize_c99=yes],
+ [gl_cv_func_vsnprintf_zerosize_c99=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on FreeBSD >= 5.
+ freebsd[1-4].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ midnightbsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on Mac OS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+ darwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on Cygwin.
+ cygwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on Solaris >= 2.6.
+ solaris2.[0-5] | solaris2.[0-5].*)
+ gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+ solaris*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on AIX >= 4.
+ aix[1-3]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+ aix*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on IRIX >= 6.5.
+ irix6.5) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+ netbsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on native Windows.
+ mingw* | pw*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_vsnprintf_zerosize_c99="$gl_cross_guess_normal";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl The results of these tests on various platforms are:
+dnl
+dnl 1 = gl_PRINTF_SIZES_C99
+dnl 2 = gl_PRINTF_LONG_DOUBLE
+dnl 3 = gl_PRINTF_INFINITE
+dnl 4 = gl_PRINTF_INFINITE_LONG_DOUBLE
+dnl 5 = gl_PRINTF_DIRECTIVE_A
+dnl 6 = gl_PRINTF_DIRECTIVE_F
+dnl 7 = gl_PRINTF_DIRECTIVE_N
+dnl 8 = gl_PRINTF_DIRECTIVE_LS
+dnl 9 = gl_PRINTF_POSITIONS
+dnl 10 = gl_PRINTF_FLAG_GROUPING
+dnl 11 = gl_PRINTF_FLAG_LEFTADJUST
+dnl 12 = gl_PRINTF_FLAG_ZERO
+dnl 13 = gl_PRINTF_PRECISION
+dnl 14 = gl_PRINTF_ENOMEM
+dnl 15 = gl_SNPRINTF_PRESENCE
+dnl 16 = gl_SNPRINTF_TRUNCATION_C99
+dnl 17 = gl_SNPRINTF_RETVAL_C99
+dnl 18 = gl_SNPRINTF_DIRECTIVE_N
+dnl 19 = gl_SNPRINTF_SIZE1
+dnl 20 = gl_VSNPRINTF_ZEROSIZE_C99
+dnl
+dnl 1 = checking whether printf supports size specifiers as in C99...
+dnl 2 = checking whether printf supports 'long double' arguments...
+dnl 3 = checking whether printf supports infinite 'double' arguments...
+dnl 4 = checking whether printf supports infinite 'long double' arguments...
+dnl 5 = checking whether printf supports the 'a' and 'A' directives...
+dnl 6 = checking whether printf supports the 'F' directive...
+dnl 7 = checking whether printf supports the 'n' directive...
+dnl 8 = checking whether printf supports the 'ls' directive...
+dnl 9 = checking whether printf supports POSIX/XSI format strings with positions...
+dnl 10 = checking whether printf supports the grouping flag...
+dnl 11 = checking whether printf supports the left-adjust flag correctly...
+dnl 12 = checking whether printf supports the zero flag correctly...
+dnl 13 = checking whether printf supports large precisions...
+dnl 14 = checking whether printf survives out-of-memory conditions...
+dnl 15 = checking for snprintf...
+dnl 16 = checking whether snprintf truncates the result as in C99...
+dnl 17 = checking whether snprintf returns a byte count as in C99...
+dnl 18 = checking whether snprintf fully supports the 'n' directive...
+dnl 19 = checking whether snprintf respects a size of 1...
+dnl 20 = checking whether vsnprintf respects a zero size as in C99...
+dnl
+dnl . = yes, # = no.
+dnl
+dnl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
+dnl glibc 2.5 . . . . . . . . . . . . . . . . . . . .
+dnl glibc 2.3.6 . . . . # . . . . . . . . . . . . . . .
+dnl FreeBSD 13.0 . . . . # . . . . . . . . # . . . . . .
+dnl FreeBSD 5.4, 6.1 . . . . # . . . . . . # . # . . . . . .
+dnl Mac OS X 10.13.5 . . . # # . # . . . . . . . . . . # . .
+dnl Mac OS X 10.5.8 . . . # # . . . . . . # . . . . . . . .
+dnl Mac OS X 10.3.9 . . . . # . . . . . . # . # . . . . . .
+dnl OpenBSD 6.0, 6.7 . . . . # . . . . . . . . # . . . . . .
+dnl OpenBSD 3.9, 4.0 . . # # # # . # . # . # . # . . . . . .
+dnl Cygwin 1.7.0 (2009) . . . # . . . ? . . . . . ? . . . . . .
+dnl Cygwin 1.5.25 (2008) . . . # # . . # . . . . . # . . . . . .
+dnl Cygwin 1.5.19 (2006) # . . # # # . # . # . # # # . . . . . .
+dnl Solaris 11.4 . . # # # . . # . . . # . . . . . . . .
+dnl Solaris 11.3 . . . . # . . # . . . . . . . . . . . .
+dnl Solaris 11.0 . . # # # . . # . . . # . . . . . . . .
+dnl Solaris 10 . . # # # . . # . . . # # . . . . . . .
+dnl Solaris 2.6 ... 9 # . # # # # . # . . . # # . . . # . . .
+dnl Solaris 2.5.1 # . # # # # . # . . . # . . # # # # # #
+dnl AIX 7.1 . . # # # . . . . . . # # . . . . . . .
+dnl AIX 5.2 . . # # # . . . . . . # . . . . . . . .
+dnl AIX 4.3.2, 5.1 # . # # # # . . . . . # . . . . # . . .
+dnl HP-UX 11.31 . . . . # . . . . . . # . . . . # # . .
+dnl HP-UX 11.{00,11,23} # . . . # # . . . . . # . . . . # # . #
+dnl HP-UX 10.20 # . # . # # . ? . . # # . . . . # # ? #
+dnl IRIX 6.5 # . # # # # . # . . . # . . . . # . . .
+dnl OSF/1 5.1 # . # # # # . . . . . # . . . . # . . #
+dnl OSF/1 4.0d # . # # # # . . . . . # . . # # # # # #
+dnl NetBSD 9.0 . . . . # . . . . . . . . . . . . . . .
+dnl NetBSD 5.0 . . . # # . . . . . . # . # . . . . . .
+dnl NetBSD 4.0 . ? ? ? ? ? . ? . ? ? ? ? ? . . . ? ? ?
+dnl NetBSD 3.0 . . . . # # . ? # # ? # . # . . . . . .
+dnl Haiku . . . # # # . # . . . . . ? . . ? . . .
+dnl BeOS # # . # # # . ? # . ? . # ? . . ? . . .
+dnl Android 4.3 . . # # # # # # . # . # . # . . . # . .
+dnl old mingw / msvcrt # # # # # # . . # # . # # ? . # # # . .
+dnl MSVC 9 # # # # # # # . # # . # # ? # # # # . .
+dnl mingw 2009-2011 . # . # . . . . # # . . . ? . . . . . .
+dnl mingw-w64 2011 # # # # # # . . # # . # # ? . # # # . .
diff --git a/gnulib_m4/signbit.m4 b/gnulib_m4/signbit.m4
new file mode 100644
index 0000000..f957884
--- /dev/null
+++ b/gnulib_m4/signbit.m4
@@ -0,0 +1,393 @@
+# signbit.m4 serial 20
+dnl Copyright (C) 2007-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_SIGNBIT],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CACHE_CHECK([for signbit macro], [gl_cv_func_signbit],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <math.h>
+/* If signbit is defined as a function, don't use it, since calling it for
+ 'float' or 'long double' arguments would involve conversions.
+ If signbit is not declared at all but exists as a library function, don't
+ use it, since the prototype may not match.
+ If signbit is not declared at all but exists as a compiler built-in, don't
+ use it, since it's preferable to use __builtin_signbit* (no warnings,
+ no conversions). */
+#ifndef signbit
+# error "signbit should be a macro"
+#endif
+#include <string.h>
+]gl_SIGNBIT_TEST_PROGRAM
+])],
+ [gl_cv_func_signbit=yes],
+ [gl_cv_func_signbit=no],
+ [case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_signbit="guessing yes" ;;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_signbit="guessing yes" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_signbit="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_signbit="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ ])
+ dnl GCC >= 4.0 and clang provide three built-ins for signbit.
+ dnl They can be used without warnings, also in C++, regardless of <math.h>.
+ dnl But they may expand to calls to functions, which may or may not be in
+ dnl libc.
+ AC_CACHE_CHECK([for signbit compiler built-ins],
+ [gl_cv_func_signbit_builtins],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+# define signbit(x) \
+ (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \
+ sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \
+ __builtin_signbitf (x))
+#else
+# error "signbit should be three compiler built-ins"
+#endif
+#include <string.h>
+]gl_SIGNBIT_TEST_PROGRAM
+])],
+ [gl_cv_func_signbit_builtins=yes],
+ [gl_cv_func_signbit_builtins=no],
+ [case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_signbit_builtins="guessing yes" ;;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_signbit_builtins="guessing yes" ;;
+ # Guess yes on mingw, no on MSVC.
+ mingw*) if test -n "$GCC"; then
+ gl_cv_func_signbit_builtins="guessing yes"
+ else
+ gl_cv_func_signbit_builtins="guessing no"
+ fi
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_signbit_builtins="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ ])
+ dnl Use the compiler built-ins whenever possible, because they are more
+ dnl efficient than the system library functions (if they exist).
+ case "$gl_cv_func_signbit_builtins" in
+ *yes)
+ REPLACE_SIGNBIT_USING_BUILTINS=1
+ ;;
+ *)
+ case "$gl_cv_func_signbit" in
+ *yes) ;;
+ *)
+ dnl REPLACE_SIGNBIT=1 makes sure the signbit[fdl] functions get built.
+ REPLACE_SIGNBIT=1
+ ;;
+ esac
+ ;;
+ esac
+ dnl On Solaris 10, with CC in C++ mode, signbit is not available although
+ dnl is with cc in C mode. This cannot be worked around by defining
+ dnl _XOPEN_SOURCE=600, because the latter does not work in C++ mode on
+ dnl Solaris 11.0. Therefore use the replacement functions on Solaris.
+ case "$host_os" in
+ solaris*)
+ REPLACE_SIGNBIT=1
+ ;;
+ esac
+ if test $REPLACE_SIGNBIT = 1; then
+ gl_FLOAT_SIGN_LOCATION
+ gl_DOUBLE_SIGN_LOCATION
+ gl_LONG_DOUBLE_SIGN_LOCATION
+ if test "$gl_cv_cc_float_signbit" = unknown; then
+ dnl Test whether copysignf() is declared.
+ AC_CHECK_DECLS([copysignf], , , [[#include <math.h>]])
+ if test "$ac_cv_have_decl_copysignf" = yes; then
+ dnl Test whether copysignf() can be used without libm.
+ AC_CACHE_CHECK([whether copysignf can be used without linking with libm],
+ [gl_cv_func_copysignf_no_libm],
+ [
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <math.h>
+ float x, y;]],
+ [[return copysignf (x, y) < 0;]])],
+ [gl_cv_func_copysignf_no_libm=yes],
+ [gl_cv_func_copysignf_no_libm=no])
+ ])
+ if test $gl_cv_func_copysignf_no_libm = yes; then
+ AC_DEFINE([HAVE_COPYSIGNF_IN_LIBC], [1],
+ [Define if the copysignf function is declared in <math.h> and available in libc.])
+ fi
+ fi
+ fi
+ if test "$gl_cv_cc_double_signbit" = unknown; then
+ dnl Test whether copysign() is declared.
+ AC_CHECK_DECLS([copysign], , , [[#include <math.h>]])
+ if test "$ac_cv_have_decl_copysign" = yes; then
+ dnl Test whether copysign() can be used without libm.
+ AC_CACHE_CHECK([whether copysign can be used without linking with libm],
+ [gl_cv_func_copysign_no_libm],
+ [
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <math.h>
+ double x, y;]],
+ [[return copysign (x, y) < 0;]])],
+ [gl_cv_func_copysign_no_libm=yes],
+ [gl_cv_func_copysign_no_libm=no])
+ ])
+ if test $gl_cv_func_copysign_no_libm = yes; then
+ AC_DEFINE([HAVE_COPYSIGN_IN_LIBC], [1],
+ [Define if the copysign function is declared in <math.h> and available in libc.])
+ fi
+ fi
+ fi
+ if test "$gl_cv_cc_long_double_signbit" = unknown; then
+ dnl Test whether copysignl() is declared.
+ AC_CHECK_DECLS([copysignl], , , [[#include <math.h>]])
+ if test "$ac_cv_have_decl_copysignl" = yes; then
+ dnl Test whether copysignl() can be used without libm.
+ AC_CACHE_CHECK([whether copysignl can be used without linking with libm],
+ [gl_cv_func_copysignl_no_libm],
+ [
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <math.h>
+ long double x, y;]],
+ [[return copysignl (x, y) < 0;]])],
+ [gl_cv_func_copysignl_no_libm=yes],
+ [gl_cv_func_copysignl_no_libm=no])
+ ])
+ if test $gl_cv_func_copysignl_no_libm = yes; then
+ AC_DEFINE([HAVE_COPYSIGNL_IN_LIBC], [1],
+ [Define if the copysignl function is declared in <math.h> and available in libc.])
+ fi
+ fi
+ fi
+ fi
+])
+
+AC_DEFUN([gl_SIGNBIT_TEST_PROGRAM], [[
+/* Global variables.
+ Needed because GCC 4 constant-folds __builtin_signbitl (literal)
+ but cannot constant-fold __builtin_signbitl (variable). */
+float vf;
+double vd;
+long double vl;
+int main ()
+{
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+ So we use -p0f and -p0d instead. */
+float p0f = 0.0f;
+float m0f = -p0f;
+double p0d = 0.0;
+double m0d = -p0d;
+/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
+ So we use another constant expression instead.
+ But that expression does not work on other platforms, such as when
+ cross-compiling to PowerPC on Mac OS X 10.5. */
+long double p0l = 0.0L;
+#if defined __hpux || defined __sgi
+long double m0l = -LDBL_MIN * LDBL_MIN;
+#else
+long double m0l = -p0l;
+#endif
+ int result = 0;
+ if (signbit (vf)) /* link check */
+ vf++;
+ {
+ float plus_inf = 1.0f / p0f;
+ float minus_inf = -1.0f / p0f;
+ if (!(!signbit (255.0f)
+ && signbit (-255.0f)
+ && !signbit (p0f)
+ && (memcmp (&m0f, &p0f, sizeof (float)) == 0 || signbit (m0f))
+ && !signbit (plus_inf)
+ && signbit (minus_inf)))
+ result |= 1;
+ }
+ if (signbit (vd)) /* link check */
+ vd++;
+ {
+ double plus_inf = 1.0 / p0d;
+ double minus_inf = -1.0 / p0d;
+ if (!(!signbit (255.0)
+ && signbit (-255.0)
+ && !signbit (p0d)
+ && (memcmp (&m0d, &p0d, sizeof (double)) == 0 || signbit (m0d))
+ && !signbit (plus_inf)
+ && signbit (minus_inf)))
+ result |= 2;
+ }
+ if (signbit (vl)) /* link check */
+ vl++;
+ {
+ long double plus_inf = 1.0L / p0l;
+ long double minus_inf = -1.0L / p0l;
+ if (signbit (255.0L))
+ result |= 4;
+ if (!signbit (-255.0L))
+ result |= 4;
+ if (signbit (p0l))
+ result |= 8;
+ if (!(memcmp (&m0l, &p0l, sizeof (long double)) == 0 || signbit (m0l)))
+ result |= 16;
+ if (signbit (plus_inf))
+ result |= 32;
+ if (!signbit (minus_inf))
+ result |= 64;
+ }
+ return result;
+}
+]])
+
+AC_DEFUN([gl_FLOAT_SIGN_LOCATION],
+[
+ gl_FLOATTYPE_SIGN_LOCATION([float], [gl_cv_cc_float_signbit], [f], [FLT])
+])
+
+AC_DEFUN([gl_DOUBLE_SIGN_LOCATION],
+[
+ gl_FLOATTYPE_SIGN_LOCATION([double], [gl_cv_cc_double_signbit], [], [DBL])
+])
+
+AC_DEFUN([gl_LONG_DOUBLE_SIGN_LOCATION],
+[
+ gl_FLOATTYPE_SIGN_LOCATION([long double], [gl_cv_cc_long_double_signbit], [L], [LDBL])
+])
+
+AC_DEFUN([gl_FLOATTYPE_SIGN_LOCATION],
+[
+ AC_CACHE_CHECK([where to find the sign bit in a '$1'],
+ [$2],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stddef.h>
+#include <stdio.h>
+#define NWORDS \
+ ((sizeof ($1) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { $1 value; unsigned int word[NWORDS]; }
+ memory_float;
+static memory_float plus = { 1.0$3 };
+static memory_float minus = { -1.0$3 };
+int main ()
+{
+ size_t j, k, i;
+ unsigned int m;
+ FILE *fp = fopen ("conftest.out", "w");
+ if (fp == NULL)
+ return 1;
+ /* Find the different bit. */
+ k = 0; m = 0;
+ for (j = 0; j < NWORDS; j++)
+ {
+ unsigned int x = plus.word[j] ^ minus.word[j];
+ if ((x & (x - 1)) || (x && m))
+ {
+ /* More than one bit difference. */
+ fprintf (fp, "unknown");
+ fclose (fp);
+ return 2;
+ }
+ if (x)
+ {
+ k = j;
+ m = x;
+ }
+ }
+ if (m == 0)
+ {
+ /* No difference. */
+ fprintf (fp, "unknown");
+ fclose (fp);
+ return 3;
+ }
+ /* Now m = plus.word[k] ^ ~minus.word[k]. */
+ if (plus.word[k] & ~minus.word[k])
+ {
+ /* Oh? The sign bit is set in the positive and cleared in the negative
+ numbers? */
+ fprintf (fp, "unknown");
+ fclose (fp);
+ return 4;
+ }
+ for (i = 0; ; i++)
+ if ((m >> i) & 1)
+ break;
+ fprintf (fp, "word %d bit %d", (int) k, (int) i);
+ if (fclose (fp) != 0)
+ return 5;
+ return 0;
+}
+ ]])],
+ [$2=`cat conftest.out`],
+ [$2="unknown"],
+ [
+ dnl When cross-compiling, we don't know. It depends on the
+ dnl ABI and compiler version. There are too many cases.
+ $2="unknown"
+ ])
+ rm -f conftest.out
+ ])
+ case "$]$2[" in
+ word*bit*)
+ word=`echo "$]$2[" | sed -e 's/word //' -e 's/ bit.*//'`
+ bit=`echo "$]$2[" | sed -e 's/word.*bit //'`
+ AC_DEFINE_UNQUOTED([$4][_SIGNBIT_WORD], [$word],
+ [Define as the word index where to find the sign of '$1'.])
+ AC_DEFINE_UNQUOTED([$4][_SIGNBIT_BIT], [$bit],
+ [Define as the bit index in the word where to find the sign of '$1'.])
+ ;;
+ esac
+])
+
+# Expands to code that defines a function signbitf(float).
+# It extracts the sign bit of a non-NaN value.
+AC_DEFUN([gl_FLOAT_SIGNBIT_CODE],
+[
+ gl_FLOATTYPE_SIGNBIT_CODE([float], [f], [f])
+])
+
+# Expands to code that defines a function signbitd(double).
+# It extracts the sign bit of a non-NaN value.
+AC_DEFUN([gl_DOUBLE_SIGNBIT_CODE],
+[
+ gl_FLOATTYPE_SIGNBIT_CODE([double], [d], [])
+])
+
+# Expands to code that defines a function signbitl(long double).
+# It extracts the sign bit of a non-NaN value.
+AC_DEFUN([gl_LONG_DOUBLE_SIGNBIT_CODE],
+[
+ gl_FLOATTYPE_SIGNBIT_CODE([long double], [l], [L])
+])
+
+AC_DEFUN([gl_FLOATTYPE_SIGNBIT_CODE],
+[[
+static int
+signbit$2 ($1 value)
+{
+ typedef union { $1 f; unsigned char b[sizeof ($1)]; } float_union;
+ static float_union plus_one = { 1.0$3 }; /* unused bits are zero here */
+ static float_union minus_one = { -1.0$3 }; /* unused bits are zero here */
+ /* Compute the sign bit mask as the XOR of plus_one and minus_one. */
+ float_union u;
+ unsigned int i;
+ u.f = value;
+ for (i = 0; i < sizeof ($1); i++)
+ if (u.b[i] & (plus_one.b[i] ^ minus_one.b[i]))
+ return 1;
+ return 0;
+}
+]])
diff --git a/gnulib_m4/size_max.m4 b/gnulib_m4/size_max.m4
new file mode 100644
index 0000000..0763366
--- /dev/null
+++ b/gnulib_m4/size_max.m4
@@ -0,0 +1,75 @@
+# size_max.m4 serial 12
+dnl Copyright (C) 2003, 2005-2006, 2008-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_PREREQ([2.61])
+
+AC_DEFUN([gl_SIZE_MAX],
+[
+ AC_CHECK_HEADERS([stdint.h])
+ dnl First test whether the system already has SIZE_MAX.
+ AC_CACHE_CHECK([for SIZE_MAX], [gl_cv_size_max], [
+ gl_cv_size_max=no
+ AC_EGREP_CPP([Found it], [
+#include <limits.h>
+#if HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef SIZE_MAX
+Found it
+#endif
+], [gl_cv_size_max=yes])
+ if test $gl_cv_size_max != yes; then
+ dnl Define it ourselves. Here we assume that the type 'size_t' is not wider
+ dnl than the type 'unsigned long'. Try hard to find a definition that can
+ dnl be used in a preprocessor #if, i.e. doesn't contain a cast.
+ AC_COMPUTE_INT([size_t_bits_minus_1], [sizeof (size_t) * CHAR_BIT - 1],
+ [#include <stddef.h>
+#include <limits.h>], [size_t_bits_minus_1=])
+ AC_COMPUTE_INT([fits_in_uint], [sizeof (size_t) <= sizeof (unsigned int)],
+ [#include <stddef.h>], [fits_in_uint=])
+ if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then
+ if test $fits_in_uint = 1; then
+ dnl Even though SIZE_MAX fits in an unsigned int, it must be of type
+ dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stddef.h>
+ extern size_t foo;
+ extern unsigned long foo;
+ ]],
+ [[]])],
+ [fits_in_uint=0])
+ fi
+ dnl We cannot use 'expr' to simplify this expression, because 'expr'
+ dnl works only with 'long' integers in the host environment, while we
+ dnl might be cross-compiling from a 32-bit platform to a 64-bit platform.
+ if test $fits_in_uint = 1; then
+ gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)"
+ else
+ gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)"
+ fi
+ else
+ dnl Shouldn't happen, but who knows...
+ gl_cv_size_max='((size_t)~(size_t)0)'
+ fi
+ fi
+ ])
+ if test "$gl_cv_size_max" != yes; then
+ AC_DEFINE_UNQUOTED([SIZE_MAX], [$gl_cv_size_max],
+ [Define as the maximum value of type 'size_t', if the system doesn't define it.])
+ fi
+ dnl Don't redefine SIZE_MAX in config.h if config.h is re-included after
+ dnl <stdint.h>. Remember that the #undef in AH_VERBATIM gets replaced with
+ dnl #define by AC_DEFINE_UNQUOTED.
+ AH_VERBATIM([SIZE_MAX],
+[/* Define as the maximum value of type 'size_t', if the system doesn't define
+ it. */
+#ifndef SIZE_MAX
+# undef SIZE_MAX
+#endif])
+])
diff --git a/gnulib_m4/snprintf.m4 b/gnulib_m4/snprintf.m4
new file mode 100644
index 0000000..4b5fbdb
--- /dev/null
+++ b/gnulib_m4/snprintf.m4
@@ -0,0 +1,62 @@
+# snprintf.m4 serial 7
+dnl Copyright (C) 2002-2004, 2007-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Libintl 0.17 will replace snprintf only if it does not support %1$s,
+dnl but defers to any gnulib snprintf replacements. Therefore, gnulib
+dnl must guarantee that the decision for replacing snprintf is a superset
+dnl of the reasons checked by libintl.
+AC_DEFUN([gl_FUNC_SNPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ gl_cv_func_snprintf_usable=no
+ AC_CHECK_FUNCS([snprintf])
+ if test $ac_cv_func_snprintf = yes; then
+ gl_SNPRINTF_SIZE1
+ case "$gl_cv_func_snprintf_size1" in
+ *yes)
+ gl_SNPRINTF_RETVAL_C99
+ case "$gl_cv_func_snprintf_retval_c99" in
+ *yes)
+ gl_PRINTF_POSITIONS
+ case "$gl_cv_func_printf_positions" in
+ *yes)
+ gl_cv_func_snprintf_usable=yes
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ if test $gl_cv_func_snprintf_usable = no; then
+ gl_REPLACE_SNPRINTF
+ fi
+ AC_CHECK_DECLS_ONCE([snprintf])
+ if test $ac_cv_have_decl_snprintf = no; then
+ HAVE_DECL_SNPRINTF=0
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_SNPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_LIBOBJ([snprintf])
+ if test $ac_cv_func_snprintf = yes; then
+ REPLACE_SNPRINTF=1
+ else
+ AC_CHECK_DECLS_ONCE([snprintf])
+ if test $ac_cv_have_decl_snprintf = yes; then
+ dnl If the function is declared but does not appear to exist, it may be
+ dnl defined as an inline function. In order to avoid a conflict, we have
+ dnl to define rpl_snprintf, not snprintf.
+ REPLACE_SNPRINTF=1
+ fi
+ fi
+ gl_PREREQ_SNPRINTF
+])
+
+# Prerequisites of lib/snprintf.c.
+AC_DEFUN([gl_PREREQ_SNPRINTF], [:])
diff --git a/gnulib_m4/ssize_t.m4 b/gnulib_m4/ssize_t.m4
new file mode 100644
index 0000000..1c12c33
--- /dev/null
+++ b/gnulib_m4/ssize_t.m4
@@ -0,0 +1,23 @@
+# ssize_t.m4 serial 5 (gettext-0.18.2)
+dnl Copyright (C) 2001-2003, 2006, 2010-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether ssize_t is defined.
+
+AC_DEFUN([gt_TYPE_SSIZE_T],
+[
+ AC_CACHE_CHECK([for ssize_t], [gt_cv_ssize_t],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/types.h>]],
+ [[int x = sizeof (ssize_t *) + sizeof (ssize_t);
+ return !x;]])],
+ [gt_cv_ssize_t=yes], [gt_cv_ssize_t=no])])
+ if test $gt_cv_ssize_t = no; then
+ AC_DEFINE([ssize_t], [int],
+ [Define as a signed type of the same size as size_t.])
+ fi
+])
diff --git a/gnulib_m4/stdbool.m4 b/gnulib_m4/stdbool.m4
new file mode 100644
index 0000000..d4d54d0
--- /dev/null
+++ b/gnulib_m4/stdbool.m4
@@ -0,0 +1,118 @@
+# Check for stdbool.h that conforms to C99.
+
+dnl Copyright (C) 2002-2006, 2009-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+#serial 10
+
+# Prepare for substituting <stdbool.h> if it is not supported.
+
+AC_DEFUN([gl_STDBOOL_H],
+[
+ AC_REQUIRE([AC_CHECK_HEADER_STDBOOL])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+
+ dnl On some platforms, <stdbool.h> does not exist or does not conform to C99.
+ dnl On Solaris 10 with CC=cc CXX=CC, <stdbool.h> exists but is not usable
+ dnl in C++ mode (and no <cstdbool> exists). In this case, we use our
+ dnl replacement, also in C mode (for binary compatibility between C and C++).
+ if test "$ac_cv_header_stdbool_h" = yes; then
+ case "$host_os" in
+ solaris*)
+ if test -z "$GCC"; then
+ GL_GENERATE_STDBOOL_H=true
+ else
+ GL_GENERATE_STDBOOL_H=false
+ fi
+ ;;
+ *)
+ GL_GENERATE_STDBOOL_H=false
+ ;;
+ esac
+ else
+ GL_GENERATE_STDBOOL_H=true
+ fi
+
+ if test "$ac_cv_type__Bool" = yes; then
+ HAVE__BOOL=1
+ else
+ HAVE__BOOL=0
+ fi
+ AC_SUBST([HAVE__BOOL])
+])
+
+m4_version_prereq([2.72], [], [
+
+AC_DEFUN([AC_CHECK_HEADER_STDBOOL],
+ [AC_CHECK_TYPES([_Bool])
+ AC_CACHE_CHECK([for stdbool.h that conforms to C99 or later],
+ [ac_cv_header_stdbool_h],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdbool.h>
+
+ /* "true" and "false" should be usable in #if expressions and
+ integer constant expressions, and "bool" should be a valid
+ type name.
+
+ Although C99 requires bool, true, and false to be macros,
+ C23 and C++11 overrule that, so do not test for that.
+ Although C99 requires __bool_true_false_are_defined and
+ _Bool, C23 says they are obsolescent, so do not require
+ them. */
+
+ #if !true
+ #error "'true' is not true"
+ #endif
+ #if true != 1
+ #error "'true' is not equal to 1"
+ #endif
+ char b[true == 1 ? 1 : -1];
+ char c[true];
+
+ #if false
+ #error "'false' is not false"
+ #endif
+ #if false != 0
+ #error "'false' is not equal to 0"
+ #endif
+ char d[false == 0 ? 1 : -1];
+
+ enum { e = false, f = true, g = false * true, h = true * 256 };
+
+ char i[(bool) 0.5 == true ? 1 : -1];
+ char j[(bool) 0.0 == false ? 1 : -1];
+ char k[sizeof (bool) > 0 ? 1 : -1];
+
+ struct sb { bool s: 1; bool t; } s;
+ char l[sizeof s.t > 0 ? 1 : -1];
+
+ /* The following fails for
+ HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */
+ bool m[h];
+ char n[sizeof m == h * sizeof m[0] ? 1 : -1];
+ char o[-1 - (bool) 0 < 0 ? 1 : -1];
+ /* Catch a bug in an HP-UX C compiler. See
+ https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+ https://lists.gnu.org/r/bug-coreutils/2005-11/msg00161.html
+ */
+ bool p = true;
+ bool *pp = &p;
+ ]],
+ [[
+ bool ps = &s;
+ *pp |= p;
+ *pp |= ! p;
+
+ /* Refer to every declared value, so they cannot be
+ discarded as unused. */
+ return (!b + !c + !d + !e + !f + !g + !h + !i + !j + !k
+ + !l + !m + !n + !o + !p + !pp + !ps);
+ ]])],
+ [ac_cv_header_stdbool_h=yes],
+ [ac_cv_header_stdbool_h=no])])
+])# AC_CHECK_HEADER_STDBOOL
+
+]) # m4_version_prereq 2.72
diff --git a/gnulib_m4/stddef_h.m4 b/gnulib_m4/stddef_h.m4
new file mode 100644
index 0000000..a2322eb
--- /dev/null
+++ b/gnulib_m4/stddef_h.m4
@@ -0,0 +1,104 @@
+# stddef_h.m4 serial 13
+dnl Copyright (C) 2009-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl A placeholder for <stddef.h>, for platforms that have issues.
+
+AC_DEFUN_ONCE([gl_STDDEF_H],
+[
+ AC_REQUIRE([gl_STDDEF_H_DEFAULTS])
+ AC_REQUIRE([gt_TYPE_WCHAR_T])
+
+ dnl Persuade OpenBSD <stddef.h> to declare max_align_t.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ GL_GENERATE_STDDEF_H=false
+
+ dnl Test whether the type max_align_t exists and whether its alignment
+ dnl "is as great as is supported by the implementation in all contexts".
+ AC_CACHE_CHECK([for good max_align_t],
+ [gl_cv_type_max_align_t],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[/* On FreeBSD 12.0/x86, max_align_t defined by <stddef.h> has
+ the correct alignment with the default (wrong) definition of
+ _Alignof, but a wrong alignment as soon as we activate an
+ ISO C compliant _Alignof definition. */
+ #if ((defined __GNUC__ && 4 <= __GNUC__) || defined __clang__) && !defined __cplusplus
+ #define _Alignof(type) __builtin_offsetof (struct { char __a; type __b; }, __b)
+ #endif
+ #include <stddef.h>
+ unsigned int s = sizeof (max_align_t);
+ #if defined __GNUC__ || defined __clang__ || defined __IBM__ALIGNOF__
+ int check1[2 * (__alignof__ (double) <= __alignof__ (max_align_t)) - 1];
+ int check2[2 * (__alignof__ (long double) <= __alignof__ (max_align_t)) - 1];
+ #endif
+ typedef struct { char a; max_align_t b; } max_helper;
+ typedef struct { char a; long b; } long_helper;
+ typedef struct { char a; double b; } double_helper;
+ typedef struct { char a; long double b; } long_double_helper;
+ int check3[2 * (offsetof (long_helper, b) <= offsetof (max_helper, b)) - 1];
+ int check4[2 * (offsetof (double_helper, b) <= offsetof (max_helper, b)) - 1];
+ int check5[2 * (offsetof (long_double_helper, b) <= offsetof (max_helper, b)) - 1];
+ ]])],
+ [gl_cv_type_max_align_t=yes],
+ [gl_cv_type_max_align_t=no])
+ ])
+ if test $gl_cv_type_max_align_t = no; then
+ HAVE_MAX_ALIGN_T=0
+ GL_GENERATE_STDDEF_H=true
+ fi
+
+ if test $gt_cv_c_wchar_t = no; then
+ HAVE_WCHAR_T=0
+ GL_GENERATE_STDDEF_H=true
+ fi
+
+ AC_CACHE_CHECK([whether NULL can be used in arbitrary expressions],
+ [gl_cv_decl_null_works],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stddef.h>
+ int test[2 * (sizeof NULL == sizeof (void *)) -1];
+]])],
+ [gl_cv_decl_null_works=yes],
+ [gl_cv_decl_null_works=no])])
+ if test $gl_cv_decl_null_works = no; then
+ REPLACE_NULL=1
+ GL_GENERATE_STDDEF_H=true
+ fi
+
+ if $GL_GENERATE_STDDEF_H; then
+ gl_NEXT_HEADERS([stddef.h])
+ fi
+])
+
+# gl_STDDEF_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
+AC_DEFUN([gl_STDDEF_MODULE_INDICATOR],
+[
+ dnl Ensure to expand the default settings once only.
+ gl_STDDEF_H_REQUIRE_DEFAULTS
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+])
+
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd. It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_STDDEF_H_REQUIRE_DEFAULTS],
+[
+ m4_defun(GL_MODULE_INDICATOR_PREFIX[_STDDEF_H_MODULE_INDICATOR_DEFAULTS], [
+ ])
+ m4_require(GL_MODULE_INDICATOR_PREFIX[_STDDEF_H_MODULE_INDICATOR_DEFAULTS])
+ AC_REQUIRE([gl_STDDEF_H_DEFAULTS])
+])
+
+AC_DEFUN([gl_STDDEF_H_DEFAULTS],
+[
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ REPLACE_NULL=0; AC_SUBST([REPLACE_NULL])
+ HAVE_MAX_ALIGN_T=1; AC_SUBST([HAVE_MAX_ALIGN_T])
+ HAVE_WCHAR_T=1; AC_SUBST([HAVE_WCHAR_T])
+])
diff --git a/gnulib_m4/stdint.m4 b/gnulib_m4/stdint.m4
new file mode 100644
index 0000000..d6961b0
--- /dev/null
+++ b/gnulib_m4/stdint.m4
@@ -0,0 +1,531 @@
+# stdint.m4 serial 61
+dnl Copyright (C) 2001-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert and Bruno Haible.
+dnl Test whether <stdint.h> is supported or must be substituted.
+
+AC_PREREQ([2.61])
+
+AC_DEFUN_ONCE([gl_STDINT_H],
+[
+ AC_PREREQ([2.59])dnl
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ AC_REQUIRE([gl_LIMITS_H])
+ AC_REQUIRE([gt_TYPE_WINT_T])
+
+ dnl For backward compatibility. Some packages may still be testing these
+ dnl macros.
+ AC_DEFINE([HAVE_LONG_LONG_INT], [1],
+ [Define to 1 if the system has the type 'long long int'.])
+ AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1],
+ [Define to 1 if the system has the type 'unsigned long long int'.])
+
+ dnl Check for <wchar.h>, in the same way as gl_WCHAR_H does.
+ AC_CHECK_HEADERS_ONCE([wchar.h])
+ if test $ac_cv_header_wchar_h = yes; then
+ HAVE_WCHAR_H=1
+ else
+ HAVE_WCHAR_H=0
+ fi
+ AC_SUBST([HAVE_WCHAR_H])
+
+ dnl Check for <inttypes.h>.
+ AC_CHECK_HEADERS_ONCE([inttypes.h])
+ if test $ac_cv_header_inttypes_h = yes; then
+ HAVE_INTTYPES_H=1
+ else
+ HAVE_INTTYPES_H=0
+ fi
+ AC_SUBST([HAVE_INTTYPES_H])
+
+ dnl Check for <sys/types.h>.
+ AC_CHECK_HEADERS_ONCE([sys/types.h])
+ if test $ac_cv_header_sys_types_h = yes; then
+ HAVE_SYS_TYPES_H=1
+ else
+ HAVE_SYS_TYPES_H=0
+ fi
+ AC_SUBST([HAVE_SYS_TYPES_H])
+
+ gl_CHECK_NEXT_HEADERS([stdint.h])
+ if test $ac_cv_header_stdint_h = yes; then
+ HAVE_STDINT_H=1
+ else
+ HAVE_STDINT_H=0
+ fi
+ AC_SUBST([HAVE_STDINT_H])
+
+ dnl Now see whether we need a substitute <stdint.h>.
+ if test $ac_cv_header_stdint_h = yes; then
+ AC_CACHE_CHECK([whether stdint.h conforms to C99],
+ [gl_cv_header_working_stdint_h],
+ [gl_cv_header_working_stdint_h=no
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([[
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#define __STDC_CONSTANT_MACROS 1
+#define __STDC_LIMIT_MACROS 1
+#include <stdint.h>
+/* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in <wchar.h>. */
+#if !(defined WCHAR_MIN && defined WCHAR_MAX)
+#error "WCHAR_MIN, WCHAR_MAX not defined in <stdint.h>"
+#endif
+]
+gl_STDINT_INCLUDES
+[
+#ifdef INT8_MAX
+int8_t a1 = INT8_MAX;
+int8_t a1min = INT8_MIN;
+#endif
+#ifdef INT16_MAX
+int16_t a2 = INT16_MAX;
+int16_t a2min = INT16_MIN;
+#endif
+#ifdef INT32_MAX
+int32_t a3 = INT32_MAX;
+int32_t a3min = INT32_MIN;
+#endif
+#ifdef INT64_MAX
+int64_t a4 = INT64_MAX;
+int64_t a4min = INT64_MIN;
+#endif
+#ifdef UINT8_MAX
+uint8_t b1 = UINT8_MAX;
+#else
+typedef int b1[(unsigned char) -1 != 255 ? 1 : -1];
+#endif
+#ifdef UINT16_MAX
+uint16_t b2 = UINT16_MAX;
+#endif
+#ifdef UINT32_MAX
+uint32_t b3 = UINT32_MAX;
+#endif
+#ifdef UINT64_MAX
+uint64_t b4 = UINT64_MAX;
+#endif
+int_least8_t c1 = INT8_C (0x7f);
+int_least8_t c1max = INT_LEAST8_MAX;
+int_least8_t c1min = INT_LEAST8_MIN;
+int_least16_t c2 = INT16_C (0x7fff);
+int_least16_t c2max = INT_LEAST16_MAX;
+int_least16_t c2min = INT_LEAST16_MIN;
+int_least32_t c3 = INT32_C (0x7fffffff);
+int_least32_t c3max = INT_LEAST32_MAX;
+int_least32_t c3min = INT_LEAST32_MIN;
+int_least64_t c4 = INT64_C (0x7fffffffffffffff);
+int_least64_t c4max = INT_LEAST64_MAX;
+int_least64_t c4min = INT_LEAST64_MIN;
+uint_least8_t d1 = UINT8_C (0xff);
+uint_least8_t d1max = UINT_LEAST8_MAX;
+uint_least16_t d2 = UINT16_C (0xffff);
+uint_least16_t d2max = UINT_LEAST16_MAX;
+uint_least32_t d3 = UINT32_C (0xffffffff);
+uint_least32_t d3max = UINT_LEAST32_MAX;
+uint_least64_t d4 = UINT64_C (0xffffffffffffffff);
+uint_least64_t d4max = UINT_LEAST64_MAX;
+int_fast8_t e1 = INT_FAST8_MAX;
+int_fast8_t e1min = INT_FAST8_MIN;
+int_fast16_t e2 = INT_FAST16_MAX;
+int_fast16_t e2min = INT_FAST16_MIN;
+int_fast32_t e3 = INT_FAST32_MAX;
+int_fast32_t e3min = INT_FAST32_MIN;
+int_fast64_t e4 = INT_FAST64_MAX;
+int_fast64_t e4min = INT_FAST64_MIN;
+uint_fast8_t f1 = UINT_FAST8_MAX;
+uint_fast16_t f2 = UINT_FAST16_MAX;
+uint_fast32_t f3 = UINT_FAST32_MAX;
+uint_fast64_t f4 = UINT_FAST64_MAX;
+#ifdef INTPTR_MAX
+intptr_t g = INTPTR_MAX;
+intptr_t gmin = INTPTR_MIN;
+#endif
+#ifdef UINTPTR_MAX
+uintptr_t h = UINTPTR_MAX;
+#endif
+intmax_t i = INTMAX_MAX;
+uintmax_t j = UINTMAX_MAX;
+
+/* Check that SIZE_MAX has the correct type, if possible. */
+#if 201112 <= __STDC_VERSION__
+int k = _Generic (SIZE_MAX, size_t: 0);
+#elif (2 <= __GNUC__ || 4 <= __clang_major__ || defined __IBM__TYPEOF__ \
+ || (0x5110 <= __SUNPRO_C && !__STDC__))
+extern size_t k;
+extern __typeof__ (SIZE_MAX) k;
+#endif
+
+#include <limits.h> /* for CHAR_BIT */
+#define TYPE_MINIMUM(t) \
+ ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t)))
+#define TYPE_MAXIMUM(t) \
+ ((t) ((t) 0 < (t) -1 \
+ ? (t) -1 \
+ : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
+struct s {
+ int check_PTRDIFF:
+ PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t)
+ && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t)
+ ? 1 : -1;
+ /* Detect bug in FreeBSD 6.0/ia64 and FreeBSD 13.0/arm64. */
+ int check_SIG_ATOMIC:
+ SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t)
+ && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t)
+ ? 1 : -1;
+ int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1;
+ int check_WCHAR:
+ WCHAR_MIN == TYPE_MINIMUM (wchar_t)
+ && WCHAR_MAX == TYPE_MAXIMUM (wchar_t)
+ ? 1 : -1;
+ /* Detect bug in mingw. */
+ int check_WINT:
+ WINT_MIN == TYPE_MINIMUM (wint_t)
+ && WINT_MAX == TYPE_MAXIMUM (wint_t)
+ ? 1 : -1;
+
+ /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others. */
+ int check_UINT8_C:
+ (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1;
+ int check_UINT16_C:
+ (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1;
+
+ /* Detect bugs in OpenBSD 3.9 stdint.h. */
+#ifdef UINT8_MAX
+ int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1;
+#endif
+#ifdef UINT16_MAX
+ int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1;
+#endif
+#ifdef UINT32_MAX
+ int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1;
+#endif
+#ifdef UINT64_MAX
+ int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1;
+#endif
+ int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1;
+ int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1;
+ int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1;
+ int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1;
+ int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1;
+ int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1;
+ int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1;
+ int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1;
+ int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1;
+ int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1;
+ int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1;
+};
+ ]])],
+ [dnl Determine whether the various *_MIN, *_MAX macros are usable
+ dnl in preprocessor expression. We could do it by compiling a test
+ dnl program for each of these macros. It is faster to run a program
+ dnl that inspects the macro expansion.
+ dnl This detects a bug on HP-UX 11.23/ia64.
+ AC_RUN_IFELSE([
+ AC_LANG_PROGRAM([[
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#define __STDC_CONSTANT_MACROS 1
+#define __STDC_LIMIT_MACROS 1
+#include <stdint.h>
+]
+gl_STDINT_INCLUDES
+[
+#include <stdio.h>
+#include <string.h>
+#define MVAL(macro) MVAL1(macro)
+#define MVAL1(expression) #expression
+static const char *macro_values[] =
+ {
+#ifdef INT8_MAX
+ MVAL (INT8_MAX),
+#endif
+#ifdef INT16_MAX
+ MVAL (INT16_MAX),
+#endif
+#ifdef INT32_MAX
+ MVAL (INT32_MAX),
+#endif
+#ifdef INT64_MAX
+ MVAL (INT64_MAX),
+#endif
+#ifdef UINT8_MAX
+ MVAL (UINT8_MAX),
+#endif
+#ifdef UINT16_MAX
+ MVAL (UINT16_MAX),
+#endif
+#ifdef UINT32_MAX
+ MVAL (UINT32_MAX),
+#endif
+#ifdef UINT64_MAX
+ MVAL (UINT64_MAX),
+#endif
+ NULL
+ };
+]], [[
+ const char **mv;
+ for (mv = macro_values; *mv != NULL; mv++)
+ {
+ const char *value = *mv;
+ /* Test whether it looks like a cast expression. */
+ if (strncmp (value, "((unsigned int)"/*)*/, 15) == 0
+ || strncmp (value, "((unsigned short)"/*)*/, 17) == 0
+ || strncmp (value, "((unsigned char)"/*)*/, 16) == 0
+ || strncmp (value, "((int)"/*)*/, 6) == 0
+ || strncmp (value, "((signed short)"/*)*/, 15) == 0
+ || strncmp (value, "((signed char)"/*)*/, 14) == 0)
+ return mv - macro_values + 1;
+ }
+ return 0;
+]])],
+ [gl_cv_header_working_stdint_h=yes],
+ [],
+ [case "$host_os" in
+ # Guess yes on native Windows.
+ mingw*) gl_cv_header_working_stdint_h="guessing yes" ;;
+ # In general, assume it works.
+ *) gl_cv_header_working_stdint_h="guessing yes" ;;
+ esac
+ ])
+ ])
+ ])
+ fi
+
+ HAVE_C99_STDINT_H=0
+ HAVE_SYS_BITYPES_H=0
+ HAVE_SYS_INTTYPES_H=0
+ GL_GENERATE_STDINT_H=true
+ case "$gl_cv_header_working_stdint_h" in
+ *yes)
+ HAVE_C99_STDINT_H=1
+ dnl Now see whether the system <stdint.h> works without
+ dnl __STDC_CONSTANT_MACROS/__STDC_LIMIT_MACROS defined.
+ dnl If not, there would be problems when stdint.h is included from C++.
+ AC_CACHE_CHECK([whether stdint.h works without ISO C predefines],
+ [gl_cv_header_stdint_without_STDC_macros],
+ [gl_cv_header_stdint_without_STDC_macros=no
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([[
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#include <stdint.h>
+]
+gl_STDINT_INCLUDES
+[
+intmax_t im = INTMAX_MAX;
+int32_t i32 = INT32_C (0x7fffffff);
+ ]])],
+ [gl_cv_header_stdint_without_STDC_macros=yes])
+ ])
+
+ if test $gl_cv_header_stdint_without_STDC_macros = no; then
+ AC_DEFINE([__STDC_CONSTANT_MACROS], [1],
+ [Define to 1 if the system <stdint.h> predates C++11.])
+ AC_DEFINE([__STDC_LIMIT_MACROS], [1],
+ [Define to 1 if the system <stdint.h> predates C++11.])
+ fi
+ AC_CACHE_CHECK([whether stdint.h has UINTMAX_WIDTH etc.],
+ [gl_cv_header_stdint_width],
+ [gl_cv_header_stdint_width=no
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[
+ /* Work if build is not clean. */
+ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1
+ #ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+ #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
+ #endif
+ #include <stdint.h>
+ ]gl_STDINT_INCLUDES[
+ int iw = UINTMAX_WIDTH;
+ ]])],
+ [gl_cv_header_stdint_width=yes])])
+ if test "$gl_cv_header_stdint_width" = yes; then
+ GL_GENERATE_STDINT_H=false
+ fi
+ ;;
+ *)
+ dnl Check for <sys/inttypes.h>, and for
+ dnl <sys/bitypes.h> (used in Linux libc4 >= 4.6.7 and libc5).
+ AC_CHECK_HEADERS([sys/inttypes.h sys/bitypes.h])
+ if test $ac_cv_header_sys_inttypes_h = yes; then
+ HAVE_SYS_INTTYPES_H=1
+ fi
+ if test $ac_cv_header_sys_bitypes_h = yes; then
+ HAVE_SYS_BITYPES_H=1
+ fi
+ gl_STDINT_TYPE_PROPERTIES
+ ;;
+ esac
+
+ dnl The substitute stdint.h needs the substitute limit.h's _GL_INTEGER_WIDTH.
+ gl_REPLACE_LIMITS_H
+
+ AC_SUBST([HAVE_C99_STDINT_H])
+ AC_SUBST([HAVE_SYS_BITYPES_H])
+ AC_SUBST([HAVE_SYS_INTTYPES_H])
+])
+
+dnl gl_STDINT_BITSIZEOF(TYPES, INCLUDES)
+dnl Determine the size of each of the given types in bits.
+AC_DEFUN([gl_STDINT_BITSIZEOF],
+[
+ dnl Use a shell loop, to avoid bloating configure, and
+ dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into
+ dnl config.h.in,
+ dnl - extra AC_SUBST calls, so that the right substitutions are made.
+ m4_foreach_w([gltype], [$1],
+ [AH_TEMPLATE([BITSIZEOF_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]),
+ [Define to the number of bits in type ']gltype['.])])
+ for gltype in $1 ; do
+ AC_CACHE_CHECK([for bit size of $gltype], [gl_cv_bitsizeof_${gltype}],
+ [AC_COMPUTE_INT([result], [sizeof ($gltype) * CHAR_BIT],
+ [$2
+#include <limits.h>], [result=unknown])
+ eval gl_cv_bitsizeof_${gltype}=\$result
+ ])
+ eval result=\$gl_cv_bitsizeof_${gltype}
+ if test $result = unknown; then
+ dnl Use a nonempty default, because some compilers, such as IRIX 5 cc,
+ dnl do a syntax check even on unused #if conditions and give an error
+ dnl on valid C code like this:
+ dnl #if 0
+ dnl # if > 32
+ dnl # endif
+ dnl #endif
+ result=0
+ fi
+ GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ AC_DEFINE_UNQUOTED([BITSIZEOF_${GLTYPE}], [$result])
+ eval BITSIZEOF_${GLTYPE}=\$result
+ done
+ m4_foreach_w([gltype], [$1],
+ [AC_SUBST([BITSIZEOF_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]))])
+])
+
+dnl gl_CHECK_TYPES_SIGNED(TYPES, INCLUDES)
+dnl Determine the signedness of each of the given types.
+dnl Define HAVE_SIGNED_TYPE if type is signed.
+AC_DEFUN([gl_CHECK_TYPES_SIGNED],
+[
+ dnl Use a shell loop, to avoid bloating configure, and
+ dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into
+ dnl config.h.in,
+ dnl - extra AC_SUBST calls, so that the right substitutions are made.
+ m4_foreach_w([gltype], [$1],
+ [AH_TEMPLATE([HAVE_SIGNED_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]),
+ [Define to 1 if ']gltype[' is a signed integer type.])])
+ for gltype in $1 ; do
+ AC_CACHE_CHECK([whether $gltype is signed], [gl_cv_type_${gltype}_signed],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([$2[
+ int verify[2 * (($gltype) -1 < ($gltype) 0) - 1];]])],
+ result=yes, result=no)
+ eval gl_cv_type_${gltype}_signed=\$result
+ ])
+ eval result=\$gl_cv_type_${gltype}_signed
+ GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ if test "$result" = yes; then
+ AC_DEFINE_UNQUOTED([HAVE_SIGNED_${GLTYPE}], [1])
+ eval HAVE_SIGNED_${GLTYPE}=1
+ else
+ eval HAVE_SIGNED_${GLTYPE}=0
+ fi
+ done
+ m4_foreach_w([gltype], [$1],
+ [AC_SUBST([HAVE_SIGNED_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]))])
+])
+
+dnl gl_INTEGER_TYPE_SUFFIX(TYPES, INCLUDES)
+dnl Determine the suffix to use for integer constants of the given types.
+dnl Define t_SUFFIX for each such type.
+AC_DEFUN([gl_INTEGER_TYPE_SUFFIX],
+[
+ dnl Use a shell loop, to avoid bloating configure, and
+ dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into
+ dnl config.h.in,
+ dnl - extra AC_SUBST calls, so that the right substitutions are made.
+ m4_foreach_w([gltype], [$1],
+ [AH_TEMPLATE(m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_])[_SUFFIX],
+ [Define to l, ll, u, ul, ull, etc., as suitable for
+ constants of type ']gltype['.])])
+ for gltype in $1 ; do
+ AC_CACHE_CHECK([for $gltype integer literal suffix],
+ [gl_cv_type_${gltype}_suffix],
+ [eval gl_cv_type_${gltype}_suffix=no
+ eval result=\$gl_cv_type_${gltype}_signed
+ if test "$result" = yes; then
+ glsufu=
+ else
+ glsufu=u
+ fi
+ for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do
+ case $glsuf in
+ '') gltype1='int';;
+ l) gltype1='long int';;
+ ll) gltype1='long long int';;
+ i64) gltype1='__int64';;
+ u) gltype1='unsigned int';;
+ ul) gltype1='unsigned long int';;
+ ull) gltype1='unsigned long long int';;
+ ui64)gltype1='unsigned __int64';;
+ esac
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([$2[
+ extern $gltype foo;
+ extern $gltype1 foo;]])],
+ [eval gl_cv_type_${gltype}_suffix=\$glsuf])
+ eval result=\$gl_cv_type_${gltype}_suffix
+ test "$result" != no && break
+ done])
+ GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ eval result=\$gl_cv_type_${gltype}_suffix
+ test "$result" = no && result=
+ eval ${GLTYPE}_SUFFIX=\$result
+ AC_DEFINE_UNQUOTED([${GLTYPE}_SUFFIX], [$result])
+ done
+ m4_foreach_w([gltype], [$1],
+ [AC_SUBST(m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_])[_SUFFIX])])
+])
+
+dnl gl_STDINT_INCLUDES
+AC_DEFUN([gl_STDINT_INCLUDES],
+[[
+ #include <stddef.h>
+ #include <signal.h>
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+]])
+
+dnl gl_STDINT_TYPE_PROPERTIES
+dnl Compute HAVE_SIGNED_t, BITSIZEOF_t and t_SUFFIX, for all the types t
+dnl of interest to stdint.in.h.
+AC_DEFUN([gl_STDINT_TYPE_PROPERTIES],
+[
+ AC_REQUIRE([gl_MULTIARCH])
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+ gl_STDINT_BITSIZEOF([ptrdiff_t size_t],
+ [gl_STDINT_INCLUDES])
+ fi
+ gl_STDINT_BITSIZEOF([sig_atomic_t wchar_t wint_t],
+ [gl_STDINT_INCLUDES])
+ gl_CHECK_TYPES_SIGNED([sig_atomic_t wchar_t wint_t],
+ [gl_STDINT_INCLUDES])
+ gl_cv_type_ptrdiff_t_signed=yes
+ gl_cv_type_size_t_signed=no
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+ gl_INTEGER_TYPE_SUFFIX([ptrdiff_t size_t],
+ [gl_STDINT_INCLUDES])
+ fi
+ gl_INTEGER_TYPE_SUFFIX([sig_atomic_t wchar_t wint_t],
+ [gl_STDINT_INCLUDES])
+
+ dnl If wint_t is smaller than 'int', it cannot satisfy the ISO C 99
+ dnl requirement that wint_t is "unchanged by default argument promotions".
+ dnl In this case gnulib's <wchar.h> and <wctype.h> override wint_t.
+ dnl Set the variable BITSIZEOF_WINT_T accordingly.
+ if test $GNULIBHEADERS_OVERRIDE_WINT_T = 1; then
+ BITSIZEOF_WINT_T=32
+ fi
+])
diff --git a/gnulib_m4/stdint_h.m4 b/gnulib_m4/stdint_h.m4
new file mode 100644
index 0000000..70349f6
--- /dev/null
+++ b/gnulib_m4/stdint_h.m4
@@ -0,0 +1,27 @@
+# stdint_h.m4 serial 9
+dnl Copyright (C) 1997-2004, 2006, 2008-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+# Define HAVE_STDINT_H_WITH_UINTMAX if <stdint.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([gl_AC_HEADER_STDINT_H],
+[
+ AC_CACHE_CHECK([for stdint.h], [gl_cv_header_stdint_h],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/types.h>
+ #include <stdint.h>]],
+ [[uintmax_t i = (uintmax_t) -1; return !i;]])],
+ [gl_cv_header_stdint_h=yes],
+ [gl_cv_header_stdint_h=no])])
+ if test $gl_cv_header_stdint_h = yes; then
+ AC_DEFINE_UNQUOTED([HAVE_STDINT_H_WITH_UINTMAX], [1],
+ [Define if <stdint.h> exists, doesn't clash with <sys/types.h>,
+ and declares uintmax_t. ])
+ fi
+])
diff --git a/gnulib_m4/stdio_h.m4 b/gnulib_m4/stdio_h.m4
new file mode 100644
index 0000000..0756996
--- /dev/null
+++ b/gnulib_m4/stdio_h.m4
@@ -0,0 +1,237 @@
+# stdio_h.m4 serial 61
+dnl Copyright (C) 2007-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN_ONCE([gl_STDIO_H],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AH_VERBATIM([MINGW_ANSI_STDIO],
+[/* Use GNU style printf and scanf. */
+#ifndef __USE_MINGW_ANSI_STDIO
+# undef __USE_MINGW_ANSI_STDIO
+#endif
+])
+ AC_DEFINE([__USE_MINGW_ANSI_STDIO])
+ gl_NEXT_HEADERS([stdio.h])
+
+ dnl Determine whether __USE_MINGW_ANSI_STDIO makes printf and
+ dnl inttypes.h behave like gnu instead of system; we must give our
+ dnl printf wrapper the right attribute to match.
+ AC_CACHE_CHECK([which flavor of printf attribute matches inttypes macros],
+ [gl_cv_func_printf_attribute_flavor],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+ #define __STDC_FORMAT_MACROS 1
+ #include <stdio.h>
+ #include <inttypes.h>
+ /* For non-mingw systems, compilation will trivially succeed.
+ For mingw, compilation will succeed for older mingw (system
+ printf, "I64d") and fail for newer mingw (gnu printf, "lld"). */
+ #if (defined _WIN32 && ! defined __CYGWIN__) && \
+ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+ extern char PRIdMAX_probe[sizeof PRIdMAX == sizeof "I64d" ? 1 : -1];
+ #endif
+ ]])], [gl_cv_func_printf_attribute_flavor=system],
+ [gl_cv_func_printf_attribute_flavor=gnu])])
+ if test "$gl_cv_func_printf_attribute_flavor" = gnu; then
+ AC_DEFINE([GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU], [1],
+ [Define to 1 if printf and friends should be labeled with
+ attribute "__gnu_printf__" instead of "__printf__"])
+ fi
+
+ dnl This ifdef is an optimization, to avoid performing a configure check whose
+ dnl result is not used. But it does not make the test of
+ dnl GNULIB_STDIO_H_NONBLOCKING or GNULIB_NONBLOCKING redundant.
+ m4_ifdef([gl_NONBLOCKING_IO], [
+ gl_NONBLOCKING_IO
+ if test $gl_cv_have_nonblocking != yes; then
+ REPLACE_STDIO_READ_FUNCS=1
+ fi
+ ])
+
+ dnl This ifdef is an optimization, to avoid performing a configure check whose
+ dnl result is not used. But it does not make the test of
+ dnl GNULIB_STDIO_H_SIGPIPE or GNULIB_SIGPIPE redundant.
+ m4_ifdef([gl_SIGNAL_SIGPIPE], [
+ gl_SIGNAL_SIGPIPE
+ if test $gl_cv_header_signal_h_SIGPIPE != yes; then
+ REPLACE_STDIO_WRITE_FUNCS=1
+ fi
+ ])
+ dnl This ifdef is an optimization, to avoid performing a configure check whose
+ dnl result is not used. But it does not make the test of
+ dnl GNULIB_STDIO_H_NONBLOCKING or GNULIB_NONBLOCKING redundant.
+ m4_ifdef([gl_NONBLOCKING_IO], [
+ gl_NONBLOCKING_IO
+ if test $gl_cv_have_nonblocking != yes; then
+ REPLACE_STDIO_WRITE_FUNCS=1
+ fi
+ ])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use, and which is not
+ dnl guaranteed by both C89 and C11.
+ gl_WARN_ON_USE_PREPARE([[#include <stdio.h>
+ ]], [dprintf fpurge fseeko ftello getdelim getline gets pclose popen
+ renameat snprintf tmpfile vdprintf vsnprintf])
+
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ AC_CHECK_DECLS_ONCE([fcloseall])
+ if test $ac_cv_have_decl_fcloseall = no; then
+ HAVE_DECL_FCLOSEALL=0
+ fi
+
+ AC_CHECK_DECLS_ONCE([getw])
+ if test $ac_cv_have_decl_getw = no; then
+ HAVE_DECL_GETW=0
+ fi
+
+ AC_CHECK_DECLS_ONCE([putw])
+ if test $ac_cv_have_decl_putw = no; then
+ HAVE_DECL_PUTW=0
+ fi
+])
+
+# gl_STDIO_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
+AC_DEFUN([gl_STDIO_MODULE_INDICATOR],
+[
+ dnl Ensure to expand the default settings once only.
+ gl_STDIO_H_REQUIRE_DEFAULTS
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd. It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_STDIO_H_REQUIRE_DEFAULTS],
+[
+ m4_defun(GL_MODULE_INDICATOR_PREFIX[_STDIO_H_MODULE_INDICATOR_DEFAULTS], [
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_DPRINTF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FCLOSE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FDOPEN])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FFLUSH])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FGETC])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FGETS])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FOPEN])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FOPEN_GNU])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FPRINTF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FPRINTF_POSIX])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FPURGE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FPUTC])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FPUTS])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FREAD])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FREOPEN])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FSCANF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FSEEK])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FSEEKO])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FTELL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FTELLO])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FWRITE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETC])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETCHAR])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETDELIM])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETLINE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_OBSTACK_PRINTF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_OBSTACK_PRINTF_POSIX])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PCLOSE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PERROR])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POPEN])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PRINTF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PRINTF_POSIX])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PUTC])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PUTCHAR])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PUTS])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REMOVE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RENAME])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RENAMEAT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SCANF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SNPRINTF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SPRINTF_POSIX])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STDIO_H_NONBLOCKING])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STDIO_H_SIGPIPE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TMPFILE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VASPRINTF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VFSCANF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VSCANF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VDPRINTF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VFPRINTF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VFPRINTF_POSIX])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VPRINTF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VPRINTF_POSIX])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VSNPRINTF])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VSPRINTF_POSIX])
+ dnl Support Microsoft deprecated alias function names by default.
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_FCLOSEALL], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_FDOPEN], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_FILENO], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_GETW], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_PUTW], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_TEMPNAM], [1])
+ ])
+ m4_require(GL_MODULE_INDICATOR_PREFIX[_STDIO_H_MODULE_INDICATOR_DEFAULTS])
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+])
+
+AC_DEFUN([gl_STDIO_H_DEFAULTS],
+[
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_DECL_FCLOSEALL=1; AC_SUBST([HAVE_DECL_FCLOSEALL])
+ HAVE_DECL_FPURGE=1; AC_SUBST([HAVE_DECL_FPURGE])
+ HAVE_DECL_FSEEKO=1; AC_SUBST([HAVE_DECL_FSEEKO])
+ HAVE_DECL_FTELLO=1; AC_SUBST([HAVE_DECL_FTELLO])
+ HAVE_DECL_GETDELIM=1; AC_SUBST([HAVE_DECL_GETDELIM])
+ HAVE_DECL_GETLINE=1; AC_SUBST([HAVE_DECL_GETLINE])
+ HAVE_DECL_GETW=1; AC_SUBST([HAVE_DECL_GETW])
+ HAVE_DECL_OBSTACK_PRINTF=1; AC_SUBST([HAVE_DECL_OBSTACK_PRINTF])
+ HAVE_DECL_PUTW=1; AC_SUBST([HAVE_DECL_PUTW])
+ HAVE_DECL_SNPRINTF=1; AC_SUBST([HAVE_DECL_SNPRINTF])
+ HAVE_DECL_VSNPRINTF=1; AC_SUBST([HAVE_DECL_VSNPRINTF])
+ HAVE_DPRINTF=1; AC_SUBST([HAVE_DPRINTF])
+ HAVE_FSEEKO=1; AC_SUBST([HAVE_FSEEKO])
+ HAVE_FTELLO=1; AC_SUBST([HAVE_FTELLO])
+ HAVE_PCLOSE=1; AC_SUBST([HAVE_PCLOSE])
+ HAVE_POPEN=1; AC_SUBST([HAVE_POPEN])
+ HAVE_RENAMEAT=1; AC_SUBST([HAVE_RENAMEAT])
+ HAVE_VASPRINTF=1; AC_SUBST([HAVE_VASPRINTF])
+ HAVE_VDPRINTF=1; AC_SUBST([HAVE_VDPRINTF])
+ REPLACE_DPRINTF=0; AC_SUBST([REPLACE_DPRINTF])
+ REPLACE_FCLOSE=0; AC_SUBST([REPLACE_FCLOSE])
+ REPLACE_FDOPEN=0; AC_SUBST([REPLACE_FDOPEN])
+ REPLACE_FFLUSH=0; AC_SUBST([REPLACE_FFLUSH])
+ REPLACE_FOPEN=0; AC_SUBST([REPLACE_FOPEN])
+ REPLACE_FOPEN_FOR_FOPEN_GNU=0; AC_SUBST([REPLACE_FOPEN_FOR_FOPEN_GNU])
+ REPLACE_FPRINTF=0; AC_SUBST([REPLACE_FPRINTF])
+ REPLACE_FPURGE=0; AC_SUBST([REPLACE_FPURGE])
+ REPLACE_FREOPEN=0; AC_SUBST([REPLACE_FREOPEN])
+ REPLACE_FSEEK=0; AC_SUBST([REPLACE_FSEEK])
+ REPLACE_FSEEKO=0; AC_SUBST([REPLACE_FSEEKO])
+ REPLACE_FTELL=0; AC_SUBST([REPLACE_FTELL])
+ REPLACE_FTELLO=0; AC_SUBST([REPLACE_FTELLO])
+ REPLACE_GETDELIM=0; AC_SUBST([REPLACE_GETDELIM])
+ REPLACE_GETLINE=0; AC_SUBST([REPLACE_GETLINE])
+ REPLACE_OBSTACK_PRINTF=0; AC_SUBST([REPLACE_OBSTACK_PRINTF])
+ REPLACE_PERROR=0; AC_SUBST([REPLACE_PERROR])
+ REPLACE_POPEN=0; AC_SUBST([REPLACE_POPEN])
+ REPLACE_PRINTF=0; AC_SUBST([REPLACE_PRINTF])
+ REPLACE_REMOVE=0; AC_SUBST([REPLACE_REMOVE])
+ REPLACE_RENAME=0; AC_SUBST([REPLACE_RENAME])
+ REPLACE_RENAMEAT=0; AC_SUBST([REPLACE_RENAMEAT])
+ REPLACE_SNPRINTF=0; AC_SUBST([REPLACE_SNPRINTF])
+ REPLACE_SPRINTF=0; AC_SUBST([REPLACE_SPRINTF])
+ REPLACE_STDIO_READ_FUNCS=0; AC_SUBST([REPLACE_STDIO_READ_FUNCS])
+ REPLACE_STDIO_WRITE_FUNCS=0; AC_SUBST([REPLACE_STDIO_WRITE_FUNCS])
+ REPLACE_TMPFILE=0; AC_SUBST([REPLACE_TMPFILE])
+ REPLACE_VASPRINTF=0; AC_SUBST([REPLACE_VASPRINTF])
+ REPLACE_VDPRINTF=0; AC_SUBST([REPLACE_VDPRINTF])
+ REPLACE_VFPRINTF=0; AC_SUBST([REPLACE_VFPRINTF])
+ REPLACE_VPRINTF=0; AC_SUBST([REPLACE_VPRINTF])
+ REPLACE_VSNPRINTF=0; AC_SUBST([REPLACE_VSNPRINTF])
+ REPLACE_VSPRINTF=0; AC_SUBST([REPLACE_VSPRINTF])
+])
diff --git a/gnulib_m4/stdlib_h.m4 b/gnulib_m4/stdlib_h.m4
new file mode 100644
index 0000000..249ef65
--- /dev/null
+++ b/gnulib_m4/stdlib_h.m4
@@ -0,0 +1,209 @@
+# stdlib_h.m4 serial 71
+dnl Copyright (C) 2007-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN_ONCE([gl_STDLIB_H],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ gl_NEXT_HEADERS([stdlib.h])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use, and which is not
+ dnl guaranteed by C89.
+ gl_WARN_ON_USE_PREPARE([[#include <stdlib.h>
+#if HAVE_SYS_LOADAVG_H
+/* OpenIndiana has a bug: <sys/time.h> must be included before
+ <sys/loadavg.h>. */
+# include <sys/time.h>
+# include <sys/loadavg.h>
+#endif
+#if HAVE_RANDOM_H
+# include <random.h>
+#endif
+ ]], [_Exit aligned_alloc atoll canonicalize_file_name free
+ getloadavg getprogname getsubopt grantpt
+ initstate initstate_r mbtowc mkdtemp mkostemp mkostemps mkstemp mkstemps
+ posix_memalign posix_openpt ptsname ptsname_r qsort_r
+ random random_r reallocarray realpath rpmatch secure_getenv setenv
+ setstate setstate_r srandom srandom_r
+ strtod strtol strtold strtoll strtoul strtoull unlockpt unsetenv])
+
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ AC_CHECK_DECLS_ONCE([ecvt])
+ if test $ac_cv_have_decl_ecvt = no; then
+ HAVE_DECL_ECVT=0
+ fi
+ AC_CHECK_DECLS_ONCE([fcvt])
+ if test $ac_cv_have_decl_fcvt = no; then
+ HAVE_DECL_FCVT=0
+ fi
+ AC_CHECK_DECLS_ONCE([gcvt])
+ if test $ac_cv_have_decl_gcvt = no; then
+ HAVE_DECL_GCVT=0
+ fi
+])
+
+# gl_STDLIB_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
+AC_DEFUN([gl_STDLIB_MODULE_INDICATOR],
+[
+ dnl Ensure to expand the default settings once only.
+ gl_STDLIB_H_REQUIRE_DEFAULTS
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd. It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_STDLIB_H_REQUIRE_DEFAULTS],
+[
+ m4_defun(GL_MODULE_INDICATOR_PREFIX[_STDLIB_H_MODULE_INDICATOR_DEFAULTS], [
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB__EXIT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ALIGNED_ALLOC])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ATOLL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CALLOC_GNU])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CALLOC_POSIX])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CANONICALIZE_FILE_NAME])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FREE_POSIX])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETLOADAVG])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETPROGNAME])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETSUBOPT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GRANTPT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MALLOC_GNU])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MALLOC_POSIX])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBTOWC])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKDTEMP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKOSTEMP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKOSTEMPS])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKSTEMP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKSTEMPS])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_MEMALIGN])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_OPENPT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PTSNAME])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PTSNAME_R])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PUTENV])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_QSORT_R])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RANDOM])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RANDOM_R])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REALLOCARRAY])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REALLOC_GNU])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REALLOC_POSIX])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REALPATH])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RPMATCH])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SECURE_GETENV])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SETENV])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOD])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOLD])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOLL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOUL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOULL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SYSTEM_POSIX])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNLOCKPT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNSETENV])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCTOMB])
+ dnl Support Microsoft deprecated alias function names by default.
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_ECVT], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_FCVT], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_GCVT], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_MKTEMP], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_PUTENV], [1])
+ ])
+ m4_require(GL_MODULE_INDICATOR_PREFIX[_STDLIB_H_MODULE_INDICATOR_DEFAULTS])
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+])
+
+AC_DEFUN([gl_STDLIB_H_DEFAULTS],
+[
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE__EXIT=1; AC_SUBST([HAVE__EXIT])
+ HAVE_ALIGNED_ALLOC=1; AC_SUBST([HAVE_ALIGNED_ALLOC])
+ HAVE_ATOLL=1; AC_SUBST([HAVE_ATOLL])
+ HAVE_CANONICALIZE_FILE_NAME=1; AC_SUBST([HAVE_CANONICALIZE_FILE_NAME])
+ HAVE_DECL_ECVT=1; AC_SUBST([HAVE_DECL_ECVT])
+ HAVE_DECL_FCVT=1; AC_SUBST([HAVE_DECL_FCVT])
+ HAVE_DECL_GCVT=1; AC_SUBST([HAVE_DECL_GCVT])
+ HAVE_DECL_GETLOADAVG=1; AC_SUBST([HAVE_DECL_GETLOADAVG])
+ HAVE_GETPROGNAME=1; AC_SUBST([HAVE_GETPROGNAME])
+ HAVE_GETSUBOPT=1; AC_SUBST([HAVE_GETSUBOPT])
+ HAVE_GRANTPT=1; AC_SUBST([HAVE_GRANTPT])
+ HAVE_INITSTATE=1; AC_SUBST([HAVE_INITSTATE])
+ HAVE_DECL_INITSTATE=1; AC_SUBST([HAVE_DECL_INITSTATE])
+ HAVE_MBTOWC=1; AC_SUBST([HAVE_MBTOWC])
+ HAVE_MKDTEMP=1; AC_SUBST([HAVE_MKDTEMP])
+ HAVE_MKOSTEMP=1; AC_SUBST([HAVE_MKOSTEMP])
+ HAVE_MKOSTEMPS=1; AC_SUBST([HAVE_MKOSTEMPS])
+ HAVE_MKSTEMP=1; AC_SUBST([HAVE_MKSTEMP])
+ HAVE_MKSTEMPS=1; AC_SUBST([HAVE_MKSTEMPS])
+ HAVE_POSIX_MEMALIGN=1; AC_SUBST([HAVE_POSIX_MEMALIGN])
+ HAVE_POSIX_OPENPT=1; AC_SUBST([HAVE_POSIX_OPENPT])
+ HAVE_PTSNAME=1; AC_SUBST([HAVE_PTSNAME])
+ HAVE_PTSNAME_R=1; AC_SUBST([HAVE_PTSNAME_R])
+ HAVE_QSORT_R=1; AC_SUBST([HAVE_QSORT_R])
+ HAVE_RANDOM=1; AC_SUBST([HAVE_RANDOM])
+ HAVE_RANDOM_H=1; AC_SUBST([HAVE_RANDOM_H])
+ HAVE_RANDOM_R=1; AC_SUBST([HAVE_RANDOM_R])
+ HAVE_REALLOCARRAY=1; AC_SUBST([HAVE_REALLOCARRAY])
+ HAVE_REALPATH=1; AC_SUBST([HAVE_REALPATH])
+ HAVE_RPMATCH=1; AC_SUBST([HAVE_RPMATCH])
+ HAVE_SECURE_GETENV=1; AC_SUBST([HAVE_SECURE_GETENV])
+ HAVE_SETENV=1; AC_SUBST([HAVE_SETENV])
+ HAVE_DECL_SETENV=1; AC_SUBST([HAVE_DECL_SETENV])
+ HAVE_SETSTATE=1; AC_SUBST([HAVE_SETSTATE])
+ HAVE_DECL_SETSTATE=1; AC_SUBST([HAVE_DECL_SETSTATE])
+ HAVE_STRTOD=1; AC_SUBST([HAVE_STRTOD])
+ HAVE_STRTOL=1; AC_SUBST([HAVE_STRTOL])
+ HAVE_STRTOLD=1; AC_SUBST([HAVE_STRTOLD])
+ HAVE_STRTOLL=1; AC_SUBST([HAVE_STRTOLL])
+ HAVE_STRTOUL=1; AC_SUBST([HAVE_STRTOUL])
+ HAVE_STRTOULL=1; AC_SUBST([HAVE_STRTOULL])
+ HAVE_STRUCT_RANDOM_DATA=1; AC_SUBST([HAVE_STRUCT_RANDOM_DATA])
+ HAVE_SYS_LOADAVG_H=0; AC_SUBST([HAVE_SYS_LOADAVG_H])
+ HAVE_UNLOCKPT=1; AC_SUBST([HAVE_UNLOCKPT])
+ HAVE_DECL_UNSETENV=1; AC_SUBST([HAVE_DECL_UNSETENV])
+ REPLACE__EXIT=0; AC_SUBST([REPLACE__EXIT])
+ REPLACE_ALIGNED_ALLOC=0; AC_SUBST([REPLACE_ALIGNED_ALLOC])
+ REPLACE_CALLOC_FOR_CALLOC_GNU=0; AC_SUBST([REPLACE_CALLOC_FOR_CALLOC_GNU])
+ REPLACE_CALLOC_FOR_CALLOC_POSIX=0; AC_SUBST([REPLACE_CALLOC_FOR_CALLOC_POSIX])
+ REPLACE_CANONICALIZE_FILE_NAME=0; AC_SUBST([REPLACE_CANONICALIZE_FILE_NAME])
+ REPLACE_FREE=0; AC_SUBST([REPLACE_FREE])
+ REPLACE_GETLOADAVG=0; AC_SUBST([REPLACE_GETLOADAVG])
+ REPLACE_GETPROGNAME=0; AC_SUBST([REPLACE_GETPROGNAME])
+ REPLACE_GETSUBOPT=0; AC_SUBST([REPLACE_GETSUBOPT])
+ REPLACE_INITSTATE=0; AC_SUBST([REPLACE_INITSTATE])
+ REPLACE_MALLOC_FOR_MALLOC_GNU=0; AC_SUBST([REPLACE_MALLOC_FOR_MALLOC_GNU])
+ REPLACE_MALLOC_FOR_MALLOC_POSIX=0; AC_SUBST([REPLACE_MALLOC_FOR_MALLOC_POSIX])
+ REPLACE_MBTOWC=0; AC_SUBST([REPLACE_MBTOWC])
+ REPLACE_MKOSTEMP=0; AC_SUBST([REPLACE_MKOSTEMP])
+ REPLACE_MKOSTEMPS=0; AC_SUBST([REPLACE_MKOSTEMPS])
+ REPLACE_MKSTEMP=0; AC_SUBST([REPLACE_MKSTEMP])
+ REPLACE_POSIX_MEMALIGN=0; AC_SUBST([REPLACE_POSIX_MEMALIGN])
+ REPLACE_POSIX_OPENPT=0; AC_SUBST([REPLACE_POSIX_OPENPT])
+ REPLACE_PTSNAME=0; AC_SUBST([REPLACE_PTSNAME])
+ REPLACE_PTSNAME_R=0; AC_SUBST([REPLACE_PTSNAME_R])
+ REPLACE_PUTENV=0; AC_SUBST([REPLACE_PUTENV])
+ REPLACE_QSORT_R=0; AC_SUBST([REPLACE_QSORT_R])
+ REPLACE_RANDOM=0; AC_SUBST([REPLACE_RANDOM])
+ REPLACE_RANDOM_R=0; AC_SUBST([REPLACE_RANDOM_R])
+ REPLACE_REALLOC_FOR_REALLOC_GNU=0; AC_SUBST([REPLACE_REALLOC_FOR_REALLOC_GNU])
+ REPLACE_REALLOC_FOR_REALLOC_POSIX=0; AC_SUBST([REPLACE_REALLOC_FOR_REALLOC_POSIX])
+ REPLACE_REALLOCARRAY=0; AC_SUBST([REPLACE_REALLOCARRAY])
+ REPLACE_REALPATH=0; AC_SUBST([REPLACE_REALPATH])
+ REPLACE_SETENV=0; AC_SUBST([REPLACE_SETENV])
+ REPLACE_SETSTATE=0; AC_SUBST([REPLACE_SETSTATE])
+ REPLACE_STRTOD=0; AC_SUBST([REPLACE_STRTOD])
+ REPLACE_STRTOL=0; AC_SUBST([REPLACE_STRTOL])
+ REPLACE_STRTOLD=0; AC_SUBST([REPLACE_STRTOLD])
+ REPLACE_STRTOLL=0; AC_SUBST([REPLACE_STRTOLL])
+ REPLACE_STRTOUL=0; AC_SUBST([REPLACE_STRTOUL])
+ REPLACE_STRTOULL=0; AC_SUBST([REPLACE_STRTOULL])
+ REPLACE_UNSETENV=0; AC_SUBST([REPLACE_UNSETENV])
+ REPLACE_WCTOMB=0; AC_SUBST([REPLACE_WCTOMB])
+])
diff --git a/gnulib_m4/string_h.m4 b/gnulib_m4/string_h.m4
new file mode 100644
index 0000000..7f51391
--- /dev/null
+++ b/gnulib_m4/string_h.m4
@@ -0,0 +1,150 @@
+# Configure a GNU-like replacement for <string.h>.
+
+# Copyright (C) 2007-2023 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 37
+
+# Written by Paul Eggert.
+
+AC_DEFUN_ONCE([gl_STRING_H],
+[
+ dnl Ensure to expand the default settings once only, before all statements
+ dnl that occur in other macros.
+ AC_REQUIRE([gl_STRING_H_DEFAULTS])
+ gl_NEXT_HEADERS([string.h])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use, and which is not
+ dnl guaranteed by C89.
+ gl_WARN_ON_USE_PREPARE([[#include <string.h>
+ ]],
+ [explicit_bzero ffsl ffsll memmem mempcpy memrchr memset_explicit
+ rawmemchr stpcpy stpncpy strchrnul
+ strdup strncat strndup strnlen strpbrk strsep strcasestr strtok_r
+ strerror_r strerrorname_np sigabbrev_np sigdescr_np strsignal strverscmp])
+
+ AC_REQUIRE([AC_C_RESTRICT])
+])
+
+# gl_STRING_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
+AC_DEFUN([gl_STRING_MODULE_INDICATOR],
+[
+ dnl Ensure to expand the default settings once only.
+ gl_STRING_H_REQUIRE_DEFAULTS
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd. It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_STRING_H_REQUIRE_DEFAULTS],
+[
+ m4_defun(GL_MODULE_INDICATOR_PREFIX[_STRING_H_MODULE_INDICATOR_DEFAULTS], [
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXPLICIT_BZERO])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FFSL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FFSLL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MEMCHR])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MEMMEM])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MEMPCPY])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MEMRCHR])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MEMSET_EXPLICIT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RAWMEMCHR])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STPCPY])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STPNCPY])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRCHRNUL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRDUP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRNCAT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRNDUP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRNLEN])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRPBRK])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRSEP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRSTR])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRCASESTR])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOK_R])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSLEN])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSNLEN])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSCHR])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSRCHR])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSSTR])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSCASECMP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSNCASECMP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSPCASECMP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSCASESTR])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSCSPN])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSPBRK])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSSPN])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSSEP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSTOK_R])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRERROR])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRERROR_R])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRERRORNAME_NP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SIGABBREV_NP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SIGDESCR_NP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRSIGNAL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRVERSCMP])
+ dnl Support Microsoft deprecated alias function names by default.
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_MEMCCPY], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_STRDUP], [1])
+ ])
+ m4_require(GL_MODULE_INDICATOR_PREFIX[_STRING_H_MODULE_INDICATOR_DEFAULTS])
+ dnl Make sure the shell variable for GNULIB_FREE_POSIX is initialized.
+ gl_STDLIB_H_REQUIRE_DEFAULTS
+ AC_REQUIRE([gl_STRING_H_DEFAULTS])
+])
+
+AC_DEFUN([gl_STRING_H_DEFAULTS],
+[
+ HAVE_MBSLEN=0; AC_SUBST([HAVE_MBSLEN])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_EXPLICIT_BZERO=1; AC_SUBST([HAVE_EXPLICIT_BZERO])
+ HAVE_FFSL=1; AC_SUBST([HAVE_FFSL])
+ HAVE_FFSLL=1; AC_SUBST([HAVE_FFSLL])
+ HAVE_DECL_MEMMEM=1; AC_SUBST([HAVE_DECL_MEMMEM])
+ HAVE_MEMPCPY=1; AC_SUBST([HAVE_MEMPCPY])
+ HAVE_MEMSET_EXPLICIT=1; AC_SUBST([HAVE_MEMSET_EXPLICIT])
+ HAVE_DECL_MEMRCHR=1; AC_SUBST([HAVE_DECL_MEMRCHR])
+ HAVE_RAWMEMCHR=1; AC_SUBST([HAVE_RAWMEMCHR])
+ HAVE_STPCPY=1; AC_SUBST([HAVE_STPCPY])
+ HAVE_STPNCPY=1; AC_SUBST([HAVE_STPNCPY])
+ HAVE_STRCHRNUL=1; AC_SUBST([HAVE_STRCHRNUL])
+ HAVE_DECL_STRDUP=1; AC_SUBST([HAVE_DECL_STRDUP])
+ HAVE_DECL_STRNDUP=1; AC_SUBST([HAVE_DECL_STRNDUP])
+ HAVE_DECL_STRNLEN=1; AC_SUBST([HAVE_DECL_STRNLEN])
+ HAVE_STRPBRK=1; AC_SUBST([HAVE_STRPBRK])
+ HAVE_STRSEP=1; AC_SUBST([HAVE_STRSEP])
+ HAVE_STRCASESTR=1; AC_SUBST([HAVE_STRCASESTR])
+ HAVE_DECL_STRTOK_R=1; AC_SUBST([HAVE_DECL_STRTOK_R])
+ HAVE_DECL_STRERROR_R=1; AC_SUBST([HAVE_DECL_STRERROR_R])
+ HAVE_STRERRORNAME_NP=1; AC_SUBST([HAVE_STRERRORNAME_NP])
+ HAVE_SIGABBREV_NP=1; AC_SUBST([HAVE_SIGABBREV_NP])
+ HAVE_SIGDESCR_NP=1; AC_SUBST([HAVE_SIGDESCR_NP])
+ HAVE_DECL_STRSIGNAL=1; AC_SUBST([HAVE_DECL_STRSIGNAL])
+ HAVE_STRVERSCMP=1; AC_SUBST([HAVE_STRVERSCMP])
+ REPLACE_FFSLL=0; AC_SUBST([REPLACE_FFSLL])
+ REPLACE_MEMCHR=0; AC_SUBST([REPLACE_MEMCHR])
+ REPLACE_MEMMEM=0; AC_SUBST([REPLACE_MEMMEM])
+ REPLACE_MEMPCPY=0; AC_SUBST([REPLACE_MEMPCPY])
+ REPLACE_STPCPY=0; AC_SUBST([REPLACE_STPCPY])
+ REPLACE_STPNCPY=0; AC_SUBST([REPLACE_STPNCPY])
+ REPLACE_STRCHRNUL=0; AC_SUBST([REPLACE_STRCHRNUL])
+ REPLACE_STRDUP=0; AC_SUBST([REPLACE_STRDUP])
+ REPLACE_STRNCAT=0; AC_SUBST([REPLACE_STRNCAT])
+ REPLACE_STRNDUP=0; AC_SUBST([REPLACE_STRNDUP])
+ REPLACE_STRNLEN=0; AC_SUBST([REPLACE_STRNLEN])
+ REPLACE_STRSTR=0; AC_SUBST([REPLACE_STRSTR])
+ REPLACE_STRCASESTR=0; AC_SUBST([REPLACE_STRCASESTR])
+ REPLACE_STRTOK_R=0; AC_SUBST([REPLACE_STRTOK_R])
+ REPLACE_STRERROR=0; AC_SUBST([REPLACE_STRERROR])
+ REPLACE_STRERROR_R=0; AC_SUBST([REPLACE_STRERROR_R])
+ REPLACE_STRERRORNAME_NP=0; AC_SUBST([REPLACE_STRERRORNAME_NP])
+ REPLACE_STRSIGNAL=0; AC_SUBST([REPLACE_STRSIGNAL])
+ UNDEFINE_STRTOK_R=0; AC_SUBST([UNDEFINE_STRTOK_R])
+])
diff --git a/gnulib_m4/sys_types_h.m4 b/gnulib_m4/sys_types_h.m4
new file mode 100644
index 0000000..627671f
--- /dev/null
+++ b/gnulib_m4/sys_types_h.m4
@@ -0,0 +1,70 @@
+# sys_types_h.m4 serial 13
+dnl Copyright (C) 2011-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN_ONCE([gl_SYS_TYPES_H],
+[
+ AC_REQUIRE([gl_SYS_TYPES_H_DEFAULTS])
+
+ dnl Use sane struct stat types in OpenVMS 8.2 and later.
+ AC_DEFINE([_USE_STD_STAT], 1, [For standard stat data types on VMS.])
+
+ gl_NEXT_HEADERS([sys/types.h])
+
+ dnl Ensure the type pid_t gets defined.
+ AC_REQUIRE([AC_TYPE_PID_T])
+
+ dnl Ensure the type mode_t gets defined.
+ AC_REQUIRE([AC_TYPE_MODE_T])
+
+ dnl Whether to override the 'off_t' type.
+ AC_REQUIRE([gl_TYPE_OFF_T])
+
+ dnl Whether to override the 'dev_t' and 'ino_t' types.
+ m4_ifdef([gl_WINDOWS_STAT_INODES], [
+ AC_REQUIRE([gl_WINDOWS_STAT_INODES])
+ ], [
+ WINDOWS_STAT_INODES=0
+ ])
+ AC_SUBST([WINDOWS_STAT_INODES])
+])
+
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd. It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_SYS_TYPES_H_REQUIRE_DEFAULTS],
+[
+ m4_defun(GL_MODULE_INDICATOR_PREFIX[_SYS_TYPE_H_MODULE_INDICATOR_DEFAULTS], [
+ ])
+ m4_require(GL_MODULE_INDICATOR_PREFIX[_SYS_TYPE_H_MODULE_INDICATOR_DEFAULTS])
+ AC_REQUIRE([gl_SYS_TYPES_H_DEFAULTS])
+])
+
+AC_DEFUN([gl_SYS_TYPES_H_DEFAULTS],
+[
+])
+
+# This works around a buggy version in autoconf <= 2.69.
+# See <https://lists.gnu.org/r/autoconf/2016-08/msg00014.html>
+# The 2.70 version isn't quoted properly, so override it too.
+
+m4_version_prereq([2.70.1], [], [
+
+m4_undefine([AC_HEADER_MAJOR])
+AC_DEFUN([AC_HEADER_MAJOR],
+[AC_CHECK_HEADERS_ONCE([sys/types.h])
+AC_CHECK_HEADER([sys/mkdev.h],
+ [AC_DEFINE([MAJOR_IN_MKDEV], [1],
+ [Define to 1 if `major', `minor', and `makedev' are
+ declared in <mkdev.h>.])])
+if test $ac_cv_header_sys_mkdev_h = no; then
+ AC_CHECK_HEADER([sys/sysmacros.h],
+ [AC_DEFINE([MAJOR_IN_SYSMACROS], [1],
+ [Define to 1 if `major', `minor', and `makedev'
+ are declared in <sysmacros.h>.])])
+fi
+])# AC_HEADER_MAJOR
+
+])
diff --git a/gnulib_m4/unistd_h.m4 b/gnulib_m4/unistd_h.m4
new file mode 100644
index 0000000..1c96158
--- /dev/null
+++ b/gnulib_m4/unistd_h.m4
@@ -0,0 +1,275 @@
+# unistd_h.m4 serial 94
+dnl Copyright (C) 2006-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Simon Josefsson, Bruno Haible.
+
+AC_DEFUN_ONCE([gl_UNISTD_H],
+[
+ dnl Ensure to expand the default settings once only, before all statements
+ dnl that occur in other macros.
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+
+ gl_CHECK_NEXT_HEADERS([unistd.h])
+ if test $ac_cv_header_unistd_h = yes; then
+ HAVE_UNISTD_H=1
+ else
+ HAVE_UNISTD_H=0
+ fi
+ AC_SUBST([HAVE_UNISTD_H])
+
+ dnl Ensure the type pid_t gets defined.
+ AC_REQUIRE([AC_TYPE_PID_T])
+
+ dnl Determine WINDOWS_64_BIT_OFF_T.
+ AC_REQUIRE([gl_TYPE_OFF_T])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+/* Some systems declare various items in the wrong headers. */
+#if !(defined __GLIBC__ && !defined __UCLIBC__)
+# include <fcntl.h>
+# include <stdio.h>
+# include <stdlib.h>
+# if defined _WIN32 && ! defined __CYGWIN__
+# include <io.h>
+# endif
+#endif
+ ]], [access chdir chown copy_file_range dup dup2 dup3 environ euidaccess
+ execl execle execlp execv execve execvp execvpe
+ faccessat fchdir
+ fchownat fdatasync fsync ftruncate getcwd getdomainname getdtablesize
+ getentropy getgroups gethostname getlogin getlogin_r getpagesize getpass
+ getusershell setusershell endusershell
+ group_member isatty lchown link linkat lseek pipe pipe2 pread pwrite
+ readlink readlinkat rmdir sethostname sleep symlink symlinkat
+ truncate ttyname_r unlink unlinkat usleep])
+
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ AC_CHECK_DECLS_ONCE([execvpe])
+ if test $ac_cv_have_decl_execvpe = no; then
+ HAVE_DECL_EXECVPE=0
+ fi
+])
+
+# gl_UNISTD_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
+AC_DEFUN([gl_UNISTD_MODULE_INDICATOR],
+[
+ dnl Ensure to expand the default settings once only.
+ gl_UNISTD_H_REQUIRE_DEFAULTS
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd. It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_UNISTD_H_REQUIRE_DEFAULTS],
+[
+ m4_defun(GL_MODULE_INDICATOR_PREFIX[_UNISTD_H_MODULE_INDICATOR_DEFAULTS], [
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ACCESS])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CHDIR])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CHOWN])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CLOSE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_COPY_FILE_RANGE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_DUP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_DUP2])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_DUP3])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ENVIRON])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EUIDACCESS])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXECL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXECLE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXECLP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXECV])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXECVE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXECVP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXECVPE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FACCESSAT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FCHDIR])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FCHOWNAT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FDATASYNC])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FSYNC])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FTRUNCATE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETCWD])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETDOMAINNAME])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETDTABLESIZE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETENTROPY])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETGROUPS])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETHOSTNAME])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETLOGIN])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETLOGIN_R])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETOPT_POSIX])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETPAGESIZE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETPASS])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETPASS_GNU])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETUSERSHELL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GROUP_MEMBER])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISATTY])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LCHOWN])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LINK])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LINKAT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LSEEK])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PIPE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PIPE2])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PREAD])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PWRITE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_READ])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_READLINK])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_READLINKAT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RMDIR])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SETHOSTNAME])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SLEEP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SYMLINK])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SYMLINKAT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TRUNCATE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TTYNAME_R])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNISTD_H_GETOPT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNISTD_H_NONBLOCKING])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNISTD_H_SIGPIPE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNLINK])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNLINKAT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_USLEEP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WRITE])
+ dnl Support Microsoft deprecated alias function names by default.
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_ACCESS], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_CHDIR], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_CLOSE], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_DUP], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_DUP2], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_EXECL], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_EXECLE], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_EXECLP], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_EXECV], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_EXECVE], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_EXECVP], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_EXECVPE], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_GETCWD], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_GETPID], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_ISATTY], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_LSEEK], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_READ], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_RMDIR], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_SWAB], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_UNLINK], [1])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_WRITE], [1])
+ ])
+ m4_require(GL_MODULE_INDICATOR_PREFIX[_UNISTD_H_MODULE_INDICATOR_DEFAULTS])
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+])
+
+AC_DEFUN([gl_UNISTD_H_DEFAULTS],
+[
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_CHOWN=1; AC_SUBST([HAVE_CHOWN])
+ HAVE_COPY_FILE_RANGE=1; AC_SUBST([HAVE_COPY_FILE_RANGE])
+ HAVE_DUP3=1; AC_SUBST([HAVE_DUP3])
+ HAVE_EUIDACCESS=1; AC_SUBST([HAVE_EUIDACCESS])
+ HAVE_EXECVPE=1; AC_SUBST([HAVE_EXECVPE])
+ HAVE_FACCESSAT=1; AC_SUBST([HAVE_FACCESSAT])
+ HAVE_FCHDIR=1; AC_SUBST([HAVE_FCHDIR])
+ HAVE_FCHOWNAT=1; AC_SUBST([HAVE_FCHOWNAT])
+ HAVE_FDATASYNC=1; AC_SUBST([HAVE_FDATASYNC])
+ HAVE_FSYNC=1; AC_SUBST([HAVE_FSYNC])
+ HAVE_FTRUNCATE=1; AC_SUBST([HAVE_FTRUNCATE])
+ HAVE_GETDTABLESIZE=1; AC_SUBST([HAVE_GETDTABLESIZE])
+ HAVE_GETENTROPY=1; AC_SUBST([HAVE_GETENTROPY])
+ HAVE_GETGROUPS=1; AC_SUBST([HAVE_GETGROUPS])
+ HAVE_GETHOSTNAME=1; AC_SUBST([HAVE_GETHOSTNAME])
+ HAVE_GETLOGIN=1; AC_SUBST([HAVE_GETLOGIN])
+ HAVE_GETPAGESIZE=1; AC_SUBST([HAVE_GETPAGESIZE])
+ HAVE_GETPASS=1; AC_SUBST([HAVE_GETPASS])
+ HAVE_GROUP_MEMBER=1; AC_SUBST([HAVE_GROUP_MEMBER])
+ HAVE_LCHOWN=1; AC_SUBST([HAVE_LCHOWN])
+ HAVE_LINK=1; AC_SUBST([HAVE_LINK])
+ HAVE_LINKAT=1; AC_SUBST([HAVE_LINKAT])
+ HAVE_PIPE=1; AC_SUBST([HAVE_PIPE])
+ HAVE_PIPE2=1; AC_SUBST([HAVE_PIPE2])
+ HAVE_PREAD=1; AC_SUBST([HAVE_PREAD])
+ HAVE_PWRITE=1; AC_SUBST([HAVE_PWRITE])
+ HAVE_READLINK=1; AC_SUBST([HAVE_READLINK])
+ HAVE_READLINKAT=1; AC_SUBST([HAVE_READLINKAT])
+ HAVE_SETHOSTNAME=1; AC_SUBST([HAVE_SETHOSTNAME])
+ HAVE_SLEEP=1; AC_SUBST([HAVE_SLEEP])
+ HAVE_SYMLINK=1; AC_SUBST([HAVE_SYMLINK])
+ HAVE_SYMLINKAT=1; AC_SUBST([HAVE_SYMLINKAT])
+ HAVE_UNLINKAT=1; AC_SUBST([HAVE_UNLINKAT])
+ HAVE_USLEEP=1; AC_SUBST([HAVE_USLEEP])
+ HAVE_DECL_ENVIRON=1; AC_SUBST([HAVE_DECL_ENVIRON])
+ HAVE_DECL_EXECVPE=1; AC_SUBST([HAVE_DECL_EXECVPE])
+ HAVE_DECL_FCHDIR=1; AC_SUBST([HAVE_DECL_FCHDIR])
+ HAVE_DECL_FDATASYNC=1; AC_SUBST([HAVE_DECL_FDATASYNC])
+ HAVE_DECL_GETDOMAINNAME=1; AC_SUBST([HAVE_DECL_GETDOMAINNAME])
+ HAVE_DECL_GETLOGIN=1; AC_SUBST([HAVE_DECL_GETLOGIN])
+ HAVE_DECL_GETLOGIN_R=1; AC_SUBST([HAVE_DECL_GETLOGIN_R])
+ HAVE_DECL_GETPAGESIZE=1; AC_SUBST([HAVE_DECL_GETPAGESIZE])
+ HAVE_DECL_GETUSERSHELL=1; AC_SUBST([HAVE_DECL_GETUSERSHELL])
+ HAVE_DECL_SETHOSTNAME=1; AC_SUBST([HAVE_DECL_SETHOSTNAME])
+ HAVE_DECL_TRUNCATE=1; AC_SUBST([HAVE_DECL_TRUNCATE])
+ HAVE_DECL_TTYNAME_R=1; AC_SUBST([HAVE_DECL_TTYNAME_R])
+ HAVE_OS_H=0; AC_SUBST([HAVE_OS_H])
+ HAVE_SYS_PARAM_H=0; AC_SUBST([HAVE_SYS_PARAM_H])
+ REPLACE_ACCESS=0; AC_SUBST([REPLACE_ACCESS])
+ REPLACE_CHOWN=0; AC_SUBST([REPLACE_CHOWN])
+ REPLACE_CLOSE=0; AC_SUBST([REPLACE_CLOSE])
+ REPLACE_COPY_FILE_RANGE=0; AC_SUBST([REPLACE_COPY_FILE_RANGE])
+ REPLACE_DUP=0; AC_SUBST([REPLACE_DUP])
+ REPLACE_DUP2=0; AC_SUBST([REPLACE_DUP2])
+ REPLACE_DUP3=0; AC_SUBST([REPLACE_DUP3])
+ REPLACE_EXECL=0; AC_SUBST([REPLACE_EXECL])
+ REPLACE_EXECLE=0; AC_SUBST([REPLACE_EXECLE])
+ REPLACE_EXECLP=0; AC_SUBST([REPLACE_EXECLP])
+ REPLACE_EXECV=0; AC_SUBST([REPLACE_EXECV])
+ REPLACE_EXECVE=0; AC_SUBST([REPLACE_EXECVE])
+ REPLACE_EXECVP=0; AC_SUBST([REPLACE_EXECVP])
+ REPLACE_EXECVPE=0; AC_SUBST([REPLACE_EXECVPE])
+ REPLACE_FACCESSAT=0; AC_SUBST([REPLACE_FACCESSAT])
+ REPLACE_FCHOWNAT=0; AC_SUBST([REPLACE_FCHOWNAT])
+ REPLACE_FDATASYNC=0; AC_SUBST([REPLACE_FDATASYNC])
+ REPLACE_FTRUNCATE=0; AC_SUBST([REPLACE_FTRUNCATE])
+ REPLACE_GETCWD=0; AC_SUBST([REPLACE_GETCWD])
+ REPLACE_GETDOMAINNAME=0; AC_SUBST([REPLACE_GETDOMAINNAME])
+ REPLACE_GETDTABLESIZE=0; AC_SUBST([REPLACE_GETDTABLESIZE])
+ REPLACE_GETENTROPY=0; AC_SUBST([REPLACE_GETENTROPY])
+ REPLACE_GETLOGIN_R=0; AC_SUBST([REPLACE_GETLOGIN_R])
+ REPLACE_GETGROUPS=0; AC_SUBST([REPLACE_GETGROUPS])
+ REPLACE_GETPAGESIZE=0; AC_SUBST([REPLACE_GETPAGESIZE])
+ REPLACE_GETPASS=0; AC_SUBST([REPLACE_GETPASS])
+ REPLACE_GETPASS_FOR_GETPASS_GNU=0; AC_SUBST([REPLACE_GETPASS_FOR_GETPASS_GNU])
+ REPLACE_ISATTY=0; AC_SUBST([REPLACE_ISATTY])
+ REPLACE_LCHOWN=0; AC_SUBST([REPLACE_LCHOWN])
+ REPLACE_LINK=0; AC_SUBST([REPLACE_LINK])
+ REPLACE_LINKAT=0; AC_SUBST([REPLACE_LINKAT])
+ REPLACE_LSEEK=0; AC_SUBST([REPLACE_LSEEK])
+ REPLACE_PIPE2=0; AC_SUBST([REPLACE_PIPE2])
+ REPLACE_PREAD=0; AC_SUBST([REPLACE_PREAD])
+ REPLACE_PWRITE=0; AC_SUBST([REPLACE_PWRITE])
+ REPLACE_READ=0; AC_SUBST([REPLACE_READ])
+ REPLACE_READLINK=0; AC_SUBST([REPLACE_READLINK])
+ REPLACE_READLINKAT=0; AC_SUBST([REPLACE_READLINKAT])
+ REPLACE_RMDIR=0; AC_SUBST([REPLACE_RMDIR])
+ REPLACE_SETHOSTNAME=0; AC_SUBST([REPLACE_SETHOSTNAME])
+ REPLACE_SLEEP=0; AC_SUBST([REPLACE_SLEEP])
+ REPLACE_SYMLINK=0; AC_SUBST([REPLACE_SYMLINK])
+ REPLACE_SYMLINKAT=0; AC_SUBST([REPLACE_SYMLINKAT])
+ REPLACE_TRUNCATE=0; AC_SUBST([REPLACE_TRUNCATE])
+ REPLACE_TTYNAME_R=0; AC_SUBST([REPLACE_TTYNAME_R])
+ REPLACE_UNLINK=0; AC_SUBST([REPLACE_UNLINK])
+ REPLACE_UNLINKAT=0; AC_SUBST([REPLACE_UNLINKAT])
+ REPLACE_USLEEP=0; AC_SUBST([REPLACE_USLEEP])
+ REPLACE_WRITE=0; AC_SUBST([REPLACE_WRITE])
+ UNISTD_H_HAVE_SYS_RANDOM_H=0; AC_SUBST([UNISTD_H_HAVE_SYS_RANDOM_H])
+ UNISTD_H_HAVE_WINSOCK2_H=0; AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H])
+ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0;
+ AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS])
+])
diff --git a/gnulib_m4/vasnprintf.m4 b/gnulib_m4/vasnprintf.m4
new file mode 100644
index 0000000..fda90c4
--- /dev/null
+++ b/gnulib_m4/vasnprintf.m4
@@ -0,0 +1,298 @@
+# vasnprintf.m4 serial 39
+dnl Copyright (C) 2002-2004, 2006-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_VASNPRINTF],
+[
+ AC_CHECK_FUNCS_ONCE([vasnprintf])
+ if test $ac_cv_func_vasnprintf = no; then
+ gl_REPLACE_VASNPRINTF
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_VASNPRINTF],
+[
+ AC_CHECK_FUNCS_ONCE([vasnprintf])
+ AC_LIBOBJ([vasnprintf])
+ AC_LIBOBJ([printf-args])
+ AC_LIBOBJ([printf-parse])
+ AC_LIBOBJ([asnprintf])
+ if test $ac_cv_func_vasnprintf = yes; then
+ AC_DEFINE([REPLACE_VASNPRINTF], [1],
+ [Define if vasnprintf exists but is overridden by gnulib.])
+ fi
+ gl_PREREQ_PRINTF_ARGS
+ gl_PREREQ_PRINTF_PARSE
+ gl_PREREQ_VASNPRINTF
+ gl_PREREQ_ASNPRINTF
+])
+
+# Prerequisites of lib/printf-args.h, lib/printf-args.c.
+AC_DEFUN([gl_PREREQ_PRINTF_ARGS],
+[
+ AC_REQUIRE([gt_TYPE_WCHAR_T])
+ AC_REQUIRE([gt_TYPE_WINT_T])
+])
+
+# Prerequisites of lib/printf-parse.h, lib/printf-parse.c.
+AC_DEFUN([gl_PREREQ_PRINTF_PARSE],
+[
+ AC_REQUIRE([gl_FEATURES_H])
+ AC_REQUIRE([gt_TYPE_WCHAR_T])
+ AC_REQUIRE([gt_TYPE_WINT_T])
+ AC_REQUIRE([AC_TYPE_SIZE_T])
+ AC_CHECK_TYPE([ptrdiff_t], ,
+ [AC_DEFINE([ptrdiff_t], [long],
+ [Define as the type of the result of subtracting two pointers, if the system doesn't define it.])
+ ])
+ AC_REQUIRE([gt_AC_TYPE_INTMAX_T])
+])
+
+# Prerequisites of lib/vasnprintf.c.
+AC_DEFUN_ONCE([gl_PREREQ_VASNPRINTF],
+[
+ AC_REQUIRE([AC_FUNC_ALLOCA])
+ AC_REQUIRE([gt_TYPE_WCHAR_T])
+ AC_REQUIRE([gt_TYPE_WINT_T])
+ AC_CHECK_FUNCS([snprintf strnlen wcslen wcsnlen mbrtowc wcrtomb])
+ dnl Use the _snprintf function only if it is declared (because on NetBSD it
+ dnl is defined as a weak alias of snprintf; we prefer to use the latter).
+ AC_CHECK_DECLS([_snprintf], , , [[#include <stdio.h>]])
+ dnl Knowing DBL_EXPBIT0_WORD and DBL_EXPBIT0_BIT enables an optimization
+ dnl in the code for NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE.
+ AC_REQUIRE([gl_DOUBLE_EXPONENT_LOCATION])
+ dnl We can avoid a lot of code by assuming that snprintf's return value
+ dnl conforms to ISO C99. So check that.
+ AC_REQUIRE([gl_SNPRINTF_RETVAL_C99])
+ case "$gl_cv_func_snprintf_retval_c99" in
+ *yes)
+ AC_DEFINE([HAVE_SNPRINTF_RETVAL_C99], [1],
+ [Define if the return value of the snprintf function is the number of
+ of bytes (excluding the terminating NUL) that would have been produced
+ if the buffer had been large enough.])
+ ;;
+ esac
+ dnl Additionally, the use of %n can be eliminated by assuming that snprintf
+ dnl always produces NUL-terminated strings (no truncation).
+ AC_REQUIRE([gl_SNPRINTF_TRUNCATION_C99])
+ case "$gl_cv_func_snprintf_truncation_c99" in
+ *yes)
+ AC_DEFINE([HAVE_SNPRINTF_TRUNCATION_C99], [1],
+ [Define if the string produced by the snprintf function is always NUL
+ terminated.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting 'long double'
+# arguments.
+AC_DEFUN_ONCE([gl_PREREQ_VASNPRINTF_LONG_DOUBLE],
+[
+ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_LONG_DOUBLE], [1],
+ [Define if the vasnprintf implementation needs special code for
+ 'long double' arguments.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting infinite 'double'
+# arguments.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE],
+[
+ AC_REQUIRE([gl_PRINTF_INFINITE])
+ case "$gl_cv_func_printf_infinite" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_INFINITE_DOUBLE], [1],
+ [Define if the vasnprintf implementation needs special code for
+ infinite 'double' arguments.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting infinite 'long double'
+# arguments.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE],
+[
+ AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE])
+ dnl There is no need to set NEED_PRINTF_INFINITE_LONG_DOUBLE if
+ dnl NEED_PRINTF_LONG_DOUBLE is already set.
+ AC_REQUIRE([gl_PREREQ_VASNPRINTF_LONG_DOUBLE])
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_infinite_long_double" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_INFINITE_LONG_DOUBLE], [1],
+ [Define if the vasnprintf implementation needs special code for
+ infinite 'long double' arguments.])
+ ;;
+ esac
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting the 'a' directive.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_A],
+[
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+ case "$gl_cv_func_printf_directive_a" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_DIRECTIVE_A], [1],
+ [Define if the vasnprintf implementation needs special code for
+ the 'a' and 'A' directives.])
+ gl_CHECK_FUNCS_ANDROID([nl_langinfo], [[#include <langinfo.h>]])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting the 'F' directive.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_F],
+[
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
+ case "$gl_cv_func_printf_directive_f" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_DIRECTIVE_F], [1],
+ [Define if the vasnprintf implementation needs special code for
+ the 'F' directive.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting the 'ls' directive.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_LS],
+[
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS])
+ case "$gl_cv_func_printf_directive_ls" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_DIRECTIVE_LS], [1],
+ [Define if the vasnprintf implementation needs special code for
+ the 'ls' directive.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting the ' flag.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_GROUPING],
+[
+ AC_REQUIRE([gl_PRINTF_FLAG_GROUPING])
+ case "$gl_cv_func_printf_flag_grouping" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_FLAG_GROUPING], [1],
+ [Define if the vasnprintf implementation needs special code for the
+ ' flag.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting the '-' flag.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST],
+[
+ AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST])
+ case "$gl_cv_func_printf_flag_leftadjust" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_FLAG_LEFTADJUST], [1],
+ [Define if the vasnprintf implementation needs special code for the
+ '-' flag.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting the 0 flag.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_ZERO],
+[
+ AC_REQUIRE([gl_PRINTF_FLAG_ZERO])
+ case "$gl_cv_func_printf_flag_zero" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_FLAG_ZERO], [1],
+ [Define if the vasnprintf implementation needs special code for the
+ 0 flag.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting large precisions.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_PRECISION],
+[
+ AC_REQUIRE([gl_PRINTF_PRECISION])
+ case "$gl_cv_func_printf_precision" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_UNBOUNDED_PRECISION], [1],
+ [Define if the vasnprintf implementation needs special code for
+ supporting large precisions without arbitrary bounds.])
+ AC_DEFINE([NEED_PRINTF_DOUBLE], [1],
+ [Define if the vasnprintf implementation needs special code for
+ 'double' arguments.])
+ AC_DEFINE([NEED_PRINTF_LONG_DOUBLE], [1],
+ [Define if the vasnprintf implementation needs special code for
+ 'long double' arguments.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for surviving out-of-memory
+# conditions.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_ENOMEM],
+[
+ AC_REQUIRE([gl_PRINTF_ENOMEM])
+ case "$gl_cv_func_printf_enomem" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_ENOMEM], [1],
+ [Define if the vasnprintf implementation needs special code for
+ surviving out-of-memory conditions.])
+ AC_DEFINE([NEED_PRINTF_DOUBLE], [1],
+ [Define if the vasnprintf implementation needs special code for
+ 'double' arguments.])
+ AC_DEFINE([NEED_PRINTF_LONG_DOUBLE], [1],
+ [Define if the vasnprintf implementation needs special code for
+ 'long double' arguments.])
+ ;;
+ esac
+])
+
+# Prerequisites of lib/vasnprintf.c including all extras for POSIX compliance.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_WITH_EXTRAS],
+[
+ AC_REQUIRE([gl_PREREQ_VASNPRINTF])
+ gl_PREREQ_VASNPRINTF_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_LS
+ gl_PREREQ_VASNPRINTF_FLAG_GROUPING
+ gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST
+ gl_PREREQ_VASNPRINTF_FLAG_ZERO
+ gl_PREREQ_VASNPRINTF_PRECISION
+ gl_PREREQ_VASNPRINTF_ENOMEM
+])
+
+# Prerequisites of lib/asnprintf.c.
+AC_DEFUN([gl_PREREQ_ASNPRINTF],
+[
+])
diff --git a/gnulib_m4/vsnprintf.m4 b/gnulib_m4/vsnprintf.m4
new file mode 100644
index 0000000..7fbb11c
--- /dev/null
+++ b/gnulib_m4/vsnprintf.m4
@@ -0,0 +1,62 @@
+# vsnprintf.m4 serial 7
+dnl Copyright (C) 2002-2004, 2007-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Libintl 0.17 will replace vsnprintf only if it does not support %1$s,
+dnl but defers to any gnulib vsnprintf replacements. Therefore, gnulib
+dnl must guarantee that the decision for replacing vsnprintf is a superset
+dnl of the reasons checked by libintl.
+AC_DEFUN([gl_FUNC_VSNPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ gl_cv_func_vsnprintf_usable=no
+ AC_CHECK_FUNCS([vsnprintf])
+ if test $ac_cv_func_vsnprintf = yes; then
+ gl_SNPRINTF_SIZE1
+ case "$gl_cv_func_snprintf_size1" in
+ *yes)
+ gl_SNPRINTF_RETVAL_C99
+ case "$gl_cv_func_snprintf_retval_c99" in
+ *yes)
+ gl_PRINTF_POSITIONS
+ case "$gl_cv_func_printf_positions" in
+ *yes)
+ gl_cv_func_vsnprintf_usable=yes
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ if test $gl_cv_func_vsnprintf_usable = no; then
+ gl_REPLACE_VSNPRINTF
+ fi
+ AC_CHECK_DECLS_ONCE([vsnprintf])
+ if test $ac_cv_have_decl_vsnprintf = no; then
+ HAVE_DECL_VSNPRINTF=0
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_VSNPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_LIBOBJ([vsnprintf])
+ if test $ac_cv_func_vsnprintf = yes; then
+ REPLACE_VSNPRINTF=1
+ else
+ AC_CHECK_DECLS_ONCE([vsnprintf])
+ if test $ac_cv_have_decl_vsnprintf = yes; then
+ dnl If the function is declared but does not appear to exist, it may be
+ dnl defined as an inline function. In order to avoid a conflict, we have
+ dnl to define rpl_vsnprintf, not vsnprintf.
+ REPLACE_VSNPRINTF=1
+ fi
+ fi
+ gl_PREREQ_VSNPRINTF
+])
+
+# Prerequisites of lib/vsnprintf.c.
+AC_DEFUN([gl_PREREQ_VSNPRINTF], [:])
diff --git a/gnulib_m4/warn-on-use.m4 b/gnulib_m4/warn-on-use.m4
new file mode 100644
index 0000000..10649c5
--- /dev/null
+++ b/gnulib_m4/warn-on-use.m4
@@ -0,0 +1,62 @@
+# warn-on-use.m4 serial 10
+dnl Copyright (C) 2010-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# gl_WARN_ON_USE_PREPARE(INCLUDES, NAMES)
+# ---------------------------------------
+# If the module 'posixcheck' is in use:
+#
+# For each whitespace-separated element in the list of NAMES, define
+# HAVE_RAW_DECL_name if the function has a declaration among INCLUDES
+# even after being undefined as a macro.
+#
+# See warn-on-use.h for some hints on how to poison function names, as
+# well as ideas on poisoning global variables and macros. NAMES may
+# include global variables, but remember that only functions work with
+# _GL_WARN_ON_USE. Typically, INCLUDES only needs to list a single
+# header, but if the replacement header pulls in other headers because
+# some systems declare functions in the wrong header, then INCLUDES
+# should do likewise.
+#
+# It is generally safe to assume declarations for functions declared
+# in the intersection of C89 and C11 (such as printf) without
+# needing gl_WARN_ON_USE_PREPARE.
+AC_DEFUN([gl_WARN_ON_USE_PREPARE],
+[
+ m4_ifdef([gl_POSIXCHECK],
+ [m4_foreach_w([gl_decl], [$2],
+ [AH_TEMPLATE([HAVE_RAW_DECL_]AS_TR_CPP(m4_defn([gl_decl])),
+ [Define to 1 if ]m4_defn([gl_decl])[ is declared even after
+ undefining macros.])])dnl
+ for gl_func in m4_flatten([$2]); do
+ AS_VAR_PUSHDEF([gl_Symbol], [gl_cv_have_raw_decl_$gl_func])dnl
+ dnl As a workaround to implicit built-in function declarations in
+ dnl clang (e.g. strndup), reference ac_compile_for_check_decl instead
+ dnl of ac_compile. If, for whatever reason, the override of AC_PROG_CC
+ dnl in zzgnulib.m4 is inactive, use the original ac_compile.
+ ac_save_ac_compile="$ac_compile"
+ if test -n "$ac_compile_for_check_decl"; then
+ ac_compile="$ac_compile_for_check_decl"
+ fi
+ AC_CACHE_CHECK([whether $gl_func is declared without a macro],
+ [gl_Symbol],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([$1],
+[[#undef $gl_func
+ (void) $gl_func;]])],
+ [AS_VAR_SET([gl_Symbol], [yes])], [AS_VAR_SET([gl_Symbol], [no])])])
+ ac_compile="$ac_save_ac_compile"
+ AS_VAR_IF([gl_Symbol], [yes],
+ [AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_RAW_DECL_$gl_func]), [1])
+ dnl Shortcut for an AC_CHECK_DECL invocation that may come later:
+ dnl If the raw declaration exists with the given includes, then
+ dnl AC_CHECK_DECL with its many includes would see it as well.
+ dnl So, set a cache variable to allow skipping any later
+ dnl AC_CHECK_DECL invocation for $gl_func.
+ eval "ac_cv_have_decl_$gl_func=yes"
+ ])
+ AS_VAR_POPDEF([gl_Symbol])dnl
+ done
+ ])
+])
diff --git a/gnulib_m4/wchar_h.m4 b/gnulib_m4/wchar_h.m4
new file mode 100644
index 0000000..ad3d4ec
--- /dev/null
+++ b/gnulib_m4/wchar_h.m4
@@ -0,0 +1,258 @@
+dnl A placeholder for ISO C99 <wchar.h>, for platforms that have issues.
+
+dnl Copyright (C) 2007-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Eric Blake.
+
+# wchar_h.m4 serial 56
+
+AC_DEFUN_ONCE([gl_WCHAR_H],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+ AC_REQUIRE([gl_WCHAR_H_INLINE_OK])
+ dnl Prepare for creating substitute <wchar.h>.
+ dnl Check for <wchar.h> (missing in Linux uClibc when built without wide
+ dnl character support).
+ dnl <wchar.h> is always overridden, because of GNULIB_POSIXCHECK.
+ gl_CHECK_NEXT_HEADERS([wchar.h])
+ if test $ac_cv_header_wchar_h = yes; then
+ HAVE_WCHAR_H=1
+ else
+ HAVE_WCHAR_H=0
+ fi
+ AC_SUBST([HAVE_WCHAR_H])
+
+ AC_REQUIRE([gl_FEATURES_H])
+
+ AC_REQUIRE([gt_TYPE_WINT_T])
+ if test $gt_cv_c_wint_t = yes; then
+ HAVE_WINT_T=1
+ else
+ HAVE_WINT_T=0
+ fi
+ AC_SUBST([HAVE_WINT_T])
+
+ AC_REQUIRE([gl_TYPE_WINT_T_PREREQ])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[
+ #include <wchar.h>
+ ]],
+ [btowc wctob mbsinit mbrtowc mbrlen mbsrtowcs mbsnrtowcs wcrtomb
+ wcsrtombs wcsnrtombs wcwidth
+ wmemchr wmemcmp wmemcpy wmemmove wmempcpy wmemset
+ wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat wcscmp
+ wcsncmp wcscasecmp wcsncasecmp wcscoll wcsxfrm wcsdup wcschr wcsrchr
+ wcscspn wcsspn wcspbrk wcsstr wcstok wcswidth wcsftime
+ ])
+
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ AC_CHECK_DECLS([wcsdup], [], [], [[
+ #include <wchar.h>
+ ]])
+ if test $ac_cv_have_decl_wcsdup = no; then
+ HAVE_DECL_WCSDUP=0
+ fi
+])
+
+dnl Check whether <wchar.h> is usable at all.
+AC_DEFUN([gl_WCHAR_H_INLINE_OK],
+[
+ dnl Test whether <wchar.h> suffers due to the transition from '__inline' to
+ dnl 'gnu_inline'. See <https://sourceware.org/bugzilla/show_bug.cgi?id=4022>
+ dnl and <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42440>. In summary,
+ dnl glibc version 2.5 or older, together with gcc version 4.3 or newer and
+ dnl the option -std=c99 or -std=gnu99, leads to a broken <wchar.h>.
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CACHE_CHECK([whether <wchar.h> uses 'inline' correctly],
+ [gl_cv_header_wchar_h_correct_inline],
+ [gl_cv_header_wchar_h_correct_inline=yes
+ case "$host_os" in
+ *-gnu* | gnu*)
+ AC_LANG_CONFTEST([
+ AC_LANG_SOURCE([[
+ #define wcstod renamed_wcstod
+ #include <wchar.h>
+ extern int zero (void);
+ int main () { return zero(); }
+ ]])])
+ dnl Do not rename the object file from conftest.$ac_objext to
+ dnl conftest1.$ac_objext, as this will cause the link to fail on
+ dnl z/OS when using the XPLINK object format (due to duplicate
+ dnl CSECT names). Instead, temporarily redefine $ac_compile so
+ dnl that the object file has the latter name from the start.
+ save_ac_compile="$ac_compile"
+ ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/`
+ if echo '#include "conftest.c"' >conftest1.c \
+ && AC_TRY_EVAL([ac_compile]); then
+ AC_LANG_CONFTEST([
+ AC_LANG_SOURCE([[
+ #define wcstod renamed_wcstod
+ #include <wchar.h>
+ int zero (void) { return 0; }
+ ]])])
+ dnl See note above about renaming object files.
+ ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/`
+ if echo '#include "conftest.c"' >conftest2.c \
+ && AC_TRY_EVAL([ac_compile]); then
+ if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD 2>&1; then
+ :
+ else
+ gl_cv_header_wchar_h_correct_inline=no
+ fi
+ fi
+ fi
+ ac_compile="$save_ac_compile"
+ rm -f conftest[12].c conftest[12].$ac_objext conftest$ac_exeext
+ ;;
+ esac
+ ])
+ if test $gl_cv_header_wchar_h_correct_inline = no; then
+ AC_MSG_ERROR([<wchar.h> cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS).
+This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in
+C99 mode. You have four options:
+ - Add the flag -fgnu89-inline to CC and reconfigure, or
+ - Fix your include files, using parts of
+ <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b037a293a48718af30d706c2e18c929d0e69a621>, or
+ - Use a gcc version older than 4.3, or
+ - Don't use the flags -std=c99 or -std=gnu99.
+Configuration aborted.])
+ fi
+])
+
+# gl_WCHAR_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
+AC_DEFUN([gl_WCHAR_MODULE_INDICATOR],
+[
+ dnl Ensure to expand the default settings once only.
+ gl_WCHAR_H_REQUIRE_DEFAULTS
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd. It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_WCHAR_H_REQUIRE_DEFAULTS],
+[
+ m4_defun(GL_MODULE_INDICATOR_PREFIX[_WCHAR_H_MODULE_INDICATOR_DEFAULTS], [
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_BTOWC])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCTOB])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSINIT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBRTOWC])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBRLEN])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSRTOWCS])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSNRTOWCS])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCRTOMB])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSRTOMBS])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNRTOMBS])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCWIDTH])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMCHR])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMCMP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMCPY])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMMOVE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMPCPY])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMSET])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSLEN])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNLEN])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCPY])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCPCPY])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNCPY])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCPNCPY])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCAT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNCAT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCMP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNCMP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCASECMP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNCASECMP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCOLL])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSXFRM])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSDUP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCHR])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSRCHR])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCSPN])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSSPN])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSPBRK])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSSTR])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSTOK])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSWIDTH])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSFTIME])
+ dnl Support Microsoft deprecated alias function names by default.
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_WCSDUP], [1])
+ ])
+ m4_require(GL_MODULE_INDICATOR_PREFIX[_WCHAR_H_MODULE_INDICATOR_DEFAULTS])
+ dnl Make sure the shell variable for GNULIB_FREE_POSIX is initialized.
+ gl_STDLIB_H_REQUIRE_DEFAULTS
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+])
+
+AC_DEFUN([gl_WCHAR_H_DEFAULTS],
+[
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_BTOWC=1; AC_SUBST([HAVE_BTOWC])
+ HAVE_MBSINIT=1; AC_SUBST([HAVE_MBSINIT])
+ HAVE_MBRTOWC=1; AC_SUBST([HAVE_MBRTOWC])
+ HAVE_MBRLEN=1; AC_SUBST([HAVE_MBRLEN])
+ HAVE_MBSRTOWCS=1; AC_SUBST([HAVE_MBSRTOWCS])
+ HAVE_MBSNRTOWCS=1; AC_SUBST([HAVE_MBSNRTOWCS])
+ HAVE_WCRTOMB=1; AC_SUBST([HAVE_WCRTOMB])
+ HAVE_WCSRTOMBS=1; AC_SUBST([HAVE_WCSRTOMBS])
+ HAVE_WCSNRTOMBS=1; AC_SUBST([HAVE_WCSNRTOMBS])
+ HAVE_WMEMCHR=1; AC_SUBST([HAVE_WMEMCHR])
+ HAVE_WMEMCMP=1; AC_SUBST([HAVE_WMEMCMP])
+ HAVE_WMEMCPY=1; AC_SUBST([HAVE_WMEMCPY])
+ HAVE_WMEMMOVE=1; AC_SUBST([HAVE_WMEMMOVE])
+ HAVE_WMEMPCPY=1; AC_SUBST([HAVE_WMEMPCPY])
+ HAVE_WMEMSET=1; AC_SUBST([HAVE_WMEMSET])
+ HAVE_WCSLEN=1; AC_SUBST([HAVE_WCSLEN])
+ HAVE_WCSNLEN=1; AC_SUBST([HAVE_WCSNLEN])
+ HAVE_WCSCPY=1; AC_SUBST([HAVE_WCSCPY])
+ HAVE_WCPCPY=1; AC_SUBST([HAVE_WCPCPY])
+ HAVE_WCSNCPY=1; AC_SUBST([HAVE_WCSNCPY])
+ HAVE_WCPNCPY=1; AC_SUBST([HAVE_WCPNCPY])
+ HAVE_WCSCAT=1; AC_SUBST([HAVE_WCSCAT])
+ HAVE_WCSNCAT=1; AC_SUBST([HAVE_WCSNCAT])
+ HAVE_WCSCMP=1; AC_SUBST([HAVE_WCSCMP])
+ HAVE_WCSNCMP=1; AC_SUBST([HAVE_WCSNCMP])
+ HAVE_WCSCASECMP=1; AC_SUBST([HAVE_WCSCASECMP])
+ HAVE_WCSNCASECMP=1; AC_SUBST([HAVE_WCSNCASECMP])
+ HAVE_WCSCOLL=1; AC_SUBST([HAVE_WCSCOLL])
+ HAVE_WCSXFRM=1; AC_SUBST([HAVE_WCSXFRM])
+ HAVE_WCSDUP=1; AC_SUBST([HAVE_WCSDUP])
+ HAVE_WCSCHR=1; AC_SUBST([HAVE_WCSCHR])
+ HAVE_WCSRCHR=1; AC_SUBST([HAVE_WCSRCHR])
+ HAVE_WCSCSPN=1; AC_SUBST([HAVE_WCSCSPN])
+ HAVE_WCSSPN=1; AC_SUBST([HAVE_WCSSPN])
+ HAVE_WCSPBRK=1; AC_SUBST([HAVE_WCSPBRK])
+ HAVE_WCSSTR=1; AC_SUBST([HAVE_WCSSTR])
+ HAVE_WCSTOK=1; AC_SUBST([HAVE_WCSTOK])
+ HAVE_WCSWIDTH=1; AC_SUBST([HAVE_WCSWIDTH])
+ HAVE_WCSFTIME=1; AC_SUBST([HAVE_WCSFTIME])
+ HAVE_DECL_WCTOB=1; AC_SUBST([HAVE_DECL_WCTOB])
+ HAVE_DECL_WCSDUP=1; AC_SUBST([HAVE_DECL_WCSDUP])
+ HAVE_DECL_WCWIDTH=1; AC_SUBST([HAVE_DECL_WCWIDTH])
+ REPLACE_MBSTATE_T=0; AC_SUBST([REPLACE_MBSTATE_T])
+ REPLACE_BTOWC=0; AC_SUBST([REPLACE_BTOWC])
+ REPLACE_WCTOB=0; AC_SUBST([REPLACE_WCTOB])
+ REPLACE_MBSINIT=0; AC_SUBST([REPLACE_MBSINIT])
+ REPLACE_MBRTOWC=0; AC_SUBST([REPLACE_MBRTOWC])
+ REPLACE_MBRLEN=0; AC_SUBST([REPLACE_MBRLEN])
+ REPLACE_MBSRTOWCS=0; AC_SUBST([REPLACE_MBSRTOWCS])
+ REPLACE_MBSNRTOWCS=0; AC_SUBST([REPLACE_MBSNRTOWCS])
+ REPLACE_WCRTOMB=0; AC_SUBST([REPLACE_WCRTOMB])
+ REPLACE_WCSRTOMBS=0; AC_SUBST([REPLACE_WCSRTOMBS])
+ REPLACE_WCSNRTOMBS=0; AC_SUBST([REPLACE_WCSNRTOMBS])
+ REPLACE_WCWIDTH=0; AC_SUBST([REPLACE_WCWIDTH])
+ REPLACE_WCSWIDTH=0; AC_SUBST([REPLACE_WCSWIDTH])
+ REPLACE_WCSFTIME=0; AC_SUBST([REPLACE_WCSFTIME])
+ REPLACE_WCSTOK=0; AC_SUBST([REPLACE_WCSTOK])
+ REPLACE_WMEMPCPY=0; AC_SUBST([REPLACE_WMEMPCPY])
+])
diff --git a/gnulib_m4/wchar_t.m4 b/gnulib_m4/wchar_t.m4
new file mode 100644
index 0000000..50bde08
--- /dev/null
+++ b/gnulib_m4/wchar_t.m4
@@ -0,0 +1,24 @@
+# wchar_t.m4 serial 4 (gettext-0.18.2)
+dnl Copyright (C) 2002-2003, 2008-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether <stddef.h> has the 'wchar_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WCHAR_T],
+[
+ AC_CACHE_CHECK([for wchar_t], [gt_cv_c_wchar_t],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stddef.h>
+ wchar_t foo = (wchar_t)'\0';]],
+ [[]])],
+ [gt_cv_c_wchar_t=yes],
+ [gt_cv_c_wchar_t=no])])
+ if test $gt_cv_c_wchar_t = yes; then
+ AC_DEFINE([HAVE_WCHAR_T], [1], [Define if you have the 'wchar_t' type.])
+ fi
+])
diff --git a/gnulib_m4/wctype_h.m4 b/gnulib_m4/wctype_h.m4
new file mode 100644
index 0000000..6856a73
--- /dev/null
+++ b/gnulib_m4/wctype_h.m4
@@ -0,0 +1,200 @@
+# wctype_h.m4 serial 30
+
+dnl A placeholder for ISO C99 <wctype.h>, for platforms that lack it.
+
+dnl Copyright (C) 2006-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Paul Eggert.
+
+AC_DEFUN_ONCE([gl_WCTYPE_H],
+[
+ AC_REQUIRE([gl_WCTYPE_H_DEFAULTS])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CHECK_FUNCS_ONCE([iswcntrl])
+ if test $ac_cv_func_iswcntrl = yes; then
+ HAVE_ISWCNTRL=1
+ else
+ HAVE_ISWCNTRL=0
+ fi
+ AC_SUBST([HAVE_ISWCNTRL])
+
+ AC_REQUIRE([gt_TYPE_WINT_T])
+ if test $gt_cv_c_wint_t = yes; then
+ HAVE_WINT_T=1
+ else
+ HAVE_WINT_T=0
+ fi
+ AC_SUBST([HAVE_WINT_T])
+
+ AC_REQUIRE([gl_TYPE_WINT_T_PREREQ])
+
+ gl_CHECK_NEXT_HEADERS([wctype.h])
+ if test $ac_cv_header_wctype_h = yes; then
+ if test $ac_cv_func_iswcntrl = yes; then
+ dnl Linux libc5 has an iswprint function that returns 0 for all arguments.
+ dnl The other functions are likely broken in the same way.
+ AC_CACHE_CHECK([whether iswcntrl works], [gl_cv_func_iswcntrl_works],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+ #include <wchar.h>
+ #include <wctype.h>
+ int main () { return iswprint ('x') == 0; }
+ ]])],
+ [gl_cv_func_iswcntrl_works=yes], [gl_cv_func_iswcntrl_works=no],
+ [dnl Guess no on Linux libc5, yes otherwise.
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdlib.h>
+ #if __GNU_LIBRARY__ == 1
+ Linux libc5 i18n is broken.
+ #endif]], [[]])],
+ [gl_cv_func_iswcntrl_works="guessing yes"],
+ [gl_cv_func_iswcntrl_works="guessing no"])
+ ])
+ ])
+ fi
+ HAVE_WCTYPE_H=1
+ else
+ HAVE_WCTYPE_H=0
+ fi
+ AC_SUBST([HAVE_WCTYPE_H])
+
+ if test $GNULIBHEADERS_OVERRIDE_WINT_T = 1; then
+ REPLACE_ISWCNTRL=1
+ else
+ case "$gl_cv_func_iswcntrl_works" in
+ *yes) REPLACE_ISWCNTRL=0 ;;
+ *) REPLACE_ISWCNTRL=1 ;;
+ esac
+ fi
+ AC_SUBST([REPLACE_ISWCNTRL])
+
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+ dnl Redefine all of iswcntrl, ..., iswxdigit in <wctype.h>.
+ :
+ fi
+
+ if test $REPLACE_ISWCNTRL = 1; then
+ REPLACE_TOWLOWER=1
+ else
+ AC_CHECK_FUNCS([towlower])
+ if test $ac_cv_func_towlower = yes; then
+ REPLACE_TOWLOWER=0
+ else
+ AC_CHECK_DECLS([towlower],,,
+ [[#include <wchar.h>
+ #if HAVE_WCTYPE_H
+ # include <wctype.h>
+ #endif
+ ]])
+ if test $ac_cv_have_decl_towlower = yes; then
+ dnl On Minix 3.1.8, the system's <wctype.h> declares towlower() and
+ dnl towupper() although it does not have the functions. Avoid a
+ dnl collision with gnulib's replacement.
+ REPLACE_TOWLOWER=1
+ else
+ REPLACE_TOWLOWER=0
+ fi
+ fi
+ fi
+ AC_SUBST([REPLACE_TOWLOWER])
+
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_TOWLOWER = 1; then
+ dnl Redefine towlower, towupper in <wctype.h>.
+ :
+ fi
+
+ dnl We assume that the wctype() and iswctype() functions exist if and only
+ dnl if the type wctype_t is defined in <wchar.h> or in <wctype.h> if that
+ dnl exists.
+ dnl HP-UX 11.00 declares all these in <wchar.h> and lacks <wctype.h>.
+ AC_CACHE_CHECK([for wctype_t], [gl_cv_type_wctype_t],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <wchar.h>
+ #if HAVE_WCTYPE_H
+ # include <wctype.h>
+ #endif
+ wctype_t a;
+ ]],
+ [[]])],
+ [gl_cv_type_wctype_t=yes],
+ [gl_cv_type_wctype_t=no])
+ ])
+ if test $gl_cv_type_wctype_t = no; then
+ HAVE_WCTYPE_T=0
+ fi
+
+ dnl We assume that the wctrans() and towctrans() functions exist if and only
+ dnl if the type wctrans_t is defined in <wctype.h>.
+ AC_CACHE_CHECK([for wctrans_t], [gl_cv_type_wctrans_t],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <wchar.h>
+ #include <wctype.h>
+ wctrans_t a;
+ ]],
+ [[]])],
+ [gl_cv_type_wctrans_t=yes],
+ [gl_cv_type_wctrans_t=no])
+ ])
+ if test $gl_cv_type_wctrans_t = no; then
+ HAVE_WCTRANS_T=0
+ fi
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[
+#if !(defined __GLIBC__ && !defined __UCLIBC__)
+# include <wchar.h>
+#endif
+#include <wctype.h>
+ ]],
+ [wctype iswctype wctrans towctrans
+ ])
+])
+
+# gl_WCTYPE_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
+AC_DEFUN([gl_WCTYPE_MODULE_INDICATOR],
+[
+ dnl Ensure to expand the default settings once only.
+ gl_WCTYPE_H_REQUIRE_DEFAULTS
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd. It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_WCTYPE_H_REQUIRE_DEFAULTS],
+[
+ m4_defun(GL_MODULE_INDICATOR_PREFIX[_WCTYPE_H_MODULE_INDICATOR_DEFAULTS], [
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISWBLANK])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISWDIGIT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISWXDIGIT])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCTYPE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISWCTYPE])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCTRANS])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TOWCTRANS])
+ ])
+ m4_require(GL_MODULE_INDICATOR_PREFIX[_WCTYPE_H_MODULE_INDICATOR_DEFAULTS])
+ AC_REQUIRE([gl_WCTYPE_H_DEFAULTS])
+])
+
+AC_DEFUN([gl_WCTYPE_H_DEFAULTS],
+[
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_ISWBLANK=1; AC_SUBST([HAVE_ISWBLANK])
+ HAVE_WCTYPE_T=1; AC_SUBST([HAVE_WCTYPE_T])
+ HAVE_WCTRANS_T=1; AC_SUBST([HAVE_WCTRANS_T])
+ REPLACE_ISWBLANK=0; AC_SUBST([REPLACE_ISWBLANK])
+ REPLACE_ISWDIGIT=0; AC_SUBST([REPLACE_ISWDIGIT])
+ REPLACE_ISWXDIGIT=0; AC_SUBST([REPLACE_ISWXDIGIT])
+])
diff --git a/gnulib_m4/wcwidth.m4 b/gnulib_m4/wcwidth.m4
new file mode 100644
index 0000000..f204f3d
--- /dev/null
+++ b/gnulib_m4/wcwidth.m4
@@ -0,0 +1,115 @@
+# wcwidth.m4 serial 34
+dnl Copyright (C) 2006-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_WCWIDTH],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ dnl Persuade glibc <wchar.h> to declare wcwidth().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gt_TYPE_WCHAR_T])
+ AC_REQUIRE([gt_TYPE_WINT_T])
+
+ AC_CHECK_HEADERS_ONCE([wchar.h])
+ AC_CHECK_FUNCS_ONCE([wcwidth])
+
+ AC_CHECK_DECLS([wcwidth], [], [], [[
+ #include <wchar.h>
+ ]])
+ if test $ac_cv_have_decl_wcwidth != yes; then
+ HAVE_DECL_WCWIDTH=0
+ fi
+
+ if test $ac_cv_func_wcwidth != yes; then
+ AC_CACHE_CHECK([whether wcwidth is a macro],
+ [gl_cv_func_wcwidth_macro],
+ [AC_EGREP_CPP([wchar_header_defines_wcwidth], [
+#include <wchar.h>
+#ifdef wcwidth
+ wchar_header_defines_wcwidth
+#endif],
+ [gl_cv_func_wcwidth_macro=yes],
+ [gl_cv_func_wcwidth_macro=no])
+ ])
+ fi
+
+ if test $ac_cv_func_wcwidth = yes || test $gl_cv_func_wcwidth_macro = yes; then
+ HAVE_WCWIDTH=1
+ dnl On Mac OS X 10.3, wcwidth(0x0301) (COMBINING ACUTE ACCENT) returns 1.
+ dnl On NetBSD 9.0, OpenBSD 5.0, MidnightBSD 1.1,
+ dnl wcwidth(0x05B0) (HEBREW POINT SHEVA) returns 1.
+ dnl On NetBSD 9.0, MidnightBSD 1.1, OSF/1 5.1,
+ dnl wcwidth(0x200B) (ZERO WIDTH SPACE) returns 1.
+ dnl On OpenBSD 5.8, wcwidth(0xFF1A) (FULLWIDTH COLON) returns 0.
+ dnl This leads to bugs in 'ls' (coreutils).
+ dnl On Solaris 11.4, wcwidth(0x2202) (PARTIAL DIFFERENTIAL) returns 2,
+ dnl even in Western locales.
+ AC_CACHE_CHECK([whether wcwidth works reasonably in UTF-8 locales],
+ [gl_cv_func_wcwidth_works],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <wchar.h>
+#if !HAVE_DECL_WCWIDTH
+extern
+# ifdef __cplusplus
+"C"
+# endif
+int wcwidth (int);
+#endif
+int main ()
+{
+ int result = 0;
+ if (setlocale (LC_ALL, "en_US.UTF-8") != NULL)
+ {
+ if (wcwidth (0x0301) > 0)
+ result |= 1;
+ if (wcwidth (0x05B0) > 0)
+ result |= 2;
+ if (wcwidth (0x200B) > 0)
+ result |= 4;
+ if (wcwidth (0xFF1A) == 0)
+ result |= 8;
+ if (wcwidth (0x2202) > 1)
+ result |= 16;
+ }
+ return result;
+}]])],
+ [gl_cv_func_wcwidth_works=yes],
+ [gl_cv_func_wcwidth_works=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_wcwidth_works="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_wcwidth_works="guessing yes";;
+ # Guess yes on AIX 7 systems.
+ aix[7-9]*) gl_cv_func_wcwidth_works="guessing yes";;
+ *) gl_cv_func_wcwidth_works="$gl_cross_guess_normal";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+ case "$gl_cv_func_wcwidth_works" in
+ *yes) ;;
+ *no) REPLACE_WCWIDTH=1 ;;
+ esac
+ else
+ HAVE_WCWIDTH=0
+ fi
+ dnl We don't substitute HAVE_WCWIDTH. We assume that if the system does not
+ dnl have the wcwidth function, then it does not declare it.
+])
+
+# Prerequisites of lib/wcwidth.c.
+AC_DEFUN([gl_PREREQ_WCWIDTH], [
+ AC_REQUIRE([AC_C_INLINE])
+ :
+])
diff --git a/gnulib_m4/wint_t.m4 b/gnulib_m4/wint_t.m4
new file mode 100644
index 0000000..dfd743b
--- /dev/null
+++ b/gnulib_m4/wint_t.m4
@@ -0,0 +1,57 @@
+# wint_t.m4 serial 11
+dnl Copyright (C) 2003, 2007-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether <wchar.h> has the 'wint_t' type and whether gnulib's
+dnl <wchar.h> or <wctype.h> would, if present, override 'wint_t'.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WINT_T],
+[
+ AC_CACHE_CHECK([for wint_t], [gt_cv_c_wint_t],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <wchar.h>
+ wint_t foo = (wchar_t)'\0';]],
+ [[]])],
+ [gt_cv_c_wint_t=yes],
+ [gt_cv_c_wint_t=no])])
+ if test $gt_cv_c_wint_t = yes; then
+ AC_DEFINE([HAVE_WINT_T], [1], [Define if you have the 'wint_t' type.])
+
+ dnl Determine whether gnulib's <wchar.h> or <wctype.h> would, if present,
+ dnl override 'wint_t'.
+ AC_CACHE_CHECK([whether wint_t is large enough],
+ [gl_cv_type_wint_t_large_enough],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <wchar.h>
+ int verify[sizeof (wint_t) < sizeof (int) ? -1 : 1];
+ ]])],
+ [gl_cv_type_wint_t_large_enough=yes],
+ [gl_cv_type_wint_t_large_enough=no])])
+ if test $gl_cv_type_wint_t_large_enough = no; then
+ GNULIBHEADERS_OVERRIDE_WINT_T=1
+ else
+ GNULIBHEADERS_OVERRIDE_WINT_T=0
+ fi
+ else
+ GNULIBHEADERS_OVERRIDE_WINT_T=0
+ fi
+ AC_SUBST([GNULIBHEADERS_OVERRIDE_WINT_T])
+])
+
+dnl Prerequisites of the 'wint_t' override.
+AC_DEFUN([gl_TYPE_WINT_T_PREREQ],
+[
+ AC_CHECK_HEADERS_ONCE([crtdefs.h])
+ if test $ac_cv_header_crtdefs_h = yes; then
+ HAVE_CRTDEFS_H=1
+ else
+ HAVE_CRTDEFS_H=0
+ fi
+ AC_SUBST([HAVE_CRTDEFS_H])
+])
diff --git a/gnulib_m4/xsize.m4 b/gnulib_m4/xsize.m4
new file mode 100644
index 0000000..649db9c
--- /dev/null
+++ b/gnulib_m4/xsize.m4
@@ -0,0 +1,12 @@
+# xsize.m4 serial 5
+dnl Copyright (C) 2003-2004, 2008-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_XSIZE],
+[
+ dnl Prerequisites of lib/xsize.h.
+ AC_REQUIRE([gl_SIZE_MAX])
+ AC_CHECK_HEADERS([stdint.h])
+])
diff --git a/gnulib_m4/zzgnulib.m4 b/gnulib_m4/zzgnulib.m4
new file mode 100644
index 0000000..362102b
--- /dev/null
+++ b/gnulib_m4/zzgnulib.m4
@@ -0,0 +1,23 @@
+# zzgnulib.m4 serial 1
+dnl Copyright (C) 2020-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This file must be named something that sorts after all other
+dnl package- or gnulib-provided .m4 files - at least for those packages
+dnl that redefine AC_PROG_CC.
+
+dnl Redefine AC_PROG_CC so that it ends with invocations of gl_COMPILER_CLANG
+dnl and gl_COMPILER_PREPARE_CHECK_DECL.
+m4_define([AC_PROG_CC],
+ m4_defn([AC_PROG_CC])[
+gl_COMPILER_CLANG
+gl_COMPILER_PREPARE_CHECK_DECL
+])
+
+# gl_ZZGNULIB
+# -----------
+# Witness macro that this file has been included. Needed to force
+# Automake to include this file after all other gnulib .m4 files.
+AC_DEFUN([gl_ZZGNULIB])
diff --git a/lib/_Noreturn.h b/lib/_Noreturn.h
new file mode 100644
index 0000000..6ecea98
--- /dev/null
+++ b/lib/_Noreturn.h
@@ -0,0 +1,50 @@
+/* A C macro for declaring that a function does not return.
+ Copyright (C) 2011-2023 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#ifndef _Noreturn
+# if (defined __cplusplus \
+ && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \
+ || (defined _MSC_VER && 1900 <= _MSC_VER)) \
+ && 0)
+ /* [[noreturn]] is not practically usable, because with it the syntax
+ extern _Noreturn void func (...);
+ would not be valid; such a declaration would only be valid with 'extern'
+ and '_Noreturn' swapped, or without the 'extern' keyword. However, some
+ AIX system header files and several gnulib header files use precisely
+ this syntax with 'extern'. */
+# define _Noreturn [[noreturn]]
+# elif (defined __clang__ && __clang_major__ < 16 \
+ && defined _GL_WORK_AROUND_LLVM_BUG_59792)
+ /* Compile with -D_GL_WORK_AROUND_LLVM_BUG_59792 to work around
+ that rare LLVM bug, though you may get many false-alarm warnings. */
+# define _Noreturn
+# elif ((!defined __cplusplus || defined __clang__) \
+ && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
+ || (!defined __STRICT_ANSI__ \
+ && (4 < __GNUC__ + (7 <= __GNUC_MINOR__) \
+ || (defined __apple_build_version__ \
+ ? 6000000 <= __apple_build_version__ \
+ : 3 < __clang_major__ + (5 <= __clang_minor__))))))
+ /* _Noreturn works as-is. */
+# elif (2 < __GNUC__ + (8 <= __GNUC_MINOR__) || defined __clang__ \
+ || 0x5110 <= __SUNPRO_C)
+# define _Noreturn __attribute__ ((__noreturn__))
+# elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
+# define _Noreturn __declspec (noreturn)
+# else
+# define _Noreturn
+# endif
+#endif
diff --git a/lib/alloca.in.h b/lib/alloca.in.h
new file mode 100644
index 0000000..a1bb3d7
--- /dev/null
+++ b/lib/alloca.in.h
@@ -0,0 +1,72 @@
+/* Memory allocation on the stack.
+
+ Copyright (C) 1995, 1999, 2001-2004, 2006-2023 Free Software Foundation,
+ Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H
+ means there is a real alloca function. */
+#ifndef _GL_ALLOCA_H
+#define _GL_ALLOCA_H
+
+/* alloca (N) returns a pointer to N bytes of memory
+ allocated on the stack, which will last until the function returns.
+ Use of alloca should be avoided:
+ - inside arguments of function calls - undefined behaviour,
+ - in inline functions - the allocation may actually last until the
+ calling function returns,
+ - for huge N (say, N >= 65536) - you never know how large (or small)
+ the stack is, and when the stack cannot fulfill the memory allocation
+ request, the program just crashes.
+ */
+
+#ifndef alloca
+ /* Some version of mingw have an <alloca.h> that causes trouble when
+ included after 'alloca' gets defined as a macro. As a workaround,
+ include this <alloca.h> first and define 'alloca' as a macro afterwards
+ if needed. */
+# if defined __GNUC__ && (defined _WIN32 && ! defined __CYGWIN__) && @HAVE_ALLOCA_H@
+# include_next <alloca.h>
+# endif
+#endif
+#ifndef alloca
+# if defined __GNUC__ || (__clang_major__ >= 4)
+# define alloca __builtin_alloca
+# elif defined _AIX
+# define alloca __alloca
+# elif defined _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# elif defined __DECC && defined __VMS
+# define alloca __ALLOCA
+# elif defined __TANDEM && defined _TNS_E_TARGET
+# ifdef __cplusplus
+extern "C"
+# endif
+void *_alloca (unsigned short);
+# pragma intrinsic (_alloca)
+# define alloca _alloca
+# elif defined __MVS__
+# include <stdlib.h>
+# else
+# include <stddef.h>
+# ifdef __cplusplus
+extern "C"
+# endif
+void *alloca (size_t);
+# endif
+#endif
+
+#endif /* _GL_ALLOCA_H */
diff --git a/lib/arg-nonnull.h b/lib/arg-nonnull.h
new file mode 100644
index 0000000..9498ae1
--- /dev/null
+++ b/lib/arg-nonnull.h
@@ -0,0 +1,26 @@
+/* A C macro for declaring that specific arguments must not be NULL.
+ Copyright (C) 2009-2023 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
+ that the values passed as arguments n, ..., m must be non-NULL pointers.
+ n = 1 stands for the first argument, n = 2 for the second argument etc. */
+#ifndef _GL_ARG_NONNULL
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
+# define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
+# else
+# define _GL_ARG_NONNULL(params)
+# endif
+#endif
diff --git a/lib/asnprintf.c b/lib/asnprintf.c
new file mode 100644
index 0000000..f4861bf
--- /dev/null
+++ b/lib/asnprintf.c
@@ -0,0 +1,34 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "vasnprintf.h"
+
+#include <stdarg.h>
+
+char *
+asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
+{
+ va_list args;
+ char *result;
+
+ va_start (args, format);
+ result = vasnprintf (resultbuf, lengthp, format, args);
+ va_end (args);
+ return result;
+}
diff --git a/lib/assert.in.h b/lib/assert.in.h
new file mode 100644
index 0000000..b0ab99c
--- /dev/null
+++ b/lib/assert.in.h
@@ -0,0 +1,27 @@
+/* Substitute for and wrapper around <assert.h>
+ Copyright (C) 2011-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Do not guard the include, since <assert.h> is supposed to define
+ the assert macro each time it is included. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#@INCLUDE_NEXT@ @NEXT_ASSERT_H@
+
+/* The definition of static_assert is copied here. */
diff --git a/lib/attribute.h b/lib/attribute.h
new file mode 100644
index 0000000..130644d
--- /dev/null
+++ b/lib/attribute.h
@@ -0,0 +1,226 @@
+/* ATTRIBUTE_* macros for using attributes in GCC and similar compilers
+
+ Copyright 2020-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+/* Provide public ATTRIBUTE_* names for the private _GL_ATTRIBUTE_*
+ macros used within Gnulib. */
+
+/* These attributes can be placed in two ways:
+ - At the start of a declaration (i.e. even before storage-class
+ specifiers!); then they apply to all entities that are declared
+ by the declaration.
+ - Immediately after the name of an entity being declared by the
+ declaration; then they apply to that entity only. */
+
+#ifndef _GL_ATTRIBUTE_H
+#define _GL_ATTRIBUTE_H
+
+
+/* This file defines two types of attributes:
+ * C23 standard attributes. These have macro names that do not begin with
+ 'ATTRIBUTE_'.
+ * Selected GCC attributes; see:
+ https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html
+ https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html
+ https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html
+ These names begin with 'ATTRIBUTE_' to avoid name clashes. */
+
+
+/* =============== Attributes for specific kinds of functions =============== */
+
+/* Attributes for functions that should not be used. */
+
+/* Warn if the entity is used. */
+/* Applies to:
+ - function, variable,
+ - struct, union, struct/union member,
+ - enumeration, enumeration item,
+ - typedef,
+ in C++ also: namespace, class, template specialization. */
+#define DEPRECATED _GL_ATTRIBUTE_DEPRECATED
+
+/* If a function call is not optimized way, warn with MSG. */
+/* Applies to: functions. */
+#define ATTRIBUTE_WARNING(msg) _GL_ATTRIBUTE_WARNING (msg)
+
+/* If a function call is not optimized way, report an error with MSG. */
+/* Applies to: functions. */
+#define ATTRIBUTE_ERROR(msg) _GL_ATTRIBUTE_ERROR (msg)
+
+
+/* Attributes for memory-allocating functions. */
+
+/* The function returns a pointer to freshly allocated memory. */
+/* Applies to: functions. */
+#define ATTRIBUTE_MALLOC _GL_ATTRIBUTE_MALLOC
+
+/* ATTRIBUTE_ALLOC_SIZE ((N)) - The Nth argument of the function
+ is the size of the returned memory block.
+ ATTRIBUTE_ALLOC_SIZE ((M, N)) - Multiply the Mth and Nth arguments
+ to determine the size of the returned memory block. */
+/* Applies to: function, pointer to function, function types. */
+#define ATTRIBUTE_ALLOC_SIZE(args) _GL_ATTRIBUTE_ALLOC_SIZE (args)
+
+/* ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+ that can be freed by passing them as the Ith argument to the
+ function F.
+ ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
+ can be freed via 'free'; it can be used only after declaring 'free'. */
+/* Applies to: functions. Cannot be used on inline functions. */
+#define ATTRIBUTE_DEALLOC(f, i) _GL_ATTRIBUTE_DEALLOC(f, i)
+#define ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC_FREE
+
+/* Attributes for variadic functions. */
+
+/* The variadic function expects a trailing NULL argument.
+ ATTRIBUTE_SENTINEL () - The last argument is NULL (requires C99).
+ ATTRIBUTE_SENTINEL ((N)) - The (N+1)st argument from the end is NULL. */
+/* Applies to: functions. */
+#define ATTRIBUTE_SENTINEL(pos) _GL_ATTRIBUTE_SENTINEL (pos)
+
+
+/* ================== Attributes for compiler diagnostics ================== */
+
+/* Attributes that help the compiler diagnose programmer mistakes.
+ Some of them may also help for some compiler optimizations. */
+
+/* ATTRIBUTE_FORMAT ((ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK)) -
+ The STRING-INDEXth function argument is a format string of style
+ ARCHETYPE, which is one of:
+ printf, gnu_printf
+ scanf, gnu_scanf,
+ strftime, gnu_strftime,
+ strfmon,
+ or the same thing prefixed and suffixed with '__'.
+ If FIRST-TO-CHECK is not 0, arguments starting at FIRST-TO_CHECK
+ are suitable for the format string. */
+/* Applies to: functions. */
+#define ATTRIBUTE_FORMAT(spec) _GL_ATTRIBUTE_FORMAT (spec)
+
+/* ATTRIBUTE_NONNULL ((N1, N2,...)) - Arguments N1, N2,... must not be NULL.
+ ATTRIBUTE_NONNULL () - All pointer arguments must not be null. */
+/* Applies to: functions. */
+#define ATTRIBUTE_NONNULL(args) _GL_ATTRIBUTE_NONNULL (args)
+
+/* The function's return value is a non-NULL pointer. */
+/* Applies to: functions. */
+#define ATTRIBUTE_RETURNS_NONNULL _GL_ATTRIBUTE_RETURNS_NONNULL
+
+/* Warn if the caller does not use the return value,
+ unless the caller uses something like ignore_value. */
+/* Applies to: function, enumeration, class. */
+#define NODISCARD _GL_ATTRIBUTE_NODISCARD
+
+
+/* Attributes that disable false alarms when the compiler diagnoses
+ programmer "mistakes". */
+
+/* Do not warn if the entity is not used. */
+/* Applies to:
+ - function, variable,
+ - struct, union, struct/union member,
+ - enumeration, enumeration item,
+ - typedef,
+ in C++ also: class. */
+#define MAYBE_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED
+
+/* The contents of a character array is not meant to be NUL-terminated. */
+/* Applies to: struct/union members and variables that are arrays of element
+ type '[[un]signed] char'. */
+#define ATTRIBUTE_NONSTRING _GL_ATTRIBUTE_NONSTRING
+
+/* Do not warn if control flow falls through to the immediately
+ following 'case' or 'default' label. */
+/* Applies to: Empty statement (;), inside a 'switch' statement. */
+#define FALLTHROUGH _GL_ATTRIBUTE_FALLTHROUGH
+
+
+/* ================== Attributes for debugging information ================== */
+
+/* Attributes regarding debugging information emitted by the compiler. */
+
+/* Omit the function from stack traces when debugging. */
+/* Applies to: function. */
+#define ATTRIBUTE_ARTIFICIAL _GL_ATTRIBUTE_ARTIFICIAL
+
+/* Make the entity visible to debuggers etc., even with '-fwhole-program'. */
+/* Applies to: functions, variables. */
+#define ATTRIBUTE_EXTERNALLY_VISIBLE _GL_ATTRIBUTE_EXTERNALLY_VISIBLE
+
+
+/* ========== Attributes that mainly direct compiler optimizations ========== */
+
+/* The function does not throw exceptions. */
+/* Applies to: functions. */
+#define ATTRIBUTE_NOTHROW _GL_ATTRIBUTE_NOTHROW
+
+/* Do not inline the function. */
+/* Applies to: functions. */
+#define ATTRIBUTE_NOINLINE _GL_ATTRIBUTE_NOINLINE
+
+/* Always inline the function, and report an error if the compiler
+ cannot inline. */
+/* Applies to: function. */
+#define ATTRIBUTE_ALWAYS_INLINE _GL_ATTRIBUTE_ALWAYS_INLINE
+
+/* It is OK for a compiler to omit duplicate calls with the same arguments.
+ This attribute is safe for a function that neither depends on
+ nor affects observable state, and always returns exactly once -
+ e.g., does not loop forever, and does not call longjmp.
+ (This attribute is stricter than ATTRIBUTE_PURE.) */
+/* Applies to: functions. */
+#define ATTRIBUTE_CONST _GL_ATTRIBUTE_CONST
+
+/* It is OK for a compiler to omit duplicate calls with the same
+ arguments if observable state is not changed between calls.
+ This attribute is safe for a function that does not affect
+ observable state, and always returns exactly once.
+ (This attribute is looser than ATTRIBUTE_CONST.) */
+/* Applies to: functions. */
+#define ATTRIBUTE_PURE _GL_ATTRIBUTE_PURE
+
+/* The function is rarely executed. */
+/* Applies to: functions. */
+#define ATTRIBUTE_COLD _GL_ATTRIBUTE_COLD
+
+/* If called from some other compilation unit, the function executes
+ code from that unit only by return or by exception handling,
+ letting the compiler optimize that unit more aggressively. */
+/* Applies to: functions. */
+#define ATTRIBUTE_LEAF _GL_ATTRIBUTE_LEAF
+
+/* For struct members: The member has the smallest possible alignment.
+ For struct, union, class: All members have the smallest possible alignment,
+ minimizing the memory required. */
+/* Applies to: struct members, struct, union,
+ in C++ also: class. */
+#define ATTRIBUTE_PACKED _GL_ATTRIBUTE_PACKED
+
+
+/* ================ Attributes that make invalid code valid ================ */
+
+/* Attributes that prevent fatal compiler optimizations for code that is not
+ fully ISO C compliant. */
+
+/* Pointers to the type may point to the same storage as pointers to
+ other types, thus disabling strict aliasing optimization. */
+/* Applies to: types. */
+#define ATTRIBUTE_MAY_ALIAS _GL_ATTRIBUTE_MAY_ALIAS
+
+
+#endif /* _GL_ATTRIBUTE_H */
diff --git a/lib/c++defs.h b/lib/c++defs.h
new file mode 100644
index 0000000..8ad4695
--- /dev/null
+++ b/lib/c++defs.h
@@ -0,0 +1,331 @@
+/* C++ compatible function declaration macros.
+ Copyright (C) 2010-2023 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#ifndef _GL_CXXDEFS_H
+#define _GL_CXXDEFS_H
+
+/* Begin/end the GNULIB_NAMESPACE namespace. */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_BEGIN_NAMESPACE namespace GNULIB_NAMESPACE {
+# define _GL_END_NAMESPACE }
+#else
+# define _GL_BEGIN_NAMESPACE
+# define _GL_END_NAMESPACE
+#endif
+
+/* The three most frequent use cases of these macros are:
+
+ * For providing a substitute for a function that is missing on some
+ platforms, but is declared and works fine on the platforms on which
+ it exists:
+
+ #if @GNULIB_FOO@
+ # if !@HAVE_FOO@
+ _GL_FUNCDECL_SYS (foo, ...);
+ # endif
+ _GL_CXXALIAS_SYS (foo, ...);
+ _GL_CXXALIASWARN (foo);
+ #elif defined GNULIB_POSIXCHECK
+ ...
+ #endif
+
+ * For providing a replacement for a function that exists on all platforms,
+ but is broken/insufficient and needs to be replaced on some platforms:
+
+ #if @GNULIB_FOO@
+ # if @REPLACE_FOO@
+ # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+ # undef foo
+ # define foo rpl_foo
+ # endif
+ _GL_FUNCDECL_RPL (foo, ...);
+ _GL_CXXALIAS_RPL (foo, ...);
+ # else
+ _GL_CXXALIAS_SYS (foo, ...);
+ # endif
+ _GL_CXXALIASWARN (foo);
+ #elif defined GNULIB_POSIXCHECK
+ ...
+ #endif
+
+ * For providing a replacement for a function that exists on some platforms
+ but is broken/insufficient and needs to be replaced on some of them and
+ is additionally either missing or undeclared on some other platforms:
+
+ #if @GNULIB_FOO@
+ # if @REPLACE_FOO@
+ # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+ # undef foo
+ # define foo rpl_foo
+ # endif
+ _GL_FUNCDECL_RPL (foo, ...);
+ _GL_CXXALIAS_RPL (foo, ...);
+ # else
+ # if !@HAVE_FOO@ or if !@HAVE_DECL_FOO@
+ _GL_FUNCDECL_SYS (foo, ...);
+ # endif
+ _GL_CXXALIAS_SYS (foo, ...);
+ # endif
+ _GL_CXXALIASWARN (foo);
+ #elif defined GNULIB_POSIXCHECK
+ ...
+ #endif
+*/
+
+/* _GL_EXTERN_C declaration;
+ performs the declaration with C linkage. */
+#if defined __cplusplus
+# define _GL_EXTERN_C extern "C"
+#else
+# define _GL_EXTERN_C extern
+#endif
+
+/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
+ declares a replacement function, named rpl_func, with the given prototype,
+ consisting of return type, parameters, and attributes.
+ Example:
+ _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
+ _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
+ _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
+#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
+ _GL_EXTERN_C rettype rpl_func parameters_and_attributes
+
+/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
+ declares the system function, named func, with the given prototype,
+ consisting of return type, parameters, and attributes.
+ Example:
+ _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
+ _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
+ _GL_EXTERN_C rettype func parameters_and_attributes
+
+/* _GL_CXXALIAS_RPL (func, rettype, parameters);
+ declares a C++ alias called GNULIB_NAMESPACE::func
+ that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
+ Example:
+ _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
+
+ Wrapping rpl_func in an object with an inline conversion operator
+ avoids a reference to rpl_func unless GNULIB_NAMESPACE::func is
+ actually used in the program. */
+#define _GL_CXXALIAS_RPL(func,rettype,parameters) \
+ _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+ namespace GNULIB_NAMESPACE \
+ { \
+ static const struct _gl_ ## func ## _wrapper \
+ { \
+ typedef rettype (*type) parameters; \
+ \
+ inline operator type () const \
+ { \
+ return ::rpl_func; \
+ } \
+ } func = {}; \
+ } \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+ is to be used when func is a Microsoft deprecated alias, on native Windows.
+ It declares a C++ alias called GNULIB_NAMESPACE::func
+ that redirects to _func, if GNULIB_NAMESPACE is defined.
+ Example:
+ _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+ _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
+/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
+ is like _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
+ except that the C function rpl_func may have a slightly different
+ declaration. A cast is used to silence the "invalid conversion" error
+ that would otherwise occur. */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+ namespace GNULIB_NAMESPACE \
+ { \
+ static const struct _gl_ ## func ## _wrapper \
+ { \
+ typedef rettype (*type) parameters; \
+ \
+ inline operator type () const \
+ { \
+ return reinterpret_cast<type>(::rpl_func); \
+ } \
+ } func = {}; \
+ } \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+ is like _GL_CXXALIAS_MDA (func, rettype, parameters);
+ except that the C function func may have a slightly different declaration.
+ A cast is used to silence the "invalid conversion" error that would
+ otherwise occur. */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+ _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
+/* _GL_CXXALIAS_SYS (func, rettype, parameters);
+ declares a C++ alias called GNULIB_NAMESPACE::func
+ that redirects to the system provided function func, if GNULIB_NAMESPACE
+ is defined.
+ Example:
+ _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
+
+ Wrapping func in an object with an inline conversion operator
+ avoids a reference to func unless GNULIB_NAMESPACE::func is
+ actually used in the program. */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
+ namespace GNULIB_NAMESPACE \
+ { \
+ static const struct _gl_ ## func ## _wrapper \
+ { \
+ typedef rettype (*type) parameters; \
+ \
+ inline operator type () const \
+ { \
+ return ::func; \
+ } \
+ } func = {}; \
+ } \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
+ is like _GL_CXXALIAS_SYS (func, rettype, parameters);
+ except that the C function func may have a slightly different declaration.
+ A cast is used to silence the "invalid conversion" error that would
+ otherwise occur. */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+ namespace GNULIB_NAMESPACE \
+ { \
+ static const struct _gl_ ## func ## _wrapper \
+ { \
+ typedef rettype (*type) parameters; \
+ \
+ inline operator type () const \
+ { \
+ return reinterpret_cast<type>(::func); \
+ } \
+ } func = {}; \
+ } \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
+ is like _GL_CXXALIAS_SYS (func, rettype, parameters);
+ except that the C function is picked among a set of overloaded functions,
+ namely the one with rettype2 and parameters2. Two consecutive casts
+ are used to silence the "cannot find a match" and "invalid conversion"
+ errors that would otherwise occur. */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+ /* The outer cast must be a reinterpret_cast.
+ The inner cast: When the function is defined as a set of overloaded
+ functions, it works as a static_cast<>, choosing the designated variant.
+ When the function is defined as a single variant, it works as a
+ reinterpret_cast<>. The parenthesized cast syntax works both ways. */
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+ namespace GNULIB_NAMESPACE \
+ { \
+ static const struct _gl_ ## func ## _wrapper \
+ { \
+ typedef rettype (*type) parameters; \
+ \
+ inline operator type () const \
+ { \
+ return reinterpret_cast<type>((rettype2 (*) parameters2)(::func)); \
+ } \
+ } func = {}; \
+ } \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN (func);
+ causes a warning to be emitted when ::func is used but not when
+ GNULIB_NAMESPACE::func is used. func must be defined without overloaded
+ variants. */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN(func) \
+ _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN_1(func,namespace) \
+ _GL_CXXALIASWARN_2 (func, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+ we enable the warning only when not optimizing. */
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
+# define _GL_CXXALIASWARN_2(func,namespace) \
+ _GL_WARN_ON_USE (func, \
+ "The symbol ::" #func " refers to the system function. " \
+ "Use " #namespace "::" #func " instead.")
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# define _GL_CXXALIASWARN_2(func,namespace) \
+ extern __typeof__ (func) func
+# else
+# define _GL_CXXALIASWARN_2(func,namespace) \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN(func) \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
+ causes a warning to be emitted when the given overloaded variant of ::func
+ is used but not when GNULIB_NAMESPACE::func is used. */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+ _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
+ GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
+ _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+ we enable the warning only when not optimizing. */
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
+# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+ _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
+ "The symbol ::" #func " refers to the system function. " \
+ "Use " #namespace "::" #func " instead.")
+# else
+# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+#endif /* _GL_CXXDEFS_H */
diff --git a/lib/errno.in.h b/lib/errno.in.h
new file mode 100644
index 0000000..3dda9c2
--- /dev/null
+++ b/lib/errno.in.h
@@ -0,0 +1,279 @@
+/* A POSIX-like <errno.h>.
+
+ Copyright (C) 2008-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#ifndef _@GUARD_PREFIX@_ERRNO_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_ERRNO_H@
+
+#ifndef _@GUARD_PREFIX@_ERRNO_H
+#define _@GUARD_PREFIX@_ERRNO_H
+
+
+/* On native Windows platforms, many macros are not defined. */
+# if defined _WIN32 && ! defined __CYGWIN__
+
+/* These are the same values as defined by MSVC 10, for interoperability. */
+
+# ifndef ENOMSG
+# define ENOMSG 122
+# define GNULIB_defined_ENOMSG 1
+# endif
+
+# ifndef EIDRM
+# define EIDRM 111
+# define GNULIB_defined_EIDRM 1
+# endif
+
+# ifndef ENOLINK
+# define ENOLINK 121
+# define GNULIB_defined_ENOLINK 1
+# endif
+
+# ifndef EPROTO
+# define EPROTO 134
+# define GNULIB_defined_EPROTO 1
+# endif
+
+# ifndef EBADMSG
+# define EBADMSG 104
+# define GNULIB_defined_EBADMSG 1
+# endif
+
+# ifndef EOVERFLOW
+# define EOVERFLOW 132
+# define GNULIB_defined_EOVERFLOW 1
+# endif
+
+# ifndef ENOTSUP
+# define ENOTSUP 129
+# define GNULIB_defined_ENOTSUP 1
+# endif
+
+# ifndef ENETRESET
+# define ENETRESET 117
+# define GNULIB_defined_ENETRESET 1
+# endif
+
+# ifndef ECONNABORTED
+# define ECONNABORTED 106
+# define GNULIB_defined_ECONNABORTED 1
+# endif
+
+# ifndef ECANCELED
+# define ECANCELED 105
+# define GNULIB_defined_ECANCELED 1
+# endif
+
+# ifndef EOWNERDEAD
+# define EOWNERDEAD 133
+# define GNULIB_defined_EOWNERDEAD 1
+# endif
+
+# ifndef ENOTRECOVERABLE
+# define ENOTRECOVERABLE 127
+# define GNULIB_defined_ENOTRECOVERABLE 1
+# endif
+
+# ifndef EINPROGRESS
+# define EINPROGRESS 112
+# define EALREADY 103
+# define ENOTSOCK 128
+# define EDESTADDRREQ 109
+# define EMSGSIZE 115
+# define EPROTOTYPE 136
+# define ENOPROTOOPT 123
+# define EPROTONOSUPPORT 135
+# define EOPNOTSUPP 130
+# define EAFNOSUPPORT 102
+# define EADDRINUSE 100
+# define EADDRNOTAVAIL 101
+# define ENETDOWN 116
+# define ENETUNREACH 118
+# define ECONNRESET 108
+# define ENOBUFS 119
+# define EISCONN 113
+# define ENOTCONN 126
+# define ETIMEDOUT 138
+# define ECONNREFUSED 107
+# define ELOOP 114
+# define EHOSTUNREACH 110
+# define EWOULDBLOCK 140
+# define GNULIB_defined_ESOCK 1
+# endif
+
+# ifndef ETXTBSY
+# define ETXTBSY 139
+# define ENODATA 120 /* not required by POSIX */
+# define ENOSR 124 /* not required by POSIX */
+# define ENOSTR 125 /* not required by POSIX */
+# define ETIME 137 /* not required by POSIX */
+# define EOTHER 131 /* not required by POSIX */
+# define GNULIB_defined_ESTREAMS 1
+# endif
+
+/* These are intentionally the same values as the WSA* error numbers, defined
+ in <winsock2.h>. */
+# define ESOCKTNOSUPPORT 10044 /* not required by POSIX */
+# define EPFNOSUPPORT 10046 /* not required by POSIX */
+# define ESHUTDOWN 10058 /* not required by POSIX */
+# define ETOOMANYREFS 10059 /* not required by POSIX */
+# define EHOSTDOWN 10064 /* not required by POSIX */
+# define EPROCLIM 10067 /* not required by POSIX */
+# define EUSERS 10068 /* not required by POSIX */
+# define EDQUOT 10069
+# define ESTALE 10070
+# define EREMOTE 10071 /* not required by POSIX */
+# define GNULIB_defined_EWINSOCK 1
+
+# endif
+
+
+/* On OSF/1 5.1, when _XOPEN_SOURCE_EXTENDED is not defined, the macros
+ EMULTIHOP, ENOLINK, EOVERFLOW are not defined. */
+# if @EMULTIHOP_HIDDEN@
+# define EMULTIHOP @EMULTIHOP_VALUE@
+# define GNULIB_defined_EMULTIHOP 1
+# endif
+# if @ENOLINK_HIDDEN@
+# define ENOLINK @ENOLINK_VALUE@
+# define GNULIB_defined_ENOLINK 1
+# endif
+# if @EOVERFLOW_HIDDEN@
+# define EOVERFLOW @EOVERFLOW_VALUE@
+# define GNULIB_defined_EOVERFLOW 1
+# endif
+
+
+/* On OpenBSD 4.0 and on native Windows, the macros ENOMSG, EIDRM, ENOLINK,
+ EPROTO, EMULTIHOP, EBADMSG, EOVERFLOW, ENOTSUP, ECANCELED are not defined.
+ Likewise, on NonStop Kernel, EDQUOT is not defined.
+ Define them here. Values >= 2000 seem safe to use: Solaris ESTALE = 151,
+ HP-UX EWOULDBLOCK = 246, IRIX EDQUOT = 1133.
+
+ Note: When one of these systems defines some of these macros some day,
+ binaries will have to be recompiled so that they recognizes the new
+ errno values from the system. */
+
+# ifndef ENOMSG
+# define ENOMSG 2000
+# define GNULIB_defined_ENOMSG 1
+# endif
+
+# ifndef EIDRM
+# define EIDRM 2001
+# define GNULIB_defined_EIDRM 1
+# endif
+
+# ifndef ENOLINK
+# define ENOLINK 2002
+# define GNULIB_defined_ENOLINK 1
+# endif
+
+# ifndef EPROTO
+# define EPROTO 2003
+# define GNULIB_defined_EPROTO 1
+# endif
+
+# ifndef EMULTIHOP
+# define EMULTIHOP 2004
+# define GNULIB_defined_EMULTIHOP 1
+# endif
+
+# ifndef EBADMSG
+# define EBADMSG 2005
+# define GNULIB_defined_EBADMSG 1
+# endif
+
+# ifndef EOVERFLOW
+# define EOVERFLOW 2006
+# define GNULIB_defined_EOVERFLOW 1
+# endif
+
+# ifndef ENOTSUP
+# define ENOTSUP 2007
+# define GNULIB_defined_ENOTSUP 1
+# endif
+
+# ifndef ENETRESET
+# define ENETRESET 2011
+# define GNULIB_defined_ENETRESET 1
+# endif
+
+# ifndef ECONNABORTED
+# define ECONNABORTED 2012
+# define GNULIB_defined_ECONNABORTED 1
+# endif
+
+# ifndef ESTALE
+# define ESTALE 2009
+# define GNULIB_defined_ESTALE 1
+# endif
+
+# ifndef EDQUOT
+# define EDQUOT 2010
+# define GNULIB_defined_EDQUOT 1
+# endif
+
+# ifndef ECANCELED
+# define ECANCELED 2008
+# define GNULIB_defined_ECANCELED 1
+# endif
+
+/* On many platforms, the macros EOWNERDEAD and ENOTRECOVERABLE are not
+ defined. */
+
+# ifndef EOWNERDEAD
+# if defined __sun
+ /* Use the same values as defined for Solaris >= 8, for
+ interoperability. */
+# define EOWNERDEAD 58
+# define ENOTRECOVERABLE 59
+# elif defined _WIN32 && ! defined __CYGWIN__
+ /* We have a conflict here: pthreads-win32 defines these values
+ differently than MSVC 10. It's hairy to decide which one to use. */
+# if defined __MINGW32__ && !defined USE_WINDOWS_THREADS
+ /* Use the same values as defined by pthreads-win32, for
+ interoperability. */
+# define EOWNERDEAD 43
+# define ENOTRECOVERABLE 44
+# else
+ /* Use the same values as defined by MSVC 10, for
+ interoperability. */
+# define EOWNERDEAD 133
+# define ENOTRECOVERABLE 127
+# endif
+# else
+# define EOWNERDEAD 2013
+# define ENOTRECOVERABLE 2014
+# endif
+# define GNULIB_defined_EOWNERDEAD 1
+# define GNULIB_defined_ENOTRECOVERABLE 1
+# endif
+
+# ifndef EILSEQ
+# define EILSEQ 2015
+# define GNULIB_defined_EILSEQ 1
+# endif
+
+#endif /* _@GUARD_PREFIX@_ERRNO_H */
+#endif /* _@GUARD_PREFIX@_ERRNO_H */
diff --git a/lib/float+.h b/lib/float+.h
new file mode 100644
index 0000000..e7531e4
--- /dev/null
+++ b/lib/float+.h
@@ -0,0 +1,147 @@
+/* Supplemental information about the floating-point formats.
+ Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#ifndef _FLOATPLUS_H
+#define _FLOATPLUS_H
+
+#include <float.h>
+#include <limits.h>
+
+/* Number of bits in the mantissa of a floating-point number, including the
+ "hidden bit". */
+#if FLT_RADIX == 2
+# define FLT_MANT_BIT FLT_MANT_DIG
+# define DBL_MANT_BIT DBL_MANT_DIG
+# define LDBL_MANT_BIT LDBL_MANT_DIG
+#elif FLT_RADIX == 4
+# define FLT_MANT_BIT (FLT_MANT_DIG * 2)
+# define DBL_MANT_BIT (DBL_MANT_DIG * 2)
+# define LDBL_MANT_BIT (LDBL_MANT_DIG * 2)
+#elif FLT_RADIX == 16
+# define FLT_MANT_BIT (FLT_MANT_DIG * 4)
+# define DBL_MANT_BIT (DBL_MANT_DIG * 4)
+# define LDBL_MANT_BIT (LDBL_MANT_DIG * 4)
+#endif
+
+/* Bit mask that can be used to mask the exponent, as an unsigned number. */
+#define FLT_EXP_MASK ((FLT_MAX_EXP - FLT_MIN_EXP) | 7)
+#define DBL_EXP_MASK ((DBL_MAX_EXP - DBL_MIN_EXP) | 7)
+#define LDBL_EXP_MASK ((LDBL_MAX_EXP - LDBL_MIN_EXP) | 7)
+
+/* Number of bits used for the exponent of a floating-point number, including
+ the exponent's sign. */
+#define FLT_EXP_BIT \
+ (FLT_EXP_MASK < 0x100 ? 8 : \
+ FLT_EXP_MASK < 0x200 ? 9 : \
+ FLT_EXP_MASK < 0x400 ? 10 : \
+ FLT_EXP_MASK < 0x800 ? 11 : \
+ FLT_EXP_MASK < 0x1000 ? 12 : \
+ FLT_EXP_MASK < 0x2000 ? 13 : \
+ FLT_EXP_MASK < 0x4000 ? 14 : \
+ FLT_EXP_MASK < 0x8000 ? 15 : \
+ FLT_EXP_MASK < 0x10000 ? 16 : \
+ FLT_EXP_MASK < 0x20000 ? 17 : \
+ FLT_EXP_MASK < 0x40000 ? 18 : \
+ FLT_EXP_MASK < 0x80000 ? 19 : \
+ FLT_EXP_MASK < 0x100000 ? 20 : \
+ FLT_EXP_MASK < 0x200000 ? 21 : \
+ FLT_EXP_MASK < 0x400000 ? 22 : \
+ FLT_EXP_MASK < 0x800000 ? 23 : \
+ FLT_EXP_MASK < 0x1000000 ? 24 : \
+ FLT_EXP_MASK < 0x2000000 ? 25 : \
+ FLT_EXP_MASK < 0x4000000 ? 26 : \
+ FLT_EXP_MASK < 0x8000000 ? 27 : \
+ FLT_EXP_MASK < 0x10000000 ? 28 : \
+ FLT_EXP_MASK < 0x20000000 ? 29 : \
+ FLT_EXP_MASK < 0x40000000 ? 30 : \
+ FLT_EXP_MASK <= 0x7fffffff ? 31 : \
+ 32)
+#define DBL_EXP_BIT \
+ (DBL_EXP_MASK < 0x100 ? 8 : \
+ DBL_EXP_MASK < 0x200 ? 9 : \
+ DBL_EXP_MASK < 0x400 ? 10 : \
+ DBL_EXP_MASK < 0x800 ? 11 : \
+ DBL_EXP_MASK < 0x1000 ? 12 : \
+ DBL_EXP_MASK < 0x2000 ? 13 : \
+ DBL_EXP_MASK < 0x4000 ? 14 : \
+ DBL_EXP_MASK < 0x8000 ? 15 : \
+ DBL_EXP_MASK < 0x10000 ? 16 : \
+ DBL_EXP_MASK < 0x20000 ? 17 : \
+ DBL_EXP_MASK < 0x40000 ? 18 : \
+ DBL_EXP_MASK < 0x80000 ? 19 : \
+ DBL_EXP_MASK < 0x100000 ? 20 : \
+ DBL_EXP_MASK < 0x200000 ? 21 : \
+ DBL_EXP_MASK < 0x400000 ? 22 : \
+ DBL_EXP_MASK < 0x800000 ? 23 : \
+ DBL_EXP_MASK < 0x1000000 ? 24 : \
+ DBL_EXP_MASK < 0x2000000 ? 25 : \
+ DBL_EXP_MASK < 0x4000000 ? 26 : \
+ DBL_EXP_MASK < 0x8000000 ? 27 : \
+ DBL_EXP_MASK < 0x10000000 ? 28 : \
+ DBL_EXP_MASK < 0x20000000 ? 29 : \
+ DBL_EXP_MASK < 0x40000000 ? 30 : \
+ DBL_EXP_MASK <= 0x7fffffff ? 31 : \
+ 32)
+#define LDBL_EXP_BIT \
+ (LDBL_EXP_MASK < 0x100 ? 8 : \
+ LDBL_EXP_MASK < 0x200 ? 9 : \
+ LDBL_EXP_MASK < 0x400 ? 10 : \
+ LDBL_EXP_MASK < 0x800 ? 11 : \
+ LDBL_EXP_MASK < 0x1000 ? 12 : \
+ LDBL_EXP_MASK < 0x2000 ? 13 : \
+ LDBL_EXP_MASK < 0x4000 ? 14 : \
+ LDBL_EXP_MASK < 0x8000 ? 15 : \
+ LDBL_EXP_MASK < 0x10000 ? 16 : \
+ LDBL_EXP_MASK < 0x20000 ? 17 : \
+ LDBL_EXP_MASK < 0x40000 ? 18 : \
+ LDBL_EXP_MASK < 0x80000 ? 19 : \
+ LDBL_EXP_MASK < 0x100000 ? 20 : \
+ LDBL_EXP_MASK < 0x200000 ? 21 : \
+ LDBL_EXP_MASK < 0x400000 ? 22 : \
+ LDBL_EXP_MASK < 0x800000 ? 23 : \
+ LDBL_EXP_MASK < 0x1000000 ? 24 : \
+ LDBL_EXP_MASK < 0x2000000 ? 25 : \
+ LDBL_EXP_MASK < 0x4000000 ? 26 : \
+ LDBL_EXP_MASK < 0x8000000 ? 27 : \
+ LDBL_EXP_MASK < 0x10000000 ? 28 : \
+ LDBL_EXP_MASK < 0x20000000 ? 29 : \
+ LDBL_EXP_MASK < 0x40000000 ? 30 : \
+ LDBL_EXP_MASK <= 0x7fffffff ? 31 : \
+ 32)
+
+/* Number of bits used for a floating-point number: the mantissa (not
+ counting the "hidden bit", since it may or may not be explicit), the
+ exponent, and the sign. */
+#define FLT_TOTAL_BIT ((FLT_MANT_BIT - 1) + FLT_EXP_BIT + 1)
+#define DBL_TOTAL_BIT ((DBL_MANT_BIT - 1) + DBL_EXP_BIT + 1)
+#define LDBL_TOTAL_BIT ((LDBL_MANT_BIT - 1) + LDBL_EXP_BIT + 1)
+
+/* Number of bytes used for a floating-point number.
+ This can be smaller than the 'sizeof'. For example, on i386 systems,
+ 'long double' most often have LDBL_MANT_BIT = 64, LDBL_EXP_BIT = 16, hence
+ LDBL_TOTAL_BIT = 80 bits, i.e. 10 bytes of consecutive memory, but
+ sizeof (long double) = 12 or = 16. */
+#define SIZEOF_FLT ((FLT_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
+#define SIZEOF_DBL ((DBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
+#define SIZEOF_LDBL ((LDBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
+
+/* Verify that SIZEOF_FLT <= sizeof (float) etc. */
+typedef int verify_sizeof_flt[SIZEOF_FLT <= sizeof (float) ? 1 : -1];
+typedef int verify_sizeof_dbl[SIZEOF_DBL <= sizeof (double) ? 1 : - 1];
+typedef int verify_sizeof_ldbl[SIZEOF_LDBL <= sizeof (long double) ? 1 : - 1];
+
+#endif /* _FLOATPLUS_H */
diff --git a/lib/float.c b/lib/float.c
new file mode 100644
index 0000000..f81ff33
--- /dev/null
+++ b/lib/float.c
@@ -0,0 +1,33 @@
+/* Auxiliary definitions for <float.h>.
+ Copyright (C) 2011-2023 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <float.h>
+
+#if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__
+const union gl_long_double_union gl_LDBL_MAX =
+ { { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL } };
+#elif defined __i386__
+const union gl_long_double_union gl_LDBL_MAX =
+ { { 0xFFFFFFFF, 0xFFFFFFFF, 32766 } };
+#else
+/* This declaration is solely to ensure that after preprocessing
+ this file is never empty. */
+typedef int dummy;
+#endif
diff --git a/lib/float.in.h b/lib/float.in.h
new file mode 100644
index 0000000..bf2c502
--- /dev/null
+++ b/lib/float.in.h
@@ -0,0 +1,194 @@
+/* A correct <float.h>.
+
+ Copyright (C) 2007-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#ifndef _@GUARD_PREFIX@_FLOAT_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_FLOAT_H@
+
+#ifndef _@GUARD_PREFIX@_FLOAT_H
+#define _@GUARD_PREFIX@_FLOAT_H
+
+/* 'long double' properties. */
+
+#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
+/* Number of mantissa units, in base FLT_RADIX. */
+# undef LDBL_MANT_DIG
+# define LDBL_MANT_DIG 64
+/* Number of decimal digits that is sufficient for representing a number. */
+# undef LDBL_DIG
+# define LDBL_DIG 18
+/* x-1 where x is the smallest representable number > 1. */
+# undef LDBL_EPSILON
+# define LDBL_EPSILON 1.0842021724855044340E-19L
+/* Minimum e such that FLT_RADIX^(e-1) is a normalized number. */
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP (-16381)
+/* Maximum e such that FLT_RADIX^(e-1) is a representable finite number. */
+# undef LDBL_MAX_EXP
+# define LDBL_MAX_EXP 16384
+/* Minimum positive normalized number. */
+# undef LDBL_MIN
+# define LDBL_MIN 3.3621031431120935063E-4932L
+/* Maximum representable finite number. */
+# undef LDBL_MAX
+# define LDBL_MAX 1.1897314953572317650E+4932L
+/* Minimum e such that 10^e is in the range of normalized numbers. */
+# undef LDBL_MIN_10_EXP
+# define LDBL_MIN_10_EXP (-4931)
+/* Maximum e such that 10^e is in the range of representable finite numbers. */
+# undef LDBL_MAX_10_EXP
+# define LDBL_MAX_10_EXP 4932
+#endif
+
+/* On FreeBSD/x86 6.4, the 'long double' type really has only 53 bits of
+ precision in the compiler but 64 bits of precision at runtime. See
+ <https://lists.gnu.org/r/bug-gnulib/2008-07/msg00063.html>. */
+#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__)
+/* Number of mantissa units, in base FLT_RADIX. */
+# undef LDBL_MANT_DIG
+# define LDBL_MANT_DIG 64
+/* Number of decimal digits that is sufficient for representing a number. */
+# undef LDBL_DIG
+# define LDBL_DIG 18
+/* x-1 where x is the smallest representable number > 1. */
+# undef LDBL_EPSILON
+# define LDBL_EPSILON 1.084202172485504434007452800869941711426e-19L /* 2^-63 */
+/* Minimum e such that FLT_RADIX^(e-1) is a normalized number. */
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP (-16381)
+/* Maximum e such that FLT_RADIX^(e-1) is a representable finite number. */
+# undef LDBL_MAX_EXP
+# define LDBL_MAX_EXP 16384
+/* Minimum positive normalized number. */
+# undef LDBL_MIN
+# define LDBL_MIN 3.362103143112093506262677817321752E-4932L /* = 0x1p-16382L */
+/* Maximum representable finite number. */
+# undef LDBL_MAX
+/* LDBL_MAX is represented as { 0xFFFFFFFF, 0xFFFFFFFF, 32766 }.
+ But the largest literal that GCC allows us to write is
+ 0x0.fffffffffffff8p16384L = { 0xFFFFF800, 0xFFFFFFFF, 32766 }.
+ So, define it like this through a reference to an external variable
+
+ const unsigned int LDBL_MAX[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 32766 };
+ extern const long double LDBL_MAX;
+
+ Unfortunately, this is not a constant expression. */
+# if !GNULIB_defined_long_double_union
+union gl_long_double_union
+ {
+ struct { unsigned int lo; unsigned int hi; unsigned int exponent; } xd;
+ long double ld;
+ };
+# define GNULIB_defined_long_double_union 1
+# endif
+extern const union gl_long_double_union gl_LDBL_MAX;
+# define LDBL_MAX (gl_LDBL_MAX.ld)
+/* Minimum e such that 10^e is in the range of normalized numbers. */
+# undef LDBL_MIN_10_EXP
+# define LDBL_MIN_10_EXP (-4931)
+/* Maximum e such that 10^e is in the range of representable finite numbers. */
+# undef LDBL_MAX_10_EXP
+# define LDBL_MAX_10_EXP 4932
+#endif
+
+/* On AIX 7.1 with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_MAX are
+ wrong.
+ On Linux/PowerPC with gcc 4.4, the value of LDBL_MAX is wrong. */
+#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP DBL_MIN_EXP
+# undef LDBL_MIN_10_EXP
+# define LDBL_MIN_10_EXP DBL_MIN_10_EXP
+# undef LDBL_MIN
+# define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */
+#endif
+#if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__
+# undef LDBL_MAX
+/* LDBL_MAX is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xFFFFFFFF }.
+ It is not easy to define:
+ #define LDBL_MAX 1.79769313486231580793728971405302307166e308L
+ is too small, whereas
+ #define LDBL_MAX 1.79769313486231580793728971405302307167e308L
+ is too large. Apparently a bug in GCC decimal-to-binary conversion.
+ Also, I can't get values larger than
+ #define LDBL63 ((long double) (1ULL << 63))
+ #define LDBL882 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
+ #define LDBL945 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
+ #define LDBL1008 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
+ #define LDBL_MAX (LDBL1008 * 65535.0L + LDBL945 * (long double) 9223372036821221375ULL + LDBL882 * (long double) 4611686018427387904ULL)
+ which is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xF8000000 }.
+ So, define it like this through a reference to an external variable
+
+ const double LDBL_MAX[2] = { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL };
+ extern const long double LDBL_MAX;
+
+ or through a pointer cast
+
+ #define LDBL_MAX \
+ (*(const long double *) (double[]) { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL })
+
+ Unfortunately, this is not a constant expression, and the latter expression
+ does not work well when GCC is optimizing.. */
+# if !GNULIB_defined_long_double_union
+union gl_long_double_union
+ {
+ struct { double hi; double lo; } dd;
+ long double ld;
+ };
+# define GNULIB_defined_long_double_union 1
+# endif
+extern const union gl_long_double_union gl_LDBL_MAX;
+# define LDBL_MAX (gl_LDBL_MAX.ld)
+#endif
+
+/* On IRIX 6.5, with cc, the value of LDBL_MANT_DIG is wrong.
+ On IRIX 6.5, with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_EPSILON
+ are wrong. */
+#if defined __sgi && (LDBL_MANT_DIG >= 106)
+# undef LDBL_MANT_DIG
+# define LDBL_MANT_DIG 106
+# if defined __GNUC__
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP DBL_MIN_EXP
+# undef LDBL_MIN_10_EXP
+# define LDBL_MIN_10_EXP DBL_MIN_10_EXP
+# undef LDBL_MIN
+# define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */
+# undef LDBL_EPSILON
+# define LDBL_EPSILON 2.46519032881566189191165176650870696773e-32L /* 2^-105 */
+# endif
+#endif
+
+#if @REPLACE_ITOLD@
+/* Pull in a function that fixes the 'int' to 'long double' conversion
+ of glibc 2.7. */
+extern
+# ifdef __cplusplus
+"C"
+# endif
+void _Qp_itoq (long double *, int);
+static void (*_gl_float_fix_itold) (long double *, int) = _Qp_itoq;
+#endif
+
+#endif /* _@GUARD_PREFIX@_FLOAT_H */
+#endif /* _@GUARD_PREFIX@_FLOAT_H */
diff --git a/lib/fprintf.c b/lib/fprintf.c
new file mode 100644
index 0000000..85851f2
--- /dev/null
+++ b/lib/fprintf.c
@@ -0,0 +1,73 @@
+/* Formatted output to a stream.
+ Copyright (C) 2004, 2006-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include "fseterr.h"
+#include "vasnprintf.h"
+
+/* Print formatted output to the stream FP.
+ Return string length of formatted string. On error, return a negative
+ value. */
+int
+fprintf (FILE *fp, const char *format, ...)
+{
+ char buf[2000];
+ char *output;
+ size_t len;
+ size_t lenbuf = sizeof (buf);
+ va_list args;
+
+ va_start (args, format);
+ output = vasnprintf (buf, &lenbuf, format, args);
+ len = lenbuf;
+ va_end (args);
+
+ if (!output)
+ {
+ fseterr (fp);
+ return -1;
+ }
+
+ if (fwrite (output, 1, len, fp) < len)
+ {
+ if (output != buf)
+ free (output);
+ return -1;
+ }
+
+ if (output != buf)
+ free (output);
+
+ if (len > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ fseterr (fp);
+ return -1;
+ }
+
+ return len;
+}
diff --git a/lib/fpucw.h b/lib/fpucw.h
new file mode 100644
index 0000000..7dcb310
--- /dev/null
+++ b/lib/fpucw.h
@@ -0,0 +1,108 @@
+/* Manipulating the FPU control word. -*- coding: utf-8 -*-
+ Copyright (C) 2007-2023 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#ifndef _FPUCW_H
+#define _FPUCW_H
+
+/* The i386 floating point hardware (the 387 compatible FPU, not the modern
+ SSE/SSE2 hardware) has a controllable rounding precision. It is specified
+ through the 'PC' bits in the FPU control word ('fctrl' register). (See
+ the GNU libc i386 <fpu_control.h> header for details.)
+
+ On some platforms, such as Linux or Solaris, the default precision setting
+ is set to "extended precision". This means that 'long double' instructions
+ operate correctly, but 'double' computations often produce slightly
+ different results as on strictly IEEE 754 conforming systems.
+
+ On some platforms, such as NetBSD, the default precision is set to
+ "double precision". This means that 'long double' instructions will operate
+ only as 'double', i.e. lead to wrong results. Similarly on FreeBSD 6.4, at
+ least for the division of 'long double' numbers.
+
+ The FPU control word is under control of the application, i.e. it is
+ not required to be set either way by the ABI. (In fact, the i386 ABI
+ https://www.linux-mips.org/pub/linux/mips/doc/ABI/abi386-4.pdf page 3-12 = page 38
+ is not clear about it. But in any case, gcc treats the control word
+ like a "preserved" register: it emits code that assumes that the control
+ word is preserved across calls, and it restores the control word at the
+ end of functions that modify it.)
+
+ See Vincent Lefèvre's page https://www.vinc17.net/research/extended.en.html
+ for a good explanation.
+ See https://web.archive.org/web/20060905133417/http://www.uwsg.iu.edu/hypermail/linux/kernel/0103.0/0453.html
+ some argumentation which setting should be the default. */
+
+/* This header file provides the following facilities:
+ fpucw_t integral type holding the value of 'fctrl'
+ FPU_PC_MASK bit mask denoting the precision control
+ FPU_PC_DOUBLE precision control for 53 bits mantissa
+ FPU_PC_EXTENDED precision control for 64 bits mantissa
+ GET_FPUCW () yields the current FPU control word
+ SET_FPUCW (word) sets the FPU control word
+ DECL_LONG_DOUBLE_ROUNDING variable declaration for
+ BEGIN/END_LONG_DOUBLE_ROUNDING
+ BEGIN_LONG_DOUBLE_ROUNDING () starts a sequence of instructions with
+ 'long double' safe operation precision
+ END_LONG_DOUBLE_ROUNDING () ends a sequence of instructions with
+ 'long double' safe operation precision
+ */
+
+/* Inline assembler like this works only with GNU C and clang. */
+#if (defined __i386__ || defined __x86_64__) && (defined __GNUC__ || defined __clang__)
+
+typedef unsigned short fpucw_t; /* glibc calls this fpu_control_t */
+
+# define FPU_PC_MASK 0x0300
+# define FPU_PC_DOUBLE 0x200 /* glibc calls this _FPU_DOUBLE */
+# define FPU_PC_EXTENDED 0x300 /* glibc calls this _FPU_EXTENDED */
+
+# define GET_FPUCW() __extension__ \
+ ({ fpucw_t _cw; \
+ __asm__ __volatile__ ("fnstcw %0" : "=m" (*&_cw)); \
+ _cw; \
+ })
+# define SET_FPUCW(word) __extension__ \
+ (void)({ fpucw_t _ncw = (word); \
+ __asm__ __volatile__ ("fldcw %0" : : "m" (*&_ncw)); \
+ })
+
+# define DECL_LONG_DOUBLE_ROUNDING \
+ fpucw_t oldcw;
+# define BEGIN_LONG_DOUBLE_ROUNDING() \
+ (void)(oldcw = GET_FPUCW (), \
+ SET_FPUCW ((oldcw & ~FPU_PC_MASK) | FPU_PC_EXTENDED))
+# define END_LONG_DOUBLE_ROUNDING() \
+ SET_FPUCW (oldcw)
+
+#else
+
+typedef unsigned int fpucw_t;
+
+# define FPU_PC_MASK 0
+# define FPU_PC_DOUBLE 0
+# define FPU_PC_EXTENDED 0
+
+# define GET_FPUCW() 0
+# define SET_FPUCW(word) (void)(word)
+
+# define DECL_LONG_DOUBLE_ROUNDING
+# define BEGIN_LONG_DOUBLE_ROUNDING()
+# define END_LONG_DOUBLE_ROUNDING()
+
+#endif
+
+#endif /* _FPUCW_H */
diff --git a/lib/free.c b/lib/free.c
new file mode 100644
index 0000000..372a6b0
--- /dev/null
+++ b/lib/free.c
@@ -0,0 +1,53 @@
+/* Make free() preserve errno.
+
+ Copyright (C) 2003, 2006, 2009-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* written by Paul Eggert */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdlib.h>
+
+/* A function definition is only needed if HAVE_FREE_POSIX is not defined. */
+#if !HAVE_FREE_POSIX
+
+# include <errno.h>
+
+void
+rpl_free (void *p)
+# undef free
+{
+# if defined __GNUC__ && !defined __clang__
+ /* An invalid GCC optimization
+ <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98396>
+ would optimize away the assignments in the code below, when link-time
+ optimization (LTO) is enabled. Make the code more complicated, so that
+ GCC does not grok how to optimize it. */
+ int err[2];
+ err[0] = errno;
+ err[1] = errno;
+ errno = 0;
+ free (p);
+ errno = err[errno == 0];
+# else
+ int err = errno;
+ free (p);
+ errno = err;
+# endif
+}
+
+#endif
diff --git a/lib/frexp.c b/lib/frexp.c
new file mode 100644
index 0000000..78d627b
--- /dev/null
+++ b/lib/frexp.c
@@ -0,0 +1,168 @@
+/* Split a double into fraction and mantissa.
+ Copyright (C) 2007-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Written by Paolo Bonzini <bonzini@gnu.org>, 2003, and
+ Bruno Haible <bruno@clisp.org>, 2007. */
+
+#if ! defined USE_LONG_DOUBLE
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <math.h>
+
+#include <float.h>
+#ifdef USE_LONG_DOUBLE
+# include "isnanl-nolibm.h"
+# include "fpucw.h"
+#else
+# include "isnand-nolibm.h"
+#endif
+
+/* This file assumes FLT_RADIX = 2. If FLT_RADIX is a power of 2 greater
+ than 2, or not even a power of 2, some rounding errors can occur, so that
+ then the returned mantissa is only guaranteed to be <= 1.0, not < 1.0. */
+
+#ifdef USE_LONG_DOUBLE
+# define FUNC frexpl
+# define DOUBLE long double
+# define ISNAN isnanl
+# define DECL_ROUNDING DECL_LONG_DOUBLE_ROUNDING
+# define BEGIN_ROUNDING() BEGIN_LONG_DOUBLE_ROUNDING ()
+# define END_ROUNDING() END_LONG_DOUBLE_ROUNDING ()
+# define L_(literal) literal##L
+#else
+# define FUNC frexp
+# define DOUBLE double
+# define ISNAN isnand
+# define DECL_ROUNDING
+# define BEGIN_ROUNDING()
+# define END_ROUNDING()
+# define L_(literal) literal
+#endif
+
+DOUBLE
+FUNC (DOUBLE x, int *expptr)
+{
+ int sign;
+ int exponent;
+ DECL_ROUNDING
+
+ /* Test for NaN, infinity, and zero. */
+ if (ISNAN (x) || x + x == x)
+ {
+ *expptr = 0;
+ return x;
+ }
+
+ sign = 0;
+ if (x < 0)
+ {
+ x = - x;
+ sign = -1;
+ }
+
+ BEGIN_ROUNDING ();
+
+ {
+ /* Since the exponent is an 'int', it fits in 64 bits. Therefore the
+ loops are executed no more than 64 times. */
+ DOUBLE pow2[64]; /* pow2[i] = 2^2^i */
+ DOUBLE powh[64]; /* powh[i] = 2^-2^i */
+ int i;
+
+ exponent = 0;
+ if (x >= L_(1.0))
+ {
+ /* A positive exponent. */
+ DOUBLE pow2_i; /* = pow2[i] */
+ DOUBLE powh_i; /* = powh[i] */
+
+ /* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i,
+ x * 2^exponent = argument, x >= 1.0. */
+ for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5);
+ ;
+ i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i)
+ {
+ if (x >= pow2_i)
+ {
+ exponent += (1 << i);
+ x *= powh_i;
+ }
+ else
+ break;
+
+ pow2[i] = pow2_i;
+ powh[i] = powh_i;
+ }
+ /* Avoid making x too small, as it could become a denormalized
+ number and thus lose precision. */
+ while (i > 0 && x < pow2[i - 1])
+ {
+ i--;
+ powh_i = powh[i];
+ }
+ exponent += (1 << i);
+ x *= powh_i;
+ /* Here 2^-2^i <= x < 1.0. */
+ }
+ else
+ {
+ /* A negative or zero exponent. */
+ DOUBLE pow2_i; /* = pow2[i] */
+ DOUBLE powh_i; /* = powh[i] */
+
+ /* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i,
+ x * 2^exponent = argument, x < 1.0. */
+ for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5);
+ ;
+ i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i)
+ {
+ if (x < powh_i)
+ {
+ exponent -= (1 << i);
+ x *= pow2_i;
+ }
+ else
+ break;
+
+ pow2[i] = pow2_i;
+ powh[i] = powh_i;
+ }
+ /* Here 2^-2^i <= x < 1.0. */
+ }
+
+ /* Invariants: x * 2^exponent = argument, and 2^-2^i <= x < 1.0. */
+ while (i > 0)
+ {
+ i--;
+ if (x < powh[i])
+ {
+ exponent -= (1 << i);
+ x *= pow2[i];
+ }
+ }
+ /* Here 0.5 <= x < 1.0. */
+ }
+
+ if (sign < 0)
+ x = - x;
+
+ END_ROUNDING ();
+
+ *expptr = exponent;
+ return x;
+}
diff --git a/lib/frexpl.c b/lib/frexpl.c
new file mode 100644
index 0000000..8b17094
--- /dev/null
+++ b/lib/frexpl.c
@@ -0,0 +1,35 @@
+/* Split a 'long double' into fraction and mantissa.
+ Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+/* Specification. */
+# include <math.h>
+
+long double
+frexpl (long double x, int *expptr)
+{
+ return frexp (x, expptr);
+}
+
+#else
+
+# define USE_LONG_DOUBLE
+# include "frexp.c"
+
+#endif
diff --git a/lib/fseterr.c b/lib/fseterr.c
new file mode 100644
index 0000000..9b39305
--- /dev/null
+++ b/lib/fseterr.c
@@ -0,0 +1,84 @@
+/* Set the error indicator of a stream.
+ Copyright (C) 2007-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "fseterr.h"
+
+#include <errno.h>
+
+#include "stdio-impl.h"
+
+/* This file is not used on systems that have the __fseterr function,
+ namely musl libc. */
+
+void
+fseterr (FILE *fp)
+{
+ /* Most systems provide FILE as a struct and the necessary bitmask in
+ <stdio.h>, because they need it for implementing getc() and putc() as
+ fast macros. */
+#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
+ /* GNU libc, BeOS, Haiku, Linux libc5 */
+ fp->_flags |= _IO_ERR_SEEN;
+#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
+ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
+ fp_->_flags |= __SERR;
+#elif defined __EMX__ /* emx+gcc */
+ fp->_flags |= _IOERR;
+#elif defined __minix /* Minix */
+ fp->_flags |= _IOERR;
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
+ fp_->_flag |= _IOERR;
+#elif defined __UCLIBC__ /* uClibc */
+ fp->__modeflags |= __FLAG_ERROR;
+#elif defined __QNX__ /* QNX */
+ fp->_Mode |= 0x200 /* _MERR */;
+#elif defined __MINT__ /* Atari FreeMiNT */
+ fp->__error = 1;
+#elif defined EPLAN9 /* Plan9 */
+ if (fp->state != 0 /* CLOSED */)
+ fp->state = 5 /* ERR */;
+#elif 0 /* unknown */
+ /* Portable fallback, based on an idea by Rich Felker.
+ Wow! 6 system calls for something that is just a bit operation!
+ Not activated on any system, because there is no way to repair FP when
+ the sequence of system calls fails, and library code should not call
+ abort(). */
+ int saved_errno;
+ int fd;
+ int fd2;
+
+ saved_errno = errno;
+ fflush (fp);
+ fd = fileno (fp);
+ fd2 = dup (fd);
+ if (fd2 >= 0)
+ {
+ close (fd);
+ fputc ('\0', fp); /* This should set the error indicator. */
+ fflush (fp); /* Or this. */
+ if (dup2 (fd2, fd) < 0)
+ /* Whee... we botched the stream and now cannot restore it! */
+ abort ();
+ close (fd2);
+ }
+ errno = saved_errno;
+#else
+ #error "Please port gnulib fseterr.c to your platform! Look at the definitions of ferror and clearerr on your system, then report this to bug-gnulib."
+#endif
+}
diff --git a/lib/fseterr.h b/lib/fseterr.h
new file mode 100644
index 0000000..0e9d206
--- /dev/null
+++ b/lib/fseterr.h
@@ -0,0 +1,45 @@
+/* Set the error indicator of a stream.
+ Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#ifndef _FSETERR_H
+#define _FSETERR_H
+
+#include <stdio.h>
+
+/* Set the error indicator of the stream FP.
+ The "error indicator" is set when an I/O operation on the stream fails, and
+ is cleared (together with the "end-of-file" indicator) by clearerr (FP). */
+
+#if HAVE___FSETERR /* musl libc */
+
+# include <stdio_ext.h>
+# define fseterr(fp) __fseterr (fp)
+
+#else
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+extern void fseterr (FILE *fp);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+#endif /* _FSETERR_H */
diff --git a/lib/gnulib.mk b/lib/gnulib.mk
new file mode 100644
index 0000000..b71b670
--- /dev/null
+++ b/lib/gnulib.mk
@@ -0,0 +1,1823 @@
+## DO NOT EDIT! GENERATED AUTOMATICALLY!
+## Process this file with automake to produce Makefile.in.
+# Copyright (C) 2002-2023 Free Software Foundation, Inc.
+#
+# This file 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 3 of the License, or
+# (at your option) any later version.
+#
+# This file 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 file. If not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License,
+# this file may be distributed as part of a program that
+# contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# Generated by gnulib-tool.
+# Reproduce by:
+# gnulib-tool --import --local-dir=gl \
+# --lib=libgnu \
+# --source-base=lib \
+# --m4-base=gnulib_m4 \
+# --doc-base=doc \
+# --tests-base=tests \
+# --aux-dir=build-aux \
+# --makefile-name=gnulib.mk \
+# --automake-subdir \
+# --no-conditional-dependencies \
+# --no-libtool \
+# --macro-prefix=gl \
+# fprintf-posix \
+# git-version-gen \
+# havelib \
+# snprintf \
+# stdbool-c99 \
+# stdint \
+# vsnprintf \
+# wcwidth
+
+
+MOSTLYCLEANFILES += lib/core lib/*.stackdump
+# No GNU Make output.
+
+noinst_LIBRARIES += lib/libgnu.a
+
+lib_libgnu_a_SOURCES =
+lib_libgnu_a_CFLAGS = $(AM_CFLAGS) $(GL_CFLAG_GNULIB_WARNINGS)
+lib_libgnu_a_LIBADD = $(gl_LIBOBJS)
+lib_libgnu_a_DEPENDENCIES = $(gl_LIBOBJS)
+EXTRA_lib_libgnu_a_SOURCES =
+
+## begin gnulib module absolute-header
+
+# Use this preprocessor expression to decide whether #include_next works.
+# Do not rely on a 'configure'-time test for this, since the expression
+# might appear in an installed header, which is used by some other compiler.
+HAVE_INCLUDE_NEXT = (__GNUC__ || __clang__ || 60000000 <= __DECC_VER)
+
+## end gnulib module absolute-header
+
+## begin gnulib module alloca-opt
+
+BUILT_SOURCES += $(ALLOCA_H)
+
+# We need the following in order to create <alloca.h> when the system
+# doesn't have one that works with the given compiler.
+if GL_GENERATE_ALLOCA_H
+lib/alloca.h: lib/alloca.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)$(MKDIR_P) '%reldir%'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''HAVE_ALLOCA_H''@|$(HAVE_ALLOCA_H)|g' \
+ $(top_srcdir)/lib/alloca.in.h > $@-t
+ $(AM_V_at)mv $@-t $@
+else
+lib/alloca.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += lib/alloca.h lib/alloca.h-t
+
+EXTRA_DIST += lib/alloca.in.h
+
+## end gnulib module alloca-opt
+
+## begin gnulib module assert-h
+
+BUILT_SOURCES += $(ASSERT_H)
+
+# We need the following in order to create <assert.h> when the system
+# doesn't have one that works with the given compiler.
+if GL_GENERATE_ASSERT_H
+lib/assert.h: lib/assert.in.h lib/verify.h $(top_builddir)/config.status
+ $(AM_V_GEN)$(MKDIR_P) '%reldir%'
+ $(gl_V_at){ $(SED_HEADER_STDOUT) \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_ASSERT_H''@|$(NEXT_ASSERT_H)|g' \
+ < $(top_srcdir)/lib/assert.in.h && \
+ sed -e '/@assert.h omit start@/,/@assert.h omit end@/d' \
+ -e 's|_gl_verify|_gl_static_assert|g' \
+ -e 's|_GL_VERIFY|_GL_STATIC_ASSERT|g' \
+ -e 's|_GL\(_STATIC_ASSERT_H\)|_GL\1|g' \
+ < $(top_srcdir)/lib/verify.h; \
+ } > $@-t
+ $(AM_V_at)mv $@-t $@
+else
+lib/assert.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += lib/assert.h lib/assert.h-t
+
+EXTRA_DIST += lib/assert.in.h lib/verify.h
+
+## end gnulib module assert-h
+
+## begin gnulib module attribute
+
+
+EXTRA_DIST += lib/attribute.h
+
+## end gnulib module attribute
+
+## begin gnulib module errno
+
+BUILT_SOURCES += $(ERRNO_H)
+
+# We need the following in order to create <errno.h> when the system
+# doesn't have one that is POSIX compliant.
+if GL_GENERATE_ERRNO_H
+lib/errno.h: lib/errno.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)$(MKDIR_P) '%reldir%'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_ERRNO_H''@|$(NEXT_ERRNO_H)|g' \
+ -e 's|@''EMULTIHOP_HIDDEN''@|$(EMULTIHOP_HIDDEN)|g' \
+ -e 's|@''EMULTIHOP_VALUE''@|$(EMULTIHOP_VALUE)|g' \
+ -e 's|@''ENOLINK_HIDDEN''@|$(ENOLINK_HIDDEN)|g' \
+ -e 's|@''ENOLINK_VALUE''@|$(ENOLINK_VALUE)|g' \
+ -e 's|@''EOVERFLOW_HIDDEN''@|$(EOVERFLOW_HIDDEN)|g' \
+ -e 's|@''EOVERFLOW_VALUE''@|$(EOVERFLOW_VALUE)|g' \
+ $(top_srcdir)/lib/errno.in.h > $@-t
+ $(AM_V_at)mv $@-t $@
+else
+lib/errno.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += lib/errno.h lib/errno.h-t
+
+EXTRA_DIST += lib/errno.in.h
+
+## end gnulib module errno
+
+## begin gnulib module float
+
+BUILT_SOURCES += $(FLOAT_H)
+
+# We need the following in order to create <float.h> when the system
+# doesn't have one that works with the given compiler.
+if GL_GENERATE_FLOAT_H
+lib/float.h: lib/float.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)$(MKDIR_P) '%reldir%'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_FLOAT_H''@|$(NEXT_FLOAT_H)|g' \
+ -e 's|@''REPLACE_ITOLD''@|$(REPLACE_ITOLD)|g' \
+ $(top_srcdir)/lib/float.in.h > $@-t
+ $(AM_V_at)mv $@-t $@
+else
+lib/float.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += lib/float.h lib/float.h-t
+
+if GL_COND_OBJ_FLOAT
+lib_libgnu_a_SOURCES += lib/float.c
+endif
+if GL_COND_OBJ_ITOLD
+lib_libgnu_a_SOURCES += lib/itold.c
+endif
+
+EXTRA_DIST += lib/float.in.h
+
+## end gnulib module float
+
+## begin gnulib module fprintf-posix
+
+
+EXTRA_DIST += lib/fprintf.c
+
+EXTRA_lib_libgnu_a_SOURCES += lib/fprintf.c
+
+## end gnulib module fprintf-posix
+
+## begin gnulib module fpucw
+
+
+EXTRA_DIST += lib/fpucw.h
+
+## end gnulib module fpucw
+
+## begin gnulib module free-posix
+
+if GL_COND_OBJ_FREE
+lib_libgnu_a_SOURCES += lib/free.c
+endif
+
+## end gnulib module free-posix
+
+## begin gnulib module frexp-nolibm
+
+
+EXTRA_DIST += lib/frexp.c
+
+EXTRA_lib_libgnu_a_SOURCES += lib/frexp.c
+
+## end gnulib module frexp-nolibm
+
+## begin gnulib module frexpl-nolibm
+
+
+EXTRA_DIST += lib/frexp.c lib/frexpl.c
+
+EXTRA_lib_libgnu_a_SOURCES += lib/frexp.c lib/frexpl.c
+
+## end gnulib module frexpl-nolibm
+
+## begin gnulib module fseterr
+
+if GL_COND_OBJ_FSETERR
+lib_libgnu_a_SOURCES += lib/fseterr.c
+endif
+
+EXTRA_DIST += lib/fseterr.h lib/stdio-impl.h
+
+## end gnulib module fseterr
+
+## begin gnulib module gen-header
+
+# In 'sed', replace the pattern space with a "DO NOT EDIT" comment.
+SED_HEADER_NOEDIT = s,.*,/* DO NOT EDIT! GENERATED AUTOMATICALLY! */,
+
+# '$(SED_HEADER_STDOUT) -e "..."' runs 'sed' but first outputs "DO NOT EDIT".
+SED_HEADER_STDOUT = sed -e 1h -e '1$(SED_HEADER_NOEDIT)' -e 1G
+
+# '$(SED_HEADER_TO_AT_t) FILE' copies FILE to $@-t, prepending a leading
+# "DO_NOT_EDIT". Although this could be done more simply via:
+# SED_HEADER_TO_AT_t = $(SED_HEADER_STDOUT) > $@-t
+# the -n and 'w' avoid a fork+exec, at least when GNU Make is used.
+SED_HEADER_TO_AT_t = $(SED_HEADER_STDOUT) -n -e 'w $@-t'
+
+# Use $(gl_V_at) instead of $(AM_V_GEN) or $(AM_V_at) on a line that
+# is its recipe's first line if and only if lines are absent.
+gl_V_at = $(AM_V_at)
+
+## end gnulib module gen-header
+
+## begin gnulib module git-version-gen
+
+
+EXTRA_DIST += $(top_srcdir)/build-aux/git-version-gen
+
+## end gnulib module git-version-gen
+
+## begin gnulib module havelib
+
+
+EXTRA_DIST += $(top_srcdir)/build-aux/config.rpath
+
+## end gnulib module havelib
+
+## begin gnulib module inttypes-incomplete
+
+BUILT_SOURCES += lib/inttypes.h
+
+# We need the following in order to create <inttypes.h> when the system
+# doesn't have one that works with the given compiler.
+lib/inttypes.h: lib/inttypes.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_GEN)$(MKDIR_P) '%reldir%'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_INTTYPES_H''@|$(NEXT_INTTYPES_H)|g' \
+ -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \
+ -e 's/@''PRIPTR_PREFIX''@/$(PRIPTR_PREFIX)/g' \
+ -e 's/@''GNULIB_IMAXABS''@/$(GL_GNULIB_IMAXABS)/g' \
+ -e 's/@''GNULIB_IMAXDIV''@/$(GL_GNULIB_IMAXDIV)/g' \
+ -e 's/@''GNULIB_STRTOIMAX''@/$(GL_GNULIB_STRTOIMAX)/g' \
+ -e 's/@''GNULIB_STRTOUMAX''@/$(GL_GNULIB_STRTOUMAX)/g' \
+ -e 's/@''HAVE_DECL_IMAXABS''@/$(HAVE_DECL_IMAXABS)/g' \
+ -e 's/@''HAVE_DECL_IMAXDIV''@/$(HAVE_DECL_IMAXDIV)/g' \
+ -e 's/@''HAVE_DECL_STRTOIMAX''@/$(HAVE_DECL_STRTOIMAX)/g' \
+ -e 's/@''HAVE_DECL_STRTOUMAX''@/$(HAVE_DECL_STRTOUMAX)/g' \
+ -e 's/@''HAVE_IMAXDIV_T''@/$(HAVE_IMAXDIV_T)/g' \
+ -e 's/@''REPLACE_IMAXABS''@/$(REPLACE_IMAXABS)/g' \
+ -e 's/@''REPLACE_IMAXDIV''@/$(REPLACE_IMAXDIV)/g' \
+ -e 's/@''REPLACE_STRTOIMAX''@/$(REPLACE_STRTOIMAX)/g' \
+ -e 's/@''REPLACE_STRTOUMAX''@/$(REPLACE_STRTOUMAX)/g' \
+ -e 's/@''INT32_MAX_LT_INTMAX_MAX''@/$(INT32_MAX_LT_INTMAX_MAX)/g' \
+ -e 's/@''INT64_MAX_EQ_LONG_MAX''@/$(INT64_MAX_EQ_LONG_MAX)/g' \
+ -e 's/@''UINT32_MAX_LT_UINTMAX_MAX''@/$(UINT32_MAX_LT_UINTMAX_MAX)/g' \
+ -e 's/@''UINT64_MAX_EQ_ULONG_MAX''@/$(UINT64_MAX_EQ_ULONG_MAX)/g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ $(top_srcdir)/lib/inttypes.in.h > $@-t
+ $(AM_V_at)mv $@-t $@
+MOSTLYCLEANFILES += lib/inttypes.h lib/inttypes.h-t
+
+EXTRA_DIST += lib/inttypes.in.h
+
+## end gnulib module inttypes-incomplete
+
+## begin gnulib module isnand-nolibm
+
+
+EXTRA_DIST += lib/float+.h lib/isnan.c lib/isnand-nolibm.h lib/isnand.c
+
+EXTRA_lib_libgnu_a_SOURCES += lib/isnan.c lib/isnand.c
+
+## end gnulib module isnand-nolibm
+
+## begin gnulib module isnanf-nolibm
+
+
+EXTRA_DIST += lib/float+.h lib/isnan.c lib/isnanf-nolibm.h lib/isnanf.c
+
+EXTRA_lib_libgnu_a_SOURCES += lib/isnan.c lib/isnanf.c
+
+## end gnulib module isnanf-nolibm
+
+## begin gnulib module isnanl-nolibm
+
+
+EXTRA_DIST += lib/float+.h lib/isnan.c lib/isnanl-nolibm.h lib/isnanl.c
+
+EXTRA_lib_libgnu_a_SOURCES += lib/isnan.c lib/isnanl.c
+
+## end gnulib module isnanl-nolibm
+
+## begin gnulib module limits-h
+
+BUILT_SOURCES += $(LIMITS_H)
+
+# We need the following in order to create <limits.h> when the system
+# doesn't have one that is compatible with GNU.
+if GL_GENERATE_LIMITS_H
+lib/limits.h: lib/limits.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)$(MKDIR_P) '%reldir%'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_LIMITS_H''@|$(NEXT_LIMITS_H)|g' \
+ $(top_srcdir)/lib/limits.in.h > $@-t
+ $(AM_V_at)mv $@-t $@
+else
+lib/limits.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += lib/limits.h lib/limits.h-t
+
+EXTRA_DIST += lib/limits.in.h
+
+## end gnulib module limits-h
+
+## begin gnulib module localcharset
+
+lib_libgnu_a_SOURCES += lib/localcharset.c
+
+EXTRA_DIST += lib/localcharset.h
+
+## end gnulib module localcharset
+
+## begin gnulib module math
+
+BUILT_SOURCES += lib/math.h
+lib_libgnu_a_SOURCES += lib/math.c
+
+# We need the following in order to create <math.h> when the system
+# doesn't have one that works with the given compiler.
+lib/math.h: lib/math.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)$(MKDIR_P) '%reldir%'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT_AS_FIRST_DIRECTIVE''@|$(INCLUDE_NEXT_AS_FIRST_DIRECTIVE)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_AS_FIRST_DIRECTIVE_MATH_H''@|$(NEXT_AS_FIRST_DIRECTIVE_MATH_H)|g' \
+ -e 's/@''GNULIB_ACOSF''@/$(GL_GNULIB_ACOSF)/g' \
+ -e 's/@''GNULIB_ACOSL''@/$(GL_GNULIB_ACOSL)/g' \
+ -e 's/@''GNULIB_ASINF''@/$(GL_GNULIB_ASINF)/g' \
+ -e 's/@''GNULIB_ASINL''@/$(GL_GNULIB_ASINL)/g' \
+ -e 's/@''GNULIB_ATANF''@/$(GL_GNULIB_ATANF)/g' \
+ -e 's/@''GNULIB_ATANL''@/$(GL_GNULIB_ATANL)/g' \
+ -e 's/@''GNULIB_ATAN2F''@/$(GL_GNULIB_ATAN2F)/g' \
+ -e 's/@''GNULIB_CBRT''@/$(GL_GNULIB_CBRT)/g' \
+ -e 's/@''GNULIB_CBRTF''@/$(GL_GNULIB_CBRTF)/g' \
+ -e 's/@''GNULIB_CBRTL''@/$(GL_GNULIB_CBRTL)/g' \
+ -e 's/@''GNULIB_CEIL''@/$(GL_GNULIB_CEIL)/g' \
+ -e 's/@''GNULIB_CEILF''@/$(GL_GNULIB_CEILF)/g' \
+ -e 's/@''GNULIB_CEILL''@/$(GL_GNULIB_CEILL)/g' \
+ -e 's/@''GNULIB_COPYSIGN''@/$(GL_GNULIB_COPYSIGN)/g' \
+ -e 's/@''GNULIB_COPYSIGNF''@/$(GL_GNULIB_COPYSIGNF)/g' \
+ -e 's/@''GNULIB_COPYSIGNL''@/$(GL_GNULIB_COPYSIGNL)/g' \
+ -e 's/@''GNULIB_COSF''@/$(GL_GNULIB_COSF)/g' \
+ -e 's/@''GNULIB_COSL''@/$(GL_GNULIB_COSL)/g' \
+ -e 's/@''GNULIB_COSHF''@/$(GL_GNULIB_COSHF)/g' \
+ -e 's/@''GNULIB_EXPF''@/$(GL_GNULIB_EXPF)/g' \
+ -e 's/@''GNULIB_EXPL''@/$(GL_GNULIB_EXPL)/g' \
+ -e 's/@''GNULIB_EXP2''@/$(GL_GNULIB_EXP2)/g' \
+ -e 's/@''GNULIB_EXP2F''@/$(GL_GNULIB_EXP2F)/g' \
+ -e 's/@''GNULIB_EXP2L''@/$(GL_GNULIB_EXP2L)/g' \
+ -e 's/@''GNULIB_EXPM1''@/$(GL_GNULIB_EXPM1)/g' \
+ -e 's/@''GNULIB_EXPM1F''@/$(GL_GNULIB_EXPM1F)/g' \
+ -e 's/@''GNULIB_EXPM1L''@/$(GL_GNULIB_EXPM1L)/g' \
+ -e 's/@''GNULIB_FABSF''@/$(GL_GNULIB_FABSF)/g' \
+ -e 's/@''GNULIB_FABSL''@/$(GL_GNULIB_FABSL)/g' \
+ -e 's/@''GNULIB_FLOOR''@/$(GL_GNULIB_FLOOR)/g' \
+ -e 's/@''GNULIB_FLOORF''@/$(GL_GNULIB_FLOORF)/g' \
+ -e 's/@''GNULIB_FLOORL''@/$(GL_GNULIB_FLOORL)/g' \
+ -e 's/@''GNULIB_FMA''@/$(GL_GNULIB_FMA)/g' \
+ -e 's/@''GNULIB_FMAF''@/$(GL_GNULIB_FMAF)/g' \
+ -e 's/@''GNULIB_FMAL''@/$(GL_GNULIB_FMAL)/g' \
+ -e 's/@''GNULIB_FMOD''@/$(GL_GNULIB_FMOD)/g' \
+ -e 's/@''GNULIB_FMODF''@/$(GL_GNULIB_FMODF)/g' \
+ -e 's/@''GNULIB_FMODL''@/$(GL_GNULIB_FMODL)/g' \
+ -e 's/@''GNULIB_FREXPF''@/$(GL_GNULIB_FREXPF)/g' \
+ -e 's/@''GNULIB_FREXP''@/$(GL_GNULIB_FREXP)/g' \
+ -e 's/@''GNULIB_FREXPL''@/$(GL_GNULIB_FREXPL)/g' \
+ -e 's/@''GNULIB_HYPOT''@/$(GL_GNULIB_HYPOT)/g' \
+ -e 's/@''GNULIB_HYPOTF''@/$(GL_GNULIB_HYPOTF)/g' \
+ -e 's/@''GNULIB_HYPOTL''@/$(GL_GNULIB_HYPOTL)/g' \
+ < $(top_srcdir)/lib/math.in.h | \
+ sed -e 's/@''GNULIB_ILOGB''@/$(GL_GNULIB_ILOGB)/g' \
+ -e 's/@''GNULIB_ILOGBF''@/$(GL_GNULIB_ILOGBF)/g' \
+ -e 's/@''GNULIB_ILOGBL''@/$(GL_GNULIB_ILOGBL)/g' \
+ -e 's/@''GNULIB_ISFINITE''@/$(GL_GNULIB_ISFINITE)/g' \
+ -e 's/@''GNULIB_ISINF''@/$(GL_GNULIB_ISINF)/g' \
+ -e 's/@''GNULIB_ISNAN''@/$(GL_GNULIB_ISNAN)/g' \
+ -e 's/@''GNULIB_ISNANF''@/$(GL_GNULIB_ISNANF)/g' \
+ -e 's/@''GNULIB_ISNAND''@/$(GL_GNULIB_ISNAND)/g' \
+ -e 's/@''GNULIB_ISNANL''@/$(GL_GNULIB_ISNANL)/g' \
+ -e 's/@''GNULIB_LDEXPF''@/$(GL_GNULIB_LDEXPF)/g' \
+ -e 's/@''GNULIB_LDEXPL''@/$(GL_GNULIB_LDEXPL)/g' \
+ -e 's/@''GNULIB_LOG''@/$(GL_GNULIB_LOG)/g' \
+ -e 's/@''GNULIB_LOGF''@/$(GL_GNULIB_LOGF)/g' \
+ -e 's/@''GNULIB_LOGL''@/$(GL_GNULIB_LOGL)/g' \
+ -e 's/@''GNULIB_LOG10''@/$(GL_GNULIB_LOG10)/g' \
+ -e 's/@''GNULIB_LOG10F''@/$(GL_GNULIB_LOG10F)/g' \
+ -e 's/@''GNULIB_LOG10L''@/$(GL_GNULIB_LOG10L)/g' \
+ -e 's/@''GNULIB_LOG1P''@/$(GL_GNULIB_LOG1P)/g' \
+ -e 's/@''GNULIB_LOG1PF''@/$(GL_GNULIB_LOG1PF)/g' \
+ -e 's/@''GNULIB_LOG1PL''@/$(GL_GNULIB_LOG1PL)/g' \
+ -e 's/@''GNULIB_LOG2''@/$(GL_GNULIB_LOG2)/g' \
+ -e 's/@''GNULIB_LOG2F''@/$(GL_GNULIB_LOG2F)/g' \
+ -e 's/@''GNULIB_LOG2L''@/$(GL_GNULIB_LOG2L)/g' \
+ -e 's/@''GNULIB_LOGB''@/$(GL_GNULIB_LOGB)/g' \
+ -e 's/@''GNULIB_LOGBF''@/$(GL_GNULIB_LOGBF)/g' \
+ -e 's/@''GNULIB_LOGBL''@/$(GL_GNULIB_LOGBL)/g' \
+ -e 's/@''GNULIB_MODF''@/$(GL_GNULIB_MODF)/g' \
+ -e 's/@''GNULIB_MODFF''@/$(GL_GNULIB_MODFF)/g' \
+ -e 's/@''GNULIB_MODFL''@/$(GL_GNULIB_MODFL)/g' \
+ -e 's/@''GNULIB_POWF''@/$(GL_GNULIB_POWF)/g' \
+ -e 's/@''GNULIB_REMAINDER''@/$(GL_GNULIB_REMAINDER)/g' \
+ -e 's/@''GNULIB_REMAINDERF''@/$(GL_GNULIB_REMAINDERF)/g' \
+ -e 's/@''GNULIB_REMAINDERL''@/$(GL_GNULIB_REMAINDERL)/g' \
+ -e 's/@''GNULIB_RINT''@/$(GL_GNULIB_RINT)/g' \
+ -e 's/@''GNULIB_RINTF''@/$(GL_GNULIB_RINTF)/g' \
+ -e 's/@''GNULIB_RINTL''@/$(GL_GNULIB_RINTL)/g' \
+ -e 's/@''GNULIB_ROUND''@/$(GL_GNULIB_ROUND)/g' \
+ -e 's/@''GNULIB_ROUNDF''@/$(GL_GNULIB_ROUNDF)/g' \
+ -e 's/@''GNULIB_ROUNDL''@/$(GL_GNULIB_ROUNDL)/g' \
+ -e 's/@''GNULIB_SIGNBIT''@/$(GL_GNULIB_SIGNBIT)/g' \
+ -e 's/@''GNULIB_SINF''@/$(GL_GNULIB_SINF)/g' \
+ -e 's/@''GNULIB_SINL''@/$(GL_GNULIB_SINL)/g' \
+ -e 's/@''GNULIB_SINHF''@/$(GL_GNULIB_SINHF)/g' \
+ -e 's/@''GNULIB_SQRTF''@/$(GL_GNULIB_SQRTF)/g' \
+ -e 's/@''GNULIB_SQRTL''@/$(GL_GNULIB_SQRTL)/g' \
+ -e 's/@''GNULIB_TANF''@/$(GL_GNULIB_TANF)/g' \
+ -e 's/@''GNULIB_TANL''@/$(GL_GNULIB_TANL)/g' \
+ -e 's/@''GNULIB_TANHF''@/$(GL_GNULIB_TANHF)/g' \
+ -e 's/@''GNULIB_TRUNC''@/$(GL_GNULIB_TRUNC)/g' \
+ -e 's/@''GNULIB_TRUNCF''@/$(GL_GNULIB_TRUNCF)/g' \
+ -e 's/@''GNULIB_TRUNCL''@/$(GL_GNULIB_TRUNCL)/g' \
+ -e 's/@''GNULIB_MDA_J0''@/$(GL_GNULIB_MDA_J0)/g' \
+ -e 's/@''GNULIB_MDA_J1''@/$(GL_GNULIB_MDA_J1)/g' \
+ -e 's/@''GNULIB_MDA_JN''@/$(GL_GNULIB_MDA_JN)/g' \
+ -e 's/@''GNULIB_MDA_Y0''@/$(GL_GNULIB_MDA_Y0)/g' \
+ -e 's/@''GNULIB_MDA_Y1''@/$(GL_GNULIB_MDA_Y1)/g' \
+ -e 's/@''GNULIB_MDA_YN''@/$(GL_GNULIB_MDA_YN)/g' \
+ | \
+ sed -e 's|@''HAVE_ACOSF''@|$(HAVE_ACOSF)|g' \
+ -e 's|@''HAVE_ACOSL''@|$(HAVE_ACOSL)|g' \
+ -e 's|@''HAVE_ASINF''@|$(HAVE_ASINF)|g' \
+ -e 's|@''HAVE_ASINL''@|$(HAVE_ASINL)|g' \
+ -e 's|@''HAVE_ATANF''@|$(HAVE_ATANF)|g' \
+ -e 's|@''HAVE_ATANL''@|$(HAVE_ATANL)|g' \
+ -e 's|@''HAVE_ATAN2F''@|$(HAVE_ATAN2F)|g' \
+ -e 's|@''HAVE_CBRT''@|$(HAVE_CBRT)|g' \
+ -e 's|@''HAVE_CBRTF''@|$(HAVE_CBRTF)|g' \
+ -e 's|@''HAVE_CBRTL''@|$(HAVE_CBRTL)|g' \
+ -e 's|@''HAVE_COPYSIGN''@|$(HAVE_COPYSIGN)|g' \
+ -e 's|@''HAVE_COPYSIGNL''@|$(HAVE_COPYSIGNL)|g' \
+ -e 's|@''HAVE_COSF''@|$(HAVE_COSF)|g' \
+ -e 's|@''HAVE_COSL''@|$(HAVE_COSL)|g' \
+ -e 's|@''HAVE_COSHF''@|$(HAVE_COSHF)|g' \
+ -e 's|@''HAVE_EXPF''@|$(HAVE_EXPF)|g' \
+ -e 's|@''HAVE_EXPL''@|$(HAVE_EXPL)|g' \
+ -e 's|@''HAVE_EXPM1''@|$(HAVE_EXPM1)|g' \
+ -e 's|@''HAVE_EXPM1F''@|$(HAVE_EXPM1F)|g' \
+ -e 's|@''HAVE_FABSF''@|$(HAVE_FABSF)|g' \
+ -e 's|@''HAVE_FABSL''@|$(HAVE_FABSL)|g' \
+ -e 's|@''HAVE_FMA''@|$(HAVE_FMA)|g' \
+ -e 's|@''HAVE_FMAF''@|$(HAVE_FMAF)|g' \
+ -e 's|@''HAVE_FMAL''@|$(HAVE_FMAL)|g' \
+ -e 's|@''HAVE_FMODF''@|$(HAVE_FMODF)|g' \
+ -e 's|@''HAVE_FMODL''@|$(HAVE_FMODL)|g' \
+ -e 's|@''HAVE_FREXPF''@|$(HAVE_FREXPF)|g' \
+ -e 's|@''HAVE_HYPOTF''@|$(HAVE_HYPOTF)|g' \
+ -e 's|@''HAVE_HYPOTL''@|$(HAVE_HYPOTL)|g' \
+ -e 's|@''HAVE_ILOGB''@|$(HAVE_ILOGB)|g' \
+ -e 's|@''HAVE_ILOGBF''@|$(HAVE_ILOGBF)|g' \
+ -e 's|@''HAVE_ILOGBL''@|$(HAVE_ILOGBL)|g' \
+ -e 's|@''HAVE_ISNANF''@|$(HAVE_ISNANF)|g' \
+ -e 's|@''HAVE_ISNAND''@|$(HAVE_ISNAND)|g' \
+ -e 's|@''HAVE_ISNANL''@|$(HAVE_ISNANL)|g' \
+ -e 's|@''HAVE_LDEXPF''@|$(HAVE_LDEXPF)|g' \
+ -e 's|@''HAVE_LOGF''@|$(HAVE_LOGF)|g' \
+ -e 's|@''HAVE_LOGL''@|$(HAVE_LOGL)|g' \
+ -e 's|@''HAVE_LOG10F''@|$(HAVE_LOG10F)|g' \
+ -e 's|@''HAVE_LOG10L''@|$(HAVE_LOG10L)|g' \
+ -e 's|@''HAVE_LOG1P''@|$(HAVE_LOG1P)|g' \
+ -e 's|@''HAVE_LOG1PF''@|$(HAVE_LOG1PF)|g' \
+ -e 's|@''HAVE_LOG1PL''@|$(HAVE_LOG1PL)|g' \
+ -e 's|@''HAVE_LOGBF''@|$(HAVE_LOGBF)|g' \
+ -e 's|@''HAVE_LOGBL''@|$(HAVE_LOGBL)|g' \
+ -e 's|@''HAVE_MODFF''@|$(HAVE_MODFF)|g' \
+ -e 's|@''HAVE_MODFL''@|$(HAVE_MODFL)|g' \
+ -e 's|@''HAVE_POWF''@|$(HAVE_POWF)|g' \
+ -e 's|@''HAVE_REMAINDER''@|$(HAVE_REMAINDER)|g' \
+ -e 's|@''HAVE_REMAINDERF''@|$(HAVE_REMAINDERF)|g' \
+ -e 's|@''HAVE_RINT''@|$(HAVE_RINT)|g' \
+ -e 's|@''HAVE_RINTL''@|$(HAVE_RINTL)|g' \
+ -e 's|@''HAVE_SINF''@|$(HAVE_SINF)|g' \
+ -e 's|@''HAVE_SINL''@|$(HAVE_SINL)|g' \
+ -e 's|@''HAVE_SINHF''@|$(HAVE_SINHF)|g' \
+ -e 's|@''HAVE_SQRTF''@|$(HAVE_SQRTF)|g' \
+ -e 's|@''HAVE_SQRTL''@|$(HAVE_SQRTL)|g' \
+ -e 's|@''HAVE_TANF''@|$(HAVE_TANF)|g' \
+ -e 's|@''HAVE_TANL''@|$(HAVE_TANL)|g' \
+ -e 's|@''HAVE_TANHF''@|$(HAVE_TANHF)|g' \
+ -e 's|@''HAVE_DECL_ACOSL''@|$(HAVE_DECL_ACOSL)|g' \
+ -e 's|@''HAVE_DECL_ASINL''@|$(HAVE_DECL_ASINL)|g' \
+ -e 's|@''HAVE_DECL_ATANL''@|$(HAVE_DECL_ATANL)|g' \
+ -e 's|@''HAVE_DECL_CBRTF''@|$(HAVE_DECL_CBRTF)|g' \
+ -e 's|@''HAVE_DECL_CBRTL''@|$(HAVE_DECL_CBRTL)|g' \
+ -e 's|@''HAVE_DECL_CEILF''@|$(HAVE_DECL_CEILF)|g' \
+ -e 's|@''HAVE_DECL_CEILL''@|$(HAVE_DECL_CEILL)|g' \
+ -e 's|@''HAVE_DECL_COPYSIGNF''@|$(HAVE_DECL_COPYSIGNF)|g' \
+ -e 's|@''HAVE_DECL_COSL''@|$(HAVE_DECL_COSL)|g' \
+ -e 's|@''HAVE_DECL_EXPL''@|$(HAVE_DECL_EXPL)|g' \
+ -e 's|@''HAVE_DECL_EXP2''@|$(HAVE_DECL_EXP2)|g' \
+ -e 's|@''HAVE_DECL_EXP2F''@|$(HAVE_DECL_EXP2F)|g' \
+ -e 's|@''HAVE_DECL_EXP2L''@|$(HAVE_DECL_EXP2L)|g' \
+ -e 's|@''HAVE_DECL_EXPM1L''@|$(HAVE_DECL_EXPM1L)|g' \
+ -e 's|@''HAVE_DECL_FLOORF''@|$(HAVE_DECL_FLOORF)|g' \
+ -e 's|@''HAVE_DECL_FLOORL''@|$(HAVE_DECL_FLOORL)|g' \
+ -e 's|@''HAVE_DECL_FREXPL''@|$(HAVE_DECL_FREXPL)|g' \
+ -e 's|@''HAVE_DECL_LDEXPL''@|$(HAVE_DECL_LDEXPL)|g' \
+ -e 's|@''HAVE_DECL_LOGL''@|$(HAVE_DECL_LOGL)|g' \
+ -e 's|@''HAVE_DECL_LOG10L''@|$(HAVE_DECL_LOG10L)|g' \
+ -e 's|@''HAVE_DECL_LOG2''@|$(HAVE_DECL_LOG2)|g' \
+ -e 's|@''HAVE_DECL_LOG2F''@|$(HAVE_DECL_LOG2F)|g' \
+ -e 's|@''HAVE_DECL_LOG2L''@|$(HAVE_DECL_LOG2L)|g' \
+ -e 's|@''HAVE_DECL_LOGB''@|$(HAVE_DECL_LOGB)|g' \
+ -e 's|@''HAVE_DECL_REMAINDER''@|$(HAVE_DECL_REMAINDER)|g' \
+ -e 's|@''HAVE_DECL_REMAINDERL''@|$(HAVE_DECL_REMAINDERL)|g' \
+ -e 's|@''HAVE_DECL_RINTF''@|$(HAVE_DECL_RINTF)|g' \
+ -e 's|@''HAVE_DECL_ROUND''@|$(HAVE_DECL_ROUND)|g' \
+ -e 's|@''HAVE_DECL_ROUNDF''@|$(HAVE_DECL_ROUNDF)|g' \
+ -e 's|@''HAVE_DECL_ROUNDL''@|$(HAVE_DECL_ROUNDL)|g' \
+ -e 's|@''HAVE_DECL_SINL''@|$(HAVE_DECL_SINL)|g' \
+ -e 's|@''HAVE_DECL_SQRTL''@|$(HAVE_DECL_SQRTL)|g' \
+ -e 's|@''HAVE_DECL_TANL''@|$(HAVE_DECL_TANL)|g' \
+ -e 's|@''HAVE_DECL_TRUNC''@|$(HAVE_DECL_TRUNC)|g' \
+ -e 's|@''HAVE_DECL_TRUNCF''@|$(HAVE_DECL_TRUNCF)|g' \
+ -e 's|@''HAVE_DECL_TRUNCL''@|$(HAVE_DECL_TRUNCL)|g' \
+ | \
+ sed -e 's|@''REPLACE_ACOSF''@|$(REPLACE_ACOSF)|g' \
+ -e 's|@''REPLACE_ASINF''@|$(REPLACE_ASINF)|g' \
+ -e 's|@''REPLACE_ATANF''@|$(REPLACE_ATANF)|g' \
+ -e 's|@''REPLACE_ATAN2F''@|$(REPLACE_ATAN2F)|g' \
+ -e 's|@''REPLACE_CBRTF''@|$(REPLACE_CBRTF)|g' \
+ -e 's|@''REPLACE_CBRTL''@|$(REPLACE_CBRTL)|g' \
+ -e 's|@''REPLACE_CEIL''@|$(REPLACE_CEIL)|g' \
+ -e 's|@''REPLACE_CEILF''@|$(REPLACE_CEILF)|g' \
+ -e 's|@''REPLACE_CEILL''@|$(REPLACE_CEILL)|g' \
+ -e 's|@''REPLACE_COSF''@|$(REPLACE_COSF)|g' \
+ -e 's|@''REPLACE_COSHF''@|$(REPLACE_COSHF)|g' \
+ -e 's|@''REPLACE_EXPF''@|$(REPLACE_EXPF)|g' \
+ -e 's|@''REPLACE_EXPL''@|$(REPLACE_EXPL)|g' \
+ -e 's|@''REPLACE_EXPM1''@|$(REPLACE_EXPM1)|g' \
+ -e 's|@''REPLACE_EXPM1F''@|$(REPLACE_EXPM1F)|g' \
+ -e 's|@''REPLACE_EXPM1L''@|$(REPLACE_EXPM1L)|g' \
+ -e 's|@''REPLACE_EXP2''@|$(REPLACE_EXP2)|g' \
+ -e 's|@''REPLACE_EXP2L''@|$(REPLACE_EXP2L)|g' \
+ -e 's|@''REPLACE_FABSL''@|$(REPLACE_FABSL)|g' \
+ -e 's|@''REPLACE_FLOOR''@|$(REPLACE_FLOOR)|g' \
+ -e 's|@''REPLACE_FLOORF''@|$(REPLACE_FLOORF)|g' \
+ -e 's|@''REPLACE_FLOORL''@|$(REPLACE_FLOORL)|g' \
+ -e 's|@''REPLACE_FMA''@|$(REPLACE_FMA)|g' \
+ -e 's|@''REPLACE_FMAF''@|$(REPLACE_FMAF)|g' \
+ -e 's|@''REPLACE_FMAL''@|$(REPLACE_FMAL)|g' \
+ -e 's|@''REPLACE_FMOD''@|$(REPLACE_FMOD)|g' \
+ -e 's|@''REPLACE_FMODF''@|$(REPLACE_FMODF)|g' \
+ -e 's|@''REPLACE_FMODL''@|$(REPLACE_FMODL)|g' \
+ -e 's|@''REPLACE_FREXPF''@|$(REPLACE_FREXPF)|g' \
+ -e 's|@''REPLACE_FREXP''@|$(REPLACE_FREXP)|g' \
+ -e 's|@''REPLACE_FREXPL''@|$(REPLACE_FREXPL)|g' \
+ -e 's|@''REPLACE_HUGE_VAL''@|$(REPLACE_HUGE_VAL)|g' \
+ -e 's|@''REPLACE_HYPOT''@|$(REPLACE_HYPOT)|g' \
+ -e 's|@''REPLACE_HYPOTF''@|$(REPLACE_HYPOTF)|g' \
+ -e 's|@''REPLACE_HYPOTL''@|$(REPLACE_HYPOTL)|g' \
+ -e 's|@''REPLACE_ILOGB''@|$(REPLACE_ILOGB)|g' \
+ -e 's|@''REPLACE_ILOGBF''@|$(REPLACE_ILOGBF)|g' \
+ -e 's|@''REPLACE_ILOGBL''@|$(REPLACE_ILOGBL)|g' \
+ -e 's|@''REPLACE_ISFINITE''@|$(REPLACE_ISFINITE)|g' \
+ -e 's|@''REPLACE_ISINF''@|$(REPLACE_ISINF)|g' \
+ -e 's|@''REPLACE_ISNAN''@|$(REPLACE_ISNAN)|g' \
+ -e 's|@''REPLACE_ITOLD''@|$(REPLACE_ITOLD)|g' \
+ -e 's|@''REPLACE_LDEXPL''@|$(REPLACE_LDEXPL)|g' \
+ -e 's|@''REPLACE_LOG''@|$(REPLACE_LOG)|g' \
+ -e 's|@''REPLACE_LOGF''@|$(REPLACE_LOGF)|g' \
+ -e 's|@''REPLACE_LOGL''@|$(REPLACE_LOGL)|g' \
+ -e 's|@''REPLACE_LOG10''@|$(REPLACE_LOG10)|g' \
+ -e 's|@''REPLACE_LOG10F''@|$(REPLACE_LOG10F)|g' \
+ -e 's|@''REPLACE_LOG10L''@|$(REPLACE_LOG10L)|g' \
+ -e 's|@''REPLACE_LOG1P''@|$(REPLACE_LOG1P)|g' \
+ -e 's|@''REPLACE_LOG1PF''@|$(REPLACE_LOG1PF)|g' \
+ -e 's|@''REPLACE_LOG1PL''@|$(REPLACE_LOG1PL)|g' \
+ -e 's|@''REPLACE_LOG2''@|$(REPLACE_LOG2)|g' \
+ -e 's|@''REPLACE_LOG2F''@|$(REPLACE_LOG2F)|g' \
+ -e 's|@''REPLACE_LOG2L''@|$(REPLACE_LOG2L)|g' \
+ -e 's|@''REPLACE_LOGB''@|$(REPLACE_LOGB)|g' \
+ -e 's|@''REPLACE_LOGBF''@|$(REPLACE_LOGBF)|g' \
+ -e 's|@''REPLACE_LOGBL''@|$(REPLACE_LOGBL)|g' \
+ -e 's|@''REPLACE_MODF''@|$(REPLACE_MODF)|g' \
+ -e 's|@''REPLACE_MODFF''@|$(REPLACE_MODFF)|g' \
+ -e 's|@''REPLACE_MODFL''@|$(REPLACE_MODFL)|g' \
+ -e 's|@''REPLACE_NAN''@|$(REPLACE_NAN)|g' \
+ -e 's|@''REPLACE_REMAINDER''@|$(REPLACE_REMAINDER)|g' \
+ -e 's|@''REPLACE_REMAINDERF''@|$(REPLACE_REMAINDERF)|g' \
+ -e 's|@''REPLACE_REMAINDERL''@|$(REPLACE_REMAINDERL)|g' \
+ -e 's|@''REPLACE_RINTL''@|$(REPLACE_RINTL)|g' \
+ -e 's|@''REPLACE_ROUND''@|$(REPLACE_ROUND)|g' \
+ -e 's|@''REPLACE_ROUNDF''@|$(REPLACE_ROUNDF)|g' \
+ -e 's|@''REPLACE_ROUNDL''@|$(REPLACE_ROUNDL)|g' \
+ -e 's|@''REPLACE_SIGNBIT''@|$(REPLACE_SIGNBIT)|g' \
+ -e 's|@''REPLACE_SIGNBIT_USING_BUILTINS''@|$(REPLACE_SIGNBIT_USING_BUILTINS)|g' \
+ -e 's|@''REPLACE_SINF''@|$(REPLACE_SINF)|g' \
+ -e 's|@''REPLACE_SINHF''@|$(REPLACE_SINHF)|g' \
+ -e 's|@''REPLACE_SQRTF''@|$(REPLACE_SQRTF)|g' \
+ -e 's|@''REPLACE_SQRTL''@|$(REPLACE_SQRTL)|g' \
+ -e 's|@''REPLACE_TANF''@|$(REPLACE_TANF)|g' \
+ -e 's|@''REPLACE_TANHF''@|$(REPLACE_TANHF)|g' \
+ -e 's|@''REPLACE_TRUNC''@|$(REPLACE_TRUNC)|g' \
+ -e 's|@''REPLACE_TRUNCF''@|$(REPLACE_TRUNCF)|g' \
+ -e 's|@''REPLACE_TRUNCL''@|$(REPLACE_TRUNCL)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ > $@-t
+ $(AM_V_at)mv $@-t $@
+MOSTLYCLEANFILES += lib/math.h lib/math.h-t
+
+EXTRA_DIST += lib/math.in.h
+
+## end gnulib module math
+
+## begin gnulib module memchr
+
+if GL_COND_OBJ_MEMCHR
+lib_libgnu_a_SOURCES += lib/memchr.c
+endif
+
+EXTRA_DIST += lib/memchr.valgrind
+
+## end gnulib module memchr
+
+## begin gnulib module printf-frexp
+
+lib_libgnu_a_SOURCES += lib/printf-frexp.c
+
+EXTRA_DIST += lib/printf-frexp.h
+
+## end gnulib module printf-frexp
+
+## begin gnulib module printf-frexpl
+
+lib_libgnu_a_SOURCES += lib/printf-frexpl.c
+
+EXTRA_DIST += lib/printf-frexp.c lib/printf-frexpl.h
+
+EXTRA_lib_libgnu_a_SOURCES += lib/printf-frexp.c
+
+## end gnulib module printf-frexpl
+
+## begin gnulib module signbit
+
+if GL_COND_OBJ_SIGNBIT3
+lib_libgnu_a_SOURCES += lib/signbitf.c lib/signbitd.c lib/signbitl.c
+endif
+
+EXTRA_DIST += lib/float+.h
+
+## end gnulib module signbit
+
+## begin gnulib module size_max
+
+lib_libgnu_a_SOURCES += lib/size_max.h
+
+## end gnulib module size_max
+
+## begin gnulib module snippet/_Noreturn
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+
+_NORETURN_H=$(top_srcdir)/lib/_Noreturn.h
+
+EXTRA_DIST += lib/_Noreturn.h
+
+## end gnulib module snippet/_Noreturn
+
+## begin gnulib module snippet/arg-nonnull
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+
+ARG_NONNULL_H=$(top_srcdir)/lib/arg-nonnull.h
+
+EXTRA_DIST += lib/arg-nonnull.h
+
+## end gnulib module snippet/arg-nonnull
+
+## begin gnulib module snippet/c++defs
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+
+CXXDEFS_H=$(top_srcdir)/lib/c++defs.h
+
+EXTRA_DIST += lib/c++defs.h
+
+## end gnulib module snippet/c++defs
+
+## begin gnulib module snippet/warn-on-use
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+
+WARN_ON_USE_H=$(top_srcdir)/lib/warn-on-use.h
+
+EXTRA_DIST += lib/warn-on-use.h
+
+## end gnulib module snippet/warn-on-use
+
+## begin gnulib module snprintf
+
+
+EXTRA_DIST += lib/snprintf.c
+
+EXTRA_lib_libgnu_a_SOURCES += lib/snprintf.c
+
+## end gnulib module snprintf
+
+## begin gnulib module stdbool-c99
+
+BUILT_SOURCES += $(STDBOOL_H)
+
+# We need the following in order to create <stdbool.h> when the system
+# doesn't have one that works.
+if GL_GENERATE_STDBOOL_H
+lib/stdbool.h: lib/stdbool.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)$(MKDIR_P) '%reldir%'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' \
+ $(top_srcdir)/lib/stdbool.in.h > $@-t
+ $(AM_V_at)mv $@-t $@
+else
+lib/stdbool.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += lib/stdbool.h lib/stdbool.h-t
+
+EXTRA_DIST += lib/stdbool.in.h
+
+## end gnulib module stdbool-c99
+
+## begin gnulib module stddef
+
+BUILT_SOURCES += $(STDDEF_H)
+
+# We need the following in order to create <stddef.h> when the system
+# doesn't have one that works with the given compiler.
+if GL_GENERATE_STDDEF_H
+lib/stddef.h: lib/stddef.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)$(MKDIR_P) '%reldir%'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_STDDEF_H''@|$(NEXT_STDDEF_H)|g' \
+ -e 's|@''HAVE_MAX_ALIGN_T''@|$(HAVE_MAX_ALIGN_T)|g' \
+ -e 's|@''HAVE_WCHAR_T''@|$(HAVE_WCHAR_T)|g' \
+ -e 's|@''REPLACE_NULL''@|$(REPLACE_NULL)|g' \
+ $(top_srcdir)/lib/stddef.in.h > $@-t
+ $(AM_V_at)mv $@-t $@
+else
+lib/stddef.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += lib/stddef.h lib/stddef.h-t
+
+EXTRA_DIST += lib/stddef.in.h
+
+## end gnulib module stddef
+
+## begin gnulib module stdint
+
+BUILT_SOURCES += $(STDINT_H)
+
+# We need the following in order to create <stdint.h> when the system
+# doesn't have one that works with the given compiler.
+if GL_GENERATE_STDINT_H
+lib/stdint.h: lib/stdint.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)$(MKDIR_P) '%reldir%'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's/@''HAVE_STDINT_H''@/$(HAVE_STDINT_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_STDINT_H''@|$(NEXT_STDINT_H)|g' \
+ -e 's/@''HAVE_C99_STDINT_H''@/$(HAVE_C99_STDINT_H)/g' \
+ -e 's/@''HAVE_SYS_TYPES_H''@/$(HAVE_SYS_TYPES_H)/g' \
+ -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \
+ -e 's/@''HAVE_SYS_INTTYPES_H''@/$(HAVE_SYS_INTTYPES_H)/g' \
+ -e 's/@''HAVE_SYS_BITYPES_H''@/$(HAVE_SYS_BITYPES_H)/g' \
+ -e 's/@''HAVE_WCHAR_H''@/$(HAVE_WCHAR_H)/g' \
+ -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \
+ -e 's/@''BITSIZEOF_PTRDIFF_T''@/$(BITSIZEOF_PTRDIFF_T)/g' \
+ -e 's/@''PTRDIFF_T_SUFFIX''@/$(PTRDIFF_T_SUFFIX)/g' \
+ -e 's/@''BITSIZEOF_SIG_ATOMIC_T''@/$(BITSIZEOF_SIG_ATOMIC_T)/g' \
+ -e 's/@''HAVE_SIGNED_SIG_ATOMIC_T''@/$(HAVE_SIGNED_SIG_ATOMIC_T)/g' \
+ -e 's/@''SIG_ATOMIC_T_SUFFIX''@/$(SIG_ATOMIC_T_SUFFIX)/g' \
+ -e 's/@''BITSIZEOF_SIZE_T''@/$(BITSIZEOF_SIZE_T)/g' \
+ -e 's/@''SIZE_T_SUFFIX''@/$(SIZE_T_SUFFIX)/g' \
+ -e 's/@''BITSIZEOF_WCHAR_T''@/$(BITSIZEOF_WCHAR_T)/g' \
+ -e 's/@''HAVE_SIGNED_WCHAR_T''@/$(HAVE_SIGNED_WCHAR_T)/g' \
+ -e 's/@''WCHAR_T_SUFFIX''@/$(WCHAR_T_SUFFIX)/g' \
+ -e 's/@''BITSIZEOF_WINT_T''@/$(BITSIZEOF_WINT_T)/g' \
+ -e 's/@''HAVE_SIGNED_WINT_T''@/$(HAVE_SIGNED_WINT_T)/g' \
+ -e 's/@''WINT_T_SUFFIX''@/$(WINT_T_SUFFIX)/g' \
+ -e 's/@''GNULIBHEADERS_OVERRIDE_WINT_T''@/$(GNULIBHEADERS_OVERRIDE_WINT_T)/g' \
+ $(top_srcdir)/lib/stdint.in.h > $@-t
+ $(AM_V_at)mv $@-t $@
+else
+lib/stdint.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += lib/stdint.h lib/stdint.h-t
+
+EXTRA_DIST += lib/stdint.in.h
+
+## end gnulib module stdint
+
+## begin gnulib module stdio
+
+BUILT_SOURCES += lib/stdio.h
+
+# We need the following in order to create <stdio.h> when the system
+# doesn't have one that works with the given compiler.
+lib/stdio.h: lib/stdio.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)$(MKDIR_P) '%reldir%'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_STDIO_H''@|$(NEXT_STDIO_H)|g' \
+ -e 's/@''GNULIB_DPRINTF''@/$(GL_GNULIB_DPRINTF)/g' \
+ -e 's/@''GNULIB_FCLOSE''@/$(GL_GNULIB_FCLOSE)/g' \
+ -e 's/@''GNULIB_FDOPEN''@/$(GL_GNULIB_FDOPEN)/g' \
+ -e 's/@''GNULIB_FFLUSH''@/$(GL_GNULIB_FFLUSH)/g' \
+ -e 's/@''GNULIB_FGETC''@/$(GL_GNULIB_FGETC)/g' \
+ -e 's/@''GNULIB_FGETS''@/$(GL_GNULIB_FGETS)/g' \
+ -e 's/@''GNULIB_FOPEN''@/$(GL_GNULIB_FOPEN)/g' \
+ -e 's/@''GNULIB_FOPEN_GNU''@/$(GL_GNULIB_FOPEN_GNU)/g' \
+ -e 's/@''GNULIB_FPRINTF''@/$(GL_GNULIB_FPRINTF)/g' \
+ -e 's/@''GNULIB_FPRINTF_POSIX''@/$(GL_GNULIB_FPRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_FPURGE''@/$(GL_GNULIB_FPURGE)/g' \
+ -e 's/@''GNULIB_FPUTC''@/$(GL_GNULIB_FPUTC)/g' \
+ -e 's/@''GNULIB_FPUTS''@/$(GL_GNULIB_FPUTS)/g' \
+ -e 's/@''GNULIB_FREAD''@/$(GL_GNULIB_FREAD)/g' \
+ -e 's/@''GNULIB_FREOPEN''@/$(GL_GNULIB_FREOPEN)/g' \
+ -e 's/@''GNULIB_FSCANF''@/$(GL_GNULIB_FSCANF)/g' \
+ -e 's/@''GNULIB_FSEEK''@/$(GL_GNULIB_FSEEK)/g' \
+ -e 's/@''GNULIB_FSEEKO''@/$(GL_GNULIB_FSEEKO)/g' \
+ -e 's/@''GNULIB_FTELL''@/$(GL_GNULIB_FTELL)/g' \
+ -e 's/@''GNULIB_FTELLO''@/$(GL_GNULIB_FTELLO)/g' \
+ -e 's/@''GNULIB_FWRITE''@/$(GL_GNULIB_FWRITE)/g' \
+ -e 's/@''GNULIB_GETC''@/$(GL_GNULIB_GETC)/g' \
+ -e 's/@''GNULIB_GETCHAR''@/$(GL_GNULIB_GETCHAR)/g' \
+ -e 's/@''GNULIB_GETDELIM''@/$(GL_GNULIB_GETDELIM)/g' \
+ -e 's/@''GNULIB_GETLINE''@/$(GL_GNULIB_GETLINE)/g' \
+ -e 's/@''GNULIB_OBSTACK_PRINTF''@/$(GL_GNULIB_OBSTACK_PRINTF)/g' \
+ -e 's/@''GNULIB_OBSTACK_PRINTF_POSIX''@/$(GL_GNULIB_OBSTACK_PRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_PCLOSE''@/$(GL_GNULIB_PCLOSE)/g' \
+ -e 's/@''GNULIB_PERROR''@/$(GL_GNULIB_PERROR)/g' \
+ -e 's/@''GNULIB_POPEN''@/$(GL_GNULIB_POPEN)/g' \
+ -e 's/@''GNULIB_PRINTF''@/$(GL_GNULIB_PRINTF)/g' \
+ -e 's/@''GNULIB_PRINTF_POSIX''@/$(GL_GNULIB_PRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_PUTC''@/$(GL_GNULIB_PUTC)/g' \
+ -e 's/@''GNULIB_PUTCHAR''@/$(GL_GNULIB_PUTCHAR)/g' \
+ -e 's/@''GNULIB_PUTS''@/$(GL_GNULIB_PUTS)/g' \
+ -e 's/@''GNULIB_REMOVE''@/$(GL_GNULIB_REMOVE)/g' \
+ -e 's/@''GNULIB_RENAME''@/$(GL_GNULIB_RENAME)/g' \
+ -e 's/@''GNULIB_RENAMEAT''@/$(GL_GNULIB_RENAMEAT)/g' \
+ -e 's/@''GNULIB_SCANF''@/$(GL_GNULIB_SCANF)/g' \
+ -e 's/@''GNULIB_SNPRINTF''@/$(GL_GNULIB_SNPRINTF)/g' \
+ -e 's/@''GNULIB_SPRINTF_POSIX''@/$(GL_GNULIB_SPRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_STDIO_H_NONBLOCKING''@/$(GL_GNULIB_STDIO_H_NONBLOCKING)/g' \
+ -e 's/@''GNULIB_STDIO_H_SIGPIPE''@/$(GL_GNULIB_STDIO_H_SIGPIPE)/g' \
+ -e 's/@''GNULIB_TMPFILE''@/$(GL_GNULIB_TMPFILE)/g' \
+ -e 's/@''GNULIB_VASPRINTF''@/$(GL_GNULIB_VASPRINTF)/g' \
+ -e 's/@''GNULIB_VDPRINTF''@/$(GL_GNULIB_VDPRINTF)/g' \
+ -e 's/@''GNULIB_VFPRINTF''@/$(GL_GNULIB_VFPRINTF)/g' \
+ -e 's/@''GNULIB_VFPRINTF_POSIX''@/$(GL_GNULIB_VFPRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_VFSCANF''@/$(GL_GNULIB_VFSCANF)/g' \
+ -e 's/@''GNULIB_VSCANF''@/$(GL_GNULIB_VSCANF)/g' \
+ -e 's/@''GNULIB_VPRINTF''@/$(GL_GNULIB_VPRINTF)/g' \
+ -e 's/@''GNULIB_VPRINTF_POSIX''@/$(GL_GNULIB_VPRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_VSNPRINTF''@/$(GL_GNULIB_VSNPRINTF)/g' \
+ -e 's/@''GNULIB_VSPRINTF_POSIX''@/$(GL_GNULIB_VSPRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_MDA_FCLOSEALL''@/$(GL_GNULIB_MDA_FCLOSEALL)/g' \
+ -e 's/@''GNULIB_MDA_FDOPEN''@/$(GL_GNULIB_MDA_FDOPEN)/g' \
+ -e 's/@''GNULIB_MDA_FILENO''@/$(GL_GNULIB_MDA_FILENO)/g' \
+ -e 's/@''GNULIB_MDA_GETW''@/$(GL_GNULIB_MDA_GETW)/g' \
+ -e 's/@''GNULIB_MDA_PUTW''@/$(GL_GNULIB_MDA_PUTW)/g' \
+ -e 's/@''GNULIB_MDA_TEMPNAM''@/$(GL_GNULIB_MDA_TEMPNAM)/g' \
+ < $(top_srcdir)/lib/stdio.in.h | \
+ sed -e 's|@''HAVE_DECL_FCLOSEALL''@|$(HAVE_DECL_FCLOSEALL)|g' \
+ -e 's|@''HAVE_DECL_FPURGE''@|$(HAVE_DECL_FPURGE)|g' \
+ -e 's|@''HAVE_DECL_FSEEKO''@|$(HAVE_DECL_FSEEKO)|g' \
+ -e 's|@''HAVE_DECL_FTELLO''@|$(HAVE_DECL_FTELLO)|g' \
+ -e 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \
+ -e 's|@''HAVE_DECL_GETLINE''@|$(HAVE_DECL_GETLINE)|g' \
+ -e 's|@''HAVE_DECL_GETW''@|$(HAVE_DECL_GETW)|g' \
+ -e 's|@''HAVE_DECL_OBSTACK_PRINTF''@|$(HAVE_DECL_OBSTACK_PRINTF)|g' \
+ -e 's|@''HAVE_DECL_PUTW''@|$(HAVE_DECL_PUTW)|g' \
+ -e 's|@''HAVE_DECL_SNPRINTF''@|$(HAVE_DECL_SNPRINTF)|g' \
+ -e 's|@''HAVE_DECL_VSNPRINTF''@|$(HAVE_DECL_VSNPRINTF)|g' \
+ -e 's|@''HAVE_DPRINTF''@|$(HAVE_DPRINTF)|g' \
+ -e 's|@''HAVE_FSEEKO''@|$(HAVE_FSEEKO)|g' \
+ -e 's|@''HAVE_FTELLO''@|$(HAVE_FTELLO)|g' \
+ -e 's|@''HAVE_PCLOSE''@|$(HAVE_PCLOSE)|g' \
+ -e 's|@''HAVE_POPEN''@|$(HAVE_POPEN)|g' \
+ -e 's|@''HAVE_RENAMEAT''@|$(HAVE_RENAMEAT)|g' \
+ -e 's|@''HAVE_VASPRINTF''@|$(HAVE_VASPRINTF)|g' \
+ -e 's|@''HAVE_VDPRINTF''@|$(HAVE_VDPRINTF)|g' \
+ -e 's|@''REPLACE_DPRINTF''@|$(REPLACE_DPRINTF)|g' \
+ -e 's|@''REPLACE_FCLOSE''@|$(REPLACE_FCLOSE)|g' \
+ -e 's|@''REPLACE_FDOPEN''@|$(REPLACE_FDOPEN)|g' \
+ -e 's|@''REPLACE_FFLUSH''@|$(REPLACE_FFLUSH)|g' \
+ -e 's|@''REPLACE_FOPEN''@|$(REPLACE_FOPEN)|g' \
+ -e 's|@''REPLACE_FOPEN_FOR_FOPEN_GNU''@|$(REPLACE_FOPEN_FOR_FOPEN_GNU)|g' \
+ -e 's|@''REPLACE_FPRINTF''@|$(REPLACE_FPRINTF)|g' \
+ -e 's|@''REPLACE_FPURGE''@|$(REPLACE_FPURGE)|g' \
+ -e 's|@''REPLACE_FREOPEN''@|$(REPLACE_FREOPEN)|g' \
+ -e 's|@''REPLACE_FSEEK''@|$(REPLACE_FSEEK)|g' \
+ -e 's|@''REPLACE_FSEEKO''@|$(REPLACE_FSEEKO)|g' \
+ -e 's|@''REPLACE_FTELL''@|$(REPLACE_FTELL)|g' \
+ -e 's|@''REPLACE_FTELLO''@|$(REPLACE_FTELLO)|g' \
+ -e 's|@''REPLACE_GETDELIM''@|$(REPLACE_GETDELIM)|g' \
+ -e 's|@''REPLACE_GETLINE''@|$(REPLACE_GETLINE)|g' \
+ -e 's|@''REPLACE_OBSTACK_PRINTF''@|$(REPLACE_OBSTACK_PRINTF)|g' \
+ -e 's|@''REPLACE_PERROR''@|$(REPLACE_PERROR)|g' \
+ -e 's|@''REPLACE_POPEN''@|$(REPLACE_POPEN)|g' \
+ -e 's|@''REPLACE_PRINTF''@|$(REPLACE_PRINTF)|g' \
+ -e 's|@''REPLACE_REMOVE''@|$(REPLACE_REMOVE)|g' \
+ -e 's|@''REPLACE_RENAME''@|$(REPLACE_RENAME)|g' \
+ -e 's|@''REPLACE_RENAMEAT''@|$(REPLACE_RENAMEAT)|g' \
+ -e 's|@''REPLACE_SNPRINTF''@|$(REPLACE_SNPRINTF)|g' \
+ -e 's|@''REPLACE_SPRINTF''@|$(REPLACE_SPRINTF)|g' \
+ -e 's|@''REPLACE_STDIO_READ_FUNCS''@|$(REPLACE_STDIO_READ_FUNCS)|g' \
+ -e 's|@''REPLACE_STDIO_WRITE_FUNCS''@|$(REPLACE_STDIO_WRITE_FUNCS)|g' \
+ -e 's|@''REPLACE_TMPFILE''@|$(REPLACE_TMPFILE)|g' \
+ -e 's|@''REPLACE_VASPRINTF''@|$(REPLACE_VASPRINTF)|g' \
+ -e 's|@''REPLACE_VDPRINTF''@|$(REPLACE_VDPRINTF)|g' \
+ -e 's|@''REPLACE_VFPRINTF''@|$(REPLACE_VFPRINTF)|g' \
+ -e 's|@''REPLACE_VPRINTF''@|$(REPLACE_VPRINTF)|g' \
+ -e 's|@''REPLACE_VSNPRINTF''@|$(REPLACE_VSNPRINTF)|g' \
+ -e 's|@''REPLACE_VSPRINTF''@|$(REPLACE_VSPRINTF)|g' \
+ -e 's|@''ASM_SYMBOL_PREFIX''@|$(ASM_SYMBOL_PREFIX)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ > $@-t
+ $(AM_V_at)mv $@-t $@
+MOSTLYCLEANFILES += lib/stdio.h lib/stdio.h-t
+
+if GL_COND_OBJ_STDIO_READ
+lib_libgnu_a_SOURCES += lib/stdio-read.c
+endif
+if GL_COND_OBJ_STDIO_WRITE
+lib_libgnu_a_SOURCES += lib/stdio-write.c
+endif
+
+EXTRA_DIST += lib/stdio.in.h
+
+## end gnulib module stdio
+
+## begin gnulib module stdlib
+
+BUILT_SOURCES += lib/stdlib.h
+
+# We need the following in order to create <stdlib.h> when the system
+# doesn't have one that works with the given compiler.
+lib/stdlib.h: lib/stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \
+ $(_NORETURN_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)$(MKDIR_P) '%reldir%'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \
+ -e 's/@''GNULIB__EXIT''@/$(GL_GNULIB__EXIT)/g' \
+ -e 's/@''GNULIB_ALIGNED_ALLOC''@/$(GL_GNULIB_ALIGNED_ALLOC)/g' \
+ -e 's/@''GNULIB_ATOLL''@/$(GL_GNULIB_ATOLL)/g' \
+ -e 's/@''GNULIB_CALLOC_GNU''@/$(GL_GNULIB_CALLOC_GNU)/g' \
+ -e 's/@''GNULIB_CALLOC_POSIX''@/$(GL_GNULIB_CALLOC_POSIX)/g' \
+ -e 's/@''GNULIB_CANONICALIZE_FILE_NAME''@/$(GL_GNULIB_CANONICALIZE_FILE_NAME)/g' \
+ -e 's/@''GNULIB_FREE_POSIX''@/$(GL_GNULIB_FREE_POSIX)/g' \
+ -e 's/@''GNULIB_GETLOADAVG''@/$(GL_GNULIB_GETLOADAVG)/g' \
+ -e 's/@''GNULIB_GETPROGNAME''@/$(GL_GNULIB_GETPROGNAME)/g' \
+ -e 's/@''GNULIB_GETSUBOPT''@/$(GL_GNULIB_GETSUBOPT)/g' \
+ -e 's/@''GNULIB_GRANTPT''@/$(GL_GNULIB_GRANTPT)/g' \
+ -e 's/@''GNULIB_MALLOC_GNU''@/$(GL_GNULIB_MALLOC_GNU)/g' \
+ -e 's/@''GNULIB_MALLOC_POSIX''@/$(GL_GNULIB_MALLOC_POSIX)/g' \
+ -e 's/@''GNULIB_MBTOWC''@/$(GL_GNULIB_MBTOWC)/g' \
+ -e 's/@''GNULIB_MKDTEMP''@/$(GL_GNULIB_MKDTEMP)/g' \
+ -e 's/@''GNULIB_MKOSTEMP''@/$(GL_GNULIB_MKOSTEMP)/g' \
+ -e 's/@''GNULIB_MKOSTEMPS''@/$(GL_GNULIB_MKOSTEMPS)/g' \
+ -e 's/@''GNULIB_MKSTEMP''@/$(GL_GNULIB_MKSTEMP)/g' \
+ -e 's/@''GNULIB_MKSTEMPS''@/$(GL_GNULIB_MKSTEMPS)/g' \
+ -e 's/@''GNULIB_POSIX_MEMALIGN''@/$(GL_GNULIB_POSIX_MEMALIGN)/g' \
+ -e 's/@''GNULIB_POSIX_OPENPT''@/$(GL_GNULIB_POSIX_OPENPT)/g' \
+ -e 's/@''GNULIB_PTSNAME''@/$(GL_GNULIB_PTSNAME)/g' \
+ -e 's/@''GNULIB_PTSNAME_R''@/$(GL_GNULIB_PTSNAME_R)/g' \
+ -e 's/@''GNULIB_PUTENV''@/$(GL_GNULIB_PUTENV)/g' \
+ -e 's/@''GNULIB_QSORT_R''@/$(GL_GNULIB_QSORT_R)/g' \
+ -e 's/@''GNULIB_RANDOM''@/$(GL_GNULIB_RANDOM)/g' \
+ -e 's/@''GNULIB_RANDOM_R''@/$(GL_GNULIB_RANDOM_R)/g' \
+ -e 's/@''GNULIB_REALLOC_GNU''@/$(GL_GNULIB_REALLOC_GNU)/g' \
+ -e 's/@''GNULIB_REALLOC_POSIX''@/$(GL_GNULIB_REALLOC_POSIX)/g' \
+ -e 's/@''GNULIB_REALLOCARRAY''@/$(GL_GNULIB_REALLOCARRAY)/g' \
+ -e 's/@''GNULIB_REALPATH''@/$(GL_GNULIB_REALPATH)/g' \
+ -e 's/@''GNULIB_RPMATCH''@/$(GL_GNULIB_RPMATCH)/g' \
+ -e 's/@''GNULIB_SECURE_GETENV''@/$(GL_GNULIB_SECURE_GETENV)/g' \
+ -e 's/@''GNULIB_SETENV''@/$(GL_GNULIB_SETENV)/g' \
+ -e 's/@''GNULIB_STRTOD''@/$(GL_GNULIB_STRTOD)/g' \
+ -e 's/@''GNULIB_STRTOL''@/$(GL_GNULIB_STRTOL)/g' \
+ -e 's/@''GNULIB_STRTOLD''@/$(GL_GNULIB_STRTOLD)/g' \
+ -e 's/@''GNULIB_STRTOLL''@/$(GL_GNULIB_STRTOLL)/g' \
+ -e 's/@''GNULIB_STRTOUL''@/$(GL_GNULIB_STRTOUL)/g' \
+ -e 's/@''GNULIB_STRTOULL''@/$(GL_GNULIB_STRTOULL)/g' \
+ -e 's/@''GNULIB_SYSTEM_POSIX''@/$(GL_GNULIB_SYSTEM_POSIX)/g' \
+ -e 's/@''GNULIB_UNLOCKPT''@/$(GL_GNULIB_UNLOCKPT)/g' \
+ -e 's/@''GNULIB_UNSETENV''@/$(GL_GNULIB_UNSETENV)/g' \
+ -e 's/@''GNULIB_WCTOMB''@/$(GL_GNULIB_WCTOMB)/g' \
+ -e 's/@''GNULIB_MDA_ECVT''@/$(GL_GNULIB_MDA_ECVT)/g' \
+ -e 's/@''GNULIB_MDA_FCVT''@/$(GL_GNULIB_MDA_FCVT)/g' \
+ -e 's/@''GNULIB_MDA_GCVT''@/$(GL_GNULIB_MDA_GCVT)/g' \
+ -e 's/@''GNULIB_MDA_MKTEMP''@/$(GL_GNULIB_MDA_MKTEMP)/g' \
+ -e 's/@''GNULIB_MDA_PUTENV''@/$(GL_GNULIB_MDA_PUTENV)/g' \
+ < $(top_srcdir)/lib/stdlib.in.h | \
+ sed -e 's|@''HAVE__EXIT''@|$(HAVE__EXIT)|g' \
+ -e 's|@''HAVE_ALIGNED_ALLOC''@|$(HAVE_ALIGNED_ALLOC)|g' \
+ -e 's|@''HAVE_ATOLL''@|$(HAVE_ATOLL)|g' \
+ -e 's|@''HAVE_CANONICALIZE_FILE_NAME''@|$(HAVE_CANONICALIZE_FILE_NAME)|g' \
+ -e 's|@''HAVE_DECL_ECVT''@|$(HAVE_DECL_ECVT)|g' \
+ -e 's|@''HAVE_DECL_FCVT''@|$(HAVE_DECL_FCVT)|g' \
+ -e 's|@''HAVE_DECL_GCVT''@|$(HAVE_DECL_GCVT)|g' \
+ -e 's|@''HAVE_DECL_GETLOADAVG''@|$(HAVE_DECL_GETLOADAVG)|g' \
+ -e 's|@''HAVE_GETPROGNAME''@|$(HAVE_GETPROGNAME)|g' \
+ -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \
+ -e 's|@''HAVE_GRANTPT''@|$(HAVE_GRANTPT)|g' \
+ -e 's|@''HAVE_INITSTATE''@|$(HAVE_INITSTATE)|g' \
+ -e 's|@''HAVE_DECL_INITSTATE''@|$(HAVE_DECL_INITSTATE)|g' \
+ -e 's|@''HAVE_MBTOWC''@|$(HAVE_MBTOWC)|g' \
+ -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \
+ -e 's|@''HAVE_MKOSTEMP''@|$(HAVE_MKOSTEMP)|g' \
+ -e 's|@''HAVE_MKOSTEMPS''@|$(HAVE_MKOSTEMPS)|g' \
+ -e 's|@''HAVE_MKSTEMP''@|$(HAVE_MKSTEMP)|g' \
+ -e 's|@''HAVE_MKSTEMPS''@|$(HAVE_MKSTEMPS)|g' \
+ -e 's|@''HAVE_POSIX_MEMALIGN''@|$(HAVE_POSIX_MEMALIGN)|g' \
+ -e 's|@''HAVE_POSIX_OPENPT''@|$(HAVE_POSIX_OPENPT)|g' \
+ -e 's|@''HAVE_PTSNAME''@|$(HAVE_PTSNAME)|g' \
+ -e 's|@''HAVE_PTSNAME_R''@|$(HAVE_PTSNAME_R)|g' \
+ -e 's|@''HAVE_QSORT_R''@|$(HAVE_QSORT_R)|g' \
+ -e 's|@''HAVE_RANDOM''@|$(HAVE_RANDOM)|g' \
+ -e 's|@''HAVE_RANDOM_H''@|$(HAVE_RANDOM_H)|g' \
+ -e 's|@''HAVE_RANDOM_R''@|$(HAVE_RANDOM_R)|g' \
+ -e 's|@''HAVE_REALLOCARRAY''@|$(HAVE_REALLOCARRAY)|g' \
+ -e 's|@''HAVE_REALPATH''@|$(HAVE_REALPATH)|g' \
+ -e 's|@''HAVE_RPMATCH''@|$(HAVE_RPMATCH)|g' \
+ -e 's|@''HAVE_SECURE_GETENV''@|$(HAVE_SECURE_GETENV)|g' \
+ -e 's|@''HAVE_DECL_SETENV''@|$(HAVE_DECL_SETENV)|g' \
+ -e 's|@''HAVE_SETSTATE''@|$(HAVE_SETSTATE)|g' \
+ -e 's|@''HAVE_DECL_SETSTATE''@|$(HAVE_DECL_SETSTATE)|g' \
+ -e 's|@''HAVE_STRTOD''@|$(HAVE_STRTOD)|g' \
+ -e 's|@''HAVE_STRTOL''@|$(HAVE_STRTOL)|g' \
+ -e 's|@''HAVE_STRTOLD''@|$(HAVE_STRTOLD)|g' \
+ -e 's|@''HAVE_STRTOLL''@|$(HAVE_STRTOLL)|g' \
+ -e 's|@''HAVE_STRTOUL''@|$(HAVE_STRTOUL)|g' \
+ -e 's|@''HAVE_STRTOULL''@|$(HAVE_STRTOULL)|g' \
+ -e 's|@''HAVE_STRUCT_RANDOM_DATA''@|$(HAVE_STRUCT_RANDOM_DATA)|g' \
+ -e 's|@''HAVE_SYS_LOADAVG_H''@|$(HAVE_SYS_LOADAVG_H)|g' \
+ -e 's|@''HAVE_UNLOCKPT''@|$(HAVE_UNLOCKPT)|g' \
+ -e 's|@''HAVE_DECL_UNSETENV''@|$(HAVE_DECL_UNSETENV)|g' \
+ -e 's|@''REPLACE__EXIT''@|$(REPLACE__EXIT)|g' \
+ -e 's|@''REPLACE_ALIGNED_ALLOC''@|$(REPLACE_ALIGNED_ALLOC)|g' \
+ -e 's|@''REPLACE_CALLOC_FOR_CALLOC_GNU''@|$(REPLACE_CALLOC_FOR_CALLOC_GNU)|g' \
+ -e 's|@''REPLACE_CALLOC_FOR_CALLOC_POSIX''@|$(REPLACE_CALLOC_FOR_CALLOC_POSIX)|g' \
+ -e 's|@''REPLACE_CANONICALIZE_FILE_NAME''@|$(REPLACE_CANONICALIZE_FILE_NAME)|g' \
+ -e 's|@''REPLACE_FREE''@|$(REPLACE_FREE)|g' \
+ -e 's|@''REPLACE_GETLOADAVG''@|$(REPLACE_GETLOADAVG)|g' \
+ -e 's|@''REPLACE_GETPROGNAME''@|$(REPLACE_GETPROGNAME)|g' \
+ -e 's|@''REPLACE_GETSUBOPT''@|$(REPLACE_GETSUBOPT)|g' \
+ -e 's|@''REPLACE_INITSTATE''@|$(REPLACE_INITSTATE)|g' \
+ -e 's|@''REPLACE_MALLOC_FOR_MALLOC_GNU''@|$(REPLACE_MALLOC_FOR_MALLOC_GNU)|g' \
+ -e 's|@''REPLACE_MALLOC_FOR_MALLOC_POSIX''@|$(REPLACE_MALLOC_FOR_MALLOC_POSIX)|g' \
+ -e 's|@''REPLACE_MBTOWC''@|$(REPLACE_MBTOWC)|g' \
+ -e 's|@''REPLACE_MKOSTEMP''@|$(REPLACE_MKOSTEMP)|g' \
+ -e 's|@''REPLACE_MKOSTEMPS''@|$(REPLACE_MKOSTEMPS)|g' \
+ -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \
+ -e 's|@''REPLACE_POSIX_MEMALIGN''@|$(REPLACE_POSIX_MEMALIGN)|g' \
+ -e 's|@''REPLACE_POSIX_OPENPT''@|$(REPLACE_POSIX_OPENPT)|g' \
+ -e 's|@''REPLACE_PTSNAME''@|$(REPLACE_PTSNAME)|g' \
+ -e 's|@''REPLACE_PTSNAME_R''@|$(REPLACE_PTSNAME_R)|g' \
+ -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \
+ -e 's|@''REPLACE_QSORT_R''@|$(REPLACE_QSORT_R)|g' \
+ -e 's|@''REPLACE_RANDOM''@|$(REPLACE_RANDOM)|g' \
+ -e 's|@''REPLACE_RANDOM_R''@|$(REPLACE_RANDOM_R)|g' \
+ -e 's|@''REPLACE_REALLOC_FOR_REALLOC_GNU''@|$(REPLACE_REALLOC_FOR_REALLOC_GNU)|g' \
+ -e 's|@''REPLACE_REALLOC_FOR_REALLOC_POSIX''@|$(REPLACE_REALLOC_FOR_REALLOC_POSIX)|g' \
+ -e 's|@''REPLACE_REALLOCARRAY''@|$(REPLACE_REALLOCARRAY)|g' \
+ -e 's|@''REPLACE_REALPATH''@|$(REPLACE_REALPATH)|g' \
+ -e 's|@''REPLACE_SETENV''@|$(REPLACE_SETENV)|g' \
+ -e 's|@''REPLACE_SETSTATE''@|$(REPLACE_SETSTATE)|g' \
+ -e 's|@''REPLACE_STRTOD''@|$(REPLACE_STRTOD)|g' \
+ -e 's|@''REPLACE_STRTOL''@|$(REPLACE_STRTOL)|g' \
+ -e 's|@''REPLACE_STRTOLD''@|$(REPLACE_STRTOLD)|g' \
+ -e 's|@''REPLACE_STRTOLL''@|$(REPLACE_STRTOLL)|g' \
+ -e 's|@''REPLACE_STRTOUL''@|$(REPLACE_STRTOUL)|g' \
+ -e 's|@''REPLACE_STRTOULL''@|$(REPLACE_STRTOULL)|g' \
+ -e 's|@''REPLACE_UNSETENV''@|$(REPLACE_UNSETENV)|g' \
+ -e 's|@''REPLACE_WCTOMB''@|$(REPLACE_WCTOMB)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _Noreturn/r $(_NORETURN_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ > $@-t
+ $(AM_V_at)mv $@-t $@
+MOSTLYCLEANFILES += lib/stdlib.h lib/stdlib.h-t
+
+EXTRA_DIST += lib/stdlib.in.h
+
+## end gnulib module stdlib
+
+## begin gnulib module streq
+
+
+EXTRA_DIST += lib/streq.h
+
+## end gnulib module streq
+
+## begin gnulib module string
+
+BUILT_SOURCES += lib/string.h
+
+# We need the following in order to create <string.h> when the system
+# doesn't have one that works with the given compiler.
+lib/string.h: lib/string.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)$(MKDIR_P) '%reldir%'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_STRING_H''@|$(NEXT_STRING_H)|g' \
+ -e 's/@''GNULIB_EXPLICIT_BZERO''@/$(GL_GNULIB_EXPLICIT_BZERO)/g' \
+ -e 's/@''GNULIB_FFSL''@/$(GL_GNULIB_FFSL)/g' \
+ -e 's/@''GNULIB_FFSLL''@/$(GL_GNULIB_FFSLL)/g' \
+ -e 's/@''GNULIB_MBSLEN''@/$(GL_GNULIB_MBSLEN)/g' \
+ -e 's/@''GNULIB_MBSNLEN''@/$(GL_GNULIB_MBSNLEN)/g' \
+ -e 's/@''GNULIB_MBSCHR''@/$(GL_GNULIB_MBSCHR)/g' \
+ -e 's/@''GNULIB_MBSRCHR''@/$(GL_GNULIB_MBSRCHR)/g' \
+ -e 's/@''GNULIB_MBSSTR''@/$(GL_GNULIB_MBSSTR)/g' \
+ -e 's/@''GNULIB_MBSCASECMP''@/$(GL_GNULIB_MBSCASECMP)/g' \
+ -e 's/@''GNULIB_MBSNCASECMP''@/$(GL_GNULIB_MBSNCASECMP)/g' \
+ -e 's/@''GNULIB_MBSPCASECMP''@/$(GL_GNULIB_MBSPCASECMP)/g' \
+ -e 's/@''GNULIB_MBSCASESTR''@/$(GL_GNULIB_MBSCASESTR)/g' \
+ -e 's/@''GNULIB_MBSCSPN''@/$(GL_GNULIB_MBSCSPN)/g' \
+ -e 's/@''GNULIB_MBSPBRK''@/$(GL_GNULIB_MBSPBRK)/g' \
+ -e 's/@''GNULIB_MBSSPN''@/$(GL_GNULIB_MBSSPN)/g' \
+ -e 's/@''GNULIB_MBSSEP''@/$(GL_GNULIB_MBSSEP)/g' \
+ -e 's/@''GNULIB_MBSTOK_R''@/$(GL_GNULIB_MBSTOK_R)/g' \
+ -e 's/@''GNULIB_MEMCHR''@/$(GL_GNULIB_MEMCHR)/g' \
+ -e 's/@''GNULIB_MEMMEM''@/$(GL_GNULIB_MEMMEM)/g' \
+ -e 's/@''GNULIB_MEMPCPY''@/$(GL_GNULIB_MEMPCPY)/g' \
+ -e 's/@''GNULIB_MEMRCHR''@/$(GL_GNULIB_MEMRCHR)/g' \
+ -e 's/@''GNULIB_MEMSET_EXPLICIT''@/$(GL_GNULIB_MEMSET_EXPLICIT)/g' \
+ -e 's/@''GNULIB_RAWMEMCHR''@/$(GL_GNULIB_RAWMEMCHR)/g' \
+ -e 's/@''GNULIB_STPCPY''@/$(GL_GNULIB_STPCPY)/g' \
+ -e 's/@''GNULIB_STPNCPY''@/$(GL_GNULIB_STPNCPY)/g' \
+ -e 's/@''GNULIB_STRCHRNUL''@/$(GL_GNULIB_STRCHRNUL)/g' \
+ -e 's/@''GNULIB_STRDUP''@/$(GL_GNULIB_STRDUP)/g' \
+ -e 's/@''GNULIB_STRNCAT''@/$(GL_GNULIB_STRNCAT)/g' \
+ -e 's/@''GNULIB_STRNDUP''@/$(GL_GNULIB_STRNDUP)/g' \
+ -e 's/@''GNULIB_STRNLEN''@/$(GL_GNULIB_STRNLEN)/g' \
+ -e 's/@''GNULIB_STRPBRK''@/$(GL_GNULIB_STRPBRK)/g' \
+ -e 's/@''GNULIB_STRSEP''@/$(GL_GNULIB_STRSEP)/g' \
+ -e 's/@''GNULIB_STRSTR''@/$(GL_GNULIB_STRSTR)/g' \
+ -e 's/@''GNULIB_STRCASESTR''@/$(GL_GNULIB_STRCASESTR)/g' \
+ -e 's/@''GNULIB_STRTOK_R''@/$(GL_GNULIB_STRTOK_R)/g' \
+ -e 's/@''GNULIB_STRERROR''@/$(GL_GNULIB_STRERROR)/g' \
+ -e 's/@''GNULIB_STRERROR_R''@/$(GL_GNULIB_STRERROR_R)/g' \
+ -e 's/@''GNULIB_STRERRORNAME_NP''@/$(GL_GNULIB_STRERRORNAME_NP)/g' \
+ -e 's/@''GNULIB_SIGABBREV_NP''@/$(GL_GNULIB_SIGABBREV_NP)/g' \
+ -e 's/@''GNULIB_SIGDESCR_NP''@/$(GL_GNULIB_SIGDESCR_NP)/g' \
+ -e 's/@''GNULIB_STRSIGNAL''@/$(GL_GNULIB_STRSIGNAL)/g' \
+ -e 's/@''GNULIB_STRVERSCMP''@/$(GL_GNULIB_STRVERSCMP)/g' \
+ -e 's/@''GNULIB_MDA_MEMCCPY''@/$(GL_GNULIB_MDA_MEMCCPY)/g' \
+ -e 's/@''GNULIB_MDA_STRDUP''@/$(GL_GNULIB_MDA_STRDUP)/g' \
+ -e 's/@''GNULIB_FREE_POSIX''@/$(GL_GNULIB_FREE_POSIX)/g' \
+ < $(top_srcdir)/lib/string.in.h | \
+ sed -e 's|@''HAVE_EXPLICIT_BZERO''@|$(HAVE_EXPLICIT_BZERO)|g' \
+ -e 's|@''HAVE_FFSL''@|$(HAVE_FFSL)|g' \
+ -e 's|@''HAVE_FFSLL''@|$(HAVE_FFSLL)|g' \
+ -e 's|@''HAVE_MBSLEN''@|$(HAVE_MBSLEN)|g' \
+ -e 's|@''HAVE_DECL_MEMMEM''@|$(HAVE_DECL_MEMMEM)|g' \
+ -e 's|@''HAVE_MEMPCPY''@|$(HAVE_MEMPCPY)|g' \
+ -e 's|@''HAVE_DECL_MEMRCHR''@|$(HAVE_DECL_MEMRCHR)|g' \
+ -e 's|@''HAVE_MEMSET_EXPLICIT''@|$(HAVE_MEMSET_EXPLICIT)|g' \
+ -e 's|@''HAVE_RAWMEMCHR''@|$(HAVE_RAWMEMCHR)|g' \
+ -e 's|@''HAVE_STPCPY''@|$(HAVE_STPCPY)|g' \
+ -e 's|@''HAVE_STPNCPY''@|$(HAVE_STPNCPY)|g' \
+ -e 's|@''HAVE_STRCHRNUL''@|$(HAVE_STRCHRNUL)|g' \
+ -e 's|@''HAVE_DECL_STRDUP''@|$(HAVE_DECL_STRDUP)|g' \
+ -e 's|@''HAVE_DECL_STRNDUP''@|$(HAVE_DECL_STRNDUP)|g' \
+ -e 's|@''HAVE_DECL_STRNLEN''@|$(HAVE_DECL_STRNLEN)|g' \
+ -e 's|@''HAVE_STRPBRK''@|$(HAVE_STRPBRK)|g' \
+ -e 's|@''HAVE_STRSEP''@|$(HAVE_STRSEP)|g' \
+ -e 's|@''HAVE_STRCASESTR''@|$(HAVE_STRCASESTR)|g' \
+ -e 's|@''HAVE_DECL_STRTOK_R''@|$(HAVE_DECL_STRTOK_R)|g' \
+ -e 's|@''HAVE_DECL_STRERROR_R''@|$(HAVE_DECL_STRERROR_R)|g' \
+ -e 's|@''HAVE_STRERRORNAME_NP''@|$(HAVE_STRERRORNAME_NP)|g' \
+ -e 's|@''HAVE_SIGABBREV_NP''@|$(HAVE_SIGABBREV_NP)|g' \
+ -e 's|@''HAVE_SIGDESCR_NP''@|$(HAVE_SIGDESCR_NP)|g' \
+ -e 's|@''HAVE_DECL_STRSIGNAL''@|$(HAVE_DECL_STRSIGNAL)|g' \
+ -e 's|@''HAVE_STRVERSCMP''@|$(HAVE_STRVERSCMP)|g' \
+ -e 's|@''REPLACE_FFSLL''@|$(REPLACE_FFSLL)|g' \
+ -e 's|@''REPLACE_MEMCHR''@|$(REPLACE_MEMCHR)|g' \
+ -e 's|@''REPLACE_MEMMEM''@|$(REPLACE_MEMMEM)|g' \
+ -e 's|@''REPLACE_MEMPCPY''@|$(REPLACE_MEMPCPY)|g' \
+ -e 's|@''REPLACE_FREE''@|$(REPLACE_FREE)|g' \
+ -e 's|@''REPLACE_STPCPY''@|$(REPLACE_STPCPY)|g' \
+ -e 's|@''REPLACE_STPNCPY''@|$(REPLACE_STPNCPY)|g' \
+ -e 's|@''REPLACE_STRCHRNUL''@|$(REPLACE_STRCHRNUL)|g' \
+ -e 's|@''REPLACE_STRDUP''@|$(REPLACE_STRDUP)|g' \
+ -e 's|@''REPLACE_STRNCAT''@|$(REPLACE_STRNCAT)|g' \
+ -e 's|@''REPLACE_STRNDUP''@|$(REPLACE_STRNDUP)|g' \
+ -e 's|@''REPLACE_STRNLEN''@|$(REPLACE_STRNLEN)|g' \
+ -e 's|@''REPLACE_STRSTR''@|$(REPLACE_STRSTR)|g' \
+ -e 's|@''REPLACE_STRCASESTR''@|$(REPLACE_STRCASESTR)|g' \
+ -e 's|@''REPLACE_STRTOK_R''@|$(REPLACE_STRTOK_R)|g' \
+ -e 's|@''REPLACE_STRERROR''@|$(REPLACE_STRERROR)|g' \
+ -e 's|@''REPLACE_STRERROR_R''@|$(REPLACE_STRERROR_R)|g' \
+ -e 's|@''REPLACE_STRERRORNAME_NP''@|$(REPLACE_STRERRORNAME_NP)|g' \
+ -e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \
+ -e 's|@''UNDEFINE_STRTOK_R''@|$(UNDEFINE_STRTOK_R)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ > $@-t
+ $(AM_V_at)mv $@-t $@
+MOSTLYCLEANFILES += lib/string.h lib/string.h-t
+
+EXTRA_DIST += lib/string.in.h
+
+## end gnulib module string
+
+## begin gnulib module sys_types
+
+BUILT_SOURCES += lib/sys/types.h
+
+# We need the following in order to create <sys/types.h> when the system
+# doesn't have one that works with the given compiler.
+lib/sys/types.h: lib/sys_types.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)$(MKDIR_P) '%reldir%/sys'
+ $(AM_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_TYPES_H''@|$(NEXT_SYS_TYPES_H)|g' \
+ -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \
+ -e 's|@''WINDOWS_STAT_INODES''@|$(WINDOWS_STAT_INODES)|g' \
+ $(top_srcdir)/lib/sys_types.in.h > $@-t
+ $(AM_V_at)mv $@-t $@
+MOSTLYCLEANFILES += lib/sys/types.h lib/sys/types.h-t
+
+EXTRA_DIST += lib/sys_types.in.h
+
+## end gnulib module sys_types
+
+## begin gnulib module unistd
+
+BUILT_SOURCES += lib/unistd.h
+lib_libgnu_a_SOURCES += lib/unistd.c
+
+# We need the following in order to create an empty placeholder for
+# <unistd.h> when the system doesn't have one.
+lib/unistd.h: lib/unistd.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)$(MKDIR_P) '%reldir%'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''HAVE_UNISTD_H''@|$(HAVE_UNISTD_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_UNISTD_H''@|$(NEXT_UNISTD_H)|g' \
+ -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \
+ -e 's/@''GNULIB_ACCESS''@/$(GL_GNULIB_ACCESS)/g' \
+ -e 's/@''GNULIB_CHDIR''@/$(GL_GNULIB_CHDIR)/g' \
+ -e 's/@''GNULIB_CHOWN''@/$(GL_GNULIB_CHOWN)/g' \
+ -e 's/@''GNULIB_CLOSE''@/$(GL_GNULIB_CLOSE)/g' \
+ -e 's/@''GNULIB_COPY_FILE_RANGE''@/$(GL_GNULIB_COPY_FILE_RANGE)/g' \
+ -e 's/@''GNULIB_DUP''@/$(GL_GNULIB_DUP)/g' \
+ -e 's/@''GNULIB_DUP2''@/$(GL_GNULIB_DUP2)/g' \
+ -e 's/@''GNULIB_DUP3''@/$(GL_GNULIB_DUP3)/g' \
+ -e 's/@''GNULIB_ENVIRON''@/$(GL_GNULIB_ENVIRON)/g' \
+ -e 's/@''GNULIB_EUIDACCESS''@/$(GL_GNULIB_EUIDACCESS)/g' \
+ -e 's/@''GNULIB_EXECL''@/$(GL_GNULIB_EXECL)/g' \
+ -e 's/@''GNULIB_EXECLE''@/$(GL_GNULIB_EXECLE)/g' \
+ -e 's/@''GNULIB_EXECLP''@/$(GL_GNULIB_EXECLP)/g' \
+ -e 's/@''GNULIB_EXECV''@/$(GL_GNULIB_EXECV)/g' \
+ -e 's/@''GNULIB_EXECVE''@/$(GL_GNULIB_EXECVE)/g' \
+ -e 's/@''GNULIB_EXECVP''@/$(GL_GNULIB_EXECVP)/g' \
+ -e 's/@''GNULIB_EXECVPE''@/$(GL_GNULIB_EXECVPE)/g' \
+ -e 's/@''GNULIB_FACCESSAT''@/$(GL_GNULIB_FACCESSAT)/g' \
+ -e 's/@''GNULIB_FCHDIR''@/$(GL_GNULIB_FCHDIR)/g' \
+ -e 's/@''GNULIB_FCHOWNAT''@/$(GL_GNULIB_FCHOWNAT)/g' \
+ -e 's/@''GNULIB_FDATASYNC''@/$(GL_GNULIB_FDATASYNC)/g' \
+ -e 's/@''GNULIB_FSYNC''@/$(GL_GNULIB_FSYNC)/g' \
+ -e 's/@''GNULIB_FTRUNCATE''@/$(GL_GNULIB_FTRUNCATE)/g' \
+ -e 's/@''GNULIB_GETCWD''@/$(GL_GNULIB_GETCWD)/g' \
+ -e 's/@''GNULIB_GETDOMAINNAME''@/$(GL_GNULIB_GETDOMAINNAME)/g' \
+ -e 's/@''GNULIB_GETDTABLESIZE''@/$(GL_GNULIB_GETDTABLESIZE)/g' \
+ -e 's/@''GNULIB_GETENTROPY''@/$(GL_GNULIB_GETENTROPY)/g' \
+ -e 's/@''GNULIB_GETGROUPS''@/$(GL_GNULIB_GETGROUPS)/g' \
+ -e 's/@''GNULIB_GETHOSTNAME''@/$(GL_GNULIB_GETHOSTNAME)/g' \
+ -e 's/@''GNULIB_GETLOGIN''@/$(GL_GNULIB_GETLOGIN)/g' \
+ -e 's/@''GNULIB_GETLOGIN_R''@/$(GL_GNULIB_GETLOGIN_R)/g' \
+ -e 's/@''GNULIB_GETOPT_POSIX''@/$(GL_GNULIB_GETOPT_POSIX)/g' \
+ -e 's/@''GNULIB_GETPAGESIZE''@/$(GL_GNULIB_GETPAGESIZE)/g' \
+ -e 's/@''GNULIB_GETPASS''@/$(GL_GNULIB_GETPASS)/g' \
+ -e 's/@''GNULIB_GETPASS_GNU''@/$(GL_GNULIB_GETPASS_GNU)/g' \
+ -e 's/@''GNULIB_GETUSERSHELL''@/$(GL_GNULIB_GETUSERSHELL)/g' \
+ -e 's/@''GNULIB_GROUP_MEMBER''@/$(GL_GNULIB_GROUP_MEMBER)/g' \
+ -e 's/@''GNULIB_ISATTY''@/$(GL_GNULIB_ISATTY)/g' \
+ -e 's/@''GNULIB_LCHOWN''@/$(GL_GNULIB_LCHOWN)/g' \
+ -e 's/@''GNULIB_LINK''@/$(GL_GNULIB_LINK)/g' \
+ -e 's/@''GNULIB_LINKAT''@/$(GL_GNULIB_LINKAT)/g' \
+ -e 's/@''GNULIB_LSEEK''@/$(GL_GNULIB_LSEEK)/g' \
+ -e 's/@''GNULIB_PIPE''@/$(GL_GNULIB_PIPE)/g' \
+ -e 's/@''GNULIB_PIPE2''@/$(GL_GNULIB_PIPE2)/g' \
+ -e 's/@''GNULIB_PREAD''@/$(GL_GNULIB_PREAD)/g' \
+ -e 's/@''GNULIB_PWRITE''@/$(GL_GNULIB_PWRITE)/g' \
+ -e 's/@''GNULIB_READ''@/$(GL_GNULIB_READ)/g' \
+ -e 's/@''GNULIB_READLINK''@/$(GL_GNULIB_READLINK)/g' \
+ -e 's/@''GNULIB_READLINKAT''@/$(GL_GNULIB_READLINKAT)/g' \
+ -e 's/@''GNULIB_RMDIR''@/$(GL_GNULIB_RMDIR)/g' \
+ -e 's/@''GNULIB_SETHOSTNAME''@/$(GL_GNULIB_SETHOSTNAME)/g' \
+ -e 's/@''GNULIB_SLEEP''@/$(GL_GNULIB_SLEEP)/g' \
+ -e 's/@''GNULIB_SYMLINK''@/$(GL_GNULIB_SYMLINK)/g' \
+ -e 's/@''GNULIB_SYMLINKAT''@/$(GL_GNULIB_SYMLINKAT)/g' \
+ -e 's/@''GNULIB_TRUNCATE''@/$(GL_GNULIB_TRUNCATE)/g' \
+ -e 's/@''GNULIB_TTYNAME_R''@/$(GL_GNULIB_TTYNAME_R)/g' \
+ -e 's/@''GNULIB_UNISTD_H_GETOPT''@/0$(GL_GNULIB_UNISTD_H_GETOPT)/g' \
+ -e 's/@''GNULIB_UNISTD_H_NONBLOCKING''@/$(GL_GNULIB_UNISTD_H_NONBLOCKING)/g' \
+ -e 's/@''GNULIB_UNISTD_H_SIGPIPE''@/$(GL_GNULIB_UNISTD_H_SIGPIPE)/g' \
+ -e 's/@''GNULIB_UNLINK''@/$(GL_GNULIB_UNLINK)/g' \
+ -e 's/@''GNULIB_UNLINKAT''@/$(GL_GNULIB_UNLINKAT)/g' \
+ -e 's/@''GNULIB_USLEEP''@/$(GL_GNULIB_USLEEP)/g' \
+ -e 's/@''GNULIB_WRITE''@/$(GL_GNULIB_WRITE)/g' \
+ -e 's/@''GNULIB_MDA_ACCESS''@/$(GL_GNULIB_MDA_ACCESS)/g' \
+ -e 's/@''GNULIB_MDA_CHDIR''@/$(GL_GNULIB_MDA_CHDIR)/g' \
+ -e 's/@''GNULIB_MDA_CLOSE''@/$(GL_GNULIB_MDA_CLOSE)/g' \
+ -e 's/@''GNULIB_MDA_DUP''@/$(GL_GNULIB_MDA_DUP)/g' \
+ -e 's/@''GNULIB_MDA_DUP2''@/$(GL_GNULIB_MDA_DUP2)/g' \
+ -e 's/@''GNULIB_MDA_EXECL''@/$(GL_GNULIB_MDA_EXECL)/g' \
+ -e 's/@''GNULIB_MDA_EXECLE''@/$(GL_GNULIB_MDA_EXECLE)/g' \
+ -e 's/@''GNULIB_MDA_EXECLP''@/$(GL_GNULIB_MDA_EXECLP)/g' \
+ -e 's/@''GNULIB_MDA_EXECV''@/$(GL_GNULIB_MDA_EXECV)/g' \
+ -e 's/@''GNULIB_MDA_EXECVE''@/$(GL_GNULIB_MDA_EXECVE)/g' \
+ -e 's/@''GNULIB_MDA_EXECVP''@/$(GL_GNULIB_MDA_EXECVP)/g' \
+ -e 's/@''GNULIB_MDA_EXECVPE''@/$(GL_GNULIB_MDA_EXECVPE)/g' \
+ -e 's/@''GNULIB_MDA_GETCWD''@/$(GL_GNULIB_MDA_GETCWD)/g' \
+ -e 's/@''GNULIB_MDA_GETPID''@/$(GL_GNULIB_MDA_GETPID)/g' \
+ -e 's/@''GNULIB_MDA_ISATTY''@/$(GL_GNULIB_MDA_ISATTY)/g' \
+ -e 's/@''GNULIB_MDA_LSEEK''@/$(GL_GNULIB_MDA_LSEEK)/g' \
+ -e 's/@''GNULIB_MDA_READ''@/$(GL_GNULIB_MDA_READ)/g' \
+ -e 's/@''GNULIB_MDA_RMDIR''@/$(GL_GNULIB_MDA_RMDIR)/g' \
+ -e 's/@''GNULIB_MDA_SWAB''@/$(GL_GNULIB_MDA_SWAB)/g' \
+ -e 's/@''GNULIB_MDA_UNLINK''@/$(GL_GNULIB_MDA_UNLINK)/g' \
+ -e 's/@''GNULIB_MDA_WRITE''@/$(GL_GNULIB_MDA_WRITE)/g' \
+ < $(top_srcdir)/lib/unistd.in.h | \
+ sed -e 's|@''HAVE_CHOWN''@|$(HAVE_CHOWN)|g' \
+ -e 's|@''HAVE_COPY_FILE_RANGE''@|$(HAVE_COPY_FILE_RANGE)|g' \
+ -e 's|@''HAVE_DUP3''@|$(HAVE_DUP3)|g' \
+ -e 's|@''HAVE_EUIDACCESS''@|$(HAVE_EUIDACCESS)|g' \
+ -e 's|@''HAVE_EXECVPE''@|$(HAVE_EXECVPE)|g' \
+ -e 's|@''HAVE_FACCESSAT''@|$(HAVE_FACCESSAT)|g' \
+ -e 's|@''HAVE_FCHDIR''@|$(HAVE_FCHDIR)|g' \
+ -e 's|@''HAVE_FCHOWNAT''@|$(HAVE_FCHOWNAT)|g' \
+ -e 's|@''HAVE_FDATASYNC''@|$(HAVE_FDATASYNC)|g' \
+ -e 's|@''HAVE_FSYNC''@|$(HAVE_FSYNC)|g' \
+ -e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \
+ -e 's|@''HAVE_GETDTABLESIZE''@|$(HAVE_GETDTABLESIZE)|g' \
+ -e 's|@''HAVE_GETENTROPY''@|$(HAVE_GETENTROPY)|g' \
+ -e 's|@''HAVE_GETGROUPS''@|$(HAVE_GETGROUPS)|g' \
+ -e 's|@''HAVE_GETHOSTNAME''@|$(HAVE_GETHOSTNAME)|g' \
+ -e 's|@''HAVE_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \
+ -e 's|@''HAVE_GETPASS''@|$(HAVE_GETPASS)|g' \
+ -e 's|@''HAVE_GROUP_MEMBER''@|$(HAVE_GROUP_MEMBER)|g' \
+ -e 's|@''HAVE_LCHOWN''@|$(HAVE_LCHOWN)|g' \
+ -e 's|@''HAVE_LINK''@|$(HAVE_LINK)|g' \
+ -e 's|@''HAVE_LINKAT''@|$(HAVE_LINKAT)|g' \
+ -e 's|@''HAVE_PIPE''@|$(HAVE_PIPE)|g' \
+ -e 's|@''HAVE_PIPE2''@|$(HAVE_PIPE2)|g' \
+ -e 's|@''HAVE_PREAD''@|$(HAVE_PREAD)|g' \
+ -e 's|@''HAVE_PWRITE''@|$(HAVE_PWRITE)|g' \
+ -e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \
+ -e 's|@''HAVE_READLINKAT''@|$(HAVE_READLINKAT)|g' \
+ -e 's|@''HAVE_SETHOSTNAME''@|$(HAVE_SETHOSTNAME)|g' \
+ -e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \
+ -e 's|@''HAVE_SYMLINK''@|$(HAVE_SYMLINK)|g' \
+ -e 's|@''HAVE_SYMLINKAT''@|$(HAVE_SYMLINKAT)|g' \
+ -e 's|@''HAVE_UNLINKAT''@|$(HAVE_UNLINKAT)|g' \
+ -e 's|@''HAVE_USLEEP''@|$(HAVE_USLEEP)|g' \
+ -e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \
+ -e 's|@''HAVE_DECL_EXECVPE''@|$(HAVE_DECL_EXECVPE)|g' \
+ -e 's|@''HAVE_DECL_FCHDIR''@|$(HAVE_DECL_FCHDIR)|g' \
+ -e 's|@''HAVE_DECL_FDATASYNC''@|$(HAVE_DECL_FDATASYNC)|g' \
+ -e 's|@''HAVE_DECL_GETDOMAINNAME''@|$(HAVE_DECL_GETDOMAINNAME)|g' \
+ -e 's|@''HAVE_DECL_GETLOGIN''@|$(HAVE_DECL_GETLOGIN)|g' \
+ -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \
+ -e 's|@''HAVE_DECL_GETPAGESIZE''@|$(HAVE_DECL_GETPAGESIZE)|g' \
+ -e 's|@''HAVE_DECL_GETUSERSHELL''@|$(HAVE_DECL_GETUSERSHELL)|g' \
+ -e 's|@''HAVE_DECL_SETHOSTNAME''@|$(HAVE_DECL_SETHOSTNAME)|g' \
+ -e 's|@''HAVE_DECL_TRUNCATE''@|$(HAVE_DECL_TRUNCATE)|g' \
+ -e 's|@''HAVE_DECL_TTYNAME_R''@|$(HAVE_DECL_TTYNAME_R)|g' \
+ -e 's|@''HAVE_OS_H''@|$(HAVE_OS_H)|g' \
+ -e 's|@''HAVE_SYS_PARAM_H''@|$(HAVE_SYS_PARAM_H)|g' \
+ | \
+ sed -e 's|@''REPLACE_ACCESS''@|$(REPLACE_ACCESS)|g' \
+ -e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \
+ -e 's|@''REPLACE_CLOSE''@|$(REPLACE_CLOSE)|g' \
+ -e 's|@''REPLACE_COPY_FILE_RANGE''@|$(REPLACE_COPY_FILE_RANGE)|g' \
+ -e 's|@''REPLACE_DUP''@|$(REPLACE_DUP)|g' \
+ -e 's|@''REPLACE_DUP2''@|$(REPLACE_DUP2)|g' \
+ -e 's|@''REPLACE_DUP3''@|$(REPLACE_DUP3)|g' \
+ -e 's|@''REPLACE_EXECL''@|$(REPLACE_EXECL)|g' \
+ -e 's|@''REPLACE_EXECLE''@|$(REPLACE_EXECLE)|g' \
+ -e 's|@''REPLACE_EXECLP''@|$(REPLACE_EXECLP)|g' \
+ -e 's|@''REPLACE_EXECV''@|$(REPLACE_EXECV)|g' \
+ -e 's|@''REPLACE_EXECVE''@|$(REPLACE_EXECVE)|g' \
+ -e 's|@''REPLACE_EXECVP''@|$(REPLACE_EXECVP)|g' \
+ -e 's|@''REPLACE_EXECVPE''@|$(REPLACE_EXECVPE)|g' \
+ -e 's|@''REPLACE_FACCESSAT''@|$(REPLACE_FACCESSAT)|g' \
+ -e 's|@''REPLACE_FCHOWNAT''@|$(REPLACE_FCHOWNAT)|g' \
+ -e 's|@''REPLACE_FDATASYNC''@|$(REPLACE_FDATASYNC)|g' \
+ -e 's|@''REPLACE_FTRUNCATE''@|$(REPLACE_FTRUNCATE)|g' \
+ -e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \
+ -e 's|@''REPLACE_GETDOMAINNAME''@|$(REPLACE_GETDOMAINNAME)|g' \
+ -e 's|@''REPLACE_GETDTABLESIZE''@|$(REPLACE_GETDTABLESIZE)|g' \
+ -e 's|@''REPLACE_GETENTROPY''@|$(REPLACE_GETENTROPY)|g' \
+ -e 's|@''REPLACE_GETLOGIN_R''@|$(REPLACE_GETLOGIN_R)|g' \
+ -e 's|@''REPLACE_GETGROUPS''@|$(REPLACE_GETGROUPS)|g' \
+ -e 's|@''REPLACE_GETPAGESIZE''@|$(REPLACE_GETPAGESIZE)|g' \
+ -e 's|@''REPLACE_GETPASS''@|$(REPLACE_GETPASS)|g' \
+ -e 's|@''REPLACE_GETPASS_FOR_GETPASS_GNU''@|$(REPLACE_GETPASS_FOR_GETPASS_GNU)|g' \
+ -e 's|@''REPLACE_ISATTY''@|$(REPLACE_ISATTY)|g' \
+ -e 's|@''REPLACE_LCHOWN''@|$(REPLACE_LCHOWN)|g' \
+ -e 's|@''REPLACE_LINK''@|$(REPLACE_LINK)|g' \
+ -e 's|@''REPLACE_LINKAT''@|$(REPLACE_LINKAT)|g' \
+ -e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \
+ -e 's|@''REPLACE_PIPE2''@|$(REPLACE_PIPE2)|g' \
+ -e 's|@''REPLACE_PREAD''@|$(REPLACE_PREAD)|g' \
+ -e 's|@''REPLACE_PWRITE''@|$(REPLACE_PWRITE)|g' \
+ -e 's|@''REPLACE_READ''@|$(REPLACE_READ)|g' \
+ -e 's|@''REPLACE_READLINK''@|$(REPLACE_READLINK)|g' \
+ -e 's|@''REPLACE_READLINKAT''@|$(REPLACE_READLINKAT)|g' \
+ -e 's|@''REPLACE_RMDIR''@|$(REPLACE_RMDIR)|g' \
+ -e 's|@''REPLACE_SETHOSTNAME''@|$(REPLACE_SETHOSTNAME)|g' \
+ -e 's|@''REPLACE_SLEEP''@|$(REPLACE_SLEEP)|g' \
+ -e 's|@''REPLACE_SYMLINK''@|$(REPLACE_SYMLINK)|g' \
+ -e 's|@''REPLACE_SYMLINKAT''@|$(REPLACE_SYMLINKAT)|g' \
+ -e 's|@''REPLACE_TRUNCATE''@|$(REPLACE_TRUNCATE)|g' \
+ -e 's|@''REPLACE_TTYNAME_R''@|$(REPLACE_TTYNAME_R)|g' \
+ -e 's|@''REPLACE_UNLINK''@|$(REPLACE_UNLINK)|g' \
+ -e 's|@''REPLACE_UNLINKAT''@|$(REPLACE_UNLINKAT)|g' \
+ -e 's|@''REPLACE_USLEEP''@|$(REPLACE_USLEEP)|g' \
+ -e 's|@''REPLACE_WRITE''@|$(REPLACE_WRITE)|g' \
+ -e 's|@''UNISTD_H_HAVE_SYS_RANDOM_H''@|$(UNISTD_H_HAVE_SYS_RANDOM_H)|g' \
+ -e 's|@''UNISTD_H_HAVE_WINSOCK2_H''@|$(UNISTD_H_HAVE_WINSOCK2_H)|g' \
+ -e 's|@''UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ > $@-t
+ $(AM_V_at)mv $@-t $@
+MOSTLYCLEANFILES += lib/unistd.h lib/unistd.h-t
+
+EXTRA_DIST += lib/unistd.in.h
+
+## end gnulib module unistd
+
+## begin gnulib module unitypes
+
+BUILT_SOURCES += $(LIBUNISTRING_UNITYPES_H)
+
+lib/unitypes.h: lib/unitypes.in.h
+ $(AM_V_GEN)$(MKDIR_P) '%reldir%'
+ $(gl_V_at)$(SED_HEADER_TO_AT_t) $(top_srcdir)/lib/unitypes.in.h
+ $(AM_V_at)mv $@-t $@
+MOSTLYCLEANFILES += lib/unitypes.h lib/unitypes.h-t
+
+EXTRA_DIST += lib/unitypes.in.h
+
+## end gnulib module unitypes
+
+## begin gnulib module uniwidth/base
+
+BUILT_SOURCES += $(LIBUNISTRING_UNIWIDTH_H)
+
+lib/uniwidth.h: lib/uniwidth.in.h
+ $(AM_V_GEN)$(MKDIR_P) '%reldir%'
+ $(gl_V_at)$(SED_HEADER_TO_AT_t) $(top_srcdir)/lib/uniwidth.in.h
+ $(AM_V_at)mv $@-t $@
+MOSTLYCLEANFILES += lib/uniwidth.h lib/uniwidth.h-t
+
+EXTRA_DIST += lib/localcharset.h lib/uniwidth.in.h
+
+## end gnulib module uniwidth/base
+
+## begin gnulib module uniwidth/width
+
+if LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH
+lib_libgnu_a_SOURCES += lib/uniwidth/width.c
+endif
+
+EXTRA_DIST += lib/unictype/bitmap.h lib/uniwidth/cjk.h lib/uniwidth/width0.h lib/uniwidth/width2.h
+
+## end gnulib module uniwidth/width
+
+## begin gnulib module vasnprintf
+
+
+EXTRA_DIST += lib/asnprintf.c lib/float+.h lib/printf-args.c lib/printf-args.h lib/printf-parse.c lib/printf-parse.h lib/vasnprintf.c lib/vasnprintf.h
+
+EXTRA_lib_libgnu_a_SOURCES += lib/asnprintf.c lib/printf-args.c lib/printf-parse.c lib/vasnprintf.c
+
+## end gnulib module vasnprintf
+
+## begin gnulib module vsnprintf
+
+
+EXTRA_DIST += lib/vsnprintf.c
+
+EXTRA_lib_libgnu_a_SOURCES += lib/vsnprintf.c
+
+## end gnulib module vsnprintf
+
+## begin gnulib module wchar
+
+BUILT_SOURCES += lib/wchar.h
+
+# We need the following in order to create <wchar.h> when the system
+# version does not work standalone.
+lib/wchar.h: lib/wchar.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)$(MKDIR_P) '%reldir%'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''HAVE_FEATURES_H''@|$(HAVE_FEATURES_H)|g' \
+ -e 's|@''NEXT_WCHAR_H''@|$(NEXT_WCHAR_H)|g' \
+ -e 's|@''HAVE_WCHAR_H''@|$(HAVE_WCHAR_H)|g' \
+ -e 's/@''HAVE_CRTDEFS_H''@/$(HAVE_CRTDEFS_H)/g' \
+ -e 's/@''GNULIBHEADERS_OVERRIDE_WINT_T''@/$(GNULIBHEADERS_OVERRIDE_WINT_T)/g' \
+ -e 's/@''GNULIB_BTOWC''@/$(GL_GNULIB_BTOWC)/g' \
+ -e 's/@''GNULIB_WCTOB''@/$(GL_GNULIB_WCTOB)/g' \
+ -e 's/@''GNULIB_MBSINIT''@/$(GL_GNULIB_MBSINIT)/g' \
+ -e 's/@''GNULIB_MBRTOWC''@/$(GL_GNULIB_MBRTOWC)/g' \
+ -e 's/@''GNULIB_MBRLEN''@/$(GL_GNULIB_MBRLEN)/g' \
+ -e 's/@''GNULIB_MBSRTOWCS''@/$(GL_GNULIB_MBSRTOWCS)/g' \
+ -e 's/@''GNULIB_MBSNRTOWCS''@/$(GL_GNULIB_MBSNRTOWCS)/g' \
+ -e 's/@''GNULIB_WCRTOMB''@/$(GL_GNULIB_WCRTOMB)/g' \
+ -e 's/@''GNULIB_WCSRTOMBS''@/$(GL_GNULIB_WCSRTOMBS)/g' \
+ -e 's/@''GNULIB_WCSNRTOMBS''@/$(GL_GNULIB_WCSNRTOMBS)/g' \
+ -e 's/@''GNULIB_WCWIDTH''@/$(GL_GNULIB_WCWIDTH)/g' \
+ -e 's/@''GNULIB_WMEMCHR''@/$(GL_GNULIB_WMEMCHR)/g' \
+ -e 's/@''GNULIB_WMEMCMP''@/$(GL_GNULIB_WMEMCMP)/g' \
+ -e 's/@''GNULIB_WMEMCPY''@/$(GL_GNULIB_WMEMCPY)/g' \
+ -e 's/@''GNULIB_WMEMMOVE''@/$(GL_GNULIB_WMEMMOVE)/g' \
+ -e 's/@''GNULIB_WMEMPCPY''@/$(GL_GNULIB_WMEMPCPY)/g' \
+ -e 's/@''GNULIB_WMEMSET''@/$(GL_GNULIB_WMEMSET)/g' \
+ -e 's/@''GNULIB_WCSLEN''@/$(GL_GNULIB_WCSLEN)/g' \
+ -e 's/@''GNULIB_WCSNLEN''@/$(GL_GNULIB_WCSNLEN)/g' \
+ -e 's/@''GNULIB_WCSCPY''@/$(GL_GNULIB_WCSCPY)/g' \
+ -e 's/@''GNULIB_WCPCPY''@/$(GL_GNULIB_WCPCPY)/g' \
+ -e 's/@''GNULIB_WCSNCPY''@/$(GL_GNULIB_WCSNCPY)/g' \
+ -e 's/@''GNULIB_WCPNCPY''@/$(GL_GNULIB_WCPNCPY)/g' \
+ -e 's/@''GNULIB_WCSCAT''@/$(GL_GNULIB_WCSCAT)/g' \
+ -e 's/@''GNULIB_WCSNCAT''@/$(GL_GNULIB_WCSNCAT)/g' \
+ -e 's/@''GNULIB_WCSCMP''@/$(GL_GNULIB_WCSCMP)/g' \
+ -e 's/@''GNULIB_WCSNCMP''@/$(GL_GNULIB_WCSNCMP)/g' \
+ -e 's/@''GNULIB_WCSCASECMP''@/$(GL_GNULIB_WCSCASECMP)/g' \
+ -e 's/@''GNULIB_WCSNCASECMP''@/$(GL_GNULIB_WCSNCASECMP)/g' \
+ -e 's/@''GNULIB_WCSCOLL''@/$(GL_GNULIB_WCSCOLL)/g' \
+ -e 's/@''GNULIB_WCSXFRM''@/$(GL_GNULIB_WCSXFRM)/g' \
+ -e 's/@''GNULIB_WCSDUP''@/$(GL_GNULIB_WCSDUP)/g' \
+ -e 's/@''GNULIB_WCSCHR''@/$(GL_GNULIB_WCSCHR)/g' \
+ -e 's/@''GNULIB_WCSRCHR''@/$(GL_GNULIB_WCSRCHR)/g' \
+ -e 's/@''GNULIB_WCSCSPN''@/$(GL_GNULIB_WCSCSPN)/g' \
+ -e 's/@''GNULIB_WCSSPN''@/$(GL_GNULIB_WCSSPN)/g' \
+ -e 's/@''GNULIB_WCSPBRK''@/$(GL_GNULIB_WCSPBRK)/g' \
+ -e 's/@''GNULIB_WCSSTR''@/$(GL_GNULIB_WCSSTR)/g' \
+ -e 's/@''GNULIB_WCSTOK''@/$(GL_GNULIB_WCSTOK)/g' \
+ -e 's/@''GNULIB_WCSWIDTH''@/$(GL_GNULIB_WCSWIDTH)/g' \
+ -e 's/@''GNULIB_WCSFTIME''@/$(GL_GNULIB_WCSFTIME)/g' \
+ -e 's/@''GNULIB_MDA_WCSDUP''@/$(GL_GNULIB_MDA_WCSDUP)/g' \
+ -e 's/@''GNULIB_FREE_POSIX''@/$(GL_GNULIB_FREE_POSIX)/g' \
+ < $(top_srcdir)/lib/wchar.in.h | \
+ sed -e 's|@''HAVE_WINT_T''@|$(HAVE_WINT_T)|g' \
+ -e 's|@''HAVE_BTOWC''@|$(HAVE_BTOWC)|g' \
+ -e 's|@''HAVE_MBSINIT''@|$(HAVE_MBSINIT)|g' \
+ -e 's|@''HAVE_MBRTOWC''@|$(HAVE_MBRTOWC)|g' \
+ -e 's|@''HAVE_MBRLEN''@|$(HAVE_MBRLEN)|g' \
+ -e 's|@''HAVE_MBSRTOWCS''@|$(HAVE_MBSRTOWCS)|g' \
+ -e 's|@''HAVE_MBSNRTOWCS''@|$(HAVE_MBSNRTOWCS)|g' \
+ -e 's|@''HAVE_WCRTOMB''@|$(HAVE_WCRTOMB)|g' \
+ -e 's|@''HAVE_WCSRTOMBS''@|$(HAVE_WCSRTOMBS)|g' \
+ -e 's|@''HAVE_WCSNRTOMBS''@|$(HAVE_WCSNRTOMBS)|g' \
+ -e 's|@''HAVE_WMEMCHR''@|$(HAVE_WMEMCHR)|g' \
+ -e 's|@''HAVE_WMEMCMP''@|$(HAVE_WMEMCMP)|g' \
+ -e 's|@''HAVE_WMEMCPY''@|$(HAVE_WMEMCPY)|g' \
+ -e 's|@''HAVE_WMEMMOVE''@|$(HAVE_WMEMMOVE)|g' \
+ -e 's|@''HAVE_WMEMPCPY''@|$(HAVE_WMEMPCPY)|g' \
+ -e 's|@''HAVE_WMEMSET''@|$(HAVE_WMEMSET)|g' \
+ -e 's|@''HAVE_WCSLEN''@|$(HAVE_WCSLEN)|g' \
+ -e 's|@''HAVE_WCSNLEN''@|$(HAVE_WCSNLEN)|g' \
+ -e 's|@''HAVE_WCSCPY''@|$(HAVE_WCSCPY)|g' \
+ -e 's|@''HAVE_WCPCPY''@|$(HAVE_WCPCPY)|g' \
+ -e 's|@''HAVE_WCSNCPY''@|$(HAVE_WCSNCPY)|g' \
+ -e 's|@''HAVE_WCPNCPY''@|$(HAVE_WCPNCPY)|g' \
+ -e 's|@''HAVE_WCSCAT''@|$(HAVE_WCSCAT)|g' \
+ -e 's|@''HAVE_WCSNCAT''@|$(HAVE_WCSNCAT)|g' \
+ -e 's|@''HAVE_WCSCMP''@|$(HAVE_WCSCMP)|g' \
+ -e 's|@''HAVE_WCSNCMP''@|$(HAVE_WCSNCMP)|g' \
+ -e 's|@''HAVE_WCSCASECMP''@|$(HAVE_WCSCASECMP)|g' \
+ -e 's|@''HAVE_WCSNCASECMP''@|$(HAVE_WCSNCASECMP)|g' \
+ -e 's|@''HAVE_WCSCOLL''@|$(HAVE_WCSCOLL)|g' \
+ -e 's|@''HAVE_WCSXFRM''@|$(HAVE_WCSXFRM)|g' \
+ -e 's|@''HAVE_WCSDUP''@|$(HAVE_WCSDUP)|g' \
+ -e 's|@''HAVE_WCSCHR''@|$(HAVE_WCSCHR)|g' \
+ -e 's|@''HAVE_WCSRCHR''@|$(HAVE_WCSRCHR)|g' \
+ -e 's|@''HAVE_WCSCSPN''@|$(HAVE_WCSCSPN)|g' \
+ -e 's|@''HAVE_WCSSPN''@|$(HAVE_WCSSPN)|g' \
+ -e 's|@''HAVE_WCSPBRK''@|$(HAVE_WCSPBRK)|g' \
+ -e 's|@''HAVE_WCSSTR''@|$(HAVE_WCSSTR)|g' \
+ -e 's|@''HAVE_WCSTOK''@|$(HAVE_WCSTOK)|g' \
+ -e 's|@''HAVE_WCSWIDTH''@|$(HAVE_WCSWIDTH)|g' \
+ -e 's|@''HAVE_WCSFTIME''@|$(HAVE_WCSFTIME)|g' \
+ -e 's|@''HAVE_DECL_WCTOB''@|$(HAVE_DECL_WCTOB)|g' \
+ -e 's|@''HAVE_DECL_WCSDUP''@|$(HAVE_DECL_WCSDUP)|g' \
+ -e 's|@''HAVE_DECL_WCWIDTH''@|$(HAVE_DECL_WCWIDTH)|g' \
+ | \
+ sed -e 's|@''REPLACE_MBSTATE_T''@|$(REPLACE_MBSTATE_T)|g' \
+ -e 's|@''REPLACE_BTOWC''@|$(REPLACE_BTOWC)|g' \
+ -e 's|@''REPLACE_WCTOB''@|$(REPLACE_WCTOB)|g' \
+ -e 's|@''REPLACE_FREE''@|$(REPLACE_FREE)|g' \
+ -e 's|@''REPLACE_MBSINIT''@|$(REPLACE_MBSINIT)|g' \
+ -e 's|@''REPLACE_MBRTOWC''@|$(REPLACE_MBRTOWC)|g' \
+ -e 's|@''REPLACE_MBRLEN''@|$(REPLACE_MBRLEN)|g' \
+ -e 's|@''REPLACE_MBSRTOWCS''@|$(REPLACE_MBSRTOWCS)|g' \
+ -e 's|@''REPLACE_MBSNRTOWCS''@|$(REPLACE_MBSNRTOWCS)|g' \
+ -e 's|@''REPLACE_WCRTOMB''@|$(REPLACE_WCRTOMB)|g' \
+ -e 's|@''REPLACE_WCSRTOMBS''@|$(REPLACE_WCSRTOMBS)|g' \
+ -e 's|@''REPLACE_WCSNRTOMBS''@|$(REPLACE_WCSNRTOMBS)|g' \
+ -e 's|@''REPLACE_WCWIDTH''@|$(REPLACE_WCWIDTH)|g' \
+ -e 's|@''REPLACE_WCSWIDTH''@|$(REPLACE_WCSWIDTH)|g' \
+ -e 's|@''REPLACE_WCSFTIME''@|$(REPLACE_WCSFTIME)|g' \
+ -e 's|@''REPLACE_WCSTOK''@|$(REPLACE_WCSTOK)|g' \
+ -e 's|@''REPLACE_WMEMPCPY''@|$(REPLACE_WMEMPCPY)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ > $@-t
+ $(AM_V_at)mv $@-t $@
+MOSTLYCLEANFILES += lib/wchar.h lib/wchar.h-t
+
+EXTRA_DIST += lib/wchar.in.h
+
+## end gnulib module wchar
+
+## begin gnulib module wctype-h
+
+BUILT_SOURCES += lib/wctype.h
+lib_libgnu_a_SOURCES += lib/wctype-h.c
+
+# We need the following in order to create <wctype.h> when the system
+# doesn't have one that works with the given compiler.
+lib/wctype.h: lib/wctype.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)$(MKDIR_P) '%reldir%'
+ $(gl_V_at)$(SED_HEADER_STDOUT) \
+ -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's/@''HAVE_WCTYPE_H''@/$(HAVE_WCTYPE_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_WCTYPE_H''@|$(NEXT_WCTYPE_H)|g' \
+ -e 's/@''HAVE_CRTDEFS_H''@/$(HAVE_CRTDEFS_H)/g' \
+ -e 's/@''GNULIBHEADERS_OVERRIDE_WINT_T''@/$(GNULIBHEADERS_OVERRIDE_WINT_T)/g' \
+ -e 's/@''GNULIB_ISWBLANK''@/$(GL_GNULIB_ISWBLANK)/g' \
+ -e 's/@''GNULIB_ISWDIGIT''@/$(GL_GNULIB_ISWDIGIT)/g' \
+ -e 's/@''GNULIB_ISWXDIGIT''@/$(GL_GNULIB_ISWXDIGIT)/g' \
+ -e 's/@''GNULIB_WCTYPE''@/$(GL_GNULIB_WCTYPE)/g' \
+ -e 's/@''GNULIB_ISWCTYPE''@/$(GL_GNULIB_ISWCTYPE)/g' \
+ -e 's/@''GNULIB_WCTRANS''@/$(GL_GNULIB_WCTRANS)/g' \
+ -e 's/@''GNULIB_TOWCTRANS''@/$(GL_GNULIB_TOWCTRANS)/g' \
+ -e 's/@''HAVE_ISWBLANK''@/$(HAVE_ISWBLANK)/g' \
+ -e 's/@''HAVE_ISWCNTRL''@/$(HAVE_ISWCNTRL)/g' \
+ -e 's/@''HAVE_WCTYPE_T''@/$(HAVE_WCTYPE_T)/g' \
+ -e 's/@''HAVE_WCTRANS_T''@/$(HAVE_WCTRANS_T)/g' \
+ -e 's/@''HAVE_WINT_T''@/$(HAVE_WINT_T)/g' \
+ -e 's/@''REPLACE_ISWBLANK''@/$(REPLACE_ISWBLANK)/g' \
+ -e 's/@''REPLACE_ISWDIGIT''@/$(REPLACE_ISWDIGIT)/g' \
+ -e 's/@''REPLACE_ISWXDIGIT''@/$(REPLACE_ISWXDIGIT)/g' \
+ -e 's/@''REPLACE_ISWCNTRL''@/$(REPLACE_ISWCNTRL)/g' \
+ -e 's/@''REPLACE_TOWLOWER''@/$(REPLACE_TOWLOWER)/g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ $(top_srcdir)/lib/wctype.in.h > $@-t
+ $(AM_V_at)mv $@-t $@
+MOSTLYCLEANFILES += lib/wctype.h lib/wctype.h-t
+
+EXTRA_DIST += lib/wctype.in.h
+
+## end gnulib module wctype-h
+
+## begin gnulib module wcwidth
+
+if GL_COND_OBJ_WCWIDTH
+lib_libgnu_a_SOURCES += lib/wcwidth.c
+endif
+
+## end gnulib module wcwidth
+
+## begin gnulib module xsize
+
+lib_libgnu_a_SOURCES += lib/xsize.h lib/xsize.c
+
+## end gnulib module xsize
+
+
+mostlyclean-local: mostlyclean-generic
+ @for dir in '' $(MOSTLYCLEANDIRS); do \
+ if test -n "$$dir" && test -d $$dir; then \
+ echo "rmdir $$dir"; rmdir $$dir; \
+ fi; \
+ done; \
+ :
+distclean-local: distclean-gnulib-libobjs
+distclean-gnulib-libobjs:
+ -rm -f @gl_LIBOBJDEPS@
+maintainer-clean-local: distclean-gnulib-libobjs
diff --git a/lib/inttypes.in.h b/lib/inttypes.in.h
new file mode 100644
index 0000000..5b7ef12
--- /dev/null
+++ b/lib/inttypes.in.h
@@ -0,0 +1,1028 @@
+/* Copyright (C) 2006-2023 Free Software Foundation, Inc.
+ Written by Paul Eggert, Bruno Haible, Derek Price.
+ This file is part of gnulib.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/*
+ * ISO C 99 <inttypes.h> for platforms that lack it.
+ * <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/inttypes.h.html>
+ */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* Include the original <inttypes.h> if it exists, and if this file
+ has not been included yet or if this file includes gnulib stdint.h
+ which in turn includes this file.
+ The include_next requires a split double-inclusion guard. */
+#if ! defined INTTYPES_H || defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+# if @HAVE_INTTYPES_H@
+
+ /* Some pre-C++11 <stdint.h> implementations need this. */
+# if defined __cplusplus && ! defined __STDC_FORMAT_MACROS
+# define __STDC_FORMAT_MACROS 1
+# endif
+
+# @INCLUDE_NEXT@ @NEXT_INTTYPES_H@
+
+# define _GL_FINISHED_INCLUDING_SYSTEM_INTTYPES_H
+# endif
+#endif
+
+#if ! defined INTTYPES_H && ! defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+#define INTTYPES_H
+
+/* Include <stdint.h> or the gnulib replacement.
+ But avoid namespace pollution on glibc systems. */
+#ifndef __GLIBC__
+# include <stdint.h>
+#endif
+/* Get CHAR_BIT, INT_MAX, LONG_MAX, etc. */
+#include <limits.h>
+/* On mingw, __USE_MINGW_ANSI_STDIO only works if <stdio.h> is also included */
+#if defined _WIN32 && ! defined __CYGWIN__
+# include <stdio.h>
+#endif
+
+#if !(INT_MAX == 0x7fffffff && INT_MIN + INT_MAX == -1)
+# error "This file assumes that 'int' is 32-bit two's complement. Please report your platform and compiler to <bug-gnulib@gnu.org>."
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* 7.8.1 Macros for format specifiers */
+
+#if defined _TNS_R_TARGET
+ /* Tandem NonStop R series and compatible platforms released before
+ July 2005 support %Ld but not %lld. */
+# define _LONG_LONG_FORMAT_PREFIX "L"
+#else
+# define _LONG_LONG_FORMAT_PREFIX "ll"
+#endif
+
+#if !defined PRId8
+# ifdef INT8_MAX
+# define PRId8 "d"
+# endif
+#endif
+#if !defined PRIi8
+# ifdef INT8_MAX
+# define PRIi8 "i"
+# endif
+#endif
+#if !defined PRIo8
+# ifdef UINT8_MAX
+# define PRIo8 "o"
+# endif
+#endif
+#if !defined PRIu8
+# ifdef UINT8_MAX
+# define PRIu8 "u"
+# endif
+#endif
+#if !defined PRIx8
+# ifdef UINT8_MAX
+# define PRIx8 "x"
+# endif
+#endif
+#if !defined PRIX8
+# ifdef UINT8_MAX
+# define PRIX8 "X"
+# endif
+#endif
+#if !defined PRId16
+# ifdef INT16_MAX
+# define PRId16 "d"
+# endif
+#endif
+#if !defined PRIi16
+# ifdef INT16_MAX
+# define PRIi16 "i"
+# endif
+#endif
+#if !defined PRIo16
+# ifdef UINT16_MAX
+# define PRIo16 "o"
+# endif
+#endif
+#if !defined PRIu16
+# ifdef UINT16_MAX
+# define PRIu16 "u"
+# endif
+#endif
+#if !defined PRIx16
+# ifdef UINT16_MAX
+# define PRIx16 "x"
+# endif
+#endif
+#if !defined PRIX16
+# ifdef UINT16_MAX
+# define PRIX16 "X"
+# endif
+#endif
+#if !defined PRId32
+# ifdef INT32_MAX
+# define PRId32 "d"
+# endif
+#endif
+#if !defined PRIi32
+# ifdef INT32_MAX
+# define PRIi32 "i"
+# endif
+#endif
+#if !defined PRIo32
+# ifdef UINT32_MAX
+# define PRIo32 "o"
+# endif
+#endif
+#if !defined PRIu32
+# ifdef UINT32_MAX
+# define PRIu32 "u"
+# endif
+#endif
+#if !defined PRIx32
+# ifdef UINT32_MAX
+# define PRIx32 "x"
+# endif
+#endif
+#if !defined PRIX32
+# ifdef UINT32_MAX
+# define PRIX32 "X"
+# endif
+#endif
+#ifdef INT64_MAX
+# if (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @INT64_MAX_EQ_LONG_MAX@)
+# define _PRI64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+# define _PRI64_PREFIX "I64"
+# elif LONG_MAX >> 30 == 1
+# define _PRI64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined PRId64
+# define PRId64 _PRI64_PREFIX "d"
+# endif
+# if !defined PRIi64
+# define PRIi64 _PRI64_PREFIX "i"
+# endif
+#endif
+#ifdef UINT64_MAX
+# if (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @UINT64_MAX_EQ_ULONG_MAX@)
+# define _PRIu64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+# define _PRIu64_PREFIX "I64"
+# elif ULONG_MAX >> 31 == 1
+# define _PRIu64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined PRIo64
+# define PRIo64 _PRIu64_PREFIX "o"
+# endif
+# if !defined PRIu64
+# define PRIu64 _PRIu64_PREFIX "u"
+# endif
+# if !defined PRIx64
+# define PRIx64 _PRIu64_PREFIX "x"
+# endif
+# if !defined PRIX64
+# define PRIX64 _PRIu64_PREFIX "X"
+# endif
+#endif
+
+#if !defined PRIdLEAST8
+# define PRIdLEAST8 "d"
+#endif
+#if !defined PRIiLEAST8
+# define PRIiLEAST8 "i"
+#endif
+#if !defined PRIoLEAST8
+# define PRIoLEAST8 "o"
+#endif
+#if !defined PRIuLEAST8
+# define PRIuLEAST8 "u"
+#endif
+#if !defined PRIxLEAST8
+# define PRIxLEAST8 "x"
+#endif
+#if !defined PRIXLEAST8
+# define PRIXLEAST8 "X"
+#endif
+#if !defined PRIdLEAST16
+# define PRIdLEAST16 "d"
+#endif
+#if !defined PRIiLEAST16
+# define PRIiLEAST16 "i"
+#endif
+#if !defined PRIoLEAST16
+# define PRIoLEAST16 "o"
+#endif
+#if !defined PRIuLEAST16
+# define PRIuLEAST16 "u"
+#endif
+#if !defined PRIxLEAST16
+# define PRIxLEAST16 "x"
+#endif
+#if !defined PRIXLEAST16
+# define PRIXLEAST16 "X"
+#endif
+#if !defined PRIdLEAST32
+# define PRIdLEAST32 "d"
+#endif
+#if !defined PRIiLEAST32
+# define PRIiLEAST32 "i"
+#endif
+#if !defined PRIoLEAST32
+# define PRIoLEAST32 "o"
+#endif
+#if !defined PRIuLEAST32
+# define PRIuLEAST32 "u"
+#endif
+#if !defined PRIxLEAST32
+# define PRIxLEAST32 "x"
+#endif
+#if !defined PRIXLEAST32
+# define PRIXLEAST32 "X"
+#endif
+#ifdef INT64_MAX
+# if !defined PRIdLEAST64
+# define PRIdLEAST64 PRId64
+# endif
+# if !defined PRIiLEAST64
+# define PRIiLEAST64 PRIi64
+# endif
+#endif
+#ifdef UINT64_MAX
+# if !defined PRIoLEAST64
+# define PRIoLEAST64 PRIo64
+# endif
+# if !defined PRIuLEAST64
+# define PRIuLEAST64 PRIu64
+# endif
+# if !defined PRIxLEAST64
+# define PRIxLEAST64 PRIx64
+# endif
+# if !defined PRIXLEAST64
+# define PRIXLEAST64 PRIX64
+# endif
+#endif
+
+#if !defined PRIdFAST8
+# if INT_FAST8_MAX > INT32_MAX
+# define PRIdFAST8 PRId64
+# else
+# define PRIdFAST8 "d"
+# endif
+#endif
+#if !defined PRIiFAST8
+# if INT_FAST8_MAX > INT32_MAX
+# define PRIiFAST8 PRIi64
+# else
+# define PRIiFAST8 "i"
+# endif
+#endif
+#if !defined PRIoFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define PRIoFAST8 PRIo64
+# else
+# define PRIoFAST8 "o"
+# endif
+#endif
+#if !defined PRIuFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define PRIuFAST8 PRIu64
+# else
+# define PRIuFAST8 "u"
+# endif
+#endif
+#if !defined PRIxFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define PRIxFAST8 PRIx64
+# else
+# define PRIxFAST8 "x"
+# endif
+#endif
+#if !defined PRIXFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define PRIXFAST8 PRIX64
+# else
+# define PRIXFAST8 "X"
+# endif
+#endif
+#if !defined PRIdFAST16
+# if INT_FAST16_MAX > INT32_MAX
+# define PRIdFAST16 PRId64
+# else
+# define PRIdFAST16 "d"
+# endif
+#endif
+#if !defined PRIiFAST16
+# if INT_FAST16_MAX > INT32_MAX
+# define PRIiFAST16 PRIi64
+# else
+# define PRIiFAST16 "i"
+# endif
+#endif
+#if !defined PRIoFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define PRIoFAST16 PRIo64
+# else
+# define PRIoFAST16 "o"
+# endif
+#endif
+#if !defined PRIuFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define PRIuFAST16 PRIu64
+# else
+# define PRIuFAST16 "u"
+# endif
+#endif
+#if !defined PRIxFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define PRIxFAST16 PRIx64
+# else
+# define PRIxFAST16 "x"
+# endif
+#endif
+#if !defined PRIXFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define PRIXFAST16 PRIX64
+# else
+# define PRIXFAST16 "X"
+# endif
+#endif
+#if !defined PRIdFAST32
+# if INT_FAST32_MAX > INT32_MAX
+# define PRIdFAST32 PRId64
+# else
+# define PRIdFAST32 "d"
+# endif
+#endif
+#if !defined PRIiFAST32
+# if INT_FAST32_MAX > INT32_MAX
+# define PRIiFAST32 PRIi64
+# else
+# define PRIiFAST32 "i"
+# endif
+#endif
+#if !defined PRIoFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define PRIoFAST32 PRIo64
+# else
+# define PRIoFAST32 "o"
+# endif
+#endif
+#if !defined PRIuFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define PRIuFAST32 PRIu64
+# else
+# define PRIuFAST32 "u"
+# endif
+#endif
+#if !defined PRIxFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define PRIxFAST32 PRIx64
+# else
+# define PRIxFAST32 "x"
+# endif
+#endif
+#if !defined PRIXFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define PRIXFAST32 PRIX64
+# else
+# define PRIXFAST32 "X"
+# endif
+#endif
+#ifdef INT64_MAX
+# if !defined PRIdFAST64
+# define PRIdFAST64 PRId64
+# endif
+# if !defined PRIiFAST64
+# define PRIiFAST64 PRIi64
+# endif
+#endif
+#ifdef UINT64_MAX
+# if !defined PRIoFAST64
+# define PRIoFAST64 PRIo64
+# endif
+# if !defined PRIuFAST64
+# define PRIuFAST64 PRIu64
+# endif
+# if !defined PRIxFAST64
+# define PRIxFAST64 PRIx64
+# endif
+# if !defined PRIXFAST64
+# define PRIXFAST64 PRIX64
+# endif
+#endif
+
+#if !defined PRIdMAX
+# if @INT32_MAX_LT_INTMAX_MAX@
+# define PRIdMAX PRId64
+# else
+# define PRIdMAX "ld"
+# endif
+#endif
+#if !defined PRIiMAX
+# if @INT32_MAX_LT_INTMAX_MAX@
+# define PRIiMAX PRIi64
+# else
+# define PRIiMAX "li"
+# endif
+#endif
+#if !defined PRIoMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define PRIoMAX PRIo64
+# else
+# define PRIoMAX "lo"
+# endif
+#endif
+#if !defined PRIuMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define PRIuMAX PRIu64
+# else
+# define PRIuMAX "lu"
+# endif
+#endif
+#if !defined PRIxMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define PRIxMAX PRIx64
+# else
+# define PRIxMAX "lx"
+# endif
+#endif
+#if !defined PRIXMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define PRIXMAX PRIX64
+# else
+# define PRIXMAX "lX"
+# endif
+#endif
+
+#if !defined PRIdPTR
+# ifdef INTPTR_MAX
+# define PRIdPTR @PRIPTR_PREFIX@ "d"
+# endif
+#endif
+#if !defined PRIiPTR
+# ifdef INTPTR_MAX
+# define PRIiPTR @PRIPTR_PREFIX@ "i"
+# endif
+#endif
+#if !defined PRIoPTR
+# ifdef UINTPTR_MAX
+# define PRIoPTR @PRIPTR_PREFIX@ "o"
+# endif
+#endif
+#if !defined PRIuPTR
+# ifdef UINTPTR_MAX
+# define PRIuPTR @PRIPTR_PREFIX@ "u"
+# endif
+#endif
+#if !defined PRIxPTR
+# ifdef UINTPTR_MAX
+# define PRIxPTR @PRIPTR_PREFIX@ "x"
+# endif
+#endif
+#if !defined PRIXPTR
+# ifdef UINTPTR_MAX
+# define PRIXPTR @PRIPTR_PREFIX@ "X"
+# endif
+#endif
+
+#if !defined SCNd8
+# ifdef INT8_MAX
+# define SCNd8 "hhd"
+# endif
+#endif
+#if !defined SCNi8
+# ifdef INT8_MAX
+# define SCNi8 "hhi"
+# endif
+#endif
+#if !defined SCNo8
+# ifdef UINT8_MAX
+# define SCNo8 "hho"
+# endif
+#endif
+#if !defined SCNu8
+# ifdef UINT8_MAX
+# define SCNu8 "hhu"
+# endif
+#endif
+#if !defined SCNx8
+# ifdef UINT8_MAX
+# define SCNx8 "hhx"
+# endif
+#endif
+#if !defined SCNd16
+# ifdef INT16_MAX
+# define SCNd16 "hd"
+# endif
+#endif
+#if !defined SCNi16
+# ifdef INT16_MAX
+# define SCNi16 "hi"
+# endif
+#endif
+#if !defined SCNo16
+# ifdef UINT16_MAX
+# define SCNo16 "ho"
+# endif
+#endif
+#if !defined SCNu16
+# ifdef UINT16_MAX
+# define SCNu16 "hu"
+# endif
+#endif
+#if !defined SCNx16
+# ifdef UINT16_MAX
+# define SCNx16 "hx"
+# endif
+#endif
+#if !defined SCNd32
+# ifdef INT32_MAX
+# define SCNd32 "d"
+# endif
+#endif
+#if !defined SCNi32
+# ifdef INT32_MAX
+# define SCNi32 "i"
+# endif
+#endif
+#if !defined SCNo32
+# ifdef UINT32_MAX
+# define SCNo32 "o"
+# endif
+#endif
+#if !defined SCNu32
+# ifdef UINT32_MAX
+# define SCNu32 "u"
+# endif
+#endif
+#if !defined SCNx32
+# ifdef UINT32_MAX
+# define SCNx32 "x"
+# endif
+#endif
+#ifdef INT64_MAX
+# if (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @INT64_MAX_EQ_LONG_MAX@)
+# define _SCN64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+# define _SCN64_PREFIX "I64"
+# elif LONG_MAX >> 30 == 1
+# define _SCN64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined SCNd64
+# define SCNd64 _SCN64_PREFIX "d"
+# endif
+# if !defined SCNi64
+# define SCNi64 _SCN64_PREFIX "i"
+# endif
+#endif
+#ifdef UINT64_MAX
+# if (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @UINT64_MAX_EQ_ULONG_MAX@)
+# define _SCNu64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+# define _SCNu64_PREFIX "I64"
+# elif ULONG_MAX >> 31 == 1
+# define _SCNu64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined SCNo64
+# define SCNo64 _SCNu64_PREFIX "o"
+# endif
+# if !defined SCNu64
+# define SCNu64 _SCNu64_PREFIX "u"
+# endif
+# if !defined SCNx64
+# define SCNx64 _SCNu64_PREFIX "x"
+# endif
+#endif
+
+#if !defined SCNdLEAST8
+# define SCNdLEAST8 "hhd"
+#endif
+#if !defined SCNiLEAST8
+# define SCNiLEAST8 "hhi"
+#endif
+#if !defined SCNoLEAST8
+# define SCNoLEAST8 "hho"
+#endif
+#if !defined SCNuLEAST8
+# define SCNuLEAST8 "hhu"
+#endif
+#if !defined SCNxLEAST8
+# define SCNxLEAST8 "hhx"
+#endif
+#if !defined SCNdLEAST16
+# define SCNdLEAST16 "hd"
+#endif
+#if !defined SCNiLEAST16
+# define SCNiLEAST16 "hi"
+#endif
+#if !defined SCNoLEAST16
+# define SCNoLEAST16 "ho"
+#endif
+#if !defined SCNuLEAST16
+# define SCNuLEAST16 "hu"
+#endif
+#if !defined SCNxLEAST16
+# define SCNxLEAST16 "hx"
+#endif
+#if !defined SCNdLEAST32
+# define SCNdLEAST32 "d"
+#endif
+#if !defined SCNiLEAST32
+# define SCNiLEAST32 "i"
+#endif
+#if !defined SCNoLEAST32
+# define SCNoLEAST32 "o"
+#endif
+#if !defined SCNuLEAST32
+# define SCNuLEAST32 "u"
+#endif
+#if !defined SCNxLEAST32
+# define SCNxLEAST32 "x"
+#endif
+#ifdef INT64_MAX
+# if !defined SCNdLEAST64
+# define SCNdLEAST64 SCNd64
+# endif
+# if !defined SCNiLEAST64
+# define SCNiLEAST64 SCNi64
+# endif
+#endif
+#ifdef UINT64_MAX
+# if !defined SCNoLEAST64
+# define SCNoLEAST64 SCNo64
+# endif
+# if !defined SCNuLEAST64
+# define SCNuLEAST64 SCNu64
+# endif
+# if !defined SCNxLEAST64
+# define SCNxLEAST64 SCNx64
+# endif
+#endif
+
+#if !defined SCNdFAST8
+# if INT_FAST8_MAX > INT32_MAX
+# define SCNdFAST8 SCNd64
+# elif INT_FAST8_MAX == 0x7fff
+# define SCNdFAST8 "hd"
+# elif INT_FAST8_MAX == 0x7f
+# define SCNdFAST8 "hhd"
+# else
+# define SCNdFAST8 "d"
+# endif
+#endif
+#if !defined SCNiFAST8
+# if INT_FAST8_MAX > INT32_MAX
+# define SCNiFAST8 SCNi64
+# elif INT_FAST8_MAX == 0x7fff
+# define SCNiFAST8 "hi"
+# elif INT_FAST8_MAX == 0x7f
+# define SCNiFAST8 "hhi"
+# else
+# define SCNiFAST8 "i"
+# endif
+#endif
+#if !defined SCNoFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define SCNoFAST8 SCNo64
+# elif UINT_FAST8_MAX == 0xffff
+# define SCNoFAST8 "ho"
+# elif UINT_FAST8_MAX == 0xff
+# define SCNoFAST8 "hho"
+# else
+# define SCNoFAST8 "o"
+# endif
+#endif
+#if !defined SCNuFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define SCNuFAST8 SCNu64
+# elif UINT_FAST8_MAX == 0xffff
+# define SCNuFAST8 "hu"
+# elif UINT_FAST8_MAX == 0xff
+# define SCNuFAST8 "hhu"
+# else
+# define SCNuFAST8 "u"
+# endif
+#endif
+#if !defined SCNxFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define SCNxFAST8 SCNx64
+# elif UINT_FAST8_MAX == 0xffff
+# define SCNxFAST8 "hx"
+# elif UINT_FAST8_MAX == 0xff
+# define SCNxFAST8 "hhx"
+# else
+# define SCNxFAST8 "x"
+# endif
+#endif
+#if !defined SCNdFAST16
+# if INT_FAST16_MAX > INT32_MAX
+# define SCNdFAST16 SCNd64
+# elif INT_FAST16_MAX == 0x7fff
+# define SCNdFAST16 "hd"
+# else
+# define SCNdFAST16 "d"
+# endif
+#endif
+#if !defined SCNiFAST16
+# if INT_FAST16_MAX > INT32_MAX
+# define SCNiFAST16 SCNi64
+# elif INT_FAST16_MAX == 0x7fff
+# define SCNiFAST16 "hi"
+# else
+# define SCNiFAST16 "i"
+# endif
+#endif
+#if !defined SCNoFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define SCNoFAST16 SCNo64
+# elif UINT_FAST16_MAX == 0xffff
+# define SCNoFAST16 "ho"
+# else
+# define SCNoFAST16 "o"
+# endif
+#endif
+#if !defined SCNuFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define SCNuFAST16 SCNu64
+# elif UINT_FAST16_MAX == 0xffff
+# define SCNuFAST16 "hu"
+# else
+# define SCNuFAST16 "u"
+# endif
+#endif
+#if !defined SCNxFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define SCNxFAST16 SCNx64
+# elif UINT_FAST16_MAX == 0xffff
+# define SCNxFAST16 "hx"
+# else
+# define SCNxFAST16 "x"
+# endif
+#endif
+#if !defined SCNdFAST32
+# if INT_FAST32_MAX > INT32_MAX
+# define SCNdFAST32 SCNd64
+# else
+# define SCNdFAST32 "d"
+# endif
+#endif
+#if !defined SCNiFAST32
+# if INT_FAST32_MAX > INT32_MAX
+# define SCNiFAST32 SCNi64
+# else
+# define SCNiFAST32 "i"
+# endif
+#endif
+#if !defined SCNoFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define SCNoFAST32 SCNo64
+# else
+# define SCNoFAST32 "o"
+# endif
+#endif
+#if !defined SCNuFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define SCNuFAST32 SCNu64
+# else
+# define SCNuFAST32 "u"
+# endif
+#endif
+#if !defined SCNxFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define SCNxFAST32 SCNx64
+# else
+# define SCNxFAST32 "x"
+# endif
+#endif
+#ifdef INT64_MAX
+# if !defined SCNdFAST64
+# define SCNdFAST64 SCNd64
+# endif
+# if !defined SCNiFAST64
+# define SCNiFAST64 SCNi64
+# endif
+#endif
+#ifdef UINT64_MAX
+# if !defined SCNoFAST64
+# define SCNoFAST64 SCNo64
+# endif
+# if !defined SCNuFAST64
+# define SCNuFAST64 SCNu64
+# endif
+# if !defined SCNxFAST64
+# define SCNxFAST64 SCNx64
+# endif
+#endif
+
+#if !defined SCNdMAX
+# if @INT32_MAX_LT_INTMAX_MAX@
+# define SCNdMAX SCNd64
+# else
+# define SCNdMAX "ld"
+# endif
+#endif
+#if !defined SCNiMAX
+# if @INT32_MAX_LT_INTMAX_MAX@
+# define SCNiMAX SCNi64
+# else
+# define SCNiMAX "li"
+# endif
+#endif
+#if !defined SCNoMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define SCNoMAX SCNo64
+# else
+# define SCNoMAX "lo"
+# endif
+#endif
+#if !defined SCNuMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define SCNuMAX SCNu64
+# else
+# define SCNuMAX "lu"
+# endif
+#endif
+#if !defined SCNxMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define SCNxMAX SCNx64
+# else
+# define SCNxMAX "lx"
+# endif
+#endif
+
+#if !defined SCNdPTR
+# ifdef INTPTR_MAX
+# define SCNdPTR @PRIPTR_PREFIX@ "d"
+# endif
+#endif
+#if !defined SCNiPTR
+# ifdef INTPTR_MAX
+# define SCNiPTR @PRIPTR_PREFIX@ "i"
+# endif
+#endif
+#if !defined SCNoPTR
+# ifdef UINTPTR_MAX
+# define SCNoPTR @PRIPTR_PREFIX@ "o"
+# endif
+#endif
+#if !defined SCNuPTR
+# ifdef UINTPTR_MAX
+# define SCNuPTR @PRIPTR_PREFIX@ "u"
+# endif
+#endif
+#if !defined SCNxPTR
+# ifdef UINTPTR_MAX
+# define SCNxPTR @PRIPTR_PREFIX@ "x"
+# endif
+#endif
+
+/* 7.8.2 Functions for greatest-width integer types */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if @GNULIB_IMAXABS@
+# if @REPLACE_IMAXABS@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef imaxabs
+# define imaxabs rpl_imaxabs
+# endif
+_GL_FUNCDECL_RPL (imaxabs, intmax_t, (intmax_t x));
+_GL_CXXALIAS_RPL (imaxabs, intmax_t, (intmax_t x));
+# else
+# if !@HAVE_DECL_IMAXABS@
+_GL_FUNCDECL_SYS (imaxabs, intmax_t, (intmax_t x));
+# endif
+_GL_CXXALIAS_SYS (imaxabs, intmax_t, (intmax_t x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (imaxabs);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef imaxabs
+# if HAVE_RAW_DECL_IMAXABS
+_GL_WARN_ON_USE (imaxabs, "imaxabs is unportable - "
+ "use gnulib module imaxabs for portability");
+# endif
+#endif
+
+#if @GNULIB_IMAXDIV@
+# if !@HAVE_IMAXDIV_T@
+# if !GNULIB_defined_imaxdiv_t
+typedef struct { intmax_t quot; intmax_t rem; } imaxdiv_t;
+# define GNULIB_defined_imaxdiv_t 1
+# endif
+# endif
+# if @REPLACE_IMAXDIV@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef imaxdiv
+# define imaxdiv rpl_imaxdiv
+# endif
+_GL_FUNCDECL_RPL (imaxdiv, imaxdiv_t, (intmax_t numer, intmax_t denom));
+_GL_CXXALIAS_RPL (imaxdiv, imaxdiv_t, (intmax_t numer, intmax_t denom));
+# else
+# if !@HAVE_DECL_IMAXDIV@
+_GL_FUNCDECL_SYS (imaxdiv, imaxdiv_t, (intmax_t numer, intmax_t denom));
+# endif
+_GL_CXXALIAS_SYS (imaxdiv, imaxdiv_t, (intmax_t numer, intmax_t denom));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (imaxdiv);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef imaxdiv
+# if HAVE_RAW_DECL_IMAXDIV
+_GL_WARN_ON_USE (imaxdiv, "imaxdiv is unportable - "
+ "use gnulib module imaxdiv for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOIMAX@
+# if @REPLACE_STRTOIMAX@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strtoimax
+# define strtoimax rpl_strtoimax
+# endif
+_GL_FUNCDECL_RPL (strtoimax, intmax_t,
+ (const char *restrict, char **restrict, int)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtoimax, intmax_t,
+ (const char *restrict, char **restrict, int));
+# else
+# if !@HAVE_DECL_STRTOIMAX@
+# undef strtoimax
+_GL_FUNCDECL_SYS (strtoimax, intmax_t,
+ (const char *restrict, char **restrict, int)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strtoimax, intmax_t,
+ (const char *restrict, char **restrict, int));
+# endif
+_GL_CXXALIASWARN (strtoimax);
+#elif defined GNULIB_POSIXCHECK
+# undef strtoimax
+# if HAVE_RAW_DECL_STRTOIMAX
+_GL_WARN_ON_USE (strtoimax, "strtoimax is unportable - "
+ "use gnulib module strtoimax for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOUMAX@
+# if @REPLACE_STRTOUMAX@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strtoumax
+# define strtoumax rpl_strtoumax
+# endif
+_GL_FUNCDECL_RPL (strtoumax, uintmax_t,
+ (const char *restrict, char **restrict, int)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtoumax, uintmax_t,
+ (const char *restrict, char **restrict, int));
+# else
+# if !@HAVE_DECL_STRTOUMAX@
+# undef strtoumax
+_GL_FUNCDECL_SYS (strtoumax, uintmax_t,
+ (const char *restrict, char **restrict, int)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strtoumax, uintmax_t,
+ (const char *restrict, char **restrict, int));
+# endif
+_GL_CXXALIASWARN (strtoumax);
+#elif defined GNULIB_POSIXCHECK
+# undef strtoumax
+# if HAVE_RAW_DECL_STRTOUMAX
+_GL_WARN_ON_USE (strtoumax, "strtoumax is unportable - "
+ "use gnulib module strtoumax for portability");
+# endif
+#endif
+
+/* Don't bother defining or declaring wcstoimax and wcstoumax, since
+ wide-character functions like this are hardly ever useful. */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !defined INTTYPES_H && !defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H */
diff --git a/lib/isnan.c b/lib/isnan.c
new file mode 100644
index 0000000..39e193b
--- /dev/null
+++ b/lib/isnan.c
@@ -0,0 +1,190 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2007-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+/* Specification. */
+#ifdef USE_LONG_DOUBLE
+/* Specification found in math.h or isnanl-nolibm.h. */
+extern int rpl_isnanl (long double x) _GL_ATTRIBUTE_CONST;
+#elif ! defined USE_FLOAT
+/* Specification found in math.h or isnand-nolibm.h. */
+extern int rpl_isnand (double x);
+#else /* defined USE_FLOAT */
+/* Specification found in math.h or isnanf-nolibm.h. */
+extern int rpl_isnanf (float x);
+#endif
+
+#include <float.h>
+#include <string.h>
+
+#include "float+.h"
+
+#ifdef USE_LONG_DOUBLE
+# define FUNC rpl_isnanl
+# define DOUBLE long double
+# define MAX_EXP LDBL_MAX_EXP
+# define MIN_EXP LDBL_MIN_EXP
+# if defined LDBL_EXPBIT0_WORD && defined LDBL_EXPBIT0_BIT
+# define KNOWN_EXPBIT0_LOCATION
+# define EXPBIT0_WORD LDBL_EXPBIT0_WORD
+# define EXPBIT0_BIT LDBL_EXPBIT0_BIT
+# endif
+# define SIZE SIZEOF_LDBL
+# define L_(literal) literal##L
+#elif ! defined USE_FLOAT
+# define FUNC rpl_isnand
+# define DOUBLE double
+# define MAX_EXP DBL_MAX_EXP
+# define MIN_EXP DBL_MIN_EXP
+# if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT
+# define KNOWN_EXPBIT0_LOCATION
+# define EXPBIT0_WORD DBL_EXPBIT0_WORD
+# define EXPBIT0_BIT DBL_EXPBIT0_BIT
+# endif
+# define SIZE SIZEOF_DBL
+# define L_(literal) literal
+#else /* defined USE_FLOAT */
+# define FUNC rpl_isnanf
+# define DOUBLE float
+# define MAX_EXP FLT_MAX_EXP
+# define MIN_EXP FLT_MIN_EXP
+# if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
+# define KNOWN_EXPBIT0_LOCATION
+# define EXPBIT0_WORD FLT_EXPBIT0_WORD
+# define EXPBIT0_BIT FLT_EXPBIT0_BIT
+# endif
+# define SIZE SIZEOF_FLT
+# define L_(literal) literal##f
+#endif
+
+#define EXP_MASK ((MAX_EXP - MIN_EXP) | 7)
+
+#define NWORDS \
+ ((sizeof (DOUBLE) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { DOUBLE value; unsigned int word[NWORDS]; } memory_double;
+
+/* Most hosts nowadays use IEEE floating point, so they use IEC 60559
+ representations, have infinities and NaNs, and do not trap on
+ exceptions. Define IEEE_FLOATING_POINT if this host is one of the
+ typical ones. The C23 macro __STDC_IEC_60559_BFP__ macro (or its cousin,
+ the now-obsolescent C11 macro __STDC_IEC_559__) is close to what is
+ wanted here, but is not quite right because this file does not require
+ all the features of C23 Annex F (and works even with pre-C11 platforms,
+ for that matter). */
+
+#define IEEE_FLOATING_POINT (FLT_RADIX == 2 && FLT_MANT_DIG == 24 \
+ && FLT_MIN_EXP == -125 && FLT_MAX_EXP == 128)
+
+int
+FUNC (DOUBLE x)
+{
+#if defined KNOWN_EXPBIT0_LOCATION && IEEE_FLOATING_POINT
+# if defined USE_LONG_DOUBLE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+ /* Special CPU dependent code is needed to treat bit patterns outside the
+ IEEE 754 specification (such as Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals) as NaNs.
+ These bit patterns are:
+ - exponent = 0x0001..0x7FFF, mantissa bit 63 = 0,
+ - exponent = 0x0000, mantissa bit 63 = 1.
+ The NaN bit pattern is:
+ - exponent = 0x7FFF, mantissa >= 0x8000000000000001. */
+ memory_double m;
+ unsigned int exponent;
+
+ m.value = x;
+ exponent = (m.word[EXPBIT0_WORD] >> EXPBIT0_BIT) & EXP_MASK;
+# ifdef WORDS_BIGENDIAN
+ /* Big endian: EXPBIT0_WORD = 0, EXPBIT0_BIT = 16. */
+ if (exponent == 0)
+ return 1 & (m.word[0] >> 15);
+ else if (exponent == EXP_MASK)
+ return (((m.word[0] ^ 0x8000U) << 16) | m.word[1] | (m.word[2] >> 16)) != 0;
+ else
+ return 1 & ~(m.word[0] >> 15);
+# else
+ /* Little endian: EXPBIT0_WORD = 2, EXPBIT0_BIT = 0. */
+ if (exponent == 0)
+ return (m.word[1] >> 31);
+ else if (exponent == EXP_MASK)
+ return ((m.word[1] ^ 0x80000000U) | m.word[0]) != 0;
+ else
+ return (m.word[1] >> 31) ^ 1;
+# endif
+# else
+ /* Be careful to not do any floating-point operation on x, such as x == x,
+ because x may be a signaling NaN. */
+# if defined __SUNPRO_C || defined __ICC || defined _MSC_VER \
+ || defined __DECC || defined __TINYC__ \
+ || (defined __sgi && !defined __GNUC__)
+ /* The Sun C 5.0, Intel ICC 10.0, Microsoft Visual C/C++ 9.0, Compaq (ex-DEC)
+ 6.4, and TinyCC compilers don't recognize the initializers as constant
+ expressions. The Compaq compiler also fails when constant-folding
+ 0.0 / 0.0 even when constant-folding is not required. The Microsoft
+ Visual C/C++ compiler also fails when constant-folding 1.0 / 0.0 even
+ when constant-folding is not required. The SGI MIPSpro C compiler
+ complains about "floating-point operation result is out of range". */
+ static DOUBLE zero = L_(0.0);
+ memory_double nan;
+ DOUBLE plus_inf = L_(1.0) / zero;
+ DOUBLE minus_inf = -L_(1.0) / zero;
+ nan.value = zero / zero;
+# else
+ static memory_double nan = { L_(0.0) / L_(0.0) };
+ static DOUBLE plus_inf = L_(1.0) / L_(0.0);
+ static DOUBLE minus_inf = -L_(1.0) / L_(0.0);
+# endif
+ {
+ memory_double m;
+
+ /* A NaN can be recognized through its exponent. But exclude +Infinity and
+ -Infinity, which have the same exponent. */
+ m.value = x;
+ if (((m.word[EXPBIT0_WORD] ^ nan.word[EXPBIT0_WORD])
+ & (EXP_MASK << EXPBIT0_BIT))
+ == 0)
+ return (memcmp (&m.value, &plus_inf, SIZE) != 0
+ && memcmp (&m.value, &minus_inf, SIZE) != 0);
+ else
+ return 0;
+ }
+# endif
+#else
+ /* The configuration did not find sufficient information, or does
+ not use IEEE floating point. Give up about the signaling NaNs;
+ handle only the quiet NaNs. */
+ if (x == x)
+ {
+# if defined USE_LONG_DOUBLE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+ /* Detect any special bit patterns that pass ==; see comment above. */
+ memory_double m1;
+ memory_double m2;
+
+ memset (&m1.value, 0, SIZE);
+ memset (&m2.value, 0, SIZE);
+ m1.value = x;
+ m2.value = x + (x ? 0.0L : -0.0L);
+ if (memcmp (&m1.value, &m2.value, SIZE) != 0)
+ return 1;
+# endif
+ return 0;
+ }
+ else
+ return 1;
+#endif
+}
diff --git a/lib/isnand-nolibm.h b/lib/isnand-nolibm.h
new file mode 100644
index 0000000..9c75a8c
--- /dev/null
+++ b/lib/isnand-nolibm.h
@@ -0,0 +1,33 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2007-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#if HAVE_ISNAND_IN_LIBC
+/* Get declaration of isnan macro. */
+# include <math.h>
+# if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+ /* GCC >= 4.0 and clang provide a type-generic built-in for isnan. */
+# undef isnand
+# define isnand(x) __builtin_isnan ((double)(x))
+# else
+# undef isnand
+# define isnand(x) isnan ((double)(x))
+# endif
+#else
+/* Test whether X is a NaN. */
+# undef isnand
+# define isnand rpl_isnand
+extern int isnand (double x);
+#endif
diff --git a/lib/isnand.c b/lib/isnand.c
new file mode 100644
index 0000000..e14d2e6
--- /dev/null
+++ b/lib/isnand.c
@@ -0,0 +1,19 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2008-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include "isnan.c"
diff --git a/lib/isnanf-nolibm.h b/lib/isnanf-nolibm.h
new file mode 100644
index 0000000..cc6b419
--- /dev/null
+++ b/lib/isnanf-nolibm.h
@@ -0,0 +1,41 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2007-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#if HAVE_ISNANF_IN_LIBC
+/* Get declaration of isnan macro or (older) isnanf function. */
+# include <math.h>
+# if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+ /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.
+ GCC >= 4.0 also provides __builtin_isnanf, but clang doesn't. */
+# undef isnanf
+# define isnanf(x) __builtin_isnan ((float)(x))
+# elif defined isnan
+# undef isnanf
+# define isnanf(x) isnan ((float)(x))
+# else
+ /* Get declaration of isnanf(), if not declared in <math.h>. */
+# if defined __sgi
+ /* We can't include <ieeefp.h>, because it conflicts with our definition of
+ isnand. Therefore declare isnanf separately. */
+extern int isnanf (float x);
+# endif
+# endif
+#else
+/* Test whether X is a NaN. */
+# undef isnanf
+# define isnanf rpl_isnanf
+extern int isnanf (float x);
+#endif
diff --git a/lib/isnanf.c b/lib/isnanf.c
new file mode 100644
index 0000000..55252ca
--- /dev/null
+++ b/lib/isnanf.c
@@ -0,0 +1,20 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#define USE_FLOAT
+#include "isnan.c"
diff --git a/lib/isnanl-nolibm.h b/lib/isnanl-nolibm.h
new file mode 100644
index 0000000..f04c489
--- /dev/null
+++ b/lib/isnanl-nolibm.h
@@ -0,0 +1,34 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2007-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#if HAVE_ISNANL_IN_LIBC
+/* Get declaration of isnan macro or (older) isnanl function. */
+# include <math.h>
+# if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+ /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.
+ GCC >= 4.0 also provides __builtin_isnanl, but clang doesn't. */
+# undef isnanl
+# define isnanl(x) __builtin_isnan ((long double)(x))
+# elif defined isnan
+# undef isnanl
+# define isnanl(x) isnan ((long double)(x))
+# endif
+#else
+/* Test whether X is a NaN. */
+# undef isnanl
+# define isnanl rpl_isnanl
+extern int isnanl (long double x);
+#endif
diff --git a/lib/isnanl.c b/lib/isnanl.c
new file mode 100644
index 0000000..286f245
--- /dev/null
+++ b/lib/isnanl.c
@@ -0,0 +1,20 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#define USE_LONG_DOUBLE
+#include "isnan.c"
diff --git a/lib/itold.c b/lib/itold.c
new file mode 100644
index 0000000..0ef4464
--- /dev/null
+++ b/lib/itold.c
@@ -0,0 +1,28 @@
+/* Replacement for 'int' to 'long double' conversion routine.
+ Copyright (C) 2011-2023 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <float.h>
+
+void
+_Qp_itoq (long double *result, int a)
+{
+ /* Convert from 'int' to 'double', then from 'double' to 'long double'. */
+ *result = (double) a;
+}
diff --git a/lib/limits.in.h b/lib/limits.in.h
new file mode 100644
index 0000000..eaeac47
--- /dev/null
+++ b/lib/limits.in.h
@@ -0,0 +1,131 @@
+/* A GNU-like <limits.h>.
+
+ Copyright 2016-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined _GL_ALREADY_INCLUDING_LIMITS_H
+/* Special invocation convention:
+ On Haiku/x86_64, we have a sequence of nested includes
+ <limits.h> -> <syslimits.h> -> <limits.h>.
+ In this situation, LONG_MAX and INT_MAX are not yet defined,
+ therefore we should not attempt to define LONG_BIT. */
+
+#@INCLUDE_NEXT@ @NEXT_LIMITS_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_LIMITS_H
+
+# define _GL_ALREADY_INCLUDING_LIMITS_H
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_LIMITS_H@
+
+# undef _GL_ALREADY_INCLUDING_LIMITS_H
+
+#ifndef _@GUARD_PREFIX@_LIMITS_H
+#define _@GUARD_PREFIX@_LIMITS_H
+
+#ifndef LLONG_MIN
+# if defined LONG_LONG_MIN /* HP-UX 11.31 */
+# define LLONG_MIN LONG_LONG_MIN
+# elif defined LONGLONG_MIN /* IRIX 6.5 */
+# define LLONG_MIN LONGLONG_MIN
+# elif defined __GNUC__
+# define LLONG_MIN (- __LONG_LONG_MAX__ - 1LL)
+# endif
+#endif
+#ifndef LLONG_MAX
+# if defined LONG_LONG_MAX /* HP-UX 11.31 */
+# define LLONG_MAX LONG_LONG_MAX
+# elif defined LONGLONG_MAX /* IRIX 6.5 */
+# define LLONG_MAX LONGLONG_MAX
+# elif defined __GNUC__
+# define LLONG_MAX __LONG_LONG_MAX__
+# endif
+#endif
+#ifndef ULLONG_MAX
+# if defined ULONG_LONG_MAX /* HP-UX 11.31 */
+# define ULLONG_MAX ULONG_LONG_MAX
+# elif defined ULONGLONG_MAX /* IRIX 6.5 */
+# define ULLONG_MAX ULONGLONG_MAX
+# elif defined __GNUC__
+# define ULLONG_MAX (__LONG_LONG_MAX__ * 2ULL + 1ULL)
+# endif
+#endif
+
+/* The number of usable bits in an unsigned or signed integer type
+ with minimum value MIN and maximum value MAX, as an int expression
+ suitable in #if. Cover all known practical hosts. This
+ implementation exploits the fact that MAX is 1 less than a power of
+ 2, and merely counts the number of 1 bits in MAX; "COBn" means
+ "count the number of 1 bits in the low-order n bits"). */
+#define _GL_INTEGER_WIDTH(min, max) (((min) < 0) + _GL_COB128 (max))
+#define _GL_COB128(n) (_GL_COB64 ((n) >> 31 >> 31 >> 2) + _GL_COB64 (n))
+#define _GL_COB64(n) (_GL_COB32 ((n) >> 31 >> 1) + _GL_COB32 (n))
+#define _GL_COB32(n) (_GL_COB16 ((n) >> 16) + _GL_COB16 (n))
+#define _GL_COB16(n) (_GL_COB8 ((n) >> 8) + _GL_COB8 (n))
+#define _GL_COB8(n) (_GL_COB4 ((n) >> 4) + _GL_COB4 (n))
+#define _GL_COB4(n) (!!((n) & 8) + !!((n) & 4) + !!((n) & 2) + !!((n) & 1))
+
+#ifndef WORD_BIT
+/* Assume 'int' is 32 bits wide. */
+# define WORD_BIT 32
+#endif
+#ifndef LONG_BIT
+/* Assume 'long' is 32 or 64 bits wide. */
+# if LONG_MAX == INT_MAX
+# define LONG_BIT 32
+# else
+# define LONG_BIT 64
+# endif
+#endif
+
+/* Macros specified by C23 and by ISO/IEC TS 18661-1:2014. */
+
+#if (! defined ULLONG_WIDTH \
+ && (defined _GNU_SOURCE || defined __STDC_WANT_IEC_60559_BFP_EXT__ \
+ || (defined __STDC_VERSION__ && 201710 < __STDC_VERSION__)))
+# define CHAR_WIDTH _GL_INTEGER_WIDTH (CHAR_MIN, CHAR_MAX)
+# define SCHAR_WIDTH _GL_INTEGER_WIDTH (SCHAR_MIN, SCHAR_MAX)
+# define UCHAR_WIDTH _GL_INTEGER_WIDTH (0, UCHAR_MAX)
+# define SHRT_WIDTH _GL_INTEGER_WIDTH (SHRT_MIN, SHRT_MAX)
+# define USHRT_WIDTH _GL_INTEGER_WIDTH (0, USHRT_MAX)
+# define INT_WIDTH _GL_INTEGER_WIDTH (INT_MIN, INT_MAX)
+# define UINT_WIDTH _GL_INTEGER_WIDTH (0, UINT_MAX)
+# define LONG_WIDTH _GL_INTEGER_WIDTH (LONG_MIN, LONG_MAX)
+# define ULONG_WIDTH _GL_INTEGER_WIDTH (0, ULONG_MAX)
+# define LLONG_WIDTH _GL_INTEGER_WIDTH (LLONG_MIN, LLONG_MAX)
+# define ULLONG_WIDTH _GL_INTEGER_WIDTH (0, ULLONG_MAX)
+#endif
+
+/* Macros specified by C23. */
+
+#if (! defined BOOL_WIDTH \
+ && (defined _GNU_SOURCE \
+ || (defined __STDC_VERSION__ && 201710 < __STDC_VERSION__)))
+# define BOOL_MAX 1
+# define BOOL_WIDTH 1
+#endif
+
+#endif /* _@GUARD_PREFIX@_LIMITS_H */
+#endif /* _@GUARD_PREFIX@_LIMITS_H */
+#endif
diff --git a/lib/localcharset.c b/lib/localcharset.c
new file mode 100644
index 0000000..7ed9c95
--- /dev/null
+++ b/lib/localcharset.c
@@ -0,0 +1,1159 @@
+/* Determine a canonical name for the current locale's character encoding.
+
+ Copyright (C) 2000-2006, 2008-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "localcharset.h"
+
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#if defined __APPLE__ && defined __MACH__ && HAVE_LANGINFO_CODESET
+# define DARWIN7 /* Darwin 7 or newer, i.e. Mac OS X 10.3 or newer */
+#endif
+
+#if defined _WIN32 && !defined __CYGWIN__
+# define WINDOWS_NATIVE
+# include <locale.h>
+#endif
+
+#if defined __EMX__
+/* Assume EMX program runs on OS/2, even if compiled under DOS. */
+# ifndef OS2
+# define OS2
+# endif
+#endif
+
+#if !defined WINDOWS_NATIVE
+# if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+# else
+# if 0 /* see comment regarding use of setlocale(), below */
+# include <locale.h>
+# endif
+# endif
+# ifdef __CYGWIN__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# endif
+#elif defined WINDOWS_NATIVE
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+ /* For the use of setlocale() below, the Gnulib override in setlocale.c is
+ not needed; see the platform lists in setlocale_null.m4. */
+# undef setlocale
+#endif
+#if defined OS2
+# define INCL_DOS
+# include <os2.h>
+#endif
+
+/* For MB_CUR_MAX_L */
+#if defined DARWIN7
+# include <xlocale.h>
+#endif
+
+
+#if HAVE_LANGINFO_CODESET || defined WINDOWS_NATIVE || defined OS2
+
+/* On these platforms, we use a mapping from non-canonical encoding name
+ to GNU canonical encoding name. */
+
+/* With glibc-2.1 or newer, we don't need any canonicalization,
+ because glibc has iconv and both glibc and libiconv support all
+ GNU canonical names directly. */
+# if !((defined __GNU_LIBRARY__ && __GLIBC__ >= 2) || defined __UCLIBC__)
+
+struct table_entry
+{
+ const char alias[11+1];
+ const char canonical[11+1];
+};
+
+/* Table of platform-dependent mappings, sorted in ascending order. */
+static const struct table_entry alias_table[] =
+ {
+# if defined __FreeBSD__ /* FreeBSD */
+ /*{ "ARMSCII-8", "ARMSCII-8" },*/
+ { "Big5", "BIG5" },
+ { "C", "ASCII" },
+ /*{ "CP1131", "CP1131" },*/
+ /*{ "CP1251", "CP1251" },*/
+ /*{ "CP866", "CP866" },*/
+ /*{ "GB18030", "GB18030" },*/
+ /*{ "GB2312", "GB2312" },*/
+ /*{ "GBK", "GBK" },*/
+ /*{ "ISCII-DEV", "?" },*/
+ { "ISO8859-1", "ISO-8859-1" },
+ { "ISO8859-13", "ISO-8859-13" },
+ { "ISO8859-15", "ISO-8859-15" },
+ { "ISO8859-2", "ISO-8859-2" },
+ { "ISO8859-5", "ISO-8859-5" },
+ { "ISO8859-7", "ISO-8859-7" },
+ { "ISO8859-9", "ISO-8859-9" },
+ /*{ "KOI8-R", "KOI8-R" },*/
+ /*{ "KOI8-U", "KOI8-U" },*/
+ { "SJIS", "SHIFT_JIS" },
+ { "US-ASCII", "ASCII" },
+ { "eucCN", "GB2312" },
+ { "eucJP", "EUC-JP" },
+ { "eucKR", "EUC-KR" }
+# define alias_table_defined
+# endif
+# if defined __NetBSD__ /* NetBSD */
+ { "646", "ASCII" },
+ /*{ "ARMSCII-8", "ARMSCII-8" },*/
+ /*{ "BIG5", "BIG5" },*/
+ { "Big5-HKSCS", "BIG5-HKSCS" },
+ /*{ "CP1251", "CP1251" },*/
+ /*{ "CP866", "CP866" },*/
+ /*{ "GB18030", "GB18030" },*/
+ /*{ "GB2312", "GB2312" },*/
+ { "ISO8859-1", "ISO-8859-1" },
+ { "ISO8859-13", "ISO-8859-13" },
+ { "ISO8859-15", "ISO-8859-15" },
+ { "ISO8859-2", "ISO-8859-2" },
+ { "ISO8859-4", "ISO-8859-4" },
+ { "ISO8859-5", "ISO-8859-5" },
+ { "ISO8859-7", "ISO-8859-7" },
+ /*{ "KOI8-R", "KOI8-R" },*/
+ /*{ "KOI8-U", "KOI8-U" },*/
+ /*{ "PT154", "PT154" },*/
+ { "SJIS", "SHIFT_JIS" },
+ { "eucCN", "GB2312" },
+ { "eucJP", "EUC-JP" },
+ { "eucKR", "EUC-KR" },
+ { "eucTW", "EUC-TW" }
+# define alias_table_defined
+# endif
+# if defined __OpenBSD__ /* OpenBSD */
+ { "646", "ASCII" },
+ { "ISO8859-1", "ISO-8859-1" },
+ { "ISO8859-13", "ISO-8859-13" },
+ { "ISO8859-15", "ISO-8859-15" },
+ { "ISO8859-2", "ISO-8859-2" },
+ { "ISO8859-4", "ISO-8859-4" },
+ { "ISO8859-5", "ISO-8859-5" },
+ { "ISO8859-7", "ISO-8859-7" },
+ { "US-ASCII", "ASCII" }
+# define alias_table_defined
+# endif
+# if defined __APPLE__ && defined __MACH__ /* Mac OS X */
+ /* Darwin 7.5 has nl_langinfo(CODESET), but sometimes its value is
+ useless:
+ - It returns the empty string when LANG is set to a locale of the
+ form ll_CC, although ll_CC/LC_CTYPE is a symlink to an UTF-8
+ LC_CTYPE file.
+ - The environment variables LANG, LC_CTYPE, LC_ALL are not set by
+ the system; nl_langinfo(CODESET) returns "US-ASCII" in this case.
+ - The documentation says:
+ "... all code that calls BSD system routines should ensure
+ that the const *char parameters of these routines are in UTF-8
+ encoding. All BSD system functions expect their string
+ parameters to be in UTF-8 encoding and nothing else."
+ It also says
+ "An additional caveat is that string parameters for files,
+ paths, and other file-system entities must be in canonical
+ UTF-8. In a canonical UTF-8 Unicode string, all decomposable
+ characters are decomposed ..."
+ but this is not true: You can pass non-decomposed UTF-8 strings
+ to file system functions, and it is the OS which will convert
+ them to decomposed UTF-8 before accessing the file system.
+ - The Apple Terminal application displays UTF-8 by default.
+ - However, other applications are free to use different encodings:
+ - xterm uses ISO-8859-1 by default.
+ - TextEdit uses MacRoman by default.
+ We prefer UTF-8 over decomposed UTF-8-MAC because one should
+ minimize the use of decomposed Unicode. Unfortunately, through the
+ Darwin file system, decomposed UTF-8 strings are leaked into user
+ space nevertheless.
+ Then there are also the locales with encodings other than US-ASCII
+ and UTF-8. These locales can be occasionally useful to users (e.g.
+ when grepping through ISO-8859-1 encoded text files), when all their
+ file names are in US-ASCII.
+ */
+ { "ARMSCII-8", "ARMSCII-8" },
+ { "Big5", "BIG5" },
+ { "Big5HKSCS", "BIG5-HKSCS" },
+ { "CP1131", "CP1131" },
+ { "CP1251", "CP1251" },
+ { "CP866", "CP866" },
+ { "CP949", "CP949" },
+ { "GB18030", "GB18030" },
+ { "GB2312", "GB2312" },
+ { "GBK", "GBK" },
+ /*{ "ISCII-DEV", "?" },*/
+ { "ISO8859-1", "ISO-8859-1" },
+ { "ISO8859-13", "ISO-8859-13" },
+ { "ISO8859-15", "ISO-8859-15" },
+ { "ISO8859-2", "ISO-8859-2" },
+ { "ISO8859-4", "ISO-8859-4" },
+ { "ISO8859-5", "ISO-8859-5" },
+ { "ISO8859-7", "ISO-8859-7" },
+ { "ISO8859-9", "ISO-8859-9" },
+ { "KOI8-R", "KOI8-R" },
+ { "KOI8-U", "KOI8-U" },
+ { "PT154", "PT154" },
+ { "SJIS", "SHIFT_JIS" },
+ { "eucCN", "GB2312" },
+ { "eucJP", "EUC-JP" },
+ { "eucKR", "EUC-KR" }
+# define alias_table_defined
+# endif
+# if defined _AIX /* AIX */
+ /*{ "GBK", "GBK" },*/
+ { "IBM-1046", "CP1046" },
+ { "IBM-1124", "CP1124" },
+ { "IBM-1129", "CP1129" },
+ { "IBM-1252", "CP1252" },
+ { "IBM-850", "CP850" },
+ { "IBM-856", "CP856" },
+ { "IBM-921", "ISO-8859-13" },
+ { "IBM-922", "CP922" },
+ { "IBM-932", "CP932" },
+ { "IBM-943", "CP943" },
+ { "IBM-eucCN", "GB2312" },
+ { "IBM-eucJP", "EUC-JP" },
+ { "IBM-eucKR", "EUC-KR" },
+ { "IBM-eucTW", "EUC-TW" },
+ { "ISO8859-1", "ISO-8859-1" },
+ { "ISO8859-15", "ISO-8859-15" },
+ { "ISO8859-2", "ISO-8859-2" },
+ { "ISO8859-5", "ISO-8859-5" },
+ { "ISO8859-6", "ISO-8859-6" },
+ { "ISO8859-7", "ISO-8859-7" },
+ { "ISO8859-8", "ISO-8859-8" },
+ { "ISO8859-9", "ISO-8859-9" },
+ { "TIS-620", "TIS-620" },
+ /*{ "UTF-8", "UTF-8" },*/
+ { "big5", "BIG5" }
+# define alias_table_defined
+# endif
+# if defined __hpux /* HP-UX */
+ { "SJIS", "SHIFT_JIS" },
+ { "arabic8", "HP-ARABIC8" },
+ { "big5", "BIG5" },
+ { "cp1251", "CP1251" },
+ { "eucJP", "EUC-JP" },
+ { "eucKR", "EUC-KR" },
+ { "eucTW", "EUC-TW" },
+ { "gb18030", "GB18030" },
+ { "greek8", "HP-GREEK8" },
+ { "hebrew8", "HP-HEBREW8" },
+ { "hkbig5", "BIG5-HKSCS" },
+ { "hp15CN", "GB2312" },
+ { "iso88591", "ISO-8859-1" },
+ { "iso885913", "ISO-8859-13" },
+ { "iso885915", "ISO-8859-15" },
+ { "iso88592", "ISO-8859-2" },
+ { "iso88594", "ISO-8859-4" },
+ { "iso88595", "ISO-8859-5" },
+ { "iso88596", "ISO-8859-6" },
+ { "iso88597", "ISO-8859-7" },
+ { "iso88598", "ISO-8859-8" },
+ { "iso88599", "ISO-8859-9" },
+ { "kana8", "HP-KANA8" },
+ { "koi8r", "KOI8-R" },
+ { "roman8", "HP-ROMAN8" },
+ { "tis620", "TIS-620" },
+ { "turkish8", "HP-TURKISH8" },
+ { "utf8", "UTF-8" }
+# define alias_table_defined
+# endif
+# if defined __sgi /* IRIX */
+ { "ISO8859-1", "ISO-8859-1" },
+ { "ISO8859-15", "ISO-8859-15" },
+ { "ISO8859-2", "ISO-8859-2" },
+ { "ISO8859-5", "ISO-8859-5" },
+ { "ISO8859-7", "ISO-8859-7" },
+ { "ISO8859-9", "ISO-8859-9" },
+ { "eucCN", "GB2312" },
+ { "eucJP", "EUC-JP" },
+ { "eucKR", "EUC-KR" },
+ { "eucTW", "EUC-TW" }
+# define alias_table_defined
+# endif
+# if defined __osf__ /* OSF/1 */
+ /*{ "GBK", "GBK" },*/
+ { "ISO8859-1", "ISO-8859-1" },
+ { "ISO8859-15", "ISO-8859-15" },
+ { "ISO8859-2", "ISO-8859-2" },
+ { "ISO8859-4", "ISO-8859-4" },
+ { "ISO8859-5", "ISO-8859-5" },
+ { "ISO8859-7", "ISO-8859-7" },
+ { "ISO8859-8", "ISO-8859-8" },
+ { "ISO8859-9", "ISO-8859-9" },
+ { "KSC5601", "CP949" },
+ { "SJIS", "SHIFT_JIS" },
+ { "TACTIS", "TIS-620" },
+ /*{ "UTF-8", "UTF-8" },*/
+ { "big5", "BIG5" },
+ { "cp850", "CP850" },
+ { "dechanyu", "DEC-HANYU" },
+ { "dechanzi", "GB2312" },
+ { "deckanji", "DEC-KANJI" },
+ { "deckorean", "EUC-KR" },
+ { "eucJP", "EUC-JP" },
+ { "eucKR", "EUC-KR" },
+ { "eucTW", "EUC-TW" },
+ { "sdeckanji", "EUC-JP" }
+# define alias_table_defined
+# endif
+# if defined __sun /* Solaris */
+ { "5601", "EUC-KR" },
+ { "646", "ASCII" },
+ /*{ "BIG5", "BIG5" },*/
+ { "Big5-HKSCS", "BIG5-HKSCS" },
+ { "GB18030", "GB18030" },
+ /*{ "GBK", "GBK" },*/
+ { "ISO8859-1", "ISO-8859-1" },
+ { "ISO8859-11", "TIS-620" },
+ { "ISO8859-13", "ISO-8859-13" },
+ { "ISO8859-15", "ISO-8859-15" },
+ { "ISO8859-2", "ISO-8859-2" },
+ { "ISO8859-3", "ISO-8859-3" },
+ { "ISO8859-4", "ISO-8859-4" },
+ { "ISO8859-5", "ISO-8859-5" },
+ { "ISO8859-6", "ISO-8859-6" },
+ { "ISO8859-7", "ISO-8859-7" },
+ { "ISO8859-8", "ISO-8859-8" },
+ { "ISO8859-9", "ISO-8859-9" },
+ { "PCK", "SHIFT_JIS" },
+ { "TIS620.2533", "TIS-620" },
+ /*{ "UTF-8", "UTF-8" },*/
+ { "ansi-1251", "CP1251" },
+ { "cns11643", "EUC-TW" },
+ { "eucJP", "EUC-JP" },
+ { "gb2312", "GB2312" },
+ { "koi8-r", "KOI8-R" }
+# define alias_table_defined
+# endif
+# if defined __minix /* Minix */
+ { "646", "ASCII" }
+# define alias_table_defined
+# endif
+# if defined WINDOWS_NATIVE || defined __CYGWIN__ /* Windows */
+ { "CP1361", "JOHAB" },
+ { "CP20127", "ASCII" },
+ { "CP20866", "KOI8-R" },
+ { "CP20936", "GB2312" },
+ { "CP21866", "KOI8-RU" },
+ { "CP28591", "ISO-8859-1" },
+ { "CP28592", "ISO-8859-2" },
+ { "CP28593", "ISO-8859-3" },
+ { "CP28594", "ISO-8859-4" },
+ { "CP28595", "ISO-8859-5" },
+ { "CP28596", "ISO-8859-6" },
+ { "CP28597", "ISO-8859-7" },
+ { "CP28598", "ISO-8859-8" },
+ { "CP28599", "ISO-8859-9" },
+ { "CP28605", "ISO-8859-15" },
+ { "CP38598", "ISO-8859-8" },
+ { "CP51932", "EUC-JP" },
+ { "CP51936", "GB2312" },
+ { "CP51949", "EUC-KR" },
+ { "CP51950", "EUC-TW" },
+ { "CP54936", "GB18030" },
+ { "CP65001", "UTF-8" },
+ { "CP936", "GBK" }
+# define alias_table_defined
+# endif
+# if defined OS2 /* OS/2 */
+ /* The list of encodings is taken from "List of OS/2 Codepages"
+ by Alex Taylor:
+ <http://altsan.org/os2/toolkits/uls/index.html#codepages>.
+ See also "__convcp() of kLIBC":
+ <https://github.com/bitwiseworks/libc/blob/master/src/emx/src/lib/locale/__convcp.c>. */
+ { "CP1004", "CP1252" },
+ /*{ "CP1041", "CP943" },*/
+ /*{ "CP1088", "CP949" },*/
+ { "CP1089", "ISO-8859-6" },
+ /*{ "CP1114", "CP950" },*/
+ /*{ "CP1115", "GB2312" },*/
+ { "CP1208", "UTF-8" },
+ /*{ "CP1380", "GB2312" },*/
+ { "CP1381", "GB2312" },
+ { "CP1383", "GB2312" },
+ { "CP1386", "GBK" },
+ /*{ "CP301", "CP943" },*/
+ { "CP3372", "EUC-JP" },
+ { "CP4946", "CP850" },
+ /*{ "CP5048", "JIS_X0208-1990" },*/
+ /*{ "CP5049", "JIS_X0212-1990" },*/
+ /*{ "CP5067", "KS_C_5601-1987" },*/
+ { "CP813", "ISO-8859-7" },
+ { "CP819", "ISO-8859-1" },
+ { "CP878", "KOI8-R" },
+ /*{ "CP897", "CP943" },*/
+ { "CP912", "ISO-8859-2" },
+ { "CP913", "ISO-8859-3" },
+ { "CP914", "ISO-8859-4" },
+ { "CP915", "ISO-8859-5" },
+ { "CP916", "ISO-8859-8" },
+ { "CP920", "ISO-8859-9" },
+ { "CP921", "ISO-8859-13" },
+ { "CP923", "ISO-8859-15" },
+ /*{ "CP941", "CP943" },*/
+ /*{ "CP947", "CP950" },*/
+ /*{ "CP951", "CP949" },*/
+ /*{ "CP952", "JIS_X0208-1990" },*/
+ /*{ "CP953", "JIS_X0212-1990" },*/
+ { "CP954", "EUC-JP" },
+ { "CP964", "EUC-TW" },
+ { "CP970", "EUC-KR" },
+ /*{ "CP971", "KS_C_5601-1987" },*/
+ { "IBM-1004", "CP1252" },
+ /*{ "IBM-1006", "?" },*/
+ /*{ "IBM-1008", "?" },*/
+ /*{ "IBM-1041", "CP943" },*/
+ /*{ "IBM-1051", "?" },*/
+ /*{ "IBM-1088", "CP949" },*/
+ { "IBM-1089", "ISO-8859-6" },
+ /*{ "IBM-1098", "?" },*/
+ /*{ "IBM-1114", "CP950" },*/
+ /*{ "IBM-1115", "GB2312" },*/
+ /*{ "IBM-1116", "?" },*/
+ /*{ "IBM-1117", "?" },*/
+ /*{ "IBM-1118", "?" },*/
+ /*{ "IBM-1119", "?" },*/
+ { "IBM-1124", "CP1124" },
+ { "IBM-1125", "CP1125" },
+ { "IBM-1131", "CP1131" },
+ { "IBM-1208", "UTF-8" },
+ { "IBM-1250", "CP1250" },
+ { "IBM-1251", "CP1251" },
+ { "IBM-1252", "CP1252" },
+ { "IBM-1253", "CP1253" },
+ { "IBM-1254", "CP1254" },
+ { "IBM-1255", "CP1255" },
+ { "IBM-1256", "CP1256" },
+ { "IBM-1257", "CP1257" },
+ /*{ "IBM-1275", "?" },*/
+ /*{ "IBM-1276", "?" },*/
+ /*{ "IBM-1277", "?" },*/
+ /*{ "IBM-1280", "?" },*/
+ /*{ "IBM-1281", "?" },*/
+ /*{ "IBM-1282", "?" },*/
+ /*{ "IBM-1283", "?" },*/
+ /*{ "IBM-1380", "GB2312" },*/
+ { "IBM-1381", "GB2312" },
+ { "IBM-1383", "GB2312" },
+ { "IBM-1386", "GBK" },
+ /*{ "IBM-301", "CP943" },*/
+ { "IBM-3372", "EUC-JP" },
+ { "IBM-367", "ASCII" },
+ { "IBM-437", "CP437" },
+ { "IBM-4946", "CP850" },
+ /*{ "IBM-5048", "JIS_X0208-1990" },*/
+ /*{ "IBM-5049", "JIS_X0212-1990" },*/
+ /*{ "IBM-5067", "KS_C_5601-1987" },*/
+ { "IBM-813", "ISO-8859-7" },
+ { "IBM-819", "ISO-8859-1" },
+ { "IBM-850", "CP850" },
+ /*{ "IBM-851", "?" },*/
+ { "IBM-852", "CP852" },
+ { "IBM-855", "CP855" },
+ { "IBM-856", "CP856" },
+ { "IBM-857", "CP857" },
+ /*{ "IBM-859", "?" },*/
+ { "IBM-860", "CP860" },
+ { "IBM-861", "CP861" },
+ { "IBM-862", "CP862" },
+ { "IBM-863", "CP863" },
+ { "IBM-864", "CP864" },
+ { "IBM-865", "CP865" },
+ { "IBM-866", "CP866" },
+ /*{ "IBM-868", "?" },*/
+ { "IBM-869", "CP869" },
+ { "IBM-874", "CP874" },
+ { "IBM-878", "KOI8-R" },
+ /*{ "IBM-895", "?" },*/
+ /*{ "IBM-897", "CP943" },*/
+ /*{ "IBM-907", "?" },*/
+ /*{ "IBM-909", "?" },*/
+ { "IBM-912", "ISO-8859-2" },
+ { "IBM-913", "ISO-8859-3" },
+ { "IBM-914", "ISO-8859-4" },
+ { "IBM-915", "ISO-8859-5" },
+ { "IBM-916", "ISO-8859-8" },
+ { "IBM-920", "ISO-8859-9" },
+ { "IBM-921", "ISO-8859-13" },
+ { "IBM-922", "CP922" },
+ { "IBM-923", "ISO-8859-15" },
+ { "IBM-932", "CP932" },
+ /*{ "IBM-941", "CP943" },*/
+ /*{ "IBM-942", "?" },*/
+ { "IBM-943", "CP943" },
+ /*{ "IBM-947", "CP950" },*/
+ { "IBM-949", "CP949" },
+ { "IBM-950", "CP950" },
+ /*{ "IBM-951", "CP949" },*/
+ /*{ "IBM-952", "JIS_X0208-1990" },*/
+ /*{ "IBM-953", "JIS_X0212-1990" },*/
+ { "IBM-954", "EUC-JP" },
+ /*{ "IBM-955", "?" },*/
+ { "IBM-964", "EUC-TW" },
+ { "IBM-970", "EUC-KR" },
+ /*{ "IBM-971", "KS_C_5601-1987" },*/
+ { "IBM-eucCN", "GB2312" },
+ { "IBM-eucJP", "EUC-JP" },
+ { "IBM-eucKR", "EUC-KR" },
+ { "IBM-eucTW", "EUC-TW" },
+ { "IBM33722", "EUC-JP" },
+ { "ISO8859-1", "ISO-8859-1" },
+ { "ISO8859-2", "ISO-8859-2" },
+ { "ISO8859-3", "ISO-8859-3" },
+ { "ISO8859-4", "ISO-8859-4" },
+ { "ISO8859-5", "ISO-8859-5" },
+ { "ISO8859-6", "ISO-8859-6" },
+ { "ISO8859-7", "ISO-8859-7" },
+ { "ISO8859-8", "ISO-8859-8" },
+ { "ISO8859-9", "ISO-8859-9" },
+ /*{ "JISX0201-1976", "JISX0201-1976" },*/
+ /*{ "JISX0208-1978", "?" },*/
+ /*{ "JISX0208-1983", "JIS_X0208-1983" },*/
+ /*{ "JISX0208-1990", "JIS_X0208-1990" },*/
+ /*{ "JISX0212-1990", "JIS_X0212-1990" },*/
+ /*{ "KSC5601-1987", "KS_C_5601-1987" },*/
+ { "SJIS-1", "CP943" },
+ { "SJIS-2", "CP943" },
+ { "eucJP", "EUC-JP" },
+ { "eucKR", "EUC-KR" },
+ { "eucTW-1993", "EUC-TW" }
+# define alias_table_defined
+# endif
+# if defined VMS /* OpenVMS */
+ /* The list of encodings is taken from the OpenVMS 7.3-1 documentation
+ "Compaq C Run-Time Library Reference Manual for OpenVMS systems"
+ section 10.7 "Handling Different Character Sets". */
+ { "DECHANYU", "DEC-HANYU" },
+ { "DECHANZI", "GB2312" },
+ { "DECKANJI", "DEC-KANJI" },
+ { "DECKOREAN", "EUC-KR" },
+ { "ISO8859-1", "ISO-8859-1" },
+ { "ISO8859-2", "ISO-8859-2" },
+ { "ISO8859-5", "ISO-8859-5" },
+ { "ISO8859-7", "ISO-8859-7" },
+ { "ISO8859-8", "ISO-8859-8" },
+ { "ISO8859-9", "ISO-8859-9" },
+ { "SDECKANJI", "EUC-JP" },
+ { "SJIS", "SHIFT_JIS" },
+ { "eucJP", "EUC-JP" },
+ { "eucTW", "EUC-TW" }
+# define alias_table_defined
+# endif
+# ifndef alias_table_defined
+ /* Just a dummy entry, to avoid a C syntax error. */
+ { "", "" }
+# endif
+ };
+
+# endif
+
+#else
+
+/* On these platforms, we use a mapping from locale name to GNU canonical
+ encoding name. */
+
+struct table_entry
+{
+ const char locale[17+1];
+ const char canonical[11+1];
+};
+
+/* Table of platform-dependent mappings, sorted in ascending order. */
+static const struct table_entry locale_table[] =
+ {
+# if defined __FreeBSD__ /* FreeBSD 4.2 */
+ { "cs_CZ.ISO_8859-2", "ISO-8859-2" },
+ { "da_DK.DIS_8859-15", "ISO-8859-15" },
+ { "da_DK.ISO_8859-1", "ISO-8859-1" },
+ { "de_AT.DIS_8859-15", "ISO-8859-15" },
+ { "de_AT.ISO_8859-1", "ISO-8859-1" },
+ { "de_CH.DIS_8859-15", "ISO-8859-15" },
+ { "de_CH.ISO_8859-1", "ISO-8859-1" },
+ { "de_DE.DIS_8859-15", "ISO-8859-15" },
+ { "de_DE.ISO_8859-1", "ISO-8859-1" },
+ { "en_AU.DIS_8859-15", "ISO-8859-15" },
+ { "en_AU.ISO_8859-1", "ISO-8859-1" },
+ { "en_CA.DIS_8859-15", "ISO-8859-15" },
+ { "en_CA.ISO_8859-1", "ISO-8859-1" },
+ { "en_GB.DIS_8859-15", "ISO-8859-15" },
+ { "en_GB.ISO_8859-1", "ISO-8859-1" },
+ { "en_US.DIS_8859-15", "ISO-8859-15" },
+ { "en_US.ISO_8859-1", "ISO-8859-1" },
+ { "es_ES.DIS_8859-15", "ISO-8859-15" },
+ { "es_ES.ISO_8859-1", "ISO-8859-1" },
+ { "fi_FI.DIS_8859-15", "ISO-8859-15" },
+ { "fi_FI.ISO_8859-1", "ISO-8859-1" },
+ { "fr_BE.DIS_8859-15", "ISO-8859-15" },
+ { "fr_BE.ISO_8859-1", "ISO-8859-1" },
+ { "fr_CA.DIS_8859-15", "ISO-8859-15" },
+ { "fr_CA.ISO_8859-1", "ISO-8859-1" },
+ { "fr_CH.DIS_8859-15", "ISO-8859-15" },
+ { "fr_CH.ISO_8859-1", "ISO-8859-1" },
+ { "fr_FR.DIS_8859-15", "ISO-8859-15" },
+ { "fr_FR.ISO_8859-1", "ISO-8859-1" },
+ { "hr_HR.ISO_8859-2", "ISO-8859-2" },
+ { "hu_HU.ISO_8859-2", "ISO-8859-2" },
+ { "is_IS.DIS_8859-15", "ISO-8859-15" },
+ { "is_IS.ISO_8859-1", "ISO-8859-1" },
+ { "it_CH.DIS_8859-15", "ISO-8859-15" },
+ { "it_CH.ISO_8859-1", "ISO-8859-1" },
+ { "it_IT.DIS_8859-15", "ISO-8859-15" },
+ { "it_IT.ISO_8859-1", "ISO-8859-1" },
+ { "ja_JP.EUC", "EUC-JP" },
+ { "ja_JP.SJIS", "SHIFT_JIS" },
+ { "ja_JP.Shift_JIS", "SHIFT_JIS" },
+ { "ko_KR.EUC", "EUC-KR" },
+ { "la_LN.ASCII", "ASCII" },
+ { "la_LN.DIS_8859-15", "ISO-8859-15" },
+ { "la_LN.ISO_8859-1", "ISO-8859-1" },
+ { "la_LN.ISO_8859-2", "ISO-8859-2" },
+ { "la_LN.ISO_8859-4", "ISO-8859-4" },
+ { "lt_LN.ASCII", "ASCII" },
+ { "lt_LN.DIS_8859-15", "ISO-8859-15" },
+ { "lt_LN.ISO_8859-1", "ISO-8859-1" },
+ { "lt_LN.ISO_8859-2", "ISO-8859-2" },
+ { "lt_LT.ISO_8859-4", "ISO-8859-4" },
+ { "nl_BE.DIS_8859-15", "ISO-8859-15" },
+ { "nl_BE.ISO_8859-1", "ISO-8859-1" },
+ { "nl_NL.DIS_8859-15", "ISO-8859-15" },
+ { "nl_NL.ISO_8859-1", "ISO-8859-1" },
+ { "no_NO.DIS_8859-15", "ISO-8859-15" },
+ { "no_NO.ISO_8859-1", "ISO-8859-1" },
+ { "pl_PL.ISO_8859-2", "ISO-8859-2" },
+ { "pt_PT.DIS_8859-15", "ISO-8859-15" },
+ { "pt_PT.ISO_8859-1", "ISO-8859-1" },
+ { "ru_RU.CP866", "CP866" },
+ { "ru_RU.ISO_8859-5", "ISO-8859-5" },
+ { "ru_RU.KOI8-R", "KOI8-R" },
+ { "ru_SU.CP866", "CP866" },
+ { "ru_SU.ISO_8859-5", "ISO-8859-5" },
+ { "ru_SU.KOI8-R", "KOI8-R" },
+ { "sl_SI.ISO_8859-2", "ISO-8859-2" },
+ { "sv_SE.DIS_8859-15", "ISO-8859-15" },
+ { "sv_SE.ISO_8859-1", "ISO-8859-1" },
+ { "uk_UA.KOI8-U", "KOI8-U" },
+ { "zh_CN.EUC", "GB2312" },
+ { "zh_TW.BIG5", "BIG5" },
+ { "zh_TW.Big5", "BIG5" }
+# define locale_table_defined
+# endif
+# if defined __DJGPP__ /* DOS / DJGPP 2.03 */
+ /* The encodings given here may not all be correct.
+ If you find that the encoding given for your language and
+ country is not the one your DOS machine actually uses, just
+ correct it in this file, and send a mail to
+ Juan Manuel Guerrero <juan.guerrero@gmx.de>
+ and <bug-gnulib@gnu.org>. */
+ { "C", "ASCII" },
+ { "ar", "CP864" },
+ { "ar_AE", "CP864" },
+ { "ar_DZ", "CP864" },
+ { "ar_EG", "CP864" },
+ { "ar_IQ", "CP864" },
+ { "ar_IR", "CP864" },
+ { "ar_JO", "CP864" },
+ { "ar_KW", "CP864" },
+ { "ar_MA", "CP864" },
+ { "ar_OM", "CP864" },
+ { "ar_QA", "CP864" },
+ { "ar_SA", "CP864" },
+ { "ar_SY", "CP864" },
+ { "be", "CP866" },
+ { "be_BE", "CP866" },
+ { "bg", "CP866" }, /* not CP855 ?? */
+ { "bg_BG", "CP866" }, /* not CP855 ?? */
+ { "ca", "CP850" },
+ { "ca_ES", "CP850" },
+ { "cs", "CP852" },
+ { "cs_CZ", "CP852" },
+ { "da", "CP865" }, /* not CP850 ?? */
+ { "da_DK", "CP865" }, /* not CP850 ?? */
+ { "de", "CP850" },
+ { "de_AT", "CP850" },
+ { "de_CH", "CP850" },
+ { "de_DE", "CP850" },
+ { "el", "CP869" },
+ { "el_GR", "CP869" },
+ { "en", "CP850" },
+ { "en_AU", "CP850" }, /* not CP437 ?? */
+ { "en_CA", "CP850" },
+ { "en_GB", "CP850" },
+ { "en_NZ", "CP437" },
+ { "en_US", "CP437" },
+ { "en_ZA", "CP850" }, /* not CP437 ?? */
+ { "eo", "CP850" },
+ { "eo_EO", "CP850" },
+ { "es", "CP850" },
+ { "es_AR", "CP850" },
+ { "es_BO", "CP850" },
+ { "es_CL", "CP850" },
+ { "es_CO", "CP850" },
+ { "es_CR", "CP850" },
+ { "es_CU", "CP850" },
+ { "es_DO", "CP850" },
+ { "es_EC", "CP850" },
+ { "es_ES", "CP850" },
+ { "es_GT", "CP850" },
+ { "es_HN", "CP850" },
+ { "es_MX", "CP850" },
+ { "es_NI", "CP850" },
+ { "es_PA", "CP850" },
+ { "es_PE", "CP850" },
+ { "es_PY", "CP850" },
+ { "es_SV", "CP850" },
+ { "es_UY", "CP850" },
+ { "es_VE", "CP850" },
+ { "et", "CP850" },
+ { "et_EE", "CP850" },
+ { "eu", "CP850" },
+ { "eu_ES", "CP850" },
+ { "fi", "CP850" },
+ { "fi_FI", "CP850" },
+ { "fr", "CP850" },
+ { "fr_BE", "CP850" },
+ { "fr_CA", "CP850" },
+ { "fr_CH", "CP850" },
+ { "fr_FR", "CP850" },
+ { "ga", "CP850" },
+ { "ga_IE", "CP850" },
+ { "gd", "CP850" },
+ { "gd_GB", "CP850" },
+ { "gl", "CP850" },
+ { "gl_ES", "CP850" },
+ { "he", "CP862" },
+ { "he_IL", "CP862" },
+ { "hr", "CP852" },
+ { "hr_HR", "CP852" },
+ { "hu", "CP852" },
+ { "hu_HU", "CP852" },
+ { "id", "CP850" }, /* not CP437 ?? */
+ { "id_ID", "CP850" }, /* not CP437 ?? */
+ { "is", "CP861" }, /* not CP850 ?? */
+ { "is_IS", "CP861" }, /* not CP850 ?? */
+ { "it", "CP850" },
+ { "it_CH", "CP850" },
+ { "it_IT", "CP850" },
+ { "ja", "CP932" },
+ { "ja_JP", "CP932" },
+ { "kr", "CP949" }, /* not CP934 ?? */
+ { "kr_KR", "CP949" }, /* not CP934 ?? */
+ { "lt", "CP775" },
+ { "lt_LT", "CP775" },
+ { "lv", "CP775" },
+ { "lv_LV", "CP775" },
+ { "mk", "CP866" }, /* not CP855 ?? */
+ { "mk_MK", "CP866" }, /* not CP855 ?? */
+ { "mt", "CP850" },
+ { "mt_MT", "CP850" },
+ { "nb", "CP865" }, /* not CP850 ?? */
+ { "nb_NO", "CP865" }, /* not CP850 ?? */
+ { "nl", "CP850" },
+ { "nl_BE", "CP850" },
+ { "nl_NL", "CP850" },
+ { "nn", "CP865" }, /* not CP850 ?? */
+ { "nn_NO", "CP865" }, /* not CP850 ?? */
+ { "no", "CP865" }, /* not CP850 ?? */
+ { "no_NO", "CP865" }, /* not CP850 ?? */
+ { "pl", "CP852" },
+ { "pl_PL", "CP852" },
+ { "pt", "CP850" },
+ { "pt_BR", "CP850" },
+ { "pt_PT", "CP850" },
+ { "ro", "CP852" },
+ { "ro_RO", "CP852" },
+ { "ru", "CP866" },
+ { "ru_RU", "CP866" },
+ { "sk", "CP852" },
+ { "sk_SK", "CP852" },
+ { "sl", "CP852" },
+ { "sl_SI", "CP852" },
+ { "sq", "CP852" },
+ { "sq_AL", "CP852" },
+ { "sr", "CP852" }, /* CP852 or CP866 or CP855 ?? */
+ { "sr_CS", "CP852" }, /* CP852 or CP866 or CP855 ?? */
+ { "sr_YU", "CP852" }, /* CP852 or CP866 or CP855 ?? */
+ { "sv", "CP850" },
+ { "sv_SE", "CP850" },
+ { "th", "CP874" },
+ { "th_TH", "CP874" },
+ { "tr", "CP857" },
+ { "tr_TR", "CP857" },
+ { "uk", "CP1125" },
+ { "uk_UA", "CP1125" },
+ { "zh_CN", "GBK" },
+ { "zh_TW", "CP950" } /* not CP938 ?? */
+# define locale_table_defined
+# endif
+# ifndef locale_table_defined
+ /* Just a dummy entry, to avoid a C syntax error. */
+ { "", "" }
+# endif
+ };
+
+#endif
+
+
+/* Determine the current locale's character encoding, and canonicalize it
+ into one of the canonical names listed below.
+ The result must not be freed; it is statically allocated. The result
+ becomes invalid when setlocale() is used to change the global locale, or
+ when the value of one of the environment variables LC_ALL, LC_CTYPE, LANG
+ is changed; threads in multithreaded programs should not do this.
+ If the canonical name cannot be determined, the result is a non-canonical
+ name. */
+
+#ifdef STATIC
+STATIC
+#endif
+const char *
+locale_charset (void)
+{
+ const char *codeset;
+
+ /* This function must be multithread-safe. To achieve this without using
+ thread-local storage, we use a simple strcpy or memcpy to fill this static
+ buffer. Filling it through, for example, strcpy + strcat would not be
+ guaranteed to leave the buffer's contents intact if another thread is
+ currently accessing it. If necessary, the contents is first assembled in
+ a stack-allocated buffer. */
+
+#if HAVE_LANGINFO_CODESET || defined WINDOWS_NATIVE || defined OS2
+
+# if HAVE_LANGINFO_CODESET
+
+ /* Most systems support nl_langinfo (CODESET) nowadays. */
+ codeset = nl_langinfo (CODESET);
+
+# ifdef __CYGWIN__
+ /* Cygwin < 1.7 does not have locales. nl_langinfo (CODESET) always
+ returns "US-ASCII". Return the suffix of the locale name from the
+ environment variables (if present) or the codepage as a number. */
+ if (codeset != NULL && strcmp (codeset, "US-ASCII") == 0)
+ {
+ const char *locale;
+ static char resultbuf[2 + 10 + 1];
+
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ }
+ if (locale != NULL && locale[0] != '\0')
+ {
+ /* If the locale name contains an encoding after the dot, return
+ it. */
+ const char *dot = strchr (locale, '.');
+
+ if (dot != NULL)
+ {
+ const char *modifier;
+
+ dot++;
+ /* Look for the possible @... trailer and remove it, if any. */
+ modifier = strchr (dot, '@');
+ if (modifier == NULL)
+ return dot;
+ if (modifier - dot < sizeof (resultbuf))
+ {
+ /* This way of filling resultbuf is multithread-safe. */
+ memcpy (resultbuf, dot, modifier - dot);
+ resultbuf [modifier - dot] = '\0';
+ return resultbuf;
+ }
+ }
+ }
+
+ /* The Windows API has a function returning the locale's codepage as a
+ number: GetACP(). This encoding is used by Cygwin, unless the user
+ has set the environment variable CYGWIN=codepage:oem (which very few
+ people do).
+ Output directed to console windows needs to be converted (to
+ GetOEMCP() if the console is using a raster font, or to
+ GetConsoleOutputCP() if it is using a TrueType font). Cygwin does
+ this conversion transparently (see winsup/cygwin/fhandler_console.cc),
+ converting to GetConsoleOutputCP(). This leads to correct results,
+ except when SetConsoleOutputCP has been called and a raster font is
+ in use. */
+ {
+ char buf[2 + 10 + 1];
+
+ sprintf (buf, "CP%u", GetACP ());
+ strcpy (resultbuf, buf);
+ codeset = resultbuf;
+ }
+ }
+# endif
+
+ if (codeset == NULL)
+ /* The canonical name cannot be determined. */
+ codeset = "";
+
+# elif defined WINDOWS_NATIVE
+
+ char buf[2 + 10 + 1];
+ static char resultbuf[2 + 10 + 1];
+
+ /* The Windows API has a function returning the locale's codepage as
+ a number, but the value doesn't change according to what the
+ 'setlocale' call specified. So we use it as a last resort, in
+ case the string returned by 'setlocale' doesn't specify the
+ codepage. */
+ char *current_locale = setlocale (LC_CTYPE, NULL);
+ char *pdot = strrchr (current_locale, '.');
+
+ if (pdot && 2 + strlen (pdot + 1) + 1 <= sizeof (buf))
+ sprintf (buf, "CP%s", pdot + 1);
+ else
+ {
+ /* The Windows API has a function returning the locale's codepage as a
+ number: GetACP().
+ When the output goes to a console window, it needs to be provided in
+ GetOEMCP() encoding if the console is using a raster font, or in
+ GetConsoleOutputCP() encoding if it is using a TrueType font.
+ But in GUI programs and for output sent to files and pipes, GetACP()
+ encoding is the best bet. */
+ sprintf (buf, "CP%u", GetACP ());
+ }
+ /* For a locale name such as "French_France.65001", in Windows 10,
+ setlocale now returns "French_France.utf8" instead. */
+ if (strcmp (buf + 2, "65001") == 0 || strcmp (buf + 2, "utf8") == 0)
+ codeset = "UTF-8";
+ else
+ {
+ strcpy (resultbuf, buf);
+ codeset = resultbuf;
+ }
+
+# elif defined OS2
+
+ const char *locale;
+ static char resultbuf[2 + 10 + 1];
+ ULONG cp[3];
+ ULONG cplen;
+
+ codeset = NULL;
+
+ /* Allow user to override the codeset, as set in the operating system,
+ with standard language environment variables. */
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ }
+ if (locale != NULL && locale[0] != '\0')
+ {
+ /* If the locale name contains an encoding after the dot, return it. */
+ const char *dot = strchr (locale, '.');
+
+ if (dot != NULL)
+ {
+ const char *modifier;
+
+ dot++;
+ /* Look for the possible @... trailer and remove it, if any. */
+ modifier = strchr (dot, '@');
+ if (modifier == NULL)
+ return dot;
+ if (modifier - dot < sizeof (resultbuf))
+ {
+ /* This way of filling resultbuf is multithread-safe. */
+ memcpy (resultbuf, dot, modifier - dot);
+ resultbuf [modifier - dot] = '\0';
+ return resultbuf;
+ }
+ }
+
+ /* For the POSIX locale, don't use the system's codepage. */
+ if (strcmp (locale, "C") == 0 || strcmp (locale, "POSIX") == 0)
+ codeset = "";
+ }
+
+ if (codeset == NULL)
+ {
+ /* OS/2 has a function returning the locale's codepage as a number. */
+ if (DosQueryCp (sizeof (cp), cp, &cplen))
+ codeset = "";
+ else
+ {
+ char buf[2 + 10 + 1];
+
+ sprintf (buf, "CP%u", cp[0]);
+ strcpy (resultbuf, buf);
+ codeset = resultbuf;
+ }
+ }
+
+# else
+
+# error "Add code for other platforms here."
+
+# endif
+
+ /* Resolve alias. */
+ {
+# ifdef alias_table_defined
+ /* On some platforms, UTF-8 locales are the most frequently used ones.
+ Speed up the common case and slow down the less common cases by
+ testing for this case first. */
+# if defined __OpenBSD__ || (defined __APPLE__ && defined __MACH__) || defined __sun || defined __CYGWIN__
+ if (strcmp (codeset, "UTF-8") == 0)
+ goto done_table_lookup;
+ else
+# endif
+ {
+ const struct table_entry * const table = alias_table;
+ size_t const table_size =
+ sizeof (alias_table) / sizeof (struct table_entry);
+ /* The table is sorted. Perform a binary search. */
+ size_t hi = table_size;
+ size_t lo = 0;
+ while (lo < hi)
+ {
+ /* Invariant:
+ for i < lo, strcmp (table[i].alias, codeset) < 0,
+ for i >= hi, strcmp (table[i].alias, codeset) > 0. */
+ size_t mid = (hi + lo) >> 1; /* >= lo, < hi */
+ int cmp = strcmp (table[mid].alias, codeset);
+ if (cmp < 0)
+ lo = mid + 1;
+ else if (cmp > 0)
+ hi = mid;
+ else
+ {
+ /* Found an i with
+ strcmp (table[i].alias, codeset) == 0. */
+ codeset = table[mid].canonical;
+ goto done_table_lookup;
+ }
+ }
+ }
+ if (0)
+ done_table_lookup: ;
+ else
+# endif
+ {
+ /* Did not find it in the table. */
+ /* On Mac OS X, all modern locales use the UTF-8 encoding.
+ BeOS and Haiku have a single locale, and it has UTF-8 encoding. */
+# if (defined __APPLE__ && defined __MACH__) || defined __BEOS__ || defined __HAIKU__
+ codeset = "UTF-8";
+# else
+ /* Don't return an empty string. GNU libc and GNU libiconv interpret
+ the empty string as denoting "the locale's character encoding",
+ thus GNU libiconv would call this function a second time. */
+ if (codeset[0] == '\0')
+ codeset = "ASCII";
+# endif
+ }
+ }
+
+#else
+
+ /* On old systems which lack it, use setlocale or getenv. */
+ const char *locale = NULL;
+
+ /* But most old systems don't have a complete set of locales. Some
+ (like DJGPP) have only the C locale. Therefore we don't use setlocale
+ here; it would return "C" when it doesn't support the locale name the
+ user has set. */
+# if 0
+ locale = setlocale (LC_CTYPE, NULL);
+# endif
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ if (locale == NULL)
+ locale = "";
+ }
+ }
+
+ /* Map locale name to canonical encoding name. */
+ {
+# ifdef locale_table_defined
+ const struct table_entry * const table = locale_table;
+ size_t const table_size =
+ sizeof (locale_table) / sizeof (struct table_entry);
+ /* The table is sorted. Perform a binary search. */
+ size_t hi = table_size;
+ size_t lo = 0;
+ while (lo < hi)
+ {
+ /* Invariant:
+ for i < lo, strcmp (table[i].locale, locale) < 0,
+ for i >= hi, strcmp (table[i].locale, locale) > 0. */
+ size_t mid = (hi + lo) >> 1; /* >= lo, < hi */
+ int cmp = strcmp (table[mid].locale, locale);
+ if (cmp < 0)
+ lo = mid + 1;
+ else if (cmp > 0)
+ hi = mid;
+ else
+ {
+ /* Found an i with
+ strcmp (table[i].locale, locale) == 0. */
+ codeset = table[mid].canonical;
+ goto done_table_lookup;
+ }
+ }
+ if (0)
+ done_table_lookup: ;
+ else
+# endif
+ {
+ /* Did not find it in the table. */
+ /* On Mac OS X, all modern locales use the UTF-8 encoding.
+ BeOS and Haiku have a single locale, and it has UTF-8 encoding. */
+# if (defined __APPLE__ && defined __MACH__) || defined __BEOS__ || defined __HAIKU__
+ codeset = "UTF-8";
+# else
+ /* The canonical name cannot be determined. */
+ /* Don't return an empty string. GNU libc and GNU libiconv interpret
+ the empty string as denoting "the locale's character encoding",
+ thus GNU libiconv would call this function a second time. */
+ codeset = "ASCII";
+# endif
+ }
+ }
+
+#endif
+
+#ifdef DARWIN7
+ /* Mac OS X sets MB_CUR_MAX to 1 when LC_ALL=C, and "UTF-8"
+ (the default codeset) does not work when MB_CUR_MAX is 1. */
+ if (strcmp (codeset, "UTF-8") == 0 && MB_CUR_MAX_L (uselocale (NULL)) <= 1)
+ codeset = "ASCII";
+#endif
+
+ return codeset;
+}
diff --git a/lib/localcharset.h b/lib/localcharset.h
new file mode 100644
index 0000000..29ee8dc
--- /dev/null
+++ b/lib/localcharset.h
@@ -0,0 +1,137 @@
+/* Determine a canonical name for the current locale's character encoding.
+ Copyright (C) 2000-2003, 2009-2023 Free Software Foundation, Inc.
+ This file is part of the GNU CHARSET Library.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#ifndef _LOCALCHARSET_H
+#define _LOCALCHARSET_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Determine the current locale's character encoding, and canonicalize it
+ into one of the canonical names listed below.
+ The result must not be freed; it is statically allocated. The result
+ becomes invalid when setlocale() is used to change the global locale, or
+ when the value of one of the environment variables LC_ALL, LC_CTYPE, LANG
+ is changed; threads in multithreaded programs should not do this.
+ If the canonical name cannot be determined, the result is a non-canonical
+ name. */
+extern const char * locale_charset (void);
+
+/* About GNU canonical names for character encodings:
+
+ Every canonical name must be supported by GNU libiconv. Support by GNU libc
+ is also desirable.
+
+ The name is case insensitive. Usually an upper case MIME charset name is
+ preferred.
+
+ The current list of these GNU canonical names is:
+
+ name MIME? used by which systems
+ (darwin = Mac OS X, windows = native Windows)
+
+ ASCII, ANSI_X3.4-1968 glibc solaris freebsd netbsd darwin minix cygwin
+ ISO-8859-1 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin zos
+ ISO-8859-2 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin zos
+ ISO-8859-3 Y glibc solaris cygwin
+ ISO-8859-4 Y hpux osf solaris freebsd netbsd openbsd darwin
+ ISO-8859-5 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin zos
+ ISO-8859-6 Y glibc aix hpux solaris cygwin
+ ISO-8859-7 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin zos
+ ISO-8859-8 Y glibc aix hpux osf solaris cygwin zos
+ ISO-8859-9 Y glibc aix hpux irix osf solaris freebsd darwin cygwin zos
+ ISO-8859-13 glibc hpux solaris freebsd netbsd openbsd darwin cygwin
+ ISO-8859-14 glibc cygwin
+ ISO-8859-15 glibc aix irix osf solaris freebsd netbsd openbsd darwin cygwin
+ KOI8-R Y glibc hpux solaris freebsd netbsd openbsd darwin
+ KOI8-U Y glibc freebsd netbsd openbsd darwin cygwin
+ KOI8-T glibc
+ CP437 dos
+ CP775 dos
+ CP850 aix osf dos
+ CP852 dos
+ CP855 dos
+ CP856 aix
+ CP857 dos
+ CP861 dos
+ CP862 dos
+ CP864 dos
+ CP865 dos
+ CP866 freebsd netbsd openbsd darwin dos
+ CP869 dos
+ CP874 windows dos
+ CP922 aix
+ CP932 aix cygwin windows dos
+ CP943 aix zos
+ CP949 osf darwin windows dos
+ CP950 windows dos
+ CP1046 aix
+ CP1124 aix
+ CP1125 dos
+ CP1129 aix
+ CP1131 freebsd darwin
+ CP1250 windows
+ CP1251 glibc hpux solaris freebsd netbsd openbsd darwin cygwin windows
+ CP1252 aix windows
+ CP1253 windows
+ CP1254 windows
+ CP1255 glibc windows
+ CP1256 windows
+ CP1257 windows
+ GB2312 Y glibc aix hpux irix solaris freebsd netbsd darwin cygwin zos
+ EUC-JP Y glibc aix hpux irix osf solaris freebsd netbsd darwin cygwin
+ EUC-KR Y glibc aix hpux irix osf solaris freebsd netbsd darwin cygwin zos
+ EUC-TW glibc aix hpux irix osf solaris netbsd
+ BIG5 Y glibc aix hpux osf solaris freebsd netbsd darwin cygwin zos
+ BIG5-HKSCS glibc hpux solaris netbsd darwin
+ GBK glibc aix osf solaris freebsd darwin cygwin windows dos
+ GB18030 glibc hpux solaris freebsd netbsd darwin
+ SHIFT_JIS Y hpux osf solaris freebsd netbsd darwin
+ JOHAB glibc solaris windows
+ TIS-620 glibc aix hpux osf solaris cygwin zos
+ VISCII Y glibc
+ TCVN5712-1 glibc
+ ARMSCII-8 glibc freebsd netbsd darwin
+ GEORGIAN-PS glibc cygwin
+ PT154 glibc netbsd cygwin
+ HP-ROMAN8 hpux
+ HP-ARABIC8 hpux
+ HP-GREEK8 hpux
+ HP-HEBREW8 hpux
+ HP-TURKISH8 hpux
+ HP-KANA8 hpux
+ DEC-KANJI osf
+ DEC-HANYU osf
+ UTF-8 Y glibc aix hpux osf solaris netbsd darwin cygwin zos
+
+ Note: Names which are not marked as being a MIME name should not be used in
+ Internet protocols for information interchange (mail, news, etc.).
+
+ Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications
+ must understand both names and treat them as equivalent.
+ */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _LOCALCHARSET_H */
diff --git a/lib/math.c b/lib/math.c
new file mode 100644
index 0000000..67cabbc
--- /dev/null
+++ b/lib/math.c
@@ -0,0 +1,22 @@
+/* Inline functions for <math.h>.
+
+ Copyright (C) 2012-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#define _GL_MATH_INLINE _GL_EXTERN_INLINE
+#include "math.h"
+typedef int dummy;
diff --git a/lib/math.in.h b/lib/math.in.h
new file mode 100644
index 0000000..70b75e2
--- /dev/null
+++ b/lib/math.in.h
@@ -0,0 +1,2735 @@
+/* A GNU-like <math.h>.
+
+ Copyright (C) 2002-2003, 2007-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* On Android, in C++ mode, when /usr/include/c++/v1/math.h is being included
+ and /usr/include/math.h has not yet been included, skip this file, since it
+ would lead to many syntax errors. */
+#if !(defined __ANDROID__ && defined _LIBCPP_MATH_H && !defined INFINITY)
+
+#ifndef _@GUARD_PREFIX@_MATH_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined _GL_INCLUDING_MATH_H
+/* Special invocation convention:
+ - On FreeBSD 12.2 we have a sequence of nested includes
+ <math.h> -> <stdlib.h> -> <sys/wait.h> -> <sys/types.h> -> <sys/select.h>
+ -> <signal.h> -> <pthread.h> -> <stdlib.h> -> <math.h>
+ In this situation, the functions are not yet declared, therefore we cannot
+ provide the C++ aliases. */
+
+#@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_MATH_H@
+
+#else
+/* Normal invocation convention. */
+
+/* The include_next requires a split double-inclusion guard. */
+#define _GL_INCLUDING_MATH_H
+#@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_MATH_H@
+#undef _GL_INCLUDING_MATH_H
+
+#ifndef _@GUARD_PREFIX@_MATH_H
+#define _@GUARD_PREFIX@_MATH_H
+
+/* On OpenVMS, NAN, INFINITY, and HUGEVAL macros are defined in <fp.h>. */
+#if defined __VMS && ! defined NAN
+# include <fp.h>
+#endif
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef _GL_MATH_INLINE
+# define _GL_MATH_INLINE _GL_INLINE
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The attribute __const__ was added in gcc 2.95. */
+#ifndef _GL_ATTRIBUTE_CONST
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) || defined __clang__
+# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
+# else
+# define _GL_ATTRIBUTE_CONST /* empty */
+# endif
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+#ifdef __cplusplus
+/* Helper macros to define type-generic function FUNC as overloaded functions,
+ rather than as macros like in C. POSIX declares these with an argument of
+ real-floating (that is, one of float, double, or long double). */
+# define _GL_MATH_CXX_REAL_FLOATING_DECL_1(func) \
+static inline int \
+_gl_cxx_ ## func ## f (float f) \
+{ \
+ return func (f); \
+} \
+static inline int \
+_gl_cxx_ ## func ## d (double d) \
+{ \
+ return func (d); \
+} \
+static inline int \
+_gl_cxx_ ## func ## l (long double l) \
+{ \
+ return func (l); \
+}
+# define _GL_MATH_CXX_REAL_FLOATING_DECL_2(func,rpl_func,rettype) \
+_GL_BEGIN_NAMESPACE \
+inline rettype \
+rpl_func (float f) \
+{ \
+ return _gl_cxx_ ## func ## f (f); \
+} \
+inline rettype \
+rpl_func (double d) \
+{ \
+ return _gl_cxx_ ## func ## d (d); \
+} \
+inline rettype \
+rpl_func (long double l) \
+{ \
+ return _gl_cxx_ ## func ## l (l); \
+} \
+_GL_END_NAMESPACE
+#endif
+
+/* Helper macros to define a portability warning for the
+ classification macro FUNC called with VALUE. POSIX declares the
+ classification macros with an argument of real-floating (that is,
+ one of float, double, or long double). */
+#define _GL_WARN_REAL_FLOATING_DECL(func) \
+_GL_MATH_INLINE int \
+_GL_WARN_ON_USE_ATTRIBUTE (#func " is unportable - " \
+ "use gnulib module " #func " for portability") \
+rpl_ ## func ## f (float f) \
+{ \
+ return func (f); \
+} \
+_GL_MATH_INLINE int \
+_GL_WARN_ON_USE_ATTRIBUTE (#func " is unportable - " \
+ "use gnulib module " #func " for portability") \
+rpl_ ## func ## d (double d) \
+{ \
+ return func (d); \
+} \
+_GL_MATH_INLINE int \
+_GL_WARN_ON_USE_ATTRIBUTE (#func " is unportable - " \
+ "use gnulib module " #func " for portability") \
+rpl_ ## func ## l (long double l) \
+{ \
+ return func (l); \
+}
+#define _GL_WARN_REAL_FLOATING_IMPL(func, value) \
+ (sizeof (value) == sizeof (float) ? rpl_ ## func ## f (value) \
+ : sizeof (value) == sizeof (double) ? rpl_ ## func ## d (value) \
+ : rpl_ ## func ## l (value))
+
+
+#if @REPLACE_ITOLD@
+/* Pull in a function that fixes the 'int' to 'long double' conversion
+ of glibc 2.7. */
+_GL_EXTERN_C void _Qp_itoq (long double *, int);
+static void (*_gl_math_fix_itold) (long double *, int) = _Qp_itoq;
+#endif
+
+
+/* POSIX allows platforms that don't support NAN. But all major
+ machines in the past 15 years have supported something close to
+ IEEE NaN, so we define this unconditionally. We also must define
+ it on platforms like Solaris 10, where NAN is present but defined
+ as a function pointer rather than a floating point constant. */
+#if !defined NAN || @REPLACE_NAN@
+# if !GNULIB_defined_NAN
+# undef NAN
+ /* The Compaq (ex-DEC) C 6.4 compiler and the Microsoft MSVC 9 compiler
+ choke on the expression 0.0 / 0.0. */
+# if defined __DECC || defined _MSC_VER
+_GL_MATH_INLINE float
+_NaN ()
+{
+ static float zero = 0.0f;
+ return zero / zero;
+}
+# define NAN (_NaN())
+# else
+# define NAN (0.0f / 0.0f)
+# endif
+# define GNULIB_defined_NAN 1
+# endif
+#endif
+
+/* Solaris 10 defines HUGE_VAL, but as a function pointer rather
+ than a floating point constant. */
+#if @REPLACE_HUGE_VAL@
+# undef HUGE_VALF
+# define HUGE_VALF (1.0f / 0.0f)
+# undef HUGE_VAL
+# define HUGE_VAL (1.0 / 0.0)
+# undef HUGE_VALL
+# define HUGE_VALL (1.0L / 0.0L)
+#endif
+
+/* HUGE_VALF is a 'float' Infinity. */
+#ifndef HUGE_VALF
+# if defined _MSC_VER
+/* The Microsoft MSVC 9 compiler chokes on the expression 1.0f / 0.0f. */
+# define HUGE_VALF (1e25f * 1e25f)
+# else
+# define HUGE_VALF (1.0f / 0.0f)
+# endif
+#endif
+
+/* HUGE_VAL is a 'double' Infinity. */
+#ifndef HUGE_VAL
+# if defined _MSC_VER
+/* The Microsoft MSVC 9 compiler chokes on the expression 1.0 / 0.0. */
+# define HUGE_VAL (1e250 * 1e250)
+# else
+# define HUGE_VAL (1.0 / 0.0)
+# endif
+#endif
+
+/* HUGE_VALL is a 'long double' Infinity. */
+#ifndef HUGE_VALL
+# if defined _MSC_VER
+/* The Microsoft MSVC 9 compiler chokes on the expression 1.0L / 0.0L. */
+# define HUGE_VALL (1e250L * 1e250L)
+# else
+# define HUGE_VALL (1.0L / 0.0L)
+# endif
+#endif
+
+
+#if defined FP_ILOGB0 && defined FP_ILOGBNAN
+ /* Ensure FP_ILOGB0 and FP_ILOGBNAN are correct. */
+# if defined __HAIKU__
+ /* Haiku: match what ilogb() does */
+# undef FP_ILOGB0
+# undef FP_ILOGBNAN
+# define FP_ILOGB0 (- 2147483647 - 1) /* INT_MIN */
+# define FP_ILOGBNAN (- 2147483647 - 1) /* INT_MIN */
+# endif
+#else
+ /* Ensure FP_ILOGB0 and FP_ILOGBNAN are defined. */
+# if defined __NetBSD__ || defined __sgi
+ /* NetBSD, IRIX 6.5: match what ilogb() does */
+# define FP_ILOGB0 (- 2147483647 - 1) /* INT_MIN */
+# define FP_ILOGBNAN (- 2147483647 - 1) /* INT_MIN */
+# elif defined _AIX
+ /* AIX 5.1: match what ilogb() does in AIX >= 5.2 */
+# define FP_ILOGB0 (- 2147483647 - 1) /* INT_MIN */
+# define FP_ILOGBNAN 2147483647 /* INT_MAX */
+# elif defined __sun
+ /* Solaris 9: match what ilogb() does */
+# define FP_ILOGB0 (- 2147483647) /* - INT_MAX */
+# define FP_ILOGBNAN 2147483647 /* INT_MAX */
+# else
+ /* Gnulib defined values. */
+# define FP_ILOGB0 (- 2147483647) /* - INT_MAX */
+# define FP_ILOGBNAN (- 2147483647 - 1) /* INT_MIN */
+# endif
+#endif
+
+
+#if @GNULIB_ACOSF@
+# if @REPLACE_ACOSF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef acosf
+# define acosf rpl_acosf
+# endif
+_GL_FUNCDECL_RPL (acosf, float, (float x));
+_GL_CXXALIAS_RPL (acosf, float, (float x));
+# else
+# if !@HAVE_ACOSF@
+# undef acosf
+_GL_FUNCDECL_SYS (acosf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (acosf, float, (float x));
+# endif
+_GL_CXXALIASWARN (acosf);
+#elif defined GNULIB_POSIXCHECK
+# undef acosf
+# if HAVE_RAW_DECL_ACOSF
+_GL_WARN_ON_USE (acosf, "acosf is unportable - "
+ "use gnulib module acosf for portability");
+# endif
+#endif
+
+#if @GNULIB_ACOSL@
+# if !@HAVE_ACOSL@ || !@HAVE_DECL_ACOSL@
+# undef acosl
+_GL_FUNCDECL_SYS (acosl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (acosl, long double, (long double x));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (acosl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef acosl
+# if HAVE_RAW_DECL_ACOSL
+_GL_WARN_ON_USE (acosl, "acosl is unportable - "
+ "use gnulib module acosl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ASINF@
+# if @REPLACE_ASINF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef asinf
+# define asinf rpl_asinf
+# endif
+_GL_FUNCDECL_RPL (asinf, float, (float x));
+_GL_CXXALIAS_RPL (asinf, float, (float x));
+# else
+# if !@HAVE_ASINF@
+# undef asinf
+_GL_FUNCDECL_SYS (asinf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (asinf, float, (float x));
+# endif
+_GL_CXXALIASWARN (asinf);
+#elif defined GNULIB_POSIXCHECK
+# undef asinf
+# if HAVE_RAW_DECL_ASINF
+_GL_WARN_ON_USE (asinf, "asinf is unportable - "
+ "use gnulib module asinf for portability");
+# endif
+#endif
+
+#if @GNULIB_ASINL@
+# if !@HAVE_ASINL@ || !@HAVE_DECL_ASINL@
+# undef asinl
+_GL_FUNCDECL_SYS (asinl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (asinl, long double, (long double x));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (asinl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef asinl
+# if HAVE_RAW_DECL_ASINL
+_GL_WARN_ON_USE (asinl, "asinl is unportable - "
+ "use gnulib module asinl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ATANF@
+# if @REPLACE_ATANF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef atanf
+# define atanf rpl_atanf
+# endif
+_GL_FUNCDECL_RPL (atanf, float, (float x));
+_GL_CXXALIAS_RPL (atanf, float, (float x));
+# else
+# if !@HAVE_ATANF@
+# undef atanf
+_GL_FUNCDECL_SYS (atanf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (atanf, float, (float x));
+# endif
+_GL_CXXALIASWARN (atanf);
+#elif defined GNULIB_POSIXCHECK
+# undef atanf
+# if HAVE_RAW_DECL_ATANF
+_GL_WARN_ON_USE (atanf, "atanf is unportable - "
+ "use gnulib module atanf for portability");
+# endif
+#endif
+
+#if @GNULIB_ATANL@
+# if !@HAVE_ATANL@ || !@HAVE_DECL_ATANL@
+# undef atanl
+_GL_FUNCDECL_SYS (atanl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (atanl, long double, (long double x));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (atanl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef atanl
+# if HAVE_RAW_DECL_ATANL
+_GL_WARN_ON_USE (atanl, "atanl is unportable - "
+ "use gnulib module atanl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ATAN2F@
+# if @REPLACE_ATAN2F@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef atan2f
+# define atan2f rpl_atan2f
+# endif
+_GL_FUNCDECL_RPL (atan2f, float, (float y, float x));
+_GL_CXXALIAS_RPL (atan2f, float, (float y, float x));
+# else
+# if !@HAVE_ATAN2F@
+# undef atan2f
+_GL_FUNCDECL_SYS (atan2f, float, (float y, float x));
+# endif
+_GL_CXXALIAS_SYS (atan2f, float, (float y, float x));
+# endif
+_GL_CXXALIASWARN (atan2f);
+#elif defined GNULIB_POSIXCHECK
+# undef atan2f
+# if HAVE_RAW_DECL_ATAN2F
+_GL_WARN_ON_USE (atan2f, "atan2f is unportable - "
+ "use gnulib module atan2f for portability");
+# endif
+#endif
+
+
+#if @GNULIB_CBRTF@
+# if @REPLACE_CBRTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef cbrtf
+# define cbrtf rpl_cbrtf
+# endif
+_GL_FUNCDECL_RPL (cbrtf, float, (float x));
+_GL_CXXALIAS_RPL (cbrtf, float, (float x));
+# else
+# if !@HAVE_DECL_CBRTF@
+_GL_FUNCDECL_SYS (cbrtf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (cbrtf, float, (float x));
+# endif
+_GL_CXXALIASWARN (cbrtf);
+#elif defined GNULIB_POSIXCHECK
+# undef cbrtf
+# if HAVE_RAW_DECL_CBRTF
+_GL_WARN_ON_USE (cbrtf, "cbrtf is unportable - "
+ "use gnulib module cbrtf for portability");
+# endif
+#endif
+
+#if @GNULIB_CBRT@
+# if !@HAVE_CBRT@
+_GL_FUNCDECL_SYS (cbrt, double, (double x));
+# endif
+_GL_CXXALIAS_SYS (cbrt, double, (double x));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN1 (cbrt, double, (double x));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef cbrt
+# if HAVE_RAW_DECL_CBRT
+_GL_WARN_ON_USE (cbrt, "cbrt is unportable - "
+ "use gnulib module cbrt for portability");
+# endif
+#endif
+
+#if @GNULIB_CBRTL@
+# if @REPLACE_CBRTL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef cbrtl
+# define cbrtl rpl_cbrtl
+# endif
+_GL_FUNCDECL_RPL (cbrtl, long double, (long double x));
+_GL_CXXALIAS_RPL (cbrtl, long double, (long double x));
+# else
+# if !@HAVE_DECL_CBRTL@
+_GL_FUNCDECL_SYS (cbrtl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (cbrtl, long double, (long double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (cbrtl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef cbrtl
+# if HAVE_RAW_DECL_CBRTL
+_GL_WARN_ON_USE (cbrtl, "cbrtl is unportable - "
+ "use gnulib module cbrtl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_CEILF@
+# if @REPLACE_CEILF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ceilf
+# define ceilf rpl_ceilf
+# endif
+_GL_FUNCDECL_RPL (ceilf, float, (float x));
+_GL_CXXALIAS_RPL (ceilf, float, (float x));
+# else
+# if !@HAVE_DECL_CEILF@
+# undef ceilf
+_GL_FUNCDECL_SYS (ceilf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (ceilf, float, (float x));
+# endif
+_GL_CXXALIASWARN (ceilf);
+#elif defined GNULIB_POSIXCHECK
+# undef ceilf
+# if HAVE_RAW_DECL_CEILF
+_GL_WARN_ON_USE (ceilf, "ceilf is unportable - "
+ "use gnulib module ceilf for portability");
+# endif
+#endif
+
+#if @GNULIB_CEIL@
+# if @REPLACE_CEIL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ceil
+# define ceil rpl_ceil
+# endif
+_GL_FUNCDECL_RPL (ceil, double, (double x));
+_GL_CXXALIAS_RPL (ceil, double, (double x));
+# else
+_GL_CXXALIAS_SYS (ceil, double, (double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN1 (ceil, double, (double x));
+# endif
+#endif
+
+#if @GNULIB_CEILL@
+# if @REPLACE_CEILL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ceill
+# define ceill rpl_ceill
+# endif
+_GL_FUNCDECL_RPL (ceill, long double, (long double x));
+_GL_CXXALIAS_RPL (ceill, long double, (long double x));
+# else
+# if !@HAVE_DECL_CEILL@
+# undef ceill
+_GL_FUNCDECL_SYS (ceill, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (ceill, long double, (long double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (ceill);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef ceill
+# if HAVE_RAW_DECL_CEILL
+_GL_WARN_ON_USE (ceill, "ceill is unportable - "
+ "use gnulib module ceill for portability");
+# endif
+#endif
+
+
+#if @GNULIB_COPYSIGNF@
+# if !@HAVE_DECL_COPYSIGNF@
+# undef copysignf
+_GL_FUNCDECL_SYS (copysignf, float, (float x, float y));
+# endif
+_GL_CXXALIAS_SYS (copysignf, float, (float x, float y));
+_GL_CXXALIASWARN (copysignf);
+#elif defined GNULIB_POSIXCHECK
+# undef copysignf
+# if HAVE_RAW_DECL_COPYSIGNF
+_GL_WARN_ON_USE (copysignf, "copysignf is unportable - "
+ "use gnulib module copysignf for portability");
+# endif
+#endif
+
+#if @GNULIB_COPYSIGN@
+# if !@HAVE_COPYSIGN@
+_GL_FUNCDECL_SYS (copysign, double, (double x, double y));
+# endif
+_GL_CXXALIAS_SYS (copysign, double, (double x, double y));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN1 (copysign, double, (double x, double y));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef copysign
+# if HAVE_RAW_DECL_COPYSIGN
+_GL_WARN_ON_USE (copysign, "copysign is unportable - "
+ "use gnulib module copysign for portability");
+# endif
+#endif
+
+#if @GNULIB_COPYSIGNL@
+# if !@HAVE_COPYSIGNL@
+_GL_FUNCDECL_SYS (copysignl, long double, (long double x, long double y));
+# endif
+_GL_CXXALIAS_SYS (copysignl, long double, (long double x, long double y));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (copysignl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef copysignl
+# if HAVE_RAW_DECL_COPYSIGNL
+_GL_WARN_ON_USE (copysign, "copysignl is unportable - "
+ "use gnulib module copysignl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_COSF@
+# if @REPLACE_COSF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef cosf
+# define cosf rpl_cosf
+# endif
+_GL_FUNCDECL_RPL (cosf, float, (float x));
+_GL_CXXALIAS_RPL (cosf, float, (float x));
+# else
+# if !@HAVE_COSF@
+# undef cosf
+_GL_FUNCDECL_SYS (cosf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (cosf, float, (float x));
+# endif
+_GL_CXXALIASWARN (cosf);
+#elif defined GNULIB_POSIXCHECK
+# undef cosf
+# if HAVE_RAW_DECL_COSF
+_GL_WARN_ON_USE (cosf, "cosf is unportable - "
+ "use gnulib module cosf for portability");
+# endif
+#endif
+
+#if @GNULIB_COSL@
+# if !@HAVE_COSL@ || !@HAVE_DECL_COSL@
+# undef cosl
+_GL_FUNCDECL_SYS (cosl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (cosl, long double, (long double x));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (cosl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef cosl
+# if HAVE_RAW_DECL_COSL
+_GL_WARN_ON_USE (cosl, "cosl is unportable - "
+ "use gnulib module cosl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_COSHF@
+# if @REPLACE_COSHF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef coshf
+# define coshf rpl_coshf
+# endif
+_GL_FUNCDECL_RPL (coshf, float, (float x));
+_GL_CXXALIAS_RPL (coshf, float, (float x));
+# else
+# if !@HAVE_COSHF@
+# undef coshf
+_GL_FUNCDECL_SYS (coshf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (coshf, float, (float x));
+# endif
+_GL_CXXALIASWARN (coshf);
+#elif defined GNULIB_POSIXCHECK
+# undef coshf
+# if HAVE_RAW_DECL_COSHF
+_GL_WARN_ON_USE (coshf, "coshf is unportable - "
+ "use gnulib module coshf for portability");
+# endif
+#endif
+
+
+#if @GNULIB_EXPF@
+# if @REPLACE_EXPF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef expf
+# define expf rpl_expf
+# endif
+_GL_FUNCDECL_RPL (expf, float, (float x));
+_GL_CXXALIAS_RPL (expf, float, (float x));
+# else
+# if !@HAVE_EXPF@
+# undef expf
+_GL_FUNCDECL_SYS (expf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (expf, float, (float x));
+# endif
+_GL_CXXALIASWARN (expf);
+#elif defined GNULIB_POSIXCHECK
+# undef expf
+# if HAVE_RAW_DECL_EXPF
+_GL_WARN_ON_USE (expf, "expf is unportable - "
+ "use gnulib module expf for portability");
+# endif
+#endif
+
+#if @GNULIB_EXPL@
+# if @REPLACE_EXPL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef expl
+# define expl rpl_expl
+# endif
+_GL_FUNCDECL_RPL (expl, long double, (long double x));
+_GL_CXXALIAS_RPL (expl, long double, (long double x));
+# else
+# if !@HAVE_EXPL@ || !@HAVE_DECL_EXPL@
+# undef expl
+_GL_FUNCDECL_SYS (expl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (expl, long double, (long double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (expl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef expl
+# if HAVE_RAW_DECL_EXPL
+_GL_WARN_ON_USE (expl, "expl is unportable - "
+ "use gnulib module expl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_EXP2F@
+# if !@HAVE_DECL_EXP2F@
+_GL_FUNCDECL_SYS (exp2f, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (exp2f, float, (float x));
+_GL_CXXALIASWARN (exp2f);
+#elif defined GNULIB_POSIXCHECK
+# undef exp2f
+# if HAVE_RAW_DECL_EXP2F
+_GL_WARN_ON_USE (exp2f, "exp2f is unportable - "
+ "use gnulib module exp2f for portability");
+# endif
+#endif
+
+#if @GNULIB_EXP2@
+# if @REPLACE_EXP2@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef exp2
+# define exp2 rpl_exp2
+# endif
+_GL_FUNCDECL_RPL (exp2, double, (double x));
+_GL_CXXALIAS_RPL (exp2, double, (double x));
+# else
+# if !@HAVE_DECL_EXP2@
+_GL_FUNCDECL_SYS (exp2, double, (double x));
+# endif
+_GL_CXXALIAS_SYS (exp2, double, (double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN1 (exp2, double, (double x));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef exp2
+# if HAVE_RAW_DECL_EXP2
+_GL_WARN_ON_USE (exp2, "exp2 is unportable - "
+ "use gnulib module exp2 for portability");
+# endif
+#endif
+
+#if @GNULIB_EXP2L@
+# if @REPLACE_EXP2L@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef exp2l
+# define exp2l rpl_exp2l
+# endif
+_GL_FUNCDECL_RPL (exp2l, long double, (long double x));
+_GL_CXXALIAS_RPL (exp2l, long double, (long double x));
+# else
+# if !@HAVE_DECL_EXP2L@
+# undef exp2l
+_GL_FUNCDECL_SYS (exp2l, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (exp2l, long double, (long double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (exp2l);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef exp2l
+# if HAVE_RAW_DECL_EXP2L
+_GL_WARN_ON_USE (exp2l, "exp2l is unportable - "
+ "use gnulib module exp2l for portability");
+# endif
+#endif
+
+
+#if @GNULIB_EXPM1F@
+# if @REPLACE_EXPM1F@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef expm1f
+# define expm1f rpl_expm1f
+# endif
+_GL_FUNCDECL_RPL (expm1f, float, (float x));
+_GL_CXXALIAS_RPL (expm1f, float, (float x));
+# else
+# if !@HAVE_EXPM1F@
+_GL_FUNCDECL_SYS (expm1f, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (expm1f, float, (float x));
+# endif
+_GL_CXXALIASWARN (expm1f);
+#elif defined GNULIB_POSIXCHECK
+# undef expm1f
+# if HAVE_RAW_DECL_EXPM1F
+_GL_WARN_ON_USE (expm1f, "expm1f is unportable - "
+ "use gnulib module expm1f for portability");
+# endif
+#endif
+
+#if @GNULIB_EXPM1@
+# if @REPLACE_EXPM1@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef expm1
+# define expm1 rpl_expm1
+# endif
+_GL_FUNCDECL_RPL (expm1, double, (double x));
+_GL_CXXALIAS_RPL (expm1, double, (double x));
+# else
+# if !@HAVE_EXPM1@
+_GL_FUNCDECL_SYS (expm1, double, (double x));
+# endif
+_GL_CXXALIAS_SYS (expm1, double, (double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN1 (expm1, double, (double x));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef expm1
+# if HAVE_RAW_DECL_EXPM1
+_GL_WARN_ON_USE (expm1, "expm1 is unportable - "
+ "use gnulib module expm1 for portability");
+# endif
+#endif
+
+#if @GNULIB_EXPM1L@
+# if @REPLACE_EXPM1L@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef expm1l
+# define expm1l rpl_expm1l
+# endif
+_GL_FUNCDECL_RPL (expm1l, long double, (long double x));
+_GL_CXXALIAS_RPL (expm1l, long double, (long double x));
+# else
+# if !@HAVE_DECL_EXPM1L@
+# undef expm1l
+# if !(defined __cplusplus && defined _AIX)
+_GL_FUNCDECL_SYS (expm1l, long double, (long double x));
+# endif
+# endif
+_GL_CXXALIAS_SYS (expm1l, long double, (long double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (expm1l);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef expm1l
+# if HAVE_RAW_DECL_EXPM1L
+_GL_WARN_ON_USE (expm1l, "expm1l is unportable - "
+ "use gnulib module expm1l for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FABSF@
+# if !@HAVE_FABSF@
+# undef fabsf
+_GL_FUNCDECL_SYS (fabsf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (fabsf, float, (float x));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fabsf);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fabsf
+# if HAVE_RAW_DECL_FABSF
+_GL_WARN_ON_USE (fabsf, "fabsf is unportable - "
+ "use gnulib module fabsf for portability");
+# endif
+#endif
+
+#if @GNULIB_FABSL@
+# if @REPLACE_FABSL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fabsl
+# define fabsl rpl_fabsl
+# endif
+_GL_FUNCDECL_RPL (fabsl, long double, (long double x));
+_GL_CXXALIAS_RPL (fabsl, long double, (long double x));
+# else
+# if !@HAVE_FABSL@
+# undef fabsl
+_GL_FUNCDECL_SYS (fabsl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (fabsl, long double, (long double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fabsl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fabsl
+# if HAVE_RAW_DECL_FABSL
+_GL_WARN_ON_USE (fabsl, "fabsl is unportable - "
+ "use gnulib module fabsl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FLOORF@
+# if @REPLACE_FLOORF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef floorf
+# define floorf rpl_floorf
+# endif
+_GL_FUNCDECL_RPL (floorf, float, (float x));
+_GL_CXXALIAS_RPL (floorf, float, (float x));
+# else
+# if !@HAVE_DECL_FLOORF@
+# undef floorf
+_GL_FUNCDECL_SYS (floorf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (floorf, float, (float x));
+# endif
+_GL_CXXALIASWARN (floorf);
+#elif defined GNULIB_POSIXCHECK
+# undef floorf
+# if HAVE_RAW_DECL_FLOORF
+_GL_WARN_ON_USE (floorf, "floorf is unportable - "
+ "use gnulib module floorf for portability");
+# endif
+#endif
+
+#if @GNULIB_FLOOR@
+# if @REPLACE_FLOOR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef floor
+# define floor rpl_floor
+# endif
+_GL_FUNCDECL_RPL (floor, double, (double x));
+_GL_CXXALIAS_RPL (floor, double, (double x));
+# else
+_GL_CXXALIAS_SYS (floor, double, (double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN1 (floor, double, (double x));
+# endif
+#endif
+
+#if @GNULIB_FLOORL@
+# if @REPLACE_FLOORL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef floorl
+# define floorl rpl_floorl
+# endif
+_GL_FUNCDECL_RPL (floorl, long double, (long double x));
+_GL_CXXALIAS_RPL (floorl, long double, (long double x));
+# else
+# if !@HAVE_DECL_FLOORL@
+# undef floorl
+_GL_FUNCDECL_SYS (floorl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (floorl, long double, (long double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (floorl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef floorl
+# if HAVE_RAW_DECL_FLOORL
+_GL_WARN_ON_USE (floorl, "floorl is unportable - "
+ "use gnulib module floorl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FMAF@
+# if @REPLACE_FMAF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fmaf
+# define fmaf rpl_fmaf
+# endif
+_GL_FUNCDECL_RPL (fmaf, float, (float x, float y, float z));
+_GL_CXXALIAS_RPL (fmaf, float, (float x, float y, float z));
+# else
+# if !@HAVE_FMAF@
+# undef fmaf
+_GL_FUNCDECL_SYS (fmaf, float, (float x, float y, float z));
+# endif
+_GL_CXXALIAS_SYS (fmaf, float, (float x, float y, float z));
+# endif
+_GL_CXXALIASWARN (fmaf);
+#elif defined GNULIB_POSIXCHECK
+# undef fmaf
+# if HAVE_RAW_DECL_FMAF
+_GL_WARN_ON_USE (fmaf, "fmaf is unportable - "
+ "use gnulib module fmaf for portability");
+# endif
+#endif
+
+#if @GNULIB_FMA@
+# if @REPLACE_FMA@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fma
+# define fma rpl_fma
+# endif
+_GL_FUNCDECL_RPL (fma, double, (double x, double y, double z));
+_GL_CXXALIAS_RPL (fma, double, (double x, double y, double z));
+# else
+# if !@HAVE_FMA@
+# undef fma
+_GL_FUNCDECL_SYS (fma, double, (double x, double y, double z));
+# endif
+_GL_CXXALIAS_SYS (fma, double, (double x, double y, double z));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN1 (fma, double, (double x, double y, double z));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fma
+# if HAVE_RAW_DECL_FMA
+_GL_WARN_ON_USE (fma, "fma is unportable - "
+ "use gnulib module fma for portability");
+# endif
+#endif
+
+#if @GNULIB_FMAL@
+# if @REPLACE_FMAL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fmal
+# define fmal rpl_fmal
+# endif
+_GL_FUNCDECL_RPL (fmal, long double,
+ (long double x, long double y, long double z));
+_GL_CXXALIAS_RPL (fmal, long double,
+ (long double x, long double y, long double z));
+# else
+# if !@HAVE_FMAL@
+# undef fmal
+# if !(defined __cplusplus && defined _AIX)
+_GL_FUNCDECL_SYS (fmal, long double,
+ (long double x, long double y, long double z));
+# endif
+# endif
+_GL_CXXALIAS_SYS (fmal, long double,
+ (long double x, long double y, long double z));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fmal);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fmal
+# if HAVE_RAW_DECL_FMAL
+_GL_WARN_ON_USE (fmal, "fmal is unportable - "
+ "use gnulib module fmal for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FMODF@
+# if @REPLACE_FMODF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fmodf
+# define fmodf rpl_fmodf
+# endif
+_GL_FUNCDECL_RPL (fmodf, float, (float x, float y));
+_GL_CXXALIAS_RPL (fmodf, float, (float x, float y));
+# else
+# if !@HAVE_FMODF@
+# undef fmodf
+_GL_FUNCDECL_SYS (fmodf, float, (float x, float y));
+# endif
+_GL_CXXALIAS_SYS (fmodf, float, (float x, float y));
+# endif
+_GL_CXXALIASWARN (fmodf);
+#elif defined GNULIB_POSIXCHECK
+# undef fmodf
+# if HAVE_RAW_DECL_FMODF
+_GL_WARN_ON_USE (fmodf, "fmodf is unportable - "
+ "use gnulib module fmodf for portability");
+# endif
+#endif
+
+#if @GNULIB_FMOD@
+# if @REPLACE_FMOD@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fmod
+# define fmod rpl_fmod
+# endif
+_GL_FUNCDECL_RPL (fmod, double, (double x, double y));
+_GL_CXXALIAS_RPL (fmod, double, (double x, double y));
+# else
+_GL_CXXALIAS_SYS (fmod, double, (double x, double y));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN1 (fmod, double, (double x, double y));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fmod
+# if HAVE_RAW_DECL_FMOD
+_GL_WARN_ON_USE (fmod, "fmod has portability problems - "
+ "use gnulib module fmod for portability");
+# endif
+#endif
+
+#if @GNULIB_FMODL@
+# if @REPLACE_FMODL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fmodl
+# define fmodl rpl_fmodl
+# endif
+_GL_FUNCDECL_RPL (fmodl, long double, (long double x, long double y));
+_GL_CXXALIAS_RPL (fmodl, long double, (long double x, long double y));
+# else
+# if !@HAVE_FMODL@
+# undef fmodl
+_GL_FUNCDECL_SYS (fmodl, long double, (long double x, long double y));
+# endif
+_GL_CXXALIAS_SYS (fmodl, long double, (long double x, long double y));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fmodl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fmodl
+# if HAVE_RAW_DECL_FMODL
+_GL_WARN_ON_USE (fmodl, "fmodl is unportable - "
+ "use gnulib module fmodl for portability");
+# endif
+#endif
+
+
+/* Write x as
+ x = mantissa * 2^exp
+ where
+ If x finite and nonzero: 0.5 <= |mantissa| < 1.0.
+ If x is zero: mantissa = x, exp = 0.
+ If x is infinite or NaN: mantissa = x, exp unspecified.
+ Store exp in *EXPPTR and return mantissa. */
+#if @GNULIB_FREXPF@
+# if @REPLACE_FREXPF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef frexpf
+# define frexpf rpl_frexpf
+# endif
+_GL_FUNCDECL_RPL (frexpf, float, (float x, int *expptr) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (frexpf, float, (float x, int *expptr));
+# else
+# if !@HAVE_FREXPF@
+# undef frexpf
+_GL_FUNCDECL_SYS (frexpf, float, (float x, int *expptr) _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (frexpf, float, (float x, int *expptr));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (frexpf);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef frexpf
+# if HAVE_RAW_DECL_FREXPF
+_GL_WARN_ON_USE (frexpf, "frexpf is unportable - "
+ "use gnulib module frexpf for portability");
+# endif
+#endif
+
+/* Write x as
+ x = mantissa * 2^exp
+ where
+ If x finite and nonzero: 0.5 <= |mantissa| < 1.0.
+ If x is zero: mantissa = x, exp = 0.
+ If x is infinite or NaN: mantissa = x, exp unspecified.
+ Store exp in *EXPPTR and return mantissa. */
+#if @GNULIB_FREXP@
+# if @REPLACE_FREXP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef frexp
+# define frexp rpl_frexp
+# endif
+_GL_FUNCDECL_RPL (frexp, double, (double x, int *expptr) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (frexp, double, (double x, int *expptr));
+# else
+_GL_CXXALIAS_SYS (frexp, double, (double x, int *expptr));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN1 (frexp, double, (double x, int *expptr));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef frexp
+/* Assume frexp is always declared. */
+_GL_WARN_ON_USE (frexp, "frexp is unportable - "
+ "use gnulib module frexp for portability");
+#endif
+
+/* Write x as
+ x = mantissa * 2^exp
+ where
+ If x finite and nonzero: 0.5 <= |mantissa| < 1.0.
+ If x is zero: mantissa = x, exp = 0.
+ If x is infinite or NaN: mantissa = x, exp unspecified.
+ Store exp in *EXPPTR and return mantissa. */
+#if @GNULIB_FREXPL@ && @REPLACE_FREXPL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef frexpl
+# define frexpl rpl_frexpl
+# endif
+_GL_FUNCDECL_RPL (frexpl, long double,
+ (long double x, int *expptr) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (frexpl, long double, (long double x, int *expptr));
+#else
+# if !@HAVE_DECL_FREXPL@
+_GL_FUNCDECL_SYS (frexpl, long double,
+ (long double x, int *expptr) _GL_ARG_NONNULL ((2)));
+# endif
+# if @GNULIB_FREXPL@
+_GL_CXXALIAS_SYS (frexpl, long double, (long double x, int *expptr));
+# endif
+#endif
+#if @GNULIB_FREXPL@ && !(@REPLACE_FREXPL@ && !@HAVE_DECL_FREXPL@)
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (frexpl);
+# endif
+#endif
+#if !@GNULIB_FREXPL@ && defined GNULIB_POSIXCHECK
+# undef frexpl
+# if HAVE_RAW_DECL_FREXPL
+_GL_WARN_ON_USE (frexpl, "frexpl is unportable - "
+ "use gnulib module frexpl for portability");
+# endif
+#endif
+
+
+/* Return sqrt(x^2+y^2). */
+#if @GNULIB_HYPOTF@
+# if @REPLACE_HYPOTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef hypotf
+# define hypotf rpl_hypotf
+# endif
+_GL_FUNCDECL_RPL (hypotf, float, (float x, float y));
+_GL_CXXALIAS_RPL (hypotf, float, (float x, float y));
+# else
+# if !@HAVE_HYPOTF@
+_GL_FUNCDECL_SYS (hypotf, float, (float x, float y));
+# endif
+_GL_CXXALIAS_SYS (hypotf, float, (float x, float y));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (hypotf);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef hypotf
+# if HAVE_RAW_DECL_HYPOTF
+_GL_WARN_ON_USE (hypotf, "hypotf is unportable - "
+ "use gnulib module hypotf for portability");
+# endif
+#endif
+
+/* Return sqrt(x^2+y^2). */
+#if @GNULIB_HYPOT@
+# if @REPLACE_HYPOT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef hypot
+# define hypot rpl_hypot
+# endif
+_GL_FUNCDECL_RPL (hypot, double, (double x, double y));
+_GL_CXXALIAS_RPL (hypot, double, (double x, double y));
+# else
+_GL_CXXALIAS_SYS (hypot, double, (double x, double y));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN1 (hypot, double, (double x, double y));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef hypot
+# if HAVE_RAW_DECL_HYPOT
+_GL_WARN_ON_USE (hypotf, "hypot has portability problems - "
+ "use gnulib module hypot for portability");
+# endif
+#endif
+
+/* Return sqrt(x^2+y^2). */
+#if @GNULIB_HYPOTL@
+# if @REPLACE_HYPOTL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef hypotl
+# define hypotl rpl_hypotl
+# endif
+_GL_FUNCDECL_RPL (hypotl, long double, (long double x, long double y));
+_GL_CXXALIAS_RPL (hypotl, long double, (long double x, long double y));
+# else
+# if !@HAVE_HYPOTL@
+_GL_FUNCDECL_SYS (hypotl, long double, (long double x, long double y));
+# endif
+_GL_CXXALIAS_SYS (hypotl, long double, (long double x, long double y));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (hypotl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef hypotl
+# if HAVE_RAW_DECL_HYPOTL
+_GL_WARN_ON_USE (hypotl, "hypotl is unportable - "
+ "use gnulib module hypotl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ILOGBF@
+# if @REPLACE_ILOGBF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ilogbf
+# define ilogbf rpl_ilogbf
+# endif
+_GL_FUNCDECL_RPL (ilogbf, int, (float x));
+_GL_CXXALIAS_RPL (ilogbf, int, (float x));
+# else
+# if !@HAVE_ILOGBF@
+_GL_FUNCDECL_SYS (ilogbf, int, (float x));
+# endif
+_GL_CXXALIAS_SYS (ilogbf, int, (float x));
+# endif
+_GL_CXXALIASWARN (ilogbf);
+#elif defined GNULIB_POSIXCHECK
+# undef ilogbf
+# if HAVE_RAW_DECL_ILOGBF
+_GL_WARN_ON_USE (ilogbf, "ilogbf is unportable - "
+ "use gnulib module ilogbf for portability");
+# endif
+#endif
+
+#if @GNULIB_ILOGB@
+# if @REPLACE_ILOGB@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ilogb
+# define ilogb rpl_ilogb
+# endif
+_GL_FUNCDECL_RPL (ilogb, int, (double x));
+_GL_CXXALIAS_RPL (ilogb, int, (double x));
+# else
+# if !@HAVE_ILOGB@
+_GL_FUNCDECL_SYS (ilogb, int, (double x));
+# endif
+_GL_CXXALIAS_SYS (ilogb, int, (double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN1 (ilogb, int, (double x));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef ilogb
+# if HAVE_RAW_DECL_ILOGB
+_GL_WARN_ON_USE (ilogb, "ilogb is unportable - "
+ "use gnulib module ilogb for portability");
+# endif
+#endif
+
+#if @GNULIB_ILOGBL@
+# if @REPLACE_ILOGBL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ilogbl
+# define ilogbl rpl_ilogbl
+# endif
+_GL_FUNCDECL_RPL (ilogbl, int, (long double x));
+_GL_CXXALIAS_RPL (ilogbl, int, (long double x));
+# else
+# if !@HAVE_ILOGBL@
+# undef ilogbl
+_GL_FUNCDECL_SYS (ilogbl, int, (long double x));
+# endif
+_GL_CXXALIAS_SYS (ilogbl, int, (long double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (ilogbl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef ilogbl
+# if HAVE_RAW_DECL_ILOGBL
+_GL_WARN_ON_USE (ilogbl, "ilogbl is unportable - "
+ "use gnulib module ilogbl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MDA_J0@
+/* On native Windows, map 'j0' to '_j0', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::j0 always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef j0
+# define j0 _j0
+# endif
+_GL_CXXALIAS_MDA (j0, double, (double x));
+# else
+_GL_CXXALIAS_SYS (j0, double, (double x));
+# endif
+_GL_CXXALIASWARN (j0);
+#endif
+
+#if @GNULIB_MDA_J1@
+/* On native Windows, map 'j1' to '_j1', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::j1 always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef j1
+# define j1 _j1
+# endif
+_GL_CXXALIAS_MDA (j1, double, (double x));
+# else
+_GL_CXXALIAS_SYS (j1, double, (double x));
+# endif
+_GL_CXXALIASWARN (j1);
+#endif
+
+#if @GNULIB_MDA_JN@
+/* On native Windows, map 'jn' to '_jn', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::jn always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef jn
+# define jn _jn
+# endif
+_GL_CXXALIAS_MDA (jn, double, (int n, double x));
+# else
+_GL_CXXALIAS_SYS (jn, double, (int n, double x));
+# endif
+_GL_CXXALIASWARN (jn);
+#endif
+
+
+/* Return x * 2^exp. */
+#if @GNULIB_LDEXPF@
+# if !@HAVE_LDEXPF@
+# undef ldexpf
+_GL_FUNCDECL_SYS (ldexpf, float, (float x, int exp));
+# endif
+_GL_CXXALIAS_SYS (ldexpf, float, (float x, int exp));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (ldexpf);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef ldexpf
+# if HAVE_RAW_DECL_LDEXPF
+_GL_WARN_ON_USE (ldexpf, "ldexpf is unportable - "
+ "use gnulib module ldexpf for portability");
+# endif
+#endif
+
+/* Return x * 2^exp. */
+#if @GNULIB_LDEXPL@ && @REPLACE_LDEXPL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ldexpl
+# define ldexpl rpl_ldexpl
+# endif
+_GL_FUNCDECL_RPL (ldexpl, long double, (long double x, int exp));
+_GL_CXXALIAS_RPL (ldexpl, long double, (long double x, int exp));
+#else
+# if !@HAVE_DECL_LDEXPL@
+_GL_FUNCDECL_SYS (ldexpl, long double, (long double x, int exp));
+# endif
+# if @GNULIB_LDEXPL@
+_GL_CXXALIAS_SYS (ldexpl, long double, (long double x, int exp));
+# endif
+#endif
+#if @GNULIB_LDEXPL@
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (ldexpl);
+# endif
+#endif
+#if !@GNULIB_LDEXPL@ && defined GNULIB_POSIXCHECK
+# undef ldexpl
+# if HAVE_RAW_DECL_LDEXPL
+_GL_WARN_ON_USE (ldexpl, "ldexpl is unportable - "
+ "use gnulib module ldexpl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LOGF@
+# if @REPLACE_LOGF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef logf
+# define logf rpl_logf
+# endif
+_GL_FUNCDECL_RPL (logf, float, (float x));
+_GL_CXXALIAS_RPL (logf, float, (float x));
+# else
+# if !@HAVE_LOGF@
+# undef logf
+_GL_FUNCDECL_SYS (logf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (logf, float, (float x));
+# endif
+_GL_CXXALIASWARN (logf);
+#elif defined GNULIB_POSIXCHECK
+# undef logf
+# if HAVE_RAW_DECL_LOGF
+_GL_WARN_ON_USE (logf, "logf is unportable - "
+ "use gnulib module logf for portability");
+# endif
+#endif
+
+#if @GNULIB_LOG@
+# if @REPLACE_LOG@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef log
+# define log rpl_log
+# endif
+_GL_FUNCDECL_RPL (log, double, (double x));
+_GL_CXXALIAS_RPL (log, double, (double x));
+# else
+_GL_CXXALIAS_SYS (log, double, (double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN1 (log, double, (double x));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef log
+# if HAVE_RAW_DECL_LOG
+_GL_WARN_ON_USE (log, "log has portability problems - "
+ "use gnulib module log for portability");
+# endif
+#endif
+
+#if @GNULIB_LOGL@
+# if @REPLACE_LOGL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef logl
+# define logl rpl_logl
+# endif
+_GL_FUNCDECL_RPL (logl, long double, (long double x));
+_GL_CXXALIAS_RPL (logl, long double, (long double x));
+# else
+# if !@HAVE_LOGL@ || !@HAVE_DECL_LOGL@
+# undef logl
+_GL_FUNCDECL_SYS (logl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (logl, long double, (long double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (logl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef logl
+# if HAVE_RAW_DECL_LOGL
+_GL_WARN_ON_USE (logl, "logl is unportable - "
+ "use gnulib module logl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LOG10F@
+# if @REPLACE_LOG10F@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef log10f
+# define log10f rpl_log10f
+# endif
+_GL_FUNCDECL_RPL (log10f, float, (float x));
+_GL_CXXALIAS_RPL (log10f, float, (float x));
+# else
+# if !@HAVE_LOG10F@
+# undef log10f
+_GL_FUNCDECL_SYS (log10f, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (log10f, float, (float x));
+# endif
+_GL_CXXALIASWARN (log10f);
+#elif defined GNULIB_POSIXCHECK
+# undef log10f
+# if HAVE_RAW_DECL_LOG10F
+_GL_WARN_ON_USE (log10f, "log10f is unportable - "
+ "use gnulib module log10f for portability");
+# endif
+#endif
+
+#if @GNULIB_LOG10@
+# if @REPLACE_LOG10@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef log10
+# define log10 rpl_log10
+# endif
+_GL_FUNCDECL_RPL (log10, double, (double x));
+_GL_CXXALIAS_RPL (log10, double, (double x));
+# else
+_GL_CXXALIAS_SYS (log10, double, (double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN1 (log10, double, (double x));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef log10
+# if HAVE_RAW_DECL_LOG10
+_GL_WARN_ON_USE (log10, "log10 has portability problems - "
+ "use gnulib module log10 for portability");
+# endif
+#endif
+
+#if @GNULIB_LOG10L@
+# if @REPLACE_LOG10L@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef log10l
+# define log10l rpl_log10l
+# endif
+_GL_FUNCDECL_RPL (log10l, long double, (long double x));
+_GL_CXXALIAS_RPL (log10l, long double, (long double x));
+# else
+# if !@HAVE_LOG10L@ || !@HAVE_DECL_LOG10L@
+# undef log10l
+_GL_FUNCDECL_SYS (log10l, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (log10l, long double, (long double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (log10l);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef log10l
+# if HAVE_RAW_DECL_LOG10L
+_GL_WARN_ON_USE (log10l, "log10l is unportable - "
+ "use gnulib module log10l for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LOG1PF@
+# if @REPLACE_LOG1PF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef log1pf
+# define log1pf rpl_log1pf
+# endif
+_GL_FUNCDECL_RPL (log1pf, float, (float x));
+_GL_CXXALIAS_RPL (log1pf, float, (float x));
+# else
+# if !@HAVE_LOG1PF@
+_GL_FUNCDECL_SYS (log1pf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (log1pf, float, (float x));
+# endif
+_GL_CXXALIASWARN (log1pf);
+#elif defined GNULIB_POSIXCHECK
+# undef log1pf
+# if HAVE_RAW_DECL_LOG1PF
+_GL_WARN_ON_USE (log1pf, "log1pf is unportable - "
+ "use gnulib module log1pf for portability");
+# endif
+#endif
+
+#if @GNULIB_LOG1P@
+# if @REPLACE_LOG1P@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef log1p
+# define log1p rpl_log1p
+# endif
+_GL_FUNCDECL_RPL (log1p, double, (double x));
+_GL_CXXALIAS_RPL (log1p, double, (double x));
+# else
+# if !@HAVE_LOG1P@
+_GL_FUNCDECL_SYS (log1p, double, (double x));
+# endif
+_GL_CXXALIAS_SYS (log1p, double, (double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN1 (log1p, double, (double x));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef log1p
+# if HAVE_RAW_DECL_LOG1P
+_GL_WARN_ON_USE (log1p, "log1p has portability problems - "
+ "use gnulib module log1p for portability");
+# endif
+#endif
+
+#if @GNULIB_LOG1PL@
+# if @REPLACE_LOG1PL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef log1pl
+# define log1pl rpl_log1pl
+# endif
+_GL_FUNCDECL_RPL (log1pl, long double, (long double x));
+_GL_CXXALIAS_RPL (log1pl, long double, (long double x));
+# else
+# if !@HAVE_LOG1PL@
+_GL_FUNCDECL_SYS (log1pl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (log1pl, long double, (long double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (log1pl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef log1pl
+# if HAVE_RAW_DECL_LOG1PL
+_GL_WARN_ON_USE (log1pl, "log1pl has portability problems - "
+ "use gnulib module log1pl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LOG2F@
+# if @REPLACE_LOG2F@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef log2f
+# define log2f rpl_log2f
+# endif
+_GL_FUNCDECL_RPL (log2f, float, (float x));
+_GL_CXXALIAS_RPL (log2f, float, (float x));
+# else
+# if !@HAVE_DECL_LOG2F@
+# undef log2f
+_GL_FUNCDECL_SYS (log2f, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (log2f, float, (float x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (log2f);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef log2f
+# if HAVE_RAW_DECL_LOG2F
+_GL_WARN_ON_USE (log2f, "log2f is unportable - "
+ "use gnulib module log2f for portability");
+# endif
+#endif
+
+#if @GNULIB_LOG2@
+# if @REPLACE_LOG2@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef log2
+# define log2 rpl_log2
+# endif
+_GL_FUNCDECL_RPL (log2, double, (double x));
+_GL_CXXALIAS_RPL (log2, double, (double x));
+# else
+# if !@HAVE_DECL_LOG2@
+# undef log2
+_GL_FUNCDECL_SYS (log2, double, (double x));
+# endif
+_GL_CXXALIAS_SYS (log2, double, (double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN1 (log2, double, (double x));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef log2
+# if HAVE_RAW_DECL_LOG2
+_GL_WARN_ON_USE (log2, "log2 is unportable - "
+ "use gnulib module log2 for portability");
+# endif
+#endif
+
+#if @GNULIB_LOG2L@
+# if @REPLACE_LOG2L@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef log2l
+# define log2l rpl_log2l
+# endif
+_GL_FUNCDECL_RPL (log2l, long double, (long double x));
+_GL_CXXALIAS_RPL (log2l, long double, (long double x));
+# else
+# if !@HAVE_DECL_LOG2L@
+_GL_FUNCDECL_SYS (log2l, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (log2l, long double, (long double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (log2l);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef log2l
+# if HAVE_RAW_DECL_LOG2L
+_GL_WARN_ON_USE (log2l, "log2l is unportable - "
+ "use gnulib module log2l for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LOGBF@
+# if @REPLACE_LOGBF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef logbf
+# define logbf rpl_logbf
+# endif
+_GL_FUNCDECL_RPL (logbf, float, (float x));
+_GL_CXXALIAS_RPL (logbf, float, (float x));
+# else
+# if !@HAVE_LOGBF@
+_GL_FUNCDECL_SYS (logbf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (logbf, float, (float x));
+# endif
+_GL_CXXALIASWARN (logbf);
+#elif defined GNULIB_POSIXCHECK
+# undef logbf
+# if HAVE_RAW_DECL_LOGBF
+_GL_WARN_ON_USE (logbf, "logbf is unportable - "
+ "use gnulib module logbf for portability");
+# endif
+#endif
+
+#if @GNULIB_LOGB@
+# if @REPLACE_LOGB@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef logb
+# define logb rpl_logb
+# endif
+_GL_FUNCDECL_RPL (logb, double, (double x));
+_GL_CXXALIAS_RPL (logb, double, (double x));
+# else
+# if !@HAVE_DECL_LOGB@
+_GL_FUNCDECL_SYS (logb, double, (double x));
+# endif
+_GL_CXXALIAS_SYS (logb, double, (double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN1 (logb, double, (double x));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef logb
+# if HAVE_RAW_DECL_LOGB
+_GL_WARN_ON_USE (logb, "logb is unportable - "
+ "use gnulib module logb for portability");
+# endif
+#endif
+
+#if @GNULIB_LOGBL@
+# if @REPLACE_LOGBL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef logbl
+# define logbl rpl_logbl
+# endif
+_GL_FUNCDECL_RPL (logbl, long double, (long double x));
+_GL_CXXALIAS_RPL (logbl, long double, (long double x));
+# else
+# if !@HAVE_LOGBL@
+_GL_FUNCDECL_SYS (logbl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (logbl, long double, (long double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (logbl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef logbl
+# if HAVE_RAW_DECL_LOGBL
+_GL_WARN_ON_USE (logbl, "logbl is unportable - "
+ "use gnulib module logbl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MODFF@
+# if @REPLACE_MODFF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef modff
+# define modff rpl_modff
+# endif
+_GL_FUNCDECL_RPL (modff, float, (float x, float *iptr) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (modff, float, (float x, float *iptr));
+# else
+# if !@HAVE_MODFF@
+# undef modff
+_GL_FUNCDECL_SYS (modff, float, (float x, float *iptr) _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (modff, float, (float x, float *iptr));
+# endif
+_GL_CXXALIASWARN (modff);
+#elif defined GNULIB_POSIXCHECK
+# undef modff
+# if HAVE_RAW_DECL_MODFF
+_GL_WARN_ON_USE (modff, "modff is unportable - "
+ "use gnulib module modff for portability");
+# endif
+#endif
+
+#if @GNULIB_MODF@
+# if @REPLACE_MODF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef modf
+# define modf rpl_modf
+# endif
+_GL_FUNCDECL_RPL (modf, double, (double x, double *iptr) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (modf, double, (double x, double *iptr));
+# else
+_GL_CXXALIAS_SYS (modf, double, (double x, double *iptr));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN1 (modf, double, (double x, double *iptr));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef modf
+# if HAVE_RAW_DECL_MODF
+_GL_WARN_ON_USE (modf, "modf has portability problems - "
+ "use gnulib module modf for portability");
+# endif
+#endif
+
+#if @GNULIB_MODFL@
+# if @REPLACE_MODFL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef modfl
+# define modfl rpl_modfl
+# endif
+_GL_FUNCDECL_RPL (modfl, long double, (long double x, long double *iptr)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (modfl, long double, (long double x, long double *iptr));
+# else
+# if !@HAVE_MODFL@
+# undef modfl
+_GL_FUNCDECL_SYS (modfl, long double, (long double x, long double *iptr)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (modfl, long double, (long double x, long double *iptr));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (modfl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef modfl
+# if HAVE_RAW_DECL_MODFL
+_GL_WARN_ON_USE (modfl, "modfl is unportable - "
+ "use gnulib module modfl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_POWF@
+# if !@HAVE_POWF@
+# undef powf
+_GL_FUNCDECL_SYS (powf, float, (float x, float y));
+# endif
+_GL_CXXALIAS_SYS (powf, float, (float x, float y));
+_GL_CXXALIASWARN (powf);
+#elif defined GNULIB_POSIXCHECK
+# undef powf
+# if HAVE_RAW_DECL_POWF
+_GL_WARN_ON_USE (powf, "powf is unportable - "
+ "use gnulib module powf for portability");
+# endif
+#endif
+
+
+#if @GNULIB_REMAINDERF@
+# if @REPLACE_REMAINDERF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef remainderf
+# define remainderf rpl_remainderf
+# endif
+_GL_FUNCDECL_RPL (remainderf, float, (float x, float y));
+_GL_CXXALIAS_RPL (remainderf, float, (float x, float y));
+# else
+# if !@HAVE_REMAINDERF@
+_GL_FUNCDECL_SYS (remainderf, float, (float x, float y));
+# endif
+_GL_CXXALIAS_SYS (remainderf, float, (float x, float y));
+# endif
+_GL_CXXALIASWARN (remainderf);
+#elif defined GNULIB_POSIXCHECK
+# undef remainderf
+# if HAVE_RAW_DECL_REMAINDERF
+_GL_WARN_ON_USE (remainderf, "remainderf is unportable - "
+ "use gnulib module remainderf for portability");
+# endif
+#endif
+
+#if @GNULIB_REMAINDER@
+# if @REPLACE_REMAINDER@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef remainder
+# define remainder rpl_remainder
+# endif
+_GL_FUNCDECL_RPL (remainder, double, (double x, double y));
+_GL_CXXALIAS_RPL (remainder, double, (double x, double y));
+# else
+# if !@HAVE_REMAINDER@ || !@HAVE_DECL_REMAINDER@
+_GL_FUNCDECL_SYS (remainder, double, (double x, double y));
+# endif
+_GL_CXXALIAS_SYS (remainder, double, (double x, double y));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN1 (remainder, double, (double x, double y));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef remainder
+# if HAVE_RAW_DECL_REMAINDER
+_GL_WARN_ON_USE (remainder, "remainder is unportable - "
+ "use gnulib module remainder for portability");
+# endif
+#endif
+
+#if @GNULIB_REMAINDERL@
+# if @REPLACE_REMAINDERL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef remainderl
+# define remainderl rpl_remainderl
+# endif
+_GL_FUNCDECL_RPL (remainderl, long double, (long double x, long double y));
+_GL_CXXALIAS_RPL (remainderl, long double, (long double x, long double y));
+# else
+# if !@HAVE_DECL_REMAINDERL@
+# undef remainderl
+# if !(defined __cplusplus && defined _AIX)
+_GL_FUNCDECL_SYS (remainderl, long double, (long double x, long double y));
+# endif
+# endif
+_GL_CXXALIAS_SYS (remainderl, long double, (long double x, long double y));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (remainderl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef remainderl
+# if HAVE_RAW_DECL_REMAINDERL
+_GL_WARN_ON_USE (remainderl, "remainderl is unportable - "
+ "use gnulib module remainderl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_RINTF@
+# if !@HAVE_DECL_RINTF@
+_GL_FUNCDECL_SYS (rintf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (rintf, float, (float x));
+_GL_CXXALIASWARN (rintf);
+#elif defined GNULIB_POSIXCHECK
+# undef rintf
+# if HAVE_RAW_DECL_RINTF
+_GL_WARN_ON_USE (rintf, "rintf is unportable - "
+ "use gnulib module rintf for portability");
+# endif
+#endif
+
+#if @GNULIB_RINT@
+# if !@HAVE_RINT@
+_GL_FUNCDECL_SYS (rint, double, (double x));
+# endif
+_GL_CXXALIAS_SYS (rint, double, (double x));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN1 (rint, double, (double x));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef rint
+# if HAVE_RAW_DECL_RINT
+_GL_WARN_ON_USE (rint, "rint is unportable - "
+ "use gnulib module rint for portability");
+# endif
+#endif
+
+#if @GNULIB_RINTL@
+# if @REPLACE_RINTL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef rintl
+# define rintl rpl_rintl
+# endif
+_GL_FUNCDECL_RPL (rintl, long double, (long double x));
+_GL_CXXALIAS_RPL (rintl, long double, (long double x));
+# else
+# if !@HAVE_RINTL@
+_GL_FUNCDECL_SYS (rintl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (rintl, long double, (long double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (rintl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef rintl
+# if HAVE_RAW_DECL_RINTL
+_GL_WARN_ON_USE (rintl, "rintl is unportable - "
+ "use gnulib module rintl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ROUNDF@
+# if @REPLACE_ROUNDF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef roundf
+# define roundf rpl_roundf
+# endif
+_GL_FUNCDECL_RPL (roundf, float, (float x));
+_GL_CXXALIAS_RPL (roundf, float, (float x));
+# else
+# if !@HAVE_DECL_ROUNDF@
+_GL_FUNCDECL_SYS (roundf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (roundf, float, (float x));
+# endif
+_GL_CXXALIASWARN (roundf);
+#elif defined GNULIB_POSIXCHECK
+# undef roundf
+# if HAVE_RAW_DECL_ROUNDF
+_GL_WARN_ON_USE (roundf, "roundf is unportable - "
+ "use gnulib module roundf for portability");
+# endif
+#endif
+
+#if @GNULIB_ROUND@
+# if @REPLACE_ROUND@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef round
+# define round rpl_round
+# endif
+_GL_FUNCDECL_RPL (round, double, (double x));
+_GL_CXXALIAS_RPL (round, double, (double x));
+# else
+# if !@HAVE_DECL_ROUND@
+_GL_FUNCDECL_SYS (round, double, (double x));
+# endif
+_GL_CXXALIAS_SYS (round, double, (double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN1 (round, double, (double x));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef round
+# if HAVE_RAW_DECL_ROUND
+_GL_WARN_ON_USE (round, "round is unportable - "
+ "use gnulib module round for portability");
+# endif
+#endif
+
+#if @GNULIB_ROUNDL@
+# if @REPLACE_ROUNDL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef roundl
+# define roundl rpl_roundl
+# endif
+_GL_FUNCDECL_RPL (roundl, long double, (long double x));
+_GL_CXXALIAS_RPL (roundl, long double, (long double x));
+# else
+# if !@HAVE_DECL_ROUNDL@
+# undef roundl
+# if !(defined __cplusplus && defined _AIX)
+_GL_FUNCDECL_SYS (roundl, long double, (long double x));
+# endif
+# endif
+_GL_CXXALIAS_SYS (roundl, long double, (long double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (roundl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef roundl
+# if HAVE_RAW_DECL_ROUNDL
+_GL_WARN_ON_USE (roundl, "roundl is unportable - "
+ "use gnulib module roundl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SINF@
+# if @REPLACE_SINF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef sinf
+# define sinf rpl_sinf
+# endif
+_GL_FUNCDECL_RPL (sinf, float, (float x));
+_GL_CXXALIAS_RPL (sinf, float, (float x));
+# else
+# if !@HAVE_SINF@
+# undef sinf
+_GL_FUNCDECL_SYS (sinf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (sinf, float, (float x));
+# endif
+_GL_CXXALIASWARN (sinf);
+#elif defined GNULIB_POSIXCHECK
+# undef sinf
+# if HAVE_RAW_DECL_SINF
+_GL_WARN_ON_USE (sinf, "sinf is unportable - "
+ "use gnulib module sinf for portability");
+# endif
+#endif
+
+#if @GNULIB_SINL@
+# if !@HAVE_SINL@ || !@HAVE_DECL_SINL@
+# undef sinl
+_GL_FUNCDECL_SYS (sinl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (sinl, long double, (long double x));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (sinl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef sinl
+# if HAVE_RAW_DECL_SINL
+_GL_WARN_ON_USE (sinl, "sinl is unportable - "
+ "use gnulib module sinl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SINHF@
+# if @REPLACE_SINHF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef sinhf
+# define sinhf rpl_sinhf
+# endif
+_GL_FUNCDECL_RPL (sinhf, float, (float x));
+_GL_CXXALIAS_RPL (sinhf, float, (float x));
+# else
+# if !@HAVE_SINHF@
+# undef sinhf
+_GL_FUNCDECL_SYS (sinhf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (sinhf, float, (float x));
+# endif
+_GL_CXXALIASWARN (sinhf);
+#elif defined GNULIB_POSIXCHECK
+# undef sinhf
+# if HAVE_RAW_DECL_SINHF
+_GL_WARN_ON_USE (sinhf, "sinhf is unportable - "
+ "use gnulib module sinhf for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SQRTF@
+# if @REPLACE_SQRTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef sqrtf
+# define sqrtf rpl_sqrtf
+# endif
+_GL_FUNCDECL_RPL (sqrtf, float, (float x));
+_GL_CXXALIAS_RPL (sqrtf, float, (float x));
+# else
+# if !@HAVE_SQRTF@
+# undef sqrtf
+_GL_FUNCDECL_SYS (sqrtf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (sqrtf, float, (float x));
+# endif
+_GL_CXXALIASWARN (sqrtf);
+#elif defined GNULIB_POSIXCHECK
+# undef sqrtf
+# if HAVE_RAW_DECL_SQRTF
+_GL_WARN_ON_USE (sqrtf, "sqrtf is unportable - "
+ "use gnulib module sqrtf for portability");
+# endif
+#endif
+
+#if @GNULIB_SQRTL@
+# if @REPLACE_SQRTL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef sqrtl
+# define sqrtl rpl_sqrtl
+# endif
+_GL_FUNCDECL_RPL (sqrtl, long double, (long double x));
+_GL_CXXALIAS_RPL (sqrtl, long double, (long double x));
+# else
+# if !@HAVE_SQRTL@ || !@HAVE_DECL_SQRTL@
+# undef sqrtl
+_GL_FUNCDECL_SYS (sqrtl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (sqrtl, long double, (long double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (sqrtl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef sqrtl
+# if HAVE_RAW_DECL_SQRTL
+_GL_WARN_ON_USE (sqrtl, "sqrtl is unportable - "
+ "use gnulib module sqrtl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_TANF@
+# if @REPLACE_TANF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef tanf
+# define tanf rpl_tanf
+# endif
+_GL_FUNCDECL_RPL (tanf, float, (float x));
+_GL_CXXALIAS_RPL (tanf, float, (float x));
+# else
+# if !@HAVE_TANF@
+# undef tanf
+_GL_FUNCDECL_SYS (tanf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (tanf, float, (float x));
+# endif
+_GL_CXXALIASWARN (tanf);
+#elif defined GNULIB_POSIXCHECK
+# undef tanf
+# if HAVE_RAW_DECL_TANF
+_GL_WARN_ON_USE (tanf, "tanf is unportable - "
+ "use gnulib module tanf for portability");
+# endif
+#endif
+
+#if @GNULIB_TANL@
+# if !@HAVE_TANL@ || !@HAVE_DECL_TANL@
+# undef tanl
+_GL_FUNCDECL_SYS (tanl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (tanl, long double, (long double x));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (tanl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef tanl
+# if HAVE_RAW_DECL_TANL
+_GL_WARN_ON_USE (tanl, "tanl is unportable - "
+ "use gnulib module tanl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_TANHF@
+# if @REPLACE_TANHF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef tanhf
+# define tanhf rpl_tanhf
+# endif
+_GL_FUNCDECL_RPL (tanhf, float, (float x));
+_GL_CXXALIAS_RPL (tanhf, float, (float x));
+# else
+# if !@HAVE_TANHF@
+# undef tanhf
+_GL_FUNCDECL_SYS (tanhf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (tanhf, float, (float x));
+# endif
+_GL_CXXALIASWARN (tanhf);
+#elif defined GNULIB_POSIXCHECK
+# undef tanhf
+# if HAVE_RAW_DECL_TANHF
+_GL_WARN_ON_USE (tanhf, "tanhf is unportable - "
+ "use gnulib module tanhf for portability");
+# endif
+#endif
+
+
+#if @GNULIB_TRUNCF@
+# if @REPLACE_TRUNCF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef truncf
+# define truncf rpl_truncf
+# endif
+_GL_FUNCDECL_RPL (truncf, float, (float x));
+_GL_CXXALIAS_RPL (truncf, float, (float x));
+# else
+# if !@HAVE_DECL_TRUNCF@
+_GL_FUNCDECL_SYS (truncf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (truncf, float, (float x));
+# endif
+_GL_CXXALIASWARN (truncf);
+#elif defined GNULIB_POSIXCHECK
+# undef truncf
+# if HAVE_RAW_DECL_TRUNCF
+_GL_WARN_ON_USE (truncf, "truncf is unportable - "
+ "use gnulib module truncf for portability");
+# endif
+#endif
+
+#if @GNULIB_TRUNC@
+# if @REPLACE_TRUNC@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef trunc
+# define trunc rpl_trunc
+# endif
+_GL_FUNCDECL_RPL (trunc, double, (double x));
+_GL_CXXALIAS_RPL (trunc, double, (double x));
+# else
+# if !@HAVE_DECL_TRUNC@
+_GL_FUNCDECL_SYS (trunc, double, (double x));
+# endif
+_GL_CXXALIAS_SYS (trunc, double, (double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN1 (trunc, double, (double x));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef trunc
+# if HAVE_RAW_DECL_TRUNC
+_GL_WARN_ON_USE (trunc, "trunc is unportable - "
+ "use gnulib module trunc for portability");
+# endif
+#endif
+
+#if @GNULIB_TRUNCL@
+# if @REPLACE_TRUNCL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef truncl
+# define truncl rpl_truncl
+# endif
+_GL_FUNCDECL_RPL (truncl, long double, (long double x));
+_GL_CXXALIAS_RPL (truncl, long double, (long double x));
+# else
+# if !@HAVE_DECL_TRUNCL@
+_GL_FUNCDECL_SYS (truncl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (truncl, long double, (long double x));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (truncl);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef truncl
+# if HAVE_RAW_DECL_TRUNCL
+_GL_WARN_ON_USE (truncl, "truncl is unportable - "
+ "use gnulib module truncl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MDA_Y0@
+/* On native Windows, map 'y0' to '_y0', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::y0 always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef y0
+# define y0 _y0
+# endif
+_GL_CXXALIAS_MDA (y0, double, (double x));
+# else
+_GL_CXXALIAS_SYS (y0, double, (double x));
+# endif
+_GL_CXXALIASWARN (y0);
+#endif
+
+#if @GNULIB_MDA_Y1@
+/* On native Windows, map 'y1' to '_y1', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::y1 always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef y1
+# define y1 _y1
+# endif
+_GL_CXXALIAS_MDA (y1, double, (double x));
+# else
+_GL_CXXALIAS_SYS (y1, double, (double x));
+# endif
+_GL_CXXALIASWARN (y1);
+#endif
+
+#if @GNULIB_MDA_YN@
+/* On native Windows, map 'yn' to '_yn', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::yn always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef yn
+# define yn _yn
+# endif
+_GL_CXXALIAS_MDA (yn, double, (int n, double x));
+# else
+_GL_CXXALIAS_SYS (yn, double, (int n, double x));
+# endif
+_GL_CXXALIASWARN (yn);
+#endif
+
+
+/* Definitions of function-like macros come here, after the function
+ declarations. */
+
+
+#if @GNULIB_ISFINITE@
+# if @REPLACE_ISFINITE@
+_GL_EXTERN_C int gl_isfinitef (float x);
+_GL_EXTERN_C int gl_isfinited (double x);
+_GL_EXTERN_C int gl_isfinitel (long double x);
+# undef isfinite
+# define isfinite(x) \
+ (sizeof (x) == sizeof (long double) ? gl_isfinitel (x) : \
+ sizeof (x) == sizeof (double) ? gl_isfinited (x) : \
+ gl_isfinitef (x))
+# endif
+# ifdef __cplusplus
+# if defined isfinite || defined GNULIB_NAMESPACE
+_GL_MATH_CXX_REAL_FLOATING_DECL_1 (isfinite)
+# undef isfinite
+# if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || defined _AIX || (defined _WIN32 && !defined __CYGWIN__)))
+ /* This platform's <cmath> possibly defines isfinite through a set of inline
+ functions. */
+_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isfinite, rpl_isfinite, bool)
+# define isfinite rpl_isfinite
+# define GNULIB_NAMESPACE_LACKS_ISFINITE 1
+# else
+_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isfinite, isfinite, bool)
+# endif
+# endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# if defined isfinite
+_GL_WARN_REAL_FLOATING_DECL (isfinite);
+# undef isfinite
+# define isfinite(x) _GL_WARN_REAL_FLOATING_IMPL (isfinite, x)
+# endif
+#endif
+
+
+#if @GNULIB_ISINF@
+# if @REPLACE_ISINF@
+_GL_EXTERN_C int gl_isinff (float x);
+_GL_EXTERN_C int gl_isinfd (double x);
+_GL_EXTERN_C int gl_isinfl (long double x);
+# undef isinf
+# define isinf(x) \
+ (sizeof (x) == sizeof (long double) ? gl_isinfl (x) : \
+ sizeof (x) == sizeof (double) ? gl_isinfd (x) : \
+ gl_isinff (x))
+# endif
+# ifdef __cplusplus
+# if defined isinf || defined GNULIB_NAMESPACE
+_GL_MATH_CXX_REAL_FLOATING_DECL_1 (isinf)
+# undef isinf
+# if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || (defined _WIN32 && !defined __CYGWIN__)))
+ /* This platform's <cmath> possibly defines isinf through a set of inline
+ functions. */
+_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isinf, rpl_isinf, bool)
+# define isinf rpl_isinf
+# define GNULIB_NAMESPACE_LACKS_ISINF 1
+# else
+_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isinf, isinf, bool)
+# endif
+# endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# if defined isinf
+_GL_WARN_REAL_FLOATING_DECL (isinf);
+# undef isinf
+# define isinf(x) _GL_WARN_REAL_FLOATING_IMPL (isinf, x)
+# endif
+#endif
+
+
+#if @GNULIB_ISNANF@
+/* Test for NaN for 'float' numbers. */
+# if @HAVE_ISNANF@
+/* The original <math.h> included above provides a declaration of isnan macro
+ or (older) isnanf function. */
+# if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+ /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.
+ GCC >= 4.0 also provides __builtin_isnanf, but clang doesn't. */
+# undef isnanf
+# define isnanf(x) __builtin_isnan ((float)(x))
+# elif defined isnan
+# undef isnanf
+# define isnanf(x) isnan ((float)(x))
+# endif
+# else
+/* Test whether X is a NaN. */
+# undef isnanf
+# define isnanf rpl_isnanf
+_GL_EXTERN_C int isnanf (float x);
+# endif
+#endif
+
+#if @GNULIB_ISNAND@
+/* Test for NaN for 'double' numbers.
+ This function is a gnulib extension, unlike isnan() which applied only
+ to 'double' numbers earlier but now is a type-generic macro. */
+# if @HAVE_ISNAND@
+/* The original <math.h> included above provides a declaration of isnan
+ macro. */
+# if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+ /* GCC >= 4.0 and clang provide a type-generic built-in for isnan. */
+# undef isnand
+# define isnand(x) __builtin_isnan ((double)(x))
+# else
+# undef isnand
+# define isnand(x) isnan ((double)(x))
+# endif
+# else
+/* Test whether X is a NaN. */
+# undef isnand
+# define isnand rpl_isnand
+_GL_EXTERN_C int isnand (double x);
+# endif
+#endif
+
+#if @GNULIB_ISNANL@
+/* Test for NaN for 'long double' numbers. */
+# if @HAVE_ISNANL@
+/* The original <math.h> included above provides a declaration of isnan
+ macro or (older) isnanl function. */
+# if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+ /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.
+ GCC >= 4.0 also provides __builtin_isnanl, but clang doesn't. */
+# undef isnanl
+# define isnanl(x) __builtin_isnan ((long double)(x))
+# elif defined isnan
+# undef isnanl
+# define isnanl(x) isnan ((long double)(x))
+# endif
+# else
+/* Test whether X is a NaN. */
+# undef isnanl
+# define isnanl rpl_isnanl
+_GL_EXTERN_C int isnanl (long double x) _GL_ATTRIBUTE_CONST;
+# endif
+#endif
+
+/* This must come *after* the snippets for GNULIB_ISNANF and GNULIB_ISNANL! */
+#if @GNULIB_ISNAN@
+# if @REPLACE_ISNAN@
+/* We can't just use the isnanf macro (e.g.) as exposed by
+ isnanf.h (e.g.) here, because those may end up being macros
+ that recursively expand back to isnan. So use the gnulib
+ replacements for them directly. */
+# if @HAVE_ISNANF@ && (__GNUC__ >= 4) || (__clang_major__ >= 4)
+# define gl_isnan_f(x) __builtin_isnan ((float)(x))
+# else
+_GL_EXTERN_C int rpl_isnanf (float x);
+# define gl_isnan_f(x) rpl_isnanf (x)
+# endif
+# if @HAVE_ISNAND@ && (__GNUC__ >= 4) || (__clang_major__ >= 4)
+# define gl_isnan_d(x) __builtin_isnan ((double)(x))
+# else
+_GL_EXTERN_C int rpl_isnand (double x);
+# define gl_isnan_d(x) rpl_isnand (x)
+# endif
+# if @HAVE_ISNANL@ && (__GNUC__ >= 4) || (__clang_major__ >= 4)
+# define gl_isnan_l(x) __builtin_isnan ((long double)(x))
+# else
+_GL_EXTERN_C int rpl_isnanl (long double x) _GL_ATTRIBUTE_CONST;
+# define gl_isnan_l(x) rpl_isnanl (x)
+# endif
+# undef isnan
+# define isnan(x) \
+ (sizeof (x) == sizeof (long double) ? gl_isnan_l (x) : \
+ sizeof (x) == sizeof (double) ? gl_isnan_d (x) : \
+ gl_isnan_f (x))
+# elif (__GNUC__ >= 4) || (__clang_major__ >= 4)
+# undef isnan
+# define isnan(x) \
+ (sizeof (x) == sizeof (long double) ? __builtin_isnan ((long double)(x)) : \
+ sizeof (x) == sizeof (double) ? __builtin_isnan ((double)(x)) : \
+ __builtin_isnan ((float)(x)))
+# endif
+# ifdef __cplusplus
+# if defined isnan || defined GNULIB_NAMESPACE
+_GL_MATH_CXX_REAL_FLOATING_DECL_1 (isnan)
+# undef isnan
+# if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__ && __clang_major__ < 12) || (defined __FreeBSD__ && (__clang_major__ < 7 || __clang_major__ >= 11)) || defined __OpenBSD__ || (defined _WIN32 && !defined __CYGWIN__)))
+ /* This platform's <cmath> possibly defines isnan through a set of inline
+ functions. */
+_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isnan, rpl_isnan, bool)
+# define isnan rpl_isnan
+# define GNULIB_NAMESPACE_LACKS_ISNAN 1
+# else
+_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isnan, isnan, bool)
+# endif
+# endif
+# else
+/* Ensure isnan is a macro. */
+# ifndef isnan
+# define isnan isnan
+# endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# if defined isnan
+_GL_WARN_REAL_FLOATING_DECL (isnan);
+# undef isnan
+# define isnan(x) _GL_WARN_REAL_FLOATING_IMPL (isnan, x)
+# endif
+#endif
+
+
+#if @GNULIB_SIGNBIT@
+# if (@REPLACE_SIGNBIT_USING_BUILTINS@ \
+ && (!defined __cplusplus || __cplusplus < 201103))
+# undef signbit
+ /* GCC >= 4.0 and clang provide three built-ins for signbit. */
+# define signbit(x) \
+ (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \
+ sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \
+ __builtin_signbitf (x))
+# endif
+# if @REPLACE_SIGNBIT@ && !GNULIB_defined_signbit
+# undef signbit
+_GL_EXTERN_C int gl_signbitf (float arg);
+_GL_EXTERN_C int gl_signbitd (double arg);
+_GL_EXTERN_C int gl_signbitl (long double arg);
+# if (__GNUC__ >= 2 || defined __clang__) && !defined __STRICT_ANSI__
+# define _GL_NUM_UINT_WORDS(type) \
+ ((sizeof (type) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+# if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT && !defined gl_signbitf
+# define gl_signbitf_OPTIMIZED_MACRO
+# define gl_signbitf(arg) \
+ ({ union { float _value; \
+ unsigned int _word[_GL_NUM_UINT_WORDS (float)]; \
+ } _m; \
+ _m._value = (arg); \
+ (_m._word[FLT_SIGNBIT_WORD] >> FLT_SIGNBIT_BIT) & 1; \
+ })
+# endif
+# if defined DBL_SIGNBIT_WORD && defined DBL_SIGNBIT_BIT && !defined gl_signbitd
+# define gl_signbitd_OPTIMIZED_MACRO
+# define gl_signbitd(arg) \
+ ({ union { double _value; \
+ unsigned int _word[_GL_NUM_UINT_WORDS (double)]; \
+ } _m; \
+ _m._value = (arg); \
+ (_m._word[DBL_SIGNBIT_WORD] >> DBL_SIGNBIT_BIT) & 1; \
+ })
+# endif
+# if defined LDBL_SIGNBIT_WORD && defined LDBL_SIGNBIT_BIT && !defined gl_signbitl
+# define gl_signbitl_OPTIMIZED_MACRO
+# define gl_signbitl(arg) \
+ ({ union { long double _value; \
+ unsigned int _word[_GL_NUM_UINT_WORDS (long double)]; \
+ } _m; \
+ _m._value = (arg); \
+ (_m._word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1; \
+ })
+# endif
+# endif
+# define signbit(x) \
+ (sizeof (x) == sizeof (long double) ? gl_signbitl (x) : \
+ sizeof (x) == sizeof (double) ? gl_signbitd (x) : \
+ gl_signbitf (x))
+# define GNULIB_defined_signbit 1
+# endif
+# ifdef __cplusplus
+# if defined signbit || defined GNULIB_NAMESPACE
+_GL_MATH_CXX_REAL_FLOATING_DECL_1 (signbit)
+# undef signbit
+# if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || defined _AIX || (defined _WIN32 && !defined __CYGWIN__)))
+ /* This platform's <cmath> possibly defines signbit through a set of inline
+ functions. */
+_GL_MATH_CXX_REAL_FLOATING_DECL_2 (signbit, rpl_signbit, bool)
+# define signbit rpl_signbit
+# define GNULIB_NAMESPACE_LACKS_SIGNBIT 1
+# else
+_GL_MATH_CXX_REAL_FLOATING_DECL_2 (signbit, signbit, bool)
+# endif
+# endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# if defined signbit
+_GL_WARN_REAL_FLOATING_DECL (signbit);
+# undef signbit
+# define signbit(x) _GL_WARN_REAL_FLOATING_IMPL (signbit, x)
+# endif
+#endif
+
+_GL_INLINE_HEADER_END
+
+#endif /* _@GUARD_PREFIX@_MATH_H */
+#endif /* _GL_INCLUDING_MATH_H */
+#endif /* _@GUARD_PREFIX@_MATH_H */
+#endif
diff --git a/lib/memchr.c b/lib/memchr.c
new file mode 100644
index 0000000..8e95579
--- /dev/null
+++ b/lib/memchr.c
@@ -0,0 +1,172 @@
+/* Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2004, 2006, 2008-2023
+ Free Software Foundation, Inc.
+
+ Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
+ with help from Dan Sahlin (dan@sics.se) and
+ commentary by Jim Blandy (jimb@ai.mit.edu);
+ adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),
+ and implemented by Roland McGrath (roland@ai.mit.edu).
+
+ NOTE: The canonical source of this file is maintained with the GNU C Library.
+ Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#include <stddef.h>
+
+#if defined _LIBC
+# include <memcopy.h>
+#else
+# define reg_char char
+#endif
+
+#include <limits.h>
+
+#if HAVE_BP_SYM_H || defined _LIBC
+# include <bp-sym.h>
+#else
+# define BP_SYM(sym) sym
+#endif
+
+#undef __memchr
+#ifdef _LIBC
+# undef memchr
+#endif
+
+#ifndef weak_alias
+# define __memchr memchr
+#endif
+
+/* Search no more than N bytes of S for C. */
+void *
+__memchr (void const *s, int c_in, size_t n)
+{
+ /* On 32-bit hardware, choosing longword to be a 32-bit unsigned
+ long instead of a 64-bit uintmax_t tends to give better
+ performance. On 64-bit hardware, unsigned long is generally 64
+ bits already. Change this typedef to experiment with
+ performance. */
+ typedef unsigned long int longword;
+
+ const unsigned char *char_ptr;
+ const longword *longword_ptr;
+ longword repeated_one;
+ longword repeated_c;
+ unsigned reg_char c;
+
+ c = (unsigned char) c_in;
+
+ /* Handle the first few bytes by reading one byte at a time.
+ Do this until CHAR_PTR is aligned on a longword boundary. */
+ for (char_ptr = (const unsigned char *) s;
+ n > 0 && (size_t) char_ptr % sizeof (longword) != 0;
+ --n, ++char_ptr)
+ if (*char_ptr == c)
+ return (void *) char_ptr;
+
+ longword_ptr = (const longword *) char_ptr;
+
+ /* All these elucidatory comments refer to 4-byte longwords,
+ but the theory applies equally well to any size longwords. */
+
+ /* Compute auxiliary longword values:
+ repeated_one is a value which has a 1 in every byte.
+ repeated_c has c in every byte. */
+ repeated_one = 0x01010101;
+ repeated_c = c | (c << 8);
+ repeated_c |= repeated_c << 16;
+ if (0xffffffffU < (longword) -1)
+ {
+ repeated_one |= repeated_one << 31 << 1;
+ repeated_c |= repeated_c << 31 << 1;
+ if (8 < sizeof (longword))
+ {
+ size_t i;
+
+ for (i = 64; i < sizeof (longword) * 8; i *= 2)
+ {
+ repeated_one |= repeated_one << i;
+ repeated_c |= repeated_c << i;
+ }
+ }
+ }
+
+ /* Instead of the traditional loop which tests each byte, we will test a
+ longword at a time. The tricky part is testing if *any of the four*
+ bytes in the longword in question are equal to c. We first use an xor
+ with repeated_c. This reduces the task to testing whether *any of the
+ four* bytes in longword1 is zero.
+
+ We compute tmp =
+ ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
+ That is, we perform the following operations:
+ 1. Subtract repeated_one.
+ 2. & ~longword1.
+ 3. & a mask consisting of 0x80 in every byte.
+ Consider what happens in each byte:
+ - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
+ and step 3 transforms it into 0x80. A carry can also be propagated
+ to more significant bytes.
+ - If a byte of longword1 is nonzero, let its lowest 1 bit be at
+ position k (0 <= k <= 7); so the lowest k bits are 0. After step 1,
+ the byte ends in a single bit of value 0 and k bits of value 1.
+ After step 2, the result is just k bits of value 1: 2^k - 1. After
+ step 3, the result is 0. And no carry is produced.
+ So, if longword1 has only non-zero bytes, tmp is zero.
+ Whereas if longword1 has a zero byte, call j the position of the least
+ significant zero byte. Then the result has a zero at positions 0, ...,
+ j-1 and a 0x80 at position j. We cannot predict the result at the more
+ significant bytes (positions j+1..3), but it does not matter since we
+ already have a non-zero bit at position 8*j+7.
+
+ So, the test whether any byte in longword1 is zero is equivalent to
+ testing whether tmp is nonzero. */
+
+ while (n >= sizeof (longword))
+ {
+ longword longword1 = *longword_ptr ^ repeated_c;
+
+ if ((((longword1 - repeated_one) & ~longword1)
+ & (repeated_one << 7)) != 0)
+ break;
+ longword_ptr++;
+ n -= sizeof (longword);
+ }
+
+ char_ptr = (const unsigned char *) longword_ptr;
+
+ /* At this point, we know that either n < sizeof (longword), or one of the
+ sizeof (longword) bytes starting at char_ptr is == c. On little-endian
+ machines, we could determine the first such byte without any further
+ memory accesses, just by looking at the tmp result from the last loop
+ iteration. But this does not work on big-endian machines. Choose code
+ that works in both cases. */
+
+ for (; n > 0; --n, ++char_ptr)
+ {
+ if (*char_ptr == c)
+ return (void *) char_ptr;
+ }
+
+ return NULL;
+}
+#ifdef weak_alias
+weak_alias (__memchr, BP_SYM (memchr))
+#endif
diff --git a/lib/memchr.valgrind b/lib/memchr.valgrind
new file mode 100644
index 0000000..97690f2
--- /dev/null
+++ b/lib/memchr.valgrind
@@ -0,0 +1,30 @@
+# Suppress a valgrind message about use of uninitialized memory in memchr().
+
+# Copyright (C) 2009-2023 Free Software Foundation, Inc.
+#
+# This file is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of the
+# License, or (at your option) any later version.
+#
+# This file 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 Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+# POSIX states that when the character is found, memchr must not read extra
+# bytes in an overestimated length (for example, where memchr is used to
+# implement strnlen). However, we use a safe word read to provide a speedup.
+{
+ memchr-value4
+ Memcheck:Value4
+ fun:rpl_memchr
+}
+{
+ memchr-value8
+ Memcheck:Value8
+ fun:rpl_memchr
+}
diff --git a/lib/printf-args.c b/lib/printf-args.c
new file mode 100644
index 0000000..5e14f65
--- /dev/null
+++ b/lib/printf-args.c
@@ -0,0 +1,183 @@
+/* Decomposed printf argument list.
+ Copyright (C) 1999, 2002-2003, 2005-2007, 2009-2023 Free Software
+ Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* This file can be parametrized with the following macros:
+ ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
+ PRINTF_FETCHARGS Name of the function to be defined.
+ STATIC Set to 'static' to declare the function static. */
+
+#ifndef PRINTF_FETCHARGS
+# include <config.h>
+#endif
+
+/* Specification. */
+#ifndef PRINTF_FETCHARGS
+# include "printf-args.h"
+#endif
+
+#ifdef STATIC
+STATIC
+#endif
+int
+PRINTF_FETCHARGS (va_list args, arguments *a)
+{
+ size_t i;
+ argument *ap;
+
+ for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++)
+ switch (ap->type)
+ {
+ case TYPE_SCHAR:
+ ap->a.a_schar = va_arg (args, /*signed char*/ int);
+ break;
+ case TYPE_UCHAR:
+ ap->a.a_uchar = va_arg (args, /*unsigned char*/ int);
+ break;
+ case TYPE_SHORT:
+ ap->a.a_short = va_arg (args, /*short*/ int);
+ break;
+ case TYPE_USHORT:
+ ap->a.a_ushort = va_arg (args, /*unsigned short*/ int);
+ break;
+ case TYPE_INT:
+ ap->a.a_int = va_arg (args, int);
+ break;
+ case TYPE_UINT:
+ ap->a.a_uint = va_arg (args, unsigned int);
+ break;
+ case TYPE_LONGINT:
+ ap->a.a_longint = va_arg (args, long int);
+ break;
+ case TYPE_ULONGINT:
+ ap->a.a_ulongint = va_arg (args, unsigned long int);
+ break;
+ case TYPE_LONGLONGINT:
+ ap->a.a_longlongint = va_arg (args, long long int);
+ break;
+ case TYPE_ULONGLONGINT:
+ ap->a.a_ulonglongint = va_arg (args, unsigned long long int);
+ break;
+ case TYPE_DOUBLE:
+ ap->a.a_double = va_arg (args, double);
+ break;
+ case TYPE_LONGDOUBLE:
+ ap->a.a_longdouble = va_arg (args, long double);
+ break;
+ case TYPE_CHAR:
+ ap->a.a_char = va_arg (args, int);
+ break;
+#if HAVE_WINT_T
+ case TYPE_WIDE_CHAR:
+ /* Although ISO C 99 7.24.1.(2) says that wint_t is "unchanged by
+ default argument promotions", this is not the case in mingw32,
+ where wint_t is 'unsigned short'. */
+ ap->a.a_wide_char =
+ (sizeof (wint_t) < sizeof (int)
+ ? (wint_t) va_arg (args, int)
+ : va_arg (args, wint_t));
+ break;
+#endif
+ case TYPE_STRING:
+ ap->a.a_string = va_arg (args, const char *);
+ /* A null pointer is an invalid argument for "%s", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_string == NULL)
+ ap->a.a_string = "(NULL)";
+ break;
+#if HAVE_WCHAR_T
+ case TYPE_WIDE_STRING:
+ ap->a.a_wide_string = va_arg (args, const wchar_t *);
+ /* A null pointer is an invalid argument for "%ls", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_wide_string == NULL)
+ {
+ static const wchar_t wide_null_string[] =
+ {
+ (wchar_t)'(',
+ (wchar_t)'N', (wchar_t)'U', (wchar_t)'L', (wchar_t)'L',
+ (wchar_t)')',
+ (wchar_t)0
+ };
+ ap->a.a_wide_string = wide_null_string;
+ }
+ break;
+#endif
+ case TYPE_POINTER:
+ ap->a.a_pointer = va_arg (args, void *);
+ break;
+ case TYPE_COUNT_SCHAR_POINTER:
+ ap->a.a_count_schar_pointer = va_arg (args, signed char *);
+ break;
+ case TYPE_COUNT_SHORT_POINTER:
+ ap->a.a_count_short_pointer = va_arg (args, short *);
+ break;
+ case TYPE_COUNT_INT_POINTER:
+ ap->a.a_count_int_pointer = va_arg (args, int *);
+ break;
+ case TYPE_COUNT_LONGINT_POINTER:
+ ap->a.a_count_longint_pointer = va_arg (args, long int *);
+ break;
+ case TYPE_COUNT_LONGLONGINT_POINTER:
+ ap->a.a_count_longlongint_pointer = va_arg (args, long long int *);
+ break;
+#if ENABLE_UNISTDIO
+ /* The unistdio extensions. */
+ case TYPE_U8_STRING:
+ ap->a.a_u8_string = va_arg (args, const uint8_t *);
+ /* A null pointer is an invalid argument for "%U", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_u8_string == NULL)
+ {
+ static const uint8_t u8_null_string[] =
+ { '(', 'N', 'U', 'L', 'L', ')', 0 };
+ ap->a.a_u8_string = u8_null_string;
+ }
+ break;
+ case TYPE_U16_STRING:
+ ap->a.a_u16_string = va_arg (args, const uint16_t *);
+ /* A null pointer is an invalid argument for "%lU", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_u16_string == NULL)
+ {
+ static const uint16_t u16_null_string[] =
+ { '(', 'N', 'U', 'L', 'L', ')', 0 };
+ ap->a.a_u16_string = u16_null_string;
+ }
+ break;
+ case TYPE_U32_STRING:
+ ap->a.a_u32_string = va_arg (args, const uint32_t *);
+ /* A null pointer is an invalid argument for "%llU", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_u32_string == NULL)
+ {
+ static const uint32_t u32_null_string[] =
+ { '(', 'N', 'U', 'L', 'L', ')', 0 };
+ ap->a.a_u32_string = u32_null_string;
+ }
+ break;
+#endif
+ default:
+ /* Unknown type. */
+ return -1;
+ }
+ return 0;
+}
diff --git a/lib/printf-args.h b/lib/printf-args.h
new file mode 100644
index 0000000..f303cb1
--- /dev/null
+++ b/lib/printf-args.h
@@ -0,0 +1,150 @@
+/* Decomposed printf argument list.
+ Copyright (C) 1999, 2002-2003, 2006-2007, 2011-2023 Free Software
+ Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#ifndef _PRINTF_ARGS_H
+#define _PRINTF_ARGS_H
+
+/* This file can be parametrized with the following macros:
+ ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
+ PRINTF_FETCHARGS Name of the function to be declared.
+ STATIC Set to 'static' to declare the function static. */
+
+/* Default parameters. */
+#ifndef PRINTF_FETCHARGS
+# define PRINTF_FETCHARGS printf_fetchargs
+#endif
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get wchar_t. */
+#if HAVE_WCHAR_T
+# include <stddef.h>
+#endif
+
+/* Get wint_t. */
+#if HAVE_WINT_T
+# include <wchar.h>
+#endif
+
+/* Get va_list. */
+#include <stdarg.h>
+
+
+/* Argument types */
+typedef enum
+{
+ TYPE_NONE,
+ TYPE_SCHAR,
+ TYPE_UCHAR,
+ TYPE_SHORT,
+ TYPE_USHORT,
+ TYPE_INT,
+ TYPE_UINT,
+ TYPE_LONGINT,
+ TYPE_ULONGINT,
+ TYPE_LONGLONGINT,
+ TYPE_ULONGLONGINT,
+ TYPE_DOUBLE,
+ TYPE_LONGDOUBLE,
+ TYPE_CHAR,
+#if HAVE_WINT_T
+ TYPE_WIDE_CHAR,
+#endif
+ TYPE_STRING,
+#if HAVE_WCHAR_T
+ TYPE_WIDE_STRING,
+#endif
+ TYPE_POINTER,
+ TYPE_COUNT_SCHAR_POINTER,
+ TYPE_COUNT_SHORT_POINTER,
+ TYPE_COUNT_INT_POINTER,
+ TYPE_COUNT_LONGINT_POINTER,
+ TYPE_COUNT_LONGLONGINT_POINTER
+#if ENABLE_UNISTDIO
+ /* The unistdio extensions. */
+, TYPE_U8_STRING
+, TYPE_U16_STRING
+, TYPE_U32_STRING
+#endif
+} arg_type;
+
+/* Polymorphic argument */
+typedef struct
+{
+ arg_type type;
+ union
+ {
+ signed char a_schar;
+ unsigned char a_uchar;
+ short a_short;
+ unsigned short a_ushort;
+ int a_int;
+ unsigned int a_uint;
+ long int a_longint;
+ unsigned long int a_ulongint;
+ long long int a_longlongint;
+ unsigned long long int a_ulonglongint;
+ float a_float;
+ double a_double;
+ long double a_longdouble;
+ int a_char;
+#if HAVE_WINT_T
+ wint_t a_wide_char;
+#endif
+ const char* a_string;
+#if HAVE_WCHAR_T
+ const wchar_t* a_wide_string;
+#endif
+ void* a_pointer;
+ signed char * a_count_schar_pointer;
+ short * a_count_short_pointer;
+ int * a_count_int_pointer;
+ long int * a_count_longint_pointer;
+ long long int * a_count_longlongint_pointer;
+#if ENABLE_UNISTDIO
+ /* The unistdio extensions. */
+ const uint8_t * a_u8_string;
+ const uint16_t * a_u16_string;
+ const uint32_t * a_u32_string;
+#endif
+ }
+ a;
+}
+argument;
+
+/* Number of directly allocated arguments (no malloc() needed). */
+#define N_DIRECT_ALLOC_ARGUMENTS 7
+
+typedef struct
+{
+ size_t count;
+ argument *arg;
+ argument direct_alloc_arg[N_DIRECT_ALLOC_ARGUMENTS];
+}
+arguments;
+
+
+/* Fetch the arguments, putting them into a. */
+#ifdef STATIC
+STATIC
+#else
+extern
+#endif
+int PRINTF_FETCHARGS (va_list args, arguments *a);
+
+#endif /* _PRINTF_ARGS_H */
diff --git a/lib/printf-frexp.c b/lib/printf-frexp.c
new file mode 100644
index 0000000..8252b06
--- /dev/null
+++ b/lib/printf-frexp.c
@@ -0,0 +1,190 @@
+/* Split a double into fraction and mantissa, for hexadecimal printf.
+ Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#if ! defined USE_LONG_DOUBLE
+# include <config.h>
+#endif
+
+/* Specification. */
+#ifdef USE_LONG_DOUBLE
+# include "printf-frexpl.h"
+#else
+# include "printf-frexp.h"
+#endif
+
+#include <float.h>
+#include <math.h>
+#ifdef USE_LONG_DOUBLE
+# include "fpucw.h"
+#endif
+
+/* This file assumes FLT_RADIX = 2. If FLT_RADIX is a power of 2 greater
+ than 2, or not even a power of 2, some rounding errors can occur, so that
+ then the returned mantissa is only guaranteed to be <= 2.0, not < 2.0. */
+
+#ifdef USE_LONG_DOUBLE
+# define FUNC printf_frexpl
+# define DOUBLE long double
+# define MIN_EXP LDBL_MIN_EXP
+# if HAVE_FREXPL_IN_LIBC && HAVE_LDEXPL_IN_LIBC
+# define USE_FREXP_LDEXP
+# define FREXP frexpl
+# define LDEXP ldexpl
+# endif
+# define DECL_ROUNDING DECL_LONG_DOUBLE_ROUNDING
+# define BEGIN_ROUNDING() BEGIN_LONG_DOUBLE_ROUNDING ()
+# define END_ROUNDING() END_LONG_DOUBLE_ROUNDING ()
+# define L_(literal) literal##L
+#else
+# define FUNC printf_frexp
+# define DOUBLE double
+# define MIN_EXP DBL_MIN_EXP
+# if HAVE_FREXP_IN_LIBC && HAVE_LDEXP_IN_LIBC
+# define USE_FREXP_LDEXP
+# define FREXP frexp
+# define LDEXP ldexp
+# endif
+# define DECL_ROUNDING
+# define BEGIN_ROUNDING()
+# define END_ROUNDING()
+# define L_(literal) literal
+#endif
+
+DOUBLE
+FUNC (DOUBLE x, int *expptr)
+{
+ int exponent;
+ DECL_ROUNDING
+
+ BEGIN_ROUNDING ();
+
+#ifdef USE_FREXP_LDEXP
+ /* frexp and ldexp are usually faster than the loop below. */
+ x = FREXP (x, &exponent);
+
+ x = x + x;
+ exponent -= 1;
+
+ if (exponent < MIN_EXP - 1)
+ {
+ x = LDEXP (x, exponent - (MIN_EXP - 1));
+ exponent = MIN_EXP - 1;
+ }
+#else
+ {
+ /* Since the exponent is an 'int', it fits in 64 bits. Therefore the
+ loops are executed no more than 64 times. */
+ DOUBLE pow2[64]; /* pow2[i] = 2^2^i */
+ DOUBLE powh[64]; /* powh[i] = 2^-2^i */
+ int i;
+
+ exponent = 0;
+ if (x >= L_(1.0))
+ {
+ /* A nonnegative exponent. */
+ {
+ DOUBLE pow2_i; /* = pow2[i] */
+ DOUBLE powh_i; /* = powh[i] */
+
+ /* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i,
+ x * 2^exponent = argument, x >= 1.0. */
+ for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5);
+ ;
+ i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i)
+ {
+ if (x >= pow2_i)
+ {
+ exponent += (1 << i);
+ x *= powh_i;
+ }
+ else
+ break;
+
+ pow2[i] = pow2_i;
+ powh[i] = powh_i;
+ }
+ }
+ /* Here 1.0 <= x < 2^2^i. */
+ }
+ else
+ {
+ /* A negative exponent. */
+ {
+ DOUBLE pow2_i; /* = pow2[i] */
+ DOUBLE powh_i; /* = powh[i] */
+
+ /* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i,
+ x * 2^exponent = argument, x < 1.0, exponent >= MIN_EXP - 1. */
+ for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5);
+ ;
+ i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i)
+ {
+ if (exponent - (1 << i) < MIN_EXP - 1)
+ break;
+
+ exponent -= (1 << i);
+ x *= pow2_i;
+ if (x >= L_(1.0))
+ break;
+
+ pow2[i] = pow2_i;
+ powh[i] = powh_i;
+ }
+ }
+ /* Here either x < 1.0 and exponent - 2^i < MIN_EXP - 1 <= exponent,
+ or 1.0 <= x < 2^2^i and exponent >= MIN_EXP - 1. */
+
+ if (x < L_(1.0))
+ /* Invariants: x * 2^exponent = argument, x < 1.0 and
+ exponent - 2^i < MIN_EXP - 1 <= exponent. */
+ while (i > 0)
+ {
+ i--;
+ if (exponent - (1 << i) >= MIN_EXP - 1)
+ {
+ exponent -= (1 << i);
+ x *= pow2[i];
+ if (x >= L_(1.0))
+ break;
+ }
+ }
+
+ /* Here either x < 1.0 and exponent = MIN_EXP - 1,
+ or 1.0 <= x < 2^2^i and exponent >= MIN_EXP - 1. */
+ }
+
+ /* Invariants: x * 2^exponent = argument, and
+ either x < 1.0 and exponent = MIN_EXP - 1,
+ or 1.0 <= x < 2^2^i and exponent >= MIN_EXP - 1. */
+ while (i > 0)
+ {
+ i--;
+ if (x >= pow2[i])
+ {
+ exponent += (1 << i);
+ x *= powh[i];
+ }
+ }
+ /* Here either x < 1.0 and exponent = MIN_EXP - 1,
+ or 1.0 <= x < 2.0 and exponent >= MIN_EXP - 1. */
+ }
+#endif
+
+ END_ROUNDING ();
+
+ *expptr = exponent;
+ return x;
+}
diff --git a/lib/printf-frexp.h b/lib/printf-frexp.h
new file mode 100644
index 0000000..7c3f9e5
--- /dev/null
+++ b/lib/printf-frexp.h
@@ -0,0 +1,23 @@
+/* Split a double into fraction and mantissa, for hexadecimal printf.
+ Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Write a finite, positive number x as
+ x = mantissa * 2^exp
+ where exp >= DBL_MIN_EXP - 1,
+ mantissa < 2.0,
+ if x is not a denormalized number then mantissa >= 1.0.
+ Store exp in *EXPPTR and return mantissa. */
+extern double printf_frexp (double x, int *expptr);
diff --git a/lib/printf-frexpl.c b/lib/printf-frexpl.c
new file mode 100644
index 0000000..ba7b579
--- /dev/null
+++ b/lib/printf-frexpl.c
@@ -0,0 +1,37 @@
+/* Split a 'long double' into fraction and mantissa, for hexadecimal printf.
+ Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+/* Specification. */
+# include "printf-frexpl.h"
+
+# include "printf-frexp.h"
+
+long double
+printf_frexpl (long double x, int *expptr)
+{
+ return printf_frexp (x, expptr);
+}
+
+#else
+
+# define USE_LONG_DOUBLE
+# include "printf-frexp.c"
+
+#endif
diff --git a/lib/printf-frexpl.h b/lib/printf-frexpl.h
new file mode 100644
index 0000000..827443e
--- /dev/null
+++ b/lib/printf-frexpl.h
@@ -0,0 +1,23 @@
+/* Split a 'long double' into fraction and mantissa, for hexadecimal printf.
+ Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Write a finite, positive number x as
+ x = mantissa * 2^exp
+ where exp >= LDBL_MIN_EXP - 1,
+ mantissa < 2.0,
+ if x is not a denormalized number then mantissa >= 1.0.
+ Store exp in *EXPPTR and return mantissa. */
+extern long double printf_frexpl (long double x, int *expptr);
diff --git a/lib/printf-parse.c b/lib/printf-parse.c
new file mode 100644
index 0000000..3040749
--- /dev/null
+++ b/lib/printf-parse.c
@@ -0,0 +1,623 @@
+/* Formatted output to strings.
+ Copyright (C) 1999-2000, 2002-2003, 2006-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* This file can be parametrized with the following macros:
+ CHAR_T The element type of the format string.
+ CHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters
+ in the format string are ASCII.
+ DIRECTIVE Structure denoting a format directive.
+ Depends on CHAR_T.
+ DIRECTIVES Structure denoting the set of format directives of a
+ format string. Depends on CHAR_T.
+ PRINTF_PARSE Function that parses a format string.
+ Depends on CHAR_T.
+ STATIC Set to 'static' to declare the function static.
+ ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. */
+
+#ifndef PRINTF_PARSE
+# include <config.h>
+#endif
+
+/* Specification. */
+#ifndef PRINTF_PARSE
+# include "printf-parse.h"
+#endif
+
+/* Default parameters. */
+#ifndef PRINTF_PARSE
+# define PRINTF_PARSE printf_parse
+# define CHAR_T char
+# define DIRECTIVE char_directive
+# define DIRECTIVES char_directives
+#endif
+
+/* Get size_t, NULL. */
+#include <stddef.h>
+
+/* Get intmax_t. */
+#include <stdint.h>
+
+/* malloc(), realloc(), free(). */
+#include <stdlib.h>
+
+/* memcpy(). */
+#include <string.h>
+
+/* errno. */
+#include <errno.h>
+
+/* Checked size_t computations. */
+#include "xsize.h"
+
+#if CHAR_T_ONLY_ASCII
+/* c_isascii(). */
+# include "c-ctype.h"
+#endif
+
+#ifdef STATIC
+STATIC
+#endif
+int
+PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
+{
+ const CHAR_T *cp = format; /* pointer into format */
+ size_t arg_posn = 0; /* number of regular arguments consumed */
+ size_t d_allocated; /* allocated elements of d->dir */
+ size_t a_allocated; /* allocated elements of a->arg */
+ size_t max_width_length = 0;
+ size_t max_precision_length = 0;
+
+ d->count = 0;
+ d_allocated = N_DIRECT_ALLOC_DIRECTIVES;
+ d->dir = d->direct_alloc_dir;
+
+ a->count = 0;
+ a_allocated = N_DIRECT_ALLOC_ARGUMENTS;
+ a->arg = a->direct_alloc_arg;
+
+#define REGISTER_ARG(_index_,_type_) \
+ { \
+ size_t n = (_index_); \
+ if (n >= a_allocated) \
+ { \
+ size_t memory_size; \
+ argument *memory; \
+ \
+ a_allocated = xtimes (a_allocated, 2); \
+ if (a_allocated <= n) \
+ a_allocated = xsum (n, 1); \
+ memory_size = xtimes (a_allocated, sizeof (argument)); \
+ if (size_overflow_p (memory_size)) \
+ /* Overflow, would lead to out of memory. */ \
+ goto out_of_memory; \
+ memory = (argument *) (a->arg != a->direct_alloc_arg \
+ ? realloc (a->arg, memory_size) \
+ : malloc (memory_size)); \
+ if (memory == NULL) \
+ /* Out of memory. */ \
+ goto out_of_memory; \
+ if (a->arg == a->direct_alloc_arg) \
+ memcpy (memory, a->arg, a->count * sizeof (argument)); \
+ a->arg = memory; \
+ } \
+ while (a->count <= n) \
+ a->arg[a->count++].type = TYPE_NONE; \
+ if (a->arg[n].type == TYPE_NONE) \
+ a->arg[n].type = (_type_); \
+ else if (a->arg[n].type != (_type_)) \
+ /* Ambiguous type for positional argument. */ \
+ goto error; \
+ }
+
+ while (*cp != '\0')
+ {
+ CHAR_T c = *cp++;
+ if (c == '%')
+ {
+ size_t arg_index = ARG_NONE;
+ DIRECTIVE *dp = &d->dir[d->count]; /* pointer to next directive */
+
+ /* Initialize the next directive. */
+ dp->dir_start = cp - 1;
+ dp->flags = 0;
+ dp->width_start = NULL;
+ dp->width_end = NULL;
+ dp->width_arg_index = ARG_NONE;
+ dp->precision_start = NULL;
+ dp->precision_end = NULL;
+ dp->precision_arg_index = ARG_NONE;
+ dp->arg_index = ARG_NONE;
+
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const CHAR_T *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ {
+ size_t n = 0;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ n = xsum (xtimes (n, 10), *np - '0');
+ if (n == 0)
+ /* Positional argument 0. */
+ goto error;
+ if (size_overflow_p (n))
+ /* n too large, would lead to out of memory later. */
+ goto error;
+ arg_index = n - 1;
+ cp = np + 1;
+ }
+ }
+
+ /* Read the flags. */
+ for (;;)
+ {
+ if (*cp == '\'')
+ {
+ dp->flags |= FLAG_GROUP;
+ cp++;
+ }
+ else if (*cp == '-')
+ {
+ dp->flags |= FLAG_LEFT;
+ cp++;
+ }
+ else if (*cp == '+')
+ {
+ dp->flags |= FLAG_SHOWSIGN;
+ cp++;
+ }
+ else if (*cp == ' ')
+ {
+ dp->flags |= FLAG_SPACE;
+ cp++;
+ }
+ else if (*cp == '#')
+ {
+ dp->flags |= FLAG_ALT;
+ cp++;
+ }
+ else if (*cp == '0')
+ {
+ dp->flags |= FLAG_ZERO;
+ cp++;
+ }
+#if __GLIBC__ >= 2 && !defined __UCLIBC__
+ else if (*cp == 'I')
+ {
+ dp->flags |= FLAG_LOCALIZED;
+ cp++;
+ }
+#endif
+ else
+ break;
+ }
+
+ /* Parse the field width. */
+ if (*cp == '*')
+ {
+ dp->width_start = cp;
+ cp++;
+ dp->width_end = cp;
+ if (max_width_length < 1)
+ max_width_length = 1;
+
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const CHAR_T *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ {
+ size_t n = 0;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ n = xsum (xtimes (n, 10), *np - '0');
+ if (n == 0)
+ /* Positional argument 0. */
+ goto error;
+ if (size_overflow_p (n))
+ /* n too large, would lead to out of memory later. */
+ goto error;
+ dp->width_arg_index = n - 1;
+ cp = np + 1;
+ }
+ }
+ if (dp->width_arg_index == ARG_NONE)
+ {
+ dp->width_arg_index = arg_posn++;
+ if (dp->width_arg_index == ARG_NONE)
+ /* arg_posn wrapped around. */
+ goto error;
+ }
+ REGISTER_ARG (dp->width_arg_index, TYPE_INT);
+ }
+ else if (*cp >= '0' && *cp <= '9')
+ {
+ size_t width_length;
+
+ dp->width_start = cp;
+ for (; *cp >= '0' && *cp <= '9'; cp++)
+ ;
+ dp->width_end = cp;
+ width_length = dp->width_end - dp->width_start;
+ if (max_width_length < width_length)
+ max_width_length = width_length;
+ }
+
+ /* Parse the precision. */
+ if (*cp == '.')
+ {
+ cp++;
+ if (*cp == '*')
+ {
+ dp->precision_start = cp - 1;
+ cp++;
+ dp->precision_end = cp;
+ if (max_precision_length < 2)
+ max_precision_length = 2;
+
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const CHAR_T *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ {
+ size_t n = 0;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ n = xsum (xtimes (n, 10), *np - '0');
+ if (n == 0)
+ /* Positional argument 0. */
+ goto error;
+ if (size_overflow_p (n))
+ /* n too large, would lead to out of memory
+ later. */
+ goto error;
+ dp->precision_arg_index = n - 1;
+ cp = np + 1;
+ }
+ }
+ if (dp->precision_arg_index == ARG_NONE)
+ {
+ dp->precision_arg_index = arg_posn++;
+ if (dp->precision_arg_index == ARG_NONE)
+ /* arg_posn wrapped around. */
+ goto error;
+ }
+ REGISTER_ARG (dp->precision_arg_index, TYPE_INT);
+ }
+ else
+ {
+ size_t precision_length;
+
+ dp->precision_start = cp - 1;
+ for (; *cp >= '0' && *cp <= '9'; cp++)
+ ;
+ dp->precision_end = cp;
+ precision_length = dp->precision_end - dp->precision_start;
+ if (max_precision_length < precision_length)
+ max_precision_length = precision_length;
+ }
+ }
+
+ {
+ arg_type type;
+
+ /* Parse argument type/size specifiers. */
+ {
+ int flags = 0;
+
+ for (;;)
+ {
+ if (*cp == 'h')
+ {
+ flags |= (1 << (flags & 1));
+ cp++;
+ }
+ else if (*cp == 'L')
+ {
+ flags |= 4;
+ cp++;
+ }
+ else if (*cp == 'l')
+ {
+ flags += 8;
+ cp++;
+ }
+ else if (*cp == 'j')
+ {
+ if (sizeof (intmax_t) > sizeof (long))
+ {
+ /* intmax_t = long long */
+ flags += 16;
+ }
+ else if (sizeof (intmax_t) > sizeof (int))
+ {
+ /* intmax_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+ else if (*cp == 'z' || *cp == 'Z')
+ {
+ /* 'z' is standardized in ISO C 99, but glibc uses 'Z'
+ because the warning facility in gcc-2.95.2 understands
+ only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */
+ if (sizeof (size_t) > sizeof (long))
+ {
+ /* size_t = long long */
+ flags += 16;
+ }
+ else if (sizeof (size_t) > sizeof (int))
+ {
+ /* size_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+ else if (*cp == 't')
+ {
+ if (sizeof (ptrdiff_t) > sizeof (long))
+ {
+ /* ptrdiff_t = long long */
+ flags += 16;
+ }
+ else if (sizeof (ptrdiff_t) > sizeof (int))
+ {
+ /* ptrdiff_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+#if defined __APPLE__ && defined __MACH__
+ /* On Mac OS X 10.3, PRIdMAX is defined as "qd".
+ We cannot change it to "lld" because PRIdMAX must also
+ be understood by the system's printf routines. */
+ else if (*cp == 'q')
+ {
+ if (64 / 8 > sizeof (long))
+ {
+ /* int64_t = long long */
+ flags += 16;
+ }
+ else
+ {
+ /* int64_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+#endif
+#if defined _WIN32 && ! defined __CYGWIN__
+ /* On native Windows, PRIdMAX is defined as "I64d".
+ We cannot change it to "lld" because PRIdMAX must also
+ be understood by the system's printf routines. */
+ else if (*cp == 'I' && cp[1] == '6' && cp[2] == '4')
+ {
+ if (64 / 8 > sizeof (long))
+ {
+ /* __int64 = long long */
+ flags += 16;
+ }
+ else
+ {
+ /* __int64 = long */
+ flags += 8;
+ }
+ cp += 3;
+ }
+#endif
+ else
+ break;
+ }
+
+ /* Read the conversion character. */
+ c = *cp++;
+ switch (c)
+ {
+ case 'd': case 'i':
+ /* If 'long long' is larger than 'long': */
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_LONGLONGINT;
+ else
+ /* If 'long long' is the same as 'long', we parse "lld" into
+ TYPE_LONGINT. */
+ if (flags >= 8)
+ type = TYPE_LONGINT;
+ else if (flags & 2)
+ type = TYPE_SCHAR;
+ else if (flags & 1)
+ type = TYPE_SHORT;
+ else
+ type = TYPE_INT;
+ break;
+ case 'o': case 'u': case 'x': case 'X':
+ /* If 'unsigned long long' is larger than 'unsigned long': */
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_ULONGLONGINT;
+ else
+ /* If 'unsigned long long' is the same as 'unsigned long', we
+ parse "llu" into TYPE_ULONGINT. */
+ if (flags >= 8)
+ type = TYPE_ULONGINT;
+ else if (flags & 2)
+ type = TYPE_UCHAR;
+ else if (flags & 1)
+ type = TYPE_USHORT;
+ else
+ type = TYPE_UINT;
+ break;
+ case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
+ case 'a': case 'A':
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_LONGDOUBLE;
+ else
+ type = TYPE_DOUBLE;
+ break;
+ case 'c':
+ if (flags >= 8)
+#if HAVE_WINT_T
+ type = TYPE_WIDE_CHAR;
+#else
+ goto error;
+#endif
+ else
+ type = TYPE_CHAR;
+ break;
+#if HAVE_WINT_T
+ case 'C':
+ type = TYPE_WIDE_CHAR;
+ c = 'c';
+ break;
+#endif
+ case 's':
+ if (flags >= 8)
+#if HAVE_WCHAR_T
+ type = TYPE_WIDE_STRING;
+#else
+ goto error;
+#endif
+ else
+ type = TYPE_STRING;
+ break;
+#if HAVE_WCHAR_T
+ case 'S':
+ type = TYPE_WIDE_STRING;
+ c = 's';
+ break;
+#endif
+ case 'p':
+ type = TYPE_POINTER;
+ break;
+ case 'n':
+ /* If 'long long' is larger than 'long': */
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_COUNT_LONGLONGINT_POINTER;
+ else
+ /* If 'long long' is the same as 'long', we parse "lln" into
+ TYPE_COUNT_LONGINT_POINTER. */
+ if (flags >= 8)
+ type = TYPE_COUNT_LONGINT_POINTER;
+ else if (flags & 2)
+ type = TYPE_COUNT_SCHAR_POINTER;
+ else if (flags & 1)
+ type = TYPE_COUNT_SHORT_POINTER;
+ else
+ type = TYPE_COUNT_INT_POINTER;
+ break;
+#if ENABLE_UNISTDIO
+ /* The unistdio extensions. */
+ case 'U':
+ if (flags >= 16)
+ type = TYPE_U32_STRING;
+ else if (flags >= 8)
+ type = TYPE_U16_STRING;
+ else
+ type = TYPE_U8_STRING;
+ break;
+#endif
+ case '%':
+ type = TYPE_NONE;
+ break;
+ default:
+ /* Unknown conversion character. */
+ goto error;
+ }
+ }
+
+ if (type != TYPE_NONE)
+ {
+ dp->arg_index = arg_index;
+ if (dp->arg_index == ARG_NONE)
+ {
+ dp->arg_index = arg_posn++;
+ if (dp->arg_index == ARG_NONE)
+ /* arg_posn wrapped around. */
+ goto error;
+ }
+ REGISTER_ARG (dp->arg_index, type);
+ }
+ dp->conversion = c;
+ dp->dir_end = cp;
+ }
+
+ d->count++;
+ if (d->count >= d_allocated)
+ {
+ size_t memory_size;
+ DIRECTIVE *memory;
+
+ d_allocated = xtimes (d_allocated, 2);
+ memory_size = xtimes (d_allocated, sizeof (DIRECTIVE));
+ if (size_overflow_p (memory_size))
+ /* Overflow, would lead to out of memory. */
+ goto out_of_memory;
+ memory = (DIRECTIVE *) (d->dir != d->direct_alloc_dir
+ ? realloc (d->dir, memory_size)
+ : malloc (memory_size));
+ if (memory == NULL)
+ /* Out of memory. */
+ goto out_of_memory;
+ if (d->dir == d->direct_alloc_dir)
+ memcpy (memory, d->dir, d->count * sizeof (DIRECTIVE));
+ d->dir = memory;
+ }
+ }
+#if CHAR_T_ONLY_ASCII
+ else if (!c_isascii (c))
+ {
+ /* Non-ASCII character. Not supported. */
+ goto error;
+ }
+#endif
+ }
+ d->dir[d->count].dir_start = cp;
+
+ d->max_width_length = max_width_length;
+ d->max_precision_length = max_precision_length;
+ return 0;
+
+error:
+ if (a->arg != a->direct_alloc_arg)
+ free (a->arg);
+ if (d->dir != d->direct_alloc_dir)
+ free (d->dir);
+ errno = EINVAL;
+ return -1;
+
+out_of_memory:
+ if (a->arg != a->direct_alloc_arg)
+ free (a->arg);
+ if (d->dir != d->direct_alloc_dir)
+ free (d->dir);
+ errno = ENOMEM;
+ return -1;
+}
+
+#undef PRINTF_PARSE
+#undef DIRECTIVES
+#undef DIRECTIVE
+#undef CHAR_T_ONLY_ASCII
+#undef CHAR_T
diff --git a/lib/printf-parse.h b/lib/printf-parse.h
new file mode 100644
index 0000000..1f86e32
--- /dev/null
+++ b/lib/printf-parse.h
@@ -0,0 +1,193 @@
+/* Parse printf format string.
+ Copyright (C) 1999, 2002-2003, 2005, 2007, 2010-2023 Free Software
+ Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#ifndef _PRINTF_PARSE_H
+#define _PRINTF_PARSE_H
+
+/* This file can be parametrized with the following macros:
+ ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
+ STATIC Set to 'static' to declare the function static. */
+
+#if HAVE_FEATURES_H
+# include <features.h> /* for __GLIBC__, __UCLIBC__ */
+#endif
+
+#include "printf-args.h"
+
+
+/* Flags */
+#define FLAG_GROUP 1 /* ' flag */
+#define FLAG_LEFT 2 /* - flag */
+#define FLAG_SHOWSIGN 4 /* + flag */
+#define FLAG_SPACE 8 /* space flag */
+#define FLAG_ALT 16 /* # flag */
+#define FLAG_ZERO 32
+#if __GLIBC__ >= 2 && !defined __UCLIBC__
+# define FLAG_LOCALIZED 64 /* I flag, uses localized digits */
+#endif
+
+/* arg_index value indicating that no argument is consumed. */
+#define ARG_NONE (~(size_t)0)
+
+/* xxx_directive: A parsed directive.
+ xxx_directives: A parsed format string. */
+
+/* Number of directly allocated directives (no malloc() needed). */
+#define N_DIRECT_ALLOC_DIRECTIVES 7
+
+/* A parsed directive. */
+typedef struct
+{
+ const char* dir_start;
+ const char* dir_end;
+ int flags;
+ const char* width_start;
+ const char* width_end;
+ size_t width_arg_index;
+ const char* precision_start;
+ const char* precision_end;
+ size_t precision_arg_index;
+ char conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
+ size_t arg_index;
+}
+char_directive;
+
+/* A parsed format string. */
+typedef struct
+{
+ size_t count;
+ char_directive *dir;
+ size_t max_width_length;
+ size_t max_precision_length;
+ char_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
+}
+char_directives;
+
+#if ENABLE_UNISTDIO
+
+/* A parsed directive. */
+typedef struct
+{
+ const uint8_t* dir_start;
+ const uint8_t* dir_end;
+ int flags;
+ const uint8_t* width_start;
+ const uint8_t* width_end;
+ size_t width_arg_index;
+ const uint8_t* precision_start;
+ const uint8_t* precision_end;
+ size_t precision_arg_index;
+ uint8_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
+ size_t arg_index;
+}
+u8_directive;
+
+/* A parsed format string. */
+typedef struct
+{
+ size_t count;
+ u8_directive *dir;
+ size_t max_width_length;
+ size_t max_precision_length;
+ u8_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
+}
+u8_directives;
+
+/* A parsed directive. */
+typedef struct
+{
+ const uint16_t* dir_start;
+ const uint16_t* dir_end;
+ int flags;
+ const uint16_t* width_start;
+ const uint16_t* width_end;
+ size_t width_arg_index;
+ const uint16_t* precision_start;
+ const uint16_t* precision_end;
+ size_t precision_arg_index;
+ uint16_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
+ size_t arg_index;
+}
+u16_directive;
+
+/* A parsed format string. */
+typedef struct
+{
+ size_t count;
+ u16_directive *dir;
+ size_t max_width_length;
+ size_t max_precision_length;
+ u16_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
+}
+u16_directives;
+
+/* A parsed directive. */
+typedef struct
+{
+ const uint32_t* dir_start;
+ const uint32_t* dir_end;
+ int flags;
+ const uint32_t* width_start;
+ const uint32_t* width_end;
+ size_t width_arg_index;
+ const uint32_t* precision_start;
+ const uint32_t* precision_end;
+ size_t precision_arg_index;
+ uint32_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
+ size_t arg_index;
+}
+u32_directive;
+
+/* A parsed format string. */
+typedef struct
+{
+ size_t count;
+ u32_directive *dir;
+ size_t max_width_length;
+ size_t max_precision_length;
+ u32_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
+}
+u32_directives;
+
+#endif
+
+
+/* Parses the format string. Fills in the number N of directives, and fills
+ in directives[0], ..., directives[N-1], and sets directives[N].dir_start
+ to the end of the format string. Also fills in the arg_type fields of the
+ arguments and the needed count of arguments. */
+#if ENABLE_UNISTDIO
+extern int
+ ulc_printf_parse (const char *format, char_directives *d, arguments *a);
+extern int
+ u8_printf_parse (const uint8_t *format, u8_directives *d, arguments *a);
+extern int
+ u16_printf_parse (const uint16_t *format, u16_directives *d,
+ arguments *a);
+extern int
+ u32_printf_parse (const uint32_t *format, u32_directives *d,
+ arguments *a);
+#else
+# ifdef STATIC
+STATIC
+# else
+extern
+# endif
+int printf_parse (const char *format, char_directives *d, arguments *a);
+#endif
+
+#endif /* _PRINTF_PARSE_H */
diff --git a/lib/signbitd.c b/lib/signbitd.c
new file mode 100644
index 0000000..706ea39
--- /dev/null
+++ b/lib/signbitd.c
@@ -0,0 +1,64 @@
+/* signbit() macro: Determine the sign bit of a floating-point number.
+ Copyright (C) 2007-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#include <string.h>
+#include "isnand-nolibm.h"
+#include "float+.h"
+
+#ifdef gl_signbitd_OPTIMIZED_MACRO
+# undef gl_signbitd
+#endif
+
+int
+gl_signbitd (double arg)
+{
+#if defined DBL_SIGNBIT_WORD && defined DBL_SIGNBIT_BIT
+ /* The use of a union to extract the bits of the representation of a
+ 'long double' is safe in practice, despite of the "aliasing rules" of
+ C99, because the GCC docs say
+ "Even with '-fstrict-aliasing', type-punning is allowed, provided the
+ memory is accessed through the union type."
+ and similarly for other compilers. */
+# define NWORDS \
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ union { double value; unsigned int word[NWORDS]; } m;
+ m.value = arg;
+ return (m.word[DBL_SIGNBIT_WORD] >> DBL_SIGNBIT_BIT) & 1;
+#elif HAVE_COPYSIGN_IN_LIBC
+ return copysign (1.0, arg) < 0;
+#else
+ /* This does not do the right thing for NaN, but this is irrelevant for
+ most use cases. */
+ if (isnand (arg))
+ return 0;
+ if (arg < 0.0)
+ return 1;
+ else if (arg == 0.0)
+ {
+ /* Distinguish 0.0 and -0.0. */
+ static double plus_zero = 0.0;
+ double arg_mem = arg;
+ return (memcmp (&plus_zero, &arg_mem, SIZEOF_DBL) != 0);
+ }
+ else
+ return 0;
+#endif
+}
diff --git a/lib/signbitf.c b/lib/signbitf.c
new file mode 100644
index 0000000..c25bb64
--- /dev/null
+++ b/lib/signbitf.c
@@ -0,0 +1,64 @@
+/* signbit() macro: Determine the sign bit of a floating-point number.
+ Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#include <string.h>
+#include "isnanf-nolibm.h"
+#include "float+.h"
+
+#ifdef gl_signbitf_OPTIMIZED_MACRO
+# undef gl_signbitf
+#endif
+
+int
+gl_signbitf (float arg)
+{
+#if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT
+ /* The use of a union to extract the bits of the representation of a
+ 'long double' is safe in practice, despite of the "aliasing rules" of
+ C99, because the GCC docs say
+ "Even with '-fstrict-aliasing', type-punning is allowed, provided the
+ memory is accessed through the union type."
+ and similarly for other compilers. */
+# define NWORDS \
+ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ union { float value; unsigned int word[NWORDS]; } m;
+ m.value = arg;
+ return (m.word[FLT_SIGNBIT_WORD] >> FLT_SIGNBIT_BIT) & 1;
+#elif HAVE_COPYSIGNF_IN_LIBC
+ return copysignf (1.0f, arg) < 0;
+#else
+ /* This does not do the right thing for NaN, but this is irrelevant for
+ most use cases. */
+ if (isnanf (arg))
+ return 0;
+ if (arg < 0.0f)
+ return 1;
+ else if (arg == 0.0f)
+ {
+ /* Distinguish 0.0f and -0.0f. */
+ static float plus_zero = 0.0f;
+ float arg_mem = arg;
+ return (memcmp (&plus_zero, &arg_mem, SIZEOF_FLT) != 0);
+ }
+ else
+ return 0;
+#endif
+}
diff --git a/lib/signbitl.c b/lib/signbitl.c
new file mode 100644
index 0000000..9d459ca
--- /dev/null
+++ b/lib/signbitl.c
@@ -0,0 +1,64 @@
+/* signbit() macro: Determine the sign bit of a floating-point number.
+ Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#include <string.h>
+#include "isnanl-nolibm.h"
+#include "float+.h"
+
+#ifdef gl_signbitl_OPTIMIZED_MACRO
+# undef gl_signbitl
+#endif
+
+int
+gl_signbitl (long double arg)
+{
+#if defined LDBL_SIGNBIT_WORD && defined LDBL_SIGNBIT_BIT
+ /* The use of a union to extract the bits of the representation of a
+ 'long double' is safe in practice, despite of the "aliasing rules" of
+ C99, because the GCC docs say
+ "Even with '-fstrict-aliasing', type-punning is allowed, provided the
+ memory is accessed through the union type."
+ and similarly for other compilers. */
+# define NWORDS \
+ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ union { long double value; unsigned int word[NWORDS]; } m;
+ m.value = arg;
+ return (m.word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1;
+#elif HAVE_COPYSIGNL_IN_LIBC
+ return copysignl (1.0L, arg) < 0;
+#else
+ /* This does not do the right thing for NaN, but this is irrelevant for
+ most use cases. */
+ if (isnanl (arg))
+ return 0;
+ if (arg < 0.0L)
+ return 1;
+ else if (arg == 0.0L)
+ {
+ /* Distinguish 0.0L and -0.0L. */
+ static long double plus_zero = 0.0L;
+ long double arg_mem = arg;
+ return (memcmp (&plus_zero, &arg_mem, SIZEOF_LDBL) != 0);
+ }
+ else
+ return 0;
+#endif
+}
diff --git a/lib/size_max.h b/lib/size_max.h
new file mode 100644
index 0000000..48af025
--- /dev/null
+++ b/lib/size_max.h
@@ -0,0 +1,30 @@
+/* size_max.h -- declare SIZE_MAX through system headers
+ Copyright (C) 2005-2006, 2009-2023 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#ifndef GNULIB_SIZE_MAX_H
+#define GNULIB_SIZE_MAX_H
+
+/* Get SIZE_MAX declaration on systems like Solaris 7/8/9. */
+# include <limits.h>
+/* Get SIZE_MAX declaration on systems like glibc 2. */
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+/* On systems where these include files don't define it, SIZE_MAX is defined
+ in config.h. */
+
+#endif /* GNULIB_SIZE_MAX_H */
diff --git a/lib/snprintf.c b/lib/snprintf.c
new file mode 100644
index 0000000..cdff314
--- /dev/null
+++ b/lib/snprintf.c
@@ -0,0 +1,71 @@
+/* Formatted output to strings.
+ Copyright (C) 2004, 2006-2023 Free Software Foundation, Inc.
+ Written by Simon Josefsson and Paul Eggert.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "vasnprintf.h"
+
+/* Print formatted output to string STR. Similar to sprintf, but
+ additional length SIZE limit how much is written into STR. Returns
+ string length of formatted string (which may be larger than SIZE).
+ STR may be NULL, in which case nothing will be written. On error,
+ return a negative value. */
+int
+snprintf (char *str, size_t size, const char *format, ...)
+{
+ char *output;
+ size_t len;
+ size_t lenbuf = size;
+ va_list args;
+
+ va_start (args, format);
+ output = vasnprintf (str, &lenbuf, format, args);
+ len = lenbuf;
+ va_end (args);
+
+ if (!output)
+ return -1;
+
+ if (output != str)
+ {
+ if (size)
+ {
+ size_t pruned_len = (len < size ? len : size - 1);
+ memcpy (str, output, pruned_len);
+ str[pruned_len] = '\0';
+ }
+
+ free (output);
+ }
+
+ if (INT_MAX < len)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ return len;
+}
diff --git a/lib/stdbool.in.h b/lib/stdbool.in.h
new file mode 100644
index 0000000..ca43b95
--- /dev/null
+++ b/lib/stdbool.in.h
@@ -0,0 +1,126 @@
+/* Copyright (C) 2001-2003, 2006-2023 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#ifndef _GL_STDBOOL_H
+#define _GL_STDBOOL_H
+
+/* ISO C 99 <stdbool.h> for platforms that lack it. */
+
+/* Usage suggestions:
+
+ Programs that use <stdbool.h> should be aware of some limitations
+ and standards compliance issues.
+
+ Standards compliance:
+
+ - <stdbool.h> must be #included before 'bool', 'false', 'true'
+ can be used.
+
+ - You cannot assume that sizeof (bool) == 1.
+
+ - Programs should not undefine the macros bool, true, and false,
+ as C99 lists that as an "obsolescent feature".
+
+ Limitations of this substitute, when used in a C89 environment:
+
+ - <stdbool.h> must be #included before the '_Bool' type can be used.
+
+ - You cannot assume that _Bool is a typedef; it might be a macro.
+
+ - Bit-fields of type 'bool' are not supported. Portable code
+ should use 'unsigned int foo : 1;' rather than 'bool foo : 1;'.
+
+ - In C99, casts and automatic conversions to '_Bool' or 'bool' are
+ performed in such a way that every nonzero value gets converted
+ to 'true', and zero gets converted to 'false'. This doesn't work
+ with this substitute. With this substitute, only the values 0 and 1
+ give the expected result when converted to _Bool' or 'bool'.
+
+ - C99 allows the use of (_Bool)0.0 in constant expressions, but
+ this substitute cannot always provide this property.
+
+ Also, it is suggested that programs use 'bool' rather than '_Bool';
+ this isn't required, but 'bool' is more common. */
+
+
+/* 7.16. Boolean type and values */
+
+#ifdef __cplusplus
+# if !defined _MSC_VER
+# define _Bool bool
+# define bool bool
+# endif
+#else
+# if !defined __GNUC__
+ /* If @HAVE__BOOL@:
+ Some HP-UX cc and AIX IBM C compiler versions have compiler bugs when
+ the built-in _Bool type is used. See
+ https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+ https://lists.gnu.org/r/bug-coreutils/2005-11/msg00161.html
+ https://lists.gnu.org/r/bug-coreutils/2005-10/msg00086.html
+ Similar bugs are likely with other compilers as well; this file
+ wouldn't be used if <stdbool.h> was working.
+ So we override the _Bool type.
+ If !@HAVE__BOOL@:
+ Need to define _Bool ourselves. As 'signed char' or as an enum type?
+ Use of a typedef, with SunPRO C, leads to a stupid
+ "warning: _Bool is a keyword in ISO C99".
+ Use of an enum type, with IRIX cc, leads to a stupid
+ "warning(1185): enumerated type mixed with another type".
+ Even the existence of an enum type, without a typedef,
+ "Invalid enumerator. (badenum)" with HP-UX cc on Tru64.
+ The only benefit of the enum, debuggability, is not important
+ with these compilers. So use 'signed char' and no enum. */
+# define _Bool signed char
+# else
+ /* With this compiler, trust the _Bool type if the compiler has it. */
+# if !@HAVE__BOOL@
+ /* For the sake of symbolic names in gdb, define true and false as
+ enum constants, not only as macros.
+ It is tempting to write
+ typedef enum { false = 0, true = 1 } _Bool;
+ so that gdb prints values of type 'bool' symbolically. But then
+ values of type '_Bool' might promote to 'int' or 'unsigned int'
+ (see ISO C 99 6.7.2.2.(4)); however, '_Bool' must promote to 'int'
+ (see ISO C 99 6.3.1.1.(2)). So add a negative value to the
+ enum; this ensures that '_Bool' promotes to 'int'. */
+typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool;
+# endif
+# endif
+# define bool _Bool
+#endif
+
+/* The other macros must be usable in preprocessor directives. */
+#ifdef __cplusplus
+# if !defined _MSC_VER
+# define false false
+# define true true
+# endif
+/* In Sun C++ 5.11 (Solaris Studio 12.2) and older, 'true' as a preprocessor
+ expression evaluates to 0, not 1. Fix this by overriding 'true'. Note that
+ the replacement has to be of type 'bool'. */
+# if defined __SUNPRO_CC && true != 1
+# undef true
+# define true (!false)
+# endif
+#else
+# define false 0
+# define true 1
+#endif
+
+#define __bool_true_false_are_defined 1
+
+#endif /* _GL_STDBOOL_H */
diff --git a/lib/stddef.in.h b/lib/stddef.in.h
new file mode 100644
index 0000000..6eadcc3
--- /dev/null
+++ b/lib/stddef.in.h
@@ -0,0 +1,147 @@
+/* A substitute for POSIX 2008 <stddef.h>, for platforms that have issues.
+
+ Copyright (C) 2009-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Written by Eric Blake. */
+
+/*
+ * POSIX 2008 <stddef.h> for platforms that have issues.
+ * <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stddef.h.html>
+ */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_wchar_t || defined __need_size_t \
+ || defined __need_ptrdiff_t || defined __need_NULL \
+ || defined __need_wint_t
+/* Special invocation convention inside gcc header files. In
+ particular, gcc provides a version of <stddef.h> that blindly
+ redefines NULL even when __need_wint_t was defined, even though
+ wint_t is not normally provided by <stddef.h>. Hence, we must
+ remember if special invocation has ever been used to obtain wint_t,
+ in which case we need to clean up NULL yet again. */
+
+# if !(defined _@GUARD_PREFIX@_STDDEF_H && defined _GL_STDDEF_WINT_T)
+# ifdef __need_wint_t
+# define _GL_STDDEF_WINT_T
+# endif
+# @INCLUDE_NEXT@ @NEXT_STDDEF_H@
+ /* On TinyCC, make sure that the macros that indicate the special invocation
+ convention get undefined. */
+# undef __need_wchar_t
+# undef __need_size_t
+# undef __need_ptrdiff_t
+# undef __need_NULL
+# undef __need_wint_t
+# endif
+
+#else
+/* Normal invocation convention. */
+
+# ifndef _@GUARD_PREFIX@_STDDEF_H
+
+/* On AIX 7.2, with xlc in 64-bit mode, <stddef.h> defines max_align_t to a
+ type with alignment 4, but 'long' has alignment 8. */
+# if defined _AIX && defined __LP64__
+# if !GNULIB_defined_max_align_t
+# ifdef _MAX_ALIGN_T
+/* /usr/include/stddef.h has already defined max_align_t. Override it. */
+typedef long rpl_max_align_t;
+# define max_align_t rpl_max_align_t
+# else
+/* Prevent /usr/include/stddef.h from defining max_align_t. */
+typedef long max_align_t;
+# define _MAX_ALIGN_T
+# endif
+# define GNULIB_defined_max_align_t 1
+# endif
+# endif
+
+/* The include_next requires a split double-inclusion guard. */
+
+# @INCLUDE_NEXT@ @NEXT_STDDEF_H@
+
+/* On NetBSD 5.0, the definition of NULL lacks proper parentheses. */
+# if (@REPLACE_NULL@ \
+ && (!defined _@GUARD_PREFIX@_STDDEF_H || defined _GL_STDDEF_WINT_T))
+# undef NULL
+# ifdef __cplusplus
+ /* ISO C++ says that the macro NULL must expand to an integer constant
+ expression, hence '((void *) 0)' is not allowed in C++. */
+# if __GNUG__ >= 3
+ /* GNU C++ has a __null macro that behaves like an integer ('int' or
+ 'long') but has the same size as a pointer. Use that, to avoid
+ warnings. */
+# define NULL __null
+# else
+# define NULL 0L
+# endif
+# else
+# define NULL ((void *) 0)
+# endif
+# endif
+
+# ifndef _@GUARD_PREFIX@_STDDEF_H
+# define _@GUARD_PREFIX@_STDDEF_H
+
+/* Some platforms lack wchar_t. */
+#if !@HAVE_WCHAR_T@
+# define wchar_t int
+#endif
+
+/* Some platforms lack max_align_t. The check for _GCC_MAX_ALIGN_T is
+ a hack in case the configure-time test was done with g++ even though
+ we are currently compiling with gcc.
+ On MSVC, max_align_t is defined only in C++ mode, after <cstddef> was
+ included. Its definition is good since it has an alignment of 8 (on x86
+ and x86_64).
+ Similarly on OS/2 kLIBC. */
+#if (defined _MSC_VER || (defined __KLIBC__ && !defined __LIBCN__)) \
+ && defined __cplusplus
+# include <cstddef>
+#else
+# if ! (@HAVE_MAX_ALIGN_T@ || (defined _GCC_MAX_ALIGN_T && !defined __clang__))
+# if !GNULIB_defined_max_align_t
+/* On the x86, the maximum storage alignment of double, long, etc. is 4,
+ but GCC's C11 ABI for x86 says that max_align_t has an alignment of 8,
+ and the C11 standard allows this. Work around this problem by
+ using __alignof__ (which returns 8 for double) rather than _Alignof
+ (which returns 4), and align each union member accordingly. */
+# if defined __GNUC__ || (__clang_major__ >= 4)
+# define _GL_STDDEF_ALIGNAS(type) \
+ __attribute__ ((__aligned__ (__alignof__ (type))))
+# else
+# define _GL_STDDEF_ALIGNAS(type) /* */
+# endif
+typedef union
+{
+ char *__p _GL_STDDEF_ALIGNAS (char *);
+ double __d _GL_STDDEF_ALIGNAS (double);
+ long double __ld _GL_STDDEF_ALIGNAS (long double);
+ long int __i _GL_STDDEF_ALIGNAS (long int);
+} rpl_max_align_t;
+# define max_align_t rpl_max_align_t
+# define GNULIB_defined_max_align_t 1
+# endif
+# endif
+#endif
+
+# endif /* _@GUARD_PREFIX@_STDDEF_H */
+# endif /* _@GUARD_PREFIX@_STDDEF_H */
+#endif /* __need_XXX */
diff --git a/lib/stdint.in.h b/lib/stdint.in.h
new file mode 100644
index 0000000..5ddc644
--- /dev/null
+++ b/lib/stdint.in.h
@@ -0,0 +1,740 @@
+/* Copyright (C) 2001-2002, 2004-2023 Free Software Foundation, Inc.
+ Written by Paul Eggert, Bruno Haible, Sam Steingold, Peter Burwood.
+ This file is part of gnulib.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/*
+ * ISO C 99 <stdint.h> for platforms that lack it.
+ * <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdint.h.html>
+ */
+
+#ifndef _@GUARD_PREFIX@_STDINT_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* When including a system file that in turn includes <inttypes.h>,
+ use the system <inttypes.h>, not our substitute. This avoids
+ problems with (for example) VMS, whose <sys/bitypes.h> includes
+ <inttypes.h>. */
+#define _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+
+/* On Android (Bionic libc), <sys/types.h> includes this file before
+ having defined 'time_t'. Therefore in this case avoid including
+ other system header files; just include the system's <stdint.h>.
+ Ideally we should test __BIONIC__ here, but it is only defined after
+ <sys/cdefs.h> has been included; hence test __ANDROID__ instead. */
+#if defined __ANDROID__ && defined _GL_INCLUDING_SYS_TYPES_H
+# @INCLUDE_NEXT@ @NEXT_STDINT_H@
+#else
+
+/* Get those types that are already defined in other system include
+ files, so that we can "#define int8_t signed char" below without
+ worrying about a later system include file containing a "typedef
+ signed char int8_t;" that will get messed up by our macro. Our
+ macros should all be consistent with the system versions, except
+ for the "fast" types and macros, which we recommend against using
+ in public interfaces due to compiler differences. */
+
+#if @HAVE_STDINT_H@
+# if defined __sgi && ! defined __c99
+ /* Bypass IRIX's <stdint.h> if in C89 mode, since it merely annoys users
+ with "This header file is to be used only for c99 mode compilations"
+ diagnostics. */
+# define __STDINT_H__
+# endif
+
+ /* Some pre-C++11 <stdint.h> implementations need this. */
+# ifdef __cplusplus
+# ifndef __STDC_CONSTANT_MACROS
+# define __STDC_CONSTANT_MACROS 1
+# endif
+# ifndef __STDC_LIMIT_MACROS
+# define __STDC_LIMIT_MACROS 1
+# endif
+# endif
+
+ /* Other systems may have an incomplete or buggy <stdint.h>.
+ Include it before <inttypes.h>, since any "#include <stdint.h>"
+ in <inttypes.h> would reinclude us, skipping our contents because
+ _@GUARD_PREFIX@_STDINT_H is defined.
+ The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_STDINT_H@
+#endif
+
+#if ! defined _@GUARD_PREFIX@_STDINT_H && ! defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H
+#define _@GUARD_PREFIX@_STDINT_H
+
+/* Get SCHAR_MIN, SCHAR_MAX, UCHAR_MAX, INT_MIN, INT_MAX,
+ LONG_MIN, LONG_MAX, ULONG_MAX, _GL_INTEGER_WIDTH. */
+#include <limits.h>
+
+/* Override WINT_MIN and WINT_MAX if gnulib's <wchar.h> or <wctype.h> overrides
+ wint_t. */
+#if @GNULIBHEADERS_OVERRIDE_WINT_T@
+# undef WINT_MIN
+# undef WINT_MAX
+# define WINT_MIN 0x0U
+# define WINT_MAX 0xffffffffU
+#endif
+
+#if ! @HAVE_C99_STDINT_H@
+
+/* <sys/types.h> defines some of the stdint.h types as well, on glibc,
+ IRIX 6.5, and OpenBSD 3.8 (via <machine/types.h>).
+ AIX 5.2 <sys/types.h> isn't needed and causes troubles.
+ Mac OS X 10.4.6 <sys/types.h> includes <stdint.h> (which is us), but
+ relies on the system <stdint.h> definitions, so include
+ <sys/types.h> after @NEXT_STDINT_H@. */
+# if @HAVE_SYS_TYPES_H@ && ! defined _AIX
+# include <sys/types.h>
+# endif
+
+# if @HAVE_INTTYPES_H@
+ /* In OpenBSD 3.8, <inttypes.h> includes <machine/types.h>, which defines
+ int{8,16,32,64}_t, uint{8,16,32,64}_t and __BIT_TYPES_DEFINED__.
+ <inttypes.h> also defines intptr_t and uintptr_t. */
+# include <inttypes.h>
+# elif @HAVE_SYS_INTTYPES_H@
+ /* Solaris 7 <sys/inttypes.h> has the types except the *_fast*_t types, and
+ the macros except for *_FAST*_*, INTPTR_MIN, PTRDIFF_MIN, PTRDIFF_MAX. */
+# include <sys/inttypes.h>
+# endif
+
+# if @HAVE_SYS_BITYPES_H@ && ! defined __BIT_TYPES_DEFINED__
+ /* Linux libc4 >= 4.6.7 and libc5 have a <sys/bitypes.h> that defines
+ int{8,16,32,64}_t and __BIT_TYPES_DEFINED__. In libc5 >= 5.2.2 it is
+ included by <sys/types.h>. */
+# include <sys/bitypes.h>
+# endif
+
+# undef _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+
+/* Minimum and maximum values for an integer type under the usual assumption.
+ Return an unspecified value if BITS == 0, adding a check to pacify
+ picky compilers. */
+
+/* These are separate macros, because if you try to merge these macros into
+ a single one, HP-UX cc rejects the resulting expression in constant
+ expressions. */
+# define _STDINT_UNSIGNED_MIN(bits, zero) \
+ (zero)
+# define _STDINT_SIGNED_MIN(bits, zero) \
+ (~ _STDINT_MAX (1, bits, zero))
+
+# define _STDINT_MAX(signed, bits, zero) \
+ (((((zero) + 1) << ((bits) ? (bits) - 1 - (signed) : 0)) - 1) * 2 + 1)
+
+#if !GNULIB_defined_stdint_types
+
+/* 7.18.1.1. Exact-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. */
+
+# undef int8_t
+# undef uint8_t
+typedef signed char gl_int8_t;
+typedef unsigned char gl_uint8_t;
+# define int8_t gl_int8_t
+# define uint8_t gl_uint8_t
+
+# undef int16_t
+# undef uint16_t
+typedef short int gl_int16_t;
+typedef unsigned short int gl_uint16_t;
+# define int16_t gl_int16_t
+# define uint16_t gl_uint16_t
+
+# undef int32_t
+# undef uint32_t
+typedef int gl_int32_t;
+typedef unsigned int gl_uint32_t;
+# define int32_t gl_int32_t
+# define uint32_t gl_uint32_t
+
+/* If the system defines INT64_MAX, assume int64_t works. That way,
+ if the underlying platform defines int64_t to be a 64-bit long long
+ int, the code below won't mistakenly define it to be a 64-bit long
+ int, which would mess up C++ name mangling. We must use #ifdef
+ rather than #if, to avoid an error with HP-UX 10.20 cc. */
+
+# ifdef INT64_MAX
+# define GL_INT64_T
+# else
+/* Do not undefine int64_t if gnulib is not being used with 64-bit
+ types, since otherwise it breaks platforms like Tandem/NSK. */
+# if LONG_MAX >> 31 >> 31 == 1
+# undef int64_t
+typedef long int gl_int64_t;
+# define int64_t gl_int64_t
+# define GL_INT64_T
+# elif defined _MSC_VER
+# undef int64_t
+typedef __int64 gl_int64_t;
+# define int64_t gl_int64_t
+# define GL_INT64_T
+# else
+# undef int64_t
+typedef long long int gl_int64_t;
+# define int64_t gl_int64_t
+# define GL_INT64_T
+# endif
+# endif
+
+# ifdef UINT64_MAX
+# define GL_UINT64_T
+# else
+# if ULONG_MAX >> 31 >> 31 >> 1 == 1
+# undef uint64_t
+typedef unsigned long int gl_uint64_t;
+# define uint64_t gl_uint64_t
+# define GL_UINT64_T
+# elif defined _MSC_VER
+# undef uint64_t
+typedef unsigned __int64 gl_uint64_t;
+# define uint64_t gl_uint64_t
+# define GL_UINT64_T
+# else
+# undef uint64_t
+typedef unsigned long long int gl_uint64_t;
+# define uint64_t gl_uint64_t
+# define GL_UINT64_T
+# endif
+# endif
+
+/* Avoid collision with Solaris 2.5.1 <pthread.h> etc. */
+# define _UINT8_T
+# define _UINT32_T
+# define _UINT64_T
+
+
+/* 7.18.1.2. Minimum-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types
+ are the same as the corresponding N_t types. */
+
+# undef int_least8_t
+# undef uint_least8_t
+# undef int_least16_t
+# undef uint_least16_t
+# undef int_least32_t
+# undef uint_least32_t
+# undef int_least64_t
+# undef uint_least64_t
+# define int_least8_t int8_t
+# define uint_least8_t uint8_t
+# define int_least16_t int16_t
+# define uint_least16_t uint16_t
+# define int_least32_t int32_t
+# define uint_least32_t uint32_t
+# ifdef GL_INT64_T
+# define int_least64_t int64_t
+# endif
+# ifdef GL_UINT64_T
+# define uint_least64_t uint64_t
+# endif
+
+/* 7.18.1.3. Fastest minimum-width integer types */
+
+/* Note: Other <stdint.h> substitutes may define these types differently.
+ It is not recommended to use these types in public header files. */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types
+ are taken from the same list of types. The following code normally
+ uses types consistent with glibc, as that lessens the chance of
+ incompatibility with older GNU hosts. */
+
+# undef int_fast8_t
+# undef uint_fast8_t
+# undef int_fast16_t
+# undef uint_fast16_t
+# undef int_fast32_t
+# undef uint_fast32_t
+# undef int_fast64_t
+# undef uint_fast64_t
+typedef signed char gl_int_fast8_t;
+typedef unsigned char gl_uint_fast8_t;
+
+# ifdef __sun
+/* Define types compatible with SunOS 5.10, so that code compiled under
+ earlier SunOS versions works with code compiled under SunOS 5.10. */
+typedef int gl_int_fast32_t;
+typedef unsigned int gl_uint_fast32_t;
+# else
+typedef long int gl_int_fast32_t;
+typedef unsigned long int gl_uint_fast32_t;
+# endif
+typedef gl_int_fast32_t gl_int_fast16_t;
+typedef gl_uint_fast32_t gl_uint_fast16_t;
+
+# define int_fast8_t gl_int_fast8_t
+# define uint_fast8_t gl_uint_fast8_t
+# define int_fast16_t gl_int_fast16_t
+# define uint_fast16_t gl_uint_fast16_t
+# define int_fast32_t gl_int_fast32_t
+# define uint_fast32_t gl_uint_fast32_t
+# ifdef GL_INT64_T
+# define int_fast64_t int64_t
+# endif
+# ifdef GL_UINT64_T
+# define uint_fast64_t uint64_t
+# endif
+
+/* 7.18.1.4. Integer types capable of holding object pointers */
+
+/* kLIBC's <stdint.h> defines _INTPTR_T_DECLARED and needs its own
+ definitions of intptr_t and uintptr_t (which use int and unsigned)
+ to avoid clashes with declarations of system functions like sbrk.
+ Similarly, MinGW WSL-5.4.1 <stdint.h> needs its own intptr_t and
+ uintptr_t to avoid conflicting declarations of system functions like
+ _findclose in <io.h>. */
+# if !((defined __KLIBC__ && defined _INTPTR_T_DECLARED) \
+ || defined __MINGW32__)
+# undef intptr_t
+# undef uintptr_t
+# ifdef _WIN64
+typedef long long int gl_intptr_t;
+typedef unsigned long long int gl_uintptr_t;
+# else
+typedef long int gl_intptr_t;
+typedef unsigned long int gl_uintptr_t;
+# endif
+# define intptr_t gl_intptr_t
+# define uintptr_t gl_uintptr_t
+# endif
+
+/* 7.18.1.5. Greatest-width integer types */
+
+/* Note: These types are compiler dependent. It may be unwise to use them in
+ public header files. */
+
+/* If the system defines INTMAX_MAX, assume that intmax_t works, and
+ similarly for UINTMAX_MAX and uintmax_t. This avoids problems with
+ assuming one type where another is used by the system. */
+
+# ifndef INTMAX_MAX
+# undef INTMAX_C
+# undef intmax_t
+# if LONG_MAX >> 30 == 1
+typedef long long int gl_intmax_t;
+# define intmax_t gl_intmax_t
+# elif defined GL_INT64_T
+# define intmax_t int64_t
+# else
+typedef long int gl_intmax_t;
+# define intmax_t gl_intmax_t
+# endif
+# endif
+
+# ifndef UINTMAX_MAX
+# undef UINTMAX_C
+# undef uintmax_t
+# if ULONG_MAX >> 31 == 1
+typedef unsigned long long int gl_uintmax_t;
+# define uintmax_t gl_uintmax_t
+# elif defined GL_UINT64_T
+# define uintmax_t uint64_t
+# else
+typedef unsigned long int gl_uintmax_t;
+# define uintmax_t gl_uintmax_t
+# endif
+# endif
+
+/* Verify that intmax_t and uintmax_t have the same size. Too much code
+ breaks if this is not the case. If this check fails, the reason is likely
+ to be found in the autoconf macros. */
+typedef int _verify_intmax_size[sizeof (intmax_t) == sizeof (uintmax_t)
+ ? 1 : -1];
+
+# define GNULIB_defined_stdint_types 1
+# endif /* !GNULIB_defined_stdint_types */
+
+/* 7.18.2. Limits of specified-width integer types */
+
+/* 7.18.2.1. Limits of exact-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. */
+
+# undef INT8_MIN
+# undef INT8_MAX
+# undef UINT8_MAX
+# define INT8_MIN (~ INT8_MAX)
+# define INT8_MAX 127
+# define UINT8_MAX 255
+
+# undef INT16_MIN
+# undef INT16_MAX
+# undef UINT16_MAX
+# define INT16_MIN (~ INT16_MAX)
+# define INT16_MAX 32767
+# define UINT16_MAX 65535
+
+# undef INT32_MIN
+# undef INT32_MAX
+# undef UINT32_MAX
+# define INT32_MIN (~ INT32_MAX)
+# define INT32_MAX 2147483647
+# define UINT32_MAX 4294967295U
+
+# if defined GL_INT64_T && ! defined INT64_MAX
+/* Prefer (- INTMAX_C (1) << 63) over (~ INT64_MAX) because SunPRO C 5.0
+ evaluates the latter incorrectly in preprocessor expressions. */
+# define INT64_MIN (- INTMAX_C (1) << 63)
+# define INT64_MAX INTMAX_C (9223372036854775807)
+# endif
+
+# if defined GL_UINT64_T && ! defined UINT64_MAX
+# define UINT64_MAX UINTMAX_C (18446744073709551615)
+# endif
+
+/* 7.18.2.2. Limits of minimum-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types
+ are the same as the corresponding N_t types. */
+
+# undef INT_LEAST8_MIN
+# undef INT_LEAST8_MAX
+# undef UINT_LEAST8_MAX
+# define INT_LEAST8_MIN INT8_MIN
+# define INT_LEAST8_MAX INT8_MAX
+# define UINT_LEAST8_MAX UINT8_MAX
+
+# undef INT_LEAST16_MIN
+# undef INT_LEAST16_MAX
+# undef UINT_LEAST16_MAX
+# define INT_LEAST16_MIN INT16_MIN
+# define INT_LEAST16_MAX INT16_MAX
+# define UINT_LEAST16_MAX UINT16_MAX
+
+# undef INT_LEAST32_MIN
+# undef INT_LEAST32_MAX
+# undef UINT_LEAST32_MAX
+# define INT_LEAST32_MIN INT32_MIN
+# define INT_LEAST32_MAX INT32_MAX
+# define UINT_LEAST32_MAX UINT32_MAX
+
+# undef INT_LEAST64_MIN
+# undef INT_LEAST64_MAX
+# ifdef GL_INT64_T
+# define INT_LEAST64_MIN INT64_MIN
+# define INT_LEAST64_MAX INT64_MAX
+# endif
+
+# undef UINT_LEAST64_MAX
+# ifdef GL_UINT64_T
+# define UINT_LEAST64_MAX UINT64_MAX
+# endif
+
+/* 7.18.2.3. Limits of fastest minimum-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types
+ are taken from the same list of types. */
+
+# undef INT_FAST8_MIN
+# undef INT_FAST8_MAX
+# undef UINT_FAST8_MAX
+# define INT_FAST8_MIN SCHAR_MIN
+# define INT_FAST8_MAX SCHAR_MAX
+# define UINT_FAST8_MAX UCHAR_MAX
+
+# undef INT_FAST16_MIN
+# undef INT_FAST16_MAX
+# undef UINT_FAST16_MAX
+# define INT_FAST16_MIN INT_FAST32_MIN
+# define INT_FAST16_MAX INT_FAST32_MAX
+# define UINT_FAST16_MAX UINT_FAST32_MAX
+
+# undef INT_FAST32_MIN
+# undef INT_FAST32_MAX
+# undef UINT_FAST32_MAX
+# ifdef __sun
+# define INT_FAST32_MIN INT_MIN
+# define INT_FAST32_MAX INT_MAX
+# define UINT_FAST32_MAX UINT_MAX
+# else
+# define INT_FAST32_MIN LONG_MIN
+# define INT_FAST32_MAX LONG_MAX
+# define UINT_FAST32_MAX ULONG_MAX
+# endif
+
+# undef INT_FAST64_MIN
+# undef INT_FAST64_MAX
+# ifdef GL_INT64_T
+# define INT_FAST64_MIN INT64_MIN
+# define INT_FAST64_MAX INT64_MAX
+# endif
+
+# undef UINT_FAST64_MAX
+# ifdef GL_UINT64_T
+# define UINT_FAST64_MAX UINT64_MAX
+# endif
+
+/* 7.18.2.4. Limits of integer types capable of holding object pointers */
+
+# undef INTPTR_MIN
+# undef INTPTR_MAX
+# undef UINTPTR_MAX
+# ifdef _WIN64
+# define INTPTR_MIN LLONG_MIN
+# define INTPTR_MAX LLONG_MAX
+# define UINTPTR_MAX ULLONG_MAX
+# else
+# define INTPTR_MIN LONG_MIN
+# define INTPTR_MAX LONG_MAX
+# define UINTPTR_MAX ULONG_MAX
+# endif
+
+/* 7.18.2.5. Limits of greatest-width integer types */
+
+# ifndef INTMAX_MAX
+# undef INTMAX_MIN
+# ifdef INT64_MAX
+# define INTMAX_MIN INT64_MIN
+# define INTMAX_MAX INT64_MAX
+# else
+# define INTMAX_MIN INT32_MIN
+# define INTMAX_MAX INT32_MAX
+# endif
+# endif
+
+# ifndef UINTMAX_MAX
+# ifdef UINT64_MAX
+# define UINTMAX_MAX UINT64_MAX
+# else
+# define UINTMAX_MAX UINT32_MAX
+# endif
+# endif
+
+/* 7.18.3. Limits of other integer types */
+
+/* ptrdiff_t limits */
+# undef PTRDIFF_MIN
+# undef PTRDIFF_MAX
+# if @APPLE_UNIVERSAL_BUILD@
+# ifdef _LP64
+# define PTRDIFF_MIN _STDINT_SIGNED_MIN (64, 0l)
+# define PTRDIFF_MAX _STDINT_MAX (1, 64, 0l)
+# else
+# define PTRDIFF_MIN _STDINT_SIGNED_MIN (32, 0)
+# define PTRDIFF_MAX _STDINT_MAX (1, 32, 0)
+# endif
+# else
+# define PTRDIFF_MIN \
+ _STDINT_SIGNED_MIN (@BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@)
+# define PTRDIFF_MAX \
+ _STDINT_MAX (1, @BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@)
+# endif
+
+/* sig_atomic_t limits */
+# undef SIG_ATOMIC_MIN
+# undef SIG_ATOMIC_MAX
+# if @HAVE_SIGNED_SIG_ATOMIC_T@
+# define SIG_ATOMIC_MIN \
+ _STDINT_SIGNED_MIN (@BITSIZEOF_SIG_ATOMIC_T@, 0@SIG_ATOMIC_T_SUFFIX@)
+# else
+# define SIG_ATOMIC_MIN \
+ _STDINT_UNSIGNED_MIN (@BITSIZEOF_SIG_ATOMIC_T@, 0@SIG_ATOMIC_T_SUFFIX@)
+# endif
+# define SIG_ATOMIC_MAX \
+ _STDINT_MAX (@HAVE_SIGNED_SIG_ATOMIC_T@, @BITSIZEOF_SIG_ATOMIC_T@, \
+ 0@SIG_ATOMIC_T_SUFFIX@)
+
+
+/* size_t limit */
+# undef SIZE_MAX
+# if @APPLE_UNIVERSAL_BUILD@
+# ifdef _LP64
+# define SIZE_MAX _STDINT_MAX (0, 64, 0ul)
+# else
+# define SIZE_MAX _STDINT_MAX (0, 32, 0ul)
+# endif
+# else
+# define SIZE_MAX _STDINT_MAX (0, @BITSIZEOF_SIZE_T@, 0@SIZE_T_SUFFIX@)
+# endif
+
+/* wchar_t limits */
+/* Get WCHAR_MIN, WCHAR_MAX.
+ This include is not on the top, above, because on OSF/1 4.0 we have a
+ sequence of nested includes
+ <wchar.h> -> <stdio.h> -> <getopt.h> -> <stdlib.h>, and the latter includes
+ <stdint.h> and assumes its types are already defined. */
+# if @HAVE_WCHAR_H@ && ! (defined WCHAR_MIN && defined WCHAR_MAX)
+# define _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
+# include <wchar.h>
+# undef _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
+# endif
+# undef WCHAR_MIN
+# undef WCHAR_MAX
+# if @HAVE_SIGNED_WCHAR_T@
+# define WCHAR_MIN \
+ _STDINT_SIGNED_MIN (@BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
+# else
+# define WCHAR_MIN \
+ _STDINT_UNSIGNED_MIN (@BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
+# endif
+# define WCHAR_MAX \
+ _STDINT_MAX (@HAVE_SIGNED_WCHAR_T@, @BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
+
+/* wint_t limits */
+/* If gnulib's <wchar.h> or <wctype.h> overrides wint_t, @WINT_T_SUFFIX@ is not
+ accurate, therefore use the definitions from above. */
+# if !@GNULIBHEADERS_OVERRIDE_WINT_T@
+# undef WINT_MIN
+# undef WINT_MAX
+# if @HAVE_SIGNED_WINT_T@
+# define WINT_MIN \
+ _STDINT_SIGNED_MIN (@BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
+# else
+# define WINT_MIN \
+ _STDINT_UNSIGNED_MIN (@BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
+# endif
+# define WINT_MAX \
+ _STDINT_MAX (@HAVE_SIGNED_WINT_T@, @BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
+# endif
+
+/* 7.18.4. Macros for integer constants */
+
+/* 7.18.4.1. Macros for minimum-width integer constants */
+/* According to ISO C 99 Technical Corrigendum 1 */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits, and int is 32 bits. */
+
+# undef INT8_C
+# undef UINT8_C
+# define INT8_C(x) x
+# define UINT8_C(x) x
+
+# undef INT16_C
+# undef UINT16_C
+# define INT16_C(x) x
+# define UINT16_C(x) x
+
+# undef INT32_C
+# undef UINT32_C
+# define INT32_C(x) x
+# define UINT32_C(x) x ## U
+
+# undef INT64_C
+# undef UINT64_C
+# if LONG_MAX >> 31 >> 31 == 1
+# define INT64_C(x) x##L
+# elif defined _MSC_VER
+# define INT64_C(x) x##i64
+# else
+# define INT64_C(x) x##LL
+# endif
+# if ULONG_MAX >> 31 >> 31 >> 1 == 1
+# define UINT64_C(x) x##UL
+# elif defined _MSC_VER
+# define UINT64_C(x) x##ui64
+# else
+# define UINT64_C(x) x##ULL
+# endif
+
+/* 7.18.4.2. Macros for greatest-width integer constants */
+
+# ifndef INTMAX_C
+# if LONG_MAX >> 30 == 1
+# define INTMAX_C(x) x##LL
+# elif defined GL_INT64_T
+# define INTMAX_C(x) INT64_C(x)
+# else
+# define INTMAX_C(x) x##L
+# endif
+# endif
+
+# ifndef UINTMAX_C
+# if ULONG_MAX >> 31 == 1
+# define UINTMAX_C(x) x##ULL
+# elif defined GL_UINT64_T
+# define UINTMAX_C(x) UINT64_C(x)
+# else
+# define UINTMAX_C(x) x##UL
+# endif
+# endif
+
+#endif /* !@HAVE_C99_STDINT_H@ */
+
+/* Macros specified by ISO/IEC TS 18661-1:2014. */
+
+#if (!defined UINTMAX_WIDTH \
+ && (defined _GNU_SOURCE || defined __STDC_WANT_IEC_60559_BFP_EXT__))
+# ifdef INT8_MAX
+# define INT8_WIDTH _GL_INTEGER_WIDTH (INT8_MIN, INT8_MAX)
+# endif
+# ifdef UINT8_MAX
+# define UINT8_WIDTH _GL_INTEGER_WIDTH (0, UINT8_MAX)
+# endif
+# ifdef INT16_MAX
+# define INT16_WIDTH _GL_INTEGER_WIDTH (INT16_MIN, INT16_MAX)
+# endif
+# ifdef UINT16_MAX
+# define UINT16_WIDTH _GL_INTEGER_WIDTH (0, UINT16_MAX)
+# endif
+# ifdef INT32_MAX
+# define INT32_WIDTH _GL_INTEGER_WIDTH (INT32_MIN, INT32_MAX)
+# endif
+# ifdef UINT32_MAX
+# define UINT32_WIDTH _GL_INTEGER_WIDTH (0, UINT32_MAX)
+# endif
+# ifdef INT64_MAX
+# define INT64_WIDTH _GL_INTEGER_WIDTH (INT64_MIN, INT64_MAX)
+# endif
+# ifdef UINT64_MAX
+# define UINT64_WIDTH _GL_INTEGER_WIDTH (0, UINT64_MAX)
+# endif
+# define INT_LEAST8_WIDTH _GL_INTEGER_WIDTH (INT_LEAST8_MIN, INT_LEAST8_MAX)
+# define UINT_LEAST8_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST8_MAX)
+# define INT_LEAST16_WIDTH _GL_INTEGER_WIDTH (INT_LEAST16_MIN, INT_LEAST16_MAX)
+# define UINT_LEAST16_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST16_MAX)
+# define INT_LEAST32_WIDTH _GL_INTEGER_WIDTH (INT_LEAST32_MIN, INT_LEAST32_MAX)
+# define UINT_LEAST32_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST32_MAX)
+# define INT_LEAST64_WIDTH _GL_INTEGER_WIDTH (INT_LEAST64_MIN, INT_LEAST64_MAX)
+# define UINT_LEAST64_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST64_MAX)
+# define INT_FAST8_WIDTH _GL_INTEGER_WIDTH (INT_FAST8_MIN, INT_FAST8_MAX)
+# define UINT_FAST8_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST8_MAX)
+# define INT_FAST16_WIDTH _GL_INTEGER_WIDTH (INT_FAST16_MIN, INT_FAST16_MAX)
+# define UINT_FAST16_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST16_MAX)
+# define INT_FAST32_WIDTH _GL_INTEGER_WIDTH (INT_FAST32_MIN, INT_FAST32_MAX)
+# define UINT_FAST32_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST32_MAX)
+# define INT_FAST64_WIDTH _GL_INTEGER_WIDTH (INT_FAST64_MIN, INT_FAST64_MAX)
+# define UINT_FAST64_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST64_MAX)
+# define INTPTR_WIDTH _GL_INTEGER_WIDTH (INTPTR_MIN, INTPTR_MAX)
+# define UINTPTR_WIDTH _GL_INTEGER_WIDTH (0, UINTPTR_MAX)
+# define INTMAX_WIDTH _GL_INTEGER_WIDTH (INTMAX_MIN, INTMAX_MAX)
+# define UINTMAX_WIDTH _GL_INTEGER_WIDTH (0, UINTMAX_MAX)
+# define PTRDIFF_WIDTH _GL_INTEGER_WIDTH (PTRDIFF_MIN, PTRDIFF_MAX)
+# define SIZE_WIDTH _GL_INTEGER_WIDTH (0, SIZE_MAX)
+# define WCHAR_WIDTH _GL_INTEGER_WIDTH (WCHAR_MIN, WCHAR_MAX)
+# ifdef WINT_MAX
+# define WINT_WIDTH _GL_INTEGER_WIDTH (WINT_MIN, WINT_MAX)
+# endif
+# ifdef SIG_ATOMIC_MAX
+# define SIG_ATOMIC_WIDTH _GL_INTEGER_WIDTH (SIG_ATOMIC_MIN, SIG_ATOMIC_MAX)
+# endif
+#endif /* !WINT_WIDTH && (_GNU_SOURCE || __STDC_WANT_IEC_60559_BFP_EXT__) */
+
+#endif /* _@GUARD_PREFIX@_STDINT_H */
+#endif /* !(defined __ANDROID__ && ...) */
+#endif /* !defined _@GUARD_PREFIX@_STDINT_H && !defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H */
diff --git a/lib/stdio-impl.h b/lib/stdio-impl.h
new file mode 100644
index 0000000..46608be
--- /dev/null
+++ b/lib/stdio-impl.h
@@ -0,0 +1,218 @@
+/* Implementation details of FILE streams.
+ Copyright (C) 2007-2008, 2010-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Many stdio implementations have the same logic and therefore can share
+ the same implementation of stdio extension API, except that some fields
+ have different naming conventions, or their access requires some casts. */
+
+/* Glibc 2.28 made _IO_UNBUFFERED and _IO_IN_BACKUP private. For now, work
+ around this problem by defining them ourselves. FIXME: Do not rely on glibc
+ internals. */
+#if defined _IO_EOF_SEEN
+# if !defined _IO_UNBUFFERED
+# define _IO_UNBUFFERED 0x2
+# endif
+# if !defined _IO_IN_BACKUP
+# define _IO_IN_BACKUP 0x100
+# endif
+#endif
+
+/* BSD stdio derived implementations. */
+
+#if defined __NetBSD__ /* NetBSD */
+/* Get __NetBSD_Version__. */
+# include <sys/param.h>
+#endif
+
+#include <errno.h> /* For detecting Plan9. */
+
+#if defined __sferror || defined __DragonFly__ || defined __ANDROID__
+ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
+
+# if defined __DragonFly__ /* DragonFly */
+ /* See <https://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/lib/libc/stdio/priv_stdio.h>. */
+# define fp_ ((struct { struct __FILE_public pub; \
+ struct { unsigned char *_base; int _size; } _bf; \
+ void *cookie; \
+ void *_close; \
+ void *_read; \
+ void *_seek; \
+ void *_write; \
+ struct { unsigned char *_base; int _size; } _ub; \
+ int _ur; \
+ unsigned char _ubuf[3]; \
+ unsigned char _nbuf[1]; \
+ struct { unsigned char *_base; int _size; } _lb; \
+ int _blksize; \
+ fpos_t _offset; \
+ /* More fields, not relevant here. */ \
+ } *) fp)
+ /* See <https://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/include/stdio.h>. */
+# define _p pub._p
+# define _flags pub._flags
+# define _r pub._r
+# define _w pub._w
+# elif defined __ANDROID__ /* Android */
+# ifdef __LP64__
+# define _gl_flags_file_t int
+# else
+# define _gl_flags_file_t short
+# endif
+# ifdef __LP64__
+# define _gl_file_offset_t int64_t
+# else
+ /* see https://android.googlesource.com/platform/bionic/+/master/docs/32-bit-abi.md */
+# define _gl_file_offset_t __kernel_off_t
+# endif
+ /* Up to this commit from 2015-10-12
+ <https://android.googlesource.com/platform/bionic.git/+/f0141dfab10a4b332769d52fa76631a64741297a>
+ the innards of FILE were public, and fp_ub could be defined like for OpenBSD,
+ see <https://android.googlesource.com/platform/bionic.git/+/e78392637d5086384a5631ddfdfa8d7ec8326ee3/libc/stdio/fileext.h>
+ and <https://android.googlesource.com/platform/bionic.git/+/e78392637d5086384a5631ddfdfa8d7ec8326ee3/libc/stdio/local.h>.
+ After this commit, the innards of FILE are hidden. */
+# define fp_ ((struct { unsigned char *_p; \
+ int _r; \
+ int _w; \
+ _gl_flags_file_t _flags; \
+ _gl_flags_file_t _file; \
+ struct { unsigned char *_base; size_t _size; } _bf; \
+ int _lbfsize; \
+ void *_cookie; \
+ void *_close; \
+ void *_read; \
+ void *_seek; \
+ void *_write; \
+ struct { unsigned char *_base; size_t _size; } _ext; \
+ unsigned char *_up; \
+ int _ur; \
+ unsigned char _ubuf[3]; \
+ unsigned char _nbuf[1]; \
+ struct { unsigned char *_base; size_t _size; } _lb; \
+ int _blksize; \
+ _gl_file_offset_t _offset; \
+ /* More fields, not relevant here. */ \
+ } *) fp)
+# else
+# define fp_ fp
+# endif
+
+# if (defined __NetBSD__ && __NetBSD_Version__ >= 105270000) || defined __OpenBSD__ || defined __minix /* NetBSD >= 1.5ZA, OpenBSD, Minix 3 */
+ /* See <http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup>
+ and <https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup>
+ and <https://github.com/Stichting-MINIX-Research-Foundation/minix/blob/master/lib/libc/stdio/fileext.h> */
+ struct __sfileext
+ {
+ struct __sbuf _ub; /* ungetc buffer */
+ /* More fields, not relevant here. */
+ };
+# define fp_ub ((struct __sfileext *) fp->_ext._base)->_ub
+# elif defined __ANDROID__ /* Android */
+ struct __sfileext
+ {
+ struct { unsigned char *_base; size_t _size; } _ub; /* ungetc buffer */
+ /* More fields, not relevant here. */
+ };
+# define fp_ub ((struct __sfileext *) fp_->_ext._base)->_ub
+# else /* FreeBSD, NetBSD <= 1.5Z, DragonFly, Mac OS X, Cygwin */
+# define fp_ub fp_->_ub
+# endif
+
+# define HASUB(fp) (fp_ub._base != NULL)
+
+# if defined __ANDROID__ /* Android */
+ /* Needed after this commit from 2016-01-25
+ <https://android.googlesource.com/platform/bionic.git/+/e70e0e9267d069bf56a5078c99307e08a7280de7> */
+# ifndef __SEOF
+# define __SLBF 1
+# define __SNBF 2
+# define __SRD 4
+# define __SWR 8
+# define __SRW 0x10
+# define __SEOF 0x20
+# define __SERR 0x40
+# endif
+# ifndef __SOFF
+# define __SOFF 0x1000
+# endif
+# endif
+
+#endif
+
+
+/* SystemV derived implementations. */
+
+#ifdef __TANDEM /* NonStop Kernel */
+# ifndef _IOERR
+/* These values were determined by the program 'stdioext-flags' at
+ <https://lists.gnu.org/r/bug-gnulib/2010-12/msg00165.html>. */
+# define _IOERR 0x40
+# define _IOREAD 0x80
+# define _IOWRT 0x4
+# define _IORW 0x100
+# endif
+#endif
+
+#if defined _IOERR
+
+# if defined __sun && defined _LP64 /* Solaris/{SPARC,AMD64} 64-bit */
+# define fp_ ((struct { unsigned char *_ptr; \
+ unsigned char *_base; \
+ unsigned char *_end; \
+ long _cnt; \
+ int _file; \
+ unsigned int _flag; \
+ } *) fp)
+# elif defined __VMS /* OpenVMS */
+# define fp_ ((struct _iobuf *) fp)
+# else
+# define fp_ fp
+# endif
+
+# if defined _SCO_DS || (defined __SCO_VERSION__ || defined __sysv5__) /* OpenServer 5, OpenServer 6, UnixWare 7 */
+# define _cnt __cnt
+# define _ptr __ptr
+# define _base __base
+# define _flag __flag
+# endif
+
+#elif defined _WIN32 && ! defined __CYGWIN__ /* newer Windows with MSVC */
+
+/* <stdio.h> does not define the innards of FILE any more. */
+# define WINDOWS_OPAQUE_FILE
+
+struct _gl_real_FILE
+{
+ /* Note: Compared to older Windows and to mingw, it has the fields
+ _base and _cnt swapped. */
+ unsigned char *_ptr;
+ unsigned char *_base;
+ int _cnt;
+ int _flag;
+ int _file;
+ int _charbuf;
+ int _bufsiz;
+};
+# define fp_ ((struct _gl_real_FILE *) fp)
+
+/* These values were determined by a program similar to the one at
+ <https://lists.gnu.org/r/bug-gnulib/2010-12/msg00165.html>. */
+# define _IOREAD 0x1
+# define _IOWRT 0x2
+# define _IORW 0x4
+# define _IOEOF 0x8
+# define _IOERR 0x10
+
+#endif
diff --git a/lib/stdio-read.c b/lib/stdio-read.c
new file mode 100644
index 0000000..6e2984c
--- /dev/null
+++ b/lib/stdio-read.c
@@ -0,0 +1,168 @@
+/* POSIX compatible FILE stream read function.
+ Copyright (C) 2008-2023 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+/* Replace these functions only if module 'nonblocking' is requested. */
+#if GNULIB_NONBLOCKING
+
+/* On native Windows platforms, when read() is called on a non-blocking pipe
+ with an empty buffer, ReadFile() fails with error GetLastError() =
+ ERROR_NO_DATA, and read() in consequence fails with error EINVAL. This
+ read() function is at the basis of the function which fills the buffer of
+ a FILE stream. */
+
+# if defined _WIN32 && ! defined __CYGWIN__
+
+# include <errno.h>
+# include <io.h>
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# if GNULIB_MSVC_NOTHROW
+# include "msvc-nothrow.h"
+# else
+# include <io.h>
+# endif
+
+/* Don't assume that UNICODE is not defined. */
+# undef GetNamedPipeHandleState
+# define GetNamedPipeHandleState GetNamedPipeHandleStateA
+
+# define CALL_WITH_ERRNO_FIX(RETTYPE, EXPRESSION, FAILED) \
+ if (ferror (stream)) \
+ return (EXPRESSION); \
+ else \
+ { \
+ RETTYPE ret; \
+ SetLastError (0); \
+ ret = (EXPRESSION); \
+ if (FAILED) \
+ { \
+ if (GetLastError () == ERROR_NO_DATA && ferror (stream)) \
+ { \
+ int fd = fileno (stream); \
+ if (fd >= 0) \
+ { \
+ HANDLE h = (HANDLE) _get_osfhandle (fd); \
+ if (GetFileType (h) == FILE_TYPE_PIPE) \
+ { \
+ /* h is a pipe or socket. */ \
+ DWORD state; \
+ if (GetNamedPipeHandleState (h, &state, NULL, NULL, \
+ NULL, NULL, 0) \
+ && (state & PIPE_NOWAIT) != 0) \
+ /* h is a pipe in non-blocking mode. \
+ Change errno from EINVAL to EAGAIN. */ \
+ errno = EAGAIN; \
+ } \
+ } \
+ } \
+ } \
+ return ret; \
+ }
+
+/* Enable this function definition only if gnulib's <stdio.h> has prepared it.
+ Otherwise we get a function definition conflict with mingw64's <stdio.h>. */
+# if GNULIB_SCANF
+int
+scanf (const char *format, ...)
+{
+ int retval;
+ va_list args;
+
+ va_start (args, format);
+ retval = vfscanf (stdin, format, args);
+ va_end (args);
+
+ return retval;
+}
+# endif
+
+/* Enable this function definition only if gnulib's <stdio.h> has prepared it.
+ Otherwise we get a function definition conflict with mingw64's <stdio.h>. */
+# if GNULIB_FSCANF
+int
+fscanf (FILE *stream, const char *format, ...)
+{
+ int retval;
+ va_list args;
+
+ va_start (args, format);
+ retval = vfscanf (stream, format, args);
+ va_end (args);
+
+ return retval;
+}
+# endif
+
+/* Enable this function definition only if gnulib's <stdio.h> has prepared it.
+ Otherwise we get a function definition conflict with mingw64's <stdio.h>. */
+# if GNULIB_VSCANF
+int
+vscanf (const char *format, va_list args)
+{
+ return vfscanf (stdin, format, args);
+}
+# endif
+
+/* Enable this function definition only if gnulib's <stdio.h> has prepared it.
+ Otherwise we get a function definition conflict with mingw64's <stdio.h>. */
+# if GNULIB_VFSCANF
+int
+vfscanf (FILE *stream, const char *format, va_list args)
+#undef vfscanf
+{
+ CALL_WITH_ERRNO_FIX (int, vfscanf (stream, format, args), ret == EOF)
+}
+# endif
+
+int
+getchar (void)
+{
+ return fgetc (stdin);
+}
+
+int
+fgetc (FILE *stream)
+#undef fgetc
+{
+ CALL_WITH_ERRNO_FIX (int, fgetc (stream), ret == EOF)
+}
+
+char *
+fgets (char *s, int n, FILE *stream)
+#undef fgets
+{
+ CALL_WITH_ERRNO_FIX (char *, fgets (s, n, stream), ret == NULL)
+}
+
+/* We intentionally don't bother to fix gets. */
+
+size_t
+fread (void *ptr, size_t s, size_t n, FILE *stream)
+#undef fread
+{
+ CALL_WITH_ERRNO_FIX (size_t, fread (ptr, s, n, stream), ret < n)
+}
+
+# endif
+#endif
diff --git a/lib/stdio-write.c b/lib/stdio-write.c
new file mode 100644
index 0000000..9cf36cc
--- /dev/null
+++ b/lib/stdio-write.c
@@ -0,0 +1,206 @@
+/* POSIX compatible FILE stream write function.
+ Copyright (C) 2008-2023 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+/* Replace these functions only if module 'nonblocking' or module 'sigpipe' is
+ requested. */
+#if GNULIB_NONBLOCKING || GNULIB_SIGPIPE
+
+/* On native Windows platforms, SIGPIPE does not exist. When write() is
+ called on a pipe with no readers, WriteFile() fails with error
+ GetLastError() = ERROR_NO_DATA, and write() in consequence fails with
+ error EINVAL. This write() function is at the basis of the function
+ which flushes the buffer of a FILE stream. */
+
+# if defined _WIN32 && ! defined __CYGWIN__
+
+# include <errno.h>
+# include <signal.h>
+# include <io.h>
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# if GNULIB_MSVC_NOTHROW
+# include "msvc-nothrow.h"
+# else
+# include <io.h>
+# endif
+
+/* Don't assume that UNICODE is not defined. */
+# undef GetNamedPipeHandleState
+# define GetNamedPipeHandleState GetNamedPipeHandleStateA
+
+# if GNULIB_NONBLOCKING
+# define CLEAR_ERRNO \
+ errno = 0;
+# define HANDLE_ENOSPC \
+ if (errno == ENOSPC && ferror (stream)) \
+ { \
+ int fd = fileno (stream); \
+ if (fd >= 0) \
+ { \
+ HANDLE h = (HANDLE) _get_osfhandle (fd); \
+ if (GetFileType (h) == FILE_TYPE_PIPE) \
+ { \
+ /* h is a pipe or socket. */ \
+ DWORD state; \
+ if (GetNamedPipeHandleState (h, &state, NULL, NULL, \
+ NULL, NULL, 0) \
+ && (state & PIPE_NOWAIT) != 0) \
+ /* h is a pipe in non-blocking mode. \
+ Change errno from ENOSPC to EAGAIN. */ \
+ errno = EAGAIN; \
+ } \
+ } \
+ } \
+ else
+# else
+# define CLEAR_ERRNO
+# define HANDLE_ENOSPC
+# endif
+
+# if GNULIB_SIGPIPE
+# define CLEAR_LastError \
+ SetLastError (0);
+# define HANDLE_ERROR_NO_DATA \
+ if (GetLastError () == ERROR_NO_DATA && ferror (stream)) \
+ { \
+ int fd = fileno (stream); \
+ if (fd >= 0 \
+ && GetFileType ((HANDLE) _get_osfhandle (fd)) \
+ == FILE_TYPE_PIPE) \
+ { \
+ /* Try to raise signal SIGPIPE. */ \
+ raise (SIGPIPE); \
+ /* If it is currently blocked or ignored, change errno from \
+ EINVAL to EPIPE. */ \
+ errno = EPIPE; \
+ } \
+ } \
+ else
+# else
+# define CLEAR_LastError
+# define HANDLE_ERROR_NO_DATA
+# endif
+
+# define CALL_WITH_SIGPIPE_EMULATION(RETTYPE, EXPRESSION, FAILED) \
+ if (ferror (stream)) \
+ return (EXPRESSION); \
+ else \
+ { \
+ RETTYPE ret; \
+ CLEAR_ERRNO \
+ CLEAR_LastError \
+ ret = (EXPRESSION); \
+ if (FAILED) \
+ { \
+ HANDLE_ENOSPC \
+ HANDLE_ERROR_NO_DATA \
+ ; \
+ } \
+ return ret; \
+ }
+
+# if !REPLACE_PRINTF_POSIX /* avoid collision with printf.c */
+int
+printf (const char *format, ...)
+{
+ int retval;
+ va_list args;
+
+ va_start (args, format);
+ retval = vfprintf (stdout, format, args);
+ va_end (args);
+
+ return retval;
+}
+# endif
+
+# if !REPLACE_FPRINTF_POSIX /* avoid collision with fprintf.c */
+int
+fprintf (FILE *stream, const char *format, ...)
+{
+ int retval;
+ va_list args;
+
+ va_start (args, format);
+ retval = vfprintf (stream, format, args);
+ va_end (args);
+
+ return retval;
+}
+# endif
+
+# if !REPLACE_VPRINTF_POSIX /* avoid collision with vprintf.c */
+int
+vprintf (const char *format, va_list args)
+{
+ return vfprintf (stdout, format, args);
+}
+# endif
+
+# if !REPLACE_VFPRINTF_POSIX /* avoid collision with vfprintf.c */
+int
+vfprintf (FILE *stream, const char *format, va_list args)
+#undef vfprintf
+{
+ CALL_WITH_SIGPIPE_EMULATION (int, vfprintf (stream, format, args), ret == EOF)
+}
+# endif
+
+int
+putchar (int c)
+{
+ return fputc (c, stdout);
+}
+
+int
+fputc (int c, FILE *stream)
+#undef fputc
+{
+ CALL_WITH_SIGPIPE_EMULATION (int, fputc (c, stream), ret == EOF)
+}
+
+int
+fputs (const char *string, FILE *stream)
+#undef fputs
+{
+ CALL_WITH_SIGPIPE_EMULATION (int, fputs (string, stream), ret == EOF)
+}
+
+int
+puts (const char *string)
+#undef puts
+{
+ FILE *stream = stdout;
+ CALL_WITH_SIGPIPE_EMULATION (int, puts (string), ret == EOF)
+}
+
+size_t
+fwrite (const void *ptr, size_t s, size_t n, FILE *stream)
+#undef fwrite
+{
+ CALL_WITH_SIGPIPE_EMULATION (size_t, fwrite (ptr, s, n, stream), ret < n)
+}
+
+# endif
+#endif
diff --git a/lib/stdio.in.h b/lib/stdio.in.h
new file mode 100644
index 0000000..3f8ea98
--- /dev/null
+++ b/lib/stdio.in.h
@@ -0,0 +1,1723 @@
+/* A GNU-like <stdio.h>.
+
+ Copyright (C) 2004, 2007-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_FILE || defined __need___FILE || defined _GL_ALREADY_INCLUDING_STDIO_H
+/* Special invocation convention:
+ - Inside glibc header files.
+ - On OSF/1 5.1 we have a sequence of nested includes
+ <stdio.h> -> <getopt.h> -> <ctype.h> -> <sys/localedef.h> ->
+ <sys/lc_core.h> -> <nl_types.h> -> <mesg.h> -> <stdio.h>.
+ In this situation, the functions are not yet declared, therefore we cannot
+ provide the C++ aliases. */
+
+#@INCLUDE_NEXT@ @NEXT_STDIO_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_STDIO_H
+
+#define _GL_ALREADY_INCLUDING_STDIO_H
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_STDIO_H@
+
+#undef _GL_ALREADY_INCLUDING_STDIO_H
+
+#ifndef _@GUARD_PREFIX@_STDIO_H
+#define _@GUARD_PREFIX@_STDIO_H
+
+/* Get va_list. Needed on many systems, including glibc 2.8. */
+#include <stdarg.h>
+
+#include <stddef.h>
+
+/* Get off_t and ssize_t. Needed on many systems, including glibc 2.8
+ and eglibc 2.11.2.
+ May also define off_t to a 64-bit type on native Windows. */
+#include <sys/types.h>
+
+/* Solaris 10 and NetBSD 7.0 declare renameat in <unistd.h>, not in <stdio.h>. */
+/* But in any case avoid namespace pollution on glibc systems. */
+#if (@GNULIB_RENAMEAT@ || defined GNULIB_POSIXCHECK) && (defined __sun || defined __NetBSD__) \
+ && ! defined __GLIBC__
+# include <unistd.h>
+#endif
+
+/* Android 4.3 declares renameat in <sys/stat.h>, not in <stdio.h>. */
+/* But in any case avoid namespace pollution on glibc systems. */
+#if (@GNULIB_RENAMEAT@ || defined GNULIB_POSIXCHECK) && defined __ANDROID__ \
+ && ! defined __GLIBC__
+# include <sys/stat.h>
+#endif
+
+/* MSVC declares 'perror' in <stdlib.h>, not in <stdio.h>. We must include
+ it before we #define perror rpl_perror. */
+/* But in any case avoid namespace pollution on glibc systems. */
+#if (@GNULIB_PERROR@ || defined GNULIB_POSIXCHECK) \
+ && (defined _WIN32 && ! defined __CYGWIN__) \
+ && ! defined __GLIBC__
+# include <stdlib.h>
+#endif
+
+/* MSVC declares 'remove' in <io.h>, not in <stdio.h>. We must include
+ it before we #define remove rpl_remove. */
+/* MSVC declares 'rename' in <io.h>, not in <stdio.h>. We must include
+ it before we #define rename rpl_rename. */
+/* But in any case avoid namespace pollution on glibc systems. */
+#if (@GNULIB_REMOVE@ || @GNULIB_RENAME@ || defined GNULIB_POSIXCHECK) \
+ && (defined _WIN32 && ! defined __CYGWIN__) \
+ && ! defined __GLIBC__
+# include <io.h>
+#endif
+
+
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+ that can be freed by passing them as the Ith argument to the
+ function F. */
+#ifndef _GL_ATTRIBUTE_DEALLOC
+# if __GNUC__ >= 11
+# define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+# else
+# define _GL_ATTRIBUTE_DEALLOC(f, i)
+# endif
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The __-protected variants of the attributes 'format' and 'printf' are
+ accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+ We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
+ gnulib and libintl do '#define printf __printf__' when they override
+ the 'printf' function. */
+#ifndef _GL_ATTRIBUTE_FORMAT
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) || defined __clang__
+# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+# else
+# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
+# endif
+#endif
+
+/* An __attribute__ __format__ specifier for a function that takes a format
+ string and arguments, where the format string directives are the ones
+ standardized by ISO C99 and POSIX.
+ _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD */
+/* __gnu_printf__ is supported in GCC >= 4.4. */
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
+# define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __gnu_printf__
+#else
+# define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __printf__
+#endif
+
+/* An __attribute__ __format__ specifier for a function that takes a format
+ string and arguments, where the format string directives are the ones of the
+ system printf(), rather than the ones standardized by ISO C99 and POSIX.
+ _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM */
+/* On mingw, Gnulib sets __USE_MINGW_ANSI_STDIO in order to get closer to
+ the standards. The macro GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU indicates
+ whether this change is effective. On older mingw, it is not. */
+#if GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU
+# define _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD
+#else
+# define _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM __printf__
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD
+ indicates to GCC that the function takes a format string and arguments,
+ where the format string directives are the ones standardized by ISO C99
+ and POSIX. */
+#define _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD(formatstring_parameter, first_argument) \
+ _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, formatstring_parameter, first_argument))
+
+/* _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD,
+ except that it indicates to GCC that the supported format string directives
+ are the ones of the system printf(), rather than the ones standardized by
+ ISO C99 and POSIX. */
+#define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \
+ _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM, formatstring_parameter, first_argument))
+
+/* _GL_ATTRIBUTE_FORMAT_SCANF
+ indicates to GCC that the function takes a format string and arguments,
+ where the format string directives are the ones standardized by ISO C99
+ and POSIX. */
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
+# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
+ _GL_ATTRIBUTE_FORMAT ((__gnu_scanf__, formatstring_parameter, first_argument))
+#else
+# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
+ _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_SCANF,
+ except that it indicates to GCC that the supported format string directives
+ are the ones of the system scanf(), rather than the ones standardized by
+ ISO C99 and POSIX. */
+#define _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM(formatstring_parameter, first_argument) \
+ _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Macros for stringification. */
+#define _GL_STDIO_STRINGIZE(token) #token
+#define _GL_STDIO_MACROEXPAND_AND_STRINGIZE(token) _GL_STDIO_STRINGIZE(token)
+
+/* When also using extern inline, suppress the use of static inline in
+ standard headers of problematic Apple configurations, as Libc at
+ least through Libc-825.26 (2013-04-09) mishandles it; see, e.g.,
+ <https://lists.gnu.org/r/bug-gnulib/2012-12/msg00023.html>.
+ Perhaps Apple will fix this some day. */
+#if (defined _GL_EXTERN_INLINE_IN_USE && defined __APPLE__ \
+ && defined __GNUC__ && defined __STDC__)
+# undef putc_unlocked
+#endif
+
+#if @GNULIB_DPRINTF@
+# if @REPLACE_DPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define dprintf rpl_dprintf
+# endif
+_GL_FUNCDECL_RPL (dprintf, int, (int fd, const char *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (dprintf, int, (int fd, const char *restrict format, ...));
+# else
+# if !@HAVE_DPRINTF@
+_GL_FUNCDECL_SYS (dprintf, int, (int fd, const char *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (dprintf, int, (int fd, const char *restrict format, ...));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (dprintf);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef dprintf
+# if HAVE_RAW_DECL_DPRINTF
+_GL_WARN_ON_USE (dprintf, "dprintf is unportable - "
+ "use gnulib module dprintf for portability");
+# endif
+#endif
+
+#if @GNULIB_FCLOSE@
+/* Close STREAM and its underlying file descriptor. */
+# if @REPLACE_FCLOSE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define fclose rpl_fclose
+# endif
+_GL_FUNCDECL_RPL (fclose, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (fclose, int, (FILE *stream));
+# else
+_GL_CXXALIAS_SYS (fclose, int, (FILE *stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fclose);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fclose
+/* Assume fclose is always declared. */
+_GL_WARN_ON_USE (fclose, "fclose is not always POSIX compliant - "
+ "use gnulib module fclose for portable POSIX compliance");
+#endif
+
+#if @GNULIB_MDA_FCLOSEALL@
+/* On native Windows, map 'fcloseall' to '_fcloseall', so that -loldnames is
+ not required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::fcloseall on all platforms that have
+ it. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fcloseall
+# define fcloseall _fcloseall
+# endif
+_GL_CXXALIAS_MDA (fcloseall, int, (void));
+# else
+# if @HAVE_DECL_FCLOSEALL@
+# if defined __FreeBSD__ || defined __DragonFly__
+_GL_CXXALIAS_SYS (fcloseall, void, (void));
+# else
+_GL_CXXALIAS_SYS (fcloseall, int, (void));
+# endif
+# endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_DECL_FCLOSEALL@
+_GL_CXXALIASWARN (fcloseall);
+# endif
+#endif
+
+#if @GNULIB_FDOPEN@
+# if @REPLACE_FDOPEN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fdopen
+# define fdopen rpl_fdopen
+# endif
+_GL_FUNCDECL_RPL (fdopen, FILE *,
+ (int fd, const char *mode)
+ _GL_ARG_NONNULL ((2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+_GL_CXXALIAS_RPL (fdopen, FILE *, (int fd, const char *mode));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fdopen
+# define fdopen _fdopen
+# endif
+_GL_CXXALIAS_MDA (fdopen, FILE *, (int fd, const char *mode));
+# else
+# if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate fdopen with fclose or rpl_fclose. */
+_GL_FUNCDECL_SYS (fdopen, FILE *,
+ (int fd, const char *mode)
+ _GL_ARG_NONNULL ((2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+# endif
+_GL_CXXALIAS_SYS (fdopen, FILE *, (int fd, const char *mode));
+# endif
+_GL_CXXALIASWARN (fdopen);
+#else
+# if @GNULIB_FCLOSE@ && __GNUC__ >= 11 && !defined fdopen
+/* For -Wmismatched-dealloc: Associate fdopen with fclose or rpl_fclose. */
+_GL_FUNCDECL_SYS (fdopen, FILE *,
+ (int fd, const char *mode)
+ _GL_ARG_NONNULL ((2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+# undef fdopen
+/* Assume fdopen is always declared. */
+_GL_WARN_ON_USE (fdopen, "fdopen on native Windows platforms is not POSIX compliant - "
+ "use gnulib module fdopen for portability");
+# elif @GNULIB_MDA_FDOPEN@
+/* On native Windows, map 'fdopen' to '_fdopen', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::fdopen always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fdopen
+# define fdopen _fdopen
+# endif
+_GL_CXXALIAS_MDA (fdopen, FILE *, (int fd, const char *mode));
+# else
+_GL_CXXALIAS_SYS (fdopen, FILE *, (int fd, const char *mode));
+# endif
+_GL_CXXALIASWARN (fdopen);
+# endif
+#endif
+
+#if @GNULIB_FFLUSH@
+/* Flush all pending data on STREAM according to POSIX rules. Both
+ output and seekable input streams are supported.
+ Note! LOSS OF DATA can occur if fflush is applied on an input stream
+ that is _not_seekable_ or on an update stream that is _not_seekable_
+ and in which the most recent operation was input. Seekability can
+ be tested with lseek(fileno(fp),0,SEEK_CUR). */
+# if @REPLACE_FFLUSH@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define fflush rpl_fflush
+# endif
+_GL_FUNCDECL_RPL (fflush, int, (FILE *gl_stream));
+_GL_CXXALIAS_RPL (fflush, int, (FILE *gl_stream));
+# else
+_GL_CXXALIAS_SYS (fflush, int, (FILE *gl_stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fflush);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fflush
+/* Assume fflush is always declared. */
+_GL_WARN_ON_USE (fflush, "fflush is not always POSIX compliant - "
+ "use gnulib module fflush for portable POSIX compliance");
+#endif
+
+#if @GNULIB_FGETC@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fgetc
+# define fgetc rpl_fgetc
+# endif
+_GL_FUNCDECL_RPL (fgetc, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (fgetc, int, (FILE *stream));
+# else
+_GL_CXXALIAS_SYS (fgetc, int, (FILE *stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fgetc);
+# endif
+#endif
+
+#if @GNULIB_FGETS@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fgets
+# define fgets rpl_fgets
+# endif
+_GL_FUNCDECL_RPL (fgets, char *,
+ (char *restrict s, int n, FILE *restrict stream)
+ _GL_ARG_NONNULL ((1, 3)));
+_GL_CXXALIAS_RPL (fgets, char *,
+ (char *restrict s, int n, FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (fgets, char *,
+ (char *restrict s, int n, FILE *restrict stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fgets);
+# endif
+#endif
+
+#if @GNULIB_MDA_FILENO@
+/* On native Windows, map 'fileno' to '_fileno', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::fileno always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fileno
+# define fileno _fileno
+# endif
+_GL_CXXALIAS_MDA (fileno, int, (FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (fileno, int, (FILE *restrict stream));
+# endif
+_GL_CXXALIASWARN (fileno);
+#endif
+
+#if @GNULIB_FOPEN@
+# if (@GNULIB_FOPEN@ && @REPLACE_FOPEN@) \
+ || (@GNULIB_FOPEN_GNU@ && @REPLACE_FOPEN_FOR_FOPEN_GNU@)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fopen
+# define fopen rpl_fopen
+# endif
+_GL_FUNCDECL_RPL (fopen, FILE *,
+ (const char *restrict filename, const char *restrict mode)
+ _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+_GL_CXXALIAS_RPL (fopen, FILE *,
+ (const char *restrict filename, const char *restrict mode));
+# else
+# if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate fopen with fclose or rpl_fclose. */
+_GL_FUNCDECL_SYS (fopen, FILE *,
+ (const char *restrict filename, const char *restrict mode)
+ _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+# endif
+_GL_CXXALIAS_SYS (fopen, FILE *,
+ (const char *restrict filename, const char *restrict mode));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fopen);
+# endif
+#else
+# if @GNULIB_FCLOSE@ && __GNUC__ >= 11 && !defined fopen
+/* For -Wmismatched-dealloc: Associate fopen with fclose or rpl_fclose. */
+_GL_FUNCDECL_SYS (fopen, FILE *,
+ (const char *restrict filename, const char *restrict mode)
+ _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+# undef fopen
+/* Assume fopen is always declared. */
+_GL_WARN_ON_USE (fopen, "fopen on native Windows platforms is not POSIX compliant - "
+ "use gnulib module fopen for portability");
+# endif
+#endif
+
+#if @GNULIB_FPRINTF_POSIX@ || @GNULIB_FPRINTF@
+# if (@GNULIB_FPRINTF_POSIX@ && @REPLACE_FPRINTF@) \
+ || (@GNULIB_FPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define fprintf rpl_fprintf
+# endif
+# define GNULIB_overrides_fprintf 1
+# if @GNULIB_FPRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
+_GL_FUNCDECL_RPL (fprintf, int,
+ (FILE *restrict fp, const char *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+# else
+_GL_FUNCDECL_RPL (fprintf, int,
+ (FILE *restrict fp, const char *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_RPL (fprintf, int,
+ (FILE *restrict fp, const char *restrict format, ...));
+# else
+_GL_CXXALIAS_SYS (fprintf, int,
+ (FILE *restrict fp, const char *restrict format, ...));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fprintf);
+# endif
+#endif
+#if !@GNULIB_FPRINTF_POSIX@ && defined GNULIB_POSIXCHECK
+# if !GNULIB_overrides_fprintf
+# undef fprintf
+# endif
+/* Assume fprintf is always declared. */
+_GL_WARN_ON_USE (fprintf, "fprintf is not always POSIX compliant - "
+ "use gnulib module fprintf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#if @GNULIB_FPURGE@
+/* Discard all pending buffered I/O data on STREAM.
+ STREAM must not be wide-character oriented.
+ When discarding pending output, the file position is set back to where it
+ was before the write calls. When discarding pending input, the file
+ position is advanced to match the end of the previously read input.
+ Return 0 if successful. Upon error, return -1 and set errno. */
+# if @REPLACE_FPURGE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define fpurge rpl_fpurge
+# endif
+_GL_FUNCDECL_RPL (fpurge, int, (FILE *gl_stream) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (fpurge, int, (FILE *gl_stream));
+# else
+# if !@HAVE_DECL_FPURGE@
+_GL_FUNCDECL_SYS (fpurge, int, (FILE *gl_stream) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (fpurge, int, (FILE *gl_stream));
+# endif
+_GL_CXXALIASWARN (fpurge);
+#elif defined GNULIB_POSIXCHECK
+# undef fpurge
+# if HAVE_RAW_DECL_FPURGE
+_GL_WARN_ON_USE (fpurge, "fpurge is not always present - "
+ "use gnulib module fpurge for portability");
+# endif
+#endif
+
+#if @GNULIB_FPUTC@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fputc
+# define fputc rpl_fputc
+# endif
+_GL_FUNCDECL_RPL (fputc, int, (int c, FILE *stream) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (fputc, int, (int c, FILE *stream));
+# else
+_GL_CXXALIAS_SYS (fputc, int, (int c, FILE *stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fputc);
+# endif
+#endif
+
+#if @GNULIB_FPUTS@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fputs
+# define fputs rpl_fputs
+# endif
+_GL_FUNCDECL_RPL (fputs, int,
+ (const char *restrict string, FILE *restrict stream)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (fputs, int,
+ (const char *restrict string, FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (fputs, int,
+ (const char *restrict string, FILE *restrict stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fputs);
+# endif
+#endif
+
+#if @GNULIB_FREAD@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fread
+# define fread rpl_fread
+# endif
+_GL_FUNCDECL_RPL (fread, size_t,
+ (void *restrict ptr, size_t s, size_t n,
+ FILE *restrict stream)
+ _GL_ARG_NONNULL ((4)));
+_GL_CXXALIAS_RPL (fread, size_t,
+ (void *restrict ptr, size_t s, size_t n,
+ FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (fread, size_t,
+ (void *restrict ptr, size_t s, size_t n,
+ FILE *restrict stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fread);
+# endif
+#endif
+
+#if @GNULIB_FREOPEN@
+# if @REPLACE_FREOPEN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef freopen
+# define freopen rpl_freopen
+# endif
+_GL_FUNCDECL_RPL (freopen, FILE *,
+ (const char *restrict filename, const char *restrict mode,
+ FILE *restrict stream)
+ _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (freopen, FILE *,
+ (const char *restrict filename, const char *restrict mode,
+ FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (freopen, FILE *,
+ (const char *restrict filename, const char *restrict mode,
+ FILE *restrict stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (freopen);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef freopen
+/* Assume freopen is always declared. */
+_GL_WARN_ON_USE (freopen,
+ "freopen on native Windows platforms is not POSIX compliant - "
+ "use gnulib module freopen for portability");
+#endif
+
+#if @GNULIB_FSCANF@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fscanf
+# define fscanf rpl_fscanf
+# endif
+_GL_FUNCDECL_RPL (fscanf, int,
+ (FILE *restrict stream, const char *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (fscanf, int,
+ (FILE *restrict stream, const char *restrict format, ...));
+# else
+_GL_CXXALIAS_SYS (fscanf, int,
+ (FILE *restrict stream, const char *restrict format, ...));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fscanf);
+# endif
+#endif
+
+
+/* Set up the following warnings, based on which modules are in use.
+ GNU Coding Standards discourage the use of fseek, since it imposes
+ an arbitrary limitation on some 32-bit hosts. Remember that the
+ fseek module depends on the fseeko module, so we only have three
+ cases to consider:
+
+ 1. The developer is not using either module. Issue a warning under
+ GNULIB_POSIXCHECK for both functions, to remind them that both
+ functions have bugs on some systems. _GL_NO_LARGE_FILES has no
+ impact on this warning.
+
+ 2. The developer is using both modules. They may be unaware of the
+ arbitrary limitations of fseek, so issue a warning under
+ GNULIB_POSIXCHECK. On the other hand, they may be using both
+ modules intentionally, so the developer can define
+ _GL_NO_LARGE_FILES in the compilation units where the use of fseek
+ is safe, to silence the warning.
+
+ 3. The developer is using the fseeko module, but not fseek. Gnulib
+ guarantees that fseek will still work around platform bugs in that
+ case, but we presume that the developer is aware of the pitfalls of
+ fseek and was trying to avoid it, so issue a warning even when
+ GNULIB_POSIXCHECK is undefined. Again, _GL_NO_LARGE_FILES can be
+ defined to silence the warning in particular compilation units.
+ In C++ compilations with GNULIB_NAMESPACE, in order to avoid that
+ fseek gets defined as a macro, it is recommended that the developer
+ uses the fseek module, even if he is not calling the fseek function.
+
+ Most gnulib clients that perform stream operations should fall into
+ category 3. */
+
+#if @GNULIB_FSEEK@
+# if defined GNULIB_POSIXCHECK && !defined _GL_NO_LARGE_FILES
+# define _GL_FSEEK_WARN /* Category 2, above. */
+# undef fseek
+# endif
+# if @REPLACE_FSEEK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fseek
+# define fseek rpl_fseek
+# endif
+_GL_FUNCDECL_RPL (fseek, int, (FILE *fp, long offset, int whence)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (fseek, int, (FILE *fp, long offset, int whence));
+# else
+_GL_CXXALIAS_SYS (fseek, int, (FILE *fp, long offset, int whence));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fseek);
+# endif
+#endif
+
+#if @GNULIB_FSEEKO@
+# if !@GNULIB_FSEEK@ && !defined _GL_NO_LARGE_FILES
+# define _GL_FSEEK_WARN /* Category 3, above. */
+# undef fseek
+# endif
+# if @REPLACE_FSEEKO@
+/* Provide an fseeko function that is aware of a preceding fflush(), and which
+ detects pipes. */
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fseeko
+# define fseeko rpl_fseeko
+# endif
+_GL_FUNCDECL_RPL (fseeko, int, (FILE *fp, off_t offset, int whence)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (fseeko, int, (FILE *fp, off_t offset, int whence));
+# else
+# if ! @HAVE_DECL_FSEEKO@
+_GL_FUNCDECL_SYS (fseeko, int, (FILE *fp, off_t offset, int whence)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (fseeko, int, (FILE *fp, off_t offset, int whence));
+# endif
+_GL_CXXALIASWARN (fseeko);
+#elif defined GNULIB_POSIXCHECK
+# define _GL_FSEEK_WARN /* Category 1, above. */
+# undef fseek
+# undef fseeko
+# if HAVE_RAW_DECL_FSEEKO
+_GL_WARN_ON_USE (fseeko, "fseeko is unportable - "
+ "use gnulib module fseeko for portability");
+# endif
+#endif
+
+#ifdef _GL_FSEEK_WARN
+# undef _GL_FSEEK_WARN
+/* Here, either fseek is undefined (but C89 guarantees that it is
+ declared), or it is defined as rpl_fseek (declared above). */
+_GL_WARN_ON_USE (fseek, "fseek cannot handle files larger than 4 GB "
+ "on 32-bit platforms - "
+ "use fseeko function for handling of large files");
+#endif
+
+
+/* ftell, ftello. See the comments on fseek/fseeko. */
+
+#if @GNULIB_FTELL@
+# if defined GNULIB_POSIXCHECK && !defined _GL_NO_LARGE_FILES
+# define _GL_FTELL_WARN /* Category 2, above. */
+# undef ftell
+# endif
+# if @REPLACE_FTELL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ftell
+# define ftell rpl_ftell
+# endif
+_GL_FUNCDECL_RPL (ftell, long, (FILE *fp) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (ftell, long, (FILE *fp));
+# else
+_GL_CXXALIAS_SYS (ftell, long, (FILE *fp));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (ftell);
+# endif
+#endif
+
+#if @GNULIB_FTELLO@
+# if !@GNULIB_FTELL@ && !defined _GL_NO_LARGE_FILES
+# define _GL_FTELL_WARN /* Category 3, above. */
+# undef ftell
+# endif
+# if @REPLACE_FTELLO@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ftello
+# define ftello rpl_ftello
+# endif
+_GL_FUNCDECL_RPL (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (ftello, off_t, (FILE *fp));
+# else
+# if ! @HAVE_DECL_FTELLO@
+_GL_FUNCDECL_SYS (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (ftello, off_t, (FILE *fp));
+# endif
+_GL_CXXALIASWARN (ftello);
+#elif defined GNULIB_POSIXCHECK
+# define _GL_FTELL_WARN /* Category 1, above. */
+# undef ftell
+# undef ftello
+# if HAVE_RAW_DECL_FTELLO
+_GL_WARN_ON_USE (ftello, "ftello is unportable - "
+ "use gnulib module ftello for portability");
+# endif
+#endif
+
+#ifdef _GL_FTELL_WARN
+# undef _GL_FTELL_WARN
+/* Here, either ftell is undefined (but C89 guarantees that it is
+ declared), or it is defined as rpl_ftell (declared above). */
+_GL_WARN_ON_USE (ftell, "ftell cannot handle files larger than 4 GB "
+ "on 32-bit platforms - "
+ "use ftello function for handling of large files");
+#endif
+
+
+#if @GNULIB_FWRITE@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fwrite
+# define fwrite rpl_fwrite
+# endif
+_GL_FUNCDECL_RPL (fwrite, size_t,
+ (const void *restrict ptr, size_t s, size_t n,
+ FILE *restrict stream)
+ _GL_ARG_NONNULL ((1, 4)));
+_GL_CXXALIAS_RPL (fwrite, size_t,
+ (const void *restrict ptr, size_t s, size_t n,
+ FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (fwrite, size_t,
+ (const void *restrict ptr, size_t s, size_t n,
+ FILE *restrict stream));
+
+/* Work around bug 11959 when fortifying glibc 2.4 through 2.15
+ <https://sourceware.org/bugzilla/show_bug.cgi?id=11959>,
+ which sometimes causes an unwanted diagnostic for fwrite calls.
+ This affects only function declaration attributes under certain
+ versions of gcc and clang, and is not needed for C++. */
+# if (0 < __USE_FORTIFY_LEVEL \
+ && __GLIBC__ == 2 && 4 <= __GLIBC_MINOR__ && __GLIBC_MINOR__ <= 15 \
+ && 3 < __GNUC__ + (4 <= __GNUC_MINOR__) \
+ && !defined __cplusplus)
+# undef fwrite
+# undef fwrite_unlocked
+extern size_t __REDIRECT (rpl_fwrite,
+ (const void *__restrict, size_t, size_t,
+ FILE *__restrict),
+ fwrite);
+extern size_t __REDIRECT (rpl_fwrite_unlocked,
+ (const void *__restrict, size_t, size_t,
+ FILE *__restrict),
+ fwrite_unlocked);
+# define fwrite rpl_fwrite
+# define fwrite_unlocked rpl_fwrite_unlocked
+# endif
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fwrite);
+# endif
+#endif
+
+#if @GNULIB_GETC@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getc
+# define getc rpl_fgetc
+# endif
+_GL_FUNCDECL_RPL (fgetc, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL_1 (getc, rpl_fgetc, int, (FILE *stream));
+# else
+_GL_CXXALIAS_SYS (getc, int, (FILE *stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (getc);
+# endif
+#endif
+
+#if @GNULIB_GETCHAR@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getchar
+# define getchar rpl_getchar
+# endif
+_GL_FUNCDECL_RPL (getchar, int, (void));
+_GL_CXXALIAS_RPL (getchar, int, (void));
+# else
+_GL_CXXALIAS_SYS (getchar, int, (void));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (getchar);
+# endif
+#endif
+
+#if @GNULIB_GETDELIM@
+/* Read input, up to (and including) the next occurrence of DELIMITER, from
+ STREAM, store it in *LINEPTR (and NUL-terminate it).
+ *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE
+ bytes of space. It is realloc'd as necessary.
+ Return the number of bytes read and stored at *LINEPTR (not including the
+ NUL terminator), or -1 on error or EOF. */
+# if @REPLACE_GETDELIM@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getdelim
+# define getdelim rpl_getdelim
+# endif
+_GL_FUNCDECL_RPL (getdelim, ssize_t,
+ (char **restrict lineptr, size_t *restrict linesize,
+ int delimiter,
+ FILE *restrict stream)
+ _GL_ARG_NONNULL ((1, 2, 4)));
+_GL_CXXALIAS_RPL (getdelim, ssize_t,
+ (char **restrict lineptr, size_t *restrict linesize,
+ int delimiter,
+ FILE *restrict stream));
+# else
+# if !@HAVE_DECL_GETDELIM@
+_GL_FUNCDECL_SYS (getdelim, ssize_t,
+ (char **restrict lineptr, size_t *restrict linesize,
+ int delimiter,
+ FILE *restrict stream)
+ _GL_ARG_NONNULL ((1, 2, 4)));
+# endif
+_GL_CXXALIAS_SYS (getdelim, ssize_t,
+ (char **restrict lineptr, size_t *restrict linesize,
+ int delimiter,
+ FILE *restrict stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (getdelim);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getdelim
+# if HAVE_RAW_DECL_GETDELIM
+_GL_WARN_ON_USE (getdelim, "getdelim is unportable - "
+ "use gnulib module getdelim for portability");
+# endif
+#endif
+
+#if @GNULIB_GETLINE@
+/* Read a line, up to (and including) the next newline, from STREAM, store it
+ in *LINEPTR (and NUL-terminate it).
+ *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE
+ bytes of space. It is realloc'd as necessary.
+ Return the number of bytes read and stored at *LINEPTR (not including the
+ NUL terminator), or -1 on error or EOF. */
+# if @REPLACE_GETLINE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getline
+# define getline rpl_getline
+# endif
+_GL_FUNCDECL_RPL (getline, ssize_t,
+ (char **restrict lineptr, size_t *restrict linesize,
+ FILE *restrict stream)
+ _GL_ARG_NONNULL ((1, 2, 3)));
+_GL_CXXALIAS_RPL (getline, ssize_t,
+ (char **restrict lineptr, size_t *restrict linesize,
+ FILE *restrict stream));
+# else
+# if !@HAVE_DECL_GETLINE@
+_GL_FUNCDECL_SYS (getline, ssize_t,
+ (char **restrict lineptr, size_t *restrict linesize,
+ FILE *restrict stream)
+ _GL_ARG_NONNULL ((1, 2, 3)));
+# endif
+_GL_CXXALIAS_SYS (getline, ssize_t,
+ (char **restrict lineptr, size_t *restrict linesize,
+ FILE *restrict stream));
+# endif
+# if __GLIBC__ >= 2 && @HAVE_DECL_GETLINE@
+_GL_CXXALIASWARN (getline);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getline
+# if HAVE_RAW_DECL_GETLINE
+_GL_WARN_ON_USE (getline, "getline is unportable - "
+ "use gnulib module getline for portability");
+# endif
+#endif
+
+/* It is very rare that the developer ever has full control of stdin,
+ so any use of gets warrants an unconditional warning; besides, C11
+ removed it. */
+#undef gets
+#if HAVE_RAW_DECL_GETS && !defined __cplusplus
+_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
+#endif
+
+#if @GNULIB_MDA_GETW@
+/* On native Windows, map 'getw' to '_getw', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::getw always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getw
+# define getw _getw
+# endif
+_GL_CXXALIAS_MDA (getw, int, (FILE *restrict stream));
+# else
+# if @HAVE_DECL_GETW@
+_GL_CXXALIAS_SYS (getw, int, (FILE *restrict stream));
+# endif
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (getw);
+# endif
+#endif
+
+#if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@
+struct obstack;
+/* Grow an obstack with formatted output. Return the number of
+ bytes added to OBS. No trailing nul byte is added, and the
+ object should be closed with obstack_finish before use. Upon
+ memory allocation error, call obstack_alloc_failed_handler. Upon
+ other error, return -1. */
+# if @REPLACE_OBSTACK_PRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define obstack_printf rpl_obstack_printf
+# endif
+_GL_FUNCDECL_RPL (obstack_printf, int,
+ (struct obstack *obs, const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (obstack_printf, int,
+ (struct obstack *obs, const char *format, ...));
+# else
+# if !@HAVE_DECL_OBSTACK_PRINTF@
+_GL_FUNCDECL_SYS (obstack_printf, int,
+ (struct obstack *obs, const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (obstack_printf, int,
+ (struct obstack *obs, const char *format, ...));
+# endif
+_GL_CXXALIASWARN (obstack_printf);
+# if @REPLACE_OBSTACK_PRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define obstack_vprintf rpl_obstack_vprintf
+# endif
+_GL_FUNCDECL_RPL (obstack_vprintf, int,
+ (struct obstack *obs, const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (obstack_vprintf, int,
+ (struct obstack *obs, const char *format, va_list args));
+# else
+# if !@HAVE_DECL_OBSTACK_PRINTF@
+_GL_FUNCDECL_SYS (obstack_vprintf, int,
+ (struct obstack *obs, const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (obstack_vprintf, int,
+ (struct obstack *obs, const char *format, va_list args));
+# endif
+_GL_CXXALIASWARN (obstack_vprintf);
+#endif
+
+#if @GNULIB_PCLOSE@
+# if !@HAVE_PCLOSE@
+_GL_FUNCDECL_SYS (pclose, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (pclose, int, (FILE *stream));
+_GL_CXXALIASWARN (pclose);
+#elif defined GNULIB_POSIXCHECK
+# undef pclose
+# if HAVE_RAW_DECL_PCLOSE
+_GL_WARN_ON_USE (pclose, "pclose is unportable - "
+ "use gnulib module pclose for more portability");
+# endif
+#endif
+
+#if @GNULIB_PERROR@
+/* Print a message to standard error, describing the value of ERRNO,
+ (if STRING is not NULL and not empty) prefixed with STRING and ": ",
+ and terminated with a newline. */
+# if @REPLACE_PERROR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define perror rpl_perror
+# endif
+_GL_FUNCDECL_RPL (perror, void, (const char *string));
+_GL_CXXALIAS_RPL (perror, void, (const char *string));
+# else
+_GL_CXXALIAS_SYS (perror, void, (const char *string));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (perror);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef perror
+/* Assume perror is always declared. */
+_GL_WARN_ON_USE (perror, "perror is not always POSIX compliant - "
+ "use gnulib module perror for portability");
+#endif
+
+#if @GNULIB_POPEN@
+# if @REPLACE_POPEN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef popen
+# define popen rpl_popen
+# endif
+_GL_FUNCDECL_RPL (popen, FILE *,
+ (const char *cmd, const char *mode)
+ _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1));
+_GL_CXXALIAS_RPL (popen, FILE *, (const char *cmd, const char *mode));
+# else
+# if !@HAVE_POPEN@ || __GNUC__ >= 11
+_GL_FUNCDECL_SYS (popen, FILE *,
+ (const char *cmd, const char *mode)
+ _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1));
+# endif
+_GL_CXXALIAS_SYS (popen, FILE *, (const char *cmd, const char *mode));
+# endif
+_GL_CXXALIASWARN (popen);
+#else
+# if @GNULIB_PCLOSE@ && __GNUC__ >= 11 && !defined popen
+/* For -Wmismatched-dealloc: Associate popen with pclose or rpl_pclose. */
+_GL_FUNCDECL_SYS (popen, FILE *,
+ (const char *cmd, const char *mode)
+ _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+# undef popen
+# if HAVE_RAW_DECL_POPEN
+_GL_WARN_ON_USE (popen, "popen is buggy on some platforms - "
+ "use gnulib module popen or pipe for more portability");
+# endif
+# endif
+#endif
+
+#if @GNULIB_PRINTF_POSIX@ || @GNULIB_PRINTF@
+# if (@GNULIB_PRINTF_POSIX@ && @REPLACE_PRINTF@) \
+ || (@GNULIB_PRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
+# if defined __GNUC__ || defined __clang__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+/* Don't break __attribute__((format(printf,M,N))). */
+# define printf __printf__
+# endif
+# if @GNULIB_PRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
+_GL_FUNCDECL_RPL_1 (__printf__, int,
+ (const char *restrict format, ...)
+ __asm__ (@ASM_SYMBOL_PREFIX@
+ _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf))
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 2)
+ _GL_ARG_NONNULL ((1)));
+# else
+_GL_FUNCDECL_RPL_1 (__printf__, int,
+ (const char *restrict format, ...)
+ __asm__ (@ASM_SYMBOL_PREFIX@
+ _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf))
+ _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 2)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_RPL_1 (printf, __printf__, int, (const char *format, ...));
+# else
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define printf rpl_printf
+# endif
+_GL_FUNCDECL_RPL (printf, int,
+ (const char *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 2)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (printf, int, (const char *restrict format, ...));
+# endif
+# define GNULIB_overrides_printf 1
+# else
+_GL_CXXALIAS_SYS (printf, int, (const char *restrict format, ...));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (printf);
+# endif
+#endif
+#if !@GNULIB_PRINTF_POSIX@ && defined GNULIB_POSIXCHECK
+# if !GNULIB_overrides_printf
+# undef printf
+# endif
+/* Assume printf is always declared. */
+_GL_WARN_ON_USE (printf, "printf is not always POSIX compliant - "
+ "use gnulib module printf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#if @GNULIB_PUTC@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef putc
+# define putc rpl_fputc
+# endif
+_GL_FUNCDECL_RPL (fputc, int, (int c, FILE *stream) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL_1 (putc, rpl_fputc, int, (int c, FILE *stream));
+# else
+_GL_CXXALIAS_SYS (putc, int, (int c, FILE *stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (putc);
+# endif
+#endif
+
+#if @GNULIB_PUTCHAR@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef putchar
+# define putchar rpl_putchar
+# endif
+_GL_FUNCDECL_RPL (putchar, int, (int c));
+_GL_CXXALIAS_RPL (putchar, int, (int c));
+# else
+_GL_CXXALIAS_SYS (putchar, int, (int c));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (putchar);
+# endif
+#endif
+
+#if @GNULIB_PUTS@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef puts
+# define puts rpl_puts
+# endif
+_GL_FUNCDECL_RPL (puts, int, (const char *string) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (puts, int, (const char *string));
+# else
+_GL_CXXALIAS_SYS (puts, int, (const char *string));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (puts);
+# endif
+#endif
+
+#if @GNULIB_MDA_PUTW@
+/* On native Windows, map 'putw' to '_putw', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::putw always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef putw
+# define putw _putw
+# endif
+_GL_CXXALIAS_MDA (putw, int, (int w, FILE *restrict stream));
+# else
+# if @HAVE_DECL_PUTW@
+_GL_CXXALIAS_SYS (putw, int, (int w, FILE *restrict stream));
+# endif
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (putw);
+# endif
+#endif
+
+#if @GNULIB_REMOVE@
+# if @REPLACE_REMOVE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef remove
+# define remove rpl_remove
+# endif
+_GL_FUNCDECL_RPL (remove, int, (const char *name) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (remove, int, (const char *name));
+# else
+_GL_CXXALIAS_SYS (remove, int, (const char *name));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (remove);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef remove
+/* Assume remove is always declared. */
+_GL_WARN_ON_USE (remove, "remove cannot handle directories on some platforms - "
+ "use gnulib module remove for more portability");
+#endif
+
+#if @GNULIB_RENAME@
+# if @REPLACE_RENAME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef rename
+# define rename rpl_rename
+# endif
+_GL_FUNCDECL_RPL (rename, int,
+ (const char *old_filename, const char *new_filename)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (rename, int,
+ (const char *old_filename, const char *new_filename));
+# else
+_GL_CXXALIAS_SYS (rename, int,
+ (const char *old_filename, const char *new_filename));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (rename);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef rename
+/* Assume rename is always declared. */
+_GL_WARN_ON_USE (rename, "rename is buggy on some platforms - "
+ "use gnulib module rename for more portability");
+#endif
+
+#if @GNULIB_RENAMEAT@
+# if @REPLACE_RENAMEAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef renameat
+# define renameat rpl_renameat
+# endif
+_GL_FUNCDECL_RPL (renameat, int,
+ (int fd1, char const *file1, int fd2, char const *file2)
+ _GL_ARG_NONNULL ((2, 4)));
+_GL_CXXALIAS_RPL (renameat, int,
+ (int fd1, char const *file1, int fd2, char const *file2));
+# else
+# if !@HAVE_RENAMEAT@
+_GL_FUNCDECL_SYS (renameat, int,
+ (int fd1, char const *file1, int fd2, char const *file2)
+ _GL_ARG_NONNULL ((2, 4)));
+# endif
+_GL_CXXALIAS_SYS (renameat, int,
+ (int fd1, char const *file1, int fd2, char const *file2));
+# endif
+_GL_CXXALIASWARN (renameat);
+#elif defined GNULIB_POSIXCHECK
+# undef renameat
+# if HAVE_RAW_DECL_RENAMEAT
+_GL_WARN_ON_USE (renameat, "renameat is not portable - "
+ "use gnulib module renameat for portability");
+# endif
+#endif
+
+#if @GNULIB_SCANF@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if defined __GNUC__ || defined __clang__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef scanf
+/* Don't break __attribute__((format(scanf,M,N))). */
+# define scanf __scanf__
+# endif
+_GL_FUNCDECL_RPL_1 (__scanf__, int,
+ (const char *restrict format, ...)
+ __asm__ (@ASM_SYMBOL_PREFIX@
+ _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_scanf))
+ _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL_1 (scanf, __scanf__, int, (const char *restrict format, ...));
+# else
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef scanf
+# define scanf rpl_scanf
+# endif
+_GL_FUNCDECL_RPL (scanf, int, (const char *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (scanf, int, (const char *restrict format, ...));
+# endif
+# else
+_GL_CXXALIAS_SYS (scanf, int, (const char *restrict format, ...));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (scanf);
+# endif
+#endif
+
+#if @GNULIB_SNPRINTF@
+# if @REPLACE_SNPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define snprintf rpl_snprintf
+# endif
+# define GNULIB_overrides_snprintf 1
+_GL_FUNCDECL_RPL (snprintf, int,
+ (char *restrict str, size_t size,
+ const char *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 4)
+ _GL_ARG_NONNULL ((3)));
+_GL_CXXALIAS_RPL (snprintf, int,
+ (char *restrict str, size_t size,
+ const char *restrict format, ...));
+# else
+# if !@HAVE_DECL_SNPRINTF@
+_GL_FUNCDECL_SYS (snprintf, int,
+ (char *restrict str, size_t size,
+ const char *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 4)
+ _GL_ARG_NONNULL ((3)));
+# endif
+_GL_CXXALIAS_SYS (snprintf, int,
+ (char *restrict str, size_t size,
+ const char *restrict format, ...));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (snprintf);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef snprintf
+# if HAVE_RAW_DECL_SNPRINTF
+_GL_WARN_ON_USE (snprintf, "snprintf is unportable - "
+ "use gnulib module snprintf for portability");
+# endif
+#endif
+
+/* Some people would argue that all sprintf uses should be warned about
+ (for example, OpenBSD issues a link warning for it),
+ since it can cause security holes due to buffer overruns.
+ However, we believe that sprintf can be used safely, and is more
+ efficient than snprintf in those safe cases; and as proof of our
+ belief, we use sprintf in several gnulib modules. So this header
+ intentionally avoids adding a warning to sprintf except when
+ GNULIB_POSIXCHECK is defined. */
+
+#if @GNULIB_SPRINTF_POSIX@
+# if @REPLACE_SPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define sprintf rpl_sprintf
+# endif
+# define GNULIB_overrides_sprintf 1
+_GL_FUNCDECL_RPL (sprintf, int,
+ (char *restrict str, const char *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (sprintf, int,
+ (char *restrict str, const char *restrict format, ...));
+# else
+_GL_CXXALIAS_SYS (sprintf, int,
+ (char *restrict str, const char *restrict format, ...));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (sprintf);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef sprintf
+/* Assume sprintf is always declared. */
+_GL_WARN_ON_USE (sprintf, "sprintf is not always POSIX compliant - "
+ "use gnulib module sprintf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#if @GNULIB_MDA_TEMPNAM@
+/* On native Windows, map 'tempnam' to '_tempnam', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::tempnam always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef tempnam
+# define tempnam _tempnam
+# endif
+_GL_CXXALIAS_MDA (tempnam, char *, (const char *dir, const char *prefix));
+# else
+_GL_CXXALIAS_SYS (tempnam, char *, (const char *dir, const char *prefix));
+# endif
+_GL_CXXALIASWARN (tempnam);
+#endif
+
+#if @GNULIB_TMPFILE@
+# if @REPLACE_TMPFILE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define tmpfile rpl_tmpfile
+# endif
+_GL_FUNCDECL_RPL (tmpfile, FILE *, (void)
+ _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+_GL_CXXALIAS_RPL (tmpfile, FILE *, (void));
+# else
+# if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate tmpfile with fclose or rpl_fclose. */
+_GL_FUNCDECL_SYS (tmpfile, FILE *, (void)
+ _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+# endif
+_GL_CXXALIAS_SYS (tmpfile, FILE *, (void));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (tmpfile);
+# endif
+#else
+# if @GNULIB_FCLOSE@ && __GNUC__ >= 11 && !defined tmpfile
+/* For -Wmismatched-dealloc: Associate tmpfile with fclose or rpl_fclose. */
+_GL_FUNCDECL_SYS (tmpfile, FILE *, (void)
+ _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+# undef tmpfile
+# if HAVE_RAW_DECL_TMPFILE
+_GL_WARN_ON_USE (tmpfile, "tmpfile is not usable on mingw - "
+ "use gnulib module tmpfile for portability");
+# endif
+# endif
+#endif
+
+#if @GNULIB_VASPRINTF@
+/* Write formatted output to a string dynamically allocated with malloc().
+ If the memory allocation succeeds, store the address of the string in
+ *RESULT and return the number of resulting bytes, excluding the trailing
+ NUL. Upon memory allocation error, or some other error, return -1. */
+# if @REPLACE_VASPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define asprintf rpl_asprintf
+# endif
+# define GNULIB_overrides_asprintf
+_GL_FUNCDECL_RPL (asprintf, int,
+ (char **result, const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (asprintf, int,
+ (char **result, const char *format, ...));
+# else
+# if !@HAVE_VASPRINTF@
+_GL_FUNCDECL_SYS (asprintf, int,
+ (char **result, const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (asprintf, int,
+ (char **result, const char *format, ...));
+# endif
+_GL_CXXALIASWARN (asprintf);
+# if @REPLACE_VASPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define vasprintf rpl_vasprintf
+# endif
+# define GNULIB_overrides_vasprintf 1
+_GL_FUNCDECL_RPL (vasprintf, int,
+ (char **result, const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (vasprintf, int,
+ (char **result, const char *format, va_list args));
+# else
+# if !@HAVE_VASPRINTF@
+_GL_FUNCDECL_SYS (vasprintf, int,
+ (char **result, const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (vasprintf, int,
+ (char **result, const char *format, va_list args));
+# endif
+_GL_CXXALIASWARN (vasprintf);
+#endif
+
+#if @GNULIB_VDPRINTF@
+# if @REPLACE_VDPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define vdprintf rpl_vdprintf
+# endif
+_GL_FUNCDECL_RPL (vdprintf, int,
+ (int fd, const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (vdprintf, int,
+ (int fd, const char *restrict format, va_list args));
+# else
+# if !@HAVE_VDPRINTF@
+_GL_FUNCDECL_SYS (vdprintf, int,
+ (int fd, const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+ _GL_ARG_NONNULL ((2)));
+# endif
+/* Need to cast, because on Solaris, the third parameter will likely be
+ __va_list args. */
+_GL_CXXALIAS_SYS_CAST (vdprintf, int,
+ (int fd, const char *restrict format, va_list args));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (vdprintf);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef vdprintf
+# if HAVE_RAW_DECL_VDPRINTF
+_GL_WARN_ON_USE (vdprintf, "vdprintf is unportable - "
+ "use gnulib module vdprintf for portability");
+# endif
+#endif
+
+#if @GNULIB_VFPRINTF_POSIX@ || @GNULIB_VFPRINTF@
+# if (@GNULIB_VFPRINTF_POSIX@ && @REPLACE_VFPRINTF@) \
+ || (@GNULIB_VFPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define vfprintf rpl_vfprintf
+# endif
+# define GNULIB_overrides_vfprintf 1
+# if @GNULIB_VFPRINTF_POSIX@
+_GL_FUNCDECL_RPL (vfprintf, int,
+ (FILE *restrict fp,
+ const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+# else
+_GL_FUNCDECL_RPL (vfprintf, int,
+ (FILE *restrict fp,
+ const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_RPL (vfprintf, int,
+ (FILE *restrict fp,
+ const char *restrict format, va_list args));
+# else
+/* Need to cast, because on Solaris, the third parameter is
+ __va_list args
+ and GCC's fixincludes did not change this to __gnuc_va_list. */
+_GL_CXXALIAS_SYS_CAST (vfprintf, int,
+ (FILE *restrict fp,
+ const char *restrict format, va_list args));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (vfprintf);
+# endif
+#endif
+#if !@GNULIB_VFPRINTF_POSIX@ && defined GNULIB_POSIXCHECK
+# if !GNULIB_overrides_vfprintf
+# undef vfprintf
+# endif
+/* Assume vfprintf is always declared. */
+_GL_WARN_ON_USE (vfprintf, "vfprintf is not always POSIX compliant - "
+ "use gnulib module vfprintf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#if @GNULIB_VFSCANF@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef vfscanf
+# define vfscanf rpl_vfscanf
+# endif
+_GL_FUNCDECL_RPL (vfscanf, int,
+ (FILE *restrict stream,
+ const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (vfscanf, int,
+ (FILE *restrict stream,
+ const char *restrict format, va_list args));
+# else
+_GL_CXXALIAS_SYS (vfscanf, int,
+ (FILE *restrict stream,
+ const char *restrict format, va_list args));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (vfscanf);
+# endif
+#endif
+
+#if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VPRINTF@
+# if (@GNULIB_VPRINTF_POSIX@ && @REPLACE_VPRINTF@) \
+ || (@GNULIB_VPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define vprintf rpl_vprintf
+# endif
+# define GNULIB_overrides_vprintf 1
+# if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
+_GL_FUNCDECL_RPL (vprintf, int, (const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 0)
+ _GL_ARG_NONNULL ((1)));
+# else
+_GL_FUNCDECL_RPL (vprintf, int, (const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 0)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_RPL (vprintf, int, (const char *restrict format, va_list args));
+# else
+/* Need to cast, because on Solaris, the second parameter is
+ __va_list args
+ and GCC's fixincludes did not change this to __gnuc_va_list. */
+_GL_CXXALIAS_SYS_CAST (vprintf, int,
+ (const char *restrict format, va_list args));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (vprintf);
+# endif
+#endif
+#if !@GNULIB_VPRINTF_POSIX@ && defined GNULIB_POSIXCHECK
+# if !GNULIB_overrides_vprintf
+# undef vprintf
+# endif
+/* Assume vprintf is always declared. */
+_GL_WARN_ON_USE (vprintf, "vprintf is not always POSIX compliant - "
+ "use gnulib module vprintf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#if @GNULIB_VSCANF@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef vscanf
+# define vscanf rpl_vscanf
+# endif
+_GL_FUNCDECL_RPL (vscanf, int, (const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 0)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (vscanf, int, (const char *restrict format, va_list args));
+# else
+_GL_CXXALIAS_SYS (vscanf, int, (const char *restrict format, va_list args));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (vscanf);
+# endif
+#endif
+
+#if @GNULIB_VSNPRINTF@
+# if @REPLACE_VSNPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define vsnprintf rpl_vsnprintf
+# endif
+# define GNULIB_overrides_vsnprintf 1
+_GL_FUNCDECL_RPL (vsnprintf, int,
+ (char *restrict str, size_t size,
+ const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 0)
+ _GL_ARG_NONNULL ((3)));
+_GL_CXXALIAS_RPL (vsnprintf, int,
+ (char *restrict str, size_t size,
+ const char *restrict format, va_list args));
+# else
+# if !@HAVE_DECL_VSNPRINTF@
+_GL_FUNCDECL_SYS (vsnprintf, int,
+ (char *restrict str, size_t size,
+ const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 0)
+ _GL_ARG_NONNULL ((3)));
+# endif
+_GL_CXXALIAS_SYS (vsnprintf, int,
+ (char *restrict str, size_t size,
+ const char *restrict format, va_list args));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (vsnprintf);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef vsnprintf
+# if HAVE_RAW_DECL_VSNPRINTF
+_GL_WARN_ON_USE (vsnprintf, "vsnprintf is unportable - "
+ "use gnulib module vsnprintf for portability");
+# endif
+#endif
+
+#if @GNULIB_VSPRINTF_POSIX@
+# if @REPLACE_VSPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define vsprintf rpl_vsprintf
+# endif
+# define GNULIB_overrides_vsprintf 1
+_GL_FUNCDECL_RPL (vsprintf, int,
+ (char *restrict str,
+ const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (vsprintf, int,
+ (char *restrict str,
+ const char *restrict format, va_list args));
+# else
+/* Need to cast, because on Solaris, the third parameter is
+ __va_list args
+ and GCC's fixincludes did not change this to __gnuc_va_list. */
+_GL_CXXALIAS_SYS_CAST (vsprintf, int,
+ (char *restrict str,
+ const char *restrict format, va_list args));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (vsprintf);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef vsprintf
+/* Assume vsprintf is always declared. */
+_GL_WARN_ON_USE (vsprintf, "vsprintf is not always POSIX compliant - "
+ "use gnulib module vsprintf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#endif /* _@GUARD_PREFIX@_STDIO_H */
+#endif /* _@GUARD_PREFIX@_STDIO_H */
+#endif
diff --git a/lib/stdlib.in.h b/lib/stdlib.in.h
new file mode 100644
index 0000000..a91f4e2
--- /dev/null
+++ b/lib/stdlib.in.h
@@ -0,0 +1,1678 @@
+/* A GNU-like <stdlib.h>.
+
+ Copyright (C) 1995, 2001-2004, 2006-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_system_stdlib_h || defined __need_malloc_and_calloc
+/* Special invocation conventions inside some gnulib header files,
+ and inside some glibc header files, respectively. */
+
+#@INCLUDE_NEXT@ @NEXT_STDLIB_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_STDLIB_H
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_STDLIB_H@
+
+#ifndef _@GUARD_PREFIX@_STDLIB_H
+#define _@GUARD_PREFIX@_STDLIB_H
+
+/* NetBSD 5.0 mis-defines NULL. */
+#include <stddef.h>
+
+/* MirBSD 10 defines WEXITSTATUS in <sys/wait.h>, not in <stdlib.h>. */
+#if @GNULIB_SYSTEM_POSIX@ && !defined WEXITSTATUS
+# include <sys/wait.h>
+#endif
+
+/* Solaris declares getloadavg() in <sys/loadavg.h>. */
+#if (@GNULIB_GETLOADAVG@ || defined GNULIB_POSIXCHECK) && @HAVE_SYS_LOADAVG_H@
+/* OpenIndiana has a bug: <sys/time.h> must be included before
+ <sys/loadavg.h>. */
+# include <sys/time.h>
+# include <sys/loadavg.h>
+#endif
+
+/* Native Windows platforms declare _mktemp() in <io.h>. */
+#if defined _WIN32 && !defined __CYGWIN__
+# include <io.h>
+#endif
+
+#if @GNULIB_RANDOM_R@
+
+/* OSF/1 5.1 declares 'struct random_data' in <random.h>, which is included
+ from <stdlib.h> if _REENTRANT is defined. Include it whenever we need
+ 'struct random_data'. */
+# if @HAVE_RANDOM_H@
+# include <random.h>
+# endif
+
+# if !@HAVE_STRUCT_RANDOM_DATA@ || @REPLACE_RANDOM_R@ || !@HAVE_RANDOM_R@
+# include <stdint.h>
+# endif
+
+# if !@HAVE_STRUCT_RANDOM_DATA@
+/* Define 'struct random_data'.
+ But allow multiple gnulib generated <stdlib.h> replacements to coexist. */
+# if !GNULIB_defined_struct_random_data
+struct random_data
+{
+ int32_t *fptr; /* Front pointer. */
+ int32_t *rptr; /* Rear pointer. */
+ int32_t *state; /* Array of state values. */
+ int rand_type; /* Type of random number generator. */
+ int rand_deg; /* Degree of random number generator. */
+ int rand_sep; /* Distance between front and rear. */
+ int32_t *end_ptr; /* Pointer behind state table. */
+};
+# define GNULIB_defined_struct_random_data 1
+# endif
+# endif
+#endif
+
+#if (@GNULIB_MKSTEMP@ || @GNULIB_MKSTEMPS@ || @GNULIB_MKOSTEMP@ || @GNULIB_MKOSTEMPS@ || @GNULIB_GETSUBOPT@ || defined GNULIB_POSIXCHECK) && ! defined __GLIBC__ && !(defined _WIN32 && ! defined __CYGWIN__)
+/* On Mac OS X 10.3, only <unistd.h> declares mkstemp. */
+/* On Mac OS X 10.5, only <unistd.h> declares mkstemps. */
+/* On Mac OS X 10.13, only <unistd.h> declares mkostemp and mkostemps. */
+/* On Cygwin 1.7.1, only <unistd.h> declares getsubopt. */
+/* But avoid namespace pollution on glibc systems and native Windows. */
+# include <unistd.h>
+#endif
+
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+ that can be freed by passing them as the Ith argument to the
+ function F. */
+#ifndef _GL_ATTRIBUTE_DEALLOC
+# if __GNUC__ >= 11
+# define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+# else
+# define _GL_ATTRIBUTE_DEALLOC(f, i)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
+ can be freed via 'free'; it can be used only after declaring 'free'. */
+/* Applies to: functions. Cannot be used on inline functions. */
+#ifndef _GL_ATTRIBUTE_DEALLOC_FREE
+# define _GL_ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC (free, 1)
+#endif
+
+/* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly
+ allocated memory. */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_MALLOC
+# if __GNUC__ >= 3 || defined __clang__
+# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+# else
+# define _GL_ATTRIBUTE_MALLOC
+# endif
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The attribute __pure__ was added in gcc 2.96. */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+# define _GL_ATTRIBUTE_PURE /* empty */
+# endif
+#endif
+
+/* The definition of _Noreturn is copied here. */
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Some systems do not define EXIT_*, despite otherwise supporting C89. */
+#ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+#endif
+/* Tandem/NSK and other platforms that define EXIT_FAILURE as -1 interfere
+ with proper operation of xargs. */
+#ifndef EXIT_FAILURE
+# define EXIT_FAILURE 1
+#elif EXIT_FAILURE != 1
+# undef EXIT_FAILURE
+# define EXIT_FAILURE 1
+#endif
+
+
+#if @GNULIB__EXIT@
+/* Terminate the current process with the given return code, without running
+ the 'atexit' handlers. */
+# if @REPLACE__EXIT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef _Exit
+# define _Exit rpl__Exit
+# endif
+_GL_FUNCDECL_RPL (_Exit, _Noreturn void, (int status));
+_GL_CXXALIAS_RPL (_Exit, void, (int status));
+# else
+# if !@HAVE__EXIT@
+_GL_FUNCDECL_SYS (_Exit, _Noreturn void, (int status));
+# endif
+_GL_CXXALIAS_SYS (_Exit, void, (int status));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (_Exit);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef _Exit
+# if HAVE_RAW_DECL__EXIT
+_GL_WARN_ON_USE (_Exit, "_Exit is unportable - "
+ "use gnulib module _Exit for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FREE_POSIX@
+# if @REPLACE_FREE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef free
+# define free rpl_free
+# endif
+# if defined __cplusplus && (__GLIBC__ + (__GLIBC_MINOR__ >= 14) > 2)
+_GL_FUNCDECL_RPL (free, void, (void *ptr) throw ());
+# else
+_GL_FUNCDECL_RPL (free, void, (void *ptr));
+# endif
+_GL_CXXALIAS_RPL (free, void, (void *ptr));
+# else
+_GL_CXXALIAS_SYS (free, void, (void *ptr));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (free);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef free
+/* Assume free is always declared. */
+_GL_WARN_ON_USE (free, "free is not future POSIX compliant everywhere - "
+ "use gnulib module free for portability");
+#endif
+
+
+/* Allocate memory with indefinite extent and specified alignment. */
+#if @GNULIB_ALIGNED_ALLOC@
+# if @REPLACE_ALIGNED_ALLOC@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef aligned_alloc
+# define aligned_alloc rpl_aligned_alloc
+# endif
+_GL_FUNCDECL_RPL (aligned_alloc, void *,
+ (size_t alignment, size_t size)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+_GL_CXXALIAS_RPL (aligned_alloc, void *, (size_t alignment, size_t size));
+# else
+# if @HAVE_ALIGNED_ALLOC@
+# if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate aligned_alloc with free or rpl_free. */
+_GL_FUNCDECL_SYS (aligned_alloc, void *,
+ (size_t alignment, size_t size)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+_GL_CXXALIAS_SYS (aligned_alloc, void *, (size_t alignment, size_t size));
+# endif
+# endif
+# if (__GLIBC__ >= 2) && @HAVE_ALIGNED_ALLOC@
+_GL_CXXALIASWARN (aligned_alloc);
+# endif
+#else
+# if @GNULIB_FREE_POSIX@ && __GNUC__ >= 11 && !defined aligned_alloc
+/* For -Wmismatched-dealloc: Associate aligned_alloc with free or rpl_free. */
+_GL_FUNCDECL_SYS (aligned_alloc, void *,
+ (size_t alignment, size_t size)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+# undef aligned_alloc
+# if HAVE_RAW_DECL_ALIGNED_ALLOC
+_GL_WARN_ON_USE (aligned_alloc, "aligned_alloc is not portable - "
+ "use gnulib module aligned_alloc for portability");
+# endif
+# endif
+#endif
+
+#if @GNULIB_ATOLL@
+/* Parse a signed decimal integer.
+ Returns the value of the integer. Errors are not detected. */
+# if !@HAVE_ATOLL@
+_GL_FUNCDECL_SYS (atoll, long long, (const char *string)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (atoll, long long, (const char *string));
+_GL_CXXALIASWARN (atoll);
+#elif defined GNULIB_POSIXCHECK
+# undef atoll
+# if HAVE_RAW_DECL_ATOLL
+_GL_WARN_ON_USE (atoll, "atoll is unportable - "
+ "use gnulib module atoll for portability");
+# endif
+#endif
+
+#if @GNULIB_CALLOC_POSIX@
+# if (@GNULIB_CALLOC_POSIX@ && @REPLACE_CALLOC_FOR_CALLOC_POSIX@) \
+ || (@GNULIB_CALLOC_GNU@ && @REPLACE_CALLOC_FOR_CALLOC_GNU@)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef calloc
+# define calloc rpl_calloc
+# endif
+_GL_FUNCDECL_RPL (calloc, void *,
+ (size_t nmemb, size_t size)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+_GL_CXXALIAS_RPL (calloc, void *, (size_t nmemb, size_t size));
+# else
+# if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate calloc with free or rpl_free. */
+_GL_FUNCDECL_SYS (calloc, void *,
+ (size_t nmemb, size_t size)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+_GL_CXXALIAS_SYS (calloc, void *, (size_t nmemb, size_t size));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (calloc);
+# endif
+#else
+# if @GNULIB_FREE_POSIX@ && __GNUC__ >= 11 && !defined calloc
+/* For -Wmismatched-dealloc: Associate calloc with free or rpl_free. */
+_GL_FUNCDECL_SYS (calloc, void *,
+ (size_t nmemb, size_t size)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+# undef calloc
+/* Assume calloc is always declared. */
+_GL_WARN_ON_USE (calloc, "calloc is not POSIX compliant everywhere - "
+ "use gnulib module calloc-posix for portability");
+# endif
+#endif
+
+#if @GNULIB_CANONICALIZE_FILE_NAME@
+# if @REPLACE_CANONICALIZE_FILE_NAME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define canonicalize_file_name rpl_canonicalize_file_name
+# endif
+_GL_FUNCDECL_RPL (canonicalize_file_name, char *,
+ (const char *name)
+ _GL_ARG_NONNULL ((1))
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+_GL_CXXALIAS_RPL (canonicalize_file_name, char *, (const char *name));
+# else
+# if !@HAVE_CANONICALIZE_FILE_NAME@ || __GNUC__ >= 11
+_GL_FUNCDECL_SYS (canonicalize_file_name, char *,
+ (const char *name)
+ _GL_ARG_NONNULL ((1))
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+_GL_CXXALIAS_SYS (canonicalize_file_name, char *, (const char *name));
+# endif
+# ifndef GNULIB_defined_canonicalize_file_name
+# define GNULIB_defined_canonicalize_file_name \
+ (!@HAVE_CANONICALIZE_FILE_NAME@ || @REPLACE_CANONICALIZE_FILE_NAME@)
+# endif
+_GL_CXXALIASWARN (canonicalize_file_name);
+#else
+# if @GNULIB_FREE_POSIX@ && __GNUC__ >= 11 && !defined canonicalize_file_name
+/* For -Wmismatched-dealloc: Associate canonicalize_file_name with free or
+ rpl_free. */
+_GL_FUNCDECL_SYS (canonicalize_file_name, char *,
+ (const char *name)
+ _GL_ARG_NONNULL ((1))
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+# undef canonicalize_file_name
+# if HAVE_RAW_DECL_CANONICALIZE_FILE_NAME
+_GL_WARN_ON_USE (canonicalize_file_name,
+ "canonicalize_file_name is unportable - "
+ "use gnulib module canonicalize-lgpl for portability");
+# endif
+# endif
+#endif
+
+#if @GNULIB_MDA_ECVT@
+/* On native Windows, map 'ecvt' to '_ecvt', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::ecvt on all platforms that have
+ it. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ecvt
+# define ecvt _ecvt
+# endif
+_GL_CXXALIAS_MDA (ecvt, char *,
+ (double number, int ndigits, int *decptp, int *signp));
+# else
+# if @HAVE_DECL_ECVT@
+_GL_CXXALIAS_SYS (ecvt, char *,
+ (double number, int ndigits, int *decptp, int *signp));
+# endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_DECL_ECVT@
+_GL_CXXALIASWARN (ecvt);
+# endif
+#endif
+
+#if @GNULIB_MDA_FCVT@
+/* On native Windows, map 'fcvt' to '_fcvt', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::fcvt on all platforms that have
+ it. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fcvt
+# define fcvt _fcvt
+# endif
+_GL_CXXALIAS_MDA (fcvt, char *,
+ (double number, int ndigits, int *decptp, int *signp));
+# else
+# if @HAVE_DECL_FCVT@
+_GL_CXXALIAS_SYS (fcvt, char *,
+ (double number, int ndigits, int *decptp, int *signp));
+# endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_DECL_FCVT@
+_GL_CXXALIASWARN (fcvt);
+# endif
+#endif
+
+#if @GNULIB_MDA_GCVT@
+/* On native Windows, map 'gcvt' to '_gcvt', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::gcvt on all platforms that have
+ it. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef gcvt
+# define gcvt _gcvt
+# endif
+_GL_CXXALIAS_MDA (gcvt, char *, (double number, int ndigits, char *buf));
+# else
+# if @HAVE_DECL_GCVT@
+_GL_CXXALIAS_SYS (gcvt, char *, (double number, int ndigits, char *buf));
+# endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_DECL_GCVT@
+_GL_CXXALIASWARN (gcvt);
+# endif
+#endif
+
+#if @GNULIB_GETLOADAVG@
+/* Store max(NELEM,3) load average numbers in LOADAVG[].
+ The three numbers are the load average of the last 1 minute, the last 5
+ minutes, and the last 15 minutes, respectively.
+ LOADAVG is an array of NELEM numbers. */
+# if @REPLACE_GETLOADAVG@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getloadavg
+# define getloadavg rpl_getloadavg
+# endif
+_GL_FUNCDECL_RPL (getloadavg, int, (double loadavg[], int nelem)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (getloadavg, int, (double loadavg[], int nelem));
+# else
+# if !@HAVE_DECL_GETLOADAVG@
+_GL_FUNCDECL_SYS (getloadavg, int, (double loadavg[], int nelem)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (getloadavg, int, (double loadavg[], int nelem));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (getloadavg);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getloadavg
+# if HAVE_RAW_DECL_GETLOADAVG
+_GL_WARN_ON_USE (getloadavg, "getloadavg is not portable - "
+ "use gnulib module getloadavg for portability");
+# endif
+#endif
+
+#if @GNULIB_GETPROGNAME@
+/* Return the base name of the executing program.
+ On native Windows this will usually end in ".exe" or ".EXE". */
+# if @REPLACE_GETPROGNAME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getprogname
+# define getprogname rpl_getprogname
+# endif
+# ifdef HAVE_DECL_PROGRAM_INVOCATION_NAME
+_GL_FUNCDECL_RPL (getprogname, const char *, (void) _GL_ATTRIBUTE_PURE);
+# else
+_GL_FUNCDECL_RPL (getprogname, const char *, (void));
+# endif
+_GL_CXXALIAS_RPL (getprogname, const char *, (void));
+# else
+# if !@HAVE_GETPROGNAME@
+# ifdef HAVE_DECL_PROGRAM_INVOCATION_NAME
+_GL_FUNCDECL_SYS (getprogname, const char *, (void) _GL_ATTRIBUTE_PURE);
+# else
+_GL_FUNCDECL_SYS (getprogname, const char *, (void));
+# endif
+# endif
+_GL_CXXALIAS_SYS (getprogname, const char *, (void));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (getprogname);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getprogname
+# if HAVE_RAW_DECL_GETPROGNAME
+_GL_WARN_ON_USE (getprogname, "getprogname is unportable - "
+ "use gnulib module getprogname for portability");
+# endif
+#endif
+
+#if @GNULIB_GETSUBOPT@
+/* Assuming *OPTIONP is a comma separated list of elements of the form
+ "token" or "token=value", getsubopt parses the first of these elements.
+ If the first element refers to a "token" that is member of the given
+ NULL-terminated array of tokens:
+ - It replaces the comma with a NUL byte, updates *OPTIONP to point past
+ the first option and the comma, sets *VALUEP to the value of the
+ element (or NULL if it doesn't contain an "=" sign),
+ - It returns the index of the "token" in the given array of tokens.
+ Otherwise it returns -1, and *OPTIONP and *VALUEP are undefined.
+ For more details see the POSIX specification.
+ https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsubopt.html */
+# if @REPLACE_GETSUBOPT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getsubopt
+# define getsubopt rpl_getsubopt
+# endif
+_GL_FUNCDECL_RPL (getsubopt, int,
+ (char **optionp, char *const *tokens, char **valuep)
+ _GL_ARG_NONNULL ((1, 2, 3)));
+_GL_CXXALIAS_RPL (getsubopt, int,
+ (char **optionp, char *const *tokens, char **valuep));
+# else
+# if !@HAVE_GETSUBOPT@
+_GL_FUNCDECL_SYS (getsubopt, int,
+ (char **optionp, char *const *tokens, char **valuep)
+ _GL_ARG_NONNULL ((1, 2, 3)));
+# endif
+_GL_CXXALIAS_SYS (getsubopt, int,
+ (char **optionp, char *const *tokens, char **valuep));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (getsubopt);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getsubopt
+# if HAVE_RAW_DECL_GETSUBOPT
+_GL_WARN_ON_USE (getsubopt, "getsubopt is unportable - "
+ "use gnulib module getsubopt for portability");
+# endif
+#endif
+
+#if @GNULIB_GRANTPT@
+/* Change the ownership and access permission of the slave side of the
+ pseudo-terminal whose master side is specified by FD. */
+# if !@HAVE_GRANTPT@
+_GL_FUNCDECL_SYS (grantpt, int, (int fd));
+# endif
+_GL_CXXALIAS_SYS (grantpt, int, (int fd));
+_GL_CXXALIASWARN (grantpt);
+#elif defined GNULIB_POSIXCHECK
+# undef grantpt
+# if HAVE_RAW_DECL_GRANTPT
+_GL_WARN_ON_USE (grantpt, "grantpt is not portable - "
+ "use gnulib module grantpt for portability");
+# endif
+#endif
+
+/* If _GL_USE_STDLIB_ALLOC is nonzero, the including module does not
+ rely on GNU or POSIX semantics for malloc and realloc (for example,
+ by never specifying a zero size), so it does not need malloc or
+ realloc to be redefined. */
+#if @GNULIB_MALLOC_POSIX@
+# if (@GNULIB_MALLOC_POSIX@ && @REPLACE_MALLOC_FOR_MALLOC_POSIX@) \
+ || (@GNULIB_MALLOC_GNU@ && @REPLACE_MALLOC_FOR_MALLOC_GNU@)
+# if !((defined __cplusplus && defined GNULIB_NAMESPACE) \
+ || _GL_USE_STDLIB_ALLOC)
+# undef malloc
+# define malloc rpl_malloc
+# endif
+_GL_FUNCDECL_RPL (malloc, void *,
+ (size_t size)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+_GL_CXXALIAS_RPL (malloc, void *, (size_t size));
+# else
+# if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate malloc with free or rpl_free. */
+_GL_FUNCDECL_SYS (malloc, void *,
+ (size_t size)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+_GL_CXXALIAS_SYS (malloc, void *, (size_t size));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (malloc);
+# endif
+#else
+# if @GNULIB_FREE_POSIX@ && __GNUC__ >= 11 && !defined malloc
+/* For -Wmismatched-dealloc: Associate malloc with free or rpl_free. */
+_GL_FUNCDECL_SYS (malloc, void *,
+ (size_t size)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
+# undef malloc
+/* Assume malloc is always declared. */
+_GL_WARN_ON_USE (malloc, "malloc is not POSIX compliant everywhere - "
+ "use gnulib module malloc-posix for portability");
+# endif
+#endif
+
+/* Convert a multibyte character to a wide character. */
+#if @GNULIB_MBTOWC@
+# if @REPLACE_MBTOWC@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mbtowc
+# define mbtowc rpl_mbtowc
+# endif
+_GL_FUNCDECL_RPL (mbtowc, int,
+ (wchar_t *restrict pwc, const char *restrict s, size_t n));
+_GL_CXXALIAS_RPL (mbtowc, int,
+ (wchar_t *restrict pwc, const char *restrict s, size_t n));
+# else
+# if !@HAVE_MBTOWC@
+_GL_FUNCDECL_SYS (mbtowc, int,
+ (wchar_t *restrict pwc, const char *restrict s, size_t n));
+# endif
+_GL_CXXALIAS_SYS (mbtowc, int,
+ (wchar_t *restrict pwc, const char *restrict s, size_t n));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (mbtowc);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mbtowc
+# if HAVE_RAW_DECL_MBTOWC
+_GL_WARN_ON_USE (mbtowc, "mbtowc is not portable - "
+ "use gnulib module mbtowc for portability");
+# endif
+#endif
+
+#if @GNULIB_MKDTEMP@
+/* Create a unique temporary directory from TEMPLATE.
+ The last six characters of TEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the directory name unique.
+ Returns TEMPLATE, or a null pointer if it cannot get a unique name.
+ The directory is created mode 700. */
+# if !@HAVE_MKDTEMP@
+_GL_FUNCDECL_SYS (mkdtemp, char *, (char * /*template*/) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkdtemp, char *, (char * /*template*/));
+_GL_CXXALIASWARN (mkdtemp);
+#elif defined GNULIB_POSIXCHECK
+# undef mkdtemp
+# if HAVE_RAW_DECL_MKDTEMP
+_GL_WARN_ON_USE (mkdtemp, "mkdtemp is unportable - "
+ "use gnulib module mkdtemp for portability");
+# endif
+#endif
+
+#if @GNULIB_MKOSTEMP@
+/* Create a unique temporary file from TEMPLATE.
+ The last six characters of TEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+ and O_TEXT, O_BINARY (defined in "binary-io.h").
+ The file is then created, with the specified flags, ensuring it didn't exist
+ before.
+ The file is created read-write (mask at least 0600 & ~umask), but it may be
+ world-readable and world-writable (mask 0666 & ~umask), depending on the
+ implementation.
+ Returns the open file descriptor if successful, otherwise -1 and errno
+ set. */
+# if @REPLACE_MKOSTEMP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mkostemp
+# define mkostemp rpl_mkostemp
+# endif
+_GL_FUNCDECL_RPL (mkostemp, int, (char * /*template*/, int /*flags*/)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mkostemp, int, (char * /*template*/, int /*flags*/));
+# else
+# if !@HAVE_MKOSTEMP@
+_GL_FUNCDECL_SYS (mkostemp, int, (char * /*template*/, int /*flags*/)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkostemp, int, (char * /*template*/, int /*flags*/));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (mkostemp);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mkostemp
+# if HAVE_RAW_DECL_MKOSTEMP
+_GL_WARN_ON_USE (mkostemp, "mkostemp is unportable - "
+ "use gnulib module mkostemp for portability");
+# endif
+#endif
+
+#if @GNULIB_MKOSTEMPS@
+/* Create a unique temporary file from TEMPLATE.
+ The last six characters of TEMPLATE before a suffix of length
+ SUFFIXLEN must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+ and O_TEXT, O_BINARY (defined in "binary-io.h").
+ The file is then created, with the specified flags, ensuring it didn't exist
+ before.
+ The file is created read-write (mask at least 0600 & ~umask), but it may be
+ world-readable and world-writable (mask 0666 & ~umask), depending on the
+ implementation.
+ Returns the open file descriptor if successful, otherwise -1 and errno
+ set. */
+# if @REPLACE_MKOSTEMPS@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mkostemps
+# define mkostemps rpl_mkostemps
+# endif
+_GL_FUNCDECL_RPL (mkostemps, int,
+ (char * /*template*/, int /*suffixlen*/, int /*flags*/)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mkostemps, int,
+ (char * /*template*/, int /*suffixlen*/, int /*flags*/));
+# else
+# if !@HAVE_MKOSTEMPS@
+_GL_FUNCDECL_SYS (mkostemps, int,
+ (char * /*template*/, int /*suffixlen*/, int /*flags*/)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkostemps, int,
+ (char * /*template*/, int /*suffixlen*/, int /*flags*/));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (mkostemps);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mkostemps
+# if HAVE_RAW_DECL_MKOSTEMPS
+_GL_WARN_ON_USE (mkostemps, "mkostemps is unportable - "
+ "use gnulib module mkostemps for portability");
+# endif
+#endif
+
+#if @GNULIB_MKSTEMP@
+/* Create a unique temporary file from TEMPLATE.
+ The last six characters of TEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ The file is then created, ensuring it didn't exist before.
+ The file is created read-write (mask at least 0600 & ~umask), but it may be
+ world-readable and world-writable (mask 0666 & ~umask), depending on the
+ implementation.
+ Returns the open file descriptor if successful, otherwise -1 and errno
+ set. */
+# if @REPLACE_MKSTEMP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define mkstemp rpl_mkstemp
+# endif
+_GL_FUNCDECL_RPL (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mkstemp, int, (char * /*template*/));
+# else
+# if ! @HAVE_MKSTEMP@
+_GL_FUNCDECL_SYS (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkstemp, int, (char * /*template*/));
+# endif
+_GL_CXXALIASWARN (mkstemp);
+#elif defined GNULIB_POSIXCHECK
+# undef mkstemp
+# if HAVE_RAW_DECL_MKSTEMP
+_GL_WARN_ON_USE (mkstemp, "mkstemp is unportable - "
+ "use gnulib module mkstemp for portability");
+# endif
+#endif
+
+#if @GNULIB_MKSTEMPS@
+/* Create a unique temporary file from TEMPLATE.
+ The last six characters of TEMPLATE prior to a suffix of length
+ SUFFIXLEN must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ The file is then created, ensuring it didn't exist before.
+ The file is created read-write (mask at least 0600 & ~umask), but it may be
+ world-readable and world-writable (mask 0666 & ~umask), depending on the
+ implementation.
+ Returns the open file descriptor if successful, otherwise -1 and errno
+ set. */
+# if !@HAVE_MKSTEMPS@
+_GL_FUNCDECL_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/));
+_GL_CXXALIASWARN (mkstemps);
+#elif defined GNULIB_POSIXCHECK
+# undef mkstemps
+# if HAVE_RAW_DECL_MKSTEMPS
+_GL_WARN_ON_USE (mkstemps, "mkstemps is unportable - "
+ "use gnulib module mkstemps for portability");
+# endif
+#endif
+
+#if @GNULIB_MDA_MKTEMP@
+/* On native Windows, map 'mktemp' to '_mktemp', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::mktemp always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mktemp
+# define mktemp _mktemp
+# endif
+_GL_CXXALIAS_MDA (mktemp, char *, (char * /*template*/));
+# else
+_GL_CXXALIAS_SYS (mktemp, char *, (char * /*template*/));
+# endif
+_GL_CXXALIASWARN (mktemp);
+#endif
+
+/* Allocate memory with indefinite extent and specified alignment. */
+#if @GNULIB_POSIX_MEMALIGN@
+# if @REPLACE_POSIX_MEMALIGN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef posix_memalign
+# define posix_memalign rpl_posix_memalign
+# endif
+_GL_FUNCDECL_RPL (posix_memalign, int,
+ (void **memptr, size_t alignment, size_t size)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_memalign, int,
+ (void **memptr, size_t alignment, size_t size));
+# else
+# if @HAVE_POSIX_MEMALIGN@
+_GL_CXXALIAS_SYS (posix_memalign, int,
+ (void **memptr, size_t alignment, size_t size));
+# endif
+# endif
+# if __GLIBC__ >= 2 && @HAVE_POSIX_MEMALIGN@
+_GL_CXXALIASWARN (posix_memalign);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_memalign
+# if HAVE_RAW_DECL_POSIX_MEMALIGN
+_GL_WARN_ON_USE (posix_memalign, "posix_memalign is not portable - "
+ "use gnulib module posix_memalign for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_OPENPT@
+/* Return an FD open to the master side of a pseudo-terminal. Flags should
+ include O_RDWR, and may also include O_NOCTTY. */
+# if @REPLACE_POSIX_OPENPT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef posix_openpt
+# define posix_openpt rpl_posix_openpt
+# endif
+_GL_FUNCDECL_RPL (posix_openpt, int, (int flags));
+_GL_CXXALIAS_RPL (posix_openpt, int, (int flags));
+# else
+# if !@HAVE_POSIX_OPENPT@
+_GL_FUNCDECL_SYS (posix_openpt, int, (int flags));
+# endif
+_GL_CXXALIAS_SYS (posix_openpt, int, (int flags));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (posix_openpt);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_openpt
+# if HAVE_RAW_DECL_POSIX_OPENPT
+_GL_WARN_ON_USE (posix_openpt, "posix_openpt is not portable - "
+ "use gnulib module posix_openpt for portability");
+# endif
+#endif
+
+#if @GNULIB_PTSNAME@
+/* Return the pathname of the pseudo-terminal slave associated with
+ the master FD is open on, or NULL on errors. */
+# if @REPLACE_PTSNAME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ptsname
+# define ptsname rpl_ptsname
+# endif
+_GL_FUNCDECL_RPL (ptsname, char *, (int fd));
+_GL_CXXALIAS_RPL (ptsname, char *, (int fd));
+# else
+# if !@HAVE_PTSNAME@
+_GL_FUNCDECL_SYS (ptsname, char *, (int fd));
+# endif
+_GL_CXXALIAS_SYS (ptsname, char *, (int fd));
+# endif
+_GL_CXXALIASWARN (ptsname);
+#elif defined GNULIB_POSIXCHECK
+# undef ptsname
+# if HAVE_RAW_DECL_PTSNAME
+_GL_WARN_ON_USE (ptsname, "ptsname is not portable - "
+ "use gnulib module ptsname for portability");
+# endif
+#endif
+
+#if @GNULIB_PTSNAME_R@
+/* Set the pathname of the pseudo-terminal slave associated with
+ the master FD is open on and return 0, or set errno and return
+ non-zero on errors. */
+# if @REPLACE_PTSNAME_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ptsname_r
+# define ptsname_r rpl_ptsname_r
+# endif
+_GL_FUNCDECL_RPL (ptsname_r, int, (int fd, char *buf, size_t len));
+_GL_CXXALIAS_RPL (ptsname_r, int, (int fd, char *buf, size_t len));
+# else
+# if !@HAVE_PTSNAME_R@
+_GL_FUNCDECL_SYS (ptsname_r, int, (int fd, char *buf, size_t len));
+# endif
+_GL_CXXALIAS_SYS (ptsname_r, int, (int fd, char *buf, size_t len));
+# endif
+# ifndef GNULIB_defined_ptsname_r
+# define GNULIB_defined_ptsname_r (!@HAVE_PTSNAME_R@ || @REPLACE_PTSNAME_R@)
+# endif
+_GL_CXXALIASWARN (ptsname_r);
+#elif defined GNULIB_POSIXCHECK
+# undef ptsname_r
+# if HAVE_RAW_DECL_PTSNAME_R
+_GL_WARN_ON_USE (ptsname_r, "ptsname_r is not portable - "
+ "use gnulib module ptsname_r for portability");
+# endif
+#endif
+
+#if @GNULIB_PUTENV@
+# if @REPLACE_PUTENV@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef putenv
+# define putenv rpl_putenv
+# endif
+_GL_FUNCDECL_RPL (putenv, int, (char *string) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (putenv, int, (char *string));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef putenv
+# define putenv _putenv
+# endif
+_GL_CXXALIAS_MDA (putenv, int, (char *string));
+# else
+_GL_CXXALIAS_SYS (putenv, int, (char *string));
+# endif
+_GL_CXXALIASWARN (putenv);
+#elif @GNULIB_MDA_PUTENV@
+/* On native Windows, map 'putenv' to '_putenv', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::putenv always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef putenv
+# define putenv _putenv
+# endif
+/* Need to cast, because on mingw, the parameter is either
+ 'const char *string' or 'char *string'. */
+_GL_CXXALIAS_MDA_CAST (putenv, int, (char *string));
+# else
+_GL_CXXALIAS_SYS (putenv, int, (char *string));
+# endif
+_GL_CXXALIASWARN (putenv);
+#endif
+
+#if @GNULIB_QSORT_R@
+/* Sort an array of NMEMB elements, starting at address BASE, each element
+ occupying SIZE bytes, in ascending order according to the comparison
+ function COMPARE. */
+# ifdef __cplusplus
+extern "C" {
+# endif
+# if !GNULIB_defined_qsort_r_fn_types
+typedef int (*_gl_qsort_r_compar_fn) (void const *, void const *, void *);
+# define GNULIB_defined_qsort_r_fn_types 1
+# endif
+# ifdef __cplusplus
+}
+# endif
+# if @REPLACE_QSORT_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef qsort_r
+# define qsort_r rpl_qsort_r
+# endif
+_GL_FUNCDECL_RPL (qsort_r, void, (void *base, size_t nmemb, size_t size,
+ _gl_qsort_r_compar_fn compare,
+ void *arg) _GL_ARG_NONNULL ((1, 4)));
+_GL_CXXALIAS_RPL (qsort_r, void, (void *base, size_t nmemb, size_t size,
+ _gl_qsort_r_compar_fn compare,
+ void *arg));
+# else
+# if !@HAVE_QSORT_R@
+_GL_FUNCDECL_SYS (qsort_r, void, (void *base, size_t nmemb, size_t size,
+ _gl_qsort_r_compar_fn compare,
+ void *arg) _GL_ARG_NONNULL ((1, 4)));
+# endif
+_GL_CXXALIAS_SYS (qsort_r, void, (void *base, size_t nmemb, size_t size,
+ _gl_qsort_r_compar_fn compare,
+ void *arg));
+# endif
+_GL_CXXALIASWARN (qsort_r);
+#elif defined GNULIB_POSIXCHECK
+# undef qsort_r
+# if HAVE_RAW_DECL_QSORT_R
+_GL_WARN_ON_USE (qsort_r, "qsort_r is not portable - "
+ "use gnulib module qsort_r for portability");
+# endif
+#endif
+
+
+#if @GNULIB_RANDOM_R@
+# if !@HAVE_RANDOM_R@
+# ifndef RAND_MAX
+# define RAND_MAX 2147483647
+# endif
+# endif
+#endif
+
+
+#if @GNULIB_RANDOM@
+# if @REPLACE_RANDOM@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef random
+# define random rpl_random
+# endif
+_GL_FUNCDECL_RPL (random, long, (void));
+_GL_CXXALIAS_RPL (random, long, (void));
+# else
+# if !@HAVE_RANDOM@
+_GL_FUNCDECL_SYS (random, long, (void));
+# endif
+/* Need to cast, because on Haiku, the return type is
+ int. */
+_GL_CXXALIAS_SYS_CAST (random, long, (void));
+# endif
+_GL_CXXALIASWARN (random);
+#elif defined GNULIB_POSIXCHECK
+# undef random
+# if HAVE_RAW_DECL_RANDOM
+_GL_WARN_ON_USE (random, "random is unportable - "
+ "use gnulib module random for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM@
+# if @REPLACE_RANDOM@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef srandom
+# define srandom rpl_srandom
+# endif
+_GL_FUNCDECL_RPL (srandom, void, (unsigned int seed));
+_GL_CXXALIAS_RPL (srandom, void, (unsigned int seed));
+# else
+# if !@HAVE_RANDOM@
+_GL_FUNCDECL_SYS (srandom, void, (unsigned int seed));
+# endif
+/* Need to cast, because on FreeBSD, the first parameter is
+ unsigned long seed. */
+_GL_CXXALIAS_SYS_CAST (srandom, void, (unsigned int seed));
+# endif
+_GL_CXXALIASWARN (srandom);
+#elif defined GNULIB_POSIXCHECK
+# undef srandom
+# if HAVE_RAW_DECL_SRANDOM
+_GL_WARN_ON_USE (srandom, "srandom is unportable - "
+ "use gnulib module random for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM@
+# if @REPLACE_INITSTATE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef initstate
+# define initstate rpl_initstate
+# endif
+_GL_FUNCDECL_RPL (initstate, char *,
+ (unsigned int seed, char *buf, size_t buf_size)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (initstate, char *,
+ (unsigned int seed, char *buf, size_t buf_size));
+# else
+# if !@HAVE_INITSTATE@ || !@HAVE_DECL_INITSTATE@
+_GL_FUNCDECL_SYS (initstate, char *,
+ (unsigned int seed, char *buf, size_t buf_size)
+ _GL_ARG_NONNULL ((2)));
+# endif
+/* Need to cast, because on FreeBSD, the first parameter is
+ unsigned long seed. */
+_GL_CXXALIAS_SYS_CAST (initstate, char *,
+ (unsigned int seed, char *buf, size_t buf_size));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (initstate);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef initstate
+# if HAVE_RAW_DECL_INITSTATE
+_GL_WARN_ON_USE (initstate, "initstate is unportable - "
+ "use gnulib module random for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM@
+# if @REPLACE_SETSTATE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef setstate
+# define setstate rpl_setstate
+# endif
+_GL_FUNCDECL_RPL (setstate, char *, (char *arg_state) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (setstate, char *, (char *arg_state));
+# else
+# if !@HAVE_SETSTATE@ || !@HAVE_DECL_SETSTATE@
+_GL_FUNCDECL_SYS (setstate, char *, (char *arg_state) _GL_ARG_NONNULL ((1)));
+# endif
+/* Need to cast, because on Mac OS X 10.13, HP-UX, Solaris the first parameter
+ is const char *arg_state. */
+_GL_CXXALIAS_SYS_CAST (setstate, char *, (char *arg_state));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (setstate);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef setstate
+# if HAVE_RAW_DECL_SETSTATE
+_GL_WARN_ON_USE (setstate, "setstate is unportable - "
+ "use gnulib module random for portability");
+# endif
+#endif
+
+
+#if @GNULIB_RANDOM_R@
+# if @REPLACE_RANDOM_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef random_r
+# define random_r rpl_random_r
+# endif
+_GL_FUNCDECL_RPL (random_r, int, (struct random_data *buf, int32_t *result)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (random_r, int, (struct random_data *buf, int32_t *result));
+# else
+# if !@HAVE_RANDOM_R@
+_GL_FUNCDECL_SYS (random_r, int, (struct random_data *buf, int32_t *result)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (random_r, int, (struct random_data *buf, int32_t *result));
+# endif
+_GL_CXXALIASWARN (random_r);
+#elif defined GNULIB_POSIXCHECK
+# undef random_r
+# if HAVE_RAW_DECL_RANDOM_R
+_GL_WARN_ON_USE (random_r, "random_r is unportable - "
+ "use gnulib module random_r for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM_R@
+# if @REPLACE_RANDOM_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef srandom_r
+# define srandom_r rpl_srandom_r
+# endif
+_GL_FUNCDECL_RPL (srandom_r, int,
+ (unsigned int seed, struct random_data *rand_state)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (srandom_r, int,
+ (unsigned int seed, struct random_data *rand_state));
+# else
+# if !@HAVE_RANDOM_R@
+_GL_FUNCDECL_SYS (srandom_r, int,
+ (unsigned int seed, struct random_data *rand_state)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (srandom_r, int,
+ (unsigned int seed, struct random_data *rand_state));
+# endif
+_GL_CXXALIASWARN (srandom_r);
+#elif defined GNULIB_POSIXCHECK
+# undef srandom_r
+# if HAVE_RAW_DECL_SRANDOM_R
+_GL_WARN_ON_USE (srandom_r, "srandom_r is unportable - "
+ "use gnulib module random_r for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM_R@
+# if @REPLACE_RANDOM_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef initstate_r
+# define initstate_r rpl_initstate_r
+# endif
+_GL_FUNCDECL_RPL (initstate_r, int,
+ (unsigned int seed, char *buf, size_t buf_size,
+ struct random_data *rand_state)
+ _GL_ARG_NONNULL ((2, 4)));
+_GL_CXXALIAS_RPL (initstate_r, int,
+ (unsigned int seed, char *buf, size_t buf_size,
+ struct random_data *rand_state));
+# else
+# if !@HAVE_RANDOM_R@
+_GL_FUNCDECL_SYS (initstate_r, int,
+ (unsigned int seed, char *buf, size_t buf_size,
+ struct random_data *rand_state)
+ _GL_ARG_NONNULL ((2, 4)));
+# endif
+/* Need to cast, because on Haiku, the third parameter is
+ unsigned long buf_size. */
+_GL_CXXALIAS_SYS_CAST (initstate_r, int,
+ (unsigned int seed, char *buf, size_t buf_size,
+ struct random_data *rand_state));
+# endif
+_GL_CXXALIASWARN (initstate_r);
+#elif defined GNULIB_POSIXCHECK
+# undef initstate_r
+# if HAVE_RAW_DECL_INITSTATE_R
+_GL_WARN_ON_USE (initstate_r, "initstate_r is unportable - "
+ "use gnulib module random_r for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM_R@
+# if @REPLACE_RANDOM_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef setstate_r
+# define setstate_r rpl_setstate_r
+# endif
+_GL_FUNCDECL_RPL (setstate_r, int,
+ (char *arg_state, struct random_data *rand_state)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (setstate_r, int,
+ (char *arg_state, struct random_data *rand_state));
+# else
+# if !@HAVE_RANDOM_R@
+_GL_FUNCDECL_SYS (setstate_r, int,
+ (char *arg_state, struct random_data *rand_state)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+/* Need to cast, because on Haiku, the first parameter is
+ void *arg_state. */
+_GL_CXXALIAS_SYS_CAST (setstate_r, int,
+ (char *arg_state, struct random_data *rand_state));
+# endif
+_GL_CXXALIASWARN (setstate_r);
+#elif defined GNULIB_POSIXCHECK
+# undef setstate_r
+# if HAVE_RAW_DECL_SETSTATE_R
+_GL_WARN_ON_USE (setstate_r, "setstate_r is unportable - "
+ "use gnulib module random_r for portability");
+# endif
+#endif
+
+
+#if @GNULIB_REALLOC_POSIX@
+# if (@GNULIB_REALLOC_POSIX@ && @REPLACE_REALLOC_FOR_REALLOC_POSIX@) \
+ || (@GNULIB_REALLOC_GNU@ && @REPLACE_REALLOC_FOR_REALLOC_GNU@)
+# if !((defined __cplusplus && defined GNULIB_NAMESPACE) \
+ || _GL_USE_STDLIB_ALLOC)
+# undef realloc
+# define realloc rpl_realloc
+# endif
+_GL_FUNCDECL_RPL (realloc, void *, (void *ptr, size_t size)
+ _GL_ATTRIBUTE_DEALLOC_FREE);
+_GL_CXXALIAS_RPL (realloc, void *, (void *ptr, size_t size));
+# else
+# if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate realloc with free or rpl_free. */
+_GL_FUNCDECL_SYS (realloc, void *, (void *ptr, size_t size)
+ _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+_GL_CXXALIAS_SYS (realloc, void *, (void *ptr, size_t size));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (realloc);
+# endif
+#else
+# if @GNULIB_FREE_POSIX@ && __GNUC__ >= 11 && !defined realloc
+/* For -Wmismatched-dealloc: Associate realloc with free or rpl_free. */
+_GL_FUNCDECL_SYS (realloc, void *, (void *ptr, size_t size)
+ _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
+# undef realloc
+/* Assume realloc is always declared. */
+_GL_WARN_ON_USE (realloc, "realloc is not POSIX compliant everywhere - "
+ "use gnulib module realloc-posix for portability");
+# endif
+#endif
+
+
+#if @GNULIB_REALLOCARRAY@
+# if @REPLACE_REALLOCARRAY@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef reallocarray
+# define reallocarray rpl_reallocarray
+# endif
+_GL_FUNCDECL_RPL (reallocarray, void *,
+ (void *ptr, size_t nmemb, size_t size));
+_GL_CXXALIAS_RPL (reallocarray, void *,
+ (void *ptr, size_t nmemb, size_t size));
+# else
+# if ! @HAVE_REALLOCARRAY@
+_GL_FUNCDECL_SYS (reallocarray, void *,
+ (void *ptr, size_t nmemb, size_t size));
+# endif
+_GL_CXXALIAS_SYS (reallocarray, void *,
+ (void *ptr, size_t nmemb, size_t size));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (reallocarray);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef reallocarray
+# if HAVE_RAW_DECL_REALLOCARRAY
+_GL_WARN_ON_USE (reallocarray, "reallocarray is not portable - "
+ "use gnulib module reallocarray for portability");
+# endif
+#endif
+
+#if @GNULIB_REALPATH@
+# if @REPLACE_REALPATH@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define realpath rpl_realpath
+# endif
+_GL_FUNCDECL_RPL (realpath, char *,
+ (const char *restrict name, char *restrict resolved)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (realpath, char *,
+ (const char *restrict name, char *restrict resolved));
+# else
+# if !@HAVE_REALPATH@
+_GL_FUNCDECL_SYS (realpath, char *,
+ (const char *restrict name, char *restrict resolved)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (realpath, char *,
+ (const char *restrict name, char *restrict resolved));
+# endif
+_GL_CXXALIASWARN (realpath);
+#elif defined GNULIB_POSIXCHECK
+# undef realpath
+# if HAVE_RAW_DECL_REALPATH
+_GL_WARN_ON_USE (realpath, "realpath is unportable - use gnulib module "
+ "canonicalize or canonicalize-lgpl for portability");
+# endif
+#endif
+
+#if @GNULIB_RPMATCH@
+/* Test a user response to a question.
+ Return 1 if it is affirmative, 0 if it is negative, or -1 if not clear. */
+# if !@HAVE_RPMATCH@
+_GL_FUNCDECL_SYS (rpmatch, int, (const char *response) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (rpmatch, int, (const char *response));
+_GL_CXXALIASWARN (rpmatch);
+#elif defined GNULIB_POSIXCHECK
+# undef rpmatch
+# if HAVE_RAW_DECL_RPMATCH
+_GL_WARN_ON_USE (rpmatch, "rpmatch is unportable - "
+ "use gnulib module rpmatch for portability");
+# endif
+#endif
+
+#if @GNULIB_SECURE_GETENV@
+/* Look up NAME in the environment, returning 0 in insecure situations. */
+# if !@HAVE_SECURE_GETENV@
+_GL_FUNCDECL_SYS (secure_getenv, char *,
+ (char const *name) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (secure_getenv, char *, (char const *name));
+_GL_CXXALIASWARN (secure_getenv);
+#elif defined GNULIB_POSIXCHECK
+# undef secure_getenv
+# if HAVE_RAW_DECL_SECURE_GETENV
+_GL_WARN_ON_USE (secure_getenv, "secure_getenv is unportable - "
+ "use gnulib module secure_getenv for portability");
+# endif
+#endif
+
+#if @GNULIB_SETENV@
+/* Set NAME to VALUE in the environment.
+ If REPLACE is nonzero, overwrite an existing value. */
+# if @REPLACE_SETENV@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef setenv
+# define setenv rpl_setenv
+# endif
+_GL_FUNCDECL_RPL (setenv, int,
+ (const char *name, const char *value, int replace)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (setenv, int,
+ (const char *name, const char *value, int replace));
+# else
+# if !@HAVE_DECL_SETENV@
+_GL_FUNCDECL_SYS (setenv, int,
+ (const char *name, const char *value, int replace)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (setenv, int,
+ (const char *name, const char *value, int replace));
+# endif
+# if !(@REPLACE_SETENV@ && !@HAVE_DECL_SETENV@)
+_GL_CXXALIASWARN (setenv);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef setenv
+# if HAVE_RAW_DECL_SETENV
+_GL_WARN_ON_USE (setenv, "setenv is unportable - "
+ "use gnulib module setenv for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOD@
+ /* Parse a double from STRING, updating ENDP if appropriate. */
+# if @REPLACE_STRTOD@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strtod rpl_strtod
+# endif
+# define GNULIB_defined_strtod_function 1
+_GL_FUNCDECL_RPL (strtod, double,
+ (const char *restrict str, char **restrict endp)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtod, double,
+ (const char *restrict str, char **restrict endp));
+# else
+# if !@HAVE_STRTOD@
+_GL_FUNCDECL_SYS (strtod, double,
+ (const char *restrict str, char **restrict endp)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strtod, double,
+ (const char *restrict str, char **restrict endp));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (strtod);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strtod
+# if HAVE_RAW_DECL_STRTOD
+_GL_WARN_ON_USE (strtod, "strtod is unportable - "
+ "use gnulib module strtod for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOLD@
+ /* Parse a 'long double' from STRING, updating ENDP if appropriate. */
+# if @REPLACE_STRTOLD@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strtold rpl_strtold
+# endif
+# define GNULIB_defined_strtold_function 1
+_GL_FUNCDECL_RPL (strtold, long double,
+ (const char *restrict str, char **restrict endp)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtold, long double,
+ (const char *restrict str, char **restrict endp));
+# else
+# if !@HAVE_STRTOLD@
+_GL_FUNCDECL_SYS (strtold, long double,
+ (const char *restrict str, char **restrict endp)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strtold, long double,
+ (const char *restrict str, char **restrict endp));
+# endif
+_GL_CXXALIASWARN (strtold);
+#elif defined GNULIB_POSIXCHECK
+# undef strtold
+# if HAVE_RAW_DECL_STRTOLD
+_GL_WARN_ON_USE (strtold, "strtold is unportable - "
+ "use gnulib module strtold for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOL@
+/* Parse a signed integer whose textual representation starts at STRING.
+ The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+ it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+ "0x").
+ If ENDPTR is not NULL, the address of the first byte after the integer is
+ stored in *ENDPTR.
+ Upon overflow, the return value is LONG_MAX or LONG_MIN, and errno is set
+ to ERANGE. */
+# if @REPLACE_STRTOL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strtol rpl_strtol
+# endif
+# define GNULIB_defined_strtol_function 1
+_GL_FUNCDECL_RPL (strtol, long,
+ (const char *restrict string, char **restrict endptr,
+ int base)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtol, long,
+ (const char *restrict string, char **restrict endptr,
+ int base));
+# else
+# if !@HAVE_STRTOL@
+_GL_FUNCDECL_SYS (strtol, long,
+ (const char *restrict string, char **restrict endptr,
+ int base)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strtol, long,
+ (const char *restrict string, char **restrict endptr,
+ int base));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (strtol);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strtol
+# if HAVE_RAW_DECL_STRTOL
+_GL_WARN_ON_USE (strtol, "strtol is unportable - "
+ "use gnulib module strtol for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOLL@
+/* Parse a signed integer whose textual representation starts at STRING.
+ The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+ it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+ "0x").
+ If ENDPTR is not NULL, the address of the first byte after the integer is
+ stored in *ENDPTR.
+ Upon overflow, the return value is LLONG_MAX or LLONG_MIN, and errno is set
+ to ERANGE. */
+# if @REPLACE_STRTOLL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strtoll rpl_strtoll
+# endif
+# define GNULIB_defined_strtoll_function 1
+_GL_FUNCDECL_RPL (strtoll, long long,
+ (const char *restrict string, char **restrict endptr,
+ int base)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtoll, long long,
+ (const char *restrict string, char **restrict endptr,
+ int base));
+# else
+# if !@HAVE_STRTOLL@
+_GL_FUNCDECL_SYS (strtoll, long long,
+ (const char *restrict string, char **restrict endptr,
+ int base)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strtoll, long long,
+ (const char *restrict string, char **restrict endptr,
+ int base));
+# endif
+_GL_CXXALIASWARN (strtoll);
+#elif defined GNULIB_POSIXCHECK
+# undef strtoll
+# if HAVE_RAW_DECL_STRTOLL
+_GL_WARN_ON_USE (strtoll, "strtoll is unportable - "
+ "use gnulib module strtoll for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOUL@
+/* Parse an unsigned integer whose textual representation starts at STRING.
+ The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+ it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+ "0x").
+ If ENDPTR is not NULL, the address of the first byte after the integer is
+ stored in *ENDPTR.
+ Upon overflow, the return value is ULONG_MAX, and errno is set to ERANGE. */
+# if @REPLACE_STRTOUL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strtoul rpl_strtoul
+# endif
+# define GNULIB_defined_strtoul_function 1
+_GL_FUNCDECL_RPL (strtoul, unsigned long,
+ (const char *restrict string, char **restrict endptr,
+ int base)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtoul, unsigned long,
+ (const char *restrict string, char **restrict endptr,
+ int base));
+# else
+# if !@HAVE_STRTOUL@
+_GL_FUNCDECL_SYS (strtoul, unsigned long,
+ (const char *restrict string, char **restrict endptr,
+ int base)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strtoul, unsigned long,
+ (const char *restrict string, char **restrict endptr,
+ int base));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (strtoul);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strtoul
+# if HAVE_RAW_DECL_STRTOUL
+_GL_WARN_ON_USE (strtoul, "strtoul is unportable - "
+ "use gnulib module strtoul for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOULL@
+/* Parse an unsigned integer whose textual representation starts at STRING.
+ The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+ it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+ "0x").
+ If ENDPTR is not NULL, the address of the first byte after the integer is
+ stored in *ENDPTR.
+ Upon overflow, the return value is ULLONG_MAX, and errno is set to
+ ERANGE. */
+# if @REPLACE_STRTOULL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strtoull rpl_strtoull
+# endif
+# define GNULIB_defined_strtoull_function 1
+_GL_FUNCDECL_RPL (strtoull, unsigned long long,
+ (const char *restrict string, char **restrict endptr,
+ int base)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtoull, unsigned long long,
+ (const char *restrict string, char **restrict endptr,
+ int base));
+# else
+# if !@HAVE_STRTOULL@
+_GL_FUNCDECL_SYS (strtoull, unsigned long long,
+ (const char *restrict string, char **restrict endptr,
+ int base)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strtoull, unsigned long long,
+ (const char *restrict string, char **restrict endptr,
+ int base));
+# endif
+_GL_CXXALIASWARN (strtoull);
+#elif defined GNULIB_POSIXCHECK
+# undef strtoull
+# if HAVE_RAW_DECL_STRTOULL
+_GL_WARN_ON_USE (strtoull, "strtoull is unportable - "
+ "use gnulib module strtoull for portability");
+# endif
+#endif
+
+#if @GNULIB_UNLOCKPT@
+/* Unlock the slave side of the pseudo-terminal whose master side is specified
+ by FD, so that it can be opened. */
+# if !@HAVE_UNLOCKPT@
+_GL_FUNCDECL_SYS (unlockpt, int, (int fd));
+# endif
+_GL_CXXALIAS_SYS (unlockpt, int, (int fd));
+_GL_CXXALIASWARN (unlockpt);
+#elif defined GNULIB_POSIXCHECK
+# undef unlockpt
+# if HAVE_RAW_DECL_UNLOCKPT
+_GL_WARN_ON_USE (unlockpt, "unlockpt is not portable - "
+ "use gnulib module unlockpt for portability");
+# endif
+#endif
+
+#if @GNULIB_UNSETENV@
+/* Remove the variable NAME from the environment. */
+# if @REPLACE_UNSETENV@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef unsetenv
+# define unsetenv rpl_unsetenv
+# endif
+_GL_FUNCDECL_RPL (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (unsetenv, int, (const char *name));
+# else
+# if !@HAVE_DECL_UNSETENV@
+_GL_FUNCDECL_SYS (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (unsetenv, int, (const char *name));
+# endif
+# if !(@REPLACE_UNSETENV@ && !@HAVE_DECL_UNSETENV@)
+_GL_CXXALIASWARN (unsetenv);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef unsetenv
+# if HAVE_RAW_DECL_UNSETENV
+_GL_WARN_ON_USE (unsetenv, "unsetenv is unportable - "
+ "use gnulib module unsetenv for portability");
+# endif
+#endif
+
+/* Convert a wide character to a multibyte character. */
+#if @GNULIB_WCTOMB@
+# if @REPLACE_WCTOMB@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wctomb
+# define wctomb rpl_wctomb
+# endif
+_GL_FUNCDECL_RPL (wctomb, int, (char *s, wchar_t wc));
+_GL_CXXALIAS_RPL (wctomb, int, (char *s, wchar_t wc));
+# else
+_GL_CXXALIAS_SYS (wctomb, int, (char *s, wchar_t wc));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wctomb);
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_STDLIB_H */
+#endif /* _@GUARD_PREFIX@_STDLIB_H */
+#endif
diff --git a/lib/streq.h b/lib/streq.h
new file mode 100644
index 0000000..712948e
--- /dev/null
+++ b/lib/streq.h
@@ -0,0 +1,176 @@
+/* Optimized string comparison.
+ Copyright (C) 2001-2002, 2007, 2009-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#ifndef _GL_STREQ_H
+#define _GL_STREQ_H
+
+#include <string.h>
+
+/* STREQ_OPT allows to optimize string comparison with a small literal string.
+ STREQ_OPT (s, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0)
+ is semantically equivalent to
+ strcmp (s, "EUC-KR") == 0
+ just faster. */
+
+/* Help GCC to generate good code for string comparisons with
+ immediate strings. */
+#if (defined __GNUC__ || defined __clang__) && defined __OPTIMIZE__
+
+static inline int
+streq9 (const char *s1, const char *s2)
+{
+ return strcmp (s1 + 9, s2 + 9) == 0;
+}
+
+static inline int
+streq8 (const char *s1, const char *s2, char s28)
+{
+ if (s1[8] == s28)
+ {
+ if (s28 == 0)
+ return 1;
+ else
+ return streq9 (s1, s2);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq7 (const char *s1, const char *s2, char s27, char s28)
+{
+ if (s1[7] == s27)
+ {
+ if (s27 == 0)
+ return 1;
+ else
+ return streq8 (s1, s2, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq6 (const char *s1, const char *s2, char s26, char s27, char s28)
+{
+ if (s1[6] == s26)
+ {
+ if (s26 == 0)
+ return 1;
+ else
+ return streq7 (s1, s2, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq5 (const char *s1, const char *s2, char s25, char s26, char s27, char s28)
+{
+ if (s1[5] == s25)
+ {
+ if (s25 == 0)
+ return 1;
+ else
+ return streq6 (s1, s2, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq4 (const char *s1, const char *s2, char s24, char s25, char s26, char s27, char s28)
+{
+ if (s1[4] == s24)
+ {
+ if (s24 == 0)
+ return 1;
+ else
+ return streq5 (s1, s2, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq3 (const char *s1, const char *s2, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (s1[3] == s23)
+ {
+ if (s23 == 0)
+ return 1;
+ else
+ return streq4 (s1, s2, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq2 (const char *s1, const char *s2, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (s1[2] == s22)
+ {
+ if (s22 == 0)
+ return 1;
+ else
+ return streq3 (s1, s2, s23, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq1 (const char *s1, const char *s2, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (s1[1] == s21)
+ {
+ if (s21 == 0)
+ return 1;
+ else
+ return streq2 (s1, s2, s22, s23, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq0 (const char *s1, const char *s2, char s20, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (s1[0] == s20)
+ {
+ if (s20 == 0)
+ return 1;
+ else
+ return streq1 (s1, s2, s21, s22, s23, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+#define STREQ_OPT(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
+ streq0 (s1, s2, s20, s21, s22, s23, s24, s25, s26, s27, s28)
+
+#else
+
+#define STREQ_OPT(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
+ (strcmp (s1, s2) == 0)
+
+#endif
+
+#endif /* _GL_STREQ_H */
diff --git a/lib/string.in.h b/lib/string.in.h
new file mode 100644
index 0000000..aa08821
--- /dev/null
+++ b/lib/string.in.h
@@ -0,0 +1,1355 @@
+/* A GNU-like <string.h>.
+
+ Copyright (C) 1995-1996, 2001-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined _GL_ALREADY_INCLUDING_STRING_H
+/* Special invocation convention:
+ - On OS X/NetBSD we have a sequence of nested includes
+ <string.h> -> <strings.h> -> "string.h"
+ In this situation system _chk variants due to -D_FORTIFY_SOURCE
+ might be used after any replacements defined here. */
+
+#@INCLUDE_NEXT@ @NEXT_STRING_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_STRING_H
+
+#define _GL_ALREADY_INCLUDING_STRING_H
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_STRING_H@
+
+#undef _GL_ALREADY_INCLUDING_STRING_H
+
+#ifndef _@GUARD_PREFIX@_STRING_H
+#define _@GUARD_PREFIX@_STRING_H
+
+/* NetBSD 5.0 mis-defines NULL. */
+#include <stddef.h>
+
+/* MirBSD defines mbslen as a macro. */
+#if @GNULIB_MBSLEN@ && defined __MirBSD__
+# include <wchar.h>
+#endif
+
+/* NetBSD 5.0 declares strsignal in <unistd.h>, not in <string.h>. */
+/* But in any case avoid namespace pollution on glibc systems. */
+#if (@GNULIB_STRSIGNAL@ || defined GNULIB_POSIXCHECK) && defined __NetBSD__ \
+ && ! defined __GLIBC__
+# include <unistd.h>
+#endif
+
+/* AIX 7.2 and Android 13 declare ffsl and ffsll in <strings.h>, not in
+ <string.h>. */
+/* But in any case avoid namespace pollution on glibc systems. */
+#if ((@GNULIB_FFSL@ || @GNULIB_FFSLL@ || defined GNULIB_POSIXCHECK) \
+ && (defined _AIX || defined __ANDROID__)) \
+ && ! defined __GLIBC__
+# include <strings.h>
+#endif
+
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+ that can be freed by passing them as the Ith argument to the
+ function F. */
+#ifndef _GL_ATTRIBUTE_DEALLOC
+# if __GNUC__ >= 11
+# define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+# else
+# define _GL_ATTRIBUTE_DEALLOC(f, i)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
+ can be freed via 'free'; it can be used only after declaring 'free'. */
+/* Applies to: functions. Cannot be used on inline functions. */
+#ifndef _GL_ATTRIBUTE_DEALLOC_FREE
+# if defined __cplusplus && defined __GNUC__ && !defined __clang__
+/* Work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108231> */
+# define _GL_ATTRIBUTE_DEALLOC_FREE \
+ _GL_ATTRIBUTE_DEALLOC ((void (*) (void *)) free, 1)
+# else
+# define _GL_ATTRIBUTE_DEALLOC_FREE \
+ _GL_ATTRIBUTE_DEALLOC (free, 1)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly
+ allocated memory. */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_MALLOC
+# if __GNUC__ >= 3 || defined __clang__
+# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+# else
+# define _GL_ATTRIBUTE_MALLOC
+# endif
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The attribute __pure__ was added in gcc 2.96. */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+# define _GL_ATTRIBUTE_PURE /* empty */
+# endif
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Make _GL_ATTRIBUTE_DEALLOC_FREE work, even though <stdlib.h> may not have
+ been included yet. */
+#if @GNULIB_FREE_POSIX@
+# if (@REPLACE_FREE@ && !defined free \
+ && !(defined __cplusplus && defined GNULIB_NAMESPACE))
+/* We can't do '#define free rpl_free' here. */
+_GL_EXTERN_C void rpl_free (void *);
+# undef _GL_ATTRIBUTE_DEALLOC_FREE
+# define _GL_ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC (rpl_free, 1)
+# else
+# if defined _MSC_VER && !defined free
+_GL_EXTERN_C
+# if defined _DLL
+ __declspec (dllimport)
+# endif
+ void __cdecl free (void *);
+# else
+# if defined __cplusplus && (__GLIBC__ + (__GLIBC_MINOR__ >= 14) > 2)
+_GL_EXTERN_C void free (void *) throw ();
+# else
+_GL_EXTERN_C void free (void *);
+# endif
+# endif
+# endif
+#else
+# if defined _MSC_VER && !defined free
+_GL_EXTERN_C
+# if defined _DLL
+ __declspec (dllimport)
+# endif
+ void __cdecl free (void *);
+# else
+# if defined __cplusplus && (__GLIBC__ + (__GLIBC_MINOR__ >= 14) > 2)
+_GL_EXTERN_C void free (void *) throw ();
+# else
+_GL_EXTERN_C void free (void *);
+# endif
+# endif
+#endif
+
+/* Clear a block of memory. The compiler will not delete a call to
+ this function, even if the block is dead after the call. */
+#if @GNULIB_EXPLICIT_BZERO@
+# if ! @HAVE_EXPLICIT_BZERO@
+_GL_FUNCDECL_SYS (explicit_bzero, void,
+ (void *__dest, size_t __n) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (explicit_bzero, void, (void *__dest, size_t __n));
+_GL_CXXALIASWARN (explicit_bzero);
+#elif defined GNULIB_POSIXCHECK
+# undef explicit_bzero
+# if HAVE_RAW_DECL_EXPLICIT_BZERO
+_GL_WARN_ON_USE (explicit_bzero, "explicit_bzero is unportable - "
+ "use gnulib module explicit_bzero for portability");
+# endif
+#endif
+
+/* Find the index of the least-significant set bit. */
+#if @GNULIB_FFSL@
+# if !@HAVE_FFSL@
+_GL_FUNCDECL_SYS (ffsl, int, (long int i));
+# endif
+_GL_CXXALIAS_SYS (ffsl, int, (long int i));
+_GL_CXXALIASWARN (ffsl);
+#elif defined GNULIB_POSIXCHECK
+# undef ffsl
+# if HAVE_RAW_DECL_FFSL
+_GL_WARN_ON_USE (ffsl, "ffsl is not portable - use the ffsl module");
+# endif
+#endif
+
+
+/* Find the index of the least-significant set bit. */
+#if @GNULIB_FFSLL@
+# if @REPLACE_FFSLL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define ffsll rpl_ffsll
+# endif
+_GL_FUNCDECL_RPL (ffsll, int, (long long int i));
+_GL_CXXALIAS_RPL (ffsll, int, (long long int i));
+# else
+# if !@HAVE_FFSLL@
+_GL_FUNCDECL_SYS (ffsll, int, (long long int i));
+# endif
+_GL_CXXALIAS_SYS (ffsll, int, (long long int i));
+# endif
+_GL_CXXALIASWARN (ffsll);
+#elif defined GNULIB_POSIXCHECK
+# undef ffsll
+# if HAVE_RAW_DECL_FFSLL
+_GL_WARN_ON_USE (ffsll, "ffsll is not portable - use the ffsll module");
+# endif
+#endif
+
+
+#if @GNULIB_MDA_MEMCCPY@
+/* On native Windows, map 'memccpy' to '_memccpy', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::memccpy always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef memccpy
+# define memccpy _memccpy
+# endif
+_GL_CXXALIAS_MDA (memccpy, void *,
+ (void *dest, const void *src, int c, size_t n));
+# else
+_GL_CXXALIAS_SYS (memccpy, void *,
+ (void *dest, const void *src, int c, size_t n));
+# endif
+_GL_CXXALIASWARN (memccpy);
+#endif
+
+
+/* Return the first instance of C within N bytes of S, or NULL. */
+#if @GNULIB_MEMCHR@
+# if @REPLACE_MEMCHR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef memchr
+# define memchr rpl_memchr
+# endif
+_GL_FUNCDECL_RPL (memchr, void *, (void const *__s, int __c, size_t __n)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (memchr, void *, (void const *__s, int __c, size_t __n));
+# else
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C" { const void * std::memchr (const void *, int, size_t); }
+ extern "C++" { void * std::memchr (void *, int, size_t); } */
+_GL_CXXALIAS_SYS_CAST2 (memchr,
+ void *, (void const *__s, int __c, size_t __n),
+ void const *, (void const *__s, int __c, size_t __n));
+# endif
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) \
+ || defined __clang__)
+_GL_CXXALIASWARN1 (memchr, void *, (void *__s, int __c, size_t __n) throw ());
+_GL_CXXALIASWARN1 (memchr, void const *,
+ (void const *__s, int __c, size_t __n) throw ());
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (memchr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef memchr
+/* Assume memchr is always declared. */
+_GL_WARN_ON_USE (memchr, "memchr has platform-specific bugs - "
+ "use gnulib module memchr for portability" );
+#endif
+
+/* Return the first occurrence of NEEDLE in HAYSTACK. */
+#if @GNULIB_MEMMEM@
+# if @REPLACE_MEMMEM@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define memmem rpl_memmem
+# endif
+_GL_FUNCDECL_RPL (memmem, void *,
+ (void const *__haystack, size_t __haystack_len,
+ void const *__needle, size_t __needle_len)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 3)));
+_GL_CXXALIAS_RPL (memmem, void *,
+ (void const *__haystack, size_t __haystack_len,
+ void const *__needle, size_t __needle_len));
+# else
+# if ! @HAVE_DECL_MEMMEM@
+_GL_FUNCDECL_SYS (memmem, void *,
+ (void const *__haystack, size_t __haystack_len,
+ void const *__needle, size_t __needle_len)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 3)));
+# endif
+_GL_CXXALIAS_SYS (memmem, void *,
+ (void const *__haystack, size_t __haystack_len,
+ void const *__needle, size_t __needle_len));
+# endif
+_GL_CXXALIASWARN (memmem);
+#elif defined GNULIB_POSIXCHECK
+# undef memmem
+# if HAVE_RAW_DECL_MEMMEM
+_GL_WARN_ON_USE (memmem, "memmem is unportable and often quadratic - "
+ "use gnulib module memmem-simple for portability, "
+ "and module memmem for speed" );
+# endif
+#endif
+
+/* Copy N bytes of SRC to DEST, return pointer to bytes after the
+ last written byte. */
+#if @GNULIB_MEMPCPY@
+# if @REPLACE_MEMPCPY@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mempcpy
+# define mempcpy rpl_mempcpy
+# endif
+_GL_FUNCDECL_RPL (mempcpy, void *,
+ (void *restrict __dest, void const *restrict __src,
+ size_t __n)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (mempcpy, void *,
+ (void *restrict __dest, void const *restrict __src,
+ size_t __n));
+# else
+# if !@HAVE_MEMPCPY@
+_GL_FUNCDECL_SYS (mempcpy, void *,
+ (void *restrict __dest, void const *restrict __src,
+ size_t __n)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (mempcpy, void *,
+ (void *restrict __dest, void const *restrict __src,
+ size_t __n));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (mempcpy);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mempcpy
+# if HAVE_RAW_DECL_MEMPCPY
+_GL_WARN_ON_USE (mempcpy, "mempcpy is unportable - "
+ "use gnulib module mempcpy for portability");
+# endif
+#endif
+
+/* Search backwards through a block for a byte (specified as an int). */
+#if @GNULIB_MEMRCHR@
+# if ! @HAVE_DECL_MEMRCHR@
+_GL_FUNCDECL_SYS (memrchr, void *, (void const *, int, size_t)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" { const void * std::memrchr (const void *, int, size_t); }
+ extern "C++" { void * std::memrchr (void *, int, size_t); } */
+_GL_CXXALIAS_SYS_CAST2 (memrchr,
+ void *, (void const *, int, size_t),
+ void const *, (void const *, int, size_t));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) \
+ || defined __clang__)
+_GL_CXXALIASWARN1 (memrchr, void *, (void *, int, size_t) throw ());
+_GL_CXXALIASWARN1 (memrchr, void const *, (void const *, int, size_t) throw ());
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (memrchr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef memrchr
+# if HAVE_RAW_DECL_MEMRCHR
+_GL_WARN_ON_USE (memrchr, "memrchr is unportable - "
+ "use gnulib module memrchr for portability");
+# endif
+#endif
+
+/* Overwrite a block of memory. The compiler will not optimize
+ effects away, even if the block is dead after the call. */
+#if @GNULIB_MEMSET_EXPLICIT@
+# if ! @HAVE_MEMSET_EXPLICIT@
+_GL_FUNCDECL_SYS (memset_explicit, void *,
+ (void *__dest, int __c, size_t __n) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (memset_explicit, void *, (void *__dest, int __c, size_t __n));
+_GL_CXXALIASWARN (memset_explicit);
+#elif defined GNULIB_POSIXCHECK
+# undef memset_explicit
+# if HAVE_RAW_DECL_MEMSET_EXPLICIT
+_GL_WARN_ON_USE (memset_explicit, "memset_explicit is unportable - "
+ "use gnulib module memset_explicit for portability");
+# endif
+#endif
+
+/* Find the first occurrence of C in S. More efficient than
+ memchr(S,C,N), at the expense of undefined behavior if C does not
+ occur within N bytes. */
+#if @GNULIB_RAWMEMCHR@
+# if ! @HAVE_RAWMEMCHR@
+_GL_FUNCDECL_SYS (rawmemchr, void *, (void const *__s, int __c_in)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" { const void * std::rawmemchr (const void *, int); }
+ extern "C++" { void * std::rawmemchr (void *, int); } */
+_GL_CXXALIAS_SYS_CAST2 (rawmemchr,
+ void *, (void const *__s, int __c_in),
+ void const *, (void const *__s, int __c_in));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) \
+ || defined __clang__)
+_GL_CXXALIASWARN1 (rawmemchr, void *, (void *__s, int __c_in) throw ());
+_GL_CXXALIASWARN1 (rawmemchr, void const *,
+ (void const *__s, int __c_in) throw ());
+# else
+_GL_CXXALIASWARN (rawmemchr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef rawmemchr
+# if HAVE_RAW_DECL_RAWMEMCHR
+_GL_WARN_ON_USE (rawmemchr, "rawmemchr is unportable - "
+ "use gnulib module rawmemchr for portability");
+# endif
+#endif
+
+/* Copy SRC to DST, returning the address of the terminating '\0' in DST. */
+#if @GNULIB_STPCPY@
+# if @REPLACE_STPCPY@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef stpcpy
+# define stpcpy rpl_stpcpy
+# endif
+_GL_FUNCDECL_RPL (stpcpy, char *,
+ (char *restrict __dst, char const *restrict __src)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (stpcpy, char *,
+ (char *restrict __dst, char const *restrict __src));
+# else
+# if !@HAVE_STPCPY@
+_GL_FUNCDECL_SYS (stpcpy, char *,
+ (char *restrict __dst, char const *restrict __src)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (stpcpy, char *,
+ (char *restrict __dst, char const *restrict __src));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (stpcpy);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef stpcpy
+# if HAVE_RAW_DECL_STPCPY
+_GL_WARN_ON_USE (stpcpy, "stpcpy is unportable - "
+ "use gnulib module stpcpy for portability");
+# endif
+#endif
+
+/* Copy no more than N bytes of SRC to DST, returning a pointer past the
+ last non-NUL byte written into DST. */
+#if @GNULIB_STPNCPY@
+# if @REPLACE_STPNCPY@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef stpncpy
+# define stpncpy rpl_stpncpy
+# endif
+_GL_FUNCDECL_RPL (stpncpy, char *,
+ (char *restrict __dst, char const *restrict __src,
+ size_t __n)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (stpncpy, char *,
+ (char *restrict __dst, char const *restrict __src,
+ size_t __n));
+# else
+# if ! @HAVE_STPNCPY@
+_GL_FUNCDECL_SYS (stpncpy, char *,
+ (char *restrict __dst, char const *restrict __src,
+ size_t __n)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (stpncpy, char *,
+ (char *restrict __dst, char const *restrict __src,
+ size_t __n));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (stpncpy);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef stpncpy
+# if HAVE_RAW_DECL_STPNCPY
+_GL_WARN_ON_USE (stpncpy, "stpncpy is unportable - "
+ "use gnulib module stpncpy for portability");
+# endif
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strchr() does not work with multibyte strings if the locale encoding is
+ GB18030 and the character to be searched is a digit. */
+# undef strchr
+/* Assume strchr is always declared. */
+_GL_WARN_ON_USE_CXX (strchr,
+ const char *, char *, (const char *, int),
+ "strchr cannot work correctly on character strings "
+ "in some multibyte locales - "
+ "use mbschr if you care about internationalization");
+#endif
+
+/* Find the first occurrence of C in S or the final NUL byte. */
+#if @GNULIB_STRCHRNUL@
+# if @REPLACE_STRCHRNUL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strchrnul rpl_strchrnul
+# endif
+_GL_FUNCDECL_RPL (strchrnul, char *, (const char *__s, int __c_in)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strchrnul, char *,
+ (const char *str, int ch));
+# else
+# if ! @HAVE_STRCHRNUL@
+_GL_FUNCDECL_SYS (strchrnul, char *, (char const *__s, int __c_in)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" { const char * std::strchrnul (const char *, int); }
+ extern "C++" { char * std::strchrnul (char *, int); } */
+_GL_CXXALIAS_SYS_CAST2 (strchrnul,
+ char *, (char const *__s, int __c_in),
+ char const *, (char const *__s, int __c_in));
+# endif
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) \
+ || defined __clang__)
+_GL_CXXALIASWARN1 (strchrnul, char *, (char *__s, int __c_in) throw ());
+_GL_CXXALIASWARN1 (strchrnul, char const *,
+ (char const *__s, int __c_in) throw ());
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (strchrnul);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strchrnul
+# if HAVE_RAW_DECL_STRCHRNUL
+_GL_WARN_ON_USE (strchrnul, "strchrnul is unportable - "
+ "use gnulib module strchrnul for portability");
+# endif
+#endif
+
+/* Duplicate S, returning an identical malloc'd string. */
+#if @GNULIB_STRDUP@
+# if @REPLACE_STRDUP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strdup
+# define strdup rpl_strdup
+# endif
+_GL_FUNCDECL_RPL (strdup, char *,
+ (char const *__s)
+ _GL_ARG_NONNULL ((1))
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+_GL_CXXALIAS_RPL (strdup, char *, (char const *__s));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strdup
+# define strdup _strdup
+# endif
+_GL_CXXALIAS_MDA (strdup, char *, (char const *__s));
+# else
+# if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup
+ /* strdup exists as a function and as a macro. Get rid of the macro. */
+# undef strdup
+# endif
+# if (!@HAVE_DECL_STRDUP@ || __GNUC__ >= 11) && !defined strdup
+_GL_FUNCDECL_SYS (strdup, char *,
+ (char const *__s)
+ _GL_ARG_NONNULL ((1))
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+_GL_CXXALIAS_SYS (strdup, char *, (char const *__s));
+# endif
+_GL_CXXALIASWARN (strdup);
+#else
+# if __GNUC__ >= 11 && !defined strdup
+/* For -Wmismatched-dealloc: Associate strdup with free or rpl_free. */
+_GL_FUNCDECL_SYS (strdup, char *,
+ (char const *__s)
+ _GL_ARG_NONNULL ((1))
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+# undef strdup
+# if HAVE_RAW_DECL_STRDUP
+_GL_WARN_ON_USE (strdup, "strdup is unportable - "
+ "use gnulib module strdup for portability");
+# endif
+# elif @GNULIB_MDA_STRDUP@
+/* On native Windows, map 'creat' to '_creat', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::strdup always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strdup
+# define strdup _strdup
+# endif
+_GL_CXXALIAS_MDA (strdup, char *, (char const *__s));
+# else
+# if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup
+# undef strdup
+# endif
+_GL_CXXALIAS_SYS (strdup, char *, (char const *__s));
+# endif
+_GL_CXXALIASWARN (strdup);
+# endif
+#endif
+
+/* Append no more than N characters from SRC onto DEST. */
+#if @GNULIB_STRNCAT@
+# if @REPLACE_STRNCAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strncat
+# define strncat rpl_strncat
+# endif
+_GL_FUNCDECL_RPL (strncat, char *,
+ (char *restrict dest, const char *restrict src, size_t n)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (strncat, char *,
+ (char *restrict dest, const char *restrict src, size_t n));
+# else
+_GL_CXXALIAS_SYS (strncat, char *,
+ (char *restrict dest, const char *restrict src, size_t n));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (strncat);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strncat
+# if HAVE_RAW_DECL_STRNCAT
+_GL_WARN_ON_USE (strncat, "strncat is unportable - "
+ "use gnulib module strncat for portability");
+# endif
+#endif
+
+/* Return a newly allocated copy of at most N bytes of STRING. */
+#if @GNULIB_STRNDUP@
+# if @REPLACE_STRNDUP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strndup
+# define strndup rpl_strndup
+# endif
+_GL_FUNCDECL_RPL (strndup, char *,
+ (char const *__s, size_t __n)
+ _GL_ARG_NONNULL ((1))
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+_GL_CXXALIAS_RPL (strndup, char *, (char const *__s, size_t __n));
+# else
+# if !@HAVE_DECL_STRNDUP@ || (__GNUC__ >= 11 && !defined strndup)
+_GL_FUNCDECL_SYS (strndup, char *,
+ (char const *__s, size_t __n)
+ _GL_ARG_NONNULL ((1))
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+_GL_CXXALIAS_SYS (strndup, char *, (char const *__s, size_t __n));
+# endif
+_GL_CXXALIASWARN (strndup);
+#else
+# if __GNUC__ >= 11 && !defined strndup
+/* For -Wmismatched-dealloc: Associate strndup with free or rpl_free. */
+_GL_FUNCDECL_SYS (strndup, char *,
+ (char const *__s, size_t __n)
+ _GL_ARG_NONNULL ((1))
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+# undef strndup
+# if HAVE_RAW_DECL_STRNDUP
+_GL_WARN_ON_USE (strndup, "strndup is unportable - "
+ "use gnulib module strndup for portability");
+# endif
+# endif
+#endif
+
+/* Find the length (number of bytes) of STRING, but scan at most
+ MAXLEN bytes. If no '\0' terminator is found in that many bytes,
+ return MAXLEN. */
+#if @GNULIB_STRNLEN@
+# if @REPLACE_STRNLEN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strnlen
+# define strnlen rpl_strnlen
+# endif
+_GL_FUNCDECL_RPL (strnlen, size_t, (char const *__s, size_t __maxlen)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strnlen, size_t, (char const *__s, size_t __maxlen));
+# else
+# if ! @HAVE_DECL_STRNLEN@
+_GL_FUNCDECL_SYS (strnlen, size_t, (char const *__s, size_t __maxlen)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strnlen, size_t, (char const *__s, size_t __maxlen));
+# endif
+_GL_CXXALIASWARN (strnlen);
+#elif defined GNULIB_POSIXCHECK
+# undef strnlen
+# if HAVE_RAW_DECL_STRNLEN
+_GL_WARN_ON_USE (strnlen, "strnlen is unportable - "
+ "use gnulib module strnlen for portability");
+# endif
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strcspn() assumes the second argument is a list of single-byte characters.
+ Even in this simple case, it does not work with multibyte strings if the
+ locale encoding is GB18030 and one of the characters to be searched is a
+ digit. */
+# undef strcspn
+/* Assume strcspn is always declared. */
+_GL_WARN_ON_USE (strcspn, "strcspn cannot work correctly on character strings "
+ "in multibyte locales - "
+ "use mbscspn if you care about internationalization");
+#endif
+
+/* Find the first occurrence in S of any character in ACCEPT. */
+#if @GNULIB_STRPBRK@
+# if ! @HAVE_STRPBRK@
+_GL_FUNCDECL_SYS (strpbrk, char *, (char const *__s, char const *__accept)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C" { const char * strpbrk (const char *, const char *); }
+ extern "C++" { char * strpbrk (char *, const char *); } */
+_GL_CXXALIAS_SYS_CAST2 (strpbrk,
+ char *, (char const *__s, char const *__accept),
+ const char *, (char const *__s, char const *__accept));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) \
+ || defined __clang__)
+_GL_CXXALIASWARN1 (strpbrk, char *, (char *__s, char const *__accept) throw ());
+_GL_CXXALIASWARN1 (strpbrk, char const *,
+ (char const *__s, char const *__accept) throw ());
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (strpbrk);
+# endif
+# if defined GNULIB_POSIXCHECK
+/* strpbrk() assumes the second argument is a list of single-byte characters.
+ Even in this simple case, it does not work with multibyte strings if the
+ locale encoding is GB18030 and one of the characters to be searched is a
+ digit. */
+# undef strpbrk
+_GL_WARN_ON_USE_CXX (strpbrk,
+ const char *, char *, (const char *, const char *),
+ "strpbrk cannot work correctly on character strings "
+ "in multibyte locales - "
+ "use mbspbrk if you care about internationalization");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strpbrk
+# if HAVE_RAW_DECL_STRPBRK
+_GL_WARN_ON_USE_CXX (strpbrk,
+ const char *, char *, (const char *, const char *),
+ "strpbrk is unportable - "
+ "use gnulib module strpbrk for portability");
+# endif
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strspn() assumes the second argument is a list of single-byte characters.
+ Even in this simple case, it cannot work with multibyte strings. */
+# undef strspn
+/* Assume strspn is always declared. */
+_GL_WARN_ON_USE (strspn, "strspn cannot work correctly on character strings "
+ "in multibyte locales - "
+ "use mbsspn if you care about internationalization");
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strrchr() does not work with multibyte strings if the locale encoding is
+ GB18030 and the character to be searched is a digit. */
+# undef strrchr
+/* Assume strrchr is always declared. */
+_GL_WARN_ON_USE_CXX (strrchr,
+ const char *, char *, (const char *, int),
+ "strrchr cannot work correctly on character strings "
+ "in some multibyte locales - "
+ "use mbsrchr if you care about internationalization");
+#endif
+
+/* Search the next delimiter (char listed in DELIM) starting at *STRINGP.
+ If one is found, overwrite it with a NUL, and advance *STRINGP
+ to point to the next char after it. Otherwise, set *STRINGP to NULL.
+ If *STRINGP was already NULL, nothing happens.
+ Return the old value of *STRINGP.
+
+ This is a variant of strtok() that is multithread-safe and supports
+ empty fields.
+
+ Caveat: It modifies the original string.
+ Caveat: These functions cannot be used on constant strings.
+ Caveat: The identity of the delimiting character is lost.
+ Caveat: It doesn't work with multibyte strings unless all of the delimiter
+ characters are ASCII characters < 0x30.
+
+ See also strtok_r(). */
+#if @GNULIB_STRSEP@
+# if ! @HAVE_STRSEP@
+_GL_FUNCDECL_SYS (strsep, char *,
+ (char **restrict __stringp, char const *restrict __delim)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (strsep, char *,
+ (char **restrict __stringp, char const *restrict __delim));
+_GL_CXXALIASWARN (strsep);
+# if defined GNULIB_POSIXCHECK
+# undef strsep
+_GL_WARN_ON_USE (strsep, "strsep cannot work correctly on character strings "
+ "in multibyte locales - "
+ "use mbssep if you care about internationalization");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strsep
+# if HAVE_RAW_DECL_STRSEP
+_GL_WARN_ON_USE (strsep, "strsep is unportable - "
+ "use gnulib module strsep for portability");
+# endif
+#endif
+
+#if @GNULIB_STRSTR@
+# if @REPLACE_STRSTR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strstr rpl_strstr
+# endif
+_GL_FUNCDECL_RPL (strstr, char *, (const char *haystack, const char *needle)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (strstr, char *, (const char *haystack, const char *needle));
+# else
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" { const char * strstr (const char *, const char *); }
+ extern "C++" { char * strstr (char *, const char *); } */
+_GL_CXXALIAS_SYS_CAST2 (strstr,
+ char *, (const char *haystack, const char *needle),
+ const char *, (const char *haystack, const char *needle));
+# endif
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) \
+ || defined __clang__)
+_GL_CXXALIASWARN1 (strstr, char *,
+ (char *haystack, const char *needle) throw ());
+_GL_CXXALIASWARN1 (strstr, const char *,
+ (const char *haystack, const char *needle) throw ());
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (strstr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+/* strstr() does not work with multibyte strings if the locale encoding is
+ different from UTF-8:
+ POSIX says that it operates on "strings", and "string" in POSIX is defined
+ as a sequence of bytes, not of characters. */
+# undef strstr
+/* Assume strstr is always declared. */
+_GL_WARN_ON_USE (strstr, "strstr is quadratic on many systems, and cannot "
+ "work correctly on character strings in most "
+ "multibyte locales - "
+ "use mbsstr if you care about internationalization, "
+ "or use strstr if you care about speed");
+#endif
+
+/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
+ comparison. */
+#if @GNULIB_STRCASESTR@
+# if @REPLACE_STRCASESTR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strcasestr rpl_strcasestr
+# endif
+_GL_FUNCDECL_RPL (strcasestr, char *,
+ (const char *haystack, const char *needle)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (strcasestr, char *,
+ (const char *haystack, const char *needle));
+# else
+# if ! @HAVE_STRCASESTR@
+_GL_FUNCDECL_SYS (strcasestr, char *,
+ (const char *haystack, const char *needle)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" { const char * strcasestr (const char *, const char *); }
+ extern "C++" { char * strcasestr (char *, const char *); } */
+_GL_CXXALIAS_SYS_CAST2 (strcasestr,
+ char *, (const char *haystack, const char *needle),
+ const char *, (const char *haystack, const char *needle));
+# endif
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) \
+ || defined __clang__)
+_GL_CXXALIASWARN1 (strcasestr, char *,
+ (char *haystack, const char *needle) throw ());
+_GL_CXXALIASWARN1 (strcasestr, const char *,
+ (const char *haystack, const char *needle) throw ());
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (strcasestr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+/* strcasestr() does not work with multibyte strings:
+ It is a glibc extension, and glibc implements it only for unibyte
+ locales. */
+# undef strcasestr
+# if HAVE_RAW_DECL_STRCASESTR
+_GL_WARN_ON_USE (strcasestr, "strcasestr does work correctly on character "
+ "strings in multibyte locales - "
+ "use mbscasestr if you care about "
+ "internationalization, or use c-strcasestr if you want "
+ "a locale independent function");
+# endif
+#endif
+
+/* Parse S into tokens separated by characters in DELIM.
+ If S is NULL, the saved pointer in SAVE_PTR is used as
+ the next starting point. For example:
+ char s[] = "-abc-=-def";
+ char *sp;
+ x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def"
+ x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL
+ x = strtok_r(NULL, "=", &sp); // x = NULL
+ // s = "abc\0-def\0"
+
+ This is a variant of strtok() that is multithread-safe.
+
+ For the POSIX documentation for this function, see:
+ https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtok.html
+
+ Caveat: It modifies the original string.
+ Caveat: These functions cannot be used on constant strings.
+ Caveat: The identity of the delimiting character is lost.
+ Caveat: It doesn't work with multibyte strings unless all of the delimiter
+ characters are ASCII characters < 0x30.
+
+ See also strsep(). */
+#if @GNULIB_STRTOK_R@
+# if @REPLACE_STRTOK_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strtok_r
+# define strtok_r rpl_strtok_r
+# endif
+_GL_FUNCDECL_RPL (strtok_r, char *,
+ (char *restrict s, char const *restrict delim,
+ char **restrict save_ptr)
+ _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (strtok_r, char *,
+ (char *restrict s, char const *restrict delim,
+ char **restrict save_ptr));
+# else
+# if @UNDEFINE_STRTOK_R@ || defined GNULIB_POSIXCHECK
+# undef strtok_r
+# endif
+# if ! @HAVE_DECL_STRTOK_R@
+_GL_FUNCDECL_SYS (strtok_r, char *,
+ (char *restrict s, char const *restrict delim,
+ char **restrict save_ptr)
+ _GL_ARG_NONNULL ((2, 3)));
+# endif
+_GL_CXXALIAS_SYS (strtok_r, char *,
+ (char *restrict s, char const *restrict delim,
+ char **restrict save_ptr));
+# endif
+_GL_CXXALIASWARN (strtok_r);
+# if defined GNULIB_POSIXCHECK
+_GL_WARN_ON_USE (strtok_r, "strtok_r cannot work correctly on character "
+ "strings in multibyte locales - "
+ "use mbstok_r if you care about internationalization");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strtok_r
+# if HAVE_RAW_DECL_STRTOK_R
+_GL_WARN_ON_USE (strtok_r, "strtok_r is unportable - "
+ "use gnulib module strtok_r for portability");
+# endif
+#endif
+
+
+/* The following functions are not specified by POSIX. They are gnulib
+ extensions. */
+
+#if @GNULIB_MBSLEN@
+/* Return the number of multibyte characters in the character string STRING.
+ This considers multibyte characters, unlike strlen, which counts bytes. */
+# ifdef __MirBSD__ /* MirBSD defines mbslen as a macro. Override it. */
+# undef mbslen
+# endif
+# if @HAVE_MBSLEN@ /* AIX, OSF/1, MirBSD define mbslen already in libc. */
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define mbslen rpl_mbslen
+# endif
+_GL_FUNCDECL_RPL (mbslen, size_t, (const char *string)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mbslen, size_t, (const char *string));
+# else
+_GL_FUNCDECL_SYS (mbslen, size_t, (const char *string)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_SYS (mbslen, size_t, (const char *string));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (mbslen);
+# endif
+#endif
+
+#if @GNULIB_MBSNLEN@
+/* Return the number of multibyte characters in the character string starting
+ at STRING and ending at STRING + LEN. */
+_GL_EXTERN_C size_t mbsnlen (const char *string, size_t len)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1));
+#endif
+
+#if @GNULIB_MBSCHR@
+/* Locate the first single-byte character C in the character string STRING,
+ and return a pointer to it. Return NULL if C is not found in STRING.
+ Unlike strchr(), this function works correctly in multibyte locales with
+ encodings such as GB18030. */
+# if defined __hpux
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define mbschr rpl_mbschr /* avoid collision with HP-UX function */
+# endif
+_GL_FUNCDECL_RPL (mbschr, char *, (const char *string, int c)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mbschr, char *, (const char *string, int c));
+# else
+_GL_FUNCDECL_SYS (mbschr, char *, (const char *string, int c)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_SYS (mbschr, char *, (const char *string, int c));
+# endif
+_GL_CXXALIASWARN (mbschr);
+#endif
+
+#if @GNULIB_MBSRCHR@
+/* Locate the last single-byte character C in the character string STRING,
+ and return a pointer to it. Return NULL if C is not found in STRING.
+ Unlike strrchr(), this function works correctly in multibyte locales with
+ encodings such as GB18030. */
+# if defined __hpux || defined __INTERIX
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define mbsrchr rpl_mbsrchr /* avoid collision with system function */
+# endif
+_GL_FUNCDECL_RPL (mbsrchr, char *, (const char *string, int c)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mbsrchr, char *, (const char *string, int c));
+# else
+_GL_FUNCDECL_SYS (mbsrchr, char *, (const char *string, int c)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_SYS (mbsrchr, char *, (const char *string, int c));
+# endif
+_GL_CXXALIASWARN (mbsrchr);
+#endif
+
+#if @GNULIB_MBSSTR@
+/* Find the first occurrence of the character string NEEDLE in the character
+ string HAYSTACK. Return NULL if NEEDLE is not found in HAYSTACK.
+ Unlike strstr(), this function works correctly in multibyte locales with
+ encodings different from UTF-8. */
+_GL_EXTERN_C char * mbsstr (const char *haystack, const char *needle)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSCASECMP@
+/* Compare the character strings S1 and S2, ignoring case, returning less than,
+ equal to or greater than zero if S1 is lexicographically less than, equal to
+ or greater than S2.
+ Note: This function may, in multibyte locales, return 0 for strings of
+ different lengths!
+ Unlike strcasecmp(), this function works correctly in multibyte locales. */
+_GL_EXTERN_C int mbscasecmp (const char *s1, const char *s2)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSNCASECMP@
+/* Compare the initial segment of the character string S1 consisting of at most
+ N characters with the initial segment of the character string S2 consisting
+ of at most N characters, ignoring case, returning less than, equal to or
+ greater than zero if the initial segment of S1 is lexicographically less
+ than, equal to or greater than the initial segment of S2.
+ Note: This function may, in multibyte locales, return 0 for initial segments
+ of different lengths!
+ Unlike strncasecmp(), this function works correctly in multibyte locales.
+ But beware that N is not a byte count but a character count! */
+_GL_EXTERN_C int mbsncasecmp (const char *s1, const char *s2, size_t n)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSPCASECMP@
+/* Compare the initial segment of the character string STRING consisting of
+ at most mbslen (PREFIX) characters with the character string PREFIX,
+ ignoring case. If the two match, return a pointer to the first byte
+ after this prefix in STRING. Otherwise, return NULL.
+ Note: This function may, in multibyte locales, return non-NULL if STRING
+ is of smaller length than PREFIX!
+ Unlike strncasecmp(), this function works correctly in multibyte
+ locales. */
+_GL_EXTERN_C char * mbspcasecmp (const char *string, const char *prefix)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSCASESTR@
+/* Find the first occurrence of the character string NEEDLE in the character
+ string HAYSTACK, using case-insensitive comparison.
+ Note: This function may, in multibyte locales, return success even if
+ strlen (haystack) < strlen (needle) !
+ Unlike strcasestr(), this function works correctly in multibyte locales. */
+_GL_EXTERN_C char * mbscasestr (const char *haystack, const char *needle)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSCSPN@
+/* Find the first occurrence in the character string STRING of any character
+ in the character string ACCEPT. Return the number of bytes from the
+ beginning of the string to this occurrence, or to the end of the string
+ if none exists.
+ Unlike strcspn(), this function works correctly in multibyte locales. */
+_GL_EXTERN_C size_t mbscspn (const char *string, const char *accept)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSPBRK@
+/* Find the first occurrence in the character string STRING of any character
+ in the character string ACCEPT. Return the pointer to it, or NULL if none
+ exists.
+ Unlike strpbrk(), this function works correctly in multibyte locales. */
+# if defined __hpux
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define mbspbrk rpl_mbspbrk /* avoid collision with HP-UX function */
+# endif
+_GL_FUNCDECL_RPL (mbspbrk, char *, (const char *string, const char *accept)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (mbspbrk, char *, (const char *string, const char *accept));
+# else
+_GL_FUNCDECL_SYS (mbspbrk, char *, (const char *string, const char *accept)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_SYS (mbspbrk, char *, (const char *string, const char *accept));
+# endif
+_GL_CXXALIASWARN (mbspbrk);
+#endif
+
+#if @GNULIB_MBSSPN@
+/* Find the first occurrence in the character string STRING of any character
+ not in the character string REJECT. Return the number of bytes from the
+ beginning of the string to this occurrence, or to the end of the string
+ if none exists.
+ Unlike strspn(), this function works correctly in multibyte locales. */
+_GL_EXTERN_C size_t mbsspn (const char *string, const char *reject)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSSEP@
+/* Search the next delimiter (multibyte character listed in the character
+ string DELIM) starting at the character string *STRINGP.
+ If one is found, overwrite it with a NUL, and advance *STRINGP to point
+ to the next multibyte character after it. Otherwise, set *STRINGP to NULL.
+ If *STRINGP was already NULL, nothing happens.
+ Return the old value of *STRINGP.
+
+ This is a variant of mbstok_r() that supports empty fields.
+
+ Caveat: It modifies the original string.
+ Caveat: These functions cannot be used on constant strings.
+ Caveat: The identity of the delimiting character is lost.
+
+ See also mbstok_r(). */
+_GL_EXTERN_C char * mbssep (char **stringp, const char *delim)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSTOK_R@
+/* Parse the character string STRING into tokens separated by characters in
+ the character string DELIM.
+ If STRING is NULL, the saved pointer in SAVE_PTR is used as
+ the next starting point. For example:
+ char s[] = "-abc-=-def";
+ char *sp;
+ x = mbstok_r(s, "-", &sp); // x = "abc", sp = "=-def"
+ x = mbstok_r(NULL, "-=", &sp); // x = "def", sp = NULL
+ x = mbstok_r(NULL, "=", &sp); // x = NULL
+ // s = "abc\0-def\0"
+
+ Caveat: It modifies the original string.
+ Caveat: These functions cannot be used on constant strings.
+ Caveat: The identity of the delimiting character is lost.
+
+ See also mbssep(). */
+_GL_EXTERN_C char * mbstok_r (char *restrict string, const char *delim,
+ char **save_ptr)
+ _GL_ARG_NONNULL ((2, 3));
+#endif
+
+/* Map any int, typically from errno, into an error message. */
+#if @GNULIB_STRERROR@
+# if @REPLACE_STRERROR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strerror
+# define strerror rpl_strerror
+# endif
+_GL_FUNCDECL_RPL (strerror, char *, (int));
+_GL_CXXALIAS_RPL (strerror, char *, (int));
+# else
+_GL_CXXALIAS_SYS (strerror, char *, (int));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (strerror);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strerror
+/* Assume strerror is always declared. */
+_GL_WARN_ON_USE (strerror, "strerror is unportable - "
+ "use gnulib module strerror to guarantee non-NULL result");
+#endif
+
+/* Map any int, typically from errno, into an error message. Multithread-safe.
+ Uses the POSIX declaration, not the glibc declaration. */
+#if @GNULIB_STRERROR_R@
+# if @REPLACE_STRERROR_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strerror_r
+# define strerror_r rpl_strerror_r
+# endif
+_GL_FUNCDECL_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen));
+# else
+# if !@HAVE_DECL_STRERROR_R@
+_GL_FUNCDECL_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen));
+# endif
+# if __GLIBC__ >= 2 && @HAVE_DECL_STRERROR_R@
+_GL_CXXALIASWARN (strerror_r);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strerror_r
+# if HAVE_RAW_DECL_STRERROR_R
+_GL_WARN_ON_USE (strerror_r, "strerror_r is unportable - "
+ "use gnulib module strerror_r-posix for portability");
+# endif
+#endif
+
+/* Return the name of the system error code ERRNUM. */
+#if @GNULIB_STRERRORNAME_NP@
+# if @REPLACE_STRERRORNAME_NP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strerrorname_np
+# define strerrorname_np rpl_strerrorname_np
+# endif
+_GL_FUNCDECL_RPL (strerrorname_np, const char *, (int errnum));
+_GL_CXXALIAS_RPL (strerrorname_np, const char *, (int errnum));
+# else
+# if !@HAVE_STRERRORNAME_NP@
+_GL_FUNCDECL_SYS (strerrorname_np, const char *, (int errnum));
+# endif
+_GL_CXXALIAS_SYS (strerrorname_np, const char *, (int errnum));
+# endif
+_GL_CXXALIASWARN (strerrorname_np);
+#elif defined GNULIB_POSIXCHECK
+# undef strerrorname_np
+# if HAVE_RAW_DECL_STRERRORNAME_NP
+_GL_WARN_ON_USE (strerrorname_np, "strerrorname_np is unportable - "
+ "use gnulib module strerrorname_np for portability");
+# endif
+#endif
+
+/* Return an abbreviation string for the signal number SIG. */
+#if @GNULIB_SIGABBREV_NP@
+# if ! @HAVE_SIGABBREV_NP@
+_GL_FUNCDECL_SYS (sigabbrev_np, const char *, (int sig));
+# endif
+_GL_CXXALIAS_SYS (sigabbrev_np, const char *, (int sig));
+_GL_CXXALIASWARN (sigabbrev_np);
+#elif defined GNULIB_POSIXCHECK
+# undef sigabbrev_np
+# if HAVE_RAW_DECL_SIGABBREV_NP
+_GL_WARN_ON_USE (sigabbrev_np, "sigabbrev_np is unportable - "
+ "use gnulib module sigabbrev_np for portability");
+# endif
+#endif
+
+/* Return an English description string for the signal number SIG. */
+#if @GNULIB_SIGDESCR_NP@
+# if ! @HAVE_SIGDESCR_NP@
+_GL_FUNCDECL_SYS (sigdescr_np, const char *, (int sig));
+# endif
+_GL_CXXALIAS_SYS (sigdescr_np, const char *, (int sig));
+_GL_CXXALIASWARN (sigdescr_np);
+#elif defined GNULIB_POSIXCHECK
+# undef sigdescr_np
+# if HAVE_RAW_DECL_SIGDESCR_NP
+_GL_WARN_ON_USE (sigdescr_np, "sigdescr_np is unportable - "
+ "use gnulib module sigdescr_np for portability");
+# endif
+#endif
+
+#if @GNULIB_STRSIGNAL@
+# if @REPLACE_STRSIGNAL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strsignal rpl_strsignal
+# endif
+_GL_FUNCDECL_RPL (strsignal, char *, (int __sig));
+_GL_CXXALIAS_RPL (strsignal, char *, (int __sig));
+# else
+# if ! @HAVE_DECL_STRSIGNAL@
+_GL_FUNCDECL_SYS (strsignal, char *, (int __sig));
+# endif
+/* Need to cast, because on Cygwin 1.5.x systems, the return type is
+ 'const char *'. */
+_GL_CXXALIAS_SYS_CAST (strsignal, char *, (int __sig));
+# endif
+_GL_CXXALIASWARN (strsignal);
+#elif defined GNULIB_POSIXCHECK
+# undef strsignal
+# if HAVE_RAW_DECL_STRSIGNAL
+_GL_WARN_ON_USE (strsignal, "strsignal is unportable - "
+ "use gnulib module strsignal for portability");
+# endif
+#endif
+
+#if @GNULIB_STRVERSCMP@
+# if !@HAVE_STRVERSCMP@
+_GL_FUNCDECL_SYS (strverscmp, int, (const char *, const char *)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (strverscmp, int, (const char *, const char *));
+_GL_CXXALIASWARN (strverscmp);
+#elif defined GNULIB_POSIXCHECK
+# undef strverscmp
+# if HAVE_RAW_DECL_STRVERSCMP
+_GL_WARN_ON_USE (strverscmp, "strverscmp is unportable - "
+ "use gnulib module strverscmp for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_STRING_H */
+#endif /* _@GUARD_PREFIX@_STRING_H */
+#endif
diff --git a/lib/sys_types.in.h b/lib/sys_types.in.h
new file mode 100644
index 0000000..082a6c6
--- /dev/null
+++ b/lib/sys_types.in.h
@@ -0,0 +1,106 @@
+/* Provide a more complete sys/types.h.
+
+ Copyright (C) 2011-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined _WIN32 && !defined __CYGWIN__ \
+ && (defined __need_off_t || defined __need___off64_t \
+ || defined __need_ssize_t || defined __need_time_t)
+
+/* Special invocation convention inside mingw header files. */
+
+#@INCLUDE_NEXT@ @NEXT_SYS_TYPES_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_SYS_TYPES_H
+
+/* The include_next requires a split double-inclusion guard. */
+# define _GL_INCLUDING_SYS_TYPES_H
+#@INCLUDE_NEXT@ @NEXT_SYS_TYPES_H@
+# undef _GL_INCLUDING_SYS_TYPES_H
+
+#ifndef _@GUARD_PREFIX@_SYS_TYPES_H
+#define _@GUARD_PREFIX@_SYS_TYPES_H
+
+/* Override off_t if Large File Support is requested on native Windows. */
+#if @WINDOWS_64_BIT_OFF_T@
+/* Same as int64_t in <stdint.h>. */
+# if defined _MSC_VER
+# define off_t __int64
+# else
+# define off_t long long int
+# endif
+/* Indicator, for gnulib internal purposes. */
+# define _GL_WINDOWS_64_BIT_OFF_T 1
+#endif
+
+/* Override dev_t and ino_t if distinguishable inodes support is requested
+ on native Windows. */
+#if @WINDOWS_STAT_INODES@
+
+# if @WINDOWS_STAT_INODES@ == 2
+/* Experimental, not useful in Windows 10. */
+
+/* Define dev_t to a 64-bit type. */
+# if !defined GNULIB_defined_dev_t
+typedef unsigned long long int rpl_dev_t;
+# undef dev_t
+# define dev_t rpl_dev_t
+# define GNULIB_defined_dev_t 1
+# endif
+
+/* Define ino_t to a 128-bit type. */
+# if !defined GNULIB_defined_ino_t
+/* MSVC does not have a 128-bit integer type.
+ GCC has a 128-bit integer type __int128, but only on 64-bit targets. */
+typedef struct { unsigned long long int _gl_ino[2]; } rpl_ino_t;
+# undef ino_t
+# define ino_t rpl_ino_t
+# define GNULIB_defined_ino_t 1
+# endif
+
+# else /* @WINDOWS_STAT_INODES@ == 1 */
+
+/* Define ino_t to a 64-bit type. */
+# if !defined GNULIB_defined_ino_t
+typedef unsigned long long int rpl_ino_t;
+# undef ino_t
+# define ino_t rpl_ino_t
+# define GNULIB_defined_ino_t 1
+# endif
+
+# endif
+
+/* Indicator, for gnulib internal purposes. */
+# define _GL_WINDOWS_STAT_INODES @WINDOWS_STAT_INODES@
+
+#endif
+
+/* MSVC 9 defines size_t in <stddef.h>, not in <sys/types.h>. */
+/* But avoid namespace pollution on glibc systems. */
+#if (defined _WIN32 && ! defined __CYGWIN__) && ! defined __GLIBC__
+# include <stddef.h>
+#endif
+
+#endif /* _@GUARD_PREFIX@_SYS_TYPES_H */
+#endif /* _@GUARD_PREFIX@_SYS_TYPES_H */
+#endif /* __need_XXX */
diff --git a/lib/unictype/bitmap.h b/lib/unictype/bitmap.h
new file mode 100644
index 0000000..9da85c1
--- /dev/null
+++ b/lib/unictype/bitmap.h
@@ -0,0 +1,48 @@
+/* Three-level bitmap lookup.
+ Copyright (C) 2000-2002, 2005-2007, 2009-2023 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2000-2002.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+static inline int bitmap_lookup (const void *table, ucs4_t uc);
+
+/* These values are currently hardcoded into gen-uni-tables.c, function
+ output_predicate(). */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+
+static inline int
+bitmap_lookup (const void *table, ucs4_t uc)
+{
+ unsigned int index1 = uc >> header_0;
+ if (index1 < ((const int *) table)[0])
+ {
+ int lookup1 = ((const int *) table)[1 + index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> header_2) & header_3;
+ int lookup2 = ((const short *) table)[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc >> 5) & header_4;
+ unsigned int lookup3 = ((const unsigned int *) table)[lookup2 + index3];
+
+ return (lookup3 >> (uc & 0x1f)) & 1;
+ }
+ }
+ }
+ return 0;
+}
diff --git a/lib/unistd.c b/lib/unistd.c
new file mode 100644
index 0000000..be7a825
--- /dev/null
+++ b/lib/unistd.c
@@ -0,0 +1,22 @@
+/* Inline functions for <unistd.h>.
+
+ Copyright (C) 2012-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#define _GL_UNISTD_INLINE _GL_EXTERN_INLINE
+#include "unistd.h"
+typedef int dummy;
diff --git a/lib/unistd.in.h b/lib/unistd.in.h
new file mode 100644
index 0000000..bfc501e
--- /dev/null
+++ b/lib/unistd.in.h
@@ -0,0 +1,2393 @@
+/* Substitute for and wrapper around <unistd.h>.
+ Copyright (C) 2003-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#ifndef _@GUARD_PREFIX@_UNISTD_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if @HAVE_UNISTD_H@ && defined _GL_INCLUDING_UNISTD_H
+/* Special invocation convention:
+ - On Mac OS X 10.3.9 we have a sequence of nested includes
+ <unistd.h> -> <signal.h> -> <pthread.h> -> <unistd.h>
+ In this situation, the functions are not yet declared, therefore we cannot
+ provide the C++ aliases. */
+
+#@INCLUDE_NEXT@ @NEXT_UNISTD_H@
+
+#else
+/* Normal invocation convention. */
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_UNISTD_H@
+# define _GL_INCLUDING_UNISTD_H
+# @INCLUDE_NEXT@ @NEXT_UNISTD_H@
+# undef _GL_INCLUDING_UNISTD_H
+#endif
+
+/* Get all possible declarations of gethostname(). */
+#if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@ \
+ && !defined _GL_INCLUDING_WINSOCK2_H
+# define _GL_INCLUDING_WINSOCK2_H
+# include <winsock2.h>
+# undef _GL_INCLUDING_WINSOCK2_H
+#endif
+
+#if !defined _@GUARD_PREFIX@_UNISTD_H && !defined _GL_INCLUDING_WINSOCK2_H
+#define _@GUARD_PREFIX@_UNISTD_H
+
+/* NetBSD 5.0 mis-defines NULL. Also get size_t. */
+/* But avoid namespace pollution on glibc systems. */
+#ifndef __GLIBC__
+# include <stddef.h>
+#endif
+
+/* mingw doesn't define the SEEK_* or *_FILENO macros in <unistd.h>. */
+/* MSVC declares 'unlink' in <stdio.h>, not in <unistd.h>. We must include
+ it before we #define unlink rpl_unlink. */
+/* Cygwin 1.7.1 declares symlinkat in <stdio.h>, not in <unistd.h>. */
+/* But avoid namespace pollution on glibc systems. */
+#if (!(defined SEEK_CUR && defined SEEK_END && defined SEEK_SET) \
+ || ((@GNULIB_UNLINK@ || defined GNULIB_POSIXCHECK) \
+ && (defined _WIN32 && ! defined __CYGWIN__)) \
+ || ((@GNULIB_SYMLINKAT@ || defined GNULIB_POSIXCHECK) \
+ && defined __CYGWIN__)) \
+ && ! defined __GLIBC__
+# include <stdio.h>
+#endif
+
+/* Cygwin 1.7.1 and Android 4.3 declare unlinkat in <fcntl.h>, not in
+ <unistd.h>. */
+/* But avoid namespace pollution on glibc systems. */
+#if (@GNULIB_UNLINKAT@ || defined GNULIB_POSIXCHECK) \
+ && (defined __CYGWIN__ || defined __ANDROID__) \
+ && ! defined __GLIBC__
+# include <fcntl.h>
+#endif
+
+/* mingw fails to declare _exit in <unistd.h>. */
+/* mingw, MSVC, BeOS, Haiku declare environ in <stdlib.h>, not in
+ <unistd.h>. */
+/* Solaris declares getcwd not only in <unistd.h> but also in <stdlib.h>. */
+/* OSF Tru64 Unix cannot see gnulib rpl_strtod when system <stdlib.h> is
+ included here. */
+/* But avoid namespace pollution on glibc systems. */
+#if !defined __GLIBC__ && !defined __osf__
+# define __need_system_stdlib_h
+# include <stdlib.h>
+# undef __need_system_stdlib_h
+#endif
+
+/* Native Windows platforms declare _chdir, _getcwd, _rmdir in
+ <io.h> and/or <direct.h>, not in <unistd.h>.
+ They also declare _access(), _chmod(), _close(), _dup(), _dup2(), _isatty(),
+ _lseek(), _read(), _unlink(), _write() in <io.h>. */
+#if defined _WIN32 && !defined __CYGWIN__
+# include <io.h>
+# include <direct.h>
+#endif
+
+/* Native Windows platforms declare _execl*, _execv* in <process.h>. */
+#if defined _WIN32 && !defined __CYGWIN__
+# include <process.h>
+#endif
+
+/* AIX and OSF/1 5.1 declare getdomainname in <netdb.h>, not in <unistd.h>.
+ NonStop Kernel declares gethostname in <netdb.h>, not in <unistd.h>. */
+/* But avoid namespace pollution on glibc systems. */
+#if ((@GNULIB_GETDOMAINNAME@ && (defined _AIX || defined __osf__)) \
+ || (@GNULIB_GETHOSTNAME@ && defined __TANDEM)) \
+ && !defined __GLIBC__
+# include <netdb.h>
+#endif
+
+/* Mac OS X 10.13, Solaris 11.4, and Android 9.0 declare getentropy in
+ <sys/random.h>, not in <unistd.h>. */
+/* But avoid namespace pollution on glibc systems. */
+#if (@GNULIB_GETENTROPY@ || defined GNULIB_POSIXCHECK) \
+ && ((defined __APPLE__ && defined __MACH__) || defined __sun \
+ || defined __ANDROID__) \
+ && @UNISTD_H_HAVE_SYS_RANDOM_H@ \
+ && !defined __GLIBC__
+# include <sys/random.h>
+#endif
+
+/* Android 4.3 declares fchownat in <sys/stat.h>, not in <unistd.h>. */
+/* But avoid namespace pollution on glibc systems. */
+#if (@GNULIB_FCHOWNAT@ || defined GNULIB_POSIXCHECK) && defined __ANDROID__ \
+ && !defined __GLIBC__
+# include <sys/stat.h>
+#endif
+
+/* MSVC defines off_t in <sys/types.h>.
+ May also define off_t to a 64-bit type on native Windows. */
+/* Get off_t, ssize_t, mode_t. */
+#include <sys/types.h>
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Get getopt(), optarg, optind, opterr, optopt. */
+#if @GNULIB_GETOPT_POSIX@ && @GNULIB_UNISTD_H_GETOPT@ && !defined _GL_SYSTEM_GETOPT
+# include <getopt-cdefs.h>
+# include <getopt-pfx-core.h>
+#endif
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef _GL_UNISTD_INLINE
+# define _GL_UNISTD_INLINE _GL_INLINE
+#endif
+
+/* Hide some function declarations from <winsock2.h>. */
+
+#if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@
+# if !defined _@GUARD_PREFIX@_SYS_SOCKET_H
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef socket
+# define socket socket_used_without_including_sys_socket_h
+# undef connect
+# define connect connect_used_without_including_sys_socket_h
+# undef accept
+# define accept accept_used_without_including_sys_socket_h
+# undef bind
+# define bind bind_used_without_including_sys_socket_h
+# undef getpeername
+# define getpeername getpeername_used_without_including_sys_socket_h
+# undef getsockname
+# define getsockname getsockname_used_without_including_sys_socket_h
+# undef getsockopt
+# define getsockopt getsockopt_used_without_including_sys_socket_h
+# undef listen
+# define listen listen_used_without_including_sys_socket_h
+# undef recv
+# define recv recv_used_without_including_sys_socket_h
+# undef send
+# define send send_used_without_including_sys_socket_h
+# undef recvfrom
+# define recvfrom recvfrom_used_without_including_sys_socket_h
+# undef sendto
+# define sendto sendto_used_without_including_sys_socket_h
+# undef setsockopt
+# define setsockopt setsockopt_used_without_including_sys_socket_h
+# undef shutdown
+# define shutdown shutdown_used_without_including_sys_socket_h
+# else
+ _GL_WARN_ON_USE (socket,
+ "socket() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (connect,
+ "connect() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (accept,
+ "accept() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (bind,
+ "bind() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (getpeername,
+ "getpeername() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (getsockname,
+ "getsockname() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (getsockopt,
+ "getsockopt() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (listen,
+ "listen() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (recv,
+ "recv() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (send,
+ "send() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (recvfrom,
+ "recvfrom() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (sendto,
+ "sendto() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (setsockopt,
+ "setsockopt() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (shutdown,
+ "shutdown() used without including <sys/socket.h>");
+# endif
+# endif
+# if !defined _@GUARD_PREFIX@_SYS_SELECT_H
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef select
+# define select select_used_without_including_sys_select_h
+# else
+ _GL_WARN_ON_USE (select,
+ "select() used without including <sys/select.h>");
+# endif
+# endif
+#endif
+
+
+/* OS/2 EMX lacks these macros. */
+#ifndef STDIN_FILENO
+# define STDIN_FILENO 0
+#endif
+#ifndef STDOUT_FILENO
+# define STDOUT_FILENO 1
+#endif
+#ifndef STDERR_FILENO
+# define STDERR_FILENO 2
+#endif
+
+/* Ensure *_OK macros exist. */
+#ifndef F_OK
+# define F_OK 0
+# define X_OK 1
+# define W_OK 2
+# define R_OK 4
+#endif
+
+
+/* Declare overridden functions. */
+
+
+#if @GNULIB_ACCESS@
+# if @REPLACE_ACCESS@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef access
+# define access rpl_access
+# endif
+_GL_FUNCDECL_RPL (access, int, (const char *file, int mode)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (access, int, (const char *file, int mode));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef access
+# define access _access
+# endif
+_GL_CXXALIAS_MDA (access, int, (const char *file, int mode));
+# else
+_GL_CXXALIAS_SYS (access, int, (const char *file, int mode));
+# endif
+_GL_CXXALIASWARN (access);
+#elif defined GNULIB_POSIXCHECK
+# undef access
+# if HAVE_RAW_DECL_ACCESS
+/* The access() function is a security risk. */
+_GL_WARN_ON_USE (access, "access does not always support X_OK - "
+ "use gnulib module access for portability; "
+ "also, this function is a security risk - "
+ "use the gnulib module faccessat instead");
+# endif
+#elif @GNULIB_MDA_ACCESS@
+/* On native Windows, map 'access' to '_access', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::access always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef access
+# define access _access
+# endif
+_GL_CXXALIAS_MDA (access, int, (const char *file, int mode));
+# else
+_GL_CXXALIAS_SYS (access, int, (const char *file, int mode));
+# endif
+_GL_CXXALIASWARN (access);
+#endif
+
+
+#if @GNULIB_CHDIR@
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef chdir
+# define chdir _chdir
+# endif
+_GL_CXXALIAS_MDA (chdir, int, (const char *file));
+# else
+_GL_CXXALIAS_SYS (chdir, int, (const char *file) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIASWARN (chdir);
+#elif defined GNULIB_POSIXCHECK
+# undef chdir
+# if HAVE_RAW_DECL_CHDIR
+_GL_WARN_ON_USE (chown, "chdir is not always in <unistd.h> - "
+ "use gnulib module chdir for portability");
+# endif
+#elif @GNULIB_MDA_CHDIR@
+/* On native Windows, map 'chdir' to '_chdir', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::chdir always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef chdir
+# define chdir _chdir
+# endif
+_GL_CXXALIAS_MDA (chdir, int, (const char *file));
+# else
+_GL_CXXALIAS_SYS (chdir, int, (const char *file) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIASWARN (chdir);
+#endif
+
+
+#if @GNULIB_CHOWN@
+/* Change the owner of FILE to UID (if UID is not -1) and the group of FILE
+ to GID (if GID is not -1). Follow symbolic links.
+ Return 0 if successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/chown.html. */
+# if @REPLACE_CHOWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef chown
+# define chown rpl_chown
+# endif
+_GL_FUNCDECL_RPL (chown, int, (const char *file, uid_t uid, gid_t gid)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (chown, int, (const char *file, uid_t uid, gid_t gid));
+# else
+# if !@HAVE_CHOWN@
+_GL_FUNCDECL_SYS (chown, int, (const char *file, uid_t uid, gid_t gid)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (chown, int, (const char *file, uid_t uid, gid_t gid));
+# endif
+_GL_CXXALIASWARN (chown);
+#elif defined GNULIB_POSIXCHECK
+# undef chown
+# if HAVE_RAW_DECL_CHOWN
+_GL_WARN_ON_USE (chown, "chown fails to follow symlinks on some systems and "
+ "doesn't treat a uid or gid of -1 on some systems - "
+ "use gnulib module chown for portability");
+# endif
+#endif
+
+
+#if @GNULIB_CLOSE@
+# if @REPLACE_CLOSE@
+/* Automatically included by modules that need a replacement for close. */
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef close
+# define close rpl_close
+# endif
+_GL_FUNCDECL_RPL (close, int, (int fd));
+_GL_CXXALIAS_RPL (close, int, (int fd));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef close
+# define close _close
+# endif
+_GL_CXXALIAS_MDA (close, int, (int fd));
+# else
+_GL_CXXALIAS_SYS (close, int, (int fd));
+# endif
+_GL_CXXALIASWARN (close);
+#elif @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+# undef close
+# define close close_used_without_requesting_gnulib_module_close
+#elif defined GNULIB_POSIXCHECK
+# undef close
+/* Assume close is always declared. */
+_GL_WARN_ON_USE (close, "close does not portably work on sockets - "
+ "use gnulib module close for portability");
+#elif @GNULIB_MDA_CLOSE@
+/* On native Windows, map 'close' to '_close', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::close always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef close
+# define close _close
+# endif
+_GL_CXXALIAS_MDA (close, int, (int fd));
+# else
+_GL_CXXALIAS_SYS (close, int, (int fd));
+# endif
+_GL_CXXALIASWARN (close);
+#endif
+
+
+#if @GNULIB_COPY_FILE_RANGE@
+# if @REPLACE_COPY_FILE_RANGE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef copy_file_range
+# define copy_file_range rpl_copy_file_range
+# endif
+_GL_FUNCDECL_RPL (copy_file_range, ssize_t, (int ifd, off_t *ipos,
+ int ofd, off_t *opos,
+ size_t len, unsigned flags));
+_GL_CXXALIAS_RPL (copy_file_range, ssize_t, (int ifd, off_t *ipos,
+ int ofd, off_t *opos,
+ size_t len, unsigned flags));
+# else
+# if !@HAVE_COPY_FILE_RANGE@
+_GL_FUNCDECL_SYS (copy_file_range, ssize_t, (int ifd, off_t *ipos,
+ int ofd, off_t *opos,
+ size_t len, unsigned flags));
+# endif
+_GL_CXXALIAS_SYS (copy_file_range, ssize_t, (int ifd, off_t *ipos,
+ int ofd, off_t *opos,
+ size_t len, unsigned flags));
+# endif
+_GL_CXXALIASWARN (copy_file_range);
+#elif defined GNULIB_POSIXCHECK
+# undef copy_file_range
+# if HAVE_RAW_DECL_COPY_FILE_RANGE
+_GL_WARN_ON_USE (copy_file_range,
+ "copy_file_range is unportable - "
+ "use gnulib module copy_file_range for portability");
+# endif
+#endif
+
+
+#if @GNULIB_DUP@
+# if @REPLACE_DUP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define dup rpl_dup
+# endif
+_GL_FUNCDECL_RPL (dup, int, (int oldfd));
+_GL_CXXALIAS_RPL (dup, int, (int oldfd));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef dup
+# define dup _dup
+# endif
+_GL_CXXALIAS_MDA (dup, int, (int oldfd));
+# else
+_GL_CXXALIAS_SYS (dup, int, (int oldfd));
+# endif
+_GL_CXXALIASWARN (dup);
+#elif defined GNULIB_POSIXCHECK
+# undef dup
+# if HAVE_RAW_DECL_DUP
+_GL_WARN_ON_USE (dup, "dup is unportable - "
+ "use gnulib module dup for portability");
+# endif
+#elif @GNULIB_MDA_DUP@
+/* On native Windows, map 'dup' to '_dup', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::dup always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef dup
+# define dup _dup
+# endif
+_GL_CXXALIAS_MDA (dup, int, (int oldfd));
+# else
+_GL_CXXALIAS_SYS (dup, int, (int oldfd));
+# endif
+_GL_CXXALIASWARN (dup);
+#endif
+
+
+#if @GNULIB_DUP2@
+/* Copy the file descriptor OLDFD into file descriptor NEWFD. Do nothing if
+ NEWFD = OLDFD, otherwise close NEWFD first if it is open.
+ Return newfd if successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/dup2.html>. */
+# if @REPLACE_DUP2@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define dup2 rpl_dup2
+# endif
+_GL_FUNCDECL_RPL (dup2, int, (int oldfd, int newfd));
+_GL_CXXALIAS_RPL (dup2, int, (int oldfd, int newfd));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef dup2
+# define dup2 _dup2
+# endif
+_GL_CXXALIAS_MDA (dup2, int, (int oldfd, int newfd));
+# else
+_GL_CXXALIAS_SYS (dup2, int, (int oldfd, int newfd));
+# endif
+_GL_CXXALIASWARN (dup2);
+#elif defined GNULIB_POSIXCHECK
+# undef dup2
+# if HAVE_RAW_DECL_DUP2
+_GL_WARN_ON_USE (dup2, "dup2 is unportable - "
+ "use gnulib module dup2 for portability");
+# endif
+#elif @GNULIB_MDA_DUP2@
+/* On native Windows, map 'dup2' to '_dup2', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::dup2 always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef dup2
+# define dup2 _dup2
+# endif
+_GL_CXXALIAS_MDA (dup2, int, (int oldfd, int newfd));
+# else
+_GL_CXXALIAS_SYS (dup2, int, (int oldfd, int newfd));
+# endif
+_GL_CXXALIASWARN (dup2);
+#endif
+
+
+#if @GNULIB_DUP3@
+/* Copy the file descriptor OLDFD into file descriptor NEWFD, with the
+ specified flags.
+ The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+ and O_TEXT, O_BINARY (defined in "binary-io.h").
+ Close NEWFD first if it is open.
+ Return newfd if successful, otherwise -1 and errno set.
+ See the Linux man page at
+ <https://www.kernel.org/doc/man-pages/online/pages/man2/dup3.2.html>. */
+# if @REPLACE_DUP3@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef dup3
+# define dup3 rpl_dup3
+# endif
+_GL_FUNCDECL_RPL (dup3, int, (int oldfd, int newfd, int flags));
+_GL_CXXALIAS_RPL (dup3, int, (int oldfd, int newfd, int flags));
+# else
+# if !@HAVE_DUP3@
+_GL_FUNCDECL_SYS (dup3, int, (int oldfd, int newfd, int flags));
+# endif
+_GL_CXXALIAS_SYS (dup3, int, (int oldfd, int newfd, int flags));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (dup3);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef dup3
+# if HAVE_RAW_DECL_DUP3
+_GL_WARN_ON_USE (dup3, "dup3 is unportable - "
+ "use gnulib module dup3 for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ENVIRON@
+# if defined __CYGWIN__ && !defined __i386__
+/* The 'environ' variable is defined in a DLL. Therefore its declaration needs
+ the '__declspec(dllimport)' attribute, but the system's <unistd.h> lacks it.
+ This leads to a link error on 64-bit Cygwin when the option
+ -Wl,--disable-auto-import is in use. */
+_GL_EXTERN_C __declspec(dllimport) char **environ;
+# endif
+# if !@HAVE_DECL_ENVIRON@
+/* Set of environment variables and values. An array of strings of the form
+ "VARIABLE=VALUE", terminated with a NULL. */
+# if defined __APPLE__ && defined __MACH__
+# include <TargetConditionals.h>
+# if !TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR
+# define _GL_USE_CRT_EXTERNS
+# endif
+# endif
+# ifdef _GL_USE_CRT_EXTERNS
+# include <crt_externs.h>
+# define environ (*_NSGetEnviron ())
+# else
+# ifdef __cplusplus
+extern "C" {
+# endif
+extern char **environ;
+# ifdef __cplusplus
+}
+# endif
+# endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# if HAVE_RAW_DECL_ENVIRON
+_GL_UNISTD_INLINE char ***
+_GL_WARN_ON_USE_ATTRIBUTE ("environ is unportable - "
+ "use gnulib module environ for portability")
+rpl_environ (void)
+{
+ return &environ;
+}
+# undef environ
+# define environ (*rpl_environ ())
+# endif
+#endif
+
+
+#if @GNULIB_EUIDACCESS@
+/* Like access(), except that it uses the effective user id and group id of
+ the current process. */
+# if !@HAVE_EUIDACCESS@
+_GL_FUNCDECL_SYS (euidaccess, int, (const char *filename, int mode)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (euidaccess, int, (const char *filename, int mode));
+_GL_CXXALIASWARN (euidaccess);
+# if defined GNULIB_POSIXCHECK
+/* Like access(), this function is a security risk. */
+_GL_WARN_ON_USE (euidaccess, "the euidaccess function is a security risk - "
+ "use the gnulib module faccessat instead");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef euidaccess
+# if HAVE_RAW_DECL_EUIDACCESS
+_GL_WARN_ON_USE (euidaccess, "euidaccess is unportable - "
+ "use gnulib module euidaccess for portability");
+# endif
+#endif
+
+
+#if @GNULIB_EXECL@
+# if @REPLACE_EXECL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execl
+# define execl rpl_execl
+# endif
+_GL_FUNCDECL_RPL (execl, int, (const char *program, const char *arg, ...)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (execl, int, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execl, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execl);
+#elif defined GNULIB_POSIXCHECK
+# undef execl
+# if HAVE_RAW_DECL_EXECL
+_GL_WARN_ON_USE (execl, "execl behaves very differently on mingw - "
+ "use gnulib module execl for portability");
+# endif
+#elif @GNULIB_MDA_EXECL@
+/* On native Windows, map 'execl' to '_execl', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::execl always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execl
+# define execl _execl
+# endif
+_GL_CXXALIAS_MDA (execl, intptr_t, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execl, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execl);
+#endif
+
+#if @GNULIB_EXECLE@
+# if @REPLACE_EXECLE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execle
+# define execle rpl_execle
+# endif
+_GL_FUNCDECL_RPL (execle, int, (const char *program, const char *arg, ...)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (execle, int, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execle, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execle);
+#elif defined GNULIB_POSIXCHECK
+# undef execle
+# if HAVE_RAW_DECL_EXECLE
+_GL_WARN_ON_USE (execle, "execle behaves very differently on mingw - "
+ "use gnulib module execle for portability");
+# endif
+#elif @GNULIB_MDA_EXECLE@
+/* On native Windows, map 'execle' to '_execle', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::execle always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execle
+# define execle _execle
+# endif
+_GL_CXXALIAS_MDA (execle, intptr_t,
+ (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execle, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execle);
+#endif
+
+#if @GNULIB_EXECLP@
+# if @REPLACE_EXECLP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execlp
+# define execlp rpl_execlp
+# endif
+_GL_FUNCDECL_RPL (execlp, int, (const char *program, const char *arg, ...)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (execlp, int, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execlp, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execlp);
+#elif defined GNULIB_POSIXCHECK
+# undef execlp
+# if HAVE_RAW_DECL_EXECLP
+_GL_WARN_ON_USE (execlp, "execlp behaves very differently on mingw - "
+ "use gnulib module execlp for portability");
+# endif
+#elif @GNULIB_MDA_EXECLP@
+/* On native Windows, map 'execlp' to '_execlp', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::execlp always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execlp
+# define execlp _execlp
+# endif
+_GL_CXXALIAS_MDA (execlp, intptr_t,
+ (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execlp, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execlp);
+#endif
+
+
+#if @GNULIB_EXECV@
+# if @REPLACE_EXECV@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execv
+# define execv rpl_execv
+# endif
+_GL_FUNCDECL_RPL (execv, int, (const char *program, char * const *argv)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execv, int, (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execv, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execv);
+#elif defined GNULIB_POSIXCHECK
+# undef execv
+# if HAVE_RAW_DECL_EXECV
+_GL_WARN_ON_USE (execv, "execv behaves very differently on mingw - "
+ "use gnulib module execv for portability");
+# endif
+#elif @GNULIB_MDA_EXECV@
+/* On native Windows, map 'execv' to '_execv', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::execv always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execv
+# define execv _execv
+# endif
+_GL_CXXALIAS_MDA_CAST (execv, intptr_t,
+ (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execv, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execv);
+#endif
+
+#if @GNULIB_EXECVE@
+# if @REPLACE_EXECVE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execve
+# define execve rpl_execve
+# endif
+_GL_FUNCDECL_RPL (execve, int,
+ (const char *program, char * const *argv, char * const *env)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execve, int,
+ (const char *program, char * const *argv, char * const *env));
+# else
+_GL_CXXALIAS_SYS (execve, int,
+ (const char *program, char * const *argv, char * const *env));
+# endif
+_GL_CXXALIASWARN (execve);
+#elif defined GNULIB_POSIXCHECK
+# undef execve
+# if HAVE_RAW_DECL_EXECVE
+_GL_WARN_ON_USE (execve, "execve behaves very differently on mingw - "
+ "use gnulib module execve for portability");
+# endif
+#elif @GNULIB_MDA_EXECVE@
+/* On native Windows, map 'execve' to '_execve', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::execve always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execve
+# define execve _execve
+# endif
+_GL_CXXALIAS_MDA_CAST (execve, intptr_t,
+ (const char *program, char * const *argv,
+ char * const *env));
+# else
+_GL_CXXALIAS_SYS (execve, int,
+ (const char *program, char * const *argv, char * const *env));
+# endif
+_GL_CXXALIASWARN (execve);
+#endif
+
+#if @GNULIB_EXECVP@
+# if @REPLACE_EXECVP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execvp
+# define execvp rpl_execvp
+# endif
+_GL_FUNCDECL_RPL (execvp, int, (const char *program, char * const *argv)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execvp, int, (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execvp, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execvp);
+#elif defined GNULIB_POSIXCHECK
+# undef execvp
+# if HAVE_RAW_DECL_EXECVP
+_GL_WARN_ON_USE (execvp, "execvp behaves very differently on mingw - "
+ "use gnulib module execvp for portability");
+# endif
+#elif @GNULIB_MDA_EXECVP@
+/* On native Windows, map 'execvp' to '_execvp', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::execvp always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execvp
+# define execvp _execvp
+# endif
+_GL_CXXALIAS_MDA_CAST (execvp, intptr_t,
+ (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execvp, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execvp);
+#endif
+
+#if @GNULIB_EXECVPE@
+# if @REPLACE_EXECVPE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execvpe
+# define execvpe rpl_execvpe
+# endif
+_GL_FUNCDECL_RPL (execvpe, int,
+ (const char *program, char * const *argv, char * const *env)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execvpe, int,
+ (const char *program, char * const *argv, char * const *env));
+# else
+# if !@HAVE_DECL_EXECVPE@
+_GL_FUNCDECL_SYS (execvpe, int,
+ (const char *program, char * const *argv, char * const *env)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (execvpe, int,
+ (const char *program, char * const *argv, char * const *env));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (execvpe);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef execvpe
+# if HAVE_RAW_DECL_EXECVPE
+_GL_WARN_ON_USE (execvpe, "execvpe behaves very differently on mingw - "
+ "use gnulib module execvpe for portability");
+# endif
+#elif @GNULIB_MDA_EXECVPE@
+/* On native Windows, map 'execvpe' to '_execvpe', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::execvpe on all platforms that have
+ it. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execvpe
+# define execvpe _execvpe
+# endif
+_GL_CXXALIAS_MDA_CAST (execvpe, intptr_t,
+ (const char *program, char * const *argv,
+ char * const *env));
+# elif @HAVE_EXECVPE@
+# if !@HAVE_DECL_EXECVPE@
+_GL_FUNCDECL_SYS (execvpe, int,
+ (const char *program, char * const *argv, char * const *env)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (execvpe, int,
+ (const char *program, char * const *argv, char * const *env));
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_EXECVPE@
+_GL_CXXALIASWARN (execvpe);
+# endif
+#endif
+
+
+#if @GNULIB_FACCESSAT@
+# if @REPLACE_FACCESSAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef faccessat
+# define faccessat rpl_faccessat
+# endif
+_GL_FUNCDECL_RPL (faccessat, int,
+ (int fd, char const *name, int mode, int flag)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (faccessat, int,
+ (int fd, char const *name, int mode, int flag));
+# else
+# if !@HAVE_FACCESSAT@
+_GL_FUNCDECL_SYS (faccessat, int,
+ (int fd, char const *file, int mode, int flag)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (faccessat, int,
+ (int fd, char const *file, int mode, int flag));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (faccessat);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef faccessat
+# if HAVE_RAW_DECL_FACCESSAT
+_GL_WARN_ON_USE (faccessat, "faccessat is not portable - "
+ "use gnulib module faccessat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FCHDIR@
+/* Change the process' current working directory to the directory on which
+ the given file descriptor is open.
+ Return 0 if successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/fchdir.html>. */
+# if ! @HAVE_FCHDIR@
+_GL_FUNCDECL_SYS (fchdir, int, (int /*fd*/));
+
+/* Gnulib internal hooks needed to maintain the fchdir metadata. */
+_GL_EXTERN_C int _gl_register_fd (int fd, const char *filename)
+ _GL_ARG_NONNULL ((2));
+_GL_EXTERN_C void _gl_unregister_fd (int fd);
+_GL_EXTERN_C int _gl_register_dup (int oldfd, int newfd);
+_GL_EXTERN_C const char *_gl_directory_name (int fd);
+
+# else
+# if !@HAVE_DECL_FCHDIR@
+_GL_FUNCDECL_SYS (fchdir, int, (int /*fd*/));
+# endif
+# endif
+_GL_CXXALIAS_SYS (fchdir, int, (int /*fd*/));
+_GL_CXXALIASWARN (fchdir);
+#elif defined GNULIB_POSIXCHECK
+# undef fchdir
+# if HAVE_RAW_DECL_FCHDIR
+_GL_WARN_ON_USE (fchdir, "fchdir is unportable - "
+ "use gnulib module fchdir for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FCHOWNAT@
+# if @REPLACE_FCHOWNAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fchownat
+# define fchownat rpl_fchownat
+# endif
+_GL_FUNCDECL_RPL (fchownat, int, (int fd, char const *file,
+ uid_t owner, gid_t group, int flag)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (fchownat, int, (int fd, char const *file,
+ uid_t owner, gid_t group, int flag));
+# else
+# if !@HAVE_FCHOWNAT@
+_GL_FUNCDECL_SYS (fchownat, int, (int fd, char const *file,
+ uid_t owner, gid_t group, int flag)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (fchownat, int, (int fd, char const *file,
+ uid_t owner, gid_t group, int flag));
+# endif
+_GL_CXXALIASWARN (fchownat);
+#elif defined GNULIB_POSIXCHECK
+# undef fchownat
+# if HAVE_RAW_DECL_FCHOWNAT
+_GL_WARN_ON_USE (fchownat, "fchownat is not portable - "
+ "use gnulib module fchownat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FDATASYNC@
+/* Synchronize changes to a file.
+ Return 0 if successful, otherwise -1 and errno set.
+ See POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/fdatasync.html>. */
+# if @REPLACE_FDATASYNC@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fdatasync
+# define fdatasync rpl_fdatasync
+# endif
+_GL_FUNCDECL_RPL (fdatasync, int, (int fd));
+_GL_CXXALIAS_RPL (fdatasync, int, (int fd));
+# else
+# if !@HAVE_FDATASYNC@|| !@HAVE_DECL_FDATASYNC@
+_GL_FUNCDECL_SYS (fdatasync, int, (int fd));
+# endif
+_GL_CXXALIAS_SYS (fdatasync, int, (int fd));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fdatasync);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fdatasync
+# if HAVE_RAW_DECL_FDATASYNC
+_GL_WARN_ON_USE (fdatasync, "fdatasync is unportable - "
+ "use gnulib module fdatasync for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FSYNC@
+/* Synchronize changes, including metadata, to a file.
+ Return 0 if successful, otherwise -1 and errno set.
+ See POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/fsync.html>. */
+# if !@HAVE_FSYNC@
+_GL_FUNCDECL_SYS (fsync, int, (int fd));
+# endif
+_GL_CXXALIAS_SYS (fsync, int, (int fd));
+_GL_CXXALIASWARN (fsync);
+#elif defined GNULIB_POSIXCHECK
+# undef fsync
+# if HAVE_RAW_DECL_FSYNC
+_GL_WARN_ON_USE (fsync, "fsync is unportable - "
+ "use gnulib module fsync for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FTRUNCATE@
+/* Change the size of the file to which FD is opened to become equal to LENGTH.
+ Return 0 if successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/ftruncate.html>. */
+# if @REPLACE_FTRUNCATE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ftruncate
+# define ftruncate rpl_ftruncate
+# endif
+_GL_FUNCDECL_RPL (ftruncate, int, (int fd, off_t length));
+_GL_CXXALIAS_RPL (ftruncate, int, (int fd, off_t length));
+# else
+# if !@HAVE_FTRUNCATE@
+_GL_FUNCDECL_SYS (ftruncate, int, (int fd, off_t length));
+# endif
+_GL_CXXALIAS_SYS (ftruncate, int, (int fd, off_t length));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (ftruncate);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef ftruncate
+# if HAVE_RAW_DECL_FTRUNCATE
+_GL_WARN_ON_USE (ftruncate, "ftruncate is unportable - "
+ "use gnulib module ftruncate for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETCWD@
+/* Get the name of the current working directory, and put it in SIZE bytes
+ of BUF.
+ Return BUF if successful, or NULL if the directory couldn't be determined
+ or SIZE was too small.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html>.
+ Additionally, the gnulib module 'getcwd' guarantees the following GNU
+ extension: If BUF is NULL, an array is allocated with 'malloc'; the array
+ is SIZE bytes long, unless SIZE == 0, in which case it is as big as
+ necessary. */
+# if @REPLACE_GETCWD@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define getcwd rpl_getcwd
+# endif
+_GL_FUNCDECL_RPL (getcwd, char *, (char *buf, size_t size));
+_GL_CXXALIAS_RPL (getcwd, char *, (char *buf, size_t size));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getcwd
+# define getcwd _getcwd
+# endif
+_GL_CXXALIAS_MDA (getcwd, char *, (char *buf, size_t size));
+# else
+/* Need to cast, because on mingw, the second parameter is
+ int size. */
+_GL_CXXALIAS_SYS_CAST (getcwd, char *, (char *buf, size_t size));
+# endif
+_GL_CXXALIASWARN (getcwd);
+#elif defined GNULIB_POSIXCHECK
+# undef getcwd
+# if HAVE_RAW_DECL_GETCWD
+_GL_WARN_ON_USE (getcwd, "getcwd is unportable - "
+ "use gnulib module getcwd for portability");
+# endif
+#elif @GNULIB_MDA_GETCWD@
+/* On native Windows, map 'getcwd' to '_getcwd', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::getcwd always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getcwd
+# define getcwd _getcwd
+# endif
+/* Need to cast, because on mingw, the second parameter is either
+ 'int size' or 'size_t size'. */
+_GL_CXXALIAS_MDA_CAST (getcwd, char *, (char *buf, size_t size));
+# else
+_GL_CXXALIAS_SYS_CAST (getcwd, char *, (char *buf, size_t size));
+# endif
+_GL_CXXALIASWARN (getcwd);
+#endif
+
+
+#if @GNULIB_GETDOMAINNAME@
+/* Return the NIS domain name of the machine.
+ WARNING! The NIS domain name is unrelated to the fully qualified host name
+ of the machine. It is also unrelated to email addresses.
+ WARNING! The NIS domain name is usually the empty string or "(none)" when
+ not using NIS.
+
+ Put up to LEN bytes of the NIS domain name into NAME.
+ Null terminate it if the name is shorter than LEN.
+ If the NIS domain name is longer than LEN, set errno = EINVAL and return -1.
+ Return 0 if successful, otherwise set errno and return -1. */
+# if @REPLACE_GETDOMAINNAME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getdomainname
+# define getdomainname rpl_getdomainname
+# endif
+_GL_FUNCDECL_RPL (getdomainname, int, (char *name, size_t len)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (getdomainname, int, (char *name, size_t len));
+# else
+# if !@HAVE_DECL_GETDOMAINNAME@
+_GL_FUNCDECL_SYS (getdomainname, int, (char *name, size_t len)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (getdomainname, int, (char *name, size_t len));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (getdomainname);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getdomainname
+# if HAVE_RAW_DECL_GETDOMAINNAME
+_GL_WARN_ON_USE (getdomainname, "getdomainname is unportable - "
+ "use gnulib module getdomainname for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETDTABLESIZE@
+/* Return the maximum number of file descriptors in the current process.
+ In POSIX, this is same as sysconf (_SC_OPEN_MAX). */
+# if @REPLACE_GETDTABLESIZE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getdtablesize
+# define getdtablesize rpl_getdtablesize
+# endif
+_GL_FUNCDECL_RPL (getdtablesize, int, (void));
+_GL_CXXALIAS_RPL (getdtablesize, int, (void));
+# else
+# if !@HAVE_GETDTABLESIZE@
+_GL_FUNCDECL_SYS (getdtablesize, int, (void));
+# endif
+/* Need to cast, because on AIX, the parameter list is
+ (...). */
+_GL_CXXALIAS_SYS_CAST (getdtablesize, int, (void));
+# endif
+_GL_CXXALIASWARN (getdtablesize);
+#elif defined GNULIB_POSIXCHECK
+# undef getdtablesize
+# if HAVE_RAW_DECL_GETDTABLESIZE
+_GL_WARN_ON_USE (getdtablesize, "getdtablesize is unportable - "
+ "use gnulib module getdtablesize for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETENTROPY@
+/* Fill a buffer with random bytes. */
+# if @REPLACE_GETENTROPY@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getentropy
+# define getentropy rpl_getentropy
+# endif
+_GL_FUNCDECL_RPL (getentropy, int, (void *buffer, size_t length));
+_GL_CXXALIAS_RPL (getentropy, int, (void *buffer, size_t length));
+# else
+# if !@HAVE_GETENTROPY@
+_GL_FUNCDECL_SYS (getentropy, int, (void *buffer, size_t length));
+# endif
+_GL_CXXALIAS_SYS (getentropy, int, (void *buffer, size_t length));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (getentropy);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getentropy
+# if HAVE_RAW_DECL_GETENTROPY
+_GL_WARN_ON_USE (getentropy, "getentropy is unportable - "
+ "use gnulib module getentropy for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETGROUPS@
+/* Return the supplemental groups that the current process belongs to.
+ It is unspecified whether the effective group id is in the list.
+ If N is 0, return the group count; otherwise, N describes how many
+ entries are available in GROUPS. Return -1 and set errno if N is
+ not 0 and not large enough. Fails with ENOSYS on some systems. */
+# if @REPLACE_GETGROUPS@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getgroups
+# define getgroups rpl_getgroups
+# endif
+_GL_FUNCDECL_RPL (getgroups, int, (int n, gid_t *groups));
+_GL_CXXALIAS_RPL (getgroups, int, (int n, gid_t *groups));
+# else
+# if !@HAVE_GETGROUPS@
+_GL_FUNCDECL_SYS (getgroups, int, (int n, gid_t *groups));
+# endif
+_GL_CXXALIAS_SYS (getgroups, int, (int n, gid_t *groups));
+# endif
+_GL_CXXALIASWARN (getgroups);
+#elif defined GNULIB_POSIXCHECK
+# undef getgroups
+# if HAVE_RAW_DECL_GETGROUPS
+_GL_WARN_ON_USE (getgroups, "getgroups is unportable - "
+ "use gnulib module getgroups for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETHOSTNAME@
+/* Return the standard host name of the machine.
+ WARNING! The host name may or may not be fully qualified.
+
+ Put up to LEN bytes of the host name into NAME.
+ Null terminate it if the name is shorter than LEN.
+ If the host name is longer than LEN, set errno = EINVAL and return -1.
+ Return 0 if successful, otherwise set errno and return -1. */
+# if @UNISTD_H_HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef gethostname
+# define gethostname rpl_gethostname
+# endif
+_GL_FUNCDECL_RPL (gethostname, int, (char *name, size_t len)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (gethostname, int, (char *name, size_t len));
+# else
+# if !@HAVE_GETHOSTNAME@
+_GL_FUNCDECL_SYS (gethostname, int, (char *name, size_t len)
+ _GL_ARG_NONNULL ((1)));
+# endif
+/* Need to cast, because on Solaris 10 and OSF/1 5.1 systems, the second
+ parameter is
+ int len. */
+_GL_CXXALIAS_SYS_CAST (gethostname, int, (char *name, size_t len));
+# endif
+_GL_CXXALIASWARN (gethostname);
+#elif @UNISTD_H_HAVE_WINSOCK2_H@
+# undef gethostname
+# define gethostname gethostname_used_without_requesting_gnulib_module_gethostname
+#elif defined GNULIB_POSIXCHECK
+# undef gethostname
+# if HAVE_RAW_DECL_GETHOSTNAME
+_GL_WARN_ON_USE (gethostname, "gethostname is unportable - "
+ "use gnulib module gethostname for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETLOGIN@
+/* Returns the user's login name, or NULL if it cannot be found. Upon error,
+ returns NULL with errno set.
+
+ See <https://pubs.opengroup.org/onlinepubs/9699919799/functions/getlogin.html>.
+
+ Most programs don't need to use this function, because the information is
+ available through environment variables:
+ ${LOGNAME-$USER} on Unix platforms,
+ $USERNAME on native Windows platforms.
+ */
+# if !@HAVE_DECL_GETLOGIN@
+_GL_FUNCDECL_SYS (getlogin, char *, (void));
+# endif
+_GL_CXXALIAS_SYS (getlogin, char *, (void));
+_GL_CXXALIASWARN (getlogin);
+#elif defined GNULIB_POSIXCHECK
+# undef getlogin
+# if HAVE_RAW_DECL_GETLOGIN
+_GL_WARN_ON_USE (getlogin, "getlogin is unportable - "
+ "use gnulib module getlogin for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETLOGIN_R@
+/* Copies the user's login name to NAME.
+ The array pointed to by NAME has room for SIZE bytes.
+
+ Returns 0 if successful. Upon error, an error number is returned, or -1 in
+ the case that the login name cannot be found but no specific error is
+ provided (this case is hopefully rare but is left open by the POSIX spec).
+
+ See <https://pubs.opengroup.org/onlinepubs/9699919799/functions/getlogin.html>.
+
+ Most programs don't need to use this function, because the information is
+ available through environment variables:
+ ${LOGNAME-$USER} on Unix platforms,
+ $USERNAME on native Windows platforms.
+ */
+# if @REPLACE_GETLOGIN_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define getlogin_r rpl_getlogin_r
+# endif
+_GL_FUNCDECL_RPL (getlogin_r, int, (char *name, size_t size)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (getlogin_r, int, (char *name, size_t size));
+# else
+# if !@HAVE_DECL_GETLOGIN_R@
+_GL_FUNCDECL_SYS (getlogin_r, int, (char *name, size_t size)
+ _GL_ARG_NONNULL ((1)));
+# endif
+/* Need to cast, because on Solaris 10 systems, the second argument is
+ int size. */
+_GL_CXXALIAS_SYS_CAST (getlogin_r, int, (char *name, size_t size));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (getlogin_r);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getlogin_r
+# if HAVE_RAW_DECL_GETLOGIN_R
+_GL_WARN_ON_USE (getlogin_r, "getlogin_r is unportable - "
+ "use gnulib module getlogin_r for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETPAGESIZE@
+# if @REPLACE_GETPAGESIZE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define getpagesize rpl_getpagesize
+# endif
+_GL_FUNCDECL_RPL (getpagesize, int, (void));
+_GL_CXXALIAS_RPL (getpagesize, int, (void));
+# else
+/* On HP-UX, getpagesize exists, but it is not declared in <unistd.h> even if
+ the compiler options -D_HPUX_SOURCE -D_XOPEN_SOURCE=600 are used. */
+# if defined __hpux
+_GL_FUNCDECL_SYS (getpagesize, int, (void));
+# endif
+# if !@HAVE_GETPAGESIZE@
+# if !defined getpagesize
+/* This is for POSIX systems. */
+# if !defined _gl_getpagesize && defined _SC_PAGESIZE
+# if ! (defined __VMS && __VMS_VER < 70000000)
+# define _gl_getpagesize() sysconf (_SC_PAGESIZE)
+# endif
+# endif
+/* This is for older VMS. */
+# if !defined _gl_getpagesize && defined __VMS
+# ifdef __ALPHA
+# define _gl_getpagesize() 8192
+# else
+# define _gl_getpagesize() 512
+# endif
+# endif
+/* This is for BeOS. */
+# if !defined _gl_getpagesize && @HAVE_OS_H@
+# include <OS.h>
+# if defined B_PAGE_SIZE
+# define _gl_getpagesize() B_PAGE_SIZE
+# endif
+# endif
+/* This is for AmigaOS4.0. */
+# if !defined _gl_getpagesize && defined __amigaos4__
+# define _gl_getpagesize() 2048
+# endif
+/* This is for older Unix systems. */
+# if !defined _gl_getpagesize && @HAVE_SYS_PARAM_H@
+# include <sys/param.h>
+# ifdef EXEC_PAGESIZE
+# define _gl_getpagesize() EXEC_PAGESIZE
+# else
+# ifdef NBPG
+# ifndef CLSIZE
+# define CLSIZE 1
+# endif
+# define _gl_getpagesize() (NBPG * CLSIZE)
+# else
+# ifdef NBPC
+# define _gl_getpagesize() NBPC
+# endif
+# endif
+# endif
+# endif
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define getpagesize() _gl_getpagesize ()
+# else
+# if !GNULIB_defined_getpagesize_function
+_GL_UNISTD_INLINE int
+getpagesize ()
+{
+ return _gl_getpagesize ();
+}
+# define GNULIB_defined_getpagesize_function 1
+# endif
+# endif
+# endif
+# endif
+/* Need to cast, because on Cygwin 1.5.x systems, the return type is size_t. */
+_GL_CXXALIAS_SYS_CAST (getpagesize, int, (void));
+# endif
+# if @HAVE_DECL_GETPAGESIZE@
+_GL_CXXALIASWARN (getpagesize);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getpagesize
+# if HAVE_RAW_DECL_GETPAGESIZE
+_GL_WARN_ON_USE (getpagesize, "getpagesize is unportable - "
+ "use gnulib module getpagesize for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETPASS@
+/* Function getpass() from module 'getpass':
+ Read a password from /dev/tty or stdin.
+ Function getpass() from module 'getpass-gnu':
+ Read a password of arbitrary length from /dev/tty or stdin. */
+# if (@GNULIB_GETPASS@ && @REPLACE_GETPASS@) \
+ || (@GNULIB_GETPASS_GNU@ && @REPLACE_GETPASS_FOR_GETPASS_GNU@)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getpass
+# define getpass rpl_getpass
+# endif
+_GL_FUNCDECL_RPL (getpass, char *, (const char *prompt)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (getpass, char *, (const char *prompt));
+# else
+# if !@HAVE_GETPASS@
+_GL_FUNCDECL_SYS (getpass, char *, (const char *prompt)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (getpass, char *, (const char *prompt));
+# endif
+_GL_CXXALIASWARN (getpass);
+#elif defined GNULIB_POSIXCHECK
+# undef getpass
+# if HAVE_RAW_DECL_GETPASS
+_GL_WARN_ON_USE (getpass, "getpass is unportable - "
+ "use gnulib module getpass or getpass-gnu for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MDA_GETPID@
+/* On native Windows, map 'getpid' to '_getpid', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::getpid always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getpid
+# define getpid _getpid
+# endif
+_GL_CXXALIAS_MDA (getpid, int, (void));
+# else
+_GL_CXXALIAS_SYS (getpid, pid_t, (void));
+# endif
+_GL_CXXALIASWARN (getpid);
+#endif
+
+
+#if @GNULIB_GETUSERSHELL@
+/* Return the next valid login shell on the system, or NULL when the end of
+ the list has been reached. */
+# if !@HAVE_DECL_GETUSERSHELL@
+_GL_FUNCDECL_SYS (getusershell, char *, (void));
+# endif
+_GL_CXXALIAS_SYS (getusershell, char *, (void));
+_GL_CXXALIASWARN (getusershell);
+#elif defined GNULIB_POSIXCHECK
+# undef getusershell
+# if HAVE_RAW_DECL_GETUSERSHELL
+_GL_WARN_ON_USE (getusershell, "getusershell is unportable - "
+ "use gnulib module getusershell for portability");
+# endif
+#endif
+
+#if @GNULIB_GETUSERSHELL@
+/* Rewind to pointer that is advanced at each getusershell() call. */
+# if !@HAVE_DECL_GETUSERSHELL@
+_GL_FUNCDECL_SYS (setusershell, void, (void));
+# endif
+_GL_CXXALIAS_SYS (setusershell, void, (void));
+_GL_CXXALIASWARN (setusershell);
+#elif defined GNULIB_POSIXCHECK
+# undef setusershell
+# if HAVE_RAW_DECL_SETUSERSHELL
+_GL_WARN_ON_USE (setusershell, "setusershell is unportable - "
+ "use gnulib module getusershell for portability");
+# endif
+#endif
+
+#if @GNULIB_GETUSERSHELL@
+/* Free the pointer that is advanced at each getusershell() call and
+ associated resources. */
+# if !@HAVE_DECL_GETUSERSHELL@
+_GL_FUNCDECL_SYS (endusershell, void, (void));
+# endif
+_GL_CXXALIAS_SYS (endusershell, void, (void));
+_GL_CXXALIASWARN (endusershell);
+#elif defined GNULIB_POSIXCHECK
+# undef endusershell
+# if HAVE_RAW_DECL_ENDUSERSHELL
+_GL_WARN_ON_USE (endusershell, "endusershell is unportable - "
+ "use gnulib module getusershell for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GROUP_MEMBER@
+/* Determine whether group id is in calling user's group list. */
+# if !@HAVE_GROUP_MEMBER@
+_GL_FUNCDECL_SYS (group_member, int, (gid_t gid));
+# endif
+_GL_CXXALIAS_SYS (group_member, int, (gid_t gid));
+_GL_CXXALIASWARN (group_member);
+#elif defined GNULIB_POSIXCHECK
+# undef group_member
+# if HAVE_RAW_DECL_GROUP_MEMBER
+_GL_WARN_ON_USE (group_member, "group_member is unportable - "
+ "use gnulib module group-member for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ISATTY@
+# if @REPLACE_ISATTY@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef isatty
+# define isatty rpl_isatty
+# endif
+# define GNULIB_defined_isatty 1
+_GL_FUNCDECL_RPL (isatty, int, (int fd));
+_GL_CXXALIAS_RPL (isatty, int, (int fd));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef isatty
+# define isatty _isatty
+# endif
+_GL_CXXALIAS_MDA (isatty, int, (int fd));
+# else
+_GL_CXXALIAS_SYS (isatty, int, (int fd));
+# endif
+_GL_CXXALIASWARN (isatty);
+#elif defined GNULIB_POSIXCHECK
+# undef isatty
+# if HAVE_RAW_DECL_ISATTY
+_GL_WARN_ON_USE (isatty, "isatty has portability problems on native Windows - "
+ "use gnulib module isatty for portability");
+# endif
+#elif @GNULIB_MDA_ISATTY@
+/* On native Windows, map 'isatty' to '_isatty', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::isatty always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef isatty
+# define isatty _isatty
+# endif
+_GL_CXXALIAS_MDA (isatty, int, (int fd));
+# else
+_GL_CXXALIAS_SYS (isatty, int, (int fd));
+# endif
+_GL_CXXALIASWARN (isatty);
+#endif
+
+
+#if @GNULIB_LCHOWN@
+/* Change the owner of FILE to UID (if UID is not -1) and the group of FILE
+ to GID (if GID is not -1). Do not follow symbolic links.
+ Return 0 if successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/lchown.html>. */
+# if @REPLACE_LCHOWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef lchown
+# define lchown rpl_lchown
+# endif
+_GL_FUNCDECL_RPL (lchown, int, (char const *file, uid_t owner, gid_t group)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (lchown, int, (char const *file, uid_t owner, gid_t group));
+# else
+# if !@HAVE_LCHOWN@
+_GL_FUNCDECL_SYS (lchown, int, (char const *file, uid_t owner, gid_t group)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (lchown, int, (char const *file, uid_t owner, gid_t group));
+# endif
+_GL_CXXALIASWARN (lchown);
+#elif defined GNULIB_POSIXCHECK
+# undef lchown
+# if HAVE_RAW_DECL_LCHOWN
+_GL_WARN_ON_USE (lchown, "lchown is unportable to pre-POSIX.1-2001 systems - "
+ "use gnulib module lchown for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LINK@
+/* Create a new hard link for an existing file.
+ Return 0 if successful, otherwise -1 and errno set.
+ See POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/link.html>. */
+# if @REPLACE_LINK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define link rpl_link
+# endif
+_GL_FUNCDECL_RPL (link, int, (const char *path1, const char *path2)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (link, int, (const char *path1, const char *path2));
+# else
+# if !@HAVE_LINK@
+_GL_FUNCDECL_SYS (link, int, (const char *path1, const char *path2)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (link, int, (const char *path1, const char *path2));
+# endif
+_GL_CXXALIASWARN (link);
+#elif defined GNULIB_POSIXCHECK
+# undef link
+# if HAVE_RAW_DECL_LINK
+_GL_WARN_ON_USE (link, "link is unportable - "
+ "use gnulib module link for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LINKAT@
+/* Create a new hard link for an existing file, relative to two
+ directories. FLAG controls whether symlinks are followed.
+ Return 0 if successful, otherwise -1 and errno set. */
+# if @REPLACE_LINKAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef linkat
+# define linkat rpl_linkat
+# endif
+_GL_FUNCDECL_RPL (linkat, int,
+ (int fd1, const char *path1, int fd2, const char *path2,
+ int flag)
+ _GL_ARG_NONNULL ((2, 4)));
+_GL_CXXALIAS_RPL (linkat, int,
+ (int fd1, const char *path1, int fd2, const char *path2,
+ int flag));
+# else
+# if !@HAVE_LINKAT@
+_GL_FUNCDECL_SYS (linkat, int,
+ (int fd1, const char *path1, int fd2, const char *path2,
+ int flag)
+ _GL_ARG_NONNULL ((2, 4)));
+# endif
+_GL_CXXALIAS_SYS (linkat, int,
+ (int fd1, const char *path1, int fd2, const char *path2,
+ int flag));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (linkat);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef linkat
+# if HAVE_RAW_DECL_LINKAT
+_GL_WARN_ON_USE (linkat, "linkat is unportable - "
+ "use gnulib module linkat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LSEEK@
+/* Set the offset of FD relative to SEEK_SET, SEEK_CUR, or SEEK_END.
+ Return the new offset if successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/lseek.html>. */
+# if @REPLACE_LSEEK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define lseek rpl_lseek
+# endif
+_GL_FUNCDECL_RPL (lseek, off_t, (int fd, off_t offset, int whence));
+_GL_CXXALIAS_RPL (lseek, off_t, (int fd, off_t offset, int whence));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef lseek
+# define lseek _lseek
+# endif
+_GL_CXXALIAS_MDA (lseek, off_t, (int fd, off_t offset, int whence));
+# else
+_GL_CXXALIAS_SYS (lseek, off_t, (int fd, off_t offset, int whence));
+# endif
+_GL_CXXALIASWARN (lseek);
+#elif defined GNULIB_POSIXCHECK
+# undef lseek
+# if HAVE_RAW_DECL_LSEEK
+_GL_WARN_ON_USE (lseek, "lseek does not fail with ESPIPE on pipes on some "
+ "systems - use gnulib module lseek for portability");
+# endif
+#elif @GNULIB_MDA_LSEEK@
+/* On native Windows, map 'lseek' to '_lseek', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::lseek always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef lseek
+# define lseek _lseek
+# endif
+_GL_CXXALIAS_MDA (lseek, long, (int fd, long offset, int whence));
+# else
+_GL_CXXALIAS_SYS (lseek, off_t, (int fd, off_t offset, int whence));
+# endif
+_GL_CXXALIASWARN (lseek);
+#endif
+
+
+#if @GNULIB_PIPE@
+/* Create a pipe, defaulting to O_BINARY mode.
+ Store the read-end as fd[0] and the write-end as fd[1].
+ Return 0 upon success, or -1 with errno set upon failure. */
+# if !@HAVE_PIPE@
+_GL_FUNCDECL_SYS (pipe, int, (int fd[2]) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (pipe, int, (int fd[2]));
+_GL_CXXALIASWARN (pipe);
+#elif defined GNULIB_POSIXCHECK
+# undef pipe
+# if HAVE_RAW_DECL_PIPE
+_GL_WARN_ON_USE (pipe, "pipe is unportable - "
+ "use gnulib module pipe-posix for portability");
+# endif
+#endif
+
+
+#if @GNULIB_PIPE2@
+/* Create a pipe, applying the given flags when opening the read-end of the
+ pipe and the write-end of the pipe.
+ The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+ and O_TEXT, O_BINARY (defined in "binary-io.h").
+ Store the read-end as fd[0] and the write-end as fd[1].
+ Return 0 upon success, or -1 with errno set upon failure.
+ See also the Linux man page at
+ <https://www.kernel.org/doc/man-pages/online/pages/man2/pipe2.2.html>. */
+# if @REPLACE_PIPE2@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef pipe2
+# define pipe2 rpl_pipe2
+# endif
+_GL_FUNCDECL_RPL (pipe2, int, (int fd[2], int flags) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (pipe2, int, (int fd[2], int flags));
+# else
+_GL_FUNCDECL_SYS (pipe2, int, (int fd[2], int flags) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_SYS (pipe2, int, (int fd[2], int flags));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (pipe2);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef pipe2
+# if HAVE_RAW_DECL_PIPE2
+_GL_WARN_ON_USE (pipe2, "pipe2 is unportable - "
+ "use gnulib module pipe2 for portability");
+# endif
+#endif
+
+
+#if @GNULIB_PREAD@
+/* Read at most BUFSIZE bytes from FD into BUF, starting at OFFSET.
+ Return the number of bytes placed into BUF if successful, otherwise
+ set errno and return -1. 0 indicates EOF.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/pread.html>. */
+# if @REPLACE_PREAD@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef pread
+# define pread rpl_pread
+# endif
+_GL_FUNCDECL_RPL (pread, ssize_t,
+ (int fd, void *buf, size_t bufsize, off_t offset)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (pread, ssize_t,
+ (int fd, void *buf, size_t bufsize, off_t offset));
+# else
+# if !@HAVE_PREAD@
+_GL_FUNCDECL_SYS (pread, ssize_t,
+ (int fd, void *buf, size_t bufsize, off_t offset)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (pread, ssize_t,
+ (int fd, void *buf, size_t bufsize, off_t offset));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (pread);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef pread
+# if HAVE_RAW_DECL_PREAD
+_GL_WARN_ON_USE (pread, "pread is unportable - "
+ "use gnulib module pread for portability");
+# endif
+#endif
+
+
+#if @GNULIB_PWRITE@
+/* Write at most BUFSIZE bytes from BUF into FD, starting at OFFSET.
+ Return the number of bytes written if successful, otherwise
+ set errno and return -1. 0 indicates nothing written. See the
+ POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/pwrite.html>. */
+# if @REPLACE_PWRITE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef pwrite
+# define pwrite rpl_pwrite
+# endif
+_GL_FUNCDECL_RPL (pwrite, ssize_t,
+ (int fd, const void *buf, size_t bufsize, off_t offset)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (pwrite, ssize_t,
+ (int fd, const void *buf, size_t bufsize, off_t offset));
+# else
+# if !@HAVE_PWRITE@
+_GL_FUNCDECL_SYS (pwrite, ssize_t,
+ (int fd, const void *buf, size_t bufsize, off_t offset)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (pwrite, ssize_t,
+ (int fd, const void *buf, size_t bufsize, off_t offset));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (pwrite);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef pwrite
+# if HAVE_RAW_DECL_PWRITE
+_GL_WARN_ON_USE (pwrite, "pwrite is unportable - "
+ "use gnulib module pwrite for portability");
+# endif
+#endif
+
+
+#if @GNULIB_READ@
+/* Read up to COUNT bytes from file descriptor FD into the buffer starting
+ at BUF. See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html>. */
+# if @REPLACE_READ@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef read
+# define read rpl_read
+# endif
+_GL_FUNCDECL_RPL (read, ssize_t, (int fd, void *buf, size_t count)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (read, ssize_t, (int fd, void *buf, size_t count));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef read
+# define read _read
+# endif
+_GL_CXXALIAS_MDA (read, ssize_t, (int fd, void *buf, size_t count));
+# else
+_GL_CXXALIAS_SYS (read, ssize_t, (int fd, void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (read);
+#elif @GNULIB_MDA_READ@
+/* On native Windows, map 'read' to '_read', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::read always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef read
+# define read _read
+# endif
+# ifdef __MINGW32__
+_GL_CXXALIAS_MDA (read, int, (int fd, void *buf, unsigned int count));
+# else
+_GL_CXXALIAS_MDA (read, ssize_t, (int fd, void *buf, unsigned int count));
+# endif
+# else
+_GL_CXXALIAS_SYS (read, ssize_t, (int fd, void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (read);
+#endif
+
+
+#if @GNULIB_READLINK@
+/* Read the contents of the symbolic link FILE and place the first BUFSIZE
+ bytes of it into BUF. Return the number of bytes placed into BUF if
+ successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html>. */
+# if @REPLACE_READLINK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define readlink rpl_readlink
+# endif
+_GL_FUNCDECL_RPL (readlink, ssize_t,
+ (const char *restrict file,
+ char *restrict buf, size_t bufsize)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (readlink, ssize_t,
+ (const char *restrict file,
+ char *restrict buf, size_t bufsize));
+# else
+# if !@HAVE_READLINK@
+_GL_FUNCDECL_SYS (readlink, ssize_t,
+ (const char *restrict file,
+ char *restrict buf, size_t bufsize)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (readlink, ssize_t,
+ (const char *restrict file,
+ char *restrict buf, size_t bufsize));
+# endif
+_GL_CXXALIASWARN (readlink);
+#elif defined GNULIB_POSIXCHECK
+# undef readlink
+# if HAVE_RAW_DECL_READLINK
+_GL_WARN_ON_USE (readlink, "readlink is unportable - "
+ "use gnulib module readlink for portability");
+# endif
+#endif
+
+
+#if @GNULIB_READLINKAT@
+# if @REPLACE_READLINKAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define readlinkat rpl_readlinkat
+# endif
+_GL_FUNCDECL_RPL (readlinkat, ssize_t,
+ (int fd, char const *restrict file,
+ char *restrict buf, size_t len)
+ _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (readlinkat, ssize_t,
+ (int fd, char const *restrict file,
+ char *restrict buf, size_t len));
+# else
+# if !@HAVE_READLINKAT@
+_GL_FUNCDECL_SYS (readlinkat, ssize_t,
+ (int fd, char const *restrict file,
+ char *restrict buf, size_t len)
+ _GL_ARG_NONNULL ((2, 3)));
+# endif
+_GL_CXXALIAS_SYS (readlinkat, ssize_t,
+ (int fd, char const *restrict file,
+ char *restrict buf, size_t len));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (readlinkat);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef readlinkat
+# if HAVE_RAW_DECL_READLINKAT
+_GL_WARN_ON_USE (readlinkat, "readlinkat is not portable - "
+ "use gnulib module readlinkat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_RMDIR@
+/* Remove the directory DIR. */
+# if @REPLACE_RMDIR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define rmdir rpl_rmdir
+# endif
+_GL_FUNCDECL_RPL (rmdir, int, (char const *name) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (rmdir, int, (char const *name));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef rmdir
+# define rmdir _rmdir
+# endif
+_GL_CXXALIAS_MDA (rmdir, int, (char const *name));
+# else
+_GL_CXXALIAS_SYS (rmdir, int, (char const *name));
+# endif
+_GL_CXXALIASWARN (rmdir);
+#elif defined GNULIB_POSIXCHECK
+# undef rmdir
+# if HAVE_RAW_DECL_RMDIR
+_GL_WARN_ON_USE (rmdir, "rmdir is unportable - "
+ "use gnulib module rmdir for portability");
+# endif
+#elif @GNULIB_MDA_RMDIR@
+/* On native Windows, map 'rmdir' to '_rmdir', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::rmdir always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef rmdir
+# define rmdir _rmdir
+# endif
+_GL_CXXALIAS_MDA (rmdir, int, (char const *name));
+# else
+_GL_CXXALIAS_SYS (rmdir, int, (char const *name));
+# endif
+_GL_CXXALIASWARN (rmdir);
+#endif
+
+
+#if @GNULIB_SETHOSTNAME@
+/* Set the host name of the machine.
+ The host name may or may not be fully qualified.
+
+ Put LEN bytes of NAME into the host name.
+ Return 0 if successful, otherwise, set errno and return -1.
+
+ Platforms with no ability to set the hostname return -1 and set
+ errno = ENOSYS. */
+# if @REPLACE_SETHOSTNAME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef sethostname
+# define sethostname rpl_sethostname
+# endif
+_GL_FUNCDECL_RPL (sethostname, int, (const char *name, size_t len)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (sethostname, int, (const char *name, size_t len));
+# else
+# if !@HAVE_SETHOSTNAME@ || !@HAVE_DECL_SETHOSTNAME@
+_GL_FUNCDECL_SYS (sethostname, int, (const char *name, size_t len)
+ _GL_ARG_NONNULL ((1)));
+# endif
+/* Need to cast, because on Solaris 11 2011-10, Mac OS X 10.5, IRIX 6.5
+ and FreeBSD 6.4 the second parameter is int. On Solaris 11
+ 2011-10, the first parameter is not const. */
+_GL_CXXALIAS_SYS_CAST (sethostname, int, (const char *name, size_t len));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (sethostname);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef sethostname
+# if HAVE_RAW_DECL_SETHOSTNAME
+_GL_WARN_ON_USE (sethostname, "sethostname is unportable - "
+ "use gnulib module sethostname for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SLEEP@
+/* Pause the execution of the current thread for N seconds.
+ Returns the number of seconds left to sleep.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/sleep.html>. */
+# if @REPLACE_SLEEP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef sleep
+# define sleep rpl_sleep
+# endif
+_GL_FUNCDECL_RPL (sleep, unsigned int, (unsigned int n));
+_GL_CXXALIAS_RPL (sleep, unsigned int, (unsigned int n));
+# else
+# if !@HAVE_SLEEP@
+_GL_FUNCDECL_SYS (sleep, unsigned int, (unsigned int n));
+# endif
+_GL_CXXALIAS_SYS (sleep, unsigned int, (unsigned int n));
+# endif
+_GL_CXXALIASWARN (sleep);
+#elif defined GNULIB_POSIXCHECK
+# undef sleep
+# if HAVE_RAW_DECL_SLEEP
+_GL_WARN_ON_USE (sleep, "sleep is unportable - "
+ "use gnulib module sleep for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MDA_SWAB@
+/* On native Windows, map 'swab' to '_swab', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::swab always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef swab
+# define swab _swab
+# endif
+/* Need to cast, because in old mingw the arguments are
+ (const char *from, char *to, size_t n). */
+_GL_CXXALIAS_MDA_CAST (swab, void, (char *from, char *to, int n));
+# else
+# if defined __hpux /* HP-UX */
+_GL_CXXALIAS_SYS (swab, void, (const char *from, char *to, int n));
+# elif defined __sun && (defined __SunOS_5_10 || defined __XOPEN_OR_POSIX) && !defined _XPG4 /* Solaris */
+_GL_CXXALIAS_SYS (swab, void, (const char *from, char *to, ssize_t n));
+# else
+_GL_CXXALIAS_SYS (swab, void, (const void *from, void *to, ssize_t n));
+# endif
+# endif
+_GL_CXXALIASWARN (swab);
+#endif
+
+
+#if @GNULIB_SYMLINK@
+# if @REPLACE_SYMLINK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef symlink
+# define symlink rpl_symlink
+# endif
+_GL_FUNCDECL_RPL (symlink, int, (char const *contents, char const *file)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (symlink, int, (char const *contents, char const *file));
+# else
+# if !@HAVE_SYMLINK@
+_GL_FUNCDECL_SYS (symlink, int, (char const *contents, char const *file)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (symlink, int, (char const *contents, char const *file));
+# endif
+_GL_CXXALIASWARN (symlink);
+#elif defined GNULIB_POSIXCHECK
+# undef symlink
+# if HAVE_RAW_DECL_SYMLINK
+_GL_WARN_ON_USE (symlink, "symlink is not portable - "
+ "use gnulib module symlink for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SYMLINKAT@
+# if @REPLACE_SYMLINKAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef symlinkat
+# define symlinkat rpl_symlinkat
+# endif
+_GL_FUNCDECL_RPL (symlinkat, int,
+ (char const *contents, int fd, char const *file)
+ _GL_ARG_NONNULL ((1, 3)));
+_GL_CXXALIAS_RPL (symlinkat, int,
+ (char const *contents, int fd, char const *file));
+# else
+# if !@HAVE_SYMLINKAT@
+_GL_FUNCDECL_SYS (symlinkat, int,
+ (char const *contents, int fd, char const *file)
+ _GL_ARG_NONNULL ((1, 3)));
+# endif
+_GL_CXXALIAS_SYS (symlinkat, int,
+ (char const *contents, int fd, char const *file));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (symlinkat);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef symlinkat
+# if HAVE_RAW_DECL_SYMLINKAT
+_GL_WARN_ON_USE (symlinkat, "symlinkat is not portable - "
+ "use gnulib module symlinkat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_TRUNCATE@
+/* Change the size of the file designated by FILENAME to become equal to LENGTH.
+ Return 0 if successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/truncate.html>. */
+# if @REPLACE_TRUNCATE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef truncate
+# define truncate rpl_truncate
+# endif
+_GL_FUNCDECL_RPL (truncate, int, (const char *filename, off_t length)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (truncate, int, (const char *filename, off_t length));
+# else
+# if !@HAVE_DECL_TRUNCATE@
+_GL_FUNCDECL_SYS (truncate, int, (const char *filename, off_t length)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (truncate, int, (const char *filename, off_t length));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (truncate);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef truncate
+# if HAVE_RAW_DECL_TRUNCATE
+_GL_WARN_ON_USE (truncate, "truncate is unportable - "
+ "use gnulib module truncate for portability");
+# endif
+#endif
+
+
+#if @GNULIB_TTYNAME_R@
+/* Store at most BUFLEN characters of the pathname of the terminal FD is
+ open on in BUF. Return 0 on success, otherwise an error number. */
+# if @REPLACE_TTYNAME_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ttyname_r
+# define ttyname_r rpl_ttyname_r
+# endif
+_GL_FUNCDECL_RPL (ttyname_r, int,
+ (int fd, char *buf, size_t buflen) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (ttyname_r, int,
+ (int fd, char *buf, size_t buflen));
+# else
+# if !@HAVE_DECL_TTYNAME_R@
+_GL_FUNCDECL_SYS (ttyname_r, int,
+ (int fd, char *buf, size_t buflen) _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (ttyname_r, int,
+ (int fd, char *buf, size_t buflen));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (ttyname_r);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef ttyname_r
+# if HAVE_RAW_DECL_TTYNAME_R
+_GL_WARN_ON_USE (ttyname_r, "ttyname_r is not portable - "
+ "use gnulib module ttyname_r for portability");
+# endif
+#endif
+
+
+#if @GNULIB_UNLINK@
+# if @REPLACE_UNLINK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef unlink
+# define unlink rpl_unlink
+# endif
+_GL_FUNCDECL_RPL (unlink, int, (char const *file) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (unlink, int, (char const *file));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef unlink
+# define unlink _unlink
+# endif
+_GL_CXXALIAS_MDA (unlink, int, (char const *file));
+# else
+_GL_CXXALIAS_SYS (unlink, int, (char const *file));
+# endif
+_GL_CXXALIASWARN (unlink);
+#elif defined GNULIB_POSIXCHECK
+# undef unlink
+# if HAVE_RAW_DECL_UNLINK
+_GL_WARN_ON_USE (unlink, "unlink is not portable - "
+ "use gnulib module unlink for portability");
+# endif
+#elif @GNULIB_MDA_UNLINK@
+/* On native Windows, map 'unlink' to '_unlink', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::unlink always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef unlink
+# define unlink _unlink
+# endif
+_GL_CXXALIAS_MDA (unlink, int, (char const *file));
+# else
+_GL_CXXALIAS_SYS (unlink, int, (char const *file));
+# endif
+_GL_CXXALIASWARN (unlink);
+#endif
+
+
+#if @GNULIB_UNLINKAT@
+# if @REPLACE_UNLINKAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef unlinkat
+# define unlinkat rpl_unlinkat
+# endif
+_GL_FUNCDECL_RPL (unlinkat, int, (int fd, char const *file, int flag)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (unlinkat, int, (int fd, char const *file, int flag));
+# else
+# if !@HAVE_UNLINKAT@
+_GL_FUNCDECL_SYS (unlinkat, int, (int fd, char const *file, int flag)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (unlinkat, int, (int fd, char const *file, int flag));
+# endif
+_GL_CXXALIASWARN (unlinkat);
+#elif defined GNULIB_POSIXCHECK
+# undef unlinkat
+# if HAVE_RAW_DECL_UNLINKAT
+_GL_WARN_ON_USE (unlinkat, "unlinkat is not portable - "
+ "use gnulib module unlinkat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_USLEEP@
+/* Pause the execution of the current thread for N microseconds.
+ Returns 0 on completion, or -1 on range error.
+ See the POSIX:2001 specification
+ <https://pubs.opengroup.org/onlinepubs/009695399/functions/usleep.html>. */
+# if @REPLACE_USLEEP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef usleep
+# define usleep rpl_usleep
+# endif
+_GL_FUNCDECL_RPL (usleep, int, (useconds_t n));
+_GL_CXXALIAS_RPL (usleep, int, (useconds_t n));
+# else
+# if !@HAVE_USLEEP@
+_GL_FUNCDECL_SYS (usleep, int, (useconds_t n));
+# endif
+/* Need to cast, because on Haiku, the first parameter is
+ unsigned int n. */
+_GL_CXXALIAS_SYS_CAST (usleep, int, (useconds_t n));
+# endif
+_GL_CXXALIASWARN (usleep);
+#elif defined GNULIB_POSIXCHECK
+# undef usleep
+# if HAVE_RAW_DECL_USLEEP
+_GL_WARN_ON_USE (usleep, "usleep is unportable - "
+ "use gnulib module usleep for portability");
+# endif
+#endif
+
+
+#if @GNULIB_WRITE@
+/* Write up to COUNT bytes starting at BUF to file descriptor FD.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html>. */
+# if @REPLACE_WRITE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef write
+# define write rpl_write
+# endif
+_GL_FUNCDECL_RPL (write, ssize_t, (int fd, const void *buf, size_t count)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (write, ssize_t, (int fd, const void *buf, size_t count));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef write
+# define write _write
+# endif
+_GL_CXXALIAS_MDA (write, ssize_t, (int fd, const void *buf, size_t count));
+# else
+_GL_CXXALIAS_SYS (write, ssize_t, (int fd, const void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (write);
+#elif @GNULIB_MDA_WRITE@
+/* On native Windows, map 'write' to '_write', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::write always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef write
+# define write _write
+# endif
+# ifdef __MINGW32__
+_GL_CXXALIAS_MDA (write, int, (int fd, const void *buf, unsigned int count));
+# else
+_GL_CXXALIAS_MDA (write, ssize_t, (int fd, const void *buf, unsigned int count));
+# endif
+# else
+_GL_CXXALIAS_SYS (write, ssize_t, (int fd, const void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (write);
+#endif
+
+_GL_INLINE_HEADER_END
+
+#endif /* _@GUARD_PREFIX@_UNISTD_H */
+#endif /* _GL_INCLUDING_UNISTD_H */
+#endif /* _@GUARD_PREFIX@_UNISTD_H */
diff --git a/lib/unitypes.in.h b/lib/unitypes.in.h
new file mode 100644
index 0000000..d3a4c67
--- /dev/null
+++ b/lib/unitypes.in.h
@@ -0,0 +1,61 @@
+/* Elementary types and macros for the GNU UniString library.
+ Copyright (C) 2002, 2005-2006, 2009-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#ifndef _UNITYPES_H
+#define _UNITYPES_H
+
+/* Get uint8_t, uint16_t, uint32_t. */
+#include <stdint.h>
+
+/* Type representing a Unicode character. */
+typedef uint32_t ucs4_t;
+
+/* Attribute of a function whose result depends only on the arguments
+ (not pointers!) and which has no side effects. */
+#ifndef _UC_ATTRIBUTE_CONST
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) || defined __clang__
+# define _UC_ATTRIBUTE_CONST __attribute__ ((__const__))
+# else
+# define _UC_ATTRIBUTE_CONST
+# endif
+#endif
+
+/* Attribute of a function whose result depends only on the arguments
+ (possibly pointers) and global memory, and which has no side effects. */
+#ifndef _UC_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+# define _UC_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+# define _UC_ATTRIBUTE_PURE
+# endif
+#endif
+
+/* Qualifier in a function declaration, that asserts that the caller must
+ pass a pointer to a different object in the specified pointer argument
+ than in the other pointer arguments. */
+#ifndef _UC_RESTRICT
+# if defined __restrict \
+ || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
+ || __clang_major__ >= 3
+# define _UC_RESTRICT __restrict
+# elif 199901L <= __STDC_VERSION__ || defined restrict
+# define _UC_RESTRICT restrict
+# else
+# define _UC_RESTRICT
+# endif
+#endif
+
+#endif /* _UNITYPES_H */
diff --git a/lib/uniwidth.in.h b/lib/uniwidth.in.h
new file mode 100644
index 0000000..66829e4
--- /dev/null
+++ b/lib/uniwidth.in.h
@@ -0,0 +1,72 @@
+/* Display width functions.
+ Copyright (C) 2001-2002, 2005, 2007, 2009-2023 Free Software Foundation,
+ Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#ifndef _UNIWIDTH_H
+#define _UNIWIDTH_H
+
+#include "unitypes.h"
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get locale_charset() declaration. */
+#include "localcharset.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Display width. */
+
+/* These functions are locale dependent. The encoding argument identifies
+ the encoding (e.g. "ISO-8859-2" for Polish). */
+
+/* Determine number of column positions required for UC. */
+extern int
+ uc_width (ucs4_t uc, const char *encoding)
+ _UC_ATTRIBUTE_PURE;
+
+/* Determine number of column positions required for first N units
+ (or fewer if S ends before this) in S. */
+extern int
+ u8_width (const uint8_t *s, size_t n, const char *encoding)
+ _UC_ATTRIBUTE_PURE;
+extern int
+ u16_width (const uint16_t *s, size_t n, const char *encoding)
+ _UC_ATTRIBUTE_PURE;
+extern int
+ u32_width (const uint32_t *s, size_t n, const char *encoding)
+ _UC_ATTRIBUTE_PURE;
+
+/* Determine number of column positions required for S. */
+extern int
+ u8_strwidth (const uint8_t *s, const char *encoding)
+ _UC_ATTRIBUTE_PURE;
+extern int
+ u16_strwidth (const uint16_t *s, const char *encoding)
+ _UC_ATTRIBUTE_PURE;
+extern int
+ u32_strwidth (const uint32_t *s, const char *encoding)
+ _UC_ATTRIBUTE_PURE;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNIWIDTH_H */
diff --git a/lib/uniwidth/cjk.h b/lib/uniwidth/cjk.h
new file mode 100644
index 0000000..98f7e92
--- /dev/null
+++ b/lib/uniwidth/cjk.h
@@ -0,0 +1,37 @@
+/* Test for CJK encoding.
+ Copyright (C) 2001-2002, 2005-2007, 2009-2023 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include "streq.h"
+
+static int
+is_cjk_encoding (const char *encoding)
+{
+ if (0
+ /* Legacy Japanese encodings */
+ || STREQ_OPT (encoding, "EUC-JP", 'E', 'U', 'C', '-', 'J', 'P', 0, 0, 0)
+ /* Legacy Chinese encodings */
+ || STREQ_OPT (encoding, "GB2312", 'G', 'B', '2', '3', '1', '2', 0, 0, 0)
+ || STREQ_OPT (encoding, "GBK", 'G', 'B', 'K', 0, 0, 0, 0, 0, 0)
+ || STREQ_OPT (encoding, "EUC-TW", 'E', 'U', 'C', '-', 'T', 'W', 0, 0, 0)
+ || STREQ_OPT (encoding, "BIG5", 'B', 'I', 'G', '5', 0, 0, 0, 0, 0)
+ /* Legacy Korean encodings */
+ || STREQ_OPT (encoding, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0)
+ || STREQ_OPT (encoding, "CP949", 'C', 'P', '9', '4', '9', 0, 0, 0, 0)
+ || STREQ_OPT (encoding, "JOHAB", 'J', 'O', 'H', 'A', 'B', 0, 0, 0, 0))
+ return 1;
+ return 0;
+}
diff --git a/lib/uniwidth/width.c b/lib/uniwidth/width.c
new file mode 100644
index 0000000..c9d4d1d
--- /dev/null
+++ b/lib/uniwidth/width.c
@@ -0,0 +1,95 @@
+/* Determine display width of Unicode character.
+ Copyright (C) 2001-2002, 2006-2023 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwidth.h"
+
+#include "cjk.h"
+
+/* The non-spacing attribute table consists of:
+ * Non-spacing characters; generated from PropList.txt or
+ "grep '^[^;]*;[^;]*;[^;]*;[^;]*;NSM;' UnicodeData.txt"
+ * Format control characters; generated from
+ "grep '^[^;]*;[^;]*;Cf;' UnicodeData.txt"
+ * Zero width characters; generated from
+ "grep '^[^;]*;ZERO WIDTH ' UnicodeData.txt"
+ * Hangul Jamo characters that have conjoining behaviour:
+ - jungseong = syllable-middle vowels
+ - jongseong = syllable-final consonants
+ Rationale:
+ 1) These characters act like combining characters. They have no
+ equivalent in legacy character sets. Therefore the EastAsianWidth.txt
+ file does not really matter for them; UAX #11 East Asian Width
+ <https://www.unicode.org/reports/tr11/> makes it clear that it focus
+ is on compatibility with traditional Japanese layout.
+ By contrast, the same glyphs without conjoining behaviour are available
+ in the U+3130..U+318F block, and these characters are mapped to legacy
+ character sets, and traditional Japanese layout matters for them.
+ 2) glibc does the same thing, see
+ <https://sourceware.org/bugzilla/show_bug.cgi?id=21750>
+ <https://sourceware.org/bugzilla/show_bug.cgi?id=26120>
+ */
+#include "uniwidth/width0.h"
+
+#include "uniwidth/width2.h"
+#include "unictype/bitmap.h"
+
+#define SIZEOF(a) (sizeof(a) / sizeof(a[0]))
+
+
+/* Determine number of column positions required for UC. */
+int
+uc_width (ucs4_t uc, const char *encoding)
+{
+ /* Test for non-spacing or control character. */
+ if ((uc >> 9) < SIZEOF (nonspacing_table_ind))
+ {
+ int ind = nonspacing_table_ind[uc >> 9];
+ if (ind >= 0)
+ if ((nonspacing_table_data[64*ind + ((uc >> 3) & 63)] >> (uc & 7)) & 1)
+ {
+ if (uc > 0 && uc < 0xa0)
+ return -1;
+ else
+ return 0;
+ }
+ }
+ else if ((uc >> 9) == (0xe0000 >> 9))
+ {
+ if (uc >= 0xe0100)
+ {
+ if (uc <= 0xe01ef)
+ return 0;
+ }
+ else
+ {
+ if (uc >= 0xe0020 ? uc <= 0xe007f : uc == 0xe0001)
+ return 0;
+ }
+ }
+ /* Test for double-width character. */
+ if (bitmap_lookup (&u_width2, uc))
+ return 2;
+ /* In ancient CJK encodings, Cyrillic and most other characters are
+ double-width as well. */
+ if (uc >= 0x00A1 && uc < 0xFF61 && uc != 0x20A9
+ && is_cjk_encoding (encoding))
+ return 2;
+ return 1;
+}
diff --git a/lib/uniwidth/width0.h b/lib/uniwidth/width0.h
new file mode 100644
index 0000000..a4de856
--- /dev/null
+++ b/lib/uniwidth/width0.h
@@ -0,0 +1,494 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Table of non-spacing or control characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 15.0.0. */
+
+/* Copyright (C) 2000-2022 Free Software Foundation, Inc.
+
+ This file is free software.
+ It is dual-licensed under "the GNU LGPLv3+ or the GNU GPLv2+".
+ You can redistribute it and/or modify it under either
+ - the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation, either version 3, or (at your
+ option) any later version, or
+ - 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, or
+ - the same dual license "the GNU LGPLv3+ or the GNU GPLv2+".
+
+ This file 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
+ Lesser General Public License and the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License and of the GNU General Public License along with this
+ program. If not, see <https://www.gnu.org/licenses/>. */
+
+static const unsigned char nonspacing_table_data[48*64] = {
+ /* 0x0000-0x01ff */
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, /* 0x0000-0x003f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, /* 0x0040-0x007f */
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x20, 0x00, 0x00, /* 0x0080-0x00bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00c0-0x00ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0100-0x013f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0140-0x017f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0180-0x01bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x01c0-0x01ff */
+ /* 0x0200-0x03ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0200-0x023f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0240-0x027f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0280-0x02bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x02c0-0x02ff */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x0300-0x033f */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, /* 0x0340-0x037f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0380-0x03bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x03c0-0x03ff */
+ /* 0x0400-0x05ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0400-0x043f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0440-0x047f */
+ 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0480-0x04bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x04c0-0x04ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0500-0x053f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0540-0x057f */
+ 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xbf, /* 0x0580-0x05bf */
+ 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x05c0-0x05ff */
+ /* 0x0600-0x07ff */
+ 0x3f, 0x00, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, /* 0x0600-0x063f */
+ 0x00, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x01, 0x00, /* 0x0640-0x067f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0680-0x06bf */
+ 0x00, 0x00, 0xc0, 0xbf, 0x9f, 0x3d, 0x00, 0x00, /* 0x06c0-0x06ff */
+ 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, /* 0x0700-0x073f */
+ 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0740-0x077f */
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x01, 0x00, /* 0x0780-0x07bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x20, /* 0x07c0-0x07ff */
+ /* 0x0800-0x09ff */
+ 0x00, 0x00, 0xc0, 0xfb, 0xef, 0x3e, 0x00, 0x00, /* 0x0800-0x083f */
+ 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, /* 0x0840-0x087f */
+ 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, /* 0x0880-0x08bf */
+ 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08c0-0x08ff */
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, /* 0x0900-0x093f */
+ 0xfe, 0x21, 0xfe, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0940-0x097f */
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0980-0x09bf */
+ 0x1e, 0x20, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x40, /* 0x09c0-0x09ff */
+ /* 0x0a00-0x0bff */
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0a00-0x0a3f */
+ 0x86, 0x39, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, /* 0x0a40-0x0a7f */
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0a80-0x0abf */
+ 0xbe, 0x21, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xfc, /* 0x0ac0-0x0aff */
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, /* 0x0b00-0x0b3f */
+ 0x1e, 0x20, 0x60, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0b40-0x0b7f */
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0b80-0x0bbf */
+ 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0bc0-0x0bff */
+ /* 0x0c00-0x0dff */
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, /* 0x0c00-0x0c3f */
+ 0xc1, 0x3d, 0x60, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0c40-0x0c7f */
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0c80-0x0cbf */
+ 0x00, 0x30, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0cc0-0x0cff */
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, /* 0x0d00-0x0d3f */
+ 0x1e, 0x20, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0d40-0x0d7f */
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0d80-0x0dbf */
+ 0x00, 0x04, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0dc0-0x0dff */
+ /* 0x0e00-0x0fff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x07, /* 0x0e00-0x0e3f */
+ 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0e40-0x0e7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x1f, /* 0x0e80-0x0ebf */
+ 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0ec0-0x0eff */
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xa0, 0x02, /* 0x0f00-0x0f3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x7f, /* 0x0f40-0x0f7f */
+ 0xdf, 0xe0, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x1f, /* 0x0f80-0x0fbf */
+ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0fc0-0x0fff */
+ /* 0x1000-0x11ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0x66, /* 0x1000-0x103f */
+ 0x00, 0x00, 0x00, 0xc3, 0x01, 0x00, 0x1e, 0x00, /* 0x1040-0x107f */
+ 0x64, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, /* 0x1080-0x10bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10c0-0x10ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1100-0x113f */
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, /* 0x1140-0x117f */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x1180-0x11bf */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x11c0-0x11ff */
+ /* 0x1200-0x13ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1200-0x123f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1240-0x127f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1280-0x12bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x12c0-0x12ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1300-0x133f */
+ 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, /* 0x1340-0x137f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1380-0x13bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x13c0-0x13ff */
+ /* 0x1600-0x17ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1600-0x163f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1640-0x167f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1680-0x16bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16c0-0x16ff */
+ 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x0c, 0x00, /* 0x1700-0x173f */
+ 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, /* 0x1740-0x177f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x3f, /* 0x1780-0x17bf */
+ 0x40, 0xfe, 0x0f, 0x20, 0x00, 0x00, 0x00, 0x00, /* 0x17c0-0x17ff */
+ /* 0x1800-0x19ff */
+ 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1800-0x183f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1840-0x187f */
+ 0x60, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, /* 0x1880-0x18bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18c0-0x18ff */
+ 0x00, 0x00, 0x00, 0x00, 0x87, 0x01, 0x04, 0x0e, /* 0x1900-0x193f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1940-0x197f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1980-0x19bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x19c0-0x19ff */
+ /* 0x1a00-0x1bff */
+ 0x00, 0x00, 0x80, 0x09, 0x00, 0x00, 0x00, 0x00, /* 0x1a00-0x1a3f */
+ 0x00, 0x00, 0x40, 0x7f, 0xe5, 0x1f, 0xf8, 0x9f, /* 0x1a40-0x1a7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, /* 0x1a80-0x1abf */
+ 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1ac0-0x1aff */
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x17, /* 0x1b00-0x1b3f */
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x00, /* 0x1b40-0x1b7f */
+ 0x03, 0x00, 0x00, 0x00, 0x3c, 0x3b, 0x00, 0x00, /* 0x1b80-0x1bbf */
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa3, 0x03, 0x00, /* 0x1bc0-0x1bff */
+ /* 0x1c00-0x1dff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xcf, 0x00, /* 0x1c00-0x1c3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1c40-0x1c7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1c80-0x1cbf */
+ 0x00, 0x00, 0xf7, 0xff, 0xfd, 0x21, 0x10, 0x03, /* 0x1cc0-0x1cff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d00-0x1d3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d40-0x1d7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d80-0x1dbf */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x1dc0-0x1dff */
+ /* 0x2000-0x21ff */
+ 0x00, 0xf8, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, /* 0x2000-0x203f */
+ 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0x00, 0x00, /* 0x2040-0x207f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2080-0x20bf */
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, /* 0x20c0-0x20ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2100-0x213f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2140-0x217f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2180-0x21bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x21c0-0x21ff */
+ /* 0x2c00-0x2dff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2c00-0x2c3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2c40-0x2c7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2c80-0x2cbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, /* 0x2cc0-0x2cff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2d00-0x2d3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, /* 0x2d40-0x2d7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2d80-0x2dbf */
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, /* 0x2dc0-0x2dff */
+ /* 0x3000-0x31ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, /* 0x3000-0x303f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3040-0x307f */
+ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, /* 0x3080-0x30bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30c0-0x30ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3100-0x313f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3140-0x317f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3180-0x31bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x31c0-0x31ff */
+ /* 0xa600-0xa7ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa600-0xa63f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf7, 0x3f, /* 0xa640-0xa67f */
+ 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, /* 0xa680-0xa6bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, /* 0xa6c0-0xa6ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa700-0xa73f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa740-0xa77f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa780-0xa7bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa7c0-0xa7ff */
+ /* 0xa800-0xa9ff */
+ 0x44, 0x08, 0x00, 0x00, 0x60, 0x10, 0x00, 0x00, /* 0xa800-0xa83f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa840-0xa87f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa880-0xa8bf */
+ 0x30, 0x00, 0x00, 0x00, 0xff, 0xff, 0x03, 0x80, /* 0xa8c0-0xa8ff */
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, /* 0xa900-0xa93f */
+ 0x80, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa940-0xa97f */
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x33, /* 0xa980-0xa9bf */
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, /* 0xa9c0-0xa9ff */
+ /* 0xaa00-0xabff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x66, 0x00, /* 0xaa00-0xaa3f */
+ 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0xaa40-0xaa7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9d, 0xc1, /* 0xaa80-0xaabf */
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0x00, /* 0xaac0-0xaaff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xab00-0xab3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xab40-0xab7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xab80-0xabbf */
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x00, 0x00, /* 0xabc0-0xabff */
+ /* 0xd600-0xd7ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd600-0xd63f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd640-0xd67f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd680-0xd6bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd6c0-0xd6ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd700-0xd73f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd740-0xd77f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, /* 0xd780-0xd7bf */
+ 0x7f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, /* 0xd7c0-0xd7ff */
+ /* 0xfa00-0xfbff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfa00-0xfa3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfa40-0xfa7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfa80-0xfabf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfac0-0xfaff */
+ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, /* 0xfb00-0xfb3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfb40-0xfb7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfb80-0xfbbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfbc0-0xfbff */
+ /* 0xfe00-0xffff */
+ 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, /* 0xfe00-0xfe3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfe40-0xfe7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfe80-0xfebf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, /* 0xfec0-0xfeff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xff00-0xff3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xff40-0xff7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xff80-0xffbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, /* 0xffc0-0xffff */
+ /* 0x10000-0x101ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10000-0x1003f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10040-0x1007f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10080-0x100bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x100c0-0x100ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10100-0x1013f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10140-0x1017f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10180-0x101bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, /* 0x101c0-0x101ff */
+ /* 0x10200-0x103ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10200-0x1023f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10240-0x1027f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10280-0x102bf */
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, /* 0x102c0-0x102ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10300-0x1033f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, /* 0x10340-0x1037f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10380-0x103bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x103c0-0x103ff */
+ /* 0x10a00-0x10bff */
+ 0x6e, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, /* 0x10a00-0x10a3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10a40-0x10a7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10a80-0x10abf */
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, /* 0x10ac0-0x10aff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10b00-0x10b3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10b40-0x10b7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10b80-0x10bbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10bc0-0x10bff */
+ /* 0x10c00-0x10dff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10c00-0x10c3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10c40-0x10c7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10c80-0x10cbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10cc0-0x10cff */
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, /* 0x10d00-0x10d3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10d40-0x10d7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10d80-0x10dbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10dc0-0x10dff */
+ /* 0x10e00-0x10fff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10e00-0x10e3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10e40-0x10e7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, /* 0x10e80-0x10ebf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, /* 0x10ec0-0x10eff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10f00-0x10f3f */
+ 0xc0, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10f40-0x10f7f */
+ 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10f80-0x10fbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10fc0-0x10fff */
+ /* 0x11000-0x111ff */
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, /* 0x11000-0x1103f */
+ 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x80, /* 0x11040-0x1107f */
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x26, /* 0x11080-0x110bf */
+ 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x110c0-0x110ff */
+ 0x07, 0x00, 0x00, 0x00, 0x80, 0xef, 0x1f, 0x00, /* 0x11100-0x1113f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, /* 0x11140-0x1117f */
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x7f, /* 0x11180-0x111bf */
+ 0x00, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x111c0-0x111ff */
+ /* 0x11200-0x113ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xd3, 0x40, /* 0x11200-0x1123f */
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11240-0x1127f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11280-0x112bf */
+ 0x00, 0x00, 0x00, 0x80, 0xf8, 0x07, 0x00, 0x00, /* 0x112c0-0x112ff */
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, /* 0x11300-0x1133f */
+ 0x01, 0x00, 0x00, 0x00, 0xc0, 0x1f, 0x1f, 0x00, /* 0x11340-0x1137f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11380-0x113bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x113c0-0x113ff */
+ /* 0x11400-0x115ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, /* 0x11400-0x1143f */
+ 0x5c, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, /* 0x11440-0x1147f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x85, /* 0x11480-0x114bf */
+ 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x114c0-0x114ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11500-0x1153f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11540-0x1157f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xb0, /* 0x11580-0x115bf */
+ 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, /* 0x115c0-0x115ff */
+ /* 0x11600-0x117ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xa7, /* 0x11600-0x1163f */
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11640-0x1167f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xbf, 0x00, /* 0x11680-0x116bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x116c0-0x116ff */
+ 0x00, 0x00, 0x00, 0xe0, 0xbc, 0x0f, 0x00, 0x00, /* 0x11700-0x1173f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11740-0x1177f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11780-0x117bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x117c0-0x117ff */
+ /* 0x11800-0x119ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x06, /* 0x11800-0x1183f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11840-0x1187f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11880-0x118bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x118c0-0x118ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, /* 0x11900-0x1193f */
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11940-0x1197f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11980-0x119bf */
+ 0x00, 0x00, 0xf0, 0x0c, 0x01, 0x00, 0x00, 0x00, /* 0x119c0-0x119ff */
+ /* 0x11a00-0x11bff */
+ 0x7e, 0x06, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x79, /* 0x11a00-0x11a3f */
+ 0x80, 0x00, 0x7e, 0x0e, 0x00, 0x00, 0x00, 0x00, /* 0x11a40-0x11a7f */
+ 0x00, 0xfc, 0x7f, 0x03, 0x00, 0x00, 0x00, 0x00, /* 0x11a80-0x11abf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11ac0-0x11aff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11b00-0x11b3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11b40-0x11b7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11b80-0x11bbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11bc0-0x11bff */
+ /* 0x11c00-0x11dff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x3f, /* 0x11c00-0x11c3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11c40-0x11c7f */
+ 0x00, 0x00, 0xfc, 0xff, 0xff, 0xfc, 0x6d, 0x00, /* 0x11c80-0x11cbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11cc0-0x11cff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xb4, /* 0x11d00-0x11d3f */
+ 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11d40-0x11d7f */
+ 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11d80-0x11dbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11dc0-0x11dff */
+ /* 0x11e00-0x11fff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11e00-0x11e3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11e40-0x11e7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11e80-0x11ebf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, /* 0x11ec0-0x11eff */
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, /* 0x11f00-0x11f3f */
+ 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11f40-0x11f7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11f80-0x11fbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11fc0-0x11fff */
+ /* 0x13400-0x135ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, /* 0x13400-0x1343f */
+ 0x81, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x13440-0x1347f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x13480-0x134bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x134c0-0x134ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x13500-0x1353f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x13540-0x1357f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x13580-0x135bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x135c0-0x135ff */
+ /* 0x16a00-0x16bff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16a00-0x16a3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16a40-0x16a7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16a80-0x16abf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, /* 0x16ac0-0x16aff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, /* 0x16b00-0x16b3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16b40-0x16b7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16b80-0x16bbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16bc0-0x16bff */
+ /* 0x16e00-0x16fff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16e00-0x16e3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16e40-0x16e7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16e80-0x16ebf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16ec0-0x16eff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16f00-0x16f3f */
+ 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16f40-0x16f7f */
+ 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16f80-0x16fbf */
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, /* 0x16fc0-0x16fff */
+ /* 0x1bc00-0x1bdff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bc00-0x1bc3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bc40-0x1bc7f */
+ 0x00, 0x00, 0x00, 0x60, 0x0f, 0x00, 0x00, 0x00, /* 0x1bc80-0x1bcbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bcc0-0x1bcff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bd00-0x1bd3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bd40-0x1bd7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bd80-0x1bdbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bdc0-0x1bdff */
+ /* 0x1ce00-0x1cfff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1ce00-0x1ce3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1ce40-0x1ce7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1ce80-0x1cebf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1cec0-0x1ceff */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, /* 0x1cf00-0x1cf3f */
+ 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1cf40-0x1cf7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1cf80-0x1cfbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1cfc0-0x1cfff */
+ /* 0x1d000-0x1d1ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d000-0x1d03f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d040-0x1d07f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d080-0x1d0bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d0c0-0x1d0ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d100-0x1d13f */
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0xf8, 0xff, /* 0x1d140-0x1d17f */
+ 0xe7, 0x0f, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, /* 0x1d180-0x1d1bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d1c0-0x1d1ff */
+ /* 0x1d200-0x1d3ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d200-0x1d23f */
+ 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d240-0x1d27f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d280-0x1d2bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d2c0-0x1d2ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d300-0x1d33f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d340-0x1d37f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d380-0x1d3bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d3c0-0x1d3ff */
+ /* 0x1da00-0x1dbff */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf8, /* 0x1da00-0x1da3f */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x20, 0x00, /* 0x1da40-0x1da7f */
+ 0x10, 0x00, 0x00, 0xf8, 0xfe, 0xff, 0x00, 0x00, /* 0x1da80-0x1dabf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1dac0-0x1daff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1db00-0x1db3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1db40-0x1db7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1db80-0x1dbbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1dbc0-0x1dbff */
+ /* 0x1e000-0x1e1ff */
+ 0x7f, 0xff, 0xff, 0xf9, 0xdb, 0x07, 0x00, 0x00, /* 0x1e000-0x1e03f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e040-0x1e07f */
+ 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e080-0x1e0bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e0c0-0x1e0ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, /* 0x1e100-0x1e13f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e140-0x1e17f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e180-0x1e1bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e1c0-0x1e1ff */
+ /* 0x1e200-0x1e3ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e200-0x1e23f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e240-0x1e27f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, /* 0x1e280-0x1e2bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, /* 0x1e2c0-0x1e2ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e300-0x1e33f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e340-0x1e37f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e380-0x1e3bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e3c0-0x1e3ff */
+ /* 0x1e400-0x1e5ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e400-0x1e43f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e440-0x1e47f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e480-0x1e4bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, /* 0x1e4c0-0x1e4ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e500-0x1e53f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e540-0x1e57f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e580-0x1e5bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e5c0-0x1e5ff */
+ /* 0x1e800-0x1e9ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e800-0x1e83f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e840-0x1e87f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e880-0x1e8bf */
+ 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e8c0-0x1e8ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e900-0x1e93f */
+ 0xf0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e940-0x1e97f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e980-0x1e9bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0x1e9c0-0x1e9ff */
+};
+static const signed char nonspacing_table_ind[248] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, /* 0x0000-0x0fff */
+ 8, 9, -1, 10, 11, 12, 13, -1, /* 0x1000-0x1fff */
+ 14, -1, -1, -1, -1, -1, 15, -1, /* 0x2000-0x2fff */
+ 16, -1, -1, -1, -1, -1, -1, -1, /* 0x3000-0x3fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x4000-0x4fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x5000-0x5fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x6000-0x6fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x7000-0x7fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x8000-0x8fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x9000-0x9fff */
+ -1, -1, -1, 17, 18, 19, -1, -1, /* 0xa000-0xafff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb000-0xbfff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc000-0xcfff */
+ -1, -1, -1, 20, -1, -1, -1, -1, /* 0xd000-0xdfff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe000-0xefff */
+ -1, -1, -1, -1, -1, 21, -1, 22, /* 0xf000-0xffff */
+ 23, 24, -1, -1, -1, 25, 26, 27, /* 0x10000-0x10fff */
+ 28, 29, 30, 31, 32, 33, 34, 35, /* 0x11000-0x11fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x12000-0x12fff */
+ -1, -1, 36, -1, -1, -1, -1, -1, /* 0x13000-0x13fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x14000-0x14fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x15000-0x15fff */
+ -1, -1, -1, -1, -1, 37, -1, 38, /* 0x16000-0x16fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x17000-0x17fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x18000-0x18fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x19000-0x19fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x1a000-0x1afff */
+ -1, -1, -1, -1, -1, -1, 39, -1, /* 0x1b000-0x1bfff */
+ -1, -1, -1, -1, -1, -1, -1, 40, /* 0x1c000-0x1cfff */
+ 41, 42, -1, -1, -1, 43, -1, -1, /* 0x1d000-0x1dfff */
+ 44, 45, 46, -1, 47, -1, -1, -1 /* 0x1e000-0x1efff */
+};
diff --git a/lib/uniwidth/width2.h b/lib/uniwidth/width2.h
new file mode 100644
index 0000000..25a50e5
--- /dev/null
+++ b/lib/uniwidth/width2.h
@@ -0,0 +1,549 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Width 2 property of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 15.0.0. */
+
+/* Copyright (C) 2000-2022 Free Software Foundation, Inc.
+
+ This file is free software.
+ It is dual-licensed under "the GNU LGPLv3+ or the GNU GPLv2+".
+ You can redistribute it and/or modify it under either
+ - the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation, either version 3, or (at your
+ option) any later version, or
+ - 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, or
+ - the same dual license "the GNU LGPLv3+ or the GNU GPLv2+".
+
+ This file 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
+ Lesser General Public License and the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License and of the GNU General Public License along with this
+ program. If not, see <https://www.gnu.org/licenses/>. */
+
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[4];
+ short level2[3 << 7];
+ unsigned int level3[28 << 4];
+ }
+u_width2 =
+{
+ { 4 },
+ {
+ 5 * sizeof (int) / sizeof (short) + 0,
+ 5 * sizeof (int) / sizeof (short) + 128,
+ 5 * sizeof (int) / sizeof (short) + 256,
+ 5 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 5 + 384 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 5 + 384 * sizeof (short) / sizeof (int) + 16,
+ 5 + 384 * sizeof (short) / sizeof (int) + 32,
+ 5 + 384 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ 5 + 384 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ 5 + 384 * sizeof (short) / sizeof (int) + 80,
+ 5 + 384 * sizeof (short) / sizeof (int) + 96,
+ 5 + 384 * sizeof (short) / sizeof (int) + 112,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 144,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ 5 + 384 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 5 + 384 * sizeof (short) / sizeof (int) + 208,
+ 5 + 384 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ 5 + 384 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 5 + 384 * sizeof (short) / sizeof (int) + 256,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 272,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 5 + 384 * sizeof (short) / sizeof (int) + 304,
+ 5 + 384 * sizeof (short) / sizeof (int) + 320,
+ 5 + 384 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 5 + 384 * sizeof (short) / sizeof (int) + 352,
+ 5 + 384 * sizeof (short) / sizeof (int) + 368,
+ 5 + 384 * sizeof (short) / sizeof (int) + 384,
+ 5 + 384 * sizeof (short) / sizeof (int) + 400,
+ 5 + 384 * sizeof (short) / sizeof (int) + 416,
+ 5 + 384 * sizeof (short) / sizeof (int) + 432,
+ -1,
+ -1,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128,
+ 5 + 384 * sizeof (short) / sizeof (int) + 128
+ },
+ {
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x0C000000U, 0x00000600U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00091E00U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x60000000U,
+ 0x00300000U, 0x00000000U, 0x000FFF00U, 0x80000000U,
+ 0x00080000U, 0x60000C02U, 0x00104030U, 0x242C0400U,
+ 0x00000C20U, 0x00000100U, 0x00B85000U, 0x00000000U,
+ 0x00E00000U, 0x80010000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x18000000U, 0x00000000U, 0x00210000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0x7FFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFF00FFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0x00000000U, 0x00000000U,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0x0000FFFFU, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x1FFFFFFFU,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0x0000000FU, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0xFFFF0000U, 0xFFFF0000U, 0xFFFFFFFFU, 0x0000FFFFU,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0x00000001U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x0000007FU,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x0003000FU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0x00FFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0x003FFFFFU, 0x00000000U,
+ 0x000001FFU, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x6FEF0000U,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0x00000007U, 0x00070000U, 0xFFFF00F0U,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0x0FFFFFFFU,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000010U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00008000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x07FE4000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFBFE001U, 0xFFFFFFFFU, 0xDFFFFFFFU,
+ 0x000FFFFFU, 0xFFFFFFFFU, 0x000F87FFU, 0xFF11FFFFU,
+ 0xFFFFFFFFU, 0x7FFFFFFFU, 0xFFFFFFFDU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0x9FFFFFFFU,
+ 0xFFFFFFFFU, 0x3FFFFFFFU, 0xFFFF7800U, 0x040000FFU,
+ 0x00600000U, 0x00000010U, 0x00000000U, 0xF8000000U,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0x0000FFFFU, 0x00000000U,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xE0E7103FU, 0x1FF01800U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00010FFFU,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0xFFFFF000U, 0xF7FFFFFFU, 0xFFFFFFBFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x1F1F0000U,
+ 0xFFFF007FU, 0x07FF1FFFU, 0x03FF003FU, 0x007F00FFU,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U
+ }
+};
diff --git a/lib/vasnprintf.c b/lib/vasnprintf.c
new file mode 100644
index 0000000..72b8cdb
--- /dev/null
+++ b/lib/vasnprintf.c
@@ -0,0 +1,5741 @@
+/* vsprintf with automatic memory allocation.
+ Copyright (C) 1999, 2002-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* This file can be parametrized with the following macros:
+ VASNPRINTF The name of the function being defined.
+ FCHAR_T The element type of the format string.
+ DCHAR_T The element type of the destination (result) string.
+ FCHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters
+ in the format string are ASCII. MUST be set if
+ FCHAR_T and DCHAR_T are not the same type.
+ DIRECTIVE Structure denoting a format directive.
+ Depends on FCHAR_T.
+ DIRECTIVES Structure denoting the set of format directives of a
+ format string. Depends on FCHAR_T.
+ PRINTF_PARSE Function that parses a format string.
+ Depends on FCHAR_T.
+ DCHAR_CPY memcpy like function for DCHAR_T[] arrays.
+ DCHAR_SET memset like function for DCHAR_T[] arrays.
+ DCHAR_MBSNLEN mbsnlen like function for DCHAR_T[] arrays.
+ SNPRINTF The system's snprintf (or similar) function.
+ This may be either snprintf or swprintf.
+ TCHAR_T The element type of the argument and result string
+ of the said SNPRINTF function. This may be either
+ char or wchar_t. The code exploits that
+ sizeof (TCHAR_T) | sizeof (DCHAR_T) and
+ alignof (TCHAR_T) <= alignof (DCHAR_T).
+ DCHAR_IS_TCHAR Set to 1 if DCHAR_T and TCHAR_T are the same type.
+ DCHAR_CONV_FROM_ENCODING A function to convert from char[] to DCHAR[].
+ DCHAR_IS_UINT8_T Set to 1 if DCHAR_T is uint8_t.
+ DCHAR_IS_UINT16_T Set to 1 if DCHAR_T is uint16_t.
+ DCHAR_IS_UINT32_T Set to 1 if DCHAR_T is uint32_t.
+ ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
+ ENABLE_WCHAR_FALLBACK Set to 1 to avoid EILSEQ during conversion of wide
+ characters (wchar_t) and wide character strings
+ (wchar_t[]) to multibyte sequences. The fallback is the
+ hexadecimal escape syntax (\unnnn or \Unnnnnnnn) or,
+ if wchar_t is not Unicode encoded, \wnnnn or \Wnnnnnnnn.
+ */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#ifndef VASNPRINTF
+# include <config.h>
+#endif
+
+/* As of GCC 11.2.1, gcc -Wanalyzer-too-complex reports that main's
+ use of CHECK macros expands to code that is too complicated for gcc
+ -fanalyzer. Suppress the resulting bogus warnings. */
+#if 10 <= __GNUC__
+# pragma GCC diagnostic ignored "-Wanalyzer-null-argument"
+#endif
+
+#include <alloca.h>
+
+/* Specification. */
+#ifndef VASNPRINTF
+# if WIDE_CHAR_VERSION
+# include "vasnwprintf.h"
+# else
+# include "vasnprintf.h"
+# endif
+#endif
+
+#include <locale.h> /* localeconv() */
+#include <stdio.h> /* snprintf(), sprintf() */
+#include <stdlib.h> /* abort(), malloc(), realloc(), free() */
+#include <string.h> /* memcpy(), strlen() */
+#include <wchar.h> /* mbstate_t, mbrtowc(), mbrlen(), wcrtomb() */
+#include <errno.h> /* errno */
+#include <limits.h> /* CHAR_BIT */
+#include <float.h> /* DBL_MAX_EXP, LDBL_MAX_EXP */
+#if HAVE_NL_LANGINFO
+# include <langinfo.h>
+#endif
+#ifndef VASNPRINTF
+# if WIDE_CHAR_VERSION
+# include "wprintf-parse.h"
+# else
+# include "printf-parse.h"
+# endif
+#endif
+
+/* Checked size_t computations. */
+#include "xsize.h"
+
+#include "attribute.h"
+
+#if (NEED_PRINTF_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "float+.h"
+#endif
+
+#if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "isnand-nolibm.h"
+#endif
+
+#if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "isnanl-nolibm.h"
+# include "fpucw.h"
+#endif
+
+#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "isnand-nolibm.h"
+# include "printf-frexp.h"
+#endif
+
+#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "isnanl-nolibm.h"
+# include "printf-frexpl.h"
+# include "fpucw.h"
+#endif
+
+/* Default parameters. */
+#ifndef VASNPRINTF
+# if WIDE_CHAR_VERSION
+# define VASNPRINTF vasnwprintf
+# define FCHAR_T wchar_t
+# define DCHAR_T wchar_t
+# define TCHAR_T wchar_t
+# define DCHAR_IS_TCHAR 1
+# define DIRECTIVE wchar_t_directive
+# define DIRECTIVES wchar_t_directives
+# define PRINTF_PARSE wprintf_parse
+# define DCHAR_CPY wmemcpy
+# define DCHAR_SET wmemset
+# else
+# define VASNPRINTF vasnprintf
+# define FCHAR_T char
+# define DCHAR_T char
+# define TCHAR_T char
+# define DCHAR_IS_TCHAR 1
+# define DIRECTIVE char_directive
+# define DIRECTIVES char_directives
+# define PRINTF_PARSE printf_parse
+# define DCHAR_CPY memcpy
+# define DCHAR_SET memset
+# endif
+#endif
+#if WIDE_CHAR_VERSION
+ /* TCHAR_T is wchar_t. */
+# define USE_SNPRINTF 1
+# if HAVE_DECL__SNWPRINTF
+ /* On Windows, the function swprintf() has a different signature than
+ on Unix; we use the function _snwprintf() or - on mingw - snwprintf()
+ instead. The mingw function snwprintf() has fewer bugs than the
+ MSVCRT function _snwprintf(), so prefer that. */
+# if defined __MINGW32__
+# define SNPRINTF snwprintf
+# else
+# define SNPRINTF _snwprintf
+# define USE_MSVC__SNPRINTF 1
+# endif
+# else
+ /* Unix. */
+# define SNPRINTF swprintf
+# endif
+#else
+ /* TCHAR_T is char. */
+ /* Use snprintf if it exists under the name 'snprintf' or '_snprintf'.
+ But don't use it on BeOS, since BeOS snprintf produces no output if the
+ size argument is >= 0x3000000.
+ Also don't use it on Linux libc5, since there snprintf with size = 1
+ writes any output without bounds, like sprintf. */
+# if (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF) && !defined __BEOS__ && !(__GNU_LIBRARY__ == 1)
+# define USE_SNPRINTF 1
+# else
+# define USE_SNPRINTF 0
+# endif
+# if HAVE_DECL__SNPRINTF
+ /* Windows. The mingw function snprintf() has fewer bugs than the MSVCRT
+ function _snprintf(), so prefer that. */
+# if defined __MINGW32__
+# define SNPRINTF snprintf
+ /* Here we need to call the native snprintf, not rpl_snprintf. */
+# undef snprintf
+# else
+ /* MSVC versions < 14 did not have snprintf, only _snprintf. */
+# define SNPRINTF _snprintf
+# define USE_MSVC__SNPRINTF 1
+# endif
+# else
+ /* Unix. */
+# define SNPRINTF snprintf
+ /* Here we need to call the native snprintf, not rpl_snprintf. */
+# undef snprintf
+# endif
+#endif
+/* Here we need to call the native sprintf, not rpl_sprintf. */
+#undef sprintf
+
+/* GCC >= 4.0 with -Wall emits unjustified "... may be used uninitialized"
+ warnings in this file. Use -Dlint to suppress them. */
+#if defined GCC_LINT || defined lint
+# define IF_LINT(Code) Code
+#else
+# define IF_LINT(Code) /* empty */
+#endif
+
+/* Avoid some warnings from "gcc -Wshadow".
+ This file doesn't use the exp() and remainder() functions. */
+#undef exp
+#define exp expo
+#undef remainder
+#define remainder rem
+
+#if (!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF) && !WIDE_CHAR_VERSION
+# if (HAVE_STRNLEN && !defined _AIX)
+# define local_strnlen strnlen
+# else
+# ifndef local_strnlen_defined
+# define local_strnlen_defined 1
+static size_t
+local_strnlen (const char *string, size_t maxlen)
+{
+ const char *end = memchr (string, '\0', maxlen);
+ return end ? (size_t) (end - string) : maxlen;
+}
+# endif
+# endif
+#endif
+
+#if (((!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF) && WIDE_CHAR_VERSION) || ((!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL)) && !WIDE_CHAR_VERSION && DCHAR_IS_TCHAR)) && HAVE_WCHAR_T
+# if HAVE_WCSLEN
+# define local_wcslen wcslen
+# else
+ /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid
+ a dependency towards this library, here is a local substitute.
+ Define this substitute only once, even if this file is included
+ twice in the same compilation unit. */
+# ifndef local_wcslen_defined
+# define local_wcslen_defined 1
+static size_t
+local_wcslen (const wchar_t *s)
+{
+ const wchar_t *ptr;
+
+ for (ptr = s; *ptr != (wchar_t) 0; ptr++)
+ ;
+ return ptr - s;
+}
+# endif
+# endif
+#endif
+
+#if (!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF) && HAVE_WCHAR_T && WIDE_CHAR_VERSION
+# if HAVE_WCSNLEN
+# define local_wcsnlen wcsnlen
+# else
+# ifndef local_wcsnlen_defined
+# define local_wcsnlen_defined 1
+static size_t
+local_wcsnlen (const wchar_t *s, size_t maxlen)
+{
+ const wchar_t *ptr;
+
+ for (ptr = s; maxlen > 0 && *ptr != (wchar_t) 0; ptr++, maxlen--)
+ ;
+ return ptr - s;
+}
+# endif
+# endif
+#endif
+
+#if (((!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL) || ENABLE_WCHAR_FALLBACK) && HAVE_WCHAR_T) || (ENABLE_WCHAR_FALLBACK && HAVE_WINT_T)) && !WIDE_CHAR_VERSION
+# if ENABLE_WCHAR_FALLBACK
+static size_t
+wctomb_fallback (char *s, wchar_t wc)
+{
+ static char hex[16] = "0123456789ABCDEF";
+
+ s[0] = '\\';
+ if (sizeof (wchar_t) > 2 && wc > 0xffff)
+ {
+# if __STDC_ISO_10646__ || (__GLIBC__ >= 2) || (defined _WIN32 || defined __CYGWIN__)
+ s[1] = 'U';
+# else
+ s[1] = 'W';
+# endif
+ s[2] = hex[(wc & 0xf0000000U) >> 28];
+ s[3] = hex[(wc & 0xf000000U) >> 24];
+ s[4] = hex[(wc & 0xf00000U) >> 20];
+ s[5] = hex[(wc & 0xf0000U) >> 16];
+ s[6] = hex[(wc & 0xf000U) >> 12];
+ s[7] = hex[(wc & 0xf00U) >> 8];
+ s[8] = hex[(wc & 0xf0U) >> 4];
+ s[9] = hex[wc & 0xfU];
+ return 10;
+ }
+ else
+ {
+# if __STDC_ISO_10646__ || (__GLIBC__ >= 2) || (defined _WIN32 || defined __CYGWIN__)
+ s[1] = 'u';
+# else
+ s[1] = 'w';
+# endif
+ s[2] = hex[(wc & 0xf000U) >> 12];
+ s[3] = hex[(wc & 0xf00U) >> 8];
+ s[4] = hex[(wc & 0xf0U) >> 4];
+ s[5] = hex[wc & 0xfU];
+ return 6;
+ }
+}
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+static size_t
+local_wcrtomb (char *s, wchar_t wc, mbstate_t *ps)
+{
+ size_t count = wcrtomb (s, wc, ps);
+ if (count == (size_t)(-1))
+ count = wctomb_fallback (s, wc);
+ return count;
+}
+# else
+static int
+local_wctomb (char *s, wchar_t wc)
+{
+ int count = wctomb (s, wc);
+ if (count < 0)
+ count = wctomb_fallback (s, wc);
+ return count;
+}
+# define local_wcrtomb(S, WC, PS) local_wctomb ((S), (WC))
+# endif
+# else
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+# define local_wcrtomb(S, WC, PS) wcrtomb ((S), (WC), (PS))
+# else
+# define local_wcrtomb(S, WC, PS) wctomb ((S), (WC))
+# endif
+# endif
+#endif
+
+#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL
+/* Determine the decimal-point character according to the current locale. */
+# ifndef decimal_point_char_defined
+# define decimal_point_char_defined 1
+static char
+decimal_point_char (void)
+{
+ const char *point;
+ /* Determine it in a multithread-safe way. We know nl_langinfo is
+ multithread-safe on glibc systems and Mac OS X systems, but is not required
+ to be multithread-safe by POSIX. sprintf(), however, is multithread-safe.
+ localeconv() is rarely multithread-safe. */
+# if HAVE_NL_LANGINFO && (__GLIBC__ || defined __UCLIBC__ || (defined __APPLE__ && defined __MACH__))
+ point = nl_langinfo (RADIXCHAR);
+# elif 1
+ char pointbuf[5];
+ sprintf (pointbuf, "%#.0f", 1.0);
+ point = &pointbuf[1];
+# else
+ point = localeconv () -> decimal_point;
+# endif
+ /* The decimal point is always a single byte: either '.' or ','. */
+ return (point[0] != '\0' ? point[0] : '.');
+}
+# endif
+#endif
+
+#if NEED_PRINTF_INFINITE_DOUBLE && !NEED_PRINTF_DOUBLE && !defined IN_LIBINTL
+
+/* Equivalent to !isfinite(x) || x == 0, but does not require libm. */
+static int
+is_infinite_or_zero (double x)
+{
+ return isnand (x) || x + x == x;
+}
+
+#endif
+
+#if NEED_PRINTF_INFINITE_LONG_DOUBLE && !NEED_PRINTF_LONG_DOUBLE && !defined IN_LIBINTL
+
+/* Equivalent to !isfinite(x) || x == 0, but does not require libm. */
+static int
+is_infinite_or_zerol (long double x)
+{
+ return isnanl (x) || x + x == x;
+}
+
+#endif
+
+#if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
+
+/* Converting 'long double' to decimal without rare rounding bugs requires
+ real bignums. We use the naming conventions of GNU gmp, but vastly simpler
+ (and slower) algorithms. */
+
+typedef unsigned int mp_limb_t;
+# define GMP_LIMB_BITS 32
+static_assert (sizeof (mp_limb_t) * CHAR_BIT == GMP_LIMB_BITS);
+
+typedef unsigned long long mp_twolimb_t;
+# define GMP_TWOLIMB_BITS 64
+static_assert (sizeof (mp_twolimb_t) * CHAR_BIT == GMP_TWOLIMB_BITS);
+
+/* Representation of a bignum >= 0. */
+typedef struct
+{
+ size_t nlimbs;
+ mp_limb_t *limbs; /* Bits in little-endian order, allocated with malloc(). */
+} mpn_t;
+
+/* Compute the product of two bignums >= 0.
+ Return the allocated memory in case of success, NULL in case of memory
+ allocation failure. */
+static void *
+multiply (mpn_t src1, mpn_t src2, mpn_t *dest)
+{
+ const mp_limb_t *p1;
+ const mp_limb_t *p2;
+ size_t len1;
+ size_t len2;
+
+ if (src1.nlimbs <= src2.nlimbs)
+ {
+ len1 = src1.nlimbs;
+ p1 = src1.limbs;
+ len2 = src2.nlimbs;
+ p2 = src2.limbs;
+ }
+ else
+ {
+ len1 = src2.nlimbs;
+ p1 = src2.limbs;
+ len2 = src1.nlimbs;
+ p2 = src1.limbs;
+ }
+ /* Now 0 <= len1 <= len2. */
+ if (len1 == 0)
+ {
+ /* src1 or src2 is zero. */
+ dest->nlimbs = 0;
+ dest->limbs = (mp_limb_t *) malloc (1);
+ }
+ else
+ {
+ /* Here 1 <= len1 <= len2. */
+ size_t dlen;
+ mp_limb_t *dp;
+ size_t k, i, j;
+
+ dlen = len1 + len2;
+ dp = (mp_limb_t *) malloc (dlen * sizeof (mp_limb_t));
+ if (dp == NULL)
+ return NULL;
+ for (k = len2; k > 0; )
+ dp[--k] = 0;
+ for (i = 0; i < len1; i++)
+ {
+ mp_limb_t digit1 = p1[i];
+ mp_twolimb_t carry = 0;
+ for (j = 0; j < len2; j++)
+ {
+ mp_limb_t digit2 = p2[j];
+ carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2;
+ carry += dp[i + j];
+ dp[i + j] = (mp_limb_t) carry;
+ carry = carry >> GMP_LIMB_BITS;
+ }
+ dp[i + len2] = (mp_limb_t) carry;
+ }
+ /* Normalise. */
+ while (dlen > 0 && dp[dlen - 1] == 0)
+ dlen--;
+ dest->nlimbs = dlen;
+ dest->limbs = dp;
+ }
+ return dest->limbs;
+}
+
+/* Compute the quotient of a bignum a >= 0 and a bignum b > 0.
+ a is written as a = q * b + r with 0 <= r < b. q is the quotient, r
+ the remainder.
+ Finally, round-to-even is performed: If r > b/2 or if r = b/2 and q is odd,
+ q is incremented.
+ Return the allocated memory in case of success, NULL in case of memory
+ allocation failure. */
+static void *
+divide (mpn_t a, mpn_t b, mpn_t *q)
+{
+ /* Algorithm:
+ First normalise a and b: a=[a[m-1],...,a[0]], b=[b[n-1],...,b[0]]
+ with m>=0 and n>0 (in base beta = 2^GMP_LIMB_BITS).
+ If m<n, then q:=0 and r:=a.
+ If m>=n=1, perform a single-precision division:
+ r:=0, j:=m,
+ while j>0 do
+ {Here (q[m-1]*beta^(m-1)+...+q[j]*beta^j) * b[0] + r*beta^j =
+ = a[m-1]*beta^(m-1)+...+a[j]*beta^j und 0<=r<b[0]<beta}
+ j:=j-1, r:=r*beta+a[j], q[j]:=floor(r/b[0]), r:=r-b[0]*q[j].
+ Normalise [q[m-1],...,q[0]], yields q.
+ If m>=n>1, perform a multiple-precision division:
+ We have a/b < beta^(m-n+1).
+ s:=intDsize-1-(highest bit in b[n-1]), 0<=s<intDsize.
+ Shift a and b left by s bits, copying them. r:=a.
+ r=[r[m],...,r[0]], b=[b[n-1],...,b[0]] with b[n-1]>=beta/2.
+ For j=m-n,...,0: {Here 0 <= r < b*beta^(j+1).}
+ Compute q* :
+ q* := floor((r[j+n]*beta+r[j+n-1])/b[n-1]).
+ In case of overflow (q* >= beta) set q* := beta-1.
+ Compute c2 := ((r[j+n]*beta+r[j+n-1]) - q* * b[n-1])*beta + r[j+n-2]
+ and c3 := b[n-2] * q*.
+ {We have 0 <= c2 < 2*beta^2, even 0 <= c2 < beta^2 if no overflow
+ occurred. Furthermore 0 <= c3 < beta^2.
+ If there was overflow and
+ r[j+n]*beta+r[j+n-1] - q* * b[n-1] >= beta, i.e. c2 >= beta^2,
+ the next test can be skipped.}
+ While c3 > c2, {Here 0 <= c2 < c3 < beta^2}
+ Put q* := q* - 1, c2 := c2 + b[n-1]*beta, c3 := c3 - b[n-2].
+ If q* > 0:
+ Put r := r - b * q* * beta^j. In detail:
+ [r[n+j],...,r[j]] := [r[n+j],...,r[j]] - q* * [b[n-1],...,b[0]].
+ hence: u:=0, for i:=0 to n-1 do
+ u := u + q* * b[i],
+ r[j+i]:=r[j+i]-(u mod beta) (+ beta, if carry),
+ u:=u div beta (+ 1, if carry in subtraction)
+ r[n+j]:=r[n+j]-u.
+ {Since always u = (q* * [b[i-1],...,b[0]] div beta^i) + 1
+ < q* + 1 <= beta,
+ the carry u does not overflow.}
+ If a negative carry occurs, put q* := q* - 1
+ and [r[n+j],...,r[j]] := [r[n+j],...,r[j]] + [0,b[n-1],...,b[0]].
+ Set q[j] := q*.
+ Normalise [q[m-n],..,q[0]]; this yields the quotient q.
+ Shift [r[n-1],...,r[0]] right by s bits and normalise; this yields the
+ rest r.
+ The room for q[j] can be allocated at the memory location of r[n+j].
+ Finally, round-to-even:
+ Shift r left by 1 bit.
+ If r > b or if r = b and q[0] is odd, q := q+1.
+ */
+ const mp_limb_t *a_ptr = a.limbs;
+ size_t a_len = a.nlimbs;
+ const mp_limb_t *b_ptr = b.limbs;
+ size_t b_len = b.nlimbs;
+ mp_limb_t *roomptr;
+ mp_limb_t *tmp_roomptr = NULL;
+ mp_limb_t *q_ptr;
+ size_t q_len;
+ mp_limb_t *r_ptr;
+ size_t r_len;
+
+ /* Allocate room for a_len+2 digits.
+ (Need a_len+1 digits for the real division and 1 more digit for the
+ final rounding of q.) */
+ roomptr = (mp_limb_t *) malloc ((a_len + 2) * sizeof (mp_limb_t));
+ if (roomptr == NULL)
+ return NULL;
+
+ /* Normalise a. */
+ while (a_len > 0 && a_ptr[a_len - 1] == 0)
+ a_len--;
+
+ /* Normalise b. */
+ for (;;)
+ {
+ if (b_len == 0)
+ /* Division by zero. */
+ abort ();
+ if (b_ptr[b_len - 1] == 0)
+ b_len--;
+ else
+ break;
+ }
+
+ /* Here m = a_len >= 0 and n = b_len > 0. */
+
+ if (a_len < b_len)
+ {
+ /* m<n: trivial case. q=0, r := copy of a. */
+ r_ptr = roomptr;
+ r_len = a_len;
+ memcpy (r_ptr, a_ptr, a_len * sizeof (mp_limb_t));
+ q_ptr = roomptr + a_len;
+ q_len = 0;
+ }
+ else if (b_len == 1)
+ {
+ /* n=1: single precision division.
+ beta^(m-1) <= a < beta^m ==> beta^(m-2) <= a/b < beta^m */
+ r_ptr = roomptr;
+ q_ptr = roomptr + 1;
+ {
+ mp_limb_t den = b_ptr[0];
+ mp_limb_t remainder = 0;
+ const mp_limb_t *sourceptr = a_ptr + a_len;
+ mp_limb_t *destptr = q_ptr + a_len;
+ size_t count;
+ for (count = a_len; count > 0; count--)
+ {
+ mp_twolimb_t num =
+ ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--sourceptr;
+ *--destptr = num / den;
+ remainder = num % den;
+ }
+ /* Normalise and store r. */
+ if (remainder > 0)
+ {
+ r_ptr[0] = remainder;
+ r_len = 1;
+ }
+ else
+ r_len = 0;
+ /* Normalise q. */
+ q_len = a_len;
+ if (q_ptr[q_len - 1] == 0)
+ q_len--;
+ }
+ }
+ else
+ {
+ /* n>1: multiple precision division.
+ beta^(m-1) <= a < beta^m, beta^(n-1) <= b < beta^n ==>
+ beta^(m-n-1) <= a/b < beta^(m-n+1). */
+ /* Determine s. */
+ size_t s;
+ {
+ mp_limb_t msd = b_ptr[b_len - 1]; /* = b[n-1], > 0 */
+ /* Determine s = GMP_LIMB_BITS - integer_length (msd).
+ Code copied from gnulib's integer_length.c. */
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) \
+ || (__clang_major__ >= 4)
+ s = __builtin_clz (msd);
+# else
+# if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT
+ if (GMP_LIMB_BITS <= DBL_MANT_BIT)
+ {
+ /* Use 'double' operations.
+ Assumes an IEEE 754 'double' implementation. */
+# define DBL_EXP_MASK ((DBL_MAX_EXP - DBL_MIN_EXP) | 7)
+# define DBL_EXP_BIAS (DBL_EXP_MASK / 2 - 1)
+# define NWORDS \
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ union { double value; unsigned int word[NWORDS]; } m;
+
+ /* Use a single integer to floating-point conversion. */
+ m.value = msd;
+
+ s = GMP_LIMB_BITS
+ - (((m.word[DBL_EXPBIT0_WORD] >> DBL_EXPBIT0_BIT) & DBL_EXP_MASK)
+ - DBL_EXP_BIAS);
+ }
+ else
+# undef NWORDS
+# endif
+ {
+ s = 31;
+ if (msd >= 0x10000)
+ {
+ msd = msd >> 16;
+ s -= 16;
+ }
+ if (msd >= 0x100)
+ {
+ msd = msd >> 8;
+ s -= 8;
+ }
+ if (msd >= 0x10)
+ {
+ msd = msd >> 4;
+ s -= 4;
+ }
+ if (msd >= 0x4)
+ {
+ msd = msd >> 2;
+ s -= 2;
+ }
+ if (msd >= 0x2)
+ {
+ msd = msd >> 1;
+ s -= 1;
+ }
+ }
+# endif
+ }
+ /* 0 <= s < GMP_LIMB_BITS.
+ Copy b, shifting it left by s bits. */
+ if (s > 0)
+ {
+ tmp_roomptr = (mp_limb_t *) malloc (b_len * sizeof (mp_limb_t));
+ if (tmp_roomptr == NULL)
+ {
+ free (roomptr);
+ return NULL;
+ }
+ {
+ const mp_limb_t *sourceptr = b_ptr;
+ mp_limb_t *destptr = tmp_roomptr;
+ mp_twolimb_t accu = 0;
+ size_t count;
+ for (count = b_len; count > 0; count--)
+ {
+ accu += (mp_twolimb_t) *sourceptr++ << s;
+ *destptr++ = (mp_limb_t) accu;
+ accu = accu >> GMP_LIMB_BITS;
+ }
+ /* accu must be zero, since that was how s was determined. */
+ if (accu != 0)
+ abort ();
+ }
+ b_ptr = tmp_roomptr;
+ }
+ /* Copy a, shifting it left by s bits, yields r.
+ Memory layout:
+ At the beginning: r = roomptr[0..a_len],
+ at the end: r = roomptr[0..b_len-1], q = roomptr[b_len..a_len] */
+ r_ptr = roomptr;
+ if (s == 0)
+ {
+ memcpy (r_ptr, a_ptr, a_len * sizeof (mp_limb_t));
+ r_ptr[a_len] = 0;
+ }
+ else
+ {
+ const mp_limb_t *sourceptr = a_ptr;
+ mp_limb_t *destptr = r_ptr;
+ mp_twolimb_t accu = 0;
+ size_t count;
+ for (count = a_len; count > 0; count--)
+ {
+ accu += (mp_twolimb_t) *sourceptr++ << s;
+ *destptr++ = (mp_limb_t) accu;
+ accu = accu >> GMP_LIMB_BITS;
+ }
+ *destptr++ = (mp_limb_t) accu;
+ }
+ q_ptr = roomptr + b_len;
+ q_len = a_len - b_len + 1; /* q will have m-n+1 limbs */
+ {
+ size_t j = a_len - b_len; /* m-n */
+ mp_limb_t b_msd = b_ptr[b_len - 1]; /* b[n-1] */
+ mp_limb_t b_2msd = b_ptr[b_len - 2]; /* b[n-2] */
+ mp_twolimb_t b_msdd = /* b[n-1]*beta+b[n-2] */
+ ((mp_twolimb_t) b_msd << GMP_LIMB_BITS) | b_2msd;
+ /* Division loop, traversed m-n+1 times.
+ j counts down, b is unchanged, beta/2 <= b[n-1] < beta. */
+ for (;;)
+ {
+ mp_limb_t q_star;
+ mp_limb_t c1;
+ if (r_ptr[j + b_len] < b_msd) /* r[j+n] < b[n-1] ? */
+ {
+ /* Divide r[j+n]*beta+r[j+n-1] by b[n-1], no overflow. */
+ mp_twolimb_t num =
+ ((mp_twolimb_t) r_ptr[j + b_len] << GMP_LIMB_BITS)
+ | r_ptr[j + b_len - 1];
+ q_star = num / b_msd;
+ c1 = num % b_msd;
+ }
+ else
+ {
+ /* Overflow, hence r[j+n]*beta+r[j+n-1] >= beta*b[n-1]. */
+ q_star = (mp_limb_t)~(mp_limb_t)0; /* q* = beta-1 */
+ /* Test whether r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] >= beta
+ <==> r[j+n]*beta+r[j+n-1] + b[n-1] >= beta*b[n-1]+beta
+ <==> b[n-1] < floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta)
+ {<= beta !}.
+ If yes, jump directly to the subtraction loop.
+ (Otherwise, r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] < beta
+ <==> floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta) = b[n-1] ) */
+ if (r_ptr[j + b_len] > b_msd
+ || (c1 = r_ptr[j + b_len - 1] + b_msd) < b_msd)
+ /* r[j+n] >= b[n-1]+1 or
+ r[j+n] = b[n-1] and the addition r[j+n-1]+b[n-1] gives a
+ carry. */
+ goto subtract;
+ }
+ /* q_star = q*,
+ c1 = (r[j+n]*beta+r[j+n-1]) - q* * b[n-1] (>=0, <beta). */
+ {
+ mp_twolimb_t c2 = /* c1*beta+r[j+n-2] */
+ ((mp_twolimb_t) c1 << GMP_LIMB_BITS) | r_ptr[j + b_len - 2];
+ mp_twolimb_t c3 = /* b[n-2] * q* */
+ (mp_twolimb_t) b_2msd * (mp_twolimb_t) q_star;
+ /* While c2 < c3, increase c2 and decrease c3.
+ Consider c3-c2. While it is > 0, decrease it by
+ b[n-1]*beta+b[n-2]. Because of b[n-1]*beta+b[n-2] >= beta^2/2
+ this can happen only twice. */
+ if (c3 > c2)
+ {
+ q_star = q_star - 1; /* q* := q* - 1 */
+ if (c3 - c2 > b_msdd)
+ q_star = q_star - 1; /* q* := q* - 1 */
+ }
+ }
+ if (q_star > 0)
+ subtract:
+ {
+ /* Subtract r := r - b * q* * beta^j. */
+ mp_limb_t cr;
+ {
+ const mp_limb_t *sourceptr = b_ptr;
+ mp_limb_t *destptr = r_ptr + j;
+ mp_twolimb_t carry = 0;
+ size_t count;
+ for (count = b_len; count > 0; count--)
+ {
+ /* Here 0 <= carry <= q*. */
+ carry =
+ carry
+ + (mp_twolimb_t) q_star * (mp_twolimb_t) *sourceptr++
+ + (mp_limb_t) ~(*destptr);
+ /* Here 0 <= carry <= beta*q* + beta-1. */
+ *destptr++ = ~(mp_limb_t) carry;
+ carry = carry >> GMP_LIMB_BITS; /* <= q* */
+ }
+ cr = (mp_limb_t) carry;
+ }
+ /* Subtract cr from r_ptr[j + b_len], then forget about
+ r_ptr[j + b_len]. */
+ if (cr > r_ptr[j + b_len])
+ {
+ /* Subtraction gave a carry. */
+ q_star = q_star - 1; /* q* := q* - 1 */
+ /* Add b back. */
+ {
+ const mp_limb_t *sourceptr = b_ptr;
+ mp_limb_t *destptr = r_ptr + j;
+ mp_limb_t carry = 0;
+ size_t count;
+ for (count = b_len; count > 0; count--)
+ {
+ mp_limb_t source1 = *sourceptr++;
+ mp_limb_t source2 = *destptr;
+ *destptr++ = source1 + source2 + carry;
+ carry =
+ (carry
+ ? source1 >= (mp_limb_t) ~source2
+ : source1 > (mp_limb_t) ~source2);
+ }
+ }
+ /* Forget about the carry and about r[j+n]. */
+ }
+ }
+ /* q* is determined. Store it as q[j]. */
+ q_ptr[j] = q_star;
+ if (j == 0)
+ break;
+ j--;
+ }
+ }
+ r_len = b_len;
+ /* Normalise q. */
+ if (q_ptr[q_len - 1] == 0)
+ q_len--;
+# if 0 /* Not needed here, since we need r only to compare it with b/2, and
+ b is shifted left by s bits. */
+ /* Shift r right by s bits. */
+ if (s > 0)
+ {
+ mp_limb_t ptr = r_ptr + r_len;
+ mp_twolimb_t accu = 0;
+ size_t count;
+ for (count = r_len; count > 0; count--)
+ {
+ accu = (mp_twolimb_t) (mp_limb_t) accu << GMP_LIMB_BITS;
+ accu += (mp_twolimb_t) *--ptr << (GMP_LIMB_BITS - s);
+ *ptr = (mp_limb_t) (accu >> GMP_LIMB_BITS);
+ }
+ }
+# endif
+ /* Normalise r. */
+ while (r_len > 0 && r_ptr[r_len - 1] == 0)
+ r_len--;
+ }
+ /* Compare r << 1 with b. */
+ if (r_len > b_len)
+ goto increment_q;
+ {
+ size_t i;
+ for (i = b_len;;)
+ {
+ mp_limb_t r_i =
+ (i <= r_len && i > 0 ? r_ptr[i - 1] >> (GMP_LIMB_BITS - 1) : 0)
+ | (i < r_len ? r_ptr[i] << 1 : 0);
+ mp_limb_t b_i = (i < b_len ? b_ptr[i] : 0);
+ if (r_i > b_i)
+ goto increment_q;
+ if (r_i < b_i)
+ goto keep_q;
+ if (i == 0)
+ break;
+ i--;
+ }
+ }
+ if (q_len > 0 && ((q_ptr[0] & 1) != 0))
+ /* q is odd. */
+ increment_q:
+ {
+ size_t i;
+ for (i = 0; i < q_len; i++)
+ if (++(q_ptr[i]) != 0)
+ goto keep_q;
+ q_ptr[q_len++] = 1;
+ }
+ keep_q:
+ free (tmp_roomptr);
+ q->limbs = q_ptr;
+ q->nlimbs = q_len;
+ return roomptr;
+}
+
+/* Convert a bignum a >= 0, multiplied with 10^extra_zeroes, to decimal
+ representation.
+ Destroys the contents of a.
+ Return the allocated memory - containing the decimal digits in low-to-high
+ order, terminated with a NUL character - in case of success, NULL in case
+ of memory allocation failure. */
+static char *
+convert_to_decimal (mpn_t a, size_t extra_zeroes)
+{
+ mp_limb_t *a_ptr = a.limbs;
+ size_t a_len = a.nlimbs;
+ /* 0.03345 is slightly larger than log(2)/(9*log(10)). */
+ size_t c_len = 9 * ((size_t)(a_len * (GMP_LIMB_BITS * 0.03345f)) + 1);
+ /* We need extra_zeroes bytes for zeroes, followed by c_len bytes for the
+ digits of a, followed by 1 byte for the terminating NUL. */
+ char *c_ptr = (char *) malloc (xsum (xsum (extra_zeroes, c_len), 1));
+ if (c_ptr != NULL)
+ {
+ char *d_ptr = c_ptr;
+ for (; extra_zeroes > 0; extra_zeroes--)
+ *d_ptr++ = '0';
+ while (a_len > 0)
+ {
+ /* Divide a by 10^9, in-place. */
+ mp_limb_t remainder = 0;
+ mp_limb_t *ptr = a_ptr + a_len;
+ size_t count;
+ for (count = a_len; count > 0; count--)
+ {
+ mp_twolimb_t num =
+ ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--ptr;
+ *ptr = num / 1000000000;
+ remainder = num % 1000000000;
+ }
+ /* Store the remainder as 9 decimal digits. */
+ for (count = 9; count > 0; count--)
+ {
+ *d_ptr++ = '0' + (remainder % 10);
+ remainder = remainder / 10;
+ }
+ /* Normalize a. */
+ if (a_ptr[a_len - 1] == 0)
+ a_len--;
+ }
+ /* Remove leading zeroes. */
+ while (d_ptr > c_ptr && d_ptr[-1] == '0')
+ d_ptr--;
+ /* But keep at least one zero. */
+ if (d_ptr == c_ptr)
+ *d_ptr++ = '0';
+ /* Terminate the string. */
+ *d_ptr = '\0';
+ }
+ return c_ptr;
+}
+
+# if NEED_PRINTF_LONG_DOUBLE
+
+/* Assuming x is finite and >= 0:
+ write x as x = 2^e * m, where m is a bignum.
+ Return the allocated memory in case of success, NULL in case of memory
+ allocation failure. */
+static void *
+decode_long_double (long double x, int *ep, mpn_t *mp)
+{
+ mpn_t m;
+ int exp;
+ long double y;
+ size_t i;
+
+ /* Allocate memory for result. */
+ m.nlimbs = (LDBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
+ m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t));
+ if (m.limbs == NULL)
+ return NULL;
+ /* Split into exponential part and mantissa. */
+ y = frexpl (x, &exp);
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ /* x = 2^exp * y = 2^(exp - LDBL_MANT_BIT) * (y * 2^LDBL_MANT_BIT), and the
+ latter is an integer. */
+ /* Convert the mantissa (y * 2^LDBL_MANT_BIT) to a sequence of limbs.
+ I'm not sure whether it's safe to cast a 'long double' value between
+ 2^31 and 2^32 to 'unsigned int', therefore play safe and cast only
+ 'long double' values between 0 and 2^16 (to 'unsigned int' or 'int',
+ doesn't matter). */
+# if (LDBL_MANT_BIT % GMP_LIMB_BITS) != 0
+# if (LDBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2
+ {
+ mp_limb_t hi, lo;
+ y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % (GMP_LIMB_BITS / 2));
+ hi = (int) y;
+ y -= hi;
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ lo = (int) y;
+ y -= lo;
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+ }
+# else
+ {
+ mp_limb_t d;
+ y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % GMP_LIMB_BITS);
+ d = (int) y;
+ y -= d;
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = d;
+ }
+# endif
+# endif
+ for (i = LDBL_MANT_BIT / GMP_LIMB_BITS; i > 0; )
+ {
+ mp_limb_t hi, lo;
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ hi = (int) y;
+ y -= hi;
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ lo = (int) y;
+ y -= lo;
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+ }
+# if 0 /* On FreeBSD 6.1/x86, 'long double' numbers sometimes have excess
+ precision. */
+ if (!(y == 0.0L))
+ abort ();
+# endif
+ /* Normalise. */
+ while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0)
+ m.nlimbs--;
+ *mp = m;
+ *ep = exp - LDBL_MANT_BIT;
+ return m.limbs;
+}
+
+# endif
+
+# if NEED_PRINTF_DOUBLE
+
+/* Assuming x is finite and >= 0:
+ write x as x = 2^e * m, where m is a bignum.
+ Return the allocated memory in case of success, NULL in case of memory
+ allocation failure. */
+static void *
+decode_double (double x, int *ep, mpn_t *mp)
+{
+ mpn_t m;
+ int exp;
+ double y;
+ size_t i;
+
+ /* Allocate memory for result. */
+ m.nlimbs = (DBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
+ m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t));
+ if (m.limbs == NULL)
+ return NULL;
+ /* Split into exponential part and mantissa. */
+ y = frexp (x, &exp);
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ /* x = 2^exp * y = 2^(exp - DBL_MANT_BIT) * (y * 2^DBL_MANT_BIT), and the
+ latter is an integer. */
+ /* Convert the mantissa (y * 2^DBL_MANT_BIT) to a sequence of limbs.
+ I'm not sure whether it's safe to cast a 'double' value between
+ 2^31 and 2^32 to 'unsigned int', therefore play safe and cast only
+ 'double' values between 0 and 2^16 (to 'unsigned int' or 'int',
+ doesn't matter). */
+# if (DBL_MANT_BIT % GMP_LIMB_BITS) != 0
+# if (DBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2
+ {
+ mp_limb_t hi, lo;
+ y *= (mp_limb_t) 1 << (DBL_MANT_BIT % (GMP_LIMB_BITS / 2));
+ hi = (int) y;
+ y -= hi;
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ lo = (int) y;
+ y -= lo;
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+ }
+# else
+ {
+ mp_limb_t d;
+ y *= (mp_limb_t) 1 << (DBL_MANT_BIT % GMP_LIMB_BITS);
+ d = (int) y;
+ y -= d;
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = d;
+ }
+# endif
+# endif
+ for (i = DBL_MANT_BIT / GMP_LIMB_BITS; i > 0; )
+ {
+ mp_limb_t hi, lo;
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ hi = (int) y;
+ y -= hi;
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ lo = (int) y;
+ y -= lo;
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+ }
+ if (!(y == 0.0))
+ abort ();
+ /* Normalise. */
+ while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0)
+ m.nlimbs--;
+ *mp = m;
+ *ep = exp - DBL_MANT_BIT;
+ return m.limbs;
+}
+
+# endif
+
+/* Assuming x = 2^e * m is finite and >= 0, and n is an integer:
+ Returns the decimal representation of round (x * 10^n).
+ Return the allocated memory - containing the decimal digits in low-to-high
+ order, terminated with a NUL character - in case of success, NULL in case
+ of memory allocation failure. */
+static char *
+scale10_round_decimal_decoded (int e, mpn_t m, void *memory, int n)
+{
+ int s;
+ size_t extra_zeroes;
+ unsigned int abs_n;
+ unsigned int abs_s;
+ mp_limb_t *pow5_ptr;
+ size_t pow5_len;
+ unsigned int s_limbs;
+ unsigned int s_bits;
+ mpn_t pow5;
+ mpn_t z;
+ void *z_memory;
+ char *digits;
+
+ if (memory == NULL)
+ return NULL;
+ /* x = 2^e * m, hence
+ y = round (2^e * 10^n * m) = round (2^(e+n) * 5^n * m)
+ = round (2^s * 5^n * m). */
+ s = e + n;
+ extra_zeroes = 0;
+ /* Factor out a common power of 10 if possible. */
+ if (s > 0 && n > 0)
+ {
+ extra_zeroes = (s < n ? s : n);
+ s -= extra_zeroes;
+ n -= extra_zeroes;
+ }
+ /* Here y = round (2^s * 5^n * m) * 10^extra_zeroes.
+ Before converting to decimal, we need to compute
+ z = round (2^s * 5^n * m). */
+ /* Compute 5^|n|, possibly shifted by |s| bits if n and s have the same
+ sign. 2.322 is slightly larger than log(5)/log(2). */
+ abs_n = (n >= 0 ? n : -n);
+ abs_s = (s >= 0 ? s : -s);
+ pow5_ptr = (mp_limb_t *) malloc (((int)(abs_n * (2.322f / GMP_LIMB_BITS)) + 1
+ + abs_s / GMP_LIMB_BITS + 1)
+ * sizeof (mp_limb_t));
+ if (pow5_ptr == NULL)
+ {
+ free (memory);
+ return NULL;
+ }
+ /* Initialize with 1. */
+ pow5_ptr[0] = 1;
+ pow5_len = 1;
+ /* Multiply with 5^|n|. */
+ if (abs_n > 0)
+ {
+ static mp_limb_t const small_pow5[13 + 1] =
+ {
+ 1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625,
+ 48828125, 244140625, 1220703125
+ };
+ unsigned int n13;
+ for (n13 = 0; n13 <= abs_n; n13 += 13)
+ {
+ mp_limb_t digit1 = small_pow5[n13 + 13 <= abs_n ? 13 : abs_n - n13];
+ size_t j;
+ mp_twolimb_t carry = 0;
+ for (j = 0; j < pow5_len; j++)
+ {
+ mp_limb_t digit2 = pow5_ptr[j];
+ carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2;
+ pow5_ptr[j] = (mp_limb_t) carry;
+ carry = carry >> GMP_LIMB_BITS;
+ }
+ if (carry > 0)
+ pow5_ptr[pow5_len++] = (mp_limb_t) carry;
+ }
+ }
+ s_limbs = abs_s / GMP_LIMB_BITS;
+ s_bits = abs_s % GMP_LIMB_BITS;
+ if (n >= 0 ? s >= 0 : s <= 0)
+ {
+ /* Multiply with 2^|s|. */
+ if (s_bits > 0)
+ {
+ mp_limb_t *ptr = pow5_ptr;
+ mp_twolimb_t accu = 0;
+ size_t count;
+ for (count = pow5_len; count > 0; count--)
+ {
+ accu += (mp_twolimb_t) *ptr << s_bits;
+ *ptr++ = (mp_limb_t) accu;
+ accu = accu >> GMP_LIMB_BITS;
+ }
+ if (accu > 0)
+ {
+ *ptr = (mp_limb_t) accu;
+ pow5_len++;
+ }
+ }
+ if (s_limbs > 0)
+ {
+ size_t count;
+ for (count = pow5_len; count > 0;)
+ {
+ count--;
+ pow5_ptr[s_limbs + count] = pow5_ptr[count];
+ }
+ for (count = s_limbs; count > 0;)
+ {
+ count--;
+ pow5_ptr[count] = 0;
+ }
+ pow5_len += s_limbs;
+ }
+ pow5.limbs = pow5_ptr;
+ pow5.nlimbs = pow5_len;
+ if (n >= 0)
+ {
+ /* Multiply m with pow5. No division needed. */
+ z_memory = multiply (m, pow5, &z);
+ }
+ else
+ {
+ /* Divide m by pow5 and round. */
+ z_memory = divide (m, pow5, &z);
+ }
+ }
+ else
+ {
+ pow5.limbs = pow5_ptr;
+ pow5.nlimbs = pow5_len;
+ if (n >= 0)
+ {
+ /* n >= 0, s < 0.
+ Multiply m with pow5, then divide by 2^|s|. */
+ mpn_t numerator;
+ mpn_t denominator;
+ void *tmp_memory;
+ tmp_memory = multiply (m, pow5, &numerator);
+ if (tmp_memory == NULL)
+ {
+ free (pow5_ptr);
+ free (memory);
+ return NULL;
+ }
+ /* Construct 2^|s|. */
+ {
+ mp_limb_t *ptr = pow5_ptr + pow5_len;
+ size_t i;
+ for (i = 0; i < s_limbs; i++)
+ ptr[i] = 0;
+ ptr[s_limbs] = (mp_limb_t) 1 << s_bits;
+ denominator.limbs = ptr;
+ denominator.nlimbs = s_limbs + 1;
+ }
+ z_memory = divide (numerator, denominator, &z);
+ free (tmp_memory);
+ }
+ else
+ {
+ /* n < 0, s > 0.
+ Multiply m with 2^s, then divide by pow5. */
+ mpn_t numerator;
+ mp_limb_t *num_ptr;
+ num_ptr = (mp_limb_t *) malloc ((m.nlimbs + s_limbs + 1)
+ * sizeof (mp_limb_t));
+ if (num_ptr == NULL)
+ {
+ free (pow5_ptr);
+ free (memory);
+ return NULL;
+ }
+ {
+ mp_limb_t *destptr = num_ptr;
+ {
+ size_t i;
+ for (i = 0; i < s_limbs; i++)
+ *destptr++ = 0;
+ }
+ if (s_bits > 0)
+ {
+ const mp_limb_t *sourceptr = m.limbs;
+ mp_twolimb_t accu = 0;
+ size_t count;
+ for (count = m.nlimbs; count > 0; count--)
+ {
+ accu += (mp_twolimb_t) *sourceptr++ << s_bits;
+ *destptr++ = (mp_limb_t) accu;
+ accu = accu >> GMP_LIMB_BITS;
+ }
+ if (accu > 0)
+ *destptr++ = (mp_limb_t) accu;
+ }
+ else
+ {
+ const mp_limb_t *sourceptr = m.limbs;
+ size_t count;
+ for (count = m.nlimbs; count > 0; count--)
+ *destptr++ = *sourceptr++;
+ }
+ numerator.limbs = num_ptr;
+ numerator.nlimbs = destptr - num_ptr;
+ }
+ z_memory = divide (numerator, pow5, &z);
+ free (num_ptr);
+ }
+ }
+ free (pow5_ptr);
+ free (memory);
+
+ /* Here y = round (x * 10^n) = z * 10^extra_zeroes. */
+
+ if (z_memory == NULL)
+ return NULL;
+ digits = convert_to_decimal (z, extra_zeroes);
+ free (z_memory);
+ return digits;
+}
+
+# if NEED_PRINTF_LONG_DOUBLE
+
+/* Assuming x is finite and >= 0, and n is an integer:
+ Returns the decimal representation of round (x * 10^n).
+ Return the allocated memory - containing the decimal digits in low-to-high
+ order, terminated with a NUL character - in case of success, NULL in case
+ of memory allocation failure. */
+static char *
+scale10_round_decimal_long_double (long double x, int n)
+{
+ int e IF_LINT(= 0);
+ mpn_t m;
+ void *memory = decode_long_double (x, &e, &m);
+ return scale10_round_decimal_decoded (e, m, memory, n);
+}
+
+# endif
+
+# if NEED_PRINTF_DOUBLE
+
+/* Assuming x is finite and >= 0, and n is an integer:
+ Returns the decimal representation of round (x * 10^n).
+ Return the allocated memory - containing the decimal digits in low-to-high
+ order, terminated with a NUL character - in case of success, NULL in case
+ of memory allocation failure. */
+static char *
+scale10_round_decimal_double (double x, int n)
+{
+ int e IF_LINT(= 0);
+ mpn_t m;
+ void *memory = decode_double (x, &e, &m);
+ return scale10_round_decimal_decoded (e, m, memory, n);
+}
+
+# endif
+
+# if NEED_PRINTF_LONG_DOUBLE
+
+/* Assuming x is finite and > 0:
+ Return an approximation for n with 10^n <= x < 10^(n+1).
+ The approximation is usually the right n, but may be off by 1 sometimes. */
+static int
+floorlog10l (long double x)
+{
+ int exp;
+ long double y;
+ double z;
+ double l;
+
+ /* Split into exponential part and mantissa. */
+ y = frexpl (x, &exp);
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ if (y == 0.0L)
+ return INT_MIN;
+ if (y < 0.5L)
+ {
+ while (y < (1.0L / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2))))
+ {
+ y *= 1.0L * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2));
+ exp -= GMP_LIMB_BITS;
+ }
+ if (y < (1.0L / (1 << 16)))
+ {
+ y *= 1.0L * (1 << 16);
+ exp -= 16;
+ }
+ if (y < (1.0L / (1 << 8)))
+ {
+ y *= 1.0L * (1 << 8);
+ exp -= 8;
+ }
+ if (y < (1.0L / (1 << 4)))
+ {
+ y *= 1.0L * (1 << 4);
+ exp -= 4;
+ }
+ if (y < (1.0L / (1 << 2)))
+ {
+ y *= 1.0L * (1 << 2);
+ exp -= 2;
+ }
+ if (y < (1.0L / (1 << 1)))
+ {
+ y *= 1.0L * (1 << 1);
+ exp -= 1;
+ }
+ }
+ if (!(y >= 0.5L && y < 1.0L))
+ abort ();
+ /* Compute an approximation for l = log2(x) = exp + log2(y). */
+ l = exp;
+ z = y;
+ if (z < 0.70710678118654752444)
+ {
+ z *= 1.4142135623730950488;
+ l -= 0.5;
+ }
+ if (z < 0.8408964152537145431)
+ {
+ z *= 1.1892071150027210667;
+ l -= 0.25;
+ }
+ if (z < 0.91700404320467123175)
+ {
+ z *= 1.0905077326652576592;
+ l -= 0.125;
+ }
+ if (z < 0.9576032806985736469)
+ {
+ z *= 1.0442737824274138403;
+ l -= 0.0625;
+ }
+ /* Now 0.95 <= z <= 1.01. */
+ z = 1 - z;
+ /* log2(1-z) = 1/log(2) * (- z - z^2/2 - z^3/3 - z^4/4 - ...)
+ Four terms are enough to get an approximation with error < 10^-7. */
+ l -= 1.4426950408889634074 * z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25)));
+ /* Finally multiply with log(2)/log(10), yields an approximation for
+ log10(x). */
+ l *= 0.30102999566398119523;
+ /* Round down to the next integer. */
+ return (int) l + (l < 0 ? -1 : 0);
+}
+
+# endif
+
+# if NEED_PRINTF_DOUBLE
+
+/* Assuming x is finite and > 0:
+ Return an approximation for n with 10^n <= x < 10^(n+1).
+ The approximation is usually the right n, but may be off by 1 sometimes. */
+static int
+floorlog10 (double x)
+{
+ int exp;
+ double y;
+ double z;
+ double l;
+
+ /* Split into exponential part and mantissa. */
+ y = frexp (x, &exp);
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ if (y == 0.0)
+ return INT_MIN;
+ if (y < 0.5)
+ {
+ while (y < (1.0 / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2))))
+ {
+ y *= 1.0 * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2));
+ exp -= GMP_LIMB_BITS;
+ }
+ if (y < (1.0 / (1 << 16)))
+ {
+ y *= 1.0 * (1 << 16);
+ exp -= 16;
+ }
+ if (y < (1.0 / (1 << 8)))
+ {
+ y *= 1.0 * (1 << 8);
+ exp -= 8;
+ }
+ if (y < (1.0 / (1 << 4)))
+ {
+ y *= 1.0 * (1 << 4);
+ exp -= 4;
+ }
+ if (y < (1.0 / (1 << 2)))
+ {
+ y *= 1.0 * (1 << 2);
+ exp -= 2;
+ }
+ if (y < (1.0 / (1 << 1)))
+ {
+ y *= 1.0 * (1 << 1);
+ exp -= 1;
+ }
+ }
+ if (!(y >= 0.5 && y < 1.0))
+ abort ();
+ /* Compute an approximation for l = log2(x) = exp + log2(y). */
+ l = exp;
+ z = y;
+ if (z < 0.70710678118654752444)
+ {
+ z *= 1.4142135623730950488;
+ l -= 0.5;
+ }
+ if (z < 0.8408964152537145431)
+ {
+ z *= 1.1892071150027210667;
+ l -= 0.25;
+ }
+ if (z < 0.91700404320467123175)
+ {
+ z *= 1.0905077326652576592;
+ l -= 0.125;
+ }
+ if (z < 0.9576032806985736469)
+ {
+ z *= 1.0442737824274138403;
+ l -= 0.0625;
+ }
+ /* Now 0.95 <= z <= 1.01. */
+ z = 1 - z;
+ /* log2(1-z) = 1/log(2) * (- z - z^2/2 - z^3/3 - z^4/4 - ...)
+ Four terms are enough to get an approximation with error < 10^-7. */
+ l -= 1.4426950408889634074 * z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25)));
+ /* Finally multiply with log(2)/log(10), yields an approximation for
+ log10(x). */
+ l *= 0.30102999566398119523;
+ /* Round down to the next integer. */
+ return (int) l + (l < 0 ? -1 : 0);
+}
+
+# endif
+
+/* Tests whether a string of digits consists of exactly PRECISION zeroes and
+ a single '1' digit. */
+static int
+is_borderline (const char *digits, size_t precision)
+{
+ for (; precision > 0; precision--, digits++)
+ if (*digits != '0')
+ return 0;
+ if (*digits != '1')
+ return 0;
+ digits++;
+ return *digits == '\0';
+}
+
+#endif
+
+#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF
+
+/* Use a different function name, to make it possible that the 'wchar_t'
+ parametrization and the 'char' parametrization get compiled in the same
+ translation unit. */
+# if WIDE_CHAR_VERSION
+# define MAX_ROOM_NEEDED wmax_room_needed
+# else
+# define MAX_ROOM_NEEDED max_room_needed
+# endif
+
+/* Returns the number of TCHAR_T units needed as temporary space for the result
+ of sprintf or SNPRINTF of a single conversion directive. */
+static size_t
+MAX_ROOM_NEEDED (const arguments *ap, size_t arg_index, FCHAR_T conversion,
+ arg_type type, int flags, size_t width, int has_precision,
+ size_t precision, int pad_ourselves)
+{
+ size_t tmp_length;
+
+ switch (conversion)
+ {
+ case 'd': case 'i': case 'u':
+ if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+ * 0.30103 /* binary -> decimal */
+ )
+ + 1; /* turn floor into ceil */
+ else if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+ * 0.30103 /* binary -> decimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+ * 0.30103 /* binary -> decimal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Multiply by 2, as an estimate for FLAG_GROUP. */
+ tmp_length = xsum (tmp_length, tmp_length);
+ /* Add 1, to account for a leading sign. */
+ tmp_length = xsum (tmp_length, 1);
+ break;
+
+ case 'o':
+ if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+ * 0.333334 /* binary -> octal */
+ )
+ + 1; /* turn floor into ceil */
+ else if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+ * 0.333334 /* binary -> octal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+ * 0.333334 /* binary -> octal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Add 1, to account for a leading sign. */
+ tmp_length = xsum (tmp_length, 1);
+ break;
+
+ case 'x': case 'X':
+ if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ else if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Add 2, to account for a leading sign or alternate form. */
+ tmp_length = xsum (tmp_length, 2);
+ break;
+
+ case 'f': case 'F':
+ if (type == TYPE_LONGDOUBLE)
+ tmp_length =
+ (unsigned int) (LDBL_MAX_EXP
+ * 0.30103 /* binary -> decimal */
+ * 2 /* estimate for FLAG_GROUP */
+ )
+ + 1 /* turn floor into ceil */
+ + 10; /* sign, decimal point etc. */
+ else
+ tmp_length =
+ (unsigned int) (DBL_MAX_EXP
+ * 0.30103 /* binary -> decimal */
+ * 2 /* estimate for FLAG_GROUP */
+ )
+ + 1 /* turn floor into ceil */
+ + 10; /* sign, decimal point etc. */
+ tmp_length = xsum (tmp_length, precision);
+ break;
+
+ case 'e': case 'E': case 'g': case 'G':
+ tmp_length =
+ 12; /* sign, decimal point, exponent etc. */
+ tmp_length = xsum (tmp_length, precision);
+ break;
+
+ case 'a': case 'A':
+ if (type == TYPE_LONGDOUBLE)
+ tmp_length =
+ (unsigned int) (LDBL_DIG
+ * 0.831 /* decimal -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) (DBL_DIG
+ * 0.831 /* decimal -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Account for sign, decimal point etc. */
+ tmp_length = xsum (tmp_length, 12);
+ break;
+
+ case 'c':
+# if HAVE_WINT_T && !WIDE_CHAR_VERSION
+ if (type == TYPE_WIDE_CHAR)
+ {
+ tmp_length = MB_CUR_MAX;
+# if ENABLE_WCHAR_FALLBACK
+ if (tmp_length < (sizeof (wchar_t) > 2 ? 10 : 6))
+ tmp_length = (sizeof (wchar_t) > 2 ? 10 : 6);
+# endif
+ }
+ else
+# endif
+ tmp_length = 1;
+ break;
+
+ case 's':
+# if HAVE_WCHAR_T
+ if (type == TYPE_WIDE_STRING)
+ {
+# if WIDE_CHAR_VERSION
+ /* ISO C says about %ls in fwprintf:
+ "If the precision is not specified or is greater than the size
+ of the array, the array shall contain a null wide character."
+ So if there is a precision, we must not use wcslen. */
+ const wchar_t *arg = ap->arg[arg_index].a.a_wide_string;
+
+ if (has_precision)
+ tmp_length = local_wcsnlen (arg, precision);
+ else
+ tmp_length = local_wcslen (arg);
+# else
+ /* ISO C says about %ls in fprintf:
+ "If a precision is specified, no more than that many bytes are
+ written (including shift sequences, if any), and the array
+ shall contain a null wide character if, to equal the multibyte
+ character sequence length given by the precision, the function
+ would need to access a wide character one past the end of the
+ array."
+ So if there is a precision, we must not use wcslen. */
+ /* This case has already been handled separately in VASNPRINTF. */
+ abort ();
+# endif
+ }
+ else
+# endif
+ {
+# if WIDE_CHAR_VERSION
+ /* ISO C says about %s in fwprintf:
+ "If the precision is not specified or is greater than the size
+ of the converted array, the converted array shall contain a
+ null wide character."
+ So if there is a precision, we must not use strlen. */
+ /* This case has already been handled separately in VASNPRINTF. */
+ abort ();
+# else
+ /* ISO C says about %s in fprintf:
+ "If the precision is not specified or greater than the size of
+ the array, the array shall contain a null character."
+ So if there is a precision, we must not use strlen. */
+ const char *arg = ap->arg[arg_index].a.a_string;
+
+ if (has_precision)
+ tmp_length = local_strnlen (arg, precision);
+ else
+ tmp_length = strlen (arg);
+# endif
+ }
+ break;
+
+ case 'p':
+ tmp_length =
+ (unsigned int) (sizeof (void *) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1 /* turn floor into ceil */
+ + 2; /* account for leading 0x */
+ break;
+
+ default:
+ abort ();
+ }
+
+ if (!pad_ourselves)
+ {
+# if ENABLE_UNISTDIO
+ /* Padding considers the number of characters, therefore the number of
+ elements after padding may be
+ > max (tmp_length, width)
+ but is certainly
+ <= tmp_length + width. */
+ tmp_length = xsum (tmp_length, width);
+# else
+ /* Padding considers the number of elements, says POSIX. */
+ if (tmp_length < width)
+ tmp_length = width;
+# endif
+ }
+
+ tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
+
+ return tmp_length;
+}
+
+#endif
+
+DCHAR_T *
+VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp,
+ const FCHAR_T *format, va_list args)
+{
+ DIRECTIVES d;
+ arguments a;
+
+ if (PRINTF_PARSE (format, &d, &a) < 0)
+ /* errno is already set. */
+ return NULL;
+
+ /* Frees the memory allocated by this function. Preserves errno. */
+#define CLEANUP() \
+ if (d.dir != d.direct_alloc_dir) \
+ free (d.dir); \
+ if (a.arg != a.direct_alloc_arg) \
+ free (a.arg);
+
+ if (PRINTF_FETCHARGS (args, &a) < 0)
+ goto fail_1_with_EINVAL;
+
+ {
+ size_t buf_neededlength;
+ TCHAR_T *buf;
+ TCHAR_T *buf_malloced;
+ const FCHAR_T *cp;
+ size_t i;
+ DIRECTIVE *dp;
+ /* Output string accumulator. */
+ DCHAR_T *result;
+ size_t allocated;
+ size_t length;
+
+ /* Allocate a small buffer that will hold a directive passed to
+ sprintf or snprintf. */
+ buf_neededlength =
+ xsum4 (7, d.max_width_length, d.max_precision_length, 6);
+#if HAVE_ALLOCA
+ if (buf_neededlength < 4000 / sizeof (TCHAR_T))
+ {
+ buf = (TCHAR_T *) alloca (buf_neededlength * sizeof (TCHAR_T));
+ buf_malloced = NULL;
+ }
+ else
+#endif
+ {
+ size_t buf_memsize = xtimes (buf_neededlength, sizeof (TCHAR_T));
+ if (size_overflow_p (buf_memsize))
+ goto out_of_memory_1;
+ buf = (TCHAR_T *) malloc (buf_memsize);
+ if (buf == NULL)
+ goto out_of_memory_1;
+ buf_malloced = buf;
+ }
+
+ result = resultbuf;
+ allocated = (resultbuf != NULL ? *lengthp : 0);
+ length = 0;
+ /* Invariants:
+ result is either == resultbuf or malloc-allocated.
+ If result == NULL, resultbuf is == NULL as well.
+ If length > 0, then result != NULL. */
+
+ /* Ensures that allocated >= needed. Aborts through a jump to
+ out_of_memory if needed is SIZE_MAX or otherwise too big. */
+#define ENSURE_ALLOCATION_ELSE(needed, oom_statement) \
+ if ((needed) > allocated) \
+ { \
+ size_t memory_size; \
+ DCHAR_T *memory; \
+ \
+ allocated = (allocated > 0 ? xtimes (allocated, 2) : 12); \
+ if ((needed) > allocated) \
+ allocated = (needed); \
+ memory_size = xtimes (allocated, sizeof (DCHAR_T)); \
+ if (size_overflow_p (memory_size)) \
+ oom_statement \
+ if (result == resultbuf) \
+ memory = (DCHAR_T *) malloc (memory_size); \
+ else \
+ memory = (DCHAR_T *) realloc (result, memory_size); \
+ if (memory == NULL) \
+ oom_statement \
+ if (result == resultbuf && length > 0) \
+ DCHAR_CPY (memory, result, length); \
+ result = memory; \
+ }
+#define ENSURE_ALLOCATION(needed) \
+ ENSURE_ALLOCATION_ELSE((needed), goto out_of_memory; )
+
+ for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++)
+ {
+ if (cp != dp->dir_start)
+ {
+ size_t n = dp->dir_start - cp;
+ size_t augmented_length = xsum (length, n);
+
+ ENSURE_ALLOCATION (augmented_length);
+ /* This copies a piece of FCHAR_T[] into a DCHAR_T[]. Here we
+ need that the format string contains only ASCII characters
+ if FCHAR_T and DCHAR_T are not the same type. */
+ if (sizeof (FCHAR_T) == sizeof (DCHAR_T))
+ {
+ DCHAR_CPY (result + length, (const DCHAR_T *) cp, n);
+ length = augmented_length;
+ }
+ else
+ {
+ do
+ result[length++] = *cp++;
+ while (--n > 0);
+ }
+ }
+ if (i == d.count)
+ break;
+
+ /* Execute a single directive. */
+ if (dp->conversion == '%')
+ {
+ size_t augmented_length;
+
+ if (!(dp->arg_index == ARG_NONE))
+ abort ();
+ augmented_length = xsum (length, 1);
+ ENSURE_ALLOCATION (augmented_length);
+ result[length] = '%';
+ length = augmented_length;
+ }
+ else
+ {
+ if (!(dp->arg_index != ARG_NONE))
+ abort ();
+
+ if (dp->conversion == 'n')
+ {
+ switch (a.arg[dp->arg_index].type)
+ {
+ case TYPE_COUNT_SCHAR_POINTER:
+ *a.arg[dp->arg_index].a.a_count_schar_pointer = length;
+ break;
+ case TYPE_COUNT_SHORT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_short_pointer = length;
+ break;
+ case TYPE_COUNT_INT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_int_pointer = length;
+ break;
+ case TYPE_COUNT_LONGINT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_longint_pointer = length;
+ break;
+ case TYPE_COUNT_LONGLONGINT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length;
+ break;
+ default:
+ abort ();
+ }
+ }
+#if ENABLE_UNISTDIO
+ /* The unistdio extensions. */
+ else if (dp->conversion == 'U')
+ {
+ arg_type type = a.arg[dp->arg_index].type;
+ int flags = dp->flags;
+ int has_width;
+ size_t width;
+ int has_precision;
+ size_t precision;
+
+ has_width = 0;
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ width = arg;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = -width;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ has_width = 1;
+ }
+
+ has_precision = 0;
+ precision = 0;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ /* "A negative precision is taken as if the precision
+ were omitted." */
+ if (arg >= 0)
+ {
+ precision = arg;
+ has_precision = 1;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+ has_precision = 1;
+ }
+ }
+
+ switch (type)
+ {
+ case TYPE_U8_STRING:
+ {
+ const uint8_t *arg = a.arg[dp->arg_index].a.a_u8_string;
+ const uint8_t *arg_end;
+ size_t characters;
+
+ if (has_precision)
+ {
+ /* Use only PRECISION characters, from the left. */
+ arg_end = arg;
+ characters = 0;
+ for (; precision > 0; precision--)
+ {
+ int count = u8_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ goto fail_with_EILSEQ;
+ arg_end += count;
+ characters++;
+ }
+ }
+ else if (has_width)
+ {
+ /* Use the entire string, and count the number of
+ characters. */
+ arg_end = arg;
+ characters = 0;
+ for (;;)
+ {
+ int count = u8_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ goto fail_with_EILSEQ;
+ arg_end += count;
+ characters++;
+ }
+ }
+ else
+ {
+ /* Use the entire string. */
+ arg_end = arg + u8_strlen (arg);
+ /* The number of characters doesn't matter. */
+ characters = 0;
+ }
+
+ if (characters < width && !(flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+# if DCHAR_IS_UINT8_T
+ {
+ size_t n = arg_end - arg;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_CPY (result + length, arg, n);
+ length += n;
+ }
+# else
+ { /* Convert. */
+ DCHAR_T *converted = result + length;
+ size_t converted_len = allocated - length;
+# if DCHAR_IS_TCHAR
+ /* Convert from UTF-8 to locale encoding. */
+ converted =
+ u8_conv_to_encoding (locale_charset (),
+ iconveh_question_mark,
+ arg, arg_end - arg, NULL,
+ converted, &converted_len);
+# else
+ /* Convert from UTF-8 to UTF-16/UTF-32. */
+ converted =
+ U8_TO_DCHAR (arg, arg_end - arg,
+ converted, &converted_len);
+# endif
+ if (converted == NULL)
+ goto fail_with_errno;
+ if (converted != result + length)
+ {
+ ENSURE_ALLOCATION_ELSE (xsum (length, converted_len),
+ { free (converted); goto out_of_memory; });
+ DCHAR_CPY (result + length, converted, converted_len);
+ free (converted);
+ }
+ length += converted_len;
+ }
+# endif
+
+ if (characters < width && (flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+ break;
+
+ case TYPE_U16_STRING:
+ {
+ const uint16_t *arg = a.arg[dp->arg_index].a.a_u16_string;
+ const uint16_t *arg_end;
+ size_t characters;
+
+ if (has_precision)
+ {
+ /* Use only PRECISION characters, from the left. */
+ arg_end = arg;
+ characters = 0;
+ for (; precision > 0; precision--)
+ {
+ int count = u16_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ goto fail_with_EILSEQ;
+ arg_end += count;
+ characters++;
+ }
+ }
+ else if (has_width)
+ {
+ /* Use the entire string, and count the number of
+ characters. */
+ arg_end = arg;
+ characters = 0;
+ for (;;)
+ {
+ int count = u16_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ goto fail_with_EILSEQ;
+ arg_end += count;
+ characters++;
+ }
+ }
+ else
+ {
+ /* Use the entire string. */
+ arg_end = arg + u16_strlen (arg);
+ /* The number of characters doesn't matter. */
+ characters = 0;
+ }
+
+ if (characters < width && !(flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+# if DCHAR_IS_UINT16_T
+ {
+ size_t n = arg_end - arg;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_CPY (result + length, arg, n);
+ length += n;
+ }
+# else
+ { /* Convert. */
+ DCHAR_T *converted = result + length;
+ size_t converted_len = allocated - length;
+# if DCHAR_IS_TCHAR
+ /* Convert from UTF-16 to locale encoding. */
+ converted =
+ u16_conv_to_encoding (locale_charset (),
+ iconveh_question_mark,
+ arg, arg_end - arg, NULL,
+ converted, &converted_len);
+# else
+ /* Convert from UTF-16 to UTF-8/UTF-32. */
+ converted =
+ U16_TO_DCHAR (arg, arg_end - arg,
+ converted, &converted_len);
+# endif
+ if (converted == NULL)
+ goto fail_with_errno;
+ if (converted != result + length)
+ {
+ ENSURE_ALLOCATION_ELSE (xsum (length, converted_len),
+ { free (converted); goto out_of_memory; });
+ DCHAR_CPY (result + length, converted, converted_len);
+ free (converted);
+ }
+ length += converted_len;
+ }
+# endif
+
+ if (characters < width && (flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+ break;
+
+ case TYPE_U32_STRING:
+ {
+ const uint32_t *arg = a.arg[dp->arg_index].a.a_u32_string;
+ const uint32_t *arg_end;
+ size_t characters;
+
+ if (has_precision)
+ {
+ /* Use only PRECISION characters, from the left. */
+ arg_end = arg;
+ characters = 0;
+ for (; precision > 0; precision--)
+ {
+ int count = u32_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ goto fail_with_EILSEQ;
+ arg_end += count;
+ characters++;
+ }
+ }
+ else if (has_width)
+ {
+ /* Use the entire string, and count the number of
+ characters. */
+ arg_end = arg;
+ characters = 0;
+ for (;;)
+ {
+ int count = u32_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ goto fail_with_EILSEQ;
+ arg_end += count;
+ characters++;
+ }
+ }
+ else
+ {
+ /* Use the entire string. */
+ arg_end = arg + u32_strlen (arg);
+ /* The number of characters doesn't matter. */
+ characters = 0;
+ }
+
+ if (characters < width && !(flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+# if DCHAR_IS_UINT32_T
+ {
+ size_t n = arg_end - arg;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_CPY (result + length, arg, n);
+ length += n;
+ }
+# else
+ { /* Convert. */
+ DCHAR_T *converted = result + length;
+ size_t converted_len = allocated - length;
+# if DCHAR_IS_TCHAR
+ /* Convert from UTF-32 to locale encoding. */
+ converted =
+ u32_conv_to_encoding (locale_charset (),
+ iconveh_question_mark,
+ arg, arg_end - arg, NULL,
+ converted, &converted_len);
+# else
+ /* Convert from UTF-32 to UTF-8/UTF-16. */
+ converted =
+ U32_TO_DCHAR (arg, arg_end - arg,
+ converted, &converted_len);
+# endif
+ if (converted == NULL)
+ goto fail_with_errno;
+ if (converted != result + length)
+ {
+ ENSURE_ALLOCATION_ELSE (xsum (length, converted_len),
+ { free (converted); goto out_of_memory; });
+ DCHAR_CPY (result + length, converted, converted_len);
+ free (converted);
+ }
+ length += converted_len;
+ }
+# endif
+
+ if (characters < width && (flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+ break;
+
+ default:
+ abort ();
+ }
+ }
+#endif
+#if (!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL) || ENABLE_WCHAR_FALLBACK) && HAVE_WCHAR_T
+ else if (dp->conversion == 's'
+# if WIDE_CHAR_VERSION
+ && a.arg[dp->arg_index].type != TYPE_WIDE_STRING
+# else
+ && a.arg[dp->arg_index].type == TYPE_WIDE_STRING
+# endif
+ )
+ {
+ /* The normal handling of the 's' directive below requires
+ allocating a temporary buffer. The determination of its
+ length (tmp_length), in the case when a precision is
+ specified, below requires a conversion between a char[]
+ string and a wchar_t[] wide string. It could be done, but
+ we have no guarantee that the implementation of sprintf will
+ use the exactly same algorithm. Without this guarantee, it
+ is possible to have buffer overrun bugs. In order to avoid
+ such bugs, we implement the entire processing of the 's'
+ directive ourselves. */
+ int flags = dp->flags;
+ int has_width;
+ size_t width;
+ int has_precision;
+ size_t precision;
+
+ has_width = 0;
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ width = arg;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = -width;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ has_width = 1;
+ }
+
+ has_precision = 0;
+ precision = 6;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ /* "A negative precision is taken as if the precision
+ were omitted." */
+ if (arg >= 0)
+ {
+ precision = arg;
+ has_precision = 1;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+ has_precision = 1;
+ }
+ }
+
+# if WIDE_CHAR_VERSION
+ /* %s in vasnwprintf. See the specification of fwprintf. */
+ {
+ const char *arg = a.arg[dp->arg_index].a.a_string;
+ const char *arg_end;
+ size_t characters;
+
+ if (has_precision)
+ {
+ /* Use only as many bytes as needed to produce PRECISION
+ wide characters, from the left. */
+# if HAVE_MBRTOWC
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ arg_end = arg;
+ characters = 0;
+ for (; precision > 0; precision--)
+ {
+ int count;
+# if HAVE_MBRTOWC
+ count = mbrlen (arg_end, MB_CUR_MAX, &state);
+# else
+ count = mblen (arg_end, MB_CUR_MAX);
+# endif
+ if (count == 0)
+ /* Found the terminating NUL. */
+ break;
+ if (count < 0)
+ /* Invalid or incomplete multibyte character. */
+ goto fail_with_EILSEQ;
+ arg_end += count;
+ characters++;
+ }
+ }
+ else if (has_width)
+ {
+ /* Use the entire string, and count the number of wide
+ characters. */
+# if HAVE_MBRTOWC
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ arg_end = arg;
+ characters = 0;
+ for (;;)
+ {
+ int count;
+# if HAVE_MBRTOWC
+ count = mbrlen (arg_end, MB_CUR_MAX, &state);
+# else
+ count = mblen (arg_end, MB_CUR_MAX);
+# endif
+ if (count == 0)
+ /* Found the terminating NUL. */
+ break;
+ if (count < 0)
+ /* Invalid or incomplete multibyte character. */
+ goto fail_with_EILSEQ;
+ arg_end += count;
+ characters++;
+ }
+ }
+ else
+ {
+ /* Use the entire string. */
+ arg_end = arg + strlen (arg);
+ /* The number of characters doesn't matter. */
+ characters = 0;
+ }
+
+ if (characters < width && !(flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+ if (has_precision || has_width)
+ {
+ /* We know the number of wide characters in advance. */
+ size_t remaining;
+# if HAVE_MBRTOWC
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ ENSURE_ALLOCATION (xsum (length, characters));
+ for (remaining = characters; remaining > 0; remaining--)
+ {
+ wchar_t wc;
+ int count;
+# if HAVE_MBRTOWC
+ count = mbrtowc (&wc, arg, arg_end - arg, &state);
+# else
+ count = mbtowc (&wc, arg, arg_end - arg);
+# endif
+ if (count <= 0)
+ /* mbrtowc not consistent with mbrlen, or mbtowc
+ not consistent with mblen. */
+ abort ();
+ result[length++] = wc;
+ arg += count;
+ }
+ if (!(arg == arg_end))
+ abort ();
+ }
+ else
+ {
+# if HAVE_MBRTOWC
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ while (arg < arg_end)
+ {
+ wchar_t wc;
+ int count;
+# if HAVE_MBRTOWC
+ count = mbrtowc (&wc, arg, arg_end - arg, &state);
+# else
+ count = mbtowc (&wc, arg, arg_end - arg);
+# endif
+ if (count <= 0)
+ /* mbrtowc not consistent with mbrlen, or mbtowc
+ not consistent with mblen. */
+ abort ();
+ ENSURE_ALLOCATION (xsum (length, 1));
+ result[length++] = wc;
+ arg += count;
+ }
+ }
+
+ if (characters < width && (flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+# else
+ /* %ls in vasnprintf. See the specification of fprintf. */
+ {
+ const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string;
+ const wchar_t *arg_end;
+ size_t characters;
+# if !DCHAR_IS_TCHAR
+ /* This code assumes that TCHAR_T is 'char'. */
+ static_assert (sizeof (TCHAR_T) == 1);
+ TCHAR_T *tmpsrc;
+ DCHAR_T *tmpdst;
+ size_t tmpdst_len;
+# endif
+ size_t w;
+
+ if (has_precision)
+ {
+ /* Use only as many wide characters as needed to produce
+ at most PRECISION bytes, from the left. */
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ arg_end = arg;
+ characters = 0;
+ while (precision > 0)
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+
+ if (*arg_end == 0)
+ /* Found the terminating null wide character. */
+ break;
+ count = local_wcrtomb (cbuf, *arg_end, &state);
+ if (count < 0)
+ /* Cannot convert. */
+ goto fail_with_EILSEQ;
+ if (precision < (unsigned int) count)
+ break;
+ arg_end++;
+ characters += count;
+ precision -= count;
+ }
+ }
+# if DCHAR_IS_TCHAR
+ else if (has_width)
+# else
+ else
+# endif
+ {
+ /* Use the entire string, and count the number of
+ bytes. */
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ arg_end = arg;
+ characters = 0;
+ for (;;)
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+
+ if (*arg_end == 0)
+ /* Found the terminating null wide character. */
+ break;
+ count = local_wcrtomb (cbuf, *arg_end, &state);
+ if (count < 0)
+ /* Cannot convert. */
+ goto fail_with_EILSEQ;
+ arg_end++;
+ characters += count;
+ }
+ }
+# if DCHAR_IS_TCHAR
+ else
+ {
+ /* Use the entire string. */
+ arg_end = arg + local_wcslen (arg);
+ /* The number of bytes doesn't matter. */
+ characters = 0;
+ }
+# endif
+
+# if !DCHAR_IS_TCHAR
+ /* Convert the string into a piece of temporary memory. */
+ tmpsrc = (TCHAR_T *) malloc (characters * sizeof (TCHAR_T));
+ if (tmpsrc == NULL)
+ goto out_of_memory;
+ {
+ TCHAR_T *tmpptr = tmpsrc;
+ size_t remaining;
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ for (remaining = characters; remaining > 0; )
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+
+ if (*arg == 0)
+ abort ();
+ count = local_wcrtomb (cbuf, *arg, &state);
+ if (count <= 0)
+ /* Inconsistency. */
+ abort ();
+ memcpy (tmpptr, cbuf, count);
+ tmpptr += count;
+ arg++;
+ remaining -= count;
+ }
+ if (!(arg == arg_end))
+ abort ();
+ }
+
+ /* Convert from TCHAR_T[] to DCHAR_T[]. */
+ tmpdst =
+ DCHAR_CONV_FROM_ENCODING (locale_charset (),
+ iconveh_question_mark,
+ tmpsrc, characters,
+ NULL,
+ NULL, &tmpdst_len);
+ if (tmpdst == NULL)
+ {
+ free (tmpsrc);
+ goto fail_with_errno;
+ }
+ free (tmpsrc);
+# endif
+
+ if (has_width)
+ {
+# if ENABLE_UNISTDIO
+ /* Outside POSIX, it's preferable to compare the width
+ against the number of _characters_ of the converted
+ value. */
+ w = DCHAR_MBSNLEN (result + length, characters);
+# else
+ /* The width is compared against the number of _bytes_
+ of the converted value, says POSIX. */
+ w = characters;
+# endif
+ }
+ else
+ /* w doesn't matter. */
+ w = 0;
+
+ if (w < width && !(flags & FLAG_LEFT))
+ {
+ size_t n = width - w;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+# if DCHAR_IS_TCHAR
+ if (has_precision || has_width)
+ {
+ /* We know the number of bytes in advance. */
+ size_t remaining;
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ ENSURE_ALLOCATION (xsum (length, characters));
+ for (remaining = characters; remaining > 0; )
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+
+ if (*arg == 0)
+ abort ();
+ count = local_wcrtomb (cbuf, *arg, &state);
+ if (count <= 0)
+ /* Inconsistency. */
+ abort ();
+ memcpy (result + length, cbuf, count);
+ length += count;
+ arg++;
+ remaining -= count;
+ }
+ if (!(arg == arg_end))
+ abort ();
+ }
+ else
+ {
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ while (arg < arg_end)
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+
+ if (*arg == 0)
+ abort ();
+ count = local_wcrtomb (cbuf, *arg, &state);
+ if (count <= 0)
+ /* Cannot convert. */
+ goto fail_with_EILSEQ;
+ ENSURE_ALLOCATION (xsum (length, count));
+ memcpy (result + length, cbuf, count);
+ length += count;
+ arg++;
+ }
+ }
+# else
+ ENSURE_ALLOCATION_ELSE (xsum (length, tmpdst_len),
+ { free (tmpdst); goto out_of_memory; });
+ DCHAR_CPY (result + length, tmpdst, tmpdst_len);
+ free (tmpdst);
+ length += tmpdst_len;
+# endif
+
+ if (w < width && (flags & FLAG_LEFT))
+ {
+ size_t n = width - w;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+# endif
+ }
+#endif
+#if ENABLE_WCHAR_FALLBACK && HAVE_WINT_T && !WIDE_CHAR_VERSION
+ else if (dp->conversion == 'c'
+ && a.arg[dp->arg_index].type == TYPE_WIDE_CHAR)
+ {
+ /* Implement the 'lc' directive ourselves, in order to provide
+ the fallback that avoids EILSEQ. */
+ int flags = dp->flags;
+ int has_width;
+ size_t width;
+
+ has_width = 0;
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ width = arg;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = -width;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ has_width = 1;
+ }
+
+ /* %lc in vasnprintf. See the specification of fprintf. */
+ {
+ wchar_t arg = (wchar_t) a.arg[dp->arg_index].a.a_wide_char;
+ size_t characters;
+# if !DCHAR_IS_TCHAR
+ /* This code assumes that TCHAR_T is 'char'. */
+ static_assert (sizeof (TCHAR_T) == 1);
+ TCHAR_T tmpsrc[64]; /* Assume MB_CUR_MAX <= 64. */
+ DCHAR_T *tmpdst;
+ size_t tmpdst_len;
+# endif
+ size_t w;
+
+# if DCHAR_IS_TCHAR
+ if (has_width)
+# endif
+ {
+ /* Count the number of bytes. */
+ characters = 0;
+ if (arg != 0)
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+
+ count = local_wcrtomb (cbuf, arg, &state);
+ if (count < 0)
+ /* Inconsistency. */
+ abort ();
+ characters = count;
+ }
+ }
+# if DCHAR_IS_TCHAR
+ else
+ {
+ /* The number of bytes doesn't matter. */
+ characters = 0;
+ }
+# endif
+
+# if !DCHAR_IS_TCHAR
+ /* Convert the string into a piece of temporary memory. */
+ if (characters > 0) /* implies arg != 0 */
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+
+ count = local_wcrtomb (cbuf, arg, &state);
+ if (count <= 0)
+ /* Inconsistency. */
+ abort ();
+ memcpy (tmpsrc, cbuf, count);
+ }
+
+ /* Convert from TCHAR_T[] to DCHAR_T[]. */
+ tmpdst =
+ DCHAR_CONV_FROM_ENCODING (locale_charset (),
+ iconveh_question_mark,
+ tmpsrc, characters,
+ NULL,
+ NULL, &tmpdst_len);
+ if (tmpdst == NULL)
+ goto fail_with_errno;
+# endif
+
+ if (has_width)
+ {
+# if ENABLE_UNISTDIO
+ /* Outside POSIX, it's preferable to compare the width
+ against the number of _characters_ of the converted
+ value. */
+ w = DCHAR_MBSNLEN (result + length, characters);
+# else
+ /* The width is compared against the number of _bytes_
+ of the converted value, says POSIX. */
+ w = characters;
+# endif
+ }
+ else
+ /* w doesn't matter. */
+ w = 0;
+
+ if (w < width && !(flags & FLAG_LEFT))
+ {
+ size_t n = width - w;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+# if DCHAR_IS_TCHAR
+ if (has_width)
+ {
+ /* We know the number of bytes in advance. */
+ ENSURE_ALLOCATION (xsum (length, characters));
+ if (characters > 0) /* implies arg != 0 */
+ {
+ int count;
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+
+ count = local_wcrtomb (result + length, arg, &state);
+ if (count <= 0)
+ /* Inconsistency. */
+ abort ();
+ length += count;
+ }
+ }
+ else
+ {
+ if (arg != 0)
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+
+ count = local_wcrtomb (cbuf, arg, &state);
+ if (count <= 0)
+ /* Inconsistency. */
+ abort ();
+ ENSURE_ALLOCATION (xsum (length, count));
+ memcpy (result + length, cbuf, count);
+ length += count;
+ }
+ }
+# else
+ ENSURE_ALLOCATION_ELSE (xsum (length, tmpdst_len),
+ { free (tmpdst); goto out_of_memory; });
+ DCHAR_CPY (result + length, tmpdst, tmpdst_len);
+ free (tmpdst);
+ length += tmpdst_len;
+# endif
+
+ if (w < width && (flags & FLAG_LEFT))
+ {
+ size_t n = width - w;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+ }
+#endif
+#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
+ else if ((dp->conversion == 'a' || dp->conversion == 'A')
+# if !(NEED_PRINTF_DIRECTIVE_A || (NEED_PRINTF_LONG_DOUBLE && NEED_PRINTF_DOUBLE))
+ && (0
+# if NEED_PRINTF_DOUBLE
+ || a.arg[dp->arg_index].type == TYPE_DOUBLE
+# endif
+# if NEED_PRINTF_LONG_DOUBLE
+ || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
+# endif
+ )
+# endif
+ )
+ {
+ arg_type type = a.arg[dp->arg_index].type;
+ int flags = dp->flags;
+ size_t width;
+ int has_precision;
+ size_t precision;
+ size_t tmp_length;
+ size_t count;
+ DCHAR_T tmpbuf[700];
+ DCHAR_T *tmp;
+ DCHAR_T *pad_ptr;
+ DCHAR_T *p;
+
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ width = arg;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = -width;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ }
+
+ has_precision = 0;
+ precision = 0;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ /* "A negative precision is taken as if the precision
+ were omitted." */
+ if (arg >= 0)
+ {
+ precision = arg;
+ has_precision = 1;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+ has_precision = 1;
+ }
+ }
+
+ /* Allocate a temporary buffer of sufficient size. */
+ if (type == TYPE_LONGDOUBLE)
+ tmp_length =
+ (unsigned int) ((LDBL_DIG + 1)
+ * 0.831 /* decimal -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) ((DBL_DIG + 1)
+ * 0.831 /* decimal -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Account for sign, decimal point etc. */
+ tmp_length = xsum (tmp_length, 12);
+
+ if (tmp_length < width)
+ tmp_length = width;
+
+ tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
+
+ if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T))
+ tmp = tmpbuf;
+ else
+ {
+ size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T));
+
+ if (size_overflow_p (tmp_memsize))
+ /* Overflow, would lead to out of memory. */
+ goto out_of_memory;
+ tmp = (DCHAR_T *) malloc (tmp_memsize);
+ if (tmp == NULL)
+ /* Out of memory. */
+ goto out_of_memory;
+ }
+
+ pad_ptr = NULL;
+ p = tmp;
+ if (type == TYPE_LONGDOUBLE)
+ {
+# if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE
+ long double arg = a.arg[dp->arg_index].a.a_longdouble;
+
+ if (isnanl (arg))
+ {
+ if (dp->conversion == 'A')
+ {
+ *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+ }
+ else
+ {
+ *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+ }
+ }
+ else
+ {
+ int sign = 0;
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ if (signbit (arg)) /* arg < 0.0L or negative zero */
+ {
+ sign = -1;
+ arg = -arg;
+ }
+
+ if (sign < 0)
+ *p++ = '-';
+ else if (flags & FLAG_SHOWSIGN)
+ *p++ = '+';
+ else if (flags & FLAG_SPACE)
+ *p++ = ' ';
+
+ if (arg > 0.0L && arg + arg == arg)
+ {
+ if (dp->conversion == 'A')
+ {
+ *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+ }
+ else
+ {
+ *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+ }
+ }
+ else
+ {
+ int exponent;
+ long double mantissa;
+
+ if (arg > 0.0L)
+ mantissa = printf_frexpl (arg, &exponent);
+ else
+ {
+ exponent = 0;
+ mantissa = 0.0L;
+ }
+
+ if (has_precision
+ && precision < (unsigned int) ((LDBL_DIG + 1) * 0.831) + 1)
+ {
+ /* Round the mantissa. */
+ long double tail = mantissa;
+ size_t q;
+
+ for (q = precision; ; q--)
+ {
+ int digit = (int) tail;
+ tail -= digit;
+ if (q == 0)
+ {
+ if (digit & 1 ? tail >= 0.5L : tail > 0.5L)
+ tail = 1 - tail;
+ else
+ tail = - tail;
+ break;
+ }
+ tail *= 16.0L;
+ }
+ if (tail != 0.0L)
+ for (q = precision; q > 0; q--)
+ tail *= 0.0625L;
+ mantissa += tail;
+ }
+
+ *p++ = '0';
+ *p++ = dp->conversion - 'A' + 'X';
+ pad_ptr = p;
+ {
+ int digit;
+
+ digit = (int) mantissa;
+ mantissa -= digit;
+ *p++ = '0' + digit;
+ if ((flags & FLAG_ALT)
+ || mantissa > 0.0L || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ /* This loop terminates because we assume
+ that FLT_RADIX is a power of 2. */
+ while (mantissa > 0.0L)
+ {
+ mantissa *= 16.0L;
+ digit = (int) mantissa;
+ mantissa -= digit;
+ *p++ = digit
+ + (digit < 10
+ ? '0'
+ : dp->conversion - 10);
+ if (precision > 0)
+ precision--;
+ }
+ while (precision > 0)
+ {
+ *p++ = '0';
+ precision--;
+ }
+ }
+ }
+ *p++ = dp->conversion - 'A' + 'P';
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ { '%', '+', 'd', '\0' };
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, "%+d", exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, "%+d", exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+# endif
+ }
+
+ END_LONG_DOUBLE_ROUNDING ();
+ }
+# else
+ abort ();
+# endif
+ }
+ else
+ {
+# if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE
+ double arg = a.arg[dp->arg_index].a.a_double;
+
+ if (isnand (arg))
+ {
+ if (dp->conversion == 'A')
+ {
+ *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+ }
+ else
+ {
+ *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+ }
+ }
+ else
+ {
+ int sign = 0;
+
+ if (signbit (arg)) /* arg < 0.0 or negative zero */
+ {
+ sign = -1;
+ arg = -arg;
+ }
+
+ if (sign < 0)
+ *p++ = '-';
+ else if (flags & FLAG_SHOWSIGN)
+ *p++ = '+';
+ else if (flags & FLAG_SPACE)
+ *p++ = ' ';
+
+ if (arg > 0.0 && arg + arg == arg)
+ {
+ if (dp->conversion == 'A')
+ {
+ *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+ }
+ else
+ {
+ *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+ }
+ }
+ else
+ {
+ int exponent;
+ double mantissa;
+
+ if (arg > 0.0)
+ mantissa = printf_frexp (arg, &exponent);
+ else
+ {
+ exponent = 0;
+ mantissa = 0.0;
+ }
+
+ if (has_precision
+ && precision < (unsigned int) ((DBL_DIG + 1) * 0.831) + 1)
+ {
+ /* Round the mantissa. */
+ double tail = mantissa;
+ size_t q;
+
+ for (q = precision; ; q--)
+ {
+ int digit = (int) tail;
+ tail -= digit;
+ if (q == 0)
+ {
+ if (digit & 1 ? tail >= 0.5 : tail > 0.5)
+ tail = 1 - tail;
+ else
+ tail = - tail;
+ break;
+ }
+ tail *= 16.0;
+ }
+ if (tail != 0.0)
+ for (q = precision; q > 0; q--)
+ tail *= 0.0625;
+ mantissa += tail;
+ }
+
+ *p++ = '0';
+ *p++ = dp->conversion - 'A' + 'X';
+ pad_ptr = p;
+ {
+ int digit;
+
+ digit = (int) mantissa;
+ mantissa -= digit;
+ *p++ = '0' + digit;
+ if ((flags & FLAG_ALT)
+ || mantissa > 0.0 || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ /* This loop terminates because we assume
+ that FLT_RADIX is a power of 2. */
+ while (mantissa > 0.0)
+ {
+ mantissa *= 16.0;
+ digit = (int) mantissa;
+ mantissa -= digit;
+ *p++ = digit
+ + (digit < 10
+ ? '0'
+ : dp->conversion - 10);
+ if (precision > 0)
+ precision--;
+ }
+ while (precision > 0)
+ {
+ *p++ = '0';
+ precision--;
+ }
+ }
+ }
+ *p++ = dp->conversion - 'A' + 'P';
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ { '%', '+', 'd', '\0' };
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, "%+d", exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, "%+d", exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+# endif
+ }
+ }
+# else
+ abort ();
+# endif
+ }
+
+ /* The generated string now extends from tmp to p, with the
+ zero padding insertion point being at pad_ptr. */
+ count = p - tmp;
+
+ if (count < width)
+ {
+ size_t pad = width - count;
+ DCHAR_T *end = p + pad;
+
+ if (flags & FLAG_LEFT)
+ {
+ /* Pad with spaces on the right. */
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+ else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
+ {
+ /* Pad with zeroes. */
+ DCHAR_T *q = end;
+
+ while (p > pad_ptr)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = '0';
+ }
+ else
+ {
+ /* Pad with spaces on the left. */
+ DCHAR_T *q = end;
+
+ while (p > tmp)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+
+ p = end;
+ }
+
+ count = p - tmp;
+
+ if (count >= tmp_length)
+ /* tmp_length was incorrectly calculated - fix the
+ code above! */
+ abort ();
+
+ /* Make room for the result. */
+ if (count >= allocated - length)
+ {
+ size_t n = xsum (length, count);
+
+ ENSURE_ALLOCATION (n);
+ }
+
+ /* Append the result. */
+ memcpy (result + length, tmp, count * sizeof (DCHAR_T));
+ if (tmp != tmpbuf)
+ free (tmp);
+ length += count;
+ }
+#endif
+#if (NEED_PRINTF_INFINITE_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
+ else if ((dp->conversion == 'f' || dp->conversion == 'F'
+ || dp->conversion == 'e' || dp->conversion == 'E'
+ || dp->conversion == 'g' || dp->conversion == 'G'
+ || dp->conversion == 'a' || dp->conversion == 'A')
+ && (0
+# if NEED_PRINTF_DOUBLE
+ || a.arg[dp->arg_index].type == TYPE_DOUBLE
+# elif NEED_PRINTF_INFINITE_DOUBLE
+ || (a.arg[dp->arg_index].type == TYPE_DOUBLE
+ /* The systems (mingw) which produce wrong output
+ for Inf, -Inf, and NaN also do so for -0.0.
+ Therefore we treat this case here as well. */
+ && is_infinite_or_zero (a.arg[dp->arg_index].a.a_double))
+# endif
+# if NEED_PRINTF_LONG_DOUBLE
+ || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
+# elif NEED_PRINTF_INFINITE_LONG_DOUBLE
+ || (a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
+ /* Some systems produce wrong output for Inf,
+ -Inf, and NaN. Some systems in this category
+ (IRIX 5.3) also do so for -0.0. Therefore we
+ treat this case here as well. */
+ && is_infinite_or_zerol (a.arg[dp->arg_index].a.a_longdouble))
+# endif
+ ))
+ {
+# if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE)
+ arg_type type = a.arg[dp->arg_index].type;
+# endif
+ int flags = dp->flags;
+ size_t width;
+ size_t count;
+ int has_precision;
+ size_t precision;
+ size_t tmp_length;
+ DCHAR_T tmpbuf[700];
+ DCHAR_T *tmp;
+ DCHAR_T *pad_ptr;
+ DCHAR_T *p;
+
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ width = arg;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = -width;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ }
+
+ has_precision = 0;
+ precision = 0;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ /* "A negative precision is taken as if the precision
+ were omitted." */
+ if (arg >= 0)
+ {
+ precision = arg;
+ has_precision = 1;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+ has_precision = 1;
+ }
+ }
+
+ /* POSIX specifies the default precision to be 6 for %f, %F,
+ %e, %E, but not for %g, %G. Implementations appear to use
+ the same default precision also for %g, %G. But for %a, %A,
+ the default precision is 0. */
+ if (!has_precision)
+ if (!(dp->conversion == 'a' || dp->conversion == 'A'))
+ precision = 6;
+
+ /* Allocate a temporary buffer of sufficient size. */
+# if NEED_PRINTF_DOUBLE && NEED_PRINTF_LONG_DOUBLE
+ tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : DBL_DIG + 1);
+# elif NEED_PRINTF_INFINITE_DOUBLE && NEED_PRINTF_LONG_DOUBLE
+ tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : 0);
+# elif NEED_PRINTF_LONG_DOUBLE
+ tmp_length = LDBL_DIG + 1;
+# elif NEED_PRINTF_DOUBLE
+ tmp_length = DBL_DIG + 1;
+# else
+ tmp_length = 0;
+# endif
+ if (tmp_length < precision)
+ tmp_length = precision;
+# if NEED_PRINTF_LONG_DOUBLE
+# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+ if (type == TYPE_LONGDOUBLE)
+# endif
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ long double arg = a.arg[dp->arg_index].a.a_longdouble;
+ if (!(isnanl (arg) || arg + arg == arg))
+ {
+ /* arg is finite and nonzero. */
+ int exponent = floorlog10l (arg < 0 ? -arg : arg);
+ if (exponent >= 0 && tmp_length < exponent + precision)
+ tmp_length = exponent + precision;
+ }
+ }
+# endif
+# if NEED_PRINTF_DOUBLE
+# if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE
+ if (type == TYPE_DOUBLE)
+# endif
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ double arg = a.arg[dp->arg_index].a.a_double;
+ if (!(isnand (arg) || arg + arg == arg))
+ {
+ /* arg is finite and nonzero. */
+ int exponent = floorlog10 (arg < 0 ? -arg : arg);
+ if (exponent >= 0 && tmp_length < exponent + precision)
+ tmp_length = exponent + precision;
+ }
+ }
+# endif
+ /* Account for sign, decimal point etc. */
+ tmp_length = xsum (tmp_length, 12);
+
+ if (tmp_length < width)
+ tmp_length = width;
+
+ tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
+
+ if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T))
+ tmp = tmpbuf;
+ else
+ {
+ size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T));
+
+ if (size_overflow_p (tmp_memsize))
+ /* Overflow, would lead to out of memory. */
+ goto out_of_memory;
+ tmp = (DCHAR_T *) malloc (tmp_memsize);
+ if (tmp == NULL)
+ /* Out of memory. */
+ goto out_of_memory;
+ }
+
+ pad_ptr = NULL;
+ p = tmp;
+
+# if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE
+# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+ if (type == TYPE_LONGDOUBLE)
+# endif
+ {
+ long double arg = a.arg[dp->arg_index].a.a_longdouble;
+
+ if (isnanl (arg))
+ {
+ if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+ {
+ *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+ }
+ else
+ {
+ *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+ }
+ }
+ else
+ {
+ int sign = 0;
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ if (signbit (arg)) /* arg < 0.0L or negative zero */
+ {
+ sign = -1;
+ arg = -arg;
+ }
+
+ if (sign < 0)
+ *p++ = '-';
+ else if (flags & FLAG_SHOWSIGN)
+ *p++ = '+';
+ else if (flags & FLAG_SPACE)
+ *p++ = ' ';
+
+ if (arg > 0.0L && arg + arg == arg)
+ {
+ if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+ {
+ *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+ }
+ else
+ {
+ *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+ }
+ }
+ else
+ {
+# if NEED_PRINTF_LONG_DOUBLE
+ pad_ptr = p;
+
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ char *digits;
+ size_t ndigits;
+
+ digits =
+ scale10_round_decimal_long_double (arg, precision);
+ if (digits == NULL)
+ {
+ END_LONG_DOUBLE_ROUNDING ();
+ goto out_of_memory;
+ }
+ ndigits = strlen (digits);
+
+ if (ndigits > precision)
+ do
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ while (ndigits > precision);
+ else
+ *p++ = '0';
+ /* Here ndigits <= precision. */
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > ndigits; precision--)
+ *p++ = '0';
+ while (ndigits > 0)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+
+ free (digits);
+ }
+ else if (dp->conversion == 'e' || dp->conversion == 'E')
+ {
+ int exponent;
+
+ if (arg == 0.0L)
+ {
+ exponent = 0;
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ }
+ else
+ {
+ /* arg > 0.0L. */
+ int adjusted;
+ char *digits;
+ size_t ndigits;
+
+ exponent = floorlog10l (arg);
+ adjusted = 0;
+ for (;;)
+ {
+ digits =
+ scale10_round_decimal_long_double (arg,
+ (int)precision - exponent);
+ if (digits == NULL)
+ {
+ END_LONG_DOUBLE_ROUNDING ();
+ goto out_of_memory;
+ }
+ ndigits = strlen (digits);
+
+ if (ndigits == precision + 1)
+ break;
+ if (ndigits < precision
+ || ndigits > precision + 2)
+ /* The exponent was not guessed
+ precisely enough. */
+ abort ();
+ if (adjusted)
+ /* None of two values of exponent is
+ the right one. Prevent an endless
+ loop. */
+ abort ();
+ free (digits);
+ if (ndigits == precision)
+ exponent -= 1;
+ else
+ exponent += 1;
+ adjusted = 1;
+ }
+ /* Here ndigits = precision+1. */
+ if (is_borderline (digits, precision))
+ {
+ /* Maybe the exponent guess was too high
+ and a smaller exponent can be reached
+ by turning a 10...0 into 9...9x. */
+ char *digits2 =
+ scale10_round_decimal_long_double (arg,
+ (int)precision - exponent + 1);
+ if (digits2 == NULL)
+ {
+ free (digits);
+ END_LONG_DOUBLE_ROUNDING ();
+ goto out_of_memory;
+ }
+ if (strlen (digits2) == precision + 1)
+ {
+ free (digits);
+ digits = digits2;
+ exponent -= 1;
+ }
+ else
+ free (digits2);
+ }
+ /* Here ndigits = precision+1. */
+
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > 0)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+
+ free (digits);
+ }
+
+ *p++ = dp->conversion; /* 'e' or 'E' */
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ { '%', '+', '.', '2', 'd', '\0' };
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, "%+.2d", exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, "%+.2d", exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+# endif
+ }
+ else if (dp->conversion == 'g' || dp->conversion == 'G')
+ {
+ if (precision == 0)
+ precision = 1;
+ /* precision >= 1. */
+
+ if (arg == 0.0L)
+ /* The exponent is 0, >= -4, < precision.
+ Use fixed-point notation. */
+ {
+ size_t ndigits = precision;
+ /* Number of trailing zeroes that have to be
+ dropped. */
+ size_t nzeroes =
+ (flags & FLAG_ALT ? 0 : precision - 1);
+
+ --ndigits;
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = '0';
+ }
+ }
+ }
+ else
+ {
+ /* arg > 0.0L. */
+ int exponent;
+ int adjusted;
+ char *digits;
+ size_t ndigits;
+ size_t nzeroes;
+
+ exponent = floorlog10l (arg);
+ adjusted = 0;
+ for (;;)
+ {
+ digits =
+ scale10_round_decimal_long_double (arg,
+ (int)(precision - 1) - exponent);
+ if (digits == NULL)
+ {
+ END_LONG_DOUBLE_ROUNDING ();
+ goto out_of_memory;
+ }
+ ndigits = strlen (digits);
+
+ if (ndigits == precision)
+ break;
+ if (ndigits < precision - 1
+ || ndigits > precision + 1)
+ /* The exponent was not guessed
+ precisely enough. */
+ abort ();
+ if (adjusted)
+ /* None of two values of exponent is
+ the right one. Prevent an endless
+ loop. */
+ abort ();
+ free (digits);
+ if (ndigits < precision)
+ exponent -= 1;
+ else
+ exponent += 1;
+ adjusted = 1;
+ }
+ /* Here ndigits = precision. */
+ if (is_borderline (digits, precision - 1))
+ {
+ /* Maybe the exponent guess was too high
+ and a smaller exponent can be reached
+ by turning a 10...0 into 9...9x. */
+ char *digits2 =
+ scale10_round_decimal_long_double (arg,
+ (int)(precision - 1) - exponent + 1);
+ if (digits2 == NULL)
+ {
+ free (digits);
+ END_LONG_DOUBLE_ROUNDING ();
+ goto out_of_memory;
+ }
+ if (strlen (digits2) == precision)
+ {
+ free (digits);
+ digits = digits2;
+ exponent -= 1;
+ }
+ else
+ free (digits2);
+ }
+ /* Here ndigits = precision. */
+
+ /* Determine the number of trailing zeroes
+ that have to be dropped. */
+ nzeroes = 0;
+ if ((flags & FLAG_ALT) == 0)
+ while (nzeroes < ndigits
+ && digits[nzeroes] == '0')
+ nzeroes++;
+
+ /* The exponent is now determined. */
+ if (exponent >= -4
+ && exponent < (long)precision)
+ {
+ /* Fixed-point notation:
+ max(exponent,0)+1 digits, then the
+ decimal point, then the remaining
+ digits without trailing zeroes. */
+ if (exponent >= 0)
+ {
+ size_t ecount = exponent + 1;
+ /* Note: count <= precision = ndigits. */
+ for (; ecount > 0; ecount--)
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ }
+ else
+ {
+ size_t ecount = -exponent - 1;
+ *p++ = '0';
+ *p++ = decimal_point_char ();
+ for (; ecount > 0; ecount--)
+ *p++ = '0';
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ }
+ else
+ {
+ /* Exponential notation. */
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ { '%', '+', '.', '2', 'd', '\0' };
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, "%+.2d", exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, "%+.2d", exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+# endif
+ }
+
+ free (digits);
+ }
+ }
+ else
+ abort ();
+# else
+ /* arg is finite. */
+ if (!(arg == 0.0L))
+ abort ();
+
+ pad_ptr = p;
+
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ }
+ else if (dp->conversion == 'e' || dp->conversion == 'E')
+ {
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ *p++ = dp->conversion; /* 'e' or 'E' */
+ *p++ = '+';
+ *p++ = '0';
+ *p++ = '0';
+ }
+ else if (dp->conversion == 'g' || dp->conversion == 'G')
+ {
+ *p++ = '0';
+ if (flags & FLAG_ALT)
+ {
+ size_t ndigits =
+ (precision > 0 ? precision - 1 : 0);
+ *p++ = decimal_point_char ();
+ for (; ndigits > 0; --ndigits)
+ *p++ = '0';
+ }
+ }
+ else if (dp->conversion == 'a' || dp->conversion == 'A')
+ {
+ *p++ = '0';
+ *p++ = dp->conversion - 'A' + 'X';
+ pad_ptr = p;
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ *p++ = dp->conversion - 'A' + 'P';
+ *p++ = '+';
+ *p++ = '0';
+ }
+ else
+ abort ();
+# endif
+ }
+
+ END_LONG_DOUBLE_ROUNDING ();
+ }
+ }
+# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+ else
+# endif
+# endif
+# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+ {
+ double arg = a.arg[dp->arg_index].a.a_double;
+
+ if (isnand (arg))
+ {
+ if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+ {
+ *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+ }
+ else
+ {
+ *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+ }
+ }
+ else
+ {
+ int sign = 0;
+
+ if (signbit (arg)) /* arg < 0.0 or negative zero */
+ {
+ sign = -1;
+ arg = -arg;
+ }
+
+ if (sign < 0)
+ *p++ = '-';
+ else if (flags & FLAG_SHOWSIGN)
+ *p++ = '+';
+ else if (flags & FLAG_SPACE)
+ *p++ = ' ';
+
+ if (arg > 0.0 && arg + arg == arg)
+ {
+ if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+ {
+ *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+ }
+ else
+ {
+ *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+ }
+ }
+ else
+ {
+# if NEED_PRINTF_DOUBLE
+ pad_ptr = p;
+
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ char *digits;
+ size_t ndigits;
+
+ digits =
+ scale10_round_decimal_double (arg, precision);
+ if (digits == NULL)
+ goto out_of_memory;
+ ndigits = strlen (digits);
+
+ if (ndigits > precision)
+ do
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ while (ndigits > precision);
+ else
+ *p++ = '0';
+ /* Here ndigits <= precision. */
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > ndigits; precision--)
+ *p++ = '0';
+ while (ndigits > 0)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+
+ free (digits);
+ }
+ else if (dp->conversion == 'e' || dp->conversion == 'E')
+ {
+ int exponent;
+
+ if (arg == 0.0)
+ {
+ exponent = 0;
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ }
+ else
+ {
+ /* arg > 0.0. */
+ int adjusted;
+ char *digits;
+ size_t ndigits;
+
+ exponent = floorlog10 (arg);
+ adjusted = 0;
+ for (;;)
+ {
+ digits =
+ scale10_round_decimal_double (arg,
+ (int)precision - exponent);
+ if (digits == NULL)
+ goto out_of_memory;
+ ndigits = strlen (digits);
+
+ if (ndigits == precision + 1)
+ break;
+ if (ndigits < precision
+ || ndigits > precision + 2)
+ /* The exponent was not guessed
+ precisely enough. */
+ abort ();
+ if (adjusted)
+ /* None of two values of exponent is
+ the right one. Prevent an endless
+ loop. */
+ abort ();
+ free (digits);
+ if (ndigits == precision)
+ exponent -= 1;
+ else
+ exponent += 1;
+ adjusted = 1;
+ }
+ /* Here ndigits = precision+1. */
+ if (is_borderline (digits, precision))
+ {
+ /* Maybe the exponent guess was too high
+ and a smaller exponent can be reached
+ by turning a 10...0 into 9...9x. */
+ char *digits2 =
+ scale10_round_decimal_double (arg,
+ (int)precision - exponent + 1);
+ if (digits2 == NULL)
+ {
+ free (digits);
+ goto out_of_memory;
+ }
+ if (strlen (digits2) == precision + 1)
+ {
+ free (digits);
+ digits = digits2;
+ exponent -= 1;
+ }
+ else
+ free (digits2);
+ }
+ /* Here ndigits = precision+1. */
+
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > 0)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+
+ free (digits);
+ }
+
+ *p++ = dp->conversion; /* 'e' or 'E' */
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ /* Produce the same number of exponent digits
+ as the native printf implementation. */
+# if defined _WIN32 && ! defined __CYGWIN__
+ { '%', '+', '.', '3', 'd', '\0' };
+# else
+ { '%', '+', '.', '2', 'd', '\0' };
+# endif
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ {
+ static const char decimal_format[] =
+ /* Produce the same number of exponent digits
+ as the native printf implementation. */
+# if defined _WIN32 && ! defined __CYGWIN__
+ "%+.3d";
+# else
+ "%+.2d";
+# endif
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, decimal_format, exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, decimal_format, exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+ }
+# endif
+ }
+ else if (dp->conversion == 'g' || dp->conversion == 'G')
+ {
+ if (precision == 0)
+ precision = 1;
+ /* precision >= 1. */
+
+ if (arg == 0.0)
+ /* The exponent is 0, >= -4, < precision.
+ Use fixed-point notation. */
+ {
+ size_t ndigits = precision;
+ /* Number of trailing zeroes that have to be
+ dropped. */
+ size_t nzeroes =
+ (flags & FLAG_ALT ? 0 : precision - 1);
+
+ --ndigits;
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = '0';
+ }
+ }
+ }
+ else
+ {
+ /* arg > 0.0. */
+ int exponent;
+ int adjusted;
+ char *digits;
+ size_t ndigits;
+ size_t nzeroes;
+
+ exponent = floorlog10 (arg);
+ adjusted = 0;
+ for (;;)
+ {
+ digits =
+ scale10_round_decimal_double (arg,
+ (int)(precision - 1) - exponent);
+ if (digits == NULL)
+ goto out_of_memory;
+ ndigits = strlen (digits);
+
+ if (ndigits == precision)
+ break;
+ if (ndigits < precision - 1
+ || ndigits > precision + 1)
+ /* The exponent was not guessed
+ precisely enough. */
+ abort ();
+ if (adjusted)
+ /* None of two values of exponent is
+ the right one. Prevent an endless
+ loop. */
+ abort ();
+ free (digits);
+ if (ndigits < precision)
+ exponent -= 1;
+ else
+ exponent += 1;
+ adjusted = 1;
+ }
+ /* Here ndigits = precision. */
+ if (is_borderline (digits, precision - 1))
+ {
+ /* Maybe the exponent guess was too high
+ and a smaller exponent can be reached
+ by turning a 10...0 into 9...9x. */
+ char *digits2 =
+ scale10_round_decimal_double (arg,
+ (int)(precision - 1) - exponent + 1);
+ if (digits2 == NULL)
+ {
+ free (digits);
+ goto out_of_memory;
+ }
+ if (strlen (digits2) == precision)
+ {
+ free (digits);
+ digits = digits2;
+ exponent -= 1;
+ }
+ else
+ free (digits2);
+ }
+ /* Here ndigits = precision. */
+
+ /* Determine the number of trailing zeroes
+ that have to be dropped. */
+ nzeroes = 0;
+ if ((flags & FLAG_ALT) == 0)
+ while (nzeroes < ndigits
+ && digits[nzeroes] == '0')
+ nzeroes++;
+
+ /* The exponent is now determined. */
+ if (exponent >= -4
+ && exponent < (long)precision)
+ {
+ /* Fixed-point notation:
+ max(exponent,0)+1 digits, then the
+ decimal point, then the remaining
+ digits without trailing zeroes. */
+ if (exponent >= 0)
+ {
+ size_t ecount = exponent + 1;
+ /* Note: ecount <= precision = ndigits. */
+ for (; ecount > 0; ecount--)
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ }
+ else
+ {
+ size_t ecount = -exponent - 1;
+ *p++ = '0';
+ *p++ = decimal_point_char ();
+ for (; ecount > 0; ecount--)
+ *p++ = '0';
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ }
+ else
+ {
+ /* Exponential notation. */
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ /* Produce the same number of exponent digits
+ as the native printf implementation. */
+# if defined _WIN32 && ! defined __CYGWIN__
+ { '%', '+', '.', '3', 'd', '\0' };
+# else
+ { '%', '+', '.', '2', 'd', '\0' };
+# endif
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ {
+ static const char decimal_format[] =
+ /* Produce the same number of exponent digits
+ as the native printf implementation. */
+# if defined _WIN32 && ! defined __CYGWIN__
+ "%+.3d";
+# else
+ "%+.2d";
+# endif
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, decimal_format, exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, decimal_format, exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+ }
+# endif
+ }
+
+ free (digits);
+ }
+ }
+ else
+ abort ();
+# else
+ /* arg is finite. */
+ if (!(arg == 0.0))
+ abort ();
+
+ pad_ptr = p;
+
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ }
+ else if (dp->conversion == 'e' || dp->conversion == 'E')
+ {
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ *p++ = dp->conversion; /* 'e' or 'E' */
+ *p++ = '+';
+ /* Produce the same number of exponent digits as
+ the native printf implementation. */
+# if defined _WIN32 && ! defined __CYGWIN__
+ *p++ = '0';
+# endif
+ *p++ = '0';
+ *p++ = '0';
+ }
+ else if (dp->conversion == 'g' || dp->conversion == 'G')
+ {
+ *p++ = '0';
+ if (flags & FLAG_ALT)
+ {
+ size_t ndigits =
+ (precision > 0 ? precision - 1 : 0);
+ *p++ = decimal_point_char ();
+ for (; ndigits > 0; --ndigits)
+ *p++ = '0';
+ }
+ }
+ else
+ abort ();
+# endif
+ }
+ }
+ }
+# endif
+
+ /* The generated string now extends from tmp to p, with the
+ zero padding insertion point being at pad_ptr. */
+ count = p - tmp;
+
+ if (count < width)
+ {
+ size_t pad = width - count;
+ DCHAR_T *end = p + pad;
+
+ if (flags & FLAG_LEFT)
+ {
+ /* Pad with spaces on the right. */
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+ else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
+ {
+ /* Pad with zeroes. */
+ DCHAR_T *q = end;
+
+ while (p > pad_ptr)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = '0';
+ }
+ else
+ {
+ /* Pad with spaces on the left. */
+ DCHAR_T *q = end;
+
+ while (p > tmp)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+
+ p = end;
+ }
+
+ count = p - tmp;
+
+ if (count >= tmp_length)
+ /* tmp_length was incorrectly calculated - fix the
+ code above! */
+ abort ();
+
+ /* Make room for the result. */
+ if (count >= allocated - length)
+ {
+ size_t n = xsum (length, count);
+
+ ENSURE_ALLOCATION (n);
+ }
+
+ /* Append the result. */
+ memcpy (result + length, tmp, count * sizeof (DCHAR_T));
+ if (tmp != tmpbuf)
+ free (tmp);
+ length += count;
+ }
+#endif
+ else
+ {
+ arg_type type = a.arg[dp->arg_index].type;
+ int flags = dp->flags;
+#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ int has_width;
+#endif
+#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ size_t width;
+#endif
+#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION
+ int has_precision;
+ size_t precision;
+#endif
+#if NEED_PRINTF_UNBOUNDED_PRECISION
+ int prec_ourselves;
+#else
+# define prec_ourselves 0
+#endif
+#if NEED_PRINTF_FLAG_LEFTADJUST
+# define pad_ourselves 1
+#elif !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ int pad_ourselves;
+#else
+# define pad_ourselves 0
+#endif
+ TCHAR_T *fbp;
+ unsigned int prefix_count;
+ int prefixes[2] IF_LINT (= { 0 });
+ int orig_errno;
+#if !USE_SNPRINTF
+ size_t tmp_length;
+ TCHAR_T tmpbuf[700];
+ TCHAR_T *tmp;
+#endif
+
+#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ has_width = 0;
+#endif
+#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ width = arg;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = -width;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ has_width = 1;
+#endif
+ }
+#endif
+
+#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION
+ has_precision = 0;
+ precision = 6;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ /* "A negative precision is taken as if the precision
+ were omitted." */
+ if (arg >= 0)
+ {
+ precision = arg;
+ has_precision = 1;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+ has_precision = 1;
+ }
+ }
+#endif
+
+ /* Decide whether to handle the precision ourselves. */
+#if NEED_PRINTF_UNBOUNDED_PRECISION
+ switch (dp->conversion)
+ {
+ case 'd': case 'i': case 'u':
+ case 'o':
+ case 'x': case 'X': case 'p':
+ prec_ourselves = has_precision && (precision > 0);
+ break;
+ default:
+ prec_ourselves = 0;
+ break;
+ }
+#endif
+
+ /* Decide whether to perform the padding ourselves. */
+#if !NEED_PRINTF_FLAG_LEFTADJUST && (!DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION)
+ switch (dp->conversion)
+ {
+# if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO
+ /* If we need conversion from TCHAR_T[] to DCHAR_T[], we need
+ to perform the padding after this conversion. Functions
+ with unistdio extensions perform the padding based on
+ character count rather than element count. */
+ case 'c': case 's':
+# endif
+# if NEED_PRINTF_FLAG_ZERO
+ case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
+ case 'a': case 'A':
+# endif
+ pad_ourselves = 1;
+ break;
+ default:
+ pad_ourselves = prec_ourselves;
+ break;
+ }
+#endif
+
+#if !USE_SNPRINTF
+ /* Allocate a temporary buffer of sufficient size for calling
+ sprintf. */
+ tmp_length =
+ MAX_ROOM_NEEDED (&a, dp->arg_index, dp->conversion, type,
+ flags, width, has_precision, precision,
+ pad_ourselves);
+
+ if (tmp_length <= sizeof (tmpbuf) / sizeof (TCHAR_T))
+ tmp = tmpbuf;
+ else
+ {
+ size_t tmp_memsize = xtimes (tmp_length, sizeof (TCHAR_T));
+
+ if (size_overflow_p (tmp_memsize))
+ /* Overflow, would lead to out of memory. */
+ goto out_of_memory;
+ tmp = (TCHAR_T *) malloc (tmp_memsize);
+ if (tmp == NULL)
+ /* Out of memory. */
+ goto out_of_memory;
+ }
+#endif
+
+ /* Construct the format string for calling snprintf or
+ sprintf. */
+ fbp = buf;
+ *fbp++ = '%';
+#if NEED_PRINTF_FLAG_GROUPING
+ /* The underlying implementation doesn't support the ' flag.
+ Produce no grouping characters in this case; this is
+ acceptable because the grouping is locale dependent. */
+#else
+ if (flags & FLAG_GROUP)
+ *fbp++ = '\'';
+#endif
+ if (flags & FLAG_LEFT)
+ *fbp++ = '-';
+ if (flags & FLAG_SHOWSIGN)
+ *fbp++ = '+';
+ if (flags & FLAG_SPACE)
+ *fbp++ = ' ';
+ if (flags & FLAG_ALT)
+ *fbp++ = '#';
+#if __GLIBC__ >= 2 && !defined __UCLIBC__
+ if (flags & FLAG_LOCALIZED)
+ *fbp++ = 'I';
+#endif
+ if (!pad_ourselves)
+ {
+ if (flags & FLAG_ZERO)
+ *fbp++ = '0';
+ if (dp->width_start != dp->width_end)
+ {
+ size_t n = dp->width_end - dp->width_start;
+ /* The width specification is known to consist only
+ of standard ASCII characters. */
+ if (sizeof (FCHAR_T) == sizeof (TCHAR_T))
+ {
+ memcpy (fbp, dp->width_start, n * sizeof (TCHAR_T));
+ fbp += n;
+ }
+ else
+ {
+ const FCHAR_T *mp = dp->width_start;
+ do
+ *fbp++ = *mp++;
+ while (--n > 0);
+ }
+ }
+ }
+ if (!prec_ourselves)
+ {
+ if (dp->precision_start != dp->precision_end)
+ {
+ size_t n = dp->precision_end - dp->precision_start;
+ /* The precision specification is known to consist only
+ of standard ASCII characters. */
+ if (sizeof (FCHAR_T) == sizeof (TCHAR_T))
+ {
+ memcpy (fbp, dp->precision_start, n * sizeof (TCHAR_T));
+ fbp += n;
+ }
+ else
+ {
+ const FCHAR_T *mp = dp->precision_start;
+ do
+ *fbp++ = *mp++;
+ while (--n > 0);
+ }
+ }
+ }
+
+ switch (type)
+ {
+ case TYPE_LONGLONGINT:
+ case TYPE_ULONGLONGINT:
+#if defined _WIN32 && ! defined __CYGWIN__
+ *fbp++ = 'I';
+ *fbp++ = '6';
+ *fbp++ = '4';
+ break;
+#else
+ *fbp++ = 'l';
+#endif
+ FALLTHROUGH;
+ case TYPE_LONGINT:
+ case TYPE_ULONGINT:
+#if HAVE_WINT_T
+ case TYPE_WIDE_CHAR:
+#endif
+#if HAVE_WCHAR_T
+ case TYPE_WIDE_STRING:
+#endif
+ *fbp++ = 'l';
+ break;
+ case TYPE_LONGDOUBLE:
+ *fbp++ = 'L';
+ break;
+ default:
+ break;
+ }
+#if NEED_PRINTF_DIRECTIVE_F
+ if (dp->conversion == 'F')
+ *fbp = 'f';
+ else
+#endif
+ *fbp = dp->conversion;
+#if USE_SNPRINTF
+# if ((HAVE_SNPRINTF_RETVAL_C99 && HAVE_SNPRINTF_TRUNCATION_C99) \
+ || ((__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) \
+ && !defined __UCLIBC__) \
+ || (defined __APPLE__ && defined __MACH__) \
+ || defined __ANDROID__ \
+ || (defined _WIN32 && ! defined __CYGWIN__))
+ /* On systems where we know that snprintf's return value
+ conforms to ISO C 99 (HAVE_SNPRINTF_RETVAL_C99) and that
+ snprintf always produces NUL-terminated strings
+ (HAVE_SNPRINTF_TRUNCATION_C99), it is possible to avoid
+ using %n. And it is desirable to do so, because more and
+ more platforms no longer support %n, for "security reasons".
+ In particular, the following platforms:
+ - On glibc2 systems from 2004-10-18 or newer, the use of
+ %n in format strings in writable memory may crash the
+ program (if compiled with _FORTIFY_SOURCE=2).
+ - On Mac OS X 10.13 or newer, the use of %n in format
+ strings in writable memory by default crashes the
+ program.
+ - On Android, starting on 2018-03-07, the use of %n in
+ format strings produces a fatal error (see
+ <https://android.googlesource.com/platform/bionic/+/41398d03b7e8e0dfb951660ae713e682e9fc0336>).
+ On these platforms, HAVE_SNPRINTF_RETVAL_C99 and
+ HAVE_SNPRINTF_TRUNCATION_C99 are 1. We have listed them
+ explicitly in the condition above, in case of cross-
+ compilation (just to be sure). */
+ /* On native Windows systems (such as mingw), we can avoid using
+ %n because:
+ - Although the gl_SNPRINTF_TRUNCATION_C99 test fails,
+ snprintf does not write more than the specified number
+ of bytes. (snprintf (buf, 3, "%d %d", 4567, 89) writes
+ '4', '5', '6' into buf, not '4', '5', '\0'.)
+ - Although the gl_SNPRINTF_RETVAL_C99 test fails, snprintf
+ allows us to recognize the case of an insufficient
+ buffer size: it returns -1 in this case.
+ On native Windows systems (such as mingw) where the OS is
+ Windows Vista, the use of %n in format strings by default
+ crashes the program. See
+ <https://gcc.gnu.org/ml/gcc/2007-06/msg00122.html> and
+ <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/set-printf-count-output>
+ So we should avoid %n in this situation. */
+ fbp[1] = '\0';
+# else /* AIX <= 5.1, HP-UX, IRIX, OSF/1, Solaris <= 9, BeOS */
+ fbp[1] = '%';
+ fbp[2] = 'n';
+ fbp[3] = '\0';
+# endif
+#else
+ fbp[1] = '\0';
+#endif
+
+ /* Construct the arguments for calling snprintf or sprintf. */
+ prefix_count = 0;
+ if (!pad_ourselves && dp->width_arg_index != ARG_NONE)
+ {
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int;
+ }
+ if (!prec_ourselves && dp->precision_arg_index != ARG_NONE)
+ {
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int;
+ }
+
+#if USE_SNPRINTF
+ /* The SNPRINTF result is appended after result[0..length].
+ The latter is an array of DCHAR_T; SNPRINTF appends an
+ array of TCHAR_T to it. This is possible because
+ sizeof (TCHAR_T) divides sizeof (DCHAR_T) and
+ alignof (TCHAR_T) <= alignof (DCHAR_T). */
+# define TCHARS_PER_DCHAR (sizeof (DCHAR_T) / sizeof (TCHAR_T))
+ /* Ensure that maxlen below will be >= 2. Needed on BeOS,
+ where an snprintf() with maxlen==1 acts like sprintf(). */
+ ENSURE_ALLOCATION (xsum (length,
+ (2 + TCHARS_PER_DCHAR - 1)
+ / TCHARS_PER_DCHAR));
+ /* Prepare checking whether snprintf returns the count
+ via %n. */
+ *(TCHAR_T *) (result + length) = '\0';
+#endif
+
+ orig_errno = errno;
+
+ for (;;)
+ {
+ int count = -1;
+
+#if USE_SNPRINTF
+ int retcount = 0;
+ size_t maxlen = allocated - length;
+ /* SNPRINTF can fail if its second argument is
+ > INT_MAX. */
+ if (maxlen > INT_MAX / TCHARS_PER_DCHAR)
+ maxlen = INT_MAX / TCHARS_PER_DCHAR;
+ maxlen = maxlen * TCHARS_PER_DCHAR;
+# define SNPRINTF_BUF(arg) \
+ switch (prefix_count) \
+ { \
+ case 0: \
+ retcount = SNPRINTF ((TCHAR_T *) (result + length), \
+ maxlen, buf, \
+ arg, &count); \
+ break; \
+ case 1: \
+ retcount = SNPRINTF ((TCHAR_T *) (result + length), \
+ maxlen, buf, \
+ prefixes[0], arg, &count); \
+ break; \
+ case 2: \
+ retcount = SNPRINTF ((TCHAR_T *) (result + length), \
+ maxlen, buf, \
+ prefixes[0], prefixes[1], arg, \
+ &count); \
+ break; \
+ default: \
+ abort (); \
+ }
+#else
+# define SNPRINTF_BUF(arg) \
+ switch (prefix_count) \
+ { \
+ case 0: \
+ count = sprintf (tmp, buf, arg); \
+ break; \
+ case 1: \
+ count = sprintf (tmp, buf, prefixes[0], arg); \
+ break; \
+ case 2: \
+ count = sprintf (tmp, buf, prefixes[0], prefixes[1],\
+ arg); \
+ break; \
+ default: \
+ abort (); \
+ }
+#endif
+
+ errno = 0;
+ switch (type)
+ {
+ case TYPE_SCHAR:
+ {
+ int arg = a.arg[dp->arg_index].a.a_schar;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_UCHAR:
+ {
+ unsigned int arg = a.arg[dp->arg_index].a.a_uchar;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_SHORT:
+ {
+ int arg = a.arg[dp->arg_index].a.a_short;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_USHORT:
+ {
+ unsigned int arg = a.arg[dp->arg_index].a.a_ushort;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_INT:
+ {
+ int arg = a.arg[dp->arg_index].a.a_int;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_UINT:
+ {
+ unsigned int arg = a.arg[dp->arg_index].a.a_uint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_LONGINT:
+ {
+ long int arg = a.arg[dp->arg_index].a.a_longint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_ULONGINT:
+ {
+ unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_LONGLONGINT:
+ {
+ long long int arg = a.arg[dp->arg_index].a.a_longlongint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_ULONGLONGINT:
+ {
+ unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_DOUBLE:
+ {
+ double arg = a.arg[dp->arg_index].a.a_double;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_LONGDOUBLE:
+ {
+ long double arg = a.arg[dp->arg_index].a.a_longdouble;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_CHAR:
+ {
+ int arg = a.arg[dp->arg_index].a.a_char;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#if HAVE_WINT_T
+ case TYPE_WIDE_CHAR:
+ {
+ wint_t arg = a.arg[dp->arg_index].a.a_wide_char;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+ case TYPE_STRING:
+ {
+ const char *arg = a.arg[dp->arg_index].a.a_string;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#if HAVE_WCHAR_T
+ case TYPE_WIDE_STRING:
+ {
+ const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+ case TYPE_POINTER:
+ {
+ void *arg = a.arg[dp->arg_index].a.a_pointer;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ default:
+ abort ();
+ }
+
+#if USE_SNPRINTF
+ /* Portability: Not all implementations of snprintf()
+ are ISO C 99 compliant. Determine the number of
+ bytes that snprintf() has produced or would have
+ produced. */
+ if (count >= 0)
+ {
+ /* Verify that snprintf() has NUL-terminated its
+ result. */
+ if ((unsigned int) count < maxlen
+ && ((TCHAR_T *) (result + length)) [count] != '\0')
+ abort ();
+ /* Portability hack. */
+ if (retcount > count)
+ count = retcount;
+ }
+ else
+ {
+ /* snprintf() doesn't understand the '%n'
+ directive. */
+ if (fbp[1] != '\0')
+ {
+ /* Don't use the '%n' directive; instead, look
+ at the snprintf() return value. */
+ fbp[1] = '\0';
+ continue;
+ }
+ else
+ {
+ /* Look at the snprintf() return value. */
+ if (retcount < 0)
+ {
+# if !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF
+ /* HP-UX 10.20 snprintf() is doubly deficient:
+ It doesn't understand the '%n' directive,
+ *and* it returns -1 (rather than the length
+ that would have been required) when the
+ buffer is too small.
+ But a failure at this point can also come
+ from other reasons than a too small buffer,
+ such as an invalid wide string argument to
+ the %ls directive, or possibly an invalid
+ floating-point argument. */
+ size_t tmp_length =
+ MAX_ROOM_NEEDED (&a, dp->arg_index,
+ dp->conversion, type, flags,
+ width,
+ has_precision,
+ precision, pad_ourselves);
+
+ if (maxlen < tmp_length)
+ {
+ /* Make more room. But try to do through
+ this reallocation only once. */
+ size_t bigger_need =
+ xsum (length,
+ xsum (tmp_length,
+ TCHARS_PER_DCHAR - 1)
+ / TCHARS_PER_DCHAR);
+ /* And always grow proportionally.
+ (There may be several arguments, each
+ needing a little more room than the
+ previous one.) */
+ size_t bigger_need2 =
+ xsum (xtimes (allocated, 2), 12);
+ if (bigger_need < bigger_need2)
+ bigger_need = bigger_need2;
+ ENSURE_ALLOCATION (bigger_need);
+ continue;
+ }
+# endif
+ }
+ else
+ count = retcount;
+ }
+ }
+#endif
+
+ /* Attempt to handle failure. */
+ if (count < 0)
+ {
+ /* SNPRINTF or sprintf failed. Use the errno that it
+ has set, if any. */
+ if (errno == 0)
+ {
+ if (dp->conversion == 'c' || dp->conversion == 's')
+ errno = EILSEQ;
+ else
+ errno = EINVAL;
+ }
+
+ goto fail_with_errno;
+ }
+
+#if USE_SNPRINTF
+ /* Handle overflow of the allocated buffer.
+ If such an overflow occurs, a C99 compliant snprintf()
+ returns a count >= maxlen. However, a non-compliant
+ snprintf() function returns only count = maxlen - 1. To
+ cover both cases, test whether count >= maxlen - 1. */
+ if ((unsigned int) count + 1 >= maxlen)
+ {
+ /* If maxlen already has attained its allowed maximum,
+ allocating more memory will not increase maxlen.
+ Instead of looping, bail out. */
+ if (maxlen == INT_MAX / TCHARS_PER_DCHAR)
+ goto overflow;
+ else
+ {
+ /* Need at least (count + 1) * sizeof (TCHAR_T)
+ bytes. (The +1 is for the trailing NUL.)
+ But ask for (count + 2) * sizeof (TCHAR_T)
+ bytes, so that in the next round, we likely get
+ maxlen > (unsigned int) count + 1
+ and so we don't get here again.
+ And allocate proportionally, to avoid looping
+ eternally if snprintf() reports a too small
+ count. */
+ size_t n =
+ xmax (xsum (length,
+ ((unsigned int) count + 2
+ + TCHARS_PER_DCHAR - 1)
+ / TCHARS_PER_DCHAR),
+ xtimes (allocated, 2));
+
+ ENSURE_ALLOCATION (n);
+ continue;
+ }
+ }
+#endif
+
+#if NEED_PRINTF_UNBOUNDED_PRECISION
+ if (prec_ourselves)
+ {
+ /* Handle the precision. */
+ TCHAR_T *prec_ptr =
+# if USE_SNPRINTF
+ (TCHAR_T *) (result + length);
+# else
+ tmp;
+# endif
+ size_t prefix_count;
+ size_t move;
+
+ prefix_count = 0;
+ /* Put the additional zeroes after the sign. */
+ if (count >= 1
+ && (*prec_ptr == '-' || *prec_ptr == '+'
+ || *prec_ptr == ' '))
+ prefix_count = 1;
+ /* Put the additional zeroes after the 0x prefix if
+ (flags & FLAG_ALT) || (dp->conversion == 'p'). */
+ else if (count >= 2
+ && prec_ptr[0] == '0'
+ && (prec_ptr[1] == 'x' || prec_ptr[1] == 'X'))
+ prefix_count = 2;
+
+ move = count - prefix_count;
+ if (precision > move)
+ {
+ /* Insert zeroes. */
+ size_t insert = precision - move;
+ TCHAR_T *prec_end;
+
+# if USE_SNPRINTF
+ size_t n =
+ xsum (length,
+ (count + insert + TCHARS_PER_DCHAR - 1)
+ / TCHARS_PER_DCHAR);
+ length += (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR;
+ ENSURE_ALLOCATION (n);
+ length -= (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR;
+ prec_ptr = (TCHAR_T *) (result + length);
+# endif
+
+ prec_end = prec_ptr + count;
+ prec_ptr += prefix_count;
+
+ while (prec_end > prec_ptr)
+ {
+ prec_end--;
+ prec_end[insert] = prec_end[0];
+ }
+
+ prec_end += insert;
+ do
+ *--prec_end = '0';
+ while (prec_end > prec_ptr);
+
+ count += insert;
+ }
+ }
+#endif
+
+#if !USE_SNPRINTF
+ if (count >= tmp_length)
+ /* tmp_length was incorrectly calculated - fix the
+ code above! */
+ abort ();
+#endif
+
+#if !DCHAR_IS_TCHAR
+ /* Convert from TCHAR_T[] to DCHAR_T[]. */
+ if (dp->conversion == 'c' || dp->conversion == 's')
+ {
+ /* type = TYPE_CHAR or TYPE_WIDE_CHAR or TYPE_STRING
+ TYPE_WIDE_STRING.
+ The result string is not certainly ASCII. */
+ const TCHAR_T *tmpsrc;
+ DCHAR_T *tmpdst;
+ size_t tmpdst_len;
+ /* This code assumes that TCHAR_T is 'char'. */
+ static_assert (sizeof (TCHAR_T) == 1);
+# if USE_SNPRINTF
+ tmpsrc = (TCHAR_T *) (result + length);
+# else
+ tmpsrc = tmp;
+# endif
+ tmpdst =
+ DCHAR_CONV_FROM_ENCODING (locale_charset (),
+ iconveh_question_mark,
+ tmpsrc, count,
+ NULL,
+ NULL, &tmpdst_len);
+ if (tmpdst == NULL)
+ goto fail_with_errno;
+ ENSURE_ALLOCATION_ELSE (xsum (length, tmpdst_len),
+ { free (tmpdst); goto out_of_memory; });
+ DCHAR_CPY (result + length, tmpdst, tmpdst_len);
+ free (tmpdst);
+ count = tmpdst_len;
+ }
+ else
+ {
+ /* The result string is ASCII.
+ Simple 1:1 conversion. */
+# if USE_SNPRINTF
+ /* If sizeof (DCHAR_T) == sizeof (TCHAR_T), it's a
+ no-op conversion, in-place on the array starting
+ at (result + length). */
+ if (sizeof (DCHAR_T) != sizeof (TCHAR_T))
+# endif
+ {
+ const TCHAR_T *tmpsrc;
+ DCHAR_T *tmpdst;
+ size_t n;
+
+# if USE_SNPRINTF
+ if (result == resultbuf)
+ {
+ tmpsrc = (TCHAR_T *) (result + length);
+ /* ENSURE_ALLOCATION will not move tmpsrc
+ (because it's part of resultbuf). */
+ ENSURE_ALLOCATION (xsum (length, count));
+ }
+ else
+ {
+ /* ENSURE_ALLOCATION will move the array
+ (because it uses realloc(). */
+ ENSURE_ALLOCATION (xsum (length, count));
+ tmpsrc = (TCHAR_T *) (result + length);
+ }
+# else
+ tmpsrc = tmp;
+ ENSURE_ALLOCATION (xsum (length, count));
+# endif
+ tmpdst = result + length;
+ /* Copy backwards, because of overlapping. */
+ tmpsrc += count;
+ tmpdst += count;
+ for (n = count; n > 0; n--)
+ *--tmpdst = *--tmpsrc;
+ }
+ }
+#endif
+
+#if DCHAR_IS_TCHAR && !USE_SNPRINTF
+ /* Make room for the result. */
+ if (count > allocated - length)
+ {
+ /* Need at least count elements. But allocate
+ proportionally. */
+ size_t n =
+ xmax (xsum (length, count), xtimes (allocated, 2));
+
+ ENSURE_ALLOCATION (n);
+ }
+#endif
+
+ /* Here count <= allocated - length. */
+
+ /* Perform padding. */
+#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ if (pad_ourselves && has_width)
+ {
+ size_t w;
+# if ENABLE_UNISTDIO
+ /* Outside POSIX, it's preferable to compare the width
+ against the number of _characters_ of the converted
+ value. */
+ w = DCHAR_MBSNLEN (result + length, count);
+# else
+ /* The width is compared against the number of _bytes_
+ of the converted value, says POSIX. */
+ w = count;
+# endif
+ if (w < width)
+ {
+ size_t pad = width - w;
+
+ /* Make room for the result. */
+ if (xsum (count, pad) > allocated - length)
+ {
+ /* Need at least count + pad elements. But
+ allocate proportionally. */
+ size_t n =
+ xmax (xsum3 (length, count, pad),
+ xtimes (allocated, 2));
+
+# if USE_SNPRINTF
+ length += count;
+ ENSURE_ALLOCATION (n);
+ length -= count;
+# else
+ ENSURE_ALLOCATION (n);
+# endif
+ }
+ /* Here count + pad <= allocated - length. */
+
+ {
+# if !DCHAR_IS_TCHAR || USE_SNPRINTF
+ DCHAR_T * const rp = result + length;
+# else
+ DCHAR_T * const rp = tmp;
+# endif
+ DCHAR_T *p = rp + count;
+ DCHAR_T *end = p + pad;
+ DCHAR_T *pad_ptr;
+# if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO
+ if (dp->conversion == 'c'
+ || dp->conversion == 's')
+ /* No zero-padding for string directives. */
+ pad_ptr = NULL;
+ else
+# endif
+ {
+ pad_ptr = (*rp == '-' ? rp + 1 : rp);
+ /* No zero-padding of "inf" and "nan". */
+ if ((*pad_ptr >= 'A' && *pad_ptr <= 'Z')
+ || (*pad_ptr >= 'a' && *pad_ptr <= 'z'))
+ pad_ptr = NULL;
+ }
+ /* The generated string now extends from rp to p,
+ with the zero padding insertion point being at
+ pad_ptr. */
+
+ count = count + pad; /* = end - rp */
+
+ if (flags & FLAG_LEFT)
+ {
+ /* Pad with spaces on the right. */
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+ else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
+ {
+ /* Pad with zeroes. */
+ DCHAR_T *q = end;
+
+ while (p > pad_ptr)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = '0';
+ }
+ else
+ {
+ /* Pad with spaces on the left. */
+ DCHAR_T *q = end;
+
+ while (p > rp)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+ }
+ }
+ }
+#endif
+
+ /* Here still count <= allocated - length. */
+
+#if !DCHAR_IS_TCHAR || USE_SNPRINTF
+ /* The snprintf() result did fit. */
+#else
+ /* Append the sprintf() result. */
+ memcpy (result + length, tmp, count * sizeof (DCHAR_T));
+#endif
+#if !USE_SNPRINTF
+ if (tmp != tmpbuf)
+ free (tmp);
+#endif
+
+#if NEED_PRINTF_DIRECTIVE_F
+ if (dp->conversion == 'F')
+ {
+ /* Convert the %f result to upper case for %F. */
+ DCHAR_T *rp = result + length;
+ size_t rc;
+ for (rc = count; rc > 0; rc--, rp++)
+ if (*rp >= 'a' && *rp <= 'z')
+ *rp = *rp - 'a' + 'A';
+ }
+#endif
+
+ length += count;
+ break;
+ }
+ errno = orig_errno;
+#undef pad_ourselves
+#undef prec_ourselves
+ }
+ }
+ }
+
+ /* Add the final NUL. */
+ ENSURE_ALLOCATION (xsum (length, 1));
+ result[length] = '\0';
+
+ if (result != resultbuf && length + 1 < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ DCHAR_T *memory;
+
+ memory = (DCHAR_T *) realloc (result, (length + 1) * sizeof (DCHAR_T));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ *lengthp = length;
+ /* Note that we can produce a big string of a length > INT_MAX. POSIX
+ says that snprintf() fails with errno = EOVERFLOW in this case, but
+ that's only because snprintf() returns an 'int'. This function does
+ not have this limitation. */
+ return result;
+
+#if USE_SNPRINTF
+ overflow:
+ errno = EOVERFLOW;
+ goto fail_with_errno;
+#endif
+
+ out_of_memory:
+ errno = ENOMEM;
+ goto fail_with_errno;
+
+#if ENABLE_UNISTDIO || ((!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL) || ENABLE_WCHAR_FALLBACK) && HAVE_WCHAR_T)
+ fail_with_EILSEQ:
+ errno = EILSEQ;
+ goto fail_with_errno;
+#endif
+
+ fail_with_errno:
+ if (result != resultbuf)
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ return NULL;
+ }
+
+ out_of_memory_1:
+ errno = ENOMEM;
+ goto fail_1_with_errno;
+
+ fail_1_with_EINVAL:
+ errno = EINVAL;
+ goto fail_1_with_errno;
+
+ fail_1_with_errno:
+ CLEANUP ();
+ return NULL;
+}
+
+#undef MAX_ROOM_NEEDED
+#undef TCHARS_PER_DCHAR
+#undef SNPRINTF
+#undef USE_SNPRINTF
+#undef DCHAR_SET
+#undef DCHAR_CPY
+#undef PRINTF_PARSE
+#undef DIRECTIVES
+#undef DIRECTIVE
+#undef DCHAR_IS_TCHAR
+#undef TCHAR_T
+#undef DCHAR_T
+#undef FCHAR_T
+#undef VASNPRINTF
diff --git a/lib/vasnprintf.h b/lib/vasnprintf.h
new file mode 100644
index 0000000..f69649f
--- /dev/null
+++ b/lib/vasnprintf.h
@@ -0,0 +1,72 @@
+/* vsprintf with automatic memory allocation.
+ Copyright (C) 2002-2004, 2007-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#ifndef _VASNPRINTF_H
+#define _VASNPRINTF_H
+
+/* Get va_list. */
+#include <stdarg.h>
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD. */
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Write formatted output to a string dynamically allocated with malloc().
+ You can pass a preallocated buffer for the result in RESULTBUF and its
+ size in *LENGTHP; otherwise you pass RESULTBUF = NULL.
+ If successful, return the address of the string (this may be = RESULTBUF
+ if no dynamic memory allocation was necessary) and set *LENGTHP to the
+ number of resulting bytes, excluding the trailing NUL. Upon error, set
+ errno and return NULL.
+
+ When dynamic memory allocation occurs, the preallocated buffer is left
+ alone (with possibly modified contents). This makes it possible to use
+ a statically allocated or stack-allocated buffer, like this:
+
+ char buf[100];
+ size_t len = sizeof (buf);
+ char *output = vasnprintf (buf, &len, format, args);
+ if (output == NULL)
+ ... error handling ...;
+ else
+ {
+ ... use the output string ...;
+ if (output != buf)
+ free (output);
+ }
+ */
+#if REPLACE_VASNPRINTF
+# define asnprintf rpl_asnprintf
+# define vasnprintf rpl_vasnprintf
+#endif
+extern char * asnprintf (char *restrict resultbuf, size_t *lengthp,
+ const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 3, 4));
+extern char * vasnprintf (char *restrict resultbuf, size_t *lengthp,
+ const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 3, 0));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _VASNPRINTF_H */
diff --git a/lib/verify.h b/lib/verify.h
new file mode 100644
index 0000000..8f786af
--- /dev/null
+++ b/lib/verify.h
@@ -0,0 +1,365 @@
+/* Compile-time assert-like macros.
+
+ Copyright (C) 2005-2006, 2009-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */
+
+#ifndef _GL_VERIFY_H
+#define _GL_VERIFY_H
+
+
+/* Define _GL_HAVE__STATIC_ASSERT to 1 if _Static_assert (R, DIAGNOSTIC)
+ works as per C11. This is supported by GCC 4.6.0+ and by clang 4+.
+
+ Define _GL_HAVE__STATIC_ASSERT1 to 1 if _Static_assert (R) works as
+ per C23. This is supported by GCC 9.1+.
+
+ Support compilers claiming conformance to the relevant standard,
+ and also support GCC when not pedantic. If we were willing to slow
+ 'configure' down we could also use it with other compilers, but
+ since this affects only the quality of diagnostics, why bother? */
+#ifndef __cplusplus
+# if (201112 <= __STDC_VERSION__ \
+ || (!defined __STRICT_ANSI__ \
+ && (4 < __GNUC__ + (6 <= __GNUC_MINOR__) || 5 <= __clang_major__)))
+# define _GL_HAVE__STATIC_ASSERT 1
+# endif
+# if (202311 <= __STDC_VERSION__ \
+ || (!defined __STRICT_ANSI__ && 9 <= __GNUC__))
+# define _GL_HAVE__STATIC_ASSERT1 1
+# endif
+#endif
+
+/* FreeBSD 9.1 <sys/cdefs.h>, included by <stddef.h> and lots of other
+ system headers, defines a conflicting _Static_assert that is no
+ better than ours; override it. */
+#ifndef _GL_HAVE__STATIC_ASSERT
+# include <stddef.h>
+# undef _Static_assert
+#endif
+
+/* Each of these macros verifies that its argument R is nonzero. To
+ be portable, R should be an integer constant expression. Unlike
+ assert (R), there is no run-time overhead.
+
+ If _Static_assert works, verify (R) uses it directly. Similarly,
+ _GL_VERIFY_TRUE works by packaging a _Static_assert inside a struct
+ that is an operand of sizeof.
+
+ The code below uses several ideas for C++ compilers, and for C
+ compilers that do not support _Static_assert:
+
+ * The first step is ((R) ? 1 : -1). Given an expression R, of
+ integral or boolean or floating-point type, this yields an
+ expression of integral type, whose value is later verified to be
+ constant and nonnegative.
+
+ * Next this expression W is wrapped in a type
+ struct _gl_verify_type {
+ unsigned int _gl_verify_error_if_negative: W;
+ }.
+ If W is negative, this yields a compile-time error. No compiler can
+ deal with a bit-field of negative size.
+
+ One might think that an array size check would have the same
+ effect, that is, that the type struct { unsigned int dummy[W]; }
+ would work as well. However, inside a function, some compilers
+ (such as C++ compilers and GNU C) allow local parameters and
+ variables inside array size expressions. With these compilers,
+ an array size check would not properly diagnose this misuse of
+ the verify macro:
+
+ void function (int n) { verify (n < 0); }
+
+ * For the verify macro, the struct _gl_verify_type will need to
+ somehow be embedded into a declaration. To be portable, this
+ declaration must declare an object, a constant, a function, or a
+ typedef name. If the declared entity uses the type directly,
+ such as in
+
+ struct dummy {...};
+ typedef struct {...} dummy;
+ extern struct {...} *dummy;
+ extern void dummy (struct {...} *);
+ extern struct {...} *dummy (void);
+
+ two uses of the verify macro would yield colliding declarations
+ if the entity names are not disambiguated. A workaround is to
+ attach the current line number to the entity name:
+
+ #define _GL_CONCAT0(x, y) x##y
+ #define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y)
+ extern struct {...} * _GL_CONCAT (dummy, __LINE__);
+
+ But this has the problem that two invocations of verify from
+ within the same macro would collide, since the __LINE__ value
+ would be the same for both invocations. (The GCC __COUNTER__
+ macro solves this problem, but is not portable.)
+
+ A solution is to use the sizeof operator. It yields a number,
+ getting rid of the identity of the type. Declarations like
+
+ extern int dummy [sizeof (struct {...})];
+ extern void dummy (int [sizeof (struct {...})]);
+ extern int (*dummy (void)) [sizeof (struct {...})];
+
+ can be repeated.
+
+ * Should the implementation use a named struct or an unnamed struct?
+ Which of the following alternatives can be used?
+
+ extern int dummy [sizeof (struct {...})];
+ extern int dummy [sizeof (struct _gl_verify_type {...})];
+ extern void dummy (int [sizeof (struct {...})]);
+ extern void dummy (int [sizeof (struct _gl_verify_type {...})]);
+ extern int (*dummy (void)) [sizeof (struct {...})];
+ extern int (*dummy (void)) [sizeof (struct _gl_verify_type {...})];
+
+ In the second and sixth case, the struct type is exported to the
+ outer scope; two such declarations therefore collide. GCC warns
+ about the first, third, and fourth cases. So the only remaining
+ possibility is the fifth case:
+
+ extern int (*dummy (void)) [sizeof (struct {...})];
+
+ * GCC warns about duplicate declarations of the dummy function if
+ -Wredundant-decls is used. GCC 4.3 and later have a builtin
+ __COUNTER__ macro that can let us generate unique identifiers for
+ each dummy function, to suppress this warning.
+
+ * This implementation exploits the fact that older versions of GCC,
+ which do not support _Static_assert, also do not warn about the
+ last declaration mentioned above.
+
+ * GCC warns if -Wnested-externs is enabled and 'verify' is used
+ within a function body; but inside a function, you can always
+ arrange to use verify_expr instead.
+
+ * In C++, any struct definition inside sizeof is invalid.
+ Use a template type to work around the problem. */
+
+/* Concatenate two preprocessor tokens. */
+#define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y)
+#define _GL_CONCAT0(x, y) x##y
+
+/* _GL_COUNTER is an integer, preferably one that changes each time we
+ use it. Use __COUNTER__ if it works, falling back on __LINE__
+ otherwise. __LINE__ isn't perfect, but it's better than a
+ constant. */
+#if defined __COUNTER__ && __COUNTER__ != __COUNTER__
+# define _GL_COUNTER __COUNTER__
+#else
+# define _GL_COUNTER __LINE__
+#endif
+
+/* Generate a symbol with the given prefix, making it unique if
+ possible. */
+#define _GL_GENSYM(prefix) _GL_CONCAT (prefix, _GL_COUNTER)
+
+/* Verify requirement R at compile-time, as an integer constant expression
+ that returns 1. If R is false, fail at compile-time, preferably
+ with a diagnostic that includes the string-literal DIAGNOSTIC. */
+
+#define _GL_VERIFY_TRUE(R, DIAGNOSTIC) \
+ (!!sizeof (_GL_VERIFY_TYPE (R, DIAGNOSTIC)))
+
+#ifdef __cplusplus
+# if !GNULIB_defined_struct__gl_verify_type
+template <int w>
+ struct _gl_verify_type {
+ unsigned int _gl_verify_error_if_negative: w;
+ };
+# define GNULIB_defined_struct__gl_verify_type 1
+# endif
+# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \
+ _gl_verify_type<(R) ? 1 : -1>
+#elif defined _GL_HAVE__STATIC_ASSERT
+# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \
+ struct { \
+ _Static_assert (R, DIAGNOSTIC); \
+ int _gl_dummy; \
+ }
+#else
+# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \
+ struct { unsigned int _gl_verify_error_if_negative: (R) ? 1 : -1; }
+#endif
+
+/* Verify requirement R at compile-time, as a declaration without a
+ trailing ';'. If R is false, fail at compile-time.
+
+ This macro requires three or more arguments but uses at most the first
+ two, so that the _Static_assert macro optionally defined below supports
+ both the C11 two-argument syntax and the C23 one-argument syntax.
+
+ Unfortunately, unlike C11, this implementation must appear as an
+ ordinary declaration, and cannot appear inside struct { ... }. */
+
+#if 202311 <= __STDC_VERSION__ || 200410 <= __cpp_static_assert
+# define _GL_VERIFY(R, DIAGNOSTIC, ...) static_assert (R, DIAGNOSTIC)
+#elif defined _GL_HAVE__STATIC_ASSERT
+# define _GL_VERIFY(R, DIAGNOSTIC, ...) _Static_assert (R, DIAGNOSTIC)
+#else
+# define _GL_VERIFY(R, DIAGNOSTIC, ...) \
+ extern int (*_GL_GENSYM (_gl_verify_function) (void)) \
+ [_GL_VERIFY_TRUE (R, DIAGNOSTIC)]
+# if 4 < __GNUC__ + (6 <= __GNUC_MINOR__)
+# pragma GCC diagnostic ignored "-Wnested-externs"
+# endif
+#endif
+
+/* _GL_STATIC_ASSERT_H is defined if this code is copied into assert.h. */
+#ifdef _GL_STATIC_ASSERT_H
+/* Define _Static_assert if needed. */
+/* With clang ≥ 3.8.0 in C++ mode, _Static_assert already works and accepts
+ 1 or 2 arguments. We better don't override it, because clang's standard
+ C++ library uses static_assert inside classes in several places, and our
+ replacement via _GL_VERIFY does not work in these contexts. */
+# if (defined __cplusplus && defined __clang__ \
+ && (4 <= __clang_major__ + (8 <= __clang_minor__)))
+# if 5 <= __clang_major__
+/* Avoid "warning: 'static_assert' with no message is a C++17 extension". */
+# pragma clang diagnostic ignored "-Wc++17-extensions"
+# else
+/* Avoid "warning: static_assert with no message is a C++1z extension". */
+# pragma clang diagnostic ignored "-Wc++1z-extensions"
+# endif
+# elif !defined _GL_HAVE__STATIC_ASSERT1 && !defined _Static_assert
+# if !defined _MSC_VER || defined __clang__
+# define _Static_assert(...) \
+ _GL_VERIFY (__VA_ARGS__, "static assertion failed", -)
+# else
+ /* Work around MSVC preprocessor incompatibility with ISO C; see
+ <https://stackoverflow.com/questions/5134523/>. */
+# define _Static_assert(R, ...) \
+ _GL_VERIFY ((R), "static assertion failed", -)
+# endif
+# endif
+/* Define static_assert if needed. */
+# if (!defined static_assert \
+ && __STDC_VERSION__ < 202311 \
+ && (!defined __cplusplus \
+ || (__cpp_static_assert < 201411 \
+ && __GNUG__ < 6 && __clang_major__ < 6)))
+# if defined __cplusplus && _MSC_VER >= 1900 && !defined __clang__
+/* MSVC 14 in C++ mode supports the two-arguments static_assert but not
+ the one-argument static_assert, and it does not support _Static_assert.
+ We have to play preprocessor tricks to distinguish the two cases.
+ Since the MSVC preprocessor is not ISO C compliant (see above),.
+ the solution is specific to MSVC. */
+# define _GL_EXPAND(x) x
+# define _GL_SA1(a1) static_assert ((a1), "static assertion failed")
+# define _GL_SA2 static_assert
+# define _GL_SA3 static_assert
+# define _GL_SA_PICK(x1,x2,x3,x4,...) x4
+# define static_assert(...) _GL_EXPAND(_GL_SA_PICK(__VA_ARGS__,_GL_SA3,_GL_SA2,_GL_SA1)) (__VA_ARGS__)
+# else
+# define static_assert _Static_assert /* C11 requires this #define. */
+# endif
+# endif
+#endif
+
+/* @assert.h omit start@ */
+
+#if defined __clang_major__ && __clang_major__ < 5
+# define _GL_HAS_BUILTIN_TRAP 0
+#elif 3 < __GNUC__ + (3 < __GNUC_MINOR__ + (4 <= __GNUC_PATCHLEVEL__))
+# define _GL_HAS_BUILTIN_TRAP 1
+#elif defined __has_builtin
+# define _GL_HAS_BUILTIN_TRAP __has_builtin (__builtin_trap)
+#else
+# define _GL_HAS_BUILTIN_TRAP 0
+#endif
+
+#if defined __clang_major__ && __clang_major__ < 5
+# define _GL_HAS_BUILTIN_UNREACHABLE 0
+#elif 4 < __GNUC__ + (5 <= __GNUC_MINOR__)
+# define _GL_HAS_BUILTIN_UNREACHABLE 1
+#elif defined __has_builtin
+# define _GL_HAS_BUILTIN_UNREACHABLE __has_builtin (__builtin_unreachable)
+#else
+# define _GL_HAS_BUILTIN_UNREACHABLE 0
+#endif
+
+/* Each of these macros verifies that its argument R is nonzero. To
+ be portable, R should be an integer constant expression. Unlike
+ assert (R), there is no run-time overhead.
+
+ There are two macros, since no single macro can be used in all
+ contexts in C. verify_expr (R, E) is for scalar contexts, including
+ integer constant expression contexts. verify (R) is for declaration
+ contexts, e.g., the top level. */
+
+/* Verify requirement R at compile-time. Return the value of the
+ expression E. */
+
+#define verify_expr(R, E) \
+ (_GL_VERIFY_TRUE (R, "verify_expr (" #R ", " #E ")") ? (E) : (E))
+
+/* Verify requirement R at compile-time, as a declaration without a
+ trailing ';'. verify (R) acts like static_assert (R) except that
+ it is portable to C11/C++14 and earlier, it can issue better
+ diagnostics, and its name is shorter and may be more convenient. */
+
+#ifdef __PGI
+/* PGI barfs if R is long. */
+# define verify(R) _GL_VERIFY (R, "verify (...)", -)
+#else
+# define verify(R) _GL_VERIFY (R, "verify (" #R ")", -)
+#endif
+
+/* Assume that R always holds. Behavior is undefined if R is false,
+ fails to evaluate, or has side effects.
+
+ 'assume (R)' is a directive from the programmer telling the
+ compiler that R is true so the compiler needn't generate code to
+ test R. This is why 'assume' is in verify.h: it's related to
+ static checking (in this case, static checking done by the
+ programmer), not dynamic checking.
+
+ 'assume (R)' can affect compilation of all the code, not just code
+ that happens to be executed after the assume (R) is "executed".
+ For example, if the code mistakenly does 'assert (R); assume (R);'
+ the compiler is entitled to optimize away the 'assert (R)'.
+
+ Although assuming R can help a compiler generate better code or
+ diagnostics, performance can suffer if R uses hard-to-optimize
+ features such as function calls not inlined by the compiler.
+
+ Avoid Clang's __builtin_assume, as it breaks GNU Emacs master
+ as of 2020-08-23T21:09:49Z!eggert@cs.ucla.edu; see
+ <https://bugs.gnu.org/43152#71>. It's not known whether this breakage
+ is a Clang bug or an Emacs bug; play it safe for now. */
+
+#if _GL_HAS_BUILTIN_UNREACHABLE
+# define assume(R) ((R) ? (void) 0 : __builtin_unreachable ())
+#elif 1200 <= _MSC_VER
+# define assume(R) __assume (R)
+#elif 202311 <= __STDC_VERSION__
+# include <stddef.h>
+# define assume(R) ((R) ? (void) 0 : unreachable ())
+#elif (defined GCC_LINT || defined lint) && _GL_HAS_BUILTIN_TRAP
+ /* Doing it this way helps various packages when configured with
+ --enable-gcc-warnings, which compiles with -Dlint. It's nicer
+ if 'assume' silences warnings with GCC 3.4 through GCC 4.4.7 (2012). */
+# define assume(R) ((R) ? (void) 0 : __builtin_trap ())
+#else
+ /* Some older tools grok NOTREACHED, e.g., Oracle Studio 12.6 (2017). */
+# define assume(R) ((R) ? (void) 0 : /*NOTREACHED*/ (void) 0)
+#endif
+
+/* @assert.h omit end@ */
+
+#endif
diff --git a/lib/vsnprintf.c b/lib/vsnprintf.c
new file mode 100644
index 0000000..acd4e2d
--- /dev/null
+++ b/lib/vsnprintf.c
@@ -0,0 +1,70 @@
+/* Formatted output to strings.
+ Copyright (C) 2004, 2006-2023 Free Software Foundation, Inc.
+ Written by Simon Josefsson and Yoann Vandoorselaere <yoann@prelude-ids.org>.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "vasnprintf.h"
+
+/* Print formatted output to string STR. Similar to vsprintf, but
+ additional length SIZE limit how much is written into STR. Returns
+ string length of formatted string (which may be larger than SIZE).
+ STR may be NULL, in which case nothing will be written. On error,
+ return a negative value. */
+int
+vsnprintf (char *str, size_t size, const char *format, va_list args)
+{
+ char *output;
+ size_t len;
+ size_t lenbuf = size;
+
+ output = vasnprintf (str, &lenbuf, format, args);
+ len = lenbuf;
+
+ if (!output)
+ return -1;
+
+ if (output != str)
+ {
+ if (size)
+ {
+ size_t pruned_len = (len < size ? len : size - 1);
+ memcpy (str, output, pruned_len);
+ str[pruned_len] = '\0';
+ }
+
+ free (output);
+ }
+
+ if (len > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ return len;
+}
diff --git a/lib/warn-on-use.h b/lib/warn-on-use.h
new file mode 100644
index 0000000..3075603
--- /dev/null
+++ b/lib/warn-on-use.h
@@ -0,0 +1,149 @@
+/* A C macro for emitting warnings if a function is used.
+ Copyright (C) 2010-2023 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* _GL_WARN_ON_USE (function, "literal string") issues a declaration
+ for FUNCTION which will then trigger a compiler warning containing
+ the text of "literal string" anywhere that function is called, if
+ supported by the compiler. If the compiler does not support this
+ feature, the macro expands to an unused extern declaration.
+
+ _GL_WARN_ON_USE_ATTRIBUTE ("literal string") expands to the
+ attribute used in _GL_WARN_ON_USE. If the compiler does not support
+ this feature, it expands to empty.
+
+ These macros are useful for marking a function as a potential
+ portability trap, with the intent that "literal string" include
+ instructions on the replacement function that should be used
+ instead.
+ _GL_WARN_ON_USE is for functions with 'extern' linkage.
+ _GL_WARN_ON_USE_ATTRIBUTE is for functions with 'static' or 'inline'
+ linkage.
+
+ However, one of the reasons that a function is a portability trap is
+ if it has the wrong signature. Declaring FUNCTION with a different
+ signature in C is a compilation error, so this macro must use the
+ same type as any existing declaration so that programs that avoid
+ the problematic FUNCTION do not fail to compile merely because they
+ included a header that poisoned the function. But this implies that
+ _GL_WARN_ON_USE is only safe to use if FUNCTION is known to already
+ have a declaration. Use of this macro implies that there must not
+ be any other macro hiding the declaration of FUNCTION; but
+ undefining FUNCTION first is part of the poisoning process anyway
+ (although for symbols that are provided only via a macro, the result
+ is a compilation error rather than a warning containing
+ "literal string"). Also note that in C++, it is only safe to use if
+ FUNCTION has no overloads.
+
+ For an example, it is possible to poison 'getline' by:
+ - adding a call to gl_WARN_ON_USE_PREPARE([[#include <stdio.h>]],
+ [getline]) in configure.ac, which potentially defines
+ HAVE_RAW_DECL_GETLINE
+ - adding this code to a header that wraps the system <stdio.h>:
+ #undef getline
+ #if HAVE_RAW_DECL_GETLINE
+ _GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but"
+ "not universally present; use the gnulib module getline");
+ #endif
+
+ It is not possible to directly poison global variables. But it is
+ possible to write a wrapper accessor function, and poison that
+ (less common usage, like &environ, will cause a compilation error
+ rather than issue the nice warning, but the end result of informing
+ the developer about their portability problem is still achieved):
+ #if HAVE_RAW_DECL_ENVIRON
+ static char ***
+ rpl_environ (void) { return &environ; }
+ _GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared");
+ # undef environ
+ # define environ (*rpl_environ ())
+ #endif
+ or better (avoiding contradictory use of 'static' and 'extern'):
+ #if HAVE_RAW_DECL_ENVIRON
+ static char ***
+ _GL_WARN_ON_USE_ATTRIBUTE ("environ is not always properly declared")
+ rpl_environ (void) { return &environ; }
+ # undef environ
+ # define environ (*rpl_environ ())
+ #endif
+ */
+#ifndef _GL_WARN_ON_USE
+
+# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later. */
+# define _GL_WARN_ON_USE(function, message) \
+_GL_WARN_EXTERN_C __typeof__ (function) function __attribute__ ((__warning__ (message)))
+# define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+ __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang. */
+# define _GL_WARN_ON_USE(function, message) \
+_GL_WARN_EXTERN_C __typeof__ (function) function \
+ __attribute__ ((__diagnose_if__ (1, message, "warning")))
+# define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+ __attribute__ ((__diagnose_if__ (1, message, "warning")))
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function. */
+# define _GL_WARN_ON_USE(function, message) \
+_GL_WARN_EXTERN_C __typeof__ (function) function
+# define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# else /* Unsupported. */
+# define _GL_WARN_ON_USE(function, message) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+# define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# endif
+#endif
+
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+ is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+ function is declared with the given prototype, consisting of return type,
+ parameters, and attributes.
+ This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
+ not work in this case. */
+#ifndef _GL_WARN_ON_USE_CXX
+# if !defined __cplusplus
+# define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+ _GL_WARN_ON_USE (function, msg)
+# else
+# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later. */
+# define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+ __attribute__ ((__warning__ (msg)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang. */
+# define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+ __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function. */
+# define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+# else /* Unsupported. */
+# define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+# endif
+# endif
+#endif
+
+/* _GL_WARN_EXTERN_C declaration;
+ performs the declaration with C linkage. */
+#ifndef _GL_WARN_EXTERN_C
+# if defined __cplusplus
+# define _GL_WARN_EXTERN_C extern "C"
+# else
+# define _GL_WARN_EXTERN_C extern
+# endif
+#endif
diff --git a/lib/wchar.in.h b/lib/wchar.in.h
new file mode 100644
index 0000000..bbca927
--- /dev/null
+++ b/lib/wchar.in.h
@@ -0,0 +1,1378 @@
+/* A substitute for ISO C99 <wchar.h>, for platforms that have issues.
+
+ Copyright (C) 2007-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Written by Eric Blake. */
+
+/*
+ * ISO C 99 <wchar.h> for platforms that have issues.
+ * <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/wchar.h.html>
+ *
+ * For now, this just ensures proper prerequisite inclusion order and
+ * the declaration of wcwidth().
+ */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if (((defined __need_mbstate_t || defined __need_wint_t) \
+ && !defined __MINGW32__) \
+ || (defined __hpux \
+ && ((defined _INTTYPES_INCLUDED \
+ && !defined _GL_FINISHED_INCLUDING_SYSTEM_INTTYPES_H) \
+ || defined _GL_JUST_INCLUDE_SYSTEM_WCHAR_H)) \
+ || (defined __MINGW32__ && defined __STRING_H_SOURCED__) \
+ || defined _GL_ALREADY_INCLUDING_WCHAR_H)
+/* Special invocation convention:
+ - Inside glibc and uClibc header files, but not MinGW.
+ - On HP-UX 11.00 we have a sequence of nested includes
+ <wchar.h> -> <stdlib.h> -> <stdint.h>, and the latter includes <wchar.h>,
+ once indirectly <stdint.h> -> <sys/types.h> -> <inttypes.h> -> <wchar.h>
+ and once directly. In both situations 'wint_t' is not yet defined,
+ therefore we cannot provide the function overrides; instead include only
+ the system's <wchar.h>.
+ - With MinGW 3.22, when <string.h> includes <wchar.h>, only some part of
+ <wchar.h> is actually processed, and that doesn't include 'mbstate_t'.
+ - On IRIX 6.5, similarly, we have an include <wchar.h> -> <wctype.h>, and
+ the latter includes <wchar.h>. But here, we have no way to detect whether
+ <wctype.h> is completely included or is still being included. */
+
+#@INCLUDE_NEXT@ @NEXT_WCHAR_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_WCHAR_H
+
+#define _GL_ALREADY_INCLUDING_WCHAR_H
+
+#if @HAVE_FEATURES_H@
+# include <features.h> /* for __GLIBC__ */
+#endif
+
+/* In some builds of uClibc, <wchar.h> is nonexistent and wchar_t is defined
+ by <stddef.h>.
+ But avoid namespace pollution on glibc systems. */
+#if !(defined __GLIBC__ && !defined __UCLIBC__)
+# include <stddef.h>
+#endif
+
+/* Include the original <wchar.h> if it exists.
+ Some builds of uClibc lack it. */
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_WCHAR_H@
+# @INCLUDE_NEXT@ @NEXT_WCHAR_H@
+#endif
+
+#undef _GL_ALREADY_INCLUDING_WCHAR_H
+
+#ifndef _@GUARD_PREFIX@_WCHAR_H
+#define _@GUARD_PREFIX@_WCHAR_H
+
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+ that can be freed by passing them as the Ith argument to the
+ function F. */
+#ifndef _GL_ATTRIBUTE_DEALLOC
+# if __GNUC__ >= 11
+# define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+# else
+# define _GL_ATTRIBUTE_DEALLOC(f, i)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
+ can be freed via 'free'; it can be used only after declaring 'free'. */
+/* Applies to: functions. Cannot be used on inline functions. */
+#ifndef _GL_ATTRIBUTE_DEALLOC_FREE
+# if defined __cplusplus && defined __GNUC__ && !defined __clang__
+/* Work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108231> */
+# define _GL_ATTRIBUTE_DEALLOC_FREE \
+ _GL_ATTRIBUTE_DEALLOC ((void (*) (void *)) free, 1)
+# else
+# define _GL_ATTRIBUTE_DEALLOC_FREE \
+ _GL_ATTRIBUTE_DEALLOC (free, 1)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly
+ allocated memory. */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_MALLOC
+# if __GNUC__ >= 3 || defined __clang__
+# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+# else
+# define _GL_ATTRIBUTE_MALLOC
+# endif
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The attribute __pure__ was added in gcc 2.96. */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+# define _GL_ATTRIBUTE_PURE /* empty */
+# endif
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Define wint_t and WEOF. (Also done in wctype.in.h.) */
+#if !@HAVE_WINT_T@ && !defined wint_t
+# define wint_t int
+# ifndef WEOF
+# define WEOF -1
+# endif
+#else
+/* mingw and MSVC define wint_t as 'unsigned short' in <crtdefs.h> or
+ <stddef.h>. This is too small: ISO C 99 section 7.24.1.(2) says that
+ wint_t must be "unchanged by default argument promotions". Override it. */
+# if @GNULIBHEADERS_OVERRIDE_WINT_T@
+# if !GNULIB_defined_wint_t
+# if @HAVE_CRTDEFS_H@
+# include <crtdefs.h>
+# else
+# include <stddef.h>
+# endif
+typedef unsigned int rpl_wint_t;
+# undef wint_t
+# define wint_t rpl_wint_t
+# define GNULIB_defined_wint_t 1
+# endif
+# endif
+# ifndef WEOF
+# define WEOF ((wint_t) -1)
+# endif
+#endif
+
+
+/* Override mbstate_t if it is too small.
+ On IRIX 6.5, sizeof (mbstate_t) == 1, which is not sufficient for
+ implementing mbrtowc for encodings like UTF-8.
+ On AIX and MSVC, mbrtowc needs to be overridden, but mbstate_t exists and is
+ large enough and overriding it would cause problems in C++ mode. */
+#if !(((defined _WIN32 && !defined __CYGWIN__) || @HAVE_MBSINIT@) && @HAVE_MBRTOWC@) || @REPLACE_MBSTATE_T@
+# if !GNULIB_defined_mbstate_t
+# if !(defined _AIX || defined _MSC_VER)
+typedef int rpl_mbstate_t;
+# undef mbstate_t
+# define mbstate_t rpl_mbstate_t
+# endif
+# define GNULIB_defined_mbstate_t 1
+# endif
+#endif
+
+/* Make _GL_ATTRIBUTE_DEALLOC_FREE work, even though <stdlib.h> may not have
+ been included yet. */
+#if @GNULIB_FREE_POSIX@
+# if (@REPLACE_FREE@ && !defined free \
+ && !(defined __cplusplus && defined GNULIB_NAMESPACE))
+/* We can't do '#define free rpl_free' here. */
+_GL_EXTERN_C void rpl_free (void *);
+# undef _GL_ATTRIBUTE_DEALLOC_FREE
+# define _GL_ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC (rpl_free, 1)
+# else
+# if defined _MSC_VER && !defined free
+_GL_EXTERN_C
+# if defined _DLL
+ __declspec (dllimport)
+# endif
+ void __cdecl free (void *);
+# else
+# if defined __cplusplus && (__GLIBC__ + (__GLIBC_MINOR__ >= 14) > 2)
+_GL_EXTERN_C void free (void *) throw ();
+# else
+_GL_EXTERN_C void free (void *);
+# endif
+# endif
+# endif
+#else
+# if defined _MSC_VER && !defined free
+_GL_EXTERN_C
+# if defined _DLL
+ __declspec (dllimport)
+# endif
+ void __cdecl free (void *);
+# else
+# if defined __cplusplus && (__GLIBC__ + (__GLIBC_MINOR__ >= 14) > 2)
+_GL_EXTERN_C void free (void *) throw ();
+# else
+_GL_EXTERN_C void free (void *);
+# endif
+# endif
+#endif
+
+/* Convert a single-byte character to a wide character. */
+#if @GNULIB_BTOWC@
+# if @REPLACE_BTOWC@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef btowc
+# define btowc rpl_btowc
+# endif
+_GL_FUNCDECL_RPL (btowc, wint_t, (int c) _GL_ATTRIBUTE_PURE);
+_GL_CXXALIAS_RPL (btowc, wint_t, (int c));
+# else
+# if !@HAVE_BTOWC@
+_GL_FUNCDECL_SYS (btowc, wint_t, (int c) _GL_ATTRIBUTE_PURE);
+# endif
+/* Need to cast, because on mingw, the return type is 'unsigned short'. */
+_GL_CXXALIAS_SYS_CAST (btowc, wint_t, (int c));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (btowc);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef btowc
+# if HAVE_RAW_DECL_BTOWC
+_GL_WARN_ON_USE (btowc, "btowc is unportable - "
+ "use gnulib module btowc for portability");
+# endif
+#endif
+
+
+/* Convert a wide character to a single-byte character. */
+#if @GNULIB_WCTOB@
+# if @REPLACE_WCTOB@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wctob
+# define wctob rpl_wctob
+# endif
+_GL_FUNCDECL_RPL (wctob, int, (wint_t wc) _GL_ATTRIBUTE_PURE);
+_GL_CXXALIAS_RPL (wctob, int, (wint_t wc));
+# else
+# if !defined wctob && !@HAVE_DECL_WCTOB@
+/* wctob is provided by gnulib, or wctob exists but is not declared. */
+_GL_FUNCDECL_SYS (wctob, int, (wint_t wc) _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wctob, int, (wint_t wc));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wctob);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wctob
+# if HAVE_RAW_DECL_WCTOB
+_GL_WARN_ON_USE (wctob, "wctob is unportable - "
+ "use gnulib module wctob for portability");
+# endif
+#endif
+
+
+/* Test whether *PS is in the initial state. */
+#if @GNULIB_MBSINIT@
+# if @REPLACE_MBSINIT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mbsinit
+# define mbsinit rpl_mbsinit
+# endif
+_GL_FUNCDECL_RPL (mbsinit, int, (const mbstate_t *ps));
+_GL_CXXALIAS_RPL (mbsinit, int, (const mbstate_t *ps));
+# else
+# if !@HAVE_MBSINIT@
+_GL_FUNCDECL_SYS (mbsinit, int, (const mbstate_t *ps));
+# endif
+_GL_CXXALIAS_SYS (mbsinit, int, (const mbstate_t *ps));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (mbsinit);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mbsinit
+# if HAVE_RAW_DECL_MBSINIT
+_GL_WARN_ON_USE (mbsinit, "mbsinit is unportable - "
+ "use gnulib module mbsinit for portability");
+# endif
+#endif
+
+
+/* Convert a multibyte character to a wide character. */
+#if @GNULIB_MBRTOWC@
+# if @REPLACE_MBRTOWC@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mbrtowc
+# define mbrtowc rpl_mbrtowc
+# endif
+_GL_FUNCDECL_RPL (mbrtowc, size_t,
+ (wchar_t *restrict pwc, const char *restrict s, size_t n,
+ mbstate_t *restrict ps));
+_GL_CXXALIAS_RPL (mbrtowc, size_t,
+ (wchar_t *restrict pwc, const char *restrict s, size_t n,
+ mbstate_t *restrict ps));
+# else
+# if !@HAVE_MBRTOWC@
+_GL_FUNCDECL_SYS (mbrtowc, size_t,
+ (wchar_t *restrict pwc, const char *restrict s, size_t n,
+ mbstate_t *restrict ps));
+# endif
+_GL_CXXALIAS_SYS (mbrtowc, size_t,
+ (wchar_t *restrict pwc, const char *restrict s, size_t n,
+ mbstate_t *restrict ps));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (mbrtowc);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mbrtowc
+# if HAVE_RAW_DECL_MBRTOWC
+_GL_WARN_ON_USE (mbrtowc, "mbrtowc is unportable - "
+ "use gnulib module mbrtowc for portability");
+# endif
+#endif
+
+
+/* Recognize a multibyte character. */
+#if @GNULIB_MBRLEN@
+# if @REPLACE_MBRLEN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mbrlen
+# define mbrlen rpl_mbrlen
+# endif
+_GL_FUNCDECL_RPL (mbrlen, size_t,
+ (const char *restrict s, size_t n, mbstate_t *restrict ps));
+_GL_CXXALIAS_RPL (mbrlen, size_t,
+ (const char *restrict s, size_t n, mbstate_t *restrict ps));
+# else
+# if !@HAVE_MBRLEN@
+_GL_FUNCDECL_SYS (mbrlen, size_t,
+ (const char *restrict s, size_t n, mbstate_t *restrict ps));
+# endif
+_GL_CXXALIAS_SYS (mbrlen, size_t,
+ (const char *restrict s, size_t n, mbstate_t *restrict ps));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (mbrlen);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mbrlen
+# if HAVE_RAW_DECL_MBRLEN
+_GL_WARN_ON_USE (mbrlen, "mbrlen is unportable - "
+ "use gnulib module mbrlen for portability");
+# endif
+#endif
+
+
+/* Convert a string to a wide string. */
+#if @GNULIB_MBSRTOWCS@
+# if @REPLACE_MBSRTOWCS@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mbsrtowcs
+# define mbsrtowcs rpl_mbsrtowcs
+# endif
+_GL_FUNCDECL_RPL (mbsrtowcs, size_t,
+ (wchar_t *restrict dest,
+ const char **restrict srcp, size_t len,
+ mbstate_t *restrict ps)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (mbsrtowcs, size_t,
+ (wchar_t *restrict dest,
+ const char **restrict srcp, size_t len,
+ mbstate_t *restrict ps));
+# else
+# if !@HAVE_MBSRTOWCS@
+_GL_FUNCDECL_SYS (mbsrtowcs, size_t,
+ (wchar_t *restrict dest,
+ const char **restrict srcp, size_t len,
+ mbstate_t *restrict ps)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (mbsrtowcs, size_t,
+ (wchar_t *restrict dest,
+ const char **restrict srcp, size_t len,
+ mbstate_t *restrict ps));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (mbsrtowcs);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mbsrtowcs
+# if HAVE_RAW_DECL_MBSRTOWCS
+_GL_WARN_ON_USE (mbsrtowcs, "mbsrtowcs is unportable - "
+ "use gnulib module mbsrtowcs for portability");
+# endif
+#endif
+
+
+/* Convert a string to a wide string. */
+#if @GNULIB_MBSNRTOWCS@
+# if @REPLACE_MBSNRTOWCS@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mbsnrtowcs
+# define mbsnrtowcs rpl_mbsnrtowcs
+# endif
+_GL_FUNCDECL_RPL (mbsnrtowcs, size_t,
+ (wchar_t *restrict dest,
+ const char **restrict srcp, size_t srclen, size_t len,
+ mbstate_t *restrict ps)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (mbsnrtowcs, size_t,
+ (wchar_t *restrict dest,
+ const char **restrict srcp, size_t srclen, size_t len,
+ mbstate_t *restrict ps));
+# else
+# if !@HAVE_MBSNRTOWCS@
+_GL_FUNCDECL_SYS (mbsnrtowcs, size_t,
+ (wchar_t *restrict dest,
+ const char **restrict srcp, size_t srclen, size_t len,
+ mbstate_t *restrict ps)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (mbsnrtowcs, size_t,
+ (wchar_t *restrict dest,
+ const char **restrict srcp, size_t srclen, size_t len,
+ mbstate_t *restrict ps));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (mbsnrtowcs);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mbsnrtowcs
+# if HAVE_RAW_DECL_MBSNRTOWCS
+_GL_WARN_ON_USE (mbsnrtowcs, "mbsnrtowcs is unportable - "
+ "use gnulib module mbsnrtowcs for portability");
+# endif
+#endif
+
+
+/* Convert a wide character to a multibyte character. */
+#if @GNULIB_WCRTOMB@
+# if @REPLACE_WCRTOMB@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcrtomb
+# define wcrtomb rpl_wcrtomb
+# endif
+_GL_FUNCDECL_RPL (wcrtomb, size_t,
+ (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
+_GL_CXXALIAS_RPL (wcrtomb, size_t,
+ (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
+# else
+# if !@HAVE_WCRTOMB@
+_GL_FUNCDECL_SYS (wcrtomb, size_t,
+ (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
+# endif
+_GL_CXXALIAS_SYS (wcrtomb, size_t,
+ (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcrtomb);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcrtomb
+# if HAVE_RAW_DECL_WCRTOMB
+_GL_WARN_ON_USE (wcrtomb, "wcrtomb is unportable - "
+ "use gnulib module wcrtomb for portability");
+# endif
+#endif
+
+
+/* Convert a wide string to a string. */
+#if @GNULIB_WCSRTOMBS@
+# if @REPLACE_WCSRTOMBS@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcsrtombs
+# define wcsrtombs rpl_wcsrtombs
+# endif
+_GL_FUNCDECL_RPL (wcsrtombs, size_t,
+ (char *restrict dest, const wchar_t **restrict srcp,
+ size_t len,
+ mbstate_t *restrict ps)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (wcsrtombs, size_t,
+ (char *restrict dest, const wchar_t **restrict srcp,
+ size_t len,
+ mbstate_t *restrict ps));
+# else
+# if !@HAVE_WCSRTOMBS@
+_GL_FUNCDECL_SYS (wcsrtombs, size_t,
+ (char *restrict dest, const wchar_t **restrict srcp,
+ size_t len,
+ mbstate_t *restrict ps)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (wcsrtombs, size_t,
+ (char *restrict dest, const wchar_t **restrict srcp,
+ size_t len,
+ mbstate_t *restrict ps));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcsrtombs);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsrtombs
+# if HAVE_RAW_DECL_WCSRTOMBS
+_GL_WARN_ON_USE (wcsrtombs, "wcsrtombs is unportable - "
+ "use gnulib module wcsrtombs for portability");
+# endif
+#endif
+
+
+/* Convert a wide string to a string. */
+#if @GNULIB_WCSNRTOMBS@
+# if @REPLACE_WCSNRTOMBS@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcsnrtombs
+# define wcsnrtombs rpl_wcsnrtombs
+# endif
+_GL_FUNCDECL_RPL (wcsnrtombs, size_t,
+ (char *restrict dest,
+ const wchar_t **restrict srcp, size_t srclen,
+ size_t len,
+ mbstate_t *restrict ps)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (wcsnrtombs, size_t,
+ (char *restrict dest,
+ const wchar_t **restrict srcp, size_t srclen,
+ size_t len,
+ mbstate_t *restrict ps));
+# else
+# if !@HAVE_WCSNRTOMBS@ || (defined __cplusplus && defined __sun)
+_GL_FUNCDECL_SYS (wcsnrtombs, size_t,
+ (char *restrict dest,
+ const wchar_t **restrict srcp, size_t srclen,
+ size_t len,
+ mbstate_t *restrict ps)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (wcsnrtombs, size_t,
+ (char *restrict dest,
+ const wchar_t **restrict srcp, size_t srclen,
+ size_t len,
+ mbstate_t *restrict ps));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcsnrtombs);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsnrtombs
+# if HAVE_RAW_DECL_WCSNRTOMBS
+_GL_WARN_ON_USE (wcsnrtombs, "wcsnrtombs is unportable - "
+ "use gnulib module wcsnrtombs for portability");
+# endif
+#endif
+
+
+/* Return the number of screen columns needed for WC. */
+#if @GNULIB_WCWIDTH@
+# if @REPLACE_WCWIDTH@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcwidth
+# define wcwidth rpl_wcwidth
+# endif
+_GL_FUNCDECL_RPL (wcwidth, int, (wchar_t) _GL_ATTRIBUTE_PURE);
+_GL_CXXALIAS_RPL (wcwidth, int, (wchar_t));
+# else
+# if !@HAVE_DECL_WCWIDTH@
+/* wcwidth exists but is not declared. */
+_GL_FUNCDECL_SYS (wcwidth, int, (wchar_t) _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wcwidth, int, (wchar_t));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcwidth);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcwidth
+# if HAVE_RAW_DECL_WCWIDTH
+_GL_WARN_ON_USE (wcwidth, "wcwidth is unportable - "
+ "use gnulib module wcwidth for portability");
+# endif
+#endif
+
+
+/* Search N wide characters of S for C. */
+#if @GNULIB_WMEMCHR@
+# if !@HAVE_WMEMCHR@
+_GL_FUNCDECL_SYS (wmemchr, wchar_t *, (const wchar_t *s, wchar_t c, size_t n)
+ _GL_ATTRIBUTE_PURE);
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" {
+ const wchar_t * std::wmemchr (const wchar_t *, wchar_t, size_t);
+ wchar_t * std::wmemchr (wchar_t *, wchar_t, size_t);
+ } */
+_GL_CXXALIAS_SYS_CAST2 (wmemchr,
+ wchar_t *, (const wchar_t *, wchar_t, size_t),
+ const wchar_t *, (const wchar_t *, wchar_t, size_t));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (wmemchr, wchar_t *, (wchar_t *s, wchar_t c, size_t n));
+_GL_CXXALIASWARN1 (wmemchr, const wchar_t *,
+ (const wchar_t *s, wchar_t c, size_t n));
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (wmemchr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wmemchr
+# if HAVE_RAW_DECL_WMEMCHR
+_GL_WARN_ON_USE (wmemchr, "wmemchr is unportable - "
+ "use gnulib module wmemchr for portability");
+# endif
+#endif
+
+
+/* Compare N wide characters of S1 and S2. */
+#if @GNULIB_WMEMCMP@
+# if !@HAVE_WMEMCMP@
+_GL_FUNCDECL_SYS (wmemcmp, int,
+ (const wchar_t *s1, const wchar_t *s2, size_t n)
+ _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wmemcmp, int,
+ (const wchar_t *s1, const wchar_t *s2, size_t n));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wmemcmp);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wmemcmp
+# if HAVE_RAW_DECL_WMEMCMP
+_GL_WARN_ON_USE (wmemcmp, "wmemcmp is unportable - "
+ "use gnulib module wmemcmp for portability");
+# endif
+#endif
+
+
+/* Copy N wide characters of SRC to DEST. */
+#if @GNULIB_WMEMCPY@
+# if !@HAVE_WMEMCPY@
+_GL_FUNCDECL_SYS (wmemcpy, wchar_t *,
+ (wchar_t *restrict dest,
+ const wchar_t *restrict src, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wmemcpy, wchar_t *,
+ (wchar_t *restrict dest,
+ const wchar_t *restrict src, size_t n));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wmemcpy);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wmemcpy
+# if HAVE_RAW_DECL_WMEMCPY
+_GL_WARN_ON_USE (wmemcpy, "wmemcpy is unportable - "
+ "use gnulib module wmemcpy for portability");
+# endif
+#endif
+
+
+/* Copy N wide characters of SRC to DEST, guaranteeing correct behavior for
+ overlapping memory areas. */
+#if @GNULIB_WMEMMOVE@
+# if !@HAVE_WMEMMOVE@
+_GL_FUNCDECL_SYS (wmemmove, wchar_t *,
+ (wchar_t *dest, const wchar_t *src, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wmemmove, wchar_t *,
+ (wchar_t *dest, const wchar_t *src, size_t n));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wmemmove);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wmemmove
+# if HAVE_RAW_DECL_WMEMMOVE
+_GL_WARN_ON_USE (wmemmove, "wmemmove is unportable - "
+ "use gnulib module wmemmove for portability");
+# endif
+#endif
+
+
+/* Copy N wide characters of SRC to DEST.
+ Return pointer to wide characters after the last written wide character. */
+#if @GNULIB_WMEMPCPY@
+# if @REPLACE_WMEMPCPY@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wmempcpy
+# define wmempcpy rpl_wmempcpy
+# endif
+_GL_FUNCDECL_RPL (wmempcpy, wchar_t *,
+ (wchar_t *restrict dest,
+ const wchar_t *restrict src, size_t n));
+_GL_CXXALIAS_RPL (wmempcpy, wchar_t *,
+ (wchar_t *restrict dest,
+ const wchar_t *restrict src, size_t n));
+# else
+# if !@HAVE_WMEMPCPY@
+_GL_FUNCDECL_SYS (wmempcpy, wchar_t *,
+ (wchar_t *restrict dest,
+ const wchar_t *restrict src, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wmempcpy, wchar_t *,
+ (wchar_t *restrict dest,
+ const wchar_t *restrict src, size_t n));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wmempcpy);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wmempcpy
+# if HAVE_RAW_DECL_WMEMPCPY
+_GL_WARN_ON_USE (wmempcpy, "wmempcpy is unportable - "
+ "use gnulib module wmempcpy for portability");
+# endif
+#endif
+
+
+/* Set N wide characters of S to C. */
+#if @GNULIB_WMEMSET@
+# if !@HAVE_WMEMSET@
+_GL_FUNCDECL_SYS (wmemset, wchar_t *, (wchar_t *s, wchar_t c, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wmemset, wchar_t *, (wchar_t *s, wchar_t c, size_t n));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wmemset);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wmemset
+# if HAVE_RAW_DECL_WMEMSET
+_GL_WARN_ON_USE (wmemset, "wmemset is unportable - "
+ "use gnulib module wmemset for portability");
+# endif
+#endif
+
+
+/* Return the number of wide characters in S. */
+#if @GNULIB_WCSLEN@
+# if !@HAVE_WCSLEN@
+_GL_FUNCDECL_SYS (wcslen, size_t, (const wchar_t *s) _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wcslen, size_t, (const wchar_t *s));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcslen);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcslen
+# if HAVE_RAW_DECL_WCSLEN
+_GL_WARN_ON_USE (wcslen, "wcslen is unportable - "
+ "use gnulib module wcslen for portability");
+# endif
+#endif
+
+
+/* Return the number of wide characters in S, but at most MAXLEN. */
+#if @GNULIB_WCSNLEN@
+/* On Solaris 11.3, the header files declare the function in the std::
+ namespace, not in the global namespace. So, force a declaration in
+ the global namespace. */
+# if !@HAVE_WCSNLEN@ || (defined __sun && defined __cplusplus)
+_GL_FUNCDECL_SYS (wcsnlen, size_t, (const wchar_t *s, size_t maxlen)
+ _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wcsnlen, size_t, (const wchar_t *s, size_t maxlen));
+_GL_CXXALIASWARN (wcsnlen);
+#elif defined GNULIB_POSIXCHECK
+# undef wcsnlen
+# if HAVE_RAW_DECL_WCSNLEN
+_GL_WARN_ON_USE (wcsnlen, "wcsnlen is unportable - "
+ "use gnulib module wcsnlen for portability");
+# endif
+#endif
+
+
+/* Copy SRC to DEST. */
+#if @GNULIB_WCSCPY@
+# if !@HAVE_WCSCPY@
+_GL_FUNCDECL_SYS (wcscpy, wchar_t *,
+ (wchar_t *restrict dest, const wchar_t *restrict src));
+# endif
+_GL_CXXALIAS_SYS (wcscpy, wchar_t *,
+ (wchar_t *restrict dest, const wchar_t *restrict src));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcscpy);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcscpy
+# if HAVE_RAW_DECL_WCSCPY
+_GL_WARN_ON_USE (wcscpy, "wcscpy is unportable - "
+ "use gnulib module wcscpy for portability");
+# endif
+#endif
+
+
+/* Copy SRC to DEST, returning the address of the terminating L'\0' in DEST. */
+#if @GNULIB_WCPCPY@
+/* On Solaris 11.3, the header files declare the function in the std::
+ namespace, not in the global namespace. So, force a declaration in
+ the global namespace. */
+# if !@HAVE_WCPCPY@ || (defined __sun && defined __cplusplus)
+_GL_FUNCDECL_SYS (wcpcpy, wchar_t *,
+ (wchar_t *restrict dest, const wchar_t *restrict src));
+# endif
+_GL_CXXALIAS_SYS (wcpcpy, wchar_t *,
+ (wchar_t *restrict dest, const wchar_t *restrict src));
+_GL_CXXALIASWARN (wcpcpy);
+#elif defined GNULIB_POSIXCHECK
+# undef wcpcpy
+# if HAVE_RAW_DECL_WCPCPY
+_GL_WARN_ON_USE (wcpcpy, "wcpcpy is unportable - "
+ "use gnulib module wcpcpy for portability");
+# endif
+#endif
+
+
+/* Copy no more than N wide characters of SRC to DEST. */
+#if @GNULIB_WCSNCPY@
+# if !@HAVE_WCSNCPY@
+_GL_FUNCDECL_SYS (wcsncpy, wchar_t *,
+ (wchar_t *restrict dest,
+ const wchar_t *restrict src, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wcsncpy, wchar_t *,
+ (wchar_t *restrict dest,
+ const wchar_t *restrict src, size_t n));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcsncpy);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsncpy
+# if HAVE_RAW_DECL_WCSNCPY
+_GL_WARN_ON_USE (wcsncpy, "wcsncpy is unportable - "
+ "use gnulib module wcsncpy for portability");
+# endif
+#endif
+
+
+/* Copy no more than N characters of SRC to DEST, returning the address of
+ the last character written into DEST. */
+#if @GNULIB_WCPNCPY@
+/* On Solaris 11.3, the header files declare the function in the std::
+ namespace, not in the global namespace. So, force a declaration in
+ the global namespace. */
+# if !@HAVE_WCPNCPY@ || (defined __sun && defined __cplusplus)
+_GL_FUNCDECL_SYS (wcpncpy, wchar_t *,
+ (wchar_t *restrict dest,
+ const wchar_t *restrict src, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wcpncpy, wchar_t *,
+ (wchar_t *restrict dest,
+ const wchar_t *restrict src, size_t n));
+_GL_CXXALIASWARN (wcpncpy);
+#elif defined GNULIB_POSIXCHECK
+# undef wcpncpy
+# if HAVE_RAW_DECL_WCPNCPY
+_GL_WARN_ON_USE (wcpncpy, "wcpncpy is unportable - "
+ "use gnulib module wcpncpy for portability");
+# endif
+#endif
+
+
+/* Append SRC onto DEST. */
+#if @GNULIB_WCSCAT@
+# if !@HAVE_WCSCAT@
+_GL_FUNCDECL_SYS (wcscat, wchar_t *,
+ (wchar_t *restrict dest, const wchar_t *restrict src));
+# endif
+_GL_CXXALIAS_SYS (wcscat, wchar_t *,
+ (wchar_t *restrict dest, const wchar_t *restrict src));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcscat);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcscat
+# if HAVE_RAW_DECL_WCSCAT
+_GL_WARN_ON_USE (wcscat, "wcscat is unportable - "
+ "use gnulib module wcscat for portability");
+# endif
+#endif
+
+
+/* Append no more than N wide characters of SRC onto DEST. */
+#if @GNULIB_WCSNCAT@
+# if !@HAVE_WCSNCAT@
+_GL_FUNCDECL_SYS (wcsncat, wchar_t *,
+ (wchar_t *restrict dest, const wchar_t *restrict src,
+ size_t n));
+# endif
+_GL_CXXALIAS_SYS (wcsncat, wchar_t *,
+ (wchar_t *restrict dest, const wchar_t *restrict src,
+ size_t n));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcsncat);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsncat
+# if HAVE_RAW_DECL_WCSNCAT
+_GL_WARN_ON_USE (wcsncat, "wcsncat is unportable - "
+ "use gnulib module wcsncat for portability");
+# endif
+#endif
+
+
+/* Compare S1 and S2. */
+#if @GNULIB_WCSCMP@
+# if !@HAVE_WCSCMP@
+_GL_FUNCDECL_SYS (wcscmp, int, (const wchar_t *s1, const wchar_t *s2)
+ _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wcscmp, int, (const wchar_t *s1, const wchar_t *s2));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcscmp);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcscmp
+# if HAVE_RAW_DECL_WCSCMP
+_GL_WARN_ON_USE (wcscmp, "wcscmp is unportable - "
+ "use gnulib module wcscmp for portability");
+# endif
+#endif
+
+
+/* Compare no more than N wide characters of S1 and S2. */
+#if @GNULIB_WCSNCMP@
+# if !@HAVE_WCSNCMP@
+_GL_FUNCDECL_SYS (wcsncmp, int,
+ (const wchar_t *s1, const wchar_t *s2, size_t n)
+ _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wcsncmp, int,
+ (const wchar_t *s1, const wchar_t *s2, size_t n));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcsncmp);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsncmp
+# if HAVE_RAW_DECL_WCSNCMP
+_GL_WARN_ON_USE (wcsncmp, "wcsncmp is unportable - "
+ "use gnulib module wcsncmp for portability");
+# endif
+#endif
+
+
+/* Compare S1 and S2, ignoring case. */
+#if @GNULIB_WCSCASECMP@
+/* On Solaris 11.3, the header files declare the function in the std::
+ namespace, not in the global namespace. So, force a declaration in
+ the global namespace. */
+# if !@HAVE_WCSCASECMP@ || (defined __sun && defined __cplusplus)
+_GL_FUNCDECL_SYS (wcscasecmp, int, (const wchar_t *s1, const wchar_t *s2)
+ _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wcscasecmp, int, (const wchar_t *s1, const wchar_t *s2));
+_GL_CXXALIASWARN (wcscasecmp);
+#elif defined GNULIB_POSIXCHECK
+# undef wcscasecmp
+# if HAVE_RAW_DECL_WCSCASECMP
+_GL_WARN_ON_USE (wcscasecmp, "wcscasecmp is unportable - "
+ "use gnulib module wcscasecmp for portability");
+# endif
+#endif
+
+
+/* Compare no more than N chars of S1 and S2, ignoring case. */
+#if @GNULIB_WCSNCASECMP@
+/* On Solaris 11.3, the header files declare the function in the std::
+ namespace, not in the global namespace. So, force a declaration in
+ the global namespace. */
+# if !@HAVE_WCSNCASECMP@ || (defined __sun && defined __cplusplus)
+_GL_FUNCDECL_SYS (wcsncasecmp, int,
+ (const wchar_t *s1, const wchar_t *s2, size_t n)
+ _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wcsncasecmp, int,
+ (const wchar_t *s1, const wchar_t *s2, size_t n));
+_GL_CXXALIASWARN (wcsncasecmp);
+#elif defined GNULIB_POSIXCHECK
+# undef wcsncasecmp
+# if HAVE_RAW_DECL_WCSNCASECMP
+_GL_WARN_ON_USE (wcsncasecmp, "wcsncasecmp is unportable - "
+ "use gnulib module wcsncasecmp for portability");
+# endif
+#endif
+
+
+/* Compare S1 and S2, both interpreted as appropriate to the LC_COLLATE
+ category of the current locale. */
+#if @GNULIB_WCSCOLL@
+# if !@HAVE_WCSCOLL@
+_GL_FUNCDECL_SYS (wcscoll, int, (const wchar_t *s1, const wchar_t *s2));
+# endif
+_GL_CXXALIAS_SYS (wcscoll, int, (const wchar_t *s1, const wchar_t *s2));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcscoll);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcscoll
+# if HAVE_RAW_DECL_WCSCOLL
+_GL_WARN_ON_USE (wcscoll, "wcscoll is unportable - "
+ "use gnulib module wcscoll for portability");
+# endif
+#endif
+
+
+/* Transform S2 into array pointed to by S1 such that if wcscmp is applied
+ to two transformed strings the result is the as applying 'wcscoll' to the
+ original strings. */
+#if @GNULIB_WCSXFRM@
+# if !@HAVE_WCSXFRM@
+_GL_FUNCDECL_SYS (wcsxfrm, size_t,
+ (wchar_t *restrict s1, const wchar_t *restrict s2, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wcsxfrm, size_t,
+ (wchar_t *restrict s1, const wchar_t *restrict s2, size_t n));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcsxfrm);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsxfrm
+# if HAVE_RAW_DECL_WCSXFRM
+_GL_WARN_ON_USE (wcsxfrm, "wcsxfrm is unportable - "
+ "use gnulib module wcsxfrm for portability");
+# endif
+#endif
+
+
+/* Duplicate S, returning an identical malloc'd string. */
+#if @GNULIB_WCSDUP@
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcsdup
+# define wcsdup _wcsdup
+# endif
+_GL_CXXALIAS_MDA (wcsdup, wchar_t *, (const wchar_t *s));
+# else
+/* On Solaris 11.3, the header files declare the function in the std::
+ namespace, not in the global namespace. So, force a declaration in
+ the global namespace. */
+# if !@HAVE_WCSDUP@ || (defined __sun && defined __cplusplus) || __GNUC__ >= 11
+_GL_FUNCDECL_SYS (wcsdup, wchar_t *,
+ (const wchar_t *s)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+_GL_CXXALIAS_SYS (wcsdup, wchar_t *, (const wchar_t *s));
+# endif
+_GL_CXXALIASWARN (wcsdup);
+#else
+# if __GNUC__ >= 11 && !defined wcsdup
+/* For -Wmismatched-dealloc: Associate wcsdup with free or rpl_free. */
+_GL_FUNCDECL_SYS (wcsdup, wchar_t *,
+ (const wchar_t *s)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+# undef wcsdup
+# if HAVE_RAW_DECL_WCSDUP
+_GL_WARN_ON_USE (wcsdup, "wcsdup is unportable - "
+ "use gnulib module wcsdup for portability");
+# endif
+# elif @GNULIB_MDA_WCSDUP@
+/* On native Windows, map 'wcsdup' to '_wcsdup', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::wcsdup always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcsdup
+# define wcsdup _wcsdup
+# endif
+_GL_CXXALIAS_MDA (wcsdup, wchar_t *, (const wchar_t *s));
+# else
+_GL_FUNCDECL_SYS (wcsdup, wchar_t *,
+ (const wchar_t *s)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# if @HAVE_DECL_WCSDUP@
+_GL_CXXALIAS_SYS (wcsdup, wchar_t *, (const wchar_t *s));
+# endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_DECL_WCSDUP@
+_GL_CXXALIASWARN (wcsdup);
+# endif
+# endif
+#endif
+
+
+/* Find the first occurrence of WC in WCS. */
+#if @GNULIB_WCSCHR@
+# if !@HAVE_WCSCHR@
+_GL_FUNCDECL_SYS (wcschr, wchar_t *, (const wchar_t *wcs, wchar_t wc)
+ _GL_ATTRIBUTE_PURE);
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" {
+ const wchar_t * std::wcschr (const wchar_t *, wchar_t);
+ wchar_t * std::wcschr (wchar_t *, wchar_t);
+ } */
+_GL_CXXALIAS_SYS_CAST2 (wcschr,
+ wchar_t *, (const wchar_t *, wchar_t),
+ const wchar_t *, (const wchar_t *, wchar_t));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (wcschr, wchar_t *, (wchar_t *wcs, wchar_t wc));
+_GL_CXXALIASWARN1 (wcschr, const wchar_t *, (const wchar_t *wcs, wchar_t wc));
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcschr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcschr
+# if HAVE_RAW_DECL_WCSCHR
+_GL_WARN_ON_USE (wcschr, "wcschr is unportable - "
+ "use gnulib module wcschr for portability");
+# endif
+#endif
+
+
+/* Find the last occurrence of WC in WCS. */
+#if @GNULIB_WCSRCHR@
+# if !@HAVE_WCSRCHR@
+_GL_FUNCDECL_SYS (wcsrchr, wchar_t *, (const wchar_t *wcs, wchar_t wc)
+ _GL_ATTRIBUTE_PURE);
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" {
+ const wchar_t * std::wcsrchr (const wchar_t *, wchar_t);
+ wchar_t * std::wcsrchr (wchar_t *, wchar_t);
+ } */
+_GL_CXXALIAS_SYS_CAST2 (wcsrchr,
+ wchar_t *, (const wchar_t *, wchar_t),
+ const wchar_t *, (const wchar_t *, wchar_t));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (wcsrchr, wchar_t *, (wchar_t *wcs, wchar_t wc));
+_GL_CXXALIASWARN1 (wcsrchr, const wchar_t *, (const wchar_t *wcs, wchar_t wc));
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcsrchr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsrchr
+# if HAVE_RAW_DECL_WCSRCHR
+_GL_WARN_ON_USE (wcsrchr, "wcsrchr is unportable - "
+ "use gnulib module wcsrchr for portability");
+# endif
+#endif
+
+
+/* Return the length of the initial segmet of WCS which consists entirely
+ of wide characters not in REJECT. */
+#if @GNULIB_WCSCSPN@
+# if !@HAVE_WCSCSPN@
+_GL_FUNCDECL_SYS (wcscspn, size_t, (const wchar_t *wcs, const wchar_t *reject)
+ _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wcscspn, size_t, (const wchar_t *wcs, const wchar_t *reject));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcscspn);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcscspn
+# if HAVE_RAW_DECL_WCSCSPN
+_GL_WARN_ON_USE (wcscspn, "wcscspn is unportable - "
+ "use gnulib module wcscspn for portability");
+# endif
+#endif
+
+
+/* Return the length of the initial segmet of WCS which consists entirely
+ of wide characters in ACCEPT. */
+#if @GNULIB_WCSSPN@
+# if !@HAVE_WCSSPN@
+_GL_FUNCDECL_SYS (wcsspn, size_t, (const wchar_t *wcs, const wchar_t *accept)
+ _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wcsspn, size_t, (const wchar_t *wcs, const wchar_t *accept));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcsspn);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsspn
+# if HAVE_RAW_DECL_WCSSPN
+_GL_WARN_ON_USE (wcsspn, "wcsspn is unportable - "
+ "use gnulib module wcsspn for portability");
+# endif
+#endif
+
+
+/* Find the first occurrence in WCS of any character in ACCEPT. */
+#if @GNULIB_WCSPBRK@
+# if !@HAVE_WCSPBRK@
+_GL_FUNCDECL_SYS (wcspbrk, wchar_t *,
+ (const wchar_t *wcs, const wchar_t *accept)
+ _GL_ATTRIBUTE_PURE);
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" {
+ const wchar_t * std::wcspbrk (const wchar_t *, const wchar_t *);
+ wchar_t * std::wcspbrk (wchar_t *, const wchar_t *);
+ } */
+_GL_CXXALIAS_SYS_CAST2 (wcspbrk,
+ wchar_t *, (const wchar_t *, const wchar_t *),
+ const wchar_t *, (const wchar_t *, const wchar_t *));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (wcspbrk, wchar_t *,
+ (wchar_t *wcs, const wchar_t *accept));
+_GL_CXXALIASWARN1 (wcspbrk, const wchar_t *,
+ (const wchar_t *wcs, const wchar_t *accept));
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcspbrk);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcspbrk
+# if HAVE_RAW_DECL_WCSPBRK
+_GL_WARN_ON_USE (wcspbrk, "wcspbrk is unportable - "
+ "use gnulib module wcspbrk for portability");
+# endif
+#endif
+
+
+/* Find the first occurrence of NEEDLE in HAYSTACK. */
+#if @GNULIB_WCSSTR@
+# if !@HAVE_WCSSTR@
+_GL_FUNCDECL_SYS (wcsstr, wchar_t *,
+ (const wchar_t *restrict haystack,
+ const wchar_t *restrict needle)
+ _GL_ATTRIBUTE_PURE);
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" {
+ const wchar_t * std::wcsstr (const wchar_t *, const wchar_t *);
+ wchar_t * std::wcsstr (wchar_t *, const wchar_t *);
+ } */
+_GL_CXXALIAS_SYS_CAST2 (wcsstr,
+ wchar_t *,
+ (const wchar_t *restrict, const wchar_t *restrict),
+ const wchar_t *,
+ (const wchar_t *restrict, const wchar_t *restrict));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (wcsstr, wchar_t *,
+ (wchar_t *restrict haystack,
+ const wchar_t *restrict needle));
+_GL_CXXALIASWARN1 (wcsstr, const wchar_t *,
+ (const wchar_t *restrict haystack,
+ const wchar_t *restrict needle));
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcsstr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsstr
+# if HAVE_RAW_DECL_WCSSTR
+_GL_WARN_ON_USE (wcsstr, "wcsstr is unportable - "
+ "use gnulib module wcsstr for portability");
+# endif
+#endif
+
+
+/* Divide WCS into tokens separated by characters in DELIM. */
+#if @GNULIB_WCSTOK@
+# if @REPLACE_WCSTOK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcstok
+# define wcstok rpl_wcstok
+# endif
+_GL_FUNCDECL_RPL (wcstok, wchar_t *,
+ (wchar_t *restrict wcs, const wchar_t *restrict delim,
+ wchar_t **restrict ptr));
+_GL_CXXALIAS_RPL (wcstok, wchar_t *,
+ (wchar_t *restrict wcs, const wchar_t *restrict delim,
+ wchar_t **restrict ptr));
+# else
+# if !@HAVE_WCSTOK@
+_GL_FUNCDECL_SYS (wcstok, wchar_t *,
+ (wchar_t *restrict wcs, const wchar_t *restrict delim,
+ wchar_t **restrict ptr));
+# endif
+_GL_CXXALIAS_SYS (wcstok, wchar_t *,
+ (wchar_t *restrict wcs, const wchar_t *restrict delim,
+ wchar_t **restrict ptr));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcstok);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcstok
+# if HAVE_RAW_DECL_WCSTOK
+_GL_WARN_ON_USE (wcstok, "wcstok is unportable - "
+ "use gnulib module wcstok for portability");
+# endif
+#endif
+
+
+/* Determine number of column positions required for first N wide
+ characters (or fewer if S ends before this) in S. */
+#if @GNULIB_WCSWIDTH@
+# if @REPLACE_WCSWIDTH@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcswidth
+# define wcswidth rpl_wcswidth
+# endif
+_GL_FUNCDECL_RPL (wcswidth, int, (const wchar_t *s, size_t n)
+ _GL_ATTRIBUTE_PURE);
+_GL_CXXALIAS_RPL (wcswidth, int, (const wchar_t *s, size_t n));
+# else
+# if !@HAVE_WCSWIDTH@
+_GL_FUNCDECL_SYS (wcswidth, int, (const wchar_t *s, size_t n)
+ _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wcswidth, int, (const wchar_t *s, size_t n));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcswidth);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcswidth
+# if HAVE_RAW_DECL_WCSWIDTH
+_GL_WARN_ON_USE (wcswidth, "wcswidth is unportable - "
+ "use gnulib module wcswidth for portability");
+# endif
+#endif
+
+
+/* Convert *TP to a date and time wide string. See
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcsftime.html>. */
+#if @GNULIB_WCSFTIME@
+# if @REPLACE_WCSFTIME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcsftime
+# define wcsftime rpl_wcsftime
+# endif
+_GL_FUNCDECL_RPL (wcsftime, size_t,
+ (wchar_t *restrict __buf, size_t __bufsize,
+ const wchar_t *restrict __fmt,
+ const struct tm *restrict __tp)
+ _GL_ARG_NONNULL ((1, 3, 4)));
+_GL_CXXALIAS_RPL (wcsftime, size_t,
+ (wchar_t *restrict __buf, size_t __bufsize,
+ const wchar_t *restrict __fmt,
+ const struct tm *restrict __tp));
+# else
+# if !@HAVE_WCSFTIME@
+_GL_FUNCDECL_SYS (wcsftime, size_t,
+ (wchar_t *restrict __buf, size_t __bufsize,
+ const wchar_t *restrict __fmt,
+ const struct tm *restrict __tp)
+ _GL_ARG_NONNULL ((1, 3, 4)));
+# endif
+_GL_CXXALIAS_SYS (wcsftime, size_t,
+ (wchar_t *restrict __buf, size_t __bufsize,
+ const wchar_t *restrict __fmt,
+ const struct tm *restrict __tp));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcsftime);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsftime
+# if HAVE_RAW_DECL_WCSFTIME
+_GL_WARN_ON_USE (wcsftime, "wcsftime is unportable - "
+ "use gnulib module wcsftime for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_WCHAR_H */
+#endif /* _@GUARD_PREFIX@_WCHAR_H */
+#endif
diff --git a/lib/wctype-h.c b/lib/wctype-h.c
new file mode 100644
index 0000000..7d3e14a
--- /dev/null
+++ b/lib/wctype-h.c
@@ -0,0 +1,23 @@
+/* Inline functions for <wctype.h>.
+
+ Copyright (C) 2012-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Normally this would be wctype.c, but that name's already taken. */
+
+#include <config.h>
+
+#define _GL_WCTYPE_INLINE _GL_EXTERN_INLINE
+#include "wctype.h"
diff --git a/lib/wctype.in.h b/lib/wctype.in.h
new file mode 100644
index 0000000..f6e474d
--- /dev/null
+++ b/lib/wctype.in.h
@@ -0,0 +1,732 @@
+/* A substitute for ISO C99 <wctype.h>, for platforms that lack it.
+
+ Copyright (C) 2006-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible and Paul Eggert. */
+
+/*
+ * ISO C 99 <wctype.h> for platforms that lack it.
+ * <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/wctype.h.html>
+ *
+ * iswctype, towctrans, towlower, towupper, wctrans, wctype,
+ * wctrans_t, and wctype_t are not yet implemented.
+ */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if (defined __MINGW32__ && defined __CTYPE_H_SOURCED__)
+
+/* Special invocation convention:
+ - With MinGW 3.22, when <ctype.h> includes <wctype.h>, only some part of
+ <wctype.h> is being processed, which doesn't include the idempotency
+ guard. */
+
+#@INCLUDE_NEXT@ @NEXT_WCTYPE_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_WCTYPE_H
+
+#if @HAVE_WINT_T@
+/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>. */
+# include <wchar.h>
+#endif
+
+/* Native Windows (mingw, MSVC) have declarations of towupper, towlower, and
+ isw* functions in <ctype.h>, <wchar.h> as well as in <wctype.h>. Include
+ <ctype.h>, <wchar.h> in advance to avoid rpl_ prefix being added to the
+ declarations. */
+#if defined _WIN32 && ! defined __CYGWIN__
+# include <ctype.h>
+# include <wchar.h>
+#endif
+
+/* Include the original <wctype.h> if it exists.
+ BeOS 5 has the functions but no <wctype.h>. */
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_WCTYPE_H@
+# @INCLUDE_NEXT@ @NEXT_WCTYPE_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_WCTYPE_H
+#define _@GUARD_PREFIX@_WCTYPE_H
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef _GL_WCTYPE_INLINE
+# define _GL_WCTYPE_INLINE _GL_INLINE
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Solaris 2.6 <wctype.h> includes <widec.h> which includes <euc.h> which
+ #defines a number of identifiers in the application namespace. Revert
+ these #defines. */
+#ifdef __sun
+# undef multibyte
+# undef eucw1
+# undef eucw2
+# undef eucw3
+# undef scrw1
+# undef scrw2
+# undef scrw3
+#endif
+
+/* Define wint_t and WEOF. (Also done in wchar.in.h.) */
+#if !@HAVE_WINT_T@ && !defined wint_t
+# define wint_t int
+# ifndef WEOF
+# define WEOF -1
+# endif
+#else
+/* mingw and MSVC define wint_t as 'unsigned short' in <crtdefs.h> or
+ <stddef.h>. This is too small: ISO C 99 section 7.24.1.(2) says that
+ wint_t must be "unchanged by default argument promotions". Override it. */
+# if @GNULIBHEADERS_OVERRIDE_WINT_T@
+# if !GNULIB_defined_wint_t
+# if @HAVE_CRTDEFS_H@
+# include <crtdefs.h>
+# else
+# include <stddef.h>
+# endif
+typedef unsigned int rpl_wint_t;
+# undef wint_t
+# define wint_t rpl_wint_t
+# define GNULIB_defined_wint_t 1
+# endif
+# endif
+# ifndef WEOF
+# define WEOF ((wint_t) -1)
+# endif
+#endif
+
+
+#if !GNULIB_defined_wctype_functions
+
+/* FreeBSD 4.4 to 4.11 has <wctype.h> but lacks the functions.
+ Linux libc5 has <wctype.h> and the functions but they are broken.
+ mingw and MSVC have <wctype.h> and the functions but they take a wchar_t
+ as argument, not an rpl_wint_t.
+ Assume all 11 functions (all isw* except iswblank) are implemented the
+ same way, or not at all. */
+# if ! @HAVE_ISWCNTRL@ || @REPLACE_ISWCNTRL@
+
+# if @GNULIBHEADERS_OVERRIDE_WINT_T@ /* implies @REPLACE_ISWCNTRL@ */
+
+_GL_WCTYPE_INLINE int
+rpl_iswalnum (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? iswalnum ((wchar_t) wc) : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswalpha (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? iswalpha ((wchar_t) wc) : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswblank (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? iswblank ((wchar_t) wc) : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswcntrl (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? iswcntrl ((wchar_t) wc) : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswdigit (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? wc >= '0' && wc <= '9' : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswgraph (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? iswgraph ((wchar_t) wc) : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswlower (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? iswlower ((wchar_t) wc) : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswprint (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? iswprint ((wchar_t) wc) : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswpunct (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? iswpunct ((wchar_t) wc) : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswspace (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? iswspace ((wchar_t) wc) : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswupper (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? iswupper ((wchar_t) wc) : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswxdigit (wint_t wc)
+{
+ return ((wchar_t) wc == wc
+ ? (wc >= '0' && wc <= '9')
+ || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F')
+ : 0);
+}
+
+_GL_WCTYPE_INLINE wint_t
+rpl_towlower (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? (wchar_t) towlower ((wchar_t) wc) : wc);
+}
+
+_GL_WCTYPE_INLINE wint_t
+rpl_towupper (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? (wchar_t) towupper ((wchar_t) wc) : wc);
+}
+
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef iswalnum
+# undef iswalpha
+# undef iswblank
+# undef iswcntrl
+# undef iswdigit
+# undef iswgraph
+# undef iswlower
+# undef iswprint
+# undef iswpunct
+# undef iswspace
+# undef iswupper
+# undef iswxdigit
+# undef towlower
+# undef towupper
+# define iswalnum rpl_iswalnum
+# define iswalpha rpl_iswalpha
+# define iswblank rpl_iswblank
+# define iswcntrl rpl_iswcntrl
+# define iswdigit rpl_iswdigit
+# define iswgraph rpl_iswgraph
+# define iswlower rpl_iswlower
+# define iswprint rpl_iswprint
+# define iswpunct rpl_iswpunct
+# define iswspace rpl_iswspace
+# define iswupper rpl_iswupper
+# define iswxdigit rpl_iswxdigit
+# define towlower rpl_towlower
+# define towupper rpl_towupper
+# endif
+
+# else
+
+/* IRIX 5.3 has macros but no functions, its isw* macros refer to an
+ undefined variable _ctmp_ and to <ctype.h> macros like _P, and they
+ refer to system functions like _iswctype that are not in the
+ standard C library. Rather than try to get ancient buggy
+ implementations like this to work, just disable them. */
+# undef iswalnum
+# undef iswalpha
+# undef iswblank
+# undef iswcntrl
+# undef iswdigit
+# undef iswgraph
+# undef iswlower
+# undef iswprint
+# undef iswpunct
+# undef iswspace
+# undef iswupper
+# undef iswxdigit
+# undef towlower
+# undef towupper
+
+/* Linux libc5 has <wctype.h> and the functions but they are broken. */
+# if @REPLACE_ISWCNTRL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define iswalnum rpl_iswalnum
+# define iswalpha rpl_iswalpha
+# define iswblank rpl_iswblank
+# define iswcntrl rpl_iswcntrl
+# define iswdigit rpl_iswdigit
+# define iswgraph rpl_iswgraph
+# define iswlower rpl_iswlower
+# define iswprint rpl_iswprint
+# define iswpunct rpl_iswpunct
+# define iswspace rpl_iswspace
+# define iswupper rpl_iswupper
+# define iswxdigit rpl_iswxdigit
+# endif
+# endif
+# if @REPLACE_TOWLOWER@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define towlower rpl_towlower
+# define towupper rpl_towupper
+# endif
+# endif
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWCNTRL@
+rpl_iswalnum
+# else
+iswalnum
+# endif
+ (wint_t wc)
+{
+ return ((wc >= '0' && wc <= '9')
+ || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z'));
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWCNTRL@
+rpl_iswalpha
+# else
+iswalpha
+# endif
+ (wint_t wc)
+{
+ return (wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z';
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWCNTRL@
+rpl_iswblank
+# else
+iswblank
+# endif
+ (wint_t wc)
+{
+ return wc == ' ' || wc == '\t';
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWCNTRL@
+rpl_iswcntrl
+# else
+iswcntrl
+# endif
+ (wint_t wc)
+{
+ return (wc & ~0x1f) == 0 || wc == 0x7f;
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWDIGIT@
+rpl_iswdigit
+# else
+iswdigit
+# endif
+ (wint_t wc)
+{
+ return wc >= '0' && wc <= '9';
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWCNTRL@
+rpl_iswgraph
+# else
+iswgraph
+# endif
+ (wint_t wc)
+{
+ return wc >= '!' && wc <= '~';
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWCNTRL@
+rpl_iswlower
+# else
+iswlower
+# endif
+ (wint_t wc)
+{
+ return wc >= 'a' && wc <= 'z';
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWCNTRL@
+rpl_iswprint
+# else
+iswprint
+# endif
+ (wint_t wc)
+{
+ return wc >= ' ' && wc <= '~';
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWCNTRL@
+rpl_iswpunct
+# else
+iswpunct
+# endif
+ (wint_t wc)
+{
+ return (wc >= '!' && wc <= '~'
+ && !((wc >= '0' && wc <= '9')
+ || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z')));
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWCNTRL@
+rpl_iswspace
+# else
+iswspace
+# endif
+ (wint_t wc)
+{
+ return (wc == ' ' || wc == '\t'
+ || wc == '\n' || wc == '\v' || wc == '\f' || wc == '\r');
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWCNTRL@
+rpl_iswupper
+# else
+iswupper
+# endif
+ (wint_t wc)
+{
+ return wc >= 'A' && wc <= 'Z';
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWXDIGIT@
+rpl_iswxdigit
+# else
+iswxdigit
+# endif
+ (wint_t wc)
+{
+ return ((wc >= '0' && wc <= '9')
+ || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F'));
+}
+
+_GL_WCTYPE_INLINE wint_t
+# if @REPLACE_TOWLOWER@
+rpl_towlower
+# else
+towlower
+# endif
+ (wint_t wc)
+{
+ return (wc >= 'A' && wc <= 'Z' ? wc - 'A' + 'a' : wc);
+}
+
+_GL_WCTYPE_INLINE wint_t
+# if @REPLACE_TOWLOWER@
+rpl_towupper
+# else
+towupper
+# endif
+ (wint_t wc)
+{
+ return (wc >= 'a' && wc <= 'z' ? wc - 'a' + 'A' : wc);
+}
+
+# endif
+
+# else
+/* Only some of the functions are missing or broken. */
+
+# if @GNULIB_ISWBLANK@ && (! @HAVE_ISWBLANK@ || @REPLACE_ISWBLANK@)
+/* Only the iswblank function is missing. */
+# if @REPLACE_ISWBLANK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define iswblank rpl_iswblank
+# endif
+_GL_FUNCDECL_RPL (iswblank, int, (wint_t wc));
+# else
+_GL_FUNCDECL_SYS (iswblank, int, (wint_t wc));
+# endif
+# endif
+
+# if @GNULIB_ISWDIGIT@
+# if @REPLACE_ISWDIGIT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef iswdigit
+# define iswdigit rpl_iswdigit
+# endif
+_GL_FUNCDECL_RPL (iswdigit, int, (wint_t wc));
+# endif
+# endif
+
+# if @GNULIB_ISWXDIGIT@
+# if @REPLACE_ISWXDIGIT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef iswxdigit
+# define iswxdigit rpl_iswxdigit
+# endif
+_GL_FUNCDECL_RPL (iswxdigit, int, (wint_t wc));
+# endif
+# endif
+
+# endif
+
+# if defined __MINGW32__ && !@GNULIBHEADERS_OVERRIDE_WINT_T@
+
+/* On native Windows, wchar_t is uint16_t, and wint_t is uint32_t.
+ The functions towlower and towupper are implemented in the MSVCRT library
+ to take a wchar_t argument and return a wchar_t result. mingw declares
+ these functions to take a wint_t argument and return a wint_t result.
+ This means that:
+ 1. When the user passes an argument outside the range 0x0000..0xFFFF, the
+ function will look only at the lower 16 bits. This is allowed according
+ to POSIX.
+ 2. The return value is returned in the lower 16 bits of the result register.
+ The upper 16 bits are random: whatever happened to be in that part of the
+ result register. We need to fix this by adding a zero-extend from
+ wchar_t to wint_t after the call. */
+
+_GL_WCTYPE_INLINE wint_t
+rpl_towlower (wint_t wc)
+{
+ return (wint_t) (wchar_t) towlower (wc);
+}
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define towlower rpl_towlower
+# endif
+
+_GL_WCTYPE_INLINE wint_t
+rpl_towupper (wint_t wc)
+{
+ return (wint_t) (wchar_t) towupper (wc);
+}
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define towupper rpl_towupper
+# endif
+
+# endif /* __MINGW32__ && !@GNULIBHEADERS_OVERRIDE_WINT_T@ */
+
+# define GNULIB_defined_wctype_functions 1
+#endif
+
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswalnum, int, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (iswalnum, int, (wint_t wc));
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswalpha, int, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (iswalpha, int, (wint_t wc));
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswcntrl, int, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (iswcntrl, int, (wint_t wc));
+#endif
+#if @GNULIB_ISWDIGIT@
+# if @REPLACE_ISWDIGIT@
+_GL_CXXALIAS_RPL (iswdigit, int, (wint_t wc));
+# else
+_GL_CXXALIAS_SYS (iswdigit, int, (wint_t wc));
+# endif
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswgraph, int, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (iswgraph, int, (wint_t wc));
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswlower, int, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (iswlower, int, (wint_t wc));
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswprint, int, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (iswprint, int, (wint_t wc));
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswpunct, int, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (iswpunct, int, (wint_t wc));
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswspace, int, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (iswspace, int, (wint_t wc));
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswupper, int, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (iswupper, int, (wint_t wc));
+#endif
+#if @GNULIB_ISWXDIGIT@
+# if @REPLACE_ISWXDIGIT@
+_GL_CXXALIAS_RPL (iswxdigit, int, (wint_t wc));
+# else
+_GL_CXXALIAS_SYS (iswxdigit, int, (wint_t wc));
+# endif
+#endif
+#if __GLIBC__ >= 2
+_GL_CXXALIASWARN (iswalnum);
+_GL_CXXALIASWARN (iswalpha);
+_GL_CXXALIASWARN (iswcntrl);
+_GL_CXXALIASWARN (iswdigit);
+_GL_CXXALIASWARN (iswgraph);
+_GL_CXXALIASWARN (iswlower);
+_GL_CXXALIASWARN (iswprint);
+_GL_CXXALIASWARN (iswpunct);
+_GL_CXXALIASWARN (iswspace);
+_GL_CXXALIASWARN (iswupper);
+_GL_CXXALIASWARN (iswxdigit);
+#endif
+
+#if @GNULIB_ISWBLANK@
+# if @REPLACE_ISWCNTRL@ || @REPLACE_ISWBLANK@
+_GL_CXXALIAS_RPL (iswblank, int, (wint_t wc));
+# else
+_GL_CXXALIAS_SYS (iswblank, int, (wint_t wc));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (iswblank);
+# endif
+#endif
+
+#if !@HAVE_WCTYPE_T@
+# if !GNULIB_defined_wctype_t
+typedef void * wctype_t;
+# define GNULIB_defined_wctype_t 1
+# endif
+#endif
+
+/* Get a descriptor for a wide character property. */
+#if @GNULIB_WCTYPE@
+# if !@HAVE_WCTYPE_T@
+_GL_FUNCDECL_SYS (wctype, wctype_t, (const char *name));
+# endif
+_GL_CXXALIAS_SYS (wctype, wctype_t, (const char *name));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wctype);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wctype
+# if HAVE_RAW_DECL_WCTYPE
+_GL_WARN_ON_USE (wctype, "wctype is unportable - "
+ "use gnulib module wctype for portability");
+# endif
+#endif
+
+/* Test whether a wide character has a given property.
+ The argument WC must be either a wchar_t value or WEOF.
+ The argument DESC must have been returned by the wctype() function. */
+#if @GNULIB_ISWCTYPE@
+# if @GNULIBHEADERS_OVERRIDE_WINT_T@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef iswctype
+# define iswctype rpl_iswctype
+# endif
+_GL_FUNCDECL_RPL (iswctype, int, (wint_t wc, wctype_t desc));
+_GL_CXXALIAS_RPL (iswctype, int, (wint_t wc, wctype_t desc));
+# else
+# if !@HAVE_WCTYPE_T@
+_GL_FUNCDECL_SYS (iswctype, int, (wint_t wc, wctype_t desc));
+# endif
+_GL_CXXALIAS_SYS (iswctype, int, (wint_t wc, wctype_t desc));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (iswctype);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef iswctype
+# if HAVE_RAW_DECL_ISWCTYPE
+_GL_WARN_ON_USE (iswctype, "iswctype is unportable - "
+ "use gnulib module iswctype for portability");
+# endif
+#endif
+
+#if @REPLACE_TOWLOWER@ || defined __MINGW32__
+_GL_CXXALIAS_RPL (towlower, wint_t, (wint_t wc));
+_GL_CXXALIAS_RPL (towupper, wint_t, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (towlower, wint_t, (wint_t wc));
+_GL_CXXALIAS_SYS (towupper, wint_t, (wint_t wc));
+#endif
+#if __GLIBC__ >= 2
+_GL_CXXALIASWARN (towlower);
+_GL_CXXALIASWARN (towupper);
+#endif
+
+#if !@HAVE_WCTRANS_T@
+# if !GNULIB_defined_wctrans_t
+typedef void * wctrans_t;
+# define GNULIB_defined_wctrans_t 1
+# endif
+#endif
+
+/* Get a descriptor for a wide character case conversion. */
+#if @GNULIB_WCTRANS@
+# if !@HAVE_WCTRANS_T@
+_GL_FUNCDECL_SYS (wctrans, wctrans_t, (const char *name));
+# endif
+_GL_CXXALIAS_SYS (wctrans, wctrans_t, (const char *name));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wctrans);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wctrans
+# if HAVE_RAW_DECL_WCTRANS
+_GL_WARN_ON_USE (wctrans, "wctrans is unportable - "
+ "use gnulib module wctrans for portability");
+# endif
+#endif
+
+/* Perform a given case conversion on a wide character.
+ The argument WC must be either a wchar_t value or WEOF.
+ The argument DESC must have been returned by the wctrans() function. */
+#if @GNULIB_TOWCTRANS@
+# if !@HAVE_WCTRANS_T@
+_GL_FUNCDECL_SYS (towctrans, wint_t, (wint_t wc, wctrans_t desc));
+# endif
+_GL_CXXALIAS_SYS (towctrans, wint_t, (wint_t wc, wctrans_t desc));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (towctrans);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef towctrans
+# if HAVE_RAW_DECL_TOWCTRANS
+_GL_WARN_ON_USE (towctrans, "towctrans is unportable - "
+ "use gnulib module towctrans for portability");
+# endif
+#endif
+
+_GL_INLINE_HEADER_END
+
+#endif /* _@GUARD_PREFIX@_WCTYPE_H */
+#endif /* _@GUARD_PREFIX@_WCTYPE_H */
+#endif
diff --git a/lib/wcwidth.c b/lib/wcwidth.c
new file mode 100644
index 0000000..1d03665
--- /dev/null
+++ b/lib/wcwidth.c
@@ -0,0 +1,73 @@
+/* Determine the number of screen columns needed for a character.
+ Copyright (C) 2006-2007, 2010-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+/* Get iswprint. */
+#include <wctype.h>
+
+#include "localcharset.h"
+#include "streq.h"
+#include "uniwidth.h"
+
+/* Returns 1 if the current locale is an UTF-8 locale, 0 otherwise. */
+static inline int
+is_locale_utf8 (void)
+{
+ const char *encoding = locale_charset ();
+ return STREQ_OPT (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0, 0);
+}
+
+#if GNULIB_WCHAR_SINGLE_LOCALE
+/* When we know that the locale does not change, provide a speedup by
+ caching the value of is_locale_utf8. */
+static int cached_is_locale_utf8 = -1;
+static inline int
+is_locale_utf8_cached (void)
+{
+ if (cached_is_locale_utf8 < 0)
+ cached_is_locale_utf8 = is_locale_utf8 ();
+ return cached_is_locale_utf8;
+}
+#else
+/* By default, don't make assumptions, hence no caching. */
+# define is_locale_utf8_cached is_locale_utf8
+#endif
+
+int
+wcwidth (wchar_t wc)
+#undef wcwidth
+{
+ /* In UTF-8 locales, use a Unicode aware width function. */
+ if (is_locale_utf8_cached ())
+ {
+ /* We assume that in a UTF-8 locale, a wide character is the same as a
+ Unicode character. */
+ return uc_width (wc, "UTF-8");
+ }
+ else
+ {
+ /* Otherwise, fall back to the system's wcwidth function. */
+#if HAVE_WCWIDTH
+ return wcwidth (wc);
+#else
+ return wc == 0 ? 0 : iswprint (wc) ? 1 : -1;
+#endif
+ }
+}
diff --git a/lib/xsize.c b/lib/xsize.c
new file mode 100644
index 0000000..279ae82
--- /dev/null
+++ b/lib/xsize.c
@@ -0,0 +1,21 @@
+/* Checked size_t computations.
+
+ Copyright (C) 2012-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#define XSIZE_INLINE _GL_EXTERN_INLINE
+#include "xsize.h"
diff --git a/lib/xsize.h b/lib/xsize.h
new file mode 100644
index 0000000..1ec78e7
--- /dev/null
+++ b/lib/xsize.h
@@ -0,0 +1,108 @@
+/* xsize.h -- Checked size_t computations.
+
+ Copyright (C) 2003, 2008-2023 Free Software Foundation, Inc.
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This file 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#ifndef _XSIZE_H
+#define _XSIZE_H
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get SIZE_MAX. */
+#include <limits.h>
+#if HAVE_STDINT_H
+# include <stdint.h>
+#endif
+
+/* Get ATTRIBUTE_PURE. */
+#include "attribute.h"
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef XSIZE_INLINE
+# define XSIZE_INLINE _GL_INLINE
+#endif
+
+/* The size of memory objects is often computed through expressions of
+ type size_t. Example:
+ void* p = malloc (header_size + n * element_size).
+ These computations can lead to overflow. When this happens, malloc()
+ returns a piece of memory that is way too small, and the program then
+ crashes while attempting to fill the memory.
+ To avoid this, the functions and macros in this file check for overflow.
+ The convention is that SIZE_MAX represents overflow.
+ malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc
+ implementation that uses mmap --, it's recommended to use size_overflow_p()
+ or size_in_bounds_p() before invoking malloc().
+ The example thus becomes:
+ size_t size = xsum (header_size, xtimes (n, element_size));
+ void *p = (size_in_bounds_p (size) ? malloc (size) : NULL);
+*/
+
+/* Convert an arbitrary value >= 0 to type size_t. */
+#define xcast_size_t(N) \
+ ((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX)
+
+/* Sum of two sizes, with overflow check. */
+XSIZE_INLINE size_t ATTRIBUTE_PURE
+xsum (size_t size1, size_t size2)
+{
+ size_t sum = size1 + size2;
+ return (sum >= size1 ? sum : SIZE_MAX);
+}
+
+/* Sum of three sizes, with overflow check. */
+XSIZE_INLINE size_t ATTRIBUTE_PURE
+xsum3 (size_t size1, size_t size2, size_t size3)
+{
+ return xsum (xsum (size1, size2), size3);
+}
+
+/* Sum of four sizes, with overflow check. */
+XSIZE_INLINE size_t ATTRIBUTE_PURE
+xsum4 (size_t size1, size_t size2, size_t size3, size_t size4)
+{
+ return xsum (xsum (xsum (size1, size2), size3), size4);
+}
+
+/* Maximum of two sizes, with overflow check. */
+XSIZE_INLINE size_t ATTRIBUTE_PURE
+xmax (size_t size1, size_t size2)
+{
+ /* No explicit check is needed here, because for any n:
+ max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX. */
+ return (size1 >= size2 ? size1 : size2);
+}
+
+/* Multiplication of a count with an element size, with overflow check.
+ The count must be >= 0 and the element size must be > 0.
+ This is a macro, not a function, so that it works correctly even
+ when N is of a wider type and N > SIZE_MAX. */
+#define xtimes(N, ELSIZE) \
+ ((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX)
+
+/* Check for overflow. */
+#define size_overflow_p(SIZE) \
+ ((SIZE) == SIZE_MAX)
+/* Check against overflow. */
+#define size_in_bounds_p(SIZE) \
+ ((SIZE) != SIZE_MAX)
+
+_GL_INLINE_HEADER_END
+
+#endif /* _XSIZE_H */
diff --git a/m4/ax_compare_version.m4 b/m4/ax_compare_version.m4
new file mode 100644
index 0000000..74dc0fd
--- /dev/null
+++ b/m4/ax_compare_version.m4
@@ -0,0 +1,177 @@
+# ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_compare_version.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_COMPARE_VERSION(VERSION_A, OP, VERSION_B, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
+#
+# DESCRIPTION
+#
+# This macro compares two version strings. Due to the various number of
+# minor-version numbers that can exist, and the fact that string
+# comparisons are not compatible with numeric comparisons, this is not
+# necessarily trivial to do in a autoconf script. This macro makes doing
+# these comparisons easy.
+#
+# The six basic comparisons are available, as well as checking equality
+# limited to a certain number of minor-version levels.
+#
+# The operator OP determines what type of comparison to do, and can be one
+# of:
+#
+# eq - equal (test A == B)
+# ne - not equal (test A != B)
+# le - less than or equal (test A <= B)
+# ge - greater than or equal (test A >= B)
+# lt - less than (test A < B)
+# gt - greater than (test A > B)
+#
+# Additionally, the eq and ne operator can have a number after it to limit
+# the test to that number of minor versions.
+#
+# eq0 - equal up to the length of the shorter version
+# ne0 - not equal up to the length of the shorter version
+# eqN - equal up to N sub-version levels
+# neN - not equal up to N sub-version levels
+#
+# When the condition is true, shell commands ACTION-IF-TRUE are run,
+# otherwise shell commands ACTION-IF-FALSE are run. The environment
+# variable 'ax_compare_version' is always set to either 'true' or 'false'
+# as well.
+#
+# Examples:
+#
+# AX_COMPARE_VERSION([3.15.7],[lt],[3.15.8])
+# AX_COMPARE_VERSION([3.15],[lt],[3.15.8])
+#
+# would both be true.
+#
+# AX_COMPARE_VERSION([3.15.7],[eq],[3.15.8])
+# AX_COMPARE_VERSION([3.15],[gt],[3.15.8])
+#
+# would both be false.
+#
+# AX_COMPARE_VERSION([3.15.7],[eq2],[3.15.8])
+#
+# would be true because it is only comparing two minor versions.
+#
+# AX_COMPARE_VERSION([3.15.7],[eq0],[3.15])
+#
+# would be true because it is only comparing the lesser number of minor
+# versions of the two values.
+#
+# Note: The characters that separate the version numbers do not matter. An
+# empty string is the same as version 0. OP is evaluated by autoconf, not
+# configure, so must be a string, not a variable.
+#
+# The author would like to acknowledge Guido Draheim whose advice about
+# the m4_case and m4_ifvaln functions make this macro only include the
+# portions necessary to perform the specific comparison specified by the
+# OP argument in the final configure script.
+#
+# LICENSE
+#
+# Copyright (c) 2008 Tim Toolan <toolan@ele.uri.edu>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 11
+
+dnl #########################################################################
+AC_DEFUN([AX_COMPARE_VERSION], [
+ AC_REQUIRE([AC_PROG_AWK])
+
+ # Used to indicate true or false condition
+ ax_compare_version=false
+
+ # Convert the two version strings to be compared into a format that
+ # allows a simple string comparison. The end result is that a version
+ # string of the form 1.12.5-r617 will be converted to the form
+ # 0001001200050617. In other words, each number is zero padded to four
+ # digits, and non digits are removed.
+ AS_VAR_PUSHDEF([A],[ax_compare_version_A])
+ A=`echo "$1" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \
+ -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \
+ -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \
+ -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \
+ -e 's/[[^0-9]]//g'`
+
+ AS_VAR_PUSHDEF([B],[ax_compare_version_B])
+ B=`echo "$3" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \
+ -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \
+ -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \
+ -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \
+ -e 's/[[^0-9]]//g'`
+
+ dnl # In the case of le, ge, lt, and gt, the strings are sorted as necessary
+ dnl # then the first line is used to determine if the condition is true.
+ dnl # The sed right after the echo is to remove any indented white space.
+ m4_case(m4_tolower($2),
+ [lt],[
+ ax_compare_version=`echo "x$A
+x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/false/;s/x${B}/true/;1q"`
+ ],
+ [gt],[
+ ax_compare_version=`echo "x$A
+x$B" | sed 's/^ *//' | sort | sed "s/x${A}/false/;s/x${B}/true/;1q"`
+ ],
+ [le],[
+ ax_compare_version=`echo "x$A
+x$B" | sed 's/^ *//' | sort | sed "s/x${A}/true/;s/x${B}/false/;1q"`
+ ],
+ [ge],[
+ ax_compare_version=`echo "x$A
+x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/true/;s/x${B}/false/;1q"`
+ ],[
+ dnl Split the operator from the subversion count if present.
+ m4_bmatch(m4_substr($2,2),
+ [0],[
+ # A count of zero means use the length of the shorter version.
+ # Determine the number of characters in A and B.
+ ax_compare_version_len_A=`echo "$A" | $AWK '{print(length)}'`
+ ax_compare_version_len_B=`echo "$B" | $AWK '{print(length)}'`
+
+ # Set A to no more than B's length and B to no more than A's length.
+ A=`echo "$A" | sed "s/\(.\{$ax_compare_version_len_B\}\).*/\1/"`
+ B=`echo "$B" | sed "s/\(.\{$ax_compare_version_len_A\}\).*/\1/"`
+ ],
+ [[0-9]+],[
+ # A count greater than zero means use only that many subversions
+ A=`echo "$A" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"`
+ B=`echo "$B" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"`
+ ],
+ [.+],[
+ AC_WARNING(
+ [illegal OP numeric parameter: $2])
+ ],[])
+
+ # Pad zeros at end of numbers to make same length.
+ ax_compare_version_tmp_A="$A`echo $B | sed 's/./0/g'`"
+ B="$B`echo $A | sed 's/./0/g'`"
+ A="$ax_compare_version_tmp_A"
+
+ # Check for equality or inequality as necessary.
+ m4_case(m4_tolower(m4_substr($2,0,2)),
+ [eq],[
+ test "x$A" = "x$B" && ax_compare_version=true
+ ],
+ [ne],[
+ test "x$A" != "x$B" && ax_compare_version=true
+ ],[
+ AC_WARNING([illegal OP parameter: $2])
+ ])
+ ])
+
+ AS_VAR_POPDEF([A])dnl
+ AS_VAR_POPDEF([B])dnl
+
+ dnl # Execute ACTION-IF-TRUE / ACTION-IF-FALSE.
+ if test "$ax_compare_version" = "true" ; then
+ m4_ifvaln([$4],[$4],[:])dnl
+ m4_ifvaln([$5],[else $5])dnl
+ fi
+]) dnl AX_COMPARE_VERSION
diff --git a/m4/ax_prog_perl_version.m4 b/m4/ax_prog_perl_version.m4
new file mode 100644
index 0000000..d794c1a
--- /dev/null
+++ b/m4/ax_prog_perl_version.m4
@@ -0,0 +1,70 @@
+# ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_prog_perl_version.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_PROG_PERL_VERSION([VERSION],[ACTION-IF-TRUE],[ACTION-IF-FALSE])
+#
+# DESCRIPTION
+#
+# Makes sure that perl supports the version indicated. If true the shell
+# commands in ACTION-IF-TRUE are executed. If not the shell commands in
+# ACTION-IF-FALSE are run. Note if $PERL is not set (for example by
+# running AC_CHECK_PROG or AC_PATH_PROG) the macro will fail.
+#
+# Example:
+#
+# AC_PATH_PROG([PERL],[perl])
+# AX_PROG_PERL_VERSION([5.8.0],[ ... ],[ ... ])
+#
+# This will check to make sure that the perl you have supports at least
+# version 5.8.0.
+#
+# NOTE: This macro uses the $PERL variable to perform the check.
+# AX_WITH_PERL can be used to set that variable prior to running this
+# macro. The $PERL_VERSION variable will be valorized with the detected
+# version.
+#
+# LICENSE
+#
+# Copyright (c) 2009 Francesco Salvestrini <salvestrini@users.sourceforge.net>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 12
+
+AC_DEFUN([AX_PROG_PERL_VERSION],[
+ AC_REQUIRE([AC_PROG_SED])
+ AC_REQUIRE([AC_PROG_GREP])
+
+ AS_IF([test -n "$PERL"],[
+ ax_perl_version="$1"
+
+ AC_MSG_CHECKING([for perl version])
+ changequote(<<,>>)
+ perl_version=`$PERL --version 2>&1 \
+ | $SED -n -e '/This is perl/b inspect
+b
+: inspect
+s/.* (\{0,1\}v\([0-9]*\.[0-9]*\.[0-9]*\))\{0,1\} .*/\1/;p'`
+ changequote([,])
+ AC_MSG_RESULT($perl_version)
+
+ AC_SUBST([PERL_VERSION],[$perl_version])
+
+ AX_COMPARE_VERSION([$ax_perl_version],[le],[$perl_version],[
+ :
+ $2
+ ],[
+ :
+ $3
+ ])
+ ],[
+ AC_MSG_WARN([could not find the perl interpreter])
+ $3
+ ])
+])
diff --git a/m4/codeset.m4 b/m4/codeset.m4
new file mode 100644
index 0000000..4f09722
--- /dev/null
+++ b/m4/codeset.m4
@@ -0,0 +1,23 @@
+# codeset.m4 serial 5 (gettext-0.18.2)
+dnl Copyright (C) 2000-2018 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_LANGINFO_CODESET],
+[
+ AC_CACHE_CHECK([for nl_langinfo and CODESET], [am_cv_langinfo_codeset],
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <langinfo.h>]],
+ [[char* cs = nl_langinfo(CODESET); return !cs;]])],
+ [am_cv_langinfo_codeset=yes],
+ [am_cv_langinfo_codeset=no])
+ ])
+ if test $am_cv_langinfo_codeset = yes; then
+ AC_DEFINE([HAVE_LANGINFO_CODESET], [1],
+ [Define if you have <langinfo.h> and nl_langinfo(CODESET).])
+ fi
+])
diff --git a/m4/fcntl-o.m4 b/m4/fcntl-o.m4
new file mode 100644
index 0000000..b0605e4
--- /dev/null
+++ b/m4/fcntl-o.m4
@@ -0,0 +1,134 @@
+# fcntl-o.m4 serial 4
+dnl Copyright (C) 2006-2018 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Paul Eggert.
+
+# Test whether the flags O_NOATIME and O_NOFOLLOW actually work.
+# Define HAVE_WORKING_O_NOATIME to 1 if O_NOATIME works, or to 0 otherwise.
+# Define HAVE_WORKING_O_NOFOLLOW to 1 if O_NOFOLLOW works, or to 0 otherwise.
+AC_DEFUN([gl_FCNTL_O_FLAGS],
+[
+ dnl Persuade glibc <fcntl.h> to define O_NOATIME and O_NOFOLLOW.
+ dnl AC_USE_SYSTEM_EXTENSIONS was introduced in autoconf 2.60 and obsoletes
+ dnl AC_GNU_SOURCE.
+ m4_ifdef([AC_USE_SYSTEM_EXTENSIONS],
+ [AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])],
+ [AC_REQUIRE([AC_GNU_SOURCE])])
+
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+ AC_CHECK_FUNCS_ONCE([symlink])
+ AC_CACHE_CHECK([for working fcntl.h], [gl_cv_header_working_fcntl_h],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/types.h>
+ #include <sys/stat.h>
+ #if HAVE_UNISTD_H
+ # include <unistd.h>
+ #else /* on Windows with MSVC */
+ # include <io.h>
+ # include <stdlib.h>
+ # defined sleep(n) _sleep ((n) * 1000)
+ #endif
+ #include <fcntl.h>
+ #ifndef O_NOATIME
+ #define O_NOATIME 0
+ #endif
+ #ifndef O_NOFOLLOW
+ #define O_NOFOLLOW 0
+ #endif
+ static int const constants[] =
+ {
+ O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND,
+ O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY
+ };
+ ]],
+ [[
+ int result = !constants;
+ #if HAVE_SYMLINK
+ {
+ static char const sym[] = "conftest.sym";
+ if (symlink ("/dev/null", sym) != 0)
+ result |= 2;
+ else
+ {
+ int fd = open (sym, O_WRONLY | O_NOFOLLOW | O_CREAT, 0);
+ if (fd >= 0)
+ {
+ close (fd);
+ result |= 4;
+ }
+ }
+ if (unlink (sym) != 0 || symlink (".", sym) != 0)
+ result |= 2;
+ else
+ {
+ int fd = open (sym, O_RDONLY | O_NOFOLLOW);
+ if (fd >= 0)
+ {
+ close (fd);
+ result |= 4;
+ }
+ }
+ unlink (sym);
+ }
+ #endif
+ {
+ static char const file[] = "confdefs.h";
+ int fd = open (file, O_RDONLY | O_NOATIME);
+ if (fd < 0)
+ result |= 8;
+ else
+ {
+ struct stat st0;
+ if (fstat (fd, &st0) != 0)
+ result |= 16;
+ else
+ {
+ char c;
+ sleep (1);
+ if (read (fd, &c, 1) != 1)
+ result |= 24;
+ else
+ {
+ if (close (fd) != 0)
+ result |= 32;
+ else
+ {
+ struct stat st1;
+ if (stat (file, &st1) != 0)
+ result |= 40;
+ else
+ if (st0.st_atime != st1.st_atime)
+ result |= 64;
+ }
+ }
+ }
+ }
+ }
+ return result;]])],
+ [gl_cv_header_working_fcntl_h=yes],
+ [case $? in #(
+ 4) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #(
+ 64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #(
+ 68) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #(
+ *) gl_cv_header_working_fcntl_h='no';;
+ esac],
+ [gl_cv_header_working_fcntl_h=cross-compiling])])
+
+ case $gl_cv_header_working_fcntl_h in #(
+ *O_NOATIME* | no | cross-compiling) ac_val=0;; #(
+ *) ac_val=1;;
+ esac
+ AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOATIME], [$ac_val],
+ [Define to 1 if O_NOATIME works.])
+
+ case $gl_cv_header_working_fcntl_h in #(
+ *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #(
+ *) ac_val=1;;
+ esac
+ AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOFOLLOW], [$ac_val],
+ [Define to 1 if O_NOFOLLOW works.])
+])
diff --git a/m4/glibc21.m4 b/m4/glibc21.m4
new file mode 100644
index 0000000..818b49f
--- /dev/null
+++ b/m4/glibc21.m4
@@ -0,0 +1,33 @@
+# glibc21.m4 serial 5
+dnl Copyright (C) 2000-2018 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Test for the GNU C Library, version 2.1 or newer, or uClibc.
+# From Bruno Haible.
+
+AC_DEFUN([gl_GLIBC21],
+ [
+ AC_CACHE_CHECK([whether we are using the GNU C Library >= 2.1 or uClibc],
+ [ac_cv_gnu_library_2_1],
+ [AC_EGREP_CPP([Lucky],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+ Lucky GNU user
+ #endif
+#endif
+#ifdef __UCLIBC__
+ Lucky user
+#endif
+ ],
+ [ac_cv_gnu_library_2_1=yes],
+ [ac_cv_gnu_library_2_1=no])
+ ]
+ )
+ AC_SUBST([GLIBC21])
+ GLIBC21="$ac_cv_gnu_library_2_1"
+ ]
+)
diff --git a/m4/groff.m4 b/m4/groff.m4
new file mode 100644
index 0000000..19bf7f9
--- /dev/null
+++ b/m4/groff.m4
@@ -0,0 +1,1886 @@
+# Autoconf macros for groff.
+# Copyright (C) 1989-2023 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Locate a print spooler for certain output formats.
+
+AC_DEFUN([GROFF_PRINT], [
+ groff_have_spooler=no
+ 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
+
+ if test -n "$PSPRINT"
+ then
+ groff_have_spooler="$PSPRINT"
+ AC_SUBST([PSPRINT])
+ # Figure out DVIPRINT from PSPRINT.
+ AC_MSG_CHECKING([option to use when spooling DVI files])
+ spooler_option=none
+ if test -n "$PSPRINT" && test -z "$DVIPRINT"
+ then
+ if test "$PSPRINT" = lpr
+ then
+ spooler_option=-d
+ DVIPRINT="$PSPRINT $spooler_option"
+ else
+ DVIPRINT="$PSPRINT"
+ fi
+ fi
+ AC_SUBST([DVIPRINT])
+ AC_MSG_RESULT([$spooler_option])
+ fi
+])
+
+# Bison-generated parsers have problems with C++ compilers other than
+# g++. Thus, byacc is preferred over bison. If no yacc program is
+# available, we issue an error only if not building from a distribution
+# archive, because files generated by a yacc are already present there.
+
+AC_DEFUN([GROFF_PROG_YACC], [
+ AC_CHECK_PROGS([YACC], [byacc 'bison -y' yacc], [missing])
+ if ! test -f "$srcdir"/.tarball-version
+ then
+ if test "$YACC" = missing
+ then
+ AC_MSG_ERROR([could not find 'byacc', 'bison', or 'yacc'], 1)
+ fi
+ fi
+])
+
+# We need Perl 5.6.1 or newer.
+
+AC_DEFUN([GROFF_PERL], [
+ PERLVERSION=v5.6.1
+ AC_PATH_PROG([PERL], [perl], [no])
+ if test "$PERL" = no
+ then
+ AC_MSG_ERROR([perl binary not found], 1)
+ fi
+ AX_PROG_PERL_VERSION([$PERLVERSION], true,
+ AC_MSG_ERROR([perl version is too old], 1))
+])
+
+# We need m4 to generate some man pages.
+
+AC_DEFUN([GROFF_PROG_M4], [
+ AC_CHECK_PROGS([M4], [m4], [missing])
+ if test "$M4" = missing
+ then
+ AC_MSG_ERROR([could not find 'm4'], 1)
+ fi
+])
+
+# We need makeinfo from Texinfo 5.0 or newer, for @codequoteundirected.
+# The minor version checking logic is present for future needs.
+
+AC_DEFUN([GROFF_PROG_MAKEINFO], [
+ # By default automake will set MAKEINFO to MAKEINFO = ${SHELL} <top
+ # src dir>/build-aux/missing makeinfo. As we need a more precise
+ # check of makeinfo version, we don't use it.
+ MAKEINFO=
+ missing=
+ AC_CHECK_PROG([MAKEINFO], [makeinfo], [makeinfo])
+ if test -z "$MAKEINFO"
+ then
+ missing="missing 'makeinfo'"
+ else
+ AC_MSG_CHECKING([for makeinfo version])
+ # We need an additional level of quoting to make sed's regexps
+ # work.
+ [makeinfo_version=`$MAKEINFO --version 2>&1 \
+ | sed -e 's/^.* \([^ ][^ ]*\)$/\1/' -e '1q'`]
+ AC_MSG_RESULT([$makeinfo_version])
+ # Consider only the first two numbers in version number string.
+ makeinfo_version_major=`IFS=.; set x $makeinfo_version; echo ${2}`
+ makeinfo_version_minor=`IFS=.; set x $makeinfo_version; echo ${3}`
+ makeinfo_version_numeric=`
+ expr ${makeinfo_version_major}000 + $makeinfo_version_minor`
+ if test $makeinfo_version_numeric -lt 5000
+ then
+ missing="'makeinfo' is too old."
+ MAKEINFO=
+ fi
+ fi
+
+ if test -n "$missing"
+ then
+ infofile=doc/groff.info
+ test -f $infofile || infofile="$srcdir"/$infofile
+ if test ! -f $infofile \
+ || test "$srcdir"/doc/groff.texi -nt $infofile
+ then
+ AC_MSG_ERROR($missing
+[Get the 'texinfo' package version 5.0 or newer.])
+ fi
+ fi
+ AC_SUBST([MAKEINFO])
+])
+
+# 'makeinfo' and 'texi2dvi' are distributed together, so if the former
+# is too old, the latter is too.
+
+AC_DEFUN([GROFF_PROG_TEXI2DVI], [
+ AC_REQUIRE([GROFF_PROG_MAKEINFO])
+ AC_CHECK_PROG([PROG_TEXI2DVI], [texi2dvi], [texi2dvi], [missing])
+ groff_have_texi2dvi=no
+ if test "$PROG_TEXI2DVI" != missing && test -n "$MAKEINFO"
+ then
+ groff_have_texi2dvi=yes
+ fi
+])
+
+# 'texi2dvi' can be installed without TeX itself, so check for a 'tex'
+# executable independently.
+
+AC_DEFUN([GROFF_USE_TEX_CHECK], [
+ AC_REQUIRE([GROFF_PROG_TEXI2DVI])
+ AC_CHECK_PROG([PROG_TEX], [tex], [found], [missing])
+ groff_use_tex=no
+ test "$PROG_TEX" = found && groff_use_tex=yes
+])
+
+# grohtml needs the following programs to produce images from tbl(1)
+# tables and eqn(1) equations.
+
+dnl Any macro that tests $make_htmldoc should AC_REQUIRE this.
+
+AC_DEFUN([GROFF_CHECK_GROHTML_PROGRAMS], [
+ AC_REQUIRE([GROFF_GHOSTSCRIPT_PATH])
+
+ make_htmldoc=no
+ missing=
+ m4_foreach([groff_prog],
+dnl Keep this list of programs in sync with grohtml test scripts.
+ [[pnmcrop], [pnmcut], [pnmtopng], [pnmtops], [psselect]], [
+ AC_CHECK_PROG(groff_prog, groff_prog, [found], [missing])
+ if test $[]groff_prog = missing
+ then
+ missing="$missing 'groff_prog'"
+ fi
+ ])
+
+ test "$GHOSTSCRIPT" = "missing" && missing="'gs' $missing"
+
+ if test -z "$missing"
+ then
+ make_htmldoc=yes
+ else
+ plural=`set $missing; test $[#] -gt 1 && echo s`
+ oxford=`set $missing; test $[#] -gt 2 && echo ,`
+ missing=`set $missing
+ missing=
+ while test $[#] -gt 0
+ do
+ case $[#] in
+ 1) missing="$missing$[1]" ;;
+ 2) missing="$missing$[1]$oxford and " ;;
+ *) missing="$missing$[1], " ;;
+ esac
+ shift
+ done
+ echo $missing`
+ verb=`set $missing
+ if test $[#] -gt 1
+ then
+ echo were
+ else
+ echo was
+ fi`
+
+ grohtml_notice="The program$plural $missing $verb not found in \
+\$PATH.
+
+ Consequently, groff's HTML output driver, 'grohtml', will not work
+ properly. It will not be possible to prepare or install
+ groff-generated documentation in HTML format.
+"
+ fi
+ AC_SUBST([make_htmldoc])
+])
+
+
+AC_DEFUN([GROFF_GROHTML_PROGRAM_NOTICE], [
+ AC_REQUIRE([GROFF_CHECK_GROHTML_PROGRAMS])
+
+ if test "$make_htmldoc" = no
+ then
+ AC_MSG_NOTICE([$grohtml_notice])
+ fi
+])
+
+dnl pdfroff uses awk, and we use it in GROFF_URW_FONTS_CHECK.
+
+AC_DEFUN([GROFF_AWK_NOTICE], [
+ AC_REQUIRE([GROFF_AWK_PATH])
+
+ awk_names=awk
+ if test -n "$ALT_AWK_PROGS"
+ then
+ awk_names="$ALT_AWK_PROGS"
+ fi
+
+ if test "$AWK" = missing
+ then
+ AC_MSG_NOTICE([No awk program was found in \$PATH.
+
+ It was sought under the name(s) "$awk_names".
+ ])
+ fi
+])
+
+AC_DEFUN([GROFF_PDFROFF_DEPENDENCIES_CHECK], [
+ AC_REQUIRE([GROFF_AWK_PATH])
+ AC_REQUIRE([GROFF_GHOSTSCRIPT_PATH])
+
+ use_pdfroff=no
+ pdfroff_missing_deps=
+
+ test "$AWK" = missing && pdfroff_missing_deps="awk"
+
+ if test "$GHOSTSCRIPT" = missing
+ then
+ verb=is
+
+ if test -n "$pdfroff_missing_deps"
+ then
+ pdfroff_missing_deps="$pdfroff_missing_deps and "
+ verb=are
+ fi
+ pdfroff_missing_deps="${pdfroff_missing_deps}Ghostscript $verb"
+ fi
+
+ if test -z "$pdfroff_missing_deps"
+ then
+ use_pdfroff=yes
+ fi
+
+ AC_SUBST([use_pdfroff])
+])
+
+AC_DEFUN([GROFF_GROPDF_DEPENDENCIES_CHECK], [
+ AC_REQUIRE([GROFF_GHOSTSCRIPT_PATH])
+ AC_REQUIRE([GROFF_URW_FONTS_CHECK])
+
+ use_gropdf=no
+ gropdf_missing_deps=
+
+ if test "$GHOSTSCRIPT" != missing \
+ || test "$groff_have_urw_fonts" = yes
+ then
+ use_gropdf=yes
+ fi
+
+ AC_SUBST([use_gropdf])
+])
+
+AC_DEFUN([GROFF_PDFROFF_PROGRAM_NOTICE], [
+ AC_REQUIRE([GROFF_PDFROFF_DEPENDENCIES_CHECK])
+
+ if test "$use_pdfroff" = no
+ then
+ AC_MSG_NOTICE(['pdfroff' will not be functional.
+
+ Because $pdfroff_missing_deps missing, 'pdfroff' will not operate
+ and the 'pdfmark.pdf' document will not be available.
+])
+ fi
+])
+
+AC_DEFUN([GROFF_GROPDF_PROGRAM_NOTICE], [
+ AC_REQUIRE([GROFF_GROPDF_DEPENDENCIES_CHECK])
+
+ if test "$use_gropdf" = no
+ then
+ AC_MSG_NOTICE(['gropdf' will have reduced function.
+
+ Neither Ghostscript nor URW fonts are available; groff documentation
+ thus will not be available in PDF.
+
+ 'gropdf' will be able to handle only documents using the standard PDF
+ base 14 fonts, plus the 'EURO' font groff supplies, and font embedding
+ with its '-e' option (accessed via the 'groff' command with the option
+ '-P -e') will not be possible.
+])
+ fi
+])
+
+# Make URW font directory configurable.
+
+AC_DEFUN([GROFF_URW_FONTS_PATH], [
+ AC_ARG_WITH([urw-fonts-dir],
+ [AS_HELP_STRING([--with-urw-fonts-dir=DIR],
+ [search for URW PostScript Type 1 fonts in DIR])],
+ [urwfontsdir="$withval"])
+])
+
+# Check for availability of URW fonts in the directory specified by the
+# user (see GROFF_URW_FONTS_PATH above). We do NOT search the path of
+# directories built into Ghostscript because those fonts lack the
+# corresponding AFM files we need to generate groff font description
+# files; see afmtodit(1). Ghostscript's own fonts are treated as the
+# "default foundry" and we already provide descriptions of them in
+# font/devpdf (along with groff's EURO font).
+
+AC_DEFUN([GROFF_URW_FONTS_CHECK], [
+ AC_REQUIRE([GROFF_URW_FONTS_PATH])
+ AC_REQUIRE([GROFF_GHOSTSCRIPT_PATH])
+ groff_have_urw_fonts=no
+ AC_MSG_CHECKING([for URW fonts in Type 1/PFB format])
+
+dnl Keep this list in sync with font/devpdf/Foundry.in.
+ _list_paths="\
+ /usr/share/fonts/type1/gsfonts/ \
+ /usr/share/fonts/default/Type1/ \
+ /usr/share/fonts/default/Type1/adobestd35/ \
+ /usr/share/fonts/type1/urw-base35/ \
+ /opt/local/share/fonts/urw-fonts/ \
+ /usr/local/share/fonts/ghostscript/"
+
+ if test -n "$urwfontsdir"
+ then
+ _list_paths="$urwfontsdir"
+ fi
+
+dnl Keep this list of font file names in sync with the corresponding
+dnl entry in font/devpdf/util/BuildFoundries.pl.
+ for k in $_list_paths
+ do
+ for _font_file in \
+ URWGothic-Book \
+ URWGothic-Book.t1 \
+ URWGothic-Book.pfb \
+ URWGothicL-Book.pfb \
+ a010013l.pfb
+ do
+ if test -f $k/$_font_file
+ then
+ AC_MSG_RESULT([found in $k])
+ groff_have_urw_fonts=yes
+ urwfontsdir=$k
+ break 2
+ fi
+ done
+ done
+
+ if test $groff_have_urw_fonts = no
+ then
+ AC_MSG_RESULT([none found])
+ urwfontsdir=
+ fi
+
+ AC_SUBST([groff_have_urw_fonts])
+ AC_SUBST(urwfontsdir)
+])
+
+AC_DEFUN([GROFF_URW_FONTS_NOTICE], [
+ if test "$groff_have_urw_fonts" = no
+ then
+ gs_verbiage=
+ if test "$GHOSTSCRIPT" != missing
+ then
+ gs_verbiage=' as well as the search path shown by the
+ "'"$GHOSTSCRIPT"' -h" command (if available)'
+ fi
+ AC_MSG_NOTICE([URW fonts in Type 1/PFB format were not found.
+
+ groff font description files for the URW fonts, used by the 'gropdf'
+ output driver, will not be available. Use and embedding of fonts from
+ the 'U' foundry in PDF documents generated by groff will not be
+ possible.
+
+ You can obtain the URW base 35 fonts from their GitHub project. As of
+ this writing (2023-02-15), you can find them in the 'fonts' directory
+ of the following archives (choose one).
+
+ https://github.com/ArtifexSoftware/urw-base35-fonts/archive/refs/
+ tags/20200910.zip
+ https://github.com/ArtifexSoftware/urw-base35-fonts/archive/refs/
+ tags/20200910.tar.gz
+
+ You may wish to check for a newer release.
+
+ https://github.com/ArtifexSoftware/urw-base35-fonts/releases
+
+ 'gropdf' looks for these fonts in several directories specified in
+ font/devpdf/Foundry.in$gs_verbiage.
+
+ You will need to "make distclean" and re-run the 'configure' script
+ after installing the URW fonts.
+
+ Alternatively, you can pass the option '--with-urw-fonts-dir=DIR'
+ to 'configure' to look for them in the directory DIR you specify.
+ If found, the 'U' foundry will be available via the '-y' option to
+ 'gropdf' (accessed via the 'groff' command with the option '-P -y').
+ ])
+ fi
+])
+
+
+# Check whether the pnm tools accept the -quiet option.
+
+dnl Any macro that tests $pnmtools_quiet should AC_REQUIRE this.
+
+AC_DEFUN([GROFF_PNMTOOLS_CAN_BE_QUIET], [
+ AC_REQUIRE([GROFF_CHECK_GROHTML_PROGRAMS])
+
+ pnmtools_quiet=
+
+ if test "$make_htmldoc" = yes
+ then
+ AC_MSG_CHECKING([whether PNM tools accept the '-quiet' option])
+ if echo P2 2 2 255 0 1 2 0 | pnmtops -quiet > /dev/null 2>&1
+ then
+ AC_MSG_RESULT([yes])
+ pnmtools_quiet=-quiet
+ else
+ AC_MSG_RESULT([no])
+ fi
+ fi
+ AC_SUBST([pnmtools_quiet])
+])
+
+
+# Check whether pnmtops can handle the -nosetpage option.
+#
+# We require this both for grohtml operation and generation of
+# doc/gnu.eps from repository builds.
+
+AC_DEFUN([GROFF_PNMTOPS_NOSETPAGE], [
+ AC_REQUIRE([GROFF_PNMTOOLS_CAN_BE_QUIET])
+
+ pnmtops_nosetpage="pnmtops $pnmtools_quiet"
+ AC_MSG_CHECKING([whether pnmtops accepts 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 $pnmtools_quiet -nosetpage"
+ else
+ AC_MSG_RESULT([no])
+ fi
+ AC_SUBST([pnmtops_nosetpage])
+])
+
+
+# Check location of 'gs'; allow '--with-gs=PROG' option to override.
+
+dnl Any macro that tests $GHOSTSCRIPT should AC_REQUIRE this.
+
+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])])
+
+AC_DEFUN([GROFF_GHOSTSCRIPT_AVAILABILITY_NOTICE], [
+ AC_REQUIRE([GROFF_GHOSTSCRIPT_PATH])
+
+ gs_names=gs
+ if test -n "$ALT_GHOSTSCRIPT_PROGS"
+ then
+ gs_names="$ALT_GHOSTSCRIPT_PROGS"
+ fi
+
+ if test "$GHOSTSCRIPT" = missing
+ then
+ AC_MSG_NOTICE([No Ghostscript program was found in \$PATH.
+
+ It was sought under the name(s) "$gs_names".
+
+ groff documentation will not be available in HTML.
+
+ 'grohtml' will have reduced function, being unable to produce
+ documents using the 'tbl' preprocessor.
+ ])
+ fi
+])
+
+# Ghostscript version check. Versions 9.00 <= x < 9.54 suffer from a
+# rendering glitch that affects the AT&T troff (and groff) special
+# character \(lh; see
+# <https://bugs.ghostscript.com/show_bug.cgi?id=703187>.
+
+AC_DEFUN([GROFF_GHOSTSCRIPT_VERSION_CHECK], [
+ AC_REQUIRE([GROFF_GHOSTSCRIPT_PATH])
+
+ if test "$GHOSTSCRIPT" != missing
+ then
+ AC_MSG_CHECKING([for gs version with good left sidebearing handling])
+ ghostscript_notice=
+ ghostscript_version_good=
+ ghostscript_v_string=`"$GHOSTSCRIPT" -v | sed 1q`
+ # Get first word.
+ ghostscript_words=`echo "$ghostscript_v_string" | cut -d\ -f1-`
+
+ # If the first word is "GPL", discard it.
+ if expr "$ghostscript_words" : "GPL" > /dev/null
+ then
+ ghostscript_words=`echo "$ghostscript_words" | cut -d\ -f2-`
+ fi
+
+ # Only do a version check if the program calls itself Ghostscript.
+ if expr "$ghostscript_words" : "Ghostscript" > /dev/null
+ then
+ ghostscript_version_good=no
+ ghostscript_version=`echo "$ghostscript_words" | cut -d\ -f2`
+ ghostscript_major=`echo "$ghostscript_version" | cut -d. -f1`
+ ghostscript_minor=`echo "$ghostscript_version" | cut -d. -f2`
+
+ if test "$ghostscript_major" -lt 9
+ then
+ ghostscript_version_good=yes
+ elif test "$ghostscript_major" -ge 10
+ then
+ ghostscript_version_good=yes
+ elif test "$ghostscript_minor" -ge 54
+ then
+ ghostscript_version_good=yes
+ fi
+ fi
+
+ if test "$ghostscript_version_good" = yes
+ then
+ ghostscript_version="$ghostscript_version (good)"
+ elif test "$ghostscript_version_good" = no
+ then
+ ghostscript_version="$ghostscript_version (buggy)"
+ ghostscript_notice="Buggy version of Ghostscript detected."
+ else
+ ghostscript_notice="Unable to determine version of Ghostscript."
+ fi
+
+ if test -n "$ghostscript_version"
+ then
+ AC_MSG_RESULT([got $ghostscript_version])
+ else
+ AC_MSG_RESULT([unable to determine])
+ fi
+ fi
+])
+
+AC_DEFUN([GROFF_GHOSTSCRIPT_VERSION_NOTICE], [
+ if test -n "$ghostscript_notice"
+ then
+ AC_MSG_NOTICE([$ghostscript_notice
+
+ Ghostscript versions 9.00 <= x < 9.54 suffer from a rendering glitch
+ that affects the AT&T troff (and groff) special character '\(lh'; see
+ <https://bugs.ghostscript.com/show_bug.cgi?id=703187>. If your
+ version of Ghostscript has not been patched to fix this problem, you
+ may need to work around it in groff documents you render for the
+ PostScript (and, for tbl(1) tables, HTML) output devices.
+ ])
+ fi
+])
+
+# 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 <<EOF >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 <stdio.h>
+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 <stdlib.h>
+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 <sys/types.h>
+#include <signal.h>
+#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 <errno.h>, <stdio.h>, or <stdlib.h>])
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([[
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+ ]],
+ [[
+
+int k;
+k = sys_nerr;
+
+ ]])
+ ],
+ [AC_MSG_RESULT([yes])
+ AC_DEFINE([HAVE_SYS_NERR], [1],
+ [Define if you have sys_nerr in <errno.h>, <stdio.h>, or <stdio.h>.])],
+ [AC_MSG_RESULT([no])])
+ AC_LANG_POP([C++])])
+
+AC_DEFUN([GROFF_SYS_ERRLIST],
+ [AC_MSG_CHECKING([for sys_errlist[] in <errno.h>, <stdio.h>, or <stdlib.h>])
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([[
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+ ]],
+ [[
+
+int k;
+k = (int)sys_errlist[0];
+
+ ]])
+ ],
+ [AC_MSG_RESULT([yes])
+ AC_DEFINE([HAVE_SYS_ERRLIST], [1],
+ [Define if you have sys_errlist in <errno.h>, <stdio.h>, or <stdlib.h>.])],
+ [AC_MSG_RESULT([no])])])
+
+AC_DEFUN([GROFF_OSFCN_H],
+ [AC_LANG_PUSH([C++])
+ AC_MSG_CHECKING([C++ <osfcn.h>])
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([[
+
+#include <osfcn.h>
+
+ ]],
+ [[
+
+read(0, 0, 0);
+open(0, 0);
+
+ ]])
+ ],
+ [AC_MSG_RESULT([yes])
+ AC_DEFINE([HAVE_CC_OSFCN_H], [1],
+ [Define if you have a C++ <osfcn.h>.])],
+ [AC_MSG_RESULT([no])])
+ AC_LANG_POP([C++])])
+
+
+AC_DEFUN([GROFF_LIMITS_H],
+ [AC_LANG_PUSH([C++])
+ AC_MSG_CHECKING([C++ <limits.h>])
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([[
+
+#include <limits.h>
+
+ ]],
+ [[
+
+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++ <limits.h>.])],
+ [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.h>
+
+ ]],
+ [[
+
+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 <math.h>
+
+ ]],
+ [[
+
+struct exception e;
+
+ ]])
+ ],
+ [AC_MSG_RESULT([yes])
+ AC_DEFINE([HAVE_STRUCT_EXCEPTION], [1],
+ [Define if <math.h> defines struct exception.])],
+ [AC_MSG_RESULT([no])])])
+
+AC_DEFUN([GROFF_ARRAY_DELETE],
+ [AC_LANG_PUSH([C++])
+ AC_MSG_CHECKING([whether ISO C++98 array deletion 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_MSG_ERROR([an ISO C++98-conformant compiler is required])])
+ AC_LANG_POP([C++])])
+
+AC_DEFUN([GROFF_TRADITIONAL_CPP],
+ [AC_LANG_PUSH([C++])
+ AC_MSG_CHECKING([whether C preprocessor uses pre-ISO C90 syntax])
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([[
+
+#define name2(a, b) a/**/b
+
+ ]],
+ [[
+
+int name2(foo, bar);
+
+ ]])
+ ],
+ [AC_MSG_RESULT([yes])
+ AC_MSG_ERROR([an ISO C90-conformant C preprocessor is required])],
+ [AC_MSG_RESULT([no])])
+ AC_LANG_POP([C++])])
+
+AC_DEFUN([GROFF_WCOREFLAG],
+ [AC_MSG_CHECKING([w_coredump])
+ AC_RUN_IFELSE([
+ AC_LANG_PROGRAM([[
+
+#include <sys/types.h>
+#include <sys/wait.h>
+
+ ]],
+ [[
+
+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 format])
+ groff_prefix=$prefix
+ test "$prefix" = NONE && groff_prefix=$ac_default_prefix
+ if test -z "$PAGE" && test -r /etc/papersize
+ then
+ sedexpr='s/#.*//;s/[ \t]\+/ /;s/ \+$//;s/^ \+//;/^$/d;p'
+ PAGE=`sed -n "$sedexpr" /etc/papersize`
+ fi
+ 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 -q ['^paperlength[ ]\+841890'] "$descfile"
+ then
+ PAGE=A4
+ elif grep -q ['^papersize[ ]\+[aA]4'] "$descfile"
+ then
+ PAGE=A4
+ fi
+ fi
+ fi
+
+ if test -z "$PAGE"
+ then
+ domains=
+ if test -r /etc/resolv.conf
+ then
+ sedexpr='s/#.*//;s/[ \t]\+/ /;s/ \+$//;s/^ \+//;/^$/d;
+/^\(domain\|search\)/!d;s/\(domain\|search\) //;p'
+ domains=`sed -n "$sedexpr" /etc/resolv.conf`
+ fi
+ if test -z "$domains"
+ then
+ domains=`(domainname) 2>/dev/null | tr -d '+'`
+ if test -z "$domains" || test "$domains" = '(none)'
+ then
+ domains=`(hostname) 2>/dev/null | grep '\.'`
+ fi
+ fi
+ # resolv.conf's "search" directive might return multiple domains.
+ # If any top-level domain is two letters and it's not 'us' or 'ca',
+ # assume the system uses A4 paper.
+ for d in $domains
+ do
+ case "$d" in
+ [*.[Uu][Ss]|*.[Cc][Aa])]
+ ;;
+ [*.[A-Za-z][A-Za-z])]
+ PAGE=A4 ;;
+ esac
+ done
+ fi
+
+ test -n "$PAGE" || PAGE=letter
+ 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 <stdio.h>
+
+ ]],
+ [[
+
+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
+ sys_tmac_prefix_result=none
+ test -z "$sys_tmac_prefix" \
+ || sys_tmac_prefix_result="$sys_tmac_prefix"
+ AC_MSG_RESULT([$sys_tmac_prefix_result])
+ AC_SUBST([sys_tmac_prefix])
+
+ AC_MSG_CHECKING([which system macro packages should be made available])
+ tmac_wrap=
+ if test "$sys_tmac_file_prefix" = tmac.; 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
+ tmac_wrap_result="none found"
+ test -z "$tmac_wrap" || tmac_wrap_result="$tmac_wrap"
+ AC_MSG_RESULT([$tmac_wrap_result])
+ AC_SUBST([tmac_wrap])])
+
+
+# Searching if a non-GNU Troff is installed. The built-in register
+# \n[.g] is always 1 in GNU Troff.
+AC_DEFUN([GROFF_G], [
+ g=
+ AC_MSG_CHECKING([for existing troff installation])
+ if test "`(echo .tm '|n(.g' | tr '|' '\\\\' | troff -z -i 2>&1) \
+ 2>/dev/null`" = 0
+ then
+ AC_MSG_RESULT([yes])
+ g=g
+ else
+ AC_MSG_RESULT([no])
+ fi
+ AC_SUBST([g])
+])
+
+
+# Controllable groff compatibility wrappers for vendor-provided macro sets
+#
+# Background
+#
+# groff's configure script checks for a non-GNU system troff implementation
+# in GROFF_G above, and uses this to rename programs that would conflict
+# with the system *roff implementation. On such systems, groff's version of
+# troff is installed as gtroff, groff's version of nroff is installed as
+# gnroff, and so forth. See the ENVIRONMENT section of groff(1)'s manual
+# page for the entry on GROFF_COMMAND_PREFIX, and the SEE ALSO section for
+# details. The implementation of this can be found in "We use Automake's
+# Uniform Naming Scheme" in Makefile.am, and its use of NAMEPREFIX.
+#
+# groff's configure script also checks for vendor-provided macro sets in
+# GROFF_TMAC above, which sets 'sys_tmac_prefix' to the location of any
+# vendor-provided macro sets. The script then determines if any of these
+# vendor-provided macro sets are non-GNU implementations. A space-separated
+# list of macro sets requiring compatibility wrappers is stored in
+# 'tmac_wrap'.
+#
+# If 'tmac_wrap' is a non-empty list, the make infrastructure will build
+# groff compatibility wrappers in the 'tmac' directory for each mentioned
+# macro set. These wrappers enable compatibility mode (.cp 1) and include
+# (.so <filepath>) the vendor implementation of that macro set. The 'an'
+# wrapper gets special treatment, by including the 'andoc.tmac' macro set,
+# before loading the vendor implementation.
+#
+# In groff version 1.22.3 and prior, if 'tmac_wrap' is a non-empty list at
+# installation time (make install), the groff compatibility wrappers are
+# installed in '<prefix>/lib/groff/site-tmac' directory (technically
+# 'systemtmacdir' in Makefile.am) as the base macro set name (example:
+# an.tmac), and the groff implementation of these macro sets are installed
+# with a 'g' prefix in the '<prefix>/share/groff/<version>/tmac' directory
+# (example: gan.tmac).
+#
+# If your system has these compatibility wrappers installed, then the
+# command 'groff -man ...' (as an example) uses your vendor's 'an' macro
+# set in compatibility mode, while the command 'groff -mgan ...' uses the
+# groff implementation of the 'an' macro set.
+#
+# With groff being the principal (but not the only) full-featured *roff
+# implementation in use today, and most FLOSS Unix-like Operating Systems
+# using groff as their *roff implementation, the automatic implementation
+# of compatibility wrappers on systems having their own macro sets needs to
+# be revisited. Most FLOSS software is now developed on systems having no
+# other *roff implementation, so manual pages (for example) are developed
+# and proofread on systems using groff's implementation of the 'an' macro
+# set.
+#
+# On systems with their own macro sets (especially 'an'), documents can be
+# rendered incorrectly from the document author's point of view, when
+# these compatibility mode wrappers are used. groff's own manual pages are
+# the perfect case in point, with most not showing the principal usage line
+# of a command, due to the use of .SY/.OP/.YS macros to display such lines.
+#
+# Updating groff's use of compatibility mode wrappers
+#
+# Given the above, on systems with their own (non-GNU) macro sets, groff's
+# AUTOMATIC installation of these generated vendor compatibility wrappers
+# as the principal implementation of a macro set for groff(1) users may not
+# be desirable, especially if the users are principally using groff(1) to
+# format FLOSS manual pages.
+#
+# The '--with-compatibility-wrappers=<value>' option to 'configure' gives
+# these systems control over the default macro set implementation in use
+# when using the groff family of tools.
+#
+# The supported values of the '--with-compatibility-wrappers=<value>'
+# option are:
+# 'check' [default] Check if system has vendor-provided non-GNU
+# implementation of any *roff macro set. Based on that use the
+# 'yes' or 'no' value for '--with-compatibility-wrappers'. This
+# effectively emulates prior groff releases' implementation.
+# 'yes' Install the vendor compatibility wrappers as groff's default
+# implementation of these macro sets. This is compatible with
+# groff implementations up to and including version 1.22.3.
+# Direct use of the 'yes' option is discouraged, as it will
+# abort the configure process if no vendor-provided non-GNU
+# macro set implementations exists.
+# 'no' Do not install any vendor compatibility wrappers. Use the
+# groff implementation of all macro sets as the default.
+# 'manual' Install the vendor compatibility wrappers as '<macro>-os.tmac'
+# in the same directory as 'yes' option ('systemtmacdir').
+# groff users can access the vendor-provided macro set via the
+# '-m<macro>-os' option on the command line of a tool from the
+# groff family. The naming of the option value reflects that now
+# a manual step must be taken to use the vendor-provided
+# implementation of the macro set. This option can safely be
+# used on systems without vendor-provided non-GNU macro set
+# implementations to allow for cross-platform build
+# instructions.
+#
+
+AC_DEFUN([GROFF_WITH_COMPATIBILITY_WRAPPERS],
+ [AC_ARG_WITH([compatibility-wrappers],
+ [AS_HELP_STRING([--with-compatibility-wrappers[={check|manual|no|yes}]],
+ [choose whether and how groff compatibility wrappers for \
+ vendor-provided non-GNU macro packages are installed. \
+ 'check' searches for such packages, and behaves as if 'yes' or \
+ 'no' were given, accordingly. \
+ 'yes' generates compatibility wrappers for the vendor-provided \
+ packages to allow their use with groff and related tools. \
+ The compatibility wrappers are installed using the
+ vendor-provided names, while their groff implementations are \
+ installed with a 'g' prefix. \
+ Use of the latter thus requires options of the form
+ '-mg<package>' (example: -mgan). \
+ 'no' installs only the groff implementations.
+ 'manual' generates compatibility wrappers for the \
+ vendor-provided packages as '<macro>-os'. \
+ Use of the latter thus requires options of the form
+ '-m<macro>-os' option (example: -man-os).])],
+ [compatibility_wrappers="$withval"],
+ [compatibility_wrappers="check"])
+
+ if test "$compatibility_wrappers" != check \
+ && test "$compatibility_wrappers" != yes \
+ && test "$compatibility_wrappers" != no \
+ && test "$compatibility_wrappers" != manual
+ then
+ AC_MSG_WARN([Invalid '--with-compatibility-wrappers' argument: '$compatibility_wrappers' - assuming 'check' requested.])
+ compatibility_wrappers="check"
+ fi
+
+ if test -z "$tmac_wrap"
+ then
+ # No Operating System Macro Sets Present
+ if test "$compatibility_wrappers" = check
+ then
+ compatibility_wrappers="no"
+ elif test "$compatibility_wrappers" = yes
+ then
+ AC_MSG_ERROR([No non-GNU macro sets found - cannot create and install compatibility wrappers])
+ elif test "$compatibility_wrappers" = no
+ then
+ : # No action required
+ elif test "$compatibility_wrappers" = manual
+ then
+ # 'manual' allows quiet conversion to 'no' to support
+ # cross-platform build instructions
+ compatibility_wrappers="no"
+ fi
+ else
+ # One or more Operating System Macro Sets Present
+ if test "$compatibility_wrappers" = check
+ then
+ compatibility_wrappers="yes"
+ fi
+ fi
+
+ # Now compatibility_wrappers can only be yes, no or manual
+ AC_SUBST([compatibility_wrappers])
+ ])
+
+# 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 Windows scripts like 'afmtodit.cmd' should be installed.
+
+AC_DEFUN([GROFF_CMD_FILES],
+ [AC_MSG_CHECKING([whether to install .cmd wrapper scripts for Windows])
+ case "$host_os" in
+ *mingw*)
+ make_winscripts=winscripts
+ AC_MSG_RESULT([yes]) ;;
+ *)
+ make_winscripts=
+ AC_MSG_RESULT([no]) ;;
+ esac
+ AC_SUBST([make_winscripts])])
+
+
+# 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 <stdio.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_MATH_H
+#include <math.h>
+#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 <stdlib.h>
+#include <unistd.h>
+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 <inttypes.h> exists, doesn't clash with <sys/types.h>,
+# and declares uintmax_t. Taken from the fileutils package.
+
+AC_DEFUN([GROFF_INTTYPES_H],
+ [AC_LANG_PUSH([C++])
+ AC_MSG_CHECKING([C++ <inttypes.h>])
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([[
+
+#include <sys/types.h>
+#include <inttypes.h>
+
+ ]],
+ [[
+
+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++ <inttypes.h>.])],
+ [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 <inttypes.h> 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
+ <inttypes.h> 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 <ctype.h>
+#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 <X11/Intrinsic.h>
+#include <X11/Xaw/Simple.h>
+
+ ]],
+ [])
+ ],
+ [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 <X11/Intrinsic.h>
+#include <X11/Xmu/Converters.h>
+
+ ]],
+ [])
+ ],
+ [AC_MSG_RESULT([yes])],
+ [AC_MSG_RESULT([no])
+ groff_no_x=yes])
+
+ CFLAGS=$OLDCFLAGS
+ LDFLAGS=$OLDLDFLAGS
+ LIBS=$OLDLIBS
+ fi
+
+ if ! test "$groff_no_x" = yes
+ then
+ 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])
+])
+
+
+# Interpret the '--with-appdefdir' command-line option.
+
+dnl Don't quote AS_HELP_STRING!
+dnl
+dnl TODO: Include the computed default in the RHS of the help string.
+AC_DEFUN([GROFF_APPDEFDIR_OPTION], [
+ AC_ARG_WITH([appdefdir],
+ AS_HELP_STRING([--with-appdefdir=DIR],
+ [place X11 application defaults files in DIR]))
+])
+
+
+# Get a default value for the application defaults directory.
+#
+# We ignore the 'XAPPLRES' and 'XUSERFILESEARCHPATH' environment
+# variables.
+#
+# By default if --with-appdefdir is not used, we will install the
+# gxditview application defaults in $prefix/lib/X11/app-defaults.
+#
+# Note that if --with-appdefdir was passed to 'configure', no prefix is
+# added to 'appdefdir'.
+
+AC_DEFUN([GROFF_APPDEFDIR_DEFAULT],
+ [if test -z "$groff_no_x"; then
+ if test -z "$with_appdefdir"; then
+ if test "$prefix" = NONE; then
+ appdefdir=$ac_default_prefix/lib/X11/app-defaults
+ else
+ appdefdir=$prefix/lib/X11/app-defaults
+ fi
+ else
+ appdefdir=$with_appdefdir
+ fi
+ fi
+ AC_SUBST([appdefdir])])
+
+# Emit warning if --with-appdefdir hasn't been used.
+
+AC_DEFUN([GROFF_APPDEFDIR_NOTICE],
+ [if test -z "$groff_no_x"; then
+ if test -z "$with_appdefdir"; then
+ AC_MSG_NOTICE([Default X11 application defaults directory \
+assumed.
+
+ The application defaults files for gxditview (GXditview and
+ GXditview-color) will be installed in the following directory.
+
+ $appdefdir
+
+ To install elsewhere, say, '/etc/X11/app-defaults', add
+ '--with-appdefdir=/etc/X11/app-defaults' to the configure script
+ command-line options and rerun it (the 'prefix' value has no effect on
+ a --with-appdefdir option).
+
+ If the gxditview app-defaults are installed in a directory that is not
+ one of the default X11 directories for this purpose (common defaults
+ are /usr/lib/X11/app-defaults, /usr/share/X11/app-defaults, and
+ /etc/X11/app-defaults), you will have to set the environment variable
+ XFILESEARCHPATH to this path. More details can be found in the X(7)
+ manual page, or in the document "X Toolkit Intrinsics - C Language
+ Interface manual".
+ ])
+ fi
+ fi])
+
+
+AC_DEFUN([GROFF_LIBPROGRAMDIR_DEFAULT],
+ libprogramdir=$libdir/groff
+ AC_SUBST([libprogramdir]))
+
+
+AC_DEFUN([GROFF_GLILYPONDDIR_DEFAULT],
+ glilypond_dir=$libprogramdir/glilypond
+ AC_SUBST([glilypond_dir]))
+
+
+AC_DEFUN([GROFF_GPINYINDIR_DEFAULT],
+ gpinyin_dir=$libprogramdir/gpinyin
+ AC_SUBST([gpinyin_dir]))
+
+
+AC_DEFUN([GROFF_REFERDIR_DEFAULT],
+ referdir=$libprogramdir/refer
+ AC_SUBST([referdir]))
+
+# Generation of doc/gnu.eps requires xpmtoppm.
+
+AC_DEFUN([GROFF_PROG_XPMTOPPM],
+ [AC_CHECK_PROG([XPMTOPPM], [xpmtoppm], [found], [missing])])
+
+# Check for make built-in variable RM.
+
+AC_DEFUN([GROFF_MAKE_DEFINES_RM], [
+ AC_MSG_CHECKING(whether make defines 'RM')
+ make=make
+ if test -n "$MAKE"
+ then
+ make=$MAKE
+ fi
+ cat <<EOF > test_make_rm.mk
+all:
+ @if test -n "\$(RM)"; \
+ then \
+ echo yes; \
+ else \
+ echo no; \
+ fi
+EOF
+ groff_make_defines_rm=`"$make" -sf test_make_rm.mk`
+ AC_MSG_RESULT([$groff_make_defines_rm])
+ rm -f test_make_rm.mk
+])
+
+# Check if diff has option -D, for gdiffmk. If not, check if gdiff is
+# available on the system and make the same test. If either diff or
+# gdiff is working, it is set to DIFF_PROG. If -D option is not
+# available, DIFF_PROG is left to diff (gdiffmk will report a
+# problem).
+
+AC_DEFUN([GROFF_DIFF_D],
+ [AC_MSG_CHECKING(for a diff program that supports option -D)
+ groff_has_diff_d_option=no
+ DIFF_PROG=diff
+ diff -Dx /dev/null /dev/null >/dev/null 2>&1 && groff_has_diff_d_option=yes
+ if test "$groff_has_diff_d_option" = no; then
+ AC_CHECK_PROGS([GDIFF], [gdiff])
+ if test -n "$GDIFF"; then
+ "$GDIFF" -Dx /dev/null /dev/null >/dev/null 2>&1 && groff_has_diff_d_option=yes
+ if test "$groff_has_diff_d_option" = yes; then
+ DIFF_PROG="$GDIFF"
+ fi
+ fi
+ fi
+ AC_MSG_RESULT([$groff_has_diff_d_option])
+ AC_SUBST([DIFF_PROG])])
+
+# Check if 'test' supports the option -ef.
+
+AC_DEFUN([GROFF_HAVE_TEST_EF_OPTION],
+ [AC_MSG_CHECKING(whether test supports option -ef)
+ HAVE_TEST_EF_OPTION=no
+ test /dev/null -ef /dev/null > /dev/null 2>&1 && HAVE_TEST_EF_OPTION=yes
+ AC_MSG_RESULT([$HAVE_TEST_EF_OPTION])
+ AC_SUBST([HAVE_TEST_EF_OPTION])])
+
+# gdiffmk will attempt to use bash (for option -ef of 'test'). If bash
+# is not available it will use /bin/sh.
+
+AC_DEFUN([GROFF_BASH],
+ [AC_PATH_PROGS([BASH_PROG], [bash], [no])
+ if test "$BASH_PROG" = no; then
+ BASH_PROG=/bin/sh
+ fi
+ AC_SUBST([BASH_PROG])])
+
+# Search for uchardet library used by preconv.
+
+AC_DEFUN([GROFF_UCHARDET], [
+ AC_ARG_WITH([uchardet],
+ AS_HELP_STRING([--with-uchardet={auto|no|yes}],
+ [build 'preconv' against uchardet library to automatically \
+detect input file encoding]))
+ AS_IF([test "$with_uchardet" != no],
+ [PKG_CHECK_MODULES([UCHARDET],
+ [uchardet >= 0.0.1],
+ [AC_DEFINE([HAVE_UCHARDET], [1],
+ [uchardet library availability])
+ groff_have_uchardet=yes], [
+ if test "$with_uchardet" = yes
+ then
+ AC_MSG_FAILURE([could not find uchardet library])
+ fi
+ groff_have_uchardet=no])],
+ [groff_have_uchardet=no])
+])
+
+AC_DEFUN([GROFF_UCHARDET_NOTICE], [
+ if test "$groff_have_uchardet" = no && test "$with_uchardet" != no
+ then
+ AC_MSG_NOTICE([The uchardet library was not found.
+
+ The 'preconv' preprocessor program will be unable to attempt automatic
+ inference of an input file's character encoding. See the preconv(1)
+ man page.
+ ])
+ fi
+])
+
+
+AC_DEFUN([GROFF_USE_GROFF_ALLOCATOR], [
+ AC_ARG_ENABLE([groff-allocator],
+ [AS_HELP_STRING([--enable-groff-allocator], [enable libgroff's \
+allocator for C++ new/delete])],
+ [test "$enableval" = yes && groff_use_own_allocator=yes],
+ [groff_use_own_allocator=no])
+])
diff --git a/m4/iconv.m4 b/m4/iconv.m4
new file mode 100644
index 0000000..ec7cd0a
--- /dev/null
+++ b/m4/iconv.m4
@@ -0,0 +1,271 @@
+# iconv.m4 serial 19 (gettext-0.18.2)
+dnl Copyright (C) 2000-2018 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_ICONV_LINKFLAGS_BODY],
+[
+ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+
+ dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+ dnl accordingly.
+ AC_LIB_LINKFLAGS_BODY([iconv])
+])
+
+AC_DEFUN([AM_ICONV_LINK],
+[
+ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
+ dnl those with the standalone portable GNU libiconv installed).
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+ dnl accordingly.
+ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+
+ dnl Add $INCICONV to CPPFLAGS before performing the following checks,
+ dnl because if the user has installed libiconv and not disabled its use
+ dnl via --without-libiconv-prefix, he wants to use it. The first
+ dnl AC_LINK_IFELSE will then fail, the second AC_LINK_IFELSE will succeed.
+ am_save_CPPFLAGS="$CPPFLAGS"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
+
+ AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [
+ am_cv_func_iconv="no, consider installing GNU libiconv"
+ am_cv_lib_iconv=no
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <stdlib.h>
+#include <iconv.h>
+ ]],
+ [[iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);]])],
+ [am_cv_func_iconv=yes])
+ if test "$am_cv_func_iconv" != yes; then
+ am_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBICONV"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <stdlib.h>
+#include <iconv.h>
+ ]],
+ [[iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);]])],
+ [am_cv_lib_iconv=yes]
+ [am_cv_func_iconv=yes])
+ LIBS="$am_save_LIBS"
+ fi
+ ])
+ if test "$am_cv_func_iconv" = yes; then
+ AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [
+ dnl This tests against bugs in AIX 5.1, AIX 6.1..7.1, HP-UX 11.11,
+ dnl Solaris 10.
+ am_save_LIBS="$LIBS"
+ if test $am_cv_lib_iconv = yes; then
+ LIBS="$LIBS $LIBICONV"
+ fi
+ am_cv_func_iconv_works=no
+ for ac_iconv_const in '' 'const'; do
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <iconv.h>
+#include <string.h>
+
+#ifndef ICONV_CONST
+# define ICONV_CONST $ac_iconv_const
+#endif
+ ]],
+ [[int result = 0;
+ /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
+ returns. */
+ {
+ iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+ if (cd_utf8_to_88591 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
+ char buf[10];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_utf8_to_88591,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ result |= 1;
+ iconv_close (cd_utf8_to_88591);
+ }
+ }
+ /* Test against Solaris 10 bug: Failures are not distinguishable from
+ successful returns. */
+ {
+ iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
+ if (cd_ascii_to_88591 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\263";
+ char buf[10];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_ascii_to_88591,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ result |= 2;
+ iconv_close (cd_ascii_to_88591);
+ }
+ }
+ /* Test against AIX 6.1..7.1 bug: Buffer overrun. */
+ {
+ iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
+ if (cd_88591_to_utf8 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\304";
+ static char buf[2] = { (char)0xDE, (char)0xAD };
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = 1;
+ char *outptr = buf;
+ size_t outbytesleft = 1;
+ size_t res = iconv (cd_88591_to_utf8,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
+ result |= 4;
+ iconv_close (cd_88591_to_utf8);
+ }
+ }
+#if 0 /* This bug could be worked around by the caller. */
+ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */
+ {
+ iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+ if (cd_88591_to_utf8 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char buf[50];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_88591_to_utf8,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if ((int)res > 0)
+ result |= 8;
+ iconv_close (cd_88591_to_utf8);
+ }
+ }
+#endif
+ /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+ provided. */
+ if (/* Try standardized names. */
+ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
+ /* Try IRIX, OSF/1 names. */
+ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
+ /* Try AIX names. */
+ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
+ /* Try HP-UX names. */
+ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
+ result |= 16;
+ return result;
+]])],
+ [am_cv_func_iconv_works=yes], ,
+ [case "$host_os" in
+ aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+ *) am_cv_func_iconv_works="guessing yes" ;;
+ esac])
+ test "$am_cv_func_iconv_works" = no || break
+ done
+ LIBS="$am_save_LIBS"
+ ])
+ case "$am_cv_func_iconv_works" in
+ *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+ *) am_func_iconv=yes ;;
+ esac
+ else
+ am_func_iconv=no am_cv_lib_iconv=no
+ fi
+ if test "$am_func_iconv" = yes; then
+ AC_DEFINE([HAVE_ICONV], [1],
+ [Define if you have the iconv() function and it works.])
+ fi
+ if test "$am_cv_lib_iconv" = yes; then
+ AC_MSG_CHECKING([how to link with libiconv])
+ AC_MSG_RESULT([$LIBICONV])
+ else
+ dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV
+ dnl either.
+ CPPFLAGS="$am_save_CPPFLAGS"
+ LIBICONV=
+ LTLIBICONV=
+ fi
+ AC_SUBST([LIBICONV])
+ AC_SUBST([LTLIBICONV])
+])
+
+dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to
+dnl avoid warnings like
+dnl "warning: AC_REQUIRE: 'AM_ICONV' was expanded before it was required".
+dnl This is tricky because of the way 'aclocal' is implemented:
+dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN.
+dnl Otherwise aclocal's initial scan pass would miss the macro definition.
+dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions.
+dnl Otherwise aclocal would emit many "Use of uninitialized value $1"
+dnl warnings.
+m4_define([gl_iconv_AC_DEFUN],
+ m4_version_prereq([2.64],
+ [[AC_DEFUN_ONCE(
+ [$1], [$2])]],
+ [m4_ifdef([gl_00GNULIB],
+ [[AC_DEFUN_ONCE(
+ [$1], [$2])]],
+ [[AC_DEFUN(
+ [$1], [$2])]])]))
+gl_iconv_AC_DEFUN([AM_ICONV],
+[
+ AM_ICONV_LINK
+ if test "$am_cv_func_iconv" = yes; then
+ AC_MSG_CHECKING([for iconv declaration])
+ AC_CACHE_VAL([am_cv_proto_iconv], [
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+ ]],
+ [[]])],
+ [am_cv_proto_iconv_arg1=""],
+ [am_cv_proto_iconv_arg1="const"])
+ am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
+ am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+ AC_MSG_RESULT([
+ $am_cv_proto_iconv])
+ AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1],
+ [Define as const if the declaration of iconv() needs const.])
+ dnl Also substitute ICONV_CONST in the gnulib generated <iconv.h>.
+ m4_ifdef([gl_ICONV_H_DEFAULTS],
+ [AC_REQUIRE([gl_ICONV_H_DEFAULTS])
+ if test -n "$am_cv_proto_iconv_arg1"; then
+ ICONV_CONST="const"
+ fi
+ ])
+ fi
+])
diff --git a/m4/lib-ld.m4 b/m4/lib-ld.m4
new file mode 100644
index 0000000..d3eb0fc
--- /dev/null
+++ b/m4/lib-ld.m4
@@ -0,0 +1,119 @@
+# lib-ld.m4 serial 6
+dnl Copyright (C) 1996-2018 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Subroutines of libtool.m4,
+dnl with replacements s/_*LT_PATH/AC_LIB_PROG/ and s/lt_/acl_/ to avoid
+dnl collision with libtool.m4.
+
+dnl From libtool-2.4. Sets the variable with_gnu_ld to yes or no.
+AC_DEFUN([AC_LIB_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld],
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ acl_cv_prog_gnu_ld=yes
+ ;;
+*)
+ acl_cv_prog_gnu_ld=no
+ ;;
+esac])
+with_gnu_ld=$acl_cv_prog_gnu_ld
+])
+
+dnl From libtool-2.4. Sets the variable LD.
+AC_DEFUN([AC_LIB_PROG_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+
+AC_ARG_WITH([gnu-ld],
+ [AS_HELP_STRING([--with-gnu-ld],
+ [assume the C compiler uses GNU ld [default=no]])],
+ [test "$withval" = no || with_gnu_ld=yes],
+ [with_gnu_ld=no])dnl
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+ # contains only /bin. Note that ksh looks also at the FPATH variable,
+ # so we have to set that as well for the test.
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ || PATH_SEPARATOR=';'
+ }
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by $CC])
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [[\\/]]* | ?:[[\\/]]*)
+ re_direlt='/[[^/]][[^/]]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'`
+ while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL([acl_cv_path_LD],
+[if test -z "$LD"; then
+ acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$acl_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ acl_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$acl_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$acl_save_ifs"
+else
+ acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT([$LD])
+else
+ AC_MSG_RESULT([no])
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_LIB_PROG_LD_GNU
+])
diff --git a/m4/lib-link.m4 b/m4/lib-link.m4
new file mode 100644
index 0000000..4aa359a
--- /dev/null
+++ b/m4/lib-link.m4
@@ -0,0 +1,777 @@
+# lib-link.m4 serial 26 (gettext-0.18.2)
+dnl Copyright (C) 2001-2018 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_PREREQ([2.54])
+
+dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
+dnl augments the CPPFLAGS variable.
+dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_LINKFLAGS],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+ pushdef([Name],[m4_translit([$1],[./+-], [____])])
+ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+ AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
+ AC_LIB_LINKFLAGS_BODY([$1], [$2])
+ ac_cv_lib[]Name[]_libs="$LIB[]NAME"
+ ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
+ ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
+ ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX"
+ ])
+ LIB[]NAME="$ac_cv_lib[]Name[]_libs"
+ LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
+ INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
+ LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+ AC_SUBST([LIB]NAME)
+ AC_SUBST([LTLIB]NAME)
+ AC_SUBST([LIB]NAME[_PREFIX])
+ dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
+ dnl results of this search when this library appears as a dependency.
+ HAVE_LIB[]NAME=yes
+ popdef([NAME])
+ popdef([Name])
+])
+
+dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message])
+dnl searches for libname and the libraries corresponding to explicit and
+dnl implicit dependencies, together with the specified include files and
+dnl the ability to compile and link the specified testcode. The missing-message
+dnl defaults to 'no' and may contain additional hints for the user.
+dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME}
+dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
+dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
+dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+ pushdef([Name],[m4_translit([$1],[./+-], [____])])
+ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+
+ dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
+ dnl accordingly.
+ AC_LIB_LINKFLAGS_BODY([$1], [$2])
+
+ dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
+ dnl because if the user has installed lib[]Name and not disabled its use
+ dnl via --without-lib[]Name-prefix, he wants to use it.
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+
+ AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
+ ac_save_LIBS="$LIBS"
+ dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS,
+ dnl because these -l options might require -L options that are present in
+ dnl LIBS. -l options benefit only from the -L options listed before it.
+ dnl Otherwise, add it to the front of LIBS, because it may be a static
+ dnl library that depends on another static library that is present in LIBS.
+ dnl Static libraries benefit only from the static libraries listed after
+ dnl it.
+ case " $LIB[]NAME" in
+ *" -l"*) LIBS="$LIBS $LIB[]NAME" ;;
+ *) LIBS="$LIB[]NAME $LIBS" ;;
+ esac
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[$3]], [[$4]])],
+ [ac_cv_lib[]Name=yes],
+ [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])'])
+ LIBS="$ac_save_LIBS"
+ ])
+ if test "$ac_cv_lib[]Name" = yes; then
+ HAVE_LIB[]NAME=yes
+ AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.])
+ AC_MSG_CHECKING([how to link with lib[]$1])
+ AC_MSG_RESULT([$LIB[]NAME])
+ else
+ HAVE_LIB[]NAME=no
+ dnl If $LIB[]NAME didn't lead to a usable library, we don't need
+ dnl $INC[]NAME either.
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LIB[]NAME=
+ LTLIB[]NAME=
+ LIB[]NAME[]_PREFIX=
+ fi
+ AC_SUBST([HAVE_LIB]NAME)
+ AC_SUBST([LIB]NAME)
+ AC_SUBST([LTLIB]NAME)
+ AC_SUBST([LIB]NAME[_PREFIX])
+ popdef([NAME])
+ popdef([Name])
+])
+
+dnl Determine the platform dependent parameters needed to use rpath:
+dnl acl_libext,
+dnl acl_shlibext,
+dnl acl_libname_spec,
+dnl acl_library_names_spec,
+dnl acl_hardcode_libdir_flag_spec,
+dnl acl_hardcode_libdir_separator,
+dnl acl_hardcode_direct,
+dnl acl_hardcode_minus_L.
+AC_DEFUN([AC_LIB_RPATH],
+[
+ dnl Tell automake >= 1.10 to complain if config.rpath is missing.
+ m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])])
+ AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS
+ AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
+ AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
+ AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [
+ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+ . ./conftest.sh
+ rm -f ./conftest.sh
+ acl_cv_rpath=done
+ ])
+ wl="$acl_cv_wl"
+ acl_libext="$acl_cv_libext"
+ acl_shlibext="$acl_cv_shlibext"
+ acl_libname_spec="$acl_cv_libname_spec"
+ acl_library_names_spec="$acl_cv_library_names_spec"
+ acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+ acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+ acl_hardcode_direct="$acl_cv_hardcode_direct"
+ acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
+ dnl Determine whether the user wants rpath handling at all.
+ AC_ARG_ENABLE([rpath],
+ [ --disable-rpath do not hardcode runtime library paths],
+ :, enable_rpath=yes)
+])
+
+dnl AC_LIB_FROMPACKAGE(name, package)
+dnl declares that libname comes from the given package. The configure file
+dnl will then not have a --with-libname-prefix option but a
+dnl --with-package-prefix option. Several libraries can come from the same
+dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar
+dnl macro call that searches for libname.
+AC_DEFUN([AC_LIB_FROMPACKAGE],
+[
+ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+ define([acl_frompackage_]NAME, [$2])
+ popdef([NAME])
+ pushdef([PACK],[$2])
+ pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+ define([acl_libsinpackage_]PACKUP,
+ m4_ifdef([acl_libsinpackage_]PACKUP, [m4_defn([acl_libsinpackage_]PACKUP)[, ]],)[lib$1])
+ popdef([PACKUP])
+ popdef([PACK])
+])
+
+dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
+dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found
+dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+ pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])])
+ pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+ pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])])
+ dnl Autoconf >= 2.61 supports dots in --with options.
+ pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[m4_translit(PACK,[.],[_])],PACK)])
+ dnl By default, look in $includedir and $libdir.
+ use_additional=yes
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ AC_ARG_WITH(P_A_C_K[-prefix],
+[[ --with-]]P_A_C_K[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib
+ --without-]]P_A_C_K[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]],
+[
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ if test "$acl_libdirstem2" != "$acl_libdirstem" \
+ && ! test -d "$withval/$acl_libdirstem"; then
+ additional_libdir="$withval/$acl_libdirstem2"
+ fi
+ fi
+ fi
+])
+ dnl Search the library and its dependencies in $additional_libdir and
+ dnl $LDFLAGS. Using breadth-first-search.
+ LIB[]NAME=
+ LTLIB[]NAME=
+ INC[]NAME=
+ LIB[]NAME[]_PREFIX=
+ dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been
+ dnl computed. So it has to be reset here.
+ HAVE_LIB[]NAME=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='$1 $2'
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
+ dnl or AC_LIB_HAVE_LINKFLAGS call.
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
+ else
+ dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
+ dnl that this library doesn't exist. So just drop it.
+ :
+ fi
+ else
+ dnl Search the library lib$name in $additional_libdir and $LDFLAGS
+ dnl and the already constructed $LIBNAME/$LTLIBNAME.
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ eval libname=\"$acl_libname_spec\" # typically: libname=lib$name
+ if test -n "$acl_shlibext"; then
+ shrext=".$acl_shlibext" # typically: shrext=.so
+ else
+ shrext=
+ fi
+ if test $use_additional = yes; then
+ dir="$additional_libdir"
+ dnl The same code as in the loop below:
+ dnl First look for a shared library.
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ dnl Then look for a static library.
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext"; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ dnl First look for a shared library.
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ dnl Then look for a static library.
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext"; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ dnl Found the library.
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
+ if test "X$found_so" != "X"; then
+ dnl Linking with a shared library. We attempt to hardcode its
+ dnl directory into the executable's runpath, unless it's the
+ dnl standard /usr/lib.
+ if test "$enable_rpath" = no \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
+ dnl No hardcoding is needed.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ dnl Use an explicit option to hardcode DIR into the resulting
+ dnl binary.
+ dnl Potentially add DIR to ltrpathdirs.
+ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ dnl The hardcoding into $LIBNAME is system dependent.
+ if test "$acl_hardcode_direct" = yes; then
+ dnl Using DIR/libNAME.so during linking hardcodes DIR into the
+ dnl resulting binary.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ dnl Use an explicit option to hardcode DIR into the resulting
+ dnl binary.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ dnl Potentially add DIR to rpathdirs.
+ dnl The rpathdirs will be appended to $LIBNAME at the end.
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ dnl Rely on "-L$found_dir".
+ dnl But don't add it if it's already contained in the LDFLAGS
+ dnl or the already constructed $LIBNAME
+ haveit=
+ for x in $LDFLAGS $LIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
+ fi
+ if test "$acl_hardcode_minus_L" != no; then
+ dnl FIXME: Not sure whether we should use
+ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+ dnl here.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH
+ dnl here, because this doesn't fit in flags passed to the
+ dnl compiler. So give up. No hardcoding. This affects only
+ dnl very old systems.
+ dnl FIXME: Not sure whether we should use
+ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+ dnl here.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ dnl Linking with a static library.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
+ else
+ dnl We shouldn't come here, but anyway it's good to have a
+ dnl fallback.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
+ fi
+ fi
+ dnl Assume the include files are nearby.
+ additional_includedir=
+ case "$found_dir" in
+ */$acl_libdirstem | */$acl_libdirstem/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+ if test "$name" = '$1'; then
+ LIB[]NAME[]_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ */$acl_libdirstem2 | */$acl_libdirstem2/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+ if test "$name" = '$1'; then
+ LIB[]NAME[]_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ dnl Potentially add $additional_includedir to $INCNAME.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/include,
+ dnl 2. if it's /usr/local/include and we are using GCC on Linux,
+ dnl 3. if it's already present in $CPPFLAGS or the already
+ dnl constructed $INCNAME,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INC[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ dnl Really add $additional_includedir to $INCNAME.
+ INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ dnl Look for dependencies.
+ if test -n "$found_la"; then
+ dnl Read the .la file. It defines the variables
+ dnl dlname, library_names, old_library, dependency_libs, current,
+ dnl age, revision, installed, dlopen, dlpreopen, libdir.
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ dnl We use only dependency_libs.
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/lib,
+ dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
+ dnl 3. if it's already present in $LDFLAGS or the already
+ dnl constructed $LIBNAME,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
+ haveit=
+ if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LIBNAME.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LTLIBNAME.
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ dnl Potentially add DIR to rpathdirs.
+ dnl The rpathdirs will be appended to $LIBNAME at the end.
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ dnl Potentially add DIR to ltrpathdirs.
+ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ dnl Handle this in the next round.
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+ ;;
+ *.la)
+ dnl Handle this in the next round. Throw away the .la's
+ dnl directory; it is already contained in a preceding -L
+ dnl option.
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ dnl Most likely an immediate library name.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ dnl Didn't find the library; assume it is in the system directories
+ dnl known to the linker and runtime loader. (All the system
+ dnl directories known to the linker should also be known to the
+ dnl runtime loader, otherwise the system is severely misconfigured.)
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$acl_hardcode_libdir_separator"; then
+ dnl Weird platform: only the last -rpath option counts, the user must
+ dnl pass all path elements in one option. We can arrange that for a
+ dnl single library, but not when more than one $LIBNAMEs are used.
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+ done
+ dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl.
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+ else
+ dnl The -rpath options are cumulative.
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ dnl When using libtool, the option that works for both libraries and
+ dnl executables is -R. The -R options are cumulative.
+ for found_dir in $ltrpathdirs; do
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
+ done
+ fi
+ popdef([P_A_C_K])
+ popdef([PACKLIBS])
+ popdef([PACKUP])
+ popdef([PACK])
+ popdef([NAME])
+])
+
+dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
+dnl unless already present in VAR.
+dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
+dnl contains two or three consecutive elements that belong together.
+AC_DEFUN([AC_LIB_APPENDTOVAR],
+[
+ for element in [$2]; do
+ haveit=
+ for x in $[$1]; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ [$1]="${[$1]}${[$1]:+ }$element"
+ fi
+ done
+])
+
+dnl For those cases where a variable contains several -L and -l options
+dnl referring to unknown libraries and directories, this macro determines the
+dnl necessary additional linker options for the runtime path.
+dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL])
+dnl sets LDADDVAR to linker options needed together with LIBSVALUE.
+dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed,
+dnl otherwise linking without libtool is assumed.
+AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
+[
+ AC_REQUIRE([AC_LIB_RPATH])
+ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+ $1=
+ if test "$enable_rpath" != no; then
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ dnl Use an explicit option to hardcode directories into the resulting
+ dnl binary.
+ rpathdirs=
+ next=
+ for opt in $2; do
+ if test -n "$next"; then
+ dir="$next"
+ dnl No need to hardcode the standard /usr/lib.
+ if test "X$dir" != "X/usr/$acl_libdirstem" \
+ && test "X$dir" != "X/usr/$acl_libdirstem2"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ next=
+ else
+ case $opt in
+ -L) next=yes ;;
+ -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'`
+ dnl No need to hardcode the standard /usr/lib.
+ if test "X$dir" != "X/usr/$acl_libdirstem" \
+ && test "X$dir" != "X/usr/$acl_libdirstem2"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ next= ;;
+ *) next= ;;
+ esac
+ fi
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n ""$3""; then
+ dnl libtool is used for linking. Use -R options.
+ for dir in $rpathdirs; do
+ $1="${$1}${$1:+ }-R$dir"
+ done
+ else
+ dnl The linker is used for linking directly.
+ if test -n "$acl_hardcode_libdir_separator"; then
+ dnl Weird platform: only the last -rpath option counts, the user
+ dnl must pass all path elements in one option.
+ alldirs=
+ for dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir"
+ done
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ $1="$flag"
+ else
+ dnl The -rpath options are cumulative.
+ for dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ $1="${$1}${$1:+ }$flag"
+ done
+ fi
+ fi
+ fi
+ fi
+ fi
+ AC_SUBST([$1])
+])
diff --git a/m4/lib-prefix.m4 b/m4/lib-prefix.m4
new file mode 100644
index 0000000..ff90f8f
--- /dev/null
+++ b/m4/lib-prefix.m4
@@ -0,0 +1,224 @@
+# lib-prefix.m4 serial 7 (gettext-0.18)
+dnl Copyright (C) 2001-2018 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
+dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
+dnl require excessive bracketing.
+ifdef([AC_HELP_STRING],
+[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
+[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
+
+dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
+dnl to access previously installed libraries. The basic assumption is that
+dnl a user will want packages to use other packages he previously installed
+dnl with the same --prefix option.
+dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
+dnl libraries, but is otherwise very convenient.
+AC_DEFUN([AC_LIB_PREFIX],
+[
+ AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ dnl By default, look in $includedir and $libdir.
+ use_additional=yes
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ AC_LIB_ARG_WITH([lib-prefix],
+[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
+ --without-lib-prefix don't search for libraries in includedir and libdir],
+[
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ fi
+ fi
+])
+ if test $use_additional = yes; then
+ dnl Potentially add $additional_includedir to $CPPFLAGS.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/include,
+ dnl 2. if it's already present in $CPPFLAGS,
+ dnl 3. if it's /usr/local/include and we are using GCC on Linux,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ for x in $CPPFLAGS; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ dnl Really add $additional_includedir to $CPPFLAGS.
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ dnl Potentially add $additional_libdir to $LDFLAGS.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/lib,
+ dnl 2. if it's already present in $LDFLAGS,
+ dnl 3. if it's /usr/local/lib and we are using GCC on Linux,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
+ haveit=
+ for x in $LDFLAGS; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LDFLAGS.
+ LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ fi
+])
+
+dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
+dnl acl_final_exec_prefix, containing the values to which $prefix and
+dnl $exec_prefix will expand at the end of the configure script.
+AC_DEFUN([AC_LIB_PREPARE_PREFIX],
+[
+ dnl Unfortunately, prefix and exec_prefix get only finally determined
+ dnl at the end of configure.
+ if test "X$prefix" = "XNONE"; then
+ acl_final_prefix="$ac_default_prefix"
+ else
+ acl_final_prefix="$prefix"
+ fi
+ if test "X$exec_prefix" = "XNONE"; then
+ acl_final_exec_prefix='${prefix}'
+ else
+ acl_final_exec_prefix="$exec_prefix"
+ fi
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+ prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
+dnl variables prefix and exec_prefix bound to the values they will have
+dnl at the end of the configure script.
+AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
+[
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ $1
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_PREPARE_MULTILIB creates
+dnl - a variable acl_libdirstem, containing the basename of the libdir, either
+dnl "lib" or "lib64" or "lib/64",
+dnl - a variable acl_libdirstem2, as a secondary possible value for
+dnl acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or
+dnl "lib/amd64".
+AC_DEFUN([AC_LIB_PREPARE_MULTILIB],
+[
+ dnl There is no formal standard regarding lib and lib64.
+ dnl On glibc systems, the current practice is that on a system supporting
+ dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
+ dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine
+ dnl the compiler's default mode by looking at the compiler's library search
+ dnl path. If at least one of its elements ends in /lib64 or points to a
+ dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI.
+ dnl Otherwise we use the default, namely "lib".
+ dnl On Solaris systems, the current practice is that on a system supporting
+ dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
+ dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or
+ dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib.
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ acl_libdirstem=lib
+ acl_libdirstem2=
+ case "$host_os" in
+ solaris*)
+ dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment
+ dnl <http://docs.sun.com/app/docs/doc/816-5138/dev-env?l=en&a=view>.
+ dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link."
+ dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the
+ dnl symlink is missing, so we set acl_libdirstem2 too.
+ AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit],
+ [AC_EGREP_CPP([sixtyfour bits], [
+#ifdef _LP64
+sixtyfour bits
+#endif
+ ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no])
+ ])
+ if test $gl_cv_solaris_64bit = yes; then
+ acl_libdirstem=lib/64
+ case "$host_cpu" in
+ sparc*) acl_libdirstem2=lib/sparcv9 ;;
+ i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
+ esac
+ fi
+ ;;
+ *)
+ searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+ if test -n "$searchpath"; then
+ acl_save_IFS="${IFS= }"; IFS=":"
+ for searchdir in $searchpath; do
+ if test -d "$searchdir"; then
+ case "$searchdir" in
+ */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
+ */../ | */.. )
+ # Better ignore directories of this form. They are misleading.
+ ;;
+ *) searchdir=`cd "$searchdir" && pwd`
+ case "$searchdir" in
+ */lib64 ) acl_libdirstem=lib64 ;;
+ esac ;;
+ esac
+ fi
+ done
+ IFS="$acl_save_IFS"
+ fi
+ ;;
+ esac
+ test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
+])
diff --git a/m4/localcharset.m4 b/m4/localcharset.m4
new file mode 100644
index 0000000..677aea5
--- /dev/null
+++ b/m4/localcharset.m4
@@ -0,0 +1,17 @@
+# localcharset.m4 serial 7
+dnl Copyright (C) 2002-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_LOCALCHARSET],
+[
+ dnl Prerequisites of lib/localcharset.c.
+ AC_REQUIRE([AM_LANGINFO_CODESET])
+ AC_REQUIRE([gl_FCNTL_O_FLAGS])
+ AC_CHECK_DECLS_ONCE([getc_unlocked])
+
+ dnl Prerequisites of the lib/Makefile.am snippet.
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([gl_GLIBC21])
+])
diff --git a/makevarescape.sed b/makevarescape.sed
new file mode 100644
index 0000000..2baa50c
--- /dev/null
+++ b/makevarescape.sed
@@ -0,0 +1,9 @@
+s/\\/\\\\e/g
+s/ /\\\\ /g
+s/"/\\\\[dq]/g
+s/'/\\\\[aq]/g
+s/-/\\\\&/g
+s/\^/\\\\[ha]/g
+s/`/\\\\[ga]/g
+s/~/\\\\[ti]/g
+s|[^ ]/\+|&\\\\:\\\\%|g
diff --git a/man/groff.7.man b/man/groff.7.man
new file mode 100644
index 0000000..3d4cad1
--- /dev/null
+++ b/man/groff.7.man
@@ -0,0 +1,8055 @@
+'\" t
+.TH groff @MAN7EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+groff \- GNU
+.I roff
+language reference
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2000-2023 Free Software Foundation, Inc.
+.\"
+.\" This file is part of groff, the GNU roff type-setting system.
+.\"
+.\" Permission is granted to copy, distribute and/or modify this
+.\" document under the terms of the GNU Free Documentation License,
+.\" Version 1.3 or any later version published by the Free Software
+.\" Foundation; with no Invariant Sections, 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_7_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.\" Setup
+.\" ====================================================================
+.
+.\" Man pages should not define page-local macros. Most of these were
+.\" written long ago; someday we'll revise the page without them.
+.
+.\" ====================================================================
+.\" start a macro, escape sequence, or register definition
+.
+.de TPx
+. TP 10n
+..
+.\" ====================================================================
+.\" .Text anything ...
+.\"
+.\" All arguments are printed as text.
+.\"
+.de Text
+. nop \)\\$*
+..
+.
+.\" ========= characters =========
+.
+.de squoted_char
+. Text \[oq]\f[CB]\\$1\f[]\[cq]\\$2
+..
+.de dquoted_char
+. Text \[lq]\f[CB]\\$1\f[]\[rq]\\$2
+..
+.\" ========= requests =========
+.
+.\" synopsis of a request
+.de REQ
+. ie \\n[.$]=1 \{\
+. Text \f[CB]\\$1\f[]
+. \}
+. el \{\
+. Text \f[CB]\\$1\~\f[]\f[I]\\$2\f[]
+. \}
+..
+.
+.\" reference of a request
+.de request
+. ie (\\n[.$] < 2) \
+. B \\$*
+. el \
+. BR \\$*
+..
+.
+.\" ========= numeric elements =========
+.
+.\" number with a trailing unit
+.de scalednumber
+. Text \\$1\^\f[CB]\\$2\f[]\\$3\f[R]
+. ft P
+..
+.
+.\" representation of units within the text
+.de scaleindicator
+. Text \f[CB]\\$1\f[]\\$2\f[R]
+. ft P
+..
+.
+.\" representation of mathematical operators within the text
+.de operator
+. squoted_char \\$@
+..
+.
+.
+.\" ========= escape sequences =========
+.
+.\" ====================================================================
+.\" .ESC name [arg]
+.\"
+.\" Synopsis of an escape sequence, optionally with argument
+.\" Args : 1 or 2; 'name' obligatory, 'arg' optional
+.\" name : suitable name for an escape sequence (c, (xy, [long])
+.\" arg : arbitrary word
+.\" Result : prints \namearg, where 'name' is in CB, 'arg' in I
+.\"
+.de ESC
+. Text "\f[CB]\e\\$1\,\f[I]\\$2\/\fR"
+..
+.\" ====================================================================
+.\" .ESC[] name arg
+.\"
+.\" Synopsis for escape sequence with a bracketed long argument
+.\" Args : 2 obligatory
+.\" name : suitable name for an escape sequence (c, (xy, [long])
+.\" arg : arbitrary text
+.\" Result : prints \name[arg], where 'name' is in CB, 'arg' in I
+.\"
+.de ESC[]
+. Text "\f[CB]\e\\$1\[lB]\f[]\,\f[I]\\$2\/\f[]\f[CB]\[rB]\f[]"
+..
+.\" ====================================================================
+.\" .ESCq name arg
+.\"
+.\" Synopsis for escape sequence with a bracketed long argument
+.\" Args : 2 obligatory
+.\" name : suitable name for an escape sequence (c, (xy, [long])
+.\" arg : arbitrary text
+.\" Result : prints \name'arg', where 'name' is in CB, 'arg' in I
+.\"
+.de ESCq
+. Text "\f[CB]\e\\$1\[aq]\f[]\,\f[I]\\$2\/\f[]\f[CB]\[aq]\f[]"
+..
+.\" ====================================================================
+.\" .ESC? arg
+.\"
+.\" Synopsis for escape sequence with a bracketed long argument
+.\" Args : 1 obligatory
+.\" arg : arbitrary text
+.\" Result : prints '\?arg\?', where the '\?' are in CB, 'arg' in I
+.\"
+.de ESC?
+. Text "\f[CB]\e?\,\f[I]\\$1\/\f[CB]\[rs]?\f[R]"
+..
+.\" ====================================================================
+.\" .esc name [punct]
+.\"
+.\" Reference of an escape sequence (no args), possibly punctuation
+.\" Args : 1 obligatory
+.\" name : suitable name for an escape sequence (c, (xy, [long])
+.\" punct : arbitrary
+.\" Result : prints \name, where 'name' is in B, 'punct' in R
+.\"
+.de esc
+. ie (\\n[.$] < 2) \
+. B "\e\\$1"
+. el \
+. BR "\e\\$1" \\$2
+..
+.\" ====================================================================
+.\" .escarg name arg [punct]
+.\"
+.\" Reference of an escape sequence (no args)
+.\" Args : 1 obligatory, 1 optional
+.\" name : suitable name for an escape sequence (c, (xy, [long])
+.\" arg : arbitrary word
+.\" Result : prints \namearg, where
+.\" 'name' is in B, 'arg' in I
+.\"
+.de escarg
+. Text \f[B]\e\\$1\f[]\,\f[I]\\$2\/\f[]\\$3
+..
+.\" ====================================================================
+.\" .esc[] name arg [punct]
+.\"
+.\" Reference for escape sequence with a bracketed long argument
+.\" Args : 2 obligatory
+.\" name : suitable name for an escape sequence (c, (xy, [long])
+.\" arg : arbitrary text
+.\" Result : prints \name[arg], where 'name' is in CB, 'arg' in CI
+.\"
+.de esc[]
+. Text \f[CB]\e\\$1\[lB]\f[]\,\f[CI]\\$2\/\f[]\f[CB]\[rB]\f[]\\$3
+..
+.
+.\" ========= strings =========
+.
+.\" synopsis for string, with \*[]
+.de STRING
+. Text \[rs]*[\f[CB]\\$1\f[]] \\$2
+..
+.\" synopsis for a long string
+.de string
+. if \n[.$]=0 \
+. return
+. Text \f[CB]\[rs]*\[lB]\\$1\[rB]\f[]\\$2
+..
+.
+.\" ========= registers =========
+.
+.\" synopsis for registers, with \n[]
+.de REG
+. Text \[rs]n[\f[CB]\\$1\f[]]
+..
+.\" reference of a register, without decoration
+.de register
+. Text register
+. ie (\\n[.$] < 2) \
+. B \\$*
+. el \
+. BR \\$*
+..
+.
+.\" begin list [piloting a possible extension to man(7)]
+.de LS
+. nr saved-PD \\n[PD]
+. nr PD 0
+..
+.
+.\" end list [piloting a possible extension to man(7)]
+.de LE
+. nr PD \\n[saved-PD]
+..
+.
+.
+.\" end of macro definitions
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I groff
+is short for GNU
+.IR roff ,
+a free reimplementation of the AT&T device-independent
+.I troff \" AT&T
+typesetting system.
+.
+See
+.MR roff @MAN7EXT@
+for a survey of and background on
+.I roff
+systems.
+.
+.
+.P
+This document is intended as a reference.
+.
+The primary
+.I groff
+manual,
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is a better resource for learners,
+containing many examples and much discussion.
+.
+It is written in Texinfo;
+you can browse it interactively with \[lq]info groff\[rq].
+.
+Additional formats,
+including plain text,
+HTML,
+DVI,
+and PDF,
+may be available in
+.IR @DOCDIR@ .
+.
+.
+.P
+.I groff
+is also a name for an extended dialect of the
+.I roff
+language.
+.
+We use \[lq]roff\[rq] to denote features that are universal,
+or nearly so,
+among implementations of this family.
+.
+We apply the term \[lq]groff\[rq] to the language documented here,
+the GNU implementation of the overall system,
+the project that develops that system,
+and the command of that name.
+.
+.
+.P
+GNU
+.IR troff , \" GNU
+installed on this system as
+.MR @g@troff @MAN1EXT@ ,
+is the
+.I formatter:
+a program that reads device and font descriptions
+(\c
+.MR groff_font @MAN5EXT@ ),
+interprets the
+.I groff
+language expressed in text input files,
+and translates that input into a device-independent output format
+(\c
+.MR groff_out @MAN5EXT@ )
+that is usually then post-processed by an output driver to produce
+PostScript,
+PDF,
+HTML,
+DVI,
+or terminal output.
+.
+.
+.\" ====================================================================
+.SH "Input format"
+.\" ====================================================================
+.
+Input to GNU
+.I troff \" GNU
+is organized into lines separated by the Unix newline character
+(U+000A),
+and must be in one of two character encodings it can recognize:
+IBM code page 1047 on EBCDIC systems,
+and ISO\~Latin-1 (8859-1) otherwise.
+.
+Use of ISO\~646-1991:IRV (\[lq]US-ASCII\[rq]) or (equivalently) the
+\[lq]Basic Latin\[rq]
+subset of ISO\~10646 (\[lq]Unicode\[rq]) is recommended;
+see
+.MR groff_char @MAN7EXT@ .
+.
+The
+.MR preconv @MAN1EXT@
+preprocessor transforms other encodings,
+including UTF-8,
+to satisfy
+.IR @g@troff 's
+requirements.
+.
+.
+.\" ====================================================================
+.SH "Syntax characters"
+.\" ====================================================================
+.
+Several input characters are syntactically significant to
+.IR groff .
+.
+.
+.IP . 4n
+A dot at the beginning of an input line marks it as a
+.I control line.
+.
+It can also follow the
+.request .el
+and
+.request .nop
+requests,
+and the condition in
+.request .if ,
+.request .ie ,
+and
+.request .while
+requests.
+.
+The control character invokes requests and calls macros by the name that
+follows it.
+.
+The
+.request .cc
+request can change the control character.
+.
+.
+.IP \[aq]
+The neutral apostrophe is the
+.I "no-break control character,"
+recognized where the control character is.
+.
+It suppresses the (first) break implied by the
+.request .bp ,
+.request .cf ,
+.request .fi ,
+.request .fl ,
+.request .in ,
+.request .nf ,
+.request .rj ,
+.request .sp ,
+.request .ti ,
+and
+.request .trf
+requests.
+.
+The requested operation takes effect at the next break.
+.
+It makes
+.request .br
+nilpotent.
+.
+The no-break control character can be changed with the
+.request .c2
+request.
+.
+When formatted,
+.RB \[lq] \[aq] \[rq]
+may be typeset as a typographical quotation mark;
+use the
+.esc [aq]
+special character escape sequence to format a neutral apostrophe glyph.
+.
+.
+.IP \[dq]
+The neutral double quote can be used to enclose arguments to macros and
+strings,
+and is required if those arguments contain space or tab characters.
+.
+In the
+.request .ds ,
+.request .ds1 ,
+.request .as ,
+and
+.request .as1
+requests,
+an initial neutral double quote in the second argument is stripped off
+to allow embedding of leading spaces.
+.
+To include a double quote inside a quoted argument,
+use the
+.esc [dq]
+special character escape sequence
+(which also serves to typeset the glyph in text).
+.
+.
+.IP \[rs]
+A backslash introduces an escape sequence.
+.
+The escape character can be changed with the
+.request .ec
+request;
+.request .eo
+disables escape sequence recognition.
+.
+Use the
+.esc [rs]
+special character escape sequence to format a backslash glyph,
+and
+.esc e
+to typeset the glyph of the current escape character.
+.
+.
+.IP (
+An opening parenthesis is special only in certain escape sequences;
+when recognized,
+it introduces an argument of exactly two characters.
+.
+.I groff
+offers the more flexible square bracket syntax.
+.
+.
+.IP [
+An opening bracket is special only in certain escape sequences;
+when recognized,
+it introduces an argument (list) of any length,
+not including a closing bracket.
+.
+.
+.IP ]
+A closing bracket is special only when an escape sequence using an
+opening bracket as an argument delimiter is being interpreted.
+.
+It ends the argument (list).
+.
+.
+.P
+Additionally,
+the Control+A character (U+0001) in text is interpreted as a
+.I leader
+(see below).
+.
+.
+.P
+Horizontal white space characters are significant to
+.I groff,
+but trailing spaces on text lines are ignored.
+.\" slack text for widow/orphan control: trailing tabs are not
+.
+.
+.TP 8n
+.I space
+Space characters separate arguments in request invocations,
+macro calls,
+and string interpolations.
+.
+In text,
+they separate words.
+.
+Multiple adjacent space characters in text cause
+.I groff
+to attempt end-of-sentence detection on the preceding word
+(and trailing punctuation).
+.
+The amount of space between words and sentences is controlled by the
+.request .ss
+request.
+.
+When filling is enabled
+(the default),
+a line may be broken at a space.
+.
+When adjustment is enabled
+(the default),
+inter-word spaces are expanded until the output line reaches the
+configured length.
+.
+An adjustable but non-breaking space is available with
+.esc \[ti] .
+.
+To get a space of fixed width,
+use one of the escape sequences
+.squoted_char "\[rs]\~"
+(the escape character followed by a space),
+.esc 0 ,
+.esc | ,
+.esc \[ha] ,
+or
+.esc h ;
+see section \[lq]Escape sequences\[rq] below.
+.
+.
+.TP
+.I newline
+In text,
+a newline puts an inter-word space onto the output and,
+if filling is enabled,
+triggers end-of-sentence recognition on the preceding text.
+.
+See section \[lq]Line continuation\[rq] below.
+.
+.
+.TP
+.I tab
+A tab character in text causes the drawing position to advance to the
+next defined tab stop.
+.
+.
+.\" ====================================================================
+.SH "Tabs and leaders"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Tabs and
+.\" Leaders".
+The formatter interprets input horizontal tab characters
+(\[lq]tabs\[rq]) and Control+A characters (\[lq]leaders\[rq]) into
+movements to the next tab stop.
+.
+Tabs simply move to the next tab stop;
+leaders place enough periods to fill the space.
+.
+Tab stops are by default located every half inch measured from the
+drawing position corresponding to the beginning of the input line;
+see section \[lq]Page geometry\[rq] of
+.MR roff 7 .
+.
+Tabs and leaders do not cause breaks and therefore do not interrupt
+filling.
+.
+Tab stops can be configured with the
+.B ta
+request,
+and tab and leader glyphs with the
+.B tc
+and
+.B lc
+requests,
+respectively.
+.\" END Keep (roughly) parallel with groff.texi node "Tabs and Leaders".
+.
+.
+.\" ====================================================================
+.SH "Line continuation"
+.\" ====================================================================
+.
+When filling is enabled,
+input and output line breaks generally do not correspond.
+.
+The
+.I roff
+language therefore distinguishes input and output line continuation.
+.
+.
+.P
+A backslash
+.B \[rs]
+immediately followed by a newline,
+sometimes discussed as
+.BI \[rs] newline\c
+,
+suppresses the effects of that newline
+on the input.
+.
+The next input line thus retains the classification of its predecessor
+as a control or text line.
+.
+.BI \[rs] newline
+is useful for managing line lengths in the input during document
+maintenance;
+you can break an input line in the middle of a request invocation,
+macro call,
+or escape sequence.
+.
+Input line continuation is invisible to the formatter,
+with two exceptions:
+the
+.B \[or]
+operator recognizes the new input line,
+and the input line counter register
+.B .c
+is incremented.
+.
+.
+.P
+The
+.esc c
+escape sequence continues an
+.I output
+line.
+.
+Nothing on the input line after it is formatted.
+.
+In contrast to
+.BI \[rs] newline\c
+,
+a line after
+.esc c
+is treated as a new input line,
+so a control character is recognized at its beginning.
+.
+The visual results depend on whether filling is enabled.
+.
+An intervening control line that causes a break overrides
+.esc c ,
+flushing out the pending output line in the usual way.
+.
+The
+.register .int
+contains a positive value if the last output line was continued with
+.esc c ;
+this datum is associated with the
+environment.
+.
+.
+.\" ====================================================================
+.SH Colors
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Colors".
+.I groff
+supports color output with a variety of color spaces and up to 16 bits
+per channel.
+.
+Some devices,
+particularly terminals,
+may be more limited.
+.
+When color support is enabled,
+two colors are current at any given time:
+the
+.I stroke color,
+with which glyphs,
+rules (lines),
+and geometric objects like circles and polygons are drawn,
+and the
+.I fill color,
+which can be used to paint the interior of a closed geometric figure.
+.
+The
+.BR color ,
+.BR defcolor ,
+.BR gcolor ,
+and
+.B fcolor
+requests;
+.B \[rs]m
+and
+.B \[rs]M
+escape sequences;
+and
+.BR .color ,
+.BR .m ,
+and
+.B .M
+registers exercise color support.
+.
+.
+.P
+Each output device has a color named
+.RB \[lq] default \[rq],
+which cannot be redefined.
+.
+A device's default stroke and fill colors are not necessarily the same.
+.
+For the
+.BR dvi ,
+.BR html ,
+.BR pdf ,
+.BR ps ,
+and
+.B xhtml
+output devices,
+.I @g@troff
+automatically loads a macro file defining many color names at startup.
+.
+By the same mechanism,
+the devices supported by
+.MR grotty @MAN1EXT@
+recognize the eight standard ISO\~6429/ECMA-48 color names
+(also known vulgarly as \[lq]ANSI colors\[rq]).
+.\" END Keep (roughly) parallel with groff.texi node "Colors".
+.
+.
+.br
+.ne 3v
+.\" ====================================================================
+.SH Measurements
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Measurements".
+Numeric parameters that specify measurements are expressed as
+integers or decimal fractions with an optional
+.I scaling unit
+suffixed.
+.
+A scaling unit is a letter that immediately follows the last digit of a
+number.
+.
+Digits after the decimal point are optional.
+.
+.
+.P
+Measurements are scaled by the scaling unit and stored internally
+(with any fractional part discarded)
+in basic units.
+.
+The device resolution can therefore be obtained by storing a value of
+.RB \[lq] 1i \[rq]
+to a register.
+.
+The only constraint on the basic unit is that it is at least as small as
+any other unit.
+.\" That's a fib. A device resolution of around 2^31 would surely also
+.\" cause problems. But nobody does that.
+.
+.
+.P
+.LS
+.TP
+.B u
+Basic unit.
+.
+.TP
+.B i
+Inch;
+defined as 2.54\~centimeters.
+.
+.TP
+.B c
+Centimeter.
+.
+.TP
+.B p
+Point;
+a typesetter's unit used for measuring type size.
+.
+There are 72\~points to an inch.
+.
+.TP
+.B P
+Pica;
+another typesetter's unit.
+.
+There are 6\~picas to an inch and 12\~points to a pica.
+.
+.TP
+.BR s ,\~ z
+Scaled points and multiplication by the output device's
+.I sizescale
+parameter,
+respectively.
+.
+.TP
+.B f
+Multiplication by 65,536;
+.
+scales decimal fractions in the interval [0, 1] to 16-bit unsigned
+integers.
+.LE
+.
+.
+.P
+The magnitudes of other scaling units depend on the text formatting
+parameters in effect.
+.
+.
+.P
+.LS
+.TP
+.B m
+Em;
+an em is equal to the current type size in points.
+.
+.TP
+.B n
+En;
+an en is one-half em.
+.
+.TP
+.B v
+Vee;
+distance between text baselines.
+.
+.TP
+.B M
+Hundredth of an em.
+.LE
+.\" END Keep (roughly) parallel with groff.texi node "Measurements".
+.
+.
+.\" ====================================================================
+.SS "Motion quanta"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Motion Quanta".
+An output device's basic unit
+.B u
+is not necessarily its smallest addressable length;
+.B u
+can be smaller to avoid problems with integer roundoff.
+.
+The minimum distances that a device can work with in the horizontal and
+vertical directions are termed its
+.I "motion quanta,"
+stored in the
+.B .H
+and
+.B .V
+registers,
+respectively.
+.
+Measurements are rounded to applicable motion quanta.
+.
+Half-quantum fractions round toward zero.
+.\" END Keep (roughly) parallel with groff.texi node "Motion Quanta".
+.
+.
+.\" ====================================================================
+.SS "Default units"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Default Units".
+A general-purpose register
+(one created or updated with the
+.B nr
+request;
+see section \[lq]Registers\[rq] below)
+is implicitly dimensionless,
+or reckoned in basic units if interpreted in a measurement context.
+.
+But it is convenient for many requests and escape sequences to infer a
+scaling unit for an argument if none is specified.
+.
+An explicit scaling unit
+(not after a closing parenthesis)
+can override an undesirable default.
+.
+Effectively,
+the default unit is suffixed to the expression if a scaling unit is not
+already present.
+.
+GNU
+.IR troff 's \" GNU
+use of integer arithmetic should also be kept in mind;
+see below.
+.\" END Keep (roughly) parallel with groff.texi node "Default Units".
+.
+.
+.\" ====================================================================
+.SH "Numeric expressions"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Numeric
+.\" expressions".
+A
+.I numeric expression
+evaluates to an integer.
+.
+The following operators are recognized.
+.\"evaluates to an integer:
+.\"it can be as simple as a literal
+.\".RB \[lq] 0 \[rq]
+.\"or it can be a complex sequence of register and string interpolations
+.\"interleaved with measurement operators.
+.
+.
+.P
+.TS
+Rf(CR) L.
++ addition
+\- subtraction
+* multiplication
+/ truncating division
+% modulus
+_
+\f[R]unary\f[] + assertion, motion, incrementation
+\f[R]unary\f[] \- negation, motion, decrementation
+_
+; scaling
+>? maximum
+<? minimum
+_
+< less than
+> greater than
+<= less than or equal
+>= greater than or equal
+\&= equal
+== equal
+_
+& logical conjunction (\[lq]and\[rq])
+: logical disjunction (\[lq]or\[rq])
+! logical complementation (\[lq]not\[rq])
+_
+( ) precedence
+_
+| boundary-relative motion
+.TE
+.
+.
+.P
+.I @g@troff
+provides a set of mathematical and logical operators familiar to
+programmers\[em]as well as some unusual ones\[em]but supports only
+integer arithmetic.
+.
+(Provision is made for interpreting and
+reporting decimal fractions in certain cases.)
+.
+The internal data type used for computing results is usually a 32-bit
+signed integer,
+which suffices to represent magnitudes within a range of \[+-]2
+billion.
+.
+(If that's not enough, see
+.MR groff_tmac @MAN5EXT@
+for the
+.I 62bit.tmac
+macro package.)
+.
+.
+.P
+Arithmetic infix operators perform a function on the numeric expressions
+to their left and right;
+they are
+.B +
+(addition),
+.B \-
+(subtraction),
+.B *
+(multiplication),
+.B /
+(truncating division),
+and
+.B %
+(modulus).
+.
+.I Truncating division
+rounds to the integer nearer to zero,
+no matter how large the fractional portion.
+.
+Overflow and division
+(or modulus)
+by zero are errors and abort evaluation of a numeric expression.
+.
+.
+.P
+Arithmetic unary operators operate on the numeric expression to their
+right;
+they are
+.B \-
+(negation)
+and
+.B +
+(assertion\[em]for completeness;
+it does nothing).
+.
+The unary minus must often be used with parentheses to avoid confusion
+with the decrementation operator,
+discussed below.
+.
+.
+.P
+The sign of the modulus of operands of mixed signs is determined by the
+sign of the first.
+.
+Division and modulus operators satisfy the following property:
+given a
+.RI dividend\~ a
+and a
+.RI divisor\~ b ,
+a
+.RI quotient\~ q
+formed by
+.RB \[lq] "(a / b)" \[rq]
+and a
+.RI remainder\~ r
+by
+.RB \[lq] "(a % b)" \[rq],
+then
+.IR qb \~+\~ r \~=\~ a .
+.
+.
+.P
+GNU
+.IR troff 's \" GNU
+scaling operator,
+used with parentheses as
+.BI ( c ; e )\c
+,
+evaluates a numeric
+.RI expression\~ e
+.RI using\~ c
+as the default scaling unit.
+.
+If
+.I c
+is omitted,
+scaling units are ignored in the evaluation
+.RI of\~ e .
+.
+GNU
+.I troff \" GNU
+also provides a pair of operators to compute the extrema of two
+operands:
+.B >?\&
+(maximum)
+and
+.B <?\&
+(minimum).
+.
+.
+.P
+Comparison operators comprise
+.B <
+(less than),
+.B >
+(greater than),
+.B <=
+(less than or equal),
+.B >=
+(greater than or equal),
+and
+.B =
+(equal).
+.
+.B ==
+is a synonym for
+.BR = .
+.
+When evaluated,
+a comparison is replaced with
+.RB \[lq] 0 \[rq]
+if it is false and
+.RB \[lq] 1 \[rq]
+if true.
+.
+In the
+.I roff
+language,
+positive values are true,
+others false.
+.
+.
+.P
+We can operate on truth values with the logical operators
+.B &
+(logical conjunction or \[lq]and\[rq])
+and
+.B :
+(logical disjunction or \[lq]or\[rq]).
+.
+They evaluate as comparison operators do.
+.
+A logical complementation (\[lq]not\[rq]) operator,
+.B !\&,
+works only within
+.RB \[lq] if \[rq],
+.RB \[lq] ie \[rq],
+and
+.RB \[lq] while \[rq]
+requests.
+.
+.\" This is worded to avoid implying that the operator doesn't apply to
+.\" conditional expressions in general, albeit without mentioning them
+.\" because they're out of scope.
+Furthermore,
+.B !\&
+is recognized only at the beginning of a numeric expression not
+contained by another numeric expression.
+.
+In other words,
+it must be the \[lq]outermost\[rq] operator.
+.
+Including it elsewhere in the expression produces a warning in the
+.RB \%\[lq] number \[rq]
+category
+(see
+.MR @g@troff @MAN1EXT@ ),
+and its expression evaluates false.
+.
+This unfortunate limitation maintains compatibility with AT&T
+.IR troff .\" AT&T
+.
+Test a numeric expression for falsity by comparing it to a false value.
+.
+.
+.P
+The
+.I roff
+language has no operator precedence:
+expressions are evaluated strictly from left to right,
+in contrast to schoolhouse arithmetic.
+.
+Use parentheses
+.B ( )
+to impose a desired precedence upon subexpressions.
+.
+.
+.P
+For many requests and escape sequences that cause motion on the page,
+the unary operators
+.B +
+and
+.B \-
+work differently when leading a numeric expression.
+.
+They then indicate a motion relative to the drawing position:
+positive is down in vertical contexts,
+right in horizontal ones.
+.
+.
+.P
+.B +
+and
+.B \-
+are also treated differently by the following requests and escape
+sequences:
+.BR bp ,
+.BR in ,
+.BR ll ,
+.BR pl ,
+.BR pn ,
+.BR po ,
+.BR ps ,
+.BR pvs ,
+.BR rt ,
+.BR ti ,
+.BR \[rs]H ,
+.BR \[rs]R ,
+and
+.BR \[rs]s .
+.
+Here,
+leading plus and minus signs serve as incrementation and decrementation
+operators,
+respectively.
+.
+To negate an expression,
+subtract it from zero
+or include the unary minus in parentheses with its argument.
+.\" @xref{Setting Registers}, for examples.
+.
+.
+.P
+A leading
+.B \[or]
+operator indicates a motion relative not to the drawing position but to
+a boundary.
+.
+For horizontal motions,
+the measurement specifies a distance relative to a drawing position
+corresponding to the beginning of the
+.I input
+line.
+.
+By default,
+tab stops reckon movements in this way.
+Most escape sequences do not;
+.\" XXX: Which ones do?
+.B \[or]
+tells them to do so.
+.
+For vertical motions,
+the
+.B \[or]
+operator specifies a distance from the first text baseline on the page
+or in the current diversion,
+using the current vertical spacing.
+.
+.
+.P
+The
+.B \[rs]B
+escape sequence tests its argument for validity as a numeric expression.
+.
+.
+.br
+.ne 2v
+.P
+A register interpolated as an operand in a numeric expression must have
+an Arabic format;
+luckily,
+this is the default.\" @xref{Assigning Register Formats}.
+.
+.
+.P
+Due to the way arguments are parsed,
+spaces are not allowed in numeric expressions unless the (sub)expression
+containing them is surrounded by parentheses.
+.\"@xref{Request and Macro Arguments}, and @ref{Conditionals and Loops}.
+.\" END Keep (roughly) parallel with groff.texi node "Numeric
+.\" expressions".
+.
+.
+.\" ====================================================================
+.SH Identifiers
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Identifiers".
+An
+.I identifier
+labels a GNU
+.I troff \" GNU
+datum such as a register,
+name
+(macro,
+string,
+or diversion),
+typeface,
+color,
+special character,
+character class,
+environment,
+or stream.
+.
+Valid identifiers consist of one or more ordinary characters.
+.
+An
+.I ordinary character
+is an input character that is not the escape character,
+a leader,
+tab,
+newline,
+or invalid as GNU
+.I troff \" GNU
+input.
+.
+.
+.\" XXX: We might move this discussion earlier since it is applicable to
+.\" troff input in general, and include a reference to the `trin`
+.\" request.
+.P
+Invalid input characters are subset of control characters
+(from the sets \[lq]C0 Controls\[rq] and \[lq]C1 Controls\[rq] as
+Unicode describes them).
+.
+When
+.I @g@troff
+encounters one in an identifier,
+it produces a warning in category
+.RB \%\[lq] input \[rq]
+(see section \[lq]Warnings\[rq] in
+.MR @g@troff @MAN1EXT@ ).
+.
+They are removed during interpretation:
+an identifier \[lq]foo\[rq],
+followed by an invalid
+character and then \[lq]bar\[rq],
+is processed as \[lq]foobar\[rq].
+.
+.
+.P
+On a machine using the ISO 646,
+8859,
+or 10646 character encodings,
+invalid input characters are
+.BR 0x00 ,
+.BR 0x08 ,
+.BR 0x0B ,
+.BR 0x0D \[en] 0x1F ,
+and
+.BR 0x80 \[en] 0x9F .
+.
+On an EBCDIC host,
+they are
+.BR 0x00 \[en] 0x01 ,
+.BR 0x08 ,
+.BR 0x09 ,
+.BR 0x0B ,
+.BR 0x0D \[en] 0x14 ,
+.BR 0x17 \[en] 0x1F ,
+and
+.BR 0x30 \[en] 0x3F .
+.
+Some of these code points are used by
+.I @g@troff
+internally,
+making it non-trivial to extend the program to accept UTF-8 or other
+encodings that use characters from these ranges.
+.
+.
+.P
+An identifier with a closing bracket (\[lq]]\[rq]) in its name can't be
+accessed with bracket-form escape sequences that expect an identifier as
+a parameter.
+.
+Similarly,
+the
+identifier \[lq](\[rq] can't be interpolated
+.I except
+with bracket forms.
+.
+.
+.P
+If you begin a macro,
+string,
+or diversion name with either of the characters \[lq][\[rq] or
+\[lq]]\[rq],
+you foreclose use of the
+.MR @g@refer @MAN1EXT@
+preprocessor,
+which recognizes \[lq].[\[rq] and \[lq].]\[rq] as bibliographic
+reference delimiters.
+.
+.
+.P
+The escape sequence
+.B \[rs]A
+tests its argument for validity as an identifier.
+.
+.
+.P
+How GNU
+.I troff \" GNU
+handles the interpretation of an undefined identifier depends on the
+context.
+.
+There is no way to invoke an undefined request;
+such syntax is interpreted as a macro call instead.
+.
+If the identifier is interpreted as a string,
+macro,
+or diversion,
+.I @g@troff
+emits a warning in category
+.RB \[lq] mac \[rq],
+defines it as empty,
+and interpolates nothing.
+.
+If the identifier is interpreted as a register,
+.I @g@troff
+emits a warning in category
+.RB \[lq] reg \[rq],
+initializes it to zero,
+and interpolates that value.
+.
+See section \[lq]Warnings\[rq] in
+.MR @g@troff @MAN1EXT@ ,
+and subsection \[lq]Interpolating registers\[rq] and section
+\[lq]Strings\[rq] below.
+.
+Attempting to use an undefined
+typeface,
+style,
+special character,
+color,
+character class,
+environment,
+or stream generally provokes an error diagnostic.
+.
+.
+.P
+Identifiers for requests,
+macros,
+strings,
+and diversions share one name
+space;
+special characters and character classes another.
+.
+No other object types do.
+.\" END Keep (roughly) parallel with groff.texi node "Identifiers".
+.
+.
+.\" ====================================================================
+.SH "Control characters"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Control
+.\" Characters".
+.\" The mechanism of using @code{roff}'s control characters to invoke
+.\" requests and call macros was introduced in @ref{Requests and Macros}.
+Control characters are recognized only at the beginning of an input
+line,
+or at the beginning of the branch of a control structure request;
+.\" see @ref{Conditionals and Loops}.
+see section \[lq]Control structures\[rq] below.
+.
+.
+.P
+A few requests cause a break implicitly;
+use the no-break control character to prevent the break.
+.
+Break suppression is its sole behavioral distinction.
+.
+Employing the no-break control character to invoke requests that don't
+cause breaks is harmless but poor style.
+.
+.
+.P
+The control character
+.RB \[lq] .\& \[rq]
+and the no-break control character
+.RB \[lq] \|\[aq]\| \[rq]
+can be changed with the
+.B cc
+and
+.B c2
+requests,
+respectively.
+.
+Within a macro definition,
+.\" you might wish to know
+register
+.B .br
+indicates the control character used to call it.
+.\" END Keep (roughly) parallel with groff.texi node "Control
+.\" Characters".
+.
+.
+.\" ====================================================================
+.SH "Invoking requests"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Invoking
+.\" Requests".
+A control character is optionally followed by tabs and/or spaces and
+then an identifier naming a request or macro.
+.
+The invocation of an unrecognized request is interpreted as a macro
+call.
+.
+Defining a macro with the same name as a request replaces the request.
+.
+Deleting a request name with the
+.B rm
+request makes it unavailable.
+.
+The
+.B als
+request can alias requests,
+permitting them to be wrapped or non-destructively replaced.
+.
+See section \[lq]Strings\[rq] below.
+.
+.
+.br
+.ne 4v
+.P
+There is no inherent limit on argument length or quantity.
+.
+Most requests take one or more arguments,
+and ignore any they do not expect.
+.
+A request may be separated from its arguments by tabs or spaces,
+but only spaces can separate an argument from its successor.
+.
+Only one between arguments is necessary;
+any excess is ignored.
+.
+GNU
+.I troff \" GNU
+does not allow tabs for argument separation.
+.\" @footnote{In compatibility mode, a space is not necessary after a
+.\" request or macro name of two characters' length. Also, Plan@tie{}9
+.\" @code{troff} allows tabs to separate arguments.}
+.
+.
+.br
+.ne 3v
+.P
+Generally,
+a space
+.I within
+a request argument is not relevant,
+not meaningful,
+or is supported by bespoke provisions,
+as with the
+.B tl
+request's delimiters.
+.
+Some requests,
+like
+.BR ds ,
+interpret the remainder of the control line as a single argument.
+.
+See section \[lq]Strings\[rq] below.
+.
+.
+.P
+Spaces and tabs immediately after a control character are ignored.
+.
+Commonly,
+authors structure the source of documents or macro files with them.
+.\" END Keep (roughly) parallel with groff.texi node "Requests".
+.
+.
+.\" ====================================================================
+.SH "Calling macros"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Calling Macros".
+If a macro of the desired name does not exist when called,
+it is created,
+assigned an empty definition,
+and a warning in category
+.RB \[lq] mac \[rq]
+is emitted.
+.
+Calling an undefined macro
+.I does
+end a macro definition naming it as its end macro
+(see section \[lq]Writing macros\[rq] below).
+.
+.
+.P
+To embed spaces
+.I within
+a macro argument,
+enclose the argument in neutral double quotes
+.RB \[oq] \|\[dq]\| \[cq].
+.
+Horizontal motion escape sequences are sometimes a better choice for
+arguments to be formatted as text.
+.
+.
+.P
+The foregoing raises the question of how to embed neutral double quotes
+or backslashes in macro arguments when
+.I those
+characters are desired as literals.
+.
+In GNU
+.IR troff , \" GNU
+the special character escape sequence
+.B \[rs][rs]
+produces a backslash and
+.B \[rs][dq]
+a neutral double quote.
+.
+.
+.P
+In GNU
+.IR troff 's \" GNU
+AT&T compatibility mode,
+these characters remain available as
+.B \[rs](rs
+and
+.BR \[rs](dq ,
+respectively.
+.
+AT&T
+.I troff \" AT&T
+did not consistently define these special characters,
+.\" It seems that AT&T troff never recognized \(rs, though DWB 3.3
+.\" defined \(bs as an alias of "\" on its "Latin1" device, in
+.\" deliberate(?) collision with the Bell System logo identifier. It
+.\" also defined \(dq for several devices (pcl, Latin1, nroff, ...)
+.\" along with \(aq.
+but its descendants can be made to support them.
+.
+See
+.MR groff_font @MAN5EXT@ .
+.
+If even that is not feasible,
+.\" Nope nope nope--if you're this much of a masochist, go read Texinfo.
+see the \[lq]Calling Macros\[rq] section of the
+.I groff
+Texinfo manual for the complex macro argument quoting rules of AT&T
+.IR troff . \" AT&T
+.\" END Keep (roughly) parallel with groff.texi node "Calling Macros".
+.
+.
+.\" ====================================================================
+.SH "Using escape sequences"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Using Escape
+.\" Sequences".
+Whereas requests must occur on control lines,
+escape sequences can occur intermixed with text and may appear in
+arguments to requests,
+macros,
+and other escape sequences.
+.
+An escape sequence is introduced by the escape character,
+a backslash
+.BR \[rs] .
+.\" (but see the @code{ec} request below)
+.
+The next character selects the escape's function.
+.
+.
+.P
+Escape sequences vary in length.
+.
+Some take an argument,
+and of those,
+some have different syntactical forms for a one-character,
+two-character,
+or arbitrary-length argument.
+.
+Others accept
+.I only
+an arbitrary-length argument.
+.
+In the former scheme,
+a one-character argument follows the function character immediately,
+an opening parenthesis
+.RB \[lq] ( \[rq]
+introduces a two-character argument
+(no closing parenthesis is used),
+and an argument of arbitrary length is enclosed in brackets
+.RB \[lq] [] \[rq].
+.
+In the latter scheme,
+the user selects a delimiter character.
+.
+A few escape sequences are idiosyncratic,
+and support both of the foregoing conventions
+.RB ( \|\[rs]s ),
+designate their own termination sequence
+.RB ( \|\[rs]? ),
+consume input until the next newline
+.RB ( \|\[rs]! ,
+.BR \|\[rs]" ,
+.BR \|\[rs]# ),
+or support an additional modifier character
+.RB ( \|\[rs]s
+again,
+and
+.BR \|\[rs]n ).
+.\" As with requests, use of some escape sequences in source documents
+.\" may interact poorly with a macro package you use; consult its
+.\" documentation to learn of ``safe'' sequences or alternative
+.\" facilities it provides to achieve the desired result.
+.
+.
+.P
+If an escape character is followed by a character that does not
+identify a defined operation,
+the escape character is ignored
+(producing
+a diagnostic of the
+.RB \[lq] escape \[rq]
+warning category,
+which is not enabled by default)
+and the following character is processed normally.
+.
+.
+.P
+Escape sequence interpolation is of higher precedence than escape
+sequence argument interpretation.
+.
+This rule affords flexibility in using escape sequences to construct
+parameters to other escape sequences.
+.
+.
+.P
+The escape character can be interpolated
+.RB ( \[rs]e ).
+.
+Requests permit the escape mechanism to be deactivated
+.RB ( eo )
+and restored,
+or the escape character changed
+.RB ( ec ),
+and to save and restore it
+.RB ( ecs
+and
+.BR ecr ).
+.\" END Keep (roughly) parallel with groff.texi node "Using Escape
+.\" Sequences".
+.
+.
+.\" ====================================================================
+.SH Delimiters
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Delimiters".
+Some escape sequences that require parameters use delimiters.
+.
+The neutral apostrophe
+.B \[aq]
+is a popular choice and shown in this document.
+.
+The neutral double quote
+.B \[dq]
+is also commonly seen.
+.
+Letters,
+numerals,
+and leaders can be used.
+.
+Punctuation characters are likely better choices,
+except for those defined as infix operators in numeric expressions;
+see below.
+.
+.
+.br
+.ne 2v
+.P
+The following escape sequences don't take arguments and thus are allowed
+as delimiters:
+.BI \[rs] space\c
+,
+.BR \[rs]% ,
+.BR \[rs]| ,
+.BR \[rs]\[ha] ,
+.BR \[rs]{ ,
+.BR \[rs]} ,
+.BR \[rs]\[aq] ,
+.BR \[rs]\[ga] ,
+.BR \[rs]\- ,
+.BR \[rs]_ ,
+.BR \[rs]! ,
+.BR \[rs]? ,
+.BR \[rs]) ,
+.BR \[rs]/ ,
+.BR \[rs], ,
+.BR \[rs]& ,
+.BR \[rs]: ,
+.BR \[rs]\[ti] ,
+.BR \[rs]0 ,
+.BR \[rs]a ,
+.BR \[rs]c ,
+.BR \[rs]d ,
+.BR \[rs]e ,
+.BR \[rs]E ,
+.BR \[rs]p ,
+.BR \[rs]r ,
+.BR \[rs]t ,
+and
+.BR \[rs]u .
+.
+However,
+using them this way is discouraged;
+they can make the input confusing to read.
+.
+.
+.P
+A few escape sequences,
+.BR \[rs]A ,
+.BR \[rs]b ,
+.BR \[rs]o ,
+.BR \[rs]w ,
+.BR \[rs]X ,
+and
+.BR \[rs]Z ,
+accept a newline as a delimiter.
+.
+Newlines that serve as delimiters continue to be recognized as input
+line terminators.
+.
+Use of newlines as delimiters in escape sequences is also discouraged.
+.
+.
+.br
+.ne 2v
+.P
+Finally,
+the escape sequences
+.BR \[rs]D ,
+.BR \[rs]h ,
+.BR \[rs]H ,
+.BR \[rs]l ,
+.BR \[rs]L ,
+.BR \[rs]N ,
+.BR \[rs]R ,
+.BR \[rs]s ,
+.BR \[rs]S ,
+.BR \[rs]v ,
+and
+.B \[rs]x
+prohibit many delimiters.
+.
+.
+.RS
+.IP \[bu] 2n
+the numerals 0\[en]9 and the decimal point
+.RB \[lq] . \[rq]
+.
+.
+.IP \[bu]
+the (single-character) operators
+.B +\-/*%<>=&:()
+.
+.
+.IP \[bu]
+any escape sequences other than
+.BR \[rs]% ,
+.BR \[rs]: ,
+.BR \[rs]{ ,
+.BR \[rs]} ,
+.BR \[rs]\[aq] ,
+.BR \[rs]\[ga] ,
+.BR \[rs]\- ,
+.BR \[rs]_ ,
+.BR \[rs]! ,
+.BR \[rs]/ ,
+.BR \[rs]c ,
+.BR \[rs]e ,
+and
+.B \[rs]p
+.RE
+.
+.
+.P
+Delimiter syntax is complex and flexible primarily for historical
+reasons;
+the foregoing restrictions need be kept in mind mainly when using
+.I groff
+in AT&T compatibility mode.
+.
+GNU
+.I troff \" GNU
+keeps track of the nesting depth of escape sequence interpolations,
+so the only characters you need to avoid using as delimiters are those
+that appear in the arguments you input,
+not any that result from interpolation.
+.
+Typically,
+.B \[aq]
+works fine.
+.
+See section \[lq]Implementation differences\[rq] in
+.MR groff_diff @MAN7EXT@ .
+.\" END Keep (roughly) parallel with groff.texi node "Delimiters".
+.
+.
+.\" ====================================================================
+.SH "Dummy characters"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Dummy
+.\" Characters".
+As discussed in
+.MR roff @MAN7EXT@ ,
+the first character on an input line is treated specially.
+.
+Further,
+formatting a glyph has many
+consequences on formatter state
+(see section \[lq]Environments\[rq] below).
+.
+Occasionally,
+we want to escape this context or embrace some of those consequences
+without actually rendering a glyph to the output.
+.
+.B \[rs]&
+interpolates a dummy character,
+which is constitutive of output but invisible.
+.
+Its presence alters the interpretation context of a subsequent input
+character,
+and enjoys several applications:
+preventing the insertion of extra space after an end-of-sentence
+character,
+preventing interpretation of a control character at the beginning of an
+input line,
+preventing kerning between two glyphs,
+and permitting the
+.B tr
+request to remap a character to \[lq]nothing\[rq].
+.
+.B \[rs])
+works as
+.B \[rs]&
+does,
+except that it does not cancel a pending end-of-sentence state.
+.\" END Keep (roughly) parallel with groff.texi node "Dummy Characters".
+.
+.
+.\" ====================================================================
+.SH "Control structures"
+.\" ====================================================================
+.
+.I groff
+has \[lq]if\[rq] and \[lq]while\[rq] control structures like other
+languages.
+.
+However,
+the syntax for grouping multiple input lines in the branches or bodies
+of these structures is unusual.
+.
+.
+.P
+They have a common form:
+the request name is
+(except for
+.request .el
+\[lq]else\[rq])
+followed by a conditional expression
+.IR cond-expr ;
+the remainder of the line,
+.IR anything ,
+is interpreted as if it were an input line.
+.
+Any quantity of spaces between arguments to requests serves only to
+separate them;
+leading spaces in
+.I anything
+are therefore not seen.
+.
+.I anything
+effectively
+.I cannot
+be omitted;
+if
+.I cond-expr
+is true and
+.I anything
+is empty,
+the newline at the end of the control line is interpreted as a blank
+line
+(and therefore a blank text line).
+.
+.
+.P
+It is frequently desirable for a control structure to govern more than
+one request,
+macro call,
+or text line,
+or a combination of the foregoing.
+.
+The opening and closing brace escape sequences
+.esc {
+and
+.esc }
+perform such grouping.
+.
+Brace escape sequences outside of control structures have no meaning and
+produce no output.
+.
+.
+.P
+.esc {
+should appear
+(after optional spaces and tabs)
+immediately subsequent to the request's conditional expression.
+.
+.esc }
+should appear on a line with other occurrences of itself as necessary to
+match
+.esc {
+sequences.
+.
+It can be preceded by a control character,
+spaces,
+and tabs.
+.
+Input after any quantity of
+.esc }
+sequences on the same line is processed only if all the preceding
+conditions to which they correspond are true.
+.
+Furthermore,
+a
+.esc }
+closing the body of a
+.request .while
+request must be the last such escape sequence on an input line.
+.
+.
+.\" ====================================================================
+.SS "Conditional expressions"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Operators in
+.\" Conditionals".
+The
+.request .if ,
+.request .ie ,
+and
+.request .while
+requests test the truth values of numeric expressions.
+.
+They also support several additional Boolean operators;
+the members of this expanded class are termed
+.IR "conditional expressions" ;
+their truth values are as shown below.
+.
+.
+.br
+.ne 3v
+.P
+.TS
+rf(BI) lB
+rB lx.
+cond-expr\f[R].\|.\|. .\|.\|.is true if.\|.\|.
+_
+T{
+.BI \[aq] s1 \[aq] s2 \[aq]
+T} T{
+.I s1
+produces the same formatted output as
+.IR s2 .
+T}
+T{
+.BI c\~ g
+T} T{
+a glyph
+.I g
+is available.
+T}
+T{
+.BI d\~ m
+T} T{
+a string,
+macro,
+diversion,
+or request
+.I m
+is defined.
+T}
+e T{
+the current page number is even.
+T}
+T{
+.BI F\~ f
+T} T{
+a font named
+.I f
+is available.
+T}
+T{
+.BI m\~ c
+T} T{
+a color named
+.I c
+is defined.
+T}
+n T{
+the formatter is in
+.I nroff
+mode.
+T}
+o T{
+the current page number is odd.
+T}
+T{
+.BI r\~ n
+T} T{
+a register named
+.I n
+is defined.
+T}
+T{
+.BI S\~ s
+T} T{
+a font style named
+.I s
+is available.
+T}
+t T{
+the formatter is in
+.I troff
+mode.
+T}
+v T{
+n/a
+(historical artifact;
+always false).
+T}
+.TE
+.
+.
+.br
+.ne 2v
+.P
+If the first argument to an
+.BR .if ,
+.BR .ie ,
+or
+.B .while
+request begins with a non-alphanumeric character apart from
+.B !\&
+(see below);
+it performs an
+.I output comparison test.
+.
+Shown first in the table above,
+the
+.I output comparison operator
+interpolates a true value if formatting its comparands
+.I s1
+and
+.I s2
+produces the same output commands.
+.
+Other delimiters can be used in place of the neutral apostrophes.
+.
+.I @g@troff
+formats
+.I s1
+and
+.I s2
+in separate environments;
+after the comparison,
+the resulting data are discarded.
+.
+The resulting glyph properties,
+including font family,
+style,
+size,
+and
+slant,
+must match,
+but not necessarily the requests and/or escape sequences used to obtain
+them.
+.
+Motions must match in orientation and magnitude to within the applicable
+horizontal or vertical motion quantum of the device,
+after rounding.
+.
+.\" TODO: Uncomment and add forward reference when we add a "GNU troff
+.\" internals" subsection to this page.
+.\"(All of this is to say that the lists of output nodes created by
+.\"formatting
+.\".I s1
+.\"and
+.\".I s2
+.\"must be identical.)
+.
+.
+.P
+Surround the comparands with
+.B \[rs]?\&
+to avoid formatting them;
+this causes them to be compared character by character,
+as with string comparisons in other programming languages.
+.
+Since comparands protected with
+.B \[rs]?\&
+are read in copy mode,
+they need not even be valid
+.I groff
+syntax.
+.
+The escape character is still lexically recognized,
+however,
+and consumes the next character.
+.
+.
+.P
+The above operators can't be combined with most others,
+but a leading
+.RB \[lq] !\& \[rq],
+not followed immediately by spaces or tabs,
+complements an expression.
+.
+Spaces and tabs are optional immediately after the
+.RB \[lq] c \[rq],
+.RB \[lq] d \[rq],
+.RB \[lq] F \[rq],
+.RB \[lq] m \[rq],
+.RB \[lq] r \[rq],
+and
+.RB \[lq] S \[rq]
+operators,
+but right after
+.RB \[lq] !\& \[rq],
+they end the predicate and the conditional evaluates true.
+.
+(This bizarre behavior maintains compatibility with AT&T
+.IR troff .)
+.\" END Keep (roughly) parallel with groff.texi node "Operators in
+.\" Conditionals".
+.
+.
+.\" ====================================================================
+.SH "Syntax reference conventions"
+.\" ====================================================================
+.
+In the following request and escape sequence specifications,
+most argument names were chosen to be descriptive.
+.
+A few denotations may require introduction.
+.
+.
+.P
+.LS
+.RS
+.
+.TPx
+.I c
+denotes a single input character.
+.
+.TPx
+.I font
+a font either specified as a font name or a numeric mounting position.
+.
+.TPx
+.I anything
+all characters up to the end of the line,
+to the ending delimiter for the escape sequence,
+or within
+.esc {
+and
+.esc } .
+.
+Escape sequences may generally be used freely in
+.IR anything ,
+except when it is read in copy mode.
+.
+.TPx
+.I message
+is a character sequence to be emitted on the standard error stream.
+.
+Special character escape sequences are
+.I not
+interpreted.
+.
+.TPx
+.I n
+is a numeric expression that evaluates to a non-negative integer.
+.
+.TPx
+.I npl
+is a numeric expression constituting a count of subsequent
+.I productive
+input lines;
+that is,
+those that directly produce formatted output.
+.
+Text lines produce output,
+as do control lines containing requests like
+.request .tl
+or escape sequences like
+.esc D .
+.
+Macro calls are not themselves productive,
+but their interpolated contents can be.
+.
+.TPx
+.I \[+-]N
+is a numeric expression with a meaning dependent on its sign.
+.RE
+.LE
+.
+.
+.P
+If a numeric expression presented as
+.I \[+-]N
+starts with a
+.squoted_char +
+sign,
+an increment in the amount of
+.RI of\~ N
+is applied to the value applicable to the request or escape sequence.
+.
+If it starts with a
+.squoted_char \-
+sign,
+a decrement of magnitude
+.I N
+is applied instead.
+.
+Without a sign,
+.I N
+replaces any existing value.
+.
+A leading minus sign
+.RI in\~ N
+is always interpreted as a decrementation operator,
+not an algebraic sign.
+.
+To assign a register a negative value or the negated value of another
+register,
+enclose it with its operand in
+parentheses or subtract it from zero.
+.
+If a prior value does not exist
+(the register was undefined),
+an increment or decrement is applied as if to\~0.
+.
+.
+.\" ====================================================================
+.SH "Request short reference"
+.\" ====================================================================
+.
+Not all details of request behavior are outlined here.
+.
+See the
+.I groff
+Texinfo manual or,
+for features new to GNU
+.IR troff , \" GNU
+.MR groff_diff @MAN7EXT@ .
+.
+.
+.P
+.LS
+.
+.TPx
+.REQ .ab
+Abort processing;
+exit with failure status.
+.
+.TPx
+.REQ .ab message
+Abort processing;
+write
+.I message
+to the standard error stream and exit with failure status.
+.
+.
+.TPx
+.REQ .ad
+Enable output line alignment and adjustment using the mode stored in
+.BR \[rs]n[.j] .
+.
+.
+.TPx
+.REQ .ad c
+Enable output line alignment and adjustment in mode
+.I c
+.RI ( c =\c
+.BR b , c , l , n , r ).
+.
+Sets
+.BR \[rs]n[.j] .
+.
+.
+.TPx
+.REQ .af "register c"
+Assign format
+.I c
+to
+.IR register ,
+where
+.I c
+is
+.RB \[lq] i \[rq],
+.RB \[lq] I \[rq],
+.RB \[lq] a \[rq],
+.RB \[lq] A \[rq],
+or a sequence of decimal digits whose quantity denotes the minimum width
+in digits to be used when the register is interpolated.
+.
+.RB \[lq] i \[rq]
+and
+.RB \[lq] a \[rq]
+indicate Roman numerals and basic Latin alphabetics,
+respectively,
+in the lettercase specified.
+.
+The default is
+.BR 0 .
+.
+.TPx
+.REQ .aln "new old"
+Create alias
+(additional name)
+.I new
+for existing register named
+.IR old .
+.
+.TPx
+.REQ .als "new old"
+Create alias
+(additional name)
+.I new
+for existing request,
+string,
+macro,
+or diversion
+.IR old .
+.
+.TPx
+.REQ .am "macro"
+Append to
+.I macro
+until
+.B ..\&
+is encountered.
+.
+.TPx
+.REQ .am "macro end"
+Append to
+.I macro
+until
+.BI . end
+is called.
+.
+.TPx
+.REQ .am1 "macro"
+Same as
+.request .am
+but with compatibility mode switched off during macro expansion.
+.
+.TPx
+.REQ .am1 "macro end"
+Same as
+.request .am
+but with compatibility mode switched off during macro expansion.
+.
+.TPx
+.REQ .ami "macro"
+Append to a macro whose name is contained in the string
+.I macro
+until
+.B ..\&
+is encountered.
+.
+.TPx
+.REQ .ami "macro end"
+Append to a macro indirectly.
+.I macro
+and
+.I end
+are strings whose contents are interpolated for the macro name and the
+end macro,
+respectively.
+.
+.TPx
+.REQ .ami1 "macro"
+Same as
+.request .ami
+but with compatibility mode switched off during macro expansion.
+.
+.TPx
+.REQ .ami1 "macro end"
+Same as
+.request .ami
+but with compatibility mode switched off during macro expansion.
+.
+.TPx
+.REQ .as name
+Create string
+.I name
+with empty contents;
+no operation if
+.I name
+already exists.
+.
+.TPx
+.REQ .as "name contents"
+Append
+.I contents
+to string
+.IR name .
+.
+.TPx
+.REQ .as1 string
+.TQ
+.REQ .as1 "string contents"
+As
+.request .as ,
+but with compatibility mode disabled when
+.I contents
+interpolated.
+.
+.TPx
+.REQ .asciify "diversion"
+Unformat ASCII characters, spaces, and some escape sequences in
+.IR diversion .
+.
+.TPx
+.REQ .backtrace
+Write the state of the input stack to the standard error stream.
+.
+See the
+.B \-b
+option of
+.MR groff @MAN1EXT@ .
+.
+.TPx
+.REQ .bd font
+Stop emboldening font
+.I font.
+.
+.TPx
+.REQ .bd "font n"
+Embolden
+.I font
+by overstriking its glyphs offset by
+.IR n \-1
+units.
+.
+See
+.register .b .
+.\" XXX: negative values accepted; check AT&T troff
+.
+.TPx
+.REQ .bd "special-font font"
+Stop emboldening
+.I special-font
+when
+.I font
+is selected.
+.
+.TPx
+.REQ .bd "special-font font n"
+Embolden
+.I special-font,
+overstriking its glyphs offset by
+.IR n \-1
+units when
+.I font
+is selected.
+.
+See
+.register .b .
+.
+.TPx
+.REQ .blm
+Unset blank line macro (trap).
+.
+Restore default handling of blank lines.
+.
+.
+.TPx
+.REQ .blm name
+Set blank line macro (trap) to
+.IR name .
+.
+.
+.TPx
+.REQ .box
+Stop directing output to current diversion;
+any pending output line is discarded.
+.
+.
+.TPx
+.REQ .box name
+Direct output to diversion
+.IR name ,
+omitting a partially collected line.
+.
+.
+.TPx
+.REQ .boxa
+Stop appending output to current diversion;
+any pending output line is discarded.
+.
+.
+.TPx
+.REQ .boxa name
+Append output to diversion
+.IR name ,
+omitting a partially collected line.
+.
+.
+.TPx
+.REQ .bp
+Break page and start a new one.
+.
+.TPx
+.REQ .bp "\[+-]N"
+Break page,
+starting a new one numbered
+.IR \[+-]N .
+.
+.TPx
+.REQ .br
+Break output line.
+.
+.TPx
+.REQ .brp
+Break output line;
+adjust if applicable.
+.
+.TPx
+.REQ .break
+Break out of a while loop.
+.
+.TPx
+.REQ .c2
+Reset no-break control character to
+.dquoted_char \[aq] .
+.
+.TPx
+.REQ .c2 "o"
+Recognize ordinary character
+.I o
+as no-break control character.
+.
+.TPx
+.REQ .cc
+Reset control character to
+.squoted_char . .
+.
+.TPx
+.REQ .cc "o"
+Recognize ordinary character
+.I o
+as the control character.
+.
+.TPx
+.REQ .ce
+Break,
+center the output of the next productive input line without filling,
+and break again.
+.
+.TPx
+.REQ .ce npl
+Break,
+center the output of the next
+.I npl
+productive input lines without filling,
+then break again.
+.
+If
+.I npl
+\[<=] 0,
+stop centering.
+.
+.TPx
+.REQ .cf file
+Copy contents of
+.I file
+without formatting to the (top-level) diversion.
+.
+.TPx
+.REQ .cflags "n c1 c2 \fR\&.\|.\|.\&\fP"
+Assign properties encoded
+.RI by\~ n
+to characters
+.IR c1 ,
+.IR c2 ,
+and so on.
+.
+.
+.TPx
+.REQ .ch name
+Unplant page location trap
+.IR name .
+.
+.
+.TPx
+.REQ .ch "name vpos"
+Change page location trap
+.I name
+planted by
+.request .wh
+by moving its location to
+.I vpos
+(default scaling unit\~\c
+.scaleindicator v ).
+.
+.
+.TPx
+.REQ .char "c contents"
+Define ordinary or special character
+.I c
+as
+.IR contents .
+.
+.TPx
+.REQ .chop object
+Remove the last character from the macro,
+string,
+or diversion
+named
+.IR object .
+.
+.TPx
+.REQ .class "name c1 c2 \fR\&.\|.\|.\&\fP"
+Define a (character) class
+.I name
+comprising the characters or range expressions
+.IR c1 ,
+.IR c2 ,
+and so on.
+.
+.TPx
+.REQ .close "stream"
+Close the
+.IR stream .
+.
+.
+.TPx
+.REQ .color
+Enable output of color-related device-independent output commands.
+.
+.
+.TPx
+.REQ .color n
+If
+.I n
+is zero,
+disable output of color-related device-independent output commands;
+otherwise,
+enable them.
+.\" XXX: Should probably interpret negative values as false.
+.
+.
+.TPx
+.REQ .composite "from to"
+Map glyph name
+.I from
+to glyph name
+.I to
+while constructing a composite glyph name.
+.
+.TPx
+.REQ .continue
+Finish the current iteration of a while loop.
+.
+.TPx
+.REQ .cp
+Enable compatibility mode.
+.
+.TPx
+.REQ .cp n
+If
+.I n
+is zero,
+disable compatibility mode,
+otherwise enable it.
+.
+.TPx
+.REQ .cs "font n m"
+Set constant character width mode for
+.I font
+to
+.IR n /36
+ems with em
+.IR m .
+.\" XXX: m parameter needs more explanation.
+.
+.
+.TPx
+.REQ .cu
+Continuously underline the output of the next productive input line.
+.
+.
+.TPx
+.REQ .cu npl
+Continuously underline the output of the next
+.I npl
+productive input lines.
+.
+If
+.IR npl =0,
+stop continuously underlining.
+.
+.
+.TPx
+.REQ .da
+Stop appending output to current diversion.
+.
+.
+.TPx
+.REQ .da name
+Append output to diversion
+.IR name .
+.
+.
+.TPx
+.REQ .de macro
+Define or redefine
+.I macro
+until
+.RB \[lq] ..\& \[rq]
+occurs at the start of a control line in the current conditional block.
+.
+.
+.TPx
+.REQ .de "macro end"
+Define or redefine
+.I macro
+until
+.I end
+is invoked or called at the start of a control line in the current
+conditional block.
+.
+.
+.TPx
+.REQ .de1 "macro"
+As
+.request .de ,
+but disable compatibility mode during macro expansion.
+.
+.TPx
+.REQ .de1 "macro end"
+As
+.RB \[lq] .de
+.IR "macro end" \[rq],
+but disable compatibility mode during macro expansion.
+.
+.
+.TPx
+.REQ .defcolor "ident scheme color-component \f[R].\|.\|."
+Define a color named
+.I ident.
+.
+.I scheme
+identifies a color space and determines the number of required
+.IR color-component s;
+it must be one of
+.RB \[lq] rgb \[rq]
+(three components),
+.RB \[lq] cmy \[rq]
+(three),
+.RB \[lq] cmyk \[rq]
+(four),
+or
+.RB \[lq] gray \[rq]
+(one).
+.
+.RB \[lq] grey \[rq]
+is accepted as a synonym of
+.RB \[lq] gray \[rq].
+.
+The color components can be encoded as a single hexadecimal value
+starting with
+.B #
+or
+.BR ## .
+.
+The former indicates that each component is in the range 0\[en]255
+(0\[en]FF),
+the latter the range 0\[en]65,535 (0\[en]FFFF).
+.
+Alternatively,
+each color component can be specified as a decimal fraction in the range
+0\[en]1,
+interpreted using a default scaling unit
+.RB of\~\[lq] f \[rq],
+which multiplies its value by 65,536
+(but clamps it at 65,535).
+.
+Each output device has a color named
+.RB \[lq] default \[rq],
+which cannot be redefined.
+.
+A device's default stroke and fill colors are not necessarily the same.
+.
+.
+.TPx
+.REQ .dei "macro"
+Define macro indirectly.
+.
+As
+.request .de ,
+but use interpolation of string
+.I macro
+as the name of the defined macro.
+.
+.
+.TPx
+.REQ .dei "macro end"
+Define macro indirectly.
+.
+As
+.request .de ,
+but use interpolations of strings
+.I macro
+and
+.I end
+as the names of the defined and end macros.
+.
+.
+.TPx
+.REQ .dei1 "macro"
+As
+.request .dei ,
+but disable compatibility mode during macro expansion.
+.
+.
+.TPx
+.REQ .dei1 "macro end"
+As
+.request ".dei\~\f[I]macro\~end\f[]" ,
+but disable compatibility mode during macro expansion.
+.
+.TPx
+.REQ .device "anything"
+Write
+.IR anything ,
+read in copy mode,
+to
+.I @g@troff
+output as a device control command.
+.
+An initial neutral double quote is stripped to allow embedding of
+leading spaces.
+.
+.TPx
+.REQ .devicem "name"
+Write contents of macro or string
+.I name
+to
+.I @g@troff
+output as a device control command.
+.
+.TPx
+.REQ .di
+Stop directing output to current diversion.
+.
+.
+.TPx
+.REQ .di name
+Direct output to diversion
+.IR name .
+.
+.TPx
+.REQ .do "name \fR\&.\|.\|.\&\fP"
+Interpret the string,
+request,
+diversion,
+or macro
+.I name
+(along with any arguments)
+with compatibility mode disabled.
+.
+Compatibility mode is restored
+(only if it was active)
+when the
+.I expansion
+of
+.I name
+is interpreted.
+.
+.TPx
+.REQ .ds name
+Create empty string
+.IR name .
+.
+.TPx
+.REQ .ds "name contents"
+Create a string
+.I name
+containing
+.IR contents .
+.
+.TPx
+.REQ .ds1 name
+.TQ
+.REQ .ds1 "name contents"
+As
+.request .ds ,
+but with compatibility mode disabled when
+.I contents
+interpolated.
+.
+.TPx
+.REQ .dt
+Clear diversion trap.
+.
+.
+.TPx
+.REQ .dt "vertical-position name"
+Set the diversion trap to macro
+.I name
+at
+.I vertical-position
+(default scaling unit\~\c
+.scaleindicator v ).
+.
+.
+.TPx
+.REQ .ec
+Recognize
+.B \[rs]
+as the escape character.
+.
+.
+.TPx
+.REQ .ec "o"
+Recognize ordinary character
+.I o
+as the escape character.
+.
+.
+.TPx
+.REQ .ecr
+Restore escape character saved with
+.request .ecs .
+.
+.
+.TPx
+.REQ .ecs
+Save the escape character.
+.
+.
+.TPx
+.REQ .el "anything"
+Interpret
+.I anything
+as if it were an input line if the conditional expression of the
+corresponding
+.request .ie
+request was false.
+.
+.
+.TPx
+.REQ .em name
+Call macro
+.I name
+after the end of input.
+.
+.
+.TPx
+.REQ .eo
+Disable the escape mechanism in interpretation mode.
+.
+.
+.TPx
+.REQ .ev
+Pop environment stack,
+returning to previous one.
+.
+.
+.TPx
+.REQ .ev "env"
+Push current environment onto stack and switch to
+.IR env .
+.
+.
+.TPx
+.REQ .evc "env"
+Copy environment
+.I env
+to the current one.
+.
+.
+.TPx
+.REQ .ex
+Exit with successful status.
+.
+.
+.TPx
+.REQ .fam
+Set default font family to previous value.
+.
+.TPx
+.REQ .fam "name"
+Set default font family to
+.IR name .
+.
+.TPx
+.REQ .fc
+Disable field mechanism.
+.
+.TPx
+.REQ .fc "a"
+Set field delimiter to\~\c
+.I a
+and pad glyph to space.
+.
+.TPx
+.REQ .fc "a b"
+Set field delimiter to\~\c
+.I a
+and pad glyph to\~\c
+.IR b .
+.
+.TPx
+.REQ .fchar "c contents"
+Define fallback character (or glyph)
+.I c
+as
+.IR contents .
+.
+.
+.TPx
+.REQ .fcolor
+Restore previous fill color.
+.
+.
+.TPx
+.REQ .fcolor "c"
+Set fill color to
+.IR c .
+.
+.
+.TPx
+.REQ .fi
+Enable filling of output lines;
+a pending output line is broken.
+.
+Sets
+.BR \[rs]n[.u] .
+.
+.
+.TPx
+.REQ .fl
+Flush output buffer.
+.
+.TPx
+.REQ .fp "pos id"
+Mount font with font description file name
+.I id
+at non-negative
+.RI position\~ n .
+.
+.TPx
+.REQ .fp "pos id font-description-file-name"
+Mount font with
+.I font-description-file-name
+as name
+.I id
+at non-negative
+.RI position\~ n .
+.
+.TPx
+.REQ .fschar "f c anything"
+Define fallback character (or glyph)
+.I c
+for font
+.I f
+as string
+.IR anything .
+.
+.TPx
+.REQ .fspecial "font"
+Reset list of special fonts for
+.I font
+to be empty.
+.
+.TPx
+.REQ .fspecial "font s1 s2 \fR\&.\|.\|.\&\fP"
+When the current font is
+.IR font ,
+then the fonts
+.IR s1 ,
+.IR s2 ,
+\&.\|.\|.\&
+are special.
+.
+.TPx
+.REQ .ft
+.TQ
+.REQ ".ft P"
+Select previous font mounting position
+(abstract style or font);
+same as
+.esc f[]
+or
+.esc fP .
+.
+.TPx
+.REQ .ft "font"
+Select typeface
+.I font,
+which can be a
+mounting position,
+abstract style,
+or font name;
+same as
+.esc[] f font
+escape sequence.
+.
+.I font
+cannot be
+.BR P .
+.
+.TPx
+.REQ .ftr "font1 font2"
+Translate
+.I font1
+to
+.IR font2 .
+.
+.TPx
+.REQ .fzoom font
+.TQ
+.REQ .fzoom font\~\f[CB]0\f[]
+Stop magnifying
+.IR font .
+.
+.TPx
+.REQ .fzoom "font z"
+Set zoom factor for
+.I font
+.RI to\~ z
+(in thousandths;
+default:
+1000).
+.
+.TPx
+.REQ .gcolor
+Restore previous stroke color.
+.
+.
+.TPx
+.REQ .gcolor "c"
+Set stroke color to
+.IR c .
+.
+.
+.TPx
+.REQ .hc
+Reset the hyphenation character
+.RB to\~ \[rs]%
+(the default).
+.
+.TPx
+.REQ .hc char
+Change the hyphenation character
+.RI to\~ char .
+.
+.TPx
+.REQ .hcode "c1 code1 \fR[\fPc2 code2\fR] .\|.\|.\fP"
+Set the hyphenation code of character
+.I c1
+to
+.IR code1 ,
+that of
+.I c2
+to
+.IR code2 ,
+and so on.
+.
+.TPx
+.REQ .hla lang
+Set the hyphenation language to
+.IR lang .
+.
+.TPx
+.REQ .hlm n
+Set the maximum quantity of consecutive hyphenated lines to
+.IR n .
+.
+.TPx
+.REQ .hpf pattern-file
+Read hyphenation patterns from
+.IR pattern-file .
+.
+.TPx
+.REQ .hpfa pattern-file
+Append hyphenation patterns from
+.IR pattern-file .
+.
+.TPx
+.REQ .hpfcode "a b \fR[\fPc d\fR] .\|.\|.\fP"
+Define mappings for character codes in hyphenation pattern files read
+with
+.request .hpf
+and
+.request .hpfa .
+.
+.TPx
+.REQ .hw "word \fR.\|.\|.\fP"
+Define hyphenation overrides for each
+.I word;
+a hyphen
+.RB \[lq] \- \[rq]
+indicates a hyphenation point.
+.
+.
+.TPx
+.REQ .hy
+Set automatic hyphenation mode to
+.BR 1 .
+.
+.
+.TPx
+.REQ .hy\~0
+Disable automatic hyphenation;
+same as
+.BR .nh .
+.
+.
+.TPx
+.REQ .hy mode
+Set automatic hyphenation mode to
+.IR mode ;
+see section \[lq]Hyphenation\[rq] below.
+.
+.
+.TPx
+.REQ .hym
+Set the (right) hyphenation margin to
+.B 0
+(the default).
+.
+.TPx
+.REQ .hym length
+Set the (right) hyphenation margin to
+.I length
+(default scaling unit\~\c
+.scaleindicator m ).
+.
+.TPx
+.REQ .hys
+Set the hyphenation space to
+.B 0
+(the default).
+.
+.TPx
+.REQ .hys hyphenation-space
+Suppress automatic hyphenation in adjustment modes
+.RB \[lq] b \[rq]
+or
+.RB \[lq] n \[rq]
+if the line can be justified with the addition of up to
+.I hyphenation-space
+to each inter-word space
+(default scaling unit\~\c
+.scaleindicator m ).
+.
+.
+.TPx
+.REQ .ie "cond-expr anything"
+If
+.I cond-expr
+is true,
+interpret
+.I anything
+as if it were an input line,
+otherwise skip to a corresponding
+.request .el
+request.
+.
+.
+.TPx
+.REQ .if "cond-expr anything"
+If
+.I cond-expr
+is true,
+then interpret
+.I anything
+as if it were an input line.
+.
+.
+.TPx
+.REQ .ig
+Ignore input
+(except for side effects of
+.B \[rs]R
+on auto-incrementing registers)
+until
+.RB \[lq] ..\& \[rq]
+occurs at the start of a control line in the current conditional block.
+.
+.
+.TPx
+.REQ .ig "end"
+Ignore input
+(except for side effects of
+.B \[rs]R
+on auto-incrementing registers)
+until
+.BI . end
+is called at the start of a control line in the current conditional
+block.
+.
+.TPx
+.REQ .in
+Set indentation amount to previous value.
+.
+.TPx
+.REQ .in "\[+-]N"
+Set indentation to
+.I \[+-]N
+(default scaling unit\~\c
+.scaleindicator m ).
+.
+.TPx
+.REQ .it
+Cancel any pending input line trap.
+.
+.TPx
+.REQ .it "npl name"
+Set
+(or replace)
+an input line trap in the environment,
+calling macro
+.IR name ,
+after the next
+.I npl
+productive input lines have been read.
+.
+Lines interrupted with the
+.B \[rs]c
+escape sequence are counted separately.
+.
+.TPx
+.REQ .itc
+Cancel any pending input line trap.
+.
+.TPx
+.REQ .itc "npl name"
+As
+.request .it ,
+except that input lines interrupted with the
+.B \[rs]c
+escape sequence are not counted.
+.
+.TPx
+.REQ .kern
+Enable pairwise kerning.
+.
+.TPx
+.REQ .kern n
+If
+.I n
+is zero,
+disable pairwise kerning,
+otherwise enable it.
+.
+.TPx
+.REQ .lc
+Unset leader repetition character.
+.
+.TPx
+.REQ .lc "c"
+Set leader repetition character
+.RI to\~ c
+(default:
+.RB \[lq] . \[rq]).
+.
+.TPx
+.REQ .length "reg anything"
+Compute the number of characters of
+.I anything
+and store the count
+in the register
+.IR reg .
+.
+.
+.TPx
+.REQ .linetabs
+Enable line-tabs mode
+(calculate tab positions relative to beginning of output line).
+.
+.
+.TPx
+.REQ .linetabs\~0
+Disable line-tabs mode.
+.
+.
+.TPx
+.REQ .lf n
+Set number of next input line to
+.IR n .
+.\" XXX: negative values accepted; check AT&T troff
+.
+.TPx
+.REQ .lf "n file"
+Set number of next input line to
+.I n
+and input file name to
+.IR file .
+.
+.TPx
+.REQ .lg m
+Set ligature mode to
+.I m
+.RB ( 0
+= disable,
+.B 1
+= enable,
+.B 2
+= enable for two-letter ligatures only).
+.\" XXX: negative values accepted (mapped to 1); check AT&T troff
+.
+.TPx
+.REQ .ll
+Set line length to previous value.
+.
+Does not affect a pending output line.
+.
+.TPx
+.REQ .ll "\[+-]N"
+Set line length to
+.I \[+-]N
+(default length
+.scalednumber 6.5 i ,
+default scaling unit\~\c
+.scaleindicator m ).
+.
+Does not affect a pending output line.
+.
+.TPx
+.REQ .lsm
+Unset the leading space macro (trap).
+.
+Restore default handling of lines with leading spaces.
+.
+.TPx
+.REQ .lsm name
+Set the leading space macro (trap) to
+.IR name .
+.
+.TPx
+.REQ .ls
+Change to the previous value of additional intra-line skip.
+.
+.TPx
+.REQ .ls n
+Set additional intra-line skip value to
+.IR n ,
+i.e.,
+.IR n \-1
+blank lines are inserted after each text output line.
+.\" XXX: negative values accepted; check AT&T troff
+.
+.TPx
+.REQ .lt
+Set length of title lines to previous value.
+.
+.TPx
+.REQ .lt "\[+-]N"
+Set length of title lines
+(default length
+.scalednumber 6.5 i ,
+default scaling unit\~\c
+.scaleindicator m ).
+.
+.TPx
+.REQ .mc
+Cease writing margin character.
+.
+.TPx
+.REQ .mc c
+Begin writing margin
+.RI character\~ c
+to the right of each output line.
+.
+.TPx
+.REQ .mc "c d"
+Begin writing margin
+.RI character\~ c
+on each output line at
+.RI distance\~ d
+to the right of the right margin
+(default distance
+.scalednumber 10 p ,
+default scaling unit\~\c
+.scaleindicator m ).
+.
+.TPx
+.REQ .mk
+Mark vertical drawing position in an internal register;
+see
+.BR .rt .
+.
+.TPx
+.REQ .mk register
+Mark vertical drawing position in
+.IR register .
+.
+.TPx
+.REQ .mso "file"
+As
+.request .so ,
+except that
+.I file
+is sought in the
+.I tmac
+directories.
+.
+.
+.TPx
+.REQ .msoquiet "file"
+As
+.request .mso ,
+but no warning is emitted if
+.I file
+does not exist.
+.
+.
+.TPx
+.REQ .na
+Disable output line adjustment.
+.
+.
+.TPx
+.REQ .ne
+Break page if distance to next page location trap is less than one vee.
+.
+.TPx
+.REQ .ne d
+Break page if distance to next page location trap is less than distance
+.I d
+(default scaling unit\~\c
+.scaleindicator v ).
+.
+.
+.TPx
+.REQ .nf
+Disable filling of output lines;
+a pending output line is broken.
+.
+Clears
+.BR \[rs]n[.u] .
+.
+.
+.TPx
+.REQ .nh
+Disable automatic hyphenation;
+same as
+.RB \[lq] ".hy 0" \[rq].
+.
+.TPx
+.REQ .nm
+Deactivate output line numbering.
+.
+.TPx
+.REQ .nm \[+-]N
+.TQ
+.REQ .nm "\[+-]N m"
+.TQ
+.REQ .nm "\[+-]N m s"
+.TQ
+.REQ .nm "\[+-]N m s i"
+Activate output line numbering:
+number the next output line
+.I \[+-]N,
+writing numbers every
+.I m
+lines,
+with
+.I s
+numeral widths
+.RB ( \[rs]0 )
+between the line number and the output
+(default 1),
+and indenting the line number by
+.I i
+numeral widths
+(default 0).
+.
+.TPx
+.REQ .nn
+Suppress numbering of the next output line to be numbered with
+.BR nm .
+.
+.TPx
+.REQ .nn n
+Suppress numbering of the next
+.I n
+output lines to be numbered with
+.BR nm .
+.
+If
+.IR n =0,
+cancel suppression.
+.\" XXX: negative values accepted; check AT&T troff
+.
+.
+.TPx
+.REQ .nop "anything"
+Interpret
+.I anything
+as if it were an input line.
+.
+.TPx
+.REQ .nr "reg \[+-]N"
+Define or update register
+.I reg
+with value
+.IR N .
+.
+.TPx
+.REQ .nr "reg \[+-]N I"
+Define or update register
+.I reg
+with value
+.I N
+and auto-increment
+.IR I .
+.
+.TPx
+.REQ .nroff
+Make the conditional expressions
+.B n
+true and
+.B t
+false.
+.
+.TPx
+.REQ .ns
+Enable
+.IR "no-space mode" ,
+ignoring
+.B .sp
+requests until a glyph or
+.B \[rs]D
+primitive is output.
+.
+See
+.BR .rs .
+.
+.TPx
+.REQ .nx
+Immediately jump to end of current file.
+.
+.TPx
+.REQ .nx file
+Stop formatting current file and begin reading
+.I file.
+.
+.TPx
+.REQ .open "stream file"
+Open
+.I file
+for writing and associate the stream named
+.I stream
+with it.
+.
+Unsafe request;
+disabled by default.
+.
+.TPx
+.REQ .opena "stream file"
+As
+.request .open ,
+but append to
+.I file.
+.
+Unsafe request;
+disabled by default.
+.
+.TPx
+.REQ .os
+Output vertical distance that was saved by the
+.request .sv
+request.
+.
+.TPx
+.REQ .output contents
+Emit
+.I contents
+directly to intermediate output,
+allowing leading whitespace if
+.I string
+starts with
+\&\f[CB]\[dq]\f[]
+(which is stripped off).
+.
+.TPx
+.REQ .pc
+Reset page number character to\~\c
+.squoted_char % .
+.
+.TPx
+.REQ .pc "c"
+Page number character.
+.
+.
+.TPx
+.REQ .pev
+Report the state of the current environment followed by that of all
+other environments to the standard error stream.
+.
+.TPx
+.REQ .pi "program"
+Pipe output to
+.I program
+.RI ( nroff
+only).
+.
+Unsafe request;
+disabled by default.
+.
+.TPx
+.REQ .pl
+Set page length to default
+.scalednumber 11 i .
+The current page length is stored in register
+.BR .p .
+.
+.TPx
+.REQ .pl "\[+-]N"
+Change page length to
+.I \[+-]N
+(default scaling unit\~\c
+.scaleindicator v ).
+.
+.TPx
+.REQ .pm
+Report,
+to the standard error stream,
+the names and sizes in bytes of
+defined
+macros,
+strings,
+and
+diversions.
+.
+.TPx
+.REQ .pn "\[+-]N"
+Next page number
+.IR N .
+.
+.TPx
+.REQ .pnr
+Write the names and contents of all defined registers to the standard
+error stream.
+.
+.TPx
+.REQ .po
+Change to previous page offset.
+.
+The current page offset is available in register
+.BR .o .
+.
+.TPx
+.REQ .po "\[+-]N"
+Page offset
+.IR N .
+.
+.
+.TPx
+.REQ .ps
+Return to previous type size.
+.TPx
+.
+.
+.REQ .ps "\[+-]N"
+Set/increase/decrease the type size to/by
+.I N
+scaled points
+(a non-positive resulting type size is set to 1\~u);
+also see
+.esc[] s \[+-]N .
+.
+.TPx
+.REQ .psbb file
+Retrieve the bounding box of the PostScript image found in
+.I file,
+which must conform to Adobe's Document Structuring Conventions (DSC).
+.
+See registers
+.BR llx ,
+.BR lly ,
+.BR urx ,
+.BR ury .
+.
+.TPx
+.REQ .pso "command-line"
+Execute
+.I command-line
+with
+.MR popen 3
+and interpolate its output.
+.
+Unsafe request;
+disabled by default.
+.
+.TPx
+.REQ .ptr
+Report names and positions of all page location traps to the standard
+error stream.
+.
+.
+.TPx
+.REQ .pvs
+Change to previous post-vertical line spacing.
+.
+.TPx
+.REQ .pvs "\[+-]N"
+Change post-vertical line spacing according to
+.I \[+-]N
+(default scaling unit\~\c
+.scaleindicator p ).
+.
+.TPx
+.REQ .rchar "c1 c2 \fR.\|.\|.\&\fP"
+Remove definition of each ordinary or special character
+.IR c1 ,
+.IR c2 ,
+\&.\|.\|.\& defined by a
+.request .char ,
+.request .fchar ,
+or
+.request .schar
+request.
+.
+.TPx
+.REQ .rd "prompt"
+Read insertion.
+.
+.TPx
+.REQ .return
+Return from a macro.
+.
+.TPx
+.REQ .return "anything"
+Return twice, namely from the macro at the current level and from the
+macro one level higher.
+.
+.TPx
+.REQ .rfschar "f c1 c2 \fR\&.\|.\|.\&\fP"
+Remove the font-specific definitions of glyphs
+.IR c1 ,
+.IR c2 ,
+\&.\|.\|.\& for
+.RI font\~ f .
+.
+.TPx
+.REQ .rj npl
+Break,
+right-align the output of the next productive input line without
+filling,
+then break again.
+.
+.TPx
+.REQ .rj npl
+Break,
+right-align the output of the next
+.I npl
+productive input lines without filling,
+then break again.
+.
+If
+.I npl
+\[<=] 0,
+stop right-aligning.
+.
+.TPx
+.REQ .rm "name"
+Remove request, macro, diversion, or string
+.IR name .
+.
+.TPx
+.REQ .rn "old new"
+Rename request, macro, diversion, or string
+.I old
+to
+.IR new .
+.
+.TPx
+.REQ .rnn "reg1 reg2"
+Rename register
+.I reg1
+to
+.IR reg2 .
+.
+.
+.TPx
+.REQ .rr ident
+Remove register
+.IR ident .
+.
+.
+.TPx
+.REQ .rs
+Restore spacing;
+disable no-space mode.
+.
+See
+.BR .ns .
+.
+.TPx
+.REQ .rt
+Return
+.I (upward only)
+to vertical position marked by
+.B .mk
+on the current page.
+.
+.TPx
+.REQ .rt N
+Return
+.I (upward only)
+to vertical position
+.I N
+(default scaling
+unit\~\c
+.scaleindicator v ).
+.\" XXX: negative values accepted; check AT&T troff
+.
+.TPx
+.REQ .schar "c contents"
+Define global fallback character (or glyph)\~\c
+.I c
+as
+.IR contents .
+.
+.
+.TPx
+.REQ .shc
+Reset the soft hyphen character to
+.esc [hy] .
+.
+.
+.TPx
+.REQ .shc c
+Set the soft hyphen character
+.RI to\~ c .
+.
+.
+.TPx
+.REQ .shift n
+In a macro definition,
+left-shift arguments by
+.IR n \~\c
+positions.
+.
+.TPx
+.REQ .sizes "s1 s2 \f[R].\|.\|.\&\f[] sn \f[R][\f[CB]0\f[]]"
+Set available type sizes similarly to the
+.B sizes
+directive in a
+.I DESC
+file.
+.
+Each
+.IR s i
+is interpreted in units of scaled points (\c
+.scaleindicator z ).
+.
+.
+.TPx
+.REQ .so file
+Replace the request's control line with the contents of
+.IR file ,
+\[lq]sourcing\[rq] it.
+.
+.
+.TPx
+.REQ .soquiet file
+As
+.request .so ,
+but no warning is emitted if
+.I file
+does not exist.
+.
+.
+.TPx
+.REQ .sp
+Break and move the next text baseline down by one vee,
+or until springing a page location trap.
+.
+.
+.TPx
+.REQ .sp dist
+Break and move the next text baseline down by
+.IR dist ,
+or until springing a page location trap
+(default scaling unit\~\c
+.scaleindicator v ).
+.
+A negative
+.I dist
+will not reduce the position of the text baseline below zero.
+.
+Prefixing
+.I dist
+with the
+.B \[or]
+operator moves to a position relative to the page top for positive
+.IR N ,
+and the bottom if
+.I N
+is negative;
+in all cases,
+one line height (vee) is added
+.RI to\~ dist .
+.
+.I dist
+is ignored inside a diversion.
+.
+.
+.TPx
+.REQ .special
+Reset global list of special fonts to be empty.
+.
+.TPx
+.REQ .special "s1 s2 \fR\&.\|.\|.\&\fR"
+Fonts
+.IR s1 ,
+.IR s2 ,
+etc.\& are special and are searched for glyphs not in the
+current font.
+.
+.TPx
+.REQ .spreadwarn
+Toggle the spread warning on and off (the default) without changing its
+value.
+.
+.TPx
+.REQ .spreadwarn N
+Emit a
+.B break
+warning if the additional space inserted for each space between words in
+an adjusted output line is greater than or equal to
+.IR N .
+.
+A negative
+.I N
+is treated as 0.
+.
+The default scaling unit is\~\c
+.scaleindicator m .
+.
+At startup,
+.request .spreadwarn
+is inactive and
+.I N
+is
+.scalednumber "3 m" .
+.\" XXX: negative values accepted; retain for future space-squeezing
+.
+.TPx
+.REQ .ss n
+Set minimal inter-word spacing to
+.IR n \~12ths
+of current font's space width.
+.
+.TPx
+.REQ .ss "n m"
+As
+.RB \[lq] .ss\~\c
+.IR n \[rq],
+and set additional inter-sentence space to
+.IR m \~12ths
+of current font's space width.
+.
+.TPx
+.REQ .stringdown stringvar
+Replace each byte in the string named
+.I stringvar
+with its lowercase version.
+.
+.TPx
+.REQ .stringup stringvar
+Replace each byte in the string named
+.I stringvar
+with its uppercase version.
+.
+.TPx
+.REQ .sty "n style"
+Associate abstract
+.I style
+with font position
+.IR n .
+.
+.TPx
+.REQ .substring "str start \fR[\fPend\fR]\fP"
+Replace the string named
+.I str
+with its substring bounded by the indices
+.I start
+and
+.IR end ,
+inclusive.
+.
+Negative indices count backwards from the end of the string.
+.
+.TPx
+.REQ .sv
+As
+.request .ne ,
+but save
+.scalednumber "1 v"
+for output with
+.request .os
+request.
+.
+.TPx
+.REQ .sv d
+As
+.request .ne ,
+but save distance
+.I d
+for later output with
+.request .os
+request
+(default scaling unit\~\c
+.scaleindicator v ).
+.\" XXX: negative values accepted; check AT&T troff
+.
+.TPx
+.REQ .sy "command-line"
+Execute
+.I command-line
+with
+.MR system 3 .
+.
+Unsafe request;
+disabled by default.
+.
+.TPx
+.REQ .ta "n1 n2 \fR\&.\|.\|.\&\fP n\fRn\fP \f[CB]T\f[] r1 r2 \
+\fR\&.\|.\|.\&\fP r\fRn\fP"
+Set tabs at positions
+.IR n1 ,
+.IR n2 ,
+\&.\|.\|.\&,
+.IR n n,
+then set tabs at
+.IR n n+ m \[tmu] r n+ r1
+through
+.IR n n+ m \[tmu] r n+ r n,
+where
+.I m
+increments from 0,
+1,
+2,
+\&.\|.\|.\& to the output line length.
+.
+Each
+.IR n \~argument
+can be prefixed with
+.RB a\~\[lq] + \[rq]
+to place the tab stop
+.I ni
+at a distance relative to the previous,
+.IR n ( i \-1).
+.
+Each argument
+.IR ni \~or\~ ri
+can be suffixed with a letter to align text within the tab column
+bounded by tab stops
+.IR i \~and\~ i +1;
+.RB \[lq] L \[rq]
+for left-aligned
+(the default),
+.RB \[lq] C \[rq]
+for centered,
+and
+.RB \[lq] R \[rq]
+for right-aligned.
+.
+.br
+.ne 4v \" XXX: should need only 2v
+.TPx
+.REQ .tag
+.TQ
+.REQ .taga
+Reserved for internal use.
+.
+.TPx
+.REQ .tc
+Unset tab repetition character.
+.
+.TPx
+.REQ .tc "c"
+Set tab repetition character
+.RI to\~ c
+(default: none).
+.
+.TPx
+.REQ .ti "\[+-]N"
+Temporarily indent next output line
+(default scaling unit\~\c
+.scaleindicator m ).
+.
+.TPx
+.REQ .tkf "font s1 n1 s2 n2"
+Enable track kerning for
+.IR font .
+.
+.TPx
+.REQ .tl "\f[CB]\[aq]\f[]left\f[CB]\[aq]\f[]center\f[CB]\[aq]\f[]right\
+\f[CB]\[aq]\f[]"
+Format three-part title.
+.
+.TPx
+.REQ .tm message
+Write
+.I message,
+followed by a newline,
+to the standard error stream.
+.
+.TPx
+.REQ .tm1 message
+As
+.request .tm ,
+but an initial neutral double quote in
+.I message
+is removed,
+allowing it to contain leading spaces.
+.
+.TPx
+.REQ .tmc message
+As
+.request .tm1 ,
+without emitting a newline.
+.
+.TPx
+.REQ .tr "abcd\fR\&.\|.\|.\&\fP"
+Translate ordinary or special characters
+.I a
+to
+.IR b ,
+.I c
+to
+.IR d ,
+and so on prior to output.
+.
+.TPx
+.REQ .trf file
+Transparently output the contents of
+.I file.
+.
+Unlike
+.request .cf ,
+invalid input characters in
+.I file
+are rejected.
+.
+.TPx
+.REQ .trin "abcd\fR\&.\|.\|.\&\fP"
+As
+.request .tr ,
+except that
+.request .asciify
+ignores the translation when a diversion is interpolated.
+.
+.TPx
+.REQ .trnt "abcd\fR\&.\|.\|.\&\fP"
+As
+.request .tr ,
+except that translations are suppressed in the argument to
+.esc ! .
+.
+.TPx
+.REQ .troff
+Make the conditional expressions
+.B t
+true and
+.B n
+false.
+.
+.TPx
+.REQ .uf font
+Set underline font used by
+.request .ul
+to
+.I font.
+.
+.
+.TPx
+.REQ .ul
+Underline
+(italicize in
+.I troff
+mode)
+the output of the next productive input line.
+.
+.
+.TPx
+.REQ .ul npl
+Underline
+(italicize in
+.I troff
+mode)
+the output of the next
+.I npl
+productive input line.
+.
+If
+.IR npl =0,
+stop underlining.
+.
+.
+.TPx
+.REQ .unformat "diversion"
+Unformat space characters and tabs in
+.IR diversion ,
+preserving font information.
+.
+.
+.TPx
+.REQ .vpt
+Enable vertical position traps.
+.
+.
+.TPx
+.REQ .vpt\~0
+Disable vertical position traps.
+.
+.
+.TPx
+.REQ .vs
+Change to previous vertical spacing.
+.
+.TPx
+.REQ .vs "\[+-]N"
+Set vertical spacing to
+.I \[+-]N
+(default scaling unit\~\c
+.scaleindicator p ).
+.
+.
+.TPx
+.REQ .warn
+Enable all warning categories.
+.
+.
+.TPx
+.REQ .warn\~0
+Disable all warning categories.
+.
+.
+.TPx
+.REQ .warn n
+Enable warnings in categories whose codes sum
+.RI to\~ n ;
+.\" TODO: Move that table here, perhaps.
+see
+.MR @g@troff @MAN1EXT@ .
+.
+.
+.TPx
+.REQ .warnscale "su"
+Set scaling unit used in certain warnings \" `output_warning()`
+to
+.I su
+(one of
+.BR u ,
+.BR i ,
+.BR c ,
+.BR p ,
+or
+.BR P ;
+default:
+.BR i ).
+.
+.
+.TPx
+.REQ .wh vpos
+Remove visible page location trap at
+.I vpos
+(default scaling unit\~\c
+.scaleindicator v ).
+.
+.
+.TPx
+.REQ .wh "vpos name"
+Plant macro
+.I name
+as page location trap at
+.I vpos
+(default scaling unit\~\c
+.scaleindicator v ),
+removing any visible trap already there.
+.
+.
+.TPx
+.REQ .while "cond-expr anything"
+Repeatedly execute
+.I anything
+unless and until
+.I cond-expr
+evaluates false.
+.
+.
+.TPx
+.REQ .write "stream anything"
+Write
+.I anything
+to the stream named
+.IR stream .
+.
+.TPx
+.REQ .writec "stream anything"
+Similar to
+.request .write
+without emitting a final newline.
+.
+.TPx
+.REQ .writem "stream xx"
+Write contents of macro or string
+.I xx
+to the stream named
+.IR stream .
+.
+.LE
+.
+.
+.\" ====================================================================
+.SH "Escape sequence short reference"
+.\" ====================================================================
+.
+The escape sequences
+.esc \[dq] ,
+.esc # ,
+.esc $ ,
+.esc * ,
+.esc ? ,
+.esc a ,
+.esc e ,
+.esc n ,
+.esc t ,
+.esc g ,
+.esc V ,
+and
+.escarg \& newline
+are interpreted even in copy mode.
+.
+.
+.P
+.LS
+.
+.\" ========= comments =========
+.
+.TP
+.ESC \[dq]
+Comment.
+.
+Everything up to the end of the line is ignored.
+.
+.
+.TP
+.ESC #
+Comment.
+.
+Everything up to and including the next newline is ignored.
+.
+.
+.\" ========= strings =========
+.
+.TP
+.ESC * s
+Interpolate string with one-character
+.RI name\~ s .
+.
+.
+.TP
+.ESC *( st
+Interpolate string with two-character
+.RI name\~ st .
+.
+.
+.TP
+.ESC[] * string
+Interpolate string with name
+.I string
+(of arbitrary length).
+.
+.
+.TP
+.ESC[] * "string arg \fR\&.\|.\|.\fP"
+Interpolate string with name
+.I string
+(of arbitrary length),
+taking
+.I arg
+\&.\|.\|.\&
+as arguments.
+.
+.
+.\" ========= macro arguments =========
+.
+.TP
+.ESC $0
+Interpolate name by which currently executing macro was invoked.
+.
+.
+.TP
+.ESC $ n
+Interpolate macro or string parameter
+.RI numbered\~ n
+.RI (1\|\[<=]\| n \|\[<=]\|9).
+.
+.
+.TP
+.ESC $( nn
+Interpolate macro or string parameter
+.RI numbered\~ nn
+.RI (01\|\[<=]\| nn \|\[<=]\|99).
+.
+.TP
+.ESC[] $ nnn
+Interpolate macro or string parameter
+.RI numbered\~ nnn
+.RI ( nnn \|\[>=]\|1).
+.
+.
+.TP
+.ESC $*
+Interpolate concatenation of all macro or string parameters,
+separated by spaces.
+.
+.
+.TP
+.ESC $@
+Interpolate concatenation of all macro or string parameters,
+with each surrounded by double quotes and separated by spaces.
+.
+.
+.TP
+.ESC $\[ha]
+Interpolate concatenation of all macro or string parameters
+as if they were arguments to the
+.request .ds
+request.
+.
+.
+.\" ========= escaped characters =========
+.
+.
+.TP
+.ESC \[aq]
+is a synonym for
+.esc [aa] ,
+the acute accent special character.
+.
+.
+.TP
+.ESC \[ga]
+is a synonym for
+.esc [ga] ,
+the grave accent special character.
+.
+.
+.TP
+.ESC \-
+is a synonym for
+.esc [\-] ,
+the minus sign special character.
+.
+.
+.TP
+.ESC _
+is a synonym for
+.esc [ul] ,
+the underrule special character.
+.
+.
+.TP
+.ESC %
+Control hyphenation.
+.
+.
+.TP
+.ESC !
+Transparent line.
+.
+The remainder of the input line is interpreted
+(1) when the current diversion is read;
+or
+(2) if in the top-level diversion,
+by the postprocessor
+(if any).
+.
+.
+.TP
+.ESC? anything
+Transparently embed
+.IR anything ,
+read in copy mode,
+in a diversion,
+or unformatted as an output comparand in a conditional expression.
+.
+.
+.\" ========= spaces and fixed-width horizontal motions =========
+.
+.TP
+.ESC \f[I]space
+Move right one word space.
+.
+.
+.TP
+.ESC \[ti]
+Insert an unbreakable,
+adjustable space.
+.
+.
+.TP
+.ESC 0
+Move right by the width of a numeral in the current font.
+.
+.
+.TP
+.ESC |
+Move one-sixth em to the right on typesetters.
+.
+.
+.TP
+.ESC \[ha]
+Move one-twelfth em to the right on typesetters.
+.
+.
+.TP
+.ESC &
+Interpolate a dummy character.
+.
+.
+.TP
+.ESC )
+Interpolate a dummy character that is transparent to end-of-sentence
+recognition.
+.
+.
+.TP
+.ESC /
+Apply italic correction.
+.
+Use between an immediately adjacent oblique glyph on the left and an
+upright glyph on the right.
+.
+.
+.TP
+.ESC ,
+Apply left italic correction.
+.
+Use between an immediately adjacent upright glyph on the left and an
+oblique glyph on the right.
+.
+.
+.TP
+.ESC :
+Non-printing break point
+(similar to
+.esc % ,
+but never produces a hyphen glyph).
+.
+.
+.TP
+.ESC "" newline
+Continue current input line on the next.
+.
+.
+.\" ========= structuring =========
+.
+.TP
+.ESC {
+Begin conditional input.
+.
+.TP
+.ESC }
+End conditional input.
+.
+.\" ========= longer escape names =========
+.
+.TP
+.ESC ( gl
+Interpolate glyph with two-character name
+.IR gl .
+.
+.
+.TP
+.ESC[] "" glyph
+Interpolate glyph with name
+.I glyph
+(of arbitrary length).
+.
+.
+.TP
+.ESC[] "" "base-char comp \fR\&.\|.\|."
+Interpolate composite glyph constructed from
+.I base-char
+and each component
+.IR comp .
+.
+.
+.TP
+.ESC[] "" "\f[CB]char\f[]nnn"
+Interpolate glyph of eight-bit encoded character
+.IR nnn ,
+where
+.RI 0\|\[<=]\| nnn \|\[<=]\|255.
+.
+.
+.TP
+.ESC[] "" "\f[CB]u\f[]nnnn\f[R][\f[]n\f[R][\f[]n\f[R]]]"
+Interpolate glyph of Unicode character with code point
+.IR nnnn [ n [ n ]]
+in uppercase hexadecimal.
+.
+.
+.TP
+.ESC[] "" "\f[CB]u\f[]base-char\f[R][\f[]\f[CB]_\f[]\
+combining-component\f[R]].\|.\|."
+Interpolate composite glyph from Unicode character
+.I base-char
+and
+.IR combining-components .
+.
+.
+.\" ========= alphabetical escape sequences =========
+.
+.TP
+.ESC a
+Interpolate a leader in copy mode.
+.
+.TP
+.ESCq A anything
+Interpolate 1 if
+.I anything
+is a valid identifier,
+and\~0 otherwise.
+.
+.TP
+.ESCq b string
+Build bracket:
+pile a sequence of glyphs corresponding to each character in
+.I string
+vertically,
+and center it vertically on the output line.
+.
+.TP
+.ESCq B anything
+Interpolate 1 if
+.I anything
+is a valid numeric expression,
+and\~0 otherwise.
+.
+.
+.TP
+.ESC c
+Continue output line at next input line.
+.
+.
+.TP
+.ESCq C glyph
+As
+.esc[] "" glyph ,
+but compatible with other
+.I troff \" generic
+implementations.
+.
+.
+.TP
+.ESC d
+Move downward \[12]\~em on typesetters.
+.\" XXX: No current groff nroff-mode output driver supports half-line
+.\" motions.
+.\" (\[12]\~line in
+.\" .I nroff
+.\" contingent on device support).
+.
+.
+.TP
+.ESCq D drawing-command
+See subsection \[lq]Drawing commands\[rq] below.
+.
+.
+.TP
+.ESC e
+Interpolate the escape character.
+.
+.
+.TP
+.ESC E
+As
+.esc e ,
+but not interpreted in copy mode.
+.
+.TP
+.ESC fP
+Select previous font mounting position
+(abstract style or font);
+same as
+.RB \[lq] .ft \[rq]
+or
+.RB \[lq] .ft\~P \[rq].
+.
+.TP
+.ESC f F
+Select font mounting position,
+abstract style,
+or font with one-character name or one-digit
+.RI position\~ F .
+.
+.IR F \~cannot
+be
+.BR P .
+.
+.TP
+.ESC f( ft
+Select font mounting position,
+abstract style,
+or font with two-character name or two-digit
+.RI position\~ ft .
+.
+.TP
+.ESC[] f font
+Select font mounting position,
+abstract style,
+or font with arbitrarily long name or position
+.IR font .
+.
+.I font
+cannot be
+.BR P .
+.
+.TP
+.ESC[] f ""
+Select previous font mounting position
+(abstract style or font).
+.
+.TP
+.ESC F f
+Set default font family to that with one-character
+.RI name\~ f .
+.
+.TP
+.ESC F( fm
+Set default font family to that with two-character
+.RI name\~ fm .
+.
+.TP
+.ESC[] F fam
+Set default font family to that with arbitrarily long name
+.IR fam .
+.
+.TP
+.ESC[] F ""
+Set default font family to previous value.
+.
+.TP
+.ESC g r
+Interpolate format of register with one-character
+.RI name\~ r .
+.
+.
+.TP
+.ESC g( rg
+Interpolate format of register with two-character
+.RI name\~ rg .
+.
+.
+.TP
+.ESC[] g reg
+Interpolate format of register with arbitrarily long name
+.IR reg .
+.
+.
+.TP
+.ESCq h N
+Horizontally move the drawing position by
+.IR N \~ems
+(or specified units);
+.B \[or]
+may be used.
+.
+Positive motion is rightward.
+.
+.
+.TP
+.ESCq H N
+Set height of current font to
+.IR N \~scaled
+points
+(or specified units).
+.
+.
+.TP
+.ESC k r
+Mark horizontal position in one-character register
+.RI name\~ r .
+.
+.TP
+.ESC k( rg
+Mark horizontal position in two-character register
+.RI name\~ rg .
+.
+.
+.TP
+.ESC[] k reg
+Mark horizontal position in register with arbitrarily long
+.RI name\~ reg .
+.
+.
+.TP
+.ESCq l N\/\f[R][\f[]c\f[R]]
+Draw horizontal line of length
+.I N
+with character
+.B c
+(default:
+.BR \[rs][ru] ;
+default scaling unit\~\c
+.scaleindicator m ).
+.
+.
+.
+.TP
+.ESCq L N\/\f[R][\f[]c\f[R]]
+Draw vertical line of length
+.I N
+with character
+.B c
+(default:
+.BR \[rs][br] ;
+default scaling unit\~\c
+.scaleindicator v ).
+.
+.
+.TP
+.ESC m c
+Set stroke color to that with one-character
+.RI name\~ c .
+.
+.
+.TP
+.ESC m( cl
+Set stroke color to that with two-character
+.RI name\~ cl .
+.
+.
+.TP
+.ESC[] m color
+Set stroke color to that with arbitrarily long
+.RI name\~ color .
+.
+.
+.TP
+.ESC[] m ""
+Restore previous stroke color.
+.
+.
+.TP
+.ESC M c
+Set fill color to that with one-character
+.RI name\~ c .
+.
+.
+.TP
+.ESC M( cl
+Set fill color to that with two-character
+.RI name\~ cl .
+.
+.
+.TP
+.ESC[] M color
+Set fill color to that with arbitrarily long
+.RI name\~ color .
+.
+.
+.TP
+.ESC[] M ""
+Restore previous fill color.
+.
+.
+.br
+.ne 4v \" XXX: why not 3v?
+.TP
+.ESC n r
+Interpolate contents of register with one-character
+.RI name\~ r .
+.
+.
+.TP
+.ESC n( rg
+Interpolate contents of register with two-character
+.RI name\~ rg .
+.
+.
+.TP
+.ESC[] n reg
+Interpolate contents of register with arbitrarily long
+.RI name\~ reg .
+.
+.
+.TP
+.ESCq N n
+Interpolate glyph with
+.RI index\~ n
+in the current font.
+.
+.TP
+.ESCq o abc\f[R].\|.\|.\f[]
+Overstrike centered glyphs of characters
+.IR a ,
+.IR b ,
+.IR c ,
+and so on.
+.
+.TP
+.ESC O0
+At the outermost suppression level,
+disable emission of glyphs and geometric objects to the output
+driver.
+.
+.
+.TP
+.ESC O1
+At the outermost suppression level,
+enable emission of glyphs and geometric objects to the output driver.
+.
+.
+.TP
+.ESC O2
+At the outermost suppression level,
+enable glyph and geometric primitive emission to the output driver and
+write to the standard error stream the page number,
+four bounding box registers enclosing glyphs written since the previous
+.B \[rs]O
+escape sequence,
+the page offset,
+line length,
+image file name
+(if any),
+horizontal and vertical device motion quanta,
+and input file name.
+.
+.
+.TP
+.ESC O3
+Begin a nested suppression level.
+.
+.
+.TP
+.ESC O4
+End a nested suppression level.
+.
+.
+.TP
+.ESC[] O "\f[CB]5\f[]Pfile"
+At the outermost suppression level,
+write the name
+.I file
+to the standard error stream at
+.RI position\~ P ,
+which must be one of
+.BR l ,
+.BR r ,
+.BR c ,
+or
+.BR i .
+.
+.
+.TP
+.ESC p
+Break output line at next word boundary;
+adjust if applicable.
+.
+.
+.TP
+.ESC r
+Move \[lq]in reverse\[rq] (upward) 1\~em.
+.
+.
+.TP
+.ESCq R "name\~\[+-]N"
+Set,
+increment,
+or decrement register
+.I name
+.RI by\~ N .
+.
+.
+.TP
+.ESC s \[+-]N
+Set/increase/decrease the type size to/by
+.I N
+scaled points.
+.
+.I N
+must be a single digit;
+0 restores the previous type size.
+.
+(In compatibility mode only,
+a non-zero
+.I N
+must be in the range 4\[en]39.)
+.
+Otherwise,
+as
+.request .ps
+request.
+.
+.
+.TP
+.ESC s( \[+-]N
+.TQ
+.fam C
+.BI \es \[+-] ( N
+.fam
+Set/increase/decrease the type size to/by
+.I N
+scaled points;
+.I N
+is a two-digit number \[>=]1.
+.
+As
+.request .ps
+request.
+.
+.
+.TP
+.ESC[] s \[+-]N
+.TQ
+.fam C
+.BI \es \[+-] [ N ]
+.fam
+.TQ
+.ESCq s \[+-]N
+.TQ
+.fam C
+.BI \es \[+-] \[aq] N \[aq]
+.fam
+Set/increase/decrease the type size to/by
+.I N
+scaled points.
+.
+As
+.request .ps
+request.
+.
+.
+.TP
+.ESCq S N
+Slant output glyphs by
+.I N
+degrees;
+the direction of text flow is positive.
+.
+.
+.TP
+.ESC t
+Interpolate a tab in copy mode.
+.
+.
+.TP
+.ESC u
+Move upward \[12]\~em on typesetters.
+.\" XXX: No current groff nroff-mode output driver supports half-line
+.\" motions.
+.\" (\[12]\~line in
+.\" .I nroff
+.\" contingent on device support).
+.
+.
+.TP
+.ESCq v N
+Vertically move the drawing position by
+.IR N \~vees
+(or specified units);
+.B \[or]
+may be used.
+.
+Positive motion is downward.
+.
+.
+.TP
+.ESC V e
+Interpolate contents of environment variable with one-character
+.RI name\~ e .
+.
+.
+.TP
+.ESC V( ev
+Interpolate contents of environment variable with two-character
+.RI name\~ ev .
+.
+.
+.TP
+.ESC[] V env
+Interpolate contents of environment variable with arbitrarily long
+.RI name\~ env .
+.
+.
+.TP
+.ESCq w anything
+Interpolate width of
+.IR anything ,
+formatted in a dummy environment.
+.
+.
+.TP
+.ESCq x N
+Increase vertical spacing of pending output line by
+.IR N \~vees
+(or specified units;
+negative before,
+positive after).
+.
+.TP
+.ESCq X anything
+Write
+.I anything
+to
+.I @g@troff
+output as a device control command.
+.
+Within
+.IR anything ,
+the escape sequences
+.BR \[rs]& ,
+.BR \[rs]) ,
+.BR \[rs]% ,
+and
+.B \[rs]:
+are ignored;
+.BI \[rs] space
+and
+.B \[rs]\[ti]
+are converted to single space characters;
+and
+.B \[rs]\[rs]
+has its escape character stripped.
+.
+So that the basic Latin subset of the Unicode character
+set can be reliably encoded in
+.I anything,
+the special character escape sequences
+.BR \[rs]\- ,
+.BR \[rs][aq] ,
+.BR \[rs][dq] ,
+.BR \[rs][ga] ,
+.BR \[rs][ha] ,
+.BR \[rs][rs] ,
+and
+.B \[rs][ti]
+are mapped to basic Latin characters;
+see
+.MR groff_char @MAN7EXT@ .
+.
+For this transformation,
+character translations and special character definitions are ignored.
+.
+.TP
+.ESC Y n
+Write contents of macro or string
+.I n
+to
+.I @g@troff
+output as a device control command.
+.
+.TP
+.ESC Y( nm
+Write contents of macro or string
+.I nm
+to
+.I @g@troff
+output as a device control command.
+.
+.TP
+.ESC[] Y name
+Write contents of macro or string
+.I name
+to
+.I @g@troff
+output as a device control command.
+.
+.TP
+.ESC z c
+Format character
+.I c
+with zero width\[em]without advancing the drawing position.
+.
+.TP
+.ESCq Z anything
+Save the drawing position,
+format
+.IR anything ,
+then restore it.
+.LE
+.
+.
+.\" ====================================================================
+.SS "Drawing commands"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Drawing
+.\" commands".
+Drawing commands direct the output device to render geometrical objects
+rather than glyphs.
+.
+Specific devices may support only a subset,
+or may feature additional ones;
+consult the man page for the output driver in use.
+.
+Terminal devices in particular implement almost none.
+.
+.
+.P
+Rendering starts at the drawing position;
+when finished,
+the drawing position is left at the rightmost point of the object,
+even for closed figures,
+except where noted.
+.
+GNU
+.I troff \" GNU
+draws stroked (outlined) objects with the stroke color,
+and shades filled ones with the fill color.
+.
+See section \[lq]Colors\[rq] above.
+.
+Coordinates
+.I h
+and
+.I v
+are horizontal and vertical motions relative to the drawing position
+or previous point in the command.
+.
+The default scaling unit for horizontal measurements
+(and diameters of circles)
+.RB is\~ m ;
+for vertical ones,
+.BR v .
+.
+.
+.P
+Circles,
+ellipses,
+and polygons can be drawn stroked or filled.
+.
+These are independent properties;
+if you want a filled,
+stroked figure,
+you must draw the same figure twice using each drawing command.
+.
+A filled figure is always smaller than an outlined one because the
+former is drawn only within its defined area,
+whereas strokes have a line thickness
+(set with
+.BR \[rs]D\[aq]t\[aq] ).
+.
+.
+.P
+.LS
+.TP
+.BI \[rs]D\[aq]\[ti]\~ "h1 v1"\~\c
+.RI .\|.\|.\~ "hn vn"\c
+.B \[aq]
+Draw B-spline to each point in sequence,
+leaving drawing position at
+.RI ( hn ,\~ vn ).
+.
+.\" XXX: This is one case where a valid coordinate pair could be off the
+.\" page (even negative) and we need to discuss this frankly.
+.TP
+.BI \[rs]D\[aq]a\~ "hc vc h v" \[aq]
+Draw circular arc centered at
+.RI ( hc ,\~ vc )
+counterclockwise from the drawing position to a point
+.RI ( h ,\~ v )
+relative to the center.
+.
+.RI ( hc ,\~ vc )
+is adjusted to the point nearest the perpendicular bisector of the arc's
+chord.
+.
+.TP
+.BI \[rs]D\[aq]c\~ "d" \[aq]
+Draw circle of diameter
+.I d
+with its leftmost point at the drawing position.
+.
+.TP
+.BI \[rs]D\[aq]C\~ "d" \[aq]
+As
+.BR \[rs]D\[aq]C\[aq] ,
+but the circle is filled.
+.
+.TP
+.BI \[rs]D\[aq]e\~ "h v" \[aq]
+Draw ellipse of width
+.I h
+and height
+.I v
+with its leftmost point at the drawing position.
+.
+.\" How do we draw an ellipse with rotated axes?
+.TP
+.BI \[rs]D\[aq]E\~ "h v" \[aq]
+As
+.BR \[rs]D\[aq]e\[aq] ,
+but the ellipse is filled.
+.
+.\" XXX: Df and dF are taken care of by \M and .defcolor.
+.TP
+.BI \[rs]D\[aq]l\~ "h v" \[aq]
+Draw line from the drawing position to
+.RI ( h ,\~ v ).
+.
+.TP
+.BI \[rs]D\[aq]p\~ "h1 v1"\~\c
+.RI .\|.\|.\~ "hn vn"\c
+.B \[aq]
+Draw polygon with vertices at drawing position and each point
+in sequence.
+.
+GNU
+.I troff \" GNU
+closes the polygon by drawing a line from
+.RI ( hn ,\~ vn )
+back to the initial drawing position.
+.
+.\" XXX: This would be the "STUPID_DRAWING_POSITIONING" complained of in
+.\" src/libs/libdriver/input.cpp. It is neither the rightmost point
+.\" of the figure nor the initial drawing position that GNU troff
+.\" automatically returned to to close the figure.
+Afterward,
+the drawing position is left at
+.RI ( hn ,\~ vn ).
+.
+.TP
+.BI \[rs]D\[aq]P\~ "h1 v1"\~\c
+.RI .\|.\|.\~ "hn vn"\c
+.B \[aq]
+As
+.BR \[rs]D\[aq]p\[aq] ,
+but the polygon is filled.
+.
+.TP
+.BI \[rs]D\[aq]t\~ "n" \[aq]
+Set stroke thickness of geometric objects to
+.RI to\~ n
+basic units.
+.
+A zero
+.I n
+selects the minimal supported thickness.
+.
+A negative
+.I n
+selects a thickness proportional to the type size;
+this is the default.
+.LE
+.\" END Keep (roughly) parallel with groff.texi node "Drawing
+.\" commands".
+.
+.
+.\" ====================================================================
+.SS "Device control commands"
+.\" ====================================================================
+.
+The
+.B .device
+and
+.B .devicem
+requests,
+and
+.B \[rs]X
+and
+.B \[rs]Y
+escape sequences,
+enable documents to pass information directly to a postprocessor.
+.
+These are useful for
+exercising device-specific capabilities that the
+.I groff
+language does not abstract or generalize;
+such functions include the embedding of hyperlinks and image files.
+.
+Device-specific functions are documented in
+each output driver's man page.
+.
+.
+.\" ====================================================================
+.SH Strings
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Strings".
+.I groff
+supports strings primarily for user convenience.
+.
+Conventionally,
+if one would define a macro only to interpolate a small amount of text,
+without invoking requests or calling any other macros,
+one defines a string instead.
+.
+Only one string is predefined by the language.
+.
+.
+.TPx
+.STRING .T
+Contains the name of the output device
+(for example,
+.RB \[lq] utf8 \[rq]
+or
+.RB \[lq] pdf \[rq] ).
+.
+.
+.P
+The
+.request .ds
+request creates a string with a specified name and contents.
+.
+If the identifier named by
+.request .ds
+already exists as an alias,
+the target of the alias is redefined.
+.
+If
+.request .ds
+is called with only one argument,
+the named string becomes empty.
+.
+Otherwise,
+.I @g@troff
+stores the remainder of the control line in copy mode;
+see subsection \[lq]Copy mode\[rq] below.
+.
+.
+.P
+The
+.esc *
+escape sequence dereferences a string's name,
+interpolating its contents.
+.
+If the name does not exist,
+it is defined as empty,
+nothing is interpolated,
+and a warning in category
+.RB \%\[lq] mac \[rq]
+is emitted.
+.
+See section \[lq]Warnings\[rq] in
+.MR @g@troff 1 .
+.
+The bracketed interpolation form accepts arguments that are handled as
+macro arguments are;
+see section \[lq]Calling macros\[rq] above.
+.
+In contrast to macro calls,
+however,
+if a closing bracket
+.B ]
+occurs in a string argument,
+that argument must be enclosed in double quotes.
+.
+.B \[rs]*
+is interpreted even in copy mode.
+.
+When defining strings,
+argument interpolations must be escaped if they are to reference
+parameters from the calling context;
+see section \[lq]Parameters\[rq] below.
+.
+.
+.P
+An initial neutral double quote
+.B \[dq]
+in the string contents is stripped to allow embedding of leading spaces.
+.
+Any other
+.B \[dq]
+is interpreted literally,
+but it is wise to use the special character escape sequence
+.B \[rs][dq]
+instead if the string might be interpolated as part of a macro argument;
+see section \[lq]Calling macros\[rq] above.
+.
+Strings are not limited to a single input line of text.
+.BI \[rs] newline
+works just as it does elsewhere.
+.
+The resulting string is stored
+.I without
+the newlines.
+.
+Care is therefore required when interpolating strings while filling is
+disabled.
+.
+It is not possible to embed a newline in a string that will be
+interpreted as such when the string is interpolated.
+.
+To achieve that effect,
+use
+.B \[rs]*
+to interpolate a macro instead.\" see @ref{Punning Names}.
+.
+.
+.P
+The
+.request .as
+request is similar to
+.request .ds
+but appends to a string instead of redefining it.
+.
+If
+.request .as
+is called with only one argument,
+no operation is performed
+(beyond dereferencing the string).
+.
+.
+.P
+Because strings are similar to macros,
+they too can be defined to suppress AT&T
+.I troff \" AT&T
+compatibility mode enablement when interpolated;
+see section \[lq]Compatibility mode\[rq] below.
+.
+The
+.request .ds1
+request defines a string that suspends compatibility mode when the
+string is later interpolated.
+.
+.request .as1
+is likewise similar to
+.BR .as ,
+with compatibility mode suspended when the appended portion of the
+string is later interpolated.
+.
+.
+.P
+.B Caution:
+Unlike other requests,
+the second argument to these requests consumes the remainder of the
+input line,
+including trailing spaces.
+.
+Ending string definitions
+(and appendments)
+with a comment,
+even an empty one,
+prevents unwanted space from creeping into them during source document
+maintenance.
+.
+.
+.br
+.ne 3v
+.P
+Several requests exist to perform rudimentary string operations.
+.
+Strings can be queried
+(\c
+.request .length )
+and modified
+(\c
+.request .chop ,
+.request .substring ,
+.request .stringup ,
+.request .stringdown ),
+and their names can be manipulated through renaming,
+removal,
+and aliasing
+(\c
+.request .rn ,
+.request .rm ,
+.request .als).
+.
+.
+.P
+When a request,
+macro,
+string,
+or diversion is aliased,
+redefinitions and appendments \[lq]write through\[rq] alias names.
+.
+To replace an alias with a separately defined object,
+you must use the
+.B rm
+request on its name first.
+.\" END Keep (roughly) parallel with groff.texi node "Strings".
+.
+.
+.\" ====================================================================
+.SH Registers
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Registers".
+In the
+.I roff
+language,
+numbers can be stored in
+.I registers.
+.
+Many built-in registers exist,
+supplying anything from the date to details of formatting parameters.
+.
+You can also define your own.
+.
+See section \[lq]Identifiers\[rq] above for information on constructing
+a valid name for a register.
+.
+.
+.P
+Define registers and update their values with the
+.B nr
+request or the
+.B \[rs]R
+escape sequence.
+.
+.
+.P
+Registers can also be incremented or decremented by a configured amount
+at the time they are interpolated.
+.
+The value of the increment is specified with a third argument to the
+.request .nr
+request,
+and a special interpolation syntax,
+.BI \[rs]n \[+-]
+is used to alter and then retrieve
+the register's value.
+.
+Together,
+these features are called
+.IR auto-increment .
+.
+(A negative auto-increment can be
+considered an \[lq]auto-decrement\[rq].)
+.
+.
+.P
+Many predefined registers are available.
+.
+In the following presentation,
+the register interpolation syntax
+.BI \[rs]n[ name ]
+is used to refer to a register
+.I name
+to clearly distinguish it from a string or request
+.IR name .
+.
+The register name space is separate from that used for requests,
+macros,
+strings,
+and diversions.
+.
+Bear in mind that the symbols
+.B \[rs]n[]
+are
+.I not
+part of the register name.
+.\" END Keep (roughly) parallel with groff.texi node "Registers".
+.
+.
+.\" ====================================================================
+.SS "Read-only registers"
+.\" ====================================================================
+.
+Predefined registers whose identifiers start with a dot are read-only.
+.
+Many are Boolean-valued.
+.
+Some are string-valued,
+meaning that they interpolate text.
+.
+A register name
+(without the dot)
+is often associated with a request of the same name;
+exceptions are noted.
+.
+.
+.P
+.LS
+.
+.TP 15n
+.REG .$
+Count of arguments passed to currently interpolated macro or string.
+.
+.TP
+.REG .a
+Amount of extra post-vertical line space;
+see
+.esc x .
+.
+.TP
+.REG .A
+Approximate output is being formatted (Boolean-valued);
+see
+.I @g@troff
+.B \-a
+option.
+.
+.TP
+.REG .b
+Font emboldening offset;
+see
+.request .bd .
+.
+.TP
+.REG .br
+The normal control character was used to call the currently interpolated
+macro (Boolean-valued).
+.
+.TP
+.REG .c
+Input line number;
+see
+.request .lf
+and
+.register \f[R]\[lq]\f[]c.\f[R]\[rq]\f[] .
+.
+.TP
+.REG .C
+Compatibility mode is enabled (Boolean-valued);
+see
+.request .cp .
+.
+Always false when processing
+.request .do ;
+see
+.register .cp .
+.
+.TP
+.REG .cdp
+Depth of last glyph formatted in the environment;
+.\" TODO: Give page a discussion of glyph properties and move this.
+positive if glyph extends below the baseline.
+.
+.TP
+.REG .ce
+Count of output lines remaining to be centered.
+.
+.TP
+.REG .cht
+Height of last glyph formatted in the environment;
+.\" TODO: Give page a discussion of glyph properties and move this.
+positive if glyph extends above the baseline.
+.
+.TP
+.REG .color
+Color output is enabled (Boolean-valued).
+.
+.TP
+.REG .cp
+Within
+.request .do ,
+the saved value of compatibility mode;
+see
+.register .C .
+.
+.TP
+.REG .csk
+Skew of the last glyph formatted in the environment;
+.\" TODO: Give page a discussion of glyph properties and move this.
+skew is how far to the right of the center of a glyph the center of an
+accent over that glyph should be placed.
+.
+.TP
+.REG .d
+Vertical drawing position in diversion.
+.
+.TP
+.REG .ev
+Name of environment (string-valued).
+.
+.TP
+.REG .f
+Mounting position of selected font;
+see
+.request .ft
+and
+.esc f .
+.
+.TP
+.REG .F
+Name of input file (string-valued);
+see
+.request .lf .
+.
+.TP
+.REG .fam
+Name of default font family (string-valued).
+.
+.TP
+.REG .fn
+Resolved name of selected font (string-valued);
+see
+.request .ft
+and
+.esc f .
+.
+.TP
+.REG .fp
+Next non-zero free font mounting position index.
+.
+.TP
+.REG .g
+Always true in GNU
+.I troff \" GNU
+(Boolean-valued).
+.
+.TP
+.REG .h
+Text baseline high-water mark on page or in diversion.
+.
+.TP
+.REG .H
+Horizontal motion quantum of output device in basic units.
+.
+.TP
+.REG .height
+Font height;
+see
+.esc H .
+.
+.TP
+.REG .hla
+Hyphenation language in environment (string-valued).
+.
+.TP
+.REG .hlc
+Count of immediately preceding consecutive hyphenated lines in
+environment.
+.
+.TP
+.REG .hlm
+Maximum quantity of consecutive hyphenated lines allowed in environment.
+.
+.TP
+.REG .hy
+Automatic hyphenation mode in environment.
+.
+.TP
+.REG .hym
+Hyphenation margin in environment.
+.
+.TP
+.REG .hys
+Hyphenation space adjustment threshold in environment.
+.
+.TP
+.REG .i
+Indentation amount;
+see
+.request .in .
+.
+.TP
+.REG .in
+Indentation amount applicable to the pending output line;
+see
+.request .ti .
+.
+.TP
+.REG .int
+Previous output line was \[lq]interrupted\[rq] or continued with
+.esc c
+(Boolean-valued).
+.
+.TP
+.REG .j
+Adjustment mode encoded as an integer;
+see
+.request .ad
+and
+.request .na .
+.
+Do not interpret or perform arithmetic on its value.
+.
+.TP
+.REG .k
+Horizontal drawing position relative to indentation.
+.
+.TP
+.REG .kern
+Pairwise kerning is enabled (Boolean-valued).
+.
+.TP
+.REG .l
+Line length;
+see
+.request .ll .
+.
+.TP
+.REG .L
+Line spacing;
+see
+.request .ls .
+.
+.TP
+.REG .lg
+Ligature mode.
+.
+.TP
+.REG .linetabs
+Line-tabs mode is enabled (Boolean-valued).
+.
+.TP
+.REG .ll
+Line length applicable to the pending output line.
+.
+.TP
+.REG .lt
+Title length.
+.
+.TP
+.REG .m
+Stroke color (string-valued);
+see
+.request .gcolor
+and
+.esc m .
+.
+Empty if the stroke color is the default.
+.
+.TP
+.REG .M
+Fill color (string-valued);
+see
+.request .fcolor
+and
+.esc M .
+.
+Empty if the fill color is the default.
+.
+.TP
+.REG .n
+Length of formatted output on previous output line.
+.
+.TP
+.REG .ne
+Amount of vertical space required by last
+.request .ne
+that caused a trap to be sprung;
+also see
+.register .trunc .
+.
+.TP
+.REG .nm
+Output line numbering is enabled (Boolean-valued).
+.
+.TP
+.REG .nn
+Count of output lines remaining to have numbering suppressed.
+.
+.TP
+.REG .ns
+No-space mode is enabled (Boolean-valued).
+.
+.TP
+.REG .o
+Page offset;
+see
+.request .po .
+.
+.TP
+.REG .O
+Output suppression nesting level;
+see
+.esc O .
+.
+.TP
+.REG .p
+Page length;
+see
+.request .pl .
+.
+.TP
+.REG .P
+The page is selected for output (Boolean-valued);
+see
+.I @g@troff
+.B \-o
+option.
+.
+.TP
+.REG .pe
+Page ejection is in progress (Boolean-valued).
+.
+.TP
+.REG .pn
+Number of the next page.
+.
+.TP
+.REG .ps
+Type size in scaled points.
+.
+.TP
+.REG .psr
+Most recently requested type size in scaled points;
+see
+.request .ps
+and
+.esc s .
+.
+.TP
+.REG .pvs
+Post-vertical line spacing.
+.
+.TP
+.REG .R
+Count of available unused registers;
+always 10,000 in GNU
+.IR troff . \" GNU
+.
+.TP
+.REG .rj
+Count of lines remaining to be right-aligned.
+.
+.TP
+.REG .s
+Type size in points as a decimal fraction (string-valued);
+see
+.request .ps
+and
+.esc s .
+.
+.TP
+.REG .slant
+Slant of font in degrees;
+see
+.esc S .
+.
+.TP
+.REG .sr
+Most recently requested type size in points as a decimal fraction
+(string-valued);
+see
+.request .ps
+and
+.esc s .
+.
+.TP
+.REG .ss
+Size of minimal inter-word space in twelfths of the space width of the
+selected font.
+.
+.TP
+.REG .sss
+Size of additional inter-sentence space in twelfths of the space width
+of the selected font.
+.
+.TP
+.REG .sty
+Selected abstract style (string-valued);
+see
+.request .ft
+and
+.esc f .
+.
+.TP
+.REG .t
+Distance to next vertical position trap;
+see
+.request .wh
+and
+.request .ch .
+.
+.TP
+.REG .T
+An output device was explicitly selected (Boolean-valued);
+see
+.I @g@troff
+.B \-T
+option.
+.
+.TP
+.REG .tabs
+Representation of tab settings suitable for use as argument to
+.request .ta
+(string-valued).
+.
+.TP
+.REG .trunc
+Amount of vertical space truncated by the most recently sprung
+vertical position trap,
+or,
+if the trap was sprung by an
+.request .ne ,
+minus the amount of vertical motion produced by
+.request .ne ;
+also see
+.register .ne .
+.
+.TP
+.REG .u
+Filling is enabled (Boolean-valued);
+see
+.request .fi
+and
+.request .nf .
+.
+.TP
+.REG .U
+Unsafe mode is enabled (Boolean-valued);
+see
+.I @g@troff
+.B \-U
+option.
+.
+.TP
+.REG .v
+Vertical line spacing;
+see
+.request .vs .
+.
+.TP
+.REG .V
+Vertical motion quantum of the output device in basic units.
+.
+.TP
+.REG .vpt
+Vertical position traps are enabled (Boolean-valued).
+.
+.TP
+.REG .w
+Width of previous glyph formatted in the environment.
+.
+.TP
+.REG .warn
+Sum of the numeric codes of enabled warning categories.
+.
+.TP
+.REG .x
+Major version number of the running
+.I @g@troff
+formatter.
+.
+.TP
+.REG .y
+Minor version number of the running
+.I @g@troff
+formatter.
+.
+.TP
+.REG .Y
+Revision number of the running
+.I @g@troff
+formatter.
+.
+.TP
+.REG .z
+Name of diversion (string-valued).
+.
+Empty if output is directed to the top-level diversion.
+.
+.TP
+.REG .zoom
+Zoom multiplier of current font
+(in thousandths;
+zero if no magnification);
+see
+.request .fzoom .
+.LE
+.
+.
+.\" ====================================================================
+.SS "Writable predefined registers"
+.\" ====================================================================
+.
+Several registers are predefined but also modifiable;
+some are updated upon interpretation of certain requests or escape
+sequences.
+.
+Date- and time-related registers are set to the local time as determined
+by
+.MR localtime 3
+when the formatter launches.
+.
+This initialization can be overridden by
+.I \%SOURCE_DATE_EPOCH
+and
+.IR TZ ;
+see section \[lq]Environment\[rq] of
+.MR groff @MAN1EXT@ .
+.
+.
+.P
+.LS
+.
+.TP 15n
+.REG $$
+Process ID of
+.IR @g@troff .
+.
+.TP
+.REG %
+Page number.
+.
+.TP
+.REG c.
+Input line number.
+.
+.TP
+.REG ct
+Union of character types of each glyph rendered into dummy environment
+by
+.esc w .
+.
+.TP
+.REG dl
+Width of last closed diversion.
+.
+.TP
+.REG dn
+Height of last closed diversion.
+.
+.TP
+.REG dw
+Day of the week (1\[en]7;
+1 is Sunday).
+.
+.TP
+.REG dy
+Day of the month (1\[en]31).
+.
+.TP
+.REG hours
+Count of hours elapsed since midnight (0\[en]23).
+.
+.TP
+.REG hp
+Horizontal drawing position relative to start of input line.
+.
+.TP
+.REG llx
+Lower-left
+.I x
+coordinate
+(in PostScript units)
+of PostScript image;
+see
+.request .psbb .
+.
+.TP
+.REG lly
+Lower-left
+.I y
+coordinate
+(in PostScript units)
+of PostScript image;
+see
+.request .psbb .
+.
+.TP
+.REG ln
+Output line number;
+see
+.request .nm .
+.
+.TP
+.REG lsn
+Count of leading spaces on input line.
+.
+.TP
+.REG lss
+Amount of horizontal space corresponding to leading spaces on input
+line.
+.
+.TP
+.REG minutes
+Count of minutes elapsed in the hour (0\[en]59).
+.
+.TP
+.REG mo
+Month of the year (1\[en]12).
+.
+.TP
+.REG nl
+Vertical drawing position.
+.
+.TP
+.REG opmaxx
+.TP
+.REG opmaxy
+.TP
+.REG opminx
+.TP
+.REG opminy
+These four registers mark the top left- and bottom right-hand corners of
+a rectangle encompassing all formatted output on the page.
+.
+They are reset to \-1 by
+.B \[rs]O0
+or
+.BR \[rs]O1 .
+.
+.TP
+.REG rsb
+As
+.register sb ,
+adding maximum glyph height to measurement.
+.
+.TP
+.REG rst
+As
+.register st ,
+adding maximum glyph depth to measurement.
+.
+.TP
+.REG sb
+Maximum displacement of text baseline below its original position
+after rendering into dummy environment by
+.esc w .
+.
+.TP
+.REG seconds
+Count of seconds elapsed in the minute (0\[en]60). \" not 59; see POSIX
+.
+.TP
+.REG skw
+Skew of last glyph rendered into dummy environment by
+.esc w .
+.
+.TP
+.REG slimit
+The maximum depth of
+.IR @g@troff 's
+internal input stack.
+.
+If \[<=]0,
+there is no limit:
+recursion can continue until available memory is exhausted.
+.
+The default is 1,000.
+.
+.TP
+.REG ssc
+Subscript correction of last glyph rendered into dummy environment by
+.esc w .
+.
+.TP
+.REG st
+Maximum displacement of text baseline above its original position
+after rendering into dummy environment by
+.esc w .
+.
+.TP
+.REG systat
+Return value of
+.I system()
+function; see
+.request .sy .
+.
+.TP
+.REG urx
+Upper-right
+.I x
+coordinate
+(in PostScript units)
+of PostScript image;
+see
+.request .psbb .
+.
+.TP
+.REG ury
+Upper-right
+.I y
+coordinate
+(in PostScript units)
+of PostScript image;
+see
+.request .psbb .
+.
+.TP
+.REG year
+Gregorian year.
+.
+.TP
+.REG yr
+Gregorian year minus 1900.
+.LE
+.
+.
+.\" ====================================================================
+.SH "Using fonts"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Using Fonts".
+In digital typography,
+a
+.I font
+is a collection of characters in a specific typeface that a device can
+render as glyphs at a desired size.
+.
+(Terminals and some output devices have fonts that render at only one or
+two sizes.
+.
+As examples of the latter,
+take the
+.I groff
+.B lj4
+device's
+Lineprinter,
+and
+.BR lbp 's
+Courier and Elite faces.)
+.
+.
+A
+.I roff
+formatter can change typefaces at any point in the text.
+.
+The basic faces are a set of
+.I styles
+combining upright and slanted shapes with normal and heavy stroke
+weights:
+.RB \[lq] R \[rq],
+.RB \[lq] I \[rq],
+.RB \[lq] B \[rq],
+and
+.RB \[lq] BI \[rq]\[em]\c
+these stand for
+.I roman,
+.I bold,
+.I italic,
+and
+.I bold-italic.
+.
+For linguistic text,
+GNU
+.I troff \" GNU
+groups typefaces into
+.I families
+containing each of these styles.
+.
+(Font designers prepare families such that the styles share esthetic
+properties.)
+.
+A
+.I "text font"
+is thus often a family combined with a style,
+but it need not be:
+consider the
+.B ps
+and
+.B pdf
+devices'
+.B ZCMI
+(Zapf Chancery Medium italic)\[em]\c
+often,
+no other style of Zapf Chancery Medium is provided.
+.
+On typesetting devices,
+at least one
+.I "special font"
+is available,
+comprising
+.I unstyled
+glyphs for mathematical operators and other purposes.
+.
+.
+.P
+Like AT&T
+.I troff, \" AT&T
+GNU
+.I troff \" GNU
+does not itself load or manipulate a digital font file;
+.\" @footnote{Historically, the fonts @code{troff}s dealt with were not
+.\" Free Software or, as with the Graphic Systems C/A/T, did not even
+.\" exist in the digital domain.}
+instead it
+works with a
+.I font description file
+that characterizes it,
+including its glyph repertoire and the
+.I metrics
+(dimensions) of each glyph.
+.
+This information permits the formatter to accurately place glyphs with
+respect to each other.
+.
+Before using a font description,
+the formatter associates it with a
+.I "mounting position,"
+a place in an ordered list of available typefaces.
+.
+So that a document need not be strongly coupled to a specific font
+family,
+in GNU
+.I troff \" GNU
+an output device can associate a style in the abstract sense with a
+mounting position.
+.
+Thus the default family can be combined with a style dynamically,
+producing a
+.I "resolved font name."
+.
+.
+.P
+Fonts often have trademarked names,
+and even Free Software fonts can require renaming upon modification.
+.
+.I groff
+maintains a convention that a device's serif font family is given the
+name
+.B T
+(\[lq]Times\[rq]),
+its sans-serif family
+.B H
+(\[lq]Helvetica\[rq]),
+and its
+monospaced family
+.B C
+(\[lq]Courier\[rq]).
+.
+Historical inertia has driven
+.IR groff 's
+font identifiers to short uppercase abbreviations of font names,
+as with
+.BR TR ,
+.BR TB ,
+.BR TI ,
+.BR TBI ,
+and a special font
+.BR S .
+.
+.
+.P
+The default family used with abstract styles can be changed at any time;
+initially,
+it
+.RB is\~ T .
+.
+Typically,
+abstract styles are arranged in the first four mounting positions in the
+order shown above.
+.
+The default mounting position,
+and therefore style,
+is always
+.B 1
+.RB ( R ).
+.
+By issuing appropriate formatter instructions,
+you can override these defaults before your document writes its first
+glyph.
+.
+.
+.P
+Terminal output devices cannot change font families and lack special
+fonts.
+.
+They support style changes by overstriking,
+or by altering ISO\~6429/\:ECMA-48
+.I "graphic renditions"
+(character cell attributes).
+.\" END Keep (roughly) parallel with groff.texi node "Using Fonts".
+.
+.
+.\" ====================================================================
+.SH Hyphenation
+.\" ====================================================================
+.
+When filling,
+.I groff
+hyphenates words as needed at user-specified and automatically
+determined hyphenation points.
+.
+Explicitly hyphenated words such as \[lq]mother-in-law\[rq] are always
+eligible for breaking after each of their hyphens.
+.
+The hyphenation
+.RB character\~ \[rs]%
+and non-printing break
+.RB point\~ \[rs]:
+escape sequences may be used to control the hyphenation and breaking of
+individual words.
+.
+The
+.B .hw
+request sets user-defined hyphenation points for specified words at any
+subsequent occurrence.
+.
+Otherwise,
+.I groff
+determines hyphenation points automatically by default.
+.
+.
+.P
+Several requests influence automatic hyphenation.
+.
+Because conventions vary,
+a variety of hyphenation modes is available to the
+.B .hy
+request;
+these determine whether hyphenation will apply to a word prior to
+breaking a line at the end of a page
+(more or less;
+see below for details),
+and at which positions within that word automatically determined
+hyphenation points are permissible.
+.
+The default is
+.RB \[lq] 1 \[rq]
+for historical reasons,
+but this is not an appropriate value for the English hyphenation
+patterns used by
+.IR groff ;
+localization macro files loaded by
+.I troffrc
+and macro packages often override it.
+.
+.
+.TP
+.B 0
+disables hyphenation.
+.
+.
+.TP
+.B 1
+enables hyphenation except after the first and before the last character
+of a word.
+.
+.
+.P
+The remaining values \[lq]imply\[rq]
+.BR 1 ;
+that is,
+they enable hyphenation under the same conditions as
+.RB \[lq] ".hy 1" \[rq],
+and then apply or lift restrictions relative to that basis.
+.
+.
+.TP
+.B 2
+disables hyphenation of the last word on a page.
+.
+(Hyphenation is prevented if the next page location trap is closer to
+the vertical drawing position than the next text baseline would be.
+.
+See section \[lq]Traps\[rq] below.)
+.
+.
+.TP
+.B 4
+disables hyphenation before the last two characters of a word.
+.
+.
+.TP
+.B 8
+disables hyphenation after the first two characters of a word.
+.
+.
+.TP
+.B 16
+enables hyphenation before the last character of a word.
+.
+.
+.TP
+.B 32
+enables hyphenation after the first character of a word.
+.
+.
+.P
+Apart from value\~2,
+restrictions imposed by the hyphenation mode are
+.I not
+respected for words whose hyphenations have been specified with the
+hyphenation character
+.RB (\[lq] \|\[rs]% \[rq]
+by default)
+or the
+.B .hw
+request.
+.
+.
+.P
+Nonzero values are additive.
+.
+For example,
+mode\~12 causes
+.I groff
+to hyphenate neither the last two nor the first two characters of a
+word.
+.
+Some values cannot be used together because they contradict;
+for instance,
+values 4 and\~16,
+and values 8 and\~32.
+.
+As noted,
+it is superfluous to add\~1 to any non-zero even mode.
+.
+.
+.br
+.ne 2v
+.P
+The places within a word that are eligible for hyphenation are
+determined by language-specific data
+.RB ( .hla ,
+.BR .hpf ,
+and
+.BR .hpfa )
+and lettercase relationships
+.RB ( .hcode
+and
+.BR .hpfcode ).
+.
+Furthermore,
+hyphenation of a word might be suppressed due to a limit on
+consecutive hyphenated lines
+.RB ( .hlm ),
+a minimum line length threshold
+.RB ( .hym ),
+or because the line can instead be adjusted with additional inter-word
+space
+.RB ( .hys ).
+.
+.
+.\" ====================================================================
+.SH Localization
+.\" ====================================================================
+.
+The set of hyphenation patterns is associated with the hyphenation
+language set by the
+.B .hla
+request.
+.
+The
+.B .hpf
+request is usually invoked by a localization file loaded by the
+.I troffrc
+file.
+.
+.I groff
+provides localization files for several languages;
+see
+.MR groff_tmac @MAN5EXT@ .
+.
+.
+.\" ====================================================================
+.SH "Writing macros"
+.\" ====================================================================
+.
+The
+.B .de
+request defines a macro named for its argument.
+.
+If that name already exists as an alias,
+the target of the alias is redefined;
+see section \[lq]Strings\[rq] above.
+.
+.I @g@troff
+enters \[lq]copy mode\[rq]
+(see below),
+storing subsequent input lines as the definition.
+.
+If the optional second argument is not specified,
+the definition ends with the control line
+.RB \[lq] .. \[rq]\&
+(two dots).
+.
+Alternatively,
+a second argument names a macro whose call syntax ends the definition;
+this \[lq]end macro\[rq] is then called normally.
+.
+Spaces or tabs are permitted after the first control character in the
+line containing this ending token,
+but a tab immediately after the token prevents its recognition as the
+end of a macro definition.
+.
+Macro definitions can be nested if they use distinct end macros or if
+their ending tokens are sufficiently escaped.
+.
+An end macro need not be defined until it is called.
+.
+This fact enables a nested macro definition to begin inside one macro
+and end inside another.
+.
+.
+.P
+Variants of
+.B .de
+disable compatibility mode and/or indirect the names of the macros
+specified for definition or termination:
+these are
+.BR .de1 ,
+.BR .dei ,
+and
+.BR .dei1 .
+.
+Append to macro definitions with
+.BR .am ,
+.BR .am1 ,
+.BR .ami ,
+and
+.BR .ami1 .
+.
+The
+.BR .als ,
+.BR .rm ,
+and
+.B .rn
+requests create an alias of,
+remove,
+and rename a macro,
+respectively.
+.
+.B .return
+stops the execution of a macro immediately,
+returning to the enclosing context.
+.
+.
+.\" ====================================================================
+.SS Parameters
+.\" ====================================================================
+.
+Macro call and string interpolation parameters can be accessed using
+escape sequences starting with
+.RB \[lq] \|\[rs]$ \[rq].
+.
+The
+.B \[rs]n[.$]
+read-only register stores the count of parameters available to a macro
+or string;
+its value can be changed by the
+.B .shift
+request,
+which dequeues parameters from the current list.
+.
+The
+.B \[rs]$0
+escape sequence interpolates the name by which a macro was called.
+.
+Applying string interpolation to a macro does not change this name.
+.
+.
+.\" ====================================================================
+.SS "Copy mode"
+.\" ====================================================================
+.
+When
+.I @g@troff
+processes certain requests,
+most importantly those which define or append to a macro or string,
+it does so in
+.IR "copy mode" :
+it copies the characters of the definition into a dedicated storage
+region,
+interpolating the escape sequences
+.BR \[rs]n ,
+.BR \[rs]g ,
+.BR \[rs]$ ,
+.BR \[rs]* ,
+.BR \[rs]V ,
+and
+.B \[rs]?\&
+normally;
+interpreting
+.BI \[rs] newline
+immediately;
+discarding comments
+.B \[rs]"
+and
+.BR \[rs]# ;
+interpolating the current leader,
+escape,
+or tab character with
+.BR \[rs]a ,
+.BR \[rs]e ,
+and
+.BR \[rs]t ,
+respectively;
+and storing all other escape sequences in an encoded form.
+.
+The complement of copy mode\[em]a
+.I roff
+formatter's behavior when not defining or appending to a macro,
+string,
+or diversion\[em]where all macros are interpolated,
+requests invoked,
+and valid escape sequences processed immediately upon recognition,
+can be termed
+.IR "interpretation mode" .
+.
+.
+.P
+The escape character,
+.B \[rs]
+by default,
+can escape itself.
+.
+This enables you to control whether a given
+.BR \[rs]n ,
+.BR \[rs]g ,
+.BR \[rs]$ ,
+.BR \[rs]* ,
+.BR \[rs]V ,
+or
+.B \[rs]?\&
+escape sequence is interpreted at the time the macro containing it is
+defined,
+or later when the macro is called.
+.
+.
+.P
+You can think of
+.B \[rs]\[rs]
+as a \[lq]delayed\[rq] backslash;
+it is the escape character followed by a backslash from which the escape
+character has removed its special meaning.
+.
+Consequently,
+.B \[rs]\[rs]
+is not an escape sequence in the usual sense.
+.
+In any escape sequence
+.BI \[rs] X
+that
+.I @g@troff
+does not recognize,
+the escape character is ignored and
+.IR X \~is
+output.
+.
+An unrecognized escape sequence causes a warning in category
+.RB \%\[lq] escape \[rq],
+with two exceptions,
+.B \[rs]\[rs]
+being one.
+.
+The other is
+.BR \[rs]. ,
+which escapes the control character.
+.
+It is used to permit nested macro definitions to end without a named
+macro call to conclude them.
+.
+Without a syntax for escaping the control character,
+this would not be possible.
+.
+.I roff
+documents should not use the
+.B \[rs]\[rs]
+or
+.B \[rs].\&
+character sequences outside of copy mode;
+they serve only to obfuscate the input.
+.
+Use
+.B \[rs]e
+to represent the escape character,
+.B \[rs][rs]
+to obtain a backslash glyph,
+and
+.B \[rs]&
+before
+.B .\&
+and
+.B \[aq]
+where
+.I @g@troff
+expects them as control characters if you mean to use them literally.
+.
+.
+.br
+.ne 2v
+.P
+Macro definitions can be nested to arbitrary depth.
+.
+In
+.RB \[lq] \|\[rs]\[rs] \[rq],
+each escape character is interpreted twice\[em]once in copy mode,
+when the macro is defined,
+and once in interpretation mode,
+when the macro is called.
+.
+This fact leads to exponential growth in the quantity of escape
+characters required to delay interpolation of
+.BR \[rs]n ,
+.BR \[rs]g ,
+.BR \[rs]$ ,
+.BR \[rs]* ,
+.BR \[rs]V ,
+and
+.B \[rs]?\&
+at each nesting level.
+.
+An alternative is to use
+.BR \[rs]E ,
+which represents an escape character that is not interpreted in copy
+mode.
+.
+Because
+.B \[rs].\&
+is not a true escape sequence,
+we can't use
+.B \[rs]E
+to keep
+.RB \[lq] ..\& \[rq]
+from ending a macro definition prematurely.
+.
+If the multiplicity of backslashes complicates maintenance,
+use end macros.
+.
+.
+.\" ====================================================================
+.SH Traps
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Traps".
+.I Traps
+are locations in the output,
+or conditions on the input that,
+when reached or fulfilled,
+call a specified macro.
+.
+A
+.I "vertical position trap"
+calls a macro when the formatter's vertical drawing position reaches or
+passes,
+in the downward direction,
+a certain location on the output page or in a diversion.
+.
+Its applications include setting page headers and footers,
+body text in multiple columns,
+and footnotes.
+.
+These traps can occur at a given location on the page
+.RB ( .wh ,\~ .ch );
+at a given location in the current diversion
+.RB ( .dt )\[em]together,
+these are known as
+vertical position traps,
+which can be disabled and re-enabled
+.RB ( .vpt ).
+.
+.
+.P
+A diversion is not formatted in the context of a page,
+so it lacks page location traps;
+instead it can have a
+.I "diversion trap."
+.
+There can exist at most one such vertical position trap per diversion.
+.
+.
+.P
+Other kinds of trap can be planted
+at a blank line
+.RB ( .blm );
+at a line with leading space characters
+.RB ( .lsm );
+after a certain number of productive input lines
+.RB ( .it ,\~ .itc );
+or at the end of input
+.RB ( .em ).
+.
+Macros called by traps are passed no arguments.
+.
+Setting a trap is also called
+.I planting
+one.
+.
+It is said that a trap is
+.I sprung
+if its condition is fulfilled.
+.\" END Keep (roughly) parallel with groff.texi node "Traps".
+.
+.
+.br
+.ne 5v
+.P
+Registers associated with trap management include
+vertical position trap enablement status
+.RB ( \[rs]n[.vpt] ),
+distance to the next trap
+.RB ( \[rs]n[.t] ),
+amount of needed
+.RB ( .ne -requested)
+space that caused the most recent vertical position trap to be sprung
+.RB ( \[rs]n[.ne] ),
+amount of needed space truncated from the amount requested
+.RB ( \[rs]n[.trunc] ),
+page ejection status
+.RB ( \[rs]n[.pe] ),
+and
+leading space count
+.RB ( \[rs]n[.lsn] )
+with its corresponding amount of motion
+.RB ( \[rs]n[.lss] ).
+.
+.
+.\" ====================================================================
+.SS "Page location traps"
+.\" ====================================================================
+.
+A
+.I "page location trap"
+is a vertical position trap that applies to
+the page;
+that is,
+to undiverted output.
+.
+Many can be present;
+manage them with
+the
+.B wh
+and
+.B ch
+requests.
+.
+Non-negative page locations given to these requests set the trap
+relative to the top of the page;
+negative values set the trap relative to the bottom of the page.
+.
+It is not possible to plant a trap less than one basic unit from the
+page bottom:
+a location of \[lq]\-0\[rq] is interpreted as \[lq]0\[rq],
+the top of the page.
+.
+An existing
+.I visible
+trap
+(see below)
+at the same location is removed;
+this is
+.BR .wh 's
+sole function if its second argument is missing.
+.
+.
+.P
+A trap is sprung only if it is
+.I visible,
+meaning that its location is reachable on the page and it is not hidden
+by another trap at the same location already planted there.
+.
+(A trap planted at \[lq]20i\[rq] or \[lq]\-30i\[rq] will not be sprung
+on a page of length \[lq]11i\[rq].)
+.
+.
+.P
+A trap above the top or at or below the bottom of the page can be made
+visible by either moving it into the page area or increasing the page
+length so that the trap is on the page.
+.
+Negative trap values always use the
+.I current
+page length;
+they are not converted to an absolute vertical position.
+.
+Use
+.B .ptr
+to dump page location traps to the standard error stream;
+their positions are reported in basic units.
+.
+.
+.br
+.ne 6v
+.\" ====================================================================
+.SS "The implicit page trap"
+.\" ====================================================================
+.
+An
+.I implicit page trap
+always exists in the top-level diversion;
+it works like a trap in some ways but not others.
+.
+Its purpose is to eject the current page and start the next one.
+.
+It has no name,
+so it cannot be moved or deleted with
+.B wh
+or
+.B ch
+requests.
+.
+You cannot hide it by placing another trap at its location,
+and can move it only by redefining the page length with
+.BR .pl .
+.
+Its operation is suppressed when vertical page traps are disabled with
+the
+.B vpt
+request.
+.
+.
+.\" ====================================================================
+.SH Diversions
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Diversions".
+In
+.I roff
+systems it is possible to format text as if for output,
+but instead of writing it immediately,
+one can
+.I divert
+the formatted text into a named storage area.
+.
+It is retrieved later by specifying its name after a control character.
+.
+The same name space is used for such
+.I diversions
+as for strings and macros;
+see section \[lq]Identifiers\[rq] above.
+.
+Such text is sometimes said to be \[lq]stored in a macro\[rq],
+but this coinage obscures the important distinction between macros and
+strings on one hand and diversions on the other;
+the former store
+.I unformatted
+input text,
+and the latter capture
+.I formatted
+output.
+.
+Diversions also do not interpret arguments.
+.
+Applications of diversions include \[lq]keeps\[rq]
+(preventing a page break from occurring at an inconvenient place by
+forcing a set of output lines to be set as a group),
+footnotes,
+tables of contents,
+and indices.
+.
+For orthogonality it is said that GNU
+.I troff \" GNU
+is in the
+.I top-level diversion
+if no diversion is active
+(that is,
+formatted output is being \[lq]diverted\[rq] immediately to the output
+device.
+.
+.
+.P
+Dereferencing an undefined diversion will create an empty one of that
+name and cause a warning in category
+.B mac
+to be emitted.
+(see section \[lq]Warnings\[rq] in
+.MR @g@troff @MAN1EXT@ ).
+.
+A diversion does not exist for the purpose of testing with the
+.B d
+conditional operator until its initial definition ends
+(see subsection \[lq]Conditional expressions\[rq] above).
+.\" The following requests are used to create and alter diversions.
+.\" END Keep (roughly) parallel with groff.texi node "Diversions".
+.
+.
+.P
+The
+.B di
+request creates a diversion,
+including any partially collected line.
+.
+.B da
+appends to a diversion,
+creating one if it does not already exist.
+.
+If the diversion's name already exists as an alias,
+the target of the alias is replaced or appended to;
+see section \[lq]Strings\[rq] above.
+.
+.B box
+and
+.B boxa
+works similarly,
+but ignore partially collected lines.
+.
+Call any of these macros again without an argument to end the diversion.
+.
+.
+.br
+.ne 2v
+.P
+Diversions can be nested.
+.
+The registers
+.BR .d ,
+.BR .z ,
+.BR dn ,
+and
+.B dl
+report information about the current
+(or last closed)
+diversion.
+.
+.B .h
+is meaningful in diversions,
+including the top level.
+.
+.
+.P
+The
+.B \[rs]!\%
+and
+.B \[rs]?\%
+escape sequences and
+.B output
+request escape from a diversion,
+the first two to the enclosing level and the last to the top level.
+.
+This facility is termed
+.IR "transparent embedding" .
+.
+.
+.P
+The
+.B asciify
+and
+.B unformat
+requests reprocess diversions.
+.\" XXX: That's a weak statement. What we need is a `for` request and
+.\" a new conditional operator that tests whether an item in a node list
+.\" is an (otherwise unrepresentable) node. See Savannah #62264.
+.
+.
+.\" ====================================================================
+.SH "Punning names"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Punning names".
+Macros,
+strings,
+and diversions share a name space;
+see section \[lq]Identifiers\[rq] above.
+.
+Internally,
+the same mechanism is used to store them.
+.
+You can thus call a macro with string interpolation syntax and vice
+versa.
+.
+Interpolating a string does not hide existing macro arguments.
+.
+The sequence
+.B \[rs]\[rs]
+can be placed at the end of a line in a macro definition or,
+within a macro definition,
+immediately after the interpolation of a macro as a string to suppress
+the effect of a newline.
+.\" END Keep (roughly) parallel with groff.texi node "Punning names".
+.
+.
+.\" ====================================================================
+.SH Environments
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Environments".
+Environments store most of the parameters that control text processing.
+.
+A default environment named
+.RB \[lq] 0 \[rq]
+exists when
+.I @g@troff
+starts up;
+it is modified by formatting-related requests and escape sequences.
+.
+.
+.P
+You can create new environments and switch among them.
+.
+Only one is current at any given time.
+.
+Active environments are managed using a
+.I stack,
+a data structure supporting \[lq]push\[rq] and \[lq]pop\[rq] operations.
+.
+The current environment is at the top of the stack.
+.
+The same environment name can be pushed onto the stack multiple times,
+possibly interleaved with others.
+.
+Popping the environment stack does not destroy the current environment;
+it remains accessible by name and can be made current again by pushing
+it at any time.
+.
+Environments cannot be renamed or deleted,
+and can only be modified when current.
+.
+To inspect the environment stack,
+use the
+.B pev
+request;
+see section \[lq]Debugging\[rq] below.
+.
+.
+.P
+Environments store the following information.
+.
+.
+.IP \[bu] 2n
+a partially collected line, if any
+.
+.
+.IP \[bu]
+data about the most recently output glyph and line
+(registers
+.BR .cdp ,
+.BR .cht ,
+.BR .csk ,
+.BR .n ,
+.BR .w )
+.
+.
+.IP \[bu]
+typeface parameters
+(size,
+family,
+style,
+height and slant,
+inter-word and inter-sentence space sizes)
+.
+.
+.IP \[bu]
+page parameters
+(line length,
+title length,
+vertical spacing,
+line spacing,
+indentation,
+line numbering,
+centering,
+right-alignment,
+underlining,
+hyphenation parameters)
+.
+.
+.IP \[bu]
+filling enablement;
+adjustment enablement and mode
+.
+.
+.IP \[bu]
+tab stops;
+tab,
+leader,
+escape,
+control,
+no-break control,
+hyphenation,
+and
+margin characters
+.
+.
+.IP \[bu]
+input line traps
+.
+.
+.IP \[bu]
+stroke and fill colors
+.
+.
+.P
+The
+.B ev
+request pushes to and pops from the environment stack,
+while
+.B evc
+copies a named environment's contents to the current one.
+.\" END Keep (roughly) parallel with groff.texi node "Environments".
+.
+.
+.\" ====================================================================
+.SH Underlining
+.\" ====================================================================
+.
+In
+.I RUNOFF
+(see
+.MR roff @MAN7EXT@ ),
+underlining,
+even of lengthy passages,
+was straightforward because only fixed-pitch printing devices were
+targeted.
+.
+Typesetter output posed a greater challenge.
+.
+There exists a
+.I groff
+request
+.B .ul
+(see above)
+that underlines subsequent source lines on terminal devices,
+but on typesetters,
+it selects an italic font style instead.
+.
+.
+The
+.I ms
+macro package
+(see
+.MR groff_ms @MAN7EXT@ )
+offers a macro
+.BR .UL ,
+but it too produces the desired effect only on typesetters,
+and has other limitations.
+.
+.
+.P
+One could adapt
+.IR ms 's
+approach to the construction of a macro as follows.
+.
+.RS
+.EX
+\&.de UNDERLINE
+\&. ie n \[rs]\[rs]$1\[rs]f[I]\[rs]\[rs]$2\[rs]f[P]\[rs]\[rs]$3
+\&. el \[rs]\[rs]$1\[rs]Z\[aq]\[rs]\[rs]$2\[aq]\[rs]v\[aq].25m\[aq]\
+\[rs]D\[aq]l \[rs]w\[aq]\[rs]\[rs]$2\[aq]u 0\[aq]\[rs]v\[aq]\-.25m\
+\[aq]\[rs]\[rs]$3
+\&..
+.EE
+.RE
+.
+If
+.MR doclifter 1
+makes trouble, change the macro name
+.B UNDERLINE
+into some 2-letter word, like
+.BR Ul .
+.
+Moreover,
+change the form of the font selection escape sequence from
+.B \[rs]f[P]
+to
+.BR \[rs]fP .
+.
+.
+.\" ====================================================================
+.SS "Underlining without macro definitions"
+.\" ====================================================================
+.
+If one does not want to use macro definitions,
+e.g.,
+when
+.I doclifter
+gets lost,
+use the following.
+.
+.RS
+.EX
+\&.ds u1 before
+\&.ds u2 in
+\&.ds u3 after
+\&.ie n \[rs]*[u1]\[rs]f[I]\[rs]*[u2]\[rs]f[P]\[rs]*[u3]
+\&.el \[rs]*[u1]\[rs]Z\[aq]\[rs]*[u2]\[aq]\[rs]v\[aq].25m\[aq]\[rs]D\
+\[aq]l \[rs]w\[aq]\[rs]*[u2]\[aq]u 0\[aq]\[rs]v\[aq]\-.25m\[aq]\[rs]*\
+[u3]
+.EE
+.RE
+.
+.ne 2v
+When using
+.IR doclifter ,
+it might be necessary to change syntax forms such as
+.B \e[xy]
+and
+.B \e*[xy]
+to those supported by AT&T
+.IR troff :
+.B \e*(xy
+and
+.BR \e(xy ,
+and so on.
+.
+.
+.P
+Then these lines could look like
+.RS
+.EX
+\&.ds u1 before
+\&.ds u2 in
+\&.ds u3 after
+\&.ie n \[rs]*[u1]\[rs]fI\[rs]*(u2\[rs]fP\[rs]*(u3
+\&.el \[rs]*(u1\[rs]Z\[aq]\[rs]*(u2\[aq]\[rs]v\[aq].25m\[aq]\[rs]D\
+\[aq]l \[rs]w\[aq]\[rs]*(u2\[aq]u 0\[aq]\[rs]v\[aq]\-.25m\[aq]\[rs]*(u3
+.EE
+.RE
+.
+.
+.P
+The result looks like
+.RS
+.ft CR
+before
+\z\[ul]i\
+\z\[ul]n
+after
+.ft R
+.RE
+.
+.
+.\" ====================================================================
+.SS "Underlining by overstriking with \e(ul"
+.\" ====================================================================
+.
+The
+.B \[rs]z
+escape sequence writes a glyph without advancing the
+drawing position,
+enabling overstriking.
+.
+Thus,
+.BI \[rs]z c \[rs](ul
+formats
+.I c
+with an underrule glyph on top of it.
+.
+Video terminals implement the underrule by setting a character cell's
+underline attribute,
+so this technique works in both
+.I nroff \" mode
+and
+.I troff \" mode
+modes.
+.
+.
+.P
+Long words may then look intimidating in the input;
+a clarifying approach might be to use the input line continuation escape
+sequence
+.BI \[rs] newline
+to place each underlined character on its own input line.
+.
+Thus,
+.
+.RS
+.EX
+\&.nf
+\[rs]&\[rs]fB: ${\[rs]fIvar\[rs]fR\[rs]c
+\[rs]zo\[rs](ul\[rs]
+\[rs]zp\[rs](ul\[rs]c
+\[rs]&\[rs]fIvalue\[rs]fB}
+\&.fi
+.EE
+.RE
+.
+produces
+.
+.RS
+.EX
+.BI ": ${" var \c
+\zo\(ul\
+\zp\(ul\c
+.IB value }
+.EE
+.RE
+.
+as output.
+.
+.
+.\" ====================================================================
+.SH "Compatibility mode"
+.\" ====================================================================
+.
+The differences between the
+.I roff
+language recognized by GNU
+.I troff \" GNU
+and that of AT&T
+.IR troff , \" AT&T
+as well as the device,
+font,
+and device-independent intermediate output formats described by
+CSTR\~#54 are documented in
+.MR groff_diff @MAN7EXT@ .
+.
+.I groff
+provides an AT&T compatibility mode.
+.
+The
+.request .cp
+request and registers
+.B .C
+and
+.B .cp
+set and test the enablement of this mode.
+.
+.
+.\" ====================================================================
+.SH Debugging
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Debugging".
+Preprocessors use the
+.B .lf
+request to preserve the identities of line numbers and names of input
+files.
+.
+.I groff
+emits a variety of error diagnostics and supports several categories of
+warning;
+the output of these can be selectively suppressed with
+.B .warn
+(and see the
+.BR \-E ,
+.BR \-w ,
+and
+.B \-W
+options of
+.MR @g@troff @MAN1EXT@ ).
+.
+A trace of the formatter's input processing stack can be emitted when
+errors or warnings occur by means of
+.MR @g@troff @MAN1EXT@ 's
+.B \-b
+option,
+or produced on demand with the
+.request .backtrace
+request.
+.
+.BR .tm ,
+.BR .tmc ,
+and
+.B .tm1
+can be used to emit customized diagnostic messages or for
+instrumentation while troubleshooting.
+.
+.B .ex
+and
+.B .ab
+cause early termination with successful and error exit codes
+respectively,
+to halt further processing when continuing would be fruitless.
+.
+Examine the state of the formatter with requests that write lists of
+defined names\[em]macros,
+strings,
+and
+.RB diversions\[em]( .pm );
+environments
+.RB ( .pev ),
+registers
+.RB ( .pnr ),
+and page location traps
+.RB ( .ptr )
+to the standard error stream.
+.\" END Keep (roughly) parallel with groff.texi node "Debugging".
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+This document was written by
+by Trent A.\& Fisher,
+Werner Lemberg,
+and
+.MT g.branden\:.robinson@\:gmail\:.com
+G.\& Branden Robinson
+.ME .
+.
+Section \[lq]Underlining\[rq] was primarily written by
+.MT groff\-bernd\:.warken\-72@\:web\:.de
+Bernd Warken
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.ne 2v
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is the primary
+.I groff
+manual.
+.
+You can browse it interactively with \[lq]info groff\[rq].
+.
+.
+.br
+.ne 4v
+.P
+\[lq]Troff User's Manual\[rq]
+by Joseph F.\& Ossanna,
+1976
+(revised by Brian W.\& Kernighan,
+1992),
+AT&T Bell Laboratories Computing Science Technical Report No.\& 54,
+widely called simply \[lq]CSTR\~#54\[rq],
+documents the language,
+device and font description file formats,
+and device-independent output format
+referred to collectively in
+.I groff
+documentation as
+.RI \[lq]AT&T\~ troff \[rq].
+.
+.
+.br
+.ne 3v
+.P
+\[lq]A Typesetter-independent TROFF\[rq]
+by Brian W.\& Kernighan,
+1982,
+AT&T Bell Laboratories Computing Science Technical Report No.\& 97
+(CSTR\~#97),
+provides additional insights into the
+device and font description file formats
+and device-independent output format.
+.
+.
+.TP
+.MR groff @MAN1EXT@
+is the preferred interface to the
+.I groff
+system;
+it manages the pipeline that carries a source document through
+preprocessors,
+the
+.I @g@troff
+formatter,
+and an output driver to viewable or printable form.
+.
+It also exhaustively lists the man pages provided with the GNU
+.I roff
+system.
+.
+.
+.TP
+.MR groff_char @MAN7EXT@
+discusses character encoding issues,
+escape sequences that produce glyphs,
+and enumerates
+.IR groff 's
+predefined special character escape sequences.
+.
+.
+.TP
+.MR groff_diff @MAN7EXT@
+covers differences between the
+GNU
+.I troff \" GNU
+formatter,
+its device and font description file formats,
+its device-independent output format,
+and those of AT&T
+.IR troff ,\" AT&T
+whose design it reimplements.
+.
+.
+.TP
+.MR groff_font @MAN5EXT@
+describes the formats of the files that describe devices
+.RI ( DESC )
+and fonts.
+.
+.
+.TP
+.MR groff_tmac @MAN5EXT@
+surveys macro packages provided with
+.IR groff ,
+describes how documents can take advantage of them,
+offers guidance on writing macro packages and using diversions,
+and includes historical information on macro package naming conventions.
+.
+.
+.TP
+.MR roff @MAN7EXT@
+presents a detailed history of
+.I roff
+systems and summarizes concepts common to them.
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_7_man_C]
+.do rr *groff_groff_7_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/man/groff_char.7.man b/man/groff_char.7.man
new file mode 100644
index 0000000..b3ddb49
--- /dev/null
+++ b/man/groff_char.7.man
@@ -0,0 +1,2282 @@
+'\" t
+.TH groff_char @MAN7EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+groff_char \- GNU
+.I roff
+special character and glyph repertoire
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2023 Free Software Foundation, Inc.
+.\"
+.\" This file is part of groff (GNU roff), which is a free software
+.\" project.
+.\"
+.\" 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.
+.\"
+.\" You should have received a copy of the GNU General Public License
+.\" along with this program.
+.\"
+.\" If not, see <http://www.gnu.org/licenses/gpl-2.0.html>.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_char_7_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The GNU
+.I roff
+typesetting system has a large glyph repertoire suitable for production
+of varied literary,
+professional,
+technical,
+and mathematical documents.
+.
+.I groff
+works with
+.I characters;
+an output device renders
+.I glyphs.
+.
+.IR groff 's
+input character set is restricted to that defined by the standards
+ISO Latin-1
+(ISO 8859-1)
+and CCSID \[lq]code page\[rq] 1047
+(an EBCDIC arrangement of Latin-1).
+.
+For ease of document maintenance in UTF-8 environments,
+it is advisable to use only the Unicode basic Latin code points,
+a subset of all of the foregoing historically referred to as \%US-ASCII,
+.\" Yes, a subset, albeit a permutation as well in the cp1047 case.
+which has only 94 visible,
+printable code points.
+.\" In groff, 0x20 SP is mapped to a space node, not a glyph node, and
+.\" all kinds of special behavior attaches to such nodes, so we count
+.\" only to 94 and not 95 as is often done in other ASCII contexts.
+In
+.I groff,
+these are termed
+.I "ordinary characters."
+.
+Often,
+many more are desired in output.
+.
+.
+.P
+AT&T
+.I troff
+in the 1970s faced a similar problem:
+the available typesetter's glyph repertoire differed from that of the
+computers that controlled it.
+.
+.IR troff 's \" AT&T
+solution was a form of escape sequence known as a
+.I special character
+to access several dozen additional glyphs available in the fonts
+prepared for mounting in the phototypesetter.
+.
+These glyphs were mapped onto a two-character name space for a degree
+of mnemonic convenience;
+for example,
+the escape sequence
+.B \e(aa
+encoded an acute accent and
+.B \e(sc
+a section sign.
+.
+.
+.P
+.I groff
+has lifted historical
+.I roff
+limitations on special character name lengths,
+but recognizes and retains compatibility with the historical names.
+.
+.I groff
+expands the lexicon of glyphs available by name and permits users to
+define their own special character escape sequences with the
+.B char
+request.
+.
+Special character names are
+.I groff
+identifiers;
+see section \[lq]Identifiers\[rq] in
+.MR groff @MAN7EXT@ .
+.
+Our discussion uses the terms \[lq]glyph name\[rq] and \[lq]special
+character name\[rq] interchangeably;
+we assume no character translations or redefinitions.
+.
+.
+.P
+This document lists all of the glyph names predefined by
+.IR groff 's
+font description files and presents the systematic notation by which it
+enables access to arbitrary Unicode code points and construction of
+composite glyphs.
+.
+Glyphs listed may be unavailable,
+or may vary in appearance,
+depending on the output device and font chosen when the page was
+formatted.
+.
+This page was rendered for device
+.B \*[.T]
+using font
+.BR \n[.fn] .
+.
+.
+.P
+A few escape sequences that are not
+.I groff
+special characters also produce glyphs;
+these exist for syntactical or historical reasons.
+.
+.BR \e\[aq] ,
+.BR \e\[ga] ,
+.BR \e\- ,
+and
+.B \e_
+are translated on input to the special character escape sequences
+.BR \e[aa] ,
+.BR \e[ga] ,
+.BR \e[\-] ,
+and
+.BR \e[ul] ,
+respectively.
+.
+Others include
+.BR \e\e ,
+.B \e.\&
+(backslash-dot),
+and
+.BR \ee ;
+see
+.MR groff @MAN7EXT@ .
+.
+A small number of special characters represent glyphs that are not
+encoded in Unicode;
+examples include the baseline rule
+.B \e[ru]
+and the Bell System logo
+.B \e[bs].
+.
+.
+.P
+In
+.IR groff ,
+you can test output device support for any character
+(ordinary or special)
+with the conditional expression operator
+.RB \[lq] c \[rq].
+.
+.RS
+.\" https://www.bell-labs.com/usr/dmr/www/ ("In 1984, ...")
+.EX
+\&.ie c \e[bs] \e{Welcome to the \e[bs] Bell System;
+did you get the Wehrmacht helmet or the Death Star?\e}
+\&.el No Bell System logo.
+.EE
+.RE
+.
+.
+.P
+For brevity in the remainder of this document,
+we shall refer to systems conforming to the
+ISO 646:1991 IRV,
+ISO 8859,
+or
+ISO 10646 (\[lq]Unicode\[rq])
+character encoding standards as \[lq]ISO\[rq] systems,
+and those employing IBM code page 1047 as \[lq]EBCDIC\[rq] systems.
+.
+That said,
+EBCDIC systems that support
+.I groff
+are known to also support UTF-8.
+.
+.
+.P
+While
+.I groff
+accepts eight-bit encoded input,
+not all such code points are valid as input.
+.
+.\" src/libs/libgroff/invalid.cpp
+On ISO platforms,
+character codes
+0,
+11,
+13\[en]31,
+and
+128\[en]159
+are invalid.
+.
+(This is all C0 and C1 controls except for
+SOH through LF
+[Control+A to Control+J],
+and FF
+[Control+L].)
+.
+On EBCDIC platforms,
+0,
+8\[en]9,
+11,
+13\[en]20,
+23\[en]31,
+and
+48\[en]63
+are invalid.
+.
+Some of these code points are used by
+.I groff
+for internal purposes,
+which is one reason it does not support UTF-8 natively.
+.
+.
+.\" ====================================================================
+.SS "Fundamental character set"
+.\" ====================================================================
+.
+The ordinary characters catalogued above,
+plus the space,
+tab,
+newline,
+and leader (Control+A),
+form the fundamental character
+set for
+.I groff
+input;
+anything in the language,
+even over one million code points in Unicode,
+can be expressed using it.
+.
+On ISO systems,
+code points in the range 33\[en]126 comprise a common set of
+printable glyphs in all of the aforementioned ISO character encoding
+standards.
+.
+It is this character set and
+(with some noteworthy exceptions)
+the corresponding glyph repertoire for which AT&T
+.I troff
+was implemented.
+.
+On EBCDIC systems,
+printable characters are in the range 66\[en]201 and 203\[en]254;
+those without counterparts in the ISO range 33\[en]126 are discussed
+in the next subsection.
+.\" From this point, do not talk about numerical character assignments.
+.
+.
+.P
+All of the following characters map to glyphs as you would expect.
+.
+.TS
+center box;
+Lf(CR).
+! # $ % & ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @
+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 { | }
+.TE
+.\" The bottom border of that box is practically kissin' the tittles.
+.if t .sp 0.2v
+.
+The remaining ordinary characters surprise computing professionals and
+others intimately familiar with the ISO character encodings.
+.
+The developers of AT&T
+.I troff
+chose mappings for them that would be useful for typesetting technical
+literature in a broad range of scientific disciplines:
+Bell Labs used the system for preparation of AT&T's patent filings with
+the U.S.\& government.
+.
+Further,
+the prevailing character encoding standard in the 1970s,
+USAS X3.4-1968 (\[lq]ASCII\[rq]),
+deliberately supported semantic ambiguity at some code points,
+and outright substitution at several others,
+to suit the localization demands of various national standards bodies.
+.
+.
+.P
+The table below presents the seven exceptional code points
+with their typical keycap engravings,
+their glyph mappings and semantics in
+.I roff
+systems,
+and the escape sequences producing the Unicode basic Latin character
+they replace.
+.
+The first,
+the neutral double quote,
+is a partial exception because it does represent itself,
+but since the
+.I roff
+language also uses it to quote macro arguments,
+.I groff
+supports a special character escape sequence as an alternative form so
+that the glyph can be easily included in macro arguments without
+requiring the user to master the quoting rules that AT&T
+.I troff
+required in that context.
+.
+(Some requests,
+like
+.BR ds ,
+also treat
+.B \[dq]
+non-literally.)
+.
+Furthermore,
+not all of the special character escape sequences are portable to AT&T
+.I troff
+and all of its descendants;
+these
+.I groff
+extensions are presented using its special character form
+.BR \[rs][] ,
+whereas portable special character escape sequences are shown in the
+traditional
+.B \[rs](
+form.
+.
+.B \[rs]\-
+and
+.B \[rs]e
+are portable to all known
+.IR troff s.
+.
+.B \[rs]e
+means \[lq]the glyph of the current escape character\[rq];
+it therefore can produce unexpected output if the
+.B ec
+request is used.
+.
+On devices with a limited glyph repertoire,
+glyphs in the \[lq]keycap\[rq] and \[lq]appearance\[rq] columns on the
+same row of the table may look identical;
+except for the neutral double quote,
+this will
+.I not
+be the case on more-capable devices.
+.
+Review your document using as many different output devices as possible.
+.
+.
+.P
+.TS
+center box;
+L L L.
+Keycap Appearance and meaning Special character and meaning
+_
+" " neutral double quote \f[CR]\[rs][dq]\f[] neutral double quote
+\[aq] \[cq] closing single quote \f[CR]\[rs][aq]\f[] neutral apostrophe
+\- - hyphen \f[CR]\[rs]\-\f[] or \f[CR]\[rs][\-]\f[] minus sign/Unix dash
+\[rs] (escape character) \f[CR]\[rs]e\f[] or \f[CR]\[rs][rs]\f[] reverse solidus
+\[ha] \[u02C6] modifier circumflex \f[CR]\[rs](ha\f[] circumflex/caret/\[lq]hat\[rq]
+\[ga] \[oq] opening single quote \f[CR]\[rs](ga\f[] grave accent
+\[ti] \[u02DC] modifier tilde \f[CR]\[rs](ti\f[] tilde
+.TE
+.
+.
+.P
+The hyphen-minus is a particularly unfortunate case of overloading.
+.
+Its awkward name in ISO 8859 and later standards reflects the many
+distinguishable purposes to which it had already been put by the 1980s,
+including
+a hyphen,
+a minus sign,
+and
+(alone or in repetition)
+dashes of varying widths.
+.
+For best results in
+.I roff
+systems,
+use the
+.RB \[lq] \- \[rq]
+character in input outside an escape sequence
+.I only
+to mean a hyphen,
+as in the phrase \[lq]long-term\[rq].
+.
+For a minus sign in running text or a Unix command-line option dash,
+use
+.B \[rs]\-
+(or
+.B \[rs][\-]
+in
+.I groff
+if you find it helps the clarity of the source document).
+.
+(Another minus sign,
+for use in mathematical equations,
+is available as
+.BR \[rs][mi] ).
+.
+AT&T
+.I troff
+supported em-dashes as
+.BR \[rs](em ,
+as does
+.IR groff .
+.
+.
+.P
+The special character escape sequence for the apostrophe as a neutral
+single quote is typically needed only in technical content;
+typing words like \[lq]can't\[rq] and \[lq]Anne's\[rq] in a natural way
+will render correctly,
+because in ordinary prose an apostrophe is typeset either as a closing
+single quotation mark or as a neutral single quote,
+depending on the capabilities of the output device.
+.
+By contrast,
+special character escape sequences should be used for quotation marks
+unless portability to limited or historical
+.I troff
+implementations is necessary;
+on those systems,
+the input convention is to pair the grave accent with the apostrophe for
+single quotes,
+and to double both characters for double quotes.
+.
+AT&T
+.I troff
+defined no special characters for quotation marks or the apostrophe.
+.
+Repeated single quotes
+(\[oq]\[oq]thus\[cq]\[cq])
+will be visually distinguishable from double quotes
+(\[lq]thus\[rq])
+on terminal devices,
+and perhaps on others
+(depending on the font selected).
+.
+.TS
+tab(@) center box;
+L L.
+AT&T \f[I]troff\f[] input@recommended \f[I]groff\f[] input
+_
+.T&
+Lf(CR) Lf(CR).
+A Winter\[aq]s Tale@A Winter\[aq]s Tale
+\[ga]U.K.\& outer quotes\[aq]@\[rs][oq]U.K.\& outer quotes\[rs][cq]
+\[ga]U.K.\& \[ga]\[ga]inner\[aq]\[aq] quotes\[aq]\
+@\[rs][oq]U.K.\& \[rs][lq]inner\[rs][rq] quotes\[rs][cq]
+\[ga]\[ga]U.S.\& outer quotes\[aq]\[aq]\
+@\[rs][lq]U.S.\& outer quotes\[rs][rq]
+\[ga]\[ga]U.S.\& \[ga]inner\[aq] quotes\[aq]\[aq]\
+@\[rs][lq]U.S.\& \[rs][oq]inner\[rs][cq] quotes\[rs][rq]
+.TE
+.\" Keep bottom border of box from sitting on the ascenders below.
+.if t .sp 0.2v
+.
+If you frequently require quotation marks in your document,
+see if the macro package you're using supplies strings or macros to
+facilitate quotation,
+or define them yourself
+(except in man pages).
+.
+.
+.P
+Using Unicode basic Latin characters to compose boxes and lines is
+ill-advised.
+.
+.I roff
+systems have special characters for drawing horizontal and vertical
+lines;
+see subsection \[lq]Rules and lines\[rq] below.
+.
+Preprocessors like
+.MR @g@tbl @MAN1EXT@
+and
+.MR @g@pic @MAN1EXT@
+draw boxes and will produce the best possible output for the device,
+falling back to basic Latin glyphs only when necessary.
+.
+.
+.\" ====================================================================
+.SS "Eight-bit encodings and Latin-1 supplement"
+.\" ====================================================================
+.
+ISO 646 is a seven-bit code encoding 128 code points;
+eight-bit codes are twice the size.
+.
+ISO 8859-1 and code page 1047 allocated the additional space to what
+Unicode calls \[lq]C1 controls\[rq]
+(control characters)
+and the \[lq]Latin-1 supplement\[rq].
+.
+The C1 controls are neither printable nor usable as
+.I groff
+input.
+.
+.
+.P
+Two Latin-1 supplement characters are handled specially on input.
+.
+.I @g@troff
+never produces them as output.
+.
+.
+.TP
+NBSP
+encodes a no-break space;
+it is mapped to
+.BR \[rs]\[ti] ,
+the adjustable non-breaking space escape sequence.
+.
+.
+.TP
+SHY
+encodes a soft hyphen;
+it is mapped to
+.BR \[rs]% ,
+the hyphenation control escape sequence.
+.
+.
+.P
+The remaining characters in the Latin-1 supplement represent
+themselves.
+.
+Although they can be specified directly with the keyboard on systems
+configured to use Latin-1 as the character encoding,
+it is more portable,
+both to other
+.I roff
+systems and to UTF-8 environments,
+to use their special character escape sequences,
+shown below.
+.
+The glyph descriptions we use are non-standard in some cases,
+for brevity.
+.
+.
+.P
+.TS
+L2 Lf(CR)1 L L2 Lf(CR)1 L.
+\[r!] \e[r!] inverted exclamation mark \[~N] \e[\[ti]N] N tilde
+\[ct] \e[ct] cent sign \[`O] \e[\[ga]O] O grave
+\[Po] \e[Po] pound sign \['O] \e[\[aq]O] O acute
+\[Cs] \e[Cs] currency sign \[^O] \e[\[ha]O] O circumflex
+\[Ye] \e[Ye] yen sign \[~O] \e[\[ti]O] O tilde
+\[bb] \e[bb] broken bar \[:O] \e[:O] O dieresis
+\[sc] \e[sc] section sign \[mu] \e[mu] multiplication sign
+\[ad] \e[ad] dieresis accent \[/O] \e[/O] O slash
+\[co] \e[co] copyright sign \[`U] \e[\[ga]U] U grave
+\[Of] \e[Of] feminine ordinal indicator \['U] \e[\[aq]U] U acute
+\[Fo] \e[Fo] left double chevron \[^U] \e[\[ha]U] U circumflex
+\[no] \e[no] logical not \[:U] \e[:U] U dieresis
+\[rg] \e[rg] registered sign \['Y] \e[\[aq]Y] Y acute
+\[a-] \e[a\-] macron accent \[TP] \e[TP] uppercase thorn
+\[de] \e[de] degree sign \[ss] \e[ss] lowercase sharp s
+\[+-] \e[+\-] plus-minus \[`a] \e[\[ga]a] a grave
+\[S2] \e[S2] superscript two \['a] \e[\[aq]a] a acute
+\[S3] \e[S3] superscript three \[^a] \e[\[ha]a] a circumflex
+\[aa] \e[aa] acute accent \[~a] \e[\[ti]a] a tilde
+\[mc] \e[mc] micro sign \[:a] \e[:a] a dieresis
+\[ps] \e[ps] pilcrow sign \[oa] \e[oa] a ring
+\[pc] \e[pc] centered period \[ae] \e[ae] ae ligature
+\[ac] \e[ac] cedilla accent \[,c] \e[,c] c cedilla
+\[S1] \e[S1] superscript one \[`e] \e[\[ga]e] e grave
+\[Om] \e[Om] masculine ordinal indicator \['e] \e[\[aq]e] e acute
+\[Fc] \e[Fc] right double chevron \[^e] \e[\[ha]e] e circumflex
+\[14] \e[14] one quarter symbol \[:e] \e[:e] e dieresis
+\[12] \e[12] one half symbol \[`i] \e[\[ga]i] i grave
+\[34] \e[34] three quarters symbol \['i] \e[\[aq]i] e acute
+\[r?] \e[r?] inverted question mark \[^i] \e[\[ha]i] i circumflex
+\[`A] \e[\[ga]A] A grave \[:i] \e[:i] i dieresis
+\['A] \e[\[aq]A] A acute \[Sd] \e[Sd] lowercase eth
+\[^A] \e[\[ha]A] A circumflex \[~n] \e[\[ti]n] n tilde
+\[~A] \e[\[ti]A] A tilde \[`o] \e[\[ga]o] o grave
+\[:A] \e[:A] A dieresis \['o] \e[\[aq]o] o acute
+\[oA] \e[oA] A ring \[^o] \e[\[ha]o] o circumflex
+\[AE] \e[AE] AE ligature \[~o] \e[\[ti]o] o tilde
+\[,C] \e[,C] C cedilla \[:o] \e[:o] o dieresis
+\[`E] \e[\[ga]E] E grave \[di] \e[di] division sign
+\['E] \e[\[aq]E] E acute \[/o] \e[/o] o slash
+\[^E] \e[\[ha]E] E circumflex \[`u] \e[\[ga]u] u grave
+\[:E] \e[:E] E dieresis \['u] \e[\[aq]u] u acute
+\[`I] \e[\[ga]I] I grave \[^u] \e[\[ha]u] u circumflex
+\['I] \e[\[aq]I] I acute \[:u] \e[:u] u dieresis
+\[^I] \e[\[ha]I] I circumflex \['y] \e[\[aq]y] y acute
+\[:I] \e[:I] I dieresis \[Tp] \e[Tp] lowercase thorn
+\[-D] \e[\-D] uppercase eth \[:y] \e[:y] y dieresis
+.TE
+.
+.
+.\" ====================================================================
+.SS "Special character escape forms"
+.\" ====================================================================
+.
+Glyphs that lack a character code in the basic Latin repertoire to
+directly represent them are entered by one of several special character
+escape forms.
+.
+Such glyphs can be simple or composite,
+and accessed either by name or numerically by code point.
+.
+Code points and combining properties are determined by character
+encoding standards,
+whereas glyph names as used here originated in AT&T
+.I troff \" AT&T
+special character escape sequences.
+.
+Predefined glyph names use only characters in the basic Latin
+repertoire.
+.
+.
+.TP
+.BI \[rs]( gl
+is a special character escape sequence for the glyph with the
+two-character name
+.IR gl .
+.
+This is the original syntax form supported by AT&T
+.IR troff .
+.
+The acute accent,
+.BR \[rs](aa ,
+is an example.
+.
+.
+.TP
+.BI \[rs]C\[aq] glyph-name \[aq]
+is a special character escape sequence for
+.IR glyph-name ,
+which can be of arbitrary length.
+.
+The delimiter,
+shown here as a neutral apostrophe,
+can be any character not occurring in
+.IR glyph-name .
+.
+This syntax form was introduced in later versions of AT&T
+device-independent
+.IR troff . \" AT&T
+.
+The foregoing acute accent example can be expressed
+as
+.BR \[rs]C\[aq]aa\[aq] .
+.
+.
+.TP
+.BI \[rs][ glyph-name ]
+is a special character escape sequence for
+.IR glyph-name ,
+which can be of arbitrary length but must not contain a closing square
+bracket
+.RB \[lq] ] \[rq].
+.
+(No glyph names predefined by
+.I groff
+employ
+.RB \[lq] ] \[rq].)
+.
+The foregoing acute accent example can be expressed in
+.I groff
+as
+.BR \[rs][aa] .
+.
+.
+.P
+.BI \[rs]C\[aq] c \[aq]
+and
+.BI \[rs][ c ]
+are not synonyms for the ordinary character
+.RI \[lq] c \[rq],
+but request the special character named
+.RB \[lq] \[rs] \c
+.IR c \[rq].
+.
+For example,
+.RB \[lq] \[rs][a] \[rq]
+is not \[lq]a\[rq],
+but rather a special character with the internal glyph name
+(used in font description files and diagnostic messages)
+.BR \[rs]a ,
+which is typically undefined.
+.
+The only such glyph name
+.I groff
+predefines is the minus sign,
+which can therefore be accessed as
+.B \[rs]C\[aq]\-\[aq]
+or
+.BR \[rs][\-] .
+.
+.
+.TP
+.BI \[rs][ "base-char composite-1 composite-2"\~\c
+\&.\|.\|.\~\c
+.IB composite-n ]
+is a composite glyph.
+.
+Glyphs like a lowercase \[lq]e\[rq] with an acute accent,
+as in the word \[lq]caf\[e aa]\[rq],
+can be expressed as
+.BR "\[rs][e aa]" .
+.
+See subsection \[lq]Accents\[rq] below for a table of combining glyph
+names.
+.
+.
+.P
+Unicode encodes far more characters than
+.I groff
+has glyph names for;
+special character escape forms based on numerical code points enable
+access to any of them.
+.
+Frequently used glyphs or glyph combinations can be stored in strings,
+and new glyph names can be created
+.I "ad hoc"
+with the
+.B char
+request;
+see
+.MR groff @MAN7EXT@ .
+.
+.
+.TP
+.BI \[rs][u nnnn\c
+.RI [ n\c
+.RI [ n ]]\c
+.B ]
+is a Unicode numeric special character escape sequence.
+.
+Any Unicode code point can be accessed with four to six hexadecimal
+digits,
+with hexadecimal letters accepted in uppercase form only.
+.
+Thus,
+.B \[rs][u02DA]
+accesses the (spacing) ring accent,
+producing \[lq]\[u02DA]\[rq].
+.
+.
+.\" Use "GNU troff" in this paragraph because the contrast with AT&T
+.\" troff, which antedated Unicode, is important, and that contrast is
+.\" obscured with the default empty command prefix on "troff".
+.P
+Unicode code points can be composed as well;
+when they are,
+GNU
+.I troff \" GNU
+requires NFD
+(Normalization Form D),
+where all Unicode glyphs are maximally decomposed.
+.
+(Exception:
+precomposed characters in the Latin-1 supplement described above are
+also accepted.
+.
+Do not count on this exception remaining in a future
+GNU
+.I troff \" GNU
+that accepts UTF-8 input directly.)
+.
+.
+Thus,
+GNU
+.I troff \" GNU
+accepts
+.RB \[lq]caf \[rs][\[aq]e] \[rq],
+.RB \[lq]caf \[rs][e\~aa] \[rq],
+and
+.RB \[lq]caf \[rs][u0065_0301] \[rq],
+as ways to input \[lq]caf\['e]\[rq].
+.
+(Due to its legacy 8-bit encoding compatibility,
+at present it also accepts
+.RB \[lq]caf \[rs][u00E9] \[rq]
+on ISO Latin-1 systems.)
+.
+.
+.TP
+.BI \[rs][u base-char\c
+[\c
+.BI _ combining-component\c
+].\|.\|.]
+constructs a composite glyph from Unicode numeric special character
+escape sequences.
+.
+The code points of the base glyph and the combining components are each
+expressed in hexadecimal,
+with an underscore
+.RB ( _ )
+separating each component.
+.
+Thus,
+.B \[rs][u006E_0303]
+produces \[lq]\[u006E_0303]\[rq].
+.
+.
+.TP
+.BI \[rs][char nnn ]
+expresses an eight-bit code point where
+.I nnn
+is the code point of the character,
+a decimal number between 0 and\~255
+without leading zeroes.
+.
+This legacy numeric special character escape sequence is used to map
+characters onto glyphs via the
+.B trin
+request in macro files loaded by
+.MR grotty @MAN1EXT@ .
+.
+.
+.\" ====================================================================
+.SH "Glyph tables"
+.\" ====================================================================
+.
+In this section,
+.IR groff 's
+glyph name repertoire is presented in tabular form.
+.
+The meanings of the columns are as follows.
+.
+.
+.TP 8n
+.B Output
+shows the glyph as it appears on the device used to render this
+document;
+although it can have a notably different shape on other devices
+(and is subject to user-directed translation and replacement),
+.I groff
+attempts reasonable equivalency on all output devices.
+.
+.
+.TP
+.B Input
+shows the
+.I groff
+character
+(ordinary or special)
+that normally produces the glyph.
+.
+Some code points have multiple glyph names.
+.
+.
+.TP
+.B Unicode
+is the code point notation for the glyph or combining glyph sequence as
+described in subsection \[lq]Special character escape forms\[rq] above.
+.
+It corresponds to the standard notation for Unicode short identifiers
+such that
+.IR groff 's
+.BI u nnnn
+is equivalent to Unicode's
+.RI U+ nnnn .
+.\" And thereby hangs a tale...
+.\" https://unicode.org/mail-arch/unicode-ml/y2005-m11/0060.html
+.
+.
+.TP
+.B Notes
+describes the glyph,
+elucidating the mnemonic value of the glyph name where possible.
+.
+.
+.IP
+A plus sign \[lq]+\[rq] indicates that the glyph name appears in the
+AT&T
+.I troff
+user's manual,
+CSTR\~#54
+(1992 revision).
+.
+When using the AT&T special character syntax
+.BI \[rs]( xx\c
+, widespread portability can be expected from such names.
+.
+.
+.IP
+Entries marked with \[lq]***\[rq] denote glyphs used for mathematical
+purposes.
+.
+On typesetting devices,
+such glyphs are typically drawn from a
+.I special
+font
+(see
+.MR groff_font @MAN5EXT@ ).
+.
+Often,
+such glyphs lack bold or italic style forms or have metrics that look
+incongruous in ordinary prose.
+.
+A few which are not uncommon in running text have \[lq]text
+variants\[rq],
+which should work better in that context.
+.
+Conversely,
+a handful of glyphs that are normally drawn from a text font may be
+required in mathematical equations.
+.
+Both sets of exceptions are noted in the tables where they appear
+(\[lq]Logical symbols\[rq] and \[lq]Mathematical symbols\[rq]).
+.
+.
+.\" ====================================================================
+.SS "Basic Latin"
+.\" ====================================================================
+.
+Apart from basic Latin characters with special mappings,
+described in subsection \[lq]Fundamental character set\[rq] above,
+a few others in that range have special character glyph names.
+.
+.\" XXX: I surmise that...
+These were defined for ease of input on non-U.S.\& keyboards lacking
+keycaps for them,
+or for symmetry with other special character glyph names serving a
+similar purpose.
+.
+.
+.P
+The vertical bar is overloaded;
+the
+.B \[rs][ba]
+and
+.B \[rs][or]
+escape sequences may render differently.
+.
+See subsection \[lq]Mathematical symbols\[rq] below for special variants
+of the plus,
+minus,
+and equals
+signs normally drawn from this range.
+.
+.
+.P
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[dq] \e[dq] u0022 neutral double quote
+\[sh] \e[sh] u0023 number sign
+\[Do] \e[Do] u0024 dollar sign
+\[aq] \e[aq] u0027 apostrophe, neutral single quote
+\[sl] \e[sl] u002F slash, solidus +
+\[at] \e[at] u0040 at sign
+\[lB] \e[lB] u005B left square bracket
+\[rs] \e[rs] u005C reverse solidus
+\[rB] \e[rB] u005D right square bracket
+\[ha] \e[ha] u005E circumflex, caret, \[lq]hat\[rq]
+\[lC] \e[lC] u007B left brace
+| | u007C bar
+\[ba] \e[ba] u007C bar
+\[or] \e[or] u007C bitwise or +
+\[rC] \e[rC] u007D right brace
+\[ti] \e[ti] u007E tilde
+.TE
+.
+.
+.\" ====================================================================
+.SS "Supplementary Latin letters"
+.\" ====================================================================
+.
+Historically,
+.B \[rs][ss]
+could be considered a ligature of \[lq]sz\[rq].
+.
+An uppercase form is available as
+.BR \[rs][u1E9E] ,
+but in the German language it is of specialized use;
+\[ss] does
+.I not
+normally uppercase-transform to it,
+but rather to \[lq]SS\[rq].
+.
+\[lq]Lowercase f with hook\[rq] is also used as a function symbol;
+see subsection \[lq]Mathematical symbols\[rq] below.
+.
+.
+.P
+.if t .ne 2v
+.if n .ne 3v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[-D] \e[\-D] u00D0 uppercase eth
+\[Sd] \e[Sd] u00F0 lowercase eth
+\[TP] \e[TP] u00DE uppercase thorn
+\[Tp] \e[Tp] u00FE lowercase thorn
+\[ss] \e[ss] u00DF lowercase sharp s
+\[.i] \e[.i] u0131 i without tittle
+\[.j] \e[.j] u0237 j without tittle
+\[Fn] \e[Fn] u0192 lowercase f with hook, function
+\[/L] \e[/L] u0141 L with stroke
+\[/l] \e[/l] u0142 l with stroke
+\[/O] \e[/O] u00D8 O with stroke
+\[/o] \e[/o] u00F8 o with stroke
+.TE
+.
+.
+.br
+.if t .ne 4v
+.if n .ne 5v \" account for horizontal rule
+.\" ====================================================================
+.SS "Ligatures and digraphs"
+.\" ====================================================================
+.
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[ff] \e[ff] u0066_0066 ff ligature +
+\[fi] \e[fi] u0066_0069 fi ligature +
+\[fl] \e[fl] u0066_006C fl ligature +
+\[Fi] \e[Fi] u0066_0066_0069 ffi ligature +
+\[Fl] \e[Fl] u0066_0066_006C ffl ligature +
+\[AE] \e[AE] u00C6 AE ligature
+\[ae] \e[ae] u00E6 ae ligature
+\[OE] \e[OE] u0152 OE ligature
+\[oe] \e[oe] u0153 oe ligature
+\[IJ] \e[IJ] u0132 IJ digraph
+\[ij] \e[ij] u0133 ij digraph
+.TE
+.
+.
+.\" ====================================================================
+.SS Accents
+.\" ====================================================================
+.
+Normally,
+the formatting of a special character advances the drawing position as
+an ordinary character does.
+.
+.IR groff 's
+.B composite
+request designates a special character as combining.
+.
+The
+.I composite.tmac
+macro file,
+loaded automatically by the default
+.IR troffrc ,
+maps the following special characters to the combining characters shown
+below.
+.
+The non-combining code point in parentheses is used when the special
+character occurs in isolation
+(compare
+.RB \[lq] "caf\[rs][e aa]" \[rq]
+and
+.RB \[lq] "caf\[rs][aa]e" \[rq]).
+.
+.
+.P
+.if t .ne 3v
+.if n .ne 4v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[a"] \e[a"] u030B (u02DD) double acute accent
+\[a-] \e[a\-] u0304 (u00AF) macron accent
+\[a.] \e[a.] u0307 (u02D9) dot accent
+\[a^] \e[a\[ha]] u0302 (u005E) circumflex accent
+\[aa] \e[aa] u0301 (u00B4) acute accent +
+\[ga] \e[ga] u0300 (u0060) grave accent +
+\[ab] \e[ab] u0306 (u02D8) breve accent
+\[ac] \e[ac] u0327 (u00B8) cedilla accent
+\[ad] \e[ad] u0308 (u00A8) dieresis accent
+\[ah] \e[ah] u030C (u02C7) caron accent
+\[ao] \e[ao] u030A (u02DA) ring accent
+\[a~] \e[a\[ti]] u0303 (u007E) tilde accent
+\[ho] \e[ho] u0328 (u02DB) hook accent
+.TE
+.
+.
+.\" ====================================================================
+.SS "Accented characters"
+.\" ====================================================================
+.
+All of these glyphs can be composed using combining glyph names as
+described in subsection \[lq]Special character escape forms\[rq] above;
+the names below are short aliases for convenience.
+.
+.
+.P
+.if t .ne 2v
+.if n .ne 3v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\['A] \e[\[aq]A] u0041_0301 A acute
+\['C] \e[\[aq]C] u0043_0301 C acute
+\['E] \e[\[aq]E] u0045_0301 E acute
+\['I] \e[\[aq]I] u0049_0301 I acute
+\['O] \e[\[aq]O] u004F_0301 O acute
+\['U] \e[\[aq]U] u0055_0301 U acute
+\['Y] \e[\[aq]Y] u0059_0301 Y acute
+\['a] \e[\[aq]a] u0061_0301 a acute
+\['c] \e[\[aq]c] u0063_0301 c acute
+\['e] \e[\[aq]e] u0065_0301 e acute
+\['i] \e[\[aq]i] u0069_0301 i acute
+\['o] \e[\[aq]o] u006F_0301 o acute
+\['u] \e[\[aq]u] u0075_0301 u acute
+\['y] \e[\[aq]y] u0079_0301 y acute
+
+\[:A] \e[:A] u0041_0308 A dieresis
+\[:E] \e[:E] u0045_0308 E dieresis
+\[:I] \e[:I] u0049_0308 I dieresis
+\[:O] \e[:O] u004F_0308 O dieresis
+\[:U] \e[:U] u0055_0308 U dieresis
+\[:Y] \e[:Y] u0059_0308 Y dieresis
+\[:a] \e[:a] u0061_0308 a dieresis
+\[:e] \e[:e] u0065_0308 e dieresis
+\[:i] \e[:i] u0069_0308 i dieresis
+\[:o] \e[:o] u006F_0308 o dieresis
+\[:u] \e[:u] u0075_0308 u dieresis
+\[:y] \e[:y] u0079_0308 y dieresis
+
+\[^A] \e[\[ha]A] u0041_0302 A circumflex
+\[^E] \e[\[ha]E] u0045_0302 E circumflex
+\[^I] \e[\[ha]I] u0049_0302 I circumflex
+\[^O] \e[\[ha]O] u004F_0302 O circumflex
+\[^U] \e[\[ha]U] u0055_0302 U circumflex
+\[^a] \e[\[ha]a] u0061_0302 a circumflex
+\[^e] \e[\[ha]e] u0065_0302 e circumflex
+\[^i] \e[\[ha]i] u0069_0302 i circumflex
+\[^o] \e[\[ha]o] u006F_0302 o circumflex
+\[^u] \e[\[ha]u] u0075_0302 u circumflex
+
+\[`A] \e[\[ga]A] u0041_0300 A grave
+\[`E] \e[\[ga]E] u0045_0300 E grave
+\[`I] \e[\[ga]I] u0049_0300 I grave
+\[`O] \e[\[ga]O] u004F_0300 O grave
+\[`U] \e[\[ga]U] u0055_0300 U grave
+\[`a] \e[\[ga]a] u0061_0300 a grave
+\[`e] \e[\[ga]e] u0065_0300 e grave
+\[`i] \e[\[ga]i] u0069_0300 i grave
+\[`o] \e[\[ga]o] u006F_0300 o grave
+\[`u] \e[\[ga]u] u0075_0300 u grave
+
+\[~A] \e[\[ti]A] u0041_0303 A tilde
+\[~N] \e[\[ti]N] u004E_0303 N tilde
+\[~O] \e[\[ti]O] u004F_0303 O tilde
+\[~a] \e[\[ti]a] u0061_0303 a tilde
+\[~n] \e[\[ti]n] u006E_0303 n tilde
+\[~o] \e[\[ti]o] u006F_0303 o tilde
+
+\[vS] \e[vS] u0053_030C S caron
+\[vs] \e[vs] u0073_030C s caron
+\[vZ] \e[vZ] u005A_030C Z caron
+\[vz] \e[vz] u007A_030C z caron
+
+\[,C] \e[,C] u0043_0327 C cedilla
+\[,c] \e[,c] u0063_0327 c cedilla
+
+\[oA] \e[oA] u0041_030A A ring
+\[oa] \e[oa] u0061_030A a ring
+.TE
+.
+.
+.\" ====================================================================
+.SS "Quotation marks"
+.\" ====================================================================
+.
+The neutral double quote,
+often useful when documenting programming languages,
+is also available as a special character for convenient embedding in
+macro arguments;
+see subsection \[lq]Fundamental character set\[rq] above.
+.
+.
+.P
+.if t .ne 2v
+.if n .ne 3v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[Bq] \e[Bq] u201E low double comma quote
+\[bq] \e[bq] u201A low single comma quote
+\[lq] \e[lq] u201C left double quote
+\[rq] \e[rq] u201D right double quote
+\[oq] \e[oq] u2018 single opening (left) quote
+\[cq] \e[cq] u2019 single closing (right) quote
+\[aq] \e[aq] u0027 apostrophe, neutral single quote
+\[dq] " u0022 neutral double quote
+\[dq] \e[dq] u0022 neutral double quote
+\[Fo] \e[Fo] u00AB left double chevron
+\[Fc] \e[Fc] u00BB right double chevron
+\[fo] \e[fo] u2039 left single chevron
+\[fc] \e[fc] u203A right single chevron
+.TE
+.
+.
+.\" ====================================================================
+.SS Punctuation
+.\" ====================================================================
+.
+The Unicode name for U+00B7 is \[lq]middle dot\[rq],
+which is unfortunately confusable with the
+.I groff
+mnemonic for the visually similar but semantically distinct
+multiplication dot;
+see subsection \[lq]Mathematical symbols\[rq] below.
+.
+.
+.P
+.if t .ne 2v
+.if n .ne 3v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[r!] \e[r!] u00A1 inverted exclamation mark
+\[r?] \e[r?] u00BF inverted question mark
+\[pc] \e[pc] u00B7 centered period
+\[em] \e[em] u2014 em-dash +
+\[en] \e[en] u2013 en-dash
+\[hy] \e[hy] u2010 hyphen +
+.TE
+.
+.
+.\" ====================================================================
+.SS Brackets
+.\" ====================================================================
+.
+On typesetting devices,
+the bracket extensions are font-invariant glyphs;
+that is,
+they are rendered the same way regardless of font
+(with a drawing escape sequence).
+.
+On terminals,
+they are
+.I not
+font-invariant;
+.I groff
+maps them rather arbitrarily to U+23AA
+(\[lq]curly bracket extension\[rq]).
+.
+In AT&T
+.IR troff ,
+only one glyph was available to vertically extend
+brackets,
+braces,
+and
+parentheses:
+.BR \[rs](bv .
+.
+.
+.
+.P
+Not all devices supply bracket pieces that can be piled up with
+.B \[rs]b
+due to the restrictions of the escape's piling algorithm.
+.
+A general solution to build brackets out of pieces is the following
+macro:
+.
+.
+.RS
+.EX
+\&.\e" Make a pile centered vertically 0.5em above the baseline.
+\&.\e" The first argument is placed at the top.
+\&.\e" The pile is returned in string \[aq]pile\[aq].
+\&.eo
+\&.de pile\-make
+\&.\& nr pile\-wd 0
+\&.\& nr pile\-ht 0
+\&.\& ds pile\-args
+\&.\&
+\&.\& nr pile\-# \en[.$]
+\&.\& while \en[pile\-#] \e{\e
+\&.\& nr pile\-wd (\en[pile\-wd] >? \ew\[aq]\e$[\en[pile\-#]]\[aq])
+\&.\& nr pile\-ht +(\en[rst] \- \en[rsb])
+\&.\& as pile\-args \ev\[aq]\en[rsb]u\[aq]\e"
+\&.\& as pile\-args \eZ\[aq]\e$[\en[pile\-#]]\[aq]\e"
+\&.\& as pile\-args \ev\[aq]\-\en[rst]u\[aq]\e"
+\&.\& nr pile\-# \-1
+\&.\& \e}
+\&.\&
+\&.\& ds pile \ev\[aq](\-0.5m + (\en[pile\-ht]u / 2u))\[aq]\e"
+\&.\& as pile \e*[pile\-args]\e"
+\&.\& as pile \ev\[aq]((\en[pile\-ht]u / 2u) + 0.5m)\[aq]\e"
+\&.\& as pile \eh\[aq]\en[pile\-wd]u\[aq]\e"
+\&..
+\&.ec
+.EE
+.RE
+.
+.
+.P
+Another complication is the fact that some glyphs which represent
+bracket pieces in AT&T
+.I troff
+can be used for other mathematical symbols as well,
+for example
+.B \[rs](lf
+and
+.BR \[rs](rf ,
+which provide the floor operator.
+.
+Some output devices,
+such as
+.BR dvi ,
+don't unify such glyphs.
+.
+For this reason,
+the glyphs
+.BR \[rs][lf] ,
+.BR \[rs][rf] ,
+.BR \[rs][lc] ,
+and
+.B \[rs][rc]
+are not unified with similar-looking bracket pieces.
+.
+In
+.IR groff ,
+only glyphs with long names are guaranteed to pile up correctly for all
+devices\[em]provided those glyphs are available.
+.
+.
+.P
+.if t .ne 2v
+.if n .ne 3v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[lB] [ u005B left square bracket
+\[lB] \e[lB] u005B left square bracket
+\[rB] ] u005D right square bracket
+\[rB] \e[rB] u005D right square bracket
+\[lC] { u007B left brace
+\[lC] \e[lC] u007B left brace
+\[rC] } u007D right brace
+\[rC] \e[rC] u007D right brace
+\[la] \e[la] u27E8 left angle bracket
+\[ra] \e[ra] u27E9 right angle bracket
+\[bv] \e[bv] u23AA brace vertical extension + ***
+\[braceex] \e[braceex] u23AA brace vertical extension
+
+\[bracketlefttp] \e[bracketlefttp] u23A1 left square bracket top
+\[bracketleftex] \e[bracketleftex] u23A2 left square bracket extension
+\[bracketleftbt] \e[bracketleftbt] u23A3 left square bracket bottom
+
+\[bracketrighttp] \e[bracketrighttp] u23A4 right square bracket top
+\[bracketrightex] \e[bracketrightex] u23A5 right square bracket extension
+\[bracketrightbt] \e[bracketrightbt] u23A6 right square bracket bottom
+
+\[lt] \e[lt] u23A7 left brace top +
+\[lk] \e[lk] u23A8 left brace middle +
+\[lb] \e[lb] u23A9 left brace bottom +
+\[bracelefttp] \e[bracelefttp] u23A7 left brace top
+\[braceleftmid] \e[braceleftmid] u23A8 left brace middle
+\[braceleftbt] \e[braceleftbt] u23A9 left brace bottom
+\[braceleftex] \e[braceleftex] u23AA left brace extension
+
+\[rt] \e[rt] u23AB right brace top +
+\[rk] \e[rk] u23AC right brace middle +
+\[rb] \e[rb] u23AD right brace bottom +
+\[bracerighttp] \e[bracerighttp] u23AB right brace top
+\[bracerightmid] \e[bracerightmid] u23AC right brace middle
+\[bracerightbt] \e[bracerightbt] u23AD right brace bottom
+\[bracerightex] \e[bracerightex] u23AA right brace extension
+
+\[parenlefttp] \e[parenlefttp] u239B left parenthesis top
+\[parenleftex] \e[parenleftex] u239C left parenthesis extension
+\[parenleftbt] \e[parenleftbt] u239D left parenthesis bottom
+\[parenrighttp] \e[parenrighttp] u239E right parenthesis top
+\[parenrightex] \e[parenrightex] u239F right parenthesis extension
+\[parenrightbt] \e[parenrightbt] u23A0 right parenthesis bottom
+.TE
+.
+.
+.br
+.if t .ne 4v
+.if n .ne 5v \" account for horizontal rule
+.\" ====================================================================
+.SS Arrows
+.\" ====================================================================
+.
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[<-] \e[<\-] u2190 horizontal arrow left +
+\[->] \e[\->] u2192 horizontal arrow right +
+\[<>] \e[<>] u2194 bidirectional horizontal arrow
+\[da] \e[da] u2193 vertical arrow down +
+\[ua] \e[ua] u2191 vertical arrow up +
+\[va] \e[va] u2195 bidirectional vertical arrow
+\[lA] \e[lA] u21D0 horizontal double arrow left
+\[rA] \e[rA] u21D2 horizontal double arrow right
+\[hA] \e[hA] u21D4 bidirectional horizontal double arrow
+\[dA] \e[dA] u21D3 vertical double arrow down
+\[uA] \e[uA] u21D1 vertical double arrow up
+\[vA] \e[vA] u21D5 bidirectional vertical double arrow
+\[an] \e[an] u23AF horizontal arrow extension
+.TE
+.
+.
+.\" ====================================================================
+.SS "Rules and lines"
+.\" ====================================================================
+.
+On typesetting devices,
+the font-invariant glyphs
+(see subsection \[lq]Brackets\[rq] above)
+.BR \[rs][br] ,
+.BR \[rs][ul] ,
+and
+.B \[rs][rn]
+form corners when adjacent;
+they can be used to build boxes.
+.
+On terminal devices,
+they are mapped as shown in the table.
+.
+The Unicode-derived names of these three glyphs are approximations.
+.
+.
+.P
+The input character
+.B _
+always accesses the underscore glyph in a font;
+.\" unless one isn't available, but this seems to be only a theoretical
+.\" concern--what font doesn't support every ASCII codepoint these days?
+.BR \[rs][ul] ,
+by contrast,
+may be font-invariant on typesetting devices.
+.
+.
+.P
+The baseline rule
+.B \[rs][ru]
+is a font-invariant glyph,
+namely a rule of one-half em.
+.
+.
+.P
+In AT&T
+.IR troff , \" AT&T
+.B \[rs][rn]
+also served as a one\~en extension of the square root symbol.
+.
+.I groff
+favors
+.B \[rs][radicalex]
+for this purpose;
+see subsection \[lq]Mathematical symbols\[rq] below.
+.
+.
+.P
+.if t .ne 2v
+.if n .ne 3v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+| | u007C bar
+\[ba] \e[ba] u007C bar
+\[br] \e[br] u2502 box rule +
+\&_ \&_ u005F underscore, low line +
+\[ul] \e[ul] --- underrule +
+\[rn] \e[rn] u203E overline +
+\[ru] \e[ru] --- baseline rule +
+\[bb] \e[bb] u00A6 broken bar
+\[sl] / u002F slash, solidus +
+\[sl] \e[sl] u002F slash, solidus +
+\[rs] \e[rs] u005C reverse solidus
+.TE
+.
+.
+.br
+.if t .ne 4v
+.if n .ne 5v \" account for horizontal rule
+.\" ====================================================================
+.SS "Text markers"
+.\" ====================================================================
+.
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[ci] \e[ci] u25CB circle +
+\[bu] \e[bu] u2022 bullet +
+\[dg] \e[dg] u2020 dagger +
+\[dd] \e[dd] u2021 double dagger +
+\[lz] \e[lz] u25CA lozenge, diamond
+\[sq] \e[sq] u25A1 square +
+\[ps] \e[ps] u00B6 pilcrow sign
+\[sc] \e[sc] u00A7 section sign +
+\[lh] \e[lh] u261C hand pointing left +
+\[rh] \e[rh] u261E hand pointing right +
+\[at] @ u0040 at sign
+\[at] \e[at] u0040 at sign
+\[sh] # u0023 number sign
+\[sh] \e[sh] u0023 number sign
+\[CR] \e[CR] u21B5 carriage return
+\[OK] \e[OK] u2713 check mark
+.TE
+.
+.\" ====================================================================
+.SS "Legal symbols"
+.\" ====================================================================
+.
+The Bell System logo is not supported in
+.IR groff .
+.
+.
+.P
+.if t .ne 2v
+.if n .ne 3v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[co] \e[co] u00A9 copyright sign +
+\[rg] \e[rg] u00AE registered sign +
+\[tm] \e[tm] u2122 trade mark sign
+\[bs] \e[bs] --- Bell System logo +
+.TE
+.
+.
+.br
+.if t .ne 4v
+.if n .ne 5v \" account for horizontal rule
+.\" ====================================================================
+.SS "Currency symbols"
+.\" ====================================================================
+.
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[Do] $ u0024 dollar sign
+\[Do] \e[Do] u0024 dollar sign
+\[ct] \e[ct] u00A2 cent sign +
+\[eu] \e[eu] u20AC Euro sign
+\[Eu] \e[Eu] u20AC variant Euro sign
+\[Ye] \e[Ye] u00A5 yen sign
+\[Po] \e[Po] u00A3 pound sign
+\[Cs] \e[Cs] u00A4 currency sign
+.TE
+.
+.
+.br
+.if t .ne 4v
+.if n .ne 5v \" account for horizontal rule
+.\" ====================================================================
+.SS Units
+.\" ====================================================================
+.
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[de] \e[de] u00B0 degree sign +
+\[%0] \e[%0] u2030 per thousand, per mille sign
+\[fm] \e[fm] u2032 arc minute sign, foot mark +
+\[sd] \e[sd] u2033 arc second sign
+\[mc] \e[mc] u00B5 micro sign
+\[Of] \e[Of] u00AA feminine ordinal indicator
+\[Om] \e[Om] u00BA masculine ordinal indicator
+.TE
+.
+.
+.\" ====================================================================
+.SS "Logical symbols"
+.\" ====================================================================
+.
+The variants of the not sign may differ in appearance or spacing
+depending on the device and font selected.
+.
+Unicode does not encode a discrete \[lq]bitwise or\[rq] sign:
+on typesetting devices,
+it is drawn shorter than the bar,
+about the same height as a capital letter.
+.
+Terminal devices unify
+.B \[rs][ba]
+and
+.BR \[rs][or] .
+.
+.
+.P
+.if t .ne 2v
+.if n .ne 3v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[AN] \e[AN] u2227 logical and
+\[OR] \e[OR] u2228 logical or
+\[no] \e[no] u00AC logical not + ***
+\[tno] \e[tno] u00AC text variant of \f[B]\e[no]\f[]
+\[te] \e[te] u2203 there exists
+\[fa] \e[fa] u2200 for all
+\[st] \e[st] u220B such that
+\[3d] \e[3d] u2234 therefore
+\[tf] \e[tf] u2234 therefore
+| | u007C bar
+\[or] \e[or] u007C bitwise or +
+.TE
+.
+.
+.\" ====================================================================
+.SS "Mathematical symbols"
+.\" ====================================================================
+.
+.B \[rs][Fn]
+also appears in subsection \[lq]Supplementary Latin letters\[rq] above.
+.
+Observe the two varieties of the
+plus-minus,
+multiplication,
+and division signs;
+.BR \[rs][+\-] ,
+.BR \[rs][mu] ,
+and
+.B \[rs][di]
+are normally drawn from the special font,
+but have text font variants.
+.
+Also be aware of three glyphs available in special font variants that
+are normally drawn from text fonts:
+the plus,
+minus,
+and equals signs.
+.
+These variants may differ in appearance or spacing depending on the
+device and font selected.
+.
+.
+.P
+In AT&T
+.IR troff ,
+.B \[rs](rn
+(\[lq]root en extender\[rq])
+served as the horizontal extension of the radical
+(square root)
+sign,
+.BR \[rs](sr ,
+and was drawn at the maximum height of the typeface's bounding box;
+this enabled the special character to double as an overline
+(see subsection \[lq]Rules and lines\[rq] above).
+.
+A contemporary font's radical sign might not ascend to such an extreme.
+.
+In
+.IR groff ,
+you can instead use
+.B \[rs][radicalex]
+to continue the radical sign
+.BR \[rs][sr] ;
+these special characters are intended for use with text fonts.
+.
+.B \[rs][sqrt]
+and
+.B \[rs][sqrtex]
+are their counterparts with mathematical spacing.
+.
+.
+.P
+.if t .ne 2v
+.if n .ne 3v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[12] \e[12] u00BD one half symbol +
+\[14] \e[14] u00BC one quarter symbol +
+\[34] \e[34] u00BE three quarters symbol +
+\[18] \e[18] u215B one eighth symbol
+\[38] \e[38] u215C three eighths symbol
+\[58] \e[58] u215D five eighths symbol
+\[78] \e[78] u215E seven eighths symbol
+\[S1] \e[S1] u00B9 superscript one
+\[S2] \e[S2] u00B2 superscript two
+\[S3] \e[S3] u00B3 superscript three
+
++ + u002B plus
+\[pl] \e[pl] u002B special variant of plus + ***
+\- \e[\-] u002D minus
+\[mi] \e[mi] u2212 special variant of minus + ***
+\[-+] \e[\-+] u2213 minus-plus
+\[+-] \e[+\-] u00B1 plus-minus + ***
+\[t+-] \e[t+\-] u00B1 text variant of \f[B]\e[+\-]\f[]
+\[md] \e[md] u22C5 multiplication dot
+\[mu] \e[mu] u00D7 multiplication sign + ***
+\[tmu] \e[tmu] u00D7 text variant of \f[B]\e[mu]\f[]
+\[c*] \e[c*] u2297 circled times
+\[c+] \e[c+] u2295 circled plus
+\[di] \e[di] u00F7 division sign + ***
+\[tdi] \e[tdi] u00F7 text variant of \f[B]\e[di]\f[]
+\[f/] \e[f/] u2044 fraction slash
+* * u002A asterisk
+\[**] \e[**] u2217 mathematical asterisk +
+
+\[<=] \e[<=] u2264 less than or equal to +
+\[>=] \e[>=] u2265 greater than or equal to +
+\[<<] \e[<<] u226A much less than
+\[>>] \e[>>] u226B much greater than
+\&= \&= u003D equals
+\[eq] \e[eq] u003D special variant of equals + ***
+\[!=] \e[!=] u003D_0338 not equals +
+\[==] \e[==] u2261 equivalent +
+\[ne] \e[ne] u2261_0338 not equivalent
+\[=~] \e[=\[ti]] u2245 approximately equal to
+\[|=] \e[|=] u2243 asymptotically equal to +
+\[ti] \e[ti] u007E tilde +
+\[ap] \e[ap] u223C similar to, tilde operator +
+\[~~] \e[\[ti]\[ti]] u2248 almost equal to
+\[~=] \e[\[ti]=] u2248 almost equal to
+\[pt] \e[pt] u221D proportional to +
+
+\[es] \e[es] u2205 empty set +
+\[mo] \e[mo] u2208 element of a set +
+\[nm] \e[nm] u2208_0338 not element of set
+\[sb] \e[sb] u2282 proper subset +
+\[nb] \e[nb] u2282_0338 not subset
+\[sp] \e[sp] u2283 proper superset +
+\[nc] \e[nc] u2283_0338 not superset
+\[ib] \e[ib] u2286 subset or equal +
+\[ip] \e[ip] u2287 superset or equal +
+\[ca] \e[ca] u2229 intersection, cap +
+\[cu] \e[cu] u222A union, cup +
+
+\[/_] \e[/_] u2220 angle
+\[pp] \e[pp] u22A5 perpendicular
+\[is] \e[is] u222B integral +
+\[integral] \e[integral] u222B integral ***
+\[sum] \e[sum] u2211 summation ***
+\[product] \e[product] u220F product ***
+\[coproduct] \e[coproduct] u2210 coproduct ***
+\[gr] \e[gr] u2207 gradient +
+\[sr] \e[sr] u221A radical sign, square root +
+\[rn] \e[rn] u203E overline +
+\[radicalex] \e[radicalex] --- radical extension
+\[sqrt] \e[sqrt] u221A radical sign, square root ***
+\[sqrtex] \e[sqrtex] --- radical extension ***
+
+\[lc] \e[lc] u2308 left ceiling +
+\[rc] \e[rc] u2309 right ceiling +
+\[lf] \e[lf] u230A left floor +
+\[rf] \e[rf] u230B right floor +
+
+\[if] \e[if] u221E infinity +
+\[Ah] \e[Ah] u2135 aleph symbol
+\[Fn] \e[Fn] u0192 lowercase f with hook, function
+\[Im] \e[Im] u2111 blackletter I, imaginary part
+\[Re] \e[Re] u211C blackletter R, real part
+\[wp] \e[wp] u2118 Weierstrass p
+\[pd] \e[pd] u2202 partial differential
+\[-h] \e[\-h] u210F h bar
+\[hbar] \e[hbar] u210F h bar
+.TE
+.
+.
+.\" ====================================================================
+.SS "Greek glyphs"
+.\" ====================================================================
+.
+These glyphs are intended for technical use,
+not for typesetting Greek language text;
+normally,
+the uppercase letters have upright shape,
+and the lowercase ones are slanted.
+.
+.
+.P
+.if t .ne 2v
+.if n .ne 3v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[*A] \e[*A] u0391 uppercase alpha +
+\[*B] \e[*B] u0392 uppercase beta +
+\[*G] \e[*G] u0393 uppercase gamma +
+\[*D] \e[*D] u0394 uppercase delta +
+\[*E] \e[*E] u0395 uppercase epsilon +
+\[*Z] \e[*Z] u0396 uppercase zeta +
+\[*Y] \e[*Y] u0397 uppercase eta +
+\[*H] \e[*H] u0398 uppercase theta +
+\[*I] \e[*I] u0399 uppercase iota +
+\[*K] \e[*K] u039A uppercase kappa +
+\[*L] \e[*L] u039B uppercase lambda +
+\[*M] \e[*M] u039C uppercase mu +
+\[*N] \e[*N] u039D uppercase nu +
+\[*C] \e[*C] u039E uppercase xi +
+\[*O] \e[*O] u039F uppercase omicron +
+\[*P] \e[*P] u03A0 uppercase pi +
+\[*R] \e[*R] u03A1 uppercase rho +
+\[*S] \e[*S] u03A3 uppercase sigma +
+\[*T] \e[*T] u03A4 uppercase tau +
+\[*U] \e[*U] u03A5 uppercase upsilon +
+\[*F] \e[*F] u03A6 uppercase phi +
+\[*X] \e[*X] u03A7 uppercase chi +
+\[*Q] \e[*Q] u03A8 uppercase psi +
+\[*W] \e[*W] u03A9 uppercase omega +
+
+\[*a] \e[*a] u03B1 lowercase alpha +
+\[*b] \e[*b] u03B2 lowercase beta +
+\[*g] \e[*g] u03B3 lowercase gamma +
+\[*d] \e[*d] u03B4 lowercase delta +
+\[*e] \e[*e] u03B5 lowercase epsilon +
+\[*z] \e[*z] u03B6 lowercase zeta +
+\[*y] \e[*y] u03B7 lowercase eta +
+\[*h] \e[*h] u03B8 lowercase theta +
+\[*i] \e[*i] u03B9 lowercase iota +
+\[*k] \e[*k] u03BA lowercase kappa +
+\[*l] \e[*l] u03BB lowercase lambda +
+\[*m] \e[*m] u03BC lowercase mu +
+\[*n] \e[*n] u03BD lowercase nu +
+\[*c] \e[*c] u03BE lowercase xi +
+\[*o] \e[*o] u03BF lowercase omicron +
+\[*p] \e[*p] u03C0 lowercase pi +
+\[*r] \e[*r] u03C1 lowercase rho +
+\[*s] \e[*s] u03C3 lowercase sigma +
+\[*t] \e[*t] u03C4 lowercase tau +
+\[*u] \e[*u] u03C5 lowercase upsilon +
+\[*f] \e[*f] u03D5 lowercase phi +
+\[*x] \e[*x] u03C7 lowercase chi +
+\[*q] \e[*q] u03C8 lowercase psi +
+\[*w] \e[*w] u03C9 lowercase omega +
+
+\[+e] \e[+e] u03F5 variant epsilon (lunate)
+\[+h] \e[+h] u03D1 variant theta (cursive form)
+\[+p] \e[+p] u03D6 variant pi (similar to omega)
+\[+f] \e[+f] u03C6 variant phi (curly shape)
+\[ts] \e[ts] u03C2 terminal lowercase sigma +
+.TE
+.
+.
+.br
+.if t .ne 4v
+.if n .ne 5v \" account for horizontal rule
+.\" ====================================================================
+.SS "Playing card symbols"
+.\" ====================================================================
+.
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[CL] \e[CL] u2663 solid club suit
+\[SP] \e[SP] u2660 solid spade suit
+\[HE] \e[HE] u2665 solid heart suit
+\[DI] \e[DI] u2666 solid diamond suit
+.TE
+.
+.
+.\" ====================================================================
+.SH History
+.\" ====================================================================
+.
+A consideration of the typefaces originally available to AT&T
+.I nroff \" AT&T
+and
+.I troff \" AT&T
+illuminates many conventions that one might regard as idiosyncratic
+fifty years afterward.
+.
+(See section \[lq]History\[rq] of
+.MR roff @MAN7EXT@
+for more context.)
+.
+The face used by the Teletype Model\~37 terminals of the Murray Hill
+Unix Room was based on ASCII,
+but assigned multiple meanings to several code points,
+as suggested by that standard.
+.
+Decimal 34
+.RB ( \[dq] )
+served as a dieresis accent and neutral double quotation mark;
+decimal 39
+.RB ( \[aq] )
+as an acute accent,
+apostrophe,
+and closing (right) single quotation mark;
+decimal 45
+.RB ( \[-] )
+as a hyphen and a minus sign;
+decimal 94
+.RB ( \[ha] )
+as a circumflex accent and caret;
+decimal 96
+.RB ( \[ga] )
+as a grave accent and opening (left) single quotation mark;
+and decimal 126
+.RB ( \[ti] )
+as a tilde accent and
+(with a half-line motion)
+swung dash.
+.
+The Model\~37 bore an optional extended character set offering upright
+Greek letters and several mathematical symbols;
+these were documented as early as the
+.IR kbd (VII)
+man page of the
+(First Edition)
+.I Unix Programmer's Manual.
+.
+.
+.br
+.ne 2v
+.P
+At the time Graphic Systems delivered the C/A/T phototypesetter to AT&T,
+the ASCII character set was not considered a standard basis for a glyph
+repertoire by traditional typographers.
+.
+In the stock Times roman,
+italic,
+and bold styles available,
+several ASCII characters were not present at all,
+nor was most of the Teletype's extended character set.
+.
+AT&T commissioned a \[lq]special\[rq] font to ensure no loss of
+repertoire.
+.
+.
+.br
+.ne 2v
+.P
+A representation of the coverage of the C/A/T's text fonts follows.
+.
+The glyph resembling an underscore is a baseline rule,
+and that resembling a vertical line is a box rule.
+.
+In italics,
+the box rule was not slanted.
+.
+We also observe that the hyphen and minus sign were already
+\[lq]de-unified\[rq] by the fonts provided;
+a decision whither to map an input \[lq]\-\[rq] therefore had to be
+taken.
+.
+.
+.br
+.if t .ne 5v
+.if t .ne 7v \" account for box border
+.P
+.TS
+center box;
+Lf(R).
+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
+0 1 2 3 4 5 6 7 8 9 \[fi] \[fl] \[Fi] \[Fl]
+! $ % & ( ) \[oq] \[cq] * + \- . , / : ; = ? [ ] \[br]
+\[bu] \[sq] \[em] \[hy] \[ru] \[14] \[12] \[34] \
+\[de] \[dg] \[fm] \[ct] \[rg] \[co]
+.TE
+.
+.
+.P
+The special font supplied the missing ASCII and Teletype extended
+glyphs,
+among several others.
+.
+The plus,
+minus,
+and equals signs appeared in the special font despite availability in
+text fonts \[lq]to insulate the appearance of equations from the choice
+of standard [read: text] fonts\[rq]\[em]a priority since
+.I troff \" AT&T
+was turned to the task of mathematical typesetting as soon as it was
+developed.
+.
+.
+.P
+We note that AT&T took the opportunity to de-unify the apostrophe/right
+single quotation mark from the acute accent
+(a choice ISO later duplicated in its 8859 series of standards).
+.
+A slash intended to be mirror-symmetric with the backslash was also
+included,
+as was the Bell System logo;
+we do not attempt to depict the latter.
+.
+.
+.br
+.if t .ne 5v
+.if t .ne 7v \" account for box border
+.P
+.TS
+center box;
+Lf(I),Lf(R).
+\[*a] \[*b] \[*g] \[*d] \[*e] \[*z] \[*y] \[*h] \[*i] \[*k] \[*l] \
+\[*m] \[*n] \[*c] \[*o] \[*p] \[*r] \[*s] \[ts] \[*t] \[*u] \[*f] \
+\[*x] \[*q] \[*w]
+\[*G] \[*D] \[*H] \[*L] \[*C] \[*P] \[*S] \[*U] \[*F] \[*Q] \[*W]
+\[dq] \[aa] \[rs] \[ha] \[ul] \[ga] \[ti] \[sl] < > { } # @ \
+\[pl] \[mi] \[eq] \[**]
+.\" We use \[radicalex] instead of \[rn] for more reliable simulation of
+.\" the typeface shown in Table I of CSTR #54 (1976); see subsection
+.\" "Mathematical symbols" above.
+\[>=] \[<=] \[==] \[~=] \[ap] \[!=] \
+\[ua] \[da] \[<-] \[->] \[mu] \[di] \[+-] \
+\[if] \[pd] \[gr] \[no] \[is] \[pt] \[sr] \[radicalex] \
+\[cu] \[ca] \[sb] \[sp] \[ib] \[ip] \[es] \[mo]
+\[sc] \[dd] \[lh] \[rh] \[or] \[ci] \
+\[lt] \[lb] \[rt] \[rb] \[lk] \[rk] \[bv] \[lf] \[rf] \[lc] \[rc]
+.TE
+.
+.
+.P
+One ASCII character as rendered by the Model 37 was apparently
+abandoned.
+.
+That device printed decimal 124 (\[or]) as a broken vertical line,
+like Unicode U+00A6 (\[bb]).
+.
+No equivalent was available on the C/A/T;
+the box rule
+.BR \[rs][br] ,
+brace vertical extension
+.\" CSTR #54 (1976 edition) called this the "bold vertical", probably
+.\" because it was thicker than the box rule and matched the thickness
+.\" of the bracket pieces \(lt, \(lb, \(rt, \(rb, \(lk, \(rk, and so on.
+.\" Saying "bold" could be misleading because it appeared only in the
+.\" special font, not a bold text font.
+.BR \[rs][bv] ,
+and \[lq]or\[rq] operator
+.B \[rs][or]
+were used as contextually appropriate.
+.
+.
+.P
+.\" In the Holt, Reinhart, Winston edition of the _Unix Programmer's
+.\" Manual_, Revised and Expanded Version, Volume 2 (1983), the square
+.\" \(sq in Times bold is _not_ shown as filled on page 226.
+.\"
+.\" ...but in the AT&T USG Unix 4.0 manual (ca. 1981), typeset on the
+.\" Autologic APS-5, the Times bold \(sq _is_ filled.
+.\"
+.\" https://www.tuhs.org/Archive/Documentation/Manuals/Unix_4.0/
+.\" Volume_1/00_Annotated_Table_of_Contents.pdf
+.\" Volume_1/C.1.2_NROFF_TROFF_Users_Manual.pdf
+.\" -- GBR
+Devices supported by AT&T device-independent
+.I troff
+exhibited some differences in glyph detail.
+.
+For example,
+on the Autologic APS-5 phototypesetter,
+the square
+.B \[rs](sq
+became filled in the Times bold face.
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+The files below are loaded automatically by the default
+.IR troffrc .
+.
+.
+.TP
+.I @MACRODIR@/\:\%composite\:.tmac
+assigns alternate mappings for identifiers after the first in a
+composite special character escape sequence.
+.
+See subsection \[lq]Accents\[rq] above.
+.
+.
+.TP
+.I @MACRODIR@/\:\%fallbacks\:.tmac
+defines fallback mappings for Unicode code points such as the increment
+sign (U+2206) and upper- and lowercase Roman numerals.
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+This document was written by
+.MT jjc@\:jclark\:.com
+James Clark
+.ME ,
+with additions by
+.MT wl@\:gnu\:.org
+Werner Lemberg
+.ME
+and
+.MT groff\-bernd\:.warken\-72@\:web\:.de
+Bernd Warken
+.ME ,
+revised to use
+.MR @g@tbl @MAN1EXT@
+by
+.MT esr@\:thyrsus\:.com
+Eric S.\& Raymond
+.ME ,
+and largely rewritten by
+.MT g.branden\:.robinson@\:gmail\:.com
+G.\& Branden Robinson
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is the primary
+.I groff
+manual.
+.
+Section \[lq]Using Symbols\[rq] may be of particular note.
+.
+You can browse it interactively with \[lq]info \[aq](groff) Using
+Symbols\[aq]\[rq].
+.
+.
+.P
+\[lq]An extension to the
+.I troff
+character set for Europe\[rq],
+E.G.\& Keizer,
+K.J.\& Simonsen,
+J.\& Akkerhuis;
+EUUG Newsletter,
+Volume 9,
+No.\& 2,
+Summer 1989
+.
+.
+.P
+.UR http://\:www\:.unicode\:.org
+The Unicode Standard
+.UE
+.
+.
+.br
+.ne 2v
+.P
+.UR https://\:www\:.aivosto\:.com/\:articles/\:charsets\-7bit\:.html
+\[lq]7-bit Character Sets\[rq]
+.UE
+by Tuomas Salste documents the inherent ambiguity and configurable code
+points of the ASCII encoding standard.
+.
+.
+.P
+\[lq]Nroff/Troff User's Manual\[rq]
+by Joseph F.\& Ossanna,
+1976,
+AT&T Bell Laboratories Computing Science Technical Report No.\& 54,
+features two tables that throw light on the glyph repertoire available
+to \[lq]typesetter
+.IR roff \[rq]
+when it was first written.
+.
+Be careful of re-typeset versions of this document that can be found on
+the Internet.
+.
+Some do not accurately represent the original document:
+several glyphs are obviously missing.
+.
+More subtly,
+lowercase Greek letters are rendered upright,
+not slanted as they appeared in the C/A/T's special font and as expected
+by
+.I troff \" AT&T
+users.
+.
+.
+.P
+.MR groff_rfc1345 @MAN7EXT@
+describes an alternative set of special character glyph names,
+which extends and in some cases overrides the definitions listed above.
+.
+.
+.P
+.MR groff @MAN1EXT@ ,
+.MR troff @MAN1EXT@ ,
+.MR groff @MAN7EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_char_7_man_C]
+.do rr *groff_groff_char_7_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" tab-width: 20
+.\" End:
+.\" vim: set filetype=groff tabstop=20 textwidth=72:
diff --git a/man/groff_diff.7.man b/man/groff_diff.7.man
new file mode 100644
index 0000000..0d25cb6
--- /dev/null
+++ b/man/groff_diff.7.man
@@ -0,0 +1,6188 @@
+'\" e
+.TH groff_diff @MAN7EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+groff_diff \- differences between GNU
+.I roff
+and AT&T
+.I troff
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2023 Free Software Foundation, Inc.
+.\"
+.\" This file is part of groff, the GNU roff type-setting system.
+.\"
+.\" Permission is granted to copy, distribute and/or modify this
+.\" document under the terms of the GNU Free Documentation License,
+.\" Version 1.3 or any later version published by the Free Software
+.\" Foundation; with no Invariant Sections, 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_diff_7_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.\" Local definitions
+.\" ====================================================================
+.
+.\" define a string tx for the TeX logo
+.ie t .ds tx T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X
+.el .ds tx TeX
+.
+.
+.\" from old groff_out.man
+.ie \n(.g \
+. ds ic \/
+.el \
+. ds ic \^
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The GNU
+.I roff
+text processing system,
+.IR groff ,
+is an extension of AT&T
+.IR troff , \" AT&T
+the typesetting system originating in Unix systems of the 1970s.
+.
+.I groff
+removes many arbitrary limitations and adds features,
+both to the input language and to the page description language output
+by the
+.I troff \" generic
+formatter.
+.
+Differences arising from
+.IR groff 's
+implementation of AT&T
+.I troff \" AT&T
+features are also noted.
+.
+See
+.MR roff @MAN7EXT@
+for background.
+.
+.
+.\" ====================================================================
+.SH Language
+.\" ====================================================================
+.
+GNU
+.I troff \" GNU
+features identifiers of arbitrary length;
+supports color output,
+non-integral type sizes,
+and user-defined characters;
+adds more conditional expression operators;
+recognizes additional scaling units and numeric operators;
+enables general file I/O
+(in \[lq]unsafe mode\[rq] only);
+and exposes more formatter state.
+.
+.
+.\" ====================================================================
+.SS "Long names"
+.\" ====================================================================
+.
+GNU
+.I troff \" GNU
+introduces many new requests;
+with three exceptions
+.RB ( cp ,
+.BR do ,
+.BR rj ),
+they have names longer than two characters.
+.
+The names of registers,
+fonts,
+strings/\:macros/\:diversions,
+environments,
+special characters,
+streams,
+and colors can be of any length.
+.
+Anywhere AT&T
+.I troff \" AT&T
+supports a parameterized escape sequence that uses an opening
+parenthesis \[lq](\[rq] to introduce a two-character argument,
+.I groff
+supports a square-bracketed form \[lq][]\[rq] where the argument
+within can be of arbitrary length.
+.
+.
+.\" ====================================================================
+.SS "Font families, abstract styles, and translation"
+.\" ====================================================================
+.
+GNU
+.I troff \" GNU
+can group text typefaces into
+.I families
+containing each of the styles
+.RB \[lq] R \[rq],
+.RB \[lq] I \[rq],
+.RB \[lq] B \[rq],
+and
+.RB \[lq] BI \[rq].
+.
+So that a document need not be coupled to a specific font family,
+an output device can associate a style in the abstract sense with a
+mounting position.
+.
+Thus the default family can be combined with a style dynamically,
+producing a
+.I "resolved font name."
+.
+A document can
+.I translate,
+or remap,
+fonts with the
+.B ftr
+request.
+.
+.
+.P
+Applying the requests
+.BR cs ,
+.BR bd ,
+.BR tkf ,
+.BR uf ,
+or
+.B \%fspecial
+to an abstract style affects the member of the default family
+corresponding to that style.
+.
+The default family can be set with the
+.B fam
+request or
+.B \-f
+command-line option.
+.
+The
+.B styles
+directive in the output device's
+.I DESC
+file controls which mounting positions
+(if any)
+are initially associated with abstract styles rather than fonts,
+and the
+.B sty
+request can update this association.
+.
+.
+.\" ====================================================================
+.SS Colors
+.\" ====================================================================
+.
+.I groff
+supports color output with a variety of color spaces and up to 16 bits
+per channel.
+.
+Some devices,
+particularly terminals,
+may be more limited.
+.
+When color support is enabled,
+two colors are current at any given time:
+the
+.I stroke color,
+with which glyphs,
+rules (lines),
+and geometric figures are drawn,
+and the
+.I fill color,
+which paints the interior of filled geometric figures.
+.
+The
+.BR color ,
+.BR \%defcolor ,
+.BR gcolor ,
+and
+.B fcolor
+requests;
+.B \[rs]m
+and
+.B \[rs]M
+escape sequences;
+and
+.BR .color ,
+.BR .m ,
+and
+.B .M
+registers exercise color support.
+.
+.
+.\" ====================================================================
+.SS "Fractional type sizes and new scaling units"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Using Fractional
+.\" Type Sizes".
+AT&T
+.I troff \" AT&T
+interpreted all type size measurements in points.
+.
+Combined with integer arithmetic,
+this design choice made it impossible to support,
+for instance,
+ten and a half-point type.
+.
+In GNU
+.IR troff , \" GNU
+an output device can select a scaling factor that subdivides a point
+into \[lq]scaled points\[rq].
+.
+A type size expressed in scaled points can thus represent a non-integral
+type size.
+.
+.
+.P
+A
+.I scaled point
+is equal to
+.RI 1/ sizescale
+points,
+where
+.I sizescale
+is specified in the device description file,
+.IR DESC ,
+and defaults to\~1;
+see
+.MR groff_font @MAN5EXT@ .
+.
+Requests and escape sequences in GNU
+.I troff \" GNU
+interpret arguments that represent a type size in points,
+which the formatter multiplies by
+.I sizescale
+and converts to an integer.
+.
+Arguments treated in this way comprise those to the escape sequences
+.B \[rs]H
+and
+.BR \[rs]s ,
+to the request
+.BR ps ,
+the third argument to the
+.B cs
+request,
+and the second and fourth arguments to the
+.B tkf
+request.
+.
+Scaled points may be specified explicitly with the
+.B z
+scaling unit.
+.
+In GNU
+.IR troff , \" GNU
+the register
+.B \[rs]n[.s]
+can interpolate a non-integral type size.
+.
+The register
+.B \[rs]n[.ps]
+interpolates the type size in scaled points.
+.
+.
+.P
+For example,
+if
+.I sizescale
+is\~1000,
+then a scaled point is one thousandth of a point.
+.
+Consequently,
+.RB \[lq] ".ps 10.5" \[rq]
+is synonymous with
+.RB \[lq] ".ps 10.5z" \[rq];
+both set the type size to 10,500\~scaled points,
+or 10.5\~points.
+.
+.
+.P
+It makes no sense to use the
+.RB \[lq] z \[rq]\~scaling
+unit in a numeric expression whose default scaling unit is neither
+.RB \[lq] u \[rq]
+.RB nor\~\[lq] z \[rq],
+so GNU
+.I troff \" GNU
+disallows this.
+.
+Similarly,
+it is nonsensical to use a scaling unit other
+.RB than\~\[lq] z \[rq]
+.RB or\~\[lq] u \[rq]
+in a numeric expression whose default scaling unit
+.RB is\~\[lq] z \[rq],
+so GNU
+.I troff
+disallows this as well.
+.
+.
+.br
+.ne 2v
+.P
+Another new scaling unit,
+.RB \[lq] s \[rq],
+multiplies by the number of basic units in a scaled point.
+.
+Thus,
+.RB \[lq]\^ \[rs]n[.ps]s \[rq]
+is equal to
+.RB \[lq] 1m \[rq]
+by definition.
+.
+Do not confuse the
+.RB \[lq] s \[rq]
+and
+.RB \[lq] z \[rq]
+scaling units.
+.
+.
+.br
+.ne 2v
+.P
+Output devices may be limited in the type sizes they can employ.
+.
+The
+.B .s
+and
+.B .ps
+registers represent the type size as selected by the output driver as it
+understands a device's capability.
+.
+The last
+.I requested
+type size is interpolated in scaled points by the read-only register
+.B .psr
+and in points as a decimal fraction by the read-only string-valued
+register
+.BR .sr .
+.
+Both are associated with the environment.
+.
+For example,
+if a type size of 10.95\~points is requested,
+and the nearest size permitted by a
+.B sizes
+request
+(or by the
+.B sizes
+or
+.B \%sizescale
+directives in the device's
+.I DESC
+file)
+is 11\~points,
+the output driver uses the latter value.
+.\" END Keep (roughly) parallel with groff.texi node "Using Fractional
+.\" Type Sizes".
+.
+.
+.P
+A further two new measurement units available in
+.I groff
+are
+.RB \[lq] M \[rq],
+which indicates hundredths of an em,
+and
+.RB \[lq] f \^\[rq],
+which multiplies by 65,536.
+.
+The latter provides convenient fractions for color definitions with the
+.B \%defcolor
+request.
+.
+For example,
+0.5f equals 32768u.
+.
+.
+.\" ====================================================================
+.SS "Numeric expressions"
+.\" ====================================================================
+.
+GNU
+.I troff \" GNU
+permits spaces in a numeric expression within parentheses,
+and offers three new operators.
+.
+.
+.TP
+.IB e1 >? e2
+Interpolate the greater of
+.I e1
+and
+.IR e2 .
+.
+.
+.TP
+.IB e1 <? e2
+Interpolate the lesser of
+.I e1
+and
+.IR e2 .
+.
+.
+.TP
+.BI ( c ; e )
+Evaluate
+.I e
+using
+.I c
+as the default scaling unit,
+ignoring scaling units in
+.I e
+if
+.I c
+is empty.
+.
+.
+.\" ====================================================================
+.SS "Conditional expressions"
+.\" ====================================================================
+.
+More conditions can be tested with the
+.RB \[lq]\| if \|\[rq]
+and
+.B ie
+requests,
+as well as the new
+.RB \[lq] while \[rq]
+request.
+.
+.
+.TP
+.BI c\~ chr
+True if a character
+.I chr
+is available,
+where
+.I chr
+is an ordinary character
+(Unicode basic Latin excluding control characters and the space),
+a special character,
+or
+.BI \[rs]N\[aq] index\c
+.BR \[aq] .
+.
+.
+.TP
+.BI d\~ nam
+True if a string,
+macro,
+diversion,
+or request
+.I nam
+is defined.
+.
+.
+.TP
+.BI F\~ fnt
+True if a font
+.I fnt
+is available;
+.I fnt
+can be an abstract style
+or a font name.
+.
+.I fnt
+is handled as if it
+were accessed with the
+.B ft
+request
+(that is,
+abstract styles and font translation are applied),
+but
+.I fnt
+cannot be a mounting position,
+and no font is mounted.
+.
+.
+.TP
+.BI m\~ col
+True if a color
+.I col
+is defined.
+.
+.
+.TP
+.BI r\~ reg
+True if a register
+.I reg
+is defined.
+.
+.
+.TP
+.BI S\~ sty
+True if a style
+.I sty
+is registered.
+.
+Font translation applies.
+.
+.
+.TP
+.B v
+Always false.
+.
+This condition is for compatibility with certain other
+.I troff
+implementations only.
+.
+(This refers to
+.IR vtroff ,
+a translator that would convert the C/A/T output from early-vintage AT&T
+.I troff \" AT&T
+to a form suitable for Versatec and Benson-Varian plotters.)
+.
+.
+.\" ====================================================================
+.SS "Drawing commands"
+.\" ====================================================================
+.
+GNU
+.I troff \" GNU
+offers drawing commands to create filled
+circles and ellipses,
+and polygons.
+.\" CSTR #54 did not countenance polygons, but DWB 3.3 had outlined ones
+.\" as \D'p' as we do. Filled polygons appear to be a GNU innovation.
+.
+Stroked (outlined) objects are drawn with the stroke color and
+filled (solid) ones shaded with the fill color.
+.
+These are independent properties;
+if you want a filled,
+stroked figure,
+you must draw the same figure twice using each drawing command.
+.
+A filled figure is always smaller than a stroked one because the former
+is drawn only within its defined area,
+whereas strokes have a line thickness
+(set with another new drawing command,
+.BR \[rs]D\[aq]t\[aq] ).
+.
+.
+.\" ====================================================================
+.SS "Escape sequences"
+.\" ====================================================================
+.
+.\" TODO: Some of the synopses here and in "New requests" get pretty
+.\" discursive. It would be better to lift the introduction of new
+.\" concepts in groff programming to new subsections above. Examples
+.\" include: string parameterization, user-definable characters,
+.\" character properties (cflags), character classes; the hyphenation
+.\" language, code, and pattern file system; file stream manipulation...
+.\"
+.\" _Maybe_ output suppression. It's a big enough concept, but only
+.\" well understood by retired contributors, only used by the grohtml
+.\" output driver (still beta after 20 years), and we have some Savannah
+.\" tickets that point the way to radically simplifying its design,
+.\" eliminating its need to groff before you groff.
+.I groff
+introduces several new escape sequences
+and extends the syntax of a few AT&T
+.I troff \" AT&T
+escape sequences
+(namely,
+.BR \[rs]D ,
+.BR \[rs]f ,
+.BR \[rs]k ,
+.BR \[rs]n ,
+.BR \[rs]s ,
+.BR \[rs]$ ,
+and
+.BR \[rs]* ).
+.
+In the following list,
+escape sequences are collated alphabetically at first,
+and then by symbol roughly in Unicode code point order.
+.\" Exceptions are made to group closely-related escape sequences in an
+.\" order more agreeable to the development of a topic.
+.
+.
+.TP 7.5 \" sinfully obtain better pagination on typesetters
+.BI \[rs]A\[aq] anything \[aq]
+Interpolate 1 if
+.I anything
+is a valid identifier,
+and\~0 otherwise.
+.
+Because invalid input characters are removed,
+invalid identifiers are empty or contain spaces,
+tabs,
+or newlines.
+.
+You can employ
+.B \[rs]A
+to validate a macro argument before using it to construct another escape
+sequence or identifier.
+.
+.TP
+.BI \[rs]B\[aq] anything \[aq]
+Interpolate 1 if
+.I anything
+is a valid numeric expression,
+and\~0 otherwise.
+.
+You might use
+.B \[rs]B
+along with the
+.RB \[lq]\| if \|\[rq]
+request to filter out invalid macro arguments.
+.
+.
+.TP
+.BI \[rs]D\[aq]C\~ "d" \[aq]
+Draw filled circle of diameter
+.I d
+with its leftmost point at the drawing position.
+.
+.
+.TP
+.BI \[rs]D\[aq]E\~ "h v" \[aq]
+Draw filled ellipse with
+.I h
+and
+.I v
+as the axes and the leftmost point at the drawing position.
+.
+.
+.TP
+.BI \[rs]D\[aq]p\~ "h1 v1"\~\c
+.RI .\|.\|.\~ "hn vn"\c
+.B \[aq]
+Draw polygon with vertices at drawing position and each point
+in sequence.
+.
+GNU
+.I troff \" GNU
+closes the polygon by drawing a line from
+.RI ( hn ,\~ vn )
+back to the initial drawing position;
+DWB and Heirloom
+.IR troff s \" DWB, Heirloom
+do not.
+.
+.\" XXX: This would be the "STUPID_DRAWING_POSITIONING" complained of in
+.\" src/libs/libdriver/input.cpp. It is neither the rightmost point
+.\" of the figure nor the initial drawing position that GNU troff
+.\" automatically returned to to close the figure.
+Afterward,
+the drawing position is left at
+.RI ( hn ,\~ vn ).
+.
+.
+.TP
+.BI \[rs]D\[aq]P\~ "h1 v1"\~\c
+.RI .\|.\|.\~ "hn vn"\c
+.B \[aq]
+As
+.BR \[rs]D\[aq]p\[aq] ,
+but the polygon is filled.
+.
+.
+.TP
+.BI \[rs]D\[aq]t\~ "n" \[aq]
+Set line thickness of geometric objects to
+.RI to\~ n
+basic units.
+.
+A zero
+.I n
+selects the minimal supported thickness.
+.
+A negative
+.I n
+selects a thickness proportional to the type size;
+this is the default.
+.
+.
+.TP
+.B \[rs]E
+Embed an escape character that is not interpreted in copy mode
+(compare with
+.B \[rs]a
+and
+.BR \[rs]t ).
+.
+You can use it to ease the writing of nested macro definitions.
+.
+It is also convenient to define strings containing escape sequences that
+need to work when used in copy mode
+(for example,
+as macro arguments),
+or which will be interpolated at varying macro nesting depths.
+.
+.
+.TP
+.BI \[rs]f[ font ]
+Select
+.IR font ,
+which may be a mounting position,
+abstract style,
+or font name,
+to choose the typeface.
+.
+.B \[rs]f[]
+and
+.B \[rs]fP
+are synonyms;
+we recommend the former.
+.
+.
+.TP
+.BI \[rs]F f
+.TQ
+.BI \[rs]F( fm
+.TQ
+.BI \[rs]F[ family ]
+Select default font family.
+.
+.B \[rs]F[]
+makes the previous font family the default.
+.
+.B \[rs]FP
+is unlike
+.BR \[rs]fP ;
+it selects font family \[lq]P\[rq] as the default.
+.
+See the
+.B fam
+request below.
+.
+.
+.TP
+.BI \[rs]k( rg
+.TQ
+.BI \[rs]k[ reg ]
+Mark horizontal drawing position in
+two-character register
+.RI name\~ rg
+or arbitrary register
+.RI name\~ reg .
+.
+.
+.TP
+.BI \[rs]m c
+.TQ
+.BI \[rs]m( cl
+.TQ
+.BI \[rs]m[ col ]
+Set the stroke color.
+.
+.B \[rs]m[]
+restores the previous stroke color,
+or the default if there is none.
+.
+.
+.TP
+.BI \[rs]M c
+.TQ
+.BI \[rs]M( cl
+.TQ
+.BI \[rs]M[ col ]
+Set the fill color.
+.
+.B \[rs]M[]
+restores the previous fill color,
+or the default if there is none.
+.
+.
+.TP
+.BI \[rs]n[ reg ]
+Interpolate register
+.IR reg .
+.
+.
+.TP
+.BI \[rs]O n
+.TQ
+.BI \[rs]O[ n ]
+Suppress
+.I @g@troff
+output of glyphs and geometric objects.
+.
+The sequences
+.BR \[rs]O2 ,
+.BR \[rs]O3 ,
+.BR \[rs]O4 ,
+and
+.B \[rs]O5
+are intended for internal use by
+.MR grohtml @MAN1EXT@ .
+.
+.
+.RS
+.TP
+.B \[rs]O0
+.TQ
+.B \[rs]O1
+Disable and enable,
+respectively,
+the emission of glyphs and geometric objects to the output driver,
+provided that this sequence occurs at the outermost suppression level
+(see
+.B \[rs]O3
+and
+.BR \[rs]O4 ).
+.
+Horizontal motions corresponding to non-overstruck glyph widths still
+occur.
+.
+These sequences also reset the registers
+.BR opminx ,
+.BR opminy ,
+.BR opmaxx ,
+and
+.B opmaxy
+to\~\-1.
+.
+These four registers mark the top left and bottom right hand corners of
+a box encompassing all written or drawn output.
+.
+.
+.TP
+.B \[rs]O2
+At the outermost suppression level,
+enable emission of glyphs and geometric objects,
+and write to the standard error stream the page number and values of the
+four aforementioned registers encompassing glyphs written since the last
+interpolation of a
+.B \[rs]O
+sequence,
+as well as the page offset,
+line length,
+image file name
+(if any),
+horizontal and vertical device motion quanta,
+and input file name.
+.
+Numeric values are in basic units.
+.
+.
+.TP
+.B \[rs]O3
+.TQ
+.B \[rs]O4
+Begin and end a nested suppression level,
+respectively.
+.
+.I \%grohtml
+uses this mechanism to create images of output preprocessed with
+.IR @g@pic ,
+.IR @g@eqn ,
+and
+.IR @g@tbl .
+.
+At startup,
+.I @g@troff
+is at the outermost suppression level.
+.
+.I \%pre\-grohtml
+generates these sequences when processing the document,
+using
+.I @g@troff
+with the
+.B ps
+output device,
+Ghostscript,
+and the PNM tools to produce images in PNG format.
+.
+These sequences start a new page if the device is not
+.B html
+or
+.BR xhtml ,
+to reduce the number of images crossing a page boundary.
+.
+.
+.TP
+.BI \[rs]O5[ Pfile ]
+At the outermost suppression level,
+write the name
+.I file
+to the standard error stream at position
+.IR P ,
+which must be one of
+.BR l ,
+.BR r ,
+.BR c ,
+or
+.BR i ,
+corresponding to
+left,
+right,
+centered,
+and inline alignments within the document,
+respectively.
+.
+.I file
+is is a name associated with the production of the next image.
+.RE
+.
+.
+.TP
+.BI \[rs]R\[aq] name\~\[+-]n \[aq]
+Synonymous with
+.RB \[lq] .nr
+.IR name\~\[+-]n \[rq].
+.
+.
+.TP
+.BI \[rs]s[ \[+-]n ]
+.TQ
+.BI \[rs]s \[+-] [ n ]
+.TQ
+.BI \[rs]s\[aq] \[+-]n \[aq]
+.TQ
+.BI \[rs]s \[+-] \[aq] n \[aq]
+Set the type size to,
+or increment or decrement it by,
+.I n
+scaled points.
+.
+.
+.br
+.ne 5v
+.TP
+.BI \[rs]V e
+.TQ
+.BI \[rs]V( ev
+.TQ
+.BI \[rs]V[ env ]
+Interpolate contents of the environment variable
+.IR env ,
+as returned by
+.MR getenv 3 .
+.
+.B \[rs]V
+is interpreted even in copy mode.
+.
+.
+.TP
+.BI \[rs]X\[aq] anything \[aq]
+Within
+.B \[rs]X
+arguments,
+the escape sequences
+.BR \[rs]& ,
+.BR \[rs]) ,
+.BR \[rs]% ,
+and
+.B \[rs]:
+are ignored;
+.BI \[rs] space
+and
+.B \[rs]\[ti]
+are converted to single space characters;
+and
+.B \[rs]\[rs]
+is reduced to
+.BR \[rs] .
+.
+So that the basic Latin subset of the Unicode character set
+(that is,
+ISO\~646:1991-IRV or,
+popularly,
+\[lq]US-ASCII\[rq])
+can be reliably encoded in
+.I anything,
+the special character escape sequences
+.BR \[rs]\- ,
+.BR \[rs][aq] ,
+.BR \[rs][dq] ,
+.BR \[rs][ga] ,
+.BR \[rs][ha] ,
+.BR \[rs][rs] ,
+and
+.B \[rs][ti]
+are mapped to basic Latin characters;
+see
+.MR groff_char @MAN7EXT@ .
+.
+For this transformation,
+character translations and definitions are ignored.
+.
+Other escape sequences are not supported.
+.
+.
+.IP
+If the
+.B \%use_charnames_in_special
+directive appears in the output device's
+.I DESC
+file,
+the use of special character escape sequences is
+.I not
+an error;
+they are simply output verbatim
+(with the exception of the seven mapped to Unicode basic Latin
+characters,
+discussed above).
+.
+.B \%use_charnames_in_special
+is currently employed only by
+.MR grohtml @MAN1EXT@ .
+.
+.
+.TP
+.BI \[rs]Y m
+.TQ
+.BI \[rs]Y( ma
+.TQ
+.BI \[rs]Y[ mac ]
+Interpolate a macro as a device control command.
+.
+This is similar to
+.BI \[rs]X\[aq]\[rs]*[ mac ]\[aq]\f[R],
+except the contents of
+.I mac
+are not interpreted,
+and
+.I mac
+can be a macro and thus contain newlines,
+whereas the argument to
+.B \[rs]X
+cannot.
+.
+This inclusion of newlines requires an extension to the AT&T
+.I troff \" AT&T
+output format,
+and will confuse postprocessors that do not know about it.
+.
+.
+.TP
+.BI \[rs]Z\[aq] anything \[aq]
+Save the drawing position,
+format
+.IR anything ,
+then restore it.
+.
+Tabs and leaders in the argument are ignored with an error diagnostic.
+.
+.
+.TP
+.B \[rs]#
+Everything up to and including the next newline is ignored.
+.
+This escape sequence is interpreted even in copy mode.
+.
+.B \[rs]#
+is like
+.BR \[rs]" ,
+except that
+.B \[rs]"
+does not ignore a newline;
+the latter therefore cannot be used by itself for a whole-line
+comment\[em]it leaves a blank line on the input stream.
+.
+.
+.\" Keep \$0 before \$( in spite of collation.
+.TP
+.B \[rs]$0
+Interpolate the name by which the macro being interpreted was called.
+.
+In GNU
+.I troff \" GNU
+this name can vary;
+see the
+.B als
+request.
+.
+.
+.TP
+.BI \[rs]$( nn
+.TQ
+.BI \[rs]$[ nnn ]
+In a macro or string definition,
+interpolate
+the
+.IR nn th
+or
+.IR nnn th
+argument.
+.
+Macros and strings can have an unlimited number of arguments.
+.
+.
+.TP
+.B \[rs]$*
+In a macro or string definition,
+interpolate the catenation of all arguments,
+separated by spaces.
+.
+.
+.TP
+.B \[rs]$@
+In a macro or string definition,
+interpolate the catenation of all arguments,
+with each surrounded by double quotes and separated by spaces.
+.
+.
+.TP
+.B \[rs]$\[ha]
+In a macro or string definition,
+interpolate the catenation of all arguments
+constructed in a form suitable for passage to the
+.B ds
+request.
+.
+.
+.TP
+.B \[rs])
+Interpolate a
+.I transparent
+dummy character\[em]one that is ignored by end-of-sentence detection.
+.
+It behaves as
+.BR \[rs]& ,
+except that
+.B \[rs]&
+is treated as letters and numerals normally are after
+\[lq].\[rq],
+\[lq]?\[rq],
+and
+\[lq]!\[rq];
+.B \[rs]&
+cancels end-of-sentence detection,
+and
+.B \[rs])
+does not.
+.
+.
+.TP
+.BI \[rs]*[ "string\~\c
+.RI [ arg \~.\|.\|.]\c
+.B ]
+Interpolate
+.I string,
+passing it
+.I arg
+\&.\|.\|.\&
+as arguments.
+.
+.
+.\" Keep \/ before \, in spite of collation.
+.TP
+.B \[rs]/
+Apply an
+.IR "italic correction" :
+modify the spacing of the preceding glyph so that the distance between
+it and the following glyph is correct if the latter is of upright shape.
+.
+For example,
+if an italic\~\[lq]f\^\[rq] is followed immediately by a roman right
+parenthesis,
+then in many fonts the top right portion of the\~\[lq]f\^\[rq] overlaps
+the top left of the right parenthesis,
+.if t producing \f[I]f\f[R]),
+which is ugly.
+.
+Inserting
+.B \[rs]\^/
+between them
+.if t \{\
+. nop produces
+. ie \n(.g \f[I]f\/\f[R])
+. el \f[I]f\|\f[R])
+. nop and
+.\}
+avoids this problem.
+.
+Use this escape sequence whenever an oblique glyph is immediately
+followed by an upright glyph without any intervening space.
+.
+.
+.TP
+.B \[rs],
+Apply a
+.IR "left italic correction" :
+modify the spacing of the following glyph so that the distance between
+it and the preceding glyph is correct if the latter is of upright shape.
+.
+For example,
+if a roman left parenthesis is immediately followed by an
+italic\~\[lq]f\^\[rq],
+then in many fonts the bottom left portion of the\~\[lq]f\^\[rq]
+overlaps the bottom of the left parenthesis,
+.if t producing \f[R](\f[I]f\f[R],
+which is ugly.
+.
+Inserting
+.B \[rs],
+between them
+.if t \{\
+. nop produces
+. ie \n(.g \f[R](\,\f[I]f\f[R]
+. el \f[R](\^\f[I]f\f[R]
+. nop and
+.\}
+avoids this problem.
+.
+Use this escape sequence whenever an upright glyph is followed
+immediately by an oblique glyph without any intervening space.
+.
+.
+.TP
+.B \[rs]:
+Insert a non-printing break point.
+.
+That is,
+a word can break there,
+but the soft hyphen character does not mark the break point if it does
+(in contrast to
+.RB \[lq]\^ \[rs]% \[rq]).
+.
+This escape sequence is an input word boundary,
+so the remainder of the word is subject to hyphenation as normal.
+.
+.
+.TP
+.BI \[rs]? anything \[rs]?
+When used in a diversion,
+this transparently embeds
+.I anything
+in the diversion.
+.I anything
+is read in copy mode.
+.
+When the diversion is reread,
+.I anything
+is interpreted.
+.I anything
+may not contain newlines;
+use
+.B \[rs]!\&
+if you want to embed newlines in a diversion.
+.
+The escape sequence
+.B \[rs]?\&
+is also recognized in copy mode and becomes an internal code;
+it is this code that terminates
+.IR anything .
+Thus
+.
+.
+.RS
+.IP
+.EX
+.ne 14v+\n(.Vu
+\&.nr x 1
+\&.nf
+\&.di d
+\&\[rs]?\[rs]\[rs]?\[rs]\[rs]\[rs]\[rs]?\[rs]\[rs]\[rs]\[rs]\[rs]\[rs]\
+\[rs]\c
+\&\[rs]nx\[rs]\[rs]\[rs]\[rs]?\[rs]\[rs]?\[rs]?
+\&.di
+\&.nr x 2
+\&.di e
+\&.d
+\&.di
+\&.nr x 3
+\&.di f
+\&.e
+\&.di
+\&.nr x 4
+\&.f
+.EE
+.RE
+.
+.
+.IP
+prints\~\c
+.BR 4 .
+.
+.
+.TP
+.BI \[rs][ char ]
+Typeset the special character
+.IR char .
+.
+.
+.TP
+.BI \[rs][ "base-char combining-component\~"\c
+.RB .\|.\|. ]
+Typeset a composite glyph consisting of
+.I base-char
+overlaid with one or more
+.IR combining-component s.
+.
+For example,
+.RB \[lq]\| \[rs][A\~ho] \^\[rq]
+is a capital letter \[lq]A\[rq] with a \[lq]hook accent\[rq] (ogonek).
+.
+See the
+.B \%composite
+request below;
+.IR "Groff: The GNU Implementation of troff" ,
+the
+.I groff
+Texinfo manual,
+for details of composite glyph name construction;
+and
+.MR groff_char @MAN7EXT@
+for a list of components used in composite glyph names.
+.
+.
+.TP
+.B \[rs]\[ti]
+Insert an unbreakable space that is adjustable like an ordinary space.
+.
+It is discarded from the end of an output line if a break is forced.
+.
+.
+.\" ====================================================================
+.SS "Restricted requests"
+.\" ====================================================================
+.
+To mitigate risks from untrusted input documents,
+the
+.B pi
+and
+.B sy
+requests are disabled by default.
+.
+.MR @g@troff @MAN1EXT@ 's
+.B \-U
+option enables the formatter's \[lq]unsafe mode\[rq],
+restoring their function
+(and enabling additional
+.I groff
+extension requests,
+.BR open ,
+.BR opena ,
+and
+.BR pso ).
+.
+.
+.\" ====================================================================
+.SS "New requests"
+.\" ====================================================================
+.
+.TP
+.BI .aln\~ "new old"
+Create alias
+.I new
+for existing register named
+.IR old ,
+causing the names to refer to the same stored value.
+.
+If
+.I old
+is undefined,
+a warning in category
+.RB \[lq] reg \[rq]
+is generated and the request is ignored.
+.
+To remove a register alias,
+invoke
+.B rr
+on its name.
+.
+A register's contents do not become inaccessible until it has no more
+names.
+.
+.
+.TP
+.BI .als\~ "new old"
+Create alias
+.I new
+for existing request,
+string,
+macro,
+or diversion named
+.IR old ,
+causing the names to refer to the same stored object.
+.
+If
+.I old
+is undefined,
+a warning in category
+.RB \[lq] mac \[rq]
+is produced,
+and the request is ignored.
+.
+The
+.RB \[lq] am \[rq],
+.RB \[lq] as \[rq],
+.BR da ,
+.BR de ,
+.BR di ,
+and
+.B ds
+requests
+(together with their variants)
+create a new object only if the name of the macro,
+diversion,
+or string is currently undefined
+or if it is defined as a request;
+normally,
+they modify the value of an existing object.
+.
+To remove an alias,
+invoke
+.B rm
+on its name.
+.
+The object itself is not destroyed until it has no more names.
+.
+.
+.IP
+When a request,
+macro,
+string,
+or diversion is aliased,
+redefinitions and appendments \[lq]write through\[rq] alias names.
+.
+To replace an alias with a separately defined object,
+you must use the
+.B rm
+request on its name first.
+.
+.
+.TP
+.BI .am1\~ name\~\c
+.RI [ end-name ]
+As
+.RB \[lq] am \[rq],
+but compatibility mode is disabled while the appendment to
+.I name
+is interpreted:
+a \[lq]compatibility save\[rq] token is inserted at its beginning,
+and a \[lq]compatibility restore\[rq] token at its end.
+.
+As a consequence,
+the requests
+.RB \[lq] am \[rq],
+.BR am1 ,
+.BR de ,
+and
+.B de1
+can be intermixed freely since the compatibility save/\:restore tokens
+affect only the parts of the macro populated by
+.B am1
+and
+.BR de1 .
+.
+.
+.TP
+.BI .ami\~ name\~\c
+.RI [ end-name ]
+Append to macro indirectly.
+.
+See
+.B dei
+below.
+.
+.
+.TP
+.BI .ami1\~ name\~\c
+.RI [ end-name ]
+As
+.BR ami ,
+but compatibility mode is disabled during interpretation of the
+appendment.
+.
+.
+.TP
+.BI .as1\~ name\~\c
+.RI [ contents ]
+As
+.RB \[lq] as \[rq],
+but compatibility mode is disabled while the appendment to
+.I name
+is interpreted:
+a \[lq]compatibility save\[rq] token is inserted at the beginning of
+.IR contents ,
+and a \[lq]compatibility restore\[rq] token after it.
+.
+As a consequence,
+the requests
+.RB \[lq] as \[rq],
+.BR as1 ,
+.BR ds ,
+and
+.B ds1
+can be intermixed freely since the compatibility save/\:restore tokens
+affect only the portions of the strings populated by
+.B as1
+and
+.BR ds1 .
+.
+.
+.TP
+.BI .asciify\~ div
+.I Unformat
+the diversion
+.I div
+in a way such that Unicode basic Latin (ASCII) characters,
+characters translated with the
+.B trin
+request,
+space characters,
+and some escape sequences,
+that were formatted in the diversion
+.I div
+are treated like ordinary input characters when
+.I div
+is reread.
+.
+Doing so can be useful in conjunction with the
+.B writem
+request.
+.
+.B asciify
+can be also used for gross hacks;
+for example,
+the following sets
+.RB register\~ n
+to\~1.
+.
+.
+.RS
+.IP
+.EX
+.ne 8v+\n(.Vu
+\&.tr @.
+\&.di x
+\&@nr n 1
+\&.br
+\&.di
+\&.tr @@
+\&.asciify x
+\&.x
+.EE
+.RE
+.
+.
+.IP
+.B asciify
+cannot return all items in a diversion to their source equivalent:
+nodes such as those produced by
+.BR \[rs]N[ .\|.\|.\& ]
+will remain nodes,
+so the result cannot be guaranteed to be a pure string.
+.
+See section \[lq]Copy mode\[rq] in
+.MR groff @MAN7EXT@ .
+.
+Glyph parameters such as the type face and size are not preserved;
+use
+.B unformat
+to achieve that.
+.
+.
+.TP
+.B .backtrace
+Write backtrace of input stack to the standard error stream.
+.
+See the
+.B \-b
+option of
+.MR @g@troff @MAN1EXT@ .
+.
+.
+.TP
+.BR .blm\~ [\c
+.IR name ]
+Set a blank line macro (trap).
+.
+If a blank line macro is thus defined,
+.I groff
+executes
+.I macro
+when a blank line is encountered in the input file,
+instead of the usual behavior.
+.
+A line consisting only of spaces is also treated as blank and subject to
+this trap.
+.
+If no argument is supplied,
+the default blank line behavior is (re-)established.
+.
+.
+.TP
+.BR .box\~ [\c
+.IR name ]
+.TQ
+.BR .boxa\~ [\c
+.IR name ]
+Divert
+(or append)
+output to
+.I name,
+similarly to the
+.B di
+and
+.B da
+requests,
+respectively.
+.
+Any pending output line is
+.I not
+included in the diversion.
+.
+Without an argument,
+stop diverting output;
+any pending output line inside the diversion is discarded.
+.
+.
+.TP
+.B .break
+Exit a
+.RB \[lq] while \[rq]
+loop.
+.
+Do not confuse this request with a typographical break or the
+.B br
+request.
+.
+See
+.RB \[lq] continue \[rq].
+.
+.
+.TP
+.B .brp
+Break and adjust line;
+this is the AT&T
+.I troff \" AT&T
+escape sequence
+.B \[rs]p
+in request form.
+.
+.
+.TP
+.BI .cflags\~ "n c1 c2\~"\c
+\&.\|.\|.
+Assign properties encoded by the number
+.I n
+to characters
+.IR c1 ,
+.IR c2 ,
+and so on.
+.
+Ordinary and special characters have certain associated properties.
+.
+(Glyphs don't:
+to GNU
+.IR troff , \" GNU
+like AT&T device-independent
+.IR troff , \" AT&T
+a glyph is an identifier corresponding to a rectangle with some metrics;
+see
+.MR groff_font @MAN5EXT@ .)
+.
+The first argument is the sum of the desired flags and the remaining
+arguments are the characters to be assigned those properties.
+.
+Spaces between the
+.I cn
+arguments are optional.
+.
+Any argument
+.I cn
+can be a character class defined with the
+.B class
+request rather than an individual character.
+.
+.
+.IP
+The non-negative integer
+.I n
+is the sum of any of the following.
+.
+Some combinations are nonsensical,
+such as
+.RB \[lq] 33 \[rq]
+(1 + 32).
+.
+.
+.RS
+.IP 1
+Recognize the character as ending a sentence if followed by a newline
+or two spaces.
+.
+Initially,
+characters
+.RB \[lq] .?! \[rq]
+have this property.
+.
+.
+.IP 2
+Enable breaks before the character.
+.
+A line is not broken at a character with this property unless the
+characters on each side both have non-zero hyphenation codes.
+.
+This exception can be overridden by adding 64.
+.
+Initially,
+no characters have this property.
+.
+.
+.IP 4
+Enable breaks after the character.
+.
+A line is not broken at a character with this property unless the
+characters on each side both have non-zero hyphenation codes.
+.
+This exception can be overridden by adding 64.
+.
+Initially,
+characters
+.RB \[lq] \-\[rs][hy]\[rs][em] \^\[rq]
+have this property.
+.
+.
+.IP 8
+Mark the glyph associated with this character as overlapping other
+instances of itself horizontally.
+.
+Initially,
+characters
+.RB \[lq]\^ \[rs][ul]\[rs][rn]\[rs][ru]\[rs][radicalex]\[rs][sqrtex]\
+\& \^\[rq]
+have this property.
+.
+.
+.IP 16
+Mark the glyph associated with this character as overlapping other
+instances of itself vertically.
+.
+Initially,
+the character
+.RB \[lq]\^ \[rs][br] \^\[rq]
+has this property.
+.
+.
+.IP 32
+Mark the character as transparent for the purpose of end-of-sentence
+recognition.
+.
+In other words,
+an end-of-sentence character followed by any number of characters with
+this property is treated as the end of a sentence if followed by a
+newline or two spaces.
+.
+This is the same as having a zero space factor in \*[tx].
+.
+Initially,
+characters
+.\" The following is ordered with the apostrophe and (single) closing
+.\" quote on the ends so they are more easily visually distinguished
+.\" from the double quotation marks in roman.
+.RB \[lq]\| \[aq]\|"\|)]*\[rs][dg]\[rs][dd]\[rs][rq]\[rs]\^[cq] \|\[rq]
+have this property.
+.
+.
+.IP 64
+Ignore hyphenation codes of the surrounding characters.
+.
+Use this value in combination with values 2 and\~4.
+.
+Initially,
+no characters have this property.
+.
+.
+.IP
+For example,
+if you need an automatic break point after
+the en-dash in numeric ranges like \[lq]3000\[en]5000\[rq],
+insert
+.RS
+.RS
+.EX
+\&.cflags 68 \[rs][en]
+.EE
+.RE
+into your document.
+.
+However,
+this can lead to bad layout if done without thinking;
+in most situations,
+a better solution than
+changing the
+.B cflags
+value is inserting
+.RB \[lq] \[rs]: \[rq]
+right after the hyphen at the places that really need a break point.
+.RE
+.
+.
+.P
+The remaining values were implemented for East Asian language support;
+those who use alphabetic scripts exclusively can disregard them.
+.
+.
+.IP 128
+Prohibit a break before the character,
+but allow a break after the character.
+.
+This works only in combination with values 256 and 512 and has no effect
+otherwise.
+.
+Initially,
+no characters have this property.
+.
+.
+.IP 256
+Prohibit a break after the character,
+but allow a break before the character.
+.
+This works only in combination with values 128 and 512 and has no effect
+otherwise.
+.
+Initially,
+no characters have this property.
+.
+.
+.IP 512
+Allow a break before or after the character.
+.
+This works only in combination with values 128 and 256 and has no effect
+otherwise.
+.
+Initially,
+no characters have this property.
+.RE
+.
+.
+.IP
+In contrast to values 2 and\~4,
+the values 128,
+256,
+and 512 work
+pairwise.
+.
+If,
+for example,
+the left character has value 512,
+and the right character 128,
+no break will be automatically inserted between them.
+.
+If we use value\~6 instead for the left character,
+a break after the character can't be suppressed since the neighboring
+character on the right doesn't get examined.
+.
+.
+.TP
+.BI .char\~ "c contents"
+Define the ordinary or special
+.RI character\~ c
+as
+.IR contents ,
+which can be empty.
+.
+More precisely,
+.B char
+defines a
+.I groff
+object
+(or redefines an existing one)
+that is accessed with the
+.RI name\~ c
+on input,
+and produces
+.I contents
+on output.
+.
+Every time
+.I c
+is to be formatted,
+.I contents
+is processed in a temporary environment and the result is wrapped up
+into a single object.
+.
+Compatibility mode is turned off and the escape character is
+set
+.RB to\~ \[rs]
+while
+.I contents
+is processed.
+.
+Any emboldening,
+constant spacing,
+or track kerning is applied to this object as a whole,
+not to each character in
+.IR contents .
+.
+.
+.IP
+An object defined by this request can be used just like a glyph
+provided by the output device.
+.
+In particular,
+other characters can be translated to it with the
+.B tr
+request;
+it can be made the tab or leader fill character with the
+.B tc
+and
+.B lc
+requests;
+sequences of it can be drawn with the
+.B \[rs]l
+and
+.B \[rs]L
+escape sequences;
+and,
+if the
+.B hcode
+request is used on
+.IR c ,
+it is subject to automatic hyphenation.
+.
+.
+.IP
+To prevent infinite recursion,
+occurrences of
+.I c
+within its own definition are treated normally
+(as if it were not being defined with
+.BR char ).
+.
+The
+.B tr
+and
+.B trin
+requests take precedence if
+.B char
+both apply
+.RI to\~ c .
+.
+A character definition can be removed with the
+.B rchar
+request.
+.
+.
+.TP
+.BI .chop\~ object
+Remove the last character from the macro,
+string,
+or diversion
+.IR object .
+.
+This is useful for removing the newline from the end of a diversion that
+is to be interpolated as a string.
+.
+This request can be used repeatedly on the same
+.IR object ;
+see section \[lq]gtroff Internals\[rq] in
+.IR "Groff: The GNU Implementation of troff" ,
+the
+.I groff
+Texinfo manual,
+for discussion of nodes inserted by
+.IR groff .
+.
+.
+.TP
+.BI .class\~ "name c1 c2\~"\c
+\&.\|.\|.
+Define a character class
+(or simply \[lq]class\[rq])
+.I name
+comprising the characters or range expressions
+.IR c1 ,
+.IR c2 ,
+and so on.
+.
+.
+.IP
+A class thus defined can then be referred to in lieu of listing all the
+characters within it.
+.
+Currently,
+only the
+.B cflags
+request can handle references to character classes.
+.
+.
+.IP
+In the request's simplest form,
+each
+.I cn
+is a character
+(or special character).
+.
+.RS
+.RS
+.EX
+\&.class [quotes] \[aq] \[rs][aq] \[rs][dq] \[rs][oq] \[rs][cq] \
+\[rs][lq] \[rs][rq]
+.EE
+.RE
+.RE
+.
+.
+.IP
+Since class and special character names share the same name space,
+we recommend starting and ending the class name with
+.RB \[lq] [ \[rq]
+and
+.RB \[lq] ] \[rq],
+respectively,
+to avoid collisions with existing character names defined by
+.I groff
+or the user
+(with
+.B char
+and related requests).
+.
+This practice applies the presence of
+.RB \[lq] ] \[rq]
+in the class name to prevent the usage of the special character escape
+form
+.RB \[lq] \[rs][ .\|.\|. ] \[rq],
+thus you must use the
+.B \[rs]C
+escape to access a class with such a name.
+.
+.
+.IP
+You can also use a character range expression consisting of a start
+character followed by
+.RB \[lq] \- \[rq]
+and then an end character.
+.
+Internally,
+GNU
+.I troff \" GNU
+converts these two character names to Unicode code points
+(according to the
+.I groff
+glyph list [GGL]),
+which determine the start and end values of the range.
+.
+If that fails,
+the class definition is skipped.
+.
+Furthermore,
+classes can be nested.
+.
+.RS
+.RS
+.EX
+\&.class [prepunct] , : ; > }
+\&.class [prepunctx] \[rs]C\[aq][prepunct]\[aq] \
+\[rs][u2013]\-\[rs][u2016]
+.EE
+.RE
+The class
+.RB \[lq] [prepunctx] \[rq]
+thus contains the contents of the class
+.RB \[lq] [prepunct] \[rq]
+and characters in the range U+2013\[en]U+2016.
+.RE
+.
+.
+.IP
+If you want to include
+.RB \[lq] \- \[rq]
+in a class,
+it must be the first character value in the argument list,
+otherwise it gets misinterpreted as part of the range syntax.
+.
+.
+.IP
+It is not possible to use class names as end points of range
+definitions.
+.
+.
+.IP
+A typical use of the
+.B class
+request is to control line-breaking and hyphenation rules as defined by
+the
+.B cflags
+request.
+.
+For example,
+to inhibit line breaks before the characters belonging to the
+.RB \[lq] [prepunctx] \[rq]
+class defined in the previous example,
+you can write the following.
+.
+.RS
+.RS
+.EX
+\&.cflags 2 \[rs]C\[aq][prepunctx]\[aq]
+.EE
+.RE
+.RE
+.
+.
+.TP
+.BI .close\~ stream
+Close the stream named
+.IR stream ,
+invalidating it as an argument to the
+.B write
+request.
+.
+See
+.BR open .
+.
+.
+.TP
+.BI .composite\~ c1\~c2
+Map character name
+.I c1
+to character name
+.I c2
+when
+.I c1
+is a combining component in a composite glyph.
+.
+Typically,
+this remaps a spacing glyph to a combining one.
+.
+.
+.TP
+.B .continue
+Skip the remainder of a
+.RB \[lq] while \[rq]
+loop's body,
+immediately starting the next iteration.
+.
+See
+.BR break .
+.
+.
+.TP
+.BI .color\~ n
+If
+.I n
+is non-zero or missing,
+enable colors
+(the default),
+otherwise disable them.
+.
+.
+.TP
+.BI .cp\~ n
+If
+.I n
+is non-zero or missing,
+enable compatibility mode,
+otherwise disable it.
+.
+In compatibility mode,
+long names are not recognized,
+and the incompatibilities they cause do not arise.
+.
+.
+.TP
+.BI .defcolor\~ "ident scheme color-component\~\c"
+\&.\|.\|.
+Define a color named
+.I ident.
+.
+.I scheme
+identifies a color space and determines the number of required
+.IR color-component s;
+it must be one of
+.RB \[lq] rgb \[rq]
+(three components),
+.RB \[lq] cmy \[rq]
+(three components),
+.RB \[lq] cmyk \[rq]
+(four components),
+or
+.RB \[lq] gray \[rq]
+(one component).
+.
+.RB \[lq] grey \[rq]
+is accepted as a synonym of
+.RB \[lq] gray \[rq].
+.
+The color components can be encoded as a hexadecimal value starting
+with
+.B #
+or
+.BR ## .
+.
+The former indicates that each component is in the range 0\[en]255
+(0\[en]FF),
+the latter the range 0\[en]65535 (0\[en]FFFF).
+.
+Alternatively,
+each color component can be specified as a decimal fraction in the range
+0\[en]1,
+interpreted using a default scaling unit
+.RB of\~\[lq] f \[rq],
+which multiplies its value by 65,536
+(but clamps it at 65,535).
+.
+.
+.IP
+Each output device has a color named
+.RB \[lq] default \[rq],
+which cannot be redefined.
+.
+A device's default stroke and fill colors are not necessarily the same.
+.
+.
+.TP
+.BI .de1\~ name\~\c
+.RI [ end-name ]
+Define a macro to be interpreted with compatibility mode disabled.
+.
+When
+.I name
+is called,
+compatibility mode enablement status is saved;
+it is restored when the call completes.
+.
+.
+.TP
+.BI .dei\~ name\~\c
+.RI [ end-name ]
+Define macro indirectly,
+with the name of the macro to be defined in string
+.I name
+and the name of the end macro terminating its definition in string
+.IR end-name .
+.
+.
+.TP
+.BI .dei1\~ name\~\c
+.RI [ end-name ]
+As
+.BR dei ,
+but compatibility mode is disabled while the definition of the macro
+named in string
+.I name
+is interpreted.
+.
+.
+.TP
+.BI .device\~ anything
+Write
+.IR anything ,
+read in copy mode,
+to
+.I @g@troff
+output as a device control command.
+.
+An initial neutral double quote is stripped to allow the embedding of
+leading spaces.
+.
+.
+.TP
+.BI .devicem\~ name
+Write contents of macro or string
+.I name
+to
+.I @g@troff
+output as a device control command.
+.
+.
+.TP
+.BI .do\~ name\~\c
+.RI [ arg \~.\|.\|.]
+Interpret the string,
+request,
+diversion,
+or macro
+.I name
+(along with any arguments)
+with compatibility mode disabled.
+.
+Compatibility mode is restored
+(only if it was active)
+when the
+.I expansion
+of
+.I name
+is interpreted;
+that is,
+the restored compatibility state applies to the contents of the macro,
+string,
+or diversion
+.I name
+as well as data read from files or pipes if
+.I name
+is any of the
+.BR so ,
+.BR soquiet ,
+.BR mso ,
+.BR msoquiet ,
+or
+.B pso
+requests.
+.
+.
+.IP
+For example,
+.RS
+.RS \" one "extra" RS to get us inboard of this indented paragraph
+.EX
+\&.de mac1
+FOO
+\&..
+\&.de1 mac2
+groff
+\&.mac1
+\&..
+\&.de mac3
+compatibility
+\&.mac1
+\&..
+\&.de ma
+\[rs]\[rs]$1
+\&..
+\&.cp 1
+\&.do mac1
+\&.do mac2 \[rs]" mac2, defined with .de1, calls "mac1"
+\&.do mac3 \[rs]" mac3 calls "ma" with argument "c1"
+\&.do mac3 \[rs][ti] \[rs]" groff syntax accepted in .do arguments
+.EE
+.RE
+results in
+.RS
+.EX
+FOO groff FOO compatibility c1 \[ti]
+.EE
+.RE
+as output.
+.RE \" this "extra" RE avoids indentation of the remaining paragraphs
+.
+.
+.TP
+.BI .ds1\~ "name contents"
+As
+.BR ds ,
+but compatibility mode is disabled while
+.I name
+is interpreted:
+a \[lq]compatibility save\[rq] token is inserted at the beginning of
+.IR contents ,
+and a \[lq]compatibility restore\[rq] token after it.
+.
+.
+.TP
+.B .ecr
+Restore the escape character saved with
+.BR ecs ,
+or set escape character to
+.RB \[lq]\| \[rs] \[rq]
+if none has been saved.
+.
+.
+.TP
+.B .ecs
+Save the current escape character.
+.
+.
+.TP
+.BI .evc\~ env
+Copy the properties of environment
+.I env
+to the current environment,
+except for the following data.
+.
+.
+.RS
+.IP \[bu] 2n
+a partially collected line,
+if present;
+.
+.
+.IP \[bu]
+the interruption status of the previous input line
+(due to use of the
+.B \[rs]c
+escape sequence);
+.
+.
+.IP \[bu]
+the count of remaining lines to center,
+to right-justify,
+or to underline
+(with or without underlined spaces)\[em]these are set to zero;
+.
+.
+.IP \[bu]
+the activation status of temporary indentation;
+.
+.
+.IP \[bu]
+input traps and their associated data;
+.
+.
+.IP \[bu]
+the activation status of line numbering
+(which can be reactivated with
+.RB \[lq] .nm\~+0 \[rq]);
+and
+.
+.
+.IP \[bu]
+the count of consecutive hyphenated lines
+(set to zero).
+.RE
+.
+.
+.TP
+.BR .fam\~ [\c
+.IR family ]
+Set default font family to
+.IR family .
+.
+If no argument is given,
+the previous font family is selected,
+or the formatter's default family if there is none.
+.
+The formatter's default font family is \[lq]T\[rq] (Times),
+but it can be overridden by the output device\[em]see
+.MR groff_font @MAN5EXT@ .
+.
+The default font family is associated with the environment.
+.
+See
+.BR \[rs]F .
+.
+.
+.TP
+.BI .fchar\~ c\~contents
+Define fallback
+.RI character\~ c
+as
+.IR contents .
+.
+The syntax of this request is the same as the
+.B char
+request;
+the difference is that a character defined with
+.B char
+hides a glyph with the same name in the selected font,
+whereas characters defined with
+.B fchar
+are checked only if
+.I c
+isn't found in the selected font.
+.
+This test happens before special fonts are searched.
+.
+.
+.TP
+.BI .fcolor\~ color
+Set the fill color to
+.IR color .
+.
+Without an argument,
+the previous fill color is selected.
+.
+.
+.TP
+.BI .fschar\~ f\~c\~contents
+Define fallback special
+.RI character\~ c
+for font\~\c
+.I f
+as
+.IR contents .
+.
+A character defined by
+.B fschar
+is located after the list of fonts declared with
+.B \%fspecial
+is searched but before those declared with the
+.RB \%\[lq] special \[rq]
+request.
+.
+.TP
+.BI .fspecial\~ "f s1 s2\~"\c
+\&.\|.\|.
+When
+.RI font\~ f
+is selected,
+fonts
+.IR s1 ,
+.IR s2 ,
+\&.\|.\|.\&
+are treated as special;
+that is,
+they are searched for glyphs not found in
+.IR f .
+.
+Any fonts specified in the
+.RB \%\[lq] special \[rq]
+request are searched after
+.IR s1 ,
+.IR s2 ,
+and so on.
+.
+Without
+.I s
+arguments,
+.B \%fspecial
+clears the list of fonts treated as special when
+.I f
+is selected.
+.
+.
+.TP
+.BI .ftr\~ f\~g
+Translate
+.RI font\~ f
+.RI to\~ g .
+.
+Whenever a font
+.RI named\~ f
+is referred to in an
+.B \[rs]f
+escape sequence,
+in the
+.B F
+and
+.B S
+conditional expression operators,
+or in the
+.BR ft ,
+.BR ul ,
+.BR bd ,
+.BR cs ,
+.BR tkf ,
+.BR \%special ,
+.BR \%fspecial ,
+.BR fp ,
+or
+.B sty
+requests,
+.RI font\~ g
+is used.
+If
+.I g
+is missing or identical
+.RI to\~ f ,
+then
+.RI font\~ f
+is not translated.
+.
+.
+.TP
+.BI .fzoom\~ f\~zoom
+Set zoom factor
+.I zoom
+for font\~\c
+.IR f .
+.I zoom
+must a non-negative integer multiple of 1/1000th.
+.
+If it is missing or is equal to zero,
+it means the same as 1000,
+namely no magnification.
+.
+.IR f \~\c
+must be a resolved font name,
+not an abstract style.
+.\" XXX: What about a mounting position? It's not rejected...
+.
+.
+.TP
+.BI .gcolor\~ color
+Set the stroke color to
+.IR color .
+.
+Without an argument,
+the previous stroke color is selected.
+.
+.
+.TP
+.BI .hcode\~ "c1 code1\~"\c
+.RI [ "c2 code2" "] .\|.\|."
+Set the hyphenation code of character
+.I c1
+to
+.IR code1 ,
+that of
+.I c2
+to
+.IR code2 ,
+and so on.
+.
+A hyphenation code must be an ordinary character
+(not a special character escape sequence)
+other than a digit.
+.
+The request is ignored if given no arguments.
+.
+.
+.IP
+For hyphenation to work,
+hyphenation codes must be set up.
+.
+At startup,
+.I groff
+assigns hyphenation codes to the letters \[lq]a\[en]z\[rq]
+(mapped to themselves),
+to the letters \[lq]A\[en]Z\[rq]
+(mapped to \[lq]a\[en]z\[rq]),
+and zero to all other characters.
+.
+Normally,
+hyphenation patterns contain only lowercase letters which should be
+applied regardless of case.
+.
+In other words,
+they assume that the words \[lq]ABBOT\[rq] and \[lq]Abbot\[rq] should be
+hyphenated exactly as \[lq]abbot\[rq] is.
+.
+.B hcode
+extends this principle to letters outside the Unicode basic Latin
+alphabet;
+without it,
+words containing such letters won't be hyphenated properly even if the
+corresponding hyphenation patterns contain them.
+.
+.
+.TP
+.BI .hla\~ lang
+Set the hyphenation language to
+.IR lang .
+.
+Hyphenation exceptions specified with the
+.B hw
+request and hyphenation patterns and exceptions specified with the
+.B hpf
+and
+.B hpfa
+requests are associated with the hyphenation language.
+.
+The
+.B hla
+request is usually invoked by a localization file,
+which is in turn loaded by the
+.I troffrc
+or
+.I troffrc\-end
+file;
+see the
+.B hpf
+request below.
+.
+The hyphenation language is associated with the environment.
+.
+.
+.TP
+.BR .hlm\~ [\c
+.IR n ]
+Set the maximum number of consecutive hyphenated lines
+.RI to\~ n .
+.
+If
+.I n
+is negative,
+there is no maximum.
+.
+If omitted,
+.I n
+is\~\-1.
+.
+This value is associated with the environment.
+.
+Only lines output from a given environment count towards the maximum
+associated with that environment.
+.
+Hyphens resulting from
+.B \[rs]%
+are counted;
+explicit hyphens are not.
+.
+.
+.TP
+.BI .hpf\~ pattern-file
+Read hyphenation patterns from
+.IR pattern-file .
+.
+This file is sought in the same way that macro files are with the
+.B mso
+request or the
+.BI \-m name
+command-line option to
+.MR groff @MAN1EXT@
+and
+.MR @g@troff @MAN1EXT@ .
+.
+.
+.IP
+The
+.I pattern-file
+should have the same format as (simple) \*[tx] pattern files.
+.
+The following scanning rules are implemented.
+.
+.
+.RS
+.IP \[bu] 2n
+A percent sign starts a comment
+(up to the end of the line)
+even if preceded by a backslash.
+.
+.
+.IP \[bu]
+\[lq]Digraphs\[rq] like
+.B \[rs]$
+are not supported.
+.
+.
+.IP \[bu]
+.RB \[lq] \[ha]\[ha]\c
+.IR xx \[rq]
+(where each
+.I x
+is 0\[en]9 or a\[en]f) and
+.BI \[ha]\[ha] c
+.RI (character\~ c
+in the code point range 0\[en]127 decimal)
+are recognized;
+other uses
+.RB of\~ \[ha]
+cause an error.
+.
+.
+.IP \[bu]
+No macro expansion is performed.
+.
+.
+.IP \[bu]
+.B hpf
+checks for the expression
+.BR \[rs]patterns{ .\|.\|. }
+(possibly with whitespace before or after the braces).
+.
+Everything between the braces is taken as hyphenation patterns.
+.
+Consequently,
+.RB \[lq] { \[rq]
+and
+.RB \[lq] } \[rq]
+are not allowed in patterns.
+.
+.
+.IP \[bu]
+Similarly,
+.BR \[rs]hyphenation{ .\|.\|. }
+gives a list of hyphenation exceptions.
+.
+.
+.IP \[bu]
+.B \[rs]endinput
+is recognized also.
+.
+.
+.IP \[bu]
+For backwards compatibility,
+if
+.B \[rs]patterns
+is missing,
+the whole file is treated as a list of hyphenation patterns
+(but the
+.RB \[lq] % \[rq]
+character is still recognized as the start of a comment).
+.RE
+.
+.
+.IP
+Use the
+.B hpfcode
+request
+(see below)
+to map the encoding used in hyphenation pattern files to
+.IR groff 's
+input encoding.
+.
+.
+.IP
+The set of hyphenation patterns is associated with the hyphenation
+language set by the
+.B hla
+request.
+.
+The
+.B hpf
+request is usually invoked by a localization file loaded by the
+.I troffrc
+file.
+.
+By default,
+.I troffrc
+loads the localization file for English.
+.
+(As of
+.I groff
+1.23.0,
+localization files for Czech
+.RI ( cs ),
+German
+.RI ( de ),
+English
+.RI ( en ),
+French
+.RI ( fr ),
+Japanese
+.RI ( ja ),
+Swedish
+.RI ( sv ),
+and Chinese
+.RI ( zh )
+exist.)
+.
+For Western languages,
+the localization file sets the hyphenation mode and loads hyphenation
+patterns and exceptions.
+.
+.
+.IP
+A second call to
+.B hpf
+(for the same language)
+replaces the old patterns with the new ones.
+.
+.
+.IP
+Invoking
+.B hpf
+causes an error if there is no hyphenation language.
+.
+.
+.IP
+If no
+.B hpf
+request is specified
+(either in the document,
+in a file loaded at startup,
+or in a macro package),
+GNU
+.I troff \" GNU
+won't automatically hyphenate at all.
+.
+.
+.TP
+.BI .hpfa\~ pattern-file
+As
+.BR hpf ,
+except that the hyphenation patterns and exceptions from
+.I pattern-file
+are appended to the patterns already applied to the hyphenation language
+of the environment.
+.
+.
+.TP
+.BI .hpfcode\~ "a b"\c
+.RI \~[ "c d" "] .\|.\|."
+Define mapping values for character codes in pattern files.
+.
+This is an older mechanism no longer used by
+.IR groff 's
+own macro files;
+for its successor,
+see
+.B hcode
+above.
+.
+.B hpf
+or
+.B hpfa
+apply the mapping
+after reading or appending to the active list of patterns.
+.
+Its arguments are pairs of character codes\[em]integers from 0 to\~255.
+.
+The request maps character
+.RI code\~ a
+to
+.RI code\~ b ,
+.RI code\~ c
+to
+.RI code\~ d ,
+and so on.
+.
+Character codes that would otherwise be invalid in
+.I groff
+can be used.
+.
+By default,
+every code maps to itself except those for letters \[lq]A\[rq] to
+\[lq]Z\[rq],
+which map to those for \[lq]a\[rq] to \[lq]z\[rq].
+.
+.
+.TP
+.BR .hym\~ [\c
+.IR length ]
+Set the (right) hyphenation margin
+.RI to\~ length .
+.
+If the adjustment mode is not
+.RB \[lq] b \[rq]
+or
+.RB \[lq] n \[rq],
+the line is not hyphenated if it is shorter than
+.IR length .
+.
+Without an argument,
+the default hyphenation margin is reset to its default value,
+0.
+.
+The default scaling unit
+.RB is\~\[lq] m \[rq].
+.
+The hyphenation margin is associated with the environment.
+.
+A negative argument resets the hyphenation margin to zero,
+emitting a warning in category
+.RB \[lq] range \[rq].
+.
+.
+.TP
+.BR .hys\~ [\c
+.IR hyphenation-space ]
+Suppress hyphenation of the line in adjustment modes
+.RB \[lq] b \[rq]
+or
+.RB \[lq] n \[rq],
+if it can be justified by adding no more than
+.I hyphenation-space
+extra space to each inter-word space.
+.
+Without an argument,
+the hyphenation space adjustment threshold is set to its default value,
+0.
+.
+The default scaling unit
+.RB is\~\[lq] m \[rq].
+.
+The hyphenation space adjustment threshold is associated with the
+current environment.
+.
+A negative argument resets the hyphenation space adjustment threshold to
+zero,
+emitting a warning in category
+.RB \[lq] range \[rq].
+.
+.
+.TP
+.BI .itc\~ n\~name
+As
+.RB \[lq] it \[rq],
+but lines interrupted with the
+.B \[rs]c
+escape sequence are not applied to the line count.
+.
+.
+.TP
+.BI .kern\~ n
+If
+.I n
+is non-zero or missing,
+enable pairwise kerning
+(the default),
+otherwise disable it.
+.
+.
+.TP
+.BI .length\~ "reg anything"
+Compute the number of characters in
+.I anything
+and return the count in the register
+.IR reg .
+.
+If
+.I reg
+doesn't exist,
+it is created.
+.
+.I anything
+is read in copy mode.
+.
+.
+.RS
+.IP
+.EX
+.B .ds xxx abcd\eh\[aq]3i\[aq]efgh
+.B .length yyy \e*[xxx]
+.B \en[yyy]
+14
+.EE
+.RE
+.
+.
+.TP
+.BI .linetabs\~ n
+.RS
+If
+.I n
+is non-zero or missing,
+enable line-tabs mode,
+otherwise disable it
+(the default).
+.
+In this mode,
+tab stops are computed relative to the start of the pending output line,
+instead of the drawing position corresponding to the start of the input
+line.
+.
+Line-tabs mode is a property of the environment.
+.
+.
+.P
+For example,
+the following
+.
+.
+.RS
+.P
+.ne 6v+\n(.Vu
+.EX
+\&.ds x a\[rs]t\[rs]c
+\&.ds y b\[rs]t\[rs]c
+\&.ds z c
+\&.ta 1i 3i
+\&\[rs]*x
+\&\[rs]*y
+\&\[rs]*z
+.EE
+.RE
+.
+yields
+.
+.RS
+.EX
+a b c
+.EE
+.RE
+.
+whereas in line-tabs mode,
+the same input gives
+.
+.RS
+.EX
+a b c
+.EE
+.RE
+.
+instead.
+.RE
+.
+.
+.TP
+.BR .lsm\~ [\c
+.IR name ]
+Set the leading space macro (trap) to
+.IR name .
+.
+If there are leading space characters on an input line,
+.I name
+is invoked in lieu of the usual
+.I roff
+behavior;
+the leading spaces are removed.
+.
+The count of leading spaces on an input line is stored in
+.BR \[rs]n[lsn] ,
+and the amount of corresponding horizontal motion in
+.BR \[rs]n[lss] ,
+irrespective of whether a leading space trap is set.
+.
+When it is,
+the leading spaces are removed from the input line,
+and no motion is produced before calling
+.IR name .
+.
+If no argument is supplied,
+the default leading space behavior is (re-)established.
+.
+.
+.TP
+.BI .mso\~ file
+As
+.RB \[lq] so \[rq],
+except that
+.I file
+is sought in the same directories as arguments to the
+.MR groff @MAN1EXT@
+and
+.MR @g@troff @MAN1EXT@
+.B \-m
+command-line option are
+(the \[lq]tmac path\[rq]).
+.
+If the file name to be interpolated has the form
+.IB name .tmac
+and it isn't found,
+.B mso
+tries to include
+.BI tmac. name
+instead and vice versa.
+.
+If
+.I file
+does not exist,
+a warning in category
+.RB \[lq] file \[rq]
+is emitted
+and the request has no other effect.
+.
+.
+.TP
+.BI .msoquiet\~ file
+As
+.BR mso ,
+but no warning is emitted if
+.I file
+does not exist.
+.
+.
+.TP
+.BI .nop \~anything
+Interpret
+.I anything
+as if it were an input line.
+.
+.B nop
+resembles
+.RB \[lq] ".if 1" \[rq];
+it puts a break on the output if
+.I anything
+is empty.
+.
+Unlike
+.RB \[lq]\| if \|\[rq],
+it cannot govern conditional blocks.
+.
+Its application is to maintain consistent indentation within macro
+definitions even when producing text lines.
+.
+.
+.TP
+.B .nroff
+Make the
+.B n
+conditional expression evaluate true and
+.B t
+false.
+.
+See
+.BR troff .
+.
+.
+.TP
+.BI .open\~ "stream file"
+Open
+.I file
+for writing and associate
+.I stream
+with it.
+.
+See
+.B write
+and
+.BR close .
+.
+.
+.TP
+.BI .opena\~ "stream file"
+As
+.BR open ,
+but if
+.I file
+exists,
+append to it instead of truncating it.
+.
+.
+.TP
+.BI .output\~ contents
+Emit
+.IR contents ,
+which are read in copy mode,
+to the formatter output;
+this is similar to
+.B \[rs]!\&
+used in the top-level diversion.
+.
+An initial neutral double quote in
+.I contents
+is stripped to allow the embedding of leading spaces.
+.\" XXX: useless request warning if no argument?
+.
+.
+.TP
+.B .pev
+Report the state of the current environment followed by that of all
+other environments to the standard error stream.
+.
+.
+.TP
+.B .pnr
+Write the names and values of all currently defined registers to the
+standard error stream.
+.
+.
+.TP
+.BI .psbb \~file
+Get the bounding box of a PostScript image
+.IR file .
+.
+This file must conform to Adobe's Document Structuring Conventions;
+the request attempts to extract the bounding box values from a
+.B \%%%BoundingBox
+comment.
+.
+After invocation,
+the
+.I x
+and
+.I y
+coordinates
+(in PostScript units)
+of the lower left and upper right corners can be found in the registers
+.BR \[rs]n[llx] ,
+.BR \[rs]n[lly] ,
+.BR \[rs]n[urx] ,
+and
+.BR \[rs]n[ury] ,
+respectively.
+.
+If an error occurs,
+these four registers are set to zero.
+.
+.
+.TP
+.BI .pso \~command
+As
+.RB \[lq] so \[rq],
+except that input comes from the standard output stream of
+.IR command .
+.
+.
+.TP
+.B .ptr
+Report the names and vertical positions of all page location traps
+to the standard error stream.
+.
+Empty slots in the list are shown as well,
+because they can affect the visibility of subsequently planted traps.
+.
+.
+.TP
+.BI .pvs \~\[+-]n
+Set the post-vertical line spacing
+.RI to\~ n ;
+default scaling unit
+.RB is\~\[lq] p \[rq].
+.
+With no argument,
+the post-vertical line space is set to its previous value.
+.
+.
+.IP
+In GNU
+.IR troff , \" GNU
+the distance between text baselines consists of the extra pre-vertical
+line spacing set by the most negative
+.B \[rs]x
+argument on the pending output line,
+the vertical spacing
+.RB ( vs ),
+the extra post-vertical line spacing set by the most positive
+.B \[rs]x
+argument on the pending output line,
+and the post-vertical line spacing set by this request.
+.
+.
+.TP
+.BI .rchar\~ c\~\c
+\&.\|.\|.
+Remove definition of each ordinary or special character
+.IR c ,
+undoing the effect of a
+.BR char ,
+.BR fchar ,
+or
+.B schar
+request.
+.
+Glyphs,
+which are defined by font description files,
+cannot be removed.
+.
+Spaces and tabs may separate
+.I c
+arguments.
+.
+.
+.TP
+.B .return
+Within a macro,
+return immediately.
+.
+If called with an argument,
+return twice,
+namely from the current macro and from the macro one level higher.
+.
+No effect otherwise.
+.\" XXX: useless request warning?
+.
+.
+.TP
+.BI .rfschar\~ "f c\~"\c
+\&.\|.\|.
+Remove each fallback special
+.RI character\~ c
+for font
+.IR f .
+.
+Spaces and tabs may separate
+.I c
+arguments.
+.
+See
+.BR fschar .
+.
+.
+.TP
+.BR .rj\~ [\c
+.IR n ]
+Right-align the
+.RI next\~ n
+input lines.
+.
+Without an argument,
+right-align the next input line.
+.
+.B rj
+implies
+.RB \[lq] ".ce 0" \[rq],
+and
+.B ce
+implies
+.RB \[lq] ".rj 0" \[rq].
+.
+.
+.TP
+.BI .rnn \~r1\~r2
+Rename register
+.I r1
+to
+.IR r2 .
+.
+If
+.I r1
+doesn't exist,
+the request is ignored.
+.
+.
+.TP
+.BI .schar\~ c\~contents
+Define global fallback character
+.I c
+as
+.IR contents .
+.
+See
+.BR char ;
+the distinction is that a character defined with
+.B schar
+is located after the list of fonts declared with the
+.B \%special
+request but before any mounted special fonts.
+.
+.
+.TP
+.BR .shc \~\c
+.RI [ c ]
+Set the soft hyphen character,
+inserted when a word is hyphenated automatically or at a hyphenation
+character,
+.RI to\~ c .
+.
+If
+.I c
+is omitted,
+the soft hyphen character is set to the default,
+.BR \[rs][hy] .
+.
+If the selected glyph does not exist in the font in use at a potential
+hyphenation point,
+then the line is not broken at that point.
+.
+Neither character definitions
+.RB ( char
+and similar)
+nor translations
+.RB ( tr
+and similar)
+are considered when assigning the soft hyphen character.
+.
+.
+.TP
+.BI .shift\~ n
+In a macro,
+shift the arguments by
+.I n
+positions:
+.RI argument\~ i
+becomes argument
+.IR i \|\-\| n ;
+arguments 1
+.RI to\~ n
+are no longer available.
+.
+.RI If\~ n
+is missing,
+arguments are shifted by\~1.
+.
+No effect otherwise.
+.\" XXX: useless request warning?
+.
+.
+.TP
+.BI .sizes\~ "s1 s2\~"\c
+.RI .\|.\|.\~ sn\~\c
+.RB [ 0 ]
+Set the available type sizes to
+.IR s1 ,
+.IR s2 ,
+\&.\|.\|.\&
+.I sn
+scaled points.
+.
+The list of sizes can be terminated by an
+.RB optional\~\[lq] 0 \[rq].
+.
+Each
+.I si
+can also be a range
+.IR m \(en n .
+.
+In contrast to the device description file directive of the same name
+(see
+.MR groff_font @MAN5EXT@ ),
+the argument list can't extend over more than one line.
+.
+.
+.TP
+.BI .soquiet\~ file
+As
+.RB \[lq] so \[rq],
+but no warning is emitted if
+.I file
+does not exist.
+.
+.
+.TP
+.BI .special\~ f\~\c
+\&.\|.\|.
+Declare each font
+.I f
+as special,
+searching it for glyphs not found in the selected font.
+.
+Without arguments,
+this list of special fonts is made empty.
+.
+.
+.TP
+.BR .spreadwarn\~ [\c
+.IR limit ]
+Emit a
+.B break
+warning if the additional space inserted for each space between words in
+an output line adjusted to both margins with
+.RB \[lq] .ad\~b \[rq]
+is larger than or equal to
+.IR limit .
+.
+A negative value is treated as zero;
+an absent argument toggles the warning on and off without changing
+.IR limit .
+.
+The default scaling unit is
+.BR m .
+.
+At startup,
+.B spreadwarn
+is inactive and
+.I limit
+is 3\~m.
+.
+.
+.IP
+For example,
+.RB \[lq] ".spreadwarn 0.2m" \[rq]
+causes a warning if
+.B break
+warnings are not suppressed and
+.I @g@troff
+must add 0.2\~m or more for each inter-word space in a line.
+.
+.
+.TP
+.BI .stringdown \~str
+.TQ
+.BI .stringup \~str
+Alter the string named
+.I str
+by replacing each of its bytes with its
+lowercase
+.RB ( down )
+or uppercase
+.RB ( up )
+version
+(if one exists).
+.
+Special characters
+(see
+.MR groff_char @MAN7EXT@ )
+will often transform in the expected way due to the regular naming
+convention for accented characters.
+.
+When they do not,
+use substrings and/or catenation.
+.
+.
+.IP
+.RS
+.RS
+.EX
+.B .ds resume R\e[\[aq]e]sum\e[\[aq]e]\e"
+.B \e*[resume]
+.B .stringdown resume
+.B \e*[resume]
+.B .stringup resume
+.B \e*[resume]
+R\['e]sum\['e] r\['e]sum\['e] R\['E]SUM\['E]
+.EE
+.RE
+.RE
+.
+.
+.TP
+.BI .sty\~ n\~s
+Associate abstract
+.RI style\~ s
+with font mounting
+.RI position\~ n .
+.
+.
+.TP
+.BI .substring\~ "string start\~"\c
+.RI [ end ]
+Replace the string named
+.I string
+with its substring bounded by the indices
+.I start
+and
+.IR end ,
+inclusively.
+.
+The first character in the string has index\~0.
+.
+If
+.I end
+is omitted,
+it is implicitly set to the largest valid value
+(the string length minus one).
+.
+Negative indices count backwards from the end of the string:
+the last character has index\~\-1,
+the character before the last has index\~\-2,
+and so on.
+.
+.
+.RS
+.IP
+.EX
+.B .ds xxx abcdefgh
+.B .substring xxx 1 \-4
+.B \e*[xxx]
+bcde
+.B .substring xxx 2
+.B \e*[xxx]
+de
+.EE
+.RE
+.
+.
+.TP
+.BI .tkf\~ f\~s1\~n1\~s2\~n2
+Enable track kerning for font\~\c
+.IR f .
+When the current font is\~\c
+.I f
+the width of every glyph is increased by an amount between
+.I n1
+and
+.IR n2 ;
+when the current type size is less than or equal to
+.I s1
+the width is increased by
+.IR n1 ;
+when it is greater than or equal to
+.I s2
+the width is increased by
+.IR n2 ;
+when the type size is greater than or equal to
+.I s1
+and less than or equal to
+.I s2
+the increase in width is a linear function of the type size.
+.
+.
+.TP
+.BI .tm1\~ message
+As
+.B tm
+request,
+but strips a leading neutral double quote from
+.I message
+to allow the embedding of leading spaces.
+.
+.
+.TP
+.BI .tmc\~ message
+As
+.B tm1
+request,
+but does not append a newline.
+.
+.
+.TP
+.BI .trf\~ file
+Transparently output the contents of file
+.IR file .
+.
+Each line is output as if preceded by
+.BR \[rs]! ;
+however,
+the lines are not subject to copy-mode interpretation.
+.
+If the file does not end with a newline,
+then a newline is added.
+.
+Unlike
+.BR cf ,
+.I file
+cannot contain characters
+that are invalid as input to GNU
+.IR troff . \" GNU
+.
+.
+.IP
+For example,
+you can define a macro\~\c
+.I x
+containing the contents of file\~\c
+.IR f ,
+using
+.
+.
+.RS
+.IP
+.ne 2v+\n(.Vu
+.EX
+\&.di x
+\&.trf f
+\&.di
+.EE
+.RE
+.
+.
+.TP
+.BI .trin\~ abcd
+This is the same as the
+.B tr
+request except that the
+.B asciify
+request uses the character code
+(if any)
+before the character translation.
+.
+Example:
+.
+.
+.RS
+.IP
+.EX
+\&.trin ax
+\&.di xxx
+\&a
+\&.br
+\&.di
+\&.xxx
+\&.trin aa
+\&.asciify xxx
+\&.xxx
+.EE
+.RE
+.
+.
+.IP
+The result is \[lq]x\~a\[rq].
+.
+Using
+.BR tr ,
+the result would be \[lq]x\~x\[rq].
+.
+.
+.TP
+.BI .trnt\~ abcd
+This is the same as the
+.B tr
+request except that the translations do not apply to text that is
+transparently throughput into a diversion with
+.BR \[rs]! .
+For example,
+.
+.
+.RS
+.IP
+.EX
+\&.tr ab
+\&.di x
+\&\[rs]!.tm a
+\&.di
+\&.x
+.EE
+.RE
+.
+.
+.IP
+prints\~\c
+.BR b ;
+if
+.B trnt
+is used instead of
+.B tr
+it prints\~\c
+.BR a .
+.
+.
+.TP
+.B .troff
+Make the
+.B t
+conditional expression evaluate true and
+.B n
+false.
+.
+See
+.BR nroff .
+.
+.
+.TP
+.BI .unformat\~ div
+Unformat the diversion
+.IR div .
+.
+Unlike
+.BR asciify ,
+.B unformat
+handles only tabs and spaces between words,
+the latter usually arising from spaces or newlines in the input.
+.
+Tabs are treated as input tokens,
+and spaces become adjustable again.
+.
+The vertical sizes of lines are not preserved,
+but glyph information
+(font,
+type size,
+space width,
+and so on)
+is retained.
+.
+.
+.TP
+.BI .vpt\~ n
+If
+.I n
+is non-zero or missing,
+enable vertical position traps
+(the default),
+otherwise disable them.
+.
+Vertical position traps are those set by the
+.BR ch ,
+.BR wh ,
+and
+.B dt
+requests.
+.
+.
+.TP
+.BR .warn\~ [\c
+.IR n ]
+Select the categories,
+or \[lq]types\[rq],
+of reported warnings.
+.
+.IR n \~is
+the sum of the numeric codes associated with each warning category that
+is to be enabled;
+all other categories are disabled.
+.
+The categories and their associated codes are listed in section
+\[lq]Warnings\[rq] of
+.MR @g@troff @MAN1EXT@ .
+.\" TODO: Maybe move that table to groff(7).
+.
+For example,
+.RB \[lq] ".warn 0" \[rq]
+disables all warnings,
+and
+.RB \[lq] ".warn 1" \[rq]
+disables all warnings except those about missing glyphs.
+.
+If no argument is given,
+all warning categories are enabled.
+.
+.
+.TP
+.BI .warnscale\~ si
+Set the scaling unit used in warnings to
+.IR si .
+.
+Valid values for
+.I si
+are
+.BR u ,
+.B i
+(the default),
+.BR c ,
+.BR p ,
+.RB and\~ P .
+.
+.
+.TP
+.BI .while \~cond-expr\~anything
+Evaluate the conditional expression
+.IR cond-expr ,
+and repeatedly execute
+.I anything
+unless and until
+.I cond-expr
+evaluates false.
+.
+.I anything,
+which is often a conditional block,
+is referred to as the
+.B while
+request's
+.I body.
+.
+.
+.IP
+.I @g@troff
+treats the body of a
+.B while
+request similarly to that of a
+.B de
+request
+(albeit one not read in copy mode),
+but stores it under an internal name and deletes it when the loop
+finishes.
+.
+The operation of a macro containing a
+.B while
+request can slow significantly if the
+.B while
+body is large.
+.
+Each time the macro is executed,
+the
+.B while
+body is parsed and stored again.
+.
+An often better solution\[em]and one that is more portable,
+since AT&T
+.I troff \" AT&T
+lacked the
+.B while
+request\[em]is to instead write a recursive macro.
+.
+It will be parsed only once (unless you redefine it).
+.
+To prevent infinite loops,
+the default number of available recursion levels is 1,000 or somewhat
+less (because things other than macro calls can be on the input stack).
+.
+You can disable this protective measure,
+or raise the limit,
+by setting the
+.B slimit
+register.
+.
+See section \[lq]Debugging\[rq] below.
+.
+.
+.IP
+If a
+.B while
+body begins with a conditional block,
+its closing brace must end an input line.
+.
+.
+.IP
+The
+.B break
+and
+.B continue
+requests alter a
+.B while
+loop's flow of control.
+.
+.
+.TP
+.BI .write\~ stream\~anything
+Write
+.I anything
+to
+.IR stream ,
+which must previously have been the subject of an
+.B open
+request,
+followed by a newline.
+.
+.I anything
+is read in copy mode.
+.
+An initial neutral double quote in
+.I anything
+is stripped to allow the embedding of leading spaces.
+.
+.
+.TP
+.BI .writec\~ stream\~anything
+As
+.BR write ,
+but without a trailing newline.
+.
+.
+.TP
+.BI .writem\~ "stream name"
+Write the contents of the macro or string
+.I name
+to
+.IR stream ,
+which must previously have been the subject of an
+.B open
+request.
+.
+.I name
+is read in copy mode.
+.
+.
+.br
+.ne 6v
+.\" ====================================================================
+.SS "Extended requests"
+.\" ====================================================================
+.
+.\" XXX: .cf might better belong in "Implementation differences".
+.TP
+.BI .cf\~ file
+In a diversion,
+embed an object which,
+when reread,
+will cause the contents of
+.I file
+to be copied verbatim to the output.
+.
+In AT&T
+.IR troff ,
+the contents of
+.I file
+are immediately copied to the output regardless of whether a diversion
+is being written to;
+this behavior is so anomalous that it must be considered a bug.
+.
+.
+.TP
+.BI .de\~ name\~\c
+.RI [ end-name ]
+.TQ
+.BI .am\~ name\~\c
+.RI [ end-name ]
+.TQ
+.BI .ds\~ name\~\c
+.RI [ contents ]
+.TQ
+.BI .as\~ name\~\c
+.RI [ contents ]
+In compatibility mode,
+these requests behave similarly to
+.BR de1 ,
+.BR am1 ,
+.BR ds1 ,
+and
+.BR as1 ,
+respectively:
+a \[lq]compatibility save\[rq] token is inserted at the beginning,
+and a \[lq]compatibility restore\[rq] token at the end,
+with compatibility mode switched on during execution.
+.
+.
+.TP
+.BI .hy\~ n
+New values 16 and\~32 are available;
+the former enables hyphenation before the last character in a word,
+and the latter enables hyphenation after the first character in a word.
+.
+.
+.TP
+.BI .ss\~ word-space-size\~\c
+.RI [ additional-sentence-space-size ]
+A second argument sets the amount of additional space separating
+sentences on the same output line.
+.
+If omitted,
+this amount is set to
+.IR word-space-size .
+.
+Both arguments are in twelfths of current font's space width
+(typically one-fourth to one-third em for Western scripts;
+see
+.MR groff_font @MAN5EXT@ ).
+.
+The default for both parameters is\~12.
+.
+Negative values are erroneous.
+.
+.
+.TP
+.BR .ta\~ [[\c
+.IR "n1 n2\~" .\|.\|.\~ nn \~]\c
+.BR T \~\c \" space in roman because we must use 2-font macro with \c
+.IR "r1 r2\~" .\|.\|.\~ rn ]
+.I groff
+supports an extended syntax to specify repeating tab stops after
+the
+.RB \[lq] T \[rq]
+mark.
+.
+These values are always taken as relative distances from the previous
+tab stop.
+.
+This is the idiomatic way to specify tab stops at equal intervals in
+.IR groff .
+.
+.
+.IP
+The syntax summary above instructs
+.I groff
+to set tabs at positions
+.IR n1 ,
+.IR n2 ,
+\&.\|.\|.\|,
+.IR nn ,
+then at
+.IR nn \|+\| r1 ,
+.IR nn \|+\| r2 ,
+\&.\|.\|.\|,
+.IR nn \|+\| rn ,
+then at
+.IR nn \|+\| rn \|+\| r1 ,
+.IR nn \|+\| rn \|+\| r2 ,
+\&.\|.\|.\|,
+.IR nn \|+\| rn \|+\| rn ,
+and so on.
+.
+.
+.\" ====================================================================
+.SS "New registers"
+.\" ====================================================================
+.
+GNU
+.I troff \" GNU
+exposes more formatter state via many new read-only registers.
+.
+Their names often correspond to the requests that affect them.
+.
+.
+.TP 12n
+.B \[rs]n[.br]
+Within a macro call,
+interpolate\~1
+if the macro is called with the \[lq]normal\[rq] control character
+(\[lq].\[rq] by default),
+and\~0 otherwise.
+.
+This facility allows the reliable modification of requests.
+.
+Using this register outside of a macro definition makes no sense.
+.
+.
+.RS
+.IP
+.ne 6v+\n(.Vu
+.EX
+\&.als bp*orig bp
+\&.de bp
+\&.tm before bp
+\&.ie \[rs]\[rs]n[.br] .bp*orig
+\&.el \[aq]bp*orig
+\&.tm after bp
+\&..
+.EE
+.RE
+.
+.
+.TP
+.B \[rs]n[.C]
+Interpolate 1\~if compatibility mode is in effect,
+0\~otherwise.
+.
+See
+.BR cp .
+.
+.
+.TP
+.B \[rs]n[.cdp]
+Interpolate depth of last glyph added to the environment.
+.
+It is positive if the glyph extends below the baseline.
+.
+.
+.TP
+.B \[rs]n[.ce]
+Interpolate number of input lines remaining to be centered.
+.
+.
+.TP
+.B \[rs]n[.cht]
+Interpolate height of last glyph added to the environment.
+.
+It is positive if the glyph extends above the baseline.
+.
+.
+.TP
+.B \[rs]n[.color]
+Interpolate 1\~if colors are enabled,
+0\~otherwise.
+.
+.
+.TP
+.B \[rs]n[.cp]
+Within a
+.RB \[lq] do \[rq]
+request,
+interpolate the saved value of compatibility mode
+(see
+.B \[rs]n[.C]
+above).
+.
+.
+.TP
+.B \[rs]n[.csk]
+Interpolate skew of last glyph added to the environment.
+.
+The
+.I skew
+of a glyph is how far to the right of the center of a glyph the center
+of an accent over that glyph should be placed.
+.
+.
+.TP
+.B \[rs]n[.ev]
+Interpolate name of current environment.
+.
+This is a string-valued register.
+.
+.
+.TP
+.B \[rs]n[.fam]
+Interpolate name of default font family.
+.
+This is a string-valued register.
+.
+.
+.TP
+.B \[rs]n[.fn]
+Interpolate resolved name of the selected font.
+.
+This is a string-valued register.
+.
+.
+.TP
+.B \[rs]n[.fp]
+Interpolate next free font mounting position.
+.
+.
+.TP
+.B \[rs]n[.g]
+Interpolate\~1.
+.
+Test with
+.RB \[lq]\| if \|\[rq]
+or
+.B ie
+to check whether GNU
+.I troff \" GNU
+is the formatter.
+.
+.
+.TP
+.B \[rs]n[.height]
+Interpolate font height.
+.
+See
+.BR \[rs]H .
+.
+.
+.TP
+.B \[rs]n[.hla]
+Interpolate hyphenation language of the environment.
+.
+This is a string-valued register.
+.
+.
+.TP
+.B \[rs]n[.hlc]
+Interpolate count of immediately preceding consecutive hyphenated lines
+in the environment.
+.
+.
+.TP
+.B \[rs]n[.hlm]
+Interpolate maximum number of consecutive hyphenated lines allowed in
+the environment.
+.
+.
+.TP
+.B \[rs]n[.hy]
+Interpolate hyphenation mode of the environment.
+.
+.
+.TP
+.B \[rs]n[.hym]
+Inteprolate hyphenation margin of the environment.
+.
+.
+.TP
+.B \[rs]n[.hys]
+Interpolate hyphenation space adjustment threshold of the environment.
+.
+.
+.TP
+.B \[rs]n[.in]
+Interpolate indentation amount applicable to the pending output line.
+.
+.
+.TP
+.B \[rs]n[.int]
+Interpolate\~1 if the previous output line was interrupted
+(ended with
+.BR \[rs]c ),
+0\~otherwise.
+.
+.
+.TP
+.B \[rs]n[.kern]
+Interpolate\~1 if pairwise kerning is enabled,
+0\~otherwise.
+.
+.
+.TP
+.B \[rs]n[.lg]
+Interpolate ligature mode.
+.
+.
+.TP
+.B \[rs]n[.linetabs]
+Interpolate\~1 if line-tabs mode is enabled,
+0\~otherwise.
+.
+.
+.TP
+.B \[rs]n[.ll]
+Interpolate line length applicable to the pending output line.
+.
+.
+.TP
+.B \[rs]n[.lt]
+Interpolate title line length.
+.
+.
+.TP
+.B \[rs]n[.m]
+Interpolate name of the selected stroke color.
+.
+This is a string-valued register.
+.
+.
+.TP
+.B \[rs]n[.M]
+Interpolate name of the selected fill color.
+.
+This is a string-valued register.
+.
+.
+.TP
+.B \[rs]n[.ne]
+Interpolate amount of space demanded by the most recent
+.B ne
+request that caused a page location trap to be sprung.
+.
+See
+.BR \[rs]n[.trunc] .
+.
+.
+.TP
+.B \[rs]n[.nm]
+Interpolate\~1 if output line numbering is enabled
+(even if temporarily suppressed),
+0\~otherwise.
+.
+.
+.TP
+.B \[rs]n[.ns]
+Interpolate\~1 if no-space mode is enabled,
+0\~otherwise.
+.
+.
+.TP
+.B \[rs]n[.O]
+Interpolate output suppression level.
+.
+See
+.BR \[rs]O .
+.
+.
+.TP
+.B \[rs]n[.P]
+Interpolate\~1 if the current page is selected for output.
+.
+See
+.B \-o
+command-line option to
+.MR @g@troff @MAN1EXT@ .
+.
+.
+.TP
+.B \[rs]n[.pe]
+Interpolate\~1 during page ejection,
+0\~otherwise.
+.
+.
+.TP
+.B \[rs]n[.pn]
+Interpolate next page number
+(either that set by
+.BR pn ,
+or that of the current page plus\~1).
+.
+.
+.TP
+.B \[rs]n[.ps]
+Interpolate type size in scaled points.
+.
+.
+.TP
+.B \[rs]n[.psr]
+Interpolate most recently requested type size in scaled points.
+.
+.
+.TP
+.B \[rs]n[.pvs]
+Interpolate post-vertical line spacing amount.
+.
+.
+.TP
+.B \[rs]n[.rj]
+Interpolate number of input lines remaining to be right-aligned.
+.
+.
+.TP
+.B \[rs]n[.slant]
+Interpolate font slant.
+.
+See
+.BR \[rs]S .
+.
+.
+.TP
+.B \[rs]n[.sr]
+Interpolate most recently requested type size in points as a decimal
+fraction.
+.
+This is a string-valued register.
+.
+.
+.TP
+.B \[rs]n[.ss]
+.TQ
+.B \[rs]n[.sss]
+Interpolate values of minimal inter-word space and additional
+inter-sentence space,
+respectively,
+in twelfths of the space width of the selected font.
+.
+.
+.TP
+.B \[rs]n[.sty]
+Interpolate selected abstract font style,
+if any.
+.
+This is a string-valued register.
+.
+.
+.TP
+.B \[rs]n[.tabs]
+Interpolate representation of the tab stop settings in a form suitable
+for passage to the
+.B ta
+request.
+.
+.
+.TP
+.B \[rs]n[.trunc]
+Interpolate amount of vertical space truncated by the most recently
+sprung page location trap,
+or,
+if the trap was sprung by an
+.B ne
+request,
+minus the amount of vertical motion produced by the
+.B ne
+request.
+.
+In other words,
+at the point a trap is sprung,
+.B \[rs]n[.trunc]
+represents the difference of what the vertical position would have
+been but for the trap,
+and what the vertical position actually is.
+.
+See
+.BR \[rs]n[.ne] .
+.
+.
+.TP
+.B \[rs]n[.U]
+Interpolate\~1 if in unsafe mode,
+0\~otherwise.
+.
+See
+.B \-U
+command-line option to
+.MR @g@troff @MAN1EXT@ .
+.
+.
+.TP
+.B \[rs]n[.vpt]
+Interpolate\~1 if vertical position traps are enabled,
+0\~otherwise.
+.
+.
+.TP
+.B \[rs]n[.warn]
+Interpolate warning mode.
+.
+See section \[lq]Warnings\[rq] of
+.MR @g@troff @MAN1EXT@ .
+.\" TODO: Maybe move that table to groff(7).
+.
+.
+.TP
+.B \[rs]n[.x]
+Interpolate major version number of the running
+.I @g@troff
+formatter.
+.
+For example,
+if the version number is 1.23.0,
+then
+.B \[rs]n[.x]
+contains\~1.
+.
+.
+.TP
+.B \[rs]n[.y]
+Interpolate minor version number of the running
+.I @g@troff
+formatter.
+.
+For example,
+if the version number is 1.23.0,
+then
+.B \[rs]n[.y]
+contains\~23.
+.
+.
+.TP
+.B \[rs]n[.Y]
+Interpolate revision number of the running
+.I @g@troff
+formatter.
+.
+For example,
+if the version number is 1.23.0,
+then
+.B \[rs]n[.Y]
+contains\~0.
+.
+.
+.TP
+.B \[rs]n[.zoom]
+Interpolate magnification of font,
+in thousandths,
+or\~0 if magnification unused.
+.
+See
+.BR fzoom .
+.
+.
+.P
+The following (writable) registers are set by the
+.B psbb
+request.
+.
+.
+.TP
+.B \[rs]n[llx]
+.TQ
+.B \[rs]n[lly]
+.TQ
+.B \[rs]n[urx]
+.TQ
+.B \[rs]n[ury]
+Interpolate the
+(upper,
+lower,
+left,
+right)
+bounding box values
+(in PostScript units) of the most recently processed PostScript image.
+.
+.
+.P
+The following (writable) registers are set by the
+.B \[rs]w
+escape sequence.
+.
+.
+.TP 8n
+.B \[rs]n[rst]
+.TQ
+.B \[rs]n[rsb]
+Like
+.B \[rs]n[st]
+and
+.BR \[rs]n[sb] ,
+but taking account of the heights and depths of glyphs.
+.
+In other words,
+these registers store the highest and lowest vertical positions attained
+by the argument formatted by the
+.B \[rs]w
+escape sequence,
+doing what AT&T
+.I troff \" AT&T
+documented
+.B \[rs]n[st]
+and
+.B \[rs]n[sb]
+as doing.
+.
+.
+.TP
+.B \[rs]n[ssc]
+The amount of horizontal space (possibly negative) that should be
+added to the last glyph before a subscript.
+.
+.
+.TP
+.B \[rs]n[skw]
+How far to right of the center of the last glyph in the
+.B \[rs]w
+argument,
+the center of an accent from a roman font should be placed
+over that glyph.
+.
+.
+.P
+Other writable registers are as follows.
+.
+Those relating to date and time are initialized using
+.MR localtime 3
+at formatter startup.
+.
+.
+.\" The `c.` register was documented in the January 1981 "Addendum to
+.\" the Nroff/Troff User's Manual" (presumably by Kernighan), and is
+.\" widely supported by descendants of his device-independent troff, but
+.\" appears to have been overlooked in his 1992 revision of CSTR #54.
+.TP 12n
+.B \[rs]n[c.]
+Interpolate input line number.
+.
+.B \[rs]n[.c]
+is a read-only alias of this register.
+.
+.
+.TP
+.B \[rs]n[hours]
+Interpolate number of hours elapsed since midnight.
+.
+.
+.TP
+.B \[rs]n[hp]
+Interpolate horizontal position relative to that at the start of the
+input line.
+.
+.
+.br
+.ne 3v
+.TP
+.B \[rs]n[lsn]
+.TQ
+.B \[rs]n[lss]
+Interpolate count of leading spaces on input line and amount of
+corresponding horizontal motion,
+respectively.
+.
+.
+.TP
+.B \[rs]n[minutes]
+Interpolate number of minutes elapsed in the hour.
+.
+.
+.TP
+.B \[rs]n[seconds]
+Interpolate number of seconds elapsed in the minute.
+.
+.
+.TP
+.B \[rs]n[systat]
+Interpolate return value of
+.MR system 3
+function executed by most recent
+.B sy
+request.
+.
+.
+.TP
+.B \[rs]n[slimit]
+Interpolates maximum quantity of objects on
+.IR @g@troff 's
+internal input stack
+(default: 1000).
+.
+If non-positive,
+there is no limit:
+recursion can continue until program memory is exhausted.
+.
+.
+.TP
+.B \[rs]n[year]
+Interpolate Gregorian year.
+.
+AT&T
+.IR troff 's \" AT&T
+.B \[rs][yr]
+interpolates the Gregorian year minus 1900.
+.
+.
+.\" ====================================================================
+.SS Miscellaneous
+.\" ====================================================================
+.
+GNU
+.I troff \" GNU
+predefines one string,
+.BR .T ,
+containing the argument given to the
+.B \-T
+command-line option,
+namely the output device
+(for example,
+.B pdf
+or
+.BR utf8 ).
+.
+The (read-only)
+.I register
+.B .T
+interpolates\~1 if GNU
+.I troff \" GNU
+is run with the
+.B \-T
+command-line option,
+and 0\~otherwise.
+.
+.
+.P
+A font not listed in the output device's
+.I DESC
+file's
+.B fonts
+directive is automatically mounted at the next available font position
+when it is selected.
+.
+If you mount a font explicitly with the
+.B fp
+request,
+you should do so on the first unused position,
+which can be found in the
+.B .fp
+register.
+.
+.
+.P
+Unparameterized string interpolation does not conceal the arguments to a
+macro being interpreted.
+.
+Thus,
+in a macro definition,
+the call of another macro with the existing argument list,
+.
+.RS
+.EX
+.BI . xx\~ \[rs]\[rs]$@
+.EE
+.RE
+.
+is more efficiently done with
+.
+.RS
+.EX
+.BI \[rs]\[rs]*[ xx ]\[rs]\[rs]
+.EE
+.RE
+.
+(that is,
+with string interpolation).
+.
+The trailing backslashes prevent the final newline in the macro
+definition from being interpolated,
+potentially putting an unwanted blank line on the output.
+.
+See section \[lq]Punning Names\[rq] in
+.MR groff @MAN7EXT@ .
+.
+.
+.\" XXX: Is this really not an AT&T troff feature?
+.P
+If a font description file contains pairwise kerning information,
+glyphs from that font are kerned.
+.
+Kerning between two glyphs can be inhibited by placing a dummy character
+.B \[rs]&
+between them.
+.
+.
+.P
+GNU
+.I troff \" GNU
+keeps track of the nesting depth of escape sequence
+interpolations and other uses of delimiters,
+as in the
+.B tl
+request and the output comparison operator
+(that is,
+input like
+.B \[aq]foo\[aq]bar\[aq]
+as a conditional expression),
+so the only characters you need to avoid using as
+delimiters are those that appear in the arguments you input,
+not any that result from interpolation.
+.
+Typically,
+.B \[aq]
+works fine.
+.
+Use visible characters as delimiters in GNU
+.IR troff , \" GNU
+not \[lq]ASCII\[rq] controls like BEL (Control+G).
+.
+The implementation of
+.B \[rs]$@
+ensures that the double quotes surrounding an argument appear at an
+interpolation depth different from that of the arguments themselves.
+.
+Similarly,
+in bracket-form escape sequences like
+.B \[rs]f[ZCMI],
+a right bracket
+.B ]
+does not end the sequence unless it occurs at the same interpolation
+depth as the
+.RB opening\~ [ ,
+so input like
+.
+.RS
+.EX
+\[rs]f[\[rs]*[my-family]\[rs]*[my-style]]
+.EE
+.RE
+.
+works as desired.
+.
+In compatibility mode,
+no attention is paid to the interpolation depth.
+.
+.
+.P
+In
+GNU
+.IR troff , \" GNU
+the
+.B tr
+request can map characters to the unbreakable space escape sequence
+.B \[rs]\[ti]
+as a special case
+.RB ( tr
+normally operates only on
+.IR characters ).
+.
+This feature replaces the odd-parity
+.B tr
+mapping trick used in AT&T
+.I troff \" AT&T
+documents,
+where a character,
+often
+.BR \[ti] ,
+was \[lq]sacrificed\[rq] by mapping it to \[lq]nothing\[rq],
+drafting it into use as an unadjustable,
+unbreakable space.
+.
+(This feature was gratuitous even in early AT&T
+.I troff, \" AT&T
+which supported the
+.BI \[rs] space
+escape sequence by 1976.) \" see CSTR #54 of that year
+.
+Often,
+it makes more sense to use
+GNU
+.IR troff 's \" GNU
+.B \[rs]\[ti]
+escape sequence instead,
+which has been adopted by every other active
+.I troff
+implementation except that of Illumos,
+as well as by the
+.RI non -troff
+.IR mandoc .
+.
+Translation of a character to
+.B \[rs]\[ti]
+is unnecessary.
+.
+.
+.P
+GNU
+.I troff \" GNU
+permits tabs and spaces after the first dot on a control line that ends
+a macro definition.
+.
+.RS
+.ne 5v+\n(.Vu
+.EX
+\&.if t \[rs]{\[rs]
+\&.\& de bar
+\&.\& nop Hello, I\[aq]m \[aq]bar\[aq].
+\&.\& .
+\&.\[rs]}
+.EE
+.RS
+.
+.
+.\" ====================================================================
+.SH "Formatter output"
+.\" ====================================================================
+.
+The page description language output by GNU
+.I troff \" GNU
+is modeled after that used by AT&T
+.I troff \" AT&T
+once the latter adopted a device-independent approach in the early
+1980s.
+.
+Only the differences are documented here.
+.
+For a fuller discussion,
+see
+.MR groff_out @MAN5EXT@ .
+.\"
+.\"
+.\" XXX: This feature is unused and documenting it gives a valuable
+.\" hostage to fortune.
+.\".P
+.\"Note that single characters can have the eighth bit set, as can the
+.\"names of fonts and special characters.
+.
+.
+.P
+Glyph and font names can be of arbitrary length;
+postprocessors should not assume that they are at most two characters.
+.
+A glyph to be formatted is always drawn from the current font;
+in contrast to AT&T device-independent
+.IR troff , \" AT&T
+drivers need not search special fonts to find a glyph.
+.
+.
+.\" ====================================================================
+.SS Units
+.\" ====================================================================
+.
+The argument to the
+.BR s \~command
+is in scaled points
+(units of
+.RI points/ n ,
+where
+.I n
+is the argument to the
+.B sizescale
+command in the
+.I DESC
+file).
+.
+The argument to the
+.RB \[lq] "x H" \[rq]
+command is also in scaled points.
+.
+.
+.\" ====================================================================
+.SS "Simple commands"
+.\" ====================================================================
+.
+.\" BEGIN Keep in sync with relevant portions of section "Simple
+.\" commands" from groff_out(5).
+.P
+If the
+.B tcommand
+directive is present in the output device's
+.I DESC
+file,
+GNU
+.I troff \" GNU
+employs the following two commands.
+.
+.
+.TP
+.BI t\~ xyz\c
+\&.\|.\|.
+Typeset word
+.IR xyz ;
+that is,
+set a sequence of ordinary glyphs named
+.IR x ,
+.IR y ,
+.IR z ,
+\&.\|.\|.\|,
+terminated by a space or newline;
+an optional second integer argument is ignored
+(this allows the formatter to generate an even number of arguments).
+.\" XXX: Why?
+.
+Each glyph is set at the current drawing position,
+and the position is then advanced horizontally by the glyph's width.
+.
+A glyph's width is read from its metrics in the font description file,
+scaled to the current type size,
+and rounded to a multiple of the horizontal motion quantum.
+.
+Use the
+.B C
+command to emplace glyphs of special characters.
+.
+.
+.TP
+.BI u\~ "n xyz"\c
+\&.\|.\|.
+Typeset word
+.I xyz
+with track kerning.
+.
+As
+.BR t ,
+but after placing each glyph,
+the drawing position is further advanced horizontally
+.RI by\~ n
+basic units.
+.\" END Keep in sync with relevant portions of section "Simple commands"
+.\" from groff_out(5).
+.
+.
+.P
+New commands implement color support.
+.
+.
+.TP
+.BI mc\~ "cyan magenta yellow"
+.TQ
+.B md
+.TQ
+.BI mg\~ gray
+.TQ
+.BI mk\~ "cyan magenta yellow black"
+.TQ
+.BI mr\~ "red green blue"
+Set the components of the stroke color with respect to various color
+spaces.
+.
+.B md
+resets the stroke color to the default value.
+.
+The arguments are integers in the range 0 to 65535.
+.
+.
+.P
+A new device control subcommand is available.
+.
+.
+.TP
+.BI "x u\~" n
+If
+.I n
+is\~1,
+start underlining of spaces.
+.
+If
+.I n
+is\~0,
+stop underlining of spaces.
+.
+This facility is needed for the
+.B cu
+request in
+.I nroff \" mode
+mode and is ignored otherwise.
+.
+.
+.\" ====================================================================
+.SS "Extended drawing commands"
+.\" ====================================================================
+.
+GNU
+.I pic \" GNU
+does not produce
+.I @g@troff
+escape sequences employing these extensions if its
+.B \-n
+option is given.
+.
+.
+.TP
+.BI Df\~ n
+Set the shade of gray used to fill geometric objects to
+.IR n ,
+which must be an integer.
+.
+0 corresponds to white and 1000 to black.
+.
+A grayscale ramp spans the two.
+.
+A value outside this range uses the stroke color as the fill color.
+.
+The fill color is opaque.
+.
+Normally the default is black,
+but some drivers may provide a way of changing this.
+.
+.B Df
+is obsolete since 2002, \" commit ea5a42d080, 2002-01-24
+superseded by
+.B DFg
+below.
+.
+.
+.IP
+The corresponding
+.B \[rs]D\[aq]f\^\[aq]
+escape sequence should not be used:
+its argument is rounded to an integer multiple of the horizontal motion
+quantum,
+which can limit the precision
+.RI of\~ n .
+.
+.
+.TP
+.BI DC\~ d
+Draw a filled circle of diameter
+.I d
+with its leftmost point at the drawing position.
+.
+.
+.TP
+.BI DE\~ "h v"
+Draw a filled ellipse,
+of horizontal axis
+.I h
+and vertical axis
+.IR v ,
+with its leftmost point at the drawing position.
+.
+.
+.br
+.ne 4v
+.EQ
+delim $$
+.EN
+.TP
+.\" `BR`, not `BI`, here, because eqn will take care of font changes.
+.BR Dp\~ "$dx sub 1 ~ dy sub 1 ~ ldots ~ dx sub n ~ dy sub n$"
+Draw a polygon with,
+for $i = 1 , ldots , n + 1$,
+its
+.IR i th
+vertex at the drawing position
+.
+$+ sum from { j = 1 } to { i - 1 } ( dx sub j , dy sub j )$.
+.
+.\" The following is implied by the math above, but let's be kind.
+.I groff
+output drivers automatically close polygons,
+drawing a line from $( dx sub n , dy sub n )$ back to
+$( dx sub 1 , dy sub 1 )$.
+.
+The drawing position is left at the last
+.I specified
+vertex,
+but this may change in a future version of GNU
+.IR troff . \" GNU
+.
+Heirloom Doctools
+.IR troff , \" Heirloom
+like DWB
+.IR troff , \" DWB
+by default does not close the polygon.
+.
+In its
+.I groff
+compatibility mode,
+Heirloom closes the polygon but leaves the drawing position
+.IR unchanged \[em]that
+is,
+at the polygon's
+.I initial
+drawing position.
+.
+.
+.IP
+At the moment,
+GNU
+.I pic \" GNU
+uses this command only to generate triangles and rectangles.
+.
+.
+.TP
+.BR DP\~ "$dx sub 1 ~ dy sub 1 ~ ldots ~ dx sub n ~ dy sub n$"
+As
+.BR Dp ,
+but draw a filled rather than a stroked polygon.
+.
+.
+.TP
+.BI Dt\~ n
+Set the line thickness to
+.IR n \~\c
+basic units.
+.
+AT&T
+.I troff \" AT&T
+output drivers use a thickness proportional to the type size;
+this is the GNU
+.I troff \" GNU
+default.
+.
+A
+.RI negative\~ n
+requests this explicitly.
+.
+.RI An\~ n
+of zero selects the smallest available line thickness.
+.
+.
+.P
+A difficulty arises in how the drawing position should be changed after
+the execution of these commands.
+.
+This has little importance to most users,
+since the output of GNU
+.I grn \" GNU
+and
+.I pic \" GNU
+does not depend on it.
+.
+Given a drawing command of the form
+.BI D z
+$x sub 1 ~ y sub 1 ~ ldots ~ x sub n ~ y sub n$,
+where
+.I z
+is not
+.B c
+or
+.BR e ,
+AT&T
+.I troff \" AT&T
+treats each $x sub i$ as a horizontal motion,
+each $y sub i$ as a vertical one,
+and therefore assumes that the width of the drawn object is
+$sum from { i = 1 } to n x sub i$,
+and its height is $sum from { i = 1 } to n y sub i$.
+.
+(Verify its assumption about height by examining the
+.B st
+and
+.B sb
+registers after using such a drawing command in a
+.B \[rs]w
+escape sequence).
+.
+For the sake of compatibility,
+GNU
+.I troff \" GNU
+also follows this rule,
+even though it frustrates extensions to the
+.B D
+command that set drawing parameters rather than rendering objects,
+producing ugly results in the case of
+.B Dt
+and
+.BR Df ,
+or otherwise don't parameterize objects as a series of vertices,
+as with
+GNU
+.IR troff 's \" GNU
+filled ellipse,
+.BR DE .
+.
+Thus after executing a
+.BR D \~command
+of the form
+.BI D z
+$x sub 1 ~ y sub 1 ~ ldots ~ x sub n ~ y sub n$,
+the drawing position should be increased by
+.
+$( sum from { i = 1 } to n x sub i , sum from { i = 1 } to n y sub i )$.
+.EQ
+delim off
+.EN
+.
+In a future release,
+GNU
+.I troff \" GNU
+and its output drivers may abandon the application of this assumption to
+drawing commands not explicitly specified in the AT&T \[lq]Troff User's
+Manual\[rq].
+.
+.
+.P
+Fill color selection is implemented with another set of extensions.
+.
+.
+.TP
+.BI DFc\~ "cyan magenta yellow"
+.TQ
+.B DFd
+.TQ
+.BI DFg\~ gray
+.TQ
+.BI DFk\~ "cyan magenta yellow black"
+.TQ
+.BI DFr\~ "red green blue"
+Set the components of the fill color as described under the
+.B \[rs]M
+escape sequence above.
+.
+.B DFd
+restores the device's default fill color.
+.
+The drawing position is not updated,
+in contrast to
+.BR Df .
+.
+.
+.\" ====================================================================
+.SS "Device control syntax extension"
+.\" ====================================================================
+.
+GNU
+.I troff \" GNU
+introduces a line continuation convention,
+permitting the argument to the
+.B x X
+command to contain newlines.
+.
+A newline in the input is transformed to the sequence
+.RI \[lq] newline\c
+.BR + \[rq].
+.
+When interpreting an
+.B x X
+command,
+a postprocessor should therefore be prepared for a plus sign after a
+newline;
+if it occurs,
+preserve the newline,
+discard the plus sign,
+and continue to collect the input into the argument of the
+.B x X
+command.
+.
+A newline
+.I not
+followed by a plus sign terminates the
+.B x X
+command.
+.
+An application of this feature is the embedding of PostScript or PDF
+language command streams into
+.I troff \"
+output.
+.
+.
+.P
+GNU
+.I troff \" GNU
+guarantees that the first three output commands it emits are as follows.
+.
+.
+.P
+.RS
+.EX
+.RI x\~T\~ device
+.RI x\~res\~ n\~h\~v
+x init
+.EE
+.RE
+.
+.
+.br
+.ne 4v
+.\" ====================================================================
+.SH Debugging
+.\" ====================================================================
+.
+In addition to AT&T
+.IR troff 's \" AT&T
+debugging features,
+GNU
+.I troff \" GNU
+emits more error diagnostics when syntactical or semantic nonsense is
+encountered and supports several warning categories;
+the output of these can be selected with
+.BR warn .
+.
+Also see the
+.BR \-E ,
+.BR \-w ,
+and
+.B \-W
+options of
+.MR @g@troff @MAN1EXT@ .
+.
+Backtraces can be automatically produced when errors or warnings occur
+(the
+.B \-b
+option of
+.MR @g@troff @MAN1EXT@ )
+or generated on demand
+.RB ( backtrace ).
+.
+.
+.P
+.I groff
+also adds more flexible diagnostic output requests
+.RB ( tmc
+and
+.BR tm1 ).
+.
+More aspects of formatter state can be examined with requests that write
+lists of
+defined registers
+.RB ( pnr ),
+environments
+.RB ( pev ),
+and page location traps
+.RB ( ptr )
+to the standard error stream.
+.
+.
+.\" ====================================================================
+.SH "Implementation differences"
+.\" ====================================================================
+.
+.\" TODO: Resync with the node of this name in our Texinfo manual.
+GNU
+.IR troff 's \" GNU
+features sometimes cause incompatibilities with documents written
+assuming old implementations of
+.IR troff . \" generic
+.
+Some GNU extensions to
+.I troff \" generic
+are supported by other implementations.
+.
+.
+.P
+When adjusting to both margins,
+AT&T
+.I troff \" AT&T
+at first adjusts spaces starting from the right;
+GNU
+.I troff \" GNU
+begins from the left.
+.
+Both implementations adjust spaces from opposite ends on alternating
+output lines to prevent \[lq]rivers\[rq] in the text.
+.
+.
+.P
+GNU
+.I troff \" GNU
+does not always hyphenate words as AT&T
+.I troff \" AT&T
+does.
+.
+The AT&T implementation uses a set of hard-coded rules specific to
+U.S.\& English,
+while GNU
+.I troff \" GNU
+uses language-specific hyphenation pattern files derived from \*[tx].
+.
+In some versions of
+.I troff \" generic
+there was limited space to store hyphenation exceptions
+(arguments to the
+.B hw
+request);
+GNU
+.I troff \" GNU
+has no such restriction.
+.
+.
+.P
+Long names may be GNU
+.IR troff 's \" GNU
+most obvious innovation.
+.
+AT&T
+.I troff \" AT&T
+interprets
+.RB \[lq] .dsabcd \[rq]
+as defining a string
+.RB \[lq] ab \[rq]
+with contents
+.RB \[lq] cd \[rq].
+.
+Normally,
+GNU
+.I troff \" GNU
+interprets this as a call of a macro named
+.RB \[lq] dsabcd \[rq].
+.
+AT&T
+.I troff \" AT&T
+also interprets
+.B \[rs]*[
+and
+.B \[rs]n[
+as an interpolation of a string or register,
+respectively,
+called
+.RB \[lq] [ \[rq].
+.
+In GNU
+.IR troff , \" GNU
+however,
+the
+.RB \[lq] [ \[rq]
+is normally interpreted as beginning the enclosure of a long identifier.
+.
+In compatibility mode,
+GNU
+.I troff \" GNU
+interprets names in the traditional way,
+which means that they are limited to one or two characters.
+.
+See the
+.B \-C
+option in
+.MR @g@troff @MAN1EXT@
+and,
+above,
+the
+.B .C
+and
+.B .cp
+registers,
+and
+.B cp
+and
+.RB \[lq] do \[rq]
+requests,
+for more on compatibility mode.
+.
+.
+.P
+The register
+.B \[rs]n[.cp]
+is specialized and may require a statement of rationale.
+.
+When writing macro packages or documents that use GNU
+.I troff \" GNU
+features and which may be mixed with other packages or documents that do
+not\[em]common scenarios include serial processing of man pages or use
+of the
+.RB \[lq] so \[rq]
+or
+.B mso
+requests\[em]you may desire correct operation regardless of
+compatibility mode enablement in the surrounding context.
+.
+It may occur to you to save the existing value of
+.B \[rs]n(.C
+into a register,
+say,
+.BR _C ,
+at the beginning of your file,
+turn compatibility mode off with
+.RB \[lq] .cp\~0 \[rq],
+then restore it from that register at the end with
+.RB \[lq] .cp\~\[rs]n(_C \[rq].
+.
+At the same time,
+a modular design of a document or macro package may lead you to multiple
+layers of inclusion.
+.
+You cannot use the same register name everywhere lest you
+\[lq]clobber\[rq] the value from a preceding or enclosing context.
+.
+The two-character register name space of AT&T
+.I troff \" AT&T
+is confining and mnemonically challenging;
+you may wish to use
+GNU
+.IR troff 's \" GNU
+more capacious name space.
+.
+However,
+attempting
+.RB \[lq] ".nr _my_saved_C \[rs]n(.C" \[rq]
+will not work in compatibility mode;
+the register name is too long.
+.
+\[lq]This is exactly what
+.B .do
+is for,\[rq] you think,
+.RB \[lq] ".do nr _my_saved_C \[rs]n(.C" \[rq].
+.
+The foregoing will always save zero to your register,
+because
+.RB \[lq] do \[rq]
+turns compatibility mode
+.I off
+while it interprets its argument list.
+.
+What you need is:
+.
+.RS
+.EX
+\&.do nr _my_saved_C \[rs]n[.cp]
+\&.cp 0
+.EE
+.RE
+.
+at the beginning of your file,
+followed by
+.RS
+.EX
+\&.cp \[rs]n[_my_saved_C]
+\&.do rr _my_saved_C
+.EE
+.RE
+at the end.
+.
+As in the C language,
+we all have to share one big name space,
+so choose a register name that is unlikely to collide with other uses.
+.
+.
+.P
+The existence of the
+.B .T
+string is a common feature of post-CSTR\~#54
+.IR troff s\[em]DWB\~3.3, \" others
+Solaris,
+Heirloom Doctools,
+and Plan\~9
+.I troff \" foreign
+all support it\[em]but valid values are specific to each implementation.
+.
+The behavior of the
+.B .T
+register in GNU
+.I troff \" GNU
+differs from AT&T
+.IR troff , \" AT&T
+which interpolated\~1 only if
+.I nroff \" AT&T
+was the formatter and was called with
+.BR \-T .
+.
+.
+.P
+The
+.B lf
+request sets the number of the
+.I current
+input line in AT&T
+.IR troff ,\" AT&T
+and the
+.I next
+in GNU
+.IR troff .\" GNU
+.
+.
+.br
+.ne 2v
+.P
+AT&T
+.I troff
+had only environments named
+.RB \[lq] 0 \[rq],
+.RB \[lq] 1 \[rq],
+and
+.RB \[lq] 2 \[rq].
+.
+In GNU
+.IR troff ,
+any number of environments may exist,
+using any valid identifiers for their names.
+.
+.
+.P
+GNU
+.I troff \" GNU
+normally tracks the interpolation depth of escape sequence parameters
+and other delimited structures,
+but not in compatibility mode.
+.
+See section \[lq]Miscellaneous\[rq] above.
+.
+.
+.P
+In compatibility mode,
+the escape sequences
+.BR \[rs]f ,
+.BR \[rs]H ,
+.BR \[rs]m ,
+.BR \[rs]M ,
+.BR \[rs]R ,
+.BR \[rs]s ,
+and
+.B \[rs]S
+are transparent at the beginning of an input line for the purpose of
+recognizing a control character,
+because they modify formatter state
+.RB ( \[rs]R )
+or properties of the environment
+(the rest)
+and therefore do not create output nodes.
+.
+For example,
+this code produces bold output in both cases,
+but the text differs,
+.
+.RS
+.EX
+\&.de xx \[aq]
+Hello!
+\&..
+\&\[rs]fB.xx\[rs]fP
+.EE
+.RE
+.
+formatting \[lq].xx\[rq] normally and \[lq]Hello!\[rq] in compatibility
+mode.
+.
+.
+.P
+GNU
+.I troff \" GNU
+request names unrecognized by other
+.I troff \" generic
+implementations will likely be ignored;
+escape sequences that are GNU
+.I troff \" GNU
+extensions are liable to format their function selector character.
+.
+For example,
+the adjustable,
+non-breaking space escape sequence
+.B \[rs]\[ti]
+.\" BEGIN Keep in sync with groff.texi node "Other Differences" and
+.\" groff_man_style(7).
+is also supported by Heirloom Doctools
+.I troff \" Heirloom
+050915 (September 2005),
+.I mandoc
+1.9.5 (2009-09-21),
+.I neatroff
+(commit 1c6ab0f6e,
+2016-09-13),
+and Plan\~9 from User Space
+.I troff \" Plan 9
+(commit 93f8143600,
+2022-08-12),
+but not by Solaris/Illumos
+.IR troff s, \" Solaris/Illumos
+which will render it as
+.BR \[ti] .
+.\" as of this writing, 2022-08-13
+.\" END Keep in sync with groff.texi node "Other Differences" and
+.\" groff_man_style(7).
+.
+.
+.P
+GNU
+.I troff \" GNU
+does not allow the use of the escape sequences
+.BR \[rs]| ,
+.BR \[rs]\[ha] ,
+.BR \[rs]& ,
+.BR \[rs]{ ,
+.BR \[rs]} ,
+.BI \[rs] space\c
+,
+.BR \[rs]\[aq] ,
+.BR \[rs]\[ga] ,
+.BR \[rs]\- ,
+.BR \[rs]_ ,
+.BR \[rs]! ,
+.BR \[rs]% ,
+or
+.B \[rs]c
+in identifiers;
+AT&T
+.I troff \" AT&T
+does.
+.
+The
+.B \[rs]A
+escape sequence
+(see subsection \[lq]Escape sequences\[rq] above)
+may be helpful in avoiding their use.
+.
+.
+.P
+Normally,
+the syntax form
+.BI \[rs]s n
+accepts only a single character
+(a digit)
+for
+.IR n ,
+consistently with other forms that originated in AT&T
+.IR troff , \" AT&T
+like
+.BR \[rs]* ,
+.BR \[rs]$ ,
+.BR \[rs]f ,
+.BR \[rs]g ,
+.BR \[rs]k ,
+.BR \[rs]n ,
+and
+.BR \[rs]z .
+.
+In compatibility mode only,
+a
+.RI non-zero\~ n
+must be in the range 4\[en]39.
+.
+Legacy documents relying upon this quirk of parsing should be migrated
+to another
+.B \[rs]s
+form.
+.
+[Background:
+The Graphic Systems C/A/T phototypesetter
+(the original device target for AT&T
+.IR troff ) \" AT&T
+supported only a few discrete type sizes in the range 6\[en]36 points,
+so Ossanna contrived a special case in the parser to do what the user
+must have meant.
+.
+Kernighan warned of this in the 1992 revision of CSTR\~#54 (\[sc]2.3),
+and more recently,
+McIlroy referred to it as a \[lq]living fossil\[rq].]
+.
+.
+.P
+Fractional type sizes cause one noteworthy incompatibility.
+.
+In AT&T
+.I troff \" AT&T
+the
+.B ps
+request ignores scaling units and thus
+.RB \[lq] .ps\~10u \[rq]
+sets the type size to 10\~points,
+whereas in GNU
+.I troff \" GNU
+it sets the type size to
+.RI 10\~ scaled
+points,
+which may be a much smaller measurement.
+.
+See subsection \[lq]Fractional type sizes and new scaling units\[rq]
+above.
+.
+.
+.P
+The
+.B ab
+request differs from AT&T
+.IR troff : \" AT&T
+GNU
+.I troff \" GNU
+writes no message to the standard error stream if no arguments are
+given,
+and it exits with a failure status instead of a successful one.
+.
+.
+.P
+The
+.B bp
+request differs from AT&T
+.IR troff : \" AT&T
+GNU
+.I troff \" GNU
+does not accept a scaling unit on the argument,
+a page number;
+the former
+(somewhat uselessly)
+does.
+.
+.
+.P
+In AT&T
+.I troff \" AT&T
+the
+.B pm
+request reports
+macro,
+string,
+and
+diversion
+sizes in units of 128-byte blocks,
+and an argument reduces the report to a sum of the above in the same
+units.
+.
+GNU
+.I troff \" GNU
+ignores any arguments and reports the sizes in bytes.
+.
+.
+.P
+Unlike AT&T
+.IR troff , \" AT&T
+GNU
+.I troff \" GNU
+does not ignore the
+.B ss
+request if the output is a terminal device;
+instead,
+the values of minimum inter-word and additional inter-sentence space are
+each rounded down to the nearest multiple of\~12.
+.
+.
+.P
+In GNU
+.I troff \" GNU
+there is a fundamental difference between (unformatted) characters and
+(formatted) glyphs.
+.
+Everything that affects how a glyph is output is stored with the glyph
+node;
+once a glyph node has been constructed,
+it is unaffected by any subsequent requests that are executed,
+including
+.BR bd ,
+.BR cs ,
+.BR tkf ,
+.BR tr ,
+or
+.B fp
+requests.
+.
+Normally,
+glyphs are constructed from characters immediately before the glyph is
+added to an output line.
+.
+Macros,
+diversions,
+and strings are all,
+in fact,
+the same type of object;
+they contain a sequence of intermixed character and glyph nodes.
+.
+Special characters transform from one to the other:
+before being added to the output,
+they behave as characters;
+afterward,
+they are glyphs.
+.
+A glyph node does not behave like a character node when it is processed
+by a macro:
+it does not inherit any of the special properties that the character
+from which it was constructed might have had.
+.
+For example,
+the input
+.
+.br
+.ne 5v
+.RS
+.EX
+\&.di x
+\[rs]\[rs]\[rs]\[rs]
+\&.br
+\&.di
+\&.x
+.EE
+.RE
+.
+produces
+.RB \[lq]\^ \[rs]\[rs] \[rq]
+in GNU
+.IR troff . \" GNU
+Each pair of backslashes becomes one backslash
+.I glyph;
+the resulting backslashes are thus not interpreted as escape
+.I characters
+when they are reread as the diversion is output.
+.
+AT&T
+.I troff \" AT&T
+.I would
+interpret them as escape characters when rereading them and end up
+printing one
+.RB \[lq] \[rs] \[rq].
+.
+.
+.P
+One way to format a backslash in most documents is with the
+.B \[rs]e
+escape sequence;
+this formats the glyph of the current escape character,
+regardless of whether it is used in a diversion;
+it also works in both GNU
+.I troff \" GNU
+and AT&T
+.IR troff . \" AT&T
+.
+(Naturally,
+if you've changed the escape character,
+you need to prefix the
+.RB \[lq] e \[rq]
+with whatever it is\[em]and you'll likely get something other than a
+backslash in the output.)
+.
+.
+.P
+The other correct way,
+appropriate in contexts independent of the backslash's common use as a
+.I roff
+escape character\[em]perhaps in discussion of character sets or other
+programming languages\[em]is the character escape
+.B \[rs](rs
+or
+.BR \[rs][rs] ,
+for \[lq]reverse solidus\[rq],
+from its name in the ECMA-6 (ISO/IEC\~646) standard.
+.
+[This escape sequence is not portable to AT&T
+.IR troff , \" AT&T
+but is to its lineal descendant,
+Heirloom Doctools
+.IR troff ,
+as of its 060716 release (July 2006).]
+.
+.
+.P
+To store an escape sequence in a diversion that is interpreted when the
+diversion is reread,
+either use the traditional
+.B \[rs]!\&
+transparent output facility,
+or,
+if this is unsuitable,
+the new
+.B \[rs]?\&
+escape sequence.
+.
+See subsection \[lq]Escape sequences\[rq] above and sections
+\[lq]Diversions\[rq] and \[lq]gtroff Internals\[rq] in
+.IR "Groff: The GNU Implementation of troff" ,
+the
+.I groff
+Texinfo manual.
+.
+.
+.P
+In the somewhat pathological case where a diversion exists containing a
+partially collected line and a partially collected line at the top-level
+diversion has never existed,
+AT&T
+.I troff
+will output the partially collected line at the end of input;
+GNU
+.I troff \" GNU
+will not.
+.
+.
+.\" ====================================================================
+.SS "Formatter output incompatibilities"
+.\" ====================================================================
+.
+Its extensions notwithstanding,
+the
+.I groff
+intermediate output format has some incompatibilities
+with that of AT&T
+.IR troff , \" AT&T
+but better compatibility is sought;
+problem reports and patches are welcome.
+.
+The following incompatibilities are known.
+.
+.
+.IP \[bu] 2n
+The drawing position after rendering polygons is inconsistent with AT&T
+.I troff \" AT&T
+practice.
+.
+Other implementations have diverged on this point as well.
+.
+.
+.IP \[bu]
+The output cannot be easily rescaled to other devices as AT&T
+.IR troff 's \" AT&T
+could.
+.\" XXX: Why? What's the problem? sizescale? That could be written
+.\" into the output as a comment or x command. --GBR
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+This document was written by
+.MT jjc@\:jclark\:.com
+James Clark
+.ME ,
+.MT wl@\:gnu\:.org
+Werner Lemberg
+.ME ,
+.MT groff\-bernd\:.warken\-72@\:web\:.de
+Bernd Warken
+.ME ,
+and
+.MT g.branden\:.robinson@\:gmail\:.com
+G.\& Branden Robinson
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is the primary
+.I groff
+manual.
+.
+You can browse it interactively with \[lq]info groff\[rq].
+.
+.
+.br
+.ne 4v
+.P
+\[lq]Troff User's Manual\[rq]
+by Joseph F.\& Ossanna,
+1976
+(revised by Brian W.\& Kernighan,
+1992),
+AT&T Bell Laboratories Computing Science Technical Report No.\& 54,
+widely called simply \[lq]CSTR\~#54\[rq],
+documents the language,
+device and font description file formats,
+and output format
+referred to collectively in
+.I groff
+documentation as AT&T
+.IR troff . \" AT&T
+.
+.
+.P
+\[lq]A Typesetter-independent TROFF\[rq]
+by Brian W.\& Kernighan,
+1982,
+AT&T Bell Laboratories Computing Science Technical Report No.\& 97,
+provides additional insights into the
+device and font description file formats
+and output format.
+.
+.
+.P
+.MR groff @MAN1EXT@ ,
+.MR groff @MAN7EXT@ ,
+.MR roff @MAN7EXT@
+.
+.
+.\" Clean up.
+.rm tx
+.rm ic
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_diff_7_man_C]
+.do rr *groff_groff_diff_7_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/man/groff_font.5.man b/man/groff_font.5.man
new file mode 100644
index 0000000..0ee1d9a
--- /dev/null
+++ b/man/groff_font.5.man
@@ -0,0 +1,1114 @@
+.TH groff_font @MAN5EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+groff_font \- GNU
+.I roff
+device and font description files
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2021 Free Software Foundation, Inc.
+.\"
+.\" This file is part of groff (GNU roff), which is a free software
+.\" project.
+.\"
+.\" 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.
+.\"
+.\" You should have received a copy of the GNU General Public License
+.\" along with this program. If not, see
+.\" <http://www.gnu.org/licenses/gpl-2.0.html>.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_font_5_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.\" BEGIN Keep parallel with groff.texi node "Device and Font Files".
+The
+.I groff
+font and output device description formats are slight
+extensions of those used by AT&T device-independent
+.IR troff . \" AT&T
+.
+In distinction to the AT&T implementation,
+.I groff
+lacks a binary format;
+all files are text files.
+.
+(Plan\~9
+.I troff \" Plan 9
+has also abandoned the binary format.)
+.
+The device and font description files for a device
+.I name
+are stored in a
+.IR dev name
+directory.
+.
+The device description file is called
+.IR DESC ,
+and,
+for each font supported by the device,
+a font description file is
+.RI called\~ f,
+where
+.IR f \~is
+usually an abbreviation of a font's name and/or style.
+.
+For example,
+the
+.B ps
+(PostScript)
+device has
+.I groff
+font description files for Times roman
+.RB ( TR )
+and Zapf Chancery Medium italic
+.RB ( ZCMI ),
+among many others,
+while the
+.B utf8
+device
+(for terminal emulators)
+has only font descriptions for the roman,
+italic,
+bold,
+and bold-italic styles
+.RB ( R ,
+.BR I ,
+.BR B ,
+and
+.BR BI ,
+respectively).
+.
+.
+.P
+Device and font description files are read by the formatter,
+.IR @g@troff ,
+and by output drivers.
+.
+The programs typically delegate these files' processing to an internal
+library,
+.IR libgroff ,
+ensuring their consistent interpretation.
+.
+.
+.\" ====================================================================
+.SH "\f[I]DESC\f[] file format"
+.\" ====================================================================
+.
+The
+.I DESC
+file contains a series of directives;
+each begins a line.
+.
+Their order is not important,
+with two exceptions:
+(1) the
+.B res
+directive must precede any
+.B \%papersize
+directive;
+and
+(2) the
+.B charset
+directive must come last
+(if at all).
+.
+If a directive name is repeated,
+later entries in the file override previous ones
+(except that the paper dimensions are computed based on the
+.B res
+directive last seen when
+.B \%papersize
+is encountered).
+.
+Spaces and/or tabs separate words and are ignored at line boundaries.
+.
+Comments start with the
+.RB \[lq] # \[rq]
+character and extend to the end of a line.
+.
+Empty lines are ignored.
+.
+.
+.TP
+.BI family\~ fam
+The default font family is
+.IR fam .
+.
+.
+.TP
+.BI fonts\~ "n F1"\~\c
+.RI .\|.\|.\&\~ Fn
+Fonts
+.IR F1 ", \|.\|.\|.\|, " Fn
+are mounted at font positions
+.IR m "\|+\|1, \|.\|.\|., " m \|+\| n
+where
+.I m
+is the number of
+.B styles
+(see below).
+.
+This directive may extend over more than one line.
+.
+A font name
+.RB of\~ 0
+causes no font to be mounted at the corresponding position.
+.
+.
+.TP
+.BI hor\~ n
+The horizontal motion quantum is
+.IR n \~basic
+units.
+.
+Horizontal quantities are rounded to multiples
+.RI of\~ n.
+.
+.
+.TP
+.BI image_generator\~ program
+Use
+.I program
+to generate PNG images from PostScript input.
+.
+Under GNU/Linux,
+this is usually
+.MR gs 1 ,
+but under other systems
+(notably Cygwin)
+it might be set to another name.
+.
+The
+.MR grohtml @MAN1EXT@
+driver uses this directive.
+.
+.
+.TP
+.BI paperlength\~ n
+The vertical dimension of the output medium is
+.IR n \~basic
+units
+(deprecated:
+use
+.B \%papersize
+instead).
+.
+.
+.TP
+.BI papersize\~ format-or-dimension-pair-or-file-name\c
+\~.\|.\|.
+The dimensions of the output medium are as according to the
+argument,
+which is either
+a standard paper format,
+a pair of dimensions,
+or the name of a plain text file containing either of the foregoing.
+.
+Recognized paper formats are the ISO and DIN formats
+.BR A0 \[en] A7 ,
+.BR B0 \[en] B7 ,
+.BR C0 \[en] C7 ,
+and
+.BR D0 \[en] D7 ;
+.\" XXX: tmac/papersize.tmac does not support [ABCD]7.
+the U.S.\& formats
+.BR letter ,
+.BR legal ,
+.BR tabloid ,
+.BR ledger ,
+.BR statement ,
+and
+.BR executive ;
+and the envelope formats
+.BR com10 ,
+.BR monarch ,
+and
+.BR DL .
+.
+Matching is performed without regard for lettercase.
+.
+.
+.IP
+Alternatively,
+the argument can be a custom paper format
+.IB length , width
+(with no spaces before or after the comma).
+.
+Both
+.I length
+and
+.I width
+must have a unit appended;
+valid units are
+.RB \[lq] i \[rq]
+for inches,
+.RB \[lq] c \[rq]
+for centimeters,
+.RB \[lq] p \[rq]
+for points,
+and
+.RB \[lq] P \[rq]
+for picas.
+.
+Example:
+.RB \[lq] 12c,235p \[rq].
+.
+An argument that starts with a digit is always treated as a custom paper
+format.
+.
+.
+.IP
+Finally,
+the argument can be a file name
+(e.g.,
+.IR /etc/papersize );
+if the file can be opened,
+the first line is read and a match attempted against each other form.
+.
+No comment syntax is supported.
+.
+.
+.IP
+More than one argument can be specified;
+each is scanned in turn and the first valid paper specification used.
+.
+.
+.TP
+.BI paperwidth\~ n
+The horizontal dimension of the output medium is
+.IR n \~basic
+units
+(deprecated:
+use
+.B \%papersize
+instead).
+.
+.
+.TP
+.B pass_filenames
+Direct
+.I @g@troff
+to emit the name of the source file being processed.
+.
+This is achieved with the intermediate output command
+.RB \[lq] "x F" \[rq],
+which
+.I \%grohtml
+interprets.
+.
+.
+.TP
+.BI postpro\~ program
+Use
+.I program
+as the postprocessor.
+.
+.
+.TP
+.BI prepro\~ program
+Use
+.I program
+as a preprocessor.
+.
+The
+.B html
+and
+.B xhtml
+output devices use this directive.
+.
+.
+.TP
+.BI print\~ program
+Use
+.I program
+as the print spooler.
+.
+If omitted,
+.IR groff 's
+.B \-l
+and
+.B \-L
+options are ignored.
+.
+.
+.TP
+.BI res\~ n
+The device resolution is
+.I n
+basic units per inch.
+.
+.
+.TP
+.BI sizes\~ s1\~\c
+.RI .\|.\|.\&\~ sn\~\c
+.B 0
+The device has fonts at
+.IR s1 ,
+\&.\|.\|.,
+.I sn
+scaled points
+(see below).
+.
+The list of sizes must be terminated by
+.RB a\~ 0 .
+.
+Each
+.I si
+can also be a range of sizes
+.IR m \[en] n .
+.
+The list can extend over more than one line.
+.
+.
+.TP
+.BI sizescale\~ n
+A typographical point
+is subdivided into
+.IR n \~scaled
+points.
+.
+The default
+.RB is\~ 1 .
+.
+.
+.TP
+.BI styles\~ S1\~\c
+.RI .\|.\|.\&\~ Sm
+The
+.RI first\~ m
+font mounting positions are associated with styles
+.IR S1 ,
+\&.\|.\|.,
+.IR Sm .
+.
+.
+.TP
+.B tcommand
+The postprocessor can handle the
+.B t
+.RB and\~ u
+intermediate output commands.
+.
+.
+.TP
+.B unicode
+The output device supports the complete Unicode repertoire.
+.
+This directive is useful only for devices which produce character
+entities instead of glyphs.
+.
+.
+.IP
+If
+.B unicode
+is present,
+no
+.B charset
+section is required in the font description files since the Unicode
+handling built into
+.I groff
+is used.
+.
+However,
+if there are entries in a font description file's
+.B charset
+section,
+they either override the default mappings for those particular
+characters or add new mappings
+(normally for composite characters).
+.
+.
+.IP
+The
+.BR utf8 ,
+.BR html ,
+and
+.B xhtml
+output devices use this directive.
+.
+.
+.TP
+.BI unitwidth\~ n
+Quantities in the font description files are in basic units for fonts
+whose type size is
+.IR n \~scaled
+points.
+.
+.
+.TP
+.B unscaled_charwidths
+Make the font handling module always return unscaled glyph widths.
+.
+The
+.I \%grohtml
+driver uses this directive.
+.
+.
+.TP
+.B use_charnames_in_special
+.I @g@troff
+should encode named glyphs inside device control commands.
+.
+The
+.I \%grohtml
+driver uses this directive.
+.
+.
+.TP
+.BI vert\~ n
+The vertical motion quantum is
+.IR n \~basic
+units.
+.
+Vertical quantities are rounded to multiples
+.RI of\~ n.
+.
+.
+.TP
+.B charset
+This directive and the rest of the file are ignored.
+.
+It is recognized for compatibility with other
+.I troff \" generic
+implementations.
+.
+In GNU
+.IR troff , \" GNU
+character set repertoire is described on a per-font basis.
+.
+.
+.P
+.I @g@troff
+recognizes but ignores the directives
+.BR spare1 ,
+.BR spare2 ,
+and
+.BR biggestfont .
+.
+.
+.P
+The
+.BR res ,
+.BR unitwidth ,
+.BR fonts ,
+and
+.B sizes
+lines are mandatory.
+.
+Directives not listed above are ignored by
+.I @g@troff
+but may be used by postprocessors to obtain further information about
+the device.
+.
+.
+.\" ====================================================================
+.SH "Font description file format"
+.\" ====================================================================
+.
+On typesetting output devices,
+each font is typically available at multiple sizes.
+.
+While paper measurements in the device description file are in absolute
+units,
+measurements applicable to fonts must be proportional to the type size.
+.
+.I groff
+achieves this using the precedent set by AT&T device-independent
+.IR troff : \" AT&T
+one font size is chosen as a norm,
+and all others are scaled linearly relative to that basis.
+.
+The \[lq]unit width\[rq] is the number of basic units per point when the
+font is rendered at this nominal size.
+.
+.
+.P
+For instance,
+.IR groff 's
+.B lbp
+device uses a
+.B unitwidth
+of\~800.
+.
+Its Times roman font
+.RB (\[lq] TR \[rq])
+has a
+.B spacewidth
+of\~833;
+this is also the width of its comma,
+period,
+centered period,
+and mathematical asterisk,
+while its \[lq]M\[rq] is 2,963 basic units.
+.
+Thus,
+an \[lq]M\[rq] on the
+.B lbp
+device is 2,963 basic units wide at a notional type size of 800\~points.
+.
+(800-point type is not practical for most purposes,
+but using it enables the quantities in the font description files to be
+expressed as integers.)
+.
+.
+.P
+A font description file has two sections.
+.
+The first is a sequence of directives,
+and is parsed similarly to the
+.I DESC
+file described above.
+.
+Except for the directive names that begin the second section,
+their ordering is immaterial.
+.
+Later directives of the same name override earlier ones,
+spaces and tabs are handled in the same way,
+and the same comment syntax is supported.
+.
+Empty lines are ignored throughout.
+.
+.
+.TP
+.BI name\~ F
+The name of the font
+.RI is\~ F .
+.
+.RB \[lq] DESC \[rq]
+is an invalid font name.
+.
+Simple integers are valid,
+but their use is discouraged.
+.
+.RI ( groff
+requests and escape sequences interpret non-negative font names as
+mounting positions instead.
+.
+Further,
+a font named
+.RB \[lq] 0 \[rq]
+cannot be automatically mounted by the
+.B fonts
+directive of a
+.I DESC
+file.)
+.
+.
+.TP
+.BI spacewidth\~ n
+The width of an unadjusted inter-word space is
+.IR n \~basic
+units.
+.
+.
+.P
+The directives above must appear in the first section;
+those below are optional.
+.
+.
+.TP
+.BI slant\~ n
+The font's glyphs have a slant of
+.IR n \~degrees;
+a positive
+.I n
+slants in the direction of text flow.
+.
+.
+.TP
+.BI ligatures\~ lig1\~\c
+.RI .\|.\|.\&\~ lign\~\c
+.RB [ 0 ]
+Glyphs
+.IR lig1 ,
+\&.\|.\|.,
+.I lign
+are ligatures;
+possible ligatures are
+.BR ff ,
+.BR fi ,
+.BR fl ,
+.BR ffi ,
+and
+.BR ffl .
+.
+For compatibility with other
+.I troff
+implementations,
+the list of ligatures may be terminated with
+.RB a\~ 0 .
+.
+The list of ligatures must not extend over more than one line.
+.
+.
+.TP
+.B special
+The font is
+.IR special :
+when a glyph is requested that is not present in the current font,
+it is sought in any mounted fonts that bear this property.
+.
+.
+.P
+Other directives in this section are ignored by
+.IR @g@troff ,
+but may be used by postprocessors to obtain further information about
+the font.
+.
+.
+.P
+The second section contains one or two subsections.
+.
+These can appear in either order;
+the first one encountered commences the second section.
+.
+Each starts with a directive on a line by itself.
+.
+A
+.B charset
+subsection is mandatory unless the associated
+.I DESC
+file contains the
+.B unicode
+directive.
+.
+Another subsection,
+.BR \%kernpairs ,
+is optional.
+.
+.
+.P
+The directive
+.B charset
+starts the character set subsection.
+.
+(For typesetter devices,
+this directive is misnamed since it starts a list of glyphs,
+not characters.)
+.
+It precedes a series of glyph descriptions,
+one per line.
+.
+Each such glyph description comprises a set of fields separated by
+spaces or tabs and organized as follows.
+.
+.
+.IP
+.I name metrics type code
+.RI [ entity-name ]
+.RB [ \-\-
+.IR comment ]
+.
+.
+.P
+.I name
+identifies the glyph:
+if
+.I name
+is a printable
+.RI character\~ c ,
+it corresponds to the
+.I troff \" generic
+ordinary
+.RI character\~ c .
+.
+If
+.I name
+is a multi-character sequence not beginning with
+.BR \[rs] ,
+it corresponds to the GNU
+.I troff \" GNU
+special character escape sequence
+\[lq]\c
+.BI \[rs][ name ]\c
+\[rq].
+.
+A name consisting of three minus signs,
+.RB \[lq] \-\-\- \[rq],
+indicates that the glyph is unnamed:
+such glyphs can be accessed only by the
+.B \[rs]N
+escape sequence in
+.IR troff . \" generic; \N is portable
+.
+A special character named
+.RB \[lq] \-\-\- \[rq]
+can still be defined using
+.B .char
+and similar requests.
+.
+The
+.I name
+.RB \[lq] \[rs]\- \[rq]
+defines the minus sign glyph.
+.
+.\" TODO: Withdraw support for this. No one seems to use it.
+Finally,
+.I name
+can be the horizontal motion escape sequences,
+.B \[rs]|
+and
+.B \[rs]\[ha]
+(\[lq]thin\[rq] and \[lq]hair\[rq] spaces,
+respectively),
+in which case only the width metric described below is applied;
+a font can thus customize the widths of these spaces.
+.\" XXX: For exhaustivity purposes...you can define "\whatever", which
+.\" has to be accessed with \C'\\whatever' or \[\\whatever], but the
+.\" parser matches predefined escape sequences before looking up special
+.\" characters. Most such definitions are inaccessible from the
+.\" language, because nearly every '\x', where 'x' is a Unicode basic
+.\" Latin character, is a predefined groff escape sequence.
+.
+.
+.br
+.ne 4v \" Keep next paragraph together with (possibly 2-line) synopsis.
+.P
+The form of the
+.I metrics
+field is as follows
+(on one line;
+it may be broken here for readability).
+.
+.
+.IP
+.\" XXX: Turning off adjustment is ugly; thanks to meter-long specimens
+.\" like this, we need an escape sequence that selectively disables
+.\" adjustment at the end of a word.
+.na
+.I width\/\c
+.RI [\fB,\fP[ \:height\/\c
+.RI [\fB,\fP[ \:depth\/\c
+.RI [\fB,\fP[ \:\%italic-correction\/\c
+.RI [\fB,\fP[ \:\%left-italic-correction\/\c
+.RI [\fB,\fP[ \:\%subscript-correction ]]]]]]]]]]
+.ad \*[AD]
+.
+.
+.P
+There must not be any spaces,
+tabs,
+or newlines between these
+.I subfields,
+.
+which are in basic units expressed as decimal integers.
+.
+Unspecified subfields default
+.RB to\~ 0 .
+.
+Since there is no associated binary format,
+these values are not required to fit into the C language data type
+.B char
+as they are in AT&T device-independent
+.IR troff . \" AT&T
+.
+.
+.P
+The
+.I width
+subfield gives the width of the glyph.
+.
+The
+.I height
+subfield gives the height of the glyph
+(upwards is positive);
+if a glyph does not extend above the baseline,
+it should be given a zero height,
+rather than a negative height.
+.
+The
+.I depth
+subfield gives the depth of the glyph,
+that is,
+the distance below the baseline to which the glyph extends
+(downwards is positive);
+if a glyph does not extend below the baseline,
+it should be given a zero depth,
+rather than a negative depth.
+.
+Italic corrections are relevant to glyphs in italic or oblique styles.
+.
+The
+.I italic-correction
+is the amount of space that should be added after an oblique glyph to be
+followed immediately by an upright glyph.
+.
+The
+.I left-italic-correction
+is the amount of space that should be added before an oblique glyph to
+be preceded immediately by an upright glyph.
+.
+The
+.I
+subscript-correction
+is the amount of space that should be added after an oblique glyph to be
+followed by a subscript;
+it should be less than the italic correction.
+.
+.
+.P
+For fonts used with typesetting devices,
+the
+.I type
+field gives a featural description of the glyph:
+it is a bit mask recording whether the glyph is an ascender,
+descender,
+both,
+or neither.
+.
+When a
+.B \[rs]w
+escape sequence is interpolated,
+these values are bitwise or-ed together
+for each glyph
+and stored in the
+.B ct
+register.
+.
+In font descriptions for terminal devices,
+all glyphs might have a type of zero,
+regardless of their appearance.
+.
+.
+.TP
+0
+means the glyph lies entirely between the baseline and
+a horizontal line at the \[lq]x-height\[rq] of the font,
+as with \[lq]a\[rq],
+\[lq]c\[rq],
+and
+\[lq]x\[rq];
+.
+.
+.TP
+1
+means the glyph descends below the baseline,
+like \[lq]p\[rq];
+.
+.
+.TP
+2
+means the glyph ascends above the font's x-height,
+like \[lq]A\[rq] or
+\[lq]b\[rq]);
+and
+.
+.
+.TP
+3
+means the glyph is both an ascender and a descender\[em]this is true of
+parentheses in some fonts.
+.
+.
+.P
+The
+.I code
+field gives a numeric identifier that the postprocessor uses to render
+the glyph.
+.
+The glyph can be specified to
+.I troff \" generic
+using this code by means of the
+.B \[rs]N
+escape sequence.
+.
+The code can be any integer
+(that is,
+any integer parsable by the C standard library's
+.MR strtol 3
+function).
+.
+.
+.P
+The
+.I entity-name
+field defines an identifier for the glyph that the postprocessor
+uses to print the
+.I @g@troff
+glyph
+.IR name .
+.
+This field is optional;
+it was introduced so that the
+.I \%grohtml
+output driver could encode its character set.
+.
+For example,
+the glyph
+.B \[rs][Po]
+is represented by
+.RB \[lq] &pound; \[rq]
+in HTML 4.0.
+.
+For efficiency,
+these data are now compiled directly into
+.IR \%grohtml .
+.
+.I grops
+uses the field to build sub-encoding arrays for PostScript fonts
+containing more than 256 glyphs.
+.
+Anything on the line after the
+.I entity-name
+field or
+.RB \[lq] \-\- \[rq]
+is ignored.
+.
+.
+.P
+A line in the
+.B charset
+section can also have the form
+.
+.RS
+.IB name\~ \[dq]
+.RE
+.
+identifying
+.I name
+as another name for the glyph mentioned in the preceding line.
+.
+Such aliases can be chained.
+.
+.
+.P
+The directive
+.B \%kernpairs
+starts a list of kerning adjustments to be made to adjacent glyph pairs
+from this font.
+.
+It contains a sequence of lines formatted as follows.
+.
+.RS
+.I g1 g2 n
+.RE
+.
+The foregoing means that when glyph
+.I g1
+is typeset immediately before
+.IR g2 ,
+the space between them should be increased
+.RI by\~ n .
+.
+Most kerning pairs should have a negative value
+.RI for\~ n .
+.\" END Keep parallel with groff.texi node "Device and Font Files".
+.
+.
+.br
+.ne 4v
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.IR @FONTDIR@/\:\%dev name /\:DESC
+describes the output device
+.IR name .
+.
+.
+.TP
+.IR @FONTDIR@/\:\%dev name / F
+describes the font known
+.RI as\~ F
+on device
+.IR name .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is the primary
+.I groff
+manual.
+.
+You can browse it interactively with \[lq]info groff\[rq].
+.
+.
+.P
+\[lq]Troff User's Manual\[rq]
+by Joseph F.\& Ossanna,
+1976
+(revised by Brian W.\& Kernighan,
+1992),
+AT&T Bell Laboratories Computing Science Technical Report No.\& 54,
+widely called simply \[lq]CSTR\~#54\[rq],
+documents the language,
+device and font description file formats,
+and device-independent output format
+referred to collectively in
+.I groff
+documentation as
+.RI \[lq]AT&T\~ troff \[rq].
+.
+.
+.P
+\[lq]A Typesetter-independent TROFF\[rq]
+by Brian W.\& Kernighan,
+1982,
+AT&T Bell Laboratories Computing Science Technical Report No.\& 97,
+provides additional insights into the
+device and font description file formats
+and device-independent output format.
+.
+.
+.P
+.MR groff @MAN1EXT@ ,
+subsection \[lq]Utilities\[rq],
+lists programs available for describing fonts in a variety of formats
+such that
+.I groff
+output drivers can use them.
+.
+.
+.P
+.MR @g@troff @MAN1EXT@
+documents the default device and font description file search path.
+.
+.
+.P
+.MR groff_out @MAN5EXT@ ,
+.MR addftinfo @MAN1EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_font_5_man_C]
+.do rr *groff_groff_font_5_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/man/groff_out.5.man b/man/groff_out.5.man
new file mode 100644
index 0000000..9c1534e
--- /dev/null
+++ b/man/groff_out.5.man
@@ -0,0 +1,1963 @@
+.TH groff_out @MAN5EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+groff_out \- GNU
+.I roff
+intermediate output format
+.
+.
+.\" XXX: This page needs review and editing.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2023 Free Software Foundation, Inc.
+.\"
+.\" This file is part of groff, the GNU roff type-setting system.
+.\"
+.\" Permission is granted to copy, distribute and/or modify this
+.\" document under the terms of the GNU Free Documentation License,
+.\" Version 1.3 or any later version published by the Free Software
+.\" Foundation; with no Invariant Sections, 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_out_5_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.\" Setup
+.\" ====================================================================
+.
+.\" ================= Document configuration
+.
+.\" Number register to decide whether the commands '{' and '}' are used
+.\" 0: disable (current default); 1: enable
+.nr @USE_ENV_STACK 0
+.
+.ig
+Unfortunately, old versions of groff used an illogical position change
+after some D\~commands (Dp, DP, Dt). If the register
+@STUPID_DRAWING_POSITIONING is 1 (current default) then change position
+after these commands, otherwise the position is not changed.
+..
+.nr @STUPID_DRAWING_POSITIONING 1
+.
+.\" ================= Semantical definitions
+.
+.nr @maxcolor 65536
+.ds @backslash \[rs]\"
+.ds @linebreak \fR\[la]line-break\[ra]\fP\"
+.
+.\" Begin of macro definitions
+.
+.de offset
+.RI ( \,\\$1\/ ,\ \,\\$2\/ )\\$3
+..
+.de indexed_offset
+.offset \fI\\$1\/\fP\d\s-3\\$2\s+3\u\x'\n[.v]/4' \fI\\$3\/\fP\
+\d\s-3\\$4\s+3\u\x'\n[.v]/4' \\$5\x'\n[.v]/4'
+..
+.\" format: .command <name> "<arguments>" <punctuation>
+.de command
+\fB\\$1\fP\ \fI\,\\$2\/\fP\\$3
+..
+.\" format: .D-command <subcommand> "<arguments>"
+.de D-command
+\fBD\\$1\fP\ \fI\,\\$2\/\fP\|\*[@linebreak]
+..
+.
+.\" We set these as troff micromotions rather than eqn because \d and \u
+.\" can be lifted to XML subscript/superscript tags. Don't change
+.\" these to a parameterized string, man2html won't handle that.
+.ds hv1 \fIh\d\s-3\&1\s+3\u\~v\d\s-3\&1\s+3\u\fP\x'\n[.v]/4'
+.ds hv2 \fIh\d\s-3\&2\s+3\u\~v\d\s-3\&2\s+3\u\fP\x'\n[.v]/4'
+.ds hvn \fIh\d\s-3\&n\s+3\u\~v\d\s-3\&n\s+3\u\fP\x'\n[.v]/4'
+.
+.de Da-command
+\fBDa\fP\ \*[hv1] \*[hv2]\|\*[@linebreak]
+..
+.\" graphics command .D with a variable number of arguments
+.\" format: .D-multiarg <subcommand>
+.de D-multiarg
+\fBD\\$1\fP\ \*[hv1] \*[hv2] \&.\|.\|.\& \*[hvn]\|\*[@linebreak]
+..
+.\" format: .x-command <subname> "<arguments>"
+.de x-command
+\fBx\\$1\fP\ \fI\\$2\fP\|\*[@linebreak]
+..
+.de xsub
+.RI "(" "\\$1" " control command)"
+.br
+..
+.\" End of macro definitions
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The fundamental operation of the
+.MR @g@troff @MAN1EXT@
+formatter is the translation of the
+.MR groff @MAN7EXT@
+input language into a series of instructions concerned primarily with
+placing glyphs or geometric objects at specific positions on a
+rectangular page.
+.
+In the following discussion,
+the term
+.I command
+refers to this intermediate output language,
+never to the
+.MR groff @MAN7EXT@
+language intended for use by document authors.
+.
+Intermediate output commands comprise several categories:
+glyph output;
+font,
+color,
+and text size selection;
+motion of the printing position;
+page advancement;
+drawing of geometric primitives;
+and device control commands,
+a catch-all for other operations.
+.
+The last includes directives to start and stop output,
+identify the intended output device,
+and embed URL hyperlinks in supported output formats.
+.
+.
+.P
+Because the front-end command
+.MR groff @MAN1EXT@
+is a wrapper that normally runs the
+.I @g@troff
+formatter to generate intermediate output
+and an output driver (\[lq]postprocessor\[rq]) to consume it,
+users normally do not encounter this language.
+.
+The
+.I groff
+program's
+.B \-Z
+option inhibits postprocessing such that this intermediate output is
+sent to the standard output stream as when
+.I @g@troff
+is run manually.
+.
+.
+.P
+.IR groff 's
+intermediate output facilitates the development of output drivers and
+other postprocessors by offering a common programming interface.
+.
+It is an extension of the page description language developed by Brian
+Kernighan for AT&T device-independent
+.I troff \" AT&T
+circa 1980.
+.
+Where a distinction is necessary,
+we will say
+.RI \[lq] @g@troff
+output\[rq] to describe the output of GNU
+.IR troff , \" GNU
+and \[lq]intermediate output\[rq] to denote the language accepted by
+the parser implemented in
+.IR groff 's
+internal C++ library used by most of its output drivers.
+.\" XXX GBR leaves off here.
+.
+.
+.\" ====================================================================
+.SH "Language concepts"
+.\" ====================================================================
+.
+During the run of
+.IR @g@troff ,
+the
+.I roff
+input is cracked down to the information on what has to be printed at
+what position on the intended device.
+.
+So the language of the
+.I intermediate output
+format can be quite small.
+.
+Its only elements are commands with or without arguments.
+.
+In this document, the term \[lq]command\[rq] always refers to the
+.I intermediate output
+language, never to the
+.I roff
+language used for document formatting.
+.
+There are commands for positioning and text writing, for drawing, and
+for device controlling.
+.
+.
+.\" ====================================================================
+.SS Separation
+.\" ====================================================================
+.
+.I Classical troff output
+had strange requirements on whitespace.
+.
+The
+.I groff
+output parser, however, is smart about whitespace by making it
+maximally optional.
+.
+The whitespace characters, i.e., the
+.IR tab ,
+.IR space ,
+and
+.I newline
+characters, always have a syntactical meaning.
+.
+They are never printable because spacing within the output is always
+done by positioning commands.
+.
+.
+.P
+Any sequence of
+.I space
+or
+.I tab
+characters is treated as a single
+.I syntactical
+.IR space .
+.
+It separates commands and arguments, but is only required when there
+would occur a clashing between the command code and the arguments
+without the space.
+.
+Most often, this happens when variable length command names,
+arguments, argument lists, or command clusters meet.
+.
+Commands and arguments with a known, fixed length need not be
+separated by
+.I syntactical
+.IR space .
+.
+.
+.P
+A line break is a syntactical element, too.
+.
+Every command argument can be followed by whitespace, a comment, or a
+newline character.
+.
+Thus a
+.I syntactical line break
+is defined to consist of optional
+.I syntactical space
+that is optionally followed by a comment, and a newline character.
+.
+.
+.P
+The normal commands, those for positioning and text, consist of a
+single letter taking a fixed number of arguments.
+.
+For historical reasons, the parser allows stacking of such commands on
+the same line, but fortunately, in
+.I groff intermediate
+.IR output ,
+every command with at least one argument is followed by a line break,
+thus providing excellent readability.
+.
+.P
+The other commands \[em] those for drawing and device controlling \[em]
+have a more complicated structure; some recognize long command names,
+and some take a variable number of arguments.
+.
+So all
+.B D
+and
+.B x
+commands were designed to request a
+.I syntactical line break
+after their last argument.
+.
+Only one command,
+.RB \[oq] x\ X \[cq]
+has an argument that can stretch over several lines, all other
+commands must have all of their arguments on the same line as the
+command, i.e., the arguments may not be split by a line break.
+.
+.P
+Lines containing only spaces and/or a comment are treated as empty and
+ignored.
+.
+.
+.\" ====================================================================
+.SS "Argument units"
+.\" ====================================================================
+.
+Some commands accept integer arguments that represent measurements,
+but the scaling units of the formatter's language are never used.
+.
+Most commands assume a scaling unit
+.RB of\~\[lq] u \[rq]
+(basic units),
+and others
+.RB use\~\[lq] z \[rq]
+(scaled points);
+.
+These are defined by the parameters specified in the device's
+.I DESC
+file;
+see
+.MR groff_font @MAN5EXT@
+and,
+for more on scaling units,
+.MR groff @MAN7EXT@
+and
+.IR "Groff: The GNU Implementation of troff" ,
+the
+.I groff
+Texinfo manual.
+.
+Color-related commands use dimensionless integers.
+.
+.
+.P
+Note that single characters can have the eighth bit set, as can the
+names of fonts and special characters (this is, glyphs).
+.
+The names of glyphs and fonts can be of arbitrary length.
+.
+A glyph that is to be printed will always be in the current font.
+.
+.
+.P
+A string argument is always terminated by the next whitespace
+character (space, tab, or newline); an embedded
+.B #
+character is regarded as part of the argument, not as the beginning of
+a comment command.
+.
+An integer argument is already terminated by the next non-digit
+character, which then is regarded as the first character of the next
+argument or command.
+.
+.
+.\" ====================================================================
+.SS "Document parts"
+.\" ====================================================================
+.
+A correct
+.I intermediate output
+document consists of two parts, the
+.I prologue
+and the
+.IR body .
+.
+.P
+The task of the
+.I prologue
+is to set the general device parameters using three exactly specified
+commands.
+.
+The
+.I groff prologue
+is guaranteed to consist of the following three lines (in that order):
+.RS
+.P
+.B x\ T
+.I device
+.br
+.B x\ res
+.I n\ h\ v
+.br
+.B x init
+.RE
+.P
+with the arguments set as outlined in subsection \[lq]Device Control
+Commands\[rq] below.
+.
+However, the parser for the
+.I intermediate output
+format is able to swallow additional whitespace and comments as well.
+.
+.
+.P
+The
+.I body
+is the main section for processing the document data.
+.
+Syntactically, it is a sequence of any commands different from the
+ones used in the
+.IR prologue .
+.
+Processing is terminated as soon as the first
+.B x\ stop
+command is encountered; the last line of any
+.I groff intermediate output
+always contains such a command.
+.
+.
+.P
+Semantically, the
+.I body
+is page oriented.
+.
+A new page is started by a
+.BR p \~command.
+.
+Positioning, writing, and drawing commands are always done within the
+current page, so they cannot occur before the first
+.BR p \~command.
+.
+Absolute positioning (by the
+.B H
+and
+.BR V \~commands)
+is done relative to the current page, all other positioning
+is done relative to the current location within this page.
+.
+.
+.\" ====================================================================
+.SH "Command reference"
+.\" ====================================================================
+.
+This section describes all
+.I intermediate output
+commands, the classical commands as well as the
+.I groff
+extensions.
+.
+.
+.\" ====================================================================
+.SS "Comment command"
+.\" ====================================================================
+.
+.TP
+.BI # anything\c
+\[la]line-break\[ra]
+A comment.
+.
+Ignore any characters from the
+.BR # \~character
+up to the next newline.
+.
+Each comment can be preceded by arbitrary
+.I syntactical
+.IR space ;
+every command can be terminated by a comment.
+.
+.
+.\" ====================================================================
+.SS "Simple commands"
+.\" ====================================================================
+.
+The commands in this subsection have a command code consisting of a
+single character, taking a fixed number of arguments.
+.
+Most of them are commands for positioning and text writing.
+.
+These commands are smart about whitespace.
+.
+Optionally,
+.I syntactical space
+can be inserted before, after, and between the command letter and its
+arguments.
+.
+All of these commands are stackable, i.e., they can be preceded by
+other simple commands or followed by arbitrary other commands on the
+same line.
+.
+A separating
+.I syntactical space
+is necessary only when two integer arguments would clash or if the
+preceding argument ends with a string argument.
+.
+.
+.if \n[@USE_ENV_STACK]=1 \{\
+.TP
+.command {
+Open a new environment by copying the current device configuration data
+to the environment stack.
+.
+The current environment is setup by the device specification and
+manipulated by the setting commands.
+.
+.
+.TP
+.command }
+Close the current environment
+(opened by a preceding
+.BR { \~command)
+and restore the previous environment from the environment
+stack as the current device configuration data.
+.
+.\} \" endif @USE_ENV_STACK
+.
+.
+.TP
+.command C id \[la]white-space\[ra]
+Typeset the glyph of the special character
+.IR id .
+.
+Trailing syntactical space is necessary to allow special character names
+of arbitrary length.
+.
+The drawing position is not advanced.
+.\" XXX: Why does it matter that we read its size if we don't advance
+.\" the drawing position?
+.\" its size is read from the font description file.
+.
+.
+.TP
+.command c c
+Typeset the glyph of the ordinary character
+.RI character\~ c .
+.
+The drawing position is not advanced.
+.\" XXX: Why does it matter that we read its size if we don't advance
+.\" the drawing position?
+.\" its size is read from the font description file.
+.
+.
+.TP
+.command f n
+Select the font mounted at
+.RI position\~ n .
+.
+.IR n\~ cannot
+be negative.
+.
+.
+.TP
+.command H n
+Horizontally move the drawing position to
+.IR n\~ basic
+units from the left edge of the page.
+.
+.IR n\~ cannot
+be negative.
+.
+.
+.TP
+.command h n
+Move the drawing position right
+.I n
+basic units.
+.
+AT&T
+.I troff \" AT&T
+allowed negative
+.I n;
+GNU
+.I troff \" GNU
+does not produce such values,
+but
+.IR groff 's
+output driver library handles them.
+.
+.
+.TP
+.command m "scheme \f[R][\f[]component\f[R] .\|.\|.]"
+Select the stroke color using the
+.IR component s
+in the color space
+.IR scheme .
+.
+Each
+.I component
+is an integer between 0 and \n[@maxcolor].
+.
+The quantity of components and their meanings vary with each
+.IR scheme .
+.
+This command is a
+.I groff
+extension.
+.
+.
+.RS
+.TP
+.command mc "cyan magenta yellow"
+Use the CMY color scheme with components
+cyan,
+magenta,
+and yellow.
+.
+.
+.TP
+.command md
+Use the default color
+(no components;
+black in most cases).
+.
+.
+.TP
+.command mg gray
+Use a grayscale color scheme with a component ranging
+between 0 (black) and \n[@maxcolor] (white).
+.
+.
+.TP
+.command mk "cyan magenta yellow black"
+Use the CMYK color scheme with components
+cyan,
+magenta,
+yellow,
+and black.
+.
+.
+.TP
+.command mr "red green blue"
+Use the RGB color scheme with components
+red,
+green,
+and blue.
+.RE
+.
+.
+.TP
+.command N n
+Typeset the glyph with
+.RI index\~ n
+in the current font.
+.
+.IR n\~ is
+normally a non-negative integer.
+.
+The drawing position is not advanced.
+.
+The
+.B html
+and
+.B xhtml
+devices use this command with
+.RI negative\~ n
+to produce unbreakable space;
+the absolute value of
+.I n
+is taken and interpreted in basic units.
+.
+.
+.TP
+.command n b\~a
+Indicate a break.
+.
+No action is performed;
+the command is present to make the output more easily parsed.
+.
+The integers
+.I b
+.RI and\~ a
+describe the vertical space amounts before and after the break,
+respectively.
+.
+GNU
+.I troff \" GNU
+issues this command but
+.IR groff 's
+output driver library ignores it.
+.
+See
+.B v
+and
+.BR V .
+.
+.
+.TP
+.command p n
+Begin a new page,
+setting its number
+.RI to\~ n .
+.
+Each page is independent,
+even from those using the same number.
+.
+The vertical drawing position is set to\~0.
+.
+All positioning,
+writing,
+and drawing commands are interpreted in the context of a page,
+so a
+.BR p \~command
+must precede them.
+.
+.
+.TP
+.command s n
+Set type size to
+.I n
+scaled points
+.RB (unit\~ z
+in GNU
+.IR troff ). \" GNU
+.
+AT&T
+.I troff \" AT&T
+used unscaled points
+.RB ( p )
+instead;
+see section \[lq]Compatibility\[rq] below.
+.
+.
+.TP
+.command t xyz\f[R]\|.\|.\|.\& \f[R]\[la]white-space\[ra]
+.TQ
+.command t "xyz\f[R]\|.\|.\|.\&\f[] dummy-arg" \[la]white-space\[ra]
+Typeset word
+.IR xyz ;
+that is,
+set a sequence of ordinary glyphs named
+.IR x ,
+.IR y ,
+.IR z ,
+\&.\|.\|.\|,
+terminated by a space or newline;
+an optional second integer argument is ignored
+(this allows the formatter to generate an even number of arguments).
+.\" XXX: Why?
+.
+Each glyph is set at the current drawing position,
+and the position is then advanced horizontally by the glyph's width.
+.
+A glyph's width is read from its metrics in the font description file,
+scaled to the current type size,
+and rounded to a multiple of the horizontal motion quantum.
+.
+Use the
+.B C
+command to emplace glyphs of special characters.
+.
+The
+.BR t \~command
+is a
+.I groff
+extension and is output only for devices whose
+.I DESC
+file contains the
+.B tcommand
+directive;
+see
+.MR groff_font @MAN5EXT@ .
+.
+.
+.TP
+.command u "n xyz"\f[R]\|.\|.\|.\& \f[R]\[la]white-space\[ra]
+.TQ
+.command u "xyz\f[R]\|.\|.\|.\&\f[] dummy-arg" \[la]white-space\[ra]
+Typeset word
+.I xyz
+with track kerning.
+.
+As
+.BR t ,
+but after placing each glyph,
+the drawing position is further advanced horizontally
+.RI by\~ n
+basic units.
+.
+The
+.BR u \~command
+is a
+.I groff
+extension and is output only for devices whose
+.I DESC
+file contains the
+.B tcommand
+directive;
+see
+.MR groff_font @MAN5EXT@ .
+.
+.
+.TP
+.command V n
+Vertically move the drawing position to
+.IR n\~ basic
+units from the top edge of the page.
+.
+.IR n\~ cannot
+be negative.
+.
+.
+.TP
+.command v n
+Move the drawing position down
+.I n
+basic units.
+.
+AT&T
+.I troff \" AT&T
+allowed negative
+.I n;
+GNU
+.I troff \" GNU
+does not produce such values,
+but
+.IR groff 's
+output driver library handles them.
+.
+.
+.TP
+.command w
+Indicate an inter-word space.
+.
+No action is performed;
+the command is present to make the output more easily parsed.
+.
+Only adjustable,
+breakable inter-word spaces are thus described;
+those resulting from
+.B \[rs]\[ti]
+or horizontal motion escape sequences are not.
+.
+GNU
+.I troff \" GNU
+issues this command but
+.IR groff 's
+output driver library ignores it.
+.
+See
+.B h
+and
+.BR H .
+.
+.
+.\" ====================================================================
+.SS "Graphics commands"
+.\" ====================================================================
+.
+Each graphics or drawing command in the
+.I intermediate output
+starts with the letter\~\c
+.B D
+followed by one or two characters that specify a subcommand; this
+is followed by a fixed or variable number of integer arguments that
+are separated by a single space character.
+.
+A
+.BR D \~command
+may not be followed by another command on the same line (apart from a
+comment), so each
+.BR D \~command
+is terminated by a
+.I syntactical line
+.IR break .
+.
+.
+.P
+.I @g@troff
+output follows the classical spacing rules (no space between command
+and subcommand, all arguments are preceded by a single space
+character), but the parser allows optional space between the command
+letters and makes the space before the first argument optional.
+.
+As usual, each space can be any sequence of tab and space characters.
+.
+.
+.P
+Some graphics commands can take a variable number of arguments.
+.
+In this case, they are integers representing a size measured in basic
+units\~\c
+.BR u .
+.
+The
+.I h
+arguments
+stand for horizontal distances where positive means right, negative
+left.
+.
+The
+.I v
+arguments
+stand for vertical distances where positive means down, negative up.
+.
+All these distances are offsets relative to the current location.
+.
+.
+.P
+Unless indicated otherwise, each graphics command directly corresponds
+to a similar
+.I groff
+.B \*[@backslash]D
+escape sequence; see
+.MR groff @MAN7EXT@ .
+.
+.
+.P
+Unknown
+.BR D \~commands
+are assumed to be device-specific.
+.
+Its arguments are parsed as strings; the whole information is then
+sent to the postprocessor.
+.
+.
+.P
+In the following command reference, the syntax element
+.I \[la]line-break\[ra]
+means a
+.I syntactical line break
+as defined in subsection \[lq]Separation\[rq] above.
+.
+.
+.TP
+.D-multiarg \[ti]
+Draw B-spline from current position to offset
+.indexed_offset h 1 v 1 ,
+then to offset
+.indexed_offset h 2 v 2
+if given, etc., up to
+.indexed_offset h n v n .
+This command takes a variable number of argument pairs; the current
+position is moved to the terminal point of the drawn curve.
+.
+.
+.TP
+.Da-command
+Draw arc from current position to
+.indexed_offset h 1 v 1 \|+\|\c
+.indexed_offset h 2 v 2
+with center at
+.indexed_offset h 1 v 1 ;
+then move the current position to the final point of the arc.
+.
+.
+.TP
+.D-command C d
+.TQ
+.D-command C "d dummy-arg"
+Draw a solid circle using the current fill color with diameter\~\c
+.I d
+(integer in basic units\~\c
+.BR u )
+with leftmost point at the current position; then move the current
+position to the rightmost point of the circle.
+.
+An optional second integer argument is ignored (this allows the
+formatter to generate an even number of arguments).
+.
+This command is a
+.I groff
+extension.
+.
+.
+.TP
+.D-command c d
+Draw circle line with diameter\~\c
+.I d
+(integer in basic units\~\c
+.BR u )
+with leftmost point at the current position; then move the current
+position to the rightmost point of the circle.
+.
+.
+.TP
+.D-command E "h v"
+Draw a solid ellipse in the current fill color with a horizontal
+diameter of\~\c
+.I h
+and a vertical diameter of\~\c
+.I v
+(both integers in basic units\~\c
+.BR u )
+with the leftmost point at the current position; then move to the
+rightmost point of the ellipse.
+.
+This command is a
+.I groff
+extension.
+.
+.
+.TP
+.D-command e "h v"
+Draw an outlined ellipse with a horizontal diameter of\~\c
+.I h
+and a vertical diameter of\~\c
+.I v
+(both integers in basic units\~\c
+.BR u )
+with the leftmost point at current position; then move to the
+rightmost point of the ellipse.
+.
+.
+.TP
+.D-command F "color-scheme \fR[\fPcomponent\fR .\|.\|.]\fP"
+Set fill color for solid drawing objects using different color
+schemes; the analogous command for setting the color of text, line
+graphics, and the outline of graphic objects is
+.BR m .
+.
+The color components are specified as integer arguments between 0 and
+\n[@maxcolor].
+.
+The number of color components and their meaning vary for the
+different color schemes.
+.
+These commands are generated by the
+.I groff
+escape sequences
+.BR \*[@backslash]D\[aq]F\ .\|.\|. '
+and
+.B \*[@backslash]M
+(with no other corresponding graphics commands).
+.
+This command is a
+.I groff
+extension.
+.
+.
+.RS
+.
+.TP
+.D-command Fc "cyan magenta yellow"
+Set fill color for solid drawing objects using the CMY color scheme,
+having the 3\~color components cyan, magenta, and yellow.
+.
+.
+.TP
+.D-command Fd
+Set fill color for solid drawing objects to the default fill color value
+(black in most cases).
+.
+No component arguments.
+.
+.
+.TP
+.D-command Fg "gray"
+Set fill color for solid drawing objects to the shade of gray given by
+the argument, an integer between 0 (black) and \n[@maxcolor] (white).
+.
+.
+.TP
+.D-command Fk "cyan magenta yellow black"
+Set fill color for solid drawing objects using the CMYK color scheme,
+having the 4\~color components cyan, magenta, yellow, and black.
+.
+.TP
+.D-command Fr "red green blue"
+Set fill color for solid drawing objects using the RGB color scheme,
+having the 3\~color components red, green, and blue.
+.
+.RE
+.
+.
+.TP
+.D-command f n
+The argument
+.I n
+must be an integer in the range \-32767 to 32767.
+.
+.RS
+.TP
+.RI 0\|\[<=]\| n \|\[<=]\|1000
+Set the color for filling solid drawing objects to a shade of gray,
+where 0 corresponds to solid white, 1000 (the default) to solid black,
+and values in between to intermediate shades of gray; this is
+obsoleted by command
+.BR DFg .
+.
+.TP
+.IR n "\|<\|0 or " n \|>\|1000
+Set the filling color to the color that is currently being used for
+the text and the outline, see command
+.BR m .
+For example, the command sequence
+.
+.RS
+.IP
+.EX
+mg 0 0 \n[@maxcolor]
+Df \-1
+.EE
+.RE
+.
+.IP
+sets all colors to blue.
+.
+.P
+This command is a
+.I groff
+extension.
+.
+.RE
+.
+.
+.TP
+.D-command l "h v"
+Draw line from current position to offset
+.offset h v
+(integers in basic units\~\c
+.BR u );
+then set current position to the end of the drawn line.
+.
+.
+.TP
+.D-multiarg p
+Draw a polygon line from current position to offset
+.indexed_offset h 1 v 1 ,
+from there to offset
+.indexed_offset h 2 v 2 ,
+etc., up to offset
+.indexed_offset h n v n ,
+and from there back to the starting position.
+.
+.ie \n[@STUPID_DRAWING_POSITIONING]=1 \{\
+For historical reasons, the position is changed by adding the sum of
+all arguments with odd index to the current horizontal position and the
+even ones to the vertical position.
+.
+Although this doesn't make sense it is kept for compatibility.
+.
+.\}
+.el \{\
+As the polygon is closed, the end of drawing is the starting point, so
+the position doesn't change.
+.\}
+.
+This command is a
+.I groff
+extension.
+.
+.
+.TP
+.D-multiarg P
+The same macro as the corresponding
+.B Dp
+command with the same arguments, but draws a solid polygon in the
+current fill color rather than an outlined polygon.
+.
+.if \n[@STUPID_DRAWING_POSITIONING]=1 \{\
+The position is changed in the same way as with
+.BR Dp .
+.\}
+.
+This command is a
+.I groff
+extension.
+.
+.
+.TP
+.D-command t n
+Set the current line thickness
+.RI to\~ n
+(an integer in basic
+.RB units\~ u )
+if
+.IR n \|>\|0;
+if
+.IR n \|=\|0
+select the smallest available line thickness;
+otherwise,
+the line thickness is made proportional to the type size,
+which is the default.
+.
+.if \n[@STUPID_DRAWING_POSITIONING]=1 \{\
+For historical reasons,
+the horizontal position is changed by adding the argument to the current
+horizontal position,
+while the vertical position is not changed.
+.
+Although this doesn't make sense,
+it is kept for compatibility.
+.\}
+.
+This command is a
+.I groff
+extension.
+.
+.
+.\" ====================================================================
+.SS "Device control commands"
+.\" ====================================================================
+.
+Each device control command starts with the letter
+.B x
+followed by a space character (optional or arbitrary space/\:tab in
+.IR groff )
+and a subcommand letter or word; each argument (if any) must be
+preceded by a
+.I syntactical
+.IR space .
+.
+All
+.B x
+commands are terminated by a
+.IR "syntactical line break" ;
+no device control command can be followed by another command on the same
+line (except a comment).
+.
+.P
+The subcommand is basically a single letter, but to increase
+readability, it can be written as a word, i.e., an arbitrary sequence
+of characters terminated by the next tab, space, or newline character.
+.
+All characters of the subcommand word but the first are simply ignored.
+.
+For example,
+.I @g@troff
+outputs the initialization command
+.B x\ i
+as
+.B x\ init
+and the resolution command
+.B x\ r
+as
+.BR "x\ res" .
+.
+But writings like
+.B x\ i_like_groff
+and
+.B x\ roff_is_groff
+are accepted as well to mean the same commands.
+.
+.P
+In the following, the syntax element
+.I \[la]line-break\[ra]
+means a
+.I syntactical line break
+as defined in subsection \[lq]Separation\[rq] above.
+.
+.TP
+.x-command F name
+.xsub Filename
+Use
+.I name
+as the intended name for the current file in error reports.
+.
+This is useful for remembering the original file name when
+.I groff
+uses an internal piping mechanism.
+.
+The input file is not changed by this command.
+.
+This command is a
+.I groff
+extension.
+.
+.
+.TP
+.x-command f "n\ s"
+.xsub font
+Mount font position\~\c
+.I n
+(a non-negative integer) with font named\~\c
+.I s
+(a text word);
+see
+.MR groff_font @MAN5EXT@ .
+.
+.
+.TP
+.x-command H n
+.xsub Height
+Set character height to\~\c
+.I n
+(a positive integer in scaled points\~\c
+.BR z ).
+.
+.I Classical troff
+used the unit points (\c
+.BR p )
+instead;
+see section \[lq]Compatibility\[rq] below.
+.
+.
+.TP
+.x-command i
+.xsub init
+Initialize device.
+.
+This is the third command of the
+.IR prologue .
+.
+.
+.TP
+.x-command p
+.xsub pause
+Parsed but ignored.
+.
+The classical documentation reads
+.I pause device, can be
+.IR restarted .
+.
+.
+.TP
+.x-command r "n\ h\ v"
+.xsub resolution
+Resolution is\~\c
+.IR n ,
+while
+.I h
+is the minimal horizontal motion, and
+.I v
+the minimal vertical motion possible with this device; all arguments
+are positive integers in basic units\~\c
+.B u
+per inch.
+.
+This is the second command of the
+.IR prologue .
+.
+.
+.TP
+.x-command S n
+.xsub Slant
+Set slant to\~\c
+.I n
+degrees (an integer in basic units\~\c
+.BR u ).
+.
+.
+.TP
+.x-command s
+.xsub stop
+Terminates the processing of the current file; issued as the last
+command of any
+.I intermediate @g@troff
+.IR output .
+.
+.
+.TP
+.x-command t
+.xsub trailer
+Generate trailer information, if any.
+.
+In
+.BR groff ,
+this is currently ignored.
+.
+.
+.TP
+.x-command T xxx
+.xsub Typesetter
+.
+Set the name of the output driver to
+.IR xxx ,
+a sequence of non-whitespace characters terminated by whitespace.
+.
+The possible names correspond to those of
+.IR groff 's
+.B \-T
+option.
+.
+This is the first command of the prologue.
+.
+.
+.TP
+.x-command u n
+.xsub underline
+Configure underlining of spaces.
+.
+If
+.I n
+is\~1, start underlining of spaces;
+if
+.I n
+is\~0, stop underlining of spaces.
+.
+This is needed for the
+.B cu
+request in
+.B @g@nroff
+mode and is ignored otherwise.
+.
+This command is a
+.I groff
+extension.
+.
+.
+.TP
+.x-command X anything
+.xsub X-escape
+Send string
+.I anything
+uninterpreted to the device.
+.
+If the line following this command starts with a
+.B +
+character this line is interpreted as a continuation line in the
+following sense.
+.
+The
+.B +
+is ignored, but a newline character is sent instead to the device, the
+rest of the line is sent uninterpreted.
+.
+The same applies to all following lines until the first character of a
+line is not a
+.B +
+character.
+.
+This command is generated by the
+.I groff
+escape sequence
+.BR \*[@backslash]X .
+.
+The line-continuing feature is a
+.I groff
+extension.
+.
+.
+.\" ====================================================================
+.SS "Obsolete command"
+.\" ====================================================================
+.
+In
+.I classical troff
+output, emitting a single glyph was mostly done by a very
+strange command that combined a horizontal move and the printing of a
+glyph.
+.
+It didn't have a command code, but is represented by a 3-character
+argument consisting of exactly 2\~digits and a character.
+.
+.TP
+.I ddc
+Move right
+.I dd
+(exactly two decimal digits) basic units\~\c
+.BR u ,
+then print glyph with single-letter name\~\c
+.IR c .
+.
+.
+.RS
+.P
+In
+.IR groff ,
+arbitrary
+.I syntactical space
+around and within this command is allowed to be added.
+.
+Only when a preceding command on the same line ends with an argument
+of variable length a separating space is obligatory.
+.
+In
+.I classical
+.IR troff ,
+large clusters of these and other commands were used, mostly without
+spaces; this made such output almost unreadable.
+.
+.RE
+.
+.
+.P
+For modern high-resolution devices, this command does not make sense
+because the width of the glyphs can become much larger than two
+decimal digits.
+.
+In
+.IR groff ,
+it is used only for output to the
+.BR X75 ,
+.BR X75\-12 ,
+.BR X100 ,
+and
+.B X100\-12
+devices.
+.
+For others,
+the commands
+.B t
+.RB and\~ u
+provide greater functionality and superior troubleshooting capacity.
+.
+.
+.\" ====================================================================
+.SH Postprocessing
+.\" ====================================================================
+.
+The
+.I roff
+postprocessors are programs that have the task to translate the
+.I intermediate output
+into actions that are sent to a device.
+.
+A device can be some piece of hardware such as a printer, or a software
+file format suitable for graphical or text processing.
+.
+The
+.I groff
+system provides powerful means that make the programming of such
+postprocessors an easy task.
+.P
+There is a library function that parses the
+.I intermediate output
+and sends the information obtained to the device via methods of a
+class with a common interface for each device.
+.
+So a
+.I groff
+postprocessor must only redefine the methods of this class.
+.
+For details,
+see the reference in section \[lq]Files\[rq] below.
+.
+.
+.\" ====================================================================
+.SH Example
+.\" ====================================================================
+.
+This section presents the
+.I intermediate output
+generated from the same input for three different devices.
+.
+The input is the sentence
+.I hell world
+fed into
+.I groff
+on the command line.
+.
+.
+.IP \[bu] 2m
+High-resolution device
+.I ps
+.
+.
+.RS
+.P
+.EX
+.RB "shell>\~" "echo \[dq]hell world\[dq] | groff \-Z \-T ps"
+.EE
+.
+.
+.P
+.EX
+x T ps
+x res 72000 1 1
+x init
+p1
+x font 5 TR
+f5
+s10000
+V12000
+H72000
+thell
+wh2500
+tw
+H96620
+torld
+n12000 0
+x trailer
+V792000
+x stop
+.EE
+.RE
+.
+.
+.P
+This output can be fed into the postprocessor
+.MR grops @MAN1EXT@
+to get its representation as a PostScript file, or
+.MR gropdf @MAN1EXT@
+to output directly to PDF.
+.
+.
+.IP \[bu] 2m
+Low-resolution device
+.I latin1
+.
+.
+.RS
+.P
+This is similar to the high-resolution device except that the
+positioning is done at a minor scale.
+.
+Some comments (lines starting with
+.IR # )
+were added for clarification; they were not generated by the
+formatter.
+.
+.
+.P
+.EX
+\fBshell>\fP "hell world" | groff \-Z \-T latin1
+.EE
+.
+.
+.P
+.EX
+.I # prologue
+x T latin1
+x res 240 24 40
+x init
+.I # begin a new page
+p1
+.I # font setup
+x font 1 R
+f1
+s10
+.I # initial positioning on the page
+V40
+H0
+.I # write text \[aq]hell\[aq]
+thell
+.I # inform about a space, and do it by a horizontal jump
+wh24
+.I # write text \[aq]world\[aq]
+tworld
+.I # announce line break, but do nothing because ...
+n40 0
+.I # ... the end of the document has been reached
+x trailer
+V2640
+x stop
+.EE
+.RE
+.
+.
+.P
+This output can be fed into the postprocessor
+.MR grotty @MAN1EXT@
+to get a formatted text document.
+.
+.
+.IP \[bu] 2m
+Classical style output
+.
+.
+.RS
+.P
+As a computer monitor has a very low resolution compared to modern
+printers the
+.I intermediate output
+for the X\~devices can use the jump-and-write command with its 2-digit
+displacements.
+.
+.
+.P
+.EX
+\fBshell>\fP "hell world" | groff \-Z \-T X100
+.EE
+.
+.
+.P
+.EX
+x T X100
+x res 100 1 1
+x init
+p1
+x font 5 TR
+f5
+s10
+V16
+H100
+.I # write text with old-style jump-and-write command
+ch07e07l03lw06w11o07r05l03dh7
+n16 0
+x trailer
+V1100
+x stop
+.EE
+.RE
+.
+.
+.P
+This output can be fed into the postprocessor
+.MR xditview 1x
+or
+.MR gxditview @MAN1EXT@
+for displaying in\~X.
+.
+.
+.P
+Due to the obsolete jump-and-write command, the text clusters in the
+classical output are almost unreadable.
+.
+.
+.\" ====================================================================
+.SH Compatibility
+.\" ====================================================================
+.
+The
+.I intermediate output
+language of the
+.I classical troff
+was first documented in
+[CSTR\~#97].
+.
+The
+.I groff intermediate output
+format is compatible with this specification except for the following
+features.
+.
+.
+.IP \[bu] 2m
+The classical quasi device independence is not yet implemented.
+.
+.
+.IP \[bu] 2m
+The old hardware was very different from what we use today.
+.
+So the
+.I groff
+devices are also fundamentally different from the ones in
+.I classical
+.IR troff .
+.
+For example, the classical PostScript device was called
+.I post
+and had a resolution of 720 units per inch,
+while
+.IR groff 's
+.I ps
+device has a resolution of 72000 units per inch.
+.
+Maybe, by implementing some rescaling mechanism similar to the
+classical quasi device independence, these could be integrated into
+modern
+.IR groff .
+.
+.
+.IP \[bu] 2m
+The B-spline command
+.B D\[ti]
+is correctly handled by the
+.I intermediate output
+parser, but the drawing routines aren't implemented in some of the
+postprocessor programs.
+.
+.
+.IP \[bu] 2m
+The argument of the commands
+.B s
+and
+.B x H
+has the implicit unit scaled point\~\c
+.B z
+in
+.IR groff ,
+while
+.I classical troff
+had point (\c
+.BR p ).
+.
+This isn't an incompatibility, but a compatible extension, for both
+units coincide for all devices without a
+.I sizescale
+parameter, including all classical and the
+.I groff
+text devices.
+.
+The few
+.I groff
+devices with a sizescale parameter either did not exist, had a
+different name, or seem to have had a different resolution.
+.
+So conflicts with classical devices are very unlikely.
+.
+.
+.ie \n[@STUPID_DRAWING_POSITIONING]=1 \{\
+.IP \[bu] 2m
+The position changing after the commands
+.BR Dp ,
+.BR DP ,
+and
+.B Dt
+is illogical, but as old versions of groff used this feature it is
+kept for compatibility reasons.
+.\} \" @STUPID_DRAWING_POSITIONING
+.el \{\
+.IP \[bu] 2m
+Temporarily, there existed some confusion on the positioning after the
+.B D
+commands that are
+.I groff
+extensions.
+.
+This has been clarified by establishing the classical rule for all
+groff drawing commands:
+.
+.
+.RS
+.P
+.ft I
+The position after a graphic object has been drawn is at its end;
+for circles and ellipses, the "end" is at the right side.
+.ft
+.RE
+.
+.
+.P
+From this, the positionings specified for the drawing commands above
+follow quite naturally.
+.\} \" @STUPID_DRAWING_POSITIONING
+.
+.P
+The differences between
+.I groff
+and
+.I classical troff
+are documented in
+.MR groff_diff @MAN7EXT@ .
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.IR @FONTDIR@/\:\%dev name /\:DESC
+describes the output device
+.IR name .
+.
+.
+.br
+.ne 4v
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+James Clark wrote an early version of this document,
+which described only the differences between AT&T
+device-independent
+.IR troff 's
+output format and that of GNU
+.IR roff .
+.
+The present version was completely rewritten in 2001 by
+.MT groff\-bernd\:.warken\-72@\:web\:.de
+Bernd Warken
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.P
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is the primary
+.I groff
+manual.
+.
+You can browse it interactively with \[lq]info groff\[rq].
+.
+.
+.P
+\[lq]Troff User's Manual\[rq]
+by Joseph F.\& Ossanna,
+1976
+(revised by Brian W.\& Kernighan,
+1992),
+AT&T Bell Laboratories Computing Science Technical Report No.\& 54,
+widely called simply \[lq]CSTR\~#54\[rq],
+documents the language,
+device and font description file formats,
+and device-independent output format
+referred to collectively in
+.I groff
+documentation as
+.RI \[lq]AT&T\~ troff \[rq].
+.
+.
+.P
+\[lq]A Typesetter-independent TROFF\[rq]
+by Brian W.\& Kernighan,
+1982,
+AT&T Bell Laboratories Computing Science Technical Report No.\& 97,
+provides additional insights into the
+device and font description file formats
+and device-independent output format.
+.
+.
+.TP
+.MR groff @MAN1EXT@
+documents the
+.B \-Z
+option and contains pointers to further
+.I groff
+documentation.
+.
+.
+.TP
+.MR groff @MAN7EXT@
+describes the
+.I groff
+language,
+including its escape sequences and system of units.
+.
+.
+.TP
+.MR groff_font @MAN5EXT@
+details the device scaling parameters of device
+.I DESC
+files.
+.
+.
+.TP
+.MR @g@troff @MAN1EXT@
+generates the device-independent intermediate output documented here.
+.
+.
+.TP
+.MR roff @MAN7EXT@
+presents historical aspects and the general structure of
+.I roff
+systems.
+.
+.
+.TP
+.MR groff_diff @MAN7EXT@
+enumerates differences between the intermediate output produced by AT&T
+.I troff \" AT&T
+and that of
+.IR groff .
+.
+.
+.TP
+.MR gxditview @MAN1EXT@
+is a viewer for intermediate output.
+.
+.
+.TP
+.UR https://\:github.com/\:Alhadis/\:Roff\:.js/
+.I Roff.js
+.UE
+is a viewer for intermediate output written in JavaScript.
+.
+.
+.P
+.MR grodvi @MAN1EXT@ ,
+.MR grohtml @MAN1EXT@ ,
+.MR grolbp @MAN1EXT@ ,
+.MR grolj4 @MAN1EXT@ ,
+.MR gropdf @MAN1EXT@ ,
+.MR grops @MAN1EXT@ ,
+and
+.MR grotty @MAN1EXT@
+are
+.I groff
+postprocessors.
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_out_5_man_C]
+.do rr *groff_groff_out_5_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/man/groff_tmac.5.man b/man/groff_tmac.5.man
new file mode 100644
index 0000000..fac78f5
--- /dev/null
+++ b/man/groff_tmac.5.man
@@ -0,0 +1,1474 @@
+.TH groff_tmac @MAN5EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+groff_tmac \- macro files in the GNU
+.I roff
+typesetting system
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2000-2022 Free Software Foundation, Inc.
+.\"
+.\" This file is part of groff, the GNU roff typesetting system.
+.\"
+.\" Permission is granted to copy, distribute and/or modify this
+.\" document under the terms of the GNU Free Documentation License,
+.\" Version 1.3 or any later version published by the Free Software
+.\" Foundation; with no Invariant Sections, 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_tmac_5_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" TODO: Consider parallelizing with our Texinfo node "Macro Packages".
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+Definitions of macros,
+strings,
+and registers for use in a
+.MR roff @MAN7EXT@
+document can be collected into
+.IR "macro files" ,
+.I roff
+input files designed to produce no output themselves but instead ease
+the preparation of other
+.I roff
+documents.
+.
+There is no syntactical difference between a macro file and any other
+.I roff
+document;
+only its purpose distinguishes it.
+.
+When a macro file is installed at a standard location,
+named according to a certain convention,
+and suitable for use by a general audience,
+it is termed a
+.IR "macro package" .
+.
+Macro packages can be loaded by supplying the
+.B \-m
+option to
+.MR @g@troff @MAN1EXT@
+or a
+.I groff
+front end.
+.
+.
+.P
+Each macro package stores its macro,
+string,
+and register definitions in one or more
+.I tmac
+files.
+.
+This name originated in early Unix culture as an abbreviation of
+.RI \[lq] troff \" generic
+macros\[rq].
+.
+.
+.P
+A macro file must have a name in the form
+.RI name .tmac
+(or
+.IR tmac. name)
+and be placed in a
+.RI \[lq] tmac
+directory\[rq] to be loadable with the
+.BI \-m name
+option.
+.
+Section \[lq]Environment\[rq] of
+.MR @g@troff @MAN1EXT@
+lists these directories.
+.
+Alternatively,
+a
+.I groff
+document requiring a macro file can load it with the
+.B mso
+(\[lq]macro source\[rq]) request.
+.
+.
+.P
+Like any other
+.I roff
+document,
+a macro file can use the
+.RB \[lq] so \[rq]
+request (\[lq]source\[rq]) to load further files relative to its own
+location.
+.
+.
+.P
+Macro files are named for their most noteworthy application,
+but a macro file need not define any macros.
+.
+It can restrict itself to defining registers and strings or invoking
+other
+.I groff
+requests.
+.
+It can even be empty.
+.
+.
+.\" ====================================================================
+.SH "Macro packages"
+.\" ====================================================================
+.
+Macro packages come in two varieties;
+those which assume responsibility for page layout and other critical
+functions
+(\[lq]major\[rq] or \[lq]full-service\[rq])
+and those which do not
+(\[lq]supplemental\[rq] or \[lq]auxiliary\[rq]).
+.
+GNU
+.I roff
+provides most major macro packages found in AT&T and BSD Unix systems,
+an additional full-service package,
+and many supplemental packages.
+.
+Multiple full-service macro packages cannot be used by the same
+document.
+.
+Auxiliary packages can generally be freely combined,
+though attention to their use of the
+.I groff
+language name spaces for identifiers
+(particularly registers,
+macros,
+strings,
+and diversions)
+should be paid.
+.
+Name space management was a significant challenge in AT&T
+.IR troff ;
+.IR groff 's
+support for arbitrarily long identifiers affords few excuses for name
+collisions,
+apart from attempts at compatibility with the demands of historical
+documents.
+.
+.
+.\" ====================================================================
+.SS "Man pages"
+.\" ====================================================================
+.
+.TP
+.I an
+.TQ
+.I man
+.I an
+is used to compose man pages in the format originating in Version\~7
+Unix (1979).
+.
+It has a small macro interface and is widely used;
+see
+.MR groff_man @MAN7EXT@ .
+.
+.
+.TP
+.I doc
+.TQ
+.I mdoc
+.I doc
+is used to compose man pages in the format originating in 4.3BSD-Reno
+(1990).
+.
+It provides many more features than
+.IR an ,
+but is also larger,
+more complex,
+and not as widely adopted;
+see
+.MR groff_mdoc @MAN7EXT@ .
+.
+.
+.P
+Because readers of man pages often do not know in advance which macros
+are used to format a given document,
+a wrapper is available.
+.
+.
+.TP
+.I \%andoc
+.TQ
+.I mandoc
+This macro file,
+specific to
+.IR groff ,
+recognizes whether a document uses
+.I man
+or
+.I mdoc
+format and loads the corresponding macro package.
+.
+Multiple man pages,
+in either format,
+can be handled;
+.I \%andoc
+reloads each macro package as necessary.
+.
+.
+.\" ====================================================================
+.SS "Full-service packages"
+.\" ====================================================================
+.
+The packages in this section provide a complete set of macros for
+writing documents of any kind, up to whole books.
+.
+They are similar in functionality; it is a matter of taste which one
+to use.
+.
+.
+.TP
+.I me
+The classical
+.I me
+macro package; see
+.MR groff_me @MAN7EXT@ .
+.
+.
+.TP
+.I mm
+The semi-classical
+.I mm
+macro package; see
+.MR groff_mm @MAN7EXT@ .
+.
+.
+.TP
+.I mom
+The
+.I mom
+macro package, only available in groff.
+.
+As this was not based on other packages, it was freely designed as
+quite a nice, modern macro package.
+.
+See
+.MR groff_mom @MAN7EXT@ .
+.
+.
+.TP
+.I ms
+The classical
+.I ms
+macro package; see
+.MR groff_ms @MAN7EXT@ .
+.
+.
+.\" ====================================================================
+.SS "Localization packages"
+.\" ====================================================================
+.
+For Western languages,
+the localization file sets the hyphenation mode and loads hyphenation
+patterns and exceptions.
+.
+Localization files can also adjust the date format and provide
+translations of strings used by some of the full-service macro packages;
+alter the input encoding
+(see the next section);
+and change the amount of additional inter-sentence space.
+.
+For Eastern languages,
+the localization file defines character classes and sets flags on them.
+.
+By default,
+.I troffrc
+loads the localization file for English.
+.
+.
+.TP
+.I trans
+loads localized strings used by various macro packages after their
+localized forms have been prepared by a localization macro file.
+.
+.
+.P
+.I groff
+provides the following localization files.
+.
+.
+.TP
+.I cs
+Czech;
+localizes
+.IR man ,
+.IR me ,
+.IR mm ,
+.IR mom ,
+and
+.IR ms .
+.
+Sets the input encoding to Latin-2 by loading
+.IR latin2.tmac .
+.
+.
+.TP
+.I de
+.TQ
+.I den
+German;
+localizes
+.IR man ,
+.IR me ,
+.IR mm ,
+.IR mom ,
+and
+.IR ms .
+.
+Sets the input encoding to Latin-1 by loading
+.IR latin1.tmac .
+.
+.
+.IP
+.I de.tmac
+selects hyphenation patterns for traditional orthography,
+and
+.I den.tmac
+does the same for the new orthography
+(\[lq]Recht\%schreib\%reform\[rq]).
+.
+.
+.TP
+.I en
+English.
+.
+.
+.TP
+.I fr
+French;
+localizes
+.IR man ,
+.IR me ,
+.IR mm ,
+.IR mom ,
+and
+.IR ms .
+.
+Sets the input encoding to Latin-9 by loading
+.IR latin9.tmac .
+.
+.
+.TP
+.I it
+Italian;
+localizes
+.IR man ,
+.IR me ,
+.IR mm ,
+.IR mom ,
+and
+.IR ms .
+.
+.
+.TP
+.I ja
+Japanese.
+.
+.
+.TP
+.I sv
+Swedish;
+localizes
+.IR man ,
+.IR me ,
+.IR mm ,
+.IR mom ,
+and
+.IR ms .
+.
+Sets the input encoding to Latin-1 by loading
+.IR latin1.tmac .
+.
+Some of the localization of the
+.I mm
+package is handled separately;
+see
+.MR groff_mmse @MAN7EXT@ .
+.
+.
+.TP
+.I zh
+Chinese.
+.
+.
+.\" ====================================================================
+.SS "Input encodings"
+.\" ====================================================================
+.
+.TP
+.I latin1
+.TQ
+.I latin2
+.TQ
+.I latin5
+.TQ
+.I latin9
+are various ISO\~8859 input encodings supported by
+.IR groff .
+.
+On systems using ISO character encodings,
+.I groff
+loads
+.I latin1.tmac
+automatically at startup.
+.
+A document that uses Latin-2,
+Latin-5,
+or Latin-9
+can specify one of these alternative encodings.
+.
+.
+.TP
+.I cp1047
+provides support for EBCDIC-based systems.
+.
+On those platforms,
+.I groff
+loads
+.I cp1047.tmac
+automatically at startup.
+.
+.
+.P
+Because different input character codes constitute valid GNU
+.I troff \" GNU
+input on ISO and EBCDIC systems,
+the
+.I latin
+macro files cannot be used on EBCDIC systems,
+and
+.I cp1047
+cannot be used on ISO systems.
+.
+.
+.\" ====================================================================
+.SS "Auxiliary packages"
+.\" ====================================================================
+.
+The macro packages in this section are not intended for stand-alone
+use,
+but can add functionality to any other macro package or to plain
+(\[lq]raw\[rq])
+.I groff
+documents.
+.
+.
+.\" TODO:
+.\" a4
+.\" devtag
+.\" doc-old
+.\" europs
+.\" psatk
+.\" psfig
+.TP
+.I 62bit
+provides macros for addition,
+multiplication,
+and division of 62-bit integers
+(allowing safe multiplication of signed 31-bit integers,
+for example).
+.
+.
+.TP
+.I hdtbl
+allows the generation of tables using a syntax similar to the HTML table
+model.
+.
+This Heidelberger table macro package is not a preprocessor,
+which can be useful if the contents of table entries are determined by
+macro calls or string interpolations.
+.
+Compare to
+.MR @g@tbl @MAN1EXT@ .
+.
+It works only with the
+.B ps
+and
+.B pdf
+output devices.
+.
+See
+.MR groff_hdtbl @MAN7EXT@ .
+.
+.
+.TP
+.I papersize
+enables the paper format to be set on the command line by giving a
+.RB \[lq] \-d
+.BI \%paper= format\c
+\[rq]
+option to
+.IR @g@troff .
+.
+Possible values for
+.I format
+are the ISO and DIN formats
+.RB \[lq] A0 \[en] A6 \[rq],
+.RB \[lq] B0 \[en] B6 \[rq],
+.RB \[lq] C0 \[en] C6 \[rq],
+and
+.RB \[lq] D0 \[en] D6 \[rq];
+.\" XXX: src/libs/libgroff/paper.cpp also supports [ABCD]7.
+the U.S.\& formats
+.RB \%\[lq] letter \[rq],
+.RB \%\[lq] legal \[rq],
+.RB \%\[lq] tabloid \[rq],
+.RB \%\[lq] ledger \[rq],
+.RB \%\[lq] statement \[rq],
+and
+.RB \%\[lq] executive \[rq];
+and the envelope formats
+.RB \%\[lq] com10 \[rq],
+.RB \%\[lq] monarch \[rq],
+and
+.RB \%\[lq] DL \[rq].
+.
+All formats,
+even those for envelopes,
+are in portrait orientation:
+the length measurement is vertical.
+.
+Appending \[lq]l\[rq] (ell) to any of these denotes landscape
+orientation instead.
+.
+This macro file assumes one-inch horizontal margins,
+and sets registers recognized by the
+.I groff
+.IR man ,
+.IR mdoc ,
+.IR mm ,
+.IR mom ,
+and
+.I ms
+packages to configure them accordingly.
+.
+If you want different margins,
+you will need to use those packages' facilities,
+or
+.I @g@troff
+.B ll
+and/or
+.B po
+requests to adjust them.
+.
+An output device typically requires command-line options
+.B \-p
+and
+.B \-l
+to override the paper dimensions and orientation,
+respectively,
+defined in its
+.I DESC
+file;
+see subsection \[lq]Paper format\[rq]
+of
+.MR groff @MAN1EXT@ .
+.
+This macro file is normally loaded at startup by the
+.I troffrc
+file when formatting for a typesetting device
+(but not a terminal).
+.
+.
+.TP
+.I pdfpic
+provides a single macro,
+.BR PDFPIC ,
+to include a PDF graphic in a document using features of the
+.B pdf
+output driver.
+.
+For other output devices,
+.B PDFPIC
+calls
+.BR PSPIC ,
+with which it shares an interface
+(see below).
+.
+This macro file is normally loaded at startup by the
+.I troffrc
+file.
+.
+.
+.TP
+.I pic
+supplies definitions of the macros
+.BR PS ,
+.BR PE ,
+and
+.BR PF ,
+usable with the
+.MR @g@pic @MAN1EXT@
+preprocessor.
+.
+They center each picture.
+.
+Use it if your document does not use a full-service macro package,
+or that package does not supply working
+.I pic
+macro definitions.
+.
+Except for
+.I man
+and
+.IR mdoc ,
+those provided with
+.I groff
+already do so
+(exception:
+.I mm
+employs the name
+.B PF
+for a different purpose).
+.
+.
+.TP
+.I pspic
+provides a macro,
+.BR PSPIC ,
+that includes a PostScript graphic in a document.
+.
+The
+.BR ps ,
+.BR dvi ,
+.BR html ,
+and
+.B xhtml
+output devices support such inclusions;
+for all other drivers,
+the image is replaced with a rectangular border of the same size.
+.
+.I pspic.tmac
+is loaded at startup by the
+.I troffrc
+file.
+.
+.
+.IP
+Its syntax is as follows.
+.RS
+.IP
+\&\fB.PSPIC\fP \
+[\fB\-L\fP\|\
+|\|\fB\-R\fP\|\
+|\|\fB\-C\fP\|\
+|\|\fB\-I\fP\~\fIn\fP] \
+\fI\|file\fP [\fIwidth\fP [\,\fIheight\/\fP]]
+.RE
+.
+.
+.IP
+.I file
+is the name of the PostScript file;
+.I width
+and
+.I height
+give the desired width and height of the image.
+.
+If neither a
+.I width
+nor a
+.I height
+argument is specified,
+the image's natural width
+(as given in the file's bounding box)
+or the current line length is used as the width,
+whatever is smaller.
+.
+The
+.I width
+and
+.I height
+arguments may have scaling units attached;
+the default scaling unit
+.RB is\~ i .
+.
+.B PSPIC
+scales the graphic uniformly in the horizontal and vertical directions
+so that it is no more than
+.I width
+wide
+and
+.I height
+high.
+.
+Option
+.B \-C
+centers the graphic horizontally;
+this is the default.
+.
+.B \-L
+and
+.B \-R
+left- and right-align the graphic,
+respectively.
+.
+.B \-I
+indents the graphic
+.RI by\~ n
+(with a default scaling unit
+.RB of\~ m ).
+.
+.
+.IP
+To use
+.B PSPIC
+within a diversion,
+we recommend extending it with the following code,
+assuring that the diversion's width completely covers the image's width.
+.
+.
+.RS
+.IP
+.EX
+\&.am PSPIC
+\&.\~\~vpt 0
+\&\[rs]h\[aq](\[rs]\[rs]n[ps\-offset]u + \[rs]\[rs]n[ps\-deswid]u)\[aq]
+\&.\~\~sp \-1
+\&.\~\~vpt 1
+\&..
+.EE
+.RE
+.
+.
+.IP
+Failure to load
+.BR PSPIC 's
+image argument is not an error.
+.
+(The
+.B psbb
+request does issue an error diagnostic.)
+.
+To make such a failure fatal,
+append to the
+.B pspic*error\-hook
+macro.
+.
+.
+.RS
+.IP
+.EX
+\&.am pspic*error\-hook
+\&.\~\~ab
+\&..
+.EE
+.RE
+.
+.
+.TP
+.I ptx
+provides a macro,
+.BR xx ,
+to format permuted index entries as produced by the GNU
+.MR ptx 1
+program.
+.
+If your formatting needs differ,
+copy the macro into your document and adapt it to your needs.
+.
+.
+.TP
+.I rfc1345
+defines special character escape sequences named for the glyph mnemonics
+specified in RFC\~1345 and the digraph table of the Vim text editor.
+.
+See
+.MR groff_rfc1345 @MAN7EXT@ .
+.
+.
+.TP
+.I sboxes
+offers an interface to the
+.RB \[lq] "pdf: background" \[rq]
+device control command supported by
+.MR gropdf @MAN1EXT@ .
+.
+Using this package,
+.I groff ms
+documents can draw colored rectangles beneath any output.
+.
+.RS
+.TP
+.BI \%.BOXSTART\~SHADED\~ color\~\c
+.BI \%OUTLINED\~ color\~\c
+.BI \%INDENT\~ size\~\c
+.BI \%WEIGHT\~ size
+begins a box,
+where the argument after
+.B \%SHADED
+gives the fill color and that after
+.B \%OUTLINED
+the border color.
+.
+Omit the former to get a borderless filled box and the latter for a
+border with no fill.
+.
+The specified
+.B \%WEIGHT
+is used if the box is
+.BR \%OUTLINED .
+.
+.
+.IP
+.B \%INDENT
+precedes a value which leaves a gap between the border and the contents
+inside the box.
+.
+.
+.IP
+Each
+.I color
+must be a defined
+.I groff
+color name,
+and each
+.I size
+a valid
+.I groff
+numeric expression.
+.
+The keyword/value pairs can be specified in any order.
+.RE
+.
+.
+.IP
+Boxes can be stacked,
+so you can start a box within another box;
+usually the later boxes would be smaller than the containing box,
+but this is not enforced.
+.
+When using
+.BR \%BOXSTART ,
+the left position is the current indent minus the
+.B \%INDENT
+in the command,
+and the right position is the left position
+(calculated above)
+plus the current line length and twice the indent.
+.
+.
+.RS
+.TP
+.B \%.BOXSTOP
+takes no parameters.
+.
+It closes the most recently started box at the current vertical position
+after adding its
+.B \%INDENT
+spacing.
+.RE
+.
+.
+.IP
+Your
+.I groff
+documents can conditionally exercise the
+.I sboxes
+macros.
+.
+The register
+.B \%GSBOX
+is defined if the package is loaded,
+and interpolates a true value if the
+.B pdf
+output device is in use.
+.
+.
+.IP
+.I sboxes
+furthermore hooks into the
+.MR groff_ms @MAN7EXT@
+package to receive notifications when footnotes are growing,
+so that it can close boxes on a page before footnotes are printed.
+.
+When that condition obtains,
+.I sboxes
+will close open boxes two points
+above the footnote separator and re-open them on the next page.
+.
+(This amount probably will not match the box's
+.BR \%INDENT .)
+.
+.
+.IP
+See
+.UR file://@DOCDIR@/\:\%msboxes\:.pdf
+\[lq]Using PDF boxes with
+.I groff
+and the
+.I ms
+macros\[rq]
+.UE
+for a demonstration.
+.
+.
+.TP
+.I trace
+aids the debugging of
+.I groff
+documents by tracing macro calls.
+.
+See
+.MR groff_trace @MAN7EXT@ .
+.
+.
+.TP
+.I www
+defines macros corresponding to HTML elements.
+.
+See
+.MR groff_www @MAN7EXT@ .
+.
+.
+.\" ====================================================================
+.SH Naming
+.\" ====================================================================
+.
+AT&T
+.I nroff \" AT&T
+and
+.I troff \" AT&T
+were implemented before the conventions of the modern C
+.MR getopt 3
+call evolved,
+and used a naming scheme for macro packages that looks odd to modern
+eyes.
+.
+Macro packages were typically loaded using the
+.B \-m
+option to the formatter;
+when directly followed by its argument without an intervening space,
+this looked like a long option preceded by a single minus\[em]a
+sensation in the computer stone age.
+.
+Macro packages therefore came to be known by names that started with the
+letter \[lq]m\[rq],
+which was omitted from the name of the macro file as stored on disk.
+.
+For example,
+the manuscript macro package was stored as
+.I tmac.s
+and loaded with the option
+.BR \-ms .
+.
+.
+.P
+.I groff
+commands permit space between an option and its argument.
+.
+The syntax
+.RB \[lq] "groff \-m s" \[rq]
+makes the macro file name more clear but may surprise users familiar
+with the original convention,
+unaware that the package's \[lq]real\[rq] name was \[lq]s\[rq] all
+along.
+.
+For such packages of long pedigree,
+.I groff
+accommodates different users' expectations by supplying wrapper macro
+files that load the desired file with
+.B mso
+requests.
+.
+Thus,
+all of
+.RB \[lq] "groff \-m s" \[rq],
+.RB \[lq] "groff \-m ms" \[rq],
+.RB \[lq] "groff \-ms" \[rq],
+and
+.RB \[lq] "groff \-mms" \[rq]
+serve to load the manuscript macros.
+.
+.
+.P
+Wrappers are not provided for packages of more recent vintage,
+like
+.IR www.tmac .
+.
+.
+.P
+As noted in passing above,
+AT&T
+.I troff \" AT&T
+named macro files in the form
+.IR tmac. name.
+.
+It has since become conventional in operating systems to use a suffixed
+file name extension to suggest a file type or format.
+.
+.
+.\" ====================================================================
+.SH Inclusion
+.\" ====================================================================
+.
+The traditional method of employing a macro package is to specify the
+.B \-m
+.I package
+option to the formatter,
+which then reads
+.IR package 's
+macro file prior to any input files.
+.
+Historically,
+.I package
+was sought in a file named
+.IR tmac. package
+(that is,
+with a
+.RB \[lq] tmac.\& \[rq]
+prefix).
+.
+GNU
+.I troff \" GNU
+searches for
+.RI package .tmac
+in the macro path;
+if not found,
+it looks for
+.IR tmac. package
+instead,
+and vice versa.
+.
+.
+.P
+Alternatively,
+one could include a macro file by using the request
+.RB \[lq] .so
+.IR file-name \[rq]
+in the document;
+.I file-name
+is resolved relative to the location of the input document.
+.
+GNU
+.I troff \" GNU
+offers an improved feature in the similar request
+.RB \[lq] mso
+.IR package-file-name \[rq],
+which searches the macro path for
+.IR package-file-name .
+.
+Because its argument is a file name,
+its
+.RB \[lq] .tmac \[rq]
+component must be included for the file to be found;
+however,
+as a convenience,
+if opening it fails,
+.B mso
+strips any such suffix and tries again with a
+.RB \[lq] tmac.\& \[rq]
+prefix,
+and vice versa.
+.
+.
+.P
+If a sourced file requires preprocessing,
+for example if it includes
+.I tbl \" generic
+tables
+or
+.I eqn \" generic
+equations,
+the preprocessor
+.MR @g@soelim @MAN1EXT@
+must be used.
+.
+This can be achieved with a pipeline or,
+in
+.IR groff ,
+by specifying
+the
+.B \-s
+option to the formatter
+(or front end).
+.
+.MR man 1
+librarian programs generally call
+.I @g@soelim
+automatically.
+.
+(Macro packages themselves generally do not require preprocessing.)
+.
+.
+.ig
+.\" ====================================================================
+.SH Convention
+.\" ====================================================================
+.
+.\" This section does not fit into the framework of this document.
+.
+There is a convention that is supported by many modern roff
+typesetters and
+.MR man 1
+programs, the
+.I preprocessor word
+described in the following.
+.
+.P
+If the first line in a document is a comment, the first word (after the
+comment characters and a blank) constitutes the
+.B preprocessor
+.BR word .
+That means that the letters of this word are interpreted as
+abbreviations for those preprocessor commands that should be run
+when formatting the document.
+.
+Mostly, only the letters corresponding to the options for the
+preprocessors are recognized,
+\[oq]e\[cq]
+(for
+.IR eqn ),
+.\" \[oq]G\[cq],
+.\" \[oq]g\[cq],
+\[oq]p\[cq]
+(for
+.IR pic ),
+\[oq]R\[cq]
+(for
+.IR refer ),
+\[oq]s\[cq]
+(for
+.IR soelim ),
+and
+\[oq]t\[cq]
+(for
+.IR tbl ).
+(see
+.MR roff @MAN7EXT@ ).
+.
+.
+.P
+Besides being a good reminder for the user, some formatters (like the
+.MR man 1
+program) are even able to automatically start the preprocessors
+specified in the preprocessor word, but do not bet on this.
+.
+.
+.P
+The
+.I man
+program handles some preprocessors automatically, such that in
+man\~pages only the following characters should be used:
+\[oq]e\[cq], \[oq]p\[cq], and \[oq]t\[cq].
+.
+.
+..
+.\" ====================================================================
+.SH "Writing macros"
+.\" ====================================================================
+.
+A
+.MR roff @MAN7EXT@
+document is a text file that is enriched by predefined formatting
+constructs, such as requests, escape sequences, strings, numeric
+registers, and macros from a macro package.
+.
+These elements are described in
+.MR roff @MAN7EXT@ .
+.
+.
+.P
+To give a document a personal style, it is most useful to extend the
+existing elements by defining some macros for repeating tasks; the best
+place for this is near the beginning of the document or in a separate
+file.
+.
+.
+.P
+Macros without arguments are just like strings.
+.
+But the full power of macros occurs when arguments are passed with a
+macro call.
+.
+Within the macro definition, the arguments are available as the escape
+sequences
+.BR \[rs]$1 ,
+\&.\|.\|.,
+.BR \[rs]$9 ,
+.BR \[rs]$[ .\|.\|. ] ,
+.BR \[rs]$* ,
+and
+.BR \[rs]$@ ,
+the name under which the macro was called is in
+.BR \[rs]$0 ,
+and the number of arguments is in register
+.BR \[rs]n[.$] ;
+see
+.MR groff @MAN7EXT@ .
+.
+.
+.\" ====================================================================
+.SS "Draft mode"
+.\" ====================================================================
+.
+Writing groff macros is easy when the escaping mechanism is temporarily
+disabled.
+.
+In groff, this is done by enclosing the macro definition(s) within a
+pair of
+.B .eo
+and
+.B .ec
+requests.
+.
+Then the body in the macro definition is just like a normal part of
+the document \[em] text enhanced by calls of requests, macros,
+strings, registers, etc.
+.
+For example, the code above can be written in a simpler way by
+.
+.
+.IP
+.ds @1 \[rs]f[I]\[rs]$0\[rs]f[]\"
+.ds @2 arguments:\"
+.EX
+\&.eo
+\&.ds midpart was called with the following
+\&.de print_args
+\&\*[@1]\ \[rs]*[midpart]\ \[rs]n[.$]\ \*[@2]
+\&\[rs]$*
+\&..
+\&.ec
+.EE
+.rm @1
+.rm @2
+.
+.
+.P
+Unfortunately, draft mode cannot be used universally.
+.
+Although it is good enough for defining normal macros, draft mode
+fails with advanced applications, such as indirectly defined
+strings, registers, etc.
+.
+An optimal way is to define and test all macros in draft mode and then
+do the backslash doubling as a final step; do not forget to remove the
+.I .eo
+request.
+.
+.
+.\" ====================================================================
+.SS "Tips for macro definitions"
+.\" ====================================================================
+.
+.IP \(bu
+Start every line with a dot, for example, by using the groff request
+.B .nop
+for text lines, or write your own macro that handles also text lines
+with a leading dot.
+.
+.RS
+.IP
+.EX
+\&.de Text
+\&.\ \ if (\[rs]\[rs]n[.$] == 0)\ \[rs]
+\&.\ \ \ \ return
+\&.\ \ nop\ \[rs])\[rs]\[rs]$*\[rs])
+\&..
+.EE
+.RE
+.
+.IP \(bu
+Write a comment macro that works both for copy and draft modes;
+since the escape character is off in draft mode,
+trouble might occur when comment escape sequences are used.
+.
+For example, the following macro just ignores its arguments, so it
+acts like a comment line:
+.
+.RS
+.IP
+.EX
+\&.de\ c
+\&..
+\&.c\ This\ is\ like\ a\ comment\ line.
+.EE
+.RE
+.
+.IP \(bu
+In long macro definitions, make ample use of comment lines or
+almost-empty lines (this is, lines which have a leading dot
+and nothing else) for a better structuring.
+.
+.IP \(bu
+To increase readability, use groff's indentation facility for
+requests and macro calls (arbitrary whitespace after the leading dot).
+.
+.
+.\" ====================================================================
+.SS Diversions
+.\" ====================================================================
+.
+Diversions can be used to implement quite advanced programming
+constructs.
+.
+They are comparable to pointers to large data structures in the
+C\~programming language, but their usage is quite different.
+.
+.
+.P
+In their simplest form, diversions are multi-line strings, but
+diversions get their power when used dynamically within macros.
+.
+The (formatted) information stored in a diversion can be retrieved by
+calling the diversion just like a macro.
+.
+.
+.P
+Most of the problems arising with diversions can be avoided if you
+remember that diversions always store complete lines.
+.
+Using diversions when the line buffer has not been flushed produces
+strange results; not knowing this, many people get desperate about
+diversions.
+.
+To ensure that a diversion works, add line breaks at the right
+places.
+.
+To be safe, enclose everything that has to do with diversions within
+a pair of line breaks; for example, by explicitly using
+.B .br
+requests.
+.
+This rule should be applied to diversion definition, both inside and
+outside, and to all calls of diversions.
+.
+This is a bit of overkill, but it works nicely.
+.
+.
+.P
+(If you really need diversions which should ignore the current partial
+line, use environments to save the current partial line and/\:or use the
+.B .box
+request.)
+.
+.
+.P
+The most powerful feature using diversions is to start a diversion
+within a macro definition and end it within another macro.
+.
+Then everything between each call of this macro pair is stored within
+the diversion and can be manipulated from within the macros.
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+This document was written by
+.MT groff\-bernd\:.warken\-72@\:web\:.de
+Bernd Warken
+.ME ,
+.MT wl@\:gnu\:.org
+Werner Lemberg
+.ME ,
+and
+.MT g.branden\:.robinson@\:gmail\:.com
+G.\& Branden Robinson
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is the primary
+.I groff
+manual.
+.
+You can browse it interactively with \[lq]info groff\[rq].
+.
+.
+.LP
+The
+.UR https://\:wiki\:.linuxfoundation\:.org/\:lsb/\:fhs
+Filesystem Hierarchy Standard
+.UE
+is maintained by the Linux Foundation.
+.
+.
+.TP
+.MR groff @MAN1EXT@
+is an overview of the
+.I groff
+system.
+.
+.
+.TP
+.MR groff_man @MAN7EXT@ ,
+.TQ
+.MR groff_mdoc @MAN7EXT@ ,
+.TQ
+.MR groff_me @MAN7EXT@ ,
+.TQ
+.MR groff_mm @MAN7EXT@ ,
+.TQ
+.MR groff_mom @MAN7EXT@ ,
+.TQ
+.MR groff_ms @MAN7EXT@ ,
+.TQ
+.MR groff_rfc1345 @MAN7EXT@ ,
+.TQ
+.MR groff_trace @MAN7EXT@ ,
+\~and
+.TQ
+.MR groff_www @MAN7EXT@
+are
+.I groff
+macro packages.
+.
+.
+.TP
+.MR groff @MAN7EXT@
+summarizes the language recognized by GNU
+.IR troff . \" GNU
+.
+.
+.TP
+.MR troff @MAN1EXT@
+documents the default macro file search path.
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_tmac_5_man_C]
+.do rr *groff_groff_tmac_5_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/man/man.am b/man/man.am
new file mode 100644
index 0000000..f37e906
--- /dev/null
+++ b/man/man.am
@@ -0,0 +1,46 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+man5_MANS += \
+ man/groff_font.5 \
+ man/groff_out.5 \
+ man/groff_tmac.5
+man7_MANS += \
+ man/groff_char.7 \
+ man/groff_diff.7 \
+ man/groff.7 \
+ man/roff.7
+EXTRA_DIST += \
+ man/groff_font.5.man \
+ man/groff_out.5.man \
+ man/groff_tmac.5.man \
+ man/groff_char.7.man \
+ man/groff_diff.7.man \
+ man/groff.7.man \
+ man/roff.7.man
+
+# Case of out-of-source build: we must create the 'man' directory.
+BUILT_SOURCES += man
+man:
+ $(MKDIR_P) $(top_builddir)/man
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/man/roff.7.man b/man/roff.7.man
new file mode 100644
index 0000000..2468a4b
--- /dev/null
+++ b/man/roff.7.man
@@ -0,0 +1,2613 @@
+'\" t
+.TH roff @MAN7EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+roff \- concepts and history of
+.I roff
+typesetting
+.
+.
+.\" TODO: Synchronize this material with introductory section(s) of our
+.\" Texinfo manual, and then keep it that way.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2000-2023 Free Software Foundation, Inc.
+.\"
+.\" This file is part of groff, the GNU roff type-setting system.
+.\"
+.\" Permission is granted to copy, distribute and/or modify this
+.\" document under the terms of the GNU Free Documentation License,
+.\" Version 1.3 or any later version published by the Free Software
+.\" Foundation; with no Invariant Sections, 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_roff_7_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The term
+.I roff
+denotes a family of document formatting systems known by names like
+.IR troff ,
+.IR nroff ,
+and
+.IR ditroff .
+.
+A
+.I roff
+system consists of an interpreter for an extensible text formatting
+language and a set of programs for preparing output for various devices
+and file formats.
+.
+Unix-like operating systems often distribute a
+.I roff
+system.
+.
+The manual pages on Unix systems
+(\[lq]man\~pages\[rq])
+and bestselling books on software engineering,
+including Brian Kernighan and Dennis Ritchie's
+.I The C Programming Language
+and W.\& Richard Stevens's
+.I Advanced Programming in the Unix Environment
+have been written using
+.I roff
+systems.
+.
+GNU
+.IR roff \[em] groff \[em]is
+arguably the most widespread
+.I roff
+implementation.
+.
+.
+.P
+Below we present
+typographical concepts that form the background of all
+.I roff
+implementations,
+narrate the development history of some
+.I roff
+systems,
+detail the command pipeline managed by
+.MR groff @MAN1EXT@ ,
+survey the formatting language,
+suggest tips for editing
+.I roff
+input,
+and recommend further reading materials.
+.
+.
+.\" ====================================================================
+.SH Concepts
+.\" ====================================================================
+.
+.\" BEGIN Keep roughly parallel with groff.texi nodes "Text" through
+.\" "Tab Stops".
+.I roff
+input files contain text interspersed with instructions to control the
+formatter.
+.
+Even in the absence of such instructions,
+a
+.I roff
+formatter still processes its input in several ways,
+by filling,
+hyphenating,
+breaking,
+and adjusting it,
+and supplementing it with inter-sentence space.
+.
+These processes are basic to typesetting,
+and can be controlled at the input document's discretion.
+.
+.
+.P
+When a device-independent
+.I roff
+formatter starts up,
+it obtains information about the device for which it is preparing
+output from the latter's description file
+(see
+.MR groff_font @MAN5EXT@ ).
+.
+An essential property is the length of the output line,
+such as \[lq]6.5 inches\[rq].
+.
+.
+.P
+The formatter interprets plain text files employing the Unix line-ending
+convention.
+.
+It reads input a character at a time,
+collecting words as it goes,
+and fits as many words together on an output line as it can\[em]this
+is known as
+.I filling.
+.
+To a
+.I roff
+system,
+a
+.I word
+is any sequence of one or more characters that aren't spaces or
+newlines.
+.
+The exceptions separate words.
+.
+.
+.P
+A
+.I roff
+formatter attempts to detect boundaries between sentences,
+and supplies additional inter-sentence space between them.
+.
+It flags certain characters
+(normally
+.RB \[lq] !\& \[rq],
+.RB \[lq] ?\& \[rq],
+and
+.RB \[lq] .\& \[rq])
+as potentially ending a sentence.
+.
+When the formatter encounters one of these
+.I end-of-sentence characters
+at the end of an input line,
+or one of them is followed by two (unescaped) spaces on the same input
+line,
+it appends an inter-word space
+followed by an inter-sentence space in the output.
+.
+The dummy character escape sequence
+.B \[rs]&
+can be used after an end-of-sentence character to defeat end-of-sentence
+detection on a per-instance basis.
+.
+Normally,
+the occurrence of a visible non-end-of-sentence character
+(as opposed to a space or tab)
+immediately after an end-of-sentence
+character cancels detection of the end of a sentence.
+.
+However,
+several characters are treated
+.I transparently
+after the occurrence of an end-of-sentence character.
+.
+That is,
+a
+.I roff
+does not cancel end-of-sentence detection when it processes them.
+.
+This is because such characters are often used as footnote markers or to
+close quotations and parentheticals.
+.
+The default set is
+.BR \[dq] ,
+.BR \[aq] ,
+.BR ) ,
+.BR ] ,
+.BR * ,
+.BR \[rs][dg] ,
+.BR \[rs][dd] ,
+.BR \[rs][rq] ,
+and
+.BR \[rs][cq] .
+.
+The last four are examples of
+.I special characters,
+escape sequences whose purpose is to obtain glyphs that are not easily
+typed at the keyboard,
+or which have special meaning to the formatter
+(like
+.BR \[rs] ).
+.\" slack wording: itself).
+.
+.
+.P
+When an output line is nearly full,
+it is uncommon for the next word collected from the input to exactly
+fill it\[em]typically,
+there is room left over only for part of the next word.
+.
+The process of splitting a word so that it appears partially on one line
+(with a hyphen to indicate to the reader that the word has been broken)
+with its remainder on the next is
+.I hyphenation.
+.
+Hyphenation points can be manually specified;
+.I groff
+also uses a hyphenation algorithm and language-specific pattern files to
+decide which words can be hyphenated and where.
+.
+Hyphenation does not always occur even when the hyphenation rules for a
+word allow it;
+it can be disabled,
+and when not disabled there are several parameters that can prevent it
+in certain circumstances.
+.
+.
+.P
+Once an output line is full,
+the next word
+(or remainder of a hyphenated one)
+is placed on a different output line;
+this is called a
+.I break.
+.
+In this document and in
+.I roff
+discussions generally,
+a \[lq]break\[rq] if not further qualified always refers to the
+termination of an output line.
+.
+When the formatter is filling text,
+it introduces breaks automatically to keep output lines from exceeding
+the configured line length.
+.
+After an automatic break,
+a
+.I roff
+formatter
+.I adjusts
+the line if applicable
+(see below),
+and then resumes collecting and filling text on the next output line.
+.
+.
+.br
+.ne 2v
+.P
+Sometimes,
+a line cannot be broken automatically.
+.
+This usually does not happen with natural language text unless the
+output line length has been manipulated to be extremely short,
+but it can with specialized text like program source code.
+.
+.I groff
+provides a means of telling the formatter where the line may be broken
+without hyphens.
+.
+This is done with the non-printing break point escape sequence
+.BR \[rs]: .
+.
+.
+.P
+.\" What if the document author wants to stop filling lines temporarily,
+.\" for instance to start a new paragraph? There are several solutions.
+There are several ways to cause a break at a predictable location.
+.
+A blank input line not only causes a break,
+but by default it also outputs a one-line vertical space
+(effectively a blank output line).
+.
+Macro packages may discourage or disable this \[lq]blank line
+method\[rq] of paragraphing in favor of their own macros.
+.
+A line that begins with one or more spaces causes a break.
+.
+The spaces are output at the beginning of the next line without being
+.I adjusted
+(see below).
+.
+Again,
+macro packages may provide other methods of producing indented
+paragraphs.
+.
+Trailing spaces on
+.I text lines
+(see below)
+are discarded.
+.
+The end of input causes a break.
+.
+.
+.P
+After the formatter performs an automatic break,
+it may then
+.I adjust
+the line,
+widening inter-word spaces until the text reaches the right margin.
+.
+Extra spaces between words are preserved.
+.
+Leading and trailing spaces are handled as noted above.
+.
+Text can be aligned to the left or right margin only,
+or centered,
+using
+.I requests.
+.
+.
+.P
+A
+.I roff
+formatter translates horizontal tab characters,
+also called simply \[lq]tabs\[rq],
+in the input into movements to the next tab stop.
+.
+These tab stops are by default located every half inch measured from the
+current position on the input line.
+.
+With them,
+simple tables can be made.
+.
+However,
+this method can be deceptive,
+as the appearance
+(and width)
+of the text in an editor and the results from the formatter can vary
+greatly,
+particularly when proportional typefaces are used.
+.
+A tab character does not cause a break and therefore does not interrupt
+filling.
+.
+The formatter provides facilities for sophisticated table composition;
+there are many details to track
+when using the \[lq]tab\[rq] and \[lq]field\[rq] low-level features,
+so most users turn to the
+.MR @g@tbl @MAN1EXT@
+preprocessor to lay out tables.
+.\" END Keep roughly parallel with groff.texi nodes "Text" through "Tab
+.\" Stops".
+.
+.
+.\" ====================================================================
+.SS "Requests and macros"
+.\" ====================================================================
+.
+.\" BEGIN Keep roughly parallel with groff.texi node "Requests and
+.\" Macros".
+.\" We have now encountered almost all of the syntax there is in the
+.\" @code{roff} language, with an exception already noted in passing.
+A
+.I request
+is an instruction to the formatter that occurs after a
+.I control character,
+which is recognized at the beginning of an input line.
+.
+The regular control character is a dot
+.RB \[lq] .\& \[rq].
+.
+Its counterpart,
+the
+.I no-break control character,
+a neutral apostrophe
+.RB \[lq] \|\[aq]\| \[rq],
+suppresses the break
+.\" slack wording: that is
+implied by some requests.
+.
+These characters were chosen because it is uncommon for lines of text in
+natural languages to begin with them.
+.
+If you require a formatted period or apostrophe
+(closing single quotation mark)
+where
+.\" GNU @code{troff}
+the formatter is expecting a control character,
+prefix the dot or neutral apostrophe with the dummy character escape
+sequence,
+.RB \[lq] \[rs]& \[rq].
+.
+.
+.P
+An input line beginning with a control character is called a
+.I control line.
+.
+Every line of input that is not a control line is a
+.I text line.
+.
+.
+.P
+Requests often take
+.I arguments,
+words
+(separated from the request name and each other by spaces)
+that specify details of the action
+.\" GNU @code{troff}
+the formatter is expected to perform.
+.
+If a request is meaningless without arguments,
+it is typically ignored.
+.
+.\" TODO: roff(7): We haven't introduced escape sequences yet.
+.\" GNU @code{troff}'s requests and escape sequences comprise the
+.\" control language of the formatter.
+.
+Of key importance are the requests that define macros.
+.
+Macros are invoked like requests,
+enabling the request repertoire to be extended or overridden.
+.\" @footnote{Argument handling in macros is more flexible but also more
+.\" complex. @xref{Calling Macros}.}
+.
+.
+.P
+A
+.I macro
+can be thought of as an abbreviation you can define for a
+collection of control and text lines.
+.
+When the macro is
+.I called
+by giving its name after a control character,
+it is replaced with what it stands for.
+.
+The process of textual replacement is known as
+.I interpolation.
+.\" @footnote{Some escape sequences undergo interpolation as well.}
+Interpolations are handled as soon as they are recognized,
+and once performed,
+a
+.I roff
+formatter scans the replacement for further requests,
+macro calls,
+and escape sequences.
+.
+.
+.P
+In
+.I roff
+systems,
+the
+.RB \[lq] de \[rq]
+request defines a macro.
+.\" @footnote{GNU @code{troff} offers additional ones. @xref{Writing
+.\" Macros}.}
+.\" END Keep roughly parallel with groff.texi node "Requests and
+.\" Macros".
+.
+.
+.\" ====================================================================
+.SS "Page geometry"
+.\" ====================================================================
+.
+.\" BEGIN Keep parallel with groff.texi node "Page Geometry".
+.I roff
+systems format text under certain assumptions about the size of the
+output medium,
+or page.
+.
+For the formatter to correctly break a line it is filling,
+it must know the line length,
+which it derives from the page width.
+.\" (@pxref{Line Layout}).
+.
+For it to decide whether to write an output line to the current page or
+wait until the next one,
+it must know the page length.
+.\" (@pxref{Page Layout}).
+.
+.
+A device's
+.I resolution
+converts practical units like inches or centimeters to
+.I basic units,
+a convenient length measure for the output device or file format.
+.
+The formatter and output driver use basic units to reckon page
+measurements.
+.
+The device description file defines its resolution and page dimensions
+(see
+.MR groff_font @MAN5EXT@ ).
+.\" (@pxref{DESC File Format}).
+.
+.
+.P
+A
+.I page
+is a two-dimensional structure upon which a
+.I roff
+system imposes a rectangular coordinate system with its upper left
+corner as the origin.
+.
+Coordinate values are in basic units and increase down and to the right.
+Useful ones are therefore always positive and within numeric ranges
+corresponding to the page boundaries.
+.
+.
+.P
+While the formatter
+(and,
+later,
+output driver)
+is processing a page,
+it keeps track of its
+.I drawing position,
+which is the location at which the next glyph will be written,
+from which the next motion will be measured,
+or where a geometric object will commence rendering.
+.
+Notionally,
+glyphs are drawn from the text baseline upward and to the right.
+.RI ( groff
+does not yet support right-to-left scripts.)
+.
+The
+.I text baseline
+is a
+(usually invisible)
+line upon which the glyphs of a typeface are aligned.
+.
+A glyph therefore \[lq]starts\[rq] at its bottom-left corner.
+.
+If drawn at the origin,
+a typical letter glyph would lie partially or wholly off the page,
+depending on whether,
+like \[lq]g\[rq],
+it features a descender below the baseline.
+.
+.
+.P
+Such a situation is nearly always undesirable.
+.
+It is furthermore conventional not to write or draw at the extreme edges
+of the page.
+.
+Therefore the initial drawing position of a
+.I roff
+formatter is not at the origin,
+but below and to the right of it.
+.
+This rightward shift
+from the left edge is known as the
+.I page offset.
+.
+.RI ( groff 's
+terminal output devices have page offsets of zero.)
+.
+The downward shift leaves room for a text output line.
+.
+.
+.P
+Text is arranged on a one-dimensional lattice of text baselines from
+the top to the bottom of the page.
+.
+.I Vertical spacing
+is the distance between adjacent text baselines.
+.
+Typographic tradition sets this quantity to 120% of the type size.
+.
+The initial vertical drawing position is one unit of vertical spacing
+below the page top.
+.
+Typographers term this unit a
+.I vee.
+.
+.
+.P
+Vertical spacing has an impact on page-breaking decisions.
+.
+Generally,
+when a break occurs,
+the formatter moves the drawing position to the next text baseline
+automatically.
+.
+If the formatter were already writing to the last line that would fit on
+the page,
+advancing by one vee would place the next text baseline off the page.
+.
+Rather than let that happen,
+.I roff
+formatters instruct the output driver to eject the page,
+start a new one,
+and again set the drawing position to one vee below the page top;
+this is a
+.I page break.
+.
+.
+.P
+When the last line of input text corresponds to the last output line
+that fits on the page,
+the break caused by the end of input will also break the page,
+producing a useless blank one.
+.
+Macro packages keep users from having
+to confront this difficulty by setting \[lq]traps\[rq];
+.\" (@pxref{Traps});
+moreover,
+all but the simplest page layouts tend to have headers and footers,
+or at least bear vertical margins larger than one vee.
+.\" END Keep parallel with groff.texi node "Page Geometry".
+.
+.
+.\" ====================================================================
+.SS "Other language elements"
+.\" ====================================================================
+.
+.I Escape sequences
+start with the
+.I escape character,
+a backslash
+.BR \[rs] ,
+and are followed by at least one additional character.
+.
+They can appear anywhere in the input.
+.
+.
+.P
+With requests,
+the escape and control characters can be changed;
+further,
+escape sequence recognition can be turned off and back on.
+.
+.
+.P
+.I Strings
+store character sequences.
+.
+In
+.IR groff ,
+they can be parameterized as macros can.
+.
+.
+.P
+.I Registers
+store numerical values,
+including measurements.
+.
+The latter are generally in basic units;
+.I scaling units
+can be appended to numeric expressions to clarify their meaning when
+stored or interpolated.
+.
+Some read-only predefined registers interpolate text.
+.
+.
+.P
+.I Fonts
+are identified either by a name or by a mounting position
+(a non-negative number).
+.
+Four styles are available on all devices.
+.
+.B R
+is \[lq]roman\[rq]:
+normal,
+upright text.
+.
+.B B
+is
+.BR bold ,
+an upright typeface with a heavier weight.
+.
+.B I
+is
+.IR italic ,
+a face that is oblique on typesetter output devices and usually
+underlined instead on terminal devices.
+.
+.B BI
+is \f[BI]bold-italic\f[]\/, \" indulging a bit of man(7) evil here
+combining both of the foregoing style variations.
+.
+Typesetting devices group these four styles into
+.I families
+of text fonts;
+they also typically offer one or more
+.I special
+fonts that provide unstyled glyphs;
+see
+.MR groff_char @MAN7EXT@ .
+.
+.
+.P
+.I groff
+supports named
+.I colors
+for glyph rendering and drawing of geometric objects.
+.
+Stroke and fill colors are distinct;
+the stroke color is used for glyphs.
+.
+.
+.P
+.I Glyphs
+are visual representation forms of
+.I characters.
+.
+In
+.I groff,
+the distinction between those two elements is not always obvious
+(and a full discussion is beyond our scope).
+.
+In brief,
+\[lq]A\[rq] is a character when we consider it in the abstract:
+to make it a glyph,
+we must select a typeface with which to render it,
+and determine its type size and color.
+.
+The formatting process turns input characters into output glyphs.
+.
+A few characters commonly seen on keyboards are treated
+specially by the
+.I roff
+language and may not look correct in output if used unthinkingly;
+they are
+the (double) quotation mark
+.RB ( \|\[dq]\| ),
+the neutral apostrophe
+.RB ( \|\[aq]\| ),
+the minus sign
+.RB ( \- ),
+the backslash
+.RB ( \|\[rs]\| ),
+the caret or circumflex accent
+.RB ( \[ha] ),
+the grave accent
+.RB ( \|\[ga]\| ),
+and the tilde
+.RB ( \[ti] ).
+.
+All of these and more can be produced with
+.I special character
+escape sequences;
+see
+.MR groff_char @MAN7EXT@ .
+.
+.
+.P
+.I groff
+offers
+.IR streams ,
+identifiers for writable files,
+but for security reasons this feature is disabled by default.
+.
+.
+.\" BEGIN Keep roughly parallel with first paragraphs of groff.texi node
+.\" "Deferring Output".
+.P
+A further few language elements arise as page layouts become more
+sophisticated and demanding.
+.
+.I Environments
+collect formatting parameters like line length and typeface.
+.
+A
+.I diversion
+stores formatted output for later use.
+.
+A
+.I trap
+is a condition on the input or output,
+tested automatically by the formatter,
+that is associated with a macro,
+calling it when that condition is fulfilled.
+.
+.
+.P
+Footnote support often exercises all three of the foregoing features.
+.
+A simple implementation might work as follows.
+.
+A pair of macros is defined:
+one starts a footnote and the other ends it.
+.
+The author calls the first macro where a footnote marker is desired.
+.
+The macro establishes a diversion so that the footnote text is collected
+at the place in the body text where its corresponding marker appears.
+.
+An environment is created for the footnote so that it is set at a
+smaller typeface.
+.
+The footnote text is formatted in the diversion using that environment,
+but it does not yet appear in the output.
+.
+The document author calls the footnote end macro,
+which returns to the previous environment and ends the diversion.
+.
+Later,
+after much more body text in the document,
+a trap,
+set a small distance above the page bottom,
+is sprung.
+.
+The macro called by the trap draws a line across the page and emits the
+stored diversion.
+.
+Thus,
+the footnote is rendered.
+.\" END Keep roughly parallel with first paragraphs of groff.texi node
+.\" "Deferring Output".
+.
+.
+.\" ====================================================================
+.SH History
+.\" ====================================================================
+.
+Computer-driven document formatting dates back to the 1960s.
+.\" John Labovitz points out that Peter Samson's TJ-2 dates to 1963,
+.\" but since this is a *roff man page, we do not begin our story there.
+.\" https://johnlabovitz.com/publications/\
+.\" The-electric-typesetter--The-origins-of-computing-in-typography.pdf
+.
+The
+.I roff
+system is intimately connected with Unix,
+but its origins lie with the earlier operating systems CTSS,
+GECOS,
+and Multics.
+.
+.
+.\" ====================================================================
+.SS "The predecessor\[em]\f[I]RUNOFF\f[]"
+.\" ====================================================================
+.
+.IR roff 's
+ancestor
+.I RUNOFF
+was written in the MAD language by Jerry Saltzer
+to prepare his Ph.D.\& thesis on the Compatible Time Sharing System
+(CTSS),
+a project of the Massachusetts Institute of Technology (MIT).
+.
+This program is referred to in full capitals,
+both to distinguish it from its many descendants,
+and because bits were expensive in those days;
+five- and six-bit character encodings were still in widespread usage,
+and mixed-case alphabetics in file names seen as a luxury.
+.
+.I RUNOFF
+introduced a syntax of inlining formatting directives amid document
+text,
+by beginning a line with a period
+(an unlikely occurrence in human-readable material)
+followed by a \[lq]control word\[rq].
+.
+Control words with obvious meaning like \[lq].line length
+.IR n \[rq]
+were supported as well as an abbreviation system;
+the latter came to overwhelm the former in popular usage and later
+derivatives of the program.
+.
+A sample of control words from a
+.UR http://\:web\:.mit\:.edu/\:Saltzer/\:www/\:publications/\:ctss/\:AH\
+\:.9\:.01\:.html
+.I RUNOFF
+manual of December 1966
+.UE
+was documented as follows
+(with the parameter notation slightly altered).
+.
+The abbreviations will be familiar to
+.I roff
+veterans.
+.
+.
+.P
+.ne 10v
+.TS
+center;
+r l
+rB l.
+Abbreviation Control word
+\&.ad .adjust
+\&.bp .begin page
+\&.br .break
+\&.ce .center
+\&.in .indent \f[I]n\f[]
+\&.ll .line length \f[I]n\f[]
+\&.nf .nofill
+\&.pl .paper length \f[I]n\f[]
+\&.sp .space [\f[I]n\f[]]
+.TE
+.
+.
+.P
+In 1965,
+MIT's Project MAC teamed with Bell Telephone Laboratories and General
+Electric (GE) to inaugurate the
+.UR http://\:www\:.multicians\:.org
+Multics
+.UE
+project.
+.
+After a few years,
+Bell Labs discontinued its participation in Multics,
+famously prompting the development of Unix.
+.
+Meanwhile,
+Saltzer's
+.I RUNOFF
+proved influential,
+seeing many ports and derivations elsewhere.
+.
+.
+.\" "Morris did one port and called it roff. I did the BCPL one, adding
+.\" registers, but not macros. Molly Wagner contributed a hyphenation
+.\" algorithm. Ken and/or Dennis redid roff in PDP-11 assembler. Joe
+.\" started afresh for the grander nroff, including macros. Then Joe
+.\" bought a phototypesetter ..."
+.\" -- https://minnie.tuhs.org/pipermail/tuhs/2018-November/017052.html
+.P
+In 1969,
+Doug McIlroy wrote one such reimplementation,
+adding extensions,
+in the BCPL language for a GE 645 running GECOS at the Bell Labs
+location in Murray Hill,
+New Jersey.
+.
+In its manual,
+the control commands were termed \[lq]requests\[rq],
+their two-letter names were canonical,
+and the control character was configurable with a
+.B .cc
+request.
+.
+Other familiar requests emerged at this time;
+no-adjust
+.RB ( .na ),
+need
+.RB ( .ne ),
+page offset
+.RB ( .po ),
+tab configuration
+.RB ( .ta ,
+though it worked differently),
+temporary indent
+.RB ( .ti ),
+character translation
+.RB ( .tr ),
+and automatic underlining
+.RB ( .ul ;
+on
+.I RUNOFF
+you had to backspace and underscore in the input yourself).
+.B .fi
+to enable filling of output lines got the name it retains to this day.
+.
+McIlroy's program also featured a heuristic system for automatically
+placing hyphenation points,
+designed and implemented by Molly Wagner.
+.
+It furthermore introduced numeric variables,
+termed registers.
+.
+By 1971,
+this program had been ported to Multics and was known as
+.IR roff ,
+a name McIlroy attributes to Bob Morris,
+to distinguish it from CTSS
+.IR RUNOFF .
+.
+.\" GBR can't find a source for this claim (of Bernd's).
+.\"Multics
+.\".I runoff
+.\"added features such as the ability to do two-pass formatting;
+.\"it became the main system for Multics documentation and text
+.\"processing.
+.
+.
+.\" ====================================================================
+.SS "Unix and \f[I]roff\f[]"
+.\" ====================================================================
+.
+McIlroy's
+.I roff
+was one of the first Unix programs.
+.
+In Ritchie's term,
+it was \[lq]transliterated\[rq] from BCPL to DEC PDP-7 assembly language
+.\" see "The Evolution of the Unix Time-Sharing System", Ritchie, 1984
+for the fledgling Unix operating system.
+.
+Automatic hyphenation was managed with
+.B .hc
+and
+.B .hy
+requests,
+line spacing control was generalized with the
+.B .ls
+request,
+and what later
+.IR roff s
+would call diversions were available via \[lq]footnote\[rq] requests.
+.\" The foregoing features may have been in McIlroy's Multics roff, but
+.\" he no longer has documentation for that--only the GECOS version.
+.\" GBR's guess is that they were, if we take Ritchie's choice of the
+.\" term "transliterated" seriously. GBR further speculates that there
+.\" is no reason to suppose that McIlroy's roff was stagnant from
+.\" 1969-1971, whereas we have no record of any significant
+.\" post-transliteration development of Unix roff. Its request list did
+.\" not appear until the 3rd edition manual, and did not change
+.\" thereafter. In 7th edition, roff was characterized as "utterly
+.\" frozen".
+.
+This
+.I roff
+indirectly funded operating systems research at Murray Hill;
+AT&T prepared patent applications to the U.S.\& government with it.
+.
+This arrangement enabled the group to acquire a PDP-11;
+.I roff
+promptly proved equal to the task of formatting the manual for what
+would become known as \[lq]First Edition Unix\[rq],
+dated November 1971.
+.
+.
+.P
+Output from all of the foregoing programs was limited to line printers
+and paper terminals such as the IBM 2471
+(based on the Selectric line of typewriters)
+and the Teletype Corporation Model 37.
+.
+Proportionally spaced type was unavailable.
+.
+.
+.\" ====================================================================
+.SS "New \f[I]roff\f[] and Typesetter \f[I]roff\f[]"
+.\" ====================================================================
+.
+The first years of Unix were spent in rapid evolution.
+.
+The practicalities of preparing standardized documents like patent
+applications
+(and Unix manual pages),
+combined with McIlroy's enthusiasm for macro languages,
+perhaps created an irresistible pressure to make
+.I roff
+extensible.
+.
+Joe Ossanna's
+.IR nroff ,
+literally a \[lq]new roff\[rq],
+was the outlet for this pressure.
+.
+.\" nroff is listed in the table of contents of the Version 2 manual,
+.\" but no man page is present.
+By the time of Unix Version\~3
+(February 1973)\[em]and still in PDP-11 assembly language\[em]it sported
+a swath of features now considered essential to
+.I roff
+systems:
+.
+definition of macros
+.RB ( .de ),
+diversion of text thither
+.RB ( .di ),
+and removal thereof
+.RB ( .rm );
+.
+trap planting
+.RB ( .wh ;
+\[lq]when\[rq])
+and relocation
+.RB ( .ch ;
+\[lq]change\[rq]);
+.
+conditional processing
+.RB ( .if );
+.
+and environments
+.RB ( .ev ).
+.
+Incremental improvements included
+.
+assignment of the next page number
+.RB ( .pn );
+.
+no-space mode
+.RB ( .ns )
+and restoration of vertical spacing
+.RB ( .rs );
+.
+the saving
+.RB ( .sv )
+and output
+.RB ( .os )
+of vertical space;
+.
+specification of replacement characters for tabs
+.RB ( .tc )
+and leaders
+.RB ( .lc );
+.
+configuration of the no-break control character
+.RB ( .c2 );
+.
+shorthand to disable automatic hyphenation
+.RB ( .nh );
+.
+a condensation of what were formerly six different requests for
+configuration of page \[lq]titles\[rq]
+(headers and footers)
+into one
+.RB ( .tl )
+with a length controlled separately from the line length
+.RB ( .lt );
+.
+automatic line numbering
+.RB ( .nm );
+.
+interactive input
+.RB ( .rd ),
+which necessitated buffer-flushing
+.RB ( .fl ),
+and was made convenient with early program cessation
+.RB ( .ex );
+.
+source file inclusion in its modern form
+.RB ( .so ;
+though
+.I RUNOFF
+had an \[lq].append\[rq] control word for a similar purpose)
+and early advance to the next file argument
+.RB ( .nx );
+.
+ignorable content
+.RB ( .ig );
+.
+and programmable abort
+.RB ( .ab ).
+.
+.
+.P
+Third Edition Unix also brought the
+.MR pipe 2
+system call,
+the explosive growth of a componentized system based around it,
+and a \[lq]filter model\[rq] that remains perceptible today.
+.
+Equally importantly,
+the Bell Labs site in Murray Hill acquired a Graphic Systems C/A/T
+phototypesetter,
+and with it came the necessity of expanding the capabilities of a
+.I roff
+system to cope with a variety of proportionally spaced typefaces at
+multiple sizes.
+.
+Ossanna wrote a parallel implementation of
+.I nroff
+for the C/A/T,
+dubbing it
+.I troff
+(for \[lq]typesetter roff\[rq]).
+.
+Unfortunately,
+surviving documentation does not illustrate what requests were
+implemented at this time for C/A/T support;
+the
+.MR troff 1 \" AT&T
+man page in Fourth Edition Unix
+(November 1973)
+does not feature a request list, \" nor does Unix V6 troff(1) (1975)
+unlike
+.MR nroff 1 . \" AT&T
+.
+Apart from typesetter-driven features,
+Unix Version\~4
+.IR roff s
+added string definitions
+.RB ( .ds );
+made the escape character configurable
+.RB ( .ec );
+and enabled the user to write diagnostics to the standard error stream
+.RB ( .tm ).
+.
+Around 1974,
+empowered with multiple type sizes,
+italics,
+and a symbol font specially commissioned by Bell Labs from
+Graphic Systems,
+Kernighan and Lorinda Cherry implemented
+.I eqn \" AT&T
+for typesetting mathematics.
+.
+.
+In the same year,
+for Fifth Edition Unix,
+Ossanna combined and reimplemented the two
+.IR roff s
+in C,
+using that language's preprocessor to generate both from a single source
+tree.
+.
+.
+.P
+Ossanna documented the syntax of the input language to the
+.I nroff
+and
+.I troff
+programs in the \[lq]Troff User's Manual\[rq],
+first published in 1976,
+with further revisions as late as 1992 by Kernighan.
+.
+(The original version was entitled
+\[lq]Nroff/Troff User's Manual\[rq],
+which may partially explain why
+.I roff
+practitioners have tended to refer to it by its AT&T document
+identifier,
+\[lq]CSTR #54\[rq].)
+.
+Its final revision serves as the
+.I de facto
+specification of AT&T
+.IR troff , \" AT&T
+and all subsequent implementors of
+.I roff
+systems have done so in its shadow.
+.
+.
+.P
+A small and simple set of
+.I roff
+macros was first used for the manual pages of Unix Version\~4 and
+persisted for two further releases,
+but the first macro package to be formally described and installed was
+.I ms
+by Michael Lesk in Version\~6.
+.
+He also wrote a manual,
+\[lq]Typing Documents on the Unix System\[rq],
+describing
+.I ms
+and basic
+.IR nroff / troff
+usage,
+updating it as the package accrued features.
+.
+Sixth Edition additionally saw the debut of the
+.I tbl \" AT&T
+preprocessor for formatting tables,
+also by Lesk.
+.
+.
+.P
+For Unix Version\~7
+(January 1979),
+McIlroy designed,
+implemented,
+and documented the
+.I man
+macro package,
+introducing most of the macros described in
+.MR groff_man 7
+today,
+and edited volume 1 of the Version 7 manual using it.
+.
+Documents composed using
+.I ms
+featured in volume 2,
+edited by Kernighan.
+.
+.
+.\" Thanks to Clem Cole for the following account.
+.\" https://minnie.tuhs.org/pipermail/tuhs/2022-January/025143.html
+.P
+Meanwhile,
+.I troff
+proved popular even at Unix sites that lacked a C/A/T device.
+.
+Tom Ferrin of the University of California at San Francisco combined it
+with Allen Hershey's popular vector fonts to produce
+.IR vtroff ,
+which translated
+.IR troff 's
+output to the command language used by Versatec and Benson-Varian
+plotters.
+.
+.
+.P
+Ossanna had passed away unexpectedly in 1977,
+and after the release of Version 7,
+with the C/A/T typesetter becoming supplanted by alternative devices
+such as the Mergenthaler Linotron 202,
+Kernighan undertook a revision and rewrite of
+.I troff
+to generalize its design.
+.
+To implement this revised architecture,
+he developed the font and device description file formats and the
+page description language that remain in use today.
+.
+He described these novelties in the article
+\[lq]A Typesetter-independent TROFF\[rq],
+last revised in 1982,
+and like the
+.I troff
+manual itself,
+it is widely known by a shorthand,
+\[lq]CSTR #97\[rq].
+.\" Further entertaining reading can be found at:
+.\" <https://www.cs.princeton.edu/~bwk/202/summer.reconstructed.pdf>.
+.
+.
+.P
+Kernighan's innovations prepared
+.I troff
+well for the introduction of the Adobe PostScript language in 1982 and a
+vibrant market in laser printers with built-in interpreters for it.
+.
+An output driver for PostScript,
+.IR dpost ,
+was swiftly developed.
+.
+However,
+AT&T's software licensing practices kept
+Ossanna's
+.IR troff ,
+with its tight coupling to the C/A/T's capabilities,
+in parallel distribution with device-independent
+.I troff
+throughout the 1980s.
+.
+Today,
+however,
+all actively maintained
+.IR troff s
+follow Kernighan's device-independent design.
+.
+.
+.\" ====================================================================
+.SS "\f[I]groff\f[]\[em]a free \f[I]roff\f[] from GNU"
+.\" ====================================================================
+.
+The most important free
+.I roff
+project historically has been
+.IR groff ,
+the GNU implementation of
+.IR troff ,
+developed by James Clark starting in 1989 and distributed under
+.UR http://\:www\:.gnu\:.org/\:copyleft
+copyleft
+.UE
+licenses,
+ensuring to all the availability of source code and the freedom to
+modify and redistribute it,
+properties unprecedented in
+.I roff
+systems to that point.
+.
+.I groff
+rapidly attracted contributors,
+and has served as a replacement for almost all applications of AT&T
+.I troff
+(exceptions include
+.IR mv ,
+a macro package for preparation of viewgraphs and slides,
+and the
+.I ideal
+preprocessor,
+which produces diagrams from mathematical constraints).
+.
+Beyond that,
+it has added numerous features;
+see
+.MR groff_diff @MAN7EXT@ .
+.
+Since its inception and for at least the following three decades,
+it has been used by practically all GNU/Linux and BSD operating systems.
+.
+.
+.P
+.I groff
+continues to be developed,
+is available for almost all operating systems in common use
+(along with several obscure ones),
+and is free.
+.
+These factors make
+.I groff
+the
+.I de facto
+.I roff
+standard today.
+.
+.
+.\" ====================================================================
+.SS "Other free \f[I]roff\f[]s"
+.\" ====================================================================
+.
+In 2007, \" TODO: verify
+Caldera/SCO and Sun Microsystems,
+having acquired rights to AT&T Documenter's Workbench (DWB)
+.I troff
+(a descendant of the Bell Labs code),
+released it under a free but GPL-incompatible license.
+.
+.UR https://\:github\:.com/\:n\-t\-roff/\:DWB3.3
+This implementation
+.UE
+was made portable to modern POSIX systems,
+and adopted and enhanced first by Gunnar Ritter and then Carsten Kunze
+to produce
+.UR https://github.com/n-t-roff/heirloom-doctools
+Heirloom Doctools
+.I troff
+.UE .
+.
+.
+.P
+.\" https://lists.gnu.org/archive/html/groff/2013-07/msg00001.html
+In July 2013,
+Ali Gholami Rudi announced
+.UR https://\:github\:.com/\:aligrudi/\:neatroff
+.I neatroff
+.UE ,
+a permissively licensed new implementation.
+.
+.
+.P
+Another descendant of DWB
+.I troff \" DWB
+is part of
+.UR https://\:9fans\:.github\:.io/\:plan9port/
+Plan\~9 from User Space
+.UE .
+.
+Since 2021,
+this
+.I troff \" Plan 9 from User Space
+has been available under permissive terms.
+.
+.
+.\" ====================================================================
+.SH "Using \f[I]roff\f[]"
+.\" ====================================================================
+.
+When you read a man page,
+often a
+.I roff
+is the program rendering it.
+.
+Some
+.I roff
+implementations provide wrapper programs that make it easy to use the
+.I roff
+system from the shell's command line.
+.
+These can be specific to a macro package,
+like
+.MR mmroff @MAN1EXT@ ,
+or more general.
+.
+.MR groff @MAN1EXT@
+provides command-line options sparing the user from constructing the
+long,
+order-dependent pipelines familiar to AT&T
+.I troff
+users.
+.
+Further,
+a heuristic program,
+.MR grog @MAN1EXT@ ,
+is available to infer from a document's contents which
+.I groff
+arguments should be used to process it.
+.
+.
+.\" ====================================================================
+.SS "The \f[I]roff\f[] pipeline"
+.\" ====================================================================
+.
+A typical
+.I roff
+document is prepared by running one or more processors in series,
+followed by a a formatter program and then an output driver
+(or \[lq]device postprocessor\[rq]).
+.
+Commonly,
+these programs are structured into a pipeline;
+that is,
+each is run in sequence such that the output of one is
+taken as the input
+to the next,
+without passing through secondary storage.
+.
+(On non-Unix systems,
+pipelines may have to be simulated with temporary files.)
+.
+.
+.RS
+.PP
+.EX
+.RI $\~ preproc1 \~\c
+.BI <\~ input-file \~|\~ preproc2 \~|\~\c
+.RB .\|.\|.\&\~ "| troff\~"\c
+.RI [ option ]\~\c
+.RB .\|.\|.\&\~ \[rs]
+.BI " |\~" output-driver \" 4 leading spaces
+.EE
+.RE
+.
+.
+.P
+Once all preprocessors have run,
+they deliver pure
+.I roff
+language input to the formatter,
+which in turn generates a document in a page description language that
+is then interpreted by a postprocessor for viewing,
+printing,
+or further processing.
+.
+.
+.P
+Each program interprets input in a language that is independent of the
+others;
+some are purely descriptive,
+as with
+.MR @g@tbl @MAN1EXT@
+and
+.I roff
+output,
+and some permit the definition of macros,
+as with
+.MR @g@eqn @MAN1EXT@
+and
+.I roff
+input.
+.
+.
+Most
+.I roff
+input files employ the macros of a document formatting package,
+intermixed with instructions for one or more preprocessors,
+and seasoned with escape sequences and requests from the
+.I roff
+language.
+.
+Some documents are simpler still,
+since their formatting packages discourage direct use of
+.I roff
+requests;
+man pages are a prominent example.
+.
+Many features of the
+.I roff
+language are seldom needed by users;
+only authors of macro packages require a substantial command of them.
+.
+.
+.\" ====================================================================
+.SS Preprocessors
+.\" ====================================================================
+.
+A
+.I roff
+preprocessor is a program that,
+directly or ultimately,
+generates output in the
+.I roff
+language.
+.
+Typically, \" preconv is an exception.
+each preprocessor defines a language of its own that transforms its
+input into that for
+.I roff
+or another preprocessor.
+.
+As an example of the latter,
+.I chem \" generic
+produces
+.I pic \" generic
+input.
+.
+Preprocessors must consequently be run in an appropriate order;
+.MR groff @MAN1EXT@
+handles this automatically for all preprocessors supplied by the GNU
+.I roff
+system.
+.
+.
+.P
+Portions of the document written in preprocessor languages are usually
+.\" preconv is the exception again.
+bracketed by tokens that look like
+.I roff
+macro calls.
+.
+.I roff
+preprocessor programs transform only the regions of the document
+intended for them.
+.\" In preconv's case, that's the whole document.
+.
+When a preprocessor language is used by a document,
+its corresponding program must process it before the input is seen by
+the formatter,
+or incorrect rendering is almost guaranteed.
+.
+.
+.P
+GNU
+.I roff
+provides several preprocessors,
+including
+.IR @g@eqn ,
+.IR @g@grn ,
+.IR @g@pic ,
+.IR @g@tbl ,
+.IR @g@refer ,
+and
+.IR @g@soelim .
+.
+See
+.MR groff @MAN1EXT@
+for a complete list.
+.
+Other preprocessors for
+.I roff
+systems are known.
+.
+.
+.P
+.RS
+.TS
+tab (@);
+Li L.
+dformat@depicts data structures;
+grap@constructs statistical charts; and
+ideal@draws diagrams using a constraint-based language.
+.TE
+.RE
+.
+.
+.\" ====================================================================
+.SS "Formatter programs"
+.\" ====================================================================
+.
+A
+.I roff
+formatter transforms
+.I roff
+language input into a single file in a page description language,
+described in
+.MR groff_out @MAN5EXT@ ,
+intended for processing by a selected device.
+.
+This page description language is specialized in its parameters,
+but not its syntax,
+for the selected device;
+the format is
+.RI device- independent ,
+but not
+.RI device- agnostic .
+.
+The parameters the formatter uses to arrange the document are stored in
+.I device
+and
+.IR "font description files" ;
+see
+.MR groff_font @MAN5EXT@ .
+.
+.
+.P
+AT&T Unix
+had two formatters\[em]\c
+.I nroff
+for terminals,
+and
+.I troff
+for typesetters.
+.
+Often,
+the name
+.I troff
+is used loosely to refer to both.
+.
+When generalizing thus,
+.I groff
+documentation prefers the term
+.RI \[lq] roff \[rq].
+.
+In GNU
+.IR roff ,
+the formatter program is always
+.MR @g@troff @MAN1EXT@ .
+.
+.
+.\" ====================================================================
+.SS "Devices and output drivers"
+.\" ====================================================================
+.
+To a
+.I roff
+system,
+a
+.I device
+is a hardware interface like a printer,
+a text or graphical terminal,
+or a standardized file format that unrelated software can interpret.
+.
+An
+.I output driver
+is a program that parses the output of
+.I troff \" generic
+and produces instructions specific to the device or file format it
+supports.
+.
+An output driver might support multiple devices,
+particularly if they are similar.
+.
+.
+.P
+The names of the devices and their driver programs are not standardized.
+.
+Technological fashions evolve;
+the devices used for document preparation when AT&T
+.I troff \" AT&T
+was first written in the 1970s are no longer used in production
+environments.
+.
+Device capabilities have tended to increase,
+improving resolution and font repertoire,
+and adding color output and hyperlinking.
+.
+Further,
+to reduce file size and processing time,
+AT&T
+.IR troff 's \" AT&T
+page description language placed low limits on the magnitudes of some
+quantities it could represent.
+.
+Its PostScript output driver,
+.MR dpost 1 ,
+had a resolution of 720 units per inch;
+.IR groff 's
+.MR grops @MAN1EXT@
+uses 72,000.
+.
+.
+.\".P
+.\"Today the operating systems provide device drivers for most
+.\"printer-like hardware, so it isn't necessary to write a special
+.\"hardware postprocessor for each printer.
+.\" XXX? No they don't. Instead printers interpret PS or PDF directly.
+.\" With a TCP/IP protocol stack and an HTTP server to accept POSTed
+.\" documents for printing.
+.
+.
+.\" ====================================================================
+.SH "\f[I]roff\f[] programming"
+.\" ====================================================================
+.
+Documents using
+.I roff
+are normal text files interleaved with
+.I roff
+formatting elements.
+.
+The
+.I roff
+language is powerful enough to support arbitrary computation and
+it supplies facilities that encourage extension.
+.
+The primary such facility is macro definition;
+with this feature,
+macro packages have been developed that are tailored for particular
+applications.
+.
+.
+.\" ====================================================================
+.SS "Macro packages"
+.\" ====================================================================
+.
+Macro packages can have a much smaller vocabulary than
+.I roff
+itself;
+this trait combined with their domain-specific nature can make them easy
+to acquire and master.
+.
+The macro definitions of a package are typically kept in a file called
+.IB name .tmac
+(historically,
+.BI tmac. name\/\c\" Italic correction comes before \c !
+).
+.
+Find details on the naming and placement of macro packages in
+.MR groff_tmac @MAN5EXT@ .
+.
+.
+.P
+A macro package anticipated for use in a document can be declared to
+the formatter by the command-line option
+.BR \-m ;
+see
+.MR @g@troff @MAN1EXT@ .
+.
+It can alternatively be specified within a document using the
+.B mso
+request of the
+.I groff
+language;
+see
+.MR groff @MAN7EXT@ .
+.
+.
+.P
+Well-known macro packages include
+.I man
+for traditional man pages and
+.I mdoc
+for BSD-style manual pages.
+.
+Macro packages for typesetting books,
+articles,
+and letters include
+.I ms
+(from \[lq]manuscript macros\[rq]),
+.I me
+(named by a system administrator from the first name of its creator,
+Eric Allman),
+.I mm
+(from \[lq]memorandum macros\[rq]),
+and
+.IR mom ,
+a punningly named package exercising many
+.I groff
+extensions.
+.
+See
+.MR groff_tmac @MAN5EXT@
+for more.
+.
+.
+.\" ====================================================================
+.SS "The \f[I]roff\f[] formatting language"
+.\" ====================================================================
+.
+.\" TODO: Integrate this subsection with subsection "Other language
+.\" elements".
+The
+.I roff
+language provides requests,
+escape sequences,
+macro definition facilities,
+string variables,
+registers for storage of numbers or dimensions,
+and control of execution flow.
+.
+The theoretically minded will observe that a
+.I roff
+is not a mere markup language,
+but Turing-complete.
+.
+It has storage
+(registers),
+it can perform tests
+(as in conditional expressions like
+.RB \[lq] "(\[rs]n[i] >= 1)" \[rq]),
+its
+.\" Kerning between bold "i" and "f" and roman \[lq], \[rq] is tight.
+.RB \[lq] \|if\| \[rq]
+and related requests alter the flow of control,
+and macro definition permits unbounded recursion.
+.
+.
+.P
+.I Requests
+and
+.I escape sequences
+are instructions,
+predefined parts of the language,
+that perform formatting operations,
+interpolate stored material,
+or otherwise change the state of the parser.
+.
+The user can define their own request-like elements by composing
+together text,
+requests,
+and escape sequences
+.I "ad libitum."
+.
+.
+A document writer will not (usually) note any difference in usage for
+requests or macros;
+both are found on control lines.
+.
+However,
+there is a distinction;
+requests take either a fixed number of arguments
+(sometimes zero),
+silently ignoring any excess,
+or consume the rest of the input line,
+whereas macros can take a variable number of arguments.
+.
+Since arguments are separated by spaces,
+macros require a means of embedding a space in an argument;
+in other words,
+of quoting it.
+.
+This then demands a mechanism of embedding the quoting character itself,
+in case
+.I it
+is needed literally in a macro argument.
+.
+AT&T
+.I troff
+had complex rules involving the placement and repetition of the double
+quote to achieve both aims.
+.
+.I groff
+cuts this knot by supporting a special character escape sequence for the
+neutral double quote,
+.\" The kerning between a roman \[lq] and a bold backslash is tight.
+.RB \[lq] \|\[rs][dq] \[rq],
+which never performs quoting in the typesetting language,
+but is simply a glyph,
+.RB \[oq] \[dq] \[cq].
+.
+.
+.P
+.I Escape sequences
+start with a backslash,
+.RB \[lq] \|\[rs] \[rq].
+.
+They can appear almost anywhere,
+even in the midst of text on a line,
+and implement various features,
+including the insertion of special characters with
+.RB \[lq] \|\[rs](\f[BI]xx\f[] \[rq]
+or
+.RB \[lq] \|\[rs][\f[BI]xxx\f[]] \[rq],
+break suppression at input line endings with
+.RB \[lq] \|\[rs]c \[rq],
+font changes with
+.RB \[lq] \|\[rs]f\| \[rq],
+type size changes with
+.RB \[lq] \|\[rs]s \[rq],
+in-line comments with
+.RB \[lq] \|\[rs]\[dq] \[rq],
+and many others.
+.
+.
+.P
+.I Strings
+store text.
+.
+They are populated with the
+.B ds
+request and interpolated using the
+.B \[rs]*
+escape sequence.
+.
+.
+.P
+.I Registers
+store numbers and measurements.
+.
+A register can be set with the request
+.B nr
+and its value can be retrieved by the escape sequence
+.BR "\[rs]n" .
+.
+.
+.\" ====================================================================
+.SH "File naming conventions"
+.\" ====================================================================
+.
+The structure or content of a file name,
+beyond its location in the file system,
+is not significant to
+.I roff
+tools.
+.
+.I roff
+documents employing \[lq]full-service\[rq] macro packages
+(see
+.MR groff_tmac @MAN5EXT@ )
+tend to be named with a suffix identifying the package;
+we thus see file names ending in
+.IR .man ,
+.IR .ms ,
+.IR .me ,
+.IR .mm ,
+and
+.IR .mom ,
+for instance.
+.
+When installed,
+man pages tend to be named with the manual's section number as the
+suffix.
+.
+For example,
+the file name for this document is
+.IR roff.7 .
+.
+Practice for
+\[lq]raw\[rq]
+.I roff
+documents is less consistent;
+they
+are sometimes seen with a
+.I .t
+suffix.
+.
+.
+.\" BEGIN Keep parallel with groff.texi node "Input Conventions".
+.\" ====================================================================
+.SH "Input conventions"
+.\" ====================================================================
+.
+Since
+.I @g@troff
+fills text automatically,
+it is common practice in the
+.I roff
+language to avoid visual composition of text in input files:
+the esthetic appeal of the formatted output is what matters.
+.
+Therefore,
+.I roff
+input should be arranged such that it is easy for authors and
+maintainers to compose and develop the document,
+understand the syntax of
+.I roff
+requests,
+macro calls,
+and preprocessor languages used,
+and predict the behavior of the
+formatter.
+.
+Several traditions have accrued in service of these goals.
+.
+.
+.IP \[bu] 2n
+Follow sentence endings in the input with newlines to ease their
+recognition.
+.\" Texinfo: (@pxref{Sentences}).
+It is frequently convenient to end text lines after colons and
+semicolons as well,
+as these typically precede independent clauses.
+.
+Consider doing so after commas;
+they often occur in lists that become easy to scan when itemized by
+line,
+or constitute supplements to the sentence that are added,
+deleted,
+or updated to clarify it.
+.
+Parenthetical and quoted phrases are also good candidates for placement
+on text lines by themselves.
+.
+.
+.IP \[bu]
+Set your text editor's line length to 72 characters or fewer;
+see the subsections below.
+.\" Texinfo:
+.\" @footnote{Emacs: @code{fill-column: 72}; Vim: @code{textwidth=72}}
+.
+This limit,
+combined with the previous item of advice,
+makes it less common that an input line will wrap in your text editor,
+and thus will help you perceive excessively long constructions in your
+text.
+.
+Recall that natural languages originate in speech,
+not writing,
+and that punctuation is correlated with pauses for breathing and changes
+in prosody.
+.
+.
+.IP \[bu]
+Use
+.B \[rs]&
+after
+.RB \[lq] !\& \[rq],
+.RB \[lq] ?\& \[rq],
+and
+.RB \[lq] .\& \[rq]
+if they are followed by space,
+tab,
+or newline characters and don't end a sentence.
+.
+.
+.IP \[bu]
+In filled text lines,
+use
+.B \[rs]&
+before
+.RB \[lq] .\& \[rq]
+and
+.RB \[lq] \[aq] \[rq]
+if they are preceded by space,
+so that reflowing the input doesn't turn them into control lines.
+.
+.
+.IP \[bu]
+Do not use spaces to perform indentation or align columns of a table.
+Leading spaces are reliable when text is not being filled.
+.
+.
+.IP \[bu]
+Comment your document.
+.
+It is never too soon to apply comments to record information of use to
+future document maintainers
+(including your future self).
+.\" Texinfo: We thus introduce another escape sequence, @code{\"}, which
+The
+.B \[rs]\[dq]
+escape sequence
+causes
+.I @g@troff
+to ignore the remainder of the input line.
+.
+.
+.IP \[bu]
+Use the empty request\[em]a control character followed immediately by a
+newline\[em]to visually manage separation of material in input files.
+.
+Many of the
+.I groff
+project's own documents use an empty request between sentences,
+after macro definitions,
+and where a break is expected,
+and two empty requests between paragraphs or other requests or macro
+calls that will introduce vertical space into the document.
+.
+You can combine the empty request with the comment escape sequence to
+include whole-line comments in your document,
+and even \[lq]comment out\[rq] sections of it.
+.
+.
+.P
+.\" Texinfo: We conclude this section with an example
+An example sufficiently long to illustrate most of the above suggestions
+in practice follows.
+.
+.\" Texinfo: For the purpose of fitting the example between the margins
+.\" of this manual with the font used for its typeset version,
+.\" we have shortened the input line length to 56
+.\" columns.
+.\" Texinfo: As before,
+.
+An arrow \[->] indicates a tab character.
+.
+.
+.P
+.RS
+.EX
+\&.\[rs]" nroff this_file.roff | less
+\&.\[rs]" groff \-T ps this_file.roff > this_file.ps
+\[->]The theory of relativity is intimately connected with
+the theory of space and time.
+\&.
+I shall therefore begin with a brief investigation of
+the origin of our ideas of space and time,
+although in doing so I know that I introduce a
+controversial subject.\& \[rs]" remainder of paragraph elided
+\&.
+.ne 3v \" Don't let a page break hide the blank line from the reader.
+\&.
+\&
+\[->]The experiences of an individual appear to us arranged
+in a series of events;
+in this series the single events which we remember
+appear to be ordered according to the criterion of
+\[rs][lq]earlier\[rs][rq] and \[rs][lq]later\[rs][rq], \[rs]" punct \
+swapped
+which cannot be analysed further.
+\&.
+There exists,
+therefore,
+for the individual,
+an I\-time,
+or subjective time.
+\&.
+This itself is not measurable.
+\&.
+I can,
+indeed,
+associate numbers with the events,
+in such a way that the greater number is associated with
+the later event than with an earlier one;
+but the nature of this association may be quite
+arbitrary.
+\&.
+This association I can define by means of a clock by
+comparing the order of events furnished by the clock
+with the order of a given series of events.
+\&.
+We understand by a clock something which provides a
+series of events which can be counted,
+and which has other properties of which we shall speak
+later.
+\&.\[rs]" Albert Einstein, _The Meaning of Relativity_, 1922
+.EE
+.RE
+.\" END Keep parallel with groff.texi node "Input Conventions".
+.
+.
+.\" ====================================================================
+.SS "Editing with Emacs"
+.\" ====================================================================
+.
+Official GNU doctrine holds that the best program for editing a
+.I roff
+document is Emacs; see
+.MR emacs 1 .
+.
+It provides an
+.I nroff
+major mode that is suitable for all kinds of
+.I roff
+dialects.
+.
+This mode can be activated by the following methods.
+.
+.
+.P
+When editing a file within Emacs the mode can be changed by typing
+.RI \[lq] M-x
+.BR nroff\-mode \[rq],
+where
+.I M-x
+means to hold down the meta key
+(often labelled \[lq]Alt\[rq])
+while pressing and releasing the \[lq]x\[rq] key.
+.\" Why is this sort of thing not in intro(1)?
+.
+.
+.P
+It is also possible to have the mode automatically selected when a
+.I roff
+file is loaded into the editor.
+.
+.
+.IP \(bu 2n
+The most general method is to include file-local variables at the end of
+the file;
+we can also configure the fill column this way.
+.
+.
+.RS
+.IP
+.EX
+\&.\[rs]" Local Variables:
+\&.\[rs]" fill\-column: 72
+\&.\[rs]" mode: nroff
+\&.\[rs]" End:
+.EE
+.RE
+.
+.IP \(bu
+Certain file name extensions,
+such as those commonly used by man pages,
+trigger the automatic activation of the
+.I nroff
+mode.
+.
+.
+.br
+.ne 3v
+.IP \(bu
+Technically,
+having the sequence
+.
+.
+.RS
+.IP
+.EX
+\&.\[rs]" \%\-*\- nroff \-*\-
+.EE
+.RE
+.
+.
+.IP
+in the first line of a file will cause Emacs to enter the
+.I nroff
+major mode when it is loaded into the buffer.
+.
+Unfortunately,
+some implementations of the
+.MR man 1
+program are confused by this practice,
+so we discourage it.
+.
+.
+.\" ====================================================================
+.SS "Editing with Vim"
+.\" ====================================================================
+.
+.\" TODO: elvis, vile. Nvi does not support highlighting at all, and
+.\" gedit does but has no rules for roff yet. Other editors TBD.
+Other editors provide support for
+.IR roff -style
+files too,
+such as
+.MR vim 1 ,
+an extension of the
+.MR vi 1
+program.
+.
+Vim's highlighting can be made to recognize
+.I roff
+files by setting the
+.B filetype
+option in a Vim
+.IR modeline .
+.
+For this feature to work,
+your copy of
+.I vim
+must be built with support for,
+and configured to enable,
+several features;
+consult the editor's online help topics
+\[lq]auto\-setting\[rq],
+\[lq]filetype\[rq],
+and \[lq]syntax\[rq].
+.
+Then put the following at the end of your
+.I roff
+files,
+after any Emacs configuration:
+.\" ...because Emacs pattern-matches against 3000 bytes from the end of
+.\" the buffer [or until hitting a 0x0C (FF, form-feed control)] for
+.\" "Local Variables:", but Vim only checks as many lines as its
+.\" 'modelines' variable tells it to. A common default is "5", but
+.\" Emacs settings can be longer than that.
+.
+.
+.RS
+.IP
+.EX
+\&.\[rs]" vim: set filetype=groff textwidth=72:
+.EE
+.RE
+.
+.
+.P
+Replace \[lq]groff\[rq] in the above with \[lq]nroff\[rq] if you want
+highlighting that does
+.I not
+recognize many of the GNU extensions to
+.IR roff ,
+such as request,
+register,
+and string names longer than two characters.
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+This document was written by
+.MT groff\-bernd\:.warken\-72@\:web\:.de
+Bernd Warken
+.ME
+and
+.MT g.branden\:.robinson@\:gmail\:.com
+G.\& Branden Robinson
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+Much
+.I roff
+documentation is available.
+.
+The Bell Labs papers describing AT&T
+.I troff
+remain available,
+and
+.I groff
+is documented comprehensively. \" ...one hopes.
+.
+.
+.\" ====================================================================
+.SS "Internet sites"
+.\" ====================================================================
+.
+.P
+.UR https://\:github\:.com/\:larrykollar/\:Unix\-Text\-Processing
+.I Unix Text Processing
+.UE ,
+by Dale Dougherty and Tim O'Reilly,
+1987,
+Hayden Books.
+.
+This well-regarded text brings the reader from a state of no knowledge
+of Unix or text editing
+(if necessary)
+to sophisticated computer-aided typesetting.
+.
+It has been placed under a free software license by its authors and
+updated by a team of
+.I groff
+contributors and enthusiasts.
+.
+.
+.P
+.UR http://\:manpages\:.bsd\:.lv/\:history\:.html
+\[lq]History of Unix Manpages\[rq]
+.UE ,
+an online article maintained by the mdocml project,
+provides an overview of
+.I roff
+development from Saltzer's
+.I RUNOFF
+to 2008,
+with links to original documentation and recollections of the authors
+and their contemporaries.
+.
+.
+.P
+.UR http://\:www\:.troff\:.org/
+troff.org
+.UE ,
+Ralph Corderoy's
+.I troff
+site,
+provides an overview and pointers to much historical
+.I roff
+information.
+.
+.
+.P
+.UR http://\:www\:.multicians\:.org/
+Multicians
+.UE ,
+a site by Multics enthusiasts,
+contains a lot of information on the MIT projects CTSS and Multics,
+including
+.IR RUNOFF ;
+it is especially useful for its glossary and the many links to
+historical documents.
+.
+.
+.P
+.UR http://\:www\:.tuhs\:.org/\:Archive/
+The Unix Archive
+.UE ,
+curated by the Unix Heritage Society,
+provides the source code and some binaries of historical Unices
+(including the source code of some versions of
+.I troff
+and its documentation)
+contributed by their copyright holders.
+.
+.
+.P
+.UR http://\:web\:.mit\:.edu/\:Saltzer/\:www/\:publications/\
+\:pubs\:.html
+Jerry Saltzer's home page
+.UE
+stores some documents using the original
+.I RUNOFF
+formatting language.
+.
+.
+.P
+.UR http://\:www\:.gnu\:.org/\:software/\:groff
+.I groff
+.UE ,
+GNU
+.IR roff 's
+web site,
+provides convenient access to
+.IR groff 's
+source code repository,
+bug tracker,
+and mailing lists
+(including archives and the subscription interface).
+.
+.
+.\" ====================================================================
+.SS "Historical \f[I]roff\f[] documentation"
+.\" ====================================================================
+.
+Many AT&T
+.I troff
+documents are available online,
+and can be found at Ralph Corderoy's site
+(see above)
+or via Internet search.
+.
+.
+.P
+Of foremost significance are two mentioned in section \[lq]History\[rq]
+above,
+describing the language and its device-independent implementation,
+respectively.
+.
+.
+.P
+\[lq]Troff User's Manual\[rq]
+by Joseph F.\& Ossanna,
+1976
+(revised by Brian W.\& Kernighan,
+1992),
+AT&T Bell Laboratories Computing Science Technical Report No.\& 54.
+.
+.
+.P
+\[lq]A Typesetter-independent TROFF\[rq]
+by Brian W.\& Kernighan,
+1982,
+AT&T Bell Laboratories Computing Science Technical Report No.\& 97.
+.
+.
+.P
+You can obtain many relevant Bell Labs papers in PDF from
+.UR https://\:github\:.com/\:bwarken/\:roff_classical\:.git
+Bernd Warken's
+\[lq]roff classical\[rq]
+GitHub repository
+.UE .
+.
+.
+.\" ====================================================================
+.SS "Manual pages"
+.\" ====================================================================
+.
+As a system of multiple components,
+a
+.I roff
+system potentially has many man pages,
+each describing an aspect of it.
+.
+Unfortunately,
+there is no consistent naming scheme for these pages among the different
+.I roff
+implementations.
+.
+.
+.P
+For GNU
+.IR roff ,
+the
+.MR groff @MAN1EXT@
+man page enumerates all man pages distributed with the system,
+and individual pages frequently refer to external resources as well as
+manuals distributed with
+.I groff
+on a variety of topics.
+.
+.
+.P
+With other
+.IR roff s,
+you are on your own,
+but
+.MR troff 1 \" foreign troff
+might be a good starting point.
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_roff_7_man_C]
+.do rr *groff_roff_7_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/mdate.pl b/mdate.pl
new file mode 100755
index 0000000..b16044d
--- /dev/null
+++ b/mdate.pl
@@ -0,0 +1,32 @@
+#! /usr/bin/env perl
+#
+# Copyright (C) 1991-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# Print the modification date of $1 `nicely'.
+
+use warnings;
+use strict;
+use POSIX qw(LC_ALL setlocale strftime);
+
+# Don't want localized dates.
+setlocale(LC_ALL, "C");
+
+my @mtime = gmtime($ENV{SOURCE_DATE_EPOCH} || (stat $ARGV[0])[9]);
+my $mdate = strftime("%e %B %Y", @mtime);
+$mdate =~ s/^ //;
+print "$mdate\n";
diff --git a/src/devices/grodvi/dvi.cpp b/src/devices/grodvi/dvi.cpp
new file mode 100644
index 0000000..f9e8a57
--- /dev/null
+++ b/src/devices/grodvi/dvi.cpp
@@ -0,0 +1,988 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <assert.h>
+
+#include "driver.h"
+#include "nonposix.h"
+#include "paper.h"
+
+extern "C" const char *Version_string;
+
+#define DEFAULT_LINEWIDTH 40
+static int linewidth = DEFAULT_LINEWIDTH;
+
+static int draw_flag = 1;
+
+static int landscape_flag = 0;
+static double user_paper_length = 0;
+static double user_paper_width = 0;
+
+/* These values were chosen because:
+
+(MULTIPLIER*SIZESCALE)/(RES*UNITWIDTH) == 1/(2^20 * 72.27)
+
+and 57816 is an exact multiple of both 72.27*SIZESCALE and 72.
+
+The width in the groff font file is the product of MULTIPLIER and the
+width in the tfm file. */
+
+#define RES 57816
+#define RES_7227 (RES/7227)
+#define UNITWIDTH 131072
+#define SIZESCALE 100
+#define MULTIPLIER 1
+
+class dvi_font : public font {
+ dvi_font(const char *);
+public:
+ int checksum;
+ int design_size;
+ ~dvi_font();
+ void handle_unknown_font_command(const char *command, const char *arg,
+ const char *filename, int lineno);
+ static dvi_font *load_dvi_font(const char *);
+};
+
+dvi_font *dvi_font::load_dvi_font(const char *s)
+{
+ dvi_font *f = new dvi_font(s);
+ if (!f->load()) {
+ delete f;
+ return 0;
+ }
+ return f;
+}
+
+dvi_font::dvi_font(const char *nm)
+: font(nm), checksum(0), design_size(0)
+{
+}
+
+dvi_font::~dvi_font()
+{
+}
+
+void dvi_font::handle_unknown_font_command(const char *command,
+ const char *arg,
+ const char *filename, int lineno)
+{
+ char *ptr;
+ if (strcmp(command, "checksum") == 0) {
+ if (arg == 0)
+ fatal_with_file_and_line(filename, lineno,
+ "'checksum' command requires an argument");
+ checksum = int(strtol(arg, &ptr, 10));
+ if (checksum == 0 && ptr == arg) {
+ fatal_with_file_and_line(filename, lineno, "bad checksum");
+ }
+ }
+ else if (strcmp(command, "designsize") == 0) {
+ if (arg == 0)
+ fatal_with_file_and_line(filename, lineno,
+ "'designsize' command requires an argument");
+ design_size = int(strtol(arg, &ptr, 10));
+ if (design_size == 0 && ptr == arg) {
+ fatal_with_file_and_line(filename, lineno, "bad design size");
+ }
+ }
+}
+
+#define FONTS_MAX 256
+
+struct output_font {
+ dvi_font *f;
+ int point_size;
+ output_font() : f(0) { }
+};
+
+class dvi_printer : public printer {
+ FILE *fp;
+ int max_drift;
+ int byte_count;
+ int last_bop;
+ int page_count;
+ int cur_h;
+ int cur_v;
+ int end_h;
+ int max_h;
+ int max_v;
+ output_font output_font_table[FONTS_MAX];
+ font *cur_font;
+ int cur_point_size;
+ color cur_color;
+ int pushed;
+ int pushed_h;
+ int pushed_v;
+ int have_pushed;
+ void preamble();
+ void postamble();
+ void define_font(int);
+ void set_font(int);
+ void possibly_begin_line();
+ void set_color(color *);
+protected:
+ enum {
+ id_byte = 2,
+ set1 = 128,
+ put1 = 133,
+ put_rule = 137,
+ bop = 139,
+ eop = 140,
+ push = 141,
+ pop = 142,
+ right1 = 143,
+ down1 = 157,
+ fnt_num_0 = 171,
+ fnt1 = 235,
+ xxx1 = 239,
+ fnt_def1 = 243,
+ pre = 247,
+ post = 248,
+ post_post = 249,
+ filler = 223
+ };
+ int line_thickness;
+
+ void out1(int);
+ void out2(int);
+ void out3(int);
+ void out4(int);
+ void moveto(int, int);
+ void out_string(const char *);
+ void out_signed(unsigned char, int);
+ void out_unsigned(unsigned char, int);
+ void do_special(const char *);
+public:
+ dvi_printer();
+ ~dvi_printer();
+ font *make_font(const char *);
+ void begin_page(int);
+ void end_page(int);
+ void set_char(glyph *, font *, const environment *, int, const char *);
+ void special(char *, const environment *, char);
+ void end_of_line();
+ void draw(int, int *, int, const environment *);
+};
+
+
+class draw_dvi_printer : public dvi_printer {
+ int output_pen_size;
+ void set_line_thickness(const environment *);
+ void fill_next(const environment *);
+public:
+ draw_dvi_printer();
+ ~draw_dvi_printer();
+ void draw(int code, int *p, int np, const environment *env);
+ void end_page(int);
+};
+
+dvi_printer::dvi_printer()
+: fp(stdout), byte_count(0), last_bop(-1), page_count(0), max_h(0), max_v(0),
+ cur_font(0), cur_point_size(-1), pushed(0), line_thickness(-1)
+{
+ if (font::res != RES)
+ fatal("resolution must be %1", RES);
+ if (font::unitwidth != UNITWIDTH)
+ fatal("unitwidth must be %1", UNITWIDTH);
+ if (font::hor != 1)
+ fatal("hor must be equal to 1");
+ if (font::vert != 1)
+ fatal("vert must be equal to 1");
+ if (font::sizescale != SIZESCALE)
+ fatal("sizescale must be equal to %1", SIZESCALE);
+ max_drift = font::res/1000; // this is fairly arbitrary
+ preamble();
+}
+
+dvi_printer::~dvi_printer()
+{
+ postamble();
+}
+
+
+draw_dvi_printer::draw_dvi_printer()
+: output_pen_size(-1)
+{
+}
+
+draw_dvi_printer::~draw_dvi_printer()
+{
+}
+
+
+void dvi_printer::out1(int n)
+{
+ byte_count += 1;
+ putc(n & 0xff, fp);
+}
+
+void dvi_printer::out2(int n)
+{
+ byte_count += 2;
+ putc((n >> 8) & 0xff, fp);
+ putc(n & 0xff, fp);
+}
+
+void dvi_printer::out3(int n)
+{
+ byte_count += 3;
+ putc((n >> 16) & 0xff, fp);
+ putc((n >> 8) & 0xff, fp);
+ putc(n & 0xff, fp);
+}
+
+void dvi_printer::out4(int n)
+{
+ byte_count += 4;
+ putc((n >> 24) & 0xff, fp);
+ putc((n >> 16) & 0xff, fp);
+ putc((n >> 8) & 0xff, fp);
+ putc(n & 0xff, fp);
+}
+
+void dvi_printer::out_string(const char *s)
+{
+ out1(strlen(s));
+ while (*s != 0)
+ out1(*s++);
+}
+
+
+void dvi_printer::end_of_line()
+{
+ if (pushed) {
+ out1(pop);
+ pushed = 0;
+ cur_h = pushed_h;
+ cur_v = pushed_v;
+ }
+}
+
+void dvi_printer::possibly_begin_line()
+{
+ if (!pushed) {
+ have_pushed = pushed = 1;
+ pushed_h = cur_h;
+ pushed_v = cur_v;
+ out1(push);
+ }
+}
+
+int scale(int x, int z)
+{
+ int sw;
+ int a, b, c, d;
+ int alpha, beta;
+ alpha = 16*z; beta = 16;
+ while (z >= 040000000L) {
+ z /= 2; beta /= 2;
+ }
+ d = x & 255;
+ c = (x >> 8) & 255;
+ b = (x >> 16) & 255;
+ a = (x >> 24) & 255;
+ sw = (((((d * z) / 0400) + (c * z)) / 0400) + (b * z)) / beta;
+ if (a == 255)
+ sw -= alpha;
+ else
+ assert(a == 0);
+ return sw;
+}
+
+void dvi_printer::set_color(color *col)
+{
+ cur_color = *col;
+ char buf[256];
+ unsigned int components[4];
+ color_scheme cs = col->get_components(components);
+ switch (cs) {
+ case DEFAULT:
+ sprintf(buf, "color gray 0");
+ break;
+ case RGB:
+ sprintf(buf, "color rgb %.3g %.3g %.3g",
+ double(Red) / double(color::MAX_COLOR_VAL),
+ double(Green) / double(color::MAX_COLOR_VAL),
+ double(Blue) / double(color::MAX_COLOR_VAL));
+ break;
+ case CMY:
+ col->get_cmyk(&Cyan, &Magenta, &Yellow, &Black);
+ // fall through
+ case CMYK:
+ sprintf(buf, "color cmyk %.3g %.3g %.3g %.3g",
+ double(Cyan) / double(color::MAX_COLOR_VAL),
+ double(Magenta) / double(color::MAX_COLOR_VAL),
+ double(Yellow) / double(color::MAX_COLOR_VAL),
+ double(Black) / double(color::MAX_COLOR_VAL));
+ break;
+ case GRAY:
+ sprintf(buf, "color gray %.3g",
+ double(Gray) / double(color::MAX_COLOR_VAL));
+ break;
+ }
+ do_special(buf);
+}
+
+void dvi_printer::set_char(glyph *g, font *f, const environment *env,
+ int w, const char *)
+{
+ if (*env->col != cur_color)
+ set_color(env->col);
+ int code = f->get_code(g);
+ if (env->size != cur_point_size || f != cur_font) {
+ cur_font = f;
+ cur_point_size = env->size;
+ int i;
+ for (i = 0;; i++) {
+ if (i >= FONTS_MAX) {
+ fatal("too many output fonts required");
+ }
+ if (output_font_table[i].f == 0) {
+ output_font_table[i].f = (dvi_font *)cur_font;
+ output_font_table[i].point_size = cur_point_size;
+ define_font(i);
+ }
+ if (output_font_table[i].f == cur_font
+ && output_font_table[i].point_size == cur_point_size)
+ break;
+ }
+ set_font(i);
+ }
+ int distance = env->hpos - cur_h;
+ if (env->hpos != end_h && distance != 0) {
+ out_signed(right1, distance);
+ cur_h = env->hpos;
+ }
+ else if (distance > max_drift) {
+ out_signed(right1, distance - max_drift);
+ cur_h = env->hpos - max_drift;
+ }
+ else if (distance < -max_drift) {
+ out_signed(right1, distance + max_drift);
+ cur_h = env->hpos + max_drift;
+ }
+ if (env->vpos != cur_v) {
+ out_signed(down1, env->vpos - cur_v);
+ cur_v = env->vpos;
+ }
+ possibly_begin_line();
+ end_h = env->hpos + w;
+ cur_h += scale(f->get_width(g, UNITWIDTH) / MULTIPLIER,
+ cur_point_size * RES_7227);
+ if (cur_h > max_h)
+ max_h = cur_h;
+ if (cur_v > max_v)
+ max_v = cur_v;
+ if (code >= 0 && code <= 127)
+ out1(code);
+ else
+ out_unsigned(set1, code);
+}
+
+void dvi_printer::define_font(int i)
+{
+ out_unsigned(fnt_def1, i);
+ dvi_font *f = output_font_table[i].f;
+ out4(f->checksum);
+ out4(output_font_table[i].point_size*RES_7227);
+ out4(int((double(f->design_size)/(1<<20))*RES_7227*100 + .5));
+ const char *nm = f->get_internal_name();
+ out1(0);
+ out_string(nm);
+}
+
+void dvi_printer::set_font(int i)
+{
+ if (i >= 0 && i <= 63)
+ out1(fnt_num_0 + i);
+ else
+ out_unsigned(fnt1, i);
+}
+
+void dvi_printer::out_signed(unsigned char base, int param)
+{
+ if (-128 <= param && param < 128) {
+ out1(base);
+ out1(param);
+ }
+ else if (-32768 <= param && param < 32768) {
+ out1(base+1);
+ out2(param);
+ }
+ else if (-(1 << 23) <= param && param < (1 << 23)) {
+ out1(base+2);
+ out3(param);
+ }
+ else {
+ out1(base+3);
+ out4(param);
+ }
+}
+
+void dvi_printer::out_unsigned(unsigned char base, int param)
+{
+ if (param >= 0) {
+ if (param < 256) {
+ out1(base);
+ out1(param);
+ }
+ else if (param < 65536) {
+ out1(base+1);
+ out2(param);
+ }
+ else if (param < (1 << 24)) {
+ out1(base+2);
+ out3(param);
+ }
+ else {
+ out1(base+3);
+ out4(param);
+ }
+ }
+ else {
+ out1(base+3);
+ out4(param);
+ }
+}
+
+void dvi_printer::preamble()
+{
+ out1(pre);
+ out1(id_byte);
+ out4(254000);
+ out4(font::res);
+ out4(1000);
+ out1(0);
+}
+
+void dvi_printer::postamble()
+{
+ int tem = byte_count;
+ out1(post);
+ out4(last_bop);
+ out4(254000);
+ out4(font::res);
+ out4(1000);
+ out4(max_v);
+ out4(max_h);
+ out2(have_pushed); // stack depth
+ out2(page_count);
+ int i;
+ for (i = 0; i < FONTS_MAX && output_font_table[i].f != 0; i++)
+ define_font(i);
+ out1(post_post);
+ out4(tem);
+ out1(id_byte);
+ for (i = 0; i < 4 || byte_count % 4 != 0; i++)
+ out1(filler);
+}
+
+void dvi_printer::begin_page(int i)
+{
+ page_count++;
+ int tem = byte_count;
+ out1(bop);
+ out4(i);
+ for (int j = 1; j < 10; j++)
+ out4(0);
+ out4(last_bop);
+ last_bop = tem;
+ // By convention position (0,0) in a dvi file is placed at (1in, 1in).
+ cur_h = font::res;
+ cur_v = font::res;
+ end_h = 0;
+ if (page_count == 1) {
+ char buf[256];
+ // at least dvips uses this
+ double length = user_paper_length ? user_paper_length :
+ double(font::paperlength) / font::res;
+ double width = user_paper_width ? user_paper_width :
+ double(font::paperwidth) / font::res;
+ if (width > 0 && length > 0) {
+ sprintf(buf, "papersize=%.3fin,%.3fin",
+ landscape_flag ? length : width,
+ landscape_flag ? width : length);
+ do_special(buf);
+ }
+ }
+ if (cur_color != default_color)
+ set_color(&cur_color);
+}
+
+void dvi_printer::end_page(int)
+{
+ set_color(&default_color);
+ if (pushed)
+ end_of_line();
+ out1(eop);
+ cur_font = 0;
+}
+
+void draw_dvi_printer::end_page(int len)
+{
+ dvi_printer::end_page(len);
+ output_pen_size = -1;
+}
+
+void dvi_printer::do_special(const char *s)
+{
+ int len = strlen(s);
+ if (len == 0)
+ return;
+ possibly_begin_line();
+ out_unsigned(xxx1, len);
+ while (*s)
+ out1(*s++);
+}
+
+void dvi_printer::special(char *arg, const environment *env, char type)
+{
+ if (type != 'p')
+ return;
+ moveto(env->hpos, env->vpos);
+ do_special(arg);
+}
+
+void dvi_printer::moveto(int h, int v)
+{
+ if (h != cur_h) {
+ out_signed(right1, h - cur_h);
+ cur_h = h;
+ if (cur_h > max_h)
+ max_h = cur_h;
+ }
+ if (v != cur_v) {
+ out_signed(down1, v - cur_v);
+ cur_v = v;
+ if (cur_v > max_v)
+ max_v = cur_v;
+ }
+ end_h = 0;
+}
+
+void dvi_printer::draw(int code, int *p, int np, const environment *env)
+{
+ if (code == 'l') {
+ int x = 0, y = 0;
+ int height = 0, width = 0;
+ int thickness;
+ if (line_thickness < 0)
+ thickness = env->size*RES_7227*linewidth/1000;
+ else if (line_thickness > 0)
+ thickness = line_thickness;
+ else
+ thickness = 1;
+ if (np != 2) {
+ error("2 arguments required for line");
+ }
+ else if (p[0] == 0) {
+ // vertical rule
+ if (p[1] > 0) {
+ x = env->hpos - thickness/2;
+ y = env->vpos + p[1] + thickness/2;
+ height = p[1] + thickness;
+ width = thickness;
+ }
+ else if (p[1] < 0) {
+ x = env->hpos - thickness/2;
+ y = env->vpos + thickness/2;
+ height = thickness - p[1];
+ width = thickness;
+ }
+ }
+ else if (p[1] == 0) {
+ if (p[0] > 0) {
+ x = env->hpos - thickness/2;
+ y = env->vpos + thickness/2;
+ height = thickness;
+ width = p[0] + thickness;
+ }
+ else if (p[0] < 0) {
+ x = env->hpos - p[0] - thickness/2;
+ y = env->vpos + thickness/2;
+ height = thickness;
+ width = thickness - p[0];
+ }
+ }
+ if (height != 0) {
+ moveto(x, y);
+ out1(put_rule);
+ out4(height);
+ out4(width);
+ }
+ }
+ else if (code == 't') {
+ if (np == 0) {
+ line_thickness = -1;
+ }
+ else {
+ // troff gratuitously adds an extra 0
+ if (np != 1 && np != 2)
+ error("0 or 1 argument required for thickness");
+ else
+ line_thickness = p[0];
+ }
+ }
+ else if (code == 'R') {
+ if (np != 2)
+ error("2 arguments required for rule");
+ else if (p[0] != 0 || p[1] != 0) {
+ int dh = p[0];
+ int dv = p[1];
+ int oh = env->hpos;
+ int ov = env->vpos;
+ if (dv > 0) {
+ ov += dv;
+ dv = -dv;
+ }
+ if (dh < 0) {
+ oh += dh;
+ dh = -dh;
+ }
+ moveto(oh, ov);
+ out1(put_rule);
+ out4(-dv);
+ out4(dh);
+ }
+ }
+}
+
+// XXX Will this overflow?
+
+inline int milliinches(int n)
+{
+ return (n*1000 + font::res/2)/font::res;
+}
+
+void draw_dvi_printer::set_line_thickness(const environment *env)
+{
+ int desired_pen_size
+ = milliinches(line_thickness < 0
+ // Will this overflow?
+ ? env->size*RES_7227*linewidth/1000
+ : line_thickness);
+ if (desired_pen_size != output_pen_size) {
+ char buf[256];
+ sprintf(buf, "pn %d", desired_pen_size);
+ do_special(buf);
+ output_pen_size = desired_pen_size;
+ }
+}
+
+void draw_dvi_printer::fill_next(const environment *env)
+{
+ unsigned int g;
+ if (env->fill->is_default())
+ g = 0;
+ else {
+ // currently, only BW support
+ env->fill->get_gray(&g);
+ }
+ char buf[256];
+ sprintf(buf, "sh %.3g", 1 - double(g) / double(color::MAX_COLOR_VAL));
+ do_special(buf);
+}
+
+void draw_dvi_printer::draw(int code, int *p, int np, const environment *env)
+{
+ char buf[1024];
+ int fill_flag = 0;
+ switch (code) {
+ case 'C':
+ fill_flag = 1;
+ // fall through
+ case 'c':
+ {
+ // troff adds an extra argument to C
+ if (np != 1 && !(code == 'C' && np == 2)) {
+ error("1 argument required for circle");
+ break;
+ }
+ moveto(env->hpos+p[0]/2, env->vpos);
+ if (fill_flag)
+ fill_next(env);
+ else
+ set_line_thickness(env);
+ int rad;
+ rad = milliinches(p[0]/2);
+ sprintf(buf, "%s 0 0 %d %d 0 6.28319",
+ (fill_flag ? "ia" : "ar"),
+ rad,
+ rad);
+ do_special(buf);
+ break;
+ }
+ case 'l':
+ if (np != 2) {
+ error("2 arguments required for line");
+ break;
+ }
+ moveto(env->hpos, env->vpos);
+ set_line_thickness(env);
+ do_special("pa 0 0");
+ sprintf(buf, "pa %d %d", milliinches(p[0]), milliinches(p[1]));
+ do_special(buf);
+ do_special("fp");
+ break;
+ case 'E':
+ fill_flag = 1;
+ // fall through
+ case 'e':
+ if (np != 2) {
+ error("2 arguments required for ellipse");
+ break;
+ }
+ moveto(env->hpos+p[0]/2, env->vpos);
+ if (fill_flag)
+ fill_next(env);
+ else
+ set_line_thickness(env);
+ sprintf(buf, "%s 0 0 %d %d 0 6.28319",
+ (fill_flag ? "ia" : "ar"),
+ milliinches(p[0]/2),
+ milliinches(p[1]/2));
+ do_special(buf);
+ break;
+ case 'P':
+ fill_flag = 1;
+ // fall through
+ case 'p':
+ {
+ if (np & 1) {
+ error("even number of arguments required for polygon");
+ break;
+ }
+ if (np == 0) {
+ error("no arguments for polygon");
+ break;
+ }
+ moveto(env->hpos, env->vpos);
+ if (fill_flag)
+ fill_next(env);
+ else
+ set_line_thickness(env);
+ do_special("pa 0 0");
+ int h = 0, v = 0;
+ for (int i = 0; i < np; i += 2) {
+ h += p[i];
+ v += p[i+1];
+ sprintf(buf, "pa %d %d", milliinches(h), milliinches(v));
+ do_special(buf);
+ }
+ do_special("pa 0 0");
+ do_special(fill_flag ? "ip" : "fp");
+ break;
+ }
+ case '~':
+ {
+ if (np & 1) {
+ error("even number of arguments required for spline");
+ break;
+ }
+ if (np == 0) {
+ error("no arguments for spline");
+ break;
+ }
+ moveto(env->hpos, env->vpos);
+ set_line_thickness(env);
+ do_special("pa 0 0");
+ int h = 0, v = 0;
+ for (int i = 0; i < np; i += 2) {
+ h += p[i];
+ v += p[i+1];
+ sprintf(buf, "pa %d %d", milliinches(h), milliinches(v));
+ do_special(buf);
+ }
+ do_special("sp");
+ break;
+ }
+ case 'a':
+ {
+ if (np != 4) {
+ error("4 arguments required for arc");
+ break;
+ }
+ set_line_thickness(env);
+ double c[2];
+ if (adjust_arc_center(p, c)) {
+ int rad = milliinches(int(sqrt(c[0]*c[0] + c[1]*c[1]) + .5));
+ moveto(env->hpos + int(c[0]), env->vpos + int(c[1]));
+ double start = atan2(p[1] + p[3] - c[1], p[0] + p[2] - c[0]);
+ double end = atan2(-c[1], -c[0]);
+ if (end - start < 0)
+ start -= 2 * 3.14159265358;
+ sprintf(buf, "ar 0 0 %d %d %f %f", rad, rad, start, end);
+ do_special(buf);
+ }
+ else {
+ moveto(env->hpos, env->vpos);
+ do_special("pa 0 0");
+ sprintf(buf,
+ "pa %d %d",
+ milliinches(p[0] + p[2]),
+ milliinches(p[1] + p[3]));
+ do_special(buf);
+ do_special("fp");
+ }
+ break;
+ }
+ case 't':
+ {
+ if (np == 0) {
+ line_thickness = -1;
+ }
+ else {
+ // troff gratuitously adds an extra 0
+ if (np != 1 && np != 2) {
+ error("0 or 1 argument required for thickness");
+ break;
+ }
+ line_thickness = p[0];
+ }
+ break;
+ }
+ case 'R':
+ {
+ if (np != 2) {
+ error("2 arguments required for rule");
+ break;
+ }
+ int dh = p[0];
+ if (dh == 0)
+ break;
+ int dv = p[1];
+ if (dv == 0)
+ break;
+ int oh = env->hpos;
+ int ov = env->vpos;
+ if (dv > 0) {
+ ov += dv;
+ dv = -dv;
+ }
+ if (dh < 0) {
+ oh += dh;
+ dh = -dh;
+ }
+ moveto(oh, ov);
+ out1(put_rule);
+ out4(-dv);
+ out4(dh);
+ break;
+ }
+ default:
+ error("unrecognised drawing command '%1'", char(code));
+ break;
+ }
+}
+
+font *dvi_printer::make_font(const char *nm)
+{
+ return dvi_font::load_dvi_font(nm);
+}
+
+printer *make_printer()
+{
+ if (draw_flag)
+ return new draw_dvi_printer;
+ else
+ return new dvi_printer;
+}
+
+static void usage(FILE *stream);
+
+int main(int argc, char **argv)
+{
+ setlocale(LC_NUMERIC, "C");
+ program_name = argv[0];
+ static char stderr_buf[BUFSIZ];
+ setbuf(stderr, stderr_buf);
+ int c;
+ static const struct option long_options[] = {
+ { "help", no_argument, 0, CHAR_MAX + 1 },
+ { "version", no_argument, 0, 'v' },
+ { NULL, 0, 0, 0 }
+ };
+ while ((c = getopt_long(argc, argv, "dF:I:lp:vw:", long_options, NULL))
+ != EOF)
+ switch(c) {
+ case 'd':
+ draw_flag = 0;
+ break;
+ case 'l':
+ landscape_flag = 1;
+ break;
+ case 'F':
+ font::command_line_font_dir(optarg);
+ break;
+ case 'I':
+ // ignore include search path
+ break;
+ case 'p':
+ if (!font::scan_papersize(optarg, 0,
+ &user_paper_length, &user_paper_width))
+ error("ignoring invalid paper format '%1'", optarg);
+ break;
+ case 'v':
+ {
+ printf("GNU grodvi (groff) version %s\n", Version_string);
+ exit(0);
+ break;
+ }
+ case 'w':
+ if (sscanf(optarg, "%d", &linewidth) != 1
+ || linewidth < 0 || linewidth > 1000) {
+ error("invalid line width '%1' ignored", optarg);
+ linewidth = DEFAULT_LINEWIDTH;
+ }
+ break;
+ case CHAR_MAX + 1: // --help
+ usage(stdout);
+ exit(0);
+ break;
+ case '?':
+ usage(stderr);
+ exit(1);
+ break;
+ default:
+ assert(0);
+ }
+ SET_BINARY(fileno(stdout));
+ if (optind >= argc)
+ do_file("-");
+ else {
+ for (int i = optind; i < argc; i++)
+ do_file(argv[i]);
+ }
+ return 0;
+}
+
+static void usage(FILE *stream)
+{
+ fprintf(stream,
+"usage: %s [-dl] [-F dir] [-p paper-format] [-w n] [file ...]\n"
+"usage: %s {-v | --version}\n"
+"usage: %s --help\n",
+ program_name, program_name, program_name);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/devices/grodvi/grodvi.1.man b/src/devices/grodvi/grodvi.1.man
new file mode 100644
index 0000000..05cbe0d
--- /dev/null
+++ b/src/devices/grodvi/grodvi.1.man
@@ -0,0 +1,633 @@
+.TH grodvi @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+grodvi \-
+.I groff
+output driver for TeX DVI format
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2020, 2022 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_grodvi_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.ie t .ds tx T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X
+.el .ds tx TeX
+.
+.\" This macro definition is poor style from a portability standpoint,
+.\" but it's a good test and demonstration of the standard font
+.\" repertoire for the devices where it has any effect at all, and so
+.\" should be retained.
+.de FT
+. if '\\*(.T'dvi' .ft \\$1
+..
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY grodvi
+.RB [ \-dl ]
+.RB [ \-F\~\c
+.IR dir ]
+.RB [ \-p\~\c
+.IR paper-format ]
+.RB [ \-w\~\c
+.IR n ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY grodvi
+.B \-\-help
+.YS
+.
+.
+.SY grodvi
+.B \-v
+.
+.SY grodvi
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The GNU
+.I roff
+DVI output driver translates the output of
+.MR @g@troff @MAN1EXT@
+into \*[tx] DVI format.
+.
+Normally,
+.I grodvi
+is invoked by
+.MR groff @MAN1EXT@
+when the latter is given the
+.RB \[lq] \-T\~dvi \[rq]
+option.
+.
+(In this installation,
+.B @DEVICE@
+is the default output device.)
+.
+Use
+.IR groff 's
+.B \-P
+option to pass any options shown above to
+.IR grodvi .
+.
+If no
+.I file
+arguments are given,
+or if
+.I file
+is \[lq]\-\[rq],
+.I grodvi
+reads the standard input stream.
+.
+Output is written to the standard output stream.
+.
+.
+.P
+The DVI file generated by
+.I grodvi
+can interpreted by any correctly written DVI driver.
+.
+.I troff \" generic
+drawing primitives are implemented using
+.I tpic
+version\~2 specials.
+.
+If the driver does not support these,
+.B \[rs]D
+escape sequences will not produce any output.
+.
+.
+.P
+Encapsulated PostScript (EPS) files can be easily included;
+use the
+.B PSPIC
+macro.
+.
+.I pspic.tmac
+is loaded automatically by
+.IR dvi.tmac .
+.
+See
+.MR groff_tmac @MAN5EXT@ .
+.
+.
+.P
+The default color used by the
+.B \[rs]m
+and
+.B \[rs]M
+escape sequences is black.
+.
+Currently,
+the stroke color for
+.B \[rs]D
+drawing escape sequences is black;
+fill color values are translated to gray.
+.
+.
+.P
+In
+.IR groff ,
+as in AT&T
+.IR troff , \" AT&T
+the
+.B \[rs]N
+escape sequence can be used to access any glyph in the current font by
+its position in the corresponding TFM file.
+.
+.
+.P
+By design,
+the DVI format doesn't care about the physical dimensions of the output
+medium.
+.
+Instead,
+.I grodvi
+emits the equivalent to \*[tx]'s
+.BI \%\[rs]special{\:\%papersize= width , length }
+on the first page;
+.I dvips
+(or another DVI driver)
+then sets the page size accordingly.
+.
+If either the page width or length is not positive,
+no
+.B \%papersize
+special is output.
+.
+.
+.P
+A device control escape sequence
+.BI \[rs]X\[aq] anything \[aq]
+is translated to the same DVI file instructions as would be produced by
+.BI \%\[rs]special{ anything }
+in \*[tx];
+.I anything
+cannot contain a newline.
+.
+.
+.\" ====================================================================
+.SS Typefaces
+.\" ====================================================================
+.
+.I grodvi
+supports the standard four styles:
+.B R
+(roman),
+.B I
+.RI ( italic ),
+.B B
+.RB ( bold ),
+and
+.B BI
+(\f[BI]bold-italic\f[]).
+.
+Fonts are grouped into families
+.B T
+and
+.B H
+having members in each style.
+.
+\[lq]CM\[rq] abbreviates \[lq]Computer Modern\[rq].
+.
+.
+.RS
+.TP
+.B TR
+.FT TR
+CM Roman (cmr10)
+.FT
+.
+.TQ
+.B TI
+.FT TI
+CM Text Italic (cmti10)
+.FT
+.
+.TQ
+.B TB
+.FT TB
+CM Bold Extended Roman (cmbx10)
+.FT
+.
+.TQ
+.B TBI
+.FT TBI
+CM Bold Extended Text Italic (cmbxti10)
+.FT
+.
+.TQ
+.B HR
+.FT HR
+CM Sans Serif (cmss10)
+.FT
+.
+.TQ
+.B HI
+.FT HI
+CM Slanted Sans Serif (cmssi10)
+.FT
+.
+.TQ
+.B HB
+.FT HB
+CM Sans Serif Bold Extended (cmssbx10)
+.FT
+.
+.TQ
+.B HBI
+.FT HBI
+CM Slanted Sans Serif Bold Extended (cmssbxo10)
+.FT
+.RE
+.
+.
+.LP
+The following fonts are not members of a family.
+.
+.
+.RS
+.TP
+.B CW
+.FT CW
+CM Typewriter Text (cmtt10)
+.FT
+.
+.TQ
+.B CWI
+.FT CWI
+CM Italic Typewriter Text (cmitt10)
+.FT
+.RE
+.
+.
+.P
+Special fonts include
+.B MI
+(cmmi10),
+.B S
+(cmsy10),
+.B EX
+(cmex10),
+.B SC
+(cmtex10,
+only for
+.BR CW ),
+and,
+perhaps surprisingly,
+.BR TR ,
+.BR TI ,
+and
+.BR CW ,
+.\" See font/devdvi/generate/Makefile for details.
+because \*[tx] places some glyphs in text fonts that
+.I troff \" generic
+generally does not.
+.
+For italic fonts,
+.B CWI
+is used instead of
+.BR CW .
+.
+.
+.P
+Finally,
+the symbol fonts of the American Mathematical Society are available as
+special fonts
+.B SA
+(msam10) and
+.B SB
+(msbm10).
+.
+They are are not mounted by default.
+.
+.
+.br
+.ne 2v
+.P
+The
+.I @g@troff
+option
+.B \-mec
+loads the
+.I ec.tmac
+macro file,
+employing the EC and TC fonts instead of CM.
+.
+These are designed similarly to the Computer Modern fonts;
+further,
+they provide Euro
+.B \[rs][Eu]
+and per mille
+.B \[rs][%0]
+glyphs.
+.
+.I ec.tmac
+must be loaded before any language-specific macro files because it does
+not set up the codes necessary for automatic hyphenation.
+.
+.
+.\" ====================================================================
+.SS "Font description files"
+.\" ====================================================================
+.
+Use
+.MR tfmtodit @MAN1EXT@
+to create
+.I groff
+font description files from TFM
+(\*[tx] font metrics)
+files.
+.
+The font description file should contain the following additional
+directives,
+which
+.I tfmtodit
+generates automatically.
+.
+.
+.TP
+.BI internalname\~ name
+The name of the TFM file
+(without the
+.I .tfm
+extension) is
+.IR name .
+.
+.
+.TP
+.BI checksum\~ n
+The checksum in the TFM file is
+.IR n .
+.
+.
+.TP
+.BI designsize\~ n
+The design size in the TFM file is
+.IR n .
+.
+.
+.\" ====================================================================
+.SS "Drawing commands"
+.\" ====================================================================
+.
+.I grodvi
+supports an additional drawing command.
+.
+.
+.TP
+.BI \[rs]D\[aq]R\~ "dh dv" \[aq]
+Draw a rule
+(solid black rectangle)
+with one corner at the drawing position,
+and the diagonally opposite corner at the drawing position
+.RI +( dh , dv ),
+which becomes the new drawing position afterward.
+.
+This command produces a rule in the DVI file and so can be printed even
+with a driver that does not support
+.I tpic
+specials,
+unlike the other
+.B \[rs]D
+commands.
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.B \-d
+Do not use
+.I tpic
+specials to implement drawing commands.
+.
+Horizontal and vertical lines are implemented by rules.
+.
+Other drawing commands are ignored.
+.
+.
+.TP
+.BI \-F\~ dir
+Prepend directory
+.RI dir /dev name
+to the search path for font and device description files;
+.I name
+is the name of the device,
+usually
+.BR dvi .
+.
+.
+.TP
+.B \-l
+Use landscape orientation rather than portrait.
+.
+.
+.TP
+.BI \-p\~ paper-format
+Set physical dimensions of output medium,
+overriding the
+.BR \%papersize ,
+.BR \%paperlength ,
+and
+.B \%paperwidth
+directives in the
+.I DESC
+file.
+.
+.I paper-format
+can be any argument accepted by the
+.B \%papersize
+directive;
+see
+.MR groff_font @MAN5EXT@ .
+.
+.
+.TP
+.BI \-w\~ n
+Draw rules (lines) with a thickness of
+.IR n \~thousandths
+of an em.
+.
+The default thickness is
+.B 40
+(0.04\~em).
+.
+.
+.\" ====================================================================
+.SH Environment
+.\" ====================================================================
+.
+.TP
+.I GROFF_FONT_PATH
+lists directories in which to search for
+.IR devdvi ,
+.IR grodvi 's
+directory of device and font description files.
+.
+See
+.MR @g@troff @MAN1EXT@
+and
+.MR groff_font @MAN5EXT@ .
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @FONTDIR@/\:\%devdvi/\:DESC
+describes the
+.B dvi
+output device.
+.
+.
+.TP
+.IR @FONTDIR@/\:\%devdvi/ F
+describes the font known
+.RI as\~ F
+on device
+.BR dvi .
+.
+.
+.TP
+.I @MACRODIR@/\:dvi\:.tmac
+defines font mappings,
+special characters,
+and colors for use with the
+.B dvi
+output device.
+.
+It is automatically loaded by
+.I \%troffrc
+when the
+.B dvi
+output device is selected.
+.
+.
+.TP
+.I @MACRODIR@/\:ec\:.tmac
+configures the
+.B dvi
+output device to use
+the EC and TC font families instead of CM
+(Computer Modern).
+.
+.
+.\" ====================================================================
+.SH Bugs
+.\" ====================================================================
+.
+DVI files produced by
+.I grodvi
+use a different resolution
+(57,816 units per inch)
+from those produced by \*[tx].
+.
+Incorrectly written drivers which assume the resolution used by \*[tx],
+rather than using the resolution specified in the DVI file,
+will not work with
+.IR grodvi .
+.
+.
+.LP
+When using the
+.B \-d
+option with boxed tables,
+vertical and horizontal lines can sometimes protrude by one pixel.
+.
+This is a consequence of the way \*[tx] requires that the heights
+and widths of rules be rounded.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.UR https://\:texfaq\:.org/\:FAQ\-\:ECfonts
+\[lq]What are the EC fonts?\[rq]
+.UE ;
+\*[tx] FAQ: Frequently Asked Question List for \*[tx]
+.
+.
+.P
+.MR tfmtodit @MAN1EXT@ ,
+.MR groff @MAN1EXT@ ,
+.MR @g@troff @MAN1EXT@ ,
+.MR groff_out @MAN5EXT@ ,
+.MR groff_font @MAN5EXT@ ,
+.MR groff_char @MAN7EXT@ ,
+.MR groff_tmac @MAN5EXT@
+.
+.
+.\" Clean up.
+.rm FT
+.rm tx
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_grodvi_1_man_C]
+.do rr *groff_grodvi_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/devices/grodvi/grodvi.am b/src/devices/grodvi/grodvi.am
new file mode 100644
index 0000000..ce93359
--- /dev/null
+++ b/src/devices/grodvi/grodvi.am
@@ -0,0 +1,32 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+bin_PROGRAMS += grodvi
+grodvi_SOURCES = src/devices/grodvi/dvi.cpp
+grodvi_LDADD = \
+ libdriver.a \
+ libgroff.a \
+ lib/libgnu.a $(LIBM)
+man1_MANS += src/devices/grodvi/grodvi.1
+EXTRA_DIST += src/devices/grodvi/grodvi.1.man
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/devices/grohtml/grohtml.1.man b/src/devices/grohtml/grohtml.1.man
new file mode 100644
index 0000000..2243b47
--- /dev/null
+++ b/src/devices/grohtml/grohtml.1.man
@@ -0,0 +1,731 @@
+.TH grohtml @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+grohtml, post\-grohtml, pre\-grohtml \-
+.I groff
+output driver for HTML
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1999-2022 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_grohtml_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY pre\-grohtml
+.RB [ \-epV ]
+.RB [ \-a
+.IR anti-aliasing-text-bits ]
+.RB [ \-D
+.IR image-directory ]
+.RB [ \-F
+.IR font-directory ]
+.RB [ \-g
+.IR anti-aliasing-graphic-bits ]
+.RB [ \-i
+.IR resolution ]
+.RB [ \-I
+.IR image-stem ]
+.RB [ \-o
+.IR image-vertical-offset ]
+.RB [ \-x
+.IR html-dialect ]
+.I troff-command
+.I troff-argument
+\&.\|.\|.
+.YS
+.
+.
+.SY pre\-grohtml
+.B \-\-help
+.YS
+.
+.
+.SY pre\-grohtml
+.B \-v
+.
+.SY pre\-grohtml
+.B \-\-version
+.YS
+.
+.
+.SY post\-grohtml
+.RB [ \-bCGhlnrVy ]
+.RB [ \-F
+.IR font-directory ]
+.RB [ \-j
+.IR output-stem ]
+.RB [ \-s
+.IR base-point-size ]
+.RB [ \-S
+.IR heading-level ]
+.RB [ \-x
+.IR html-dialect ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY post\-grohtml
+.B \-\-help
+.YS
+.
+.
+.SY post\-grohtml
+.B \-v
+.
+.SY post\-grohtml
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The GNU
+.I roff
+system's HTML support consists of a preprocessor,
+.IR \%pre\-grohtml ,
+and an output driver,
+.IR \%post\-grohtml ;
+together,
+they translate
+.MR roff @MAN7EXT@
+documents to HTML.
+.
+Because a preprocessor is (uniquely) required for this output driver,
+users should invoke
+.I \%grohtml
+via the
+.MR groff @MAN1EXT@
+command with the
+.B \-Thtml
+or
+.B \-Txhtml
+options.
+.
+(In this installation,
+.B @DEVICE@
+is the default output device.)
+.
+Use
+.IR groff 's
+.B \-P
+option to pass any options shown above to
+.IR \%grohtml .
+.
+If no operands are given,
+or if
+.I file
+is
+.RB \[lq] \- \[rq],
+.I \%grohtml
+reads the standard input stream.
+.
+Output is written to the standard output stream.
+.
+.
+.P
+.I \%grohtml
+invokes
+.I groff
+twice.
+.
+In the first pass,
+the preprocessor
+.I \%pre\-grohtml
+renders
+pictures,
+equations,
+and tables as images in PostScript format using the
+.B ps
+output device.
+.
+In the second pass,
+the output driver
+.I \%post\-grohtml
+translates the output of
+.MR @g@troff @MAN1EXT@
+to HTML.
+.
+.
+.P
+.I \%grohtml
+writes output encoded in \%UTF-8 and has built-in HTML entities for all
+non-composite Unicode characters.
+.
+In spite of this,
+.I groff
+may issue warnings about unknown special characters if they can't be
+found during the first pass.
+.
+Such warnings can be safely ignored unless the special characters
+appear inside a table or equation.
+.
+.
+.\" ====================================================================
+.SS Typefaces
+.\" ====================================================================
+.
+.I \%grohtml
+supports the standard four styles:
+.B R
+(roman),
+.B I
+.RI ( italic ),
+.B B
+.RB ( bold ),
+and
+.B BI
+(\f[BI]bold-italic\f[]).
+.
+Fonts are grouped into families
+.B T
+and
+.B C
+having members in each style.
+.
+.
+.RS
+.TP
+.B TR
+Times roman
+.
+.TQ
+.B TI
+Times italic
+.
+.TQ
+.B TB
+Times bold
+.
+.TQ
+.B TBI
+Times bold-italic
+.
+.TQ
+.B CR
+Courier roman
+.
+.TQ
+.B CI
+Courier italic
+.
+.TQ
+.B CB
+Courier bold
+.
+.TQ
+.B CBI
+Courier bold-italic
+.RE
+.
+.
+.P
+A special font,
+.BR S ,
+is also provided to accommodate
+.I roff
+documents that expect it to always be available.
+.
+.
+.\" ====================================================================
+.SS "Font description files"
+.\" ====================================================================
+.
+The font description files used with
+.I \%grohtml
+expose the same glyph repertoire in their
+.B charset
+sections.
+.
+See
+.MR groff_font @MAN5EXT@ .
+.
+.
+.\" ====================================================================
+.SS Dependencies
+.\" ====================================================================
+.
+.I \%pre\-grohtml
+generates an image whenever an
+.I @g@eqn
+equation,
+.I @g@tbl
+table,
+or
+.I @g@pic
+picture is encountered in the input.
+.
+.I \%grohtml
+therefore may run several commands as part of its operation.
+.
+These include the \%Netpbm tools
+.IR \%pnmcrop ,
+.IR \%pnmcut ,
+and
+.IR \%pnmtopng ;
+\%Ghostscript
+.RI ( gs );
+and the \%PSUtils tool
+.IR \%psselect .
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.BI \-a \~anti-aliasing-text-bits
+Number of bits of antialiasing information to be used by text when
+generating PNG images.
+.
+The default
+.RB is\~ 4
+but
+.BR 0 ,
+.BR 1 ,
+and
+.B 2
+are also valid.
+.
+Your system's version of
+.I gs
+must support the
+.B \%\-dTextAlphaBits
+option in order to exploit antialiasing.
+.\" XXX: How antiquated are the ones that don't? Get rid of this?
+.
+A value
+.RB of\~ 0
+stops
+.I \%grohtml
+from issuing antialiasing commands to
+.IR gs .
+.
+.
+.TP
+.B \-b
+Initialize the background color to white.
+.
+.
+.TP
+.B \-C
+Suppress output of \[lq]CreationDate:\[rq] HTML comment.
+.
+.
+.TP
+.BI \-D \~image-directory
+Instruct
+.I \%grohtml
+to place all image files into directory
+.IR image-directory .
+.
+.
+.TP
+.B \-e
+Direct
+.I @g@eqn
+to produce MathML.
+.
+.
+.IP
+This option should not be manually specified;
+it is synthesized by
+.I groff
+depending on whether it was given the
+.B \-Thtml
+or
+.B \-Txhtml
+option.
+.
+.
+.TP
+.BI \-F \~font-directory
+Prepend directory
+.RI font-directory /dev name
+to the search path for font and device description files;
+.I name
+is the name of the device,
+usually
+.BR html .
+.
+.
+.TP
+.BI \-g \~anti-aliasing-graphic-bits
+Number of bits of antialiasing information to be used by graphics when
+generating PNG images.
+.
+The default
+.RB is\~ 4
+but
+.BR 0 ,
+.BR 1 ,
+and
+.B 2
+are also valid.
+.
+Your system's version of
+.I gs
+must support the
+.B \%\-dGraphicAlphaBits
+option in order to exploit antialiasing.
+.\" XXX: How antiquated are the ones that don't? Get rid of this?
+.
+A value
+.RB of\~ 0
+stops
+.I \%grohtml
+from issuing antialiasing commands to
+.IR gs .
+.
+.
+.TP
+.B \-G
+Suppress output of \[lq]Creator:\[rq] HTML comment.
+.
+.
+.TP
+.B \-h
+Generate section headings by using HTML
+.B B
+elements and increasing the font size,
+rather than HTML
+.B H
+elements.
+.
+.
+.TP
+.BI \-i \~resolution
+Set the image resolution in pixels per inch;
+the default
+.RB is\~ 100 .
+.
+.
+.TP
+.BI \-I \~image-stem
+Determine the image file name stem.
+.
+If omitted,
+.I \%grohtml
+uses
+.IR \%grohtml\- XXXXX
+(where
+.I XXXXX
+is the process ID).
+.
+A dash is appended to the stem to separate it from the following image
+number.
+.
+.
+.TP
+.BI \-j \~output-stem
+Instruct
+.I \%grohtml
+to split the HTML output into multiple files.
+.
+Output is written to a new file at each section heading
+(but see option
+.B \-S
+below)
+named
+.IR output-stem\- n .html .
+.
+.
+.TP
+.B \-l
+Turn off the production of automatic section links at the top of the
+document.
+.
+.
+.TP
+.B \-n
+Generate simple heading anchors whenever a section/number heading is
+found.
+.
+Without the option the anchor value is the textual heading.
+.
+This can cause problems when a heading contains a \[lq]?\[rq] on older
+versions of some browsers.
+.
+This feature is automatically enabled if a heading contains an image.
+.
+.
+.TP
+.BI \-o \~image-vertical-offset
+Specify the vertical offset of images in points.
+.
+.
+.TP
+.B \-p
+Display page rendering progress to the standard error stream.
+.
+.I \%grohtml
+displays a page number only when an image is required.
+.
+.
+.TP
+.B \-r
+Turn off the automatic header and footer line
+(HTML rule).
+.
+.
+.TP
+.BI \-s \~base-type-size
+Set the document's base type size in points.
+.
+When this size is used in the source,
+it corresponds to the HTML base type size.
+.
+Every increase of two points in the source will produce a
+.RB \[lq] big \[rq]
+element,
+and conversely when a decrease of two points is seen,
+a
+.RB \[lq] small \[rq]
+element is emitted.
+.
+.
+.TP
+.BI \-S \~heading-level
+When splitting HTML output
+(see option
+.B \-j
+above),
+split at each nested heading level defined by
+.IR heading-level ,
+or higher).
+.
+The default is
+.BR 1 .
+.
+.
+.TP
+.B \-V
+Create an XHTML or HTML validator button at the bottom of each page of
+the document.
+.
+.
+.TP
+.BI \-x \~html-dialect
+Select HTML dialect.
+.
+Currently,
+.I html-dialect
+should be either the
+.RB digit\~ 4
+or the
+.RB letter\~ x ,
+which indicates whether
+.I \%grohtml
+should generate HTML\~4 or XHTML,
+respectively.
+.
+.
+.IP
+This option should not be manually specified;
+it is synthesized by
+.I groff
+depending on whether it was given the
+.B \-Thtml
+or
+.B \-Txhtml
+option.
+.
+.
+.TP
+.B \-y
+Produce a right-aligned
+.I groff
+signature at the end of the document
+(only if
+.B \-V
+is also specified).
+.
+.
+.\" ====================================================================
+.SH Environment
+.\" ====================================================================
+.
+.TP
+.I GROFF_FONT_PATH
+lists directories in which to search for
+.IR devhtml ,
+.IR grohtml 's
+directory of device and font description files.
+.
+See
+.MR @g@troff @MAN1EXT@
+and
+.MR groff_font @MAN5EXT@ .
+.
+.
+.TP
+.I SOURCE_DATE_EPOCH
+A timestamp
+(expressed as seconds since the Unix epoch)
+to use as the output creation timestamp in place of the current time.
+.
+The time is converted to human-readable form using
+.MR ctime 3
+and recorded in an HTML comment.
+.
+.
+.TP
+.I TZ
+The time zone to use when converting the current time
+(or value of
+.IR SOURCE_DATE_EPOCH )
+to human-readable form;
+see
+.MR tzset 3 .
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @FONTDIR@/\:\%devhtml/\:DESC
+describes the
+.B html
+output device.
+.
+.
+.TP
+.IR @FONTDIR@/\:\%devhtml/ F
+describes the font known
+.RI as\~ F
+on device
+.BR html .
+.
+.
+.TP
+.I @MACRODIR@/\:html\:.tmac
+defines font mappings,
+special characters,
+and colors for use with the
+.B html
+output device.
+.
+It is automatically loaded by
+.I \%troffrc
+when either of the
+.B html
+or
+.B xhtml
+output devices is selected.
+.
+.
+.TP
+.I @MACRODIR@/\:html\-end\:.tmac
+finalizes setup of the
+.B html
+output device.
+.
+It is automatically loaded by
+.I \%troffrc\-end
+when either of the
+.B html
+or
+.B xhtml
+output devices is selected.
+.
+.
+.P
+.I \%grohtml
+uses temporary files.
+.
+See
+.MR groff @MAN1EXT@
+for details about where such files are created.
+.
+.
+.\" ====================================================================
+.SH Bugs
+.\" ====================================================================
+.
+.I \%grohtml
+is still beta code.
+.
+.
+.PP
+.I \%grohtml
+does not truly support hyphenation,
+but you can fool it into hyphenating long input lines,
+which can appear in HTML output with a hyphenated word followed by a
+space but no line break.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.\" IR afmtodit (@MAN1EXT@),
+.MR groff @MAN1EXT@ ,
+.MR @g@troff @MAN1EXT@ ,
+.\" IR psbb (1), \" XXX: what is this?
+.\" IR groff_out (@MAN5EXT@),
+.\" IR groff_char (@MAN7EXT@),
+.MR groff_font @MAN5EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_grohtml_1_man_C]
+.do rr *groff_grohtml_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/devices/grohtml/grohtml.am b/src/devices/grohtml/grohtml.am
new file mode 100644
index 0000000..a87cad2
--- /dev/null
+++ b/src/devices/grohtml/grohtml.am
@@ -0,0 +1,40 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+bin_PROGRAMS += post-grohtml
+post_grohtml_SOURCES = \
+ src/devices/grohtml/post-html.cpp \
+ src/devices/grohtml/html-table.cpp \
+ src/devices/grohtml/html-text.cpp \
+ src/devices/grohtml/output.cpp \
+ src/devices/grohtml/html.h \
+ src/devices/grohtml/html-text.h \
+ src/devices/grohtml/html-table.h
+
+post_grohtml_LDADD = $(LIBM) \
+ libdriver.a \
+ libgroff.a \
+ lib/libgnu.a
+man1_MANS += src/devices/grohtml/grohtml.1
+EXTRA_DIST += src/devices/grohtml/grohtml.1.man
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/devices/grohtml/html-table.cpp b/src/devices/grohtml/html-table.cpp
new file mode 100644
index 0000000..3d7dfcd
--- /dev/null
+++ b/src/devices/grohtml/html-table.cpp
@@ -0,0 +1,848 @@
+// -*- C++ -*-
+/* Copyright (C) 2002-2020 Free Software Foundation, Inc.
+ *
+ * Gaius Mulley (gaius@glam.ac.uk) wrote html-table.cpp
+ *
+ * html-table.h
+ *
+ * provides the methods necessary to handle indentation and tab
+ * positions using html tables.
+ */
+
+/*
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "driver.h"
+#include "stringclass.h"
+#include "cset.h"
+#include "html-table.h"
+#include "ctype.h"
+#include "html.h"
+#include "html-text.h"
+
+#if !defined(TRUE)
+# define TRUE (1==1)
+#endif
+#if !defined(FALSE)
+# define FALSE (1==0)
+#endif
+
+extern html_dialect dialect;
+
+
+tabs::tabs ()
+ : tab(NULL)
+{
+}
+
+tabs::~tabs ()
+{
+ delete_list();
+}
+
+/*
+ * delete_list - frees the tab list and sets tab to NULL.
+ */
+
+void tabs::delete_list (void)
+{
+ tab_position *p = tab;
+ tab_position *q;
+
+ while (p != NULL) {
+ q = p;
+ p = p->next;
+ delete q;
+ }
+ tab = NULL;
+}
+
+void tabs::clear (void)
+{
+ delete_list();
+}
+
+/*
+ * compatible - returns TRUE if the tab stops in, s, do
+ * not conflict with the current tab stops.
+ * The new tab stops are _not_ placed into
+ * this class.
+ */
+
+int tabs::compatible (const char *s)
+{
+ char align;
+ int total=0;
+ tab_position *last = tab;
+
+ if (last == NULL)
+ return FALSE; // no tab stops defined
+
+ // move over tag name
+ while ((*s != (char)0) && !isspace(*s))
+ s++;
+
+ while (*s != (char)0 && last != NULL) {
+ // move over white space
+ while ((*s != (char)0) && isspace(*s))
+ s++;
+ // collect alignment
+ align = *s;
+ // move over alignment
+ s++;
+ // move over white space
+ while ((*s != (char)0) && isspace(*s))
+ s++;
+ // collect tab position
+ total = atoi(s);
+ // move over tab position
+ while ((*s != (char)0) && !isspace(*s))
+ s++;
+ if (last->alignment != align || last->position != total)
+ return FALSE;
+
+ last = last->next;
+ }
+ return TRUE;
+}
+
+/*
+ * init - scans the string, s, and initializes the tab stops.
+ */
+
+void tabs::init (const char *s)
+{
+ char align;
+ int total=0;
+ tab_position *last = NULL;
+
+ clear(); // remove any tab stops
+
+ // move over tag name
+ while ((*s != (char)0) && !isspace(*s))
+ s++;
+
+ while (*s != (char)0) {
+ // move over white space
+ while ((*s != (char)0) && isspace(*s))
+ s++;
+ // collect alignment
+ align = *s;
+ // move over alignment
+ s++;
+ // move over white space
+ while ((*s != (char)0) && isspace(*s))
+ s++;
+ // collect tab position
+ total = atoi(s);
+ // move over tab position
+ while ((*s != (char)0) && !isspace(*s))
+ s++;
+ if (last == NULL) {
+ tab = new tab_position;
+ last = tab;
+ } else {
+ last->next = new tab_position;
+ last = last->next;
+ }
+ last->alignment = align;
+ last->position = total;
+ last->next = NULL;
+ }
+}
+
+/*
+ * check_init - define tab stops using, s, providing none already exist.
+ */
+
+void tabs::check_init (const char *s)
+{
+ if (tab == NULL)
+ init(s);
+}
+
+/*
+ * find_tab - returns the tab number corresponding to the position, pos.
+ */
+
+int tabs::find_tab (int pos)
+{
+ tab_position *p;
+ int i=0;
+
+ for (p = tab; p != NULL; p = p->next) {
+ i++;
+ if (p->position == pos)
+ return i;
+ }
+ return 0;
+}
+
+/*
+ * get_tab_pos - returns the, nth, tab position
+ */
+
+int tabs::get_tab_pos (int n)
+{
+ tab_position *p;
+
+ n--;
+ for (p = tab; (p != NULL) && (n>0); p = p->next) {
+ n--;
+ if (n == 0)
+ return p->position;
+ }
+ return 0;
+}
+
+char tabs::get_tab_align (int n)
+{
+ tab_position *p;
+
+ n--;
+ for (p = tab; (p != NULL) && (n>0); p = p->next) {
+ n--;
+ if (n == 0)
+ return p->alignment;
+ }
+ return 'L';
+}
+
+/*
+ * dump_tab - display tab positions
+ */
+
+void tabs::dump_tabs (void)
+{
+ int i=1;
+ tab_position *p;
+
+ for (p = tab; p != NULL; p = p->next) {
+ printf("tab %d is %d\n", i, p->position);
+ i++;
+ }
+}
+
+/*
+ * html_table - methods
+ */
+
+html_table::html_table (simple_output *op, int linelen)
+ : out(op), columns(NULL), linelength(linelen), last_col(NULL), start_space(FALSE)
+{
+ tab_stops = new tabs();
+}
+
+html_table::~html_table ()
+{
+ cols *c;
+ if (tab_stops != NULL)
+ delete tab_stops;
+
+ c = columns;
+ while (columns != NULL) {
+ columns = columns->next;
+ delete c;
+ c = columns;
+ }
+}
+
+/*
+ * remove_cols - remove a list of columns as defined by, c.
+ */
+
+void html_table::remove_cols (cols *c)
+{
+ cols *p;
+
+ while (c != NULL) {
+ p = c;
+ c = c->next;
+ delete p;
+ }
+}
+
+/*
+ * set_linelength - sets the line length value in this table.
+ * It also adds an extra blank column to the
+ * table should linelen exceed the last column.
+ */
+
+void html_table::set_linelength (int linelen)
+{
+ cols *p = NULL;
+ cols *c;
+ linelength = linelen;
+
+ for (c = columns; c != NULL; c = c->next) {
+ if (c->right > linelength) {
+ c->right = linelength;
+ remove_cols(c->next);
+ c->next = NULL;
+ return;
+ }
+ p = c;
+ }
+ if (p != NULL && p->right > 0 && linelength > p->right)
+ add_column(p->no+1, p->right, linelength, 'L');
+}
+
+/*
+ * get_effective_linelength -
+ */
+
+int html_table::get_effective_linelength (void)
+{
+ if (columns != NULL)
+ return linelength - columns->left;
+ else
+ return linelength;
+}
+
+/*
+ * add_indent - adds the indent to a table.
+ */
+
+void html_table::add_indent (int indent)
+{
+ if (columns != NULL && columns->left > indent)
+ add_column(0, indent, columns->left, 'L');
+}
+
+/*
+ * emit_table_header - emits the html header for this table.
+ */
+
+void html_table::emit_table_header (int space)
+{
+ if (columns == NULL)
+ return;
+
+ // dump_table();
+
+ last_col = NULL;
+ if (linelength > 0) {
+ out->nl();
+ out->nl();
+
+ out->put_string("<table width=\"100%\"")
+ .put_string(" border=\"0\" rules=\"none\" frame=\"void\"\n")
+ .put_string(" cellspacing=\"0\" cellpadding=\"0\"");
+ out->put_string(">")
+ .nl();
+ if (dialect == xhtml)
+ emit_colspan();
+ out->put_string("<tr valign=\"top\" align=\"left\"");
+ if (space) {
+ out->put_string(" style=\"margin-top: ");
+ out->put_string(STYLE_VERTICAL_SPACE);
+ out->put_string("\"");
+ }
+ out->put_string(">").nl();
+ }
+}
+
+/*
+ * get_right - returns the right most position of this column.
+ */
+
+int html_table::get_right (cols *c)
+{
+ if (c != NULL && c->right > 0)
+ return c->right;
+ if (c->next != NULL)
+ return c->left;
+ return linelength;
+}
+
+/*
+ * set_space - assigns start_space. Used to determine the
+ * vertical alignment when generating the next table row.
+ */
+
+void html_table::set_space (int space)
+{
+ start_space = space;
+}
+
+/*
+ * emit_colspan - emits a series of colspan entries defining the
+ * table columns.
+ */
+
+void html_table::emit_colspan (void)
+{
+ cols *b = columns;
+ cols *c = columns;
+ int width = 0;
+
+ out->put_string("<colgroup>");
+ while (c != NULL) {
+ if (b != NULL && b != c && is_gap(b))
+ /*
+ * blank column for gap
+ */
+ out->put_string("<col width=\"")
+ .put_number(is_gap(b))
+ .put_string("%\" class=\"center\"></col>")
+ .nl();
+
+ width = (get_right(c)*100 + get_effective_linelength()/2)
+ / get_effective_linelength()
+ - (c->left*100 + get_effective_linelength()/2)
+ /get_effective_linelength();
+ switch (c->alignment) {
+ case 'C':
+ out->put_string("<col width=\"")
+ .put_number(width)
+ .put_string("%\" class=\"center\"></col>")
+ .nl();
+ break;
+ case 'R':
+ out->put_string("<col width=\"")
+ .put_number(width)
+ .put_string("%\" class=\"right\"></col>")
+ .nl();
+ break;
+ default:
+ out->put_string("<col width=\"")
+ .put_number(width)
+ .put_string("%\"></col>")
+ .nl();
+ }
+ b = c;
+ c = c->next;
+ }
+ out->put_string("</colgroup>").nl();
+}
+
+/*
+ * emit_td - writes out a <td> tag with a corresponding width
+ * if the dialect is html4.
+ */
+
+void html_table::emit_td (int percentage, const char *s)
+{
+ if (percentage) {
+ if (dialect == html4) {
+ out->put_string("<td width=\"")
+ .put_number(percentage)
+ .put_string("%\"");
+ if (s != NULL)
+ out->put_string(s);
+ out->nl();
+ }
+ else {
+ out->put_string("<td");
+ if (s != NULL)
+ out->put_string(s);
+ out->nl();
+ }
+ }
+}
+
+/*
+ * emit_col - moves onto column, n.
+ */
+
+void html_table::emit_col (int n)
+{
+ cols *c = columns;
+ cols *b = columns;
+ int width = 0;
+
+ // must be a different row
+ if (last_col != NULL && n <= last_col->no)
+ emit_new_row();
+
+ while (c != NULL && c->no < n)
+ c = c->next;
+
+ // can we find column, n?
+ if (c != NULL && c->no == n) {
+ // shutdown previous column
+ if (last_col != NULL)
+ out->put_string("</td>").nl();
+
+ // find previous column
+ if (last_col == NULL)
+ b = columns;
+ else
+ b = last_col;
+
+ // have we a gap?
+ if (last_col != NULL) {
+ emit_td(is_gap(b), "></td>");
+ b = b->next;
+ }
+
+ // move across to column n
+ while (b != c) {
+ // we compute the difference after converting positions
+ // to avoid rounding errors
+ width = (get_right(b)*100 + get_effective_linelength()/2)
+ / get_effective_linelength()
+ - (b->left*100 + get_effective_linelength()/2)
+ /get_effective_linelength();
+ emit_td(width, "></td>");
+ // have we a gap?
+ emit_td(is_gap(b), "></td>");
+ b = b->next;
+ }
+ width = (get_right(b)*100 + get_effective_linelength()/2)
+ / get_effective_linelength()
+ - (b->left*100 + get_effective_linelength()/2)
+ /get_effective_linelength();
+ switch (b->alignment) {
+ case 'C':
+ emit_td(width, " align=center>");
+ break;
+ case 'R':
+ emit_td(width, " align=right>");
+ break;
+ default:
+ emit_td(width);
+ }
+ // remember column, b
+ last_col = b;
+ }
+}
+
+/*
+ * finish_row -
+ */
+
+void html_table::finish_row (void)
+{
+ int n = 0;
+ cols *c;
+
+ if (last_col != NULL) {
+ for (c = last_col->next; c != NULL; c = c->next)
+ n = c->no;
+
+ if (n > 0)
+ emit_col(n);
+#if 1
+ if (last_col != NULL) {
+ out->put_string("</td>");
+ last_col = NULL;
+ }
+#endif
+ out->put_string("</tr>").nl();
+ }
+}
+
+/*
+ * emit_new_row - move to the next row.
+ */
+
+void html_table::emit_new_row (void)
+{
+ finish_row();
+
+ out->put_string("<tr valign=\"top\" align=\"left\"");
+ if (start_space) {
+ out->put_string(" style=\"margin-top: ");
+ out->put_string(STYLE_VERTICAL_SPACE);
+ out->put_string("\"");
+ }
+ out->put_string(">").nl();
+ start_space = FALSE;
+ last_col = NULL;
+}
+
+void html_table::emit_finish_table (void)
+{
+ finish_row();
+ out->put_string("</table>");
+}
+
+/*
+ * add_column - adds a column. It returns FALSE if hstart..hend
+ * crosses into a different columns.
+ */
+
+int html_table::add_column (int coln, int hstart, int hend, char align)
+{
+ cols *c = get_column(coln);
+
+ if (c == NULL)
+ return insert_column(coln, hstart, hend, align);
+ else
+ return modify_column(c, hstart, hend, align);
+}
+
+/*
+ * get_column - returns the column, coln.
+ */
+
+cols *html_table::get_column (int coln)
+{
+ cols *c = columns;
+
+ while (c != NULL && coln != c->no)
+ c = c->next;
+
+ if (c != NULL && coln == c->no)
+ return c;
+ else
+ return NULL;
+}
+
+/*
+ * insert_column - inserts a column, coln.
+ * It returns TRUE if it does not bump into
+ * another column.
+ */
+
+int html_table::insert_column (int coln, int hstart, int hend, char align)
+{
+ cols *c = columns;
+ cols *l = columns;
+ cols *n = NULL;
+
+ while (c != NULL && c->no < coln) {
+ l = c;
+ c = c->next;
+ }
+ if (l != NULL && l->no>coln && hend > l->left)
+ return FALSE; // new column bumps into previous one
+
+ l = NULL;
+ c = columns;
+ while (c != NULL && c->no < coln) {
+ l = c;
+ c = c->next;
+ }
+
+ if ((l != NULL) && (hstart < l->right))
+ return FALSE; // new column bumps into previous one
+
+ if ((l != NULL) && (l->next != NULL) &&
+ (l->next->left < hend))
+ return FALSE; // new column bumps into next one
+
+ n = new cols;
+ if (l == NULL) {
+ n->next = columns;
+ columns = n;
+ } else {
+ n->next = l->next;
+ l->next = n;
+ }
+ n->left = hstart;
+ n->right = hend;
+ n->no = coln;
+ n->alignment = align;
+ return TRUE;
+}
+
+/*
+ * modify_column - given a column, c, modify the width to
+ * contain hstart..hend.
+ * It returns TRUE if it does not clash with
+ * the next or previous column.
+ */
+
+int html_table::modify_column (cols *c, int hstart, int hend, char align)
+{
+ cols *l = columns;
+
+ while (l != NULL && l->next != c)
+ l = l->next;
+
+ if ((l != NULL) && (hstart < l->right))
+ return FALSE; // new column bumps into previous one
+
+ if ((c->next != NULL) && (c->next->left < hend))
+ return FALSE; // new column bumps into next one
+
+ if (c->left > hstart)
+ c->left = hstart;
+
+ if (c->right < hend)
+ c->right = hend;
+
+ c->alignment = align;
+
+ return TRUE;
+}
+
+/*
+ * find_tab_column - finds the column number for position, pos.
+ * It searches through the list tab stops.
+ */
+
+int html_table::find_tab_column (int pos)
+{
+ // remember the first column is reserved for untabbed glyphs
+ return tab_stops->find_tab(pos)+1;
+}
+
+/*
+ * find_column - find the column number for position, pos.
+ * It searches through the list of columns.
+ */
+
+int html_table::find_column (int pos)
+{
+ int p=0;
+ cols *c;
+
+ for (c = columns; c != NULL; c = c->next) {
+ if (c->left > pos)
+ return p;
+ p = c->no;
+ }
+ return p;
+}
+
+/*
+ * no_columns - returns the number of table columns (rather than tabs)
+ */
+
+int html_table::no_columns (void)
+{
+ int n=0;
+ cols *c;
+
+ for (c = columns; c != NULL; c = c->next)
+ n++;
+ return n;
+}
+
+/*
+ * is_gap - returns the gap between column, c, and the next column.
+ */
+
+int html_table::is_gap (cols *c)
+{
+ if (c == NULL || c->right <= 0 || c->next == NULL)
+ return 0;
+ else
+ // we compute the difference after converting positions
+ // to avoid rounding errors
+ return (c->next->left*100 + get_effective_linelength()/2)
+ / get_effective_linelength()
+ - (c->right*100 + get_effective_linelength()/2)
+ / get_effective_linelength();
+}
+
+/*
+ * no_gaps - returns the number of table gaps between the columns
+ */
+
+int html_table::no_gaps (void)
+{
+ int n=0;
+ cols *c;
+
+ for (c = columns; c != NULL; c = c->next)
+ if (is_gap(c))
+ n++;
+ return n;
+}
+
+/*
+ * get_tab_pos - returns the, nth, tab position
+ */
+
+int html_table::get_tab_pos (int n)
+{
+ return tab_stops->get_tab_pos(n);
+}
+
+char html_table::get_tab_align (int n)
+{
+ return tab_stops->get_tab_align(n);
+}
+
+
+void html_table::dump_table (void)
+{
+ if (columns != NULL) {
+ cols *c;
+ for (c = columns; c != NULL; c = c->next) {
+ printf("column %d %d..%d %c\n", c->no, c->left, c->right, c->alignment);
+ }
+ } else
+ tab_stops->dump_tabs();
+}
+
+/*
+ * html_indent - creates an indent with indentation, ind, given
+ * a line length of linelength.
+ */
+
+html_indent::html_indent (simple_output *op, int ind, int pageoffset, int linelength)
+{
+ table = new html_table(op, linelength);
+
+ table->add_column(1, ind+pageoffset, linelength, 'L');
+ table->add_indent(pageoffset);
+ in = ind;
+ pg = pageoffset;
+ ll = linelength;
+}
+
+html_indent::~html_indent (void)
+{
+ end();
+ delete table;
+}
+
+void html_indent::begin (int space)
+{
+ if (in + pg == 0) {
+ if (space) {
+ table->out->put_string(" style=\"margin-top: ");
+ table->out->put_string(STYLE_VERTICAL_SPACE);
+ table->out->put_string("\"");
+ }
+ }
+ else {
+ //
+ // we use exactly the same mechanism for calculating
+ // indentation as html_table::emit_col
+ //
+ table->out->put_string(" style=\"margin-left:")
+ .put_number(((in + pg) * 100 + ll/2) / ll -
+ (ll/2)/ll)
+ .put_string("%;");
+
+ if (space) {
+ table->out->put_string(" margin-top: ");
+ table->out->put_string(STYLE_VERTICAL_SPACE);
+ }
+ table->out->put_string("\"");
+ }
+}
+
+void html_indent::end (void)
+{
+}
+
+/*
+ * get_reg - collects the registers as supplied during initialization.
+ */
+
+void html_indent::get_reg (int *ind, int *pageoffset, int *linelength)
+{
+ *ind = in;
+ *pageoffset = pg;
+ *linelength = ll;
+}
diff --git a/src/devices/grohtml/html-table.h b/src/devices/grohtml/html-table.h
new file mode 100644
index 0000000..7ed27a9
--- /dev/null
+++ b/src/devices/grohtml/html-table.h
@@ -0,0 +1,133 @@
+// -*- C++ -*-
+/* Copyright (C) 2002-2020 Free Software Foundation, Inc.
+ *
+ * Gaius Mulley (gaius@glam.ac.uk) wrote html-table.h
+ *
+ * html-table.h
+ *
+ * provides the methods necessary to handle indentation and tab
+ * positions using html tables.
+ */
+
+/*
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "html.h"
+
+#if !defined(HTML_TABLE_H)
+#define HTML_TABLE_H
+
+typedef struct tab_position {
+ char alignment;
+ int position;
+ struct tab_position *next;
+} tab_position;
+
+
+class tabs {
+public:
+ tabs ();
+ ~tabs ();
+ void clear (void);
+ int compatible (const char *s);
+ void init (const char *s);
+ void check_init (const char *s);
+ int find_tab (int pos);
+ int get_tab_pos (int n);
+ char get_tab_align (int n);
+ void dump_tabs (void);
+
+private:
+ void delete_list (void);
+ tab_position *tab;
+};
+
+/*
+ * define a column
+ */
+
+typedef struct cols {
+ int left, right;
+ int no;
+ char alignment;
+ struct cols *next;
+} cols;
+
+class html_table {
+public:
+ html_table (simple_output *op, int linelen);
+ ~html_table (void);
+ int add_column (int coln, int hstart, int hend, char align);
+ cols *get_column (int coln);
+ int insert_column (int coln, int hstart, int hend, char align);
+ int modify_column (cols *c, int hstart, int hend, char align);
+ int find_tab_column (int pos);
+ int find_column (int pos);
+ int get_tab_pos (int n);
+ char get_tab_align (int n);
+ void set_linelength (int linelen);
+ int no_columns (void);
+ int no_gaps (void);
+ int is_gap (cols *c);
+ void dump_table (void);
+ void emit_table_header (int space);
+ void emit_col (int n);
+ void emit_new_row (void);
+ void emit_finish_table (void);
+ int get_right (cols *c);
+ void add_indent (int indent);
+ void finish_row (void);
+ int get_effective_linelength (void);
+ void set_space (int space);
+ void emit_colspan (void);
+ void emit_td (int percentage, const char *s = ">");
+
+ tabs *tab_stops; /* tab stop positions */
+ simple_output *out;
+private:
+ cols *columns; /* column entries */
+ int linelength;
+ cols *last_col; /* last column started */
+ int start_space; /* have we seen a '.sp' tag? */
+
+ void remove_cols (cols *c);
+};
+
+/*
+ * the indentation wrapper.
+ * Builds an indentation from a html-table.
+ * This table is only emitted if the paragraph is emitted.
+ */
+
+class html_indent {
+public:
+ html_indent (simple_output *op, int ind, int pageoffset, int linelength);
+ ~html_indent (void);
+ void begin (int space); // called if we need to use the indent
+ void get_reg (int *ind, int *pageoffset, int *linelength);
+
+ // the indent is shutdown when it is deleted
+
+private:
+ void end (void);
+ int is_used;
+ int pg; // values of the registers as passed via initialization
+ int ll;
+ int in;
+ html_table *table;
+};
+
+#endif
diff --git a/src/devices/grohtml/html-text.cpp b/src/devices/grohtml/html-text.cpp
new file mode 100644
index 0000000..b07cbe7
--- /dev/null
+++ b/src/devices/grohtml/html-text.cpp
@@ -0,0 +1,1056 @@
+// -*- C++ -*-
+/* Copyright (C) 2000-2020 Free Software Foundation, Inc.
+ *
+ * Gaius Mulley (gaius@glam.ac.uk) wrote html-text.cpp
+ *
+ * html-text.cpp
+ *
+ * provide a troff like state machine interface which
+ * generates html text.
+ */
+
+/*
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "driver.h"
+#include "stringclass.h"
+#include "cset.h"
+
+#if !defined(TRUE)
+# define TRUE (1==1)
+#endif
+#if !defined(FALSE)
+# define FALSE (1==0)
+#endif
+
+
+#include "html-text.h"
+
+html_text::html_text (simple_output *op, html_dialect d) :
+ stackptr(NULL), lastptr(NULL), out(op), dialect(d),
+ space_emitted(TRUE), current_indentation(-1),
+ pageoffset(-1), linelength(-1), blank_para(TRUE),
+ start_space(FALSE)
+{
+}
+
+html_text::~html_text ()
+{
+ flush_text();
+}
+
+
+#if defined(DEBUGGING)
+static int debugStack = FALSE;
+
+
+/*
+ * turnDebug - flip the debugStack boolean and return the new value.
+ */
+
+static int turnDebug (void)
+{
+ debugStack = 1-debugStack;
+ return debugStack;
+}
+
+/*
+ * dump_stack_element - display an element of the html stack, p.
+ */
+
+void html_text::dump_stack_element (tag_definition *p)
+{
+ fprintf(stderr, " | ");
+ switch (p->type) {
+
+ case P_TAG: if (p->indent == NULL) {
+ fprintf(stderr, "<P %s>", (char *)p->arg1); break;
+ } else {
+ fprintf(stderr, "<P %s [TABLE]>", (char *)p->arg1); break;
+ }
+ case I_TAG: fprintf(stderr, "<I>"); break;
+ case B_TAG: fprintf(stderr, "<B>"); break;
+ case SUB_TAG: fprintf(stderr, "<SUB>"); break;
+ case SUP_TAG: fprintf(stderr, "<SUP>"); break;
+ case TT_TAG: fprintf(stderr, "<TT>"); break;
+ case PRE_TAG: if (p->indent == NULL) {
+ fprintf(stderr, "<PRE>"); break;
+ } else {
+ fprintf(stderr, "<PRE [TABLE]>"); break;
+ }
+ case SMALL_TAG: fprintf(stderr, "<SMALL>"); break;
+ case BIG_TAG: fprintf(stderr, "<BIG>"); break;
+ case BREAK_TAG: fprintf(stderr, "<BREAK>"); break;
+ case COLOR_TAG: {
+ if (p->col.is_default())
+ fprintf(stderr, "<COLOR (default)>");
+ else {
+ unsigned int r, g, b;
+
+ p->col.get_rgb(&r, &g, &b);
+ fprintf(stderr, "<COLOR %x %x %x>", r/0x101, g/0x101, b/0x101);
+ }
+ break;
+ }
+ default: fprintf(stderr, "unknown tag");
+ }
+ if (p->text_emitted)
+ fprintf(stderr, "[t] ");
+}
+
+/*
+ * dump_stack - debugging function only.
+ */
+
+void html_text::dump_stack (void)
+{
+ if (debugStack) {
+ tag_definition *p = stackptr;
+
+ while (p != NULL) {
+ dump_stack_element(p);
+ p = p->next;
+ }
+ }
+ fprintf(stderr, "\n");
+ fflush(stderr);
+}
+#else
+void html_text::dump_stack (void) {}
+#endif
+
+
+/*
+ * end_tag - shuts down the tag.
+ */
+
+void html_text::end_tag (tag_definition *t)
+{
+ switch (t->type) {
+
+ case I_TAG: out->put_string("</i>"); break;
+ case B_TAG: out->put_string("</b>"); break;
+ case P_TAG: if (t->indent == NULL) {
+ out->put_string("</p>");
+ } else {
+ delete t->indent;
+ t->indent = NULL;
+ out->put_string("</p>");
+ }
+ out->enable_newlines(FALSE);
+ blank_para = TRUE; break;
+ case SUB_TAG: out->put_string("</sub>"); break;
+ case SUP_TAG: out->put_string("</sup>"); break;
+ case TT_TAG: out->put_string("</tt>"); break;
+ case PRE_TAG: out->put_string("</pre>"); out->enable_newlines(TRUE);
+ blank_para = TRUE;
+ if (t->indent != NULL)
+ delete t->indent;
+ t->indent = NULL;
+ break;
+ case SMALL_TAG: if (! is_in_pre ())
+ out->put_string("</small>");
+ break;
+ case BIG_TAG: if (! is_in_pre ())
+ out->put_string("</big>");
+ break;
+ case COLOR_TAG: if (! is_in_pre ())
+ out->put_string("</font>");
+ break;
+
+ default:
+ error("unrecognised tag");
+ }
+}
+
+/*
+ * issue_tag - writes out an html tag with argument.
+ * space == 0 if no space is requested
+ * space == 1 if a space is requested
+ * space == 2 if tag should not have a space style
+ */
+
+void html_text::issue_tag (const char *tagname, const char *arg,
+ int space)
+{
+ if ((arg == 0) || (strlen(arg) == 0))
+ out->put_string(tagname);
+ else {
+ out->put_string(tagname);
+ out->put_string(" ");
+ out->put_string(arg);
+ }
+ if (space == TRUE) {
+ out->put_string(" style=\"margin-top: ");
+ out->put_string(STYLE_VERTICAL_SPACE);
+ out->put_string("\"");
+ }
+#if 0
+ if (space == TRUE || space == FALSE)
+ out->put_string(" valign=\"top\"");
+#endif
+ out->put_string(">");
+}
+
+/*
+ * issue_color_begin - writes out an html color tag.
+ */
+
+void html_text::issue_color_begin (color *c)
+{
+ char buf[(INT_HEXDIGITS * 3) + 1];
+ unsigned int r, g, b;
+
+ out->put_string("<font color=\"#");
+ if (c->is_default())
+ sprintf(buf, "000000");
+ else {
+ c->get_rgb(&r, &g, &b);
+ // we have to scale 0..0xFFFF to 0..0xFF
+ sprintf(buf, "%.2X%.2X%.2X", r/0x101, g/0x101, b/0x101);
+ }
+ out->put_string(buf);
+ out->put_string("\">");
+}
+
+/*
+ * start_tag - starts a tag.
+ */
+
+void html_text::start_tag (tag_definition *t)
+{
+ switch (t->type) {
+
+ case I_TAG: issue_tag("<i", (char *)t->arg1); break;
+ case B_TAG: issue_tag("<b", (char *)t->arg1); break;
+ case P_TAG: if (t->indent != NULL) {
+ out->nl();
+#if defined(DEBUGGING)
+ out->simple_comment("INDENTATION");
+#endif
+ out->put_string("\n<p");
+ t->indent->begin(start_space);
+ issue_tag("", (char *)t->arg1);
+ } else {
+ out->nl();
+ issue_tag("\n<p", (char *)t->arg1, start_space);
+ }
+
+ out->enable_newlines(TRUE); break;
+ case SUB_TAG: issue_tag("<sub", (char *)t->arg1); break;
+ case SUP_TAG: issue_tag("<sup", (char *)t->arg1); break;
+ case TT_TAG: issue_tag("<tt", (char *)t->arg1); break;
+ case PRE_TAG: out->enable_newlines(TRUE);
+ out->nl(); out->put_string("<pre");
+ if (t->indent == NULL)
+ issue_tag("", (char *)t->arg1, start_space);
+ else {
+ t->indent->begin(start_space);
+ issue_tag("", (char *)t->arg1);
+ }
+ out->enable_newlines(FALSE); break;
+ case SMALL_TAG: if (! is_in_pre ())
+ issue_tag("<small", (char *)t->arg1);
+ break;
+ case BIG_TAG: if (! is_in_pre ())
+ issue_tag("<big", (char *)t->arg1);
+ break;
+ case BREAK_TAG: break;
+ case COLOR_TAG: if (! is_in_pre ())
+ issue_color_begin(&t->col);
+ break;
+
+ default:
+ error("unrecognised tag");
+ }
+}
+
+/*
+ * flush_text - flushes html tags which are outstanding on the html stack.
+ */
+
+void html_text::flush_text (void)
+{
+ int notext=TRUE;
+ tag_definition *p=stackptr;
+
+ while (stackptr != 0) {
+ notext = (notext && (! stackptr->text_emitted));
+ if (! notext) {
+ end_tag(stackptr);
+ }
+ p = stackptr;
+ stackptr = stackptr->next;
+ delete p;
+ }
+ lastptr = NULL;
+}
+
+/*
+ * is_present - returns TRUE if tag is already present on the stack.
+ */
+
+int html_text::is_present (HTML_TAG t)
+{
+ tag_definition *p=stackptr;
+
+ while (p != NULL) {
+ if (t == p->type)
+ return TRUE;
+ p = p->next;
+ }
+ return FALSE;
+}
+
+/*
+ * uses_indent - returns TRUE if the current paragraph is using a
+ * html table to effect an indent.
+ */
+
+int html_text::uses_indent (void)
+{
+ tag_definition *p = stackptr;
+
+ while (p != NULL) {
+ if (p->indent != NULL)
+ return TRUE;
+ p = p->next;
+ }
+ return FALSE;
+}
+
+extern void stop();
+
+/*
+ * do_push - places, tag_definition, p, onto the stack
+ */
+
+void html_text::do_push (tag_definition *p)
+{
+ HTML_TAG t = p->type;
+
+#if defined(DEBUGGING)
+ if (t == PRE_TAG)
+ stop();
+ debugStack = TRUE;
+ fprintf(stderr, "\nentering do_push (");
+ dump_stack_element(p);
+ fprintf(stderr, ")\n");
+ dump_stack();
+ fprintf(stderr, ")\n");
+ fflush(stderr);
+#endif
+
+ /*
+ * if t is a P_TAG or PRE_TAG make sure it goes on the end of the stack.
+ */
+
+ if (((t == P_TAG) || (t == PRE_TAG)) && (lastptr != NULL)) {
+ /*
+ * store, p, at the end
+ */
+ lastptr->next = p;
+ lastptr = p;
+ p->next = NULL;
+ } else {
+ p->next = stackptr;
+ if (stackptr == NULL)
+ lastptr = p;
+ stackptr = p;
+ }
+
+#if defined(DEBUGGING)
+ dump_stack();
+ fprintf(stderr, "exiting do_push\n");
+#endif
+}
+
+/*
+ * push_para - adds a new entry onto the html paragraph stack.
+ */
+
+void html_text::push_para (HTML_TAG t, void *arg, html_indent *in)
+{
+ tag_definition *p= new tag_definition;
+
+ p->type = t;
+ p->arg1 = arg;
+ p->text_emitted = FALSE;
+ p->indent = in;
+
+ if (t == PRE_TAG && is_present(PRE_TAG))
+ fatal("cannot have multiple PRE_TAGs");
+
+ do_push(p);
+}
+
+void html_text::push_para (HTML_TAG t)
+{
+ push_para(t, (void *)"", NULL);
+}
+
+void html_text::push_para (color *c)
+{
+ tag_definition *p = new tag_definition;
+
+ p->type = COLOR_TAG;
+ p->arg1 = NULL;
+ p->col = *c;
+ p->text_emitted = FALSE;
+ p->indent = NULL;
+
+ do_push(p);
+}
+
+/*
+ * do_italic - changes to italic
+ */
+
+void html_text::do_italic (void)
+{
+ if (! is_present(I_TAG))
+ push_para(I_TAG);
+}
+
+/*
+ * do_bold - changes to bold.
+ */
+
+void html_text::do_bold (void)
+{
+ if (! is_present(B_TAG))
+ push_para(B_TAG);
+}
+
+/*
+ * do_tt - changes to teletype.
+ */
+
+void html_text::do_tt (void)
+{
+ if ((! is_present(TT_TAG)) && (! is_present(PRE_TAG)))
+ push_para(TT_TAG);
+}
+
+/*
+ * do_pre - changes to preformated text.
+ */
+
+void html_text::do_pre (void)
+{
+ done_tt();
+ if (is_present(P_TAG)) {
+ html_indent *i = remove_indent(P_TAG);
+ int space = retrieve_para_space();
+ (void)done_para();
+ if (! is_present(PRE_TAG))
+ push_para(PRE_TAG, NULL, i);
+ start_space = space;
+ } else if (! is_present(PRE_TAG))
+ push_para(PRE_TAG, NULL, NULL);
+ dump_stack();
+}
+
+/*
+ * is_in_pre - returns TRUE if we are currently within a preformatted
+ * <pre> block.
+ */
+
+int html_text::is_in_pre (void)
+{
+ return is_present(PRE_TAG);
+}
+
+/*
+ * do_color - initiates a new color tag.
+ */
+
+void html_text::do_color (color *c)
+{
+ shutdown(COLOR_TAG); // shutdown a previous color tag, if present
+ push_para(c);
+}
+
+/*
+ * done_color - shutdown an outstanding color tag, if it exists.
+ */
+
+void html_text::done_color (void)
+{
+ shutdown(COLOR_TAG);
+}
+
+/*
+ * shutdown - shuts down an html tag.
+ */
+
+char *html_text::shutdown (HTML_TAG t)
+{
+ char *arg=NULL;
+
+ if (is_present(t)) {
+ tag_definition *p =stackptr;
+ tag_definition *temp =NULL;
+ int notext =TRUE;
+
+ dump_stack();
+ while ((stackptr != NULL) && (stackptr->type != t)) {
+ notext = (notext && (! stackptr->text_emitted));
+ if (! notext) {
+ end_tag(stackptr);
+ }
+
+ /*
+ * pop tag
+ */
+ p = stackptr;
+ stackptr = stackptr->next;
+ if (stackptr == NULL)
+ lastptr = NULL;
+
+ /*
+ * push tag onto temp stack
+ */
+ p->next = temp;
+ temp = p;
+ }
+
+ /*
+ * and examine stackptr
+ */
+ if ((stackptr != NULL) && (stackptr->type == t)) {
+ if (stackptr->text_emitted) {
+ end_tag(stackptr);
+ }
+ if (t == P_TAG) {
+ arg = (char *)stackptr->arg1;
+ }
+ p = stackptr;
+ stackptr = stackptr->next;
+ if (stackptr == NULL)
+ lastptr = NULL;
+ if (p->indent != NULL)
+ delete p->indent;
+ delete p;
+ }
+
+ /*
+ * and restore unaffected tags
+ */
+ while (temp != NULL) {
+ if (temp->type == COLOR_TAG)
+ push_para(&temp->col);
+ else
+ push_para(temp->type, temp->arg1, temp->indent);
+ p = temp;
+ temp = temp->next;
+ delete p;
+ }
+ }
+ return arg;
+}
+
+/*
+ * done_bold - shuts downs a bold tag.
+ */
+
+void html_text::done_bold (void)
+{
+ shutdown(B_TAG);
+}
+
+/*
+ * done_italic - shuts downs an italic tag.
+ */
+
+void html_text::done_italic (void)
+{
+ shutdown(I_TAG);
+}
+
+/*
+ * done_sup - shuts downs a sup tag.
+ */
+
+void html_text::done_sup (void)
+{
+ shutdown(SUP_TAG);
+}
+
+/*
+ * done_sub - shuts downs a sub tag.
+ */
+
+void html_text::done_sub (void)
+{
+ shutdown(SUB_TAG);
+}
+
+/*
+ * done_tt - shuts downs a tt tag.
+ */
+
+void html_text::done_tt (void)
+{
+ shutdown(TT_TAG);
+}
+
+/*
+ * done_pre - shuts downs a pre tag.
+ */
+
+void html_text::done_pre (void)
+{
+ shutdown(PRE_TAG);
+}
+
+/*
+ * done_small - shuts downs a small tag.
+ */
+
+void html_text::done_small (void)
+{
+ shutdown(SMALL_TAG);
+}
+
+/*
+ * done_big - shuts downs a big tag.
+ */
+
+void html_text::done_big (void)
+{
+ shutdown(BIG_TAG);
+}
+
+/*
+ * check_emit_text - ensures that all previous tags have been emitted (in order)
+ * before the text is written.
+ */
+
+void html_text::check_emit_text (tag_definition *t)
+{
+ if ((t != NULL) && (! t->text_emitted)) {
+ check_emit_text(t->next);
+ t->text_emitted = TRUE;
+ start_tag(t);
+ }
+}
+
+/*
+ * do_emittext - tells the class that text was written during the current tag.
+ */
+
+void html_text::do_emittext (const char *s, int length)
+{
+ if ((! is_present(P_TAG)) && (! is_present(PRE_TAG)))
+ do_para("", FALSE);
+
+ if (is_present(BREAK_TAG)) {
+ int text = remove_break();
+ check_emit_text(stackptr);
+ if (text) {
+ if (is_present(PRE_TAG))
+ out->nl();
+ else if (dialect == xhtml)
+ out->put_string("<br/>").nl();
+ else
+ out->put_string("<br>").nl();
+ }
+ } else
+ check_emit_text(stackptr);
+
+ out->put_string(s, length);
+ space_emitted = FALSE;
+ blank_para = FALSE;
+}
+
+/*
+ * do_para - starts a new paragraph
+ */
+
+void html_text::do_para (const char *arg, html_indent *in, int space)
+{
+ if (! is_present(P_TAG)) {
+ if (is_present(PRE_TAG)) {
+ html_indent *i = remove_indent(PRE_TAG);
+ done_pre();
+ if ((arg == NULL || (strcmp(arg, "") == 0)) &&
+ (i == in || in == NULL))
+ in = i;
+ else
+ delete i;
+ }
+ remove_sub_sup();
+ push_para(P_TAG, (void *)arg, in);
+ start_space = space;
+ }
+}
+
+void html_text::do_para (const char *arg, int space)
+{
+ do_para(arg, NULL, space);
+}
+
+void html_text::do_para (simple_output *op, const char *arg1,
+ int indentation_value, int page_offset,
+ int line_length, int space)
+{
+ html_indent *ind;
+
+ if (indentation_value == 0)
+ ind = NULL;
+ else
+ ind = new html_indent(op, indentation_value, page_offset, line_length);
+ do_para(arg1, ind, space);
+}
+
+/*
+ * done_para - shuts down a paragraph tag.
+ */
+
+char *html_text::done_para (void)
+{
+ char *result;
+ space_emitted = TRUE;
+ result = shutdown(P_TAG);
+ start_space = FALSE;
+ return result;
+}
+
+/*
+ * remove_indent - returns the indent associated with, tag.
+ * The indent associated with tag is set to NULL.
+ */
+
+html_indent *html_text::remove_indent (HTML_TAG tag)
+{
+ tag_definition *p=stackptr;
+
+ while (p != NULL) {
+ if (tag == p->type) {
+ html_indent *i = p->indent;
+ p->indent = NULL;
+ return i;
+ }
+ p = p->next;
+ }
+ return NULL;
+}
+
+/*
+ * remove_para_space - removes the leading space to a paragraph
+ * (effectively this trims off a leading '.sp' tag).
+ */
+
+void html_text::remove_para_space (void)
+{
+ start_space = FALSE;
+}
+
+/*
+ * do_space - issues an end of paragraph
+ */
+
+void html_text::do_space (void)
+{
+ if (is_in_pre()) {
+ do_emittext("", 0);
+ out->force_nl();
+ space_emitted = TRUE;
+ } else {
+ html_indent *i = remove_indent(P_TAG);
+
+ do_para(done_para(), i, TRUE);
+ space_emitted = TRUE;
+ }
+}
+
+/*
+ * do_break - issue a break tag.
+ */
+
+void html_text::do_break (void)
+{
+ if (! is_present(PRE_TAG))
+ if (emitted_text())
+ if (! is_present(BREAK_TAG))
+ push_para(BREAK_TAG);
+
+ space_emitted = TRUE;
+}
+
+/*
+ * do_newline - issue a newline providing that we are inside a <pre> tag.
+ */
+
+void html_text::do_newline (void)
+{
+ if (is_present(PRE_TAG)) {
+ do_emittext("\n", 1);
+ space_emitted = TRUE;
+ }
+}
+
+/*
+ * emitted_text - returns FALSE if white space has just been written.
+ */
+
+int html_text::emitted_text (void)
+{
+ return !space_emitted;
+}
+
+/*
+ * ever_emitted_text - returns TRUE if we have ever emitted text in this
+ * paragraph.
+ */
+
+int html_text::ever_emitted_text (void)
+{
+ return !blank_para;
+}
+
+/*
+ * starts_with_space - returns TRUE if we started this paragraph with a .sp
+ */
+
+int html_text::starts_with_space (void)
+{
+ return start_space;
+}
+
+/*
+ * retrieve_para_space - returns TRUE, if the paragraph starts with
+ * a space and text has not yet been emitted.
+ * If TRUE is returned, then the, start_space,
+ * variable is set to FALSE.
+ */
+
+int html_text::retrieve_para_space (void)
+{
+ if (start_space && blank_para) {
+ start_space = FALSE;
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+/*
+ * emit_space - writes a space providing that text was written beforehand.
+ */
+
+void html_text::emit_space (void)
+{
+ if (is_present(PRE_TAG))
+ do_emittext(" ", 1);
+ else
+ out->space_or_newline();
+
+ space_emitted = TRUE;
+}
+
+/*
+ * remove_def - removes a definition, t, from the stack.
+ */
+
+void html_text::remove_def (tag_definition *t)
+{
+ tag_definition *p = stackptr;
+ tag_definition *l = 0;
+
+ while ((p != 0) && (p != t)) {
+ l = p;
+ p = p->next;
+ }
+ if ((p != 0) && (p == t)) {
+ if (p == stackptr) {
+ stackptr = stackptr->next;
+ if (stackptr == NULL)
+ lastptr = NULL;
+ } else if (l == 0) {
+ error("stack list pointers are wrong");
+ } else {
+ l->next = p->next;
+ if (l->next == NULL)
+ lastptr = l;
+ }
+ delete p;
+ }
+}
+
+/*
+ * remove_tag - removes a tag from the stack.
+ */
+
+void html_text::remove_tag (HTML_TAG tag)
+{
+ tag_definition *p = stackptr;
+
+ while ((p != 0) && (p->type != tag)) {
+ p = p->next;
+ }
+ if ((p != 0) && (p->type == tag))
+ remove_def(p);
+}
+
+/*
+ * remove_sub_sup - removes a sub or sup tag, should either exist
+ * on the stack.
+ */
+
+void html_text::remove_sub_sup (void)
+{
+ if (is_present(SUB_TAG)) {
+ remove_tag(SUB_TAG);
+ }
+ if (is_present(SUP_TAG)) {
+ remove_tag(SUP_TAG);
+ }
+ if (is_present(PRE_TAG)) {
+ remove_tag(PRE_TAG);
+ }
+}
+
+/*
+ * remove_break - break tags are not balanced thus remove it once it has been emitted.
+ * It returns TRUE if text was emitted before the <br> was issued.
+ */
+
+int html_text::remove_break (void)
+{
+ tag_definition *p = stackptr;
+ tag_definition *l = 0;
+ tag_definition *q = 0;
+
+ while ((p != 0) && (p->type != BREAK_TAG)) {
+ l = p;
+ p = p->next;
+ }
+ if ((p != 0) && (p->type == BREAK_TAG)) {
+ if (p == stackptr) {
+ stackptr = stackptr->next;
+ if (stackptr == NULL)
+ lastptr = NULL;
+ q = stackptr;
+ } else if (l == 0)
+ error("stack list pointers are wrong");
+ else {
+ l->next = p->next;
+ q = p->next;
+ if (l->next == NULL)
+ lastptr = l;
+ }
+ delete p;
+ }
+ /*
+ * now determine whether text was issued before <br>
+ */
+ while (q != 0) {
+ if (q->text_emitted)
+ return TRUE;
+ else
+ q = q->next;
+ }
+ return FALSE;
+}
+
+/*
+ * remove_para_align - removes a paragraph which has a text
+ * argument. If the paragraph has no text
+ * argument then it is left alone.
+ */
+
+void html_text::remove_para_align (void)
+{
+ if (is_present(P_TAG)) {
+ tag_definition *p=stackptr;
+
+ while (p != NULL) {
+ if (p->type == P_TAG && p->arg1 != NULL) {
+ html_indent *i = remove_indent(P_TAG);
+ int space = retrieve_para_space();
+ done_para();
+ do_para("", i, space);
+ return;
+ }
+ p = p->next;
+ }
+ }
+}
+
+/*
+ * get_alignment - returns the alignment for the paragraph.
+ * If no alignment was given then we return "".
+ */
+
+char *html_text::get_alignment (void)
+{
+ if (is_present(P_TAG)) {
+ tag_definition *p=stackptr;
+
+ while (p != NULL) {
+ if (p->type == P_TAG && p->arg1 != NULL)
+ return (char *)p->arg1;
+ p = p->next;
+ }
+ }
+ return (char *)"";
+}
+
+/*
+ * do_small - potentially inserts a <small> tag into the html stream.
+ * However we check for a <big> tag, if present then we terminate it.
+ * Otherwise a <small> tag is inserted.
+ */
+
+void html_text::do_small (void)
+{
+ if (is_present(BIG_TAG))
+ done_big();
+ else
+ push_para(SMALL_TAG);
+}
+
+/*
+ * do_big - is the mirror image of do_small.
+ */
+
+void html_text::do_big (void)
+{
+ if (is_present(SMALL_TAG))
+ done_small();
+ else
+ push_para(BIG_TAG);
+}
+
+/*
+ * do_sup - save a superscript tag on the stack of tags.
+ */
+
+void html_text::do_sup (void)
+{
+ push_para(SUP_TAG);
+}
+
+/*
+ * do_sub - save a subscript tag on the stack of tags.
+ */
+
+void html_text::do_sub (void)
+{
+ push_para(SUB_TAG);
+}
diff --git a/src/devices/grohtml/html-text.h b/src/devices/grohtml/html-text.h
new file mode 100644
index 0000000..ee58601
--- /dev/null
+++ b/src/devices/grohtml/html-text.h
@@ -0,0 +1,138 @@
+// -*- C++ -*-
+/* Copyright (C) 2000-2020 Free Software Foundation, Inc.
+ *
+ * Gaius Mulley (gaius@glam.ac.uk) wrote html-text.h
+ *
+ * html-text.h
+ *
+ * provides a state machine interface which generates html text.
+ */
+
+/*
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "html.h"
+#include "html-table.h"
+
+#define STYLE_VERTICAL_SPACE "1em"
+
+/*
+ * supported html dialects.
+ */
+
+typedef enum {xhtml, html4} html_dialect;
+
+/*
+ * html tags
+ */
+
+typedef enum {I_TAG, B_TAG, P_TAG, SUB_TAG, SUP_TAG, TT_TAG,
+ PRE_TAG, SMALL_TAG, BIG_TAG, BREAK_TAG,
+ COLOR_TAG} HTML_TAG;
+
+typedef struct tag_definition {
+ HTML_TAG type;
+ void *arg1;
+ int text_emitted;
+ color col;
+ html_indent *indent;
+ tag_definition *next;
+} tag_definition ;
+
+/*
+ * the state of the current paragraph.
+ * It allows post-html.cpp to request font changes, paragraph start/end
+ * and emits balanced tags with a small amount of peephole optimization.
+ */
+
+class html_text {
+public:
+ html_text (simple_output *op, html_dialect d);
+ ~html_text (void);
+ void flush_text (void);
+ void do_emittext (const char *s, int length);
+ void do_italic (void);
+ void do_bold (void);
+ void do_roman (void);
+ void do_tt (void);
+ void do_pre (void);
+ void do_small (void);
+ void do_big (void);
+ void do_para (const char *arg, int space); // used for no indentation
+ void do_para (simple_output *op, const char *arg1,
+ int indentation, int pageoffset, int linelength,
+ int space);
+ void do_sup (void);
+ void do_sub (void);
+ void do_space (void);
+ void do_break (void);
+ void do_newline (void);
+ void do_table (const char *arg);
+ void done_bold (void);
+ void done_italic (void);
+ char *done_para (void);
+ void done_sup (void);
+ void done_sub (void);
+ void done_tt (void);
+ void done_pre (void);
+ void done_small (void);
+ void done_big (void);
+ void do_color (color *c);
+ void done_color (void);
+ int emitted_text (void);
+ int ever_emitted_text (void);
+ int starts_with_space (void);
+ int retrieve_para_space (void);
+ void emit_space (void);
+ int is_in_pre (void);
+ int uses_indent (void);
+ void remove_tag (HTML_TAG tag);
+ void remove_sub_sup (void);
+ void remove_para_align (void);
+ void remove_para_space (void);
+ char *get_alignment (void);
+
+private:
+ tag_definition *stackptr; /* the current paragraph state */
+ tag_definition *lastptr; /* the end of the stack */
+ simple_output *out;
+ html_dialect dialect; /* which dialect of html? */
+ int space_emitted; /* just emitted a space? */
+ int current_indentation; /* current .in value */
+ int pageoffset; /* .po value */
+ int linelength; /* current line length */
+ int blank_para; /* have we ever written text? */
+ int start_space; /* does para start with a .sp */
+ html_indent *indent; /* our indent class */
+
+ int is_present (HTML_TAG t);
+ void end_tag (tag_definition *t);
+ void start_tag (tag_definition *t);
+ void do_para (const char *arg, html_indent *in, int space);
+ void push_para (HTML_TAG t);
+ void push_para (HTML_TAG t, void *arg, html_indent *in);
+ void push_para (color *c);
+ void do_push (tag_definition *p);
+ char *shutdown (HTML_TAG t);
+ void check_emit_text (tag_definition *t);
+ int remove_break (void);
+ void issue_tag (const char *tagname, const char *arg, int space=2);
+ void issue_color_begin (color *c);
+ void remove_def (tag_definition *t);
+ html_indent *remove_indent (HTML_TAG tag);
+ void dump_stack_element (tag_definition *p);
+ void dump_stack (void);
+};
diff --git a/src/devices/grohtml/html.h b/src/devices/grohtml/html.h
new file mode 100644
index 0000000..4828646
--- /dev/null
+++ b/src/devices/grohtml/html.h
@@ -0,0 +1,97 @@
+// -*- C++ -*-
+/* Copyright (C) 2000-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#if !defined(HTML_H)
+# define HTML_H
+
+const int INT_HEXDIGITS = 16; // enough for 64-bit ints
+
+/*
+ * class and structure needed to buffer words
+ */
+
+struct word {
+ char *s;
+ word *next;
+
+ word (const char *w, int n);
+ ~word ();
+};
+
+class word_list {
+public:
+ word_list ();
+ int flush (FILE *f);
+ void add_word (const char *s, int n);
+ int get_length (void);
+
+private:
+ int length;
+ word *head;
+ word *tail;
+};
+
+class simple_output {
+public:
+ simple_output(FILE *, int max_line_length);
+ simple_output &put_string(const char *, int);
+ simple_output &put_string(const char *s);
+ simple_output &put_string(const string &s);
+ simple_output &put_troffps_char (const char *s);
+ simple_output &put_translated_string(const char *s);
+ simple_output &put_number(int);
+ simple_output &put_float(double);
+ simple_output &put_symbol(const char *);
+ simple_output &put_literal_symbol(const char *);
+ simple_output &set_fixed_point(int);
+ simple_output &simple_comment(const char *);
+ simple_output &begin_comment(const char *);
+ simple_output &comment_arg(const char *);
+ simple_output &end_comment();
+ simple_output &set_file(FILE *);
+ simple_output &include_file(FILE *);
+ simple_output &copy_file(FILE *);
+ simple_output &end_line();
+ simple_output &put_raw_char(char);
+ simple_output &special(const char *);
+ simple_output &enable_newlines(int);
+ simple_output &check_newline(int n);
+ simple_output &nl(void);
+ simple_output &force_nl(void);
+ simple_output &space_or_newline (void);
+ simple_output &begin_tag (void);
+ FILE *get_file();
+private:
+ FILE *fp;
+ int max_line_length; // not including newline
+ int col;
+ int fixed_point;
+ int newlines; // can we issue newlines automatically?
+ word_list last_word;
+
+ void flush_last_word (void);
+ int check_space (const char *s, int n);
+};
+
+inline FILE *simple_output::get_file()
+{
+ return fp;
+}
+
+#endif
diff --git a/src/devices/grohtml/output.cpp b/src/devices/grohtml/output.cpp
new file mode 100644
index 0000000..0ffeb58
--- /dev/null
+++ b/src/devices/grohtml/output.cpp
@@ -0,0 +1,363 @@
+// -*- C++ -*-
+/* Copyright (C) 2000-2020 Free Software Foundation, Inc.
+ *
+ * Gaius Mulley (gaius@glam.ac.uk) wrote output.cpp
+ * but it owes a huge amount of ideas and raw code from
+ * James Clark (jjc@jclark.com) grops/ps.cpp.
+ *
+ * output.cpp
+ *
+ * provide the simple low level output routines needed by html.cpp
+ */
+
+/*
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "driver.h"
+#include "stringclass.h"
+#include "cset.h"
+
+#include <time.h>
+#include "html.h"
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#if !defined(TRUE)
+# define TRUE (1==1)
+#endif
+#if !defined(FALSE)
+# define FALSE (1==0)
+#endif
+
+
+#if defined(DEBUGGING)
+# define FPUTC(X,Y) do { fputc((X),(Y)); fputc((X), stderr); fflush(stderr); } while (0)
+# define FPUTS(X,Y) do { fputs((X),(Y)); fputs((X), stderr); fflush(stderr); } while (0)
+# define PUTC(X,Y) do { putc((X),(Y)); putc((X), stderr); fflush(stderr); } while (0)
+#else
+# define FPUTC(X,Y) do { fputc((X),(Y)); } while (0)
+# define FPUTS(X,Y) do { fputs((X),(Y)); } while (0)
+# define PUTC(X,Y) do { putc((X),(Y)); } while (0)
+#endif
+
+
+/*
+ * word - initialise a word and set next to NULL
+ */
+
+word::word (const char *w, int n)
+ : next(0)
+{
+ s = new char[n+1];
+ strncpy(s, w, n);
+ s[n] = (char)0;
+}
+
+/*
+ * destroy word and the string copy.
+ */
+
+word::~word ()
+{
+ delete[] s;
+}
+
+/*
+ * word_list - create an empty word list.
+ */
+
+word_list::word_list ()
+ : length(0), head(0), tail(0)
+{
+}
+
+/*
+ * flush - flush a word list to a FILE, f, and return the
+ * length of the buffered string.
+ */
+
+int word_list::flush (FILE *f)
+{
+ word *t;
+ int len=length;
+
+ while (head != 0) {
+ t = head;
+ head = head->next;
+ FPUTS(t->s, f);
+ delete t;
+ }
+ head = 0;
+ tail = 0;
+ length = 0;
+#if defined(DEBUGGING)
+ fflush(f); // just for testing
+#endif
+ return( len );
+}
+
+/*
+ * add_word - adds a word to the outstanding word list.
+ */
+
+void word_list::add_word (const char *s, int n)
+{
+ if (head == 0) {
+ head = new word(s, n);
+ tail = head;
+ } else {
+ tail->next = new word(s, n);
+ tail = tail->next;
+ }
+ length += n;
+}
+
+/*
+ * get_length - returns the number of characters buffered
+ */
+
+int word_list::get_length (void)
+{
+ return( length );
+}
+
+/*
+ * the classes and methods for simple_output manipulation
+ */
+
+simple_output::simple_output(FILE *f, int n)
+: fp(f), max_line_length(n), col(0), fixed_point(0), newlines(0)
+{
+}
+
+simple_output &simple_output::set_file(FILE *f)
+{
+ if (fp)
+ fflush(fp);
+ fp = f;
+ return *this;
+}
+
+simple_output &simple_output::copy_file(FILE *infp)
+{
+ int c;
+ while ((c = getc(infp)) != EOF)
+ PUTC(c, fp);
+ return *this;
+}
+
+simple_output &simple_output::end_line()
+{
+ flush_last_word();
+ if (col != 0) {
+ PUTC('\n', fp);
+ col = 0;
+ }
+ return *this;
+}
+
+simple_output &simple_output::special(const char *)
+{
+ return *this;
+}
+
+simple_output &simple_output::simple_comment(const char *s)
+{
+ flush_last_word();
+ if (col != 0)
+ PUTC('\n', fp);
+ FPUTS("<!-- ", fp);
+ FPUTS(s, fp);
+ FPUTS(" -->\n", fp);
+ col = 0;
+ return *this;
+}
+
+simple_output &simple_output::begin_comment(const char *s)
+{
+ flush_last_word();
+ if (col != 0)
+ PUTC('\n', fp);
+ col = 0;
+ put_string("<!--");
+ space_or_newline();
+ last_word.add_word(s, strlen(s));
+ return *this;
+}
+
+simple_output &simple_output::end_comment()
+{
+ flush_last_word();
+ space_or_newline();
+ put_string("-->").nl();
+ return *this;
+}
+
+/*
+ * check_newline - checks to see whether we are able to issue
+ * a newline and that one is needed.
+ */
+
+simple_output &simple_output::check_newline(int n)
+{
+ if ((col + n + last_word.get_length() + 1 > max_line_length) && (newlines)) {
+ FPUTC('\n', fp);
+ col = last_word.flush(fp);
+ }
+ return *this;
+}
+
+/*
+ * space_or_newline - will emit a newline or a space later on
+ * depending upon the current column.
+ */
+
+simple_output &simple_output::space_or_newline (void)
+{
+ if ((col + last_word.get_length() + 1 > max_line_length) && (newlines)) {
+ FPUTC('\n', fp);
+ if (last_word.get_length() > 0) {
+ col = last_word.flush(fp);
+ } else {
+ col = 0;
+ }
+ } else {
+ if (last_word.get_length() != 0) {
+ if (col > 0) {
+ FPUTC(' ', fp);
+ col++;
+ }
+ col += last_word.flush(fp);
+ }
+ }
+ return *this;
+}
+
+/*
+ * force_nl - forces a newline.
+ */
+
+simple_output &simple_output::force_nl (void)
+{
+ space_or_newline();
+ col += last_word.flush(fp);
+ FPUTC('\n', fp);
+ col = 0;
+ return *this ;
+}
+
+/*
+ * nl - writes a newline providing that we
+ * are not in the first column.
+ */
+
+simple_output &simple_output::nl (void)
+{
+ space_or_newline();
+ col += last_word.flush(fp);
+ FPUTC('\n', fp);
+ col = 0;
+ return *this ;
+}
+
+simple_output &simple_output::set_fixed_point(int n)
+{
+ assert(n >= 0 && n <= 10);
+ fixed_point = n;
+ return *this;
+}
+
+simple_output &simple_output::put_raw_char(char c)
+{
+ col += last_word.flush(fp);
+ PUTC(c, fp);
+ col++;
+ return *this;
+}
+
+simple_output &simple_output::put_string(const char *s, int n)
+{
+ last_word.add_word(s, n);
+ return *this;
+}
+
+simple_output &simple_output::put_string(const char *s)
+{
+ last_word.add_word(s, strlen(s));
+ return *this;
+}
+
+simple_output &simple_output::put_string(const string &s)
+{
+ last_word.add_word(s.contents(), s.length());
+ return *this;
+}
+
+simple_output &simple_output::put_number(int n)
+{
+ char buf[1 + INT_DIGITS + 1];
+ sprintf(buf, "%d", n);
+ put_string(buf);
+ return *this;
+}
+
+simple_output &simple_output::put_float(double d)
+{
+ char buf[128];
+
+ sprintf(buf, "%.4f", d);
+ put_string(buf);
+ return *this;
+}
+
+simple_output &simple_output::enable_newlines (int auto_newlines)
+{
+ check_newline(0);
+ newlines = auto_newlines;
+ check_newline(0);
+ return *this;
+}
+
+/*
+ * flush_last_word - flushes the last word and adjusts the
+ * col position. It will insert a newline
+ * before the last word if allowed and if
+ * necessary.
+ */
+
+void simple_output::flush_last_word (void)
+{
+ int len=last_word.get_length();
+
+ if (len > 0) {
+ if (newlines) {
+ if (col + len + 1 > max_line_length) {
+ FPUTS("\n", fp);
+ col = 0;
+ } else {
+ FPUTS(" ", fp);
+ col++;
+ }
+ len += last_word.flush(fp);
+ } else {
+ FPUTS(" ", fp);
+ col++;
+ col += last_word.flush(fp);
+ }
+ }
+}
diff --git a/src/devices/grohtml/post-html.cpp b/src/devices/grohtml/post-html.cpp
new file mode 100644
index 0000000..4e02b5c
--- /dev/null
+++ b/src/devices/grohtml/post-html.cpp
@@ -0,0 +1,5684 @@
+/* Copyright (C) 2000-2020 Free Software Foundation, Inc.
+ *
+ * Gaius Mulley (gaius@glam.ac.uk) wrote post-html.cpp
+ * but it owes a huge amount of ideas and raw code from
+ * James Clark (jjc@jclark.com) grops/ps.cpp.
+ */
+
+/*
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "driver.h"
+#include "stringclass.h"
+#include "cset.h"
+#include "html.h"
+#include "html-text.h"
+#include "html-table.h"
+#include "curtime.h"
+
+#include <time.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <string.h>
+
+extern "C" const char *Version_string;
+
+#if !defined(TRUE)
+# define TRUE (1==1)
+#endif
+#if !defined(FALSE)
+# define FALSE (1==0)
+#endif
+
+#define MAX_LINE_LENGTH 60 /* maximum characters we want in a line */
+#define SIZE_INCREMENT 2 /* font size increment <big> = +2 */
+#define CENTER_TOLERANCE 2 /* how many pixels off center do we allow */
+#define ANCHOR_TEMPLATE "heading" /* if simple anchor is set we use this */
+#define UNICODE_DESC_START 0x80 /* all character entities above this are */
+ /* either encoded by their glyph names or if */
+ /* there is no name then we use &#nnn; */
+typedef enum {CENTERED, LEFT, RIGHT, INLINE} TAG_ALIGNMENT;
+typedef enum {col_tag, tab_tag, tab0_tag, none} colType;
+
+#undef DEBUG_TABLES
+// #define DEBUG_TABLES
+
+/*
+ * prototypes
+ */
+
+const char *get_html_translation (font *f, const string &name);
+static const char *get_html_entity(unsigned int code);
+int char_translate_to_html (font *f, char *buf, int buflen, unsigned char ch, int b, int and_single);
+
+
+static int auto_links = TRUE; /* by default we enable automatic links at */
+ /* top of the document. */
+static int auto_rule = TRUE; /* by default we enable an automatic rule */
+ /* at the top and bottom of the document */
+static int simple_anchors = FALSE; /* default to anchors with heading text */
+static int manufacture_headings = FALSE; /* default is to use the Hn html headings, */
+ /* rather than manufacture our own. */
+static int do_write_creator_comment = TRUE; /* write Creator HTML comment */
+static int do_write_date_comment = TRUE; /* write CreationDate HTML comment */
+static color *default_background = 0; /* has user requested initial bg color? */
+static string job_name; /* if set then the output is split into */
+ /* multiple files with 'job_name'-%d.html */
+static int multiple_files = FALSE; /* must we the output be divided into */
+ /* multiple html files, one for each */
+ /* heading? */
+static int base_point_size = 0; /* which troff font size maps onto html */
+ /* size 3? */
+static int split_level = 2; /* what heading level to split at? */
+static string head_info; /* user supplied information to be placed */
+ /* into <head> </head> */
+static int valid_flag = FALSE; /* has user requested a valid flag at the */
+ /* end of each page? */
+static int groff_sig = FALSE; /* "This document was produced using" */
+html_dialect dialect = html4; /* which html dialect should grohtml output */
+
+
+/*
+ * start with a few favorites
+ */
+
+void stop () {}
+
+static int min (int a, int b)
+{
+ if (a < b)
+ return a;
+ else
+ return b;
+}
+
+static int max (int a, int b)
+{
+ if (a > b)
+ return a;
+ else
+ return b;
+}
+
+/*
+ * is_intersection - returns TRUE if range a1..a2 intersects with
+ * b1..b2
+ */
+
+static int is_intersection (int a1, int a2, int b1, int b2)
+{
+ // easier to prove NOT outside limits
+ return ! ((a1 > b2) || (a2 < b1));
+}
+
+/*
+ * is_digit - returns TRUE if character, ch, is a digit.
+ */
+
+static int is_digit (char ch)
+{
+ return (ch >= '0') && (ch <= '9');
+}
+
+/*
+ * the classes and methods for maintaining a list of files.
+ */
+
+struct file {
+ FILE *fp;
+ file *next;
+ int new_output_file;
+ int require_links;
+ string output_file_name;
+
+ file (FILE *f);
+};
+
+/*
+ * file - initialize all fields to null pointers
+ */
+
+file::file (FILE *f)
+ : fp(f), next(0), new_output_file(FALSE),
+ require_links(FALSE), output_file_name("")
+{
+}
+
+class files {
+public:
+ files ();
+ FILE *get_file (void);
+ void start_of_list (void);
+ void move_next (void);
+ void add_new_file (FILE *f);
+ void set_file_name (string name);
+ void set_links_required (void);
+ int are_links_required (void);
+ int is_new_output_file (void);
+ string file_name (void);
+ string next_file_name (void);
+private:
+ file *head;
+ file *tail;
+ file *ptr;
+};
+
+/*
+ * files - create an empty list of files.
+ */
+
+files::files ()
+ : head(0), tail(0), ptr(0)
+{
+}
+
+/*
+ * get_file - returns the FILE associated with ptr.
+ */
+
+FILE *files::get_file (void)
+{
+ if (ptr)
+ return ptr->fp;
+ else
+ return 0;
+}
+
+/*
+ * start_of_list - reset the ptr to the start of the list.
+ */
+
+void files::start_of_list (void)
+{
+ ptr = head;
+}
+
+/*
+ * move_next - moves the ptr to the next element on the list.
+ */
+
+void files::move_next (void)
+{
+ if (ptr != 0)
+ ptr = ptr->next;
+}
+
+/*
+ * add_new_file - adds a new file, f, to the list.
+ */
+
+void files::add_new_file (FILE *f)
+{
+ if (0 /* nullptr */ == head) {
+ head = new file(f);
+ tail = head;
+ } else {
+ tail->next = new file(f);
+ tail = tail->next;
+ }
+ ptr = tail;
+}
+
+/*
+ * set_file_name - sets the final file name to contain the html
+ * data to name.
+ */
+
+void files::set_file_name (string name)
+{
+ if (ptr != 0) {
+ ptr->output_file_name = name;
+ ptr->new_output_file = TRUE;
+ }
+}
+
+/*
+ * set_links_required - issue links when processing this component
+ * of the file.
+ */
+
+void files::set_links_required (void)
+{
+ if (ptr != 0)
+ ptr->require_links = TRUE;
+}
+
+/*
+ * are_links_required - returns TRUE if this section of the file
+ * requires that links should be issued.
+ */
+
+int files::are_links_required (void)
+{
+ if (ptr != 0)
+ return ptr->require_links;
+ return FALSE;
+}
+
+/*
+ * is_new_output_file - returns TRUE if this component of the file
+ * is the start of a new output file.
+ */
+
+int files::is_new_output_file (void)
+{
+ if (ptr != 0)
+ return ptr->new_output_file;
+ return FALSE;
+}
+
+/*
+ * file_name - returns the name of the file.
+ */
+
+string files::file_name (void)
+{
+ if (ptr != 0)
+ return ptr->output_file_name;
+ return string("");
+}
+
+/*
+ * next_file_name - returns the name of the next file.
+ */
+
+string files::next_file_name (void)
+{
+ if (ptr != 0 && ptr->next != 0)
+ return ptr->next->output_file_name;
+ return string("");
+}
+
+/*
+ * the class and methods for styles
+ */
+
+struct style {
+ font *f;
+ int point_size;
+ int font_no;
+ int height;
+ int slant;
+ color col;
+ style ();
+ style (font *, int, int, int, int, color);
+ int operator == (const style &) const;
+ int operator != (const style &) const;
+};
+
+style::style()
+ : f(0), point_size(-1)
+{
+}
+
+style::style(font *p, int sz, int h, int sl, int no, color c)
+ : f(p), point_size(sz), font_no(no), height(h), slant(sl), col(c)
+{
+}
+
+int style::operator==(const style &s) const
+{
+ return (f == s.f && point_size == s.point_size
+ && height == s.height && slant == s.slant && col == s.col);
+}
+
+int style::operator!=(const style &s) const
+{
+ return !(*this == s);
+}
+
+/*
+ * the class and methods for retaining ascii text
+ */
+
+struct char_block {
+ enum { SIZE = 256 };
+ char *buffer;
+ int used;
+ char_block *next;
+
+ char_block();
+ char_block(int length);
+ ~char_block();
+};
+
+char_block::char_block()
+: buffer(0), used(0), next(0)
+{
+}
+
+char_block::char_block(int length)
+: used(0), next(0)
+{
+ buffer = new char[max(length, char_block::SIZE)];
+ if (0 /* nullptr */ == buffer)
+ fatal("out of memory error");
+}
+
+char_block::~char_block()
+{
+ if (buffer != 0)
+ delete[] buffer;
+}
+
+class char_buffer {
+public:
+ char_buffer();
+ ~char_buffer();
+ char *add_string(const char *, unsigned int);
+ char *add_string(const string &);
+private:
+ char_block *head;
+ char_block *tail;
+};
+
+char_buffer::char_buffer()
+: head(0), tail(0)
+{
+}
+
+char_buffer::~char_buffer()
+{
+ while (head != 0) {
+ char_block *temp = head;
+ head = head->next;
+ delete temp;
+ }
+}
+
+char *char_buffer::add_string (const char *s, unsigned int length)
+{
+ int i = 0;
+ unsigned int old_used;
+
+ if (0 /* nullptr */ == s|| length == 0)
+ return 0;
+
+ if (0 /* nullptr */ == tail) {
+ tail = new char_block(length+1);
+ head = tail;
+ } else {
+ if (tail->used + length+1 > char_block::SIZE) {
+ tail->next = new char_block(length+1);
+ tail = tail->next;
+ }
+ }
+
+ old_used = tail->used;
+ do {
+ tail->buffer[tail->used] = s[i];
+ tail->used++;
+ i++;
+ length--;
+ } while (length>0);
+
+ // add terminating nul character
+
+ tail->buffer[tail->used] = '\0';
+ tail->used++;
+
+ // and return start of new string
+
+ return &tail->buffer[old_used];
+}
+
+char *char_buffer::add_string (const string &s)
+{
+ return add_string(s.contents(), s.length());
+}
+
+/*
+ * the classes and methods for maintaining glyph positions.
+ */
+
+class text_glob {
+public:
+ void text_glob_html (style *s, char *str, int length,
+ int min_vertical, int min_horizontal,
+ int max_vertical, int max_horizontal);
+ void text_glob_special (style *s, char *str, int length,
+ int min_vertical, int min_horizontal,
+ int max_vertical, int max_horizontal);
+ void text_glob_line (style *s,
+ int min_vertical, int min_horizontal,
+ int max_vertical, int max_horizontal,
+ int thickness);
+ void text_glob_auto_image(style *s, char *str, int length,
+ int min_vertical, int min_horizontal,
+ int max_vertical, int max_horizontal);
+ void text_glob_tag (style *s, char *str, int length,
+ int min_vertical, int min_horizontal,
+ int max_vertical, int max_horizontal);
+
+ text_glob (void);
+ ~text_glob (void);
+ int is_a_line (void);
+ int is_a_tag (void);
+ int is_eol (void);
+ int is_auto_img (void);
+ int is_br (void);
+ int is_in (void);
+ int is_po (void);
+ int is_ti (void);
+ int is_ll (void);
+ int is_ce (void);
+ int is_tl (void);
+ int is_eo_tl (void);
+ int is_eol_ce (void);
+ int is_col (void);
+ int is_tab (void);
+ int is_tab0 (void);
+ int is_ta (void);
+ int is_tab_ts (void);
+ int is_tab_te (void);
+ int is_nf (void);
+ int is_fi (void);
+ int is_eo_h (void);
+ int get_arg (void);
+ int get_tab_args (char *align);
+
+ void remember_table (html_table *t);
+ html_table *get_table (void);
+
+ style text_style;
+ const char *text_string;
+ unsigned int text_length;
+ int minv, minh, maxv, maxh;
+ int is_tag; // is this a .br, .sp, .tl etc
+ int is_img_auto; // image created by eqn delim
+ int is_special; // text has come via 'x X html:'
+ int is_line; // is the command a <line>?
+ int thickness; // the thickness of a line
+ html_table *tab; // table description
+
+private:
+ text_glob (style *s, const char *str, int length,
+ int min_vertical , int min_horizontal,
+ int max_vertical , int max_horizontal,
+ bool is_troff_command,
+ bool is_auto_image, bool is_special_command,
+ bool is_a_line , int thickness);
+};
+
+text_glob::text_glob (style *s, const char *str, int length,
+ int min_vertical, int min_horizontal,
+ int max_vertical, int max_horizontal,
+ bool is_troff_command,
+ bool is_auto_image, bool is_special_command,
+ bool is_a_line_flag, int line_thickness)
+ : text_style(*s), text_string(str), text_length(length),
+ minv(min_vertical), minh(min_horizontal), maxv(max_vertical),
+ maxh(max_horizontal), is_tag(is_troff_command),
+ is_img_auto(is_auto_image), is_special(is_special_command),
+ is_line(is_a_line_flag), thickness(line_thickness), tab(0)
+{
+}
+
+text_glob::text_glob ()
+ : text_string(0), text_length(0), minv(-1), minh(-1), maxv(-1),
+ maxh(-1), is_tag(FALSE), is_special(FALSE), is_line(FALSE),
+ thickness(0), tab(0)
+{
+}
+
+text_glob::~text_glob ()
+{
+ if (tab != 0)
+ delete tab;
+}
+
+/*
+ * text_glob_html - used to place html text into the glob buffer.
+ */
+
+void text_glob::text_glob_html (style *s, char *str, int length,
+ int min_vertical , int min_horizontal,
+ int max_vertical , int max_horizontal)
+{
+ text_glob *g = new text_glob(s, str, length,
+ min_vertical, min_horizontal,
+ max_vertical, max_horizontal,
+ FALSE, FALSE, FALSE, FALSE, 0);
+ *this = *g;
+ delete g;
+}
+
+/*
+ * text_glob_html - used to place html specials into the glob buffer.
+ * This text is essentially html commands coming
+ * through from the macro sets, with special
+ * designated sequences of characters translated into
+ * html. See add_and_encode.
+ */
+
+void text_glob::text_glob_special (style *s, char *str, int length,
+ int min_vertical, int min_horizontal,
+ int max_vertical, int max_horizontal)
+{
+ text_glob *g = new text_glob(s, str, length,
+ min_vertical, min_horizontal,
+ max_vertical, max_horizontal,
+ FALSE, FALSE, TRUE, FALSE, 0);
+ *this = *g;
+ delete g;
+}
+
+/*
+ * text_glob_line - record horizontal draw line commands.
+ */
+
+void text_glob::text_glob_line (style *s,
+ int min_vertical, int min_horizontal,
+ int max_vertical, int max_horizontal,
+ int thickness_value)
+{
+ text_glob *g = new text_glob(s, "", 0,
+ min_vertical, min_horizontal,
+ max_vertical, max_horizontal,
+ FALSE, FALSE, FALSE, TRUE,
+ thickness_value);
+ *this = *g;
+ delete g;
+}
+
+/*
+ * text_glob_auto_image - record the presence of a .auto-image tag
+ * command. Used to mark that an image has been
+ * created automatically by a preprocessor and
+ * (pre-grohtml/troff) combination. Under some
+ * circumstances images may not be created.
+ * (consider .EQ
+ * delim $$
+ * .EN
+ * .TS
+ * tab(!), center;
+ * l!l.
+ * $1 over x$!recripical of x
+ * .TE
+ * the first auto-image marker is created via
+ * .EQ/.EN pair and no image is created. The
+ * second auto-image marker occurs at $1 over
+ * x$ Currently this image will not be created
+ * as the whole of the table is created as an
+ * image. (Once html tables are handled by
+ * grohtml this will change. Shortly this will
+ * be the case).
+ */
+
+void text_glob::text_glob_auto_image(style *s, char *str, int length,
+ int min_vertical,
+ int min_horizontal,
+ int max_vertical,
+ int max_horizontal)
+{
+ text_glob *g = new text_glob(s, str, length,
+ min_vertical, min_horizontal,
+ max_vertical, max_horizontal,
+ TRUE, TRUE, FALSE, FALSE, 0);
+ *this = *g;
+ delete g;
+}
+
+/*
+ * text_glob_tag - records a troff tag.
+ */
+
+void text_glob::text_glob_tag (style *s, char *str, int length,
+ int min_vertical, int min_horizontal,
+ int max_vertical, int max_horizontal)
+{
+ text_glob *g = new text_glob(s, str, length,
+ min_vertical, min_horizontal,
+ max_vertical, max_horizontal,
+ TRUE, FALSE, FALSE, FALSE, 0);
+ *this = *g;
+ delete g;
+}
+
+/*
+ * is_a_line - returns TRUE if glob should be converted into an <hr>
+ */
+
+int text_glob::is_a_line (void)
+{
+ return is_line;
+}
+
+/*
+ * is_a_tag - returns TRUE if glob contains a troff directive.
+ */
+
+int text_glob::is_a_tag (void)
+{
+ return is_tag;
+}
+
+/*
+ * is_eol - returns TRUE if glob contains the tag eol
+ */
+
+int text_glob::is_eol (void)
+{
+ return is_tag && (strcmp(text_string, "devtag:.eol") == 0);
+}
+
+/*
+ * is_eol_ce - returns TRUE if glob contains the tag eol.ce
+ */
+
+int text_glob::is_eol_ce (void)
+{
+ return is_tag && (strcmp(text_string, "devtag:eol.ce") == 0);
+}
+
+/*
+ * is_tl - returns TRUE if glob contains the tag .tl
+ */
+
+int text_glob::is_tl (void)
+{
+ return is_tag && (strcmp(text_string, "devtag:.tl") == 0);
+}
+
+/*
+ * is_eo_tl - returns TRUE if glob contains the tag eo.tl
+ */
+
+int text_glob::is_eo_tl (void)
+{
+ return is_tag && (strcmp(text_string, "devtag:.eo.tl") == 0);
+}
+
+/*
+ * is_nf - returns TRUE if glob contains the tag .fi 0
+ */
+
+int text_glob::is_nf (void)
+{
+ return is_tag && (strncmp(text_string, "devtag:.fi",
+ strlen("devtag:.fi")) == 0) &&
+ (get_arg() == 0);
+}
+
+/*
+ * is_fi - returns TRUE if glob contains the tag .fi 1
+ */
+
+int text_glob::is_fi (void)
+{
+ return (is_tag && (strncmp(text_string, "devtag:.fi",
+ strlen("devtag:.fi")) == 0) &&
+ (get_arg() == 1));
+}
+
+/*
+ * is_eo_h - returns TRUE if glob contains the tag .eo.h
+ */
+
+int text_glob::is_eo_h (void)
+{
+ return is_tag && (strcmp(text_string, "devtag:.eo.h") == 0);
+}
+
+/*
+ * is_ce - returns TRUE if glob contains the tag .ce
+ */
+
+int text_glob::is_ce (void)
+{
+ return is_tag && (strncmp(text_string, "devtag:.ce",
+ strlen("devtag:.ce")) == 0);
+}
+
+/*
+ * is_in - returns TRUE if glob contains the tag .in
+ */
+
+int text_glob::is_in (void)
+{
+ return is_tag && (strncmp(text_string, "devtag:.in ",
+ strlen("devtag:.in ")) == 0);
+}
+
+/*
+ * is_po - returns TRUE if glob contains the tag .po
+ */
+
+int text_glob::is_po (void)
+{
+ return is_tag && (strncmp(text_string, "devtag:.po ",
+ strlen("devtag:.po ")) == 0);
+}
+
+/*
+ * is_ti - returns TRUE if glob contains the tag .ti
+ */
+
+int text_glob::is_ti (void)
+{
+ return is_tag && (strncmp(text_string, "devtag:.ti ",
+ strlen("devtag:.ti ")) == 0);
+}
+
+/*
+ * is_ll - returns TRUE if glob contains the tag .ll
+ */
+
+int text_glob::is_ll (void)
+{
+ return is_tag && (strncmp(text_string, "devtag:.ll ",
+ strlen("devtag:.ll ")) == 0);
+}
+
+/*
+ * is_col - returns TRUE if glob contains the tag .col
+ */
+
+int text_glob::is_col (void)
+{
+ return is_tag && (strncmp(text_string, "devtag:.col",
+ strlen("devtag:.col")) == 0);
+}
+
+/*
+ * is_tab_ts - returns TRUE if glob contains the tag .tab_ts
+ */
+
+int text_glob::is_tab_ts (void)
+{
+ return is_tag && (strcmp(text_string, "devtag:.tab-ts") == 0);
+}
+
+/*
+ * is_tab_te - returns TRUE if glob contains the tag .tab_te
+ */
+
+int text_glob::is_tab_te (void)
+{
+ return is_tag && (strcmp(text_string, "devtag:.tab-te") == 0);
+}
+
+/*
+ * is_ta - returns TRUE if glob contains the tag .ta
+ */
+
+int text_glob::is_ta (void)
+{
+ return is_tag && (strncmp(text_string, "devtag:.ta ",
+ strlen("devtag:.ta ")) == 0);
+}
+
+/*
+ * is_tab - returns TRUE if glob contains the tag tab
+ */
+
+int text_glob::is_tab (void)
+{
+ return is_tag && (strncmp(text_string, "devtag:tab ",
+ strlen("devtag:tab ")) == 0);
+}
+
+/*
+ * is_tab0 - returns TRUE if glob contains the tag tab0
+ */
+
+int text_glob::is_tab0 (void)
+{
+ return is_tag && (strncmp(text_string, "devtag:tab0",
+ strlen("devtag:tab0")) == 0);
+}
+
+/*
+ * is_auto_img - returns TRUE if the glob contains an automatically
+ * generated image.
+ */
+
+int text_glob::is_auto_img (void)
+{
+ return is_img_auto;
+}
+
+/*
+ * is_br - returns TRUE if the glob is a tag containing a .br
+ * or an implied .br. Note that we do not include .nf or .fi
+ * as grohtml will place a .br after these commands if they
+ * should break the line.
+ */
+
+int text_glob::is_br (void)
+{
+ return is_a_tag() && ((strcmp ("devtag:.br", text_string) == 0) ||
+ (strncmp("devtag:.sp", text_string,
+ strlen("devtag:.sp")) == 0));
+}
+
+int text_glob::get_arg (void)
+{
+ if (strncmp("devtag:", text_string, strlen("devtag:")) == 0) {
+ const char *p = text_string;
+
+ while ((*p != (char)0) && (!isspace(*p)))
+ p++;
+ while ((*p != (char)0) && (isspace(*p)))
+ p++;
+ if (*p == (char)0)
+ return -1;
+ return atoi(p);
+ }
+ return -1;
+}
+
+/*
+ * get_tab_args - returns the tab position and alignment of the tab tag
+ */
+
+int text_glob::get_tab_args (char *align)
+{
+ if (strncmp("devtag:", text_string, strlen("devtag:")) == 0) {
+ const char *p = text_string;
+
+ // firstly the alignment C|R|L
+ while ((*p != (char)0) && (!isspace(*p)))
+ p++;
+ while ((*p != (char)0) && (isspace(*p)))
+ p++;
+ *align = *p;
+ // now the int value
+ while ((*p != (char)0) && (!isspace(*p)))
+ p++;
+ while ((*p != (char)0) && (isspace(*p)))
+ p++;
+ if (*p == (char)0)
+ return -1;
+ return atoi(p);
+ }
+ return -1;
+}
+
+/*
+ * remember_table - saves table, t, in the text_glob.
+ */
+
+void text_glob::remember_table (html_table *t)
+{
+ if (tab != 0)
+ delete tab;
+ tab = t;
+}
+
+/*
+ * get_table - returns the stored table description.
+ */
+
+html_table *text_glob::get_table (void)
+{
+ return tab;
+}
+
+/*
+ * the class and methods used to construct ordered double linked
+ * lists. In a previous implementation we used templates via
+ * #include "ordered-list.h", but this does assume that all C++
+ * compilers can handle this feature. Pragmatically it is safer to
+ * assume this is not the case.
+ */
+
+struct element_list {
+ element_list *right;
+ element_list *left;
+ text_glob *datum;
+ int lineno;
+ int minv, minh, maxv, maxh;
+
+ element_list (text_glob *d,
+ int line_number,
+ int min_vertical, int min_horizontal,
+ int max_vertical, int max_horizontal);
+ element_list ();
+ ~element_list ();
+};
+
+element_list::element_list ()
+ : right(0), left(0), datum(0), lineno(0), minv(-1), minh(-1),
+ maxv(-1), maxh(-1)
+{
+}
+
+/*
+ * element_list - create a list element assigning the datum and region
+ * parameters.
+ */
+
+element_list::element_list (text_glob *in,
+ int line_number,
+ int min_vertical, int min_horizontal,
+ int max_vertical, int max_horizontal)
+ : right(0), left(0), datum(in), lineno(line_number),
+ minv(min_vertical), minh(min_horizontal),
+ maxv(max_vertical), maxh(max_horizontal)
+{
+}
+
+element_list::~element_list ()
+{
+ if (datum != 0)
+ delete datum;
+}
+
+class list {
+public:
+ list ();
+ ~list ();
+ int is_less (element_list *a, element_list *b);
+ void add (text_glob *in,
+ int line_number,
+ int min_vertical, int min_horizontal,
+ int max_vertical, int max_horizontal);
+ void sub_move_right (void);
+ void move_right (void);
+ void move_left (void);
+ int is_empty (void);
+ int is_equal_to_tail (void);
+ int is_equal_to_head (void);
+ void start_from_head (void);
+ void start_from_tail (void);
+ void insert (text_glob *in);
+ void move_to (text_glob *in);
+ text_glob *move_right_get_data (void);
+ text_glob *move_left_get_data (void);
+ text_glob *get_data (void);
+private:
+ element_list *head;
+ element_list *tail;
+ element_list *ptr;
+};
+
+/*
+ * list - construct an empty list.
+ */
+
+list::list ()
+ : head(0), tail(0), ptr(0)
+{
+}
+
+/*
+ * ~list - destroy a complete list.
+ */
+
+list::~list()
+{
+ element_list *temp=head;
+
+ do {
+ temp = head;
+ if (temp != 0) {
+ head = head->right;
+ delete temp;
+ }
+ } while ((head != 0) && (head != tail));
+}
+
+/*
+ * is_less - returns TRUE if a is left of b if on the same line or
+ * if a is higher up the page than b.
+ */
+
+int list::is_less (element_list *a, element_list *b)
+{
+ // was:
+ // if (is_intersection(a->minv+1, a->maxv-1, b->minv+1, b->maxv-1)) {
+ if (a->lineno < b->lineno) {
+ return TRUE;
+ } else if (a->lineno > b->lineno) {
+ return FALSE;
+ } else if (is_intersection(a->minv, a->maxv, b->minv, b->maxv)) {
+ return (a->minh < b->minh);
+ } else {
+ return (a->maxv < b->maxv);
+ }
+}
+
+/*
+ * add - adds a datum to the list in the order specified by the
+ * region position.
+ */
+
+void list::add (text_glob *in, int line_number,
+ int min_vertical, int min_horizontal,
+ int max_vertical, int max_horizontal)
+{
+ // create a new list element with datum and position fields
+ // initialized
+ element_list *t = new element_list(in, line_number,
+ min_vertical, min_horizontal,
+ max_vertical, max_horizontal);
+ element_list *last;
+
+#if 0
+ fprintf(stderr, "[%s %d,%d,%d,%d] ",
+ in->text_string, min_vertical, min_horizontal,
+ max_vertical, max_horizontal);
+ fflush(stderr);
+#endif
+
+ if (0 /* nullptr */ == head) {
+ head = t;
+ tail = t;
+ ptr = t;
+ t->left = t;
+ t->right = t;
+ } else {
+ last = tail;
+
+ while ((last != head) && (is_less(t, last)))
+ last = last->left;
+
+ if (is_less(t, last)) {
+ t->right = last;
+ last->left->right = t;
+ t->left = last->left;
+ last->left = t;
+ // now check for a new head
+ if (last == head)
+ head = t;
+ } else {
+ // add t beyond last
+ t->right = last->right;
+ t->left = last;
+ last->right->left = t;
+ last->right = t;
+ // now check for a new tail
+ if (last == tail)
+ tail = t;
+ }
+ }
+}
+
+/*
+ * sub_move_right - removes the element which is currently pointed to
+ * by ptr from the list and moves ptr to the right.
+ */
+
+void list::sub_move_right (void)
+{
+ element_list *t=ptr->right;
+
+ if (head == tail) {
+ head = 0;
+ if (tail != 0)
+ delete tail;
+
+ tail = 0;
+ ptr = 0;
+ } else {
+ if (head == ptr)
+ head = head->right;
+ if (tail == ptr)
+ tail = tail->left;
+ ptr->left->right = ptr->right;
+ ptr->right->left = ptr->left;
+ ptr = t;
+ }
+}
+
+/*
+ * start_from_head - assigns ptr to the head.
+ */
+
+void list::start_from_head (void)
+{
+ ptr = head;
+}
+
+/*
+ * start_from_tail - assigns ptr to the tail.
+ */
+
+void list::start_from_tail (void)
+{
+ ptr = tail;
+}
+
+/*
+ * is_empty - returns TRUE if the list has no elements.
+ */
+
+int list::is_empty (void)
+{
+ return 0 /* nullptr */ == head;
+}
+
+/*
+ * is_equal_to_tail - returns TRUE if the ptr equals the tail.
+ */
+
+int list::is_equal_to_tail (void)
+{
+ return ptr == tail;
+}
+
+/*
+ * is_equal_to_head - returns TRUE if the ptr equals the head.
+ */
+
+int list::is_equal_to_head (void)
+{
+ return ptr == head;
+}
+
+/*
+ * move_left - moves the ptr left.
+ */
+
+void list::move_left (void)
+{
+ ptr = ptr->left;
+}
+
+/*
+ * move_right - moves the ptr right.
+ */
+
+void list::move_right (void)
+{
+ ptr = ptr->right;
+}
+
+/*
+ * get_datum - returns the datum referenced via ptr.
+ */
+
+text_glob* list::get_data (void)
+{
+ return ptr->datum;
+}
+
+/*
+ * move_right_get_data - returns the datum referenced via ptr and moves
+ * ptr right.
+ */
+
+text_glob* list::move_right_get_data (void)
+{
+ ptr = ptr->right;
+ if (ptr == head)
+ return 0;
+ else
+ return ptr->datum;
+}
+
+/*
+ * move_left_get_data - returns the datum referenced via ptr and moves
+ * ptr right.
+ */
+
+text_glob* list::move_left_get_data (void)
+{
+ ptr = ptr->left;
+ if (ptr == tail)
+ return 0;
+ else
+ return ptr->datum;
+}
+
+/*
+ * insert - inserts data after the current position.
+ */
+
+void list::insert (text_glob *in)
+{
+ if (is_empty())
+ fatal("list must not be empty if we are inserting data");
+ else {
+ if (0 /* nullptr */ == ptr)
+ ptr = head;
+
+ element_list *t = new element_list(in, ptr->lineno,
+ ptr->minv, ptr->minh,
+ ptr->maxv, ptr->maxh);
+ if (ptr == tail)
+ tail = t;
+ ptr->right->left = t;
+ t->right = ptr->right;
+ ptr->right = t;
+ t->left = ptr;
+ }
+}
+
+/*
+ * move_to - moves the current position to the point where data, in,
+ * exists. This is an expensive method and should be used
+ * sparingly.
+ */
+
+void list::move_to (text_glob *in)
+{
+ ptr = head;
+ while (ptr != tail && ptr->datum != in)
+ ptr = ptr->right;
+}
+
+/*
+ * page class and methods
+ */
+
+class page {
+public:
+ page (void);
+ void add (style *s, const string &str,
+ int line_number,
+ int min_vertical, int min_horizontal,
+ int max_vertical, int max_horizontal);
+ void add_tag (style *s, const string &str,
+ int line_number,
+ int min_vertical, int min_horizontal,
+ int max_vertical, int max_horizontal);
+ void add_and_encode (style *s, const string &str,
+ int line_number,
+ int min_vertical, int min_horizontal,
+ int max_vertical, int max_horizontal,
+ int is_tag);
+ void add_line (style *s,
+ int line_number,
+ int x1, int y1, int x2, int y2,
+ int thickness);
+ void insert_tag (const string &str);
+ void dump_page (void); // debugging method
+
+ // and the data
+
+ list glyphs; // position of glyphs and specials on page
+ char_buffer buffer; // all characters for this page
+};
+
+page::page()
+{
+}
+
+/*
+ * insert_tag - inserts a tag after the current position.
+ */
+
+void page::insert_tag (const string &str)
+{
+ if (str.length() > 0) {
+ text_glob *g=new text_glob();
+ text_glob *f=glyphs.get_data();
+ g->text_glob_tag(&f->text_style, buffer.add_string(str),
+ str.length(), f->minv, f->minh, f->maxv, f->maxh);
+ glyphs.insert(g);
+ }
+}
+
+/*
+ * add - add html text to the list of glyphs.
+ */
+
+void page::add (style *s, const string &str,
+ int line_number,
+ int min_vertical, int min_horizontal,
+ int max_vertical, int max_horizontal)
+{
+ if (str.length() > 0) {
+ text_glob *g=new text_glob();
+ g->text_glob_html(s, buffer.add_string(str), str.length(),
+ min_vertical, min_horizontal,
+ max_vertical, max_horizontal);
+ glyphs.add(g, line_number, min_vertical, min_horizontal,
+ max_vertical, max_horizontal);
+ }
+}
+
+/*
+ * add_tag - adds a troff tag, for example: .tl .sp .br
+ */
+
+void page::add_tag (style *s, const string &str,
+ int line_number,
+ int min_vertical, int min_horizontal,
+ int max_vertical, int max_horizontal)
+{
+ if (str.length() > 0) {
+ text_glob *g;
+
+ if (strncmp((str+'\0').contents(), "devtag:.auto-image",
+ strlen("devtag:.auto-image")) == 0) {
+ g = new text_glob();
+ g->text_glob_auto_image(s, buffer.add_string(str), str.length(),
+ min_vertical, min_horizontal,
+ max_vertical, max_horizontal);
+ } else {
+ g = new text_glob();
+ g->text_glob_tag(s, buffer.add_string(str), str.length(),
+ min_vertical, min_horizontal,
+ max_vertical, max_horizontal);
+ }
+ glyphs.add(g, line_number, min_vertical, min_horizontal,
+ max_vertical, max_horizontal);
+ }
+}
+
+/*
+ * add_line - adds the <line> primitive providing that y1==y2
+ */
+
+void page::add_line (style *s,
+ int line_number,
+ int x_1, int y_1, int x_2, int y_2,
+ int thickness)
+{
+ if (y_1 == y_2) {
+ text_glob *g = new text_glob();
+ g->text_glob_line(s,
+ min(y_1, y_2), min(x_1, x_2),
+ max(y_1, y_2), max(x_1, x_2),
+ thickness);
+ glyphs.add(g, line_number,
+ min(y_1, y_2), min(x_1, x_2),
+ max(y_1, y_2), max(x_1, x_2));
+ }
+}
+
+/*
+ * to_unicode - returns a unicode translation of int, ch.
+ */
+
+static char *to_unicode (unsigned int ch)
+{
+ static char buf[30];
+
+ sprintf(buf, "&#%u;", ch);
+ return buf;
+}
+
+/*
+ * add_and_encode - adds a special string to the page, it translates
+ * the string into html glyphs. The special string
+ * will have come from x X html: and can contain troff
+ * character encodings which appear as \[char]. A
+ * sequence of \\ represents \.
+ * So for example we can write:
+ * "cost = \[Po]3.00 file = \\foo\\bar"
+ * which is translated into:
+ * "cost = &pound;3.00 file = \foo\bar"
+ */
+
+void page::add_and_encode (style *s, const string &str,
+ int line_number,
+ int min_vertical, int min_horizontal,
+ int max_vertical, int max_horizontal,
+ int is_tag)
+{
+ string html_string;
+ const char *html_glyph;
+ int i = 0;
+ const int len = str.length();
+
+ if (0 /* nullptr */ == s->f)
+ return;
+ while (i < len) {
+ if ((i + 1 < len) && (str.substring(i, 2) == string("\\["))) {
+ // start of escape
+ i += 2; // move over \[
+ int a = i;
+ while ((i < len) && (str[i] != ']'))
+ i++;
+ if (i > 0) {
+ string troff_charname = str.substring(a, i - a);
+ html_glyph = get_html_translation(s->f, troff_charname);
+ if (html_glyph)
+ html_string += html_glyph;
+ else {
+ glyph *g = name_to_glyph((troff_charname + '\0').contents());
+ if (s->f->contains(g))
+ html_string += s->f->get_code(g);
+ }
+ }
+ }
+ else
+ html_string += str[i];
+ i++;
+ }
+ if (html_string.length() > 0) {
+ text_glob *g=new text_glob();
+ if (is_tag)
+ g->text_glob_tag(s, buffer.add_string(html_string),
+ html_string.length(),
+ min_vertical, min_horizontal,
+ max_vertical, max_horizontal);
+ else
+ g->text_glob_special(s, buffer.add_string(html_string),
+ html_string.length(),
+ min_vertical, min_horizontal,
+ max_vertical, max_horizontal);
+ glyphs.add(g, line_number, min_vertical,
+ min_horizontal, max_vertical, max_horizontal);
+ }
+}
+
+/*
+ * dump_page - dump the page contents for debugging purposes.
+ */
+
+void page::dump_page(void)
+{
+#if defined(DEBUG_TABLES)
+ text_glob *old_pos = glyphs.get_data();
+ text_glob *g;
+
+ printf("\n<!--\n");
+ printf("\n\ndebugging start\n");
+ glyphs.start_from_head();
+ do {
+ g = glyphs.get_data();
+ if (g->is_tab_ts()) {
+ printf("\n\n");
+ if (g->get_table() != 0)
+ g->get_table()->dump_table();
+ }
+ printf("%s ", g->text_string);
+ if (g->is_tab_te())
+ printf("\n\n");
+ glyphs.move_right();
+ } while (! glyphs.is_equal_to_head());
+ glyphs.move_to(old_pos);
+ printf("\ndebugging end\n\n");
+ printf("\n-->\n");
+ fflush(stdout);
+#endif
+}
+
+/*
+ * font classes and methods
+ */
+
+class html_font : public font {
+ html_font(const char *);
+public:
+ int encoding_index;
+ char *encoding;
+ char *reencoded_name;
+ ~html_font();
+ static html_font *load_html_font(const char *);
+};
+
+html_font *html_font::load_html_font(const char *s)
+{
+ html_font *f = new html_font(s);
+ if (!f->load()) {
+ delete f;
+ return 0;
+ }
+ return f;
+}
+
+html_font::html_font(const char *nm)
+: font(nm)
+{
+}
+
+html_font::~html_font()
+{
+}
+
+/*
+ * a simple class to contain the header to this document
+ */
+
+class title_desc {
+public:
+ title_desc ();
+ ~title_desc ();
+
+ int has_been_written;
+ int has_been_found;
+ int with_h1;
+ string text;
+};
+
+
+title_desc::title_desc ()
+ : has_been_written(FALSE), has_been_found(FALSE), with_h1(FALSE)
+{
+}
+
+title_desc::~title_desc ()
+{
+}
+
+class header_desc {
+public:
+ header_desc ();
+ ~header_desc ();
+
+ int no_of_level_one_headings; // how many .SH or .NH 1 have we found?
+ int no_of_headings; // how many headings have we found?
+ char_buffer headings; // all the headings used in the document
+ list headers; // list of headers built from .NH and .SH
+ list header_filename; // in which file is this header?
+ int header_level; // current header level
+ int written_header; // have we written the header yet?
+ string header_buffer; // current header text
+
+ void write_headings (FILE *f, int force);
+};
+
+header_desc::header_desc ()
+ : no_of_level_one_headings(0), no_of_headings(0), header_level(2),
+ written_header(0)
+{
+}
+
+header_desc::~header_desc ()
+{
+}
+
+/*
+ * write_headings - emits a list of links for the headings in this
+ * document
+ */
+
+void header_desc::write_headings (FILE *f, int force)
+{
+ text_glob *g;
+
+ if (auto_links || force) {
+ if (! headers.is_empty()) {
+ int h=1;
+
+ headers.start_from_head();
+ header_filename.start_from_head();
+ if (dialect == xhtml)
+ fputs("<p>", f);
+ do {
+ g = headers.get_data();
+ fputs("<a href=\"", f);
+ if (multiple_files && (! header_filename.is_empty())) {
+ text_glob *fn = header_filename.get_data();
+ fputs(fn->text_string, f);
+ }
+ fputs("#", f);
+ if (simple_anchors) {
+ string buffer(ANCHOR_TEMPLATE);
+
+ buffer += as_string(h);
+ buffer += '\0';
+ fprintf(f, "%s", buffer.contents());
+ } else
+ fputs(g->text_string, f);
+ h++;
+ fputs("\">", f);
+ fputs(g->text_string, f);
+ fputs("</a>", f);
+ if (dialect == xhtml)
+ fputs("<br/>\n", f);
+ else
+ fputs("<br>\n", f);
+ headers.move_right();
+ if (multiple_files && (! header_filename.is_empty()))
+ header_filename.move_right();
+ } while (! headers.is_equal_to_head());
+ fputs("\n", f);
+ if (dialect == xhtml)
+ fputs("</p>\n", f);
+ }
+ }
+}
+
+struct assert_pos {
+ assert_pos *next;
+ const char *val;
+ const char *id;
+};
+
+class assert_state {
+public:
+ assert_state ();
+ ~assert_state ();
+
+ void addx (const char *c, const char *i, const char *v,
+ const char *f, const char *l);
+ void addy (const char *c, const char *i, const char *v,
+ const char *f, const char *l);
+ void build(const char *c, const char *v,
+ const char *f, const char *l);
+ void check_br (int br);
+ void check_ce (int ce);
+ void check_fi (int fi);
+ void check_sp (int sp);
+ void reset (void);
+
+private:
+ int check_br_flag;
+ int check_ce_flag;
+ int check_fi_flag;
+ int check_sp_flag;
+ const char *val_br;
+ const char *val_ce;
+ const char *val_fi;
+ const char *val_sp;
+ const char *file_br;
+ const char *file_ce;
+ const char *file_fi;
+ const char *file_sp;
+ const char *line_br;
+ const char *line_ce;
+ const char *line_fi;
+ const char *line_sp;
+
+ assert_pos *xhead;
+ assert_pos *yhead;
+
+ void add (assert_pos **h,
+ const char *c, const char *i, const char *v,
+ const char *f, const char *l);
+ void compare(assert_pos *t,
+ const char *v, const char *f, const char *l);
+ void close (const char *c);
+ void set (const char *c, const char *v,
+ const char *f, const char *l);
+ void check_value (const char *s, int v, const char *name,
+ const char *f, const char *l, int *flag);
+ int check_value_error (int c, int v, const char *s,
+ const char *name,
+ const char *f, const char *l, int flag);
+};
+
+assert_state::assert_state ()
+{
+ reset();
+ val_br = 0;
+ val_ce = 0;
+ val_fi = 0;
+ val_sp = 0;
+ file_br = 0;
+ file_ce = 0;
+ file_fi = 0;
+ file_sp = 0;
+ line_br = 0;
+ line_ce = 0;
+ line_fi = 0;
+ line_sp = 0;
+ xhead = 0;
+ yhead = 0;
+}
+
+assert_state::~assert_state ()
+{
+ assert_pos *t;
+
+ while (xhead != 0) {
+ t = xhead;
+ xhead = xhead->next;
+ delete[] (char *)t->val;
+ delete[] (char *)t->id;
+ delete t;
+ }
+ while (yhead != 0) {
+ t = yhead;
+ yhead = yhead->next;
+ delete[] (char *)t->val;
+ delete[] (char *)t->id;
+ delete t;
+ }
+}
+
+void assert_state::reset (void)
+{
+ check_br_flag = 0;
+ check_ce_flag = 0;
+ check_fi_flag = 0;
+ check_sp_flag = 0;
+}
+
+void assert_state::add (assert_pos **h,
+ const char *c, const char *i, const char *v,
+ const char *f, const char *l)
+{
+ assert_pos *t = *h;
+
+ while (t != 0) {
+ if (strcmp(t->id, i) == 0)
+ break;
+ t = t->next;
+ }
+ if (t != 0 && v != 0 && (v[0] != '='))
+ compare(t, v, f, l);
+ else {
+ if (0 /* nullptr */ == t) {
+ t = new assert_pos;
+ t->next = *h;
+ (*h) = t;
+ }
+ if (v == 0 || v[0] != '=') {
+ if (0 /* nullptr */ == f)
+ f = strsave("stdin");
+ if (0 /* nullptr */ == l)
+ l = strsave("<none>");
+ if (0 /* nullptr */ == v)
+ v = "no value at all";
+ fprintf(stderr, "%s:%s:%s: error in assertion format of id=%s;"
+ " expected value prefixed with an '=', got %s\n",
+ program_name, f, l, i, v);
+ }
+ t->id = i;
+ t->val = v;
+ delete[] (char *)c;
+ delete[] (char *)f;
+ delete[] (char *)l;
+ }
+}
+
+void assert_state::addx (const char *c, const char *i, const char *v,
+ const char *f, const char *l)
+{
+ add(&xhead, c, i, v, f, l);
+}
+
+void assert_state::addy (const char *c, const char *i, const char *v,
+ const char *f, const char *l)
+{
+ add(&yhead, c, i, v, f, l);
+}
+
+void assert_state::compare(assert_pos *t,
+ const char *v, const char *f, const char *l)
+{
+ const char *s=t->val;
+
+ while ((*v) == '=')
+ v++;
+ while ((*s) == '=')
+ s++;
+
+ if (strcmp(v, s) != 0) {
+ if (0 /* nullptr */ == f)
+ f = "stdin";
+ if (0 /* nullptr */ == l)
+ l = "<none>";
+ fprintf(stderr, "%s:%s: grohtml assertion failed at id%s: "
+ "expected %s, got %s\n", f, l, t->id, s, v);
+ }
+}
+
+void assert_state::close (const char *c)
+{
+ if (strcmp(c, "sp") == 0)
+ check_sp_flag = 0;
+ else if (strcmp(c, "br") == 0)
+ check_br_flag = 0;
+ else if (strcmp(c, "fi") == 0)
+ check_fi_flag = 0;
+ else if (strcmp(c, "nf") == 0)
+ check_fi_flag = 0;
+ else if (strcmp(c, "ce") == 0)
+ check_ce_flag = 0;
+ else
+ fprintf(stderr, "internal error: unrecognised tag in grohtml "
+ "(%s)\n", c);
+}
+
+const char *replace_negate_str (const char *before, char *after)
+{
+ if (before != 0)
+ delete[] (char *)before;
+
+ if (strlen(after) > 0) {
+ int d = atoi(after);
+
+ if (d < 0 || d > 1) {
+ fprintf(stderr, "expected nf/fi value of 0 or 1, got %d\n", d);
+ d = 0;
+ }
+ if (d == 0)
+ after[0] = '1';
+ else
+ after[0] = '0';
+ after[1] = (char)0;
+ }
+ return after;
+}
+
+const char *replace_str (const char *before, const char *after)
+{
+ if (before != 0)
+ delete[] (char *)before;
+ return after;
+}
+
+void assert_state::set (const char *c, const char *v,
+ const char *f, const char *l)
+{
+ if (0 /* nullptr */ == l)
+ l = "<none>";
+ if (0 /* nullptr */ == f)
+ f = "stdin";
+
+ // fprintf(stderr, "%s:%s:setting %s to %s\n", f, l, c, v);
+ if (strcmp(c, "sp") == 0) {
+ check_sp_flag = 1;
+ val_sp = replace_str(val_sp, strsave(v));
+ file_sp = replace_str(file_sp, strsave(f));
+ line_sp = replace_str(line_sp, strsave(l));
+ } else if (strcmp(c, "br") == 0) {
+ check_br_flag = 1;
+ val_br = replace_str(val_br, strsave(v));
+ file_br = replace_str(file_br, strsave(f));
+ line_br = replace_str(line_br, strsave(l));
+ } else if (strcmp(c, "fi") == 0) {
+ check_fi_flag = 1;
+ val_fi = replace_str(val_fi, strsave(v));
+ file_fi = replace_str(file_fi, strsave(f));
+ line_fi = replace_str(line_fi, strsave(l));
+ } else if (strcmp(c, "nf") == 0) {
+ check_fi_flag = 1;
+ val_fi = replace_negate_str(val_fi, strsave(v));
+ file_fi = replace_str(file_fi, strsave(f));
+ line_fi = replace_str(line_fi, strsave(l));
+ } else if (strcmp(c, "ce") == 0) {
+ check_ce_flag = 1;
+ val_ce = replace_str(val_ce, strsave(v));
+ file_ce = replace_str(file_ce, strsave(f));
+ line_ce = replace_str(line_ce, strsave(l));
+ }
+}
+
+/*
+ * build - builds the troff state assertion.
+ * see tmac/www.tmac for cmd examples.
+ */
+
+void assert_state::build (const char *c, const char *v,
+ const char *f, const char *l)
+{
+ if (c[0] == '{')
+ set(&c[1], v, f, l);
+ if (c[0] == '}')
+ close(&c[1]);
+}
+
+int assert_state::check_value_error (int c, int v, const char *s,
+ const char *name, const char *f,
+ const char *l, int flag)
+{
+ if (! c) {
+ if (0 /* nullptr */ == f)
+ f = "stdin";
+ if (0 /* nullptr */ == l)
+ l = "<none>";
+ fprintf(stderr, "%s:%s:grohtml (troff state) assertion failed; "
+ "expected %s to be %s, got %d\n", f, l, name, s, v);
+ return 0;
+ }
+ return flag;
+}
+
+void assert_state::check_value (const char *s, int v, const char *name,
+ const char *f, const char *l, int *flag)
+{
+ if (strncmp(s, "<=", 2) == 0)
+ *flag = check_value_error(v <= atoi(&s[2]), v, s, name, f, l, *flag);
+ else if (strncmp(s, ">=", 2) == 0)
+ *flag = check_value_error(v >= atoi(&s[2]), v, s, name, f, l, *flag);
+ else if (strncmp(s, "==", 2) == 0)
+ *flag = check_value_error(v == atoi(&s[2]), v, s, name, f, l, *flag);
+ else if (strncmp(s, "!=", 2) == 0)
+ *flag = check_value_error(v != atoi(&s[2]), v, s, name, f, l, *flag);
+ else if (strncmp(s, "<", 1) == 0)
+ *flag = check_value_error(v < atoi(&s[2]), v, s, name, f, l, *flag);
+ else if (strncmp(s, ">", 1) == 0)
+ *flag = check_value_error(v > atoi(&s[2]), v, s, name, f, l, *flag);
+ else if (strncmp(s, "=", 1) == 0)
+ *flag = check_value_error(v == atoi(&s[1]), v, s, name, f, l, *flag);
+ else
+ *flag = check_value_error(v == atoi(s), v, s, name, f, l, *flag);
+}
+
+void assert_state::check_sp (int sp)
+{
+ if (check_sp_flag)
+ check_value(val_sp, sp, "sp", file_sp, line_sp, &check_sp_flag);
+}
+
+void assert_state::check_fi (int fi)
+{
+ if (check_fi_flag)
+ check_value(val_fi, fi, "fi", file_fi, line_fi, &check_fi_flag);
+}
+
+void assert_state::check_br (int br)
+{
+ if (check_br_flag)
+ check_value(val_br, br, "br", file_br, line_br, &check_br_flag);
+}
+
+void assert_state::check_ce (int ce)
+{
+ if (check_ce_flag)
+ check_value(val_ce, ce, "ce", file_ce, line_ce, &check_ce_flag);
+}
+
+class html_printer : public printer {
+ files file_list;
+ simple_output html;
+ int res;
+ glyph *space_glyph;
+ int space_width;
+ int no_of_printed_pages;
+ int paper_length;
+ string sbuf;
+ int sbuf_start_hpos;
+ int sbuf_vpos;
+ int sbuf_end_hpos;
+ int sbuf_prev_hpos;
+ int sbuf_kern;
+ style sbuf_style;
+ int last_sbuf_length;
+ int overstrike_detected;
+ style output_style;
+ int output_hpos;
+ int output_vpos;
+ int output_vpos_max;
+ int output_draw_point_size;
+ int line_thickness;
+ int output_line_thickness;
+ unsigned char output_space_code;
+ char *inside_font_style;
+ int page_number;
+ title_desc title;
+ header_desc header;
+ int header_indent;
+ int suppress_sub_sup;
+ int cutoff_heading;
+ page *page_contents;
+ html_text *current_paragraph;
+ html_indent *indent;
+ html_table *table;
+ int end_center;
+ int end_tempindent;
+ TAG_ALIGNMENT next_tag;
+ int fill_on;
+ int max_linelength;
+ int linelength;
+ int pageoffset;
+ int troff_indent;
+ int device_indent;
+ int temp_indent;
+ int pointsize;
+ int vertical_spacing;
+ int line_number;
+ color *background;
+ int seen_indent;
+ int next_indent;
+ int seen_pageoffset;
+ int next_pageoffset;
+ int seen_linelength;
+ int next_linelength;
+ int seen_center;
+ int next_center;
+ int seen_space;
+ int seen_break;
+ int current_column;
+ int row_space;
+ assert_state as;
+
+ void flush_sbuf ();
+ void set_style (const style &);
+ void set_space_code (unsigned char c);
+ void do_exec (char *, const environment *);
+ void do_import (char *, const environment *);
+ void do_def (char *, const environment *);
+ void do_mdef (char *, const environment *);
+ void do_file (char *, const environment *);
+ void set_line_thickness (const environment *);
+ void terminate_current_font (void);
+ void flush_font (void);
+ void add_to_sbuf (glyph *g, const string &s);
+ void write_title (int in_head);
+ int sbuf_continuation (glyph *g, const char *name,
+ const environment *env, int w);
+ void flush_page (void);
+ void troff_tag (text_glob *g);
+ void flush_globs (void);
+ void emit_line (text_glob *g);
+ void emit_raw (text_glob *g);
+ void emit_html (text_glob *g);
+ void determine_space (text_glob *g);
+ void start_font (const char *name);
+ void end_font (const char *name);
+ int is_font_courier (font *f);
+ int is_line_start (int nf);
+ int is_courier_until_eol (void);
+ void start_size (int from, int to);
+ void do_font (text_glob *g);
+ void do_center (char *arg);
+ void do_check_center (void);
+ void do_break (void);
+ void do_space (char *arg);
+ void do_eol (void);
+ void do_eol_ce (void);
+ void do_title (void);
+ void do_fill (char *arg);
+ void do_heading (char *arg);
+ void write_header (void);
+ void determine_header_level (int level);
+ void do_linelength (char *arg);
+ void do_pageoffset (char *arg);
+ void do_indentation (char *arg);
+ void do_tempindent (char *arg);
+ void do_indentedparagraph (void);
+ void do_verticalspacing (char *arg);
+ void do_pointsize (char *arg);
+ void do_centered_image (void);
+ void do_left_image (void);
+ void do_right_image (void);
+ void do_auto_image (text_glob *g,
+ const char *filename);
+ void do_links (void);
+ void do_flush (void);
+ void do_job_name (char *name);
+ void do_head (char *name);
+ void insert_split_file (void);
+ int is_in_middle (int left, int right);
+ void do_sup_or_sub (text_glob *g);
+ int start_subscript (text_glob *g);
+ int end_subscript (text_glob *g);
+ int start_superscript (text_glob *g);
+ int end_superscript (text_glob *g);
+ void outstanding_eol (int n);
+ int is_bold (font *f);
+ font *make_bold (font *f);
+ int overstrike (glyph *g, const char *name,
+ const environment *env, int w);
+ void do_body (void);
+ int next_horiz_pos (text_glob *g, int nf);
+ void lookahead_for_tables (void);
+ void insert_tab_te (void);
+ text_glob *insert_tab_ts (text_glob *where);
+ void insert_tab0_foreach_tab (void);
+ void insert_tab_0 (text_glob *where);
+ void do_indent (int in, int pageoff,
+ int linelen);
+ void shutdown_table (void);
+ void do_tab_ts (text_glob *g);
+ void do_tab_te (void);
+ void do_col (char *s);
+ void do_tab (char *s);
+ void do_tab0 (void);
+ int calc_nf (text_glob *g, int nf);
+ void calc_po_in (text_glob *g, int nf);
+ void remove_tabs (void);
+ void remove_courier_tabs (void);
+ void update_min_max (colType type_of_col,
+ int *minimum, int *maximum,
+ text_glob *g);
+ void add_table_end (const char *);
+ void do_file_components (void);
+ void write_navigation (const string &top,
+ const string &prev,
+ const string &next,
+ const string &current);
+ void emit_link (const string &to,
+ const char *name);
+ int get_troff_indent (void);
+ void restore_troff_indent (void);
+ void handle_assertion (int minv, int minh,
+ int maxv, int maxh,
+ const char *s);
+ void handle_state_assertion (text_glob *g);
+ void do_end_para (text_glob *g);
+ int round_width (int x);
+ void handle_tag_within_title (text_glob *g);
+ void writeHeadMetaStyle (void);
+ void handle_valid_flag (int needs_para);
+ void do_math (text_glob *g);
+ void write_html_anchor (text_glob *h);
+ void write_xhtml_anchor (text_glob *h);
+ // ADD HERE
+
+public:
+ html_printer ();
+ ~html_printer ();
+ void set_char (glyph *g, font *f, const environment *env,
+ int w, const char *name);
+ void set_numbered_char(int num, const environment *env, int *widthp);
+ glyph *set_char_and_width(const char *nm, const environment *env,
+ int *widthp, font **f);
+ void draw (int code, int *p, int np,
+ const environment *env);
+ void begin_page (int);
+ void end_page (int);
+ void special (char *arg, const environment *env, char type);
+ void devtag (char *arg, const environment *env, char type);
+ font *make_font (const char *);
+ void end_of_line ();
+};
+
+printer *make_printer()
+{
+ return new html_printer;
+}
+
+static void usage(FILE *stream);
+
+void html_printer::set_style(const style &sty)
+{
+ const char *fontname = sty.f->get_name();
+ if (0 /* nullptr */ == fontname)
+ fatal("no internalname specified for font");
+
+#if 0
+ change_font(fontname, (font::res / (72 * font::sizescale))
+ * sty.point_size);
+#endif
+}
+
+/*
+ * is_bold - returns TRUE if font, f, is bold.
+ */
+
+int html_printer::is_bold (font *f)
+{
+ const char *fontname = f->get_name();
+ return (strcmp(fontname, "B") == 0) || (strcmp(fontname, "BI") == 0);
+}
+
+/*
+ * make_bold - if a bold style for f exists, return it.
+ */
+
+font *html_printer::make_bold (font *f)
+{
+ const char *fontname = f->get_name();
+
+ if (strcmp(fontname, "B") == 0)
+ return f;
+ if (strcmp(fontname, "I") == 0)
+ return font::load_font("BI");
+ if (strcmp(fontname, "BI") == 0)
+ return f;
+ return 0;
+}
+
+void html_printer::end_of_line()
+{
+ flush_sbuf();
+ line_number++;
+}
+
+/*
+ * emit_line - writes out a horizontal rule.
+ */
+
+void html_printer::emit_line (text_glob *)
+{
+ // --fixme-- needs to know the length in percentage
+ if (dialect == xhtml)
+ html.put_string("<hr/>");
+ else
+ html.put_string("<hr>");
+}
+
+/*
+ * restore_troff_indent - is called when we have temporarily shutdown
+ * indentation (typically done when we have
+ * centered an image).
+ */
+
+void html_printer::restore_troff_indent (void)
+{
+ troff_indent = next_indent;
+ if (troff_indent > 0) {
+ /*
+ * force device indentation
+ */
+ device_indent = 0;
+ do_indent(get_troff_indent(), pageoffset, linelength);
+ }
+}
+
+/*
+ * emit_raw - writes the raw html information directly to the device.
+ */
+
+void html_printer::emit_raw (text_glob *g)
+{
+ do_font(g);
+ if (next_tag == INLINE) {
+ determine_space(g);
+ current_paragraph->do_emittext(g->text_string, g->text_length);
+ } else {
+ int space = current_paragraph->retrieve_para_space() || seen_space;
+
+ current_paragraph->done_para();
+ shutdown_table();
+ switch (next_tag) {
+
+ case CENTERED:
+ if (dialect == html4)
+ current_paragraph->do_para("align=\"center\"", space);
+ else
+ current_paragraph->do_para("class=\"center\"", space);
+ break;
+ case LEFT:
+ if (dialect == html4)
+ current_paragraph->do_para(&html, "align=\"left\"",
+ get_troff_indent(), pageoffset,
+ linelength, space);
+ else
+ current_paragraph->do_para(&html, "class=\"left\"",
+ get_troff_indent(), pageoffset,
+ linelength, space);
+ break;
+ case RIGHT:
+ if (dialect == html4)
+ current_paragraph->do_para(&html, "align=\"right\"",
+ get_troff_indent(), pageoffset,
+ linelength, space);
+ else
+ current_paragraph->do_para(&html, "class=\"right\"",
+ get_troff_indent(), pageoffset,
+ linelength, space);
+ break;
+ default:
+ fatal("unknown enumeration");
+ }
+ current_paragraph->do_emittext(g->text_string, g->text_length);
+ current_paragraph->done_para();
+ next_tag = INLINE;
+ suppress_sub_sup = TRUE;
+ seen_space = FALSE;
+ restore_troff_indent();
+ }
+}
+
+/*
+ * handle_tag_within_title - handle a limited number of tags within
+ * the context of a table. Those tags which
+ * set values rather than generate spaces
+ * and paragraphs.
+ */
+
+void html_printer::handle_tag_within_title (text_glob *g)
+{
+ if (g->is_in() || g->is_ti() || g->is_po() || g->is_ce() || g->is_ll()
+ || g->is_fi() || g->is_nf())
+ troff_tag(g);
+}
+
+/*
+ * do_center - handle the .ce commands from troff.
+ */
+
+void html_printer::do_center (char *arg)
+{
+ next_center = atoi(arg);
+ seen_center = TRUE;
+}
+
+/*
+ * do_centered_image - set a flag such that the next devtag is
+ * placed inside a centered paragraph.
+ */
+
+void html_printer::do_centered_image (void)
+{
+ next_tag = CENTERED;
+}
+
+/*
+ * do_right_image - set a flag such that the next devtag is
+ * placed inside a right aligned paragraph.
+ */
+
+void html_printer::do_right_image (void)
+{
+ next_tag = RIGHT;
+}
+
+/*
+ * do_left_image - set a flag such that the next devtag is
+ * placed inside a left aligned paragraph.
+ */
+
+void html_printer::do_left_image (void)
+{
+ next_tag = LEFT;
+}
+
+/*
+ * exists - returns TRUE if filename exists.
+ */
+
+static int exists (const char *filename)
+{
+ FILE *fp = fopen(filename, "r");
+
+ if (fp == 0) {
+ return FALSE;
+ } else {
+ fclose(fp);
+ return TRUE;
+ }
+}
+
+/*
+ * generate_img_src - returns a html image tag for the filename
+ * providing that the image exists.
+ */
+
+static string &generate_img_src (const char *filename)
+{
+ string *s = new string("");
+
+ while (filename && (filename[0] == ' ')) {
+ filename++;
+ }
+ if (exists(filename)) {
+ *s += string("<img src=\"") + filename + "\" "
+ + "alt=\"Image " + filename + "\">";
+ if (dialect == xhtml)
+ *s += "</img>";
+ }
+ return *s;
+}
+
+/*
+ * do_auto_image - tests whether the image, indicated by filename,
+ * is present, if so then it emits an html image tag.
+ * An image tag may be passed through from pic, eqn
+ * but the corresponding image might not be created.
+ * Consider .EQ delim $$ .EN or an empty .PS .PE.
+ */
+
+void html_printer::do_auto_image (text_glob *g, const char *filename)
+{
+ string buffer = generate_img_src(filename);
+
+ if (! buffer.empty()) {
+ /*
+ * utilize emit_raw by creating a new text_glob.
+ */
+ text_glob h = *g;
+
+ h.text_string = buffer.contents();
+ h.text_length = buffer.length();
+ emit_raw(&h);
+ } else
+ next_tag = INLINE;
+}
+
+/*
+ * outstanding_eol - call do_eol, n, times.
+ */
+
+void html_printer::outstanding_eol (int n)
+{
+ while (n > 0) {
+ do_eol();
+ n--;
+ }
+}
+
+/*
+ * do_title - handle the .tl commands from troff.
+ */
+
+void html_printer::do_title (void)
+{
+ text_glob *t;
+ int removed_from_head;
+
+ if (page_number == 1) {
+ int found_title_start = FALSE;
+ if (! page_contents->glyphs.is_empty()) {
+ page_contents->glyphs.sub_move_right(); // move onto next word
+ do {
+ t = page_contents->glyphs.get_data();
+ removed_from_head = FALSE;
+ if (t->is_auto_img()) {
+ string img = generate_img_src((char *)(t->text_string + 20));
+
+ if (! img.empty()) {
+ if (found_title_start)
+ title.text += " ";
+ found_title_start = TRUE;
+ title.has_been_found = TRUE;
+ title.text += img;
+ }
+ page_contents->glyphs.sub_move_right(); // move onto next word
+ removed_from_head = ((!page_contents->glyphs.is_empty()) &&
+ (page_contents->glyphs
+ .is_equal_to_head()));
+ } else if (t->is_eo_tl()) {
+ // end of title found
+ title.has_been_found = TRUE;
+ return;
+ } else if (t->is_a_tag()) {
+ handle_tag_within_title(t);
+ page_contents->glyphs.sub_move_right(); // move onto next word
+ removed_from_head = ((!page_contents->glyphs.is_empty()) &&
+ (page_contents->glyphs
+ .is_equal_to_head()));
+ } else if (found_title_start) {
+ title.text += " " + string(t->text_string, t->text_length);
+ page_contents->glyphs.sub_move_right(); // move onto next word
+ removed_from_head = ((!page_contents->glyphs.is_empty()) &&
+ (page_contents->glyphs
+ .is_equal_to_head()));
+ } else {
+ title.text += string(t->text_string, t->text_length);
+ found_title_start = TRUE;
+ title.has_been_found = TRUE;
+ page_contents->glyphs.sub_move_right(); // move onto next word
+ removed_from_head = ((!page_contents->glyphs.is_empty()) &&
+ (page_contents->glyphs
+ .is_equal_to_head()));
+ }
+ } while ((! page_contents->glyphs.is_equal_to_head()) ||
+ (removed_from_head));
+ }
+ }
+}
+
+/*
+ * write_html_anchor - writes out an anchor. The style of the anchor
+ * dependent upon simple_anchor.
+ */
+
+void html_printer::write_html_anchor (text_glob *h)
+{
+ if (dialect == html4) {
+ if (h != 0) {
+ html.put_string("<a name=\"");
+ if (simple_anchors) {
+ string buffer(ANCHOR_TEMPLATE);
+
+ buffer += as_string(header.no_of_headings);
+ buffer += '\0';
+ html.put_string(buffer.contents());
+ } else
+ html.put_string(header.header_buffer);
+ html.put_string("\"></a>").nl();
+ }
+ }
+}
+
+/*
+ * write_xhtml_anchor - writes out an anchor. The style of the anchor
+ * dependent upon simple_anchor.
+ */
+
+void html_printer::write_xhtml_anchor (text_glob *h)
+{
+ if (dialect == xhtml) {
+ if (h != 0) {
+ html.put_string(" id=\"");
+ if (simple_anchors) {
+ string buffer(ANCHOR_TEMPLATE);
+
+ buffer += as_string(header.no_of_headings);
+ buffer += '\0';
+ html.put_string(buffer.contents());
+ } else
+ html.put_string(header.header_buffer);
+ html.put_string("\"");
+ }
+ }
+}
+
+void html_printer::write_header (void)
+{
+ if (! header.header_buffer.empty()) {
+ text_glob *a = 0;
+ int space = current_paragraph->retrieve_para_space() || seen_space;
+
+ if (header.header_level > 7)
+ header.header_level = 7;
+
+ // firstly we must terminate any font and type faces
+ current_paragraph->done_para();
+ suppress_sub_sup = TRUE;
+
+ if (cutoff_heading+2 > header.header_level) {
+ // now we save the header so we can issue a list of links
+ header.no_of_headings++;
+ style st;
+
+ a = new text_glob();
+ a->text_glob_html(&st,
+ header.headings
+ .add_string(header.header_buffer),
+ header.header_buffer.length(),
+ header.no_of_headings, header.header_level,
+ header.no_of_headings, header.header_level);
+
+ // and add this header to the header list
+ header.headers.add(a,
+ header.no_of_headings,
+ header.no_of_headings, header.no_of_headings,
+ header.no_of_headings, header.no_of_headings);
+ }
+
+ html.nl().nl();
+
+ if (manufacture_headings) {
+ // line break before a header
+ if (!current_paragraph->emitted_text())
+ current_paragraph->do_space();
+ // user wants manufactured headings which look better than
+ // <Hn></Hn>
+ if (header.header_level<4) {
+ html.put_string("<b><font size=\"+1\">");
+ html.put_string(header.header_buffer);
+ html.put_string("</font>").nl();
+ write_html_anchor(a);
+ html.put_string("</b>").nl();
+ }
+ else {
+ html.put_string("<b>");
+ html.put_string(header.header_buffer).nl();
+ write_html_anchor(a);
+ html.put_string("</b>").nl();
+ }
+ }
+ else {
+ // and now we issue the real header
+ html.put_string("<h");
+ html.put_number(header.header_level);
+ write_xhtml_anchor(a);
+ html.put_string(">");
+ html.put_string(header.header_buffer).nl();
+ write_html_anchor(a);
+ html.put_string("</h");
+ html.put_number(header.header_level);
+ html.put_string(">").nl();
+ }
+
+ /* and now we save the file name in which this header will occur */
+
+ style st; // fake style to enable us to use the list data structure
+
+ text_glob *h=new text_glob();
+ h->text_glob_html(&st,
+ header.headings.add_string(file_list.file_name()),
+ file_list.file_name().length(),
+ header.no_of_headings, header.header_level,
+ header.no_of_headings, header.header_level);
+
+ header.header_filename.add(h,
+ header.no_of_headings,
+ header.no_of_headings,
+ header.no_of_headings,
+ header.no_of_headings,
+ header.no_of_headings);
+
+ current_paragraph->do_para(&html, "", get_troff_indent(),
+ pageoffset, linelength, space);
+ }
+}
+
+void html_printer::determine_header_level (int level)
+{
+ if (level == 0) {
+ int i;
+
+ for (i = 0; ((i<header.header_buffer.length())
+ && ((header.header_buffer[i] == '.')
+ || is_digit(header.header_buffer[i]))) ; i++) {
+ if (header.header_buffer[i] == '.') {
+ level++;
+ }
+ }
+ }
+ header.header_level = level+1;
+ if (header.header_level >= 2 && header.header_level <= split_level) {
+ header.no_of_level_one_headings++;
+ insert_split_file();
+ }
+}
+
+/*
+ * do_heading - handle the .SH and .NH and equivalent commands from
+ * troff.
+ */
+
+void html_printer::do_heading (char *arg)
+{
+ text_glob *g;
+ int level=atoi(arg);
+ int horiz;
+
+ header.header_buffer.clear();
+ page_contents->glyphs.move_right();
+ if (! page_contents->glyphs.is_equal_to_head()) {
+ g = page_contents->glyphs.get_data();
+ horiz = g->minh;
+ do {
+ if (g->is_auto_img()) {
+ string img=generate_img_src((char *)(g->text_string + 20));
+
+ if (! img.empty()) {
+ // we cannot use full heading anchors with images
+ simple_anchors = TRUE;
+ if (horiz < g->minh)
+ header.header_buffer += " ";
+
+ header.header_buffer += img;
+ }
+ }
+ else if (g->is_in() || g->is_ti() || g->is_po() || g->is_ce()
+ || g->is_ll())
+ troff_tag(g);
+ else if (g->is_fi())
+ fill_on = 1;
+ else if (g->is_nf())
+ fill_on = 0;
+ else if (! (g->is_a_line() || g->is_a_tag())) {
+ /*
+ * we ignore the other tag commands when constructing a heading
+ */
+ if (horiz < g->minh)
+ header.header_buffer += " ";
+
+ horiz = g->maxh;
+ header.header_buffer += string(g->text_string, g->text_length);
+ }
+ page_contents->glyphs.move_right();
+ g = page_contents->glyphs.get_data();
+ } while ((! page_contents->glyphs.is_equal_to_head()) &&
+ (! g->is_eo_h()));
+ }
+
+ determine_header_level(level);
+ write_header();
+
+ /*
+ * finally set the output font to uninitialized, thus forcing
+ * the new paragraph to start a new font block.
+ */
+
+ output_style.f = 0;
+ g = page_contents->glyphs.get_data();
+ page_contents->glyphs.move_left(); // so that next time we use old g
+}
+
+/*
+ * is_courier_until_eol - returns TRUE if we can see a whole line which
+ * is courier
+ */
+
+int html_printer::is_courier_until_eol (void)
+{
+ text_glob *orig = page_contents->glyphs.get_data();
+ int result = TRUE;
+ text_glob *g;
+
+ if (! page_contents->glyphs.is_equal_to_tail()) {
+ page_contents->glyphs.move_right();
+ do {
+ g = page_contents->glyphs.get_data();
+ if (! g->is_a_tag() && (! is_font_courier(g->text_style.f)))
+ result = FALSE;
+ page_contents->glyphs.move_right();
+ } while (result &&
+ (! page_contents->glyphs.is_equal_to_head()) &&
+ (! g->is_fi()) && (! g->is_eol()));
+
+ /*
+ * now restore our previous position.
+ */
+ while (page_contents->glyphs.get_data() != orig)
+ page_contents->glyphs.move_left();
+ }
+ return result;
+}
+
+/*
+ * do_linelength - handle the .ll command from troff.
+ */
+
+void html_printer::do_linelength (char *arg)
+{
+ if (max_linelength == -1)
+ max_linelength = atoi(arg);
+
+ next_linelength = atoi(arg);
+ seen_linelength = TRUE;
+}
+
+/*
+ * do_pageoffset - handle the .po command from troff.
+ */
+
+void html_printer::do_pageoffset (char *arg)
+{
+ next_pageoffset = atoi(arg);
+ seen_pageoffset = TRUE;
+}
+
+/*
+ * get_troff_indent - returns the indent value.
+ */
+
+int html_printer::get_troff_indent (void)
+{
+ if (end_tempindent > 0)
+ return temp_indent;
+ else
+ return troff_indent;
+}
+
+/*
+ * do_indentation - handle the .in command from troff.
+ */
+
+void html_printer::do_indentation (char *arg)
+{
+ next_indent = atoi(arg);
+ seen_indent = TRUE;
+}
+
+/*
+ * do_tempindent - handle the .ti command from troff.
+ */
+
+void html_printer::do_tempindent (char *arg)
+{
+ if (fill_on) {
+ /*
+ * we set the end_tempindent to 2 as the first .br
+ * activates the .ti and the second terminates it.
+ */
+ end_tempindent = 2;
+ temp_indent = atoi(arg);
+ }
+}
+
+/*
+ * shutdown_table - shuts down the current table.
+ */
+
+void html_printer::shutdown_table (void)
+{
+ if (table != 0) {
+ current_paragraph->done_para();
+ table->emit_finish_table();
+ // don't delete this table as it will be deleted when we destroy the
+ // text_glob
+ table = 0;
+ }
+}
+
+/*
+ * do_indent - remember the indent parameters and if
+ * indent is > pageoff and indent has changed
+ * then we start a html table to implement the indentation.
+ */
+
+void html_printer::do_indent (int in, int pageoff, int linelen)
+{
+ if ((device_indent != -1) &&
+ (pageoffset+device_indent != in+pageoff)) {
+
+ int space = current_paragraph->retrieve_para_space() || seen_space;
+ current_paragraph->done_para();
+
+ device_indent = in;
+ pageoffset = pageoff;
+ if (linelen <= max_linelength)
+ linelength = linelen;
+
+ current_paragraph->do_para(&html, "", device_indent,
+ pageoffset, max_linelength, space);
+ }
+}
+
+/*
+ * do_verticalspacing - handle the .vs command from troff.
+ */
+
+void html_printer::do_verticalspacing (char *arg)
+{
+ vertical_spacing = atoi(arg);
+}
+
+/*
+ * do_pointsize - handle the .ps command from troff.
+ */
+
+void html_printer::do_pointsize (char *arg)
+{
+ /*
+ * firstly check to see whether this point size is really associated
+ * with a .tl tag
+ */
+
+ if (! page_contents->glyphs.is_empty()) {
+ text_glob *g = page_contents->glyphs.get_data();
+ text_glob *t = page_contents->glyphs.get_data();
+
+ while (t->is_a_tag() && (!page_contents->glyphs.is_equal_to_head()))
+ {
+ if (t->is_tl()) {
+ /*
+ * found title therefore ignore this .ps tag
+ */
+ while (t != g) {
+ page_contents->glyphs.move_left();
+ t = page_contents->glyphs.get_data();
+ }
+ return;
+ }
+ page_contents->glyphs.move_right();
+ t = page_contents->glyphs.get_data();
+ }
+ /*
+ * move back to original position
+ */
+ while (t != g) {
+ page_contents->glyphs.move_left();
+ t = page_contents->glyphs.get_data();
+ }
+ /*
+ * collect valid pointsize
+ */
+ pointsize = atoi(arg);
+ }
+}
+
+/*
+ * do_fill - records whether troff has requested that text be filled.
+ */
+
+void html_printer::do_fill (char *arg)
+{
+ int on = atoi(arg);
+
+ output_hpos = get_troff_indent()+pageoffset;
+ suppress_sub_sup = TRUE;
+
+ if (fill_on != on) {
+ if (on)
+ current_paragraph->do_para("", seen_space);
+ fill_on = on;
+ }
+}
+
+/*
+ * do_eol - handle the end of line
+ */
+
+void html_printer::do_eol (void)
+{
+ if (! fill_on) {
+ if (current_paragraph->ever_emitted_text()) {
+ current_paragraph->do_newline();
+ current_paragraph->do_break();
+ }
+ }
+ output_hpos = get_troff_indent()+pageoffset;
+}
+
+/*
+ * do_check_center - checks to see whether we have seen a '.ce' tag
+ * during the previous line.
+ */
+
+void html_printer::do_check_center(void)
+{
+ if (seen_center) {
+ seen_center = FALSE;
+ if (next_center > 0) {
+ if (end_center == 0) {
+ int space = current_paragraph->retrieve_para_space()
+ || seen_space;
+ current_paragraph->done_para();
+ suppress_sub_sup = TRUE;
+ if (dialect == html4)
+ current_paragraph->do_para("align=\"center\"", space);
+ else
+ current_paragraph->do_para("class=\"center\"", space);
+ } else
+ if ((strcmp("align=\"center\"",
+ current_paragraph->get_alignment()) != 0) &&
+ (strcmp("class=\"center\"",
+ current_paragraph->get_alignment()) != 0)) {
+ /*
+ * different alignment, so shutdown paragraph and open
+ * a new one.
+ */
+ int space = current_paragraph->retrieve_para_space()
+ || seen_space;
+ current_paragraph->done_para();
+ suppress_sub_sup = TRUE;
+ if (dialect == html4)
+ current_paragraph->do_para("align=\"center\"", space);
+ else
+ current_paragraph->do_para("class=\"center\"", space);
+ } else
+ // same alignment; if we have emitted text, issue a break.
+ if (current_paragraph->emitted_text())
+ current_paragraph->do_break();
+ } else
+ /*
+ * next_center == 0
+ */
+ if (end_center > 0) {
+ seen_space = seen_space
+ || current_paragraph->retrieve_para_space();
+ current_paragraph->done_para();
+ suppress_sub_sup = TRUE;
+ current_paragraph->do_para("", seen_space);
+ }
+ end_center = next_center;
+ }
+}
+
+/*
+ * do_eol_ce - handle end of line specifically for a .ce
+ */
+
+void html_printer::do_eol_ce (void)
+{
+ if (end_center > 0) {
+ if (end_center > 1)
+ if (current_paragraph->emitted_text())
+ current_paragraph->do_break();
+
+ end_center--;
+ if (end_center == 0) {
+ current_paragraph->done_para();
+ suppress_sub_sup = TRUE;
+ }
+ }
+}
+
+/*
+ * do_flush - flushes all output and tags.
+ */
+
+void html_printer::do_flush (void)
+{
+ current_paragraph->done_para();
+}
+
+/*
+ * do_links - moves onto a new temporary file and sets auto_links to
+ * false.
+ */
+
+void html_printer::do_links (void)
+{
+ html.end_line(); // flush line
+ auto_links = FALSE; // from now on only emit under user request
+ file_list.add_new_file(xtmpfile());
+ file_list.set_links_required();
+ html.set_file(file_list.get_file());
+}
+
+/*
+ * insert_split_file -
+ */
+
+void html_printer::insert_split_file (void)
+{
+ if (multiple_files) {
+ current_paragraph->done_para(); // flush paragraph
+ html.end_line(); // flush line
+ html.set_file(file_list.get_file()); // flush current file
+ file_list.add_new_file(xtmpfile());
+ string split_file = job_name;
+
+ split_file += string("-");
+ split_file += as_string(header.no_of_level_one_headings);
+ if (dialect == xhtml)
+ split_file += string(".xhtml");
+ else
+ split_file += string(".html");
+ split_file += '\0';
+
+ file_list.set_file_name(split_file);
+ html.set_file(file_list.get_file());
+ }
+}
+
+/*
+ * do_job_name - assigns the job_name to name.
+ */
+
+void html_printer::do_job_name (char *name)
+{
+ if (! multiple_files) {
+ multiple_files = TRUE;
+ while (name != 0 && (*name != (char)0) && (*name == ' '))
+ name++;
+ job_name = name;
+ }
+}
+
+/*
+ * do_head - adds a string to head_info which is to be included into
+ * the <head> </head> section of the html document.
+ */
+
+void html_printer::do_head (char *name)
+{
+ head_info += string(name);
+ head_info += '\n';
+}
+
+/*
+ * do_break - handles the ".br" request and also undoes an outstanding
+ * ".ti" command and calls indent if the indentation related
+ * registers have changed.
+ */
+
+void html_printer::do_break (void)
+{
+ int seen_temp_indent = FALSE;
+
+ current_paragraph->do_break();
+ if (end_tempindent > 0) {
+ end_tempindent--;
+ if (end_tempindent > 0)
+ seen_temp_indent = TRUE;
+ }
+ if (seen_indent || seen_pageoffset || seen_linelength
+ || seen_temp_indent) {
+ if (seen_indent && (! seen_temp_indent))
+ troff_indent = next_indent;
+ if (! seen_pageoffset)
+ next_pageoffset = pageoffset;
+ if (! seen_linelength)
+ next_linelength = linelength;
+ do_indent(get_troff_indent(), next_pageoffset, next_linelength);
+ }
+ seen_indent = seen_temp_indent;
+ seen_linelength = FALSE;
+ seen_pageoffset = FALSE;
+ do_check_center();
+ output_hpos = get_troff_indent()+pageoffset;
+ suppress_sub_sup = TRUE;
+}
+
+void html_printer::do_space (char *arg)
+{
+ int n = atoi(arg);
+
+ seen_space = atoi(arg);
+ as.check_sp(seen_space);
+#if 0
+ if (n>0 && table)
+ table->set_space(TRUE);
+#endif
+
+ while (n>0) {
+ current_paragraph->do_space();
+ n--;
+ }
+ suppress_sub_sup = TRUE;
+}
+
+/*
+ * do_tab_ts - start a table, which will have already been defined.
+ */
+
+void html_printer::do_tab_ts (text_glob *g)
+{
+ html_table *t = g->get_table();
+
+ if (t != 0) {
+ current_column = 0;
+ current_paragraph->done_pre();
+ current_paragraph->done_para();
+ current_paragraph->remove_para_space();
+
+#if defined(DEBUG_TABLES)
+ html.simple_comment("TABS");
+#endif
+
+ t->set_linelength(max_linelength);
+ t->add_indent(pageoffset);
+#if 0
+ t->emit_table_header(seen_space);
+#else
+ t->emit_table_header(FALSE);
+ row_space = current_paragraph->retrieve_para_space() || seen_space;
+ seen_space = FALSE;
+#endif
+ }
+
+ table = t;
+}
+
+/*
+ * do_tab_te - finish a table.
+ */
+
+void html_printer::do_tab_te (void)
+{
+ if (table) {
+ current_paragraph->done_para();
+ current_paragraph->remove_para_space();
+ table->emit_finish_table();
+ }
+
+ table = 0;
+ restore_troff_indent();
+}
+
+/*
+ * do_tab - handle the "devtag:tab" tag
+ */
+
+void html_printer::do_tab (char *s)
+{
+ if (table) {
+ while (isspace(*s))
+ s++;
+ s++;
+ int col = table->find_column(atoi(s) + pageoffset
+ + get_troff_indent());
+ if (col > 0) {
+ current_paragraph->done_para();
+ table->emit_col(col);
+ }
+ }
+}
+
+/*
+ * do_tab0 - handle the "devtag:tab0" tag
+ */
+
+void html_printer::do_tab0 (void)
+{
+ if (table) {
+ int col = table->find_column(pageoffset+get_troff_indent());
+ if (col > 0) {
+ current_paragraph->done_para();
+ table->emit_col(col);
+ }
+ }
+}
+
+/*
+ * do_col - start column, s.
+ */
+
+void html_printer::do_col (char *s)
+{
+ if (table) {
+ if (atoi(s) < current_column)
+ row_space = seen_space;
+
+ current_column = atoi(s);
+ current_paragraph->done_para();
+ table->emit_col(current_column);
+ current_paragraph->do_para("", row_space);
+ }
+}
+
+/*
+ * troff_tag - processes the troff tag and manipulates the troff
+ * state machine.
+ */
+
+void html_printer::troff_tag (text_glob *g)
+{
+ /*
+ * firstly skip over devtag:
+ */
+ char *t=(char *)g->text_string+strlen("devtag:");
+ if (strncmp(g->text_string, "html</p>:", strlen("html</p>:")) == 0) {
+ do_end_para(g);
+ } else if (strncmp(g->text_string, "html<?p>:", strlen("html<?p>:"))
+ == 0) {
+ if (current_paragraph->emitted_text())
+ html.put_string(g->text_string+9);
+ else
+ do_end_para(g);
+ } else if (strncmp(g->text_string, "math<?p>:", strlen("math<?p>:"))
+ == 0) {
+ do_math(g);
+ } else if (g->is_eol()) {
+ do_eol();
+ } else if (g->is_eol_ce()) {
+ do_eol_ce();
+ } else if (strncmp(t, ".sp", 3) == 0) {
+ char *a = (char *)t+3;
+ do_space(a);
+ } else if (strncmp(t, ".br", 3) == 0) {
+ seen_break = 1;
+ as.check_br(1);
+ do_break();
+ } else if (strcmp(t, ".centered-image") == 0) {
+ do_centered_image();
+ } else if (strcmp(t, ".right-image") == 0) {
+ do_right_image();
+ } else if (strcmp(t, ".left-image") == 0) {
+ do_left_image();
+ } else if (strncmp(t, ".auto-image", 11) == 0) {
+ char *a = (char *)t+11;
+ do_auto_image(g, a);
+ } else if (strncmp(t, ".ce", 3) == 0) {
+ char *a = (char *)t+3;
+ suppress_sub_sup = TRUE;
+ do_center(a);
+ } else if (g->is_tl()) {
+ suppress_sub_sup = TRUE;
+ title.with_h1 = TRUE;
+ do_title();
+ } else if (strncmp(t, ".html-tl", 8) == 0) {
+ suppress_sub_sup = TRUE;
+ title.with_h1 = FALSE;
+ do_title();
+ } else if (strncmp(t, ".fi", 3) == 0) {
+ char *a = (char *)t+3;
+ do_fill(a);
+ } else if ((strncmp(t, ".SH", 3) == 0)
+ || (strncmp(t, ".NH", 3) == 0)) {
+ char *a = (char *)t+3;
+ do_heading(a);
+ } else if (strncmp(t, ".ll", 3) == 0) {
+ char *a = (char *)t+3;
+ do_linelength(a);
+ } else if (strncmp(t, ".po", 3) == 0) {
+ char *a = (char *)t+3;
+ do_pageoffset(a);
+ } else if (strncmp(t, ".in", 3) == 0) {
+ char *a = (char *)t+3;
+ do_indentation(a);
+ } else if (strncmp(t, ".ti", 3) == 0) {
+ char *a = (char *)t+3;
+ do_tempindent(a);
+ } else if (strncmp(t, ".vs", 3) == 0) {
+ char *a = (char *)t+3;
+ do_verticalspacing(a);
+ } else if (strncmp(t, ".ps", 3) == 0) {
+ char *a = (char *)t+3;
+ do_pointsize(a);
+ } else if (strcmp(t, ".links") == 0) {
+ do_links();
+ } else if (strncmp(t, ".job-name", 9) == 0) {
+ char *a = (char *)t+9;
+ do_job_name(a);
+ } else if (strncmp(t, ".head", 5) == 0) {
+ char *a = (char *)t+5;
+ do_head(a);
+ } else if (strcmp(t, ".no-auto-rule") == 0) {
+ auto_rule = FALSE;
+ } else if (strcmp(t, ".tab-ts") == 0) {
+ do_tab_ts(g);
+ } else if (strcmp(t, ".tab-te") == 0) {
+ do_tab_te();
+ } else if (strncmp(t, ".col ", 5) == 0) {
+ char *a = (char *)t+4;
+ do_col(a);
+ } else if (strncmp(t, "tab ", 4) == 0) {
+ char *a = (char *)t+3;
+ do_tab(a);
+ } else if (strncmp(t, "tab0", 4) == 0) {
+ do_tab0();
+ }
+}
+
+/*
+ * do_math - prints out the equation
+ */
+
+void html_printer::do_math (text_glob *g)
+{
+ do_font(g);
+ if (current_paragraph->emitted_text())
+ html.put_string(g->text_string+9);
+ else
+ do_end_para(g);
+}
+
+/*
+ * is_in_middle - returns TRUE if the positions left..right are in the
+ * center of the page.
+ */
+
+int html_printer::is_in_middle (int left, int right)
+{
+ return( abs(abs(left-pageoffset) - abs(pageoffset+linelength-right))
+ <= CENTER_TOLERANCE );
+}
+
+/*
+ * flush_globs - runs through the text glob list and emits html.
+ */
+
+void html_printer::flush_globs (void)
+{
+ text_glob *g;
+
+ if (! page_contents->glyphs.is_empty()) {
+ page_contents->glyphs.start_from_head();
+ do {
+ g = page_contents->glyphs.get_data();
+#if 0
+ fprintf(stderr, "[%s:%d:%d:%d:%d]",
+ g->text_string, g->minv, g->minh, g->maxv, g->maxh) ;
+ fflush(stderr);
+#endif
+
+ handle_state_assertion(g);
+
+ if (strcmp(g->text_string, "XXXXXXX") == 0)
+ stop();
+
+ if (g->is_a_tag())
+ troff_tag(g);
+ else if (g->is_a_line())
+ emit_line(g);
+ else {
+ as.check_sp(seen_space);
+ as.check_br(seen_break);
+ seen_break = 0;
+ seen_space = 0;
+ emit_html(g);
+ }
+
+ as.check_fi(fill_on);
+ as.check_ce(end_center);
+ /*
+ * after processing the title (and removing it) the glyph list
+ * might be empty
+ */
+ if (! page_contents->glyphs.is_empty()) {
+ page_contents->glyphs.move_right();
+ }
+ } while (! page_contents->glyphs.is_equal_to_head());
+ }
+}
+
+/*
+ * calc_nf - calculates the _no_ format flag, given the
+ * text glob, g.
+ */
+
+int html_printer::calc_nf (text_glob *g, int nf)
+{
+ if (g != 0) {
+ if (g->is_fi()) {
+ as.check_fi(TRUE);
+ return FALSE;
+ }
+ if (g->is_nf()) {
+ as.check_fi(FALSE);
+ return TRUE;
+ }
+ }
+ as.check_fi(! nf);
+ return nf;
+}
+
+/*
+ * calc_po_in - calculates the, in, po, registers
+ */
+
+void html_printer::calc_po_in (text_glob *g, int nf)
+{
+ if (g->is_in())
+ troff_indent = g->get_arg();
+ else if (g->is_po())
+ pageoffset = g->get_arg();
+ else if (g->is_ti()) {
+ temp_indent = g->get_arg();
+ end_tempindent = 2;
+ } else if (g->is_br() || (nf && g->is_eol())) {
+ if (end_tempindent > 0)
+ end_tempindent--;
+ }
+}
+
+/*
+ * next_horiz_pos - returns the next horiz position.
+ * -1 is returned if it doesn't exist.
+ */
+
+int html_printer::next_horiz_pos (text_glob *g, int nf)
+{
+ int next = -1;
+
+ if ((g != 0) && (g->is_br() || (nf && g->is_eol())))
+ if (! page_contents->glyphs.is_empty()) {
+ page_contents->glyphs.move_right_get_data();
+ if (0 /* nullptr */ == g) {
+ page_contents->glyphs.start_from_head();
+ as.reset();
+ }
+ else {
+ next = g->minh;
+ page_contents->glyphs.move_left();
+ }
+ }
+ return next;
+}
+
+/*
+ * insert_tab_ts - inserts a tab-ts before, where.
+ */
+
+text_glob *html_printer::insert_tab_ts (text_glob *where)
+{
+ text_glob *start_of_table;
+ text_glob *old_pos = page_contents->glyphs.get_data();
+ page_contents->glyphs.move_to(where);
+ page_contents->glyphs.move_left();
+ // tab table start
+ page_contents->insert_tag(string("devtag:.tab-ts"));
+ page_contents->glyphs.move_right();
+ start_of_table = page_contents->glyphs.get_data();
+ page_contents->glyphs.move_to(old_pos);
+ return start_of_table;
+}
+
+/*
+ * insert_tab_te - inserts a tab-te before the current position
+ * (it skips backwards over .sp/.br)
+ */
+
+void html_printer::insert_tab_te (void)
+{
+ text_glob *g = page_contents->glyphs.get_data();
+ page_contents->dump_page();
+ while (page_contents->glyphs.get_data()->is_a_tag())
+ page_contents->glyphs.move_left();
+ // tab table end
+ page_contents->insert_tag(string("devtag:.tab-te"));
+ while (g != page_contents->glyphs.get_data())
+ page_contents->glyphs.move_right();
+ page_contents->dump_page();
+}
+
+/*
+ * insert_tab_0 - inserts a tab0 before, where.
+ */
+
+void html_printer::insert_tab_0 (text_glob *where)
+{
+ text_glob *old_pos = page_contents->glyphs.get_data();
+
+ page_contents->glyphs.move_to(where);
+ page_contents->glyphs.move_left();
+ // tab0 start of line
+ page_contents->insert_tag(string("devtag:tab0"));
+ page_contents->glyphs.move_right();
+ page_contents->glyphs.move_to(old_pos);
+}
+
+/*
+ * remove_tabs - removes the tabs tags on this line.
+ */
+
+void html_printer::remove_tabs (void)
+{
+ text_glob *orig = page_contents->glyphs.get_data();
+ text_glob *g;
+
+ if (! page_contents->glyphs.is_equal_to_tail()) {
+ do {
+ g = page_contents->glyphs.get_data();
+ if (g->is_tab()) {
+ page_contents->glyphs.sub_move_right();
+ if (g == orig)
+ orig = page_contents->glyphs.get_data();
+ } else
+ page_contents->glyphs.move_right();
+ } while ((! page_contents->glyphs.is_equal_to_head()) &&
+ (! g->is_eol()));
+
+ /*
+ * now restore our previous position.
+ */
+ while (page_contents->glyphs.get_data() != orig)
+ page_contents->glyphs.move_left();
+ }
+}
+
+void html_printer::remove_courier_tabs (void)
+{
+ text_glob *g;
+ int line_start = TRUE;
+ int nf = FALSE;
+
+ if (! page_contents->glyphs.is_empty()) {
+ page_contents->glyphs.start_from_head();
+ as.reset();
+ line_start = TRUE;
+ do {
+ g = page_contents->glyphs.get_data();
+ handle_state_assertion(g);
+ nf = calc_nf(g, nf);
+
+ if (line_start) {
+ if (line_start && nf && is_courier_until_eol()) {
+ remove_tabs();
+ g = page_contents->glyphs.get_data();
+ }
+ }
+
+ // line_start = g->is_br() || g->is_nf() || g->is_fi()
+ // || (nf && g->is_eol());
+ line_start = g->is_br() || (nf && g->is_eol());
+ page_contents->glyphs.move_right();
+ } while (! page_contents->glyphs.is_equal_to_head());
+ }
+}
+
+void html_printer::insert_tab0_foreach_tab (void)
+{
+ text_glob *start_of_line = 0;
+ text_glob *g = 0;
+ int seen_tab = FALSE;
+ int seen_col = FALSE;
+ int nf = FALSE;
+
+ if (! page_contents->glyphs.is_empty()) {
+ page_contents->glyphs.start_from_head();
+ as.reset();
+ start_of_line = page_contents->glyphs.get_data();
+ do {
+ g = page_contents->glyphs.get_data();
+ handle_state_assertion(g);
+ nf = calc_nf(g, nf);
+
+ if (g->is_tab())
+ seen_tab = TRUE;
+
+ if (g->is_col())
+ seen_col = TRUE;
+
+ if (g->is_br() || (nf && g->is_eol())) {
+ do {
+ page_contents->glyphs.move_right();
+ g = page_contents->glyphs.get_data();
+ handle_state_assertion(g);
+ nf = calc_nf(g, nf);
+ if (page_contents->glyphs.is_equal_to_head()) {
+ if (seen_tab && !seen_col)
+ insert_tab_0(start_of_line);
+ return;
+ }
+ } while (g->is_br() || (nf && g->is_eol()) || g->is_ta());
+ // printf("\nstart_of_line is: %s\n", g->text_string);
+ if (seen_tab && !seen_col) {
+ insert_tab_0(start_of_line);
+ page_contents->glyphs.move_to(g);
+ }
+
+ seen_tab = FALSE;
+ seen_col = FALSE;
+ start_of_line = g;
+ }
+ page_contents->glyphs.move_right();
+ } while (! page_contents->glyphs.is_equal_to_head());
+ if (seen_tab && !seen_col)
+ insert_tab_0(start_of_line);
+
+ }
+}
+
+/*
+ * update_min_max - updates the extent of a column, given the left and
+ * right extents of a glyph, g.
+ */
+
+void html_printer::update_min_max (colType type_of_col,
+ int *minimum, int *maximum,
+ text_glob *g)
+{
+ switch (type_of_col) {
+
+ case tab_tag:
+ break;
+ case tab0_tag:
+ *minimum = g->minh;
+ break;
+ case col_tag:
+ *minimum = g->minh;
+ *maximum = g->maxh;
+ break;
+ default:
+ break;
+ }
+}
+
+/*
+ * add_table_end - moves left one glyph, adds a table end tag and adds
+ * a debugging string.
+ */
+
+void html_printer::add_table_end (const char *
+#if defined(DEBUG_TABLES)
+ debug_string
+#endif
+)
+{
+ page_contents->glyphs.move_left();
+ insert_tab_te();
+#if defined(DEBUG_TABLES)
+ page_contents->insert_tag(string(debug_string));
+#endif
+}
+
+/*
+ * lookahead_for_tables - checks for .col tags and inserts table
+ * start/end tags
+ */
+
+void html_printer::lookahead_for_tables (void)
+{
+ text_glob *g;
+ text_glob *start_of_line = 0;
+ text_glob *start_of_table = 0;
+ text_glob *last = 0;
+ colType type_of_col = none;
+ int found_col = FALSE;
+ int ncol = 0;
+ int colmin = 0; // pacify compiler
+ int colmax = 0; // pacify compiler
+ html_table *tbl = new html_table(&html, -1);
+ const char *tab_defs = 0;
+ char align = 'L';
+ int nf = FALSE;
+ int old_pageoffset = pageoffset;
+
+ remove_courier_tabs();
+ page_contents->dump_page();
+ insert_tab0_foreach_tab();
+ page_contents->dump_page();
+ if (! page_contents->glyphs.is_empty()) {
+ page_contents->glyphs.start_from_head();
+ as.reset();
+ g = page_contents->glyphs.get_data();
+ if (g->is_br()) {
+ g = page_contents->glyphs.move_right_get_data();
+ handle_state_assertion(g);
+ if (page_contents->glyphs.is_equal_to_head()) {
+ if (tbl != 0) {
+ delete tbl;
+ tbl = 0;
+ }
+ return;
+ }
+
+ start_of_line = g;
+ ncol = 0;
+ if (found_col)
+ last = g;
+ found_col = FALSE;
+ }
+
+ do {
+#if defined(DEBUG_TABLES)
+ fprintf(stderr, " [") ;
+ fprintf(stderr, g->text_string) ;
+ fprintf(stderr, "] ") ;
+ fflush(stderr);
+ if (strcmp(g->text_string, "XXXXXXX") == 0)
+ stop();
+#endif
+
+ nf = calc_nf(g, nf);
+ calc_po_in(g, nf);
+ if (g->is_col()) {
+ if (type_of_col == tab_tag && start_of_table != 0) {
+ page_contents->glyphs.move_left();
+ insert_tab_te();
+ start_of_table->remember_table(tbl);
+ tbl = new html_table(&html, -1);
+ page_contents->insert_tag(string("*** TAB -> COL ***"));
+ if (tab_defs != 0)
+ tbl->tab_stops->init(tab_defs);
+ start_of_table = 0;
+ last = 0;
+ }
+ type_of_col = col_tag;
+ found_col = TRUE;
+ ncol = g->get_arg();
+ align = 'L';
+ colmin = 0;
+ colmax = 0;
+ } else if (g->is_tab()) {
+ type_of_col = tab_tag;
+ colmin = g->get_tab_args(&align);
+ align = 'L'; // for now as 'C' and 'R' are broken
+ ncol = tbl->find_tab_column(colmin);
+ colmin += pageoffset + get_troff_indent();
+ colmax = tbl->get_tab_pos(ncol+1);
+ if (colmax > 0)
+ colmax += pageoffset + get_troff_indent();
+ } else if (g->is_tab0()) {
+ if (type_of_col == col_tag && start_of_table != 0) {
+ page_contents->glyphs.move_left();
+ insert_tab_te();
+ start_of_table->remember_table(tbl);
+ tbl = new html_table(&html, -1);
+ page_contents->insert_tag(string("*** COL -> TAB ***"));
+ start_of_table = 0;
+ last = 0;
+ }
+ if (tab_defs != 0)
+ tbl->tab_stops->init(tab_defs);
+ type_of_col = tab0_tag;
+ ncol = 1;
+ colmin = 0;
+ colmax = tbl->get_tab_pos(2) + pageoffset + get_troff_indent();
+ } else if (! g->is_a_tag())
+ update_min_max(type_of_col, &colmin, &colmax, g);
+ if ((g->is_col() || g->is_tab() || g->is_tab0())
+ && (start_of_line != 0)
+ && (0 /* nullptr */ == start_of_table)) {
+ start_of_table = insert_tab_ts(start_of_line);
+ start_of_line = 0;
+ } else if (g->is_ce() && (start_of_table != 0)) {
+ add_table_end("*** CE ***");
+ start_of_table->remember_table(tbl);
+ tbl = new html_table(&html, -1);
+ start_of_table = 0;
+ last = 0;
+ } else if (g->is_ta()) {
+ tab_defs = g->text_string;
+ if (type_of_col == col_tag)
+ tbl->tab_stops->check_init(tab_defs);
+ if (!tbl->tab_stops->compatible(tab_defs)) {
+ if (start_of_table != 0) {
+ add_table_end("*** TABS ***");
+ start_of_table->remember_table(tbl);
+ tbl = new html_table(&html, -1);
+ start_of_table = 0;
+ type_of_col = none;
+ last = 0;
+ }
+ tbl->tab_stops->init(tab_defs);
+ }
+ }
+ if (((! g->is_a_tag()) || g->is_tab()) && (start_of_table != 0)) {
+ // we are in a table and have a glyph
+ if ((ncol == 0)
+ || (! tbl->add_column(ncol, colmin, colmax, align))) {
+ if (ncol == 0)
+ add_table_end("*** NCOL == 0 ***");
+ else
+ add_table_end("*** CROSSED COLS ***");
+
+ start_of_table->remember_table(tbl);
+ tbl = new html_table(&html, -1);
+ start_of_table = 0;
+ type_of_col = none;
+ last = 0;
+ }
+ }
+ /*
+ * move onto next glob, check whether we are starting a new line
+ */
+ g = page_contents->glyphs.move_right_get_data();
+ handle_state_assertion(g);
+ if (0 /* nullptr */ == g) {
+ if (found_col) {
+ page_contents->glyphs.start_from_head();
+ as.reset();
+ last = g;
+ found_col = FALSE;
+ }
+ } else if (g->is_br() || (nf && g->is_eol())) {
+ do {
+ g = page_contents->glyphs.move_right_get_data();
+ handle_state_assertion(g);
+ nf = calc_nf(g, nf);
+ } while ((g != 0) && (g->is_br() || (nf && g->is_eol())));
+ start_of_line = g;
+ ncol = 0;
+ if (found_col)
+ last = g;
+ found_col = FALSE;
+ }
+ } while ((g != 0) && (! page_contents->glyphs.is_equal_to_head()));
+
+#if defined(DEBUG_TABLES)
+ fprintf(stderr, "finished scanning for tables\n");
+#endif
+
+ page_contents->glyphs.start_from_head();
+ if (start_of_table != 0) {
+ if (last != 0)
+ while (last != page_contents->glyphs.get_data())
+ page_contents->glyphs.move_left();
+
+ insert_tab_te();
+ start_of_table->remember_table(tbl);
+ tbl = 0;
+ page_contents->insert_tag(string("*** LAST ***"));
+ }
+ }
+ if (tbl != 0) {
+ delete tbl;
+ tbl = 0;
+ }
+
+ // and reset the registers
+ pageoffset = old_pageoffset;
+ troff_indent = 0;
+ temp_indent = 0;
+ end_tempindent = 0;
+}
+
+void html_printer::flush_page (void)
+{
+ suppress_sub_sup = TRUE;
+ flush_sbuf();
+ page_contents->dump_page();
+ lookahead_for_tables();
+ page_contents->dump_page();
+ flush_globs();
+ current_paragraph->done_para();
+ current_paragraph->flush_text();
+ // move onto a new page
+ delete page_contents;
+#if defined(DEBUG_TABLES)
+ fprintf(stderr, "\n\n*** flushed page ***\n\n");
+ html.simple_comment("new page called");
+#endif
+ page_contents = new page;
+}
+
+/*
+ * determine_space - works out whether we need to write a space.
+ * If last glyph is adjoining, then emit no space.
+ */
+
+void html_printer::determine_space (text_glob *g)
+{
+ if (current_paragraph->is_in_pre()) {
+ /*
+ * .nf has been specified
+ */
+ while (output_hpos < g->minh) {
+ output_hpos += space_width;
+ current_paragraph->emit_space();
+ }
+ } else {
+ if ((output_vpos != g->minv) || (output_hpos < g->minh)) {
+ current_paragraph->emit_space();
+ }
+ }
+}
+
+/*
+ * is_line_start - returns TRUE if we are at the start of a line.
+ */
+
+int html_printer::is_line_start (int nf)
+{
+ int line_start = FALSE;
+ int result = TRUE;
+ text_glob *orig = page_contents->glyphs.get_data();
+ text_glob *g;
+
+ if (! page_contents->glyphs.is_equal_to_head()) {
+ do {
+ page_contents->glyphs.move_left();
+ g = page_contents->glyphs.get_data();
+ result = g->is_a_tag();
+ if (g->is_fi())
+ nf = FALSE;
+ else if (g->is_nf())
+ nf = TRUE;
+ line_start = g->is_col() || g->is_br() || (nf && g->is_eol());
+ } while ((!line_start) && (result));
+ /*
+ * now restore our previous position.
+ */
+ while (page_contents->glyphs.get_data() != orig)
+ page_contents->glyphs.move_right();
+ }
+ return result;
+}
+
+/*
+ * is_font_courier - returns TRUE if the font, f, is courier.
+ */
+
+int html_printer::is_font_courier (font *f)
+{
+ if (f != 0) {
+ const char *fontname = f->get_name();
+
+ return( (fontname != 0) && (fontname[0] == 'C') );
+ }
+ return FALSE;
+}
+
+/*
+ * end_font - shuts down the font corresponding to fontname.
+ */
+
+void html_printer::end_font (const char *fontname)
+{
+ if (strcmp(fontname, "B") == 0) {
+ current_paragraph->done_bold();
+ } else if (strcmp(fontname, "I") == 0) {
+ current_paragraph->done_italic();
+ } else if (strcmp(fontname, "BI") == 0) {
+ current_paragraph->done_bold();
+ current_paragraph->done_italic();
+ } else if (strcmp(fontname, "CR") == 0) {
+ current_paragraph->done_tt();
+ } else if (strcmp(fontname, "CI") == 0) {
+ current_paragraph->done_italic();
+ current_paragraph->done_tt();
+ } else if (strcmp(fontname, "CB") == 0) {
+ current_paragraph->done_bold();
+ current_paragraph->done_tt();
+ } else if (strcmp(fontname, "CBI") == 0) {
+ current_paragraph->done_bold();
+ current_paragraph->done_italic();
+ current_paragraph->done_tt();
+ }
+}
+
+/*
+ * start_font - starts the font corresponding to name.
+ */
+
+void html_printer::start_font (const char *fontname)
+{
+ if (strcmp(fontname, "R") == 0) {
+ current_paragraph->done_bold();
+ current_paragraph->done_italic();
+ current_paragraph->done_tt();
+ } else if (strcmp(fontname, "B") == 0) {
+ current_paragraph->do_bold();
+ } else if (strcmp(fontname, "I") == 0) {
+ current_paragraph->do_italic();
+ } else if (strcmp(fontname, "BI") == 0) {
+ current_paragraph->do_bold();
+ current_paragraph->do_italic();
+ } else if (strcmp(fontname, "CR") == 0) {
+ if ((! fill_on) && (is_courier_until_eol()) &&
+ is_line_start(! fill_on)) {
+ current_paragraph->do_pre();
+ }
+ current_paragraph->do_tt();
+ } else if (strcmp(fontname, "CI") == 0) {
+ if ((! fill_on) && (is_courier_until_eol()) &&
+ is_line_start(! fill_on)) {
+ current_paragraph->do_pre();
+ }
+ current_paragraph->do_tt();
+ current_paragraph->do_italic();
+ } else if (strcmp(fontname, "CB") == 0) {
+ if ((! fill_on) && (is_courier_until_eol()) &&
+ is_line_start(! fill_on)) {
+ current_paragraph->do_pre();
+ }
+ current_paragraph->do_tt();
+ current_paragraph->do_bold();
+ } else if (strcmp(fontname, "CBI") == 0) {
+ if ((! fill_on) && (is_courier_until_eol()) &&
+ is_line_start(! fill_on)) {
+ current_paragraph->do_pre();
+ }
+ current_paragraph->do_tt();
+ current_paragraph->do_italic();
+ current_paragraph->do_bold();
+ }
+}
+
+/*
+ * start_size - from is old font size, to is the new font size.
+ * The HTML elements <big> and <small> respectively
+ * increase and decrease the font size by 20%. We try and
+ * map these onto glyph sizes.
+ */
+
+void html_printer::start_size (int from, int to)
+{
+ if (from < to) {
+ while (from < to) {
+ current_paragraph->do_big();
+ from += SIZE_INCREMENT;
+ }
+ } else if (from > to) {
+ while (from > to) {
+ current_paragraph->do_small();
+ from -= SIZE_INCREMENT;
+ }
+ }
+}
+
+/*
+ * do_font - checks to see whether we need to alter the html font.
+ */
+
+void html_printer::do_font (text_glob *g)
+{
+ /*
+ * check if the output_style.point_size has not been set yet
+ * this allow users to place .ps at the top of their troff files
+ * and grohtml can then treat the .ps value as the base font size (3)
+ */
+ if (output_style.point_size == -1) {
+ output_style.point_size = pointsize;
+ }
+
+ if (g->text_style.f != output_style.f) {
+ if (output_style.f != 0) {
+ end_font(output_style.f->get_name());
+ }
+ output_style.f = g->text_style.f;
+ if (output_style.f != 0) {
+ start_font(output_style.f->get_name());
+ }
+ }
+ if (output_style.point_size != g->text_style.point_size) {
+ do_sup_or_sub(g);
+ if ((output_style.point_size > 0) &&
+ (g->text_style.point_size > 0)) {
+ start_size(output_style.point_size, g->text_style.point_size);
+ }
+ if (g->text_style.point_size > 0) {
+ output_style.point_size = g->text_style.point_size;
+ }
+ }
+ if (output_style.col != g->text_style.col) {
+ current_paragraph->done_color();
+ output_style.col = g->text_style.col;
+ current_paragraph->do_color(&output_style.col);
+ }
+}
+
+/*
+ * start_subscript - returns TRUE if, g, looks like a subscript start.
+ */
+
+int html_printer::start_subscript (text_glob *g)
+{
+ int r = font::res;
+ int height = output_style.point_size*r/72;
+
+ return ((output_style.point_size != 0) &&
+ (output_vpos < g->minv) &&
+ (output_vpos-height > g->maxv) &&
+ (output_style.point_size > g->text_style.point_size));
+}
+
+/*
+ * start_superscript - returns TRUE if, g, looks like a superscript
+ * start.
+ */
+
+int html_printer::start_superscript (text_glob *g)
+{
+ int r = font::res;
+ int height = output_style.point_size*r/72;
+
+ return ((output_style.point_size != 0) &&
+ (output_vpos > g->minv) &&
+ (output_vpos-height < g->maxv) &&
+ (output_style.point_size > g->text_style.point_size));
+}
+
+/*
+ * end_subscript - returns TRUE if, g, looks like the end of a
+ * subscript.
+ */
+
+int html_printer::end_subscript (text_glob *g)
+{
+ int r = font::res;
+ int height = output_style.point_size*r/72;
+
+ return ((output_style.point_size != 0) &&
+ (g->minv < output_vpos) &&
+ (output_vpos-height > g->maxv) &&
+ (output_style.point_size < g->text_style.point_size));
+}
+
+/*
+ * end_superscript - returns TRUE if, g, looks like the end of a
+ * superscript.
+ */
+
+int html_printer::end_superscript (text_glob *g)
+{
+ int r = font::res;
+ int height = output_style.point_size*r/72;
+
+ return ((output_style.point_size != 0) &&
+ (g->minv > output_vpos) &&
+ (output_vpos-height < g->maxv) &&
+ (output_style.point_size < g->text_style.point_size));
+}
+
+/*
+ * do_sup_or_sub - checks to see whether the next glyph is a
+ * subscript/superscript start/end and it calls the
+ * services of html-text to issue the appropriate tags.
+ */
+
+void html_printer::do_sup_or_sub (text_glob *g)
+{
+ if (! suppress_sub_sup) {
+ if (start_subscript(g)) {
+ current_paragraph->do_sub();
+ } else if (start_superscript(g)) {
+ current_paragraph->do_sup();
+ } else if (end_subscript(g)) {
+ current_paragraph->done_sub();
+ } else if (end_superscript(g)) {
+ current_paragraph->done_sup();
+ }
+ }
+}
+
+/*
+ * do_end_para - writes out the html text after shutting down the
+ * current paragraph.
+ */
+
+void html_printer::do_end_para (text_glob *g)
+{
+ do_font(g);
+ current_paragraph->done_para();
+ current_paragraph->remove_para_space();
+ html.put_string(g->text_string+9);
+ output_vpos = g->minv;
+ output_hpos = g->maxh;
+ output_vpos_max = g->maxv;
+ suppress_sub_sup = FALSE;
+}
+
+/*
+ * emit_html - write out the html text
+ */
+
+void html_printer::emit_html (text_glob *g)
+{
+ do_font(g);
+ determine_space(g);
+ current_paragraph->do_emittext(g->text_string, g->text_length);
+ output_vpos = g->minv;
+ output_hpos = g->maxh;
+ output_vpos_max = g->maxv;
+ suppress_sub_sup = FALSE;
+}
+
+/*
+ * flush_sbuf - flushes the current sbuf into the list of glyphs.
+ */
+
+void html_printer::flush_sbuf()
+{
+ if (sbuf.length() > 0) {
+ int r=font::res; // resolution of the device
+ set_style(sbuf_style);
+
+ if (overstrike_detected && (! is_bold(sbuf_style.f))) {
+ font *bold_font = make_bold(sbuf_style.f);
+ if (bold_font != 0)
+ sbuf_style.f = bold_font;
+ }
+
+ page_contents->add(&sbuf_style, sbuf, line_number,
+ (sbuf_vpos - (sbuf_style.point_size * r / 72)),
+ sbuf_start_hpos, sbuf_vpos, sbuf_end_hpos);
+ output_hpos = sbuf_end_hpos;
+ output_vpos = sbuf_vpos;
+ last_sbuf_length = 0;
+ sbuf_prev_hpos = sbuf_end_hpos;
+ overstrike_detected = FALSE;
+ sbuf.clear();
+ }
+}
+
+void html_printer::set_line_thickness(const environment *env)
+{
+ line_thickness = env->size;
+}
+
+void html_printer::draw(int code, int *p, int np,
+ const environment *env)
+{
+ switch (code) {
+
+ case 'l':
+# if 0
+ if (np == 2) {
+ page_contents->add_line(&sbuf_style,
+ line_number,
+ env->hpos, env->vpos,
+ (env->hpos + p[0]), (env->vpos + p[1]),
+ line_thickness);
+ } else {
+ error("2 arguments required for line");
+ }
+# endif
+ break;
+ case 't':
+ {
+ if (np == 0) {
+ line_thickness = -1;
+ } else {
+ // troff gratuitously adds an extra 0
+ if (np != 1 && np != 2) {
+ error("0 or 1 argument required for thickness");
+ break;
+ }
+ line_thickness = p[0];
+ }
+ break;
+ }
+
+ case 'P':
+ break;
+ case 'p':
+ break;
+ case 'E':
+ break;
+ case 'e':
+ break;
+ case 'C':
+ break;
+ case 'c':
+ break;
+ case 'a':
+ break;
+ case '~':
+ break;
+ case 'f':
+ break;
+ case 'F':
+ // fill with color env->fill
+ if (background != 0)
+ delete background;
+ background = new color;
+ *background = *env->fill;
+ break;
+
+ default:
+ error("unrecognised drawing command '%1'", char(code));
+ break;
+ }
+}
+
+html_printer::html_printer()
+: html(0, MAX_LINE_LENGTH),
+ no_of_printed_pages(0),
+ last_sbuf_length(0),
+ overstrike_detected(FALSE),
+ output_hpos(-1),
+ output_vpos(-1),
+ output_vpos_max(-1),
+ line_thickness(-1),
+ inside_font_style(0),
+ page_number(0),
+ header_indent(-1),
+ suppress_sub_sup(TRUE),
+ cutoff_heading(100),
+ indent(0),
+ table(0),
+ end_center(0),
+ end_tempindent(0),
+ next_tag(INLINE),
+ fill_on(TRUE),
+ max_linelength(-1),
+ linelength(0),
+ pageoffset(0),
+ troff_indent(0),
+ device_indent(0),
+ temp_indent(0),
+ pointsize(base_point_size),
+ line_number(0),
+ background(default_background),
+ seen_indent(FALSE),
+ next_indent(0),
+ seen_pageoffset(FALSE),
+ next_pageoffset(0),
+ seen_linelength(FALSE),
+ next_linelength(0),
+ seen_center(FALSE),
+ next_center(0),
+ seen_space(0),
+ seen_break(0),
+ current_column(0),
+ row_space(FALSE)
+{
+ file_list.add_new_file(xtmpfile());
+ html.set_file(file_list.get_file());
+ if (font::hor != 24)
+ fatal("horizontal motion quantum must be 24");
+ if (font::vert != 40)
+ fatal("vertical motion quantum must be 40");
+#if 0
+ // should be sorted html..
+ if (font::res % (font::sizescale*72) != 0)
+ fatal("res must be a multiple of 72*sizescale");
+#endif
+ int r = font::res;
+ int point = 0;
+ while (r % 10 == 0) {
+ r /= 10;
+ point++;
+ }
+ res = r;
+ html.set_fixed_point(point);
+ space_glyph = name_to_glyph("space");
+ space_width = font::hor;
+ paper_length = font::paperlength;
+ linelength = font::res*13/2;
+ if (paper_length == 0)
+ paper_length = 11*font::res;
+
+ page_contents = new page();
+}
+
+/*
+ * add_to_sbuf - adds character code or name to the sbuf.
+ */
+
+void html_printer::add_to_sbuf (glyph *g, const string &s)
+{
+ if (0 /* nullptr */ == sbuf_style.f)
+ return;
+
+ const char *html_glyph = 0;
+ unsigned int code = sbuf_style.f->get_code(g);
+
+ if (s.empty()) {
+ if (sbuf_style.f->contains(g))
+ html_glyph = get_html_entity(sbuf_style.f->get_code(g));
+ else
+ html_glyph = 0;
+
+ if ((0 /* nullptr */ == html_glyph) && (code >= UNICODE_DESC_START))
+ html_glyph = to_unicode(code);
+ } else
+ html_glyph = get_html_translation(sbuf_style.f, s);
+
+ last_sbuf_length = sbuf.length();
+ if (0 /* nullptr */ == html_glyph)
+ sbuf += ((char)code);
+ else
+ sbuf += html_glyph;
+}
+
+int html_printer::sbuf_continuation (glyph *g, const char *name,
+ const environment *env, int w)
+{
+ /*
+ * lets see whether the glyph is closer to the end of sbuf
+ */
+ if ((sbuf_end_hpos == env->hpos)
+ || ((sbuf_prev_hpos < sbuf_end_hpos)
+ && (env->hpos < sbuf_end_hpos)
+ && ((sbuf_end_hpos-env->hpos < env->hpos-sbuf_prev_hpos)))) {
+ add_to_sbuf(g, name);
+ sbuf_prev_hpos = sbuf_end_hpos;
+ sbuf_end_hpos += w + sbuf_kern;
+ return TRUE;
+ } else {
+ if ((env->hpos >= sbuf_end_hpos)
+ && ((sbuf_kern == 0)
+ || (sbuf_end_hpos - sbuf_kern != env->hpos))) {
+ /*
+ * lets see whether a space is needed or not
+ */
+
+ if (env->hpos-sbuf_end_hpos < space_width) {
+ add_to_sbuf(g, name);
+ sbuf_prev_hpos = sbuf_end_hpos;
+ sbuf_end_hpos = env->hpos + w;
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+/*
+ * get_html_translation - given the position of the character and its
+ * name return the device encoding for such
+ * character.
+ */
+
+const char *get_html_translation (font *f, const string &name)
+{
+ if ((0 /* nullptr */ == f) || name.empty())
+ return 0;
+ else {
+ glyph *g = name_to_glyph((char *)(name + '\0').contents());
+ if (f->contains(g))
+ return get_html_entity(f->get_code(g));
+ else
+ return 0;
+ }
+}
+
+/*
+ * get_html_entity - given a Unicode character's code point, return an
+ * HTML entity that represents the character, if the
+ * character cannot represent itself in all contexts.
+ * the return value, if not a null pointer, is
+ * allocated in a static buffer and is only valid
+ * until the next call of this function.
+ */
+static const char *get_html_entity (unsigned int code)
+{
+ if (code < UNICODE_DESC_START) {
+ switch (code) {
+ case 0x0022: return "&quot;";
+ case 0x0026: return "&amp;";
+ case 0x003C: return "&lt;";
+ case 0x003E: return "&gt;";
+ default: return 0;
+ }
+ } else {
+ switch (code) {
+ case 0x00A0: return "&nbsp;";
+ case 0x00A1: return "&iexcl;";
+ case 0x00A2: return "&cent;";
+ case 0x00A3: return "&pound;";
+ case 0x00A4: return "&curren;";
+ case 0x00A5: return "&yen;";
+ case 0x00A6: return "&brvbar;";
+ case 0x00A7: return "&sect;";
+ case 0x00A8: return "&uml;";
+ case 0x00A9: return "&copy;";
+ case 0x00AA: return "&ordf;";
+ case 0x00AB: return "&laquo;";
+ case 0x00AC: return "&not;";
+ case 0x00AE: return "&reg;";
+ case 0x00AF: return "&macr;";
+ case 0x00B0: return "&deg;";
+ case 0x00B1: return "&plusmn;";
+ case 0x00B2: return "&sup2;";
+ case 0x00B3: return "&sup3;";
+ case 0x00B4: return "&acute;";
+ case 0x00B5: return "&micro;";
+ case 0x00B6: return "&para;";
+ case 0x00B7: return "&middot;";
+ case 0x00B8: return "&cedil;";
+ case 0x00B9: return "&sup1;";
+ case 0x00BA: return "&ordm;";
+ case 0x00BB: return "&raquo;";
+ case 0x00BC: return "&frac14;";
+ case 0x00BD: return "&frac12;";
+ case 0x00BE: return "&frac34;";
+ case 0x00BF: return "&iquest;";
+ case 0x00C0: return "&Agrave;";
+ case 0x00C1: return "&Aacute;";
+ case 0x00C2: return "&Acirc;";
+ case 0x00C3: return "&Atilde;";
+ case 0x00C4: return "&Auml;";
+ case 0x00C5: return "&Aring;";
+ case 0x00C6: return "&AElig;";
+ case 0x00C7: return "&Ccedil;";
+ case 0x00C8: return "&Egrave;";
+ case 0x00C9: return "&Eacute;";
+ case 0x00CA: return "&Ecirc;";
+ case 0x00CB: return "&Euml;";
+ case 0x00CC: return "&Igrave;";
+ case 0x00CD: return "&Iacute;";
+ case 0x00CE: return "&Icirc;";
+ case 0x00CF: return "&Iuml;";
+ case 0x00D0: return "&ETH;";
+ case 0x00D1: return "&Ntilde;";
+ case 0x00D2: return "&Ograve;";
+ case 0x00D3: return "&Oacute;";
+ case 0x00D4: return "&Ocirc;";
+ case 0x00D5: return "&Otilde;";
+ case 0x00D6: return "&Ouml;";
+ case 0x00D7: return "&times;";
+ case 0x00D8: return "&Oslash;";
+ case 0x00D9: return "&Ugrave;";
+ case 0x00DA: return "&Uacute;";
+ case 0x00DB: return "&Ucirc;";
+ case 0x00DC: return "&Uuml;";
+ case 0x00DD: return "&Yacute;";
+ case 0x00DE: return "&THORN;";
+ case 0x00DF: return "&szlig;";
+ case 0x00E0: return "&agrave;";
+ case 0x00E1: return "&aacute;";
+ case 0x00E2: return "&acirc;";
+ case 0x00E3: return "&atilde;";
+ case 0x00E4: return "&auml;";
+ case 0x00E5: return "&aring;";
+ case 0x00E6: return "&aelig;";
+ case 0x00E7: return "&ccedil;";
+ case 0x00E8: return "&egrave;";
+ case 0x00E9: return "&eacute;";
+ case 0x00EA: return "&ecirc;";
+ case 0x00EB: return "&euml;";
+ case 0x00EC: return "&igrave;";
+ case 0x00ED: return "&iacute;";
+ case 0x00EE: return "&icirc;";
+ case 0x00EF: return "&iuml;";
+ case 0x00F0: return "&eth;";
+ case 0x00F1: return "&ntilde;";
+ case 0x00F2: return "&ograve;";
+ case 0x00F3: return "&oacute;";
+ case 0x00F4: return "&ocirc;";
+ case 0x00F5: return "&otilde;";
+ case 0x00F6: return "&ouml;";
+ case 0x00F7: return "&divide;";
+ case 0x00F8: return "&oslash;";
+ case 0x00F9: return "&ugrave;";
+ case 0x00FA: return "&uacute;";
+ case 0x00FB: return "&ucirc;";
+ case 0x00FC: return "&uuml;";
+ case 0x00FD: return "&yacute;";
+ case 0x00FE: return "&thorn;";
+ case 0x00FF: return "&yuml;";
+ case 0x0152: return "&OElig;";
+ case 0x0153: return "&oelig;";
+ case 0x0160: return "&Scaron;";
+ case 0x0161: return "&scaron;";
+ case 0x0178: return "&Yuml;";
+ case 0x0192: return "&fnof;";
+ case 0x0391: return "&Alpha;";
+ case 0x0392: return "&Beta;";
+ case 0x0393: return "&Gamma;";
+ case 0x0394: return "&Delta;";
+ case 0x0395: return "&Epsilon;";
+ case 0x0396: return "&Zeta;";
+ case 0x0397: return "&Eta;";
+ case 0x0398: return "&Theta;";
+ case 0x0399: return "&Iota;";
+ case 0x039A: return "&Kappa;";
+ case 0x039B: return "&Lambda;";
+ case 0x039C: return "&Mu;";
+ case 0x039D: return "&Nu;";
+ case 0x039E: return "&Xi;";
+ case 0x039F: return "&Omicron;";
+ case 0x03A0: return "&Pi;";
+ case 0x03A1: return "&Rho;";
+ case 0x03A3: return "&Sigma;";
+ case 0x03A4: return "&Tau;";
+ case 0x03A5: return "&Upsilon;";
+ case 0x03A6: return "&Phi;";
+ case 0x03A7: return "&Chi;";
+ case 0x03A8: return "&Psi;";
+ case 0x03A9: return "&Omega;";
+ case 0x03B1: return "&alpha;";
+ case 0x03B2: return "&beta;";
+ case 0x03B3: return "&gamma;";
+ case 0x03B4: return "&delta;";
+ case 0x03B5: return "&epsilon;";
+ case 0x03B6: return "&zeta;";
+ case 0x03B7: return "&eta;";
+ case 0x03B8: return "&theta;";
+ case 0x03B9: return "&iota;";
+ case 0x03BA: return "&kappa;";
+ case 0x03BB: return "&lambda;";
+ case 0x03BC: return "&mu;";
+ case 0x03BD: return "&nu;";
+ case 0x03BE: return "&xi;";
+ case 0x03BF: return "&omicron;";
+ case 0x03C0: return "&pi;";
+ case 0x03C1: return "&rho;";
+ case 0x03C2: return "&sigmaf;";
+ case 0x03C3: return "&sigma;";
+ case 0x03C4: return "&tau;";
+ case 0x03C5: return "&upsilon;";
+ case 0x03C6: return "&phi;";
+ case 0x03C7: return "&chi;";
+ case 0x03C8: return "&psi;";
+ case 0x03C9: return "&omega;";
+ case 0x03D1: return "&thetasym;";
+ case 0x03D6: return "&piv;";
+ case 0x2013: return "&ndash;";
+ case 0x2014: return "&mdash;";
+ case 0x2018: return "&lsquo;";
+ case 0x2019: return "&rsquo;";
+ case 0x201A: return "&sbquo;";
+ case 0x201C: return "&ldquo;";
+ case 0x201D: return "&rdquo;";
+ case 0x201E: return "&bdquo;";
+ case 0x2020: return "&dagger;";
+ case 0x2021: return "&Dagger;";
+ case 0x2022: return "&bull;";
+ case 0x2030: return "&permil;";
+ case 0x2032: return "&prime;";
+ case 0x2033: return "&Prime;";
+ case 0x2039: return "&lsaquo;";
+ case 0x203A: return "&rsaquo;";
+ case 0x203E: return "&oline;";
+ case 0x2044: return "&frasl;";
+ case 0x20AC: return "&euro;";
+ case 0x2111: return "&image;";
+ case 0x2118: return "&weierp;";
+ case 0x211C: return "&real;";
+ case 0x2122: return "&trade;";
+ case 0x2135: return "&alefsym;";
+ case 0x2190: return "&larr;";
+ case 0x2191: return "&uarr;";
+ case 0x2192: return "&rarr;";
+ case 0x2193: return "&darr;";
+ case 0x2194: return "&harr;";
+ case 0x21D0: return "&lArr;";
+ case 0x21D1: return "&uArr;";
+ case 0x21D2: return "&rArr;";
+ case 0x21D3: return "&dArr;";
+ case 0x21D4: return "&hArr;";
+ case 0x2200: return "&forall;";
+ case 0x2202: return "&part;";
+ case 0x2203: return "&exist;";
+ case 0x2205: return "&empty;";
+ case 0x2207: return "&nabla;";
+ case 0x2208: return "&isin;";
+ case 0x2209: return "&notin;";
+ case 0x220B: return "&ni;";
+ case 0x220F: return "&prod;";
+ case 0x2211: return "&sum;";
+ case 0x2212: return "&minus;";
+ case 0x2217: return "&lowast;";
+ case 0x221A: return "&radic;";
+ case 0x221D: return "&prop;";
+ case 0x221E: return "&infin;";
+ case 0x2220: return "&ang;";
+ case 0x2227: return "&and;";
+ case 0x2228: return "&or;";
+ case 0x2229: return "&cap;";
+ case 0x222A: return "&cup;";
+ case 0x222B: return "&int;";
+ case 0x2234: return "&there4;";
+ case 0x223C: return "&sim;";
+ case 0x2245: return "&cong;";
+ case 0x2248: return "&asymp;";
+ case 0x2260: return "&ne;";
+ case 0x2261: return "&equiv;";
+ case 0x2264: return "&le;";
+ case 0x2265: return "&ge;";
+ case 0x2282: return "&sub;";
+ case 0x2283: return "&sup;";
+ case 0x2284: return "&nsub;";
+ case 0x2286: return "&sube;";
+ case 0x2287: return "&supe;";
+ case 0x2295: return "&oplus;";
+ case 0x2297: return "&otimes;";
+ case 0x22A5: return "&perp;";
+ case 0x22C5: return "&sdot;";
+ case 0x2308: return "&lceil;";
+ case 0x2309: return "&rceil;";
+ case 0x230A: return "&lfloor;";
+ case 0x230B: return "&rfloor;";
+ case 0x2329: return "&lang;";
+ case 0x232A: return "&rang;";
+ case 0x25CA: return "&loz;";
+ case 0x2660: return "&spades;";
+ case 0x2663: return "&clubs;";
+ case 0x2665: return "&hearts;";
+ case 0x2666: return "&diams;";
+ case 0x27E8: return "&lang;";
+ case 0x27E9: return "&rang;";
+ default: return to_unicode(code);
+ }
+ }
+}
+
+/*
+ * overstrike - returns TRUE if the glyph (i, name) is going to
+ * overstrike a previous glyph in sbuf. If TRUE the font
+ * is changed to bold and the previous sbuf is flushed.
+ */
+
+int html_printer::overstrike(glyph *g, const char *name,
+ const environment *env, int w)
+{
+ if ((env->hpos < sbuf_end_hpos)
+ || ((sbuf_kern != 0) && (sbuf_end_hpos - sbuf_kern < env->hpos)))
+ {
+ /*
+ * at this point we have detected an overlap
+ */
+ if (overstrike_detected) {
+ /* already detected, remove previous glyph and use this glyph */
+ sbuf.set_length(last_sbuf_length);
+ add_to_sbuf(g, name);
+ sbuf_end_hpos = env->hpos + w;
+ return TRUE;
+ } else {
+ /* first time we have detected an overstrike in the sbuf */
+ sbuf.set_length(last_sbuf_length); /* remove previous glyph */
+ if (! is_bold(sbuf_style.f))
+ flush_sbuf();
+ overstrike_detected = TRUE;
+ add_to_sbuf(g, name);
+ sbuf_end_hpos = env->hpos + w;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/*
+ * set_char - adds a character into the sbuf if it is a continuation
+ * with the previous word otherwise flush the current sbuf
+ * and add character anew.
+ */
+
+void html_printer::set_char(glyph *g, font *f, const environment *env,
+ int w, const char *name)
+{
+ style sty(f, env->size, env->height, env->slant, env->fontno,
+ *env->col);
+ if (sty.slant != 0) {
+ if (sty.slant > 80 || sty.slant < -80) {
+ error("slant of %1 degrees out of range", sty.slant);
+ sty.slant = 0;
+ }
+ }
+ if (((!sbuf.empty())
+ && (sty == sbuf_style)
+ && (sbuf_vpos == env->vpos))
+ && (sbuf_continuation(g, name, env, w)
+ || overstrike(g, name, env, w)))
+ return;
+
+ flush_sbuf();
+ if (0 /* nullptr */ == sbuf_style.f)
+ sbuf_style = sty;
+ add_to_sbuf(g, name);
+ sbuf_end_hpos = env->hpos + w;
+ sbuf_start_hpos = env->hpos;
+ sbuf_prev_hpos = env->hpos;
+ sbuf_vpos = env->vpos;
+ sbuf_style = sty;
+ sbuf_kern = 0;
+}
+
+/*
+ * set_numbered_char - handle numbered characters. Negative values are
+ * interpreted as unbreakable spaces; the value
+ * (taken positive) gives the width.
+ */
+
+void html_printer::set_numbered_char(int num, const environment *env,
+ int *widthp)
+{
+ int nbsp_width = 0;
+ if (num < 0) {
+ nbsp_width = -num;
+ num = 160; // &nbsp;
+ }
+ glyph *g = number_to_glyph(num);
+ int fn = env->fontno;
+ if (fn < 0 || fn >= nfonts) {
+ error("invalid font position '%1'", fn);
+ return;
+ }
+ font *f = font_table[fn];
+ if (f == 0) {
+ error("no font mounted at position %1", fn);
+ return;
+ }
+ if (!f->contains(g)) {
+ error("font '%1' does not contain numbered character %2",
+ f->get_name(),
+ num);
+ return;
+ }
+ int w;
+ if (nbsp_width)
+ w = nbsp_width;
+ else
+ w = f->get_width(g, env->size);
+ w = round_width(w);
+ if (widthp)
+ *widthp = w;
+ set_char(g, f, env, w, 0);
+}
+
+glyph *html_printer::set_char_and_width(const char *nm,
+ const environment *env,
+ int *widthp, font **f)
+{
+ glyph *g = name_to_glyph(nm);
+ int fn = env->fontno;
+ if (fn < 0 || fn >= nfonts) {
+ error("invalid font position '%1'", fn);
+ return UNDEFINED_GLYPH;
+ }
+ *f = font_table[fn];
+ if (*f == 0) {
+ error("no font mounted at position %1", fn);
+ return UNDEFINED_GLYPH;
+ }
+ if (!(*f)->contains(g)) {
+ if (nm[0] != '\0' && nm[1] == '\0')
+ error("font '%1' does not contain ordinary character '%2'",
+ (*f)->get_name(), nm[0]);
+ else
+ error("font '%1' does not contain special character '%2'",
+ (*f)->get_name(), nm);
+ return UNDEFINED_GLYPH;
+ }
+ int w = (*f)->get_width(g, env->size);
+ w = round_width(w);
+ if (widthp)
+ *widthp = w;
+ return g;
+}
+
+/*
+ * write_title - writes the title to this document
+ */
+
+void html_printer::write_title (int in_head)
+{
+ if (title.has_been_found) {
+ if (in_head) {
+ html.put_string("<title>");
+ html.put_string(title.text);
+ html.put_string("</title>").nl().nl();
+ } else {
+ title.has_been_written = TRUE;
+ if (title.with_h1) {
+ if (dialect == xhtml)
+ html.put_string("<h1>");
+ else
+ html.put_string("<h1 align=\"center\">");
+ html.put_string(title.text);
+ html.put_string("</h1>").nl().nl();
+ }
+ }
+ } else if (in_head) {
+ // place empty title tags to help conform to 'tidy'
+ html.put_string("<title></title>").nl();
+ }
+}
+
+/*
+ * write_rule - emits HTML rule element if the auto_rule is TRUE.
+ */
+
+static void write_rule (void)
+{
+ if (auto_rule) {
+ if (dialect == xhtml)
+ fputs("<hr/>\n", stdout);
+ else
+ fputs("<hr>\n", stdout);
+ }
+}
+
+void html_printer::begin_page(int n)
+{
+ page_number = n;
+#if defined(DEBUGGING)
+ html.begin_comment("Page: ")
+ .put_string(i_to_a(page_number)).end_comment();;
+#endif
+ no_of_printed_pages++;
+
+ output_style.f = 0;
+ output_style.point_size= -1;
+ output_space_code = 32;
+ output_draw_point_size = -1;
+ output_line_thickness = -1;
+ output_hpos = -1;
+ output_vpos = -1;
+ output_vpos_max = -1;
+ current_paragraph = new html_text(&html, dialect);
+ do_indent(get_troff_indent(), pageoffset, linelength);
+ current_paragraph->do_para("", FALSE);
+}
+
+void html_printer::end_page(int)
+{
+ flush_sbuf();
+ flush_page();
+}
+
+font *html_printer::make_font(const char *nm)
+{
+ return html_font::load_html_font(nm);
+}
+
+void html_printer::do_body (void)
+{
+ if (0 /* nullptr */ == background)
+ fputs("<body>\n\n", stdout);
+ else {
+ char buf[(INT_HEXDIGITS * 3) + 1];
+ unsigned int r, g, b;
+
+ background->get_rgb(&r, &g, &b);
+ // we have to scale 0..0xFFFF to 0..0xFF
+ sprintf(buf, "%.2X%.2X%.2X", r/0x101, g/0x101, b/0x101);
+
+ fputs("<body bgcolor=\"#", stdout);
+ fputs(buf, stdout);
+ fputs("\">\n\n", stdout);
+ }
+}
+
+/*
+ * emit_link - generates: <a href="to">name</a>
+ */
+
+void html_printer::emit_link (const string &to, const char *name)
+{
+ fputs("<a href=\"", stdout);
+ fputs(to.contents(), stdout);
+ fputs("\">", stdout);
+ fputs(name, stdout);
+ fputs("</a>", stdout);
+}
+
+/*
+ * write_navigation - writes out the links which navigate between
+ * file fragments.
+ */
+
+void html_printer::write_navigation (const string &top,
+ const string &prev,
+ const string &next,
+ const string &current)
+{
+ int need_bar = FALSE;
+
+ if (multiple_files) {
+ current_paragraph->done_para();
+ write_rule();
+ if (groff_sig)
+ fputs("\n\n<table width=\"100%\" border=\"0\" rules=\"none\"\n"
+ "frame=\"void\" cellspacing=\"1\" cellpadding=\"0\">\n"
+ "<colgroup><col class=\"left\"></col>"
+ "<col class=\"right\"></col></colgroup>\n"
+ "<tr><td class=\"left\">", stdout);
+ handle_valid_flag(FALSE);
+ fputs("[ ", stdout);
+ if ((strcmp(prev.contents(), "") != 0)
+ && prev != top
+ && prev != current) {
+ emit_link(prev, "prev");
+ need_bar = TRUE;
+ }
+ if ((strcmp(next.contents(), "") != 0)
+ && next != top
+ && next != current) {
+ if (need_bar)
+ fputs(" | ", stdout);
+ emit_link(next, "next");
+ need_bar = TRUE;
+ }
+ if (top != "<standard input>"
+ && (strcmp(top.contents(), "") != 0)
+ && top != current) {
+ if (need_bar)
+ fputs(" | ", stdout);
+ emit_link(top, "top");
+ }
+ fputs(" ]\n", stdout);
+ if (groff_sig) {
+ fputs("</td><td class=\"right\"><i><small>"
+ "This document was produced using "
+ "<a href=\"http://www.gnu.org/software/groff/\">"
+ "groff-", stdout);
+ fputs(Version_string, stdout);
+ fputs("</a>.</small></i></td></tr></table>\n", stdout);
+ }
+ write_rule();
+ }
+}
+
+/*
+ * do_file_components - scan the file list copying each temporary file
+ * in turn. This has twofold use: firstly to emit
+ * section heading links, between file fragments
+ * if required and secondly to generate jobname
+ * file fragments if required.
+ */
+
+void html_printer::do_file_components (void)
+{
+ int fragment_no = 1;
+ string top;
+ string prev;
+ string next;
+ string current;
+
+ file_list.start_of_list();
+ top = string(job_name);
+ if (dialect == xhtml)
+ top += string(".xhtml");
+ else
+ top += string(".html");
+ top += '\0';
+ next = file_list.next_file_name();
+ next += '\0';
+ current = next;
+ while (file_list.get_file() != 0) {
+ if (fseek(file_list.get_file(), 0L, 0) < 0)
+ fatal("fseek on temporary file failed");
+ html.copy_file(file_list.get_file());
+ fclose(file_list.get_file());
+ file_list.move_next();
+ if (file_list.is_new_output_file()) {
+#ifdef LONG_FOR_TIME_T
+ long t;
+#else
+ time_t t;
+#endif
+
+ if (fragment_no > 1)
+ write_navigation(top, prev, next, current);
+ prev = current;
+ current = next;
+ next = file_list.next_file_name();
+ next += '\0';
+ string split_file = file_list.file_name();
+ split_file += '\0';
+ fflush(stdout);
+ if (!freopen(split_file.contents(), "w", stdout)) {
+ fatal("unable to reopen standard output stream: %1",
+ strerror(errno));
+ }
+ fragment_no++;
+ if (dialect == xhtml)
+ writeHeadMetaStyle();
+
+ if (do_write_creator_comment) {
+ html.begin_comment("Creator : ")
+ .put_string("groff ")
+ .put_string("version ")
+ .put_string(Version_string)
+ .end_comment();
+ }
+
+ if (do_write_date_comment) {
+ t = current_time();
+ html.begin_comment("CreationDate: ")
+ .put_string(ctime(&t), strlen(ctime(&t))-1)
+ .end_comment();
+ }
+
+ if (dialect == html4)
+ writeHeadMetaStyle();
+
+ html.put_string("<title>");
+ html.put_string(split_file.contents());
+ html.put_string("</title>").nl().nl();
+
+ fputs(head_info.contents(), stdout);
+ fputs("</head>\n", stdout);
+ write_navigation(top, prev, next, current);
+ }
+ if (file_list.are_links_required())
+ header.write_headings(stdout, TRUE);
+ }
+ if (fragment_no > 1)
+ write_navigation(top, prev, next, current);
+ else {
+ assert(current_paragraph != 0);
+ current_paragraph->done_para();
+ write_rule();
+ if (valid_flag) {
+ if (groff_sig)
+ fputs("\n\n<table width=\"100%\" border=\"0\" rules=\"none\"\n"
+ "frame=\"void\" cellspacing=\"1\" cellpadding=\"0\">\n"
+ "<colgroup><col class=\"left\"></col>"
+ "<col class=\"right\"></col></colgroup>\n"
+ "<tr><td class=\"left\">", stdout);
+ handle_valid_flag(TRUE);
+ if (groff_sig) {
+ fputs("</td><td class=\"right\"><i><small>"
+ "This document was produced using "
+ "<a href=\"http://www.gnu.org/software/groff/\">"
+ "groff-", stdout);
+ fputs(Version_string, stdout);
+ fputs("</a>.</small></i></td></tr></table>\n", stdout);
+ }
+ write_rule();
+ }
+ }
+}
+
+/*
+ * writeHeadMetaStyle - emits the <head> <meta> and <style> tags and
+ * related information.
+ */
+
+void html_printer::writeHeadMetaStyle (void)
+{
+ if (dialect == html4) {
+ fputs("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional"
+ "//EN\"\n", stdout);
+ fputs("\"http://www.w3.org/TR/html4/loose.dtd\">\n", stdout);
+ fputs("<html>\n", stdout);
+ fputs("<head>\n", stdout);
+ fputs("<meta name=\"generator\" "
+ "content=\"groff -Thtml, see www.gnu.org\">\n", stdout);
+ fputs("<meta http-equiv=\"Content-Type\" "
+ "content=\"text/html; charset=US-ASCII\">\n", stdout);
+ fputs("<meta name=\"Content-Style\" content=\"text/css\">\n",
+ stdout);
+ fputs("<style type=\"text/css\">\n", stdout);
+ }
+ else {
+ fputs("<?xml version=\"1.0\" encoding=\"us-ascii\"?>\n", stdout);
+ fputs("<!DOCTYPE html PUBLIC \"-//W3C//"
+ "DTD XHTML 1.1 plus MathML 2.0//EN\"\n", stdout);
+ fputs(" \"http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd\"\n",
+ stdout);
+ fputs(" [<!ENTITY mathml \"http://www.w3.org/1998/Math/"
+ "MathML\">]>\n", stdout);
+
+ fputs("<html xmlns=\"http://www.w3.org/1999/xhtml\" "
+ "xml:lang=\"en\">\n", stdout);
+ fputs("<head>\n", stdout);
+ fputs("<meta name=\"generator\" "
+ "content=\"groff -Txhtml, see www.gnu.org\"/>\n", stdout);
+ fputs("<meta http-equiv=\"Content-Type\" "
+ "content=\"text/html; charset=US-ASCII\"/>\n", stdout);
+ fputs("<meta name=\"Content-Style\" content=\"text/css\"/>\n",
+ stdout);
+ fputs("<style type=\"text/css\">\n", stdout);
+ fputs(" .center { text-align: center }\n", stdout);
+ fputs(" .right { text-align: right }\n", stdout);
+ }
+ fputs(" p { margin-top: 0; margin-bottom: 0; "
+ "vertical-align: top }\n", stdout);
+ fputs(" pre { margin-top: 0; margin-bottom: 0; "
+ "vertical-align: top }\n", stdout);
+ fputs(" table { margin-top: 0; margin-bottom: 0; "
+ "vertical-align: top }\n", stdout);
+ fputs(" h1 { text-align: center }\n", stdout);
+ fputs("</style>\n", stdout);
+}
+
+html_printer::~html_printer()
+{
+#ifdef LONG_FOR_TIME_T
+ long t;
+#else
+ time_t t;
+#endif
+
+ if (current_paragraph)
+ current_paragraph->flush_text();
+ html.end_line();
+ html.set_file(stdout);
+
+ if (dialect == xhtml)
+ writeHeadMetaStyle();
+
+ if (do_write_creator_comment) {
+ html.begin_comment("Creator : ")
+ .put_string("groff ")
+ .put_string("version ")
+ .put_string(Version_string)
+ .end_comment();
+ }
+
+ if (do_write_date_comment) {
+ t = current_time();
+ html.begin_comment("CreationDate: ")
+ .put_string(ctime(&t), strlen(ctime(&t))-1)
+ .end_comment();
+ }
+
+ if (dialect == html4)
+ writeHeadMetaStyle();
+
+ write_title(TRUE);
+ head_info += '\0';
+ fputs(head_info.contents(), stdout);
+ fputs("</head>\n", stdout);
+ do_body();
+
+ write_title(FALSE);
+ header.write_headings(stdout, FALSE);
+ write_rule();
+#if defined(DEBUGGING)
+ html.begin_comment("Total number of pages: ")
+ .put_string(i_to_a(no_of_printed_pages)).end_comment();
+#endif
+ html.end_line();
+ html.end_line();
+
+ if (multiple_files) {
+ fputs("</body>\n", stdout);
+ fputs("</html>\n", stdout);
+ do_file_components();
+ } else {
+ do_file_components();
+ fputs("</body>\n", stdout);
+ fputs("</html>\n", stdout);
+ }
+}
+
+/*
+ * get_str - returns a duplicate of string, s. The duplicate
+ * string is terminated at the next ',' or ']'.
+ */
+
+static char *get_str (const char *s, char **n)
+{
+ int i = 0;
+ char *v;
+
+ while ((s[i] != (char)0) && (s[i] != ',') && (s[i] != ']'))
+ i++;
+ if (i>0) {
+ v = new char[i+1];
+ memcpy(v, s, i+1);
+ v[i] = (char)0;
+ if (s[i] == ',')
+ (*n) = (char *)&s[i+1];
+ else
+ (*n) = (char *)&s[i];
+ return v;
+ }
+ if (s[i] == ',')
+ (*n) = (char *)&s[1];
+ else
+ (*n) = (char *)s;
+ return 0;
+}
+
+/*
+ * make_val - creates a string from if s is a null pointer.
+ */
+
+char *make_val (char *s, int v, char *id, char *f, char *l)
+{
+ if (0 /* nullptr */ == s) {
+ char buf[30];
+
+ sprintf(buf, "%d", v);
+ return strsave(buf);
+ }
+ else {
+ /*
+ * check that value, s, is the same as, v.
+ */
+ char *t = s;
+
+ while (*t == '=')
+ t++;
+ if (atoi(t) != v) {
+ if (0 /* nullptr */ == f)
+ f = (char *)"stdin";
+ if (0 /* nullptr */ == l)
+ l = (char *)"<none>";
+ fprintf(stderr, "%s:%s: grohtml assertion failed at id%s; "
+ "expected %d, got %s\n", f, l, id, v, s);
+ }
+ return s;
+ }
+}
+
+/*
+ * handle_assertion - handles the assertions created via .www:ASSERT
+ * in www.tmac. See www.tmac for examples. This
+ * method should be called as we are parsing the
+ * ditroff input. It checks the x, y position
+ * assertions. It does _not_ check the troff state
+ * assertions as these are unknown at this point.
+ */
+
+void html_printer::handle_assertion (int minv, int minh,
+ int maxv, int maxh, const char *s)
+{
+ char *n;
+ char *cmd = get_str(s, &n);
+ char *id = get_str(n, &n);
+ char *val = get_str(n, &n);
+ char *file= get_str(n, &n);
+ char *line= get_str(n, &n);
+
+ if (strcmp(cmd, "assertion:[x") == 0)
+ as.addx(cmd, id, make_val(val, minh, id, file, line), file, line);
+ else if (strcmp(cmd, "assertion:[y") == 0)
+ as.addy(cmd, id, make_val(val, minv, id, file, line), file, line);
+ else
+ if (strncmp(cmd, "assertion:[", strlen("assertion:[")) == 0)
+ page_contents->add_tag(&sbuf_style, string(s),
+ line_number, minv, minh, maxv, maxh);
+}
+
+/*
+ * build_state_assertion - builds the troff state assertions.
+ */
+
+void html_printer::handle_state_assertion (text_glob *g)
+{
+ if (g != 0 && g->is_a_tag()
+ && (strncmp(g->text_string, "assertion:[", 11) == 0)) {
+ char *n = (char *)&g->text_string[11];
+ char *cmd = get_str(n, &n);
+ char *val = get_str(n, &n);
+ (void)get_str(n, &n); // unused
+ char *file= get_str(n, &n);
+ char *line= get_str(n, &n);
+
+ as.build(cmd, val, file, line);
+ }
+}
+
+/*
+ * special - handle all x X requests from troff. For post-html they
+ * allow users to pass raw HTML commands, turn auto linked
+ * headings off/on, and so forth.
+ */
+
+void html_printer::special(char *s, const environment *env, char type)
+{
+ if (type != 'p')
+ return;
+ if (s != 0) {
+ flush_sbuf();
+ if (env->fontno >= 0) {
+ style sty(get_font_from_index(env->fontno), env->size,
+ env->height, env->slant, env->fontno, *env->col);
+ sbuf_style = sty;
+ }
+
+ if (strncmp(s, "html:", 5) == 0) {
+ int r=font::res; /* resolution of the device */
+ font *f=sbuf_style.f;
+
+ if (0 /* nullptr */ == f)
+ f = font::load_font("TR");
+
+ /*
+ * pass rest of string through to html output during flush
+ */
+ page_contents->add_and_encode(&sbuf_style, string(&s[5]),
+ line_number,
+ env->vpos-env->size*r/72, env->hpos,
+ env->vpos , env->hpos,
+ FALSE);
+
+ /*
+ * assume that the html command has no width, if it does then
+ * hopefully troff will have fudged this in a macro by requesting
+ * that the formatting move right by the appropriate amount.
+ */
+ } else if ((strncmp(s, "html</p>:", 9) == 0) ||
+ (strncmp(s, "html<?p>:", 9) == 0) ||
+ (strncmp(s, "math<?p>:", 9) == 0)) {
+ int r=font::res; /* resolution of the device */
+ font *f=sbuf_style.f;
+ string t;
+
+ if (0 /* nullptr */ == f)
+ f = font::load_font("TR");
+
+ if (strncmp(s, "math<?p>:", 9) == 0) {
+ if (strncmp((char *)&s[9], "<math>", 6) == 0) {
+ s[9] = '\0';
+ t = s;
+ t += "<math xmlns=\"http://www.w3.org/1998/Math/MathML\">";
+ t += (char *)&s[15];
+ t += '\0';
+ s = (char *)&t[0];
+ }
+ }
+
+ /*
+ * need to pass all of string through to html output during flush
+ */
+ page_contents->add_and_encode(&sbuf_style, string(s),
+ line_number,
+ env->vpos-env->size*r/72, env->hpos,
+ env->vpos , env->hpos,
+ TRUE);
+
+ /*
+ * assume that the html command has no width, if it does then
+ * hopefully troff will have fudged this in a macro by
+ * requesting that the formatting move right by the appropriate
+ * amount.
+ */
+
+ } else if (strncmp(s, "index:", 6) == 0) {
+ cutoff_heading = atoi(&s[6]);
+ } else if (strncmp(s, "assertion:[", 11) == 0) {
+ int r=font::res; /* resolution of the device */
+
+ handle_assertion(env->vpos-env->size*r/72, env->hpos,
+ env->vpos, env->hpos, s);
+ }
+ }
+}
+
+/*
+ * devtag - handles device troff tags sent from the 'troff'.
+ * These include the troff state machine tags:
+ * .br, .sp, .in, .tl, .ll etc
+ *
+ * (see man 5 grohtml_tags).
+ */
+
+void html_printer::devtag (char *s, const environment *env, char type)
+{
+ if (type != 'p')
+ return;
+
+ if (s != 0) {
+ flush_sbuf();
+ if (env->fontno >= 0) {
+ style sty(get_font_from_index(env->fontno), env->size,
+ env->height, env->slant, env->fontno, *env->col);
+ sbuf_style = sty;
+ }
+
+ if (strncmp(s, "devtag:", strlen("devtag:")) == 0) {
+ int r=font::res; /* resolution of the device */
+
+ page_contents->add_tag(&sbuf_style, string(s),
+ line_number,
+ env->vpos-env->size*r/72, env->hpos,
+ env->vpos , env->hpos);
+ }
+ }
+}
+
+
+/*
+ * taken from number.cpp in src/roff/troff, [hunits::hunits(units x)]
+ */
+
+int html_printer::round_width(int x)
+{
+ int r = font::hor;
+ int n;
+
+ // don't depend on rounding direction for division of negative ints
+ if (r == 1)
+ n = x;
+ else
+ n = (x < 0
+ ? -((-x + r/2 - 1)/r)
+ : (x + r/2 - 1)/r);
+ return n * r;
+}
+
+/*
+ * handle_valid_flag - emits a valid XHTML 1.1 or HTML 4.01 button,
+ * provided -V was supplied on the command line.
+ */
+
+void html_printer::handle_valid_flag (int needs_para)
+{
+ if (valid_flag) {
+ if (needs_para)
+ fputs("<p>", stdout);
+ if (dialect == xhtml)
+ fputs("<a href=\"http://validator.w3.org/check?uri=referer\">"
+ "<img src=\"http://www.w3.org/Icons/valid-xhtml11-blue\" "
+ "alt=\"Valid XHTML 1.1 Transitional\" "
+ "height=\"31\" width=\"88\" /></a>\n", stdout);
+ else
+ fputs("<a href=\"http://validator.w3.org/check?uri=referer\">"
+ "<img src=\"http://www.w3.org/Icons/valid-html401-blue\" "
+ "alt=\"Valid HTML 4.01 Transitional\" "
+ "height=\"31\" width=\"88\"></a>\n", stdout);
+ if (needs_para)
+ fputs("</p>", stdout);
+ }
+}
+
+int main(int argc, char **argv)
+{
+ program_name = argv[0];
+ static char stderr_buf[BUFSIZ];
+ setbuf(stderr, stderr_buf);
+ int c;
+ static const struct option long_options[] = {
+ { "help", no_argument, 0, CHAR_MAX + 1 },
+ { "version", no_argument, 0, 'v' },
+ { NULL, 0, 0, 0 }
+ };
+ while ((c = getopt_long(argc, argv,
+ "a:bCdD:eF:g:Ghi:I:j:lno:prs:S:vVx:y", long_options, NULL))
+ != EOF)
+ switch(c) {
+ case 'a':
+ /* text antialiasing bits - handled by pre-html */
+ break;
+ case 'b':
+ // set background color to white
+ default_background = new color;
+ default_background->set_gray(color::MAX_COLOR_VAL);
+ break;
+ case 'C':
+ // Don't write CreationDate HTML comments.
+ do_write_date_comment = FALSE;
+ break;
+ case 'd':
+ /* handled by pre-html */
+ break;
+ case 'D':
+ /* handled by pre-html */
+ break;
+ case 'e':
+ /* handled by pre-html */
+ break;
+ case 'F':
+ font::command_line_font_dir(optarg);
+ break;
+ case 'g':
+ /* graphic antialiasing bits - handled by pre-html */
+ break;
+ case 'G':
+ // Don't write Creator HTML comments.
+ do_write_creator_comment = FALSE;
+ break;
+ case 'h':
+ /* do not use the Hn headings of html, but manufacture our own */
+ manufacture_headings = TRUE;
+ break;
+ case 'i':
+ /* handled by pre-html */
+ break;
+ case 'I':
+ /* handled by pre-html */
+ break;
+ case 'j':
+ multiple_files = TRUE;
+ job_name = optarg;
+ break;
+ case 'l':
+ auto_links = FALSE;
+ break;
+ case 'n':
+ simple_anchors = TRUE;
+ break;
+ case 'o':
+ /* handled by pre-html */
+ break;
+ case 'p':
+ /* handled by pre-html */
+ break;
+ case 'r':
+ auto_rule = FALSE;
+ break;
+ case 's':
+ base_point_size = atoi(optarg);
+ break;
+ case 'S':
+ split_level = atoi(optarg) + 1;
+ break;
+ case 'v':
+ printf("GNU post-grohtml (groff) version %s\n", Version_string);
+ exit(0);
+ break;
+ case 'V':
+ valid_flag = TRUE;
+ break;
+ case 'x':
+ if (strcmp(optarg, "x") == 0) {
+ dialect = xhtml;
+ simple_anchors = TRUE;
+ } else if (strcmp(optarg, "4") == 0)
+ dialect = html4;
+ else
+ warning("unsupported HTML dialect: '%1'", optarg);
+ break;
+ case 'y':
+ groff_sig = TRUE;
+ break;
+ case CHAR_MAX + 1: // --help
+ usage(stdout);
+ exit(0);
+ break;
+ case '?':
+ usage(stderr);
+ exit(1);
+ break;
+ default:
+ assert(0 == "unhandled getopt_long return value");
+ }
+ if (optind >= argc) {
+ do_file("-");
+ } else {
+ for (int i = optind; i < argc; i++)
+ do_file(argv[i]);
+ }
+ return 0;
+}
+
+static void usage(FILE *stream)
+{
+ fprintf(stream,
+"usage: %s [-bCGhlnrVy] [-F font-directory] [-j output-stem]"
+" [-s base-type-size] [-S heading-level] [-x html-dialect] [file ...]\n"
+"usage: %s {-v | --version}\n"
+"usage: %s --help\n",
+ program_name, program_name, program_name);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/devices/grolbp/charset.h b/src/devices/grolbp/charset.h
new file mode 100644
index 0000000..c4e43a0
--- /dev/null
+++ b/src/devices/grolbp/charset.h
@@ -0,0 +1,89 @@
+// -*- C++ -*-
+/* Copyright (C) 2000-2020 Free Software Foundation, Inc.
+ Written by Francisco Andrés Verdú <pandres@dragonet.es> with many ideas
+ taken from the other groff drivers.
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+// Definition of the WP54 character set
+
+unsigned char symset[] = {
+0x57,0x50,0x35,0x34,0x00,0x41,0x76,0x61,0x6e,0x74,0x47,0x61,
+0x72,0x64,0x65,0x2d,0x42,0x6f,0x6f,0x6b,0x00,0x41,0x76,
+0x61,0x6e,0x74,0x47,0x61,0x72,0x64,0x65,0x2d,0x44,0x65,
+0x6d,0x69,0x00,0x41,0x76,0x61,0x6e,0x74,0x47,0x61,0x72,
+0x64,0x65,0x2d,0x42,0x6f,0x6f,0x6b,0x4f,0x62,0x6c,0x69,
+0x71,0x75,0x65,0x00,0x41,0x76,0x61,0x6e,0x74,0x47,0x61,
+0x72,0x64,0x65,0x2d,0x44,0x65,0x6d,0x69,0x4f,0x62,0x6c,
+0x69,0x71,0x75,0x65,0x00,0x42,0x6f,0x6f,0x6b,0x6d,0x61,
+0x6e,0x2d,0x4c,0x69,0x67,0x68,0x74,0x00,0x42,0x6f,0x6f,
+0x6b,0x6d,0x61,0x6e,0x2d,0x44,0x65,0x6d,0x69,0x00,0x42,
+0x6f,0x6f,0x6b,0x6d,0x61,0x6e,0x2d,0x4c,0x69,0x67,0x68,
+0x74,0x49,0x74,0x61,0x6c,0x69,0x63,0x00,0x42,0x6f,0x6f,
+0x6b,0x6d,0x61,0x6e,0x2d,0x44,0x65,0x6d,0x69,0x49,0x74,
+0x61,0x6c,0x69,0x63,0x00,0x43,0x65,0x6e,0x74,0x75,0x72,
+0x79,0x53,0x63,0x68,0x6c,0x62,0x6b,0x2d,0x52,0x6f,0x6d,
+0x61,0x6e,0x00,0x43,0x65,0x6e,0x74,0x75,0x72,0x79,0x53,
+0x63,0x68,0x6c,0x62,0x6b,0x2d,0x42,0x6f,0x6c,0x64,0x00,
+0x43,0x65,0x6e,0x74,0x75,0x72,0x79,0x53,0x63,0x68,0x6c,
+0x62,0x6b,0x2d,0x49,0x74,0x61,0x6c,0x69,0x63,0x00,0x43,
+0x65,0x6e,0x74,0x75,0x72,0x79,0x53,0x63,0x68,0x6c,0x62,
+0x6b,0x2d,0x42,0x6f,0x6c,0x64,0x49,0x74,0x61,0x6c,0x69,
+0x63,0x00,0x44,0x75,0x74,0x63,0x68,0x2d,0x52,0x6f,0x6d,
+0x61,0x6e,0x00,0x44,0x75,0x74,0x63,0x68,0x2d,0x42,0x6f,
+0x6c,0x64,0x00,0x44,0x75,0x74,0x63,0x68,0x2d,0x49,0x74,
+0x61,0x6c,0x69,0x63,0x00,0x44,0x75,0x74,0x63,0x68,0x2d,
+0x42,0x6f,0x6c,0x64,0x49,0x74,0x61,0x6c,0x69,0x63,0x00,
+0x53,0x77,0x69,0x73,0x73,0x00,0x53,0x77,0x69,0x73,0x73,
+0x2d,0x42,0x6f,0x6c,0x64,0x00,0x53,0x77,0x69,0x73,0x73,
+0x2d,0x4f,0x62,0x6c,0x69,0x71,0x75,0x65,0x00,0x53,0x77,
+0x69,0x73,0x73,0x2d,0x42,0x6f,0x6c,0x64,0x4f,0x62,0x6c,
+0x69,0x71,0x75,0x65,0x00,0x53,0x77,0x69,0x73,0x73,0x2d,
+0x4e,0x61,0x72,0x72,0x6f,0x77,0x00,0x53,0x77,0x69,0x73,
+0x73,0x2d,0x4e,0x61,0x72,0x72,0x6f,0x77,0x2d,0x42,0x6f,
+0x6c,0x64,0x00,0x53,0x77,0x69,0x73,0x73,0x2d,0x4e,0x61,
+0x72,0x72,0x6f,0x77,0x2d,0x4f,0x62,0x6c,0x69,0x71,0x75,
+0x65,0x00,0x53,0x77,0x69,0x73,0x73,0x2d,0x4e,0x61,0x72,
+0x72,0x6f,0x77,0x2d,0x42,0x6f,0x6c,0x64,0x4f,0x62,0x6c,
+0x69,0x71,0x75,0x65,0x00,0x5a,0x61,0x70,0x66,0x43,0x61,
+0x6c,0x6c,0x69,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x2d,
+0x52,0x6f,0x6d,0x61,0x6e,0x00,0x5a,0x61,0x70,0x66,0x43,
+0x61,0x6c,0x6c,0x69,0x67,0x72,0x61,0x70,0x68,0x69,0x63,
+0x2d,0x42,0x6f,0x6c,0x64,0x00,0x5a,0x61,0x70,0x66,0x43,
+0x61,0x6c,0x6c,0x69,0x67,0x72,0x61,0x70,0x68,0x69,0x63,
+0x2d,0x49,0x74,0x61,0x6c,0x69,0x63,0x00,0x5a,0x61,0x70,
+0x66,0x43,0x61,0x6c,0x6c,0x69,0x67,0x72,0x61,0x70,0x68,
+0x69,0x63,0x2d,0x42,0x6f,0x6c,0x64,0x49,0x74,0x61,0x6c,
+0x69,0x63,0x00,0x5a,0x61,0x70,0x66,0x43,0x68,0x61,0x6e,
+0x63,0x65,0x72,0x79,0x2d,0x4d,0x65,0x64,0x69,0x75,0x6d,
+0x49,0x74,0x61,0x6c,0x69,0x63,0x00,0x00,0x09,0x00,0x0A,
+0x00,0x0B,0x00,0x0E,0x00,0x14,0x00,0x17,0x00,0x18,0x00,
+0x1F,0x00,0x20,0x00,0x36,0x00,0x37,0x00,0x38,0x00,0x45,0x00,
+0x47,0x00,0x48,0x00,0x80,0x00,0x82,0x00,0x83,0x00,0x84,
+0x00,0x85,0x00,0x87,0x00,0x8B,0x00,0x8C,0x00,0x8D,0x00,0x8E,
+0x00,0x8F,0x00,0x90,0x00,0x91,0x00,0x92,0x00,0x95,0x00,0x96,
+0x00,0x97,0x00,0x98,0x00,0x99,0x00,0x9C,0x00,0x9E,0x00,
+0x9F,0x00,0xA0,0x00,0xA1,0x00,0xA2,0x00,0xA3,0x00,0xCB,0x00,
+0xCC,0x00,0xCD,0x00,0xCE,0x00,0xD1,0x00,0xD3,0x00,0xD4,
+0x00,0xD5,0x00,0xD6,0x00,0xFA,0x00,0xFB,0x00,0xFC,0x00,0xFD,
+0x00,0xCF,0x00,0x26,0x00,0x7E,0x03,0x05,0x00,0xA5,0x00,
+0xA6,0x00,0xA8,0x00,0xAA,0x00,0xAD,0x00,0xAE,0x00,0xAF,0x00,
+0xB0,0x00,0xB1,0x00,0xB2,0x00,0xB3,0x00,0xB5,0x00,0xB6,0x00,
+0xB8,0x00,0xB9,0x00,0xBA,0x00,0xBB,0x00,0xBC,0x00,0xBE,
+0x00,0xBF,0x00,0xC0,0x00,0xC1,0x00,0xC6,0x00,0xDC,0x00,0xEB,
+0x00,0xEC,0x00,0xF2,0x00,0xF3,0x00,0x15,0x00,0x16,0x00,
+0x86
+};
diff --git a/src/devices/grolbp/grolbp.1.man b/src/devices/grolbp/grolbp.1.man
new file mode 100644
index 0000000..c8cda76
--- /dev/null
+++ b/src/devices/grolbp/grolbp.1.man
@@ -0,0 +1,504 @@
+'\" t
+.TH grolbp @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+grolbp \-
+.I groff
+output driver for Canon CaPSL printers
+.
+.
+.\" Modified from grolj4 man page by Francisco Andrés Verdú
+.\" <pandres@dragonet.es> for the grolbp program.
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1994-2020 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_grolbp_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY grolbp
+.RB [ \-l ]
+.RB [ \-c\~\c
+.IR num-copies ]
+.RB [ \-F\~\c
+.IR font-directory ]
+.RB [ \-o\~\c
+.IR orientation ]
+.RB [ \-p\~\c
+.IR paper-format ]
+.RB [ \-w\~\c
+.IR width ]
+.RI [ file\~ .\|.\|.]
+.
+.SY grolbp
+[\c
+.BI \-\-copies= num-copies\c
+] [\c
+.BI \-\-fontdir= font-directory\c
+] [\c
+.B \-\-landscape\c
+] [\c
+.BI \-\-linewidth= width\c
+] [\c
+.BI \-\-orientation= orientation\c
+] [\c
+.BI \-\-papersize= paper-format\c
+]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY grolbp
+.B \-h
+.
+.SY grolbp
+.B \-\-help
+.YS
+.
+.
+.SY grolbp
+.B \-v
+.
+.SY grolbp
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+This GNU
+.I roff
+output driver translates the output of
+.MR @g@troff @MAN1EXT@
+into a CaPSL and VDM format suitable for Canon LBP-4 and LBP-8 printers.
+.
+Normally,
+.I grolbp
+is invoked by
+.MR groff @MAN1EXT@
+when the latter is given the
+.RB \[lq] \-T\~lbp \[rq]
+option.
+.
+(In this installation,
+.B @DEVICE@
+is the default output device.)
+.
+Use
+.IR groff 's
+.B \-P
+option to pass any options shown above to
+.IR grolbp .
+.
+If no
+.I file
+arguments are given,
+or if
+.I file
+is \[lq]\-\[rq],
+.I grolbp
+reads the standard input stream.
+.
+Output is written to the standard output stream.
+.
+.
+.\" ====================================================================
+.SS Typefaces
+.\" ====================================================================
+.
+The driver supports the Dutch,
+Swiss,
+and Swiss-Narrow scalable typefaces,
+each in the regular,
+bold,
+italic,
+and bold-italic styles.
+.
+Additionally,
+the bitmapped,
+monospaced Courier and Elite typefaces are available in regular,
+bold,
+and
+italic styles;
+Courier at 8 and 12 points,
+Elite at 8 and 10 points.
+.
+The following chart summarizes the
+.I groff
+font names used to access them.
+.
+.
+.P
+.TS
+tab(|) allbox center;
+Cb Cb Cb Cb Cb
+L L L L L
+.
+Typeface | Roman | Bold | Italic | Bold-Italic
+Dutch | TR | TB | TI | TBI
+Swiss | HR | HB | HI | HBI
+Swiss Narrow | HNR | HNB | HNI | HNBI
+Courier | CR | CB | CI |
+Elite | ER | EB | EI |
+.TE
+.
+.
+.\" ====================================================================
+.SS "Paper format, orientation, and device description file"
+.\" ====================================================================
+.
+.I grolbp
+supports paper formats
+.RB \[lq] A4 \[rq],
+.RB \[lq] letter \[rq],
+.RB \[lq] legal \[rq],
+and
+.RB \[lq] executive \[rq].
+.
+These are matched case-insensitively.
+.
+The
+.BR \-p ,
+.B \-\-papersize
+option overrides any setting in the device description file
+.IR DESC .
+.
+If neither specifies a paper format,
+A4 is assumed.
+.
+.
+.P
+In its
+.I DESC
+file,
+.I grolbp
+(case-insensitively) recognizes an
+.B orientation
+directive accepting one mandatory argument,
+.B portrait
+or
+.BR landscape .
+.
+The first valid orientation directive encountered controls.
+.\" XXX: This is inconsistent with other description file processing.
+.
+The
+.BR \-l ,
+.BR \-o ,
+and
+.B \-\-orientation
+command-line options
+override any setting in
+.IR DESC .
+.
+If none of the foregoing specify the orientation,
+portrait is assumed.
+.
+.
+.\" ====================================================================
+.SS "Font description files"
+.\" ====================================================================
+.
+In addition to the font description file directives documented in
+.MR groff_font @MAN5EXT@ ,
+.I grolbp
+recognizes
+.BR lbpname ,
+which maps the
+.I groff
+font name to the font name used internally by the printer.
+.
+Its syntax is as follows.
+.RS
+.EX
+.RI lbpname\~ printer-font-name
+.EE
+.RE
+.
+.
+.BR lbpname 's
+argument is case-sensitive.
+.
+The printer's font names are encoded as follows.
+.
+.
+.P
+For bitmapped fonts,
+.I printer-font_name
+has the form
+.RS
+.EX
+.RI N\[la] base-font-name \[ra]\[la] font-style \[ra]
+.EE
+.RE
+.I base-font-name
+is the font name as it appears in the printer's font listings without
+the first letter,
+up to
+(but not including)
+the font size.
+.
+.I font-style
+can be one of the letters
+.BR R ,
+.BR I ,
+or
+.BR B ,
+.\" The bold-italic style apparently was not supported for bitmap fonts.
+indicating the roman,
+italic,
+and bold styles,
+respectively.
+.
+For instance,
+if the printer's \[lq]font listing A\[rq]
+shows \[lq]Nelite12I.ISO_USA\[rq],
+the corresponding entry in the
+.I groff
+font description file is
+.RS
+.EX
+lbpname NeliteI
+.EE
+.RE
+.
+You may need to modify
+.I grolbp
+to add support for new bitmapped fonts,
+since the available font names and font sizes of bitmapped fonts
+(as documented above)
+are hard-coded into the program.
+.
+.
+.P
+For scalable fonts,
+.I printer-font-name
+is identical to the font name as it appears in the printer's \[lq]font
+listing A\[rq].
+.
+For instance,
+to select the \[lq]Swiss\[rq] font in bold-italic style,
+which appears in the font listing
+as \%\[lq]Swiss\-BoldOblique\[rq],
+.RS
+.EX
+lbpname Swiss\-BoldOblique
+.EE
+.RE
+is the required directive,
+and this is what we find in the
+.I groff
+font description file
+.I HBI
+for the
+.B lbp
+device.
+.
+.
+.\" ====================================================================
+.SS "Drawing commands"
+.\" ====================================================================
+.
+For compatibility with
+.MR grolj4 @MAN1EXT@ ,
+an additional drawing command is available.
+.
+.
+.TP
+.BI \[rs]D\[aq]R\~ "dh dv" \[aq]
+Draw a rule
+(solid black rectangle)
+with one corner at the drawing position,
+and the diagonally opposite corner at the drawing position
+.RI +( dh , dv ).
+.\" XXX , at which the drawing position will be afterward. ?
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-h
+and
+.B \-\-help
+display a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.BI \-c " num-copies"
+.TQ
+.BI \-\-copies= num-copies
+Produce
+.I num-copies
+copies of each page.
+.
+.
+.TP
+.BI \-F " font-directory"
+.TQ
+.BI \-\-fontdir= font-directory
+Prepend directory
+.RI font-directory /dev name
+to the search path for font and device description files;
+.I name
+is the name of the device,
+usually
+.BR lbp .
+.
+.
+.TP
+.B \-l
+.TQ
+.B \-\-landscape
+Format the document in landscape orientation.
+.
+.
+.TP
+.BI \-o " orientation"
+.TQ
+.BI \-\-orientation= orientation
+Format the document in the given
+.IR orientation ,
+which must be
+.RB \%\[lq] portrait \[rq]
+or
+.RB \%\[lq] landscape \[rq].
+.
+.
+.TP
+.BI \-p " paper-format"
+.TQ
+.BI \-\-papersize= paper-format
+Set the paper format to
+.IR paper-format ,
+which must be a valid paper format as described above.
+.
+.
+.TP
+.BI \-w " width"
+.TQ
+.BI \-\-linewidth= width
+Set the default line thickness to
+.I width
+thousandths of an em;
+the default is
+.B 40
+(0.04\~em).
+.
+.
+.\" ====================================================================
+.SH Environment
+.\" ====================================================================
+.
+.TP
+.I GROFF_FONT_PATH
+lists directories in which to seek the selected output device's
+directory of device and font description files.
+.
+See
+.MR @g@troff @MAN1EXT@
+and
+.MR groff_font @MAN5EXT@ .
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @FONTDIR@/\:\%devlbp/\:DESC
+describes the
+.B lbp
+output device.
+.
+.
+.TP
+.IR @FONTDIR@/\:\%devlbp/ F
+describes the font known
+.RI as\~ F
+on device
+.BR lbp .
+.
+.
+.TP
+.I @MACRODIR@/\:lbp\:.tmac
+defines macros for use with the
+.B lbp
+output device.
+.
+It is automatically loaded by
+.I troffrc
+when the
+.B lbp
+output device is selected.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.MR groff @MAN1EXT@ ,
+.MR @g@troff @MAN1EXT@ ,
+.MR groff_out @MAN5EXT@ ,
+.MR groff_font @MAN5EXT@ ,
+.MR groff_char @MAN7EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_grolbp_1_man_C]
+.do rr *groff_grolbp_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/devices/grolbp/grolbp.am b/src/devices/grolbp/grolbp.am
new file mode 100644
index 0000000..3ee3a0a
--- /dev/null
+++ b/src/devices/grolbp/grolbp.am
@@ -0,0 +1,36 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+bin_PROGRAMS += grolbp
+grolbp_SOURCES = \
+ src/devices/grolbp/lbp.cpp \
+ src/devices/grolbp/lbp.h \
+ src/devices/grolbp/charset.h
+
+grolbp_LDADD = $(LIBM) \
+ libdriver.a \
+ libgroff.a \
+ lib/libgnu.a
+man1_MANS += src/devices/grolbp/grolbp.1
+EXTRA_DIST += src/devices/grolbp/grolbp.1.man
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/devices/grolbp/lbp.cpp b/src/devices/grolbp/lbp.cpp
new file mode 100644
index 0000000..35cd54e
--- /dev/null
+++ b/src/devices/grolbp/lbp.cpp
@@ -0,0 +1,738 @@
+/* Copyright (C) 1994-2020 Free Software Foundation, Inc.
+ Written by Francisco Andrés Verdú <pandres@dragonet.es> with many
+ ideas taken from the other groff drivers.
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/*
+TODO
+
+ - Add X command to include bitmaps
+*/
+
+#include <assert.h>
+
+#include "driver.h"
+#include "lbp.h"
+#include "charset.h"
+#include "paper.h"
+
+#include "nonposix.h"
+
+extern "C" const char *Version_string;
+
+static int user_papersize = -1;
+static int orientation = -1;
+
+// custom paper format
+static double user_paperlength = 0;
+static double user_paperwidth = 0;
+
+static int ncopies = 1;
+
+#define DEFAULT_LINEWIDTH_FACTOR 40 // 0.04em
+static int linewidth_factor = DEFAULT_LINEWIDTH_FACTOR;
+
+static int set_papersize(const char *paperformat);
+
+class lbp_font : public font {
+public:
+ ~lbp_font();
+ void handle_unknown_font_command(const char *command, const char *arg,
+ const char *filename, int lineno);
+ static lbp_font *load_lbp_font(const char *);
+ char *lbpname;
+ char is_scalable;
+private:
+ lbp_font(const char *);
+};
+
+class lbp_printer : public printer {
+public:
+ lbp_printer(int, double, double);
+ ~lbp_printer();
+ void set_char(glyph *, font *, const environment *, int, const char *name);
+ void draw(int code, int *p, int np, const environment *env);
+ void begin_page(int);
+ void end_page(int page_length);
+ font *make_font(const char *);
+ void end_of_line();
+private:
+ void set_line_thickness(int size,const environment *env);
+ void vdmstart();
+ void vdmflush(); // the name vdmend was already used in lbp.h
+ void setfillmode(int mode);
+ void polygon( int hpos,int vpos,int np,int *p);
+ char *font_name(const lbp_font *f, const int siz);
+
+ int fill_pattern;
+ int fill_mode;
+ int cur_hpos;
+ int cur_vpos;
+ lbp_font *cur_font;
+ int cur_size;
+ unsigned short cur_symbol_set;
+ int line_thickness;
+ int req_linethickness; // requested line thickness
+ // custom paper format
+ int papersize;
+ int paperlength;
+ int paperwidth;
+};
+
+lbp_font::lbp_font(const char *nm)
+: font(nm)
+{
+}
+
+lbp_font::~lbp_font()
+{
+}
+
+lbp_font *lbp_font::load_lbp_font(const char *s)
+{
+ lbp_font *f = new lbp_font(s);
+ f->lbpname = NULL;
+ f->is_scalable = 1; // Default is that fonts are scalable
+ if (!f->load()) {
+ delete f;
+ return 0;
+ }
+ return f;
+}
+
+
+void lbp_font::handle_unknown_font_command(const char *command,
+ const char *arg,
+ const char *filename, int lineno)
+{
+ if (strcmp(command, "lbpname") == 0) {
+ if (arg == 0)
+ fatal_with_file_and_line(filename, lineno,
+ "'%1' command requires an argument",
+ command);
+ this->lbpname = new char[strlen(arg) + 1];
+ strcpy(this->lbpname, arg);
+ // we recognize bitmapped fonts by the first character of its name
+ if (arg[0] == 'N')
+ this->is_scalable = 0;
+ // fprintf(stderr, "Loading font \"%s\" \n", arg);
+ }
+ // fprintf(stderr, "Loading font %s \"%s\" in %s at %d\n",
+ // command, arg, filename, lineno);
+}
+
+static void wp54charset()
+{
+ unsigned int i;
+ lbpputs("\033[714;100;29;0;32;120.}");
+ for (i = 0; i < sizeof(symset); i++)
+ lbpputc(symset[i]);
+ lbpputs("\033[100;0 D");
+ return;
+}
+
+lbp_printer::lbp_printer(int ps, double pw, double pl)
+: fill_pattern(1),
+ fill_mode(0),
+ cur_hpos(-1),
+ cur_font(0),
+ cur_size(0),
+ cur_symbol_set(0),
+ req_linethickness(-1)
+{
+ SET_BINARY(fileno(stdout));
+ lbpinit(stdout);
+ lbpputs("\033c\033;\033[2&z\033[7 I\033[?32h\033[?33h\033[11h");
+ wp54charset(); // Define the new symbol set
+ lbpputs("\033[7 I\033[?32h\033[?33h\033[11h");
+ // Paper format handling
+ if (orientation < 0)
+ orientation = 0; // Default orientation is portrait
+ papersize = 14; // Default paper format is A4
+ if (font::papersize) {
+ papersize = set_papersize(font::papersize);
+ paperlength = font::paperlength;
+ paperwidth = font::paperwidth;
+ }
+ if (ps >= 0) {
+ papersize = ps;
+ paperlength = int(pl * font::res + 0.5);
+ paperwidth = int(pw * font::res + 0.5);
+ }
+ if (papersize < 80) // standard paper
+ lbpprintf("\033[%dp", (papersize | orientation));
+ else // Custom paper
+ lbpprintf("\033[%d;%d;%dp", (papersize | orientation),
+ paperlength, paperwidth);
+ // Number of copies
+ lbpprintf("\033[%dv\n", ncopies);
+ lbpputs("\033[0u\033[1u\033P1y Grolbp\033\\");
+ lbpmoveabs(0, 0);
+ lbpputs("\033[0t\033[2t");
+ lbpputs("\033('$2\033)' 1"); // Primary symbol set IBML
+ // Secondary symbol set IBMR1
+ cur_symbol_set = 0;
+}
+
+lbp_printer::~lbp_printer()
+{
+ lbpputs("\033P1y\033\\");
+ lbpputs("\033c\033<");
+}
+
+inline void lbp_printer::set_line_thickness(int size,const environment *env)
+{
+ if (size == 0)
+ line_thickness = 1;
+ else {
+ if (size < 0)
+ // line_thickness =
+ // (env->size * (font::res/72)) * (linewidth_factor/1000)
+ // we ought to check for overflow
+ line_thickness =
+ env->size * linewidth_factor * font::res / 72000;
+ else // size > 0
+ line_thickness = size;
+ } // else from if (size == 0)
+ if (line_thickness < 1)
+ line_thickness = 1;
+ if (vdminited())
+ vdmlinewidth(line_thickness);
+ req_linethickness = size; // an size requested
+ /* fprintf(stderr, "thickness: %d == %d, size %d, %d \n",
+ size, line_thickness, env->size,req_linethickness); */
+ return;
+} // lbp_printer::set_line_thickness
+
+void lbp_printer::begin_page(int)
+{
+}
+
+void lbp_printer::end_page(int)
+{
+ if (vdminited())
+ vdmflush();
+ lbpputc('\f');
+ cur_hpos = -1;
+}
+
+void lbp_printer::end_of_line()
+{
+ cur_hpos = -1; // force absolute motion
+}
+
+char *lbp_printer::font_name(const lbp_font *f, const int siz)
+{
+ static char bfont_name[255]; // The resulting font name
+ char type, // Italic, Roman, Bold
+ ori, // Normal or Rotated
+ *nam; // The font name without other data.
+ int cpi; // The font size in characters per inch
+ // (bitmapped fonts are monospaced).
+ /* Bitmap font selection is ugly in this printer, so don't expect
+ this function to be elegant. */
+ bfont_name[0] = 0x00;
+ if (orientation) // Landscape
+ ori = 'R';
+ else // Portrait
+ ori = 'N';
+ type = f->lbpname[strlen(f->lbpname) - 1];
+ nam = new char[strlen(f->lbpname) - 2];
+ strncpy(nam, &(f->lbpname[1]), strlen(f->lbpname) - 2);
+ nam[strlen(f->lbpname) - 2] = 0x00;
+ // fprintf(stderr, "Bitmap font '%s' %d %c %c \n", nam, siz, type, ori);
+ /* Since these fonts are available only at certain sizes,
+ 10 and 17 cpi for courier, 12 and 17 cpi for elite,
+ we adjust the resulting size. */
+ cpi = 17;
+ // Fortunately there are only two bitmapped fonts shipped with the printer.
+ if (!strcasecmp(nam, "courier")) {
+ // Courier font
+ if (siz >= 12)
+ cpi = 10;
+ else cpi = 17;
+ }
+ if (!strcasecmp(nam, "elite")) {
+ if (siz >= 10)
+ cpi = 12;
+ else cpi = 17;
+ }
+ // Now that we have all the data, let's generate the font name.
+ if ((type != 'B') && (type != 'I')) // Roman font
+ sprintf(bfont_name, "%c%s%d", ori, nam, cpi);
+ else
+ sprintf(bfont_name, "%c%s%d%c", ori, nam, cpi, type);
+ return bfont_name;
+}
+
+void lbp_printer::set_char(glyph *g, font *f, const environment *env,
+ int w, const char *)
+{
+ int code = f->get_code(g);
+ unsigned char ch = code & 0xff;
+ unsigned short symbol_set = code >> 8;
+ if (f != cur_font) {
+ lbp_font *psf = (lbp_font *)f;
+ // fprintf(stderr, "Loading font %s \"%d\" \n", psf->lbpname, env->size);
+ if (psf->is_scalable) {
+ // Scalable font selection is different from bitmaped
+ lbpprintf("\033Pz%s.IBML\033\\\033[%d C", psf->lbpname,
+ (int)((env->size * font::res) / 72));
+ }
+ else
+ // bitmapped font
+ lbpprintf("\033Pz%s.IBML\033\\\n", font_name(psf, env->size));
+ lbpputs("\033)' 1"); // Select IBML and IBMR1 symbol set
+ cur_font = psf;
+ cur_symbol_set = 0;
+ // Update the line thickness if needed
+ if ((req_linethickness < 0 ) && (env->size != cur_size))
+ set_line_thickness(req_linethickness,env);
+ cur_size = env->size;
+ }
+ if (symbol_set != cur_symbol_set) {
+ if (cur_symbol_set == 3)
+ // if current symbol set is Symbol we must restore the font
+ lbpprintf("\033Pz%s.IBML\033\\\033[%d C", cur_font->lbpname,
+ (int)((env->size * font::res) / 72));
+ switch (symbol_set) {
+ case 0:
+ lbpputs("\033('$2\033)' 1"); // Select IBML and IBMR1 symbol sets
+ break;
+ case 1:
+ lbpputs("\033(d\033)' 1"); // Select wp54 symbol set
+ break;
+ case 2:
+ lbpputs("\033('$2\033)'!0"); // Select IBMP symbol set
+ break;
+ case 3:
+ lbpprintf("\033PzSymbol.SYML\033\\\033[%d C",
+ (int)((env->size * font::res) / 72));
+ lbpputs("\033(\"!!0\033)\"!!1"); // Select symbol font
+ break;
+ case 4:
+ lbpputs("\033)\"! 1\033(\"!$2"); // Select PS symbol set
+ break;
+ }
+ cur_symbol_set = symbol_set;
+ }
+ if (env->size != cur_size) {
+ if (!cur_font->is_scalable)
+ lbpprintf("\033Pz%s.IBML\033\\\n", font_name(cur_font, env->size));
+ else
+ lbpprintf("\033[%d C", (int)((env->size * font::res) / 72));
+ cur_size = env->size;
+ // Update the line thickness if needed
+ if (req_linethickness < 0 )
+ set_line_thickness(req_linethickness,env);
+ }
+ if ((env->hpos != cur_hpos) || (env->vpos != cur_vpos)) {
+ // lbpmoveabs(env->hpos - ((5 * 300) / 16), env->vpos);
+ lbpmoveabs(env->hpos - 64, env->vpos - 64);
+ cur_vpos = env->vpos;
+ cur_hpos = env->hpos;
+ }
+ if ((ch & 0x7F) < 32)
+ lbpputs("\033[1.v");
+ lbpputc(ch);
+ cur_hpos += w;
+}
+
+void lbp_printer::vdmstart()
+{
+ FILE *f;
+ static int changed_origin = 0;
+ errno = 0;
+ f = tmpfile();
+ // f = fopen("/tmp/gtmp","w+");
+ if (f == NULL)
+ perror("Opening temporary file");
+ vdminit(f);
+ if (!changed_origin) { // we should change the origin only one time
+ changed_origin = 1;
+ vdmorigin(-63, 0);
+ }
+ vdmlinewidth(line_thickness);
+}
+
+void
+lbp_printer::vdmflush()
+{
+ char buffer[1024];
+ int bytes_read = 1;
+ vdmend();
+ fflush(lbpoutput);
+ /* let's copy the vdm code to the output */
+ rewind(vdmoutput);
+ do {
+ bytes_read = fread(buffer, 1, sizeof(buffer), vdmoutput);
+ bytes_read = fwrite(buffer, 1, bytes_read, lbpoutput);
+ } while (bytes_read == sizeof(buffer));
+ fclose(vdmoutput); // This will also delete the file,
+ // since it is created by tmpfile()
+ vdmoutput = NULL;
+}
+
+inline void lbp_printer::setfillmode(int mode)
+{
+ if (mode != fill_mode) {
+ if (mode != 1)
+ vdmsetfillmode(mode, 1, 0);
+ else
+ // To get black, we must use white inverted.
+ vdmsetfillmode(mode, 1, 1);
+
+ fill_mode = mode;
+ }
+}
+
+inline void lbp_printer::polygon(int hpos, int vpos, int np, int *p)
+{
+ int *points, i;
+ points = new int[np + 2];
+ points[0] = hpos;
+ points[1] = vpos;
+ // fprintf(stderr, "Polygon (%d,%d) ", points[0], points[1]);
+ for (i = 0; i < np; i++)
+ points[i + 2] = p[i];
+ // for (i = 0; i < np; i++) fprintf(stderr, " %d ", p[i]);
+ // fprintf(stderr, "\n");
+ vdmpolygon((np /2) + 1, points);
+}
+
+void lbp_printer::draw(int code, int *p, int np, const environment *env)
+{
+ if ((req_linethickness < 0 ) && (env->size != cur_size))
+ set_line_thickness(req_linethickness,env);
+
+ switch (code) {
+ case 't':
+ if (np == 0)
+ line_thickness = 1;
+ else { // troff gratuitously adds an extra 0
+ if (np != 1 && np != 2) {
+ error("0 or 1 argument required for thickness");
+ break;
+ }
+ set_line_thickness(p[0],env);
+ }
+ break;
+ case 'l': // Line
+ if (np != 2) {
+ error("2 arguments required for line");
+ break;
+ }
+ if (!vdminited())
+ vdmstart();
+ vdmline(env->hpos, env->vpos, p[0], p[1]);
+/* fprintf(stderr, "\nline: %d,%d - %d,%d thickness %d == %d\n",
+ env->hpos - 64,env->vpos -64, env->hpos - 64 + p[0],
+ env->vpos -64 + p[1], env->size, line_thickness);*/
+ break;
+ case 'R': // Rule
+ if (np != 2) {
+ error("2 arguments required for Rule");
+ break;
+ }
+ if (vdminited()) {
+ setfillmode(fill_pattern); // Solid Rule
+ vdmrectangle(env->hpos, env->vpos, p[0], p[1]);
+ }
+ else {
+ lbpruleabs(env->hpos - 64, env->vpos -64, p[0], p[1]);
+ cur_vpos = p[1];
+ cur_hpos = p[0];
+ }
+ // fprintf(stderr, "\nrule: thickness %d == %d\n",
+ // env->size, line_thickness);
+ break;
+ case 'P': // Filled Polygon
+ if (!vdminited())
+ vdmstart();
+ setfillmode(fill_pattern);
+ polygon(env->hpos, env->vpos, np, p);
+ break;
+ case 'p': // Empty Polygon
+ if (!vdminited())
+ vdmstart();
+ setfillmode(0);
+ polygon(env->hpos, env->vpos, np, p);
+ break;
+ case 'C': // Filled Circle
+ if (!vdminited())
+ vdmstart();
+ // fprintf(stderr, "Circle (%d,%d) Fill %d\n",
+ // env->hpos, env->vpos, fill_pattern);
+ setfillmode(fill_pattern);
+ vdmcircle(env->hpos + (p[0]/2), env->vpos, p[0]/2);
+ break;
+ case 'c': // Empty Circle
+ if (!vdminited())
+ vdmstart();
+ setfillmode(0);
+ vdmcircle(env->hpos + (p[0]/2), env->vpos, p[0]/2);
+ break;
+ case 'E': // Filled Ellipse
+ if (!vdminited())
+ vdmstart();
+ setfillmode(fill_pattern);
+ vdmellipse(env->hpos + (p[0]/2), env->vpos, p[0]/2, p[1]/2, 0);
+ break;
+ case 'e': // Empty Ellipse
+ if (!vdminited())
+ vdmstart();
+ setfillmode(0);
+ vdmellipse(env->hpos + (p[0]/2), env->vpos, p[0]/2, p[1]/2, 0);
+ break;
+ case 'a': // Arc
+ if (!vdminited())
+ vdmstart();
+ setfillmode(0);
+ // VDM draws arcs clockwise and pic counterclockwise
+ // We must compensate for that, exchanging the starting and
+ // ending points
+ vdmvarc(env->hpos + p[0], env->vpos+p[1],
+ int(sqrt(double((p[0]*p[0]) + (p[1]*p[1])))),
+ p[2], p[3],
+ (-p[0]), (-p[1]), 1, 2);
+ break;
+ case '~': // Spline
+ if (!vdminited())
+ vdmstart();
+ setfillmode(0);
+ vdmspline(np/2, env->hpos, env->vpos, p);
+ break;
+ case 'f':
+ if (np != 1 && np != 2) {
+ error("1 argument required for fill");
+ break;
+ }
+ // fprintf(stderr, "Fill %d\n", p[0]);
+ if ((p[0] == 1) || (p[0] >= 1000)) { // Black
+ fill_pattern = 1;
+ break;
+ }
+ if (p[0] == 0) { // White
+ fill_pattern = 0;
+ break;
+ }
+ if ((p[0] > 1) && (p[0] < 1000))
+ {
+ if (p[0] >= 990) fill_pattern = -23;
+ else if (p[0] >= 700) fill_pattern = -28;
+ else if (p[0] >= 500) fill_pattern = -27;
+ else if (p[0] >= 400) fill_pattern = -26;
+ else if (p[0] >= 300) fill_pattern = -25;
+ else if (p[0] >= 200) fill_pattern = -22;
+ else if (p[0] >= 100) fill_pattern = -24;
+ else fill_pattern = -21;
+ }
+ break;
+ case 'F':
+ // not implemented yet
+ break;
+ default:
+ error("unrecognised drawing command '%1'", char(code));
+ break;
+ }
+ return;
+}
+
+font *lbp_printer::make_font(const char *nm)
+{
+ return lbp_font::load_lbp_font(nm);
+}
+
+printer *make_printer()
+{
+ return new lbp_printer(user_papersize, user_paperwidth, user_paperlength);
+}
+
+static struct {
+ const char *name;
+ int code;
+} lbp_papersizes[] =
+ {{ "A4", 14 },
+ { "letter", 30 },
+ { "legal", 32 },
+ { "executive", 40 },
+ };
+
+static int set_papersize(const char *paperformat)
+{
+ unsigned int i;
+ // First, test for a standard (i.e. supported directly by the printer)
+ // paper format.
+ for (i = 0 ; i < sizeof(lbp_papersizes) / sizeof(lbp_papersizes[0]); i++)
+ {
+ if (strcasecmp(lbp_papersizes[i].name,paperformat) == 0)
+ return lbp_papersizes[i].code;
+ }
+ // Otherwise, we assume a custom paper format.
+ return 82; // XXX: magic number
+}
+
+static void handle_unknown_desc_command(const char *command, const char *arg,
+ const char *filename, int lineno)
+{
+ // orientation command
+ if (strcasecmp(command, "orientation") == 0) {
+ // We give priority to command-line options
+ if (orientation > 0)
+ return;
+ if (arg == 0)
+ error_with_file_and_line(filename, lineno,
+ "'orientation' command requires an argument");
+ else {
+ if (strcasecmp(arg, "portrait") == 0)
+ orientation = 0;
+ else {
+ if (strcasecmp(arg, "landscape") == 0)
+ orientation = 1;
+ else
+ error_with_file_and_line(filename, lineno,
+ "invalid argument to 'orientation' command");
+ }
+ }
+ }
+}
+
+static struct option long_options[] = {
+ { "orientation", required_argument, NULL, 'o' },
+ { "version", no_argument, NULL, 'v' },
+ { "copies", required_argument, NULL, 'c' },
+ { "landscape", no_argument, NULL, 'l' },
+ { "papersize", required_argument, NULL, 'p' },
+ { "linewidth", required_argument, NULL, 'w' },
+ { "fontdir", required_argument, NULL, 'F' },
+ { "help", no_argument, NULL, 'h' },
+ { NULL, 0, 0, 0 }
+};
+
+static void usage(FILE *stream)
+{
+ fprintf(stream,
+"usage: %s [-l] [-c num-copies] [-F font-directory] [-o orientation]"
+" [-p paper-format] [-w width] [file ...]\n"
+"usage: %s {-v | --version}\n"
+"usage: %s {-h | --help}\n",
+ program_name, program_name, program_name);
+ if (stdout == stream) {
+ fputs(
+"\n"
+"Translate the output of troff(1) into a CaPSL and VDM format suitable"
+"\n"
+"for Canon LBP-4 and LBP-8 printers. See the grolbp(1) manual page.\n",
+ stream);
+ exit(EXIT_SUCCESS);
+ }
+}
+
+int main(int argc, char **argv)
+{
+ if (program_name == NULL)
+ program_name = strsave(argv[0]);
+ font::set_unknown_desc_command_handler(handle_unknown_desc_command);
+ // command line parsing
+ int c;
+ int option_index = 0;
+ while ((c = getopt_long(argc, argv, "c:F:hI:lo:p:vw:", long_options,
+ &option_index))
+ != EOF) {
+ switch (c) {
+ case 'F':
+ font::command_line_font_dir(optarg);
+ break;
+ case 'I':
+ // ignore include path arguments
+ break;
+ case 'p':
+ {
+ const char *s;
+ if (!font::scan_papersize(optarg, &s,
+ &user_paperlength, &user_paperwidth))
+ error("ignoring invalid paper format '%1'", optarg);
+ else
+ user_papersize = set_papersize(s);
+ break;
+ }
+ case 'l':
+ orientation = 1;
+ break;
+ case 'v':
+ printf("GNU grolbp (groff) version %s\n", Version_string);
+ exit(EXIT_SUCCESS);
+ break;
+ case 'o':
+ if (strcasecmp(optarg, "portrait") == 0)
+ orientation = 0;
+ else {
+ if (strcasecmp(optarg, "landscape") == 0)
+ orientation = 1;
+ else
+ error("unknown orientation '%1'", optarg);
+ }
+ break;
+ case 'c':
+ {
+ char *ptr;
+ long n = strtol(optarg, &ptr, 10);
+ if ((n <= 0) && (ptr == optarg))
+ error("argument for -c must be a positive integer");
+ else if (n <= 0 || n > 32767)
+ error("out of range argument for -c");
+ else
+ ncopies = unsigned(n);
+ break;
+ }
+ case 'w':
+ {
+ char *ptr;
+ long n = strtol(optarg, &ptr, 10);
+ if (n == 0 && ptr == optarg)
+ error("argument for -w must be a non-negative integer");
+ else if (n < 0 || n > INT_MAX)
+ error("out of range argument for -w");
+ else
+ linewidth_factor = int(n);
+ break;
+ }
+ case 'h':
+ usage(stdout);
+ break;
+ case '?':
+ usage(stderr);
+ exit(EXIT_FAILURE);
+ break;
+ default:
+ assert(0 == "unhandled getopt_long return value");
+ }
+ }
+ if (optind >= argc)
+ do_file("-");
+ while (optind < argc)
+ do_file(argv[optind++]);
+ if (lbpoutput)
+ lbpputs("\033c\033<");
+ return 0;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/devices/grolbp/lbp.h b/src/devices/grolbp/lbp.h
new file mode 100644
index 0000000..ee1c7b9
--- /dev/null
+++ b/src/devices/grolbp/lbp.h
@@ -0,0 +1,544 @@
+// -*- C -*-
+/* Copyright (C) 1994-2020 Free Software Foundation, Inc.
+ Written by Francisco Andrés Verdú <pandres@dragonet.es>
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* This file contains a set of utility functions to use canon CaPSL printers
+ * (lbp-4 and lbp-8 series printers) */
+
+#ifndef LBP_H
+#define LBP_H
+
+#include <stdio.h>
+#include <stdarg.h>
+
+static FILE *lbpoutput = NULL;
+static FILE *vdmoutput = NULL;
+
+
+static inline void
+lbpinit(FILE *outfile)
+{
+ lbpoutput = outfile;
+}
+
+
+static void
+lbpprintf(const char *format, ... )
+{ /* Taken from cjet */
+ va_list stuff;
+
+ va_start(stuff, format);
+ vfprintf(lbpoutput, format, stuff);
+ va_end(stuff);
+}
+
+
+static inline void
+lbpputs(const char *data)
+{
+ fputs(data,lbpoutput);
+}
+
+
+static inline void
+lbpputc(unsigned char c)
+{
+ fputc(c,lbpoutput);
+}
+
+
+static inline void
+lbpsavestatus(int idx )
+{
+ fprintf(lbpoutput,"\033[%d%%y",idx);
+}
+
+
+static inline void
+lbprestorestatus(int idx )
+{
+ fprintf(lbpoutput,"\033[%d%cz",idx ,'%');
+}
+
+
+static inline void
+lbpsavepos(int idx)
+{
+ fprintf(lbpoutput,"\033[1;%d;0x",idx);
+}
+
+
+static inline void
+lbprestorepos(int idx)
+{
+ fprintf(lbpoutput,"\033[0;%d;0x",idx);
+}
+
+
+static inline void
+lbprestoreposx(int idx)
+{
+ fprintf(lbpoutput,"\033[0;%d;1x",idx);
+}
+
+
+static inline void
+lbpmoverel(int despl, char direction)
+{
+ fprintf(lbpoutput,"\033[%d%c",despl,direction);
+}
+
+
+static inline void
+lbplinerel(int width,int despl,char direction )
+{
+ fprintf(lbpoutput,"\033[%d;0;9{\033[%d%c\033[9}",width,despl,direction);
+}
+
+
+static inline void
+lbpmoveabs(int x, int y)
+{
+ fprintf(lbpoutput,"\033[%d;%df",y,x);
+}
+
+
+static inline void
+lbplineto(int x,int y, int width )
+{
+ fprintf(lbpoutput,"\033[%d;0;9{",width);
+ lbpmoveabs(x,y);
+ fprintf(lbpoutput,"\033[9}\n");
+}
+
+
+static inline void
+lbpruleabs(int x, int y, int hsize, int vsize)
+{
+ lbpmoveabs(x,y);
+ fprintf(lbpoutput,"\033[0;9;000s");
+ lbpmoveabs(x+hsize,y+vsize);
+ fprintf(lbpoutput,"\033[9r");
+}
+
+
+static void vdmprintf(const char *format, ... );
+
+
+static inline char *
+vdmnum(int num,char *result)
+{
+ char b1,b2,b3;
+ char *p = result;
+ int nm;
+
+ nm = abs(num);
+ /* First byte 1024 - 32768 */
+ b1 = ((nm >> 10) & 0x3F);
+ if (b1) *p++ = b1 | 0x40;
+
+ /* Second Byte 16 - 1024 */
+ b2 = ((nm >> 4) & 0x3F);
+ if ( b1 || b2) *p++= b2 | 0x40;
+
+ /* Third byte 0 - 15 */
+ b3 = ((nm & 0x0F) | 32);
+ if (num >= 0) b3 |= 16;
+ *p++ = b3;
+ *p = 0x00; /* End of the resulting string */
+ return result;
+}
+
+
+static inline void
+vdmorigin(int newx, int newy)
+{
+ char nx[4],ny[4];
+
+ vdmprintf("}\"%s%s\x1e",vdmnum(newx,nx),vdmnum(newy,ny));
+}
+
+
+static inline FILE *
+vdminit(FILE *vdmfile)
+{
+ char scale[4],size[4],lineend[4];
+
+/* vdmoutput = tmpfile();*/
+ vdmoutput = vdmfile;
+ /* Initialize the VDM mode */
+ vdmprintf("\033[0&}#GROLBP\x1e!0%s%s\x1e$\x1e}F%s\x1e",\
+ vdmnum(-3,scale),vdmnum(1,size),vdmnum(1,lineend));
+ return vdmoutput;
+
+}
+
+
+static inline void
+vdmend()
+{
+ vdmprintf("}p\x1e");
+}
+
+
+static void
+vdmprintf(const char *format, ... )
+{ /* Taken from cjet */
+ va_list stuff;
+
+ if (vdmoutput == NULL) vdminit(tmpfile());
+ va_start(stuff, format);
+ vfprintf(vdmoutput, format, stuff);
+ va_end(stuff);
+}
+
+
+static inline void
+vdmsetfillmode(int pattern,int perimeter, int inverted)
+{
+ char patt[4],perim[4],
+ rot[4], /* rotation */
+ espejo[4], /* espejo */
+ inv[4]; /* Inverted */
+
+ vdmprintf("I%s%s%s%s%s\x1e",vdmnum(pattern,patt),\
+ vdmnum(perimeter,perim),vdmnum(0,rot),
+ vdmnum(0,espejo),vdmnum(inverted,inv));
+}
+
+
+static inline void
+vdmcircle(int centerx, int centery, int radius)
+{
+ char x[4],y[4],rad[4];
+
+ vdmprintf("5%s%s%s\x1e",vdmnum(centerx,x),vdmnum(centery,y),\
+ vdmnum(radius,rad));
+}
+
+
+static inline void
+vdmaarc(int centerx, int centery, int radius,int startangle,int angle,int style,int arcopen)
+{
+ char x[4],y[4],rad[4],stx[4],sty[4],styl[4],op[4];
+
+ vdmprintf("}6%s%s%s%s%s%s%s\x1e",vdmnum(arcopen,op),\
+ vdmnum(centerx,x),vdmnum(centery,y),\
+ vdmnum(radius,rad),vdmnum(startangle,stx),vdmnum(angle,sty),\
+ vdmnum(style,styl));
+}
+
+
+static inline void
+vdmvarc(int centerx, int centery,int radius, int startx, int starty, int endx, int endy,\
+ int style,int arcopen)
+{
+ char x[4],y[4],rad[4],stx[4],sty[4],enx[4],eny[4],styl[4],op[4];
+
+ vdmprintf("}6%s%s%s%s%s%s%s%s%s\x1e",vdmnum(arcopen,op),\
+ vdmnum(centerx,x),vdmnum(centery,y),\
+ vdmnum(radius,rad),vdmnum(startx,stx),vdmnum(starty,sty),\
+ vdmnum(endx,enx),vdmnum(endy,eny),vdmnum(style,styl));
+}
+
+
+static inline void
+vdmellipse(int centerx, int centery, int radiusx, int radiusy,int rotation)
+{
+ char x[4],y[4],radx[4],rady[4],rotat[4];
+
+ vdmprintf("}7%s%s%s%s%s\x1e\n",vdmnum(centerx,x),vdmnum(centery,y),\
+ vdmnum(radiusx,radx),vdmnum(radiusy,rady),\
+ vdmnum(rotation,rotat));
+}
+
+
+static inline void
+vdmsetlinetype(int lintype)
+{
+ char ltyp[4], expfact[4];
+
+ vdmprintf("E1%s%s\x1e",vdmnum(lintype,ltyp),vdmnum(1,expfact));
+
+}
+
+
+static inline void
+vdmsetlinestyle(int lintype, int pattern,int unionstyle)
+{
+ char patt[4],ltip[4],
+ rot[4], /* rotation */
+ espejo[4], /* espejo */
+ in[4]; /* Inverted */
+
+ vdmprintf("}G%s%s%s%s%s\x1e",vdmnum(lintype,ltip),\
+ vdmnum(pattern,patt),vdmnum(0,rot),
+ vdmnum(0,espejo),vdmnum(0,in));
+ vdmprintf("}F%s",vdmnum(unionstyle,rot));
+}
+
+
+static inline void
+vdmlinewidth(int width)
+{
+ char wh[4];
+
+ vdmprintf("F1%s\x1e",vdmnum(width,wh));
+}
+
+
+static inline void
+vdmrectangle(int origx, int origy,int dstx, int dsty)
+{
+ char xcoord[4],ycoord[4],sdstx[4],sdsty[4];
+
+ vdmprintf("}:%s%s%s%s\x1e\n",vdmnum(origx,xcoord),vdmnum(dstx,sdstx),\
+ vdmnum(origy,ycoord),vdmnum(dsty,sdsty));
+}
+
+
+static inline void
+vdmpolyline(int numpoints, int *points)
+{
+ int i,*p = points;
+ char xcoord[4],ycoord[4];
+
+ if (numpoints < 2) return;
+ vdmprintf("1%s%s",vdmnum(*p,xcoord),vdmnum(*(p+1),ycoord));
+ p += 2;
+ for (i = 1; i < numpoints ; i++) {
+ vdmprintf("%s%s",vdmnum(*p,xcoord),vdmnum(*(p+1),ycoord));
+ p += 2;
+ } /* for */
+ vdmprintf("\x1e\n");
+}
+
+
+static inline void
+vdmpolygon(int numpoints, int *points)
+{
+ int i,*p = points;
+ char xcoord[4],ycoord[4];
+
+ if (numpoints < 2) return;
+ vdmprintf("2%s%s",vdmnum(*p,xcoord),vdmnum(*(p+1),ycoord));
+ p += 2;
+ for (i = 1; i < numpoints ; i++) {
+ vdmprintf("%s%s",vdmnum(*p,xcoord),vdmnum(*(p+1),ycoord));
+ p += 2;
+ } /* for */
+ vdmprintf("\x1e\n");
+
+}
+
+
+/************************************************************************
+ * Higher level auxiliary functions *
+ ************************************************************************/
+static inline int
+vdminited()
+{
+ return (vdmoutput != NULL);
+}
+
+
+static inline void
+vdmline(int startx, int starty, int sizex, int sizey)
+{
+ int points[4];
+
+ points[0] = startx;
+ points[1] = starty;
+ points[2] = sizex;
+ points[3] = sizey;
+
+ vdmpolyline(2,points);
+
+}
+
+
+/*#define THRESHOLD .05 */ /* inch */
+#define THRESHOLD 1 /* points (1/300 inch) */
+static inline void
+splinerel(double px,double py,int flush)
+{
+ static int lx = 0 ,ly = 0;
+ static double pend = 0.0;
+ static int dy = 0, despx = 0, despy = 0, sigpend = 0;
+ int dxnew = 0, dynew = 0, sg;
+ char xcoord[4],ycoord[4];
+ double npend ;
+
+ if (flush == -1) {lx = (int)px; ly = (int)py; return;}
+
+ if (flush == 0) {
+ dxnew = (int)px -lx;
+ dynew = (int)py -ly;
+ if ((dxnew == 0) && (dynew == 0)) return;
+ sg = (dxnew < 0)? -1 : 0;
+/* fprintf(stderr,"s (%d,%d) (%d,%d)\n",dxnew,dynew,despx,despy);*/
+ if (dynew == 0) {
+ despx = dxnew;
+ if ((sg == sigpend) && (dy == 0)){
+ return;
+ }
+ dy = 0;
+ }
+ else {
+ dy = 1;
+ npend = (1.0*dxnew)/dynew;
+ if (( npend == pend) && (sigpend == sg))
+ { despy = dynew; despx = dxnew; return; }
+ else
+ { sigpend = sg;
+ pend = npend;
+ } /* else (( npend == pend) && ... */
+ } /* else (if (dynew == 0)) */
+ } /* if (!flush ) */
+
+ /* if we've changed direction we must draw the line */
+/* fprintf(stderr," (%d) %.2f,%.2f\n",flush,(float)px,(float)py);*/
+ if ((despx != 0) || (despy != 0)) vdmprintf("%s%s",vdmnum(despx,xcoord),\
+ vdmnum(despy,ycoord));
+ /*if ((despx != 0) || (despy != 0)) fprintf(stderr,"2
+ *%d,%d\n",despx,despy);*/
+ if (flush) {
+ dxnew = dy = despx = despy = 0;
+ return;
+ } /* if (flush) */
+ dxnew -= despx;
+ dynew -= despy;
+ if ((dxnew != 0) || (dynew != 0)) vdmprintf("%s%s",vdmnum(dxnew,xcoord),\
+ vdmnum(dynew,ycoord));
+
+/* if ((dxnew != 0) || (dynew != 0)) fprintf(stderr,"3
+ * %d,%d\n",dxnew,dynew);*/
+ lx = (int)px; ly = (int)py;
+ dxnew = dy = despx = despy = 0;
+
+}
+
+
+/**********************************************************************
+ * The following code to draw splines is adapted from the transfig package
+ */
+static void
+quadratic_spline(double a_1, double b_1, double a_2, double b_2, \
+ double a_3, double b_3, double a_4, double b_4)
+{
+ double x_1, y_1, x_4, y_4;
+ double x_mid, y_mid;
+
+ x_1 = a_1; y_1 = b_1;
+ x_4 = a_4; y_4 = b_4;
+ x_mid = (a_2 + a_3)/2.0;
+ y_mid = (b_2 + b_3)/2.0;
+ if ((fabs(x_1 - x_mid) < THRESHOLD)
+ && (fabs(y_1 - y_mid) < THRESHOLD)) {
+ splinerel(x_mid, y_mid, 0);
+/* fprintf(tfp, "PA%.4f,%.4f;\n", x_mid, y_mid);*/
+ }
+ else {
+ quadratic_spline(x_1, y_1, ((x_1+a_2)/2.0), ((y_1+b_2)/2.0),
+ ((3.0*a_2+a_3)/4.0), ((3.0*b_2+b_3)/4.0), x_mid, y_mid);
+ }
+
+ if ((fabs(x_mid - x_4) < THRESHOLD)
+ && (fabs(y_mid - y_4) < THRESHOLD)) {
+ splinerel(x_4, y_4, 0);
+/* fprintf(tfp, "PA%.4f,%.4f;\n", x_4, y_4);*/
+ }
+ else {
+ quadratic_spline(x_mid, y_mid,
+ ((a_2+3.0*a_3)/4.0), ((b_2+3.0*b_3)/4.0),
+ ((a_3+x_4)/2.0), ((b_3+y_4)/2.0), x_4, y_4);
+ }
+}
+
+
+#define XCOORD(i) numbers[(2*i)]
+#define YCOORD(i) numbers[(2*i)+1]
+static void
+vdmspline(int numpoints, int o_x, int o_y, int *numbers)
+{
+ double cx_1, cy_1, cx_2, cy_2, cx_3, cy_3, cx_4, cy_4;
+ double x_1, y_1, x_2, y_2;
+ char xcoord[4],ycoord[4];
+ int i;
+
+ /*p = s->points;
+ x_1 = p->x/ppi;*/
+ x_1 = o_x;
+ y_1 = o_y;
+/* p = p->next;
+ x_2 = p->x/ppi;
+ y_2 = p->y/ppi;*/
+ x_2 = o_x + XCOORD(0);
+ y_2 = o_y + YCOORD(0);
+ cx_1 = (x_1 + x_2)/2.0;
+ cy_1 = (y_1 + y_2)/2.0;
+ cx_2 = (x_1 + 3.0*x_2)/4.0;
+ cy_2 = (y_1 + 3.0*y_2)/4.0;
+
+/* fprintf(stderr,"Spline %d (%d,%d)\n",numpoints,(int)x_1,(int)y_1);*/
+ vdmprintf("1%s%s",vdmnum((int)x_1,xcoord),vdmnum((int)y_1,ycoord));
+ splinerel(x_1,y_1,-1);
+ splinerel(cx_1,cy_1,0);
+/* fprintf(tfp, "PA%.4f,%.4f;PD%.4f,%.4f;\n",
+ x_1, y_1, cx_1, cy_1);*/
+
+ /*for (p = p->next; p != NULL; p = p->next) {*/
+ for (i = 1; i < (numpoints); i++) {
+ x_1 = x_2;
+ y_1 = y_2;
+/* x_2 = p->x/ppi;
+ y_2 = p->y/ppi;*/
+ x_2 = x_1 + XCOORD(i);
+ y_2 = y_1 + YCOORD(i);
+ cx_3 = (3.0*x_1 + x_2)/4.0;
+ cy_3 = (3.0*y_1 + y_2)/4.0;
+ cx_4 = (x_1 + x_2)/2.0;
+ cy_4 = (y_1 + y_2)/2.0;
+ /* fprintf(stderr,"Point (%d,%d) - (%d,%d)\n",(int)x_1,(int)(y_1),(int)x_2,(int)y_2);*/
+ quadratic_spline(cx_1, cy_1, cx_2, cy_2, cx_3, cy_3, cx_4, cy_4);
+ cx_1 = cx_4;
+ cy_1 = cy_4;
+ cx_2 = (x_1 + 3.0*x_2)/4.0;
+ cy_2 = (y_1 + 3.0*y_2)/4.0;
+ }
+ x_1 = x_2;
+ y_1 = y_2;
+/* p = s->points->next;
+ x_2 = p->x/ppi;
+ y_2 = p->y/ppi;*/
+ x_2 = o_x + XCOORD(0);
+ y_2 = o_y + YCOORD(0);
+ cx_3 = (3.0*x_1 + x_2)/4.0;
+ cy_3 = (3.0*y_1 + y_2)/4.0;
+ cx_4 = (x_1 + x_2)/2.0;
+ cy_4 = (y_1 + y_2)/2.0;
+ splinerel(x_1, y_1, 0);
+ splinerel(x_1, y_1, 1);
+ /*vdmprintf("%s%s",vdmnum((int)(x_1-lx),xcoord),\
+ vdmnum((int)(y_1-ly),ycoord));*/
+ vdmprintf("\x1e\n");
+/* fprintf(tfp, "PA%.4f,%.4f;PU;\n", x_1, y_1);*/
+
+
+}
+
+
+#endif
diff --git a/src/devices/grolj4/grolj4.1.man b/src/devices/grolj4/grolj4.1.man
new file mode 100644
index 0000000..6227779
--- /dev/null
+++ b/src/devices/grolj4/grolj4.1.man
@@ -0,0 +1,896 @@
+.TH grolj4 @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+grolj4 \-
+.I groff
+output driver for HP LaserJet 4 and compatible printers
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1994-2020, 2022 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_grolj4_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.\" This macro definition is poor style from a portability standpoint,
+.\" but it's a good test and demonstration of the standard font
+.\" repertoire for the devices where it has any effect at all, and so
+.\" should be retained.
+.de FT
+. if '\\*(.T'lj4' .ft \\$1
+..
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY grolj4
+.RB [ \-l ]
+.RB [ \-c\~\c
+.IR num-copies ]
+.RB [ \-d
+.RI [ n ]]
+.RB [ \-F\~\c
+.IR font-directory ]
+.RB [ \-p\~\c
+.IR paper-format ]
+.RB [ \-w\~\c
+.IR line-width ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY grolj4
+.B \-\-help
+.YS
+.
+.
+.SY grolj4
+.B \-v
+.
+.SY grolj4
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+This GNU
+.I roff
+output driver translates the output of
+.MR @g@troff @MAN1EXT@
+into a PCL5 format suitable for an HP LaserJet 4 printer.
+.
+Normally,
+.I grolj4
+is invoked by
+.MR groff @MAN1EXT@
+when the latter is given the
+.RB \[lq] \-T\~lj4 \[rq]
+option.
+.
+(In this installation,
+.B @DEVICE@
+is the default output device.)
+.
+Use
+.IR groff 's
+.B \-P
+option to pass any options shown above to
+.IR grolj4 .
+.
+If no
+.I file
+arguments are given,
+or if
+.I file
+is \[lq]\-\[rq],
+.I grolj4
+reads the standard input stream.
+.
+Output is written to the standard output stream.
+.
+.
+.\" ====================================================================
+.SS Typefaces
+.\" ====================================================================
+.
+.I grolj4
+supports the standard four styles:
+.B R
+(roman),
+.B I
+.RI ( italic ),
+.B B
+.RB ( bold ),
+and
+.B BI
+(\f[BI]bold-italic\f[]).
+.
+Fonts are grouped into families
+.BR A ,
+.BR C ,
+.BR G ,
+.BR O ,
+.BR T ,
+.BR TN ,
+.BR U ,
+and
+.B UC
+having members in each style.
+.
+.
+.RS
+.TP 14n
+.B AB
+.FT AB
+Arial Bold
+.FT
+.
+.TQ
+.B ABI
+.FT ABI
+Arial Bold Italic
+.FT
+.
+.TQ
+.B AI
+.FT AI
+Arial Italic
+.FT
+.
+.TQ
+.B AR
+.FT AR
+Arial Roman
+.FT
+.
+.TQ
+.B CB
+.FT CB
+Courier Bold
+.FT
+.
+.TQ
+.B CBI
+.FT CBI
+Courier Bold Italic
+.FT
+.
+.TQ
+.B CI
+.FT CI
+Courier Italic
+.FT
+.
+.TQ
+.B CR
+.FT CR
+Courier Roman
+.FT
+.
+.TQ
+.B GB
+.FT GB
+Garamond Halbfett
+.FT
+.
+.TQ
+.B GBI
+.FT GBI
+Garamond Kursiv Halbfett
+.FT
+.
+.TQ
+.B GI
+.FT GI
+Garamond Kursiv
+.FT
+.
+.TQ
+.B GR
+.FT GR
+Garamond Antiqua
+.FT
+.
+.TQ
+.B OB
+.FT OB
+CG Omega Bold
+.FT
+.
+.TQ
+.B OBI
+.FT OBI
+CG Omega Bold Italic
+.FT
+.
+.TQ
+.B OI
+.FT OI
+CG Omega Italic
+.FT
+.
+.TQ
+.B OR
+.FT OR
+CG Omega Roman
+.
+.TQ
+.B OB
+.FT OB
+CG Omega Bold
+.FT
+.
+.TQ
+.B OBI
+.FT OBI
+CG Omega Bold Italic
+.FT
+.
+.TQ
+.B OI
+.FT OI
+CG Omega Italic
+.FT
+.
+.TQ
+.B OR
+.FT OR
+CG Omega Roman
+.FT
+.
+.TQ
+.B TB
+.FT TB
+CG Times Bold
+.FT
+.
+.TQ
+.B TBI
+.FT TBI
+CG Times Bold Italic
+.FT
+.
+.TQ
+.B TI
+.FT TI
+CG Times Italic
+.FT
+.
+.TQ
+.B TR
+.FT TR
+CG Times Roman
+.FT
+.
+.TQ
+.B TNRB
+.FT TNRB
+M Times Bold
+.FT
+.
+.TQ
+.B TNRBI
+.FT TNRBI
+M Times Bold Italic
+.FT
+.
+.TQ
+.B TNRI
+.FT TNRI
+M Times Italic
+.FT
+.
+.TQ
+.B TNRR
+.FT TNRR
+M Times Roman
+.FT
+.
+.TQ
+.B UB
+.FT UB
+Univers Bold
+.FT
+.
+.TQ
+.B UBI
+.FT UBI
+Univers Bold Italic
+.FT
+.
+.TQ
+.B UI
+.FT UI
+Univers Medium Italic
+.FT
+.
+.TQ
+.B UR
+.FT UR
+Univers Medium
+.FT
+.
+.TQ
+.B UCB
+.FT UCB
+Univers Condensed Bold
+.FT
+.
+.TQ
+.B UCBI
+.FT UCBI
+Univers Condensed Bold Italic
+.FT
+.
+.TQ
+.B UCI
+.FT UCI
+Univers Condensed Medium Italic
+.FT
+.
+.TQ
+.B UCR
+.FT UCR
+Univers Condensed Medium
+.FT
+.RE
+.
+.
+.P
+The following fonts are not members of a family.
+.
+.
+.RS
+.TP 14n
+.B ALBB
+.FT ALBB
+Albertus Extra Bold
+.FT
+.
+.TQ
+.B ALBR
+.FT ALBR
+Albertus Medium
+.FT
+.
+.TQ
+.B AOB
+.FT AOB
+Antique Olive Bold
+.
+.TQ
+.B AOI
+.FT AOI
+Antique Olive Italic
+.
+.TQ
+.B AOR
+.FT AOR
+Antique Olive Roman
+.
+.TQ
+.B CLARENDON
+.FT CLARENDON
+Clarendon
+.
+.TQ
+.B CORONET
+.FT CORONET
+Coronet
+.
+.TQ
+.B LGB
+.FT LGB
+Letter Gothic Bold
+.
+.TQ
+.B LGI
+.FT LGI
+Letter Gothic Italic
+.
+.TQ
+.B LGR
+.FT LGR
+Letter Gothic Roman
+.
+.TQ
+.B MARIGOLD
+.FT MARIGOLD
+Marigold
+.RE
+.
+.
+.P
+The special font is
+.B S
+(PostScript Symbol);
+.B SYMBOL
+(M Symbol),
+and
+.B WINGDINGS
+(Wingdings)
+are also available but not mounted by default.
+.
+.
+.\" ====================================================================
+.SS "Paper format and device description file"
+.\" ====================================================================
+.
+.I grolj4
+supports paper formats
+.RB \[lq] A4 \[rq],
+.RB \[lq] B5 \[rq],
+.RB \[lq] C5 \[rq],
+.RB \[lq] com10 \[rq],
+.RB \[lq] DL \[rq],
+.RB \%\[lq] executive \[rq],
+.RB \%\[lq] legal \[rq],
+.RB \%\[lq] letter \[rq],
+and
+.RB \[lq] monarch \[rq].
+.
+These are matched case-insensitively.
+.
+The
+.B \-p
+option overrides any setting in the device description file
+.IR DESC .
+.
+If neither specifies a paper format,
+\[lq]letter\[rq] is assumed.
+.
+.
+.\" ====================================================================
+.SS "Font description files"
+.\" ====================================================================
+.
+.I grolj4
+recognizes four font description file directives in addition to those
+documented in
+.MR groff_font @MAN5EXT@ .
+.
+.
+.TP
+.BI pclweight\~ n
+Set the stroke weight to
+.IR n ,
+an integer in the range \-7 to +7;
+the default is\~0.
+.
+.
+.TP
+.BI pclstyle\~ n
+Set the style to
+.IR n ,
+an integer in the range 0 to 32767;
+the default is\~0.
+.
+.
+.TP
+.BI pclproportional\~ n
+Set the proportional spacing Boolean flag to
+.IR n ,
+which can be either 0 or\~1;
+the default is\~0.
+.
+.
+.TP
+.BI pcltypeface\~ n
+Set the typeface family to
+.IR n ,
+an integer in the range 0 to 65535;
+the default is\~0.
+.
+.
+.\" ====================================================================
+.SS "Drawing commands"
+.\" ====================================================================
+.
+An additional drawing command is recognized as an extension to those
+documented in
+.MR groff @MAN7EXT@ .
+.
+.
+.TP
+.BI \[rs]D\[aq]R\~ "dh dv" \[aq]
+Draw a rule
+(solid black rectangle)
+with one corner at the drawing position,
+and the diagonally opposite corner at the drawing position
+.RI +( dh , dv ),
+at which the drawing position will be afterward.
+.
+This generates a PCL fill rectangle command,
+and so will work on printers that do not support HP-GL/2,
+unlike the other
+.B \[rs]D
+commands.
+.
+.
+.\" ====================================================================
+.SS Fonts
+.\" ====================================================================
+.
+Nominally,
+all Hewlett-Packard LaserJet\~\%4-series and newer printers have the
+same internal fonts:
+45 scalable fonts and one bitmapped Lineprinter font.
+.
+The scalable fonts are available in sizes between 0.25 points and 999.75
+points,
+in 0.25-point increments;
+the Lineprinter font is available only in 8.5-point size.
+.
+.
+.P
+The LaserJet font files included with
+.I groff
+assume that all printers since the LaserJet\~4 are identical.
+.
+There are some differences between fonts in the earlier and more recent
+printers,
+however.
+.
+The LaserJet\~4 printer used Agfa Intellifont technology for 35 of the
+internal scalable fonts;
+the remaining 10 scalable fonts were TrueType.
+.
+Beginning with the LaserJet\~\%4000-series printers introduced in 1997,
+all scalable internal fonts have been TrueType.
+.
+The number of printable glyphs differs slightly between Intellifont and
+TrueType fonts
+(generally,
+the TrueType fonts include more glyphs),
+and
+there are some minor differences in glyph metrics.
+.
+Differences among printer models are described in the
+.I "PCL\~5 Comparison Guide"
+and the
+.I "PCL\~5 Comparison Guide Addendum"
+(for printers introduced since approximately 2001).
+.
+.
+.P
+LaserJet printers reference a glyph by a combination of a 256-glyph
+symbol set and an index within that symbol set.
+.
+Many glyphs appear in more than one symbol set;
+all combinations of symbol set and index that reference the same glyph
+are equivalent.
+.
+For each glyph,
+.MR hpftodit @MAN1EXT@
+searches a list of symbol sets,
+and selects the first set that contains the glyph.
+.
+The printing code generated by
+.I hpftodit
+is an integer that encodes a numerical value for the symbol set in the
+high byte(s),
+and the index in the low byte.
+.
+See
+.MR groff_font @MAN5EXT@
+for a complete description of the font file format;
+symbol sets are described in greater detail in the
+.IR "PCL\~5 Printer Language Technical Reference Manual" .
+.
+.
+.P
+Two of the scalable fonts,
+Symbol and Wingdings,
+are bound to 256-glyph symbol sets;
+the remaining scalable fonts,
+as well as the Lineprinter font,
+support numerous symbol sets,
+sufficient to enable printing of more than 600 glyphs.
+.
+.
+.P
+The metrics generated by
+.I hpftodit
+assume that the
+.I DESC
+file contains values of 1200 for
+.I res
+and 6350 for
+.IR unitwidth ,
+or any combination
+(e.g.,
+2400 and 3175)
+for which
+.IR res \~\[tmu]\~ unitwidth \~=\~7\|620\|000.
+.
+Although HP PCL\~5 LaserJet printers support an internal resolution of
+7200 units per inch,
+they use a 16-bit signed integer for positioning;
+if
+.B devlj4
+is to support U.S.\& ledger paper (11\~in\~\[mu]\~17\~in;
+in = inch),
+the maximum usable resolution is 32\|767\~\[di]\~17,
+or 1927 units per inch,
+which rounds down to 1200 units per inch.
+.
+If the largest required paper dimension is less
+(e.g.,
+8.5\~in\~\[mu]\~11\~in,
+or A5),
+a greater
+.I res
+(and lesser
+.IR unitwidth )
+can be specified.
+.
+.
+.P
+Font metrics for Intellifont fonts were provided by Tagged Font Metric
+(TFM) files originally developed by Agfa/Compugraphic.
+.
+The TFM files provided for these fonts supported 600+ glyphs and
+contained extensive lists of kerning pairs.
+.
+.
+.P
+To accommodate developers who had become accustomed to TFM files,
+HP also provided TFM files for the 10 TrueType fonts included in the
+LaserJet\~4.
+.
+The TFM files for TrueType fonts generally included less information
+than the Intellifont TFMs,
+supporting fewer glyphs,
+and in most cases,
+providing no kerning information.
+.
+By the time the LaserJet\~4000 printer was introduced,
+most developers had migrated to other means of obtaining font metrics,
+and support for new TFM files was very limited.
+.
+The TFM files provided for the TrueType fonts in the LaserJet\~4000
+support only the Latin 2 (ISO 8859-2) symbol set,
+and include no kerning information;
+consequently,
+they are of little value for any but the most rudimentary documents.
+.
+.
+.P
+Because the Intellifont TFM files contain considerably more information,
+they generally are preferable to the TrueType TFM files even for use
+with the TrueType fonts in the newer printers.
+.
+The metrics for the TrueType fonts are very close,
+though not identical,
+to those for the earlier Intellifont fonts of the same names.
+.
+Although most output using the Intellifont metrics with the newer
+printers is quite acceptable,
+a few glyphs may fail to print as expected.
+.
+The differences in glyph metrics may be particularly noticeable with
+composite parentheses,
+brackets,
+and braces used by
+.MR eqn @MAN1EXT@ .
+.
+A script,
+located in
+.IR @FONTDIR@/\:\%devlj4/\:generate ,
+can be used to adjust the metrics for these glyphs in the special font
+\[lq]S\[rq] for use with printers that have all TrueType fonts.
+.
+.
+.P
+At the time HP last supported TFM files,
+only version 1.0 of the Unicode standard was available.
+.
+Consequently,
+many glyphs lacking assigned code points were assigned by HP to the
+Private Use Area (PUA).
+.
+Later versions of the Unicode standard included code points outside the
+PUA for many of these glyphs.
+.
+The HP-supplied TrueType TFM files use the PUA assignments;
+TFM files generated from more recent TrueType font files require the
+later Unicode values to access the same glyphs.
+.
+Consequently,
+two different mapping files may be required:
+one for the HP-supplied TFM files,
+and one for more recent TFM files.
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.BI \-c\~ num-copies
+Format
+.I num-copies
+copies of each page.
+.
+.
+.TP
+.BR \-d \~[\c
+.IR n ]
+Use duplex mode
+.IR n :
+1\~is long-side binding (default),
+and 2\~is short-side binding.
+.
+.
+.TP
+.BI \-F " font-directory"
+Prepend directory
+.IR font-directory /dev name
+to the search path for font and device description files;
+.I name
+is the name of the device,
+usually
+.BR lj4 .
+.
+.
+.TP
+.B \-l
+Format the document in landscape orientation.
+.
+.
+.TP
+.BI \-p " paper-format"
+Set the paper format to
+.IR paper-format ,
+which must be a valid paper format as described above.
+.
+.
+.TP
+.BI \-w " line-width"
+Set the default line thickness to
+.I line-width
+thousandths of an em;
+the default is
+.B 40
+(0.04\~em).
+.
+.
+.br
+.ne 4v \" Keep section heading and paragraph together.
+.\" ====================================================================
+.SH Environment
+.\" ====================================================================
+.
+.TP
+.I GROFF_FONT_PATH
+lists directories in which to seek the selected output device's
+directory of device and font description files.
+.
+See
+.MR @g@troff @MAN1EXT@
+and
+.MR groff_font @MAN5EXT@ .
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @FONTDIR@/\:\%devlj4/\:DESC
+describes the
+.B lj4
+output device.
+.
+.
+.TP
+.IR @FONTDIR@/\:\%devlj4/ F
+describes the font known
+.RI as\~ F
+on device
+.BR lj4 .
+.
+.
+.TP
+.I @MACRODIR@/\:lj4\:.tmac
+defines macros for use with the
+.B lj4
+output device.
+.
+It is automatically loaded by
+.I troffrc
+when the
+.B lj4
+output device is selected.
+.
+.
+.\" ====================================================================
+.SH Bugs
+.\" ====================================================================
+.
+.\" XXX: What does this mean? The period/full stop glyph? Flyspecks?
+Small dots.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.UR http://\:www\:.hp\:.com/\:ctg/\:Manual/\:bpl13210\:.pdf
+.I HP PCL/PJL Reference:
+.I PCL\~5 Printer Language Technical Reference Manual,
+.I Part I
+.UE
+.
+.
+.P
+.MR hpftodit @MAN1EXT@ ,
+.MR groff @MAN1EXT@ ,
+.MR @g@troff @MAN1EXT@ ,
+.MR groff_out @MAN5EXT@ ,
+.MR groff_font @MAN5EXT@ ,
+.MR groff_char @MAN7EXT@
+.
+.
+.\" Clean up.
+.rm FT
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_grolj4_1_man_C]
+.do rr *groff_grolj4_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/devices/grolj4/grolj4.am b/src/devices/grolj4/grolj4.am
new file mode 100644
index 0000000..37138b2
--- /dev/null
+++ b/src/devices/grolj4/grolj4.am
@@ -0,0 +1,32 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+bin_PROGRAMS += grolj4
+grolj4_SOURCES = src/devices/grolj4/lj4.cpp
+grolj4_LDADD = $(LIBM) \
+ libdriver.a \
+ libgroff.a \
+ lib/libgnu.a
+man1_MANS += src/devices/grolj4/grolj4.1
+EXTRA_DIST += \
+ src/devices/grolj4/grolj4.1.man
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/devices/grolj4/lj4.cpp b/src/devices/grolj4/lj4.cpp
new file mode 100644
index 0000000..a429a7d
--- /dev/null
+++ b/src/devices/grolj4/lj4.cpp
@@ -0,0 +1,715 @@
+/* Copyright (C) 1994-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/*
+TODO
+
+option to use beziers for circle/ellipse/arc
+option to use lines for spline (for LJ3)
+left/top offset registration
+output bin selection option
+paper source option
+output non-integer parameters using fixed point numbers
+X command to insert contents of file
+X command to specify inline escape sequence (how to specify unprintable chars?)
+X command to include bitmap graphics
+*/
+
+#include <assert.h>
+
+#include "driver.h"
+#include "nonposix.h"
+
+extern "C" const char *Version_string;
+
+static struct {
+ const char *name;
+ int code;
+ // at 300dpi
+ int x_offset_portrait;
+ int x_offset_landscape;
+} paper_table[] = {
+ { "letter", 2, 75, 60 },
+ { "legal", 3, 75, 60 },
+ { "executive", 1, 75, 60 },
+ { "a4", 26, 71, 59 },
+ { "com10", 81, 75, 60 },
+ { "monarch", 80, 75, 60 },
+ { "c5", 91, 71, 59 },
+ { "b5", 100, 71, 59 },
+ { "dl", 90, 71, 59 },
+};
+
+static int user_paper_size = -1;
+static int landscape_flag = 0;
+static int duplex_flag = 0;
+
+// An upper limit on the paper dimensions in centipoints,
+// used for setting HPGL picture frame.
+#define MAX_PAPER_WIDTH (12*720)
+#define MAX_PAPER_HEIGHT (17*720)
+
+// Dotted lines that are thinner than this don't work right.
+#define MIN_DOT_PEN_WIDTH .351
+
+#ifndef DEFAULT_LINE_WIDTH_FACTOR
+// in ems/1000
+#define DEFAULT_LINE_WIDTH_FACTOR 40
+#endif
+
+const int DEFAULT_HPGL_UNITS = 1016;
+int line_width_factor = DEFAULT_LINE_WIDTH_FACTOR;
+unsigned ncopies = 0; // 0 means don't send ncopies command
+
+static int lookup_paper_size(const char *);
+
+class lj4_font : public font {
+public:
+ ~lj4_font();
+ void handle_unknown_font_command(const char *command, const char *arg,
+ const char *filename, int lineno);
+ static lj4_font *load_lj4_font(const char *);
+ int weight;
+ int style;
+ int proportional;
+ int typeface;
+private:
+ lj4_font(const char *);
+};
+
+lj4_font::lj4_font(const char *nm)
+: font(nm), weight(0), style(0), proportional(0), typeface(0)
+{
+}
+
+lj4_font::~lj4_font()
+{
+}
+
+lj4_font *lj4_font::load_lj4_font(const char *s)
+{
+ lj4_font *f = new lj4_font(s);
+ if (!f->load()) {
+ delete f;
+ return 0;
+ }
+ return f;
+}
+
+static struct {
+ const char *s;
+ int lj4_font::*ptr;
+ int min;
+ int max;
+} command_table[] = {
+ { "pclweight", &lj4_font::weight, -7, 7 },
+ { "pclstyle", &lj4_font::style, 0, 32767 },
+ { "pclproportional", &lj4_font::proportional, 0, 1 },
+ { "pcltypeface", &lj4_font::typeface, 0, 65535 },
+};
+
+void lj4_font::handle_unknown_font_command(const char *command,
+ const char *arg,
+ const char *filename, int lineno)
+{
+ for (unsigned int i = 0;
+ i < sizeof(command_table)/sizeof(command_table[0]); i++) {
+ if (strcmp(command, command_table[i].s) == 0) {
+ if (arg == 0)
+ fatal_with_file_and_line(filename, lineno,
+ "'%1' command requires an argument",
+ command);
+ char *ptr;
+ long n = strtol(arg, &ptr, 10);
+ if (n == 0 && ptr == arg)
+ fatal_with_file_and_line(filename, lineno,
+ "'%1' command requires numeric argument",
+ command);
+ if (n < command_table[i].min) {
+ error_with_file_and_line(filename, lineno,
+ "argument for '%1' command must not be less than %2",
+ command, command_table[i].min);
+ n = command_table[i].min;
+ }
+ else if (n > command_table[i].max) {
+ error_with_file_and_line(filename, lineno,
+ "argument for '%1' command must not be greater than %2",
+ command, command_table[i].max);
+ n = command_table[i].max;
+ }
+ this->*command_table[i].ptr = int(n);
+ break;
+ }
+ }
+}
+
+class lj4_printer : public printer {
+public:
+ lj4_printer(int);
+ ~lj4_printer();
+ void set_char(glyph *, font *, const environment *, int, const char *name);
+ void draw(int code, int *p, int np, const environment *env);
+ void begin_page(int);
+ void end_page(int page_length);
+ font *make_font(const char *);
+ void end_of_line();
+private:
+ void set_line_thickness(int size, int dot = 0);
+ void hpgl_init();
+ void hpgl_start();
+ void hpgl_end();
+ int moveto(int hpos, int vpos);
+ int moveto1(int hpos, int vpos);
+
+ int cur_hpos;
+ int cur_vpos;
+ lj4_font *cur_font;
+ int cur_size;
+ unsigned short cur_symbol_set;
+ int x_offset;
+ int line_thickness;
+ double pen_width;
+ double hpgl_scale;
+ int hpgl_inited;
+ int paper_size;
+};
+
+inline
+int lj4_printer::moveto(int hpos, int vpos)
+{
+ if (cur_hpos != hpos || cur_vpos != vpos || cur_hpos < 0)
+ return moveto1(hpos, vpos);
+ else
+ return 1;
+}
+
+inline
+void lj4_printer::hpgl_start()
+{
+ fputs("\033%1B", stdout);
+}
+
+inline
+void lj4_printer::hpgl_end()
+{
+ fputs(";\033%0A", stdout);
+}
+
+lj4_printer::lj4_printer(int ps)
+: cur_hpos(-1),
+ cur_font(0),
+ cur_size(0),
+ cur_symbol_set(0),
+ line_thickness(-1),
+ pen_width(-1.0),
+ hpgl_inited(0)
+{
+ if (7200 % font::res != 0)
+ fatal("invalid resolution %1: resolution must be a factor of 7200",
+ font::res);
+ fputs("\033E", stdout); // reset
+ if (font::res != 300)
+ printf("\033&u%dD", font::res); // unit of measure
+ if (ncopies > 0)
+ printf("\033&l%uX", ncopies);
+ paper_size = 0; // default to letter
+ if (font::papersize) {
+ int n = lookup_paper_size(font::papersize);
+ if (n < 0)
+ error("ignoring invalid paper format '%1'", font::papersize);
+ else
+ paper_size = n;
+ }
+ if (ps >= 0)
+ paper_size = ps;
+ printf("\033&l%dA" // paper format
+ "\033&l%dO" // orientation
+ "\033&l0E", // no top margin
+ paper_table[paper_size].code,
+ landscape_flag != 0);
+ if (landscape_flag)
+ x_offset = paper_table[paper_size].x_offset_landscape;
+ else
+ x_offset = paper_table[paper_size].x_offset_portrait;
+ x_offset = (x_offset * font::res) / 300;
+ if (duplex_flag)
+ printf("\033&l%dS", duplex_flag);
+}
+
+lj4_printer::~lj4_printer()
+{
+ fputs("\033E", stdout);
+}
+
+void lj4_printer::begin_page(int)
+{
+}
+
+void lj4_printer::end_page(int)
+{
+ putchar('\f');
+ cur_hpos = -1;
+}
+
+void lj4_printer::end_of_line()
+{
+ cur_hpos = -1; // force absolute motion
+}
+
+inline
+int is_unprintable(unsigned char c)
+{
+ return c < 32 && (c == 0 || (7 <= c && c <= 15) || c == 27);
+}
+
+void lj4_printer::set_char(glyph *g, font *f, const environment *env,
+ int w, const char *)
+{
+ int code = f->get_code(g);
+
+ unsigned char ch = code & 0xff;
+ unsigned short symbol_set = code >> 8;
+ if (symbol_set != cur_symbol_set) {
+ printf("\033(%d%c", symbol_set/32, (symbol_set & 31) + 64);
+ cur_symbol_set = symbol_set;
+ }
+ if (f != cur_font) {
+ lj4_font *psf = (lj4_font *)f;
+ // FIXME only output those that are needed
+ printf("\033(s%dp%ds%db%dT",
+ psf->proportional,
+ psf->style,
+ psf->weight,
+ psf->typeface);
+ if (!psf->proportional || !cur_font || !cur_font->proportional)
+ cur_size = 0;
+ cur_font = psf;
+ }
+ if (env->size != cur_size) {
+ if (cur_font->proportional) {
+ static const char *quarters[] = { "", ".25", ".5", ".75" };
+ printf("\033(s%d%sV", env->size/4, quarters[env->size & 3]);
+ }
+ else {
+ double pitch = double(font::res)/w;
+ // PCL uses the next largest pitch, so round it down.
+ pitch = floor(pitch*100.0)/100.0;
+ printf("\033(s%.2fH", pitch);
+ }
+ cur_size = env->size;
+ }
+ if (!moveto(env->hpos, env->vpos))
+ return;
+ if (is_unprintable(ch))
+ fputs("\033&p1X", stdout);
+ putchar(ch);
+ cur_hpos += w;
+}
+
+int lj4_printer::moveto1(int hpos, int vpos)
+{
+ if (hpos < x_offset || vpos < 0)
+ return 0;
+ fputs("\033*p", stdout);
+ if (cur_hpos < 0)
+ printf("%dx%dY", hpos - x_offset, vpos);
+ else {
+ if (cur_hpos != hpos)
+ printf("%s%d%c", hpos > cur_hpos ? "+" : "",
+ hpos - cur_hpos, vpos == cur_vpos ? 'X' : 'x');
+ if (cur_vpos != vpos)
+ printf("%s%dY", vpos > cur_vpos ? "+" : "", vpos - cur_vpos);
+ }
+ cur_hpos = hpos;
+ cur_vpos = vpos;
+ return 1;
+}
+
+void lj4_printer::draw(int code, int *p, int np, const environment *env)
+{
+ switch (code) {
+ case 'R':
+ {
+ if (np != 2) {
+ error("2 arguments required for rule");
+ break;
+ }
+ int hpos = env->hpos;
+ int vpos = env->vpos;
+ int hsize = p[0];
+ int vsize = p[1];
+ if (hsize < 0) {
+ hpos += hsize;
+ hsize = -hsize;
+ }
+ if (vsize < 0) {
+ vpos += vsize;
+ vsize = -vsize;
+ }
+ if (!moveto(hpos, vpos))
+ return;
+ printf("\033*c%da%db0P", hsize, vsize);
+ break;
+ }
+ case 'l':
+ if (np != 2) {
+ error("2 arguments required for line");
+ break;
+ }
+ hpgl_init();
+ if (!moveto(env->hpos, env->vpos))
+ return;
+ hpgl_start();
+ set_line_thickness(env->size, p[0] == 0 && p[1] == 0);
+ printf("PD%d,%d", p[0], p[1]);
+ hpgl_end();
+ break;
+ case 'p':
+ case 'P':
+ {
+ if (np & 1) {
+ error("even number of arguments required for polygon");
+ break;
+ }
+ if (np == 0) {
+ error("no arguments for polygon");
+ break;
+ }
+ hpgl_init();
+ if (!moveto(env->hpos, env->vpos))
+ return;
+ hpgl_start();
+ if (code == 'p')
+ set_line_thickness(env->size);
+ printf("PMPD%d", p[0]);
+ for (int i = 1; i < np; i++)
+ printf(",%d", p[i]);
+ printf("PM2%cP", code == 'p' ? 'E' : 'F');
+ hpgl_end();
+ break;
+ }
+ case '~':
+ {
+ if (np & 1) {
+ error("even number of arguments required for spline");
+ break;
+ }
+ if (np == 0) {
+ error("no arguments for spline");
+ break;
+ }
+ hpgl_init();
+ if (!moveto(env->hpos, env->vpos))
+ return;
+ hpgl_start();
+ set_line_thickness(env->size);
+ printf("PD%d,%d", p[0]/2, p[1]/2);
+ const int tnum = 2;
+ const int tden = 3;
+ if (np > 2) {
+ fputs("BR", stdout);
+ for (int i = 0; i < np - 2; i += 2) {
+ if (i != 0)
+ putchar(',');
+ printf("%d,%d,%d,%d,%d,%d",
+ (p[i]*tnum)/(2*tden),
+ (p[i + 1]*tnum)/(2*tden),
+ p[i]/2 + (p[i + 2]*(tden - tnum))/(2*tden),
+ p[i + 1]/2 + (p[i + 3]*(tden - tnum))/(2*tden),
+ (p[i] - p[i]/2) + p[i + 2]/2,
+ (p[i + 1] - p[i + 1]/2) + p[i + 3]/2);
+ }
+ }
+ printf("PR%d,%d", p[np - 2] - p[np - 2]/2, p[np - 1] - p[np - 1]/2);
+ hpgl_end();
+ break;
+ }
+ case 'c':
+ case 'C':
+ // troff adds an extra argument to C
+ if (np != 1 && !(code == 'C' && np == 2)) {
+ error("1 argument required for circle");
+ break;
+ }
+ hpgl_init();
+ if (!moveto(env->hpos + p[0]/2, env->vpos))
+ return;
+ hpgl_start();
+ if (code == 'c') {
+ set_line_thickness(env->size);
+ printf("CI%d", p[0]/2);
+ }
+ else
+ printf("WG%d,0,360", p[0]/2);
+ hpgl_end();
+ break;
+ case 'e':
+ case 'E':
+ if (np != 2) {
+ error("2 arguments required for ellipse");
+ break;
+ }
+ hpgl_init();
+ if (!moveto(env->hpos + p[0]/2, env->vpos))
+ return;
+ hpgl_start();
+ printf("SC0,%.4f,0,-%.4f,2", hpgl_scale * double(p[0])/p[1], hpgl_scale);
+ if (code == 'e') {
+ set_line_thickness(env->size);
+ printf("CI%d", p[1]/2);
+ }
+ else
+ printf("WG%d,0,360", p[1]/2);
+ printf("SC0,%.4f,0,-%.4f,2", hpgl_scale, hpgl_scale);
+ hpgl_end();
+ break;
+ case 'a':
+ {
+ if (np != 4) {
+ error("4 arguments required for arc");
+ break;
+ }
+ hpgl_init();
+ if (!moveto(env->hpos, env->vpos))
+ return;
+ hpgl_start();
+ set_line_thickness(env->size);
+ double c[2];
+ if (adjust_arc_center(p, c)) {
+ double sweep = ((atan2(p[1] + p[3] - c[1], p[0] + p[2] - c[0])
+ - atan2(-c[1], -c[0]))
+ * 180.0/PI);
+ if (sweep > 0.0)
+ sweep -= 360.0;
+ printf("PDAR%d,%d,%f", int(c[0]), int(c[1]), sweep);
+ }
+ else
+ printf("PD%d,%d", p[0] + p[2], p[1] + p[3]);
+ hpgl_end();
+ }
+ break;
+ case 'f':
+ if (np != 1 && np != 2) {
+ error("1 argument required for fill");
+ break;
+ }
+ hpgl_init();
+ hpgl_start();
+ if (p[0] >= 0 && p[0] <= 1000)
+ printf("FT10,%d", p[0]/10);
+ hpgl_end();
+ break;
+ case 'F':
+ // not implemented yet
+ break;
+ case 't':
+ {
+ if (np == 0) {
+ line_thickness = -1;
+ }
+ else {
+ // troff gratuitously adds an extra 0
+ if (np != 1 && np != 2) {
+ error("0 or 1 argument required for thickness");
+ break;
+ }
+ line_thickness = p[0];
+ }
+ break;
+ }
+ default:
+ error("unrecognised drawing command '%1'", char(code));
+ break;
+ }
+}
+
+void lj4_printer::hpgl_init()
+{
+ if (hpgl_inited)
+ return;
+ hpgl_inited = 1;
+ hpgl_scale = double(DEFAULT_HPGL_UNITS)/font::res;
+ printf("\033&f0S" // push position
+ "\033*p0x0Y" // move to 0,0
+ "\033*c%dx%dy0T" // establish picture frame
+ "\033%%1B" // switch to HPGL
+ "SP1SC0,%.4f,0,-%.4f,2IR0,100,0,100" // set up scaling
+ "LA1,4,2,4" // round line ends and joins
+ "PR" // relative plotting
+ "TR0" // opaque
+ ";\033%%1A" // back to PCL
+ "\033&f1S", // pop position
+ MAX_PAPER_WIDTH, MAX_PAPER_HEIGHT,
+ hpgl_scale, hpgl_scale);
+}
+
+void lj4_printer::set_line_thickness(int size, int dot)
+{
+ double pw;
+ if (line_thickness < 0)
+ pw = (size * (line_width_factor * 25.4))/(font::sizescale * 72000.0);
+ else
+ pw = line_thickness*25.4/font::res;
+ if (dot && pw < MIN_DOT_PEN_WIDTH)
+ pw = MIN_DOT_PEN_WIDTH;
+ if (pw != pen_width) {
+ printf("PW%f", pw);
+ pen_width = pw;
+ }
+}
+
+font *lj4_printer::make_font(const char *nm)
+{
+ return lj4_font::load_lj4_font(nm);
+}
+
+printer *make_printer()
+{
+ return new lj4_printer(user_paper_size);
+}
+
+static
+int lookup_paper_size(const char *s)
+{
+ for (unsigned int i = 0;
+ i < sizeof(paper_table)/sizeof(paper_table[0]); i++) {
+ // FIXME Perhaps allow unique prefix.
+ if (strcasecmp(s, paper_table[i].name) == 0)
+ return i;
+ }
+ return -1;
+}
+
+static void usage(FILE *stream);
+
+extern "C" int optopt, optind;
+
+int main(int argc, char **argv)
+{
+ setlocale(LC_NUMERIC, "C");
+ program_name = argv[0];
+ static char stderr_buf[BUFSIZ];
+ setbuf(stderr, stderr_buf);
+ int c;
+ static const struct option long_options[] = {
+ { "help", no_argument, 0, CHAR_MAX + 1 },
+ { "version", no_argument, 0, 'v' },
+ { NULL, 0, 0, 0 }
+ };
+ while ((c = getopt_long(argc, argv, "c:d:F:I:lp:vw:", long_options, NULL))
+ != EOF)
+ switch(c) {
+ case 'l':
+ landscape_flag = 1;
+ break;
+ case 'I':
+ // ignore include search path
+ break;
+ case ':':
+ if (optopt == 'd') {
+ fprintf(stderr, "duplex assumed to be long-side\n");
+ duplex_flag = 1;
+ } else
+ fprintf(stderr, "option -%c requires an argument\n", optopt);
+ fflush(stderr);
+ break;
+ case 'd':
+ if (!isdigit(*optarg)) // this ugly hack prevents -d without
+ optind--; // args from messing up the arg list
+ duplex_flag = atoi(optarg);
+ if (duplex_flag != 1 && duplex_flag != 2) {
+ fprintf(stderr, "odd value for duplex; assumed to be long-side\n");
+ duplex_flag = 1;
+ }
+ break;
+ case 'p':
+ {
+ int n = lookup_paper_size(optarg);
+ if (n < 0)
+ error("ignoring invalid paper format '%1'", font::papersize);
+ else
+ user_paper_size = n;
+ break;
+ }
+ case 'v':
+ printf("GNU grolj4 (groff) version %s\n", Version_string);
+ exit(0);
+ break;
+ case 'F':
+ font::command_line_font_dir(optarg);
+ break;
+ case 'c':
+ {
+ char *ptr;
+ long n = strtol(optarg, &ptr, 10);
+ if (n == 0 && ptr == optarg)
+ error("argument for -c must be a positive integer");
+ else if (n <= 0 || n > 32767)
+ error("out of range argument for -c");
+ else
+ ncopies = unsigned(n);
+ break;
+ }
+ case 'w':
+ {
+ char *ptr;
+ long n = strtol(optarg, &ptr, 10);
+ if (n == 0 && ptr == optarg)
+ error("argument for -w must be a non-negative integer");
+ else if (n < 0 || n > INT_MAX)
+ error("out of range argument for -w");
+ else
+ line_width_factor = int(n);
+ break;
+ }
+ case CHAR_MAX + 1: // --help
+ usage(stdout);
+ exit(0);
+ break;
+ case '?':
+ usage(stderr);
+ exit(1);
+ break;
+ default:
+ assert(0);
+ }
+ SET_BINARY(fileno(stdout));
+ if (optind >= argc)
+ do_file("-");
+ else {
+ for (int i = optind; i < argc; i++)
+ do_file(argv[i]);
+ }
+ return 0;
+}
+
+static void usage(FILE *stream)
+{
+ fprintf(stream,
+ "usage: %s [-l] [-c n] [-d [n]] [-F dir] [-p paper-format]"
+ " [-w n] [file ...]\n"
+ "usage: %s {-v | --version}\n"
+ "usage: %s --help\n",
+ program_name, program_name, program_name);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/devices/gropdf/TODO b/src/devices/gropdf/TODO
new file mode 100644
index 0000000..12042c2
--- /dev/null
+++ b/src/devices/gropdf/TODO
@@ -0,0 +1,31 @@
+pspic.tmac
+----------
+
+Equiv for gropdf is pdfpic (which is dependent on a program pdfbb (to
+extract MediaBox (etc.) from the pdf) which is not written yet! Meanwhile
+you could use \X'pdf: pdfpic filename -L|R|C wid (hgt) (linelen)' (-R and -C
+require a linelen) Wid or hgt may be zero (in which case the same scaling as
+the other axis is used). The disadvantage of this call (over pdfpic macro)
+is that it is transparent to groff, after placing the image the current X/Y
+position remains what it was, so you need to do your own 'motion control'
+(like a .sp) to "step over" the image you just placed.
+
+psfig.tmac
+----------
+
+No equiv for gropdf.
+
+psatk.tmac
+----------
+
+No equiv for gropdf.
+
+-I : search -I directory for included files
+
+-w : set line width
+
+Another \X : \X'ps: exec 0 setlinejoin'\X'ps: exec 0 setlinecap' for mom
+
+Cater for fonts with >255 glyphs (currently accessing a glyph above 255
+(i.e. \N[260]) causes a fail). This will be fixed when font subsetting is
+implemented.
diff --git a/src/devices/gropdf/gropdf.1.man b/src/devices/gropdf/gropdf.1.man
new file mode 100644
index 0000000..d1d39bb
--- /dev/null
+++ b/src/devices/gropdf/gropdf.1.man
@@ -0,0 +1,1845 @@
+.TH gropdf @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+gropdf \-
+.I groff
+output driver for Portable Document Format
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2011-2022 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_gropdf_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" This macro definition is poor style from a portability standpoint,
+.\" but it's a good test and demonstration of the standard font
+.\" repertoire for the devices where it has any effect at all, and so
+.\" should be retained.
+.de FT
+. if '\\*(.T'ps' .ft \\$1
+. if '\\*(.T'pdf' .ft \\$1
+..
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY gropdf
+.RB [ \-dels ]
+.RB [ \-F\~\c
+.IR font-directory ]
+.RB [ \-I\~\c
+.IR inclusion-directory ]
+.RB [ \-p\~\c
+.IR paper-format ]
+\#.RB [ \-w\~\c
+\#.IR n ]
+.RB [ \-u
+.RI [ cmap-file ]]
+.RB [ \-y\~\c
+.IR foundry ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY gropdf
+.B \-\-help
+.YS
+.
+.
+.SY gropdf
+.B \-v
+.
+.SY gropdf
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The GNU
+.I roff
+PDF output driver translates the output of
+.MR @g@troff @MAN1EXT@
+into Portable Document Format.
+.
+Normally,
+.I gropdf
+is invoked by
+.MR groff @MAN1EXT@
+when the latter is given the
+.RB \[lq] \-T\~pdf \[rq]
+option.
+.
+(In this installation,
+.B @DEVICE@
+is the default output device.)
+.
+Use
+.IR groff 's
+.B \-P
+option to pass any options shown above to
+.IR gropdf .
+.
+If no
+.I file
+arguments are given,
+or if
+.I file
+is \[lq]\-\[rq],
+.I gropdf
+reads the standard input stream.
+.
+Output is written to the standard output stream.
+.
+.
+.P
+See section \[lq]Font installation\[rq] below for a guide to installing
+fonts for
+.IR gropdf .
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.B \-d
+Include debug information as comments within the PDF.
+.
+Also produces an uncompressed PDF.
+.
+.
+.TP
+.B \-e
+Forces
+.I gropdf
+to embed
+.I all
+fonts (even the 14 base PDF fonts).
+.
+.
+.TP
+.BI \-F " dir"
+Prepend directory
+.IR dir /dev name
+to the search path for font, and device description files;
+.I name
+is the name of the device, usually
+.BR pdf .
+.
+.TP
+.BI \-I\~ dir
+Search the directory
+.I dir
+for files named in
+.B \[rs]X\[aq]pdf: pdfpic\[aq]
+device control commands.
+.
+.B \-I
+may be specified more than once;
+each
+.I dir
+is searched in the given order.
+.
+To search the current working directory before others,
+add
+.RB \[lq] "\-I .\&" \[rq]
+at the desired place;
+it is otherwise searched last.
+.
+.
+.TP
+.B \-l
+Orient the document in landscape format.
+.
+.TP
+.BI \-p " paper-format"
+Set the physical dimensions of the output medium.
+.
+This overrides the
+.BR papersize ,
+.BR paperlength ,
+and
+.B paperwidth
+directives in the
+.I DESC
+file;
+it accepts the same arguments as the
+.B papersize
+directive.
+.
+See
+.MR groff_font @MAN5EXT@
+for details.
+.
+.
+.TP
+.B \-s
+Append a comment line to end of PDF showing statistics,
+i.e.\& number of pages in document.
+.
+Ghostscript's
+.B ps2pdf
+complains about this line if it is included, but works anyway.
+.
+.
+.TP
+.BR \-u \~[\c
+.IR cmap-file ]
+.I gropdf
+normally includes a ToUnicode CMap with any font created using
+.I text.enc
+as the encoding file,
+this makes it easier to search for words which contain ligatures.
+.
+You can include your own CMap by specifying a
+.I cmap-file
+or have no CMap at all by omitting the argument.
+.
+.
+.\" .TP
+.\" .BI \-w n
+.\" Lines should be drawn using a thickness of
+.\" .IR n \~\c
+.\" thousandths of an em.
+.\" .
+.\" If this option is not given, the line thickness defaults to
+.\" 0.04\~em.
+.\" .
+.\" .
+.TP
+.BI \-y " foundry"
+Set the foundry to use for selecting fonts of the same name.
+.
+.
+.\" ====================================================================
+.SH Usage
+.\" ====================================================================
+.
+The input to
+.I gropdf
+must be in the format output by
+.MR @g@troff @MAN1EXT@ .
+.
+This is described in
+.MR groff_out @MAN5EXT@ .
+.
+In addition, the device and font description files for the device used
+must meet certain requirements:
+.
+The resolution must be an integer multiple of\~72 times the
+.BR sizescale .
+.
+The
+.B pdf
+device uses a resolution of 72000 and a sizescale of 1000.
+.
+.
+.LP
+The device description file must contain a valid paper format;
+see
+.MR groff_font @MAN5EXT@ .
+.
+.I gropdf
+uses the same Type\~1 Adobe PostScript fonts as the
+.B grops
+device driver.
+.
+Although the PDF Standard allows the use of other font types (like
+TrueType) this implementation only accepts the Type\~1 PostScript
+font.
+.
+Fewer Type\~1 fonts are supported natively in PDF documents than the
+standard 35 fonts supported by
+.B grops
+and all PostScript printers, but all the fonts are available since any
+which aren't supported natively are automatically embedded in the
+PDF.
+.
+.
+.LP
+.I gropdf
+supports the concept of foundries,
+that is different versions of basically the same font.
+.
+During install a
+.I Foundry
+file controls where fonts are found and builds
+.I groff
+fonts from the files it discovers on your system.
+.
+.
+.LP
+Each font description file must contain a command
+.
+.IP
+.BI internalname\ psname
+.
+.LP
+which says that the PostScript name of the font is
+.IR psname .
+.
+Lines starting with
+.B #
+and blank lines are ignored.
+.
+The code for each character given in the font file must correspond
+to the code in the default encoding for the font.
+.
+This code can be used with the
+.B \[rs]N
+escape sequence in
+.B troff
+to select the character,
+even if the character does not have a
+.I groff
+name.
+.
+Every character in the font file must exist in the PostScript font, and
+the widths given in the font file must match the widths used
+in the PostScript font.
+.
+.
+.LP
+Note that
+.I gropdf
+is currently only able to display the first 256 glyphs in any font.
+This restriction will be lifted in a later version.
+.
+.
+.\" .LP
+.\" Note that
+.\" .B grops
+.\" is able to display all glyphs in a PostScript font, not only 256.
+.\" .I enc_file
+.\" (or the default encoding if no encoding file specified) just defines
+.\" the order of glyphs for the first 256 characters;
+.\" all other glyphs are accessed with additional encoding vectors which
+.\" .B grops
+.\" produces on the fly.
+.
+.
+.LP
+.I gropdf
+can automatically include the downloadable fonts necessary
+to print the document.
+.
+Fonts may be in PFA or PFB format.
+.LP
+.
+Any downloadable fonts which should, when required, be included by
+.I gropdf
+must be listed in the file
+.IR @FONTDIR@/\:\%devpdf/\:\%download ;
+this should consist of lines of the form
+.
+.IP
+.I
+foundry font filename
+.
+.LP
+where
+.I foundry
+is the foundry name or blank for the default foundry.
+.
+.I font
+is the PostScript name of the font,
+and
+.I filename
+is the name of the file containing the font;
+lines beginning with
+.B #
+and blank lines are ignored;
+fields must be separated by tabs
+(spaces are
+.B not
+allowed);
+.I filename
+is searched for using the same mechanism that is used
+for
+.I groff
+font metric files.
+.
+The
+.I download
+file itself is also sought using this mechanism.
+.
+Foundry names are usually a single character
+(such as \[oq]U\[cq] for the URW foundry)
+or empty for the default foundry.
+.
+This default uses the same fonts as
+.I ghostscript
+uses when it embeds fonts in a PDF file.
+.
+.
+.LP
+In the default setup there are styles called
+.BR R ,
+.BR I ,
+.BR B ,
+and
+.B BI
+mounted at font positions 1 to\~4.
+.
+The fonts are grouped into families
+.BR A ,
+.BR BM ,
+.BR C ,
+.BR H ,
+.BR HN ,
+.BR N ,
+.BR P ,
+and\~\c
+.B T
+having members in each of these styles:
+.
+.RS
+.TP
+.B AR
+.FT AR
+AvantGarde-Book
+.FT
+.
+.TQ
+.B AI
+.FT AI
+AvantGarde-BookOblique
+.FT
+.
+.TQ
+.B AB
+.FT AB
+AvantGarde-Demi
+.FT
+.
+.TQ
+.B ABI
+.FT ABI
+AvantGarde-DemiOblique
+.FT
+.
+.TQ
+.B BMR
+.FT BMR
+Bookman-Light
+.FT
+.
+.TQ
+.B BMI
+.FT BMI
+Bookman-LightItalic
+.FT
+.
+.TQ
+.B BMB
+.FT BMB
+Bookman-Demi
+.FT
+.
+.TQ
+.B BMBI
+.FT BMBI
+Bookman-DemiItalic
+.FT
+.
+.TQ
+.B CR
+.FT CR
+Courier
+.FT
+.
+.TQ
+.B CI
+.FT CI
+Courier-Oblique
+.FT
+.
+.TQ
+.B CB
+.FT CB
+Courier-Bold
+.FT
+.
+.TQ
+.B CBI
+.FT CBI
+Courier-BoldOblique
+.FT
+.
+.TQ
+.B HR
+.FT HR
+Helvetica
+.FT
+.
+.TQ
+.B HI
+.FT HI
+Helvetica-Oblique
+.FT
+.
+.TQ
+.B HB
+.FT HB
+Helvetica-Bold
+.FT
+.
+.TQ
+.B HBI
+.FT HBI
+Helvetica-BoldOblique
+.FT
+.
+.TQ
+.B HNR
+.FT HNR
+Helvetica-Narrow
+.FT
+.
+.TQ
+.B HNI
+.FT HNI
+Helvetica-Narrow-Oblique
+.FT
+.
+.TQ
+.B HNB
+.FT HNB
+Helvetica-Narrow-Bold
+.FT
+.
+.TQ
+.B HNBI
+.FT HNBI
+Helvetica-Narrow-BoldOblique
+.FT
+.
+.TQ
+.B NR
+.FT NR
+NewCenturySchlbk-Roman
+.FT
+.
+.TQ
+.B NI
+.FT NI
+NewCenturySchlbk-Italic
+.FT
+.
+.TQ
+.B NB
+.FT NB
+NewCenturySchlbk-Bold
+.FT
+.
+.TQ
+.B NBI
+.FT NBI
+NewCenturySchlbk-BoldItalic
+.FT
+.
+.TQ
+.B PR
+.FT PR
+Palatino-Roman
+.FT
+.
+.TQ
+.B PI
+.FT PI
+Palatino-Italic
+.FT
+.
+.TQ
+.B PB
+.FT PB
+Palatino-Bold
+.FT
+.
+.TQ
+.B PBI
+.FT PBI
+Palatino-BoldItalic
+.FT
+.
+.TQ
+.B TR
+.FT TR
+Times-Roman
+.FT
+.
+.TQ
+.B TI
+.FT TI
+Times-Italic
+.FT
+.
+.TQ
+.B TB
+.FT TB
+Times-Bold
+.FT
+.
+.TQ
+.B TBI
+.FT TBI
+Times-BoldItalic
+.FT
+.RE
+.
+.
+.LP
+There is also the following font which is not a member of a family:
+.
+.RS
+.TP
+.B ZCMI
+.FT ZCMI
+ZapfChancery-MediumItalic
+.FT
+.RE
+.
+.
+.LP
+There are also some special fonts called
+.B S
+for the PS Symbol font.
+.
+The lower case greek characters are automatically slanted (to match
+the SymbolSlanted font (SS) available to PostScript).
+.
+Zapf Dingbats is available as
+.BR ZD ;
+the \[lq]hand pointing left\[rq] glyph
+.RB ( \[rs][lh] )
+is available since it has been defined using the
+.B \[rs]X\[aq]pdf: xrev\[aq]
+device control command,
+which reverses the direction of letters within words.
+.
+.
+.LP
+The default color for
+.B \[rs]m
+and
+.B \[rs]M
+is black.
+.
+.
+.LP
+.I gropdf
+understands some of the device control commands supported by
+.MR grops 1 .
+.
+.
+.TP
+.B \[rs]X\[aq]ps: invis\[aq]
+Suppress output.
+.
+.
+.TP
+.B \[rs]X\[aq]ps: endinvis\[aq]
+Stop suppressing output.
+.
+.
+.TP
+.BI "\[rs]X\[aq]ps: exec gsave currentpoint 2 copy translate\~" n\~\c
+.B rotate neg exch neg exch translate\[aq]
+where
+.I n
+is the angle of rotation.
+.
+This is to support the
+.B align
+command in
+.MR @g@pic 1 .
+.
+.
+.TP
+.B \[rs]X\[aq]ps: exec grestore\[aq]
+Used by
+.MR @g@pic 1
+to restore state after rotation.
+.
+.
+.TP
+.BI "\[rs]X\[aq]ps: exec " "n\~" "setlinejoin\[aq]"
+where
+.I n
+can be one of the following values.
+.
+.
+.IP
+0 = Miter join
+.br
+1 = Round join
+.br
+2 = Bevel join
+.
+.
+.TP
+.BI "\[rs]X\[aq]ps: exec " "n " "setlinecap\[aq]"
+where
+.I n
+can be one of the following values.
+.
+.
+.IP
+0 = Butt cap
+.br
+1 = Round cap, and
+.br
+2 = Projecting square cap
+.
+.
+.LP
+.TP
+.BR "\[rs]X\[aq]ps:\~" .\|.\|.\& "\~pdfmark\[aq]"
+All the
+.I pdfmark
+macros installed by using
+.I \-m pdfmark
+or
+.I \-m mspdf
+(see documentation in
+.IR pdfmark.pdf ).
+.
+A subset of these macros are installed automatically when you use
+.B \-Tpdf
+so you should not need to use
+.RB \[lq] "\-m pdfmark" \[rq]
+to access most PDF functionality.
+.
+.
+.LP
+.I gropdf
+also supports a subset of the commands introduced in
+.IR present.tmac .
+.
+Specifically it supports:-
+.
+.
+.IP
+PAUSE
+.br
+BLOCKS
+.br
+BLOCKE
+.
+.
+.LP
+Which allows you to create presentation type PDFs.
+.
+Many of the other
+commands are already available in other macro packages.
+.
+.
+.LP
+These commands are implemented with
+.I groff
+X commands:-
+.
+.
+.LP
+.TP
+.B \[rs]X\[aq]ps: exec %%%%PAUSE\[aq]
+The section before this is treated as a block and is introduced using
+the current
+.B BLOCK
+transition setting
+(see
+.RB \[lq] "\[rs]X\[aq]pdf: transition\[aq]" \[rq]
+below).
+.
+Equivalently,
+.B \%.pdfpause
+is available as a macro.
+.TP
+.B \[rs]X\[aq]ps: exec %%%%BEGINONCE\[aq]
+Any text following this command (up to %%%%ENDONCE) is shown only once,
+the next %%%%PAUSE will remove it.
+If producing a non-presentation PDF, i.e.\&
+ignoring the pauses, see
+.I \%GROPDF_NOSLIDE
+below, this text is ignored.
+.LP
+.TP
+.B \[rs]X\[aq]ps: exec %%%%ENDONCE\[aq]
+This terminates the block defined by %%%%BEGINONCE.
+This pair of commands
+is what implements the \&.BLOCKS Once/.BLOCKE commands in
+.IR present.tmac .
+.
+.
+.LP
+The
+.I mom
+macro package already integrates these extensions,
+so you can build slides with
+.IR mom .
+.
+.
+.LP
+If you use
+.I present.tmac
+with
+.I gropdf
+there is no need to run the program
+.MR presentps @MAN1EXT@
+since the output will already be a presentation PDF.
+.
+.
+.LP
+All other
+.B ps:
+tags are silently ignored.
+.
+.
+.LP
+One
+.B \[rs]X
+device control command used by the DVI driver is also recognised.
+.
+.
+.TP
+.BI \[rs]X\[aq]papersize= paper-format \[aq]
+where the
+.I paper-format
+parameter is the same as that to the
+.B papersize
+directive.
+.
+See
+.MR groff_font @MAN5EXT@ .
+.
+This means that you can alter the page size at will within the PDF file
+being created by
+.IR gropdf .
+.
+If you do want to change the paper format,
+it must be done before you start creating the page.
+.
+.
+.LP
+.I gropdf
+supports several more device control features using the
+.B pdf:
+tag.
+.
+Some have counterpart
+.I convenience macros
+that take the same arguments and behave equivalently.
+.
+.
+.TP
+.BI "\[rs]X\[aq]pdf: pdfpic\~" file\~\c
+.IR "alignment width height line-length" \[aq]
+Place an image of the specified
+.I width
+containing the PDF drawing from file
+.I file
+of desired
+.I width
+and
+.I height
+(if
+.I height
+is missing or zero then it is scaled proportionally).
+.
+If
+.I alignment
+is
+.B \-L
+the drawing is left-aligned.
+.
+If it is
+.B \-C
+or
+.B \-R
+a
+.I line-length
+greater than the width of the drawing is required as well.
+.
+If
+.I width
+is specified as zero then the width is scaled in proportion to the
+height.
+.
+.\" .IP
+.\" See
+.\" .BR groff_tmac (@MAN7EXT@)
+.\" for a description of the
+.\" .B PSPIC
+.\" macro which provides a convenient high-level interface for inclusion
+.\" of PostScript graphics.
+.
+.TP
+.B \[rs]X\[aq]pdf: xrev\[aq]
+Toggle the reversal of glyph direction.
+.
+This feature works \[lq]letter by letter\[rq],
+that is,
+each letter in a word is reversed left-to-right,
+not the entire word.
+.
+One application is the reversal of glyphs in the Zapf Dingbats font.
+.
+To restore the normal glyph orientation,
+repeat the command.
+.
+.
+.TP
+.BI "\[rs]X\[aq]pdf: markstart " "/ANN-definition" \[aq]
+.TQ
+.B \[rs]X\[aq]pdf: markend\[aq]
+Macros that support PDF bookmarks use these calls internally to
+start and stop (respectively) the placement of the bookmark's
+.I hot spot;
+the user will have called
+.RB \[lq] .pdfhref\~L \[rq]
+with the text of the hot spot.
+.
+Normally,
+these are never used except from within the
+.I pdfmark
+macros.
+.
+.
+.TP
+.B \[rs]X\[aq]pdf: marksuspend\[aq]
+.TQ
+.B \[rs]X\[aq]pdf: markrestart\[aq]
+If you use a page location trap to produce a header or footer,
+or otherwise interrupt a document's text,
+you need to use these commands if a PDF
+.I hot spot
+crosses a trap boundary;
+otherwise any text output by the trap will be marked as part of the hot
+spot.
+.
+To prevent this error,
+place these device control commands or their corresponding
+convenience macros
+.B \%.pdfmarksuspend
+and
+.B \%.pdfmarkrestart
+at the start and end of the trap macro,
+respectively.
+.
+.
+.TP
+.BI "\[rs]X\[aq]pdf: pagename\~" name \[aq]
+Assign the current page a
+.IR name .
+.
+All documents bear two default names,
+.RB \[oq] top "\[cq] and \[oq]" bottom \[cq].
+.
+The convenience macro for this command is
+.BR \%.pdfpagename .
+.
+.
+.TP
+.BI "\[rs]X'pdf: switchtopage\~" "when name" \[aq]
+Normally each new page is appended to the end of the document,
+this command allows following pages to be inserted at a
+.I \[oq]named\[cq]
+position within the document (see pagename command above).
+.I \[oq]when\[cq]
+can be either
+.RI \[oq] after "\[cq] or \[oq]" before \[cq].
+If it is omitted it defaults to
+.RI \[oq] before \[cq].
+.
+It should be used at the end of the page before you want the switch to
+happen.
+.
+This allows pages such as a TOC to be moved to elsewhere in the
+document,
+but more esoteric uses are possible.
+.
+The convenience macro for this command is
+.BR \%.pdfswitchtopage .
+.
+.
+.TP
+.BI \[rs]X\[aq]pdf:\~transition\~ feature\~\c
+.IB "mode duration dimension motion direction scale bool" \[aq]
+where
+.I feature
+can be either SLIDE or BLOCK.
+When it is SLIDE the transition is used
+when a new slide is introduced to the screen,
+if BLOCK then this transition is used for the individual blocks which
+make up the slide.
+.
+.
+.IP
+.I mode
+is the transition type between slides:-
+.RS
+.IP
+.B Split
+- Two lines sweep across the screen, revealing the new page.
+The lines
+may be either horizontal or vertical and may move inward from the
+edges of the page or outward from the center, as specified by the
+.I dimension
+and
+.I motion
+entries, respectively.
+.br
+.B Blinds
+- Multiple lines, evenly spaced across the screen, synchronously
+sweep in the same direction to reveal the new page.
+The lines may be
+either horizontal or vertical, as specified by the
+.I dimension
+entry.
+Horizontal
+lines move downward; vertical lines move to the right.
+.br
+.B Box
+- A rectangular box sweeps inward from the edges of the page or
+outward from the center, as specified by the
+.I motion
+entry, revealing the new page.
+.br
+.B Wipe
+- A single line sweeps across the screen from one edge to the other in
+the direction specified by the
+.I direction
+entry, revealing the new page.
+.br
+.B Dissolve
+- The old page dissolves gradually to reveal the new one.
+.br
+.B Glitter
+- Similar to Dissolve,
+except that the effect sweeps across the page in a wide band moving from
+one side of the screen to the other in the direction specified by the
+.I direction
+entry.
+.br
+.B R
+- The new page simply replaces the old one with no special transition
+effect; the
+.I direction
+entry shall be ignored.
+.br
+.B Fly
+- (PDF 1.5) Changes are flown out or in (as specified by
+.IR motion ),
+in the
+direction specified by
+.IR direction ,
+to or from a location that is offscreen except
+when
+.I direction
+is
+.BR None .
+.br
+.B Push
+- (PDF 1.5) The old page slides off the screen while the new page
+slides in, pushing the old page out in the direction specified by
+.IR direction .
+.br
+.B Cover
+- (PDF 1.5) The new page slides on to the screen in the direction
+specified by
+.IR direction ,
+covering the old page.
+.br
+.B Uncover
+- (PDF 1.5) The old page slides off the screen in the direction
+specified by
+.IR direction ,
+uncovering the new page in the direction
+specified by
+.IR direction .
+.br
+.B Fade
+- (PDF 1.5) The new page gradually becomes visible through the
+old one.
+.LP
+.RE
+.IP
+.I duration
+is the length of the transition in seconds (default 1).
+.LP
+.IP
+.I dimension
+(Optional;
+.BR Split " and " Blinds
+transition styles only) The dimension in which the
+specified transition effect shall occur:
+.B H
+Horizontal, or
+.B V
+Vertical.
+.LP
+.IP
+.I motion
+(Optional;
+.BR Split ,
+.BR Box " and " Fly
+transition styles only) The direction of motion for
+the specified transition effect:
+.B I
+Inward from the edges of the page, or
+.B O
+Outward from the center of the page.
+.LP
+.IP
+.I direction
+(Optional;
+.BR Wipe ,
+.BR Glitter ,
+.BR Fly ,
+.BR Cover ,
+.BR Uncover " and " Push
+transition styles only)
+The direction in which the specified transition effect shall moves,
+expressed in degrees counterclockwise starting from a left-to-right
+direction.
+If the value is a number, it shall be one of:
+.B 0
+= Left to right,
+.B 90
+= Bottom to top (Wipe only),
+.B 180
+= Right to left (Wipe only),
+.B 270
+= Top to bottom,
+.B 315
+= Top-left to bottom-right (Glitter only)
+The value can be
+.BR None ,
+which is relevant only for the
+.B Fly
+transition when the value of
+.I scale
+is not 1.0.
+.LP
+.IP
+.I scale
+(Optional; PDF 1.5;
+.B Fly
+transition style only) The starting or ending scale at
+which the changes shall be drawn.
+If
+.I motion
+specifies an inward transition, the scale
+of the changes drawn shall progress from
+.I scale
+to 1.0 over the course of the
+transition.
+If
+.I motion
+specifies an outward transition, the scale of the changes drawn
+shall progress from 1.0 to
+.I scale
+over the course of the transition
+.LP
+.IP
+.I bool
+(Optional; PDF 1.5;
+.B Fly
+transition style only) If
+.BR true ,
+the area that shall be flown
+in is rectangular and opaque.
+.LP
+.IP
+This command can be used by calling the macro
+.B .pdftransition
+using the parameters described above.
+Any of the parameters may be
+replaced with a "." which signifies the parameter retains its
+previous value, also any trailing missing parameters are ignored.
+.LP
+.IP
+.B Note:
+not all PDF Readers support any or all these transitions.
+.LP
+.
+.
+.TP
+.BI "\eX\[aq]pdf: background\~" "cmd left top right bottom weight" \[aq]
+.TQ
+.B "\eX\[aq]pdf: background off\[aq]"
+.TQ
+.BI "\eX\[aq]pdf: background footnote\~" bottom \[aq]
+produces a background rectangle on the page,
+where
+.RS
+.TP
+.I cmd
+is the command,
+which can be any of
+.RB \[lq] page | fill | box \[rq]
+in combination.
+.
+Thus,
+.RB \[lq] pagefill \[rq]
+would draw a rectangle which covers the whole current page size
+(in which case the rest of the parameters can be omitted because the box
+dimensions are taken from the current media size).
+.
+.RB \[lq] boxfill \[rq],
+on the other hand,
+requires the given dimensions to place the box.
+.
+Including
+.RB \[lq] fill \[rq]
+in the command will paint the rectangle with the current fill colour
+(as with
+.BR \[rs]M[] )
+and including
+.RB \[lq] box \[rq]
+will give the rectangle a border in the current stroke colour
+(as with
+.BR \[rs]m[] ).
+.
+.
+.IP
+.I cmd
+may also be
+.RB \[lq] off \[rq]
+on its own,
+which will terminate drawing the current box.
+.
+If you have specified a page colour with
+.RB \[lq] pagefill \[rq],
+it is always the first box in the stack,
+and if you specify it again,
+it will replace the first entry.
+.
+Be aware that the
+.RB \[lq] pagefill \[rq]
+box renders the page opaque,
+so tools that \[lq]watermark\[rq] PDF pages are unlikely to be
+successful.
+.
+To return the background to transparent,
+issue an
+.RB \[lq] off \[rq]
+command with no other boxes open.
+.
+.
+.IP
+Finally,
+.I cmd
+may be
+.RB \[lq] footnote \[rq]
+followed by a new value for
+.IR bottom ,
+which will be used for all open boxes on the current page.
+This is to allow room for footnote areas that grow while a page is
+processed
+(to accommodate multiple footnotes,
+for instance).
+.
+(If the value is negative,
+it is used as an offset from the bottom of the page.)
+.
+.
+.TP
+.I left
+.TQ
+.I top
+.TQ
+.I right
+.TQ
+.I bottom
+are the coordinates of the box.
+.
+The
+.I top
+and
+.I bottom
+coordinates are the minimum and maximum for the box,
+since the actual start of the box is
+.IR groff 's
+drawing position when you issue the command,
+and the bottom of the box is the point where you turn the box
+.RB \[lq] off \[rq].
+.
+The top and bottom coordinates are used only if the box drawing extends
+onto the next page;
+ordinarily,
+they would be set to the header and footer margins.
+.
+.
+.TP
+.I weight
+provides the line width for the border if
+.RB \[lq] box \[rq]
+is included in the command.
+.
+.
+.P
+The convenience macro for this escape sequence is
+.BR .pdfbackground .
+.
+An
+.I sboxes
+macro file is also available;
+see
+.MR groff_tmac @MAN5EXT@ .
+.RE
+.
+.
+.\" ====================================================================
+.SS Macros
+.\" ====================================================================
+.
+.IR gropdf 's
+support macros in
+.I pdf\.tmac
+define the convenience macros described above.
+.
+Some features have no direct device control command counterpart.
+.
+.
+.\" pdfhref
+.
+.
+.TP
+.BI ".pdfinfo /" "field content"\~\c
+\&.\|.\|.
+Define PDF metadata.
+.
+.I field
+may be be one of
+.BR Title ,
+.BR Author ,
+.BR Subject ,
+.BR Keywords ,
+or another datum supported by the PDF standard or your reader.
+.
+.I field
+must be prefixed with a slash.
+.
+.
+.\" ====================================================================
+.SS "Importing graphics"
+.\" ====================================================================
+.
+.I gropdf
+supports only the inclusion of other PDF files for inline images.
+.
+Such a PDF file may,
+however,
+contain any of the graphic formats supported by
+the PDF standard,
+such as JPEG/JFIF,
+PNG,
+and GIF.
+.
+Any application that outputs PDF can thus be used to prepare files for
+embedding in documents processed by
+.I groff
+and
+.IR gropdf .
+.
+.
+.P
+The PDF file you wish to insert must be a single page and the drawing
+must just fit inside the media size of the PDF file.
+.
+In
+.MR inkscape 1
+or
+.MR gimp 1 ,
+for example,
+make sure the canvas size just fits the image.
+.
+.
+.P
+The PDF parser
+.I gropdf
+implements has not been rigorously tested with all applications that
+produce PDF.
+.
+If you find a single-page PDF which fails to import properly,
+try processing it with the
+.MR pdftk 1
+program.
+.
+.
+.RS
+.EX
+pdftk\~\c
+.I existing-file\~\c
+output\~\c
+.I new-file
+.EE
+.RE
+.
+You may find that
+.I new-file
+imports successfully.
+.
+.
+.\" ====================================================================
+.SS "TrueType and other font formats"
+.\" ====================================================================
+.
+.I gropdf
+does not yet support any font formats besides Adobe Type 1
+(PFA or PFB).
+.
+.
+.\" ====================================================================
+.SH "Font installation"
+.\" ====================================================================
+.
+The following is a step-by-step font installation guide for
+.I gropdf.
+.
+.
+.IP \[bu] 2n
+Convert your font to something
+.I groff
+understands.
+.
+This is a PostScript Type\~1 font in PFA or PFB format,
+together with an AFM file.
+.
+A PFA file begins as follows.
+.
+.RS
+.RS \" two RS calls to get inboard of IP indentation
+.EX
+%!PS\-AdobeFont\-1.0:
+.EE
+.RE \" but only one to get back to it
+.
+A PFB file contains this string as well,
+preceded by some non-printing bytes.
+.
+In the following steps,
+we will consider the use of CTAN's
+.UR https://\:ctan.org/\:tex\-archive/\:fonts/\:brushscr
+BrushScriptX-Italic
+.UE
+font in PFA format.
+.RE \" now restore left margin
+.
+.
+.IP \[bu]
+Convert the AFM file to a
+.I groff
+font description file with the
+.MR afmtodit @MAN1EXT@
+program.
+.
+For instance,
+.
+.RS
+.RS \" two RS calls to get inboard of IP indentation
+.EX
+$ \c
+.B afmtodit BrushScriptX\-Italic.afm text.map BSI
+.EE
+.RE \" but only one to get back to it
+.
+converts the Adobe Font Metric file
+.I BrushScriptX\-Italic.afm
+to the
+.I groff
+font description file
+.IR BSI .
+.RE \" now restore left margin
+.
+.
+.IP
+If you have a font family which provides regular upright (roman),
+bold,
+italic,
+and
+bold-italic styles,
+(where \[lq]italic\[rq] may be \[lq]oblique\[rq] or \[lq]slanted\[rq]),
+we recommend using
+.BR R ,
+.BR B ,
+.BR I ,
+and
+.BR BI ,
+respectively,
+as suffixes to the
+.I groff
+font family name to enable
+.IR groff 's
+font family and style selection features.
+.
+An example is
+.IR groff 's
+built-in support for Times:
+the font family
+name is abbreviated as
+.BR T ,
+and the
+.I groff
+font names are therefore
+.BR TR ,
+.BR TB ,
+.BR TI ,
+and
+.BR TBI .
+.
+In our example,
+however,
+the BrushScriptX font is available in a single style only,
+italic.
+.
+.
+.IP \[bu]
+Install the
+.I groff
+font description file(s) in a
+.I devpdf
+subdirectory in the search path that
+.I groff
+uses for device and font file descriptions.
+.
+See the
+.I GROFF_FONT_PATH
+entry in section \[lq]Environment\[rq] of
+.MR @g@troff @MAN1EXT@
+for the current value of the font search path.
+.
+While
+.I groff
+doesn't directly use AFM files,
+it is a good idea to store them alongside its font description files.
+.
+.
+.IP \[bu]
+Register fonts in the
+.I devpdf/download
+file so they can be located for embedding in PDF files
+.I gropdf
+generates.
+.
+Only the first
+.I download
+file encountered in the font search path is read.
+.
+If in doubt,
+copy the default
+.I download
+file
+(see section \[lq]Files\[rq] below)
+to the first directory in the font search path and add your fonts there.
+.
+The PostScript font name used by
+.I gropdf
+is stored in the
+.B internalname
+field in the
+.I groff
+font description file.
+.
+(This name does not necessarily resemble the font's file name.)
+.
+If the font in our example had originated from a foundry named
+.BR Z ,
+we would add the following line to
+.IR download .
+.
+.RS
+.RS \" two RS calls to get inboard of IP indentation
+.EX
+Z\[->]BrushScriptX\-Italic\[->]BrushScriptX\-Italic.pfa
+.EE
+.RE \" but only one to get back to it
+.
+A tab character,
+depicted as \[->],
+separates the fields.
+.
+The default foundry has no name:
+its field is empty and
+entries corresponding to it start with a tab character,
+as will the one in our example.
+.RE \" now restore left margin
+.
+.
+.IP \[bu]
+Test the selection and embedding of the new font.
+.
+.RS
+.RS \" two RS calls to get inboard of IP indentation
+.EX
+printf "\[rs]\[rs]f[BSI]Hello, world!\[rs]n" \
+| groff \-T pdf \-P \-e >hello.pdf
+see hello.pdf
+.EE
+.RE
+.RE
+.
+.
+.br
+.ne 5v
+.\" ====================================================================
+.SH Environment
+.\" ====================================================================
+.
+.TP
+.I GROFF_FONT_PATH
+A list of directories in which to seek the selected output device's
+directory of device and font description files.
+.
+If,
+in the
+.I download
+file,
+the font file has been specified with a full path,
+no directories are searched.
+.
+See
+.MR @g@troff @MAN1EXT@
+and
+.MR groff_font @MAN5EXT@ .
+.
+.
+.TP
+.I GROPDF_NOSLIDE
+If set and evaluates to a true value
+(to Perl),
+.\" XXX: The above is inconsistent with the way grotty(1) handles
+.\" "GROFF_NO_SGR".
+.I gropdf
+ignores commands specific to presentation PDFs,
+producing a normal PDF instead.
+.
+.
+.TP
+.I SOURCE_DATE_EPOCH
+A timestamp
+(expressed as seconds since the Unix epoch)
+to use as the output creation timestamp in place of the current time.
+.
+The time is converted to human-readable form using Perl's
+.I \%localtime()
+function and recorded in a PDF comment.
+.
+.
+.TP
+.I TZ
+The time zone to use when converting the current time
+(or value of
+.IR SOURCE_DATE_EPOCH )
+to human-readable form;
+see
+.MR tzset 3 .
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @FONTDIR@/\:\%devpdf/\:DESC
+describes the
+.B pdf
+output device.
+.
+.
+.TP
+.IR @FONTDIR@/\:\%devpdf/ F
+describes the font known
+.RI as\~ F
+on device
+.BR pdf .
+.
+.
+.TP
+.IR @FONTDIR@/\:\%devpdf/\:U\- F
+describes the font
+from the URW foundry
+(versus the Adobe default)
+known
+.RI as\~ F
+on device
+.BR pdf .
+.
+.
+.TP
+.I @FONTDIR@/\:\%devpdf/\%download
+lists fonts available for embedding within the PDF document
+(by analogy to the
+.B ps
+device's downloadable font support).
+.
+.
+.\" XXX: Why are we shipping this but not BuildFoundries.pl?
+.TP
+.I @FONTDIR@/\:\%devpdf/\%Foundry
+is a data file used by the
+.I groff
+build system to locate PostScript Type\~1 fonts.
+.
+.
+.TP
+.I @FONTDIR@/\:\%devpdf/\:enc/\:\%text\:.enc
+describes the encoding scheme used by most PostScript Type\~1 fonts;
+the
+.B \%encoding
+directive of
+font description files for the
+.B pdf
+device refers to it.
+.
+.
+.TP
+.I @MACRODIR@/\:pdf\:.tmac
+defines macros for use with the
+.B pdf
+output device.
+.
+It is automatically loaded by
+.I troffrc
+when the
+.B pdf
+output device is selected.
+.
+.
+.TP
+.I @MACRODIR@/\:\%pdfpic\:.tmac
+defines the
+.B PDFPIC
+macro for embedding images in a document;
+see
+.MR groff_tmac @MAN5EXT@ .
+.
+It is automatically loaded by
+.I troffrc.
+.\"
+.\"
+.\" .TP
+.\" .B @MACRODIR@/pspic.tmac
+.\" Definition of
+.\" .B PSPIC
+.\" macro,
+.\" automatically loaded by
+.\" .BR ps.tmac .
+.\" .
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+.I gropdf
+was written and is maintained by
+.MT deri@\:chuzzlewit\:.myzen\:.co\:.uk
+Deri James
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.TP
+.I @DOCDIR@/\:\%sboxes/\:\%msboxes\:.ms
+.TQ
+.I @DOCDIR@/\:\%sboxes/\:\%msboxes\:.pdf
+\[lq]Using PDF boxes with
+.I groff
+and the
+.I ms
+macros\[rq],
+by Deri James.
+.
+.
+.TP
+.I present.tmac
+is part of
+.UR https://\:bob\:.diertens\:.org/\:corner/\:useful/\:gpresent/
+.I gpresent
+.UE ,
+a software package by Bob Diertens that works with
+.I groff
+to produce presentations
+(\[lq]foils\[rq],
+or \[lq]slide decks\[rq]).
+.
+.
+.P
+.MR afmtodit @MAN1EXT@ ,
+.MR groff @MAN1EXT@ ,
+.MR @g@troff @MAN1EXT@ ,
+.MR groff_font @MAN5EXT@ ,
+.MR groff_out @MAN5EXT@
+.\" Not actually referenced in above discussion.
+.\" .BR \%pfbtops (@MAN1EXT@),
+.\" .BR \%groff_tmac (@MAN5EXT@),
+.
+.
+.\" Clean up.
+.rm FT
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_gropdf_1_man_C]
+.do rr *groff_gropdf_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/devices/gropdf/gropdf.am b/src/devices/gropdf/gropdf.am
new file mode 100644
index 0000000..3dbd865
--- /dev/null
+++ b/src/devices/gropdf/gropdf.am
@@ -0,0 +1,58 @@
+# Copyright (C) 2011-2020 Free Software Foundation, Inc.
+# Written by Deri James <deri@chuzzlewit.myzen.co.uk>
+# Automake migration by Bertrand Garrigues
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+gropdf_dir = $(top_srcdir)/src/devices/gropdf
+
+bin_SCRIPTS += gropdf pdfmom
+EXTRA_DIST += \
+ src/devices/gropdf/TODO \
+ src/devices/gropdf/gropdf.pl \
+ src/devices/gropdf/pdfmom.pl \
+ src/devices/gropdf/gropdf.1.man \
+ src/devices/gropdf/pdfmom.1.man
+
+man1_MANS += \
+ src/devices/gropdf/gropdf.1 \
+ src/devices/gropdf/pdfmom.1
+
+gropdf: $(gropdf_dir)/gropdf.pl $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)$(RM) $@ \
+ && sed -f $(SH_DEPS_SED_SCRIPT) \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e "s|[@]PERL[@]|$(PERL)|" \
+ -e "s|[@]GROFF_FONT_DIR[@]|$(fontpath)|" \
+ -e "s|[@]RT_SEP[@]|$(RT_SEP)|" $(gropdf_dir)/gropdf.pl \
+ >$@ \
+ && chmod +x $@
+
+pdfmom: $(gropdf_dir)/pdfmom.pl $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)$(RM) $@ \
+ && sed -f $(SH_DEPS_SED_SCRIPT) \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e "s|[@]RT_SEP[@]|$(RT_SEP)|" \
+ -e "s|[@]PERL[@]|$(PERL)|" $(gropdf_dir)/pdfmom.pl \
+ >$@ \
+ && chmod +x $@
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/devices/gropdf/gropdf.pl b/src/devices/gropdf/gropdf.pl
new file mode 100644
index 0000000..c65a105
--- /dev/null
+++ b/src/devices/gropdf/gropdf.pl
@@ -0,0 +1,3928 @@
+#!@PERL@
+#
+# gropdf : PDF post processor for groff
+#
+# Copyright (C) 2011-2020 Free Software Foundation, Inc.
+# Written by Deri James <deri@chuzzlewit.myzen.co.uk>
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+use Getopt::Long qw(:config bundling);
+
+use constant
+{
+ WIDTH => 0,
+ CHRCODE => 1,
+ PSNAME => 2,
+ ASSIGNED => 3,
+ USED => 4,
+};
+
+my $prog=$0;
+
+my $gotzlib=0;
+
+my $rc = eval
+{
+ require Compress::Zlib;
+ Compress::Zlib->import();
+ 1;
+};
+
+if($rc)
+{
+ $gotzlib=1;
+}
+else
+{
+ Warn("Perl module 'Compress::Zlib' not available; cannot compress"
+ . " this PDF");
+}
+
+my %cfg;
+
+$cfg{GROFF_VERSION}='@VERSION@';
+$cfg{GROFF_FONT_PATH}='@GROFF_FONT_DIR@';
+$cfg{RT_SEP}='@RT_SEP@';
+binmode(STDOUT);
+
+my @obj; # Array of PDF objects
+my $objct=0; # Count of Objects
+my $fct=0; # Output count
+my %fnt; # Used fonts
+my $lct=0; # Input Line Count
+my $src_name='';
+my %env; # Current environment
+my %fontlst; # Fonts Loaded
+my $rot=0; # Portrait
+my %desc; # Contents of DESC
+my %download; # Contents of downlopad file
+my $pages; # Pointer to /Pages object
+my $devnm='devpdf';
+my $cpage; # Pointer to current pages
+my $cpageno=0; # Object no of current page
+my $cat; # Pointer to catalogue
+my $dests; # Pointer to Dests
+my @mediabox=(0,0,595,842);
+my @defaultmb=(0,0,595,842);
+my $stream=''; # Current Text/Graphics stream
+my $cftsz=10; # Current font sz
+my $cft; # Current Font
+my $lwidth=1; # current linewidth
+my $linecap=1;
+my $linejoin=1;
+my $textcol=''; # Current groff text
+my $fillcol=''; # Current groff fill
+my $curfill=''; # Current PDF fill
+my $strkcol='';
+my $curstrk='';
+my @lin=(); # Array holding current line of text
+my @ahead=(); # Buffer used to hol the next line
+my $mode='g'; # Graphic (g) or Text (t) mode;
+my $xpos=0; # Current X position
+my $ypos=0; # Current Y position
+my $tmxpos=0;
+my $kernadjust=0;
+my $curkern=0;
+my $widtbl; # Pointer to width table for current font size
+my $origwidtbl; # Pointer to width table
+my $krntbl; # Pointer to kern table
+my $matrix="1 0 0 1";
+my $whtsz; # Current width of a space
+my $poschg=0; # V/H pending
+my $fontchg=0; # font change pending
+my $tnum=2; # flatness of B-Spline curve
+my $tden=3; # flatness of B-Spline curve
+my $linewidth=40;
+my $w_flg=0;
+my $nomove=0;
+my $pendmv=0;
+my $gotT=0;
+my $suppress=0; # Suppress processing?
+my %incfil; # Included Files
+my @outlev=([0,undef,0,0]); # Structure pdfmark /OUT entries
+my $curoutlev=\@outlev;
+my $curoutlevno=0; # Growth point for @curoutlev
+my $Foundry='';
+my $xrev=0; # Reverse x direction of font
+my $matrixchg=0;
+my $wt=-1;
+my $thislev=1;
+my $mark=undef;
+my $suspendmark=undef;
+my $boxmax=0;
+my %missing; # fonts in download files which are not found/readable
+
+
+
+my $n_flg=1;
+my $pginsert=-1; # Growth point for kids array
+my %pgnames; # 'names' of pages for switchtopage
+my @outlines=(); # State of Bookmark Outlines at end of each page
+my $custompaper=0; # Has there been an X papersize
+my $textenccmap=''; # CMap for groff text.enc encoding
+my @XOstream=();
+my @PageAnnots={};
+my $noslide=0;
+my $transition={PAGE => {Type => '/Trans', S => '', D => 1, Dm => '/H', M => '/I', Di => 0, SS => 1.0, B => 0},
+ BLOCK => {Type => '/Trans', S => '', D => 1, Dm => '/H', M => '/I', Di => 0, SS => 1.0, B => 0}};
+my $firstpause=0;
+my $present=0;
+my @bgstack; # Stack of background boxes
+my $bgbox=''; # Draw commands for boxes on this page
+
+$noslide=1 if exists($ENV{GROPDF_NOSLIDE}) and $ENV{GROPDF_NOSLIDE};
+
+my %ppsz=(
+ 'ledger'=>[1224,792],
+ 'legal'=>[612,1008],
+ 'letter'=>[612,792],
+ 'a0'=>[2384,3370],
+ 'a1'=>[1684,2384],
+ 'a2'=>[1191,1684],
+ 'a3'=>[842,1191],
+ 'a4'=>[595,842],
+ 'a5'=>[420,595],
+ 'a6'=>[297,420],
+ 'a7'=>[210,297],
+ 'a8'=>[148,210],
+ 'a9'=>[105,148],
+ 'a10'=>[73,105],
+ 'b0'=>[2835,4008],
+ 'b1'=>[2004,2835],
+ 'b2'=>[1417,2004],
+ 'b3'=>[1001,1417],
+ 'b4'=>[709,1001],
+ 'b5'=>[499,709],
+ 'b6'=>[354,499],
+ 'c0'=>[2599,3677],
+ 'c1'=>[1837,2599],
+ 'c2'=>[1298,1837],
+ 'c3'=>[918,1298],
+ 'c4'=>[649,918],
+ 'c5'=>[459,649],
+ 'c6'=>[323,459],
+ 'com10'=>[297,684],
+);
+
+my $ucmap=<<'EOF';
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (Adobe)
+/Ordering (UCS)
+/Supplement 0
+>> def
+/CMapName /Adobe-Identity-UCS def
+/CMapType 2 def
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+2 beginbfrange
+<008b> <008f> [<00660066> <00660069> <0066006c> <006600660069> <00660066006C>]
+<00ad> <00ad> <002d>
+endbfrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+EOF
+
+sub usage
+{
+ my $stream = *STDOUT;
+ my $had_error = shift;
+ $stream = *STDERR if $had_error;
+ print $stream
+"usage: $prog [-dels] [-F font-directory] [-I inclusion-directory]" .
+" [-p paper-format] [-u [cmap-file]] [-y foundry] [file ...]\n" .
+"usage: $prog {-v | --version}\n" .
+"usage: $prog --help\n";
+ if (!$had_error)
+ {
+ print $stream "\n" .
+"Translate the output of troff(1) into Portable Document Format.\n" .
+"See the gropdf(1) manual page.\n";
+ }
+ exit($had_error);
+}
+
+my $fd;
+my $frot;
+my $fpsz;
+my $embedall=0;
+my $debug=0;
+my $want_help=0;
+my $version=0;
+my $stats=0;
+my $unicodemap;
+my @idirs;
+
+if (!GetOptions('F=s' => \$fd, 'I=s' => \@idirs, 'l' => \$frot,
+ 'p=s' => \$fpsz, 'd!' => \$debug, 'help' => \$want_help,
+ 'v' => \$version, 'version' => \$version,
+ 'e' => \$embedall, 'y=s' => \$Foundry, 's' => \$stats,
+ 'u:s' => \$unicodemap))
+{
+ &usage(1);
+}
+
+unshift(@idirs,'.');
+
+&usage(0) if ($want_help);
+
+if ($version)
+{
+ print "GNU gropdf (groff) version $cfg{GROFF_VERSION}\n";
+ exit;
+}
+
+if (defined($unicodemap))
+{
+ if ($unicodemap eq '')
+ {
+ $ucmap='';
+ }
+ elsif (-r $unicodemap)
+ {
+ local $/;
+ open(F,"<$unicodemap") or Die("failed to open '$unicodemap'");
+ ($ucmap)=(<F>);
+ close(F);
+ }
+ else
+ {
+ Warn("failed to find '$unicodemap'; ignoring");
+ }
+}
+
+# Search for 'font directory': paths in -f opt, shell var
+# GROFF_FONT_PATH, default paths
+
+my $fontdir=$cfg{GROFF_FONT_PATH};
+$fontdir=$ENV{GROFF_FONT_PATH}.$cfg{RT_SEP}.$fontdir if exists($ENV{GROFF_FONT_PATH});
+$fontdir=$fd.$cfg{RT_SEP}.$fontdir if defined($fd);
+
+$rot=90 if $frot;
+$matrix="0 1 -1 0" if $frot;
+
+LoadDownload();
+LoadDesc();
+
+my $unitwidth=$desc{unitwidth};
+
+$env{FontHT}=0;
+$env{FontSlant}=0;
+MakeMatrix();
+
+my $possiblesizes = $desc{papersize};
+$possiblesizes = $fpsz if $fpsz;
+my $papersz;
+for $papersz ( split(" ", lc($possiblesizes).' #duff#') )
+{
+ # No valid papersize found?
+ if ($papersz eq '#duff#')
+ {
+ Warn("ignoring unrecognized paper format(s) '$possiblesizes'");
+ last;
+ }
+
+ # Check for "/etc/papersize"
+ elsif (substr($papersz,0,1) eq '/' and -r $papersz)
+ {
+ if (open(P,"<$papersz"))
+ {
+ while (<P>)
+ {
+ chomp;
+ s/# .*//;
+ next if $_ eq '';
+ $papersz=lc($_);
+ last;
+ }
+ close(P);
+ }
+ }
+
+ # Allow height,width specified directly in centimeters, inches, or points.
+ if ($papersz=~m/([\d.]+)([cipP]),([\d.]+)([cipP])/)
+ {
+ @defaultmb=@mediabox=(0,0,ToPoints($3,$4),ToPoints($1,$2));
+ last;
+ }
+ # Look $papersz up as a name such as "a4" or "letter".
+ elsif (exists($ppsz{$papersz}))
+ {
+ @defaultmb=@mediabox=(0,0,$ppsz{$papersz}->[0],$ppsz{$papersz}->[1]);
+ last;
+ }
+ # Check for a landscape version
+ elsif (substr($papersz,-1) eq 'l' and exists($ppsz{substr($papersz,0,-1)}))
+ {
+ # Note 'legal' ends in 'l' but will be caught above
+ @defaultmb=@mediabox=(0,0,$ppsz{substr($papersz,0,-1)}->[1],$ppsz{substr($papersz,0,-1)}->[0]);
+ last;
+ }
+
+ # If we get here, $papersz was invalid, so try the next one.
+}
+
+my (@dt)=localtime($ENV{SOURCE_DATE_EPOCH} || time);
+my $dt=PDFDate(\@dt);
+
+my %info=('Creator' => "(groff version $cfg{GROFF_VERSION})",
+ 'Producer' => "(gropdf version $cfg{GROFF_VERSION})",
+ 'ModDate' => "($dt)",
+ 'CreationDate' => "($dt)");
+map { $_="< ".$_."\0" } @ARGV;
+
+while (<>)
+{
+ chomp;
+ s/\r$//;
+ $lct++;
+
+ do # The ahead buffer behaves like 'ungetc'
+ {{
+ if (scalar(@ahead))
+ {
+ $_=shift(@ahead);
+ }
+
+
+ my $cmd=substr($_,0,1);
+ next if $cmd eq '#'; # just a comment
+ my $lin=substr($_,1);
+
+ while ($cmd eq 'w')
+ {
+ $cmd=substr($lin,0,1);
+ $lin=substr($lin,1);
+ $w_flg=1 if $gotT;
+ }
+
+ $lin=~s/^\s+//;
+# $lin=~s/\s#.*?$//; # remove comment
+ $stream.="\% $_\n" if $debug;
+
+ do_x($lin),next if ($cmd eq 'x');
+ next if $suppress;
+ do_p($lin),next if ($cmd eq 'p');
+ do_f($lin),next if ($cmd eq 'f');
+ do_s($lin),next if ($cmd eq 's');
+ do_m($lin),next if ($cmd eq 'm');
+ do_D($lin),next if ($cmd eq 'D');
+ do_V($lin),next if ($cmd eq 'V');
+ do_v($lin),next if ($cmd eq 'v');
+ do_t($lin),next if ($cmd eq 't');
+ do_u($lin),next if ($cmd eq 'u');
+ do_C($lin),next if ($cmd eq 'C');
+ do_c($lin),next if ($cmd eq 'c');
+ do_N($lin),next if ($cmd eq 'N');
+ do_h($lin),next if ($cmd eq 'h');
+ do_H($lin),next if ($cmd eq 'H');
+ do_n($lin),next if ($cmd eq 'n');
+
+ my $tmp=scalar(@ahead);
+ }} until scalar(@ahead) == 0;
+
+}
+
+exit 0 if $lct==0;
+
+if ($cpageno > 0)
+{
+ my $trans='BLOCK';
+
+ $trans='PAGE' if $firstpause;
+
+ if (scalar(@XOstream))
+ {
+ MakeXO() if $stream;
+ $stream=join("\n",@XOstream)."\n";
+ }
+
+ my %t=%{$transition->{$trans}};
+ $cpage->{MediaBox}=\@mediabox if $custompaper;
+ $cpage->{Trans}=FixTrans(\%t) if $t{S};
+
+ if ($#PageAnnots >= 0)
+ {
+ @{$cpage->{Annots}}=@PageAnnots;
+ }
+
+ if ($#bgstack > -1 or $bgbox)
+ {
+ my $box="q 1 0 0 1 0 0 cm ";
+
+ foreach my $bg (@bgstack)
+ {
+ # 0=$bgtype # 1=stroke 2=fill. 4=page
+ # 1=$strkcol
+ # 2=$fillcol
+ # 3=(Left,Top,Right,bottom,LineWeight)
+ # 4=Start ypos
+ # 5=Endypos
+ # 6=Line Weight
+
+ my $pg=$bg->[3] || \@mediabox;
+
+ $bg->[5]=$pg->[3]; # box is continuing to next page
+ $box.=DrawBox($bg);
+ $bg->[4]=$pg->[1]; # will continue from page top
+ }
+
+ $stream=$box.$bgbox."Q\n".$stream;
+ $bgbox='';
+ }
+
+ $boxmax=0;
+ PutObj($cpageno);
+ OutStream($cpageno+1);
+}
+
+$cat->{PageMode}='/FullScreen' if $present;
+
+PutOutlines(\@outlev);
+
+PutObj(1);
+
+my $info=BuildObj(++$objct,\%info);
+
+PutObj($objct);
+
+foreach my $fontno (sort keys %fontlst)
+{
+ my $o=$fontlst{$fontno}->{FNT};
+
+ foreach my $ch (@{$o->{NO}})
+ {
+ my $psname=$o->{NAM}->{$ch->[1]}->[PSNAME] || '/.notdef';
+ my $wid=$o->{NAM}->{$ch->[1]}->[WIDTH] || 0;
+
+ push(@{$o->{DIFF}},$psname);
+ push(@{$o->{WIDTH}},$wid);
+ last if $#{$o->{DIFF}} >= 256;
+ }
+ unshift(@{$o->{DIFF}},0);
+ my $p=GetObj($fontlst{$fontno}->{OBJ});
+
+ if (exists($p->{LastChar}) and $p->{LastChar} > 255)
+ {
+ $p->{LastChar} = 255;
+ splice(@{$o->{DIFF}},257);
+ splice(@{$o->{WIDTH}},257);
+ }
+}
+
+foreach my $o (3..$objct)
+{
+ PutObj($o) if (!exists($obj[$o]->{XREF}));
+}
+
+#my $encrypt=BuildObj(++$objct,{'Filter' => '/Standard', 'V' => 1, 'R' => 2, 'P' => 252});
+#PutObj($objct);
+PutObj(2);
+
+my $xrefct=$fct;
+
+$objct+=1;
+print "xref\n0 $objct\n0000000000 65535 f \n";
+
+foreach my $xr (@obj)
+{
+ next if !defined($xr);
+ printf("%010d 00000 n \n",$xr->{XREF});
+}
+
+print "trailer\n<<\n/Info $info\n/Root 1 0 R\n/Size $objct\n>>\nstartxref\n$fct\n\%\%EOF\n";
+print "\% Pages=$pages->{Count}\n" if $stats;
+
+
+sub MakeMatrix
+{
+ my $fontxrev=shift||0;
+ my @mat=($frot)?(0,1,-1,0):(1,0,0,1);
+
+ if (!$frot)
+ {
+ if ($env{FontHT} != 0)
+ {
+ $mat[3]=sprintf('%.3f',$env{FontHT}/$cftsz);
+ }
+
+ if ($env{FontSlant} != 0)
+ {
+ my $slant=$env{FontSlant};
+ $slant*=$env{FontHT}/$cftsz if $env{FontHT} != 0;
+ my $ang=rad($slant);
+
+ $mat[2]=sprintf('%.3f',sin($ang)/cos($ang));
+ }
+
+ if ($fontxrev)
+ {
+ $mat[0]=-$mat[0];
+ }
+ }
+
+ $matrix=join(' ',@mat);
+ $matrixchg=1;
+}
+
+sub PutOutlines
+{
+ my $o=shift;
+ my $outlines;
+
+ if ($#{$o} > 0)
+ {
+ # We've got Outlines to deal with
+ my $openct=$curoutlev->[0]->[2];
+
+ while ($thislev-- > 1)
+ {
+ my $nxtoutlev=$curoutlev->[0]->[1];
+ $nxtoutlev->[0]->[2]+=$openct if $curoutlev->[0]->[3]==1;
+ $openct=0 if $nxtoutlev->[0]->[3]==-1;
+ $curoutlev=$nxtoutlev;
+ }
+
+ $cat->{Outlines}=BuildObj(++$objct,{'Count' => abs($o->[0]->[0])+$o->[0]->[2]});
+ $outlines=$obj[$objct]->{DATA};
+ }
+ else
+ {
+ return;
+ }
+
+ SetOutObj($o);
+
+ $outlines->{First}=$o->[1]->[2];
+ $outlines->{Last}=$o->[$#{$o}]->[2];
+
+ LinkOutObj($o,$cat->{Outlines});
+}
+
+sub SetOutObj
+{
+ my $o=shift;
+
+ for my $j (1..$#{$o})
+ {
+ my $ono=BuildObj(++$objct,$o->[$j]->[0]);
+ $o->[$j]->[2]=$ono;
+
+ SetOutObj($o->[$j]->[1]) if $#{$o->[$j]->[1]} > -1;
+ }
+}
+
+sub LinkOutObj
+{
+ my $o=shift;
+ my $parent=shift;
+
+ for my $j (1..$#{$o})
+ {
+ my $op=GetObj($o->[$j]->[2]);
+
+ $op->{Next}=$o->[$j+1]->[2] if ($j < $#{$o});
+ $op->{Prev}=$o->[$j-1]->[2] if ($j > 1);
+ $op->{Parent}=$parent;
+
+ if ($#{$o->[$j]->[1]} > -1)
+ {
+ $op->{Count}=$o->[$j]->[1]->[0]->[2]*$o->[$j]->[1]->[0]->[3];# if exists($op->{Count}) and $op->{Count} > 0;
+ $op->{First}=$o->[$j]->[1]->[1]->[2];
+ $op->{Last}=$o->[$j]->[1]->[$#{$o->[$j]->[1]}]->[2];
+ LinkOutObj($o->[$j]->[1],$o->[$j]->[2]);
+ }
+ }
+}
+
+sub GetObj
+{
+ my $ono=shift;
+ ($ono)=split(' ',$ono);
+ return($obj[$ono]->{DATA});
+}
+
+
+
+sub PDFDate
+{
+ my $dt=shift;
+ return(sprintf("D:%04d%02d%02d%02d%02d%02d%+03d'00'",$dt->[5]+1900,$dt->[4]+1,$dt->[3],$dt->[2],$dt->[1],$dt->[0],( localtime time() + 3600*( 12 - (gmtime)[2] ) )[2] - 12));
+}
+
+sub ToPoints
+{
+ my $num=shift;
+ my $unit=shift;
+
+ if ($unit eq 'i')
+ {
+ return($num*72);
+ }
+ elsif ($unit eq 'c')
+ {
+ return int($num*72/2.54);
+ }
+ elsif ($unit eq 'm') # millimetres
+ {
+ return int($num*72/25.4);
+ }
+ elsif ($unit eq 'p')
+ {
+ return($num);
+ }
+ elsif ($unit eq 'P')
+ {
+ return($num*6);
+ }
+ elsif ($unit eq 'z')
+ {
+ return($num/$unitwidth);
+ }
+ else
+ {
+ Die("invalid scaling unit '$unit'");
+ }
+}
+
+sub LoadDownload
+{
+ my $f;
+ my $found=0;
+
+ my (@dirs)=split($cfg{RT_SEP},$fontdir);
+
+ foreach my $dir (@dirs)
+ {
+ $f=undef;
+ OpenFile(\$f,$dir,"download");
+ next if !defined($f);
+ $found++;
+
+ while (<$f>)
+ {
+ chomp;
+ s/#.*$//;
+ next if $_ eq '';
+ my ($foundry,$name,$file)=split(/\t+/);
+ if (substr($file,0,1) eq '*')
+ {
+ next if !$embedall;
+ $file=substr($file,1);
+ }
+
+ my $pth=$file;
+ $pth=$dir."/$devnm/$file" if substr($file,0,1) ne '/';
+
+ if (!-r $pth)
+ {
+ $missing{"$foundry $name"}="$dir/$devnm";
+ next;
+ }
+
+ $download{"$foundry $name"}=$file if !exists($download{"$foundry $name"});
+ }
+
+ close($f);
+ }
+
+ Die("failed to open 'download' file") if !$found;
+}
+
+sub OpenFile
+{
+ my $f=shift;
+ my $dirs=shift;
+ my $fnm=shift;
+
+ if (substr($fnm,0,1) eq '/' or substr($fnm,1,1) eq ':') # dos
+ {
+ return if -r "$fnm" and open($$f,"<$fnm");
+ }
+
+ my (@dirs)=split($cfg{RT_SEP},$dirs);
+
+ foreach my $dir (@dirs)
+ {
+ last if -r "$dir/$devnm/$fnm" and open($$f,"<$dir/$devnm/$fnm");
+ }
+}
+
+sub LoadDesc
+{
+ my $f;
+
+ OpenFile(\$f,$fontdir,"DESC");
+ Die("failed to open device description file 'DESC'")
+ if !defined($f);
+
+ while (<$f>)
+ {
+ chomp;
+ s/#.*$//;
+ next if $_ eq '';
+ my ($name,$prms)=split(' ',$_,2);
+ $desc{lc($name)}=$prms;
+ }
+
+ close($f);
+
+ foreach my $directive ('unitwidth', 'res', 'sizescale')
+ {
+ Die("device description file 'DESC' missing mandatory directive"
+ . " '$directive'") if !exists($desc{$directive});
+ }
+
+ foreach my $directive ('unitwidth', 'res', 'sizescale')
+ {
+ my $val=$desc{$directive};
+ Die("device description file 'DESC' directive '$directive'"
+ . " value must be positive; got '$val'")
+ if ($val !~ m/^\d+$/ or $val <= 0);
+ }
+
+ if (exists($desc{'hor'}))
+ {
+ my $hor=$desc{'hor'};
+ Die("device horizontal motion quantum must be 1, got '$hor'")
+ if ($hor != 1);
+ }
+
+ if (exists($desc{'vert'}))
+ {
+ my $vert=$desc{'vert'};
+ Die("device vertical motion quantum must be 1, got '$vert'")
+ if ($vert != 1);
+ }
+
+ my ($res,$ss)=($desc{'res'},$desc{'sizescale'});
+ Die("device resolution must be a multiple of 72*sizescale, got"
+ . " '$res' ('sizescale'=$ss)") if (($res % ($ss * 72)) != 0);
+}
+
+sub rad { $_[0]*3.14159/180 }
+
+my $InPicRotate=0;
+
+sub do_x
+{
+ my $l=shift;
+ my ($xcmd,@xprm)=split(' ',$l);
+ $xcmd=substr($xcmd,0,1);
+
+ if ($xcmd eq 'T')
+ {
+ Warn("expecting a PDF pipe (got $xprm[0])")
+ if $xprm[0] ne substr($devnm,3);
+ }
+ elsif ($xcmd eq 'f') # Register Font
+ {
+ $xprm[1]="${Foundry}-$xprm[1]" if $Foundry ne '';
+ LoadFont($xprm[0],$xprm[1]);
+ }
+ elsif ($xcmd eq 'F') # Source File (for errors)
+ {
+ $env{SourceFile}=$xprm[0];
+ }
+ elsif ($xcmd eq 'H') # FontHT
+ {
+ $xprm[0]/=$unitwidth;
+ $xprm[0]=0 if $xprm[0] == $cftsz;
+ $env{FontHT}=$xprm[0];
+ MakeMatrix();
+ }
+ elsif ($xcmd eq 'S') # FontSlant
+ {
+ $env{FontSlant}=$xprm[0];
+ MakeMatrix();
+ }
+ elsif ($xcmd eq 'i') # Initialise
+ {
+ if ($objct == 0)
+ {
+ $objct++;
+ @defaultmb=@mediabox;
+ BuildObj($objct,{'Pages' => BuildObj($objct+1,
+ {'Kids' => [],
+ 'Count' => 0,
+ 'Type' => '/Pages',
+ 'Rotate' => $rot,
+ 'MediaBox' => \@defaultmb,
+ 'Resources' =>
+ {'Font' => {},
+ 'ProcSet' => ['/PDF', '/Text', '/ImageB', '/ImageC', '/ImageI']}
+ }
+ ),
+ 'Type' => '/Catalog'});
+
+ $cat=$obj[$objct]->{DATA};
+ $objct++;
+ $pages=$obj[2]->{DATA};
+ Put("%PDF-1.4\n\x25\xe2\xe3\xcf\xd3\n");
+ }
+ }
+ elsif ($xcmd eq 'X')
+ {
+ # There could be extended args
+ do
+ {{
+ LoadAhead(1);
+ if (substr($ahead[0],0,1) eq '+')
+ {
+ $l.="\n".substr($ahead[0],1);
+ shift(@ahead);
+ }
+ }} until $#ahead==0;
+
+ ($xcmd,@xprm)=split(' ',$l);
+ $xcmd=substr($xcmd,0,1);
+
+ if ($xprm[0]=~m/^(.+:)(.+)/)
+ {
+ splice(@xprm,1,0,$2);
+ $xprm[0]=$1;
+ }
+
+ my $par=join(' ',@xprm[1..$#xprm]);
+
+ if ($xprm[0] eq 'ps:')
+ {
+ if ($xprm[1] eq 'invis')
+ {
+ $suppress=1;
+ }
+ elsif ($xprm[1] eq 'endinvis')
+ {
+ $suppress=0;
+ }
+ elsif ($par=~m/exec gsave currentpoint 2 copy translate (.+) rotate neg exch neg exch translate/)
+ {
+ # This is added by gpic to rotate a single object
+
+ my $theta=-rad($1);
+
+ IsGraphic();
+ my ($curangle,$hyp)=RtoP($xpos,GraphY($ypos));
+ my ($x,$y)=PtoR($theta+$curangle,$hyp);
+ my ($tx, $ty) = ($xpos - $x, GraphY($ypos) - $y);
+ if ($frot) {
+ ($tx, $ty) = ($tx * sin($theta) + $ty * -cos($theta),
+ $tx * -cos($theta) + $ty * -sin($theta));
+ }
+ $stream.="q\n".sprintf("%.3f %.3f %.3f %.3f %.3f %.3f cm",cos($theta),sin($theta),-sin($theta),cos($theta),$tx,$ty)."\n";
+ $InPicRotate=1;
+ }
+ elsif ($par=~m/exec grestore/ and $InPicRotate)
+ {
+ IsGraphic();
+ $stream.="Q\n";
+ $InPicRotate=0;
+ }
+ elsif ($par=~m/exec (\d) setlinejoin/)
+ {
+ IsGraphic();
+ $linejoin=$1;
+ $stream.="$linejoin j\n";
+ }
+ elsif ($par=~m/exec (\d) setlinecap/)
+ {
+ IsGraphic();
+ $linecap=$1;
+ $stream.="$linecap J\n";
+ }
+ elsif ($par=~m/exec %%%%PAUSE/i and !$noslide)
+ {
+ my $trans='BLOCK';
+
+ if ($firstpause)
+ {
+ $trans='PAGE';
+ $firstpause=0;
+ }
+ MakeXO();
+ NewPage($trans);
+ $present=1;
+ }
+ elsif ($par=~m/exec %%%%BEGINONCE/)
+ {
+ if ($noslide)
+ {
+ $suppress=1;
+ }
+ else
+ {
+ my $trans='BLOCK';
+
+ if ($firstpause)
+ {
+ $trans='PAGE';
+ $firstpause=0;
+ }
+ MakeXO();
+ NewPage($trans);
+ $present=1;
+ }
+ }
+ elsif ($par=~m/exec %%%%ENDONCE/)
+ {
+ if ($noslide)
+ {
+ $suppress=0;
+ }
+ else
+ {
+ MakeXO();
+ NewPage('BLOCK');
+ $cat->{PageMode}='/FullScreen';
+ pop(@XOstream);
+ }
+ }
+ elsif ($par=~m/\[(.+) pdfmark/)
+ {
+ my $pdfmark=$1;
+ $pdfmark=~s((\d{4,6}) u)(sprintf("%.1f",$1/$desc{sizescale}))eg;
+ $pdfmark=~s(\\\[u00(..)\])(chr(hex($1)))eg;
+ $pdfmark=~s/\\n/\n/g;
+
+ if ($pdfmark=~m/(.+) \/DOCINFO\s*$/s)
+ {
+ my @xwds=split(/ /,"<< $1 >>");
+ my $docinfo=ParsePDFValue(\@xwds);
+
+ foreach my $k (sort keys %{$docinfo})
+ {
+ $info{$k}=$docinfo->{$k} if $k ne 'Producer';
+ }
+ }
+ elsif ($pdfmark=~m/(.+) \/DOCVIEW\s*$/)
+ {
+ my @xwds=split(' ',"<< $1 >>");
+ my $docview=ParsePDFValue(\@xwds);
+
+ foreach my $k (sort keys %{$docview})
+ {
+ $cat->{$k}=$docview->{$k} if !exists($cat->{$k});
+ }
+ }
+ elsif ($pdfmark=~m/(.+) \/DEST\s*$/)
+ {
+ my @xwds=split(' ',"<< $1 >>");
+ my $dest=ParsePDFValue(\@xwds);
+ $dest->{View}->[1]=GraphY($dest->{View}->[1]*-1);
+ unshift(@{$dest->{View}},"$cpageno 0 R");
+
+ if (!defined($dests))
+ {
+ $cat->{Dests}=BuildObj(++$objct,{});
+ $dests=$obj[$objct]->{DATA};
+ }
+
+ my $k=substr($dest->{Dest},1);
+ $dests->{$k}=$dest->{View};
+ }
+ elsif ($pdfmark=~m/(.+) \/ANN\s*$/)
+ {
+ my $l=$1;
+ $l=~s/Color/C/;
+ $l=~s/Action/A/;
+ $l=~s/Title/T/;
+ $l=~s'/Subtype /URI'/S /URI';
+ my @xwds=split(' ',"<< $l >>");
+ my $annotno=BuildObj(++$objct,ParsePDFValue(\@xwds));
+ my $annot=$obj[$objct];
+ $annot->{DATA}->{Type}='/Annot';
+ FixRect($annot->{DATA}->{Rect}); # Y origin to ll
+ FixPDFColour($annot->{DATA});
+ push(@PageAnnots,$annotno);
+ }
+ elsif ($pdfmark=~m/(.+) \/OUT\s*$/)
+ {
+ my $t=$1;
+ $t=~s/\\\) /\\\\\) /g;
+ $t=~s/\\e/\\\\/g;
+ $t=~m/(^.*\/Title \()(.*)(\).*)/;
+ my ($pre,$title,$post)=($1,$2,$3);
+ $title=~s/(?<!\\)\(/\\\(/g;
+ $title=~s/(?<!\\)\)/\\\)/g;
+ my @xwds=split(' ',"<< $pre$title$post >>");
+ my $out=ParsePDFValue(\@xwds);
+
+ my $this=[$out,[]];
+
+ if (exists($out->{Level}))
+ {
+ my $lev=abs($out->{Level});
+ my $levsgn=sgn($out->{Level});
+ delete($out->{Level});
+
+ if ($lev > $thislev)
+ {
+ my $thisoutlev=$curoutlev->[$#{$curoutlev}]->[1];
+ $thisoutlev->[0]=[0,$curoutlev,0,$levsgn];
+ $curoutlev=$thisoutlev;
+ $curoutlevno=$#{$curoutlev};
+ $thislev++;
+ }
+ elsif ($lev < $thislev)
+ {
+ my $openct=$curoutlev->[0]->[2];
+
+ while ($thislev > $lev)
+ {
+ my $nxtoutlev=$curoutlev->[0]->[1];
+ $nxtoutlev->[0]->[2]+=$openct if $curoutlev->[0]->[3]==1;
+ $openct=0 if $nxtoutlev->[0]->[3]==-1;
+ $curoutlev=$nxtoutlev;
+ $thislev--;
+ }
+
+ $curoutlevno=$#{$curoutlev};
+ }
+
+# push(@{$curoutlev},$this);
+ splice(@{$curoutlev},++$curoutlevno,0,$this);
+ $curoutlev->[0]->[2]++;
+ }
+ else
+ {
+ # This code supports old pdfmark.tmac, unused by pdf.tmac
+ while ($curoutlev->[0]->[0] == 0 and defined($curoutlev->[0]->[1]))
+ {
+ $curoutlev=$curoutlev->[0]->[1];
+ }
+
+ $curoutlev->[0]->[0]--;
+ $curoutlev->[0]->[2]++;
+ push(@{$curoutlev},$this);
+
+
+ if (exists($out->{Count}) and $out->{Count} != 0)
+ {
+ push(@{$this->[1]},[abs($out->{Count}),$curoutlev,0,sgn($out->{Count})]);
+ $curoutlev=$this->[1];
+
+ if ($out->{Count} > 0)
+ {
+ my $p=$curoutlev;
+
+ while (defined($p))
+ {
+ $p->[0]->[2]+=$out->{Count};
+ $p=$p->[0]->[1];
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ elsif (lc($xprm[0]) eq 'pdf:')
+ {
+ if (lc($xprm[1]) eq 'import')
+ {
+ my $fil=$xprm[2];
+ my $llx=$xprm[3];
+ my $lly=$xprm[4];
+ my $urx=$xprm[5];
+ my $ury=$xprm[6];
+ my $wid=GetPoints($xprm[7]);
+ my $hgt=GetPoints($xprm[8])||-1;
+ my $mat=[1,0,0,1,0,0];
+
+ if (!exists($incfil{$fil}))
+ {
+ if ($fil=~m/\.pdf$/)
+ {
+ $incfil{$fil}=LoadPDF($fil,$mat,$wid,$hgt,"import");
+ }
+ elsif ($fil=~m/\.swf$/)
+ {
+ my $xscale=$wid/($urx-$llx+1);
+ my $yscale=($hgt<=0)?$xscale:($hgt/($ury-$lly+1));
+ $hgt=($ury-$lly+1)*$yscale;
+
+ if ($rot)
+ {
+ $mat->[3]=$xscale;
+ $mat->[0]=$yscale;
+ }
+ else
+ {
+ $mat->[0]=$xscale;
+ $mat->[3]=$yscale;
+ }
+
+ $incfil{$fil}=LoadSWF($fil,[$llx,$lly,$urx,$ury],$mat);
+ }
+ else
+ {
+ Warn("unrecognized 'import' file type '$fil'");
+ return undef;
+ }
+ }
+
+ if (defined($incfil{$fil}))
+ {
+ IsGraphic();
+ if ($fil=~m/\.pdf$/)
+ {
+ my $bbox=$incfil{$fil}->[1];
+ my $xscale=d3($wid/($bbox->[2]-$bbox->[0]+1));
+ my $yscale=d3(($hgt<=0)?$xscale:($hgt/($bbox->[3]-$bbox->[1]+1)));
+ $wid=($bbox->[2]-$bbox->[0])*$xscale;
+ $hgt=($bbox->[3]-$bbox->[1])*$yscale;
+ $ypos+=$hgt;
+ $stream.="q $xscale 0 0 $yscale ".PutXY($xpos,$ypos)." cm";
+ $stream.=" 0 1 -1 0 0 0 cm" if $rot;
+ $stream.=" /$incfil{$fil}->[0] Do Q\n";
+ }
+ elsif ($fil=~m/\.swf$/)
+ {
+ $stream.=PutXY($xpos,$ypos)." m /$incfil{$fil} Do\n";
+ }
+ }
+ }
+ elsif (lc($xprm[1]) eq 'pdfpic')
+ {
+ my $fil=$xprm[2];
+ my $flag=uc($xprm[3]||'-L');
+ my $wid=GetPoints($xprm[4])||-1;
+ my $hgt=GetPoints($xprm[5]||-1);
+ my $ll=GetPoints($xprm[6]||0);
+ my $mat=[1,0,0,1,0,0];
+
+ if (!exists($incfil{$fil}))
+ {
+ $incfil{$fil}=LoadPDF($fil,$mat,$wid,$hgt,"pdfpic");
+ }
+
+ if (defined($incfil{$fil}))
+ {
+ IsGraphic();
+ my $bbox=$incfil{$fil}->[1];
+ $wid=($bbox->[2]-$bbox->[0]) if $wid <= 0;
+ my $xscale=d3($wid/($bbox->[2]-$bbox->[0]));
+ my $yscale=d3(($hgt<=0)?$xscale:($hgt/($bbox->[3]-$bbox->[1])));
+ $xscale=($wid<=0)?$yscale:$xscale;
+ $xscale=$yscale if $yscale < $xscale;
+ $yscale=$xscale if $xscale < $yscale;
+ $wid=($bbox->[2]-$bbox->[0])*$xscale;
+ $hgt=($bbox->[3]-$bbox->[1])*$yscale;
+
+ if ($flag eq '-C' and $ll > $wid)
+ {
+ $xpos+=int(($ll-$wid)/2);
+ }
+ elsif ($flag eq '-R' and $ll > $wid)
+ {
+ $xpos+=$ll-$wid;
+ }
+
+ $ypos+=$hgt;
+ $stream.="q $xscale 0 0 $yscale ".PutXY($xpos,$ypos)." cm";
+ $stream.=" 0 1 -1 0 0 0 cm" if $rot;
+ $stream.=" /$incfil{$fil}->[0] Do Q\n";
+ }
+ }
+ elsif (lc($xprm[1]) eq 'xrev')
+ {
+ $xrev=!$xrev;
+ }
+ elsif (lc($xprm[1]) eq 'markstart')
+ {
+ $mark={'rst' => ($xprm[2]+$xprm[4])/$unitwidth, 'rsb' => ($xprm[3]-$xprm[4])/$unitwidth, 'xpos' => $xpos-($xprm[4]/$unitwidth),
+ 'ypos' => $ypos, 'lead' => $xprm[4]/$unitwidth, 'pdfmark' => join(' ',@xprm[5..$#xprm])};
+ }
+ elsif (lc($xprm[1]) eq 'markend')
+ {
+ PutHotSpot($xpos) if defined($mark);
+ $mark=undef;
+ }
+ elsif (lc($xprm[1]) eq 'marksuspend')
+ {
+ $suspendmark=$mark;
+ $mark=undef;
+ }
+ elsif (lc($xprm[1]) eq 'markrestart')
+ {
+ $mark=$suspendmark;
+ $suspendmark=undef;
+ }
+ elsif (lc($xprm[1]) eq 'pagename')
+ {
+ if ($pginsert > -1)
+ {
+ $pgnames{$xprm[2]}=$pages->{Kids}->[$pginsert];
+ }
+ else
+ {
+ $pgnames{$xprm[2]}='top';
+ }
+ }
+ elsif (lc($xprm[1]) eq 'switchtopage')
+ {
+ my $ba=$xprm[2];
+ my $want=$xprm[3];
+
+ if ($pginsert > -1)
+ {
+ if (!defined($want) or $want eq '')
+ {
+ # no before/after
+ $want=$ba;
+ $ba='before';
+ }
+
+ if (!defined($ba) or $ba eq '' or $want eq 'bottom')
+ {
+ $pginsert=$#{$pages->{Kids}};
+ }
+ elsif ($want eq 'top')
+ {
+ $pginsert=-1;
+ }
+ else
+ {
+ if (exists($pgnames{$want}))
+ {
+ my $ref=$pgnames{$want};
+
+ if ($ref eq 'top')
+ {
+ $pginsert=-1;
+ }
+ else
+ {
+ FIND: while (1)
+ {
+ foreach my $j (0..$#{$pages->{Kids}})
+ {
+ if ($ref eq $pages->{Kids}->[$j])
+ {
+ if ($ba eq 'before')
+ {
+ $pginsert=$j-1;
+ last FIND;
+ }
+ elsif ($ba eq 'after')
+ {
+ $pginsert=$j;
+ last FIND;
+ }
+ else
+ {
+ # XXX: indentation wince
+ Warn(
+"expected 'switchtopage' parameter to be one of"
+. "'top|bottom|before|after', got '$ba'");
+ last FIND;
+ }
+ }
+
+ }
+
+ Warn("cannot find page ref '$ref'");
+ last FIND
+
+ }
+ }
+ }
+ else
+ {
+ Warn("cannot find page named '$want'");
+ }
+ }
+
+ if ($pginsert < 0)
+ {
+ ($curoutlev,$curoutlevno,$thislev)=(\@outlev,0,1);
+ }
+ else
+ {
+ ($curoutlev,$curoutlevno,$thislev)=(@{$outlines[$pginsert]});
+ }
+ }
+ }
+ elsif (lc($xprm[1]) eq 'transition' and !$noslide)
+ {
+ if (uc($xprm[2]) eq 'PAGE' or uc($xprm[2] eq 'SLIDE'))
+ {
+ $transition->{PAGE}->{S}='/'.ucfirst($xprm[3]) if $xprm[3] and $xprm[3] ne '.';
+ $transition->{PAGE}->{D}=$xprm[4] if $xprm[4] and $xprm[4] ne '.';
+ $transition->{PAGE}->{Dm}='/'.$xprm[5] if $xprm[5] and $xprm[5] ne '.';
+ $transition->{PAGE}->{M}='/'.$xprm[6] if $xprm[6] and $xprm[6] ne '.';
+ $xprm[7]='/None' if $xprm[7] and uc($xprm[7]) eq 'NONE';
+ $transition->{PAGE}->{Di}=$xprm[7] if $xprm[7] and $xprm[7] ne '.';
+ $transition->{PAGE}->{SS}=$xprm[8] if $xprm[8] and $xprm[8] ne '.';
+ $transition->{PAGE}->{B}=$xprm[9] if $xprm[9] and $xprm[9] ne '.';
+ }
+ elsif (uc($xprm[2]) eq 'BLOCK')
+ {
+ $transition->{BLOCK}->{S}='/'.ucfirst($xprm[3]) if $xprm[3] and $xprm[3] ne '.';
+ $transition->{BLOCK}->{D}=$xprm[4] if $xprm[4] and $xprm[4] ne '.';
+ $transition->{BLOCK}->{Dm}='/'.$xprm[5] if $xprm[5] and $xprm[5] ne '.';
+ $transition->{BLOCK}->{M}='/'.$xprm[6] if $xprm[6] and $xprm[6] ne '.';
+ $xprm[7]='/None' if $xprm[7] and uc($xprm[7]) eq 'NONE';
+ $transition->{BLOCK}->{Di}=$xprm[7] if $xprm[7] and $xprm[7] ne '.';
+ $transition->{BLOCK}->{SS}=$xprm[8] if $xprm[8] and $xprm[8] ne '.';
+ $transition->{BLOCK}->{B}=$xprm[9] if $xprm[9] and $xprm[9] ne '.';
+ }
+
+ $present=1;
+ }
+ elsif (lc($xprm[1]) eq 'background')
+ {
+ splice(@xprm,0,2);
+ my $type=shift(@xprm);
+# print STDERR "ypos=$ypos\n";
+
+ if (lc($type) eq 'off')
+ {
+ my $sptr=$#bgstack;
+ if ($sptr > -1)
+ {
+ if ($sptr == 0 and $bgstack[0]->[0] & 4)
+ {
+ pop(@bgstack);
+ }
+ else
+ {
+ $bgstack[$sptr]->[5]=GraphY($ypos);
+ $bgbox=DrawBox(pop(@bgstack)).$bgbox;
+ }
+ }
+ }
+ elsif (lc($type) eq 'footnote')
+ {
+ my $t=GetPoints($xprm[0]);
+ $boxmax=($t<0)?abs($t):GraphY($t);
+ }
+ else
+ {
+ my $bgtype=0;
+
+ foreach (@xprm)
+ {
+ $_=GetPoints($_);
+ }
+
+ $bgtype|=2 if $type=~m/box/i;
+ $bgtype|=1 if $type=~m/fill/i;
+ $bgtype|=4 if $type=~m/page/i;
+ $bgtype=5 if $bgtype==4;
+ my $bgwt=$xprm[4];
+ $bgwt=$xprm[0] if !defined($bgwt) and $#xprm == 0;
+ my (@bg)=(@xprm);
+ my $bg=\@bg;
+
+ if (!defined($bg[3]) or $bgtype & 4)
+ {
+ $bg=undef;
+ }
+ else
+ {
+ FixRect($bg);
+ }
+
+ if ($bgtype)
+ {
+ if ($bgtype & 4)
+ {
+ shift(@bgstack) if $#bgstack >= 0 and $bgstack[0]->[0] & 4;
+ unshift(@bgstack,[$bgtype,$strkcol,$fillcol,$bg,GraphY($ypos),GraphY($bg[3]||0),$bgwt || 0.4]);
+ }
+ else
+ {
+ push(@bgstack,[$bgtype,$strkcol,$fillcol,$bg,GraphY($ypos),GraphY($bg[3]||0),$bgwt || 0.4]);
+ }
+ }
+ }
+ }
+ }
+ elsif (lc(substr($xprm[0],0,9)) eq 'papersize')
+ {
+ my ($px,$py)=split(',',substr($xprm[0],10));
+ $px=GetPoints($px);
+ $py=GetPoints($py);
+ @mediabox=(0,0,$px,$py);
+ my @mb=@mediabox;
+ $matrixchg=1;
+ $custompaper=1;
+ $cpage->{MediaBox}=\@mb;
+ }
+ }
+}
+
+sub FixPDFColour
+{
+ my $o=shift;
+ my $a=$o->{C};
+ my @r=();
+ my $c=$a->[0];
+
+ if ($#{$a}==3)
+ {
+ if ($c > 1)
+ {
+ foreach my $j (0..2)
+ {
+ push(@r,sprintf("%1.3f",$a->[$j]/0xffff));
+ }
+
+ $o->{C}=\@r;
+ }
+ }
+ elsif (substr($c,0,1) eq '#')
+ {
+ if (length($c) == 7)
+ {
+ foreach my $j (0..2)
+ {
+ push(@r,sprintf("%1.3f",hex(substr($c,$j*2+1,2))/0xff));
+ }
+
+ $o->{C}=\@r;
+ }
+ elsif (length($c) == 14)
+ {
+ foreach my $j (0..2)
+ {
+ push(@r,sprintf("%1.3f",hex(substr($c,$j*4+2,4))/0xffff));
+ }
+
+ $o->{C}=\@r;
+ }
+ }
+}
+
+sub PutHotSpot
+{
+ my $endx=shift;
+ my $l=$mark->{pdfmark};
+ $l=~s/Color/C/;
+ $l=~s/Action/A/;
+ $l=~s'/Subtype /URI'/S /URI';
+ $l=~s(\\\[u00(..)\])(chr(hex($1)))eg;
+ my @xwds=split(' ',"<< $l >>");
+ my $annotno=BuildObj(++$objct,ParsePDFValue(\@xwds));
+ my $annot=$obj[$objct];
+ $annot->{DATA}->{Type}='/Annot';
+ $annot->{DATA}->{Rect}=[$mark->{xpos},$mark->{ypos}-$mark->{rsb},$endx+$mark->{lead},$mark->{ypos}-$mark->{rst}];
+ FixPDFColour($annot->{DATA});
+ FixRect($annot->{DATA}->{Rect}); # Y origin to ll
+ push(@PageAnnots,$annotno);
+}
+
+sub sgn
+{
+ return(1) if $_[0] > 0;
+ return(-1) if $_[0] < 0;
+ return(0);
+}
+
+sub FixRect
+{
+ my $rect=shift;
+
+ return if !defined($rect);
+ $rect->[1]=GraphY($rect->[1]);
+ $rect->[3]=GraphY($rect->[3]);
+
+ if ($rot)
+ {
+ ($rect->[0],$rect->[1])=Rotate($rect->[0],$rect->[1]);
+ ($rect->[2],$rect->[3])=Rotate($rect->[2],$rect->[3]);
+ }
+}
+
+sub Rotate
+{
+ my ($tx,$ty)=(@_);
+ my $theta=rad($rot);
+
+ ($tx,$ty)=(d3($tx * cos(-$theta) - $ty * sin(-$theta)),
+ d3($tx * sin( $theta) + $ty * cos( $theta)));
+ return($tx,$ty);
+}
+
+sub GetPoints
+{
+ my $val=shift;
+
+ $val=ToPoints($1,$2) if ($val and $val=~m/(-?[\d.]+)([cipnz])/);
+
+ return $val;
+}
+
+# Although the PDF reference mentions XObject/Form as a way of
+# incorporating an external PDF page into the current PDF, it seems not
+# to work with any current PDF reader (although I am told (by Leonard
+# Rosenthol, who helped author the PDF ISO standard) that Acroread 9
+# does support it, empirical observation shows otherwise!!). So... do
+# it the hard way - full PDF parser and merge required objects!!!
+
+# sub BuildRef
+# {
+# my $fil=shift;
+# my $bbox=shift;
+# my $mat=shift;
+# my $wid=($bbox->[2]-$bbox->[0])*$mat->[0];
+# my $hgt=($bbox->[3]-$bbox->[1])*$mat->[3];
+#
+# if (!open(PDF,"<$fil"))
+# {
+# Warn("failed to open '$fil'");
+# return(undef);
+# }
+#
+# my (@f)=(<PDF>);
+#
+# close(PDF);
+#
+# $objct++;
+# my $xonm="XO$objct";
+#
+# $pages->{'Resources'}->{'XObject'}->{$xonm}=BuildObj($objct,{'Type' => '/XObject',
+# 'Subtype' => '/Form',
+# 'BBox' => $bbox,
+# 'Matrix' => $mat,
+# 'Resources' => $pages->{'Resources'},
+# 'Ref' => {'Page' => '1',
+# 'F' => BuildObj($objct+1,{'Type' => '/Filespec',
+# 'F' => "($fil)",
+# 'EF' => {'F' => BuildObj($objct+2,{'Type' => '/EmbeddedFile'})}
+# })
+# }
+# });
+#
+# $obj[$objct]->{STREAM}="q 1 0 0 1 0 0 cm
+# q BT
+# 1 0 0 1 0 0 Tm
+# .5 g .5 G
+# /F5 20 Tf
+# (Proxy) Tj
+# ET Q
+# 0 0 m 72 0 l s
+# Q\n";
+#
+# # $obj[$objct]->{STREAM}=PutXY($xpos,$ypos)." m ".PutXY($xpos+$wid,$ypos)." l ".PutXY($xpos+$wid,$ypos+$hgt)." l ".PutXY($xpos,$ypos+$hgt)." l f\n";
+# $obj[$objct+2]->{STREAM}=join('',@f);
+# PutObj($objct);
+# PutObj($objct+1);
+# PutObj($objct+2);
+# $objct+=2;
+# return($xonm);
+# }
+
+sub LoadSWF
+{
+ my $fil=shift;
+ my $bbox=shift;
+ my $mat=shift;
+ my $wid=($bbox->[2]-$bbox->[0])*$mat->[0];
+ my $hgt=($bbox->[3]-$bbox->[1])*$mat->[3];
+ my (@path)=split('/',$fil);
+ my $node=pop(@path);
+
+ if (!open(PDF,"<$fil"))
+ {
+ Warn("failed to open SWF '$fil'");
+ return(undef);
+ }
+
+ my (@f)=(<PDF>);
+
+ close(PDF);
+
+ $objct++;
+ my $xonm="XO$objct";
+
+ $pages->{'Resources'}->{'XObject'}->{$xonm}=BuildObj($objct,{'Type' => '/XObject', 'BBox' => $bbox, 'Matrix' => $mat, 'FormType' => 1, 'Subtype' => '/Form', 'Length' => 0, 'Type' => "/XObject"});
+ $obj[$objct]->{STREAM}='';
+ PutObj($objct);
+ $objct++;
+ my $asset=BuildObj($objct,{'EF' => {'F' => BuildObj($objct+1,{})},
+ 'F' => "($node)",
+ 'Type' => '/Filespec',
+ 'UF' => "($node)"});
+
+ PutObj($objct);
+ $objct++;
+ $obj[$objct]->{STREAM}=join('',@f);
+ PutObj($objct);
+ $objct++;
+ my $config=BuildObj($objct,{'Instances' => [BuildObj($objct+1,{'Params' => { 'Binding' => '/Background'}, 'Asset' => $asset})],
+ 'Subtype' => '/Flash'});
+
+ PutObj($objct);
+ $objct++;
+ PutObj($objct);
+ $objct++;
+
+ my ($x,$y)=split(' ',PutXY($xpos,$ypos));
+
+ push(@{$cpage->{Annots}},BuildObj($objct,{'RichMediaContent' => {'Subtype' => '/Flash', 'Configurations' => [$config], 'Assets' => {'Names' => [ "($node)", $asset ] }},
+ 'P' => "$cpageno 0 R",
+ 'RichMediaSettings' => { 'Deactivation' => { 'Condition' => '/PI',
+ 'Type' => '/RichMediaDeactivation'},
+ 'Activation' => { 'Condition' => '/PV',
+ 'Type' => '/RichMediaActivation'}},
+ 'F' => 68,
+ 'Subtype' => '/RichMedia',
+ 'Type' => '/Annot',
+ 'Rect' => "[ $x $y ".($x+$wid)." ".($y+$hgt)." ]",
+ 'Border' => [0,0,0]}));
+
+ PutObj($objct);
+
+ return $xonm;
+}
+
+sub OpenInc
+{
+ my $fn=shift;
+ my $fnm=$fn;
+ my $F;
+
+ if (substr($fnm,0,1) eq '/' or substr($fnm,1,1) eq ':') # dos
+ {
+ if (-r $fnm and open($F,"<$fnm"))
+ {
+ return($F,$fnm);
+ }
+ }
+ else
+ {
+ foreach my $dir (@idirs)
+ {
+ $fnm="$dir/$fn";
+
+ if (-r "$fnm" and open($F,"<$fnm"))
+ {
+ return($F,$fnm);
+ }
+ }
+ }
+
+ return(undef,$fn);
+}
+
+sub LoadPDF
+{
+ my $pdfnm=shift;
+ my $mat=shift;
+ my $wid=shift;
+ my $hgt=shift;
+ my $type=shift;
+ my $pdf;
+ my $pdftxt='';
+ my $strmlen=0;
+ my $curobj=-1;
+ my $instream=0;
+ my $cont;
+ my $adj=0;
+ my $keepsep=$/;
+
+ my ($PD,$PDnm)=OpenInc($pdfnm);
+
+ if (!defined($PD))
+ {
+ Warn("failed to open PDF '$pdfnm'");
+ return undef;
+ }
+
+ my $hdr=<$PD>;
+
+ $/="\r",$adj=1 if (length($hdr) > 10);
+
+ while (<$PD>)
+ {
+ chomp;
+
+ s/\n//;
+
+ if (m/endstream(\s+.*)?$/)
+ {
+ $instream=0;
+ $_="endstream";
+ $_.=$1 if defined($1)
+ }
+
+ next if $instream;
+
+ if (m'/Length\s+(\d+)(\s+\d+\s+R)?')
+ {
+ if (!defined($2))
+ {
+ $strmlen=$1;
+ }
+ else
+ {
+ $strmlen=0;
+ }
+ }
+
+ if (m'^(\d+) \d+ obj')
+ {
+ $curobj=$1;
+ $pdf->[$curobj]->{OBJ}=undef;
+ }
+
+ if (m'stream\s*$' and ! m/^endstream/)
+ {
+ if ($curobj > -1)
+ {
+ $pdf->[$curobj]->{STREAMPOS}=[tell($PD)+$adj,$strmlen];
+ seek($PD,$strmlen,1);
+ $instream=1;
+ }
+ else
+ {
+ Warn("parsing PDF '$pdfnm' failed");
+ return undef;
+ }
+ }
+
+ s/%.*?$//;
+ $pdftxt.=$_.' ';
+ }
+
+ close($PD);
+
+ open(PD,"<$PDnm");
+# $pdftxt=~s/\]/ \]/g;
+ my (@pdfwds)=split(' ',$pdftxt);
+ my $wd;
+ my $root;
+
+ while ($wd=nextwd(\@pdfwds),length($wd))
+ {
+ if ($wd=~m/\d+/ and defined($pdfwds[1]) and $pdfwds[1]=~m/^obj(.*)/)
+ {
+ $curobj=$wd;
+ shift(@pdfwds); shift(@pdfwds);
+ unshift(@pdfwds,$1) if defined($1) and length($1);
+ $pdf->[$curobj]->{OBJ}=ParsePDFObj(\@pdfwds);
+ my $o=$pdf->[$curobj];
+
+ if (ref($o->{OBJ}) eq 'HASH' and exists($o->{OBJ}->{Type}) and $o->{OBJ}->{Type} eq '/ObjStm')
+ {
+ LoadStream($o,$pdf);
+ my $pos=$o->{OBJ}->{First};
+ my $s=$o->{STREAM};
+ my @o=split(' ',substr($s,0,$pos));
+ substr($s,0,$pos)='';
+ push(@o,-1,length($s));
+
+ for (my $j=0; $j<=$#o-2; $j+=2)
+ {
+ my @w=split(' ',substr($s,$o[$j+1],$o[$j+3]-$o[$j+1]));
+ $pdf->[$o[$j]]->{OBJ}=ParsePDFObj(\@w);
+ }
+
+ $pdf->[$curobj]=undef;
+ }
+
+ $root=$curobj if ref($pdf->[$curobj]->{OBJ}) eq 'HASH' and exists($pdf->[$curobj]->{OBJ}->{Type}) and $pdf->[$curobj]->{OBJ}->{Type} eq '/XRef';
+ }
+ elsif ($wd eq 'trailer' and !exists($pdf->[0]->{OBJ}))
+ {
+ $pdf->[0]->{OBJ}=ParsePDFObj(\@pdfwds);
+ }
+ else
+ {
+# print "Skip '$wd'\n";
+ }
+ }
+
+ $pdf->[0]=$pdf->[$root] if !defined($pdf->[0]);
+ my $catalog=${$pdf->[0]->{OBJ}->{Root}};
+ my $page=FindPage(1,$pdf);
+ my $xobj=++$objct;
+
+ # Load the streamas
+
+ foreach my $o (@{$pdf})
+ {
+ if (exists($o->{STREAMPOS}) and !exists($o->{STREAM}))
+ {
+ LoadStream($o,$pdf);
+ }
+ }
+
+ close(PD);
+
+ # Find BBox
+ my $BBox;
+ my $insmap={};
+
+ foreach my $k (qw( ArtBox TrimBox BleedBox CropBox MediaBox ))
+ {
+ $BBox=FindKey($pdf,$page,$k);
+ last if $BBox;
+ }
+
+ $BBox=[0,0,595,842] if !defined($BBox);
+
+ $wid=($BBox->[2]-$BBox->[0]+1) if $wid==0;
+ my $xscale=d3(abs($wid)/($BBox->[2]-$BBox->[0]+1));
+ my $yscale=d3(($hgt<=0)?$xscale:(abs($hgt)/($BBox->[3]-$BBox->[1]+1)));
+ $hgt=($BBox->[3]-$BBox->[1]+1)*$yscale;
+
+ if ($type eq "import")
+ {
+ $mat->[0]=$xscale;
+ $mat->[3]=$yscale;
+ }
+
+ # Find Resource
+
+ my $res=FindKey($pdf,$page,'Resources');
+ my $xonm="XO$xobj";
+
+ # Map inserted objects to current PDF
+
+ MapInsValue($pdf,$page,'',$insmap,$xobj,$pdf->[$page]->{OBJ});
+#
+# Many PDFs include 'Resources' at the 'Page' level but if 'Resources' is held at a higher level (i.e 'Pages')
+# then we need to include its objects as well.
+#
+ MapInsValue($pdf,$page,'',$insmap,$xobj,$res) if !exists($pdf->[$page]->{OBJ}->{Resources});
+
+ # Copy Resources
+
+ my %incres=%{$res};
+
+ $incres{ProcSet}=['/PDF', '/Text', '/ImageB', '/ImageC', '/ImageI'];
+
+ ($mat->[4],$mat->[5])=split(' ',PutXY($xpos,$ypos));
+ $pages->{'Resources'}->{'XObject'}->{$xonm}=BuildObj($xobj,{'Type' => '/XObject', 'BBox' => $BBox, 'Name' => "/$xonm", 'FormType' => 1, 'Subtype' => '/Form', 'Length' => 0, 'Type' => "/XObject", 'Resources' => \%incres});
+
+ if ($BBox->[0] != 0 or $BBox->[1] != 0)
+ {
+ my (@matrix)=(1,0,0,1,-$BBox->[0],-$BBox->[1]);
+ $obj[$xobj]->{DATA}->{Matrix}=\@matrix;
+ }
+
+ BuildStream($xobj,$pdf,$pdf->[$page]->{OBJ}->{Contents});
+
+ $/=$keepsep;
+ return([$xonm,$BBox] );
+}
+
+sub LoadStream
+{
+ my $o=shift;
+ my $pdf=shift;
+ my $l;
+
+ $l=$o->{OBJ}->{Length} if exists($o->{OBJ}->{Length});
+
+ $l=$pdf->[$$l]->{OBJ} if (defined($l) && ref($l) eq 'OBJREF');
+
+ Die("unable to determine length of stream \@$o->{STREAMPOS}->[0]")
+ if !defined($l);
+
+ sysseek(PD,$o->{STREAMPOS}->[0],0);
+ Warn("failed to read all of the stream")
+ if $l != sysread(PD,$o->{STREAM},$l);
+
+ if ($gotzlib and exists($o->{OBJ}->{'Filter'}) and $o->{OBJ}->{'Filter'} eq '/FlateDecode')
+ {
+ $o->{STREAM}=Compress::Zlib::uncompress($o->{STREAM});
+ delete($o->{OBJ }->{'Filter'});
+ }
+}
+
+sub BuildStream
+{
+ my $xobj=shift;
+ my $pdf=shift;
+ my $val=shift;
+ my $strm='';
+ my $objs;
+ my $refval=ref($val);
+
+ if ($refval eq 'OBJREF')
+ {
+ push(@{$objs}, $val);
+ }
+ elsif ($refval eq 'ARRAY')
+ {
+ $objs=$val;
+ }
+ else
+ {
+ Warn("unexpected 'Contents'");
+ }
+
+ foreach my $o (@{$objs})
+ {
+ $strm.="\n" if $strm;
+ $strm.=$pdf->[$$o]->{STREAM} if exists($pdf->[$$o]->{STREAM});
+ }
+
+ $obj[$xobj]->{STREAM}=$strm;
+}
+
+
+sub MapInsHash
+{
+ my $pdf=shift;
+ my $o=shift;
+ my $insmap=shift;
+ my $parent=shift;
+ my $val=shift;
+
+
+ foreach my $k (sort keys(%{$val}))
+ {
+ MapInsValue($pdf,$o,$k,$insmap,$parent,$val->{$k}) if $k ne 'Contents';
+ }
+}
+
+sub MapInsValue
+{
+ my $pdf=shift;
+ my $o=shift;
+ my $k=shift;
+ my $insmap=shift;
+ my $parent=shift;
+ my $val=shift;
+ my $refval=ref($val);
+
+ if ($refval eq 'OBJREF')
+ {
+ if ($k ne 'Parent')
+ {
+ if (!exists($insmap->{IMP}->{$$val}))
+ {
+ $objct++;
+ $insmap->{CUR}->{$objct}=$$val;
+ $insmap->{IMP}->{$$val}=$objct;
+ $obj[$objct]->{DATA}=$pdf->[$$val]->{OBJ};
+ $obj[$objct]->{STREAM}=$pdf->[$$val]->{STREAM} if exists($pdf->[$$val]->{STREAM});
+ MapInsValue($pdf,$$val,'',$insmap,$o,$pdf->[$$val]->{OBJ});
+ }
+
+ $$val=$insmap->{IMP}->{$$val};
+ }
+ else
+ {
+ $$val=$parent;
+ }
+ }
+ elsif ($refval eq 'ARRAY')
+ {
+ foreach my $v (@{$val})
+ {
+ MapInsValue($pdf,$o,'',$insmap,$parent,$v)
+ }
+ }
+ elsif ($refval eq 'HASH')
+ {
+ MapInsHash($pdf,$o,$insmap,$parent,$val);
+ }
+
+}
+
+sub FindKey
+{
+ my $pdf=shift;
+ my $page=shift;
+ my $k=shift;
+
+ if (exists($pdf->[$page]->{OBJ}->{$k}))
+ {
+ my $val=$pdf->[$page]->{OBJ}->{$k};
+ $val=$pdf->[$$val]->{OBJ} if ref($val) eq 'OBJREF';
+ return($val);
+ }
+ else
+ {
+ if (exists($pdf->[$page]->{OBJ}->{Parent}))
+ {
+ return(FindKey($pdf,${$pdf->[$page]->{OBJ}->{Parent}},$k));
+ }
+ }
+
+ return(undef);
+}
+
+sub FindPage
+{
+ my $wantpg=shift;
+ my $pdf=shift;
+ my $catalog=${$pdf->[0]->{OBJ}->{Root}};
+ my $pages=${$pdf->[$catalog]->{OBJ}->{Pages}};
+
+ return(NextPage($pdf,$pages,\$wantpg));
+}
+
+sub NextPage
+{
+ my $pdf=shift;
+ my $pages=shift;
+ my $wantpg=shift;
+ my $ret;
+
+ if ($pdf->[$pages]->{OBJ}->{Type} eq '/Pages')
+ {
+ foreach my $kid (@{$pdf->[$pages]->{OBJ}->{Kids}})
+ {
+ $ret=NextPage($pdf,$$kid,$wantpg);
+ last if $$wantpg<=0;
+ }
+ }
+ elsif ($pdf->[$pages]->{OBJ}->{Type} eq '/Page')
+ {
+ $$wantpg--;
+ $ret=$pages;
+ }
+
+ return($ret);
+}
+
+sub nextwd
+{
+ my $pdfwds=shift;
+
+ my $wd=shift(@{$pdfwds});
+
+ return('') if !defined($wd);
+
+ if ($wd=~m/^(.*?)(<<|>>|(?:(?<!\\)\[|\]))(.*)/)
+ {
+ if (defined($1) and length($1))
+ {
+ unshift(@{$pdfwds},$3) if defined($3) and length($3);
+ unshift(@{$pdfwds},$2);
+ $wd=$1;
+ }
+ else
+ {
+ unshift(@{$pdfwds},$3) if defined($3) and length($3);
+ $wd=$2;
+ }
+ }
+
+ return($wd);
+}
+
+sub ParsePDFObj
+{
+
+ my $pdfwds=shift;
+ my $rtn;
+ my $wd;
+
+ while ($wd=nextwd($pdfwds),length($wd))
+ {
+ if ($wd eq 'stream' or $wd eq 'endstream')
+ {
+ next;
+ }
+ elsif ($wd eq 'endobj' or $wd eq 'startxref')
+ {
+ last;
+ }
+ else
+ {
+ unshift(@{$pdfwds},$wd);
+ $rtn=ParsePDFValue($pdfwds);
+ }
+ }
+
+ return($rtn);
+}
+
+sub ParsePDFHash
+{
+ my $pdfwds=shift;
+ my $rtn={};
+ my $wd;
+
+ while ($wd=nextwd($pdfwds),length($wd))
+ {
+ if ($wd eq '>>')
+ {
+ last;
+ }
+
+ my (@w)=split('/',$wd,3);
+
+ if ($w[0])
+ {
+ Warn("PDF Dict Key '$wd' does not start with '/'");
+ exit 1;
+ }
+ else
+ {
+ unshift(@{$pdfwds},"/$w[2]") if $w[2];
+ $wd=$w[1];
+ (@w)=split('\(',$wd,2);
+ $wd=$w[0];
+ unshift(@{$pdfwds},"($w[1]") if defined($w[1]);
+ (@w)=split('\<',$wd,2);
+ $wd=$w[0];
+ unshift(@{$pdfwds},"<$w[1]") if defined($w[1]);
+
+ $rtn->{$wd}=ParsePDFValue($pdfwds);
+ }
+ }
+
+ return($rtn);
+}
+
+sub ParsePDFValue
+{
+ my $pdfwds=shift;
+ my $rtn;
+ my $wd=nextwd($pdfwds);
+
+ if ($wd=~m/^\d+$/ and $pdfwds->[0]=~m/^\d+$/ and $pdfwds->[1]=~m/^R(\]|\>|\/)?/)
+ {
+ shift(@{$pdfwds});
+ if (defined($1) and length($1))
+ {
+ $pdfwds->[0]=substr($pdfwds->[0],1);
+ }
+ else
+ {
+ shift(@{$pdfwds});
+ }
+ return(bless(\$wd,'OBJREF'));
+ }
+
+ if ($wd eq '<<')
+ {
+ return(ParsePDFHash($pdfwds));
+ }
+
+ if ($wd eq '[')
+ {
+ return(ParsePDFArray($pdfwds));
+ }
+
+ if ($wd=~m/(.*?)(\(.*)$/)
+ {
+ if (defined($1) and length($1))
+ {
+ unshift(@{$pdfwds},$2);
+ $wd=$1;
+ }
+ else
+ {
+ return(ParsePDFString($wd,$pdfwds));
+ }
+ }
+
+ if ($wd=~m/(.*?)(\<.*)$/)
+ {
+ if (defined($1) and length($1))
+ {
+ unshift(@{$pdfwds},$2);
+ $wd=$1;
+ }
+ else
+ {
+ return(ParsePDFHexString($wd,$pdfwds));
+ }
+ }
+
+ if ($wd=~m/(.+?)(\/.*)$/)
+ {
+ if (defined($2) and length($2))
+ {
+ unshift(@{$pdfwds},$2);
+ $wd=$1;
+ }
+ }
+
+ return($wd);
+}
+
+sub ParsePDFString
+{
+ my $wd=shift;
+ my $rtn='';
+ my $pdfwds=shift;
+ my $lev=0;
+
+ while (length($wd))
+ {
+ $rtn.=' ' if length($rtn);
+
+ while ($wd=~m/(?<!\\)\(/g) {$lev++;}
+ while ($wd=~m/(?<!\\)\)/g) {$lev--;}
+
+
+ if ($lev<=0 and $wd=~m/^(.*?\))([^)]+)$/)
+ {
+ unshift(@{$pdfwds},$2) if defined($2) and length($2);
+ $wd=$1;
+ }
+
+ $rtn.=$wd;
+
+ last if $lev <= 0;
+
+ $wd=nextwd($pdfwds);
+ }
+
+ return($rtn);
+}
+
+sub ParsePDFHexString
+{
+ my $wd=shift;
+ my $rtn='';
+ my $pdfwds=shift;
+ my $lev=0;
+
+ if ($wd=~m/^(<.+?>)(.*)/)
+ {
+ unshift(@{$pdfwds},$2) if defined($2) and length($2);
+ $rtn=$1;
+ }
+
+ return($rtn);
+}
+
+sub ParsePDFArray
+{
+ my $pdfwds=shift;
+ my $rtn=[];
+ my $wd;
+
+ while (1)
+ {
+ $wd=ParsePDFValue($pdfwds);
+ last if $wd eq ']' or length($wd)==0;
+ push(@{$rtn},$wd);
+ }
+
+ return($rtn);
+}
+
+sub Warn
+{
+ Msg(0,(@_));
+}
+
+sub Die
+{
+ Msg(1,(@_));
+}
+
+sub Msg
+{
+ my ($fatal,$msg)=@_;
+
+ print STDERR "$prog:";
+ print STDERR "$env{SourceFile}:" if exists($env{SourceFile});
+ print STDERR " ";
+
+ if ($fatal)
+ {
+ print STDERR "fatal error: ";
+ }
+ else
+ {
+ print STDERR "warning: ";
+ }
+
+ print STDERR "$msg\n";
+ exit 1 if $fatal;
+}
+
+sub PutXY
+{
+ my ($x,$y)=(@_);
+
+ if ($frot)
+ {
+ return(d3($y)." ".d3($x));
+ }
+ else
+ {
+ $y=$mediabox[3]-$y;
+ return(d3($x)." ".d3($y));
+ }
+}
+
+sub GraphY
+{
+ my $y=shift;
+
+ if ($frot)
+ {
+ return($y);
+ }
+ else
+ {
+ return($mediabox[3]-$y);
+ }
+}
+
+sub Put
+{
+ my $msg=shift;
+
+ print $msg;
+ $fct+=length($msg);
+}
+
+sub PutObj
+{
+ my $ono=shift;
+ my $msg="$ono 0 obj ";
+ $obj[$ono]->{XREF}=$fct;
+ if (exists($obj[$ono]->{STREAM}))
+ {
+ if ($gotzlib && !$debug && !exists($obj[$ono]->{DATA}->{'Filter'}))
+ {
+ $obj[$ono]->{STREAM}=Compress::Zlib::compress($obj[$ono]->{STREAM});
+ $obj[$ono]->{DATA}->{'Filter'}='/FlateDecode';
+ }
+
+ $obj[$ono]->{DATA}->{'Length'}=length($obj[$ono]->{STREAM});
+ }
+ PutField(\$msg,$obj[$ono]->{DATA});
+ PutStream(\$msg,$ono) if exists($obj[$ono]->{STREAM});
+ Put($msg."endobj\n");
+}
+
+sub PutStream
+{
+ my $msg=shift;
+ my $ono=shift;
+
+ # We could 'flate' here
+ $$msg.="stream\n$obj[$ono]->{STREAM}endstream\n";
+}
+
+sub PutField
+{
+ my $pmsg=shift;
+ my $fld=shift;
+ my $term=shift||"\n";
+ my $typ=ref($fld);
+
+ if ($typ eq '')
+ {
+ $$pmsg.="$fld$term";
+ }
+ elsif ($typ eq 'ARRAY')
+ {
+ $$pmsg.='[';
+ foreach my $cell (@{$fld})
+ {
+ PutField($pmsg,$cell,' ');
+ }
+ $$pmsg.="]$term";
+ }
+ elsif ($typ eq 'HASH')
+ {
+ $$pmsg.='<< ';
+ foreach my $key (sort keys %{$fld})
+ {
+ $$pmsg.="/$key ";
+ PutField($pmsg,$fld->{$key});
+ }
+ $$pmsg.=">>$term";
+ }
+ elsif ($typ eq 'OBJREF')
+ {
+ $$pmsg.="$$fld 0 R$term";
+ }
+}
+
+sub BuildObj
+{
+ my $ono=shift;
+ my $val=shift;
+
+ $obj[$ono]->{DATA}=$val;
+
+ return("$ono 0 R ");
+}
+
+sub LoadFont
+{
+ my $fontno=shift;
+ my $fontnm=shift;
+ my $ofontnm=$fontnm;
+
+ return $fontlst{$fontno}->{OBJ} if (exists($fontlst{$fontno}));
+
+ my $f;
+ OpenFile(\$f,$fontdir,"$fontnm");
+
+ if (!defined($f) and $Foundry)
+ {
+ # Try with no foundry
+ $fontnm=~s/.*?-//;
+ OpenFile(\$f,$fontdir,$fontnm);
+ }
+
+ Die("unable to open font '$ofontnm' for mounting") if !defined($f);
+
+ my $foundry='';
+ $foundry=$1 if $fontnm=~m/^(.*?)-/;
+ my $stg=1;
+ my %fnt;
+ my @fntbbox=(0,0,0,0);
+ my $capheight=0;
+ my $lastchr=0;
+ my $lastnm;
+ my $t1flags=0;
+ my $fixwid=-1;
+ my $ascent=0;
+ my $charset='';
+
+ while (<$f>)
+ {
+ chomp;
+
+ s/^ +//;
+ s/^#.*// if $stg == 1;
+ next if $_ eq '';
+
+ if ($stg == 1)
+ {
+ my ($key,$val)=split(' ',$_,2);
+
+ $key=lc($key);
+ $stg=2,next if $key eq 'kernpairs';
+ $stg=3,next if lc($_) eq 'charset';
+
+ $fnt{$key}=$val
+ }
+ elsif ($stg == 2)
+ {
+ $stg=3,next if lc($_) eq 'charset';
+
+ my ($ch1,$ch2,$k)=split;
+# $fnt{KERN}->{$ch1}->{$ch2}=$k;
+ }
+ else
+ {
+ my (@r)=split;
+ my (@p)=split(',',$r[1]);
+
+ if ($r[1] eq '"')
+ {
+ $fnt{NAM}->{$r[0]}=[@{$fnt{NAM}->{$lastnm}}];
+ next;
+ }
+
+ $r[3]=oct($r[3]) if substr($r[3],0,1) eq '0';
+ $r[0]='u0020' if $r[3] == 32;
+ $r[0]="u00".hex($r[3]) if $r[0] eq '---';
+# next if $r[3] >255;
+ $r[4]=$r[0] if !defined($r[4]);
+ $fnt{NAM}->{$r[0]}=[$p[0],$r[3],'/'.$r[4],$r[3],0];
+ $fnt{NO}->[$r[3]]=[$r[0],$r[0]];
+ $lastnm=$r[0];
+ $lastchr=$r[3] if $r[3] > $lastchr;
+ $fixwid=$p[0] if $fixwid == -1;
+ $fixwid=-2 if $fixwid > 0 and $p[0] != $fixwid;
+
+ $fntbbox[1]=-$p[2] if defined($p[2]) and -$p[2] < $fntbbox[1];
+ $fntbbox[2]=$p[0] if $p[0] > $fntbbox[2];
+ $fntbbox[3]=$p[1] if defined($p[1]) and $p[1] > $fntbbox[3];
+ $ascent=$p[1] if defined($p[1]) and $p[1] > $ascent and $r[3] >= 32 and $r[3] < 128;
+ $charset.='/'.$r[4] if defined($r[4]);
+ $capheight=$p[1] if length($r[4]) == 1 and $r[4] ge 'A' and $r[4] le 'Z' and $p[1] > $capheight;
+ }
+ }
+
+ close($f);
+
+ foreach my $j (0..$lastchr)
+ {
+ $fnt{NO}->[$j]=['',''] if !defined($fnt{NO}->[$j]);
+ }
+
+ my $fno=0;
+ my $slant=0;
+ $fnt{DIFF}=[];
+ $fnt{WIDTH}=[];
+ $fnt{NAM}->{''}=[0,-1,'/.notdef',-1,0];
+ $slant=-$fnt{'slant'} if exists($fnt{'slant'});
+ $fnt{'spacewidth'}=700 if !exists($fnt{'spacewidth'});
+
+ $t1flags|=2**0 if $fixwid > -1;
+ $t1flags|=(exists($fnt{'special'}))?2**2:2**5;
+ $t1flags|=2**6 if $slant != 0;
+ my $fontkey="$foundry $fnt{internalname}";
+
+ if (exists($download{$fontkey}))
+ {
+ # Not a Base Font
+ my ($l1,$l2,$l3,$t1stream)=GetType1($download{$fontkey});
+ Warn("incorrect font format for '$fontkey' ($l1)")
+ if !defined($t1stream);
+ $fno=++$objct;
+ $fontlst{$fontno}->{OBJ}=BuildObj($objct,
+ {'Type' => '/Font',
+ 'Subtype' => '/Type1',
+ 'BaseFont' => '/'.$fnt{internalname},
+ 'Widths' => $fnt{WIDTH},
+ 'FirstChar' => 0,
+ 'LastChar' => $lastchr,
+ 'Encoding' => BuildObj($objct+1,
+ {'Type' => '/Encoding',
+ 'Differences' => $fnt{DIFF}
+ }
+ ),
+ 'FontDescriptor' => BuildObj($objct+2,
+ {'Type' => '/FontDescriptor',
+ 'FontName' => '/'.$fnt{internalname},
+ 'Flags' => $t1flags,
+ 'FontBBox' => \@fntbbox,
+ 'ItalicAngle' => $slant,
+ 'Ascent' => $ascent,
+ 'Descent' => $fntbbox[1],
+ 'CapHeight' => $capheight,
+ 'StemV' => 0,
+# 'CharSet' => "($charset)",
+ 'FontFile' => BuildObj($objct+3,
+ {'Length1' => $l1,
+ 'Length2' => $l2,
+ 'Length3' => $l3
+ }
+ )
+ }
+ )
+ }
+ );
+
+ $objct+=3;
+ $fontlst{$fontno}->{NM}='/F'.$fontno;
+ $pages->{'Resources'}->{'Font'}->{'F'.$fontno}=$fontlst{$fontno}->{OBJ};
+ $fontlst{$fontno}->{FNT}=\%fnt;
+ $obj[$objct]->{STREAM}=$t1stream;
+
+ }
+ else
+ {
+ if (exists($missing{$fontkey}))
+ {
+ Warn("The download file in '$missing{$fontkey}' "
+ . " has erroneous entry for '$fnt{internalname} ($ofontnm)'");
+ }
+ else
+ {
+ Warn("unable to embed font file for '$fnt{internalname}'"
+ . " ($ofontnm) (missing entry in 'download' file?)")
+ if $embedall;
+ }
+ $fno=++$objct;
+ $fontlst{$fontno}->{OBJ}=BuildObj($objct,
+ {'Type' => '/Font',
+ 'Subtype' => '/Type1',
+ 'BaseFont' => '/'.$fnt{internalname},
+ 'Widths' => $fnt{WIDTH},
+ 'FirstChar' => 0,
+ 'LastChar' => $lastchr,
+ 'Encoding' => BuildObj($objct+1,
+ {'Type' => '/Encoding',
+ 'Differences' => $fnt{DIFF}
+ }
+ ),
+ 'FontDescriptor' => BuildObj($objct+2,
+ {'Type' => '/FontDescriptor',
+ 'FontName' => '/'.$fnt{internalname},
+ 'Flags' => $t1flags,
+ 'FontBBox' => \@fntbbox,
+ 'ItalicAngle' => $slant,
+ 'Ascent' => $ascent,
+ 'Descent' => $fntbbox[1],
+ 'CapHeight' => $capheight,
+ 'StemV' => 0,
+ 'CharSet' => "($charset)",
+ }
+ )
+ }
+ );
+
+ $objct+=2;
+ $fontlst{$fontno}->{NM}='/F'.$fontno;
+ $pages->{'Resources'}->{'Font'}->{'F'.$fontno}=$fontlst{$fontno}->{OBJ};
+ $fontlst{$fontno}->{FNT}=\%fnt;
+ }
+
+ if (defined($fnt{encoding}) and $fnt{encoding} eq 'text.enc' and $ucmap ne '')
+ {
+ if ($textenccmap eq '')
+ {
+ $textenccmap = BuildObj($objct+1,{});
+ $objct++;
+ $obj[$objct]->{STREAM}=$ucmap;
+ }
+ $obj[$fno]->{DATA}->{'ToUnicode'}=$textenccmap;
+ }
+
+# PutObj($fno);
+# PutObj($fno+1);
+# PutObj($fno+2) if defined($obj[$fno+2]);
+# PutObj($fno+3) if defined($obj[$fno+3]);
+}
+
+sub GetType1
+{
+ my $file=shift;
+ my ($l1,$l2,$l3); # Return lengths
+ my ($head,$body,$tail); # Font contents
+ my $f;
+
+ OpenFile(\$f,$fontdir,"$file");
+ Die("unable to open font '$file' for embedding") if !defined($f);
+
+ $head=GetChunk($f,1,"currentfile eexec");
+ $body=GetChunk($f,2,"00000000") if !eof($f);
+ $tail=GetChunk($f,3,"cleartomark") if !eof($f);
+
+ $l1=length($head);
+ $l2=length($body);
+ $l3=length($tail);
+
+ return($l1,$l2,$l3,"$head$body$tail");
+}
+
+sub GetChunk
+{
+ my $F=shift;
+ my $segno=shift;
+ my $ascterm=shift;
+ my ($type,$hdr,$chunk,@msg);
+ binmode($F);
+ my $enc="ascii";
+
+ while (1)
+ {
+ # There may be multiple chunks of the same type
+
+ my $ct=read($F,$hdr,2);
+
+ if ($ct==2)
+ {
+ if (substr($hdr,0,1) eq "\x80")
+ {
+ # binary chunk
+
+ my $chunktype=ord(substr($hdr,1,1));
+ $enc="binary";
+
+ if (defined($type) and $type != $chunktype)
+ {
+ seek($F,-2,1);
+ last;
+ }
+
+ $type=$chunktype;
+ return if $chunktype == 3;
+
+ $ct=read($F,$hdr,4);
+ Die("failed to read binary segment length") if $ct != 4;
+ my $sl=unpack('V',$hdr);
+ my $data;
+ my $chk=read($F,$data,$sl);
+ Die("failed to read binary segment") if $chk != $sl;
+ $chunk.=$data;
+ }
+ else
+ {
+ # ascii chunk
+
+ my $hex=0;
+ seek($F,-2,1);
+ my $ct=0;
+
+ while (1)
+ {
+ my $lin=<$F>;
+
+ last if !$lin;
+
+ $hex=1,$enc.=" hex" if $segno == 2 and !$ct and $lin=~m/^[A-F0-9a-f]{4,4}/;
+
+ if ($segno !=2 and $lin=~m/^(.*$ascterm\n?)(.*)/)
+ {
+ $chunk.=$1;
+ seek($F,-length($2)-1,1) if $2;
+ last;
+ }
+ elsif ($segno == 2 and $lin=~m/^(.*?)($ascterm.*)/)
+ {
+ $chunk.=$1;
+ seek($F,-length($2)-1,1) if $2;
+ last;
+ }
+
+ chomp($lin), $lin=pack('H*',$lin) if $hex;
+ $chunk.=$lin; $ct++;
+ }
+
+ last;
+ }
+ }
+ else
+ {
+ push(@msg,"Failed to read 2 header bytes");
+ }
+ }
+
+ return $chunk;
+}
+
+sub OutStream
+{
+ my $ono=shift;
+
+ IsGraphic();
+ $stream.="Q\n";
+ $obj[$ono]->{STREAM}=$stream;
+ $obj[$ono]->{DATA}->{Length}=length($stream);
+ $stream='';
+ PutObj($ono);
+}
+
+sub do_p
+{
+ my $trans='BLOCK';
+
+ $trans='PAGE' if $firstpause;
+ NewPage($trans);
+ @XOstream=();
+ @PageAnnots=();
+ $firstpause=1;
+}
+
+sub FixTrans
+{
+ my $t=shift;
+ my $style=$t->{S};
+
+ if ($style)
+ {
+ delete($t->{Dm}) if $style ne '/Split' and $style ne '/Blinds';
+ delete($t->{M}) if !($style eq '/Split' or $style eq '/Box' or $style eq '/Fly');
+ delete($t->{Di}) if !($style eq '/Wipe' or $style eq '/Glitter' or $style eq '/Fly' or $style eq '/Cover' or $style eq '/Uncover' or $style eq '/Push') or ($style eq '/Fly' and $t->{Di} eq '/None' and $t->{SS} != 1);
+ delete($t->{SS}) if !($style eq '/Fly');
+ delete($t->{B}) if !($style eq '/Fly');
+ }
+
+ return($t);
+}
+
+sub NewPage
+{
+ my $trans=shift;
+ # Start of pages
+
+ if ($cpageno > 0)
+ {
+ if ($#XOstream>=0)
+ {
+ MakeXO() if $stream;
+ $stream=join("\n",@XOstream,'');
+ }
+
+ my %t=%{$transition->{$trans}};
+ $cpage->{MediaBox}=\@mediabox if $custompaper;
+ $cpage->{Trans}=FixTrans(\%t) if $t{S};
+
+ if ($#PageAnnots >= 0)
+ {
+ @{$cpage->{Annots}}=@PageAnnots;
+ }
+
+ if ($#bgstack > -1 or $bgbox)
+ {
+ my $box="q 1 0 0 1 0 0 cm ";
+
+ foreach my $bg (@bgstack)
+ {
+ # 0=$bgtype # 1=stroke 2=fill. 4=page
+ # 1=$strkcol
+ # 2=$fillcol
+ # 3=(Left,Top,Right,bottom,LineWeight)
+ # 4=Start ypos
+ # 5=Endypos
+ # 6=Line Weight
+
+ my $pg=$bg->[3] || \@defaultmb;
+
+ $bg->[5]=$pg->[3]; # box is continuing to next page
+ $box.=DrawBox($bg);
+ $bg->[4]=$pg->[1]; # will continue from page top
+ }
+
+ $stream=$box.$bgbox."Q\n".$stream;
+ $bgbox='';
+ $boxmax=0;
+ }
+
+ PutObj($cpageno);
+ OutStream($cpageno+1);
+ }
+
+ $cpageno=++$objct;
+
+ my $thispg=BuildObj($objct,
+ {'Type' => '/Page',
+ 'Group' => {'CS' => '/DeviceRGB', 'S' => '/Transparency'},
+ 'Parent' => '2 0 R',
+ 'Contents' => [ BuildObj($objct+1,
+ {'Length' => 0}
+ ) ],
+ }
+ );
+
+ splice(@{$pages->{Kids}},++$pginsert,0,$thispg);
+ splice(@outlines,$pginsert,0,[$curoutlev,$#{$curoutlev}+1,$thislev]);
+
+ $objct+=1;
+ $cpage=$obj[$cpageno]->{DATA};
+ $pages->{'Count'}++;
+ $stream="q 1 0 0 1 0 0 cm\n$linejoin J\n$linecap j\n0.4 w\n";
+ $stream.=$strkcol."\n", $curstrk=$strkcol if $strkcol ne '';
+ $mode='g';
+ $curfill='';
+# @mediabox=@defaultmb;
+}
+
+sub DrawBox
+{
+ my $bg=shift;
+ my $res='';
+ my $pg=$bg->[3] || \@mediabox;
+ $bg->[4]=$pg->[1], $bg->[5]=$pg->[3] if $bg->[0] & 4;
+ my $bot=$bg->[5];
+ $bot=$boxmax if $boxmax > $bot;
+ my $wid=$pg->[2]-$pg->[0];
+ my $dep=$bot-$bg->[4];
+
+ $res="$bg->[1] $bg->[2] $bg->[6] w\n";
+ $res.="$pg->[0] $bg->[4] $wid $dep re f " if $bg->[0] & 1;
+ $res.="$pg->[0] $bg->[4] $wid $dep re s " if $bg->[0] & 2;
+ return("$res\n");
+}
+
+sub MakeXO
+{
+ $stream.="%mode=$mode\n";
+ IsGraphic();
+ $stream.="Q\n";
+ my $xobj=++$objct;
+ my $xonm="XO$xobj";
+ $pages->{'Resources'}->{'XObject'}->{$xonm}=BuildObj($xobj,{'Type' => '/XObject', 'BBox' => \@mediabox, 'Name' => "/$xonm", 'FormType' => 1, 'Subtype' => '/Form', 'Length' => 0, 'Type' => "/XObject"});
+ $obj[$xobj]->{STREAM}=$stream;
+ $stream='';
+ push(@XOstream,"q") if $#XOstream==-1;
+ push(@XOstream,"/$xonm Do");
+}
+
+sub do_f
+{
+ my $par=shift;
+ my $fnt=$fontlst{$par}->{FNT};
+
+# IsText();
+ $cft="$par";
+ $fontchg=1;
+# $stream.="/F$cft $cftsz Tf\n" if $cftsz;
+ $widtbl=CacheWid($par);
+ $origwidtbl=[];
+
+ foreach my $w (@{$fnt->{NO}})
+ {
+ push(@{$origwidtbl},$fnt->{NAM}->{$w->[1]}->[WIDTH]);
+ }
+
+# $krntbl=$fnt->{KERN};
+}
+
+sub CacheWid
+{
+ my $par=shift;
+
+ if (!defined($fontlst{$par}->{CACHE}->{$cftsz}))
+ {
+ $fontlst{$par}->{CACHE}->{$cftsz}=BuildCache($fontlst{$par}->{FNT});
+ }
+
+ return($fontlst{$par}->{CACHE}->{$cftsz});
+}
+
+sub BuildCache
+{
+ my $fnt=shift;
+ my @cwid;
+ $origwidtbl=[];
+
+ foreach my $w (@{$fnt->{NO}})
+ {
+ my $wid=(defined($w) and defined($w->[1]))?$fnt->{NAM}->{$w->[1]}->[WIDTH]:0;
+ push(@cwid,$wid*$cftsz);
+ push(@{$origwidtbl},$wid);
+ }
+
+ return(\@cwid);
+}
+
+sub IsText
+{
+ if ($mode eq 'g')
+ {
+ $xpos+=$pendmv/$unitwidth;
+ $stream.="q BT\n$matrix ".PutXY($xpos,$ypos)." Tm\n";
+ $poschg=0;
+ $fontchg=0;
+ $pendmv=0;
+ $matrixchg=0;
+ $tmxpos=$xpos;
+ $stream.=$textcol."\n", $curfill=$textcol if $textcol ne $curfill;
+ if (defined($cft))
+ {
+ $whtsz=$fontlst{$cft}->{FNT}->{spacewidth}*$cftsz;
+ $stream.="/F$cft $cftsz Tf\n";
+ }
+ $stream.="$curkern Tc\n";
+ }
+
+ if ($poschg or $matrixchg)
+ {
+ PutLine(0) if $matrixchg;
+ $stream.="$matrix ".PutXY($xpos,$ypos)." Tm\n", $poschg=0;
+ $tmxpos=$xpos;
+ $matrixchg=0;
+ $stream.="$curkern Tc\n";
+ }
+
+ if ($fontchg)
+ {
+ PutLine(0);
+ $whtsz=$fontlst{$cft}->{FNT}->{spacewidth}*$cftsz;
+ $stream.="/F$cft $cftsz Tf\n" if $cftsz and defined($cft);
+ $fontchg=0;
+ }
+
+ $mode='t';
+}
+
+sub IsGraphic
+{
+ if ($mode eq 't')
+ {
+ PutLine();
+ $stream.="ET Q\n";
+ $xpos+=($pendmv-$nomove)/$unitwidth;
+ $pendmv=0;
+ $nomove=0;
+ $stream.=$strkcol."\n", $curstrk=$strkcol if $strkcol ne $curstrk;
+ $curfill=$fillcol;
+ }
+ $mode='g';
+}
+
+sub do_s
+{
+ my $par=shift;
+ $par/=$unitwidth;
+
+ if ($par != $cftsz and defined($cft))
+ {
+ PutLine();
+ $cftsz=$par;
+ Set_LWidth() if $lwidth < 1;
+# $stream.="/F$cft $cftsz Tf\n";
+ $fontchg=1;
+ $widtbl=CacheWid($cft);
+ }
+ else
+ {
+ $cftsz=$par;
+ Set_LWidth() if $lwidth < 1;
+ }
+}
+
+sub Set_LWidth
+{
+ IsGraphic();
+ $stream.=((($desc{res}/(72*$desc{sizescale}))*$linewidth*$cftsz)/1000)." w\n";
+ return;
+}
+
+sub do_m
+{
+ # Groff uses /m[] for text & graphic stroke, and /M[] (DF?) for graphic fill.
+ # PDF uses G/RG/K for graphic stroke, and g/rg/k for text & graphic fill.
+ #
+ # This means that we must maintain g/rg/k state separately for text colour & graphic fill (this is
+ # probably why 'gs' maintains separate graphic states for text & graphics when distilling PS -> PDF).
+ #
+ # To facilitate this:-
+ #
+ # $textcol = current groff stroke colour
+ # $fillcol = current groff fill colour
+ # $curfill = current PDF fill colour
+
+ my $par=shift;
+ my $mcmd=substr($par,0,1);
+
+ $par=substr($par,1);
+ $par=~s/^ +//;
+
+# IsGraphic();
+
+ $textcol=set_col($mcmd,$par,0);
+ $strkcol=set_col($mcmd,$par,1);
+
+ if ($mode eq 't')
+ {
+ PutLine();
+ $stream.=$textcol."\n";
+ $curfill=$textcol;
+ }
+ else
+ {
+ $stream.="$strkcol\n";
+ $curstrk=$strkcol;
+ }
+}
+
+sub set_col
+{
+ my $mcmd=shift;
+ my $par=shift;
+ my $upper=shift;
+ my @oper=('g','k','rg');
+
+ @oper=('G','K','RG') if $upper;
+
+ if ($mcmd eq 'd')
+ {
+ # default colour
+ return("0 $oper[0]");
+ }
+
+ my (@c)=split(' ',$par);
+
+ if ($mcmd eq 'c')
+ {
+ # Text CMY
+ return(d3($c[0]/65535).' '.d3($c[1]/65535).' '.d3($c[2]/65535)." 0 $oper[1]");
+ }
+ elsif ($mcmd eq 'k')
+ {
+ # Text CMYK
+ return(d3($c[0]/65535).' '.d3($c[1]/65535).' '.d3($c[2]/65535).' '.d3($c[3]/65535)." $oper[1]");
+ }
+ elsif ($mcmd eq 'g')
+ {
+ # Text Grey
+ return(d3($c[0]/65535)." $oper[0]");
+ }
+ elsif ($mcmd eq 'r')
+ {
+ # Text RGB0
+ return(d3($c[0]/65535).' '.d3($c[1]/65535).' '.d3($c[2]/65535)." $oper[2]");
+ }
+}
+
+sub do_D
+{
+ my $par=shift;
+ my $Dcmd=substr($par,0,1);
+
+ $par=substr($par,1);
+ $xpos+=$pendmv/$unitwidth;
+ $pendmv=0;
+
+ IsGraphic();
+
+ if ($Dcmd eq 'F')
+ {
+ my $mcmd=substr($par,0,1);
+
+ $par=substr($par,1);
+ $par=~s/^ +//;
+
+ $fillcol=set_col($mcmd,$par,0);
+ $stream.="$fillcol\n";
+ $curfill=$fillcol;
+ }
+ elsif ($Dcmd eq 'f')
+ {
+ my $mcmd=substr($par,0,1);
+
+ $par=substr($par,1);
+ $par=~s/^ +//;
+ ($par)=split(' ',$par);
+
+ if ($par >= 0 and $par <= 1000)
+ {
+ $fillcol=set_col('g',int((1000-$par)*65535/1000),0);
+ }
+ else
+ {
+ $fillcol=lc($textcol);
+ }
+
+ $stream.="$fillcol\n";
+ $curfill=$fillcol;
+ }
+ elsif ($Dcmd eq '~')
+ {
+ # B-Spline
+ my (@p)=split(' ',$par);
+ my ($nxpos,$nypos);
+
+ foreach my $p (@p) { $p/=$unitwidth; }
+ $stream.=PutXY($xpos,$ypos)." m\n";
+ $xpos+=($p[0]/2);
+ $ypos+=($p[1]/2);
+ $stream.=PutXY($xpos,$ypos)." l\n";
+
+ for (my $i=0; $i < $#p-1; $i+=2)
+ {
+ $nxpos=(($p[$i]*$tnum)/(2*$tden));
+ $nypos=(($p[$i+1]*$tnum)/(2*$tden));
+ $stream.=PutXY(($xpos+$nxpos),($ypos+$nypos))." ";
+ $nxpos=($p[$i]/2 + ($p[$i+2]*($tden-$tnum))/(2*$tden));
+ $nypos=($p[$i+1]/2 + ($p[$i+3]*($tden-$tnum))/(2*$tden));
+ $stream.=PutXY(($xpos+$nxpos),($ypos+$nypos))." ";
+ $nxpos=(($p[$i]-$p[$i]/2) + $p[$i+2]/2);
+ $nypos=(($p[$i+1]-$p[$i+1]/2) + $p[$i+3]/2);
+ $stream.=PutXY(($xpos+$nxpos),($ypos+$nypos))." c\n";
+ $xpos+=$nxpos;
+ $ypos+=$nypos;
+ }
+
+ $xpos+=($p[$#p-1]-$p[$#p-1]/2);
+ $ypos+=($p[$#p]-$p[$#p]/2);
+ $stream.=PutXY($xpos,$ypos)." l\nS\n";
+ $poschg=1;
+ }
+ elsif ($Dcmd eq 'p' or $Dcmd eq 'P')
+ {
+ # Polygon
+ my (@p)=split(' ',$par);
+ my ($nxpos,$nypos);
+
+ foreach my $p (@p) { $p/=$unitwidth; }
+ $stream.=PutXY($xpos,$ypos)." m\n";
+
+ for (my $i=0; $i < $#p; $i+=2)
+ {
+ $xpos+=($p[$i]);
+ $ypos+=($p[$i+1]);
+ $stream.=PutXY($xpos,$ypos)." l\n";
+ }
+
+ if ($Dcmd eq 'p')
+ {
+ $stream.="s\n";
+ }
+ else
+ {
+ $stream.="f\n";
+ }
+ $poschg=1;
+ }
+ elsif ($Dcmd eq 'c')
+ {
+ # Stroke circle
+ $par=substr($par,1);
+ my (@p)=split(' ',$par);
+
+ DrawCircle($p[0],$p[0]);
+ $stream.="s\n";
+ $poschg=1;
+ }
+ elsif ($Dcmd eq 'C')
+ {
+ # Fill circle
+ $par=substr($par,1);
+ my (@p)=split(' ',$par);
+
+ DrawCircle($p[0],$p[0]);
+ $stream.="f\n";
+ $poschg=1;
+ }
+ elsif ($Dcmd eq 'e')
+ {
+ # Stroke ellipse
+ $par=substr($par,1);
+ my (@p)=split(' ',$par);
+
+ DrawCircle($p[0],$p[1]);
+ $stream.="s\n";
+ $poschg=1;
+ }
+ elsif ($Dcmd eq 'E')
+ {
+ # Fill ellipse
+ $par=substr($par,1);
+ my (@p)=split(' ',$par);
+
+ DrawCircle($p[0],$p[1]);
+ $stream.="f\n";
+ $poschg=1;
+ }
+ elsif ($Dcmd eq 'l')
+ {
+ # Line To
+ $par=substr($par,1);
+ my (@p)=split(' ',$par);
+
+ foreach my $p (@p) { $p/=$unitwidth; }
+ $stream.=PutXY($xpos,$ypos)." m\n";
+ $xpos+=$p[0];
+ $ypos+=$p[1];
+ $stream.=PutXY($xpos,$ypos)." l\n";
+
+ $stream.="S\n";
+ $poschg=1;
+ }
+ elsif ($Dcmd eq 't')
+ {
+ # Line Thickness
+ $par=substr($par,1);
+ my (@p)=split(' ',$par);
+
+ foreach my $p (@p) { $p/=$unitwidth; }
+ # $xpos+=$p[0]*100; # WTF!!!
+ #int lw = ((font::res/(72*font::sizescale))*linewidth*env->size)/1000;
+ $p[0]=(($desc{res}/(72*$desc{sizescale}))*$linewidth*$cftsz)/1000 if $p[0] < 0;
+ $lwidth=$p[0];
+ $stream.="$p[0] w\n";
+ $poschg=1;
+ $xpos+=$lwidth;
+ }
+ elsif ($Dcmd eq 'a')
+ {
+ # Arc
+ $par=substr($par,1);
+ my (@p)=split(' ',$par);
+ my $rad180=3.14159;
+ my $rad360=$rad180*2;
+ my $rad90=$rad180/2;
+
+ foreach my $p (@p) { $p/=$unitwidth; }
+
+ # Documentation is wrong. Groff does not use Dh1,Dv1 as centre of the circle!
+
+ my $centre=adjust_arc_centre(\@p);
+
+ # Using formula here : http://www.tinaja.com/glib/bezcirc2.pdf
+ # First calculate angle between start and end point
+
+ my ($startang,$r)=RtoP(-$centre->[0],$centre->[1]);
+ my ($endang,$r2)=RtoP(($p[0]+$p[2])-$centre->[0],-($p[1]+$p[3]-$centre->[1]));
+ $endang+=$rad360 if $endang < $startang;
+ my $totang=($endang-$startang)/4; # do it in 4 pieces
+
+ # Now 1 piece
+
+ my $x0=cos($totang/2);
+ my $y0=sin($totang/2);
+ my $x3=$x0;
+ my $y3=-$y0;
+ my $x1=(4-$x0)/3;
+ my $y1=((1-$x0)*(3-$x0))/(3*$y0);
+ my $x2=$x1;
+ my $y2=-$y1;
+
+ # Rotate to start position and draw 4 pieces
+
+ foreach my $j (0..3)
+ {
+ PlotArcSegment($totang/2+$startang+$j*$totang,$r,$xpos+$centre->[0],GraphY($ypos+$centre->[1]),$x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3);
+ }
+
+ $xpos+=$p[0]+$p[2];
+ $ypos+=$p[1]+$p[3];
+
+ $poschg=1;
+ }
+}
+
+sub deg
+{
+ return int($_[0]*180/3.14159);
+}
+
+sub adjust_arc_centre
+{
+ # Taken from geometry.cpp
+
+ # We move the center along a line parallel to the line between
+ # the specified start point and end point so that the center
+ # is equidistant between the start and end point.
+ # It can be proved (using Lagrange multipliers) that this will
+ # give the point nearest to the specified center that is equidistant
+ # between the start and end point.
+
+ my $p=shift;
+ my @c;
+ my $x = $p->[0] + $p->[2]; # (x, y) is the end point
+ my $y = $p->[1] + $p->[3];
+ my $n = $x*$x + $y*$y;
+ if ($n != 0)
+ {
+ $c[0]= $p->[0];
+ $c[1] = $p->[1];
+ my $k = .5 - ($c[0]*$x + $c[1]*$y)/$n;
+ $c[0] += $k*$x;
+ $c[1] += $k*$y;
+ return(\@c);
+ }
+ else
+ {
+ return(undef);
+ }
+}
+
+
+sub PlotArcSegment
+{
+ my ($ang,$r,$transx,$transy,$x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3)=@_;
+ my $cos=cos($ang);
+ my $sin=sin($ang);
+ my @mat=($cos,$sin,-$sin,$cos,0,0);
+ my $lw=$lwidth/$r;
+
+ $stream.="q $r 0 0 $r $transx $transy cm ".join(' ',@mat)." cm $lw w $x0 $y0 m $x1 $y1 $x2 $y2 $x3 $y3 c S Q\n";
+}
+
+sub DrawCircle
+{
+ my $hd=shift;
+ my $vd=shift;
+ my $hr=$hd/2/$unitwidth;
+ my $vr=$vd/2/$unitwidth;
+ my $kappa=0.5522847498;
+ $hd/=$unitwidth;
+ $vd/=$unitwidth;
+
+
+ $stream.=PutXY(($xpos+$hd),$ypos)." m\n";
+ $stream.=PutXY(($xpos+$hd),($ypos+$vr*$kappa))." ".PutXY(($xpos+$hr+$hr*$kappa),($ypos+$vr))." ".PutXY(($xpos+$hr),($ypos+$vr))." c\n";
+ $stream.=PutXY(($xpos+$hr-$hr*$kappa),($ypos+$vr))." ".PutXY(($xpos),($ypos+$vr*$kappa))." ".PutXY(($xpos),($ypos))." c\n";
+ $stream.=PutXY(($xpos),($ypos-$vr*$kappa))." ".PutXY(($xpos+$hr-$hr*$kappa),($ypos-$vr))." ".PutXY(($xpos+$hr),($ypos-$vr))." c\n";
+ $stream.=PutXY(($xpos+$hr+$hr*$kappa),($ypos-$vr))." ".PutXY(($xpos+$hd),($ypos-$vr*$kappa))." ".PutXY(($xpos+$hd),($ypos))." c\n";
+ $xpos+=$hd;
+
+ $poschg=1;
+}
+
+sub FindCircle
+{
+ my ($x1,$y1,$x2,$y2,$x3,$y3)=@_;
+ my ($Xo, $Yo);
+
+ my $x=$x2+$x3;
+ my $y=$y2+$y3;
+ my $n=$x**2+$y**2;
+
+ if ($n)
+ {
+ my $k=.5-($x2*$x + $y2*$y)/$n;
+ return(sqrt($n),$x2+$k*$x,$y2+$k*$y);
+ }
+ else
+ {
+ return(-1);
+ }
+
+}
+
+sub PtoR
+{
+ my ($theta,$r)=@_;
+
+ return($r*cos($theta),$r*sin($theta));
+}
+
+sub RtoP
+{
+ my ($x,$y)=@_;
+
+ return(atan2($y,$x),sqrt($x**2+$y**2));
+}
+
+sub PutLine
+{
+
+ my $f=shift;
+
+ IsText() if !defined($f);
+
+ return if (scalar(@lin) == 0) or (!defined($lin[0]->[0]) and $#lin == 0);
+
+# $stream.="% --- wht=$whtsz, pend=$pendmv, nomv=$nomove\n" if $debug;
+ $pendmv-=$nomove;
+ $lin[$#lin]->[1]=-$pendmv/$cftsz if ($pendmv != 0);
+
+ foreach my $wd (@lin)
+ {
+ next if !defined($wd->[0]);
+ $wd->[0]=~s/\\/\\\\/g;
+ $wd->[0]=~s/\(/\\(/g;
+ $wd->[0]=~s/\)/\\)/g;
+ $wd->[0]=~s/!\|!\|/\\/g;
+ $wd->[1]=d3($wd->[1]);
+ }
+
+ if (0)
+ {
+ if (scalar(@lin) == 1 and (!defined($lin[0]->[1]) or $lin[0]->[1] == 0))
+ {
+ $stream.="($lin[0]->[0]) Tj\n";
+ }
+ else
+ {
+ $stream.="[";
+
+ foreach my $wd (@lin)
+ {
+ $stream.="($wd->[0]) " if defined($wd->[0]);
+ $stream.="$wd->[1] " if defined($wd->[1]) and $wd->[1] != 0;
+ }
+
+ $stream.="] TJ\n";
+ }
+ }
+ else
+ {
+ if (scalar(@lin) == 1 and (!defined($lin[0]->[1]) or $lin[0]->[1] == 0))
+ {
+ $stream.="0 Tw ($lin[0]->[0]) Tj\n";
+ }
+ else
+ {
+ if ($wt>=-1 or $#lin == 0 or $lin[0]->[1]>=0)
+ {
+ $stream.="0 Tw [";
+
+ foreach my $wd (@lin)
+ {
+ $stream.="($wd->[0]) " if defined($wd->[0]);
+ $stream.="$wd->[1] " if defined($wd->[1]) and $wd->[1] != 0;
+ }
+
+ $stream.="] TJ\n";
+ }
+ else
+ {
+ # $stream.="\%dg 0 Tw [";
+ #
+ # foreach my $wd (@lin)
+ # {
+ # $stream.="($wd->[0]) " if defined($wd->[0]);
+ # $stream.="$wd->[1] " if defined($wd->[1]) and $wd->[1] != 0;
+ # }
+ #
+ # $stream.="] TJ\n";
+ #
+ # my $wt=$lin[0]->[1]||0;
+
+ # while ($wt < -$whtsz/$cftsz)
+ # {
+ # $wt+=$whtsz/$cftsz;
+ # }
+
+ $stream.=sprintf( "%.3f Tw ",-($whtsz+$wt*$cftsz)/$unitwidth-$curkern );
+ if (!defined($lin[0]->[0]) and defined($lin[0]->[1]))
+ {
+ $stream.="[ $lin[0]->[1] (";
+ shift @lin;
+ }
+ else
+ {
+ $stream.="[(";
+ }
+
+ foreach my $wd (@lin)
+ {
+ my $wwt=$wd->[1]||0;
+
+ while ($wwt <= $wt+.1)
+ {
+ $wwt-=$wt;
+ $wd->[0].=' ';
+ }
+
+ if (abs($wwt) < .1 or $wwt == 0)
+ {
+ $stream.="$wd->[0]" if defined($wd->[0]);
+ }
+ else
+ {
+ $wwt=sprintf("%.3f",$wwt);
+ $stream.="$wd->[0]) $wwt (" if defined($wd->[0]);
+ }
+ }
+ $stream.=")] TJ\n";
+ }
+ }
+ }
+
+ @lin=();
+ $xpos+=$pendmv/$unitwidth;
+ $pendmv=0;
+ $nomove=0;
+ $wt=-1;
+}
+
+sub d3
+{
+ return(sprintf("%.3f",shift || 0));
+}
+
+sub LoadAhead
+{
+ my $no=shift;
+
+ foreach my $j (1..$no)
+ {
+ my $lin=<>;
+ chomp($lin);
+ $lin=~s/\r$//;
+ $lct++;
+
+ push(@ahead,$lin);
+ $stream.="%% $lin\n" if $debug;
+ }
+}
+
+sub do_V
+{
+ my $par=shift;
+
+ if ($mode eq 't')
+ {
+ PutLine();
+ }
+ else
+ {
+ $xpos+=$pendmv/$unitwidth;
+ $pendmv=0;
+ }
+
+ $ypos=$par/$unitwidth;
+
+ LoadAhead(1);
+
+ if (substr($ahead[0],0,1) eq 'H')
+ {
+ $xpos=substr($ahead[0],1)/$unitwidth;
+
+ $nomove=$pendmv=0;
+ @ahead=();
+
+ }
+
+ $poschg=1;
+}
+
+sub do_v
+{
+ my $par=shift;
+
+ PutLine() if $mode eq 't';
+
+ $ypos+=$par/$unitwidth;
+
+ $poschg=1;
+}
+
+sub TextWid
+{
+ my $txt=shift;
+ my $fnt=shift;
+ my $w=0;
+ my $ck=0;
+
+ foreach my $c (split('',$txt))
+ {
+ my $cn=ord($c);
+ $widtbl->[$cn]=$origwidtbl->[$cn]*$cftsz if !defined($widtbl->[$cn]);
+ $w+=$widtbl->[$cn];
+ }
+
+ $ck=length($txt)*$curkern;
+
+ return(($w/$unitwidth)+$ck);
+}
+
+sub do_t
+{
+ my $par=shift;
+ my $fnt=$fontlst{$cft}->{FNT};
+
+ if ($kernadjust != $curkern)
+ {
+ PutLine();
+ $stream.="$kernadjust Tc\n";
+ $curkern=$kernadjust;
+ }
+
+ my $par2=$par;
+ $par2=~s/^!\|!\|(\d\d\d)/chr(oct($1))/e;
+
+ foreach my $j (0..length($par2)-1)
+ {
+ my $cn=ord(substr($par2,$j,1));
+ my $chnm=$fnt->{NAM}->{$fnt->{NO}->[$cn]->[1]};
+
+ if ($chnm->[USED]==0)
+ {
+ $chnm->[USED]=1;
+ }
+ elsif ($fnt->{NO}->[$cn]->[0] ne $fnt->{NO}->[$cn]->[1])
+ {
+ # A glyph has already been remapped to this char, so find a spare
+
+ my $cn2=RemapChr($cn,$fnt,$fnt->{NO}->[$cn]->[0]);
+ $stream.="% MMM Remap $cn to $cn2\n" if $debug;
+
+ if ($cn2)
+ {
+ substr($par2,$j,1)=chr($cn2);
+
+ if ($par=~m/^!\|!\|(\d\d\d)/)
+ {
+ substr($par,4,3)=sprintf("%03o",$cn2);
+ }
+ else
+ {
+ substr($par,$j,1)=chr($cn2);
+ }
+ }
+ }
+ }
+ my $wid=TextWid($par2,$fnt);
+
+ $par=reverse(split('',$par)) if $xrev and $par!~m/^!\|!\|(\d\d\d)/;
+
+ if ($n_flg and defined($mark))
+ {
+ $mark->{ypos}=$ypos;
+ $mark->{xpos}=$xpos;
+ }
+
+ $n_flg=0;
+ IsText();
+
+ $xpos+=$wid;
+ $xpos+=($pendmv-$nomove)/$unitwidth;
+
+ $stream.="% == '$par'=$wid 'xpos=$xpos\n" if $debug;
+
+ # $pendmv = 'h' move since last 't'
+ # $nomove = width of char(s) added by 'C', 'N' or 'c'
+ # $w-flg = 'w' seen since last t
+
+ if ($fontchg)
+ {
+ PutLine();
+ $whtsz=$fontlst{$cft}->{FNT}->{spacewidth}*$cftsz;
+ $stream.="/F$cft $cftsz Tf\n", $fontchg=0 if $fontchg && defined($cft);
+ }
+
+ $gotT=1;
+
+ $stream.="% --- wht=$whtsz, pend=$pendmv, nomv=$nomove\n" if $debug;
+
+# if ($w_flg && $#lin > -1)
+# {
+# $lin[$#lin]->[0].=' ';
+# $pendmv-=$whtsz;
+# $dontglue=1 if $pendmv==0;
+# }
+
+ $wt=-$pendmv/$cftsz if $w_flg and $wt==-1;
+ $pendmv-=$nomove;
+ $nomove=0;
+ $w_flg=0;
+
+ if ($xrev)
+ {
+ PutLine(0) if $#lin > -1;
+ MakeMatrix(1);
+ $stream.="$matrix ".PutXY($xpos,$ypos)." Tm\n", $poschg=0;
+ $stream.="$curkern Tc\n";
+ $stream.="0 Tw ";
+ $stream.="($par) Tj\n";
+ MakeMatrix();
+ $stream.="$matrix ".PutXY($xpos,$ypos)." Tm\n", $poschg=0;
+ $matrixchg=0;
+ $stream.="$curkern Tc\n";
+ return;
+ }
+
+ if ($pendmv)
+ {
+ if ($#lin == -1)
+ {
+ push(@lin,[undef,-$pendmv/$cftsz]);
+ }
+ else
+ {
+ $lin[$#lin]->[1]=-$pendmv/$cftsz;
+ }
+
+ push(@lin,[$par,undef]);
+# $xpos+=$pendmv/$unitwidth;
+ $pendmv=0
+ }
+ else
+ {
+ if ($#lin == -1)
+ {
+ push(@lin,[$par,undef]);
+ }
+ else
+ {
+ $lin[$#lin]->[0].=$par;
+ }
+ }
+}
+
+sub do_u
+{
+ my $par=shift;
+
+ $par=m/([+-]?\d+) (.*)/;
+ $kernadjust=$1/$unitwidth;
+ do_t($2);
+ $kernadjust=0;
+}
+
+sub do_h
+{
+ $pendmv+=shift;
+}
+
+sub do_H
+{
+ my $par=shift;
+
+ if ($mode eq 't')
+ {
+ PutLine();
+ }
+ else
+ {
+ $xpos+=$pendmv/$unitwidth;
+ $pendmv=0;
+ }
+
+ my $newx=$par/$unitwidth;
+ $stream.=sprintf("%.3f",$newx-$tmxpos)." 0 Td\n" if $mode eq 't';
+ $tmxpos=$xpos=$newx;
+ $pendmv=$nomove=0;
+}
+
+sub do_C
+{
+ my $par=shift;
+
+ my ($par2,$nm)=FindChar($par);
+
+ do_t($par2);
+ $nomove=$fontlst{$cft}->{FNT}->{NAM}->{$par}->[WIDTH]*$cftsz ;
+}
+
+sub FindChar
+{
+ my $chnm=shift;
+ my $fnt=$fontlst{$cft}->{FNT};
+
+ if (exists($fnt->{NAM}->{$chnm}))
+ {
+ my $ch=$fnt->{NAM}->{$chnm}->[ASSIGNED];
+ $ch=RemapChr($ch,$fnt,$chnm) if ($ch > 255);
+ $fnt->{NAM}->{$chnm}->[USED]=0 if $fnt->{NO}->[$ch]->[1] eq $chnm;
+
+ return(($ch<32)?sprintf("!|!|%03o",$ch):chr($ch),$widtbl->[$ch]);
+ }
+ else
+ {
+ return(' ');
+ }
+}
+
+sub RemapChr
+{
+ my $ch=shift;
+ my $fnt=shift;
+ my $chnm=shift;
+ my $unused=0;
+
+ foreach my $un (0..$#{$fnt->{NO}})
+ {
+ next if $un >= 139 and $un <= 144;
+ $unused=$un,last if $fnt->{NO}->[$un]->[1] eq '';
+ }
+
+ if (!$unused)
+ {
+ foreach my $un (128..255)
+ {
+ next if $un >= 139 and $un <= 144;
+ my $glyph=$fnt->{NO}->[$un]->[1];
+ $unused=$un,last if $fnt->{NAM}->{$glyph}->[USED] == 0;
+ }
+ }
+
+ if ($unused && $unused <= 255)
+ {
+ my $glyph=$fnt->{NO}->[$unused]->[1];
+ delete($fontlst{$cft}->{CACHE}->{$cftsz});
+ $fnt->{NAM}->{$chnm}->[ASSIGNED]=$unused;
+ $fnt->{NAM}->{$chnm}->[USED]=1;
+ $fnt->{NO}->[$unused]->[1]=$chnm;
+ $widtbl=CacheWid($cft);
+
+ $stream.="% AAA Assign $chnm ($ch) to $unused\n" if $debug;
+
+ $ch=$unused;
+ return($ch);
+ }
+ else
+ {
+ Warn("too many glyphs used in font '$cft'");
+ return(32);
+ }
+}
+
+sub do_c
+{
+ my $par=shift;
+
+ push(@ahead,substr($par,1));
+ $par=substr($par,0,1);
+ my $ch=ord($par);
+ do_N($ch);
+}
+
+sub do_N
+{
+ my $par=shift;
+ my $fnt=$fontlst{$cft}->{FNT};
+
+ if (!defined($fnt->{NO}->[$par]))
+ {
+ Warn("no chr($par) in font $fnt->{internalname}");
+ return;
+ }
+
+ my $chnm=$fnt->{NO}->[$par]->[0];
+ do_C($chnm);
+}
+
+sub do_n
+{
+ $gotT=0;
+ PutLine(0);
+ $pendmv=$nomove=0;
+ $n_flg=1;
+ @lin=();
+ PutHotSpot($xpos) if defined($mark);
+}
+
+1;
+
+# Local Variables:
+# fill-column: 72
+# mode: CPerl
+# End:
+# vim: set cindent noexpandtab shiftwidth=4 softtabstop=4 textwidth=72:
diff --git a/src/devices/gropdf/pdfmom.1.man b/src/devices/gropdf/pdfmom.1.man
new file mode 100644
index 0000000..08d789c
--- /dev/null
+++ b/src/devices/gropdf/pdfmom.1.man
@@ -0,0 +1,229 @@
+.TH pdfmom @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+pdfmom \- produce PDF documents using the
+.I mom
+macro package for
+.I groff
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2012-2020 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_pdfmom_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY pdfmom
+.RB [ \-Tpdf ]
+.RI [ groff-options ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY pdfmom
+.B \-Tps
+.RI [ pdfroff-options ]
+.RI [ groff-options ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY pdfmom
+.B \-v
+.
+.SY pdfmom
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I pdfmom
+is a wrapper around
+.MR groff @MAN1EXT@
+that facilitates the production of PDF documents from files
+formatted with the
+.I mom
+macros.
+.
+.
+.P
+.I pdfmom
+prints to the standard output,
+so output must usually be redirected to a destination file.
+.
+The size of the final PDF can be reduced by piping the output
+through
+.MR ps2pdf 1 .
+.
+.
+.P
+If called with the
+.B \-Tpdf
+option (which is the default),
+.I pdfmom
+processes files using
+.IR groff 's
+native PDF driver,
+.MR gropdf @MAN1EXT@ .
+.
+If
+.B \-Tps
+is given,
+processing is passed over to
+.IR pdfroff ,
+which uses
+.IR groff 's
+PostScript driver.
+.
+In either case,
+multiple runs of the source file are performed in order to satisfy any
+forward references in the document.
+.
+.
+.P
+.I pdfmom
+accepts all the same options as
+.IR groff .
+.
+If
+.B \-Tps
+is given,
+the options associated with
+.I pdfroff
+are accepted as well.
+.
+When
+.I pdfmom
+calls
+.IR pdfroff ,
+the options
+.RB \[lq] "\-mpdfmark \-mom \-\-no\-toc" \[rq]
+options are implied and should not be given on the command line.
+.
+Equally,
+it is not necessary to supply the
+.B \-mom
+or
+.B "\-m\~mom"
+options when
+.B \-Tps
+is absent.
+.
+.
+.P
+PDF integration with the
+.I mom
+macros is discussed in full in the manual
+\[lq]Producing PDFs with
+.I groff
+and
+.IR mom \[rq],
+which was itself produced with
+.IR pdfmom .
+.
+.
+.P
+If called with the
+.B \-v
+or
+.B \-\-version
+options,
+.I pdfmom
+displays its version information and exits.
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+.I pdfmom
+was written by
+.MT deri@\:chuzzlewit\:.myzen\:.co\:.uk
+Deri James
+.ME
+and
+.MT peter@\:schaffter\:.ca
+Peter Schaffter
+.ME ,
+and is maintained by James.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.TP
+.I @PDFDOCDIR@/\:mom\-pdf.pdf
+\[lq]Producing PDFs with
+.I groff
+and
+.IR mom \[rq],
+by Deri James and Peter Schaffter.
+.
+This file,
+together with its source,
+.IR mom\-pdf.mom ,
+is part of the
+.I groff
+distribution.
+.
+.
+.P
+.MR groff @MAN1EXT@ ,
+.MR gropdf @MAN1EXT@ ,
+.MR pdfroff @MAN1EXT@ ,
+.MR ps2pdf 1
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_pdfmom_1_man_C]
+.do rr *groff_pdfmom_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/devices/gropdf/pdfmom.pl b/src/devices/gropdf/pdfmom.pl
new file mode 100644
index 0000000..89977d4
--- /dev/null
+++ b/src/devices/gropdf/pdfmom.pl
@@ -0,0 +1,150 @@
+#!@PERL@
+#
+# pdfmom : Frontend to run groff -mom to produce PDFs
+# Deri James : Friday 16 Mar 2012
+#
+
+# Copyright (C) 2012-2020 Free Software Foundation, Inc.
+# Written by Deri James <deri@chuzzlewit.myzen.co.uk>
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+use File::Temp qw/tempfile/;
+my @cmd;
+my $dev='pdf';
+my $preconv='';
+my $readstdin=1;
+my $RT_SEP='@RT_SEP@';
+
+$ENV{PATH}=$ENV{GROFF_BIN_PATH}.$RT_SEP.$ENV{PATH} if exists($ENV{GROFF_BIN_PATH});
+$ENV{TMPDIR}=$ENV{GROFF_TMPDIR} if exists($ENV{GROFF_TMPDIR});
+
+while (my $c=shift)
+{
+ $c=~s/(?<!\\)"/\\"/g;
+
+ if (substr($c,0,2) eq '-T')
+ {
+ if (length($c) > 2)
+ {
+ $dev=substr($c,2);
+ }
+ else
+ {
+ $dev=shift;
+ }
+ next;
+ }
+ elsif (substr($c,0,2) eq '-K')
+ {
+ if (length($c) > 2)
+ {
+ $preconv=$c;
+ }
+ else
+ {
+ $preconv=$c;
+ $preconv.=shift;
+ }
+ next;
+ }
+ elsif (substr($c,0,2) eq '-k')
+ {
+ $preconv=$c;
+ next;
+ }
+ elsif ($c eq '-z' or $c eq '-Z')
+ {
+ $dev=$c;
+ next;
+ }
+ elsif ($c eq '-v' or $c eq '--version')
+ {
+ print "GNU pdfmom (groff) version @VERSION@\n";
+ exit;
+ }
+ elsif (substr($c,0,1) eq '-')
+ {
+ if (length($c) > 1)
+ {
+ push(@cmd,"\"$c\"");
+ push(@cmd,"'".(shift)."'") if length($c)==2 and index('dDfFIKLmMnoPrwW',substr($c,-1)) >= 0;
+ }
+ else
+ {
+ # Just a '-'
+
+ push(@cmd,$c);
+ $readstdin=2;
+ }
+ }
+ else
+ {
+ # Got a filename?
+
+ push(@cmd,"\"$c\"");
+ $readstdin=0 if $readstdin == 1;
+
+ }
+
+}
+
+my $cmdstring=' '.join(' ',@cmd).' ';
+
+if ($readstdin)
+{
+ my ($fh,$tmpfn)=tempfile('pdfmom-XXXXX', UNLINK=>1);
+
+ while (<STDIN>)
+ {
+ print $fh ($_);
+ }
+
+ close($fh);
+
+ $cmdstring=~s/ - / $tmpfn / if $readstdin == 2;
+ $cmdstring.=" $tmpfn " if $readstdin == 1;
+}
+
+if ($dev eq 'pdf')
+{
+ system("groff -Tpdf -dLABEL.REFS=1 -mom -z $cmdstring 2>&1 | LC_ALL=C grep '^\\. *ds' | groff -Tpdf -dPDF.EXPORT=1 -dLABEL.REFS=1 -mom -z - $cmdstring 2>&1 | LC_ALL=C grep '^\\. *ds' | groff -Tpdf -mom $preconv - $cmdstring");
+}
+elsif ($dev eq 'ps')
+{
+ system("groff -Tpdf -dLABEL.REFS=1 -mom -z $cmdstring 2>&1 | LC_ALL=C grep '^\\. *ds' | pdfroff -mpdfmark -mom --no-toc - $preconv $cmdstring");
+}
+elsif ($dev eq '-z') # pseudo dev - just compile for warnings
+{
+ system("groff -Tpdf -mom -z $cmdstring");
+}
+elsif ($dev eq '-Z') # pseudo dev - produce troff output
+{
+ system("groff -Tpdf -mom -Z $cmdstring");
+}
+else
+{
+ print STDERR "Not compatible with device '-T $dev'\n";
+ exit 1;
+}
+
+# Local Variables:
+# fill-column: 72
+# mode: CPerl
+# End:
+# vim: set cindent noexpandtab shiftwidth=2 softtabstop=2 textwidth=72:
diff --git a/src/devices/grops/TODO b/src/devices/grops/TODO
new file mode 100644
index 0000000..eab8f83
--- /dev/null
+++ b/src/devices/grops/TODO
@@ -0,0 +1,24 @@
+Read PFB files directly.
+
+Generate %%For comment.
+
+Generate %%Title comment.
+
+Angles in arc command: don't generate more digits after the decimal
+point than are necessary.
+
+Possibly generate BoundingBox comment.
+
+Per font composite character mechanism (sufficient for fractions).
+
+Consider whether we ought to do rounding of graphical objects other
+than lines. What's the point?
+
+Error messages should refer to output page number.
+
+Search for downloadable fonts using their PostScript names if not
+found in download file.
+
+Separate path for searching for downloadable font files.
+
+Clip to the BoundingBox when importing documents.
diff --git a/src/devices/grops/grops.1.man b/src/devices/grops/grops.1.man
new file mode 100644
index 0000000..d0ec21d
--- /dev/null
+++ b/src/devices/grops/grops.1.man
@@ -0,0 +1,1831 @@
+.TH grops @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+grops \-
+.I groff
+output driver for PostScript
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2018, 2020 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_grops_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" This macro definition is poor style from a portability standpoint,
+.\" but it's a good test and demonstration of the standard font
+.\" repertoire for the devices where it has any effect at all, and so
+.\" should be retained.
+.de FT
+. if '\\*(.T'ps' .ft \\$1
+. if '\\*(.T'pdf' .ft \\$1
+..
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY grops
+.RB [ \-glm ]
+.RB [ \-b\~\c
+.IR brokenness-flags ]
+.RB [ \-c\~\c
+.IR num-copies ]
+.RB [ \-F\~\c
+.IR font-directory ]
+.RB [ \-I\~\c
+.IR inclusion-directory ]
+.RB [ \-p\~\c
+.IR paper-format ]
+.RB [ \-P\~\c
+.IR prologue-file ]
+.RB [ \-w\~\c
+.IR rule-thickness ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY grops
+.B \-\-help
+.YS
+.
+.
+.SY grops
+.B \-v
+.
+.SY grops
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The GNU
+.I roff
+PostScript output driver translates the output of
+.MR @g@troff @MAN1EXT@
+into PostScript.
+.
+Normally,
+.I grops
+is invoked by
+.MR groff @MAN1EXT@
+when the latter is given the
+.RB \[lq] \-T\~ps \[rq]
+option.
+.
+(In this installation,
+.B @DEVICE@
+is the default output device.)
+.
+Use
+.IR groff 's
+.B \-P
+option to pass any options shown above to
+.IR grops .
+.
+If no
+.I file
+arguments are given,
+or if
+.I file
+is \[lq]\-\[rq],
+.I grotty
+reads the standard input stream.
+.
+Output is written to the standard output stream.
+.
+.
+.P
+When called with multiple
+.I file
+arguments,
+.I grops
+doesn't produce a valid document structure
+(one conforming to the Document Structuring Conventions).
+.
+To print such concatenated output,
+it is necessary to deactivate DSC handling in the printing program or
+previewer.
+.
+.
+.P
+See section \[lq]Font installation\[rq] below for a guide to installing
+fonts for
+.IR grops .
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.BI \-b\~ n
+Work around problems with spoolers,
+previewers,
+and older printers.
+.
+Normally,
+.I grops
+produces output at PostScript \%LanguageLevel\~2 that conforms to
+version 3.0 of the Document Structuring Conventions.
+.
+Some software and devices can't handle such a data stream.
+.
+The value
+.RI of\~ n
+determines what
+.I grops
+does to make its output acceptable to such consumers.
+.
+If
+.I n
+is
+.BR 0 ,
+.I grops
+employs no workarounds,
+which is the default;
+it can be changed by modifying the
+.B broken
+directive in
+.IR grops 's
+.I DESC
+file.
+.
+.
+.IP
+Add\~1 to suppress generation of
+.B %%Begin\%Document\%Setup
+and
+.B %%End\%Document\%Setup
+comments;
+this is needed for early versions of TranScript that get confused by
+anything between the
+.B %%End\%Prolog
+comment and the first
+.B %%Page
+comment.
+.
+.
+.IP
+Add\~2 to omit lines in included files beginning with
+.BR %!\& ,
+which confuse Sun's
+.I pageview
+previewer.
+.
+.
+.IP
+Add\~4 to omit lines in included files beginning with
+.BR %%Page ,
+.B %%Trailer
+and
+.BR %%End\%Prolog ;
+this is needed for spoolers that don't understand
+.B %%Begin\%Document
+and
+.B %%End\%Document
+comments.
+.
+.
+.IP
+Add\~8 to write
+.B %!PS\-Adobe\-2.0
+rather than
+.B %!PS\-Adobe\-3.0
+as the first line of the PostScript output;
+this is needed when using Sun's Newsprint with a printer that requires
+page reversal.
+.
+.
+.IP
+Add\~16 to omit media size information
+(that is,
+output neither a
+.B %%Document\%Media
+comment nor the
+.B setpagedevice
+PostScript command).
+.
+This was the behavior of
+.I groff
+1.18.1 and earlier;
+it is
+needed for older printers that don't understand PostScript
+\%LanguageLevel\~2,
+and is also necessary if the output is further processed to produce an
+EPS file;
+see subsection \[lq]Escapsulated PostScript\[rq] below.
+.
+.
+.TP
+.BI \-c\~ n
+Output
+.I n
+copies of each page.
+.
+.
+.TP
+.BI \-F\~ dir
+Prepend directory
+.RI dir /dev name
+to the search path for
+font and device description and PostScript prologue files;
+.I name
+is the name of the device,
+usually
+.BR ps .
+.
+.
+.TP
+.B \-g
+Generate PostScript code to guess the page length.
+.
+The guess is correct only if the imageable area is vertically centered
+on the page.
+.
+This option allows you to generate documents that can be printed on both
+U.S.\& letter and A4 paper formats without change.
+.
+.
+.TP
+.BI \-I\~ dir
+Search the directory
+.I dir
+for files named in
+.B \[rs]X\[aq]ps: file\[aq]
+and
+.B \[rs]X\[aq]ps: import\[aq]
+escape sequences.
+.
+.B \-I
+may be specified more than once;
+each
+.I dir
+is searched in the given order.
+.
+To search the current working directory before others,
+add
+.RB \[lq] "\-I .\&" \[rq]
+at the desired place;
+it is otherwise searched last.
+.
+.
+.TP
+.B \-l
+Use landscape orientation rather than portrait.
+.
+.
+.TP
+.B \-m
+Turn on manual feed for the document.
+.
+.
+.TP
+.BI \-p\~ fmt
+Set physical dimensions of output medium,
+overriding the
+.BR \%papersize ,
+.BR \%paperlength ,
+and
+.B \%paperwidth
+directives in the
+.I DESC
+file.
+.
+.I fmt
+can be any argument accepted by the
+.B \%papersize
+directive;
+see
+.MR groff_font @MAN5EXT@ .
+.
+.
+.TP
+.BI \-P\~ prologue
+Use the file
+.IR prologue ,
+sought in the
+.I groff
+font search path,
+as the PostScript prologue,
+overriding the default
+(see section \[lq]Files\[rq] below)
+and the environment variable
+.I GROPS_PROLOGUE.
+.
+.
+.TP
+.BI \-w\~ n
+Draw rules (lines) with a thickness of
+.IR n \~thousandths
+of an em.
+.
+The default thickness is
+.B 40
+(0.04\~em).
+.
+.
+.\" ====================================================================
+.SH Usage
+.\" ====================================================================
+.
+The input to
+.I grops
+must be in the format output by
+.MR @g@troff @MAN1EXT@ ,
+described in
+.MR groff_out @MAN5EXT@ .
+.
+In addition,
+the device and font description files for the device used must meet
+certain requirements.
+.
+The device resolution must be an integer multiple of\~72 times the
+.BR sizescale .
+.
+The device description file must contain a valid paper format;
+see
+.MR groff_font @MAN5EXT@ .
+.
+Each font description file must contain a directive
+.
+.RS
+.EX
+.RI internalname\~ psname
+.EE
+.RE
+.
+which says that the PostScript name of the font is
+.IR psname .
+.
+.
+.P
+A font description file may also contain a directive
+.
+.RS
+.EX
+.RI encoding\~ enc-file
+.EE
+.RE
+.
+which says that
+the PostScript font should be reencoded using the encoding described in
+.IR enc-file ;
+this file should consist of a sequence of lines of the form
+.
+.
+.RS
+.EX
+.I pschar code
+.EE
+.RE
+.
+where
+.I pschar
+is the PostScript name of the character,
+and
+.I code
+is its position in the encoding expressed as a decimal integer;
+valid values are in the range 0 to\~255.
+.
+Lines starting with
+.B #
+and blank lines are ignored.
+.
+The code for each character given in the font description file must
+correspond to the code for the character in encoding file,
+or to the code in the default encoding for the font if the PostScript
+font is not to be reencoded.
+.
+This code can be used with the
+.B \[rs]N
+escape sequence in
+.I @g@troff
+to select the character,
+even if it does not have a
+.I groff
+glyph name.
+.
+Every character in the font description file must exist in the
+PostScript font,
+and the widths given in the font description file must match the widths
+used in the PostScript font.
+.
+.I grops
+assumes that a character with a
+.I groff
+name of
+.B space
+is blank
+(makes no marks on the page);
+it can make use of such a character to generate more efficient and
+compact PostScript output.
+.
+.
+.P
+.I grops
+is able to display all glyphs in a PostScript font;
+it is not limited to 256 of them.
+.
+.I enc-file
+(or the default encoding if no encoding file is specified)
+just defines the
+order of glyphs for the first 256 characters;
+all other glyphs are accessed with additional encoding vectors which
+.I grops
+produces on the fly.
+.
+.
+.P
+.I grops
+can embed fonts in a document that are necessary to render it;
+this is called \[lq]downloading\[rq].
+.
+Such fonts must be in PFA format.
+.
+Use
+.MR pfbtops @MAN1EXT@
+to convert a Type\~1 font in PFB format.
+.
+Downloadable fonts must be listed a
+.I download
+file containing lines of the form
+.
+.RS
+.EX
+.I psname file
+.EE
+.RE
+.
+where
+.I psname
+is the PostScript name of the font,
+and
+.I file
+is the name of the file containing it;
+lines beginning with
+.B #
+and blank lines are ignored;
+fields may be separated by tabs or spaces.
+.
+.I file
+is sought using the same mechanism as that for
+.I groff
+font description files.
+.
+The
+.I download
+file itself is also sought using this mechanism;
+currently,
+only the first matching file found in the device and font description
+search path is used.
+.
+.
+.P
+If the file containing a downloadable font or imported document
+conforms to the Adobe Document Structuring Conventions,
+then
+.I grops
+interprets any comments in the files sufficiently to ensure that its
+own output is conforming.
+.
+It also supplies any needed font resources that are listed in the
+.I download
+file
+as well as any needed file resources.
+.
+It is also able to handle inter-resource dependencies.
+.
+For example,
+suppose that you have a downloadable font called Garamond,
+and also a downloadable font called Garamond-Outline which depends on
+Garamond
+(typically it would be defined to copy Garamond's font dictionary,
+and change the PaintType),
+then it is necessary for Garamond to appear before Garamond-Outline in
+the PostScript document.
+.
+.I grops
+handles this automatically provided that the downloadable font file
+for Garamond-Outline indicates its dependence on Garamond by means of
+the Document Structuring Conventions,
+for example by beginning with the following lines.
+.
+.RS
+.EX
+%!PS\-Adobe\-3.0 Resource\-Font
+%%DocumentNeededResources: font Garamond
+%%EndComments
+%%IncludeResource: font Garamond
+.EE
+.RE
+.
+In this case,
+both Garamond and Garamond-Outline would need to be listed
+in the
+.I download
+file.
+.
+A downloadable font should not include its own name in a
+.B %%Document\%Supplied\%Resources
+comment.
+.
+.
+.P
+.I grops
+does not interpret
+.B %%Document\%Fonts
+comments.
+.
+The
+.BR %%Document\%Needed\%Resources ,
+.BR %%Document\%Supplied\%Resources ,
+.BR %%Include\%Resource ,
+.BR %%Begin\%Resource ,
+and
+.B %%End\%Resource
+comments
+(or possibly the old
+.BR %%Document\%Needed\%Fonts ,
+.BR %%Document\%Supplied\%Fonts ,
+.BR %%Include\%Font ,
+.BR %%Begin\%Font ,
+and
+.B %%End\%Font
+comments)
+should be used.
+.
+.
+.P
+The default stroke and fill color is black.
+.
+For colors defined in the \[lq]rgb\[rq] color space,
+.B setrgbcolor
+is used;
+for \[lq]cmy\[rq] and \[lq]cmyk\[rq],
+.BR setcmykcolor ;
+and for \[lq]gray\[rq],
+.BR setgray .
+.
+.B setcmykcolor
+is a PostScript \%LanguageLevel\~2 command and thus not available on
+some older printers.
+.
+.
+.\" ====================================================================
+.SS Typefaces
+.\" ====================================================================
+.
+.P
+Styles called
+.BR R ,
+.BR I ,
+.BR B ,
+and
+.B BI
+mounted at font positions 1 to\~4.
+.
+Text fonts are grouped into families
+.BR A ,
+.BR BM ,
+.BR C ,
+.BR H ,
+.BR HN ,
+.BR N ,
+.BR P ,
+.RB and\~ T ,
+each having members in each of these styles.
+.
+.
+.RS
+.TP
+.B AR
+.FT AR
+AvantGarde-Book
+.FT
+.
+.TQ
+.B AI
+.FT AI
+AvantGarde-BookOblique
+.FT
+.
+.TQ
+.B AB
+.FT AB
+AvantGarde-Demi
+.FT
+.
+.TQ
+.B ABI
+.FT ABI
+AvantGarde-DemiOblique
+.FT
+.
+.TQ
+.B BMR
+.FT BMR
+Bookman-Light
+.FT
+.
+.TQ
+.B BMI
+.FT BMI
+Bookman-LightItalic
+.FT
+.
+.TQ
+.B BMB
+.FT BMB
+Bookman-Demi
+.FT
+.
+.TQ
+.B BMBI
+.FT BMBI
+Bookman-DemiItalic
+.FT
+.
+.TQ
+.B CR
+.FT CR
+Courier
+.FT
+.
+.TQ
+.B CI
+.FT CI
+Courier-Oblique
+.FT
+.
+.TQ
+.B CB
+.FT CB
+Courier-Bold
+.FT
+.
+.TQ
+.B CBI
+.FT CBI
+Courier-BoldOblique
+.FT
+.
+.TQ
+.B HR
+.FT HR
+Helvetica
+.FT
+.
+.TQ
+.B HI
+.FT HI
+Helvetica-Oblique
+.FT
+.
+.TQ
+.B HB
+.FT HB
+Helvetica-Bold
+.FT
+.
+.TQ
+.B HBI
+.FT HBI
+Helvetica-BoldOblique
+.FT
+.
+.TQ
+.B HNR
+.FT HNR
+Helvetica-Narrow
+.FT
+.
+.TQ
+.B HNI
+.FT HNI
+Helvetica-Narrow-Oblique
+.FT
+.
+.TQ
+.B HNB
+.FT HNB
+Helvetica-Narrow-Bold
+.FT
+.
+.TQ
+.B HNBI
+.FT HNBI
+Helvetica-Narrow-BoldOblique
+.FT
+.
+.TQ
+.B NR
+.FT NR
+NewCenturySchlbk-Roman
+.FT
+.
+.TQ
+.B NI
+.FT NI
+NewCenturySchlbk-Italic
+.FT
+.
+.TQ
+.B NB
+.FT NB
+NewCenturySchlbk-Bold
+.FT
+.
+.TQ
+.B NBI
+.FT NBI
+NewCenturySchlbk-BoldItalic
+.FT
+.
+.TQ
+.B PR
+.FT PR
+Palatino-Roman
+.FT
+.
+.TQ
+.B PI
+.FT PI
+Palatino-Italic
+.FT
+.
+.TQ
+.B PB
+.FT PB
+Palatino-Bold
+.FT
+.
+.TQ
+.B PBI
+.FT PBI
+Palatino-BoldItalic
+.FT
+.
+.TQ
+.B TR
+.FT TR
+Times-Roman
+.FT
+.
+.TQ
+.B TI
+.FT TI
+Times-Italic
+.FT
+.
+.TQ
+.B TB
+.FT TB
+Times-Bold
+.FT
+.
+.TQ
+.B TBI
+.FT TBI
+Times-BoldItalic
+.FT
+.RE
+.
+.
+.br
+.ne 2v
+.P
+Another text font is not a member of a family.
+.
+.
+.RS
+.TP
+.B ZCMI
+.FT ZCMI
+ZapfChancery-MediumItalic
+.FT
+.RE
+.
+.
+.P
+Special fonts include
+.BR S ,
+the PostScript Symbol font;
+.BR ZD ,
+Zapf Dingbats;
+.B SS
+(slanted symbol),
+which contains oblique forms of lowercase Greek letters derived from
+Symbol;
+.BR EURO ,
+which offers a Euro glyph for use with old devices lacking it;
+and
+.BR ZDR ,
+a reversed version of ZapfDingbats
+(with symbols flipped about the vertical axis).
+.
+Most glyphs in these fonts are unnamed and must be accessed using
+.BR \[rs]N .
+.
+The last three are not standard PostScript fonts,
+but supplied by
+.I groff
+and therefore included in the default
+.I download
+file.
+.
+.
+.\" ====================================================================
+.SS "Device control commands"
+.\" ====================================================================
+.
+.I grops
+recognizes device control commands produced by the
+.B \[rs]X
+escape sequence,
+but interprets only those that begin with a
+.RB \[lq] ps: \[rq]
+tag.
+.
+.
+.TP
+.BI "\[rs]X\[aq]ps: exec\~" code \[aq]
+.RS
+Execute the arbitrary PostScript commands
+.IR code .
+.
+The PostScript
+.I \%currentpoint
+is set to the
+.I groff
+drawing position when the
+.B \[rs]X
+escape sequence is interpreted before executing
+.IR code .
+.
+The origin is at the top left corner of the page;
+.IR x \~coordinates
+increase to the right,
+and
+.IR y \~coordinates
+down the page.
+.
+A
+.RB procedure\~ u
+is defined that converts
+.I groff
+basic units to the coordinate system in effect
+(provided the user doesn't change the scale).
+.
+For example,
+.
+.RS
+.EX
+\&.nr x 1i
+\[rs]X\[aq]ps: exec \[rs]nx u 0 rlineto stroke\[aq]
+.EE
+.RE
+.
+draws a horizontal line one inch long.
+.
+.I code
+may make changes to the graphics state,
+but any changes persist only to the end of the page.
+.
+A dictionary containing the definitions specified by the
+.B def
+and
+.B mdef
+commands is on top of the dictionary stack.
+.
+If your code adds definitions to this dictionary,
+you should allocate space for them using
+.RB \[lq] "\[rs]X\[aq]ps: mdef\~"
+.IB n \[aq]\c
+\[rq].
+.
+Any definitions persist only until the end of the page.
+.
+If you use the
+.B \[rs]Y
+escape sequence with an argument that names a macro,
+.I code
+can extend over multiple lines.
+.
+For example,
+.
+.RS
+.EX
+\&.nr x 1i
+\&.de y
+\&ps: exec
+\&\[rs]nx u 0 rlineto
+\&stroke
+\&..
+\&\[rs]Yy
+.EE
+.RE
+.
+is another way to draw a horizontal line one inch long.
+.
+The single backslash before
+.RB \[lq] nx \[rq]\[em]the
+only reason to use a register while defining the macro
+.RB \[lq] y \[rq]\[em]is
+to convert a user-specified dimension
+.RB \[lq] 1i \[rq]
+to
+.I groff
+basic units which are in turn converted to PostScript units with the
+.B u
+procedure.
+.
+.
+.P
+.I grops
+wraps user-specified PostScript code into a dictionary,
+nothing more.
+.
+In particular,
+it doesn't start and end the inserted code with
+.B save
+and
+.BR restore ,
+respectively.
+.
+This must be supplied by the user,
+if necessary.
+.RE
+.
+.
+.TP
+.BI "\[rs]X\[aq]ps: file\~" name \[aq]
+This is the same as the
+.B exec
+command except that the PostScript code is read from file
+.IR name .
+.
+.
+.TP
+.BI "\[rs]X\[aq]ps: def\~" code \[aq]
+Place a PostScript definition contained in
+.I code
+in the prologue.
+.
+There should be at most one definition per
+.B \[rs]X
+command.
+.
+Long definitions can be split over several
+.B \[rs]X
+commands;
+all the
+.I code
+arguments are simply joined together separated by newlines.
+.
+The definitions are placed in a dictionary which is automatically
+pushed on the dictionary stack when an
+.B exec
+command is executed.
+.
+If you use the
+.B \[rs]Y
+escape sequence with an argument that names a macro,
+.I code
+can extend over multiple lines.
+.
+.
+.TP
+.BI "\[rs]X\[aq]ps: mdef\~" "n code" \[aq]
+Like
+.BR def ,
+except that
+.I code
+may contain up to
+.IR n \~definitions.
+.
+.I grops
+needs to know how many definitions
+.I code
+contains
+so that it can create an appropriately sized PostScript dictionary
+to contain them.
+.
+.
+.TP
+.BI "\[rs]X\[aq]ps: import\~" "file llx lly urx ury width\~"\c
+.RI [ height ]\c
+.B \[aq]
+Import a PostScript graphic from
+.IR file .
+.
+The arguments
+.IR llx ,
+.IR lly ,
+.IR urx ,
+and
+.I ury
+give the bounding box of the graphic in the default PostScript
+coordinate system.
+.
+They should all be integers:
+.I llx
+and
+.I lly
+are the
+.I x
+and
+.IR y \~coordinates
+of the lower left corner of the graphic;
+.I urx
+and
+.I ury
+are the
+.I x
+and
+.IR y \~coordinates
+of the upper right corner of the graphic;
+.I width
+and
+.I height
+are integers that give the desired width and height in
+.I groff
+basic units of the graphic.
+.
+.
+.IP
+The graphic is scaled so that it has this width and height
+and translated so that the lower left corner of the graphic is
+located at the position associated with
+.B \[rs]X
+command.
+.
+If the height argument is omitted it is scaled uniformly in the
+.I x
+and
+.IR y \~axes
+so that it has the specified width.
+.
+.
+.IP
+The contents of the
+.B \[rs]X
+command are not interpreted by
+.IR @g@troff ,
+so vertical space for the graphic is not automatically added,
+and the
+.I width
+and
+.I height
+arguments are not allowed to have attached scaling indicators.
+.
+.
+.IP
+If the PostScript file complies with the Adobe Document Structuring
+Conventions and contains a
+.B %%Bounding\%Box
+comment,
+then the bounding box can be automatically extracted from within
+.I groff
+input by using the
+.B psbb
+request.
+.
+.
+.IP
+See
+.MR groff_tmac @MAN5EXT@
+for a description of the
+.B PSPIC
+macro which provides a convenient high-level interface for inclusion of
+PostScript graphics.
+.
+.
+.TP
+.B \[rs]X\[aq]ps: invis\[aq]
+.TQ
+.B \[rs]X\[aq]ps: endinvis\[aq]
+No output is generated for text and drawing commands
+that are bracketed with these
+.B \[rs]X
+commands.
+.
+These commands are intended for use when output from
+.I @g@troff
+is previewed before being processed with
+.IR grops ;
+if the previewer is unable to display certain characters
+or other constructs,
+then other substitute characters or constructs can be used for
+previewing by bracketing them with these
+.B \[rs]X
+commands.
+.
+.
+.RS
+.P
+For example,
+.I \%gxditview
+is not able to display a proper
+.B \[rs][em]
+character because the standard X11 fonts do not provide it;
+this problem can be overcome by executing the following
+request
+.
+.
+.IP
+.EX
+\&.char \[rs][em] \[rs]X\[aq]ps: invis\[aq]\[rs]
+\[rs]Z\[aq]\[rs]v\[aq]-.25m\[aq]\[rs]h\[aq].05m\[aq]\c
+\[rs]D\[aq]l .9m 0\[aq]\[rs]h\[aq].05m\[aq]\[aq]\[rs]
+\[rs]X\[aq]ps: endinvis\[aq]\[rs][em]
+.EE
+.
+.
+.P
+In this case,
+.I \%gxditview
+is unable to display the
+.B \[rs][em]
+character and draws the line,
+whereas
+.I grops
+prints the
+.B \[rs][em]
+character
+and ignores the line
+(this code is already in file
+.IR Xps.tmac ,
+which is loaded if a document intended for
+.I grops
+is previewed with
+.IR \%gxditview ).
+.RE
+.
+.
+.P
+If a PostScript procedure
+.B BPhook
+has been defined via a
+.RB \[lq] "ps: def" \[rq]
+or
+.RB \[lq] "ps: mdef" \[rq]
+device control command,
+it is executed at the beginning of every page
+(before anything is drawn or written by
+.IR groff ).
+.
+For example,
+to underlay the page contents with the word \[lq]DRAFT\[rq] in light
+gray,
+you might use
+.
+.
+.RS
+.P
+.EX
+\&.de XX
+ps: def
+/BPhook
+{ gsave .9 setgray clippath pathbbox exch 2 copy
+ .5 mul exch .5 mul translate atan rotate pop pop
+ /NewCenturySchlbk-Roman findfont 200 scalefont setfont
+ (DRAFT) dup stringwidth pop \-.5 mul \-70 moveto show
+ grestore }
+def
+\&..
+\&.devicem XX
+.EE
+.RE
+.
+.
+.P
+Or,
+to cause lines and polygons to be drawn with square linecaps and mitered
+linejoins instead of the round linecaps and linejoins normally used by
+.IR grops ,
+use
+.
+.RS
+.EX
+\&.de XX
+ps: def
+/BPhook { 2 setlinecap 0 setlinejoin } def
+\&..
+\&.devicem XX
+.EE
+.RE
+.
+(square linecaps,
+as opposed to butt linecaps
+.RB (\[lq] "0 setlinecap" \[rq]),
+give true corners in boxed tables even though the lines are drawn
+unconnected).
+.
+.
+.\" ====================================================================
+.SS "Encapsulated PostScript"
+.\" ====================================================================
+.
+.I grops
+itself doesn't emit bounding box information.
+.
+The following script,
+.IR groff2eps ,
+produces an EPS file.
+.
+.
+.RS
+.P
+.EX
+#! /bin/sh
+groff \-P\-b16 "$1" > "$1".ps
+gs \-dNOPAUSE \-sDEVICE=bbox \-\- "$1".ps 2> "$1".bbox
+sed \-e "/\[ha]%%Orientation/r $1.bbox" \[rs]
+ \-e "/\[ha]%!PS\-Adobe\-3.0/s/$/ EPSF\-3.0/" "$1".ps > "$1".eps
+rm "$1".ps "$1".bbox
+.EE
+.RE
+.
+.
+.P
+You can then use
+.RB \[lq] "groff2eps foo" \[rq]
+to convert file
+.I foo
+to
+.IR foo.eps .
+.
+.
+.\" ====================================================================
+.SS "TrueType and other font formats"
+.\" ====================================================================
+.
+TrueType fonts can be used with
+.I grops
+if converted first to Type\~42 format,
+a PostScript wrapper equivalent to the PFA format described in
+.MR pfbtops @MAN1EXT@ .
+.
+Several methods exist to generate a Type\~42 wrapper;
+some of them involve the use of a PostScript interpreter such as
+Ghostscript\[em]see
+.MR gs 1 .
+.
+.
+.P
+One approach is to use
+.UR https://fontforge.org/
+FontForge
+.UE ,
+a font editor that can convert most outline font formats.
+.
+Here's an example of using the Roboto Slab Serif font with
+.IR groff .
+.
+Several variables are used so that you can more easily adapt it into
+your own script.
+.
+.
+.RS 4
+.P
+.EX
+MAP=@FONTDIR@/devps/generate/text.map
+TTF=/usr/share/fonts/truetype/roboto/slab/RobotoSlab\-Regular.ttf
+BASE=$(basename \[dq]$TTF\[dq])
+INT=${BASE%.ttf}
+PFA=$INT.pfa
+AFM=$INT.afm
+GFN=RSR
+DIR=$HOME/.local/groff/font
+mkdir \-p \[dq]$DIR\[dq]/devps
+fontforge \-lang=ff \-c \[dq]Open(\[rs]\[dq]$TTF\[rs]\[dq]);\[rs]
+\tGenerate(\[rs]\[dq]$DIR/devps/$PFA\[rs]\[dq]);\[dq]
+afmtodit \[dq]$DIR/devps/$AFM\[dq] \[dq]$MAP\[dq] \
+\[dq]$DIR/devps/$GFN\[dq]
+printf \[dq]$BASE\[rs]t$PFA\[rs]n\[dq] >> \[dq]$DIR/devps/download\[dq]
+.EE
+.RE
+.
+.
+.P
+.I fontforge
+and
+.I afmtodit
+may generate warnings depending on the attributes of the font.
+.
+The test procedure is simple.
+.
+.
+.RS 4
+.P
+.EX
+printf \[dq].ft RSR\[rs]nHello, world!\[rs]n\[dq] | groff \-F \
+\[dq]$DIR\[dq] > hello.ps
+.EE
+.RE
+.
+.
+.P
+Once you're satisfied that the font works,
+you may want to generate any available related styles
+(for instance,
+Roboto Slab
+also has \[lq]Bold\[rq],
+\[lq]Light\[rq],
+and
+\[lq]Thin\[rq]
+styles)
+and set up
+.I GROFF_FONT_PATH
+in your environment to include the directory you keep the generated
+fonts in so that you don't have to use the
+.B \-F
+option.
+.
+.
+.\" ====================================================================
+.SH "Font installation"
+.\" ====================================================================
+.
+The following is a step-by-step font installation guide for
+.I grops.
+.
+.
+.IP \[bu] 2n
+Convert your font to something
+.I groff
+understands.
+.
+This is a PostScript Type\~1 font in PFA format or a PostScript
+Type\~42 font,
+together with an AFM file.
+.
+A PFA file begins as follows.
+.
+.RS
+.RS \" two RS calls to get inboard of IP indentation
+.EX
+%!PS\-AdobeFont\-1.0:
+.EE
+.RE
+.
+A PFB file contains this string as well,
+preceded by some non-printing bytes.
+.
+If your font is in PFB format,
+use
+.IR groff 's
+.MR pfbtops @MAN1EXT@
+program to convert it to PFA.
+.
+For TrueType and other font formats,
+we recommend
+.IR fontforge ,
+which can convert most outline font formats.
+.
+A Type\~42 font file begins as follows.
+.
+.RS
+.EX
+%!PS\-TrueTypeFont
+.EE
+.RE
+.
+This is a wrapper format for TrueType fonts.
+.
+Old PostScript printers might not support them
+(that is,
+they might not have a built-in TrueType font interpreter).
+.
+In the following steps,
+we will consider the use of CTAN's
+.UR https://\:ctan.org/\:tex\-archive/\:fonts/\:brushscr
+BrushScriptX-Italic
+.UE
+font in PFA format.
+.RE \" now restore left margin
+.
+.
+.IP \[bu]
+Convert the AFM file to a
+.I groff
+font description file with the
+.MR afmtodit @MAN1EXT@
+program.
+.
+For instance,
+.
+.RS
+.RS \" two RS calls to get inboard of IP indentation
+.EX
+$ \c
+.B afmtodit BrushScriptX\-Italic.afm text.map BSI
+.EE
+.RE
+.
+converts the Adobe Font Metric file
+.I BrushScriptX\-Italic.afm
+to the
+.I groff
+font description file
+.IR BSI .
+.RE \" now restore left margin
+.
+.
+.IP
+If you have a font family which provides regular upright (roman),
+bold,
+italic,
+and
+bold-italic styles
+(where \[lq]italic\[rq] may be \[lq]oblique\[rq] or \[lq]slanted\[rq]),
+we recommend using the letters
+.BR R ,
+.BR B ,
+.BR I ,
+and
+.BR BI ,
+respectively,
+as suffixes to the
+.I groff
+font family name to enable
+.IR groff 's
+font family and style selection features.
+.
+An example is
+.IR groff 's
+built-in support for Times:
+the font family
+name is abbreviated as
+.BR T ,
+and the
+.I groff
+font names are therefore
+.BR TR ,
+.BR TB ,
+.BR TI ,
+and
+.BR TBI .
+.
+In our example,
+however,
+the BrushScriptX font is available in a single style only,
+italic.
+.
+.
+.IP \[bu]
+Install the
+.I groff
+font description file(s) in a
+.I devps
+subdirectory in the search path that
+.I groff
+uses for device and font file descriptions.
+.
+See the
+.I GROFF_FONT_PATH
+entry in section \[lq]Environment\[rq] of
+.MR @g@troff @MAN1EXT@
+for the current value of the font search path.
+.
+While
+.I groff
+doesn't directly use AFM files,
+it is a good idea to store them alongside its font description files.
+.
+.
+.IP \[bu]
+Register fonts in the
+.I devps/download
+file so they can be located for embedding in PostScript files
+.I grops
+generates.
+.
+Only the first
+.I download
+file encountered in the font search path is read.
+.
+If in doubt,
+copy the default
+.I download
+file
+(see section \[lq]Files\[rq] below)
+to the first directory in the font search path and add your fonts there.
+.
+The PostScript font name used by
+.I grops
+is stored in the
+.B internalname
+field in the
+.I groff
+font description file.
+.
+(This name does not necessarily resemble the font's file name.)
+.
+We add the following line to
+.IR download .
+.
+.RS
+.RS \" two RS calls to get inboard of IP indentation
+.EX
+BrushScriptX\-Italic\[->]BrushScriptX\-Italic.pfa
+.EE
+.RE \" but only one to get back to it
+.
+A tab character,
+depicted as \[->],
+separates the fields.
+.RE \" now restore left margin
+.
+.
+.IP \[bu]
+Test the selection and embedding of the new font.
+.
+.RS
+.RS \" two RS calls to get inboard of IP indentation
+.EX
+printf "\[rs]\[rs]f[BSI]Hello, world!\[rs]n" \
+| groff \-T ps \-P \-e >hello.ps
+see hello.pdf
+.EE
+.RE
+.RE \" now restore left margin
+.
+.
+.\" ====================================================================
+.SH "Old fonts"
+.\" ====================================================================
+.
+.I groff
+versions 1.19.2 and earlier contained descriptions of a slightly
+different set of the base 35 PostScript level 2 fonts defined by Adobe.
+.
+The older set has 229 glyphs and a larger set of kerning pairs;
+the newer one has 314 glyphs and includes the Euro glyph.
+.
+For backwards compatibility,
+these old font descriptions are also installed in the
+.I @OLDFONTDIR@/\:\%devps
+directory.
+.
+.
+.P
+To use them,
+make sure that
+.I grops
+finds the fonts before the default system fonts
+(with the same names):
+either give
+.I grops
+the
+.B \-F
+command-line option,
+.
+.RS
+.EX
+$ \c
+.B groff \-Tps \-P\-F \-P@OLDFONTDIR@ \c
+\&.\|.\|.
+.EE
+.RE
+.
+or add the directory to
+.IR groff 's
+font and device description search path environment variable,
+.
+.RS
+.EX
+$ \c
+.B GROFF_FONT_PATH=\:@OLDFONTDIR@ \[rs]
+.RS
+.B groff \-Tps \c
+\&.\|.\|.
+.RE
+.EE
+.RE
+.
+when the command runs.
+.
+.
+.br
+.ne 3v
+.\" ====================================================================
+.SH Environment
+.\" ====================================================================
+.
+.TP
+.I GROFF_FONT_PATH
+A list of directories in which to seek the selected output device's
+directory of device and font description files.
+.
+See
+.MR @g@troff @MAN1EXT@
+and
+.MR groff_font @MAN5EXT@ .
+.
+.
+.TP
+.I GROPS_PROLOGUE
+If this is set to
+.IR foo ,
+then
+.I grops
+uses the file
+.I foo
+(in the font path) instead of the default prologue file
+.IR prologue .
+.
+The option
+.B \-P
+overrides this environment variable.
+.
+.
+.TP
+.I SOURCE_DATE_EPOCH
+A timestamp
+(expressed as seconds since the Unix epoch)
+to use as the output creation timestamp in place of the current time.
+.
+The time is converted to human-readable form using
+.MR ctime 3
+and recorded in a PostScript comment.
+.
+.
+.TP
+.I TZ
+The time zone to use when converting the current time
+(or value of
+.IR SOURCE_DATE_EPOCH )
+to human-readable form;
+see
+.MR tzset 3 .
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @FONTDIR@/\:\%devps/\:DESC
+describes the
+.B ps
+output device.
+.
+.
+.TP
+.IR @FONTDIR@/\:\%devps/ F
+describes the font known
+.RI as\~ F
+on device
+.BR ps .
+.
+.
+.TP
+.I @FONTDIR@/\:\%devps/\:\%download
+lists fonts available for embedding within the PostScript document
+(or download to the device).
+.
+.
+.TP
+.I @FONTDIR@/\:\%devps/\:\%prologue
+is the default PostScript prologue prefixed to every output file.
+.
+.
+.TP
+.I @FONTDIR@/\:\%devps/\:text.enc
+describes the encoding scheme used by most PostScript Type\~1 fonts;
+the
+.B \%encoding
+directive of
+font description files for the
+.B ps
+device refers to it.
+.
+.
+.TP
+.I @MACRODIR@/\:ps.tmac
+defines macros for use with the
+.B ps
+output device.
+.
+It is automatically loaded by
+.I troffrc
+when the
+.B ps
+output device is selected.
+.
+.
+.TP
+.I @MACRODIR@/\:pspic.tmac
+defines the
+.B PSPIC
+macro for embedding images in a document;
+see
+.MR groff_tmac @MAN5EXT@ .
+.
+It is automatically loaded by
+.I troffrc.
+.
+.
+.TP
+.I @MACRODIR@/psold.tmac
+provides replacement glyphs for text fonts that lack complete coverage
+of the ISO Latin-1 character set;
+using it,
+.I groff
+can produce glyphs like eth (\[Sd]) and thorn (\[Tp]) that older
+PostScript printers do not natively support.
+.
+.
+.P
+.I grops
+creates temporary files using the template
+.RI \[lq] grops XXXXXX\[rq];
+see
+.MR groff @MAN1EXT@
+for details on their storage location.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.UR http://\:partners\:.adobe\:.com/\:public/\:developer/\:en/\:ps/\
+\:5001\:.DSC_Spec\:.pdf
+PostScript Language Document Structuring Conventions Specification
+.UE
+.
+.
+.P
+.MR afmtodit @MAN1EXT@ ,
+.MR groff @MAN1EXT@ ,
+.MR @g@troff @MAN1EXT@ ,
+.MR pfbtops @MAN1EXT@ ,
+.MR groff_char @MAN7EXT@ ,
+.MR groff_font @MAN5EXT@ ,
+.MR groff_out @MAN5EXT@ ,
+.MR groff_tmac @MAN5EXT@
+.
+.
+.\" Clean up.
+.rm FT
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_grops_1_man_C]
+.do rr *groff_grops_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/devices/grops/grops.am b/src/devices/grops/grops.am
new file mode 100644
index 0000000..cb5532a
--- /dev/null
+++ b/src/devices/grops/grops.am
@@ -0,0 +1,38 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+bin_PROGRAMS += grops
+grops_SOURCES = \
+ src/devices/grops/ps.cpp \
+ src/devices/grops/psrm.cpp \
+ src/devices/grops/ps.h
+grops_LDADD = $(LIBM) \
+ libdriver.a \
+ libgroff.a \
+ lib/libgnu.a
+man1_MANS += src/devices/grops/grops.1
+EXTRA_DIST += \
+ src/devices/grops/grops.1.man \
+ src/devices/grops/psfig.diff \
+ src/devices/grops/TODO
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/devices/grops/ps.cpp b/src/devices/grops/ps.cpp
new file mode 100644
index 0000000..807945f
--- /dev/null
+++ b/src/devices/grops/ps.cpp
@@ -0,0 +1,1894 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/*
+ * PostScript documentation:
+ * http://www.adobe.com/products/postscript/pdfs/PLRM.pdf
+ * http://partners.adobe.com/public/developer/en/ps/5001.DSC_Spec.pdf
+ */
+
+#include "lib.h" // PI
+#include "driver.h"
+#include "stringclass.h"
+#include "cset.h"
+#include "nonposix.h"
+#include "paper.h"
+#include "curtime.h"
+
+#include "ps.h"
+#include <time.h>
+
+#ifdef NEED_DECLARATION_PUTENV
+extern "C" {
+ int putenv(const char *);
+}
+#endif /* NEED_DECLARATION_PUTENV */
+
+extern "C" const char *Version_string;
+
+// search path defaults to the current directory
+search_path include_search_path(0, 0, 0, 1);
+
+static int landscape_flag = 0;
+static int manual_feed_flag = 0;
+static int ncopies = 1;
+static int linewidth = -1;
+// Non-zero means generate PostScript code that guesses the paper
+// length using the imageable area.
+static int guess_flag = 0;
+static double user_paper_length = 0;
+static double user_paper_width = 0;
+
+// Non-zero if -b was specified on the command line.
+static int bflag = 0;
+unsigned broken_flags = 0;
+
+// Non-zero means we need the CMYK extension for PostScript Level 1
+static int cmyk_flag = 0;
+
+#define DEFAULT_LINEWIDTH 40 /* in ems/1000 */
+#define MAX_LINE_LENGTH 72
+#define FILL_MAX 1000
+
+const char *const dict_name = "grops";
+const char *const defs_dict_name = "DEFS";
+const int DEFS_DICT_SPARE = 50;
+
+double degrees(double r)
+{
+ return r*180.0/PI;
+}
+
+double radians(double d)
+{
+ return d*PI/180.0;
+}
+
+// This is used for testing whether a character should be output in the
+// PostScript file using \nnn, so we really want the character to be
+// less than 0200.
+
+inline int is_ascii(char c)
+{
+ return (unsigned char)c < 0200;
+}
+
+ps_output::ps_output(FILE *f, int n)
+: fp(f), col(0), max_line_length(n), need_space(0), fixed_point(0)
+{
+}
+
+ps_output &ps_output::set_file(FILE *f)
+{
+ fp = f;
+ col = 0;
+ return *this;
+}
+
+ps_output &ps_output::copy_file(FILE *infp)
+{
+ int c;
+ while ((c = getc(infp)) != EOF)
+ putc(c, fp);
+ return *this;
+}
+
+ps_output &ps_output::end_line()
+{
+ if (col != 0) {
+ putc('\n', fp);
+ col = 0;
+ need_space = 0;
+ }
+ return *this;
+}
+
+ps_output &ps_output::special(const char *s)
+{
+ if (s == 0 || *s == '\0')
+ return *this;
+ if (col != 0) {
+ putc('\n', fp);
+ col = 0;
+ }
+ fputs(s, fp);
+ if (strchr(s, '\0')[-1] != '\n')
+ putc('\n', fp);
+ need_space = 0;
+ return *this;
+}
+
+ps_output &ps_output::simple_comment(const char *s)
+{
+ if (col != 0)
+ putc('\n', fp);
+ putc('%', fp);
+ putc('%', fp);
+ fputs(s, fp);
+ putc('\n', fp);
+ col = 0;
+ need_space = 0;
+ return *this;
+}
+
+ps_output &ps_output::begin_comment(const char *s)
+{
+ if (col != 0)
+ putc('\n', fp);
+ putc('%', fp);
+ putc('%', fp);
+ fputs(s, fp);
+ col = 2 + strlen(s);
+ return *this;
+}
+
+ps_output &ps_output::end_comment()
+{
+ if (col != 0) {
+ putc('\n', fp);
+ col = 0;
+ }
+ need_space = 0;
+ return *this;
+}
+
+ps_output &ps_output::comment_arg(const char *s)
+{
+ int len = strlen(s);
+ if (col + len + 1 > max_line_length) {
+ putc('\n', fp);
+ fputs("%%+", fp);
+ col = 3;
+ }
+ putc(' ', fp);
+ fputs(s, fp);
+ col += len + 1;
+ return *this;
+}
+
+ps_output &ps_output::set_fixed_point(int n)
+{
+ assert(n >= 0 && n <= 10);
+ fixed_point = n;
+ return *this;
+}
+
+ps_output &ps_output::put_delimiter(char c)
+{
+ if (col + 1 > max_line_length) {
+ putc('\n', fp);
+ col = 0;
+ }
+ putc(c, fp);
+ col++;
+ need_space = 0;
+ return *this;
+}
+
+ps_output &ps_output::put_string(const char *s, int n)
+{
+ int len = 0;
+ int i;
+ for (i = 0; i < n; i++) {
+ char c = s[i];
+ if (is_ascii(c) && csprint(c)) {
+ if (c == '(' || c == ')' || c == '\\')
+ len += 2;
+ else
+ len += 1;
+ }
+ else
+ len += 4;
+ }
+ if (len > n*2) {
+ if (col + n*2 + 2 > max_line_length && n*2 + 2 <= max_line_length) {
+ putc('\n', fp);
+ col = 0;
+ }
+ if (col + 1 > max_line_length) {
+ putc('\n', fp);
+ col = 0;
+ }
+ putc('<', fp);
+ col++;
+ for (i = 0; i < n; i++) {
+ if (col + 2 > max_line_length) {
+ putc('\n', fp);
+ col = 0;
+ }
+ fprintf(fp, "%02x", s[i] & 0377);
+ col += 2;
+ }
+ putc('>', fp);
+ col++;
+ }
+ else {
+ if (col + len + 2 > max_line_length && len + 2 <= max_line_length) {
+ putc('\n', fp);
+ col = 0;
+ }
+ if (col + 2 > max_line_length) {
+ putc('\n', fp);
+ col = 0;
+ }
+ putc('(', fp);
+ col++;
+ for (i = 0; i < n; i++) {
+ char c = s[i];
+ if (is_ascii(c) && csprint(c)) {
+ if (c == '(' || c == ')' || c == '\\')
+ len = 2;
+ else
+ len = 1;
+ }
+ else
+ len = 4;
+ if (col + len + 1 > max_line_length) {
+ putc('\\', fp);
+ putc('\n', fp);
+ col = 0;
+ }
+ switch (len) {
+ case 1:
+ putc(c, fp);
+ break;
+ case 2:
+ putc('\\', fp);
+ putc(c, fp);
+ break;
+ case 4:
+ fprintf(fp, "\\%03o", c & 0377);
+ break;
+ default:
+ assert(0);
+ }
+ col += len;
+ }
+ putc(')', fp);
+ col++;
+ }
+ need_space = 0;
+ return *this;
+}
+
+ps_output &ps_output::put_number(int n)
+{
+ char buf[1 + INT_DIGITS + 1];
+ sprintf(buf, "%d", n);
+ int len = strlen(buf);
+ if (col > 0 && col + len + need_space > max_line_length) {
+ putc('\n', fp);
+ col = 0;
+ need_space = 0;
+ }
+ if (need_space) {
+ putc(' ', fp);
+ col++;
+ }
+ fputs(buf, fp);
+ col += len;
+ need_space = 1;
+ return *this;
+}
+
+ps_output &ps_output::put_fix_number(int i)
+{
+ const char *p = if_to_a(i, fixed_point);
+ int len = strlen(p);
+ if (col > 0 && col + len + need_space > max_line_length) {
+ putc('\n', fp);
+ col = 0;
+ need_space = 0;
+ }
+ if (need_space) {
+ putc(' ', fp);
+ col++;
+ }
+ fputs(p, fp);
+ col += len;
+ need_space = 1;
+ return *this;
+}
+
+ps_output &ps_output::put_float(double d)
+{
+ char buf[128];
+ sprintf(buf, "%.4f", d);
+ int last = strlen(buf) - 1;
+ while (buf[last] == '0')
+ last--;
+ if (buf[last] == '.')
+ last--;
+ buf[++last] = '\0';
+ if (col > 0 && col + last + need_space > max_line_length) {
+ putc('\n', fp);
+ col = 0;
+ need_space = 0;
+ }
+ if (need_space) {
+ putc(' ', fp);
+ col++;
+ }
+ fputs(buf, fp);
+ col += last;
+ need_space = 1;
+ return *this;
+}
+
+ps_output &ps_output::put_symbol(const char *s)
+{
+ int len = strlen(s);
+ if (col > 0 && col + len + need_space > max_line_length) {
+ putc('\n', fp);
+ col = 0;
+ need_space = 0;
+ }
+ if (need_space) {
+ putc(' ', fp);
+ col++;
+ }
+ fputs(s, fp);
+ col += len;
+ need_space = 1;
+ return *this;
+}
+
+ps_output &ps_output::put_color(unsigned int c)
+{
+ char buf[128];
+ sprintf(buf, "%.3g", double(c) / double(color::MAX_COLOR_VAL));
+ int len = strlen(buf);
+ if (col > 0 && col + len + need_space > max_line_length) {
+ putc('\n', fp);
+ col = 0;
+ need_space = 0;
+ }
+ if (need_space) {
+ putc(' ', fp);
+ col++;
+ }
+ fputs(buf, fp);
+ col += len;
+ need_space = 1;
+ return *this;
+}
+
+ps_output &ps_output::put_literal_symbol(const char *s)
+{
+ int len = strlen(s);
+ if (col > 0 && col + len + 1 > max_line_length) {
+ putc('\n', fp);
+ col = 0;
+ }
+ putc('/', fp);
+ fputs(s, fp);
+ col += len + 1;
+ need_space = 1;
+ return *this;
+}
+
+class ps_font : public font {
+ ps_font(const char *);
+public:
+ int encoding_index;
+ char *encoding;
+ char *reencoded_name;
+ ~ps_font();
+ void handle_unknown_font_command(const char *command, const char *arg,
+ const char *filename, int lineno);
+ static ps_font *load_ps_font(const char *);
+};
+
+ps_font *ps_font::load_ps_font(const char *s)
+{
+ ps_font *f = new ps_font(s);
+ if (!f->load()) {
+ delete f;
+ return 0;
+ }
+ return f;
+}
+
+ps_font::ps_font(const char *nm)
+: font(nm), encoding_index(-1), encoding(0), reencoded_name(0)
+{
+}
+
+ps_font::~ps_font()
+{
+ free(encoding);
+ delete[] reencoded_name;
+}
+
+void ps_font::handle_unknown_font_command(const char *command, const char *arg,
+ const char *filename, int lineno)
+{
+ if (strcmp(command, "encoding") == 0) {
+ if (arg == 0)
+ error_with_file_and_line(filename, lineno,
+ "'encoding' command requires an argument");
+ else
+ encoding = strsave(arg);
+ }
+}
+
+static void handle_unknown_desc_command(const char *command, const char *arg,
+ const char *filename, int lineno)
+{
+ if (strcmp(command, "broken") == 0) {
+ if (arg == 0)
+ error_with_file_and_line(filename, lineno,
+ "'broken' command requires an argument");
+ else if (!bflag)
+ broken_flags = atoi(arg);
+ }
+}
+
+struct subencoding {
+ font *p;
+ unsigned int num;
+ int idx;
+ char *subfont;
+ const char *glyphs[256];
+ subencoding *next;
+
+ subencoding(font *, unsigned int, int, subencoding *);
+ ~subencoding();
+};
+
+subencoding::subencoding(font *f, unsigned int n, int ix, subencoding *s)
+: p(f), num(n), idx(ix), subfont(0), next(s)
+{
+ for (int i = 0; i < 256; i++)
+ glyphs[i] = 0;
+}
+
+subencoding::~subencoding()
+{
+ delete[] subfont;
+}
+
+struct style {
+ font *f;
+ subencoding *sub;
+ int point_size;
+ int height;
+ int slant;
+ style();
+ style(font *, subencoding *, int, int, int);
+ int operator==(const style &) const;
+ int operator!=(const style &) const;
+};
+
+style::style() : f(0)
+{
+}
+
+style::style(font *p, subencoding *s, int sz, int h, int sl)
+: f(p), sub(s), point_size(sz), height(h), slant(sl)
+{
+}
+
+int style::operator==(const style &s) const
+{
+ return (f == s.f
+ && sub == s.sub
+ && point_size == s.point_size
+ && height == s.height
+ && slant == s.slant);
+}
+
+int style::operator!=(const style &s) const
+{
+ return !(*this == s);
+}
+
+class ps_printer : public printer {
+ FILE *tempfp;
+ ps_output out;
+ int res;
+ glyph *space_glyph;
+ int pages_output;
+ int paper_length;
+ int equalise_spaces;
+ enum { SBUF_SIZE = 256 };
+ char sbuf[SBUF_SIZE];
+ int sbuf_len;
+ int sbuf_start_hpos;
+ int sbuf_vpos;
+ int sbuf_end_hpos;
+ int sbuf_space_width;
+ int sbuf_space_count;
+ int sbuf_space_diff_count;
+ int sbuf_space_code;
+ int sbuf_kern;
+ style sbuf_style;
+ color sbuf_color; // the current PS color
+ style output_style;
+ subencoding *subencodings;
+ int output_hpos;
+ int output_vpos;
+ int output_draw_point_size;
+ int line_thickness;
+ int output_line_thickness;
+ unsigned char output_space_code;
+ enum { MAX_DEFINED_STYLES = 50 };
+ style defined_styles[MAX_DEFINED_STYLES];
+ int ndefined_styles;
+ int next_encoding_index;
+ int next_subencoding_index;
+ string defs;
+ int ndefs;
+ resource_manager rm;
+ int invis_count;
+
+ void flush_sbuf();
+ void set_style(const style &);
+ void set_space_code(unsigned char);
+ int set_encoding_index(ps_font *);
+ subencoding *set_subencoding(font *, glyph *, unsigned char *);
+ char *get_subfont(subencoding *, const char *);
+ void do_exec(char *, const environment *);
+ void do_import(char *, const environment *);
+ void do_def(char *, const environment *);
+ void do_mdef(char *, const environment *);
+ void do_file(char *, const environment *);
+ void do_invis(char *, const environment *);
+ void do_endinvis(char *, const environment *);
+ void set_line_thickness_and_color(const environment *);
+ void fill_path(const environment *);
+ void encode_fonts();
+ void encode_subfont(subencoding *);
+ void define_encoding(const char *, int);
+ void reencode_font(ps_font *);
+ void set_color(color *, int = 0);
+
+ const char *media_name();
+ int media_width();
+ int media_height();
+ void media_set();
+
+public:
+ ps_printer(double);
+ ~ps_printer();
+ void set_char(glyph *, font *, const environment *, int, const char *);
+ void draw(int, int *, int, const environment *);
+ void begin_page(int);
+ void end_page(int);
+ void special(char *, const environment *, char);
+ font *make_font(const char *);
+ void end_of_line();
+};
+
+// 'pl' is in inches
+ps_printer::ps_printer(double pl)
+: out(0, MAX_LINE_LENGTH),
+ pages_output(0),
+ sbuf_len(0),
+ subencodings(0),
+ output_hpos(-1),
+ output_vpos(-1),
+ line_thickness(-1),
+ ndefined_styles(0),
+ next_encoding_index(0),
+ next_subencoding_index(0),
+ ndefs(0),
+ invis_count(0)
+{
+ tempfp = xtmpfile();
+ out.set_file(tempfp);
+ if (linewidth < 0)
+ linewidth = DEFAULT_LINEWIDTH;
+ if (font::hor != 1)
+ fatal("device horizontal motion quantum must be 1, got %1",
+ font::hor);
+ if (font::vert != 1)
+ fatal("device vertical motion quantum must be 1, got %1",
+ font::vert);
+ if (font::res % (font::sizescale*72) != 0)
+ fatal("device resolution must be a multiple of 72*'sizescale', got"
+ " %1 ('sizescale'=%2)", font::res, font::sizescale);
+ int r = font::res;
+ int point = 0;
+ while (r % 10 == 0) {
+ r /= 10;
+ point++;
+ }
+ res = r;
+ out.set_fixed_point(point);
+ space_glyph = name_to_glyph("space");
+ if (pl == 0)
+ paper_length = font::paperlength;
+ else
+ paper_length = int(pl * font::res + 0.5);
+ if (paper_length == 0)
+ paper_length = 11 * font::res;
+ equalise_spaces = font::res >= 72000;
+}
+
+int ps_printer::set_encoding_index(ps_font *f)
+{
+ if (f->encoding_index >= 0)
+ return f->encoding_index;
+ for (font_pointer_list *p = font_list; p; p = p->next)
+ if (p->p != f) {
+ char *encoding = ((ps_font *)p->p)->encoding;
+ int encoding_index = ((ps_font *)p->p)->encoding_index;
+ if (encoding != 0 && encoding_index >= 0
+ && strcmp(f->encoding, encoding) == 0) {
+ return f->encoding_index = encoding_index;
+ }
+ }
+ return f->encoding_index = next_encoding_index++;
+}
+
+subencoding *ps_printer::set_subencoding(font *f, glyph *g,
+ unsigned char *codep)
+{
+ unsigned int idx = f->get_code(g);
+ *codep = idx % 256;
+ unsigned int num = idx >> 8;
+ if (num == 0)
+ return 0;
+ subencoding *p = 0;
+ for (p = subencodings; p; p = p->next)
+ if (p->p == f && p->num == num)
+ break;
+ if (p == 0)
+ p = subencodings = new subencoding(f, num, next_subencoding_index++,
+ subencodings);
+ p->glyphs[*codep] = f->get_special_device_encoding(g);
+ return p;
+}
+
+char *ps_printer::get_subfont(subencoding *sub, const char *stem)
+{
+ assert(sub != 0);
+ if (!sub->subfont) {
+ char *tem = new char[strlen(stem) + 2 + INT_DIGITS + 1];
+ sprintf(tem, "%s@@%d", stem, sub->idx);
+ sub->subfont = tem;
+ }
+ return sub->subfont;
+}
+
+void ps_printer::set_char(glyph *g, font *f, const environment *env, int w,
+ const char *)
+{
+ if (g == space_glyph || invis_count > 0)
+ return;
+ unsigned char code;
+ subencoding *sub = set_subencoding(f, g, &code);
+ style sty(f, sub, env->size, env->height, env->slant);
+ if (sty.slant != 0) {
+ if (sty.slant > 80 || sty.slant < -80) {
+ error("silly slant '%1' degrees", sty.slant);
+ sty.slant = 0;
+ }
+ }
+ if (sbuf_len > 0) {
+ if (sbuf_len < SBUF_SIZE
+ && sty == sbuf_style
+ && sbuf_vpos == env->vpos
+ && sbuf_color == *env->col) {
+ if (sbuf_end_hpos == env->hpos) {
+ sbuf[sbuf_len++] = code;
+ sbuf_end_hpos += w + sbuf_kern;
+ return;
+ }
+ if (sbuf_len == 1 && sbuf_kern == 0) {
+ sbuf_kern = env->hpos - sbuf_end_hpos;
+ sbuf_end_hpos = env->hpos + sbuf_kern + w;
+ sbuf[sbuf_len++] = code;
+ return;
+ }
+ /* If sbuf_end_hpos - sbuf_kern == env->hpos, we are better off
+ starting a new string. */
+ if (sbuf_len < SBUF_SIZE - 1 && env->hpos >= sbuf_end_hpos
+ && (sbuf_kern == 0 || sbuf_end_hpos - sbuf_kern != env->hpos)) {
+ if (sbuf_space_code < 0) {
+ if (f->contains(space_glyph) && !sub) {
+ sbuf_space_code = f->get_code(space_glyph);
+ sbuf_space_width = env->hpos - sbuf_end_hpos;
+ sbuf_end_hpos = env->hpos + w + sbuf_kern;
+ sbuf[sbuf_len++] = sbuf_space_code;
+ sbuf[sbuf_len++] = code;
+ sbuf_space_count++;
+ return;
+ }
+ }
+ else {
+ int diff = env->hpos - sbuf_end_hpos - sbuf_space_width;
+ if (diff == 0 || (equalise_spaces && (diff == 1 || diff == -1))) {
+ sbuf_end_hpos = env->hpos + w + sbuf_kern;
+ sbuf[sbuf_len++] = sbuf_space_code;
+ sbuf[sbuf_len++] = code;
+ sbuf_space_count++;
+ if (diff == 1)
+ sbuf_space_diff_count++;
+ else if (diff == -1)
+ sbuf_space_diff_count--;
+ return;
+ }
+ }
+ }
+ }
+ flush_sbuf();
+ }
+ sbuf_len = 1;
+ sbuf[0] = code;
+ sbuf_end_hpos = env->hpos + w;
+ sbuf_start_hpos = env->hpos;
+ sbuf_vpos = env->vpos;
+ sbuf_style = sty;
+ sbuf_space_code = -1;
+ sbuf_space_width = 0;
+ sbuf_space_count = sbuf_space_diff_count = 0;
+ sbuf_kern = 0;
+ if (sbuf_color != *env->col)
+ set_color(env->col);
+}
+
+static char *make_encoding_name(int encoding_index)
+{
+ static char buf[3 + INT_DIGITS + 1];
+ sprintf(buf, "ENC%d", encoding_index);
+ return buf;
+}
+
+static char *make_subencoding_name(int subencoding_index)
+{
+ static char buf[6 + INT_DIGITS + 1];
+ sprintf(buf, "SUBENC%d", subencoding_index);
+ return buf;
+}
+
+const char *const WS = " \t\n\r";
+
+void ps_printer::define_encoding(const char *encoding, int encoding_index)
+{
+ char *vec[256];
+ int i;
+ for (i = 0; i < 256; i++)
+ vec[i] = 0;
+ char *path;
+ FILE *fp = font::open_file(encoding, &path);
+ if (fp == 0)
+ fatal("can't open encoding file '%1'", encoding);
+ int lineno = 1;
+ const int BUFFER_SIZE = 512;
+ char buf[BUFFER_SIZE];
+ while (fgets(buf, BUFFER_SIZE, fp) != 0) {
+ char *p = buf;
+ while (csspace(*p))
+ p++;
+ if (*p != '#' && *p != '\0' && (p = strtok(buf, WS)) != 0) {
+ char *q = strtok(0, WS);
+ int n = 0; // pacify compiler
+ if (q == 0 || sscanf(q, "%d", &n) != 1 || n < 0 || n >= 256)
+ fatal_with_file_and_line(path, lineno, "bad second field");
+ vec[n] = new char[strlen(p) + 1];
+ strcpy(vec[n], p);
+ }
+ lineno++;
+ }
+ free(path);
+ out.put_literal_symbol(make_encoding_name(encoding_index))
+ .put_delimiter('[');
+ for (i = 0; i < 256; i++) {
+ if (vec[i] == 0)
+ out.put_literal_symbol(".notdef");
+ else {
+ out.put_literal_symbol(vec[i]);
+ delete[] vec[i];
+ }
+ }
+ out.put_delimiter(']')
+ .put_symbol("def");
+ fclose(fp);
+}
+
+void ps_printer::reencode_font(ps_font *f)
+{
+ out.put_literal_symbol(f->reencoded_name)
+ .put_symbol(make_encoding_name(f->encoding_index))
+ .put_literal_symbol(f->get_internal_name())
+ .put_symbol("RE");
+}
+
+void ps_printer::encode_fonts()
+{
+ if (next_encoding_index == 0)
+ return;
+ char *done_encoding = new char[next_encoding_index];
+ for (int i = 0; i < next_encoding_index; i++)
+ done_encoding[i] = 0;
+ for (font_pointer_list *f = font_list; f; f = f->next) {
+ int encoding_index = ((ps_font *)f->p)->encoding_index;
+ if (encoding_index >= 0) {
+ assert(encoding_index < next_encoding_index);
+ if (!done_encoding[encoding_index]) {
+ done_encoding[encoding_index] = 1;
+ define_encoding(((ps_font *)f->p)->encoding, encoding_index);
+ }
+ reencode_font((ps_font *)f->p);
+ }
+ }
+ delete[] done_encoding;
+}
+
+void ps_printer::encode_subfont(subencoding *sub)
+{
+ assert(sub != 0);
+ out.put_literal_symbol(make_subencoding_name(sub->idx))
+ .put_delimiter('[');
+ for (int i = 0; i < 256; i++)
+ {
+ if (sub->glyphs[i])
+ out.put_literal_symbol(sub->glyphs[i]);
+ else
+ out.put_literal_symbol(".notdef");
+ }
+ out.put_delimiter(']')
+ .put_symbol("def");
+}
+
+void ps_printer::set_style(const style &sty)
+{
+ char buf[1 + INT_DIGITS + 1];
+ for (int i = 0; i < ndefined_styles; i++)
+ if (sty == defined_styles[i]) {
+ sprintf(buf, "F%d", i);
+ out.put_symbol(buf);
+ return;
+ }
+ if (ndefined_styles >= MAX_DEFINED_STYLES)
+ ndefined_styles = 0;
+ sprintf(buf, "F%d", ndefined_styles);
+ out.put_literal_symbol(buf);
+ const char *psname = sty.f->get_internal_name();
+ if (psname == 0)
+ fatal("no internalname specified for font '%1'", sty.f->get_name());
+ char *encoding = ((ps_font *)sty.f)->encoding;
+ if (sty.sub == 0) {
+ if (encoding != 0) {
+ char *s = ((ps_font *)sty.f)->reencoded_name;
+ if (s == 0) {
+ int ei = set_encoding_index((ps_font *)sty.f);
+ char *tem = new char[strlen(psname) + 1 + INT_DIGITS + 1];
+ sprintf(tem, "%s@%d", psname, ei);
+ psname = tem;
+ ((ps_font *)sty.f)->reencoded_name = tem;
+ }
+ else
+ psname = s;
+ }
+ }
+ else
+ psname = get_subfont(sty.sub, psname);
+ out.put_fix_number((font::res/(72*font::sizescale))*sty.point_size);
+ if (sty.height != 0 || sty.slant != 0) {
+ int h = sty.height == 0 ? sty.point_size : sty.height;
+ h *= font::res/(72*font::sizescale);
+ int c = int(h*tan(radians(sty.slant)) + .5);
+ out.put_fix_number(c)
+ .put_fix_number(h)
+ .put_literal_symbol(psname)
+ .put_symbol("MF");
+ }
+ else {
+ out.put_literal_symbol(psname)
+ .put_symbol("SF");
+ }
+ defined_styles[ndefined_styles++] = sty;
+}
+
+void ps_printer::set_color(color *col, int fill)
+{
+ sbuf_color = *col;
+ unsigned int components[4];
+ char s[3];
+ color_scheme cs = col->get_components(components);
+ s[0] = fill ? 'F' : 'C';
+ s[2] = 0;
+ switch (cs) {
+ case DEFAULT: // black
+ out.put_symbol("0");
+ s[1] = 'g';
+ break;
+ case RGB:
+ out.put_color(Red)
+ .put_color(Green)
+ .put_color(Blue);
+ s[1] = 'r';
+ break;
+ case CMY:
+ col->get_cmyk(&Cyan, &Magenta, &Yellow, &Black);
+ // fall through
+ case CMYK:
+ out.put_color(Cyan)
+ .put_color(Magenta)
+ .put_color(Yellow)
+ .put_color(Black);
+ s[1] = 'k';
+ cmyk_flag = 1;
+ break;
+ case GRAY:
+ out.put_color(Gray);
+ s[1] = 'g';
+ break;
+ }
+ out.put_symbol(s);
+}
+
+void ps_printer::set_space_code(unsigned char c)
+{
+ out.put_literal_symbol("SC")
+ .put_number(c)
+ .put_symbol("def");
+}
+
+void ps_printer::end_of_line()
+{
+ flush_sbuf();
+ // this ensures that we do an absolute motion to the beginning of a line
+ output_vpos = output_hpos = -1;
+}
+
+void ps_printer::flush_sbuf()
+{
+ enum {
+ NONE,
+ RELATIVE_H,
+ RELATIVE_V,
+ RELATIVE_HV,
+ ABSOLUTE
+ } motion = NONE;
+ int space_flag = 0;
+ if (sbuf_len == 0)
+ return;
+ if (output_style != sbuf_style) {
+ set_style(sbuf_style);
+ output_style = sbuf_style;
+ }
+ int extra_space = 0;
+ if (output_hpos < 0 || output_vpos < 0)
+ motion = ABSOLUTE;
+ else {
+ if (output_hpos != sbuf_start_hpos)
+ motion = RELATIVE_H;
+ if (output_vpos != sbuf_vpos) {
+ if (motion != NONE)
+ motion = RELATIVE_HV;
+ else
+ motion = RELATIVE_V;
+ }
+ }
+ if (sbuf_space_code >= 0) {
+ int w = sbuf_style.f->get_width(space_glyph, sbuf_style.point_size);
+ if (w + sbuf_kern != sbuf_space_width) {
+ if (sbuf_space_code != output_space_code) {
+ set_space_code(sbuf_space_code);
+ output_space_code = sbuf_space_code;
+ }
+ space_flag = 1;
+ extra_space = sbuf_space_width - w - sbuf_kern;
+ if (sbuf_space_diff_count > sbuf_space_count/2)
+ extra_space++;
+ else if (sbuf_space_diff_count < -(sbuf_space_count/2))
+ extra_space--;
+ }
+ }
+ if (space_flag)
+ out.put_fix_number(extra_space);
+ if (sbuf_kern != 0)
+ out.put_fix_number(sbuf_kern);
+ out.put_string(sbuf, sbuf_len);
+ char command_array[] = {'A', 'B', 'C', 'D',
+ 'E', 'F', 'G', 'H',
+ 'I', 'J', 'K', 'L',
+ 'M', 'N', 'O', 'P',
+ 'Q', 'R', 'S', 'T'};
+ char sym[2];
+ sym[0] = command_array[motion*4 + space_flag + 2*(sbuf_kern != 0)];
+ sym[1] = '\0';
+ switch (motion) {
+ case NONE:
+ break;
+ case ABSOLUTE:
+ out.put_fix_number(sbuf_start_hpos)
+ .put_fix_number(sbuf_vpos);
+ break;
+ case RELATIVE_H:
+ out.put_fix_number(sbuf_start_hpos - output_hpos);
+ break;
+ case RELATIVE_V:
+ out.put_fix_number(sbuf_vpos - output_vpos);
+ break;
+ case RELATIVE_HV:
+ out.put_fix_number(sbuf_start_hpos - output_hpos)
+ .put_fix_number(sbuf_vpos - output_vpos);
+ break;
+ default:
+ assert(0);
+ }
+ out.put_symbol(sym);
+ output_hpos = sbuf_end_hpos;
+ output_vpos = sbuf_vpos;
+ sbuf_len = 0;
+}
+
+void ps_printer::set_line_thickness_and_color(const environment *env)
+{
+ if (line_thickness < 0) {
+ if (output_draw_point_size != env->size) {
+ // we ought to check for overflow here
+ int lw = ((font::res/(72*font::sizescale))*linewidth*env->size)/1000;
+ out.put_fix_number(lw)
+ .put_symbol("LW");
+ output_draw_point_size = env->size;
+ output_line_thickness = -1;
+ }
+ }
+ else {
+ if (output_line_thickness != line_thickness) {
+ out.put_fix_number(line_thickness)
+ .put_symbol("LW");
+ output_line_thickness = line_thickness;
+ output_draw_point_size = -1;
+ }
+ }
+ if (sbuf_color != *env->col)
+ set_color(env->col);
+}
+
+void ps_printer::fill_path(const environment *env)
+{
+ if (sbuf_color == *env->fill)
+ out.put_symbol("FL");
+ else
+ set_color(env->fill, 1);
+}
+
+void ps_printer::draw(int code, int *p, int np, const environment *env)
+{
+ if (invis_count > 0)
+ return;
+ flush_sbuf();
+ int fill_flag = 0;
+ switch (code) {
+ case 'C':
+ fill_flag = 1;
+ // fall through
+ case 'c':
+ // troff adds an extra argument to C
+ if (np != 1 && !(code == 'C' && np == 2)) {
+ error("1 argument required for circle");
+ break;
+ }
+ out.put_fix_number(env->hpos + p[0]/2)
+ .put_fix_number(env->vpos)
+ .put_fix_number(p[0]/2)
+ .put_symbol("DC");
+ if (fill_flag)
+ fill_path(env);
+ else {
+ set_line_thickness_and_color(env);
+ out.put_symbol("ST");
+ }
+ break;
+ case 'l':
+ if (np != 2) {
+ error("2 arguments required for line");
+ break;
+ }
+ set_line_thickness_and_color(env);
+ out.put_fix_number(p[0] + env->hpos)
+ .put_fix_number(p[1] + env->vpos)
+ .put_fix_number(env->hpos)
+ .put_fix_number(env->vpos)
+ .put_symbol("DL");
+ break;
+ case 'E':
+ fill_flag = 1;
+ // fall through
+ case 'e':
+ if (np != 2) {
+ error("2 arguments required for ellipse");
+ break;
+ }
+ out.put_fix_number(p[0])
+ .put_fix_number(p[1])
+ .put_fix_number(env->hpos + p[0]/2)
+ .put_fix_number(env->vpos)
+ .put_symbol("DE");
+ if (fill_flag)
+ fill_path(env);
+ else {
+ set_line_thickness_and_color(env);
+ out.put_symbol("ST");
+ }
+ break;
+ case 'P':
+ fill_flag = 1;
+ // fall through
+ case 'p':
+ {
+ if (np & 1) {
+ error("even number of arguments required for polygon");
+ break;
+ }
+ if (np == 0) {
+ error("no arguments for polygon");
+ break;
+ }
+ out.put_fix_number(env->hpos)
+ .put_fix_number(env->vpos)
+ .put_symbol("MT");
+ for (int i = 0; i < np; i += 2)
+ out.put_fix_number(p[i])
+ .put_fix_number(p[i+1])
+ .put_symbol("RL");
+ out.put_symbol("CL");
+ if (fill_flag)
+ fill_path(env);
+ else {
+ set_line_thickness_and_color(env);
+ out.put_symbol("ST");
+ }
+ break;
+ }
+ case '~':
+ {
+ if (np & 1) {
+ error("even number of arguments required for spline");
+ break;
+ }
+ if (np == 0) {
+ error("no arguments for spline");
+ break;
+ }
+ out.put_fix_number(env->hpos)
+ .put_fix_number(env->vpos)
+ .put_symbol("MT");
+ out.put_fix_number(p[0]/2)
+ .put_fix_number(p[1]/2)
+ .put_symbol("RL");
+ /* tnum/tden should be between 0 and 1; the closer it is to 1
+ the tighter the curve will be to the guiding lines; 2/3
+ is the standard value */
+ const int tnum = 2;
+ const int tden = 3;
+ for (int i = 0; i < np - 2; i += 2) {
+ out.put_fix_number((p[i]*tnum)/(2*tden))
+ .put_fix_number((p[i + 1]*tnum)/(2*tden))
+ .put_fix_number(p[i]/2 + (p[i + 2]*(tden - tnum))/(2*tden))
+ .put_fix_number(p[i + 1]/2 + (p[i + 3]*(tden - tnum))/(2*tden))
+ .put_fix_number((p[i] - p[i]/2) + p[i + 2]/2)
+ .put_fix_number((p[i + 1] - p[i + 1]/2) + p[i + 3]/2)
+ .put_symbol("RC");
+ }
+ out.put_fix_number(p[np - 2] - p[np - 2]/2)
+ .put_fix_number(p[np - 1] - p[np - 1]/2)
+ .put_symbol("RL");
+ set_line_thickness_and_color(env);
+ out.put_symbol("ST");
+ }
+ break;
+ case 'a':
+ {
+ if (np != 4) {
+ error("4 arguments required for arc");
+ break;
+ }
+ set_line_thickness_and_color(env);
+ double c[2];
+ if (adjust_arc_center(p, c))
+ out.put_fix_number(env->hpos + int(c[0]))
+ .put_fix_number(env->vpos + int(c[1]))
+ .put_fix_number(int(sqrt(c[0]*c[0] + c[1]*c[1])))
+ .put_float(degrees(atan2(-c[1], -c[0])))
+ .put_float(degrees(atan2(p[1] + p[3] - c[1], p[0] + p[2] - c[0])))
+ .put_symbol("DA");
+ else
+ out.put_fix_number(p[0] + p[2] + env->hpos)
+ .put_fix_number(p[1] + p[3] + env->vpos)
+ .put_fix_number(env->hpos)
+ .put_fix_number(env->vpos)
+ .put_symbol("DL");
+ }
+ break;
+ case 't':
+ if (np == 0)
+ line_thickness = -1;
+ else {
+ // troff gratuitously adds an extra 0
+ if (np != 1 && np != 2) {
+ error("0 or 1 argument required for thickness");
+ break;
+ }
+ line_thickness = p[0];
+ }
+ break;
+ default:
+ error("unrecognised drawing command '%1'", char(code));
+ break;
+ }
+ output_hpos = output_vpos = -1;
+}
+
+const char *ps_printer::media_name()
+{
+ return "Default";
+}
+
+int ps_printer::media_width()
+{
+ /*
+ * NOTE:
+ * Although paper dimensions are defined as a pair of real numbers,
+ * it seems to be a common convention to round to the nearest
+ * PostScript unit. For example, A4 is really 595.276 by 841.89 but
+ * we use 595 by 842.
+ *
+ * This is probably a good compromise, especially since the
+ * PostScript definition specifies that media matching should be done
+ * within a tolerance of 5 units.
+ */
+ return int(user_paper_width ? user_paper_width*72.0 + 0.5
+ : font::paperwidth*72.0/font::res + 0.5);
+}
+
+int ps_printer::media_height()
+{
+ return int(user_paper_length ? user_paper_length*72.0 + 0.5
+ : paper_length*72.0/font::res + 0.5);
+}
+
+void ps_printer::media_set()
+{
+ /*
+ * The setpagedevice implies an erasepage and initgraphics, and
+ * must thus precede any descriptions for a particular page.
+ *
+ * NOTE:
+ * This does not work with ps2pdf when there are included eps
+ * segments that contain PageSize/setpagedevice.
+ * This might be a bug in ghostscript -- must be investigated.
+ * Using setpagedevice in an .eps is really the wrong concept, anyway.
+ *
+ * NOTE:
+ * For the future, this is really the place to insert other
+ * media selection features, like:
+ * MediaColor
+ * MediaPosition
+ * MediaType
+ * MediaWeight
+ * MediaClass
+ * TraySwitch
+ * ManualFeed
+ * InsertSheet
+ * Duplex
+ * Collate
+ * ProcessColorModel
+ * etc.
+ */
+ if (!(broken_flags & (USE_PS_ADOBE_2_0|NO_PAPERSIZE))) {
+ out.begin_comment("BeginFeature:")
+ .comment_arg("*PageSize")
+ .comment_arg(media_name())
+ .end_comment();
+ int w = media_width();
+ int h = media_height();
+ if (w > 0 && h > 0)
+ // warning to user is done elsewhere
+ fprintf(out.get_file(),
+ "<< /PageSize [ %d %d ] /ImagingBBox null >> setpagedevice\n",
+ w, h);
+ out.simple_comment("EndFeature");
+ }
+}
+
+void ps_printer::begin_page(int n)
+{
+ out.begin_comment("Page:")
+ .comment_arg(i_to_a(n));
+ out.comment_arg(i_to_a(++pages_output))
+ .end_comment();
+ output_style.f = 0;
+ output_space_code = 32;
+ output_draw_point_size = -1;
+ output_line_thickness = -1;
+ output_hpos = output_vpos = -1;
+ ndefined_styles = 0;
+ out.simple_comment("BeginPageSetup");
+
+#if 0
+ /*
+ * NOTE:
+ * may decide to do this once per page
+ */
+ media_set();
+#endif
+
+ out.put_symbol("BP")
+ .simple_comment("EndPageSetup");
+ if (sbuf_color != default_color)
+ set_color(&sbuf_color);
+}
+
+void ps_printer::end_page(int)
+{
+ flush_sbuf();
+ set_color(&default_color);
+ out.put_symbol("EP");
+ if (invis_count != 0) {
+ error("missing 'endinvis' command");
+ invis_count = 0;
+ }
+}
+
+font *ps_printer::make_font(const char *nm)
+{
+ return ps_font::load_ps_font(nm);
+}
+
+ps_printer::~ps_printer()
+{
+ out.simple_comment("Trailer")
+ .put_symbol("end")
+ .simple_comment("EOF");
+ if (fseek(tempfp, 0L, 0) < 0)
+ fatal("fseek on temporary file failed");
+ fputs("%!PS-Adobe-", stdout);
+ fputs((broken_flags & USE_PS_ADOBE_2_0) ? "2.0" : "3.0", stdout);
+ putchar('\n');
+ out.set_file(stdout);
+ if (cmyk_flag)
+ out.begin_comment("Extensions:")
+ .comment_arg("CMYK")
+ .end_comment();
+ out.begin_comment("Creator:")
+ .comment_arg("groff")
+ .comment_arg("version")
+ .comment_arg(Version_string)
+ .end_comment();
+ {
+ fputs("%%CreationDate: ", out.get_file());
+#ifdef LONG_FOR_TIME_T
+ long
+#else
+ time_t
+#endif
+ t = current_time();
+ fputs(ctime(&t), out.get_file());
+ }
+ for (font_pointer_list *f = font_list; f; f = f->next) {
+ ps_font *psf = (ps_font *)(f->p);
+ rm.need_font(psf->get_internal_name());
+ }
+ rm.print_header_comments(out);
+ out.begin_comment("Pages:")
+ .comment_arg(i_to_a(pages_output))
+ .end_comment();
+ out.begin_comment("PageOrder:")
+ .comment_arg("Ascend")
+ .end_comment();
+ if (!(broken_flags & NO_PAPERSIZE)) {
+ int w = media_width();
+ int h = media_height();
+ if (w > 0 && h > 0)
+ fprintf(out.get_file(),
+ "%%%%DocumentMedia: %s %d %d %d %s %s\n",
+ media_name(), // tag name of media
+ w, // media width
+ h, // media height
+ 0, // weight in g/m2
+ "()", // paper color, e.g. white
+ "()" // preprinted form type
+ );
+ else {
+ if (h <= 0)
+ // see ps_printer::ps_printer
+ warning("bad paper height, defaulting to 11i");
+ if (w <= 0)
+ warning("bad paper width");
+ }
+ }
+ out.begin_comment("Orientation:")
+ .comment_arg(landscape_flag ? "Landscape" : "Portrait")
+ .end_comment();
+ if (ncopies != 1) {
+ out.end_line();
+ fprintf(out.get_file(), "%%%%Requirements: numcopies(%d)\n", ncopies);
+ }
+ out.simple_comment("EndComments");
+ if (!(broken_flags & NO_PAPERSIZE)) {
+ /* gv works fine without this one, but it really should be there. */
+ out.simple_comment("BeginDefaults");
+ fprintf(out.get_file(), "%%%%PageMedia: %s\n", media_name());
+ out.simple_comment("EndDefaults");
+ }
+ out.simple_comment("BeginProlog");
+ rm.output_prolog(out);
+ if (!(broken_flags & NO_SETUP_SECTION)) {
+ out.simple_comment("EndProlog");
+ out.simple_comment("BeginSetup");
+ }
+#if 1
+ /*
+ * Define paper (i.e., media) size for entire document here.
+ * This allows ps2pdf to correctly determine page size, for instance.
+ */
+ media_set();
+#endif
+ rm.document_setup(out);
+ out.put_symbol(dict_name)
+ .put_symbol("begin");
+ if (ndefs > 0)
+ ndefs += DEFS_DICT_SPARE;
+ out.put_literal_symbol(defs_dict_name)
+ .put_number(ndefs + 1)
+ .put_symbol("dict")
+ .put_symbol("def");
+ out.put_symbol(defs_dict_name)
+ .put_symbol("begin");
+ out.put_literal_symbol("u")
+ .put_delimiter('{')
+ .put_fix_number(1)
+ .put_symbol("mul")
+ .put_delimiter('}')
+ .put_symbol("bind")
+ .put_symbol("def");
+ defs += '\0';
+ out.special(defs.contents());
+ out.put_symbol("end");
+ if (ncopies != 1)
+ out.put_literal_symbol("#copies")
+ .put_number(ncopies)
+ .put_symbol("def");
+ out.put_literal_symbol("RES")
+ .put_number(res)
+ .put_symbol("def");
+ out.put_literal_symbol("PL");
+ if (guess_flag)
+ out.put_symbol("PLG");
+ else
+ out.put_fix_number(paper_length);
+ out.put_symbol("def");
+ out.put_literal_symbol("LS")
+ .put_symbol(landscape_flag ? "true" : "false")
+ .put_symbol("def");
+ if (manual_feed_flag) {
+ out.begin_comment("BeginFeature:")
+ .comment_arg("*ManualFeed")
+ .comment_arg("True")
+ .end_comment()
+ .put_symbol("MANUAL")
+ .simple_comment("EndFeature");
+ }
+ encode_fonts();
+ while (subencodings) {
+ subencoding *tem = subencodings;
+ subencodings = subencodings->next;
+ encode_subfont(tem);
+ out.put_literal_symbol(tem->subfont)
+ .put_symbol(make_subencoding_name(tem->idx))
+ .put_literal_symbol(tem->p->get_internal_name())
+ .put_symbol("RE");
+ delete tem;
+ }
+ out.simple_comment((broken_flags & NO_SETUP_SECTION)
+ ? "EndProlog"
+ : "EndSetup");
+ out.end_line();
+ out.copy_file(tempfp);
+ fclose(tempfp);
+}
+
+void ps_printer::special(char *arg, const environment *env, char type)
+{
+ if (type != 'p')
+ return;
+ typedef void (ps_printer::*SPECIAL_PROCP)(char *, const environment *);
+ static const struct {
+ const char *name;
+ SPECIAL_PROCP proc;
+ } proc_table[] = {
+ { "exec", &ps_printer::do_exec },
+ { "def", &ps_printer::do_def },
+ { "mdef", &ps_printer::do_mdef },
+ { "import", &ps_printer::do_import },
+ { "file", &ps_printer::do_file },
+ { "invis", &ps_printer::do_invis },
+ { "endinvis", &ps_printer::do_endinvis },
+ };
+ char *p;
+ for (p = arg; *p == ' ' || *p == '\n'; p++)
+ ;
+ char *tag = p;
+ for (; *p != '\0' && *p != ':' && *p != ' ' && *p != '\n'; p++)
+ ;
+ if (*p == '\0' || strncmp(tag, "ps", p - tag) != 0) {
+ error("X command without 'ps:' tag ignored");
+ return;
+ }
+ p++;
+ for (; *p == ' ' || *p == '\n'; p++)
+ ;
+ char *command = p;
+ for (; *p != '\0' && *p != ' ' && *p != '\n'; p++)
+ ;
+ if (*command == '\0') {
+ error("empty X command ignored");
+ return;
+ }
+ for (unsigned int i = 0; i < sizeof(proc_table)/sizeof(proc_table[0]); i++)
+ if (strncmp(command, proc_table[i].name, p - command) == 0) {
+ flush_sbuf();
+ if (sbuf_color != *env->col)
+ set_color(env->col);
+ (this->*(proc_table[i].proc))(p, env);
+ return;
+ }
+ error("X command '%1' not recognised", command);
+}
+
+// A conforming PostScript document must not have lines longer
+// than 255 characters (excluding line termination characters).
+
+static int check_line_lengths(const char *p)
+{
+ for (;;) {
+ const char *end = strchr(p, '\n');
+ if (end == 0)
+ end = strchr(p, '\0');
+ if (end - p > 255)
+ return 0;
+ if (*end == '\0')
+ break;
+ p = end + 1;
+ }
+ return 1;
+}
+
+void ps_printer::do_exec(char *arg, const environment *env)
+{
+ while (csspace(*arg))
+ arg++;
+ if (*arg == '\0') {
+ error("missing argument to X exec command");
+ return;
+ }
+ if (!check_line_lengths(arg))
+ warning("lines in X exec command should"
+ " not be more than 255 characters long");
+ out.put_fix_number(env->hpos)
+ .put_fix_number(env->vpos)
+ .put_symbol("EBEGIN")
+ .special(arg)
+ .put_symbol("EEND");
+ output_hpos = output_vpos = -1;
+ output_style.f = 0;
+ output_draw_point_size = -1;
+ output_line_thickness = -1;
+ ndefined_styles = 0;
+ if (!ndefs)
+ ndefs = 1;
+}
+
+void ps_printer::do_file(char *arg, const environment *env)
+{
+ while (csspace(*arg))
+ arg++;
+ if (*arg == '\0') {
+ error("missing argument to X file command");
+ return;
+ }
+ const char *filename = arg;
+ do {
+ ++arg;
+ } while (*arg != '\0' && *arg != ' ' && *arg != '\n');
+ out.put_fix_number(env->hpos)
+ .put_fix_number(env->vpos)
+ .put_symbol("EBEGIN");
+ rm.import_file(filename, out);
+ out.put_symbol("EEND");
+ output_hpos = output_vpos = -1;
+ output_style.f = 0;
+ output_draw_point_size = -1;
+ output_line_thickness = -1;
+ ndefined_styles = 0;
+ if (!ndefs)
+ ndefs = 1;
+}
+
+void ps_printer::do_def(char *arg, const environment *)
+{
+ while (csspace(*arg))
+ arg++;
+ if (!check_line_lengths(arg))
+ warning("lines in X def command should"
+ " not be more than 255 characters long");
+ defs += arg;
+ if (*arg != '\0' && strchr(arg, '\0')[-1] != '\n')
+ defs += '\n';
+ ndefs++;
+}
+
+// Like def, but the first argument says how many definitions it contains.
+
+void ps_printer::do_mdef(char *arg, const environment *)
+{
+ char *p;
+ int n = (int)strtol(arg, &p, 10);
+ if (n == 0 && p == arg) {
+ error("first argument to X mdef must be an integer");
+ return;
+ }
+ if (n < 0) {
+ error("out of range argument '%1' to X mdef command", int(n));
+ return;
+ }
+ arg = p;
+ while (csspace(*arg))
+ arg++;
+ if (!check_line_lengths(arg))
+ warning("lines in X mdef command should"
+ " not be more than 255 characters long");
+ defs += arg;
+ if (*arg != '\0' && strchr(arg, '\0')[-1] != '\n')
+ defs += '\n';
+ ndefs += n;
+}
+
+void ps_printer::do_import(char *arg, const environment *env)
+{
+ while (*arg == ' ' || *arg == '\n')
+ arg++;
+ char *p;
+ for (p = arg; *p != '\0' && *p != ' ' && *p != '\n'; p++)
+ ;
+ if (*p != '\0')
+ *p++ = '\0';
+ int parms[6];
+ int nparms = 0;
+ while (nparms < 6) {
+ char *end;
+ long n = strtol(p, &end, 10);
+ if (n == 0 && end == p)
+ break;
+ parms[nparms++] = int(n);
+ p = end;
+ }
+ if (csalpha(*p) && (p[1] == '\0' || p[1] == ' ' || p[1] == '\n')) {
+ error("scaling units not allowed in arguments for X import command");
+ return;
+ }
+ while (*p == ' ' || *p == '\n')
+ p++;
+ if (nparms < 5) {
+ if (*p == '\0')
+ error("too few arguments for X import command");
+ else
+ error("invalid argument '%1' for X import command", p);
+ return;
+ }
+ if (*p != '\0') {
+ error("superfluous argument '%1' for X import command", p);
+ return;
+ }
+ int llx = parms[0];
+ int lly = parms[1];
+ int urx = parms[2];
+ int ury = parms[3];
+ int desired_width = parms[4];
+ int desired_height = parms[5];
+ if (desired_width <= 0) {
+ error("bad width argument '%1' for X import command: must be > 0",
+ desired_width);
+ return;
+ }
+ if (nparms == 6 && desired_height <= 0) {
+ error("bad height argument '%1' for X import command: must be > 0",
+ desired_height);
+ return;
+ }
+ if (llx == urx) {
+ error("llx and urx arguments for X import command must not be equal");
+ return;
+ }
+ if (lly == ury) {
+ error("lly and ury arguments for X import command must not be equal");
+ return;
+ }
+ if (nparms == 5) {
+ int old_wid = urx - llx;
+ int old_ht = ury - lly;
+ if (old_wid < 0)
+ old_wid = -old_wid;
+ if (old_ht < 0)
+ old_ht = -old_ht;
+ desired_height = int(desired_width*(double(old_ht)/double(old_wid)) + .5);
+ }
+ if (env->vpos - desired_height < 0)
+ warning("top of imported graphic is above the top of the page");
+ out.put_number(llx)
+ .put_number(lly)
+ .put_fix_number(desired_width)
+ .put_number(urx - llx)
+ .put_fix_number(-desired_height)
+ .put_number(ury - lly)
+ .put_fix_number(env->hpos)
+ .put_fix_number(env->vpos)
+ .put_symbol("PBEGIN");
+ rm.import_file(arg, out);
+ // do this here just in case application defines PEND
+ out.put_symbol("end")
+ .put_symbol("PEND");
+}
+
+void ps_printer::do_invis(char *, const environment *)
+{
+ invis_count++;
+}
+
+void ps_printer::do_endinvis(char *, const environment *)
+{
+ if (invis_count == 0)
+ error("unbalanced 'endinvis' command");
+ else
+ --invis_count;
+}
+
+printer *make_printer()
+{
+ return new ps_printer(user_paper_length);
+}
+
+static void usage(FILE *stream);
+
+int main(int argc, char **argv)
+{
+ setlocale(LC_NUMERIC, "C");
+ program_name = argv[0];
+ string env;
+ static char stderr_buf[BUFSIZ];
+ setbuf(stderr, stderr_buf);
+ int c;
+ static const struct option long_options[] = {
+ { "help", no_argument, 0, CHAR_MAX + 1 },
+ { "version", no_argument, 0, 'v' },
+ { NULL, 0, 0, 0 }
+ };
+ while ((c = getopt_long(argc, argv, "b:c:F:gI:lmp:P:vw:", long_options, NULL))
+ != EOF)
+ switch(c) {
+ case 'b':
+ // XXX check this
+ broken_flags = atoi(optarg);
+ bflag = 1;
+ break;
+ case 'c':
+ if (sscanf(optarg, "%d", &ncopies) != 1 || ncopies <= 0) {
+ error("bad number of copies '%1'", optarg);
+ ncopies = 1;
+ }
+ break;
+ case 'F':
+ font::command_line_font_dir(optarg);
+ break;
+ case 'g':
+ guess_flag = 1;
+ break;
+ case 'I':
+ include_search_path.command_line_dir(optarg);
+ break;
+ case 'l':
+ landscape_flag = 1;
+ break;
+ case 'm':
+ manual_feed_flag = 1;
+ break;
+ case 'p':
+ if (!font::scan_papersize(optarg, 0,
+ &user_paper_length, &user_paper_width))
+ error("ignoring invalid custom paper format '%1'", optarg);
+ break;
+ case 'P':
+ env = "GROPS_PROLOGUE";
+ env += '=';
+ env += optarg;
+ env += '\0';
+ if (putenv(strsave(env.contents())))
+ fatal("putenv failed");
+ break;
+ case 'v':
+ printf("GNU grops (groff) version %s\n", Version_string);
+ exit(0);
+ break;
+ case 'w':
+ if (sscanf(optarg, "%d", &linewidth) != 1 || linewidth < 0) {
+ error("invalid line width '%1' ignored", optarg);
+ linewidth = -1;
+ }
+ break;
+ case CHAR_MAX + 1: // --help
+ usage(stdout);
+ exit(0);
+ break;
+ case '?':
+ usage(stderr);
+ exit(1);
+ break;
+ default:
+ assert(0);
+ }
+ font::set_unknown_desc_command_handler(handle_unknown_desc_command);
+ SET_BINARY(fileno(stdout));
+ if (optind >= argc)
+ do_file("-");
+ else {
+ for (int i = optind; i < argc; i++)
+ do_file(argv[i]);
+ }
+ return 0;
+}
+
+static void usage(FILE *stream)
+{
+ fprintf(stream,
+"usage: %s [-glm] [-b brokenness-flags] [-c num-copies]"
+" [-F font-directory] [-I inclusion-directory] [-p paper-format]"
+" [-P prologue-file] [-w rule-thickness] [file ...]\n"
+"usage: %s {-v | --version}\n"
+"usage: %s --help\n",
+ program_name, program_name, program_name);
+ if (stdout == stream)
+ fputs(
+"\n"
+"Translate the output of troff(1) into PostScript. See the grops(1)\n"
+"manual page.\n",
+ stream);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/devices/grops/ps.h b/src/devices/grops/ps.h
new file mode 100644
index 0000000..5cef694
--- /dev/null
+++ b/src/devices/grops/ps.h
@@ -0,0 +1,129 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+class ps_output {
+public:
+ ps_output(FILE *, int max_line_length);
+ ps_output &put_string(const char *, int);
+ ps_output &put_number(int);
+ ps_output &put_fix_number(int);
+ ps_output &put_float(double);
+ ps_output &put_symbol(const char *);
+ ps_output &put_color(unsigned int);
+ ps_output &put_literal_symbol(const char *);
+ ps_output &set_fixed_point(int);
+ ps_output &simple_comment(const char *);
+ ps_output &begin_comment(const char *);
+ ps_output &comment_arg(const char *);
+ ps_output &end_comment();
+ ps_output &set_file(FILE *);
+ ps_output &include_file(FILE *);
+ ps_output &copy_file(FILE *);
+ ps_output &end_line();
+ ps_output &put_delimiter(char);
+ ps_output &special(const char *);
+ FILE *get_file();
+private:
+ FILE *fp;
+ int col;
+ int max_line_length; // not including newline
+ int need_space;
+ int fixed_point;
+};
+
+inline FILE *ps_output::get_file()
+{
+ return fp;
+}
+
+// this must stay in sync with 'resource_table' in 'psrm.cpp'
+enum resource_type {
+ RESOURCE_FONT,
+ RESOURCE_FONTSET,
+ RESOURCE_PROCSET,
+ RESOURCE_FILE,
+ RESOURCE_ENCODING,
+ RESOURCE_FORM,
+ RESOURCE_PATTERN
+};
+
+struct resource;
+
+extern string an_empty_string;
+
+class resource_manager {
+public:
+ resource_manager();
+ ~resource_manager();
+ void import_file(const char *filename, ps_output &);
+ void need_font(const char *name);
+ void print_header_comments(ps_output &);
+ void document_setup(ps_output &);
+ void output_prolog(ps_output &);
+private:
+ unsigned extensions;
+ unsigned language_level;
+ resource *procset_resource;
+ resource *resource_list;
+ resource *lookup_resource(resource_type type, string &name,
+ string &version = an_empty_string,
+ unsigned revision = 0);
+ resource *lookup_font(const char *name);
+ void read_download_file();
+ void supply_resource(resource *r, int rank, FILE *outfp,
+ int is_document = 0);
+ void process_file(int rank, FILE *fp, const char *filename, FILE *outfp);
+ resource *read_file_arg(const char **);
+ resource *read_procset_arg(const char **);
+ resource *read_font_arg(const char **);
+ resource *read_resource_arg(const char **);
+ void print_resources_comment(unsigned flag, FILE *outfp);
+ void print_extensions_comment(FILE *outfp);
+ void print_language_level_comment(FILE *outfp);
+ int do_begin_resource(const char *ptr, int rank, FILE *fp, FILE *outfp);
+ int do_include_resource(const char *ptr, int rank, FILE *fp, FILE *outfp);
+ int do_begin_document(const char *ptr, int rank, FILE *fp, FILE *outfp);
+ int do_include_document(const char *ptr, int rank, FILE *fp, FILE *outfp);
+ int do_begin_procset(const char *ptr, int rank, FILE *fp, FILE *outfp);
+ int do_include_procset(const char *ptr, int rank, FILE *fp, FILE *outfp);
+ int do_begin_font(const char *ptr, int rank, FILE *fp, FILE *outfp);
+ int do_include_font(const char *ptr, int rank, FILE *fp, FILE *outfp);
+ int do_begin_file(const char *ptr, int rank, FILE *fp, FILE *outfp);
+ int do_include_file(const char *ptr, int rank, FILE *fp, FILE *outfp);
+ int change_to_end_resource(const char *ptr, int rank, FILE *fp, FILE *outfp);
+ int do_begin_preview(const char *ptr, int rank, FILE *fp, FILE *outfp);
+ int do_begin_data(const char *ptr, int rank, FILE *fp, FILE *outfp);
+ int do_begin_binary(const char *ptr, int rank, FILE *fp, FILE *outfp);
+};
+
+extern unsigned broken_flags;
+
+// broken_flags is ored from these
+
+enum {
+ NO_SETUP_SECTION = 01,
+ STRIP_PERCENT_BANG = 02,
+ STRIP_STRUCTURE_COMMENTS = 04,
+ USE_PS_ADOBE_2_0 = 010,
+ NO_PAPERSIZE = 020
+};
+
+#include "searchpath.h"
+
+extern search_path include_search_path;
diff --git a/src/devices/grops/psfig.diff b/src/devices/grops/psfig.diff
new file mode 100644
index 0000000..4e0d1f9
--- /dev/null
+++ b/src/devices/grops/psfig.diff
@@ -0,0 +1,106 @@
+These are patches to makes psfig work with groff. They apply to the
+version of psfig in comp.sources.unix/Volume11. After applying them,
+psfig should be recompiled with -DGROFF. The resulting psfig will
+work only with groff, so you might want to install it under a
+different name. The output of this psfig must be processed using the
+macros in the file ../tmac/tmac.psfig. These will automatically add
+the necessary PostScript code to the prologue output by grops. Use of
+the 'global' feature in psfig will result in non-conformant PostScript
+which will fail if processed by a page reversal program. Note that
+psfig is unsupported by me (I'm not interested in hearing about psfig
+problems.) For new documents, I recommend using the PostScript
+inclusion features provided by grops.
+
+James Clark
+jjc@jclark.com
+
+*** cmds.c.~1~ Thu Feb 14 16:09:45 1991
+--- cmds.c Mon Mar 4 12:49:26 1991
+***************
+*** 245,253 ****
+--- 245,261 ----
+ (void) sprintf(x, "%.2fp", fx);
+ (void) sprintf(y, "%.2fp", fy);
+ } else if (!*x) {
++ #ifndef GROFF
+ (void) sprintf(x,"(%.2fp*%s/%.2fp)", fx, y, fy);
++ #else /* GROFF */
++ (void) sprintf(x,"(%.0fu*%s/%.0fu)", fx, y, fy);
++ #endif /* GROFF */
+ } else if (!*y) {
++ #ifndef GROFF
+ (void) sprintf(y,"(%.2fp*%s/%.2fp)", fy, x, fx);
++ #else /* GROFF */
++ (void) sprintf(y,"(%.0fu*%s/%.0fu)", fy, x, fx);
++ #endif /* GROFF */
+ }
+
+ /*
+*** troff.c.~1~ Thu Feb 14 16:09:48 1991
+--- troff.c Mon Mar 4 12:48:46 1991
+***************
+*** 26,32 ****
+--- 26,36 ----
+ }
+
+
++ #ifndef GROFF
+ char incl_file_s[] = "\\X'f%s'";
++ #else /* GROFF */
++ char incl_file_s[] = "\\X'ps: file %s'";
++ #endif /* GROFF */
+ includeFile(filenm)
+ char *filenm; {
+ printf(incl_file_s, filenm);
+***************
+*** 40,52 ****
+--- 44,64 ----
+ error("buffer overflow");
+ }
+
++ #ifndef GROFF
+ char endfig_s[] = "\\X'pendFig'";
++ #else /* GROFF */
++ char endfig_s[] = "\\X'ps: exec psfigend'";
++ #endif /* GROFF */
+ endfig() {
+ printf(endfig_s);
+ }
+
+ char startfig_s[] =
++ #ifndef GROFF
+ "\\X'p\\w@\\h@%s@@'\\X'p\\w@\\h@%s@@'\\X'p%.2f'\\X'p%.2f'\\X'p%.2f'\\X'p%.2f'\\X'pstartFig'";
++ #else /* GROFF */
++ "\\X'ps: exec \\w@\\h@%s@@ \\w@\\h@%s@@ %.2f %.2f %.2f %.2f psfigstart'";
++ #endif /* GROFF */
+
+ startfig(x, y, llx, lly, urx, ury)
+ char *x, *y;
+***************
+*** 57,63 ****
+--- 69,79 ----
+ }
+
+ emitDoClip() {
++ #ifndef GROFF
+ printf("\\X'pdoclip'");
++ #else /* GROFF */
++ printf("\\X'ps: exec psfigclip'");
++ #endif /* GROFF */
+ }
+
+ flushX()
+***************
+*** 116,122 ****
+--- 132,142 ----
+
+ #define isWhite(ch) ((ch) == ' ' || (ch) == '\t' || (ch) == '\n')
+
++ #ifndef GROFF
+ char literal_s[] = "\\X'p%s'";
++ #else /* GROFF */
++ char literal_s[] = "\\X'ps: exec %s'";
++ #endif /* GROFF */
+ emitLiteral(text)
+ char *text; {
+ static char litbuf[BUFSZ];
diff --git a/src/devices/grops/psrm.cpp b/src/devices/grops/psrm.cpp
new file mode 100644
index 0000000..3c9a8b7
--- /dev/null
+++ b/src/devices/grops/psrm.cpp
@@ -0,0 +1,1189 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "driver.h"
+#include "stringclass.h"
+#include "cset.h"
+
+#include "ps.h"
+
+#ifdef NEED_DECLARATION_PUTENV
+extern "C" {
+ int putenv(const char *);
+}
+#endif /* NEED_DECLARATION_PUTENV */
+
+#define GROPS_PROLOGUE "prologue"
+
+static void print_ps_string(const string &s, FILE *outfp);
+
+cset white_space("\n\r \t\f");
+string an_empty_string;
+
+char valid_input_table[256]= {
+#ifndef IS_EBCDIC_HOST
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+#else
+ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
+ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+#endif
+};
+
+const char *extension_table[] = {
+ "DPS",
+ "CMYK",
+ "Composite",
+ "FileSystem",
+};
+
+const int NEXTENSIONS = sizeof(extension_table)/sizeof(extension_table[0]);
+
+// this must stay in sync with 'resource_type' in 'ps.h'
+const char *resource_table[] = {
+ "font",
+ "fontset",
+ "procset",
+ "file",
+ "encoding",
+ "form",
+ "pattern",
+};
+
+const int NRESOURCES = sizeof(resource_table)/sizeof(resource_table[0]);
+
+static int read_uint_arg(const char **pp, unsigned *res)
+{
+ while (white_space(**pp))
+ *pp += 1;
+ if (**pp == '\0') {
+ error("missing argument");
+ return 0;
+ }
+ const char *start = *pp;
+ // XXX use strtoul
+ long n = strtol(start, (char **)pp, 10);
+ if (n == 0 && *pp == start) {
+ error("not an integer");
+ return 0;
+ }
+ if (n < 0) {
+ error("argument must not be negative");
+ return 0;
+ }
+ *res = unsigned(n);
+ return 1;
+}
+
+struct resource {
+ resource *next;
+ resource_type type;
+ string name;
+ enum { NEEDED = 01, SUPPLIED = 02, FONT_NEEDED = 04, BUSY = 010 };
+ unsigned flags;
+ string version;
+ unsigned revision;
+ char *filename;
+ int rank;
+ resource(resource_type, string &, string & = an_empty_string, unsigned = 0);
+ ~resource();
+ void print_type_and_name(FILE *outfp);
+};
+
+resource::resource(resource_type t, string &n, string &v, unsigned r)
+: next(0), type(t), flags(0), revision(r), filename(0), rank(-1)
+{
+ name.move(n);
+ version.move(v);
+ if (type == RESOURCE_FILE) {
+ if (name.search('\0') >= 0)
+ error("filename contains a character with code 0");
+ filename = name.extract();
+ }
+}
+
+resource::~resource()
+{
+ free(filename);
+}
+
+void resource::print_type_and_name(FILE *outfp)
+{
+ fputs(resource_table[type], outfp);
+ putc(' ', outfp);
+ print_ps_string(name, outfp);
+ if (type == RESOURCE_PROCSET) {
+ putc(' ', outfp);
+ print_ps_string(version, outfp);
+ fprintf(outfp, " %u", revision);
+ }
+}
+
+resource_manager::resource_manager()
+: extensions(0), language_level(0), resource_list(0)
+{
+ read_download_file();
+ string procset_name("grops");
+ extern const char *version_string;
+ extern const char *revision_string;
+ unsigned revision_uint;
+ if (!read_uint_arg(&revision_string, &revision_uint))
+ revision_uint = 0;
+ string procset_version(version_string);
+ procset_resource = lookup_resource(RESOURCE_PROCSET, procset_name,
+ procset_version, revision_uint);
+ procset_resource->flags |= resource::SUPPLIED;
+}
+
+resource_manager::~resource_manager()
+{
+ while (resource_list) {
+ resource *tem = resource_list;
+ resource_list = resource_list->next;
+ delete tem;
+ }
+}
+
+resource *resource_manager::lookup_resource(resource_type type,
+ string &name,
+ string &version,
+ unsigned revision)
+{
+ resource *r;
+ for (r = resource_list; r; r = r->next)
+ if (r->type == type
+ && r->name == name
+ && r->version == version
+ && r->revision == revision)
+ return r;
+ r = new resource(type, name, version, revision);
+ r->next = resource_list;
+ resource_list = r;
+ return r;
+}
+
+// Just a specialized version of lookup_resource().
+
+resource *resource_manager::lookup_font(const char *name)
+{
+ resource *r;
+ for (r = resource_list; r; r = r->next)
+ if (r->type == RESOURCE_FONT
+ && strlen(name) == (size_t)r->name.length()
+ && memcmp(name, r->name.contents(), r->name.length()) == 0)
+ return r;
+ string s(name);
+ r = new resource(RESOURCE_FONT, s);
+ r->next = resource_list;
+ resource_list = r;
+ return r;
+}
+
+void resource_manager::need_font(const char *name)
+{
+ lookup_font(name)->flags |= resource::FONT_NEEDED;
+}
+
+typedef resource *Presource; // Work around g++ bug.
+
+void resource_manager::document_setup(ps_output &out)
+{
+ int nranks = 0;
+ resource *r;
+ for (r = resource_list; r; r = r->next)
+ if (r->rank >= nranks)
+ nranks = r->rank + 1;
+ if (nranks > 0) {
+ // Sort resource_list in reverse order of rank.
+ Presource *head = new Presource[nranks + 1];
+ Presource **tail = new Presource *[nranks + 1];
+ int i;
+ for (i = 0; i < nranks + 1; i++) {
+ head[i] = 0;
+ tail[i] = &head[i];
+ }
+ for (r = resource_list; r; r = r->next) {
+ i = r->rank < 0 ? 0 : r->rank + 1;
+ *tail[i] = r;
+ tail[i] = &(*tail[i])->next;
+ }
+ resource_list = 0;
+ for (i = 0; i < nranks + 1; i++)
+ if (head[i]) {
+ *tail[i] = resource_list;
+ resource_list = head[i];
+ }
+ delete[] head;
+ delete[] tail;
+ // check it
+ for (r = resource_list; r; r = r->next)
+ if (r->next)
+ assert(r->rank >= r->next->rank);
+ for (r = resource_list; r; r = r->next)
+ if (r->type == RESOURCE_FONT && r->rank >= 0)
+ supply_resource(r, -1, out.get_file());
+ }
+}
+
+void resource_manager::print_resources_comment(unsigned flag,
+ FILE *outfp)
+{
+ int continued = 0;
+ for (resource *r = resource_list; r; r = r->next)
+ if (r->flags & flag) {
+ if (continued)
+ fputs("%%+ ", outfp);
+ else {
+ fputs(flag == resource::NEEDED
+ ? "%%DocumentNeededResources: "
+ : "%%DocumentSuppliedResources: ",
+ outfp);
+ continued = 1;
+ }
+ r->print_type_and_name(outfp);
+ putc('\n', outfp);
+ }
+}
+
+void resource_manager::print_header_comments(ps_output &out)
+{
+ for (resource *r = resource_list; r; r = r->next)
+ if (r->type == RESOURCE_FONT && (r->flags & resource::FONT_NEEDED))
+ supply_resource(r, 0, 0);
+ print_resources_comment(resource::NEEDED, out.get_file());
+ print_resources_comment(resource::SUPPLIED, out.get_file());
+ print_language_level_comment(out.get_file());
+ print_extensions_comment(out.get_file());
+}
+
+void resource_manager::output_prolog(ps_output &out)
+{
+ FILE *outfp = out.get_file();
+ out.end_line();
+ char *path;
+ if (!getenv("GROPS_PROLOGUE")) {
+ string e = "GROPS_PROLOGUE";
+ e += '=';
+ e += GROPS_PROLOGUE;
+ e += '\0';
+ if (putenv(strsave(e.contents())))
+ fatal("putenv failed");
+ }
+ char *prologue = getenv("GROPS_PROLOGUE");
+ FILE *fp = font::open_file(prologue, &path);
+ if (!fp)
+ fatal("failed to open PostScript prologue '%1': %2", prologue,
+ strerror(errno));
+ fputs("%%BeginResource: ", outfp);
+ procset_resource->print_type_and_name(outfp);
+ putc('\n', outfp);
+ process_file(-1, fp, path, outfp);
+ fclose(fp);
+ free(path);
+ fputs("%%EndResource\n", outfp);
+}
+
+void resource_manager::import_file(const char *filename, ps_output &out)
+{
+ out.end_line();
+ string name(filename);
+ resource *r = lookup_resource(RESOURCE_FILE, name);
+ supply_resource(r, -1, out.get_file(), 1);
+}
+
+void resource_manager::supply_resource(resource *r, int rank,
+ FILE *outfp, int is_document)
+{
+ if (r->flags & resource::BUSY) {
+ r->name += '\0';
+ fatal("loop detected in dependency graph for %1 '%2'",
+ resource_table[r->type],
+ r->name.contents());
+ }
+ r->flags |= resource::BUSY;
+ if (rank > r->rank)
+ r->rank = rank;
+ char *path = 0 /* nullptr */;
+ FILE *fp = 0 /* nullptr */;
+ if (r->filename != 0 /* nullptr */) {
+ if (r->type == RESOURCE_FONT) {
+ fp = font::open_file(r->filename, &path);
+ if (!fp) {
+ error("failed to open PostScript resource '%1': %2",
+ r->filename, strerror(errno));
+ delete[] r->filename;
+ r->filename = 0 /* nullptr */;
+ }
+ }
+ else {
+ errno = 0;
+ fp = include_search_path.open_file_cautious(r->filename);
+ if (!fp) {
+ error("can't open '%1': %2", r->filename, strerror(errno));
+ delete[] r->filename;
+ r->filename = 0 /* nullptr */;
+ }
+ else
+ path = r->filename;
+ }
+ }
+ if (fp) {
+ if (outfp) {
+ if (r->type == RESOURCE_FILE && is_document) {
+ fputs("%%BeginDocument: ", outfp);
+ print_ps_string(r->name, outfp);
+ putc('\n', outfp);
+ }
+ else {
+ fputs("%%BeginResource: ", outfp);
+ r->print_type_and_name(outfp);
+ putc('\n', outfp);
+ }
+ }
+ process_file(rank, fp, path, outfp);
+ fclose(fp);
+ if (r->type == RESOURCE_FONT)
+ free(path);
+ if (outfp) {
+ if (r->type == RESOURCE_FILE && is_document)
+ fputs("%%EndDocument\n", outfp);
+ else
+ fputs("%%EndResource\n", outfp);
+ }
+ r->flags |= resource::SUPPLIED;
+ }
+ else {
+ if (outfp) {
+ if (r->type == RESOURCE_FILE && is_document) {
+ fputs("%%IncludeDocument: ", outfp);
+ print_ps_string(r->name, outfp);
+ putc('\n', outfp);
+ }
+ else {
+ fputs("%%IncludeResource: ", outfp);
+ r->print_type_and_name(outfp);
+ putc('\n', outfp);
+ }
+ }
+ r->flags |= resource::NEEDED;
+ }
+ r->flags &= ~resource::BUSY;
+}
+
+#define PS_MAGIC "%!PS-Adobe-"
+
+static int ps_get_line(string &buf, FILE *fp)
+{
+ buf.clear();
+ int c = getc(fp);
+ if (c == EOF)
+ return 0;
+ current_lineno++;
+ while (c != '\r' && c != '\n' && c != EOF) {
+ if (!valid_input_table[c])
+ error("invalid input character code %1", int(c));
+ buf += c;
+ c = getc(fp);
+ }
+ buf += '\n';
+ buf += '\0';
+ if (c == '\r') {
+ c = getc(fp);
+ if (c != EOF && c != '\n')
+ ungetc(c, fp);
+ }
+ return 1;
+}
+
+static int read_text_arg(const char **pp, string &res)
+{
+ res.clear();
+ while (white_space(**pp))
+ *pp += 1;
+ if (**pp == '\0') {
+ error("missing argument");
+ return 0;
+ }
+ if (**pp != '(') {
+ for (; **pp != '\0' && !white_space(**pp); *pp += 1)
+ res += **pp;
+ return 1;
+ }
+ *pp += 1;
+ res.clear();
+ int level = 0;
+ for (;;) {
+ if (**pp == '\0' || **pp == '\r' || **pp == '\n') {
+ error("missing ')'");
+ return 0;
+ }
+ if (**pp == ')') {
+ if (level == 0) {
+ *pp += 1;
+ break;
+ }
+ res += **pp;
+ level--;
+ }
+ else if (**pp == '(') {
+ level++;
+ res += **pp;
+ }
+ else if (**pp == '\\') {
+ *pp += 1;
+ switch (**pp) {
+ case 'n':
+ res += '\n';
+ break;
+ case 'r':
+ res += '\n';
+ break;
+ case 't':
+ res += '\t';
+ break;
+ case 'b':
+ res += '\b';
+ break;
+ case 'f':
+ res += '\f';
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ {
+ int val = **pp - '0';
+ if ((*pp)[1] >= '0' && (*pp)[1] <= '7') {
+ *pp += 1;
+ val = val*8 + (**pp - '0');
+ if ((*pp)[1] >= '0' && (*pp)[1] <= '7') {
+ *pp += 1;
+ val = val*8 + (**pp - '0');
+ }
+ }
+ }
+ break;
+ default:
+ res += **pp;
+ break;
+ }
+ }
+ else
+ res += **pp;
+ *pp += 1;
+ }
+ return 1;
+}
+
+resource *resource_manager::read_file_arg(const char **ptr)
+{
+ string arg;
+ if (!read_text_arg(ptr, arg))
+ return 0;
+ return lookup_resource(RESOURCE_FILE, arg);
+}
+
+resource *resource_manager::read_font_arg(const char **ptr)
+{
+ string arg;
+ if (!read_text_arg(ptr, arg))
+ return 0;
+ return lookup_resource(RESOURCE_FONT, arg);
+}
+
+resource *resource_manager::read_procset_arg(const char **ptr)
+{
+ string arg;
+ if (!read_text_arg(ptr, arg))
+ return 0;
+ string version;
+ if (!read_text_arg(ptr, version))
+ return 0;
+ unsigned revision;
+ if (!read_uint_arg(ptr, &revision))
+ return 0;
+ return lookup_resource(RESOURCE_PROCSET, arg, version, revision);
+}
+
+resource *resource_manager::read_resource_arg(const char **ptr)
+{
+ while (white_space(**ptr))
+ *ptr += 1;
+ const char *name = *ptr;
+ while (**ptr != '\0' && !white_space(**ptr))
+ *ptr += 1;
+ if (name == *ptr) {
+ error("missing resource type");
+ return 0;
+ }
+ int ri;
+ for (ri = 0; ri < NRESOURCES; ri++)
+ if (strlen(resource_table[ri]) == size_t(*ptr - name)
+ && strncasecmp(resource_table[ri], name, *ptr - name) == 0)
+ break;
+ if (ri >= NRESOURCES) {
+ error("unknown resource type");
+ return 0;
+ }
+ if (ri == RESOURCE_PROCSET)
+ return read_procset_arg(ptr);
+ string arg;
+ if (!read_text_arg(ptr, arg))
+ return 0;
+ return lookup_resource(resource_type(ri), arg);
+}
+
+static const char *matches_comment(string &buf, const char *comment)
+{
+ if ((size_t)buf.length() < strlen(comment) + 3)
+ return 0;
+ if (buf[0] != '%' || buf[1] != '%')
+ return 0;
+ const char *bufp = buf.contents() + 2;
+ for (; *comment; comment++, bufp++)
+ if (*bufp != *comment)
+ return 0;
+ if (comment[-1] == ':')
+ return bufp;
+ if (*bufp == '\0' || white_space(*bufp))
+ return bufp;
+ return 0;
+}
+
+// Return 1 if the line should be copied out.
+
+int resource_manager::do_begin_resource(const char *ptr, int, FILE *,
+ FILE *)
+{
+ resource *r = read_resource_arg(&ptr);
+ if (r)
+ r->flags |= resource::SUPPLIED;
+ return 1;
+}
+
+int resource_manager::do_include_resource(const char *ptr, int rank,
+ FILE *, FILE *outfp)
+{
+ resource *r = read_resource_arg(&ptr);
+ if (r) {
+ if (r->type == RESOURCE_FONT) {
+ if (rank >= 0)
+ supply_resource(r, rank + 1, outfp);
+ else
+ r->flags |= resource::FONT_NEEDED;
+ }
+ else
+ supply_resource(r, rank, outfp);
+ }
+ return 0;
+}
+
+int resource_manager::do_begin_document(const char *ptr, int, FILE *,
+ FILE *)
+{
+ resource *r = read_file_arg(&ptr);
+ if (r)
+ r->flags |= resource::SUPPLIED;
+ return 1;
+}
+
+int resource_manager::do_include_document(const char *ptr, int rank,
+ FILE *, FILE *outfp)
+{
+ resource *r = read_file_arg(&ptr);
+ if (r)
+ supply_resource(r, rank, outfp, 1);
+ return 0;
+}
+
+int resource_manager::do_begin_procset(const char *ptr, int, FILE *,
+ FILE *outfp)
+{
+ resource *r = read_procset_arg(&ptr);
+ if (r) {
+ r->flags |= resource::SUPPLIED;
+ if (outfp) {
+ fputs("%%BeginResource: ", outfp);
+ r->print_type_and_name(outfp);
+ putc('\n', outfp);
+ }
+ }
+ return 0;
+}
+
+int resource_manager::do_include_procset(const char *ptr, int rank,
+ FILE *, FILE *outfp)
+{
+ resource *r = read_procset_arg(&ptr);
+ if (r)
+ supply_resource(r, rank, outfp);
+ return 0;
+}
+
+int resource_manager::do_begin_file(const char *ptr, int, FILE *,
+ FILE *outfp)
+{
+ resource *r = read_file_arg(&ptr);
+ if (r) {
+ r->flags |= resource::SUPPLIED;
+ if (outfp) {
+ fputs("%%BeginResource: ", outfp);
+ r->print_type_and_name(outfp);
+ putc('\n', outfp);
+ }
+ }
+ return 0;
+}
+
+int resource_manager::do_include_file(const char *ptr, int rank,
+ FILE *, FILE *outfp)
+{
+ resource *r = read_file_arg(&ptr);
+ if (r)
+ supply_resource(r, rank, outfp);
+ return 0;
+}
+
+int resource_manager::do_begin_font(const char *ptr, int, FILE *,
+ FILE *outfp)
+{
+ resource *r = read_font_arg(&ptr);
+ if (r) {
+ r->flags |= resource::SUPPLIED;
+ if (outfp) {
+ fputs("%%BeginResource: ", outfp);
+ r->print_type_and_name(outfp);
+ putc('\n', outfp);
+ }
+ }
+ return 0;
+}
+
+int resource_manager::do_include_font(const char *ptr, int rank, FILE *,
+ FILE *outfp)
+{
+ resource *r = read_font_arg(&ptr);
+ if (r) {
+ if (rank >= 0)
+ supply_resource(r, rank + 1, outfp);
+ else
+ r->flags |= resource::FONT_NEEDED;
+ }
+ return 0;
+}
+
+int resource_manager::change_to_end_resource(const char *, int, FILE *,
+ FILE *outfp)
+{
+ if (outfp)
+ fputs("%%EndResource\n", outfp);
+ return 0;
+}
+
+int resource_manager::do_begin_preview(const char *, int, FILE *fp,
+ FILE *)
+{
+ string buf;
+ do {
+ if (!ps_get_line(buf, fp)) {
+ error("end of file in preview section");
+ break;
+ }
+ } while (!matches_comment(buf, "EndPreview"));
+ return 0;
+}
+
+int read_one_of(const char **ptr, const char **s, int n)
+{
+ while (white_space(**ptr))
+ *ptr += 1;
+ if (**ptr == '\0')
+ return -1;
+ const char *start = *ptr;
+ do {
+ ++(*ptr);
+ } while (**ptr != '\0' && !white_space(**ptr));
+ for (int i = 0; i < n; i++)
+ if (strlen(s[i]) == size_t(*ptr - start)
+ && memcmp(s[i], start, *ptr - start) == 0)
+ return i;
+ return -1;
+}
+
+void skip_possible_newline(FILE *fp, FILE *outfp)
+{
+ int c = getc(fp);
+ if (c == '\r') {
+ current_lineno++;
+ if (outfp)
+ putc(c, outfp);
+ int cc = getc(fp);
+ if (cc != '\n') {
+ if (cc != EOF)
+ ungetc(cc, fp);
+ }
+ else {
+ if (outfp)
+ putc(cc, outfp);
+ }
+ }
+ else if (c == '\n') {
+ current_lineno++;
+ if (outfp)
+ putc(c, outfp);
+ }
+ else if (c != EOF)
+ ungetc(c, fp);
+}
+
+int resource_manager::do_begin_data(const char *ptr, int, FILE *fp,
+ FILE *outfp)
+{
+ while (white_space(*ptr))
+ ptr++;
+ const char *start = ptr;
+ unsigned numberof;
+ if (!read_uint_arg(&ptr, &numberof))
+ return 0;
+ static const char *types[] = { "Binary", "Hex", "ASCII" };
+ const int Binary = 0;
+ int type = 0;
+ static const char *units[] = { "Bytes", "Lines" };
+ const int Bytes = 0;
+ int unit = Bytes;
+ while (white_space(*ptr))
+ ptr++;
+ if (*ptr != '\0') {
+ type = read_one_of(&ptr, types, 3);
+ if (type < 0) {
+ error("bad data type");
+ return 0;
+ }
+ while (white_space(*ptr))
+ ptr++;
+ if (*ptr != '\0') {
+ unit = read_one_of(&ptr, units, 2);
+ if (unit < 0) {
+ error("expected 'Bytes' or 'Lines'");
+ return 0;
+ }
+ }
+ }
+ if (type != Binary)
+ return 1;
+ if (outfp) {
+ fputs("%%BeginData: ", outfp);
+ fputs(start, outfp);
+ }
+ if (numberof > 0) {
+ unsigned bytecount = 0;
+ unsigned linecount = 0;
+ do {
+ int c = getc(fp);
+ if (c == EOF) {
+ error("end of file within data section");
+ return 0;
+ }
+ if (outfp)
+ putc(c, outfp);
+ bytecount++;
+ if (c == '\r') {
+ int cc = getc(fp);
+ if (cc != '\n') {
+ linecount++;
+ current_lineno++;
+ }
+ if (cc != EOF)
+ ungetc(cc, fp);
+ }
+ else if (c == '\n') {
+ linecount++;
+ current_lineno++;
+ }
+ } while ((unit == Bytes ? bytecount : linecount) < numberof);
+ }
+ skip_possible_newline(fp, outfp);
+ string buf;
+ if (!ps_get_line(buf, fp)) {
+ error("missing %%%%EndData line");
+ return 0;
+ }
+ if (!matches_comment(buf, "EndData"))
+ error("bad %%%%EndData line");
+ if (outfp)
+ fputs(buf.contents(), outfp);
+ return 0;
+}
+
+int resource_manager::do_begin_binary(const char *ptr, int, FILE *fp,
+ FILE *outfp)
+{
+ if (!outfp)
+ return 0;
+ unsigned count;
+ if (!read_uint_arg(&ptr, &count))
+ return 0;
+ if (outfp)
+ fprintf(outfp, "%%%%BeginData: %u Binary Bytes\n", count);
+ while (count != 0) {
+ int c = getc(fp);
+ if (c == EOF) {
+ error("end of file within binary section");
+ return 0;
+ }
+ if (outfp)
+ putc(c, outfp);
+ --count;
+ if (c == '\r') {
+ int cc = getc(fp);
+ if (cc != '\n')
+ current_lineno++;
+ if (cc != EOF)
+ ungetc(cc, fp);
+ }
+ else if (c == '\n')
+ current_lineno++;
+ }
+ skip_possible_newline(fp, outfp);
+ string buf;
+ if (!ps_get_line(buf, fp)) {
+ error("missing %%%%EndBinary line");
+ return 0;
+ }
+ if (!matches_comment(buf, "EndBinary")) {
+ error("bad %%%%EndBinary line");
+ if (outfp)
+ fputs(buf.contents(), outfp);
+ }
+ else if (outfp)
+ fputs("%%EndData\n", outfp);
+ return 0;
+}
+
+static unsigned parse_extensions(const char *ptr)
+{
+ unsigned flags = 0;
+ for (;;) {
+ while (white_space(*ptr))
+ ptr++;
+ if (*ptr == '\0')
+ break;
+ const char *name = ptr;
+ do {
+ ++ptr;
+ } while (*ptr != '\0' && !white_space(*ptr));
+ int i;
+ for (i = 0; i < NEXTENSIONS; i++)
+ if (strlen(extension_table[i]) == size_t(ptr - name)
+ && memcmp(extension_table[i], name, ptr - name) == 0) {
+ flags |= (1 << i);
+ break;
+ }
+ if (i >= NEXTENSIONS) {
+ string s(name, ptr - name);
+ s += '\0';
+ error("unknown extension '%1'", s.contents());
+ }
+ }
+ return flags;
+}
+
+// XXX if it has not been surrounded with {Begin,End}Document need to
+// strip out Page: Trailer {Begin,End}Prolog {Begin,End}Setup sections.
+
+// XXX Perhaps the decision whether to use BeginDocument or
+// BeginResource: file should be postponed till we have seen
+// the first line of the file.
+
+void resource_manager::process_file(int rank, FILE *fp,
+ const char *filename, FILE *outfp)
+{
+ // If none of these comments appear in the header section, and we are
+ // just analyzing the file (i.e., outfp is 0), then we can return
+ // immediately.
+ static const char *header_comment_table[] = {
+ "DocumentNeededResources:",
+ "DocumentSuppliedResources:",
+ "DocumentNeededFonts:",
+ "DocumentSuppliedFonts:",
+ "DocumentNeededProcSets:",
+ "DocumentSuppliedProcSets:",
+ "DocumentNeededFiles:",
+ "DocumentSuppliedFiles:",
+ };
+
+ const int NHEADER_COMMENTS = sizeof(header_comment_table)
+ / sizeof(header_comment_table[0]);
+ struct comment_info {
+ const char *name;
+ int (resource_manager::*proc)(const char *, int, FILE *, FILE *);
+ };
+
+ static const comment_info comment_table[] = {
+ { "BeginResource:", &resource_manager::do_begin_resource },
+ { "IncludeResource:", &resource_manager::do_include_resource },
+ { "BeginDocument:", &resource_manager::do_begin_document },
+ { "IncludeDocument:", &resource_manager::do_include_document },
+ { "BeginProcSet:", &resource_manager::do_begin_procset },
+ { "IncludeProcSet:", &resource_manager::do_include_procset },
+ { "BeginFont:", &resource_manager::do_begin_font },
+ { "IncludeFont:", &resource_manager::do_include_font },
+ { "BeginFile:", &resource_manager::do_begin_file },
+ { "IncludeFile:", &resource_manager::do_include_file },
+ { "EndProcSet", &resource_manager::change_to_end_resource },
+ { "EndFont", &resource_manager::change_to_end_resource },
+ { "EndFile", &resource_manager::change_to_end_resource },
+ { "BeginPreview:", &resource_manager::do_begin_preview },
+ { "BeginData:", &resource_manager::do_begin_data },
+ { "BeginBinary:", &resource_manager::do_begin_binary },
+ };
+
+ const int NCOMMENTS = sizeof(comment_table)/sizeof(comment_table[0]);
+ string buf;
+ int saved_lineno = current_lineno;
+ const char *saved_filename = current_filename;
+ current_filename = filename;
+ current_lineno = 0;
+ if (!ps_get_line(buf, fp)) {
+ current_filename = saved_filename;
+ current_lineno = saved_lineno;
+ return;
+ }
+ if ((size_t)buf.length() < sizeof(PS_MAGIC)
+ || memcmp(buf.contents(), PS_MAGIC, sizeof(PS_MAGIC) - 1) != 0) {
+ if (outfp) {
+ do {
+ if (!(broken_flags & STRIP_PERCENT_BANG)
+ || buf[0] != '%' || buf[1] != '!')
+ fputs(buf.contents(), outfp);
+ } while (ps_get_line(buf, fp));
+ }
+ }
+ else {
+ if (!(broken_flags & STRIP_PERCENT_BANG) && outfp)
+ fputs(buf.contents(), outfp);
+ int in_header = 1;
+ int interesting = 0;
+ int had_extensions_comment = 0;
+ int had_language_level_comment = 0;
+ for (;;) {
+ if (!ps_get_line(buf, fp))
+ break;
+ int copy_this_line = 1;
+ if (buf[0] == '%') {
+ if (buf[1] == '%') {
+ const char *ptr;
+ int i;
+ for (i = 0; i < NCOMMENTS; i++)
+ if ((ptr = matches_comment(buf, comment_table[i].name))) {
+ copy_this_line
+ = (this->*(comment_table[i].proc))(ptr, rank, fp, outfp);
+ break;
+ }
+ if (i >= NCOMMENTS && in_header) {
+ if ((ptr = matches_comment(buf, "EndComments")))
+ in_header = 0;
+ else if (!had_extensions_comment
+ && (ptr = matches_comment(buf, "Extensions:"))) {
+ extensions |= parse_extensions(ptr);
+ // XXX handle possibility that next line is %%+
+ had_extensions_comment = 1;
+ }
+ else if (!had_language_level_comment
+ && (ptr = matches_comment(buf, "LanguageLevel:"))) {
+ unsigned ll;
+ if (read_uint_arg(&ptr, &ll) && ll > language_level)
+ language_level = ll;
+ had_language_level_comment = 1;
+ }
+ else {
+ for (i = 0; i < NHEADER_COMMENTS; i++)
+ if (matches_comment(buf, header_comment_table[i])) {
+ interesting = 1;
+ break;
+ }
+ }
+ }
+ if ((broken_flags & STRIP_STRUCTURE_COMMENTS)
+ && (matches_comment(buf, "EndProlog")
+ || matches_comment(buf, "Page:")
+ || matches_comment(buf, "Trailer")))
+ copy_this_line = 0;
+ }
+ else if (buf[1] == '!') {
+ if (broken_flags & STRIP_PERCENT_BANG)
+ copy_this_line = 0;
+ }
+ }
+ else
+ in_header = 0;
+ if (!outfp && !in_header && !interesting)
+ break;
+ if (copy_this_line && outfp)
+ fputs(buf.contents(), outfp);
+ }
+ }
+ current_filename = saved_filename;
+ current_lineno = saved_lineno;
+}
+
+void resource_manager::read_download_file()
+{
+ char *path = 0 /* nullptr */;
+ FILE *fp = font::open_file("download", &path);
+ if (0 /* nullptr */ == fp)
+ fatal("failed to open 'download' file: %1", strerror(errno));
+ char buf[512];
+ int lineno = 0;
+ while (fgets(buf, sizeof(buf), fp)) {
+ lineno++;
+ char *p = strtok(buf, " \t\r\n");
+ if (p == 0 /* nullptr */ || *p == '#')
+ continue;
+ char *q = strtok(0 /* nullptr */, " \t\r\n");
+ if (!q)
+ fatal_with_file_and_line(path, lineno, "file name missing for"
+ " font '%1'", p);
+ lookup_font(p)->filename = strsave(q);
+ }
+ free(path);
+ fclose(fp);
+}
+
+// XXX Can we share some code with ps_output::put_string()?
+
+static void print_ps_string(const string &s, FILE *outfp)
+{
+ int len = s.length();
+ const char *str = s.contents();
+ int funny = 0;
+ if (str[0] == '(')
+ funny = 1;
+ else {
+ for (int i = 0; i < len; i++)
+ if (str[i] <= 040 || str[i] > 0176) {
+ funny = 1;
+ break;
+ }
+ }
+ if (!funny) {
+ put_string(s, outfp);
+ return;
+ }
+ int level = 0;
+ int i;
+ for (i = 0; i < len; i++)
+ if (str[i] == '(')
+ level++;
+ else if (str[i] == ')' && --level < 0)
+ break;
+ putc('(', outfp);
+ for (i = 0; i < len; i++)
+ switch (str[i]) {
+ case '(':
+ case ')':
+ if (level != 0)
+ putc('\\', outfp);
+ putc(str[i], outfp);
+ break;
+ case '\\':
+ fputs("\\\\", outfp);
+ break;
+ case '\n':
+ fputs("\\n", outfp);
+ break;
+ case '\r':
+ fputs("\\r", outfp);
+ break;
+ case '\t':
+ fputs("\\t", outfp);
+ break;
+ case '\b':
+ fputs("\\b", outfp);
+ break;
+ case '\f':
+ fputs("\\f", outfp);
+ break;
+ default:
+ if (str[i] < 040 || str[i] > 0176)
+ fprintf(outfp, "\\%03o", str[i] & 0377);
+ else
+ putc(str[i], outfp);
+ break;
+ }
+ putc(')', outfp);
+}
+
+void resource_manager::print_extensions_comment(FILE *outfp)
+{
+ if (extensions) {
+ fputs("%%Extensions:", outfp);
+ for (int i = 0; i < NEXTENSIONS; i++)
+ if (extensions & (1 << i)) {
+ putc(' ', outfp);
+ fputs(extension_table[i], outfp);
+ }
+ putc('\n', outfp);
+ }
+}
+
+void resource_manager::print_language_level_comment(FILE *outfp)
+{
+ if (language_level)
+ fprintf(outfp, "%%%%LanguageLevel: %u\n", language_level);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/devices/grotty/TODO b/src/devices/grotty/TODO
new file mode 100644
index 0000000..3f23dc3
--- /dev/null
+++ b/src/devices/grotty/TODO
@@ -0,0 +1,3 @@
+Document font and device description file usage of grotty.
+
+With -h avoid using a tab when a single space will do.
diff --git a/src/devices/grotty/grotty.1.man b/src/devices/grotty/grotty.1.man
new file mode 100644
index 0000000..3dcafae
--- /dev/null
+++ b/src/devices/grotty/grotty.1.man
@@ -0,0 +1,810 @@
+.TH grotty @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+grotty \-
+.I groff
+output driver for typewriter-like (terminal) devices
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2021 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_grotty_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY grotty
+.RB [ \-dfho ]
+.RB [ \-i | \-r ]
+.RB [ \-F\~\c
+.IR dir ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY "grotty \-c"
+.RB [ \-bBdfhouU ]
+.RB [ \-F\~\c
+.IR dir ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY grotty
+.B \-\-help
+.YS
+.
+.
+.SY grotty
+.B \-v
+.
+.SY grotty
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The GNU
+.I roff
+TTY
+(\[lq]Teletype\[rq])
+output driver translates the output of
+.MR @g@troff @MAN1EXT@
+into a form suitable for typewriter-like devices,
+including terminal emulators.
+.
+Normally,
+.I grotty
+is invoked by
+.MR groff @MAN1EXT@
+when the latter is given one of the
+.RB \[lq] \-T\~ascii \[rq],
+.RB \[lq] \-T\~latin1 \[rq],
+.BR \-Tlatin1 ,
+or
+.RB \[lq] \-T\~utf8 \[rq]
+options on systems using ISO character encoding standards,
+or with
+.RB \[lq] \-T\~cp1047 \[rq]
+or
+.RB \[lq] \-T\~utf8 \[rq]
+on EBCDIC-based hosts.
+.
+(In this installation,
+.B @DEVICE@
+is the default output device.)
+.
+Use
+.IR groff 's
+.B \-P
+option to pass any options shown above to
+.IR grotty .
+.
+If no
+.I file
+arguments are given,
+or if
+.I file
+is \[lq]\-\[rq],
+.I grotty
+reads the standard input stream.
+.
+Output is written to the standard output stream.
+.
+.
+.P
+By default,
+.I grotty
+emits SGR escape sequences
+(from ISO\~6429,
+popularly called \[lq]ANSI escapes\[rq])
+to change text attributes
+(bold,
+italic,
+underline,
+reverse video
+.\" ECMA-48, 2nd edition (1979) calls it "negative image".
+[\[lq]negative image\[rq]]
+and colors).
+.
+Devices supporting the appropriate sequences can view
+.I roff
+documents using eight different background and foreground colors.
+.
+Following ISO\~6429,
+the following colors are defined in
+.IR tty.tmac :
+black,
+white,
+red,
+green,
+blue,
+yellow,
+magenta,
+and cyan.
+.
+Unrecognized colors are mapped to the default color,
+which is dependent on the settings of the terminal.
+.
+OSC\~8 hyperlinks are produced for these devices.
+.
+.
+.P
+In keeping with long-standing practice and the rarity of terminals
+(and emulators)
+that support oblique or italic fonts,
+italicized text is represented with underlining by default\[em]but see
+the
+.B \-i
+option below.
+.
+.
+.\" ====================================================================
+.SS "SGR and OSC support in pagers"
+.\" ====================================================================
+.
+When paging
+.IR grotty 's
+output with
+.MR less 1 ,
+the latter program must be instructed to pass SGR and OSC sequences
+through to the device;
+its
+.B \-R
+option is one way to achieve this
+.RI ( less
+version 566 or later is required for OSC\~8 support).
+.
+Consequently,
+programs like
+.MR man 1
+that page
+.I roff
+documents with
+.I less
+must call it with an appropriate option.
+.
+.
+.\" ====================================================================
+.SS "Legacy output format"
+.\" ====================================================================
+.
+The
+.B \-c
+option tells
+.I grotty
+to use an output format compatible with paper terminals,
+like the Teletype machines for which
+.I roff
+and
+.I nroff
+were first developed but which are no longer in wide use.
+.
+SGR escape sequences are not emitted;
+bold,
+italic,
+and underlining character attributes are thus not manipulated.
+.
+Instead,
+.I grotty
+overstrikes,
+representing a bold character
+.I c
+with the sequence
+.RI \[lq] c\~\c
+BACKSPACE\~\c
+.IR c \[rq],
+an italic character
+.I c
+with the sequence
+.RB \[lq] _\~\c
+BACKSPACE\~\c
+.IR c \[rq],
+and bold italics with
+.RB \[lq] _\~\c
+BACKSPACE\~\c
+.I c
+BACKSPACE\~\c
+.IR c \[rq].
+.
+This rendering is inherently ambiguous when the character
+.I c
+is itself the underscore.
+.
+.
+.P
+The legacy output format can be rendered on a video terminal
+(or emulator)
+by piping
+.IR grotty 's
+output through
+.MR ul 1 ,
+.\" from bsdmainutils 11.1.2+b1 (on Debian Buster)
+which may render bold italics as reverse video.
+.
+.\" 'more' from util-linux 2.33.1 (on Debian Buster) neither renders
+.\" double-struck characters as bold nor supports -b, but does render
+.\" SGR sequences (including color) with no flags required.
+Some implementations of
+.MR more 1
+are also able to display these sequences;
+you may wish to experiment with that command's
+.B \-b
+option.
+.
+.\" Version 487 of...
+.I less
+renders legacy bold and italics without requiring options.
+.
+In contrast to the terminal output drivers of some other
+.I roff
+implementations,
+.I grotty
+never outputs reverse line feeds.
+.
+There is therefore no need to filter its output through
+.MR col 1 .
+.
+.
+.\" ====================================================================
+.SS "Device control commands"
+.\" ====================================================================
+.
+.I grotty
+understands one device control function produced by the
+.I roff
+.B \[rs]X
+escape sequence in a document.
+.
+.
+.TP
+.BR "\[rs]X\[aq]tty: link " [\c
+.IR uri \~[ key\c
+.BI = value\c
+] \|.\|.\|.\|]\c
+.B \[aq]
+.
+Embed a hyperlink using the OSC 8 terminal escape sequence.
+.
+Specifying
+.I uri
+starts hyperlinked text,
+and omitting it ends the hyperlink.
+.
+When
+.I uri
+is present,
+any number of additional key/value pairs can be specified;
+their interpretation is the responsibility of the pager or terminal.
+.
+Spaces or tabs cannot appear literally in
+.IR uri ,
+.IR key ,
+or
+.IR value ;
+they must be represented in an alternate form.
+.
+.
+.\" ====================================================================
+.SS "Device description files"
+.\" ====================================================================
+.
+If the
+.I DESC
+file for the character encoding contains the
+.RB \[lq] unicode \[rq]
+directive,
+.I grotty
+emits Unicode characters in UTF-8 encoding.
+.
+Otherwise,
+it emits characters in a single-byte encoding depending on the data in
+the font description files.
+.
+See
+.MR groff_font @MAN5EXT@ .
+.
+.
+.P
+A font description file may contain a directive
+.RB \[lq] internalname\~\c
+.IR n \[rq]
+where
+.I n
+is a decimal integer.
+.
+If the 01 bit in
+.I n
+is set,
+then the font is treated as an italic font;
+if the 02 bit is set,
+then it is treated as a bold font.
+.
+.\" The following seems to say nothing that is not true of font
+.\" description files in general; if so, it belongs in groff_font(5).
+.\"The code field in the font description field gives the code which is
+.\"used to output the character.
+.\".
+.\"This code can also be used in the
+.\".I groff
+.\".B \[rs]N
+.\"escape sequence in a document.
+.
+.
+.\" ====================================================================
+.SS Typefaces
+.\" ====================================================================
+.
+.I grotty
+supports the standard four styles:
+.B R
+(roman),
+.B I
+.RI ( italic ),
+.B B
+.RB ( bold ),
+and
+.B BI
+(\f[BI]bold-italic\f[]).
+.
+Because the output driver operates in
+.I nroff
+mode,
+attempts to set or change the font family or type size are ignored.
+.
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.B \-b
+Suppress the use of overstriking for bold characters in legacy output
+format.
+.
+.
+.TP
+.B \-B
+Use only overstriking for bold-italic characters in legacy output
+format.
+.
+.
+.TP
+.B \-c
+Use
+.IR grotty 's
+legacy output format
+(see subsection \[lq]Legacy output format\[rq] above).
+.
+SGR and OSC escape sequences are not emitted.
+.
+.
+.TP
+.B \-d
+Ignore all
+.B \[rs]D
+drawing escape sequences in the input.
+.
+By default,
+.I grotty
+renders
+.BR \[rs]D\[aq]l \|.\|.\|.\& \[aq]
+escape sequences that have at least one zero argument
+(and so are either horizontal or vertical)
+using Unicode box drawing characters
+(for the
+.B utf8
+device)
+or the
+.BR \- ,
+.BR | ,
+and
+.B +
+characters
+(for all other devices).
+.
+.I grotty
+handles
+.BR \[rs]D\[aq]p \|.\|.\|.\& \[aq]
+escape sequences that consist entirely of horizontal and vertical
+lines similarly.
+.
+.
+.TP
+.B \-f
+Emit a form feed at the end of each page having no output on its last
+line.
+.
+.
+.TP
+.BI \-F\~ dir
+Prepend directory
+.RI dir /dev name
+to the search path for font and device description files;
+.I name
+describes the output device's character encoding,
+one of
+.BR ascii ,
+.BR latin1 ,
+.BR utf8 ,
+or
+.BR cp1047 .
+.
+.
+.TP
+.B \-h
+Use literal horizontal tab characters in the output.
+.
+Tabs are assumed to be set every 8 columns.
+.
+.
+.TP
+.B \-i
+Render oblique-styled fonts
+.RB ( I
+and
+.BR BI )
+with the SGR attribute for italic text
+rather than underlined text.
+.
+Many terminals don't support this attribute;
+however,
+.MR xterm 1 ,
+since patch\~#314 (2014-12-28),
+does.
+.
+Ignored if
+.B \-c
+is also specified.
+.
+.
+.TP
+.B \-o
+Suppress overstriking
+(other than for bold and/or underlined characters when the legacy output
+format is in use).
+.
+.
+.TP
+.B \-r
+Render oblique-styled fonts
+.RB ( I
+and
+.BR BI )
+with the SGR attribute for reverse video text
+rather than underlined text.
+.
+Ignored if
+.B \-c
+or
+.B \-i
+is also specified.
+.
+.
+.TP
+.B \-u
+Suppress the use of underlining for italic characters in legacy output
+format.
+.
+.
+.TP
+.B \-U
+Use only underlining for bold-italic characters in legacy output format.
+.
+.
+.\" ====================================================================
+.SH Environment
+.\" ====================================================================
+.
+.TP
+.I GROFF_FONT_PATH
+A list of directories in which to seek the selected output device's
+directory of device and font description files.
+.
+See
+.MR @g@troff @MAN1EXT@
+and
+.MR groff_font @MAN5EXT@ .
+.
+.
+.TP
+.I GROFF_NO_SGR
+If set,
+.IR grotty 's
+legacy output format is used just as if the
+.B \-c
+option were specified;
+see subsection \[lq]Legacy output format\[rq] above.
+.
+.
+.br
+.ne 3v \" Keep section heading and paragraph tag together.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @FONTDIR@/\:\%devascii/\:DESC
+describes the
+.B ascii
+output device.
+.
+.
+.TP
+.IR @FONTDIR@/\:\%devascii/ F
+describes the font known
+.RI as\~ F
+on device
+.BR ascii .
+.
+.
+.TP
+.I @FONTDIR@/\:\%devcp1047/\:DESC
+describes the
+.B cp1047
+output device.
+.
+.
+.TP
+.IR @FONTDIR@/\:\%devcp1047/ F
+describes the font known
+.RI as\~ F
+on device
+.BR cp1047 .
+.
+.
+.TP
+.I @FONTDIR@/\:\%devlatin1/\:DESC
+describes the
+.B latin1
+output device.
+.
+.
+.TP
+.IR @FONTDIR@/\:\%devlatin1/ F
+describes the font known
+.RI as\~ F
+on device
+.BR latin1 .
+.
+.
+.TP
+.I @FONTDIR@/\:\%devutf8/\:DESC
+describes the
+.B utf8
+output device.
+.
+.
+.TP
+.IR @FONTDIR@/\:\%devutf8/ F
+describes the font known
+.RI as\~ F
+on device
+.BR utf8 .
+.
+.
+.TP
+.I @MACRODIR@/\:tty\:.tmac
+defines macros for use with the
+.BR ascii ,
+.BR cp1047 ,
+.BR latin1 ,
+and
+.B utf8
+output devices.
+.
+It is automatically loaded by
+.I troffrc
+when any of those output devices is selected.
+.
+.
+.TP
+.I @MACRODIR@/\:tty\-char\:.tmac
+defines fallback characters for use with
+.I grotty.
+.
+See
+.MR nroff @MAN1EXT@ .
+.
+.
+.\" XXX: The following no longer seems to be true; an inspection of the
+.\" font/*/dev*.am files suggests no evidence of it, at any rate.
+.\".P
+.\"Note that on EBCDIC hosts,
+.\"only files for the
+.\".B cp1047
+.\"device are installed.
+.
+.
+.\" ====================================================================
+.SH Limitations
+.\" ====================================================================
+.
+.I grotty
+is intended only for simple documents.
+.
+.
+.IP \[bu] 2n
+There is no support for fractional horizontal or vertical motions.
+.
+.
+.IP \[bu]
+.I roff
+.B \[rs]D
+escape sequences producing anything other than horizontal and vertical
+lines are not supported.
+.
+.
+.IP \[bu]
+Characters above the first line
+(that is,
+with a vertical drawing position of\~0)
+cannot be rendered.
+.
+.
+.IP \[bu]
+Color handling differs from other output drivers.
+.
+The
+.I groff
+requests and escape sequences that set the stroke and fill colors
+instead set the foreground and background character cell colors,
+respectively.
+.
+.
+.\" ====================================================================
+.SH Examples
+.\" ====================================================================
+.
+The following
+.I groff
+document exercises several features for which output device support
+varies:
+(1)\~bold style;
+(2)\~italic (underline) style;
+(3)\~bold-italic style;
+(4)\~character composition by overstriking (\[lq]co\[:o]perate\[rq]);
+(5)\~foreground color;
+(6)\~background color;
+and
+(7)\~horizontal and vertical line-drawing.
+.
+.
+.P
+.RS
+.EX
+You might see \ef[B]bold\ef[] and \ef[I]italic\ef[].
+Some people see \ef[BI]both\ef[].
+If the output device does (not) co\ez\e[ad]operate,
+you might see \em[red]red\em[].
+Black on cyan can have a \eM[cyan]\em[black]prominent\em[]\eM[]
+\eD\[aq]l 1i 0\[aq]\eD\[aq]l 0 2i\[aq]\eD\[aq]l 1i 0\[aq] look.
+\&.\e" If in nroff mode, end page now.
+\&.if n .pl \en[nl]u
+.EE
+.RE
+.
+.
+.P
+Given the foregoing input,
+compare and contrast the output of the following.
+.
+.
+.P
+.RS
+.EX
+$ \c
+.B groff \-T ascii \c
+.I file
+$ \c
+.B groff \-T utf8 \-P \-i \c
+.I file
+$ \c
+.B groff \-T utf8 \-P \-c \c
+.I file \c
+.B | ul
+.EE
+.RE
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+\[lq]Control Functions for Coded Character Sets\[rq]
+(ECMA-48)
+5th\~edition,
+Ecma International,
+June\~1991.
+.
+A gratis version of ISO\~6429,
+this document includes a normative description of SGR escape sequences.
+.
+Available at
+.UR http://\:www\:.ecma\-international\:.org/\:publications/\:files/\:\
+ECMA\-ST/\:Ecma\-048\:.pdf
+.UE .
+.
+.
+.P
+.UR https://\:gist\:.github\:.com/\:egmontkob/\:\
+eb114294efbcd5ad\:b1944c9f3cb5feda
+\[lq]Hyperlinks in Terminal Emulators\[rq]
+.UE ,
+Egmont Koblinger.
+.
+.
+.P
+.MR groff @MAN1EXT@ ,
+.MR @g@troff @MAN1EXT@ ,
+.MR groff_out @MAN5EXT@ ,
+.MR groff_font @MAN5EXT@ ,
+.MR groff_char @MAN7EXT@ ,
+.MR ul 1 ,
+.MR more 1 ,
+.MR less 1 ,
+.MR man 1
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_grotty_1_man_C]
+.do rr *groff_grotty_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/devices/grotty/grotty.am b/src/devices/grotty/grotty.am
new file mode 100644
index 0000000..14921c5
--- /dev/null
+++ b/src/devices/grotty/grotty.am
@@ -0,0 +1,39 @@
+# Copyright (C) 2014-2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+bin_PROGRAMS += grotty
+grotty_SOURCES = src/devices/grotty/tty.cpp
+grotty_LDADD = $(LIBM) \
+ libdriver.a \
+ libgroff.a \
+ lib/libgnu.a
+man1_MANS += src/devices/grotty/grotty.1
+EXTRA_DIST += \
+ src/devices/grotty/grotty.1.man \
+ src/devices/grotty/TODO
+
+grotty_TESTS = \
+ src/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh \
+ src/devices/grotty/tests/osc8_works.sh
+TESTS += $(grotty_TESTS)
+EXTRA_DIST += $(grotty_TESTS)
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh b/src/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh
new file mode 100755
index 0000000..92552d2
--- /dev/null
+++ b/src/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh
@@ -0,0 +1,205 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+grotty="${abs_top_builddir:-.}/grotty"
+
+fail=
+
+wail () {
+ printf "FAILED " >&2
+ fail=YES
+}
+
+# Ensure that characters are mapped to glyphs normatively.
+
+input='x T @DEVICE@
+x res 240 24 40
+x init
+p1
+x font 1 R
+f1
+s10
+V40
+H0
+md
+DFd
+t!#$%&()*+,./0123456789:;<=>?@
+n40 0
+V80
+H0
+tABCDEFGHIJKLMNOPQRSTUVWXYZ[]_
+n40 0
+V120
+H0
+tabcdefghijklmnopqrstuvwxyz{|}
+n40 0
+V160
+H0
+tneutral
+wh24
+tdouble
+wh24
+tquote:
+wh24
+Cdq
+h24
+n40 0
+V200
+H0
+tclosing
+wh24
+tsingle
+wh24
+tquote:
+wh24
+t'"'"'
+n40 0
+V240
+H0
+thyphen:
+wh24
+t-
+n40 0
+V280
+H0
+tbackslash:
+wh24
+Crs
+h24
+n40 0
+V320
+H0
+tmodifier
+wh24
+tcircumflex:
+wh24
+t^
+n40 0
+V360
+H0
+topening
+wh24
+tsingle
+wh24
+tquote:
+wh24
+t`
+n40 0
+V400
+H0
+tmodifier
+wh24
+ttilde:
+wh24
+t~
+n40 0
+x trailer
+V2640
+x stop'
+
+# TODO: Test cp1047 when we have access to a host environment using it.
+
+for D in ascii latin1 utf8
+do
+ if [ "$D" = "utf8" ]
+ then
+ # We can't test UTF-8 if the environment doesn't support it.
+ if [ "$(locale charmap)" != UTF-8 ]
+ then
+ # If we've already seen a failure case, report it.
+ if [ -n "$fail" ]
+ then
+ exit 1 # fail
+ else
+ exit 77 # skip
+ fi
+ fi
+ fi
+
+ printf 'checking "%s" output device...' $D >&2
+ output=$(echo "$input" | sed s/@DEVICE@/$D/ \
+ | "$grotty" -F font -F build/font)
+ printf 'group1 ' >&2
+ echo "$output" | grep -Fqx '!#$%&()*+,./0123456789:;<=>?@' || wail
+ printf 'group2 ' >&2
+ echo "$output" | grep -Fqx 'ABCDEFGHIJKLMNOPQRSTUVWXYZ[]_' || wail
+ printf 'group3 ' >&2
+ echo "$output" | grep -Fqx 'abcdefghijklmnopqrstuvwxyz{|}' || wail
+ printf '" ' >&2
+ echo "$output" | grep -Fqx 'neutral double quote: "' || wail
+ printf '\\ ' >&2
+ echo "$output" | grep -Fqx 'backslash: \' || wail
+ case $D in
+ (utf8)
+# Expected:
+#0000000 ! # $ % & ( ) * + , . / 0 1 2 3
+#0000020 4 5 6 7 8 9 : ; < = > ? @ \n A B
+#0000040 C D E F G H I J K L M N O P Q R
+#0000060 S T U V W X Y Z [ ] _ \n a b c d
+#0000100 e f g h i j k l m n o p q r s t
+#0000120 u v w x y z { | } \n n e u t r a
+#0000140 l d o u b l e q u o t e :
+#0000160 " \n c l o s i n g s i n g l e
+#0000200 q u o t e : 342 200 231 \n h y p h
+#0000220 e n : 342 200 220 \n b a c k s l a s
+#0000240 h : \ \n m o d i f i e r c i
+#0000260 r c u m f l e x : 313 206 \n o p e
+#0000300 n i n g s i n g l e q u o t
+#0000320 e : 342 200 230 \n m o d i f i e r
+#0000340 t i l d e : 313 234 \n
+#0000352
+ output_od=$(echo "$output" | LC_ALL=C od -t c)
+ printf "' " >&2
+ printf '%s\n' "$output_od" \
+ | grep -Eq '0000200 +q +u +o +t +e +: +342 +200 +231' \
+ || wail
+ printf '` ' >&2
+ printf '%s\n' "$output_od" \
+ | grep -Eq '0000320 +e +: +342 +200 +230' || wail
+ printf "%s " '-' >&2
+ printf '%s\n' "$output_od" \
+ | grep -Eq '0000220 +e +n +: +342 +200 +220' || wail
+ printf '^ ' >&2
+ printf '%s\n' "$output_od" \
+ | grep -Eq '0000260 +r +c +u +m +f +l +e +x +: +313 +206' \
+ || wail
+ printf "~ " >&2
+ printf '%s\n' "$output_od" \
+ | grep -Eq '0000340 +t +i +l +d +e +: +313 +234' || wail
+ ;;
+ (*)
+ printf '` ' >&2
+ echo "$output" | grep -Fqx 'opening single quote: `' || wail
+ printf "' " >&2
+ echo "$output" | grep -Fqx "closing single quote: '" || wail
+ printf "%s " '-' >&2
+ echo "$output" | grep -Fqx "hyphen: -" || wail
+ printf '^ ' >&2
+ echo "$output" | grep -Fqx "modifier circumflex: ^" || wail
+ printf "~ " >&2
+ echo "$output" | grep -Fqx "modifier tilde: ~" || wail
+ ;;
+ esac
+ echo >&2
+done
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/devices/grotty/tests/osc8_works.sh b/src/devices/grotty/tests/osc8_works.sh
new file mode 100755
index 0000000..db6480d
--- /dev/null
+++ b/src/devices/grotty/tests/osc8_works.sh
@@ -0,0 +1,119 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+set -e
+
+grotty="${abs_top_builddir:-.}/grotty"
+
+input="x T utf8
+x res 240 24 40
+x init
+p1
+x font 1 R
+f1
+s10
+V40
+H0
+md
+DFd
+tA
+n40 0
+x X tty: link
+x X tty: link h
+x X tty: link http://example.com/1
+x X tty: link
+x X tty: link http://example.com/2
+tB
+x X tty: link
+x X tty: link mailto:g.branden.robinson@gmail.com
+tBranden
+x X tty: link
+x trailer
+V2640
+x stop"
+
+# We expect diagnostics from the first few "x X tty: link" lines. The
+# first should complain about a link ending without having been started.
+# The second is bogus ("h") but it's not grotty's job to validate the
+# structure of a URI. The third should draw complaint because we didn't
+# end the (bogus) URI that we started with the second.
+
+# The remaining input is well-formed. The URI ending in "1" is
+# effectively hidden because no character cells are drawn while it is
+# active.
+echo "expect two diagnostic messages regarding ill-formed links" >&2
+output=$(echo "$input" | "$grotty" -F font -F build/font | od -t c)
+
+# Expected:
+#0000000 A 033 ] 8 ; ; 033 \ 033 ] 8 ; ; h 033 \
+#0000020 033 ] 8 ; ; 033 \ 033 ] 8 ; ; h t t p
+#0000040 : / / e x a m p l e . c o m / 1
+#0000060 033 \ 033 ] 8 ; ; 033 \ 033 ] 8 ; ; h t
+#0000100 t p : / / e x a m p l e . c o m
+#0000120 / 2 033 \ B 033 ] 8 ; ; 033 \ 033 ] 8 ;
+#0000140 ; m a i l t o : g . b r a n d e
+#0000160 n . r o b i n s o n @ g m a i l
+#0000200 . c o m 033 \ B r a n d e n 033 ] 8
+#0000220 ; ; 033 \ \n \n \n \n \n \n \n \n \n \n \n \n
+#0000240 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
+#*
+#0000320 \n \n \n \n \n \n
+#0000326
+
+echo "testing for URI that corresponds to no character cells" >&2
+echo "$output" | grep -Eq 'A 033 +] +8 +; +; +033 +\\'
+
+echo "testing http URI (1)" >&2
+echo "$output" | grep -Eq '0000020 +.*033 +] +8 +; +; +h + t +t +p'
+
+echo "testing http URI (2)" >&2
+echo "$output" | grep -Eq '0000040 +: +/ +/ +e +x +a +m +p +l +e +\. +c'
+
+echo "testing http URI (3)" >&2
+echo "$output" | grep -Eq '0000040.* +o +m +/ +1'
+
+echo "testing http URI (4)" >&2
+echo "$output" | grep -Eq '0000060 +033 +\\'
+
+echo "testing mailto URI (1)" >&2
+echo "$output" | grep -Eq '0000120 +.* +033 +] +8 +;$'
+
+echo "testing mailto URI (2)" >&2
+echo "$output" | grep -Eq '0000140 +; +m +a +i +l +t +o +: +g +\. +b'
+
+echo "testing mailto URI (3)" >&2
+echo "$output" | grep -Eq '0000140.* +r +a +n +d +e$'
+
+echo "testing mailto URI (4)" >&2
+echo "$output" | grep -Eq '0000160 +n +\. +r +o +b +i +n +s +o +n +@'
+
+echo "testing mailto URI (5)" >&2
+echo "$output" | grep -Eq '0000160.* +g +m +a +i +l$'
+
+echo "testing mailto URI (6)" >&2
+echo "$output" | grep -Eq '0000200 +\. +c +o +m +033 +\\ +B +r +a +n +d'
+
+echo "testing mailto URI (7)" >&2
+echo "$output" | grep -Eq '0000200.* +e +n +033 +] +8$'
+
+echo "testing mailto URI (8)" >&2
+echo "$output" | grep -Eq '0000220 +; +; +033 +\\'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/devices/grotty/tty.cpp b/src/devices/grotty/tty.cpp
new file mode 100644
index 0000000..45926f6
--- /dev/null
+++ b/src/devices/grotty/tty.cpp
@@ -0,0 +1,1043 @@
+/* Copyright (C) 1989-2021 Free Software Foundation, Inc.
+ Written by James Clark (jjc@jclark.com)
+ OSC 8 support by G. Branden Robinson
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "driver.h"
+#include "device.h"
+#include "ptable.h"
+
+typedef signed char schar;
+
+declare_ptable(schar)
+implement_ptable(schar)
+
+extern "C" const char *Version_string;
+
+#define putstring(s) fputs(s, stdout)
+
+#ifndef SHRT_MIN
+#define SHRT_MIN (-32768)
+#endif
+
+#ifndef SHRT_MAX
+#define SHRT_MAX 32767
+#endif
+
+#define TAB_WIDTH 8
+
+// A character of the output device fits in a 32-bit word.
+typedef unsigned int output_character;
+
+static bool want_horizontal_tabs = false;
+static bool want_form_feeds = false;
+static bool want_emboldening_by_overstriking = true;
+static bool do_bold;
+static bool want_italics_by_underlining = true;
+static bool do_underline;
+static bool want_glyph_composition_by_overstriking = true;
+static bool allow_drawing_commands = true;
+static bool want_sgr_italics = false;
+static bool do_sgr_italics;
+static bool want_reverse_video_for_italics = false;
+static bool do_reverse_video;
+static bool use_overstriking_drawing_scheme = false;
+
+static void update_options();
+static void usage(FILE *stream);
+
+static int hline_char = '-';
+static int vline_char = '|';
+
+enum {
+ UNDERLINE_MODE = 0x01,
+ BOLD_MODE = 0x02,
+ VDRAW_MODE = 0x04,
+ HDRAW_MODE = 0x08,
+ CU_MODE = 0x10,
+ COLOR_CHANGE = 0x20,
+ START_LINE = 0x40,
+ END_LINE = 0x80
+};
+
+// Mode to use for bold-underlining.
+static unsigned char bold_underline_mode_option = BOLD_MODE|UNDERLINE_MODE;
+static unsigned char bold_underline_mode;
+
+#ifndef IS_EBCDIC_HOST
+#define CSI "\033["
+#define OSC8 "\033]8"
+#define ST "\033\\"
+#else
+#define CSI "\047["
+#define OSC8 "\047]8"
+#define ST "\047\\"
+#endif
+
+// SGR handling (ISO 6429)
+#define SGR_BOLD CSI "1m"
+#define SGR_NO_BOLD CSI "22m"
+#define SGR_ITALIC CSI "3m"
+#define SGR_NO_ITALIC CSI "23m"
+#define SGR_UNDERLINE CSI "4m"
+#define SGR_NO_UNDERLINE CSI "24m"
+#define SGR_REVERSE CSI "7m"
+#define SGR_NO_REVERSE CSI "27m"
+// many terminals can't handle 'CSI 39 m' and 'CSI 49 m' to reset
+// the foreground and background color, respectively; we thus use
+// 'CSI 0 m' exclusively
+#define SGR_DEFAULT CSI "0m"
+
+#define DEFAULT_COLOR_IDX -1
+
+class tty_font : public font {
+ tty_font(const char *);
+ unsigned char mode;
+public:
+ ~tty_font();
+ unsigned char get_mode() { return mode; }
+#if 0
+ void handle_x_command(int argc, const char **argv);
+#endif
+ static tty_font *load_tty_font(const char *);
+};
+
+tty_font *tty_font::load_tty_font(const char *s)
+{
+ tty_font *f = new tty_font(s);
+ if (!f->load()) {
+ delete f;
+ return 0;
+ }
+ const char *num = f->get_internal_name();
+ long n;
+ if (num != 0 && (n = strtol(num, 0, 0)) != 0)
+ f->mode = (unsigned char)(n & (BOLD_MODE|UNDERLINE_MODE));
+ if (!do_underline)
+ f->mode &= ~UNDERLINE_MODE;
+ if (!do_bold)
+ f->mode &= ~BOLD_MODE;
+ if ((f->mode & (BOLD_MODE|UNDERLINE_MODE)) == (BOLD_MODE|UNDERLINE_MODE))
+ f->mode = (unsigned char)((f->mode & ~(BOLD_MODE|UNDERLINE_MODE))
+ | bold_underline_mode);
+ return f;
+}
+
+tty_font::tty_font(const char *nm)
+: font(nm), mode(0)
+{
+}
+
+tty_font::~tty_font()
+{
+}
+
+#if 0
+void tty_font::handle_x_command(int argc, const char **argv)
+{
+ if (argc >= 1 && strcmp(argv[0], "bold") == 0)
+ mode |= BOLD_MODE;
+ else if (argc >= 1 && strcmp(argv[0], "underline") == 0)
+ mode |= UNDERLINE_MODE;
+}
+#endif
+
+class tty_glyph {
+public:
+ tty_glyph *next;
+ int w;
+ int hpos;
+ unsigned int code;
+ unsigned char mode;
+ schar back_color_idx;
+ schar fore_color_idx;
+ inline int draw_mode() { return mode & (VDRAW_MODE|HDRAW_MODE); }
+ inline int order() {
+ return mode & (VDRAW_MODE|HDRAW_MODE|CU_MODE|COLOR_CHANGE); }
+};
+
+
+class tty_printer : public printer {
+ tty_glyph **lines;
+ int nlines;
+ int cached_v;
+ int cached_vpos;
+ schar curr_fore_idx;
+ schar curr_back_idx;
+ bool is_underlining;
+ bool is_boldfacing;
+ bool is_continuously_underlining;
+ PTABLE(schar) tty_colors;
+ void make_underline(int);
+ void make_bold(output_character, int);
+ schar color_to_idx(color *);
+ void add_char(output_character, int, int, int, color *, color *,
+ unsigned char);
+ void simple_add_char(const output_character, const environment *);
+ char *make_rgb_string(unsigned int, unsigned int, unsigned int);
+ bool tty_color(unsigned int, unsigned int, unsigned int, schar *,
+ schar = DEFAULT_COLOR_IDX);
+ void line(int, int, int, int, color *, color *);
+ void draw_line(int *, int, const environment *);
+ void draw_polygon(int *, int, const environment *);
+ void special_link(const char *, const environment *);
+public:
+ tty_printer();
+ ~tty_printer();
+ void set_char(glyph *, font *, const environment *, int, const char *);
+ void draw(int, int *, int, const environment *);
+ void special(char *, const environment *, char);
+ void change_color(const environment * const);
+ void change_fill_color(const environment * const);
+ void put_char(output_character);
+ void put_color(schar, int);
+ void begin_page(int) { }
+ void end_page(int);
+ font *make_font(const char *);
+};
+
+char *tty_printer::make_rgb_string(unsigned int r,
+ unsigned int g,
+ unsigned int b)
+{
+ char *s = new char[8];
+ s[0] = char(r >> 8);
+ s[1] = char(r & 0xff);
+ s[2] = char(g >> 8);
+ s[3] = char(g & 0xff);
+ s[4] = char(b >> 8);
+ s[5] = char(b & 0xff);
+ s[6] = char(0x80);
+ s[7] = 0;
+ // avoid null-bytes in string
+ for (int i = 0; i < 6; i++)
+ if (!s[i]) {
+ s[i] = 1;
+ s[6] |= 1 << i;
+ }
+ return s;
+}
+
+bool tty_printer::tty_color(unsigned int r,
+ unsigned int g,
+ unsigned int b, schar *idx, schar value)
+{
+ bool is_known_color = true;
+ char *s = make_rgb_string(r, g, b);
+ schar *i = tty_colors.lookup(s);
+ if (!i) {
+ is_known_color = false;
+ i = new schar[1];
+ *i = value;
+ tty_colors.define(s, i);
+ }
+ *idx = *i;
+ delete[] s;
+ return is_known_color;
+}
+
+tty_printer::tty_printer() : cached_v(0)
+{
+ if (font::is_unicode) {
+ hline_char = 0x2500;
+ vline_char = 0x2502;
+ }
+ schar dummy;
+ // black, white
+ (void)tty_color(0, 0, 0, &dummy, 0);
+ (void)tty_color(color::MAX_COLOR_VAL,
+ color::MAX_COLOR_VAL,
+ color::MAX_COLOR_VAL, &dummy, 7);
+ // red, green, blue
+ (void)tty_color(color::MAX_COLOR_VAL, 0, 0, &dummy, 1);
+ (void)tty_color(0, color::MAX_COLOR_VAL, 0, &dummy, 2);
+ (void)tty_color(0, 0, color::MAX_COLOR_VAL, &dummy, 4);
+ // yellow, magenta, cyan
+ (void)tty_color(color::MAX_COLOR_VAL, color::MAX_COLOR_VAL, 0, &dummy, 3);
+ (void)tty_color(color::MAX_COLOR_VAL, 0, color::MAX_COLOR_VAL, &dummy, 5);
+ (void)tty_color(0, color::MAX_COLOR_VAL, color::MAX_COLOR_VAL, &dummy, 6);
+ nlines = 66;
+ lines = new tty_glyph *[nlines];
+ for (int i = 0; i < nlines; i++)
+ lines[i] = 0;
+ is_continuously_underlining = false;
+}
+
+tty_printer::~tty_printer()
+{
+ delete[] lines;
+}
+
+void tty_printer::make_underline(int w)
+{
+ if (use_overstriking_drawing_scheme) {
+ if (!w)
+ warning("can't underline zero-width character");
+ else {
+ putchar('_');
+ putchar('\b');
+ }
+ }
+ else {
+ if (!is_underlining) {
+ if (do_sgr_italics)
+ putstring(SGR_ITALIC);
+ else if (do_reverse_video)
+ putstring(SGR_REVERSE);
+ else
+ putstring(SGR_UNDERLINE);
+ }
+ is_underlining = true;
+ }
+}
+
+void tty_printer::make_bold(output_character c, int w)
+{
+ if (use_overstriking_drawing_scheme) {
+ if (!w)
+ warning("can't print zero-width character in bold");
+ else {
+ put_char(c);
+ putchar('\b');
+ }
+ }
+ else {
+ if (!is_boldfacing)
+ putstring(SGR_BOLD);
+ is_boldfacing = true;
+ }
+}
+
+schar tty_printer::color_to_idx(color *col)
+{
+ if (col->is_default())
+ return DEFAULT_COLOR_IDX;
+ unsigned int r, g, b;
+ col->get_rgb(&r, &g, &b);
+ schar idx;
+ if (!tty_color(r, g, b, &idx)) {
+ char *s = col->print_color();
+ error("unrecognized color '%1' mapped to default", s);
+ delete[] s;
+ }
+ return idx;
+}
+
+void tty_printer::set_char(glyph *g, font *f, const environment *env,
+ int w, const char *)
+{
+ if (w % font::hor != 0)
+ fatal("glyph width is not a multiple of horizontal motion quantum");
+ add_char(f->get_code(g), w,
+ env->hpos, env->vpos,
+ env->col, env->fill,
+ ((tty_font *)f)->get_mode());
+}
+
+void tty_printer::add_char(output_character c, int w,
+ int h, int v,
+ color *fore, color *back,
+ unsigned char mode)
+{
+#if 0
+ // This is too expensive.
+ if (h % font::hor != 0)
+ fatal("horizontal position not a multiple of horizontal motion quantum");
+#endif
+ int hpos = h / font::hor;
+ if (hpos < SHRT_MIN || hpos > SHRT_MAX) {
+ error("character with ridiculous horizontal position discarded");
+ return;
+ }
+ int vpos;
+ if (v == cached_v && cached_v != 0)
+ vpos = cached_vpos;
+ else {
+ if (v % font::vert != 0)
+ fatal("vertical position not a multiple of vertical motion"
+ " quantum");
+ vpos = v / font::vert;
+ if (vpos > nlines) {
+ tty_glyph **old_lines = lines;
+ lines = new tty_glyph *[vpos + 1];
+ memcpy(lines, old_lines, nlines * sizeof(tty_glyph *));
+ for (int i = nlines; i <= vpos; i++)
+ lines[i] = 0;
+ delete[] old_lines;
+ nlines = vpos + 1;
+ }
+ // Note that the first output line corresponds to groff
+ // position font::vert.
+ if (vpos <= 0) {
+ error("output above first line discarded");
+ return;
+ }
+ cached_v = v;
+ cached_vpos = vpos;
+ }
+ tty_glyph *g = new tty_glyph;
+ g->w = w;
+ g->hpos = hpos;
+ g->code = c;
+ g->fore_color_idx = color_to_idx(fore);
+ g->back_color_idx = color_to_idx(back);
+ g->mode = mode;
+
+ // The list will be reversed later. After reversal, it must be in
+ // increasing order of hpos, with COLOR_CHANGE and CU specials before
+ // HDRAW characters before VDRAW characters before normal characters
+ // at each hpos, and otherwise in order of occurrence.
+
+ tty_glyph **pp;
+ for (pp = lines + (vpos - 1); *pp; pp = &(*pp)->next)
+ if ((*pp)->hpos < hpos
+ || ((*pp)->hpos == hpos && (*pp)->order() >= g->order()))
+ break;
+ g->next = *pp;
+ *pp = g;
+}
+
+void tty_printer::simple_add_char(const output_character c,
+ const environment *env)
+{
+ add_char(c, 0, env->hpos, env->vpos, env->col, env->fill, 0);
+}
+
+void tty_printer::special(char *arg, const environment *env, char type)
+{
+ if (type == 'u') {
+ add_char(*arg - '0', 0, env->hpos, env->vpos, env->col, env->fill,
+ CU_MODE);
+ return;
+ }
+ if (type != 'p')
+ return;
+ char *p;
+ for (p = arg; *p == ' ' || *p == '\n'; p++)
+ ;
+ char *tag = p;
+ for (; *p != '\0' && *p != ':' && *p != ' ' && *p != '\n'; p++)
+ ;
+ if (*p == '\0' || strncmp(tag, "tty", p - tag) != 0) {
+ error("X command without 'tty:' tag ignored");
+ return;
+ }
+ p++;
+ for (; *p == ' ' || *p == '\n'; p++)
+ ;
+ char *command = p;
+ for (; *p != '\0' && *p != ' ' && *p != '\n'; p++)
+ ;
+ if (*command == '\0') {
+ error("empty X command ignored");
+ return;
+ }
+ if (strncmp(command, "link", p - command) == 0)
+ special_link(p, env);
+ else
+ warning("unrecognized X command '%1' ignored", command);
+}
+
+// Produce an OSC 8 hyperlink. Given ditroff input of the form:
+// x X tty: link [URI[ KEY=VALUE] ...]
+// produce "OSC 8 [;KEY=VALUE];[URI] ST". KEY/VALUE pairs can be
+// repeated arbitrarily and are separated by colons. Omission of the
+// URI ends the hyperlink that was begun by specifying it. See
+// <https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda>.
+void tty_printer::special_link(const char *arg, const environment *env)
+{
+ static bool is_link_active = false;
+ if (use_overstriking_drawing_scheme)
+ return;
+ for (const char *s = OSC8; *s != '\0'; s++)
+ simple_add_char(*s, env);
+ simple_add_char(';', env);
+ char c = *arg;
+ if ('\0' == c || '\n' == c) {
+ simple_add_char(';', env);
+ if (!is_link_active)
+ warning("ending hyperlink when none was started");
+ is_link_active = false;
+ }
+ else {
+ // Our caller ensures that we see white space after 'link'.
+ assert(c == ' ' || c == '\t');
+ if (is_link_active) {
+ warning("new hyperlink started without ending previous one;"
+ " recovering");
+ simple_add_char(';', env);
+ for (const char *s = ST OSC8; *s != '\0'; s++)
+ simple_add_char(*s, env);
+ simple_add_char(';', env);
+ }
+ is_link_active = true;
+ do
+ c = *arg++;
+ while (c == ' ' || c == '\t');
+ arg--;
+ // The first argument is the URI.
+ const char *uri = arg;
+ do
+ c = *arg++;
+ while (c != '\0' && c != ' ' && c != '\t');
+ arg--;
+ ptrdiff_t uri_len = arg - uri;
+ // Any remaining arguments are "key=value" pairs.
+ const char *pair = 0;
+ bool done = false;
+ do {
+ if (pair != 0)
+ simple_add_char(':', env);
+ pair = arg;
+ bool in_pair = true;
+ do {
+ c = *arg++;
+ if ('\0' == c)
+ done = true;
+ else if (' ' == c || '\t' == c)
+ in_pair = false;
+ else
+ simple_add_char(c, env);
+ } while (!done && in_pair);
+ } while (!done);
+ simple_add_char(';', env);
+ for (size_t i = uri_len; i > 0; i--)
+ simple_add_char(*uri++, env);
+ }
+ for (const char *s = ST; *s != '\0'; s++)
+ simple_add_char(*s, env);
+}
+
+void tty_printer::change_color(const environment * const env)
+{
+ add_char(0, 0, env->hpos, env->vpos, env->col, env->fill, COLOR_CHANGE);
+}
+
+void tty_printer::change_fill_color(const environment * const env)
+{
+ add_char(0, 0, env->hpos, env->vpos, env->col, env->fill, COLOR_CHANGE);
+}
+
+void tty_printer::draw(int code, int *p, int np, const environment *env)
+{
+ if (!allow_drawing_commands)
+ return;
+ if (code == 'l')
+ draw_line(p, np, env);
+ else if (code == 'p')
+ draw_polygon(p, np, env);
+ else
+ warning("ignoring unsupported drawing command '%1'", char(code));
+}
+
+void tty_printer::draw_polygon(int *p, int np, const environment *env)
+{
+ if (np & 1) {
+ error("even number of arguments required for polygon");
+ return;
+ }
+ if (np == 0) {
+ error("no arguments for polygon");
+ return;
+ }
+ // We only draw polygons which consist entirely of horizontal and
+ // vertical lines.
+ int hpos = 0;
+ int vpos = 0;
+ for (int i = 0; i < np; i += 2) {
+ if (!(p[i] == 0 || p[i + 1] == 0))
+ return;
+ hpos += p[i];
+ vpos += p[i + 1];
+ }
+ if (!(hpos == 0 || vpos == 0))
+ return;
+ int start_hpos = env->hpos;
+ int start_vpos = env->vpos;
+ hpos = start_hpos;
+ vpos = start_vpos;
+ for (int i = 0; i < np; i += 2) {
+ line(hpos, vpos, p[i], p[i + 1], env->col, env->fill);
+ hpos += p[i];
+ vpos += p[i + 1];
+ }
+ line(hpos, vpos, start_hpos - hpos, start_vpos - vpos,
+ env->col, env->fill);
+}
+
+void tty_printer::draw_line(int *p, int np, const environment *env)
+{
+ if (np != 2) {
+ error("2 arguments required for line");
+ return;
+ }
+ line(env->hpos, env->vpos, p[0], p[1], env->col, env->fill);
+}
+
+void tty_printer::line(int hpos, int vpos, int dx, int dy,
+ color *col, color *fill)
+{
+ // XXX: zero-length lines get drawn as '+' crossings in nroff, even
+ // when there is no crossing, but they nevertheless occur frequently
+ // in input. Does tbl produce them?
+#if 0
+ if (0 == dx)
+ fatal("cannot draw zero-length horizontal line");
+ if (0 == dy)
+ fatal("cannot draw zero-length vertical line");
+#endif
+ if ((dx != 0) && (dy != 0))
+ warning("cannot draw diagonal line");
+ if (dx % font::hor != 0)
+ fatal("length of horizontal line %1 is not a multiple of horizontal"
+ " motion quantum %2", dx, font::hor);
+ if (dy % font::vert != 0)
+ fatal("length of vertical line %1 is not a multiple of vertical"
+ " motion quantum %2", dy, font::vert);
+ if (dx == 0) {
+ // vertical line
+ int v = vpos;
+ int len = dy;
+ if (len < 0) {
+ v += len;
+ len = -len;
+ }
+ if (len == 0)
+ add_char(vline_char, font::hor, hpos, v, col, fill,
+ VDRAW_MODE|START_LINE|END_LINE);
+ else {
+ add_char(vline_char, font::hor, hpos, v, col, fill,
+ VDRAW_MODE|START_LINE);
+ len -= font::vert;
+ v += font::vert;
+ while (len > 0) {
+ add_char(vline_char, font::hor, hpos, v, col, fill,
+ VDRAW_MODE|START_LINE|END_LINE);
+ len -= font::vert;
+ v += font::vert;
+ }
+ add_char(vline_char, font::hor, hpos, v, col, fill,
+ VDRAW_MODE|END_LINE);
+ }
+ }
+ if (dy == 0) {
+ // horizontal line
+ int h = hpos;
+ int len = dx;
+ if (len < 0) {
+ h += len;
+ len = -len;
+ }
+ if (len == 0)
+ add_char(hline_char, font::hor, h, vpos, col, fill,
+ HDRAW_MODE|START_LINE|END_LINE);
+ else {
+ add_char(hline_char, font::hor, h, vpos, col, fill,
+ HDRAW_MODE|START_LINE);
+ len -= font::hor;
+ h += font::hor;
+ while (len > 0) {
+ add_char(hline_char, font::hor, h, vpos, col, fill,
+ HDRAW_MODE|START_LINE|END_LINE);
+ len -= font::hor;
+ h += font::hor;
+ }
+ add_char(hline_char, font::hor, h, vpos, col, fill,
+ HDRAW_MODE|END_LINE);
+ }
+ }
+}
+
+void tty_printer::put_char(output_character wc)
+{
+ if (font::is_unicode && wc >= 0x80) {
+ char buf[6 + 1];
+ int count;
+ char *p = buf;
+ if (wc < 0x800)
+ count = 1, *p = (unsigned char)((wc >> 6) | 0xc0);
+ else if (wc < 0x10000)
+ count = 2, *p = (unsigned char)((wc >> 12) | 0xe0);
+ else if (wc < 0x200000)
+ count = 3, *p = (unsigned char)((wc >> 18) | 0xf0);
+ else if (wc < 0x4000000)
+ count = 4, *p = (unsigned char)((wc >> 24) | 0xf8);
+ else if (wc <= 0x7fffffff)
+ count = 5, *p = (unsigned char)((wc >> 30) | 0xfC);
+ else
+ return;
+ do *++p = (unsigned char)(((wc >> (6 * --count)) & 0x3f) | 0x80);
+ while (count > 0);
+ *++p = '\0';
+ putstring(buf);
+ }
+ else
+ putchar(wc);
+}
+
+void tty_printer::put_color(schar color_index, int back)
+{
+ if (color_index == DEFAULT_COLOR_IDX) {
+ putstring(SGR_DEFAULT);
+ // set bold and underline again
+ if (is_boldfacing)
+ putstring(SGR_BOLD);
+ if (is_underlining) {
+ if (do_sgr_italics)
+ putstring(SGR_ITALIC);
+ else if (do_reverse_video)
+ putstring(SGR_REVERSE);
+ else
+ putstring(SGR_UNDERLINE);
+ }
+ // set other color again
+ back = !back;
+ color_index = back ? curr_back_idx : curr_fore_idx;
+ }
+ if (color_index != DEFAULT_COLOR_IDX) {
+ putstring(CSI);
+ if (back)
+ putchar('4');
+ else
+ putchar('3');
+ putchar(color_index + '0');
+ putchar('m');
+ }
+}
+
+// The possible Unicode combinations for crossing characters.
+//
+// ' ' = 0, ' -' = 4, '- ' = 8, '--' = 12,
+//
+// ' ' = 0, ' ' = 1, '|' = 2, '|' = 3
+// | |
+
+static output_character crossings[4*4] = {
+ 0x0000, 0x2577, 0x2575, 0x2502,
+ 0x2576, 0x250C, 0x2514, 0x251C,
+ 0x2574, 0x2510, 0x2518, 0x2524,
+ 0x2500, 0x252C, 0x2534, 0x253C
+};
+
+void tty_printer::end_page(int page_length)
+{
+ if (page_length % font::vert != 0)
+ error("vertical position at end of page not multiple of vertical"
+ " motion quantum");
+ int lines_per_page = page_length / font::vert;
+ int last_line;
+ for (last_line = nlines; last_line > 0; last_line--)
+ if (lines[last_line - 1])
+ break;
+#if 0
+ if (last_line > lines_per_page) {
+ error("characters past last line discarded");
+ do {
+ --last_line;
+ while (lines[last_line]) {
+ tty_glyph *tem = lines[last_line];
+ lines[last_line] = tem->next;
+ delete tem;
+ }
+ } while (last_line > lines_per_page);
+ }
+#endif
+ for (int i = 0; i < last_line; i++) {
+ tty_glyph *p = lines[i];
+ lines[i] = 0;
+ tty_glyph *g = 0;
+ while (p) {
+ tty_glyph *tem = p->next;
+ p->next = g;
+ g = p;
+ p = tem;
+ }
+ int hpos = 0;
+ tty_glyph *nextp;
+ curr_fore_idx = DEFAULT_COLOR_IDX;
+ curr_back_idx = DEFAULT_COLOR_IDX;
+ is_underlining = false;
+ is_boldfacing = false;
+ for (p = g; p; delete p, p = nextp) {
+ nextp = p->next;
+ if (p->mode & CU_MODE) {
+ is_continuously_underlining = (p->code != 0);
+ continue;
+ }
+ if (nextp && p->hpos == nextp->hpos) {
+ if (p->draw_mode() == HDRAW_MODE &&
+ nextp->draw_mode() == VDRAW_MODE) {
+ if (font::is_unicode)
+ nextp->code =
+ crossings[((p->mode & (START_LINE|END_LINE)) >> 4)
+ + ((nextp->mode & (START_LINE|END_LINE)) >> 6)];
+ else
+ nextp->code = '+';
+ continue;
+ }
+ if (p->draw_mode() != 0 && p->draw_mode() == nextp->draw_mode()) {
+ nextp->code = p->code;
+ continue;
+ }
+ if (!want_glyph_composition_by_overstriking)
+ continue;
+ }
+ if (hpos > p->hpos) {
+ do {
+ putchar('\b');
+ hpos--;
+ } while (hpos > p->hpos);
+ }
+ else {
+ if (want_horizontal_tabs) {
+ for (;;) {
+ int next_tab_pos = ((hpos + TAB_WIDTH) / TAB_WIDTH) * TAB_WIDTH;
+ if (next_tab_pos > p->hpos)
+ break;
+ if (is_continuously_underlining)
+ make_underline(p->w);
+ else if (!use_overstriking_drawing_scheme
+ && is_underlining) {
+ if (do_sgr_italics)
+ putstring(SGR_NO_ITALIC);
+ else if (do_reverse_video)
+ putstring(SGR_NO_REVERSE);
+ else
+ putstring(SGR_NO_UNDERLINE);
+ is_underlining = false;
+ }
+ putchar('\t');
+ hpos = next_tab_pos;
+ }
+ }
+ for (; hpos < p->hpos; hpos++) {
+ if (is_continuously_underlining)
+ make_underline(p->w);
+ else if (!use_overstriking_drawing_scheme && is_underlining) {
+ if (do_sgr_italics)
+ putstring(SGR_NO_ITALIC);
+ else if (do_reverse_video)
+ putstring(SGR_NO_REVERSE);
+ else
+ putstring(SGR_NO_UNDERLINE);
+ is_underlining = false;
+ }
+ putchar(' ');
+ }
+ }
+ assert(hpos == p->hpos);
+ if (p->mode & COLOR_CHANGE) {
+ if (!use_overstriking_drawing_scheme) {
+ if (p->fore_color_idx != curr_fore_idx) {
+ put_color(p->fore_color_idx, 0);
+ curr_fore_idx = p->fore_color_idx;
+ }
+ if (p->back_color_idx != curr_back_idx) {
+ put_color(p->back_color_idx, 1);
+ curr_back_idx = p->back_color_idx;
+ }
+ }
+ continue;
+ }
+ if (p->mode & UNDERLINE_MODE)
+ make_underline(p->w);
+ else if (!use_overstriking_drawing_scheme && is_underlining) {
+ if (do_sgr_italics)
+ putstring(SGR_NO_ITALIC);
+ else if (do_reverse_video)
+ putstring(SGR_NO_REVERSE);
+ else
+ putstring(SGR_NO_UNDERLINE);
+ is_underlining = false;
+ }
+ if (p->mode & BOLD_MODE)
+ make_bold(p->code, p->w);
+ else if (!use_overstriking_drawing_scheme && is_boldfacing) {
+ putstring(SGR_NO_BOLD);
+ is_boldfacing = false;
+ }
+ if (!use_overstriking_drawing_scheme) {
+ if (p->fore_color_idx != curr_fore_idx) {
+ put_color(p->fore_color_idx, 0);
+ curr_fore_idx = p->fore_color_idx;
+ }
+ if (p->back_color_idx != curr_back_idx) {
+ put_color(p->back_color_idx, 1);
+ curr_back_idx = p->back_color_idx;
+ }
+ }
+ put_char(p->code);
+ hpos += p->w / font::hor;
+ }
+ if (!use_overstriking_drawing_scheme
+ && (is_boldfacing || is_underlining
+ || curr_fore_idx != DEFAULT_COLOR_IDX
+ || curr_back_idx != DEFAULT_COLOR_IDX))
+ putstring(SGR_DEFAULT);
+ putchar('\n');
+ }
+ if (want_form_feeds) {
+ if (last_line < lines_per_page)
+ putchar('\f');
+ }
+ else {
+ for (; last_line < lines_per_page; last_line++)
+ putchar('\n');
+ }
+}
+
+font *tty_printer::make_font(const char *nm)
+{
+ return tty_font::load_tty_font(nm);
+}
+
+printer *make_printer()
+{
+ return new tty_printer();
+}
+
+static void update_options()
+{
+ if (use_overstriking_drawing_scheme) {
+ do_sgr_italics = false;
+ do_reverse_video = false;
+ bold_underline_mode = bold_underline_mode_option;
+ do_bold = want_emboldening_by_overstriking;
+ do_underline = want_italics_by_underlining;
+ }
+ else {
+ do_sgr_italics = want_sgr_italics;
+ do_reverse_video = want_reverse_video_for_italics;
+ bold_underline_mode = BOLD_MODE|UNDERLINE_MODE;
+ do_bold = true;
+ do_underline = true;
+ }
+}
+
+int main(int argc, char **argv)
+{
+ program_name = argv[0];
+ static char stderr_buf[BUFSIZ];
+ if (getenv("GROFF_NO_SGR"))
+ use_overstriking_drawing_scheme = true;
+ setbuf(stderr, stderr_buf);
+ setlocale(LC_CTYPE, "");
+ int c;
+ static const struct option long_options[] = {
+ { "help", no_argument, 0, CHAR_MAX + 1 },
+ { "version", no_argument, 0, 'v' },
+ { NULL, 0, 0, 0 }
+ };
+ while ((c = getopt_long(argc, argv, "bBcdfF:hiI:oruUv", long_options, NULL))
+ != EOF)
+ switch(c) {
+ case 'v':
+ printf("GNU grotty (groff) version %s\n", Version_string);
+ exit(EXIT_SUCCESS);
+ break;
+ case 'i':
+ // Use italic font instead of underlining.
+ want_sgr_italics = true;
+ break;
+ case 'I':
+ // ignore include search path
+ break;
+ case 'b':
+ // Do not embolden by overstriking.
+ want_emboldening_by_overstriking = false;
+ break;
+ case 'c':
+ // Use old scheme for emboldening and underline.
+ use_overstriking_drawing_scheme = true;
+ break;
+ case 'u':
+ // Do not underline.
+ want_italics_by_underlining = false;
+ break;
+ case 'o':
+ // Do not overstrike (other than emboldening and underlining).
+ want_glyph_composition_by_overstriking = false;
+ break;
+ case 'r':
+ // Use reverse mode instead of underlining.
+ want_reverse_video_for_italics = true;
+ break;
+ case 'B':
+ // Do bold-underlining as bold.
+ bold_underline_mode_option = BOLD_MODE;
+ break;
+ case 'U':
+ // Do bold-underlining as underlining.
+ bold_underline_mode_option = UNDERLINE_MODE;
+ break;
+ case 'h':
+ // Use horizontal tabs.
+ want_horizontal_tabs = true;
+ break;
+ case 'f':
+ want_form_feeds = true;
+ break;
+ case 'F':
+ font::command_line_font_dir(optarg);
+ break;
+ case 'd':
+ // Ignore \D commands.
+ allow_drawing_commands = false;
+ break;
+ case CHAR_MAX + 1: // --help
+ usage(stdout);
+ break;
+ case '?':
+ usage(stderr);
+ exit(EXIT_FAILURE);
+ break;
+ default:
+ assert(0 == "unhandled getopt_long return value");
+ }
+ update_options();
+ if (optind >= argc)
+ do_file("-");
+ else {
+ for (int i = optind; i < argc; i++)
+ do_file(argv[i]);
+ }
+ return 0;
+}
+
+static void usage(FILE *stream)
+{
+ fprintf(stream,
+"usage: %s [-bBcdfhioruU] [-F font-directory] [file ...]\n"
+"usage: %s {-v | --version}\n"
+"usage: %s --help\n",
+ program_name, program_name, program_name);
+ if (stdout == stream) {
+ fputs(
+"\n"
+"Translate the output of troff(1) into a form suitable for\n"
+"typewriterâ€like devices, including terminal emulators. See the\n"
+"grotty(1) manual page.\n",
+ stream);
+ exit(EXIT_SUCCESS);
+ }
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/devices/xditview/ChangeLog b/src/devices/xditview/ChangeLog
new file mode 100644
index 0000000..a33297b
--- /dev/null
+++ b/src/devices/xditview/ChangeLog
@@ -0,0 +1,556 @@
+2004-05-29 Werner LEMBERG <wl@gnu.org>
+
+ gxditview and xtotroff have been integrated into the normal groff
+ directory structure; future changes are logged in the main
+ ChangeLog file.
+
+2004-05-13 Werner LEMBERG <wl@gnu.org>
+
+Version 1.19.1 released
+=======================
+
+2004-04-17 Werner LEMBERG <wl@gnu.org>
+
+ * device.c (scale_round): Round correctly for negative values
+ (this is the same function as in src/libs/libgroff/font.c).
+ Found by Paul Eggert.
+
+2003-11-10 Werner LEMBERG <wl@gnu.org>
+
+ * Imakefile.in: s/@top_srcdir@/@abs_top_srcdir@/,
+ s/@groff_top_builddir@/@abs_top_builddir@/.
+
+Version 1.19 released
+=====================
+
+2003-03-03 Werner LEMBERG <wl@gnu.org>
+
+ * Imakefile.in (extraclean): Added gxditview._man.
+
+2003-01-28 Werner LEMBERG <wl@gnu.org>
+
+ * Imakefile.in (SEP): New variable; set to @PATH_SEPARATOR@.
+ (GROFF_FONTPATH): Use it.
+
+2003-01-07 Werner LEMBERG <wl@gnu.org>
+
+ * DviChar.c (Adobe_Symbol_map): Add `sqrt'.
+
+2003-01-06 Werner LEMBERG <wl@gnu.org>
+
+ * DviChar.c (Adobe_Symbol_map): Add `integral'.
+
+2002-12-29 Werner LEMBERG <wl@gnu.org>
+
+ * DviChar.c (ISO_8859_1_map): Remove `ap' and `eq'.
+
+2002-12-20 Werner LEMBERG <wl@gnu.org>
+
+ * DviChar.c (Adobe_Symbol_map): Don't include `or'.
+ * draw.c (AdjustCharDeltas): Apply correction only if nadj > 1.
+ (DoCharacter): Call FlushCharCache if font size and font number
+ differ.
+ Reset `dw->dvi.cache.adjustable' properly.
+
+2002-12-09 Werner LEMBERG <wl@gnu.org>
+
+ * DviChar.c (ISO_8859_1_map): Use `tno' symbol instead of `no'.
+
+2002-12-01 Werner LEMBERG <wl@gnu.org>
+
+ * Imakefile.in: Use `InstallAppDefaultsLong' instead of
+ `InstallAppDefaults' to make it work if build directory isn't
+ $srcdir.
+
+2002-11-24 Werner LEMBERG <wl@gnu.org>
+
+ * DviChar.c (Adobe_Symbol_map): Add glyph `braceex'.
+
+2002-11-14 Werner LEMBERG <wl@gnu.org>
+
+ * DviChar.c (ISO_8859_1_map): Don't include `or'.
+
+Version 1.18.1 released
+=======================
+
+2002-09-16 Werner LEMBERG <wl@gnu.org>
+
+ * Imakefile.in (GROFF_LOCALFONTDIR): New variable.
+ (GROFF_FONTPATH): Use it.
+ Remove /usr/local/lib/font.
+
+Version 1.18.0 released
+=======================
+
+2002-06-22 Werner LEMBERG <wl@gnu.org>
+
+ * gxditview.c (main): Handle `-help' and `--help' correctly.
+
+2002-06-17 Colin Watson <cjwatson@debian.org>
+
+ * Imakefile.in: s/@top_builddir@/@groff_top_builddir@/.
+
+2002-04-06 Werner LEMBERG <wl@gnu.org>
+
+ * DviChar.c (ISO_8859_1_map, Adobe_Symbol_map): Remove all
+ characters > 0x80.
+ * parse.c (ParseInput): Ignore `m' command.
+ (ParseDrawFunction): Don't move for unknown drawing functions.
+ Don't move for `f' drawing function.
+
+2002-03-25 Werner LEMBERG <wl@gnu.org>
+
+ * DviChar.c (ISO_8859_1_map): Use `t+-', `tmu', and `tdi' symbols
+ instead of `+-', `mu', and `di', respectively.
+
+2002-02-23 Werner LEMBERG <wl@gnu.org>
+
+ * DviChar.c (ISO_8859_1_map): Add `mc' symbol.
+
+2001-09-22 Werner LEMBERG <wl@gnu.org>
+
+ * Imakefile.in: Redefine `ProgramTargetHelper' as
+ `ProgramTargetHelperNoMan' and add a call to `InstallManPageLong'
+ to make the `install.man' target work if the build directory isn't
+ $srcdir.
+
+Version 1.17.2 released
+=======================
+
+Version 1.17.1 released
+=======================
+
+2001-04-21 Albert Chin-A-Young <china@thewrittenword.com>
+
+ * Imakefile.in: Add support for recent HP architectures.
+
+Version 1.17 released
+=====================
+
+2001-01-04 Rob Daasch <daasch@ece.pdx.edu>
+
+ * parse.c (ParseInput): Added 'F' to command switch to swallow
+ filename strings as ignored comments.
+
+2000-12-02 Werner LEMBERG <wl@gnu.org>
+
+ * device.c (find_file): Remove home directory in search path.
+
+2000-11-14 Werner LEMBERG <wl@gnu.org>
+
+ * device.c (open_device_file): Remove `path' parameter.
+ (find_file): Construct font path similar to groff: First the contents
+ of GROFF_FONT_PATH, then the home directory, and finally the default
+ font path.
+ * Imakefile.in: Fix GROFF_DATAPROGRAMDIR and GROFF_FONTPATH.
+
+2000-10-23 Werner LEMBERG <wl@gnu.org>
+
+ Change installation structure for data files from .../groff/... to
+ .../groff/<version><revision>/... to be conform with other GNU
+ programs.
+
+ * Imakefile.in: Implement it.
+
+Version 1.16.1 released
+=======================
+
+Version 1.16 released
+=====================
+
+2000-05-18 Werner LEMBERG <wl@gnu.org>
+
+ * DviChar.c: Adding `cq' as an alias for "'" in latin-1 map.
+
+2000-05-03 Werner LEMBERG <wl@gnu.org>
+
+ * DviChar.c: Adding `dq' as an alias for `"' in latin-1 map.
+
+2000-04-28 Werner LEMBERG <wl@gnu.org>
+
+ * DviChar.c: Replacing `md' glyph name with `pc' in latin-1 map to
+ make it distinct from the `md' glyph in the symbol font.
+
+2000-03-03 Werner LEMBERG <wl@gnu.org>
+
+ * Imakefile replaced with Imakefile.in which will be configured by
+ the main configure script of groff. This will set the correct font
+ path, and it will make it possible to build xditview in a directory
+ different from $srcdir.
+
+2000-03-01 Colin Phipps <crp22@cam.ac.uk>
+
+ * Dvi.c (OpenFile): Use tmpdir() for security reasons.
+ * xtotroff.c (MapFont): Avoid race while opening file.
+
+2000-02-06 Werner LEMBERG <wl@gnu.org>
+
+ * Imakefile: Adapted to new directory structure.
+
+ * README: Updated.
+
+Version 1.15 released
+=====================
+
+1999-12-21 Werner LEMBERG <wl@gnu.org>
+
+ * README: Fixed ftp GNU address.
+
+1999-12-13 Werner LEMBERG <wl@gnu.org>
+
+ * device.c: Use extern declarations of strtok(), strchr(), and
+ getenv() only if not defined as macros.
+
+1999-11-18 Larry Jones <larry.jones@sdrc.com>
+
+ * xditview.c: Add fallback_resources to allow running without
+ access to the app-defaults file.
+
+ * Imakefile: Added rule to create app-defaults to a C header file.
+
+ * GXditview-ad.h: New file containing fallback default resources.
+
+ * ad2c: New file to do the app-defaults -> C header file
+ conversion.
+
+1999-10-27 Larry Jones <larry.jones@sdrc.com>
+
+ * font.c (DisposeFontSizes): If there's a problem loading a font,
+ xditview will fall-back and use the default font, but it hasn't
+ checked before unloading fonts which could result in unloading the
+ default font (possibly multiple times) and then X errors.
+
+1999-09-13 Werner LEMBERG <wl@gnu.org>
+
+ * Imakefile (extraclean): Added Makefile.
+
+ * xditview.c (main, MakePrompt): Fixing compilation warnings.
+
+ * TODO: Imakefile should be replaced with a configure script.
+
+1999-09-13 Werner LEMBERG <wl@gnu.org>
+
+ * Makefile: Removed.
+
+1999-09-12 Werner LEMBERG <wl@gnu.org>
+
+ * Imakefile (GROFF_FONTPATH): Another addition.
+
+ * device.c (FONTPATH): Update to match current groff version.
+
+1999-09-11 Larry Jones <larry.jones@sdrc.com>
+
+ * Imakefile (GROFF_LIBDIR, GROFF_FONTPATH): Update to match
+ current groff version.
+
+ * Dvi.c (Realize, Destroy), DviP.h, draw.c (setFillGC), gray*.bm:
+ Allow 8 levels of gray rather than just 1.
+
+ * draw.c (DrawFilledCircle, DrawFilledEllipse, DrawFilledPolygon):
+ Draw outlines to prevent gaps between abutting figures.
+
+1999-05-27 Werner LEMBERG <wl@gnu.org>
+
+ * xtotroff.c (usage): Fixed typo.
+
+Mon Sep 11 10:40:33 1995 James Clark <jjc@jclark.com>
+
+ * device.c (INT_MIN, INT_MAX): Don't define if already defined.
+
+Mon Aug 8 11:14:11 1994 James Clark (jjc@jclark.com)
+
+ * DviChar.c (Adobe_Symbol_map): Use \(nb for notsubset.
+
+Tue Apr 19 04:41:16 1994 James Clark (jjc@jclark.com)
+
+ * Dvi.c (resources): Change default for background and foreground
+ to "XtDefaultBackground" and "XtDefaultForeground".
+
+Sat Feb 12 10:38:47 1994 James Clark (jjc@jclark.com)
+
+ * DviChar.c (Adobe_Symbol_map): Rename radicalex to rn.
+
+Thu May 27 20:30:12 1993 James Clark (jjc@jclark.com)
+
+ * device.c (isascii): Define if necessary.
+ (canonicalize_name): Cast argument to isdigit() to unsigned char.
+
+Thu Apr 29 18:36:57 1993 James Clark (jjc at jclark.com)
+
+ * xditview.c: Include <X11/Xos.h>.
+ (NewFile): Don't declare rindex(). Use strrchr() rather than
+ rindex().
+
+Tue Mar 30 15:12:09 1993 James Clark (jjc at jclark)
+
+ * draw.c (charExists): Check that fi->per_char is not NULL.
+
+Sat Dec 12 17:42:40 1992 James Clark (jjc at jclark)
+
+ * Dvi.c (SetGeometry): Cast XtMakeGeometryRequest arguments.
+
+ * draw.c (DrawPolygon, DrawFilledPolygon): Cast Xtfree argument.
+
+ * font.c (DisposeFontSizes): Add declaration.
+
+ * draw.c (FakeCharacter): Add declaration.
+
+Wed Oct 28 13:24:00 1992 James Clark (jjc at jclark)
+
+ * Imakefile (install.dev): Deleted.
+ (fonts): New target.
+
+Mon Oct 12 10:50:44 1992 James Clark (jjc at jclark)
+
+ * Imakefile (install.dev): Say when we're installing devX*-12.
+
+ * Imakefile (install.dev): Depends on DESC and FontMap.
+
+Thu Oct 1 20:03:45 1992 James Clark (jjc at jclark)
+
+ * xditview.c (Syntax): Mention -filename option.
+
+Sat Aug 15 12:56:39 1992 James Clark (jjc at jclark)
+
+ * GXditview.ad: Bind space and return to NextPage. Bind backspace
+ and delete to previous page.
+
+ * DviChar.c (Adobe_Symbol_map): Add `an'.
+
+ * DviChar.c (Adobe_Symbol_map): Add arrowvertex, arrowverttp, and
+ arrowvertbt.
+
+Mon Aug 10 11:54:27 1992 James Clark (jjc at jclark)
+
+ * FontMap: Add m/p fields to the fonts names.
+
+Sat Aug 8 12:00:28 1992 James Clark (jjc at jclark)
+
+ * DESC: Leave font positions 5-9 blank.
+
+Tue Jul 28 11:37:05 1992 James Clark (jjc at jclark)
+
+ * Imakefile: Don't use gendef. Pass definition of FONTPATH using
+ DEFINES.
+ (path.h): Deleted.
+ (device.c): Don't include path.h. Provide default definition of
+ FONTPATH.
+
+Mon Jul 6 14:06:53 1992 James Clark (jjc at jclark)
+
+ * Imakefile: Don't install tmac.X and tmac.Xps.
+ * tmac.X, tmac.Xps: Moved to ../macros.
+
+ * Imakefile: Don't install eqnchar.
+ * eqnchar: Deleted.
+
+Sun Jun 14 12:55:02 1992 James Clark (jjc@jclark)
+
+ * tmac.Xps: Handle OE, oe, lq, rq.
+ * draw.c (FakeCharacter): Don't handle these.
+
+ * draw.c (FakeCharacter): Don't handle f/.
+
+Mon Jun 8 11:46:37 1992 James Clark (jjc@jclark)
+
+ * tmac.X: Translate char160 to space.
+
+Sun Jun 7 14:39:53 1992 James Clark (jjc@jclark)
+
+ * tmac.X: Do `mso tmac.psic' before restoring compatibility mode.
+
+ * tmac.X: Add \(OE, \(oe, \(ah, \(ao, \(ho.
+
+ * tmac.Xps: Make it work in compatibility mode.
+ Redo existing character definitions with .Xps-char.
+ Add more character definitions.
+ (Xps-char): New macro.
+
+Sat Jun 6 21:46:03 1992 James Clark (jjc@jclark)
+
+ * DviChar.c (Adobe_Symbol_map): Add +h, +f, +p, Fn, lz.
+ * tmac.X: Add \(bq, \(Bq, \(aq.
+ * tmac.Xps: Handle \(aq, \(bq, \(Bq, \(Fn.
+
+Wed Jun 3 11:11:15 1992 James Clark (jjc@jclark)
+
+ * DviChar.c (Adobe_Symbol_map): Add wp.
+
+Tue Apr 21 09:21:59 1992 James Clark (jjc at jclark)
+
+ * GXditview.ad: Bind n, p, q keys to NextPage, PreviousPage and
+ Quit actions.
+
+ * xditview.c (RerasterizeAction): New function.
+ (xditview_actions): Add RerasterizeAction.
+ * GXditview.ad: Bind r key to Rerasterize action.
+
+Fri Apr 17 08:25:36 1992 James Clark (jjc at jclark)
+
+ * xditview.c: Add -filename option.
+ (main): Copy any -filename argument into current_file_name.
+
+Mon Mar 16 10:21:58 1992 James Clark (jjc at jclark)
+
+ * tmac.X: Load tmac.pspic.
+
+Sun Mar 8 11:27:19 1992 James Clark (jjc at jclark)
+
+ * Lex.c (GetLine, GetWord, GetNumber): Rewrite.
+
+Sat Oct 12 22:58:52 1991 James Clark (jjc at jclark)
+
+ * Dvi.c (SetDevice): If the size change request is refused but a
+ larger geometry is offered, request that.
+
+Wed Oct 9 12:27:48 1991 James Clark (jjc at jclark)
+
+ * font.c (InstallFontSizes): Ignore FontNameAverageWidth component.
+
+ * Dvi.c (default_font_map): Add `adobe' to font names to avoid
+ ambiguity.
+
+ * FontMap: New file.
+ * FontMap.X100, FontMap.X75: Deleted.
+ * xtotroff.c (main, usage): Add -s and -r options.
+ (MapFont): Change the font pattern to have the selected resolution and
+ size.
+ * Imakefile (install.dev): Use FontMap and supply appropriate -s
+ and -r options.
+
+ * xtotroff.c (MapFont): Check for ambiguity by comparing canonicalized
+ font names.
+
+ * DviP.h (DviFontList): Add initialized and scalable members.
+ (font.c): Add support for scalable fonts based on R5 xditview.
+
+ * DviChar.c: Use xmalloc rather than malloc.
+ * xditview.c (xmalloc): New function.
+ * xtotroff.c (xmalloc): New function.
+ * other files: Use XtMalloc and XtFree instead of malloc and free.
+
+Thu Aug 29 20:15:31 1991 James Clark (jjc at jclark)
+
+ * draw.c (setGC): Do multiplication in floating point to avoid
+ overflow.
+
+Tue Aug 13 12:04:41 1991 James Clark (jjc at jclark)
+
+ * draw.c (FakeCharacter): Remove casts in definition of pack2.
+
+Tue Jul 30 11:42:39 1991 James Clark (jjc at jclark)
+
+ * tmac.Xps: New file.
+ * Imakefile (install): Install tmac.Xps.
+
+Tue Jul 2 09:31:37 1991 James Clark (jjc at jclark)
+
+ * xtotroff.c (main): Pass argv[0] to usage().
+
+Sun Jun 30 12:34:06 1991 James Clark (jjc at jclark)
+
+ * xtotroff.c (MapFont): Handle the case where XLoadQueryFont
+ returns NULL.
+
+Sat Jun 29 12:32:52 1991 James Clark (jjc at jclark)
+
+ * Imakefile: Use ../gendef to generate path.h.
+
+Sun Jun 16 13:26:34 1991 James Clark (jjc at jclark)
+
+ * Imakefile (depend.o): Change to device.o.
+
+Sun Jun 2 12:17:56 1991 James Clark (jjc at jclark)
+
+ * Imakefile: Remove spaces from the beginning of variable
+ assignment lines.
+
+Sun May 26 14:14:01 1991 James Clark (jjc at jclark)
+
+ * xditview.c (Syntax): Update.
+
+ * Dvi.c (DviSaveToFile, SaveToFile): New functions.
+ (FindPage): Check that we're not readingTmp before checking for
+ end of file of normal input file.
+ (ClassPartInitialize): New function.
+ * Dvi.h: Add declaration of DviSaveToFile.
+ * DviP.h: Add save method to DviClassPart. Declare
+ InheritSaveToFile.
+ * xditview.c (DoPrint, Print, PrintAction): New functions.
+ * xditview.c: Add print menu entry.
+ * xditview.c: Provide printCommand application resource.
+ * lex.c: Don't output EOF to temporary file.
+
+ * Dvi.c (QueryGeometry): Check request->request_mode.
+
+ * Dvi.c (SetDevice): New function.
+ (SetDeviceResolution): Deleted.
+
+ * Dvi.c: Add resolution resource.
+ * DviP.h: Add definitions of XtNResolution and XtCResolution.
+ * xditview.c: Add -resolution argument.
+ * GXditview.ad: Add default for GXditview.height.
+ * Dvi.c (Initialize, SetDevice): Use default_resolution.
+
+ * Dvi.c: Make MY_HEIGHT and MY_WIDTH use the paperlength and
+ paperwidth commands in the DESC file.
+
+ * Dvi.c: Add SS font to default font map.
+
+ * draw.c: Rewritten so as not to assume device and display
+ resolution is the same.
+ * DviP.h: Include device.h. Add device_font member to DviFontList.
+ Add adjustable array to DviCharCache. Add text_x_width,
+ text_device_width, word_flag, device_font, device_font_number,
+ device, native, device_resolution, display_resolution,
+ paperlength, paperwidth, scale_factor, sizescale members.
+ * Dvi.c (Initialize): Initialize new variable used by draw.c.
+ (Destroy): Call device_destroy.
+ * font.c (MaxFontPosition): New function.
+ (LookupFontSizeBySize): Handle sizescale.
+ (InstallFont): Load the device font.
+ (ForgetFonts): New function.
+ (QueryDeviceFont): New function.
+ * parse.c (ParseInput): Handle t and u commands. Split off
+ character output into draw.c.
+ (ParseDeviceControl): Ignore res command. Use the device argument
+ to the T command.
+
+ * font.c (MapXNameToDviName): Ifdefed out.
+
+ * path.h: New file.
+ * device.c, device.h: New files.
+
+ * DviChar.c: Add entries for lB, rB, oq, lC, rC, md.
+
+ * INSTALL: New file.
+
+ * libxdvi: Merged into main directory.
+ * xtotroff.c, xditview.c: Change includes accordingly.
+
+ * devX75, devX100: Merged into main directory.
+ * xditview.man: Renamed to gxditview.man.
+
+ * Xditview.ad: Renamed to GXditview.ad.
+ * xditview.c (main): Use class of GXditview rather than xditview.
+
+ * Imakefile: New file.
+ * Makefile: Deleted.
+
+ * xtotroff.c (MapFont): Unlink output file before opening it.
+
+ * Started separate ChangeLog.
+
+________________________________________________________________________
+
+Copyright 1991-2020 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+Local Variables:
+version-control: never
+mode: change-log
+coding: latin-1
+End:
diff --git a/src/devices/xditview/DESC.in b/src/devices/xditview/DESC.in
new file mode 100644
index 0000000..172170c
--- /dev/null
+++ b/src/devices/xditview/DESC.in
@@ -0,0 +1,9 @@
+styles R I B BI
+fonts 6 0 0 0 0 0 S
+sizes 8 10 12 14 18 24 0
+res 75
+X11
+hor 1
+vert 1
+unitwidth 10
+postpro gxditview
diff --git a/src/devices/xditview/Dvi.c b/src/devices/xditview/Dvi.c
new file mode 100644
index 0000000..3520676
--- /dev/null
+++ b/src/devices/xditview/Dvi.c
@@ -0,0 +1,603 @@
+#include <config.h>
+
+#ifndef SABER
+#ifndef lint
+static char Xrcsid[] = "$XConsortium: Dvi.c,v 1.9 89/12/10 16:12:25 rws Exp $";
+#endif /* lint */
+#endif /* SABER */
+
+/*
+ * Dvi.c - Dvi display widget
+ *
+ */
+
+#define XtStrlen(s) ((s) ? strlen(s) : 0)
+
+ /* The following are defined for the reader's convenience. Any
+ Xt..Field macro in this code just refers to some field in
+ one of the substructures of the WidgetRec. */
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/Xmu/Converters.h>
+#include <stdio.h>
+#include <ctype.h>
+
+#include "DviP.h"
+#include "font.h"
+#include "page.h"
+#include "parse.h"
+
+/****************************************************************
+ *
+ * Full class record constant
+ *
+ ****************************************************************/
+
+/* Private Data */
+
+static char default_font_map_1[] = "\
+TR -adobe-times-medium-r-normal--*-100-*-*-*-*-iso8859-1\n\
+TI -adobe-times-medium-i-normal--*-100-*-*-*-*-iso8859-1\n\
+TB -adobe-times-bold-r-normal--*-100-*-*-*-*-iso8859-1\n\
+TBI -adobe-times-bold-i-normal--*-100-*-*-*-*-iso8859-1\n\
+CR -adobe-courier-medium-r-normal--*-100-*-*-*-*-iso8859-1\n\
+CI -adobe-courier-medium-o-normal--*-100-*-*-*-*-iso8859-1\n\
+CB -adobe-courier-bold-r-normal--*-100-*-*-*-*-iso8859-1\n\
+CBI -adobe-courier-bold-o-normal--*-100-*-*-*-*-iso8859-1\n\
+";
+static char default_font_map_2[] = "\
+HR -adobe-helvetica-medium-r-normal--*-100-*-*-*-*-iso8859-1\n\
+HI -adobe-helvetica-medium-o-normal--*-100-*-*-*-*-iso8859-1\n\
+HB -adobe-helvetica-bold-r-normal--*-100-*-*-*-*-iso8859-1\n\
+HBI -adobe-helvetica-bold-o-normal--*-100-*-*-*-*-iso8859-1\n\
+";
+static char default_font_map_3[] = "\
+NR -adobe-new century schoolbook-medium-r-normal--*-100-*-*-*-*-iso8859-1\n\
+NI -adobe-new century schoolbook-medium-i-normal--*-100-*-*-*-*-iso8859-1\n\
+NB -adobe-new century schoolbook-bold-r-normal--*-100-*-*-*-*-iso8859-1\n\
+NBI -adobe-new century schoolbook-bold-i-normal--*-100-*-*-*-*-iso8859-1\n\
+S -adobe-symbol-medium-r-normal--*-100-*-*-*-*-adobe-fontspecific\n\
+SS -adobe-symbol-medium-r-normal--*-100-*-*-*-*-adobe-fontspecific\n\
+";
+
+#define offset(field) XtOffset(DviWidget, field)
+
+#define MY_WIDTH(dw) ((int)(dw->dvi.paperwidth * dw->dvi.scale_factor + .5))
+#define MY_HEIGHT(dw) ((int)(dw->dvi.paperlength * dw->dvi.scale_factor + .5))
+
+static XtResource resources[] = {
+ {(String)XtNfontMap, (String)XtCFontMap, (String)XtRString,
+ sizeof (char *), offset(dvi.font_map_string),
+ (String)XtRString, NULL /* set in code */},
+ {(String)XtNforeground, (String)XtCForeground, (String)XtRPixel,
+ sizeof (unsigned long), offset(dvi.foreground),
+ (String)XtRString, (XtPointer)"XtDefaultForeground"},
+ {(String)XtNbackground, (String)XtCBackground, (String)XtRPixel,
+ sizeof (unsigned long), offset(dvi.background),
+ (String)XtRString, (XtPointer)"XtDefaultBackground"},
+ {(String)XtNpageNumber, (String)XtCPageNumber, (String)XtRInt,
+ sizeof (int), offset(dvi.requested_page),
+ (String)XtRString, (XtPointer)"1"},
+ {(String)XtNlastPageNumber, (String)XtCLastPageNumber, (String)XtRInt,
+ sizeof (int), offset (dvi.last_page),
+ (String)XtRString, (XtPointer)"0"},
+ {(String)XtNfile, (String)XtCFile, (String)XtRFile,
+ sizeof (FILE *), offset (dvi.file),
+ (String)XtRFile, (XtPointer)0},
+ {(String)XtNseek, (String)XtCSeek, (String)XtRBoolean,
+ sizeof (Boolean), offset(dvi.seek),
+ (String)XtRString, (XtPointer)"false"},
+ {(String)XtNfont, (String)XtCFont, (String)XtRFontStruct,
+ sizeof (XFontStruct *), offset(dvi.default_font),
+ (String)XtRString, (XtPointer)"xtdefaultfont"},
+ {(String)XtNbackingStore, (String)XtCBackingStore, (String)XtRBackingStore,
+ sizeof (int), offset(dvi.backing_store),
+ (String)XtRString, (XtPointer)"default"},
+ {(String)XtNnoPolyText, (String)XtCNoPolyText, (String)XtRBoolean,
+ sizeof (Boolean), offset(dvi.noPolyText),
+ (String)XtRString, (XtPointer)"false"},
+ {(String)XtNresolution, (String)XtCResolution, (String)XtRInt,
+ sizeof(int), offset(dvi.default_resolution),
+ (String)XtRString, (XtPointer)"75"},
+};
+
+#undef offset
+
+static void ClassInitialize (void);
+static void ClassPartInitialize(WidgetClass);
+static void Initialize(Widget, Widget, ArgList, Cardinal *);
+static void Realize (Widget, XtValueMask *, XSetWindowAttributes *);
+static void Destroy (Widget);
+static void Redisplay (Widget, XEvent *, Region);
+static Boolean SetValues (Widget, Widget, Widget,
+ ArgList, Cardinal *);
+static Boolean SetValuesHook (Widget, ArgList, Cardinal *);
+static XtGeometryResult QueryGeometry (Widget, XtWidgetGeometry *,
+ XtWidgetGeometry *);
+static void ShowDvi (DviWidget);
+static void CloseFile (DviWidget);
+static void OpenFile (DviWidget);
+static void FindPage (DviWidget);
+
+static void SaveToFile (Widget, FILE *);
+
+DviClassRec dviClassRec = {
+{
+ &widgetClassRec, /* superclass */
+ (String)"Dvi", /* class_name */
+ sizeof(DviRec), /* size */
+ ClassInitialize, /* class_initialize */
+ ClassPartInitialize, /* class_part_initialize */
+ FALSE, /* class_inited */
+ Initialize, /* initialize */
+ NULL, /* initialize_hook */
+ Realize, /* realize */
+ NULL, /* actions */
+ 0, /* num_actions */
+ resources, /* resources */
+ XtNumber(resources), /* resource_count */
+ NULLQUARK, /* xrm_class */
+ FALSE, /* compress_motion */
+ TRUE, /* compress_exposure */
+ TRUE, /* compress_enterleave */
+ FALSE, /* visible_interest */
+ Destroy, /* destroy */
+ NULL, /* resize */
+ Redisplay, /* expose */
+ SetValues, /* set_values */
+ SetValuesHook, /* set_values_hook */
+ NULL, /* set_values_almost */
+ NULL, /* get_values_hook */
+ NULL, /* accept_focus */
+ XtVersion, /* version */
+ NULL, /* callback_private */
+ 0, /* tm_table */
+ QueryGeometry, /* query_geometry */
+ NULL, /* display_accelerator */
+ NULL /* extension */
+},{
+ SaveToFile, /* save */
+},
+};
+
+WidgetClass dviWidgetClass = (WidgetClass) &dviClassRec;
+
+static void ClassInitialize (void)
+{
+ int len1 = strlen(default_font_map_1);
+ int len2 = strlen(default_font_map_2);
+ int len3 = strlen(default_font_map_3);
+ char *dfm = XtMalloc(len1 + len2 + len3 + 1);
+ char *ptr = dfm;
+ strcpy(ptr, default_font_map_1); ptr += len1;
+ strcpy(ptr, default_font_map_2); ptr += len2;
+ strcpy(ptr, default_font_map_3);
+ resources[0].default_addr = dfm;
+
+ XtAddConverter( XtRString, XtRBackingStore, XmuCvtStringToBackingStore,
+ NULL, 0 );
+}
+
+/****************************************************************
+ *
+ * Private Procedures
+ *
+ ****************************************************************/
+
+/* ARGSUSED */
+static void Initialize(Widget request, Widget new_wd,
+ ArgList args, Cardinal *num_args)
+{
+ DviWidget dw = (DviWidget) new_wd;
+
+ dw->dvi.current_page = 0;
+ dw->dvi.font_map = 0;
+ dw->dvi.cache.index = 0;
+ dw->dvi.text_x_width = 0;
+ dw->dvi.text_device_width = 0;
+ dw->dvi.word_flag = 0;
+ dw->dvi.file = 0;
+ dw->dvi.tmpFile = 0;
+ dw->dvi.state = 0;
+ dw->dvi.readingTmp = 0;
+ dw->dvi.cache.char_index = 0;
+ dw->dvi.cache.font_size = -1;
+ dw->dvi.cache.font_number = -1;
+ dw->dvi.cache.adjustable[0] = 0;
+ dw->dvi.file_map = 0;
+ dw->dvi.fonts = 0;
+ dw->dvi.seek = False;
+ dw->dvi.device_resolution = dw->dvi.default_resolution;
+ dw->dvi.display_resolution = dw->dvi.default_resolution;
+ dw->dvi.paperlength = dw->dvi.default_resolution*11;
+ dw->dvi.paperwidth = (dw->dvi.default_resolution*8
+ + dw->dvi.default_resolution/2);
+ dw->dvi.scale_factor = 1.0;
+ dw->dvi.sizescale = 1;
+ dw->dvi.line_thickness = -1;
+ dw->dvi.line_width = 1;
+ dw->dvi.fill = DVI_FILL_MAX;
+ dw->dvi.device_font = 0;
+ dw->dvi.device_font_number = -1;
+ dw->dvi.device = 0;
+ dw->dvi.native = 0;
+
+ request = request; /* unused; suppress compiler warning */
+ args = args;
+ num_args = num_args;
+}
+
+#include "gray1.bm"
+#include "gray2.bm"
+#include "gray3.bm"
+#include "gray4.bm"
+#include "gray5.bm"
+#include "gray6.bm"
+#include "gray7.bm"
+#include "gray8.bm"
+
+static void
+Realize (Widget w, XtValueMask *valueMask, XSetWindowAttributes *attrs)
+{
+ DviWidget dw = (DviWidget) w;
+ XGCValues values;
+
+ if (dw->dvi.backing_store != Always + WhenMapped + NotUseful) {
+ attrs->backing_store = dw->dvi.backing_store;
+ *valueMask |= CWBackingStore;
+ }
+ XtCreateWindow (w, (unsigned)InputOutput, (Visual *) CopyFromParent,
+ *valueMask, attrs);
+ values.foreground = dw->dvi.foreground;
+ values.cap_style = CapRound;
+ values.join_style = JoinRound;
+ values.line_width = dw->dvi.line_width;
+ dw->dvi.normal_GC = XCreateGC (XtDisplay (w), XtWindow (w),
+ GCForeground|GCCapStyle|GCJoinStyle
+ |GCLineWidth,
+ &values);
+ dw->dvi.gray[0] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w),
+ gray1_bits,
+ gray1_width, gray1_height);
+ dw->dvi.gray[1] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w),
+ gray2_bits,
+ gray2_width, gray2_height);
+ dw->dvi.gray[2] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w),
+ gray3_bits,
+ gray3_width, gray3_height);
+ dw->dvi.gray[3] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w),
+ gray4_bits,
+ gray4_width, gray4_height);
+ dw->dvi.gray[4] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w),
+ gray5_bits,
+ gray5_width, gray5_height);
+ dw->dvi.gray[5] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w),
+ gray6_bits,
+ gray6_width, gray6_height);
+ dw->dvi.gray[6] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w),
+ gray7_bits,
+ gray7_width, gray7_height);
+ dw->dvi.gray[7] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w),
+ gray8_bits,
+ gray8_width, gray8_height);
+ values.background = dw->dvi.background;
+ values.stipple = dw->dvi.gray[5];
+ dw->dvi.fill_GC = XCreateGC (XtDisplay (w), XtWindow (w),
+ GCForeground|GCBackground|GCStipple,
+ &values);
+
+ dw->dvi.fill_type = 9;
+
+ if (dw->dvi.file)
+ OpenFile (dw);
+ ParseFontMap (dw);
+}
+
+static void
+Destroy(Widget w)
+{
+ DviWidget dw = (DviWidget) w;
+
+ XFreeGC (XtDisplay (w), dw->dvi.normal_GC);
+ XFreeGC (XtDisplay (w), dw->dvi.fill_GC);
+ XFreePixmap (XtDisplay (w), dw->dvi.gray[0]);
+ XFreePixmap (XtDisplay (w), dw->dvi.gray[1]);
+ XFreePixmap (XtDisplay (w), dw->dvi.gray[2]);
+ XFreePixmap (XtDisplay (w), dw->dvi.gray[3]);
+ XFreePixmap (XtDisplay (w), dw->dvi.gray[4]);
+ XFreePixmap (XtDisplay (w), dw->dvi.gray[5]);
+ XFreePixmap (XtDisplay (w), dw->dvi.gray[6]);
+ XFreePixmap (XtDisplay (w), dw->dvi.gray[7]);
+ DestroyFontMap (dw->dvi.font_map);
+ DestroyFileMap (dw->dvi.file_map);
+ device_destroy (dw->dvi.device);
+}
+
+/*
+ * Repaint the widget window
+ */
+
+/* ARGSUSED */
+static void
+Redisplay(Widget w, XEvent *event, Region region)
+{
+ DviWidget dw = (DviWidget) w;
+ XRectangle extents;
+
+ XClipBox (region, &extents);
+ dw->dvi.extents.x1 = extents.x;
+ dw->dvi.extents.y1 = extents.y;
+ dw->dvi.extents.x2 = extents.x + extents.width;
+ dw->dvi.extents.y2 = extents.y + extents.height;
+ ShowDvi (dw);
+
+ event = event; /* unused; suppress compiler warning */
+}
+
+/*
+ * Set specified arguments into widget
+ */
+/* ARGSUSED */
+static Boolean
+SetValues (Widget wcurrent, Widget wrequest, Widget wnew,
+ ArgList args, Cardinal *num_args)
+{
+ Boolean redisplay = FALSE;
+ char *new_map;
+ int cur, req;
+ DviWidget current = (DviWidget)wcurrent;
+ DviWidget request = (DviWidget)wrequest;
+ DviWidget new_wd = (DviWidget)wnew;
+
+ if (current->dvi.font_map_string != request->dvi.font_map_string) {
+ new_map = XtMalloc (strlen (request->dvi.font_map_string) + 1);
+ if (new_map) {
+ redisplay = TRUE;
+ strcpy (new_map, request->dvi.font_map_string);
+ new_wd->dvi.font_map_string = new_map;
+ if (current->dvi.font_map_string)
+ XtFree (current->dvi.font_map_string);
+ current->dvi.font_map_string = 0;
+ ParseFontMap (new_wd);
+ }
+ }
+
+ req = request->dvi.requested_page;
+ cur = current->dvi.requested_page;
+ if (cur != req) {
+ if (!request->dvi.file)
+ req = 0;
+ else {
+ if (req < 1)
+ req = 1;
+ if (current->dvi.last_page != 0 &&
+ req > current->dvi.last_page)
+ req = current->dvi.last_page;
+ }
+ if (cur != req)
+ redisplay = TRUE;
+ new_wd->dvi.requested_page = req;
+ if (current->dvi.last_page == 0 && req > cur)
+ FindPage (new_wd);
+ }
+
+ args = args; /* unused; suppress compiler warning */
+ num_args = num_args;
+
+ return redisplay;
+}
+
+/*
+ * use the set_values_hook entry to check when
+ * the file is set
+ */
+
+static Boolean
+SetValuesHook (Widget wdw, ArgList args, Cardinal *num_argsp)
+{
+ Cardinal i;
+ DviWidget dw = (DviWidget)wdw;
+
+ for (i = 0; i < *num_argsp; i++) {
+ if (!strcmp (args[i].name, XtNfile)) {
+ CloseFile (dw);
+ OpenFile (dw);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static void CloseFile (DviWidget dw)
+{
+ if (dw->dvi.tmpFile)
+ fclose (dw->dvi.tmpFile);
+ ForgetPagePositions (dw);
+}
+
+static void OpenFile (DviWidget dw)
+{
+ dw->dvi.tmpFile = 0;
+ if (!dw->dvi.seek)
+ dw->dvi.tmpFile = tmpfile();
+ dw->dvi.requested_page = 1;
+ dw->dvi.last_page = 0;
+}
+
+static XtGeometryResult
+QueryGeometry (Widget w, XtWidgetGeometry *request,
+ XtWidgetGeometry *geometry_return)
+{
+ XtGeometryResult ret;
+ DviWidget dw = (DviWidget) w;
+
+ ret = XtGeometryYes;
+ if (((request->request_mode & CWWidth)
+ && request->width < MY_WIDTH(dw))
+ || ((request->request_mode & CWHeight)
+ && request->height < MY_HEIGHT(dw)))
+ ret = XtGeometryAlmost;
+ geometry_return->width = MY_WIDTH(dw);
+ geometry_return->height = MY_HEIGHT(dw);
+ geometry_return->request_mode = CWWidth|CWHeight;
+ return ret;
+}
+
+void
+SetDevice (DviWidget dw, const char *name)
+{
+ XtWidgetGeometry request, reply;
+ XtGeometryResult ret;
+
+ ForgetFonts (dw);
+ dw->dvi.device = device_load (name);
+ if (!dw->dvi.device)
+ return;
+ dw->dvi.sizescale = dw->dvi.device->sizescale;
+ dw->dvi.device_resolution = dw->dvi.device->res;
+ dw->dvi.native = dw->dvi.device->X11;
+ dw->dvi.paperlength = dw->dvi.device->paperlength;
+ dw->dvi.paperwidth = dw->dvi.device->paperwidth;
+ if (dw->dvi.native) {
+ dw->dvi.display_resolution = dw->dvi.device_resolution;
+ dw->dvi.scale_factor = 1.0;
+ }
+ else {
+ dw->dvi.display_resolution = dw->dvi.default_resolution;
+ dw->dvi.scale_factor = ((double)dw->dvi.display_resolution
+ / dw->dvi.device_resolution);
+ }
+ request.request_mode = CWWidth|CWHeight;
+ request.width = MY_WIDTH(dw);
+ request.height = MY_HEIGHT(dw);
+ ret = XtMakeGeometryRequest ((Widget)dw, &request, &reply);
+ if (ret == XtGeometryAlmost
+ && reply.height >= request.height
+ && reply.width >= request.width) {
+ request.width = reply.width;
+ request.height = reply.height;
+ XtMakeGeometryRequest ((Widget)dw, &request, &reply);
+ }
+}
+
+static void
+ShowDvi (DviWidget dw)
+{
+ if (!dw->dvi.file) {
+ static char Error[] = "No file selected";
+
+ XSetFont (XtDisplay(dw), dw->dvi.normal_GC,
+ dw->dvi.default_font->fid);
+ XDrawString (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC,
+ 20, 20, Error, strlen (Error));
+ return;
+ }
+
+ FindPage (dw);
+
+ dw->dvi.display_enable = 1;
+ ParseInput (dw);
+ if (dw->dvi.last_page && dw->dvi.requested_page > dw->dvi.last_page)
+ dw->dvi.requested_page = dw->dvi.last_page;
+}
+
+static void
+FindPage (DviWidget dw)
+{
+ int i;
+ long file_position;
+
+ if (dw->dvi.requested_page < 1)
+ dw->dvi.requested_page = 1;
+
+ if (dw->dvi.last_page != 0 && dw->dvi.requested_page > dw->dvi.last_page)
+ dw->dvi.requested_page = dw->dvi.last_page;
+
+ file_position = SearchPagePosition (dw, dw->dvi.requested_page);
+ if (file_position != -1) {
+ FileSeek(dw, file_position);
+ dw->dvi.current_page = dw->dvi.requested_page;
+ } else {
+ for (i=dw->dvi.requested_page; i > 0; i--) {
+ file_position = SearchPagePosition (dw, i);
+ if (file_position != -1)
+ break;
+ }
+ if (file_position == -1)
+ file_position = 0;
+ FileSeek (dw, file_position);
+
+ dw->dvi.current_page = i;
+
+ dw->dvi.display_enable = 0;
+ while (dw->dvi.current_page != dw->dvi.requested_page) {
+ dw->dvi.current_page = ParseInput (dw);
+ /*
+ * at EOF, seek back to the beginning of this page.
+ */
+ if (!dw->dvi.readingTmp && feof (dw->dvi.file)) {
+ file_position = SearchPagePosition (dw,
+ dw->dvi.current_page);
+ if (file_position != -1)
+ FileSeek (dw, file_position);
+ dw->dvi.requested_page = dw->dvi.current_page;
+ break;
+ }
+ }
+ }
+}
+
+void DviSaveToFile(Widget w, FILE *fp)
+{
+ XtCheckSubclass(w, dviWidgetClass, NULL);
+ (*((DviWidgetClass) XtClass(w))->command_class.save)(w, fp);
+}
+
+static
+void SaveToFile(Widget w, FILE *fp)
+{
+ DviWidget dw = (DviWidget)w;
+ long pos;
+ int c;
+
+ if (dw->dvi.tmpFile) {
+ pos = ftell(dw->dvi.tmpFile);
+ if (dw->dvi.ungot) {
+ pos--;
+ dw->dvi.ungot = 0;
+ /* The ungot character is in the tmpFile, so we don't
+ want to read it from file. */
+ (void)getc(dw->dvi.file);
+ }
+ }
+ else
+ pos = ftell(dw->dvi.file);
+ FileSeek(dw, 0L);
+ while (DviGetC(dw, &c) != EOF)
+ if (putc(c, fp) == EOF) {
+ /* XXX print error message */
+ break;
+ }
+ FileSeek(dw, pos);
+}
+
+static
+void ClassPartInitialize(WidgetClass widget_class)
+{
+ DviWidgetClass wc = (DviWidgetClass)widget_class;
+ DviWidgetClass super = (DviWidgetClass) wc->core_class.superclass;
+ if (wc->command_class.save == InheritSaveToFile)
+ wc->command_class.save = super->command_class.save;
+}
+
+/*
+Local Variables:
+c-indent-level: 8
+c-continued-statement-offset: 8
+c-brace-offset: -8
+c-argdecl-indent: 8
+c-label-offset: -8
+c-tab-always-indent: nil
+End:
+*/
diff --git a/src/devices/xditview/Dvi.h b/src/devices/xditview/Dvi.h
new file mode 100644
index 0000000..bf97374
--- /dev/null
+++ b/src/devices/xditview/Dvi.h
@@ -0,0 +1,46 @@
+/*
+* $XConsortium: Dvi.h,v 1.4 89/07/21 14:22:06 jim Exp $
+*/
+
+#ifndef _XtDvi_h
+#define _XtDvi_h
+
+/***********************************************************************
+ *
+ * Dvi Widget
+ *
+ ***********************************************************************/
+
+/* Parameters:
+
+ Name Class RepType Default Value
+ ---- ----- ------- -------------
+ background Background pixel White
+ foreground Foreground Pixel Black
+ fontMap FontMap char * ...
+ pageNumber PageNumber int 1
+*/
+
+#define XtNfontMap (String)"fontMap"
+#define XtNpageNumber (String)"pageNumber"
+#define XtNlastPageNumber (String)"lastPageNumber"
+#define XtNnoPolyText (String)"noPolyText"
+#define XtNseek (String)"seek"
+#define XtNresolution (String)"resolution"
+
+#define XtCFontMap (String)"FontMap"
+#define XtCPageNumber (String)"PageNumber"
+#define XtCLastPageNumber (String)"LastPageNumber"
+#define XtCNoPolyText (String)"NoPolyText"
+#define XtCSeek (String)"Seek"
+#define XtCResolution (String)"Resolution"
+
+typedef struct _DviRec *DviWidget; /* completely defined in DviP.h */
+typedef struct _DviClassRec *DviWidgetClass; /* completely defined in DviP.h */
+
+extern WidgetClass dviWidgetClass;
+
+void DviSaveToFile(Widget, FILE *);
+
+#endif /* _XtDvi_h */
+/* DON'T ADD STUFF AFTER THIS #endif */
diff --git a/src/devices/xditview/DviP.h b/src/devices/xditview/DviP.h
new file mode 100644
index 0000000..8b71c69
--- /dev/null
+++ b/src/devices/xditview/DviP.h
@@ -0,0 +1,235 @@
+/*
+ * $XConsortium: DviP.h,v 1.5 89/07/22 19:44:08 keith Exp $
+ */
+
+/*
+ * DviP.h - Private definitions for Dvi widget
+ */
+
+#ifndef _XtDviP_h
+#define _XtDviP_h
+
+#include "Dvi.h"
+#include "DviChar.h"
+#include "device.h"
+
+/***********************************************************************
+ *
+ * Dvi Widget Private Data
+ *
+ ***********************************************************************/
+
+/************************************
+ *
+ * Class structure
+ *
+ ***********************************/
+
+/* Type for save method. */
+
+typedef void (*DviSaveProc)(Widget, FILE *);
+
+/*
+ * New fields for the Dvi widget class record
+ */
+
+
+typedef struct _DviClass {
+ DviSaveProc save;
+} DviClassPart;
+
+/*
+ * Full class record declaration
+ */
+
+typedef struct _DviClassRec {
+ CoreClassPart core_class;
+ DviClassPart command_class;
+} DviClassRec;
+
+extern DviClassRec dviClassRec;
+
+/***************************************
+ *
+ * Instance (widget) structure
+ *
+ **************************************/
+
+/*
+ * a list of fonts we've used for this widget
+ */
+
+typedef struct _dviFontSizeList {
+ struct _dviFontSizeList *next;
+ int size;
+ char *x_name;
+ XFontStruct *font;
+ int doesnt_exist;
+} DviFontSizeList;
+
+typedef struct _dviFontList {
+ struct _dviFontList *next;
+ char *dvi_name;
+ char *x_name;
+ int dvi_number;
+ Boolean initialized;
+ Boolean scalable;
+ DviFontSizeList *sizes;
+ DviCharNameMap *char_map;
+ DeviceFont *device_font;
+} DviFontList;
+
+typedef struct _dviFontMap {
+ struct _dviFontMap *next;
+ char *dvi_name;
+ char *x_name;
+} DviFontMap;
+
+#define DVI_TEXT_CACHE_SIZE 256
+#define DVI_CHAR_CACHE_SIZE 1024
+
+typedef struct _dviCharCache {
+ XTextItem cache[DVI_TEXT_CACHE_SIZE];
+ char adjustable[DVI_TEXT_CACHE_SIZE];
+ char char_cache[DVI_CHAR_CACHE_SIZE];
+ int index;
+ int max;
+ int char_index;
+ int font_size;
+ int font_number;
+ XFontStruct *font;
+ int start_x, start_y;
+ int x, y;
+} DviCharCache;
+
+typedef struct _dviState {
+ struct _dviState *next;
+ int font_size;
+ int font_number;
+ int x;
+ int y;
+} DviState;
+
+typedef struct _dviFileMap {
+ struct _dviFileMap *next;
+ long position;
+ int page_number;
+} DviFileMap;
+
+/*
+ * New fields for the Dvi widget record
+ */
+
+typedef struct {
+ /*
+ * resource specifiable items
+ */
+ char *font_map_string;
+ unsigned long foreground;
+ unsigned long background;
+ int requested_page;
+ int last_page;
+ XFontStruct *default_font;
+ FILE *file;
+ Boolean noPolyText;
+ Boolean seek; /* file is 'seekable' */
+ int default_resolution;
+ /*
+ * private state
+ */
+ FILE *tmpFile; /* used when reading stdin */
+ char readingTmp; /* reading now from tmp */
+ char ungot; /* have ungetc'd a char */
+ GC normal_GC;
+ GC fill_GC;
+ DviFileMap *file_map;
+ DviFontList *fonts;
+ DviFontMap *font_map;
+ int current_page;
+ int font_size;
+ int font_number;
+ DeviceFont *device_font;
+ int device_font_number;
+ Device *device;
+ int native;
+ int device_resolution;
+ int display_resolution;
+ int paperlength;
+ int paperwidth;
+ double scale_factor; /* display res / device res */
+ int sizescale;
+ int line_thickness;
+ int line_width;
+
+#define DVI_FILL_MAX 1000
+
+ int fill;
+#define DVI_FILL_WHITE 0
+#define DVI_FILL_GRAY 1
+#define DVI_FILL_BLACK 2
+ int fill_type;
+ Pixmap gray[8];
+ int backing_store;
+ XFontStruct *font;
+ int display_enable;
+ struct ExposedExtents {
+ int x1, y1, x2, y2;
+ } extents;
+ DviState *state;
+ DviCharCache cache;
+ int text_x_width;
+ int text_device_width;
+ int word_flag;
+} DviPart;
+
+int DviGetAndPut(DviWidget, int *);
+#define DviGetIn(dw,cp)\
+ (dw->dvi.tmpFile ? (\
+ DviGetAndPut (dw, cp) \
+ ) :\
+ (*cp = getc (dw->dvi.file))\
+)
+
+#define DviGetC(dw, cp)\
+ (dw->dvi.readingTmp ? (\
+ ((*cp = getc (dw->dvi.tmpFile)) == EOF) ? (\
+ fseek (dw->dvi.tmpFile, 0l, 2),\
+ (dw->dvi.readingTmp = 0),\
+ DviGetIn (dw,cp)\
+ ) : (\
+ *cp\
+ )\
+ ) : (\
+ DviGetIn(dw,cp)\
+ )\
+)
+
+#define DviUngetC(dw, c)\
+ (dw->dvi.readingTmp ? (\
+ ungetc (c, dw->dvi.tmpFile)\
+ ) : ( \
+ (dw->dvi.ungot = 1),\
+ ungetc (c, dw->dvi.file)))
+
+/*
+ * Full widget declaration
+ */
+
+typedef struct _DviRec {
+ CorePart core;
+ DviPart dvi;
+} DviRec;
+
+#define InheritSaveToFile ((DviSaveProc)_XtInherit)
+
+XFontStruct *QueryFont (DviWidget, int, int);
+
+DviCharNameMap *QueryFontMap (DviWidget, int);
+
+DeviceFont *QueryDeviceFont (DviWidget, int);
+
+char *GetWord(DviWidget, char *, int);
+char *GetLine(DviWidget, char *, int);
+
+void SetDevice (DviWidget dw, const char *name);
+#endif /* _XtDviP_h */
diff --git a/src/devices/xditview/FontMap-X11 b/src/devices/xditview/FontMap-X11
new file mode 100644
index 0000000..90911f0
--- /dev/null
+++ b/src/devices/xditview/FontMap-X11
@@ -0,0 +1,17 @@
+TR -adobe-times-medium-r-normal--*-*-*-*-p-*-iso8859-1
+TI -adobe-times-medium-i-normal--*-*-*-*-p-*-iso8859-1
+TB -adobe-times-bold-r-normal--*-*-*-*-p-*-iso8859-1
+TBI -adobe-times-bold-i-normal--*-*-*-*-p-*-iso8859-1
+CR -adobe-courier-medium-r-normal--*-*-*-*-m-*-iso8859-1
+CI -adobe-courier-medium-o-normal--*-*-*-*-m-*-iso8859-1
+CB -adobe-courier-bold-r-normal--*-*-*-*-m-*-iso8859-1
+CBI -adobe-courier-bold-o-normal--*-*-*-*-m-*-iso8859-1
+HR -adobe-helvetica-medium-r-normal--*-*-*-*-p-*-iso8859-1
+HI -adobe-helvetica-medium-o-normal--*-*-*-*-p-*-iso8859-1
+HB -adobe-helvetica-bold-r-normal--*-*-*-*-p-*-iso8859-1
+HBI -adobe-helvetica-bold-o-normal--*-*-*-*-p-*-iso8859-1
+NR -adobe-new century schoolbook-medium-r-normal--*-*-*-*-p-*-iso8859-1
+NI -adobe-new century schoolbook-medium-i-normal--*-*-*-*-p-*-iso8859-1
+NB -adobe-new century schoolbook-bold-r-normal--*-*-*-*-p-*-iso8859-1
+NBI -adobe-new century schoolbook-bold-i-normal--*-*-*-*-p-*-iso8859-1
+S -adobe-symbol-medium-r-normal--*-*-*-*-p-*-adobe-fontspecific
diff --git a/src/devices/xditview/GXditview-color.ad b/src/devices/xditview/GXditview-color.ad
new file mode 100644
index 0000000..61abd8f
--- /dev/null
+++ b/src/devices/xditview/GXditview-color.ad
@@ -0,0 +1,15 @@
+
+#include "GXditview"
+
+GXditview.paned.viewport.Scrollbar.background: Thistle
+GXditview.paned.viewport.Scrollbar.foreground: Orchid
+GXditview.paned.viewport.Scrollbar.thumb: None
+GXditview.paned.viewport.dvi.background: LemonChiffon
+GXditview.paned.viewport.background: Thistle
+GXditview.paned.label.background: PeachPuff
+GXditview.menu.background: Gold
+GXditview.promptShell.promptDialog*background: Gold
+GXditview.promptShell.promptDialog.accept.background: DarkOliveGreen1
+GXditview.promptShell.promptDialog.cancel.background: RosyBrown1
+GXditview.promptShell.promptDialog.value.background: Khaki
+
diff --git a/src/devices/xditview/GXditview.ad b/src/devices/xditview/GXditview.ad
new file mode 100644
index 0000000..549f0d7
--- /dev/null
+++ b/src/devices/xditview/GXditview.ad
@@ -0,0 +1,71 @@
+
+GXditview*shapeStyle: rectangle
+
+GXditview.paned.allowResize: true
+GXditview.paned.label.skipAdjust: true
+GXditview.paned.viewport.skipAdjust: false
+GXditview.paned.viewport.showGrip: false
+GXditview.paned.viewport.allowVert: true
+GXditview.paned.viewport.allowHoriz: true
+GXditview.paned.viewport.forceBars: true
+! viewport size = papersize * resol + scrollbarthickness + 1
+! letter size paper
+!GXditview.paned.viewport.width: 652
+!GXditview.paned.viewport.height: 840
+! a4 size paper
+! 865 is wide enough for a page of X100-12.
+GXditview.paned.viewport.width: 865
+GXditview.paned.viewport.height: 892
+GXditview.paned.viewport.Scrollbar.thickness: 14
+
+GXditview.geometry: 865x892
+
+GXditview.paned.translations: #augment \
+ <Key>Next: NextPage()\n\
+ <Key>n: NextPage()\n\
+ <Key>space: NextPage()\n\
+ <Key>Return: NextPage()\n\
+ <Key>Prior: PreviousPage()\n\
+ <Key>p: PreviousPage()\n\
+ <Key>b: PreviousPage()\n\
+ <Key>BackSpace: PreviousPage()\n\
+ <Key>Delete: PreviousPage()\n\
+ <Key>g: SelectPage()\n\
+ <Key>o: OpenFile()\n\
+ <Key>r: Rerasterize()\n\
+ <Key>q: Quit()
+GXditview.paned.viewport.clip.translations: #augment \
+ <Btn1Down>: XawPositionSimpleMenu(menu) MenuPopup(menu)
+GXditview.paned.label.translations: #augment \
+ <Btn1Down>: XawPositionSimpleMenu(menu) MenuPopup(menu)
+GXditview.paned.viewport.vertical.accelerators: #override \
+ <Key>k: StartScroll(Backward) NotifyScroll(FullLength) EndScroll()\n\
+ <Key>j: StartScroll(Forward) NotifyScroll(FullLength) EndScroll()\n\
+ <Key>Up: StartScroll(Backward) NotifyScroll(FullLength) EndScroll()\n\
+ <Key>Down: StartScroll(Forward) NotifyScroll(FullLength) EndScroll()
+GXditview.paned.viewport.horizontal.accelerators: #override \
+ <Key>h: StartScroll(Backward) NotifyScroll(FullLength) EndScroll()\n\
+ <Key>l: StartScroll(Forward) NotifyScroll(FullLength) EndScroll()\n\
+ <Key>Left: StartScroll(Backward) NotifyScroll(FullLength) EndScroll()\n\
+ <Key>Right: StartScroll(Forward) NotifyScroll(FullLength) EndScroll()
+
+GXditview.menu.nextPage.label: Next Page
+GXditview.menu.previousPage.label: Previous Page
+GXditview.menu.selectPage.label: Goto Page
+GXditview.menu.print.label: Print
+GXditview.menu.openFile.label: Open
+GXditview.menu.quit.label: Quit
+
+GXditview.promptShell.allowShellResize: true
+GXditview.promptShell.promptDialog.value.translations: #override \
+ <Key>Return: Accept() \n\
+ <Key>Escape: Cancel()
+
+GXditview.promptShell.promptDialog.accept.label: Accept
+GXditview.promptShell.promptDialog.accept.translations: #override \
+ <BtnUp>: Accept() unset()
+
+GXditview.promptShell.promptDialog.cancel.label: Cancel
+GXditview.promptShell.promptDialog.cancel.translations: #override \
+ <BtnUp>: Cancel() unset()
+
diff --git a/src/devices/xditview/Menu.h b/src/devices/xditview/Menu.h
new file mode 100644
index 0000000..c306b27
--- /dev/null
+++ b/src/devices/xditview/Menu.h
@@ -0,0 +1,46 @@
+/*
+ * $XConsortium: Menu.h,v 1.2 89/07/21 14:22:10 jim Exp $
+ */
+
+#ifndef _XtMenu_h
+#define _XtMenu_h
+
+/***********************************************************************
+ *
+ * Menu Widget
+ *
+ ***********************************************************************/
+
+/* Parameters:
+
+ Name Class RepType Default Value
+ ---- ----- ------- -------------
+ background Background pixel White
+ border BorderColor pixel Black
+ borderWidth BorderWidth int 1
+ height Height int 120
+ mappedWhenManaged MappedWhenManaged Boolean True
+ reverseVideo ReverseVideo Boolean False
+ width Width int 120
+ x Position int 0
+ y Position int 0
+
+*/
+
+#define XtNmenuEntries "menuEntries"
+#define XtNhorizontalPadding "horizontalPadding"
+#define XtNverticalPadding "verticalPadding"
+#define XtNselection "Selection"
+
+#define XtCMenuEntries "MenuEntries"
+#define XtCPadding "Padding"
+#define XtCSelection "Selection"
+
+typedef struct _MenuRec *MenuWidget; /* completely defined in MenuPrivate.h */
+typedef struct _MenuClassRec *MenuWidgetClass; /* completely defined in MenuPrivate.h */
+
+extern WidgetClass menuWidgetClass;
+
+extern Widget XawMenuCreate ();
+#endif /* _XtMenu_h */
+/* DON'T ADD STUFF AFTER THIS #endif */
diff --git a/src/devices/xditview/README b/src/devices/xditview/README
new file mode 100644
index 0000000..9de7869
--- /dev/null
+++ b/src/devices/xditview/README
@@ -0,0 +1,13 @@
+This is gxditview, an X11 previewer for groff based on MIT's xditview.
+This version can be used with the output of gtroff -Tps as well as
+with -TX75 and -TX100. You will need X11R5 or newer to install it (it
+might work on X11R4, but I haven't tested it.)
+
+Previously, gxditview was installed in the usual place for X binaries
+(e.g., /usr/bin/X11); you have to remove it manually.
+
+xditview is copyrighted by MIT under the usual X terms (see
+gxditview.man); the changes to that which come along with the groff package
+are in the public domain.
+
+Please report bugs at http://savannah.gnu.org/bugs/?group=groff.
diff --git a/src/devices/xditview/TODO b/src/devices/xditview/TODO
new file mode 100644
index 0000000..0b5b140
--- /dev/null
+++ b/src/devices/xditview/TODO
@@ -0,0 +1,21 @@
+Open the main window with the correct width and height, depending on
+both the selected device and the paper dimensions.
+
+Add a command-line option to specify the paper dimensions (similar to
+other groff devices).
+
+Better error handling.
+
+Resource and command-line option to specify font path.
+
+Resource to specify name of environment variable from which to get the
+font path.
+
+Have character substitutions (currently done in draw.c:FakeCharacter)
+specified in a resource (similar format to FontMap).
+
+The initial width of the dialog box should expand to accommodate the
+default value.
+
+Option in Print dialog to specify that only the current page should be
+printed.
diff --git a/src/devices/xditview/ad2c b/src/devices/xditview/ad2c
new file mode 100644
index 0000000..2ec45ed
--- /dev/null
+++ b/src/devices/xditview/ad2c
@@ -0,0 +1,64 @@
+#! /bin/sh
+#
+# ad2c : Convert app-defaults file to C strings decls.
+#
+# George Ferguson, ferguson@cs.rcohester.edu, 12 Nov 1990.
+# 19 Mar 1991: gf
+# Made it self-contained.
+# 6 Jan 1992: mycroft@gnu.ai.mit.edu (Charles Hannum)
+# Removed use of "-n" and ":read" label since Gnu and
+# IBM sed print pattern space on "n" command. Still works
+# with Sun sed, of course.
+# 7 Jan 1992: matthew@sunpix.East.Sun.COM (Matthew Stier)
+# Escape quotes after escaping backslashes.
+# 8 Jul 1992: Version 1.6
+# Manpage fixes.
+# 19 Apr 1993: Version 1.7
+# Remove comments that were inside the sed command since
+# some versions of sed don't like them. The comments are
+# now given here in the header.
+# 31 May 2004: Werner Lemberg <wl@gnu.org>
+# Force casts to 'String'.
+#
+# Comments on the script by line:
+# /^!/d Remove comments
+# /^$/d Remove blanks
+# s/\\/\\\\/g Escape backslashes...
+# s/\\$//g ...except the line continuation ones
+# s/"/\\"/g Escape quotes
+# s/^/"/ Add leading quote and cast
+# : test Establish label for later branch
+# /\\$/b slash Branch to label "slash" if line ends in backslash
+# s/$/",/ Otherwise add closing quote and comma...
+# p ...output the line...
+# d ...and clear the pattern space so it's not printed again
+# : slash Branch comes here if line ends in backslash
+# n Read next line, append to pattern space
+# [...] The "d" and "s" commands that follow just delete
+# comments and blank lines and escape control sequences
+# b test Branch up to see if the line ends in backslash or not
+#
+
+sed '
+/^!/d
+/^$/d
+s/\\/\\\\/g
+s/\\$//g
+s/"/\\"/g
+s/^/(String)"/
+: test
+/\\$/b slash
+s/$/",/
+p
+d
+: slash
+n
+/^!/d
+/^$/d
+s/"/\\"/g
+s/\\\\/\\/g
+s/\\n/\\\\n/g
+s/\\t/\\\\t/g
+s/\\f/\\\\f/g
+s/\\b/\\\\b/g
+b test' "$@"
diff --git a/src/devices/xditview/device.c b/src/devices/xditview/device.c
new file mode 100644
index 0000000..1eaafbe
--- /dev/null
+++ b/src/devices/xditview/device.c
@@ -0,0 +1,565 @@
+/* device.c */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <X11/Xos.h>
+#include <X11/Intrinsic.h>
+
+#include "device.h"
+#include "defs.h"
+
+#ifndef isascii
+#define isascii(c) (1)
+#endif
+
+/* Name of environment variable containing path to be used for
+searching for device and font description files. */
+#define FONTPATH_ENV_VAR "GROFF_FONT_PATH"
+
+#define WS " \t\r\n"
+
+#ifndef INT_MIN
+/* Minimum and maximum values a 'signed int' can hold. */
+#define INT_MIN (-INT_MAX-1)
+#define INT_MAX 2147483647
+#endif
+
+#define CHAR_TABLE_SIZE 307
+
+struct _DeviceFont {
+ char *name;
+ int special;
+ DeviceFont *next;
+ Device *dev;
+ struct charinfo *char_table[CHAR_TABLE_SIZE];
+ struct charinfo *code_table[256];
+};
+
+struct charinfo {
+ int width;
+ int code;
+ struct charinfo *next;
+ struct charinfo *code_next;
+ char name[1];
+};
+
+static char *current_filename = 0;
+static int current_lineno = -1;
+
+static void error(const char *s);
+static FILE *open_device_file(const char *, const char *, char **);
+static DeviceFont *load_font(Device *, const char *);
+static Device *new_device(const char *);
+static DeviceFont *new_font(const char *, Device *);
+static void delete_font(DeviceFont *);
+static unsigned hash_name(const char *);
+static struct charinfo *add_char(DeviceFont *, const char *, int, int);
+static int read_charset_section(DeviceFont *, FILE *);
+static char *canonicalize_name(const char *);
+static int scale_round(int, int, int);
+
+static
+Device *new_device(const char *name)
+{
+ Device *dev;
+
+ dev = XtNew(Device);
+ dev->sizescale = 1;
+ dev->res = 0;
+ dev->unitwidth = 0;
+ dev->fonts = 0;
+ dev->X11 = 0;
+ dev->paperlength = 0;
+ dev->paperwidth = 0;
+ dev->name = XtNewString(name);
+ return dev;
+}
+
+void device_destroy(Device *dev)
+{
+ DeviceFont *f;
+
+ if (!dev)
+ return;
+ f = dev->fonts;
+ while (f) {
+ DeviceFont *tem = f;
+ f = f->next;
+ delete_font(tem);
+ }
+
+ XtFree(dev->name);
+ XtFree((char *)dev);
+}
+
+Device *device_load(const char *name)
+{
+ Device *dev;
+ FILE *fp;
+ int err = 0;
+ char buf[256];
+
+ fp = open_device_file(name, "DESC", &current_filename);
+ if (!fp)
+ return 0;
+ dev = new_device(name);
+ current_lineno = 0;
+ while (fgets(buf, sizeof(buf), fp)) {
+ char *p;
+ current_lineno++;
+ p = strtok(buf, WS);
+ if (p) {
+ int *np = 0;
+ char *q;
+
+ if (strcmp(p, "charset") == 0)
+ break;
+ if (strcmp(p, "X11") == 0)
+ dev->X11 = 1;
+ else if (strcmp(p, "sizescale") == 0)
+ np = &dev->sizescale;
+ else if (strcmp(p, "res") == 0)
+ np = &dev->res;
+ else if (strcmp(p, "unitwidth") == 0)
+ np = &dev->unitwidth;
+ else if (strcmp(p, "paperwidth") == 0)
+ np = &dev->paperwidth;
+ else if (strcmp(p, "paperlength") == 0)
+ np = &dev->paperlength;
+
+ if (np) {
+ q = strtok((char *)0, WS);
+ if (!q || sscanf(q, "%d", np) != 1 || *np <= 0) {
+ error("bad argument");
+ err = 1;
+ break;
+ }
+ }
+ }
+ }
+ fclose(fp);
+ current_lineno = -1;
+ if (!err) {
+ if (dev->res == 0) {
+ error("missing res line");
+ err = 1;
+ }
+ else if (dev->unitwidth == 0) {
+ error("missing unitwidth line");
+ err = 1;
+ }
+ }
+ if (dev->paperlength == 0)
+ dev->paperlength = dev->res*11;
+ if (dev->paperwidth == 0)
+ dev->paperwidth = dev->res*8 + dev->res/2;
+ if (err) {
+ device_destroy(dev);
+ dev = 0;
+ }
+ XtFree(current_filename);
+ current_filename = 0;
+ return dev;
+}
+
+
+DeviceFont *device_find_font(Device *dev, const char *name)
+{
+ DeviceFont *f;
+
+ if (!dev)
+ return 0;
+ for (f = dev->fonts; f; f = f->next)
+ if (strcmp(f->name, name) == 0)
+ return f;
+ return load_font(dev, name);
+}
+
+static
+DeviceFont *load_font(Device *dev, const char *name)
+{
+ FILE *fp;
+ char buf[256];
+ DeviceFont *f;
+ int special = 0;
+
+ fp = open_device_file(dev->name, name, &current_filename);
+ if (!fp)
+ return 0;
+ current_lineno = 0;
+ for (;;) {
+ char *p;
+
+ if (!fgets(buf, sizeof(buf), fp)) {
+ error("no charset line");
+ return 0;
+ }
+ current_lineno++;
+ p = strtok(buf, WS);
+ /* charset must be on a line by itself */
+ if (p && strcmp(p, "charset") == 0 && strtok((char *)0, WS) == 0)
+ break;
+ if (p && strcmp(p, "special") == 0)
+ special = 1;
+ }
+ f = new_font(name, dev);
+ f->special = special;
+ if (!read_charset_section(f, fp)) {
+ delete_font(f);
+ f = 0;
+ }
+ else {
+ f->next = dev->fonts;
+ dev->fonts = f;
+ }
+ fclose(fp);
+ XtFree(current_filename);
+ current_filename = 0;
+ return f;
+}
+
+static
+DeviceFont *new_font(const char *name, Device *dev)
+{
+ int i;
+ DeviceFont *f;
+
+ f = XtNew(DeviceFont);
+ f->name = XtNewString(name);
+ f->dev = dev;
+ f->special = 0;
+ f->next = 0;
+ for (i = 0; i < CHAR_TABLE_SIZE; i++)
+ f->char_table[i] = 0;
+ for (i = 0; i < 256; i++)
+ f->code_table[i] = 0;
+ return f;
+}
+
+static
+void delete_font(DeviceFont *f)
+{
+ int i;
+
+ if (!f)
+ return;
+ XtFree(f->name);
+ for (i = 0; i < CHAR_TABLE_SIZE; i++) {
+ struct charinfo *ptr = f->char_table[i];
+ while (ptr) {
+ struct charinfo *tem = ptr;
+ ptr = ptr->next;
+ XtFree((char *)tem);
+ }
+ }
+ XtFree((char *)f);
+}
+
+
+static
+unsigned hash_name(const char *name)
+{
+ unsigned n = 0;
+ /* XXX do better than this */
+ while (*name)
+ n = (n << 1) ^ *name++;
+
+ return n;
+}
+
+static
+int scale_round(int n, int x, int y)
+{
+ int y2;
+
+ if (x == 0)
+ return 0;
+ y2 = y/2;
+ if (n >= 0) {
+ if (n <= (INT_MAX - y2)/x)
+ return (n*x + y2)/y;
+ return (int)(n*(double)x/(double)y + .5);
+ }
+ else {
+ if (-(unsigned)n <= (-(unsigned)INT_MIN - y2)/x)
+ return (n*x - y2)/y;
+ return (int)(n*(double)x/(double)y + .5);
+ }
+}
+
+static
+char *canonicalize_name(const char *s)
+{
+ static char ch[2];
+ if (s[0] == 'c' && s[1] == 'h' && s[2] == 'a' && s[3] == 'r') {
+ const char *p;
+ int n;
+
+ for (p = s + 4; *p; p++)
+ if (!isascii(*p) || !isdigit((unsigned char)*p))
+ return (char *)s;
+ n = atoi(s + 4);
+ if (n >= 0 && n <= 0xff) {
+ ch[0] = (char)n;
+ return ch;
+ }
+ }
+ return (char *)s;
+}
+
+/* Return 1 if the character is present in the font; widthp gets the
+width if non-null. */
+
+int device_char_width(DeviceFont *f, int ps, const char *name, int *widthp)
+{
+ struct charinfo *p;
+
+ name = canonicalize_name(name);
+ for (p = f->char_table[hash_name(name) % CHAR_TABLE_SIZE];; p = p->next) {
+ if (!p)
+ return 0;
+ if (strcmp(p->name, name) == 0)
+ break;
+ }
+ *widthp = scale_round(p->width, ps, f->dev->unitwidth);
+ return 1;
+}
+
+int device_code_width(DeviceFont *f, int ps, int code, int *widthp)
+{
+ struct charinfo *p;
+
+ for (p = f->code_table[code & 0xff];; p = p->code_next) {
+ if (!p)
+ return 0;
+ if (p->code == code)
+ break;
+ }
+ *widthp = scale_round(p->width, ps, f->dev->unitwidth);
+ return 1;
+}
+
+char *device_name_for_code(DeviceFont *f, int code)
+{
+ static struct charinfo *state = 0;
+ if (f)
+ state = f->code_table[code & 0xff];
+ for (; state; state = state->code_next)
+ if (state->code == code && state->name[0] != '\0') {
+ char *name = state->name;
+ state = state->code_next;
+ return name;
+ }
+ return 0;
+}
+
+int device_font_special(DeviceFont *f)
+{
+ return f->special;
+}
+
+static
+struct charinfo *add_char(DeviceFont *f, const char *name, int width, int code)
+{
+ struct charinfo **pp;
+ struct charinfo *ci;
+
+ name = canonicalize_name(name);
+ if (strcmp(name, "---") == 0)
+ name = "";
+
+ ci = (struct charinfo *)XtMalloc(XtOffsetOf(struct charinfo, name[0])
+ + strlen(name) + 1);
+
+ strcpy(ci->name, name);
+ ci->width = width;
+ ci->code = code;
+
+ if (*name != '\0') {
+ pp = &f->char_table[hash_name(name) % CHAR_TABLE_SIZE];
+ ci->next = *pp;
+ *pp = ci;
+ }
+ pp = &f->code_table[code & 0xff];
+ ci->code_next = *pp;
+ *pp = ci;
+ return ci;
+}
+
+/* Return non-zero for success. */
+
+static
+int read_charset_section(DeviceFont *f, FILE *fp)
+{
+ struct charinfo *last_charinfo = 0;
+ char buf[256];
+
+ while (fgets(buf, sizeof(buf), fp)) {
+ char *name;
+ int width;
+ int code;
+ char *p;
+
+ current_lineno++;
+ name = strtok(buf, WS);
+ if (!name)
+ continue; /* ignore blank lines */
+ p = strtok((char *)0, WS);
+ if (!p) /* end of charset section */
+ break;
+ if (strcmp(p, "\"") == 0) {
+ if (!last_charinfo) {
+ error("first line of charset section cannot use '\"'");
+ return 0;
+ }
+ else
+ (void)add_char(f, name,
+ last_charinfo->width, last_charinfo->code);
+ }
+ else {
+ char *q;
+ if (sscanf(p, "%d", &width) != 1) {
+ error("bad width field");
+ return 0;
+ }
+ p = strtok((char *)0, WS);
+ if (!p) {
+ error("missing type field");
+ return 0;
+ }
+ p = strtok((char *)0, WS);
+ if (!p) {
+ error("missing code field");
+ return 0;
+ }
+ code = (int)strtol(p, &q, 0);
+ if (q == p) {
+ error("bad code field");
+ return 0;
+ }
+ last_charinfo = add_char(f, name, width, code);
+ }
+ }
+ return 1;
+}
+
+static
+FILE *find_file(const char *file, char **result)
+{
+ char *buf = NULL;
+ int bufsiz = 0;
+ int flen;
+ FILE *fp;
+ char *path;
+ char *env;
+
+ env = getenv(FONTPATH_ENV_VAR);
+ path = XtMalloc(((env && *env) ? strlen(env) + 1 : 0)
+ + strlen(FONTPATH) + 1);
+ *path = '\0';
+ if (env && *env) {
+ strcat(path, env);
+ strcat(path, ":");
+ }
+ strcat(path, FONTPATH);
+
+ *result = NULL;
+
+ if (file == NULL)
+ return NULL;
+ if (*file == '\0')
+ return NULL;
+
+ if (*file == '/') {
+ fp = fopen(file, "r");
+ if (fp)
+ *result = XtNewString(file);
+ return fp;
+ }
+
+ flen = strlen(file);
+
+ while (*path) {
+ int len;
+ char *start, *end;
+
+ start = path;
+ end = strchr(path, ':');
+ if (end)
+ path = end + 1;
+ else
+ path = end = strchr(path, '\0');
+ if (start >= end)
+ continue;
+ if (end[-1] == '/')
+ --end;
+ len = (end - start) + 1 + flen + 1;
+ if (len > bufsiz) {
+ if (buf)
+ buf = XtRealloc(buf, len);
+ else
+ buf = XtMalloc(len);
+ bufsiz = len;
+ }
+ memcpy(buf, start, end - start);
+ buf[end - start] = '/';
+ strcpy(buf + (end - start) + 1, file);
+ fp = fopen(buf, "r");
+ if (fp) {
+ *result = buf;
+ return fp;
+ }
+ }
+ XtFree(buf);
+ return NULL;
+}
+
+static
+FILE *open_device_file(const char *device_name, const char *file_name,
+ char **result)
+{
+ char *buf;
+ FILE *fp;
+
+ buf = XtMalloc(3 + strlen(device_name) + 1 + strlen(file_name) + 1);
+ sprintf(buf, "dev%s/%s", device_name, file_name);
+ fp = find_file(buf, result);
+ if (!fp) {
+ fprintf(stderr, "can't find device file '%s'\n", file_name);
+ fflush(stderr);
+ }
+ XtFree(buf);
+ return fp;
+}
+
+static
+void error(const char *s)
+{
+ if (current_filename) {
+ fprintf(stderr, "%s:", current_filename);
+ if (current_lineno > 0)
+ fprintf(stderr, "%d:", current_lineno);
+ putc(' ', stderr);
+ }
+ fputs(s, stderr);
+ putc('\n', stderr);
+ fflush(stderr);
+}
+
+/*
+Local Variables:
+c-indent-level: 4
+c-continued-statement-offset: 4
+c-brace-offset: -4
+c-argdecl-indent: 4
+c-label-offset: -4
+c-tab-always-indent: nil
+End:
+*/
diff --git a/src/devices/xditview/device.h b/src/devices/xditview/device.h
new file mode 100644
index 0000000..6f2944b
--- /dev/null
+++ b/src/devices/xditview/device.h
@@ -0,0 +1,21 @@
+
+typedef struct _DeviceFont DeviceFont;
+
+typedef struct _Device {
+ char *name;
+ int sizescale;
+ int res;
+ int unitwidth;
+ int paperlength;
+ int paperwidth;
+ int X11;
+ DeviceFont *fonts;
+} Device;
+
+void device_destroy(Device *);
+Device *device_load(const char *);
+DeviceFont *device_find_font(Device *, const char *);
+int device_char_width(DeviceFont *, int, const char *, int *);
+char *device_name_for_code(DeviceFont *, int);
+int device_code_width(DeviceFont *, int, int, int *);
+int device_font_special(DeviceFont *);
diff --git a/src/devices/xditview/draw.c b/src/devices/xditview/draw.c
new file mode 100644
index 0000000..288d98a
--- /dev/null
+++ b/src/devices/xditview/draw.c
@@ -0,0 +1,709 @@
+/*
+ * draw.c
+ *
+ * accept dvi function calls and translate to X
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <X11/Xos.h>
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <math.h>
+
+/* math.h on a Sequent doesn't define M_PI, apparently */
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#include "DviP.h"
+#include "draw.h"
+#include "font.h"
+
+#define DeviceToX(dw, n) ((int)((n) * (dw)->dvi.scale_factor + .5))
+#define XPos(dw) (DeviceToX((dw), (dw)->dvi.state->x - \
+ (dw)->dvi.text_device_width) + (dw)->dvi.text_x_width)
+#define YPos(dw) (DeviceToX((dw), (dw)->dvi.state->y))
+
+/* forward reference */
+static int FakeCharacter(DviWidget, char *, int);
+
+/* shadowed by a macro definition in parse.c, and unused elsewhere */
+#if 0
+static void
+HorizontalMove(DviWidget dw, int delta)
+{
+ dw->dvi.state->x += delta;
+}
+#endif
+
+void
+HorizontalGoto(DviWidget dw, int NewPosition)
+{
+ dw->dvi.state->x = NewPosition;
+}
+
+void
+VerticalMove(DviWidget dw, int delta)
+{
+ dw->dvi.state->y += delta;
+}
+
+void
+VerticalGoto(DviWidget dw, int NewPosition)
+{
+ dw->dvi.state->y = NewPosition;
+}
+
+static void
+AdjustCacheDeltas (DviWidget dw)
+{
+ int extra;
+ int nadj;
+ int i;
+
+ nadj = 0;
+ extra = DeviceToX(dw, dw->dvi.text_device_width)
+ - dw->dvi.text_x_width;
+ if (extra == 0)
+ return;
+ for (i = 0; i <= dw->dvi.cache.index; i++)
+ if (dw->dvi.cache.adjustable[i])
+ ++nadj;
+ dw->dvi.text_x_width += extra;
+ if (nadj <= 1)
+ return;
+ for (i = 0; i <= dw->dvi.cache.index; i++)
+ if (dw->dvi.cache.adjustable[i]) {
+ int x;
+ int *deltap;
+
+ x = extra/nadj;
+ deltap = &dw->dvi.cache.cache[i].delta;
+#define MIN_DELTA 2
+ if (*deltap > 0 && x + *deltap < MIN_DELTA) {
+ x = MIN_DELTA - *deltap;
+ if (x <= 0)
+ *deltap = MIN_DELTA;
+ else
+ x = 0;
+ }
+ else
+ *deltap += x;
+ extra -= x;
+ --nadj;
+ dw->dvi.cache.adjustable[i] = 0;
+ }
+}
+
+void
+FlushCharCache (DviWidget dw)
+{
+ if (dw->dvi.cache.char_index != 0) {
+ AdjustCacheDeltas (dw);
+ XDrawText (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC,
+ dw->dvi.cache.start_x, dw->dvi.cache.start_y,
+ dw->dvi.cache.cache, dw->dvi.cache.index + 1);
+ }
+ dw->dvi.cache.index = 0;
+ dw->dvi.cache.max = DVI_TEXT_CACHE_SIZE;
+#if 0
+ if (dw->dvi.noPolyText)
+ dw->dvi.cache.max = 1;
+#endif
+ dw->dvi.cache.char_index = 0;
+ dw->dvi.cache.cache[0].nchars = 0;
+ dw->dvi.cache.start_x = dw->dvi.cache.x = XPos (dw);
+ dw->dvi.cache.start_y = dw->dvi.cache.y = YPos (dw);
+}
+
+void
+Newline (DviWidget dw)
+{
+ FlushCharCache (dw);
+ dw->dvi.text_x_width = dw->dvi.text_device_width = 0;
+ dw->dvi.word_flag = 0;
+}
+
+void
+Word (DviWidget dw)
+{
+ dw->dvi.word_flag = 1;
+}
+
+#define charWidth(fi,c) (\
+ (fi)->per_char ?\
+ (fi)->per_char[(c) - (fi)->min_char_or_byte2].width\
+ :\
+ (fi)->max_bounds.width\
+)
+
+
+static
+int charExists (XFontStruct *fi, int c)
+{
+ XCharStruct *p;
+
+ /* 'c' is always >= 0 */
+ if (fi->per_char == NULL
+ || (unsigned int)c < fi->min_char_or_byte2
+ || (unsigned int)c > fi->max_char_or_byte2)
+ return 0;
+ p = fi->per_char + (c - fi->min_char_or_byte2);
+ return (p->lbearing != 0 || p->rbearing != 0 || p->width != 0
+ || p->ascent != 0 || p->descent != 0 || p->attributes != 0);
+}
+
+/* 'wid' is in device units */
+static void
+DoCharacter (DviWidget dw, int c, int wid)
+{
+ register XFontStruct *font;
+ register XTextItem *text;
+ int x, y;
+
+ x = XPos(dw);
+ y = YPos(dw);
+
+ /*
+ * quick and dirty extents calculation:
+ */
+ if (!(y + 24 >= dw->dvi.extents.y1
+ && y - 24 <= dw->dvi.extents.y2
+#if 0
+ && x + 24 >= dw->dvi.extents.x1
+ && x - 24 <= dw->dvi.extents.x2
+#endif
+ ))
+ return;
+
+ if (y != dw->dvi.cache.y
+ || dw->dvi.cache.char_index >= DVI_CHAR_CACHE_SIZE) {
+ FlushCharCache (dw);
+ x = dw->dvi.cache.x;
+ dw->dvi.cache.adjustable[dw->dvi.cache.index] = 0;
+ }
+ /*
+ * load a new font, if the current block is not empty,
+ * step to the next.
+ */
+ if (dw->dvi.cache.font_size != dw->dvi.state->font_size ||
+ dw->dvi.cache.font_number != dw->dvi.state->font_number)
+ {
+ FlushCharCache (dw);
+ x = dw->dvi.cache.x;
+ dw->dvi.cache.font_size = dw->dvi.state->font_size;
+ dw->dvi.cache.font_number = dw->dvi.state->font_number;
+ dw->dvi.cache.font = QueryFont (dw,
+ dw->dvi.cache.font_number,
+ dw->dvi.cache.font_size);
+ if (dw->dvi.cache.cache[dw->dvi.cache.index].nchars != 0) {
+ ++dw->dvi.cache.index;
+ if (dw->dvi.cache.index >= dw->dvi.cache.max)
+ FlushCharCache (dw);
+ dw->dvi.cache.cache[dw->dvi.cache.index].nchars = 0;
+ dw->dvi.cache.adjustable[dw->dvi.cache.index] = 0;
+ }
+ }
+ if (x != dw->dvi.cache.x || dw->dvi.word_flag) {
+ if (dw->dvi.cache.cache[dw->dvi.cache.index].nchars != 0) {
+ ++dw->dvi.cache.index;
+ if (dw->dvi.cache.index >= dw->dvi.cache.max)
+ FlushCharCache (dw);
+ dw->dvi.cache.cache[dw->dvi.cache.index].nchars = 0;
+ dw->dvi.cache.adjustable[dw->dvi.cache.index] = 0;
+ }
+ dw->dvi.cache.adjustable[dw->dvi.cache.index]
+ = dw->dvi.word_flag;
+ dw->dvi.word_flag = 0;
+ }
+ font = dw->dvi.cache.font;
+ text = &dw->dvi.cache.cache[dw->dvi.cache.index];
+ if (text->nchars == 0) {
+ text->chars = &dw->dvi.cache.char_cache[dw->dvi.cache.char_index];
+ text->delta = x - dw->dvi.cache.x;
+ if (font != dw->dvi.font) {
+ text->font = font->fid;
+ dw->dvi.font = font;
+ } else
+ text->font = None;
+ dw->dvi.cache.x += text->delta;
+ }
+ if (charExists(font, c)) {
+ int w;
+ dw->dvi.cache.char_cache[dw->dvi.cache.char_index++] = (char) c;
+ ++text->nchars;
+ w = charWidth(font, c);
+ dw->dvi.cache.x += w;
+ if (wid != 0) {
+ dw->dvi.text_x_width += w;
+ dw->dvi.text_device_width += wid;
+ }
+ }
+}
+
+static
+int FindCharWidth (DviWidget dw, char *buf, int *widp)
+{
+ int maxpos;
+ int i;
+
+ if (dw->dvi.device_font == 0
+ || dw->dvi.state->font_number != dw->dvi.device_font_number) {
+ dw->dvi.device_font_number = dw->dvi.state->font_number;
+ dw->dvi.device_font
+ = QueryDeviceFont (dw, dw->dvi.device_font_number);
+ }
+ if (dw->dvi.device_font
+ && device_char_width (dw->dvi.device_font,
+ dw->dvi.state->font_size, buf, widp))
+ return 1;
+
+ maxpos = MaxFontPosition (dw);
+ for (i = 1; i <= maxpos; i++) {
+ DeviceFont *f = QueryDeviceFont (dw, i);
+ if (f && device_font_special (f)
+ && device_char_width (f, dw->dvi.state->font_size,
+ buf, widp)) {
+ dw->dvi.state->font_number = i;
+ return 1;
+ }
+ }
+ return 0;
+}
+
+/* Return the width of the character in device units. */
+
+int
+PutCharacter (DviWidget dw, char *buf)
+{
+ int prevFont;
+ int c = -1;
+ int wid = 0;
+ DviCharNameMap *map;
+
+ if (!dw->dvi.display_enable)
+ return 0; /* The width doesn't matter in this case. */
+ prevFont = dw->dvi.state->font_number;
+ if (!FindCharWidth (dw, buf, &wid))
+ return 0;
+ map = QueryFontMap (dw, dw->dvi.state->font_number);
+ if (map)
+ c = DviCharIndex (map, buf);
+ if (c >= 0)
+ DoCharacter (dw, c, wid);
+ else
+ (void) FakeCharacter (dw, buf, wid);
+ dw->dvi.state->font_number = prevFont;
+ return wid;
+}
+
+/* Return 1 if we can fake it; 0 otherwise. */
+
+static
+int FakeCharacter (DviWidget dw, char *buf, int wid)
+{
+ int oldx, oldw;
+ char ch[2];
+ const char *chars = 0;
+
+ if (buf[0] == '\0' || buf[1] == '\0' || buf[2] != '\0')
+ return 0;
+#define pack2(c1, c2) (((c1) << 8) | (c2))
+
+ switch (pack2(buf[0], buf[1])) {
+ case pack2('f', 'i'):
+ chars = "fi";
+ break;
+ case pack2('f', 'l'):
+ chars = "fl";
+ break;
+ case pack2('f', 'f'):
+ chars = "ff";
+ break;
+ case pack2('F', 'i'):
+ chars = "ffi";
+ break;
+ case pack2('F', 'l'):
+ chars = "ffl";
+ break;
+ }
+ if (!chars)
+ return 0;
+ oldx = dw->dvi.state->x;
+ oldw = dw->dvi.text_device_width;
+ ch[1] = '\0';
+ for (; *chars; chars++) {
+ ch[0] = *chars;
+ dw->dvi.state->x += PutCharacter (dw, ch);
+ }
+ dw->dvi.state->x = oldx;
+ dw->dvi.text_device_width = oldw + wid;
+ return 1;
+}
+
+void
+PutNumberedCharacter (DviWidget dw, int c)
+{
+ char *name;
+ int wid;
+ DviCharNameMap *map;
+
+ if (!dw->dvi.display_enable)
+ return;
+
+ if (dw->dvi.device_font == 0
+ || dw->dvi.state->font_number != dw->dvi.device_font_number) {
+ dw->dvi.device_font_number = dw->dvi.state->font_number;
+ dw->dvi.device_font
+ = QueryDeviceFont (dw, dw->dvi.device_font_number);
+ }
+
+ if (dw->dvi.device_font == 0
+ || !device_code_width (dw->dvi.device_font,
+ dw->dvi.state->font_size, c, &wid))
+ return;
+ if (dw->dvi.native) {
+ DoCharacter (dw, c, wid);
+ return;
+ }
+ map = QueryFontMap (dw, dw->dvi.state->font_number);
+ if (!map)
+ return;
+ for (name = device_name_for_code (dw->dvi.device_font, c);
+ name;
+ name = device_name_for_code ((DeviceFont *)0, c)) {
+ int code = DviCharIndex (map, name);
+ if (code >= 0) {
+ DoCharacter (dw, code, wid);
+ break;
+ }
+ if (FakeCharacter (dw, name, wid))
+ break;
+ }
+}
+
+/* unused */
+#if 0
+static void
+ClearPage (DviWidget dw)
+{
+ XClearWindow (XtDisplay (dw), XtWindow (dw));
+}
+#endif
+
+static void
+setGC (DviWidget dw)
+{
+ int desired_line_width;
+
+ if (dw->dvi.line_thickness < 0)
+ desired_line_width = (int)(((double)dw->dvi.device_resolution
+ * dw->dvi.state->font_size)
+ / (10.0*72.0*dw->dvi.sizescale));
+ else
+ desired_line_width = dw->dvi.line_thickness;
+
+ if (desired_line_width != dw->dvi.line_width) {
+ XGCValues values;
+ values.line_width = DeviceToX(dw, desired_line_width);
+ if (values.line_width == 0)
+ values.line_width = 1;
+ XChangeGC(XtDisplay (dw), dw->dvi.normal_GC,
+ GCLineWidth, &values);
+ dw->dvi.line_width = desired_line_width;
+ }
+}
+
+static void
+setFillGC (DviWidget dw)
+{
+ int fill_type;
+ unsigned long mask = GCFillStyle | GCForeground;
+
+ fill_type = (dw->dvi.fill * 10) / (DVI_FILL_MAX + 1);
+ if (dw->dvi.fill_type != fill_type) {
+ XGCValues values;
+ if (fill_type <= 0) {
+ values.foreground = dw->dvi.background;
+ values.fill_style = FillSolid;
+ } else if (fill_type >= 9) {
+ values.foreground = dw->dvi.foreground;
+ values.fill_style = FillSolid;
+ } else {
+ values.foreground = dw->dvi.foreground;
+ values.fill_style = FillOpaqueStippled;
+ values.stipple = dw->dvi.gray[fill_type - 1];
+ mask |= GCStipple;
+ }
+ XChangeGC(XtDisplay (dw), dw->dvi.fill_GC, mask, &values);
+ dw->dvi.fill_type = fill_type;
+ }
+}
+
+void
+DrawLine (DviWidget dw, int x, int y)
+{
+ int xp, yp;
+
+ AdjustCacheDeltas (dw);
+ setGC (dw);
+ xp = XPos (dw);
+ yp = YPos (dw);
+ XDrawLine (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC,
+ xp, yp,
+ xp + DeviceToX (dw, x), yp + DeviceToX (dw, y));
+}
+
+void
+DrawCircle (DviWidget dw, int diam)
+{
+ int d;
+
+ AdjustCacheDeltas (dw);
+ setGC (dw);
+ d = DeviceToX (dw, diam);
+ XDrawArc (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC,
+ XPos (dw), YPos (dw) - d/2,
+ d, d, 0, 64*360);
+}
+
+void
+DrawFilledCircle (DviWidget dw, int diam)
+{
+ int d;
+
+ AdjustCacheDeltas (dw);
+ setFillGC (dw);
+ d = DeviceToX (dw, diam);
+ XFillArc (XtDisplay (dw), XtWindow (dw), dw->dvi.fill_GC,
+ XPos (dw), YPos (dw) - d/2,
+ d, d, 0, 64*360);
+ XDrawArc (XtDisplay (dw), XtWindow (dw), dw->dvi.fill_GC,
+ XPos (dw), YPos (dw) - d/2,
+ d, d, 0, 64*360);
+}
+
+void
+DrawEllipse (DviWidget dw, int a, int b)
+{
+ AdjustCacheDeltas (dw);
+ setGC (dw);
+ XDrawArc (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC,
+ XPos (dw), YPos (dw) - DeviceToX (dw, b/2),
+ DeviceToX (dw, a), DeviceToX (dw, b), 0, 64*360);
+}
+
+void
+DrawFilledEllipse (DviWidget dw, int a, int b)
+{
+ AdjustCacheDeltas (dw);
+ setFillGC (dw);
+ XFillArc (XtDisplay (dw), XtWindow (dw), dw->dvi.fill_GC,
+ XPos (dw), YPos (dw) - DeviceToX (dw, b/2),
+ DeviceToX (dw, a), DeviceToX (dw, b), 0, 64*360);
+ XDrawArc (XtDisplay (dw), XtWindow (dw), dw->dvi.fill_GC,
+ XPos (dw), YPos (dw) - DeviceToX (dw, b/2),
+ DeviceToX (dw, a), DeviceToX (dw, b), 0, 64*360);
+}
+
+void
+DrawArc (DviWidget dw, int x_0, int y_0, int x_1, int y_1)
+{
+ int angle1, angle2;
+ int rad = (int)((sqrt ((double)x_0*x_0 + (double)y_0*y_0)
+ + sqrt ((double)x_1*x_1 + (double)y_1*y_1)
+ + 1.0)/2.0);
+ if ((x_0 == 0 && y_0 == 0) || (x_1 == 0 && y_1 == 0))
+ return;
+ angle1 = (int)(atan2 ((double)y_0, (double)-x_0)*180.0*64.0/M_PI);
+ angle2 = (int)(atan2 ((double)-y_1, (double)x_1)*180.0*64.0/M_PI);
+
+ angle2 -= angle1;
+ if (angle2 < 0)
+ angle2 += 64*360;
+
+ AdjustCacheDeltas (dw);
+ setGC (dw);
+
+ rad = DeviceToX (dw, rad);
+ XDrawArc (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC,
+ XPos (dw) + DeviceToX (dw, x_0) - rad,
+ YPos (dw) + DeviceToX (dw, y_0) - rad,
+ rad*2, rad*2, angle1, angle2);
+}
+
+void
+DrawPolygon (DviWidget dw, int *v, int n)
+{
+ XPoint *p;
+ int i;
+ int dx, dy;
+
+ n /= 2;
+
+ AdjustCacheDeltas (dw);
+ setGC (dw);
+ p = (XPoint *)XtMalloc((n + 2)*sizeof(XPoint));
+ p[0].x = XPos (dw);
+ p[0].y = YPos (dw);
+ dx = 0;
+ dy = 0;
+ for (i = 0; i < n; i++) {
+ dx += v[2*i];
+ p[i + 1].x = DeviceToX (dw, dx) + p[0].x;
+ dy += v[2*i + 1];
+ p[i + 1].y = DeviceToX (dw, dy) + p[0].y;
+ }
+ p[n+1].x = p[0].x;
+ p[n+1].y = p[0].y;
+ XDrawLines (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC,
+ p, n + 2, CoordModeOrigin);
+ XtFree((char *)p);
+}
+
+void
+DrawFilledPolygon (DviWidget dw, int *v, int n)
+{
+ XPoint *p;
+ int i;
+ int dx, dy;
+
+ n /= 2;
+ if (n < 2)
+ return;
+
+ AdjustCacheDeltas (dw);
+ setFillGC (dw);
+ p = (XPoint *)XtMalloc((n + 2)*sizeof(XPoint));
+ p[0].x = p[n+1].x = XPos (dw);
+ p[0].y = p[n+1].y = YPos (dw);
+ dx = 0;
+ dy = 0;
+ for (i = 0; i < n; i++) {
+ dx += v[2*i];
+ p[i + 1].x = DeviceToX (dw, dx) + p[0].x;
+ dy += v[2*i + 1];
+ p[i + 1].y = DeviceToX (dw, dy) + p[0].y;
+ }
+ XFillPolygon (XtDisplay (dw), XtWindow (dw), dw->dvi.fill_GC,
+ p, n + 1, Complex, CoordModeOrigin);
+ XDrawLines (XtDisplay (dw), XtWindow (dw), dw->dvi.fill_GC,
+ p, n + 2, CoordModeOrigin);
+ XtFree((char *)p);
+}
+
+#define POINTS_MAX 10000
+
+static void
+appendPoint(XPoint *points, int *pointi, int x, int y)
+{
+ if (*pointi < POINTS_MAX) {
+ points[*pointi].x = x;
+ points[*pointi].y = y;
+ *pointi += 1;
+ }
+}
+
+#define FLATNESS 1
+
+static void
+flattenCurve(XPoint *points, int *pointi,
+ int x_2, int y_2, int x_3, int y_3, int x_4, int y_4)
+{
+ int x_1, y_1, dx, dy, n1, n2, n;
+
+ x_1 = points[*pointi - 1].x;
+ y_1 = points[*pointi - 1].y;
+
+ dx = x_4 - x_1;
+ dy = y_4 - y_1;
+
+ n1 = dy*(x_2 - x_1) - dx*(y_2 - y_1);
+ n2 = dy*(x_3 - x_1) - dx*(y_3 - y_1);
+ if (n1 < 0)
+ n1 = -n1;
+ if (n2 < 0)
+ n2 = -n2;
+ n = n1 > n2 ? n1 : n2;
+
+ if (n*n / (dy*dy + dx*dx) <= FLATNESS*FLATNESS)
+ appendPoint (points, pointi, x_4, y_4);
+ else {
+ flattenCurve (points, pointi,
+ (x_1 + x_2)/2,
+ (y_1 + y_2)/2,
+ (x_1 + x_2*2 + x_3)/4,
+ (y_1 + y_2*2 + y_3)/4,
+ (x_1 + 3*x_2 + 3*x_3 + x_4)/8,
+ (y_1 + 3*y_2 + 3*y_3 + y_4)/8);
+ flattenCurve (points, pointi,
+ (x_2 + x_3*2 + x_4)/4,
+ (y_2 + y_3*2 + y_4)/4,
+ (x_3 + x_4)/2,
+ (y_3 + y_4)/2,
+ x_4,
+ y_4);
+ }
+}
+
+void
+DrawSpline (DviWidget dw, int *v, int n)
+{
+ int sx, sy, tx, ty;
+ int ox, oy, dx, dy;
+ int i;
+ int pointi;
+ XPoint points[POINTS_MAX];
+
+ if (n == 0 || (n & 1) != 0)
+ return;
+ AdjustCacheDeltas (dw);
+ setGC (dw);
+ ox = XPos (dw);
+ oy = YPos (dw);
+ dx = v[0];
+ dy = v[1];
+ sx = ox;
+ sy = oy;
+ tx = sx + DeviceToX (dw, dx);
+ ty = sy + DeviceToX (dw, dy);
+
+ pointi = 0;
+
+ appendPoint (points, &pointi, sx, sy);
+ appendPoint (points, &pointi, (sx + tx)/2, (sy + ty)/2);
+
+ for (i = 2; i < n; i += 2) {
+ int ux = ox + DeviceToX (dw, dx += v[i]);
+ int uy = oy + DeviceToX (dw, dy += v[i+1]);
+ flattenCurve (points, &pointi,
+ (sx + tx*5)/6, (sy + ty*5)/6,
+ (tx*5 + ux)/6, (ty*5 + uy)/6,
+ (tx + ux)/2, (ty + uy)/2);
+ sx = tx;
+ sy = ty;
+ tx = ux;
+ ty = uy;
+ }
+
+ appendPoint (points, &pointi, tx, ty);
+
+ XDrawLines (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC,
+ points, pointi, CoordModeOrigin);
+}
+
+
+/*
+Local Variables:
+c-indent-level: 8
+c-continued-statement-offset: 8
+c-brace-offset: -8
+c-argdecl-indent: 8
+c-label-offset: -8
+c-tab-always-indent: nil
+End:
+*/
diff --git a/src/devices/xditview/draw.h b/src/devices/xditview/draw.h
new file mode 100644
index 0000000..7a3772c
--- /dev/null
+++ b/src/devices/xditview/draw.h
@@ -0,0 +1,18 @@
+void HorizontalGoto(DviWidget, int);
+void VerticalGoto(DviWidget, int);
+void VerticalMove(DviWidget, int);
+void FlushCharCache(DviWidget);
+void Newline(DviWidget);
+void Word(DviWidget);
+int PutCharacter(DviWidget, char *);
+void PutNumberedCharacter(DviWidget, int);
+void DrawLine(DviWidget, int, int);
+void DrawCircle(DviWidget, int);
+void DrawFilledCircle(DviWidget, int);
+void DrawEllipse(DviWidget, int, int);
+void DrawFilledEllipse(DviWidget, int, int);
+void DrawArc(DviWidget, int, int, int, int);
+void DrawPolygon(DviWidget, int *, int);
+void DrawFilledPolygon(DviWidget, int *, int);
+void DrawSpline(DviWidget, int *, int);
+
diff --git a/src/devices/xditview/font.c b/src/devices/xditview/font.c
new file mode 100644
index 0000000..8462608
--- /dev/null
+++ b/src/devices/xditview/font.c
@@ -0,0 +1,446 @@
+/*
+ * font.c
+ *
+ * map dvi fonts to X fonts
+ */
+
+#include <config.h>
+
+#include <X11/Xos.h>
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+#include "DviP.h"
+#include "XFontName.h"
+#include "font.h"
+
+/* forward reference */
+static void DisposeFontSizes(DviWidget, DviFontSizeList *);
+
+static char *
+savestr (const char *s)
+{
+ char *n;
+
+ if (!s)
+ return 0;
+ n = XtMalloc (strlen (s) + 1);
+ if (n)
+ strcpy (n, s);
+ return n;
+}
+
+static DviFontList *
+LookupFontByPosition (DviWidget dw, int position)
+{
+ DviFontList *f;
+
+ for (f = dw->dvi.fonts; f; f = f->next)
+ if (f->dvi_number == position)
+ break;
+ return f;
+}
+
+int
+MaxFontPosition (DviWidget dw)
+{
+ DviFontList *f;
+ int n = -1;
+
+ for (f = dw->dvi.fonts; f; f = f->next)
+ if (f->dvi_number > n)
+ n = f->dvi_number;
+ return n;
+}
+
+static DviFontSizeList *
+LookupFontSizeBySize (DviWidget dw, DviFontList *f, int size)
+{
+ DviFontSizeList *fs, *best = 0, *smallest = 0;
+ int bestsize = 0;
+ XFontName fontName;
+ unsigned int fontNameAttributes;
+ char fontNameString[2048];
+ int decipointsize;
+
+ if (f->scalable) {
+ decipointsize = (10*size)/dw->dvi.sizescale;
+ for (best = f->sizes; best; best = best->next)
+ if (best->size == decipointsize)
+ return best;
+ best = (DviFontSizeList *) XtMalloc(sizeof *best);
+ best->next = f->sizes;
+ best->size = decipointsize;
+ f->sizes = best;
+ XParseFontName (f->x_name, &fontName, &fontNameAttributes);
+ fontNameAttributes &= ~(FontNamePixelSize|FontNameAverageWidth);
+ fontNameAttributes |= FontNameResolutionX;
+ fontNameAttributes |= FontNameResolutionY;
+ fontNameAttributes |= FontNamePointSize;
+ fontName.ResolutionX = dw->dvi.display_resolution;
+ fontName.ResolutionY = dw->dvi.display_resolution;
+ fontName.PointSize = decipointsize;
+ XFormatFontName (&fontName, fontNameAttributes, fontNameString);
+ best->x_name = savestr (fontNameString);
+ best->doesnt_exist = 0;
+ best->font = 0;
+ return best;
+ }
+ for (fs = f->sizes; fs; fs=fs->next) {
+ if (dw->dvi.sizescale*fs->size <= 10*size
+ && fs->size >= bestsize) {
+ best = fs;
+ bestsize = fs->size;
+ }
+ if (smallest == 0 || fs->size < smallest->size)
+ smallest = fs;
+ }
+ return best ? best : smallest;
+}
+
+static char *
+SkipFontNameElement (char *n)
+{
+ while (*n != '-')
+ if (!*++n)
+ return 0;
+ return n+1;
+}
+
+# define SizePosition 8
+# define EncodingPosition 13
+
+static int
+ConvertFontNameToSize (char *n)
+{
+ int i, size;
+
+ for (i = 0; i < SizePosition; i++) {
+ n = SkipFontNameElement (n);
+ if (!n)
+ return -1;
+ }
+ size = atoi (n);
+ return size;
+}
+
+static char *
+ConvertFontNameToEncoding (char *n)
+{
+ int i;
+ for (i = 0; i < EncodingPosition; i++) {
+ n = SkipFontNameElement (n);
+ if (!n)
+ return 0;
+ }
+ return n;
+}
+
+static DviFontSizeList *
+InstallFontSizes (DviWidget dw, const char *x_name, Boolean *scalablep)
+{
+ char fontNameString[2048];
+ char **fonts;
+ int i, count;
+ int size;
+ DviFontSizeList *sizes, *new_size;
+ XFontName fontName;
+ unsigned int fontNameAttributes;
+
+ *scalablep = FALSE;
+ if (!XParseFontName ((XFontNameString)x_name, &fontName,
+ &fontNameAttributes))
+ return 0;
+ fontNameAttributes &= ~(FontNamePixelSize|FontNamePointSize
+ |FontNameAverageWidth);
+ fontNameAttributes |= FontNameResolutionX;
+ fontNameAttributes |= FontNameResolutionY;
+ fontName.ResolutionX = dw->dvi.display_resolution;
+ fontName.ResolutionY = dw->dvi.display_resolution;
+ XFormatFontName (&fontName, fontNameAttributes, fontNameString);
+ fonts = XListFonts (XtDisplay (dw), fontNameString, 10000000, &count);
+ sizes = 0;
+ for (i = 0; i < count; i++) {
+ size = ConvertFontNameToSize (fonts[i]);
+ if (size == 0) {
+ DisposeFontSizes (dw, sizes);
+ sizes = 0;
+ *scalablep = TRUE;
+ break;
+ }
+ if (size != -1) {
+ new_size = (DviFontSizeList *) XtMalloc (sizeof *new_size);
+ new_size->next = sizes;
+ new_size->size = size;
+ new_size->x_name = savestr (fonts[i]);
+ new_size->doesnt_exist = 0;
+ new_size->font = 0;
+ sizes = new_size;
+ }
+ }
+ XFreeFontNames (fonts);
+ return sizes;
+}
+
+static void
+DisposeFontSizes (DviWidget dw, DviFontSizeList *fs)
+{
+ DviFontSizeList *next;
+
+ for (; fs; fs=next) {
+ next = fs->next;
+ if (fs->x_name)
+ XtFree (fs->x_name);
+ if (fs->font && fs->font != dw->dvi.default_font) {
+ XUnloadFont (XtDisplay (dw), fs->font->fid);
+ XFree ((char *)fs->font);
+ }
+ XtFree ((char *) fs);
+ }
+}
+
+static DviFontList *
+InstallFont (DviWidget dw, int position,
+ const char *dvi_name, const char *x_name)
+{
+ DviFontList *f;
+ char *encoding;
+
+ if ((f = LookupFontByPosition (dw, position)) != NULL) {
+ /*
+ * ignore gratuitous font loading
+ */
+ if (!strcmp (f->dvi_name, dvi_name) &&
+ !strcmp (f->x_name, x_name))
+ return f;
+
+ DisposeFontSizes (dw, f->sizes);
+ if (f->dvi_name)
+ XtFree (f->dvi_name);
+ if (f->x_name)
+ XtFree (f->x_name);
+ f->device_font = 0;
+ } else {
+ f = (DviFontList *) XtMalloc (sizeof (*f));
+ f->next = dw->dvi.fonts;
+ dw->dvi.fonts = f;
+ }
+ f->initialized = FALSE;
+ f->dvi_name = savestr (dvi_name);
+ f->device_font = device_find_font (dw->dvi.device, dvi_name);
+ f->x_name = savestr (x_name);
+ f->dvi_number = position;
+ f->sizes = 0;
+ f->scalable = FALSE;
+ if (f->x_name) {
+ encoding = ConvertFontNameToEncoding (f->x_name);
+ f->char_map = DviFindMap (encoding);
+ } else
+ f->char_map = 0;
+ /*
+ * force requery of fonts
+ */
+ dw->dvi.font = 0;
+ dw->dvi.font_number = -1;
+ dw->dvi.cache.font = 0;
+ dw->dvi.cache.font_number = -1;
+ dw->dvi.device_font = 0;
+ dw->dvi.device_font_number = -1;
+ return f;
+}
+
+void
+ForgetFonts (DviWidget dw)
+{
+ DviFontList *f = dw->dvi.fonts;
+
+ while (f) {
+ DviFontList *tem = f;
+
+ if (f->sizes)
+ DisposeFontSizes (dw, f->sizes);
+ if (f->dvi_name)
+ XtFree (f->dvi_name);
+ if (f->x_name)
+ XtFree (f->x_name);
+ f = f->next;
+ XtFree ((char *) tem);
+ }
+
+ /*
+ * force requery of fonts
+ */
+ dw->dvi.font = 0;
+ dw->dvi.font_number = -1;
+ dw->dvi.cache.font = 0;
+ dw->dvi.cache.font_number = -1;
+ dw->dvi.device_font = 0;
+ dw->dvi.device_font_number = -1;
+ dw->dvi.fonts = 0;
+}
+
+
+static char *
+MapDviNameToXName (DviWidget dw, const char *dvi_name)
+{
+ DviFontMap *fm;
+
+ for (fm = dw->dvi.font_map; fm; fm=fm->next)
+ if (!strcmp (fm->dvi_name, dvi_name))
+ return fm->x_name;
+ return 0;
+}
+
+#if 0
+static char *
+MapXNameToDviName (DviWidget dw, const char *x_name)
+{
+ DviFontMap *fm;
+
+ for (fm = dw->dvi.font_map; fm; fm=fm->next)
+ if (!strcmp (fm->x_name, x_name))
+ return fm->dvi_name;
+ return 0;
+}
+#endif
+
+void
+ParseFontMap (DviWidget dw)
+{
+ char dvi_name[1024];
+ char x_name[2048];
+ char *m, *s;
+ DviFontMap *fm, *new_map;
+
+ if (dw->dvi.font_map)
+ DestroyFontMap (dw->dvi.font_map);
+ fm = 0;
+ m = dw->dvi.font_map_string;
+ while (*m) {
+ s = m;
+ while (*m && !isspace (*m))
+ ++m;
+ strncpy (dvi_name, s, m-s);
+ dvi_name[m-s] = '\0';
+ while (isspace (*m))
+ ++m;
+ s = m;
+ while (*m && *m != '\n')
+ ++m;
+ strncpy (x_name, s, m-s);
+ x_name[m-s] = '\0';
+ new_map = (DviFontMap *) XtMalloc (sizeof *new_map);
+ new_map->x_name = savestr (x_name);
+ new_map->dvi_name = savestr (dvi_name);
+ new_map->next = fm;
+ fm = new_map;
+ ++m;
+ }
+ dw->dvi.font_map = fm;
+}
+
+void
+DestroyFontMap (DviFontMap *font_map)
+{
+ DviFontMap *next;
+
+ for (; font_map; font_map = next) {
+ next = font_map->next;
+ if (font_map->x_name)
+ XtFree (font_map->x_name);
+ if (font_map->dvi_name)
+ XtFree (font_map->dvi_name);
+ XtFree ((char *) font_map);
+ }
+}
+
+/* ARGSUSED */
+
+void
+SetFontPosition (DviWidget dw, int position,
+ const char *dvi_name, const char *extra)
+{
+ char *x_name;
+
+ x_name = MapDviNameToXName (dw, dvi_name);
+ if (x_name)
+ (void) InstallFont (dw, position, dvi_name, x_name);
+
+ extra = extra; /* unused; suppress compiler warning */
+}
+
+XFontStruct *
+QueryFont (DviWidget dw, int position, int size)
+{
+ DviFontList *f;
+ DviFontSizeList *fs;
+
+ f = LookupFontByPosition (dw, position);
+ if (!f)
+ return dw->dvi.default_font;
+ if (!f->initialized) {
+ f->sizes = InstallFontSizes (dw, f->x_name, &f->scalable);
+ f->initialized = TRUE;
+ }
+ fs = LookupFontSizeBySize (dw, f, size);
+ if (!fs)
+ return dw->dvi.default_font;
+ if (!fs->font) {
+ if (fs->x_name)
+ fs->font = XLoadQueryFont (XtDisplay (dw), fs->x_name);
+ if (!fs->font)
+ fs->font = dw->dvi.default_font;
+ }
+ return fs->font;
+}
+
+DeviceFont *
+QueryDeviceFont (DviWidget dw, int position)
+{
+ DviFontList *f;
+
+ f = LookupFontByPosition (dw, position);
+ if (!f)
+ return 0;
+ return f->device_font;
+}
+
+DviCharNameMap *
+QueryFontMap (DviWidget dw, int position)
+{
+ DviFontList *f;
+
+ f = LookupFontByPosition (dw, position);
+ if (f)
+ return f->char_map;
+ else
+ return 0;
+}
+
+#if 0
+LoadFont (DviWidget dw, int position, int size)
+{
+ XFontStruct *font;
+
+ font = QueryFont (dw, position, size);
+ dw->dvi.font_number = position;
+ dw->dvi.font_size = size;
+ dw->dvi.font = font;
+ XSetFont (XtDisplay (dw), dw->dvi.normal_GC, font->fid);
+ return;
+}
+#endif
+
+/*
+Local Variables:
+c-indent-level: 8
+c-continued-statement-offset: 8
+c-brace-offset: -8
+c-argdecl-indent: 8
+c-label-offset: -8
+c-tab-always-indent: nil
+End:
+*/
diff --git a/src/devices/xditview/font.h b/src/devices/xditview/font.h
new file mode 100644
index 0000000..ae6c765
--- /dev/null
+++ b/src/devices/xditview/font.h
@@ -0,0 +1,6 @@
+void DestroyFontMap(DviFontMap *);
+void ForgetFonts (DviWidget dw);
+int MaxFontPosition (DviWidget dw);
+void ParseFontMap (DviWidget dw);
+void SetFontPosition (DviWidget dw, int position, const char *dvi_name,
+ const char *extra);
diff --git a/src/devices/xditview/gray1.bm b/src/devices/xditview/gray1.bm
new file mode 100644
index 0000000..c40a95e
--- /dev/null
+++ b/src/devices/xditview/gray1.bm
@@ -0,0 +1,4 @@
+#define gray1_width 3
+#define gray1_height 3
+static char gray1_bits[] = {
+ 0x00, 0x02, 0x00};
diff --git a/src/devices/xditview/gray2.bm b/src/devices/xditview/gray2.bm
new file mode 100644
index 0000000..e87a1bc
--- /dev/null
+++ b/src/devices/xditview/gray2.bm
@@ -0,0 +1,4 @@
+#define gray2_width 3
+#define gray2_height 3
+static char gray2_bits[] = {
+ 0x00, 0x03, 0x00};
diff --git a/src/devices/xditview/gray3.bm b/src/devices/xditview/gray3.bm
new file mode 100644
index 0000000..d9313eb
--- /dev/null
+++ b/src/devices/xditview/gray3.bm
@@ -0,0 +1,4 @@
+#define gray3_width 3
+#define gray3_height 3
+static char gray3_bits[] = {
+ 0x00, 0x03, 0x02};
diff --git a/src/devices/xditview/gray4.bm b/src/devices/xditview/gray4.bm
new file mode 100644
index 0000000..dad142a
--- /dev/null
+++ b/src/devices/xditview/gray4.bm
@@ -0,0 +1,4 @@
+#define gray4_width 3
+#define gray4_height 3
+static char gray4_bits[] = {
+ 0x00, 0x07, 0x02};
diff --git a/src/devices/xditview/gray5.bm b/src/devices/xditview/gray5.bm
new file mode 100644
index 0000000..5f57618
--- /dev/null
+++ b/src/devices/xditview/gray5.bm
@@ -0,0 +1,4 @@
+#define gray5_width 3
+#define gray5_height 3
+static char gray5_bits[] = {
+ 0x04, 0x07, 0x02};
diff --git a/src/devices/xditview/gray6.bm b/src/devices/xditview/gray6.bm
new file mode 100644
index 0000000..b76701d
--- /dev/null
+++ b/src/devices/xditview/gray6.bm
@@ -0,0 +1,4 @@
+#define gray6_width 3
+#define gray6_height 3
+static char gray6_bits[] = {
+ 0x04, 0x07, 0x03};
diff --git a/src/devices/xditview/gray7.bm b/src/devices/xditview/gray7.bm
new file mode 100644
index 0000000..ef47bc6
--- /dev/null
+++ b/src/devices/xditview/gray7.bm
@@ -0,0 +1,4 @@
+#define gray7_width 3
+#define gray7_height 3
+static char gray7_bits[] = {
+ 0x05, 0x07, 0x03};
diff --git a/src/devices/xditview/gray8.bm b/src/devices/xditview/gray8.bm
new file mode 100644
index 0000000..12de7cb
--- /dev/null
+++ b/src/devices/xditview/gray8.bm
@@ -0,0 +1,4 @@
+#define gray8_width 3
+#define gray8_height 3
+static char gray8_bits[] = {
+ 0x05, 0x07, 0x07};
diff --git a/src/devices/xditview/gxditview.1.man b/src/devices/xditview/gxditview.1.man
new file mode 100644
index 0000000..920ccfd
--- /dev/null
+++ b/src/devices/xditview/gxditview.1.man
@@ -0,0 +1,815 @@
+.TH gxditview @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+gxditview \- display
+.I groff
+intermediate output files in X11
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright 1991 Massachusetts Institute of Technology
+.\"
+.\" Permission to use, copy, modify, distribute, and sell this software
+.\" and its documentation for any purpose is hereby granted without fee,
+.\" provided that the above copyright notice appear in all copies and
+.\" that both that copyright notice and this permission notice appear in
+.\" supporting documentation, and that the name of M.I.T. not be used in
+.\" advertising or publicity pertaining to distribution of the software
+.\" without specific, written prior permission. M.I.T. makes no
+.\" representations about the suitability of this software for any
+.\" purpose. It is provided "as is" without express or implied
+.\" warranty.
+.\"
+.\" M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+.\" INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+.\" NO EVENT SHALL M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+.\" CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+.\" OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+.\" NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+.\" WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_gxditview_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY gxditview
+.RI [ X-toolkit-option \~.\|.\|.\&]
+.RB [ \-backingStore\~\c
+.IR backing-store-type ]
+.RB [ \-filename\~\c
+.IR file ]
+.\" While recognized, the relevant logic is "#if 0"ed out in draw.c.
+.\" .RB [ \-noPolyText ]
+.RB [ \-page\~\c
+.IR page-number ]
+.RB [ \-printCommand\~\c
+.IR command ]
+.RB [ \-resolution\~\c
+.IR resolution ]
+.I file
+.YS
+.
+.
+.SY gxditview
+.B \-help
+.
+.SY gxditview
+.B \-\-help
+.YS
+.
+.
+.SY gxditview
+.B \-version
+.
+.SY gxditview
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I gxditview
+interprets and displays the intermediate output format of
+.MR groff @MAN1EXT@
+on an X11\~display.
+.
+It uses the standard X11 fonts,
+so it does not require access to the server machine for font loading.
+.
+There are several ways to use
+.IR gxditview .
+.
+.
+.PP
+The
+intermediate output format of
+.IR groff ,
+documented in
+.MR groff_out @MAN5EXT@ ,
+is produced by
+.I @g@troff
+or the
+.B \-Z
+option to
+.IR groff .
+.
+.
+It can be viewed by explicitly calling
+.RB \[lq] gxditview
+.IR file \[rq].
+.
+If the
+.I file
+operand is
+.RB \[lq] \- \[rq],
+.I gxditview
+will read the standard input stream;
+.I file
+cannot be omitted.
+.
+The intermediate output format of
+.I groff
+is device-independent but not device-agnostic.
+.
+.I gxditview
+can view it for all typesetter devices,
+but the quality is device-dependent.
+.
+.I gxditview
+will not display output for terminal
+.RI ( nroff )
+devices.
+.
+.
+.PP
+The best results are achieved with the
+.BR X *
+devices for
+.IR groff 's
+.B \-T
+option,
+of which there are four:
+.BR \-TX75 ,
+.BR \-TX75\-12 ,
+.BR \-TX100 ,
+and
+.BR \-TX100\-12 .
+.
+They differ by the X\~resolution
+(75 or 100 dots per inch)
+and the base point size
+(10 or 12 points).
+.
+They are especially built for
+.IR gxditview .
+.
+When using one of these,
+.I groff
+generates the intermediate output for this device and calls
+.I gxditview
+automatically for viewing.
+.
+.
+.P
+.B \-X
+produces good results only with
+.BR \-Tps ,
+.BR \-TX75 ,
+.BR \-TX75\-12 ,
+.BR \-TX100 ,
+and
+.BR \-TX100\-12 .
+.
+The default resolution for previewing
+.B \-Tps
+output is 75\|dpi;
+this can be changed with the
+.B \-resolution
+option.
+.
+.
+.PP
+While
+.I gxditview
+is running,
+the left mouse button brings up a menu with several entries.
+.
+.
+.TP 13n
+.B Next Page
+Display the next page.
+.
+.
+.TP
+.B Previous Page
+Display the previous page.
+.
+.
+.TP
+.B Select Page
+Select a particular numbered page specified by a dialog box.
+.
+.
+.TP
+.B Print
+Print the
+.I groff
+intermediate output using a command specified by a dialog box.
+.
+The default command initially displayed is controlled by the
+.B printCommand
+application resource,
+and by the
+.B \-printCommand
+option.
+.
+.
+.TP
+.B Open
+Open for display a new file specified by a dialog box.
+.
+The file should contain
+.I groff
+intermediate output.
+.
+If the filename starts with a bar or pipe symbol,
+.RB \[lq] | \[rq]
+it will be interpreted as a command from which to read.
+.
+.
+.TP
+.B Quit
+Exit from
+.BR gxditview .
+.
+.
+.PP
+The menu entries correspond to actions with similar but not identical
+names,
+which can also be accessed with keyboard accelerators.
+.
+The
+.IR n ,
+.IR Space ,
+.IR Return ,
+and
+.I Next
+.RI ( PgDn )
+keys are bound to the
+.B NextPage
+action.
+.
+The
+.IR p ,
+.IR b ,
+.IR BackSpace ,
+.IR Delete ,
+and
+.I Prior
+.RI ( PgUp )
+keys are bound to the
+.B PreviousPage
+action.
+.
+The
+.I g
+key is bound to the
+.B SelectPage
+action.
+.
+The
+.I o
+key is bound to the
+.B OpenFile
+action.
+.
+The
+.I q
+key is bound to the
+.B Quit
+action.
+.
+The
+.I r
+key is bound to a
+.B Rerasterize
+action which rereads the current file,
+and redisplays the current page;
+if the current file is a command,
+the command will be re-executed.
+.
+Vertical scrolling can be done with the
+.I k
+and
+.I j
+keys;
+horizontal scrolling is bound to the
+.I h
+and
+.I l
+keys.
+.
+The arrow keys
+.RI ( up ,
+.IR down ,
+.IR left ,
+and
+.IR right )
+are also bound to the obvious scrolling actions.
+.
+.
+.PP
+The
+.B paperlength
+and
+.B paperwidth
+commands in the
+.I DESC
+file describing a
+.I groff
+output device specify the length and width in machine units of the
+virtual page displayed by
+.IR gxditview ;
+see
+.MR groff_font @MAN5EXT@ .
+.
+.
+.\" ====================================================================
+.SS "X defaults"
+.\" ====================================================================
+.
+This program uses the
+.I Dvi
+widget from the X\~Toolkit.
+.
+It understands all of the core resource names and classes as well as:
+.
+.
+.TP
+.BR width\~ (class\~ Width )
+Specifies the width of the window.
+.
+.
+.TP
+.BR height\~ (class\~ Height )
+Specifies the height of the window.
+.
+.
+.TP
+.BR foreground\~ (class\~ Foreground )
+Specifies the default foreground color.
+.
+.
+.TP
+.BR font\~ (class\~ Font )
+Specifies the font to be used for error messages.
+.
+.
+.TP
+.BR fontMap\~ (class\~ FontMap )
+Specifies the mapping from
+.I groff
+font names to X\~font names.
+.
+This must be a string containing a sequence of lines.
+.
+Each line contains two whitespace-separated fields:
+firstly the
+.I groff
+font name,
+and secondly the XLFD
+(X Logical Font Description).
+.
+The default is shown in subsection \[lq]Default font map\[rq] below.
+.
+.
+.\" ====================================================================
+.SS "Default font map"
+.\" ====================================================================
+.
+XLFDs are long and unwieldy,
+so some lines are shown broken and indented below.
+.\" Break them after the POINT_SIZE field (in "decipoints", so "100").
+.
+.
+.PP
+.EX
+TR \-adobe\-times\-medium\-r\-normal\-\-*\-100\
+\-*\-*\-*\-*\-iso8859\-1\[rs]n\[rs]
+TI \-adobe\-times\-medium\-i\-normal\-\-*\-100\
+\-*\-*\-*\-*\-iso8859\-1\[rs]n\[rs]
+TB \-adobe\-times\-bold\-r\-normal\-\-*\-100\
+\-*\-*\-*\-*\-iso8859\-1\[rs]n\[rs]
+TBI \-adobe\-times\-bold\-i\-normal\
+\-\-*\-100\-*\-*\-*\-*\-iso8859\-1\[rs]n\[rs]
+CR \-adobe\-courier\-medium\-r\-normal\-\-*\-100\" break
+ \-*\-*\-*\-*\-iso8859\-1\[rs]n\[rs]
+CI \-adobe\-courier\-medium\-o\-normal\" break
+ \-\-*\-100\-*\-*\-*\-*\-iso8859\-1\[rs]n\[rs]
+CB \-adobe\-courier\-bold\-r\-normal\
+\-\-*\-100\-*\-*\-*\-*\-iso8859\-1\[rs]n\[rs]
+CBI \-adobe\-courier\-bold\-o\-normal\
+\-\-*\-100\-*\-*\-*\-*\-iso8859\-1\[rs]n\[rs]
+HR \-adobe\-helvetica\-medium\-r\-normal\" break
+ \-\-*\-100\-*\-*\-*\-*\-iso8859\-1\[rs]n\[rs]
+HI \-adobe\-helvetica\-medium\-o\-normal\" break
+ \-\-*\-100\-*\-*\-*\-*\-iso8859\-1\[rs]n\[rs]
+HB \-adobe\-helvetica\-bold\-r\-normal\" break
+ \-\-*\-100\-*\-*\-*\-*\-iso8859\-1\[rs]n\[rs]
+HBI \-adobe\-helvetica\-bold\-o\-normal\" break
+ \-\-*\-100\-*\-*\-*\-*\-iso8859\-1\[rs]n\[rs]
+NR \-adobe\-new century schoolbook\-medium\-r\-normal\-\-*\-100\" break
+ \-*\-*\-*\-*\-iso8859\-1\[rs]n\[rs]
+NI \-adobe\-new century schoolbook\-medium\-i\-normal\-\-*\-100\" break
+ \-*\-*\-*\-*\-iso8859\-1\[rs]n\[rs]
+NB \-adobe\-new century schoolbook\-bold\-r\-normal\-\-*\-100\" break
+ \-*\-*\-*\-*\-iso8859\-1\[rs]n\[rs]
+NBI \-adobe\-new century schoolbook\-bold\-i\-normal\-\-*\-100\" break
+ \-*\-*\-*\-*\-iso8859\-1\[rs]n\[rs]
+S \-adobe\-symbol\-medium\-r\-normal\-\-*\-100\" break
+ \-*\-*\-*\-*\-adobe\-fontspecific\[rs]n\[rs]
+SS \-adobe\-symbol\-medium\-r\-normal\-\-*\-100\" break
+ \-*\-*\-*\-*\-adobe\-fontspecific\[rs]n\[rs]
+.EE
+.
+.
+.br
+.ne 3v
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-help
+and
+.B \-\-help
+display a usage message,
+while
+.B \-version
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.P
+.I gxditview
+accepts all of the standard X\~Toolkit command-line options along with
+the additional options listed below.
+.
+.
+.TP
+.B \-page
+This option specifies the page number of the document to be displayed.
+.
+.
+.TP
+.BI \-backingStore\~ backing-store-type
+Because redisplay of the
+.I groff
+intermediate output window can take a perceiptible amount of time,
+this option causes the server to save the window contents so that when
+it is scrolled around the viewport,
+the window is painted from contents saved in backing store.
+.
+.I backing-store-type
+can be one of
+.BR Always ,
+.B WhenMapped
+or
+.BR NotUseful .
+.
+.
+.TP
+.BI \-printCommand\~ command
+The default command displayed in the dialog box for the
+.B Print
+menu entry will be
+.IR command .
+.
+.
+.TP
+.BI \-resolution\~ res
+The
+.I groff
+intermediate output file will be displayed at a resolution of
+.I res
+dots per inch,
+unless the
+.I DESC
+file contains the
+.B X11
+command,
+in which case the device resolution will be used.
+.
+This corresponds to the
+.I Dvi
+widget's
+.B resolution
+resource.
+.
+The default is
+.BR 75 .
+.
+.
+.TP
+.BI \-filename\~ string
+The default filename displayed in the dialog box for the
+.B Open
+menu entry will be
+.IR string .
+.
+This can be either a filename,
+or a command starting with
+.RB \[lq] | \[rq].
+.
+.
+.PP
+The following standard X\~Toolkit command-line arguments are commonly
+used with
+.IR gxditview .
+.
+.
+.TP
+.BI \-bg\~ color
+This option specifies the color to use for the background of the window.
+.
+The default is
+.RB \[lq] white \[rq].
+.
+.
+.TP
+.BI \-bd\~ color
+This option specifies the color to use for the border of the window.
+.
+The default is
+.RB \[lq] black \[rq].
+.
+.
+.TP
+.BI \-bw\~ number
+This option specifies the width in pixels of the border surrounding the
+window.
+.
+.
+.TP
+.BI \-fg\~ color
+This option specifies the color to use for displaying text.
+.
+The default is
+.RB \[lq] black \[rq].
+.
+.
+.TP
+.BI \-fn\~ font
+This option specifies the font to be used for displaying widget text.
+.
+The default is
+.RB \[lq] fixed \[rq].
+.
+.
+.TP
+.B \-rv
+This option indicates that reverse video should be simulated by swapping
+the foreground and background colors.
+.
+.
+.TP
+.BI \-geometry\~ geometry
+This option specifies the preferred size and position of the window.
+.
+.
+.TP
+.BI \-display\~ host : display
+This option specifies the X\~server to contact.
+.
+.
+.TP
+.BI \-xrm\~ resourcestring
+This option specifies a resource string to be used.
+.
+.
+.\" ====================================================================
+.SH Environment
+.\" ====================================================================
+.
+.TP
+.I GROFF_FONT_PATH
+A list of directories in which to seek the selected output device's
+directory of device and font description files.
+.
+See
+.MR @g@troff @MAN1EXT@
+and
+.MR groff_font @MAN5EXT@ .
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @APPDEFDIR@/\:\%GXditview
+.TQ
+.I @APPDEFDIR@/\:\%GXditview\-color
+define X application defaults for
+.IR gxditview .
+.
+Users can override these values in the
+.I .Xdefaults
+file,
+normally located in the user's home directory.
+.
+See
+.MR appres 1
+and
+.MR xrdb 1 .
+.
+.
+.TP
+.I @FONTDIR@/\:\%devX100/\:DESC
+describes the
+.B X100
+output device.
+.
+.
+.TP
+.IR @FONTDIR@/\:\%devX100/ F
+describes the font known
+.RI as\~ F
+on device
+.BR X100 .
+.
+.
+.TP
+.I @FONTDIR@/\:\%devX100\-12/\:DESC
+describes the
+.B X100\-12
+output device.
+.
+.
+.TP
+.IR @FONTDIR@/\:\%devX100\-12/ F
+describes the font known
+.RI as\~ F
+on device
+.BR X100\-12 .
+.
+.
+.TP
+.I @FONTDIR@/\:\%devX75/\:DESC
+describes the
+.B X75
+output device.
+.
+.
+.TP
+.IR @FONTDIR@/\:\%devX75/ F
+describes the font known
+.RI as\~ F
+on device
+.BR X75 .
+.
+.
+.TP
+.I @FONTDIR@/\:\%devX75\-12/\:DESC
+describes the
+.B X75\-12
+output device.
+.
+.
+.TP
+.IR @FONTDIR@/\:\%devX75\-12/ F
+describes the font known
+.RI as\~ F
+on device
+.BR X75\-12 .
+.
+.
+.TP
+.I @MACRODIR@/\:X.tmac
+defines macros for use with the
+.BR X100 ,
+.BR X100\-12 ,
+.BR X75 ,
+and
+.B X75\-12
+output devices.
+.
+It is automatically loaded by
+.I troffrc
+when any of those output devices is selected.
+.
+.
+.TP
+.I @MACRODIR@/\:Xps\:.tmac
+sets up
+.I @g@troff
+to use
+.I \%gxditview
+as a previewer for device-independent output targeting the
+.B ps
+output device.
+.
+It is automatically loaded by
+.I troffrc
+when
+.I @g@troff
+is given the options
+.B \-X
+and
+.BR \-Tps .
+.
+.
+.\" ====================================================================
+.SH Examples
+.\" ====================================================================
+.
+The following command views this man page with a base point size of 12.
+.
+.
+.RS
+.P
+.EX
+groff \-TX100\-12 \-man gxditview.1
+.EE
+.RE
+.
+.
+.P
+The quality of the result depends mainly on the chosen point size and
+display resolution;
+for rapid previewing,
+however,
+something like
+.
+.RS
+.EX
+.RI "groff \-X \-P\-resolution \-P100\~" document
+.EE
+.RE
+.
+yields acceptable results.
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+.I gxditview
+and its predecessor
+.I xditview
+were written by
+Keith Packard (MIT X Consortium),
+Richard L.\& Hyde (Purdue),
+David Slattengren (Berkeley),
+Malcolm Slaney (Schlumberger Palo Alto Research),
+Mark Moraes (University of Toronto),
+and
+James Clark.
+.
+.
+.PP
+This program is derived from
+.IR xditview ;
+portions of
+.I xditview
+originated in
+.IR xtroff ,
+which was derived from
+.IR \%suntroff .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.UR https://\:www\:.x\:.org/\:releases/\:X11R7.6/\:doc/\:xorg\-docs/\
+\:specs/\:XLFD/xlfd\:.html
+\[lq]X Logical Font Description Conventions\[rq]
+.UE ,
+by Jim Flowers and Stephen Gildea.
+.
+.
+.PP
+.MR X 7 ,
+.MR xrdb 1 ,
+.MR xditview 1 ,
+.MR groff @MAN1EXT@ ,
+.MR groff_out @MAN5EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_gxditview_1_man_C]
+.do rr *groff_gxditview_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/devices/xditview/lex.c b/src/devices/xditview/lex.c
new file mode 100644
index 0000000..19cf292
--- /dev/null
+++ b/src/devices/xditview/lex.c
@@ -0,0 +1,100 @@
+#include <config.h>
+
+#include <X11/Xos.h>
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <stdio.h>
+
+#include "DviP.h"
+#include "lex.h"
+
+int
+DviGetAndPut(DviWidget dw, int *cp)
+{
+ if (dw->dvi.ungot) {
+ dw->dvi.ungot = 0;
+ *cp = getc (dw->dvi.file);
+ }
+ else {
+ *cp = getc (dw->dvi.file);
+ if (*cp != EOF)
+ putc (*cp, dw->dvi.tmpFile);
+ }
+ return *cp;
+}
+
+char *
+GetLine(DviWidget dw, char *Buffer, int Length)
+{
+ int i = 0, c;
+
+ Length--; /* Save room for final '\0' */
+
+ while (DviGetC (dw, &c) != EOF) {
+ if (Buffer && i < Length)
+ Buffer[i++] = c;
+ if (c == '\n') {
+ DviUngetC(dw, c);
+ break;
+ }
+ }
+ if (Buffer)
+ Buffer[i] = '\0';
+ return Buffer;
+}
+
+char *
+GetWord(DviWidget dw, char *Buffer, int Length)
+{
+ int i = 0, c;
+
+ Length--; /* Save room for final '\0' */
+ while (DviGetC(dw, &c) == ' ' || c == '\n')
+ ;
+ while (c != EOF) {
+ if (Buffer && i < Length)
+ Buffer[i++] = c;
+ if (DviGetC(dw, &c) == ' ' || c == '\n') {
+ DviUngetC(dw, c);
+ break;
+ }
+ }
+ if (Buffer)
+ Buffer[i] = '\0';
+ return Buffer;
+}
+
+int
+GetNumber(DviWidget dw)
+{
+ int i = 0, c;
+ int negative = 0;
+
+ while (DviGetC(dw, &c) == ' ' || c == '\n')
+ ;
+ if (c == '-') {
+ negative = 1;
+ DviGetC(dw, &c);
+ }
+
+ for (; c >= '0' && c <= '9'; DviGetC(dw, &c)) {
+ if (negative)
+ i = i*10 - (c - '0');
+ else
+ i = i*10 + c - '0';
+ }
+ if (c != EOF)
+ DviUngetC(dw, c);
+ return i;
+}
+
+/*
+Local Variables:
+c-indent-level: 8
+c-continued-statement-offset: 8
+c-brace-offset: -8
+c-argdecl-indent: 8
+c-label-offset: -8
+c-tab-always-indent: nil
+End:
+*/
diff --git a/src/devices/xditview/lex.h b/src/devices/xditview/lex.h
new file mode 100644
index 0000000..0a4cba0
--- /dev/null
+++ b/src/devices/xditview/lex.h
@@ -0,0 +1 @@
+int GetNumber(DviWidget);
diff --git a/src/devices/xditview/page.c b/src/devices/xditview/page.c
new file mode 100644
index 0000000..352d871
--- /dev/null
+++ b/src/devices/xditview/page.c
@@ -0,0 +1,86 @@
+/*
+ * page.c
+ *
+ * map page numbers to file position
+ */
+
+#include <config.h>
+
+#include <X11/Xos.h>
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <stdio.h>
+#include <ctype.h>
+
+#include "DviP.h"
+#include "page.h"
+
+#ifdef X_NOT_STDC_ENV
+extern long ftell();
+#endif
+
+static DviFileMap *
+MapPageNumberToFileMap (DviWidget dw, int number)
+{
+ DviFileMap *m;
+
+ for (m = dw->dvi.file_map; m; m=m->next)
+ if (m->page_number == number)
+ break;
+ return m;
+}
+
+void
+DestroyFileMap (DviFileMap *m)
+{
+ DviFileMap *next;
+
+ for (; m; m = next) {
+ next = m->next;
+ XtFree ((char *) m);
+ }
+}
+
+void
+ForgetPagePositions (DviWidget dw)
+{
+ DestroyFileMap (dw->dvi.file_map);
+ dw->dvi.file_map = 0;
+}
+
+void
+RememberPagePosition(DviWidget dw, int number)
+{
+ DviFileMap *m;
+
+ if (!(m = MapPageNumberToFileMap (dw, number))) {
+ m = (DviFileMap *) XtMalloc (sizeof *m);
+ m->page_number = number;
+ m->next = dw->dvi.file_map;
+ dw->dvi.file_map = m;
+ }
+ if (dw->dvi.tmpFile)
+ m->position = ftell (dw->dvi.tmpFile);
+ else
+ m->position = ftell (dw->dvi.file);
+}
+
+long
+SearchPagePosition (DviWidget dw, int number)
+{
+ DviFileMap *m;
+
+ if (!(m = MapPageNumberToFileMap (dw, number)))
+ return -1;
+ return m->position;
+}
+
+void
+FileSeek(DviWidget dw, long position)
+{
+ if (dw->dvi.tmpFile) {
+ dw->dvi.readingTmp = 1;
+ fseek (dw->dvi.tmpFile, position, 0);
+ } else
+ fseek (dw->dvi.file, position, 0);
+}
diff --git a/src/devices/xditview/page.h b/src/devices/xditview/page.h
new file mode 100644
index 0000000..e2c938d
--- /dev/null
+++ b/src/devices/xditview/page.h
@@ -0,0 +1,5 @@
+void DestroyFileMap(DviFileMap *);
+void FileSeek(DviWidget, long);
+void ForgetPagePositions(DviWidget);
+void RememberPagePosition(DviWidget, int);
+long SearchPagePosition(DviWidget, int);
diff --git a/src/devices/xditview/parse.c b/src/devices/xditview/parse.c
new file mode 100644
index 0000000..456c7da
--- /dev/null
+++ b/src/devices/xditview/parse.c
@@ -0,0 +1,343 @@
+/*
+ * parse.c
+ *
+ * parse dvi input
+ */
+
+#include <config.h>
+
+#include <X11/Xos.h>
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <stdio.h>
+#include <ctype.h>
+
+#include "DviP.h"
+#include "draw.h"
+#include "font.h"
+#include "lex.h"
+#include "page.h"
+#include "parse.h"
+
+static int StopSeen = 0;
+static void ParseDrawFunction(DviWidget, char *);
+static void ParseDeviceControl(DviWidget);
+static void push_env(DviWidget);
+static void pop_env(DviWidget);
+
+#define HorizontalMove(dw, delta) ((dw)->dvi.state->x += (delta))
+
+
+int
+ParseInput(register DviWidget dw)
+{
+ int n, k;
+ int c;
+ char Buffer[BUFSIZ];
+ int NextPage;
+ int otherc;
+
+ StopSeen = 0;
+
+ /*
+ * make sure some state exists
+ */
+
+ if (!dw->dvi.state)
+ push_env (dw);
+ for (;;) {
+ switch (DviGetC(dw, &c)) {
+ case '\n':
+ break;
+ case ' ': /* when input is text */
+ case 0: /* occasional noise creeps in */
+ break;
+ case '{': /* push down current environment */
+ push_env(dw);
+ break;
+ case '}':
+ pop_env(dw);
+ break;
+ /*
+ * two motion digits plus a character
+ */
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ HorizontalMove(dw, (c-'0')*10 +
+ DviGetC(dw,&otherc)-'0');
+ /* fall through */
+ case 'c': /* single ascii character */
+ DviGetC(dw,&c);
+ if (c == ' ')
+ break;
+ Buffer[0] = c;
+ Buffer[1] = '\0';
+ (void) PutCharacter (dw, Buffer);
+ break;
+ case 'C':
+ GetWord (dw, Buffer, BUFSIZ);
+ (void) PutCharacter (dw, Buffer);
+ break;
+ case 't':
+ Buffer[1] = '\0';
+ while (DviGetC (dw, &c) != EOF
+ && c != ' ' && c != '\n') {
+ Buffer[0] = c;
+ HorizontalMove (dw, PutCharacter (dw, Buffer));
+ }
+ break;
+ case 'u':
+ n = GetNumber(dw);
+ Buffer[1] = '\0';
+ while (DviGetC (dw, &c) == ' ')
+ ;
+ while (c != EOF && c != ' ' && c != '\n') {
+ Buffer[0] = c;
+ HorizontalMove (dw,
+ PutCharacter (dw, Buffer) + n);
+ DviGetC (dw, &c);
+ }
+ break;
+
+ case 'D': /* draw function */
+ (void) GetLine(dw, Buffer, BUFSIZ);
+ if (dw->dvi.display_enable)
+ ParseDrawFunction(dw, Buffer);
+ break;
+ case 's': /* ignore fractional sizes */
+ n = GetNumber(dw);
+ dw->dvi.state->font_size = n;
+ break;
+ case 'f':
+ n = GetNumber(dw);
+ dw->dvi.state->font_number = n;
+ break;
+ case 'H': /* absolute horizontal motion */
+ k = GetNumber(dw);
+ HorizontalGoto(dw, k);
+ break;
+ case 'h': /* relative horizontal motion */
+ k = GetNumber(dw);
+ HorizontalMove(dw, k);
+ break;
+ case 'w': /* word space */
+ Word (dw);
+ break;
+ case 'V':
+ n = GetNumber(dw);
+ VerticalGoto(dw, n);
+ break;
+ case 'v':
+ n = GetNumber(dw);
+ VerticalMove(dw, n);
+ break;
+ case 'P': /* new spread */
+ break;
+ case 'p': /* new page */
+ (void) GetNumber(dw);
+ NextPage = dw->dvi.current_page + 1;
+ RememberPagePosition(dw, NextPage);
+ FlushCharCache (dw);
+ return(NextPage);
+ case 'N':
+ n = GetNumber(dw);
+ PutNumberedCharacter (dw, n);
+ break;
+ case 'n': /* end of line */
+ GetNumber(dw);
+ GetNumber(dw);
+ Newline (dw);
+ HorizontalGoto(dw, 0);
+ break;
+ case 'F': /* input files */
+ case '+': /* continuation of X device control */
+ case 'm': /* color */
+ case '#': /* comment */
+ GetLine(dw, NULL, 0);
+ break;
+ case 'x': /* device control */
+ ParseDeviceControl(dw);
+ break;
+ case EOF:
+ dw->dvi.last_page = dw->dvi.current_page;
+ FlushCharCache (dw);
+ return dw->dvi.current_page;
+ default:
+ break;
+ }
+ }
+}
+
+static void
+push_env(DviWidget dw)
+{
+ DviState *new_state;
+
+ new_state = (DviState *) XtMalloc (sizeof (*new_state));
+ if (dw->dvi.state)
+ *new_state = *(dw->dvi.state);
+ else {
+ new_state->font_size = 10;
+ new_state->font_number = 1;
+ new_state->x = 0;
+ new_state->y = 0;
+ }
+ new_state->next = dw->dvi.state;
+ dw->dvi.state = new_state;
+}
+
+static void
+pop_env(DviWidget dw)
+{
+ DviState *old;
+
+ old = dw->dvi.state;
+ dw->dvi.state = old->next;
+ XtFree ((char *) old);
+}
+
+static void
+InitTypesetter (DviWidget dw)
+{
+ while (dw->dvi.state)
+ pop_env (dw);
+ push_env (dw);
+ FlushCharCache (dw);
+}
+
+#define DRAW_ARGS_MAX 128
+
+static void
+ParseDrawFunction(DviWidget dw, char *buf)
+{
+ int v[DRAW_ARGS_MAX];
+ int i, no_move = 0;
+ char *ptr;
+
+ v[0] = v[1] = v[2] = v[3] = 0;
+
+ if (buf[0] == '\0')
+ return;
+ ptr = buf+1;
+
+ for (i = 0; i < DRAW_ARGS_MAX; i++) {
+ if (sscanf(ptr, "%d", v + i) != 1)
+ break;
+ while (*ptr == ' ')
+ ptr++;
+ while (*ptr != '\0' && *ptr != ' ')
+ ptr++;
+ }
+
+ switch (buf[0]) {
+ case 'l': /* draw a line */
+ DrawLine(dw, v[0], v[1]);
+ break;
+ case 'c': /* circle */
+ DrawCircle(dw, v[0]);
+ break;
+ case 'C':
+ DrawFilledCircle(dw, v[0]);
+ break;
+ case 'e': /* ellipse */
+ DrawEllipse(dw, v[0], v[1]);
+ break;
+ case 'E':
+ DrawFilledEllipse(dw, v[0], v[1]);
+ break;
+ case 'a': /* arc */
+ DrawArc(dw, v[0], v[1], v[2], v[3]);
+ break;
+ case 'p':
+ DrawPolygon(dw, v, i);
+ break;
+ case 'P':
+ DrawFilledPolygon(dw, v, i);
+ break;
+ case '~': /* wiggly line */
+ DrawSpline(dw, v, i);
+ break;
+ case 't':
+ dw->dvi.line_thickness = v[0];
+ break;
+ case 'f':
+ if (i > 0 && v[0] >= 0 && v[0] <= DVI_FILL_MAX)
+ dw->dvi.fill = v[0];
+ no_move = 1;
+ break;
+ default:
+#if 0
+ warning("unknown drawing function %s", buf);
+#endif
+ no_move = 1;
+ break;
+ }
+
+ if (!no_move) {
+ if (buf[0] == 'e') {
+ if (i > 0)
+ dw->dvi.state->x += v[0];
+ }
+ else {
+ while (--i >= 0) {
+ if (i & 1)
+ dw->dvi.state->y += v[i];
+ else
+ dw->dvi.state->x += v[i];
+ }
+ }
+ }
+}
+
+static void
+ParseDeviceControl(DviWidget dw) /* Parse the x commands */
+{
+ char str[20], str1[50];
+ int c, n;
+
+ GetWord (dw, str, 20);
+ switch (str[0]) { /* crude for now */
+ case 'T': /* output device */
+ GetWord (dw, str, 20);
+ SetDevice (dw, str);
+ break;
+ case 'i': /* initialize */
+ InitTypesetter (dw);
+ break;
+ case 't': /* trailer */
+ break;
+ case 'p': /* pause -- can restart */
+ break;
+ case 's': /* stop */
+ StopSeen = 1;
+ return;
+ case 'r': /* resolution when prepared */
+ break;
+ case 'f': /* font used */
+ n = GetNumber (dw);
+ GetWord (dw, str, 20);
+ GetLine (dw, str1, 50);
+ SetFontPosition (dw, n, str, str1);
+ break;
+ case 'H': /* char height */
+ break;
+ case 'S': /* slant */
+ break;
+ }
+ while (DviGetC (dw, &c) != '\n') /* skip rest of input line */
+ if (c == EOF)
+ return;
+ return;
+}
+
+
+/*
+Local Variables:
+c-indent-level: 8
+c-continued-statement-offset: 8
+c-brace-offset: -8
+c-argdecl-indent: 8
+c-label-offset: -8
+c-tab-always-indent: nil
+End:
+*/
diff --git a/src/devices/xditview/parse.h b/src/devices/xditview/parse.h
new file mode 100644
index 0000000..636f3a6
--- /dev/null
+++ b/src/devices/xditview/parse.h
@@ -0,0 +1 @@
+int ParseInput(register DviWidget dw);
diff --git a/src/devices/xditview/xdit.bm b/src/devices/xditview/xdit.bm
new file mode 100644
index 0000000..0c7aa8c
--- /dev/null
+++ b/src/devices/xditview/xdit.bm
@@ -0,0 +1,14 @@
+#define xdit_width 32
+#define xdit_height 32
+static unsigned char xdit_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03, 0x02, 0x00, 0x00, 0x02,
+ 0x8a, 0xa2, 0xfc, 0x03, 0x52, 0x14, 0x03, 0x04, 0x02, 0x80, 0x00, 0x08,
+ 0x52, 0x54, 0x00, 0x10, 0x8a, 0x22, 0x8f, 0x23, 0x02, 0x20, 0x06, 0x21,
+ 0x8a, 0x12, 0x8c, 0x40, 0x52, 0x14, 0x8c, 0x40, 0x02, 0x10, 0x58, 0x40,
+ 0x52, 0x14, 0x30, 0x40, 0x8a, 0x12, 0x30, 0x40, 0x02, 0x10, 0x70, 0x40,
+ 0x8a, 0x12, 0xc8, 0x40, 0x52, 0x24, 0xc4, 0xe0, 0x02, 0x20, 0x84, 0xe1,
+ 0x52, 0x54, 0xce, 0xf3, 0x8a, 0xa2, 0x00, 0xf8, 0x02, 0x00, 0x03, 0xfc,
+ 0x8a, 0x22, 0xfc, 0xf3, 0x52, 0x14, 0x00, 0xc2, 0x02, 0x00, 0x00, 0x02,
+ 0x52, 0x14, 0x45, 0x02, 0x8a, 0xa2, 0x28, 0x02, 0x02, 0x00, 0x00, 0x02,
+ 0x02, 0x00, 0x00, 0x02, 0xfe, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/src/devices/xditview/xdit_mask.bm b/src/devices/xditview/xdit_mask.bm
new file mode 100644
index 0000000..a584629
--- /dev/null
+++ b/src/devices/xditview/xdit_mask.bm
@@ -0,0 +1,14 @@
+#define xdit_mask_width 32
+#define xdit_mask_height 32
+static unsigned char xdit_mask_bits[] = {
+ 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x07,
+ 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0x1f,
+ 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xc7,
+ 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x07,
+ 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/src/devices/xditview/xditview.am b/src/devices/xditview/xditview.am
new file mode 100644
index 0000000..7bb32ba
--- /dev/null
+++ b/src/devices/xditview/xditview.am
@@ -0,0 +1,130 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+GXDITVIEWSOURCES = \
+ src/devices/xditview/device.c \
+ src/devices/xditview/draw.c \
+ src/devices/xditview/draw.h \
+ src/devices/xditview/Dvi.c \
+ src/devices/xditview/font.c \
+ src/devices/xditview/font.h \
+ src/devices/xditview/lex.c \
+ src/devices/xditview/lex.h \
+ src/devices/xditview/page.c \
+ src/devices/xditview/page.h \
+ src/devices/xditview/parse.c \
+ src/devices/xditview/parse.h \
+ src/devices/xditview/xditview.c \
+ src/devices/xditview/device.h \
+ src/devices/xditview/DviP.h \
+ src/devices/xditview/Menu.h \
+ src/devices/xditview/Dvi.h
+
+GXDITVIEW_GROFF_VERSION_H=src/devices/xditview/groff_version.h
+
+$(GXDITVIEW_GROFF_VERSION_H): $(top_srcdir)/.version
+ $(AM_V_at)$(MKDIR_P) `dirname $@`
+ $(AM_V_GEN)printf \
+ 'const char *Version_string = "%s";\n' '@VERSION@' > $@
+
+if WITHOUT_X11
+GXDITVIEW_MAN1 =
+EXTRA_DIST += $(GXDITVIEWSOURCES)
+else
+GXDITVIEW_MAN1 = src/devices/xditview/gxditview.1
+xditview_srcdir = $(top_srcdir)/src/devices/xditview
+bin_PROGRAMS += gxditview
+gxditview_CPPFLAGS = $(AM_CPPFLAGS) $(X_CFLAGS) -Dlint \
+ -I$(top_builddir)/src/devices/xditview
+gxditview_LDADD = $(X_LIBS) $(X_PRE_LIBS) -lXaw -lXmu -lXt -lX11 \
+ $(X_EXTRA_LIBS) $(LIBM) libxutil.a lib/libgnu.a
+XDITVIEW_GENHDRS = \
+ src/devices/xditview/GXditview-ad.h \
+ $(GXDITVIEW_GROFF_VERSION_H)
+gxditview_SOURCES = $(GXDITVIEWSOURCES)
+nodist_gxditview_SOURCES = $(XDITVIEW_GENHDRS)
+CLEANFILES += $(XDITVIEW_GENHDRS)
+
+man1_MANS += $(GXDITVIEW_MAN1)
+
+# Because we defined gxditview_CPPFLAGS, automake renames all of
+# xditview's objects, adding an "gxditview-" prefix.
+src/devices/xditview/gxditview-device.$(OBJEXT): defs.h
+src/devices/xditview/gxditview-xditview.$(OBJEXT): $(XDITVIEW_GENHDRS)
+
+src/devices/xditview/GXditview-ad.h: $(xditview_srcdir)/GXditview.ad
+ $(AM_V_GEN)$(SHELL) $(xditview_srcdir)/ad2c \
+ $(xditview_srcdir)/GXditview.ad > $@
+endif
+
+EXTRA_DIST += \
+ src/devices/xditview/ad2c \
+ src/devices/xditview/ChangeLog \
+ src/devices/xditview/DESC.in \
+ src/devices/xditview/FontMap-X11 \
+ src/devices/xditview/GXditview-color.ad \
+ src/devices/xditview/GXditview.ad \
+ src/devices/xditview/README \
+ src/devices/xditview/TODO \
+ src/devices/xditview/gray1.bm \
+ src/devices/xditview/gray2.bm \
+ src/devices/xditview/gray3.bm \
+ src/devices/xditview/gray4.bm \
+ src/devices/xditview/gray5.bm \
+ src/devices/xditview/gray6.bm \
+ src/devices/xditview/gray7.bm \
+ src/devices/xditview/gray8.bm \
+ src/devices/xditview/xdit.bm \
+ src/devices/xditview/xdit_mask.bm \
+ src/devices/xditview/gxditview.1.man
+
+# Custom installation of GXditview.ad and GXditview-color.ad
+install-data-local: install_xditview
+uninstall-local: uninstall_xditview
+
+if WITHOUT_X11
+install_xditview:
+uninstall_xditview:
+else
+install_xditview: \
+ $(xditview_srcdir)/FontMap-X11 \
+ $(xditview_srcdir)/GXditview.ad \
+ $(xditview_srcdir)/GXditview-color.ad
+ $(MKDIR_P) $(DESTDIR)$(fontdir)
+ $(INSTALL_DATA) $(xditview_srcdir)/FontMap-X11 \
+ $(DESTDIR)$(fontdir)/FontMap-X11
+ -test -d $(DESTDIR)$(appdefdir) \
+ || $(mkinstalldirs) $(DESTDIR)$(appdefdir)
+ $(INSTALL_DATA) $(xditview_srcdir)/GXditview.ad \
+ $(DESTDIR)$(appdefdir)/GXditview
+ $(INSTALL_DATA) $(xditview_srcdir)/GXditview-color.ad \
+ $(DESTDIR)$(appdefdir)/GXditview-color
+
+uninstall_xditview:
+ rm -f $(DESTDIR)$(appdefdir)/GXditview
+ rm -f $(DESTDIR)$(appdefdir)/GXditview-color
+ rm -f $(DESTDIR)$(fontdir)/FontMap-X11
+ -rmdir $(DESTDIR)$(fontdir) 2>/dev/null
+
+endif
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/devices/xditview/xditview.c b/src/devices/xditview/xditview.c
new file mode 100644
index 0000000..1f56940
--- /dev/null
+++ b/src/devices/xditview/xditview.c
@@ -0,0 +1,684 @@
+/*
+ * Copyright 1991 Massachusetts Institute of Technology
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of M.I.T. not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. M.I.T. makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/*
+ * xditview --
+ *
+ * Display ditroff output in an X window
+ */
+
+#ifndef SABER
+#ifndef lint
+static char rcsid[] = "$XConsortium: xditview.c,v 1.17 89/12/10 17:05:08 rws Exp $";
+#endif /* lint */
+#endif /* SABER */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <X11/Xatom.h>
+#include <X11/Xlib.h>
+#include <X11/Xos.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h>
+#include <X11/Xaw/Paned.h>
+#include <X11/Xaw/Viewport.h>
+#include <X11/Xaw/Box.h>
+#include <X11/Xaw/Command.h>
+#include <X11/Xaw/Dialog.h>
+#include <X11/Xaw/Label.h>
+#include <X11/Xaw/SimpleMenu.h>
+#include <X11/Xaw/SmeBSB.h>
+
+#include <stdbool.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <stdio.h>
+
+#include "Dvi.h"
+#include "groff_version.h"
+
+#include "xdit.bm"
+#include "xdit_mask.bm"
+
+#ifdef NEED_DECLARATION_POPEN
+FILE *popen(const char *, const char *);
+#endif /* NEED_DECLARATION_POPEN */
+
+#ifdef NEED_DECLARATION_PCLOSE
+int pclose (FILE *);
+#endif /* NEED_DECLARATION_PCLOSE */
+
+typedef void (*MakePromptFunc)(const char *);
+
+static String fallback_resources[] = {
+#include "GXditview-ad.h"
+ NULL
+};
+
+static struct app_resources {
+ char *print_command;
+ char *filename;
+} app_resources;
+
+#define offset(field) XtOffset(struct app_resources *, field)
+
+/* Application resources. */
+
+static XtResource resources[] = {
+ {(String)"printCommand", (String)"PrintCommand", (String)XtRString,
+ sizeof(char*), offset(print_command), (String)XtRString, NULL},
+ {(String)"filename", (String)"Filename", (String)XtRString,
+ sizeof(char*), offset(filename), (String)XtRString, NULL},
+};
+
+#undef offset
+
+/* Command line options table. Only resources are entered here...there is a
+ pass over the remaining options after XrmParseCommand is let loose. */
+
+static XrmOptionDescRec options[] = {
+{(char *)"-page", (char *)"*dvi.pageNumber",
+ XrmoptionSepArg, NULL},
+{(char *)"-backingStore", (char *)"*dvi.backingStore",
+ XrmoptionSepArg, NULL},
+{(char *)"-resolution", (char *)"*dvi.resolution",
+ XrmoptionSepArg, NULL},
+{(char *)"-printCommand", (char *)".printCommand",
+ XrmoptionSepArg, NULL},
+{(char *)"-filename", (char *)".filename",
+ XrmoptionSepArg, NULL},
+{(char *)"-noPolyText", (char *)"*dvi.noPolyText",
+ XrmoptionNoArg, (XPointer)"TRUE"},
+};
+
+static char current_print_command[1024];
+
+static char current_file_name[1024];
+static FILE *current_file;
+
+/*
+ * Report the syntax for calling xditview.
+ */
+
+static void
+Syntax(const char *progname, bool had_error)
+{
+ FILE *stream = stdout;
+ if (had_error)
+ stream = stderr;
+ (void) fprintf (stream, "usage: %s [X-toolkit-option]"
+ " [-backingStore backing-store-type]"
+ " [-filename file]"
+// See draw.c:FlushCharCache().
+#if 0
+ " [-noPolyText]"
+#endif
+ " [-page page-number]"
+ " [-printCommand command]"
+ " [-resolution resolution]"
+ " [file]\n", progname);
+ (void) fprintf (stream, "usage: %s {-version | --version}\n",
+ progname);
+ (void) fprintf (stream, "usage: %s {-help | --help}\n",
+ progname);
+ if (had_error)
+ exit(EXIT_FAILURE);
+ else
+ exit(EXIT_SUCCESS);
+}
+
+static void NewFile (const char *);
+static void SetPageNumber (int);
+static Widget toplevel, paned, viewport, dvi;
+static Widget page;
+static Widget simpleMenu;
+
+static void NextPage(Widget, XtPointer, XtPointer);
+static void PreviousPage(Widget, XtPointer, XtPointer);
+static void SelectPage(Widget, XtPointer, XtPointer);
+static void OpenFile(Widget, XtPointer, XtPointer);
+static void Quit(Widget, XtPointer, XtPointer);
+static void Print(Widget, XtPointer, XtPointer);
+
+static struct menuEntry {
+ const char *name;
+ XtCallbackProc function;
+} menuEntries[] = {
+ {"nextPage", NextPage},
+ {"previousPage", PreviousPage},
+ {"selectPage", SelectPage},
+ {"print", Print},
+ {"openFile", OpenFile},
+ {"quit", Quit},
+};
+
+static void NextPageAction(Widget, XEvent *, String *, Cardinal *);
+static void PreviousPageAction(Widget, XEvent *, String *, Cardinal *);
+static void SelectPageAction(Widget, XEvent *, String *, Cardinal *);
+static void OpenFileAction(Widget, XEvent *, String *, Cardinal *);
+static void QuitAction(Widget, XEvent *, String *, Cardinal *);
+static void AcceptAction(Widget, XEvent *, String *, Cardinal *);
+static void CancelAction(Widget, XEvent *, String *, Cardinal *);
+static void PrintAction(Widget, XEvent *, String *, Cardinal *);
+static void RerasterizeAction(Widget, XEvent *, String *, Cardinal *);
+
+static void MakePrompt(Widget, const char *, MakePromptFunc, const char *);
+
+XtActionsRec xditview_actions[] = {
+ {(String)"NextPage", NextPageAction},
+ {(String)"PreviousPage", PreviousPageAction},
+ {(String)"SelectPage", SelectPageAction},
+ {(String)"Print", PrintAction},
+ {(String)"OpenFile", OpenFileAction},
+ {(String)"Rerasterize", RerasterizeAction},
+ {(String)"Quit", QuitAction},
+ {(String)"Accept", AcceptAction},
+ {(String)"Cancel", CancelAction},
+};
+
+#define MenuNextPage 0
+#define MenuPreviousPage 1
+#define MenuSelectPage 2
+#define MenuPrint 3
+#define MenuOpenFile 4
+#define MenuQuit 5
+
+static char pageLabel[256] = "Page <none>";
+
+int main(int argc, char **argv)
+{
+ char *file_name = 0;
+ Cardinal i;
+ static Arg labelArgs[] = {
+ {XtNlabel, (XtArgVal) pageLabel},
+ };
+ XtAppContext xtcontext;
+ Arg topLevelArgs[2];
+ Widget entry;
+ Arg pageNumberArgs[1];
+ int page_number;
+
+ toplevel = XtAppInitialize(&xtcontext, "GXditview",
+ options, XtNumber (options),
+ &argc, argv, fallback_resources, NULL, 0);
+ if (argc > 2)
+ Syntax(argv[0], true /* had error */);
+ else if (argc == 2) {
+ if ((strcmp(argv[1], "-help") == 0)
+ || (strcmp(argv[1], "--help") == 0))
+ Syntax(argv[0], false /* did not have error */);
+ else if ((strcmp(argv[1], "-version") == 0)
+ || (strcmp(argv[1], "--version") == 0)) {
+ (void) printf("GNU gxditview (groff) version %s\n",
+ Version_string);
+ exit(EXIT_SUCCESS);
+ }
+ }
+
+ XtGetApplicationResources(toplevel, (XtPointer)&app_resources,
+ resources, XtNumber(resources),
+ NULL, (Cardinal) 0);
+ if (app_resources.print_command)
+ strcpy(current_print_command, app_resources.print_command);
+
+ XtAppAddActions(xtcontext, xditview_actions, XtNumber (xditview_actions));
+
+ XtSetArg (topLevelArgs[0], XtNiconPixmap,
+ XCreateBitmapFromData (XtDisplay (toplevel),
+ XtScreen(toplevel)->root,
+ (char *)xdit_bits,
+ xdit_width, xdit_height));
+
+ XtSetArg (topLevelArgs[1], XtNiconMask,
+ XCreateBitmapFromData (XtDisplay (toplevel),
+ XtScreen(toplevel)->root,
+ (char *)xdit_mask_bits,
+ xdit_mask_width, xdit_mask_height));
+ XtSetValues (toplevel, topLevelArgs, 2);
+ if (argc > 1)
+ file_name = argv[1];
+
+ /*
+ * create the menu and insert the entries
+ */
+ simpleMenu = XtCreatePopupShell ("menu", simpleMenuWidgetClass, toplevel,
+ NULL, 0);
+ for (i = 0; i < XtNumber (menuEntries); i++) {
+ entry = XtCreateManagedWidget(menuEntries[i].name,
+ smeBSBObjectClass, simpleMenu,
+ NULL, (Cardinal) 0);
+ XtAddCallback(entry, XtNcallback, menuEntries[i].function, NULL);
+ }
+
+ paned = XtCreateManagedWidget("paned", panedWidgetClass, toplevel,
+ NULL, (Cardinal) 0);
+ viewport = XtCreateManagedWidget("viewport", viewportWidgetClass, paned,
+ NULL, (Cardinal) 0);
+ dvi = XtCreateManagedWidget ("dvi", dviWidgetClass, viewport, NULL, 0);
+ page = XtCreateManagedWidget ("label", labelWidgetClass, paned,
+ labelArgs, XtNumber (labelArgs));
+ XtSetArg (pageNumberArgs[0], XtNpageNumber, &page_number);
+ XtGetValues (dvi, pageNumberArgs, 1);
+ if (file_name)
+ NewFile (file_name);
+ /* NewFile modifies current_file_name, so do this here. */
+ if (app_resources.filename)
+ strcpy(current_file_name, app_resources.filename);
+ XtRealizeWidget (toplevel);
+ if (file_name)
+ SetPageNumber (page_number);
+ XtInstallAllAccelerators(paned,paned);
+ XtAppMainLoop(xtcontext);
+ return 0;
+}
+
+static void
+SetPageNumber (int number)
+{
+ Arg arg[2];
+ int actual_number, last_page;
+
+ XtSetArg (arg[0], XtNpageNumber, number);
+ XtSetValues (dvi, arg, 1);
+ XtSetArg (arg[0], XtNpageNumber, &actual_number);
+ XtSetArg (arg[1], XtNlastPageNumber, &last_page);
+ XtGetValues (dvi, arg, 2);
+ if (actual_number == 0)
+ sprintf (pageLabel, "Page <none>");
+ else if (last_page > 0)
+ sprintf (pageLabel, "Page %d of %d", actual_number, last_page);
+ else
+ sprintf (pageLabel, "Page %d", actual_number);
+ XtSetArg (arg[0], XtNlabel, pageLabel);
+ XtSetValues (page, arg, 1);
+}
+
+static void
+SelectPageNumber (const char *number_string)
+{
+ SetPageNumber (atoi(number_string));
+}
+
+static int hadFile = 0;
+
+static void
+NewFile (const char *name)
+{
+ Arg arg[2];
+ char *n;
+ FILE *new_file;
+ Boolean seek = 0;
+
+ if (current_file) {
+ if (!strcmp (current_file_name, "-"))
+ ;
+ else if (current_file_name[0] == '|')
+ pclose (current_file);
+ else
+ fclose (current_file);
+ }
+ if (!strcmp (name, "-"))
+ new_file = stdin;
+ else if (name[0] == '|')
+ new_file = popen (name+1, "r");
+ else {
+ new_file = fopen (name, "r");
+ seek = 1;
+ }
+ if (!new_file) {
+ /* XXX display error message */
+ return;
+ }
+ XtSetArg (arg[0], XtNfile, new_file);
+ XtSetArg (arg[1], XtNseek, seek);
+ XtSetValues (dvi, arg, 2);
+ if (hadFile || name[0] != '-' || name[1] != '\0') {
+ XtSetArg (arg[0], XtNtitle, name);
+ if (name[0] != '/' && (n = strrchr (name, '/')))
+ n = n + 1;
+ else
+ n = (char *)name;
+ XtSetArg (arg[1], XtNiconName, n);
+ XtSetValues (toplevel, arg, 2);
+ }
+ hadFile = 1;
+ SelectPageNumber ("1");
+ strcpy (current_file_name, name);
+ current_file = new_file;
+}
+
+static char fileBuf[1024];
+
+static void
+ResetMenuEntry (Widget entry)
+{
+ Arg arg[1];
+
+ XtSetArg (arg[0], (String)XtNpopupOnEntry, entry);
+ XtSetValues (XtParent(entry) , arg, (Cardinal) 1);
+}
+
+/*ARGSUSED*/
+
+static void
+NextPage (Widget entry, XtPointer name, XtPointer data)
+{
+ name = name; /* unused; suppress compiler warning */
+ data = data;
+
+ NextPageAction((Widget)NULL, (XEvent *) 0, (String *) 0, (Cardinal *) 0);
+ ResetMenuEntry (entry);
+}
+
+static void
+NextPageAction (Widget widget, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ Arg args[1];
+ int number;
+
+ XtSetArg (args[0], XtNpageNumber, &number);
+ XtGetValues (dvi, args, 1);
+ SetPageNumber (number+1);
+
+ widget = widget; /* unused; suppress compiler warning */
+ event = event;
+ params = params;
+ num_params = num_params;
+}
+
+/*ARGSUSED*/
+
+static void
+PreviousPage (Widget entry, XtPointer name, XtPointer data)
+{
+ name = name; /* unused; suppress compiler warning */
+ data = data;
+
+ PreviousPageAction ((Widget)NULL, (XEvent *) 0, (String *) 0,
+ (Cardinal *) 0);
+ ResetMenuEntry (entry);
+}
+
+static void
+PreviousPageAction (Widget widget, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ Arg args[1];
+ int number;
+
+ XtSetArg (args[0], XtNpageNumber, &number);
+ XtGetValues (dvi, args, 1);
+ SetPageNumber (number-1);
+
+ widget = widget; /* unused; suppress compiler warning */
+ event = event;
+ params = params;
+ num_params = num_params;
+}
+
+/* ARGSUSED */
+
+static void
+SelectPage (Widget entry, XtPointer name, XtPointer data)
+{
+ name = name; /* unused; suppress compiler warning */
+ data = data;
+
+ SelectPageAction ((Widget)NULL, (XEvent *) 0, (String *) 0,
+ (Cardinal *) 0);
+ ResetMenuEntry (entry);
+}
+
+static void
+SelectPageAction (Widget widget, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ widget = widget; /* unused; suppress compiler warning */
+ event = event;
+ params = params;
+ num_params = num_params;
+
+ MakePrompt (toplevel, "Page number", SelectPageNumber, "");
+}
+
+
+static void
+DoPrint (const char *name)
+{
+ FILE *print_file;
+ RETSIGTYPE (*handler)(int);
+
+ /* Avoid dying because of an invalid command. */
+ handler = signal(SIGPIPE, SIG_IGN);
+
+ print_file = popen(name, "w");
+ if (!print_file)
+ /* XXX print error message */
+ return;
+ DviSaveToFile(dvi, print_file);
+ pclose(print_file);
+ signal(SIGPIPE, handler);
+ strcpy(current_print_command, name);
+}
+
+static void
+RerasterizeAction (Widget widget, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ Arg args[1];
+ int number;
+
+ if (current_file_name[0] == 0) {
+ /* XXX display an error message */
+ return;
+ }
+ XtSetArg (args[0], XtNpageNumber, &number);
+ XtGetValues (dvi, args, 1);
+ NewFile(current_file_name);
+ SetPageNumber (number);
+
+ widget = widget; /* unused; suppress compiler warning */
+ event = event;
+ params = params;
+ num_params = num_params;
+}
+
+/* ARGSUSED */
+
+static void
+Print (Widget entry, XtPointer name, XtPointer data)
+{
+ name = name; /* unused; suppress compiler warning */
+ data = data;
+
+ PrintAction ((Widget)NULL, (XEvent *) 0, (String *) 0, (Cardinal *) 0);
+ ResetMenuEntry (entry);
+}
+
+static void
+PrintAction (Widget widget, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ widget = widget; /* unused; suppress compiler warning */
+ event = event;
+ params = params;
+ num_params = num_params;
+
+ if (current_print_command[0])
+ strcpy (fileBuf, current_print_command);
+ else
+ fileBuf[0] = '\0';
+ MakePrompt (toplevel, "Print command:", DoPrint, fileBuf);
+}
+
+
+/* ARGSUSED */
+
+static void
+OpenFile (Widget entry, XtPointer name, XtPointer data)
+{
+ name = name; /* unused; suppress compiler warning */
+ data = data;
+
+ OpenFileAction ((Widget)NULL, (XEvent *) 0, (String *) 0, (Cardinal *) 0);
+ ResetMenuEntry (entry);
+}
+
+static void
+OpenFileAction (Widget widget, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ widget = widget; /* unused; suppress compiler warning */
+ event = event;
+ params = params;
+ num_params = num_params;
+
+ if (current_file_name[0])
+ strcpy (fileBuf, current_file_name);
+ else
+ fileBuf[0] = '\0';
+ MakePrompt (toplevel, "File to open:", NewFile, fileBuf);
+}
+
+/* ARGSUSED */
+
+static void
+Quit (Widget entry, XtPointer closure, XtPointer data)
+{
+ entry = entry; /* unused; suppress compiler warning */
+ closure = closure;
+ data = data;
+
+ QuitAction ((Widget)NULL, (XEvent *) 0, (String *) 0, (Cardinal *) 0);
+}
+
+static void
+QuitAction (Widget widget, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ widget = widget; /* unused; suppress compiler warning */
+ event = event;
+ params = params;
+ num_params = num_params;
+
+ exit (0);
+}
+
+Widget promptShell, promptDialog;
+MakePromptFunc promptfunction;
+
+/* ARGSUSED */
+static
+void CancelAction (Widget widget, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ widget = widget; /* unused; suppress compiler warning */
+ event = event;
+ params = params;
+ num_params = num_params;
+
+ if (promptShell) {
+ XtSetKeyboardFocus(toplevel, (Widget) None);
+ XtDestroyWidget(promptShell);
+ promptShell = (Widget) 0;
+ }
+}
+
+static
+void AcceptAction (Widget widget, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ (*promptfunction)(XawDialogGetValueString(promptDialog));
+ CancelAction (widget, event, params, num_params);
+}
+
+static void
+MakePrompt(Widget centerw, const char *prompt,
+ MakePromptFunc func, const char *def)
+{
+ static Arg dialogArgs[] = {
+ {XtNlabel, 0},
+ {XtNvalue, 0},
+ };
+ Arg valueArgs[1];
+ Arg centerArgs[2];
+ Position source_x, source_y;
+ Position dest_x, dest_y;
+ Dimension center_width, center_height;
+ Dimension prompt_width, prompt_height;
+ Widget valueWidget;
+
+ CancelAction ((Widget)NULL, (XEvent *) 0, (String *) 0, (Cardinal *) 0);
+ promptShell = XtCreatePopupShell ("promptShell", transientShellWidgetClass,
+ toplevel, NULL, (Cardinal) 0);
+ dialogArgs[0].value = (XtArgVal)prompt;
+ dialogArgs[1].value = (XtArgVal)def;
+ promptDialog = XtCreateManagedWidget( "promptDialog", dialogWidgetClass,
+ promptShell, dialogArgs, XtNumber (dialogArgs));
+ XawDialogAddButton(promptDialog, "accept", NULL, (XtPointer) 0);
+ XawDialogAddButton(promptDialog, "cancel", NULL, (XtPointer) 0);
+ valueWidget = XtNameToWidget (promptDialog, "value");
+ if (valueWidget) {
+ XtSetArg (valueArgs[0], (String)XtNresizable, TRUE);
+ XtSetValues (valueWidget, valueArgs, 1);
+ /*
+ * as resizable isn't set until just above, the
+ * default value will be displayed incorrectly.
+ * rectify the situation by resetting the values
+ */
+ XtSetValues (promptDialog, dialogArgs, XtNumber (dialogArgs));
+ }
+ XtSetKeyboardFocus (promptDialog, valueWidget);
+ XtSetKeyboardFocus (toplevel, valueWidget);
+ XtRealizeWidget (promptShell);
+ /*
+ * place the widget in the center of the "parent"
+ */
+ XtSetArg (centerArgs[0], XtNwidth, &center_width);
+ XtSetArg (centerArgs[1], XtNheight, &center_height);
+ XtGetValues (centerw, centerArgs, 2);
+ XtSetArg (centerArgs[0], XtNwidth, &prompt_width);
+ XtSetArg (centerArgs[1], XtNheight, &prompt_height);
+ XtGetValues (promptShell, centerArgs, 2);
+ source_x = (center_width - prompt_width) / 2;
+ source_y = (center_height - prompt_height) / 3;
+ XtTranslateCoords (centerw, source_x, source_y, &dest_x, &dest_y);
+ XtSetArg (centerArgs[0], XtNx, dest_x);
+ XtSetArg (centerArgs[1], XtNy, dest_y);
+ XtSetValues (promptShell, centerArgs, 2);
+ XtMapWidget(promptShell);
+ promptfunction = func;
+}
+
+/*
+Local Variables:
+c-indent-level: 4
+c-continued-statement-offset: 4
+c-brace-offset: -4
+c-argdecl-indent: 4
+c-label-offset: -4
+c-tab-always-indent: nil
+End:
+*/
diff --git a/src/include/DviChar.h b/src/include/DviChar.h
new file mode 100644
index 0000000..1100d81
--- /dev/null
+++ b/src/include/DviChar.h
@@ -0,0 +1,55 @@
+/* -*- C -*- */
+/* Copyright (C) 2014-2020 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 of the License, 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 can find the license text at
+<http://www.gnu.org/licenses/gpl-2.0.txt>. */
+
+/*
+ * DviChar.h
+ *
+ * descriptions for mapping dvi names to
+ * font indexes and back. Dvi fonts are all
+ * 256 elements (actually only 256-32 are usable).
+ *
+ * The encoding names are taken from X -
+ * case insensitive, a dash separating the
+ * CharSetRegistry from the CharSetEncoding
+ */
+
+# define DVI_MAX_SYNONYMS 10
+# define DVI_MAP_SIZE 256
+# define DVI_HASH_SIZE 256
+
+typedef struct _dviCharNameHash {
+ struct _dviCharNameHash *next;
+ const char *name;
+ int position;
+} DviCharNameHash;
+
+typedef struct _dviCharNameMap {
+ const char *encoding;
+ int special;
+ const char *dvi_names[DVI_MAP_SIZE][DVI_MAX_SYNONYMS];
+ DviCharNameHash *buckets[DVI_HASH_SIZE];
+} DviCharNameMap;
+
+DviCharNameMap *DviFindMap (char *);
+void DviRegisterMap (DviCharNameMap *);
+#ifdef NOTDEF
+char *DviCharName (DviCharNameMap *, int, int);
+#else
+#define DviCharName(map,index,synonym) ((map)->dvi_names[index][synonym])
+#endif
+int DviCharIndex (DviCharNameMap *, const char *);
diff --git a/src/include/XFontName.h b/src/include/XFontName.h
new file mode 100644
index 0000000..4e9c694
--- /dev/null
+++ b/src/include/XFontName.h
@@ -0,0 +1,50 @@
+typedef struct _xFontName {
+ char Registry[256];
+ char Foundry[256];
+ char FamilyName[256];
+ char WeightName[256];
+ char Slant[3];
+ char SetwidthName[256];
+ char AddStyleName[256];
+ unsigned int PixelSize;
+ unsigned int PointSize;
+ unsigned int ResolutionX;
+ unsigned int ResolutionY;
+ char Spacing[2];
+ unsigned int AverageWidth;
+ char CharSetRegistry[256];
+ char CharSetEncoding[256];
+} XFontName;
+
+#define FontNameRegistry (1<<0)
+#define FontNameFoundry (1<<1)
+#define FontNameFamilyName (1<<2)
+#define FontNameWeightName (1<<3)
+#define FontNameSlant (1<<4)
+#define FontNameSetwidthName (1<<5)
+#define FontNameAddStyleName (1<<6)
+#define FontNamePixelSize (1<<7)
+#define FontNamePointSize (1<<8)
+#define FontNameResolutionX (1<<9)
+#define FontNameResolutionY (1<<10)
+#define FontNameSpacing (1<<11)
+#define FontNameAverageWidth (1<<12)
+#define FontNameCharSetRegistry (1<<13)
+#define FontNameCharSetEncoding (1<<14)
+
+#define SlantRoman "R"
+#define SlantItalic "I"
+#define SlantOblique "O"
+#define SlantReverseItalic "RI"
+#define SlantReverseOblique "RO"
+
+#define SpacingMonoSpaced "M"
+#define SpacingProportional "P"
+#define SpacingCharacterCell "C"
+
+typedef char *XFontNameString;
+
+Bool XParseFontName (XFontNameString, XFontName *, unsigned int *);
+Bool XFormatFontName (XFontName *, unsigned int, XFontNameString);
+Bool XCompareFontName (XFontName *, XFontName *, unsigned int);
+Bool XCopyFontName (XFontName *, XFontName *, unsigned int);
diff --git a/src/include/cmap.h b/src/include/cmap.h
new file mode 100644
index 0000000..3a62da1
--- /dev/null
+++ b/src/include/cmap.h
@@ -0,0 +1,55 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef UCHAR_MAX
+#define UCHAR_MAX 255
+#endif
+
+enum cmap_builtin { CMAP_BUILTIN };
+
+class cmap {
+public:
+ cmap();
+ cmap(cmap_builtin);
+ int operator()(unsigned char) const;
+ unsigned char &operator[](unsigned char);
+
+ friend class cmap_init;
+private:
+ unsigned char v[UCHAR_MAX+1];
+};
+
+inline int cmap::operator()(unsigned char c) const
+{
+ return v[c];
+}
+
+inline unsigned char &cmap::operator[](unsigned char c)
+{
+ return v[c];
+}
+
+extern cmap cmlower;
+extern cmap cmupper;
+
+static class cmap_init {
+ static int initialised;
+public:
+ cmap_init();
+} _cmap_init;
diff --git a/src/include/color.h b/src/include/color.h
new file mode 100644
index 0000000..e3f945b
--- /dev/null
+++ b/src/include/color.h
@@ -0,0 +1,88 @@
+// -*- C++ -*-
+/* <groff_src_dir>/src/include/color.h
+Copyright (C) 2001-2020 Free Software Foundation, Inc.
+ Written by Gaius Mulley <gaius@glam.ac.uk>
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stddef.h>
+#include "symbol.h"
+
+enum color_scheme {DEFAULT, CMY, CMYK, RGB, GRAY};
+
+class color {
+private:
+ color_scheme scheme;
+ unsigned int components[4];
+ color *next;
+
+ int read_encoding(const color_scheme, const char * const,
+ const size_t);
+
+public:
+ symbol nm;
+ enum {MAX_COLOR_VAL = 0xffff};
+ color(symbol s = default_symbol) : scheme(DEFAULT), nm(s) {}
+ color(const color * const);
+ ~color();
+
+ int operator==(const color & c) const;
+ int operator!=(const color & c) const;
+
+ int is_default() { return scheme == DEFAULT; }
+
+ // set color from given color component values
+ void set_default();
+ void set_rgb(const unsigned int r, const unsigned int g,
+ const unsigned int b);
+ void set_cmy(const unsigned int c, const unsigned int m,
+ const unsigned int y);
+ void set_cmyk(const unsigned int c, const unsigned int m,
+ const unsigned int y, const unsigned int k);
+ void set_gray(const unsigned int g);
+
+ // set color from a color string
+ int read_rgb(const char * const s);
+ int read_cmy(const char * const s);
+ int read_cmyk(const char * const s);
+ int read_gray(const char * const s);
+
+ // Return the actual color scheme and retrieve the color components
+ // into a predefined vector (of length at least 4).
+ color_scheme get_components(unsigned int *c) const;
+
+ // retrieve the components of a color
+ void get_rgb(unsigned int *r, unsigned int *g, unsigned int *b) const;
+ void get_cmy(unsigned int *c, unsigned int *m, unsigned int *y) const;
+ void get_cmyk(unsigned int *c, unsigned int *m,
+ unsigned int *y, unsigned int *k) const;
+ void get_gray(unsigned int *g) const;
+
+ char *print_color();
+};
+
+#define Cyan components[0]
+#define Magenta components[1]
+#define Yellow components[2]
+#define Black components[3]
+
+#define Red components[0]
+#define Green components[1]
+#define Blue components[2]
+
+#define Gray components[0]
+
+extern color default_color;
diff --git a/src/include/config.hin b/src/include/config.hin
new file mode 100644
index 0000000..374b4c6
--- /dev/null
+++ b/src/include/config.hin
@@ -0,0 +1,1584 @@
+/* src/include/config.hin. Generated from configure.ac by autoheader. */
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* Define to the number of bits in type 'ptrdiff_t'. */
+#undef BITSIZEOF_PTRDIFF_T
+
+/* Define to the number of bits in type 'sig_atomic_t'. */
+#undef BITSIZEOF_SIG_ATOMIC_T
+
+/* Define to the number of bits in type 'size_t'. */
+#undef BITSIZEOF_SIZE_T
+
+/* Define to the number of bits in type 'wchar_t'. */
+#undef BITSIZEOF_WCHAR_T
+
+/* Define to the number of bits in type 'wint_t'. */
+#undef BITSIZEOF_WINT_T
+
+/* Define if you wish *printf() functions that have a safe handling of
+ non-IEEE-754 'long double' values. */
+#undef CHECK_PRINTF_SAFE
+
+/* Define to 1 if using 'alloca.c'. */
+#undef C_ALLOCA
+
+/* Define as the bit index in the word where to find bit 0 of the exponent of
+ 'double'. */
+#undef DBL_EXPBIT0_BIT
+
+/* Define as the word index where to find the exponent of 'double'. */
+#undef DBL_EXPBIT0_WORD
+
+/* Define as the bit index in the word where to find the sign of 'double'. */
+#undef DBL_SIGNBIT_BIT
+
+/* Define as the word index where to find the sign of 'double'. */
+#undef DBL_SIGNBIT_WORD
+
+/* Define as the bit index in the word where to find bit 0 of the exponent of
+ 'float'. */
+#undef FLT_EXPBIT0_BIT
+
+/* Define as the word index where to find the exponent of 'float'. */
+#undef FLT_EXPBIT0_WORD
+
+/* Define as the bit index in the word where to find the sign of 'float'. */
+#undef FLT_SIGNBIT_BIT
+
+/* Define as the word index where to find the sign of 'float'. */
+#undef FLT_SIGNBIT_WORD
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module fscanf shall be considered present. */
+#undef GNULIB_FSCANF
+
+/* Define to 1 if printf and friends should be labeled with attribute
+ "__gnu_printf__" instead of "__printf__" */
+#undef GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module scanf shall be considered present. */
+#undef GNULIB_SCANF
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module snprintf shall be considered present. */
+#undef GNULIB_SNPRINTF
+
+/* Define to 1 when the gnulib module fgetc should be tested. */
+#undef GNULIB_TEST_FGETC
+
+/* Define to 1 when the gnulib module fgets should be tested. */
+#undef GNULIB_TEST_FGETS
+
+/* Define to 1 when the gnulib module fprintf should be tested. */
+#undef GNULIB_TEST_FPRINTF
+
+/* Define to 1 when the gnulib module fprintf-posix should be tested. */
+#undef GNULIB_TEST_FPRINTF_POSIX
+
+/* Define to 1 when the gnulib module fputc should be tested. */
+#undef GNULIB_TEST_FPUTC
+
+/* Define to 1 when the gnulib module fputs should be tested. */
+#undef GNULIB_TEST_FPUTS
+
+/* Define to 1 when the gnulib module fread should be tested. */
+#undef GNULIB_TEST_FREAD
+
+/* Define to 1 when the gnulib module free-posix should be tested. */
+#undef GNULIB_TEST_FREE_POSIX
+
+/* Define to 1 when the gnulib module frexp should be tested. */
+#undef GNULIB_TEST_FREXP
+
+/* Define to 1 when the gnulib module frexpl should be tested. */
+#undef GNULIB_TEST_FREXPL
+
+/* Define to 1 when the gnulib module fscanf should be tested. */
+#undef GNULIB_TEST_FSCANF
+
+/* Define to 1 when the gnulib module fwrite should be tested. */
+#undef GNULIB_TEST_FWRITE
+
+/* Define to 1 when the gnulib module getc should be tested. */
+#undef GNULIB_TEST_GETC
+
+/* Define to 1 when the gnulib module getchar should be tested. */
+#undef GNULIB_TEST_GETCHAR
+
+/* Define to 1 when the gnulib module memchr should be tested. */
+#undef GNULIB_TEST_MEMCHR
+
+/* Define to 1 when the gnulib module printf should be tested. */
+#undef GNULIB_TEST_PRINTF
+
+/* Define to 1 when the gnulib module putc should be tested. */
+#undef GNULIB_TEST_PUTC
+
+/* Define to 1 when the gnulib module putchar should be tested. */
+#undef GNULIB_TEST_PUTCHAR
+
+/* Define to 1 when the gnulib module puts should be tested. */
+#undef GNULIB_TEST_PUTS
+
+/* Define to 1 when the gnulib module scanf should be tested. */
+#undef GNULIB_TEST_SCANF
+
+/* Define to 1 when the gnulib module signbit should be tested. */
+#undef GNULIB_TEST_SIGNBIT
+
+/* Define to 1 when the gnulib module snprintf should be tested. */
+#undef GNULIB_TEST_SNPRINTF
+
+/* Define to 1 when the gnulib module vfprintf should be tested. */
+#undef GNULIB_TEST_VFPRINTF
+
+/* Define to 1 when the gnulib module vprintf should be tested. */
+#undef GNULIB_TEST_VPRINTF
+
+/* Define to 1 when the gnulib module vsnprintf should be tested. */
+#undef GNULIB_TEST_VSNPRINTF
+
+/* Define to 1 when the gnulib module wcwidth should be tested. */
+#undef GNULIB_TEST_WCWIDTH
+
+/* Define to 1 if you have 'alloca' after including <alloca.h>, a header that
+ may be supplied by this distribution. */
+#undef HAVE_ALLOCA
+
+/* Define to 1 if <alloca.h> works. */
+#undef HAVE_ALLOCA_H
+
+/* Define to 1 if you have the <bp-sym.h> header file. */
+#undef HAVE_BP_SYM_H
+
+/* Define if you have a C++ <inttypes.h>. */
+#undef HAVE_CC_INTTYPES_H
+
+/* Define if you have a C++ <limits.h>. */
+#undef HAVE_CC_LIMITS_H
+
+/* Define if you have a C++ <osfcn.h>. */
+#undef HAVE_CC_OSFCN_H
+
+/* Define if the copysignf function is declared in <math.h> and available in
+ libc. */
+#undef HAVE_COPYSIGNF_IN_LIBC
+
+/* Define if the copysignl function is declared in <math.h> and available in
+ libc. */
+#undef HAVE_COPYSIGNL_IN_LIBC
+
+/* Define if the copysign function is declared in <math.h> and available in
+ libc. */
+#undef HAVE_COPYSIGN_IN_LIBC
+
+/* Define to 1 if you have the <crtdefs.h> header file. */
+#undef HAVE_CRTDEFS_H
+
+/* Define to 1 if the static_assert keyword works. */
+#undef HAVE_C_STATIC_ASSERT
+
+/* Define to 1 if you have the declaration of `alarm', and to 0 if you don't.
+ */
+#undef HAVE_DECL_ALARM
+
+/* Define to 1 if you have the declaration of `copysign', and to 0 if you
+ don't. */
+#undef HAVE_DECL_COPYSIGN
+
+/* Define to 1 if you have the declaration of `copysignf', and to 0 if you
+ don't. */
+#undef HAVE_DECL_COPYSIGNF
+
+/* Define to 1 if you have the declaration of `copysignl', and to 0 if you
+ don't. */
+#undef HAVE_DECL_COPYSIGNL
+
+/* Define to 1 if you have the declaration of `ecvt', and to 0 if you don't.
+ */
+#undef HAVE_DECL_ECVT
+
+/* Define to 1 if you have the declaration of `execvpe', and to 0 if you
+ don't. */
+#undef HAVE_DECL_EXECVPE
+
+/* Define to 1 if you have the declaration of `fcloseall', and to 0 if you
+ don't. */
+#undef HAVE_DECL_FCLOSEALL
+
+/* Define to 1 if you have the declaration of `fcvt', and to 0 if you don't.
+ */
+#undef HAVE_DECL_FCVT
+
+/* Define to 1 if you have the declaration of `gcvt', and to 0 if you don't.
+ */
+#undef HAVE_DECL_GCVT
+
+/* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you
+ don't. */
+#undef HAVE_DECL_GETC_UNLOCKED
+
+/* Define to 1 if you have the declaration of `getw', and to 0 if you don't.
+ */
+#undef HAVE_DECL_GETW
+
+/* Define to 1 if you have the declaration of `putw', and to 0 if you don't.
+ */
+#undef HAVE_DECL_PUTW
+
+/* Define to 1 if you have the declaration of `snprintf', and to 0 if you
+ don't. */
+#undef HAVE_DECL_SNPRINTF
+
+/* Define to 1 if you have the declaration of `strsignal', and to 0 if you
+ don't. */
+#undef HAVE_DECL_STRSIGNAL
+
+/* Define to 1 if you have the declaration of `sys_siglist', and to 0 if you
+ don't. */
+#undef HAVE_DECL_SYS_SIGLIST
+
+/* Define to 1 if you have the declaration of `towlower', and to 0 if you
+ don't. */
+#undef HAVE_DECL_TOWLOWER
+
+/* Define to 1 if you have the declaration of `vsnprintf', and to 0 if you
+ don't. */
+#undef HAVE_DECL_VSNPRINTF
+
+/* Define to 1 if you have the declaration of `wcsdup', and to 0 if you don't.
+ */
+#undef HAVE_DECL_WCSDUP
+
+/* Define to 1 if you have the declaration of `wcwidth', and to 0 if you
+ don't. */
+#undef HAVE_DECL_WCWIDTH
+
+/* Define to 1 if you have the declaration of `_snprintf', and to 0 if you
+ don't. */
+#undef HAVE_DECL__SNPRINTF
+
+/* Define to 1 if you have the <direct.h> header file. */
+#undef HAVE_DIRECT_H
+
+/* Define to 1 if you have the <dirent.h> header file. */
+#undef HAVE_DIRENT_H
+
+/* Define to 1 if you have the <features.h> header file. */
+#undef HAVE_FEATURES_H
+
+/* Define to 1 if you have the `fmod' function. */
+#undef HAVE_FMOD
+
+/* Define if the 'free' function is guaranteed to preserve errno. */
+#undef HAVE_FREE_POSIX
+
+/* Define if the frexpl function is available in libc. */
+#undef HAVE_FREXPL_IN_LIBC
+
+/* Define if the frexp function is available in libc. */
+#undef HAVE_FREXP_IN_LIBC
+
+/* Define to 1 if you have the `getcwd' function. */
+#undef HAVE_GETCWD
+
+/* Define to 1 if you have the `getpagesize' function. */
+#undef HAVE_GETPAGESIZE
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define if you have the iconv() function and it works. */
+#undef HAVE_ICONV
+
+/* Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>. */
+#undef HAVE_INTMAX_T
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define if <inttypes.h> exists, doesn't clash with <sys/types.h>, and
+ declares uintmax_t. */
+#undef HAVE_INTTYPES_H_WITH_UINTMAX
+
+/* Define to 1 if you have the `isatty' function. */
+#undef HAVE_ISATTY
+
+/* Define if the isnan(double) function is available in libc. */
+#undef HAVE_ISNAND_IN_LIBC
+
+/* Define if the isnan(float) function is available in libc. */
+#undef HAVE_ISNANF_IN_LIBC
+
+/* Define if the isnan(long double) function is available in libc. */
+#undef HAVE_ISNANL_IN_LIBC
+
+/* Define to 1 if you have the `iswcntrl' function. */
+#undef HAVE_ISWCNTRL
+
+/* Define to 1 if you have the `kill' function. */
+#undef HAVE_KILL
+
+/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
+#undef HAVE_LANGINFO_CODESET
+
+/* Define if the ldexpl function is available in libc. */
+#undef HAVE_LDEXPL_IN_LIBC
+
+/* Define if the ldexp function is available in libc. */
+#undef HAVE_LDEXP_IN_LIBC
+
+/* Define to 1 if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define to 1 if the system has the type 'long long int'. */
+#undef HAVE_LONG_LONG_INT
+
+/* Define to 1 if mmap()'s MAP_ANONYMOUS flag is available after including
+ config.h and <sys/mman.h>. */
+#undef HAVE_MAP_ANONYMOUS
+
+/* Define to 1 if you have the <math.h> header file. */
+#undef HAVE_MATH_H
+
+/* Define to 1 if you have the `mbrtowc' function. */
+#undef HAVE_MBRTOWC
+
+/* Define to 1 if you have the <minix/config.h> header file. */
+#undef HAVE_MINIX_CONFIG_H
+
+/* Define if you have mkstemp(). */
+#undef HAVE_MKSTEMP
+
+/* Define to 1 if you have a working `mmap' system call. */
+#undef HAVE_MMAP
+
+/* Define to 1 if you have the `mprotect' function. */
+#undef HAVE_MPROTECT
+
+/* Define to 1 if you have the `nl_langinfo' function. */
+#undef HAVE_NL_LANGINFO
+
+/* Define to 1 if you have the <process.h> header file. */
+#undef HAVE_PROCESS_H
+
+/* Define to 1 if you have the `putenv' function. */
+#undef HAVE_PUTENV
+
+/* Define to 1 if you have the `rename' function. */
+#undef HAVE_RENAME
+
+/* Define to 1 if 'long double' and 'double' have the same representation. */
+#undef HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+/* Define to 1 if you have the `setlocale' function. */
+#undef HAVE_SETLOCALE
+
+/* Define to 1 if 'sig_atomic_t' is a signed integer type. */
+#undef HAVE_SIGNED_SIG_ATOMIC_T
+
+/* Define to 1 if 'wchar_t' is a signed integer type. */
+#undef HAVE_SIGNED_WCHAR_T
+
+/* Define to 1 if 'wint_t' is a signed integer type. */
+#undef HAVE_SIGNED_WINT_T
+
+/* Define to 1 if you have the `snprintf' function. */
+#undef HAVE_SNPRINTF
+
+/* Define if the return value of the snprintf function is the number of of
+ bytes (excluding the terminating NUL) that would have been produced if the
+ buffer had been large enough. */
+#undef HAVE_SNPRINTF_RETVAL_C99
+
+/* Define if the string produced by the snprintf function is always NUL
+ terminated. */
+#undef HAVE_SNPRINTF_TRUNCATION_C99
+
+/* Define to 1 if you have the <stdbool.h> header file. */
+#undef HAVE_STDBOOL_H
+
+/* Define to 1 if you have the <stddef.h> header file. */
+#undef HAVE_STDDEF_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define if <stdint.h> exists, doesn't clash with <sys/types.h>, and declares
+ uintmax_t. */
+#undef HAVE_STDINT_H_WITH_UINTMAX
+
+/* Define to 1 if you have the <stdio.h> header file. */
+#undef HAVE_STDIO_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#undef HAVE_STRCASECMP
+
+/* Define to 1 if you have the `strdup' function. */
+#undef HAVE_STRDUP
+
+/* Define to 1 if you have the `strerror' function. */
+#undef HAVE_STRERROR
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the `strncasecmp' function. */
+#undef HAVE_STRNCASECMP
+
+/* Define to 1 if you have the `strnlen' function. */
+#undef HAVE_STRNLEN
+
+/* Define to 1 if you have the `strsep' function. */
+#undef HAVE_STRSEP
+
+/* Define to 1 if you have the `strtol' function. */
+#undef HAVE_STRTOL
+
+/* Define if <math.h> defines struct exception. */
+#undef HAVE_STRUCT_EXCEPTION
+
+/* Define to 1 if you have the `symlink' function. */
+#undef HAVE_SYMLINK
+
+/* Define to 1 if you have the <sys/bitypes.h> header file. */
+#undef HAVE_SYS_BITYPES_H
+
+/* Define to 1 if you have the <sys/dir.h> header file. */
+#undef HAVE_SYS_DIR_H
+
+/* Define if you have sys_errlist in <errno.h>, <stdio.h>, or <stdlib.h>. */
+#undef HAVE_SYS_ERRLIST
+
+/* Define to 1 if you have the <sys/inttypes.h> header file. */
+#undef HAVE_SYS_INTTYPES_H
+
+/* Define to 1 if you have the <sys/mman.h> header file. */
+#undef HAVE_SYS_MMAN_H
+
+/* Define if you have sys_nerr in <errno.h>, <stdio.h>, or <stdio.h>. */
+#undef HAVE_SYS_NERR
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the `towlower' function. */
+#undef HAVE_TOWLOWER
+
+/* uchardet library availability */
+#undef HAVE_UCHARDET
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if the system has the type 'unsigned long long int'. */
+#undef HAVE_UNSIGNED_LONG_LONG_INT
+
+/* Define to 1 if you have the `vasnprintf' function. */
+#undef HAVE_VASNPRINTF
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#undef HAVE_VSNPRINTF
+
+/* Define to 1 if you have the <wchar.h> header file. */
+#undef HAVE_WCHAR_H
+
+/* Define if you have the 'wchar_t' type. */
+#undef HAVE_WCHAR_T
+
+/* Define to 1 if you have the `wcrtomb' function. */
+#undef HAVE_WCRTOMB
+
+/* Define to 1 if you have the `wcslen' function. */
+#undef HAVE_WCSLEN
+
+/* Define to 1 if you have the `wcsnlen' function. */
+#undef HAVE_WCSNLEN
+
+/* Define to 1 if you have the <wctype.h> header file. */
+#undef HAVE_WCTYPE_H
+
+/* Define to 1 if you have the `wcwidth' function. */
+#undef HAVE_WCWIDTH
+
+/* Define if you have the 'wint_t' type. */
+#undef HAVE_WINT_T
+
+/* Define to 1 if O_NOATIME works. */
+#undef HAVE_WORKING_O_NOATIME
+
+/* Define to 1 if O_NOFOLLOW works. */
+#undef HAVE_WORKING_O_NOFOLLOW
+
+/* Define to 1 if the system has the type `_Bool'. */
+#undef HAVE__BOOL
+
+/* Define to 1 if you have the `__fseterr' function. */
+#undef HAVE___FSETERR
+
+/* Define to 1 if ctype.h defines __header_inline. */
+#undef HAVE___HEADER_INLINE
+
+/* Please see the Gnulib manual for how to use these macros.
+
+ Suppress extern inline with HP-UX cc, as it appears to be broken; see
+ <https://lists.gnu.org/r/bug-texinfo/2013-02/msg00030.html>.
+
+ Suppress extern inline with Sun C in standards-conformance mode, as it
+ mishandles inline functions that call each other. E.g., for 'inline void f
+ (void) { } inline void g (void) { f (); }', c99 incorrectly complains
+ 'reference to static identifier "f" in extern inline function'.
+ This bug was observed with Oracle Developer Studio 12.6
+ (Sun C 5.15 SunOS_sparc 2017/05/30).
+
+ Suppress extern inline (with or without __attribute__ ((__gnu_inline__)))
+ on configurations that mistakenly use 'static inline' to implement
+ functions or macros in standard C headers like <ctype.h>. For example,
+ if isdigit is mistakenly implemented via a static inline function,
+ a program containing an extern inline function that calls isdigit
+ may not work since the C standard prohibits extern inline functions
+ from calling static functions (ISO C 99 section 6.7.4.(3).
+ This bug is known to occur on:
+
+ OS X 10.8 and earlier; see:
+ https://lists.gnu.org/r/bug-gnulib/2012-12/msg00023.html
+
+ DragonFly; see
+ http://muscles.dragonflybsd.org/bulk/clang-master-potential/20141111_102002/logs/ah-tty-0.3.12.log
+
+ FreeBSD; see:
+ https://lists.gnu.org/r/bug-gnulib/2014-07/msg00104.html
+
+ OS X 10.9 has a macro __header_inline indicating the bug is fixed for C and
+ for clang but remains for g++; see <https://trac.macports.org/ticket/41033>.
+ Assume DragonFly and FreeBSD will be similar.
+
+ GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
+ inline semantics, unless -fgnu89-inline is used. It defines a macro
+ __GNUC_STDC_INLINE__ to indicate this situation or a macro
+ __GNUC_GNU_INLINE__ to indicate the opposite situation.
+ GCC 4.2 with -std=c99 or -std=gnu99 implements the GNU C inline
+ semantics but warns, unless -fgnu89-inline is used:
+ warning: C99 inline functions are not supported; using GNU89
+ warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute
+ It defines a macro __GNUC_GNU_INLINE__ to indicate this situation.
+ */
+#if (((defined __APPLE__ && defined __MACH__) \
+ || defined __DragonFly__ || defined __FreeBSD__) \
+ && (defined HAVE___HEADER_INLINE \
+ ? (defined __cplusplus && defined __GNUC_STDC_INLINE__ \
+ && ! defined __clang__) \
+ : ((! defined _DONT_USE_CTYPE_INLINE_ \
+ && (defined __GNUC__ || defined __cplusplus)) \
+ || (defined _FORTIFY_SOURCE && 0 < _FORTIFY_SOURCE \
+ && defined __GNUC__ && ! defined __cplusplus))))
+# define _GL_EXTERN_INLINE_STDHEADER_BUG
+#endif
+#if ((__GNUC__ \
+ ? defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ \
+ : (199901L <= __STDC_VERSION__ \
+ && !defined __HP_cc \
+ && !defined __PGI \
+ && !(defined __SUNPRO_C && __STDC__))) \
+ && !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
+# define _GL_INLINE inline
+# define _GL_EXTERN_INLINE extern inline
+# define _GL_EXTERN_INLINE_IN_USE
+#elif (2 < __GNUC__ + (7 <= __GNUC_MINOR__) && !defined __STRICT_ANSI__ \
+ && !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
+# if defined __GNUC_GNU_INLINE__ && __GNUC_GNU_INLINE__
+ /* __gnu_inline__ suppresses a GCC 4.2 diagnostic. */
+# define _GL_INLINE extern inline __attribute__ ((__gnu_inline__))
+# else
+# define _GL_INLINE extern inline
+# endif
+# define _GL_EXTERN_INLINE extern
+# define _GL_EXTERN_INLINE_IN_USE
+#else
+# define _GL_INLINE _GL_UNUSED static
+# define _GL_EXTERN_INLINE _GL_UNUSED static
+#endif
+
+/* In GCC 4.6 (inclusive) to 5.1 (exclusive),
+ suppress bogus "no previous prototype for 'FOO'"
+ and "no previous declaration for 'FOO'" diagnostics,
+ when FOO is an inline function in the header; see
+ <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54113> and
+ <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63877>. */
+#if __GNUC__ == 4 && 6 <= __GNUC_MINOR__
+# if defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__
+# define _GL_INLINE_HEADER_CONST_PRAGMA
+# else
+# define _GL_INLINE_HEADER_CONST_PRAGMA \
+ _Pragma ("GCC diagnostic ignored \"-Wsuggest-attribute=const\"")
+# endif
+# define _GL_INLINE_HEADER_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wmissing-prototypes\"") \
+ _Pragma ("GCC diagnostic ignored \"-Wmissing-declarations\"") \
+ _GL_INLINE_HEADER_CONST_PRAGMA
+# define _GL_INLINE_HEADER_END \
+ _Pragma ("GCC diagnostic pop")
+#else
+# define _GL_INLINE_HEADER_BEGIN
+# define _GL_INLINE_HEADER_END
+#endif
+
+/* Define as const if the declaration of iconv() needs const. */
+#undef ICONV_CONST
+
+/* Define if the host's encoding is EBCDIC. */
+#undef IS_EBCDIC_HOST
+
+/* Define as the bit index in the word where to find bit 0 of the exponent of
+ 'long double'. */
+#undef LDBL_EXPBIT0_BIT
+
+/* Define as the word index where to find the exponent of 'long double'. */
+#undef LDBL_EXPBIT0_WORD
+
+/* Define as the bit index in the word where to find the sign of 'long
+ double'. */
+#undef LDBL_SIGNBIT_BIT
+
+/* Define as the word index where to find the sign of 'long double'. */
+#undef LDBL_SIGNBIT_WORD
+
+/* Define if localtime() takes a long * not a time_t *. */
+#undef LONG_FOR_TIME_T
+
+/* Define to a substitute value for mmap()'s MAP_ANONYMOUS flag. */
+#undef MAP_ANONYMOUS
+
+/* Use GNU style printf and scanf. */
+#ifndef __USE_MINGW_ANSI_STDIO
+# undef __USE_MINGW_ANSI_STDIO
+#endif
+
+
+/* Define if your C++ doesn't declare gettimeofday(). */
+#undef NEED_DECLARATION_GETTIMEOFDAY
+
+/* Define if your C++ doesn't declare pclose(). */
+#undef NEED_DECLARATION_PCLOSE
+
+/* Define if your C++ doesn't declare popen(). */
+#undef NEED_DECLARATION_POPEN
+
+/* Define if your C++ doesn't declare putenv(). */
+#undef NEED_DECLARATION_PUTENV
+
+/* Define if your C++ doesn't declare rand(). */
+#undef NEED_DECLARATION_RAND
+
+/* Define if your C++ doesn't declare srand(). */
+#undef NEED_DECLARATION_SRAND
+
+/* Define if your C++ doesn't declare strcasecmp(). */
+#undef NEED_DECLARATION_STRCASECMP
+
+/* Define if your C++ doesn't declare strncasecmp(). */
+#undef NEED_DECLARATION_STRNCASECMP
+
+/* Define if your C++ doesn't declare vfprintf(). */
+#undef NEED_DECLARATION_VFPRINTF
+
+/* Define if the vasnprintf implementation needs special code for the 'a' and
+ 'A' directives. */
+#undef NEED_PRINTF_DIRECTIVE_A
+
+/* Define if the vasnprintf implementation needs special code for the 'F'
+ directive. */
+#undef NEED_PRINTF_DIRECTIVE_F
+
+/* Define if the vasnprintf implementation needs special code for the 'ls'
+ directive. */
+#undef NEED_PRINTF_DIRECTIVE_LS
+
+/* Define if the vasnprintf implementation needs special code for 'double'
+ arguments. */
+#undef NEED_PRINTF_DOUBLE
+
+/* Define if the vasnprintf implementation needs special code for surviving
+ out-of-memory conditions. */
+#undef NEED_PRINTF_ENOMEM
+
+/* Define if the vasnprintf implementation needs special code for the ' flag.
+ */
+#undef NEED_PRINTF_FLAG_GROUPING
+
+/* Define if the vasnprintf implementation needs special code for the '-'
+ flag. */
+#undef NEED_PRINTF_FLAG_LEFTADJUST
+
+/* Define if the vasnprintf implementation needs special code for the 0 flag.
+ */
+#undef NEED_PRINTF_FLAG_ZERO
+
+/* Define if the vasnprintf implementation needs special code for infinite
+ 'double' arguments. */
+#undef NEED_PRINTF_INFINITE_DOUBLE
+
+/* Define if the vasnprintf implementation needs special code for infinite
+ 'long double' arguments. */
+#undef NEED_PRINTF_INFINITE_LONG_DOUBLE
+
+/* Define if the vasnprintf implementation needs special code for 'long
+ double' arguments. */
+#undef NEED_PRINTF_LONG_DOUBLE
+
+/* Define if the vasnprintf implementation needs special code for supporting
+ large precisions without arbitrary bounds. */
+#undef NEED_PRINTF_UNBOUNDED_PRECISION
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+ 'ptrdiff_t'. */
+#undef PTRDIFF_T_SUFFIX
+
+/* Define if fprintf is overridden by a POSIX compliant gnulib implementation.
+ */
+#undef REPLACE_FPRINTF_POSIX
+
+/* Define if vasnprintf exists but is overridden by gnulib. */
+#undef REPLACE_VASNPRINTF
+
+/* Define as the return type of signal handlers ('int' or 'void'). */
+#undef RETSIGTYPE
+
+/* Define if srand() returns void not int. */
+#undef RET_TYPE_SRAND_IS_VOID
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+ 'sig_atomic_t'. */
+#undef SIG_ATOMIC_T_SUFFIX
+
+/* Define as the maximum value of type 'size_t', if the system doesn't define
+ it. */
+#ifndef SIZE_MAX
+# undef SIZE_MAX
+#endif
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+ 'size_t'. */
+#undef SIZE_T_SUFFIX
+
+/* If using the C implementation of alloca, define if you know the
+ direction of stack growth for your system; otherwise it will be
+ automatically deduced at runtime.
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown */
+#undef STACK_DIRECTION
+
+/* Define to 1 if all of the C90 standard headers exist (not just the ones
+ required in a freestanding environment). This macro is provided for
+ backward compatibility; new code need not use it. */
+#undef STDC_HEADERS
+
+/* Enable extensions on AIX 3, Interix. */
+#ifndef _ALL_SOURCE
+# undef _ALL_SOURCE
+#endif
+/* Enable general extensions on macOS. */
+#ifndef _DARWIN_C_SOURCE
+# undef _DARWIN_C_SOURCE
+#endif
+/* Enable general extensions on Solaris. */
+#ifndef __EXTENSIONS__
+# undef __EXTENSIONS__
+#endif
+/* Enable GNU extensions on systems that have them. */
+#ifndef _GNU_SOURCE
+# undef _GNU_SOURCE
+#endif
+/* Enable X/Open compliant socket functions that do not require linking
+ with -lxnet on HP-UX 11.11. */
+#ifndef _HPUX_ALT_XOPEN_SOCKET_API
+# undef _HPUX_ALT_XOPEN_SOCKET_API
+#endif
+/* Identify the host operating system as Minix.
+ This macro does not affect the system headers' behavior.
+ A future release of Autoconf may stop defining this macro. */
+#ifndef _MINIX
+# undef _MINIX
+#endif
+/* Enable general extensions on NetBSD.
+ Enable NetBSD compatibility extensions on Minix. */
+#ifndef _NETBSD_SOURCE
+# undef _NETBSD_SOURCE
+#endif
+/* Enable OpenBSD compatibility extensions on NetBSD.
+ Oddly enough, this does nothing on OpenBSD. */
+#ifndef _OPENBSD_SOURCE
+# undef _OPENBSD_SOURCE
+#endif
+/* Define to 1 if needed for POSIX-compatible behavior. */
+#ifndef _POSIX_SOURCE
+# undef _POSIX_SOURCE
+#endif
+/* Define to 2 if needed for POSIX-compatible behavior. */
+#ifndef _POSIX_1_SOURCE
+# undef _POSIX_1_SOURCE
+#endif
+/* Enable POSIX-compatible threading on Solaris. */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# undef _POSIX_PTHREAD_SEMANTICS
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-5:2014. */
+#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
+# undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-1:2014. */
+#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+# undef __STDC_WANT_IEC_60559_BFP_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-2:2015. */
+#ifndef __STDC_WANT_IEC_60559_DFP_EXT__
+# undef __STDC_WANT_IEC_60559_DFP_EXT__
+#endif
+/* Enable extensions specified by C23 Annex F. */
+#ifndef __STDC_WANT_IEC_60559_EXT__
+# undef __STDC_WANT_IEC_60559_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-4:2015. */
+#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__
+# undef __STDC_WANT_IEC_60559_FUNCS_EXT__
+#endif
+/* Enable extensions specified by C23 Annex H and ISO/IEC TS 18661-3:2015. */
+#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__
+# undef __STDC_WANT_IEC_60559_TYPES_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TR 24731-2:2010. */
+#ifndef __STDC_WANT_LIB_EXT2__
+# undef __STDC_WANT_LIB_EXT2__
+#endif
+/* Enable extensions specified by ISO/IEC 24747:2009. */
+#ifndef __STDC_WANT_MATH_SPEC_FUNCS__
+# undef __STDC_WANT_MATH_SPEC_FUNCS__
+#endif
+/* Enable extensions on HP NonStop. */
+#ifndef _TANDEM_SOURCE
+# undef _TANDEM_SOURCE
+#endif
+/* Enable X/Open extensions. Define to 500 only if necessary
+ to make mbstate_t available. */
+#ifndef _XOPEN_SOURCE
+# undef _XOPEN_SOURCE
+#endif
+
+
+/* Version number of package */
+#undef VERSION
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+ 'wchar_t'. */
+#undef WCHAR_T_SUFFIX
+
+/* 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. */
+#undef WCOREFLAG
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+ 'wint_t'. */
+#undef WINT_T_SUFFIX
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+# define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+# undef WORDS_BIGENDIAN
+# endif
+#endif
+
+/* Define to 1 if the X Window System is missing or not being used. */
+#undef X_DISPLAY_MISSING
+
+/* True if the compiler says it groks GNU C version MAJOR.MINOR. */
+#if defined __GNUC__ && defined __GNUC_MINOR__
+# define _GL_GNUC_PREREQ(major, minor) \
+ ((major) < __GNUC__ + ((minor) <= __GNUC_MINOR__))
+#else
+# define _GL_GNUC_PREREQ(major, minor) 0
+#endif
+
+
+/* Define to enable the declarations of ISO C 11 types and functions. */
+#undef _ISOC11_SOURCE
+
+/* The _Noreturn keyword of C11. */
+#ifndef _Noreturn
+# if (defined __cplusplus \
+ && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \
+ || (defined _MSC_VER && 1900 <= _MSC_VER)) \
+ && 0)
+ /* [[noreturn]] is not practically usable, because with it the syntax
+ extern _Noreturn void func (...);
+ would not be valid; such a declaration would only be valid with 'extern'
+ and '_Noreturn' swapped, or without the 'extern' keyword. However, some
+ AIX system header files and several gnulib header files use precisely
+ this syntax with 'extern'. */
+# define _Noreturn [[noreturn]]
+# elif (defined __clang__ && __clang_major__ < 16 \
+ && defined _GL_WORK_AROUND_LLVM_BUG_59792)
+ /* Compile with -D_GL_WORK_AROUND_LLVM_BUG_59792 to work around
+ that rare LLVM bug, though you may get many false-alarm warnings. */
+# define _Noreturn
+# elif ((!defined __cplusplus || defined __clang__) \
+ && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
+ || (!defined __STRICT_ANSI__ \
+ && (_GL_GNUC_PREREQ (4, 7) \
+ || (defined __apple_build_version__ \
+ ? 6000000 <= __apple_build_version__ \
+ : 3 < __clang_major__ + (5 <= __clang_minor__))))))
+ /* _Noreturn works as-is. */
+# elif _GL_GNUC_PREREQ (2, 8) || defined __clang__ || 0x5110 <= __SUNPRO_C
+# define _Noreturn __attribute__ ((__noreturn__))
+# elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
+# define _Noreturn __declspec (noreturn)
+# else
+# define _Noreturn
+# endif
+#endif
+
+
+/* Define if -D_POSIX_SOURCE is necessary. */
+#undef _POSIX_SOURCE
+
+/* Define if you have ISC 3.x or 4.x. */
+#undef _SYSV3
+
+/* For standard stat data types on VMS. */
+#undef _USE_STD_STAT
+
+/* Define to 1 if the system <stdint.h> predates C++11. */
+#undef __STDC_CONSTANT_MACROS
+
+/* Define to 1 if the system <stdint.h> predates C++11. */
+#undef __STDC_LIMIT_MACROS
+
+/* The _GL_ASYNC_SAFE marker should be attached to functions that are
+ signal handlers (for signals other than SIGABRT, SIGPIPE) or can be
+ invoked from such signal handlers. Such functions have some restrictions:
+ * All functions that it calls should be marked _GL_ASYNC_SAFE as well,
+ or should be listed as async-signal-safe in POSIX
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04>
+ section 2.4.3. Note that malloc(), sprintf(), and fwrite(), in
+ particular, are NOT async-signal-safe.
+ * All memory locations (variables and struct fields) that these functions
+ access must be marked 'volatile'. This holds for both read and write
+ accesses. Otherwise the compiler might optimize away stores to and
+ reads from such locations that occur in the program, depending on its
+ data flow analysis. For example, when the program contains a loop
+ that is intended to inspect a variable set from within a signal handler
+ while (!signal_occurred)
+ ;
+ the compiler is allowed to transform this into an endless loop if the
+ variable 'signal_occurred' is not declared 'volatile'.
+ Additionally, recall that:
+ * A signal handler should not modify errno (except if it is a handler
+ for a fatal signal and ends by raising the same signal again, thus
+ provoking the termination of the process). If it invokes a function
+ that may clobber errno, it needs to save and restore the value of
+ errno. */
+#define _GL_ASYNC_SAFE
+
+
+/* Attributes. */
+#if (defined __has_attribute \
+ && (!defined __clang_minor__ \
+ || (defined __apple_build_version__ \
+ ? 6000000 <= __apple_build_version__ \
+ : 5 <= __clang_major__)))
+# define _GL_HAS_ATTRIBUTE(attr) __has_attribute (__##attr##__)
+#else
+# define _GL_HAS_ATTRIBUTE(attr) _GL_ATTR_##attr
+# define _GL_ATTR_alloc_size _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_always_inline _GL_GNUC_PREREQ (3, 2)
+# define _GL_ATTR_artificial _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_cold _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_const _GL_GNUC_PREREQ (2, 95)
+# define _GL_ATTR_deprecated _GL_GNUC_PREREQ (3, 1)
+# define _GL_ATTR_diagnose_if 0
+# define _GL_ATTR_error _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_externally_visible _GL_GNUC_PREREQ (4, 1)
+# define _GL_ATTR_fallthrough _GL_GNUC_PREREQ (7, 0)
+# define _GL_ATTR_format _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_leaf _GL_GNUC_PREREQ (4, 6)
+# define _GL_ATTR_malloc _GL_GNUC_PREREQ (3, 0)
+# ifdef _ICC
+# define _GL_ATTR_may_alias 0
+# else
+# define _GL_ATTR_may_alias _GL_GNUC_PREREQ (3, 3)
+# endif
+# define _GL_ATTR_noinline _GL_GNUC_PREREQ (3, 1)
+# define _GL_ATTR_nonnull _GL_GNUC_PREREQ (3, 3)
+# define _GL_ATTR_nonstring _GL_GNUC_PREREQ (8, 0)
+# define _GL_ATTR_nothrow _GL_GNUC_PREREQ (3, 3)
+# define _GL_ATTR_packed _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_pure _GL_GNUC_PREREQ (2, 96)
+# define _GL_ATTR_returns_nonnull _GL_GNUC_PREREQ (4, 9)
+# define _GL_ATTR_sentinel _GL_GNUC_PREREQ (4, 0)
+# define _GL_ATTR_unused _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_warn_unused_result _GL_GNUC_PREREQ (3, 4)
+#endif
+
+/* Disable GCC -Wpedantic if using __has_c_attribute and this is not C23+. */
+#if (defined __has_c_attribute && _GL_GNUC_PREREQ (4, 6) \
+ && (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) <= 201710)
+# pragma GCC diagnostic ignored "-Wpedantic"
+#endif
+
+
+/* _GL_ATTRIBUTE_ALLOC_SIZE ((N)) declares that the Nth argument of the function
+ is the size of the returned memory block.
+ _GL_ATTRIBUTE_ALLOC_SIZE ((M, N)) declares that the Mth argument multiplied
+ by the Nth argument of the function is the size of the returned memory block.
+ */
+/* Applies to: function, pointer to function, function types. */
+#ifndef _GL_ATTRIBUTE_ALLOC_SIZE
+# if _GL_HAS_ATTRIBUTE (alloc_size)
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args))
+# else
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_ALWAYS_INLINE tells that the compiler should always inline the
+ function and report an error if it cannot do so. */
+/* Applies to: function. */
+#ifndef _GL_ATTRIBUTE_ALWAYS_INLINE
+# if _GL_HAS_ATTRIBUTE (always_inline)
+# define _GL_ATTRIBUTE_ALWAYS_INLINE __attribute__ ((__always_inline__))
+# else
+# define _GL_ATTRIBUTE_ALWAYS_INLINE
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_ARTIFICIAL declares that the function is not important to show
+ in stack traces when debugging. The compiler should omit the function from
+ stack traces. */
+/* Applies to: function. */
+#ifndef _GL_ATTRIBUTE_ARTIFICIAL
+# if _GL_HAS_ATTRIBUTE (artificial)
+# define _GL_ATTRIBUTE_ARTIFICIAL __attribute__ ((__artificial__))
+# else
+# define _GL_ATTRIBUTE_ARTIFICIAL
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_COLD declares that the function is rarely executed. */
+/* Applies to: functions. */
+/* Avoid __attribute__ ((cold)) on MinGW; see thread starting at
+ <https://lists.gnu.org/r/emacs-devel/2019-04/msg01152.html>.
+ Also, Oracle Studio 12.6 requires 'cold' not '__cold__'. */
+#ifndef _GL_ATTRIBUTE_COLD
+# if _GL_HAS_ATTRIBUTE (cold) && !defined __MINGW32__
+# ifndef __SUNPRO_C
+# define _GL_ATTRIBUTE_COLD __attribute__ ((__cold__))
+# else
+# define _GL_ATTRIBUTE_COLD __attribute__ ((cold))
+# endif
+# else
+# define _GL_ATTRIBUTE_COLD
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_CONST declares that it is OK for a compiler to omit duplicate
+ calls to the function with the same arguments.
+ This attribute is safe for a function that neither depends on nor affects
+ observable state, and always returns exactly once - e.g., does not loop
+ forever, and does not call longjmp.
+ (This attribute is stricter than _GL_ATTRIBUTE_PURE.) */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_CONST
+# if _GL_HAS_ATTRIBUTE (const)
+# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
+# else
+# define _GL_ATTRIBUTE_CONST
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+ that can be freed by passing them as the Ith argument to the
+ function F.
+ _GL_ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
+ can be freed via 'free'; it can be used only after declaring 'free'. */
+/* Applies to: functions. Cannot be used on inline functions. */
+#ifndef _GL_ATTRIBUTE_DEALLOC
+# if _GL_GNUC_PREREQ (11, 0)
+# define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+# else
+# define _GL_ATTRIBUTE_DEALLOC(f, i)
+# endif
+#endif
+/* If gnulib's <string.h> or <wchar.h> has already defined this macro, continue
+ to use this earlier definition, since <stdlib.h> may not have been included
+ yet. */
+#ifndef _GL_ATTRIBUTE_DEALLOC_FREE
+# if defined __cplusplus && defined __GNUC__ && !defined __clang__
+/* Work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108231> */
+# define _GL_ATTRIBUTE_DEALLOC_FREE \
+ _GL_ATTRIBUTE_DEALLOC ((void (*) (void *)) free, 1)
+# else
+# define _GL_ATTRIBUTE_DEALLOC_FREE \
+ _GL_ATTRIBUTE_DEALLOC (free, 1)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_DEPRECATED: Declares that an entity is deprecated.
+ The compiler may warn if the entity is used. */
+/* Applies to:
+ - function, variable,
+ - struct, union, struct/union member,
+ - enumeration, enumeration item,
+ - typedef,
+ in C++ also: namespace, class, template specialization. */
+#ifndef _GL_ATTRIBUTE_DEPRECATED
+# ifdef __has_c_attribute
+# if __has_c_attribute (__deprecated__)
+# define _GL_ATTRIBUTE_DEPRECATED [[__deprecated__]]
+# endif
+# endif
+# if !defined _GL_ATTRIBUTE_DEPRECATED && _GL_HAS_ATTRIBUTE (deprecated)
+# define _GL_ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__))
+# endif
+# ifndef _GL_ATTRIBUTE_DEPRECATED
+# define _GL_ATTRIBUTE_DEPRECATED
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_ERROR(msg) requests an error if a function is called and
+ the function call is not optimized away.
+ _GL_ATTRIBUTE_WARNING(msg) requests a warning if a function is called and
+ the function call is not optimized away. */
+/* Applies to: functions. */
+#if !(defined _GL_ATTRIBUTE_ERROR && defined _GL_ATTRIBUTE_WARNING)
+# if _GL_HAS_ATTRIBUTE (error)
+# define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__error__ (msg)))
+# define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__warning__ (msg)))
+# elif _GL_HAS_ATTRIBUTE (diagnose_if)
+# define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__diagnose_if__ (1, msg, "error")))
+# define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+# else
+# define _GL_ATTRIBUTE_ERROR(msg)
+# define _GL_ATTRIBUTE_WARNING(msg)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_EXTERNALLY_VISIBLE declares that the entity should remain
+ visible to debuggers etc., even with '-fwhole-program'. */
+/* Applies to: functions, variables. */
+#ifndef _GL_ATTRIBUTE_EXTERNALLY_VISIBLE
+# if _GL_HAS_ATTRIBUTE (externally_visible)
+# define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((externally_visible))
+# else
+# define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_FALLTHROUGH declares that it is not a programming mistake if
+ the control flow falls through to the immediately following 'case' or
+ 'default' label. The compiler should not warn in this case. */
+/* Applies to: Empty statement (;), inside a 'switch' statement. */
+/* Always expands to something. */
+#ifndef _GL_ATTRIBUTE_FALLTHROUGH
+# ifdef __has_c_attribute
+# if __has_c_attribute (__fallthrough__)
+# define _GL_ATTRIBUTE_FALLTHROUGH [[__fallthrough__]]
+# endif
+# endif
+# if !defined _GL_ATTRIBUTE_FALLTHROUGH && _GL_HAS_ATTRIBUTE (fallthrough)
+# define _GL_ATTRIBUTE_FALLTHROUGH __attribute__ ((__fallthrough__))
+# endif
+# ifndef _GL_ATTRIBUTE_FALLTHROUGH
+# define _GL_ATTRIBUTE_FALLTHROUGH ((void) 0)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT ((ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK))
+ declares that the STRING-INDEXth function argument is a format string of
+ style ARCHETYPE, which is one of:
+ printf, gnu_printf
+ scanf, gnu_scanf,
+ strftime, gnu_strftime,
+ strfmon,
+ or the same thing prefixed and suffixed with '__'.
+ If FIRST-TO-CHECK is not 0, arguments starting at FIRST-TO_CHECK
+ are suitable for the format string. */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_FORMAT
+# if _GL_HAS_ATTRIBUTE (format)
+# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+# else
+# define _GL_ATTRIBUTE_FORMAT(spec)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_LEAF declares that if the function is called from some other
+ compilation unit, it executes code from that unit only by return or by
+ exception handling. This declaration lets the compiler optimize that unit
+ more aggressively. */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_LEAF
+# if _GL_HAS_ATTRIBUTE (leaf)
+# define _GL_ATTRIBUTE_LEAF __attribute__ ((__leaf__))
+# else
+# define _GL_ATTRIBUTE_LEAF
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly
+ allocated memory. */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_MALLOC
+# if _GL_HAS_ATTRIBUTE (malloc)
+# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+# else
+# define _GL_ATTRIBUTE_MALLOC
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_MAY_ALIAS declares that pointers to the type may point to the
+ same storage as pointers to other types. Thus this declaration disables
+ strict aliasing optimization. */
+/* Applies to: types. */
+/* Oracle Studio 12.6 mishandles may_alias despite __has_attribute OK. */
+#ifndef _GL_ATTRIBUTE_MAY_ALIAS
+# if _GL_HAS_ATTRIBUTE (may_alias) && !defined __SUNPRO_C
+# define _GL_ATTRIBUTE_MAY_ALIAS __attribute__ ((__may_alias__))
+# else
+# define _GL_ATTRIBUTE_MAY_ALIAS
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_MAYBE_UNUSED declares that it is not a programming mistake if
+ the entity is not used. The compiler should not warn if the entity is not
+ used. */
+/* Applies to:
+ - function, variable,
+ - struct, union, struct/union member,
+ - enumeration, enumeration item,
+ - typedef,
+ in C++ also: class. */
+/* In C++ and C23, this is spelled [[__maybe_unused__]].
+ GCC's syntax is __attribute__ ((__unused__)).
+ clang supports both syntaxes. Except that with clang ≥ 6, < 10, in C++ mode,
+ __has_c_attribute (__maybe_unused__) yields true but the use of
+ [[__maybe_unused__]] nevertheless produces a warning. */
+#ifndef _GL_ATTRIBUTE_MAYBE_UNUSED
+# if defined __clang__ && defined __cplusplus
+# if __clang_major__ >= 10
+# define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]]
+# endif
+# elif defined __has_c_attribute
+# if __has_c_attribute (__maybe_unused__)
+# define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]]
+# endif
+# endif
+# ifndef _GL_ATTRIBUTE_MAYBE_UNUSED
+# define _GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_UNUSED
+# endif
+#endif
+/* Alternative spelling of this macro, for convenience and for
+ compatibility with glibc/include/libc-symbols.h. */
+#define _GL_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED
+/* Earlier spellings of this macro. */
+#define _UNUSED_PARAMETER_ _GL_ATTRIBUTE_MAYBE_UNUSED
+
+/* _GL_ATTRIBUTE_NODISCARD declares that the caller of the function should not
+ discard the return value. The compiler may warn if the caller does not use
+ the return value, unless the caller uses something like ignore_value. */
+/* Applies to: function, enumeration, class. */
+#ifndef _GL_ATTRIBUTE_NODISCARD
+# if defined __clang__ && defined __cplusplus
+ /* With clang up to 15.0.6 (at least), in C++ mode, [[__nodiscard__]] produces
+ a warning.
+ The 1000 below means a yet unknown threshold. When clang++ version X
+ starts supporting [[__nodiscard__]] without warning about it, you can
+ replace the 1000 with X. */
+# if __clang_major__ >= 1000
+# define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]]
+# endif
+# elif defined __has_c_attribute
+# if __has_c_attribute (__nodiscard__)
+# define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]]
+# endif
+# endif
+# if !defined _GL_ATTRIBUTE_NODISCARD && _GL_HAS_ATTRIBUTE (warn_unused_result)
+# define _GL_ATTRIBUTE_NODISCARD __attribute__ ((__warn_unused_result__))
+# endif
+# ifndef _GL_ATTRIBUTE_NODISCARD
+# define _GL_ATTRIBUTE_NODISCARD
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_NOINLINE tells that the compiler should not inline the
+ function. */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_NOINLINE
+# if _GL_HAS_ATTRIBUTE (noinline)
+# define _GL_ATTRIBUTE_NOINLINE __attribute__ ((__noinline__))
+# else
+# define _GL_ATTRIBUTE_NOINLINE
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_NONNULL ((N1, N2,...)) declares that the arguments N1, N2,...
+ must not be NULL.
+ _GL_ATTRIBUTE_NONNULL () declares that all pointer arguments must not be
+ null. */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_NONNULL
+# if _GL_HAS_ATTRIBUTE (nonnull)
+# define _GL_ATTRIBUTE_NONNULL(args) __attribute__ ((__nonnull__ args))
+# else
+# define _GL_ATTRIBUTE_NONNULL(args)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_NONSTRING declares that the contents of a character array is
+ not meant to be NUL-terminated. */
+/* Applies to: struct/union members and variables that are arrays of element
+ type '[[un]signed] char'. */
+#ifndef _GL_ATTRIBUTE_NONSTRING
+# if _GL_HAS_ATTRIBUTE (nonstring)
+# define _GL_ATTRIBUTE_NONSTRING __attribute__ ((__nonstring__))
+# else
+# define _GL_ATTRIBUTE_NONSTRING
+# endif
+#endif
+
+/* There is no _GL_ATTRIBUTE_NORETURN; use _Noreturn instead. */
+
+/* _GL_ATTRIBUTE_NOTHROW declares that the function does not throw exceptions.
+ */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_NOTHROW
+# if _GL_HAS_ATTRIBUTE (nothrow) && !defined __cplusplus
+# define _GL_ATTRIBUTE_NOTHROW __attribute__ ((__nothrow__))
+# else
+# define _GL_ATTRIBUTE_NOTHROW
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_PACKED declares:
+ For struct members: The member has the smallest possible alignment.
+ For struct, union, class: All members have the smallest possible alignment,
+ minimizing the memory required. */
+/* Applies to: struct members, struct, union,
+ in C++ also: class. */
+#ifndef _GL_ATTRIBUTE_PACKED
+# if _GL_HAS_ATTRIBUTE (packed)
+# define _GL_ATTRIBUTE_PACKED __attribute__ ((__packed__))
+# else
+# define _GL_ATTRIBUTE_PACKED
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_PURE declares that It is OK for a compiler to omit duplicate
+ calls to the function with the same arguments if observable state is not
+ changed between calls.
+ This attribute is safe for a function that does not affect
+ observable state, and always returns exactly once.
+ (This attribute is looser than _GL_ATTRIBUTE_CONST.) */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_PURE
+# if _GL_HAS_ATTRIBUTE (pure)
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+# define _GL_ATTRIBUTE_PURE
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_RETURNS_NONNULL declares that the function's return value is
+ a non-NULL pointer. */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_RETURNS_NONNULL
+# if _GL_HAS_ATTRIBUTE (returns_nonnull)
+# define _GL_ATTRIBUTE_RETURNS_NONNULL __attribute__ ((__returns_nonnull__))
+# else
+# define _GL_ATTRIBUTE_RETURNS_NONNULL
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_SENTINEL(pos) declares that the variadic function expects a
+ trailing NULL argument.
+ _GL_ATTRIBUTE_SENTINEL () - The last argument is NULL (requires C99).
+ _GL_ATTRIBUTE_SENTINEL ((N)) - The (N+1)st argument from the end is NULL. */
+/* Applies to: functions. */
+#ifndef _GL_ATTRIBUTE_SENTINEL
+# if _GL_HAS_ATTRIBUTE (sentinel)
+# define _GL_ATTRIBUTE_SENTINEL(pos) __attribute__ ((__sentinel__ pos))
+# else
+# define _GL_ATTRIBUTE_SENTINEL(pos)
+# endif
+#endif
+
+/* A helper macro. Don't use it directly. */
+#ifndef _GL_ATTRIBUTE_UNUSED
+# if _GL_HAS_ATTRIBUTE (unused)
+# define _GL_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+# else
+# define _GL_ATTRIBUTE_UNUSED
+# endif
+#endif
+
+
+/* _GL_UNUSED_LABEL; declares that it is not a programming mistake if the
+ immediately preceding label is not used. The compiler should not warn
+ if the label is not used. */
+/* Applies to: label (both in C and C++). */
+/* Note that g++ < 4.5 does not support the '__attribute__ ((__unused__)) ;'
+ syntax. But clang does. */
+#ifndef _GL_UNUSED_LABEL
+# if !(defined __cplusplus && !_GL_GNUC_PREREQ (4, 5)) || defined __clang__
+# define _GL_UNUSED_LABEL _GL_ATTRIBUTE_UNUSED
+# else
+# define _GL_UNUSED_LABEL
+# endif
+#endif
+
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+#ifndef __cplusplus
+#undef inline
+#endif
+
+/* Define to long or long long if <stdint.h> and <inttypes.h> don't define. */
+#undef intmax_t
+
+/* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports
+ the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of
+ earlier versions), but does not display it by setting __GNUC_STDC_INLINE__.
+ __APPLE__ && __MACH__ test for Mac OS X.
+ __APPLE_CC__ tests for the Apple compiler and its version.
+ __STDC_VERSION__ tests for the C99 mode. */
+#if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__
+# define __GNUC_STDC_INLINE__ 1
+#endif
+
+/* _GL_CMP (n1, n2) performs a three-valued comparison on n1 vs. n2, where
+ n1 and n2 are expressions without side effects, that evaluate to real
+ numbers (excluding NaN).
+ It returns
+ 1 if n1 > n2
+ 0 if n1 == n2
+ -1 if n1 < n2
+ The naïve code (n1 > n2 ? 1 : n1 < n2 ? -1 : 0) produces a conditional
+ jump with nearly all GCC versions up to GCC 10.
+ This variant (n1 < n2 ? -1 : n1 > n2) produces a conditional with many
+ GCC versions up to GCC 9.
+ The better code (n1 > n2) - (n1 < n2) from Hacker's Delight § 2-9
+ avoids conditional jumps in all GCC versions >= 3.4. */
+#define _GL_CMP(n1, n2) (((n1) > (n2)) - ((n1) < (n2)))
+
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef mode_t
+
+/* Define as a signed integer type capable of holding a process identifier. */
+#undef pid_t
+
+/* Define as the type of the result of subtracting two pointers, if the system
+ doesn't define it. */
+#undef ptrdiff_t
+
+/* Define to the equivalent of the C99 'restrict' keyword, or to
+ nothing if this is not supported. Do not define if restrict is
+ supported only directly. */
+#undef restrict
+/* Work around a bug in older versions of Sun C++, which did not
+ #define __restrict__ or support _Restrict or __restrict__
+ even though the corresponding Sun C compiler ended up with
+ "#define restrict _Restrict" or "#define restrict __restrict__"
+ in the previous line. This workaround can be removed once
+ we assume Oracle Developer Studio 12.5 (2016) or later. */
+#if defined __SUNPRO_CC && !defined __RESTRICT && !defined __restrict__
+# define _Restrict
+# define __restrict__
+#endif
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef size_t
+
+/* Define as a signed type of the same size as size_t. */
+#undef ssize_t
+
+/* Define uintmax_t to 'unsigned long' or 'unsigned long long' if <inttypes.h>
+ does not exist. */
+#undef uintmax_t
+
+
+ /* This definition is a duplicate of the one in unitypes.h.
+ It is here so that we can cope with an older version of unitypes.h
+ that does not contain this definition and that is pre-installed among
+ the public header files. */
+ # if defined __restrict \
+ || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
+ || __clang_major__ >= 3
+ # define _UC_RESTRICT __restrict
+ # elif 199901L <= __STDC_VERSION__ || defined restrict
+ # define _UC_RESTRICT restrict
+ # else
+ # define _UC_RESTRICT
+ # endif
+
+
+#if (!defined HAVE_C_STATIC_ASSERT && !defined assert \
+ && (!defined __cplusplus \
+ || (__cpp_static_assert < 201411 \
+ && __GNUG__ < 6 && __clang_major__ < 6)))
+ #include <assert.h>
+ #undef/**/assert
+ /* Solaris 11.4 <assert.h> defines static_assert as a macro with 2 arguments.
+ We need it also to be invocable with a single argument. */
+ #if defined __sun && (__STDC_VERSION__ - 0 >= 201112L) && !defined __cplusplus
+ #undef/**/static_assert
+ #define static_assert _Static_assert
+ #endif
+#endif
diff --git a/src/include/cset.h b/src/include/cset.h
new file mode 100644
index 0000000..996e9a8
--- /dev/null
+++ b/src/include/cset.h
@@ -0,0 +1,74 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CC_LIMITS_H
+#include <limits.h>
+#else /* not HAVE_CC_LIMITS_H */
+#ifndef UCHAR_MAX
+#define UCHAR_MAX 255
+#endif
+#endif /* not HAVE_CC_LIMITS_H */
+
+enum cset_builtin { CSET_BUILTIN };
+
+class cset {
+public:
+ cset();
+ cset(cset_builtin);
+ cset(const char *);
+ cset(const unsigned char *);
+ int operator()(unsigned char) const;
+
+ cset &operator|=(const cset &);
+ cset &operator|=(unsigned char);
+
+ friend class cset_init;
+private:
+ char v[UCHAR_MAX+1];
+ void clear();
+};
+
+inline int cset::operator()(unsigned char c) const
+{
+ return v[c];
+}
+
+inline cset &cset::operator|=(unsigned char c)
+{
+ v[c] = 1;
+ return *this;
+}
+
+extern cset csalpha;
+extern cset csupper;
+extern cset cslower;
+extern cset csdigit;
+extern cset csxdigit;
+extern cset csspace;
+extern cset cspunct;
+extern cset csalnum;
+extern cset csprint;
+extern cset csgraph;
+extern cset cscntrl;
+
+static class cset_init {
+ static int initialised;
+public:
+ cset_init();
+} _cset_init;
diff --git a/src/include/curtime.h b/src/include/curtime.h
new file mode 100644
index 0000000..5d3a24a
--- /dev/null
+++ b/src/include/curtime.h
@@ -0,0 +1,27 @@
+/* Copyright (C) 2015-2020 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 of the License, 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.
+
+The GNU General Public License version 2 (GPL2) is available in the
+internet at <http://www.gnu.org/licenses/gpl-2.0.txt>. */
+
+#ifndef LONG_FOR_TIME_T
+#include <time.h>
+#endif
+
+#ifdef LONG_FOR_TIME_T
+long
+#else
+time_t
+#endif
+current_time();
diff --git a/src/include/device.h b/src/include/device.h
new file mode 100644
index 0000000..6543292
--- /dev/null
+++ b/src/include/device.h
@@ -0,0 +1,25 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+// The target device. Once initialized, the device doesn't change during
+// the entire program run. Sample devices are 'ps' (for Postscript), 'html'
+// (for HTML), and 'ascii', 'latin1', 'utf8' for TTY output.
+extern const char *device;
+
+// end of device.h
diff --git a/src/include/driver.h b/src/include/driver.h
new file mode 100644
index 0000000..965ac1a
--- /dev/null
+++ b/src/include/driver.h
@@ -0,0 +1,38 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <errno.h>
+#include <math.h>
+#include "errarg.h"
+#include "error.h"
+#include "font.h"
+#include "printer.h"
+#include "geometry.h"
+
+void do_file(const char *);
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/include/errarg.h b/src/include/errarg.h
new file mode 100644
index 0000000..67a5852
--- /dev/null
+++ b/src/include/errarg.h
@@ -0,0 +1,46 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+class errarg {
+ enum { EMPTY, STRING, CHAR, INTEGER, UNSIGNED_INTEGER, DOUBLE } type;
+ union {
+ const char *s;
+ int n;
+ unsigned int u;
+ char c;
+ double d;
+ };
+ public:
+ errarg();
+ errarg(const char *);
+ errarg(char);
+ errarg(unsigned char);
+ errarg(int);
+ errarg(unsigned int);
+ errarg(double);
+ int empty() const;
+ void print() const;
+};
+
+extern errarg empty_errarg;
+
+extern void errprint(const char *,
+ const errarg &arg1 = empty_errarg,
+ const errarg &arg2 = empty_errarg,
+ const errarg &arg3 = empty_errarg);
diff --git a/src/include/error.h b/src/include/error.h
new file mode 100644
index 0000000..77302f8
--- /dev/null
+++ b/src/include/error.h
@@ -0,0 +1,69 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+void fatal_with_file_and_line(const char *, int, const char *,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg);
+
+void error_with_file_and_line(const char *, int, const char *,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg);
+
+void warning_with_file_and_line(const char *, int, const char *,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg);
+
+void debug_with_file_and_line(const char *, int, const char *,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg);
+
+void fatal(const char *,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg);
+
+void error(const char *,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg);
+
+void warning(const char *,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg);
+
+void debug(const char *,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg);
+
+
+extern "C" const char *program_name;
+extern int current_lineno;
+extern const char *current_filename;
+extern const char *current_source_filename;
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/include/font.h b/src/include/font.h
new file mode 100644
index 0000000..68a82fa
--- /dev/null
+++ b/src/include/font.h
@@ -0,0 +1,343 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+// A function of this type can be registered to define the semantics of
+// arbitrary commands in a font DESC file.
+typedef void (*FONT_COMMAND_HANDLER)(const char *, // command
+ const char *, // arg
+ const char *, // file
+ int); // lineno
+
+// A glyph is represented by a font-independent 'glyph *' pointer. The
+// functions name_to_glyph and number_to_glyph return such a pointer.
+//
+// There are two types of glyphs:
+//
+// - those with a name, and among these in particular:
+// 'charNNN' denoting a single 'char' in the input character set,
+// 'uXXXX' denoting a Unicode character,
+//
+// - those with a number, referring to the font-dependent glyph with
+// the given number.
+
+// The statically allocated information about a glyph.
+//
+// This is an abstract class; only its subclass 'charinfo' is
+// instantiated. 'charinfo' exists in two versions: one in
+// roff/troff/input.cpp for troff, and one in
+// libs/libgroff/nametoindex.cpp for the preprocessors and the
+// postprocessors.
+struct glyph {
+ int index; // A font-independent integer value.
+ int number; // Glyph number or -1.
+ friend class character_indexer;
+};
+
+#define UNDEFINED_GLYPH ((glyph *) 0)
+
+// The next three functions exist in two versions: one in
+// roff/troff/input.cpp for troff, and one in
+// libs/libgroff/nametoindex.cpp for the preprocessors and the
+// postprocessors.
+extern glyph *name_to_glyph(const char *); // Convert the glyph with
+ // the given name (arg1) to a 'glyph' object. This
+ // has the same semantics as the groff escape sequence
+ // \C'name'. If such a 'glyph' object does not yet
+ // exist, a new one is allocated.
+extern glyph *number_to_glyph(int); // Convert the font-dependent glyph
+ // with the given number (in the font) to a 'glyph'
+ // object. This has the same semantics as the groff
+ // escape sequence \N'number'. If such a 'glyph'
+ // object does not yet exist, a new one is allocated.
+extern const char *glyph_to_name(glyph *); // Convert the given
+ // glyph back to its name. Return null pointer
+ // if the glyph doesn't have a name.
+inline int glyph_to_number(glyph *); // Convert the given glyph back to
+ // its number. Return -1 if it does not designate
+ // a numbered character.
+inline int glyph_to_index(glyph *); // Return the unique index that is
+ // associated with the given glyph. It is >= 0.
+extern int glyph_to_unicode(glyph *); // Convert the given glyph to its
+ // Unicode codepoint. Return -1 if it does not
+ // designate a Unicode character.
+
+inline int glyph_to_number(glyph *g)
+{
+ return g->number;
+}
+
+inline int glyph_to_index(glyph *g)
+{
+ return g->index;
+}
+
+// Types used in non-public members of 'class font'.
+struct font_kern_list;
+struct font_char_metric;
+struct font_widths_cache;
+
+// A 'class font' instance represents the relevant information of a font of
+// the given device. This includes the set of glyphs represented by the
+// font, and metrics for each glyph.
+class font {
+public:
+ enum { // The valid argument values of 'has_ligature'.
+ LIG_ff = 1,
+ LIG_fi = 2,
+ LIG_fl = 4,
+ LIG_ffi = 8,
+ LIG_ffl = 16
+ };
+
+ virtual ~font(); // Destructor.
+ bool contains(glyph *); // This font contains the given glyph.
+ bool is_special(); // This font is searched for glyphs not defined
+ // in the current font. See section 'Special
+ // Fonts' in the groff Texinfo manual. Used by
+ // make_glyph_node().
+ int get_width(glyph *, int); // A rectangle represents the shape of the
+ // given glyph (arg1) at the given point size
+ // (arg2). Return the horizontal dimension of this
+ // rectangle.
+ int get_height(glyph *, int); // A rectangle represents the shape of the
+ // given glyph (arg1) at the given point size
+ // (arg2). Return the distance between the base
+ // line and the top of this rectangle.
+ // This is often also called the 'ascent' of the
+ // glyph. If the top is above the baseline, this
+ // value is positive.
+ int get_depth(glyph *, int); // A rectangle represents the shape of the
+ // given glyph (arg1) at the given point size
+ // (arg2). Return the distance between the base
+ // line and the bottom of this rectangle.
+ // This is often also called the 'descent' of the
+ // glyph. If the bottom is below the baseline,
+ // this value is positive.
+ int get_space_width(int); // Return the normal width of a space at the
+ // given point size.
+ int get_character_type(glyph *); // Return a bit mask describing the
+ // shape of the given glyph. Bit 0 is set if the
+ // character has a descender. Bit 1 is set if the
+ // character has a tall glyph. See groff manual,
+ // description of \w and the 'ct' register.
+ int get_kern(glyph *, glyph *, int); // Return the kerning between the
+ // given glyphs (arg1 and arg2), both at the given
+ // point size (arg3).
+ int get_skew(glyph *, int, int); // A rectangle represents the shape
+ // of the given glyph (arg1) at the given point size
+ // (arg2). For slanted fonts like Times-Italic, the
+ // optical vertical axis is naturally slanted. The
+ // natural slant value (measured in degrees;
+ // positive values mean aslant to the right) is
+ // specified in the font's description file (see
+ // member variable SLANT below). In addition to
+ // this, any font can be artificially slanted. This
+ // artificial slant value (arg3, measured in
+ // degrees; positive values mean a slant to the
+ // right) is specified with the \S escape.
+ //
+ // Return the skew value which is the horizontal
+ // distance between the upper left corner of the
+ // glyph box and the upper left corner of the glyph
+ // box thought to be slanted by the sum of the
+ // natural and artificial slant. It basically means
+ // how much an accent must be shifted horizontally
+ // to put it on the optical axis of the glyph.
+ bool has_ligature(int); // This font has the given ligature type
+ // (one of LIG_ff, LIG_fi, ...).
+ int get_italic_correction(glyph *, int); // If the given glyph (arg1)
+ // at the given point size (arg2) is followed by an
+ // unslanted glyph, some horizontal white space may
+ // need to be inserted in between. See the groff
+ // manual, description of \/. Return the amount
+ // (width) of this white space.
+ int get_left_italic_correction(glyph *, int); // If the given glyph (arg1)
+ // at the given point size (arg2) is preceded by an
+ // unslanted roman glyph, some horizontal white
+ // space may need to be inserted in between. See
+ // the groff manual, description of \,. Return the
+ // amount (width) of this white space.
+ int get_subscript_correction(glyph *, int); // If the given glyph (arg1)
+ // at the given point size (arg2)is followed by a
+ // subscript glyph, the horizontal position may need
+ // to be advanced by some (possibly negative)
+ // amount. See groff manual, description of \w and
+ // the 'ssc' register. Return this amount.
+ void set_zoom(int); // Set the font's zoom factor * 1000. Must be a
+ // non-negative value.
+ int get_zoom(); // Return the font's zoom factor * 1000.
+ int get_code(glyph *); // Return the code point in the physical
+ // font of the given glyph.
+ const char *get_special_device_encoding(glyph *); // Return
+ // special device-dependent information about
+ // the given glyph. Return null pointer if
+ // there is no special information.
+ const char *get_name(); // Return the name of this font.
+ const char *get_internal_name(); // Return the 'internalname'
+ // attribute of this font or null pointer if it
+ // has none.
+ const char *get_image_generator(); // Return the 'image_generator'
+ // attribute of this font or null pointer if it
+ // has none.
+ static bool scan_papersize(const char *, const char **,
+ double *, double *); // Parse the
+ // 'papersize' directive in the DESC file name
+ // given in arg1. Update arg2 with the name
+ // of the paper format and arg3 and arg4 with
+ // its length and width, respectively. Return
+ // whether paper size was successfully set.
+ static font *load_font(const char *, bool = false); // Load the font
+ // description file with the given name (arg1)
+ // and return a pointer to a 'font' object. If
+ // arg2 is true, only the part of the font
+ // description file before the 'charset' and
+ // 'kernpairs' sections is loaded. Return null
+ // pointer in case of failure.
+ static void command_line_font_dir(const char *); // Prepend given
+ // path (arg1) to the list of directories in which
+ // to look up fonts.
+ static FILE *open_file(const char *, char **); // Open
+ // a font file with the given name (arg1),
+ // searching along the current font path. If
+ // arg2 points to a string pointer, set it to
+ // the found file name (this depends on the
+ // device also). Return the opened file. If
+ // not found, arg2 is unchanged, and a null
+ // pointer is returned.
+
+ // Open the DESC file (depending on the device) and initialize some
+ // static variables with info from there.
+ static const char *load_desc();
+ static FONT_COMMAND_HANDLER
+ set_unknown_desc_command_handler(FONT_COMMAND_HANDLER); // Register
+ // a function which defines the semantics of
+ // arbitrary commands in the font DESC file.
+ // Now the variables from the DESC file, shared by all fonts.
+ static int res; // The 'res' attribute given in the DESC file.
+ static int hor; // The 'hor' attribute given in the DESC file.
+ static int vert; // The 'vert' attribute given in the DESC file.
+ static int unitwidth; // The 'unitwidth' attribute given in the DESC file.
+ static int paperwidth; // The 'paperwidth' attribute given in the
+ // DESC file, or derived from the 'papersize'
+ // attribute given in the DESC file.
+ static int paperlength; // The 'paperlength' attribute given in the
+ // DESC file, or derived from the 'papersize'
+ // attribute given in the DESC file.
+ static const char *papersize;
+ static int biggestfont; // The 'biggestfont' attribute given in the
+ // DESC file.
+ static int spare2;
+ static int sizescale; // The 'sizescale' attribute given in the DESC file.
+ static bool has_tcommand; // DESC file has 'tcommand' directive.
+ static bool use_unscaled_charwidths; // DESC file has
+ // 'unscaled_charwidths' directive.
+ static bool pass_filenames; // DESC file has 'pass_filenames'
+ // directive.
+ static bool use_charnames_in_special; // DESC file has
+ // 'use_charnames_in_special' directive.
+ static bool is_unicode; // DESC file has the 'unicode' directive.
+ static const char *image_generator; // The 'image_generator' attribute
+ // given in the DESC file.
+ static const char **font_name_table; // The 'fonts' attribute given
+ // in the DESC file, as a null
+ // pointer-terminated array of strings.
+ static const char **style_table; // The 'styles' attribute given
+ // in the DESC file, as a null
+ // pointer-terminated array of strings.
+ static const char *family; // The 'family' attribute given in the DESC
+ // file.
+ static int *sizes; // The 'sizes' attribute given in the DESC file, as
+ // an array of intervals of the form { lower1,
+ // upper1, ... lowerN, upperN, 0 }.
+
+private:
+ unsigned ligatures; // Bit mask of available ligatures. Used by
+ // has_ligature().
+ font_kern_list **kern_hash_table; // Hash table of kerning pairs.
+ // Used by get_kern().
+ int space_width; // The normal width of a space. Used by
+ // get_space_width().
+ bool special; // See public is_special() above.
+ char *name; // The name of this font. Used by get_name().
+ char *internalname; // The 'internalname' attribute of this font, or
+ // a null pointer. Used by get_internal_name().
+ double slant; // The natural slant angle (in degrees) of this font.
+ int zoom; // The font's magnification, multiplied by 1000.
+ // Used by scale(). A zero value means 'no zoom'.
+ int *ch_index; // Conversion table from font-independent character
+ // indices to indices for this particular font.
+ int nindices;
+ font_char_metric *ch; // Metrics information for every character in this
+ // font (if !is_unicode) or for just some characters
+ // (if is_unicode). The indices of this array are
+ // font-specific, found as values in ch_index[].
+ int ch_used;
+ int ch_size;
+ font_widths_cache *widths_cache; // A cache of scaled character
+ // widths. Used by the get_width() function.
+
+ static FONT_COMMAND_HANDLER unknown_desc_command_handler; // A
+ // function defining the semantics of arbitrary
+ // commands in the DESC file.
+ enum { KERN_HASH_TABLE_SIZE = 503 }; // Size of the hash table of kerning
+ // pairs.
+
+ // These methods add new characters to the ch_index[] and ch[] arrays.
+ void add_entry(glyph *, // glyph
+ const font_char_metric &); // metric
+ void copy_entry(glyph *, // new_glyph
+ glyph *); // old_glyph
+ void alloc_ch_index(int); // index
+ void extend_ch();
+ void compact();
+
+ void add_kern(glyph *, glyph *, int); // Add to the kerning table a
+ // kerning amount (arg3) between two given glyphs
+ // (arg1 and arg2).
+ static int hash_kern(glyph *, glyph *); // Return a hash code for
+ // the pair of glyphs (arg1 and arg2).
+
+ /* Returns w * pointsize / unitwidth, rounded to the nearest integer. */
+ int scale(int w, int pointsize);
+ static bool unit_scale(double *, char); // Convert value in arg1 from
+ // the given unit (arg2; possible values are
+ // 'i', 'c', 'p', and 'P' as documented in the
+ // info file of groff, section 'Measurements')
+ // to inches. Store result in arg1 and return
+ // whether conversion was successful.
+ virtual void handle_unknown_font_command(const char *, // command
+ const char *, // arg
+ const char *, // file
+ int); // lineno
+
+protected:
+ font(const char *); // Initialize a font with the given name.
+
+ // Load the font description file with the name in member variable
+ // `name` into this object. If arg1 is true, only the part of the
+ // font description file before the 'charset' and 'kernpairs' sections
+ // is loaded. Return success/failure status of load.
+ bool load(bool = false);
+};
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/include/geometry.h b/src/include/geometry.h
new file mode 100644
index 0000000..9f87f1b
--- /dev/null
+++ b/src/include/geometry.h
@@ -0,0 +1,26 @@
+// -*- C++ -*-
+/* Copyright (C) 2001-2020 Free Software Foundation, Inc.
+ Written by Gaius Mulley <gaius@glam.ac.uk>
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int adjust_arc_center(const int *, double *);
+void check_output_arc_limits(int x, int y,
+ int xv1, int yv1,
+ int xv2, int yv2,
+ double c0, double c1,
+ int *minx, int *maxx,
+ int *miny, int *maxy);
diff --git a/src/include/getopt.h b/src/include/getopt.h
new file mode 100644
index 0000000..3d81e6d
--- /dev/null
+++ b/src/include/getopt.h
@@ -0,0 +1,226 @@
+/* Declarations for getopt.
+ Copyright (C) 1989-2020 Free Software Foundation, Inc.
+
+ This file is part of the GNU C Library.
+
+ 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 3 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, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GETOPT_H
+
+#ifndef __need_getopt
+# define _GETOPT_H 1
+#endif
+
+/* Standalone applications should #define __GETOPT_PREFIX to an
+ identifier that prefixes the external functions and variables
+ defined in this header. When this happens, include the
+ headers that might declare getopt so that they will not cause
+ confusion if included after this file. Then systematically rename
+ identifiers so that they do not collide with the system functions
+ and variables. Renaming avoids problems with some compilers and
+ linkers. */
+#if defined __GETOPT_PREFIX && !defined __need_getopt
+# include <stdlib.h>
+# include <stdio.h>
+# if HAVE_UNISTD_H
+# include <unistd.h>
+# endif
+# undef __need_getopt
+# undef getopt
+# undef getopt_long
+# undef getopt_long_only
+# undef optarg
+# undef opterr
+# undef optind
+# undef optopt
+# define __GETOPT_CONCAT(x, y) x ## y
+# define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y)
+# define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y)
+# define getopt __GETOPT_ID (getopt)
+# define getopt_long __GETOPT_ID (getopt_long)
+# define getopt_long_only __GETOPT_ID (getopt_long_only)
+# define optarg __GETOPT_ID (optarg)
+# define opterr __GETOPT_ID (opterr)
+# define optind __GETOPT_ID (optind)
+# define optopt __GETOPT_ID (optopt)
+#endif
+
+/* Standalone applications get correct prototypes for getopt_long and
+ getopt_long_only; they declare "char **argv". libc uses prototypes
+ with "char *const *argv" that are incorrect because getopt_long and
+ getopt_long_only can permute argv; this is required for backward
+ compatibility (e.g., for LSB 2.0.1).
+
+ This used to be '#if defined __GETOPT_PREFIX && !defined __need_getopt',
+ but it caused redefinition warnings if both unistd.h and getopt.h were
+ included, since unistd.h includes getopt.h having previously defined
+ __need_getopt.
+
+ The only place where __getopt_argv_const is used is in definitions
+ of getopt_long and getopt_long_only below, but these are visible
+ only if __need_getopt is not defined, so it is quite safe to rewrite
+ the conditional as follows:
+*/
+#if !defined __need_getopt
+# if defined __GETOPT_PREFIX
+# define __getopt_argv_const /* empty */
+# else
+# define __getopt_argv_const const
+# endif
+#endif
+
+/* If __GNU_LIBRARY__ is not already defined, either we are being used
+ standalone, or this is the first header included in the source file.
+ If we are being used with glibc, we need to include <features.h>, but
+ that does not exist if we are standalone. So: if __GNU_LIBRARY__ is
+ not defined, include <ctype.h>, which will pull in <features.h> for us
+ if it's from glibc. (Why ctype.h? It's guaranteed to exist and it
+ doesn't flood the namespace with stuff the way some other headers do.) */
+#if !defined __GNU_LIBRARY__
+# include <ctype.h>
+#endif
+
+#ifndef __THROW
+# ifndef __GNUC_PREREQ
+# define __GNUC_PREREQ(maj, min) (0)
+# endif
+# if defined __cplusplus && __GNUC_PREREQ (2,8)
+# define __THROW throw ()
+# else
+# define __THROW
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* For communication from 'getopt' to the caller.
+ When 'getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when 'ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to 'getopt'.
+
+ On entry to 'getopt', zero means this is the first call; initialize.
+
+ When 'getopt' returns -1, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, 'optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message 'getopt' prints
+ for unrecognized options. */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized. */
+
+extern int optopt;
+
+#ifndef __need_getopt
+/* Describe the long-named options requested by the application.
+ The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+ of 'struct option' terminated by an element containing a name which is
+ zero.
+
+ The field 'has_arg' is:
+ no_argument (or 0) if the option does not take an argument,
+ required_argument (or 1) if the option requires an argument,
+ optional_argument (or 2) if the option takes an optional argument.
+
+ If the field 'flag' is not NULL, it points to a variable that is set
+ to the value given in the field 'val' when the option is found, but
+ left unchanged if the option is not found.
+
+ To have a long-named option do something other than set an 'int' to
+ a compiled-in constant, such as set a value from 'optarg', set the
+ option's 'flag' field to zero and its 'val' field to a nonzero
+ value (the equivalent single-letter option character, if there is
+ one). For long options that have a zero 'flag' field, 'getopt'
+ returns the contents of the 'val' field. */
+
+struct option
+{
+ const char *name;
+ /* has_arg can't be an enum because some compilers complain about
+ type mismatches in all the code that assumes it is an int. */
+ int has_arg;
+ int *flag;
+ int val;
+};
+
+/* Names for the values of the 'has_arg' field of 'struct option'. */
+
+# define no_argument 0
+# define required_argument 1
+# define optional_argument 2
+#endif /* need getopt */
+
+
+/* Get definitions and prototypes for functions to process the
+ arguments in ARGV (ARGC of them, minus the program name) for
+ options given in OPTS.
+
+ Return the option character from OPTS just read. Return -1 when
+ there are no more options. For unrecognized options, or options
+ missing arguments, 'optopt' is set to the option letter, and '?' is
+ returned.
+
+ The OPTS string is a list of characters which are recognized option
+ letters, optionally followed by colons, specifying that that letter
+ takes an argument, to be placed in 'optarg'.
+
+ If a letter in OPTS is followed by two colons, its argument is
+ optional. This behavior is specific to the GNU 'getopt'.
+
+ The argument '--' causes premature termination of argument
+ scanning, explicitly telling 'getopt' that there are no more
+ options.
+
+ If OPTS begins with '--', then non-option arguments are treated as
+ arguments to the option '\0'. This behavior is specific to the GNU
+ 'getopt'. */
+
+extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
+ __THROW;
+
+#ifndef __need_getopt
+extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind)
+ __THROW;
+extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind)
+ __THROW;
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+/* Make sure we later can get all the definitions and declarations. */
+#undef __need_getopt
+
+#endif /* getopt.h */
diff --git a/src/include/getopt_int.h b/src/include/getopt_int.h
new file mode 100644
index 0000000..fa6be44
--- /dev/null
+++ b/src/include/getopt_int.h
@@ -0,0 +1,130 @@
+/* Internal declarations for getopt.
+ Copyright (C) 1989-2020 Free Software Foundation, Inc.
+
+ This file is part of the GNU C Library.
+
+ 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 3 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, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GETOPT_INT_H
+#define _GETOPT_INT_H 1
+
+extern int _getopt_internal (int ___argc, char **___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind,
+ int __long_only, int __posixly_correct);
+
+
+/* Reentrant versions which can handle parsing multiple argument
+ vectors at the same time. */
+
+/* Data type for reentrant functions. */
+struct _getopt_data
+{
+ /* These have exactly the same meaning as the corresponding global
+ variables, except that they are used for the reentrant
+ versions of getopt. */
+ int optind;
+ int opterr;
+ int optopt;
+ char *optarg;
+
+ /* Internal members. */
+
+ /* True if the internal members have been initialized. */
+ int __initialized;
+
+ /* The next char to be scanned in the option-element
+ in which the last option character we returned was found.
+ This allows us to pick up the scan where we left off.
+
+ If this is zero, or a null string, it means resume the scan
+ by advancing to the next ARGV-element. */
+ char *__nextchar;
+
+ /* Describe how to deal with options that follow non-option ARGV-elements.
+
+ If the caller did not specify anything,
+ the default is REQUIRE_ORDER if the environment variable
+ POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+ REQUIRE_ORDER means don't recognize them as options;
+ stop option processing when the first non-option is seen.
+ This is what Unix does.
+ This mode of operation is selected by either setting the environment
+ variable POSIXLY_CORRECT, or using '+' as the first character
+ of the list of option characters, or by calling getopt.
+
+ PERMUTE is the default. We permute the contents of ARGV as we
+ scan, so that eventually all the non-options are at the end.
+ This allows options to be given in any order, even with programs
+ that were not written to expect this.
+
+ RETURN_IN_ORDER is an option available to programs that were
+ written to expect options and other ARGV-elements in any order
+ and that care about the ordering of the two. We describe each
+ non-option ARGV-element as if it were the argument of an option
+ with character code 1. Using '-' as the first character of the
+ list of option characters selects this mode of operation.
+
+ The special argument '--' forces an end of option-scanning regardless
+ of the value of 'ordering'. In the case of RETURN_IN_ORDER, only
+ '--' can cause 'getopt' to return -1 with 'optind' != ARGC. */
+
+ enum
+ {
+ REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+ } __ordering;
+
+ /* If the POSIXLY_CORRECT environment variable is set
+ or getopt was called. */
+ int __posixly_correct;
+
+
+ /* Handle permutation of arguments. */
+
+ /* Describe the part of ARGV that contains non-options that have
+ been skipped. 'first_nonopt' is the index in ARGV of the first
+ of them; 'last_nonopt' is the index after the last of them. */
+
+ int __first_nonopt;
+ int __last_nonopt;
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+ int __nonoption_flags_max_len;
+ int __nonoption_flags_len;
+# endif
+};
+
+/* The initializer is necessary to set OPTIND and OPTERR to their
+ default values and to clear the initialization flag. */
+#define _GETOPT_DATA_INITIALIZER { 1, 1 }
+
+extern int _getopt_internal_r (int ___argc, char **___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind,
+ int __long_only, int __posixly_correct,
+ struct _getopt_data *__data);
+
+extern int _getopt_long_r (int ___argc, char **___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind,
+ struct _getopt_data *__data);
+
+extern int _getopt_long_only_r (int ___argc, char **___argv,
+ const char *__shortopts,
+ const struct option *__longopts,
+ int *__longind,
+ struct _getopt_data *__data);
+
+#endif /* getopt_int.h */
diff --git a/src/include/gettext.h b/src/include/gettext.h
new file mode 100644
index 0000000..8a22212
--- /dev/null
+++ b/src/include/gettext.h
@@ -0,0 +1,22 @@
+/* -*- C -*- */
+/* Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* This is a dummy header file to make getopt compile without gettext
+ support. */
+
+#define gettext(s) s
diff --git a/src/include/html-strings.h b/src/include/html-strings.h
new file mode 100644
index 0000000..eaf551b
--- /dev/null
+++ b/src/include/html-strings.h
@@ -0,0 +1,26 @@
+// -*- C++ -*-
+/* Copyright (C) 2001-2020 Free Software Foundation, Inc.
+ Written by Gaius Mulley (gaius@glam.ac.uk).
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/*
+ * defines the image tags issued by the pre-processors (tbl, pic, eqn)
+ * and later detected by pre-html.cpp
+ */
+
+#define HTML_IMAGE_INLINE_BEGIN "\\O[HTML-IMAGE-INLINE-BEGIN]"
+#define HTML_IMAGE_INLINE_END "\\O[HTML-IMAGE-INLINE-END]"
diff --git a/src/include/htmlhint.h b/src/include/htmlhint.h
new file mode 100644
index 0000000..c12a8b9
--- /dev/null
+++ b/src/include/htmlhint.h
@@ -0,0 +1,36 @@
+// -*- C++ -*-
+/* Copyright (C) 2000-2020 Free Software Foundation, Inc.
+ Written by Gaius Mulley <gaius@glam.ac.uk>
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef HTMLINDICATE_H
+#define HTMLINDICATE_H
+
+/*
+ * html_begin_suppress - suppresses output for the html device
+ * and resets the min/max registers for -Tps.
+ * Only called for inline images (such as eqn).
+ *
+ */
+extern void html_begin_suppress();
+
+/*
+ * html_end_suppress - end the suppression of output.
+ */
+extern void html_end_suppress();
+
+#endif
diff --git a/src/include/include.am b/src/include/include.am
new file mode 100644
index 0000000..ca32d6d
--- /dev/null
+++ b/src/include/include.am
@@ -0,0 +1,47 @@
+# Automake rules for 'include'
+#
+# Copyright (C) 2014-2020 Free Software Foundation, Inc.
+#
+# '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 of the License, 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 this program. If not, see
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+#
+########################################################################
+
+nodist_noinst_HEADERS = defs.h
+CLEANFILES += defs.h
+defs.h: config.status
+ @$(SHELL) $(top_srcdir)/gendef.sh defs.h \
+ "PROG_PREFIX=\"$(g)\"" \
+ "DEVICE=\"$(DEVICE)\"" \
+ "INSTALLPATH=\"$(prefix)\"" \
+ "BINPATH=\"$(bindir)\"" \
+ "FONTPATH=\"$(fontpath)\"" \
+ "MACROPATH=\"$(tmacpath)\"" \
+ "INDEX_SUFFIX=\"$(indexext)\"" \
+ "COMMON_WORDS_FILE=\"$(common_words_file)\"" \
+ "DEFAULT_INDEX_DIR=\"$(indexdir)\"" \
+ "DEFAULT_INDEX_NAME=\"$(indexname)\"" \
+ "DEFAULT_INDEX=\"$(indexdir)/$(indexname)\""
+
+dist-hook: dist_include
+dist_include:
+ chmod u+w $(distdir)/src/include
+ cp -f $(top_srcdir)/src/include/*.h $(distdir)/src/include
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/include/index.h b/src/include/index.h
new file mode 100644
index 0000000..a7d3201
--- /dev/null
+++ b/src/include/index.h
@@ -0,0 +1,41 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#define INDEX_MAGIC 0x23021964
+#define INDEX_VERSION 1
+
+struct index_header {
+ int magic;
+ int version;
+ int tags_size;
+ int table_size;
+ int lists_size;
+ int strings_size;
+ int truncate;
+ int shortest;
+ int common;
+};
+
+struct tag {
+ int filename_index;
+ int start;
+ int length;
+};
+
+unsigned hash(const char *s, int len);
diff --git a/src/include/itable.h b/src/include/itable.h
new file mode 100644
index 0000000..c97db55
--- /dev/null
+++ b/src/include/itable.h
@@ -0,0 +1,193 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <assert.h>
+
+// 'class ITABLE(T)' is the type of a hash table mapping an integer (int >= 0)
+// to an object of type T.
+//
+// 'struct IASSOC(T)' is the type of a association (pair) between an integer
+// (int >= 0) and an object of type T.
+//
+// 'class ITABLE_ITERATOR(T)' is the type of an iterator iterating through a
+// 'class ITABLE(T)'.
+//
+// Nowadays one would use templates for this; this code predates the addition
+// of templates to C++.
+#define ITABLE(T) T ## _itable
+#define IASSOC(T) T ## _iassoc
+#define ITABLE_ITERATOR(T) T ## _itable_iterator
+
+// ptable.h declares this too
+#ifndef NEXT_PTABLE_SIZE_DEFINED
+# define NEXT_PTABLE_SIZE_DEFINED
+extern unsigned next_ptable_size(unsigned); // Return the first suitable
+ // hash table size greater than the given
+ // value.
+#endif
+
+// Declare the types 'class ITABLE(T)', 'struct IASSOC(T)', and 'class
+// ITABLE_ITERATOR(T)' for the type 'T'.
+#define declare_itable(T) \
+ \
+struct IASSOC(T) { \
+ int key; \
+ T *val; \
+ IASSOC(T)(); \
+}; \
+ \
+class ITABLE(T); \
+ \
+class ITABLE_ITERATOR(T) { \
+ ITABLE(T) *p; \
+ unsigned i; \
+public: \
+ ITABLE_ITERATOR(T)(ITABLE(T) *); /* Initialize an iterator running \
+ through the given table. */ \
+ int next(int *, T **); /* Fetch the next pair, store the key \
+ and value in arg1 and arg2, \
+ respectively, and return 1. If \
+ there is no more pair in the \
+ table, return 0. */ \
+}; \
+ \
+class ITABLE(T) { \
+ IASSOC(T) *v; \
+ unsigned size; \
+ unsigned used; \
+ enum { \
+ FULL_NUM = 2, \
+ FULL_DEN = 3, \
+ INITIAL_SIZE = 17 \
+ }; \
+public: \
+ ITABLE(T)(); /* Create an empty table. */ \
+ ~ITABLE(T)(); /* Delete a table, including its \
+ values. */ \
+ void define(int, T *); /* Define the value (arg2) for a key \
+ (arg1). */ \
+ T *lookup(int); /* Return a pointer to the value of \
+ the given key, if found in the \
+ table, or NULL otherwise. */ \
+ friend class ITABLE_ITERATOR(T); \
+};
+
+
+// Values must be allocated by the caller (always using new[], not new)
+// and are freed by ITABLE.
+
+// Define the implementations of the members of the types 'class ITABLE(T)',
+// 'struct IASSOC(T)', 'class ITABLE_ITERATOR(T)' for the type 'T'.
+#define implement_itable(T) \
+ \
+IASSOC(T)::IASSOC(T)() \
+: key(-1), val(0) \
+{ \
+} \
+ \
+ITABLE(T)::ITABLE(T)() \
+{ \
+ v = new IASSOC(T)[size = INITIAL_SIZE]; \
+ used = 0; \
+} \
+ \
+ITABLE(T)::~ITABLE(T)() \
+{ \
+ for (unsigned i = 0; i < size; i++) \
+ delete[] v[i].val; \
+ delete[] v; \
+} \
+ \
+void ITABLE(T)::define(int key, T *val) \
+{ \
+ assert(key >= 0); \
+ unsigned int h = (unsigned int)(key); \
+ unsigned n; \
+ for (n = unsigned(h % size); \
+ v[n].key >= 0; \
+ n = (n == 0 ? size - 1 : n - 1)) \
+ if (v[n].key == key) { \
+ delete[] v[n].val; \
+ v[n].val = val; \
+ return; \
+ } \
+ if (val == 0) \
+ return; \
+ if (used*FULL_DEN >= size*FULL_NUM) { \
+ IASSOC(T) *oldv = v; \
+ unsigned old_size = size; \
+ size = next_ptable_size(size); \
+ v = new IASSOC(T)[size]; \
+ for (unsigned i = 0; i < old_size; i++) \
+ if (oldv[i].key >= 0) { \
+ if (oldv[i].val != 0) { \
+ unsigned j; \
+ for (j = (unsigned int)(oldv[i].key) % size; \
+ v[j].key >= 0; \
+ j = (j == 0 ? size - 1 : j - 1)) \
+ ; \
+ v[j].key = oldv[i].key; \
+ v[j].val = oldv[i].val; \
+ } \
+ } \
+ for (n = unsigned(h % size); \
+ v[n].key >= 0; \
+ n = (n == 0 ? size - 1 : n - 1)) \
+ ; \
+ delete[] oldv; \
+ } \
+ v[n].key = key; \
+ v[n].val = val; \
+ used++; \
+} \
+ \
+T *ITABLE(T)::lookup(int key) \
+{ \
+ assert(key >= 0); \
+ for (unsigned n = (unsigned int)key % size; \
+ v[n].key >= 0; \
+ n = (n == 0 ? size - 1 : n - 1)) \
+ if (v[n].key == key) \
+ return v[n].val; \
+ return 0; \
+} \
+ \
+ITABLE_ITERATOR(T)::ITABLE_ITERATOR(T)(ITABLE(T) *t) \
+: p(t), i(0) \
+{ \
+} \
+ \
+int ITABLE_ITERATOR(T)::next(int *keyp, T **valp) \
+{ \
+ unsigned size = p->size; \
+ IASSOC(T) *v = p->v; \
+ for (; i < size; i++) \
+ if (v[i].key >= 0) { \
+ *keyp = v[i].key; \
+ *valp = v[i].val; \
+ i++; \
+ return 1; \
+ } \
+ return 0; \
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/include/lf.h b/src/include/lf.h
new file mode 100644
index 0000000..dc85a84
--- /dev/null
+++ b/src/include/lf.h
@@ -0,0 +1,21 @@
+// -*- C++ -*-
+/* Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int interpret_lf_args(const char *p);
+void normalize_for_lf (string &fn);
diff --git a/src/include/lib.h b/src/include/lib.h
new file mode 100644
index 0000000..6b1d854
--- /dev/null
+++ b/src/include/lib.h
@@ -0,0 +1,161 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef GROFF_LIB_H
+#define GROFF_LIB_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#if defined(__INTERIX) && !defined(_ALL_SOURCE)
+#define _ALL_SOURCE
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifndef HAVE_STRERROR
+ char *strerror(int);
+#endif
+ const char *i_to_a(int);
+ const char *ui_to_a(unsigned int);
+ const char *if_to_a(int, int);
+#ifdef __cplusplus
+}
+#endif
+
+#define __GETOPT_PREFIX groff_
+#include <getopt.h>
+
+#ifdef HAVE_SETLOCALE
+#include <locale.h>
+#define getlocale(category) setlocale(category, NULL)
+#else /* !HAVE_SETLOCALE */
+#define LC_ALL 0
+#define LC_CTYPE 0
+#define setlocale(category, locale) (void)(category, locale)
+#define getlocale(category) ((void)(category), (char *)"C")
+#endif /* !HAVE_SETLOCALE */
+
+#include <stdbool.h>
+
+char *strsave(const char *s);
+bool is_prime(unsigned);
+double groff_hypot(double, double);
+
+#include <stdio.h>
+#include <string.h>
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* LynxOS 4.0.0 doesn't declare vfprintf() */
+#ifdef NEED_DECLARATION_VFPRINTF
+ int vfprintf(FILE *, const char *, va_list);
+#endif
+
+#ifndef HAVE_MKSTEMP
+/* since mkstemp() is defined as a real C++ function if taken from
+ groff's mkstemp.cpp we need a declaration */
+int mkstemp(char *tmpl);
+#endif /* HAVE_MKSTEMP */
+
+int mksdir(char *tmpl);
+
+#ifdef __cplusplus
+ FILE *xtmpfile(char **namep = 0,
+ const char *postfix_long = 0,
+ const char *postfix_short = 0,
+ int do_unlink = 1);
+ char *xtmptemplate(const char *postfix_long,
+ const char *postfix_short);
+#endif
+
+#ifdef NEED_DECLARATION_POPEN
+ FILE *popen(const char *, const char *);
+#endif /* NEED_DECLARATION_POPEN */
+
+#ifdef NEED_DECLARATION_PCLOSE
+ int pclose (FILE *);
+#endif /* NEED_DECLARATION_PCLOSE */
+
+ size_t file_name_max(const char *fname);
+ size_t path_name_max(void);
+
+ extern char invalid_char_table[];
+
+ inline bool is_invalid_input_char(int c)
+ {
+ return (c >= 0 && invalid_char_table[c]);
+ }
+
+#ifdef HAVE_STRCASECMP
+#ifdef NEED_DECLARATION_STRCASECMP
+// Ultrix4.3's string.h fails to declare this.
+ int strcasecmp(const char *, const char *); }
+#endif /* NEED_DECLARATION_STRCASECMP */
+#else /* !HAVE_STRCASECMP */
+ int strcasecmp(const char *, const char *);
+#endif /* HAVE_STRCASECMP */
+
+#if !defined(_AIX) && !defined(sinix) && !defined(__sinix__)
+#ifdef HAVE_STRNCASECMP
+#ifdef NEED_DECLARATION_STRNCASECMP
+// SunOS's string.h fails to declare this.
+ int strncasecmp(const char *, const char *, int);
+#endif /* NEED_DECLARATION_STRNCASECMP */
+#else /* !HAVE_STRNCASECMP */
+ int strncasecmp(const char *, const char *, size_t);
+#endif /* HAVE_STRNCASECMP */
+#endif /* !_AIX && !sinix && !__sinix__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#ifdef HAVE_CC_LIMITS_H
+#include <limits.h>
+#else /* !HAVE_CC_LIMITS_H */
+#define INT_MAX 2147483647
+#endif /* !HAVE_CC_LIMITS_H */
+
+/* Maximum number of digits in decimal representations of `int` types
+ not including a leading minus sign. */
+#define INT_DIGITS 19 /* enough for 64 bit integer */
+#define UINT_DIGITS 20
+
+#ifdef PI
+#undef PI
+#endif
+
+static const double PI = 3.14159265358979323846;
+
+#endif /* GROFF_LIB_H */
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/include/localcharset.h b/src/include/localcharset.h
new file mode 100644
index 0000000..bbf694e
--- /dev/null
+++ b/src/include/localcharset.h
@@ -0,0 +1,40 @@
+/* Determine a canonical name for the current locale's character encoding.
+ Copyright (C) 2000-2020 Free Software Foundation, Inc.
+ This file is part of the GNU CHARSET Library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _LOCALCHARSET_H
+#define _LOCALCHARSET_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Determine the current locale's character encoding, and canonicalize it
+ into one of the canonical names listed in config.charset.
+ The result must not be freed; it is statically allocated.
+ If the canonical name cannot be determined, the result is a non-canonical
+ name. */
+extern const char * locale_charset (void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _LOCALCHARSET_H */
diff --git a/src/include/macropath.h b/src/include/macropath.h
new file mode 100644
index 0000000..26c1baf
--- /dev/null
+++ b/src/include/macropath.h
@@ -0,0 +1,22 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+extern search_path macro_path;
+extern search_path safer_macro_path;
+extern search_path config_macro_path;
diff --git a/src/include/nonposix.h b/src/include/nonposix.h
new file mode 100644
index 0000000..6a61009
--- /dev/null
+++ b/src/include/nonposix.h
@@ -0,0 +1,230 @@
+/* -*- C -*- */
+/* Copyright (C) 2000-2020 Free Software Foundation, Inc.
+ Written by Eli Zaretskii (eliz@is.elta.co.il)
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* This header file compartmentalize all idiosyncrasies of non-Posix
+ systems, such as MS-DOS, MS-Windows, etc. It should be loaded after
+ the system headers like stdio.h to protect against warnings and error
+ messages w.r.t. redefining macros. */
+
+#if defined _MSC_VER
+# ifndef _WIN32
+# define _WIN32
+# endif
+#endif
+
+#if defined(__MSDOS__) || defined(__EMX__) \
+ || (defined(_WIN32) && !defined(_UWIN) && !defined(__CYGWIN__))
+
+/* Binary I/O nuisances. */
+# include <fcntl.h>
+# include <io.h>
+# ifdef HAVE_UNISTD_H
+# include <unistd.h>
+# endif
+# ifndef STDIN_FILENO
+# define STDIN_FILENO 0
+# define STDOUT_FILENO 1
+# define STDERR_FILENO 2
+# endif
+# ifdef HAVE_DIRECT_H
+# include <direct.h>
+# endif
+# ifdef HAVE_PROCESS_H
+# include <process.h>
+# endif
+# if defined(_MSC_VER) || defined(__MINGW32__)
+# define POPEN_RT "rt"
+# define POPEN_WT "wt"
+# define popen(c,m) _popen(c,m)
+# define pclose(p) _pclose(p)
+# define pipe(pfd) _pipe((pfd),0,_O_BINARY|_O_NOINHERIT)
+# define mkdir(p,m) _mkdir(p)
+# define setmode(f,m) _setmode(f,m)
+# define WAIT(s,p,m) _cwait(s,p,m)
+# define creat(p,m) _creat(p,m)
+# define read(f,b,s) _read(f,b,s)
+# define write(f,b,s) _write(f,b,s)
+# define dup(f) _dup(f)
+# define dup2(f1,f2) _dup2(f1,f2)
+# define close(f) _close(f)
+# define isatty(f) _isatty(f)
+# define access(p,m) _access(p,m)
+# endif
+# define SET_BINARY(f) do {if (!isatty(f)) setmode(f,O_BINARY);} while(0)
+# define FOPEN_RB "rb"
+# define FOPEN_WB "wb"
+# define FOPEN_RWB "wb+"
+# ifndef O_BINARY
+# ifdef _O_BINARY
+# define O_BINARY (_O_BINARY)
+# endif
+# endif
+
+/* The system shell. Groff assumes a Unixy shell, but non-Posix
+ systems don't have standard places where it lives, and might not
+ have it installed to begin with. We want to give them some leeway. */
+# ifdef __EMX__
+# define getcwd(b,s) _getcwd2(b,s)
+# else
+# define BSHELL (system_shell_name())
+# define BSHELL_DASH_C (system_shell_dash_c())
+# define IS_BSHELL(s) (is_system_shell(s))
+# endif
+
+/* The separator for directories in PATH and other environment
+ variables. */
+# define PATH_SEP ";"
+# define PATH_SEP_CHAR ';'
+
+/* Characters that separate directories in a path name. */
+# define DIR_SEPS "/\\:"
+
+/* How to tell if the argument is an absolute file name. */
+# define IS_ABSOLUTE(f) \
+ ((f)[0] == '/' || (f)[0] == '\\' || (f)[0] && (f)[1] == ':')
+
+/* The executable extension. */
+# define EXE_EXT ".exe"
+
+/* Possible executable extensions. */
+# define PATH_EXT ".com;.exe;.bat;.cmd"
+
+/* The system null device. */
+# define NULL_DEV "NUL"
+
+/* The default place to create temporary files. */
+# ifndef P_tmpdir
+# ifdef _P_tmpdir
+# define P_tmpdir _P_tmpdir
+# else
+# define P_tmpdir "c:/temp"
+# endif
+# endif
+
+/* Prototypes. */
+# ifdef __cplusplus
+ extern "C" {
+# endif
+ char * system_shell_name(void);
+ const char * system_shell_dash_c(void);
+ int is_system_shell(const char *);
+# ifdef __cplusplus
+ }
+# endif
+
+#endif
+
+#if defined(_WIN32) && !defined(_UWIN) && !defined(__CYGWIN__)
+/* Win32 implementations which use the Microsoft runtime library
+ * are prone to hanging when a pipe reader quits with unread data in the pipe.
+ * 'gtroff' avoids this, by invoking 'FLUSH_INPUT_PIPE()', defined as ... */
+# define FLUSH_INPUT_PIPE(fd) \
+ do if (!isatty(fd)) \
+ { \
+ char drain[BUFSIZ]; \
+ while (read(fd, drain, sizeof(drain)) > 0) \
+ ; \
+ } while (0)
+
+/* The Microsoft runtime library also has a broken argument passing mechanism,
+ * which may result in improper grouping of arguments passed to a child process
+ * by the 'spawn()' family of functions. In 'groff', only the 'spawnvp()'
+ * function is affected; we work around this defect, by substituting a
+ * wrapper function in place of 'spawnvp()' calls. */
+
+# ifdef __cplusplus
+ extern "C" {
+# endif
+ int spawnvp_wrapper(int, char *, char **);
+# ifdef __cplusplus
+ }
+# endif
+# ifndef SPAWN_FUNCTION_WRAPPERS
+# undef spawnvp
+# define spawnvp spawnvp_wrapper
+# undef _spawnvp
+# define _spawnvp spawnvp
+# endif /* SPAWN_FUNCTION_WRAPPERS */
+
+#else
+/* Other implementations do not suffer from Microsoft runtime bugs,
+ * but 'gtroff' requires a dummy definition for FLUSH_INPUT_PIPE() */
+# define FLUSH_INPUT_PIPE(fd) do {} while(0)
+#endif
+
+/* Defaults, for Posix systems. */
+
+#ifndef SET_BINARY
+# define SET_BINARY(f) do {} while(0)
+#endif
+#ifndef FOPEN_RB
+# define FOPEN_RB "r"
+#endif
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef FOPEN_RWB
+# define FOPEN_RWB "w+"
+#endif
+#ifndef POPEN_RT
+# define POPEN_RT "r"
+#endif
+#ifndef POPEN_WT
+# define POPEN_WT "w"
+#endif
+#ifndef O_BINARY
+# define O_BINARY 0
+#endif
+#ifndef BSHELL
+# define BSHELL "/bin/sh"
+#endif
+#ifndef BSHELL_DASH_C
+# define BSHELL_DASH_C "-c"
+#endif
+#ifndef IS_BSHELL
+# define IS_BSHELL(s) ((s) && strcmp(s,BSHELL) == 0)
+#endif
+#ifndef PATH_SEP
+# define PATH_SEP ":"
+# define PATH_SEP_CHAR ':'
+#endif
+#ifndef DIR_SEPS
+# define DIR_SEPS "/"
+#endif
+#ifndef IS_ABSOLUTE
+# define IS_ABSOLUTE(f) ((f)[0] == '/')
+#endif
+#ifndef EXE_EXT
+# define EXE_EXT ""
+#endif
+#ifndef PATH_EXT
+# define PATH_EXT ""
+#endif
+#ifndef NULL_DEV
+# define NULL_DEV "/dev/null"
+#endif
+#ifndef GS_NAME
+# define GS_NAME "gs"
+#endif
+#ifndef WAIT
+# define WAIT(s,p,m) wait(s)
+#endif
+#ifndef _WAIT_CHILD
+# define _WAIT_CHILD 0
+#endif
diff --git a/src/include/paper.h b/src/include/paper.h
new file mode 100644
index 0000000..ed789c4
--- /dev/null
+++ b/src/include/paper.h
@@ -0,0 +1,36 @@
+// -*- C++ -*-
+/* Copyright (C) 2002-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+struct paper {
+ char *name;
+ double length; // in PS points
+ double width; // in PS points
+};
+
+// global constructor
+static class papersize_init {
+ static int initialised;
+public:
+ papersize_init();
+} _papersize_init;
+
+// A0-A7, B0-B7, C0-C7, D0-D7, 8 American paper sizes, 1 special size */
+#define NUM_PAPERSIZES 4*8 + 8 + 1
+
+extern paper papersizes[];
diff --git a/src/include/posix.h b/src/include/posix.h
new file mode 100644
index 0000000..81c2d22
--- /dev/null
+++ b/src/include/posix.h
@@ -0,0 +1,66 @@
+// -*- C++ -*-
+/* Copyright (C) 1992-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifdef HAVE_CC_OSFCN_H
+#include <osfcn.h>
+#else
+#include <fcntl.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#endif
+
+#ifndef S_IRUSR
+#define S_IRUSR 0400
+#endif
+
+#ifndef S_IRGRP
+#define S_IRGRP 0040
+#endif
+
+#ifndef S_IROTH
+#define S_IROTH 0004
+#endif
+
+#ifndef S_IWUSR
+#define S_IWUSR 0200
+#endif
+
+#ifndef S_IXUSR
+#define S_IXUSR 0100
+#endif
+
+#ifndef S_ISREG
+#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
+#endif
+
+#ifndef O_RDONLY
+#define O_RDONLY 0
+#endif
+
+#ifndef F_OK
+#define F_OK 0
+#endif
+
+#ifndef HAVE_ISATTY
+#define isatty(n) (1)
+#endif
diff --git a/src/include/printer.h b/src/include/printer.h
new file mode 100644
index 0000000..7b6a7ba
--- /dev/null
+++ b/src/include/printer.h
@@ -0,0 +1,97 @@
+// -*- C++ -*-
+
+// <groff_src_dir>/src/include/printer.h
+
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/* Description
+
+ The class 'printer' performs the postprocessing. Each
+ postprocessor only needs to implement a derived class of 'printer' and
+ a suitable function 'make_printer' for the device-dependent tasks.
+ Then the methods of class 'printer' are called automatically by
+ 'do_file()' in 'input.cpp'.
+*/
+
+#include "color.h"
+
+struct environment {
+ int fontno;
+ int size;
+ int hpos;
+ int vpos;
+ int height;
+ int slant;
+ color *col;
+ color *fill;
+};
+
+class font;
+
+struct font_pointer_list {
+ font *p;
+ font_pointer_list *next;
+
+ font_pointer_list(font *, font_pointer_list *);
+};
+
+class printer {
+public:
+ printer();
+ virtual ~printer();
+ void load_font(int, const char *);
+ void set_ascii_char(unsigned char, const environment *, int * = 0);
+ void set_special_char(const char *, const environment *, int * = 0);
+ virtual void set_numbered_char(int, const environment *, int * = 0);
+ glyph *set_char_and_width(const char *, const environment *,
+ int *, font **);
+ font *get_font_from_index(int);
+ virtual void draw(int, int *, int, const environment *);
+ // perform change of line color (text, outline) in the print-out
+ virtual void change_color(const environment * const);
+ // perform change of fill color in the print-out
+ virtual void change_fill_color(const environment * const);
+ virtual void begin_page(int) = 0;
+ virtual void end_page(int) = 0;
+ virtual font *make_font(const char *);
+ virtual void end_of_line();
+ virtual void special(char *, const environment *, char = 'p');
+ virtual void devtag(char *, const environment *, char = 'p');
+
+protected:
+ font_pointer_list *font_list;
+ font **font_table;
+ int nfonts;
+
+ // information about named characters
+ int is_char_named;
+ int is_named_set;
+ char named_command;
+ const char *named_char_s;
+ int named_char_n;
+
+private:
+ font *find_font(const char *);
+ virtual void set_char(glyph *, font *, const environment *, int,
+ const char *) = 0;
+};
+
+printer *make_printer();
diff --git a/src/include/ptable.h b/src/include/ptable.h
new file mode 100644
index 0000000..fa79293
--- /dev/null
+++ b/src/include/ptable.h
@@ -0,0 +1,233 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <assert.h>
+#include <string.h>
+
+// 'class PTABLE(T)' is the type of a hash table mapping a string
+// (const char *) to an object of type T.
+//
+// 'struct PASSOC(T)' is the type of a association (pair) between a
+// string (const char *) and an object of type T.
+//
+// 'class PTABLE_ITERATOR(T)' is the type of an iterator iterating through a
+// 'class PTABLE(T)'.
+//
+// Nowadays one would use templates for this; this code predates the addition
+// of templates to C++.
+#define PTABLE(T) T ## _ptable
+#define PASSOC(T) T ## _passoc
+#define PTABLE_ITERATOR(T) T ## _ptable_iterator
+
+// itable.h declares this too
+#ifndef NEXT_PTABLE_SIZE_DEFINED
+# define NEXT_PTABLE_SIZE_DEFINED
+extern unsigned next_ptable_size(unsigned); // Return the first suitable
+ // hash table size greater than the given
+ // value.
+#endif
+
+extern unsigned long hash_string(const char *); // Return a hash code of the
+ // given string. The hash function is
+ // platform dependent. */
+
+// Declare the types 'class PTABLE(T)', 'struct PASSOC(T)', and 'class
+// PTABLE_ITERATOR(T)' for the type 'T'.
+#define declare_ptable(T) \
+ \
+struct PASSOC(T) { \
+ char *key; \
+ T *val; \
+ PASSOC(T)(); \
+}; \
+ \
+class PTABLE(T); \
+ \
+class PTABLE_ITERATOR(T) { \
+ PTABLE(T) *p; \
+ unsigned i; \
+public: \
+ PTABLE_ITERATOR(T)(PTABLE(T) *); /* Initialize an iterator running \
+ through the given table. */ \
+ int next(const char **, T **); /* Fetch the next pair, store the key \
+ and value in arg1 and arg2, \
+ respectively, and return 1. If \
+ there is no more pair in the \
+ table, return 0. */ \
+}; \
+ \
+class PTABLE(T) { \
+ PASSOC(T) *v; \
+ unsigned size; \
+ unsigned used; \
+ enum { \
+ FULL_NUM = 1, \
+ FULL_DEN = 4, \
+ INITIAL_SIZE = 17 \
+ }; \
+public: \
+ PTABLE(T)(); /* Create an empty table. */ \
+ ~PTABLE(T)(); /* Delete a table, including its \
+ values. */ \
+ const char *define(const char *, T *);/* Define the value (arg2) for a key \
+ (arg1). Return the copy in the \
+ table of the key (arg1), or \
+ possibly NULL if the value (arg2) \
+ is NULL. */ \
+ T *lookup(const char *); /* Return a pointer to the value of \
+ the given key, if found in the \
+ table, or NULL otherwise. */ \
+ T *lookupassoc(const char **); /* Return a pointer to the value of \
+ the given key, passed by reference,\
+ and replace the key argument with \
+ the copy found in the table, if \
+ the key is found in the table. \
+ Return NULL otherwise. */ \
+ friend class PTABLE_ITERATOR(T); \
+};
+
+
+// Keys (which are strings) are allocated and freed by PTABLE.
+// Values must be allocated by the caller (always using new[], not new)
+// and are freed by PTABLE.
+
+// Define the implementations of the members of the types 'class PTABLE(T)',
+// 'struct PASSOC(T)', 'class PTABLE_ITERATOR(T)' for the type 'T'.
+#define implement_ptable(T) \
+ \
+PASSOC(T)::PASSOC(T)() \
+: key(0), val(0) \
+{ \
+} \
+ \
+PTABLE(T)::PTABLE(T)() \
+{ \
+ v = new PASSOC(T)[size = INITIAL_SIZE]; \
+ used = 0; \
+} \
+ \
+PTABLE(T)::~PTABLE(T)() \
+{ \
+ for (unsigned i = 0; i < size; i++) { \
+ free(v[i].key); \
+ /* XXX leak, because we don't know whether */ \
+ /* 'free', 'delete', or 'delete[]' should be used */ \
+ /* delete[] v[i].val; */ \
+ } \
+ delete[] v; \
+} \
+ \
+const char *PTABLE(T)::define(const char *key, T *val) \
+{ \
+ assert(key != 0); \
+ unsigned long h = hash_string(key); \
+ unsigned n; \
+ for (n = unsigned(h % size); \
+ v[n].key != 0; \
+ n = (n == 0 ? size - 1 : n - 1)) \
+ if (strcmp(v[n].key, key) == 0) { \
+ /* XXX leak, because we don't know whether */ \
+ /* 'free', 'delete', or 'delete[]' should be used */ \
+ /* delete[] v[n].val; */ \
+ v[n].val = val; \
+ return v[n].key; \
+ } \
+ if (val == 0) \
+ return 0; \
+ if (used*FULL_DEN >= size*FULL_NUM) { \
+ PASSOC(T) *oldv = v; \
+ unsigned old_size = size; \
+ size = next_ptable_size(size); \
+ v = new PASSOC(T)[size]; \
+ for (unsigned i = 0; i < old_size; i++) \
+ if (oldv[i].key != 0) { \
+ if (oldv[i].val == 0) \
+ free(oldv[i].key); \
+ else { \
+ unsigned j; \
+ for (j = unsigned(hash_string(oldv[i].key) % size); \
+ v[j].key != 0; \
+ j = (j == 0 ? size - 1 : j - 1)) \
+ ; \
+ v[j].key = oldv[i].key; \
+ v[j].val = oldv[i].val; \
+ } \
+ } \
+ for (n = unsigned(h % size); \
+ v[n].key != 0; \
+ n = (n == 0 ? size - 1 : n - 1)) \
+ ; \
+ delete[] oldv; \
+ } \
+ char *temp = (char*)malloc(strlen(key)+1); \
+ strcpy(temp, key); \
+ v[n].key = temp; \
+ v[n].val = val; \
+ used++; \
+ return temp; \
+} \
+ \
+T *PTABLE(T)::lookup(const char *key) \
+{ \
+ assert(key != 0); \
+ for (unsigned n = unsigned(hash_string(key) % size); \
+ v[n].key != 0; \
+ n = (n == 0 ? size - 1 : n - 1)) \
+ if (strcmp(v[n].key, key) == 0) \
+ return v[n].val; \
+ return 0; \
+} \
+ \
+T *PTABLE(T)::lookupassoc(const char **keyptr) \
+{ \
+ const char *key = *keyptr; \
+ assert(key != 0); \
+ for (unsigned n = unsigned(hash_string(key) % size); \
+ v[n].key != 0; \
+ n = (n == 0 ? size - 1 : n - 1)) \
+ if (strcmp(v[n].key, key) == 0) { \
+ *keyptr = v[n].key; \
+ return v[n].val; \
+ } \
+ return 0; \
+} \
+ \
+PTABLE_ITERATOR(T)::PTABLE_ITERATOR(T)(PTABLE(T) *t) \
+: p(t), i(0) \
+{ \
+} \
+ \
+int PTABLE_ITERATOR(T)::next(const char **keyp, T **valp) \
+{ \
+ unsigned size = p->size; \
+ PASSOC(T) *v = p->v; \
+ for (; i < size; i++) \
+ if (v[i].key != 0) { \
+ *keyp = v[i].key; \
+ *valp = v[i].val; \
+ i++; \
+ return 1; \
+ } \
+ return 0; \
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/include/refid.h b/src/include/refid.h
new file mode 100644
index 0000000..9bf3a40
--- /dev/null
+++ b/src/include/refid.h
@@ -0,0 +1,34 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+class reference_id {
+ int filename_id;
+ int pos;
+public:
+ reference_id() : filename_id(-1) { }
+ reference_id(int fid, int off) : filename_id(fid), pos(off) { }
+ unsigned hash() const { return (filename_id << 4) + pos; }
+ int is_null() const { return filename_id < 0; }
+ friend inline int operator==(const reference_id &, const reference_id &);
+};
+
+inline int operator==(const reference_id &r1, const reference_id &r2)
+{
+ return r1.filename_id == r2.filename_id && r1.pos == r2.pos;
+}
diff --git a/src/include/relocate.h b/src/include/relocate.h
new file mode 100644
index 0000000..851e2cc
--- /dev/null
+++ b/src/include/relocate.h
@@ -0,0 +1,37 @@
+/* -*- C -*- */
+/* Provide relocation for macro and font files.
+
+ Copyright (C) 2005-2020 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation, either version 3 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef __cplusplus
+extern char *curr_prefix;
+extern size_t curr_prefix_len;
+
+void set_current_prefix ();
+char *xdirname (char *s);
+char *searchpath (const char *name, const char *pathp);
+#endif
+
+/* This function has C linkage. */
+extern
+#ifdef __cplusplus
+"C"
+#endif
+char *relocatep (const char *path);
+
+#ifdef __cplusplus
+char *relocate (const char *path);
+#endif
diff --git a/src/include/search.h b/src/include/search.h
new file mode 100644
index 0000000..eb9a039
--- /dev/null
+++ b/src/include/search.h
@@ -0,0 +1,100 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+class search_item;
+class search_item_iterator;
+
+class search_list {
+public:
+ search_list();
+ ~search_list();
+ void add_file(const char *fn, int silent = 0);
+ int nfiles() const;
+private:
+ search_item *list;
+ int niterators;
+ int next_fid;
+ friend class search_list_iterator;
+};
+
+class bmpattern;
+
+class linear_searcher {
+ const char *ignore_fields;
+ int truncate_len;
+ bmpattern **keys;
+ int nkeys;
+ const char *search_and_check(const bmpattern *key, const char *buf,
+ const char *bufend, const char **start = 0)
+ const;
+ int check_match(const char *buf, const char *bufend, const char *match,
+ int matchlen, const char **cont, const char **start)
+ const;
+public:
+ linear_searcher(const char *query, int query_len,
+ const char *ign, int trunc);
+ ~linear_searcher();
+ int search(const char *buf, const char *bufend,
+ const char **startp, int *lengthp) const;
+};
+
+class search_list_iterator {
+ search_list *list;
+ search_item *ptr;
+ search_item_iterator *iter;
+ char *query;
+ linear_searcher searcher;
+public:
+ search_list_iterator(search_list *, const char *query);
+ ~search_list_iterator();
+ int next(const char **, int *, reference_id * = 0);
+};
+
+class search_item {
+protected:
+ char *name;
+ int filename_id;
+public:
+ search_item *next;
+ search_item(const char *nm, int fid);
+ virtual search_item_iterator *make_search_item_iterator(const char *) = 0;
+ virtual ~search_item();
+ int is_named(const char *) const;
+ virtual int next_filename_id() const;
+};
+
+class search_item_iterator {
+ char shut_g_plus_plus_up;
+public:
+ virtual ~search_item_iterator();
+ virtual int next(const linear_searcher &, const char **ptr, int *lenp,
+ reference_id *) = 0;
+};
+
+search_item *make_index_search_item(const char *filename, int fid);
+search_item *make_linear_search_item(int fd, const char *filename, int fid);
+
+extern int linear_truncate_len;
+extern const char *linear_ignore_fields;
+extern bool do_verify;
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/include/searchpath.h b/src/include/searchpath.h
new file mode 100644
index 0000000..2dda4e8
--- /dev/null
+++ b/src/include/searchpath.h
@@ -0,0 +1,30 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+class search_path {
+ char *dirs;
+ unsigned init_len;
+public:
+ search_path(const char *envvar, const char *standard,
+ int add_home, int add_current);
+ ~search_path();
+ void command_line_dir(const char *);
+ FILE *open_file(const char *, char **);
+ FILE *open_file_cautious(const char *, char ** = 0, const char * = 0);
+};
diff --git a/src/include/stringclass.h b/src/include/stringclass.h
new file mode 100644
index 0000000..ca0bf85
--- /dev/null
+++ b/src/include/stringclass.h
@@ -0,0 +1,194 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+
+// Ensure that the first declaration of functions that are later
+// declared as inline declares them as inline.
+
+class string;
+
+inline string operator+(const string &, const string &);
+inline string operator+(const string &, const char *);
+inline string operator+(const char *, const string &);
+inline string operator+(const string &, char);
+inline string operator+(char, const string &);
+inline int operator==(const string &, const string &);
+inline int operator!=(const string &, const string &);
+
+class string {
+public:
+ string();
+ string(const string &);
+ string(const char *);
+ string(const char *, int);
+ string(char);
+
+ ~string();
+
+ string &operator=(const string &);
+ string &operator=(const char *);
+ string &operator=(char);
+
+ string &operator+=(const string &);
+ string &operator+=(const char *);
+ string &operator+=(char);
+ void append(const char *, int);
+
+ int length() const;
+ int empty() const;
+ int operator*() const;
+
+ string substring(int i, int n) const;
+
+ char &operator[](int);
+ char operator[](int) const;
+
+ void set_length(int i);
+ const char *contents() const;
+ int search(char) const;
+ char *extract() const;
+ void remove_spaces();
+ void clear();
+ void move(string &);
+
+ friend string operator+(const string &, const string &);
+ friend string operator+(const string &, const char *);
+ friend string operator+(const char *, const string &);
+ friend string operator+(const string &, char);
+ friend string operator+(char, const string &);
+
+ friend int operator==(const string &, const string &);
+ friend int operator!=(const string &, const string &);
+ friend int operator<=(const string &, const string &);
+ friend int operator<(const string &, const string &);
+ friend int operator>=(const string &, const string &);
+ friend int operator>(const string &, const string &);
+
+private:
+ char *ptr;
+ int len;
+ int sz;
+
+ string(const char *, int, const char *, int); // for use by operator+
+ void grow1();
+};
+
+
+inline char &string::operator[](int i)
+{
+ assert(i >= 0 && i < len);
+ return ptr[i];
+}
+
+inline char string::operator[](int i) const
+{
+ assert(i >= 0 && i < len);
+ return ptr[i];
+}
+
+inline int string::length() const
+{
+ return len;
+}
+
+inline int string::empty() const
+{
+ return len == 0;
+}
+
+inline int string::operator*() const
+{
+ return len;
+}
+
+inline const char *string::contents() const
+{
+ return ptr;
+}
+
+inline string operator+(const string &s1, const string &s2)
+{
+ return string(s1.ptr, s1.len, s2.ptr, s2.len);
+}
+
+inline string operator+(const string &s1, const char *s2)
+{
+#ifdef __GNUG__
+ if (s2 == 0)
+ return s1;
+ else
+ return string(s1.ptr, s1.len, s2, strlen(s2));
+#else
+ return s2 == 0 ? s1 : string(s1.ptr, s1.len, s2, strlen(s2));
+#endif
+}
+
+inline string operator+(const char *s1, const string &s2)
+{
+#ifdef __GNUG__
+ if (s1 == 0)
+ return s2;
+ else
+ return string(s1, strlen(s1), s2.ptr, s2.len);
+#else
+ return s1 == 0 ? s2 : string(s1, strlen(s1), s2.ptr, s2.len);
+#endif
+}
+
+inline string operator+(const string &s, char c)
+{
+ return string(s.ptr, s.len, &c, 1);
+}
+
+inline string operator+(char c, const string &s)
+{
+ return string(&c, 1, s.ptr, s.len);
+}
+
+inline int operator==(const string &s1, const string &s2)
+{
+ return (s1.len == s2.len
+ && (s1.len == 0 || memcmp(s1.ptr, s2.ptr, s1.len) == 0));
+}
+
+inline int operator!=(const string &s1, const string &s2)
+{
+ return (s1.len != s2.len
+ || (s1.len != 0 && memcmp(s1.ptr, s2.ptr, s1.len) != 0));
+}
+
+inline string string::substring(int i, int n) const
+{
+ assert(i >= 0 && i + n <= len);
+ return string(ptr + i, n);
+}
+
+inline string &string::operator+=(char c)
+{
+ if (len >= sz)
+ grow1();
+ ptr[len++] = c;
+ return *this;
+}
+
+void put_string(const string &, FILE *);
+
+string as_string(int);
diff --git a/src/include/symbol.h b/src/include/symbol.h
new file mode 100644
index 0000000..047255d
--- /dev/null
+++ b/src/include/symbol.h
@@ -0,0 +1,88 @@
+/* Copyright (C) 1989-2023 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdint.h> // uintptr_t
+
+#define DONT_STORE 1
+#define MUST_ALREADY_EXIST 2
+
+class symbol {
+ static const char **table;
+ static int table_used;
+ static int table_size;
+ static char *block;
+ static int block_size;
+ const char *s;
+public:
+ symbol(const char *p, int how = 0);
+ symbol();
+ uintptr_t hash() const;
+ int operator ==(symbol) const;
+ int operator !=(symbol) const;
+ const char *contents() const;
+ int is_null() const;
+ int is_empty() const;
+};
+
+
+extern const symbol NULL_SYMBOL;
+extern const symbol EMPTY_SYMBOL;
+
+inline symbol::symbol() : s(0)
+{
+}
+
+inline int symbol::operator==(symbol p) const
+{
+ return s == p.s;
+}
+
+inline int symbol::operator!=(symbol p) const
+{
+ return s != p.s;
+}
+
+inline uintptr_t symbol::hash() const
+{
+ return reinterpret_cast<uintptr_t>(s);
+}
+
+inline const char *symbol::contents() const
+{
+ return s;
+}
+
+inline int symbol::is_null() const
+{
+ return s == 0;
+}
+
+inline int symbol::is_empty() const
+{
+ return s != 0 && *s == 0;
+}
+
+symbol concat(symbol, symbol);
+
+extern symbol default_symbol;
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/include/unicode.h b/src/include/unicode.h
new file mode 100644
index 0000000..670864b
--- /dev/null
+++ b/src/include/unicode.h
@@ -0,0 +1,63 @@
+// -*- C++ -*-
+/* Copyright (C) 2002-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+// Convert a groff glyph name to a string containing an underscore-separated
+// list of Unicode code points. For example,
+//
+// '-' -> '2010'
+// ',c' -> '00E7'
+// 'fl' -> '0066_006C'
+//
+// Return NULL if there is no equivalent.
+const char *glyph_name_to_unicode(const char *);
+
+// Convert a string containing an underscore-separated list of Unicode code
+// points to a groff glyph name. For example,
+//
+// '2010' -> 'hy'
+// '0066_006C' -> 'fl'
+//
+// Return NULL if there is no equivalent.
+const char *unicode_to_glyph_name(const char *);
+
+// Convert a string containing a precomposed Unicode character to a string
+// containing an underscore-separated list of Unicode code points,
+// representing its canonical decomposition. Also perform compatibility
+// equivalent replacement. For example,
+//
+// '1F3A' -> '0399_0313_0300'
+// 'FA6A' -> '983B'
+//
+// Return NULL if there is no equivalent.
+const char *decompose_unicode(const char *);
+
+// Test whether the given string denotes a Unicode character. It must
+// be of the form 'uNNNN', obeying the following rules.
+//
+// - 'NNNN' must consist of at least 4 hexadecimal digits in upper case.
+// - If there are more than 4 hexadecimal digits, the leading one must not
+// be zero,
+// - 'NNNN' must denote a valid Unicode code point (U+0000..U+10FFFF,
+// excluding surrogate code points.
+//
+// Return a pointer to 'NNNN' (skipping the leading 'u' character) in case
+// of success, NULL otherwise.
+const char *check_unicode_name(const char *);
+
+// end of unicode.h
diff --git a/src/libs/libbib/common.cpp b/src/libs/libbib/common.cpp
new file mode 100644
index 0000000..05accd8
--- /dev/null
+++ b/src/libs/libbib/common.cpp
@@ -0,0 +1,37 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+unsigned hash(const char *s, int len)
+{
+#if 0
+ unsigned h = 0, g;
+ while (*s != '\0') {
+ h <<= 4;
+ h += *s++;
+ if ((g = h & 0xf0000000) != 0) {
+ h ^= g >> 24;
+ h ^= g;
+ }
+ }
+#endif
+ unsigned h = 0;
+ while (--len >= 0)
+ h = *s++ + 65587*h;
+ return h;
+}
+
diff --git a/src/libs/libbib/index.cpp b/src/libs/libbib/index.cpp
new file mode 100644
index 0000000..aebcbbf
--- /dev/null
+++ b/src/libs/libbib/index.cpp
@@ -0,0 +1,688 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <stdlib.h>
+#include <errno.h>
+
+#include "posix.h"
+#include "cset.h"
+#include "cmap.h"
+#include "errarg.h"
+#include "error.h"
+
+#include "refid.h"
+#include "search.h"
+#include "index.h"
+#include "defs.h"
+
+#include "nonposix.h"
+
+// Interface to mmap.
+extern "C" {
+ void *mapread(int fd, int len);
+ int unmap(void *, int len);
+}
+
+#if 0
+const
+#endif
+int minus_one = -1;
+
+bool do_verify = false;
+
+struct word_list;
+
+class index_search_item : public search_item {
+ search_item *out_of_date_files;
+ index_header header;
+ char *buffer;
+ void *map_addr;
+ int map_len;
+ tag *tags;
+ int *table;
+ int *lists;
+ char *pool;
+ char *key_buffer;
+ char *filename_buffer;
+ int filename_buflen;
+ char **common_words_table;
+ int common_words_table_size;
+ const char *ignore_fields;
+ time_t mtime;
+
+ const char *get_invalidity_reason();
+ const int *search1(const char **pp, const char *end);
+ const int *search(const char *ptr, int length, int **temp_listp);
+ const char *munge_filename(const char *);
+ void read_common_words_file();
+ void add_out_of_date_file(int fd, const char *filename, int fid);
+public:
+ index_search_item(const char *, int);
+ ~index_search_item();
+ const char *check_header(index_header *, unsigned);
+ bool load(int fd);
+ search_item_iterator *make_search_item_iterator(const char *);
+ bool is_valid();
+ void check_files();
+ int next_filename_id() const;
+ friend class index_search_item_iterator;
+};
+
+class index_search_item_iterator : public search_item_iterator {
+ index_search_item *indx;
+ search_item_iterator *out_of_date_files_iter;
+ search_item *next_out_of_date_file;
+ const int *found_list;
+ int *temp_list;
+ char *buf;
+ int buflen;
+ linear_searcher searcher;
+ char *query;
+ int get_tag(int tagno, const linear_searcher &, const char **, int *,
+ reference_id *);
+public:
+ index_search_item_iterator(index_search_item *, const char *);
+ ~index_search_item_iterator();
+ int next(const linear_searcher &, const char **, int *, reference_id *);
+};
+
+
+index_search_item::index_search_item(const char *filename, int fid)
+: search_item(filename, fid), out_of_date_files(0), buffer(0), map_addr(0),
+ map_len(0), key_buffer(0), filename_buffer(0), filename_buflen(0),
+ common_words_table(0)
+{
+}
+
+index_search_item::~index_search_item()
+{
+ if (buffer)
+ free(buffer);
+ if (map_addr) {
+ if (unmap(map_addr, map_len) < 0)
+ error("unmap: %1", strerror(errno));
+ }
+ while (out_of_date_files) {
+ search_item *tem = out_of_date_files;
+ out_of_date_files = out_of_date_files->next;
+ delete tem;
+ }
+ delete[] filename_buffer;
+ delete[] key_buffer;
+ if (common_words_table) {
+ for (int i = 0; i < common_words_table_size; i++)
+ delete[] common_words_table[i];
+ delete[] common_words_table;
+ }
+}
+
+class file_closer {
+ int *fdp;
+public:
+ file_closer(int &fd) : fdp(&fd) { }
+ ~file_closer() { close(*fdp); }
+};
+
+// Tell the compiler that a variable is intentionally unused.
+inline void unused(void *) { }
+
+// Validate the data reported in the header so that we don't overread on
+// the heap in the load() member function. Return null pointer if no
+// problems are detected.
+const char *index_search_item::check_header(index_header *file_header,
+ unsigned file_size)
+{
+ if (file_header->tags_size < 0)
+ return "tag list length negative";
+ if (file_header->lists_size < 0)
+ return "reference list length negative";
+ // The table and string pool sizes will not be zero, even in an empty
+ // index.
+ if (file_header->table_size < 1)
+ return "table size nonpositive";
+ if (file_header->strings_size < 1)
+ return "string pool size nonpositive";
+ size_t sz = (file_header->tags_size * sizeof(tag)
+ + file_header->lists_size * sizeof(int)
+ + file_header->table_size * sizeof(int)
+ + file_header->strings_size
+ + sizeof(file_header));
+ if (sz != file_size)
+ return("size mismatch between header and data");
+ unsigned size_remaining = file_size;
+ unsigned chunk_size = file_header->tags_size * sizeof(tag);
+ if (chunk_size > size_remaining)
+ return "claimed tag list length exceeds file size";
+ size_remaining -= chunk_size;
+ chunk_size = file_header->lists_size * sizeof(int);
+ if (chunk_size > size_remaining)
+ return "claimed reference list length exceeds file size";
+ size_remaining -= chunk_size;
+ chunk_size = file_header->table_size * sizeof(int);
+ if (chunk_size > size_remaining)
+ return "claimed table size exceeds file size";
+ size_remaining -= chunk_size;
+ chunk_size = file_header->strings_size;
+ if (chunk_size > size_remaining)
+ return "claimed string pool size exceeds file size";
+ return 0;
+}
+
+bool index_search_item::load(int fd)
+{
+ file_closer fd_closer(fd); // close fd on return
+ unused(&fd_closer);
+ struct stat sb;
+ if (fstat(fd, &sb) < 0) {
+ error("can't fstat index '%1': %2", name, strerror(errno));
+ return false;
+ }
+ if (!S_ISREG(sb.st_mode)) {
+ error("index '%1' is not a regular file", name);
+ return false;
+ }
+ mtime = sb.st_mtime;
+ unsigned size = unsigned(sb.st_size); // widening conversion
+ if (size == 0) {
+ error("index '%1' is an empty file", name);
+ return false;
+ }
+ char *addr;
+ map_addr = mapread(fd, size);
+ if (map_addr) {
+ addr = (char *)map_addr;
+ map_len = size;
+ }
+ else {
+ addr = buffer = (char *)malloc(size);
+ if (buffer == 0) {
+ error("can't allocate memory to process index '%1'", name);
+ return false;
+ }
+ char *ptr = buffer;
+ int bytes_to_read = size;
+ while (bytes_to_read > 0) {
+ int nread = read(fd, ptr, bytes_to_read);
+ if (nread == 0) {
+ error("unexpected end-of-file while reading index '%1'", name);
+ return false;
+ }
+ if (nread < 0) {
+ error("read error on index '%1': %2", name, strerror(errno));
+ return false;
+ }
+ bytes_to_read -= nread;
+ ptr += nread;
+ }
+ }
+ header = *(index_header *)addr;
+ if (header.magic != INDEX_MAGIC) {
+ error("'%1' is not an index file: wrong magic number", name);
+ return false;
+ }
+ if (header.version != INDEX_VERSION) {
+ error("version number in index '%1' is wrong: was %2, should be %3",
+ name, header.version, INDEX_VERSION);
+ return false;
+ }
+ const char *problem = check_header(&header, size);
+ if (problem != 0) {
+ if (do_verify)
+ error("corrupt header in index file '%1': %2", name, problem);
+ else
+ error("corrupt header in index file '%1'", name);
+ return false;
+ }
+ tags = (tag *)(addr + sizeof(header));
+ lists = (int *)(tags + header.tags_size);
+ table = (int *)(lists + header.lists_size);
+ pool = (char *)(table + header.table_size);
+ ignore_fields = strchr(strchr(pool, '\0') + 1, '\0') + 1;
+ key_buffer = new char[header.truncate];
+ read_common_words_file();
+ return true;
+}
+
+const char *index_search_item::get_invalidity_reason()
+{
+ if (tags == 0)
+ return "not loaded";
+ if ((header.lists_size > 0) && (lists[header.lists_size - 1] >= 0))
+ return "last list element not negative";
+ int i;
+ for (i = 0; i < header.table_size; i++) {
+ int li = table[i];
+ if (li >= header.lists_size)
+ return "bad list index";
+ if (li >= 0) {
+ for (int *ptr = lists + li; *ptr >= 0; ptr++) {
+ if (*ptr >= header.tags_size)
+ return "bad tag index";
+ if (*ptr >= ptr[1] && ptr[1] >= 0)
+ return "list not ordered";
+ }
+ }
+ }
+ for (i = 0; i < header.tags_size; i++) {
+ if (tags[i].filename_index >= header.strings_size)
+ return "bad index in tags";
+ if (tags[i].length < 0)
+ return "bad length in tags";
+ if (tags[i].start < 0)
+ return "bad start in tags";
+ }
+ if (pool[header.strings_size - 1] != '\0')
+ return "last character in string pool is not null";
+ return 0;
+}
+
+bool index_search_item::is_valid()
+{
+ const char *reason = get_invalidity_reason();
+ if (!reason)
+ return true;
+ error("'%1' is bad: %2", name, reason);
+ return false;
+}
+
+int index_search_item::next_filename_id() const
+{
+ return filename_id + header.strings_size + 1;
+}
+
+search_item_iterator *index_search_item::make_search_item_iterator(
+ const char *query)
+{
+ return new index_search_item_iterator(this, query);
+}
+
+search_item *make_index_search_item(const char *filename, int fid)
+{
+ char *index_filename = new char[strlen(filename) + sizeof(INDEX_SUFFIX)];
+ strcpy(index_filename, filename);
+ strcat(index_filename, INDEX_SUFFIX);
+ int fd = open(index_filename, O_RDONLY | O_BINARY);
+ if (fd < 0)
+ return 0;
+ index_search_item *item = new index_search_item(index_filename, fid);
+ delete[] index_filename;
+ if (!item->load(fd)) {
+ close(fd);
+ delete item;
+ return 0;
+ }
+ else if (do_verify && !item->is_valid()) {
+ delete item;
+ return 0;
+ }
+ else {
+ item->check_files();
+ return item;
+ }
+}
+
+
+index_search_item_iterator::index_search_item_iterator(index_search_item *ind,
+ const char *q)
+: indx(ind), out_of_date_files_iter(0), next_out_of_date_file(0), temp_list(0),
+ buf(0), buflen(0),
+ searcher(q, strlen(q), ind->ignore_fields, ind->header.truncate),
+ query(strsave(q))
+{
+ found_list = indx->search(q, strlen(q), &temp_list);
+ if (!found_list) {
+ found_list = &minus_one;
+ warning("all keys would have been discarded in constructing index '%1'",
+ indx->name);
+ }
+}
+
+index_search_item_iterator::~index_search_item_iterator()
+{
+ delete[] temp_list;
+ delete[] buf;
+ delete[] query;
+ delete out_of_date_files_iter;
+}
+
+int index_search_item_iterator::next(const linear_searcher &,
+ const char **pp, int *lenp,
+ reference_id *ridp)
+{
+ if (found_list) {
+ for (;;) {
+ int tagno = *found_list;
+ if (tagno == -1)
+ break;
+ found_list++;
+ if (get_tag(tagno, searcher, pp, lenp, ridp))
+ return 1;
+ }
+ found_list = 0;
+ next_out_of_date_file = indx->out_of_date_files;
+ }
+ while (next_out_of_date_file) {
+ if (out_of_date_files_iter == 0)
+ out_of_date_files_iter
+ = next_out_of_date_file->make_search_item_iterator(query);
+ if (out_of_date_files_iter->next(searcher, pp, lenp, ridp))
+ return 1;
+ delete out_of_date_files_iter;
+ out_of_date_files_iter = 0;
+ next_out_of_date_file = next_out_of_date_file->next;
+ }
+ return 0;
+}
+
+int index_search_item_iterator::get_tag(int tagno,
+ const linear_searcher &searchr,
+ const char **pp, int *lenp,
+ reference_id *ridp)
+{
+ if (tagno < 0 || tagno >= indx->header.tags_size) {
+ error("bad tag number");
+ return 0;
+ }
+ tag *tp = indx->tags + tagno;
+ const char *filename = indx->munge_filename(indx->pool + tp->filename_index);
+ int fd = open(filename, O_RDONLY | O_BINARY);
+ if (fd < 0) {
+ error("can't open '%1': %2", filename, strerror(errno));
+ return 0;
+ }
+ struct stat sb;
+ if (fstat(fd, &sb) < 0) {
+ error("can't fstat: %1", strerror(errno));
+ close(fd);
+ return 0;
+ }
+ time_t mtime = sb.st_mtime;
+ if (mtime > indx->mtime) {
+ indx->add_out_of_date_file(fd, filename,
+ indx->filename_id + tp->filename_index);
+ return 0;
+ }
+ int res = 0;
+ FILE *fp = fdopen(fd, FOPEN_RB);
+ if (!fp) {
+ error("fdopen failed");
+ close(fd);
+ return 0;
+ }
+ if (tp->start != 0 && fseek(fp, long(tp->start), 0) < 0)
+ error("can't seek on '%1': %2", filename, strerror(errno));
+ else {
+ int length = tp->length;
+ int err = 0;
+ if (length == 0) {
+ if (fstat(fileno(fp), &sb) < 0) {
+ error("can't stat '%1': %2", filename, strerror(errno));
+ err = 1;
+ }
+ else if (!S_ISREG(sb.st_mode)) {
+ error("'%1' is not a regular file", filename);
+ err = 1;
+ }
+ else
+ length = int(sb.st_size);
+ }
+ if (!err) {
+ if (length + 2 > buflen) {
+ delete[] buf;
+ buflen = length + 2;
+ buf = new char[buflen];
+ }
+ if (fread(buf + 1, 1, length, fp) != (size_t)length)
+ error("fread on '%1' failed: %2", filename, strerror(errno));
+ else {
+ buf[0] = '\n';
+ // Remove the CR characters from CRLF pairs.
+ int sidx = 1, didx = 1;
+ for ( ; sidx < length + 1; sidx++, didx++)
+ {
+ if (buf[sidx] == '\r')
+ {
+ if (buf[++sidx] != '\n')
+ buf[didx++] = '\r';
+ else
+ length--;
+ }
+ if (sidx != didx)
+ buf[didx] = buf[sidx];
+ }
+ buf[length + 1] = '\n';
+ res = searchr.search(buf + 1, buf + 2 + length, pp, lenp);
+ if (res && ridp)
+ *ridp = reference_id(indx->filename_id + tp->filename_index,
+ tp->start);
+ }
+ }
+ }
+ fclose(fp);
+ return res;
+}
+
+const char *index_search_item::munge_filename(const char *filename)
+{
+ if (IS_ABSOLUTE(filename))
+ return filename;
+ const char *cwd = pool;
+ int need_slash = (cwd[0] != 0
+ && strchr(DIR_SEPS, strchr(cwd, '\0')[-1]) == 0);
+ int len = strlen(cwd) + strlen(filename) + need_slash + 1;
+ if (len > filename_buflen) {
+ delete[] filename_buffer;
+ filename_buflen = len;
+ filename_buffer = new char[len];
+ }
+ strcpy(filename_buffer, cwd);
+ if (need_slash)
+ strcat(filename_buffer, "/");
+ strcat(filename_buffer, filename);
+ return filename_buffer;
+}
+
+const int *index_search_item::search1(const char **pp, const char *end)
+{
+ while (*pp < end && !csalnum(**pp))
+ *pp += 1;
+ if (*pp >= end)
+ return 0;
+ const char *start = *pp;
+ while (*pp < end && csalnum(**pp))
+ *pp += 1;
+ int len = *pp - start;
+ if (len < header.shortest)
+ return 0;
+ if (len > header.truncate)
+ len = header.truncate;
+ int is_number = 1;
+ for (int i = 0; i < len; i++)
+ if (csdigit(start[i]))
+ key_buffer[i] = start[i];
+ else {
+ key_buffer[i] = cmlower(start[i]);
+ is_number = 0;
+ }
+ if (is_number && !(len == 4 && start[0] == '1' && start[1] == '9'))
+ return 0;
+ unsigned hc = hash(key_buffer, len);
+ if (common_words_table) {
+ for (int h = hc % common_words_table_size;
+ common_words_table[h];
+ --h) {
+ if (strlen(common_words_table[h]) == (size_t)len
+ && memcmp(common_words_table[h], key_buffer, len) == 0)
+ return 0;
+ if (h == 0)
+ h = common_words_table_size;
+ }
+ }
+ int li = table[int(hc % header.table_size)];
+ return li < 0 ? &minus_one : lists + li;
+}
+
+static void merge(int *result, const int *s1, const int *s2)
+{
+ for (; *s1 >= 0; s1++) {
+ while (*s2 >= 0 && *s2 < *s1)
+ s2++;
+ if (*s2 == *s1)
+ *result++ = *s2;
+ }
+ *result++ = -1;
+}
+
+const int *index_search_item::search(const char *ptr, int length,
+ int **temp_listp)
+{
+ const char *end = ptr + length;
+ if (*temp_listp) {
+ delete[] *temp_listp;
+ *temp_listp = 0;
+ }
+ const int *first_list = 0;
+ while (ptr < end && (first_list = search1(&ptr, end)) == 0)
+ ;
+ if (!first_list)
+ return 0;
+ if (*first_list < 0)
+ return first_list;
+ const int *second_list = 0;
+ while (ptr < end && (second_list = search1(&ptr, end)) == 0)
+ ;
+ if (!second_list)
+ return first_list;
+ if (*second_list < 0)
+ return second_list;
+ const int *p;
+ for (p = first_list; *p >= 0; p++)
+ ;
+ int len = p - first_list;
+ for (p = second_list; *p >= 0; p++)
+ ;
+ if (p - second_list < len)
+ len = p - second_list;
+ int *matches = new int[len + 1];
+ merge(matches, first_list, second_list);
+ while (ptr < end) {
+ const int *list = search1(&ptr, end);
+ if (list != 0) {
+ if (*list < 0) {
+ delete[] matches;
+ return list;
+ }
+ merge(matches, matches, list);
+ if (*matches < 0) {
+ delete[] matches;
+ return &minus_one;
+ }
+ }
+ }
+ *temp_listp = matches;
+ return matches;
+}
+
+void index_search_item::read_common_words_file()
+{
+ if (header.common <= 0)
+ return;
+ const char *common_words_file = munge_filename(strchr(pool, '\0') + 1);
+ errno = 0;
+ FILE *fp = fopen(common_words_file, "r");
+ if (!fp) {
+ error("can't open '%1': %2", common_words_file, strerror(errno));
+ return;
+ }
+ common_words_table_size = 2*header.common + 1;
+ while (!is_prime(common_words_table_size))
+ common_words_table_size += 2;
+ common_words_table = new char *[common_words_table_size];
+ for (int i = 0; i < common_words_table_size; i++)
+ common_words_table[i] = 0;
+ int count = 0;
+ int key_len = 0;
+ for (;;) {
+ int c = getc(fp);
+ while (c != EOF && !csalnum(c))
+ c = getc(fp);
+ if (c == EOF)
+ break;
+ do {
+ if (key_len < header.truncate)
+ key_buffer[key_len++] = cmlower(c);
+ c = getc(fp);
+ } while (c != EOF && csalnum(c));
+ if (key_len >= header.shortest) {
+ int h = hash(key_buffer, key_len) % common_words_table_size;
+ while (common_words_table[h]) {
+ if (h == 0)
+ h = common_words_table_size;
+ --h;
+ }
+ common_words_table[h] = new char[key_len + 1];
+ memcpy(common_words_table[h], key_buffer, key_len);
+ common_words_table[h][key_len] = '\0';
+ }
+ if (++count >= header.common)
+ break;
+ key_len = 0;
+ if (c == EOF)
+ break;
+ }
+ fclose(fp);
+}
+
+void index_search_item::add_out_of_date_file(int fd, const char *filename,
+ int fid)
+{
+ search_item **pp;
+ for (pp = &out_of_date_files; *pp; pp = &(*pp)->next)
+ if ((*pp)->is_named(filename))
+ return;
+ *pp = make_linear_search_item(fd, filename, fid);
+ warning("'%1' modified since index '%2' created", filename, name);
+}
+
+void index_search_item::check_files()
+{
+ const char *pool_end = pool + header.strings_size;
+ for (const char *ptr = strchr(ignore_fields, '\0') + 1;
+ ptr < pool_end;
+ ptr = strchr(ptr, '\0') + 1) {
+ const char *path = munge_filename(ptr);
+ struct stat sb;
+ if (stat(path, &sb) < 0)
+ error("can't stat '%1': %2", path, strerror(errno));
+ else if (sb.st_mtime > mtime) {
+ int fd = open(path, O_RDONLY | O_BINARY);
+ if (fd < 0)
+ error("can't open '%1': %2", path, strerror(errno));
+ else
+ add_out_of_date_file(fd, path, filename_id + (ptr - pool));
+ }
+ }
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/libs/libbib/libbib.am b/src/libs/libbib/libbib.am
new file mode 100644
index 0000000..00e1d3b
--- /dev/null
+++ b/src/libs/libbib/libbib.am
@@ -0,0 +1,35 @@
+# Automake rules for 'libbib'
+#
+# Copyright (C) 2014-2020 Free Software Foundation, Inc.
+#
+# '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 of the License, 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 this program. If not, see
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+#
+########################################################################
+
+noinst_LIBRARIES += libbib.a
+libbib_a_SOURCES = \
+ src/libs/libbib/common.cpp \
+ src/libs/libbib/index.cpp \
+ src/libs/libbib/linear.cpp \
+ src/libs/libbib/search.cpp \
+ src/libs/libbib/map.c
+src/libs/libbib/index.$(OBJEXT): defs.h
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/libs/libbib/linear.cpp b/src/libs/libbib/linear.cpp
new file mode 100644
index 0000000..22e11d8
--- /dev/null
+++ b/src/libs/libbib/linear.cpp
@@ -0,0 +1,506 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <assert.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include "posix.h"
+#include "errarg.h"
+#include "error.h"
+#include "cset.h"
+#include "cmap.h"
+#include "nonposix.h"
+
+#include "refid.h"
+#include "search.h"
+
+class file_buffer {
+ char *buffer;
+ char *bufend;
+public:
+ file_buffer();
+ ~file_buffer();
+ int load(int fd, const char *filename);
+ const char *get_start() const;
+ const char *get_end() const;
+};
+
+typedef unsigned char uchar;
+
+static uchar map[256];
+static uchar inv_map[256][3];
+
+struct map_init {
+ map_init();
+};
+
+static map_init the_map_init;
+
+map_init::map_init()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ map[i] = csalnum(i) ? cmlower(i) : '\0';
+ for (i = 0; i < 256; i++) {
+ if (cslower(i)) {
+ inv_map[i][0] = i;
+ inv_map[i][1] = cmupper(i);
+ inv_map[i][2] = '\0';
+ }
+ else if (csdigit(i)) {
+ inv_map[i][0] = i;
+ inv_map[i][1] = 0;
+ }
+ else
+ inv_map[i][0] = '\0';
+ }
+}
+
+
+class bmpattern {
+ char *pat;
+ int len;
+ int delta[256];
+public:
+ bmpattern(const char *pattern, int pattern_length);
+ ~bmpattern();
+ const char *search(const char *p, const char *end) const;
+ int length() const;
+};
+
+bmpattern::bmpattern(const char *pattern, int pattern_length)
+: len(pattern_length)
+{
+ pat = new char[len];
+ int i;
+ for (i = 0; i < len; i++)
+ pat[i] = map[uchar(pattern[i])];
+ for (i = 0; i < 256; i++)
+ delta[i] = len;
+ for (i = 0; i < len; i++)
+ for (const unsigned char *inv = inv_map[uchar(pat[i])]; *inv; inv++)
+ delta[*inv] = len - i - 1;
+}
+
+const char *bmpattern::search(const char *buf, const char *end) const
+{
+ int buflen = end - buf;
+ if (len > buflen)
+ return 0;
+ const char *strend;
+ if (buflen > len*4)
+ strend = end - len*4;
+ else
+ strend = buf;
+ const char *k = buf + len - 1;
+ const int *del = delta;
+ const char *pattern = pat;
+ for (;;) {
+ while (k < strend) {
+ int t = del[uchar(*k)];
+ if (!t)
+ break;
+ k += t;
+ k += del[uchar(*k)];
+ k += del[uchar(*k)];
+ }
+ while (k < end && del[uchar(*k)] != 0)
+ k++;
+ if (k == end)
+ break;
+ int j = len - 1;
+ const char *s = k;
+ for (;;) {
+ if (j == 0)
+ return s;
+ if (map[uchar(*--s)] != uchar(pattern[--j]))
+ break;
+ }
+ k++;
+ }
+ return 0;
+}
+
+bmpattern::~bmpattern()
+{
+ delete[] pat;
+}
+
+inline int bmpattern::length() const
+{
+ return len;
+}
+
+
+static const char *find_end(const char *bufend, const char *p);
+
+const char *linear_searcher::search_and_check(const bmpattern *key,
+ const char *buf, const char *bufend, const char **start) const
+{
+ assert(buf[-1] == '\n');
+ assert(bufend[-1] == '\n');
+ const char *ptr = buf;
+ for (;;) {
+ const char *found = key->search(ptr, bufend);
+ if (!found)
+ break;
+ if (check_match(buf, bufend, found, key->length(), &ptr, start))
+ return found;
+ }
+ return 0;
+}
+
+static const char *skip_field(const char *end, const char *p)
+{
+ for (;;)
+ if (*p++ == '\n') {
+ if (p == end || *p == '%')
+ break;
+ const char *q;
+ for (q = p; *q == ' ' || *q == '\t'; q++)
+ ;
+ if (*q == '\n')
+ break;
+ p = q + 1;
+ }
+ return p;
+}
+
+static const char *find_end(const char *bufend, const char *p)
+{
+ for (;;)
+ if (*p++ == '\n') {
+ if (p == bufend)
+ break;
+ const char *q;
+ for (q = p; *q == ' ' || *q == '\t'; q++)
+ ;
+ if (*q == '\n')
+ break;
+ p = q + 1;
+ }
+ return p;
+}
+
+
+int linear_searcher::check_match(const char *buf, const char *bufend,
+ const char *match, int matchlen,
+ const char **cont, const char **start) const
+{
+ *cont = match + 1;
+ // The user is required to supply only the first truncate_len characters
+ // of the key. If truncate_len <= 0, he must supply all the key.
+ if ((truncate_len <= 0 || matchlen < truncate_len)
+ && map[uchar(match[matchlen])] != '\0')
+ return 0;
+
+ // The character before the match must not be an alphanumeric
+ // character (unless the alphanumeric character follows one or two
+ // percent characters at the beginning of the line), nor must it be
+ // a percent character at the beginning of a line, nor a percent
+ // character following a percent character at the beginning of a
+ // line.
+
+ switch (match - buf) {
+ case 0:
+ break;
+ case 1:
+ if (match[-1] == '%' || map[uchar(match[-1])] != '\0')
+ return 0;
+ break;
+ case 2:
+ if (map[uchar(match[-1])] != '\0' && match[-2] != '%')
+ return 0;
+ if (match[-1] == '%'
+ && (match[-2] == '\n' || match[-2] == '%'))
+ return 0;
+ break;
+ default:
+ if (map[uchar(match[-1])] != '\0'
+ && !(match[-2] == '%'
+ && (match[-3] == '\n'
+ || (match[-3] == '%' && match[-4] == '\n'))))
+ return 0;
+ if (match[-1] == '%'
+ && (match[-2] == '\n'
+ || (match[-2] == '%' && match[-3] == '\n')))
+ return 0;
+ }
+
+ const char *p = match;
+ int had_percent = 0;
+ for (;;) {
+ if (*p == '\n') {
+ if (!had_percent && p[1] == '%') {
+ if (p[2] != '\0' && strchr(ignore_fields, p[2]) != 0) {
+ *cont = skip_field(bufend, match + matchlen);
+ return 0;
+ }
+ if (!start)
+ break;
+ had_percent = 1;
+ }
+ if (p <= buf) {
+ if (start)
+ *start = p + 1;
+ return 1;
+ }
+ const char *q;
+ for (q = p - 1; *q == ' ' || *q == '\t'; q--)
+ ;
+ if (*q == '\n') {
+ if (start)
+ *start = p + 1;
+ break;
+ }
+ p = q;
+ }
+ p--;
+ }
+ return 1;
+}
+
+file_buffer::file_buffer()
+: buffer(0), bufend(0)
+{
+}
+
+file_buffer::~file_buffer()
+{
+ delete[] buffer;
+}
+
+const char *file_buffer::get_start() const
+{
+ return buffer ? buffer + 4 : 0;
+}
+
+const char *file_buffer::get_end() const
+{
+ return bufend;
+}
+
+int file_buffer::load(int fd, const char *filename)
+{
+ struct stat sb;
+ if (fstat(fd, &sb) < 0)
+ error("can't fstat '%1': %2", filename, strerror(errno));
+ else if (!S_ISREG(sb.st_mode))
+ error("'%1' is not a regular file", filename);
+ else {
+ // We need one character extra at the beginning for an additional newline
+ // used as a sentinel. We get 4 instead so that the read buffer will be
+ // word-aligned. This seems to make the read slightly faster. We also
+ // need one character at the end also for an additional newline used as a
+ // sentinel.
+ int size = int(sb.st_size);
+ buffer = new char[size + 4 + 1];
+ int nread = read(fd, buffer + 4, size);
+ if (nread < 0)
+ error("error reading '%1': %2", filename, strerror(errno));
+ else if (nread != size)
+ error("size of '%1' decreased", filename);
+ else {
+ char c;
+ nread = read(fd, &c, 1);
+ if (nread != 0)
+ error("size of '%1' increased", filename);
+ else if (memchr(buffer + 4, '\0', size < 1024 ? size : 1024) != 0)
+ error("database '%1' is a binary file", filename);
+ else {
+ close(fd);
+ buffer[3] = '\n';
+ int sidx = 4, didx = 4;
+ for ( ; sidx < size + 4; sidx++, didx++)
+ {
+ if (buffer[sidx] == '\r')
+ {
+ if (buffer[++sidx] != '\n')
+ buffer[didx++] = '\r';
+ else
+ size--;
+ }
+ if (sidx != didx)
+ buffer[didx] = buffer[sidx];
+ }
+ bufend = buffer + 4 + size;
+ if (bufend[-1] != '\n')
+ *bufend++ = '\n';
+ return 1;
+ }
+ }
+ delete[] buffer;
+ buffer = 0;
+ }
+ close(fd);
+ return 0;
+}
+
+linear_searcher::linear_searcher(const char *query, int query_len,
+ const char *ign, int trunc)
+: ignore_fields(ign), truncate_len(trunc), keys(0), nkeys(0)
+{
+ const char *query_end = query + query_len;
+ int nk = 0;
+ const char *p;
+ for (p = query; p < query_end; p++)
+ if (map[uchar(*p)] != '\0'
+ && (p[1] == '\0' || map[uchar(p[1])] == '\0'))
+ nk++;
+ if (nk == 0)
+ return;
+ keys = new bmpattern*[nk];
+ p = query;
+ for (;;) {
+ while (p < query_end && map[uchar(*p)] == '\0')
+ p++;
+ if (p == query_end)
+ break;
+ const char *start = p;
+ while (p < query_end && map[uchar(*p)] != '\0')
+ p++;
+ keys[nkeys++] = new bmpattern(start, p - start);
+ }
+ assert(nkeys <= nk);
+ if (nkeys == 0) {
+ delete[] keys;
+ keys = 0;
+ }
+}
+
+linear_searcher::~linear_searcher()
+{
+ for (int i = 0; i < nkeys; i++)
+ delete keys[i];
+ delete[] keys;
+}
+
+int linear_searcher::search(const char *buffer, const char *bufend,
+ const char **startp, int *lengthp) const
+{
+ assert(bufend - buffer > 0);
+ assert(buffer[-1] == '\n');
+ assert(bufend[-1] == '\n');
+ if (nkeys == 0)
+ return 0;
+ for (;;) {
+ const char *refstart;
+ const char *found = search_and_check(keys[0], buffer, bufend, &refstart);
+ if (!found)
+ break;
+ const char *refend = find_end(bufend, found + keys[0]->length());
+ int i;
+ for (i = 1; i < nkeys; i++)
+ if (!search_and_check(keys[i], refstart, refend))
+ break;
+ if (i >= nkeys) {
+ *startp = refstart;
+ *lengthp = refend - refstart;
+ return 1;
+ }
+ buffer = refend;
+ }
+ return 0;
+}
+
+class linear_search_item : public search_item {
+ file_buffer fbuf;
+public:
+ linear_search_item(const char *filename, int fid);
+ ~linear_search_item();
+ int load(int fd);
+ search_item_iterator *make_search_item_iterator(const char *);
+ friend class linear_search_item_iterator;
+};
+
+class linear_search_item_iterator : public search_item_iterator {
+ linear_search_item *lsi;
+ int pos;
+public:
+ linear_search_item_iterator(linear_search_item *, const char *query);
+ ~linear_search_item_iterator();
+ int next(const linear_searcher &, const char **ptr, int *lenp,
+ reference_id *ridp);
+};
+
+search_item *make_linear_search_item(int fd, const char *filename, int fid)
+{
+ linear_search_item *item = new linear_search_item(filename, fid);
+ if (!item->load(fd)) {
+ delete item;
+ return 0;
+ }
+ else
+ return item;
+}
+
+linear_search_item::linear_search_item(const char *filename, int fid)
+: search_item(filename, fid)
+{
+}
+
+linear_search_item::~linear_search_item()
+{
+}
+
+int linear_search_item::load(int fd)
+{
+ return fbuf.load(fd, name);
+}
+
+search_item_iterator *linear_search_item::make_search_item_iterator(
+ const char *query)
+{
+ return new linear_search_item_iterator(this, query);
+}
+
+linear_search_item_iterator::linear_search_item_iterator(
+ linear_search_item *p, const char *)
+: lsi(p), pos(0)
+{
+}
+
+linear_search_item_iterator::~linear_search_item_iterator()
+{
+}
+
+int linear_search_item_iterator::next(const linear_searcher &searcher,
+ const char **startp, int *lengthp,
+ reference_id *ridp)
+{
+ const char *bufstart = lsi->fbuf.get_start();
+ const char *bufend = lsi->fbuf.get_end();
+ const char *ptr = bufstart + pos;
+ if (ptr < bufend && searcher.search(ptr, bufend, startp, lengthp)) {
+ pos = *startp + *lengthp - bufstart;
+ if (ridp)
+ *ridp = reference_id(lsi->filename_id, *startp - bufstart);
+ return 1;
+ }
+ else
+ return 0;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/libs/libbib/map.c b/src/libs/libbib/map.c
new file mode 100644
index 0000000..9eae72b
--- /dev/null
+++ b/src/libs/libbib/map.c
@@ -0,0 +1,86 @@
+/* Copyright (C) 1989- 2014 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+#ifdef HAVE_MMAP
+
+#include <sys/types.h>
+#include <sys/mman.h>
+
+/* The Net-2 man pages says that a MAP_FILE flag is required. */
+#ifndef MAP_FILE
+#define MAP_FILE 0
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Prototypes */
+char *mapread(int, int);
+int unmap(char *, int);
+
+char *mapread(int fd, int nbytes)
+{
+ char *p = (char *)mmap((void *)0, (size_t)nbytes, PROT_READ,
+ MAP_FILE|MAP_PRIVATE, fd, (off_t)0);
+ if (p == MAP_FAILED)
+ return 0;
+ /* mmap() shouldn't return 0 since MAP_FIXED wasn't specified. */
+ if (p == 0)
+ abort();
+ return p;
+}
+
+int unmap(char *p, int len)
+{
+ return munmap((void *)p, len);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#else /* not HAVE_MMAP */
+
+#include <errno.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+char *mapread(int fd, int nbytes)
+{
+ errno = ENODEV;
+ return 0;
+}
+
+int unmap(char *p, int len)
+{
+ errno = EINVAL;
+ return -1;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* not HAVE_MMAP */
diff --git a/src/libs/libbib/search.cpp b/src/libs/libbib/search.cpp
new file mode 100644
index 0000000..10867b6
--- /dev/null
+++ b/src/libs/libbib/search.cpp
@@ -0,0 +1,136 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <assert.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include "posix.h"
+#include "errarg.h"
+#include "error.h"
+#include "nonposix.h"
+
+#include "refid.h"
+#include "search.h"
+
+int linear_truncate_len = 6;
+const char *linear_ignore_fields = "XYZ";
+
+search_list::search_list()
+: list(0), niterators(0), next_fid(1)
+{
+}
+
+search_list::~search_list()
+{
+ assert(niterators == 0);
+ while (list) {
+ search_item *tem = list->next;
+ delete list;
+ list = tem;
+ }
+}
+
+void search_list::add_file(const char *filename, int silent)
+{
+ search_item *p = make_index_search_item(filename, next_fid);
+ if (!p) {
+ int fd = open(filename, O_RDONLY | O_BINARY);
+ if (fd < 0) {
+ if (!silent)
+ error("can't open '%1': %2", filename, strerror(errno));
+ }
+ else
+ p = make_linear_search_item(fd, filename, next_fid);
+ }
+ if (p) {
+ search_item **pp;
+ for (pp = &list; *pp; pp = &(*pp)->next)
+ ;
+ *pp = p;
+ next_fid = p->next_filename_id();
+ }
+}
+
+int search_list::nfiles() const
+{
+ int n = 0;
+ for (search_item *ptr = list; ptr; ptr = ptr->next)
+ n++;
+ return n;
+}
+
+search_list_iterator::search_list_iterator(search_list *p, const char *q)
+: list(p), ptr(p->list), iter(0), query(strsave(q)),
+ searcher(q, strlen(q), linear_ignore_fields, linear_truncate_len)
+{
+ list->niterators += 1;
+}
+
+search_list_iterator::~search_list_iterator()
+{
+ list->niterators -= 1;
+ delete[] query;
+ delete iter;
+}
+
+int search_list_iterator::next(const char **pp, int *lenp, reference_id *ridp)
+{
+ while (ptr) {
+ if (iter == 0)
+ iter = ptr->make_search_item_iterator(query);
+ if (iter->next(searcher, pp, lenp, ridp))
+ return 1;
+ delete iter;
+ iter = 0;
+ ptr = ptr->next;
+ }
+ return 0;
+}
+
+search_item::search_item(const char *nm, int fid)
+: name(strsave(nm)), filename_id(fid), next(0)
+{
+}
+
+search_item::~search_item()
+{
+ delete[] name;
+}
+
+int search_item::is_named(const char *nm) const
+{
+ return strcmp(name, nm) == 0;
+}
+
+int search_item::next_filename_id() const
+{
+ return filename_id + 1;
+}
+
+search_item_iterator::~search_item_iterator()
+{
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/libs/libdriver/input.cpp b/src/libs/libdriver/input.cpp
new file mode 100644
index 0000000..821b526
--- /dev/null
+++ b/src/libs/libdriver/input.cpp
@@ -0,0 +1,1841 @@
+/* Copyright (C) 1989-2020 Free Software Foundation, Inc.
+
+ Written by James Clark (jjc@jclark.com)
+ Major rewrite 2001 by Bernd Warken <groff-bernd.warken-72@web.de>
+
+ This file is part of groff, the GNU roff text processing system.
+
+ 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/* Description
+
+ This file implements the parser for the intermediate groff output,
+ see groff_out(5), and does the printout for the given device.
+
+ All parsed information is processed within the function do_file().
+ A device postprocessor just needs to fill in the methods for the class
+ 'printer' (or rather a derived class) without having to worry about
+ the syntax of the intermediate output format. Consequently, the
+ programming of groff postprocessors is similar to the development of
+ device drivers.
+
+ The prototyping for this file is done in driver.h (and error.h).
+*/
+
+/* Changes of the 2001 rewrite of this file.
+
+ The interface to the outside and the handling of the global
+ variables was not changed, but internally many necessary changes
+ were performed.
+
+ The main aim for this rewrite is to provide a first step towards
+ making groff fully compatible with classical troff without pain.
+
+ Bugs fixed
+ - Unknown subcommands of 'D' and 'x' are now ignored like in the
+ classical case, but a warning is issued. This was also
+ implemented for the other commands.
+ - A warning is emitted if 'x stop' is missing.
+ - 'DC' and 'DE' commands didn't position to the right end after
+ drawing (now they do), see discussion below.
+ - So far, 'x stop' was ignored. Now it terminates the processing
+ of the current intermediate output file like the classical troff.
+ - The command 'c' didn't check correctly on white-space.
+ - The environment stack wasn't suitable for the color extensions
+ (replaced by a class).
+ - The old groff parser could only handle a prologue with the first
+ 3 lines having a fixed structure, while classical troff specified
+ the sequence of the first 3 commands without further
+ restrictions. Now the parser is smart about additional
+ white space, comments, and empty lines in the prologue.
+ - The old parser allowed space characters only as syntactical
+ separators, while classical troff had tab characters as well.
+ Now any sequence of tabs and/or spaces is a syntactical
+ separator between commands and/or arguments.
+ - Range checks for numbers implemented.
+
+ New and improved features
+ - The color commands 'm' and 'DF' are added.
+ - The old color command 'Df' is now converted and delegated to 'DFg'.
+ - The command 'F' is implemented as 'use intended file name'. It
+ checks whether its argument agrees with the file name used so far,
+ otherwise a warning is issued. Then the new name is remembered
+ and used for the following error messages.
+ - For the positioning after drawing commands, an alternative, easier
+ scheme is provided, but not yet activated; it can be chosen by
+ undefining the preprocessor macro STUPID_DRAWING_POSITIONING.
+ It extends the rule of the classical troff output language in a
+ logical way instead of the rather strange actual positioning.
+ For details, see the discussion below.
+ - For the 'D' commands that only set the environment, the calling of
+ pr->send_draw() was removed because this doesn't make sense for
+ the 'DF' commands; the (changed) environment is sent with the
+ next command anyway.
+ - Error handling was clearly separated into warnings and fatal.
+ - The error behavior on additional arguments for 'D' and 'x'
+ commands with a fixed number of arguments was changed from being
+ ignored (former groff) to issue a warning and ignore (now), see
+ skip_line_x(). No fatal was chosen because both string and
+ integer arguments can occur.
+ - The gtroff program issues a trailing dummy integer argument for
+ some drawing commands with an odd number of arguments to make the
+ number of arguments even, e.g. the DC and Dt commands; this is
+ honored now.
+ - All D commands with a variable number of args expect an even
+ number of trailing integer arguments, so fatal on error was
+ implemented.
+ - Disable environment stack and the commands '{' and '}' by making
+ them conditional on macro USE_ENV_STACK; actually, this is
+ undefined by default. There isn't any known application for these
+ features.
+
+ Cosmetics
+ - Nested 'switch' commands are avoided by using more functions.
+ Dangerous 'fall-through's avoided.
+ - Commands and functions are sorted alphabetically (where possible).
+ - Dynamic arrays/buffers are now implemented as container classes.
+ - Some functions had an ugly return structure; this has been
+ streamlined by using classes.
+ - Use standard C math functions for number handling, so getting rid
+ of differences to '0'.
+ - The macro 'IntArg' has been created for an easier transition
+ to guaranteed 32 bits integers ('int' is enough for GNU, while
+ ANSI only guarantees 'long int' to have a length of 32 bits).
+ - The many usages of type 'int' are differentiated by using 'Char',
+ 'bool', and 'IntArg' where appropriate.
+ - To ease the calls of the local utility functions, the parser
+ variables 'current_file', 'npages', and 'current_env'
+ (formerly env) were made global to the file (formerly they were
+ local to the do_file() function)
+ - Various comments were added.
+
+ TODO
+ - Get rid of the stupid drawing positioning.
+ - Can the 'Dt' command be completely handled by setting environment
+ within do_file() instead of sending to pr?
+ - Integer arguments must be >= 32 bits, use conditional #define.
+ - Add scaling facility for classical device independence and
+ non-groff devices. Classical troff output had a quasi device
+ independence by scaling the intermediate output to the resolution
+ of the postprocessor device if different from the one specified
+ with 'x T', groff have not. So implement full quasi device
+ independence, including the mapping of the strange classical
+ devices to the postprocessor device (seems to be reasonably
+ easy).
+ - The external, global pointer variables are not optimally handled.
+ - The global variables 'current_filename',
+ 'current_source_filename', and 'current_lineno' are only used for
+ error reporting. So implement a static class 'Error'
+ ('::' calls).
+ - The global 'device' is the name used during the formatting
+ process; there should be a new variable for the device name used
+ during the postprocessing.
+ - Implement the B-spline drawing 'D~' for all graphical devices.
+ - Make 'environment' a class with an overflow check for its members
+ and a delete method to get rid of delete_current_env().
+ - Implement the 'EnvStack' to use 'new' instead of 'malloc'.
+ - The class definitions of this document could go into a new file.
+ - The comments in this section should go to a 'Changelog' or some
+ 'README' file in this directory.
+*/
+
+/*
+ Discussion of the positioning by drawing commands
+
+ There was some confusion about the positioning of the graphical
+ pointer at the printout after having executed a 'D' command.
+ The classical troff manual of Ossanna & Kernighan specified,
+
+ 'The position after a graphical object has been drawn is
+ at its end; for circles and ellipses, the "end" is at the
+ right side.'
+
+ From this, it follows that
+ - all open figures (args, splines, and lines) should position at their
+ final point.
+ - all circles and ellipses should position at their right-most point
+ (as if 2 halves had been drawn).
+ - all closed figures apart from circles and ellipses shouldn't change
+ the position because they return to their origin.
+ - all setting commands should not change position because they do not
+ draw any graphical object.
+
+ In the case of the open figures, this means that the horizontal
+ displacement is the sum of all odd arguments and the vertical offset
+ the sum of all even arguments, called the alternate arguments sum
+ displacement in the following.
+
+ Unfortunately, groff did not implement this simple rule. The former
+ documentation in groff_out(5) differed from the source code, and
+ neither of them is compatible with the classical rule.
+
+ The former groff_out(5) specified to use the alternative arguments
+ sum displacement for calculating the drawing positioning of
+ non-classical commands, including the 'Dt' command (setting-only)
+ and closed polygons. Applying this to the new groff color commands
+ will lead to disaster. For their arguments can take large values (>
+ 65000). On low resolution devices, the displacement of such large
+ values will corrupt the display or kill the printer. So the
+ nonsense specification has come to a natural end anyway.
+
+ The groff source code, however, had no positioning for the
+ setting-only commands (esp. 'Dt'), the right-end positioning for
+ outlined circles and ellipses, and the alternative argument sum
+ displacement for all other commands (including filled circles and
+ ellipses).
+
+ The reason why no one seems to have suffered from this mayhem so
+ far is that the graphical objects are usually generated by
+ preprocessors like pic that do not depend on the automatic
+ positioning. When using the low level '\D' escape sequences or 'D'
+ output commands, the strange positionings can be circumvented by
+ absolute positionings or by tricks like '\Z'.
+
+ So doing an exorcism on the strange, incompatible displacements might
+ not harm any existing documents, but will make the usage of the
+ graphical escape sequences and commands natural.
+
+ That's why the rewrite of this file returned to the reasonable,
+ classical specification with its clear end-of-drawing rule that is
+ suitable for all cases. But a macro STUPID_DRAWING_POSITIONING is
+ provided for testing the funny former behavior.
+
+ The new rule implies the following behavior.
+ - Setting commands ('Dt', 'Df', 'DF') and polygons ('Dp' and 'DP')
+ do not change position now.
+ - Filled circles and ellipses ('DC' and 'DE') position at their
+ most right point (outlined ones 'Dc' and 'De' did this anyway).
+ - As before, all open graphical objects position to their final
+ drawing point (alternate sum of the command arguments).
+
+*/
+
+#ifndef STUPID_DRAWING_POSITIONING
+// uncomment next line if all non-classical D commands shall position
+// to the strange alternate sum of args displacement
+#define STUPID_DRAWING_POSITIONING
+#endif
+
+// Decide whether the commands '{' and '}' for different environments
+// should be used.
+#undef USE_ENV_STACK
+
+#include "driver.h"
+#include "device.h"
+
+#include <stdlib.h>
+#include <errno.h>
+#include <ctype.h>
+#include <math.h>
+
+
+/**********************************************************************
+ local types
+ **********************************************************************/
+
+// integer type used in the fields of struct environment (see printer.h)
+typedef int EnvInt;
+
+// integer arguments of groff_out commands, must be >= 32 bits
+typedef int IntArg;
+
+// color components of groff_out color commands, must be >= 32 bits
+typedef unsigned int ColorArg;
+
+// Array for IntArg values.
+class IntArray {
+ size_t num_allocated;
+ size_t num_stored;
+ IntArg *data;
+public:
+ IntArray(void);
+ IntArray(const size_t);
+ ~IntArray(void);
+ IntArg operator[](const size_t i) const
+ {
+ if (i >= num_stored)
+ fatal("index out of range");
+ return (IntArg) data[i];
+ }
+ void append(IntArg);
+ IntArg *get_data(void) const { return (IntArg *)data; }
+ size_t len(void) const { return num_stored; }
+};
+
+// Characters read from the input queue.
+class Char {
+ int data;
+public:
+ Char(void) : data('\0') {}
+ Char(const int c) : data(c) {}
+ bool operator==(char c) const { return (data == c) ? true : false; }
+ bool operator==(int c) const { return (data == c) ? true : false; }
+ bool operator==(const Char c) const
+ { return (data == c.data) ? true : false; }
+ bool operator!=(char c) const { return !(*this == c); }
+ bool operator!=(int c) const { return !(*this == c); }
+ bool operator!=(const Char c) const { return !(*this == c); }
+ operator int() const { return (int) data; }
+ operator unsigned char() const { return (unsigned char) data; }
+ operator char() const { return (char) data; }
+};
+
+// Buffer for string arguments (Char, not char).
+class StringBuf {
+ size_t num_allocated;
+ size_t num_stored;
+ Char *data; // not terminated by '\0'
+public:
+ StringBuf(void); // allocate without storing
+ ~StringBuf(void);
+ void append(const Char); // append character to 'data'
+ char *make_string(void); // return new copy of 'data' with '\0'
+ bool is_empty(void) { // true if none stored
+ return (num_stored > 0) ? false : true;
+ }
+ void reset(void); // set 'num_stored' to 0
+};
+
+#ifdef USE_ENV_STACK
+class EnvStack {
+ environment **data;
+ size_t num_allocated;
+ size_t num_stored;
+public:
+ EnvStack(void);
+ ~EnvStack(void);
+ environment *pop(void);
+ void push(environment *e);
+};
+#endif // USE_ENV_STACK
+
+
+/**********************************************************************
+ external variables
+ **********************************************************************/
+
+// exported as extern by error.h (called from driver.h)
+// needed for error messages (see ../libgroff/error.cpp)
+const char *current_filename = 0; // printable name of the current file
+ // printable name of current source file
+const char *current_source_filename = 0;
+int current_lineno = 0; // current line number of printout
+
+// exported as extern by device.h;
+const char *device = 0; // cancel former init with literal
+
+printer *pr;
+
+// Note:
+//
+// We rely on an implementation of the 'new' operator which aborts
+// gracefully if it can't allocate memory (e.g. from libgroff/new.cpp).
+
+
+/**********************************************************************
+ static local variables
+ **********************************************************************/
+
+FILE *current_file = 0; // current input stream for parser
+
+// npages: number of pages processed so far (including current page),
+// _not_ the page number in the printout (can be set with 'p').
+int npages = 0;
+
+const ColorArg
+COLORARG_MAX = (ColorArg) 65536U; // == 0xFFFF + 1 == 0x10000
+
+const IntArg
+INTARG_MAX = (IntArg) 0x7FFFFFFF; // maximal signed 32 bits number
+
+// parser environment, created and deleted by each run of do_file()
+environment *current_env = 0;
+
+#ifdef USE_ENV_STACK
+const size_t
+envp_size = sizeof(environment *);
+#endif // USE_ENV_STACK
+
+
+/**********************************************************************
+ function declarations
+ **********************************************************************/
+
+// utility functions
+ColorArg color_from_Df_command(IntArg);
+ // transform old color into new
+void delete_current_env(void); // delete global var current_env
+void fatal_command(char); // abort for invalid command
+inline Char get_char(void); // read next character from input stream
+ColorArg get_color_arg(void); // read in argument for new color cmds
+IntArray *get_D_fixed_args(const size_t);
+ // read in fixed number of integer
+ // arguments
+IntArray *get_D_fixed_args_odd_dummy(const size_t);
+ // read in a fixed number of integer
+ // arguments plus optional dummy
+IntArray *get_D_variable_args(void);
+ // variable, even number of int args
+char *get_extended_arg(void); // argument for 'x X' (several lines)
+IntArg get_integer_arg(void); // read in next integer argument
+IntArray *get_possibly_integer_args();
+ // 0 or more integer arguments
+char *get_string_arg(void); // read in next string arg, ended by WS
+inline bool is_space_or_tab(const Char);
+ // test on space/tab char
+Char next_arg_begin(void); // skip white space on current line
+Char next_command(void); // go to next command, evt. diff. line
+inline bool odd(const int); // test if integer is odd
+void position_to_end_of_args(const IntArray * const);
+ // positioning after drawing
+void remember_filename(const char *);
+ // set global current_filename
+void remember_source_filename(const char *);
+ // set global current_source_filename
+void send_draw(const Char, const IntArray * const);
+ // call pr->draw
+void skip_line(void); // unconditionally skip to next line
+bool skip_line_checked(void); // skip line, false if args are left
+void skip_line_fatal(void); // skip line, fatal if args are left
+void skip_line_warn(void); // skip line, warn if args are left
+void skip_line_D(void); // skip line in D commands
+void skip_line_x(void); // skip line in x commands
+void skip_to_end_of_line(void); // skip to the end of the current line
+inline void unget_char(const Char);
+ // restore character onto input
+
+// parser subcommands
+void parse_color_command(color *);
+ // color sub(sub)commands m and DF
+void parse_D_command(void); // graphical subcommands
+bool parse_x_command(void); // device controller subcommands
+
+
+/**********************************************************************
+ class methods
+ **********************************************************************/
+
+#ifdef USE_ENV_STACK
+EnvStack::EnvStack(void)
+{
+ num_allocated = 4;
+ // allocate pointer to array of num_allocated pointers to environment
+ data = (environment **)malloc(envp_size * num_allocated);
+ if (data == 0)
+ fatal("could not allocate environment data");
+ num_stored = 0;
+}
+
+EnvStack::~EnvStack(void)
+{
+ for (size_t i = 0; i < num_stored; i++)
+ delete data[i];
+ free(data);
+}
+
+// return top element from stack and decrease stack pointer
+//
+// the calling function must take care of properly deleting the result
+environment *
+EnvStack::pop(void)
+{
+ num_stored--;
+ environment *result = data[num_stored];
+ data[num_stored] = 0;
+ return result;
+}
+
+// copy argument and push this onto the stack
+void
+EnvStack::push(environment *e)
+{
+ environment *e_copy = new environment;
+ if (num_stored >= num_allocated) {
+ environment **old_data = data;
+ num_allocated *= 2;
+ data = (environment **)malloc(envp_size * num_allocated);
+ if (data == 0)
+ fatal("could not allocate data");
+ for (size_t i = 0; i < num_stored; i++)
+ data[i] = old_data[i];
+ free(old_data);
+ }
+ e_copy->col = new color;
+ e_copy->fill = new color;
+ *e_copy->col = *e->col;
+ *e_copy->fill = *e->fill;
+ e_copy->fontno = e->fontno;
+ e_copy->height = e->height;
+ e_copy->hpos = e->hpos;
+ e_copy->size = e->size;
+ e_copy->slant = e->slant;
+ e_copy->vpos = e->vpos;
+ data[num_stored] = e_copy;
+ num_stored++;
+}
+#endif // USE_ENV_STACK
+
+IntArray::IntArray(void)
+{
+ num_allocated = 4;
+ data = new IntArg[num_allocated];
+ num_stored = 0;
+}
+
+IntArray::IntArray(const size_t n)
+{
+ if (n <= 0)
+ fatal("number of integers to be allocated must be > 0");
+ num_allocated = n;
+ data = new IntArg[num_allocated];
+ num_stored = 0;
+}
+
+IntArray::~IntArray(void)
+{
+ delete[] data;
+}
+
+void
+IntArray::append(IntArg x)
+{
+ if (num_stored >= num_allocated) {
+ IntArg *old_data = data;
+ num_allocated *= 2;
+ data = new IntArg[num_allocated];
+ for (size_t i = 0; i < num_stored; i++)
+ data[i] = old_data[i];
+ delete[] old_data;
+ }
+ data[num_stored] = x;
+ num_stored++;
+}
+
+StringBuf::StringBuf(void)
+{
+ num_stored = 0;
+ num_allocated = 128;
+ data = new Char[num_allocated];
+}
+
+StringBuf::~StringBuf(void)
+{
+ delete[] data;
+}
+
+void
+StringBuf::append(const Char c)
+{
+ if (num_stored >= num_allocated) {
+ Char *old_data = data;
+ num_allocated *= 2;
+ data = new Char[num_allocated];
+ for (size_t i = 0; i < num_stored; i++)
+ data[i] = old_data[i];
+ delete[] old_data;
+ }
+ data[num_stored] = c;
+ num_stored++;
+}
+
+char *
+StringBuf::make_string(void)
+{
+ char *result = new char[num_stored + 1];
+ for (size_t i = 0; i < num_stored; i++)
+ result[i] = (char) data[i];
+ result[num_stored] = '\0';
+ return result;
+}
+
+void
+StringBuf::reset(void)
+{
+ num_stored = 0;
+}
+
+/**********************************************************************
+ utility functions
+ **********************************************************************/
+
+//////////////////////////////////////////////////////////////////////
+/* color_from_Df_command:
+ Process the gray shade setting command Df.
+
+ Transform Df style color into DF style color.
+ Df color: 0-1000, 0 is white
+ DF color: 0-65536, 0 is black
+
+ The Df command is obsoleted by command DFg, but kept for
+ compatibility.
+*/
+ColorArg
+color_from_Df_command(IntArg Df_gray)
+{
+ return ColorArg((1000-Df_gray) * COLORARG_MAX / 1000); // scaling
+}
+
+//////////////////////////////////////////////////////////////////////
+/* delete_current_env():
+ Delete global variable current_env and its pointer members.
+
+ This should be a class method of environment.
+*/
+void delete_current_env(void)
+{
+ delete current_env->col;
+ delete current_env->fill;
+ delete current_env;
+ current_env = 0;
+}
+
+//////////////////////////////////////////////////////////////////////
+/* fatal_command():
+ Emit error message about invalid command and abort.
+*/
+void
+fatal_command(char command)
+{
+ fatal("'%1' command invalid before first 'p' command", command);
+}
+
+//////////////////////////////////////////////////////////////////////
+/* get_char():
+ Retrieve the next character from the input queue.
+
+ Return: The retrieved character (incl. EOF), converted to Char.
+*/
+inline Char
+get_char(void)
+{
+ return (Char) getc(current_file);
+}
+
+//////////////////////////////////////////////////////////////////////
+/* get_color_arg():
+ Retrieve an argument suitable for the color commands m and DF.
+
+ Return: The retrieved color argument.
+*/
+ColorArg
+get_color_arg(void)
+{
+ IntArg x = get_integer_arg();
+ if (x < 0 || x > (IntArg)COLORARG_MAX) {
+ error("color component argument out of range");
+ x = 0;
+ }
+ return (ColorArg) x;
+}
+
+//////////////////////////////////////////////////////////////////////
+/* get_D_fixed_args():
+ Get a fixed number of integer arguments for D commands.
+
+ Fatal if wrong number of arguments.
+ Too many arguments on the line raise a warning.
+ A line skip is done.
+
+ number: In-parameter, the number of arguments to be retrieved.
+ ignore: In-parameter, ignore next argument -- GNU troff always emits
+ pairs of parameters for 'D' extensions added by groff.
+ Default is 'false'.
+
+ Return: New IntArray containing the arguments.
+*/
+IntArray *
+get_D_fixed_args(const size_t number)
+{
+ if (number <= 0)
+ fatal("requested number of arguments must be > 0");
+ IntArray *args = new IntArray(number);
+ for (size_t i = 0; i < number; i++)
+ args->append(get_integer_arg());
+ skip_line_D();
+ return args;
+}
+
+//////////////////////////////////////////////////////////////////////
+/* get_D_fixed_args_odd_dummy():
+ Get a fixed number of integer arguments for D commands and optionally
+ ignore a dummy integer argument if the requested number is odd.
+
+ The gtroff program adds a dummy argument to some commands to get
+ an even number of arguments.
+ Error if the number of arguments differs from the scheme above.
+ A line skip is done.
+
+ number: In-parameter, the number of arguments to be retrieved.
+
+ Return: New IntArray containing the arguments.
+*/
+IntArray *
+get_D_fixed_args_odd_dummy(const size_t number)
+{
+ if (number <= 0)
+ fatal("requested number of arguments must be > 0");
+ IntArray *args = new IntArray(number);
+ for (size_t i = 0; i < number; i++)
+ args->append(get_integer_arg());
+ if (odd(number)) {
+ IntArray *a = get_possibly_integer_args();
+ if (a->len() > 1)
+ error("too many arguments");
+ delete a;
+ }
+ skip_line_D();
+ return args;
+}
+
+//////////////////////////////////////////////////////////////////////
+/* get_D_variable_args():
+ Get a variable even number of integer arguments for D commands.
+
+ Get as many integer arguments as possible from the rest of the
+ current line.
+ - The arguments are separated by an arbitrary sequence of space or
+ tab characters.
+ - A comment, a newline, or EOF indicates the end of processing.
+ - Error on non-digit characters different from these.
+ - A final line skip is performed (except for EOF).
+
+ Return: New IntArray of the retrieved arguments.
+*/
+IntArray *
+get_D_variable_args()
+{
+ IntArray *args = get_possibly_integer_args();
+ size_t n = args->len();
+ if (n <= 0)
+ error("no arguments found");
+ if (odd(n))
+ error("even number of arguments expected");
+ skip_line_D();
+ return args;
+}
+
+//////////////////////////////////////////////////////////////////////
+/* get_extended_arg():
+ Retrieve extended arg for 'x X' command.
+
+ - Skip leading spaces and tabs, error on EOL or newline.
+ - Return everything before the next NL or EOF ('#' is not a comment);
+ as long as the following line starts with '+' this is returned
+ as well, with the '+' replaced by a newline.
+ - Final line skip is always performed.
+
+ Return: Allocated (new) string of retrieved text argument.
+*/
+char *
+get_extended_arg(void)
+{
+ StringBuf buf = StringBuf();
+ Char c = next_arg_begin();
+ while ((int) c != EOF) {
+ if ((int) c == '\n') {
+ current_lineno++;
+ c = get_char();
+ if ((int) c == '+')
+ buf.append((Char) '\n');
+ else {
+ unget_char(c); // first character of next line
+ break;
+ }
+ }
+ else
+ buf.append(c);
+ c = get_char();
+ }
+ return buf.make_string();
+}
+
+//////////////////////////////////////////////////////////////////////
+/* get_integer_arg(): Retrieve integer argument.
+
+ Skip leading spaces and tabs, collect an optional '-' and all
+ following decimal digits (at least one) up to the next non-digit,
+ which is restored onto the input queue.
+
+ Fatal error on all other situations.
+
+ Return: Retrieved integer.
+*/
+IntArg
+get_integer_arg(void)
+{
+ StringBuf buf = StringBuf();
+ Char c = next_arg_begin();
+ if ((int) c == '-') {
+ buf.append(c);
+ c = get_char();
+ }
+ if (!isdigit((int) c))
+ fatal("integer argument expected");
+ while (isdigit((int) c)) {
+ buf.append(c);
+ c = get_char();
+ }
+ // c is not a digit
+ unget_char(c);
+ char *s = buf.make_string();
+ errno = 0;
+ long int number = strtol(s, 0, 10);
+ if (errno != 0
+ || number > INTARG_MAX || number < -INTARG_MAX) {
+ error("integer argument too large");
+ number = 0;
+ }
+ delete[] s;
+ return (IntArg) number;
+}
+
+//////////////////////////////////////////////////////////////////////
+/* get_possibly_integer_args():
+ Parse the rest of the input line as a list of integer arguments.
+
+ Get as many integer arguments as possible from the rest of the
+ current line, even none.
+ - The arguments are separated by an arbitrary sequence of space or
+ tab characters.
+ - A comment, a newline, or EOF indicates the end of processing.
+ - Error on non-digit characters different from these.
+ - No line skip is performed.
+
+ Return: New IntArray of the retrieved arguments.
+*/
+IntArray *
+get_possibly_integer_args()
+{
+ bool done = false;
+ StringBuf buf = StringBuf();
+ Char c = get_char();
+ IntArray *args = new IntArray();
+ while (!done) {
+ buf.reset();
+ while (is_space_or_tab(c))
+ c = get_char();
+ if (c == '-') {
+ Char c1 = get_char();
+ if (isdigit((int) c1)) {
+ buf.append(c);
+ c = c1;
+ }
+ else
+ unget_char(c1);
+ }
+ while (isdigit((int) c)) {
+ buf.append(c);
+ c = get_char();
+ }
+ if (!buf.is_empty()) {
+ char *s = buf.make_string();
+ errno = 0;
+ long int x = strtol(s, 0, 10);
+ if (errno
+ || x > INTARG_MAX || x < -INTARG_MAX) {
+ error("invalid integer argument, set to 0");
+ x = 0;
+ }
+ args->append((IntArg) x);
+ delete[] s;
+ }
+ // Here, c is not a digit.
+ // Terminate on comment, end of line, or end of file, while
+ // space or tab indicate continuation; otherwise error.
+ switch((int) c) {
+ case '#':
+ skip_to_end_of_line();
+ done = true;
+ break;
+ case '\n':
+ done = true;
+ unget_char(c);
+ break;
+ case EOF:
+ done = true;
+ break;
+ case ' ':
+ case '\t':
+ break;
+ default:
+ error("integer argument expected");
+ done = true;
+ break;
+ }
+ }
+ return args;
+}
+
+//////////////////////////////////////////////////////////////////////
+/* get_string_arg():
+ Retrieve string arg.
+
+ - Skip leading spaces and tabs; error on EOL or newline.
+ - Return all following characters before the next space, tab,
+ newline, or EOF character (in-word '#' is not a comment character).
+ - The terminating space, tab, newline, or EOF character is restored
+ onto the input queue, so no line skip.
+
+ Return: Retrieved string as char *, allocated by 'new'.
+*/
+char *
+get_string_arg(void)
+{
+ StringBuf buf = StringBuf();
+ Char c = next_arg_begin();
+ while (!is_space_or_tab(c)
+ && c != Char('\n') && c != Char(EOF)) {
+ buf.append(c);
+ c = get_char();
+ }
+ unget_char(c); // restore white space
+ return buf.make_string();
+}
+
+//////////////////////////////////////////////////////////////////////
+/* is_space_or_tab():
+ Test a character if it is a space or tab.
+
+ c: In-parameter, character to be tested.
+
+ Return: True, if c is a space or tab character, false otherwise.
+*/
+inline bool
+is_space_or_tab(const Char c)
+{
+ return (c == Char(' ') || c == Char('\t')) ? true : false;
+}
+
+//////////////////////////////////////////////////////////////////////
+/* next_arg_begin():
+ Return first character of next argument.
+
+ Skip space and tab characters; error on newline or EOF.
+
+ Return: The first character different from these (including '#').
+*/
+Char
+next_arg_begin(void)
+{
+ Char c;
+ while (1) {
+ c = get_char();
+ switch ((int) c) {
+ case ' ':
+ case '\t':
+ break;
+ case '\n':
+ case EOF:
+ error("missing argument");
+ return c;
+ default: // first essential character
+ return c;
+ }
+ }
+}
+
+//////////////////////////////////////////////////////////////////////
+/* next_command():
+ Find the first character of the next command.
+
+ Skip spaces, tabs, comments (introduced by #), and newlines.
+
+ Return: The first character different from these (including EOF).
+*/
+Char
+next_command(void)
+{
+ Char c;
+ while (1) {
+ c = get_char();
+ switch ((int) c) {
+ case ' ':
+ case '\t':
+ break;
+ case '\n':
+ current_lineno++;
+ break;
+ case '#': // comment
+ skip_line();
+ break;
+ default: // EOF or first essential character
+ return c;
+ }
+ }
+}
+
+//////////////////////////////////////////////////////////////////////
+/* odd():
+ Test whether argument is an odd number.
+
+ n: In-parameter, the integer to be tested.
+
+ Return: True if odd, false otherwise.
+*/
+inline bool
+odd(const int n)
+{
+ return ((n & 1) == 1) ? true : false;
+}
+
+//////////////////////////////////////////////////////////////////////
+/* position_to_end_of_args():
+ Move graphical pointer to end of drawn figure.
+
+ This is used by the D commands that draw open geometrical figures.
+ The algorithm simply sums up all horizontal displacements (arguments
+ with even number) for the horizontal component. Similarly, the
+ vertical component is the sum of the odd arguments.
+
+ args: In-parameter, the arguments of a former drawing command.
+*/
+void
+position_to_end_of_args(const IntArray * const args)
+{
+ size_t i;
+ const size_t n = args->len();
+ for (i = 0; i < n; i += 2)
+ current_env->hpos += (*args)[i];
+ for (i = 1; i < n; i += 2)
+ current_env->vpos += (*args)[i];
+}
+
+//////////////////////////////////////////////////////////////////////
+/* remember_filename():
+ Set global variable current_filename.
+
+ The actual filename is stored in current_filename. This is used by
+ the postprocessors, expecting the name "<standard input>" for stdin.
+
+ filename: In-out-parameter; is changed to the new value also.
+*/
+void
+remember_filename(const char *filename)
+{
+ char *fname;
+ if (strcmp(filename, "-") == 0)
+ fname = (char *)"<standard input>";
+ else
+ fname = (char *)filename;
+ size_t len = strlen(fname) + 1;
+ if (current_filename != 0)
+ free((char *)current_filename);
+ current_filename = (const char *)malloc(len);
+ if (current_filename == 0)
+ fatal("can't malloc space for filename");
+ strncpy((char *)current_filename, (char *)fname, len);
+}
+
+//////////////////////////////////////////////////////////////////////
+/* remember_source_filename():
+ Set global variable current_source_filename.
+
+ The actual filename is stored in current_filename. This is used by
+ the postprocessors, expecting the name "<standard input>" for stdin.
+
+ filename: In-out-parameter; is changed to the new value also.
+*/
+void
+remember_source_filename(const char *filename)
+{
+ char *fname;
+ if (strcmp(filename, "-") == 0)
+ fname = (char *)"<standard input>";
+ else
+ fname = (char *)filename;
+ size_t len = strlen(fname) + 1;
+ if (current_source_filename != 0)
+ free((char *)current_source_filename);
+ current_source_filename = (const char *)malloc(len);
+ if (current_source_filename == 0)
+ fatal("can't malloc space for filename");
+ strncpy((char *)current_source_filename, (char *)fname, len);
+}
+
+//////////////////////////////////////////////////////////////////////
+/* send_draw():
+ Call draw method of printer class.
+
+ subcmd: Letter of actual D subcommand.
+ args: Array of integer arguments of actual D subcommand.
+*/
+void
+send_draw(const Char subcmd, const IntArray * const args)
+{
+ EnvInt n = (EnvInt) args->len();
+ pr->draw((int) subcmd, (IntArg *)args->get_data(), n, current_env);
+}
+
+//////////////////////////////////////////////////////////////////////
+/* skip_line():
+ Go to next line within the input queue.
+
+ Skip the rest of the current line, including the newline character.
+ The global variable current_lineno is adjusted.
+ No errors are raised.
+*/
+void
+skip_line(void)
+{
+ Char c = get_char();
+ while (1) {
+ if (c == '\n') {
+ current_lineno++;
+ break;
+ }
+ if (c == EOF)
+ break;
+ c = get_char();
+ }
+}
+
+//////////////////////////////////////////////////////////////////////
+/* skip_line_checked ():
+ Check that there aren't any arguments left on the rest of the line,
+ then skip line.
+
+ Spaces, tabs, and a comment are allowed before newline or EOF.
+ All other characters raise an error.
+*/
+bool
+skip_line_checked(void)
+{
+ bool ok = true;
+ Char c = get_char();
+ while (is_space_or_tab(c))
+ c = get_char();
+ switch((int) c) {
+ case '#': // comment
+ skip_line();
+ break;
+ case '\n':
+ current_lineno++;
+ break;
+ case EOF:
+ break;
+ default:
+ ok = false;
+ skip_line();
+ break;
+ }
+ return ok;
+}
+
+//////////////////////////////////////////////////////////////////////
+/* skip_line_fatal ():
+ Fatal error if arguments left, otherwise skip line.
+
+ Spaces, tabs, and a comment are allowed before newline or EOF.
+ All other characters trigger the error.
+*/
+void
+skip_line_fatal(void)
+{
+ bool ok = skip_line_checked();
+ if (!ok) {
+ current_lineno--;
+ error("too many arguments");
+ current_lineno++;
+ }
+}
+
+//////////////////////////////////////////////////////////////////////
+/* skip_line_warn ():
+ Skip line, but warn if arguments are left on actual line.
+
+ Spaces, tabs, and a comment are allowed before newline or EOF.
+ All other characters raise a warning
+*/
+void
+skip_line_warn(void)
+{
+ bool ok = skip_line_checked();
+ if (!ok) {
+ current_lineno--;
+ warning("too many arguments on current line");
+ current_lineno++;
+ }
+}
+
+//////////////////////////////////////////////////////////////////////
+/* skip_line_D ():
+ Skip line in 'D' commands.
+
+ Decide whether in case of an additional argument a fatal error is
+ raised (the documented classical behavior), only a warning is
+ issued, or the line is just skipped (former groff behavior).
+ Actually decided for the warning.
+*/
+void
+skip_line_D(void)
+{
+ skip_line_warn();
+ // or: skip_line_fatal();
+ // or: skip_line();
+}
+
+//////////////////////////////////////////////////////////////////////
+/* skip_line_x ():
+ Skip line in 'x' commands.
+
+ Decide whether in case of an additional argument a fatal error is
+ raised (the documented classical behavior), only a warning is
+ issued, or the line is just skipped (former groff behavior).
+ Actually decided for the warning.
+*/
+void
+skip_line_x(void)
+{
+ skip_line_warn();
+ // or: skip_line_fatal();
+ // or: skip_line();
+}
+
+//////////////////////////////////////////////////////////////////////
+/* skip_to_end_of_line():
+ Go to the end of the current line.
+
+ Skip the rest of the current line, excluding the newline character.
+ The global variable current_lineno is not changed.
+ No errors are raised.
+*/
+void
+skip_to_end_of_line(void)
+{
+ Char c = get_char();
+ while (1) {
+ if (c == '\n') {
+ unget_char(c);
+ return;
+ }
+ if (c == EOF)
+ return;
+ c = get_char();
+ }
+}
+
+//////////////////////////////////////////////////////////////////////
+/* unget_char(c):
+ Restore character c onto input queue.
+
+ Write a character back onto the input stream.
+ EOF is gracefully handled.
+
+ c: In-parameter; character to be pushed onto the input queue.
+*/
+inline void
+unget_char(const Char c)
+{
+ if (c != EOF) {
+ int ch = (int) c;
+ if (ungetc(ch, current_file) == EOF)
+ fatal("could not unget character");
+ }
+}
+
+
+/**********************************************************************
+ parser subcommands
+ **********************************************************************/
+
+//////////////////////////////////////////////////////////////////////
+/* parse_color_command:
+ Process the commands m and DF, but not Df.
+
+ col: In-out-parameter; the color object to be set, must have
+ been initialized before.
+*/
+void
+parse_color_command(color *col)
+{
+ ColorArg gray = 0;
+ ColorArg red = 0, green = 0, blue = 0;
+ ColorArg cyan = 0, magenta = 0, yellow = 0, black = 0;
+ Char subcmd = next_arg_begin();
+ switch((int) subcmd) {
+ case 'c': // DFc or mc: CMY
+ cyan = get_color_arg();
+ magenta = get_color_arg();
+ yellow = get_color_arg();
+ col->set_cmy(cyan, magenta, yellow);
+ break;
+ case 'd': // DFd or md: set default color
+ col->set_default();
+ break;
+ case 'g': // DFg or mg: gray
+ gray = get_color_arg();
+ col->set_gray(gray);
+ break;
+ case 'k': // DFk or mk: CMYK
+ cyan = get_color_arg();
+ magenta = get_color_arg();
+ yellow = get_color_arg();
+ black = get_color_arg();
+ col->set_cmyk(cyan, magenta, yellow, black);
+ break;
+ case 'r': // DFr or mr: RGB
+ red = get_color_arg();
+ green = get_color_arg();
+ blue = get_color_arg();
+ col->set_rgb(red, green, blue);
+ break;
+ default:
+ error("invalid color scheme '%1'", (int) subcmd);
+ break;
+ } // end of color subcommands
+}
+
+//////////////////////////////////////////////////////////////////////
+/* parse_D_command():
+ Parse the subcommands of graphical command D.
+
+ This is the part of the do_file() parser that scans the graphical
+ subcommands.
+ - Error on lacking or wrong arguments.
+ - Warning on too many arguments.
+ - Line is always skipped.
+*/
+void
+parse_D_command()
+{
+ Char subcmd = next_arg_begin();
+ switch((int) subcmd) {
+ case '~': // D~: draw B-spline
+ // actually, this isn't available for some postprocessors
+ // fall through
+ default: // unknown options are passed to device
+ {
+ IntArray *args = get_D_variable_args();
+ send_draw(subcmd, args);
+ position_to_end_of_args(args);
+ delete args;
+ break;
+ }
+ case 'a': // Da: draw arc
+ {
+ IntArray *args = get_D_fixed_args(4);
+ send_draw(subcmd, args);
+ position_to_end_of_args(args);
+ delete args;
+ break;
+ }
+ case 'c': // Dc: draw circle line
+ {
+ IntArray *args = get_D_fixed_args(1);
+ send_draw(subcmd, args);
+ // move to right end
+ current_env->hpos += (*args)[0];
+ delete args;
+ break;
+ }
+ case 'C': // DC: draw solid circle
+ {
+ IntArray *args = get_D_fixed_args_odd_dummy(1);
+ send_draw(subcmd, args);
+ // move to right end
+ current_env->hpos += (*args)[0];
+ delete args;
+ break;
+ }
+ case 'e': // De: draw ellipse line
+ case 'E': // DE: draw solid ellipse
+ {
+ IntArray *args = get_D_fixed_args(2);
+ send_draw(subcmd, args);
+ // move to right end
+ current_env->hpos += (*args)[0];
+ delete args;
+ break;
+ }
+ case 'f': // Df: set fill gray; obsoleted by DFg
+ {
+ IntArg arg = get_integer_arg();
+ if ((arg >= 0) && (arg <= 1000)) {
+ // convert arg and treat it like DFg
+ ColorArg gray = color_from_Df_command(arg);
+ current_env->fill->set_gray(gray);
+ }
+ else {
+ // set fill color to the same value as the current outline color
+ delete current_env->fill;
+ current_env->fill = new color(current_env->col);
+ }
+ pr->change_fill_color(current_env);
+ // skip unused 'vertical' component (\D'...' always emits pairs)
+ (void) get_integer_arg();
+# ifdef STUPID_DRAWING_POSITIONING
+ current_env->hpos += arg;
+# endif
+ skip_line_x();
+ break;
+ }
+ case 'F': // DF: set fill color, several formats
+ parse_color_command(current_env->fill);
+ pr->change_fill_color(current_env);
+ // no positioning (setting-only command)
+ skip_line_x();
+ break;
+ case 'l': // Dl: draw line
+ {
+ IntArray *args = get_D_fixed_args(2);
+ send_draw(subcmd, args);
+ position_to_end_of_args(args);
+ delete args;
+ break;
+ }
+ case 'p': // Dp: draw closed polygon line
+ case 'P': // DP: draw solid closed polygon
+ {
+ IntArray *args = get_D_variable_args();
+ send_draw(subcmd, args);
+# ifdef STUPID_DRAWING_POSITIONING
+ // final args positioning
+ position_to_end_of_args(args);
+# endif
+ delete args;
+ break;
+ }
+ case 't': // Dt: set line thickness
+ {
+ IntArray *args = get_D_fixed_args_odd_dummy(1);
+ send_draw(subcmd, args);
+# ifdef STUPID_DRAWING_POSITIONING
+ // final args positioning
+ position_to_end_of_args(args);
+# endif
+ delete args;
+ break;
+ }
+ } // end of D subcommands
+}
+
+//////////////////////////////////////////////////////////////////////
+/* parse_x_command():
+ Parse subcommands of the device control command x.
+
+ This is the part of the do_file() parser that scans the device
+ controlling commands.
+ - Error on duplicate prologue commands.
+ - Error on wrong or lacking arguments.
+ - Warning on too many arguments.
+ - Line is always skipped.
+
+ Globals:
+ - current_env: is set by many subcommands.
+ - npages: page counting variable
+
+ Return: boolean in the meaning of 'stopped'
+ - true if parsing should be stopped ('x stop').
+ - false if parsing should continue.
+*/
+bool
+parse_x_command(void)
+{
+ bool stopped = false;
+ char *subcmd_str = get_string_arg();
+ char subcmd = subcmd_str[0];
+ switch (subcmd) {
+ case 'f': // x font: mount font
+ {
+ IntArg n = get_integer_arg();
+ char *name = get_string_arg();
+ pr->load_font(n, name);
+ delete[] name;
+ skip_line_x();
+ break;
+ }
+ case 'F': // x Filename: set filename for errors
+ {
+ char *str_arg = get_extended_arg();
+ if (str_arg == 0)
+ warning("empty argument for 'x F' command");
+ else {
+ remember_source_filename(str_arg);
+ delete[] str_arg;
+ }
+ break;
+ }
+ case 'H': // x Height: set character height
+ current_env->height = get_integer_arg();
+ if (current_env->height == current_env->size)
+ current_env->height = 0;
+ skip_line_x();
+ break;
+ case 'i': // x init: initialize device
+ error("duplicate 'x init' command");
+ skip_line_x();
+ break;
+ case 'p': // x pause: pause device
+ skip_line_x();
+ break;
+ case 'r': // x res: set resolution
+ error("duplicate 'x res' command");
+ skip_line_x();
+ break;
+ case 's': // x stop: stop device
+ stopped = true;
+ skip_line_x();
+ break;
+ case 'S': // x Slant: set slant
+ current_env->slant = get_integer_arg();
+ skip_line_x();
+ break;
+ case 't': // x trailer: generate trailer info
+ skip_line_x();
+ break;
+ case 'T': // x Typesetter: set typesetter
+ error("duplicate 'x T' command");
+ skip_line();
+ break;
+ case 'u': // x underline: from .cu
+ {
+ char *str_arg = get_string_arg();
+ pr->special(str_arg, current_env, 'u');
+ delete[] str_arg;
+ skip_line_x();
+ break;
+ }
+ case 'X': // x X: send uninterpretedly to device
+ {
+ char *str_arg = get_extended_arg(); // includes line skip
+ if (npages <= 0)
+ error("'x X' command invalid before first 'p' command");
+ else if (str_arg && (strncmp(str_arg, "devtag:",
+ strlen("devtag:")) == 0))
+ pr->devtag(str_arg, current_env);
+ else
+ pr->special(str_arg, current_env);
+ delete[] str_arg;
+ break;
+ }
+ default: // ignore unknown x commands, but warn
+ warning("unknown command 'x %1'", subcmd);
+ skip_line();
+ }
+ delete[] subcmd_str;
+ return stopped;
+}
+
+
+/**********************************************************************
+ exported part (by driver.h)
+ **********************************************************************/
+
+////////////////////////////////////////////////////////////////////////
+/* do_file():
+ Parse and postprocess groff intermediate output.
+
+ filename: "-" for standard input, normal file name otherwise
+*/
+void
+do_file(const char *filename)
+{
+ Char command;
+ bool stopped = false; // terminating condition
+
+#ifdef USE_ENV_STACK
+ EnvStack env_stack = EnvStack();
+#endif // USE_ENV_STACK
+
+ // setup of global variables
+ npages = 0;
+ current_lineno = 1;
+ // 'pr' is initialized after the prologue.
+ // 'device' is set by the 1st prologue command.
+
+ if (filename[0] == '-' && filename[1] == '\0')
+ current_file = stdin;
+ else {
+ errno = 0;
+ current_file = fopen(filename, "r");
+ if (errno != 0 || current_file == 0) {
+ error("can't open file '%1'", filename);
+ return;
+ }
+ }
+ remember_filename(filename);
+
+ if (current_env != 0)
+ delete_current_env();
+ current_env = new environment;
+ current_env->col = new color;
+ current_env->fill = new color;
+ current_env->fontno = -1;
+ current_env->height = 0;
+ current_env->hpos = -1;
+ current_env->slant = 0;
+ current_env->size = 0;
+ current_env->vpos = -1;
+
+ // parsing of prologue (first 3 commands)
+ {
+ char *str_arg;
+ IntArg int_arg;
+
+ // 1st command 'x T'
+ command = next_command();
+ if ((int) command == EOF)
+ return;
+ if ((int) command != 'x')
+ fatal("the first command must be 'x T'");
+ str_arg = get_string_arg();
+ if (str_arg[0] != 'T')
+ fatal("the first command must be 'x T'");
+ delete[] str_arg;
+ char *tmp_dev = get_string_arg();
+ if (pr == 0) { // note: 'pr' initialized after prologue
+ device = tmp_dev;
+ if (0 /* nullptr */ == font::load_desc())
+ fatal("cannot load description of '%1' device", tmp_dev);
+ }
+ else {
+ if (device == 0 || strcmp(device, tmp_dev) != 0)
+ fatal("all files must use the same device");
+ delete[] tmp_dev;
+ }
+ skip_line_x(); // ignore further arguments
+ current_env->size = 10 * font::sizescale;
+
+ // 2nd command 'x res'
+ command = next_command();
+ if ((int) command != 'x')
+ fatal("the second command must be 'x res'");
+ str_arg = get_string_arg();
+ if (str_arg[0] != 'r')
+ fatal("the second command must be 'x res'");
+ delete[] str_arg;
+ int_arg = get_integer_arg();
+ EnvInt font_res = font::res;
+ if (int_arg != font_res)
+ fatal("resolution does not match");
+ int_arg = get_integer_arg();
+ if (int_arg != font::hor)
+ fatal("minimum horizontal motion does not match");
+ int_arg = get_integer_arg();
+ if (int_arg != font::vert)
+ fatal("minimum vertical motion does not match");
+ skip_line_x(); // ignore further arguments
+
+ // 3rd command 'x init'
+ command = next_command();
+ if (command != 'x')
+ fatal("the third command must be 'x init'");
+ str_arg = get_string_arg();
+ if (str_arg[0] != 'i')
+ fatal("the third command must be 'x init'");
+ delete[] str_arg;
+ skip_line_x();
+ }
+
+ // parsing of body
+ if (pr == 0)
+ pr = make_printer();
+ while (!stopped) {
+ command = next_command();
+ if (command == EOF)
+ break;
+ // spaces, tabs, comments, and newlines are skipped here
+ switch ((int) command) {
+ case '#': // #: comment, ignore up to end of line
+ skip_line();
+ break;
+#ifdef USE_ENV_STACK
+ case '{': // {: start a new environment (a copy)
+ env_stack.push(current_env);
+ break;
+ case '}': // }: pop previous env from stack
+ delete_current_env();
+ current_env = env_stack.pop();
+ break;
+#endif // USE_ENV_STACK
+ case '0': // ddc: obsolete jump and print command
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ { // expect 2 digits and a character
+ char s[3];
+ Char c = next_arg_begin();
+ if (npages <= 0)
+ fatal_command(command);
+ if (!isdigit((int) c)) {
+ error("digit expected");
+ c = 0;
+ }
+ s[0] = (char) command;
+ s[1] = (char) c;
+ s[2] = '\0';
+ errno = 0;
+ long int x = strtol(s, 0, 10);
+ if (errno != 0)
+ error("couldn't convert 2 digits");
+ EnvInt hor_pos = (EnvInt) x;
+ current_env->hpos += hor_pos;
+ c = next_arg_begin();
+ if ((int) c == '\n' || (int) c == EOF)
+ error("character argument expected");
+ else
+ pr->set_ascii_char((unsigned char) c, current_env);
+ break;
+ }
+ case 'c': // c: print ascii char without moving
+ {
+ if (npages <= 0)
+ fatal_command(command);
+ Char c = next_arg_begin();
+ if (c == '\n' || c == EOF)
+ error("missing argument to 'c' command");
+ else
+ pr->set_ascii_char((unsigned char) c, current_env);
+ break;
+ }
+ case 'C': // C: print named special character
+ {
+ if (npages <= 0)
+ fatal_command(command);
+ char *str_arg = get_string_arg();
+ pr->set_special_char(str_arg, current_env);
+ delete[] str_arg;
+ break;
+ }
+ case 'D': // drawing commands
+ if (npages <= 0)
+ fatal_command(command);
+ parse_D_command();
+ break;
+ case 'f': // f: set font to number
+ current_env->fontno = get_integer_arg();
+ break;
+ case 'F': // F: obsolete, replaced by 'x F'
+ {
+ char *str_arg = get_extended_arg();
+ remember_source_filename(str_arg);
+ delete[] str_arg;
+ break;
+ }
+ case 'h': // h: relative horizontal move
+ if (npages <= 0)
+ fatal_command(command);
+ current_env->hpos += (EnvInt) get_integer_arg();
+ break;
+ case 'H': // H: absolute horizontal positioning
+ if (npages <= 0)
+ fatal_command(command);
+ current_env->hpos = (EnvInt) get_integer_arg();
+ break;
+ case 'm': // m: glyph color
+ parse_color_command(current_env->col);
+ pr->change_color(current_env);
+ break;
+ case 'n': // n: print end of line
+ // ignore two arguments (historically)
+ if (npages <= 0)
+ fatal_command(command);
+ pr->end_of_line();
+ (void) get_integer_arg();
+ (void) get_integer_arg();
+ break;
+ case 'N': // N: print char with given int code
+ if (npages <= 0)
+ fatal_command(command);
+ pr->set_numbered_char(get_integer_arg(), current_env);
+ break;
+ case 'p': // p: start new page with given number
+ if (npages > 0)
+ pr->end_page(current_env->vpos);
+ npages++; // increment # of processed pages
+ pr->begin_page(get_integer_arg());
+ current_env->vpos = 0;
+ break;
+ case 's': // s: set point size
+ current_env->size = get_integer_arg();
+ if (current_env->height == current_env->size)
+ current_env->height = 0;
+ break;
+ case 't': // t: print a text word
+ {
+ char c;
+ if (npages <= 0)
+ fatal_command(command);
+ char *str_arg = get_string_arg();
+ size_t i = 0;
+ while ((c = str_arg[i++]) != '\0') {
+ EnvInt w;
+ pr->set_ascii_char((unsigned char) c, current_env, &w);
+ current_env->hpos += w;
+ }
+ delete[] str_arg;
+ break;
+ }
+ case 'u': // u: print spaced word
+ {
+ char c;
+ if (npages <= 0)
+ fatal_command(command);
+ EnvInt kern = (EnvInt) get_integer_arg();
+ char *str_arg = get_string_arg();
+ size_t i = 0;
+ while ((c = str_arg[i++]) != '\0') {
+ EnvInt w;
+ pr->set_ascii_char((unsigned char) c, current_env, &w);
+ current_env->hpos += w + kern;
+ }
+ delete[] str_arg;
+ break;
+ }
+ case 'v': // v: relative vertical move
+ if (npages <= 0)
+ fatal_command(command);
+ current_env->vpos += (EnvInt) get_integer_arg();
+ break;
+ case 'V': // V: absolute vertical positioning
+ if (npages <= 0)
+ fatal_command(command);
+ current_env->vpos = (EnvInt) get_integer_arg();
+ break;
+ case 'w': // w: inform about paddable space
+ break;
+ case 'x': // device controlling commands
+ stopped = parse_x_command();
+ break;
+ default:
+ warning("unrecognized command '%1'", (unsigned char) command);
+ skip_line();
+ break;
+ } // end of switch
+ } // end of while
+
+ // end of file reached
+ if (npages > 0)
+ pr->end_page(current_env->vpos);
+ delete pr;
+ pr = 0;
+ fclose(current_file);
+ // If 'stopped' is not 'true' here then there wasn't any 'x stop'.
+ if (!stopped)
+ warning("no final 'x stop' command");
+ delete_current_env();
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/libs/libdriver/libdriver.am b/src/libs/libdriver/libdriver.am
new file mode 100644
index 0000000..51475d8
--- /dev/null
+++ b/src/libs/libdriver/libdriver.am
@@ -0,0 +1,31 @@
+# Automake rules for 'libdriver'
+#
+# Copyright (C) 2014-2020 Free Software Foundation, Inc.
+#
+# '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 of the License, 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 this program. If not, see
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+#
+########################################################################
+
+noinst_LIBRARIES += libdriver.a
+libdriver_a_SOURCES = \
+ src/libs/libdriver/input.cpp \
+ src/libs/libdriver/printer.cpp
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/libs/libdriver/printer.cpp b/src/libs/libdriver/printer.cpp
new file mode 100644
index 0000000..f89b2e9
--- /dev/null
+++ b/src/libs/libdriver/printer.cpp
@@ -0,0 +1,268 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <assert.h>
+
+#include "driver.h"
+
+/* If we are sending output to an onscreen pager (as is the normal case
+ when reading man pages), then we may get an error state on the output
+ stream, if the user does not read all the way to the end.
+
+ We normally expect to catch this, and clean up the error context,
+ when the pager exits, because we should get, and handle, a SIGPIPE.
+
+ However ...
+*/
+
+#if (defined(_MSC_VER) || defined(_WIN32)) \
+ && !defined(__CYGWIN__) && !defined(_UWIN)
+
+ /* Native MS-Windows doesn't know about SIGPIPE, so we cannot detect
+ the early exit from the pager, and therefore, cannot clean up the
+ error context; thus we use the following static function to
+ identify this particular error context, and so suppress unwanted
+ diagnostics.
+ */
+
+ static int
+ check_for_output_error (FILE* stream)
+ {
+ /* First, clean up any prior error context on the output stream */
+ if (ferror (stream))
+ clearerr (stream);
+ /* Clear errno, in case clearerr() and fflush() don't */
+ errno = 0;
+ /* Flush the output stream, so we can capture any error context,
+ other than the specific case we wish to suppress.
+
+ Microsoft doesn't document it, but the error code for the
+ specific context we are trying to suppress seems to be EINVAL --
+ a strange choice, since it is not normally associated with
+ fflush(); of course, it *should* be EPIPE, but this *definitely*
+ is not used, and *is* so documented.
+ */
+ return ((fflush(stream) < 0) && (errno != EINVAL));
+ }
+
+#else
+
+ /* For other systems, we simply assume that *any* output error context
+ is to be reported.
+ */
+# define check_for_output_error(stream) ferror(stream) || fflush(stream) < 0
+
+#endif
+
+
+font_pointer_list::font_pointer_list(font *f, font_pointer_list *fp)
+: p(f), next(fp)
+{
+}
+
+printer::printer()
+: font_list(0), font_table(0), nfonts(0)
+{
+}
+
+printer::~printer()
+{
+ delete[] font_table;
+ while (font_list) {
+ font_pointer_list *tem = font_list;
+ font_list = font_list->next;
+ delete tem->p;
+ delete tem;
+ }
+ if (check_for_output_error(stdout))
+ fatal("output error");
+}
+
+void printer::load_font(int n, const char *nm)
+{
+ assert(n >= 0);
+ if (n >= nfonts) {
+ if (nfonts == 0) {
+ nfonts = 10;
+ if (nfonts <= n)
+ nfonts = n + 1;
+ font_table = new font *[nfonts];
+ for (int i = 0; i < nfonts; i++)
+ font_table[i] = 0;
+ }
+ else {
+ font **old_font_table = font_table;
+ int old_nfonts = nfonts;
+ nfonts *= 2;
+ if (n >= nfonts)
+ nfonts = n + 1;
+ font_table = new font *[nfonts];
+ int i;
+ for (i = 0; i < old_nfonts; i++)
+ font_table[i] = old_font_table[i];
+ for (i = old_nfonts; i < nfonts; i++)
+ font_table[i] = 0;
+ delete[] old_font_table;
+ }
+ }
+ font *f = find_font(nm);
+ font_table[n] = f;
+}
+
+font *printer::find_font(const char *nm)
+{
+ for (font_pointer_list *p = font_list; p; p = p->next)
+ if (strcmp(p->p->get_name(), nm) == 0)
+ return p->p;
+ font *f = make_font(nm);
+ if (0 /* nullptr */ == f)
+ fatal("cannot find font '%1'", nm);
+ font_list = new font_pointer_list(f, font_list);
+ return f;
+}
+
+font *printer::make_font(const char *nm)
+{
+ return font::load_font(nm);
+}
+
+void printer::end_of_line()
+{
+}
+
+void printer::special(char *, const environment *, char)
+{
+}
+
+void printer::devtag(char *, const environment *, char)
+{
+}
+
+void printer::draw(int, int *, int, const environment *)
+{
+}
+
+void printer::change_color(const environment * const)
+{
+}
+
+void printer::change_fill_color(const environment * const)
+{
+}
+
+void printer::set_ascii_char(unsigned char c, const environment *env,
+ int *widthp)
+{
+ char buf[2];
+ int w;
+ font *f;
+
+ buf[0] = c;
+ buf[1] = '\0';
+
+ glyph *g = set_char_and_width(buf, env, &w, &f);
+
+ if (g != UNDEFINED_GLYPH) {
+ set_char(g, f, env, w, 0);
+ if (widthp)
+ *widthp = w;
+ }
+}
+
+void printer::set_special_char(const char *nm, const environment *env,
+ int *widthp)
+{
+ font *f;
+ int w;
+ glyph *g = set_char_and_width(nm, env, &w, &f);
+ if (g != UNDEFINED_GLYPH) {
+ set_char(g, f, env, w, nm);
+ if (widthp)
+ *widthp = w;
+ }
+}
+
+glyph *printer::set_char_and_width(const char *nm,
+ const environment *env, int *widthp,
+ font **f)
+{
+ glyph *g = name_to_glyph(nm);
+ int fn = env->fontno;
+ if (fn < 0 || fn >= nfonts) {
+ error("invalid font position '%1'", fn);
+ return UNDEFINED_GLYPH;
+ }
+ *f = font_table[fn];
+ if (*f == 0) {
+ error("no font mounted at position %1", fn);
+ return UNDEFINED_GLYPH;
+ }
+ if (!(*f)->contains(g)) {
+ if (nm[0] != '\0' && nm[1] == '\0')
+ error("font '%1' does not contain ordinary character '%2'",
+ (*f)->get_name(), nm[0]);
+ else
+ error("font '%1' does not contain special character '%2'",
+ (*f)->get_name(), nm);
+ return UNDEFINED_GLYPH;
+ }
+ int w = (*f)->get_width(g, env->size);
+ if (widthp)
+ *widthp = w;
+ return g;
+}
+
+void printer::set_numbered_char(int num, const environment *env, int
+ *widthp)
+{
+ glyph *g = number_to_glyph(num);
+ int fn = env->fontno;
+ if (fn < 0 || fn >= nfonts) {
+ error("invalid font position '%1'", fn);
+ return;
+ }
+ font *f = font_table[fn];
+ if (f == 0) {
+ error("no font mounted at position %1", fn);
+ return;
+ }
+ if (!f->contains(g)) {
+ error("font '%1' does not contain numbered character %2",
+ f->get_name(), num);
+ return;
+ }
+ int w = f->get_width(g, env->size);
+ if (widthp)
+ *widthp = w;
+ set_char(g, f, env, w, 0);
+}
+
+font *printer::get_font_from_index(int fontno)
+{
+ if ((fontno >= 0) && (fontno < nfonts))
+ return font_table[fontno];
+ else
+ return 0;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/libs/libgroff/assert.cpp b/src/libs/libgroff/assert.cpp
new file mode 100644
index 0000000..9da3d46
--- /dev/null
+++ b/src/libs/libgroff/assert.cpp
@@ -0,0 +1,38 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+extern "C" const char *program_name;
+
+void assertion_failed(int lineno, const char *filename,
+ const char *function, const char *msg)
+{
+ if (program_name != 0)
+ fprintf(stderr, "%s: ", program_name);
+ fprintf(stderr, "%s:%d: %s(): assertion failed: '%s'\n", filename,
+ lineno, function, msg);
+ fflush(stderr);
+ abort();
+}
diff --git a/src/libs/libgroff/change_lf.cpp b/src/libs/libgroff/change_lf.cpp
new file mode 100644
index 0000000..eb98766
--- /dev/null
+++ b/src/libs/libgroff/change_lf.cpp
@@ -0,0 +1,37 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include <string.h>
+
+extern char *strsave(const char *);
+
+extern const char *current_filename;
+extern int current_lineno;
+
+void change_filename(const char *f)
+{
+ if (current_filename != 0 && strcmp(current_filename, f) == 0)
+ return;
+ current_filename = strsave(f);
+}
+
+void change_lineno(int ln)
+{
+ current_lineno = ln;
+}
diff --git a/src/libs/libgroff/cmap.cpp b/src/libs/libgroff/cmap.cpp
new file mode 100644
index 0000000..3f2c0c3
--- /dev/null
+++ b/src/libs/libgroff/cmap.cpp
@@ -0,0 +1,56 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include <ctype.h>
+#include "cmap.h"
+
+cmap cmlower(CMAP_BUILTIN);
+cmap cmupper(CMAP_BUILTIN);
+
+#ifdef isascii
+#define ISASCII(c) isascii(c)
+#else
+#define ISASCII(c) (1)
+#endif
+
+cmap::cmap()
+{
+ unsigned char *p = v;
+ for (int i = 0; i <= UCHAR_MAX; i++)
+ p[i] = i;
+}
+
+cmap::cmap(cmap_builtin)
+{
+ // these are initialised by cmap_init::cmap_init()
+}
+
+int cmap_init::initialised = 0;
+
+cmap_init::cmap_init()
+{
+ if (initialised)
+ return;
+ initialised = 1;
+ for (int i = 0; i <= UCHAR_MAX; i++) {
+ cmupper.v[i] = ISASCII(i) && islower(i) ? toupper(i) : i;
+ cmlower.v[i] = ISASCII(i) && isupper(i) ? tolower(i) : i;
+ }
+}
diff --git a/src/libs/libgroff/color.cpp b/src/libs/libgroff/color.cpp
new file mode 100644
index 0000000..388c2ee
--- /dev/null
+++ b/src/libs/libgroff/color.cpp
@@ -0,0 +1,404 @@
+/* Copyright (C) 2001-2020 Free Software Foundation, Inc.
+ Written by Gaius Mulley <gaius@glam.ac.uk>
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+#include "color.h"
+#include "cset.h"
+
+#include <assert.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "errarg.h"
+#include "error.h"
+
+static inline unsigned int
+min(const unsigned int a, const unsigned int b)
+{
+ if (a < b)
+ return a;
+ else
+ return b;
+}
+
+
+color::color(const color * const c)
+{
+ nm = c->nm;
+ scheme = c->scheme;
+ components[0] = c->components[0];
+ components[1] = c->components[1];
+ components[2] = c->components[2];
+ components[3] = c->components[3];
+}
+
+color::~color()
+{
+}
+
+int color::operator==(const color & c) const
+{
+ if (scheme != c.scheme)
+ return 0;
+ switch (scheme) {
+ case DEFAULT:
+ break;
+ case RGB:
+ if (Red != c.Red || Green != c.Green || Blue != c.Blue)
+ return 0;
+ break;
+ case CMYK:
+ if (Cyan != c.Cyan || Magenta != c.Magenta
+ || Yellow != c.Yellow || Black != c.Black)
+ return 0;
+ break;
+ case GRAY:
+ if (Gray != c.Gray)
+ return 0;
+ break;
+ case CMY:
+ if (Cyan != c.Cyan || Magenta != c.Magenta || Yellow != c.Yellow)
+ return 0;
+ break;
+ }
+ return 1;
+}
+
+int color::operator!=(const color & c) const
+{
+ return !(*this == c);
+}
+
+color_scheme color::get_components(unsigned int *c) const
+{
+#if 0
+ if (sizeof (c) < sizeof (unsigned int) * 4)
+ fatal("argument is not big enough to store 4 color components");
+#endif
+ c[0] = components[0];
+ c[1] = components[1];
+ c[2] = components[2];
+ c[3] = components[3];
+ return scheme;
+}
+
+void color::set_default()
+{
+ scheme = DEFAULT;
+}
+
+// (0, 0, 0) is black
+
+void color::set_rgb(const unsigned int r, const unsigned int g,
+ const unsigned int b)
+{
+ scheme = RGB;
+ Red = min(MAX_COLOR_VAL, r);
+ Green = min(MAX_COLOR_VAL, g);
+ Blue = min(MAX_COLOR_VAL, b);
+}
+
+// (0, 0, 0) is white
+
+void color::set_cmy(const unsigned int c, const unsigned int m,
+ const unsigned int y)
+{
+ scheme = CMY;
+ Cyan = min(MAX_COLOR_VAL, c);
+ Magenta = min(MAX_COLOR_VAL, m);
+ Yellow = min(MAX_COLOR_VAL, y);
+}
+
+// (0, 0, 0, 0) is white
+
+void color::set_cmyk(const unsigned int c, const unsigned int m,
+ const unsigned int y, const unsigned int k)
+{
+ scheme = CMYK;
+ Cyan = min(MAX_COLOR_VAL, c);
+ Magenta = min(MAX_COLOR_VAL, m);
+ Yellow = min(MAX_COLOR_VAL, y);
+ Black = min(MAX_COLOR_VAL, k);
+}
+
+// (0) is black
+
+void color::set_gray(const unsigned int g)
+{
+ scheme = GRAY;
+ Gray = min(MAX_COLOR_VAL, g);
+}
+
+/*
+ * atoh - computes the decimal value of a hexadecimal number string.
+ * 'length' characters of 's' are read. Returns 1 if successful.
+ */
+
+static int atoh(unsigned int *result,
+ const char * const s, const size_t length)
+{
+ size_t i = 0;
+ unsigned int val = 0;
+ while ((i < length) && csxdigit(s[i])) {
+ if (csdigit(s[i]))
+ val = val*0x10 + (s[i]-'0');
+ else if (csupper(s[i]))
+ val = val*0x10 + (s[i]-'A') + 10;
+ else
+ val = val*0x10 + (s[i]-'a') + 10;
+ i++;
+ }
+ if (i != length)
+ return 0;
+ *result = val;
+ return 1;
+}
+
+/*
+ * read_encoding - set color from a hexadecimal color string.
+ *
+ * Use color scheme 'cs' to parse 'n' color components from string 's'.
+ * Returns 1 if successful.
+ */
+
+int color::read_encoding(const color_scheme cs, const char * const s,
+ const size_t n)
+{
+ size_t hex_length = 2;
+ scheme = cs;
+ char *p = (char *) s;
+ p++;
+ if (*p == '#') {
+ hex_length = 4;
+ p++;
+ }
+ for (size_t i = 0; i < n; i++) {
+ if (!atoh(&(components[i]), p, hex_length))
+ return 0;
+ if (hex_length == 2)
+ components[i] *= 0x101; // scale up -- 0xff should become 0xffff
+ p += hex_length;
+ }
+ return 1;
+}
+
+int color::read_rgb(const char * const s)
+{
+ return read_encoding(RGB, s, 3);
+}
+
+int color::read_cmy(const char * const s)
+{
+ return read_encoding(CMY, s, 3);
+}
+
+int color::read_cmyk(const char * const s)
+{
+ return read_encoding(CMYK, s, 4);
+}
+
+int color::read_gray(const char * const s)
+{
+ return read_encoding(GRAY, s, 1);
+}
+
+void
+color::get_rgb(unsigned int *r, unsigned int *g, unsigned int *b) const
+{
+ switch (scheme) {
+ case RGB:
+ *r = Red;
+ *g = Green;
+ *b = Blue;
+ break;
+ case CMY:
+ *r = MAX_COLOR_VAL - Cyan;
+ *g = MAX_COLOR_VAL - Magenta;
+ *b = MAX_COLOR_VAL - Yellow;
+ break;
+ case CMYK:
+ *r = MAX_COLOR_VAL
+ - min(MAX_COLOR_VAL,
+ Cyan * (MAX_COLOR_VAL - Black) / MAX_COLOR_VAL + Black);
+ *g = MAX_COLOR_VAL
+ - min(MAX_COLOR_VAL,
+ Magenta * (MAX_COLOR_VAL - Black) / MAX_COLOR_VAL + Black);
+ *b = MAX_COLOR_VAL
+ - min(MAX_COLOR_VAL,
+ Yellow * (MAX_COLOR_VAL - Black) / MAX_COLOR_VAL + Black);
+ break;
+ case GRAY:
+ *r = *g = *b = Gray;
+ break;
+ default:
+ assert(0);
+ break;
+ }
+}
+
+void
+color::get_cmy(unsigned int *c, unsigned int *m, unsigned int *y) const
+{
+ switch (scheme) {
+ case RGB:
+ *c = MAX_COLOR_VAL - Red;
+ *m = MAX_COLOR_VAL - Green;
+ *y = MAX_COLOR_VAL - Blue;
+ break;
+ case CMY:
+ *c = Cyan;
+ *m = Magenta;
+ *y = Yellow;
+ break;
+ case CMYK:
+ *c = min(MAX_COLOR_VAL,
+ Cyan * (MAX_COLOR_VAL - Black) / MAX_COLOR_VAL + Black);
+ *m = min(MAX_COLOR_VAL,
+ Magenta * (MAX_COLOR_VAL - Black) / MAX_COLOR_VAL + Black);
+ *y = min(MAX_COLOR_VAL,
+ Yellow * (MAX_COLOR_VAL - Black) / MAX_COLOR_VAL + Black);
+ break;
+ case GRAY:
+ *c = *m = *y = MAX_COLOR_VAL - Gray;
+ break;
+ default:
+ assert(0);
+ break;
+ }
+}
+
+void color::get_cmyk(unsigned int *c, unsigned int *m,
+ unsigned int *y, unsigned int *k) const
+{
+ switch (scheme) {
+ case RGB:
+ *k = min(MAX_COLOR_VAL - Red,
+ min(MAX_COLOR_VAL - Green, MAX_COLOR_VAL - Blue));
+ if (MAX_COLOR_VAL == *k) {
+ *c = MAX_COLOR_VAL;
+ *m = MAX_COLOR_VAL;
+ *y = MAX_COLOR_VAL;
+ }
+ else {
+ *c = (MAX_COLOR_VAL * (MAX_COLOR_VAL - Red - *k))
+ / (MAX_COLOR_VAL - *k);
+ *m = (MAX_COLOR_VAL * (MAX_COLOR_VAL - Green - *k))
+ / (MAX_COLOR_VAL - *k);
+ *y = (MAX_COLOR_VAL * (MAX_COLOR_VAL - Blue - *k))
+ / (MAX_COLOR_VAL - *k);
+ }
+ break;
+ case CMY:
+ *k = min(Cyan, min(Magenta, Yellow));
+ if (MAX_COLOR_VAL == *k) {
+ *c = MAX_COLOR_VAL;
+ *m = MAX_COLOR_VAL;
+ *y = MAX_COLOR_VAL;
+ }
+ else {
+ *c = (MAX_COLOR_VAL * (Cyan - *k)) / (MAX_COLOR_VAL - *k);
+ *m = (MAX_COLOR_VAL * (Magenta - *k)) / (MAX_COLOR_VAL - *k);
+ *y = (MAX_COLOR_VAL * (Yellow - *k)) / (MAX_COLOR_VAL - *k);
+ }
+ break;
+ case CMYK:
+ *c = Cyan;
+ *m = Magenta;
+ *y = Yellow;
+ *k = Black;
+ break;
+ case GRAY:
+ *c = *m = *y = 0;
+ *k = MAX_COLOR_VAL - Gray;
+ break;
+ default:
+ assert(0);
+ break;
+ }
+}
+
+// we use '0.222r + 0.707g + 0.071b' (this is the ITU standard)
+// as an approximation for gray
+
+void color::get_gray(unsigned int *g) const
+{
+ switch (scheme) {
+ case RGB:
+ *g = (222*Red + 707*Green + 71*Blue) / 1000;
+ break;
+ case CMY:
+ *g = MAX_COLOR_VAL - (222*Cyan + 707*Magenta + 71*Yellow) / 1000;
+ break;
+ case CMYK:
+ *g = (MAX_COLOR_VAL - (222*Cyan + 707*Magenta + 71*Yellow) / 1000)
+ * (MAX_COLOR_VAL - Black);
+ break;
+ case GRAY:
+ *g = Gray;
+ break;
+ default:
+ assert(0);
+ break;
+ }
+}
+
+char *color::print_color()
+{
+ char *s = new char[30];
+ switch (scheme) {
+ case DEFAULT:
+ sprintf(s, "default");
+ break;
+ case RGB:
+ sprintf(s, "rgb %.2ff %.2ff %.2ff",
+ double(Red) / double(MAX_COLOR_VAL),
+ double(Green) / double(MAX_COLOR_VAL),
+ double(Blue) / double(MAX_COLOR_VAL));
+ break;
+ case CMY:
+ sprintf(s, "cmy %.2ff %.2ff %.2ff",
+ double(Cyan) / double(MAX_COLOR_VAL),
+ double(Magenta) / double(MAX_COLOR_VAL),
+ double(Yellow) / double(MAX_COLOR_VAL));
+ break;
+ case CMYK:
+ sprintf(s, "cmyk %.2ff %.2ff %.2ff %.2ff",
+ double(Cyan) / double(MAX_COLOR_VAL),
+ double(Magenta) / double(MAX_COLOR_VAL),
+ double(Yellow) / double(MAX_COLOR_VAL),
+ double(Black) / double(MAX_COLOR_VAL));
+ break;
+ case GRAY:
+ sprintf(s, "gray %.2ff",
+ double(Gray) / double(MAX_COLOR_VAL));
+ break;
+ }
+ return s;
+}
+
+color default_color;
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/libs/libgroff/config.charset b/src/libs/libgroff/config.charset
new file mode 100755
index 0000000..8fca485
--- /dev/null
+++ b/src/libs/libgroff/config.charset
@@ -0,0 +1,684 @@
+#! /bin/sh
+# Output a system dependent table of character encoding aliases.
+#
+# Copyright (C) 2000-2020 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# The table consists of lines of the form
+# ALIAS CANONICAL
+#
+# ALIAS is the (system dependent) result of "nl_langinfo (CODESET)".
+# ALIAS is compared in a case sensitive way.
+#
+# CANONICAL is the GNU canonical name for this character encoding.
+# It must be an encoding supported by libiconv. Support by GNU libc is
+# also desirable. CANONICAL is case insensitive. Usually an upper case
+# MIME charset name is preferred.
+# The current list of GNU canonical charset names is as follows.
+#
+# name MIME? used by which systems
+# (darwin = Mac OS X, woe32 = native Windows)
+#
+# ASCII, ANSI_X3.4-1968 glibc solaris freebsd netbsd darwin cygwin
+# ISO-8859-1 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin
+# ISO-8859-2 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin
+# ISO-8859-3 Y glibc solaris cygwin
+# ISO-8859-4 Y osf solaris freebsd netbsd openbsd darwin
+# ISO-8859-5 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin
+# ISO-8859-6 Y glibc aix hpux solaris cygwin
+# ISO-8859-7 Y glibc aix hpux irix osf solaris netbsd openbsd darwin cygwin
+# ISO-8859-8 Y glibc aix hpux osf solaris cygwin
+# ISO-8859-9 Y glibc aix hpux irix osf solaris darwin cygwin
+# ISO-8859-13 glibc netbsd openbsd darwin cygwin
+# ISO-8859-14 glibc cygwin
+# ISO-8859-15 glibc aix osf solaris freebsd netbsd openbsd darwin cygwin
+# KOI8-R Y glibc solaris freebsd netbsd openbsd darwin
+# KOI8-U Y glibc freebsd netbsd openbsd darwin cygwin
+# KOI8-T glibc
+# CP437 dos
+# CP775 dos
+# CP850 aix osf dos
+# CP852 dos
+# CP855 dos
+# CP856 aix
+# CP857 dos
+# CP861 dos
+# CP862 dos
+# CP864 dos
+# CP865 dos
+# CP866 freebsd netbsd openbsd darwin dos
+# CP869 dos
+# CP874 woe32 dos
+# CP922 aix
+# CP932 aix cygwin woe32 dos
+# CP943 aix
+# CP949 osf darwin woe32 dos
+# CP950 woe32 dos
+# CP1046 aix
+# CP1124 aix
+# CP1125 dos
+# CP1129 aix
+# CP1131 darwin
+# CP1250 woe32
+# CP1251 glibc solaris netbsd openbsd darwin cygwin woe32
+# CP1252 aix woe32
+# CP1253 woe32
+# CP1254 woe32
+# CP1255 glibc woe32
+# CP1256 woe32
+# CP1257 woe32
+# GB2312 Y glibc aix hpux irix solaris freebsd netbsd darwin
+# EUC-JP Y glibc aix hpux irix osf solaris freebsd netbsd darwin
+# EUC-KR Y glibc aix hpux irix osf solaris freebsd netbsd darwin cygwin
+# EUC-TW glibc aix hpux irix osf solaris netbsd
+# BIG5 Y glibc aix hpux osf solaris freebsd netbsd darwin cygwin
+# BIG5-HKSCS glibc solaris darwin
+# GBK glibc aix osf solaris darwin cygwin woe32 dos
+# GB18030 glibc solaris netbsd darwin
+# SHIFT_JIS Y hpux osf solaris freebsd netbsd darwin
+# JOHAB glibc solaris woe32
+# TIS-620 glibc aix hpux osf solaris cygwin
+# VISCII Y glibc
+# TCVN5712-1 glibc
+# ARMSCII-8 glibc darwin
+# GEORGIAN-PS glibc cygwin
+# PT154 glibc
+# HP-ROMAN8 hpux
+# HP-ARABIC8 hpux
+# HP-GREEK8 hpux
+# HP-HEBREW8 hpux
+# HP-TURKISH8 hpux
+# HP-KANA8 hpux
+# DEC-KANJI osf
+# DEC-HANYU osf
+# UTF-8 Y glibc aix hpux osf solaris netbsd darwin cygwin
+#
+# Note: Names which are not marked as being a MIME name should not be used in
+# Internet protocols for information interchange (mail, news, etc.).
+#
+# Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications
+# must understand both names and treat them as equivalent.
+#
+# The first argument passed to this file is the canonical host specification,
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+
+host="$1"
+os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'`
+echo "# This file contains a table of character encoding aliases,"
+echo "# suitable for operating system '${os}'."
+echo "# It was automatically generated from config.charset."
+# List of references, updated during installation:
+echo "# Packages using this file: "
+case "$os" in
+ linux-gnulibc1*)
+ # Linux libc5 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ echo "C ASCII"
+ echo "POSIX ASCII"
+ for l in af af_ZA ca ca_ES da da_DK de de_AT de_BE de_CH de_DE de_LU \
+ en en_AU en_BW en_CA en_DK en_GB en_IE en_NZ en_US en_ZA \
+ en_ZW es es_AR es_BO es_CL es_CO es_DO es_EC es_ES es_GT \
+ es_HN es_MX es_PA es_PE es_PY es_SV es_US es_UY es_VE et \
+ et_EE eu eu_ES fi fi_FI fo fo_FO fr fr_BE fr_CA fr_CH fr_FR \
+ fr_LU ga ga_IE gl gl_ES id id_ID in in_ID is is_IS it it_CH \
+ it_IT kl kl_GL nl nl_BE nl_NL no no_NO pt pt_BR pt_PT sv \
+ sv_FI sv_SE; do
+ echo "$l ISO-8859-1"
+ echo "$l.iso-8859-1 ISO-8859-1"
+ echo "$l.iso-8859-15 ISO-8859-15"
+ echo "$l.iso-8859-15@euro ISO-8859-15"
+ echo "$l@euro ISO-8859-15"
+ echo "$l.cp-437 CP437"
+ echo "$l.cp-850 CP850"
+ echo "$l.cp-1252 CP1252"
+ echo "$l.cp-1252@euro CP1252"
+ #echo "$l.atari-st ATARI-ST" # not a commonly used encoding
+ echo "$l.utf-8 UTF-8"
+ echo "$l.utf-8@euro UTF-8"
+ done
+ for l in cs cs_CZ hr hr_HR hu hu_HU pl pl_PL ro ro_RO sk sk_SK sl \
+ sl_SI sr sr_CS sr_YU; do
+ echo "$l ISO-8859-2"
+ echo "$l.iso-8859-2 ISO-8859-2"
+ echo "$l.cp-852 CP852"
+ echo "$l.cp-1250 CP1250"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in mk mk_MK ru ru_RU; do
+ echo "$l ISO-8859-5"
+ echo "$l.iso-8859-5 ISO-8859-5"
+ echo "$l.koi8-r KOI8-R"
+ echo "$l.cp-866 CP866"
+ echo "$l.cp-1251 CP1251"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in ar ar_SA; do
+ echo "$l ISO-8859-6"
+ echo "$l.iso-8859-6 ISO-8859-6"
+ echo "$l.cp-864 CP864"
+ #echo "$l.cp-868 CP868" # not a commonly used encoding
+ echo "$l.cp-1256 CP1256"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in el el_GR gr gr_GR; do
+ echo "$l ISO-8859-7"
+ echo "$l.iso-8859-7 ISO-8859-7"
+ echo "$l.cp-869 CP869"
+ echo "$l.cp-1253 CP1253"
+ echo "$l.cp-1253@euro CP1253"
+ echo "$l.utf-8 UTF-8"
+ echo "$l.utf-8@euro UTF-8"
+ done
+ for l in he he_IL iw iw_IL; do
+ echo "$l ISO-8859-8"
+ echo "$l.iso-8859-8 ISO-8859-8"
+ echo "$l.cp-862 CP862"
+ echo "$l.cp-1255 CP1255"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in tr tr_TR; do
+ echo "$l ISO-8859-9"
+ echo "$l.iso-8859-9 ISO-8859-9"
+ echo "$l.cp-857 CP857"
+ echo "$l.cp-1254 CP1254"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in lt lt_LT lv lv_LV; do
+ #echo "$l BALTIC" # not a commonly used encoding, wrong encoding name
+ echo "$l ISO-8859-13"
+ done
+ for l in ru_UA uk uk_UA; do
+ echo "$l KOI8-U"
+ done
+ for l in zh zh_CN; do
+ #echo "$l GB_2312-80" # not a commonly used encoding, wrong encoding name
+ echo "$l GB2312"
+ done
+ for l in ja ja_JP ja_JP.EUC; do
+ echo "$l EUC-JP"
+ done
+ for l in ko ko_KR; do
+ echo "$l EUC-KR"
+ done
+ for l in th th_TH; do
+ echo "$l TIS-620"
+ done
+ for l in fa fa_IR; do
+ #echo "$l ISIRI-3342" # a broken encoding
+ echo "$l.utf-8 UTF-8"
+ done
+ ;;
+ linux* | *-gnu*)
+ # With glibc-2.1 or newer, we don't need any canonicalization,
+ # because glibc has iconv and both glibc and libiconv support all
+ # GNU canonical names directly. Therefore, the Makefile does not
+ # need to install the alias file at all.
+ # The following applies only to glibc-2.0.x and older libcs.
+ echo "ISO_646.IRV:1983 ASCII"
+ ;;
+ aix*)
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-6 ISO-8859-6"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-8 ISO-8859-8"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "IBM-850 CP850"
+ echo "IBM-856 CP856"
+ echo "IBM-921 ISO-8859-13"
+ echo "IBM-922 CP922"
+ echo "IBM-932 CP932"
+ echo "IBM-943 CP943"
+ echo "IBM-1046 CP1046"
+ echo "IBM-1124 CP1124"
+ echo "IBM-1129 CP1129"
+ echo "IBM-1252 CP1252"
+ echo "IBM-eucCN GB2312"
+ echo "IBM-eucJP EUC-JP"
+ echo "IBM-eucKR EUC-KR"
+ echo "IBM-eucTW EUC-TW"
+ echo "big5 BIG5"
+ echo "GBK GBK"
+ echo "TIS-620 TIS-620"
+ echo "UTF-8 UTF-8"
+ ;;
+ hpux*)
+ echo "iso88591 ISO-8859-1"
+ echo "iso88592 ISO-8859-2"
+ echo "iso88595 ISO-8859-5"
+ echo "iso88596 ISO-8859-6"
+ echo "iso88597 ISO-8859-7"
+ echo "iso88598 ISO-8859-8"
+ echo "iso88599 ISO-8859-9"
+ echo "iso885915 ISO-8859-15"
+ echo "roman8 HP-ROMAN8"
+ echo "arabic8 HP-ARABIC8"
+ echo "greek8 HP-GREEK8"
+ echo "hebrew8 HP-HEBREW8"
+ echo "turkish8 HP-TURKISH8"
+ echo "kana8 HP-KANA8"
+ echo "tis620 TIS-620"
+ echo "big5 BIG5"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ echo "hp15CN GB2312"
+ #echo "ccdc ?" # what is this?
+ echo "SJIS SHIFT_JIS"
+ echo "utf8 UTF-8"
+ ;;
+ irix*)
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "eucCN GB2312"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ ;;
+ osf*)
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-8 ISO-8859-8"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "cp850 CP850"
+ echo "big5 BIG5"
+ echo "dechanyu DEC-HANYU"
+ echo "dechanzi GB2312"
+ echo "deckanji DEC-KANJI"
+ echo "deckorean EUC-KR"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ echo "GBK GBK"
+ echo "KSC5601 CP949"
+ echo "sdeckanji EUC-JP"
+ echo "SJIS SHIFT_JIS"
+ echo "TACTIS TIS-620"
+ echo "UTF-8 UTF-8"
+ ;;
+ solaris*)
+ echo "646 ASCII"
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-3 ISO-8859-3"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-6 ISO-8859-6"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-8 ISO-8859-8"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "koi8-r KOI8-R"
+ echo "ansi-1251 CP1251"
+ echo "BIG5 BIG5"
+ echo "Big5-HKSCS BIG5-HKSCS"
+ echo "gb2312 GB2312"
+ echo "GBK GBK"
+ echo "GB18030 GB18030"
+ echo "cns11643 EUC-TW"
+ echo "5601 EUC-KR"
+ echo "ko_KR.johap92 JOHAB"
+ echo "eucJP EUC-JP"
+ echo "PCK SHIFT_JIS"
+ echo "TIS620.2533 TIS-620"
+ #echo "sun_eu_greek ?" # what is this?
+ echo "UTF-8 UTF-8"
+ ;;
+ freebsd* | os2*)
+ # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just
+ # reuse FreeBSD's locale data for OS/2.
+ echo "C ASCII"
+ echo "US-ASCII ASCII"
+ for l in la_LN lt_LN; do
+ echo "$l.ASCII ASCII"
+ done
+ for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \
+ fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \
+ lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do
+ echo "$l.ISO_8859-1 ISO-8859-1"
+ echo "$l.DIS_8859-15 ISO-8859-15"
+ done
+ for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do
+ echo "$l.ISO_8859-2 ISO-8859-2"
+ done
+ for l in la_LN lt_LT; do
+ echo "$l.ISO_8859-4 ISO-8859-4"
+ done
+ for l in ru_RU ru_SU; do
+ echo "$l.KOI8-R KOI8-R"
+ echo "$l.ISO_8859-5 ISO-8859-5"
+ echo "$l.CP866 CP866"
+ done
+ echo "uk_UA.KOI8-U KOI8-U"
+ echo "zh_TW.BIG5 BIG5"
+ echo "zh_TW.Big5 BIG5"
+ echo "zh_CN.EUC GB2312"
+ echo "ja_JP.EUC EUC-JP"
+ echo "ja_JP.SJIS SHIFT_JIS"
+ echo "ja_JP.Shift_JIS SHIFT_JIS"
+ echo "ko_KR.EUC EUC-KR"
+ ;;
+ netbsd*)
+ echo "646 ASCII"
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-13 ISO-8859-13"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "eucCN GB2312"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ echo "BIG5 BIG5"
+ echo "SJIS SHIFT_JIS"
+ ;;
+ openbsd*)
+ echo "646 ASCII"
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-13 ISO-8859-13"
+ echo "ISO8859-15 ISO-8859-15"
+ ;;
+ darwin[56]*)
+ # Darwin 6.8 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ echo "C ASCII"
+ for l in en_AU en_CA en_GB en_US la_LN; do
+ echo "$l.US-ASCII ASCII"
+ done
+ for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \
+ fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT nl_BE \
+ nl_NL no_NO pt_PT sv_SE; do
+ echo "$l ISO-8859-1"
+ echo "$l.ISO8859-1 ISO-8859-1"
+ echo "$l.ISO8859-15 ISO-8859-15"
+ done
+ for l in la_LN; do
+ echo "$l.ISO8859-1 ISO-8859-1"
+ echo "$l.ISO8859-15 ISO-8859-15"
+ done
+ for l in cs_CZ hr_HR hu_HU la_LN pl_PL sl_SI; do
+ echo "$l.ISO8859-2 ISO-8859-2"
+ done
+ for l in la_LN lt_LT; do
+ echo "$l.ISO8859-4 ISO-8859-4"
+ done
+ for l in ru_RU; do
+ echo "$l.KOI8-R KOI8-R"
+ echo "$l.ISO8859-5 ISO-8859-5"
+ echo "$l.CP866 CP866"
+ done
+ for l in bg_BG; do
+ echo "$l.CP1251 CP1251"
+ done
+ echo "uk_UA.KOI8-U KOI8-U"
+ echo "zh_TW.BIG5 BIG5"
+ echo "zh_TW.Big5 BIG5"
+ echo "zh_CN.EUC GB2312"
+ echo "ja_JP.EUC EUC-JP"
+ echo "ja_JP.SJIS SHIFT_JIS"
+ echo "ko_KR.EUC EUC-KR"
+ ;;
+ darwin*)
+ # Darwin 7.5 has nl_langinfo(CODESET), but sometimes its value is
+ # useless:
+ # - It returns the empty string when LANG is set to a locale of the
+ # form ll_CC, although ll_CC/LC_CTYPE is a symlink to an UTF-8
+ # LC_CTYPE file.
+ # - The environment variables LANG, LC_CTYPE, LC_ALL are not set by
+ # the system; nl_langinfo(CODESET) returns "US-ASCII" in this case.
+ # - The documentation says:
+ # "... all code that calls BSD system routines should ensure
+ # that the const *char parameters of these routines are in UTF-8
+ # encoding. All BSD system functions expect their string
+ # parameters to be in UTF-8 encoding and nothing else."
+ # It also says
+ # "An additional caveat is that string parameters for files,
+ # paths, and other file-system entities must be in canonical
+ # UTF-8. In a canonical UTF-8 Unicode string, all decomposable
+ # characters are decomposed ..."
+ # but this is not true: You can pass non-decomposed UTF-8 strings
+ # to file system functions, and it is the OS which will convert
+ # them to decomposed UTF-8 before accessing the file system.
+ # - The Apple Terminal application displays UTF-8 by default.
+ # - However, other applications are free to use different encodings:
+ # - xterm uses ISO-8859-1 by default.
+ # - TextEdit uses MacRoman by default.
+ # We prefer UTF-8 over decomposed UTF-8-MAC because one should
+ # minimize the use of decomposed Unicode. Unfortunately, through the
+ # Darwin file system, decomposed UTF-8 strings are leaked into user
+ # space nevertheless.
+ # Then there are also the locales with encodings other than US-ASCII
+ # and UTF-8. These locales can be occasionally useful to users (e.g.
+ # when grepping through ISO-8859-1 encoded text files), when all their
+ # file names are in US-ASCII.
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-13 ISO-8859-13"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "KOI8-R KOI8-R"
+ echo "KOI8-U KOI8-U"
+ echo "CP866 CP866"
+ echo "CP949 CP949"
+ echo "CP1131 CP1131"
+ echo "CP1251 CP1251"
+ echo "eucCN GB2312"
+ echo "GB2312 GB2312"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "Big5 BIG5"
+ echo "Big5HKSCS BIG5-HKSCS"
+ echo "GBK GBK"
+ echo "GB18030 GB18030"
+ echo "SJIS SHIFT_JIS"
+ echo "ARMSCII-8 ARMSCII-8"
+ echo "PT154 PT154"
+ #echo "ISCII-DEV ?"
+ echo "* UTF-8"
+ ;;
+ beos* | haiku*)
+ # BeOS and Haiku have a single locale, and it has UTF-8 encoding.
+ echo "* UTF-8"
+ ;;
+ msdosdjgpp*)
+ # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ echo "#"
+ echo "# The encodings given here may not all be correct."
+ echo "# If you find that the encoding given for your language and"
+ echo "# country is not the one your DOS machine actually uses, just"
+ echo "# correct it in this file, and send a mail to"
+ echo "# Juan Manuel Guerrero <juan.guerrero@gmx.de>"
+ echo "# and Bruno Haible <bruno@clisp.org>."
+ echo "#"
+ echo "C ASCII"
+ # ISO-8859-1 languages
+ echo "ca CP850"
+ echo "ca_ES CP850"
+ echo "da CP865" # not CP850 ??
+ echo "da_DK CP865" # not CP850 ??
+ echo "de CP850"
+ echo "de_AT CP850"
+ echo "de_CH CP850"
+ echo "de_DE CP850"
+ echo "en CP850"
+ echo "en_AU CP850" # not CP437 ??
+ echo "en_CA CP850"
+ echo "en_GB CP850"
+ echo "en_NZ CP437"
+ echo "en_US CP437"
+ echo "en_ZA CP850" # not CP437 ??
+ echo "es CP850"
+ echo "es_AR CP850"
+ echo "es_BO CP850"
+ echo "es_CL CP850"
+ echo "es_CO CP850"
+ echo "es_CR CP850"
+ echo "es_CU CP850"
+ echo "es_DO CP850"
+ echo "es_EC CP850"
+ echo "es_ES CP850"
+ echo "es_GT CP850"
+ echo "es_HN CP850"
+ echo "es_MX CP850"
+ echo "es_NI CP850"
+ echo "es_PA CP850"
+ echo "es_PY CP850"
+ echo "es_PE CP850"
+ echo "es_SV CP850"
+ echo "es_UY CP850"
+ echo "es_VE CP850"
+ echo "et CP850"
+ echo "et_EE CP850"
+ echo "eu CP850"
+ echo "eu_ES CP850"
+ echo "fi CP850"
+ echo "fi_FI CP850"
+ echo "fr CP850"
+ echo "fr_BE CP850"
+ echo "fr_CA CP850"
+ echo "fr_CH CP850"
+ echo "fr_FR CP850"
+ echo "ga CP850"
+ echo "ga_IE CP850"
+ echo "gd CP850"
+ echo "gd_GB CP850"
+ echo "gl CP850"
+ echo "gl_ES CP850"
+ echo "id CP850" # not CP437 ??
+ echo "id_ID CP850" # not CP437 ??
+ echo "is CP861" # not CP850 ??
+ echo "is_IS CP861" # not CP850 ??
+ echo "it CP850"
+ echo "it_CH CP850"
+ echo "it_IT CP850"
+ echo "lt CP775"
+ echo "lt_LT CP775"
+ echo "lv CP775"
+ echo "lv_LV CP775"
+ echo "nb CP865" # not CP850 ??
+ echo "nb_NO CP865" # not CP850 ??
+ echo "nl CP850"
+ echo "nl_BE CP850"
+ echo "nl_NL CP850"
+ echo "nn CP865" # not CP850 ??
+ echo "nn_NO CP865" # not CP850 ??
+ echo "no CP865" # not CP850 ??
+ echo "no_NO CP865" # not CP850 ??
+ echo "pt CP850"
+ echo "pt_BR CP850"
+ echo "pt_PT CP850"
+ echo "sv CP850"
+ echo "sv_SE CP850"
+ # ISO-8859-2 languages
+ echo "cs CP852"
+ echo "cs_CZ CP852"
+ echo "hr CP852"
+ echo "hr_HR CP852"
+ echo "hu CP852"
+ echo "hu_HU CP852"
+ echo "pl CP852"
+ echo "pl_PL CP852"
+ echo "ro CP852"
+ echo "ro_RO CP852"
+ echo "sk CP852"
+ echo "sk_SK CP852"
+ echo "sl CP852"
+ echo "sl_SI CP852"
+ echo "sq CP852"
+ echo "sq_AL CP852"
+ echo "sr CP852" # CP852 or CP866 or CP855 ??
+ echo "sr_CS CP852" # CP852 or CP866 or CP855 ??
+ echo "sr_YU CP852" # CP852 or CP866 or CP855 ??
+ # ISO-8859-3 languages
+ echo "mt CP850"
+ echo "mt_MT CP850"
+ # ISO-8859-5 languages
+ echo "be CP866"
+ echo "be_BE CP866"
+ echo "bg CP866" # not CP855 ??
+ echo "bg_BG CP866" # not CP855 ??
+ echo "mk CP866" # not CP855 ??
+ echo "mk_MK CP866" # not CP855 ??
+ echo "ru CP866"
+ echo "ru_RU CP866"
+ echo "uk CP1125"
+ echo "uk_UA CP1125"
+ # ISO-8859-6 languages
+ echo "ar CP864"
+ echo "ar_AE CP864"
+ echo "ar_DZ CP864"
+ echo "ar_EG CP864"
+ echo "ar_IQ CP864"
+ echo "ar_IR CP864"
+ echo "ar_JO CP864"
+ echo "ar_KW CP864"
+ echo "ar_MA CP864"
+ echo "ar_OM CP864"
+ echo "ar_QA CP864"
+ echo "ar_SA CP864"
+ echo "ar_SY CP864"
+ # ISO-8859-7 languages
+ echo "el CP869"
+ echo "el_GR CP869"
+ # ISO-8859-8 languages
+ echo "he CP862"
+ echo "he_IL CP862"
+ # ISO-8859-9 languages
+ echo "tr CP857"
+ echo "tr_TR CP857"
+ # Japanese
+ echo "ja CP932"
+ echo "ja_JP CP932"
+ # Chinese
+ echo "zh_CN GBK"
+ echo "zh_TW CP950" # not CP938 ??
+ # Korean
+ echo "kr CP949" # not CP934 ??
+ echo "kr_KR CP949" # not CP934 ??
+ # Thai
+ echo "th CP874"
+ echo "th_TH CP874"
+ # Other
+ echo "eo CP850"
+ echo "eo_EO CP850"
+ ;;
+esac
diff --git a/src/libs/libgroff/cset.cpp b/src/libs/libgroff/cset.cpp
new file mode 100644
index 0000000..6702237
--- /dev/null
+++ b/src/libs/libgroff/cset.cpp
@@ -0,0 +1,104 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include <ctype.h>
+
+#include "lib.h"
+#include "cset.h"
+
+cset csalpha(CSET_BUILTIN);
+cset csupper(CSET_BUILTIN);
+cset cslower(CSET_BUILTIN);
+cset csdigit(CSET_BUILTIN);
+cset csxdigit(CSET_BUILTIN);
+cset csspace(CSET_BUILTIN);
+cset cspunct(CSET_BUILTIN);
+cset csalnum(CSET_BUILTIN);
+cset csprint(CSET_BUILTIN);
+cset csgraph(CSET_BUILTIN);
+cset cscntrl(CSET_BUILTIN);
+
+#ifdef isascii
+#define ISASCII(c) isascii(c)
+#else
+#define ISASCII(c) (1)
+#endif
+
+void cset::clear()
+{
+ char *p = v;
+ for (int i = 0; i <= UCHAR_MAX; i++)
+ p[i] = 0;
+}
+
+cset::cset()
+{
+ clear();
+}
+
+cset::cset(const char *s)
+{
+ clear();
+ while (*s)
+ v[(unsigned char)*s++] = 1;
+}
+
+cset::cset(const unsigned char *s)
+{
+ clear();
+ while (*s)
+ v[*s++] = 1;
+}
+
+cset::cset(cset_builtin)
+{
+ // these are initialised by cset_init::cset_init()
+}
+
+cset &cset::operator|=(const cset &cs)
+{
+ for (int i = 0; i <= UCHAR_MAX; i++)
+ if (cs.v[i])
+ v[i] = 1;
+ return *this;
+}
+
+
+int cset_init::initialised = 0;
+
+cset_init::cset_init()
+{
+ if (initialised)
+ return;
+ initialised = 1;
+ for (int i = 0; i <= UCHAR_MAX; i++) {
+ csalpha.v[i] = ISASCII(i) && isalpha(i);
+ csupper.v[i] = ISASCII(i) && isupper(i);
+ cslower.v[i] = ISASCII(i) && islower(i);
+ csdigit.v[i] = ISASCII(i) && isdigit(i);
+ csxdigit.v[i] = ISASCII(i) && isxdigit(i);
+ csspace.v[i] = ISASCII(i) && isspace(i);
+ cspunct.v[i] = ISASCII(i) && ispunct(i);
+ csalnum.v[i] = ISASCII(i) && isalnum(i);
+ csprint.v[i] = ISASCII(i) && isprint(i);
+ csgraph.v[i] = ISASCII(i) && isgraph(i);
+ cscntrl.v[i] = ISASCII(i) && iscntrl(i);
+ }
+}
diff --git a/src/libs/libgroff/curtime.cpp b/src/libs/libgroff/curtime.cpp
new file mode 100644
index 0000000..34dbc5c
--- /dev/null
+++ b/src/libs/libgroff/curtime.cpp
@@ -0,0 +1,55 @@
+/* Copyright (C) 2015-2020 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 of the License, 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.
+
+The GNU General Public License version 2 (GPL2) is available in the
+internet at <http://www.gnu.org/licenses/gpl-2.0.txt>. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include "errarg.h"
+#include "error.h"
+
+#ifdef LONG_FOR_TIME_T
+long
+#else
+time_t
+#endif
+current_time()
+{
+ char *source_date_epoch = getenv("SOURCE_DATE_EPOCH");
+
+ if (source_date_epoch) {
+ errno = 0;
+ char *endptr;
+ long epoch = strtol(source_date_epoch, &endptr, 10);
+
+ if ((errno == ERANGE && (epoch == LONG_MAX || epoch == LONG_MIN)) ||
+ (errno != 0 && epoch == 0))
+ fatal("$SOURCE_DATE_EPOCH: strtol: %1", strerror(errno));
+ if (endptr == source_date_epoch)
+ fatal("$SOURCE_DATE_EPOCH: no digits found: '%1'", endptr);
+ if (*endptr != '\0')
+ fatal("$SOURCE_DATE_EPOCH: trailing garbage: '%1'", endptr);
+ return epoch;
+ } else
+ return time(0);
+}
diff --git a/src/libs/libgroff/device.cpp b/src/libs/libgroff/device.cpp
new file mode 100644
index 0000000..6caeb8e
--- /dev/null
+++ b/src/libs/libgroff/device.cpp
@@ -0,0 +1,39 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include "device.h"
+#include "defs.h"
+
+const char *device = DEVICE;
+
+struct device_init {
+ device_init();
+} _device_init;
+
+device_init::device_init()
+{
+ char *tem = getenv("GROFF_TYPESETTER");
+ if (tem && tem[0])
+ device = tem;
+}
diff --git a/src/libs/libgroff/errarg.cpp b/src/libs/libgroff/errarg.cpp
new file mode 100644
index 0000000..99fc0fa
--- /dev/null
+++ b/src/libs/libgroff/errarg.cpp
@@ -0,0 +1,136 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <assert.h>
+#include <stdio.h>
+
+#include "errarg.h"
+
+errarg::errarg(const char *p) : type(STRING)
+{
+ s = p ? p : "(null)";
+}
+
+errarg::errarg() : type(EMPTY)
+{
+}
+
+errarg::errarg(int nn) : type(INTEGER)
+{
+ n = nn;
+}
+
+errarg::errarg(unsigned int uu) : type(UNSIGNED_INTEGER)
+{
+ u = uu;
+}
+
+errarg::errarg(char cc) : type(CHAR)
+{
+ c = cc;
+}
+
+errarg::errarg(unsigned char cc) : type(CHAR)
+{
+ c = cc;
+}
+
+errarg::errarg(double dd) : type(DOUBLE)
+{
+ d = dd;
+}
+
+int errarg::empty() const
+{
+ return type == EMPTY;
+}
+
+extern "C" {
+ const char *i_to_a(int);
+ const char *ui_to_a(unsigned int);
+}
+
+void errarg::print() const
+{
+ switch (type) {
+ case INTEGER:
+ fputs(i_to_a(n), stderr);
+ break;
+ case UNSIGNED_INTEGER:
+ fputs(ui_to_a(u), stderr);
+ break;
+ case CHAR:
+ putc(c, stderr);
+ break;
+ case STRING:
+ fputs(s, stderr);
+ break;
+ case DOUBLE:
+ fprintf(stderr, "%g", d);
+ break;
+ case EMPTY:
+ break;
+ }
+}
+
+errarg empty_errarg;
+
+void errprint(const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ assert(format != 0);
+ char c;
+ while ((c = *format++) != '\0') {
+ if (c == '%') {
+ c = *format++;
+ switch(c) {
+ case '%':
+ fputc('%', stderr);
+ break;
+ case '1':
+ assert(!arg1.empty());
+ arg1.print();
+ break;
+ case '2':
+ assert(!arg2.empty());
+ arg2.print();
+ break;
+ case '3':
+ assert(!arg3.empty());
+ arg3.print();
+ break;
+ default:
+ assert(0 == "unsupported argument conversion (not in [%123])");
+ }
+ }
+ else
+ putc(c, stderr);
+ }
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/libs/libgroff/error.cpp b/src/libs/libgroff/error.cpp
new file mode 100644
index 0000000..b1a4e61
--- /dev/null
+++ b/src/libs/libgroff/error.cpp
@@ -0,0 +1,185 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "errarg.h"
+#include "error.h"
+
+extern void fatal_error_exit();
+
+enum error_type { DEBUG, WARNING, ERROR, FATAL };
+
+static void do_error_with_file_and_line(const char *filename,
+ const char *source_filename,
+ int lineno,
+ error_type type,
+ const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ bool need_space = false;
+ if (program_name != 0 /* nullptr */) {
+ fputs(program_name, stderr);
+ fputc(':', stderr);
+ need_space = true;
+ }
+ if (filename != 0 /* nullptr */) {
+ if (strcmp(filename, "-") == 0)
+ filename = "<standard input>";
+ fputs(filename, stderr);
+ if (source_filename != 0 /* nullptr */) {
+ fputs(":(", stderr);
+ fputs(source_filename, stderr);
+ fputc(')', stderr);
+ }
+ if (lineno > 0) {
+ fputc(':', stderr);
+ errprint("%1", lineno);
+ }
+ fputc(':', stderr);
+ need_space = true;
+ }
+ if (need_space)
+ fputc(' ', stderr);
+ switch (type) {
+ case FATAL:
+ fputs("fatal error", stderr);
+ break;
+ case ERROR:
+ fputs("error", stderr);
+ break;
+ case WARNING:
+ fputs("warning", stderr);
+ break;
+ case DEBUG:
+ fputs("debug", stderr);
+ break;
+ }
+ fputs(": ", stderr);
+ errprint(format, arg1, arg2, arg3);
+ fputc('\n', stderr);
+ fflush(stderr);
+ if (type == FATAL)
+ fatal_error_exit();
+}
+
+static void do_error(error_type type,
+ const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ do_error_with_file_and_line(current_filename, current_source_filename,
+ current_lineno, type, format, arg1, arg2,
+ arg3);
+}
+
+void debug(const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ do_error(DEBUG, format, arg1, arg2, arg3);
+}
+
+void error(const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ do_error(ERROR, format, arg1, arg2, arg3);
+}
+
+void warning(const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ do_error(WARNING, format, arg1, arg2, arg3);
+}
+
+void fatal(const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ do_error(FATAL, format, arg1, arg2, arg3);
+}
+
+// Use the functions below when it's more costly to save and restore the
+// globals current_filename, current_source_filename, and current_lineno
+// than to specify additional arguments. For instance, a function that
+// would need to temporarily change their values and has multiple return
+// paths might prefer these to the simpler variants above.
+
+void debug_with_file_and_line(const char *filename,
+ int lineno,
+ const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ do_error_with_file_and_line(filename, 0 /* nullptr */, lineno,
+ DEBUG, format, arg1, arg2, arg3);
+}
+
+void error_with_file_and_line(const char *filename,
+ int lineno,
+ const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ do_error_with_file_and_line(filename, 0 /* nullptr */, lineno,
+ ERROR, format, arg1, arg2, arg3);
+}
+
+void warning_with_file_and_line(const char *filename,
+ int lineno,
+ const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ do_error_with_file_and_line(filename, 0 /* nullptr */, lineno,
+ WARNING, format, arg1, arg2, arg3);
+}
+
+void fatal_with_file_and_line(const char *filename,
+ int lineno,
+ const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ do_error_with_file_and_line(filename, 0 /* nullptr */, lineno,
+ FATAL, format, arg1, arg2, arg3);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/libs/libgroff/fatal.cpp b/src/libs/libgroff/fatal.cpp
new file mode 100644
index 0000000..1cbf3ef
--- /dev/null
+++ b/src/libs/libgroff/fatal.cpp
@@ -0,0 +1,30 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#define FATAL_ERROR_EXIT_CODE 3
+
+void fatal_error_exit()
+{
+ exit(FATAL_ERROR_EXIT_CODE);
+}
diff --git a/src/libs/libgroff/filename.cpp b/src/libs/libgroff/filename.cpp
new file mode 100644
index 0000000..ded9738
--- /dev/null
+++ b/src/libs/libgroff/filename.cpp
@@ -0,0 +1,31 @@
+/* Copyright (C) 2014-2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+// This global stores the name of the input file being processed by
+// troff, an output driver, or other program.
+const char *current_filename = 0 /* nullptr */;
+
+// This global stores the name of the troff input file corresponding to
+// the part of a device-independent troff output being processed; it is
+// used only by output drivers.
+const char *current_source_filename = 0 /* nullptr */;
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/libs/libgroff/fmod.c b/src/libs/libgroff/fmod.c
new file mode 100644
index 0000000..45278f9
--- /dev/null
+++ b/src/libs/libgroff/fmod.c
@@ -0,0 +1,27 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include <math.h>
+
+double fmod(x, y)
+ double x, y;
+{
+ double quot = x/y;
+ return x - (quot < 0.0 ? ceil(quot) : floor(quot)) * y;
+}
diff --git a/src/libs/libgroff/font.cpp b/src/libs/libgroff/font.cpp
new file mode 100644
index 0000000..c1af12c
--- /dev/null
+++ b/src/libs/libgroff/font.cpp
@@ -0,0 +1,1321 @@
+/* Copyright (C) 1989-2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <assert.h>
+#include <ctype.h>
+#include <math.h>
+#include <stdlib.h>
+#include <wchar.h>
+
+#include "errarg.h"
+#include "error.h"
+#include "cset.h"
+#include "font.h"
+#include "unicode.h"
+#include "paper.h"
+
+const char *const WS = " \t\n\r";
+
+struct font_char_metric {
+ char type;
+ int code;
+ int width;
+ int height;
+ int depth;
+ int pre_math_space;
+ int italic_correction;
+ int subscript_correction;
+ char *special_device_coding;
+};
+
+struct font_kern_list {
+ glyph *glyph1;
+ glyph *glyph2;
+ int amount;
+ font_kern_list *next;
+
+ font_kern_list(glyph *, glyph *, int, font_kern_list * = 0);
+};
+
+struct font_widths_cache {
+ font_widths_cache *next;
+ int point_size;
+ int *width;
+
+ font_widths_cache(int, int, font_widths_cache * = 0);
+ ~font_widths_cache();
+};
+
+/* text_file */
+
+struct text_file {
+ FILE *fp;
+ char *path;
+ int lineno;
+ int linebufsize;
+ bool recognize_comments;
+ bool silent;
+ char *buf;
+ text_file(FILE *fp, char *p);
+ ~text_file();
+ bool next_line();
+ void error(const char *format,
+ const errarg &arg1 = empty_errarg,
+ const errarg &arg2 = empty_errarg,
+ const errarg &arg3 = empty_errarg);
+ void fatal(const char *format,
+ const errarg &arg1 = empty_errarg,
+ const errarg &arg2 = empty_errarg,
+ const errarg &arg3 = empty_errarg);
+};
+
+text_file::text_file(FILE *p, char *s) : fp(p), path(s), lineno(0),
+ linebufsize(128), recognize_comments(true), silent(false), buf(0)
+{
+}
+
+text_file::~text_file()
+{
+ delete[] buf;
+ free(path);
+ if (fp)
+ fclose(fp);
+}
+
+bool text_file::next_line()
+{
+ if (fp == 0)
+ return false;
+ if (buf == 0)
+ buf = new char[linebufsize];
+ for (;;) {
+ lineno++;
+ int length = 0;
+ for (;;) {
+ int c = getc(fp);
+ if (c == EOF)
+ break;
+ if (is_invalid_input_char(c))
+ error("invalid input character code %1", int(c));
+ else {
+ if (length + 1 >= linebufsize) {
+ char *old_buf = buf;
+ buf = new char[linebufsize * 2];
+ memcpy(buf, old_buf, linebufsize);
+ delete[] old_buf;
+ linebufsize *= 2;
+ }
+ buf[length++] = c;
+ if (c == '\n')
+ break;
+ }
+ }
+ if (length == 0)
+ break;
+ buf[length] = '\0';
+ char *ptr = buf;
+ while (csspace(*ptr))
+ ptr++;
+ if (*ptr != 0 && (!recognize_comments || *ptr != '#'))
+ return true;
+ }
+ return false;
+}
+
+void text_file::error(const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ if (!silent)
+ error_with_file_and_line(path, lineno, format, arg1, arg2, arg3);
+}
+
+void text_file::fatal(const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ if (!silent)
+ fatal_with_file_and_line(path, lineno, format, arg1, arg2, arg3);
+}
+
+int glyph_to_unicode(glyph *g)
+{
+ const char *nm = glyph_to_name(g);
+ if (nm != 0) {
+ // ASCII character?
+ if (nm[0] == 'c' && nm[1] == 'h' && nm[2] == 'a' && nm[3] == 'r'
+ && (nm[4] >= '0' && nm[4] <= '9')) {
+ int n = (nm[4] - '0');
+ if (nm[5] == '\0')
+ return n;
+ if (n > 0 && (nm[5] >= '0' && nm[5] <= '9')) {
+ n = 10*n + (nm[5] - '0');
+ if (nm[6] == '\0')
+ return n;
+ if (nm[6] >= '0' && nm[6] <= '9') {
+ n = 10*n + (nm[6] - '0');
+ if (nm[7] == '\0' && n < 128)
+ return n;
+ }
+ }
+ }
+ // Unicode character?
+ if (check_unicode_name(nm)) {
+ char *ignore;
+ return (int)strtol(nm + 1, &ignore, 16);
+ }
+ // If 'nm' is a single letter 'x', the glyph name is '\x'.
+ char buf[] = { '\\', '\0', '\0' };
+ if (nm[1] == '\0') {
+ buf[1] = nm[0];
+ nm = buf;
+ }
+ // groff glyphs that map to Unicode?
+ const char *unicode = glyph_name_to_unicode(nm);
+ if (unicode != 0 && strchr(unicode, '_') == 0) {
+ char *ignore;
+ return (int)strtol(unicode, &ignore, 16);
+ }
+ }
+ return -1;
+}
+
+/* font functions */
+
+font::font(const char *s) : ligatures(0), kern_hash_table(0),
+ space_width(0), special(false), internalname(0), slant(0.0), zoom(0),
+ ch_index(0), nindices(0), ch(0), ch_used(0), ch_size(0),
+ widths_cache(0)
+{
+ name = new char[strlen(s) + 1];
+ strcpy(name, s);
+}
+
+font::~font()
+{
+ for (int i = 0; i < ch_used; i++)
+ if (ch[i].special_device_coding)
+ delete[] ch[i].special_device_coding;
+ delete[] ch;
+ delete[] ch_index;
+ if (kern_hash_table) {
+ for (int i = 0; i < KERN_HASH_TABLE_SIZE; i++) {
+ font_kern_list *kerns = kern_hash_table[i];
+ while (kerns) {
+ font_kern_list *tem = kerns;
+ kerns = kerns->next;
+ delete tem;
+ }
+ }
+ delete[] kern_hash_table;
+ }
+ delete[] name;
+ delete[] internalname;
+ while (widths_cache) {
+ font_widths_cache *tem = widths_cache;
+ widths_cache = widths_cache->next;
+ delete tem;
+ }
+}
+
+static int scale_round(int n, int x, int y)
+{
+ assert(x >= 0 && y > 0);
+ int y2 = y/2;
+ if (x == 0)
+ return 0;
+ if (n >= 0) {
+ if (n <= (INT_MAX - y2) / x)
+ return (n * x + y2) / y;
+ return int(n * double(x) / double(y) + .5);
+ }
+ else {
+ if (-(unsigned)n <= (-(unsigned)INT_MIN - y2) / x)
+ return (n * x - y2) / y;
+ return int(n * double(x) / double(y) - .5);
+ }
+}
+
+static int scale_round(int n, int x, int y, int z)
+{
+ assert(x >= 0 && y > 0 && z > 0);
+ if (x == 0)
+ return 0;
+ if (n >= 0)
+ return int((n * double(x) / double(y)) * (double(z) / 1000.0) + .5);
+ else
+ return int((n * double(x) / double(y)) * (double(z) / 1000.0) - .5);
+}
+
+inline int font::scale(int w, int sz)
+{
+ if (zoom)
+ return scale_round(w, sz, unitwidth, zoom);
+ else
+ return sz == unitwidth ? w : scale_round(w, sz, unitwidth);
+}
+
+// Returns whether scaling by arguments was successful. Used for paper
+// size conversions.
+bool font::unit_scale(double *value, char unit)
+{
+ // Paper sizes are handled in inches.
+ double divisor = 0;
+ switch (unit) {
+ case 'i':
+ divisor = 1;
+ break;
+ case 'p':
+ divisor = 72;
+ break;
+ case 'P':
+ divisor = 6;
+ break;
+ case 'c':
+ divisor = 2.54;
+ break;
+ default:
+ assert(0 == "unit not in [cipP]");
+ break;
+ }
+ if (divisor) {
+ *value /= divisor;
+ return true;
+ }
+ return false;
+}
+
+int font::get_skew(glyph *g, int point_size, int sl)
+{
+ int h = get_height(g, point_size);
+ return int(h * tan((slant + sl) * PI / 180.0) + .5);
+}
+
+bool font::contains(glyph *g)
+{
+ int idx = glyph_to_index(g);
+ assert(idx >= 0);
+ // Explicitly enumerated glyph?
+ if (idx < nindices && ch_index[idx] >= 0)
+ return true;
+ if (is_unicode) {
+ // Unicode font
+ // ASCII or Unicode character, or groff glyph name that maps to Unicode?
+ if (glyph_to_unicode(g) >= 0)
+ return true;
+ // Numbered character?
+ if (glyph_to_number(g) >= 0)
+ return true;
+ }
+ return false;
+}
+
+bool font::is_special()
+{
+ return special;
+}
+
+font_widths_cache::font_widths_cache(int ps, int ch_size,
+ font_widths_cache *p)
+: next(p), point_size(ps)
+{
+ width = new int[ch_size];
+ for (int i = 0; i < ch_size; i++)
+ width[i] = -1;
+}
+
+font_widths_cache::~font_widths_cache()
+{
+ delete[] width;
+}
+
+int font::get_width(glyph *g, int point_size)
+{
+ int idx = glyph_to_index(g);
+ assert(idx >= 0);
+ int real_size;
+ if (zoom == 0) // 0 means "don't zoom"
+ real_size = point_size;
+ else
+ {
+ if (point_size <= (INT_MAX - 500) / zoom)
+ real_size = (point_size * zoom + 500) / 1000;
+ else
+ real_size = int(point_size * double(zoom) / 1000.0 + .5);
+ }
+ if (idx < nindices && ch_index[idx] >= 0) {
+ // Explicitly enumerated glyph
+ int i = ch_index[idx];
+ if (real_size == unitwidth || font::use_unscaled_charwidths)
+ return ch[i].width;
+
+ if (!widths_cache)
+ widths_cache = new font_widths_cache(real_size, ch_size);
+ else if (widths_cache->point_size != real_size) {
+ font_widths_cache **p;
+ for (p = &widths_cache; *p; p = &(*p)->next)
+ if ((*p)->point_size == real_size)
+ break;
+ if (*p) {
+ font_widths_cache *tem = *p;
+ *p = (*p)->next;
+ tem->next = widths_cache;
+ widths_cache = tem;
+ }
+ else
+ widths_cache = new font_widths_cache(real_size, ch_size,
+ widths_cache);
+ }
+ int &w = widths_cache->width[i];
+ if (w < 0)
+ w = scale(ch[i].width, point_size);
+ return w;
+ }
+ if (is_unicode) {
+ // Unicode font
+ int width = 24; // XXX: Add a request to override this.
+ int w = wcwidth(get_code(g));
+ if (w > 1)
+ width *= w;
+ if (real_size == unitwidth || font::use_unscaled_charwidths)
+ return width;
+ else
+ return scale(width, point_size);
+ }
+ assert(0 == "glyph is not indexed and device lacks Unicode support");
+ abort(); // -Wreturn-type
+}
+
+int font::get_height(glyph *g, int point_size)
+{
+ int idx = glyph_to_index(g);
+ assert(idx >= 0);
+ if (idx < nindices && ch_index[idx] >= 0) {
+ // Explicitly enumerated glyph
+ return scale(ch[ch_index[idx]].height, point_size);
+ }
+ if (is_unicode) {
+ // Unicode font
+ return 0;
+ }
+ assert(0 == "glyph is not indexed and device lacks Unicode support");
+ abort(); // -Wreturn-type
+}
+
+int font::get_depth(glyph *g, int point_size)
+{
+ int idx = glyph_to_index(g);
+ assert(idx >= 0);
+ if (idx < nindices && ch_index[idx] >= 0) {
+ // Explicitly enumerated glyph
+ return scale(ch[ch_index[idx]].depth, point_size);
+ }
+ if (is_unicode) {
+ // Unicode font
+ return 0;
+ }
+ assert(0 == "glyph is not indexed and device lacks Unicode support");
+ abort(); // -Wreturn-type
+}
+
+int font::get_italic_correction(glyph *g, int point_size)
+{
+ int idx = glyph_to_index(g);
+ assert(idx >= 0);
+ if (idx < nindices && ch_index[idx] >= 0) {
+ // Explicitly enumerated glyph
+ return scale(ch[ch_index[idx]].italic_correction, point_size);
+ }
+ if (is_unicode) {
+ // Unicode font
+ return 0;
+ }
+ assert(0 == "glyph is not indexed and device lacks Unicode support");
+ abort(); // -Wreturn-type
+}
+
+int font::get_left_italic_correction(glyph *g, int point_size)
+{
+ int idx = glyph_to_index(g);
+ assert(idx >= 0);
+ if (idx < nindices && ch_index[idx] >= 0) {
+ // Explicitly enumerated glyph
+ return scale(ch[ch_index[idx]].pre_math_space, point_size);
+ }
+ if (is_unicode) {
+ // Unicode font
+ return 0;
+ }
+ assert(0 == "glyph is not indexed and device lacks Unicode support");
+ abort(); // -Wreturn-type
+}
+
+int font::get_subscript_correction(glyph *g, int point_size)
+{
+ int idx = glyph_to_index(g);
+ assert(idx >= 0);
+ if (idx < nindices && ch_index[idx] >= 0) {
+ // Explicitly enumerated glyph
+ return scale(ch[ch_index[idx]].subscript_correction, point_size);
+ }
+ if (is_unicode) {
+ // Unicode font
+ return 0;
+ }
+ assert(0 == "glyph is not indexed and device lacks Unicode support");
+ abort(); // -Wreturn-type
+}
+
+void font::set_zoom(int factor)
+{
+ assert(factor >= 0);
+ if (factor == 1000)
+ zoom = 0;
+ else
+ zoom = factor;
+}
+
+int font::get_zoom()
+{
+ return zoom;
+}
+
+int font::get_space_width(int point_size)
+{
+ return scale(space_width, point_size);
+}
+
+font_kern_list::font_kern_list(glyph *g1, glyph *g2, int n, font_kern_list *p)
+: glyph1(g1), glyph2(g2), amount(n), next(p)
+{
+}
+
+inline int font::hash_kern(glyph *g1, glyph *g2)
+{
+ int n = ((glyph_to_index(g1) << 10) + glyph_to_index(g2))
+ % KERN_HASH_TABLE_SIZE;
+ return n < 0 ? -n : n;
+}
+
+void font::add_kern(glyph *g1, glyph *g2, int amount)
+{
+ if (!kern_hash_table) {
+ kern_hash_table = new font_kern_list *[int(KERN_HASH_TABLE_SIZE)];
+ for (int i = 0; i < KERN_HASH_TABLE_SIZE; i++)
+ kern_hash_table[i] = 0;
+ }
+ font_kern_list **p = kern_hash_table + hash_kern(g1, g2);
+ *p = new font_kern_list(g1, g2, amount, *p);
+}
+
+int font::get_kern(glyph *g1, glyph *g2, int point_size)
+{
+ if (kern_hash_table) {
+ for (font_kern_list *p = kern_hash_table[hash_kern(g1, g2)]; p;
+ p = p->next)
+ if (g1 == p->glyph1 && g2 == p->glyph2)
+ return scale(p->amount, point_size);
+ }
+ return 0;
+}
+
+bool font::has_ligature(int mask)
+{
+ return (bool) (mask & ligatures);
+}
+
+int font::get_character_type(glyph *g)
+{
+ int idx = glyph_to_index(g);
+ assert(idx >= 0);
+ if (idx < nindices && ch_index[idx] >= 0) {
+ // Explicitly enumerated glyph
+ return ch[ch_index[idx]].type;
+ }
+ if (is_unicode) {
+ // Unicode font
+ return 0;
+ }
+ assert(0 == "glyph is not indexed and device lacks Unicode support");
+ abort(); // -Wreturn-type
+}
+
+int font::get_code(glyph *g)
+{
+ int idx = glyph_to_index(g);
+ assert(idx >= 0);
+ if (idx < nindices && ch_index[idx] >= 0) {
+ // Explicitly enumerated glyph
+ return ch[ch_index[idx]].code;
+ }
+ if (is_unicode) {
+ // Unicode font
+ // ASCII or Unicode character, or groff glyph name that maps to Unicode?
+ int uni = glyph_to_unicode(g);
+ if (uni >= 0)
+ return uni;
+ // Numbered character?
+ int n = glyph_to_number(g);
+ if (n >= 0)
+ return n;
+ }
+ // The caller must check 'contains(g)' before calling get_code(g).
+ assert(0 == "glyph is not indexed and device lacks Unicode support");
+ abort(); // -Wreturn-type
+}
+
+const char *font::get_name()
+{
+ return name;
+}
+
+const char *font::get_internal_name()
+{
+ return internalname;
+}
+
+const char *font::get_special_device_encoding(glyph *g)
+{
+ int idx = glyph_to_index(g);
+ assert(idx >= 0);
+ if (idx < nindices && ch_index[idx] >= 0) {
+ // Explicitly enumerated glyph
+ return ch[ch_index[idx]].special_device_coding;
+ }
+ if (is_unicode) {
+ // Unicode font
+ return 0;
+ }
+ assert(0 == "glyph is not indexed and device lacks Unicode support");
+ abort(); // -Wreturn-type
+}
+
+const char *font::get_image_generator()
+{
+ return image_generator;
+}
+
+void font::alloc_ch_index(int idx)
+{
+ if (nindices == 0) {
+ nindices = 128;
+ if (idx >= nindices)
+ nindices = idx + 10;
+ ch_index = new int[nindices];
+ for (int i = 0; i < nindices; i++)
+ ch_index[i] = -1;
+ }
+ else {
+ int old_nindices = nindices;
+ nindices *= 2;
+ if (idx >= nindices)
+ nindices = idx + 10;
+ int *old_ch_index = ch_index;
+ ch_index = new int[nindices];
+ memcpy(ch_index, old_ch_index, sizeof(int) * old_nindices);
+ for (int i = old_nindices; i < nindices; i++)
+ ch_index[i] = -1;
+ delete[] old_ch_index;
+ }
+}
+
+void font::extend_ch()
+{
+ if (ch == 0)
+ ch = new font_char_metric[ch_size = 16];
+ else {
+ int old_ch_size = ch_size;
+ ch_size *= 2;
+ font_char_metric *old_ch = ch;
+ ch = new font_char_metric[ch_size];
+ memcpy(ch, old_ch, old_ch_size * sizeof(font_char_metric));
+ delete[] old_ch;
+ }
+}
+
+void font::compact()
+{
+ int i;
+ for (i = nindices - 1; i >= 0; i--)
+ if (ch_index[i] >= 0)
+ break;
+ i++;
+ if (i < nindices) {
+ int *old_ch_index = ch_index;
+ ch_index = new int[i];
+ memcpy(ch_index, old_ch_index, i*sizeof(int));
+ delete[] old_ch_index;
+ nindices = i;
+ }
+ if (ch_used < ch_size) {
+ font_char_metric *old_ch = ch;
+ ch = new font_char_metric[ch_used];
+ memcpy(ch, old_ch, ch_used*sizeof(font_char_metric));
+ delete[] old_ch;
+ ch_size = ch_used;
+ }
+}
+
+void font::add_entry(glyph *g, const font_char_metric &metric)
+{
+ int idx = glyph_to_index(g);
+ assert(idx >= 0);
+ if (idx >= nindices)
+ alloc_ch_index(idx);
+ assert(idx < nindices);
+ if (ch_used + 1 >= ch_size)
+ extend_ch();
+ assert(ch_used + 1 < ch_size);
+ ch_index[idx] = ch_used;
+ ch[ch_used++] = metric;
+}
+
+void font::copy_entry(glyph *new_glyph, glyph *old_glyph)
+{
+ int new_index = glyph_to_index(new_glyph);
+ int old_index = glyph_to_index(old_glyph);
+ assert(new_index >= 0 && old_index >= 0 && old_index < nindices);
+ if (new_index >= nindices)
+ alloc_ch_index(new_index);
+ ch_index[new_index] = ch_index[old_index];
+}
+
+font *font::load_font(const char *s, bool load_header_only)
+{
+ font *f = new font(s);
+ if (!f->load(load_header_only)) {
+ delete f;
+ return 0;
+ }
+ return f;
+}
+
+static char *trim_arg(char *p)
+{
+ if (0 == p)
+ return 0;
+ while (csspace(*p))
+ p++;
+ char *q = strchr(p, '\0');
+ while (q > p && csspace(q[-1]))
+ q--;
+ *q = '\0';
+ return p;
+}
+
+bool font::scan_papersize(const char *p, const char **size,
+ double *length, double *width)
+{
+ double l, w;
+ char lu[2], wu[2];
+ const char *pp = p;
+ bool attempt_file_open = true;
+ char line[255];
+again:
+ if (csdigit(*pp)) {
+ if (sscanf(pp, "%lf%1[ipPc],%lf%1[ipPc]", &l, lu, &w, wu) == 4
+ && l > 0 && w > 0
+ && unit_scale(&l, lu[0]) && unit_scale(&w, wu[0])) {
+ if (length)
+ *length = l;
+ if (width)
+ *width = w;
+ if (size)
+ *size = "custom";
+ return true;
+ }
+ }
+ else {
+ int i;
+ for (i = 0; i < NUM_PAPERSIZES; i++)
+ if (strcasecmp(papersizes[i].name, pp) == 0) {
+ if (length)
+ *length = papersizes[i].length;
+ if (width)
+ *width = papersizes[i].width;
+ if (size)
+ *size = papersizes[i].name;
+ return true;
+ }
+ if (attempt_file_open) {
+ FILE *fp = fopen(p, "r");
+ if (fp != 0) {
+ if (fgets(line, 254, fp)) {
+ // Don't recurse on file names.
+ attempt_file_open = false;
+ char *linep = strchr(line, '\0');
+ // skip final newline, if any
+ if (*(--linep) == '\n')
+ *linep = '\0';
+ pp = line;
+ }
+ fclose(fp);
+ goto again;
+ }
+ }
+ }
+ return false;
+}
+
+bool font::load(bool load_header_only)
+{
+ FILE *fp;
+ char *path;
+ if ((fp = open_file(name, &path)) == 0)
+ return false;
+ text_file t(fp, path);
+ t.silent = load_header_only;
+ char *p = 0;
+ bool saw_name_directive = false;
+ while (t.next_line()) {
+ p = strtok(t.buf, WS);
+ if (strcmp(p, "name") == 0) {
+ p = strtok(0, WS);
+ if (0 == p) {
+ t.error("'name' directive requires an argument");
+ return false;
+ }
+ if (strcmp(p, name) != 0) {
+ t.error("font description file name '%1' does not match 'name'"
+ " argument '%2'", name, p);
+ return false;
+ }
+ saw_name_directive = true;
+ }
+ else if (strcmp(p, "spacewidth") == 0) {
+ p = strtok(0, WS);
+ int n;
+ if (0 == p) {
+ t.error("missing argument to 'spacewidth' directive");
+ return false;
+ }
+ if (sscanf(p, "%d", &n) != 1) {
+ t.error("invalid argument '%1' to 'spacewidth' directive", p);
+ return false;
+ }
+ if (n <= 0) {
+ t.error("'spacewidth' argument '%1' out of range", n);
+ return false;
+ }
+ space_width = n;
+ }
+ else if (strcmp(p, "slant") == 0) {
+ p = strtok(0, WS);
+ double n;
+ if (0 == p) {
+ t.error("missing argument to 'slant' directive");
+ return false;
+ }
+ if (sscanf(p, "%lf", &n) != 1) {
+ t.error("invalid argument '%1' to 'slant' directive", p);
+ return false;
+ }
+ if (n >= 90.0 || n <= -90.0) {
+ t.error("'slant' directive argument '%1' out of range", n);
+ return false;
+ }
+ slant = n;
+ }
+ else if (strcmp(p, "ligatures") == 0) {
+ for (;;) {
+ p = strtok(0, WS);
+ if (0 == p || strcmp(p, "0") == 0)
+ break;
+ if (strcmp(p, "ff") == 0)
+ ligatures |= LIG_ff;
+ else if (strcmp(p, "fi") == 0)
+ ligatures |= LIG_fi;
+ else if (strcmp(p, "fl") == 0)
+ ligatures |= LIG_fl;
+ else if (strcmp(p, "ffi") == 0)
+ ligatures |= LIG_ffi;
+ else if (strcmp(p, "ffl") == 0)
+ ligatures |= LIG_ffl;
+ else {
+ t.error("unrecognized ligature '%1'", p);
+ return false;
+ }
+ }
+ }
+ else if (strcmp(p, "internalname") == 0) {
+ p = strtok(0, WS);
+ if (0 == p) {
+ t.error("missing argument to 'internalname' directive");
+ return false;
+ }
+ internalname = new char[strlen(p) + 1];
+ strcpy(internalname, p);
+ }
+ else if (strcmp(p, "special") == 0) {
+ special = true;
+ }
+ else if (strcmp(p, "kernpairs") != 0 && strcmp(p, "charset") != 0) {
+ char *directive = p;
+ p = strtok(0, "\n");
+ handle_unknown_font_command(directive, trim_arg(p), t.path,
+ t.lineno);
+ }
+ else
+ break;
+ }
+ bool saw_charset_directive = false;
+ char *directive = p;
+ t.recognize_comments = false;
+ while (directive) {
+ if (strcmp(directive, "kernpairs") == 0) {
+ if (load_header_only)
+ return true;
+ for (;;) {
+ if (!t.next_line()) {
+ directive = 0;
+ break;
+ }
+ char *c1 = strtok(t.buf, WS);
+ if (0 == c1)
+ continue;
+ char *c2 = strtok(0, WS);
+ if (0 == c2) {
+ directive = c1;
+ break;
+ }
+ p = strtok(0, WS);
+ if (0 == p) {
+ t.error("missing kern amount for kerning pair '%1 %2'", c1,
+ c2);
+ return false;
+ }
+ int n;
+ if (sscanf(p, "%d", &n) != 1) {
+ t.error("invalid kern amount '%1' for kerning pair '%2 %3'",
+ p, c1, c2);
+ return false;
+ }
+ glyph *g1 = name_to_glyph(c1);
+ glyph *g2 = name_to_glyph(c2);
+ add_kern(g1, g2, n);
+ }
+ }
+ else if (strcmp(directive, "charset") == 0) {
+ if (load_header_only)
+ return true;
+ saw_charset_directive = true;
+ glyph *last_glyph = 0;
+ for (;;) {
+ if (!t.next_line()) {
+ directive = 0;
+ break;
+ }
+ char *nm = strtok(t.buf, WS);
+ assert(nm != 0);
+ p = strtok(0, WS);
+ if (0 == p) {
+ directive = nm;
+ break;
+ }
+ if (p[0] == '"') {
+ if (last_glyph == 0) {
+ t.error("the first entry ('%1') in 'charset' subsection"
+ " cannot be an alias", nm);
+ return false;
+ }
+ if (strcmp(nm, "---") == 0) {
+ t.error("an unnamed character ('---') cannot be an alias");
+ return false;
+ }
+ glyph *g = name_to_glyph(nm);
+ copy_entry(g, last_glyph);
+ }
+ else {
+ font_char_metric metric;
+ metric.height = 0;
+ metric.depth = 0;
+ metric.pre_math_space = 0;
+ metric.italic_correction = 0;
+ metric.subscript_correction = 0;
+ int nparms = sscanf(p, "%d,%d,%d,%d,%d,%d",
+ &metric.width, &metric.height,
+ &metric.depth,
+ &metric.italic_correction,
+ &metric.pre_math_space,
+ &metric.subscript_correction);
+ if (nparms < 1) {
+ t.error("missing or invalid width for glyph '%1'", nm);
+ return false;
+ }
+ p = strtok(0, WS);
+ if (0 == p) {
+ t.error("missing character type for '%1'", nm);
+ return false;
+ }
+ int type;
+ if (sscanf(p, "%d", &type) != 1) {
+ t.error("invalid character type for '%1'", nm);
+ return false;
+ }
+ if (type < 0 || type > 255) {
+ t.error("character type '%1' out of range for '%2'", type,
+ nm);
+ return false;
+ }
+ metric.type = type;
+ p = strtok(0, WS);
+ if (0 == p) {
+ t.error("missing code for '%1'", nm);
+ return false;
+ }
+ char *ptr;
+ metric.code = (int)strtol(p, &ptr, 0);
+ if (metric.code == 0 && ptr == p) {
+ t.error("invalid code '%1' for character '%2'", p, nm);
+ return false;
+ }
+ if (is_unicode) {
+ int w = wcwidth(metric.code);
+ if (w > 1)
+ metric.width *= w;
+ }
+ p = strtok(0, WS);
+ if ((0 == p) || (strcmp(p, "--") == 0)) {
+ metric.special_device_coding = 0;
+ }
+ else {
+ char *nam = new char[strlen(p) + 1];
+ strcpy(nam, p);
+ metric.special_device_coding = nam;
+ }
+ if (strcmp(nm, "---") == 0) {
+ last_glyph = number_to_glyph(metric.code);
+ add_entry(last_glyph, metric);
+ }
+ else {
+ last_glyph = name_to_glyph(nm);
+ add_entry(last_glyph, metric);
+ copy_entry(number_to_glyph(metric.code), last_glyph);
+ }
+ }
+ }
+ if (0 == last_glyph) {
+ t.error("no glyphs defined in font description");
+ return false;
+ }
+ }
+ else {
+ t.error("unrecognized font description directive '%1' (missing"
+ " 'kernpairs' or 'charset'?)", directive);
+ return false;
+ }
+ }
+ compact();
+ t.lineno = 0;
+ if (!saw_name_directive) {
+ t.error("font description 'name' directive missing");
+ return false;
+ }
+ if (!is_unicode && !saw_charset_directive) {
+ t.error("font description 'charset' subsection missing");
+ return false;
+ }
+ if (space_width == 0) {
+ t.error("font description 'spacewidth' directive missing");
+ // _Don't_ return false; compute a typical one for Western glyphs.
+ if (zoom)
+ space_width = scale_round(unitwidth, res, 72 * 3 * sizescale,
+ zoom);
+ else
+ space_width = scale_round(unitwidth, res, 72 * 3 * sizescale);
+ }
+ return true;
+}
+
+static struct {
+ const char *numeric_directive;
+ int *ptr;
+} table[] = {
+ { "res", &font::res },
+ { "hor", &font::hor },
+ { "vert", &font::vert },
+ { "unitwidth", &font::unitwidth },
+ { "paperwidth", &font::paperwidth },
+ { "paperlength", &font::paperlength },
+ { "spare1", &font::biggestfont },
+ { "biggestfont", &font::biggestfont },
+ { "spare2", &font::spare2 },
+ { "sizescale", &font::sizescale },
+ };
+
+// Return file specification of DESC file for selected output device if
+// it can be located and is valid, and a null pointer otherwise.
+const char *font::load_desc()
+{
+ int nfonts = 0;
+ FILE *fp;
+ char *path;
+ if ((fp = open_file("DESC", &path)) == 0)
+ return 0 /* nullptr */;
+ text_file t(fp, path);
+ while (t.next_line()) {
+ char *p = strtok(t.buf, WS);
+ assert(p != 0);
+ bool numeric_directive_found = false;
+ unsigned int idx;
+ for (idx = 0; !numeric_directive_found
+ && idx < sizeof(table) / sizeof(table[0]); idx++)
+ if (strcmp(table[idx].numeric_directive, p) == 0)
+ numeric_directive_found = true;
+ if (numeric_directive_found) {
+ char *q = strtok(0, WS);
+ if (0 == q) {
+ t.error("missing value for directive '%1'", p);
+ return 0 /* nullptr */;
+ }
+ int val;
+ if (sscanf(q, "%d", &val) != 1) {
+ t.error("'%1' directive given invalid number '%2'", p, q);
+ return 0 /* nullptr */;
+ }
+ if ((strcmp(p, "res") == 0
+ || strcmp(p, "hor") == 0
+ || strcmp(p, "vert") == 0
+ || strcmp(p, "unitwidth") == 0
+ || strcmp(p, "paperwidth") == 0
+ || strcmp(p, "paperlength") == 0
+ || strcmp(p, "sizescale") == 0)
+ && val < 1) {
+ t.error("expected argument to '%1' directive to be a"
+ " positive number, got '%2'", p, val);
+ return 0 /* nullptr */;
+ }
+ *(table[idx-1].ptr) = val;
+ }
+ else if (strcmp("family", p) == 0) {
+ p = strtok(0, WS);
+ if (0 == p) {
+ t.error("'family' directive requires an argument");
+ return 0 /* nullptr */;
+ }
+ char *tem = new char[strlen(p)+1];
+ strcpy(tem, p);
+ family = tem;
+ }
+ else if (strcmp("fonts", p) == 0) {
+ p = strtok(0, WS);
+ if (0 == p) {
+ t.error("'fonts' directive requires arguments");
+ return 0 /* nullptr */;
+ }
+ if (sscanf(p, "%d", &nfonts) != 1 || nfonts <= 0) {
+ t.error("expected first argument to 'fonts' directive to be a"
+ " non-negative number, got '%1'", p);
+ return 0 /* nullptr */;
+ }
+ font_name_table = (const char **)new char *[nfonts+1];
+ for (int i = 0; i < nfonts; i++) {
+ p = strtok(0, WS);
+ while (0 == p) {
+ if (!t.next_line()) {
+ t.error("unexpected end of file while reading font list");
+ return 0 /* nullptr */;
+ }
+ p = strtok(t.buf, WS);
+ }
+ char *temp = new char[strlen(p)+1];
+ strcpy(temp, p);
+ font_name_table[i] = temp;
+ }
+ p = strtok(0, WS);
+ if (p != 0) {
+ t.error("font count does not match declared number of fonts"
+ " ('%1')", nfonts);
+ return 0 /* nullptr */;
+ }
+ font_name_table[nfonts] = 0;
+ }
+ else if (strcmp("papersize", p) == 0) {
+ if (0 == res) {
+ t.error("'res' directive must precede 'papersize' in device"
+ " description file");
+ return 0 /* nullptr */;
+ }
+ p = strtok(0, WS);
+ if (0 == p) {
+ t.error("'papersize' directive requires an argument");
+ return 0 /* nullptr */;
+ }
+ bool found_paper = false;
+ char *savedp = strdup(p);
+ if (0 == savedp)
+ t.fatal("memory allocation failure while processing 'papersize'"
+ " directive");
+ while (p) {
+ double unscaled_paperwidth, unscaled_paperlength;
+ if (scan_papersize(p, &papersize, &unscaled_paperlength,
+ &unscaled_paperwidth)) {
+ paperwidth = int(unscaled_paperwidth * res + 0.5);
+ paperlength = int(unscaled_paperlength * res + 0.5);
+ found_paper = true;
+ break;
+ }
+ p = strtok(0, WS);
+ }
+ assert(savedp != 0);
+ if (!found_paper) {
+ t.error("unable to determine a paper format from '%1'", savedp);
+ free(savedp);
+ return 0 /* nullptr */;
+ }
+ free(savedp);
+ }
+ else if (strcmp("unscaled_charwidths", p) == 0)
+ use_unscaled_charwidths = true;
+ else if (strcmp("pass_filenames", p) == 0)
+ pass_filenames = true;
+ else if (strcmp("sizes", p) == 0) {
+ int n = 16;
+ sizes = new int[n];
+ int i = 0;
+ for (;;) {
+ p = strtok(0, WS);
+ while (0 == p) {
+ if (!t.next_line()) {
+ t.error("list of sizes must be terminated by '0'");
+ return 0 /* nullptr */;
+ }
+ p = strtok(t.buf, WS);
+ }
+ int lower, upper;
+ switch (sscanf(p, "%d-%d", &lower, &upper)) {
+ case 1:
+ upper = lower;
+ // fall through
+ case 2:
+ if (lower <= upper && lower >= 0)
+ break;
+ // fall through
+ default:
+ t.error("invalid size range '%1'", p);
+ return 0 /* nullptr */;
+ }
+ if (i + 2 > n) {
+ int *old_sizes = sizes;
+ sizes = new int[n*2];
+ memcpy(sizes, old_sizes, n*sizeof(int));
+ n *= 2;
+ delete[] old_sizes;
+ }
+ sizes[i++] = lower;
+ if (lower == 0)
+ break;
+ sizes[i++] = upper;
+ }
+ if (i == 1) {
+ t.error("must have some sizes");
+ return 0 /* nullptr */;
+ }
+ }
+ else if (strcmp("styles", p) == 0) {
+ int style_table_size = 5;
+ style_table = (const char **)new char *[style_table_size];
+ int j;
+ for (j = 0; j < style_table_size; j++)
+ style_table[j] = 0;
+ int i = 0;
+ for (;;) {
+ p = strtok(0, WS);
+ if (0 == p)
+ break;
+ // leave room for terminating 0
+ if (i + 1 >= style_table_size) {
+ const char **old_style_table = style_table;
+ style_table_size *= 2;
+ style_table = (const char **)new char*[style_table_size];
+ for (j = 0; j < i; j++)
+ style_table[j] = old_style_table[j];
+ for (; j < style_table_size; j++)
+ style_table[j] = 0;
+ delete[] old_style_table;
+ }
+ char *tem = new char[strlen(p) + 1];
+ strcpy(tem, p);
+ style_table[i++] = tem;
+ }
+ }
+ else if (strcmp("tcommand", p) == 0)
+ has_tcommand = true;
+ else if (strcmp("use_charnames_in_special", p) == 0)
+ use_charnames_in_special = true;
+ else if (strcmp("unicode", p) == 0)
+ is_unicode = true;
+ else if (strcmp("image_generator", p) == 0) {
+ p = strtok(0, WS);
+ if (0 == p) {
+ t.error("'image_generator' directive requires an argument");
+ return 0 /* nullptr */;
+ }
+ image_generator = strsave(p);
+ }
+ else if (strcmp("charset", p) == 0)
+ break;
+ else if (unknown_desc_command_handler) {
+ char *directive = p;
+ p = strtok(0, "\n");
+ (*unknown_desc_command_handler)(directive, trim_arg(p), t.path,
+ t.lineno);
+ }
+ }
+ t.lineno = 0;
+ if (res == 0) {
+ t.error("device description file missing 'res' directive");
+ return 0 /* nullptr */;
+ }
+ if (unitwidth == 0) {
+ t.error("device description file missing 'unitwidth' directive");
+ return 0 /* nullptr */;
+ }
+ if (font_name_table == 0) {
+ t.error("device description file missing 'fonts' directive");
+ return 0 /* nullptr */;
+ }
+ if (sizes == 0) {
+ t.error("device description file missing 'sizes' directive");
+ return 0 /* nullptr */;
+ }
+ return path;
+}
+
+void font::handle_unknown_font_command(const char *, const char *,
+ const char *, int)
+{
+}
+
+FONT_COMMAND_HANDLER
+font::set_unknown_desc_command_handler(FONT_COMMAND_HANDLER func)
+{
+ FONT_COMMAND_HANDLER prev = unknown_desc_command_handler;
+ unknown_desc_command_handler = func;
+ return prev;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/libs/libgroff/fontfile.cpp b/src/libs/libgroff/fontfile.cpp
new file mode 100644
index 0000000..8987971
--- /dev/null
+++ b/src/libs/libgroff/fontfile.cpp
@@ -0,0 +1,80 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <stdlib.h>
+#include <errno.h>
+#include "font.h"
+#include "searchpath.h"
+#include "device.h"
+#include "defs.h"
+
+const char *const FONT_ENV_VAR = "GROFF_FONT_PATH";
+
+static search_path font_path(FONT_ENV_VAR, FONTPATH, 0, 0);
+
+int font::res = 0;
+int font::hor = 1;
+int font::vert = 1;
+int font::unitwidth = 0;
+int font::paperwidth = 0;
+int font::paperlength = 0;
+const char *font::papersize = 0;
+int font::biggestfont = 0;
+int font::spare2 = 0;
+int font::sizescale = 1;
+bool font::has_tcommand = false;
+bool font::pass_filenames = false;
+bool font::use_unscaled_charwidths = false;
+bool font::use_charnames_in_special = false;
+bool font::is_unicode = false;
+const char *font::image_generator = 0;
+const char **font::font_name_table = 0;
+int *font::sizes = 0;
+const char *font::family = 0;
+const char **font::style_table = 0;
+FONT_COMMAND_HANDLER font::unknown_desc_command_handler = 0;
+
+void font::command_line_font_dir(const char *dir)
+{
+ font_path.command_line_dir(dir);
+}
+
+FILE *font::open_file(const char *nm, char **pathp)
+{
+ FILE *fp = 0 /* nullptr */;
+ // Do not traverse user-specified directories; Savannah #61424.
+ if (0 /* nullptr */ == strchr(nm, '/')) {
+ // Allocate enough for nm + device + 'dev' '/' '\0'.
+ int expected_size = strlen(nm) + strlen(device) + 5;
+ char *filename = new char[expected_size];
+ const int actual_size = sprintf(filename, "dev%s/%s", device, nm);
+ expected_size--; // sprintf() doesn't count the null terminator.
+ if (actual_size == expected_size)
+ fp = font_path.open_file(filename, pathp);
+ delete[] filename;
+ }
+ return fp;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/libs/libgroff/geometry.cpp b/src/libs/libgroff/geometry.cpp
new file mode 100644
index 0000000..c4665c4
--- /dev/null
+++ b/src/libs/libgroff/geometry.cpp
@@ -0,0 +1,180 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 Free Software Foundation, Inc.
+ Written by Gaius Mulley <gaius@glam.ac.uk>
+ using adjust_arc_center() from printer.cpp, written by James Clark.
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <math.h>
+
+#undef MAX
+#define MAX(a, b) (((a) > (b)) ? (a) : (b))
+
+#undef MIN
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
+
+
+// This utility function adjusts the specified center of the
+// arc so that it is equidistant between the specified start
+// and end points. (p[0], p[1]) is a vector from the current
+// point to the center; (p[2], p[3]) is a vector from the
+// center to the end point. If the center can be adjusted,
+// a vector from the current point to the adjusted center is
+// stored in c[0], c[1] and 1 is returned. Otherwise 0 is
+// returned.
+
+#if 1
+int adjust_arc_center(const int *p, double *c)
+{
+ // We move the center along a line parallel to the line between
+ // the specified start point and end point so that the center
+ // is equidistant between the start and end point.
+ // It can be proved (using Lagrange multipliers) that this will
+ // give the point nearest to the specified center that is equidistant
+ // between the start and end point.
+
+ double x = p[0] + p[2]; // (x, y) is the end point
+ double y = p[1] + p[3];
+ double n = x*x + y*y;
+ if (n != 0) {
+ c[0]= double(p[0]);
+ c[1] = double(p[1]);
+ double k = .5 - (c[0]*x + c[1]*y)/n;
+ c[0] += k*x;
+ c[1] += k*y;
+ return 1;
+ }
+ else
+ return 0;
+}
+#else
+int printer::adjust_arc_center(const int *p, double *c)
+{
+ int x = p[0] + p[2]; // (x, y) is the end point
+ int y = p[1] + p[3];
+ // Start at the current point; go in the direction of the specified
+ // center point until we reach a point that is equidistant between
+ // the specified starting point and the specified end point. Place
+ // the center of the arc there.
+ double n = p[0]*double(x) + p[1]*double(y);
+ if (n > 0) {
+ double k = (double(x)*x + double(y)*y)/(2.0*n);
+ // (cx, cy) is our chosen center
+ c[0] = k*p[0];
+ c[1] = k*p[1];
+ return 1;
+ }
+ else {
+ // We would never reach such a point. So instead start at the
+ // specified end point of the arc. Go towards the specified
+ // center point until we reach a point that is equidistant between
+ // the specified start point and specified end point. Place
+ // the center of the arc there.
+ n = p[2]*double(x) + p[3]*double(y);
+ if (n > 0) {
+ double k = 1 - (double(x)*x + double(y)*y)/(2.0*n);
+ // (c[0], c[1]) is our chosen center
+ c[0] = p[0] + k*p[2];
+ c[1] = p[1] + k*p[3];
+ return 1;
+ }
+ else
+ return 0;
+ }
+}
+#endif
+
+
+/*
+ * check_output_arc_limits - works out the smallest box that will encompass
+ * an arc defined by an origin (x, y) and two
+ * vectors (p0, p1) and (p2, p3).
+ * (x1, y1) -> start of arc
+ * (x1, y1) + (xv1, yv1) -> center of circle
+ * (x1, y1) + (xv1, yv1) + (xv2, yv2) -> end of arc
+ *
+ * Works out in which quadrant the arc starts and
+ * stops, and from this it determines the x, y
+ * max/min limits. The arc is drawn clockwise.
+ */
+
+void check_output_arc_limits(int x_1, int y_1,
+ int xv_1, int yv_1,
+ int xv_2, int yv_2,
+ double c_0, double c_1,
+ int *minx, int *maxx,
+ int *miny, int *maxy)
+{
+ int radius = (int)sqrt(c_0 * c_0 + c_1 * c_1);
+ // clockwise direction
+ int xcenter = x_1 + xv_1;
+ int ycenter = y_1 + yv_1;
+ int xend = xcenter + xv_2;
+ int yend = ycenter + yv_2;
+ // for convenience, transform to counterclockwise direction,
+ // centered at the origin
+ int xs = xend - xcenter;
+ int ys = yend - ycenter;
+ int xe = x_1 - xcenter;
+ int ye = y_1 - ycenter;
+ *minx = *maxx = xs;
+ *miny = *maxy = ys;
+ if (xe > *maxx)
+ *maxx = xe;
+ else if (xe < *minx)
+ *minx = xe;
+ if (ye > *maxy)
+ *maxy = ye;
+ else if (ye < *miny)
+ *miny = ye;
+ int qs, qe; // quadrants 0..3
+ if (xs >= 0)
+ qs = (ys >= 0) ? 0 : 3;
+ else
+ qs = (ys >= 0) ? 1 : 2;
+ if (xe >= 0)
+ qe = (ye >= 0) ? 0 : 3;
+ else
+ qe = (ye >= 0) ? 1 : 2;
+ // make qs always smaller than qe
+ if ((qs > qe)
+ || ((qs == qe) && (double(xs) * ye < double(xe) * ys)))
+ qe += 4;
+ for (int i = qs; i < qe; i++)
+ switch (i % 4) {
+ case 0:
+ *maxy = radius;
+ break;
+ case 1:
+ *minx = -radius;
+ break;
+ case 2:
+ *miny = -radius;
+ break;
+ case 3:
+ *maxx = radius;
+ break;
+ }
+ *minx += xcenter;
+ *maxx += xcenter;
+ *miny += ycenter;
+ *maxy += ycenter;
+}
diff --git a/src/libs/libgroff/getcwd.c b/src/libs/libgroff/getcwd.c
new file mode 100644
index 0000000..dd8b578
--- /dev/null
+++ b/src/libs/libgroff/getcwd.c
@@ -0,0 +1,54 @@
+/* Copyright (C) 2000-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Partial emulation of getcwd in terms of getwd. */
+
+#include <config.h>
+#include <sys/param.h>
+#include <string.h>
+#include <errno.h>
+
+char *getwd();
+
+char *getcwd(buf, size)
+ char *buf;
+ int size; /* POSIX says this should be size_t */
+{
+ if (size <= 0) {
+ errno = EINVAL;
+ return 0;
+ }
+ else {
+ char mybuf[MAXPATHLEN];
+ int saved_errno = errno;
+
+ errno = 0;
+ if (!getwd(mybuf)) {
+ if (errno == 0)
+ ; /* what to do? */
+ return 0;
+ }
+ errno = saved_errno;
+ if (strlen(mybuf) + 1 > size) {
+ errno = ERANGE;
+ return 0;
+ }
+ strcpy(buf, mybuf);
+ return buf;
+ }
+}
diff --git a/src/libs/libgroff/getopt.c b/src/libs/libgroff/getopt.c
new file mode 100644
index 0000000..6efa529
--- /dev/null
+++ b/src/libs/libgroff/getopt.c
@@ -0,0 +1,1241 @@
+/* Getopt for GNU.
+ NOTE: getopt is now part of the C library, so if you don't know what
+ "Keep this file name-space clean" means, talk to drepper@gnu.org
+ before changing it!
+ Copyright (C) 1987-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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 3 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, see <http://www.gnu.org/licenses/>. */
+
+/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
+ Ditto for AIX 3.2 and <stdlib.h>. */
+#ifndef _NO_PROTO
+# define _NO_PROTO
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+/* This needs to come after some library #include
+ to get __GNU_LIBRARY__ defined. */
+#ifdef __GNU_LIBRARY__
+/* Don't include stdlib.h for non-GNU C libraries because some of them
+ contain conflicting prototypes for getopt. */
+# include <stdlib.h>
+# include <unistd.h>
+#endif /* GNU C library. */
+
+#include <string.h>
+
+#ifdef VMS
+# include <unixlib.h>
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "gettext.h"
+# define _(msgid) gettext (msgid)
+#endif
+
+#if defined _LIBC && defined USE_IN_LIBIO
+# include <wchar.h>
+#endif
+
+#ifndef attribute_hidden
+# define attribute_hidden
+#endif
+
+/* Unlike standard Unix 'getopt', functions like 'getopt_long'
+ let the user intersperse the options with the other arguments.
+
+ As 'getopt_long' works, it permutes the elements of ARGV so that,
+ when it is done, all the options precede everything else. Thus
+ all application programs are extended to handle flexible argument order.
+
+ Using 'getopt' or setting the environment variable POSIXLY_CORRECT
+ disables permutation.
+ Then the application's behavior is completely standard.
+
+ GNU application programs can use a third alternative mode in which
+ they can distinguish the relative order of options and other arguments. */
+
+#include "getopt.h"
+#include "getopt_int.h"
+
+/* For communication from 'getopt' to the caller.
+ When 'getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when 'ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to 'getopt'.
+
+ On entry to 'getopt', zero means this is the first call; initialize.
+
+ When 'getopt' returns -1, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, 'optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+/* 1003.2 says this must be 1 before any call. */
+int optind = 1;
+
+/* Callers store zero here to inhibit the error message
+ for unrecognized options. */
+
+int opterr = 1;
+
+/* Set to an option character which was unrecognized.
+ This must be initialized on some systems to avoid linking in the
+ system's own getopt implementation. */
+
+int optopt = '?';
+
+/* Keep a global copy of all internal members of getopt_data. */
+
+static struct _getopt_data getopt_data;
+
+
+#ifndef __GNU_LIBRARY__
+
+/* Avoid depending on library functions or files
+ whose names are inconsistent. */
+
+#ifndef getenv
+extern char *getenv ();
+#endif
+
+#endif /* not __GNU_LIBRARY__ */
+
+#ifdef _LIBC
+/* Stored original parameters.
+ XXX This is no good solution. We should rather copy the args so
+ that we can compare them later. But we must not use malloc(3). */
+extern int __libc_argc;
+extern char **__libc_argv;
+
+/* Bash 2.0 gives us an environment variable containing flags
+ indicating ARGV elements that should not be considered arguments. */
+
+# ifdef USE_NONOPTION_FLAGS
+/* Defined in getopt_init.c */
+extern char *__getopt_nonoption_flags;
+# endif
+
+# ifdef USE_NONOPTION_FLAGS
+# define SWAP_FLAGS(ch1, ch2) \
+ if (d->__nonoption_flags_len > 0) \
+ { \
+ char __tmp = __getopt_nonoption_flags[ch1]; \
+ __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \
+ __getopt_nonoption_flags[ch2] = __tmp; \
+ }
+# else
+# define SWAP_FLAGS(ch1, ch2)
+# endif
+#else /* !_LIBC */
+# define SWAP_FLAGS(ch1, ch2)
+#endif /* _LIBC */
+
+/* Exchange two adjacent subsequences of ARGV.
+ One subsequence is elements [first_nonopt,last_nonopt)
+ which contains all the non-options that have been skipped so far.
+ The other is elements [last_nonopt,optind), which contains all
+ the options processed since those non-options were skipped.
+
+ 'first_nonopt' and 'last_nonopt' are relocated so that they describe
+ the new indices of the non-options in ARGV after they are moved. */
+
+static void
+exchange (char **argv, struct _getopt_data *d)
+{
+ int bottom = d->__first_nonopt;
+ int middle = d->__last_nonopt;
+ int top = d->optind;
+ char *tem;
+
+ /* Exchange the shorter segment with the far end of the longer segment.
+ That puts the shorter segment into the right place.
+ It leaves the longer segment in the right place overall,
+ but it consists of two parts that need to be swapped next. */
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+ /* First make sure the handling of the '__getopt_nonoption_flags'
+ string can work normally. Our top argument must be in the range
+ of the string. */
+ if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len)
+ {
+ /* We must extend the array. The user plays games with us and
+ presents new arguments. */
+ char *new_str = malloc (top + 1);
+ if (new_str == NULL)
+ d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0;
+ else
+ {
+ memset (__mempcpy (new_str, __getopt_nonoption_flags,
+ d->__nonoption_flags_max_len),
+ '\0', top + 1 - d->__nonoption_flags_max_len);
+ d->__nonoption_flags_max_len = top + 1;
+ __getopt_nonoption_flags = new_str;
+ }
+ }
+#endif
+
+ while (top > middle && middle > bottom)
+ {
+ if (top - middle > middle - bottom)
+ {
+ /* Bottom segment is the short one. */
+ int len = middle - bottom;
+ register int i;
+
+ /* Swap it with the top part of the top segment. */
+ for (i = 0; i < len; i++)
+ {
+ tem = argv[bottom + i];
+ argv[bottom + i] = argv[top - (middle - bottom) + i];
+ argv[top - (middle - bottom) + i] = tem;
+ SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
+ }
+ /* Exclude the moved bottom segment from further swapping. */
+ top -= len;
+ }
+ else
+ {
+ /* Top segment is the short one. */
+ int len = top - middle;
+ register int i;
+
+ /* Swap it with the bottom part of the bottom segment. */
+ for (i = 0; i < len; i++)
+ {
+ tem = argv[bottom + i];
+ argv[bottom + i] = argv[middle + i];
+ argv[middle + i] = tem;
+ SWAP_FLAGS (bottom + i, middle + i);
+ }
+ /* Exclude the moved top segment from further swapping. */
+ bottom += len;
+ }
+ }
+
+ /* Update records for the slots the non-options now occupy. */
+
+ d->__first_nonopt += (d->optind - d->__last_nonopt);
+ d->__last_nonopt = d->optind;
+}
+
+/* Initialize the internal data when the first call is made. */
+
+static const char *
+_getopt_initialize (__attribute__((__unused__)) int argc,
+ __attribute__((__unused__)) char **argv,
+ const char *optstring, int posixly_correct,
+ struct _getopt_data *d)
+{
+ /* Start processing options with ARGV-element 1 (since ARGV-element 0
+ is the program name); the sequence of previously skipped
+ non-option ARGV-elements is empty. */
+
+ d->__first_nonopt = d->__last_nonopt = d->optind;
+
+ d->__nextchar = NULL;
+
+ d->__posixly_correct = posixly_correct || !!getenv ("POSIXLY_CORRECT");
+
+ /* Determine how to handle the ordering of options and nonoptions. */
+
+ if (optstring[0] == '-')
+ {
+ d->__ordering = RETURN_IN_ORDER;
+ ++optstring;
+ }
+ else if (optstring[0] == '+')
+ {
+ d->__ordering = REQUIRE_ORDER;
+ ++optstring;
+ }
+ else if (d->__posixly_correct)
+ d->__ordering = REQUIRE_ORDER;
+ else
+ d->__ordering = PERMUTE;
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+ if (!d->__posixly_correct
+ && argc == __libc_argc && argv == __libc_argv)
+ {
+ if (d->__nonoption_flags_max_len == 0)
+ {
+ if (__getopt_nonoption_flags == NULL
+ || __getopt_nonoption_flags[0] == '\0')
+ d->__nonoption_flags_max_len = -1;
+ else
+ {
+ const char *orig_str = __getopt_nonoption_flags;
+ int len = d->__nonoption_flags_max_len = strlen (orig_str);
+ if (d->__nonoption_flags_max_len < argc)
+ d->__nonoption_flags_max_len = argc;
+ __getopt_nonoption_flags =
+ (char *) malloc (d->__nonoption_flags_max_len);
+ if (__getopt_nonoption_flags == NULL)
+ d->__nonoption_flags_max_len = -1;
+ else
+ memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
+ '\0', d->__nonoption_flags_max_len - len);
+ }
+ }
+ d->__nonoption_flags_len = d->__nonoption_flags_max_len;
+ }
+ else
+ d->__nonoption_flags_len = 0;
+#endif
+
+ return optstring;
+}
+
+/* Scan elements of ARGV (whose length is ARGC) for option characters
+ given in OPTSTRING.
+
+ If an element of ARGV starts with '-', and is not exactly "-" or "--",
+ then it is an option element. The characters of this element
+ (aside from the initial '-') are option characters. If 'getopt'
+ is called repeatedly, it returns successively each of the option characters
+ from each of the option elements.
+
+ If 'getopt' finds another option character, it returns that character,
+ updating 'optind' and 'nextchar' so that the next call to 'getopt' can
+ resume the scan with the following option character or ARGV-element.
+
+ If there are no more option characters, 'getopt' returns -1.
+ Then 'optind' is the index in ARGV of the first ARGV-element
+ that is not an option. (The ARGV-elements have been permuted
+ so that those that are not options now come last.)
+
+ OPTSTRING is a string containing the legitimate option characters.
+ If an option character is seen that is not listed in OPTSTRING,
+ return '?' after printing an error message. If you set 'opterr' to
+ zero, the error message is suppressed but we still return '?'.
+
+ If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+ so the following text in the same ARGV-element, or the text of the following
+ ARGV-element, is returned in 'optarg'. Two colons mean an option that
+ wants an optional arg; if there is text in the current ARGV-element,
+ it is returned in 'optarg', otherwise 'optarg' is set to zero.
+
+ If OPTSTRING starts with '-' or '+', it requests different methods of
+ handling the non-option ARGV-elements.
+ See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+ Long-named options begin with '--' instead of '-'.
+ Their names may be abbreviated as long as the abbreviation is unique
+ or is an exact match for some defined option. If they have an
+ argument, it follows the option name in the same ARGV-element, separated
+ from the option name by a '=', or else the in next ARGV-element.
+ When 'getopt' finds a long-named option, it returns 0 if that option's
+ 'flag' field is nonzero, the value of the option's 'val' field
+ if the 'flag' field is zero.
+
+ LONGOPTS is a vector of 'struct option' terminated by an
+ element containing a name which is zero.
+
+ LONGIND returns the index in LONGOPT of the long-named option found.
+ It is only valid when a long-named option has been found by the most
+ recent call.
+
+ If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+ long-named options.
+
+ If POSIXLY_CORRECT is nonzero, behave as if the POSIXLY_CORRECT
+ environment variable were set. */
+
+int
+_getopt_internal_r (int argc, char **argv, const char *optstring,
+ const struct option *longopts, int *longind,
+ int long_only, int posixly_correct, struct _getopt_data *d)
+{
+ int print_errors = d->opterr;
+ if (optstring[0] == ':')
+ print_errors = 0;
+
+ if (argc < 1)
+ return -1;
+
+ d->optarg = NULL;
+
+ if (d->optind == 0 || !d->__initialized)
+ {
+ if (d->optind == 0)
+ d->optind = 1; /* Don't scan ARGV[0], the program name. */
+ optstring = _getopt_initialize (argc, argv, optstring,
+ posixly_correct, d);
+ d->__initialized = 1;
+ }
+
+ /* Test whether ARGV[optind] points to a non-option argument.
+ Either it does not have option syntax, or there is an environment flag
+ from the shell indicating it is not an option. The later information
+ is only used when the used in the GNU libc. */
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \
+ || (d->optind < d->__nonoption_flags_len \
+ && __getopt_nonoption_flags[d->optind] == '1'))
+#else
+# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0')
+#endif
+
+ if (d->__nextchar == NULL || *d->__nextchar == '\0')
+ {
+ /* Advance to the next ARGV-element. */
+
+ /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
+ moved back by the user (who may also have changed the arguments). */
+ if (d->__last_nonopt > d->optind)
+ d->__last_nonopt = d->optind;
+ if (d->__first_nonopt > d->optind)
+ d->__first_nonopt = d->optind;
+
+ if (d->__ordering == PERMUTE)
+ {
+ /* If we have just processed some options following some non-options,
+ exchange them so that the options come first. */
+
+ if (d->__first_nonopt != d->__last_nonopt
+ && d->__last_nonopt != d->optind)
+ exchange ((char **) argv, d);
+ else if (d->__last_nonopt != d->optind)
+ d->__first_nonopt = d->optind;
+
+ /* Skip any additional non-options
+ and extend the range of non-options previously skipped. */
+
+ while (d->optind < argc && NONOPTION_P)
+ d->optind++;
+ d->__last_nonopt = d->optind;
+ }
+
+ /* The special ARGV-element '--' means premature end of options.
+ Skip it like a null option,
+ then exchange with previous non-options as if it were an option,
+ then skip everything else like a non-option. */
+
+ if (d->optind != argc && !strcmp (argv[d->optind], "--"))
+ {
+ d->optind++;
+
+ if (d->__first_nonopt != d->__last_nonopt
+ && d->__last_nonopt != d->optind)
+ exchange ((char **) argv, d);
+ else if (d->__first_nonopt == d->__last_nonopt)
+ d->__first_nonopt = d->optind;
+ d->__last_nonopt = argc;
+
+ d->optind = argc;
+ }
+
+ /* If we have done all the ARGV-elements, stop the scan
+ and back over any non-options that we skipped and permuted. */
+
+ if (d->optind == argc)
+ {
+ /* Set the next-arg-index to point at the non-options
+ that we previously skipped, so the caller will digest them. */
+ if (d->__first_nonopt != d->__last_nonopt)
+ d->optind = d->__first_nonopt;
+ return -1;
+ }
+
+ /* If we have come to a non-option and did not permute it,
+ either stop the scan or describe it to the caller and pass it by. */
+
+ if (NONOPTION_P)
+ {
+ if (d->__ordering == REQUIRE_ORDER)
+ return -1;
+ d->optarg = argv[d->optind++];
+ return 1;
+ }
+
+ /* We have found another option-ARGV-element.
+ Skip the initial punctuation. */
+
+ d->__nextchar = (argv[d->optind] + 1
+ + (longopts != NULL && argv[d->optind][1] == '-'));
+ }
+
+ /* Decode the current option-ARGV-element. */
+
+ /* Check whether the ARGV-element is a long option.
+
+ If long_only and the ARGV-element has the form "-f", where f is
+ a valid short option, don't consider it an abbreviated form of
+ a long option that starts with f. Otherwise there would be no
+ way to give the -f short option.
+
+ On the other hand, if there's a long option "fubar" and
+ the ARGV-element is "-fu", do consider that an abbreviation of
+ the long option, just like "--fu", and not "-f" with arg "u".
+
+ This distinction seems to be the most useful approach. */
+
+ if (longopts != NULL
+ && (argv[d->optind][1] == '-'
+ || (long_only && (argv[d->optind][2]
+ || !strchr (optstring, argv[d->optind][1])))))
+ {
+ char *nameend;
+ const struct option *p;
+ const struct option *pfound = NULL;
+ int exact = 0;
+ int ambig = 0;
+ int indfound = -1;
+ int option_index;
+
+ for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++)
+ /* Do nothing. */ ;
+
+ /* Test all long options for either exact match
+ or abbreviated matches. */
+ for (p = longopts, option_index = 0; p->name; p++, option_index++)
+ if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar))
+ {
+ if ((unsigned int) (nameend - d->__nextchar)
+ == (unsigned int) strlen (p->name))
+ {
+ /* Exact match found. */
+ pfound = p;
+ indfound = option_index;
+ exact = 1;
+ break;
+ }
+ else if (pfound == NULL)
+ {
+ /* First nonexact match found. */
+ pfound = p;
+ indfound = option_index;
+ }
+ else if (long_only
+ || pfound->has_arg != p->has_arg
+ || pfound->flag != p->flag
+ || pfound->val != p->val)
+ /* Second or later nonexact match found. */
+ ambig = 1;
+ }
+
+ if (ambig && !exact)
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("%s: option '%s' is ambiguous\n"),
+ argv[0], argv[d->optind]) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ if (_IO_fwide (stderr, 0) > 0)
+ __fwprintf (stderr, L"%s", buf);
+ else
+ fputs (buf, stderr);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr, _("%s: option '%s' is ambiguous\n"),
+ argv[0], argv[d->optind]);
+#endif
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ d->optind++;
+ d->optopt = 0;
+ return '?';
+ }
+
+ if (pfound != NULL)
+ {
+ option_index = indfound;
+ d->optind++;
+ if (*nameend)
+ {
+ /* Don't test has_arg with >, because some C compilers don't
+ allow it to be used on enums. */
+ if (pfound->has_arg)
+ d->optarg = nameend + 1;
+ else
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+ int n;
+#endif
+
+ if (argv[d->optind - 1][1] == '-')
+ {
+ /* --option */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("\
+%s: option '--%s' doesn't allow an argument\n"),
+ argv[0], pfound->name);
+#else
+ fprintf (stderr, _("\
+%s: option '--%s' doesn't allow an argument\n"),
+ argv[0], pfound->name);
+#endif
+ }
+ else
+ {
+ /* +option or -option */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("\
+%s: option '%c%s' doesn't allow an argument\n"),
+ argv[0], argv[d->optind - 1][0],
+ pfound->name);
+#else
+ fprintf (stderr, _("\
+%s: option '%c%s' doesn't allow an argument\n"),
+ argv[0], argv[d->optind - 1][0],
+ pfound->name);
+#endif
+ }
+
+#if defined _LIBC && defined USE_IN_LIBIO
+ if (n >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2
+ |= _IO_FLAGS2_NOTCANCEL;
+
+ if (_IO_fwide (stderr, 0) > 0)
+ __fwprintf (stderr, L"%s", buf);
+ else
+ fputs (buf, stderr);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#endif
+ }
+
+ d->__nextchar += strlen (d->__nextchar);
+
+ d->optopt = pfound->val;
+ return '?';
+ }
+ }
+ else if (pfound->has_arg == 1)
+ {
+ if (d->optind < argc)
+ d->optarg = argv[d->optind++];
+ else
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("\
+%s: option '%s' requires an argument\n"),
+ argv[0], argv[d->optind - 1]) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2
+ |= _IO_FLAGS2_NOTCANCEL;
+
+ if (_IO_fwide (stderr, 0) > 0)
+ __fwprintf (stderr, L"%s", buf);
+ else
+ fputs (buf, stderr);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr,
+ _("%s: option '%s' requires an argument\n"),
+ argv[0], argv[d->optind - 1]);
+#endif
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ d->optopt = pfound->val;
+ return optstring[0] == ':' ? ':' : '?';
+ }
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ if (longind != NULL)
+ *longind = option_index;
+ if (pfound->flag)
+ {
+ *(pfound->flag) = pfound->val;
+ return 0;
+ }
+ return pfound->val;
+ }
+
+ /* Can't find it as a long option. If this is not getopt_long_only,
+ or the option starts with '--' or is not a valid short
+ option, then it's an error.
+ Otherwise interpret it as a short option. */
+ if (!long_only || argv[d->optind][1] == '-'
+ || strchr (optstring, *d->__nextchar) == NULL)
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+ int n;
+#endif
+
+ if (argv[d->optind][1] == '-')
+ {
+ /* --option */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("%s: unrecognized option '--%s'\n"),
+ argv[0], d->__nextchar);
+#else
+ fprintf (stderr, _("%s: unrecognized option '--%s'\n"),
+ argv[0], d->__nextchar);
+#endif
+ }
+ else
+ {
+ /* +option or -option */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("%s: unrecognized option '%c%s'\n"),
+ argv[0], argv[d->optind][0], d->__nextchar);
+#else
+ fprintf (stderr, _("%s: unrecognized option '%c%s'\n"),
+ argv[0], argv[d->optind][0], d->__nextchar);
+#endif
+ }
+
+#if defined _LIBC && defined USE_IN_LIBIO
+ if (n >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ if (_IO_fwide (stderr, 0) > 0)
+ __fwprintf (stderr, L"%s", buf);
+ else
+ fputs (buf, stderr);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#endif
+ }
+ d->__nextchar = (char *) "";
+ d->optind++;
+ d->optopt = 0;
+ return '?';
+ }
+ }
+
+ /* Look at and handle the next short option-character. */
+
+ {
+ char c = *d->__nextchar++;
+ char *temp = strchr (optstring, c);
+
+ /* Increment 'optind' when we start to process its last character. */
+ if (*d->__nextchar == '\0')
+ ++d->optind;
+
+ if (temp == NULL || c == ':')
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+ int n;
+#endif
+
+ if (d->__posixly_correct)
+ {
+ /* 1003.2 specifies the format of this message. */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("%s: illegal option -- %c\n"),
+ argv[0], c);
+#else
+ fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c);
+#endif
+ }
+ else
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("%s: invalid option -- %c\n"),
+ argv[0], c);
+#else
+ fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c);
+#endif
+ }
+
+#if defined _LIBC && defined USE_IN_LIBIO
+ if (n >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ if (_IO_fwide (stderr, 0) > 0)
+ __fwprintf (stderr, L"%s", buf);
+ else
+ fputs (buf, stderr);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#endif
+ }
+ d->optopt = c;
+ return '?';
+ }
+ /* Convenience. Treat POSIX -W foo same as long option --foo */
+ if (temp[0] == 'W' && temp[1] == ';')
+ {
+ char *nameend;
+ const struct option *p;
+ const struct option *pfound = NULL;
+ int exact = 0;
+ int ambig = 0;
+ int indfound = 0;
+ int option_index;
+
+ /* This is an option that requires an argument. */
+ if (*d->__nextchar != '\0')
+ {
+ d->optarg = d->__nextchar;
+ /* If we end this ARGV-element by taking the rest as an arg,
+ we must advance to the next element now. */
+ d->optind++;
+ }
+ else if (d->optind == argc)
+ {
+ if (print_errors)
+ {
+ /* 1003.2 specifies the format of this message. */
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf,
+ _("%s: option requires an argument -- %c\n"),
+ argv[0], c) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ if (_IO_fwide (stderr, 0) > 0)
+ __fwprintf (stderr, L"%s", buf);
+ else
+ fputs (buf, stderr);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr, _("%s: option requires an argument -- %c\n"),
+ argv[0], c);
+#endif
+ }
+ d->optopt = c;
+ if (optstring[0] == ':')
+ c = ':';
+ else
+ c = '?';
+ return c;
+ }
+ else
+ /* We already incremented 'd->optind' once;
+ increment it again when taking next ARGV-elt as argument. */
+ d->optarg = argv[d->optind++];
+
+ /* optarg is now the argument, see if it's in the
+ table of longopts. */
+
+ for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '=';
+ nameend++)
+ /* Do nothing. */ ;
+
+ /* Test all long options for either exact match
+ or abbreviated matches. */
+ for (p = longopts, option_index = 0; p->name; p++, option_index++)
+ if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar))
+ {
+ if ((unsigned int) (nameend - d->__nextchar) == strlen (p->name))
+ {
+ /* Exact match found. */
+ pfound = p;
+ indfound = option_index;
+ exact = 1;
+ break;
+ }
+ else if (pfound == NULL)
+ {
+ /* First nonexact match found. */
+ pfound = p;
+ indfound = option_index;
+ }
+ else
+ /* Second or later nonexact match found. */
+ ambig = 1;
+ }
+ if (ambig && !exact)
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("%s: option '-W %s' is ambiguous\n"),
+ argv[0], argv[d->optind]) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ if (_IO_fwide (stderr, 0) > 0)
+ __fwprintf (stderr, L"%s", buf);
+ else
+ fputs (buf, stderr);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr, _("%s: option '-W %s' is ambiguous\n"),
+ argv[0], argv[d->optind]);
+#endif
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ d->optind++;
+ return '?';
+ }
+ if (pfound != NULL)
+ {
+ option_index = indfound;
+ if (*nameend)
+ {
+ /* Don't test has_arg with >, because some C compilers don't
+ allow it to be used on enums. */
+ if (pfound->has_arg)
+ d->optarg = nameend + 1;
+ else
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("\
+%s: option '-W %s' doesn't allow an argument\n"),
+ argv[0], pfound->name) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2
+ |= _IO_FLAGS2_NOTCANCEL;
+
+ if (_IO_fwide (stderr, 0) > 0)
+ __fwprintf (stderr, L"%s", buf);
+ else
+ fputs (buf, stderr);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr, _("\
+%s: option '-W %s' doesn't allow an argument\n"),
+ argv[0], pfound->name);
+#endif
+ }
+
+ d->__nextchar += strlen (d->__nextchar);
+ return '?';
+ }
+ }
+ else if (pfound->has_arg == 1)
+ {
+ if (d->optind < argc)
+ d->optarg = argv[d->optind++];
+ else
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("\
+%s: option '%s' requires an argument\n"),
+ argv[0], argv[d->optind - 1]) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2
+ |= _IO_FLAGS2_NOTCANCEL;
+
+ if (_IO_fwide (stderr, 0) > 0)
+ __fwprintf (stderr, L"%s", buf);
+ else
+ fputs (buf, stderr);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr,
+ _("%s: option '%s' requires an argument\n"),
+ argv[0], argv[d->optind - 1]);
+#endif
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ return optstring[0] == ':' ? ':' : '?';
+ }
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ if (longind != NULL)
+ *longind = option_index;
+ if (pfound->flag)
+ {
+ *(pfound->flag) = pfound->val;
+ return 0;
+ }
+ return pfound->val;
+ }
+ d->__nextchar = NULL;
+ return 'W'; /* Let the application handle it. */
+ }
+ if (temp[1] == ':')
+ {
+ if (temp[2] == ':')
+ {
+ /* This is an option that accepts an argument optionally. */
+ if (*d->__nextchar != '\0')
+ {
+ d->optarg = d->__nextchar;
+ d->optind++;
+ }
+ else
+ d->optarg = NULL;
+ d->__nextchar = NULL;
+ }
+ else
+ {
+ /* This is an option that requires an argument. */
+ if (*d->__nextchar != '\0')
+ {
+ d->optarg = d->__nextchar;
+ /* If we end this ARGV-element by taking the rest as an arg,
+ we must advance to the next element now. */
+ d->optind++;
+ }
+ else if (d->optind == argc)
+ {
+ if (print_errors)
+ {
+ /* 1003.2 specifies the format of this message. */
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("\
+%s: option requires an argument -- %c\n"),
+ argv[0], c) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ if (_IO_fwide (stderr, 0) > 0)
+ __fwprintf (stderr, L"%s", buf);
+ else
+ fputs (buf, stderr);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr,
+ _("%s: option requires an argument -- %c\n"),
+ argv[0], c);
+#endif
+ }
+ d->optopt = c;
+ if (optstring[0] == ':')
+ c = ':';
+ else
+ c = '?';
+ }
+ else
+ /* We already incremented 'optind' once;
+ increment it again when taking next ARGV-elt as argument. */
+ d->optarg = argv[d->optind++];
+ d->__nextchar = NULL;
+ }
+ }
+ return c;
+ }
+}
+
+int
+_getopt_internal (int argc, char **argv, const char *optstring,
+ const struct option *longopts, int *longind,
+ int long_only, int posixly_correct)
+{
+ int result;
+
+ getopt_data.optind = optind;
+ getopt_data.opterr = opterr;
+
+ result = _getopt_internal_r (argc, argv, optstring, longopts, longind,
+ long_only, posixly_correct, &getopt_data);
+
+ optind = getopt_data.optind;
+ optarg = getopt_data.optarg;
+ optopt = getopt_data.optopt;
+
+ return result;
+}
+
+/* glibc gets a LSB-compliant getopt.
+ Standalone applications get a POSIX-compliant getopt. */
+#if _LIBC
+enum { POSIXLY_CORRECT = 0 };
+#else
+enum { POSIXLY_CORRECT = 1 };
+#endif
+
+int
+getopt (int argc, char *const *argv, const char *optstring)
+{
+ return _getopt_internal (argc, (char **) argv, optstring, NULL, NULL, 0,
+ POSIXLY_CORRECT);
+}
+
+
+#ifdef TEST
+
+/* Compile with -DTEST to make an executable for use in testing
+ the above definition of 'getopt'. */
+
+int
+main (int argc, char **argv)
+{
+ int c;
+ int digit_optind = 0;
+
+ while (1)
+ {
+ int this_option_optind = optind ? optind : 1;
+
+ c = getopt (argc, argv, "abc:d:0123456789");
+ if (c == -1)
+ break;
+
+ switch (c)
+ {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (digit_optind != 0 && digit_optind != this_option_optind)
+ printf ("digits occur in two different argv-elements.\n");
+ digit_optind = this_option_optind;
+ printf ("option %c\n", c);
+ break;
+
+ case 'a':
+ printf ("option a\n");
+ break;
+
+ case 'b':
+ printf ("option b\n");
+ break;
+
+ case 'c':
+ printf ("option c with value '%s'\n", optarg);
+ break;
+
+ case '?':
+ break;
+
+ default:
+ printf ("?? getopt returned character code 0%o ??\n", c);
+ }
+ }
+
+ if (optind < argc)
+ {
+ printf ("non-option ARGV-elements: ");
+ while (optind < argc)
+ printf ("%s ", argv[optind++]);
+ printf ("\n");
+ }
+
+ exit (0);
+}
+
+#endif /* TEST */
diff --git a/src/libs/libgroff/getopt1.c b/src/libs/libgroff/getopt1.c
new file mode 100644
index 0000000..374b3ce
--- /dev/null
+++ b/src/libs/libgroff/getopt1.c
@@ -0,0 +1,172 @@
+/* getopt_long and getopt_long_only entry points for GNU getopt.
+ Copyright (C) 1987-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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 3 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, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef _LIBC
+# include <getopt.h>
+#else
+# include "getopt.h"
+#endif
+#include "getopt_int.h"
+
+#include <stdio.h>
+
+/* This needs to come after some library #include
+ to get __GNU_LIBRARY__ defined. */
+#ifdef __GNU_LIBRARY__
+#include <stdlib.h>
+#endif
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+int
+getopt_long (int argc, char *__getopt_argv_const *argv, const char *options,
+ const struct option *long_options, int *opt_index)
+{
+ return _getopt_internal (argc, (char **) argv, options, long_options,
+ opt_index, 0, 0);
+}
+
+int
+_getopt_long_r (int argc, char **argv, const char *options,
+ const struct option *long_options, int *opt_index,
+ struct _getopt_data *d)
+{
+ return _getopt_internal_r (argc, argv, options, long_options, opt_index,
+ 0, 0, d);
+}
+
+/* Like getopt_long, but '-' as well as '--' can indicate a long option.
+ If an option that starts with '-' (not '--') doesn't match a long option,
+ but does match a short option, it is parsed as a short option
+ instead. */
+
+int
+getopt_long_only (int argc, char *__getopt_argv_const *argv,
+ const char *options,
+ const struct option *long_options, int *opt_index)
+{
+ return _getopt_internal (argc, (char **) argv, options, long_options,
+ opt_index, 1, 0);
+}
+
+int
+_getopt_long_only_r (int argc, char **argv, const char *options,
+ const struct option *long_options, int *opt_index,
+ struct _getopt_data *d)
+{
+ return _getopt_internal_r (argc, argv, options, long_options, opt_index,
+ 1, 0, d);
+}
+
+
+#ifdef TEST
+
+#include <stdio.h>
+
+int
+main (int argc, char **argv)
+{
+ int c;
+ int digit_optind = 0;
+
+ while (1)
+ {
+ int this_option_optind = optind ? optind : 1;
+ int option_index = 0;
+ static struct option long_options[] =
+ {
+ {"add", 1, 0, 0},
+ {"append", 0, 0, 0},
+ {"delete", 1, 0, 0},
+ {"verbose", 0, 0, 0},
+ {"create", 0, 0, 0},
+ {"file", 1, 0, 0},
+ {0, 0, 0, 0}
+ };
+
+ c = getopt_long (argc, argv, "abc:d:0123456789",
+ long_options, &option_index);
+ if (c == -1)
+ break;
+
+ switch (c)
+ {
+ case 0:
+ printf ("option %s", long_options[option_index].name);
+ if (optarg)
+ printf (" with arg %s", optarg);
+ printf ("\n");
+ break;
+
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (digit_optind != 0 && digit_optind != this_option_optind)
+ printf ("digits occur in two different argv-elements.\n");
+ digit_optind = this_option_optind;
+ printf ("option %c\n", c);
+ break;
+
+ case 'a':
+ printf ("option a\n");
+ break;
+
+ case 'b':
+ printf ("option b\n");
+ break;
+
+ case 'c':
+ printf ("option c with value '%s'\n", optarg);
+ break;
+
+ case 'd':
+ printf ("option d with value '%s'\n", optarg);
+ break;
+
+ case '?':
+ break;
+
+ default:
+ printf ("?? getopt returned character code 0%o ??\n", c);
+ }
+ }
+
+ if (optind < argc)
+ {
+ printf ("non-option ARGV-elements: ");
+ while (optind < argc)
+ printf ("%s ", argv[optind++]);
+ printf ("\n");
+ }
+
+ exit (0);
+}
+
+#endif /* TEST */
diff --git a/src/libs/libgroff/glyphuni.cpp b/src/libs/libgroff/glyphuni.cpp
new file mode 100644
index 0000000..0d5a217
--- /dev/null
+++ b/src/libs/libgroff/glyphuni.cpp
@@ -0,0 +1,523 @@
+// -*- C++ -*-
+/* Copyright (C) 2002-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+#include "stringclass.h"
+#include "ptable.h"
+
+#include "unicode.h"
+
+struct glyph_to_unicode {
+ char *value;
+};
+
+declare_ptable(glyph_to_unicode)
+implement_ptable(glyph_to_unicode)
+
+PTABLE(glyph_to_unicode) glyph_to_unicode_table;
+
+// The entries commented out in the table below can't be used in glyph
+// names.
+
+struct S {
+ const char *key;
+ const char *value;
+} glyph_to_unicode_list[] = {
+ { "!", "0021" },
+ { "\"", "0022" },
+ { "dq", "0022" },
+ { "#", "0023" },
+ { "sh", "0023" },
+ { "$", "0024" },
+ { "Do", "0024" },
+ { "%", "0025" },
+ { "&", "0026" },
+ { "aq", "0027" },
+ { "(", "0028" },
+ { ")", "0029" },
+ { "*", "002A" },
+ { "+", "002B" },
+ { "pl", "002B" },
+ { ",", "002C" },
+ { ".", "002E" },
+ { "/", "002F" },
+ { "sl", "002F" },
+ { "0", "0030" },
+ { "1", "0031" },
+ { "2", "0032" },
+ { "3", "0033" },
+ { "4", "0034" },
+ { "5", "0035" },
+ { "6", "0036" },
+ { "7", "0037" },
+ { "8", "0038" },
+ { "9", "0039" },
+ { ":", "003A" },
+ { ";", "003B" },
+ { "<", "003C" },
+ { "=", "003D" },
+ { "eq", "003D" },
+ { ">", "003E" },
+ { "?", "003F" },
+ { "@", "0040" },
+ { "at", "0040" },
+ { "A", "0041" },
+ { "B", "0042" },
+ { "C", "0043" },
+ { "D", "0044" },
+ { "E", "0045" },
+ { "F", "0046" },
+ { "G", "0047" },
+ { "H", "0048" },
+ { "I", "0049" },
+ { "J", "004A" },
+ { "K", "004B" },
+ { "L", "004C" },
+ { "M", "004D" },
+ { "N", "004E" },
+ { "O", "004F" },
+ { "P", "0050" },
+ { "Q", "0051" },
+ { "R", "0052" },
+ { "S", "0053" },
+ { "T", "0054" },
+ { "U", "0055" },
+ { "V", "0056" },
+ { "W", "0057" },
+ { "X", "0058" },
+ { "Y", "0059" },
+ { "Z", "005A" },
+//{ "[", "005B" },
+ { "lB", "005B" },
+//{ "\\", "005C" },
+ { "rs", "005C" },
+//{ "]", "005D" },
+ { "rB", "005D" },
+ { "a^", "005E" },
+ { "^", "005E" },
+ { "ha", "005E" },
+ { "_", "005F" },
+ { "ru", "005F" },
+ { "ul", "005F" },
+ { "ga", "0060" },
+ { "a", "0061" },
+ { "b", "0062" },
+ { "c", "0063" },
+ { "d", "0064" },
+ { "e", "0065" },
+ { "f", "0066" },
+ { "ff", "0066_0066" },
+ { "Fi", "0066_0066_0069" },
+ { "Fl", "0066_0066_006C" },
+ { "fi", "0066_0069" },
+ { "fl", "0066_006C" },
+ { "g", "0067" },
+ { "h", "0068" },
+ { "i", "0069" },
+ { "j", "006A" },
+ { "k", "006B" },
+ { "l", "006C" },
+ { "m", "006D" },
+ { "n", "006E" },
+ { "o", "006F" },
+ { "p", "0070" },
+ { "q", "0071" },
+ { "r", "0072" },
+ { "s", "0073" },
+ { "t", "0074" },
+ { "u", "0075" },
+ { "v", "0076" },
+ { "w", "0077" },
+ { "x", "0078" },
+ { "y", "0079" },
+ { "z", "007A" },
+ { "lC", "007B" },
+ { "{", "007B" },
+ { "ba", "007C" },
+ { "or", "007C" },
+ { "|", "007C" },
+ { "rC", "007D" },
+ { "}", "007D" },
+ { "a~", "007E" },
+ { "~", "007E" },
+ { "ti", "007E" },
+ { "r!", "00A1" },
+ { "ct", "00A2" },
+ { "Po", "00A3" },
+ { "Cs", "00A4" },
+ { "Ye", "00A5" },
+ { "bb", "00A6" },
+ { "sc", "00A7" },
+ { "ad", "00A8" },
+ { "co", "00A9" },
+ { "Of", "00AA" },
+ { "Fo", "00AB" },
+ { "no", "00AC" },
+ { "tno", "00AC" },
+ // The soft hyphen U+00AD is meaningful only in the input file,
+ // not in the output.
+ { "rg", "00AE" },
+ { "a-", "00AF" },
+ { "de", "00B0" },
+ { "+-", "00B1" },
+ { "t+-", "00B1" },
+ { "S2", "00B2" },
+ { "S3", "00B3" },
+ { "aa", "00B4" },
+ { "mc", "00B5" },
+ { "ps", "00B6" },
+ { "pc", "00B7" },
+ { "ac", "00B8" },
+ { "S1", "00B9" },
+ { "Om", "00BA" },
+ { "Fc", "00BB" },
+ { "14", "00BC" },
+ { "12", "00BD" },
+ { "34", "00BE" },
+ { "r?", "00BF" },
+ { "`A", "00C0" },
+ { "'A", "00C1" },
+ { "^A", "00C2" },
+ { "~A", "00C3" },
+ { ":A", "00C4" },
+ { "oA", "00C5" },
+ { "AE", "00C6" },
+ { ",C", "00C7" },
+ { "`E", "00C8" },
+ { "'E", "00C9" },
+ { "^E", "00CA" },
+ { ":E", "00CB" },
+ { "`I", "00CC" },
+ { "'I", "00CD" },
+ { "^I", "00CE" },
+ { ":I", "00CF" },
+ { "-D", "00D0" },
+ { "~N", "00D1" },
+ { "`O", "00D2" },
+ { "'O", "00D3" },
+ { "^O", "00D4" },
+ { "~O", "00D5" },
+ { ":O", "00D6" },
+ { "mu", "00D7" },
+ { "tmu", "00D7" },
+ { "/O", "00D8" },
+ { "`U", "00D9" },
+ { "'U", "00DA" },
+ { "^U", "00DB" },
+ { ":U", "00DC" },
+ { "'Y", "00DD" },
+ { "TP", "00DE" },
+ { "ss", "00DF" },
+ { "`a", "00E0" },
+ { "'a", "00E1" },
+ { "^a", "00E2" },
+ { "~a", "00E3" },
+ { ":a", "00E4" },
+ { "oa", "00E5" },
+ { "ae", "00E6" },
+ { ",c", "00E7" },
+ { "`e", "00E8" },
+ { "'e", "00E9" },
+ { "^e", "00EA" },
+ { ":e", "00EB" },
+ { "`i", "00EC" },
+ { "'i", "00ED" },
+ { "^i", "00EE" },
+ { ":i", "00EF" },
+ { "Sd", "00F0" },
+ { "~n", "00F1" },
+ { "`o", "00F2" },
+ { "'o", "00F3" },
+ { "^o", "00F4" },
+ { "~o", "00F5" },
+ { ":o", "00F6" },
+ { "di", "00F7" },
+ { "tdi", "00F7" },
+ { "/o", "00F8" },
+ { "`u", "00F9" },
+ { "'u", "00FA" },
+ { "^u", "00FB" },
+ { ":u", "00FC" },
+ { "'y", "00FD" },
+ { "Tp", "00FE" },
+ { ":y", "00FF" },
+ { "'C", "0106" },
+ { "'c", "0107" },
+ { ".i", "0131" },
+ { "IJ", "0132" },
+ { "ij", "0133" },
+ { "/L", "0141" },
+ { "/l", "0142" },
+ { "OE", "0152" },
+ { "oe", "0153" },
+ { "vS", "0160" },
+ { "vs", "0161" },
+ { ":Y", "0178" },
+ { "vZ", "017D" },
+ { "vz", "017E" },
+ { "Fn", "0192" },
+ { ".j", "0237" },
+ { "ah", "02C7" },
+ { "ab", "02D8" },
+ { "a.", "02D9" },
+ { "ao", "02DA" },
+ { "ho", "02DB" },
+ { "a\"", "02DD" },
+ { "*A", "0391" },
+ { "*B", "0392" },
+ { "*G", "0393" },
+ { "*D", "0394" },
+ { "*E", "0395" },
+ { "*Z", "0396" },
+ { "*Y", "0397" },
+ { "*H", "0398" },
+ { "*I", "0399" },
+ { "*K", "039A" },
+ { "*L", "039B" },
+ { "*M", "039C" },
+ { "*N", "039D" },
+ { "*C", "039E" },
+ { "*O", "039F" },
+ { "*P", "03A0" },
+ { "*R", "03A1" },
+ { "*S", "03A3" },
+ { "*T", "03A4" },
+ { "*U", "03A5" },
+ { "*F", "03A6" },
+ { "*X", "03A7" },
+ { "*Q", "03A8" },
+ { "*W", "03A9" },
+ { "*a", "03B1" },
+ { "*b", "03B2" },
+ { "*g", "03B3" },
+ { "*d", "03B4" },
+ { "*e", "03B5" },
+ { "*z", "03B6" },
+ { "*y", "03B7" },
+ { "*h", "03B8" },
+ { "*i", "03B9" },
+ { "*k", "03BA" },
+ { "*l", "03BB" },
+ { "*m", "03BC" },
+ { "*n", "03BD" },
+ { "*c", "03BE" },
+ { "*o", "03BF" },
+ { "*p", "03C0" },
+ { "*r", "03C1" },
+ { "ts", "03C2" },
+ { "*s", "03C3" },
+ { "*t", "03C4" },
+ { "*u", "03C5" },
+ // the curly phi variant
+ { "+f", "03C6" },
+ { "*x", "03C7" },
+ { "*q", "03C8" },
+ { "*w", "03C9" },
+ { "+h", "03D1" },
+ // the stroked phi variant
+ { "*f", "03D5" },
+ { "+p", "03D6" },
+ { "+e", "03F5" },
+ // '-' and 'hy' denote a HYPHEN, usually a glyph with a smaller width than
+ // the MINUS sign. Users who are viewing broken man pages that assume
+ // that '-' denotes a U+002D character can either fix the broken man pages
+ // or apply the workaround described in the PROBLEMS file.
+ { "-", "2010" },
+ { "hy", "2010" },
+ { "en", "2013" },
+ { "em", "2014" },
+ { "`", "2018" },
+ { "oq", "2018" },
+ { "'", "2019" },
+ { "cq", "2019" },
+ { "bq", "201A" },
+ { "lq", "201C" },
+ { "rq", "201D" },
+ { "Bq", "201E" },
+ { "dg", "2020" },
+ { "dd", "2021" },
+ { "bu", "2022" },
+ { "%0", "2030" },
+ { "fm", "2032" },
+ { "sd", "2033" },
+ { "fo", "2039" },
+ { "fc", "203A" },
+ { "rn", "203E" },
+ { "f/", "2044" },
+ { "eu", "20AC" },
+ { "Eu", "20AC" },
+ { "-h", "210F" },
+ { "hbar", "210F" },
+ { "Im", "2111" },
+ { "wp", "2118" },
+ { "Re", "211C" },
+ { "tm", "2122" },
+ { "Ah", "2135" },
+ { "18", "215B" },
+ { "38", "215C" },
+ { "58", "215D" },
+ { "78", "215E" },
+ { "<-", "2190" },
+ { "ua", "2191" },
+ { "->", "2192" },
+ { "da", "2193" },
+ { "<>", "2194" },
+ { "va", "2195" },
+ { "CR", "21B5" },
+ { "lA", "21D0" },
+ { "uA", "21D1" },
+ { "rA", "21D2" },
+ { "dA", "21D3" },
+ { "hA", "21D4" },
+ { "vA", "21D5" },
+ { "fa", "2200" },
+ { "pd", "2202" },
+ { "te", "2203" },
+ { "es", "2205" },
+ { "gr", "2207" },
+ { "mo", "2208" },
+ { "nm", "2209" },
+ { "st", "220B" },
+ { "product", "220F" },
+ { "coproduct", "2210" },
+ { "sum", "2211" },
+ // 'mi' and '\-' represent a MINUS sign. But it is used in many man pages
+ // to denote the U+002D character that introduces a command-line option.
+ // For devices that support copy&paste, such as devhtml and devutf8, the
+ // user can apply the workaround described in the PROBLEMS file.
+ { "\\-", "2212" },
+ { "mi", "2212" },
+ { "-+", "2213" },
+ { "**", "2217" },
+ { "sqrt", "221A" },
+ { "sr", "221A" },
+ { "pt", "221D" },
+ { "if", "221E" },
+ { "/_", "2220" },
+ { "AN", "2227" },
+ { "OR", "2228" },
+ { "ca", "2229" },
+ { "cu", "222A" },
+ { "is", "222B" },
+ { "integral", "222B" },
+ { "tf", "2234" },
+ { "3d", "2234" },
+ { "ap", "223C" },
+ { "|=", "2243" },
+ { "=~", "2245" },
+ { "~~", "2248" },
+ { "~=", "2248" },
+ { "!=", "2260" },
+ { "==", "2261" },
+ { "ne", "2262" },
+ { "<=", "2264" },
+ { ">=", "2265" },
+ { "<<", "226A" },
+ { ">>", "226B" },
+ { "sb", "2282" },
+ { "sp", "2283" },
+ { "nb", "2284" },
+ { "nc", "2285" },
+ { "ib", "2286" },
+ { "ip", "2287" },
+ { "c+", "2295" },
+ { "c*", "2297" },
+ { "pp", "22A5" },
+ { "md", "22C5" },
+ { "lc", "2308" },
+ { "rc", "2309" },
+ { "lf", "230A" },
+ { "rf", "230B" },
+ { "parenlefttp", "239B" },
+ { "parenleftex", "239C" },
+ { "parenleftbt", "239D" },
+ { "parenrighttp", "239E" },
+ { "parenrightex", "239F" },
+ { "parenrightbt", "23A0" },
+ { "bracketlefttp", "23A1" },
+ { "bracketleftex", "23A2" },
+ { "bracketleftbt", "23A3" },
+ { "bracketrighttp", "23A4" },
+ { "bracketrightex", "23A5" },
+ { "bracketrightbt", "23A6" },
+ { "lt", "23A7" },
+ { "bracelefttp", "23A7" },
+ { "lk", "23A8" },
+ { "braceleftmid", "23A8" },
+ { "lb", "23A9" },
+ { "braceleftbt", "23A9" },
+ { "bv", "23AA" },
+ { "braceex", "23AA" },
+ { "braceleftex", "23AA" },
+ { "bracerightex", "23AA" },
+ { "rt", "23AB" },
+ { "bracerighttp", "23AB" },
+ { "rk", "23AC" },
+ { "bracerightmid", "23AC" },
+ { "rb", "23AD" },
+ { "bracerightbt", "23AD" },
+ { "an", "23AF" },
+ { "br", "2502" },
+ { "sq", "25A1" },
+ { "lz", "25CA" },
+ { "ci", "25CB" },
+ { "lh", "261C" },
+ { "rh", "261E" },
+ { "SP", "2660" },
+ { "CL", "2663" },
+ { "HE", "2665" },
+ { "DI", "2666" },
+ { "OK", "2713" },
+ // The 'left angle bracket' and 'right angle bracket' could be mapped to
+ // either U+2329,U+232A or U+3008,U+3009 or U+27E8,U+27E9. But the first
+ // and second possibility are double-width characters (see Unicode's
+ // 'DerivedEastAsianWidth.txt' file) and are therefore not suitable for
+ // general use, whereas the third possibility is single-width.
+ //
+ // The devhtml device overrides this mapping, because
+ //
+ // http://www.w3.org/TR/html401/sgml/entities.html
+ //
+ // says that in HTML, '&lang;' and '&rang;' are U+2329,U+232A,
+ // respectively.
+ { "la", "27E8" },
+ { "ra", "27E9" },
+};
+
+// global constructor
+static struct glyph_to_unicode_init {
+ glyph_to_unicode_init();
+} _glyph_to_unicode_init;
+
+glyph_to_unicode_init::glyph_to_unicode_init()
+{
+ for (unsigned int i = 0;
+ i < sizeof(glyph_to_unicode_list)/sizeof(glyph_to_unicode_list[0]);
+ i++) {
+ glyph_to_unicode *gtu = new glyph_to_unicode[1];
+ gtu->value = (char *)glyph_to_unicode_list[i].value;
+ glyph_to_unicode_table.define(glyph_to_unicode_list[i].key, gtu);
+ }
+}
+
+const char *glyph_name_to_unicode(const char *s)
+{
+ glyph_to_unicode *result = glyph_to_unicode_table.lookup(s);
+ return result ? result->value : 0;
+}
diff --git a/src/libs/libgroff/htmlhint.cpp b/src/libs/libgroff/htmlhint.cpp
new file mode 100644
index 0000000..8ebb84e
--- /dev/null
+++ b/src/libs/libgroff/htmlhint.cpp
@@ -0,0 +1,60 @@
+/* Copyright (C) 2000-2020 Free Software Foundation, Inc.
+ Written by Gaius Mulley (gaius@glam.ac.uk)
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "nonposix.h"
+#include "stringclass.h"
+#include "html-strings.h"
+
+/*
+ * This file contains a very simple set of routines which might
+ * be shared by preprocessors. It allows a preprocessor to indicate
+ * when an inline image should be created.
+ * This string is intercepted by pre-grohtml and substituted for
+ * the image name and suppression escapes.
+ *
+ * pre-html runs troff twice, once with -Thtml (or -Txhtml) and once
+ * with -Tps. 'troff -Thtml' (and 'troff -Txhtml') emits a
+ * <src='image'.png> tag and the postscript device driver works out
+ * the min/max limits of the graphic region. These region limits are
+ * read by pre-html and an image is generated via
+ *
+ * troff -Tps -> gs -> png
+ */
+
+/*
+ * html_begin_suppress - emit a start of image tag which will be seen
+ * by pre-html.
+ */
+void html_begin_suppress()
+{
+ put_string(HTML_IMAGE_INLINE_BEGIN, stdout);
+}
+
+/*
+ * html_end_suppress - emit an end of image tag which will be seen
+ * by pre-html.
+ */
+void html_end_suppress()
+{
+ put_string(HTML_IMAGE_INLINE_END, stdout);
+}
diff --git a/src/libs/libgroff/hypot.cpp b/src/libs/libgroff/hypot.cpp
new file mode 100644
index 0000000..fa0977d
--- /dev/null
+++ b/src/libs/libgroff/hypot.cpp
@@ -0,0 +1,34 @@
+/* Copyright (C) 2005-2020 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <math.h>
+
+double groff_hypot(double x, double y)
+{
+ double result = hypot(x, y);
+
+#ifdef __INTERIX
+ /* hypot() on Interix is broken */
+ if (isnan(result) && !isnan(x) && !isnan(y))
+ return 0.0;
+#endif
+
+ return result;
+}
diff --git a/src/libs/libgroff/iftoa.c b/src/libs/libgroff/iftoa.c
new file mode 100644
index 0000000..87aec58
--- /dev/null
+++ b/src/libs/libgroff/iftoa.c
@@ -0,0 +1,76 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+const char *if_to_a(int i, int decimal_point)
+{
+ static char buf[INT_DIGITS + 3]; // INT_DIGITS + '-', '.', '\0'
+ char *p = buf + INT_DIGITS + 2;
+ int point = 0;
+ buf[INT_DIGITS + 2] = '\0';
+ /* assert(decimal_point <= INT_DIGITS); */
+ if (i >= 0) {
+ do {
+ *--p = '0' + (i % 10);
+ i /= 10;
+ if (++point == decimal_point)
+ *--p = '.';
+ } while (i != 0 || point < decimal_point);
+ }
+ else { /* i < 0 */
+ do {
+ *--p = '0' - (i % 10);
+ i /= 10;
+ if (++point == decimal_point)
+ *--p = '.';
+ } while (i != 0 || point < decimal_point);
+ *--p = '-';
+ }
+ if (decimal_point > 0) {
+ char *q;
+ /* there must be a dot, so this will terminate */
+ for (q = buf + INT_DIGITS + 2; q[-1] == '0'; --q)
+ ;
+ if (q[-1] == '.') {
+ if (q - 1 == p) {
+ q[-1] = '0';
+ q[0] = '\0';
+ }
+ else
+ q[-1] = '\0';
+ }
+ else
+ *q = '\0';
+ }
+ return p;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/libs/libgroff/invalid.cpp b/src/libs/libgroff/invalid.cpp
new file mode 100644
index 0000000..59e4619
--- /dev/null
+++ b/src/libs/libgroff/invalid.cpp
@@ -0,0 +1,59 @@
+/* Copyright (C) 2000-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+// Table of invalid input characters.
+
+char invalid_char_table[256]= {
+#ifndef IS_EBCDIC_HOST
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+#else
+ 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1,
+ 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+#endif
+};
diff --git a/src/libs/libgroff/itoa.c b/src/libs/libgroff/itoa.c
new file mode 100644
index 0000000..a573b2c
--- /dev/null
+++ b/src/libs/libgroff/itoa.c
@@ -0,0 +1,67 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+const char *i_to_a(int i)
+{
+ /* Room for INT_DIGITS digits, - and '\0' */
+ static char buf[INT_DIGITS + 2];
+ char *p = buf + INT_DIGITS + 1; /* points to terminating '\0' */
+ if (i >= 0) {
+ do {
+ *--p = '0' + (i % 10);
+ i /= 10;
+ } while (i != 0);
+ return p;
+ }
+ else { /* i < 0 */
+ do {
+ *--p = '0' - (i % 10);
+ i /= 10;
+ } while (i != 0);
+ *--p = '-';
+ }
+ return p;
+}
+
+const char *ui_to_a(unsigned int i)
+{
+ /* Room for UINT_DIGITS digits and '\0' */
+ static char buf[UINT_DIGITS + 1];
+ char *p = buf + UINT_DIGITS; /* points to terminating '\0' */
+ do {
+ *--p = '0' + (i % 10);
+ i /= 10;
+ } while (i != 0);
+ return p;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/libs/libgroff/lf.cpp b/src/libs/libgroff/lf.cpp
new file mode 100644
index 0000000..9c255fb
--- /dev/null
+++ b/src/libs/libgroff/lf.cpp
@@ -0,0 +1,78 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+#include "cset.h"
+#include "stringclass.h"
+#include "lf.h"
+
+#include <ctype.h>
+
+extern void change_filename(const char *);
+extern void change_lineno(int);
+
+int interpret_lf_args(const char *p)
+{
+ while (*p == ' ')
+ p++;
+ if (!csdigit(*p))
+ return 0;
+ int ln = 0;
+ do {
+ ln *= 10;
+ ln += *p++ - '0';
+ } while (csdigit(*p));
+ if (*p != ' ' && *p != '\n' && *p != '\0')
+ return 0;
+ while (*p == ' ')
+ p++;
+ if (*p == '\0' || *p == '\n') {
+ change_lineno(ln);
+ return 1;
+ }
+ const char *q;
+ for (q = p;
+ *q != '\0' && *q != ' ' && *q != '\n' && *q != '\\';
+ q++)
+ ;
+ string tem(p, q - p);
+ while (*q == ' ')
+ q++;
+ if (*q != '\n' && *q != '\0')
+ return 0;
+ tem += '\0';
+ change_filename(tem.contents());
+ change_lineno(ln);
+ return 1;
+}
+
+#if defined(__MSDOS__) || (defined(_WIN32) && !defined(__CYGWIN__))
+void normalize_for_lf (string &fn)
+{
+ int fnlen = fn.length();
+ for (int i = 0; i < fnlen; i++) {
+ if (fn[i] == '\\')
+ fn[i] = '/';
+ }
+}
+#else
+void normalize_for_lf (string &)
+{
+}
+#endif
diff --git a/src/libs/libgroff/libgroff.am b/src/libs/libgroff/libgroff.am
new file mode 100644
index 0000000..be6d9e2
--- /dev/null
+++ b/src/libs/libgroff/libgroff.am
@@ -0,0 +1,182 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+libgroff_srcdir = $(top_srcdir)/src/libs/libgroff
+noinst_LIBRARIES += libgroff.a
+libgroff_a_CPPFLAGS = \
+ $(AM_CPPFLAGS) \
+ -D__GETOPT_PREFIX=groff_ \
+ -DENABLE_RELOCATABLE=1 \
+ -DLIBDIR=\"$(libdir)\"
+
+# Build from OBJS
+libgroff_a_SOURCES = \
+ src/libs/libgroff/assert.cpp \
+ src/libs/libgroff/change_lf.cpp \
+ src/libs/libgroff/cmap.cpp \
+ src/libs/libgroff/color.cpp \
+ src/libs/libgroff/cset.cpp\
+ src/libs/libgroff/curtime.cpp \
+ src/libs/libgroff/device.cpp \
+ src/libs/libgroff/errarg.cpp \
+ src/libs/libgroff/error.cpp \
+ src/libs/libgroff/fatal.cpp \
+ src/libs/libgroff/filename.cpp \
+ src/libs/libgroff/font.cpp \
+ src/libs/libgroff/fontfile.cpp \
+ src/libs/libgroff/geometry.cpp \
+ src/libs/libgroff/getopt.c \
+ src/libs/libgroff/getopt1.c \
+ src/libs/libgroff/glyphuni.cpp \
+ src/libs/libgroff/htmlhint.cpp \
+ src/libs/libgroff/hypot.cpp \
+ src/libs/libgroff/iftoa.c \
+ src/libs/libgroff/invalid.cpp \
+ src/libs/libgroff/itoa.c \
+ src/libs/libgroff/lf.cpp \
+ src/libs/libgroff/lineno.cpp \
+ src/libs/libgroff/localcharset.c \
+ src/libs/libgroff/macropath.cpp \
+ src/libs/libgroff/matherr.c \
+ src/libs/libgroff/maxfilename.cpp \
+ src/libs/libgroff/maxpathname.cpp \
+ src/libs/libgroff/mksdir.cpp \
+ src/libs/libgroff/nametoindex.cpp \
+ src/libs/libgroff/paper.cpp \
+ src/libs/libgroff/prime.cpp \
+ src/libs/libgroff/progname.c \
+ src/libs/libgroff/ptable.cpp \
+ src/libs/libgroff/quotearg.c \
+ src/libs/libgroff/relocate.cpp \
+ src/libs/libgroff/searchpath.cpp \
+ src/libs/libgroff/spawnvp.c \
+ src/libs/libgroff/string.cpp \
+ src/libs/libgroff/strsave.cpp \
+ src/libs/libgroff/symbol.cpp \
+ src/libs/libgroff/tmpfile.cpp \
+ src/libs/libgroff/tmpname.cpp \
+ src/libs/libgroff/unicode.cpp \
+ src/libs/libgroff/uniglyph.cpp \
+ src/libs/libgroff/uniuni.cpp \
+ src/libs/libgroff/relocatable.h
+if USE_GROFF_ALLOCATOR
+libgroff_a_SOURCES += \
+ src/libs/libgroff/new.cpp
+endif
+nodist_libgroff_a_SOURCES = src/libs/libgroff/version.cpp
+
+# TODO: these .c files could be removed (use gnulib instead).
+EXTRA_DIST += \
+ src/libs/libgroff/mkstemp.cpp \
+ src/libs/libgroff/fmod.c \
+ src/libs/libgroff/getcwd.c \
+ src/libs/libgroff/putenv.c \
+ src/libs/libgroff/strcasecmp.c \
+ src/libs/libgroff/strerror.c \
+ src/libs/libgroff/strncasecmp.c \
+ src/libs/libgroff/strtol.c \
+ src/libs/libgroff/config.charset \
+ src/libs/libgroff/ref-add.sin \
+ src/libs/libgroff/ref-del.sin \
+ src/libs/libgroff/make-uniuni
+
+CLEANFILES += \
+ src/libs/libgroff/version.cpp \
+ charset.alias \
+ ref-add.sed \
+ ref-del.sed
+
+# .o files have a 'libgroff_a-' prefix because we set
+# libgroff_a_CPPFLAGS.
+src/libs/libgroff/libgroff_a-device.$(OBJEXT): defs.h
+src/libs/libgroff/libgroff_a-fontfile.$(OBJEXT): defs.h
+src/libs/libgroff/libgroff_a-macropath.$(OBJEXT): defs.h
+src/libs/libgroff/libgroff_a-relocate.$(OBJEXT): defs.h
+
+src/libs/libgroff/version.cpp: $(top_srcdir)/.version
+ $(AM_V_at)printf 'const char *version_string = "%s.%s";\n' \
+ $(MAJOR_VERSION) $(MINOR_VERSION) > $@.tmp
+ $(AM_V_at)printf 'const char *revision_string = "%s";\n' \
+ $(REVISION) >> $@.tmp
+ $(AM_V_at)printf \
+ 'extern "C" {\nconst char *Version_string = "%s";\n}\n' \
+ $(VERSION) >> $@.tmp
+ $(AM_V_GEN)mv $@.tmp $@
+
+# Data for localcharset.c. Taken from libiconv/libcharset.
+
+LIBGROFF_PACKAGE = groff
+
+all: charset.alias ref-add.sed ref-del.sed
+
+charset.alias: $(libgroff_srcdir)/config.charset
+ $(AM_V_GEN)$(SHELL) $(libgroff_srcdir)/config.charset \
+ '$(HOST)' > t-$@ \
+ && mv t-$@ $@
+
+ref-add.sed: $(libgroff_srcdir)/ref-add.sin
+ $(AM_V_GEN)sed -e '/^#/d' \
+ -e 's/@''PACKAGE''@/$(LIBGROFF_PACKAGE)/g' \
+ $(libgroff_srcdir)/ref-add.sin > t-$@ \
+ && mv t-$@ $@
+
+ref-del.sed: $(libgroff_srcdir)/ref-del.sin
+ $(AM_V_GEN)sed -e '/^#/d' \
+ -e 's/@''PACKAGE''@/$(LIBGROFF_PACKAGE)/g' \
+ $(libgroff_srcdir)/ref-del.sin > t-$@ \
+ && mv t-$@ $@
+
+install-data-local: install_charset_data
+install_charset_data:
+ -test $(GLIBC21) != no || $(mkinstalldirs) $(DESTDIR)$(libdir)
+ if test -f $(DESTDIR)$(libdir)/charset.alias; then \
+ sed -f ref-add.sed $(DESTDIR)$(libdir)/charset.alias \
+ > $(DESTDIR)$(libdir)/t-charset.alias; \
+ $(INSTALL_DATA) $(DESTDIR)$(libdir)/t-charset.alias \
+ $(DESTDIR)$(libdir)/charset.alias; \
+ rm -f $(DESTDIR)$(libdir)/t-charset.alias; \
+ else \
+ if test $(GLIBC21) = no; then \
+ sed -f ref-add.sed charset.alias \
+ > $(DESTDIR)$(libdir)/t-charset.alias; \
+ $(INSTALL_DATA) $(DESTDIR)$(libdir)/t-charset.alias \
+ $(DESTDIR)$(libdir)/charset.alias; \
+ rm -f $(DESTDIR)$(libdir)/t-charset.alias; \
+ fi; \
+ fi
+
+uninstall-local: uninstall_charset_data
+uninstall_charset_data:
+ -if test -f $(DESTDIR)$(libdir)/charset.alias; then \
+ sed -f ref-del.sed $(DESTDIR)$(libdir)/charset.alias \
+ > $(DESTDIR)$(libdir)/t-charset.alias; \
+ if grep '^# Packages using this file: $$' \
+ $(DESTDIR)$(libdir)/t-charset.alias > /dev/null; then \
+ rm -f $(DESTDIR)$(libdir)/charset.alias; \
+ else \
+ $(INSTALL_DATA) $(DESTDIR)$(libdir)/t-charset.alias \
+ $(DESTDIR)$(libdir)/charset.alias; \
+ fi; \
+ rm -f $(DESTDIR)$(libdir)/t-charset.alias; \
+ fi
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/libs/libgroff/lineno.cpp b/src/libs/libgroff/lineno.cpp
new file mode 100644
index 0000000..6e356c7
--- /dev/null
+++ b/src/libs/libgroff/lineno.cpp
@@ -0,0 +1,20 @@
+/* Copyright (C) 2014-2020 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 of the License, 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.
+
+The GNU General Public License version 2 (GPL2) is available in the
+internet at <http://www.gnu.org/licenses/gpl-2.0.txt>. */
+
+// This global stores the line number of the input file being
+// processed by troff, an output driver, or other program.
+int current_lineno = 0;
diff --git a/src/libs/libgroff/localcharset.c b/src/libs/libgroff/localcharset.c
new file mode 100644
index 0000000..1bc07a4
--- /dev/null
+++ b/src/libs/libgroff/localcharset.c
@@ -0,0 +1,579 @@
+/* Determine a canonical name for the current locale's character encoding.
+
+ Copyright (C) 2000-2020 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "localcharset.h"
+
+#include <fcntl.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#if defined __APPLE__ && defined __MACH__ && HAVE_LANGINFO_CODESET
+# define DARWIN7 /* Darwin 7 or newer, i.e. Mac OS X 10.3 or newer */
+#endif
+
+#if defined _WIN32 || defined __WIN32__
+# define WINDOWS_NATIVE
+# include <locale.h>
+#endif
+
+#if defined __EMX__
+/* Assume EMX program runs on OS/2, even if compiled under DOS. */
+# ifndef OS2
+# define OS2
+# endif
+#endif
+
+#if !defined WINDOWS_NATIVE
+# include <unistd.h>
+# if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+# else
+# if 0 /* see comment below */
+# include <locale.h>
+# endif
+# endif
+# ifdef __CYGWIN__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# endif
+#elif defined WINDOWS_NATIVE
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+#if defined OS2
+# define INCL_DOS
+# include <os2.h>
+#endif
+
+/* For MB_CUR_MAX_L */
+#if defined DARWIN7
+# include <xlocale.h>
+#endif
+
+#if ENABLE_RELOCATABLE
+# include "relocatable.h"
+#else
+# define relocate(pathname) (pathname)
+#endif
+
+/* Get LIBDIR. */
+#ifndef LIBDIR
+# include "configmake.h"
+#endif
+
+/* Define O_NOFOLLOW to 0 on platforms where it does not exist. */
+#ifndef O_NOFOLLOW
+# define O_NOFOLLOW 0
+#endif
+
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+ /* Native Windows, Cygwin, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+#endif
+
+#ifndef DIRECTORY_SEPARATOR
+# define DIRECTORY_SEPARATOR '/'
+#endif
+
+#ifndef ISSLASH
+# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
+#endif
+
+#if HAVE_DECL_GETC_UNLOCKED
+# undef getc
+# define getc getc_unlocked
+#endif
+
+/* The following static variable is declared 'volatile' to avoid a
+ possible multithread problem in the function get_charset_aliases. If we
+ are running in a threaded environment, and if two threads initialize
+ 'charset_aliases' simultaneously, both will produce the same value,
+ and everything will be ok if the two assignments to 'charset_aliases'
+ are atomic. But I don't know what will happen if the two assignments mix. */
+#if __STDC__ != 1
+# define volatile /* empty */
+#endif
+/* Pointer to the contents of the charset.alias file, if it has already been
+ read, else NULL. Its format is:
+ ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */
+static const char * volatile charset_aliases;
+
+/* Return a pointer to the contents of the charset.alias file. */
+static const char *
+get_charset_aliases (void)
+{
+ const char *cp;
+
+ cp = charset_aliases;
+ if (cp == NULL)
+ {
+#if !(defined DARWIN7 || defined VMS || defined WINDOWS_NATIVE || defined __CYGWIN__)
+ const char *dir;
+ const char *base = "charset.alias";
+ char *file_name;
+
+ /* Make it possible to override the charset.alias location. This is
+ necessary for running the testsuite before "make install". */
+ dir = getenv ("CHARSETALIASDIR");
+ if (dir == NULL || dir[0] == '\0')
+ dir = relocate (LIBDIR);
+
+ /* Concatenate dir and base into freshly allocated file_name. */
+ {
+ size_t dir_len = strlen (dir);
+ size_t base_len = strlen (base);
+ int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1]));
+ file_name = (char *) malloc (dir_len + add_slash + base_len + 1);
+ if (file_name != NULL)
+ {
+ memcpy (file_name, dir, dir_len);
+ if (add_slash)
+ file_name[dir_len] = DIRECTORY_SEPARATOR;
+ memcpy (file_name + dir_len + add_slash, base, base_len + 1);
+ }
+ }
+
+ if (file_name == NULL)
+ /* Out of memory. Treat the file as empty. */
+ cp = "";
+ else
+ {
+ int fd;
+
+ /* Open the file. Reject symbolic links on platforms that support
+ O_NOFOLLOW. This is a security feature. Without it, an attacker
+ could retrieve parts of the contents (namely, the tail of the
+ first line that starts with "* ") of an arbitrary file by placing
+ a symbolic link to that file under the name "charset.alias" in
+ some writable directory and defining the environment variable
+ CHARSETALIASDIR to point to that directory. */
+ fd = open (file_name,
+ O_RDONLY | (HAVE_WORKING_O_NOFOLLOW ? O_NOFOLLOW : 0));
+ if (fd < 0)
+ /* File not found. Treat it as empty. */
+ cp = "";
+ else
+ {
+ FILE *fp;
+
+ fp = fdopen (fd, "r");
+ if (fp == NULL)
+ {
+ /* Out of memory. Treat the file as empty. */
+ close (fd);
+ cp = "";
+ }
+ else
+ {
+ /* Parse the file's contents. */
+ char *res_ptr = NULL;
+ size_t res_size = 0;
+
+ for (;;)
+ {
+ int c;
+ char buf1[50+1];
+ char buf2[50+1];
+ size_t l1, l2;
+ char *old_res_ptr;
+
+ c = getc (fp);
+ if (c == EOF)
+ break;
+ if (c == '\n' || c == ' ' || c == '\t')
+ continue;
+ if (c == '#')
+ {
+ /* Skip comment, to end of line. */
+ do
+ c = getc (fp);
+ while (!(c == EOF || c == '\n'));
+ if (c == EOF)
+ break;
+ continue;
+ }
+ ungetc (c, fp);
+ if (fscanf (fp, "%50s %50s", buf1, buf2) < 2)
+ break;
+ l1 = strlen (buf1);
+ l2 = strlen (buf2);
+ old_res_ptr = res_ptr;
+ if (res_size == 0)
+ {
+ res_size = l1 + 1 + l2 + 1;
+ res_ptr = (char *) malloc (res_size + 1);
+ }
+ else
+ {
+ res_size += l1 + 1 + l2 + 1;
+ res_ptr = (char *) realloc (res_ptr, res_size + 1);
+ }
+ if (res_ptr == NULL)
+ {
+ /* Out of memory. */
+ res_size = 0;
+ free (old_res_ptr);
+ break;
+ }
+ strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);
+ strcpy (res_ptr + res_size - (l2 + 1), buf2);
+ }
+ fclose (fp);
+ if (res_size == 0)
+ cp = "";
+ else
+ {
+ *(res_ptr + res_size) = '\0';
+ cp = res_ptr;
+ }
+ }
+ }
+
+ free (file_name);
+ }
+
+#else
+
+# if defined DARWIN7
+ /* To avoid the trouble of installing a file that is shared by many
+ GNU packages -- many packaging systems have problems with this --,
+ simply inline the aliases here. */
+ cp = "ISO8859-1" "\0" "ISO-8859-1" "\0"
+ "ISO8859-2" "\0" "ISO-8859-2" "\0"
+ "ISO8859-4" "\0" "ISO-8859-4" "\0"
+ "ISO8859-5" "\0" "ISO-8859-5" "\0"
+ "ISO8859-7" "\0" "ISO-8859-7" "\0"
+ "ISO8859-9" "\0" "ISO-8859-9" "\0"
+ "ISO8859-13" "\0" "ISO-8859-13" "\0"
+ "ISO8859-15" "\0" "ISO-8859-15" "\0"
+ "KOI8-R" "\0" "KOI8-R" "\0"
+ "KOI8-U" "\0" "KOI8-U" "\0"
+ "CP866" "\0" "CP866" "\0"
+ "CP949" "\0" "CP949" "\0"
+ "CP1131" "\0" "CP1131" "\0"
+ "CP1251" "\0" "CP1251" "\0"
+ "eucCN" "\0" "GB2312" "\0"
+ "GB2312" "\0" "GB2312" "\0"
+ "eucJP" "\0" "EUC-JP" "\0"
+ "eucKR" "\0" "EUC-KR" "\0"
+ "Big5" "\0" "BIG5" "\0"
+ "Big5HKSCS" "\0" "BIG5-HKSCS" "\0"
+ "GBK" "\0" "GBK" "\0"
+ "GB18030" "\0" "GB18030" "\0"
+ "SJIS" "\0" "SHIFT_JIS" "\0"
+ "ARMSCII-8" "\0" "ARMSCII-8" "\0"
+ "PT154" "\0" "PT154" "\0"
+ /*"ISCII-DEV" "\0" "?" "\0"*/
+ "*" "\0" "UTF-8" "\0";
+# endif
+
+# if defined VMS
+ /* To avoid the troubles of an extra file charset.alias_vms in the
+ sources of many GNU packages, simply inline the aliases here. */
+ /* The list of encodings is taken from the OpenVMS 7.3-1 documentation
+ "Compaq C Run-Time Library Reference Manual for OpenVMS systems"
+ section 10.7 "Handling Different Character Sets". */
+ cp = "ISO8859-1" "\0" "ISO-8859-1" "\0"
+ "ISO8859-2" "\0" "ISO-8859-2" "\0"
+ "ISO8859-5" "\0" "ISO-8859-5" "\0"
+ "ISO8859-7" "\0" "ISO-8859-7" "\0"
+ "ISO8859-8" "\0" "ISO-8859-8" "\0"
+ "ISO8859-9" "\0" "ISO-8859-9" "\0"
+ /* Japanese */
+ "eucJP" "\0" "EUC-JP" "\0"
+ "SJIS" "\0" "SHIFT_JIS" "\0"
+ "DECKANJI" "\0" "DEC-KANJI" "\0"
+ "SDECKANJI" "\0" "EUC-JP" "\0"
+ /* Chinese */
+ "eucTW" "\0" "EUC-TW" "\0"
+ "DECHANYU" "\0" "DEC-HANYU" "\0"
+ "DECHANZI" "\0" "GB2312" "\0"
+ /* Korean */
+ "DECKOREAN" "\0" "EUC-KR" "\0";
+# endif
+
+# if defined WINDOWS_NATIVE || defined __CYGWIN__
+ /* To avoid the troubles of installing a separate file in the same
+ directory as the DLL and of retrieving the DLL's directory at
+ runtime, simply inline the aliases here. */
+
+ cp = "CP936" "\0" "GBK" "\0"
+ "CP1361" "\0" "JOHAB" "\0"
+ "CP20127" "\0" "ASCII" "\0"
+ "CP20866" "\0" "KOI8-R" "\0"
+ "CP20936" "\0" "GB2312" "\0"
+ "CP21866" "\0" "KOI8-RU" "\0"
+ "CP28591" "\0" "ISO-8859-1" "\0"
+ "CP28592" "\0" "ISO-8859-2" "\0"
+ "CP28593" "\0" "ISO-8859-3" "\0"
+ "CP28594" "\0" "ISO-8859-4" "\0"
+ "CP28595" "\0" "ISO-8859-5" "\0"
+ "CP28596" "\0" "ISO-8859-6" "\0"
+ "CP28597" "\0" "ISO-8859-7" "\0"
+ "CP28598" "\0" "ISO-8859-8" "\0"
+ "CP28599" "\0" "ISO-8859-9" "\0"
+ "CP28605" "\0" "ISO-8859-15" "\0"
+ "CP38598" "\0" "ISO-8859-8" "\0"
+ "CP51932" "\0" "EUC-JP" "\0"
+ "CP51936" "\0" "GB2312" "\0"
+ "CP51949" "\0" "EUC-KR" "\0"
+ "CP51950" "\0" "EUC-TW" "\0"
+ "CP54936" "\0" "GB18030" "\0"
+ "CP65001" "\0" "UTF-8" "\0";
+# endif
+#endif
+
+ charset_aliases = cp;
+ }
+
+ return cp;
+}
+
+/* Determine the current locale's character encoding, and canonicalize it
+ into one of the canonical names listed in config.charset.
+ The result must not be freed; it is statically allocated.
+ If the canonical name cannot be determined, the result is a non-canonical
+ name. */
+
+#ifdef STATIC
+STATIC
+#endif
+const char *
+locale_charset (void)
+{
+ const char *codeset;
+ const char *aliases;
+
+#if !(defined WINDOWS_NATIVE || defined OS2)
+
+# if HAVE_LANGINFO_CODESET
+
+ /* Most systems support nl_langinfo (CODESET) nowadays. */
+ codeset = nl_langinfo (CODESET);
+
+# ifdef __CYGWIN__
+ /* Cygwin < 1.7 does not have locales. nl_langinfo (CODESET) always
+ returns "US-ASCII". Return the suffix of the locale name from the
+ environment variables (if present) or the codepage as a number. */
+ if (codeset != NULL && strcmp (codeset, "US-ASCII") == 0)
+ {
+ const char *locale;
+ static char buf[2 + 10 + 1];
+
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ }
+ if (locale != NULL && locale[0] != '\0')
+ {
+ /* If the locale name contains an encoding after the dot, return
+ it. */
+ const char *dot = strchr (locale, '.');
+
+ if (dot != NULL)
+ {
+ const char *modifier;
+
+ dot++;
+ /* Look for the possible @... trailer and remove it, if any. */
+ modifier = strchr (dot, '@');
+ if (modifier == NULL)
+ return dot;
+ if (modifier - dot < sizeof (buf))
+ {
+ memcpy (buf, dot, modifier - dot);
+ buf [modifier - dot] = '\0';
+ return buf;
+ }
+ }
+ }
+
+ /* The Windows API has a function returning the locale's codepage as a
+ number: GetACP(). This encoding is used by Cygwin, unless the user
+ has set the environment variable CYGWIN=codepage:oem (which very few
+ people do).
+ Output directed to console windows needs to be converted (to
+ GetOEMCP() if the console is using a raster font, or to
+ GetConsoleOutputCP() if it is using a TrueType font). Cygwin does
+ this conversion transparently (see winsup/cygwin/fhandler_console.cc),
+ converting to GetConsoleOutputCP(). This leads to correct results,
+ except when SetConsoleOutputCP has been called and a raster font is
+ in use. */
+ sprintf (buf, "CP%u", GetACP ());
+ codeset = buf;
+ }
+# endif
+
+# else
+
+ /* On old systems which lack it, use setlocale or getenv. */
+ const char *locale = NULL;
+
+ /* But most old systems don't have a complete set of locales. Some
+ (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't
+ use setlocale here; it would return "C" when it doesn't support the
+ locale name the user has set. */
+# if 0
+ locale = setlocale (LC_CTYPE, NULL);
+# endif
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ }
+ }
+
+ /* On some old systems, one used to set locale = "iso8859_1". On others,
+ you set it to "language_COUNTRY.charset". In any case, we resolve it
+ through the charset.alias file. */
+ codeset = locale;
+
+# endif
+
+#elif defined WINDOWS_NATIVE
+
+ static char buf[2 + 10 + 1];
+
+ /* The Windows API has a function returning the locale's codepage as
+ a number, but the value doesn't change according to what the
+ 'setlocale' call specified. So we use it as a last resort, in
+ case the string returned by 'setlocale' doesn't specify the
+ codepage. */
+ char *current_locale = setlocale (LC_ALL, NULL);
+ char *pdot;
+
+ /* If they set different locales for different categories,
+ 'setlocale' will return a semi-colon separated list of locale
+ values. To make sure we use the correct one, we choose LC_CTYPE. */
+ if (strchr (current_locale, ';'))
+ current_locale = setlocale (LC_CTYPE, NULL);
+
+ pdot = strrchr (current_locale, '.');
+ if (pdot)
+ sprintf (buf, "CP%s", pdot + 1);
+ else
+ {
+ /* The Windows API has a function returning the locale's codepage as a
+ number: GetACP().
+ When the output goes to a console window, it needs to be provided in
+ GetOEMCP() encoding if the console is using a raster font, or in
+ GetConsoleOutputCP() encoding if it is using a TrueType font.
+ But in GUI programs and for output sent to files and pipes, GetACP()
+ encoding is the best bet. */
+ sprintf (buf, "CP%u", GetACP ());
+ }
+ codeset = buf;
+
+#elif defined OS2
+
+ const char *locale;
+ static char buf[2 + 10 + 1];
+ ULONG cp[3];
+ ULONG cplen;
+
+ /* Allow user to override the codeset, as set in the operating system,
+ with standard language environment variables. */
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ }
+ if (locale != NULL && locale[0] != '\0')
+ {
+ /* If the locale name contains an encoding after the dot, return it. */
+ const char *dot = strchr (locale, '.');
+
+ if (dot != NULL)
+ {
+ const char *modifier;
+
+ dot++;
+ /* Look for the possible @... trailer and remove it, if any. */
+ modifier = strchr (dot, '@');
+ if (modifier == NULL)
+ return dot;
+ if (modifier - dot < sizeof (buf))
+ {
+ memcpy (buf, dot, modifier - dot);
+ buf [modifier - dot] = '\0';
+ return buf;
+ }
+ }
+
+ /* Resolve through the charset.alias file. */
+ codeset = locale;
+ }
+ else
+ {
+ /* OS/2 has a function returning the locale's codepage as a number. */
+ if (DosQueryCp (sizeof (cp), cp, &cplen))
+ codeset = "";
+ else
+ {
+ sprintf (buf, "CP%u", cp[0]);
+ codeset = buf;
+ }
+ }
+
+#endif
+
+ if (codeset == NULL)
+ /* The canonical name cannot be determined. */
+ codeset = "";
+
+ /* Resolve alias. */
+ for (aliases = get_charset_aliases ();
+ *aliases != '\0';
+ aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1)
+ if (strcmp (codeset, aliases) == 0
+ || (aliases[0] == '*' && aliases[1] == '\0'))
+ {
+ codeset = aliases + strlen (aliases) + 1;
+ break;
+ }
+
+ /* Don't return an empty string. GNU libc and GNU libiconv interpret
+ the empty string as denoting "the locale's character encoding",
+ thus GNU libiconv would call this function a second time. */
+ if (codeset[0] == '\0')
+ codeset = "ASCII";
+
+#ifdef DARWIN7
+ /* Mac OS X sets MB_CUR_MAX to 1 when LC_ALL=C, and "UTF-8"
+ (the default codeset) does not work when MB_CUR_MAX is 1. */
+ if (strcmp (codeset, "UTF-8") == 0 && MB_CUR_MAX_L (uselocale (NULL)) <= 1)
+ codeset = "ASCII";
+#endif
+
+ return codeset;
+}
diff --git a/src/libs/libgroff/macropath.cpp b/src/libs/libgroff/macropath.cpp
new file mode 100644
index 0000000..a9c9b35
--- /dev/null
+++ b/src/libs/libgroff/macropath.cpp
@@ -0,0 +1,29 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+#include "searchpath.h"
+#include "macropath.h"
+#include "defs.h"
+
+#define MACROPATH_ENVVAR "GROFF_TMAC_PATH"
+
+search_path macro_path(MACROPATH_ENVVAR, MACROPATH, 1, 1);
+search_path safer_macro_path(MACROPATH_ENVVAR, MACROPATH, 1, 0);
+search_path config_macro_path(MACROPATH_ENVVAR, MACROPATH, 0, 0);
diff --git a/src/libs/libgroff/make-uniuni b/src/libs/libgroff/make-uniuni
new file mode 100755
index 0000000..386eacd
--- /dev/null
+++ b/src/libs/libgroff/make-uniuni
@@ -0,0 +1,162 @@
+#! /bin/sh
+#
+# make-uniuni -- script for creating the file uniuni.cpp
+#
+# Copyright (C) 2005-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+#
+# usage:
+#
+# make-uniuni <version-string> < UnicodeData.txt > uniuni.cpp
+#
+# 'UnicodeData.txt' is the central database file from the Unicode standard.
+# Unfortunately, it doesn't contain a version number which must be thus
+# provided manually as a parameter to the filter.
+#
+# This program needs a C preprocessor.
+#
+
+CPP=cpp
+
+prog="$0"
+
+if test $# -ne 1; then
+ echo "usage: $0 <version-string> < UnicodeData.txt > uniuni.cpp"
+ exit 1
+fi
+
+version_string="$1"
+
+# Remove ranges and control characters,
+# then extract the decomposition field,
+# then remove lines without decomposition,
+# then remove all compatibility decompositions.
+sed -e '/^[^;]*;</d' \
+| sed -e 's/;[^;]*;[^;]*;[^;]*;[^;]*;\([^;]*\);.*$/;\1/' \
+| sed -e '/^[^;]*;$/d' \
+| sed -e '/^[^;]*;</d' > $$1
+
+# Prepare input for running cpp.
+cat $$1 \
+| sed -e 's/^\([^;]*\);/#define \1 /' \
+ -e 's/ / u/g' > $$2
+cat $$1 \
+| sed -e 's/^\([^;]*\);.*$/\1 u\1/' >> $$2
+
+# Run C preprocessor to recursively decompose.
+$CPP $$2 $$3
+
+# Convert it back to original format.
+cat $$3 \
+| sed -e '/#/d' \
+ -e '/^$/d' \
+ -e 's/ \+/ /g' \
+ -e 's/ *$//' \
+ -e 's/u//g' \
+ -e 's/^\([^ ]*\) /\1;/' > $$4
+
+# Write preamble.
+cat <<END
+// -*- C++ -*-
+/* Copyright (C) 2002-2014 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+// This code has been algorithmically derived from the file
+// UnicodeData.txt, version $version_string, available from unicode.org,
+// on `date '+%Y-%m-%d'`.
+
+#include "lib.h"
+#include "stringclass.h"
+#include "ptable.h"
+
+#include "unicode.h"
+
+struct unicode_decompose {
+ char *value;
+};
+
+declare_ptable(unicode_decompose)
+implement_ptable(unicode_decompose)
+
+PTABLE(unicode_decompose) unicode_decompose_table;
+
+// the first digit in the composite string gives the number of composites
+
+struct S {
+ const char *key;
+ const char *value;
+} unicode_decompose_list[] = {
+END
+
+# Emit Unicode data.
+cat $$4 \
+| sed -e 's/ /_/g' \
+ -e 's/\(.*\);\(.*_.*_.*_.*\)$/ { "\1", "4\2" },/' \
+ -e 's/\(.*\);\(.*_.*_.*\)$/ { "\1", "3\2" },/' \
+ -e 's/\(.*\);\(.*_.*\)$/ { "\1", "2\2" },/' \
+ -e 's/\(.*\);\(.*\)$/ { "\1", "1\2" },/'
+
+# Write postamble.
+cat <<END
+};
+
+// global constructor
+
+static struct unicode_decompose_init {
+ unicode_decompose_init();
+} _unicode_decompose_init;
+
+unicode_decompose_init::unicode_decompose_init()
+{
+ for (unsigned int i = 0;
+ i < sizeof(unicode_decompose_list)/sizeof(unicode_decompose_list[0]);
+ i++) {
+ unicode_decompose *dec = new unicode_decompose[1];
+ dec->value = (char *)unicode_decompose_list[i].value;
+ unicode_decompose_table.define(unicode_decompose_list[i].key, dec);
+ }
+}
+
+const char *decompose_unicode(const char *s)
+{
+ unicode_decompose *result = unicode_decompose_table.lookup(s);
+ return result ? result->value : 0;
+}
+END
+
+
+# Remove temporary files.
+rm $$1 $$2 $$3 $$4
+
+# EOF
diff --git a/src/libs/libgroff/matherr.c b/src/libs/libgroff/matherr.c
new file mode 100644
index 0000000..a1adbf8
--- /dev/null
+++ b/src/libs/libgroff/matherr.c
@@ -0,0 +1,48 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <math.h>
+#include <errno.h>
+
+#ifdef HAVE_STRUCT_EXCEPTION
+#ifdef TLOSS
+
+int matherr(exc)
+struct exception *exc;
+{
+ switch (exc->type) {
+ case SING:
+ case DOMAIN:
+ errno = EDOM;
+ break;
+ case OVERFLOW:
+ case UNDERFLOW:
+ case TLOSS:
+ case PLOSS:
+ errno = ERANGE;
+ break;
+ }
+ return 1;
+}
+
+#endif /* TLOSS */
+#endif /* HAVE_STRUCT_EXCEPTION */
diff --git a/src/libs/libgroff/maxfilename.cpp b/src/libs/libgroff/maxfilename.cpp
new file mode 100644
index 0000000..5e1defe
--- /dev/null
+++ b/src/libs/libgroff/maxfilename.cpp
@@ -0,0 +1,75 @@
+// -*- C++ -*-
+/* Copyright (C) 1992-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* file_name_max(dir) does the same as pathconf(dir, _PC_NAME_MAX) */
+
+#include "lib.h"
+
+#include <sys/types.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#ifdef _POSIX_VERSION
+
+size_t file_name_max(const char *fname)
+{
+ return pathconf(fname, _PC_NAME_MAX);
+}
+
+#else /* not _POSIX_VERSION */
+
+#ifdef HAVE_DIRENT_H
+#include <dirent.h>
+#else /* not HAVE_DIRENT_H */
+#ifdef HAVE_SYS_DIR_H
+#include <sys/dir.h>
+#endif /* HAVE_SYS_DIR_H */
+#endif /* not HAVE_DIRENT_H */
+
+#ifndef NAME_MAX
+#ifdef MAXNAMLEN
+#define NAME_MAX MAXNAMLEN
+#endif
+#endif
+
+#ifndef NAME_MAX
+#ifdef MAXNAMELEN
+#define NAME_MAX MAXNAMELEN
+#endif
+#endif
+
+#ifndef NAME_MAX
+#include <stdio.h>
+#ifdef FILENAME_MAX
+#define NAME_MAX FILENAME_MAX
+#endif
+#endif
+
+#ifndef NAME_MAX
+#define NAME_MAX 14
+#endif
+
+size_t file_name_max(const char *)
+{
+ return NAME_MAX;
+}
+
+#endif /* not _POSIX_VERSION */
diff --git a/src/libs/libgroff/maxpathname.cpp b/src/libs/libgroff/maxpathname.cpp
new file mode 100644
index 0000000..8041eeb
--- /dev/null
+++ b/src/libs/libgroff/maxpathname.cpp
@@ -0,0 +1,70 @@
+// -*- C++ -*-
+/* Copyright (C) 2005-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* path_name_max(dir) does the same as pathconf(dir, _PC_PATH_MAX) */
+
+#include "lib.h"
+
+#include <sys/types.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#ifdef _POSIX_VERSION
+
+size_t path_name_max()
+{
+ return pathconf("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf("/",_PC_PATH_MAX);
+}
+
+#else /* not _POSIX_VERSION */
+
+#include <stdlib.h>
+
+#ifdef HAVE_DIRENT_H
+# include <dirent.h>
+#else /* not HAVE_DIRENT_H */
+# ifdef HAVE_SYS_DIR_H
+# include <sys/dir.h>
+# endif /* HAVE_SYS_DIR_H */
+#endif /* not HAVE_DIRENT_H */
+
+#ifndef PATH_MAX
+# ifdef MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+# else /* !MAXPATHLEN */
+# ifdef MAX_PATH
+# define PATH_MAX MAX_PATH
+# else /* !MAX_PATH */
+# ifdef _MAX_PATH
+# define PATH_MAX _MAX_PATH
+# else /* !_MAX_PATH */
+# define PATH_MAX 255
+# endif /* !_MAX_PATH */
+# endif /* !MAX_PATH */
+# endif /* !MAXPATHLEN */
+#endif /* !PATH_MAX */
+
+size_t path_name_max()
+{
+ return PATH_MAX;
+}
+
+#endif /* not _POSIX_VERSION */
diff --git a/src/libs/libgroff/mksdir.cpp b/src/libs/libgroff/mksdir.cpp
new file mode 100644
index 0000000..5fa6d28
--- /dev/null
+++ b/src/libs/libgroff/mksdir.cpp
@@ -0,0 +1,33 @@
+/* Copyright (C) 2001-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+/* This file is heavily based on the file mkstemp.c which is part of the
+ fileutils package. */
+
+
+extern int gen_tempname(char *, int = 0);
+
+/* Generate a unique temporary directory name from TEMPLATE.
+ The last six characters of TEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the filename unique.
+ Then open the directory and return a fd. */
+int mksdir(char *tmpl)
+{
+ return gen_tempname(tmpl, 1);
+}
diff --git a/src/libs/libgroff/mkstemp.cpp b/src/libs/libgroff/mkstemp.cpp
new file mode 100644
index 0000000..089a10a
--- /dev/null
+++ b/src/libs/libgroff/mkstemp.cpp
@@ -0,0 +1,33 @@
+/* Copyright (C) 2001-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+/* This file is heavily based on the file mkstemp.c which is part of the
+ fileutils package. */
+
+
+extern int gen_tempname(char *, int);
+
+/* Generate a unique temporary file name from TEMPLATE.
+ The last six characters of TEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the filename unique.
+ Then open the file and return a fd. */
+int mkstemp(char *tmpl)
+{
+ return gen_tempname(tmpl, 0);
+}
diff --git a/src/libs/libgroff/nametoindex.cpp b/src/libs/libgroff/nametoindex.cpp
new file mode 100644
index 0000000..095a432
--- /dev/null
+++ b/src/libs/libgroff/nametoindex.cpp
@@ -0,0 +1,167 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <assert.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+#include "errarg.h"
+#include "error.h"
+#include "font.h"
+#include "ptable.h"
+#include "itable.h"
+
+// Every glyphinfo is actually a charinfo.
+class charinfo : glyph {
+public:
+ const char *name; // The glyph name, or a null pointer.
+ friend class character_indexer;
+};
+
+// PTABLE(charinfo) is a hash table mapping 'const char *' to 'charinfo *'.
+declare_ptable(charinfo)
+implement_ptable(charinfo)
+
+// ITABLE(charinfo) is a hash table mapping 'int >= 0' to 'charinfo *'.
+declare_itable(charinfo)
+implement_itable(charinfo)
+
+// This class is as a registry storing all named and numbered glyphs known
+// so far, and assigns a unique index to each glyph.
+class character_indexer {
+public:
+ character_indexer();
+ ~character_indexer();
+ // --------------------- Lookup or creation of a glyph.
+ glyph *ascii_char_glyph(unsigned char);
+ glyph *named_char_glyph(const char *);
+ glyph *numbered_char_glyph(int);
+private:
+ int next_index; // Number of glyphs already allocated.
+ PTABLE(charinfo) table; // Table mapping name to glyph.
+ glyph *ascii_glyph[256]; // Shorthand table for looking up "charNNN"
+ // glyphs.
+ ITABLE(charinfo) ntable; // Table mapping number to glyph.
+ enum { NSMALL = 256 };
+ glyph *small_number_glyph[NSMALL]; // Shorthand table for looking up
+ // numbered glyphs with small numbers.
+};
+
+character_indexer::character_indexer()
+: next_index(0)
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ ascii_glyph[i] = UNDEFINED_GLYPH;
+ for (i = 0; i < NSMALL; i++)
+ small_number_glyph[i] = UNDEFINED_GLYPH;
+}
+
+character_indexer::~character_indexer()
+{
+}
+
+glyph *character_indexer::ascii_char_glyph(unsigned char c)
+{
+ if (ascii_glyph[c] == UNDEFINED_GLYPH) {
+ char buf[4+3+1];
+ memcpy(buf, "char", 4);
+ strcpy(buf + 4, i_to_a(c));
+ charinfo *ci = new charinfo;
+ ci->index = next_index++;
+ ci->number = -1;
+ ci->name = strsave(buf);
+ ascii_glyph[c] = ci;
+ }
+ return ascii_glyph[c];
+}
+
+inline glyph *character_indexer::named_char_glyph(const char *s)
+{
+ // Glyphs with name 'charNNN' are only stored in ascii_glyph[], not
+ // in the table. Therefore treat them specially here.
+ if (s[0] == 'c' && s[1] == 'h' && s[2] == 'a' && s[3] == 'r') {
+ char *val;
+ long n = strtol(s + 4, &val, 10);
+ if (val != s + 4 && *val == '\0' && n >= 0 && n < 256)
+ return ascii_char_glyph((unsigned char)n);
+ }
+ charinfo *ci = table.lookupassoc(&s);
+ if (0 == ci) {
+ ci = new charinfo[1];
+ ci->index = next_index++;
+ ci->number = -1;
+ ci->name = table.define(s, ci);
+ }
+ return ci;
+}
+
+inline glyph *character_indexer::numbered_char_glyph(int n)
+{
+ if (n >= 0 && n < NSMALL) {
+ if (small_number_glyph[n] == UNDEFINED_GLYPH) {
+ charinfo *ci = new charinfo;
+ ci->index = next_index++;
+ ci->number = n;
+ ci->name = 0;
+ small_number_glyph[n] = ci;
+ }
+ return small_number_glyph[n];
+ }
+ charinfo *ci = ntable.lookup(n);
+ if (0 == ci) {
+ ci = new charinfo[1];
+ ci->index = next_index++;
+ ci->number = n;
+ ci->name = 0;
+ ntable.define(n, ci);
+ }
+ return ci;
+}
+
+static character_indexer indexer;
+
+glyph *number_to_glyph(int n)
+{
+ return indexer.numbered_char_glyph(n);
+}
+
+// troff overrides this function with its own version.
+
+glyph *name_to_glyph(const char *s)
+{
+ assert(s != 0 && s[0] != '\0' && s[0] != ' ');
+ if (s[1] == '\0')
+ // \200 and char128 are synonyms
+ return indexer.ascii_char_glyph(s[0]);
+ return indexer.named_char_glyph(s);
+}
+
+const char *glyph_to_name(glyph *g)
+{
+ charinfo *ci = (charinfo *)g; // Every glyph is actually a charinfo.
+ return ci->name;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/libs/libgroff/new.cpp b/src/libs/libgroff/new.cpp
new file mode 100644
index 0000000..2af976c
--- /dev/null
+++ b/src/libs/libgroff/new.cpp
@@ -0,0 +1,75 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "posix.h"
+#include "nonposix.h"
+
+extern "C" const char *program_name;
+
+static void ewrite(const char *s)
+{
+ write(2, s, strlen(s));
+}
+
+void *operator new(size_t size)
+{
+ // Avoid relying on the behaviour of malloc(0).
+ if (size == 0)
+ size++;
+ char *p = (char *)malloc(unsigned(size));
+ if (p == 0) {
+ if (program_name) {
+ ewrite(program_name);
+ ewrite(": ");
+ }
+ ewrite("out of memory\n");
+ _exit(-1);
+ }
+ return p;
+}
+
+void operator delete(void *p) throw()
+{
+ if (p)
+ free(p);
+}
+
+void operator delete(void *p,
+ __attribute__((__unused__)) long unsigned int size)
+{
+ // It's ugly to duplicate the code from delete(void *) above, but if
+ // we don't, g++ 6.3 can't figure out we're calling through it to
+ // free().
+ //
+ // In function 'void operator delete(void*, long unsigned int)':
+ // warning: deleting 'void*' is undefined [-Wdelete-incomplete]
+ //delete p;
+ if (p)
+ free(p);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/libs/libgroff/paper.cpp b/src/libs/libgroff/paper.cpp
new file mode 100644
index 0000000..842f369
--- /dev/null
+++ b/src/libs/libgroff/paper.cpp
@@ -0,0 +1,82 @@
+// -*- C++ -*-
+/* Copyright (C) 2002-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+#include "paper.h"
+
+paper papersizes[NUM_PAPERSIZES];
+
+// length and width in mm
+static void add_iso_paper(char series, int offset,
+ int start_length, int start_width)
+{
+ int length = start_length;
+ int width = start_width;
+ for (int i = 0; i < 8; i++)
+ {
+ char *p = new char[3];
+ p[0] = series;
+ p[1] = '0' + i;
+ p[2] = '\0';
+ papersizes[offset + i].name = p;
+ // convert mm to inch
+ papersizes[offset + i].length = (double)length / 25.4;
+ papersizes[offset + i].width = (double)width / 25.4;
+ // after division by two, values must be rounded down to the next
+ // integer (as specified by ISO)
+ int tmp = length;
+ length = width;
+ width = tmp / 2;
+ }
+}
+
+// length and width in inch
+static void add_american_paper(const char *name, int idx,
+ double length, double width )
+{
+ char *p = new char[strlen(name) + 1];
+ strcpy(p, name);
+ papersizes[idx].name = p;
+ papersizes[idx].length = length;
+ papersizes[idx].width = width;
+}
+
+int papersize_init::initialised = 0;
+
+papersize_init::papersize_init()
+{
+ if (initialised)
+ return;
+ initialised = 1;
+ add_iso_paper('a', 0, 1189, 841);
+ add_iso_paper('b', 8, 1414, 1000);
+ add_iso_paper('c', 16, 1297, 917);
+ add_iso_paper('d', 24, 1090, 771);
+ add_american_paper("letter", 32, 11, 8.5);
+ add_american_paper("legal", 33, 14, 8.5);
+ add_american_paper("tabloid", 34, 17, 11);
+ add_american_paper("ledger", 35, 11, 17);
+ add_american_paper("statement", 36, 8.5, 5.5);
+ add_american_paper("executive", 37, 10, 7.5);
+ // the next three entries are for grolj4
+ add_american_paper("com10", 38, 9.5, 4.125);
+ add_american_paper("monarch", 39, 7.5, 3.875);
+ // this is an ISO format, but it easier to use add_american_paper
+ add_american_paper("dl", 40, 220/25.4, 110/25.4);
+}
diff --git a/src/libs/libgroff/prime.cpp b/src/libs/libgroff/prime.cpp
new file mode 100644
index 0000000..5ae068d
--- /dev/null
+++ b/src/libs/libgroff/prime.cpp
@@ -0,0 +1,55 @@
+/* Copyright (C) 2014-2020 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 of the License, 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.
+
+The GNU General Public License version 2 (GPL2) is available in the
+internet at <http://www.gnu.org/licenses/gpl-2.0.txt>. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <assert.h>
+#include <math.h>
+
+bool is_prime(unsigned n)
+{
+ assert(n > 1);
+ if (n <= 3)
+ return true;
+ if (!(n & 1))
+ return false;
+ if (n % 3 == 0)
+ return false;
+ unsigned lim = unsigned(sqrt((double)n));
+ unsigned d = 5;
+ for (;;) {
+ if (d > lim)
+ break;
+ if (n % d == 0)
+ return false;
+ d += 2;
+ if (d > lim)
+ break;
+ if (n % d == 0)
+ return false;
+ d += 4;
+ }
+ return true;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/libs/libgroff/progname.c b/src/libs/libgroff/progname.c
new file mode 100644
index 0000000..f4320c1
--- /dev/null
+++ b/src/libs/libgroff/progname.c
@@ -0,0 +1,18 @@
+/* Copyright (C) 2014-2020 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 of the License, 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.
+
+The GNU General Public License version 2 (GPL2) is available in the
+internet at <http://www.gnu.org/licenses/gpl-2.0.txt>. */
+
+const char *program_name = 0;
diff --git a/src/libs/libgroff/ptable.cpp b/src/libs/libgroff/ptable.cpp
new file mode 100644
index 0000000..52d09f8
--- /dev/null
+++ b/src/libs/libgroff/ptable.cpp
@@ -0,0 +1,57 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "ptable.h"
+#include "errarg.h"
+#include "error.h"
+
+unsigned long hash_string(const char *s)
+{
+ // This is the mythical Aho-Hopcroft-Ullman hash function.
+ // TODO: Improve. See http://www.haible.de/bruno/hashfunc.html
+ assert(s != 0);
+ unsigned long h = 0, g;
+ while (*s != 0) {
+ h <<= 4;
+ h += *s++;
+ if ((g = h & 0xf0000000) != 0) {
+ h ^= g >> 24;
+ h ^= g;
+ }
+ }
+ return h;
+}
+
+static const unsigned table_sizes[] = {
+ 101, 503, 1009, 2003, 3001, 4001, 5003, 10007, 20011, 40009,
+ 80021, 160001, 500009, 1000003, 2000003, 4000037, 8000009,
+ 16000057, 32000011, 64000031, 128000003, 0
+};
+
+unsigned next_ptable_size(unsigned n)
+{
+ const unsigned *p;
+ for (p = table_sizes; *p <= n; p++)
+ if (*p == 0)
+ fatal("cannot expand table");
+ return *p;
+}
+
+// end of ptable.cpp
diff --git a/src/libs/libgroff/putenv.c b/src/libs/libgroff/putenv.c
new file mode 100644
index 0000000..692a126
--- /dev/null
+++ b/src/libs/libgroff/putenv.c
@@ -0,0 +1,97 @@
+/* Copyright (C) 1991-2020 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Hacked slightly by jjc@jclark.com for groff. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+
+#ifdef __STDC__
+#include <stddef.h>
+typedef void *PTR;
+typedef size_t SIZE_T;
+#else /* not __STDC__ */
+typedef char *PTR;
+typedef int SIZE_T;
+#endif /* not __STDC__ */
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#else /* not HAVE_STDLIB_H */
+PTR malloc();
+#endif /* not HAVE_STDLIB_H */
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+extern char **environ;
+
+/* Put STRING, which is of the form 'NAME=VALUE', in the environment. */
+
+int putenv(const char *string)
+{
+ char *name_end = strchr(string, '=');
+ SIZE_T size;
+ char **ep;
+
+ if (name_end == NULL)
+ {
+ /* Remove the variable from the environment. */
+ size = strlen(string);
+ for (ep = environ; *ep != NULL; ++ep)
+ if (!strncmp(*ep, string, size) && (*ep)[size] == '=')
+ {
+ while (ep[1] != NULL)
+ {
+ ep[0] = ep[1];
+ ++ep;
+ }
+ *ep = NULL;
+ return 0;
+ }
+ }
+
+ size = 0;
+ for (ep = environ; *ep != NULL; ++ep)
+ if (!strncmp(*ep, string, name_end - string)
+ && (*ep)[name_end - string] == '=')
+ break;
+ else
+ ++size;
+
+ if (*ep == NULL)
+ {
+ static char **last_environ = NULL;
+ char **new_environ = (char **) malloc((size + 2) * sizeof(char *));
+ if (new_environ == NULL)
+ return -1;
+ (void) memcpy((PTR) new_environ, (PTR) environ, size * sizeof(char *));
+ new_environ[size] = (char *) string;
+ new_environ[size + 1] = NULL;
+ if (last_environ != NULL)
+ free((PTR) last_environ);
+ last_environ = new_environ;
+ environ = new_environ;
+ }
+ else
+ *ep = (char *) string;
+
+ return 0;
+}
diff --git a/src/libs/libgroff/quotearg.c b/src/libs/libgroff/quotearg.c
new file mode 100644
index 0000000..75eaca8
--- /dev/null
+++ b/src/libs/libgroff/quotearg.c
@@ -0,0 +1,213 @@
+/* Copyright (C) 2004-2020 Free Software Foundation, Inc.
+ Written by: Jeff Conrad (jeff_conrad@msn.com)
+ and 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+
+/* Define the default mechanism, and messages, for error reporting
+ * (user may substitute a preferred alternative, by defining his own
+ * implementation of the macros REPORT_ERROR, QUOTE_ARG_MALLOC_FAILED
+ * and QUOTE_ARG_REALLOC_FAILED, in the header file 'nonposix.h').
+ */
+
+#include "nonposix.h"
+
+#ifndef REPORT_ERROR
+# define REPORT_ERROR(WHY) fprintf(stderr, "%s:%s\n", program_name, WHY)
+#endif
+#ifndef QUOTE_ARG_MALLOC_ERROR
+# define QUOTE_ARG_MALLOC_ERROR "malloc: Buffer allocation failed"
+#endif
+#ifndef QUOTE_ARG_REALLOC_ERROR
+# define QUOTE_ARG_REALLOC_ERROR "realloc: Buffer resize failed"
+#endif
+
+extern char *program_name; /* main program must define this */
+
+/* Prototypes */
+char *quote_arg(char *);
+void purge_quoted_args(char **);
+
+#undef FALSE
+#undef TRUE
+#define FALSE 0
+#define TRUE 1
+
+static int
+needs_quoting(const char *string)
+{
+ /* Scan 'string' to see whether it needs quoting for MSVC 'spawn'/'exec'
+ * (i.e., whether it contains whitespace or embedded quotes).
+ */
+
+ if (string == NULL) /* ignore NULL strings */
+ return FALSE;
+
+ if (*string == '\0') /* explicit arguments of zero length */
+ return TRUE; /* need quoting, so they aren't discarded */
+
+ while (*string) {
+ /* Scan non-NULL strings, up to '\0' terminator,
+ * returning 'TRUE' if quote or white space found.
+ */
+
+ if (*string == '"' || isspace(*string))
+ return TRUE;
+
+ /* otherwise, continue scanning to end of string */
+
+ ++string;
+ }
+
+ /* Fall through, if no quotes or white space found,
+ * in which case, return 'FALSE'.
+ */
+
+ return FALSE;
+}
+
+char *
+quote_arg(char *string)
+{
+ /* Enclose arguments in double quotes so that the parsing done in the
+ * MSVC runtime startup code doesn't split them at whitespace. Escape
+ * embedded double quotes so that they emerge intact from the parsing.
+ */
+
+ int backslashes;
+ char *quoted, *p, *q;
+
+ if (needs_quoting(string)) {
+ /* Need to create a quoted copy of 'string';
+ * maximum buffer space needed is twice the original length,
+ * plus two enclosing quotes and one '\0' terminator.
+ */
+
+ if ((quoted = (char *)malloc(2 * strlen(string) + 3)) == NULL) {
+ /* Couldn't get a buffer for the quoted string,
+ * so complain, and bail out gracefully.
+ */
+
+ REPORT_ERROR(QUOTE_ARG_MALLOC_ERROR);
+ exit(1);
+ }
+
+ /* Ok to proceed:
+ * insert the opening quote, then copy the source string,
+ * adding escapes as required.
+ */
+
+ *quoted = '"';
+ for (backslashes = 0, p = string, q = quoted; *p; p++) {
+ if (*p == '\\') {
+ /* Just count backslashes when we find them.
+ * We will copy them out later, when we know if the count
+ * needs to be adjusted, to escape an embedded quote.
+ */
+
+ ++backslashes;
+ }
+ else if (*p == '"') {
+ /* This embedded quote character must be escaped,
+ * but first double up any immediately preceding backslashes,
+ * with one extra, as the escape character.
+ */
+
+ for (backslashes += backslashes + 1; backslashes; backslashes--)
+ *++q = '\\';
+
+ /* and now, add the quote character itself */
+
+ *++q = '"';
+ }
+ else {
+ /* Any other character is simply copied,
+ * but first, if we have any pending backslashes,
+ * we must now insert them, without any count adjustment.
+ */
+
+ while (backslashes) {
+ *++q = '\\';
+ --backslashes;
+ }
+
+ /* and then, copy the current character */
+
+ *++q = *p;
+ }
+ }
+
+ /* At end of argument:
+ * If any backslashes remain to be copied out, append them now,
+ * doubling the actual count to protect against reduction by MSVC,
+ * as a consequence of the immediately following closing quote.
+ */
+
+ for (backslashes += backslashes; backslashes; backslashes--)
+ *++q = '\\';
+
+ /* Finally,
+ * add the closing quote, terminate the quoted string,
+ * and adjust its size to what was actually required,
+ * ready for return.
+ */
+
+ *++q = '"';
+ *++q = '\0';
+ if ((string = (char *)realloc(quoted, strlen(quoted) + 1)) == NULL) {
+ /* but bail out gracefully, on error */
+
+ REPORT_ERROR(QUOTE_ARG_REALLOC_ERROR);
+ exit(1);
+ }
+ }
+
+ /* 'string' now refers to the argument,
+ * quoted and escaped, as required.
+ */
+
+ return string;
+}
+
+void
+purge_quoted_args(char **argv)
+{
+ /* To avoid memory leaks,
+ * free all memory previously allocated by 'quoted_arg()',
+ * within the scope of the referring argument vector, 'argv'.
+ */
+
+ if (argv)
+ while (*argv) {
+ /* Any argument beginning with a double quote
+ * SHOULD have been allocated by 'quoted_arg()'.
+ */
+
+ if (**argv == '"')
+ free( *argv ); /* so free its allocation */
+ ++argv; /* and continue to the next argument */
+ }
+}
+
+/* quotearg.c: end of file */
diff --git a/src/libs/libgroff/ref-add.sin b/src/libs/libgroff/ref-add.sin
new file mode 100644
index 0000000..50aa7d1
--- /dev/null
+++ b/src/libs/libgroff/ref-add.sin
@@ -0,0 +1,29 @@
+# Add this package to a list of references stored in a text file.
+#
+# Copyright (C) 2000-2020 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# Written by Bruno Haible <haible@clisp.cons.org>.
+#
+/^# Packages using this file: / {
+ s/# Packages using this file://
+ ta
+ :a
+ s/ @PACKAGE@ / @PACKAGE@ /
+ tb
+ s/ $/ @PACKAGE@ /
+ :b
+ s/^/# Packages using this file:/
+}
diff --git a/src/libs/libgroff/ref-del.sin b/src/libs/libgroff/ref-del.sin
new file mode 100644
index 0000000..1601469
--- /dev/null
+++ b/src/libs/libgroff/ref-del.sin
@@ -0,0 +1,24 @@
+# Remove this package from a list of references stored in a text file.
+#
+# Copyright (C) 2000-2020 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# Written by Bruno Haible <haible@clisp.cons.org>.
+#
+/^# Packages using this file: / {
+ s/# Packages using this file://
+ s/ @PACKAGE@ / /
+ s/^/# Packages using this file:/
+}
diff --git a/src/libs/libgroff/relocatable.h b/src/libs/libgroff/relocatable.h
new file mode 100644
index 0000000..f152194
--- /dev/null
+++ b/src/libs/libgroff/relocatable.h
@@ -0,0 +1,19 @@
+/* Copyright (C) 2014-2020 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 of the License, 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.
+
+The GNU General Public License version 2 (GPL2) is available in the
+internet at <http://www.gnu.org/licenses/gpl-2.0.txt>. */
+
+#include "relocate.h"
+#define relocate(path) relocatep(path)
diff --git a/src/libs/libgroff/relocate.cpp b/src/libs/libgroff/relocate.cpp
new file mode 100644
index 0000000..32a0e2e
--- /dev/null
+++ b/src/libs/libgroff/relocate.cpp
@@ -0,0 +1,244 @@
+/* Provide relocation for macro and font files.
+ Copyright (C) 2005-2020 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation, either version 3 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+// Made after relocation code in kpathsea and gettext.
+
+#include "lib.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+
+#include "defs.h"
+#include "posix.h"
+#include "nonposix.h"
+#include "relocate.h"
+
+#if defined _WIN32
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#define INSTALLPATHLEN (sizeof(INSTALLPATH) - 1)
+#ifndef DEBUG
+# define DEBUG 0
+#endif
+
+extern "C" const char *program_name;
+
+// The prefix (parent directory) corresponding to the binary.
+char *curr_prefix = 0;
+size_t curr_prefix_len = 0;
+
+// Return the directory part of a filename, or '.' if no path separators.
+char *xdirname(char *s)
+{
+ static const char dot[] = ".";
+ if (!s)
+ return 0;
+ // DIR_SEPS[] are possible directory separator characters, see nonposix.h.
+ // We want the rightmost separator of all possible ones.
+ // Example: d:/foo\\bar.
+ char *p = strrchr(s, DIR_SEPS[0]);
+ const char *sep = &DIR_SEPS[1];
+ while (*sep) {
+ char *p1 = strrchr(s, *sep);
+ if (p1 && (!p || p1 > p))
+ p = p1;
+ sep++;
+ }
+ if (p)
+ *p = '\0';
+ else
+ s = (char *)dot;
+ return s;
+}
+
+// Return the full path of NAME along the path PATHP.
+// Adapted from search_path::open_file in searchpath.cpp.
+char *searchpath(const char *name, const char *pathp)
+{
+ char *path;
+ if (!name || !*name)
+ return 0;
+#if DEBUG
+ fprintf(stderr, "searchpath: pathp: '%s'\n", pathp);
+ fprintf(stderr, "searchpath: trying '%s'\n", name);
+#endif
+ // Try first NAME as such; success if NAME is an absolute filename,
+ // or if NAME is found in the current directory.
+ if (!access (name, F_OK)) {
+ path = new char[path_name_max()];
+#ifdef _WIN32
+ path = _fullpath(path, name, path_name_max());
+#else
+ path = realpath(name, path);
+#endif
+#if DEBUG
+ fprintf(stderr, "searchpath: found '%s'\n", path);
+#endif
+ return path;
+ }
+ // Secondly, try the current directory.
+ // Now search along PATHP.
+ size_t namelen = strlen(name);
+ char *p = (char *)pathp;
+ for (;;) {
+ char *end = strchr(p, PATH_SEP_CHAR);
+ if (!end)
+ end = strchr(p, '\0');
+ int need_slash = end > p && strchr(DIR_SEPS, end[-1]) == 0;
+ path = new char[end - p + need_slash + namelen + 1];
+ memcpy(path, p, end - p);
+ if (need_slash)
+ path[end - p] = '/';
+ strcpy(path + (end - p) + need_slash, name);
+#if DEBUG
+ fprintf(stderr, "searchpath: trying '%s'\n", path);
+#endif
+ if (!access(path, F_OK)) {
+#if DEBUG
+ fprintf(stderr, "searchpath: found '%s'\n", name);
+#endif
+ return path;
+ }
+ delete[] path;
+ if (*end == '\0')
+ break;
+ p = end + 1;
+ }
+ return 0;
+}
+
+// Search NAME along PATHP with the elements of PATHEXT in turn added.
+char *searchpathext(const char *name, const char *pathext, const char *pathp)
+{
+ char *found = 0;
+ char *tmpathext = strsave(pathext); // strtok modifies this string,
+ // so make a copy
+ char *ext = strtok(tmpathext, PATH_SEP);
+ while (ext) {
+ char *namex = new char[strlen(name) + strlen(ext) + 1];
+ strcpy(namex, name);
+ strcat(namex, ext);
+ found = searchpath(namex, pathp);
+ delete[] namex;
+ if (found)
+ break;
+ ext = strtok(0, PATH_SEP);
+ }
+ delete[] tmpathext;
+ return found;
+}
+
+// Convert an MS path to a POSIX path.
+char *msw2posixpath(char *path)
+{
+ char *s = path;
+ while (*s) {
+ if (*s == '\\')
+ *s = '/';
+ s++;
+ }
+ return path;
+}
+
+// Compute the current prefix.
+void set_current_prefix()
+{
+ // Obtain the full path of the current binary;
+ // using GetModuleFileName on MS-Windows,
+ // and searching along PATH on other systems.
+#ifdef _WIN32
+ char *pathextstr;
+ curr_prefix = new char[path_name_max()];
+ int len = GetModuleFileName(0, curr_prefix, path_name_max());
+ if (len)
+ len = GetShortPathName(curr_prefix, curr_prefix, path_name_max());
+# if DEBUG
+ fprintf(stderr, "curr_prefix: %s\n", curr_prefix);
+# endif /* DEBUG */
+ if (!curr_prefix && !strchr(program_name, '.')) { // try with extensions
+ pathextstr = strsave(getenv("PATHEXT"));
+ if (!pathextstr)
+ pathextstr = strsave(PATH_EXT);
+ curr_prefix = searchpathext(program_name, pathextstr, getenv("PATH"));
+ delete[] pathextstr;
+ }
+#else /* !_WIN32 */
+ curr_prefix = searchpath(program_name, getenv("PATH"));
+ if (!curr_prefix)
+ return;
+#endif /* !_WIN32 */
+ msw2posixpath(curr_prefix);
+#if DEBUG
+ fprintf(stderr, "curr_prefix: %s\n", curr_prefix);
+#endif
+ curr_prefix = xdirname(curr_prefix); // directory of executable
+ curr_prefix = xdirname(curr_prefix); // parent directory of executable
+ curr_prefix_len = strlen(curr_prefix);
+#if DEBUG
+ fprintf(stderr, "curr_prefix: %s\n", curr_prefix);
+ fprintf(stderr, "curr_prefix_len: %d\n", curr_prefix_len);
+#endif
+}
+
+// Strip the installation prefix and replace it
+// with the current installation prefix; return the relocated path.
+char *relocatep(const char *path)
+{
+#if DEBUG
+ fprintf(stderr, "relocatep: path = %s\n", path);
+ fprintf(stderr, "relocatep: INSTALLPATH = %s\n", INSTALLPATH);
+ fprintf(stderr, "relocatep: INSTALLPATHLEN = %d\n", INSTALLPATHLEN);
+#endif
+ if (!curr_prefix)
+ set_current_prefix();
+ if (strncmp(INSTALLPATH, path, INSTALLPATHLEN))
+ return strsave(path);
+ char *relative_path = (char *)path + INSTALLPATHLEN;
+ size_t relative_path_len = strlen(relative_path);
+ char *relocated_path = (char *)malloc(curr_prefix_len
+ + relative_path_len + 1);
+ assert(0 != curr_prefix);
+ strcpy(relocated_path, curr_prefix);
+ strcat(relocated_path, relative_path);
+#if DEBUG
+ fprintf(stderr, "relocated_path: %s\n", relocated_path);
+#endif /* DEBUG */
+ return relocated_path;
+}
+
+// Return the original pathname if it exists;
+// otherwise return the relocated path.
+char *relocate(const char *path)
+{
+ char *p;
+ if (access(path, F_OK))
+ p = relocatep(path);
+ else
+ p = strsave(path);
+#if DEBUG
+ fprintf (stderr, "relocate: %s\n", p);
+#endif
+ return p;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/libs/libgroff/searchpath.cpp b/src/libs/libgroff/searchpath.cpp
new file mode 100644
index 0000000..6062e8d
--- /dev/null
+++ b/src/libs/libgroff/searchpath.cpp
@@ -0,0 +1,215 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+
+#include "searchpath.h"
+#include "nonposix.h"
+
+#ifdef _WIN32
+# include "relocate.h"
+#else
+# define relocate(path) strsave(path)
+#endif
+
+search_path::search_path(const char *envvar, const char *standard,
+ int add_home, int add_current)
+{
+ char *home = 0;
+ if (add_home)
+ home = getenv("HOME");
+ char *e = 0;
+ if (envvar)
+ e = getenv(envvar);
+ dirs = new char[((e && *e) ? strlen(e) + 1 : 0)
+ + (add_current ? 1 + 1 : 0)
+ + ((home && *home) ? strlen(home) + 1 : 0)
+ + ((standard && *standard) ? strlen(standard) : 0)
+ + 1];
+ *dirs = '\0';
+ if (e && *e) {
+ strcat(dirs, e);
+ strcat(dirs, PATH_SEP);
+ }
+ if (add_current) {
+ strcat(dirs, ".");
+ strcat(dirs, PATH_SEP);
+ }
+ if (home && *home) {
+ strcat(dirs, home);
+ strcat(dirs, PATH_SEP);
+ }
+ if (standard && *standard)
+ strcat(dirs, standard);
+ init_len = strlen(dirs);
+}
+
+search_path::~search_path()
+{
+ // dirs is always allocated
+ delete[] dirs;
+}
+
+void search_path::command_line_dir(const char *s)
+{
+ char *old = dirs;
+ unsigned old_len = strlen(old);
+ unsigned slen = strlen(s);
+ dirs = new char[old_len + 1 + slen + 1];
+ memcpy(dirs, old, old_len - init_len);
+ char *p = dirs;
+ p += old_len - init_len;
+ if (init_len == 0)
+ *p++ = PATH_SEP_CHAR;
+ memcpy(p, s, slen);
+ p += slen;
+ if (init_len > 0) {
+ *p++ = PATH_SEP_CHAR;
+ memcpy(p, old + old_len - init_len, init_len);
+ p += init_len;
+ }
+ *p++ = '\0';
+ delete[] old;
+}
+
+FILE *search_path::open_file(const char *name, char **pathp)
+{
+ assert(name != 0);
+ if (IS_ABSOLUTE(name) || *dirs == '\0') {
+ FILE *fp = fopen(name, "r");
+ if (fp) {
+ if (pathp)
+ *pathp = strsave(name);
+ return fp;
+ }
+ else
+ return 0;
+ }
+ unsigned namelen = strlen(name);
+ char *p = dirs;
+ for (;;) {
+ char *end = strchr(p, PATH_SEP_CHAR);
+ if (!end)
+ end = strchr(p, '\0');
+ int need_slash = end > p && strchr(DIR_SEPS, end[-1]) == 0;
+ char *origpath = new char[(end - p) + need_slash + namelen + 1];
+ memcpy(origpath, p, end - p);
+ if (need_slash)
+ origpath[end - p] = '/';
+ strcpy(origpath + (end - p) + need_slash, name);
+#if 0
+ fprintf(stderr, "origpath '%s'\n", origpath);
+#endif
+ char *path = relocate(origpath);
+ delete[] origpath;
+#if 0
+ fprintf(stderr, "trying '%s'\n", path);
+#endif
+ FILE *fp = fopen(path, "r");
+ int err = errno;
+ if (fp) {
+ if (pathp)
+ *pathp = path;
+ else {
+ free(path);
+ errno = err;
+ }
+ return fp;
+ }
+ free(path);
+ errno = err;
+ if (*end == '\0')
+ break;
+ p = end + 1;
+ }
+ return 0;
+}
+
+FILE *search_path::open_file_cautious(const char *name, char **pathp,
+ const char *mode)
+{
+ if (!mode)
+ mode = "r";
+ bool reading = (strchr(mode, 'r') != 0);
+ if (name == 0 || strcmp(name, "-") == 0) {
+ if (pathp)
+ *pathp = strsave(reading ? "stdin" : "stdout");
+ return (reading ? stdin : stdout);
+ }
+ if (!reading || IS_ABSOLUTE(name) || *dirs == '\0') {
+ FILE *fp = fopen(name, mode);
+ if (fp) {
+ if (pathp)
+ *pathp = strsave(name);
+ return fp;
+ }
+ else
+ return 0;
+ }
+ unsigned namelen = strlen(name);
+ char *p = dirs;
+ for (;;) {
+ char *end = strchr(p, PATH_SEP_CHAR);
+ if (!end)
+ end = strchr(p, '\0');
+ int need_slash = end > p && strchr(DIR_SEPS, end[-1]) == 0;
+ char *origpath = new char[(end - p) + need_slash + namelen + 1];
+ memcpy(origpath, p, end - p);
+ if (need_slash)
+ origpath[end - p] = '/';
+ strcpy(origpath + (end - p) + need_slash, name);
+#if 0
+ fprintf(stderr, "origpath '%s'\n", origpath);
+#endif
+ char *path = relocate(origpath);
+ delete[] origpath;
+#if 0
+ fprintf(stderr, "trying '%s'\n", path);
+#endif
+ FILE *fp = fopen(path, mode);
+ int err = errno;
+ if (fp) {
+ if (pathp)
+ *pathp = path;
+ else {
+ free(path);
+ errno = err;
+ }
+ return fp;
+ }
+ free(path);
+ errno = err;
+ if (err != ENOENT)
+ return 0;
+ if (*end == '\0')
+ break;
+ p = end + 1;
+ }
+ errno = ENOENT;
+ return 0;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/libs/libgroff/spawnvp.c b/src/libs/libgroff/spawnvp.c
new file mode 100644
index 0000000..1fffa2b
--- /dev/null
+++ b/src/libs/libgroff/spawnvp.c
@@ -0,0 +1,120 @@
+/* Copyright (C) 2004-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef HAVE_PROCESS_H
+# include <process.h>
+#endif
+
+#if defined(__MSDOS__) \
+ || (defined(_WIN32) && !defined(_UWIN) && !defined(__CYGWIN__)) \
+ || defined(__EMX__)
+
+#define SPAWN_FUNCTION_WRAPPERS 1
+
+/* Define the default mechanism, and messages, for error reporting
+ * (user may substitute a preferred alternative, by defining his own
+ * implementation of the macros REPORT_ERROR and ARGV_MALLOC_ERROR,
+ * in the header file 'nonposix.h').
+ */
+
+#include "nonposix.h"
+
+#ifndef REPORT_ERROR
+# define REPORT_ERROR(WHY) fprintf(stderr, "%s:%s\n", program_name, WHY)
+#endif
+#ifndef ARGV_MALLOC_ERROR
+# define ARGV_MALLOC_ERROR "malloc: Allocation for 'argv' failed"
+#endif
+
+extern char *program_name;
+
+extern char *quote_arg(char *string);
+extern void purge_quoted_args(char **argv);
+
+int
+spawnvp_wrapper(int mode, char *path, char **argv)
+{
+ /* Invoke the system 'spawnvp' service
+ * enclosing the passed arguments in double quotes, as required,
+ * so that the (broken) default parsing in the MSVC runtime doesn't
+ * split them at whitespace. */
+
+ char **quoted_argv; /* used to build a quoted local copy of 'argv' */
+
+ int i; /* used as an index into 'argv' or 'quoted_argv' */
+ int status = -1; /* initialise return code, in case we fail */
+ int argc = 0; /* initialise argument count; may be none */
+
+ /* First count the number of arguments
+ * which are actually present in the passed 'argv'. */
+
+ if (argv)
+ for (quoted_argv = argv; *quoted_argv; ++argc, ++quoted_argv)
+ ;
+
+ /* If we do not now have an argument count,
+ * then we must fall through and fail. */
+
+ if (argc) {
+ /* We do have at least one argument:
+ * We will use a copy of the 'argv', in which to do the quoting,
+ * so we must allocate space for it. */
+
+ if ((quoted_argv = (char **)malloc(++argc * sizeof(char **))) == NULL) {
+ /* If we didn't get enough space,
+ * then complain, and bail out gracefully. */
+
+ REPORT_ERROR(ARGV_MALLOC_ERROR);
+ exit(1);
+ }
+
+ /* Now copy the passed 'argv' into our new vector,
+ * quoting its contents as required. */
+
+ for (i = 0; i < argc; i++)
+ quoted_argv[i] = quote_arg(argv[i]);
+
+ /* Invoke the MSVC 'spawnvp' service
+ * passing our now appropriately quoted copy of 'argv'. */
+
+ status = spawnvp(mode, path, quoted_argv);
+
+ /* Clean up our memory allocations
+ * for the quoted copy of 'argv', which is no longer required. */
+
+ purge_quoted_args(quoted_argv);
+ free(quoted_argv);
+ }
+
+ /* Finally,
+ * return the status code returned by 'spawnvp',
+ * or a failure code if we fell through. */
+
+ return status;
+}
+
+#endif /* __MSDOS__ || _WIN32 */
+
+/* spawnvp.c: end of file */
diff --git a/src/libs/libgroff/strcasecmp.c b/src/libs/libgroff/strcasecmp.c
new file mode 100644
index 0000000..22c0997
--- /dev/null
+++ b/src/libs/libgroff/strcasecmp.c
@@ -0,0 +1,65 @@
+/* strcasecmp.c -- case insensitive string comparator
+ Copyright (C) 1998-2020 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 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, see <http://www.gnu.org/licenses/>. */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef LENGTH_LIMIT
+# define STRXCASECMP_FUNCTION strncasecmp
+# define STRXCASECMP_DECLARE_N , size_t n
+# define LENGTH_LIMIT_EXPR(Expr) Expr
+#else
+# define STRXCASECMP_FUNCTION strcasecmp
+# define STRXCASECMP_DECLARE_N /* empty */
+# define LENGTH_LIMIT_EXPR(Expr) 0
+#endif
+
+#include <stddef.h>
+#include <ctype.h>
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+/* Compare {{no more than N characters of }}strings S1 and S2,
+ ignoring case, returning less than, equal to or
+ greater than zero if S1 is lexicographically less
+ than, equal to or greater than S2. */
+
+int
+STRXCASECMP_FUNCTION (const char *s1, const char *s2 STRXCASECMP_DECLARE_N)
+{
+ register const unsigned char *p1 = (const unsigned char *) s1;
+ register const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+
+ if (p1 == p2 || LENGTH_LIMIT_EXPR (n == 0))
+ return 0;
+
+ do
+ {
+ c1 = TOLOWER (*p1);
+ c2 = TOLOWER (*p2);
+
+ if (LENGTH_LIMIT_EXPR (--n == 0) || c1 == '\0')
+ break;
+
+ ++p1;
+ ++p2;
+ }
+ while (c1 == c2);
+
+ return c1 - c2;
+}
diff --git a/src/libs/libgroff/strerror.c b/src/libs/libgroff/strerror.c
new file mode 100644
index 0000000..a8887e5
--- /dev/null
+++ b/src/libs/libgroff/strerror.c
@@ -0,0 +1,46 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h> /* for MinGW */
+
+#define INT_DIGITS 19 /* enough for 64 bit integer */
+
+#ifndef HAVE_SYS_NERR
+extern int sys_nerr;
+#endif
+#ifndef HAVE_SYS_ERRLIST
+extern char *sys_errlist[];
+#endif
+
+char *strerror(n)
+ int n;
+{
+ static char buf[sizeof("Error ") + 1 + INT_DIGITS];
+ if (n >= 0 && n < sys_nerr && sys_errlist[n] != 0)
+ return sys_errlist[n];
+ else {
+ sprintf(buf, "Error %d", n);
+ return buf;
+ }
+}
diff --git a/src/libs/libgroff/string.cpp b/src/libs/libgroff/string.cpp
new file mode 100644
index 0000000..33c0565
--- /dev/null
+++ b/src/libs/libgroff/string.cpp
@@ -0,0 +1,354 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#include "lib.h"
+
+#include "stringclass.h"
+
+static char *salloc(int len, int *sizep);
+static void sfree(char *ptr, int size);
+static char *sfree_alloc(char *ptr, int size, int len, int *sizep);
+static char *srealloc(char *ptr, int size, int oldlen, int newlen, int *sizep);
+
+static char *salloc(int len, int *sizep)
+{
+ if (len == 0) {
+ *sizep = 0;
+ return 0;
+ }
+ else
+ return new char[*sizep = len*2];
+}
+
+static void sfree(char *ptr, int)
+{
+ delete[] ptr;
+}
+
+static char *sfree_alloc(char *ptr, int oldsz, int len, int *sizep)
+{
+ if (oldsz >= len) {
+ *sizep = oldsz;
+ return ptr;
+ }
+ delete[] ptr;
+ if (len == 0) {
+ *sizep = 0;
+ return 0;
+ }
+ else
+ return new char[*sizep = len*2];
+}
+
+static char *srealloc(char *ptr, int oldsz, int oldlen, int newlen, int *sizep)
+{
+ if (oldsz >= newlen) {
+ *sizep = oldsz;
+ return ptr;
+ }
+ if (newlen == 0) {
+ delete[] ptr;
+ *sizep = 0;
+ return 0;
+ }
+ else {
+ char *p = new char[*sizep = newlen*2];
+ if (oldlen < newlen && oldlen != 0)
+ memcpy(p, ptr, oldlen);
+ delete[] ptr;
+ return p;
+ }
+}
+
+string::string() : ptr(0), len(0), sz(0)
+{
+}
+
+string::string(const char *p, int n) : len(n)
+{
+ assert(n >= 0);
+ ptr = salloc(n, &sz);
+ if (n != 0)
+ memcpy(ptr, p, n);
+}
+
+string::string(const char *p)
+{
+ if (p == 0) {
+ len = 0;
+ ptr = 0;
+ sz = 0;
+ }
+ else {
+ len = strlen(p);
+ ptr = salloc(len, &sz);
+ if (len != 0)
+ memcpy(ptr, p, len);
+ }
+}
+
+string::string(char c) : len(1)
+{
+ ptr = salloc(1, &sz);
+ *ptr = c;
+}
+
+string::string(const string &s) : len(s.len)
+{
+ ptr = salloc(len, &sz);
+ if (len != 0)
+ memcpy(ptr, s.ptr, len);
+}
+
+string::~string()
+{
+ sfree(ptr, sz);
+}
+
+string &string::operator=(const string &s)
+{
+ ptr = sfree_alloc(ptr, sz, s.len, &sz);
+ len = s.len;
+ if (len != 0)
+ memcpy(ptr, s.ptr, len);
+ return *this;
+}
+
+string &string::operator=(const char *p)
+{
+ if (p == 0) {
+ sfree(ptr, len);
+ len = 0;
+ ptr = 0;
+ sz = 0;
+ }
+ else {
+ int slen = strlen(p);
+ ptr = sfree_alloc(ptr, sz, slen, &sz);
+ len = slen;
+ if (len != 0)
+ memcpy(ptr, p, len);
+ }
+ return *this;
+}
+
+string &string::operator=(char c)
+{
+ ptr = sfree_alloc(ptr, sz, 1, &sz);
+ len = 1;
+ *ptr = c;
+ return *this;
+}
+
+void string::move(string &s)
+{
+ sfree(ptr, sz);
+ ptr = s.ptr;
+ len = s.len;
+ sz = s.sz;
+ s.ptr = 0;
+ s.len = 0;
+ s.sz = 0;
+}
+
+void string::grow1()
+{
+ ptr = srealloc(ptr, sz, len, len + 1, &sz);
+}
+
+string &string::operator+=(const char *p)
+{
+ if (p != 0) {
+ int n = strlen(p);
+ int newlen = len + n;
+ if (newlen > sz)
+ ptr = srealloc(ptr, sz, len, newlen, &sz);
+ memcpy(ptr + len, p, n);
+ len = newlen;
+ }
+ return *this;
+}
+
+string &string::operator+=(const string &s)
+{
+ if (s.len != 0) {
+ int newlen = len + s.len;
+ if (newlen > sz)
+ ptr = srealloc(ptr, sz, len, newlen, &sz);
+ memcpy(ptr + len, s.ptr, s.len);
+ len = newlen;
+ }
+ return *this;
+}
+
+void string::append(const char *p, int n)
+{
+ if (n > 0) {
+ int newlen = len + n;
+ if (newlen > sz)
+ ptr = srealloc(ptr, sz, len, newlen, &sz);
+ memcpy(ptr + len, p, n);
+ len = newlen;
+ }
+}
+
+string::string(const char *s1, int n1, const char *s2, int n2)
+{
+ assert(n1 >= 0 && n2 >= 0);
+ len = n1 + n2;
+ if (len == 0) {
+ sz = 0;
+ ptr = 0;
+ }
+ else {
+ ptr = salloc(len, &sz);
+ if (n1 == 0)
+ memcpy(ptr, s2, n2);
+ else {
+ memcpy(ptr, s1, n1);
+ if (n2 != 0)
+ memcpy(ptr + n1, s2, n2);
+ }
+ }
+}
+
+int operator<=(const string &s1, const string &s2)
+{
+ return (s1.len <= s2.len
+ ? s1.len == 0 || memcmp(s1.ptr, s2.ptr, s1.len) <= 0
+ : s2.len != 0 && memcmp(s1.ptr, s2.ptr, s2.len) < 0);
+}
+
+int operator<(const string &s1, const string &s2)
+{
+ return (s1.len < s2.len
+ ? s1.len == 0 || memcmp(s1.ptr, s2.ptr, s1.len) <= 0
+ : s2.len != 0 && memcmp(s1.ptr, s2.ptr, s2.len) < 0);
+}
+
+int operator>=(const string &s1, const string &s2)
+{
+ return (s1.len >= s2.len
+ ? s2.len == 0 || memcmp(s1.ptr, s2.ptr, s2.len) >= 0
+ : s1.len != 0 && memcmp(s1.ptr, s2.ptr, s1.len) > 0);
+}
+
+int operator>(const string &s1, const string &s2)
+{
+ return (s1.len > s2.len
+ ? s2.len == 0 || memcmp(s1.ptr, s2.ptr, s2.len) >= 0
+ : s1.len != 0 && memcmp(s1.ptr, s2.ptr, s1.len) > 0);
+}
+
+void string::set_length(int i)
+{
+ assert(i >= 0);
+ if (i > sz)
+ ptr = srealloc(ptr, sz, len, i, &sz);
+ len = i;
+}
+
+void string::clear()
+{
+ len = 0;
+}
+
+int string::search(char c) const
+{
+ char *p = ptr ? (char *)memchr(ptr, c, len) : 0;
+ return p ? p - ptr : -1;
+}
+
+// we silently strip nuls
+
+char *string::extract() const
+{
+ char *p = ptr;
+ int n = len;
+ int nnuls = 0;
+ int i;
+ for (i = 0; i < n; i++)
+ if (p[i] == '\0')
+ nnuls++;
+ char *q =(char*)malloc(n + 1 - nnuls);
+ if (q != 0 /* nullptr */) {
+ char *r = q;
+ for (i = 0; i < n; i++)
+ if (p[i] != '\0')
+ *r++ = p[i];
+ *r = '\0';
+ }
+ return q;
+}
+
+void string::remove_spaces()
+{
+ int l = len - 1;
+ while (l >= 0 && ptr[l] == ' ')
+ l--;
+ char *p = ptr;
+ if (l > 0)
+ while (*p == ' ') {
+ p++;
+ l--;
+ }
+ if (len - 1 != l) {
+ if (l >= 0) {
+ len = l + 1;
+ char *tmp = new char[sz];
+ memcpy(tmp, p, len);
+ delete[] ptr;
+ ptr = tmp;
+ }
+ else {
+ len = 0;
+ if (ptr) {
+ delete[] ptr;
+ ptr = 0;
+ sz = 0;
+ }
+ }
+ }
+}
+
+void put_string(const string &s, FILE *fp)
+{
+ int len = s.length();
+ const char *ptr = s.contents();
+ for (int i = 0; i < len; i++)
+ putc(ptr[i], fp);
+}
+
+string as_string(int i)
+{
+ static char buf[INT_DIGITS + 2];
+ sprintf(buf, "%d", i);
+ return string(buf);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/libs/libgroff/strncasecmp.c b/src/libs/libgroff/strncasecmp.c
new file mode 100644
index 0000000..ec8aae2
--- /dev/null
+++ b/src/libs/libgroff/strncasecmp.c
@@ -0,0 +1,19 @@
+/* Copyright (C) 2014-2020 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 of the License, 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.
+
+The GNU General Public License version 2 (GPL2) is available in the
+internet at <http://www.gnu.org/licenses/gpl-2.0.txt>. */
+
+#define LENGTH_LIMIT
+#include "strcasecmp.c"
diff --git a/src/libs/libgroff/strsave.cpp b/src/libs/libgroff/strsave.cpp
new file mode 100644
index 0000000..95a529b
--- /dev/null
+++ b/src/libs/libgroff/strsave.cpp
@@ -0,0 +1,40 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <stdlib.h>
+
+char *strsave(const char *s)
+{
+ if (s == 0)
+ return 0;
+ char *p = (char*)malloc(strlen(s) + 1);
+ if (p != 0)
+ strcpy(p, s);
+ return p;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/libs/libgroff/strtol.c b/src/libs/libgroff/strtol.c
new file mode 100644
index 0000000..1820732
--- /dev/null
+++ b/src/libs/libgroff/strtol.c
@@ -0,0 +1,131 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+#ifndef LONG_MAX
+#define LONG_MAX 2147483647
+#endif
+
+#ifndef LONG_MIN
+#define LONG_MIN (-LONG_MAX-1)
+#endif
+
+#ifdef isascii
+#define ISASCII(c) isascii(c)
+#else
+#define ISASCII(c) (1)
+#endif
+
+long strtol(str, ptr, base)
+ char *str, **ptr;
+ int base;
+{
+ char *start = str;
+ int neg = 0;
+ long val;
+ char *p;
+ static char digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
+
+ while (ISASCII((unsigned char)*str) && isspace((unsigned char)*str))
+ str++;
+
+ if (*str == '-') {
+ neg = 1;
+ str++;
+ }
+ if (base == 0) {
+ if (*str == '0') {
+ if (str[1] == 'x' || str[1] == 'X') {
+ str += 2;
+ base = 16;
+ }
+ else
+ base = 8;
+ }
+ else
+ base = 10;
+ }
+ if (base < 2 || base > 36)
+ base = 10;
+ else if (base == 16 && *str == '0' && (str[1] == 'x' || str[1] == 'X'))
+ str += 2;
+
+ p = strchr(digits, (ISASCII((unsigned char)*str)
+ && isupper((unsigned char)*str)
+ ? tolower((unsigned char)*str)
+ : *str));
+ if (p == 0 || (val = (p - digits)) >= base) {
+ if (base == 16 && str > start && (str[-1] == 'x' || str[-1] == 'X')) {
+ if (ptr)
+ *ptr = str - 1;
+ }
+ else {
+ if (ptr)
+ *ptr = start;
+ errno = ERANGE;
+ }
+ return 0;
+ }
+ if (neg)
+ val = -val;
+
+ while (*++str != '\0') {
+ int n;
+
+ p = strchr(digits, (ISASCII((unsigned char)*str)
+ && isupper((unsigned char)*str)
+ ? tolower((unsigned char)*str) : *str));
+ if (p == 0)
+ break;
+ n = p - digits;
+ if (n >= base)
+ break;
+ if (neg) {
+ if (-(unsigned long)val > (-(unsigned long)LONG_MIN - n)/base) {
+ val = LONG_MIN;
+ errno = ERANGE;
+ }
+ else
+ val = val*base - n;
+ }
+ else {
+ if (val > (LONG_MAX - n)/base) {
+ val = LONG_MAX;
+ errno = ERANGE;
+ }
+ else
+ val = val*base + n;
+ }
+ }
+
+ if (ptr)
+ *ptr = str;
+
+ return val;
+}
diff --git a/src/libs/libgroff/symbol.cpp b/src/libs/libgroff/symbol.cpp
new file mode 100644
index 0000000..4f50627
--- /dev/null
+++ b/src/libs/libgroff/symbol.cpp
@@ -0,0 +1,157 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include "errarg.h"
+#include "error.h"
+#include "symbol.h"
+
+const char **symbol::table = 0;
+int symbol::table_used = 0;
+int symbol::table_size = 0;
+char *symbol::block = 0;
+int symbol::block_size = 0;
+
+const symbol NULL_SYMBOL;
+const symbol EMPTY_SYMBOL("");
+
+#ifdef BLOCK_SIZE
+#undef BLOCK_SIZE
+#endif
+
+const int BLOCK_SIZE = 1024;
+// the table will increase in size as necessary
+// the size will be chosen from the following array
+// add some more if you want
+static const unsigned int table_sizes[] = {
+ 101, 503, 1009, 2003, 3001, 4001, 5003, 10007, 20011, 40009, 80021,
+ 160001, 500009, 1000003, 1500007, 2000003, 0
+};
+const double FULL_MAX = 0.3; // don't let the table get more than this full
+
+static unsigned int hash_string(const char *p)
+{
+ // compute a hash code; this assumes 32-bit unsigned ints
+ // see p436 of Compilers by Aho, Sethi & Ullman
+ // give special treatment to two-character names
+ unsigned int hc = 0, g;
+ if (*p != 0) {
+ hc = *p++;
+ if (*p != 0) {
+ hc <<= 7;
+ hc += *p++;
+ for (; *p != 0; p++) {
+ hc <<= 4;
+ hc += *p;
+ if ((g = (hc & 0xf0000000)) == 0) {
+ hc ^= g >> 24;
+ hc ^= g;
+ }
+ }
+ }
+ }
+ return hc;
+}
+
+// Tell compiler that a variable is intentionally unused.
+inline void unused(void *) { }
+
+symbol::symbol(const char *p, int how)
+{
+ if (p == 0) {
+ s = 0;
+ return;
+ }
+ if (*p == 0) {
+ s = "";
+ return;
+ }
+ if (table == 0) {
+ table_size = table_sizes[0];
+ table = (const char **)new char*[table_size];
+ for (int i = 0; i < table_size; i++)
+ table[i] = 0;
+ table_used = 0;
+ }
+ unsigned int hc = hash_string(p);
+ const char **pp;
+ for (pp = table + hc % table_size;
+ *pp != 0;
+ (pp == table ? pp = table + table_size - 1 : --pp))
+ if (strcmp(p, *pp) == 0) {
+ s = *pp;
+ return;
+ }
+ if (how == MUST_ALREADY_EXIST) {
+ s = 0;
+ return;
+ }
+ if (table_used >= table_size - 1 || table_used >= table_size*FULL_MAX) {
+ const char **old_table = table;
+ unsigned int old_table_size = table_size;
+ int i;
+ for (i = 1; table_sizes[i] <= old_table_size; i++)
+ if (table_sizes[i] == 0)
+ fatal("too many symbols");
+ table_size = table_sizes[i];
+ table_used = 0;
+ table = (const char **)new char*[table_size];
+ for (i = 0; i < table_size; i++)
+ table[i] = 0;
+ for (pp = old_table + old_table_size - 1;
+ pp >= old_table;
+ --pp) {
+ symbol temp(*pp, 1); /* insert it into the new table */
+ unused(&temp);
+ }
+ delete[] old_table;
+ for (pp = table + hc % table_size;
+ *pp != 0;
+ (pp == table ? pp = table + table_size - 1 : --pp))
+ ;
+ }
+ ++table_used;
+ if (how == DONT_STORE) {
+ s = *pp = p;
+ }
+ else {
+ int len = strlen(p)+1;
+ if (block == 0 || block_size < len) {
+ block_size = len > BLOCK_SIZE ? len : BLOCK_SIZE;
+ block = new char [block_size];
+ }
+ (void)strcpy(block, p);
+ s = *pp = block;
+ block += len;
+ block_size -= len;
+ }
+}
+
+symbol concat(symbol s1, symbol s2)
+{
+ char *buf = new char [strlen(s1.contents()) + strlen(s2.contents()) + 1];
+ strcpy(buf, s1.contents());
+ strcat(buf, s2.contents());
+ symbol res(buf);
+ delete[] buf;
+ return res;
+}
+
+symbol default_symbol("default");
diff --git a/src/libs/libgroff/tmpfile.cpp b/src/libs/libgroff/tmpfile.cpp
new file mode 100644
index 0000000..5e807ae
--- /dev/null
+++ b/src/libs/libgroff/tmpfile.cpp
@@ -0,0 +1,188 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "posix.h"
+#include "errarg.h"
+#include "error.h"
+#include "nonposix.h"
+
+// If this is set, create temporary files there
+#define GROFF_TMPDIR_ENVVAR "GROFF_TMPDIR"
+// otherwise if this is set, create temporary files there
+#define TMPDIR_ENVVAR "TMPDIR"
+// otherwise, on MS-DOS or MS-Windows ...
+#if defined(__MSDOS__) || defined(_WIN32)
+// if either of these is set, create temporary files there
+// (giving priority to WIN32_TMPDIR_ENVVAR)
+#define WIN32_TMPDIR_ENVVAR "TMP"
+#define MSDOS_TMPDIR_ENVVAR "TEMP"
+#endif
+// otherwise if P_tmpdir is defined, create temporary files there
+#ifdef P_tmpdir
+# define DEFAULT_TMPDIR P_tmpdir
+#else
+// otherwise create temporary files here.
+# define DEFAULT_TMPDIR "/tmp"
+#endif
+// Use this as the prefix for temporary filenames.
+#define TMPFILE_PREFIX_SHORT ""
+#define TMPFILE_PREFIX_LONG "groff"
+
+char *tmpfile_prefix;
+size_t tmpfile_prefix_len;
+int use_short_postfix = 0;
+
+struct temp_init {
+ temp_init();
+ ~temp_init();
+} _temp_init;
+
+temp_init::temp_init()
+{
+ // First, choose a location for creating temporary files...
+ const char *tem;
+ // using the first match for any of the environment specs in listed order.
+ if (
+ (tem = getenv(GROFF_TMPDIR_ENVVAR)) == 0
+ && (tem = getenv(TMPDIR_ENVVAR)) == 0
+#if defined(__MSDOS__) || defined(_WIN32)
+ // If we didn't find a match for either of the above
+ // (which are preferred, regardless of the host operating system),
+ // and we are hosted on either MS-Windows or MS-DOS,
+ // then try the Microsoft conventions.
+ && (tem = getenv(WIN32_TMPDIR_ENVVAR)) == 0
+ && (tem = getenv(MSDOS_TMPDIR_ENVVAR)) == 0
+#endif
+ )
+ // If we didn't find an environment spec fall back to this default.
+ tem = DEFAULT_TMPDIR;
+ size_t tem_len = strlen(tem);
+ const char *tem_end = tem + tem_len - 1;
+ int need_slash = (strchr(DIR_SEPS, *tem_end) == 0) ? 1 : 0;
+ char *tem2 = new char[tem_len + need_slash + 1];
+ strcpy(tem2, tem);
+ if (need_slash)
+ strcat(tem2, "/");
+ const char *tem3 = TMPFILE_PREFIX_LONG;
+ if (file_name_max(tem2) <= 14) {
+ tem3 = TMPFILE_PREFIX_SHORT;
+ use_short_postfix = 1;
+ }
+ tmpfile_prefix_len = tem_len + need_slash + strlen(tem3);
+ tmpfile_prefix = new char[tmpfile_prefix_len + 1];
+ strcpy(tmpfile_prefix, tem2);
+ strcat(tmpfile_prefix, tem3);
+ delete[] tem2;
+}
+
+temp_init::~temp_init()
+{
+ delete[] tmpfile_prefix;
+}
+
+/*
+ * Generate a temporary name template with a postfix
+ * immediately after the TMPFILE_PREFIX.
+ * It uses the groff preferences for a temporary directory.
+ * Note that no file name is either created or opened,
+ * only the *template* is returned.
+ */
+
+char *xtmptemplate(const char *postfix_long, const char *postfix_short)
+{
+ const char *postfix = use_short_postfix ? postfix_short : postfix_long;
+ int postlen = 0;
+ if (postfix)
+ postlen = strlen(postfix);
+ char *templ = new char[tmpfile_prefix_len + postlen + 6 + 1];
+ strcpy(templ, tmpfile_prefix);
+ if (postlen > 0)
+ strcat(templ, postfix);
+ strcat(templ, "XXXXXX");
+ return templ;
+}
+
+// The trick with unlinking the temporary file while it is still in
+// use is not portable, it will fail on MS-DOS and most MS-Windows
+// filesystems. So it cannot be used on non-Posix systems.
+// Instead, we maintain a list of files to be deleted on exit.
+// This should be portable to all platforms.
+
+struct xtmpfile_list {
+ char *fname;
+ xtmpfile_list *next;
+ xtmpfile_list(char *fn) : fname(fn), next(0) {}
+};
+
+xtmpfile_list *xtmpfiles_to_delete = 0;
+
+struct xtmpfile_list_init {
+ ~xtmpfile_list_init();
+} _xtmpfile_list_init;
+
+xtmpfile_list_init::~xtmpfile_list_init()
+{
+ xtmpfile_list *x = xtmpfiles_to_delete;
+ while (x != 0) {
+ if (unlink(x->fname) < 0)
+ error("cannot unlink '%1': %2", x->fname, strerror(errno));
+ xtmpfile_list *tmp = x;
+ x = x->next;
+ delete[] tmp->fname;
+ delete tmp;
+ }
+}
+
+static void add_tmp_file(const char *name)
+{
+ char *s = new char[strlen(name)+1];
+ strcpy(s, name);
+ xtmpfile_list *x = new xtmpfile_list(s);
+ x->next = xtmpfiles_to_delete;
+ xtmpfiles_to_delete = x;
+}
+
+// Open a temporary file and with fatal error on failure.
+
+FILE *xtmpfile(char **namep,
+ const char *postfix_long, const char *postfix_short,
+ int do_unlink)
+{
+ char *templ = xtmptemplate(postfix_long, postfix_short);
+ errno = 0;
+ int fd = mkstemp(templ);
+ if (fd < 0)
+ fatal("cannot create temporary file: %1", strerror(errno));
+ errno = 0;
+ FILE *fp = fdopen(fd, FOPEN_RWB); // many callers of xtmpfile use binary I/O
+ if (!fp)
+ fatal("fdopen: %1", strerror(errno));
+ if (do_unlink)
+ add_tmp_file(templ);
+ if (namep)
+ *namep = templ;
+ else
+ delete[] templ;
+ return fp;
+}
diff --git a/src/libs/libgroff/tmpname.cpp b/src/libs/libgroff/tmpname.cpp
new file mode 100644
index 0000000..69dc9a4
--- /dev/null
+++ b/src/libs/libgroff/tmpname.cpp
@@ -0,0 +1,117 @@
+/* Copyright (C) 2001-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+/* This file is heavily based on the function __gen_tempname() in the
+ file tempname.c which is part of the fileutils package. */
+
+
+#include "lib.h"
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <time.h>
+
+#include "posix.h"
+#include "nonposix.h"
+
+#ifndef TMP_MAX
+# define TMP_MAX 238328
+#endif
+
+#if HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+#ifdef HAVE_GETTIMEOFDAY
+#ifdef NEED_DECLARATION_GETTIMEOFDAY
+extern "C" {
+ int gettimeofday(struct timeval *, void *);
+}
+#endif
+#endif
+
+#if HAVE_CC_INTTYPES_H
+# include <inttypes.h>
+#endif
+
+/* Use the widest available unsigned type if uint64_t is not
+ available. The algorithm below extracts a number less than 62**6
+ (approximately 2**35.725) from uint64_t, so ancient hosts where
+ uintmax_t is only 32 bits lose about 3.725 bits of randomness,
+ which is better than not having mkstemp at all. */
+#if !defined UINT64_MAX && !defined uint64_t
+# define uint64_t uintmax_t
+#endif
+
+/* These are the characters used in temporary filenames. */
+static const char letters[] =
+"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+
+int gen_tempname(char *tmpl, int dir)
+{
+ static uint64_t value;
+
+ size_t len = strlen(tmpl);
+ if (len < 6 || strcmp(&tmpl[len - 6], "XXXXXX"))
+ return -1; /* EINVAL */
+
+ /* This is where the Xs start. */
+ char *XXXXXX = &tmpl[len - 6];
+
+ /* Get some more or less random data. */
+#if HAVE_GETTIMEOFDAY
+ timeval tv;
+ gettimeofday(&tv, 0);
+ uint64_t random_time_bits = ((uint64_t)tv.tv_usec << 16) ^ tv.tv_sec;
+#else
+ uint64_t random_time_bits = time(0);
+#endif
+ value += random_time_bits ^ getpid();
+
+ for (int count = 0; count < TMP_MAX; value += 7777, ++count) {
+ uint64_t v = value;
+
+ /* Fill in the random bits. */
+ XXXXXX[0] = letters[v % 62];
+ v /= 62;
+ XXXXXX[1] = letters[v % 62];
+ v /= 62;
+ XXXXXX[2] = letters[v % 62];
+ v /= 62;
+ XXXXXX[3] = letters[v % 62];
+ v /= 62;
+ XXXXXX[4] = letters[v % 62];
+ v /= 62;
+ XXXXXX[5] = letters[v % 62];
+
+ int fd = dir ? mkdir(tmpl, S_IRUSR | S_IWUSR | S_IXUSR)
+ : open(tmpl,
+ O_RDWR | O_CREAT | O_EXCL | O_BINARY,
+ S_IRUSR | S_IWUSR);
+
+ if (fd >= 0)
+ return fd;
+ else if (errno != EEXIST)
+ return -1;
+ }
+
+ /* We got out of the loop because we ran out of combinations to try. */
+ return -1; /* EEXIST */
+}
diff --git a/src/libs/libgroff/unicode.cpp b/src/libs/libgroff/unicode.cpp
new file mode 100644
index 0000000..29e80c7
--- /dev/null
+++ b/src/libs/libgroff/unicode.cpp
@@ -0,0 +1,65 @@
+// -*- C++ -*-
+/* Copyright (C) 2002-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+#include "cset.h"
+#include "stringclass.h"
+
+#include "unicode.h"
+
+const char *check_unicode_name(const char *u)
+{
+ if (*u != 'u')
+ return 0;
+ const char *p = ++u;
+ for (;;) {
+ int val = 0;
+ const char *start = p;
+ for (;;) {
+ // only uppercase hex digits allowed
+ if (!csxdigit(*p))
+ return 0;
+ if (csdigit(*p))
+ val = val*0x10 + (*p-'0');
+ else if (csupper(*p))
+ val = val*0x10 + (*p-'A'+10);
+ else
+ return 0;
+ // biggest Unicode value is U+10FFFF
+ if (val > 0x10FFFF)
+ return 0;
+ p++;
+ if (*p == '\0' || *p == '_')
+ break;
+ }
+ // surrogates not allowed
+ if ((val >= 0xD800 && val <= 0xDBFF) || (val >= 0xDC00 && val <= 0xDFFF))
+ return 0;
+ if (val > 0xFFFF) {
+ if (*start == '0') // no leading zeros allowed if > 0xFFFF
+ return 0;
+ }
+ else if (p - start != 4) // otherwise, check for exactly 4 hex digits
+ return 0;
+ if (*p == '\0')
+ break;
+ p++;
+ }
+ return u;
+}
diff --git a/src/libs/libgroff/uniglyph.cpp b/src/libs/libgroff/uniglyph.cpp
new file mode 100644
index 0000000..bab2bc4
--- /dev/null
+++ b/src/libs/libgroff/uniglyph.cpp
@@ -0,0 +1,497 @@
+// -*- C++ -*-
+/* Copyright (C) 2002-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+#include "stringclass.h"
+#include "ptable.h"
+
+#include "unicode.h"
+
+struct unicode_to_glyph {
+ char *value;
+};
+
+declare_ptable(unicode_to_glyph)
+implement_ptable(unicode_to_glyph)
+
+PTABLE(unicode_to_glyph) unicode_to_glyph_table;
+
+struct S {
+ const char *key;
+ const char *value;
+} unicode_to_glyph_list[] = {
+ { "0021", "!" },
+//{ "0022", "\"" },
+ { "0022", "dq" },
+//{ "0023", "#" },
+ { "0023", "sh" },
+//{ "0024", "$" },
+ { "0024", "Do" },
+ { "0025", "%" },
+ { "0026", "&" },
+ { "0027", "aq" },
+ { "0028", "(" },
+ { "0029", ")" },
+ { "002A", "*" },
+//{ "002B", "+" },
+ { "002B", "pl" },
+ { "002C", "," },
+ { "002E", "." },
+//{ "002F", "/" },
+ { "002F", "sl" },
+ { "0030", "0" },
+ { "0031", "1" },
+ { "0032", "2" },
+ { "0033", "3" },
+ { "0034", "4" },
+ { "0035", "5" },
+ { "0036", "6" },
+ { "0037", "7" },
+ { "0038", "8" },
+ { "0039", "9" },
+ { "003A", ":" },
+ { "003B", ";" },
+ { "003C", "<" },
+//{ "003D", "=" },
+ { "003D", "eq" },
+ { "003D_0338", "!=" },
+ { "003E", ">" },
+ { "003F", "?" },
+//{ "0040", "@" },
+ { "0040", "at" },
+ { "0041", "A" },
+ { "0041_0300", "`A" },
+ { "0041_0301", "'A" },
+ { "0041_0302", "^A" },
+ { "0041_0303", "~A" },
+ { "0041_0308", ":A" },
+ { "0041_030A", "oA" },
+ { "0042", "B" },
+ { "0043", "C" },
+ { "0043_0301", "'C" },
+ { "0043_0327", ",C" },
+ { "0044", "D" },
+ { "0045", "E" },
+ { "0045_0300", "`E" },
+ { "0045_0301", "'E" },
+ { "0045_0302", "^E" },
+ { "0045_0308", ":E" },
+ { "0046", "F" },
+ { "0047", "G" },
+ { "0048", "H" },
+ { "0049", "I" },
+ { "0049_0300", "`I" },
+ { "0049_0301", "'I" },
+ { "0049_0302", "^I" },
+ { "0049_0308", ":I" },
+ { "004A", "J" },
+ { "004B", "K" },
+ { "004C", "L" },
+ { "004D", "M" },
+ { "004E", "N" },
+ { "004E_0303", "~N" },
+ { "004F", "O" },
+ { "004F_0300", "`O" },
+ { "004F_0301", "'O" },
+ { "004F_0302", "^O" },
+ { "004F_0303", "~O" },
+ { "004F_0308", ":O" },
+ { "0050", "P" },
+ { "0051", "Q" },
+ { "0052", "R" },
+ { "0053", "S" },
+ { "0053_030C", "vS" },
+ { "0054", "T" },
+ { "0055", "U" },
+ { "0055_0300", "`U" },
+ { "0055_0301", "'U" },
+ { "0055_0302", "^U" },
+ { "0055_0308", ":U" },
+ { "0056", "V" },
+ { "0057", "W" },
+ { "0058", "X" },
+ { "0059", "Y" },
+ { "0059_0301", "'Y" },
+ { "0059_0308", ":Y" },
+ { "005A", "Z" },
+ { "005A_030C", "vZ" },
+ { "005B", "lB" },
+//{ "005B", "[" },
+ { "005C", "rs" },
+//{ "005C", "\\" },
+ { "005D", "rB" },
+//{ "005D", "]" },
+//{ "005E", "^" },
+//{ "005E", "a^" },
+ { "005E", "ha" },
+//{ "005F", "_" },
+//{ "005F", "ru" },
+ { "005F", "ul" },
+ { "0060", "ga" },
+ { "0061", "a" },
+ { "0061_0300", "`a" },
+ { "0061_0301", "'a" },
+ { "0061_0302", "^a" },
+ { "0061_0303", "~a" },
+ { "0061_0308", ":a" },
+ { "0061_030A", "oa" },
+ { "0062", "b" },
+ { "0063", "c" },
+ { "0063_0301", "'c" },
+ { "0063_0327", ",c" },
+ { "0064", "d" },
+ { "0065", "e" },
+ { "0065_0300", "`e" },
+ { "0065_0301", "'e" },
+ { "0065_0302", "^e" },
+ { "0065_0308", ":e" },
+ { "0066", "f" },
+ { "0066_0066", "ff" },
+ { "0066_0066_0069", "Fi" },
+ { "0066_0066_006C", "Fl" },
+ { "0066_0069", "fi" },
+ { "0066_006C", "fl" },
+ { "0067", "g" },
+ { "0068", "h" },
+ { "0069", "i" },
+ { "0069_0300", "`i" },
+ { "0069_0301", "'i" },
+ { "0069_0302", "^i" },
+ { "0069_0308", ":i" },
+ { "006A", "j" },
+ { "006B", "k" },
+ { "006C", "l" },
+ { "006D", "m" },
+ { "006E", "n" },
+ { "006E_0303", "~n" },
+ { "006F", "o" },
+ { "006F_0300", "`o" },
+ { "006F_0301", "'o" },
+ { "006F_0302", "^o" },
+ { "006F_0303", "~o" },
+ { "006F_0308", ":o" },
+ { "0070", "p" },
+ { "0071", "q" },
+ { "0072", "r" },
+ { "0073", "s" },
+ { "0073_030C", "vs" },
+ { "0074", "t" },
+ { "0075", "u" },
+ { "0075_0300", "`u" },
+ { "0075_0301", "'u" },
+ { "0075_0302", "^u" },
+ { "0075_0308", ":u" },
+ { "0076", "v" },
+ { "0077", "w" },
+ { "0078", "x" },
+ { "0079", "y" },
+ { "0079_0301", "'y" },
+ { "0079_0308", ":y" },
+ { "007A", "z" },
+ { "007A_030C", "vz" },
+ { "007B", "lC" },
+//{ "007B", "{" },
+ { "007C", "ba" },
+//{ "007C", "or" },
+//{ "007C", "|" },
+ { "007D", "rC" },
+//{ "007D", "}" },
+//{ "007E", "a~" },
+ { "007E", "ti" },
+//{ "007E", "~" },
+ { "00A1", "r!" },
+ { "00A2", "ct" },
+ { "00A3", "Po" },
+ { "00A4", "Cs" },
+ { "00A5", "Ye" },
+ { "00A6", "bb" },
+ { "00A7", "sc" },
+ { "00A8", "ad" },
+ { "00A9", "co" },
+ { "00AA", "Of" },
+ { "00AB", "Fo" },
+ { "00AC", "no" },
+//{ "00AC", "tno" },
+ // In groff, U+00AD is an input character only; it is not mapped to
+ // a glyph but to '\%'.
+ { "00AE", "rg" },
+ { "00AF", "a-" },
+ { "00B0", "de" },
+ { "00B1", "+-" },
+//{ "00B1", "t+-" },
+ { "00B2", "S2" },
+ { "00B3", "S3" },
+ { "00B4", "aa" },
+ { "00B5", "mc" },
+ { "00B6", "ps" },
+ { "00B7", "pc" },
+ { "00B8", "ac" },
+ { "00B9", "S1" },
+ { "00BA", "Om" },
+ { "00BB", "Fc" },
+ { "00BC", "14" },
+ { "00BD", "12" },
+ { "00BE", "34" },
+ { "00BF", "r?" },
+ { "00C6", "AE" },
+ { "00D0", "-D" },
+ { "00D7", "mu" },
+//{ "00D7", "tmu" },
+ { "00D8", "/O" },
+ { "00DE", "TP" },
+ { "00DF", "ss" },
+ { "00E6", "ae" },
+ { "00F0", "Sd" },
+ { "00F7", "di" },
+//{ "00F7", "tdi" },
+ { "00F8", "/o" },
+ { "00FE", "Tp" },
+ { "0131", ".i" },
+ { "0132", "IJ" },
+ { "0133", "ij" },
+ { "0141", "/L" },
+ { "0142", "/l" },
+ { "0152", "OE" },
+ { "0153", "oe" },
+ { "0192", "Fn" },
+ { "0237", ".j" },
+ { "02C7", "ah" },
+ { "02D8", "ab" },
+ { "02D9", "a." },
+ { "02DA", "ao" },
+ { "02DB", "ho" },
+ { "02DD", "a\"" },
+ { "0391", "*A" },
+ { "0392", "*B" },
+ { "0393", "*G" },
+ { "0394", "*D" },
+ { "0395", "*E" },
+ { "0396", "*Z" },
+ { "0397", "*Y" },
+ { "0398", "*H" },
+ { "0399", "*I" },
+ { "039A", "*K" },
+ { "039B", "*L" },
+ { "039C", "*M" },
+ { "039D", "*N" },
+ { "039E", "*C" },
+ { "039F", "*O" },
+ { "03A0", "*P" },
+ { "03A1", "*R" },
+ { "03A3", "*S" },
+ { "03A4", "*T" },
+ { "03A5", "*U" },
+ { "03A6", "*F" },
+ { "03A7", "*X" },
+ { "03A8", "*Q" },
+ { "03A9", "*W" },
+ { "03B1", "*a" },
+ { "03B2", "*b" },
+ { "03B3", "*g" },
+ { "03B4", "*d" },
+ { "03B5", "*e" },
+ { "03B6", "*z" },
+ { "03B7", "*y" },
+ { "03B8", "*h" },
+ { "03B9", "*i" },
+ { "03BA", "*k" },
+ { "03BB", "*l" },
+ { "03BC", "*m" },
+ { "03BD", "*n" },
+ { "03BE", "*c" },
+ { "03BF", "*o" },
+ { "03C0", "*p" },
+ { "03C1", "*r" },
+ { "03C2", "ts" },
+ { "03C3", "*s" },
+ { "03C4", "*t" },
+ { "03C5", "*u" },
+ { "03C6", "+f" },
+ { "03C7", "*x" },
+ { "03C8", "*q" },
+ { "03C9", "*w" },
+ { "03D1", "+h" },
+ { "03D5", "*f" },
+ { "03D6", "+p" },
+ { "03F5", "+e" },
+//{ "2010", "-" },
+ { "2010", "hy" },
+ { "2013", "en" },
+ { "2014", "em" },
+//{ "2018", "`" },
+ { "2018", "oq" },
+//{ "2019", "'" },
+ { "2019", "cq" },
+ { "201A", "bq" },
+ { "201C", "lq" },
+ { "201D", "rq" },
+ { "201E", "Bq" },
+ { "2020", "dg" },
+ { "2021", "dd" },
+ { "2022", "bu" },
+ { "2030", "%0" },
+ { "2032", "fm" },
+ { "2033", "sd" },
+ { "2039", "fo" },
+ { "203A", "fc" },
+ { "203E", "rn" },
+ { "2044", "f/" },
+ { "20AC", "Eu" },
+//{ "20AC", "eu" },
+ { "210F", "-h" },
+//{ "210F", "hbar" },
+ { "2111", "Im" },
+ { "2118", "wp" },
+ { "211C", "Re" },
+ { "2122", "tm" },
+ { "2135", "Ah" },
+ { "215B", "18" },
+ { "215C", "38" },
+ { "215D", "58" },
+ { "215E", "78" },
+ { "2190", "<-" },
+ { "2191", "ua" },
+ { "2192", "->" },
+ { "2193", "da" },
+ { "2194", "<>" },
+ { "2195", "va" },
+ { "21B5", "CR" },
+ { "21D0", "lA" },
+ { "21D1", "uA" },
+ { "21D2", "rA" },
+ { "21D3", "dA" },
+ { "21D4", "hA" },
+ { "21D5", "vA" },
+ { "2200", "fa" },
+ { "2202", "pd" },
+ { "2203", "te" },
+ { "2205", "es" },
+ { "2207", "gr" },
+ { "2208", "mo" },
+ { "2208_0338", "nm" },
+ { "220B", "st" },
+ { "220F", "product" },
+ { "2210", "coproduct" },
+ { "2211", "sum" },
+ { "2212", "mi" },
+//{ "2212", "\\-" },
+ { "2213", "-+" },
+ { "2217", "**" },
+ { "221A", "sr" },
+ { "221D", "pt" },
+ { "221E", "if" },
+ { "2220", "/_" },
+ { "2227", "AN" },
+ { "2228", "OR" },
+ { "2229", "ca" },
+ { "222A", "cu" },
+ { "222B", "is" },
+//{ "222B", "integral" },
+//{ "2234", "3d" },
+ { "2234", "tf" },
+ { "223C", "ap" },
+ { "2243", "|=" },
+ { "2245", "=~" },
+//{ "2248", "~=" },
+ { "2248", "~~" },
+ { "2261", "==" },
+ { "2261_0338", "ne" },
+ { "2264", "<=" },
+ { "2265", ">=" },
+ { "226A", ">>" },
+ { "226B", "<<" },
+ { "2282", "sb" },
+ { "2282_0338", "nb" },
+ { "2283", "sp" },
+ { "2283_0338", "nc" },
+ { "2286", "ib" },
+ { "2287", "ip" },
+ { "2295", "c+" },
+ { "2297", "c*" },
+ { "22A5", "pp" },
+ { "22C5", "md" },
+ { "2308", "lc" },
+ { "2309", "rc" },
+ { "230A", "lf" },
+ { "230B", "rf" },
+ { "239B", "parenlefttp" },
+ { "239C", "parenleftex" },
+ { "239D", "parenleftbt" },
+ { "239E", "parenrighttp" },
+ { "239F", "parenrightex" },
+ { "23A0", "parenrightbt" },
+//{ "23A1", "bracketlefttp" },
+ { "23A2", "bracketleftex" },
+//{ "23A3", "bracketleftbt" },
+//{ "23A4", "bracketrighttp" },
+ { "23A5", "bracketrightex" },
+//{ "23A6", "bracketrightbt" },
+ { "23A7", "lt" },
+//{ "23A7", "bracelefttp" },
+ { "23A8", "lk" },
+//{ "23A8", "braceleftmid" },
+ { "23A9", "lb" },
+//{ "23A9", "braceleftbt" },
+ { "23AA", "bv" },
+//{ "23AA", "braceex" },
+//{ "23AA", "braceleftex" },
+//{ "23AA", "bracerightex" },
+ { "23AB", "rt" },
+//{ "23AB", "bracerighttp" },
+ { "23AC", "rk" },
+//{ "23AC", "bracerightmid" },
+ { "23AD", "rb" },
+//{ "23AD", "bracerightbt" },
+ { "23AF", "an" },
+ { "2502", "br" },
+ { "25A1", "sq" },
+ { "25CA", "lz" },
+ { "25CB", "ci" },
+ { "261C", "lh" },
+ { "261E", "rh" },
+ { "2660", "SP" },
+ { "2663", "CL" },
+ { "2665", "HE" },
+ { "2666", "DI" },
+ { "2713", "OK" },
+ { "27E8", "la" },
+ { "27E9", "ra" },
+};
+
+// global constructor
+static struct unicode_to_glyph_init {
+ unicode_to_glyph_init();
+} _unicode_to_glyph_init;
+
+unicode_to_glyph_init::unicode_to_glyph_init()
+{
+ for (unsigned int i = 0;
+ i < sizeof(unicode_to_glyph_list)/sizeof(unicode_to_glyph_list[0]);
+ i++) {
+ unicode_to_glyph *utg = new unicode_to_glyph[1];
+ utg->value = (char *)unicode_to_glyph_list[i].value;
+ unicode_to_glyph_table.define(unicode_to_glyph_list[i].key, utg);
+ }
+}
+
+const char *unicode_to_glyph_name(const char *s)
+{
+ unicode_to_glyph *result = unicode_to_glyph_table.lookup(s);
+ return result ? result->value : 0;
+}
diff --git a/src/libs/libgroff/uniuni.cpp b/src/libs/libgroff/uniuni.cpp
new file mode 100644
index 0000000..e3b2708
--- /dev/null
+++ b/src/libs/libgroff/uniuni.cpp
@@ -0,0 +1,2128 @@
+// -*- C++ -*-
+/* Copyright (C) 2002-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+// This code has been algorithmically derived from the file
+// UnicodeData.txt, version 7.0.0, available from unicode.org,
+// on 2014-12-16.
+
+#include "lib.h"
+#include "stringclass.h"
+#include "ptable.h"
+
+#include "unicode.h"
+
+struct unicode_decompose {
+ char *value;
+};
+
+declare_ptable(unicode_decompose)
+implement_ptable(unicode_decompose)
+
+PTABLE(unicode_decompose) unicode_decompose_table;
+
+// the first digit in the composite string gives the number of composites
+
+struct S {
+ const char *key;
+ const char *value;
+} unicode_decompose_list[] = {
+ { "00C0", "20041_0300" },
+ { "00C1", "20041_0301" },
+ { "00C2", "20041_0302" },
+ { "00C3", "20041_0303" },
+ { "00C4", "20041_0308" },
+ { "00C5", "20041_030A" },
+ { "00C7", "20043_0327" },
+ { "00C8", "20045_0300" },
+ { "00C9", "20045_0301" },
+ { "00CA", "20045_0302" },
+ { "00CB", "20045_0308" },
+ { "00CC", "20049_0300" },
+ { "00CD", "20049_0301" },
+ { "00CE", "20049_0302" },
+ { "00CF", "20049_0308" },
+ { "00D1", "2004E_0303" },
+ { "00D2", "2004F_0300" },
+ { "00D3", "2004F_0301" },
+ { "00D4", "2004F_0302" },
+ { "00D5", "2004F_0303" },
+ { "00D6", "2004F_0308" },
+ { "00D9", "20055_0300" },
+ { "00DA", "20055_0301" },
+ { "00DB", "20055_0302" },
+ { "00DC", "20055_0308" },
+ { "00DD", "20059_0301" },
+ { "00E0", "20061_0300" },
+ { "00E1", "20061_0301" },
+ { "00E2", "20061_0302" },
+ { "00E3", "20061_0303" },
+ { "00E4", "20061_0308" },
+ { "00E5", "20061_030A" },
+ { "00E7", "20063_0327" },
+ { "00E8", "20065_0300" },
+ { "00E9", "20065_0301" },
+ { "00EA", "20065_0302" },
+ { "00EB", "20065_0308" },
+ { "00EC", "20069_0300" },
+ { "00ED", "20069_0301" },
+ { "00EE", "20069_0302" },
+ { "00EF", "20069_0308" },
+ { "00F1", "2006E_0303" },
+ { "00F2", "2006F_0300" },
+ { "00F3", "2006F_0301" },
+ { "00F4", "2006F_0302" },
+ { "00F5", "2006F_0303" },
+ { "00F6", "2006F_0308" },
+ { "00F9", "20075_0300" },
+ { "00FA", "20075_0301" },
+ { "00FB", "20075_0302" },
+ { "00FC", "20075_0308" },
+ { "00FD", "20079_0301" },
+ { "00FF", "20079_0308" },
+ { "0100", "20041_0304" },
+ { "0101", "20061_0304" },
+ { "0102", "20041_0306" },
+ { "0103", "20061_0306" },
+ { "0104", "20041_0328" },
+ { "0105", "20061_0328" },
+ { "0106", "20043_0301" },
+ { "0107", "20063_0301" },
+ { "0108", "20043_0302" },
+ { "0109", "20063_0302" },
+ { "010A", "20043_0307" },
+ { "010B", "20063_0307" },
+ { "010C", "20043_030C" },
+ { "010D", "20063_030C" },
+ { "010E", "20044_030C" },
+ { "010F", "20064_030C" },
+ { "0112", "20045_0304" },
+ { "0113", "20065_0304" },
+ { "0114", "20045_0306" },
+ { "0115", "20065_0306" },
+ { "0116", "20045_0307" },
+ { "0117", "20065_0307" },
+ { "0118", "20045_0328" },
+ { "0119", "20065_0328" },
+ { "011A", "20045_030C" },
+ { "011B", "20065_030C" },
+ { "011C", "20047_0302" },
+ { "011D", "20067_0302" },
+ { "011E", "20047_0306" },
+ { "011F", "20067_0306" },
+ { "0120", "20047_0307" },
+ { "0121", "20067_0307" },
+ { "0122", "20047_0327" },
+ { "0123", "20067_0327" },
+ { "0124", "20048_0302" },
+ { "0125", "20068_0302" },
+ { "0128", "20049_0303" },
+ { "0129", "20069_0303" },
+ { "012A", "20049_0304" },
+ { "012B", "20069_0304" },
+ { "012C", "20049_0306" },
+ { "012D", "20069_0306" },
+ { "012E", "20049_0328" },
+ { "012F", "20069_0328" },
+ { "0130", "20049_0307" },
+ { "0134", "2004A_0302" },
+ { "0135", "2006A_0302" },
+ { "0136", "2004B_0327" },
+ { "0137", "2006B_0327" },
+ { "0139", "2004C_0301" },
+ { "013A", "2006C_0301" },
+ { "013B", "2004C_0327" },
+ { "013C", "2006C_0327" },
+ { "013D", "2004C_030C" },
+ { "013E", "2006C_030C" },
+ { "0143", "2004E_0301" },
+ { "0144", "2006E_0301" },
+ { "0145", "2004E_0327" },
+ { "0146", "2006E_0327" },
+ { "0147", "2004E_030C" },
+ { "0148", "2006E_030C" },
+ { "014C", "2004F_0304" },
+ { "014D", "2006F_0304" },
+ { "014E", "2004F_0306" },
+ { "014F", "2006F_0306" },
+ { "0150", "2004F_030B" },
+ { "0151", "2006F_030B" },
+ { "0154", "20052_0301" },
+ { "0155", "20072_0301" },
+ { "0156", "20052_0327" },
+ { "0157", "20072_0327" },
+ { "0158", "20052_030C" },
+ { "0159", "20072_030C" },
+ { "015A", "20053_0301" },
+ { "015B", "20073_0301" },
+ { "015C", "20053_0302" },
+ { "015D", "20073_0302" },
+ { "015E", "20053_0327" },
+ { "015F", "20073_0327" },
+ { "0160", "20053_030C" },
+ { "0161", "20073_030C" },
+ { "0162", "20054_0327" },
+ { "0163", "20074_0327" },
+ { "0164", "20054_030C" },
+ { "0165", "20074_030C" },
+ { "0168", "20055_0303" },
+ { "0169", "20075_0303" },
+ { "016A", "20055_0304" },
+ { "016B", "20075_0304" },
+ { "016C", "20055_0306" },
+ { "016D", "20075_0306" },
+ { "016E", "20055_030A" },
+ { "016F", "20075_030A" },
+ { "0170", "20055_030B" },
+ { "0171", "20075_030B" },
+ { "0172", "20055_0328" },
+ { "0173", "20075_0328" },
+ { "0174", "20057_0302" },
+ { "0175", "20077_0302" },
+ { "0176", "20059_0302" },
+ { "0177", "20079_0302" },
+ { "0178", "20059_0308" },
+ { "0179", "2005A_0301" },
+ { "017A", "2007A_0301" },
+ { "017B", "2005A_0307" },
+ { "017C", "2007A_0307" },
+ { "017D", "2005A_030C" },
+ { "017E", "2007A_030C" },
+ { "01A0", "2004F_031B" },
+ { "01A1", "2006F_031B" },
+ { "01AF", "20055_031B" },
+ { "01B0", "20075_031B" },
+ { "01CD", "20041_030C" },
+ { "01CE", "20061_030C" },
+ { "01CF", "20049_030C" },
+ { "01D0", "20069_030C" },
+ { "01D1", "2004F_030C" },
+ { "01D2", "2006F_030C" },
+ { "01D3", "20055_030C" },
+ { "01D4", "20075_030C" },
+ { "01D5", "30055_0308_0304" },
+ { "01D6", "30075_0308_0304" },
+ { "01D7", "30055_0308_0301" },
+ { "01D8", "30075_0308_0301" },
+ { "01D9", "30055_0308_030C" },
+ { "01DA", "30075_0308_030C" },
+ { "01DB", "30055_0308_0300" },
+ { "01DC", "30075_0308_0300" },
+ { "01DE", "30041_0308_0304" },
+ { "01DF", "30061_0308_0304" },
+ { "01E0", "30041_0307_0304" },
+ { "01E1", "30061_0307_0304" },
+ { "01E2", "200C6_0304" },
+ { "01E3", "200E6_0304" },
+ { "01E6", "20047_030C" },
+ { "01E7", "20067_030C" },
+ { "01E8", "2004B_030C" },
+ { "01E9", "2006B_030C" },
+ { "01EA", "2004F_0328" },
+ { "01EB", "2006F_0328" },
+ { "01EC", "3004F_0328_0304" },
+ { "01ED", "3006F_0328_0304" },
+ { "01EE", "201B7_030C" },
+ { "01EF", "20292_030C" },
+ { "01F0", "2006A_030C" },
+ { "01F4", "20047_0301" },
+ { "01F5", "20067_0301" },
+ { "01F8", "2004E_0300" },
+ { "01F9", "2006E_0300" },
+ { "01FA", "30041_030A_0301" },
+ { "01FB", "30061_030A_0301" },
+ { "01FC", "200C6_0301" },
+ { "01FD", "200E6_0301" },
+ { "01FE", "200D8_0301" },
+ { "01FF", "200F8_0301" },
+ { "0200", "20041_030F" },
+ { "0201", "20061_030F" },
+ { "0202", "20041_0311" },
+ { "0203", "20061_0311" },
+ { "0204", "20045_030F" },
+ { "0205", "20065_030F" },
+ { "0206", "20045_0311" },
+ { "0207", "20065_0311" },
+ { "0208", "20049_030F" },
+ { "0209", "20069_030F" },
+ { "020A", "20049_0311" },
+ { "020B", "20069_0311" },
+ { "020C", "2004F_030F" },
+ { "020D", "2006F_030F" },
+ { "020E", "2004F_0311" },
+ { "020F", "2006F_0311" },
+ { "0210", "20052_030F" },
+ { "0211", "20072_030F" },
+ { "0212", "20052_0311" },
+ { "0213", "20072_0311" },
+ { "0214", "20055_030F" },
+ { "0215", "20075_030F" },
+ { "0216", "20055_0311" },
+ { "0217", "20075_0311" },
+ { "0218", "20053_0326" },
+ { "0219", "20073_0326" },
+ { "021A", "20054_0326" },
+ { "021B", "20074_0326" },
+ { "021E", "20048_030C" },
+ { "021F", "20068_030C" },
+ { "0226", "20041_0307" },
+ { "0227", "20061_0307" },
+ { "0228", "20045_0327" },
+ { "0229", "20065_0327" },
+ { "022A", "3004F_0308_0304" },
+ { "022B", "3006F_0308_0304" },
+ { "022C", "3004F_0303_0304" },
+ { "022D", "3006F_0303_0304" },
+ { "022E", "2004F_0307" },
+ { "022F", "2006F_0307" },
+ { "0230", "3004F_0307_0304" },
+ { "0231", "3006F_0307_0304" },
+ { "0232", "20059_0304" },
+ { "0233", "20079_0304" },
+ { "0340", "10300" },
+ { "0341", "10301" },
+ { "0343", "10313" },
+ { "0344", "20308_0301" },
+ { "0374", "102B9" },
+ { "037E", "1003B" },
+ { "0385", "200A8_0301" },
+ { "0386", "20391_0301" },
+ { "0387", "100B7" },
+ { "0388", "20395_0301" },
+ { "0389", "20397_0301" },
+ { "038A", "20399_0301" },
+ { "038C", "2039F_0301" },
+ { "038E", "203A5_0301" },
+ { "038F", "203A9_0301" },
+ { "0390", "303B9_0308_0301" },
+ { "03AA", "20399_0308" },
+ { "03AB", "203A5_0308" },
+ { "03AC", "203B1_0301" },
+ { "03AD", "203B5_0301" },
+ { "03AE", "203B7_0301" },
+ { "03AF", "203B9_0301" },
+ { "03B0", "303C5_0308_0301" },
+ { "03CA", "203B9_0308" },
+ { "03CB", "203C5_0308" },
+ { "03CC", "203BF_0301" },
+ { "03CD", "203C5_0301" },
+ { "03CE", "203C9_0301" },
+ { "03D3", "203D2_0301" },
+ { "03D4", "203D2_0308" },
+ { "0400", "20415_0300" },
+ { "0401", "20415_0308" },
+ { "0403", "20413_0301" },
+ { "0407", "20406_0308" },
+ { "040C", "2041A_0301" },
+ { "040D", "20418_0300" },
+ { "040E", "20423_0306" },
+ { "0419", "20418_0306" },
+ { "0439", "20438_0306" },
+ { "0450", "20435_0300" },
+ { "0451", "20435_0308" },
+ { "0453", "20433_0301" },
+ { "0457", "20456_0308" },
+ { "045C", "2043A_0301" },
+ { "045D", "20438_0300" },
+ { "045E", "20443_0306" },
+ { "0476", "20474_030F" },
+ { "0477", "20475_030F" },
+ { "04C1", "20416_0306" },
+ { "04C2", "20436_0306" },
+ { "04D0", "20410_0306" },
+ { "04D1", "20430_0306" },
+ { "04D2", "20410_0308" },
+ { "04D3", "20430_0308" },
+ { "04D6", "20415_0306" },
+ { "04D7", "20435_0306" },
+ { "04DA", "204D8_0308" },
+ { "04DB", "204D9_0308" },
+ { "04DC", "20416_0308" },
+ { "04DD", "20436_0308" },
+ { "04DE", "20417_0308" },
+ { "04DF", "20437_0308" },
+ { "04E2", "20418_0304" },
+ { "04E3", "20438_0304" },
+ { "04E4", "20418_0308" },
+ { "04E5", "20438_0308" },
+ { "04E6", "2041E_0308" },
+ { "04E7", "2043E_0308" },
+ { "04EA", "204E8_0308" },
+ { "04EB", "204E9_0308" },
+ { "04EC", "2042D_0308" },
+ { "04ED", "2044D_0308" },
+ { "04EE", "20423_0304" },
+ { "04EF", "20443_0304" },
+ { "04F0", "20423_0308" },
+ { "04F1", "20443_0308" },
+ { "04F2", "20423_030B" },
+ { "04F3", "20443_030B" },
+ { "04F4", "20427_0308" },
+ { "04F5", "20447_0308" },
+ { "04F8", "2042B_0308" },
+ { "04F9", "2044B_0308" },
+ { "0622", "20627_0653" },
+ { "0623", "20627_0654" },
+ { "0624", "20648_0654" },
+ { "0625", "20627_0655" },
+ { "0626", "2064A_0654" },
+ { "06C0", "206D5_0654" },
+ { "06C2", "206C1_0654" },
+ { "06D3", "206D2_0654" },
+ { "0929", "20928_093C" },
+ { "0931", "20930_093C" },
+ { "0934", "20933_093C" },
+ { "0958", "20915_093C" },
+ { "0959", "20916_093C" },
+ { "095A", "20917_093C" },
+ { "095B", "2091C_093C" },
+ { "095C", "20921_093C" },
+ { "095D", "20922_093C" },
+ { "095E", "2092B_093C" },
+ { "095F", "2092F_093C" },
+ { "09CB", "209C7_09BE" },
+ { "09CC", "209C7_09D7" },
+ { "09DC", "209A1_09BC" },
+ { "09DD", "209A2_09BC" },
+ { "09DF", "209AF_09BC" },
+ { "0A33", "20A32_0A3C" },
+ { "0A36", "20A38_0A3C" },
+ { "0A59", "20A16_0A3C" },
+ { "0A5A", "20A17_0A3C" },
+ { "0A5B", "20A1C_0A3C" },
+ { "0A5E", "20A2B_0A3C" },
+ { "0B48", "20B47_0B56" },
+ { "0B4B", "20B47_0B3E" },
+ { "0B4C", "20B47_0B57" },
+ { "0B5C", "20B21_0B3C" },
+ { "0B5D", "20B22_0B3C" },
+ { "0B94", "20B92_0BD7" },
+ { "0BCA", "20BC6_0BBE" },
+ { "0BCB", "20BC7_0BBE" },
+ { "0BCC", "20BC6_0BD7" },
+ { "0C48", "20C46_0C56" },
+ { "0CC0", "20CBF_0CD5" },
+ { "0CC7", "20CC6_0CD5" },
+ { "0CC8", "20CC6_0CD6" },
+ { "0CCA", "20CC6_0CC2" },
+ { "0CCB", "30CC6_0CC2_0CD5" },
+ { "0D4A", "20D46_0D3E" },
+ { "0D4B", "20D47_0D3E" },
+ { "0D4C", "20D46_0D57" },
+ { "0DDA", "20DD9_0DCA" },
+ { "0DDC", "20DD9_0DCF" },
+ { "0DDD", "30DD9_0DCF_0DCA" },
+ { "0DDE", "20DD9_0DDF" },
+ { "0F43", "20F42_0FB7" },
+ { "0F4D", "20F4C_0FB7" },
+ { "0F52", "20F51_0FB7" },
+ { "0F57", "20F56_0FB7" },
+ { "0F5C", "20F5B_0FB7" },
+ { "0F69", "20F40_0FB5" },
+ { "0F73", "20F71_0F72" },
+ { "0F75", "20F71_0F74" },
+ { "0F76", "20FB2_0F80" },
+ { "0F78", "20FB3_0F80" },
+ { "0F81", "20F71_0F80" },
+ { "0F93", "20F92_0FB7" },
+ { "0F9D", "20F9C_0FB7" },
+ { "0FA2", "20FA1_0FB7" },
+ { "0FA7", "20FA6_0FB7" },
+ { "0FAC", "20FAB_0FB7" },
+ { "0FB9", "20F90_0FB5" },
+ { "1026", "21025_102E" },
+ { "1B06", "21B05_1B35" },
+ { "1B08", "21B07_1B35" },
+ { "1B0A", "21B09_1B35" },
+ { "1B0C", "21B0B_1B35" },
+ { "1B0E", "21B0D_1B35" },
+ { "1B12", "21B11_1B35" },
+ { "1B3B", "21B3A_1B35" },
+ { "1B3D", "21B3C_1B35" },
+ { "1B40", "21B3E_1B35" },
+ { "1B41", "21B3F_1B35" },
+ { "1B43", "21B42_1B35" },
+ { "1E00", "20041_0325" },
+ { "1E01", "20061_0325" },
+ { "1E02", "20042_0307" },
+ { "1E03", "20062_0307" },
+ { "1E04", "20042_0323" },
+ { "1E05", "20062_0323" },
+ { "1E06", "20042_0331" },
+ { "1E07", "20062_0331" },
+ { "1E08", "30043_0327_0301" },
+ { "1E09", "30063_0327_0301" },
+ { "1E0A", "20044_0307" },
+ { "1E0B", "20064_0307" },
+ { "1E0C", "20044_0323" },
+ { "1E0D", "20064_0323" },
+ { "1E0E", "20044_0331" },
+ { "1E0F", "20064_0331" },
+ { "1E10", "20044_0327" },
+ { "1E11", "20064_0327" },
+ { "1E12", "20044_032D" },
+ { "1E13", "20064_032D" },
+ { "1E14", "30045_0304_0300" },
+ { "1E15", "30065_0304_0300" },
+ { "1E16", "30045_0304_0301" },
+ { "1E17", "30065_0304_0301" },
+ { "1E18", "20045_032D" },
+ { "1E19", "20065_032D" },
+ { "1E1A", "20045_0330" },
+ { "1E1B", "20065_0330" },
+ { "1E1C", "30045_0327_0306" },
+ { "1E1D", "30065_0327_0306" },
+ { "1E1E", "20046_0307" },
+ { "1E1F", "20066_0307" },
+ { "1E20", "20047_0304" },
+ { "1E21", "20067_0304" },
+ { "1E22", "20048_0307" },
+ { "1E23", "20068_0307" },
+ { "1E24", "20048_0323" },
+ { "1E25", "20068_0323" },
+ { "1E26", "20048_0308" },
+ { "1E27", "20068_0308" },
+ { "1E28", "20048_0327" },
+ { "1E29", "20068_0327" },
+ { "1E2A", "20048_032E" },
+ { "1E2B", "20068_032E" },
+ { "1E2C", "20049_0330" },
+ { "1E2D", "20069_0330" },
+ { "1E2E", "30049_0308_0301" },
+ { "1E2F", "30069_0308_0301" },
+ { "1E30", "2004B_0301" },
+ { "1E31", "2006B_0301" },
+ { "1E32", "2004B_0323" },
+ { "1E33", "2006B_0323" },
+ { "1E34", "2004B_0331" },
+ { "1E35", "2006B_0331" },
+ { "1E36", "2004C_0323" },
+ { "1E37", "2006C_0323" },
+ { "1E38", "3004C_0323_0304" },
+ { "1E39", "3006C_0323_0304" },
+ { "1E3A", "2004C_0331" },
+ { "1E3B", "2006C_0331" },
+ { "1E3C", "2004C_032D" },
+ { "1E3D", "2006C_032D" },
+ { "1E3E", "2004D_0301" },
+ { "1E3F", "2006D_0301" },
+ { "1E40", "2004D_0307" },
+ { "1E41", "2006D_0307" },
+ { "1E42", "2004D_0323" },
+ { "1E43", "2006D_0323" },
+ { "1E44", "2004E_0307" },
+ { "1E45", "2006E_0307" },
+ { "1E46", "2004E_0323" },
+ { "1E47", "2006E_0323" },
+ { "1E48", "2004E_0331" },
+ { "1E49", "2006E_0331" },
+ { "1E4A", "2004E_032D" },
+ { "1E4B", "2006E_032D" },
+ { "1E4C", "3004F_0303_0301" },
+ { "1E4D", "3006F_0303_0301" },
+ { "1E4E", "3004F_0303_0308" },
+ { "1E4F", "3006F_0303_0308" },
+ { "1E50", "3004F_0304_0300" },
+ { "1E51", "3006F_0304_0300" },
+ { "1E52", "3004F_0304_0301" },
+ { "1E53", "3006F_0304_0301" },
+ { "1E54", "20050_0301" },
+ { "1E55", "20070_0301" },
+ { "1E56", "20050_0307" },
+ { "1E57", "20070_0307" },
+ { "1E58", "20052_0307" },
+ { "1E59", "20072_0307" },
+ { "1E5A", "20052_0323" },
+ { "1E5B", "20072_0323" },
+ { "1E5C", "30052_0323_0304" },
+ { "1E5D", "30072_0323_0304" },
+ { "1E5E", "20052_0331" },
+ { "1E5F", "20072_0331" },
+ { "1E60", "20053_0307" },
+ { "1E61", "20073_0307" },
+ { "1E62", "20053_0323" },
+ { "1E63", "20073_0323" },
+ { "1E64", "30053_0301_0307" },
+ { "1E65", "30073_0301_0307" },
+ { "1E66", "30053_030C_0307" },
+ { "1E67", "30073_030C_0307" },
+ { "1E68", "30053_0323_0307" },
+ { "1E69", "30073_0323_0307" },
+ { "1E6A", "20054_0307" },
+ { "1E6B", "20074_0307" },
+ { "1E6C", "20054_0323" },
+ { "1E6D", "20074_0323" },
+ { "1E6E", "20054_0331" },
+ { "1E6F", "20074_0331" },
+ { "1E70", "20054_032D" },
+ { "1E71", "20074_032D" },
+ { "1E72", "20055_0324" },
+ { "1E73", "20075_0324" },
+ { "1E74", "20055_0330" },
+ { "1E75", "20075_0330" },
+ { "1E76", "20055_032D" },
+ { "1E77", "20075_032D" },
+ { "1E78", "30055_0303_0301" },
+ { "1E79", "30075_0303_0301" },
+ { "1E7A", "30055_0304_0308" },
+ { "1E7B", "30075_0304_0308" },
+ { "1E7C", "20056_0303" },
+ { "1E7D", "20076_0303" },
+ { "1E7E", "20056_0323" },
+ { "1E7F", "20076_0323" },
+ { "1E80", "20057_0300" },
+ { "1E81", "20077_0300" },
+ { "1E82", "20057_0301" },
+ { "1E83", "20077_0301" },
+ { "1E84", "20057_0308" },
+ { "1E85", "20077_0308" },
+ { "1E86", "20057_0307" },
+ { "1E87", "20077_0307" },
+ { "1E88", "20057_0323" },
+ { "1E89", "20077_0323" },
+ { "1E8A", "20058_0307" },
+ { "1E8B", "20078_0307" },
+ { "1E8C", "20058_0308" },
+ { "1E8D", "20078_0308" },
+ { "1E8E", "20059_0307" },
+ { "1E8F", "20079_0307" },
+ { "1E90", "2005A_0302" },
+ { "1E91", "2007A_0302" },
+ { "1E92", "2005A_0323" },
+ { "1E93", "2007A_0323" },
+ { "1E94", "2005A_0331" },
+ { "1E95", "2007A_0331" },
+ { "1E96", "20068_0331" },
+ { "1E97", "20074_0308" },
+ { "1E98", "20077_030A" },
+ { "1E99", "20079_030A" },
+ { "1E9B", "2017F_0307" },
+ { "1EA0", "20041_0323" },
+ { "1EA1", "20061_0323" },
+ { "1EA2", "20041_0309" },
+ { "1EA3", "20061_0309" },
+ { "1EA4", "30041_0302_0301" },
+ { "1EA5", "30061_0302_0301" },
+ { "1EA6", "30041_0302_0300" },
+ { "1EA7", "30061_0302_0300" },
+ { "1EA8", "30041_0302_0309" },
+ { "1EA9", "30061_0302_0309" },
+ { "1EAA", "30041_0302_0303" },
+ { "1EAB", "30061_0302_0303" },
+ { "1EAC", "30041_0323_0302" },
+ { "1EAD", "30061_0323_0302" },
+ { "1EAE", "30041_0306_0301" },
+ { "1EAF", "30061_0306_0301" },
+ { "1EB0", "30041_0306_0300" },
+ { "1EB1", "30061_0306_0300" },
+ { "1EB2", "30041_0306_0309" },
+ { "1EB3", "30061_0306_0309" },
+ { "1EB4", "30041_0306_0303" },
+ { "1EB5", "30061_0306_0303" },
+ { "1EB6", "30041_0323_0306" },
+ { "1EB7", "30061_0323_0306" },
+ { "1EB8", "20045_0323" },
+ { "1EB9", "20065_0323" },
+ { "1EBA", "20045_0309" },
+ { "1EBB", "20065_0309" },
+ { "1EBC", "20045_0303" },
+ { "1EBD", "20065_0303" },
+ { "1EBE", "30045_0302_0301" },
+ { "1EBF", "30065_0302_0301" },
+ { "1EC0", "30045_0302_0300" },
+ { "1EC1", "30065_0302_0300" },
+ { "1EC2", "30045_0302_0309" },
+ { "1EC3", "30065_0302_0309" },
+ { "1EC4", "30045_0302_0303" },
+ { "1EC5", "30065_0302_0303" },
+ { "1EC6", "30045_0323_0302" },
+ { "1EC7", "30065_0323_0302" },
+ { "1EC8", "20049_0309" },
+ { "1EC9", "20069_0309" },
+ { "1ECA", "20049_0323" },
+ { "1ECB", "20069_0323" },
+ { "1ECC", "2004F_0323" },
+ { "1ECD", "2006F_0323" },
+ { "1ECE", "2004F_0309" },
+ { "1ECF", "2006F_0309" },
+ { "1ED0", "3004F_0302_0301" },
+ { "1ED1", "3006F_0302_0301" },
+ { "1ED2", "3004F_0302_0300" },
+ { "1ED3", "3006F_0302_0300" },
+ { "1ED4", "3004F_0302_0309" },
+ { "1ED5", "3006F_0302_0309" },
+ { "1ED6", "3004F_0302_0303" },
+ { "1ED7", "3006F_0302_0303" },
+ { "1ED8", "3004F_0323_0302" },
+ { "1ED9", "3006F_0323_0302" },
+ { "1EDA", "3004F_031B_0301" },
+ { "1EDB", "3006F_031B_0301" },
+ { "1EDC", "3004F_031B_0300" },
+ { "1EDD", "3006F_031B_0300" },
+ { "1EDE", "3004F_031B_0309" },
+ { "1EDF", "3006F_031B_0309" },
+ { "1EE0", "3004F_031B_0303" },
+ { "1EE1", "3006F_031B_0303" },
+ { "1EE2", "3004F_031B_0323" },
+ { "1EE3", "3006F_031B_0323" },
+ { "1EE4", "20055_0323" },
+ { "1EE5", "20075_0323" },
+ { "1EE6", "20055_0309" },
+ { "1EE7", "20075_0309" },
+ { "1EE8", "30055_031B_0301" },
+ { "1EE9", "30075_031B_0301" },
+ { "1EEA", "30055_031B_0300" },
+ { "1EEB", "30075_031B_0300" },
+ { "1EEC", "30055_031B_0309" },
+ { "1EED", "30075_031B_0309" },
+ { "1EEE", "30055_031B_0303" },
+ { "1EEF", "30075_031B_0303" },
+ { "1EF0", "30055_031B_0323" },
+ { "1EF1", "30075_031B_0323" },
+ { "1EF2", "20059_0300" },
+ { "1EF3", "20079_0300" },
+ { "1EF4", "20059_0323" },
+ { "1EF5", "20079_0323" },
+ { "1EF6", "20059_0309" },
+ { "1EF7", "20079_0309" },
+ { "1EF8", "20059_0303" },
+ { "1EF9", "20079_0303" },
+ { "1F00", "203B1_0313" },
+ { "1F01", "203B1_0314" },
+ { "1F02", "303B1_0313_0300" },
+ { "1F03", "303B1_0314_0300" },
+ { "1F04", "303B1_0313_0301" },
+ { "1F05", "303B1_0314_0301" },
+ { "1F06", "303B1_0313_0342" },
+ { "1F07", "303B1_0314_0342" },
+ { "1F08", "20391_0313" },
+ { "1F09", "20391_0314" },
+ { "1F0A", "30391_0313_0300" },
+ { "1F0B", "30391_0314_0300" },
+ { "1F0C", "30391_0313_0301" },
+ { "1F0D", "30391_0314_0301" },
+ { "1F0E", "30391_0313_0342" },
+ { "1F0F", "30391_0314_0342" },
+ { "1F10", "203B5_0313" },
+ { "1F11", "203B5_0314" },
+ { "1F12", "303B5_0313_0300" },
+ { "1F13", "303B5_0314_0300" },
+ { "1F14", "303B5_0313_0301" },
+ { "1F15", "303B5_0314_0301" },
+ { "1F18", "20395_0313" },
+ { "1F19", "20395_0314" },
+ { "1F1A", "30395_0313_0300" },
+ { "1F1B", "30395_0314_0300" },
+ { "1F1C", "30395_0313_0301" },
+ { "1F1D", "30395_0314_0301" },
+ { "1F20", "203B7_0313" },
+ { "1F21", "203B7_0314" },
+ { "1F22", "303B7_0313_0300" },
+ { "1F23", "303B7_0314_0300" },
+ { "1F24", "303B7_0313_0301" },
+ { "1F25", "303B7_0314_0301" },
+ { "1F26", "303B7_0313_0342" },
+ { "1F27", "303B7_0314_0342" },
+ { "1F28", "20397_0313" },
+ { "1F29", "20397_0314" },
+ { "1F2A", "30397_0313_0300" },
+ { "1F2B", "30397_0314_0300" },
+ { "1F2C", "30397_0313_0301" },
+ { "1F2D", "30397_0314_0301" },
+ { "1F2E", "30397_0313_0342" },
+ { "1F2F", "30397_0314_0342" },
+ { "1F30", "203B9_0313" },
+ { "1F31", "203B9_0314" },
+ { "1F32", "303B9_0313_0300" },
+ { "1F33", "303B9_0314_0300" },
+ { "1F34", "303B9_0313_0301" },
+ { "1F35", "303B9_0314_0301" },
+ { "1F36", "303B9_0313_0342" },
+ { "1F37", "303B9_0314_0342" },
+ { "1F38", "20399_0313" },
+ { "1F39", "20399_0314" },
+ { "1F3A", "30399_0313_0300" },
+ { "1F3B", "30399_0314_0300" },
+ { "1F3C", "30399_0313_0301" },
+ { "1F3D", "30399_0314_0301" },
+ { "1F3E", "30399_0313_0342" },
+ { "1F3F", "30399_0314_0342" },
+ { "1F40", "203BF_0313" },
+ { "1F41", "203BF_0314" },
+ { "1F42", "303BF_0313_0300" },
+ { "1F43", "303BF_0314_0300" },
+ { "1F44", "303BF_0313_0301" },
+ { "1F45", "303BF_0314_0301" },
+ { "1F48", "2039F_0313" },
+ { "1F49", "2039F_0314" },
+ { "1F4A", "3039F_0313_0300" },
+ { "1F4B", "3039F_0314_0300" },
+ { "1F4C", "3039F_0313_0301" },
+ { "1F4D", "3039F_0314_0301" },
+ { "1F50", "203C5_0313" },
+ { "1F51", "203C5_0314" },
+ { "1F52", "303C5_0313_0300" },
+ { "1F53", "303C5_0314_0300" },
+ { "1F54", "303C5_0313_0301" },
+ { "1F55", "303C5_0314_0301" },
+ { "1F56", "303C5_0313_0342" },
+ { "1F57", "303C5_0314_0342" },
+ { "1F59", "203A5_0314" },
+ { "1F5B", "303A5_0314_0300" },
+ { "1F5D", "303A5_0314_0301" },
+ { "1F5F", "303A5_0314_0342" },
+ { "1F60", "203C9_0313" },
+ { "1F61", "203C9_0314" },
+ { "1F62", "303C9_0313_0300" },
+ { "1F63", "303C9_0314_0300" },
+ { "1F64", "303C9_0313_0301" },
+ { "1F65", "303C9_0314_0301" },
+ { "1F66", "303C9_0313_0342" },
+ { "1F67", "303C9_0314_0342" },
+ { "1F68", "203A9_0313" },
+ { "1F69", "203A9_0314" },
+ { "1F6A", "303A9_0313_0300" },
+ { "1F6B", "303A9_0314_0300" },
+ { "1F6C", "303A9_0313_0301" },
+ { "1F6D", "303A9_0314_0301" },
+ { "1F6E", "303A9_0313_0342" },
+ { "1F6F", "303A9_0314_0342" },
+ { "1F70", "203B1_0300" },
+ { "1F71", "203B1_0301" },
+ { "1F72", "203B5_0300" },
+ { "1F73", "203B5_0301" },
+ { "1F74", "203B7_0300" },
+ { "1F75", "203B7_0301" },
+ { "1F76", "203B9_0300" },
+ { "1F77", "203B9_0301" },
+ { "1F78", "203BF_0300" },
+ { "1F79", "203BF_0301" },
+ { "1F7A", "203C5_0300" },
+ { "1F7B", "203C5_0301" },
+ { "1F7C", "203C9_0300" },
+ { "1F7D", "203C9_0301" },
+ { "1F80", "303B1_0313_0345" },
+ { "1F81", "303B1_0314_0345" },
+ { "1F82", "403B1_0313_0300_0345" },
+ { "1F83", "403B1_0314_0300_0345" },
+ { "1F84", "403B1_0313_0301_0345" },
+ { "1F85", "403B1_0314_0301_0345" },
+ { "1F86", "403B1_0313_0342_0345" },
+ { "1F87", "403B1_0314_0342_0345" },
+ { "1F88", "30391_0313_0345" },
+ { "1F89", "30391_0314_0345" },
+ { "1F8A", "40391_0313_0300_0345" },
+ { "1F8B", "40391_0314_0300_0345" },
+ { "1F8C", "40391_0313_0301_0345" },
+ { "1F8D", "40391_0314_0301_0345" },
+ { "1F8E", "40391_0313_0342_0345" },
+ { "1F8F", "40391_0314_0342_0345" },
+ { "1F90", "303B7_0313_0345" },
+ { "1F91", "303B7_0314_0345" },
+ { "1F92", "403B7_0313_0300_0345" },
+ { "1F93", "403B7_0314_0300_0345" },
+ { "1F94", "403B7_0313_0301_0345" },
+ { "1F95", "403B7_0314_0301_0345" },
+ { "1F96", "403B7_0313_0342_0345" },
+ { "1F97", "403B7_0314_0342_0345" },
+ { "1F98", "30397_0313_0345" },
+ { "1F99", "30397_0314_0345" },
+ { "1F9A", "40397_0313_0300_0345" },
+ { "1F9B", "40397_0314_0300_0345" },
+ { "1F9C", "40397_0313_0301_0345" },
+ { "1F9D", "40397_0314_0301_0345" },
+ { "1F9E", "40397_0313_0342_0345" },
+ { "1F9F", "40397_0314_0342_0345" },
+ { "1FA0", "303C9_0313_0345" },
+ { "1FA1", "303C9_0314_0345" },
+ { "1FA2", "403C9_0313_0300_0345" },
+ { "1FA3", "403C9_0314_0300_0345" },
+ { "1FA4", "403C9_0313_0301_0345" },
+ { "1FA5", "403C9_0314_0301_0345" },
+ { "1FA6", "403C9_0313_0342_0345" },
+ { "1FA7", "403C9_0314_0342_0345" },
+ { "1FA8", "303A9_0313_0345" },
+ { "1FA9", "303A9_0314_0345" },
+ { "1FAA", "403A9_0313_0300_0345" },
+ { "1FAB", "403A9_0314_0300_0345" },
+ { "1FAC", "403A9_0313_0301_0345" },
+ { "1FAD", "403A9_0314_0301_0345" },
+ { "1FAE", "403A9_0313_0342_0345" },
+ { "1FAF", "403A9_0314_0342_0345" },
+ { "1FB0", "203B1_0306" },
+ { "1FB1", "203B1_0304" },
+ { "1FB2", "303B1_0300_0345" },
+ { "1FB3", "203B1_0345" },
+ { "1FB4", "303B1_0301_0345" },
+ { "1FB6", "203B1_0342" },
+ { "1FB7", "303B1_0342_0345" },
+ { "1FB8", "20391_0306" },
+ { "1FB9", "20391_0304" },
+ { "1FBA", "20391_0300" },
+ { "1FBB", "20391_0301" },
+ { "1FBC", "20391_0345" },
+ { "1FBE", "103B9" },
+ { "1FC1", "200A8_0342" },
+ { "1FC2", "303B7_0300_0345" },
+ { "1FC3", "203B7_0345" },
+ { "1FC4", "303B7_0301_0345" },
+ { "1FC6", "203B7_0342" },
+ { "1FC7", "303B7_0342_0345" },
+ { "1FC8", "20395_0300" },
+ { "1FC9", "20395_0301" },
+ { "1FCA", "20397_0300" },
+ { "1FCB", "20397_0301" },
+ { "1FCC", "20397_0345" },
+ { "1FCD", "21FBF_0300" },
+ { "1FCE", "21FBF_0301" },
+ { "1FCF", "21FBF_0342" },
+ { "1FD0", "203B9_0306" },
+ { "1FD1", "203B9_0304" },
+ { "1FD2", "303B9_0308_0300" },
+ { "1FD3", "303B9_0308_0301" },
+ { "1FD6", "203B9_0342" },
+ { "1FD7", "303B9_0308_0342" },
+ { "1FD8", "20399_0306" },
+ { "1FD9", "20399_0304" },
+ { "1FDA", "20399_0300" },
+ { "1FDB", "20399_0301" },
+ { "1FDD", "21FFE_0300" },
+ { "1FDE", "21FFE_0301" },
+ { "1FDF", "21FFE_0342" },
+ { "1FE0", "203C5_0306" },
+ { "1FE1", "203C5_0304" },
+ { "1FE2", "303C5_0308_0300" },
+ { "1FE3", "303C5_0308_0301" },
+ { "1FE4", "203C1_0313" },
+ { "1FE5", "203C1_0314" },
+ { "1FE6", "203C5_0342" },
+ { "1FE7", "303C5_0308_0342" },
+ { "1FE8", "203A5_0306" },
+ { "1FE9", "203A5_0304" },
+ { "1FEA", "203A5_0300" },
+ { "1FEB", "203A5_0301" },
+ { "1FEC", "203A1_0314" },
+ { "1FED", "200A8_0300" },
+ { "1FEE", "200A8_0301" },
+ { "1FEF", "10060" },
+ { "1FF2", "303C9_0300_0345" },
+ { "1FF3", "203C9_0345" },
+ { "1FF4", "303C9_0301_0345" },
+ { "1FF6", "203C9_0342" },
+ { "1FF7", "303C9_0342_0345" },
+ { "1FF8", "2039F_0300" },
+ { "1FF9", "2039F_0301" },
+ { "1FFA", "203A9_0300" },
+ { "1FFB", "203A9_0301" },
+ { "1FFC", "203A9_0345" },
+ { "1FFD", "100B4" },
+ { "2000", "12002" },
+ { "2001", "12003" },
+ { "2126", "103A9" },
+ { "212A", "1004B" },
+ { "212B", "20041_030A" },
+ { "219A", "22190_0338" },
+ { "219B", "22192_0338" },
+ { "21AE", "22194_0338" },
+ { "21CD", "221D0_0338" },
+ { "21CE", "221D4_0338" },
+ { "21CF", "221D2_0338" },
+ { "2204", "22203_0338" },
+ { "2209", "22208_0338" },
+ { "220C", "2220B_0338" },
+ { "2224", "22223_0338" },
+ { "2226", "22225_0338" },
+ { "2241", "2223C_0338" },
+ { "2244", "22243_0338" },
+ { "2247", "22245_0338" },
+ { "2249", "22248_0338" },
+ { "2260", "2003D_0338" },
+ { "2262", "22261_0338" },
+ { "226D", "2224D_0338" },
+ { "226E", "2003C_0338" },
+ { "226F", "2003E_0338" },
+ { "2270", "22264_0338" },
+ { "2271", "22265_0338" },
+ { "2274", "22272_0338" },
+ { "2275", "22273_0338" },
+ { "2278", "22276_0338" },
+ { "2279", "22277_0338" },
+ { "2280", "2227A_0338" },
+ { "2281", "2227B_0338" },
+ { "2284", "22282_0338" },
+ { "2285", "22283_0338" },
+ { "2288", "22286_0338" },
+ { "2289", "22287_0338" },
+ { "22AC", "222A2_0338" },
+ { "22AD", "222A8_0338" },
+ { "22AE", "222A9_0338" },
+ { "22AF", "222AB_0338" },
+ { "22E0", "2227C_0338" },
+ { "22E1", "2227D_0338" },
+ { "22E2", "22291_0338" },
+ { "22E3", "22292_0338" },
+ { "22EA", "222B2_0338" },
+ { "22EB", "222B3_0338" },
+ { "22EC", "222B4_0338" },
+ { "22ED", "222B5_0338" },
+ { "2329", "13008" },
+ { "232A", "13009" },
+ { "2ADC", "22ADD_0338" },
+ { "304C", "2304B_3099" },
+ { "304E", "2304D_3099" },
+ { "3050", "2304F_3099" },
+ { "3052", "23051_3099" },
+ { "3054", "23053_3099" },
+ { "3056", "23055_3099" },
+ { "3058", "23057_3099" },
+ { "305A", "23059_3099" },
+ { "305C", "2305B_3099" },
+ { "305E", "2305D_3099" },
+ { "3060", "2305F_3099" },
+ { "3062", "23061_3099" },
+ { "3065", "23064_3099" },
+ { "3067", "23066_3099" },
+ { "3069", "23068_3099" },
+ { "3070", "2306F_3099" },
+ { "3071", "2306F_309A" },
+ { "3073", "23072_3099" },
+ { "3074", "23072_309A" },
+ { "3076", "23075_3099" },
+ { "3077", "23075_309A" },
+ { "3079", "23078_3099" },
+ { "307A", "23078_309A" },
+ { "307C", "2307B_3099" },
+ { "307D", "2307B_309A" },
+ { "3094", "23046_3099" },
+ { "309E", "2309D_3099" },
+ { "30AC", "230AB_3099" },
+ { "30AE", "230AD_3099" },
+ { "30B0", "230AF_3099" },
+ { "30B2", "230B1_3099" },
+ { "30B4", "230B3_3099" },
+ { "30B6", "230B5_3099" },
+ { "30B8", "230B7_3099" },
+ { "30BA", "230B9_3099" },
+ { "30BC", "230BB_3099" },
+ { "30BE", "230BD_3099" },
+ { "30C0", "230BF_3099" },
+ { "30C2", "230C1_3099" },
+ { "30C5", "230C4_3099" },
+ { "30C7", "230C6_3099" },
+ { "30C9", "230C8_3099" },
+ { "30D0", "230CF_3099" },
+ { "30D1", "230CF_309A" },
+ { "30D3", "230D2_3099" },
+ { "30D4", "230D2_309A" },
+ { "30D6", "230D5_3099" },
+ { "30D7", "230D5_309A" },
+ { "30D9", "230D8_3099" },
+ { "30DA", "230D8_309A" },
+ { "30DC", "230DB_3099" },
+ { "30DD", "230DB_309A" },
+ { "30F4", "230A6_3099" },
+ { "30F7", "230EF_3099" },
+ { "30F8", "230F0_3099" },
+ { "30F9", "230F1_3099" },
+ { "30FA", "230F2_3099" },
+ { "30FE", "230FD_3099" },
+ { "F900", "18C48" },
+ { "F901", "166F4" },
+ { "F902", "18ECA" },
+ { "F903", "18CC8" },
+ { "F904", "16ED1" },
+ { "F905", "14E32" },
+ { "F906", "153E5" },
+ { "F907", "19F9C" },
+ { "F908", "19F9C" },
+ { "F909", "15951" },
+ { "F90A", "191D1" },
+ { "F90B", "15587" },
+ { "F90C", "15948" },
+ { "F90D", "161F6" },
+ { "F90E", "17669" },
+ { "F90F", "17F85" },
+ { "F910", "1863F" },
+ { "F911", "187BA" },
+ { "F912", "188F8" },
+ { "F913", "1908F" },
+ { "F914", "16A02" },
+ { "F915", "16D1B" },
+ { "F916", "170D9" },
+ { "F917", "173DE" },
+ { "F918", "1843D" },
+ { "F919", "1916A" },
+ { "F91A", "199F1" },
+ { "F91B", "14E82" },
+ { "F91C", "15375" },
+ { "F91D", "16B04" },
+ { "F91E", "1721B" },
+ { "F91F", "1862D" },
+ { "F920", "19E1E" },
+ { "F921", "15D50" },
+ { "F922", "16FEB" },
+ { "F923", "185CD" },
+ { "F924", "18964" },
+ { "F925", "162C9" },
+ { "F926", "181D8" },
+ { "F927", "1881F" },
+ { "F928", "15ECA" },
+ { "F929", "16717" },
+ { "F92A", "16D6A" },
+ { "F92B", "172FC" },
+ { "F92C", "190CE" },
+ { "F92D", "14F86" },
+ { "F92E", "151B7" },
+ { "F92F", "152DE" },
+ { "F930", "164C4" },
+ { "F931", "16AD3" },
+ { "F932", "17210" },
+ { "F933", "176E7" },
+ { "F934", "18001" },
+ { "F935", "18606" },
+ { "F936", "1865C" },
+ { "F937", "18DEF" },
+ { "F938", "19732" },
+ { "F939", "19B6F" },
+ { "F93A", "19DFA" },
+ { "F93B", "1788C" },
+ { "F93C", "1797F" },
+ { "F93D", "17DA0" },
+ { "F93E", "183C9" },
+ { "F93F", "19304" },
+ { "F940", "19E7F" },
+ { "F941", "18AD6" },
+ { "F942", "158DF" },
+ { "F943", "15F04" },
+ { "F944", "17C60" },
+ { "F945", "1807E" },
+ { "F946", "17262" },
+ { "F947", "178CA" },
+ { "F948", "18CC2" },
+ { "F949", "196F7" },
+ { "F94A", "158D8" },
+ { "F94B", "15C62" },
+ { "F94C", "16A13" },
+ { "F94D", "16DDA" },
+ { "F94E", "16F0F" },
+ { "F94F", "17D2F" },
+ { "F950", "17E37" },
+ { "F951", "1964B" },
+ { "F952", "152D2" },
+ { "F953", "1808B" },
+ { "F954", "151DC" },
+ { "F955", "151CC" },
+ { "F956", "17A1C" },
+ { "F957", "17DBE" },
+ { "F958", "183F1" },
+ { "F959", "19675" },
+ { "F95A", "18B80" },
+ { "F95B", "162CF" },
+ { "F95C", "16A02" },
+ { "F95D", "18AFE" },
+ { "F95E", "14E39" },
+ { "F95F", "15BE7" },
+ { "F960", "16012" },
+ { "F961", "17387" },
+ { "F962", "17570" },
+ { "F963", "15317" },
+ { "F964", "178FB" },
+ { "F965", "14FBF" },
+ { "F966", "15FA9" },
+ { "F967", "14E0D" },
+ { "F968", "16CCC" },
+ { "F969", "16578" },
+ { "F96A", "17D22" },
+ { "F96B", "153C3" },
+ { "F96C", "1585E" },
+ { "F96D", "17701" },
+ { "F96E", "18449" },
+ { "F96F", "18AAA" },
+ { "F970", "16BBA" },
+ { "F971", "18FB0" },
+ { "F972", "16C88" },
+ { "F973", "162FE" },
+ { "F974", "182E5" },
+ { "F975", "163A0" },
+ { "F976", "17565" },
+ { "F977", "14EAE" },
+ { "F978", "15169" },
+ { "F979", "151C9" },
+ { "F97A", "16881" },
+ { "F97B", "17CE7" },
+ { "F97C", "1826F" },
+ { "F97D", "18AD2" },
+ { "F97E", "191CF" },
+ { "F97F", "152F5" },
+ { "F980", "15442" },
+ { "F981", "15973" },
+ { "F982", "15EEC" },
+ { "F983", "165C5" },
+ { "F984", "16FFE" },
+ { "F985", "1792A" },
+ { "F986", "195AD" },
+ { "F987", "19A6A" },
+ { "F988", "19E97" },
+ { "F989", "19ECE" },
+ { "F98A", "1529B" },
+ { "F98B", "166C6" },
+ { "F98C", "16B77" },
+ { "F98D", "18F62" },
+ { "F98E", "15E74" },
+ { "F98F", "16190" },
+ { "F990", "16200" },
+ { "F991", "1649A" },
+ { "F992", "16F23" },
+ { "F993", "17149" },
+ { "F994", "17489" },
+ { "F995", "179CA" },
+ { "F996", "17DF4" },
+ { "F997", "1806F" },
+ { "F998", "18F26" },
+ { "F999", "184EE" },
+ { "F99A", "19023" },
+ { "F99B", "1934A" },
+ { "F99C", "15217" },
+ { "F99D", "152A3" },
+ { "F99E", "154BD" },
+ { "F99F", "170C8" },
+ { "F9A0", "188C2" },
+ { "F9A1", "18AAA" },
+ { "F9A2", "15EC9" },
+ { "F9A3", "15FF5" },
+ { "F9A4", "1637B" },
+ { "F9A5", "16BAE" },
+ { "F9A6", "17C3E" },
+ { "F9A7", "17375" },
+ { "F9A8", "14EE4" },
+ { "F9A9", "156F9" },
+ { "F9AA", "15BE7" },
+ { "F9AB", "15DBA" },
+ { "F9AC", "1601C" },
+ { "F9AD", "173B2" },
+ { "F9AE", "17469" },
+ { "F9AF", "17F9A" },
+ { "F9B0", "18046" },
+ { "F9B1", "19234" },
+ { "F9B2", "196F6" },
+ { "F9B3", "19748" },
+ { "F9B4", "19818" },
+ { "F9B5", "14F8B" },
+ { "F9B6", "179AE" },
+ { "F9B7", "191B4" },
+ { "F9B8", "196B8" },
+ { "F9B9", "160E1" },
+ { "F9BA", "14E86" },
+ { "F9BB", "150DA" },
+ { "F9BC", "15BEE" },
+ { "F9BD", "15C3F" },
+ { "F9BE", "16599" },
+ { "F9BF", "16A02" },
+ { "F9C0", "171CE" },
+ { "F9C1", "17642" },
+ { "F9C2", "184FC" },
+ { "F9C3", "1907C" },
+ { "F9C4", "19F8D" },
+ { "F9C5", "16688" },
+ { "F9C6", "1962E" },
+ { "F9C7", "15289" },
+ { "F9C8", "1677B" },
+ { "F9C9", "167F3" },
+ { "F9CA", "16D41" },
+ { "F9CB", "16E9C" },
+ { "F9CC", "17409" },
+ { "F9CD", "17559" },
+ { "F9CE", "1786B" },
+ { "F9CF", "17D10" },
+ { "F9D0", "1985E" },
+ { "F9D1", "1516D" },
+ { "F9D2", "1622E" },
+ { "F9D3", "19678" },
+ { "F9D4", "1502B" },
+ { "F9D5", "15D19" },
+ { "F9D6", "16DEA" },
+ { "F9D7", "18F2A" },
+ { "F9D8", "15F8B" },
+ { "F9D9", "16144" },
+ { "F9DA", "16817" },
+ { "F9DB", "17387" },
+ { "F9DC", "19686" },
+ { "F9DD", "15229" },
+ { "F9DE", "1540F" },
+ { "F9DF", "15C65" },
+ { "F9E0", "16613" },
+ { "F9E1", "1674E" },
+ { "F9E2", "168A8" },
+ { "F9E3", "16CE5" },
+ { "F9E4", "17406" },
+ { "F9E5", "175E2" },
+ { "F9E6", "17F79" },
+ { "F9E7", "188CF" },
+ { "F9E8", "188E1" },
+ { "F9E9", "191CC" },
+ { "F9EA", "196E2" },
+ { "F9EB", "1533F" },
+ { "F9EC", "16EBA" },
+ { "F9ED", "1541D" },
+ { "F9EE", "171D0" },
+ { "F9EF", "17498" },
+ { "F9F0", "185FA" },
+ { "F9F1", "196A3" },
+ { "F9F2", "19C57" },
+ { "F9F3", "19E9F" },
+ { "F9F4", "16797" },
+ { "F9F5", "16DCB" },
+ { "F9F6", "181E8" },
+ { "F9F7", "17ACB" },
+ { "F9F8", "17B20" },
+ { "F9F9", "17C92" },
+ { "F9FA", "172C0" },
+ { "F9FB", "17099" },
+ { "F9FC", "18B58" },
+ { "F9FD", "14EC0" },
+ { "F9FE", "18336" },
+ { "F9FF", "1523A" },
+ { "FA00", "15207" },
+ { "FA01", "15EA6" },
+ { "FA02", "162D3" },
+ { "FA03", "17CD6" },
+ { "FA04", "15B85" },
+ { "FA05", "16D1E" },
+ { "FA06", "166B4" },
+ { "FA07", "18F3B" },
+ { "FA08", "1884C" },
+ { "FA09", "1964D" },
+ { "FA0A", "1898B" },
+ { "FA0B", "15ED3" },
+ { "FA0C", "15140" },
+ { "FA0D", "155C0" },
+ { "FA10", "1585A" },
+ { "FA12", "16674" },
+ { "FA15", "151DE" },
+ { "FA16", "1732A" },
+ { "FA17", "176CA" },
+ { "FA18", "1793C" },
+ { "FA19", "1795E" },
+ { "FA1A", "17965" },
+ { "FA1B", "1798F" },
+ { "FA1C", "19756" },
+ { "FA1D", "17CBE" },
+ { "FA1E", "17FBD" },
+ { "FA20", "18612" },
+ { "FA22", "18AF8" },
+ { "FA25", "19038" },
+ { "FA26", "190FD" },
+ { "FA2A", "198EF" },
+ { "FA2B", "198FC" },
+ { "FA2C", "19928" },
+ { "FA2D", "19DB4" },
+ { "FA2E", "190DE" },
+ { "FA2F", "196B7" },
+ { "FA30", "14FAE" },
+ { "FA31", "150E7" },
+ { "FA32", "1514D" },
+ { "FA33", "152C9" },
+ { "FA34", "152E4" },
+ { "FA35", "15351" },
+ { "FA36", "1559D" },
+ { "FA37", "15606" },
+ { "FA38", "15668" },
+ { "FA39", "15840" },
+ { "FA3A", "158A8" },
+ { "FA3B", "15C64" },
+ { "FA3C", "15C6E" },
+ { "FA3D", "16094" },
+ { "FA3E", "16168" },
+ { "FA3F", "1618E" },
+ { "FA40", "161F2" },
+ { "FA41", "1654F" },
+ { "FA42", "165E2" },
+ { "FA43", "16691" },
+ { "FA44", "16885" },
+ { "FA45", "16D77" },
+ { "FA46", "16E1A" },
+ { "FA47", "16F22" },
+ { "FA48", "1716E" },
+ { "FA49", "1722B" },
+ { "FA4A", "17422" },
+ { "FA4B", "17891" },
+ { "FA4C", "1793E" },
+ { "FA4D", "17949" },
+ { "FA4E", "17948" },
+ { "FA4F", "17950" },
+ { "FA50", "17956" },
+ { "FA51", "1795D" },
+ { "FA52", "1798D" },
+ { "FA53", "1798E" },
+ { "FA54", "17A40" },
+ { "FA55", "17A81" },
+ { "FA56", "17BC0" },
+ { "FA57", "17DF4" },
+ { "FA58", "17E09" },
+ { "FA59", "17E41" },
+ { "FA5A", "17F72" },
+ { "FA5B", "18005" },
+ { "FA5C", "181ED" },
+ { "FA5D", "18279" },
+ { "FA5E", "18279" },
+ { "FA5F", "18457" },
+ { "FA60", "18910" },
+ { "FA61", "18996" },
+ { "FA62", "18B01" },
+ { "FA63", "18B39" },
+ { "FA64", "18CD3" },
+ { "FA65", "18D08" },
+ { "FA66", "18FB6" },
+ { "FA67", "19038" },
+ { "FA68", "196E3" },
+ { "FA69", "197FF" },
+ { "FA6A", "1983B" },
+ { "FA6B", "16075" },
+ { "FA6C", "1242EE" },
+ { "FA6D", "18218" },
+ { "FA70", "14E26" },
+ { "FA71", "151B5" },
+ { "FA72", "15168" },
+ { "FA73", "14F80" },
+ { "FA74", "15145" },
+ { "FA75", "15180" },
+ { "FA76", "152C7" },
+ { "FA77", "152FA" },
+ { "FA78", "1559D" },
+ { "FA79", "15555" },
+ { "FA7A", "15599" },
+ { "FA7B", "155E2" },
+ { "FA7C", "1585A" },
+ { "FA7D", "158B3" },
+ { "FA7E", "15944" },
+ { "FA7F", "15954" },
+ { "FA80", "15A62" },
+ { "FA81", "15B28" },
+ { "FA82", "15ED2" },
+ { "FA83", "15ED9" },
+ { "FA84", "15F69" },
+ { "FA85", "15FAD" },
+ { "FA86", "160D8" },
+ { "FA87", "1614E" },
+ { "FA88", "16108" },
+ { "FA89", "1618E" },
+ { "FA8A", "16160" },
+ { "FA8B", "161F2" },
+ { "FA8C", "16234" },
+ { "FA8D", "163C4" },
+ { "FA8E", "1641C" },
+ { "FA8F", "16452" },
+ { "FA90", "16556" },
+ { "FA91", "16674" },
+ { "FA92", "16717" },
+ { "FA93", "1671B" },
+ { "FA94", "16756" },
+ { "FA95", "16B79" },
+ { "FA96", "16BBA" },
+ { "FA97", "16D41" },
+ { "FA98", "16EDB" },
+ { "FA99", "16ECB" },
+ { "FA9A", "16F22" },
+ { "FA9B", "1701E" },
+ { "FA9C", "1716E" },
+ { "FA9D", "177A7" },
+ { "FA9E", "17235" },
+ { "FA9F", "172AF" },
+ { "FAA0", "1732A" },
+ { "FAA1", "17471" },
+ { "FAA2", "17506" },
+ { "FAA3", "1753B" },
+ { "FAA4", "1761D" },
+ { "FAA5", "1761F" },
+ { "FAA6", "176CA" },
+ { "FAA7", "176DB" },
+ { "FAA8", "176F4" },
+ { "FAA9", "1774A" },
+ { "FAAA", "17740" },
+ { "FAAB", "178CC" },
+ { "FAAC", "17AB1" },
+ { "FAAD", "17BC0" },
+ { "FAAE", "17C7B" },
+ { "FAAF", "17D5B" },
+ { "FAB0", "17DF4" },
+ { "FAB1", "17F3E" },
+ { "FAB2", "18005" },
+ { "FAB3", "18352" },
+ { "FAB4", "183EF" },
+ { "FAB5", "18779" },
+ { "FAB6", "18941" },
+ { "FAB7", "18986" },
+ { "FAB8", "18996" },
+ { "FAB9", "18ABF" },
+ { "FABA", "18AF8" },
+ { "FABB", "18ACB" },
+ { "FABC", "18B01" },
+ { "FABD", "18AFE" },
+ { "FABE", "18AED" },
+ { "FABF", "18B39" },
+ { "FAC0", "18B8A" },
+ { "FAC1", "18D08" },
+ { "FAC2", "18F38" },
+ { "FAC3", "19072" },
+ { "FAC4", "19199" },
+ { "FAC5", "19276" },
+ { "FAC6", "1967C" },
+ { "FAC7", "196E3" },
+ { "FAC8", "19756" },
+ { "FAC9", "197DB" },
+ { "FACA", "197FF" },
+ { "FACB", "1980B" },
+ { "FACC", "1983B" },
+ { "FACD", "19B12" },
+ { "FACE", "19F9C" },
+ { "FACF", "12284A" },
+ { "FAD0", "122844" },
+ { "FAD1", "1233D5" },
+ { "FAD2", "13B9D" },
+ { "FAD3", "14018" },
+ { "FAD4", "14039" },
+ { "FAD5", "125249" },
+ { "FAD6", "125CD0" },
+ { "FAD7", "127ED3" },
+ { "FAD8", "19F43" },
+ { "FAD9", "19F8E" },
+ { "FB1D", "205D9_05B4" },
+ { "FB1F", "205F2_05B7" },
+ { "FB2A", "205E9_05C1" },
+ { "FB2B", "205E9_05C2" },
+ { "FB2C", "305E9_05BC_05C1" },
+ { "FB2D", "305E9_05BC_05C2" },
+ { "FB2E", "205D0_05B7" },
+ { "FB2F", "205D0_05B8" },
+ { "FB30", "205D0_05BC" },
+ { "FB31", "205D1_05BC" },
+ { "FB32", "205D2_05BC" },
+ { "FB33", "205D3_05BC" },
+ { "FB34", "205D4_05BC" },
+ { "FB35", "205D5_05BC" },
+ { "FB36", "205D6_05BC" },
+ { "FB38", "205D8_05BC" },
+ { "FB39", "205D9_05BC" },
+ { "FB3A", "205DA_05BC" },
+ { "FB3B", "205DB_05BC" },
+ { "FB3C", "205DC_05BC" },
+ { "FB3E", "205DE_05BC" },
+ { "FB40", "205E0_05BC" },
+ { "FB41", "205E1_05BC" },
+ { "FB43", "205E3_05BC" },
+ { "FB44", "205E4_05BC" },
+ { "FB46", "205E6_05BC" },
+ { "FB47", "205E7_05BC" },
+ { "FB48", "205E8_05BC" },
+ { "FB49", "205E9_05BC" },
+ { "FB4A", "205EA_05BC" },
+ { "FB4B", "205D5_05B9" },
+ { "FB4C", "205D1_05BF" },
+ { "FB4D", "205DB_05BF" },
+ { "FB4E", "205E4_05BF" },
+ { "1109A", "211099_110BA" },
+ { "1109C", "21109B_110BA" },
+ { "110AB", "2110A5_110BA" },
+ { "1112E", "211131_11127" },
+ { "1112F", "211132_11127" },
+ { "1134B", "211347_1133E" },
+ { "1134C", "211347_11357" },
+ { "114BB", "2114B9_114BA" },
+ { "114BC", "2114B9_114B0" },
+ { "114BE", "2114B9_114BD" },
+ { "115BA", "2115B8_115AF" },
+ { "115BB", "2115B9_115AF" },
+ { "1D15E", "21D157_1D165" },
+ { "1D15F", "21D158_1D165" },
+ { "1D160", "31D158_1D165_1D16E" },
+ { "1D161", "31D158_1D165_1D16F" },
+ { "1D162", "31D158_1D165_1D170" },
+ { "1D163", "31D158_1D165_1D171" },
+ { "1D164", "31D158_1D165_1D172" },
+ { "1D1BB", "21D1B9_1D165" },
+ { "1D1BC", "21D1BA_1D165" },
+ { "1D1BD", "31D1B9_1D165_1D16E" },
+ { "1D1BE", "31D1BA_1D165_1D16E" },
+ { "1D1BF", "31D1B9_1D165_1D16F" },
+ { "1D1C0", "31D1BA_1D165_1D16F" },
+ { "2F800", "14E3D" },
+ { "2F801", "14E38" },
+ { "2F802", "14E41" },
+ { "2F803", "120122" },
+ { "2F804", "14F60" },
+ { "2F805", "14FAE" },
+ { "2F806", "14FBB" },
+ { "2F807", "15002" },
+ { "2F808", "1507A" },
+ { "2F809", "15099" },
+ { "2F80A", "150E7" },
+ { "2F80B", "150CF" },
+ { "2F80C", "1349E" },
+ { "2F80D", "12063A" },
+ { "2F80E", "1514D" },
+ { "2F80F", "15154" },
+ { "2F810", "15164" },
+ { "2F811", "15177" },
+ { "2F812", "12051C" },
+ { "2F813", "134B9" },
+ { "2F814", "15167" },
+ { "2F815", "1518D" },
+ { "2F816", "12054B" },
+ { "2F817", "15197" },
+ { "2F818", "151A4" },
+ { "2F819", "14ECC" },
+ { "2F81A", "151AC" },
+ { "2F81B", "151B5" },
+ { "2F81C", "1291DF" },
+ { "2F81D", "151F5" },
+ { "2F81E", "15203" },
+ { "2F81F", "134DF" },
+ { "2F820", "1523B" },
+ { "2F821", "15246" },
+ { "2F822", "15272" },
+ { "2F823", "15277" },
+ { "2F824", "13515" },
+ { "2F825", "152C7" },
+ { "2F826", "152C9" },
+ { "2F827", "152E4" },
+ { "2F828", "152FA" },
+ { "2F829", "15305" },
+ { "2F82A", "15306" },
+ { "2F82B", "15317" },
+ { "2F82C", "15349" },
+ { "2F82D", "15351" },
+ { "2F82E", "1535A" },
+ { "2F82F", "15373" },
+ { "2F830", "1537D" },
+ { "2F831", "1537F" },
+ { "2F832", "1537F" },
+ { "2F833", "1537F" },
+ { "2F834", "120A2C" },
+ { "2F835", "17070" },
+ { "2F836", "153CA" },
+ { "2F837", "153DF" },
+ { "2F838", "120B63" },
+ { "2F839", "153EB" },
+ { "2F83A", "153F1" },
+ { "2F83B", "15406" },
+ { "2F83C", "1549E" },
+ { "2F83D", "15438" },
+ { "2F83E", "15448" },
+ { "2F83F", "15468" },
+ { "2F840", "154A2" },
+ { "2F841", "154F6" },
+ { "2F842", "15510" },
+ { "2F843", "15553" },
+ { "2F844", "15563" },
+ { "2F845", "15584" },
+ { "2F846", "15584" },
+ { "2F847", "15599" },
+ { "2F848", "155AB" },
+ { "2F849", "155B3" },
+ { "2F84A", "155C2" },
+ { "2F84B", "15716" },
+ { "2F84C", "15606" },
+ { "2F84D", "15717" },
+ { "2F84E", "15651" },
+ { "2F84F", "15674" },
+ { "2F850", "15207" },
+ { "2F851", "158EE" },
+ { "2F852", "157CE" },
+ { "2F853", "157F4" },
+ { "2F854", "1580D" },
+ { "2F855", "1578B" },
+ { "2F856", "15832" },
+ { "2F857", "15831" },
+ { "2F858", "158AC" },
+ { "2F859", "1214E4" },
+ { "2F85A", "158F2" },
+ { "2F85B", "158F7" },
+ { "2F85C", "15906" },
+ { "2F85D", "1591A" },
+ { "2F85E", "15922" },
+ { "2F85F", "15962" },
+ { "2F860", "1216A8" },
+ { "2F861", "1216EA" },
+ { "2F862", "159EC" },
+ { "2F863", "15A1B" },
+ { "2F864", "15A27" },
+ { "2F865", "159D8" },
+ { "2F866", "15A66" },
+ { "2F867", "136EE" },
+ { "2F868", "136FC" },
+ { "2F869", "15B08" },
+ { "2F86A", "15B3E" },
+ { "2F86B", "15B3E" },
+ { "2F86C", "1219C8" },
+ { "2F86D", "15BC3" },
+ { "2F86E", "15BD8" },
+ { "2F86F", "15BE7" },
+ { "2F870", "15BF3" },
+ { "2F871", "121B18" },
+ { "2F872", "15BFF" },
+ { "2F873", "15C06" },
+ { "2F874", "15F53" },
+ { "2F875", "15C22" },
+ { "2F876", "13781" },
+ { "2F877", "15C60" },
+ { "2F878", "15C6E" },
+ { "2F879", "15CC0" },
+ { "2F87A", "15C8D" },
+ { "2F87B", "121DE4" },
+ { "2F87C", "15D43" },
+ { "2F87D", "121DE6" },
+ { "2F87E", "15D6E" },
+ { "2F87F", "15D6B" },
+ { "2F880", "15D7C" },
+ { "2F881", "15DE1" },
+ { "2F882", "15DE2" },
+ { "2F883", "1382F" },
+ { "2F884", "15DFD" },
+ { "2F885", "15E28" },
+ { "2F886", "15E3D" },
+ { "2F887", "15E69" },
+ { "2F888", "13862" },
+ { "2F889", "122183" },
+ { "2F88A", "1387C" },
+ { "2F88B", "15EB0" },
+ { "2F88C", "15EB3" },
+ { "2F88D", "15EB6" },
+ { "2F88E", "15ECA" },
+ { "2F88F", "12A392" },
+ { "2F890", "15EFE" },
+ { "2F891", "122331" },
+ { "2F892", "122331" },
+ { "2F893", "18201" },
+ { "2F894", "15F22" },
+ { "2F895", "15F22" },
+ { "2F896", "138C7" },
+ { "2F897", "1232B8" },
+ { "2F898", "1261DA" },
+ { "2F899", "15F62" },
+ { "2F89A", "15F6B" },
+ { "2F89B", "138E3" },
+ { "2F89C", "15F9A" },
+ { "2F89D", "15FCD" },
+ { "2F89E", "15FD7" },
+ { "2F89F", "15FF9" },
+ { "2F8A0", "16081" },
+ { "2F8A1", "1393A" },
+ { "2F8A2", "1391C" },
+ { "2F8A3", "16094" },
+ { "2F8A4", "1226D4" },
+ { "2F8A5", "160C7" },
+ { "2F8A6", "16148" },
+ { "2F8A7", "1614C" },
+ { "2F8A8", "1614E" },
+ { "2F8A9", "1614C" },
+ { "2F8AA", "1617A" },
+ { "2F8AB", "1618E" },
+ { "2F8AC", "161B2" },
+ { "2F8AD", "161A4" },
+ { "2F8AE", "161AF" },
+ { "2F8AF", "161DE" },
+ { "2F8B0", "161F2" },
+ { "2F8B1", "161F6" },
+ { "2F8B2", "16210" },
+ { "2F8B3", "1621B" },
+ { "2F8B4", "1625D" },
+ { "2F8B5", "162B1" },
+ { "2F8B6", "162D4" },
+ { "2F8B7", "16350" },
+ { "2F8B8", "122B0C" },
+ { "2F8B9", "1633D" },
+ { "2F8BA", "162FC" },
+ { "2F8BB", "16368" },
+ { "2F8BC", "16383" },
+ { "2F8BD", "163E4" },
+ { "2F8BE", "122BF1" },
+ { "2F8BF", "16422" },
+ { "2F8C0", "163C5" },
+ { "2F8C1", "163A9" },
+ { "2F8C2", "13A2E" },
+ { "2F8C3", "16469" },
+ { "2F8C4", "1647E" },
+ { "2F8C5", "1649D" },
+ { "2F8C6", "16477" },
+ { "2F8C7", "13A6C" },
+ { "2F8C8", "1654F" },
+ { "2F8C9", "1656C" },
+ { "2F8CA", "12300A" },
+ { "2F8CB", "165E3" },
+ { "2F8CC", "166F8" },
+ { "2F8CD", "16649" },
+ { "2F8CE", "13B19" },
+ { "2F8CF", "16691" },
+ { "2F8D0", "13B08" },
+ { "2F8D1", "13AE4" },
+ { "2F8D2", "15192" },
+ { "2F8D3", "15195" },
+ { "2F8D4", "16700" },
+ { "2F8D5", "1669C" },
+ { "2F8D6", "180AD" },
+ { "2F8D7", "143D9" },
+ { "2F8D8", "16717" },
+ { "2F8D9", "1671B" },
+ { "2F8DA", "16721" },
+ { "2F8DB", "1675E" },
+ { "2F8DC", "16753" },
+ { "2F8DD", "1233C3" },
+ { "2F8DE", "13B49" },
+ { "2F8DF", "167FA" },
+ { "2F8E0", "16785" },
+ { "2F8E1", "16852" },
+ { "2F8E2", "16885" },
+ { "2F8E3", "12346D" },
+ { "2F8E4", "1688E" },
+ { "2F8E5", "1681F" },
+ { "2F8E6", "16914" },
+ { "2F8E7", "13B9D" },
+ { "2F8E8", "16942" },
+ { "2F8E9", "169A3" },
+ { "2F8EA", "169EA" },
+ { "2F8EB", "16AA8" },
+ { "2F8EC", "1236A3" },
+ { "2F8ED", "16ADB" },
+ { "2F8EE", "13C18" },
+ { "2F8EF", "16B21" },
+ { "2F8F0", "1238A7" },
+ { "2F8F1", "16B54" },
+ { "2F8F2", "13C4E" },
+ { "2F8F3", "16B72" },
+ { "2F8F4", "16B9F" },
+ { "2F8F5", "16BBA" },
+ { "2F8F6", "16BBB" },
+ { "2F8F7", "123A8D" },
+ { "2F8F8", "121D0B" },
+ { "2F8F9", "123AFA" },
+ { "2F8FA", "16C4E" },
+ { "2F8FB", "123CBC" },
+ { "2F8FC", "16CBF" },
+ { "2F8FD", "16CCD" },
+ { "2F8FE", "16C67" },
+ { "2F8FF", "16D16" },
+ { "2F900", "16D3E" },
+ { "2F901", "16D77" },
+ { "2F902", "16D41" },
+ { "2F903", "16D69" },
+ { "2F904", "16D78" },
+ { "2F905", "16D85" },
+ { "2F906", "123D1E" },
+ { "2F907", "16D34" },
+ { "2F908", "16E2F" },
+ { "2F909", "16E6E" },
+ { "2F90A", "13D33" },
+ { "2F90B", "16ECB" },
+ { "2F90C", "16EC7" },
+ { "2F90D", "123ED1" },
+ { "2F90E", "16DF9" },
+ { "2F90F", "16F6E" },
+ { "2F910", "123F5E" },
+ { "2F911", "123F8E" },
+ { "2F912", "16FC6" },
+ { "2F913", "17039" },
+ { "2F914", "1701E" },
+ { "2F915", "1701B" },
+ { "2F916", "13D96" },
+ { "2F917", "1704A" },
+ { "2F918", "1707D" },
+ { "2F919", "17077" },
+ { "2F91A", "170AD" },
+ { "2F91B", "120525" },
+ { "2F91C", "17145" },
+ { "2F91D", "124263" },
+ { "2F91E", "1719C" },
+ { "2F91F", "1243AB" },
+ { "2F920", "17228" },
+ { "2F921", "17235" },
+ { "2F922", "17250" },
+ { "2F923", "124608" },
+ { "2F924", "17280" },
+ { "2F925", "17295" },
+ { "2F926", "124735" },
+ { "2F927", "124814" },
+ { "2F928", "1737A" },
+ { "2F929", "1738B" },
+ { "2F92A", "13EAC" },
+ { "2F92B", "173A5" },
+ { "2F92C", "13EB8" },
+ { "2F92D", "13EB8" },
+ { "2F92E", "17447" },
+ { "2F92F", "1745C" },
+ { "2F930", "17471" },
+ { "2F931", "17485" },
+ { "2F932", "174CA" },
+ { "2F933", "13F1B" },
+ { "2F934", "17524" },
+ { "2F935", "124C36" },
+ { "2F936", "1753E" },
+ { "2F937", "124C92" },
+ { "2F938", "17570" },
+ { "2F939", "12219F" },
+ { "2F93A", "17610" },
+ { "2F93B", "124FA1" },
+ { "2F93C", "124FB8" },
+ { "2F93D", "125044" },
+ { "2F93E", "13FFC" },
+ { "2F93F", "14008" },
+ { "2F940", "176F4" },
+ { "2F941", "1250F3" },
+ { "2F942", "1250F2" },
+ { "2F943", "125119" },
+ { "2F944", "125133" },
+ { "2F945", "1771E" },
+ { "2F946", "1771F" },
+ { "2F947", "1771F" },
+ { "2F948", "1774A" },
+ { "2F949", "14039" },
+ { "2F94A", "1778B" },
+ { "2F94B", "14046" },
+ { "2F94C", "14096" },
+ { "2F94D", "12541D" },
+ { "2F94E", "1784E" },
+ { "2F94F", "1788C" },
+ { "2F950", "178CC" },
+ { "2F951", "140E3" },
+ { "2F952", "125626" },
+ { "2F953", "17956" },
+ { "2F954", "12569A" },
+ { "2F955", "1256C5" },
+ { "2F956", "1798F" },
+ { "2F957", "179EB" },
+ { "2F958", "1412F" },
+ { "2F959", "17A40" },
+ { "2F95A", "17A4A" },
+ { "2F95B", "17A4F" },
+ { "2F95C", "12597C" },
+ { "2F95D", "125AA7" },
+ { "2F95E", "125AA7" },
+ { "2F95F", "17AEE" },
+ { "2F960", "14202" },
+ { "2F961", "125BAB" },
+ { "2F962", "17BC6" },
+ { "2F963", "17BC9" },
+ { "2F964", "14227" },
+ { "2F965", "125C80" },
+ { "2F966", "17CD2" },
+ { "2F967", "142A0" },
+ { "2F968", "17CE8" },
+ { "2F969", "17CE3" },
+ { "2F96A", "17D00" },
+ { "2F96B", "125F86" },
+ { "2F96C", "17D63" },
+ { "2F96D", "14301" },
+ { "2F96E", "17DC7" },
+ { "2F96F", "17E02" },
+ { "2F970", "17E45" },
+ { "2F971", "14334" },
+ { "2F972", "126228" },
+ { "2F973", "126247" },
+ { "2F974", "14359" },
+ { "2F975", "1262D9" },
+ { "2F976", "17F7A" },
+ { "2F977", "12633E" },
+ { "2F978", "17F95" },
+ { "2F979", "17FFA" },
+ { "2F97A", "18005" },
+ { "2F97B", "1264DA" },
+ { "2F97C", "126523" },
+ { "2F97D", "18060" },
+ { "2F97E", "1265A8" },
+ { "2F97F", "18070" },
+ { "2F980", "12335F" },
+ { "2F981", "143D5" },
+ { "2F982", "180B2" },
+ { "2F983", "18103" },
+ { "2F984", "1440B" },
+ { "2F985", "1813E" },
+ { "2F986", "15AB5" },
+ { "2F987", "1267A7" },
+ { "2F988", "1267B5" },
+ { "2F989", "123393" },
+ { "2F98A", "12339C" },
+ { "2F98B", "18201" },
+ { "2F98C", "18204" },
+ { "2F98D", "18F9E" },
+ { "2F98E", "1446B" },
+ { "2F98F", "18291" },
+ { "2F990", "1828B" },
+ { "2F991", "1829D" },
+ { "2F992", "152B3" },
+ { "2F993", "182B1" },
+ { "2F994", "182B3" },
+ { "2F995", "182BD" },
+ { "2F996", "182E6" },
+ { "2F997", "126B3C" },
+ { "2F998", "182E5" },
+ { "2F999", "1831D" },
+ { "2F99A", "18363" },
+ { "2F99B", "183AD" },
+ { "2F99C", "18323" },
+ { "2F99D", "183BD" },
+ { "2F99E", "183E7" },
+ { "2F99F", "18457" },
+ { "2F9A0", "18353" },
+ { "2F9A1", "183CA" },
+ { "2F9A2", "183CC" },
+ { "2F9A3", "183DC" },
+ { "2F9A4", "126C36" },
+ { "2F9A5", "126D6B" },
+ { "2F9A6", "126CD5" },
+ { "2F9A7", "1452B" },
+ { "2F9A8", "184F1" },
+ { "2F9A9", "184F3" },
+ { "2F9AA", "18516" },
+ { "2F9AB", "1273CA" },
+ { "2F9AC", "18564" },
+ { "2F9AD", "126F2C" },
+ { "2F9AE", "1455D" },
+ { "2F9AF", "14561" },
+ { "2F9B0", "126FB1" },
+ { "2F9B1", "1270D2" },
+ { "2F9B2", "1456B" },
+ { "2F9B3", "18650" },
+ { "2F9B4", "1865C" },
+ { "2F9B5", "18667" },
+ { "2F9B6", "18669" },
+ { "2F9B7", "186A9" },
+ { "2F9B8", "18688" },
+ { "2F9B9", "1870E" },
+ { "2F9BA", "186E2" },
+ { "2F9BB", "18779" },
+ { "2F9BC", "18728" },
+ { "2F9BD", "1876B" },
+ { "2F9BE", "18786" },
+ { "2F9BF", "145D7" },
+ { "2F9C0", "187E1" },
+ { "2F9C1", "18801" },
+ { "2F9C2", "145F9" },
+ { "2F9C3", "18860" },
+ { "2F9C4", "18863" },
+ { "2F9C5", "127667" },
+ { "2F9C6", "188D7" },
+ { "2F9C7", "188DE" },
+ { "2F9C8", "14635" },
+ { "2F9C9", "188FA" },
+ { "2F9CA", "134BB" },
+ { "2F9CB", "1278AE" },
+ { "2F9CC", "127966" },
+ { "2F9CD", "146BE" },
+ { "2F9CE", "146C7" },
+ { "2F9CF", "18AA0" },
+ { "2F9D0", "18AED" },
+ { "2F9D1", "18B8A" },
+ { "2F9D2", "18C55" },
+ { "2F9D3", "127CA8" },
+ { "2F9D4", "18CAB" },
+ { "2F9D5", "18CC1" },
+ { "2F9D6", "18D1B" },
+ { "2F9D7", "18D77" },
+ { "2F9D8", "127F2F" },
+ { "2F9D9", "120804" },
+ { "2F9DA", "18DCB" },
+ { "2F9DB", "18DBC" },
+ { "2F9DC", "18DF0" },
+ { "2F9DD", "1208DE" },
+ { "2F9DE", "18ED4" },
+ { "2F9DF", "18F38" },
+ { "2F9E0", "1285D2" },
+ { "2F9E1", "1285ED" },
+ { "2F9E2", "19094" },
+ { "2F9E3", "190F1" },
+ { "2F9E4", "19111" },
+ { "2F9E5", "12872E" },
+ { "2F9E6", "1911B" },
+ { "2F9E7", "19238" },
+ { "2F9E8", "192D7" },
+ { "2F9E9", "192D8" },
+ { "2F9EA", "1927C" },
+ { "2F9EB", "193F9" },
+ { "2F9EC", "19415" },
+ { "2F9ED", "128BFA" },
+ { "2F9EE", "1958B" },
+ { "2F9EF", "14995" },
+ { "2F9F0", "195B7" },
+ { "2F9F1", "128D77" },
+ { "2F9F2", "149E6" },
+ { "2F9F3", "196C3" },
+ { "2F9F4", "15DB2" },
+ { "2F9F5", "19723" },
+ { "2F9F6", "129145" },
+ { "2F9F7", "12921A" },
+ { "2F9F8", "14A6E" },
+ { "2F9F9", "14A76" },
+ { "2F9FA", "197E0" },
+ { "2F9FB", "12940A" },
+ { "2F9FC", "14AB2" },
+ { "2F9FD", "129496" },
+ { "2F9FE", "1980B" },
+ { "2F9FF", "1980B" },
+ { "2FA00", "19829" },
+ { "2FA01", "1295B6" },
+ { "2FA02", "198E2" },
+ { "2FA03", "14B33" },
+ { "2FA04", "19929" },
+ { "2FA05", "199A7" },
+ { "2FA06", "199C2" },
+ { "2FA07", "199FE" },
+ { "2FA08", "14BCE" },
+ { "2FA09", "129B30" },
+ { "2FA0A", "19B12" },
+ { "2FA0B", "19C40" },
+ { "2FA0C", "19CFD" },
+ { "2FA0D", "14CCE" },
+ { "2FA0E", "14CED" },
+ { "2FA0F", "19D67" },
+ { "2FA10", "12A0CE" },
+ { "2FA11", "14CF8" },
+ { "2FA12", "12A105" },
+ { "2FA13", "12A20E" },
+ { "2FA14", "12A291" },
+ { "2FA15", "19EBB" },
+ { "2FA16", "14D56" },
+ { "2FA17", "19EF9" },
+ { "2FA18", "19EFE" },
+ { "2FA19", "19F05" },
+ { "2FA1A", "19F0F" },
+ { "2FA1B", "19F16" },
+ { "2FA1C", "19F3B" },
+ { "2FA1D", "12A600" },
+};
+
+// global constructor
+
+static struct unicode_decompose_init {
+ unicode_decompose_init();
+} _unicode_decompose_init;
+
+unicode_decompose_init::unicode_decompose_init()
+{
+ for (unsigned int i = 0;
+ i < sizeof(unicode_decompose_list)/sizeof(unicode_decompose_list[0]);
+ i++) {
+ unicode_decompose *dec = new unicode_decompose[1];
+ dec->value = (char *)unicode_decompose_list[i].value;
+ unicode_decompose_table.define(unicode_decompose_list[i].key, dec);
+ }
+}
+
+const char *decompose_unicode(const char *s)
+{
+ unicode_decompose *result = unicode_decompose_table.lookup(s);
+ return result ? result->value : 0;
+}
diff --git a/src/libs/libxutil/DviChar.c b/src/libs/libxutil/DviChar.c
new file mode 100644
index 0000000..fe086fc
--- /dev/null
+++ b/src/libs/libxutil/DviChar.c
@@ -0,0 +1,679 @@
+/* Copyright (C) 2014-2020 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 of the License, 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.
+
+The GNU General Public License version 2 (GPL2) is available in the
+internet at <http://www.gnu.org/licenses/gpl-2.0.txt>. */
+
+/*
+ * DviChar.c
+ *
+ * Map DVI (ditroff output) character names to
+ * font indexes and back
+ */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include "DviChar.h"
+
+extern char *xmalloc(int);
+
+#define allocHash() ((DviCharNameHash *) xmalloc (sizeof (DviCharNameHash)))
+
+struct map_list {
+ struct map_list *next;
+ DviCharNameMap *map;
+};
+
+static struct map_list *world;
+
+static int standard_maps_loaded = 0;
+static void load_standard_maps (void);
+static int hash_name (const char *);
+static void dispose_hash(DviCharNameMap *);
+static void compute_hash(DviCharNameMap *);
+
+DviCharNameMap *
+DviFindMap (char *encoding)
+{
+ struct map_list *m;
+
+ if (!standard_maps_loaded)
+ load_standard_maps ();
+ for (m = world; m; m=m->next)
+ if (!strcmp (m->map->encoding, encoding))
+ return m->map;
+ return 0;
+}
+
+void
+DviRegisterMap (DviCharNameMap *map)
+{
+ struct map_list *m;
+
+ if (!standard_maps_loaded)
+ load_standard_maps ();
+ for (m = world; m; m = m->next)
+ if (!strcmp (m->map->encoding, map->encoding))
+ break;
+ if (!m) {
+ m = (struct map_list *) xmalloc (sizeof *m);
+ m->next = world;
+ world = m;
+ }
+ dispose_hash (map);
+ m->map = map;
+ compute_hash (map);
+}
+
+static void
+dispose_hash (DviCharNameMap *map)
+{
+ DviCharNameHash **buckets;
+ DviCharNameHash *h, *next;
+ int i;
+
+ buckets = map->buckets;
+ for (i = 0; i < DVI_HASH_SIZE; i++) {
+ for (h = buckets[i]; h; h=next) {
+ next = h->next;
+ free (h);
+ }
+ }
+}
+
+static int
+hash_name (const char *name)
+{
+ int i = 0;
+
+ while (*name)
+ i = (i << 1) ^ *name++;
+ if (i < 0)
+ i = -i;
+ return i;
+}
+
+static void
+compute_hash (DviCharNameMap *map)
+{
+ DviCharNameHash **buckets;
+ int c, s, i;
+ DviCharNameHash *h;
+
+ buckets = map->buckets;
+ for (i = 0; i < DVI_HASH_SIZE; i++)
+ buckets[i] = 0;
+ for (c = 0; c < DVI_MAP_SIZE; c++)
+ for (s = 0; s < DVI_MAX_SYNONYMS; s++) {
+ if (!map->dvi_names[c][s])
+ break;
+ i = hash_name (map->dvi_names[c][s]) % DVI_HASH_SIZE;
+ h = allocHash ();
+ h->next = buckets[i];
+ buckets[i] = h;
+ h->name = map->dvi_names[c][s];
+ h->position = c;
+ }
+
+}
+
+int
+DviCharIndex (DviCharNameMap *map, const char *name)
+{
+ int i;
+ DviCharNameHash *h;
+
+ i = hash_name (name) % DVI_HASH_SIZE;
+ for (h = map->buckets[i]; h; h=h->next)
+ if (!strcmp (h->name, name))
+ return h->position;
+ return -1;
+}
+
+static DviCharNameMap ISO8859_1_map = {
+ "iso8859-1",
+ 0,
+{
+{ 0, /* 0 */},
+{ 0, /* 1 */},
+{ 0, /* 2 */},
+{ 0, /* 3 */},
+{ 0, /* 4 */},
+{ 0, /* 5 */},
+{ 0, /* 6 */},
+{ 0, /* 7 */},
+{ 0, /* 8 */},
+{ 0, /* 9 */},
+{ 0, /* 10 */},
+{ 0, /* 11 */},
+{ 0, /* 12 */},
+{ 0, /* 13 */},
+{ 0, /* 14 */},
+{ 0, /* 15 */},
+{ 0, /* 16 */},
+{ 0, /* 17 */},
+{ 0, /* 18 */},
+{ 0, /* 19 */},
+{ 0, /* 20 */},
+{ 0, /* 21 */},
+{ 0, /* 22 */},
+{ 0, /* 23 */},
+{ 0, /* 24 */},
+{ 0, /* 25 */},
+{ 0, /* 26 */},
+{ 0, /* 27 */},
+{ 0, /* 28 */},
+{ 0, /* 29 */},
+{ 0, /* 30 */},
+{ 0, /* 31 */},
+{ 0, /* 32 */},
+{ "!", /* 33 */},
+{ "\"", "dq", /* 34 */},
+{ "#", "sh", /* 35 */},
+{ "$", "Do", /* 36 */},
+{ "%", /* 37 */},
+{ "&", /* 38 */},
+{ "'", "aq", "cq", "oq", /* 39 */},
+{ "(", /* 40 */},
+{ ")", /* 41 */},
+{ "*", /* 42 */},
+{ "+", /* 43 */},
+{ ",", /* 44 */},
+{ "\\-", /* 45 */},
+{ ".", /* 46 */},
+{ "/", "sl", /* 47 */},
+{ "0", /* 48 */},
+{ "1", /* 49 */},
+{ "2", /* 50 */},
+{ "3", /* 51 */},
+{ "4", /* 52 */},
+{ "5", /* 53 */},
+{ "6", /* 54 */},
+{ "7", /* 55 */},
+{ "8", /* 56 */},
+{ "9", /* 57 */},
+{ ":", /* 58 */},
+{ ";", /* 59 */},
+{ "<", /* 60 */},
+{ "=", /* 61 */},
+{ ">", /* 62 */},
+{ "?", /* 63 */},
+{ "@", "at", /* 64 */},
+{ "A", /* 65 */},
+{ "B", /* 66 */},
+{ "C", /* 67 */},
+{ "D", /* 68 */},
+{ "E", /* 69 */},
+{ "F", /* 70 */},
+{ "G", /* 71 */},
+{ "H", /* 72 */},
+{ "I", /* 73 */},
+{ "J", /* 74 */},
+{ "K", /* 75 */},
+{ "L", /* 76 */},
+{ "M", /* 77 */},
+{ "N", /* 78 */},
+{ "O", /* 79 */},
+{ "P", /* 80 */},
+{ "Q", /* 81 */},
+{ "R", /* 82 */},
+{ "S", /* 83 */},
+{ "T", /* 84 */},
+{ "U", /* 85 */},
+{ "V", /* 86 */},
+{ "W", /* 87 */},
+{ "X", /* 88 */},
+{ "Y", /* 89 */},
+{ "Z", /* 90 */},
+{ "[", "lB", /* 91 */},
+{ "\\", "rs", /* 92 */},
+{ "]", "rB", /* 93 */},
+{ "^", "a^", "ha", /* 94 */},
+{ "_", /* 95 */},
+{ "`", "ga", /* 96 */},
+{ "a", /* 97 */},
+{ "b", /* 98 */},
+{ "c", /* 99 */},
+{ "d", /* 100 */},
+{ "e", /* 101 */},
+{ "f", /* 102 */},
+{ "g", /* 103 */},
+{ "h", /* 104 */},
+{ "i", /* 105 */},
+{ "j", /* 106 */},
+{ "k", /* 107 */},
+{ "l", /* 108 */},
+{ "m", /* 109 */},
+{ "n", /* 110 */},
+{ "o", /* 111 */},
+{ "p", /* 112 */},
+{ "q", /* 113 */},
+{ "r", /* 114 */},
+{ "s", /* 115 */},
+{ "t", /* 116 */},
+{ "u", /* 117 */},
+{ "v", /* 118 */},
+{ "w", /* 119 */},
+{ "x", /* 120 */},
+{ "y", /* 121 */},
+{ "z", /* 122 */},
+{ "{", "lC", /* 123 */},
+{ "|", "ba", /* 124 */},
+{ "}", "rC", /* 125 */},
+{ "~", "a~", "ti", /* 126 */},
+{ 0, /* 127 */},
+{ 0, /* 128 */},
+{ 0, /* 129 */},
+{ 0, /* 130 */},
+{ 0, /* 131 */},
+{ 0, /* 132 */},
+{ 0, /* 133 */},
+{ 0, /* 134 */},
+{ 0, /* 135 */},
+{ 0, /* 136 */},
+{ 0, /* 137 */},
+{ 0, /* 138 */},
+{ 0, /* 139 */},
+{ 0, /* 140 */},
+{ 0, /* 141 */},
+{ 0, /* 142 */},
+{ 0, /* 143 */},
+{ 0, /* 144 */},
+{ 0, /* 145 */},
+{ 0, /* 146 */},
+{ 0, /* 147 */},
+{ 0, /* 148 */},
+{ 0, /* 149 */},
+{ 0, /* 150 */},
+{ 0, /* 151 */},
+{ 0, /* 152 */},
+{ 0, /* 153 */},
+{ 0, /* 154 */},
+{ 0, /* 155 */},
+{ 0, /* 156 */},
+{ 0, /* 157 */},
+{ 0, /* 158 */},
+{ 0, /* 159 */},
+{ 0, /* 160 */},
+{ "r!", /* 161 */},
+{ "ct", /* 162 */},
+{ "Po", /* 163 */},
+{ "Cs", /* 164 */},
+{ "Ye", /* 165 */},
+{ "bb", /* 166 */},
+{ "sc", /* 167 */},
+{ "ad", /* 168 */},
+{ "co", /* 169 */},
+{ "Of", /* 170 */},
+{ "Fo", /* 171 */},
+{ "tno", /* 172 */},
+{ "-", "hy", /* 173 */},
+{ "rg", /* 174 */},
+{ "a-", /* 175 */},
+{ "de", /* 176 */},
+{ "t+-", /* 177 */},
+{ "S2", /* 178 */},
+{ "S3", /* 179 */},
+{ "aa", /* 180 */},
+{ "mc", /* 181 */},
+{ "ps", /* 182 */},
+{ "pc", /* 183 */},
+{ "ac", /* 184 */},
+{ "S1", /* 185 */},
+{ "Om", /* 186 */},
+{ "Fc", /* 187 */},
+{ "14", /* 188 */},
+{ "12", /* 189 */},
+{ "34", /* 190 */},
+{ "r?", /* 191 */},
+{ "`A", /* 192 */},
+{ "'A", /* 193 */},
+{ "^A", /* 194 */},
+{ "~A", /* 195 */},
+{ ":A", /* 196 */},
+{ "oA", /* 197 */},
+{ "AE", /* 198 */},
+{ ",C", /* 199 */},
+{ "`E", /* 200 */},
+{ "'E", /* 201 */},
+{ "^E", /* 202 */},
+{ ":E", /* 203 */},
+{ "`I", /* 204 */},
+{ "'I", /* 205 */},
+{ "^I", /* 206 */},
+{ ":I", /* 207 */},
+{ "-D", /* 208 */},
+{ "~N", /* 209 */},
+{ "`O", /* 210 */},
+{ "'O", /* 211 */},
+{ "^O", /* 212 */},
+{ "~O", /* 213 */},
+{ ":O", /* 214 */},
+{ "tmu", /* 215 */},
+{ "/O", /* 216 */},
+{ "`U", /* 217 */},
+{ "'U", /* 218 */},
+{ "^U", /* 219 */},
+{ ":U", /* 220 */},
+{ "'Y", /* 221 */},
+{ "TP", /* 222 */},
+{ "ss", /* 223 */},
+{ "`a", /* 224 */},
+{ "'a", /* 225 */},
+{ "^a", /* 226 */},
+{ "~a", /* 227 */},
+{ ":a", /* 228 */},
+{ "oa", /* 229 */},
+{ "ae", /* 230 */},
+{ ",c", /* 231 */},
+{ "`e", /* 232 */},
+{ "'e", /* 233 */},
+{ "^e", /* 234 */},
+{ ":e", /* 235 */},
+{ "`i", /* 236 */},
+{ "'i", /* 237 */},
+{ "^i", /* 238 */},
+{ ":i", /* 239 */},
+{ "Sd", /* 240 */},
+{ "~n", /* 241 */},
+{ "`o", /* 242 */},
+{ "'o", /* 243 */},
+{ "^o", /* 244 */},
+{ "~o", /* 245 */},
+{ ":o", /* 246 */},
+{ "tdi", /* 247 */},
+{ "/o", /* 248 */},
+{ "`u", /* 249 */},
+{ "'u", /* 250 */},
+{ "^u", /* 251 */},
+{ ":u", /* 252 */},
+{ "'y", /* 253 */},
+{ "Tp", /* 254 */},
+{ ":y", /* 255 */},
+},
+ {0} /* buckets */};
+
+static DviCharNameMap Adobe_Symbol_map = {
+ "adobe-fontspecific",
+ 1,
+{
+{ 0, /* 0 */},
+{ 0, /* 1 */},
+{ 0, /* 2 */},
+{ 0, /* 3 */},
+{ 0, /* 4 */},
+{ 0, /* 5 */},
+{ 0, /* 6 */},
+{ 0, /* 7 */},
+{ 0, /* 8 */},
+{ 0, /* 9 */},
+{ 0, /* 10 */},
+{ 0, /* 11 */},
+{ 0, /* 12 */},
+{ 0, /* 13 */},
+{ 0, /* 14 */},
+{ 0, /* 15 */},
+{ 0, /* 16 */},
+{ 0, /* 17 */},
+{ 0, /* 18 */},
+{ 0, /* 19 */},
+{ 0, /* 20 */},
+{ 0, /* 21 */},
+{ 0, /* 22 */},
+{ 0, /* 23 */},
+{ 0, /* 24 */},
+{ 0, /* 25 */},
+{ 0, /* 26 */},
+{ 0, /* 27 */},
+{ 0, /* 28 */},
+{ 0, /* 29 */},
+{ 0, /* 30 */},
+{ 0, /* 31 */},
+{ 0, /* 32 */},
+{ "!", /* 33 */},
+{ "fa", /* 34 */},
+{ "#", "sh", /* 35 */},
+{ "te", /* 36 */},
+{ "%", /* 37 */},
+{ "&", /* 38 */},
+{ "st", /* 39 */},
+{ "(", /* 40 */},
+{ ")", /* 41 */},
+{ "**", /* 42 */},
+{ "+", "pl", /* 43 */},
+{ ",", /* 44 */},
+{ "\\-", "mi", /* 45 */},
+{ ".", /* 46 */},
+{ "/", "sl", /* 47 */},
+{ "0", /* 48 */},
+{ "1", /* 49 */},
+{ "2", /* 50 */},
+{ "3", /* 51 */},
+{ "4", /* 52 */},
+{ "5", /* 53 */},
+{ "6", /* 54 */},
+{ "7", /* 55 */},
+{ "8", /* 56 */},
+{ "9", /* 57 */},
+{ ":", /* 58 */},
+{ ";", /* 59 */},
+{ "<", /* 60 */},
+{ "=", "eq", /* 61 */},
+{ ">", /* 62 */},
+{ "?", /* 63 */},
+{ "=~", /* 64 */},
+{ "*A", /* 65 */},
+{ "*B", /* 66 */},
+{ "*X", /* 67 */},
+{ "*D", /* 68 */},
+{ "*E", /* 69 */},
+{ "*F", /* 70 */},
+{ "*G", /* 71 */},
+{ "*Y", /* 72 */},
+{ "*I", /* 73 */},
+{ "+h", /* 74 */},
+{ "*K", /* 75 */},
+{ "*L", /* 76 */},
+{ "*M", /* 77 */},
+{ "*N", /* 78 */},
+{ "*O", /* 79 */},
+{ "*P", /* 80 */},
+{ "*H", /* 81 */},
+{ "*R", /* 82 */},
+{ "*S", /* 83 */},
+{ "*T", /* 84 */},
+{ 0, /* 85 */},
+{ "ts", /* 86 */},
+{ "*W", /* 87 */},
+{ "*C", /* 88 */},
+{ "*Q", /* 89 */},
+{ "*Z", /* 90 */},
+{ "[", "lB", /* 91 */},
+{ "tf", "3d", /* 92 */},
+{ "]", "rB", /* 93 */},
+{ "pp", /* 94 */},
+{ "_", /* 95 */},
+{ "radicalex", /* 96 */},
+{ "*a", /* 97 */},
+{ "*b", /* 98 */},
+{ "*x", /* 99 */},
+{ "*d", /* 100 */},
+{ "*e", /* 101 */},
+{ "*f", /* 102 */},
+{ "*g", /* 103 */},
+{ "*y", /* 104 */},
+{ "*i", /* 105 */},
+{ "+f", /* 106 */},
+{ "*k", /* 107 */},
+{ "*l", /* 108 */},
+{ "*m", /* 109 */},
+{ "*n", /* 110 */},
+{ "*o", /* 111 */},
+{ "*p", /* 112 */},
+{ "*h", /* 113 */},
+{ "*r", /* 114 */},
+{ "*s", /* 115 */},
+{ "*t", /* 116 */},
+{ "*u", /* 117 */},
+{ "+p", /* 118 */},
+{ "*w", /* 119 */},
+{ "*c", /* 120 */},
+{ "*q", /* 121 */},
+{ "*z", /* 122 */},
+{ "lC", "{", /* 123 */},
+{ "ba", "|", /* 124 */},
+{ "rC", "}", /* 125 */},
+{ "ap", /* 126 */},
+{ 0, /* 127 */},
+{ 0, /* 128 */},
+{ 0, /* 129 */},
+{ 0, /* 130 */},
+{ 0, /* 131 */},
+{ 0, /* 132 */},
+{ 0, /* 133 */},
+{ 0, /* 134 */},
+{ 0, /* 135 */},
+{ 0, /* 136 */},
+{ 0, /* 137 */},
+{ 0, /* 138 */},
+{ 0, /* 139 */},
+{ 0, /* 140 */},
+{ 0, /* 141 */},
+{ 0, /* 142 */},
+{ 0, /* 143 */},
+{ 0, /* 144 */},
+{ 0, /* 145 */},
+{ 0, /* 146 */},
+{ 0, /* 147 */},
+{ 0, /* 148 */},
+{ 0, /* 149 */},
+{ 0, /* 150 */},
+{ 0, /* 151 */},
+{ 0, /* 152 */},
+{ 0, /* 153 */},
+{ 0, /* 154 */},
+{ 0, /* 155 */},
+{ 0, /* 156 */},
+{ 0, /* 157 */},
+{ 0, /* 158 */},
+{ 0, /* 159 */},
+{ 0, /* 160 */},
+{ "*U", /* 161 */},
+{ "fm", /* 162 */},
+{ "<=", /* 163 */},
+{ "f/", /* 164 */},
+{ "if", /* 165 */},
+{ "Fn", /* 166 */},
+{ "CL", /* 167 */},
+{ "DI", /* 168 */},
+{ "HE", /* 169 */},
+{ "SP", /* 170 */},
+{ "<>", /* 171 */},
+{ "<-", /* 172 */},
+{ "ua", "arrowverttp", /* 173 */},
+{ "->", /* 174 */},
+{ "da", "arrowvertbt", /* 175 */},
+{ "de", /* 176 */},
+{ "+-", /* 177 */},
+{ "sd", /* 178 */},
+{ ">=", /* 179 */},
+{ "mu", /* 180 */},
+{ "pt", /* 181 */},
+{ "pd", /* 182 */},
+{ "bu", /* 183 */},
+{ "di", /* 184 */},
+{ "!=", /* 185 */},
+{ "==", /* 186 */},
+{ "~=", "~~", /* 187 */},
+{ 0, /* 188 */},
+{ "arrowvertex", /* 189 */},
+{ "an", /* 190 */},
+{ "CR", /* 191 */},
+{ "Ah", /* 192 */},
+{ "Im", /* 193 */},
+{ "Re", /* 194 */},
+{ "wp", /* 195 */},
+{ "c*", /* 196 */},
+{ "c+", /* 197 */},
+{ "es", /* 198 */},
+{ "ca", /* 199 */},
+{ "cu", /* 200 */},
+{ "sp", /* 201 */},
+{ "ip", /* 202 */},
+{ "nb", /* 203 */},
+{ "sb", /* 204 */},
+{ "ib", /* 205 */},
+{ "mo", /* 206 */},
+{ "nm", /* 207 */},
+{ "/_", /* 208 */},
+{ "gr", /* 209 */},
+{ "rg", /* 210 */},
+{ "co", /* 211 */},
+{ "tm", /* 212 */},
+{ 0, /* 213 */},
+{ "sr", "sqrt", /* 214 */},
+{ "md", /* 215 */},
+{ "no", /* 216 */},
+{ "AN", /* 217 */},
+{ "OR", /* 218 */},
+{ "hA", /* 219 */},
+{ "lA", /* 220 */},
+{ "uA", /* 221 */},
+{ "rA", /* 222 */},
+{ "dA", /* 223 */},
+{ "lz", /* 224 */},
+{ "la", /* 225 */},
+{ 0, /* 226 */},
+{ 0, /* 227 */},
+{ 0, /* 228 */},
+{ 0, /* 229 */},
+{ "parenlefttp", /* 230 */},
+{ "parenleftex", /* 231 */},
+{ "parenleftbt", /* 232 */},
+{ "bracketlefttp", "lc", /* 233 */},
+{ "bracketleftex", /* 234 */},
+{ "bracketleftbt", "lf", /* 235 */},
+{ "bracelefttp", "lt", /* 236 */},
+{ "braceleftmid", "lk", /* 237 */},
+{ "braceleftbt", "lb", /* 238 */},
+{ "bracerightex", "braceleftex", "braceex", "bv", /* 239 */},
+{ 0, /* 240 */},
+{ "ra", /* 241 */},
+{ "is", "integral", /* 242 */},
+{ 0, /* 243 */},
+{ 0, /* 244 */},
+{ 0, /* 245 */},
+{ "parenrighttp", /* 246 */},
+{ "parenrightex", /* 247 */},
+{ "parenrightbt", /* 248 */},
+{ "bracketrighttp", "rc", /* 249 */},
+{ "bracketrightex", /* 250 */},
+{ "bracketrightbt", "rf", /* 251 */},
+{ "bracerighttp", "rt", /* 252 */},
+{ "bracerightmid", "rk", /* 253 */},
+{ "bracerightbt", "rb", /* 254 */},
+{ 0, /* 255 */},
+},
+ {0} /* buckets */};
+
+
+static void
+load_standard_maps (void)
+{
+ standard_maps_loaded = 1;
+ DviRegisterMap (&ISO8859_1_map);
+ DviRegisterMap (&Adobe_Symbol_map);
+}
diff --git a/src/libs/libxutil/XFontName.c b/src/libs/libxutil/XFontName.c
new file mode 100644
index 0000000..81ccdaa
--- /dev/null
+++ b/src/libs/libxutil/XFontName.c
@@ -0,0 +1,260 @@
+/* Copyright (C) 2014-2020 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 of the License, 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.
+
+The GNU General Public License version 2 (GPL2) is available in the
+internet at <http://www.gnu.org/licenses/gpl-2.0.txt>. */
+
+/*
+ * XFontName.c
+ *
+ * build/parse X Font name strings
+ */
+
+#include <config.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xos.h>
+#include "XFontName.h"
+#include <ctype.h>
+
+static char *
+extractStringField (char *name, char *buffer, int size,
+ unsigned int *attrp, unsigned int bit)
+{
+ char *buf = buffer;
+
+ if (!*name)
+ return 0;
+ while (*name && *name != '-' && size > 0) {
+ *buf++ = *name++;
+ --size;
+ }
+ if (size <= 0)
+ return 0;
+ *buf = '\0';
+ if (buffer[0] != '*' || buffer[1] != '\0')
+ *attrp |= bit;
+ if (*name == '-')
+ return name+1;
+ return name;
+}
+
+static char *
+extractUnsignedField (char *name, unsigned int *result,
+ unsigned int *attrp, unsigned int bit)
+{
+ char buf[256];
+ char *c;
+ unsigned int i;
+
+ name = extractStringField (name, buf, sizeof (buf), attrp, bit);
+ if (!name)
+ return 0;
+ if (!(*attrp & bit))
+ return name;
+ i = 0;
+ for (c = buf; *c; c++) {
+ if (!isdigit (*c))
+ return 0;
+ i = i * 10 + (*c - '0');
+ }
+ *result = i;
+ return name;
+}
+
+Bool
+XParseFontName (XFontNameString fontNameString, XFontName *fontName,
+ unsigned int *fontNameAttributes)
+{
+ char *name = fontNameString;
+ XFontName temp;
+ unsigned int attributes = 0;
+
+#define GetString(field,bit)\
+ if (!(name = extractStringField \
+ (name, temp.field, sizeof (temp.field),\
+ &attributes, bit))) \
+ return False;
+
+#define GetUnsigned(field,bit)\
+ if (!(name = extractUnsignedField \
+ (name, &temp.field, \
+ &attributes, bit))) \
+ return False;
+
+ GetString (Registry, FontNameRegistry)
+ GetString (Foundry, FontNameFoundry)
+ GetString (FamilyName, FontNameFamilyName)
+ GetString (WeightName, FontNameWeightName)
+ GetString (Slant, FontNameSlant)
+ GetString (SetwidthName, FontNameSetwidthName)
+ GetString (AddStyleName, FontNameAddStyleName)
+ GetUnsigned (PixelSize, FontNamePixelSize)
+ GetUnsigned (PointSize, FontNamePointSize)
+ GetUnsigned (ResolutionX, FontNameResolutionX)
+ GetUnsigned (ResolutionY, FontNameResolutionY)
+ GetString (Spacing, FontNameSpacing)
+ GetUnsigned (AverageWidth, FontNameAverageWidth)
+ GetString (CharSetRegistry, FontNameCharSetRegistry)
+ if (!*name) {
+ temp.CharSetEncoding[0] = '\0';
+ attributes |= FontNameCharSetEncoding;
+ } else {
+ GetString (CharSetEncoding, FontNameCharSetEncoding)
+ }
+ *fontName = temp;
+ *fontNameAttributes = attributes;
+ return True;
+}
+
+static char *
+utoa (unsigned int u, char *s, int size)
+{
+ char *t;
+
+ t = s + size;
+ *--t = '\0';
+ do
+ *--t = (u % 10) + '0';
+ while (u /= 10);
+ return t;
+}
+
+Bool
+XFormatFontName (XFontName *fontName, unsigned int fontNameAttributes,
+ XFontNameString fontNameString)
+{
+ char tmp[256];
+ char *name = tmp, *f;
+ int left = sizeof (tmp) - 1;
+ char number[32];
+
+#define PutString(field, bit)\
+ f = (fontNameAttributes & bit) ? \
+ fontName->field \
+ : (char *)"*"; \
+ if ((left -= strlen (f)) < 0) \
+ return False; \
+ while (*f) \
+ if ((*name++ = *f++) == '-') \
+ return False;
+#define PutHyphen()\
+ if (--left < 0) \
+ return False; \
+ *name++ = '-';
+
+#define PutUnsigned(field, bit) \
+ f = (fontNameAttributes & bit) ? \
+ utoa (fontName->field, number, sizeof (number)) \
+ : (char *)"*"; \
+ if ((left -= strlen (f)) < 0) \
+ return False; \
+ while (*f) \
+ *name++ = *f++;
+
+ PutString (Registry, FontNameRegistry)
+ PutHyphen ();
+ PutString (Foundry, FontNameFoundry)
+ PutHyphen ();
+ PutString (FamilyName, FontNameFamilyName)
+ PutHyphen ();
+ PutString (WeightName, FontNameWeightName)
+ PutHyphen ();
+ PutString (Slant, FontNameSlant)
+ PutHyphen ();
+ PutString (SetwidthName, FontNameSetwidthName)
+ PutHyphen ();
+ PutString (AddStyleName, FontNameAddStyleName)
+ PutHyphen ();
+ PutUnsigned (PixelSize, FontNamePixelSize)
+ PutHyphen ();
+ PutUnsigned (PointSize, FontNamePointSize)
+ PutHyphen ();
+ PutUnsigned (ResolutionX, FontNameResolutionX)
+ PutHyphen ();
+ PutUnsigned (ResolutionY, FontNameResolutionY)
+ PutHyphen ();
+ PutString (Spacing, FontNameSpacing)
+ PutHyphen ();
+ PutUnsigned (AverageWidth, FontNameAverageWidth)
+ PutHyphen ();
+ PutString (CharSetRegistry, FontNameCharSetRegistry)
+ PutHyphen ();
+ PutString (CharSetEncoding, FontNameCharSetEncoding)
+ *name = '\0';
+ strcpy (fontNameString, tmp);
+ return True;
+}
+
+Bool
+XCompareFontName (XFontName *name1, XFontName *name2,
+ unsigned int fontNameAttributes)
+{
+#define CompareString(field,bit) \
+ if (fontNameAttributes & bit) \
+ if (strcmp (name1->field, name2->field)) \
+ return False;
+
+#define CompareUnsigned(field,bit) \
+ if (fontNameAttributes & bit) \
+ if (name1->field != name2->field) \
+ return False;
+
+ CompareString (Registry, FontNameRegistry)
+ CompareString (Foundry, FontNameFoundry)
+ CompareString (FamilyName, FontNameFamilyName)
+ CompareString (WeightName, FontNameWeightName)
+ CompareString (Slant, FontNameSlant)
+ CompareString (SetwidthName, FontNameSetwidthName)
+ CompareString (AddStyleName, FontNameAddStyleName)
+ CompareUnsigned (PixelSize, FontNamePixelSize)
+ CompareUnsigned (PointSize, FontNamePointSize)
+ CompareUnsigned (ResolutionX, FontNameResolutionX)
+ CompareUnsigned (ResolutionY, FontNameResolutionY)
+ CompareString (Spacing, FontNameSpacing)
+ CompareUnsigned (AverageWidth, FontNameAverageWidth)
+ CompareString (CharSetRegistry, FontNameCharSetRegistry)
+ CompareString (CharSetEncoding, FontNameCharSetEncoding)
+ return True;
+}
+
+Bool
+XCopyFontName (XFontName *name1, XFontName *name2,
+ unsigned int fontNameAttributes)
+{
+#define CopyString(field,bit) \
+ if (fontNameAttributes & bit) \
+ strcpy (name2->field, name1->field);
+
+#define CopyUnsigned(field,bit) \
+ if (fontNameAttributes & bit) \
+ name2->field = name1->field;
+
+ CopyString (Registry, FontNameRegistry)
+ CopyString (Foundry, FontNameFoundry)
+ CopyString (FamilyName, FontNameFamilyName)
+ CopyString (WeightName, FontNameWeightName)
+ CopyString (Slant, FontNameSlant)
+ CopyString (SetwidthName, FontNameSetwidthName)
+ CopyString (AddStyleName, FontNameAddStyleName)
+ CopyUnsigned (PixelSize, FontNamePixelSize)
+ CopyUnsigned (PointSize, FontNamePointSize)
+ CopyUnsigned (ResolutionX, FontNameResolutionX)
+ CopyUnsigned (ResolutionY, FontNameResolutionY)
+ CopyString (Spacing, FontNameSpacing)
+ CopyUnsigned (AverageWidth, FontNameAverageWidth)
+ CopyString (CharSetRegistry, FontNameCharSetRegistry)
+ CopyString (CharSetEncoding, FontNameCharSetEncoding)
+ return True;
+}
diff --git a/src/libs/libxutil/libxutil.am b/src/libs/libxutil/libxutil.am
new file mode 100644
index 0000000..5963530
--- /dev/null
+++ b/src/libs/libxutil/libxutil.am
@@ -0,0 +1,35 @@
+# Automake rules for 'libxutil'
+#
+# Copyright (C) 2014-2020 Free Software Foundation, Inc.
+#
+# '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 of the License, 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 this program. If not, see
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+#
+########################################################################
+
+if !WITHOUT_X11
+noinst_LIBRARIES += libxutil.a
+libxutil_a_CPPFLAGS = $(AM_CPPFLAGS) $(X_CFLAGS)
+libxutil_a_SOURCES = \
+ src/libs/libxutil/DviChar.c \
+ src/libs/libxutil/XFontName.c \
+ src/libs/libxutil/xmalloc.c
+endif
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/libs/libxutil/xmalloc.c b/src/libs/libxutil/xmalloc.c
new file mode 100644
index 0000000..0852c62
--- /dev/null
+++ b/src/libs/libxutil/xmalloc.c
@@ -0,0 +1,28 @@
+/* Copyright (C) 2014-2020 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 of the License, 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.
+
+The GNU General Public License version 2 (GPL2) is available in the
+internet at <http://www.gnu.org/licenses/gpl-2.0.txt>. */
+
+#include <config.h>
+
+#include <X11/Xlib.h>
+#include <X11/Intrinsic.h>
+
+char *xmalloc(int n);
+
+char *xmalloc(int n)
+{
+ return XtMalloc(n);
+}
diff --git a/src/preproc/eqn/TODO b/src/preproc/eqn/TODO
new file mode 100644
index 0000000..2a22183
--- /dev/null
+++ b/src/preproc/eqn/TODO
@@ -0,0 +1,49 @@
+Use the same size increases for sum prod int as eqn does.
+
+Perhaps chartype should be renamed.
+
+TeX makes {sub,super}script on a single character with an accent
+into an accent onto the (character with the script). Should we do this?
+
+Implement mark and lineups within scripts, matrices and piles, and accents.
+(Why would this be useful?)
+
+Perhaps push hmotions down through lists to avoid upsetting spacing
+adjustments.
+
+Possibly generate .lf commands during compute_metrics phase.
+
+Consider whether there should be extra space at the side of piles.
+
+Provide scriptstyle displaystyle etc.
+
+Provide a nicer matrix syntax, e.g.,
+matrix ccc {
+a then b then c above
+e then f then g above
+h then i then k
+}
+
+Perhaps generate syntax error messages using the style of gpic.
+
+Wide accents.
+
+More use of \Z.
+
+Extensible square roots.
+
+Vphantom
+
+Smash.
+
+Provide a variant of vec that extends over the length of the accentee.
+
+Support vertical arrow delimiters.
+
+Make the following work:
+.EQ
+delim @@
+.EN
+.EQ @<-@
+some equation
+.EN
diff --git a/src/preproc/eqn/box.cpp b/src/preproc/eqn/box.cpp
new file mode 100644
index 0000000..5f6343e
--- /dev/null
+++ b/src/preproc/eqn/box.cpp
@@ -0,0 +1,651 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <assert.h>
+
+#include "eqn.h"
+#include "pbox.h"
+
+const char *current_roman_font;
+
+char *gfont = 0;
+char *grfont = 0;
+char *gbfont = 0;
+int gsize = 0;
+
+int script_size_reduction = -1; // negative means reduce by a percentage
+
+int positive_space = -1;
+int negative_space = -1;
+
+int minimum_size = 5;
+
+int fat_offset = 4;
+int body_height = 85;
+int body_depth = 35;
+
+int over_hang = 0;
+int accent_width = 31;
+int delimiter_factor = 900;
+int delimiter_shortfall = 50;
+
+int null_delimiter_space = 12;
+int script_space = 5;
+int thin_space = 17;
+int medium_space = 22;
+int thick_space = 28;
+
+int num1 = 70;
+int num2 = 40;
+// we don't use num3, because we don't have \atop
+int denom1 = 70;
+int denom2 = 36;
+int axis_height = 26; // in 100ths of an em
+int sup1 = 42;
+int sup2 = 37;
+int sup3 = 28;
+int default_rule_thickness = 4;
+int sub1 = 20;
+int sub2 = 23;
+int sup_drop = 38;
+int sub_drop = 5;
+int x_height = 45;
+int big_op_spacing1 = 11;
+int big_op_spacing2 = 17;
+int big_op_spacing3 = 20;
+int big_op_spacing4 = 60;
+int big_op_spacing5 = 10;
+
+// These are for piles and matrices.
+
+int baseline_sep = 140; // = num1 + denom1
+int shift_down = 26; // = axis_height
+int column_sep = 100; // = em space
+int matrix_side_sep = 17; // = thin space
+
+int nroff = 0; // should we grok ndefine or tdefine?
+
+struct S {
+ const char *name;
+ int *ptr;
+} param_table[] = {
+ { "fat_offset", &fat_offset },
+ { "over_hang", &over_hang },
+ { "accent_width", &accent_width },
+ { "delimiter_factor", &delimiter_factor },
+ { "delimiter_shortfall", &delimiter_shortfall },
+ { "null_delimiter_space", &null_delimiter_space },
+ { "script_space", &script_space },
+ { "thin_space", &thin_space },
+ { "medium_space", &medium_space },
+ { "thick_space", &thick_space },
+ { "num1", &num1 },
+ { "num2", &num2 },
+ { "denom1", &denom1 },
+ { "denom2", &denom2 },
+ { "axis_height", &axis_height },
+ { "sup1", &sup1 },
+ { "sup2", &sup2 },
+ { "sup3", &sup3 },
+ { "default_rule_thickness", &default_rule_thickness },
+ { "sub1", &sub1 },
+ { "sub2", &sub2 },
+ { "sup_drop", &sup_drop },
+ { "sub_drop", &sub_drop },
+ { "x_height", &x_height },
+ { "big_op_spacing1", &big_op_spacing1 },
+ { "big_op_spacing2", &big_op_spacing2 },
+ { "big_op_spacing3", &big_op_spacing3 },
+ { "big_op_spacing4", &big_op_spacing4 },
+ { "big_op_spacing5", &big_op_spacing5 },
+ { "minimum_size", &minimum_size },
+ { "baseline_sep", &baseline_sep },
+ { "shift_down", &shift_down },
+ { "column_sep", &column_sep },
+ { "matrix_side_sep", &matrix_side_sep },
+ { "draw_lines", &draw_flag },
+ { "body_height", &body_height },
+ { "body_depth", &body_depth },
+ { "nroff", &nroff },
+ { 0, 0 }
+};
+
+void set_param(const char *name, int value)
+{
+ for (int i = 0; param_table[i].name != 0; i++)
+ if (strcmp(param_table[i].name, name) == 0) {
+ *param_table[i].ptr = value;
+ return;
+ }
+ error("unrecognised parameter '%1'", name);
+}
+
+int script_style(int style)
+{
+ return style > SCRIPT_STYLE ? style - 2 : style;
+}
+
+int cramped_style(int style)
+{
+ return (style & 1) ? style - 1 : style;
+}
+
+void set_space(int n)
+{
+ if (n < 0)
+ negative_space = -n;
+ else
+ positive_space = n;
+}
+
+// Return 0 if the specified size is bad.
+// The caller is responsible for giving the error message.
+
+int set_gsize(const char *s)
+{
+ const char *p = (*s == '+' || *s == '-') ? s + 1 : s;
+ char *end;
+ long n = strtol(p, &end, 10);
+ if (n <= 0 || *end != '\0' || n > INT_MAX)
+ return 0;
+ if (p > s) {
+ if (!gsize)
+ gsize = 10;
+ if (*s == '+') {
+ if (gsize > INT_MAX - n)
+ return 0;
+ gsize += int(n);
+ }
+ else {
+ if (gsize - n <= 0)
+ return 0;
+ gsize -= int(n);
+ }
+ }
+ else
+ gsize = int(n);
+ return 1;
+}
+
+void set_script_reduction(int n)
+{
+ script_size_reduction = n;
+}
+
+const char *get_gfont()
+{
+ return gfont ? gfont : "I";
+}
+
+const char *get_grfont()
+{
+ return grfont ? grfont : "R";
+}
+
+const char *get_gbfont()
+{
+ return gbfont ? gbfont : "B";
+}
+
+void set_gfont(const char *s)
+{
+ delete[] gfont;
+ gfont = strsave(s);
+}
+
+void set_grfont(const char *s)
+{
+ delete[] grfont;
+ grfont = strsave(s);
+}
+
+void set_gbfont(const char *s)
+{
+ delete[] gbfont;
+ gbfont = strsave(s);
+}
+
+// this must be precisely 2 characters in length
+#define COMPATIBLE_REG "0C"
+
+void start_string()
+{
+ if (output_format == troff) {
+ printf(".nr " COMPATIBLE_REG " \\n(.C\n");
+ printf(".cp 0\n");
+ printf(".ds " LINE_STRING "\n");
+ }
+}
+
+void output_string()
+{
+ if (output_format == troff)
+ printf("\\*(" LINE_STRING "\n");
+ else if (output_format == mathml && !xhtml)
+ putchar('\n');
+}
+
+void restore_compatibility()
+{
+ if (output_format == troff)
+ printf(".cp \\n(" COMPATIBLE_REG "\n");
+}
+
+void do_text(const char *s)
+{
+ if (output_format == troff) {
+ printf(".eo\n");
+ printf(".as " LINE_STRING " \"%s\n", s);
+ printf(".ec\n");
+ }
+ else if (output_format == mathml) {
+ fputs(s, stdout);
+ if (xhtml && strlen(s) > 0)
+ printf("\n");
+ }
+}
+
+void set_minimum_size(int n)
+{
+ minimum_size = n;
+}
+
+void set_script_size()
+{
+ if (minimum_size < 0)
+ minimum_size = 0;
+ if (script_size_reduction >= 0)
+ printf(".ps \\n[.s]-%d>?%d\n", script_size_reduction, minimum_size);
+ else
+ printf(".ps (u;\\n[.ps]*7+5/10>?%dz)\n", minimum_size);
+}
+
+int box::next_uid = 0;
+
+box::box() : spacing_type(ORDINARY_TYPE), uid(next_uid++)
+{
+}
+
+box::~box()
+{
+}
+
+void box::top_level()
+{
+ box *b = this;
+ if (output_format == troff) {
+ // debug_print();
+ // putc('\n', stderr);
+ printf(".nr " SAVED_FONT_REG " \\n[.f]\n");
+ printf(".ft\n");
+ printf(".nr " SAVED_PREV_FONT_REG " \\n[.f]\n");
+ printf(".ft %s\n", get_gfont());
+ printf(".nr " SAVED_SIZE_REG " \\n[.ps]\n");
+ if (gsize > 0) {
+ char buf[INT_DIGITS + 1];
+ sprintf(buf, "%d", gsize);
+ b = new size_box(strsave(buf), b);
+ }
+ current_roman_font = get_grfont();
+ // This catches tabs used within \Z (which aren't allowed).
+ b->check_tabs(0);
+ int r = b->compute_metrics(DISPLAY_STYLE);
+ printf(".ft \\n[" SAVED_PREV_FONT_REG "]\n");
+ printf(".ft \\n[" SAVED_FONT_REG "]\n");
+ printf(".nr " MARK_OR_LINEUP_FLAG_REG " %d\n", r);
+ if (r == FOUND_MARK) {
+ printf(".nr " SAVED_MARK_REG " \\n[" MARK_REG "]\n");
+ printf(".nr " MARK_WIDTH_REG " 0\\n[" WIDTH_FORMAT "]\n", b->uid);
+ }
+ else if (r == FOUND_LINEUP)
+ printf(".if r" SAVED_MARK_REG " .as1 " LINE_STRING " \\h'\\n["
+ SAVED_MARK_REG "]u-\\n[" MARK_REG "]u'\n");
+ else
+ assert(r == FOUND_NOTHING);
+ // If we use \R directly, the space will prevent it working in a
+ // macro argument; so we hide it in a string instead.
+ printf(".ds " SAVE_FONT_STRING " "
+ "\\R'" SAVED_INLINE_FONT_REG " \\En[.f]'"
+ "\\fP"
+ "\\R'" SAVED_INLINE_PREV_FONT_REG " \\En[.f]'"
+ "\\R'" SAVED_INLINE_SIZE_REG " \\En[.ps]'"
+ "\\s0"
+ "\\R'" SAVED_INLINE_PREV_SIZE_REG " \\En[.ps]'"
+ "\n"
+ ".ds " RESTORE_FONT_STRING " "
+ "\\f[\\En[" SAVED_INLINE_PREV_FONT_REG "]]"
+ "\\f[\\En[" SAVED_INLINE_FONT_REG "]]"
+ "\\s'\\En[" SAVED_INLINE_PREV_SIZE_REG "]u'"
+ "\\s'\\En[" SAVED_INLINE_SIZE_REG "]u'"
+ "\n");
+ printf(".as1 " LINE_STRING " \\&\\E*[" SAVE_FONT_STRING "]");
+ printf("\\f[%s]", get_gfont());
+ printf("\\s'\\En[" SAVED_SIZE_REG "]u'");
+ current_roman_font = get_grfont();
+ b->output();
+ printf("\\E*[" RESTORE_FONT_STRING "]\n");
+ if (r == FOUND_LINEUP)
+ printf(".if r" SAVED_MARK_REG " .as1 " LINE_STRING " \\h'\\n["
+ MARK_WIDTH_REG "]u-\\n[" SAVED_MARK_REG "]u-(\\n["
+ WIDTH_FORMAT "]u-\\n[" MARK_REG "]u)'\n",
+ b->uid);
+ b->extra_space();
+ if (!inline_flag)
+ printf(".ne \\n[" HEIGHT_FORMAT "]u-%dM>?0+(\\n["
+ DEPTH_FORMAT "]u-%dM>?0)\n",
+ b->uid, body_height, b->uid, body_depth);
+ }
+ else if (output_format == mathml) {
+ if (xhtml)
+ printf(".MATHML ");
+ printf("<math>");
+ b->output();
+ printf("</math>");
+ }
+ delete b;
+ next_uid = 0;
+}
+
+// gpic defines this register so as to make geqn not produce '\x's
+#define EQN_NO_EXTRA_SPACE_REG "0x"
+
+void box::extra_space()
+{
+ printf(".if !r" EQN_NO_EXTRA_SPACE_REG " "
+ ".nr " EQN_NO_EXTRA_SPACE_REG " 0\n");
+ if (positive_space >= 0 || negative_space >= 0) {
+ if (positive_space > 0)
+ printf(".if !\\n[" EQN_NO_EXTRA_SPACE_REG "] "
+ ".as1 " LINE_STRING " \\x'-%dM'\n", positive_space);
+ if (negative_space > 0)
+ printf(".if !\\n[" EQN_NO_EXTRA_SPACE_REG "] "
+ ".as1 " LINE_STRING " \\x'%dM'\n", negative_space);
+ positive_space = negative_space = -1;
+ }
+ else {
+ printf(".if !\\n[" EQN_NO_EXTRA_SPACE_REG "] "
+ ".if \\n[" HEIGHT_FORMAT "]>%dM .as1 " LINE_STRING
+ " \\x'-(\\n[" HEIGHT_FORMAT
+ "]u-%dM)'\n",
+ uid, body_height, uid, body_height);
+ printf(".if !\\n[" EQN_NO_EXTRA_SPACE_REG "] "
+ ".if \\n[" DEPTH_FORMAT "]>%dM .as1 " LINE_STRING
+ " \\x'\\n[" DEPTH_FORMAT
+ "]u-%dM'\n",
+ uid, body_depth, uid, body_depth);
+ }
+}
+
+int box::compute_metrics(int)
+{
+ printf(".nr " WIDTH_FORMAT " 0\n", uid);
+ printf(".nr " HEIGHT_FORMAT " 0\n", uid);
+ printf(".nr " DEPTH_FORMAT " 0\n", uid);
+ return FOUND_NOTHING;
+}
+
+void box::compute_subscript_kern()
+{
+ printf(".nr " SUB_KERN_FORMAT " 0\n", uid);
+}
+
+void box::compute_skew()
+{
+ printf(".nr " SKEW_FORMAT " 0\n", uid);
+}
+
+void box::output()
+{
+}
+
+void box::check_tabs(int)
+{
+}
+
+int box::is_char()
+{
+ return 0;
+}
+
+int box::left_is_italic()
+{
+ return 0;
+}
+
+int box::right_is_italic()
+{
+ return 0;
+}
+
+void box::hint(unsigned)
+{
+}
+
+void box::handle_char_type(int, int)
+{
+}
+
+
+box_list::box_list(box *pp)
+{
+ p = new box*[10];
+ for (int i = 0; i < 10; i++)
+ p[i] = 0;
+ maxlen = 10;
+ len = 1;
+ p[0] = pp;
+}
+
+void box_list::append(box *pp)
+{
+ if (len + 1 > maxlen) {
+ box **oldp = p;
+ maxlen *= 2;
+ p = new box*[maxlen];
+ memcpy(p, oldp, sizeof(box*)*len);
+ delete[] oldp;
+ }
+ p[len++] = pp;
+}
+
+box_list::~box_list()
+{
+ for (int i = 0; i < len; i++)
+ delete p[i];
+ delete[] p;
+}
+
+void box_list::list_check_tabs(int level)
+{
+ for (int i = 0; i < len; i++)
+ p[i]->check_tabs(level);
+}
+
+
+pointer_box::pointer_box(box *pp) : p(pp)
+{
+ spacing_type = p->spacing_type;
+}
+
+pointer_box::~pointer_box()
+{
+ delete p;
+}
+
+int pointer_box::compute_metrics(int style)
+{
+ int r = p->compute_metrics(style);
+ printf(".nr " WIDTH_FORMAT " 0\\n[" WIDTH_FORMAT "]\n", uid, p->uid);
+ printf(".nr " HEIGHT_FORMAT " \\n[" HEIGHT_FORMAT "]\n", uid, p->uid);
+ printf(".nr " DEPTH_FORMAT " \\n[" DEPTH_FORMAT "]\n", uid, p->uid);
+ return r;
+}
+
+void pointer_box::compute_subscript_kern()
+{
+ p->compute_subscript_kern();
+ printf(".nr " SUB_KERN_FORMAT " \\n[" SUB_KERN_FORMAT "]\n", uid, p->uid);
+}
+
+void pointer_box::compute_skew()
+{
+ p->compute_skew();
+ printf(".nr " SKEW_FORMAT " 0\\n[" SKEW_FORMAT "]\n",
+ uid, p->uid);
+}
+
+void pointer_box::check_tabs(int level)
+{
+ p->check_tabs(level);
+}
+
+int simple_box::compute_metrics(int)
+{
+ printf(".nr " WIDTH_FORMAT " 0\\w" DELIMITER_CHAR, uid);
+ output();
+ printf(DELIMITER_CHAR "\n");
+ printf(".nr " HEIGHT_FORMAT " 0>?\\n[rst]\n", uid);
+ printf(".nr " DEPTH_FORMAT " 0-\\n[rsb]>?0\n", uid);
+ printf(".nr " SUB_KERN_FORMAT " 0-\\n[ssc]>?0\n", uid);
+ printf(".nr " SKEW_FORMAT " 0\\n[skw]\n", uid);
+ return FOUND_NOTHING;
+}
+
+void simple_box::compute_subscript_kern()
+{
+ // do nothing, we already computed it in do_metrics
+}
+
+void simple_box::compute_skew()
+{
+ // do nothing, we already computed it in do_metrics
+}
+
+int box::is_simple()
+{
+ return 0;
+}
+
+int simple_box::is_simple()
+{
+ return 1;
+}
+
+quoted_text_box::quoted_text_box(char *s) : text(s)
+{
+}
+
+quoted_text_box::~quoted_text_box()
+{
+ free(text);
+}
+
+void quoted_text_box::output()
+{
+ if (text) {
+ if (output_format == troff)
+ fputs(text, stdout);
+ else if (output_format == mathml) {
+ fputs("<mtext>", stdout);
+ fputs(text, stdout);
+ fputs("</mtext>", stdout);
+ }
+ }
+}
+
+tab_box::tab_box() : disabled(0)
+{
+}
+
+// We treat a tab_box as having width 0 for width computations.
+
+void tab_box::output()
+{
+ if (!disabled)
+ printf("\\t");
+}
+
+void tab_box::check_tabs(int level)
+{
+ if (level > 0) {
+ error("tabs allowed only at outermost level");
+ disabled = 1;
+ }
+}
+
+space_box::space_box()
+{
+ spacing_type = SUPPRESS_TYPE;
+}
+
+void space_box::output()
+{
+ if (output_format == troff)
+ printf("\\h'%dM'", thick_space);
+ else if (output_format == mathml)
+ // &ThickSpace; doesn't display right under Firefox 1.5.
+ printf("<mtext>&ensp;</mtext>");
+}
+
+half_space_box::half_space_box()
+{
+ spacing_type = SUPPRESS_TYPE;
+}
+
+void half_space_box::output()
+{
+ if (output_format == troff)
+ printf("\\h'%dM'", thin_space);
+ else if (output_format == mathml)
+ printf("<mtext>&ThinSpace;</mtext>");
+}
+
+void box_list::list_debug_print(const char *sep)
+{
+ p[0]->debug_print();
+ for (int i = 1; i < len; i++) {
+ fprintf(stderr, "%s", sep);
+ p[i]->debug_print();
+ }
+}
+
+void quoted_text_box::debug_print()
+{
+ fprintf(stderr, "\"%s\"", (text ? text : ""));
+}
+
+void half_space_box::debug_print()
+{
+ fprintf(stderr, "^");
+}
+
+void space_box::debug_print()
+{
+ fprintf(stderr, "~");
+}
+
+void tab_box::debug_print()
+{
+ fprintf(stderr, "<tab>");
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/eqn/box.h b/src/preproc/eqn/box.h
new file mode 100644
index 0000000..981b464
--- /dev/null
+++ b/src/preproc/eqn/box.h
@@ -0,0 +1,278 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+class list_box;
+
+class box {
+private:
+ static int next_uid;
+public:
+ int spacing_type;
+ const int uid;
+ box();
+ virtual void debug_print() = 0;
+ virtual ~box();
+ void top_level();
+ virtual int compute_metrics(int);
+ virtual void compute_subscript_kern();
+ virtual void compute_skew();
+ virtual void output();
+ void extra_space();
+ virtual list_box *to_list_box();
+ virtual int is_simple();
+ virtual int is_char();
+ virtual int left_is_italic();
+ virtual int right_is_italic();
+ virtual void handle_char_type(int, int);
+ enum { FOUND_NOTHING = 0, FOUND_MARK = 1, FOUND_LINEUP = 2 };
+ void set_spacing_type(char *type);
+ virtual void hint(unsigned);
+ virtual void check_tabs(int);
+};
+
+class box_list {
+private:
+ int maxlen;
+public:
+ box **p;
+ int len;
+
+ box_list(box *);
+ ~box_list();
+ void append(box *);
+ void list_check_tabs(int);
+ void list_debug_print(const char *sep);
+ friend class list_box;
+};
+
+// declarations to avoid friend name injection problems
+box *make_script_box(box *, box *, box *);
+box *make_mark_box(box *);
+box *make_lineup_box(box *);
+
+class list_box : public box {
+ int is_script;
+ box_list list;
+ int sty;
+public:
+ list_box(box *);
+ void debug_print();
+ int compute_metrics(int);
+ void compute_subscript_kern();
+ void output();
+ void check_tabs(int);
+ void append(box *);
+ list_box *to_list_box();
+ void handle_char_type(int, int);
+ void compute_sublist_width(int n);
+ friend box *make_script_box(box *, box *, box *);
+ friend box *make_mark_box(box *);
+ friend box *make_lineup_box(box *);
+};
+
+enum alignment { LEFT_ALIGN, RIGHT_ALIGN, CENTER_ALIGN };
+
+class column : public box_list {
+ alignment align;
+ int space;
+public:
+ column(box *);
+ void set_alignment(alignment);
+ void set_space(int);
+ void debug_print(const char *);
+
+ friend class matrix_box;
+ friend class pile_box;
+};
+
+class pile_box : public box {
+ column col;
+public:
+ pile_box(box *);
+ int compute_metrics(int);
+ void output();
+ void debug_print();
+ void check_tabs(int);
+ void set_alignment(alignment a) { col.set_alignment(a); }
+ void set_space(int n) { col.set_space(n); }
+ void append(box *p) { col.append(p); }
+};
+
+class matrix_box : public box {
+private:
+ int len;
+ int maxlen;
+ column **p;
+public:
+ matrix_box(column *);
+ ~matrix_box();
+ void append(column *);
+ int compute_metrics(int);
+ void output();
+ void check_tabs(int);
+ void debug_print();
+};
+
+class pointer_box : public box {
+protected:
+ box *p;
+public:
+ pointer_box(box *);
+ ~pointer_box();
+ int compute_metrics(int);
+ void compute_subscript_kern();
+ void compute_skew();
+ void debug_print() = 0;
+ void check_tabs(int);
+};
+
+class vcenter_box : public pointer_box {
+public:
+ vcenter_box(box *);
+ int compute_metrics(int);
+ void output();
+ void debug_print();
+};
+
+class simple_box : public box {
+public:
+ int compute_metrics(int);
+ void compute_subscript_kern();
+ void compute_skew();
+ void output() = 0;
+ void debug_print() = 0;
+ int is_simple();
+};
+
+class quoted_text_box : public simple_box {
+ char *text;
+public:
+ quoted_text_box(char *);
+ ~quoted_text_box();
+ void debug_print();
+ void output();
+};
+
+class half_space_box : public simple_box {
+public:
+ half_space_box();
+ void output();
+ void debug_print();
+};
+
+class space_box : public simple_box {
+public:
+ space_box();
+ void output();
+ void debug_print();
+};
+
+class tab_box : public box {
+ int disabled;
+public:
+ tab_box();
+ void output();
+ void debug_print();
+ void check_tabs(int);
+};
+
+class size_box : public pointer_box {
+private:
+ char *size;
+public:
+ size_box(char *, box *);
+ ~size_box();
+ int compute_metrics(int);
+ void output();
+ void debug_print();
+};
+
+class font_box : public pointer_box {
+private:
+ char *f;
+public:
+ font_box(char *, box *);
+ ~font_box();
+ int compute_metrics(int);
+ void output();
+ void debug_print();
+};
+
+class fat_box : public pointer_box {
+public:
+ fat_box(box *);
+ int compute_metrics(int);
+ void output();
+ void debug_print();
+};
+
+class vmotion_box : public pointer_box {
+private:
+ int n; // up is >= 0
+public:
+ vmotion_box(int, box *);
+ int compute_metrics(int);
+ void output();
+ void debug_print();
+};
+
+class hmotion_box : public pointer_box {
+ int n;
+public:
+ hmotion_box(int, box *);
+ int compute_metrics(int);
+ void output();
+ void debug_print();
+};
+
+box *split_text(char *);
+box *make_delim_box(char *, box *, char *);
+box *make_sqrt_box(box *);
+box *make_prime_box(box *);
+box *make_over_box(box *, box *);
+box *make_small_over_box(box *, box *);
+box *make_limit_box(box *, box *, box *);
+box *make_accent_box(box *, box *);
+box *make_uaccent_box(box *, box *);
+box *make_overline_box(box *);
+box *make_underline_box(box *);
+box *make_special_box(char *, box *);
+
+void set_space(int);
+int set_gsize(const char *);
+void set_gfont(const char *);
+void set_grfont(const char *);
+void set_gbfont(const char *);
+const char *get_gfont();
+const char *get_grfont();
+const char *get_gbfont();
+void start_string();
+void output_string();
+void do_text(const char *);
+void restore_compatibility();
+void set_script_reduction(int n);
+void set_minimum_size(int n);
+void set_param(const char *name, int value);
+
+void set_char_type(const char *type, char *ch);
+
+void init_char_table();
+void init_extensible();
+void define_extensible(const char *name, const char *ext, const char *top = 0,
+ const char *mid = 0, const char *bot = 0);
diff --git a/src/preproc/eqn/delim.cpp b/src/preproc/eqn/delim.cpp
new file mode 100644
index 0000000..01557c5
--- /dev/null
+++ b/src/preproc/eqn/delim.cpp
@@ -0,0 +1,418 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <assert.h>
+
+#include "eqn.h"
+#include "pbox.h"
+
+enum left_or_right_t { LEFT_DELIM = 01, RIGHT_DELIM = 02 };
+
+// Small must be none-zero and must exist in each device.
+// Small will be put in the roman font, others are assumed to be
+// on the special font (so no font change will be necessary.)
+
+struct delimiter {
+ const char *name;
+ int flags;
+ const char *small;
+ const char *chain_format;
+ const char *ext;
+ const char *top;
+ const char *mid;
+ const char *bot;
+} delim_table[] = {
+ {
+ "(", LEFT_DELIM|RIGHT_DELIM, "(", "\\[parenleft%s]",
+ "\\[parenleftex]",
+ "\\[parenlefttp]",
+ 0,
+ "\\[parenleftbt]",
+ },
+ {
+ ")", LEFT_DELIM|RIGHT_DELIM, ")", "\\[parenright%s]",
+ "\\[parenrightex]",
+ "\\[parenrighttp]",
+ 0,
+ "\\[parenrightbt]",
+ },
+ {
+ "[", LEFT_DELIM|RIGHT_DELIM, "[", "\\[bracketleft%s]",
+ "\\[bracketleftex]",
+ "\\[bracketlefttp]",
+ 0,
+ "\\[bracketleftbt]",
+ },
+ {
+ "]", LEFT_DELIM|RIGHT_DELIM, "]", "\\[bracketright%s]",
+ "\\[bracketrightex]",
+ "\\[bracketrighttp]",
+ 0,
+ "\\[bracketrightbt]",
+ },
+ {
+ "{", LEFT_DELIM|RIGHT_DELIM, "{", "\\[braceleft%s]",
+ "\\[braceleftex]",
+ "\\[bracelefttp]",
+ "\\[braceleftmid]",
+ "\\[braceleftbt]",
+ },
+ {
+ "}", LEFT_DELIM|RIGHT_DELIM, "}", "\\[braceright%s]",
+ "\\[bracerightex]",
+ "\\[bracerighttp]",
+ "\\[bracerightmid]",
+ "\\[bracerightbt]",
+ },
+ {
+ "|", LEFT_DELIM|RIGHT_DELIM, "|", "\\[bar%s]",
+ "\\[barex]",
+ 0,
+ 0,
+ 0,
+ },
+ {
+ "floor", LEFT_DELIM, "\\(lf", "\\[floorleft%s]",
+ "\\[bracketleftex]",
+ 0,
+ 0,
+ "\\[bracketleftbt]",
+ },
+ {
+ "floor", RIGHT_DELIM, "\\(rf", "\\[floorright%s]",
+ "\\[bracketrightex]",
+ 0,
+ 0,
+ "\\[bracketrightbt]",
+ },
+ {
+ "ceiling", LEFT_DELIM, "\\(lc", "\\[ceilingleft%s]",
+ "\\[bracketleftex]",
+ "\\[bracketlefttp]",
+ 0,
+ 0,
+ },
+ {
+ "ceiling", RIGHT_DELIM, "\\(rc", "\\[ceilingright%s]",
+ "\\[bracketrightex]",
+ "\\[bracketrighttp]",
+ 0,
+ 0,
+ },
+ {
+ "||", LEFT_DELIM|RIGHT_DELIM, "|", "\\[bar%s]",
+ "\\[bardblex]",
+ 0,
+ 0,
+ 0,
+ },
+ {
+ "<", LEFT_DELIM|RIGHT_DELIM, "\\(la", "\\[angleleft%s]",
+ 0,
+ 0,
+ 0,
+ 0,
+ },
+ {
+ ">", LEFT_DELIM|RIGHT_DELIM, "\\(ra", "\\[angleright%s]",
+ 0,
+ 0,
+ 0,
+ 0,
+ },
+ {
+ "uparrow", LEFT_DELIM|RIGHT_DELIM, "\\(ua", "\\[arrowup%s]",
+ "\\[arrowvertex]",
+ "\\[arrowverttp]",
+ 0,
+ 0,
+ },
+ {
+ "downarrow", LEFT_DELIM|RIGHT_DELIM, "\\(da", "\\[arrowdown%s]",
+ "\\[arrowvertex]",
+ 0,
+ 0,
+ "\\[arrowvertbt]",
+ },
+ {
+ "updownarrow", LEFT_DELIM|RIGHT_DELIM, "\\(va", "\\[arrowupdown%s]",
+ "\\[arrowvertex]",
+ "\\[arrowverttp]",
+ 0,
+ "\\[arrowvertbt]",
+ },
+};
+
+const int DELIM_TABLE_SIZE = int(sizeof(delim_table)/sizeof(delim_table[0]));
+
+class delim_box : public box {
+private:
+ char *left;
+ char *right;
+ box *p;
+public:
+ delim_box(char *, box *, char *);
+ ~delim_box();
+ int compute_metrics(int);
+ void output();
+ void check_tabs(int);
+ void debug_print();
+};
+
+box *make_delim_box(char *l, box *pp, char *r)
+{
+ if (l != 0 && *l == '\0') {
+ delete[] l;
+ l = 0;
+ }
+ if (r != 0 && *r == '\0') {
+ delete[] r;
+ r = 0;
+ }
+ return new delim_box(l, pp, r);
+}
+
+delim_box::delim_box(char *l, box *pp, char *r)
+: left(l), right(r), p(pp)
+{
+}
+
+delim_box::~delim_box()
+{
+ delete[] left;
+ delete[] right;
+ delete p;
+}
+
+static void build_extensible(const char *ext, const char *top, const char *mid,
+ const char *bot)
+{
+ assert(ext != 0);
+ printf(".nr " DELIM_WIDTH_REG " 0\\w" DELIMITER_CHAR "%s" DELIMITER_CHAR "\n",
+ ext);
+ printf(".nr " EXT_HEIGHT_REG " 0\\n[rst]\n");
+ printf(".nr " EXT_DEPTH_REG " 0-\\n[rsb]\n");
+ if (top) {
+ printf(".nr " DELIM_WIDTH_REG " 0\\n[" DELIM_WIDTH_REG "]"
+ ">?\\w" DELIMITER_CHAR "%s" DELIMITER_CHAR "\n",
+ top);
+ printf(".nr " TOP_HEIGHT_REG " 0\\n[rst]\n");
+ printf(".nr " TOP_DEPTH_REG " 0-\\n[rsb]\n");
+ }
+ if (mid) {
+ printf(".nr " DELIM_WIDTH_REG " 0\\n[" DELIM_WIDTH_REG "]"
+ ">?\\w" DELIMITER_CHAR "%s" DELIMITER_CHAR "\n",
+ mid);
+ printf(".nr " MID_HEIGHT_REG " 0\\n[rst]\n");
+ printf(".nr " MID_DEPTH_REG " 0-\\n[rsb]\n");
+ }
+ if (bot) {
+ printf(".nr " DELIM_WIDTH_REG " 0\\n[" DELIM_WIDTH_REG "]"
+ ">?\\w" DELIMITER_CHAR "%s" DELIMITER_CHAR "\n",
+ bot);
+ printf(".nr " BOT_HEIGHT_REG " 0\\n[rst]\n");
+ printf(".nr " BOT_DEPTH_REG " 0-\\n[rsb]\n");
+ }
+ printf(".nr " TOTAL_HEIGHT_REG " 0");
+ if (top)
+ printf("+\\n[" TOP_HEIGHT_REG "]+\\n[" TOP_DEPTH_REG "]");
+ if (bot)
+ printf("+\\n[" BOT_HEIGHT_REG "]+\\n[" BOT_DEPTH_REG "]");
+ if (mid)
+ printf("+\\n[" MID_HEIGHT_REG "]+\\n[" MID_DEPTH_REG "]");
+ printf("\n");
+ // determine how many extensible characters we need
+ printf(".nr " TEMP_REG " \\n[" DELTA_REG "]-\\n[" TOTAL_HEIGHT_REG "]");
+ if (mid)
+ printf("/2");
+ printf(">?0+\\n[" EXT_HEIGHT_REG "]+\\n[" EXT_DEPTH_REG "]-1/(\\n["
+ EXT_HEIGHT_REG "]+\\n[" EXT_DEPTH_REG "])\n");
+
+ printf(".nr " TOTAL_HEIGHT_REG " +(\\n[" EXT_HEIGHT_REG "]+\\n["
+ EXT_DEPTH_REG "]*\\n[" TEMP_REG "]");
+ if (mid)
+ printf("*2");
+ printf(")\n");
+ printf(".ds " DELIM_STRING " \\Z" DELIMITER_CHAR
+ "\\v'-%dM-(\\n[" TOTAL_HEIGHT_REG "]u/2u)'\n",
+ axis_height);
+ if (top)
+ printf(".as " DELIM_STRING " \\v'\\n[" TOP_HEIGHT_REG "]u'"
+ "\\Z" DELIMITER_CHAR "%s" DELIMITER_CHAR
+ "\\v'\\n[" TOP_DEPTH_REG "]u'\n",
+ top);
+
+ // this macro appends $2 copies of $3 to string $1
+ printf(".de " REPEAT_APPEND_STRING_MACRO "\n"
+ ".if \\\\$2 \\{.as \\\\$1 \"\\\\$3\n"
+ "." REPEAT_APPEND_STRING_MACRO " \\\\$1 \\\\$2-1 \"\\\\$3\"\n"
+ ".\\}\n"
+ "..\n");
+
+ printf("." REPEAT_APPEND_STRING_MACRO " " DELIM_STRING " \\n[" TEMP_REG "] "
+ "\\v'\\n[" EXT_HEIGHT_REG "]u'"
+ "\\Z" DELIMITER_CHAR "%s" DELIMITER_CHAR
+ "\\v'\\n[" EXT_DEPTH_REG "]u'\n",
+ ext);
+
+ if (mid) {
+ printf(".as " DELIM_STRING " \\v'\\n[" MID_HEIGHT_REG "]u'"
+ "\\Z" DELIMITER_CHAR "%s" DELIMITER_CHAR
+ "\\v'\\n[" MID_DEPTH_REG "]u'\n",
+ mid);
+ printf("." REPEAT_APPEND_STRING_MACRO " " DELIM_STRING
+ " \\n[" TEMP_REG "] "
+ "\\v'\\n[" EXT_HEIGHT_REG "]u'"
+ "\\Z" DELIMITER_CHAR "%s" DELIMITER_CHAR
+ "\\v'\\n[" EXT_DEPTH_REG "]u'\n",
+ ext);
+ }
+ if (bot)
+ printf(".as " DELIM_STRING " \\v'\\n[" BOT_HEIGHT_REG "]u'"
+ "\\Z" DELIMITER_CHAR "%s" DELIMITER_CHAR
+ "\\v'\\n[" BOT_DEPTH_REG "]u'\n",
+ bot);
+ printf(".as " DELIM_STRING " " DELIMITER_CHAR "\n");
+}
+
+static void define_extensible_string(char *delim, int uid,
+ left_or_right_t left_or_right)
+{
+ printf(".ds " DELIM_STRING "\n");
+ delimiter *d = delim_table;
+ int delim_len = strlen(delim);
+ int i;
+ for (i = 0; i < DELIM_TABLE_SIZE; i++, d++)
+ if (strncmp(delim, d->name, delim_len) == 0
+ && (left_or_right & d->flags) != 0)
+ break;
+ if (i >= DELIM_TABLE_SIZE) {
+ error("there is no '%1' delimiter", delim);
+ printf(".nr " DELIM_WIDTH_REG " 0\n");
+ return;
+ }
+
+ printf(".nr " DELIM_WIDTH_REG " 0\\w" DELIMITER_CHAR "\\f[%s]%s\\fP" DELIMITER_CHAR "\n"
+ ".ds " DELIM_STRING " \\Z" DELIMITER_CHAR
+ "\\v'\\n[rsb]u+\\n[rst]u/2u-%dM'\\f[%s]%s\\fP" DELIMITER_CHAR "\n"
+ ".nr " TOTAL_HEIGHT_REG " \\n[rst]-\\n[rsb]\n"
+ ".if \\n[" TOTAL_HEIGHT_REG "]<\\n[" DELTA_REG "] "
+ "\\{",
+ current_roman_font, d->small, axis_height,
+ current_roman_font, d->small);
+
+ char buf[256];
+// The format string in the sprintf below comes from a struct
+// initializer above, and is not subject to external influence.
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+ sprintf(buf, d->chain_format, "\\\\n[" INDEX_REG "]");
+#pragma GCC diagnostic pop
+ printf(".nr " INDEX_REG " 0\n"
+ ".de " TEMP_MACRO "\n"
+ ".ie c%s \\{\\\n"
+ ".nr " DELIM_WIDTH_REG " 0\\w" DELIMITER_CHAR "%s" DELIMITER_CHAR "\n"
+ ".ds " DELIM_STRING " \\Z" DELIMITER_CHAR
+ "\\v'\\\\n[rsb]u+\\\\n[rst]u/2u-%dM'%s" DELIMITER_CHAR "\n"
+ ".nr " TOTAL_HEIGHT_REG " \\\\n[rst]-\\\\n[rsb]\n"
+ ".if \\\\n[" TOTAL_HEIGHT_REG "]<\\n[" DELTA_REG "] "
+ "\\{.nr " INDEX_REG " +1\n"
+ "." TEMP_MACRO "\n"
+ ".\\}\\}\n"
+ ".el .nr " INDEX_REG " 0-1\n"
+ "..\n"
+ "." TEMP_MACRO "\n",
+ buf, buf, axis_height, buf);
+ if (d->ext) {
+ printf(".if \\n[" INDEX_REG "]<0 \\{.if c%s \\{\\\n", d->ext);
+ build_extensible(d->ext, d->top, d->mid, d->bot);
+ printf(".\\}\\}\n");
+ }
+ printf(".\\}\n");
+ printf(".as " DELIM_STRING " \\h'\\n[" DELIM_WIDTH_REG "]u'\n");
+ printf(".nr " WIDTH_FORMAT " +\\n[" DELIM_WIDTH_REG "]\n", uid);
+ printf(".nr " HEIGHT_FORMAT " \\n[" HEIGHT_FORMAT "]"
+ ">?(\\n[" TOTAL_HEIGHT_REG "]/2+%dM)\n",
+ uid, uid, axis_height);
+ printf(".nr " DEPTH_FORMAT " \\n[" DEPTH_FORMAT "]"
+ ">?(\\n[" TOTAL_HEIGHT_REG "]/2-%dM)\n",
+ uid, uid, axis_height);
+}
+
+int delim_box::compute_metrics(int style)
+{
+ int r = p->compute_metrics(style);
+ printf(".nr " WIDTH_FORMAT " 0\\n[" WIDTH_FORMAT "]\n", uid, p->uid);
+ printf(".nr " HEIGHT_FORMAT " \\n[" HEIGHT_FORMAT "]\n", uid, p->uid);
+ printf(".nr " DEPTH_FORMAT " \\n[" DEPTH_FORMAT "]\n", uid, p->uid);
+ printf(".nr " DELTA_REG " \\n[" HEIGHT_FORMAT "]-%dM"
+ ">?(\\n[" DEPTH_FORMAT "]+%dM)\n",
+ p->uid, axis_height, p->uid, axis_height);
+ printf(".nr " DELTA_REG " 0\\n[" DELTA_REG "]*%d/500"
+ ">?(\\n[" DELTA_REG "]*2-%dM)\n",
+ delimiter_factor, delimiter_shortfall);
+ if (left) {
+ define_extensible_string(left, uid, LEFT_DELIM);
+ printf(".rn " DELIM_STRING " " LEFT_DELIM_STRING_FORMAT "\n",
+ uid);
+ if (r)
+ printf(".nr " MARK_REG " +\\n[" DELIM_WIDTH_REG "]\n");
+ }
+ if (right) {
+ define_extensible_string(right, uid, RIGHT_DELIM);
+ printf(".rn " DELIM_STRING " " RIGHT_DELIM_STRING_FORMAT "\n",
+ uid);
+ }
+ return r;
+}
+
+void delim_box::output()
+{
+ if (output_format == troff) {
+ if (left)
+ printf("\\*[" LEFT_DELIM_STRING_FORMAT "]", uid);
+ p->output();
+ if (right)
+ printf("\\*[" RIGHT_DELIM_STRING_FORMAT "]", uid);
+ }
+ else if (output_format == mathml) {
+ printf("<mrow><mo>%s</mo>", left);
+ p->output();
+ printf("<mo>%s</mo></mrow>", right);
+ }
+}
+
+void delim_box::check_tabs(int level)
+{
+ p->check_tabs(level);
+}
+
+void delim_box::debug_print()
+{
+ fprintf(stderr, "left \"%s\" { ", left ? left : "");
+ p->debug_print();
+ fprintf(stderr, " }");
+ if (right)
+ fprintf(stderr, " right \"%s\"", right);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/eqn/eqn.1.man b/src/preproc/eqn/eqn.1.man
new file mode 100644
index 0000000..9c3d43c
--- /dev/null
+++ b/src/preproc/eqn/eqn.1.man
@@ -0,0 +1,2240 @@
+'\" et
+.TH @g@eqn @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+@g@eqn \- format mathematics (equations) for
+.I groff
+or MathML
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2023 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_eqn_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.ie \n(.V<\n(.v \
+. ds tx T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X
+.el \
+. ds tx TeX
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY @g@eqn
+.RB [ \-CNrR ]
+.RB [ \- d
+.IR xy ]
+.RB [ \-f
+.IR F ]
+.RB [ \-m
+.IR n ]
+.RB [ \-M
+.IR dir ]
+.RB [ \-p
+.IR n ]
+.RB [ \-s
+.IR n ]
+.RB [ \-T
+.IR dev ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY @g@eqn
+.B \-\-help
+.YS
+.
+.
+.SY @g@eqn
+.B \-v
+.
+.SY @g@eqn
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The GNU implementation of
+.I eqn \" GNU
+is part of the
+.MR groff @MAN7EXT@
+document formatting system.
+.
+.I @g@eqn
+is a
+.MR @g@troff @MAN1EXT@
+preprocessor that translates expressions in its own language,
+embedded in
+.MR roff @MAN7EXT@
+input files,
+into mathematical notation typeset by
+.MR @g@troff @MAN1EXT@ .
+.
+It copies each
+.IR file 's
+contents to the standard output stream,
+translating each
+.I equation
+between lines starting with
+.B .EQ
+and
+.BR .EN ,
+or within a pair of user-specified delimiters.
+.
+Normally,
+.I @g@eqn
+is not executed directly by the user,
+but invoked by specifying the
+.B \-e
+option to
+.MR groff @MAN1EXT@ .
+.
+While GNU
+.IR eqn 's \" GNU
+input syntax is highly compatible with AT&T
+.IR eqn , \" AT&T
+the output
+.I @g@eqn
+produces cannot be processed by AT&T
+.IR troff ; \" AT&T
+GNU
+.I troff \" GNU
+(or a
+.I troff \" generic
+implementing relevant GNU extensions)
+must be used.
+.
+If no
+.I file
+operands are given on the command line,
+or if
+.I file
+is
+.RB \[lq] \- \[rq],
+.I @g@eqn
+reads the standard input stream.
+.
+.
+.P
+Unless the
+.B \-R
+option is used,
+.I @g@eqn
+searches for the file
+.I eqnrc
+in the directories given with the
+.B \-M
+option first,
+then in
+.if !'@COMPATIBILITY_WRAPPERS@'no' .IR @SYSTEMMACRODIR@ ,
+.IR @LOCALMACRODIR@ ,
+and finally in the standard macro directory
+.IR @MACRODIR@ .
+.
+If it exists and is readable,
+.I @g@eqn
+processes it before any input files.
+.
+.
+.P
+This man page primarily discusses the differences between GNU
+.I eqn \" GNU
+and AT&T
+.IR eqn .\" AT&T
+.
+Most of the new features of the GNU
+.I eqn \" GNU
+input language are based on \*[tx].
+.
+There are some references to the differences between \*[tx] and GNU
+.I eqn \" GNU
+below;
+these may safely be ignored if you do not know \*[tx].
+.
+.
+.P
+Three points are worth special note. \" good, bad, and different
+.
+.
+.IP \[bu] 2n
+GNU
+.I eqn \" GNU
+emits Presentation MathML output when invoked with the
+.RB \[lq] "\-T\~MathML" \[rq]
+option.
+.
+.
+.IP \[bu]
+GNU
+.I eqn \" GNU
+does not support terminal devices well,
+though it may suffice for simple inputs.
+.
+.
+.IP \[bu]
+GNU
+.I eqn
+sets the input token
+.RB \[lq] .\|.\|.\& \[rq]
+as an ellipsis on the text baseline,
+not the three centered dots of AT&T
+.IR eqn . \" AT&T
+.
+Set an ellipsis on the math axis with the GNU extension macro
+.BR cdots .
+.
+.
+.\" ====================================================================
+.SS "Anatomy of an equation"
+.\" ====================================================================
+.
+.I eqn
+input consists of tokens.
+.
+Consider a form of Newton's second law of motion.
+.
+The input
+.
+.
+.P
+.RS
+.EX
+\&.EQ
+F =
+m a
+\&.EN
+.EE
+.RE
+.
+.
+.P
+becomes
+.EQ
+F =
+m a.
+.EN
+.
+Each of
+.BR F ,
+.BR = ,
+.BR m ,
+and
+.B a
+is a token.
+.
+.
+Spaces and newlines are interchangeable;
+they separate tokens but do not break lines or produce space in
+the output.
+.
+.
+.P
+The following input characters not only separate tokens,
+but manage their grouping and spacing as well.
+.
+.
+.TP
+.B "{ }"
+Braces perform grouping.
+.
+Whereas
+.RB \[lq] "e sup a b" \[rq]
+expresses
+.ie n .RI \[lq]( e "\~to the\~" a )\~times\~ b \[rq],
+.el \{\
+.EQ
+e sup a b ,
+.EN
+.\}
+.RB \[lq] "e sup { a b }" \[rq]
+means
+.ie n .RI \[lq] e "\~to the\~(" a \~times\~ b )\[rq].
+.el \{\
+.EQ
+e sup { a b } .
+.EN
+.\}
+.
+When immediately preceded by a
+.RB \[lq] left \[rq]
+or
+.RB \[lq] right \[rq]
+primitive,
+a brace loses its special meaning.
+.
+.
+.TP
+.B "\[ha] \[ti]
+are the
+.I "half space"
+and
+.I "full space,"
+respectively.
+.
+Use them to tune the appearance of the output.
+.
+.
+.P
+Tab and leader characters separate tokens as well as advancing the
+drawing position to the next tab stop,
+but are seldom used in
+.I eqn
+input.
+.
+When they occur,
+they must appear at the outermost lexical scope.
+.
+This roughly means that they can't appear within braces that are
+necessary to disambiguate the input;
+.I @g@eqn
+will diagnose an error in this event.
+.
+(See subsection \[lq]Macros\[rq] below for additional token separation
+rules.)
+.
+.
+.P
+Other tokens are primitives,
+macros,
+an argument to either of the foregoing,
+or components of an equation.
+.
+.
+.br
+.ne 4v
+.P
+.I Primitives
+are fundamental keywords of the
+.I eqn
+language.
+.
+They can configure an aspect of the preprocessor's state,
+as when setting a \[lq]global\[rq] font selection or type size
+.RB ( gfont
+and
+.BR gsize ),
+or declaring or deleting macros
+.RB \%(\[lq] define \[rq]
+and
+.BR undef );
+these are termed
+.I commands.
+.
+Other primitives perform formatting operations on the tokens after them
+(as with
+.BR fat ,
+.BR over ,
+.BR sqrt ,
+or
+.BR up ).
+.
+.
+.P
+Equation
+.I components
+include mathematical variables,
+constants,
+numeric literals,
+and operators.
+.
+.I @g@eqn
+remaps some input character sequences to
+.I groff
+special character escape sequences for economy in equation entry and to
+ensure that glyphs from an unstyled font are used;
+see
+.MR groff_char @MAN7EXT@ .
+.
+.
+.P
+.RS
+.TS
+tab(@);
+Lf(CR) Lf(CR) Lw(1i) Lf(CR) Lf(CR).
++@\[rs][pl]@\&@\[aq]@\[rs][fm]
+-@\[rs][mi]@\&@<=@\[rs][<=]
+\&=@\[rs][eq]@\&@>=@\[rs][>=]
+.TE
+.RE
+.
+.
+.P
+.I Macros
+permit primitives,
+components,
+and other macros to be collected and referred to by a single token.
+.
+Predefined macros make convenient the preparation of
+.I eqn
+input in a form resembling its spoken expression;
+for example,
+consider
+.BR cos ,
+.BR hat ,
+.BR inf ,
+and
+.BR lim .
+.
+.
+.\" ====================================================================
+.SS "Spacing and typeface"
+.\" ====================================================================
+.
+GNU
+.I eqn
+imputes types to the components of an equation,
+adjusting the spacing between them accordingly.
+.
+Recognized types are as follows;
+most affect spacing only,
+whereas the
+.RB \%\[lq] letter \[rq]
+subtype of
+.RB \%\[lq] ordinary \[rq]
+also assigns a style.
+.
+.
+.RS 2n \" we need quite a bit of horizontal space for this table
+.P
+.TS
+Lf(CR) Lx
+Af(CR) Lx
+Af(CR) Lx
+Lf(CR) Lx.
+ordinary T{
+character such as \[lq]1\[rq],
+\[lq]a\[rq],
+or
+\[lq]!\&\[rq]
+T}
+letter character to be italicized by default
+digit \f[I]n/a\f[]
+operator T{
+large operator such as
+.ds Su \[lq]\s+5\[*S]\s0\[rq]
+.if \n(.g .if !c\[*S] .ds Su the summation operator
+\*[Su]
+.rm Su
+T}
+binary binary operator such as \[lq]\[pl]\[rq]
+relation relational operator such as \[lq]=\[rq]
+opening opening bracket such as \[lq](\[rq]
+closing closing bracket such as \[lq])\[rq]
+punctuation punctuation character such as \[lq],\[rq]
+inner sub-formula contained within brackets
+suppress component to which automatic spacing is not applied
+.TE
+.RE
+.
+.
+.P
+Two primitives apply types to equation components.
+.
+.
+.TP
+.BI type\~ "t e"
+Apply
+.RI type\~ t
+to
+.RI expression\~ e .
+.
+.
+.TP
+.BI chartype\~ "t text"
+Assign each character in (unquoted)
+.I text
+.RI type\~ t ,
+persistently.
+.
+.
+.P
+.I @g@eqn \" GNU
+sets up spacings and styles as if by the following commands.
+.
+.P
+.RS
+.TS
+tab(@);
+Lf(CR)1 Lf(CR).
+chartype \[dq]letter\[dq]@abcdefghiklmnopqrstuvwxyz
+chartype \[dq]letter\[dq]@ABCDEFGHIKLMNOPQRSTUVWXYZ
+chartype \[dq]letter\[dq]@\[rs][*a]\[rs][*b]\[rs][*g]\[rs][*d]\[rs][*e]\
+\[rs][*z]
+chartype \[dq]letter\[dq]@\[rs][*y]\[rs][*h]\[rs][*i]\[rs][*k]\[rs][*l]\
+\[rs][*m]
+chartype \[dq]letter\[dq]@\[rs][*n]\[rs][*c]\[rs][*o]\[rs][*p]\[rs][*r]\
+\[rs][*s]
+chartype \[dq]letter\[dq]@\[rs][*t]\[rs][*u]\[rs][*f]\[rs][*x]\[rs][*q]\
+\[rs][*w]
+chartype \[dq]binary\[dq]@*\[rs][pl]\[rs][mi]
+chartype \[dq]relation\[dq]@<>\[rs][eq]\[rs][<=]\[rs][>=]
+chartype \[dq]opening\[dq]@{([
+chartype \[dq]closing\[dq]@})]
+chartype \[dq]punctuation\[dq]@,;:.
+chartype \[dq]suppress\[dq]@\[ha]\[ti]
+.TE
+.RE
+.
+.
+.P
+.I @g@eqn
+assigns all other ordinary and special
+.I roff
+characters,
+including numerals 0\[en]9,
+the
+.RB \%\[lq] ordinary \[rq]
+type.
+.
+(The
+.RB \[lq] digit \[rq]
+type is not used,
+but is available for customization.)
+.\" XXX: How would you actually customize it, though? There doesn't
+.\" seem to be a means of replacing the font associated with a type.
+.\" Is the "digit" type just cruft?
+.
+In keeping with common practice in mathematical typesetting,
+lowercase,
+but not uppercase,
+Greek letters are assigned the
+.RB \%\[lq] letter \[rq]
+type to style them in italics.
+.
+The macros for producing ellipses,
+.RB \[lq] .\|.\|. \[rq],
+.BR cdots ,
+and
+.BR ldots ,
+use the
+.RB \%\[lq] inner \[rq]
+type.
+.
+.
+.\" ====================================================================
+.SS Primitives
+.\" ====================================================================
+.
+.I @g@eqn
+supports without alteration the AT&T
+.I eqn \" AT&T
+primitives
+.BR above ,
+.BR back ,
+.BR bar ,
+.BR bold ,
+.BR \%define ,
+.BR down ,
+.BR fat ,
+.BR font ,
+.BR from ,
+.BR fwd ,
+.BR gfont ,
+.BR gsize ,
+.BR italic ,
+.BR left ,
+.BR lineup ,
+.BR mark ,
+.BR \%matrix ,
+.BR \%ndefine ,
+.BR over ,
+.BR right ,
+.BR roman ,
+.BR size ,
+.BR sqrt ,
+.BR sub ,
+.BR sup ,
+.BR \%tdefine ,
+.BR to ,
+.BR \%under ,
+and
+.BR up .
+.
+.
+.\" ====================================================================
+.SS "New primitives"
+.\" ====================================================================
+.
+The GNU extension primitives
+.RB \[lq] type \[rq]
+and
+.B \%chartype
+are discussed in subsection \[lq]Spacing and typeface\[rq] above;
+.RB \[lq] set \[rq]
+in subsection \[lq]Customization\[rq] below;
+and
+.B grfont
+and
+.B gbfont
+in subsection \[lq]Fonts\[rq] below.
+.
+In the following synopses,
+.I X
+can be any character not appearing in the parameter thus bracketed.
+.
+.
+.TP
+.IB e1 \~accent\~ e2
+Set
+.I e2
+as an accent over
+.IR e1 .
+.
+.I e2
+is assumed to be at the appropriate height for a lowercase letter
+without an ascender;
+.I @g@ eqn
+vertically shifts it depending on
+.IR e1 's
+height.
+.
+For example,
+.B hat
+is defined as follows.
+.
+.
+.RS
+.IP
+.EX
+accent { "\[ha]" }
+.EE
+.RE
+.
+.
+.IP
+.BR dotdot ,
+.BR dot ,
+.BR tilde ,
+.BR vec ,
+and
+.B dyad
+are also defined using the
+.B \%accent
+primitive.
+.
+.
+.TP
+.BI big\~ e
+Enlarge the expression
+.IR e ;
+semantics like those of CSS \[lq]large\[rq] are intended.
+.
+In
+.I @g@troff
+output,
+the type size is increased by\~5 scaled points.
+.
+MathML output emits the following.
+.
+.
+.RS
+.IP
+.EX
+<mstyle \%mathsize=\[aq]big\[aq]>
+.EE
+.RE
+.
+.
+.TP
+.BI copy\~ file
+.TQ
+.BI include\~ file
+Interpolate the contents of
+.IR file ,
+omitting lines
+beginning with
+.B .EQ
+or
+.BR .EN .
+.
+If a relative path name,
+.I file
+is sought relative to the current working directory.
+.
+.
+.TP
+.BI ifdef\~ "name X anything X"
+If
+.I name
+is defined as a primitive or macro,
+interpret
+.IR anything .
+.
+.
+.TP
+.BI nosplit\~ text
+As
+.RI \[dq] text \[dq],
+but since
+.I text
+is not quoted it is subject to macro expansion;
+it is not split up and the spacing between characters not adjusted per
+subsection \[lq]Spacing and typeface\[rq] above.
+.
+.
+.TP
+.IB e\~ opprime
+As
+.BR prime ,
+but set the prime symbol as an operator
+.RI on\~ e .
+.
+In the input
+.RB \[lq] "A opprime sub 1" \[rq],
+the\~\[lq]1\[rq] is tucked under the prime as a subscript to
+the\~\[lq]A\[rq]
+(as is conventional in mathematical typesetting),
+whereas when
+.B prime
+is used,
+the\~\[lq]1\[rq] is a subscript to the prime character.
+.
+The precedence of
+.B \%opprime
+is the same as that of
+.B bar
+and
+.RB \%\[lq] under \[rq],
+and higher than that of other primitives except
+.B \%accent
+and
+.BR uaccent .
+.
+In unquoted text,
+a neutral apostrophe
+.RB ( \[aq] )
+that is not the first character on the input line is treated like
+.BR \%opprime .
+.
+.
+.TP
+.BI sdefine\~ "name X anything X"
+As
+.RB \%\[lq] define \[rq],
+but
+.I name
+is not recognized as a macro if called with arguments.
+.
+.
+.TP
+.IB e1 \~smallover\~ e2
+As
+.BR over ,
+but reduces the type size of
+.I e1
+and
+.IR e2 ,
+and puts less vertical space between
+.I e1
+and
+.I e2
+and the fraction bar.
+.
+The
+.B over
+primitive corresponds to the \*[tx]
+.B \[rs]over
+primitive in displayed equation styles;
+.B smallover
+corresponds to
+.B \[rs]over
+in non-display (\[lq]inline\[rq]) styles.
+.
+.
+.br
+.ne 5v
+.TP
+.BI space\~ n
+Set extra vertical spacing around the equation,
+replacing the default values,
+where
+.IR n \~is
+an integer in hundredths of an em.
+.
+If positive,
+.IR n \~increases
+vertical spacing before the equation;
+if negative,
+it does so after the equation.
+.
+This primitive provides an interface to
+.IR groff 's
+.B \[rs]x
+escape sequence,
+but with the opposite sign convention.
+.
+It has no effect if the equation is part of a
+.MR @g@pic @MAN1EXT@
+picture.
+.
+.
+.TP
+.BI special\~ "troff-macro e"
+Construct an object by calling
+.I troff-macro
+.RI on\~ e .
+.
+The
+.I troff \" generic
+string
+.B 0s
+contains the
+.I eqn \" generic
+output
+.RI for\~ e ,
+and the registers
+.BR 0w ,
+.BR 0h ,
+.BR 0d ,
+.BR 0skern ,
+and
+.B 0skew
+the width,
+height,
+depth,
+subscript kern,
+and skew
+.RI of\~ e ,
+respectively.
+.
+(The
+.I subscript kern
+of an object indicates how much a subscript on that object should be
+\[lq]tucked in\[rq],
+or placed to the left relative to a non-subscripted glyph of the same
+size.
+.
+The
+.I skew
+of an object is how far to the right of the center of the object an
+accent over it should be placed.)
+.
+The macro must modify
+.B 0s
+so that it outputs the desired result,
+returns the drawing position to the text baseline at the beginning of
+.IR e ,
+and updates the foregoing registers to correspond to the new dimensions
+of the result.
+.
+.
+.IP
+Suppose you want a construct that \[lq]cancels\[rq] an expression by
+drawing a diagonal line through it.
+.
+.
+.br
+.ne 11v
+.RS
+.IP
+.EX
+\&.de Ca
+\&. ds 0s \[rs]
+\[rs]Z\[aq]\[rs]\[rs]*(0s\[aq]\[rs]
+\[rs]v\[aq]\[rs]\[rs]n(0du\[aq]\[rs]
+\[rs]D\[aq]l \[rs]\[rs]n(0wu \-\[rs]\[rs]n(0hu\-\[rs]\
+\[rs]n(0du\[aq]\[rs]
+\[rs]v\[aq]\[rs]\[rs]n(0hu\[aq]
+\&..
+\&.EQ
+special Ca "x \[rs][mi] 3 \[rs][pl] x" \[ti] 3
+\&.EN
+.EE
+.RE
+.
+.
+.IP
+We use the
+.B \[rs][mi]
+and
+.B \[rs][pl]
+special characters instead of + and \-
+because they are part of the argument to a
+.I @g@troff
+macro,
+so
+.I @g@eqn
+does not transform them to mathematical glyphs for us.
+.
+Here's a more complicated construct that draws a box around an
+expression;
+the bottom of the box rests on the text baseline.
+.
+We define the
+.I eqn \" generic
+macro
+.B box
+to wrap the call of the
+.I @g@troff
+macro
+.BR Bx .
+.
+.
+.br
+.ne 17v
+.RS
+.IP
+.EX
+\&.de Bx
+\&.ds 0s \[rs]
+\[rs]Z\[aq]\[rs]\[rs]h\[aq]1n\[aq]\[rs]\[rs]*[0s]\[aq]\[rs]
+\[rs]v\[aq]\[rs]\[rs]n(0du+1n\[aq]\[rs]
+\[rs]D\[aq]l \[rs]\[rs]n(0wu+2n 0\[aq]\[rs]
+\[rs]D\[aq]l 0 \-\[rs]\[rs]n(0hu\-\[rs]\[rs]n(0du\-2n\[aq]\[rs]
+\[rs]D\[aq]l \-\[rs]\[rs]n(0wu\-2n 0\[aq]\[rs]
+\[rs]D\[aq]l 0 \[rs]\[rs]n(0hu+\[rs]\[rs]n(0du+2n\[aq]\[rs]
+\[rs]h\[aq]\[rs]\[rs]n(0wu+2n\[aq]
+\&.nr 0w +2n
+\&.nr 0d +1n
+\&.nr 0h +1n
+\&..
+\&.EQ
+define box \[aq] special Bx $1 \[aq]
+box(foo) \[ti] "bar"
+\&.EN
+.EE
+.RE
+.
+.
+.TP
+.BI "split \[dq]" text \[dq]
+As
+.IR text ,
+but since
+.I text
+is quoted,
+it is not subject to macro expansion;
+it is split up and the spacing between characters adjusted per
+subsection \[lq]Spacing and typeface\[rq] above.
+.
+.
+.TP
+.IB e1 \~uaccent\~ e2
+Set
+.I e2
+as an accent under
+.IR e1 .
+.
+.I e2
+is assumed to be at the appropriate height for a letter without a
+descender;
+.I @g@ eqn
+vertically shifts it depending on whether
+.I e1
+has a descender.
+.
+.B utilde
+is predefined using
+.B uaccent
+as a tilde accent below the baseline.
+.
+.
+.TP
+.BI undef\~ name
+Remove definition of macro or primitive
+.IR name ,
+making it undefined.
+.
+.
+.TP
+.BI vcenter\~ e
+Vertically center
+.I e
+about the
+.IR "math axis" ,
+a horizontal line upon which fraction bars and characters such as
+\[lq]\[pl]\[rq] and \[lq]\[mi]\[rq] are aligned.
+.
+MathML already behaves this way,
+so
+.I @g@eqn
+ignores this primitive when producing that output format.
+.
+The built-in
+.B sum
+macro is defined as if by the following.
+.
+.RS
+.IP
+.EX
+define sum ! { type "operator" vcenter size +5 \[rs](*S } !
+.EE
+.RE
+.
+.
+.br
+.ne 8v
+.\" ====================================================================
+.SS "Extended primitives"
+.\" ====================================================================
+.
+GNU
+.I eqn \" GNU
+extends the syntax of some AT&T
+.I eqn \" AT&T
+primitives,
+introducing one deliberate incompatibility.
+.
+.
+.TP
+.B "delim on"
+.I @g@eqn
+recognizes an
+.RB \[lq] on \[rq]
+argument to the
+.B \%delim
+primitive specially,
+restoring any delimiters previously disabled with
+.RB \%\[lq] "delim off" \[rq].
+.
+If delimiters haven't been specified,
+neither command has effect.
+.
+Few
+.I eqn \" generic
+documents are expected to use \[lq]o\[rq] and \[lq]n\[rq] as left and
+right delimiters,
+respectively.
+.
+If yours does,
+consider swapping them,
+or select others.
+.
+.
+.TP
+.BI col\~ n\~\c
+.BR {\~ .\|.\|.\& \~}
+.TQ
+.BI ccol\~ n\~\c
+.BR {\~ .\|.\|.\& \~}
+.TQ
+.BI lcol\~ n\~\c
+.BR {\~ .\|.\|.\& \~}
+.TQ
+.BI rcol\~ n\~\c
+.BR {\~ .\|.\|.\& \~}
+.TQ
+.BI pile\~ n\~\c
+.BR {\~ .\|.\|.\& \~}
+.TQ
+.BI cpile\~ n\~\c
+.BR {\~ .\|.\|.\& \~}
+.TQ
+.BI lpile\~ n\~\c
+.BR {\~ .\|.\|.\& \~}
+.TQ
+.BI rpile\~ n\~\c
+.BR {\~ .\|.\|.\& \~}
+The integer
+.RI value\~ n
+(in hundredths of an em)
+increases the vertical spacing between rows,
+using
+.IR groff 's
+.B \[rs]x
+escape sequence
+(the value has no effect in MathML mode).
+.
+Negative values are accepted but have no effect.
+.
+If more than one
+.I n
+occurs in a matrix or pile,
+the largest is used.
+.
+.
+.\" ====================================================================
+.SS Customization
+.\" ====================================================================
+.
+When
+.I @g@eqn
+generates
+.I @g@troff
+input,
+the appearance of equations is controlled by a large number of
+parameters.
+.
+They have no effect when generating MathML,
+which delegates typesetting to a MathML rendering engine.
+.
+Configure these parameters with the
+.B set
+primitive.
+.
+.
+.TP
+.BI set\~ "p n"
+assigns
+.RI parameter\~ p
+the integer
+.RI value\~ n ;
+.IR n \~is
+interpreted in units of hundredths of an em unless otherwise stated.
+.
+For example,
+.
+.
+.RS
+.IP
+.EX
+set x_height 45
+.EE
+.RE
+.
+.
+.IP
+says that
+.I @g@eqn
+should assume that the font's x-height is 0.45\~ems.
+.
+.
+.RS
+.P
+Available parameters are as follows;
+defaults are shown in parentheses.
+.
+We intend these descriptions to be expository rather than rigorous.
+.
+.
+.TP 17n
+.B minimum_size
+sets a floor for the type size
+(in scaled points)
+at which equations are set
+.RB ( 5 ).
+.
+.
+.TP
+.B fat_offset
+The
+.B fat
+primitive emboldens an equation by overprinting two copies of the
+equation horizontally offset by this amount
+.RB ( 4 ).
+.
+In MathML mode,
+components to which
+.B \%fat_offset
+applies instead use the following.
+.
+.RS
+.RS
+.EX
+<mstyle mathvariant=\[aq]double\-struck\[aq]>
+.EE
+.RE
+.RE
+.
+.
+.TP
+.B over_hang
+A fraction bar is longer by twice this amount than
+the maximum of the widths of the numerator and denominator;
+in other words,
+it overhangs the numerator and denominator by at least this amount
+.RB ( 0 ).
+.
+.
+.TP
+.B accent_width
+When
+.B bar
+or
+.B \%under
+is applied to a single character,
+the line is this long
+.RB ( 31 ).
+.
+Normally,
+.B bar
+or
+.B \%under
+produces a line whose length is the width of the object to which it
+applies;
+in the case of a single character,
+this tends to produce a line that looks too long.
+.
+.
+.TP
+.B delimiter_factor
+Extensible delimiters produced with the
+.B left
+and
+.B right
+primitives have a combined height and depth of at least this many
+thousandths of twice the maximum amount by which the sub-equation that
+the delimiters enclose extends away from the axis
+.RB ( 900 ).
+.
+.
+.TP
+.B delimiter_shortfall
+Extensible delimiters produced with the
+.B left
+and
+.B right
+primitives have a combined height and depth not less than the
+difference of twice the maximum amount by which the sub-equation that
+the delimiters enclose extends away from the axis and this amount
+.RB ( 50 ).
+.
+.
+.TP
+.B null_delimiter_space
+This much horizontal space is inserted on each side of a fraction
+.RB ( 12 ).
+.
+.
+.TP
+.B script_space
+The width of subscripts and superscripts is increased by this amount
+.RB ( 5 ).
+.
+.
+.TP
+.B thin_space
+This amount of space is automatically inserted after punctuation
+characters.
+.
+It also configures the width of the space produced by the
+.B \[ha]
+token
+.RB ( 17 ).
+.
+.
+.TP
+.B medium_space
+This amount of space is automatically inserted on either side of
+binary operators
+.RB ( 22 ).
+.
+.
+.TP
+.B thick_space
+This amount of space is automatically inserted on either side of
+relations.
+.
+It also configures the width of the space produced by the
+.B \[ti]
+token
+.RB ( 28 ).
+.
+.
+.TP
+.B x_height
+The height of lowercase letters without ascenders such as \[lq]x\[rq]
+.RB ( 45 ).
+.
+.
+.TP
+.B axis_height
+The height above the baseline of the center of characters such as
+\[lq]\[pl]\[rq] and \[lq]\[mi]\[rq]
+.RB ( 26 ).
+.
+It is important that this value is correct for the font
+you are using.
+.
+.
+.TP
+.B default_rule_thickness
+This should be set to the thickness of the
+.B \[rs][ru]
+character,
+or the thickness of horizontal lines produced with the
+.B \[rs]D
+escape sequence
+.RB ( 4 ).
+.
+.
+.TP
+.B num1
+The
+.B over
+primitive shifts up the numerator by at least this amount
+.RB ( 70 ).
+.
+.
+.TP
+.B num2
+The
+.B smallover
+primitive shifts up the numerator by at least this amount
+.RB ( 36 ).
+.
+.
+.TP
+.B denom1
+The
+.B over
+primitive shifts down the denominator by at least this amount
+.RB ( 70 ).
+.
+.
+.TP
+.B denom2
+The
+.B smallover
+primitive shifts down the denominator by at least this amount
+.RB ( 36 ).
+.
+.
+.TP
+.B sup1
+Normally superscripts are shifted up by at least this amount
+.RB ( 42 ).
+.
+.
+.TP
+.B sup2
+Superscripts within superscripts or upper limits
+or numerators of
+.B smallover
+fractions are shifted up by at least this amount
+.RB ( 37 ).
+.
+Conventionally,
+this is less than
+.BR sup1 .
+.
+.
+.TP
+.B sup3
+Superscripts within denominators or square roots
+or subscripts or lower limits are shifted up by at least
+this amount
+.RB ( 28 ).
+.
+Conventionally,
+this is less than
+.BR sup2 .
+.
+.
+.TP
+.B sub1
+Subscripts are normally shifted down by at least this amount
+.RB ( 20 ).
+.
+.
+.TP
+.B sub2
+When there is both a subscript and a superscript,
+the subscript is shifted down by at least this amount
+.RB ( 23 ).
+.
+.
+.TP
+.B sup_drop
+The baseline of a superscript is no more than this much below the top of
+the object on which the superscript is set
+.RB ( 38 ).
+.
+.
+.TP
+.B sub_drop
+The baseline of a subscript is at least this much below the bottom of
+the object on which the subscript is set
+.RB ( 5 ).
+.
+.
+.TP
+.B big_op_spacing1
+The baseline of an upper limit is at least this much above the top of
+the object on which the limit is set
+.RB ( 11 ).
+.
+.
+.TP
+.B big_op_spacing2
+The baseline of a lower limit is at least this much below the bottom
+of the object on which the limit is set
+.RB ( 17 ).
+.
+.
+.TP
+.B big_op_spacing3
+The bottom of an upper limit is at least this much above the top of
+the object on which the limit is set
+.RB ( 20 ).
+.
+.
+.TP
+.B big_op_spacing4
+The top of a lower limit is at least this much below the bottom of the
+object on which the limit is set
+.RB ( 60 ).
+.
+.
+.TP
+.B big_op_spacing5
+This much vertical space is added above and below limits
+.RB ( 10 ).
+.
+.
+.TP
+.B baseline_sep
+The baselines of the rows in a pile or matrix are normally this far
+apart
+.RB ( 140 ).
+.
+Usually equal to the sum of
+.B num1
+and
+.BR denom1 .
+.
+.
+.TP
+.B shift_down
+The midpoint between the top baseline and the bottom baseline in a
+matrix or pile is shifted down by this much from the axis
+.RB ( 26 ).
+.
+Usually equal to
+.BR axis_height .
+.
+.
+.TP
+.B column_sep
+This much space is added between columns in a matrix
+.RB ( 100 ).
+.
+.
+.TP
+.B matrix_side_sep
+This much space is added at each side of a matrix
+.RB ( 17 ).
+.
+.
+.br
+.ne 4v
+.TP
+.B draw_lines
+If non-zero,
+.I @g@eqn
+draws lines using the
+.I troff \" generic
+.B \[rs]D
+escape sequence,
+rather than the
+.B \[rs]l
+escape sequence and the
+.B \[rs][ru]
+special character.
+.
+The
+.I eqnrc
+file sets the default:
+.BR 1 \~on
+.BR ps ,
+.BR html ,
+and the X11 devices,
+.RB otherwise\~ 0 .
+.
+.
+.TP
+.B body_height
+is the presumed height of an equation above the text baseline;
+.I @g@eqn
+adds any excess as extra pre-vertical line spacing with
+.IR troff 's\" generic
+.B \[rs]x
+escape sequence
+.RB ( 85 ).
+.
+.
+.TP
+.B body_depth
+is the presumed depth of an equation below the text baseline;
+.I @g@eqn
+adds any excess as extra post-vertical line spacing with
+.IR troff 's\" generic
+.B \[rs]x
+escape sequence
+.RB ( 35 ).
+.
+.
+.TP
+.B nroff
+If non-zero,
+then
+.B \%ndefine
+behaves like
+.B \%define
+and
+.B \%tdefine
+is ignored,
+otherwise
+.B \%tdefine
+behaves like
+.B \%define
+and
+.B \%ndefine
+is ignored.
+.
+The
+.I eqnrc
+file sets the default:
+.BR 1 \~on
+.BR ascii ,
+.BR latin1 ,
+.BR utf8 ,
+and
+.B cp1047
+devices,
+.RB otherwise\~ 0 .
+.RE
+.
+.
+.\" ====================================================================
+.SS Macros
+.\" ====================================================================
+.
+In GNU
+.IR eqn , \" GNU
+macros can take arguments.
+.
+A word defined by any of the
+.BR \%define ,
+.BR \%ndefine ,
+or
+.B \%tdefine
+primitives followed immediately by a left parenthesis is treated as a
+.I "parameterized macro call:"
+subsequent tokens up to a matching right parenthesis are treated as
+comma-separated arguments.
+.
+In this context only,
+commas and parentheses also serve as token separators.
+.
+A macro argument is not terminated by a comma inside parentheses nested
+within it.
+.
+In a macro definition,
+.BI $ n\c
+,
+where
+.I n
+is between 1 and\~9 inclusive,
+is replaced by the
+.IR n th
+argument;
+if there are fewer than
+.IR n \~arguments,
+it is replaced by nothing.
+.
+.
+.\" ====================================================================
+.SS "Predefined macros"
+.\" ====================================================================
+.
+GNU
+.I eqn \" GNU
+supports the predefined macros offered by AT&T
+.IR eqn : \" AT&T
+.BR and ,
+.BR \%approx ,
+.BR arc ,
+.BR cos ,
+.BR cosh ,
+.BR del ,
+.BR det ,
+.BR dot ,
+.BR \%dotdot ,
+.BR dyad ,
+.BR exp ,
+.BR for ,
+.BR grad ,
+.BR half ,
+.BR hat ,
+.BR if ,
+.BR \%inter ,
+.BR Im ,
+.BR inf ,
+.BR int ,
+.BR lim ,
+.BR ln ,
+.BR log ,
+.BR max ,
+.BR min ,
+.BR \%nothing ,
+.BR \%partial ,
+.BR prime ,
+.BR prod ,
+.BR Re ,
+.BR sin ,
+.BR sinh ,
+.BR sum ,
+.BR tan ,
+.BR tanh ,
+.BR tilde ,
+.BR times ,
+.BR union ,
+.BR vec ,
+.BR == ,
+.BR != ,
+.BR += ,
+.BR \-> ,
+.BR <\- ,
+.BR << ,
+.BR >> ,
+and
+.RB \[lq] .\|.\|. \[rq].
+.
+The lowercase classical Greek letters are available as
+.BR \%alpha ,
+.BR beta ,
+.BR chi ,
+.BR delta ,
+.BR \%epsilon ,
+.BR eta ,
+.BR gamma ,
+.BR iota ,
+.BR kappa ,
+.BR lambda ,
+.BR mu ,
+.BR nu ,
+.BR omega ,
+.BR \%omicron ,
+.BR phi ,
+.BR pi ,
+.BR psi ,
+.BR rho ,
+.BR sigma ,
+.BR tau ,
+.BR theta ,
+.BR \%upsilon ,
+.BR xi ,
+and
+.BR zeta .
+.
+Spell them with an initial capital letter
+.RB \%( Alpha )
+or in full capitals
+.RB \%( ALPHA )
+to obtain uppercase forms.
+.
+.
+.P
+GNU
+.I eqn \" GNU
+further defines the macros
+.BR cdot ,
+.BR cdots ,
+and
+.B utilde
+(all discussed above),
+.BR \%dollar ,
+which sets a dollar sign,
+and
+.BR ldots ,
+which sets an ellipsis on the text baseline.
+.
+.
+.\" ====================================================================
+.SS Fonts
+.\" ====================================================================
+.
+.I @g@eqn
+uses up to three typefaces to set an equation:
+italic (oblique),
+roman (upright),
+and bold.
+.
+Assign each a
+.I groff
+typeface with the primitives
+.BR gfont ,
+.BR \%grfont ,
+and
+.B \%gbfont.
+.
+The defaults are the styles
+.BR I ,
+.BR R ,
+and
+.B B
+(applied to the current font family).
+.
+The
+.B \%chartype
+primitive
+(see above)
+sets a character's type,
+which determines the face used to set it.
+.
+The
+.RB \%\[lq] letter \[rq]
+type is set in italics;
+others are set in roman.
+.
+Use the
+.B bold
+primitive to select an (upright) bold style.
+.
+.
+.TP
+.BI gbfont\~ f
+.RI Select\~ f
+as the bold font.
+.
+This is a GNU extension.
+.
+.
+.TP
+.BI gfont\~ f
+.RI Select\~ f
+as the italic font.
+.
+.
+.TP
+.BI grfont\~ f
+.RI Select\~ f
+as the roman font.
+.
+This is a GNU extension.
+.
+.
+.br
+.ne 4v
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.B \-C
+Recognize
+.B .EQ
+and
+.B .EN
+even when followed by a character other than space or newline.
+.
+.
+.TP
+.BI \-d\~ xy
+Specify delimiters
+.I x
+for left
+.RI and\~ y
+for right ends
+of equations not bracketed by
+.BR .EQ / .EN .
+.
+.I x
+and
+.I y
+need not be distinct.
+.
+Any
+.RB \%\[lq] delim
+.IR xy \[rq]
+statements in the source file override this option.
+.
+.
+.TP
+.BI \-f\~ F
+is equivalent to
+.RB \[lq] gfont
+.IR F \[rq].
+.
+.
+.TP
+.BI \-m\~ n
+is equivalent to
+.RB \[lq] "set \%minimum_size"
+.IR n \[rq].
+.
+.
+.TP
+.BI \-M\~ dir
+Search
+.I dir
+for
+.I eqnrc
+before those listed in section \[lq]Description\[rq] above.
+.
+.
+.TP
+.B \-N
+Prohibit newlines within delimiters.
+.
+This option allows
+.I @g@eqn
+to recover better from missing closing delimiters.
+.
+.
+.TP
+.BI \-p\~ n
+Set sub- and superscripts
+.IR n \~points
+smaller than the surrounding text.
+.
+This option is deprecated.
+.
+.I @g@eqn
+normally sets sub- and superscripts at 70% of the type size of the
+surrounding text.
+.
+.
+.TP
+.B \-r
+Reduce the type size of subscripts at most once relative to the base
+type size for the equation.
+.
+.
+.TP
+.B \-R
+Don't load
+.IR eqnrc .
+.
+.
+.TP
+.BI \-s\~ n
+is equivalent to
+.RB \[lq] gsize
+.IR n \[rq].
+.
+This option is deprecated.
+.
+.
+.TP
+.BI \-T\~ dev
+Prepare output for the device
+.IR dev .
+.
+In most cases,
+the effect of this is to define a macro
+.I dev
+with a value
+.RB of\~ 1 ;
+.I eqnrc
+uses this to provide definitions appropriate for the device.
+.
+However,
+if the specified driver is \[lq]MathML\[rq],
+the output is MathML markup rather than
+.I @g@troff
+input,
+and
+.I eqnrc
+is not loaded at all.
+.
+The default output device is
+.BR @DEVICE@ .
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @MACRODIR@/\:\%eqnrc
+Initialization file.
+.
+.
+.\" ====================================================================
+.SH "MathML mode limitations"
+.\" ====================================================================
+.
+MathML is designed on the assumption that it cannot know the exact
+physical characteristics of the media and devices on which it will
+be rendered.
+.
+It does not support control of motions and sizes to the same
+degree
+.I @g@troff
+does.
+.
+.
+.IP \[bu] 2n
+.I @g@eqn
+customization parameters have no effect on generated MathML.
+.
+.
+.IP \[bu]
+The
+.BR \%special ,
+.BR up ,
+.BR down ,
+.BR fwd ,
+and
+.B back
+primitives cannot be implemented,
+and yield a MathML \%\[lq]<merror>\[rq] message instead.
+.
+.
+.IP \[bu]
+The
+.B vcenter
+primitive is silently ignored,
+as centering on the math axis is the MathML default.
+.
+.
+.IP \[bu]
+Characters that
+.I @g@eqn
+sets extra large in
+.I troff \" mode
+mode\[em]notably the integral sign\[em]may appear too small and need to
+have their \[lq]<mstyle>\[rq] wrappers adjusted by hand.
+.
+.
+.P
+As in its
+.I troff \" mode
+mode,
+.I @g@eqn
+in MathML mode leaves the
+.B .EQ
+and
+.B .EN
+tokens in place,
+but emits nothing corresponding to
+.B \%delim
+delimiters.
+.
+They can,
+however,
+be recognized as character sequences that begin with \[lq]<math>\[rq],
+end with \[lq]</math>\[rq],
+and do not cross line boundaries.
+.
+.
+.\" ====================================================================
+.SH Caveats
+.\" ====================================================================
+.
+Tokens must be double-quoted in
+.I eqn \" generic
+input if they are not to be recognized as names of macros or primitives,
+or if they are to be interpreted by
+.IR troff . \" generic
+.
+In particular,
+short ones,
+like
+.RB \[lq] pi \[rq]
+and
+.RB \[lq] PI \[rq],
+can collide with
+.I troff \" generic
+identifiers.
+.
+For instance,
+the
+.I eqn \" generic
+command
+.RB \%\[lq]\^ "gfont PI" \^\[rq]
+does not select
+.IR groff 's
+Palatino italic font for the global italic face;
+you must use
+.RB \%\[lq]\^ "gfont \[dq]PI\[dq]" \^\[rq]
+instead.
+.
+.
+.P
+Delimited equations are set at the type size current at the beginning of
+the input line,
+not necessarily that immediately preceding the opening delimiter.
+.
+.
+.P
+Unlike \*[tx],
+.I eqn \" generic
+does not inherently distinguish displayed and inline equation styles;
+see the
+.B smallover
+primitive above.
+.
+However,
+macro packages frequently define
+.B EQ
+and
+.B EN
+macros such that the equation within is displayed.
+.
+These macros may accept arguments permitting the equation to be labeled
+or captioned;
+see the package's documentation.
+.
+.
+.\" ====================================================================
+.SH Bugs
+.\" ====================================================================
+.
+.I eqn \" generic
+abuses terminology\[em]its
+\[lq]equations\[rq]
+can be inequalities,
+bare expressions,
+or unintelligible gibberish.
+.
+But there's no changing it now.
+.
+.
+.P
+In
+.I nroff \" mode
+mode,
+lowercase Greek letters are rendered in roman instead of italic style.
+.
+.
+.P
+In MathML mode,
+the
+.B mark
+and
+.B lineup
+features don't work.
+.
+These could,
+in theory,
+be implemented with \%\[lq]<maligngroup>\[rq] elements.
+.
+.
+.P
+In MathML mode,
+each digit of a numeric literal gets a separate \[lq]<mn>\:</mn>\[rq]
+pair,
+and decimal points are tagged with \[lq]<mo>\:</mo>\[rq].
+.
+This is allowed by the specification,
+but inefficient.
+.
+.
+.\" ====================================================================
+.SH Examples
+.\" ====================================================================
+.
+We first illustrate
+.I @g@eqn
+usage with a trigonometric identity.
+.
+.
+.RS
+.P
+.EX
+\&.EQ
+sin ( alpha + beta ) = sin alpha cos beta + cos alpha sin beta
+\&.EN
+.EE
+.if t \{\
+.
+.
+.P
+.RS
+.EQ
+sin ( alpha + beta ) = sin alpha cos beta + cos alpha sin beta
+.EN
+.RE
+.\}
+.RE
+.
+.
+.P
+It can be convenient to set up delimiters if mathematical content will
+appear frequently in running text.
+.
+.
+.RS
+.P
+.EX
+\&.EQ
+delim $$
+\&.EN
+.
+Having cached a table of logarithms,
+the property $ln ( x y ) = ln x + ln y$ sped calculations.
+.EE
+.if t \{\
+.
+.
+.P
+.RS
+.EQ
+delim $$
+.EN
+.
+Having cached a table of logarithms,
+the property $ln ( x y ) = ln x + ln y$ sped calculations.
+.
+.\" We _must_ shut delimiters back off when serially processing man
+.\" pages, or subsequent documents cannot safely use those characters.
+.EQ
+delim off
+.EN
+.RE
+.\}
+.RE
+.
+.
+.P
+The quadratic formula illustrates use of fractions and radicals,
+and affords an opportunity to use the full space token
+.BR \[ti] .
+.
+.
+.RS
+.P
+.EX
+\&.EQ
+x = { \- b \[ti] \[rs][+\-] \[ti] sqrt { b sup 2 \- 4 a c } } \
+over { 2 a }
+\&.EN
+.EE
+.if t \{\
+.
+.
+.P
+.RS
+.EQ
+x = { - b ~ \[+-] ~ sqrt { b sup 2 - 4 a c } } over { 2 a }
+.EN
+.RE
+.\}
+.RE
+.
+.
+.P
+Alternatively,
+we could define the plus-minus sign as a binary operator.
+.
+Automatic spacing puts 0.06\~em less space on either side of the
+plus-minus than \[ti] does,
+this being the difference between the widths of the
+.B medium_space
+parameter used by binary operators and that of the full space.
+.
+Independently,
+we can define a macro \[lq]frac\[rq] for setting fractions.
+.
+.
+.RS
+.P
+.EX
+\&.EQ
+chartype "binary" \[rs][+\-]
+define frac ! { $1 } over { $2 } !
+x = frac(\- b \[rs][+\-] sqrt { b sup 2 \- 4 a c }, 2 a)
+\&.EN
+.EE
+.if t \{\
+.
+.
+.P
+.RS
+.EQ
+chartype "binary" \[+-]
+define frac ! { $1 } over { $2 } !
+x = frac(- b \[+-] sqrt { b sup 2 - 4 a c }, 2 a)
+.EN
+.RE
+.\}
+.RE
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+\[lq]Typesetting Mathematics\[em]User's Guide\[rq]
+(2nd edition),
+by Brian W.\& Kernighan
+and Lorinda L.\& Cherry,
+1978,
+AT&T Bell Laboratories Computing Science Technical Report No.\& 17.
+.
+.
+.P
+.IR The\~\*[tx]book ,
+by Donald E.\& Knuth,
+1984,
+Addison-Wesley Professional.
+.
+Appendix\~G
+discusses many of the parameters from section \[lq]Customization\[rq]
+above in greater detail.
+.
+.
+.P
+.MR groff_char @MAN7EXT@ ,
+particularly subsections \[lq]Logical symbols\[rq],
+\[lq]Mathematical symbols\[rq],
+and \[lq]Greek glyphs\[rq],
+documents a variety of special character escape sequences useful in
+mathematical typesetting.
+.
+.
+.P
+.MR groff @MAN1EXT@ ,
+.MR @g@troff @MAN1EXT@ ,
+.MR @g@pic @MAN1EXT@ ,
+.MR groff_font @MAN5EXT@
+.
+.
+.\" Clean up.
+.rm tx
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_eqn_1_man_C]
+.do rr *groff_eqn_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" tab-width: 12
+.\" End:
+.\" vim: set filetype=groff tabstop=12 textwidth=72:
diff --git a/src/preproc/eqn/eqn.am b/src/preproc/eqn/eqn.am
new file mode 100644
index 0000000..e32bfb5
--- /dev/null
+++ b/src/preproc/eqn/eqn.am
@@ -0,0 +1,79 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+prefixexecbin_PROGRAMS += eqn
+prefixexecbin_SCRIPTS += neqn
+eqn_CPPFLAGS = \
+ $(AM_CPPFLAGS) \
+ -I $(top_srcdir)/src/preproc/eqn \
+ -I $(top_builddir)/src/preproc/eqn
+eqn_LDADD = $(LIBM) libgroff.a lib/libgnu.a
+eqn_SOURCES = \
+ src/preproc/eqn/main.cpp \
+ src/preproc/eqn/lex.cpp \
+ src/preproc/eqn/box.cpp \
+ src/preproc/eqn/limit.cpp \
+ src/preproc/eqn/list.cpp \
+ src/preproc/eqn/over.cpp \
+ src/preproc/eqn/text.cpp \
+ src/preproc/eqn/script.cpp \
+ src/preproc/eqn/mark.cpp \
+ src/preproc/eqn/other.cpp \
+ src/preproc/eqn/delim.cpp \
+ src/preproc/eqn/sqrt.cpp \
+ src/preproc/eqn/pile.cpp \
+ src/preproc/eqn/special.cpp \
+ src/preproc/eqn/eqn.ypp \
+ src/preproc/eqn/box.h \
+ src/preproc/eqn/pbox.h \
+ src/preproc/eqn/eqn.h
+
+PREFIXMAN1 += src/preproc/eqn/eqn.1 src/preproc/eqn/neqn.1
+EXTRA_DIST += \
+ src/preproc/eqn/TODO \
+ src/preproc/eqn/eqn.1.man \
+ src/preproc/eqn/neqn.1.man \
+ src/preproc/eqn/neqn.sh
+
+# Since eqn_CPPFLAGS was set, all .o files have an 'eqn-' prefix.
+src/preproc/eqn/eqn-lex.$(OBJEXT): src/preproc/eqn/eqn.hpp
+
+MAINTAINERCLEANFILES += \
+ src/preproc/eqn/eqn.hpp \
+ src/preproc/eqn/eqn.cpp \
+ src/preproc/eqn/eqn.output
+
+neqn: $(top_srcdir)/src/preproc/eqn/neqn.sh $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)sed -e 's/[@]g[@]/$(g)/g' \
+ -f $(SH_DEPS_SED_SCRIPT) \
+ -e $(SH_SCRIPT_SED_CMD) \
+ $(top_srcdir)/src/preproc/eqn/neqn.sh \
+ >$@.tmp \
+ && chmod +x $@.tmp \
+ && mv $@.tmp $@
+
+eqn_TESTS = \
+ src/preproc/eqn/tests/diagnostics-report-correct-line-numbers.sh
+TESTS += $(eqn_TESTS)
+EXTRA_DIST += $(eqn_TESTS)
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/preproc/eqn/eqn.cpp b/src/preproc/eqn/eqn.cpp
new file mode 100644
index 0000000..6756b9e
--- /dev/null
+++ b/src/preproc/eqn/eqn.cpp
@@ -0,0 +1,2112 @@
+/* A Bison parser, made by GNU Bison 3.8.2. */
+
+/* Bison implementation for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 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, see <https://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+ simplifying the original so-called "semantic" parser. */
+
+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+ especially those whose name start with YY_ or yy_. They are
+ private implementation details that can be changed or removed. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+/* Identify Bison output, and Bison version. */
+#define YYBISON 30802
+
+/* Bison version string. */
+#define YYBISON_VERSION "3.8.2"
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers. */
+#define YYPURE 0
+
+/* Push parsers. */
+#define YYPUSH 0
+
+/* Pull parsers. */
+#define YYPULL 1
+
+
+
+
+/* First part of user prologue. */
+#line 18 "../src/preproc/eqn/eqn.ypp"
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "lib.h"
+#include "box.h"
+extern int non_empty_flag;
+int yylex();
+void yyerror(const char *);
+
+#line 87 "src/preproc/eqn/eqn.cpp"
+
+# ifndef YY_CAST
+# ifdef __cplusplus
+# define YY_CAST(Type, Val) static_cast<Type> (Val)
+# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast<Type> (Val)
+# else
+# define YY_CAST(Type, Val) ((Type) (Val))
+# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val))
+# endif
+# endif
+# ifndef YY_NULLPTR
+# if defined __cplusplus
+# if 201103L <= __cplusplus
+# define YY_NULLPTR nullptr
+# else
+# define YY_NULLPTR 0
+# endif
+# else
+# define YY_NULLPTR ((void*)0)
+# endif
+# endif
+
+/* Use api.header.include to #include this header
+ instead of duplicating it here. */
+#ifndef YY_YY_SRC_PREPROC_EQN_EQN_HPP_INCLUDED
+# define YY_YY_SRC_PREPROC_EQN_EQN_HPP_INCLUDED
+/* Debug traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int yydebug;
+#endif
+
+/* Token kinds. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ enum yytokentype
+ {
+ YYEMPTY = -2,
+ YYEOF = 0, /* "end of file" */
+ YYerror = 256, /* error */
+ YYUNDEF = 257, /* "invalid token" */
+ OVER = 258, /* OVER */
+ SMALLOVER = 259, /* SMALLOVER */
+ SQRT = 260, /* SQRT */
+ SUB = 261, /* SUB */
+ SUP = 262, /* SUP */
+ LPILE = 263, /* LPILE */
+ RPILE = 264, /* RPILE */
+ CPILE = 265, /* CPILE */
+ PILE = 266, /* PILE */
+ LEFT = 267, /* LEFT */
+ RIGHT = 268, /* RIGHT */
+ TO = 269, /* TO */
+ FROM = 270, /* FROM */
+ SIZE = 271, /* SIZE */
+ FONT = 272, /* FONT */
+ ROMAN = 273, /* ROMAN */
+ BOLD = 274, /* BOLD */
+ ITALIC = 275, /* ITALIC */
+ FAT = 276, /* FAT */
+ ACCENT = 277, /* ACCENT */
+ BAR = 278, /* BAR */
+ UNDER = 279, /* UNDER */
+ ABOVE = 280, /* ABOVE */
+ TEXT = 281, /* TEXT */
+ QUOTED_TEXT = 282, /* QUOTED_TEXT */
+ FWD = 283, /* FWD */
+ BACK = 284, /* BACK */
+ DOWN = 285, /* DOWN */
+ UP = 286, /* UP */
+ MATRIX = 287, /* MATRIX */
+ COL = 288, /* COL */
+ LCOL = 289, /* LCOL */
+ RCOL = 290, /* RCOL */
+ CCOL = 291, /* CCOL */
+ MARK = 292, /* MARK */
+ LINEUP = 293, /* LINEUP */
+ TYPE = 294, /* TYPE */
+ VCENTER = 295, /* VCENTER */
+ PRIME = 296, /* PRIME */
+ SPLIT = 297, /* SPLIT */
+ NOSPLIT = 298, /* NOSPLIT */
+ UACCENT = 299, /* UACCENT */
+ SPECIAL = 300, /* SPECIAL */
+ SPACE = 301, /* SPACE */
+ GFONT = 302, /* GFONT */
+ GSIZE = 303, /* GSIZE */
+ DEFINE = 304, /* DEFINE */
+ NDEFINE = 305, /* NDEFINE */
+ TDEFINE = 306, /* TDEFINE */
+ SDEFINE = 307, /* SDEFINE */
+ UNDEF = 308, /* UNDEF */
+ IFDEF = 309, /* IFDEF */
+ INCLUDE = 310, /* INCLUDE */
+ DELIM = 311, /* DELIM */
+ CHARTYPE = 312, /* CHARTYPE */
+ SET = 313, /* SET */
+ GRFONT = 314, /* GRFONT */
+ GBFONT = 315 /* GBFONT */
+ };
+ typedef enum yytokentype yytoken_kind_t;
+#endif
+/* Token kinds. */
+#define YYEMPTY -2
+#define YYEOF 0
+#define YYerror 256
+#define YYUNDEF 257
+#define OVER 258
+#define SMALLOVER 259
+#define SQRT 260
+#define SUB 261
+#define SUP 262
+#define LPILE 263
+#define RPILE 264
+#define CPILE 265
+#define PILE 266
+#define LEFT 267
+#define RIGHT 268
+#define TO 269
+#define FROM 270
+#define SIZE 271
+#define FONT 272
+#define ROMAN 273
+#define BOLD 274
+#define ITALIC 275
+#define FAT 276
+#define ACCENT 277
+#define BAR 278
+#define UNDER 279
+#define ABOVE 280
+#define TEXT 281
+#define QUOTED_TEXT 282
+#define FWD 283
+#define BACK 284
+#define DOWN 285
+#define UP 286
+#define MATRIX 287
+#define COL 288
+#define LCOL 289
+#define RCOL 290
+#define CCOL 291
+#define MARK 292
+#define LINEUP 293
+#define TYPE 294
+#define VCENTER 295
+#define PRIME 296
+#define SPLIT 297
+#define NOSPLIT 298
+#define UACCENT 299
+#define SPECIAL 300
+#define SPACE 301
+#define GFONT 302
+#define GSIZE 303
+#define DEFINE 304
+#define NDEFINE 305
+#define TDEFINE 306
+#define SDEFINE 307
+#define UNDEF 308
+#define IFDEF 309
+#define INCLUDE 310
+#define DELIM 311
+#define CHARTYPE 312
+#define SET 313
+#define GRFONT 314
+#define GBFONT 315
+
+/* Value type. */
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+union YYSTYPE
+{
+#line 34 "../src/preproc/eqn/eqn.ypp"
+
+ char *str;
+ box *b;
+ pile_box *pb;
+ matrix_box *mb;
+ int n;
+ column *col;
+
+#line 269 "src/preproc/eqn/eqn.cpp"
+
+};
+typedef union YYSTYPE YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+extern YYSTYPE yylval;
+
+
+int yyparse (void);
+
+
+#endif /* !YY_YY_SRC_PREPROC_EQN_EQN_HPP_INCLUDED */
+/* Symbol kind. */
+enum yysymbol_kind_t
+{
+ YYSYMBOL_YYEMPTY = -2,
+ YYSYMBOL_YYEOF = 0, /* "end of file" */
+ YYSYMBOL_YYerror = 1, /* error */
+ YYSYMBOL_YYUNDEF = 2, /* "invalid token" */
+ YYSYMBOL_OVER = 3, /* OVER */
+ YYSYMBOL_SMALLOVER = 4, /* SMALLOVER */
+ YYSYMBOL_SQRT = 5, /* SQRT */
+ YYSYMBOL_SUB = 6, /* SUB */
+ YYSYMBOL_SUP = 7, /* SUP */
+ YYSYMBOL_LPILE = 8, /* LPILE */
+ YYSYMBOL_RPILE = 9, /* RPILE */
+ YYSYMBOL_CPILE = 10, /* CPILE */
+ YYSYMBOL_PILE = 11, /* PILE */
+ YYSYMBOL_LEFT = 12, /* LEFT */
+ YYSYMBOL_RIGHT = 13, /* RIGHT */
+ YYSYMBOL_TO = 14, /* TO */
+ YYSYMBOL_FROM = 15, /* FROM */
+ YYSYMBOL_SIZE = 16, /* SIZE */
+ YYSYMBOL_FONT = 17, /* FONT */
+ YYSYMBOL_ROMAN = 18, /* ROMAN */
+ YYSYMBOL_BOLD = 19, /* BOLD */
+ YYSYMBOL_ITALIC = 20, /* ITALIC */
+ YYSYMBOL_FAT = 21, /* FAT */
+ YYSYMBOL_ACCENT = 22, /* ACCENT */
+ YYSYMBOL_BAR = 23, /* BAR */
+ YYSYMBOL_UNDER = 24, /* UNDER */
+ YYSYMBOL_ABOVE = 25, /* ABOVE */
+ YYSYMBOL_TEXT = 26, /* TEXT */
+ YYSYMBOL_QUOTED_TEXT = 27, /* QUOTED_TEXT */
+ YYSYMBOL_FWD = 28, /* FWD */
+ YYSYMBOL_BACK = 29, /* BACK */
+ YYSYMBOL_DOWN = 30, /* DOWN */
+ YYSYMBOL_UP = 31, /* UP */
+ YYSYMBOL_MATRIX = 32, /* MATRIX */
+ YYSYMBOL_COL = 33, /* COL */
+ YYSYMBOL_LCOL = 34, /* LCOL */
+ YYSYMBOL_RCOL = 35, /* RCOL */
+ YYSYMBOL_CCOL = 36, /* CCOL */
+ YYSYMBOL_MARK = 37, /* MARK */
+ YYSYMBOL_LINEUP = 38, /* LINEUP */
+ YYSYMBOL_TYPE = 39, /* TYPE */
+ YYSYMBOL_VCENTER = 40, /* VCENTER */
+ YYSYMBOL_PRIME = 41, /* PRIME */
+ YYSYMBOL_SPLIT = 42, /* SPLIT */
+ YYSYMBOL_NOSPLIT = 43, /* NOSPLIT */
+ YYSYMBOL_UACCENT = 44, /* UACCENT */
+ YYSYMBOL_SPECIAL = 45, /* SPECIAL */
+ YYSYMBOL_SPACE = 46, /* SPACE */
+ YYSYMBOL_GFONT = 47, /* GFONT */
+ YYSYMBOL_GSIZE = 48, /* GSIZE */
+ YYSYMBOL_DEFINE = 49, /* DEFINE */
+ YYSYMBOL_NDEFINE = 50, /* NDEFINE */
+ YYSYMBOL_TDEFINE = 51, /* TDEFINE */
+ YYSYMBOL_SDEFINE = 52, /* SDEFINE */
+ YYSYMBOL_UNDEF = 53, /* UNDEF */
+ YYSYMBOL_IFDEF = 54, /* IFDEF */
+ YYSYMBOL_INCLUDE = 55, /* INCLUDE */
+ YYSYMBOL_DELIM = 56, /* DELIM */
+ YYSYMBOL_CHARTYPE = 57, /* CHARTYPE */
+ YYSYMBOL_SET = 58, /* SET */
+ YYSYMBOL_GRFONT = 59, /* GRFONT */
+ YYSYMBOL_GBFONT = 60, /* GBFONT */
+ YYSYMBOL_61_ = 61, /* '^' */
+ YYSYMBOL_62_ = 62, /* '~' */
+ YYSYMBOL_63_t_ = 63, /* '\t' */
+ YYSYMBOL_64_ = 64, /* '{' */
+ YYSYMBOL_65_ = 65, /* '}' */
+ YYSYMBOL_YYACCEPT = 66, /* $accept */
+ YYSYMBOL_top = 67, /* top */
+ YYSYMBOL_equation = 68, /* equation */
+ YYSYMBOL_mark = 69, /* mark */
+ YYSYMBOL_from_to = 70, /* from_to */
+ YYSYMBOL_sqrt_over = 71, /* sqrt_over */
+ YYSYMBOL_script = 72, /* script */
+ YYSYMBOL_nonsup = 73, /* nonsup */
+ YYSYMBOL_simple = 74, /* simple */
+ YYSYMBOL_number = 75, /* number */
+ YYSYMBOL_pile_element_list = 76, /* pile_element_list */
+ YYSYMBOL_pile_arg = 77, /* pile_arg */
+ YYSYMBOL_column_list = 78, /* column_list */
+ YYSYMBOL_column_element_list = 79, /* column_element_list */
+ YYSYMBOL_column_arg = 80, /* column_arg */
+ YYSYMBOL_column = 81, /* column */
+ YYSYMBOL_text = 82, /* text */
+ YYSYMBOL_delim = 83 /* delim */
+};
+typedef enum yysymbol_kind_t yysymbol_kind_t;
+
+
+
+
+#ifdef short
+# undef short
+#endif
+
+/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure
+ <limits.h> and (if available) <stdint.h> are included
+ so that the code can choose integer types of a good width. */
+
+#ifndef __PTRDIFF_MAX__
+# include <limits.h> /* INFRINGES ON USER NAME SPACE */
+# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+# include <stdint.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_STDINT_H
+# endif
+#endif
+
+/* Narrow types that promote to a signed type and that can represent a
+ signed or unsigned integer of at least N bits. In tables they can
+ save space and decrease cache pressure. Promoting to a signed type
+ helps avoid bugs in integer arithmetic. */
+
+#ifdef __INT_LEAST8_MAX__
+typedef __INT_LEAST8_TYPE__ yytype_int8;
+#elif defined YY_STDINT_H
+typedef int_least8_t yytype_int8;
+#else
+typedef signed char yytype_int8;
+#endif
+
+#ifdef __INT_LEAST16_MAX__
+typedef __INT_LEAST16_TYPE__ yytype_int16;
+#elif defined YY_STDINT_H
+typedef int_least16_t yytype_int16;
+#else
+typedef short yytype_int16;
+#endif
+
+/* Work around bug in HP-UX 11.23, which defines these macros
+ incorrectly for preprocessor constants. This workaround can likely
+ be removed in 2023, as HPE has promised support for HP-UX 11.23
+ (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of
+ <https://h20195.www2.hpe.com/V2/getpdf.aspx/4AA4-7673ENW.pdf>. */
+#ifdef __hpux
+# undef UINT_LEAST8_MAX
+# undef UINT_LEAST16_MAX
+# define UINT_LEAST8_MAX 255
+# define UINT_LEAST16_MAX 65535
+#endif
+
+#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST8_TYPE__ yytype_uint8;
+#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \
+ && UINT_LEAST8_MAX <= INT_MAX)
+typedef uint_least8_t yytype_uint8;
+#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX
+typedef unsigned char yytype_uint8;
+#else
+typedef short yytype_uint8;
+#endif
+
+#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST16_TYPE__ yytype_uint16;
+#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \
+ && UINT_LEAST16_MAX <= INT_MAX)
+typedef uint_least16_t yytype_uint16;
+#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX
+typedef unsigned short yytype_uint16;
+#else
+typedef int yytype_uint16;
+#endif
+
+#ifndef YYPTRDIFF_T
+# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__
+# define YYPTRDIFF_T __PTRDIFF_TYPE__
+# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__
+# elif defined PTRDIFF_MAX
+# ifndef ptrdiff_t
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# endif
+# define YYPTRDIFF_T ptrdiff_t
+# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX
+# else
+# define YYPTRDIFF_T long
+# define YYPTRDIFF_MAXIMUM LONG_MAX
+# endif
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+# define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+# define YYSIZE_T size_t
+# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# else
+# define YYSIZE_T unsigned
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM \
+ YY_CAST (YYPTRDIFF_T, \
+ (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \
+ ? YYPTRDIFF_MAXIMUM \
+ : YY_CAST (YYSIZE_T, -1)))
+
+#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))
+
+
+/* Stored state numbers (used for stacks). */
+typedef yytype_uint8 yy_state_t;
+
+/* State numbers in computations. */
+typedef int yy_state_fast_t;
+
+#ifndef YY_
+# if defined YYENABLE_NLS && YYENABLE_NLS
+# if ENABLE_NLS
+# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_(Msgid) dgettext ("bison-runtime", Msgid)
+# endif
+# endif
+# ifndef YY_
+# define YY_(Msgid) Msgid
+# endif
+#endif
+
+
+#ifndef YY_ATTRIBUTE_PURE
+# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
+# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+# define YY_ATTRIBUTE_PURE
+# endif
+#endif
+
+#ifndef YY_ATTRIBUTE_UNUSED
+# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
+# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+# else
+# define YY_ATTRIBUTE_UNUSED
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E. */
+#if ! defined lint || defined __GNUC__
+# define YY_USE(E) ((void) (E))
+#else
+# define YY_USE(E) /* empty */
+#endif
+
+/* Suppress an incorrect diagnostic about yylval being uninitialized. */
+#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__
+# if __GNUC__ * 100 + __GNUC_MINOR__ < 407
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")
+# else
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \
+ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+# endif
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
+ _Pragma ("GCC diagnostic pop")
+#else
+# define YY_INITIAL_VALUE(Value) Value
+#endif
+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END
+#endif
+#ifndef YY_INITIAL_VALUE
+# define YY_INITIAL_VALUE(Value) /* Nothing. */
+#endif
+
+#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__
+# define YY_IGNORE_USELESS_CAST_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"")
+# define YY_IGNORE_USELESS_CAST_END \
+ _Pragma ("GCC diagnostic pop")
+#endif
+#ifndef YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_END
+#endif
+
+
+#define YY_ASSERT(E) ((void) (0 && (E)))
+
+#if !defined yyoverflow
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# ifdef YYSTACK_USE_ALLOCA
+# if YYSTACK_USE_ALLOCA
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# elif defined __BUILTIN_VA_ARG_INCR
+# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+# elif defined _AIX
+# define YYSTACK_ALLOC __alloca
+# elif defined _MSC_VER
+# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+# define alloca _alloca
+# else
+# define YYSTACK_ALLOC alloca
+# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+ /* Use EXIT_SUCCESS as a witness for stdlib.h. */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's 'empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# ifndef YYSTACK_ALLOC_MAXIMUM
+ /* The OS might guarantee only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
+ to allow for a few compiler-allocated temporary stack slots. */
+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+# endif
+# else
+# define YYSTACK_ALLOC YYMALLOC
+# define YYSTACK_FREE YYFREE
+# ifndef YYSTACK_ALLOC_MAXIMUM
+# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+# endif
+# if (defined __cplusplus && ! defined EXIT_SUCCESS \
+ && ! ((defined YYMALLOC || defined malloc) \
+ && (defined YYFREE || defined free)))
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# ifndef YYMALLOC
+# define YYMALLOC malloc
+# if ! defined malloc && ! defined EXIT_SUCCESS
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# ifndef YYFREE
+# define YYFREE free
+# if ! defined free && ! defined EXIT_SUCCESS
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# endif
+#endif /* !defined yyoverflow */
+
+#if (! defined yyoverflow \
+ && (! defined __cplusplus \
+ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ yy_state_t yyss_alloc;
+ YYSTYPE yyvs_alloc;
+};
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# define YYSTACK_BYTES(N) \
+ ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
+
+# define YYCOPY_NEEDED 1
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
+ do \
+ { \
+ YYPTRDIFF_T yynewbytes; \
+ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
+ Stack = &yyptr->Stack_alloc; \
+ yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / YYSIZEOF (*yyptr); \
+ } \
+ while (0)
+
+#endif
+
+#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
+/* Copy COUNT objects from SRC to DST. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if defined __GNUC__ && 1 < __GNUC__
+# define YYCOPY(Dst, Src, Count) \
+ __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src)))
+# else
+# define YYCOPY(Dst, Src, Count) \
+ do \
+ { \
+ YYPTRDIFF_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (Dst)[yyi] = (Src)[yyi]; \
+ } \
+ while (0)
+# endif
+# endif
+#endif /* !YYCOPY_NEEDED */
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 72
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 379
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 66
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 18
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 75
+/* YYNSTATES -- Number of states. */
+#define YYNSTATES 142
+
+/* YYMAXUTOK -- Last valid token kind. */
+#define YYMAXUTOK 315
+
+
+/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
+ as returned by yylex, with out-of-bounds checking. */
+#define YYTRANSLATE(YYX) \
+ (0 <= (YYX) && (YYX) <= YYMAXUTOK \
+ ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \
+ : YYSYMBOL_YYUNDEF)
+
+/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
+ as returned by yylex. */
+static const yytype_int8 yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 63,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 61, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 64, 2, 65, 62, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
+ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
+ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
+ 55, 56, 57, 58, 59, 60
+};
+
+#if YYDEBUG
+/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
+static const yytype_int16 yyrline[] =
+{
+ 0, 125, 125, 127, 132, 134, 145, 147, 149, 154,
+ 156, 158, 160, 162, 167, 169, 171, 173, 178, 180,
+ 185, 187, 189, 194, 196, 198, 200, 202, 204, 206,
+ 208, 210, 212, 214, 216, 218, 220, 222, 224, 226,
+ 228, 230, 232, 234, 236, 238, 240, 242, 244, 246,
+ 248, 250, 252, 254, 256, 258, 263, 273, 275, 280,
+ 282, 287, 289, 294, 296, 301, 303, 308, 310, 312,
+ 314, 318, 320, 325, 327, 329
+};
+#endif
+
+/** Accessing symbol of state STATE. */
+#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State])
+
+#if YYDEBUG || 0
+/* The user-facing name of the symbol whose (internal) number is
+ YYSYMBOL. No bounds checking. */
+static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
+
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+ "\"end of file\"", "error", "\"invalid token\"", "OVER", "SMALLOVER",
+ "SQRT", "SUB", "SUP", "LPILE", "RPILE", "CPILE", "PILE", "LEFT", "RIGHT",
+ "TO", "FROM", "SIZE", "FONT", "ROMAN", "BOLD", "ITALIC", "FAT", "ACCENT",
+ "BAR", "UNDER", "ABOVE", "TEXT", "QUOTED_TEXT", "FWD", "BACK", "DOWN",
+ "UP", "MATRIX", "COL", "LCOL", "RCOL", "CCOL", "MARK", "LINEUP", "TYPE",
+ "VCENTER", "PRIME", "SPLIT", "NOSPLIT", "UACCENT", "SPECIAL", "SPACE",
+ "GFONT", "GSIZE", "DEFINE", "NDEFINE", "TDEFINE", "SDEFINE", "UNDEF",
+ "IFDEF", "INCLUDE", "DELIM", "CHARTYPE", "SET", "GRFONT", "GBFONT",
+ "'^'", "'~'", "'\\t'", "'{'", "'}'", "$accept", "top", "equation",
+ "mark", "from_to", "sqrt_over", "script", "nonsup", "simple", "number",
+ "pile_element_list", "pile_arg", "column_list", "column_element_list",
+ "column_arg", "column", "text", "delim", YY_NULLPTR
+};
+
+static const char *
+yysymbol_name (yysymbol_kind_t yysymbol)
+{
+ return yytname[yysymbol];
+}
+#endif
+
+#define YYPACT_NINF (-76)
+
+#define yypact_value_is_default(Yyn) \
+ ((Yyn) == YYPACT_NINF)
+
+#define YYTABLE_NINF (-1)
+
+#define yytable_value_is_error(Yyn) \
+ 0
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+static const yytype_int16 yypact[] =
+{
+ 230, 269, 6, 6, 6, 6, 2, 14, 14, 308,
+ 308, 308, 308, -76, -76, 14, 14, 14, 14, -50,
+ 230, 230, 14, 308, 4, 23, 14, -76, -76, -76,
+ 230, 24, 230, -76, -76, 70, -76, -76, 20, -76,
+ -76, -76, 230, -44, -76, -76, -76, -76, -76, -76,
+ -76, -76, 230, 308, 308, 57, 57, 57, 57, 308,
+ 308, 308, 308, 3, -76, -76, 308, 57, -76, -76,
+ 308, 130, -76, -76, 269, 269, 269, 269, 308, 308,
+ 308, -76, -76, -76, 308, 230, -12, 230, 191, 57,
+ 57, 57, 57, 57, 57, 8, 8, 8, 8, 12,
+ -76, 57, 57, -76, -76, -76, -76, 79, -76, 335,
+ -76, -76, -76, 230, -76, -6, 2, 230, 28, -76,
+ -76, -76, -76, -76, -76, 269, 269, 308, 230, -76,
+ -76, 230, -3, 230, -76, -76, -76, 230, -76, -2,
+ 230, -76
+};
+
+/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+ Performed when YYTABLE does not specify something else to do. Zero
+ means the default is an error. */
+static const yytype_int8 yydefact[] =
+{
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 23, 24, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 27, 28, 29,
+ 0, 0, 3, 4, 6, 9, 14, 18, 20, 15,
+ 71, 72, 0, 0, 32, 56, 33, 34, 31, 74,
+ 75, 73, 0, 0, 0, 43, 44, 45, 46, 0,
+ 0, 0, 0, 0, 7, 8, 0, 54, 25, 26,
+ 0, 0, 1, 5, 0, 0, 0, 0, 0, 0,
+ 0, 38, 39, 40, 0, 57, 0, 0, 37, 48,
+ 47, 49, 50, 52, 51, 0, 0, 0, 0, 0,
+ 61, 53, 55, 30, 16, 17, 10, 11, 21, 20,
+ 19, 41, 42, 0, 59, 0, 0, 0, 0, 67,
+ 68, 69, 70, 35, 62, 0, 0, 0, 58, 60,
+ 36, 63, 0, 0, 12, 13, 22, 0, 65, 0,
+ 64, 66
+};
+
+/* YYPGOTO[NTERM-NUM]. */
+static const yytype_int8 yypgoto[] =
+{
+ -76, -76, 0, -17, -75, 1, -67, -13, 46, -7,
+ 9, 13, -76, -47, 22, -4, -1, -29
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yytype_uint8 yydefgoto[] =
+{
+ 0, 31, 85, 33, 34, 35, 36, 37, 38, 43,
+ 86, 44, 99, 132, 119, 100, 45, 52
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule whose
+ number is the opposite. If YYTABLE_NINF, syntax error. */
+static const yytype_uint8 yytable[] =
+{
+ 32, 106, 39, 64, 65, 51, 53, 54, 59, 60,
+ 61, 62, 110, 113, 63, 73, 46, 47, 48, 113,
+ 87, 66, 137, 137, 72, 70, 78, 79, 40, 41,
+ 71, 68, 40, 41, 40, 41, 95, 96, 97, 98,
+ 40, 41, 80, 81, 82, 95, 96, 97, 98, 69,
+ 134, 135, 88, 114, 73, 55, 56, 57, 58, 129,
+ 136, 83, 138, 141, 84, 108, 49, 50, 73, 67,
+ 42, 73, 117, 74, 75, 104, 105, 123, 107, 80,
+ 81, 82, 74, 75, 76, 77, 139, 130, 118, 118,
+ 118, 118, 133, 125, 126, 124, 115, 0, 83, 89,
+ 90, 84, 0, 0, 0, 91, 92, 93, 94, 0,
+ 0, 73, 101, 128, 73, 51, 102, 131, 120, 121,
+ 122, 0, 0, 73, 109, 0, 111, 0, 0, 0,
+ 112, 0, 0, 131, 0, 1, 0, 140, 2, 3,
+ 4, 5, 6, 0, 0, 0, 7, 8, 9, 10,
+ 11, 12, 0, 0, 0, 0, 13, 14, 15, 16,
+ 17, 18, 19, 0, 0, 0, 0, 20, 21, 22,
+ 23, 0, 24, 25, 0, 26, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 27, 28, 29, 30, 103, 1, 0, 0, 2,
+ 3, 4, 5, 6, 116, 0, 0, 7, 8, 9,
+ 10, 11, 12, 0, 0, 0, 0, 13, 14, 15,
+ 16, 17, 18, 19, 0, 0, 0, 0, 20, 21,
+ 22, 23, 0, 24, 25, 1, 26, 0, 2, 3,
+ 4, 5, 6, 0, 0, 0, 7, 8, 9, 10,
+ 11, 12, 27, 28, 29, 30, 13, 14, 15, 16,
+ 17, 18, 19, 0, 0, 0, 0, 20, 21, 22,
+ 23, 0, 24, 25, 1, 26, 0, 2, 3, 4,
+ 5, 6, 0, 0, 0, 7, 8, 9, 10, 11,
+ 12, 27, 28, 29, 30, 13, 14, 15, 16, 17,
+ 18, 19, 0, 0, 0, 0, 0, 0, 22, 23,
+ 0, 24, 25, 0, 26, 0, 2, 3, 4, 5,
+ 6, 0, 0, 0, 7, 8, 9, 10, 11, 12,
+ 27, 28, 29, 30, 13, 14, 15, 16, 17, 18,
+ 19, 78, 127, 0, 0, 0, 0, 22, 23, 0,
+ 24, 25, 0, 26, 0, 0, 0, 80, 81, 82,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 27,
+ 28, 29, 30, 0, 0, 0, 83, 0, 0, 84
+};
+
+static const yytype_int16 yycheck[] =
+{
+ 0, 76, 1, 20, 21, 6, 7, 8, 15, 16,
+ 17, 18, 79, 25, 64, 32, 3, 4, 5, 25,
+ 64, 22, 25, 25, 0, 26, 6, 7, 26, 27,
+ 30, 27, 26, 27, 26, 27, 33, 34, 35, 36,
+ 26, 27, 22, 23, 24, 33, 34, 35, 36, 26,
+ 125, 126, 52, 65, 71, 9, 10, 11, 12, 65,
+ 127, 41, 65, 65, 44, 78, 64, 65, 85, 23,
+ 64, 88, 64, 3, 4, 74, 75, 65, 77, 22,
+ 23, 24, 3, 4, 14, 15, 133, 116, 95, 96,
+ 97, 98, 64, 14, 15, 99, 87, -1, 41, 53,
+ 54, 44, -1, -1, -1, 59, 60, 61, 62, -1,
+ -1, 128, 66, 113, 131, 116, 70, 117, 96, 97,
+ 98, -1, -1, 140, 78, -1, 80, -1, -1, -1,
+ 84, -1, -1, 133, -1, 5, -1, 137, 8, 9,
+ 10, 11, 12, -1, -1, -1, 16, 17, 18, 19,
+ 20, 21, -1, -1, -1, -1, 26, 27, 28, 29,
+ 30, 31, 32, -1, -1, -1, -1, 37, 38, 39,
+ 40, -1, 42, 43, -1, 45, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 61, 62, 63, 64, 65, 5, -1, -1, 8,
+ 9, 10, 11, 12, 13, -1, -1, 16, 17, 18,
+ 19, 20, 21, -1, -1, -1, -1, 26, 27, 28,
+ 29, 30, 31, 32, -1, -1, -1, -1, 37, 38,
+ 39, 40, -1, 42, 43, 5, 45, -1, 8, 9,
+ 10, 11, 12, -1, -1, -1, 16, 17, 18, 19,
+ 20, 21, 61, 62, 63, 64, 26, 27, 28, 29,
+ 30, 31, 32, -1, -1, -1, -1, 37, 38, 39,
+ 40, -1, 42, 43, 5, 45, -1, 8, 9, 10,
+ 11, 12, -1, -1, -1, 16, 17, 18, 19, 20,
+ 21, 61, 62, 63, 64, 26, 27, 28, 29, 30,
+ 31, 32, -1, -1, -1, -1, -1, -1, 39, 40,
+ -1, 42, 43, -1, 45, -1, 8, 9, 10, 11,
+ 12, -1, -1, -1, 16, 17, 18, 19, 20, 21,
+ 61, 62, 63, 64, 26, 27, 28, 29, 30, 31,
+ 32, 6, 7, -1, -1, -1, -1, 39, 40, -1,
+ 42, 43, -1, 45, -1, -1, -1, 22, 23, 24,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 61,
+ 62, 63, 64, -1, -1, -1, 41, -1, -1, 44
+};
+
+/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of
+ state STATE-NUM. */
+static const yytype_int8 yystos[] =
+{
+ 0, 5, 8, 9, 10, 11, 12, 16, 17, 18,
+ 19, 20, 21, 26, 27, 28, 29, 30, 31, 32,
+ 37, 38, 39, 40, 42, 43, 45, 61, 62, 63,
+ 64, 67, 68, 69, 70, 71, 72, 73, 74, 71,
+ 26, 27, 64, 75, 77, 82, 77, 77, 77, 64,
+ 65, 82, 83, 82, 82, 74, 74, 74, 74, 75,
+ 75, 75, 75, 64, 69, 69, 82, 74, 27, 26,
+ 82, 68, 0, 69, 3, 4, 14, 15, 6, 7,
+ 22, 23, 24, 41, 44, 68, 76, 64, 68, 74,
+ 74, 74, 74, 74, 74, 33, 34, 35, 36, 78,
+ 81, 74, 74, 65, 71, 71, 70, 71, 73, 74,
+ 72, 74, 74, 25, 65, 76, 13, 64, 75, 80,
+ 80, 80, 80, 65, 81, 14, 15, 7, 68, 65,
+ 83, 68, 79, 64, 70, 70, 72, 25, 65, 79,
+ 68, 65
+};
+
+/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */
+static const yytype_int8 yyr1[] =
+{
+ 0, 66, 67, 67, 68, 68, 69, 69, 69, 70,
+ 70, 70, 70, 70, 71, 71, 71, 71, 72, 72,
+ 73, 73, 73, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 75, 76, 76, 77,
+ 77, 78, 78, 79, 79, 80, 80, 81, 81, 81,
+ 81, 82, 82, 83, 83, 83
+};
+
+/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */
+static const yytype_int8 yyr2[] =
+{
+ 0, 2, 0, 1, 1, 2, 1, 2, 2, 1,
+ 3, 3, 5, 5, 1, 2, 3, 3, 1, 3,
+ 1, 3, 5, 1, 1, 2, 2, 1, 1, 1,
+ 3, 2, 2, 2, 2, 4, 5, 3, 2, 2,
+ 2, 3, 3, 2, 2, 2, 2, 3, 3, 3,
+ 3, 3, 3, 3, 2, 3, 1, 1, 3, 3,
+ 4, 1, 2, 1, 3, 3, 4, 2, 2, 2,
+ 2, 1, 1, 1, 1, 1
+};
+
+
+enum { YYENOMEM = -2 };
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrorlab
+#define YYNOMEM goto yyexhaustedlab
+
+
+#define YYRECOVERING() (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value) \
+ do \
+ if (yychar == YYEMPTY) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ YYPOPSTACK (yylen); \
+ yystate = *yyssp; \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror (YY_("syntax error: cannot back up")); \
+ YYERROR; \
+ } \
+ while (0)
+
+/* Backward compatibility with an undocumented macro.
+ Use YYerror or YYUNDEF. */
+#define YYERRCODE YYUNDEF
+
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (0)
+
+
+
+
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yy_symbol_print (stderr, \
+ Kind, Value); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (0)
+
+
+/*-----------------------------------.
+| Print this symbol's value on YYO. |
+`-----------------------------------*/
+
+static void
+yy_symbol_value_print (FILE *yyo,
+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep)
+{
+ FILE *yyoutput = yyo;
+ YY_USE (yyoutput);
+ if (!yyvaluep)
+ return;
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YY_USE (yykind);
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+/*---------------------------.
+| Print this symbol on YYO. |
+`---------------------------*/
+
+static void
+yy_symbol_print (FILE *yyo,
+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep)
+{
+ YYFPRINTF (yyo, "%s %s (",
+ yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind));
+
+ yy_symbol_value_print (yyo, yykind, yyvaluep);
+ YYFPRINTF (yyo, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included). |
+`------------------------------------------------------------------*/
+
+static void
+yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop)
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (; yybottom <= yytop; yybottom++)
+ {
+ int yybot = *yybottom;
+ YYFPRINTF (stderr, " %d", yybot);
+ }
+ YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+
+static void
+yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp,
+ int yyrule)
+{
+ int yylno = yyrline[yyrule];
+ int yynrhs = yyr2[yyrule];
+ int yyi;
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n",
+ yyrule - 1, yylno);
+ /* The symbols being reduced. */
+ for (yyi = 0; yyi < yynrhs; yyi++)
+ {
+ YYFPRINTF (stderr, " $%d = ", yyi + 1);
+ yy_symbol_print (stderr,
+ YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]),
+ &yyvsp[(yyi + 1) - (yynrhs)]);
+ YYFPRINTF (stderr, "\n");
+ }
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (yyssp, yyvsp, Rule); \
+} while (0)
+
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args) ((void) 0)
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+
+
+
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
+
+static void
+yydestruct (const char *yymsg,
+ yysymbol_kind_t yykind, YYSTYPE *yyvaluep)
+{
+ YY_USE (yyvaluep);
+ if (!yymsg)
+ yymsg = "Deleting";
+ YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YY_USE (yykind);
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+/* Lookahead token kind. */
+int yychar;
+
+/* The semantic value of the lookahead symbol. */
+YYSTYPE yylval;
+/* Number of syntax errors so far. */
+int yynerrs;
+
+
+
+
+/*----------.
+| yyparse. |
+`----------*/
+
+int
+yyparse (void)
+{
+ yy_state_fast_t yystate = 0;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus = 0;
+
+ /* Refer to the stacks through separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* Their size. */
+ YYPTRDIFF_T yystacksize = YYINITDEPTH;
+
+ /* The state stack: array, bottom, top. */
+ yy_state_t yyssa[YYINITDEPTH];
+ yy_state_t *yyss = yyssa;
+ yy_state_t *yyssp = yyss;
+
+ /* The semantic value stack: array, bottom, top. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs = yyvsa;
+ YYSTYPE *yyvsp = yyvs;
+
+ int yyn;
+ /* The return value of yyparse. */
+ int yyresult;
+ /* Lookahead symbol kind. */
+ yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY;
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+
+
+
+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
+
+ /* The number of symbols on the RHS of the reduced rule.
+ Keep to zero when no symbol should be popped. */
+ int yylen = 0;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ goto yysetstate;
+
+
+/*------------------------------------------------------------.
+| yynewstate -- push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. So pushing a state here evens the stacks. */
+ yyssp++;
+
+
+/*--------------------------------------------------------------------.
+| yysetstate -- set current state (the top of the stack) to yystate. |
+`--------------------------------------------------------------------*/
+yysetstate:
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+ YY_ASSERT (0 <= yystate && yystate < YYNSTATES);
+ YY_IGNORE_USELESS_CAST_BEGIN
+ *yyssp = YY_CAST (yy_state_t, yystate);
+ YY_IGNORE_USELESS_CAST_END
+ YY_STACK_PRINT (yyss, yyssp);
+
+ if (yyss + yystacksize - 1 <= yyssp)
+#if !defined yyoverflow && !defined YYSTACK_RELOCATE
+ YYNOMEM;
+#else
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYPTRDIFF_T yysize = yyssp - yyss + 1;
+
+# if defined yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ yy_state_t *yyss1 = yyss;
+ YYSTYPE *yyvs1 = yyvs;
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow (YY_("memory exhausted"),
+ &yyss1, yysize * YYSIZEOF (*yyssp),
+ &yyvs1, yysize * YYSIZEOF (*yyvsp),
+ &yystacksize);
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+# else /* defined YYSTACK_RELOCATE */
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+ YYNOMEM;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ yy_state_t *yyss1 = yyss;
+ union yyalloc *yyptr =
+ YY_CAST (union yyalloc *,
+ YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
+ if (! yyptr)
+ YYNOMEM;
+ YYSTACK_RELOCATE (yyss_alloc, yyss);
+ YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+
+ YY_IGNORE_USELESS_CAST_BEGIN
+ YYDPRINTF ((stderr, "Stack size increased to %ld\n",
+ YY_CAST (long, yystacksize)));
+ YY_IGNORE_USELESS_CAST_END
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ YYABORT;
+ }
+#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
+
+
+ if (yystate == YYFINAL)
+ YYACCEPT;
+
+ goto yybackup;
+
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+ /* Do appropriate processing given the current state. Read a
+ lookahead token if we need one and don't already have one. */
+
+ /* First try to decide what to do without reference to lookahead token. */
+ yyn = yypact[yystate];
+ if (yypact_value_is_default (yyn))
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token\n"));
+ yychar = yylex ();
+ }
+
+ if (yychar <= YYEOF)
+ {
+ yychar = YYEOF;
+ yytoken = YYSYMBOL_YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else if (yychar == YYerror)
+ {
+ /* The scanner already issued an error message, process directly
+ to error recovery. But do not keep the error token as
+ lookahead, it is too special and may lead us to an endless
+ loop in error recovery. */
+ yychar = YYUNDEF;
+ yytoken = YYSYMBOL_YYerror;
+ goto yyerrlab1;
+ }
+ else
+ {
+ yytoken = YYTRANSLATE (yychar);
+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+ }
+
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+ goto yydefault;
+ yyn = yytable[yyn];
+ if (yyn <= 0)
+ {
+ if (yytable_value_is_error (yyn))
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ /* Shift the lookahead token. */
+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+ yystate = yyn;
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+ /* Discard the shifted token. */
+ yychar = YYEMPTY;
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ '$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 3: /* top: equation */
+#line 128 "../src/preproc/eqn/eqn.ypp"
+ { (yyvsp[0].b)->top_level(); non_empty_flag = 1; }
+#line 1472 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 4: /* equation: mark */
+#line 133 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = (yyvsp[0].b); }
+#line 1478 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 5: /* equation: equation mark */
+#line 135 "../src/preproc/eqn/eqn.ypp"
+ {
+ list_box *lb = (yyvsp[-1].b)->to_list_box();
+ if (!lb)
+ lb = new list_box((yyvsp[-1].b));
+ lb->append((yyvsp[0].b));
+ (yyval.b) = lb;
+ }
+#line 1490 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 6: /* mark: from_to */
+#line 146 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = (yyvsp[0].b); }
+#line 1496 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 7: /* mark: MARK mark */
+#line 148 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = make_mark_box((yyvsp[0].b)); }
+#line 1502 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 8: /* mark: LINEUP mark */
+#line 150 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = make_lineup_box((yyvsp[0].b)); }
+#line 1508 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 9: /* from_to: sqrt_over */
+#line 155 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = (yyvsp[0].b); }
+#line 1514 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 10: /* from_to: sqrt_over TO from_to */
+#line 157 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = make_limit_box((yyvsp[-2].b), 0, (yyvsp[0].b)); }
+#line 1520 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 11: /* from_to: sqrt_over FROM sqrt_over */
+#line 159 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = make_limit_box((yyvsp[-2].b), (yyvsp[0].b), 0); }
+#line 1526 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 12: /* from_to: sqrt_over FROM sqrt_over TO from_to */
+#line 161 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = make_limit_box((yyvsp[-4].b), (yyvsp[-2].b), (yyvsp[0].b)); }
+#line 1532 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 13: /* from_to: sqrt_over FROM sqrt_over FROM from_to */
+#line 163 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = make_limit_box((yyvsp[-4].b), make_limit_box((yyvsp[-2].b), (yyvsp[0].b), 0), 0); }
+#line 1538 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 14: /* sqrt_over: script */
+#line 168 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = (yyvsp[0].b); }
+#line 1544 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 15: /* sqrt_over: SQRT sqrt_over */
+#line 170 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = make_sqrt_box((yyvsp[0].b)); }
+#line 1550 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 16: /* sqrt_over: sqrt_over OVER sqrt_over */
+#line 172 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = make_over_box((yyvsp[-2].b), (yyvsp[0].b)); }
+#line 1556 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 17: /* sqrt_over: sqrt_over SMALLOVER sqrt_over */
+#line 174 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = make_small_over_box((yyvsp[-2].b), (yyvsp[0].b)); }
+#line 1562 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 18: /* script: nonsup */
+#line 179 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = (yyvsp[0].b); }
+#line 1568 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 19: /* script: simple SUP script */
+#line 181 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = make_script_box((yyvsp[-2].b), 0, (yyvsp[0].b)); }
+#line 1574 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 20: /* nonsup: simple */
+#line 186 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = (yyvsp[0].b); }
+#line 1580 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 21: /* nonsup: simple SUB nonsup */
+#line 188 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = make_script_box((yyvsp[-2].b), (yyvsp[0].b), 0); }
+#line 1586 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 22: /* nonsup: simple SUB simple SUP script */
+#line 190 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = make_script_box((yyvsp[-4].b), (yyvsp[-2].b), (yyvsp[0].b)); }
+#line 1592 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 23: /* simple: TEXT */
+#line 195 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = split_text((yyvsp[0].str)); }
+#line 1598 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 24: /* simple: QUOTED_TEXT */
+#line 197 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = new quoted_text_box((yyvsp[0].str)); }
+#line 1604 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 25: /* simple: SPLIT QUOTED_TEXT */
+#line 199 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = split_text((yyvsp[0].str)); }
+#line 1610 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 26: /* simple: NOSPLIT TEXT */
+#line 201 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = new quoted_text_box((yyvsp[0].str)); }
+#line 1616 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 27: /* simple: '^' */
+#line 203 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = new half_space_box; }
+#line 1622 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 28: /* simple: '~' */
+#line 205 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = new space_box; }
+#line 1628 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 29: /* simple: '\t' */
+#line 207 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = new tab_box; }
+#line 1634 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 30: /* simple: '{' equation '}' */
+#line 209 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = (yyvsp[-1].b); }
+#line 1640 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 31: /* simple: PILE pile_arg */
+#line 211 "../src/preproc/eqn/eqn.ypp"
+ { (yyvsp[0].pb)->set_alignment(CENTER_ALIGN); (yyval.b) = (yyvsp[0].pb); }
+#line 1646 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 32: /* simple: LPILE pile_arg */
+#line 213 "../src/preproc/eqn/eqn.ypp"
+ { (yyvsp[0].pb)->set_alignment(LEFT_ALIGN); (yyval.b) = (yyvsp[0].pb); }
+#line 1652 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 33: /* simple: RPILE pile_arg */
+#line 215 "../src/preproc/eqn/eqn.ypp"
+ { (yyvsp[0].pb)->set_alignment(RIGHT_ALIGN); (yyval.b) = (yyvsp[0].pb); }
+#line 1658 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 34: /* simple: CPILE pile_arg */
+#line 217 "../src/preproc/eqn/eqn.ypp"
+ { (yyvsp[0].pb)->set_alignment(CENTER_ALIGN); (yyval.b) = (yyvsp[0].pb); }
+#line 1664 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 35: /* simple: MATRIX '{' column_list '}' */
+#line 219 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = (yyvsp[-1].mb); }
+#line 1670 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 36: /* simple: LEFT delim equation RIGHT delim */
+#line 221 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = make_delim_box((yyvsp[-3].str), (yyvsp[-2].b), (yyvsp[0].str)); }
+#line 1676 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 37: /* simple: LEFT delim equation */
+#line 223 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = make_delim_box((yyvsp[-1].str), (yyvsp[0].b), 0); }
+#line 1682 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 38: /* simple: simple BAR */
+#line 225 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = make_overline_box((yyvsp[-1].b)); }
+#line 1688 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 39: /* simple: simple UNDER */
+#line 227 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = make_underline_box((yyvsp[-1].b)); }
+#line 1694 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 40: /* simple: simple PRIME */
+#line 229 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = make_prime_box((yyvsp[-1].b)); }
+#line 1700 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 41: /* simple: simple ACCENT simple */
+#line 231 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = make_accent_box((yyvsp[-2].b), (yyvsp[0].b)); }
+#line 1706 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 42: /* simple: simple UACCENT simple */
+#line 233 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = make_uaccent_box((yyvsp[-2].b), (yyvsp[0].b)); }
+#line 1712 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 43: /* simple: ROMAN simple */
+#line 235 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = new font_box(strsave(get_grfont()), (yyvsp[0].b)); }
+#line 1718 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 44: /* simple: BOLD simple */
+#line 237 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = new font_box(strsave(get_gbfont()), (yyvsp[0].b)); }
+#line 1724 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 45: /* simple: ITALIC simple */
+#line 239 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = new font_box(strsave(get_gfont()), (yyvsp[0].b)); }
+#line 1730 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 46: /* simple: FAT simple */
+#line 241 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = new fat_box((yyvsp[0].b)); }
+#line 1736 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 47: /* simple: FONT text simple */
+#line 243 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = new font_box((yyvsp[-1].str), (yyvsp[0].b)); }
+#line 1742 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 48: /* simple: SIZE text simple */
+#line 245 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = new size_box((yyvsp[-1].str), (yyvsp[0].b)); }
+#line 1748 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 49: /* simple: FWD number simple */
+#line 247 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = new hmotion_box((yyvsp[-1].n), (yyvsp[0].b)); }
+#line 1754 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 50: /* simple: BACK number simple */
+#line 249 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = new hmotion_box(-(yyvsp[-1].n), (yyvsp[0].b)); }
+#line 1760 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 51: /* simple: UP number simple */
+#line 251 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = new vmotion_box((yyvsp[-1].n), (yyvsp[0].b)); }
+#line 1766 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 52: /* simple: DOWN number simple */
+#line 253 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = new vmotion_box(-(yyvsp[-1].n), (yyvsp[0].b)); }
+#line 1772 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 53: /* simple: TYPE text simple */
+#line 255 "../src/preproc/eqn/eqn.ypp"
+ { (yyvsp[0].b)->set_spacing_type((yyvsp[-1].str)); (yyval.b) = (yyvsp[0].b); }
+#line 1778 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 54: /* simple: VCENTER simple */
+#line 257 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = new vcenter_box((yyvsp[0].b)); }
+#line 1784 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 55: /* simple: SPECIAL text simple */
+#line 259 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.b) = make_special_box((yyvsp[-1].str), (yyvsp[0].b)); }
+#line 1790 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 56: /* number: text */
+#line 264 "../src/preproc/eqn/eqn.ypp"
+ {
+ int n;
+ if (sscanf((yyvsp[0].str), "%d", &n) == 1)
+ (yyval.n) = n;
+ delete[] (yyvsp[0].str);
+ }
+#line 1801 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 57: /* pile_element_list: equation */
+#line 274 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.pb) = new pile_box((yyvsp[0].b)); }
+#line 1807 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 58: /* pile_element_list: pile_element_list ABOVE equation */
+#line 276 "../src/preproc/eqn/eqn.ypp"
+ { (yyvsp[-2].pb)->append((yyvsp[0].b)); (yyval.pb) = (yyvsp[-2].pb); }
+#line 1813 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 59: /* pile_arg: '{' pile_element_list '}' */
+#line 281 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.pb) = (yyvsp[-1].pb); }
+#line 1819 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 60: /* pile_arg: number '{' pile_element_list '}' */
+#line 283 "../src/preproc/eqn/eqn.ypp"
+ { (yyvsp[-1].pb)->set_space((yyvsp[-3].n)); (yyval.pb) = (yyvsp[-1].pb); }
+#line 1825 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 61: /* column_list: column */
+#line 288 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.mb) = new matrix_box((yyvsp[0].col)); }
+#line 1831 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 62: /* column_list: column_list column */
+#line 290 "../src/preproc/eqn/eqn.ypp"
+ { (yyvsp[-1].mb)->append((yyvsp[0].col)); (yyval.mb) = (yyvsp[-1].mb); }
+#line 1837 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 63: /* column_element_list: equation */
+#line 295 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.col) = new column((yyvsp[0].b)); }
+#line 1843 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 64: /* column_element_list: column_element_list ABOVE equation */
+#line 297 "../src/preproc/eqn/eqn.ypp"
+ { (yyvsp[-2].col)->append((yyvsp[0].b)); (yyval.col) = (yyvsp[-2].col); }
+#line 1849 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 65: /* column_arg: '{' column_element_list '}' */
+#line 302 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.col) = (yyvsp[-1].col); }
+#line 1855 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 66: /* column_arg: number '{' column_element_list '}' */
+#line 304 "../src/preproc/eqn/eqn.ypp"
+ { (yyvsp[-1].col)->set_space((yyvsp[-3].n)); (yyval.col) = (yyvsp[-1].col); }
+#line 1861 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 67: /* column: COL column_arg */
+#line 309 "../src/preproc/eqn/eqn.ypp"
+ { (yyvsp[0].col)->set_alignment(CENTER_ALIGN); (yyval.col) = (yyvsp[0].col); }
+#line 1867 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 68: /* column: LCOL column_arg */
+#line 311 "../src/preproc/eqn/eqn.ypp"
+ { (yyvsp[0].col)->set_alignment(LEFT_ALIGN); (yyval.col) = (yyvsp[0].col); }
+#line 1873 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 69: /* column: RCOL column_arg */
+#line 313 "../src/preproc/eqn/eqn.ypp"
+ { (yyvsp[0].col)->set_alignment(RIGHT_ALIGN); (yyval.col) = (yyvsp[0].col); }
+#line 1879 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 70: /* column: CCOL column_arg */
+#line 315 "../src/preproc/eqn/eqn.ypp"
+ { (yyvsp[0].col)->set_alignment(CENTER_ALIGN); (yyval.col) = (yyvsp[0].col); }
+#line 1885 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 71: /* text: TEXT */
+#line 319 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.str) = (yyvsp[0].str); }
+#line 1891 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 72: /* text: QUOTED_TEXT */
+#line 321 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.str) = (yyvsp[0].str); }
+#line 1897 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 73: /* delim: text */
+#line 326 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.str) = (yyvsp[0].str); }
+#line 1903 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 74: /* delim: '{' */
+#line 328 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.str) = strsave("{"); }
+#line 1909 "src/preproc/eqn/eqn.cpp"
+ break;
+
+ case 75: /* delim: '}' */
+#line 330 "../src/preproc/eqn/eqn.ypp"
+ { (yyval.str) = strsave("}"); }
+#line 1915 "src/preproc/eqn/eqn.cpp"
+ break;
+
+
+#line 1919 "src/preproc/eqn/eqn.cpp"
+
+ default: break;
+ }
+ /* User semantic actions sometimes alter yychar, and that requires
+ that yytoken be updated with the new translation. We take the
+ approach of translating immediately before every use of yytoken.
+ One alternative is translating here after every semantic action,
+ but that translation would be missed if the semantic action invokes
+ YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
+ if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an
+ incorrect destructor might then be invoked immediately. In the
+ case of YYERROR or YYBACKUP, subsequent parser actions might lead
+ to an incorrect destructor call or verbose syntax error message
+ before the lookahead is translated. */
+ YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc);
+
+ YYPOPSTACK (yylen);
+ yylen = 0;
+
+ *++yyvsp = yyval;
+
+ /* Now 'shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+ {
+ const int yylhs = yyr1[yyn] - YYNTOKENS;
+ const int yyi = yypgoto[yylhs] + *yyssp;
+ yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp
+ ? yytable[yyi]
+ : yydefgoto[yylhs]);
+ }
+
+ goto yynewstate;
+
+
+/*--------------------------------------.
+| yyerrlab -- here on detecting error. |
+`--------------------------------------*/
+yyerrlab:
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar);
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+ yyerror (YY_("syntax error"));
+ }
+
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ if (yychar <= YYEOF)
+ {
+ /* Return failure if at end of input. */
+ if (yychar == YYEOF)
+ YYABORT;
+ }
+ else
+ {
+ yydestruct ("Error: discarding",
+ yytoken, &yylval);
+ yychar = YYEMPTY;
+ }
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+ goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR. |
+`---------------------------------------------------*/
+yyerrorlab:
+ /* Pacify compilers when the user code never invokes YYERROR and the
+ label yyerrorlab therefore never appears in user code. */
+ if (0)
+ YYERROR;
+ ++yynerrs;
+
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYERROR. */
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+ yystate = *yyssp;
+ goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR. |
+`-------------------------------------------------------------*/
+yyerrlab1:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ /* Pop stack until we find a state that shifts the error token. */
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (!yypact_value_is_default (yyn))
+ {
+ yyn += YYSYMBOL_YYerror;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
+
+
+ yydestruct ("Error: popping",
+ YY_ACCESSING_SYMBOL (yystate), yyvsp);
+ YYPOPSTACK (1);
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+
+ /* Shift the error token. */
+ YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp);
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturnlab;
+
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturnlab;
+
+
+/*-----------------------------------------------------------.
+| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. |
+`-----------------------------------------------------------*/
+yyexhaustedlab:
+ yyerror (YY_("memory exhausted"));
+ yyresult = 2;
+ goto yyreturnlab;
+
+
+/*----------------------------------------------------------.
+| yyreturnlab -- parsing is finished, clean up and return. |
+`----------------------------------------------------------*/
+yyreturnlab:
+ if (yychar != YYEMPTY)
+ {
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = YYTRANSLATE (yychar);
+ yydestruct ("Cleanup: discarding lookahead",
+ yytoken, &yylval);
+ }
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYABORT or YYACCEPT. */
+ YYPOPSTACK (yylen);
+ YY_STACK_PRINT (yyss, yyssp);
+ while (yyssp != yyss)
+ {
+ yydestruct ("Cleanup: popping",
+ YY_ACCESSING_SYMBOL (+*yyssp), yyvsp);
+ YYPOPSTACK (1);
+ }
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+
+ return yyresult;
+}
+
+#line 333 "../src/preproc/eqn/eqn.ypp"
+
diff --git a/src/preproc/eqn/eqn.h b/src/preproc/eqn/eqn.h
new file mode 100644
index 0000000..a4143cb
--- /dev/null
+++ b/src/preproc/eqn/eqn.h
@@ -0,0 +1,57 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <stdlib.h>
+#include <errno.h>
+#include "cset.h"
+#include "errarg.h"
+#include "error.h"
+
+#include "box.h"
+
+typedef enum {troff, mathml} eqnmode_t;
+
+extern char start_delim;
+extern char end_delim;
+extern int non_empty_flag;
+extern int inline_flag;
+extern int draw_flag;
+extern int one_size_reduction_flag;
+extern int compatible_flag;
+extern int nroff;
+extern eqnmode_t output_format;
+extern int xhtml;
+
+void init_lex(const char *str, const char *filename, int lineno);
+void lex_error(const char *message,
+ const errarg &arg1 = empty_errarg,
+ const errarg &arg2 = empty_errarg,
+ const errarg &arg3 = empty_errarg);
+
+void init_table(const char *device);
+
+// prefix for all registers, strings, macros
+#define PREFIX "0"
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/eqn/eqn.hpp b/src/preproc/eqn/eqn.hpp
new file mode 100644
index 0000000..de02d7c
--- /dev/null
+++ b/src/preproc/eqn/eqn.hpp
@@ -0,0 +1,210 @@
+/* A Bison parser, made by GNU Bison 3.8.2. */
+
+/* Bison interface for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 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, see <https://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+ especially those whose name start with YY_ or yy_. They are
+ private implementation details that can be changed or removed. */
+
+#ifndef YY_YY_SRC_PREPROC_EQN_EQN_HPP_INCLUDED
+# define YY_YY_SRC_PREPROC_EQN_EQN_HPP_INCLUDED
+/* Debug traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int yydebug;
+#endif
+
+/* Token kinds. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ enum yytokentype
+ {
+ YYEMPTY = -2,
+ YYEOF = 0, /* "end of file" */
+ YYerror = 256, /* error */
+ YYUNDEF = 257, /* "invalid token" */
+ OVER = 258, /* OVER */
+ SMALLOVER = 259, /* SMALLOVER */
+ SQRT = 260, /* SQRT */
+ SUB = 261, /* SUB */
+ SUP = 262, /* SUP */
+ LPILE = 263, /* LPILE */
+ RPILE = 264, /* RPILE */
+ CPILE = 265, /* CPILE */
+ PILE = 266, /* PILE */
+ LEFT = 267, /* LEFT */
+ RIGHT = 268, /* RIGHT */
+ TO = 269, /* TO */
+ FROM = 270, /* FROM */
+ SIZE = 271, /* SIZE */
+ FONT = 272, /* FONT */
+ ROMAN = 273, /* ROMAN */
+ BOLD = 274, /* BOLD */
+ ITALIC = 275, /* ITALIC */
+ FAT = 276, /* FAT */
+ ACCENT = 277, /* ACCENT */
+ BAR = 278, /* BAR */
+ UNDER = 279, /* UNDER */
+ ABOVE = 280, /* ABOVE */
+ TEXT = 281, /* TEXT */
+ QUOTED_TEXT = 282, /* QUOTED_TEXT */
+ FWD = 283, /* FWD */
+ BACK = 284, /* BACK */
+ DOWN = 285, /* DOWN */
+ UP = 286, /* UP */
+ MATRIX = 287, /* MATRIX */
+ COL = 288, /* COL */
+ LCOL = 289, /* LCOL */
+ RCOL = 290, /* RCOL */
+ CCOL = 291, /* CCOL */
+ MARK = 292, /* MARK */
+ LINEUP = 293, /* LINEUP */
+ TYPE = 294, /* TYPE */
+ VCENTER = 295, /* VCENTER */
+ PRIME = 296, /* PRIME */
+ SPLIT = 297, /* SPLIT */
+ NOSPLIT = 298, /* NOSPLIT */
+ UACCENT = 299, /* UACCENT */
+ SPECIAL = 300, /* SPECIAL */
+ SPACE = 301, /* SPACE */
+ GFONT = 302, /* GFONT */
+ GSIZE = 303, /* GSIZE */
+ DEFINE = 304, /* DEFINE */
+ NDEFINE = 305, /* NDEFINE */
+ TDEFINE = 306, /* TDEFINE */
+ SDEFINE = 307, /* SDEFINE */
+ UNDEF = 308, /* UNDEF */
+ IFDEF = 309, /* IFDEF */
+ INCLUDE = 310, /* INCLUDE */
+ DELIM = 311, /* DELIM */
+ CHARTYPE = 312, /* CHARTYPE */
+ SET = 313, /* SET */
+ GRFONT = 314, /* GRFONT */
+ GBFONT = 315 /* GBFONT */
+ };
+ typedef enum yytokentype yytoken_kind_t;
+#endif
+/* Token kinds. */
+#define YYEMPTY -2
+#define YYEOF 0
+#define YYerror 256
+#define YYUNDEF 257
+#define OVER 258
+#define SMALLOVER 259
+#define SQRT 260
+#define SUB 261
+#define SUP 262
+#define LPILE 263
+#define RPILE 264
+#define CPILE 265
+#define PILE 266
+#define LEFT 267
+#define RIGHT 268
+#define TO 269
+#define FROM 270
+#define SIZE 271
+#define FONT 272
+#define ROMAN 273
+#define BOLD 274
+#define ITALIC 275
+#define FAT 276
+#define ACCENT 277
+#define BAR 278
+#define UNDER 279
+#define ABOVE 280
+#define TEXT 281
+#define QUOTED_TEXT 282
+#define FWD 283
+#define BACK 284
+#define DOWN 285
+#define UP 286
+#define MATRIX 287
+#define COL 288
+#define LCOL 289
+#define RCOL 290
+#define CCOL 291
+#define MARK 292
+#define LINEUP 293
+#define TYPE 294
+#define VCENTER 295
+#define PRIME 296
+#define SPLIT 297
+#define NOSPLIT 298
+#define UACCENT 299
+#define SPECIAL 300
+#define SPACE 301
+#define GFONT 302
+#define GSIZE 303
+#define DEFINE 304
+#define NDEFINE 305
+#define TDEFINE 306
+#define SDEFINE 307
+#define UNDEF 308
+#define IFDEF 309
+#define INCLUDE 310
+#define DELIM 311
+#define CHARTYPE 312
+#define SET 313
+#define GRFONT 314
+#define GBFONT 315
+
+/* Value type. */
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+union YYSTYPE
+{
+#line 34 "../src/preproc/eqn/eqn.ypp"
+
+ char *str;
+ box *b;
+ pile_box *pb;
+ matrix_box *mb;
+ int n;
+ column *col;
+
+#line 196 "src/preproc/eqn/eqn.hpp"
+
+};
+typedef union YYSTYPE YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+extern YYSTYPE yylval;
+
+
+int yyparse (void);
+
+
+#endif /* !YY_YY_SRC_PREPROC_EQN_EQN_HPP_INCLUDED */
diff --git a/src/preproc/eqn/eqn.ypp b/src/preproc/eqn/eqn.ypp
new file mode 100644
index 0000000..a22ad59
--- /dev/null
+++ b/src/preproc/eqn/eqn.ypp
@@ -0,0 +1,333 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+%{
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "lib.h"
+#include "box.h"
+extern int non_empty_flag;
+int yylex();
+void yyerror(const char *);
+%}
+
+%union {
+ char *str;
+ box *b;
+ pile_box *pb;
+ matrix_box *mb;
+ int n;
+ column *col;
+}
+
+%token OVER
+%token SMALLOVER
+%token SQRT
+%token SUB
+%token SUP
+%token LPILE
+%token RPILE
+%token CPILE
+%token PILE
+%token LEFT
+%token RIGHT
+%token TO
+%token FROM
+%token SIZE
+%token FONT
+%token ROMAN
+%token BOLD
+%token ITALIC
+%token FAT
+%token ACCENT
+%token BAR
+%token UNDER
+%token ABOVE
+%token <str> TEXT
+%token <str> QUOTED_TEXT
+%token FWD
+%token BACK
+%token DOWN
+%token UP
+%token MATRIX
+%token COL
+%token LCOL
+%token RCOL
+%token CCOL
+%token MARK
+%token LINEUP
+%token TYPE
+%token VCENTER
+%token PRIME
+%token SPLIT
+%token NOSPLIT
+%token UACCENT
+%token SPECIAL
+
+/* these are handled in the lexer */
+%token SPACE
+%token GFONT
+%token GSIZE
+%token DEFINE
+%token NDEFINE
+%token TDEFINE
+%token SDEFINE
+%token UNDEF
+%token IFDEF
+%token INCLUDE
+%token DELIM
+%token CHARTYPE
+%token SET
+%token GRFONT
+%token GBFONT
+
+/* The original eqn manual says that 'left' is right associative. It's lying.
+Consider 'left ( ~ left ( ~ right ) right )'. */
+
+%right LEFT
+%left RIGHT
+%right LPILE RPILE CPILE PILE TEXT QUOTED_TEXT MATRIX MARK LINEUP '^' '~' '\t' '{' SPLIT NOSPLIT
+%right FROM TO
+%left SQRT OVER SMALLOVER
+%right SUB SUP
+%right ROMAN BOLD ITALIC FAT FONT SIZE FWD BACK DOWN UP TYPE VCENTER SPECIAL
+%right BAR UNDER PRIME
+%left ACCENT UACCENT
+
+%type <b> mark from_to sqrt_over script simple equation nonsup
+%type <n> number
+%type <str> text delim
+%type <pb> pile_element_list pile_arg
+%type <mb> column_list
+%type <col> column column_arg column_element_list
+
+%%
+top:
+ /* empty */
+ | equation
+ { $1->top_level(); non_empty_flag = 1; }
+ ;
+
+equation:
+ mark
+ { $$ = $1; }
+ | equation mark
+ {
+ list_box *lb = $1->to_list_box();
+ if (!lb)
+ lb = new list_box($1);
+ lb->append($2);
+ $$ = lb;
+ }
+ ;
+
+mark:
+ from_to
+ { $$ = $1; }
+ | MARK mark
+ { $$ = make_mark_box($2); }
+ | LINEUP mark
+ { $$ = make_lineup_box($2); }
+ ;
+
+from_to:
+ sqrt_over %prec FROM
+ { $$ = $1; }
+ | sqrt_over TO from_to
+ { $$ = make_limit_box($1, 0, $3); }
+ | sqrt_over FROM sqrt_over
+ { $$ = make_limit_box($1, $3, 0); }
+ | sqrt_over FROM sqrt_over TO from_to
+ { $$ = make_limit_box($1, $3, $5); }
+ | sqrt_over FROM sqrt_over FROM from_to
+ { $$ = make_limit_box($1, make_limit_box($3, $5, 0), 0); }
+ ;
+
+sqrt_over:
+ script
+ { $$ = $1; }
+ | SQRT sqrt_over
+ { $$ = make_sqrt_box($2); }
+ | sqrt_over OVER sqrt_over
+ { $$ = make_over_box($1, $3); }
+ | sqrt_over SMALLOVER sqrt_over
+ { $$ = make_small_over_box($1, $3); }
+ ;
+
+script:
+ nonsup
+ { $$ = $1; }
+ | simple SUP script
+ { $$ = make_script_box($1, 0, $3); }
+ ;
+
+nonsup:
+ simple %prec SUP
+ { $$ = $1; }
+ | simple SUB nonsup
+ { $$ = make_script_box($1, $3, 0); }
+ | simple SUB simple SUP script
+ { $$ = make_script_box($1, $3, $5); }
+ ;
+
+simple:
+ TEXT
+ { $$ = split_text($1); }
+ | QUOTED_TEXT
+ { $$ = new quoted_text_box($1); }
+ | SPLIT QUOTED_TEXT
+ { $$ = split_text($2); }
+ | NOSPLIT TEXT
+ { $$ = new quoted_text_box($2); }
+ | '^'
+ { $$ = new half_space_box; }
+ | '~'
+ { $$ = new space_box; }
+ | '\t'
+ { $$ = new tab_box; }
+ | '{' equation '}'
+ { $$ = $2; }
+ | PILE pile_arg
+ { $2->set_alignment(CENTER_ALIGN); $$ = $2; }
+ | LPILE pile_arg
+ { $2->set_alignment(LEFT_ALIGN); $$ = $2; }
+ | RPILE pile_arg
+ { $2->set_alignment(RIGHT_ALIGN); $$ = $2; }
+ | CPILE pile_arg
+ { $2->set_alignment(CENTER_ALIGN); $$ = $2; }
+ | MATRIX '{' column_list '}'
+ { $$ = $3; }
+ | LEFT delim equation RIGHT delim
+ { $$ = make_delim_box($2, $3, $5); }
+ | LEFT delim equation
+ { $$ = make_delim_box($2, $3, 0); }
+ | simple BAR
+ { $$ = make_overline_box($1); }
+ | simple UNDER
+ { $$ = make_underline_box($1); }
+ | simple PRIME
+ { $$ = make_prime_box($1); }
+ | simple ACCENT simple
+ { $$ = make_accent_box($1, $3); }
+ | simple UACCENT simple
+ { $$ = make_uaccent_box($1, $3); }
+ | ROMAN simple
+ { $$ = new font_box(strsave(get_grfont()), $2); }
+ | BOLD simple
+ { $$ = new font_box(strsave(get_gbfont()), $2); }
+ | ITALIC simple
+ { $$ = new font_box(strsave(get_gfont()), $2); }
+ | FAT simple
+ { $$ = new fat_box($2); }
+ | FONT text simple
+ { $$ = new font_box($2, $3); }
+ | SIZE text simple
+ { $$ = new size_box($2, $3); }
+ | FWD number simple
+ { $$ = new hmotion_box($2, $3); }
+ | BACK number simple
+ { $$ = new hmotion_box(-$2, $3); }
+ | UP number simple
+ { $$ = new vmotion_box($2, $3); }
+ | DOWN number simple
+ { $$ = new vmotion_box(-$2, $3); }
+ | TYPE text simple
+ { $3->set_spacing_type($2); $$ = $3; }
+ | VCENTER simple
+ { $$ = new vcenter_box($2); }
+ | SPECIAL text simple
+ { $$ = make_special_box($2, $3); }
+ ;
+
+number:
+ text
+ {
+ int n;
+ if (sscanf($1, "%d", &n) == 1)
+ $$ = n;
+ delete[] $1;
+ }
+ ;
+
+pile_element_list:
+ equation
+ { $$ = new pile_box($1); }
+ | pile_element_list ABOVE equation
+ { $1->append($3); $$ = $1; }
+ ;
+
+pile_arg:
+ '{' pile_element_list '}'
+ { $$ = $2; }
+ | number '{' pile_element_list '}'
+ { $3->set_space($1); $$ = $3; }
+ ;
+
+column_list:
+ column
+ { $$ = new matrix_box($1); }
+ | column_list column
+ { $1->append($2); $$ = $1; }
+ ;
+
+column_element_list:
+ equation
+ { $$ = new column($1); }
+ | column_element_list ABOVE equation
+ { $1->append($3); $$ = $1; }
+ ;
+
+column_arg:
+ '{' column_element_list '}'
+ { $$ = $2; }
+ | number '{' column_element_list '}'
+ { $3->set_space($1); $$ = $3; }
+ ;
+
+column:
+ COL column_arg
+ { $2->set_alignment(CENTER_ALIGN); $$ = $2; }
+ | LCOL column_arg
+ { $2->set_alignment(LEFT_ALIGN); $$ = $2; }
+ | RCOL column_arg
+ { $2->set_alignment(RIGHT_ALIGN); $$ = $2; }
+ | CCOL column_arg
+ { $2->set_alignment(CENTER_ALIGN); $$ = $2; }
+ ;
+
+text: TEXT
+ { $$ = $1; }
+ | QUOTED_TEXT
+ { $$ = $1; }
+ ;
+
+delim:
+ text
+ { $$ = $1; }
+ | '{'
+ { $$ = strsave("{"); }
+ | '}'
+ { $$ = strsave("}"); }
+ ;
+
+%%
diff --git a/src/preproc/eqn/lex.cpp b/src/preproc/eqn/lex.cpp
new file mode 100644
index 0000000..e38a486
--- /dev/null
+++ b/src/preproc/eqn/lex.cpp
@@ -0,0 +1,1236 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "eqn.h"
+#include "eqn.hpp"
+#include "stringclass.h"
+#include "ptable.h"
+
+
+// declarations to avoid friend name injection problems
+int get_char();
+int peek_char();
+int get_location(char **, int *);
+
+struct definition {
+ char is_macro;
+ char is_simple;
+ union {
+ int tok;
+ char *contents;
+ };
+ definition();
+ ~definition();
+};
+
+definition::definition() : is_macro(1), is_simple(0)
+{
+ contents = 0;
+}
+
+definition::~definition()
+{
+ if (is_macro)
+ free(contents);
+}
+
+declare_ptable(definition)
+implement_ptable(definition)
+
+PTABLE(definition) macro_table;
+
+static struct {
+ const char *name;
+ int token;
+} token_table[] = {
+ { "over", OVER },
+ { "smallover", SMALLOVER },
+ { "sqrt", SQRT },
+ { "sub", SUB },
+ { "sup", SUP },
+ { "lpile", LPILE },
+ { "rpile", RPILE },
+ { "cpile", CPILE },
+ { "pile", PILE },
+ { "left", LEFT },
+ { "right", RIGHT },
+ { "to", TO },
+ { "from", FROM },
+ { "size", SIZE },
+ { "font", FONT },
+ { "roman", ROMAN },
+ { "bold", BOLD },
+ { "italic", ITALIC },
+ { "fat", FAT },
+ { "bar", BAR },
+ { "under", UNDER },
+ { "accent", ACCENT },
+ { "uaccent", UACCENT },
+ { "above", ABOVE },
+ { "fwd", FWD },
+ { "back", BACK },
+ { "down", DOWN },
+ { "up", UP },
+ { "matrix", MATRIX },
+ { "col", COL },
+ { "lcol", LCOL },
+ { "rcol", RCOL },
+ { "ccol", CCOL },
+ { "mark", MARK },
+ { "lineup", LINEUP },
+ { "space", SPACE },
+ { "gfont", GFONT },
+ { "gsize", GSIZE },
+ { "define", DEFINE },
+ { "sdefine", SDEFINE },
+ { "ndefine", NDEFINE },
+ { "tdefine", TDEFINE },
+ { "undef", UNDEF },
+ { "ifdef", IFDEF },
+ { "include", INCLUDE },
+ { "copy", INCLUDE },
+ { "delim", DELIM },
+ { "chartype", CHARTYPE },
+ { "type", TYPE },
+ { "vcenter", VCENTER },
+ { "set", SET },
+ { "opprime", PRIME },
+ { "grfont", GRFONT },
+ { "gbfont", GBFONT },
+ { "split", SPLIT },
+ { "nosplit", NOSPLIT },
+ { "special", SPECIAL },
+};
+
+struct builtin_def {
+ const char *name;
+ const char *def;
+};
+
+static struct builtin_def common_defs[] = {
+ { "ALPHA", "\\(*A" },
+ { "BETA", "\\(*B" },
+ { "CHI", "\\(*X" },
+ { "DELTA", "\\(*D" },
+ { "EPSILON", "\\(*E" },
+ { "ETA", "\\(*Y" },
+ { "GAMMA", "\\(*G" },
+ { "IOTA", "\\(*I" },
+ { "KAPPA", "\\(*K" },
+ { "LAMBDA", "\\(*L" },
+ { "MU", "\\(*M" },
+ { "NU", "\\(*N" },
+ { "OMEGA", "\\(*W" },
+ { "OMICRON", "\\(*O" },
+ { "PHI", "\\(*F" },
+ { "PI", "\\(*P" },
+ { "PSI", "\\(*Q" },
+ { "RHO", "\\(*R" },
+ { "SIGMA", "\\(*S" },
+ { "TAU", "\\(*T" },
+ { "THETA", "\\(*H" },
+ { "UPSILON", "\\(*U" },
+ { "XI", "\\(*C" },
+ { "ZETA", "\\(*Z" },
+ { "Alpha", "\\(*A" },
+ { "Beta", "\\(*B" },
+ { "Chi", "\\(*X" },
+ { "Delta", "\\(*D" },
+ { "Epsilon", "\\(*E" },
+ { "Eta", "\\(*Y" },
+ { "Gamma", "\\(*G" },
+ { "Iota", "\\(*I" },
+ { "Kappa", "\\(*K" },
+ { "Lambda", "\\(*L" },
+ { "Mu", "\\(*M" },
+ { "Nu", "\\(*N" },
+ { "Omega", "\\(*W" },
+ { "Omicron", "\\(*O" },
+ { "Phi", "\\(*F" },
+ { "Pi", "\\(*P" },
+ { "Psi", "\\(*Q" },
+ { "Rho", "\\(*R" },
+ { "Sigma", "\\(*S" },
+ { "Tau", "\\(*T" },
+ { "Theta", "\\(*H" },
+ { "Upsilon", "\\(*U" },
+ { "Xi", "\\(*C" },
+ { "Zeta", "\\(*Z" },
+ { "alpha", "\\(*a" },
+ { "beta", "\\(*b" },
+ { "chi", "\\(*x" },
+ { "delta", "\\(*d" },
+ { "epsilon", "\\(*e" },
+ { "eta", "\\(*y" },
+ { "gamma", "\\(*g" },
+ { "iota", "\\(*i" },
+ { "kappa", "\\(*k" },
+ { "lambda", "\\(*l" },
+ { "mu", "\\(*m" },
+ { "nu", "\\(*n" },
+ { "omega", "\\(*w" },
+ { "omicron", "\\(*o" },
+ { "phi", "\\(*f" },
+ { "pi", "\\(*p" },
+ { "psi", "\\(*q" },
+ { "rho", "\\(*r" },
+ { "sigma", "\\(*s" },
+ { "tau", "\\(*t" },
+ { "theta", "\\(*h" },
+ { "upsilon", "\\(*u" },
+ { "xi", "\\(*c" },
+ { "zeta", "\\(*z" },
+ { "max", "{type \"operator\" roman \"max\"}" },
+ { "min", "{type \"operator\" roman \"min\"}" },
+ { "lim", "{type \"operator\" roman \"lim\"}" },
+ { "sin", "{type \"operator\" roman \"sin\"}" },
+ { "cos", "{type \"operator\" roman \"cos\"}" },
+ { "tan", "{type \"operator\" roman \"tan\"}" },
+ { "sinh", "{type \"operator\" roman \"sinh\"}" },
+ { "cosh", "{type \"operator\" roman \"cosh\"}" },
+ { "tanh", "{type \"operator\" roman \"tanh\"}" },
+ { "arc", "{type \"operator\" roman \"arc\"}" },
+ { "log", "{type \"operator\" roman \"log\"}" },
+ { "ln", "{type \"operator\" roman \"ln\"}" },
+ { "exp", "{type \"operator\" roman \"exp\"}" },
+ { "Re", "{type \"operator\" roman \"Re\"}" },
+ { "Im", "{type \"operator\" roman \"Im\"}" },
+ { "det", "{type \"operator\" roman \"det\"}" },
+ { "and", "{roman \"and\"}" },
+ { "if", "{roman \"if\"}" },
+ { "for", "{roman \"for\"}" },
+ { "times", "type \"binary\" \\(mu" },
+ { "ldots", "type \"inner\" { . . . }" },
+ { "inf", "\\(if" },
+ { "partial", "\\(pd" },
+ { "nothing", "\"\"" },
+ { "half", "{1 smallover 2}" },
+ { "hat_def", "roman \"^\"" },
+ { "hat", "accent { hat_def }" },
+ { "tilde_def", "\"~\"" },
+ { "tilde", "accent { tilde_def }" },
+ { "==", "type \"relation\" \\(==" },
+ { "!=", "type \"relation\" \\(!=" },
+ { "+-", "type \"binary\" \\(+-" },
+ { "->", "type \"relation\" \\(->" },
+ { "<-", "type \"relation\" \\(<-" },
+ { "<<", "type \"relation\" \\(<<" },
+ { ">>", "type \"relation\" \\(>>" },
+ { "prime", "'" },
+ { "approx", "type \"relation\" \"\\(~=\"" },
+ { "grad", "\\(gr" },
+ { "del", "\\(gr" },
+ { "cdot", "type \"binary\" \\(md" },
+ { "cdots", "type \"inner\" { \\(md \\(md \\(md }" },
+ { "dollar", "$" },
+};
+
+/* composite definitions that require troff size and motion operators */
+static struct builtin_def troff_defs[] = {
+ { "sum", "{type \"operator\" vcenter size +5 \\(*S}" },
+ { "prod", "{type \"operator\" vcenter size +5 \\(*P}" },
+ { "int", "{type \"operator\" vcenter size +8 \\(is}" },
+ { "union", "{type \"operator\" vcenter size +5 \\(cu}" },
+ { "inter", "{type \"operator\" vcenter size +5 \\(ca}" },
+ { "dot_def", "up 52 back 15 \".\"" },
+ { "dot", "accent { dot_def }" },
+ { "dotdot_def", "up 52 back 25 \"..\"" },
+ { "dotdot", "accent { dotdot_def }" },
+ { "utilde_def", "down 75 \"~\"" },
+ { "utilde", "uaccent { utilde_def }" },
+ { "vec_def", "up 52 size -5 \\(->" },
+ { "vec", "accent { vec_def }" },
+ { "dyad_def", "up 52 size -5 { \\(<> }" },
+ { "dyad", "accent { dyad_def }" },
+ { "...", "type \"inner\" { . . . }" },
+};
+
+/* equivalent definitions for MathML mode */
+static struct builtin_def mathml_defs[] = {
+ { "sum", "{type \"operator\" size big \\(*S}" },
+ { "prod", "{type \"operator\" size big \\(*P}" },
+ { "int", "{type \"operator\" size big \\(is}" },
+ { "union", "{type \"operator\" size big \\(cu}" },
+ { "inter", "{type \"operator\" size big \\(ca}" },
+ { "dot", "accent { \".\" }" },
+ { "dotdot", "accent { \"..\" }" },
+ { "utilde", "uaccent { \"~\" }" },
+ { "vec", "accent { \\(-> }" },
+ { "dyad", "accent { \\(<> }" },
+ { "...", "type \"inner\" { . . . }" },
+};
+
+void init_table(const char *device)
+{
+ unsigned int i;
+ for (i = 0; i < sizeof(token_table)/sizeof(token_table[0]); i++) {
+ definition *def = new definition[1];
+ def->is_macro = 0;
+ def->tok = token_table[i].token;
+ macro_table.define(token_table[i].name, def);
+ }
+ for (i = 0; i < sizeof(common_defs)/sizeof(common_defs[0]); i++) {
+ definition *def = new definition[1];
+ def->is_macro = 1;
+ def->contents = strsave(common_defs[i].def);
+ def->is_simple = 1;
+ macro_table.define(common_defs[i].name, def);
+ }
+ if (output_format == troff) {
+ for (i = 0; i < sizeof(troff_defs)/sizeof(troff_defs[0]); i++) {
+ definition *def = new definition[1];
+ def->is_macro = 1;
+ def->contents = strsave(troff_defs[i].def);
+ def->is_simple = 1;
+ macro_table.define(troff_defs[i].name, def);
+ }
+ }
+ else if (output_format == mathml) {
+ for (i = 0; i < sizeof(mathml_defs)/sizeof(mathml_defs[0]); i++) {
+ definition *def = new definition[1];
+ def->is_macro = 1;
+ def->contents = strsave(mathml_defs[i].def);
+ def->is_simple = 1;
+ macro_table.define(mathml_defs[i].name, def);
+ }
+ }
+ definition *def = new definition[1];
+ def->is_macro = 1;
+ def->contents = strsave("1");
+ macro_table.define(device, def);
+}
+
+class input {
+ input *next;
+public:
+ input(input *p);
+ virtual ~input();
+ virtual int get() = 0;
+ virtual int peek() = 0;
+ virtual int get_location(char **, int *);
+
+ friend int get_char();
+ friend int peek_char();
+ friend int get_location(char **, int *);
+ friend void init_lex(const char *str, const char *filename, int lineno);
+};
+
+class file_input : public input {
+ FILE *fp;
+ char *filename;
+ int lineno;
+ string line;
+ const char *ptr;
+ int read_line();
+public:
+ file_input(FILE *, const char *, input *);
+ ~file_input();
+ int get();
+ int peek();
+ int get_location(char **, int *);
+};
+
+
+class macro_input : public input {
+ char *s;
+ char *p;
+public:
+ macro_input(const char *, input *);
+ ~macro_input();
+ int get();
+ int peek();
+};
+
+class top_input : public macro_input {
+ char *filename;
+ int lineno;
+ public:
+ top_input(const char *, const char *, int, input *);
+ ~top_input();
+ int get();
+ int get_location(char **, int *);
+};
+
+class argument_macro_input: public input {
+ char *s;
+ char *p;
+ char *ap;
+ int argc;
+ char *argv[9];
+public:
+ argument_macro_input(const char *, int, char **, input *);
+ ~argument_macro_input();
+ int get();
+ int peek();
+};
+
+input::input(input *x) : next(x)
+{
+}
+
+input::~input()
+{
+}
+
+int input::get_location(char **, int *)
+{
+ return 0;
+}
+
+file_input::file_input(FILE *f, const char *fn, input *p)
+: input(p), lineno(0), ptr("")
+{
+ fp = f;
+ filename = strsave(fn);
+}
+
+file_input::~file_input()
+{
+ if (fclose(fp) < 0)
+ fatal("unable to close '%1': %2", filename, strerror(errno));
+ delete[] filename;
+}
+
+int file_input::read_line()
+{
+ for (;;) {
+ line.clear();
+ lineno++;
+ for (;;) {
+ int c = getc(fp);
+ if (c == '\r') {
+ c = getc(fp);
+ if (c != '\n')
+ lex_error("invalid input character code %1", '\r');
+ }
+ if (c == EOF)
+ break;
+ else if (is_invalid_input_char(c))
+ lex_error("invalid input character code %1", c);
+ else {
+ line += char(c);
+ if (c == '\n')
+ break;
+ }
+ }
+ if (line.length() == 0)
+ return 0;
+ if (!(line.length() >= 3 && line[0] == '.' && line[1] == 'E'
+ && (line[2] == 'Q' || line[2] == 'N')
+ && (line.length() == 3 || line[3] == ' ' || line[3] == '\n'
+ || compatible_flag))) {
+ line += '\0';
+ ptr = line.contents();
+ return 1;
+ }
+ }
+}
+
+int file_input::get()
+{
+ if (*ptr != '\0' || read_line())
+ return *ptr++ & 0377;
+ else
+ return EOF;
+}
+
+int file_input::peek()
+{
+ if (*ptr != '\0' || read_line())
+ return *ptr;
+ else
+ return EOF;
+}
+
+int file_input::get_location(char **fnp, int *lnp)
+{
+ *fnp = filename;
+ *lnp = lineno;
+ return 1;
+}
+
+macro_input::macro_input(const char *str, input *x) : input(x)
+{
+ p = s = strsave(str);
+}
+
+macro_input::~macro_input()
+{
+ free(s);
+}
+
+int macro_input::get()
+{
+ if (p == 0 || *p == '\0')
+ return EOF;
+ else
+ return *p++ & 0377;
+}
+
+int macro_input::peek()
+{
+ if (p == 0 || *p == '\0')
+ return EOF;
+ else
+ return *p & 0377;
+}
+
+top_input::top_input(const char *str, const char *fn, int ln, input *x)
+: macro_input(str, x), lineno(ln)
+{
+ filename = strsave(fn);
+}
+
+top_input::~top_input()
+{
+ free(filename);
+}
+
+int top_input::get()
+{
+ int c = macro_input::get();
+ if (c == '\n')
+ lineno++;
+ return c;
+}
+
+int top_input::get_location(char **fnp, int *lnp)
+{
+ *fnp = filename;
+ *lnp = lineno;
+ return 1;
+}
+
+// Character representing $1. Must be invalid input character.
+#define ARG1 14
+
+argument_macro_input::argument_macro_input(const char *body, int ac,
+ char **av, input *x)
+: input(x), ap(0), argc(ac)
+{
+ int i;
+ for (i = 0; i < argc; i++)
+ argv[i] = av[i];
+ p = s = strsave(body);
+ int j = 0;
+ for (i = 0; s[i] != '\0'; i++)
+ if (s[i] == '$' && s[i+1] >= '0' && s[i+1] <= '9') {
+ if (s[i+1] != '0')
+ s[j++] = ARG1 + s[++i] - '1';
+ }
+ else
+ s[j++] = s[i];
+ s[j] = '\0';
+}
+
+
+argument_macro_input::~argument_macro_input()
+{
+ for (int i = 0; i < argc; i++)
+ delete[] argv[i];
+ delete[] s;
+}
+
+int argument_macro_input::get()
+{
+ if (ap) {
+ if (*ap != '\0')
+ return *ap++ & 0377;
+ ap = 0;
+ }
+ if (p == 0)
+ return EOF;
+ while (*p >= ARG1 && *p <= ARG1 + 8) {
+ int i = *p++ - ARG1;
+ if (i < argc && argv[i] != 0 && argv[i][0] != '\0') {
+ ap = argv[i];
+ return *ap++ & 0377;
+ }
+ }
+ if (*p == '\0')
+ return EOF;
+ return *p++ & 0377;
+}
+
+int argument_macro_input::peek()
+{
+ if (ap) {
+ if (*ap != '\0')
+ return *ap & 0377;
+ ap = 0;
+ }
+ if (p == 0)
+ return EOF;
+ while (*p >= ARG1 && *p <= ARG1 + 8) {
+ int i = *p++ - ARG1;
+ if (i < argc && argv[i] != 0 && argv[i][0] != '\0') {
+ ap = argv[i];
+ return *ap & 0377;
+ }
+ }
+ if (*p == '\0')
+ return EOF;
+ return *p & 0377;
+}
+
+static input *current_input = 0;
+
+/* we insert a newline between input from different levels */
+
+int get_char()
+{
+ if (current_input == 0)
+ return EOF;
+ else {
+ int c = current_input->get();
+ if (c != EOF)
+ return c;
+ else {
+ input *tem = current_input;
+ current_input = current_input->next;
+ delete tem;
+ return '\n';
+ }
+ }
+}
+
+int peek_char()
+{
+ if (current_input == 0)
+ return EOF;
+ else {
+ int c = current_input->peek();
+ if (c != EOF)
+ return c;
+ else
+ return '\n';
+ }
+}
+
+int get_location(char **fnp, int *lnp)
+{
+ for (input *p = current_input; p; p = p->next)
+ if (p->get_location(fnp, lnp))
+ return 1;
+ return 0;
+}
+
+string token_buffer;
+const int NCONTEXT = 4;
+string context_ring[NCONTEXT];
+int context_index = 0;
+
+void flush_context()
+{
+ for (int i = 0; i < NCONTEXT; i++)
+ context_ring[i] = "";
+ context_index = 0;
+}
+
+void show_context()
+{
+ int i = context_index;
+ fputs(" context is\n\t", stderr);
+ for (;;) {
+ int j = (i + 1) % NCONTEXT;
+ if (j == context_index) {
+ fputs(">>> ", stderr);
+ put_string(context_ring[i], stderr);
+ fputs(" <<<", stderr);
+ break;
+ }
+ else if (context_ring[i].length() > 0) {
+ put_string(context_ring[i], stderr);
+ putc(' ', stderr);
+ }
+ i = j;
+ }
+ putc('\n', stderr);
+}
+
+void add_context(const string &s)
+{
+ context_ring[context_index] = s;
+ context_index = (context_index + 1) % NCONTEXT;
+}
+
+void add_context(char c)
+{
+ context_ring[context_index] = c;
+ context_index = (context_index + 1) % NCONTEXT;
+}
+
+void add_quoted_context(const string &s)
+{
+ string &r = context_ring[context_index];
+ r = '"';
+ for (int i = 0; i < s.length(); i++)
+ if (s[i] == '"')
+ r += "\\\"";
+ else
+ r += s[i];
+ r += '"';
+ context_index = (context_index + 1) % NCONTEXT;
+}
+
+void init_lex(const char *str, const char *filename, int lineno)
+{
+ while (current_input != 0) {
+ input *tem = current_input;
+ current_input = current_input->next;
+ delete tem;
+ }
+ current_input = new top_input(str, filename, lineno, 0);
+ flush_context();
+}
+
+
+void get_delimited_text()
+{
+ char *filename, *last_seen_filename;
+ int lineno;
+ int got_location = get_location(&filename, &lineno);
+ // `filename` gets invalidated if we iterate off the end of the file.
+ last_seen_filename = strdup(filename);
+ int start = get_char();
+ while (start == ' ' || start == '\t' || start == '\n')
+ start = get_char();
+ token_buffer.clear();
+ if (start == EOF) {
+ current_lineno = 0;
+ if (got_location)
+ error_with_file_and_line(last_seen_filename, lineno,
+ "end of input while defining macro");
+ else
+ error("end of input while defining macro");
+ free(last_seen_filename);
+ return;
+ }
+ for (;;) {
+ int c = get_char();
+ if (c == EOF) {
+ current_lineno = 0;
+ if (got_location)
+ error_with_file_and_line(last_seen_filename, lineno,
+ "end of input while defining macro");
+ else
+ error("end of input while defining macro");
+ add_context(start + token_buffer);
+ free(last_seen_filename);
+ return;
+ }
+ if (c == start)
+ break;
+ token_buffer += char(c);
+ }
+ add_context(start + token_buffer + start);
+ free(last_seen_filename);
+}
+
+void interpolate_macro_with_args(const char *body)
+{
+ char *argv[9];
+ int argc = 0;
+ int i;
+ for (i = 0; i < 9; i++)
+ argv[i] = 0;
+ int level = 0;
+ int c;
+ do {
+ token_buffer.clear();
+ for (;;) {
+ c = get_char();
+ if (c == EOF) {
+ lex_error("end of input while scanning macro arguments");
+ break;
+ }
+ if (level == 0 && (c == ',' || c == ')')) {
+ if (token_buffer.length() > 0) {
+ token_buffer += '\0';
+ argv[argc] = strsave(token_buffer.contents());
+ }
+ // for 'foo()', argc = 0
+ if (argc > 0 || c != ')' || i > 0)
+ argc++;
+ break;
+ }
+ token_buffer += char(c);
+ if (c == '(')
+ level++;
+ else if (c == ')')
+ level--;
+ }
+ } while (c != ')' && c != EOF);
+ current_input = new argument_macro_input(body, argc, argv, current_input);
+}
+
+/* If lookup flag is non-zero the token will be looked up to see
+if it is macro. If it's 1, it will looked up to see if it's a token.
+*/
+
+int get_token(int lookup_flag = 0)
+{
+ for (;;) {
+ int c = get_char();
+ while (c == ' ' || c == '\n')
+ c = get_char();
+ switch (c) {
+ case EOF:
+ {
+ add_context("end of input");
+ }
+ return 0;
+ case '"':
+ {
+ int quoted = 0;
+ token_buffer.clear();
+ for (;;) {
+ c = get_char();
+ if (c == EOF) {
+ lex_error("missing \"");
+ break;
+ }
+ else if (c == '\n') {
+ lex_error("newline before end of quoted text");
+ break;
+ }
+ else if (c == '"') {
+ if (!quoted)
+ break;
+ token_buffer[token_buffer.length() - 1] = '"';
+ quoted = 0;
+ }
+ else {
+ token_buffer += c;
+ quoted = quoted ? 0 : c == '\\';
+ }
+ }
+ }
+ add_quoted_context(token_buffer);
+ return QUOTED_TEXT;
+ case '{':
+ case '}':
+ case '^':
+ case '~':
+ case '\t':
+ add_context(c);
+ return c;
+ default:
+ {
+ int break_flag = 0;
+ int quoted = 0;
+ token_buffer.clear();
+ if (c == '\\')
+ quoted = 1;
+ else
+ token_buffer += c;
+ int done = 0;
+ while (!done) {
+ c = peek_char();
+ if (!quoted && lookup_flag != 0 && c == '(') {
+ token_buffer += '\0';
+ definition *def = macro_table.lookup(token_buffer.contents());
+ if (def && def->is_macro && !def->is_simple) {
+ (void)get_char(); // skip initial '('
+ interpolate_macro_with_args(def->contents);
+ break_flag = 1;
+ break;
+ }
+ token_buffer.set_length(token_buffer.length() - 1);
+ }
+ if (quoted) {
+ quoted = 0;
+ switch (c) {
+ case EOF:
+ lex_error("'\\' ignored at end of equation");
+ done = 1;
+ break;
+ case '\n':
+ lex_error("'\\' ignored because followed by newline");
+ done = 1;
+ break;
+ case '\t':
+ lex_error("'\\' ignored because followed by tab");
+ done = 1;
+ break;
+ case '"':
+ (void)get_char();
+ token_buffer += '"';
+ break;
+ default:
+ (void)get_char();
+ token_buffer += '\\';
+ token_buffer += c;
+ break;
+ }
+ }
+ else {
+ switch (c) {
+ case EOF:
+ case '{':
+ case '}':
+ case '^':
+ case '~':
+ case '"':
+ case ' ':
+ case '\t':
+ case '\n':
+ done = 1;
+ break;
+ case '\\':
+ (void)get_char();
+ quoted = 1;
+ break;
+ default:
+ (void)get_char();
+ token_buffer += char(c);
+ break;
+ }
+ }
+ }
+ if (break_flag || token_buffer.length() == 0)
+ break;
+ if (lookup_flag != 0) {
+ token_buffer += '\0';
+ definition *def = macro_table.lookup(token_buffer.contents());
+ token_buffer.set_length(token_buffer.length() - 1);
+ if (def) {
+ if (def->is_macro) {
+ current_input = new macro_input(def->contents, current_input);
+ break;
+ }
+ else if (lookup_flag == 1) {
+ add_context(token_buffer);
+ return def->tok;
+ }
+ }
+ }
+ add_context(token_buffer);
+ return TEXT;
+ }
+ }
+ }
+}
+
+void do_include()
+{
+ int t = get_token(2);
+ if (t != TEXT && t != QUOTED_TEXT) {
+ lex_error("bad filename for include");
+ return;
+ }
+ token_buffer += '\0';
+ const char *filename = token_buffer.contents();
+ errno = 0;
+ FILE *fp = fopen(filename, "r");
+ if (fp == 0) {
+ lex_error("can't open included file '%1'", filename);
+ return;
+ }
+ current_input = new file_input(fp, filename, current_input);
+}
+
+void ignore_definition()
+{
+ int t = get_token();
+ if (t != TEXT) {
+ lex_error("bad definition");
+ return;
+ }
+ get_delimited_text();
+}
+
+void do_definition(int is_simple)
+{
+ int t = get_token();
+ if (t != TEXT) {
+ lex_error("bad definition");
+ return;
+ }
+ token_buffer += '\0';
+ const char *name = token_buffer.contents();
+ definition *def = macro_table.lookup(name);
+ if (def == 0) {
+ def = new definition[1];
+ macro_table.define(name, def);
+ }
+ else if (def->is_macro) {
+ free(def->contents);
+ }
+ get_delimited_text();
+ token_buffer += '\0';
+ def->is_macro = 1;
+ def->contents = strsave(token_buffer.contents());
+ def->is_simple = is_simple;
+}
+
+void do_undef()
+{
+ int t = get_token();
+ if (t != TEXT) {
+ lex_error("bad undef command");
+ return;
+ }
+ token_buffer += '\0';
+ macro_table.define(token_buffer.contents(), 0);
+}
+
+void do_gsize()
+{
+ int t = get_token(2);
+ if (t != TEXT && t != QUOTED_TEXT) {
+ lex_error("bad argument to gsize command");
+ return;
+ }
+ token_buffer += '\0';
+ if (!set_gsize(token_buffer.contents()))
+ lex_error("invalid size '%1'", token_buffer.contents());
+}
+
+void do_gfont()
+{
+ int t = get_token(2);
+ if (t != TEXT && t != QUOTED_TEXT) {
+ lex_error("bad argument to gfont command");
+ return;
+ }
+ token_buffer += '\0';
+ set_gfont(token_buffer.contents());
+}
+
+void do_grfont()
+{
+ int t = get_token(2);
+ if (t != TEXT && t != QUOTED_TEXT) {
+ lex_error("bad argument to grfont command");
+ return;
+ }
+ token_buffer += '\0';
+ set_grfont(token_buffer.contents());
+}
+
+void do_gbfont()
+{
+ int t = get_token(2);
+ if (t != TEXT && t != QUOTED_TEXT) {
+ lex_error("bad argument to gbfont command");
+ return;
+ }
+ token_buffer += '\0';
+ set_gbfont(token_buffer.contents());
+}
+
+void do_space()
+{
+ int t = get_token(2);
+ if (t != TEXT && t != QUOTED_TEXT) {
+ lex_error("bad argument to space command");
+ return;
+ }
+ token_buffer += '\0';
+ char *ptr;
+ long n = strtol(token_buffer.contents(), &ptr, 10);
+ if (n == 0 && ptr == token_buffer.contents())
+ lex_error("bad argument '%1' to space command", token_buffer.contents());
+ else
+ set_space(int(n));
+}
+
+void do_ifdef()
+{
+ int t = get_token();
+ if (t != TEXT) {
+ lex_error("bad ifdef");
+ return;
+ }
+ token_buffer += '\0';
+ definition *def = macro_table.lookup(token_buffer.contents());
+ int result = def && def->is_macro && !def->is_simple;
+ get_delimited_text();
+ if (result) {
+ token_buffer += '\0';
+ current_input = new macro_input(token_buffer.contents(), current_input);
+ }
+}
+
+char start_delim_saved = '\0';
+char end_delim_saved = '\0';
+
+void do_delim()
+{
+ int c = get_char();
+ while (c == ' ' || c == '\n')
+ c = get_char();
+ int d;
+ if (c == EOF || (d = get_char()) == EOF)
+ lex_error("end of file while reading argument to 'delim'");
+ else {
+ if (c == 'o' && d == 'f' && peek_char() == 'f') {
+ (void)get_char();
+ start_delim_saved = start_delim;
+ end_delim_saved = end_delim;
+ start_delim = end_delim = '\0';
+ }
+ else if (c == 'o' && d == 'n') {
+ start_delim = start_delim_saved;
+ end_delim = end_delim_saved;
+ }
+ else {
+ start_delim = c;
+ end_delim = d;
+ }
+ }
+}
+
+void do_chartype()
+{
+ int t = get_token(2);
+ if (t != TEXT && t != QUOTED_TEXT) {
+ lex_error("bad chartype");
+ return;
+ }
+ token_buffer += '\0';
+ string type = token_buffer;
+ t = get_token();
+ if (t != TEXT && t != QUOTED_TEXT) {
+ lex_error("bad chartype");
+ return;
+ }
+ token_buffer += '\0';
+ set_char_type(type.contents(), strsave(token_buffer.contents()));
+}
+
+void do_set()
+{
+ int t = get_token(2);
+ if (t != TEXT && t != QUOTED_TEXT) {
+ lex_error("bad set");
+ return;
+ }
+ token_buffer += '\0';
+ string param = token_buffer;
+ t = get_token();
+ if (t != TEXT && t != QUOTED_TEXT) {
+ lex_error("bad set");
+ return;
+ }
+ token_buffer += '\0';
+ int n;
+ if (sscanf(&token_buffer[0], "%d", &n) != 1) {
+ lex_error("bad number '%1'", token_buffer.contents());
+ return;
+ }
+ set_param(param.contents(), n);
+}
+
+int yylex()
+{
+ for (;;) {
+ int tk = get_token(1);
+ switch(tk) {
+ case UNDEF:
+ do_undef();
+ break;
+ case SDEFINE:
+ do_definition(1);
+ break;
+ case DEFINE:
+ do_definition(0);
+ break;
+ case TDEFINE:
+ if (!nroff)
+ do_definition(0);
+ else
+ ignore_definition();
+ break;
+ case NDEFINE:
+ if (nroff)
+ do_definition(0);
+ else
+ ignore_definition();
+ break;
+ case GSIZE:
+ do_gsize();
+ break;
+ case GFONT:
+ do_gfont();
+ break;
+ case GRFONT:
+ do_grfont();
+ break;
+ case GBFONT:
+ do_gbfont();
+ break;
+ case SPACE:
+ do_space();
+ break;
+ case INCLUDE:
+ do_include();
+ break;
+ case IFDEF:
+ do_ifdef();
+ break;
+ case DELIM:
+ do_delim();
+ break;
+ case CHARTYPE:
+ do_chartype();
+ break;
+ case SET:
+ do_set();
+ break;
+ case QUOTED_TEXT:
+ case TEXT:
+ token_buffer += '\0';
+ yylval.str = strsave(token_buffer.contents());
+ // fall through
+ default:
+ return tk;
+ }
+ }
+}
+
+void lex_error(const char *message,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ char *filename;
+ int lineno;
+ if (!get_location(&filename, &lineno))
+ error(message, arg1, arg2, arg3);
+ else
+ error_with_file_and_line(filename, lineno, message, arg1, arg2, arg3);
+}
+
+void yyerror(const char *s)
+{
+ char *filename;
+ int lineno;
+ if (!get_location(&filename, &lineno))
+ error(s);
+ else
+ error_with_file_and_line(filename, lineno, s);
+ show_context();
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/eqn/limit.cpp b/src/preproc/eqn/limit.cpp
new file mode 100644
index 0000000..bf64a04
--- /dev/null
+++ b/src/preproc/eqn/limit.cpp
@@ -0,0 +1,217 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "eqn.h"
+#include "pbox.h"
+
+class limit_box : public box {
+private:
+ box *p;
+ box *from;
+ box *to;
+public:
+ limit_box(box *, box *, box *);
+ ~limit_box();
+ int compute_metrics(int);
+ void output();
+ void debug_print();
+ void check_tabs(int);
+};
+
+box *make_limit_box(box *pp, box *qq, box *rr)
+{
+ return new limit_box(pp, qq, rr);
+}
+
+limit_box::limit_box(box *pp, box *qq, box *rr)
+: p(pp), from(qq), to(rr)
+{
+ spacing_type = p->spacing_type;
+}
+
+limit_box::~limit_box()
+{
+ delete p;
+ delete from;
+ delete to;
+}
+
+int limit_box::compute_metrics(int style)
+{
+ printf(".nr " SIZE_FORMAT " \\n[.ps]\n", uid);
+ if (!(style <= SCRIPT_STYLE && one_size_reduction_flag))
+ set_script_size();
+ printf(".nr " SMALL_SIZE_FORMAT " \\n[.ps]\n", uid);
+ int res = 0;
+ int mark_uid = -1;
+ if (from != 0) {
+ res = from->compute_metrics(cramped_style(script_style(style)));
+ if (res)
+ mark_uid = from->uid;
+ }
+ if (to != 0) {
+ int r = to->compute_metrics(script_style(style));
+ if (res && r)
+ error("multiple marks and lineups");
+ else {
+ mark_uid = to->uid;
+ res = r;
+ }
+ }
+ printf(".ps \\n[" SIZE_FORMAT "]u\n", uid);
+ int r = p->compute_metrics(style);
+ p->compute_subscript_kern();
+ if (res && r)
+ error("multiple marks and lineups");
+ else {
+ mark_uid = p->uid;
+ res = r;
+ }
+ printf(".nr " LEFT_WIDTH_FORMAT " "
+ "0\\n[" WIDTH_FORMAT "]",
+ uid, p->uid);
+ if (from != 0)
+ printf(">?(\\n[" SUB_KERN_FORMAT "]+\\n[" WIDTH_FORMAT "])",
+ p->uid, from->uid);
+ if (to != 0)
+ printf(">?(-\\n[" SUB_KERN_FORMAT "]+\\n[" WIDTH_FORMAT "])",
+ p->uid, to->uid);
+ printf("/2\n");
+ printf(".nr " WIDTH_FORMAT " "
+ "0\\n[" WIDTH_FORMAT "]",
+ uid, p->uid);
+ if (from != 0)
+ printf(">?(-\\n[" SUB_KERN_FORMAT "]+\\n[" WIDTH_FORMAT "])",
+ p->uid, from->uid);
+ if (to != 0)
+ printf(">?(\\n[" SUB_KERN_FORMAT "]+\\n[" WIDTH_FORMAT "])",
+ p->uid, to->uid);
+ printf("/2+\\n[" LEFT_WIDTH_FORMAT "]\n", uid);
+ printf(".nr " WIDTH_FORMAT " 0\\n[" WIDTH_FORMAT "]", uid, p->uid);
+ if (to != 0)
+ printf(">?\\n[" WIDTH_FORMAT "]", to->uid);
+ if (from != 0)
+ printf(">?\\n[" WIDTH_FORMAT "]", from->uid);
+ printf("\n");
+ if (res)
+ printf(".nr " MARK_REG " +(\\n[" LEFT_WIDTH_FORMAT "]"
+ "-(\\n[" WIDTH_FORMAT "]/2))\n",
+ uid, mark_uid);
+ if (to != 0) {
+ printf(".nr " SUP_RAISE_FORMAT " %dM+\\n[" DEPTH_FORMAT
+ "]>?%dM+\\n[" HEIGHT_FORMAT "]\n",
+ uid, big_op_spacing1, to->uid, big_op_spacing3, p->uid);
+ printf(".nr " HEIGHT_FORMAT " \\n[" SUP_RAISE_FORMAT "]+\\n["
+ HEIGHT_FORMAT "]+%dM\n",
+ uid, uid, to->uid, big_op_spacing5);
+ }
+ else
+ printf(".nr " HEIGHT_FORMAT " \\n[" HEIGHT_FORMAT "]\n", uid, p->uid);
+ if (from != 0) {
+ printf(".nr " SUB_LOWER_FORMAT " %dM+\\n[" HEIGHT_FORMAT
+ "]>?%dM+\\n[" DEPTH_FORMAT "]\n",
+ uid, big_op_spacing2, from->uid, big_op_spacing4, p->uid);
+ printf(".nr " DEPTH_FORMAT " \\n[" SUB_LOWER_FORMAT "]+\\n["
+ DEPTH_FORMAT "]+%dM\n",
+ uid, uid, from->uid, big_op_spacing5);
+ }
+ else
+ printf(".nr " DEPTH_FORMAT " \\n[" DEPTH_FORMAT "]\n", uid, p->uid);
+ return res;
+}
+
+void limit_box::output()
+{
+ if (output_format == troff) {
+ printf("\\s[\\n[" SMALL_SIZE_FORMAT "]u]", uid);
+ if (to != 0) {
+ printf("\\Z" DELIMITER_CHAR);
+ printf("\\v'-\\n[" SUP_RAISE_FORMAT "]u'", uid);
+ printf("\\h'\\n[" LEFT_WIDTH_FORMAT "]u"
+ "+(-\\n[" WIDTH_FORMAT "]u+\\n[" SUB_KERN_FORMAT "]u/2u)'",
+ uid, to->uid, p->uid);
+ to->output();
+ printf(DELIMITER_CHAR);
+ }
+ if (from != 0) {
+ printf("\\Z" DELIMITER_CHAR);
+ printf("\\v'\\n[" SUB_LOWER_FORMAT "]u'", uid);
+ printf("\\h'\\n[" LEFT_WIDTH_FORMAT "]u"
+ "+(-\\n[" SUB_KERN_FORMAT "]u-\\n[" WIDTH_FORMAT "]u/2u)'",
+ uid, p->uid, from->uid);
+ from->output();
+ printf(DELIMITER_CHAR);
+ }
+ printf("\\s[\\n[" SIZE_FORMAT "]u]", uid);
+ printf("\\Z" DELIMITER_CHAR);
+ printf("\\h'\\n[" LEFT_WIDTH_FORMAT "]u"
+ "-(\\n[" WIDTH_FORMAT "]u/2u)'",
+ uid, p->uid);
+ p->output();
+ printf(DELIMITER_CHAR);
+ printf("\\h'\\n[" WIDTH_FORMAT "]u'", uid);
+ }
+ else if (output_format == mathml) {
+ if (from != 0 && to != 0) {
+ printf("<munderover>");
+ p->output();
+ from->output();
+ to->output();
+ printf("</munderover>");
+ }
+ else if (from != 0) {
+ printf("<munder>");
+ p->output();
+ from->output();
+ printf("</munder>");
+ }
+ else if (to != 0) {
+ printf("<mover>");
+ p->output();
+ to->output();
+ printf("</mover>");
+ }
+ }
+}
+
+void limit_box::debug_print()
+{
+ fprintf(stderr, "{ ");
+ p->debug_print();
+ fprintf(stderr, " }");
+ if (from) {
+ fprintf(stderr, " from { ");
+ from->debug_print();
+ fprintf(stderr, " }");
+ }
+ if (to) {
+ fprintf(stderr, " to { ");
+ to->debug_print();
+ fprintf(stderr, " }");
+ }
+}
+
+void limit_box::check_tabs(int level)
+{
+ if (to)
+ to->check_tabs(level + 1);
+ if (from)
+ from->check_tabs(level + 1);
+ p->check_tabs(level + 1);
+}
diff --git a/src/preproc/eqn/list.cpp b/src/preproc/eqn/list.cpp
new file mode 100644
index 0000000..52644c5
--- /dev/null
+++ b/src/preproc/eqn/list.cpp
@@ -0,0 +1,241 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "eqn.h"
+#include "pbox.h"
+
+list_box *box::to_list_box()
+{
+ return 0;
+}
+
+list_box *list_box::to_list_box()
+{
+ return this;
+}
+
+void list_box::append(box *pp)
+{
+ list_box *q = pp->to_list_box();
+ if (q == 0)
+ list.append(pp);
+ else {
+ for (int i = 0; i < q->list.len; i++) {
+ list.append(q->list.p[i]);
+ q->list.p[i] = 0;
+ }
+ q->list.len = 0;
+ delete q;
+ }
+}
+
+list_box::list_box(box *pp) : list(pp), sty(-1)
+{
+ list_box *q = pp->to_list_box();
+ if (q != 0) {
+ // flatten it
+ list.p[0] = q->list.p[0];
+ for (int i = 1; i < q->list.len; i++) {
+ list.append(q->list.p[i]);
+ q->list.p[i] = 0;
+ }
+ q->list.len = 0;
+ delete q;
+ }
+}
+
+static int compute_spacing(int is_script, int left, int right)
+{
+ if (left == SUPPRESS_TYPE || right == SUPPRESS_TYPE)
+ return 0;
+ if (left == PUNCTUATION_TYPE)
+ return is_script ? 0 : thin_space;
+ if (left == OPENING_TYPE || right == CLOSING_TYPE)
+ return 0;
+ if (right == BINARY_TYPE || left == BINARY_TYPE)
+ return is_script ? 0 : medium_space;
+ if (right == RELATION_TYPE) {
+ if (left == RELATION_TYPE)
+ return 0;
+ else
+ return is_script ? 0 : thick_space;
+ }
+ if (left == RELATION_TYPE)
+ return is_script ? 0 : thick_space;
+ if (right == OPERATOR_TYPE)
+ return thin_space;
+ if (left == INNER_TYPE || right == INNER_TYPE)
+ return is_script ? 0 : thin_space;
+ if (left == OPERATOR_TYPE && right == ORDINARY_TYPE)
+ return thin_space;
+ return 0;
+}
+
+int list_box::compute_metrics(int style)
+{
+ sty = style;
+ int i;
+ for (i = 0; i < list.len; i++) {
+ int t = list.p[i]->spacing_type;
+ // 5
+ if (t == BINARY_TYPE) {
+ int prevt;
+ if (i == 0
+ || (prevt = list.p[i-1]->spacing_type) == BINARY_TYPE
+ || prevt == OPERATOR_TYPE
+ || prevt == RELATION_TYPE
+ || prevt == OPENING_TYPE
+ || prevt == SUPPRESS_TYPE
+ || prevt == PUNCTUATION_TYPE)
+ list.p[i]->spacing_type = ORDINARY_TYPE;
+ }
+ // 7
+ else if ((t == RELATION_TYPE || t == CLOSING_TYPE
+ || t == PUNCTUATION_TYPE)
+ && i > 0 && list.p[i-1]->spacing_type == BINARY_TYPE)
+ list.p[i-1]->spacing_type = ORDINARY_TYPE;
+ }
+ for (i = 0; i < list.len; i++) {
+ unsigned flags = 0;
+ if (i - 1 >= 0 && list.p[i - 1]->right_is_italic())
+ flags |= HINT_PREV_IS_ITALIC;
+ if (i + 1 < list.len && list.p[i + 1]->left_is_italic())
+ flags |= HINT_NEXT_IS_ITALIC;
+ if (flags)
+ list.p[i]->hint(flags);
+ }
+ is_script = (style <= SCRIPT_STYLE);
+ int total_spacing = 0;
+ for (i = 1; i < list.len; i++)
+ total_spacing += compute_spacing(is_script, list.p[i-1]->spacing_type,
+ list.p[i]->spacing_type);
+ int res = 0;
+ for (i = 0; i < list.len; i++)
+ if (!list.p[i]->is_simple()) {
+ int r = list.p[i]->compute_metrics(style);
+ if (r) {
+ if (res)
+ error("multiple marks and lineups");
+ else {
+ compute_sublist_width(i);
+ printf(".nr " MARK_REG " +\\n[" TEMP_REG"]\n");
+ res = r;
+ }
+ }
+ }
+ printf(".nr " WIDTH_FORMAT " %dM", uid, total_spacing);
+ for (i = 0; i < list.len; i++)
+ if (!list.p[i]->is_simple())
+ printf("+\\n[" WIDTH_FORMAT "]", list.p[i]->uid);
+ printf("\n");
+ printf(".nr " HEIGHT_FORMAT " 0", uid);
+ for (i = 0; i < list.len; i++)
+ if (!list.p[i]->is_simple())
+ printf(">?\\n[" HEIGHT_FORMAT "]", list.p[i]->uid);
+ printf("\n");
+ printf(".nr " DEPTH_FORMAT " 0", uid);
+ for (i = 0; i < list.len; i++)
+ if (!list.p[i]->is_simple())
+ printf(">?\\n[" DEPTH_FORMAT "]", list.p[i]->uid);
+ printf("\n");
+ int have_simple = 0;
+ for (i = 0; i < list.len && !have_simple; i++)
+ have_simple = list.p[i]->is_simple();
+ if (have_simple) {
+ printf(".nr " WIDTH_FORMAT " +\\w" DELIMITER_CHAR, uid);
+ for (i = 0; i < list.len; i++)
+ if (list.p[i]->is_simple())
+ list.p[i]->output();
+ printf(DELIMITER_CHAR "\n");
+ printf(".nr " HEIGHT_FORMAT " \\n[rst]>?\\n[" HEIGHT_FORMAT "]\n",
+ uid, uid);
+ printf(".nr " DEPTH_FORMAT " 0-\\n[rsb]>?\\n[" DEPTH_FORMAT "]\n",
+ uid, uid);
+ }
+ return res;
+}
+
+void list_box::compute_sublist_width(int n)
+{
+ int total_spacing = 0;
+ int i;
+ for (i = 1; i < n + 1 && i < list.len; i++)
+ total_spacing += compute_spacing(is_script, list.p[i-1]->spacing_type,
+ list.p[i]->spacing_type);
+ printf(".nr " TEMP_REG " %dM", total_spacing);
+ for (i = 0; i < n; i++)
+ if (!list.p[i]->is_simple())
+ printf("+\\n[" WIDTH_FORMAT "]", list.p[i]->uid);
+ int have_simple = 0;
+ for (i = 0; i < n && !have_simple; i++)
+ have_simple = list.p[i]->is_simple();
+ if (have_simple) {
+ printf("+\\w" DELIMITER_CHAR);
+ for (i = 0; i < n; i++)
+ if (list.p[i]->is_simple())
+ list.p[i]->output();
+ printf(DELIMITER_CHAR);
+ }
+ printf("\n");
+}
+
+void list_box::compute_subscript_kern()
+{
+ // We can only call compute_subscript_kern if we have called
+ // compute_metrics first.
+ if (list.p[list.len-1]->is_simple())
+ list.p[list.len-1]->compute_metrics(sty);
+ list.p[list.len-1]->compute_subscript_kern();
+ printf(".nr " SUB_KERN_FORMAT " \\n[" SUB_KERN_FORMAT "]\n",
+ uid, list.p[list.len-1]->uid);
+}
+
+void list_box::output()
+{
+ if (output_format == mathml)
+ printf("<mrow>");
+ for (int i = 0; i < list.len; i++) {
+ if (output_format == troff && i > 0) {
+ int n = compute_spacing(is_script,
+ list.p[i-1]->spacing_type,
+ list.p[i]->spacing_type);
+ if (n > 0)
+ printf("\\h'%dM'", n);
+ }
+ list.p[i]->output();
+ }
+ if (output_format == mathml)
+ printf("</mrow>");
+}
+
+void list_box::handle_char_type(int st, int ft)
+{
+ for (int i = 0; i < list.len; i++)
+ list.p[i]->handle_char_type(st, ft);
+}
+
+void list_box::debug_print()
+{
+ list.list_debug_print(" ");
+}
+
+void list_box::check_tabs(int level)
+{
+ list.list_check_tabs(level);
+}
diff --git a/src/preproc/eqn/main.cpp b/src/preproc/eqn/main.cpp
new file mode 100644
index 0000000..81d5184
--- /dev/null
+++ b/src/preproc/eqn/main.cpp
@@ -0,0 +1,485 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "eqn.h"
+#include "stringclass.h"
+#include "device.h"
+#include "searchpath.h"
+#include "macropath.h"
+#include "htmlhint.h"
+#include "pbox.h"
+#include "ctype.h"
+#include "lf.h"
+
+#define STARTUP_FILE "eqnrc"
+
+extern int yyparse();
+extern "C" const char *Version_string;
+
+static char *delim_search (char *, int);
+static int inline_equation (FILE *, string &, string &);
+
+char start_delim = '\0';
+char end_delim = '\0';
+int non_empty_flag;
+int inline_flag;
+int draw_flag = 0;
+int one_size_reduction_flag = 0;
+int compatible_flag = 0;
+int no_newline_in_delim_flag = 0;
+int html = 0;
+int xhtml = 0;
+eqnmode_t output_format;
+
+static const char *input_char_description(int c)
+{
+ switch (c) {
+ case '\001':
+ return "a leader character";
+ case '\n':
+ return "a newline character";
+ case '\b':
+ return "a backspace character";
+ case '\t':
+ return "a tab character";
+ case ' ':
+ return "a space character";
+ case '\177':
+ return "a delete character";
+ }
+ size_t bufsz = sizeof "character code " + INT_DIGITS + 1;
+ // repeat expression; no VLAs in ISO C++
+ static char buf[sizeof "character code " + INT_DIGITS + 1];
+ (void) memset(buf, 0, bufsz);
+ if (csprint(c)) {
+ buf[0] = '\'';
+ buf[1] = c;
+ buf[2] = '\'';
+ return buf;
+ }
+ (void) sprintf(buf, "character code %d", c);
+ return buf;
+}
+
+static bool read_line(FILE *fp, string *p)
+{
+ p->clear();
+ int c = -1;
+ while ((c = getc(fp)) != EOF) {
+ if (!is_invalid_input_char(c))
+ *p += char(c);
+ else
+ error("invalid input (%1)", input_char_description(c));
+ if (c == '\n')
+ break;
+ }
+ return (p->length() > 0);
+}
+
+void do_file(FILE *fp, const char *filename)
+{
+ string linebuf;
+ string str;
+ string fn(filename);
+ fn += '\0';
+ normalize_for_lf(fn);
+ current_filename = fn.contents();
+ if (output_format == troff)
+ printf(".lf 1 %s\n", current_filename);
+ current_lineno = 1;
+ while (read_line(fp, &linebuf)) {
+ if (linebuf.length() >= 4
+ && linebuf[0] == '.' && linebuf[1] == 'l' && linebuf[2] == 'f'
+ && (linebuf[3] == ' ' || linebuf[3] == '\n' || compatible_flag))
+ {
+ put_string(linebuf, stdout);
+ linebuf += '\0';
+ // In GNU roff, `lf` assigns the number of the _next_ line.
+ if (interpret_lf_args(linebuf.contents() + 3))
+ current_lineno--;
+ }
+ else if (linebuf.length() >= 4
+ && linebuf[0] == '.'
+ && linebuf[1] == 'E'
+ && linebuf[2] == 'Q'
+ && (linebuf[3] == ' ' || linebuf[3] == '\n'
+ || compatible_flag)) {
+ put_string(linebuf, stdout);
+ int start_lineno = current_lineno + 1;
+ str.clear();
+ for (;;) {
+ if (!read_line(fp, &linebuf)) {
+ current_lineno = 0; // suppress report of line number
+ fatal("end of file before .EN");
+ }
+ if (linebuf.length() >= 3
+ && linebuf[0] == '.'
+ && linebuf[1] == 'E') {
+ if (linebuf[2] == 'N'
+ && (linebuf.length() == 3 || linebuf[3] == ' '
+ || linebuf[3] == '\n' || compatible_flag))
+ break;
+ else if (linebuf[2] == 'Q' && linebuf.length() > 3
+ && (linebuf[3] == ' ' || linebuf[3] == '\n'
+ || compatible_flag)) {
+ current_lineno++; // We just read another line.
+ fatal("equations cannot be nested (.EQ within .EQ)");
+ }
+ }
+ str += linebuf;
+ }
+ str += '\0';
+ start_string();
+ init_lex(str.contents(), current_filename, start_lineno);
+ non_empty_flag = 0;
+ inline_flag = 0;
+ yyparse();
+ restore_compatibility();
+ if (non_empty_flag) {
+ if (output_format == mathml)
+ putchar('\n');
+ else {
+ current_lineno++;
+ printf(".lf %d\n", current_lineno);
+ output_string();
+ }
+ }
+ if (output_format == troff) {
+ current_lineno++;
+ printf(".lf %d\n", current_lineno);
+ }
+ put_string(linebuf, stdout);
+ }
+ else if (start_delim != '\0' && linebuf.search(start_delim) >= 0
+ && inline_equation(fp, linebuf, str))
+ ;
+ else
+ put_string(linebuf, stdout);
+ current_lineno++;
+ }
+ current_filename = 0;
+ current_lineno = 0;
+}
+
+// Handle an inline equation. Return 1 if it was an inline equation,
+// otherwise.
+static int inline_equation(FILE *fp, string &linebuf, string &str)
+{
+ linebuf += '\0';
+ char *ptr = &linebuf[0];
+ char *start = delim_search(ptr, start_delim);
+ if (!start) {
+ // It wasn't a delimiter after all.
+ linebuf.set_length(linebuf.length() - 1); // strip the '\0'
+ return 0;
+ }
+ start_string();
+ inline_flag = 1;
+ for (;;) {
+ if (no_newline_in_delim_flag && strchr(start + 1, end_delim) == 0) {
+ error("unterminated inline equation; started with %1,"
+ " expecting %2", input_char_description(start_delim),
+ input_char_description(end_delim));
+ char *nl = strchr(start + 1, '\n');
+ if (nl != 0)
+ *nl = '\0';
+ do_text(ptr);
+ break;
+ }
+ int start_lineno = current_lineno;
+ *start = '\0';
+ do_text(ptr);
+ ptr = start + 1;
+ str.clear();
+ for (;;) {
+ char *end = strchr(ptr, end_delim);
+ if (end != 0) {
+ *end = '\0';
+ str += ptr;
+ ptr = end + 1;
+ break;
+ }
+ str += ptr;
+ if (!read_line(fp, &linebuf))
+ fatal("unterminated inline equation; started with %1,"
+ " expecting %2", input_char_description(start_delim),
+ input_char_description(end_delim));
+ linebuf += '\0';
+ ptr = &linebuf[0];
+ }
+ str += '\0';
+ if (output_format == troff && html) {
+ printf(".as1 %s ", LINE_STRING);
+ html_begin_suppress();
+ printf("\n");
+ }
+ init_lex(str.contents(), current_filename, start_lineno);
+ yyparse();
+ if (output_format == troff && html) {
+ printf(".as1 %s ", LINE_STRING);
+ html_end_suppress();
+ printf("\n");
+ }
+ if (output_format == mathml)
+ printf("\n");
+ if (xhtml) {
+ /* skip leading spaces */
+ while ((*ptr != '\0') && (*ptr == ' '))
+ ptr++;
+ }
+ start = delim_search(ptr, start_delim);
+ if (start == 0) {
+ char *nl = strchr(ptr, '\n');
+ if (nl != 0)
+ *nl = '\0';
+ do_text(ptr);
+ break;
+ }
+ }
+ restore_compatibility();
+ if (output_format == troff)
+ printf(".lf %d\n", current_lineno);
+ output_string();
+ if (output_format == troff)
+ printf(".lf %d\n", current_lineno + 1);
+ return 1;
+}
+
+/* Search for delim. Skip over number register and string names etc. */
+
+static char *delim_search(char *ptr, int delim)
+{
+ while (*ptr) {
+ if (*ptr == delim)
+ return ptr;
+ if (*ptr++ == '\\') {
+ switch (*ptr) {
+ case 'n':
+ case '*':
+ case 'f':
+ case 'g':
+ case 'k':
+ switch (*++ptr) {
+ case '\0':
+ case '\\':
+ break;
+ case '(':
+ if (*++ptr != '\\' && *ptr != '\0'
+ && *++ptr != '\\' && *ptr != '\0')
+ ptr++;
+ break;
+ case '[':
+ while (*++ptr != '\0')
+ if (*ptr == ']') {
+ ptr++;
+ break;
+ }
+ break;
+ default:
+ ptr++;
+ break;
+ }
+ break;
+ case '\\':
+ case '\0':
+ break;
+ default:
+ ptr++;
+ break;
+ }
+ }
+ }
+ return 0;
+}
+
+void usage(FILE *stream)
+{
+ fprintf(stream,
+ "usage: %s [-CNrR] [-d xy] [-f font] [-m n] [-M dir] [-p n] [-s n]"
+ " [-T name] [file ...]\n"
+ "usage: %s {-v | --version}\n"
+ "usage: %s --help\n",
+ program_name, program_name, program_name);
+}
+
+int main(int argc, char **argv)
+{
+ program_name = argv[0];
+ static char stderr_buf[BUFSIZ];
+ setbuf(stderr, stderr_buf);
+ int opt;
+ int load_startup_file = 1;
+ static const struct option long_options[] = {
+ { "help", no_argument, 0, CHAR_MAX + 1 },
+ { "version", no_argument, 0, 'v' },
+ { NULL, 0, 0, 0 }
+ };
+ while ((opt = getopt_long(argc, argv, "CNrRd:f:m:M:p:s:T:v",
+ long_options, NULL))
+ != EOF)
+ switch (opt) {
+ case 'C':
+ compatible_flag = 1;
+ break;
+ case 'R': // don't load eqnrc
+ load_startup_file = 0;
+ break;
+ case 'M':
+ config_macro_path.command_line_dir(optarg);
+ break;
+ case 'v':
+ printf("GNU eqn (groff) version %s\n", Version_string);
+ exit(EXIT_SUCCESS);
+ break;
+ case 'd':
+ if (optarg[0] == '\0' || optarg[1] == '\0')
+ error("'-d' option requires a two-character argument");
+ else if (is_invalid_input_char(optarg[0]))
+ error("invalid delimiter (%1) in '-d' option argument",
+ input_char_description(optarg[0]));
+ else if (is_invalid_input_char(optarg[1]))
+ error("invalid delimiter (%1) in '-d' option argument",
+ input_char_description(optarg[1]));
+ else {
+ start_delim = optarg[0];
+ end_delim = optarg[1];
+ }
+ break;
+ case 'f':
+ set_gfont(optarg);
+ break;
+ case 'T':
+ device = optarg;
+ if (strcmp(device, "ps:html") == 0) {
+ device = "ps";
+ html = 1;
+ }
+ else if (strcmp(device, "MathML") == 0) {
+ output_format = mathml;
+ load_startup_file = 0;
+ }
+ else if (strcmp(device, "mathml:xhtml") == 0) {
+ device = "MathML";
+ output_format = mathml;
+ load_startup_file = 0;
+ xhtml = 1;
+ }
+ break;
+ case 's':
+ if (set_gsize(optarg))
+ warning("option '-s' is deprecated");
+ else
+ error("invalid size '%1' in '-s' option argument ", optarg);
+ break;
+ case 'p':
+ {
+ int n;
+ if (sscanf(optarg, "%d", &n) == 1) {
+ warning("option '-p' is deprecated");
+ set_script_reduction(n);
+ }
+ else
+ error("invalid size '%1' in '-p' option argument ", optarg);
+ }
+ break;
+ case 'm':
+ {
+ int n;
+ if (sscanf(optarg, "%d", &n) == 1)
+ set_minimum_size(n);
+ else
+ error("invalid size '%1' in '-n' option argument", optarg);
+ }
+ break;
+ case 'r':
+ one_size_reduction_flag = 1;
+ break;
+ case 'N':
+ no_newline_in_delim_flag = 1;
+ break;
+ case CHAR_MAX + 1: // --help
+ usage(stdout);
+ exit(EXIT_SUCCESS);
+ break;
+ case '?':
+ usage(stderr);
+ exit(EXIT_FAILURE);
+ break;
+ default:
+ assert(0 == "unhandled getopt_long return value");
+ }
+ init_table(device);
+ init_char_table();
+ printf(".do if !dEQ .ds EQ\n"
+ ".do if !dEN .ds EN\n");
+ if (output_format == troff) {
+ printf(".if !'\\*(.T'%s' "
+ ".if !'\\*(.T'html' " // the html device uses '-Tps' to render
+ // equations as images
+ ".tm warning: %s should have been given a '-T\\*(.T' option\n",
+ device, program_name);
+ printf(".if '\\*(.T'html' "
+ ".if !'%s'ps' "
+ ".tm warning: %s should have been given a '-Tps' option\n",
+ device, program_name);
+ printf(".if '\\*(.T'html' "
+ ".if !'%s'ps' "
+ ".tm warning: (it is advisable to invoke groff via: groff -Thtml -e)\n",
+ device);
+ }
+ if (load_startup_file) {
+ char *path;
+ FILE *fp = config_macro_path.open_file(STARTUP_FILE, &path);
+ if (fp) {
+ do_file(fp, path);
+ if (fclose(fp) < 0)
+ fatal("unable to close '%1': %2", STARTUP_FILE,
+ strerror(errno));
+ free(path);
+ }
+ }
+ if (optind >= argc)
+ do_file(stdin, "-");
+ else
+ for (int i = optind; i < argc; i++)
+ if (strcmp(argv[i], "-") == 0)
+ do_file(stdin, "-");
+ else {
+ errno = 0;
+ FILE *fp = fopen(argv[i], "r");
+ if (!fp)
+ fatal("unable to open '%1': %2", argv[i], strerror(errno));
+ else {
+ do_file(fp, argv[i]);
+ if (fclose(fp) < 0)
+ fatal("unable to close '%1': %2", argv[i], strerror(errno));
+ }
+ }
+ if (ferror(stdout))
+ fatal("standard output stream is in an error state");
+ if (fflush(stdout) < 0)
+ fatal("unable to flush standard output stream: %1",
+ strerror(errno));
+ exit(EXIT_SUCCESS);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/eqn/mark.cpp b/src/preproc/eqn/mark.cpp
new file mode 100644
index 0000000..9427b10
--- /dev/null
+++ b/src/preproc/eqn/mark.cpp
@@ -0,0 +1,120 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "eqn.h"
+#include "pbox.h"
+
+class mark_box : public pointer_box {
+public:
+ mark_box(box *);
+ int compute_metrics(int);
+ void output();
+ void debug_print();
+};
+
+// we push down marks so that they don't interfere with spacing
+
+box *make_mark_box(box *p)
+{
+ list_box *b = p->to_list_box();
+ if (b != 0) {
+ b->list.p[0] = make_mark_box(b->list.p[0]);
+ return b;
+ }
+ else
+ return new mark_box(p);
+}
+
+mark_box::mark_box(box *pp) : pointer_box(pp)
+{
+}
+
+void mark_box::output()
+{
+ p->output();
+}
+
+int mark_box::compute_metrics(int style)
+{
+ int res = p->compute_metrics(style);
+ if (res)
+ error("multiple marks and lineups");
+ printf(".nr " WIDTH_FORMAT " 0\\n[" WIDTH_FORMAT "]\n", uid, p->uid);
+ printf(".nr " HEIGHT_FORMAT " \\n[" HEIGHT_FORMAT "]\n", uid, p->uid);
+ printf(".nr " DEPTH_FORMAT " \\n[" DEPTH_FORMAT "]\n", uid, p->uid);
+ printf(".nr " MARK_REG " 0\n");
+ return FOUND_MARK;
+}
+
+void mark_box::debug_print()
+{
+ fprintf(stderr, "mark { ");
+ p->debug_print();
+ fprintf(stderr, " }");
+}
+
+
+class lineup_box : public pointer_box {
+public:
+ lineup_box(box *);
+ void output();
+ int compute_metrics(int style);
+ void debug_print();
+};
+
+// we push down lineups so that they don't interfere with spacing
+
+box *make_lineup_box(box *p)
+{
+ list_box *b = p->to_list_box();
+ if (b != 0) {
+ b->list.p[0] = make_lineup_box(b->list.p[0]);
+ return b;
+ }
+ else
+ return new lineup_box(p);
+}
+
+lineup_box::lineup_box(box *pp) : pointer_box(pp)
+{
+}
+
+void lineup_box::output()
+{
+ p->output();
+}
+
+int lineup_box::compute_metrics(int style)
+{
+ int res = p->compute_metrics(style);
+ if (res)
+ error("multiple marks and lineups");
+ printf(".nr " WIDTH_FORMAT " 0\\n[" WIDTH_FORMAT "]\n", uid, p->uid);
+ printf(".nr " HEIGHT_FORMAT " \\n[" HEIGHT_FORMAT "]\n", uid, p->uid);
+ printf(".nr " DEPTH_FORMAT " \\n[" DEPTH_FORMAT "]\n", uid, p->uid);
+ printf(".nr " MARK_REG " 0\n");
+ return FOUND_LINEUP;
+}
+
+void lineup_box::debug_print()
+{
+ fprintf(stderr, "lineup { ");
+ p->debug_print();
+ fprintf(stderr, " }");
+}
diff --git a/src/preproc/eqn/neqn.1.man b/src/preproc/eqn/neqn.1.man
new file mode 100644
index 0000000..758a150
--- /dev/null
+++ b/src/preproc/eqn/neqn.1.man
@@ -0,0 +1,92 @@
+.TH @g@neqn @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+@g@neqn \- format equations for character-cell terminal output
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2001-2020 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_neqn_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY @g@neqn
+.RI [ @g@eqn-argument \~.\|.\|.]
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I @g@neqn
+invokes the
+.MR @g@eqn @MAN1EXT@
+command with the
+.B ascii
+output device.
+.
+.
+.LP
+.I @g@eqn
+does not support low-resolution,
+typewriter-like devices,
+although it may work adequately for very simple input.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.MR @g@eqn @MAN1EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_neqn_1_man_C]
+.do rr *groff_neqn_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=nroff textwidth=72:
diff --git a/src/preproc/eqn/neqn.sh b/src/preproc/eqn/neqn.sh
new file mode 100644
index 0000000..fb8d616
--- /dev/null
+++ b/src/preproc/eqn/neqn.sh
@@ -0,0 +1,26 @@
+#! /bin/sh
+# Copyright (C) 2014-2020 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 of the License (GPL2).
+#
+# 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.
+#
+# The GPL2 license text is available in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.txt>.
+
+# Provision of this shell script should not be taken to imply that use of
+# GNU eqn with groff -Tascii|-Tlatin1|-Tutf8|-Tcp1047 is supported.
+
+@GROFF_BIN_PATH_SETUP@
+PATH="$GROFF_RUNTIME$PATH"
+export PATH
+exec @g@eqn -Tascii ${1+"$@"}
+
+# eof
diff --git a/src/preproc/eqn/other.cpp b/src/preproc/eqn/other.cpp
new file mode 100644
index 0000000..1ddc8fb
--- /dev/null
+++ b/src/preproc/eqn/other.cpp
@@ -0,0 +1,706 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#include "eqn.h"
+#include "pbox.h"
+
+class accent_box : public pointer_box {
+private:
+ box *ab;
+public:
+ accent_box(box *, box *);
+ ~accent_box();
+ int compute_metrics(int);
+ void output();
+ void debug_print();
+ void check_tabs(int);
+};
+
+box *make_accent_box(box *p, box *q)
+{
+ return new accent_box(p, q);
+}
+
+accent_box::accent_box(box *pp, box *qq) : pointer_box(pp), ab(qq)
+{
+}
+
+accent_box::~accent_box()
+{
+ delete ab;
+}
+
+#if 0
+int accent_box::compute_metrics(int style)
+{
+ int r = p->compute_metrics(style);
+ p->compute_skew();
+ ab->compute_metrics(style);
+ printf(".nr " WIDTH_FORMAT " 0\\n[" WIDTH_FORMAT "]\n", uid, p->uid);
+ printf(".nr " DEPTH_FORMAT " \\n[" DEPTH_FORMAT "]\n", uid, p->uid);
+ printf(".nr " SUP_RAISE_FORMAT " \\n[" HEIGHT_FORMAT "]-%dM>?0\n",
+ uid, p->uid, x_height);
+ printf(".nr " HEIGHT_FORMAT " \\n[" HEIGHT_FORMAT "]+\\n["
+ SUP_RAISE_FORMAT "]\n",
+ uid, ab->uid, uid);
+ return r;
+}
+
+void accent_box::output()
+{
+ if (output_format == troff) {
+ printf("\\h'\\n[" WIDTH_FORMAT "]u-\\n[" WIDTH_FORMAT "]u/2u+\\n["
+ SKEW_FORMAT "]u'",
+ p->uid, ab->uid, p->uid);
+ printf("\\v'-\\n[" SUP_RAISE_FORMAT "]u'", uid);
+ ab->output();
+ printf("\\h'-\\n[" WIDTH_FORMAT "]u'", ab->uid);
+ printf("\\v'\\n[" SUP_RAISE_FORMAT "]u'", uid);
+ printf("\\h'-(\\n[" WIDTH_FORMAT "]u-\\n[" WIDTH_FORMAT "]u/2u+\\n["
+ SKEW_FORMAT "]u)'",
+ p->uid, ab->uid, p->uid);
+ p->output();
+ }
+ else if (output_format == mathml) {
+ printf("<mover accent='true'>");
+ p->output();
+ ab->output();
+ printf("</mover>")
+ }
+}
+#endif
+
+/* This version copes with the possibility of an accent's being wider
+than its accentee. LEFT_WIDTH_FORMAT gives the distance from the
+left edge of the resulting box to the middle of the accentee's box.*/
+
+int accent_box::compute_metrics(int style)
+{
+ int r = p->compute_metrics(style);
+ p->compute_skew();
+ ab->compute_metrics(style);
+ printf(".nr " LEFT_WIDTH_FORMAT " 0\\n[" WIDTH_FORMAT "]/2"
+ ">?(\\n[" WIDTH_FORMAT "]/2-\\n[" SKEW_FORMAT "])\n",
+ uid, p->uid, ab->uid, p->uid);
+ printf(".nr " WIDTH_FORMAT " 0\\n[" WIDTH_FORMAT "]/2"
+ ">?(\\n[" WIDTH_FORMAT "]/2+\\n[" SKEW_FORMAT "])"
+ "+\\n[" LEFT_WIDTH_FORMAT "]\n",
+ uid, p->uid, ab->uid, p->uid, uid);
+ printf(".nr " DEPTH_FORMAT " \\n[" DEPTH_FORMAT "]\n", uid, p->uid);
+ printf(".nr " SUP_RAISE_FORMAT " \\n[" HEIGHT_FORMAT "]-%dM>?0\n",
+ uid, p->uid, x_height);
+ printf(".nr " HEIGHT_FORMAT " \\n[" HEIGHT_FORMAT "]+\\n["
+ SUP_RAISE_FORMAT "]\n",
+ uid, ab->uid, uid);
+ if (r)
+ printf(".nr " MARK_REG " +\\n[" LEFT_WIDTH_FORMAT "]"
+ "-(\\n[" WIDTH_FORMAT "]/2)'\n",
+ uid, p->uid);
+ return r;
+}
+
+void accent_box::output()
+{
+ if (output_format == troff) {
+ printf("\\Z" DELIMITER_CHAR);
+ printf("\\h'\\n[" LEFT_WIDTH_FORMAT "]u+\\n[" SKEW_FORMAT "]u"
+ "-(\\n[" WIDTH_FORMAT "]u/2u)'",
+ uid, p->uid, ab->uid);
+ printf("\\v'-\\n[" SUP_RAISE_FORMAT "]u'", uid);
+ ab->output();
+ printf(DELIMITER_CHAR);
+ printf("\\Z" DELIMITER_CHAR);
+ printf("\\h'\\n[" LEFT_WIDTH_FORMAT "]u-(\\n[" WIDTH_FORMAT "]u/2u)'",
+ uid, p->uid);
+ p->output();
+ printf(DELIMITER_CHAR);
+ printf("\\h'\\n[" WIDTH_FORMAT "]u'", uid);
+ }
+ else if (output_format == mathml) {
+ printf("<mover accent='true'>");
+ p->output();
+ ab->output();
+ printf("</mover>");
+ }
+}
+
+void accent_box::check_tabs(int level)
+{
+ ab->check_tabs(level + 1);
+ p->check_tabs(level + 1);
+}
+
+void accent_box::debug_print()
+{
+ fprintf(stderr, "{ ");
+ p->debug_print();
+ fprintf(stderr, " } accent { ");
+ ab->debug_print();
+ fprintf(stderr, " }");
+}
+
+class overline_char_box : public simple_box {
+public:
+ overline_char_box();
+ void output();
+ void debug_print();
+};
+
+overline_char_box::overline_char_box()
+{
+}
+
+void overline_char_box::output()
+{
+ if (output_format == troff) {
+ printf("\\v'-%dM/2u-%dM'", 7*default_rule_thickness, x_height);
+ printf((draw_flag ? "\\D'l%dM 0'" : "\\l'%dM\\&\\(ru'"),
+ accent_width);
+ printf("\\v'%dM/2u+%dM'", 7*default_rule_thickness, x_height);
+ }
+ else if (output_format == mathml)
+ printf("<mo>&macr;</mo>");
+}
+
+void overline_char_box::debug_print()
+{
+ fprintf(stderr, "<overline char>");
+}
+
+class overline_box : public pointer_box {
+public:
+ overline_box(box *);
+ int compute_metrics(int);
+ void output();
+ void debug_print();
+};
+
+box *make_overline_box(box *p)
+{
+ if (p->is_char())
+ return new accent_box(p, new overline_char_box);
+ else
+ return new overline_box(p);
+}
+
+overline_box::overline_box(box *pp) : pointer_box(pp)
+{
+}
+
+int overline_box::compute_metrics(int style)
+{
+ int r = p->compute_metrics(cramped_style(style));
+ // 9
+ printf(".nr " HEIGHT_FORMAT " \\n[" HEIGHT_FORMAT "]+%dM\n",
+ uid, p->uid, default_rule_thickness*5);
+ printf(".nr " WIDTH_FORMAT " 0\\n[" WIDTH_FORMAT "]\n", uid, p->uid);
+ printf(".nr " DEPTH_FORMAT " \\n[" DEPTH_FORMAT "]\n", uid, p->uid);
+ return r;
+}
+
+void overline_box::output()
+{
+ if (output_format == troff) {
+ // 9
+ printf("\\Z" DELIMITER_CHAR);
+ printf("\\v'-\\n[" HEIGHT_FORMAT "]u-(%dM/2u)'",
+ p->uid, 7*default_rule_thickness);
+ if (draw_flag)
+ printf("\\D'l\\n[" WIDTH_FORMAT "]u 0'", p->uid);
+ else
+ printf("\\l'\\n[" WIDTH_FORMAT "]u\\&\\(ru'", p->uid);
+ printf(DELIMITER_CHAR);
+ p->output();
+ }
+ else if (output_format == mathml) {
+ printf("<mover accent='false'>");
+ p->output();
+ printf("<mo>&macr;</mo></mover>");
+ }
+}
+
+void overline_box::debug_print()
+{
+ fprintf(stderr, "{ ");
+ p->debug_print();
+ fprintf(stderr, " } bar");
+}
+
+class uaccent_box : public pointer_box {
+ box *ab;
+public:
+ uaccent_box(box *, box *);
+ ~uaccent_box();
+ int compute_metrics(int);
+ void output();
+ void compute_subscript_kern();
+ void check_tabs(int);
+ void debug_print();
+};
+
+box *make_uaccent_box(box *p, box *q)
+{
+ return new uaccent_box(p, q);
+}
+
+uaccent_box::uaccent_box(box *pp, box *qq)
+: pointer_box(pp), ab(qq)
+{
+}
+
+uaccent_box::~uaccent_box()
+{
+ delete ab;
+}
+
+int uaccent_box::compute_metrics(int style)
+{
+ int r = p->compute_metrics(style);
+ ab->compute_metrics(style);
+ printf(".nr " LEFT_WIDTH_FORMAT " 0\\n[" WIDTH_FORMAT "]/2"
+ ">?(\\n[" WIDTH_FORMAT "]/2)\n",
+ uid, p->uid, ab->uid);
+ printf(".nr " WIDTH_FORMAT " 0\\n[" WIDTH_FORMAT "]/2"
+ ">?(\\n[" WIDTH_FORMAT "]/2)"
+ "+\\n[" LEFT_WIDTH_FORMAT "]\n",
+ uid, p->uid, ab->uid, uid);
+ printf(".nr " HEIGHT_FORMAT " \\n[" HEIGHT_FORMAT "]\n", uid, p->uid);
+ printf(".nr " DEPTH_FORMAT " \\n[" DEPTH_FORMAT "]"
+ "+\\n[" DEPTH_FORMAT "]\n",
+ uid, p->uid, ab->uid);
+ if (r)
+ printf(".nr " MARK_REG " +\\n[" LEFT_WIDTH_FORMAT "]"
+ "-(\\n[" WIDTH_FORMAT "]/2)'\n",
+ uid, p->uid);
+ return r;
+}
+
+void uaccent_box::output()
+{
+ if (output_format == troff) {
+ printf("\\Z" DELIMITER_CHAR);
+ printf("\\h'\\n[" LEFT_WIDTH_FORMAT "]u-(\\n[" WIDTH_FORMAT "]u/2u)'",
+ uid, ab->uid);
+ printf("\\v'\\n[" DEPTH_FORMAT "]u'", p->uid);
+ ab->output();
+ printf(DELIMITER_CHAR);
+ printf("\\Z" DELIMITER_CHAR);
+ printf("\\h'\\n[" LEFT_WIDTH_FORMAT "]u-(\\n[" WIDTH_FORMAT "]u/2u)'",
+ uid, p->uid);
+ p->output();
+ printf(DELIMITER_CHAR);
+ printf("\\h'\\n[" WIDTH_FORMAT "]u'", uid);
+ }
+ else if (output_format == mathml) {
+ printf("<munder accent='true'>");
+ p->output();
+ ab->output();
+ printf("</munder>");
+ }
+}
+
+void uaccent_box::check_tabs(int level)
+{
+ ab->check_tabs(level + 1);
+ p->check_tabs(level + 1);
+}
+
+void uaccent_box::compute_subscript_kern()
+{
+ box::compute_subscript_kern(); // want 0 subscript kern
+}
+
+void uaccent_box::debug_print()
+{
+ fprintf(stderr, "{ ");
+ p->debug_print();
+ fprintf(stderr, " } uaccent { ");
+ ab->debug_print();
+ fprintf(stderr, " }");
+}
+
+class underline_char_box : public simple_box {
+public:
+ underline_char_box();
+ void output();
+ void debug_print();
+};
+
+underline_char_box::underline_char_box()
+{
+}
+
+void underline_char_box::output()
+{
+ if (output_format == troff) {
+ printf("\\v'%dM/2u'", 7*default_rule_thickness);
+ printf((draw_flag ? "\\D'l%dM 0'" : "\\l'%dM\\&\\(ru'"),
+ accent_width);
+ printf("\\v'-%dM/2u'", 7*default_rule_thickness);
+ }
+ else if (output_format == mathml)
+ printf("<mo>&lowbar;</mo>");
+}
+
+void underline_char_box::debug_print()
+{
+ fprintf(stderr, "<underline char>");
+}
+
+
+class underline_box : public pointer_box {
+public:
+ underline_box(box *);
+ int compute_metrics(int);
+ void output();
+ void compute_subscript_kern();
+ void debug_print();
+};
+
+box *make_underline_box(box *p)
+{
+ if (p->is_char())
+ return new uaccent_box(p, new underline_char_box);
+ else
+ return new underline_box(p);
+}
+
+underline_box::underline_box(box *pp) : pointer_box(pp)
+{
+}
+
+int underline_box::compute_metrics(int style)
+{
+ int r = p->compute_metrics(style);
+ // 10
+ printf(".nr " DEPTH_FORMAT " \\n[" DEPTH_FORMAT "]+%dM\n",
+ uid, p->uid, default_rule_thickness*5);
+ printf(".nr " WIDTH_FORMAT " 0\\n[" WIDTH_FORMAT "]\n", uid, p->uid);
+ printf(".nr " HEIGHT_FORMAT " \\n[" HEIGHT_FORMAT "]\n", uid, p->uid);
+ return r;
+}
+
+void underline_box::output()
+{
+ if (output_format == troff) {
+ // 10
+ printf("\\Z" DELIMITER_CHAR);
+ printf("\\v'\\n[" DEPTH_FORMAT "]u+(%dM/2u)'",
+ p->uid, 7*default_rule_thickness);
+ if (draw_flag)
+ printf("\\D'l\\n[" WIDTH_FORMAT "]u 0'", p->uid);
+ else
+ printf("\\l'\\n[" WIDTH_FORMAT "]u\\&\\(ru'", p->uid);
+ printf(DELIMITER_CHAR);
+ p->output();
+ }
+ else if (output_format == mathml) {
+ printf("<munder accent='true'>");
+ p->output();
+ printf("<mo>&macr;</mo></munder>");
+ }
+}
+
+// we want an underline box to have 0 subscript kern
+
+void underline_box::compute_subscript_kern()
+{
+ box::compute_subscript_kern();
+}
+
+void underline_box::debug_print()
+{
+ fprintf(stderr, "{ ");
+ p->debug_print();
+ fprintf(stderr, " } under");
+}
+
+size_box::size_box(char *s, box *pp) : pointer_box(pp), size(s)
+{
+}
+
+int size_box::compute_metrics(int style)
+{
+ printf(".nr " SIZE_FORMAT " \\n[.ps]\n", uid);
+ printf(".ps %s\n", size);
+ printf(".nr " SMALL_SIZE_FORMAT " \\n[.ps]\n", uid);
+ int r = p->compute_metrics(style);
+ printf(".ps \\n[" SIZE_FORMAT "]u\n", uid);
+ printf(".nr " WIDTH_FORMAT " 0\\n[" WIDTH_FORMAT "]\n", uid, p->uid);
+ printf(".nr " HEIGHT_FORMAT " \\n[" HEIGHT_FORMAT "]\n", uid, p->uid);
+ printf(".nr " DEPTH_FORMAT " \\n[" DEPTH_FORMAT "]\n", uid, p->uid);
+ return r;
+}
+
+void size_box::output()
+{
+ if (output_format == troff) {
+ printf("\\s[\\n[" SMALL_SIZE_FORMAT "]u]", uid);
+ p->output();
+ printf("\\s[\\n[" SIZE_FORMAT "]u]", uid);
+ }
+ else if (output_format == mathml) {
+ printf("<mstyle mathsize='%s'>", size);
+ p->output();
+ printf("</mstyle>");
+ }
+}
+
+size_box::~size_box()
+{
+ free(size);
+}
+
+void size_box::debug_print()
+{
+ fprintf(stderr, "size %s { ", size);
+ p->debug_print();
+ fprintf(stderr, " }");
+}
+
+
+font_box::font_box(char *s, box *pp) : pointer_box(pp), f(s)
+{
+}
+
+font_box::~font_box()
+{
+ free(f);
+}
+
+int font_box::compute_metrics(int style)
+{
+ const char *old_roman_font = current_roman_font;
+ current_roman_font = f;
+ printf(".nr " FONT_FORMAT " \\n[.f]\n", uid);
+ printf(".ft %s\n", f);
+ int r = p->compute_metrics(style);
+ current_roman_font = old_roman_font;
+ printf(".ft \\n[" FONT_FORMAT "]\n", uid);
+ printf(".nr " WIDTH_FORMAT " 0\\n[" WIDTH_FORMAT "]\n", uid, p->uid);
+ printf(".nr " HEIGHT_FORMAT " \\n[" HEIGHT_FORMAT "]\n", uid, p->uid);
+ printf(".nr " DEPTH_FORMAT " \\n[" DEPTH_FORMAT "]\n", uid, p->uid);
+ return r;
+}
+
+void font_box::output()
+{
+ if (output_format == troff) {
+ printf("\\f[%s]", f);
+ const char *old_roman_font = current_roman_font;
+ current_roman_font = f;
+ p->output();
+ current_roman_font = old_roman_font;
+ printf("\\f[\\n[" FONT_FORMAT "]]", uid);
+ }
+ else if (output_format == mathml) {
+ const char *mlfont = f;
+ // bold and italic are already in MathML; translate eqn roman here
+ switch (f[0]) {
+ case 'I':
+ case 'i':
+ mlfont = "italic";
+ break;
+ case 'B':
+ case 'b':
+ mlfont = "bold";
+ break;
+ case 'R':
+ case 'r':
+ default:
+ mlfont = "normal";
+ break;
+ }
+ printf("<mstyle mathvariant='%s'>", mlfont);
+ p->output();
+ printf("</mstyle>");
+ }
+}
+
+void font_box::debug_print()
+{
+ fprintf(stderr, "font %s { ", f);
+ p->debug_print();
+ fprintf(stderr, " }");
+}
+
+fat_box::fat_box(box *pp) : pointer_box(pp)
+{
+}
+
+int fat_box::compute_metrics(int style)
+{
+ int r = p->compute_metrics(style);
+ printf(".nr " WIDTH_FORMAT " 0\\n[" WIDTH_FORMAT "]+%dM\n",
+ uid, p->uid, fat_offset);
+ printf(".nr " HEIGHT_FORMAT " \\n[" HEIGHT_FORMAT "]\n", uid, p->uid);
+ printf(".nr " DEPTH_FORMAT " \\n[" DEPTH_FORMAT "]\n", uid, p->uid);
+ return r;
+}
+
+void fat_box::output()
+{
+ if (output_format == troff) {
+ p->output();
+ printf("\\h'-\\n[" WIDTH_FORMAT "]u'", p->uid);
+ printf("\\h'%dM'", fat_offset);
+ p->output();
+ }
+ else if (output_format == mathml) {
+ printf("<mstyle mathvariant='double-struck'>");
+ p->output();
+ printf("</mstyle>");
+ }
+}
+
+
+void fat_box::debug_print()
+{
+ fprintf(stderr, "fat { ");
+ p->debug_print();
+ fprintf(stderr, " }");
+}
+
+
+vmotion_box::vmotion_box(int i, box *pp) : pointer_box(pp), n(i)
+{
+}
+
+int vmotion_box::compute_metrics(int style)
+{
+ int r = p->compute_metrics(style);
+ printf(".nr " WIDTH_FORMAT " 0\\n[" WIDTH_FORMAT "]\n", uid, p->uid);
+ if (n > 0) {
+ printf(".nr " HEIGHT_FORMAT " %dM+\\n[" HEIGHT_FORMAT "]\n",
+ uid, n, p->uid);
+ printf(".nr " DEPTH_FORMAT " \\n[" DEPTH_FORMAT "]\n", uid, p->uid);
+ }
+ else {
+ printf(".nr " DEPTH_FORMAT " %dM+\\n[" DEPTH_FORMAT "]>?0\n",
+ uid, -n, p->uid);
+ printf(".nr " HEIGHT_FORMAT " \\n[" HEIGHT_FORMAT "]\n",
+ uid, p->uid);
+ }
+ return r;
+}
+
+void vmotion_box::output()
+{
+ if (output_format == troff) {
+ printf("\\v'%dM'", -n);
+ p->output();
+ printf("\\v'%dM'", n);
+ }
+ else if (output_format == mathml) {
+ printf("<merror>eqn vertical motion cannot be expressed "
+ "in MathML</merror>");
+ p->output();
+ }
+}
+
+void vmotion_box::debug_print()
+{
+ if (n >= 0)
+ fprintf(stderr, "up %d { ", n);
+ else
+ fprintf(stderr, "down %d { ", -n);
+ p->debug_print();
+ fprintf(stderr, " }");
+}
+
+hmotion_box::hmotion_box(int i, box *pp) : pointer_box(pp), n(i)
+{
+}
+
+int hmotion_box::compute_metrics(int style)
+{
+ int r = p->compute_metrics(style);
+ printf(".nr " WIDTH_FORMAT " 0\\n[" WIDTH_FORMAT "]+%dM\n",
+ uid, p->uid, n);
+ printf(".nr " HEIGHT_FORMAT " \\n[" HEIGHT_FORMAT "]\n", uid, p->uid);
+ printf(".nr " DEPTH_FORMAT " \\n[" DEPTH_FORMAT "]\n", uid, p->uid);
+ if (r)
+ printf(".nr " MARK_REG " +%dM\n", n);
+ return r;
+}
+
+void hmotion_box::output()
+{
+ if (output_format == troff) {
+ printf("\\h'%dM'", n);
+ p->output();
+ }
+ else if (output_format == mathml) {
+ printf("<merror>eqn horizontal motion cannot be expressed "
+ "in MathML</merror>");
+ p->output();
+ }
+}
+
+void hmotion_box::debug_print()
+{
+ if (n >= 0)
+ fprintf(stderr, "fwd %d { ", n);
+ else
+ fprintf(stderr, "back %d { ", -n);
+ p->debug_print();
+ fprintf(stderr, " }");
+}
+
+vcenter_box::vcenter_box(box *pp) : pointer_box(pp)
+{
+}
+
+int vcenter_box::compute_metrics(int style)
+{
+ int r = p->compute_metrics(style);
+ printf(".nr " WIDTH_FORMAT " 0\\n[" WIDTH_FORMAT "]\n", uid, p->uid);
+ printf(".nr " SUP_RAISE_FORMAT " \\n[" DEPTH_FORMAT "]-\\n["
+ HEIGHT_FORMAT "]/2+%dM\n",
+ uid, p->uid, p->uid, axis_height);
+ printf(".nr " HEIGHT_FORMAT " \\n[" HEIGHT_FORMAT "]+\\n["
+ SUP_RAISE_FORMAT "]>?0\n", uid, p->uid, uid);
+ printf(".nr " DEPTH_FORMAT " \\n[" DEPTH_FORMAT "]-\\n["
+ SUP_RAISE_FORMAT "]>?0\n", uid, p->uid, uid);
+
+ return r;
+}
+
+void vcenter_box::output()
+{
+ if (output_format == troff)
+ printf("\\v'-\\n[" SUP_RAISE_FORMAT "]u'", uid);
+ p->output();
+ if (output_format == troff)
+ printf("\\v'\\n[" SUP_RAISE_FORMAT "]u'", uid);
+}
+
+void vcenter_box::debug_print()
+{
+ fprintf(stderr, "vcenter { ");
+ p->debug_print();
+ fprintf(stderr, " }");
+}
+
diff --git a/src/preproc/eqn/over.cpp b/src/preproc/eqn/over.cpp
new file mode 100644
index 0000000..6a9cd9b
--- /dev/null
+++ b/src/preproc/eqn/over.cpp
@@ -0,0 +1,204 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "eqn.h"
+#include "pbox.h"
+
+class over_box : public box {
+private:
+ int reduce_size;
+ box *num;
+ box *den;
+public:
+ over_box(int small, box *, box *);
+ ~over_box();
+ void debug_print();
+ int compute_metrics(int);
+ void output();
+ void check_tabs(int);
+};
+
+box *make_over_box(box *pp, box *qq)
+{
+ return new over_box(0, pp, qq);
+}
+
+box *make_small_over_box(box *pp, box *qq)
+{
+ return new over_box(1, pp, qq);
+}
+
+over_box::over_box(int is_small, box *pp, box *qq)
+: reduce_size(is_small), num(pp), den(qq)
+{
+ spacing_type = INNER_TYPE;
+}
+
+over_box::~over_box()
+{
+ delete num;
+ delete den;
+}
+
+int over_box::compute_metrics(int style)
+{
+ if (reduce_size) {
+ style = script_style(style);
+ printf(".nr " SIZE_FORMAT " \\n[.ps]\n", uid);
+ set_script_size();
+ printf(".nr " SMALL_SIZE_FORMAT " \\n[.ps]\n", uid);
+ }
+ int mark_uid = 0;
+ int res = num->compute_metrics(style);
+ if (res)
+ mark_uid = num->uid;
+ int r = den->compute_metrics(cramped_style(style));
+ if (r && res)
+ error("multiple marks and lineups");
+ else {
+ mark_uid = den->uid;
+ res = r;
+ }
+ if (reduce_size)
+ printf(".ps \\n[" SIZE_FORMAT "]u\n", uid);
+ printf(".nr " WIDTH_FORMAT " (\\n[" WIDTH_FORMAT "]>?\\n[" WIDTH_FORMAT "]",
+ uid, num->uid, den->uid);
+ // allow for \(ru being wider than both the numerator and denominator
+ if (!draw_flag)
+ fputs(">?\\w" DELIMITER_CHAR "\\(ru" DELIMITER_CHAR, stdout);
+ printf(")+%dM\n", null_delimiter_space*2 + over_hang*2);
+ // 15b
+ printf(".nr " SUP_RAISE_FORMAT " %dM\n",
+ uid, (reduce_size ? num2 : num1));
+ printf(".nr " SUB_LOWER_FORMAT " %dM\n",
+ uid, (reduce_size ? denom2 : denom1));
+
+ // 15d
+ printf(".nr " SUP_RAISE_FORMAT " +(\\n[" DEPTH_FORMAT
+ "]-\\n[" SUP_RAISE_FORMAT "]+%dM+(%dM/2)+%dM)>?0\n",
+ uid, num->uid, uid, axis_height, default_rule_thickness,
+ default_rule_thickness*(reduce_size ? 1 : 3));
+ printf(".nr " SUB_LOWER_FORMAT " +(\\n[" HEIGHT_FORMAT
+ "]-\\n[" SUB_LOWER_FORMAT "]-%dM+(%dM/2)+%dM)>?0\n",
+ uid, den->uid, uid, axis_height, default_rule_thickness,
+ default_rule_thickness*(reduce_size ? 1 : 3));
+
+
+ printf(".nr " HEIGHT_FORMAT " \\n[" SUP_RAISE_FORMAT "]+\\n["
+ HEIGHT_FORMAT "]\n",
+ uid, uid, num->uid);
+ printf(".nr " DEPTH_FORMAT " \\n[" SUB_LOWER_FORMAT "]+\\n["
+ DEPTH_FORMAT "]\n",
+ uid, uid, den->uid);
+ if (res)
+ printf(".nr " MARK_REG " +(\\n[" WIDTH_FORMAT "]-\\n["
+ WIDTH_FORMAT "]/2)\n", uid, mark_uid);
+ return res;
+}
+
+#define USE_Z
+
+void over_box::output()
+{
+ if (output_format == troff) {
+ if (reduce_size)
+ printf("\\s[\\n[" SMALL_SIZE_FORMAT "]u]", uid);
+ #ifdef USE_Z
+ printf("\\Z" DELIMITER_CHAR);
+ #endif
+ // move up to the numerator baseline
+ printf("\\v'-\\n[" SUP_RAISE_FORMAT "]u'", uid);
+ // move across so that it's centered
+ printf("\\h'\\n[" WIDTH_FORMAT "]u-\\n[" WIDTH_FORMAT "]u/2u'",
+ uid, num->uid);
+
+ // print the numerator
+ num->output();
+
+ #ifdef USE_Z
+ printf(DELIMITER_CHAR);
+ #else
+ // back again
+ printf("\\h'-\\n[" WIDTH_FORMAT "]u'", num->uid);
+ printf("\\h'-(\\n[" WIDTH_FORMAT "]u-\\n[" WIDTH_FORMAT "]u/2u)'",
+ uid, num->uid);
+ // down again
+ printf("\\v'\\n[" SUP_RAISE_FORMAT "]u'", uid);
+ #endif
+ #ifdef USE_Z
+ printf("\\Z" DELIMITER_CHAR);
+ #endif
+ // move down to the denominator baseline
+ printf("\\v'\\n[" SUB_LOWER_FORMAT "]u'", uid);
+
+ // move across so that it's centered
+ printf("\\h'\\n[" WIDTH_FORMAT "]u-\\n[" WIDTH_FORMAT "]u/2u'",
+ uid, den->uid);
+
+ // print the denominator
+ den->output();
+
+ #ifdef USE_Z
+ printf(DELIMITER_CHAR);
+ #else
+ // back again
+ printf("\\h'-\\n[" WIDTH_FORMAT "]u'", den->uid);
+ printf("\\h'-(\\n[" WIDTH_FORMAT "]u-\\n[" WIDTH_FORMAT "]u/2u)'",
+ uid, den->uid);
+ // up again
+ printf("\\v'-\\n[" SUB_LOWER_FORMAT "]u'", uid);
+ #endif
+ if (reduce_size)
+ printf("\\s[\\n[" SIZE_FORMAT "]u]", uid);
+ // draw the line
+ printf("\\h'%dM'", null_delimiter_space);
+ printf("\\v'-%dM'", axis_height);
+ fputs(draw_flag ? "\\D'l" : "\\l'", stdout);
+ printf("\\n[" WIDTH_FORMAT "]u-%dM",
+ uid, 2*null_delimiter_space);
+ fputs(draw_flag ? " 0'" : "\\&\\(ru'", stdout);
+ printf("\\v'%dM'", axis_height);
+ printf("\\h'%dM'", null_delimiter_space);
+ }
+ else if (output_format == mathml) {
+ // FIXME: passing a displaystyle attribute doesn't validate.
+ printf("<mfrac>");
+ num->output();
+ den->output();
+ printf("</mfrac>");
+ }
+}
+
+void over_box::debug_print()
+{
+ fprintf(stderr, "{ ");
+ num->debug_print();
+ if (reduce_size)
+ fprintf(stderr, " } smallover { ");
+ else
+ fprintf(stderr, " } over { ");
+ den->debug_print();
+ fprintf(stderr, " }");
+}
+
+void over_box::check_tabs(int level)
+{
+ num->check_tabs(level + 1);
+ den->check_tabs(level + 1);
+}
diff --git a/src/preproc/eqn/pbox.h b/src/preproc/eqn/pbox.h
new file mode 100644
index 0000000..b185419
--- /dev/null
+++ b/src/preproc/eqn/pbox.h
@@ -0,0 +1,140 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+extern int fat_offset;
+
+extern int over_hang;
+extern int accent_width;
+
+extern int delimiter_factor;
+extern int delimiter_shortfall;
+
+extern int null_delimiter_space;
+extern int script_space;
+extern int thin_space;
+extern int medium_space;
+extern int thick_space;
+
+extern int num1;
+extern int num2;
+// we don't use num3, because we don't have \atop
+extern int denom1;
+extern int denom2;
+extern int axis_height;
+extern int sup1;
+extern int sup2;
+extern int sup3;
+extern int default_rule_thickness;
+extern int sub1;
+extern int sub2;
+extern int sup_drop;
+extern int sub_drop;
+extern int x_height;
+extern int big_op_spacing1;
+extern int big_op_spacing2;
+extern int big_op_spacing3;
+extern int big_op_spacing4;
+extern int big_op_spacing5;
+
+extern int baseline_sep;
+extern int shift_down;
+extern int column_sep;
+extern int matrix_side_sep;
+
+// ms.eqn relies on this!
+
+#define LINE_STRING "10"
+#define MARK_OR_LINEUP_FLAG_REG "MK"
+
+#define WIDTH_FORMAT PREFIX "w%d"
+#define HEIGHT_FORMAT PREFIX "h%d"
+#define DEPTH_FORMAT PREFIX "d%d"
+#define TOTAL_FORMAT PREFIX "t%d"
+#define SIZE_FORMAT PREFIX "z%d"
+#define SMALL_SIZE_FORMAT PREFIX "Z%d"
+#define SUP_RAISE_FORMAT PREFIX "p%d"
+#define SUB_LOWER_FORMAT PREFIX "b%d"
+#define SUB_KERN_FORMAT PREFIX "k%d"
+#define FONT_FORMAT PREFIX "f%d"
+#define SKEW_FORMAT PREFIX "s%d"
+#define LEFT_WIDTH_FORMAT PREFIX "lw%d"
+#define LEFT_DELIM_STRING_FORMAT PREFIX "l%d"
+#define RIGHT_DELIM_STRING_FORMAT PREFIX "r%d"
+#define SQRT_STRING_FORMAT PREFIX "sqr%d"
+#define SQRT_WIDTH_FORMAT PREFIX "sq%d"
+#define BASELINE_SEP_FORMAT PREFIX "bs%d"
+// this needs two parameters, the uid and the column index
+#define COLUMN_WIDTH_FORMAT PREFIX "cw%d,%d"
+
+#define BAR_STRING PREFIX "sqb"
+#define TEMP_REG PREFIX "temp"
+#define MARK_REG PREFIX "mark"
+#define MARK_WIDTH_REG PREFIX "mwidth"
+#define SAVED_MARK_REG PREFIX "smark"
+#define MAX_SIZE_REG PREFIX "mxsz"
+#define REPEAT_APPEND_STRING_MACRO PREFIX "ras"
+#define TOP_HEIGHT_REG PREFIX "th"
+#define TOP_DEPTH_REG PREFIX "td"
+#define MID_HEIGHT_REG PREFIX "mh"
+#define MID_DEPTH_REG PREFIX "md"
+#define BOT_HEIGHT_REG PREFIX "bh"
+#define BOT_DEPTH_REG PREFIX "bd"
+#define EXT_HEIGHT_REG PREFIX "eh"
+#define EXT_DEPTH_REG PREFIX "ed"
+#define TOTAL_HEIGHT_REG PREFIX "tot"
+#define DELTA_REG PREFIX "delta"
+#define DELIM_STRING PREFIX "delim"
+#define DELIM_WIDTH_REG PREFIX "dwidth"
+#define SAVED_FONT_REG PREFIX "sfont"
+#define SAVED_PREV_FONT_REG PREFIX "spfont"
+#define SAVED_INLINE_FONT_REG PREFIX "sifont"
+#define SAVED_INLINE_PREV_FONT_REG PREFIX "sipfont"
+#define SAVED_SIZE_REG PREFIX "ssize"
+#define SAVED_INLINE_SIZE_REG PREFIX "sisize"
+#define SAVED_INLINE_PREV_SIZE_REG PREFIX "sipsize"
+#define SAVE_FONT_STRING PREFIX "sfont"
+#define RESTORE_FONT_STRING PREFIX "rfont"
+#define INDEX_REG PREFIX "i"
+#define TEMP_MACRO PREFIX "tempmac"
+
+#define DELIMITER_CHAR "\\(EQ"
+
+const int CRAMPED_SCRIPT_STYLE = 0;
+const int SCRIPT_STYLE = 1;
+const int CRAMPED_DISPLAY_STYLE = 2;
+const int DISPLAY_STYLE = 3;
+
+extern int script_style(int);
+extern int cramped_style(int);
+
+const int ORDINARY_TYPE = 0;
+const int OPERATOR_TYPE = 1;
+const int BINARY_TYPE = 2;
+const int RELATION_TYPE = 3;
+const int OPENING_TYPE = 4;
+const int CLOSING_TYPE = 5;
+const int PUNCTUATION_TYPE = 6;
+const int INNER_TYPE = 7;
+const int SUPPRESS_TYPE = 8;
+
+void set_script_size();
+
+enum { HINT_PREV_IS_ITALIC = 01, HINT_NEXT_IS_ITALIC = 02 };
+
+extern const char *current_roman_font;
diff --git a/src/preproc/eqn/pile.cpp b/src/preproc/eqn/pile.cpp
new file mode 100644
index 0000000..fcc2e92
--- /dev/null
+++ b/src/preproc/eqn/pile.cpp
@@ -0,0 +1,354 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+// piles and matrices
+
+#include <assert.h>
+
+#include "eqn.h"
+#include "pbox.h"
+
+// SUP_RAISE_FORMAT gives the first baseline
+// BASELINE_SEP_FORMAT gives the separation between baselines
+
+int pile_box::compute_metrics(int style)
+{
+ int i;
+ for (i = 0; i < col.len; i++)
+ col.p[i]->compute_metrics(style);
+ printf(".nr " WIDTH_FORMAT " 0", uid);
+ for (i = 0; i < col.len; i++)
+ printf(">?\\n[" WIDTH_FORMAT "]", col.p[i]->uid);
+ printf("\n");
+ printf(".nr " BASELINE_SEP_FORMAT " %dM",
+ uid, baseline_sep+col.space);
+ for (i = 1; i < col.len; i++)
+ printf(">?(\\n[" DEPTH_FORMAT "]+\\n[" HEIGHT_FORMAT "]+%dM)",
+ col.p[i-1]->uid, col.p[i]->uid, default_rule_thickness*5);
+ // round it so that it's a multiple of the vertical motion quantum
+ printf("+(\\n(.V/2)/\\n(.V*\\n(.V\n");
+
+ printf(".nr " SUP_RAISE_FORMAT " \\n[" BASELINE_SEP_FORMAT "]*%d/2"
+ "+%dM\n",
+ uid, uid, col.len-1, axis_height - shift_down);
+ printf(".nr " HEIGHT_FORMAT " \\n[" SUP_RAISE_FORMAT "]+\\n["
+ HEIGHT_FORMAT "]\n",
+ uid, uid, col.p[0]->uid);
+ printf(".nr " DEPTH_FORMAT " \\n[" BASELINE_SEP_FORMAT "]*%d+\\n["
+ DEPTH_FORMAT "]-\\n[" SUP_RAISE_FORMAT "]\n",
+ uid, uid, col.len-1, col.p[col.len-1]->uid, uid);
+ return FOUND_NOTHING;
+}
+
+void pile_box::output()
+{
+ if (output_format == troff) {
+ int i;
+ printf("\\v'-\\n[" SUP_RAISE_FORMAT "]u'", uid);
+ for (i = 0; i < col.len; i++) {
+ switch (col.align) {
+ case LEFT_ALIGN:
+ break;
+ case CENTER_ALIGN:
+ printf("\\h'\\n[" WIDTH_FORMAT "]u-\\n[" WIDTH_FORMAT "]u/2u'",
+ uid, col.p[i]->uid);
+ break;
+ case RIGHT_ALIGN:
+ printf("\\h'\\n[" WIDTH_FORMAT "]u-\\n[" WIDTH_FORMAT "]u'",
+ uid, col.p[i]->uid);
+ break;
+ default:
+ assert(0);
+ }
+ col.p[i]->output();
+ printf("\\h'-\\n[" WIDTH_FORMAT "]u'", col.p[i]->uid);
+ switch (col.align) {
+ case LEFT_ALIGN:
+ break;
+ case CENTER_ALIGN:
+ printf("\\h'\\n[" WIDTH_FORMAT "]u-\\n[" WIDTH_FORMAT "]u/2u'",
+ col.p[i]->uid, uid);
+ break;
+ case RIGHT_ALIGN:
+ printf("\\h'\\n[" WIDTH_FORMAT "]u-\\n[" WIDTH_FORMAT "]u'",
+ col.p[i]->uid, uid);
+ break;
+ default:
+ assert(0);
+ }
+ if (i != col.len - 1)
+ printf("\\v'\\n[" BASELINE_SEP_FORMAT "]u'", uid);
+ }
+ printf("\\v'\\n[" SUP_RAISE_FORMAT "]u'", uid);
+ printf("\\v'-(%du*\\n[" BASELINE_SEP_FORMAT "]u)'", col.len - 1, uid);
+ printf("\\h'\\n[" WIDTH_FORMAT "]u'", uid);
+ }
+ else if (output_format == mathml) {
+ const char *av;
+ switch (col.align) {
+ case LEFT_ALIGN:
+ av = "left";
+ break;
+ case RIGHT_ALIGN:
+ av = "right";
+ break;
+ case CENTER_ALIGN:
+ av = "center";
+ break;
+ default:
+ assert(0);
+ }
+ printf("<mtable columnalign='%s'>", av);
+ for (int i = 0; i < col.len; i++) {
+ printf("<mtr><mtd>");
+ col.p[i]->output();
+ printf("</mtd></mtr>");
+ }
+ printf("</mtable>");
+ }
+}
+
+pile_box::pile_box(box *pp) : col(pp)
+{
+}
+
+void pile_box::check_tabs(int level)
+{
+ col.list_check_tabs(level);
+}
+
+void pile_box::debug_print()
+{
+ col.debug_print("pile");
+}
+
+int matrix_box::compute_metrics(int style)
+{
+ int i, j;
+ int max_len = 0;
+ int space = 0;
+ for (i = 0; i < len; i++) {
+ for (j = 0; j < p[i]->len; j++)
+ p[i]->p[j]->compute_metrics(style);
+ if (p[i]->len > max_len)
+ max_len = p[i]->len;
+ if (p[i]->space > space)
+ space = p[i]->space;
+ }
+ for (i = 0; i < len; i++) {
+ printf(".nr " COLUMN_WIDTH_FORMAT " 0", uid, i);
+ for (j = 0; j < p[i]->len; j++)
+ printf(">?\\n[" WIDTH_FORMAT "]", p[i]->p[j]->uid);
+ printf("\n");
+ }
+ printf(".nr " WIDTH_FORMAT " %dM",
+ uid, column_sep*(len-1)+2*matrix_side_sep);
+ for (i = 0; i < len; i++)
+ printf("+\\n[" COLUMN_WIDTH_FORMAT "]", uid, i);
+ printf("\n");
+ printf(".nr " BASELINE_SEP_FORMAT " %dM",
+ uid, baseline_sep+space);
+ for (i = 0; i < len; i++)
+ for (j = 1; j < p[i]->len; j++)
+ printf(">?(\\n[" DEPTH_FORMAT "]+\\n[" HEIGHT_FORMAT "]+%dM)",
+ p[i]->p[j-1]->uid, p[i]->p[j]->uid, default_rule_thickness*5);
+ // round it so that it's a multiple of the vertical motion quantum
+ printf("+(\\n(.V/2)/\\n(.V*\\n(.V\n");
+ printf(".nr " SUP_RAISE_FORMAT " \\n[" BASELINE_SEP_FORMAT "]*%d/2"
+ "+%dM\n",
+ uid, uid, max_len-1, axis_height - shift_down);
+ printf(".nr " HEIGHT_FORMAT " 0\\n[" SUP_RAISE_FORMAT "]+(0",
+ uid, uid);
+ for (i = 0; i < len; i++)
+ printf(">?\\n[" HEIGHT_FORMAT "]", p[i]->p[0]->uid);
+ printf(")>?0\n");
+ printf(".nr " DEPTH_FORMAT " \\n[" BASELINE_SEP_FORMAT "]*%d-\\n["
+ SUP_RAISE_FORMAT "]+(0",
+ uid, uid, max_len-1, uid);
+ for (i = 0; i < len; i++)
+ if (p[i]->len == max_len)
+ printf(">?\\n[" DEPTH_FORMAT "]", p[i]->p[max_len-1]->uid);
+ printf(")>?0\n");
+ return FOUND_NOTHING;
+}
+
+void matrix_box::output()
+{
+ if (output_format == troff) {
+ printf("\\h'%dM'", matrix_side_sep);
+ for (int i = 0; i < len; i++) {
+ int j;
+ printf("\\v'-\\n[" SUP_RAISE_FORMAT "]u'", uid);
+ for (j = 0; j < p[i]->len; j++) {
+ switch (p[i]->align) {
+ case LEFT_ALIGN:
+ break;
+ case CENTER_ALIGN:
+ printf("\\h'\\n[" COLUMN_WIDTH_FORMAT "]u-\\n[" WIDTH_FORMAT "]u/2u'",
+ uid, i, p[i]->p[j]->uid);
+ break;
+ case RIGHT_ALIGN:
+ printf("\\h'\\n[" COLUMN_WIDTH_FORMAT "]u-\\n[" WIDTH_FORMAT "]u'",
+ uid, i, p[i]->p[j]->uid);
+ break;
+ default:
+ assert(0);
+ }
+ p[i]->p[j]->output();
+ printf("\\h'-\\n[" WIDTH_FORMAT "]u'", p[i]->p[j]->uid);
+ switch (p[i]->align) {
+ case LEFT_ALIGN:
+ break;
+ case CENTER_ALIGN:
+ printf("\\h'\\n[" WIDTH_FORMAT "]u-\\n[" COLUMN_WIDTH_FORMAT "]u/2u'",
+ p[i]->p[j]->uid, uid, i);
+ break;
+ case RIGHT_ALIGN:
+ printf("\\h'\\n[" WIDTH_FORMAT "]u-\\n[" COLUMN_WIDTH_FORMAT "]u'",
+ p[i]->p[j]->uid, uid, i);
+ break;
+ default:
+ assert(0);
+ }
+ if (j != p[i]->len - 1)
+ printf("\\v'\\n[" BASELINE_SEP_FORMAT "]u'", uid);
+ }
+ printf("\\v'\\n[" SUP_RAISE_FORMAT "]u'", uid);
+ printf("\\v'-(%du*\\n[" BASELINE_SEP_FORMAT "]u)'", p[i]->len - 1, uid);
+ printf("\\h'\\n[" COLUMN_WIDTH_FORMAT "]u'", uid, i);
+ if (i != len - 1)
+ printf("\\h'%dM'", column_sep);
+ }
+ printf("\\h'%dM'", matrix_side_sep);
+ }
+ else if (output_format == mathml) {
+ int n = p[0]->len; // Each column must have the same number of rows in it
+ printf("<mtable>");
+ for (int i = 0; i < n; i++) {
+ printf("<mtr>");
+ for (int j = 0; j < len; j++) {
+ const char *av;
+ switch (p[j]->align) {
+ case LEFT_ALIGN:
+ av = "left";
+ break;
+ case RIGHT_ALIGN:
+ av = "right";
+ break;
+ case CENTER_ALIGN:
+ av = "center";
+ break;
+ default:
+ assert(0);
+ }
+ printf("<mtd columnalign='%s'>", av);
+ p[j]->p[i]->output();
+ printf("</mtd>");
+ }
+ printf("</mtr>");
+ }
+ printf("</mtable>");
+ }
+}
+
+matrix_box::matrix_box(column *pp)
+{
+ p = new column*[10];
+ for (int i = 0; i < 10; i++)
+ p[i] = 0;
+ maxlen = 10;
+ len = 1;
+ p[0] = pp;
+}
+
+matrix_box::~matrix_box()
+{
+ for (int i = 0; i < len; i++)
+ delete p[i];
+ delete[] p;
+}
+
+void matrix_box::append(column *pp)
+{
+ if (len + 1 > maxlen) {
+ column **oldp = p;
+ maxlen *= 2;
+ p = new column*[maxlen];
+ memcpy(p, oldp, sizeof(column*)*len);
+ delete[] oldp;
+ }
+ p[len++] = pp;
+}
+
+void matrix_box::check_tabs(int level)
+{
+ for (int i = 0; i < len; i++)
+ p[i]->list_check_tabs(level);
+}
+
+void matrix_box::debug_print()
+{
+ fprintf(stderr, "matrix { ");
+ p[0]->debug_print("col");
+ for (int i = 1; i < len; i++) {
+ fprintf(stderr, " ");
+ p[i]->debug_print("col");
+ }
+ fprintf(stderr, " }");
+}
+
+column::column(box *pp) : box_list(pp), align(CENTER_ALIGN), space(0)
+{
+}
+
+void column::set_alignment(alignment a)
+{
+ align = a;
+}
+
+void column::set_space(int n)
+{
+ space = n;
+}
+
+void column::debug_print(const char *s)
+{
+ char c = '\0'; // shut up -Wall
+ switch (align) {
+ case LEFT_ALIGN:
+ c = 'l';
+ break;
+ case RIGHT_ALIGN:
+ c = 'r';
+ break;
+ case CENTER_ALIGN:
+ c = 'c';
+ break;
+ default:
+ assert(0);
+ }
+ fprintf(stderr, "%c%s %d { ", c, s, space);
+ list_debug_print(" above ");
+ fprintf(stderr, " }");
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/eqn/script.cpp b/src/preproc/eqn/script.cpp
new file mode 100644
index 0000000..f485eb9
--- /dev/null
+++ b/src/preproc/eqn/script.cpp
@@ -0,0 +1,250 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <assert.h>
+
+#include "eqn.h"
+#include "pbox.h"
+
+class script_box : public pointer_box {
+private:
+ box *sub;
+ box *sup;
+public:
+ script_box(box *, box *, box *);
+ ~script_box();
+ int compute_metrics(int);
+ void output();
+ void debug_print();
+ int left_is_italic();
+ void hint(unsigned);
+ void check_tabs(int);
+};
+
+/* The idea is that the script should attach to the rightmost box
+of a list. For example, given '2x sup 3', the superscript should
+attach to 'x' rather than '2x'. */
+
+box *make_script_box(box *nuc, box *sub, box *sup)
+{
+ list_box *b = nuc->to_list_box();
+ if (b != 0) {
+ b->list.p[b->list.len-1] = make_script_box(b->list.p[b->list.len - 1],
+ sub,
+ sup);
+ return b;
+ }
+ else
+ return new script_box(nuc, sub, sup);
+}
+
+script_box::script_box(box *pp, box *qq, box *rr)
+: pointer_box(pp), sub(qq), sup(rr)
+{
+}
+
+script_box::~script_box()
+{
+ delete sub;
+ delete sup;
+}
+
+int script_box::left_is_italic()
+{
+ return p->left_is_italic();
+}
+
+int script_box::compute_metrics(int style)
+{
+ int res = p->compute_metrics(style);
+ p->compute_subscript_kern();
+ printf(".nr " SIZE_FORMAT " \\n[.ps]\n", uid);
+ if (!(style <= SCRIPT_STYLE && one_size_reduction_flag))
+ set_script_size();
+ printf(".nr " SMALL_SIZE_FORMAT " \\n[.ps]\n", uid);
+ if (sub != 0)
+ sub->compute_metrics(cramped_style(script_style(style)));
+ if (sup != 0)
+ sup->compute_metrics(script_style(style));
+ // 18a
+ if (p->is_char()) {
+ printf(".nr " SUP_RAISE_FORMAT " 0\n", uid);
+ printf(".nr " SUB_LOWER_FORMAT " 0\n", uid);
+ }
+ else {
+ printf(".nr " SUP_RAISE_FORMAT " \\n[" HEIGHT_FORMAT "]-%dM>?0\n",
+ uid, p->uid, sup_drop);
+ printf(".nr " SUB_LOWER_FORMAT " \\n[" DEPTH_FORMAT "]+%dM\n",
+ uid, p->uid, sub_drop);
+ }
+ printf(".ps \\n[" SIZE_FORMAT "]u\n", uid);
+ if (sup == 0) {
+ assert(sub != 0);
+ // 18b
+ printf(".nr " SUB_LOWER_FORMAT " \\n[" SUB_LOWER_FORMAT "]>?%dM>?(\\n["
+ HEIGHT_FORMAT "]-(%dM*4/5))\n",
+ uid, uid, sub1, sub->uid, x_height);
+ }
+ else {
+ // sup != 0
+ // 18c
+ int pos;
+ if (style == DISPLAY_STYLE)
+ pos = sup1;
+ else if (style & 1) // not cramped
+ pos = sup2;
+ else
+ pos = sup3;
+ printf(".nr " SUP_RAISE_FORMAT " \\n[" SUP_RAISE_FORMAT
+ "]>?%dM>?(\\n[" DEPTH_FORMAT "]+(%dM/4))\n",
+ uid, uid, pos, sup->uid, x_height);
+ // 18d
+ if (sub != 0) {
+ printf(".nr " SUB_LOWER_FORMAT " \\n[" SUB_LOWER_FORMAT "]>?%dM\n",
+ uid, uid, sub2);
+ // 18e
+ printf(".nr " TEMP_REG " \\n[" DEPTH_FORMAT "]-\\n["
+ SUP_RAISE_FORMAT "]+\\n[" HEIGHT_FORMAT "]-\\n["
+ SUB_LOWER_FORMAT "]+(4*%dM)\n",
+ sup->uid, uid, sub->uid, uid, default_rule_thickness);
+ printf(".if \\n[" TEMP_REG "] \\{");
+ printf(".nr " SUB_LOWER_FORMAT " +\\n[" TEMP_REG "]\n", uid);
+ printf(".nr " TEMP_REG " (%dM*4/5)-\\n[" SUP_RAISE_FORMAT
+ "]+\\n[" DEPTH_FORMAT "]>?0\n",
+ x_height, uid, sup->uid);
+ printf(".nr " SUP_RAISE_FORMAT " +\\n[" TEMP_REG "]\n", uid);
+ printf(".nr " SUB_LOWER_FORMAT " -\\n[" TEMP_REG "]\n", uid);
+ printf(".\\}\n");
+ }
+ }
+ printf(".nr " WIDTH_FORMAT " 0\\n[" WIDTH_FORMAT "]", uid, p->uid);
+ if (sub != 0 && sup != 0)
+ printf("+((\\n[" WIDTH_FORMAT "]-\\n[" SUB_KERN_FORMAT "]>?\\n["
+ WIDTH_FORMAT "])+%dM)>?0\n",
+ sub->uid, p->uid, sup->uid, script_space);
+ else if (sub != 0)
+ printf("+(\\n[" WIDTH_FORMAT "]-\\n[" SUB_KERN_FORMAT "]+%dM)>?0\n",
+ sub->uid, p->uid, script_space);
+ else if (sup != 0)
+ printf("+(\\n[" WIDTH_FORMAT "]+%dM)>?0\n", sup->uid, script_space);
+ else
+ printf("\n");
+ printf(".nr " HEIGHT_FORMAT " \\n[" HEIGHT_FORMAT "]",
+ uid, p->uid);
+ if (sup != 0)
+ printf(">?(\\n[" SUP_RAISE_FORMAT "]+\\n[" HEIGHT_FORMAT "])",
+ uid, sup->uid);
+ if (sub != 0)
+ printf(">?(-\\n[" SUB_LOWER_FORMAT "]+\\n[" HEIGHT_FORMAT "])",
+ uid, sub->uid);
+ printf("\n");
+ printf(".nr " DEPTH_FORMAT " \\n[" DEPTH_FORMAT "]",
+ uid, p->uid);
+ if (sub != 0)
+ printf(">?(\\n[" SUB_LOWER_FORMAT "]+\\n[" DEPTH_FORMAT "])",
+ uid, sub->uid);
+ if (sup != 0)
+ printf(">?(-\\n[" SUP_RAISE_FORMAT "]+\\n[" DEPTH_FORMAT "])",
+ uid, sup->uid);
+ printf("\n");
+ return res;
+}
+
+void script_box::output()
+{
+ if (output_format == troff) {
+ p->output();
+ if (sup != 0) {
+ printf("\\Z" DELIMITER_CHAR);
+ printf("\\v'-\\n[" SUP_RAISE_FORMAT "]u'", uid);
+ printf("\\s[\\n[" SMALL_SIZE_FORMAT "]u]", uid);
+ sup->output();
+ printf("\\s[\\n[" SIZE_FORMAT "]u]", uid);
+ printf(DELIMITER_CHAR);
+ }
+ if (sub != 0) {
+ printf("\\Z" DELIMITER_CHAR);
+ printf("\\v'\\n[" SUB_LOWER_FORMAT "]u'", uid);
+ printf("\\s[\\n[" SMALL_SIZE_FORMAT "]u]", uid);
+ printf("\\h'-\\n[" SUB_KERN_FORMAT "]u'", p->uid);
+ sub->output();
+ printf("\\s[\\n[" SIZE_FORMAT "]u]", uid);
+ printf(DELIMITER_CHAR);
+ }
+ printf("\\h'\\n[" WIDTH_FORMAT "]u-\\n[" WIDTH_FORMAT "]u'",
+ uid, p->uid);
+ }
+ else if (output_format == mathml) {
+ if (sup != 0 && sub != 0) {
+ printf("<msubsup>");
+ p->output();
+ sub->output();
+ sup->output();
+ printf("</msubsup>");
+ }
+ else if (sup != 0) {
+ printf("<msup>");
+ p->output();
+ sup->output();
+ printf("</msup>");
+ }
+ else if (sub != 0) {
+ printf("<msub>");
+ p->output();
+ sub->output();
+ printf("</msub>");
+ }
+ }
+}
+
+void script_box::hint(unsigned flags)
+{
+ p->hint(flags & ~HINT_NEXT_IS_ITALIC);
+}
+
+void script_box::debug_print()
+{
+ fprintf(stderr, "{ ");
+ p->debug_print();
+ fprintf(stderr, " }");
+ if (sub) {
+ fprintf(stderr, " sub { ");
+ sub->debug_print();
+ fprintf(stderr, " }");
+ }
+ if (sup) {
+ fprintf(stderr, " sup { ");
+ sup->debug_print();
+ fprintf(stderr, " }");
+ }
+}
+
+void script_box::check_tabs(int level)
+{
+ if (sup)
+ sup->check_tabs(level + 1);
+ if (sub)
+ sub->check_tabs(level + 1);
+ p->check_tabs(level);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/eqn/special.cpp b/src/preproc/eqn/special.cpp
new file mode 100644
index 0000000..8ad8238
--- /dev/null
+++ b/src/preproc/eqn/special.cpp
@@ -0,0 +1,117 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "eqn.h"
+#include "pbox.h"
+
+#define STRING_FORMAT PREFIX "str%d"
+
+#define SPECIAL_STRING "0s"
+#define SPECIAL_WIDTH_REG "0w"
+#define SPECIAL_HEIGHT_REG "0h"
+#define SPECIAL_DEPTH_REG "0d"
+#define SPECIAL_SUB_KERN_REG "0skern"
+#define SPECIAL_SKEW_REG "0skew"
+
+/*
+For example:
+
+.de Cl
+.ds 0s \Z'\\*[0s]'\v'\\n(0du'\D'l \\n(0wu -\\n(0hu-\\n(0du'\v'\\n(0hu'
+..
+.EQ
+define cancel 'special Cl'
+.EN
+*/
+
+
+class special_box : public pointer_box {
+ char *macro_name;
+public:
+ special_box(char *, box *);
+ ~special_box();
+ int compute_metrics(int);
+ void compute_subscript_kern();
+ void compute_skew();
+ void output();
+ void debug_print();
+};
+
+box *make_special_box(char *s, box *p)
+{
+ return new special_box(s, p);
+}
+
+special_box::special_box(char *s, box *pp) : pointer_box(pp), macro_name(s)
+{
+}
+
+special_box::~special_box()
+{
+ delete[] macro_name;
+}
+
+int special_box::compute_metrics(int style)
+{
+ int r = p->compute_metrics(style);
+ p->compute_subscript_kern();
+ p->compute_skew();
+ printf(".ds " SPECIAL_STRING " \"");
+ p->output();
+ printf("\n");
+ printf(".nr " SPECIAL_WIDTH_REG " 0\\n[" WIDTH_FORMAT "]\n", p->uid);
+ printf(".nr " SPECIAL_HEIGHT_REG " \\n[" HEIGHT_FORMAT "]\n", p->uid);
+ printf(".nr " SPECIAL_DEPTH_REG " \\n[" DEPTH_FORMAT "]\n", p->uid);
+ printf(".nr " SPECIAL_SUB_KERN_REG " \\n[" SUB_KERN_FORMAT "]\n", p->uid);
+ printf(".nr " SPECIAL_SKEW_REG " 0\\n[" SKEW_FORMAT "]\n", p->uid);
+ printf(".%s\n", macro_name);
+ printf(".rn " SPECIAL_STRING " " STRING_FORMAT "\n", uid);
+ printf(".nr " WIDTH_FORMAT " 0\\n[" SPECIAL_WIDTH_REG "]\n", uid);
+ printf(".nr " HEIGHT_FORMAT " 0>?\\n[" SPECIAL_HEIGHT_REG "]\n", uid);
+ printf(".nr " DEPTH_FORMAT " 0>?\\n[" SPECIAL_DEPTH_REG "]\n", uid);
+ printf(".nr " SUB_KERN_FORMAT " 0>?\\n[" SPECIAL_SUB_KERN_REG "]\n", uid);
+ printf(".nr " SKEW_FORMAT " 0\\n[" SPECIAL_SKEW_REG "]\n", uid);
+ // User will have to change MARK_REG if appropriate.
+ return r;
+}
+
+void special_box::compute_subscript_kern()
+{
+ // Already computed in compute_metrics(), so do nothing.
+}
+
+void special_box::compute_skew()
+{
+ // Already computed in compute_metrics(), so do nothing.
+}
+
+void special_box::output()
+{
+ if (output_format == troff)
+ printf("\\*[" STRING_FORMAT "]", uid);
+ else if (output_format == mathml)
+ printf("<merror>eqn specials cannot be expressed in MathML</merror>");
+}
+
+void special_box::debug_print()
+{
+ fprintf(stderr, "special %s { ", macro_name);
+ p->debug_print();
+ fprintf(stderr, " }");
+}
diff --git a/src/preproc/eqn/sqrt.cpp b/src/preproc/eqn/sqrt.cpp
new file mode 100644
index 0000000..e8d7c77
--- /dev/null
+++ b/src/preproc/eqn/sqrt.cpp
@@ -0,0 +1,186 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "eqn.h"
+#include "pbox.h"
+
+
+class sqrt_box : public pointer_box {
+public:
+ sqrt_box(box *);
+ int compute_metrics(int style);
+ void output();
+ void debug_print();
+ void check_tabs(int);
+};
+
+box *make_sqrt_box(box *pp)
+{
+ return new sqrt_box(pp);
+}
+
+sqrt_box::sqrt_box(box *pp) : pointer_box(pp)
+{
+}
+
+#define SQRT_CHAR "\\[sqrt]"
+#define RADICAL_EXTENSION_CHAR "\\[sqrtex]"
+
+#define SQRT_CHAIN "\\[sqrt\\\\n[" INDEX_REG "]]"
+#define BAR_CHAIN "\\[sqrtex\\\\n[" INDEX_REG "]]"
+
+int sqrt_box::compute_metrics(int style)
+{
+ // 11
+ int r = p->compute_metrics(cramped_style(style));
+ printf(".nr " TEMP_REG " \\n[" HEIGHT_FORMAT "]+\\n[" DEPTH_FORMAT
+ "]+%dM+(%dM/4)\n",
+ p->uid, p->uid, default_rule_thickness,
+ (style > SCRIPT_STYLE ? x_height : default_rule_thickness));
+ printf(".nr " SIZE_FORMAT " \\n[.ps]\n", uid);
+ printf(".ds " SQRT_STRING_FORMAT " " SQRT_CHAR "\n", uid);
+ printf(".ds " BAR_STRING " " RADICAL_EXTENSION_CHAR "\n");
+ printf(".nr " SQRT_WIDTH_FORMAT
+ " 0\\w" DELIMITER_CHAR SQRT_CHAR DELIMITER_CHAR "\n",
+ uid);
+ printf(".if \\n[rst]-\\n[rsb]-%dM<\\n[" TEMP_REG "] \\{",
+ default_rule_thickness);
+
+ printf(".nr " INDEX_REG " 0\n"
+ ".de " TEMP_MACRO "\n"
+ ".ie c" SQRT_CHAIN " \\{"
+ ".ds " SQRT_STRING_FORMAT " " SQRT_CHAIN "\n"
+ ".ie c" BAR_CHAIN " .ds " BAR_STRING " " BAR_CHAIN "\n"
+ ".el .ds " BAR_STRING " " RADICAL_EXTENSION_CHAR "\n"
+ ".nr " SQRT_WIDTH_FORMAT
+ " 0\\w" DELIMITER_CHAR SQRT_CHAIN DELIMITER_CHAR "\n"
+ ".if \\\\n[rst]-\\\\n[rsb]-%dM<\\n[" TEMP_REG "] \\{"
+ ".nr " INDEX_REG " +1\n"
+ "." TEMP_MACRO "\n"
+ ".\\}\\}\n"
+ ".el .nr " INDEX_REG " 0-1\n"
+ "..\n"
+ "." TEMP_MACRO "\n",
+ uid, uid, default_rule_thickness);
+
+ printf(".if \\n[" INDEX_REG "]<0 \\{");
+
+ // Determine the maximum point size
+ printf(".ps 1000\n");
+ printf(".nr " MAX_SIZE_REG " \\n[.ps]\n");
+ printf(".ps \\n[" SIZE_FORMAT "]u\n", uid);
+ // We define a macro that will increase the current point size
+ // until we get a radical sign that's tall enough or we reach
+ // the maximum point size.
+ printf(".de " TEMP_MACRO "\n"
+ ".nr " SQRT_WIDTH_FORMAT
+ " 0\\w" DELIMITER_CHAR "\\*[" SQRT_STRING_FORMAT "]" DELIMITER_CHAR "\n"
+ ".if \\\\n[rst]"
+ "&(\\\\n[rst]-\\\\n[rsb]-%dM<\\n[" TEMP_REG "])"
+ "&(\\\\n[.ps]<\\n[" MAX_SIZE_REG "]) \\{"
+ ".ps +1\n"
+ "." TEMP_MACRO "\n"
+ ".\\}\n"
+ "..\n"
+ "." TEMP_MACRO "\n",
+ uid, uid, default_rule_thickness);
+
+ printf(".\\}\\}\n");
+
+ printf(".nr " SMALL_SIZE_FORMAT " \\n[.ps]\n", uid);
+ // set TEMP_REG to the amount by which the radical sign is too big
+ printf(".nr " TEMP_REG " \\n[rst]-\\n[rsb]-%dM-\\n[" TEMP_REG "]\n",
+ default_rule_thickness);
+ // If TEMP_REG is negative, the bottom of the radical sign should
+ // be -TEMP_REG above the bottom of p. If it's positive, the bottom
+ // of the radical sign should be TEMP_REG/2 below the bottom of p.
+ // This calculates the amount by which the baseline of the radical
+ // should be raised.
+ printf(".nr " SUP_RAISE_FORMAT " (-\\n[" TEMP_REG "]>?(-\\n[" TEMP_REG "]/2))"
+ "-\\n[rsb]-\\n[" DEPTH_FORMAT "]\n", uid, p->uid);
+ printf(".nr " HEIGHT_FORMAT " \\n[" HEIGHT_FORMAT "]"
+ ">?(\\n[" SUP_RAISE_FORMAT "]+\\n[rst])\n",
+ uid, p->uid, uid);
+ printf(".nr " DEPTH_FORMAT " \\n[" DEPTH_FORMAT "]"
+ ">?(-\\n[" SUP_RAISE_FORMAT "]-\\n[rsb])\n",
+ uid, p->uid, uid);
+ // Do this last, so we don't lose height and depth information on
+ // the radical sign.
+ // Remember that the width of the bar might be greater than the width of p.
+
+ printf(".nr " TEMP_REG " "
+ "\\n[" WIDTH_FORMAT "]"
+ ">?\\w" DELIMITER_CHAR "\\*[" BAR_STRING "]" DELIMITER_CHAR "\n",
+ p->uid);
+ printf(".as " SQRT_STRING_FORMAT " "
+ "\\l'\\n[" TEMP_REG "]u\\&\\*[" BAR_STRING "]'\n",
+ uid);
+ printf(".nr " WIDTH_FORMAT " \\n[" TEMP_REG "]"
+ "+\\n[" SQRT_WIDTH_FORMAT "]\n",
+ uid, uid);
+
+ if (r)
+ printf(".nr " MARK_REG " +\\n[" SQRT_WIDTH_FORMAT "]\n", uid);
+ // the top of the bar might be higher than the top of the radical sign
+ printf(".nr " HEIGHT_FORMAT " \\n[" HEIGHT_FORMAT "]"
+ ">?(\\n[" SUP_RAISE_FORMAT "]+\\n[rst])\n",
+ uid, p->uid, uid);
+ // put a bit of extra space above the bar
+ printf(".nr " HEIGHT_FORMAT " +%dM\n", uid, default_rule_thickness);
+ printf(".ps \\n[" SIZE_FORMAT "]u\n", uid);
+ return r;
+}
+
+void sqrt_box::output()
+{
+ if (output_format == troff) {
+ printf("\\Z" DELIMITER_CHAR);
+ printf("\\s[\\n[" SMALL_SIZE_FORMAT "]u]", uid);
+ printf("\\v'-\\n[" SUP_RAISE_FORMAT "]u'", uid);
+ printf("\\*[" SQRT_STRING_FORMAT "]", uid);
+ printf("\\s[\\n[" SIZE_FORMAT "]u]", uid);
+ printf(DELIMITER_CHAR);
+
+ printf("\\Z" DELIMITER_CHAR);
+ printf("\\h'\\n[" WIDTH_FORMAT "]u-\\n[" WIDTH_FORMAT "]u"
+ "+\\n[" SQRT_WIDTH_FORMAT "]u/2u'",
+ uid, p->uid, uid);
+ p->output();
+ printf(DELIMITER_CHAR);
+
+ printf("\\h'\\n[" WIDTH_FORMAT "]u'", uid);
+ }
+ else if (output_format == mathml) {
+ printf("<msqrt>");
+ p->output();
+ printf("</msqrt>");
+ }
+}
+
+void sqrt_box::debug_print()
+{
+ fprintf(stderr, "sqrt { ");
+ p->debug_print();
+ fprintf(stderr, " }");
+}
+
+void sqrt_box::check_tabs(int level)
+{
+ p->check_tabs(level + 1);
+}
diff --git a/src/preproc/eqn/tests/diagnostics-report-correct-line-numbers.sh b/src/preproc/eqn/tests/diagnostics-report-correct-line-numbers.sh
new file mode 100755
index 0000000..feb78c1
--- /dev/null
+++ b/src/preproc/eqn/tests/diagnostics-report-correct-line-numbers.sh
@@ -0,0 +1,55 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+eqn="${abs_top_builddir:-.}/eqn"
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ echo "$error"
+ fail=yes
+}
+
+# Verify that correct input file line numbers are reported.
+
+echo "checking for absent line number in early EOF diagnostic" >&2
+input='.EQ'
+error=$(printf "%s\n" "$input" | "$eqn" 2>&1 > /dev/null)
+echo "$error" | grep -Eq '^[^:]+:[^:]+: fatal' || wail
+
+echo "checking for correct line number in nested 'EQ' diagnostic" >&2
+input='.EQ
+.EQ'
+error=$(printf "%s\n" "$input" | "$eqn" 2>&1 > /dev/null)
+echo "$error" | grep -Eq '^[^:]+:[^:]+:2: fatal' || wail
+
+echo "checking for correct line number in invalid input character" \
+ "diagnostic" >&2
+error=$(printf ".EQ\nx\n.EN\n\200\n" | "$eqn" 2>&1 > /dev/null)
+echo "$error" | grep -Eq '^[^:]+:[^:]+:4: error' || wail
+
+echo "checking for correct line number in invalid input character" \
+ "diagnostic when 'lf' request used beforehand" >&2
+error=$(printf ".EQ\nx\n.EN\n.lf 99\n\200\n" | "$eqn" 2>&1 > /dev/null)
+echo "$error" | grep -Eq '^[^:]+:[^:]+:99: error' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/preproc/eqn/text.cpp b/src/preproc/eqn/text.cpp
new file mode 100644
index 0000000..272f3fe
--- /dev/null
+++ b/src/preproc/eqn/text.cpp
@@ -0,0 +1,957 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <ctype.h>
+#include <stdlib.h>
+#include "eqn.h"
+#include "pbox.h"
+#include "ptable.h"
+
+struct map {
+ const char *from;
+ const char *to;
+};
+
+struct map entity_table[] = {
+ // Classic troff special characters
+ {"%", "&shy;"}, // ISOnum
+ {"'", "&acute;"}, // ISOdia
+ {"!=", "&ne;"}, // ISOtech
+ {"**", "&lowast;"}, // ISOtech
+ {"*a", "&alpha;"}, // ISOgrk3
+ {"*A", "A"},
+ {"*b", "&beta;"}, // ISOgrk3
+ {"*B", "B"},
+ {"*d", "&delta;"}, // ISOgrk3
+ {"*D", "&Delta;"}, // ISOgrk3
+ {"*e", "&epsilon;"}, // ISOgrk3
+ {"*E", "E"},
+ {"*f", "&phi;"}, // ISOgrk3
+ {"*F", "&Phi;"}, // ISOgrk3
+ {"*g", "&gamma;"}, // ISOgrk3
+ {"*G", "&Gamma;"}, // ISOgrk3
+ {"*h", "&theta;"}, // ISOgrk3
+ {"*H", "&Theta;"}, // ISOgrk3
+ {"*i", "&iota;"}, // ISOgrk3
+ {"*I", "I"},
+ {"*k", "&kappa;"}, // ISOgrk3
+ {"*K", "K;"},
+ {"*l", "&lambda;"}, // ISOgrk3
+ {"*L", "&Lambda;"}, // ISOgrk3
+ {"*m", "&mu;"}, // ISOgrk3
+ {"*M", "M"},
+ {"*n", "&nu;"}, // ISOgrk3
+ {"*N", "N"},
+ {"*o", "o"},
+ {"*O", "O"},
+ {"*p", "&pi;"}, // ISOgrk3
+ {"*P", "&Pi;"}, // ISOgrk3
+ {"*q", "&psi;"}, // ISOgrk3
+ {"*Q", "&PSI;"}, // ISOgrk3
+ {"*r", "&rho;"}, // ISOgrk3
+ {"*R", "R"},
+ {"*s", "&sigma;"}, // ISOgrk3
+ {"*S", "&Sigma;"}, // ISOgrk3
+ {"*t", "&tau;"}, // ISOgrk3
+ {"*T", "&Tau;"}, // ISOgrk3
+ {"*u", "&upsilon;"}, // ISOgrk3
+ {"*U", "&Upsilon;"}, // ISOgrk3
+ {"*w", "&omega;"}, // ISOgrk3
+ {"*W", "&Omega;"}, // ISOgrk3
+ {"*x", "&chi;"}, // ISOgrk3
+ {"*X", "&Chi;"}, // ISOgrk3
+ {"*y", "&eta;"}, // ISOgrk3
+ {"*Y", "&Eta;"}, // ISOgrk3
+ {"*z", "&zeta;"}, // ISOgrk3
+ {"*Z", "&Zeta;"}, // ISOgrk3
+ {"+-", "&plusmn;"}, // ISOnum
+ {"->", "&rarr;"}, // ISOnum
+ {"12", "&frac12;"}, // ISOnum
+ {"14", "&frac14;"}, // ISOnum
+ {"34", "&frac34;"}, // ISOnum
+ {"<-", "&larr;"}, // ISOnum
+ {"==", "&equiv;"}, // ISOtech
+ {"Fi", "&ffilig;"}, // ISOpub
+ {"Fl", "&ffllig;"}, // ISOpub
+ {"aa", "&acute;"}, // ISOdia
+ {"ap", "&sim;"}, // ISOtech
+ {"bl", "&phonexb;"}, // ISOpub
+ {"br", "&boxv;"}, // ISObox
+ {"bs", "&phone;"}, // ISOpub (for the Bell logo)
+ {"bu", "&bull;"}, // ISOpub
+ {"bv", "&verbar;"}, // ISOnum
+ {"ca", "&cap;"}, // ISOtech
+ {"ci", "&cir;"}, // ISOpub
+ {"co", "&copy;"}, // ISOnum
+ {"ct", "&cent;"}, // ISOnum
+ {"cu", "&cup;"}, // ISOtech
+ {"da", "&darr;"}, // ISOnum
+ {"de", "&deg;"}, // ISOnum
+ {"dg", "&dagger;"}, // ISOpub
+ {"dd", "&Dagger;"}, // ISOpub
+ {"di", "&divide;"}, // ISOnum
+ {"em", "&mdash;"}, // ISOpub
+ {"eq", "&equals;"}, // ISOnum
+ {"es", "&empty;"}, // ISOamso
+ {"ff", "&fflig;"}, // ISOpub
+ {"fi", "&filig;"}, // ISOpub
+ {"fl", "&fllig;"}, // ISOpub
+ {"fm", "&prime;"}, // ISOtech
+ {"ge", "&ge;"}, // ISOtech
+ {"gr", "&nabla;"}, // ISOtech
+ {"hy", "&hyphen;"}, // ISOnum
+ {"ib", "&sube;"}, // ISOtech
+ {"if", "&infin;"}, // ISOtech
+ {"ip", "&supe;"}, // ISOtech
+ {"is", "&int;"}, // ISOtech
+ {"le", "&le;"}, // ISOtech
+ // Some pile characters go here
+ {"mi", "&minus;"}, // ISOtech
+ {"mo", "&isin;"}, // ISOtech
+ {"mu", "&times;"}, // ISOnum
+ {"no", "&not;"}, // ISOnum
+ {"or", "&verbar;"}, // ISOnum
+ {"pl", "&plus;"}, // ISOnum
+ {"pt", "&prop;"}, // ISOtech
+ {"rg", "&trade;"}, // ISOnum
+ // More pile characters go here
+ {"rn", "&macr;"}, // ISOdia
+ {"ru", "&lowbar;"}, // ISOnum
+ {"sb", "&sub;"}, // ISOtech
+ {"sc", "&sect;"}, // ISOnum
+ {"sl", "/"},
+ {"sp", "&sup;"}, // ISOtech
+ {"sq", "&squf;"}, // ISOpub
+ {"sr", "&radic;"}, // ISOtech
+ {"ts", "&sigmav;"}, // ISOgrk3
+ {"ua", "&uarr;"}, // ISOnum
+ {"ul", "_"},
+ {"~=", "&cong;"}, // ISOtech
+ // Extended specials supported by groff; see groff_char(7).
+ // These are listed in the order they occur on that man page.
+ {"-D", "&ETH;"}, // ISOlat: Icelandic uppercase eth
+ {"Sd", "&eth;"}, // ISOlat1: Icelandic lowercase eth
+ {"TP", "&THORN;"}, // ISOlat1: Icelandic uppercase thorn
+ {"Tp", "&thorn;"}, // ISOlat1: Icelandic lowercase thorn
+ {"ss", "&szlig;"}, // ISOlat1
+ // Ligatures
+ // ff, fi, fl, ffi, ffl from old troff go here
+ {"AE", "&AElig;"}, // ISOlat1
+ {"ae", "&aelig;"}, // ISOlat1
+ {"OE", "&OElig;"}, // ISOlat2
+ {"oe", "&oelig;"}, // ISOlat2
+ {"IJ", "&ijlig;"}, // ISOlat2: Dutch IJ ligature
+ {"ij", "&IJlig;"}, // ISOlat2: Dutch ij ligature
+ {".i", "&inodot;"}, // ISOlat2,ISOamso
+ {".j", "&jnodot;"}, // ISOamso (undocumented but in 1.19)
+ // Accented characters
+ {"'A", "&Aacute;"}, // ISOlat1
+ {"'C", "&Cacute;"}, // ISOlat2
+ {"'E", "&Eacute;"}, // ISOlat1
+ {"'I", "&Iacute;"}, // ISOlat1
+ {"'O", "&Oacute;"}, // ISOlat1
+ {"'U", "&Uacute;"}, // ISOlat1
+ {"'Y", "&Yacute;"}, // ISOlat1
+ {"'a", "&aacute;"}, // ISOlat1
+ {"'c", "&cacute;"}, // ISOlat2
+ {"'e", "&eacute;"}, // ISOlat1
+ {"'i", "&iacute;"}, // ISOlat1
+ {"'o", "&oacute;"}, // ISOlat1
+ {"'u", "&uacute;"}, // ISOlat1
+ {"'y", "&yacute;"}, // ISOlat1
+ {":A", "&Auml;"}, // ISOlat1
+ {":E", "&Euml;"}, // ISOlat1
+ {":I", "&Iuml;"}, // ISOlat1
+ {":O", "&Ouml;"}, // ISOlat1
+ {":U", "&Uuml;"}, // ISOlat1
+ {":Y", "&Yuml;"}, // ISOlat2
+ {":a", "&auml;"}, // ISOlat1
+ {":e", "&euml;"}, // ISOlat1
+ {":i", "&iuml;"}, // ISOlat1
+ {":o", "&ouml;"}, // ISOlat1
+ {":u", "&uuml;"}, // ISOlat1
+ {":y", "&yuml;"}, // ISOlat1
+ {"^A", "&Acirc;"}, // ISOlat1
+ {"^E", "&Ecirc;"}, // ISOlat1
+ {"^I", "&Icirc;"}, // ISOlat1
+ {"^O", "&Ocirc;"}, // ISOlat1
+ {"^U", "&Ucirc;"}, // ISOlat1
+ {"^a", "&acirc;"}, // ISOlat1
+ {"^e", "&ecirc;"}, // ISOlat1
+ {"^i", "&icirc;"}, // ISOlat1
+ {"^o", "&ocirc;"}, // ISOlat1
+ {"^u", "&ucirc;"}, // ISOlat1
+ {"`A", "&Agrave;"}, // ISOlat1
+ {"`E", "&Egrave;"}, // ISOlat1
+ {"`I", "&Igrave;"}, // ISOlat1
+ {"`O", "&Ograve;"}, // ISOlat1
+ {"`U", "&Ugrave;"}, // ISOlat1
+ {"`a", "&agrave;"}, // ISOlat1
+ {"`e", "&egrave;"}, // ISOlat1
+ {"`i", "&igrave;"}, // ISOlat1
+ {"`o", "&ograve;"}, // ISOlat1
+ {"`u", "&ugrave;"}, // ISOlat1
+ {"~A", "&Atilde;"}, // ISOlat1
+ {"~N", "&Ntilde;"}, // ISOlat1
+ {"~O", "&Otilde;"}, // ISOlat1
+ {"~a", "&atilde;"}, // ISOlat1
+ {"~n", "&ntilde;"}, // ISOlat1
+ {"~o", "&otilde;"}, // ISOlat1
+ {"vS", "&Scaron;"}, // ISOlat2
+ {"vs", "&scaron;"}, // ISOlat2
+ {"vZ", "&Zcaron;"}, // ISOlat2
+ {"vz", "&zcaron;"}, // ISOlat2
+ {",C", "&Ccedil;"}, // ISOlat1
+ {",c", "&ccedil;"}, // ISOlat1
+ {"/L", "&Lstrok;"}, // ISOlat2: Polish L with a slash
+ {"/l", "&lstrok;"}, // ISOlat2: Polish l with a slash
+ {"/O", "&Oslash;"}, // ISOlat1
+ {"/o", "&oslash;"}, // ISOlat1
+ {"oA", "&Aring;"}, // ISOlat1
+ {"oa", "&aring;"}, // ISOlat1
+ // Accents
+ {"a\"","&dblac;"}, // ISOdia: double acute accent (Hungarian umlaut)
+ {"a-", "&macr;"}, // ISOdia: macron or bar accent
+ {"a.", "&dot;"}, // ISOdia: dot above
+ {"a^", "&circ;"}, // ISOdia: circumflex accent
+ {"aa", "&acute;"}, // ISOdia: acute accent
+ {"ga", "&grave;"}, // ISOdia: grave accent
+ {"ab", "&breve;"}, // ISOdia: breve accent
+ {"ac", "&cedil;"}, // ISOdia: cedilla accent
+ {"ad", "&uml;"}, // ISOdia: umlaut or dieresis
+ {"ah", "&caron;"}, // ISOdia: caron (aka hacek accent)
+ {"ao", "&ring;"}, // ISOdia: ring or circle accent
+ {"a~", "&tilde;"}, // ISOdia: tilde accent
+ {"ho", "&ogon;"}, // ISOdia: hook or ogonek accent
+ {"ha", "^"}, // ASCII circumflex, hat, caret
+ {"ti", "~"}, // ASCII tilde, large tilde
+ // Quotes
+ {"Bq", "&lsquor;"}, // ISOpub: low double comma quote
+ {"bq", "&ldquor;"}, // ISOpub: low single comma quote
+ {"lq", "&ldquo;"}, // ISOnum
+ {"rq", "&rdquo;"}, // ISOpub
+ {"oq", "&lsquo;"}, // ISOnum: single open quote
+ {"cq", "&rsquo;"}, // ISOnum: single closing quote (ASCII 39)
+ {"aq", "&zerosp;'"}, // apostrophe quote
+ {"dq", "\""}, // double quote (ASCII 34)
+ {"Fo", "&laquo;"}, // ISOnum
+ {"Fc", "&raquo;"}, // ISOnum
+ //{"fo", "&fo;"},
+ //{"fc", "&fc;"},
+ // Punctuation
+ {"r!", "&iexcl;"}, // ISOnum
+ {"r?", "&iquest;"}, // ISOnum
+ // Old troff \(em goes here
+ {"en", "&ndash;"}, // ISOpub: en dash
+ // Old troff \(hy goes here
+ // Brackets
+ {"lB", "&lsqb;"}, // ISOnum: left (square) bracket
+ {"rB", "&rsqb;"}, // ISOnum: right (square) bracket
+ {"lC", "&lcub;"}, // ISOnum: left (curly) brace
+ {"rC", "&rcub;"}, // ISOnum: right (curly) brace
+ {"la", "&lang;"}, // ISOtech: left angle bracket
+ {"ra", "&rang;"}, // ISOtech: right angle bracket
+ // Old troff \(bv goes here
+ // Bracket-pile characters could go here.
+ // Arrows
+ // Old troff \(<- and \(-> go here
+ {"<>", "&harr;"}, // ISOamsa
+ {"da", "&darr;"}, // ISOnum
+ {"ua", "&uarr;"}, // ISOnum
+ {"lA", "&lArr;"}, // ISOtech
+ {"rA", "&rArr;"}, // ISOtech
+ {"hA", "&iff;"}, // ISOtech: horizontal double-headed arrow
+ {"dA", "&dArr;"}, // ISOamsa
+ {"uA", "&uArr;"}, // ISOamsa
+ {"vA", "&vArr;"}, // ISOamsa: vertical double-headed double arrow
+ //{"an", "&an;"},
+ // Lines
+ {"-h", "&planck;"}, // ISOamso: h-bar (Planck's constant)
+ // Old troff \(or goes here
+ {"ba", "&verbar;"}, // ISOnum
+ // Old troff \(br, \{u, \(ul, \(bv go here
+ {"bb", "&brvbar;"}, // ISOnum
+ {"sl", "/"},
+ {"rs", "&bsol;"}, // ISOnum
+ // Text markers
+ // Old troff \(ci, \(bu, \(dd, \(dg go here
+ {"lz", "&loz;"}, // ISOpub
+ // Old troff sq goes here
+ {"ps", "&para;"}, // ISOnum: paragraph or pilcrow sign
+ {"sc", "&sect;"}, // ISOnum (in old troff)
+ // Old troff \(lh, \{h go here
+ {"at", "&commat;"}, // ISOnum
+ {"sh", "&num;"}, // ISOnum
+ //{"CR", "&CR;"},
+ {"OK", "&check;"}, // ISOpub
+ // Legalize
+ // Old troff \(co, \{g go here
+ {"tm", "&trade;"}, // ISOnum
+ // Currency symbols
+ {"Do", "&dollar;"}, // ISOnum
+ {"ct", "&cent;"}, // ISOnum
+ {"eu", "&euro;"},
+ {"Eu", "&euro;"},
+ {"Ye", "&yen;"}, // ISOnum
+ {"Po", "&pound;"}, // ISOnum
+ {"Cs", "&curren;"}, // ISOnum: currency sign
+ {"Fn", "&fnof"}, // ISOtech
+ // Units
+ // Old troff de goes here
+ {"%0", "&permil;"}, // ISOtech: per thousand, per mille sign
+ // Old troff \(fm goes here
+ {"sd", "&Prime;"}, // ISOtech
+ {"mc", "&micro;"}, // ISOnum
+ {"Of", "&ordf;"}, // ISOnum
+ {"Om", "&ordm;"}, // ISOnum
+ // Logical symbols
+ {"AN", "&and;"}, // ISOtech
+ {"OR", "&or;"}, // ISOtech
+ // Old troff \(no goes here
+ {"te", "&exist;"}, // ISOtech: there exists, existential quantifier
+ {"fa", "&forall;"}, // ISOtech: for all, universal quantifier
+ {"st", "&bepsi"}, // ISOamsr: such that
+ {"3d", "&there4;"}, // ISOtech
+ {"tf", "&there4;"}, // ISOtech
+ // Mathematical symbols
+ // Old troff "12", "14", "34" goes here
+ {"S1", "&sup1;"}, // ISOnum
+ {"S2", "&sup2;"}, // ISOnum
+ {"S3", "&sup3;"}, // ISOnum
+ // Old troff \(pl", \-, \(+- go here
+ {"t+-", "&plusmn;"}, // ISOnum
+ {"-+", "&mnplus;"}, // ISOtech
+ {"pc", "&middot;"}, // ISOnum
+ {"md", "&middot;"}, // ISOnum
+ // Old troff \(mu goes here
+ {"tmu", "&times;"}, // ISOnum
+ {"c*", "&otimes;"}, // ISOamsb: multiply sign in a circle
+ {"c+", "&oplus;"}, // ISOamsb: plus sign in a circle
+ // Old troff \(di goes here
+ {"tdi", "&divide;"}, // ISOnum
+ {"f/", "&horbar;"}, // ISOnum: horizintal bar for fractions
+ // Old troff \(** goes here
+ {"<=", "&le;"}, // ISOtech
+ {">=", "&ge;"}, // ISOtech
+ {"<<", "&Lt;"}, // ISOamsr
+ {">>", "&Gt;"}, // ISOamsr
+ {"!=", "&ne;"}, // ISOtech
+ // Old troff \(eq and \(== go here
+ {"=~", "&cong;"}, // ISOamsr
+ // Old troff \(ap goes here
+ {"~~", "&ap;"}, // ISOtech
+ // This appears to be an error in the groff table.
+ // It clashes with the Bell Labs use of ~= for a congruence sign
+ // {"~=", "&ap;"}, // ISOamsr
+ // Old troff \(pt, \(es, \(mo go here
+ {"nm", "&notin;"}, // ISOtech
+ {"nb", "&nsub;"}, // ISOamsr
+ {"nc", "&nsup;"}, // ISOamsn
+ {"ne", "&nequiv;"}, // ISOamsn
+ // Old troff \(sb, \(sp, \(ib, \(ip, \(ca, \(cu go here
+ {"/_", "&ang;"}, // ISOamso
+ {"pp", "&perp;"}, // ISOtech
+ // Old troff \(is goes here
+ {"sum", "&sum;"}, // ISOamsb
+ {"product", "&prod;"}, // ISOamsb
+ {"gr", "&nabla;"}, // ISOtech
+ // Old troff \(sr. \{n, \(if go here
+ {"Ah", "&aleph;"}, // ISOtech
+ {"Im", "&image;"}, // ISOamso: Fraktur I, imaginary
+ {"Re", "&real;"}, // ISOamso: Fraktur R, real
+ {"wp", "&weierp;"}, // ISOamso
+ {"pd", "&part;"}, // ISOtech: partial differentiation sign
+ // Their table duplicates the Greek letters here.
+ // We list only the variant forms here, mapping them into
+ // the ISO Greek 4 variants (which may or may not be correct :-()
+ {"+f", "&b.phiv;"}, // ISOgrk4: variant phi
+ {"+h", "&b.thetas;"}, // ISOgrk4: variant theta
+ {"+p", "&b.omega;"}, // ISOgrk4: variant pi, looking like omega
+ // Card symbols
+ {"CL", "&clubs;"}, // ISOpub: club suit
+ {"SP", "&spades;"}, // ISOpub: spade suit
+ {"HE", "&hearts;"}, // ISOpub: heart suit
+ {"DI", "&diams;"}, // ISOpub: diamond suit
+};
+
+const char *special_to_entity(const char *sp)
+{
+ struct map *mp;
+ for (mp = entity_table;
+ mp < entity_table + sizeof(entity_table)/sizeof(entity_table[0]);
+ mp++) {
+ if (strcmp(mp->from, sp) == 0)
+ return mp->to;
+ }
+ return NULL;
+}
+
+class char_box : public simple_box {
+ unsigned char c;
+ char next_is_italic;
+ char prev_is_italic;
+public:
+ char_box(unsigned char);
+ void debug_print();
+ void output();
+ int is_char();
+ int left_is_italic();
+ int right_is_italic();
+ void hint(unsigned);
+ void handle_char_type(int, int);
+};
+
+class special_char_box : public simple_box {
+ char *s;
+public:
+ special_char_box(const char *);
+ ~special_char_box();
+ void output();
+ void debug_print();
+ int is_char();
+ void handle_char_type(int, int);
+};
+
+enum spacing_type {
+ s_ordinary,
+ s_operator,
+ s_binary,
+ s_relation,
+ s_opening,
+ s_closing,
+ s_punctuation,
+ s_inner,
+ s_suppress
+};
+
+const char *spacing_type_table[] = {
+ "ordinary",
+ "operator",
+ "binary",
+ "relation",
+ "opening",
+ "closing",
+ "punctuation",
+ "inner",
+ "suppress",
+ 0,
+};
+
+const int DIGIT_TYPE = 0;
+const int LETTER_TYPE = 1;
+
+const char *font_type_table[] = {
+ "digit",
+ "letter",
+ 0,
+};
+
+struct char_info {
+ int spacing_type;
+ int font_type;
+ char_info();
+};
+
+char_info::char_info()
+: spacing_type(ORDINARY_TYPE), font_type(DIGIT_TYPE)
+{
+}
+
+static char_info char_table[256];
+
+declare_ptable(char_info)
+implement_ptable(char_info)
+
+PTABLE(char_info) special_char_table;
+
+static int get_special_char_spacing_type(const char *ch)
+{
+ char_info *p = special_char_table.lookup(ch);
+ return p ? p->spacing_type : ORDINARY_TYPE;
+}
+
+static int get_special_char_font_type(const char *ch)
+{
+ char_info *p = special_char_table.lookup(ch);
+ return p ? p->font_type : DIGIT_TYPE;
+}
+
+static void set_special_char_type(const char *ch, int st, int ft)
+{
+ char_info *p = special_char_table.lookup(ch);
+ if (!p) {
+ p = new char_info[1];
+ special_char_table.define(ch, p);
+ }
+ if (st >= 0)
+ p->spacing_type = st;
+ if (ft >= 0)
+ p->font_type = ft;
+}
+
+void init_char_table()
+{
+ set_special_char_type("pl", s_binary, -1);
+ set_special_char_type("mi", s_binary, -1);
+ set_special_char_type("eq", s_relation, -1);
+ set_special_char_type("<=", s_relation, -1);
+ set_special_char_type(">=", s_relation, -1);
+ char_table['}'].spacing_type = s_closing;
+ char_table[')'].spacing_type = s_closing;
+ char_table[']'].spacing_type = s_closing;
+ char_table['{'].spacing_type = s_opening;
+ char_table['('].spacing_type = s_opening;
+ char_table['['].spacing_type = s_opening;
+ char_table[','].spacing_type = s_punctuation;
+ char_table[';'].spacing_type = s_punctuation;
+ char_table[':'].spacing_type = s_punctuation;
+ char_table['.'].spacing_type = s_punctuation;
+ char_table['>'].spacing_type = s_relation;
+ char_table['<'].spacing_type = s_relation;
+ char_table['*'].spacing_type = s_binary;
+ for (int i = 0; i < 256; i++)
+ if (csalpha(i))
+ char_table[i].font_type = LETTER_TYPE;
+}
+
+static int lookup_spacing_type(const char *type)
+{
+ for (int i = 0; spacing_type_table[i] != 0; i++)
+ if (strcmp(spacing_type_table[i], type) == 0)
+ return i;
+ return -1;
+}
+
+static int lookup_font_type(const char *type)
+{
+ for (int i = 0; font_type_table[i] != 0; i++)
+ if (strcmp(font_type_table[i], type) == 0)
+ return i;
+ return -1;
+}
+
+void box::set_spacing_type(char *type)
+{
+ int t = lookup_spacing_type(type);
+ if (t < 0)
+ error("unrecognised type '%1'", type);
+ else
+ spacing_type = t;
+ free(type);
+}
+
+char_box::char_box(unsigned char cc)
+: c(cc), next_is_italic(0), prev_is_italic(0)
+{
+ spacing_type = char_table[c].spacing_type;
+}
+
+void char_box::hint(unsigned flags)
+{
+ if (flags & HINT_PREV_IS_ITALIC)
+ prev_is_italic = 1;
+ if (flags & HINT_NEXT_IS_ITALIC)
+ next_is_italic = 1;
+}
+
+void char_box::output()
+{
+ if (output_format == troff) {
+ int font_type = char_table[c].font_type;
+ if (font_type != LETTER_TYPE)
+ printf("\\f[%s]", current_roman_font);
+ if (!prev_is_italic)
+ fputs("\\,", stdout);
+ if (c == '\\')
+ fputs("\\e", stdout);
+ else
+ putchar(c);
+ if (!next_is_italic)
+ fputs("\\/", stdout);
+ else
+ fputs("\\&", stdout); // suppress ligaturing and kerning
+ if (font_type != LETTER_TYPE)
+ fputs("\\fP", stdout);
+ }
+ else if (output_format == mathml) {
+ if (isdigit(c))
+ printf("<mn>");
+ else if (char_table[c].spacing_type)
+ printf("<mo>");
+ else
+ printf("<mi>");
+ if (c == '<')
+ printf("&lt;");
+ else if (c == '>')
+ printf("&gt;");
+ else if (c == '&')
+ printf("&amp;");
+ else
+ putchar(c);
+ if (isdigit(c))
+ printf("</mn>");
+ else if (char_table[c].spacing_type)
+ printf("</mo>");
+ else
+ printf("</mi>");
+ }
+}
+
+int char_box::left_is_italic()
+{
+ int font_type = char_table[c].font_type;
+ return font_type == LETTER_TYPE;
+}
+
+int char_box::right_is_italic()
+{
+ int font_type = char_table[c].font_type;
+ return font_type == LETTER_TYPE;
+}
+
+int char_box::is_char()
+{
+ return 1;
+}
+
+void char_box::debug_print()
+{
+ if (c == '\\') {
+ putc('\\', stderr);
+ putc('\\', stderr);
+ }
+ else
+ putc(c, stderr);
+}
+
+special_char_box::special_char_box(const char *t)
+{
+ s = strsave(t);
+ spacing_type = get_special_char_spacing_type(s);
+}
+
+special_char_box::~special_char_box()
+{
+ free(s);
+}
+
+void special_char_box::output()
+{
+ if (output_format == troff) {
+ int font_type = get_special_char_font_type(s);
+ if (font_type != LETTER_TYPE)
+ printf("\\f[%s]", current_roman_font);
+ printf("\\,\\[%s]\\/", s);
+ if (font_type != LETTER_TYPE)
+ printf("\\fP");
+ }
+ else if (output_format == mathml) {
+ const char *entity = special_to_entity(s);
+ if (entity != NULL)
+ printf("<mo>%s</mo>", entity);
+ else
+ printf("<merror>unknown eqn/troff special char %s</merror>", s);
+ }
+}
+
+int special_char_box::is_char()
+{
+ return 1;
+}
+
+void special_char_box::debug_print()
+{
+ fprintf(stderr, "\\[%s]", s);
+}
+
+
+void char_box::handle_char_type(int st, int ft)
+{
+ if (st >= 0)
+ char_table[c].spacing_type = st;
+ if (ft >= 0)
+ char_table[c].font_type = ft;
+}
+
+void special_char_box::handle_char_type(int st, int ft)
+{
+ set_special_char_type(s, st, ft);
+}
+
+void set_char_type(const char *type, char *ch)
+{
+ assert(ch != 0);
+ int st = lookup_spacing_type(type);
+ int ft = lookup_font_type(type);
+ if (st < 0 && ft < 0) {
+ error("bad character type '%1'", type);
+ delete[] ch;
+ return;
+ }
+ box *b = split_text(ch);
+ b->handle_char_type(st, ft);
+ delete b;
+}
+
+/* We give primes special treatment so that in "x' sub 2", the "2"
+will be tucked under the prime */
+
+class prime_box : public pointer_box {
+ box *pb;
+public:
+ prime_box(box *);
+ ~prime_box();
+ int compute_metrics(int style);
+ void output();
+ void compute_subscript_kern();
+ void debug_print();
+ void handle_char_type(int, int);
+};
+
+box *make_prime_box(box *pp)
+{
+ return new prime_box(pp);
+}
+
+prime_box::prime_box(box *pp) : pointer_box(pp)
+{
+ pb = new special_char_box("fm");
+}
+
+prime_box::~prime_box()
+{
+ delete pb;
+}
+
+int prime_box::compute_metrics(int style)
+{
+ int res = p->compute_metrics(style);
+ pb->compute_metrics(style);
+ printf(".nr " WIDTH_FORMAT " 0\\n[" WIDTH_FORMAT "]"
+ "+\\n[" WIDTH_FORMAT "]\n",
+ uid, p->uid, pb->uid);
+ printf(".nr " HEIGHT_FORMAT " \\n[" HEIGHT_FORMAT "]"
+ ">?\\n[" HEIGHT_FORMAT "]\n",
+ uid, p->uid, pb->uid);
+ printf(".nr " DEPTH_FORMAT " \\n[" DEPTH_FORMAT "]"
+ ">?\\n[" DEPTH_FORMAT "]\n",
+ uid, p->uid, pb->uid);
+ return res;
+}
+
+void prime_box::compute_subscript_kern()
+{
+ p->compute_subscript_kern();
+ printf(".nr " SUB_KERN_FORMAT " 0\\n[" WIDTH_FORMAT "]"
+ "+\\n[" SUB_KERN_FORMAT "]>?0\n",
+ uid, pb->uid, p->uid);
+}
+
+void prime_box::output()
+{
+ p->output();
+ pb->output();
+}
+
+void prime_box::handle_char_type(int st, int ft)
+{
+ p->handle_char_type(st, ft);
+ pb->handle_char_type(st, ft);
+}
+
+void prime_box::debug_print()
+{
+ p->debug_print();
+ putc('\'', stderr);
+}
+
+box *split_text(char *text)
+{
+ list_box *lb = 0;
+ box *fb = 0;
+ char *s = text;
+ while (*s != '\0') {
+ char c = *s++;
+ box *b = 0;
+ switch (c) {
+ case '+':
+ b = new special_char_box("pl");
+ break;
+ case '-':
+ b = new special_char_box("mi");
+ break;
+ case '=':
+ b = new special_char_box("eq");
+ break;
+ case '\'':
+ b = new special_char_box("fm");
+ break;
+ case '<':
+ if (*s == '=') {
+ b = new special_char_box("<=");
+ s++;
+ break;
+ }
+ goto normal_char;
+ case '>':
+ if (*s == '=') {
+ b = new special_char_box(">=");
+ s++;
+ break;
+ }
+ goto normal_char;
+ case '\\':
+ if (*s == '\0') {
+ lex_error("bad escape");
+ break;
+ }
+ c = *s++;
+ switch (c) {
+ case '(':
+ {
+ char buf[3];
+ if (*s != '\0') {
+ buf[0] = *s++;
+ if (*s != '\0') {
+ buf[1] = *s++;
+ buf[2] = '\0';
+ b = new special_char_box(buf);
+ }
+ else {
+ lex_error("bad escape");
+ }
+ }
+ else {
+ lex_error("bad escape");
+ }
+ }
+ break;
+ case '[':
+ {
+ char *ch = s;
+ while (*s != ']' && *s != '\0')
+ s++;
+ if (*s == '\0')
+ lex_error("bad escape");
+ else {
+ *s++ = '\0';
+ b = new special_char_box(ch);
+ }
+ }
+ break;
+ case 'f':
+ case 'g':
+ case 'k':
+ case 'n':
+ case '*':
+ {
+ char *escape_start = s - 2;
+ switch (*s) {
+ case '(':
+ if (*++s != '\0')
+ ++s;
+ break;
+ case '[':
+ for (++s; *s != '\0' && *s != ']'; s++)
+ ;
+ break;
+ }
+ if (*s == '\0')
+ lex_error("bad escape");
+ else {
+ ++s;
+ char *buf = new char[s - escape_start + 1];
+ memcpy(buf, escape_start, s - escape_start);
+ buf[s - escape_start] = '\0';
+ b = new quoted_text_box(buf);
+ }
+ }
+ break;
+ case '-':
+ case '_':
+ {
+ char buf[2];
+ buf[0] = c;
+ buf[1] = '\0';
+ b = new special_char_box(buf);
+ }
+ break;
+ case '`':
+ b = new special_char_box("ga");
+ break;
+ case '\'':
+ b = new special_char_box("aa");
+ break;
+ case 'e':
+ case '\\':
+ b = new char_box('\\');
+ break;
+ case '^':
+ case '|':
+ case '0':
+ {
+ char buf[3];
+ buf[0] = '\\';
+ buf[1] = c;
+ buf[2] = '\0';
+ b = new quoted_text_box(strsave(buf));
+ break;
+ }
+ default:
+ lex_error("unquoted escape");
+ b = new quoted_text_box(strsave(s - 2));
+ s = strchr(s, '\0');
+ break;
+ }
+ break;
+ default:
+ normal_char:
+ b = new char_box(c);
+ break;
+ }
+ while (*s == '\'') {
+ if (b == 0)
+ b = new quoted_text_box(0);
+ b = new prime_box(b);
+ s++;
+ }
+ if (b != 0) {
+ if (lb != 0)
+ lb->append(b);
+ else if (fb != 0) {
+ lb = new list_box(fb);
+ lb->append(b);
+ }
+ else
+ fb = b;
+ }
+ }
+ free(text);
+ if (lb != 0)
+ return lb;
+ else if (fb != 0)
+ return fb;
+ else
+ return new quoted_text_box(0);
+}
+
diff --git a/src/preproc/grn/README b/src/preproc/grn/README
new file mode 100644
index 0000000..73273f7
--- /dev/null
+++ b/src/preproc/grn/README
@@ -0,0 +1,68 @@
+This is grn from the Berkeley ditroff distribution. It has no
+AT&T code and is therefore freely distributable.
+
+Tim Theisen <tim@cs.wisc.edu>
+
+=====================================================================
+
+This is the modified code for the groff. It uses the different
+devxxx format that is ascii rather than binary as in the
+Berkeley distribution. Since groff does not have the \Ds option
+for line drawing (dotted, dashed, etc.), this version includes
+the routines for drawing curves and arcs, so it does not use the
+\D~, \Da nor \Dc. Although also included in here is a routine
+for drawing the optional gremlin style curves, it is not used
+because the gremlin editor uses the conventional spline
+algorithm. The Berkeley grn has the choice of different
+stipples. Here, only different shades of gray will be painted
+depending on the gremlin file. It is possible to upgrade this at
+a later time. (Daniel Senderowicz <daniel@synchrods.com> 12/28/99)
+
+=====================================================================
+
+Gremlin produces three types of curves: B-Splines, interpolated
+curves and Bezier. As the original Berkeley grn, now groff grn
+will honor B-Splines and interpolated curves. Bezier curves will
+be printed as B-Splines. (Daniel Senderowicz <daniel@synchrods.com>
+10/04/02)
+
+=====================================================================
+
+It has been further modified by Werner Lemberg <wl@gnu.org> to fit
+better into the groff package.
+
+ . Replaced Makefile with Makefile.sub.
+
+ . Removed dev.h since it is unused.
+
+ . Renamed grn.1 to grn.man; this man page has been extensively
+ revised.
+
+ . Used error() and fatal() from libgroff for all source files.
+
+ . Renamed *.c to *.cpp; updates as needed for C++ (prototypes, proper
+ casts, standard header files etc). Heavy formatting.
+
+ . main.cpp:
+
+ Using groff's default values instead of DEVDIR, DEFAULTDEV,
+ PRINTER, TYPESETTER, and GREMLIB.
+
+ 'res' is now an integer.
+
+ Added '-C' command flag (for compatibility mode) as with other
+ preprocessors.
+
+ Added '-F' and '-v' option (similar to troff).
+
+ Renamed '-L' option to '-M' for consistence.
+
+ Removed '-P' option.
+
+ Using font::load_desc() for scanning DESC files.
+
+ Removed SYSV-specific code.
+
+ Using macro_path.open_file() for getting gremlin graphic files.
+
+ Added usage().
diff --git a/src/preproc/grn/gprint.h b/src/preproc/grn/gprint.h
new file mode 100644
index 0000000..772d79a
--- /dev/null
+++ b/src/preproc/grn/gprint.h
@@ -0,0 +1,90 @@
+/* Last non-groff version: gprint.h 1.1 84/10/08
+ *
+ * This file contains standard definitions used by the gprint program.
+ */
+
+#include <stdio.h>
+#include <math.h>
+
+
+#define xorn(x,y) (x)
+ /* was 512 */
+#define yorn(x,y) (511 - (y)) /* switch direction for */
+ /* y-coordinates */
+
+#define STYLES 6
+#define SIZES 4
+#define FONTS 4
+#define SOLID -1
+#define DOTTED 004 /* 014 */
+#define DASHED 020 /* 034 */
+#define DOTDASHED 024 /* 054 */
+#define LONGDASHED 074
+
+#define DEFTHICK -1 /* default thickness */
+#define DEFSTYLE SOLID /* default line style */
+
+#define TRUE 1
+#define FALSE 0
+
+#define nullelt -1
+#define nullpt -1
+#define nullun NULL
+
+#define BOTLEFT 0
+#define BOTRIGHT 1
+#define CENTCENT 2
+#define VECTOR 3
+#define ARC 4
+#define CURVE 5
+#define POLYGON 6
+#define BSPLINE 7
+#define BEZIER 8
+#define TOPLEFT 10
+#define TOPCENT 11
+#define TOPRIGHT 12
+#define CENTLEFT 13
+#define CENTRIGHT 14
+#define BOTCENT 15
+#define TEXT(t) ( (t <= CENTCENT) || (t >= TOPLEFT) )
+
+/* WARNING * WARNING * WARNING * WARNING * WARNING * WARNING * WARNING
+ * The above (TEXT) test is dependent on the relative values of the
+ * constants and will have to change if these values change or if new
+ * commands are added with value greater than BOTCENT
+ */
+
+#define NUSER 4
+#define NFONTS 4
+#define NBRUSHES 6
+#define NSIZES 4
+#define NJUSTS 9
+#define NSTIPPLES 16
+
+#define ADD 1
+#define DELETE 2
+#define MOD 3
+
+typedef struct point {
+ double x, y;
+ struct point *nextpt;
+} POINT;
+
+typedef struct elmt {
+ int type, brushf, size, textlength;
+ char *textpt;
+ POINT *ptlist;
+ struct elmt *nextelt, *setnext;
+} ELT;
+
+#define DBNextElt(elt) (elt->nextelt)
+#define DBNextofSet(elt) (elt->setnext)
+#define DBNullelt(elt) (elt == NULL)
+#define Nullpoint(pt) ((pt) == (POINT *) NULL)
+#define PTNextPoint(pt) (pt->nextpt)
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/grn/grn.1.man b/src/preproc/grn/grn.1.man
new file mode 100644
index 0000000..cbc15ae
--- /dev/null
+++ b/src/preproc/grn/grn.1.man
@@ -0,0 +1,978 @@
+'\" t
+.TH @g@grn @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+@g@grn \- embed Gremlin images in
+.I groff
+documents
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2000-2020 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_grn_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY @g@grn
+.RB [ \-C ]
+.RB [ \-T\~\c
+.IR dev ]
+.RB [ \-M\~\c
+.IR dir ]
+.RB [ \-F\~\c
+.IR dir ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY @g@grn
+.B \-?
+.
+.SY @g@grn
+.B \-\-help
+.YS
+.
+.
+.SY @g@grn
+.B \-v
+.
+.SY @g@grn
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I @g@grn
+is a preprocessor for including
+.I gremlin
+pictures in
+.MR @g@troff @MAN1EXT@
+input.
+.
+.I @g@grn
+writes to standard output,
+processing only input lines between two that start with
+.B .GS
+and
+.BR .GE .
+.
+Those lines must contain
+.I @g@grn
+commands
+(see below).
+.
+These macros request a
+.I gremlin
+file;
+the picture in that file is converted and placed in the
+.I @g@troff
+input stream.
+.
+.B .GS
+may be called with a
+.BR C ,
+.BR L ,
+or
+.B R
+argument to center,
+left-,
+or right-justify the whole
+.I gremlin
+picture
+(the default is to center).
+.
+If no
+.I file
+is mentioned,
+the standard input is read.
+.
+At the end of the picture,
+the position on the page is the bottom of the
+.I gremlin
+picture.
+.
+If the
+.I @g@grn
+entry is ended with
+.B .GF
+instead of
+.BR .GE ,
+the position is left at the top of the picture.
+.
+.
+.PP
+Currently only the
+.I me
+macro package has support for
+.BR .GS ,
+.BR .GE ,
+and
+.BR .GF .
+.
+.
+.PP
+.I @g@grn
+produces drawing escape sequences that use
+.IR groff 's
+color scheme extension
+.RB ( \[rs]D\[aq]F \~.\|.\|.\& \[aq] ),
+and thus may not work with other
+.IR troff s.
+.
+.
+.\" ====================================================================
+.SS "\f[I]grn\f[] commands"
+.\" ====================================================================
+.
+Each input line between
+.B .GS
+and
+.B .GE
+may have one
+.I @g@grn
+command.
+.
+Commands consist of one or two strings separated by white space,
+the first string being the command and the second its operand.
+.
+Commands may be upper- or lowercase and abbreviated down to one
+character.
+.
+.
+.PP
+Commands that affect a picture's environment
+(those listed before
+.RB \%\[lq] default \[rq],
+see below)
+are only in effect for the current picture:
+the environment is reinitialized to the defaults at the start of the
+next picture.
+.
+The commands are as follows.
+.
+.
+.TP
+.BI 1\~ N
+.TQ
+.BI 2\~ N
+.TQ
+.BI 3\~ N
+.TQ
+.BI 4\~ N
+.
+Set
+.IR gremlin 's
+text size number 1
+(2,
+3,
+or 4)
+to
+.I N
+points.
+.
+The default is 12
+(16,
+24,
+and 36,
+respectively).
+.
+.
+.TP
+.BI roman\~ f
+.TQ
+.BI italics\~ f
+.TQ
+.BI bold\~ f
+.TQ
+.BI special\~ f
+Set the roman
+(italics,
+bold,
+or special)
+font to
+.IR @g@troff 's
+font
+.I f
+(either a name or number).
+.
+The default is R
+(I,
+B,
+and S,
+respectively).
+.
+.
+.TP
+.BI l\~ f
+.TQ
+.BI stipple\~ f
+Set the stipple font to
+.IR @g@troff 's
+stipple font
+.I f
+(name or number).
+.
+The command
+.B \%stipple
+may be abbreviated down as far as
+.RB \[lq] st \[rq]
+(to avoid confusion with
+.RB \%\[lq] special \[rq]).
+.
+There is
+.I no
+default for stipples
+(unless one is set by the
+.RB \%\[lq] default \[rq]
+command),
+and it is invalid to include a
+.I gremlin
+picture with polygons without specifying a stipple font.
+.
+.
+.TP
+.BI x\~ N
+.TQ
+.BI scale\~ N
+Magnify the picture
+(in addition to any default magnification)
+by
+.IR N ,
+a floating-point number larger than zero.
+.
+The command
+.B scale
+may be abbreviated down to
+.RB \[lq] sc \[rq].
+.
+.
+.TP
+.BI narrow\~ N
+.TQ
+.BI medium\~ N
+.TQ
+.BI thick\~ N
+.
+Set the thickness of
+.IR gremlin 's
+narrow
+(medium and thick,
+respectively)
+lines to
+.I N
+times 0.15pt
+(this value can be changed at compile time).
+.
+The default is 1.0
+(3.0 and 5.0,
+respectively),
+which corresponds to 0.15pt
+(0.45pt and 0.75pt,
+respectively).
+.
+A thickness value of zero selects the smallest available line thickness.
+.
+Negative values cause the line thickness to be proportional to the
+current point size.
+.
+.
+.TP
+.BR pointscale\~ [ off | on ]
+Scale text to match the picture.
+.
+Gremlin text is usually printed in the point size specified with the
+commands
+.BR 1 ,
+.BR 2 ,
+.BR 3 ,
+.RB or\~ 4 ,
+regardless of any scaling factors in the picture.
+.
+Setting
+.B pointscale
+will cause the point sizes to scale with the picture
+(within
+.IR @g@troff 's
+limitations,
+of course).
+.
+An operand of anything but
+.B off
+will turn text scaling on.
+.
+.
+.TP
+.B default
+Reset the picture environment defaults to the settings in the current
+picture.
+.
+This is meant to be used as a global parameter setting mechanism at
+the beginning of the
+.I @g@troff
+input file,
+but can be used at any time to reset the default settings.
+.
+.
+.TP
+.BI width\~ N
+Force the picture to be
+.I N
+inches wide.
+.
+This overrides any scaling factors present in the same picture.
+.
+.RB \[lq] "width 0" \[rq]
+is ignored.
+.
+.
+.TP
+.BI height\~ N
+Force the picture to be
+.I N
+inches high,
+overriding other scaling factors.
+.
+If both
+.B width
+and
+.B height
+are specified,
+the tighter constraint will determine the scale of the picture.
+.
+.B height
+and
+.B width
+commands are not saved with a
+.RB \%\[lq] default \[rq]
+command.
+.
+They will,
+however,
+affect point size scaling if that option is set.
+.
+.
+.TP
+.BI file\~ name
+Get picture from
+.I gremlin
+file
+.I name
+located the current directory
+(or in the library directory;
+see the
+.B \-M
+option above).
+.
+If multiple
+.B file
+commands are given,
+the last one controls.
+.
+If
+.I name
+doesn't exist,
+an error message is reported and processing continues from the
+.B .GE
+line.
+.
+.
+.\" ====================================================================
+.SS "Usage with \f[I]groff\f[]"
+.\" ====================================================================
+.
+Since
+.I @g@grn
+is a preprocessor,
+it has no access to elements of formatter state,
+such as
+indentation,
+line length,
+type size,
+or
+register values.
+.
+Consequently,
+no
+.I @g@troff
+input can be placed between the
+.B .GS
+and
+.B .GE
+macros.
+.
+However,
+.I gremlin
+text elements are subsequently processed by
+.IR @g@troff ,
+so anything valid in a single line of
+.I @g@troff
+input is valid in a line of
+.I gremlin
+text
+(barring the dot control character \[lq].\[rq] at the beginning of a
+line).
+.
+Thus,
+it is possible to have equations within a
+.I gremlin
+figure by including in the
+.I gremlin
+file
+.I eqn \" language
+expressions enclosed by previously defined delimiters
+(e.g.,
+\[lq]$$\[rq]).
+.
+.
+.PP
+When using
+.I @g@grn
+along with other preprocessors,
+it is best to run
+.MR @g@tbl @MAN1EXT@
+before
+.IR @g@grn ,
+.MR @g@pic @MAN1EXT@ ,
+and/or
+.I ideal \" no GNU version yet
+to avoid overworking
+.IR @g@tbl .
+.
+.MR @g@eqn @MAN1EXT@
+should always be run last.
+.
+.MR groff @MAN1EXT@
+will automatically run preprocessors in the correct order.
+.
+.
+.PP
+A picture is considered an entity,
+but that doesn't stop
+.I @g@troff
+from trying to break it up if it falls off the end of a page.
+.
+Placing the picture between \[lq]keeps\[rq] in the
+.I me
+macros will ensure proper placement.
+.
+.
+.PP
+.I @g@grn
+uses
+.IR @g@troff 's
+registers
+.B g1
+through
+.B g9
+and sets registers
+.B g1
+and
+.B g2
+to the width and height of the
+.I gremlin
+figure
+(in device units)
+before entering the
+.B .GS
+macro
+(this is for those who want to rewrite these macros).
+.
+.
+.\" ====================================================================
+.SS "Gremlin file format"
+.\" ====================================================================
+.
+There exist two distinct
+.I gremlin
+file formats:
+the original format for AED graphic terminals,
+and the Sun or X11 version.
+.
+An extension used by the Sun/X11 version allowing reference points with
+negative coordinates is
+.I not
+compatible with the AED version.
+.
+As long as a
+.I gremlin
+file does not contain negative coordinates,
+either format will be read correctly by either version of
+.I gremlin
+or
+.IR @g@grn .
+.
+The other difference in
+Sun/X11 format is the use of names for picture objects
+(e.g.,
+.BR POLYGON ,
+.BR CURVE )
+instead of numbers.
+.
+Files representing the same picture are shown below.
+.
+.
+.PP
+.ie t .ne 18v
+.el .ne 19v
+.TS
+center, tab(@);
+l lw(0.1i) l.
+sungremlinfile@@gremlinfile
+0 240.00 128.00@@0 240.00 128.00
+CENTCENT@@2
+240.00 128.00@@240.00 128.00
+185.00 120.00@@185.00 120.00
+240.00 120.00@@240.00 120.00
+296.00 120.00@@296.00 120.00
+*@@\-1.00 \-1.00
+2 3@@2 3
+10 A Triangle@@10 A Triangle
+POLYGON@@6
+224.00 416.00@@224.00 416.00
+96.00 160.00@@96.00 160.00
+384.00 160.00@@384.00 160.00
+*@@\-1.00 \-1.00
+5 1@@5 1
+0@@0
+\-1@@\-1
+.TE
+.
+.
+.IP \[bu] 2n
+The first line of each
+.I gremlin
+file contains either the string
+.RB \[lq] gremlinfile \[rq]
+(AED)
+or
+.RB \[lq] sungremlinfile \[rq]
+(Sun/X11).
+.
+.
+.IP \[bu]
+The second line of the file contains an orientation and
+.I x
+and
+.I y
+values for a positioning point,
+separated by spaces.
+.
+The orientation,
+either
+.B 0
+or
+.BR 1 ,
+is ignored by the Sun/X11 version.
+.
+.B 0
+means that
+.I gremlin
+will display things in horizontal format
+(a drawing area wider than it is tall,
+with a menu across the top).
+.
+.B 1
+means that
+.I gremlin
+will display things in vertical format
+(a drawing area taller than it is wide,
+with a menu on the left side).
+.
+.I x
+and
+.I y
+are floating-point values giving a positioning point to be used when
+this file is read into another file.
+.
+The stuff on this line really isn't all that important;
+a value of
+.RB \[lq] "1 0.00 0.00" \[rq]
+is suggested.
+.
+.
+.IP \[bu]
+The rest of the file consists of zero or more element specifications.
+.
+After the last element specification is a line containing the string
+.RB \[lq] \-1 \[rq].
+.
+.
+.IP \[bu]
+Lines longer than 127 characters are truncated to that length.
+.
+.
+.\" ====================================================================
+.SS "Element specifications"
+.\" ====================================================================
+.
+.IP \[bu] 2n
+The first line of each element contains a single decimal number giving
+the type of the element (AED) or its name (Sun/X11).
+.
+.
+.IP
+.ie t .ne 18v
+.el .ne 19v
+.TS
+center, tab(@);
+css
+ccc
+nBlBl.
+\f[I]gremlin\f[] File Format: Object Type Specification
+_
+AED Number@Sun/X11 Name@Description
+0@BOTLEFT@bottom-left-justified text
+1@BOTRIGHT@bottom-right-justified text
+2@CENTCENT@center-justified text
+3@VECTOR@vector
+4@ARC@arc
+5@CURVE@curve
+6@POLYGON@polygon
+7@BSPLINE@b-spline
+8@BEZIER@B\['e]zier
+10@TOPLEFT@top-left-justified text
+11@TOPCENT@top-center-justified text
+12@TOPRIGHT@top-right-justified text
+13@CENTLEFT@left-center-justified text
+14@CENTRIGHT@right-center-justified text
+15@BOTCENT@bottom-center-justified text
+.TE
+.
+.
+.IP \[bu]
+After the object type comes a variable number of lines,
+each specifying a point used to display the element.
+.
+Each line contains an x-coordinate and a y-coordinate in floating-point
+format,
+separated by spaces.
+.
+The list of points is terminated by a line containing the string
+.RB \[lq] "\-1.0 \-1.0" \[rq]
+(AED) or a single asterisk,
+.RB \[lq] * \[rq]
+(Sun/X11).
+.
+.
+.IP \[bu]
+After the points comes a line containing two decimal values,
+giving the brush and size for the element.
+.
+The brush determines the style in which things are drawn.
+.
+For vectors,
+arcs,
+and curves there are six valid brush values.
+.
+.
+.IP
+.TS
+center, tab(@);
+nB l.
+1@thin dotted lines
+2@thin dot-dashed lines
+3@thick solid lines
+4@thin dashed lines
+5@thin solid lines
+6@medium solid lines
+.TE
+.
+.
+.IP
+For polygons,
+one more value,
+0,
+is valid.
+.
+It specifies a polygon with an invisible border.
+.
+For text,
+the brush selects a font as follows.
+.
+.
+.IP
+.TS
+center, tab(@);
+nB l.
+1@roman (R font in \f[I]@g@troff\f[])
+2@italics (I font in \f[I]@g@troff\f[])
+3@bold (B font in \f[I]@g@troff\f[])
+4@special (S font in \f[I]@g@troff\f[])
+.TE
+.
+.
+.IP
+If you're using
+.I @g@grn
+to run your pictures through
+.IR groff ,
+the font is really just a starting font.
+.
+The text string can contain formatting sequences like
+\[lq]\[rs]fI\[rq]
+or
+\[lq]\[rs]d\[rq]
+which may change the font
+(as well as do many other things).
+.
+For text,
+the size field is a decimal value between 1 and 4.
+.
+It selects the size of the font in which the text will be drawn.
+.
+For polygons,
+this size field is interpreted as a stipple number to fill the polygon
+with.
+.
+The number is used to index into a stipple font at print time.
+.
+.
+.IP \[bu]
+The last line of each element contains a decimal number and a string of
+characters,
+separated by a single space.
+.
+The number is a count of the number of characters in the string.
+.
+This information is used only for text elements,
+and contains the text string.
+.
+There can be spaces inside the text.
+.
+For arcs,
+curves,
+and vectors,
+the character count is zero
+.RB ( 0 ),
+followed by exactly one space before the newline.
+.
+.
+.\" ====================================================================
+.SS Coordinates
+.\" ====================================================================
+.
+.I gremlin
+was designed for AED terminals,
+and its coordinates reflect the AED coordinate space.
+.
+For vertical pictures,
+.IR x \~values
+range 116 to 511,
+and
+.IR y \~values
+from 0 to 483.
+.
+For horizontal pictures,
+.IR x \~values
+range from 0 to 511,
+and
+.IR y \~values
+from 0 to 367.
+.
+Although you needn't absolutely stick to this range,
+you'll get better results if you at least stay in this vicinity.
+.
+Also,
+point lists are terminated by a point of
+(\-1,
+\-1),
+so you shouldn't ever use negative coordinates.
+.
+.I gremlin
+writes out coordinates using the
+.MR printf 3
+format \[lq]%f1.2\[rq];
+it's probably a good idea to use the same format if you want to modify
+the
+.I @g@grn
+code.
+.
+.
+.\" ====================================================================
+.SS "Sun/X11 coordinates"
+.\" ====================================================================
+.
+There is no restriction on the range of coordinates used to create
+objects in the Sun/X11 version of
+.IR gremlin .
+.
+However,
+files with negative coordinates
+.I will
+cause problems if displayed on the AED.
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-?\&
+and
+.B \-\-help
+display a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.B \-C
+Recognize
+.B .GS
+and
+.B .GE
+(and
+.BR .GF )
+even when followed by a character other than space or newline.
+.
+.
+.TP
+.BI \-F\~ dir
+Search
+.I dir
+for subdirectories
+.IR dev name
+.RI ( name
+is the name of the output driver)
+for the
+.I DESC
+file before the default font directories
+.IR @LOCALFONTDIR@ ,
+.IR @FONTDIR@ ,
+and
+.IR @LEGACYFONTDIR@ .
+.
+.
+.TP
+.BI \-M\~ dir
+Prepend
+.I dir
+to the search path for
+.I gremlin
+files.
+.
+The default search path is the current directory,
+the home directory,
+.if !'@COMPATIBILITY_WRAPPERS@'no' .IR @SYSTEMMACRODIR@ ,
+.IR @LOCALMACRODIR@ ,
+and
+.IR @MACRODIR@ ,
+in that order.
+.\".
+.\".
+.\".TP
+.\".B \-s
+.\"This switch causes the picture to be traversed twice:
+.\"The first time,
+.\"only the interiors of filled polygons
+.\"(as borderless polygons)
+.\"are printed.
+.\".
+.\"The second time,
+.\"the outline is printed as a series of line segments.
+.\".
+.\"This way,
+.\"postprocessors that overwrite rather than merge picture elements
+.\"(such as PostScript)
+.\"can still have text and graphics on a shaded background.
+.
+.
+.TP
+.BI \-T\~ dev
+Prepare device output using output driver
+.IR dev .
+.
+The default is
+.BR @DEVICE@ .
+.
+See
+.MR groff @MAN1EXT@
+for a list of valid devices.
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.IR @FONTDIR@/\:\%dev name /\:DESC
+describes the output device
+.IR name .
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+David Slattengren and Barry Roitblat wrote the original Berkeley
+.IR grn .
+.
+Daniel Senderowicz and Werner Lemberg modified it for
+.IR groff .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.MR gremlin 1 ,
+.MR groff @MAN1EXT@ ,
+.MR @g@pic @MAN1EXT@ ,
+.MR ideal 1
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_grn_1_man_C]
+.do rr *groff_grn_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/preproc/grn/grn.am b/src/preproc/grn/grn.am
new file mode 100644
index 0000000..f45fa24
--- /dev/null
+++ b/src/preproc/grn/grn.am
@@ -0,0 +1,35 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+prefixexecbin_PROGRAMS += grn
+grn_SOURCES = \
+ src/preproc/grn/hdb.cpp \
+ src/preproc/grn/hpoint.cpp \
+ src/preproc/grn/hgraph.cpp \
+ src/preproc/grn/main.cpp \
+ src/preproc/grn/gprint.h
+src/preproc/grn/main.$(OBJEXT): defs.h
+grn_LDADD = libgroff.a lib/libgnu.a $(LIBM)
+PREFIXMAN1 += src/preproc/grn/grn.1
+EXTRA_DIST += src/preproc/grn/README src/preproc/grn/grn.1.man
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/preproc/grn/hdb.cpp b/src/preproc/grn/hdb.cpp
new file mode 100644
index 0000000..9ba3eaa
--- /dev/null
+++ b/src/preproc/grn/hdb.cpp
@@ -0,0 +1,441 @@
+ /* Last non-groff version: hdb.c 1.8 (Berkeley) 84/10/20
+ *
+ * Copyright -C- 1982 Barry S. Roitblat
+ *
+ * This file contains database routines for the hard copy programs of
+ * the gremlin picture editor.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include "gprint.h"
+#include <string.h>
+#include <ctype.h>
+
+#include "errarg.h"
+#include "error.h"
+
+#define MAXSTRING 128
+#define MAXSTRING_S "127"
+
+/* imports from main.cpp */
+
+extern char gremlinfile[]; /* name of file currently reading */
+extern int SUNFILE; /* TRUE if SUN gremlin file */
+extern int compatibility_flag; /* TRUE if in compatibility mode */
+extern void *grnmalloc(size_t size, const char *what);
+extern void savebounds(double x, double y);
+
+/* imports from hpoint.cpp */
+
+extern POINT *PTInit();
+extern POINT *PTMakePoint(double x, double y, POINT ** pplist);
+
+
+int DBGetType(char *s);
+
+static long lineno = 0; /* line number of gremlin file */
+
+/*
+ * This routine returns a pointer to an initialized database element
+ * which would be the only element in an empty list.
+ */
+ELT *
+DBInit()
+{
+ return ((ELT *) NULL);
+} /* end DBInit */
+
+
+/*
+ * This routine creates a new element with the specified attributes and
+ * links it into database.
+ */
+ELT *
+DBCreateElt(int type,
+ POINT * pointlist,
+ int brush,
+ int size,
+ char *text,
+ ELT **db)
+{
+ ELT *temp = 0;
+
+ temp = (ELT *) grnmalloc(sizeof(ELT), "picture element");
+ temp->nextelt = *db;
+ temp->type = type;
+ temp->ptlist = pointlist;
+ temp->brushf = brush;
+ temp->size = size;
+ temp->textpt = text;
+ *db = temp;
+ return (temp);
+} /* end CreateElt */
+
+
+/*
+ * This routine reads the specified file into a database and returns a
+ * pointer to that database.
+ */
+ELT *
+DBRead(FILE *file)
+{
+ int i;
+ int done; /* flag for input exhausted */
+ double nx; /* x holder so x is not set before orienting */
+ int type; /* element type */
+ ELT *elist; /* pointer to the file's elements */
+ POINT *plist; /* pointer for reading in points */
+ char string[MAXSTRING], *txt;
+ double x, y; /* x and y are read in point coords */
+ int len, brush, size;
+ int lastpoint;
+
+ SUNFILE = FALSE;
+ elist = DBInit();
+ int nitems = fscanf(file, "%" MAXSTRING_S "s%*[^\n]\n", string);
+ if (nitems != 1) {
+ error_with_file_and_line(gremlinfile, lineno,
+ "malformed input; giving up on this"
+ " picture");
+ return (elist);
+ }
+ lineno++;
+ if (strcmp(string, "gremlinfile")) {
+ if (strcmp(string, "sungremlinfile")) {
+ error_with_file_and_line(gremlinfile, lineno,
+ "not a gremlin file; giving up on this"
+ " picture");
+ return (elist);
+ }
+ SUNFILE = TRUE;
+ }
+
+ nitems = fscanf(file, "%d%lf%lf\n", &size, &x, &y);
+ if (nitems != 3) {
+ error_with_file_and_line(gremlinfile, lineno,
+ "malformed input; giving up on this"
+ " picture");
+ return (elist);
+ }
+ lineno++;
+ /* ignore orientation and file positioning point */
+
+ done = FALSE;
+ while (!done) {
+ /* if (fscanf(file,"%" MAXSTRING_S "s\n", string) == EOF) */
+ /* I changed the scanf format because the element */
+ /* can have two words (e.g. CURVE SPLINE) */
+ if (fscanf(file, "\n%"
+ MAXSTRING_S
+ "[^\n]%*[^\n]\n", string) == EOF) {
+ lineno++;
+ error_with_file_and_line(gremlinfile, lineno, "error in format;"
+ " giving up on this picture");
+ return (elist);
+ }
+ lineno++;
+
+ type = DBGetType(string); /* interpret element type */
+ if (type < 0) { /* no more data */
+ done = TRUE;
+ } else {
+ /* always one point */
+#ifdef UW_FASTSCAN
+ (void) xscanf(file, &x, &y);
+#else
+ nitems = fscanf(file, "%lf%lf\n", &x, &y);
+ if (nitems != 2) {
+ error_with_file_and_line(gremlinfile, lineno,
+ "malformed input; giving up on this"
+ " picture");
+ return (elist);
+ }
+ lineno++;
+#endif /* UW_FASTSCAN */
+ plist = PTInit(); /* NULL point list */
+
+ /*
+ * Files created on the SUN have point lists terminated by a line
+ * containing only an asterisk ('*'). Files created on the AED
+ * have point lists terminated by the coordinate pair (-1.00
+ * -1.00).
+ */
+ if (TEXT(type)) { /* read only first point for TEXT elements */
+ nx = xorn(x, y);
+ y = yorn(x, y);
+ (void) PTMakePoint(nx, y, &plist);
+ savebounds(nx, y);
+
+#ifdef UW_FASTSCAN
+ while (xscanf(file, &x, &y));
+#else
+ lastpoint = FALSE;
+ do {
+ char *cp = fgets(string, MAXSTRING, file);
+ if (0 /* nullptr */ == cp) {
+ error_with_file_and_line(gremlinfile, lineno,
+ "premature end-of-file or error"
+ " reading input; giving up on this"
+ " picture");
+ return(elist);
+ }
+ lineno++;
+ if (string[0] == '*') { /* SUN gremlin file */
+ lastpoint = TRUE;
+ } else {
+ if (!sscanf(string, "%lf%lf", &x, &y)) {
+ error_with_file_and_line(gremlinfile, lineno,
+ "expected coordinate pair, got"
+ " '%1'; giving up on this"
+ " picture", string);
+ return(elist);
+ }
+ if ((x == -1.00 && y == -1.00) && (!SUNFILE))
+ lastpoint = TRUE;
+ else {
+ if (compatibility_flag)
+ savebounds(xorn(x, y), yorn(x, y));
+ }
+ }
+ } while (!lastpoint);
+#endif /* UW_FASTSCAN */
+ } else { /* not TEXT element */
+#ifdef UW_FASTSCAN
+ do {
+ nx = xorn(x, y);
+ y = yorn(x, y);
+ (void) PTMakePoint(nx, y, &plist);
+ savebounds(nx, y);
+ } while (xscanf(file, &x, &y));
+#else
+ lastpoint = FALSE;
+ while (!lastpoint) {
+ nx = xorn(x, y);
+ y = yorn(x, y);
+ (void) PTMakePoint(nx, y, &plist);
+ savebounds(nx, y);
+
+ char *cp = fgets(string, MAXSTRING, file);
+ if (0 /* nullptr */ == cp) {
+ error_with_file_and_line(gremlinfile, lineno,
+ "premature end-of-file or error"
+ " reading input; giving up on this"
+ " picture");
+ return(elist);
+ }
+ lineno++;
+ if (string[0] == '*') { /* SUN gremlin file */
+ lastpoint = TRUE;
+ } else {
+ (void) sscanf(string, "%lf%lf", &x, &y);
+ if ((x == -1.00 && y == -1.00) && (!SUNFILE))
+ lastpoint = TRUE;
+ }
+ }
+#endif /* UW_FASTSCAN */
+ }
+ nitems = fscanf(file, "%d%d\n", &brush, &size);
+ if (nitems != 2) {
+ error_with_file_and_line(gremlinfile, lineno,
+ "malformed input; giving up on this"
+ " picture");
+ return (elist);
+ }
+ lineno++;
+ nitems = fscanf(file, "%d", &len); /* text length */
+ if (nitems != 1) {
+ error_with_file_and_line(gremlinfile, lineno,
+ "malformed input; giving up on this"
+ " picture");
+ return (elist);
+ }
+ (void) getc(file); /* eat blank */
+ lineno++; /* advance line counter early */
+ if (len < 0) {
+ error_with_file_and_line(gremlinfile, lineno,
+ "length claimed for text is nonsense:"
+ " '%1'; giving up on this picture",
+ len);
+ return (elist);
+ }
+ txt = (char *) grnmalloc((unsigned) len + 1, "element text");
+ for (i = 0; i < len; ++i) { /* read text */
+ int c = getc(file);
+ if (c == EOF)
+ break;
+ txt[i] = c;
+ }
+ if (feof(file)) {
+ error_with_file_and_line(gremlinfile, lineno,
+ "end of file while reading text of"
+ " length %1; giving up on this"
+ " picture", len);
+ return (elist);
+ }
+ txt[len] = '\0';
+ (void) DBCreateElt(type, plist, brush, size, txt, &elist);
+ } /* end else */
+ } /* end while not done */ ;
+ return (elist);
+} /* end DBRead */
+
+
+/*
+ * Interpret element type in string s.
+ * Old file format consisted of integer element types.
+ * New file format has literal names for element types.
+ */
+int
+DBGetType(char *s)
+{
+ if (isdigit(s[0]) || (s[0] == '-')) /* old element format or EOF */
+ return (atoi(s));
+
+ switch (s[0]) {
+ case 'P':
+ return (POLYGON);
+ case 'V':
+ return (VECTOR);
+ case 'A':
+ return (ARC);
+ case 'C':
+ if (s[1] == 'U') {
+ if (s[5] == '\n')
+ return (CURVE);
+ switch (s[7]) {
+ case 'S':
+ return(BSPLINE);
+ case 'E':
+ warning_with_file_and_line(gremlinfile, lineno,
+ "using B-spline for Bezier curve");
+ return(BSPLINE);
+ default:
+ return(CURVE);
+ }
+ }
+ switch (s[4]) {
+ case 'L':
+ return (CENTLEFT);
+ case 'C':
+ return (CENTCENT);
+ case 'R':
+ return (CENTRIGHT);
+ default:
+ error_with_file_and_line(gremlinfile, lineno,
+ "unknown element type '%1'", s);
+ return -1;
+ }
+ case 'B':
+ switch (s[3]) {
+ case 'L':
+ return (BOTLEFT);
+ case 'C':
+ return (BOTCENT);
+ case 'R':
+ return (BOTRIGHT);
+ default:
+ error_with_file_and_line(gremlinfile, lineno,
+ "unknown element type '%1'", s);
+ return -1;
+ }
+ case 'T':
+ switch (s[3]) {
+ case 'L':
+ return (TOPLEFT);
+ case 'C':
+ return (TOPCENT);
+ case 'R':
+ return (TOPRIGHT);
+ default:
+ error_with_file_and_line(gremlinfile, lineno,
+ "unknown element type '%1'", s);
+ return -1;
+ }
+ default:
+ error_with_file_and_line(gremlinfile, lineno,
+ "unknown element type '%1'", s);
+ return -1;
+ }
+}
+
+#ifdef UW_FASTSCAN
+/*
+ * Optimization hack added by solomon@crys.wisc.edu, 12/2/86.
+ * A huge fraction of the time was spent reading floating point numbers
+ * from the input file, but the numbers always have the format 'ddd.dd'.
+ * Thus the following special-purpose version of fscanf.
+ *
+ * xscanf(f,xp,yp) does roughly what fscanf(f,"%f%f",xp,yp) does except:
+ * -the next piece of input must be of the form
+ * <space>* <digit>*'.'<digit>* <space>* <digit>*'.'<digit>*
+ * -xscanf eats the character following the second number
+ * -xscanf returns 0 for "end-of-data" indication, 1 otherwise, where
+ * end-of-data is signalled by a '*' [in which case the rest of the
+ * line is gobbled], or by '-1.00 -1.00' [but only if !SUNFILE].
+ */
+int
+xscanf(FILE *f,
+ double *xp,
+ double *yp)
+{
+ int c, i, j, m, frac;
+ int iscale = 1, jscale = 1; /* x = i/scale, y=j/jscale */
+
+ while ((c = getc(f)) == ' ');
+ if (c == '*') {
+ while ((c = getc(f)) != '\n');
+ return 0;
+ }
+ i = m = frac = 0;
+ while (isdigit(c) || c == '.' || c == '-') {
+ if (c == '-') {
+ m++;
+ c = getc(f);
+ continue;
+ }
+ if (c == '.')
+ frac = 1;
+ else {
+ if (frac)
+ iscale *= 10;
+ i = 10 * i + c - '0';
+ }
+ c = getc(f);
+ }
+ if (m)
+ i = -i;
+ *xp = (double) i / (double) iscale;
+
+ while ((c = getc(f)) == ' ');
+ j = m = frac = 0;
+ while (isdigit(c) || c == '.' || c == '-') {
+ if (c == '-') {
+ m++;
+ c = getc(f);
+ continue;
+ }
+ if (c == '.')
+ frac = 1;
+ else {
+ if (frac)
+ jscale *= 10;
+ j = 10 * j + c - '0';
+ }
+ c = getc(f);
+ }
+ if (m)
+ j = -j;
+ *yp = (double) j / (double) jscale;
+ return (SUNFILE || i != -iscale || j != -jscale);
+}
+#endif /* UW_FASTSCAN */
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/grn/hgraph.cpp b/src/preproc/grn/hgraph.cpp
new file mode 100644
index 0000000..9ed81a4
--- /dev/null
+++ b/src/preproc/grn/hgraph.cpp
@@ -0,0 +1,1060 @@
+/* Last non-groff version: hgraph.c 1.14 (Berkeley) 84/11/27
+ *
+ * This file contains the graphics routines for converting gremlin
+ * pictures to troff input.
+ */
+
+#include "lib.h"
+
+#include "gprint.h"
+
+#define MAXVECT 40
+#define MAXPOINTS 200
+#define LINELENGTH 1
+#define PointsPerInterval 64
+#define pi 3.14159265358979324
+#define twopi (2.0 * pi)
+#define len(a, b) groff_hypot((double)(b.x-a.x), \
+ (double)(b.y-a.y))
+
+
+extern int dotshifter; /* for the length of dotted curves */
+
+extern int style[]; /* line and character styles */
+extern double thick[];
+extern char *tfont[];
+extern int tsize[];
+extern int stipple_index[]; /* stipple font idx for stipples 0-16 */
+extern char *stipple; /* stipple type (cf or ug) */
+
+
+extern double troffscale; /* imports from main.c */
+extern double linethickness;
+extern int linmod;
+extern int lastx;
+extern int lasty;
+extern int lastyline;
+extern int ytop;
+extern int ybottom;
+extern int xleft;
+extern int xright;
+extern enum E {
+ OUTLINE, FILL, BOTH
+} polyfill;
+
+extern double adj1;
+extern double adj2;
+extern double adj3;
+extern double adj4;
+extern int res;
+
+void HGSetFont(int font, int size);
+void HGPutText(int justify, POINT pnt, char *string);
+void HGSetBrush(int mode);
+void tmove2(int px, int py);
+void doarc(POINT cp, POINT sp, int angle);
+void tmove(POINT * ptr);
+void cr();
+void drawwig(POINT * ptr, int type);
+void HGtline(int x1, int y1);
+void deltax(double x);
+void deltay(double y);
+void HGArc(int cx, int cy, int px, int py, int angle);
+void picurve(int *x, int *y, int npts);
+void HGCurve(int *x, int *y, int numpoints);
+void Parameterize(int x[], int y[], double h[], int n);
+void PeriodicSpline(double h[], int z[],
+ double dz[], double d2z[], double d3z[],
+ int npoints);
+void NaturalEndSpline(double h[], int z[],
+ double dz[], double d2z[], double d3z[],
+ int npoints);
+
+
+
+/*--------------------------------------------------------------------*
+ | Routine: HGPrintElt (element_pointer, baseline)
+ |
+ | Results: Examines a picture element and calls the appropriate
+ | routine(s) to print them according to their type. After
+ | the picture is drawn, current position is (lastx,lasty).
+ *--------------------------------------------------------------------*/
+
+void
+HGPrintElt(ELT *element,
+ int /* baseline */)
+{
+ POINT *p1;
+ POINT *p2;
+ int length;
+ int graylevel;
+
+ if (!DBNullelt(element) && !Nullpoint((p1 = element->ptlist))) {
+ /* p1 always has first point */
+ if (TEXT(element->type)) {
+ HGSetFont(element->brushf, element->size);
+ switch (element->size) {
+ case 1:
+ p1->y += adj1;
+ break;
+ case 2:
+ p1->y += adj2;
+ break;
+ case 3:
+ p1->y += adj3;
+ break;
+ case 4:
+ p1->y += adj4;
+ break;
+ default:
+ break;
+ }
+ HGPutText(element->type, *p1, element->textpt);
+ } else {
+ if (element->brushf) /* if there is a brush, the */
+ HGSetBrush(element->brushf); /* graphics need it set */
+
+ switch (element->type) {
+
+ case ARC:
+ p2 = PTNextPoint(p1);
+ tmove(p2);
+ doarc(*p1, *p2, element->size);
+ cr();
+ break;
+
+ case CURVE:
+ length = 0; /* keep track of line length */
+ drawwig(p1, CURVE);
+ cr();
+ break;
+
+ case BSPLINE:
+ length = 0; /* keep track of line length */
+ drawwig(p1, BSPLINE);
+ cr();
+ break;
+
+ case VECTOR:
+ length = 0; /* keep track of line length so */
+ tmove(p1); /* single lines don't get long */
+ while (!Nullpoint((p1 = PTNextPoint(p1)))) {
+ HGtline((int) (p1->x * troffscale),
+ (int) (p1->y * troffscale));
+ if (length++ > LINELENGTH) {
+ length = 0;
+ printf("\\\n");
+ }
+ } /* end while */
+ cr();
+ break;
+
+ case POLYGON:
+ {
+ /* brushf = style of outline; size = color of fill:
+ * on first pass (polyfill=FILL), do the interior using 'P'
+ * unless size=0
+ * on second pass (polyfill=OUTLINE), do the outline using a
+ * series of vectors. It might make more sense to use \D'p
+ * ...', but there is no uniform way to specify a 'fill
+ * character' that prints as 'no fill' on all output
+ * devices (and stipple fonts).
+ * If polyfill=BOTH, just use the \D'p ...' command.
+ */
+ double firstx = p1->x;
+ double firsty = p1->y;
+
+ length = 0; /* keep track of line length so */
+ /* single lines don't get long */
+
+ if (polyfill == FILL || polyfill == BOTH) {
+ /* do the interior */
+ char command = (polyfill == BOTH && element->brushf)
+ ? 'p' : 'P';
+
+ /* include outline, if there is one and */
+ /* the -p flag was set */
+
+ /* switch based on what gremlin gives */
+ switch (element->size) {
+ case 1:
+ graylevel = 1;
+ break;
+ case 3:
+ graylevel = 2;
+ break;
+ case 12:
+ graylevel = 3;
+ break;
+ case 14:
+ graylevel = 4;
+ break;
+ case 16:
+ graylevel = 5;
+ break;
+ case 19:
+ graylevel = 6;
+ break;
+ case 21:
+ graylevel = 7;
+ break;
+ case 23:
+ graylevel = 8;
+ break;
+ default: /* who's giving something else? */
+ graylevel = NSTIPPLES;
+ break;
+ }
+ /* int graylevel = element->size; */
+
+ if (graylevel < 0)
+ break;
+ if (graylevel > NSTIPPLES)
+ graylevel = NSTIPPLES;
+ printf("\\D'Fg %.3f'",
+ double(1000 - stipple_index[graylevel]) / 1000.0);
+ cr();
+ tmove(p1);
+ printf("\\D'%c", command);
+
+ while (!Nullpoint((PTNextPoint(p1)))) {
+ p1 = PTNextPoint(p1);
+ deltax((double) p1->x);
+ deltay((double) p1->y);
+ if (length++ > LINELENGTH) {
+ length = 0;
+ printf("\\\n");
+ }
+ } /* end while */
+
+ /* close polygon if not done so by user */
+ if ((firstx != p1->x) || (firsty != p1->y)) {
+ deltax((double) firstx);
+ deltay((double) firsty);
+ }
+ putchar('\'');
+ cr();
+ break;
+ }
+ /* else polyfill == OUTLINE; only draw the outline */
+ if (!(element->brushf))
+ break;
+ length = 0; /* keep track of line length */
+ tmove(p1);
+
+ while (!Nullpoint((PTNextPoint(p1)))) {
+ p1 = PTNextPoint(p1);
+ HGtline((int) (p1->x * troffscale),
+ (int) (p1->y * troffscale));
+ if (length++ > LINELENGTH) {
+ length = 0;
+ printf("\\\n");
+ }
+ } /* end while */
+
+ /* close polygon if not done so by user */
+ if ((firstx != p1->x) || (firsty != p1->y)) {
+ HGtline((int) (firstx * troffscale),
+ (int) (firsty * troffscale));
+ }
+ cr();
+ break;
+ } /* end case POLYGON */
+ } /* end switch */
+ } /* end else Text */
+ } /* end if */
+} /* end PrintElt */
+
+
+/*---------------------------------------------------------------------*
+ | Routine: HGPutText (justification, position_point, string)
+ |
+ | Results: Given the justification, a point to position with, and a
+ | string to put, HGPutText first sends the string into a
+ | diversion, moves to the positioning point, then outputs
+ | local vertical and horizontal motions as needed to
+ | justify the text. After all motions are done, the
+ | diversion is printed out.
+ *--------------------------------------------------------------------*/
+
+void
+HGPutText(int justify,
+ POINT pnt,
+ char *string)
+{
+ int savelasty = lasty; /* vertical motion for text is to be */
+ /* ignored. Save current y here */
+
+ printf(".nr g8 \\n(.d\n"); /* save current vertical position. */
+ printf(".ds g9 \""); /* define string containing the text. */
+ while (*string) { /* put out the string */
+ if (*string == '\\' &&
+ *(string + 1) == '\\') { /* one character at a */
+ printf("\\\\\\"); /* time replacing // */
+ string++; /* by //// to prevent */
+ } /* interpretation at */
+ printf("%c", *(string++)); /* printout time */
+ }
+ printf("\n");
+
+ tmove(&pnt); /* move to positioning point */
+
+ switch (justify) {
+ /* local vertical motions--the numbers here are used to be
+ somewhat compatible with gprint */
+ case CENTLEFT:
+ case CENTCENT:
+ case CENTRIGHT:
+ printf("\\v'0.85n'"); /* down half */
+ break;
+
+ case TOPLEFT:
+ case TOPCENT:
+ case TOPRIGHT:
+ printf("\\v'1.7n'"); /* down whole */
+ }
+
+ switch (justify) {
+ /* local horizontal motions */
+ case BOTCENT:
+ case CENTCENT:
+ case TOPCENT:
+ printf("\\h'-\\w'\\*(g9'u/2u'"); /* back half */
+ break;
+
+ case BOTRIGHT:
+ case CENTRIGHT:
+ case TOPRIGHT:
+ printf("\\h'-\\w'\\*(g9'u'"); /* back whole */
+ }
+
+ printf("\\&\\*(g9\n"); /* now print the text. */
+ printf(".sp |\\n(g8u\n"); /* restore vertical position */
+ lasty = savelasty; /* vertical position restored to */
+ lastx = xleft; /* where it was before text, also */
+ /* horizontal is at left */
+} /* end HGPutText */
+
+
+/*--------------------------------------------------------------------*
+ | Routine: doarc (center_point, start_point, angle)
+ |
+ | Results: Produces either drawarc command or a drawcircle command
+ | depending on the angle needed to draw through.
+ *--------------------------------------------------------------------*/
+
+void
+doarc(POINT cp,
+ POINT sp,
+ int angle)
+{
+ if (angle) /* arc with angle */
+ HGArc((int) (cp.x * troffscale), (int) (cp.y * troffscale),
+ (int) (sp.x * troffscale), (int) (sp.y * troffscale), angle);
+ else /* a full circle (angle == 0) */
+ HGArc((int) (cp.x * troffscale), (int) (cp.y * troffscale),
+ (int) (sp.x * troffscale), (int) (sp.y * troffscale), 0);
+}
+
+
+/*--------------------------------------------------------------------*
+ | Routine: HGSetFont (font_number, Point_size)
+ |
+ | Results: ALWAYS outputs a .ft and .ps directive to troff. This
+ | is done because someone may change stuff inside a text
+ | string. Changes thickness back to default thickness.
+ | Default thickness depends on font and point size.
+ *--------------------------------------------------------------------*/
+
+void
+HGSetFont(int font,
+ int size)
+{
+ printf(".ft %s\n"
+ ".ps %d\n", tfont[font - 1], tsize[size - 1]);
+ linethickness = DEFTHICK;
+}
+
+
+/*--------------------------------------------------------------------*
+ | Routine: HGSetBrush (line_mode)
+ |
+ | Results: Generates the troff commands to set up the line width
+ | and style of subsequent lines. Does nothing if no
+ | change is needed.
+ |
+ | Side Efct: Sets 'linmode' and 'linethickness'.
+ *--------------------------------------------------------------------*/
+
+void
+HGSetBrush(int mode)
+{
+ int printed = 0;
+
+ if (linmod != style[--mode]) {
+ /* Groff doesn't understand \Ds, so we take it out */
+ /* printf ("\\D's %du'", linmod = style[mode]); */
+ linmod = style[mode];
+ printed = 1;
+ }
+ if (linethickness != thick[mode]) {
+ linethickness = thick[mode];
+ printf("\\h'-%.2fp'\\D't %.2fp'", linethickness, linethickness);
+ printed = 1;
+ }
+ if (printed)
+ cr();
+}
+
+
+/*--------------------------------------------------------------------*
+ | Routine: deltax (x_destination)
+ |
+ | Results: Scales and outputs a number for delta x (with a leading
+ | space) given 'lastx' and x_destination.
+ |
+ | Side Efct: Resets 'lastx' to x_destination.
+ *--------------------------------------------------------------------*/
+
+void
+deltax(double x)
+{
+ int ix = (int) (x * troffscale);
+
+ printf(" %du", ix - lastx);
+ lastx = ix;
+}
+
+
+/*--------------------------------------------------------------------*
+ | Routine: deltay (y_destination)
+ |
+ | Results: Scales and outputs a number for delta y (with a leading
+ | space) given 'lastyline' and y_destination.
+ |
+ | Side Efct: Resets 'lastyline' to y_destination. Since 'line'
+ | vertical motions don't affect 'page' ones, 'lasty' isn't
+ | updated.
+ *--------------------------------------------------------------------*/
+
+void
+deltay(double y)
+{
+ int iy = (int) (y * troffscale);
+
+ printf(" %du", iy - lastyline);
+ lastyline = iy;
+}
+
+
+/*--------------------------------------------------------------------*
+ | Routine: tmove2 (px, py)
+ |
+ | Results: Produces horizontal and vertical moves for troff given
+ | the pair of points to move to and knowing the current
+ | position. Also puts out a horizontal move to start the
+ | line. This is a variation without the .sp command.
+ *--------------------------------------------------------------------*/
+
+void
+tmove2(int px,
+ int py)
+{
+ int dx;
+ int dy;
+
+ if ((dy = py - lasty)) {
+ printf("\\v'%du'", dy);
+ }
+ lastyline = lasty = py; /* lasty is always set to current */
+ if ((dx = px - lastx)) {
+ printf("\\h'%du'", dx);
+ lastx = px;
+ }
+}
+
+
+/*--------------------------------------------------------------------*
+ | Routine: tmove (point_pointer)
+ |
+ | Results: Produces horizontal and vertical moves for troff given
+ | the pointer of a point to move to and knowing the
+ | current position. Also puts out a horizontal move to
+ | start the line.
+ *--------------------------------------------------------------------*/
+
+void
+tmove(POINT * ptr)
+{
+ int ix = (int) (ptr->x * troffscale);
+ int iy = (int) (ptr->y * troffscale);
+ int dx;
+ int dy;
+
+ if ((dy = iy - lasty)) {
+ printf(".sp %du\n", dy);
+ }
+ lastyline = lasty = iy; /* lasty is always set to current */
+ if ((dx = ix - lastx)) {
+ printf("\\h'%du'", dx);
+ lastx = ix;
+ }
+}
+
+
+/*--------------------------------------------------------------------*
+ | Routine: cr ( )
+ |
+ | Results: Ends off an input line. '.sp -1' is also added to
+ | counteract the vertical move done at the end of text
+ | lines.
+ |
+ | Side Efct: Sets 'lastx' to 'xleft' for troff's return to left
+ | margin.
+ *--------------------------------------------------------------------*/
+
+void
+cr()
+{
+ printf("\n.sp -1\n");
+ lastx = xleft;
+}
+
+
+/*--------------------------------------------------------------------*
+ | Routine: line ( )
+ |
+ | Results: Draws a single solid line to (x,y).
+ *--------------------------------------------------------------------*/
+
+void
+line(int px,
+ int py)
+{
+ printf("\\D'l");
+ printf(" %du", px - lastx);
+ printf(" %du'", py - lastyline);
+ lastx = px;
+ lastyline = lasty = py;
+}
+
+
+/*--------------------------------------------------------------------*
+ | Routine: drawwig (ptr, type)
+ |
+ | Results: The point sequence found in the structure pointed by ptr
+ | is placed in integer arrays for further manipulation by
+ | the existing routing. With the corresponding type
+ | parameter, either picurve or HGCurve are called.
+ *--------------------------------------------------------------------*/
+
+void
+drawwig(POINT * ptr,
+ int type)
+{
+ int npts; /* point list index */
+ int x[MAXPOINTS], y[MAXPOINTS]; /* point list */
+
+ for (npts = 1; !Nullpoint(ptr); ptr = PTNextPoint(ptr), npts++) {
+ x[npts] = (int) (ptr->x * troffscale);
+ y[npts] = (int) (ptr->y * troffscale);
+ }
+ if (--npts) {
+ if (type == CURVE) /* Use the 2 different types of curves */
+ HGCurve(&x[0], &y[0], npts);
+ else
+ picurve(&x[0], &y[0], npts);
+ }
+}
+
+
+/*--------------------------------------------------------------------*
+ | Routine: HGArc (xcenter, ycenter, xstart, ystart, angle)
+ |
+ | Results: This routine plots an arc centered about (cx, cy)
+ | counter-clockwise starting from the point (px, py)
+ | through 'angle' degrees. If angle is 0, a full circle
+ | is drawn. It does so by creating a draw-path around the
+ | arc whose density of points depends on the size of the
+ | arc.
+ *--------------------------------------------------------------------*/
+
+void
+HGArc(int cx,
+ int cy,
+ int px,
+ int py,
+ int angle)
+{
+ double xs, ys, resolution, fullcircle;
+ int m;
+ int mask;
+ int extent;
+ int nx;
+ int ny;
+ int length;
+ double epsilon;
+
+ xs = px - cx;
+ ys = py - cy;
+
+ length = 0;
+
+ resolution = (1.0 + groff_hypot(xs, ys) / res) * PointsPerInterval;
+ /* mask = (1 << (int) log10(resolution + 1.0)) - 1; */
+ (void) frexp(resolution, &m); /* more elegant than log10 */
+ for (mask = 1; mask < m; mask = mask << 1);
+ mask -= 1;
+
+ epsilon = 1.0 / resolution;
+ fullcircle = (2.0 * pi) * resolution;
+ if (angle == 0)
+ extent = (int) fullcircle;
+ else
+ extent = (int) (angle * fullcircle / 360.0);
+
+ HGtline(px, py);
+ while (--extent >= 0) {
+ xs += epsilon * ys;
+ nx = cx + (int) (xs + 0.5);
+ ys -= epsilon * xs;
+ ny = cy + (int) (ys + 0.5);
+ if (!(extent & mask)) {
+ HGtline(nx, ny); /* put out a point on circle */
+ if (length++ > LINELENGTH) {
+ length = 0;
+ printf("\\\n");
+ }
+ }
+ } /* end for */
+} /* end HGArc */
+
+
+/*--------------------------------------------------------------------*
+ | Routine: picurve (xpoints, ypoints, num_of_points)
+ |
+ | Results: Draws a curve delimited by (not through) the line
+ | segments traced by (xpoints, ypoints) point list. This
+ | is the 'Pic'-style curve.
+ *--------------------------------------------------------------------*/
+
+void
+picurve(int *x,
+ int *y,
+ int npts)
+{
+ int nseg; /* effective resolution for each curve */
+ int xp; /* current point (and temporary) */
+ int yp;
+ int pxp, pyp; /* previous point (to make lines from) */
+ int i; /* inner curve segment traverser */
+ int length = 0;
+ double w; /* position factor */
+ double t1, t2, t3; /* calculation temps */
+
+ if (x[1] == x[npts] && y[1] == y[npts]) {
+ x[0] = x[npts - 1]; /* if the lines' ends meet, make */
+ y[0] = y[npts - 1]; /* sure the curve meets */
+ x[npts + 1] = x[2];
+ y[npts + 1] = y[2];
+ } else { /* otherwise, make the ends of the */
+ x[0] = x[1]; /* curve touch the ending points of */
+ y[0] = y[1]; /* the line segments */
+ x[npts + 1] = x[npts];
+ y[npts + 1] = y[npts];
+ }
+
+ pxp = (x[0] + x[1]) / 2; /* make the last point pointers */
+ pyp = (y[0] + y[1]) / 2; /* point to the start of the 1st line */
+ tmove2(pxp, pyp);
+
+ for (; npts--; x++, y++) { /* traverse the line segments */
+ xp = x[0] - x[1];
+ yp = y[0] - y[1];
+ nseg = (int) groff_hypot((double) xp, (double) yp);
+ xp = x[1] - x[2];
+ yp = y[1] - y[2];
+ /* 'nseg' is the number of line */
+ /* segments that will be drawn for */
+ /* each curve segment. */
+ nseg = (int) ((double) (nseg + (int) groff_hypot((double) xp,
+ (double) yp)) /
+ res * PointsPerInterval);
+
+ for (i = 1; i < nseg; i++) {
+ w = (double) i / (double) nseg;
+ t1 = w * w;
+ t3 = t1 + 1.0 - (w + w);
+ t2 = 2.0 - (t3 + t1);
+ xp = (((int) (t1 * x[2] + t2 * x[1] + t3 * x[0])) + 1) / 2;
+ yp = (((int) (t1 * y[2] + t2 * y[1] + t3 * y[0])) + 1) / 2;
+
+ HGtline(xp, yp);
+ if (length++ > LINELENGTH) {
+ length = 0;
+ printf("\\\n");
+ }
+ }
+ }
+}
+
+
+/*--------------------------------------------------------------------*
+ | Routine: HGCurve(xpoints, ypoints, num_points)
+ |
+ | Results: This routine generates a smooth curve through a set of
+ | points. The method used is the parametric spline curve
+ | on unit knot mesh described in 'Spline Curve Techniques'
+ | by Patrick Baudelaire, Robert Flegal, and Robert Sproull
+ | -- Xerox Parc.
+ *--------------------------------------------------------------------*/
+
+void
+HGCurve(int *x,
+ int *y,
+ int numpoints)
+{
+ double h[MAXPOINTS], dx[MAXPOINTS], dy[MAXPOINTS];
+ double d2x[MAXPOINTS], d2y[MAXPOINTS], d3x[MAXPOINTS], d3y[MAXPOINTS];
+ double t, t2, t3;
+ int j;
+ int k;
+ int nx;
+ int ny;
+ int lx, ly;
+ int length = 0;
+
+ lx = x[1];
+ ly = y[1];
+ tmove2(lx, ly);
+
+ /*
+ * Solve for derivatives of the curve at each point separately for x
+ * and y (parametric).
+ */
+ Parameterize(x, y, h, numpoints);
+
+ /* closed curve */
+ if ((x[1] == x[numpoints]) && (y[1] == y[numpoints])) {
+ PeriodicSpline(h, x, dx, d2x, d3x, numpoints);
+ PeriodicSpline(h, y, dy, d2y, d3y, numpoints);
+ } else {
+ NaturalEndSpline(h, x, dx, d2x, d3x, numpoints);
+ NaturalEndSpline(h, y, dy, d2y, d3y, numpoints);
+ }
+
+ /*
+ * Generate the curve using the above information and
+ * PointsPerInterval vectors between each specified knot.
+ */
+
+ for (j = 1; j < numpoints; ++j) {
+ if ((x[j] == x[j + 1]) && (y[j] == y[j + 1]))
+ continue;
+ for (k = 0; k <= PointsPerInterval; ++k) {
+ t = (double) k *h[j] / (double) PointsPerInterval;
+ t2 = t * t;
+ t3 = t * t * t;
+ nx = x[j] + (int) (t * dx[j] + t2 * d2x[j] / 2 + t3 * d3x[j] / 6);
+ ny = y[j] + (int) (t * dy[j] + t2 * d2y[j] / 2 + t3 * d3y[j] / 6);
+ HGtline(nx, ny);
+ if (length++ > LINELENGTH) {
+ length = 0;
+ printf("\\\n");
+ }
+ } /* end for k */
+ } /* end for j */
+} /* end HGCurve */
+
+
+/*--------------------------------------------------------------------*
+ | Routine: Parameterize (xpoints, ypoints, hparams, num_points)
+ |
+ | Results: This routine calculates parametric values for use in
+ | calculating curves. The parametric values are returned
+ | in the array h. The values are an approximation of
+ | cumulative arc lengths of the curve (uses cord length).
+ | For additional information, see paper cited below.
+ *--------------------------------------------------------------------*/
+
+void
+Parameterize(int x[],
+ int y[],
+ double h[],
+ int n)
+{
+ int dx;
+ int dy;
+ int i;
+ int j;
+ double u[MAXPOINTS];
+
+ for (i = 1; i <= n; ++i) {
+ u[i] = 0;
+ for (j = 1; j < i; j++) {
+ dx = x[j + 1] - x[j];
+ dy = y[j + 1] - y[j];
+ /* Here was overflowing, so I changed it. */
+ /* u[i] += sqrt ((double) (dx * dx + dy * dy)); */
+ u[i] += groff_hypot((double) dx, (double) dy);
+ }
+ }
+ for (i = 1; i < n; ++i)
+ h[i] = u[i + 1] - u[i];
+} /* end Parameterize */
+
+
+/*--------------------------------------------------------------------*
+ | Routine: PeriodicSpline (h, z, dz, d2z, d3z, npoints)
+ |
+ | Results: This routine solves for the cubic polynomial to fit a
+ | spline curve to the points specified by the list of
+ | values. The curve generated is periodic. The
+ | algorithms for this curve are from the 'Spline Curve
+ | Techniques' paper cited above.
+ *--------------------------------------------------------------------*/
+
+void
+PeriodicSpline(double h[], /* parameterization */
+ int z[], /* point list */
+ double dz[], /* to return the 1st derivative */
+ double d2z[], /* 2nd derivative */
+ double d3z[], /* 3rd derivative */
+ int npoints) /* number of valid points */
+{
+ double d[MAXPOINTS];
+ double deltaz[MAXPOINTS], a[MAXPOINTS], b[MAXPOINTS];
+ double c[MAXPOINTS], r[MAXPOINTS], s[MAXPOINTS];
+ int i;
+
+ /* step 1 */
+ for (i = 1; i < npoints; ++i) {
+ deltaz[i] = h[i] ? ((double) (z[i + 1] - z[i])) / h[i] : 0;
+ }
+ h[0] = h[npoints - 1];
+ deltaz[0] = deltaz[npoints - 1];
+
+ /* step 2 */
+ for (i = 1; i < npoints - 1; ++i) {
+ d[i] = deltaz[i + 1] - deltaz[i];
+ }
+ d[0] = deltaz[1] - deltaz[0];
+
+ /* step 3a */
+ a[1] = 2 * (h[0] + h[1]);
+ b[1] = d[0];
+ c[1] = h[0];
+ for (i = 2; i < npoints - 1; ++i) {
+ a[i] = 2 * (h[i - 1] + h[i]) -
+ pow((double) h[i - 1], (double) 2.0) / a[i - 1];
+ b[i] = d[i - 1] - h[i - 1] * b[i - 1] / a[i - 1];
+ c[i] = -h[i - 1] * c[i - 1] / a[i - 1];
+ }
+
+ /* step 3b */
+ r[npoints - 1] = 1;
+ s[npoints - 1] = 0;
+ for (i = npoints - 2; i > 0; --i) {
+ r[i] = -(h[i] * r[i + 1] + c[i]) / a[i];
+ s[i] = (6 * b[i] - h[i] * s[i + 1]) / a[i];
+ }
+
+ /* step 4 */
+ d2z[npoints - 1] = (6 * d[npoints - 2] - h[0] * s[1]
+ - h[npoints - 1] * s[npoints - 2])
+ / (h[0] * r[1] + h[npoints - 1] * r[npoints - 2]
+ + 2 * (h[npoints - 2] + h[0]));
+ for (i = 1; i < npoints - 1; ++i) {
+ d2z[i] = r[i] * d2z[npoints - 1] + s[i];
+ }
+ d2z[npoints] = d2z[1];
+
+ /* step 5 */
+ for (i = 1; i < npoints; ++i) {
+ dz[i] = deltaz[i] - h[i] * (2 * d2z[i] + d2z[i + 1]) / 6;
+ d3z[i] = h[i] ? (d2z[i + 1] - d2z[i]) / h[i] : 0;
+ }
+} /* end PeriodicSpline */
+
+
+/*--------------------------------------------------------------------
+ | Routine: NaturalEndSpline (h, z, dz, d2z, d3z, npoints)
+ |
+ | Results: This routine solves for the cubic polynomial to fit a
+ | spline curve the points specified by the list of values.
+ | The algorithms for this curve are from the 'Spline Curve
+ | Techniques' paper cited above.
+ *--------------------------------------------------------------------*/
+
+void
+NaturalEndSpline(double h[], /* parameterization */
+ int z[], /* Point list */
+ double dz[], /* to return the 1st derivative */
+ double d2z[], /* 2nd derivative */
+ double d3z[], /* 3rd derivative */
+ int npoints) /* number of valid points */
+{
+ double d[MAXPOINTS];
+ double deltaz[MAXPOINTS], a[MAXPOINTS], b[MAXPOINTS];
+ int i;
+
+ /* step 1 */
+ for (i = 1; i < npoints; ++i) {
+ deltaz[i] = h[i] ? ((double) (z[i + 1] - z[i])) / h[i] : 0;
+ }
+ deltaz[0] = deltaz[npoints - 1];
+
+ /* step 2 */
+ for (i = 1; i < npoints - 1; ++i) {
+ d[i] = deltaz[i + 1] - deltaz[i];
+ }
+ d[0] = deltaz[1] - deltaz[0];
+
+ /* step 3 */
+ a[0] = 2 * (h[2] + h[1]);
+ b[0] = d[1];
+ for (i = 1; i < npoints - 2; ++i) {
+ a[i] = 2 * (h[i + 1] + h[i + 2]) -
+ pow((double) h[i + 1], (double) 2.0) / a[i - 1];
+ b[i] = d[i + 1] - h[i + 1] * b[i - 1] / a[i - 1];
+ }
+
+ /* step 4 */
+ d2z[npoints] = d2z[1] = 0;
+ for (i = npoints - 1; i > 1; --i) {
+ d2z[i] = (6 * b[i - 2] - h[i] * d2z[i + 1]) / a[i - 2];
+ }
+
+ /* step 5 */
+ for (i = 1; i < npoints; ++i) {
+ dz[i] = deltaz[i] - h[i] * (2 * d2z[i] + d2z[i + 1]) / 6;
+ d3z[i] = h[i] ? (d2z[i + 1] - d2z[i]) / h[i] : 0;
+ }
+} /* end NaturalEndSpline */
+
+
+/*--------------------------------------------------------------------*
+ | Routine: change (x_position, y_position, visible_flag)
+ |
+ | Results: As HGtline passes from the invisible to visible (or vice
+ | versa) portion of a line, change is called to either
+ | draw the line, or initialize the beginning of the next
+ | one. Change calls line to draw segments if visible_flag
+ | is set (which means we're leaving a visible area).
+ *--------------------------------------------------------------------*/
+
+void
+change(int x,
+ int y,
+ int vis)
+{
+ static int length = 0;
+
+ if (vis) { /* leaving a visible area, draw it. */
+ line(x, y);
+ if (length++ > LINELENGTH) {
+ length = 0;
+ printf("\\\n");
+ }
+ } else { /* otherwise entering one; remember */
+ /* beginning */
+ tmove2(x, y);
+ }
+}
+
+
+/*--------------------------------------------------------------------*
+ | Routine: HGtline (xstart, ystart, xend, yend)
+ |
+ | Results: Draws a line from current position to (x1,y1) using
+ | line(x1, y1) to place individual segments of dotted or
+ | dashed lines.
+ *--------------------------------------------------------------------*/
+
+void
+HGtline(int x_1,
+ int y_1)
+{
+ int x_0 = lastx;
+ int y_0 = lasty;
+ int dx;
+ int dy;
+ int oldcoord;
+ int res1;
+ int visible;
+ int res2;
+ int xinc;
+ int yinc;
+ int dotcounter;
+
+ if (linmod == SOLID) {
+ line(x_1, y_1);
+ return;
+ }
+
+ /* for handling different resolutions */
+ dotcounter = linmod << dotshifter;
+
+ xinc = 1;
+ yinc = 1;
+ if ((dx = x_1 - x_0) < 0) {
+ xinc = -xinc;
+ dx = -dx;
+ }
+ if ((dy = y_1 - y_0) < 0) {
+ yinc = -yinc;
+ dy = -dy;
+ }
+ res1 = 0;
+ res2 = 0;
+ visible = 0;
+ if (dx >= dy) {
+ oldcoord = y_0;
+ while (x_0 != x_1) {
+ if ((x_0 & dotcounter) && !visible) {
+ change(x_0, y_0, 0);
+ visible = 1;
+ } else if (visible && !(x_0 & dotcounter)) {
+ change(x_0 - xinc, oldcoord, 1);
+ visible = 0;
+ }
+ if (res1 > res2) {
+ oldcoord = y_0;
+ res2 += dx - res1;
+ res1 = 0;
+ y_0 += yinc;
+ }
+ res1 += dy;
+ x_0 += xinc;
+ }
+ } else {
+ oldcoord = x_0;
+ while (y_0 != y_1) {
+ if ((y_0 & dotcounter) && !visible) {
+ change(x_0, y_0, 0);
+ visible = 1;
+ } else if (visible && !(y_0 & dotcounter)) {
+ change(oldcoord, y_0 - yinc, 1);
+ visible = 0;
+ }
+ if (res1 > res2) {
+ oldcoord = x_0;
+ res2 += dy - res1;
+ res1 = 0;
+ x_0 += xinc;
+ }
+ res1 += dx;
+ y_0 += yinc;
+ }
+ }
+ if (visible)
+ change(x_1, y_1, 1);
+ else
+ change(x_1, y_1, 0);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/grn/hpoint.cpp b/src/preproc/grn/hpoint.cpp
new file mode 100644
index 0000000..5ef0c0a
--- /dev/null
+++ b/src/preproc/grn/hpoint.cpp
@@ -0,0 +1,59 @@
+/* Last non-groff version: hpoint.c 1.1 84/10/08 */
+
+/*
+ * This file contains routines for manipulating the point data
+ * structures for the gremlin picture editor.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include "gprint.h"
+
+/* imports from main.cpp */
+extern void *grnmalloc(size_t size, const char *what);
+
+/*
+ * Return pointer to empty point list.
+ */
+POINT *
+PTInit()
+{
+ return ((POINT *) NULL);
+}
+
+
+/*
+ * This routine creates a new point with coordinates x and y and links
+ * it into the point list.
+ */
+POINT *
+PTMakePoint(double x,
+ double y,
+ POINT **pplist)
+{
+ POINT *pt;
+
+ if (Nullpoint(pt = *pplist)) { /* empty list */
+ *pplist = (POINT *) grnmalloc(sizeof(POINT), "initial point");
+ pt = *pplist;
+ } else {
+ while (!Nullpoint(pt->nextpt))
+ pt = pt->nextpt;
+ pt->nextpt = (POINT *) grnmalloc(sizeof(POINT), "subsequent point");
+ pt = pt->nextpt;
+ }
+
+ pt->x = x;
+ pt->y = y;
+ pt->nextpt = PTInit();
+ return (pt);
+} /* end PTMakePoint */
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/grn/main.cpp b/src/preproc/grn/main.cpp
new file mode 100644
index 0000000..6d6d586
--- /dev/null
+++ b/src/preproc/grn/main.cpp
@@ -0,0 +1,977 @@
+/* Last non-groff version: main.c 1.23 (Berkeley) 85/08/05
+ *
+ * Adapted to GNU troff by Daniel Senderowicz 99/12/29.
+ *
+ * Further refinements by Werner Lemberg 00/02/20.
+ *
+ *
+ * This file contains the main and file system dependent routines for
+ * processing gremlin files into troff input. The program watches input
+ * go by to standard output, only interpreting things between .GS and
+ * .GE lines. Default values (font, size, scale, thickness) may be
+ * overridden with a 'default' command and are further overridden by
+ * commands in the input.
+ *
+ * Inside the GS and GE, commands are accepted to reconfigure the
+ * picture. At most one command may reside on each line, and each
+ * command is followed by a parameter separated by white space. The
+ * commands are as follows, and may be abbreviated down to one character
+ * (with exception of 'scale' and 'stipple' down to "sc" and "st") and
+ * may be upper or lower case.
+ *
+ * default - Make all settings in the current
+ * .GS/.GE the global defaults.
+ * Height, width and file are NOT
+ * saved.
+ * 1, 2, 3, 4 - Set size 1, 2, 3, or 4 (followed
+ * by an integer point size).
+ * roman, italics, bold, special - Set gremlin's fonts to any other
+ * troff font (1 or 2 characters).
+ * stipple, l - Use a stipple font for polygons.
+ * Arg is troff font name. No
+ * default. Can use only one stipple
+ * font per picture. (See below for
+ * stipple font index.)
+ * scale, x - Scale is IN ADDITION to the global
+ * scale factor from the default.
+ * pointscale - Turn on scaling point sizes to
+ * match 'scale' commands. (Optional
+ * operand 'off' to turn it off.)
+ * narrow, medium, thick - Set widths of lines.
+ * file - Set the file name to read the
+ * gremlin picture from. If the file
+ * isn't in the current directory,
+ * the gremlin library is tried.
+ * width, height - These two commands override any
+ * scaling factor that is in effect,
+ * and forces the picture to fit into
+ * either the height or width
+ * specified, whichever makes the
+ * picture smaller. The operand for
+ * these two commands is a
+ * floating-point number in units of
+ * inches.
+ * l<nn> (integer <nn>) - Set association between stipple
+ * <nn> and a stipple 'character'.
+ * <nn> must be in the range 0 to
+ * NSTIPPLES (16) inclusive. The
+ * integer operand is an index in the
+ * stipple font selected. Valid cf
+ * (cifplot) indices are 1-32
+ * (although 24 is not defined),
+ * valid ug (unigrafix) indices are
+ * 1-14, and valid gs (gray scale)
+ * indices are 0-16. Nonetheless,
+ * any number between 0 and 255 is
+ * accepted since new stipple fonts
+ * may be added. An integer operand
+ * is required.
+ *
+ * Troff number registers used: g1 through g9. g1 is the width of the
+ * picture, and g2 is the height. g3, and g4, save information, g8 and
+ * g9 are used for text processing and g5-g7 are reserved.
+ */
+
+
+#include "lib.h"
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <errno.h> // errno
+#include "gprint.h"
+
+#include "device.h"
+#include "font.h"
+#include "searchpath.h"
+#include "macropath.h"
+
+#include "errarg.h"
+#include "error.h"
+#include "defs.h"
+
+extern "C" const char *Version_string;
+
+/* database imports */
+
+extern void HGPrintElt(ELT *element, int baseline);
+extern ELT *DBInit();
+extern ELT *DBRead(FILE *file);
+extern POINT *PTInit();
+extern POINT *PTMakePoint(double x, double y, POINT **pplist);
+
+#define INIT_FILE_SIZE 50 /* Initial sz of file array from cmd line. */
+#define FILE_SIZE_INCR 50 /* Amount to increase array of files by. */
+
+#define SUN_SCALEFACTOR 0.70
+
+/* #define DEFSTIPPLE "gs" */
+#define DEFSTIPPLE "cf"
+/*
+ * This grn implementation emits '.st' requests to control stipple
+ * effects, but groff does not (currently) support any such request.
+ *
+ * This hack disables the emission of such requests, without destroying
+ * the infrastructure necessary to support the feature in the future; to
+ * enable the emission of '.st' requests, at a future date when groff
+ * can support them, simply rewrite the following #define as:
+ *
+ * #define USE_ST_REQUEST stipple
+ *
+ * with accompanying comment: "emit '.st' requests as required".
+ */
+#define USE_ST_REQUEST 0 /* never emit '.st' requests */
+
+#define MAXINLINE 100 /* input line length */
+
+#define SCREENtoINCH 0.02 /* scaling factor, screen to inches */
+
+#define BIG 999999999999.0 /* unwieldy large floating number */
+
+
+/* static char sccsid[] = "@(#) (Berkeley) 8/5/85, 12/28/99"; */
+
+int res; /* the printer's resolution goes here */
+
+int dotshifter; /* for the length of dotted curves */
+
+double linethickness; /* brush styles */
+int linmod;
+int lastx; /* point registers for printing */
+int lasty; /* elements */
+int lastyline; /* A line's vertical position is NOT */
+ /* the same after that line is over, */
+ /* so for a line of drawing commands, */
+ /* vertical spacing is kept in */
+ /* lastyline. */
+
+/* These are the default fonts, sizes, line styles, */
+/* and thicknesses. They can be modified from a */
+/* 'default' command and are reset each time the */
+/* start of a picture (.GS) is found. */
+
+const char *deffont[] =
+{"R", "I", "B", "S"};
+int defsize[] =
+{10, 16, 24, 36};
+/* #define BASE_THICKNESS 1.0 */
+#define BASE_THICKNESS 0.15
+double defthick[STYLES] =
+{1 * BASE_THICKNESS,
+ 1 * BASE_THICKNESS,
+ 5 * BASE_THICKNESS,
+ 1 * BASE_THICKNESS,
+ 1 * BASE_THICKNESS,
+ 3 * BASE_THICKNESS};
+
+/* int cf_stipple_index[NSTIPPLES + 1] = */
+/* {0, 1, 3, 12, 14, 16, 19, 21, 23}; */
+/* a logarithmic scale looks better than a linear one for gray shades */
+/* */
+/* int other_stipple_index[NSTIPPLES + 1] = */
+/* {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; */
+
+int cf_stipple_index[NSTIPPLES + 1] =
+{0, 18, 32, 56, 100, 178, 316, 562, 1000}; /* only 1-8 used */
+int other_stipple_index[NSTIPPLES + 1] =
+{0, 62, 125, 187, 250, 312, 375, 437, 500,
+ 562, 625, 687, 750, 812, 875, 937, 1000};
+
+/* int *defstipple_index = other_stipple_index; */
+int *defstipple_index = cf_stipple_index;
+
+int style[STYLES] =
+{DOTTED, DOTDASHED, SOLID, DASHED, SOLID, SOLID};
+double scale = 1.0; /* no scaling, default */
+int defpoint = 0; /* flag for point size scaling */
+char *defstipple = (char *) 0;
+enum E {
+ OUTLINE, FILL, BOTH
+} polyfill;
+
+/* flag to control filling of polygons */
+
+double adj1 = 0.0;
+double adj2 = 0.0;
+double adj3 = 0.0;
+double adj4 = 0.0;
+
+double thick[STYLES]; /* thicknesses set by defaults, then */
+ /* by commands */
+char *tfont[FONTS]; /* fonts originally set to deffont */
+ /* values, then optionally changed by */
+int tsize[SIZES]; /* commands inside grn */
+int stipple_index[NSTIPPLES + 1]; /* stipple font file indices */
+char *stipple;
+
+double xscale; /* scaling factor from individual pictures */
+double troffscale; /* scaling factor at output time */
+
+double width; /* user-request maximum width for picture */
+ /* (in inches) */
+double height; /* user-request height */
+int pointscale; /* flag for point size scaling */
+int setdefault; /* flag for a .GS/.GE to remember all */
+ /* settings */
+int sflag; /* -s flag: sort order (do polyfill first) */
+
+double toppoint; /* remember the picture */
+double bottompoint; /* bounds in these variables */
+double leftpoint;
+double rightpoint;
+
+int ytop; /* these are integer versions of the above */
+int ybottom; /* so not to convert each time they're used */
+int xleft;
+int xright;
+
+static int linenum = 0; /* line number of troff input file */
+char inputline[MAXINLINE]; /* spot to filter through the file */
+char *c1 = inputline; /* c1, c2, and c3 will be used to */
+char *c2 = inputline + 1; /* hunt for lines that begin with */
+char *c3 = inputline + 2; /* '.GS' by looking individually */
+char *c4 = inputline + 3; /* needed for compatibility mode */
+char GScommand[MAXINLINE]; /* put user's '.GS' command line here */
+char gremlinfile[MAXINLINE]; /* filename to use for a picture */
+int SUNFILE = FALSE; /* TRUE if SUN gremlin file */
+int compatibility_flag = FALSE; /* TRUE if in compatibility mode */
+
+
+void getres();
+int doinput(FILE *fp);
+void conv(FILE *fp, int baseline);
+void savestate();
+int has_polygon(ELT *elist);
+void interpret(char *line);
+
+void *
+grnmalloc(size_t size,
+ const char *what)
+{
+ void *ptr = 0;
+ ptr = malloc(size);
+ if (!ptr) {
+ fatal("memory allocation failed for %1: %2", what, strerror(errno));
+ }
+ return ptr;
+}
+
+void
+usage(FILE *stream)
+{
+ fprintf(stream,
+ "usage: %s [-Cs] [-M dir] [-F dir] [-T dev] [file ...]\n"
+ "usage: %s {-v | --version}\n"
+ "usage: %s --help\n",
+ program_name, program_name, program_name);
+}
+
+
+/* Add a new file entry in the array, expanding array if needs be. */
+
+char **
+add_file(char **file,
+ char *new_file,
+ int *count,
+ int *cur_size)
+{
+ if (*count >= *cur_size) {
+ *cur_size += FILE_SIZE_INCR;
+ file = (char **) realloc(file, *cur_size * sizeof(char *));
+ if (file == NULL) {
+ fatal("unable to extend file array");
+ }
+ }
+ file[*count] = new_file;
+ *count += 1;
+
+ return file;
+}
+
+
+/*--------------------------------------------------------------------*
+ | Routine: main (argument_count, argument_pointer)
+ |
+ | Results: Parses the command line, accumulating input file names,
+ | then reads the inputs, passing it directly to output
+ | until a '.GS' line is read. Main then passes control to
+ | 'conv' to do the gremlin file conversions.
+ *--------------------------------------------------------------------*/
+
+int
+main(int argc,
+ char **argv)
+{
+ setlocale(LC_NUMERIC, "C");
+ program_name = argv[0];
+ FILE *fp;
+ int k;
+ char c;
+ int gfil = 0;
+ char **file = NULL;
+ int file_cur_size = INIT_FILE_SIZE;
+ char *operand(int *argcp, char ***argvp);
+
+ file = (char **) grnmalloc(file_cur_size * sizeof(char *),
+ "file array");
+ while (--argc) {
+ if (**++argv != '-')
+ file = add_file(file, *argv, &gfil, &file_cur_size);
+ else
+ switch (c = (*argv)[1]) {
+
+ case 0:
+ file = add_file(file, NULL, &gfil, &file_cur_size);
+ break;
+
+ case 'C': /* compatibility mode */
+ compatibility_flag = TRUE;
+ break;
+
+ case 'F': /* font path to find DESC */
+ font::command_line_font_dir(operand(&argc, &argv));
+ break;
+
+ case 'T': /* final output typesetter name */
+ device = operand(&argc, &argv);
+ break;
+
+ case 'M': /* set library directory */
+ macro_path.command_line_dir(operand(&argc, &argv));
+ break;
+
+ case 's': /* preserve order of elements */
+ sflag = 1;
+ break;
+
+ case '-':
+ if (strcmp(*argv,"--version")==0) {
+ case 'v':
+ printf("GNU grn (groff) version %s\n", Version_string);
+ exit(0);
+ break;
+ }
+ if (strcmp(*argv,"--help")==0) {
+ case '?':
+ usage(stdout);
+ exit(0);
+ break;
+ }
+ // fallthrough
+ default:
+ error("unknown switch: %1", c);
+ usage(stderr);
+ exit(1);
+ }
+ }
+
+ getres(); /* set the resolution for an output device */
+
+ if (gfil == 0) { /* no filename, use standard input */
+ file[0] = NULL;
+ gfil++;
+ }
+
+ for (k = 0; k < gfil; k++) {
+ if (file[k] != NULL) {
+ if ((fp = fopen(file[k], "r")) == NULL)
+ fatal("can't open %1", file[k]);
+ } else
+ fp = stdin;
+
+ while (doinput(fp)) {
+ if (*c1 == '.' && *c2 == 'G' && *c3 == 'S') {
+ if (compatibility_flag ||
+ *c4 == '\n' || *c4 == ' ' || *c4 == '\0')
+ conv(fp, linenum);
+ else
+ fputs(inputline, stdout);
+ } else
+ fputs(inputline, stdout);
+ }
+ }
+
+ return 0;
+}
+
+
+/*--------------------------------------------------------------------*
+ | Routine: char * operand (& argc, & argv)
+ |
+ | Results: Returns address of the operand given with a command-line
+ | option. It uses either '-Xoperand' or '-X operand',
+ | whichever is present. The program is terminated if no
+ | option is present.
+ |
+ | Side Efct: argc and argv are updated as necessary.
+ *--------------------------------------------------------------------*/
+
+char *
+operand(int *argcp,
+ char ***argvp)
+{
+ if ((**argvp)[2])
+ return (**argvp + 2); /* operand immediately follows */
+ if ((--*argcp) <= 0) { /* no operand */
+ error("command-line option operand missing.");
+ exit(8);
+ }
+ return (*(++(*argvp))); /* operand is next word */
+}
+
+
+/*--------------------------------------------------------------------*
+ | Routine: getres ()
+ |
+ | Results: Sets 'res' to the resolution of the output device.
+ *--------------------------------------------------------------------*/
+
+void
+getres()
+{
+ int linepiece;
+
+ if (0 /* nullptr */ == font::load_desc())
+ fatal("cannot load 'DESC' description file for device '%1'",
+ device);
+
+ res = font::res;
+
+ /* Correct the brush thicknesses based on res */
+ /* if (res >= 256) {
+ defthick[0] = res >> 8;
+ defthick[1] = res >> 8;
+ defthick[2] = res >> 4;
+ defthick[3] = res >> 8;
+ defthick[4] = res >> 8;
+ defthick[5] = res >> 6;
+ } */
+
+ linepiece = res >> 9;
+ for (dotshifter = 0; linepiece; dotshifter++)
+ linepiece = linepiece >> 1;
+}
+
+
+/*--------------------------------------------------------------------*
+ | Routine: int doinput (file_pointer)
+ |
+ | Results: A line of input is read into 'inputline'.
+ |
+ | Side Efct: "linenum" is incremented.
+ |
+ | Bugs: Lines longer than MAXINLINE are NOT checked, except for
+ | updating 'linenum'.
+ *--------------------------------------------------------------------*/
+
+int
+doinput(FILE *fp)
+{
+ if (fgets(inputline, MAXINLINE, fp) == NULL)
+ return 0;
+ if (strchr(inputline, '\n')) /* ++ only if it's a complete line */
+ linenum++;
+ return 1;
+}
+
+
+/*--------------------------------------------------------------------*
+ | Routine: initpic ( )
+ |
+ | Results: Sets all parameters to the normal defaults, possibly
+ | overridden by a setdefault command. Initialize the
+ | picture variables, and output the startup commands to
+ | troff to begin the picture.
+ *--------------------------------------------------------------------*/
+
+void
+initpic()
+{
+ int i;
+
+ for (i = 0; i < STYLES; i++) { /* line thickness defaults */
+ thick[i] = defthick[i];
+ }
+ for (i = 0; i < FONTS; i++) { /* font name defaults */
+ tfont[i] = (char *)deffont[i];
+ }
+ for (i = 0; i < SIZES; i++) { /* font size defaults */
+ tsize[i] = defsize[i];
+ }
+ for (i = 0; i <= NSTIPPLES; i++) { /* stipple font file default */
+ /* indices */
+ stipple_index[i] = defstipple_index[i];
+ }
+ stipple = defstipple;
+
+ gremlinfile[0] = 0; /* filename is 'null' */
+ setdefault = 0; /* not the default settings (yet) */
+
+ toppoint = BIG; /* set the picture bounds out */
+ bottompoint = -BIG; /* of range so they'll be set */
+ leftpoint = BIG; /* by 'savebounds' on input */
+ rightpoint = -BIG;
+
+ pointscale = defpoint;/* flag for scaling point sizes default */
+ xscale = scale; /* default scale of individual pictures */
+ width = 0.0; /* size specifications input by user */
+ height = 0.0;
+
+ linethickness = DEFTHICK; /* brush styles */
+ linmod = DEFSTYLE;
+}
+
+
+/*--------------------------------------------------------------------*
+ | Routine: conv (file_pointer, starting_line)
+ |
+ | Results: At this point, we just passed a '.GS' line in the input
+ | file. conv reads the input and calls 'interpret' to
+ | process commands, gathering up information until a '.GE'
+ | line is found. It then calls 'HGPrint' to do the
+ | translation of the gremlin file to troff commands.
+ *--------------------------------------------------------------------*/
+
+void
+conv(FILE *fp,
+ int baseline)
+{
+ FILE *gfp = NULL; /* input file pointer */
+ int done = 0; /* flag to remember if finished */
+ ELT *e; /* current element pointer */
+ ELT *PICTURE; /* whole picture data base pointer */
+ double temp; /* temporary calculating area */
+ /* POINT ptr; */ /* coordinates of a point to pass to 'mov' */
+ /* routine */
+ int flyback; /* flag 'want to end up at the top of the */
+ /* picture?' */
+ int compat; /* test character after .GE or .GF */
+
+
+ initpic(); /* set defaults, ranges, etc. */
+ strcpy(GScommand, inputline); /* save '.GS' line for later */
+
+ do {
+ done = !doinput(fp); /* test for EOF */
+ flyback = (*c3 == 'F'); /* and .GE or .GF */
+ compat = (compatibility_flag ||
+ *c4 == '\n' || *c4 == ' ' || *c4 == '\0');
+ done |= (*c1 == '.' && *c2 == 'G' && (*c3 == 'E' || flyback) &&
+ compat);
+
+ if (done) {
+ if (setdefault)
+ savestate();
+
+ if (!gremlinfile[0]) {
+ if (!setdefault)
+ error("no picture file name at line %1", baseline);
+ return;
+ }
+ char *path;
+ gfp = macro_path.open_file(gremlinfile, &path);
+ if (0 /* nullptr */ == gfp) {
+ error("cannot open picture file '%1'", gremlinfile);
+ return;
+ }
+ PICTURE = DBRead(gfp); /* read picture file */
+ fclose(gfp);
+ free(path);
+ if (DBNullelt(PICTURE))
+ return; /* If a request is made to make the */
+ /* picture fit into a specific area, */
+ /* set the scale to do that. */
+
+ if (stipple == (char *) NULL) /* if user forgot stipple */
+ if (has_polygon(PICTURE)) /* and picture has a polygon */
+ stipple = (char *)DEFSTIPPLE; /* then set the default */
+
+ if ((temp = bottompoint - toppoint) < 0.1)
+ temp = 0.1;
+ temp = (height != 0.0) ? height / (temp * SCREENtoINCH) : BIG;
+ if ((troffscale = rightpoint - leftpoint) < 0.1)
+ troffscale = 0.1;
+ troffscale = (width != 0.0) ?
+ width / (troffscale * SCREENtoINCH) : BIG;
+ if (temp == BIG && troffscale == BIG)
+ troffscale = xscale;
+ else {
+ if (temp < troffscale)
+ troffscale = temp;
+ } /* here, troffscale is the */
+ /* picture's scaling factor */
+ if (pointscale) {
+ int i; /* do point scaling here, when */
+ /* scale is known, before output */
+ for (i = 0; i < SIZES; i++)
+ tsize[i] = (int) (troffscale * (double) tsize[i] + 0.5);
+ }
+
+ /* change to device units */
+ troffscale *= SCREENtoINCH * res; /* from screen units */
+
+ /* Calculate integer versions of the picture limits. */
+ ytop = (int) (toppoint * troffscale);
+ ybottom = (int) (bottompoint * troffscale);
+ xleft = (int) (leftpoint * troffscale);
+ xright = (int) (rightpoint * troffscale);
+
+ /* save stuff in number registers, */
+ /* register g1 = picture width and */
+ /* register g2 = picture height, */
+ /* set vertical spacing, no fill, */
+ /* and break (to make sure picture */
+ /* starts on left), and put out the */
+ /* user's '.GS' line. */
+ printf(".br\n"
+ ".nr g1 %du\n"
+ ".nr g2 %du\n"
+ "%s"
+ ".nr g3 \\n(.f\n"
+ ".nr g4 \\n(.s\n"
+ "\\0\n"
+ ".sp -1\n",
+ xright - xleft, ybottom - ytop, GScommand);
+
+ if (USE_ST_REQUEST) /* stipple requested for this picture */
+ printf(".st %s\n", stipple);
+ lastx = xleft; /* note where we are (upper left */
+ lastyline = lasty = ytop; /* corner of the picture) */
+
+ /* Just dump everything in the order it appears.
+ *
+ * If -s command-line option, traverse picture twice: First time,
+ * print only the interiors of filled polygons (as borderless
+ * polygons). Second time, print the outline as series of line
+ * segments. This way, postprocessors that overwrite rather than
+ * merge picture elements (such as Postscript) can still have text
+ * and graphics on a shaded background.
+ */
+ /* if (sflag) */
+ if (!sflag) { /* changing the default for filled polygons */
+ e = PICTURE;
+ polyfill = FILL;
+ while (!DBNullelt(e)) {
+ printf(".mk\n");
+ if (e->type == POLYGON)
+ HGPrintElt(e, baseline);
+ printf(".rt\n");
+ lastx = xleft;
+ lastyline = lasty = ytop;
+ e = DBNextElt(e);
+ }
+ }
+ e = PICTURE;
+
+ /* polyfill = !sflag ? BOTH : OUTLINE; */
+ polyfill = sflag ? BOTH : OUTLINE; /* changing default */
+ while (!DBNullelt(e)) {
+ printf(".mk\n");
+ HGPrintElt(e, baseline);
+ printf(".rt\n");
+ lastx = xleft;
+ lastyline = lasty = ytop;
+ e = DBNextElt(e);
+ }
+
+ /* decide where to end picture */
+
+ /* I [Senderowicz?] changed everything here. I always use the */
+ /* combination .mk and .rt, so once finished I just space down */
+ /* height of the picture that is \n(g2u. */
+ if (flyback) { /* end picture at upper left */
+ /* ptr.x = leftpoint;
+ ptr.y = toppoint; */
+ } else { /* end picture at lower left */
+ /* ptr.x = leftpoint;
+ ptr.y = bottompoint; */
+ printf(".sp \\n(g2u\n");
+ }
+
+ /* tmove(&ptr); */ /* restore default line parameters */
+
+ /* Restore everything to the way it was before the .GS, then */
+ /* put out the '.GE' line from user */
+
+ /* printf("\\D't %du'\\D's %du'\n", DEFTHICK, DEFSTYLE); */
+ /* groff doesn't understand the \Ds command */
+
+ printf("\\D't %du'\n", DEFTHICK);
+ if (flyback) /* make sure we end up at top of */
+ printf(".sp -1\n"); /* picture if 'flying back' */
+ if (USE_ST_REQUEST) /* restore stipple to previous */
+ printf(".st\n");
+ printf(".br\n"
+ ".ft \\n(g3\n"
+ ".ps \\n(g4\n"
+ "%s", inputline);
+ } else
+ interpret(inputline); /* take commands from the input file */
+ } while (!done);
+}
+
+
+/*--------------------------------------------------------------------*
+ | Routine: savestate ( )
+ |
+ | Results: All the current scaling/font size/font name/thickness/
+ | pointscale settings are made the defaults. Scaled
+ | point sizes are NOT saved. The scaling is done each
+ | time a new picture is started.
+ |
+ | Side Efct: scale, and def* are modified.
+ *--------------------------------------------------------------------*/
+
+void
+savestate()
+{
+ int i;
+
+ for (i = 0; i < STYLES; i++) /* line thickness defaults */
+ defthick[i] = thick[i];
+ for (i = 0; i < FONTS; i++) /* font name defaults */
+ deffont[i] = tfont[i];
+ for (i = 0; i < SIZES; i++) /* font size defaults */
+ defsize[i] = tsize[i];
+ /* stipple font file default indices */
+ for (i = 0; i <= NSTIPPLES; i++)
+ defstipple_index[i] = stipple_index[i];
+
+ defstipple = stipple; /* if stipple has been set, it's remembered */
+ scale *= xscale; /* default scale of individual pictures */
+ defpoint = pointscale;/* flag to scale point sizes from x factors */
+}
+
+
+/*--------------------------------------------------------------------*
+ | Routine: savebounds (x_coordinate, y_coordinate)
+ |
+ | Results: Keeps track of the maximum and minimum extent of a
+ | picture in the global variables: left-, right-, top- and
+ | bottompoint. 'savebounds' assumes that the points have
+ | been oriented to the correct direction. No scaling has
+ | taken place, though.
+ *--------------------------------------------------------------------*/
+
+void
+savebounds(double x,
+ double y)
+{
+ if (x < leftpoint)
+ leftpoint = x;
+ if (x > rightpoint)
+ rightpoint = x;
+ if (y < toppoint)
+ toppoint = y;
+ if (y > bottompoint)
+ bottompoint = y;
+}
+
+
+/*--------------------------------------------------------------------*
+ | Routine: interpret (character_string)
+ |
+ | Results: Commands are taken from the input string and performed.
+ | Commands are separated by newlines, and are of the
+ | format:
+ | string1 string2
+ | where string1 is the command, string2 the argument.
+ |
+ | Side Efct: Font and size strings, plus the gremlin file name and
+ | the width and height variables are set by this routine.
+ *--------------------------------------------------------------------*/
+
+void
+interpret(char *line)
+{
+ char str1[MAXINLINE];
+ char str2[MAXINLINE];
+ char *chr;
+ int i;
+ double par;
+
+ str2[0] = '\0';
+ sscanf(line, "%80s%80s", &str1[0], &str2[0]);
+ for (chr = &str1[0]; *chr; chr++) /* convert command to */
+ if (isupper(*chr))
+ *chr = tolower(*chr); /* lower case */
+
+ switch (str1[0]) {
+
+ case '1':
+ case '2': /* font sizes */
+ case '3':
+ case '4':
+ i = atoi(str2);
+ if (i > 0 && i < 1000)
+ tsize[str1[0] - '1'] = i;
+ else
+ error("bad font size value at line %1", linenum);
+ break;
+
+ case 'r': /* roman */
+ if (str2[0] < '0')
+ goto nofont;
+ tfont[0] = (char *) grnmalloc(strlen(str2) + 1, "roman command");
+ strcpy(tfont[0], str2);
+ break;
+
+ case 'i': /* italics */
+ if (str2[0] < '0')
+ goto nofont;
+ tfont[1] = (char *) grnmalloc(strlen(str2) + 1, "italics command");
+ strcpy(tfont[1], str2);
+ break;
+
+ case 'b': /* bold */
+ if (str2[0] < '0')
+ goto nofont;
+ tfont[2] = (char *) grnmalloc(strlen(str2) + 1, "bold command");
+ strcpy(tfont[2], str2);
+ break;
+
+ case 's': /* special */
+ if (str1[1] == 'c')
+ goto scalecommand; /* or scale */
+
+ if (str2[0] < '0') {
+ nofont:
+ error("no font name specified in line %1", linenum);
+ break;
+ }
+ if (str1[1] == 't')
+ goto stipplecommand; /* or stipple */
+
+ tfont[3] = (char *) grnmalloc(strlen(str2) + 1, "special command");
+ strcpy(tfont[3], str2);
+ break;
+
+ case 'l': /* l */
+ if (isdigit(str1[1])) { /* set stipple index */
+ int idx = atoi(str1 + 1), val;
+
+ if (idx < 0 || idx > NSTIPPLES) {
+ error("bad stipple number %1 at line %2", idx, linenum);
+ break;
+ }
+ if (!defstipple_index)
+ defstipple_index = other_stipple_index;
+ val = atoi(str2);
+ if (val >= 0 && val < 256)
+ stipple_index[idx] = val;
+ else
+ error("bad stipple index value at line %1", linenum);
+ break;
+ }
+
+ stipplecommand: /* set stipple name */
+ stipple = (char *) grnmalloc(strlen(str2) + 1, "stipple command");
+ strcpy(stipple, str2);
+ /* if it's a 'known' font (currently only 'cf'), set indices */
+ if (strcmp(stipple, "cf") == 0)
+ defstipple_index = cf_stipple_index;
+ else
+ defstipple_index = other_stipple_index;
+ for (i = 0; i <= NSTIPPLES; i++)
+ stipple_index[i] = defstipple_index[i];
+ break;
+
+ case 'a': /* text adjust */
+ par = atof(str2);
+ switch (str1[1]) {
+ case '1':
+ adj1 = par;
+ break;
+ case '2':
+ adj2 = par;
+ break;
+ case '3':
+ adj3 = par;
+ break;
+ case '4':
+ adj4 = par;
+ break;
+ default:
+ error("bad adjust command at line %1", linenum);
+ break;
+ }
+ break;
+
+ case 't': /* thick */
+ thick[2] = defthick[0] * atof(str2);
+ break;
+
+ case 'm': /* medium */
+ thick[5] = defthick[0] * atof(str2);
+ break;
+
+ case 'n': /* narrow */
+ thick[0] = thick[1] = thick[3] = thick[4] =
+ defthick[0] * atof(str2);
+ break;
+
+ case 'x': /* x */
+ scalecommand: /* scale */
+ par = atof(str2);
+ if (par > 0.0)
+ xscale *= par;
+ else
+ error("invalid scale value on line %1", linenum);
+ break;
+
+ case 'f': /* file */
+ strcpy(gremlinfile, str2);
+ break;
+
+ case 'w': /* width */
+ width = atof(str2);
+ if (width < 0.0)
+ width = -width;
+ break;
+
+ case 'h': /* height */
+ height = atof(str2);
+ if (height < 0.0)
+ height = -height;
+ break;
+
+ case 'd': /* defaults */
+ setdefault = 1;
+ break;
+
+ case 'p': /* pointscale */
+ if (strcmp("off", str2))
+ pointscale = 1;
+ else
+ pointscale = 0;
+ break;
+
+ default:
+ error("unknown command '%1' on line %2", str1, linenum);
+ exit(8);
+ break;
+ };
+}
+
+
+/*
+ * return TRUE if picture contains a polygon
+ * otherwise FALSE
+ */
+
+int
+has_polygon(ELT *elist)
+{
+ while (!DBNullelt(elist)) {
+ if (elist->type == POLYGON)
+ return (1);
+ elist = DBNextElt(elist);
+ }
+
+ return (0);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/html/html.am b/src/preproc/html/html.am
new file mode 100644
index 0000000..ac5ca9d
--- /dev/null
+++ b/src/preproc/html/html.am
@@ -0,0 +1,32 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+bin_PROGRAMS += pre-grohtml
+pre_grohtml_LDADD = libgroff.a lib/libgnu.a $(LIBM)
+pre_grohtml_SOURCES = \
+ src/preproc/html/pre-html.cpp \
+ src/preproc/html/pushback.cpp \
+ src/preproc/html/pre-html.h \
+ src/preproc/html/pushback.h
+src/preproc/html/pre-html.$(OBJEXT): defs.h
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/preproc/html/pre-html.cpp b/src/preproc/html/pre-html.cpp
new file mode 100644
index 0000000..fecfb05
--- /dev/null
+++ b/src/preproc/html/pre-html.cpp
@@ -0,0 +1,1819 @@
+/* Copyright (C) 2000-2021 Free Software Foundation, Inc.
+ * Written by Gaius Mulley (gaius@glam.ac.uk).
+ *
+ * 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 3 of the License, 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.
+ */
+
+#define PREHTMLC
+
+#include "lib.h"
+
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdlib.h>
+
+#include "errarg.h"
+#include "error.h"
+#include "stringclass.h"
+#include "posix.h"
+#include "defs.h"
+#include "searchpath.h"
+#include "paper.h"
+#include "device.h"
+#include "font.h"
+
+#include <errno.h>
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#ifdef _POSIX_VERSION
+# include <sys/wait.h>
+# define PID_T pid_t
+#else /* not _POSIX_VERSION */
+# define PID_T int
+#endif /* not _POSIX_VERSION */
+
+#include <stdarg.h>
+
+#include "nonposix.h"
+
+#if 0
+# define DEBUGGING
+#endif
+
+/* Establish some definitions to facilitate discrimination between
+ differing runtime environments. */
+
+#undef MAY_FORK_CHILD_PROCESS
+#undef MAY_SPAWN_ASYNCHRONOUS_CHILD
+
+#if defined(__MSDOS__) || defined(_WIN32)
+
+// Most MS-DOS and Win32 environments will be missing the 'fork'
+// capability (some, like Cygwin, have it, but it is better avoided).
+
+# define MAY_FORK_CHILD_PROCESS 0
+
+// On these systems, we use 'spawn...', instead of 'fork' ... 'exec...'.
+# include <process.h> // for 'spawn...'
+# include <fcntl.h> // for attributes of pipes
+
+# if defined(__CYGWIN__) || defined(_UWIN) || defined(_WIN32)
+
+// These Win32 implementations allow parent and 'spawn...'ed child to
+// multitask asynchronously.
+
+# define MAY_SPAWN_ASYNCHRONOUS_CHILD 1
+
+# else
+
+// Others may adopt MS-DOS behaviour where parent must sleep,
+// from 'spawn...' until child terminates.
+
+# define MAY_SPAWN_ASYNCHRONOUS_CHILD 0
+
+# endif /* not defined __CYGWIN__, _UWIN, or _WIN32 */
+
+# if defined(DEBUGGING) && !defined(DEBUG_FILE_DIR)
+/* When we are building a DEBUGGING version we need to tell pre-grohtml
+ where to put intermediate files (the DEBUGGING version will preserve
+ these on exit).
+
+ On a Unix host, we might simply use '/tmp', but MS-DOS and Win32 will
+ probably not have this on all disk drives, so default to using
+ 'c:/temp' instead. (Note that user may choose to override this by
+ supplying a definition such as
+
+ -DDEBUG_FILE_DIR=d:/path/to/debug/files
+
+ in the CPPFLAGS to 'make'.) */
+
+# define DEBUG_FILE_DIR c:/temp
+# endif
+
+#else /* not __MSDOS__ or _WIN32 */
+
+// For non-Microsoft environments assume Unix conventions,
+// so 'fork' is required and child processes are asynchronous.
+# define MAY_FORK_CHILD_PROCESS 1
+# define MAY_SPAWN_ASYNCHRONOUS_CHILD 1
+
+# if defined(DEBUGGING) && !defined(DEBUG_FILE_DIR)
+/* For a DEBUGGING version, on the Unix host, we can also usually rely
+ on being able to use '/tmp' for temporary file storage. (Note that,
+ as in the __MSDOS__ or _WIN32 case above, the user may override this
+ by defining
+
+ -DDEBUG_FILE_DIR=/path/to/debug/files
+
+ in the CPPFLAGS.) */
+
+# define DEBUG_FILE_DIR /tmp
+# endif
+
+#endif /* not __MSDOS__ or _WIN32 */
+
+#ifdef DEBUGGING
+// For a DEBUGGING version, we need some additional macros,
+// to direct the captured debugging mode output to appropriately named
+// files in the specified DEBUG_FILE_DIR.
+
+# define DEBUG_TEXT(text) #text
+# define DEBUG_NAME(text) DEBUG_TEXT(text)
+# define DEBUG_FILE(name) DEBUG_NAME(DEBUG_FILE_DIR) "/" name
+#endif
+
+extern "C" const char *Version_string;
+
+#include "pre-html.h"
+#include "pushback.h"
+#include "html-strings.h"
+
+#define DEFAULT_LINE_LENGTH 7 // inches wide
+#define DEFAULT_IMAGE_RES 100 // number of pixels per inch resolution
+#define IMAGE_BORDER_PIXELS 0
+#define INLINE_LEADER_CHAR '\\'
+
+// Don't use colour names here! Otherwise there is a dependency on
+// a file called 'rgb.txt' which maps names to colours.
+#define TRANSPARENT "-background rgb:f/f/f -transparent rgb:f/f/f"
+#define MIN_ALPHA_BITS 0
+#define MAX_ALPHA_BITS 4
+
+#define PAGE_TEMPLATE_SHORT "pg"
+#define PAGE_TEMPLATE_LONG "-page-"
+#define PS_TEMPLATE_SHORT "ps"
+#define PS_TEMPLATE_LONG "-ps-"
+#define REGION_TEMPLATE_SHORT "rg"
+#define REGION_TEMPLATE_LONG "-regions-"
+
+typedef enum {
+ CENTERED, LEFT, RIGHT, INLINE
+} IMAGE_ALIGNMENT;
+
+typedef enum {xhtml, html4} html_dialect;
+
+static int postscriptRes = -1; // PostScript resolution,
+ // dots per inch
+static int stdoutfd = 1; // output file descriptor -
+ // normally 1 but might move
+ // -1 means closed
+static char *psFileName = 0 /* nullptr */; // PostScript file name
+static char *psPageName = 0 /* nullptr */; // name of file
+ // containing current
+ // PostScript page
+static char *regionFileName = 0 /* nullptr */; // name of file
+ // containing all image
+ // regions
+static char *imagePageName = 0 /* nullptr */; // name of bitmap image
+ // file containing
+ // current page
+static const char *image_device = "pnmraw";
+static int image_res = DEFAULT_IMAGE_RES;
+static int vertical_offset = 0;
+static char *image_template = 0 /* nullptr */; // image file name
+ // template
+static char *macroset_template= 0 /* nullptr */; // image file
+ // name template
+ // passed to
+ // troff by -D
+static int troff_arg = 0; // troff arg index
+static char *image_dir = 0 /* nullptr */; // user-specified image
+ // directory
+static int textAlphaBits = MAX_ALPHA_BITS;
+static int graphicAlphaBits = MAX_ALPHA_BITS;
+static char *antiAlias = 0 /* nullptr */; // anti-alias arguments
+ // to be passed to gs
+static bool want_progress_report = false; // display page numbers
+ // as they are processed
+static int currentPageNo = -1; // current image page number
+#if defined(DEBUGGING)
+static bool debugging = false;
+static char *troffFileName = 0 /* nullptr */; // pre-html output sent
+ // to troff -Tps
+static char *htmlFileName = 0 /* nullptr */; // pre-html output sent
+ // to troff -Thtml
+#endif
+static bool need_eqn = false; // must we preprocess via eqn?
+
+static char *linebuf = 0 /* nullptr */; // for scanning devps/DESC
+static int linebufsize = 0;
+static const char *image_gen = 0 /* nullptr */; // the 'gs' program
+
+static const char devhtml_desc[] = "devhtml/DESC";
+static const char devps_desc[] = "devps/DESC";
+
+const char *const FONT_ENV_VAR = "GROFF_FONT_PATH";
+static search_path font_path(FONT_ENV_VAR, FONTPATH, 0, 0);
+static html_dialect dialect = html4;
+
+
+/*
+ * Images are generated via PostScript, gs, and the pnm utilities.
+ */
+#define IMAGE_DEVICE "-Tps"
+
+
+/*
+ * sys_fatal - Write a fatal error message.
+ * Taken from src/roff/groff/pipeline.c.
+ */
+
+void sys_fatal(const char *s)
+{
+ fatal("%1: %2", s, strerror(errno));
+}
+
+/*
+ * get_line - Copy a line (w/o newline) from a file to the
+ * global line buffer.
+ */
+
+int get_line(FILE *f)
+{
+ if (f == 0)
+ return 0;
+ if (linebuf == 0) {
+ linebuf = new char[128];
+ linebufsize = 128;
+ }
+ int i = 0;
+ // skip leading whitespace
+ for (;;) {
+ int c = getc(f);
+ if (c == EOF)
+ return 0;
+ if (c != ' ' && c != '\t') {
+ ungetc(c, f);
+ break;
+ }
+ }
+ for (;;) {
+ int c = getc(f);
+ if (c == EOF)
+ break;
+ if (i + 1 >= linebufsize) {
+ char *old_linebuf = linebuf;
+ linebuf = new char[linebufsize * 2];
+ memcpy(linebuf, old_linebuf, linebufsize);
+ delete[] old_linebuf;
+ linebufsize *= 2;
+ }
+ linebuf[i++] = c;
+ if (c == '\n') {
+ i--;
+ break;
+ }
+ }
+ linebuf[i] = '\0';
+ return 1;
+}
+
+/*
+ * get_resolution - Return the PostScript device resolution.
+ */
+
+static unsigned int get_resolution(void)
+{
+ char *pathp;
+ FILE *f;
+ unsigned int res = 0;
+ f = font_path.open_file(devps_desc, &pathp);
+ if (0 == f)
+ fatal("cannot open file '%1'", devps_desc);
+ free(pathp);
+ // XXX: We should break out of this loop if we hit a "charset" line.
+ // "This line and everything following it in the file are ignored."
+ // (groff_font(5))
+ while (get_line(f))
+ (void) sscanf(linebuf, "res %u", &res);
+ fclose(f);
+ return res;
+}
+
+
+/*
+ * get_image_generator - Return the declared program from the HTML
+ * device description.
+ */
+
+static char *get_image_generator(void)
+{
+ char *pathp;
+ FILE *f;
+ char *generator = 0;
+ const char keyword[] = "image_generator";
+ const size_t keyword_len = strlen(keyword);
+ f = font_path.open_file(devhtml_desc, &pathp);
+ if (0 == f)
+ fatal("cannot open file '%1'", devhtml_desc);
+ free(pathp);
+ // XXX: We should break out of this loop if we hit a "charset" line.
+ // "This line and everything following it in the file are ignored."
+ // (groff_font(5))
+ while (get_line(f)) {
+ char *cursor = linebuf;
+ size_t limit = strlen(linebuf);
+ char *end = linebuf + limit;
+ if (0 == (strncmp(linebuf, keyword, keyword_len))) {
+ cursor += keyword_len;
+ // At least one space or tab is required.
+ if(!(' ' == *cursor) || ('\t' == *cursor))
+ continue;
+ cursor++;
+ while((cursor < end) && ((' ' == *cursor) || ('\t' == *cursor)))
+ cursor++;
+ if (cursor == end)
+ continue;
+ generator = cursor;
+ }
+ }
+ fclose(f);
+ return generator;
+}
+
+/*
+ * html_system - A wrapper for system().
+ */
+
+void html_system(const char *s, int redirect_stdout)
+{
+#if defined(DEBUGGING)
+ if (debugging) {
+ fprintf(stderr, "executing: ");
+ fwrite(s, sizeof(char), strlen(s), stderr);
+ fflush(stderr);
+ }
+#endif
+ {
+ int saved_stdout = dup(1);
+ int fdnull = open(NULL_DEV, O_WRONLY|O_BINARY, 0666);
+ if (redirect_stdout && saved_stdout > 1 && fdnull > 1)
+ dup2(fdnull, 1);
+ if (fdnull >= 0)
+ close(fdnull);
+ int status = system(s);
+ if (redirect_stdout)
+ dup2(saved_stdout, 1);
+ if (status == -1)
+ fprintf(stderr, "Calling '%s' failed\n", s);
+ else if (status)
+ fprintf(stderr, "Calling '%s' returned status %d\n", s, status);
+ close(saved_stdout);
+ }
+}
+
+/*
+ * make_string - Create a string via `malloc()`, place the variadic
+ * arguments as formatted by `fmt` into it, and return
+ * it. Adapted from Linux man-pages' printf(3) example.
+ * We never return a null pointer, instead treating
+ * failure as invariably fatal.
+ */
+
+char *make_string(const char *fmt, ...)
+{
+ size_t size = 0;
+ char *p = 0 /* nullptr */;
+ va_list ap;
+ va_start(ap, fmt);
+ int n = vsnprintf(p, size, fmt, ap);
+ va_end(ap);
+ if (n < 0)
+ sys_fatal("vsnprintf");
+ size = static_cast<size_t>(n) + 1 /* '\0' */;
+ p = static_cast<char *>(malloc(size));
+ if (0 /* nullptr */ == p)
+ sys_fatal("vsnprintf");
+ va_start(ap, fmt);
+ n = vsnprintf(p, size, fmt, ap);
+ va_end(ap);
+ if (n < 0)
+ sys_fatal("vsnprintf");
+ assert(p != 0 /* nullptr */);
+ return p;
+}
+
+/*
+ * classes and methods for retaining ascii text
+ */
+
+struct char_block {
+ enum { SIZE = 256 };
+ char buffer[SIZE];
+ int used;
+ char_block *next;
+
+ char_block();
+};
+
+char_block::char_block()
+: used(0), next(0)
+{
+ for (int i = 0; i < SIZE; i++)
+ buffer[i] = 0;
+}
+
+class char_buffer {
+public:
+ char_buffer();
+ ~char_buffer();
+ void read_file(FILE *fp);
+ int do_html(int argc, char *argv[]);
+ int do_image(int argc, char *argv[]);
+ void emit_troff_output(int device_format_selector);
+ void write_upto_newline(char_block **t, int *i, int is_html);
+ bool can_see(char_block **t, int *i, const char *string);
+ void skip_until_newline(char_block **t, int *i);
+private:
+ char_block *head;
+ char_block *tail;
+ int run_output_filter(int device_format_selector, int argc,
+ char *argv[]);
+};
+
+char_buffer::char_buffer()
+: head(0), tail(0)
+{
+}
+
+char_buffer::~char_buffer()
+{
+ while (head != 0 /* nullptr */) {
+ char_block *temp = head;
+ head = head->next;
+ delete temp;
+ }
+}
+
+/*
+ * read_file - Read file `fp` into char_blocks.
+ */
+
+void char_buffer::read_file(FILE *fp)
+{
+ int n;
+ while (!feof(fp)) {
+ if (0 /* nullptr */ == tail) {
+ tail = new char_block;
+ head = tail;
+ }
+ else {
+ if (tail->used == char_block::SIZE) {
+ tail->next = new char_block;
+ tail = tail->next;
+ }
+ }
+ // We now have a tail ready for the next `SIZE` bytes of the file.
+ n = fread(tail->buffer, sizeof(char), char_block::SIZE-tail->used,
+ fp);
+ if ((n < 0) || ((0 == n) && !feof(fp)))
+ sys_fatal("fread");
+ tail->used += n * sizeof(char);
+ }
+}
+
+/*
+ * writeNbytes - Write n bytes to stdout.
+ */
+
+static void writeNbytes(const char *s, int l)
+{
+ int n = 0;
+ int r;
+
+ while (n < l) {
+ r = write(stdoutfd, s, l - n);
+ if (r < 0)
+ sys_fatal("write");
+ n += r;
+ s += r;
+ }
+}
+
+/*
+ * writeString - Write a string to stdout.
+ */
+
+static void writeString(const char *s)
+{
+ writeNbytes(s, strlen(s));
+}
+
+/*
+ * makeFileName - Create the image filename template
+ * and the macroset image template.
+ */
+
+static void makeFileName(void)
+{
+ if ((image_dir != 0 /* nullptr */)
+ && (strchr(image_dir, '%') != 0 /* nullptr */))
+ fatal("'%%' is prohibited within the image directory name");
+ if ((image_template != 0 /* nullptr */)
+ && (strchr(image_template, '%') != 0 /* nullptr */))
+ fatal("'%%' is prohibited within the image template");
+ if (0 /* nullptr */ == image_dir)
+ image_dir = (char *)"";
+ else if (strlen(image_dir) > 0
+ && image_dir[strlen(image_dir) - 1] != '/')
+ image_dir = make_string("%s/", image_dir);
+ if (0 /* nullptr */ == image_template)
+ macroset_template = make_string("%sgrohtml-%d-", image_dir,
+ int(getpid()));
+ else
+ macroset_template = make_string("%s%s-", image_dir,
+ image_template);
+ size_t mtlen = strlen(macroset_template);
+ image_template = (char *)malloc(strlen("%d") + mtlen + 1);
+ if (0 /* nullptr */ == image_template)
+ sys_fatal("malloc");
+ char *s = strcpy(image_template, macroset_template);
+ s += mtlen;
+ // Keep this format string synced with troff:suppress_node::tprint().
+ strcpy(s, "%d");
+}
+
+/*
+ * setupAntiAlias - Set up the antialias string, used when we call gs.
+ */
+
+static void setupAntiAlias(void)
+{
+ if (textAlphaBits == 0 && graphicAlphaBits == 0)
+ antiAlias = make_string(" ");
+ else if (textAlphaBits == 0)
+ antiAlias = make_string("-dGraphicsAlphaBits=%d ",
+ graphicAlphaBits);
+ else if (graphicAlphaBits == 0)
+ antiAlias = make_string("-dTextAlphaBits=%d ", textAlphaBits);
+ else
+ antiAlias = make_string("-dTextAlphaBits=%d"
+ " -dGraphicsAlphaBits=%d ", textAlphaBits,
+ graphicAlphaBits);
+}
+
+/*
+ * checkImageDir - Check whether the image directory is available.
+ */
+
+static void checkImageDir(void)
+{
+ if (image_dir != 0 /* nullptr */ && strcmp(image_dir, "") != 0)
+ if (!(mkdir(image_dir, 0777) == 0 || errno == EEXIST))
+ fatal("cannot create directory '%1': %2", image_dir,
+ strerror(errno));
+}
+
+/*
+ * write_end_image - End the image. Write out the image extents if we
+ * are using -Tps.
+ */
+
+static void write_end_image(int is_html)
+{
+ /*
+ * if we are producing html then these
+ * emit image name and enable output
+ * else
+ * we are producing images
+ * in which case these generate image
+ * boundaries
+ */
+ writeString("\\O[4]\\O[2]");
+ if (is_html)
+ writeString("\\O[1]");
+ else
+ writeString("\\O[0]");
+}
+
+/*
+ * write_start_image - Write troff code which will:
+ *
+ * (i) disable html output for the following image
+ * (ii) reset the max/min x/y registers during
+ * Postscript Rendering.
+ */
+
+static void write_start_image(IMAGE_ALIGNMENT pos, int is_html)
+{
+ writeString("\\O[5");
+ switch (pos) {
+ case INLINE:
+ writeString("i");
+ break;
+ case LEFT:
+ writeString("l");
+ break;
+ case RIGHT:
+ writeString("r");
+ break;
+ case CENTERED:
+ default:
+ writeString("c");
+ break;
+ }
+ writeString(image_template);
+ writeString(".png]");
+ if (is_html)
+ writeString("\\O[0]\\O[3]");
+ else
+ // reset min/max registers
+ writeString("\\O[1]\\O[3]");
+}
+
+/*
+ * write_upto_newline - Write the contents of the buffer until a
+ * newline is seen. Check for
+ * HTML_IMAGE_INLINE_BEGIN and
+ * HTML_IMAGE_INLINE_END; process them if they are
+ * present.
+ */
+
+void char_buffer::write_upto_newline(char_block **t, int *i,
+ int is_html)
+{
+ int j = *i;
+
+ if (*t) {
+ while (j < (*t)->used
+ && (*t)->buffer[j] != '\n'
+ && (*t)->buffer[j] != INLINE_LEADER_CHAR)
+ j++;
+ if (j < (*t)->used
+ && (*t)->buffer[j] == '\n')
+ j++;
+ writeNbytes((*t)->buffer + (*i), j - (*i));
+ if (j < char_block::SIZE && (*t)->buffer[j] == INLINE_LEADER_CHAR) {
+ if (can_see(t, &j, HTML_IMAGE_INLINE_BEGIN))
+ write_start_image(INLINE, is_html);
+ else if (can_see(t, &j, HTML_IMAGE_INLINE_END))
+ write_end_image(is_html);
+ else {
+ if (j < (*t)->used) {
+ *i = j;
+ j++;
+ writeNbytes((*t)->buffer + (*i), j - (*i));
+ }
+ }
+ }
+ if (j == (*t)->used) {
+ *i = 0;
+ *t = (*t)->next;
+ if (*t && (*t)->buffer[j - 1] != '\n')
+ write_upto_newline(t, i, is_html);
+ }
+ else
+ // newline was seen
+ *i = j;
+ }
+}
+
+/*
+ * can_see - Return true if we can see string in t->buffer[i] onwards.
+ */
+
+bool char_buffer::can_see(char_block **t, int *i, const char *str)
+{
+ int j = 0;
+ int l = strlen(str);
+ int k = *i;
+ char_block *s = *t;
+
+ while (s) {
+ while (k < s->used && j < l && s->buffer[k] == str[j]) {
+ j++;
+ k++;
+ }
+ if (j == l) {
+ *i = k;
+ *t = s;
+ return true;
+ }
+ else if (k < s->used && s->buffer[k] != str[j])
+ return false;
+ s = s->next;
+ k = 0;
+ }
+ return false;
+}
+
+/*
+ * skip_until_newline - Skip all characters until a newline is seen.
+ * The newline is not consumed.
+ */
+
+void char_buffer::skip_until_newline(char_block **t, int *i)
+{
+ int j = *i;
+
+ if (*t) {
+ while (j < (*t)->used && (*t)->buffer[j] != '\n')
+ j++;
+ if (j == (*t)->used) {
+ *i = 0;
+ *t = (*t)->next;
+ skip_until_newline(t, i);
+ }
+ else
+ // newline was seen
+ *i = j;
+ }
+}
+
+#define DEVICE_FORMAT(filter) (filter == HTML_OUTPUT_FILTER)
+#define HTML_OUTPUT_FILTER 0
+#define IMAGE_OUTPUT_FILTER 1
+#define OUTPUT_STREAM(name) creat((name), S_IWUSR | S_IRUSR)
+#define PS_OUTPUT_STREAM OUTPUT_STREAM(psFileName)
+#define REGION_OUTPUT_STREAM OUTPUT_STREAM(regionFileName)
+
+/*
+ * emit_troff_output - Write formatted buffer content to the troff
+ * post-processor data pipeline.
+ */
+
+void char_buffer::emit_troff_output(int device_format_selector)
+{
+ // Handle output for BOTH html and image device formats
+ // if 'device_format_selector' is passed as
+ //
+ // HTML_FORMAT(HTML_OUTPUT_FILTER)
+ // Buffer data is written to the output stream
+ // with template image names translated to actual image names.
+ //
+ // HTML_FORMAT(IMAGE_OUTPUT_FILTER)
+ // Buffer data is written to the output stream
+ // with no translation, for image file creation in the
+ // post-processor.
+
+ int idx = 0;
+ char_block *element = head;
+
+ while (element != 0 /* nullptr */)
+ write_upto_newline(&element, &idx, device_format_selector);
+
+#if 0
+ if (close(stdoutfd) < 0)
+ sys_fatal ("close");
+
+ // now we grab fd=1 so that the next pipe cannot use fd=1
+ if (stdoutfd == 1) {
+ if (dup(2) != stdoutfd)
+ sys_fatal ("dup failed to use fd=1");
+ }
+#endif /* 0 */
+}
+
+/*
+ * The image class remembers the position of all images in the
+ * PostScript file and assigns names for each image.
+ */
+
+struct imageItem {
+ imageItem *next;
+ int X1;
+ int Y1;
+ int X2;
+ int Y2;
+ char *imageName;
+ int resolution;
+ int maxx;
+ int pageNo;
+
+ imageItem(int x1, int y1, int x2, int y2,
+ int page, int res, int max_width, char *name);
+ ~imageItem();
+};
+
+/*
+ * imageItem - Constructor.
+ */
+
+imageItem::imageItem(int x1, int y1, int x2, int y2,
+ int page, int res, int max_width, char *name)
+{
+ X1 = x1;
+ Y1 = y1;
+ X2 = x2;
+ Y2 = y2;
+ pageNo = page;
+ resolution = res;
+ maxx = max_width;
+ imageName = name;
+ next = 0 /* nullptr */;
+}
+
+/*
+ * imageItem - Destructor.
+ */
+
+imageItem::~imageItem()
+{
+ if (imageName)
+ free(imageName);
+}
+
+/*
+ * imageList - A class containing a list of imageItems.
+ */
+
+class imageList {
+private:
+ imageItem *head;
+ imageItem *tail;
+ int count;
+public:
+ imageList();
+ ~imageList();
+ void add(int x1, int y1, int x2, int y2,
+ int page, int res, int maxx, char *name);
+ void createImages(void);
+ int createPage(int pageno);
+ void createImage(imageItem *i);
+ int getMaxX(int pageno);
+};
+
+/*
+ * imageList - Constructor.
+ */
+
+imageList::imageList()
+: head(0), tail(0), count(0)
+{
+}
+
+/*
+ * imageList - Destructor.
+ */
+
+imageList::~imageList()
+{
+ while (head != 0 /* nullptr */) {
+ imageItem *i = head;
+ head = head->next;
+ delete i;
+ }
+}
+
+/*
+ * createPage - Create image of page `pageno` from PostScript file.
+ */
+
+int imageList::createPage(int pageno)
+{
+ char *s;
+
+ if (currentPageNo == pageno)
+ return 0;
+
+ if (currentPageNo >= 1) {
+ /*
+ * We need to unlink the files which change each time a new page is
+ * processed. The final unlink is done by xtmpfile when
+ * pre-grohtml exits.
+ */
+ unlink(imagePageName);
+ unlink(psPageName);
+ }
+
+ if (want_progress_report) {
+ fprintf(stderr, "[%d] ", pageno);
+ fflush(stderr);
+ }
+
+#if defined(DEBUGGING)
+ if (debugging)
+ fprintf(stderr, "creating page %d\n", pageno);
+#endif
+
+ s = make_string("psselect -q -p%d %s %s\n",
+ pageno, psFileName, psPageName);
+ html_system(s, 1);
+ assert(strlen(image_gen) > 0);
+ s = make_string("echo showpage | "
+ "%s%s -q -dBATCH -dSAFER "
+ "-dDEVICEHEIGHTPOINTS=792 "
+ "-dDEVICEWIDTHPOINTS=%d -dFIXEDMEDIA=true "
+ "-sDEVICE=%s -r%d %s "
+ "-sOutputFile=%s %s -\n",
+ image_gen,
+ EXE_EXT,
+ (getMaxX(pageno) * image_res) / postscriptRes,
+ image_device,
+ image_res,
+ antiAlias,
+ imagePageName,
+ psPageName);
+ html_system(s, 1);
+ free(s);
+ currentPageNo = pageno;
+ return 0;
+}
+
+/*
+ * min - Return the minimum of two numbers.
+ */
+
+int min(int x, int y)
+{
+ if (x < y)
+ return x;
+ else
+ return y;
+}
+
+/*
+ * max - Return the maximum of two numbers.
+ */
+
+int max(int x, int y)
+{
+ if (x > y)
+ return x;
+ else
+ return y;
+}
+
+/*
+ * getMaxX - Return the largest right-hand position for any image
+ * on `pageno`.
+ */
+
+int imageList::getMaxX(int pageno)
+{
+ imageItem *h = head;
+ int x = postscriptRes * DEFAULT_LINE_LENGTH;
+
+ while (h != 0 /* nullptr */) {
+ if (h->pageNo == pageno)
+ x = max(h->X2, x);
+ h = h->next;
+ }
+ return x;
+}
+
+/*
+ * createImage - Generate a minimal PNG file from the set of page
+ * images.
+ */
+
+void imageList::createImage(imageItem *i)
+{
+ if (i->X1 != -1) {
+ char *s;
+ int x1 = max(min(i->X1, i->X2) * image_res / postscriptRes
+ - IMAGE_BORDER_PIXELS,
+ 0);
+ int y1 = max(image_res * vertical_offset / 72
+ + min(i->Y1, i->Y2) * image_res / postscriptRes
+ - IMAGE_BORDER_PIXELS,
+ 0);
+ int x2 = max(i->X1, i->X2) * image_res / postscriptRes
+ + IMAGE_BORDER_PIXELS;
+ int y2 = image_res * vertical_offset / 72
+ + max(i->Y1, i->Y2) * image_res / postscriptRes
+ + 1 + IMAGE_BORDER_PIXELS;
+ if (createPage(i->pageNo) == 0) {
+ s = make_string("pnmcut%s %d %d %d %d < %s "
+ "| pnmcrop%s -quiet | pnmtopng%s -quiet %s"
+ "> %s\n",
+ EXE_EXT,
+ x1, y1, x2 - x1 + 1, y2 - y1 + 1,
+ imagePageName,
+ EXE_EXT,
+ EXE_EXT,
+ TRANSPARENT,
+ i->imageName);
+ html_system(s, 0);
+ free(s);
+ }
+ else {
+ fprintf(stderr, "failed to generate image of page %d\n",
+ i->pageNo);
+ fflush(stderr);
+ }
+#if defined(DEBUGGING)
+ }
+ else {
+ if (debugging) {
+ fprintf(stderr, "ignoring image as x1 coord is -1\n");
+ fflush(stderr);
+ }
+#endif
+ }
+}
+
+/*
+ * add - Add an image description to the imageList.
+ */
+
+void imageList::add(int x1, int y1, int x2, int y2,
+ int page, int res, int maxx, char *name)
+{
+ imageItem *i = new imageItem(x1, y1, x2, y2, page, res, maxx, name);
+
+ if (0 /* nullptr */ == head) {
+ head = i;
+ tail = i;
+ }
+ else {
+ tail->next = i;
+ tail = i;
+ }
+}
+
+/*
+ * createImages - For each image descriptor on the imageList,
+ * create the actual image.
+ */
+
+void imageList::createImages(void)
+{
+ imageItem *h = head;
+
+ while (h != 0 /* nullptr */) {
+ createImage(h);
+ h = h->next;
+ }
+}
+
+static imageList listOfImages; // list of images defined by region file
+
+/*
+ * generateImages - Parse the region file and generate images from the
+ * PostScript file. The region file contains the
+ * x1,y1--x2,y2 extents of each image.
+ */
+
+static void generateImages(char *region_file_name)
+{
+ pushBackBuffer *f=new pushBackBuffer(region_file_name);
+
+ while (f->putPB(f->getPB()) != eof) {
+ if (f->isString("grohtml-info:page")) {
+ int page = f->readInt();
+ int x1 = f->readInt();
+ int y1 = f->readInt();
+ int x2 = f->readInt();
+ int y2 = f->readInt();
+ int maxx = f->readInt();
+ char *name = f->readString();
+ int res = postscriptRes;
+ listOfImages.add(x1, y1, x2, y2, page, res, maxx, name);
+ while (f->putPB(f->getPB()) != '\n'
+ && f->putPB(f->getPB()) != eof)
+ (void)f->getPB();
+ if (f->putPB(f->getPB()) == '\n')
+ (void)f->getPB();
+ }
+ else {
+ /* Write any error messages out to the user. */
+ fputc(f->getPB(), stderr);
+ }
+ }
+ fflush(stderr);
+
+ listOfImages.createImages();
+ if (want_progress_report) {
+ fprintf(stderr, "done\n");
+ fflush(stderr);
+ }
+ delete f;
+}
+
+/*
+ * set_redirection - Redirect file descriptor `was` to file descriptor
+ * `willbe`.
+ */
+
+static void set_redirection(int was, int willbe)
+{
+ // Nothing to do if 'was' and 'willbe' already have same handle.
+ if (was != willbe) {
+ // Otherwise attempt the specified redirection.
+ if (dup2(willbe, was) < 0) {
+ // Redirection failed, so issue diagnostic and bail out.
+ fprintf(stderr, "failed to replace fd=%d with %d\n", was, willbe);
+ if (willbe == STDOUT_FILENO)
+ fprintf(stderr,
+ "likely that stdout should be opened before %d\n", was);
+ sys_fatal("dup2");
+ }
+
+ // When redirection has been successfully completed assume redundant
+ // handle 'willbe' is no longer required, so close it.
+ if (close(willbe) < 0)
+ // Issue diagnostic if 'close' fails.
+ sys_fatal("close");
+ }
+}
+
+/*
+ * save_and_redirect - Duplicate file descriptor for `was` on file
+ * descriptor `willbe`.
+ */
+
+static int save_and_redirect(int was, int willbe)
+{
+ if (was == willbe)
+ // No redirection specified; silently bail out.
+ return (was);
+
+ // Proceeding with redirection so first save and verify our duplicate
+ // handle for 'was'.
+ int saved = dup(was);
+ if (saved < 0) {
+ fprintf(stderr, "unable to get duplicate handle for %d\n", was);
+ sys_fatal("dup");
+ }
+
+ // Duplicate handle safely established so complete redirection.
+ set_redirection(was, willbe);
+
+ // Finally return the saved duplicate descriptor for the original
+ // 'was' descriptor.
+ return saved;
+}
+
+/*
+ * alterDeviceTo - If toImage is set
+ * the argument list is altered to include
+ * IMAGE_DEVICE; we invoke groff rather than troff.
+ * Else
+ * set -Thtml and groff.
+ */
+
+static void alterDeviceTo(int argc, char *argv[], int toImage)
+{
+ int i = 0;
+
+ if (toImage) {
+ while (i < argc) {
+ if ((strcmp(argv[i], "-Thtml") == 0) ||
+ (strcmp(argv[i], "-Txhtml") == 0))
+ argv[i] = (char *)IMAGE_DEVICE;
+ i++;
+ }
+ argv[troff_arg] = (char *)"groff"; /* rather than troff */
+ }
+ else {
+ while (i < argc) {
+ if (strcmp(argv[i], IMAGE_DEVICE) == 0) {
+ if (dialect == xhtml)
+ argv[i] = (char *)"-Txhtml";
+ else
+ argv[i] = (char *)"-Thtml";
+ }
+ i++;
+ }
+ argv[troff_arg] = (char *)"groff"; /* use groff -Z */
+ }
+}
+
+/*
+ * addArg - Append newarg onto the command list for groff.
+ */
+
+char **addArg(int argc, char *argv[], char *newarg)
+{
+ char **new_argv = (char **)malloc((argc + 2) * sizeof(char *));
+ int i = 0;
+
+ if (0 /* nullptr */ == new_argv)
+ sys_fatal("malloc");
+
+ if (argc > 0) {
+ new_argv[i] = argv[i];
+ i++;
+ }
+ new_argv[i] = newarg;
+ while (i < argc) {
+ new_argv[i + 1] = argv[i];
+ i++;
+ }
+ argc++;
+ new_argv[argc] = 0 /* nullptr */;
+ return new_argv;
+}
+
+/*
+ * addRegDef - Append a defined register or string onto the command
+ * list for troff.
+ */
+
+char **addRegDef(int argc, char *argv[], const char *numReg)
+{
+ char **new_argv = (char **)malloc((argc + 2) * sizeof(char *));
+ int i = 0;
+
+ if (0 /* nullptr */ == new_argv)
+ sys_fatal("malloc");
+
+ while (i < argc) {
+ new_argv[i] = argv[i];
+ i++;
+ }
+ new_argv[argc] = strsave(numReg);
+ argc++;
+ new_argv[argc] = 0 /* nullptr */;
+ return new_argv;
+}
+
+/*
+ * dump_args - Display the argument list.
+ */
+
+void dump_args(int argc, char *argv[])
+{
+ fprintf(stderr, " %d arguments:", argc);
+ for (int i = 0; i < argc; i++)
+ fprintf(stderr, " %s", argv[i]);
+ fprintf(stderr, "\n");
+}
+
+/*
+ * print_args - Print arguments as if issued on the command line.
+ */
+
+#if defined(DEBUGGING)
+
+void print_args(int argc, char *argv[])
+{
+ if (debugging) {
+ fprintf(stderr, "executing: ");
+ for (int i = 0; i < argc; i++)
+ fprintf(stderr, "%s ", argv[i]);
+ fprintf(stderr, "\n");
+ }
+}
+
+#else
+
+void print_args(int, char **)
+{
+}
+
+#endif
+
+int char_buffer::run_output_filter(int filter, int argc, char **argv)
+{
+ int pipedes[2];
+ PID_T child_pid;
+ int wstatus;
+
+ print_args(argc, argv);
+ if (pipe(pipedes) < 0)
+ sys_fatal("pipe");
+
+#if MAY_FORK_CHILD_PROCESS
+ // This is the Unix process model. To invoke our post-processor,
+ // we must 'fork' the current process.
+
+ if ((child_pid = fork()) < 0)
+ sys_fatal("fork");
+
+ else if (child_pid == 0) {
+ // This is the child process. We redirect its input file descriptor
+ // to read data emerging from our pipe. There is no point in
+ // saving, since we won't be able to restore later!
+
+ set_redirection(STDIN_FILENO, pipedes[0]);
+
+ // The parent process will be writing this data; release the child's
+ // writeable handle on the pipe since we have no use for it.
+
+ if (close(pipedes[1]) < 0)
+ sys_fatal("close");
+
+ // The IMAGE_OUTPUT_FILTER needs special output redirection...
+
+ if (filter == IMAGE_OUTPUT_FILTER) {
+ // ...with BOTH 'stdout' AND 'stderr' diverted to files, the
+ // latter so that `generateImages()` can scrape "grohtml-info"
+ // from it.
+
+ set_redirection(STDOUT_FILENO, PS_OUTPUT_STREAM);
+ set_redirection(STDERR_FILENO, REGION_OUTPUT_STREAM);
+ }
+
+ // Now we are ready to launch the output filter.
+
+ execvp(argv[0], argv); // does not return unless it fails
+ fatal("cannot execute '%1': %2", argv[0], strerror(errno));
+ }
+
+ else {
+ // This is the parent process. We write data to the filter pipeline
+ // where the child will read it. We have no need to read from the
+ // input side ourselves, so close it.
+
+ if (close(pipedes[0]) < 0)
+ sys_fatal("close");
+
+ // Now redirect the standard output file descriptor to the inlet end
+ // of the pipe, and push the formatted data to the filter.
+
+ pipedes[1] = save_and_redirect(STDOUT_FILENO, pipedes[1]);
+ emit_troff_output(DEVICE_FORMAT(filter));
+
+ // After emitting all the data we close our connection to the inlet
+ // end of the pipe so the child process will detect end of data.
+
+ set_redirection(STDOUT_FILENO, pipedes[1]);
+
+ // Finally, we must wait for the child process to complete.
+
+ if (WAIT(&wstatus, child_pid, _WAIT_CHILD) != child_pid)
+ sys_fatal("wait");
+ }
+
+#elif MAY_SPAWN_ASYNCHRONOUS_CHILD
+
+ // We do not have `fork` (or we prefer not to use it), but
+ // asynchronous processes are allowed, passing data through pipes.
+ // This should be okay for most Win32 systems and is preferred to
+ // `fork` for starting child processes under Cygwin.
+
+ // Before we start the post-processor we bind its inherited standard
+ // input file descriptor to the readable end of our pipe, saving our
+ // own standard input file descriptor in `pipedes[0]`.
+
+ pipedes[0] = save_and_redirect(STDIN_FILENO, pipedes[0]);
+
+ // For the Win32 model,
+ // we need special provision for saving BOTH 'stdout' and 'stderr'.
+
+ int saved_stdout = dup(STDOUT_FILENO);
+ int saved_stderr = STDERR_FILENO;
+
+ // The IMAGE_OUTPUT_FILTER needs special output redirection...
+
+ if (filter == IMAGE_OUTPUT_FILTER) {
+ // with BOTH 'stdout' AND 'stderr' diverted to files while saving a
+ // duplicate handle for 'stderr'.
+
+ set_redirection(STDOUT_FILENO, PS_OUTPUT_STREAM);
+ saved_stderr = save_and_redirect(STDERR_FILENO,
+ REGION_OUTPUT_STREAM);
+ }
+
+ // Use an asynchronous spawn request to start the post-processor.
+
+ if ((child_pid = spawnvp(_P_NOWAIT, argv[0], argv)) < 0) {
+ fatal("cannot spawn %1: %2", argv[0], strerror(errno));
+ }
+
+ // Once the post-processor has been started we revert our 'stdin'
+ // to its original saved source, which also closes the readable handle
+ // for the pipe.
+
+ set_redirection(STDIN_FILENO, pipedes[0]);
+
+ // if we redirected 'stderr', for use by the image post-processor,
+ // then we also need to reinstate its original assignment.
+
+ if (filter == IMAGE_OUTPUT_FILTER)
+ set_redirection(STDERR_FILENO, saved_stderr);
+
+ // Now we redirect the standard output to the inlet end of the pipe,
+ // and push out the appropriately formatted data to the filter.
+
+ set_redirection(STDOUT_FILENO, pipedes[1]);
+ emit_troff_output(DEVICE_FORMAT(filter));
+
+ // After emitting all the data we close our connection to the inlet
+ // end of the pipe so the child process will detect end of data.
+
+ set_redirection(STDOUT_FILENO, saved_stdout);
+
+ // And finally, we must wait for the child process to complete.
+
+ if (WAIT(&wstatus, child_pid, _WAIT_CHILD) != child_pid)
+ sys_fatal("wait");
+
+#else /* can't do asynchronous pipes! */
+
+ // TODO: code to support an MS-DOS style process model should go here
+ fatal("output filtering not supported on this platform");
+
+#endif /* MAY_FORK_CHILD_PROCESS or MAY_SPAWN_ASYNCHRONOUS_CHILD */
+
+ return wstatus;
+}
+
+/*
+ * do_html - Set the troff number htmlflip and
+ * write out the buffer to troff -Thtml.
+ */
+
+int char_buffer::do_html(int argc, char *argv[])
+{
+ string s;
+
+ alterDeviceTo(argc, argv, 0);
+ argv += troff_arg; // skip all arguments up to groff
+ argc -= troff_arg;
+ argv = addArg(argc, argv, (char *)"-Z");
+ argc++;
+
+ s = (char *)"-dwww-image-template=";
+ s += macroset_template; // Do not combine these statements,
+ // otherwise they will not work.
+ s += '\0'; // The trailing '\0' is ignored.
+ argv = addRegDef(argc, argv, s.contents());
+ argc++;
+
+ if (dialect == xhtml) {
+ argv = addRegDef(argc, argv, "-rxhtml=1");
+ argc++;
+ if (need_eqn) {
+ argv = addRegDef(argc, argv, "-e");
+ argc++;
+ }
+ }
+
+#if defined(DEBUGGING)
+# define HTML_DEBUG_STREAM OUTPUT_STREAM(htmlFileName)
+ // slight security risk: only enabled if defined(DEBUGGING)
+ if (debugging) {
+ int saved_stdout = save_and_redirect(STDOUT_FILENO,
+ HTML_DEBUG_STREAM);
+ emit_troff_output(DEVICE_FORMAT(HTML_OUTPUT_FILTER));
+ set_redirection(STDOUT_FILENO, saved_stdout);
+ }
+#endif
+
+ return run_output_filter(HTML_OUTPUT_FILTER, argc, argv);
+}
+
+/*
+ * do_image - Write out the buffer to troff -Tps.
+ */
+
+int char_buffer::do_image(int argc, char *argv[])
+{
+ string s;
+
+ alterDeviceTo(argc, argv, 1);
+ argv += troff_arg; // skip all arguments up to troff/groff
+ argc -= troff_arg;
+ argv = addRegDef(argc, argv, "-rps4html=1");
+ argc++;
+
+ s = "-dwww-image-template=";
+ s += macroset_template;
+ s += '\0';
+ argv = addRegDef(argc, argv, s.contents());
+ argc++;
+
+ // Override local settings and produce a letter-size PostScript page
+ // file.
+ argv = addRegDef(argc, argv, "-P-pletter");
+ argc++;
+
+ if (dialect == xhtml) {
+ if (need_eqn) {
+ argv = addRegDef(argc, argv, "-rxhtml=1");
+ argc++;
+ }
+ argv = addRegDef(argc, argv, "-e");
+ argc++;
+ }
+
+#if defined(DEBUGGING)
+# define IMAGE_DEBUG_STREAM OUTPUT_STREAM(troffFileName)
+ // slight security risk: only enabled if defined(DEBUGGING)
+ if (debugging) {
+ int saved_stdout = save_and_redirect(STDOUT_FILENO,
+ IMAGE_DEBUG_STREAM);
+ emit_troff_output(DEVICE_FORMAT(IMAGE_OUTPUT_FILTER));
+ set_redirection(STDOUT_FILENO, saved_stdout);
+ }
+#endif
+
+ return run_output_filter(IMAGE_OUTPUT_FILTER, argc, argv);
+}
+
+static char_buffer inputFile;
+
+/*
+ * usage - Emit usage message.
+ */
+
+static void usage(FILE *stream)
+{
+ fprintf(stream,
+"usage: %s [-epV] [-a anti-aliasing-text-bits] [-D image-directory]"
+" [-F font-directory] [-g anti-aliasing-graphics-bits] [-i resolution]"
+" [-I image-stem] [-o image-vertical-offset] [-x html-dialect]"
+" troff-command troff-argument ...\n"
+"usage: %s {-v | --version}\n"
+"usage: %s --help\n",
+ program_name, program_name, program_name);
+ if (stdout == stream) {
+ fputs(
+"\n"
+"Prepare a troff(1) document for HTML formatting.\n"
+"\n"
+"This program is not intended to be executed standalone; it is\n"
+"normally part of a groff pipeline. If your need to run it manually\n"
+"(e.g., for debugging purposes), give the 'groff' program the\n"
+"command-line option '-V' to inspect the arguments with which\n",
+ stream);
+ fprintf(stream,
+"'%s' is called. See the grohtml(1) manual page.\n",
+ program_name);
+ exit(EXIT_SUCCESS);
+ }
+}
+
+/*
+ * scanArguments - Scan for all arguments including -P-i, -P-o, -P-D,
+ * and -P-I. Return the argument index of the first
+ * non-option.
+ */
+
+static int scanArguments(int argc, char **argv)
+{
+ const char *cmdprefix = getenv("GROFF_COMMAND_PREFIX");
+ if (!cmdprefix)
+ cmdprefix = PROG_PREFIX;
+ size_t pfxlen = strlen(cmdprefix);
+ char *troff_name = new char[pfxlen + strlen("troff") + 1];
+ char *s = strcpy(troff_name, cmdprefix);
+ s += pfxlen;
+ strcpy(s, "troff");
+ int c, i;
+ static const struct option long_options[] = {
+ { "help", no_argument, 0, CHAR_MAX + 1 },
+ { "version", no_argument, 0, 'v' },
+ { 0 /* nullptr */, 0, 0, 0 }
+ };
+ while ((c = getopt_long(argc, argv,
+ "+a:bCdD:eF:g:Ghi:I:j:lno:prs:S:vVx:y", long_options,
+ 0 /* nullptr */))
+ != EOF)
+ switch(c) {
+ case 'a':
+ textAlphaBits = min(max(MIN_ALPHA_BITS, atoi(optarg)),
+ MAX_ALPHA_BITS);
+ if (textAlphaBits == 3)
+ fatal("cannot use 3 bits of antialiasing information");
+ break;
+ case 'b':
+ // handled by post-grohtml (set background color to white)
+ break;
+ case 'C':
+ // handled by post-grohtml (don't write Creator HTML comment)
+ break;
+ case 'd':
+#if defined(DEBUGGING)
+ debugging = true;
+#endif
+ break;
+ case 'D':
+ image_dir = optarg;
+ break;
+ case 'e':
+ need_eqn = true;
+ break;
+ case 'F':
+ font_path.command_line_dir(optarg);
+ break;
+ case 'g':
+ graphicAlphaBits = min(max(MIN_ALPHA_BITS, atoi(optarg)),
+ MAX_ALPHA_BITS);
+ if (graphicAlphaBits == 3)
+ fatal("cannot use 3 bits of antialiasing information");
+ break;
+ case 'G':
+ // handled by post-grohtml (don't write CreationDate HTML comment)
+ break;
+ case 'h':
+ // handled by post-grohtml (write headings with font size changes)
+ break;
+ case 'i':
+ image_res = atoi(optarg);
+ break;
+ case 'I':
+ image_template = optarg;
+ break;
+ case 'j':
+ // handled by post-grohtml (set job name for multiple file output)
+ break;
+ case 'l':
+ // handled by post-grohtml (no automatic section links)
+ break;
+ case 'n':
+ // handled by post-grohtml (generate simple heading anchors)
+ break;
+ case 'o':
+ vertical_offset = atoi(optarg);
+ break;
+ case 'p':
+ want_progress_report = true;
+ break;
+ case 'r':
+ // handled by post-grohtml (no header and footer lines)
+ break;
+ case 's':
+ // handled by post-grohtml (use font size n as the HTML base size)
+ break;
+ case 'S':
+ // handled by post-grohtml (set file split level)
+ break;
+ case 'v':
+ printf("GNU pre-grohtml (groff) version %s\n", Version_string);
+ exit(EXIT_SUCCESS);
+ case 'V':
+ // handled by post-grohtml (create validator button)
+ break;
+ case 'x':
+ // html dialect
+ if (strcmp(optarg, "x") == 0)
+ dialect = xhtml;
+ else if (strcmp(optarg, "4") == 0)
+ dialect = html4;
+ else
+ warning("unsupported HTML dialect: '%1'", optarg);
+ break;
+ case 'y':
+ // handled by post-grohtml (create groff signature)
+ break;
+ case CHAR_MAX + 1: // --help
+ usage(stdout);
+ break;
+ case '?':
+ usage(stderr);
+ exit(EXIT_FAILURE);
+ break;
+ default:
+ break;
+ }
+
+ i = optind;
+ while (i < argc) {
+ if (strcmp(argv[i], troff_name) == 0)
+ troff_arg = i;
+ else if (argv[i][0] != '-')
+ return i;
+ i++;
+ }
+ delete[] troff_name;
+
+ return argc;
+}
+
+/*
+ * makeTempFiles - Name the temporary files.
+ */
+
+static void makeTempFiles(void)
+{
+#if defined(DEBUGGING)
+ psFileName = DEBUG_FILE("prehtml-ps");
+ regionFileName = DEBUG_FILE("prehtml-region");
+ imagePageName = DEBUG_FILE("prehtml-page");
+ psPageName = DEBUG_FILE("prehtml-psn");
+ troffFileName = DEBUG_FILE("prehtml-troff");
+ htmlFileName = DEBUG_FILE("prehtml-html");
+#else /* not DEBUGGING */
+ FILE *f;
+
+ // psPageName contains a single page of PostScript.
+ f = xtmpfile(&psPageName, PS_TEMPLATE_LONG, PS_TEMPLATE_SHORT, true);
+ if (0 /* nullptr */ == f)
+ sys_fatal("xtmpfile");
+ fclose(f);
+
+ // imagePageName contains a bitmap image of a single PostScript page.
+ f = xtmpfile(&imagePageName, PAGE_TEMPLATE_LONG, PAGE_TEMPLATE_SHORT,
+ true);
+ if (0 /* nullptr */ == f)
+ sys_fatal("xtmpfile");
+ fclose(f);
+
+ // psFileName contains a PostScript file of the complete document.
+ f = xtmpfile(&psFileName, PS_TEMPLATE_LONG, PS_TEMPLATE_SHORT, true);
+ if (0 /* nullptr */ == f)
+ sys_fatal("xtmpfile");
+ fclose(f);
+
+ // regionFileName contains a list of the images and their boxed
+ // coordinates.
+ f = xtmpfile(&regionFileName,
+ REGION_TEMPLATE_LONG, REGION_TEMPLATE_SHORT, true);
+ if (0 /* nullptr */ == f)
+ sys_fatal("xtmpfile");
+ fclose(f);
+#endif /* not DEBUGGING */
+}
+
+static bool do_file(const char *filename)
+{
+ FILE *fp;
+
+ current_filename = filename;
+ if (strcmp(filename, "-") == 0)
+ fp = stdin;
+ else {
+ fp = fopen(filename, "r");
+ if (0 /* nullptr*/ == fp) {
+ error("unable to open '%1': %2", filename, strerror(errno));
+ return false;
+ }
+ }
+ inputFile.read_file(fp);
+ if (fp != stdin)
+ if (fclose(fp) != 0)
+ sys_fatal("fclose");
+ current_filename = 0 /* nullptr */;
+ return true;
+}
+
+static void cleanup(void)
+{
+ free(const_cast<char *>(image_gen));
+}
+
+int main(int argc, char **argv)
+{
+#ifdef CAPTURE_MODE
+ fprintf(stderr, "%s: invoked with %d arguments ...\n", argv[0], argc);
+ for (int i = 0; i < argc; i++)
+ fprintf(stderr, "%2d: %s\n", i, argv[i]);
+ FILE *dump = fopen(DEBUG_FILE("pre-html-data"), "wb");
+ if (dump != 0 /* nullptr */) {
+ while((int ch = fgetc(stdin)) >= 0)
+ fputc(ch, dump);
+ fclose(dump);
+ }
+ exit(EXIT_FAILURE);
+#endif /* CAPTURE_MODE */
+ program_name = argv[0];
+ if (atexit(&cleanup) != 0)
+ sys_fatal("atexit");
+ int operand_index = scanArguments(argc, argv);
+ image_gen = strsave(get_image_generator());
+ if (0 == image_gen)
+ fatal("'image_generator' directive not found in file '%1'",
+ devhtml_desc);
+ postscriptRes = get_resolution();
+ if (postscriptRes < 1) // TODO: what's a more sane minimum value?
+ fatal("'res' directive missing or invalid in file '%1'",
+ devps_desc);
+ setupAntiAlias();
+ checkImageDir();
+ makeFileName();
+ bool have_file_operand = false;
+ while (operand_index < argc) {
+ if (argv[operand_index][0] != '-') {
+ if(!do_file(argv[operand_index]))
+ exit(EXIT_FAILURE);
+ have_file_operand = true;
+ }
+ operand_index++;
+ }
+
+ if (!have_file_operand)
+ do_file("-");
+ makeTempFiles();
+ int wstatus = inputFile.do_image(argc, argv);
+ if (wstatus == 0) {
+ generateImages(regionFileName);
+ wstatus = inputFile.do_html(argc, argv);
+ }
+ else
+ if (WEXITSTATUS(wstatus) != 0)
+ // XXX: This is a crappy suggestion. See Savannah #62673.
+ fatal("'%1' exited with status %2; re-run with a different output"
+ " driver to see diagnostic messages", argv[0],
+ WEXITSTATUS(wstatus));
+ exit(EXIT_SUCCESS);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/html/pre-html.h b/src/preproc/html/pre-html.h
new file mode 100644
index 0000000..f257854
--- /dev/null
+++ b/src/preproc/html/pre-html.h
@@ -0,0 +1,38 @@
+// -*- C++ -*-
+/* Copyright (C) 2000-2020 Free Software Foundation, Inc.
+ * Written by Gaius Mulley (gaius@glam.ac.uk).
+ *
+ * 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 3 of the License, 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.
+ */
+
+/*
+ * defines functions implemented within pre-html.cpp
+ */
+
+#if !defined(PREHTMLH)
+# define PREHTMLH
+# if defined(PREHTMLC)
+# define EXTERN
+# else
+# define EXTERN extern
+# endif
+
+
+extern void sys_fatal (const char *s);
+
+#undef EXTERN
+#endif
diff --git a/src/preproc/html/pushback.cpp b/src/preproc/html/pushback.cpp
new file mode 100644
index 0000000..100ac0b
--- /dev/null
+++ b/src/preproc/html/pushback.cpp
@@ -0,0 +1,336 @@
+/* Copyright (C) 2000-2020 Free Software Foundation, Inc.
+ Written by Gaius Mulley (gaius@glam.ac.uk).
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <signal.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <errno.h>
+#include "errarg.h"
+#include "error.h"
+#include "stringclass.h"
+#include "posix.h"
+#include "nonposix.h"
+
+#include <errno.h>
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "pushback.h"
+#include "pre-html.h"
+
+#if !defined(TRUE)
+# define TRUE (1==1)
+#endif
+
+#if !defined(FALSE)
+# define FALSE (1==0)
+#endif
+
+# define ERROR(X) (void)(fprintf(stderr, "%s:%d error %s\n", __FILE__, __LINE__, X) && \
+ (fflush(stderr)) && localexit(1))
+
+
+#define MAXPUSHBACKSTACK 4096 /* maximum number of character that can be pushed back */
+
+
+/*
+ * constructor for pushBackBuffer
+ */
+
+pushBackBuffer::pushBackBuffer (char *filename)
+{
+ charStack = (char *)malloc(MAXPUSHBACKSTACK);
+ if (charStack == 0) {
+ sys_fatal("malloc");
+ }
+ stackPtr = 0; /* index to push back stack */
+ verbose = 0;
+ eofFound = FALSE;
+ lineNo = 1;
+ if (strcmp(filename, "") != 0) {
+ stdIn = dup(0);
+ if (stdIn < 0) {
+ sys_fatal("dup stdin");
+ }
+ close(0);
+ if (open(filename, O_RDONLY) != 0) {
+ sys_fatal("when trying to open file");
+ } else {
+ fileName = filename;
+ }
+ }
+}
+
+pushBackBuffer::~pushBackBuffer ()
+{
+ if (charStack != 0) {
+ free(charStack);
+ }
+ close(0);
+ /* restore stdin in file descriptor 0 */
+ if (dup(stdIn) < 0) {
+ sys_fatal("restore stdin");
+ }
+ close(stdIn);
+}
+
+/*
+ * localexit - wraps exit with a return code to aid the ERROR macro.
+ */
+
+int localexit (int i)
+{
+ exit(i);
+ return( 1 );
+}
+
+/*
+ * getPB - returns a character, possibly a pushed back character.
+ */
+
+char pushBackBuffer::getPB (void)
+{
+ if (stackPtr>0) {
+ stackPtr--;
+ return( charStack[stackPtr] );
+ } else {
+ char ch;
+
+ if (read(0, &ch, 1) == 1) {
+ if (verbose) {
+ printf("%c", ch);
+ }
+ if (ch == '\n') {
+ lineNo++;
+ }
+ return( ch );
+ } else {
+ eofFound = TRUE;
+ return( eof );
+ }
+ }
+}
+
+/*
+ * putPB - pushes a character onto the push back stack.
+ * The same character is returned.
+ */
+
+char pushBackBuffer::putPB (char ch)
+{
+ if (stackPtr<MAXPUSHBACKSTACK) {
+ charStack[stackPtr] = ch ;
+ stackPtr++;
+ } else {
+ ERROR("max push back stack exceeded, increase MAXPUSHBACKSTACK constant");
+ }
+ return( ch );
+}
+
+/*
+ * isWhite - returns TRUE if a white character is found. This character is NOT consumed.
+ */
+
+static int isWhite (char ch)
+{
+ return( (ch==' ') || (ch == '\t') || (ch == '\n') );
+}
+
+/*
+ * skipToNewline - skips characters until a newline is seen.
+ */
+
+void pushBackBuffer::skipToNewline (void)
+{
+ while ((putPB(getPB()) != '\n') && (! eofFound)) {
+ getPB();
+ }
+}
+
+/*
+ * skipUntilToken - skips until a token is seen
+ */
+
+void pushBackBuffer::skipUntilToken (void)
+{
+ char ch;
+
+ while ((isWhite(putPB(getPB())) || (putPB(getPB()) == '#')) && (! eofFound)) {
+ ch = getPB();
+ if (ch == '#') {
+ skipToNewline();
+ }
+ }
+}
+
+/*
+ * isString - returns TRUE if the string, s, matches the pushed back string.
+ * if TRUE is returned then this string is consumed, otherwise it is
+ * left alone.
+ */
+
+int pushBackBuffer::isString (const char *s)
+{
+ int length=strlen(s);
+ int i=0;
+
+ while ((i<length) && (putPB(getPB())==s[i])) {
+ if (getPB() != s[i]) {
+ ERROR("assert failed");
+ }
+ i++;
+ }
+ if (i==length) {
+ return( TRUE );
+ } else {
+ i--;
+ while (i>=0) {
+ if (putPB(s[i]) != s[i]) {
+ ERROR("assert failed");
+ }
+ i--;
+ }
+ }
+ return( FALSE );
+}
+
+/*
+ * isDigit - returns TRUE if the character, ch, is a digit.
+ */
+
+static int isDigit (char ch)
+{
+ return( ((ch>='0') && (ch<='9')) );
+}
+
+/*
+ * isHexDigit - returns TRUE if the character, ch, is a hex digit.
+ */
+
+#if 0
+static int isHexDigit (char ch)
+{
+ return( (isDigit(ch)) || ((ch>='a') && (ch<='f')) );
+}
+#endif
+
+/*
+ * readInt - returns an integer from the input stream.
+ */
+
+int pushBackBuffer::readInt (void)
+{
+ int c =0;
+ int i =0;
+ int s =1;
+ char ch=getPB();
+
+ while (isWhite(ch)) {
+ ch=getPB();
+ }
+ // now read integer
+
+ if (ch == '-') {
+ s = -1;
+ ch = getPB();
+ }
+ while (isDigit(ch)) {
+ i *= 10;
+ if ((ch>='0') && (ch<='9')) {
+ i += (int)(ch-'0');
+ }
+ ch = getPB();
+ c++;
+ }
+ if (ch != putPB(ch)) {
+ ERROR("assert failed");
+ }
+ return( i*s );
+}
+
+/*
+ * convertToFloat - converts integers, a and b into a.b
+ */
+
+static double convertToFloat (int a, int b)
+{
+ int c=10;
+ double f;
+
+ while (b>c) {
+ c *= 10;
+ }
+ f = ((double)a) + (((double)b)/((double)c));
+ return( f );
+}
+
+/*
+ * readNumber - returns a float representing the word just read.
+ */
+
+double pushBackBuffer::readNumber (void)
+{
+ int i;
+ char ch;
+
+ i = readInt();
+ if ((ch = getPB()) == '.') {
+ return convertToFloat(i, readInt());
+ }
+ putPB(ch);
+ return (double)i;
+}
+
+/*
+ * readString - reads a string terminated by white space
+ * and returns a malloced area of memory containing
+ * a copy of the characters.
+ */
+
+char *pushBackBuffer::readString (void)
+{
+ char buffer[MAXPUSHBACKSTACK];
+ char *str = 0;
+ int i=0;
+ char ch=getPB();
+
+ while (isWhite(ch)) {
+ ch=getPB();
+ }
+ while ((i < MAXPUSHBACKSTACK) && (! isWhite(ch)) && (! eofFound)) {
+ buffer[i] = ch;
+ i++;
+ ch = getPB();
+ }
+ if (i < MAXPUSHBACKSTACK) {
+ buffer[i] = (char)0;
+ str = (char *)malloc(strlen(buffer)+1);
+ strcpy(str, buffer);
+ }
+ return( str );
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/html/pushback.h b/src/preproc/html/pushback.h
new file mode 100644
index 0000000..263a6c5
--- /dev/null
+++ b/src/preproc/html/pushback.h
@@ -0,0 +1,52 @@
+// -*- C -*-
+/* Copyright (C) 2000-2020 Free Software Foundation, Inc.
+ Written by Gaius Mulley (gaius@glam.ac.uk).
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#define eof (char)-1
+
+
+/*
+ * defines the class and methods implemented within pushback.cpp
+ */
+
+class pushBackBuffer
+{
+ private:
+ char *charStack;
+ int stackPtr; /* index to push back stack */
+ int verbose;
+ int eofFound;
+ char *fileName;
+ int lineNo;
+ int stdIn;
+
+ public:
+ pushBackBuffer (char *);
+ ~ pushBackBuffer ();
+ char getPB (void);
+ char putPB (char ch);
+ void skipUntilToken (void);
+ void skipToNewline (void);
+ double readNumber (void);
+ int readInt (void);
+ char *readString (void);
+ int isString (const char *string);
+};
+
+
diff --git a/src/preproc/pic/TODO b/src/preproc/pic/TODO
new file mode 100644
index 0000000..53ca282
--- /dev/null
+++ b/src/preproc/pic/TODO
@@ -0,0 +1,35 @@
+In troff mode, dotted and dashed splines.
+
+Make DELIMITED have type lstr; this would allow us to give better
+error messages for problems within the body of for and if constructs.
+
+In troff mode without -x, fake \D't' with .ps commands.
+
+Perhaps an option to set command char.
+
+Add an output class for dumb line printers. It wouldn't be pretty but
+it would be better than nothing. Integrate it with texinfo. Useful
+for groff -Tascii as well.
+
+Option to allow better positioning of arrowheads on arcs.
+
+Perhaps add PostScript output mode.
+
+Change the interface to the output class so that output devices have
+the opportunity to handle arrowheads themselves.
+
+Consider whether the line thickness should scale.
+
+Consider whether the test in a for loop should be fuzzy (as it
+apparently is in grap).
+
+Possibly change fillval so that zero is black.
+
+Provide a way of getting text blocks (positioned with '.in' rather
+than \h), into pic. Should be possible to use block of diverted text
+in pic. Possibly something similar to T{ and T} in tbl.
+
+Option to provide macro backtraces.
+
+Have a path that is searched by 'copy' statement. Set by environment
+variable or command-line option.
diff --git a/src/preproc/pic/common.cpp b/src/preproc/pic/common.cpp
new file mode 100644
index 0000000..6a4a93e
--- /dev/null
+++ b/src/preproc/pic/common.cpp
@@ -0,0 +1,647 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "pic.h"
+#include "common.h"
+
+// output a dashed circle as a series of arcs
+
+void common_output::dashed_circle(const position &cent, double rad,
+ const line_type &lt)
+{
+ assert(lt.type == line_type::dashed);
+ line_type slt = lt;
+ slt.type = line_type::solid;
+ double dash_angle = lt.dash_width/rad;
+ int ndashes;
+ double gap_angle;
+ if (dash_angle >= M_PI/4.0) {
+ if (dash_angle < M_PI/2.0) {
+ gap_angle = M_PI/2.0 - dash_angle;
+ ndashes = 4;
+ }
+ else if (dash_angle < M_PI) {
+ gap_angle = M_PI - dash_angle;
+ ndashes = 2;
+ }
+ else {
+ circle(cent, rad, slt, -1.0);
+ return;
+ }
+ }
+ else {
+ ndashes = 4*int(ceil(M_PI/(4.0*dash_angle)));
+ gap_angle = (M_PI*2.0)/ndashes - dash_angle;
+ }
+ for (int i = 0; i < ndashes; i++) {
+ double start_angle = i*(dash_angle+gap_angle) - dash_angle/2.0;
+ solid_arc(cent, rad, start_angle, start_angle + dash_angle, lt);
+ }
+}
+
+// output a dotted circle as a series of dots
+
+void common_output::dotted_circle(const position &cent, double rad,
+ const line_type &lt)
+{
+ assert(lt.type == line_type::dotted);
+ double gap_angle = lt.dash_width/rad;
+ int ndots;
+ if (gap_angle >= M_PI/2.0) {
+ // always have at least 2 dots
+ gap_angle = M_PI;
+ ndots = 2;
+ }
+ else {
+ ndots = 4*int(M_PI/(2.0*gap_angle));
+ gap_angle = (M_PI*2.0)/ndots;
+ }
+ double ang = 0.0;
+ for (int i = 0; i < ndots; i++, ang += gap_angle)
+ dot(cent + position(cos(ang), sin(ang))*rad, lt);
+}
+
+// recursive function for dash drawing, used by dashed_ellipse
+
+void common_output::ellipse_arc(const position &cent,
+ const position &z0, const position &z1,
+ const distance &dim, const line_type &lt)
+{
+ assert(lt.type == line_type::solid);
+ assert(dim.x != 0 && dim.y != 0);
+ double eps = 0.0001;
+ position zml = (z0 + z1) / 2;
+ // apply affine transformation (from ellipse to circle) to compute angle
+ // of new position, then invert transformation to get exact position
+ double psi = atan2(zml.y / dim.y, zml.x / dim.x);
+ position zm = position(dim.x * cos(psi), dim.y * sin(psi));
+ // to approximate the ellipse arc with one or more circle arcs, we
+ // first compute the radius of curvature in zm
+ double a_2 = dim.x * dim.x;
+ double a_4 = a_2 * a_2;
+ double b_2 = dim.y * dim.y;
+ double b_4 = b_2 * b_2;
+ double e_2 = a_2 - b_2;
+ double temp = a_4 * zm.y * zm.y + b_4 * zm.x * zm.x;
+ double rho = sqrt(temp / a_4 / b_4 * temp / a_4 / b_4 * temp);
+ // compute center of curvature circle
+ position M = position(e_2 * zm.x / a_2 * zm.x / a_2 * zm.x,
+ -e_2 * zm.y / b_2 * zm.y / b_2 * zm.y);
+ // compute distance between circle and ellipse arc at start and end
+ double phi0 = atan2(z0.y - M.y, z0.x - M.x);
+ double phi1 = atan2(z1.y - M.y, z1.x - M.x);
+ position M0 = position(rho * cos(phi0), rho * sin(phi0)) + M;
+ position M1 = position(rho * cos(phi1), rho * sin(phi1)) + M;
+ double dist0 = hypot(z0 - M0) / sqrt(z0 * z0);
+ double dist1 = hypot(z1 - M1) / sqrt(z1 * z1);
+ if (dist0 < eps && dist1 < eps)
+ solid_arc(M + cent, rho, phi0, phi1, lt);
+ else {
+ ellipse_arc(cent, z0, zm, dim, lt);
+ ellipse_arc(cent, zm, z1, dim, lt);
+ }
+}
+
+// output a dashed ellipse as a series of arcs
+
+void common_output::dashed_ellipse(const position &cent, const distance &dim,
+ const line_type &lt)
+{
+ assert(lt.type == line_type::dashed);
+ double dim_x = dim.x / 2;
+ double dim_y = dim.y / 2;
+ line_type slt = lt;
+ slt.type = line_type::solid;
+ double dw = lt.dash_width;
+ // we use an approximation to compute the ellipse length (found in:
+ // Bronstein, Semendjajew, Taschenbuch der Mathematik)
+ double lambda = (dim.x - dim.y) / (dim.x + dim.y);
+ double le = M_PI / 2 * (dim.x + dim.y)
+ * ((64 - 3 * lambda * lambda * lambda * lambda )
+ / (64 - 16 * lambda * lambda));
+ // for symmetry we make nmax a multiple of 8
+ int nmax = 8 * int(le / dw / 8 + 0.5);
+ if (nmax < 8) {
+ nmax = 8;
+ dw = le / 8;
+ }
+ int ndash = nmax / 2;
+ double gapwidth = (le - dw * ndash) / ndash;
+ double l = 0;
+ position z = position(dim_x, 0);
+ position zdot = z;
+ int j = 0;
+ int jmax = int(10 / lt.dash_width);
+ for (int i = 0; i <= nmax; i++) {
+ position zold = z;
+ position zpre = zdot;
+ double ld = (int(i / 2) + 0.5) * dw + int((i + 1) / 2) * gapwidth;
+ double lold = 0;
+ double dl = 1;
+ // find next position for fixed arc length
+ while (l < ld) {
+ j++;
+ lold = l;
+ zold = z;
+ double phi = j * 2 * M_PI / jmax;
+ z = position(dim_x * cos(phi), dim_y * sin(phi));
+ dl = hypot(z - zold);
+ l += dl;
+ }
+ // interpolate linearly between the last two points,
+ // using the length difference as the scaling factor
+ double delta = (ld - lold) / dl;
+ zdot = zold + (z - zold) * delta;
+ // compute angle of new position on the affine circle
+ // and use it to get the exact value on the ellipse
+ double psi = atan2(zdot.y / dim_y, zdot.x / dim_x);
+ zdot = position(dim_x * cos(psi), dim_y * sin(psi));
+ if ((i % 2 == 0) && (i > 1))
+ ellipse_arc(cent, zpre, zdot, dim / 2, slt);
+ }
+}
+
+// output a dotted ellipse as a series of dots
+
+void common_output::dotted_ellipse(const position &cent, const distance &dim,
+ const line_type &lt)
+{
+ assert(lt.type == line_type::dotted);
+ double dim_x = dim.x / 2;
+ double dim_y = dim.y / 2;
+ line_type slt = lt;
+ slt.type = line_type::solid;
+ // we use an approximation to compute the ellipse length (found in:
+ // Bronstein, Semendjajew, Taschenbuch der Mathematik)
+ double lambda = (dim.x - dim.y) / (dim.x + dim.y);
+ double le = M_PI / 2 * (dim.x + dim.y)
+ * ((64 - 3 * lambda * lambda * lambda * lambda )
+ / (64 - 16 * lambda * lambda));
+ // for symmetry we make nmax a multiple of 4
+ int ndots = 4 * int(le / lt.dash_width / 4 + 0.5);
+ if (ndots < 4)
+ ndots = 4;
+ double l = 0;
+ position z = position(dim_x, 0);
+ int j = 0;
+ int jmax = int(10 / lt.dash_width);
+ for (int i = 1; i <= ndots; i++) {
+ position zold = z;
+ double lold = l;
+ double ld = i * le / ndots;
+ double dl = 1;
+ // find next position for fixed arc length
+ while (l < ld) {
+ j++;
+ lold = l;
+ zold = z;
+ double phi = j * 2 * M_PI / jmax;
+ z = position(dim_x * cos(phi), dim_y * sin(phi));
+ dl = hypot(z - zold);
+ l += dl;
+ }
+ // interpolate linearly between the last two points,
+ // using the length difference as the scaling factor
+ double delta = (ld - lold) / dl;
+ position zdot = zold + (z - zold) * delta;
+ // compute angle of new position on the affine circle
+ // and use it to get the exact value on the ellipse
+ double psi = atan2(zdot.y / dim_y, zdot.x / dim_x);
+ zdot = position(dim_x * cos(psi), dim_y * sin(psi));
+ dot(cent + zdot, slt);
+ }
+}
+
+// return non-zero iff we can compute a center
+
+int compute_arc_center(const position &start, const position &cent,
+ const position &end, position *result)
+{
+ // This finds the point along the vector from start to cent that
+ // is equidistant between start and end.
+ distance c = cent - start;
+ distance e = end - start;
+ double n = c*e;
+ if (n == 0.0)
+ return 0;
+ *result = start + c*((e*e)/(2.0*n));
+ return 1;
+}
+
+// output a dashed arc as a series of arcs
+
+void common_output::dashed_arc(const position &start, const position &cent,
+ const position &end, const line_type &lt)
+{
+ assert(lt.type == line_type::dashed);
+ position c;
+ if (!compute_arc_center(start, cent, end, &c)) {
+ line(start, &end, 1, lt);
+ return;
+ }
+ distance start_offset = start - c;
+ distance end_offset = end - c;
+ double start_angle = atan2(start_offset.y, start_offset.x);
+ double end_angle = atan2(end_offset.y, end_offset.x);
+ double rad = hypot(c - start);
+ double dash_angle = lt.dash_width/rad;
+ double total_angle = end_angle - start_angle;
+ while (total_angle < 0)
+ total_angle += M_PI + M_PI;
+ if (total_angle <= dash_angle*2.0) {
+ solid_arc(cent, rad, start_angle, end_angle, lt);
+ return;
+ }
+ int ndashes = int((total_angle - dash_angle)/(dash_angle*2.0) + .5);
+ double dash_and_gap_angle = (total_angle - dash_angle)/ndashes;
+ for (int i = 0; i <= ndashes; i++)
+ solid_arc(cent, rad, start_angle + i*dash_and_gap_angle,
+ start_angle + i*dash_and_gap_angle + dash_angle, lt);
+}
+
+// output a dotted arc as a series of dots
+
+void common_output::dotted_arc(const position &start, const position &cent,
+ const position &end, const line_type &lt)
+{
+ assert(lt.type == line_type::dotted);
+ position c;
+ if (!compute_arc_center(start, cent, end, &c)) {
+ line(start, &end, 1, lt);
+ return;
+ }
+ distance start_offset = start - c;
+ distance end_offset = end - c;
+ double start_angle = atan2(start_offset.y, start_offset.x);
+ double total_angle = atan2(end_offset.y, end_offset.x) - start_angle;
+ while (total_angle < 0)
+ total_angle += M_PI + M_PI;
+ double rad = hypot(c - start);
+ int ndots = int(total_angle/(lt.dash_width/rad) + .5);
+ if (ndots == 0)
+ dot(start, lt);
+ else {
+ for (int i = 0; i <= ndots; i++) {
+ double a = start_angle + (total_angle*i)/ndots;
+ dot(cent + position(cos(a), sin(a))*rad, lt);
+ }
+ }
+}
+
+void common_output::solid_arc(const position &cent, double rad,
+ double start_angle, double end_angle,
+ const line_type &lt)
+{
+ line_type slt = lt;
+ slt.type = line_type::solid;
+ arc(cent + position(cos(start_angle), sin(start_angle))*rad,
+ cent,
+ cent + position(cos(end_angle), sin(end_angle))*rad,
+ slt);
+}
+
+
+void common_output::rounded_box(const position &cent, const distance &dim,
+ double rad, const line_type &lt,
+ double fill, char *color_fill)
+{
+ if (fill >= 0.0 || color_fill)
+ filled_rounded_box(cent, dim, rad, fill);
+ switch (lt.type) {
+ case line_type::invisible:
+ break;
+ case line_type::dashed:
+ dashed_rounded_box(cent, dim, rad, lt);
+ break;
+ case line_type::dotted:
+ dotted_rounded_box(cent, dim, rad, lt);
+ break;
+ case line_type::solid:
+ solid_rounded_box(cent, dim, rad, lt);
+ break;
+ default:
+ assert(0);
+ }
+}
+
+
+void common_output::dashed_rounded_box(const position &cent,
+ const distance &dim, double rad,
+ const line_type &lt)
+{
+ line_type slt = lt;
+ slt.type = line_type::solid;
+
+ double hor_length = dim.x + (M_PI/2.0 - 2.0)*rad;
+ int n_hor_dashes = int(hor_length/(lt.dash_width*2.0) + .5);
+ double hor_gap_width = (n_hor_dashes != 0
+ ? hor_length/n_hor_dashes - lt.dash_width
+ : 0.0);
+
+ double vert_length = dim.y + (M_PI/2.0 - 2.0)*rad;
+ int n_vert_dashes = int(vert_length/(lt.dash_width*2.0) + .5);
+ double vert_gap_width = (n_vert_dashes != 0
+ ? vert_length/n_vert_dashes - lt.dash_width
+ : 0.0);
+ // Note that each corner arc has to be split into two for dashing,
+ // because one part is dashed using vert_gap_width, and the other
+ // using hor_gap_width.
+ double offset = lt.dash_width/2.0;
+ dash_arc(cent + position(dim.x/2.0 - rad, -dim.y/2.0 + rad), rad,
+ -M_PI/4.0, 0, slt, lt.dash_width, vert_gap_width, &offset);
+ dash_line(cent + position(dim.x/2.0, -dim.y/2.0 + rad),
+ cent + position(dim.x/2.0, dim.y/2.0 - rad),
+ slt, lt.dash_width, vert_gap_width, &offset);
+ dash_arc(cent + position(dim.x/2.0 - rad, dim.y/2.0 - rad), rad,
+ 0, M_PI/4.0, slt, lt.dash_width, vert_gap_width, &offset);
+
+ offset = lt.dash_width/2.0;
+ dash_arc(cent + position(dim.x/2.0 - rad, dim.y/2.0 - rad), rad,
+ M_PI/4.0, M_PI/2, slt, lt.dash_width, hor_gap_width, &offset);
+ dash_line(cent + position(dim.x/2.0 - rad, dim.y/2.0),
+ cent + position(-dim.x/2.0 + rad, dim.y/2.0),
+ slt, lt.dash_width, hor_gap_width, &offset);
+ dash_arc(cent + position(-dim.x/2.0 + rad, dim.y/2.0 - rad), rad,
+ M_PI/2, 3*M_PI/4.0, slt, lt.dash_width, hor_gap_width, &offset);
+
+ offset = lt.dash_width/2.0;
+ dash_arc(cent + position(-dim.x/2.0 + rad, dim.y/2.0 - rad), rad,
+ 3.0*M_PI/4.0, M_PI, slt, lt.dash_width, vert_gap_width, &offset);
+ dash_line(cent + position(-dim.x/2.0, dim.y/2.0 - rad),
+ cent + position(-dim.x/2.0, -dim.y/2.0 + rad),
+ slt, lt.dash_width, vert_gap_width, &offset);
+ dash_arc(cent + position(-dim.x/2.0 + rad, -dim.y/2.0 + rad), rad,
+ M_PI, 5.0*M_PI/4.0, slt, lt.dash_width, vert_gap_width, &offset);
+
+ offset = lt.dash_width/2.0;
+ dash_arc(cent + position(-dim.x/2.0 + rad, -dim.y/2.0 + rad), rad,
+ 5*M_PI/4.0, 3*M_PI/2.0, slt, lt.dash_width, hor_gap_width, &offset);
+ dash_line(cent + position(-dim.x/2.0 + rad, -dim.y/2.0),
+ cent + position(dim.x/2.0 - rad, -dim.y/2.0),
+ slt, lt.dash_width, hor_gap_width, &offset);
+ dash_arc(cent + position(dim.x/2.0 - rad, -dim.y/2.0 + rad), rad,
+ 3*M_PI/2, 7*M_PI/4, slt, lt.dash_width, hor_gap_width, &offset);
+}
+
+// Used by dashed_rounded_box.
+
+void common_output::dash_arc(const position &cent, double rad,
+ double start_angle, double end_angle,
+ const line_type &lt,
+ double dash_width, double gap_width,
+ double *offsetp)
+{
+ double length = (end_angle - start_angle)*rad;
+ double pos = 0.0;
+ for (;;) {
+ if (*offsetp >= dash_width) {
+ double rem = dash_width + gap_width - *offsetp;
+ if (pos + rem > length) {
+ *offsetp += length - pos;
+ break;
+ }
+ else {
+ pos += rem;
+ *offsetp = 0.0;
+ }
+ }
+ else {
+ double rem = dash_width - *offsetp;
+ if (pos + rem > length) {
+ solid_arc(cent, rad, start_angle + pos/rad, end_angle, lt);
+ *offsetp += length - pos;
+ break;
+ }
+ else {
+ solid_arc(cent, rad, start_angle + pos/rad,
+ start_angle + (pos + rem)/rad, lt);
+ pos += rem;
+ *offsetp = dash_width;
+ }
+ }
+ }
+}
+
+// Used by dashed_rounded_box.
+
+void common_output::dash_line(const position &start, const position &end,
+ const line_type &lt,
+ double dash_width, double gap_width,
+ double *offsetp)
+{
+ distance dist = end - start;
+ double length = hypot(dist);
+ if (length == 0.0)
+ return;
+ double pos = 0.0;
+ for (;;) {
+ if (*offsetp >= dash_width) {
+ double rem = dash_width + gap_width - *offsetp;
+ if (pos + rem > length) {
+ *offsetp += length - pos;
+ break;
+ }
+ else {
+ pos += rem;
+ *offsetp = 0.0;
+ }
+ }
+ else {
+ double rem = dash_width - *offsetp;
+ if (pos + rem > length) {
+ line(start + dist*(pos/length), &end, 1, lt);
+ *offsetp += length - pos;
+ break;
+ }
+ else {
+ position p(start + dist*((pos + rem)/length));
+ line(start + dist*(pos/length), &p, 1, lt);
+ pos += rem;
+ *offsetp = dash_width;
+ }
+ }
+ }
+}
+
+void common_output::dotted_rounded_box(const position &cent,
+ const distance &dim, double rad,
+ const line_type &lt)
+{
+ line_type slt = lt;
+ slt.type = line_type::solid;
+
+ double hor_length = dim.x + (M_PI/2.0 - 2.0)*rad;
+ int n_hor_dots = int(hor_length/lt.dash_width + .5);
+ double hor_gap_width = (n_hor_dots != 0
+ ? hor_length/n_hor_dots
+ : lt.dash_width);
+
+ double vert_length = dim.y + (M_PI/2.0 - 2.0)*rad;
+ int n_vert_dots = int(vert_length/lt.dash_width + .5);
+ double vert_gap_width = (n_vert_dots != 0
+ ? vert_length/n_vert_dots
+ : lt.dash_width);
+ double epsilon = lt.dash_width/(rad*100.0);
+
+ double offset = 0.0;
+ dot_arc(cent + position(dim.x/2.0 - rad, -dim.y/2.0 + rad), rad,
+ -M_PI/4.0, 0, slt, vert_gap_width, &offset);
+ dot_line(cent + position(dim.x/2.0, -dim.y/2.0 + rad),
+ cent + position(dim.x/2.0, dim.y/2.0 - rad),
+ slt, vert_gap_width, &offset);
+ dot_arc(cent + position(dim.x/2.0 - rad, dim.y/2.0 - rad), rad,
+ 0, M_PI/4.0 - epsilon, slt, vert_gap_width, &offset);
+
+ offset = 0.0;
+ dot_arc(cent + position(dim.x/2.0 - rad, dim.y/2.0 - rad), rad,
+ M_PI/4.0, M_PI/2, slt, hor_gap_width, &offset);
+ dot_line(cent + position(dim.x/2.0 - rad, dim.y/2.0),
+ cent + position(-dim.x/2.0 + rad, dim.y/2.0),
+ slt, hor_gap_width, &offset);
+ dot_arc(cent + position(-dim.x/2.0 + rad, dim.y/2.0 - rad), rad,
+ M_PI/2, 3*M_PI/4.0 - epsilon, slt, hor_gap_width, &offset);
+
+ offset = 0.0;
+ dot_arc(cent + position(-dim.x/2.0 + rad, dim.y/2.0 - rad), rad,
+ 3.0*M_PI/4.0, M_PI, slt, vert_gap_width, &offset);
+ dot_line(cent + position(-dim.x/2.0, dim.y/2.0 - rad),
+ cent + position(-dim.x/2.0, -dim.y/2.0 + rad),
+ slt, vert_gap_width, &offset);
+ dot_arc(cent + position(-dim.x/2.0 + rad, -dim.y/2.0 + rad), rad,
+ M_PI, 5.0*M_PI/4.0 - epsilon, slt, vert_gap_width, &offset);
+
+ offset = 0.0;
+ dot_arc(cent + position(-dim.x/2.0 + rad, -dim.y/2.0 + rad), rad,
+ 5*M_PI/4.0, 3*M_PI/2.0, slt, hor_gap_width, &offset);
+ dot_line(cent + position(-dim.x/2.0 + rad, -dim.y/2.0),
+ cent + position(dim.x/2.0 - rad, -dim.y/2.0),
+ slt, hor_gap_width, &offset);
+ dot_arc(cent + position(dim.x/2.0 - rad, -dim.y/2.0 + rad), rad,
+ 3*M_PI/2, 7*M_PI/4 - epsilon, slt, hor_gap_width, &offset);
+}
+
+// Used by dotted_rounded_box.
+
+void common_output::dot_arc(const position &cent, double rad,
+ double start_angle, double end_angle,
+ const line_type &lt, double gap_width,
+ double *offsetp)
+{
+ double length = (end_angle - start_angle)*rad;
+ double pos = 0.0;
+ for (;;) {
+ if (*offsetp == 0.0) {
+ double ang = start_angle + pos/rad;
+ dot(cent + position(cos(ang), sin(ang))*rad, lt);
+ }
+ double rem = gap_width - *offsetp;
+ if (pos + rem > length) {
+ *offsetp += length - pos;
+ break;
+ }
+ else {
+ pos += rem;
+ *offsetp = 0.0;
+ }
+ }
+}
+
+// Used by dotted_rounded_box.
+
+void common_output::dot_line(const position &start, const position &end,
+ const line_type &lt, double gap_width,
+ double *offsetp)
+{
+ distance dist = end - start;
+ double length = hypot(dist);
+ if (length == 0.0)
+ return;
+ double pos = 0.0;
+ for (;;) {
+ if (*offsetp == 0.0)
+ dot(start + dist*(pos/length), lt);
+ double rem = gap_width - *offsetp;
+ if (pos + rem > length) {
+ *offsetp += length - pos;
+ break;
+ }
+ else {
+ pos += rem;
+ *offsetp = 0.0;
+ }
+ }
+}
+
+void common_output::solid_rounded_box(const position &cent,
+ const distance &dim, double rad,
+ const line_type &lt)
+{
+ position tem = cent - dim/2.0;
+ arc(tem + position(0.0, rad),
+ tem + position(rad, rad),
+ tem + position(rad, 0.0),
+ lt);
+ tem = cent + position(-dim.x/2.0, dim.y/2.0);
+ arc(tem + position(rad, 0.0),
+ tem + position(rad, -rad),
+ tem + position(0.0, -rad),
+ lt);
+ tem = cent + dim/2.0;
+ arc(tem + position(0.0, -rad),
+ tem + position(-rad, -rad),
+ tem + position(-rad, 0.0),
+ lt);
+ tem = cent + position(dim.x/2.0, -dim.y/2.0);
+ arc(tem + position(-rad, 0.0),
+ tem + position(-rad, rad),
+ tem + position(0.0, rad),
+ lt);
+ position end;
+ end = cent + position(-dim.x/2.0, dim.y/2.0 - rad);
+ line(cent - dim/2.0 + position(0.0, rad), &end, 1, lt);
+ end = cent + position(dim.x/2.0 - rad, dim.y/2.0);
+ line(cent + position(-dim.x/2.0 + rad, dim.y/2.0), &end, 1, lt);
+ end = cent + position(dim.x/2.0, -dim.y/2.0 + rad);
+ line(cent + position(dim.x/2.0, dim.y/2.0 - rad), &end, 1, lt);
+ end = cent + position(-dim.x/2.0 + rad, -dim.y/2.0);
+ line(cent + position(dim.x/2.0 - rad, -dim.y/2.0), &end, 1, lt);
+}
+
+void common_output::filled_rounded_box(const position &cent,
+ const distance &dim, double rad,
+ double fill)
+{
+ line_type ilt;
+ ilt.type = line_type::invisible;
+ circle(cent + position(dim.x/2.0 - rad, dim.y/2.0 - rad), rad, ilt, fill);
+ circle(cent + position(-dim.x/2.0 + rad, dim.y/2.0 - rad), rad, ilt, fill);
+ circle(cent + position(-dim.x/2.0 + rad, -dim.y/2.0 + rad), rad, ilt, fill);
+ circle(cent + position(dim.x/2.0 - rad, -dim.y/2.0 + rad), rad, ilt, fill);
+ position vec[4];
+ vec[0] = cent + position(dim.x/2.0, dim.y/2.0 - rad);
+ vec[1] = cent + position(-dim.x/2.0, dim.y/2.0 - rad);
+ vec[2] = cent + position(-dim.x/2.0, -dim.y/2.0 + rad);
+ vec[3] = cent + position(dim.x/2.0, -dim.y/2.0 + rad);
+ polygon(vec, 4, ilt, fill);
+ vec[0] = cent + position(dim.x/2.0 - rad, dim.y/2.0);
+ vec[1] = cent + position(-dim.x/2.0 + rad, dim.y/2.0);
+ vec[2] = cent + position(-dim.x/2.0 + rad, -dim.y/2.0);
+ vec[3] = cent + position(dim.x/2.0 - rad, -dim.y/2.0);
+ polygon(vec, 4, ilt, fill);
+}
diff --git a/src/preproc/pic/common.h b/src/preproc/pic/common.h
new file mode 100644
index 0000000..a2d5f70
--- /dev/null
+++ b/src/preproc/pic/common.h
@@ -0,0 +1,79 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+class common_output : public output {
+private:
+ void dash_line(const position &start, const position &end,
+ const line_type &lt, double dash_width, double gap_width,
+ double *offsetp);
+ void dash_arc(const position &cent, double rad,
+ double start_angle, double end_angle, const line_type &lt,
+ double dash_width, double gap_width, double *offsetp);
+ void dot_line(const position &start, const position &end,
+ const line_type &lt, double gap_width, double *offsetp);
+ void dot_arc(const position &cent, double rad,
+ double start_angle, double end_angle, const line_type &lt,
+ double gap_width, double *offsetp);
+protected:
+ virtual void dot(const position &, const line_type &) = 0;
+ void ellipse_arc(const position &, const position &,
+ const position &, const distance &,
+ const line_type &);
+ void dashed_circle(const position &, double rad, const line_type &);
+ void dotted_circle(const position &, double rad, const line_type &);
+ void dashed_ellipse(const position &, const distance &, const line_type &);
+ void dotted_ellipse(const position &, const distance &, const line_type &);
+ void dashed_arc(const position &, const position &, const position &,
+ const line_type &);
+ void dotted_arc(const position &, const position &, const position &,
+ const line_type &);
+ virtual void solid_arc(const position &cent, double rad, double start_angle,
+ double end_angle, const line_type &lt);
+ void dashed_rounded_box(const position &, const distance &, double,
+ const line_type &);
+ void dotted_rounded_box(const position &, const distance &, double,
+ const line_type &);
+ void solid_rounded_box(const position &, const distance &, double,
+ const line_type &);
+ void filled_rounded_box(const position &, const distance &, double,
+ double);
+public:
+ void start_picture(double sc, const position &ll, const position &ur) = 0;
+ void finish_picture() = 0;
+ void circle(const position &, double rad, const line_type &, double) = 0;
+ void text(const position &, text_piece *, int, double) = 0;
+ void line(const position &, const position *, int n, const line_type &) = 0;
+ void polygon(const position *, int n, const line_type &, double) = 0;
+ void spline(const position &, const position *, int n,
+ const line_type &) = 0;
+ void arc(const position &, const position &, const position &,
+ const line_type &) = 0;
+ void ellipse(const position &, const distance &,
+ const line_type &, double) = 0;
+ void rounded_box(const position &, const distance &, double,
+ const line_type &, double, char *);
+ void set_color(char *, char *) = 0;
+ void reset_color() = 0;
+ char *get_last_filled() = 0;
+ char *get_outline_color() = 0;
+};
+
+int compute_arc_center(const position &start, const position &cent,
+ const position &end, position *result);
+
diff --git a/src/preproc/pic/lex.cpp b/src/preproc/pic/lex.cpp
new file mode 100644
index 0000000..e59801b
--- /dev/null
+++ b/src/preproc/pic/lex.cpp
@@ -0,0 +1,2039 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "pic.h"
+#include "ptable.h"
+#include "object.h"
+#include "pic.hpp"
+
+declare_ptable(char)
+implement_ptable(char)
+
+PTABLE(char) macro_table;
+
+// First character of the range representing $1-$<MAX_ARG>.
+// All of them must be invalid input characters.
+#ifndef IS_EBCDIC_HOST
+#define ARG1 0x80
+#define MAX_ARG 32
+#else
+#define ARG1 0x30
+#define MAX_ARG 16
+#endif
+
+class macro_input : public input {
+ char *s;
+ char *p;
+public:
+ macro_input(const char *);
+ ~macro_input();
+ int get();
+ int peek();
+};
+
+class argument_macro_input : public input {
+ char *s;
+ char *p;
+ char *ap;
+ int argc;
+ char *argv[MAX_ARG];
+public:
+ argument_macro_input(const char *, int, char **);
+ ~argument_macro_input();
+ int get();
+ int peek();
+};
+
+input::input() : next(0)
+{
+}
+
+input::~input()
+{
+}
+
+int input::get_location(const char **, int *)
+{
+ return 0;
+}
+
+file_input::file_input(FILE *f, const char *fn)
+: fp(f), filename(fn), lineno(0), ptr("")
+{
+}
+
+file_input::~file_input()
+{
+ fclose(fp);
+}
+
+int file_input::read_line()
+{
+ for (;;) {
+ line.clear();
+ lineno++;
+ for (;;) {
+ int c = getc(fp);
+ if (c == '\r') {
+ c = getc(fp);
+ if (c != '\n')
+ lex_error("invalid input character code %1", '\r');
+ }
+ if (c == EOF)
+ break;
+ else if (is_invalid_input_char(c))
+ lex_error("invalid input character code %1", c);
+ else {
+ line += char(c);
+ if (c == '\n')
+ break;
+ }
+ }
+ if (line.length() == 0)
+ return 0;
+ if (!(line.length() >= 3 && line[0] == '.' && line[1] == 'P'
+ && (line[2] == 'S' || line[2] == 'E' || line[2] == 'F')
+ && (line.length() == 3 || line[3] == ' ' || line[3] == '\n'
+ || compatible_flag))) {
+ line += '\0';
+ ptr = line.contents();
+ return 1;
+ }
+ }
+}
+
+int file_input::get()
+{
+ if (*ptr != '\0' || read_line())
+ return (unsigned char)*ptr++;
+ else
+ return EOF;
+}
+
+int file_input::peek()
+{
+ if (*ptr != '\0' || read_line())
+ return (unsigned char)*ptr;
+ else
+ return EOF;
+}
+
+int file_input::get_location(const char **fnp, int *lnp)
+{
+ *fnp = filename;
+ *lnp = lineno;
+ return 1;
+}
+
+macro_input::macro_input(const char *str)
+{
+ p = s = strsave(str);
+}
+
+macro_input::~macro_input()
+{
+ free(s);
+}
+
+int macro_input::get()
+{
+ if (p == 0 || *p == '\0')
+ return EOF;
+ else
+ return (unsigned char)*p++;
+}
+
+int macro_input::peek()
+{
+ if (p == 0 || *p == '\0')
+ return EOF;
+ else
+ return (unsigned char)*p;
+}
+
+char *process_body(const char *body)
+{
+ char *s = strsave(body);
+ int j = 0;
+ for (int i = 0; s[i] != '\0'; i++)
+ if (s[i] == '$' && csdigit(s[i + 1])) {
+ int n = 0;
+ int start = i;
+ i++;
+ while (csdigit(s[i]))
+ if (n > MAX_ARG)
+ i++;
+ else
+ n = 10 * n + s[i++] - '0';
+ if (n > MAX_ARG) {
+ string arg;
+ for (int k = start; k < i; k++)
+ arg += s[k];
+ lex_error("invalid macro argument number %1", arg.contents());
+ }
+ else if (n > 0)
+ s[j++] = ARG1 + n - 1;
+ i--;
+ }
+ else
+ s[j++] = s[i];
+ s[j] = '\0';
+ return s;
+}
+
+argument_macro_input::argument_macro_input(const char *body, int ac, char **av)
+: ap(0), argc(ac)
+{
+ for (int i = 0; i < argc; i++)
+ argv[i] = av[i];
+ p = s = process_body(body);
+}
+
+argument_macro_input::~argument_macro_input()
+{
+ for (int i = 0; i < argc; i++)
+ free(argv[i]);
+ free(s);
+}
+
+int argument_macro_input::get()
+{
+ if (ap) {
+ if (*ap != '\0')
+ return (unsigned char)*ap++;
+ ap = 0;
+ }
+ if (p == 0)
+ return EOF;
+ while ((unsigned char)*p >= ARG1
+ && (unsigned char)*p <= ARG1 + MAX_ARG - 1) {
+ int i = (unsigned char)*p++ - ARG1;
+ if (i < argc && argv[i] != 0 && argv[i][0] != '\0') {
+ ap = argv[i];
+ return (unsigned char)*ap++;
+ }
+ }
+ if (*p == '\0')
+ return EOF;
+ return (unsigned char)*p++;
+}
+
+int argument_macro_input::peek()
+{
+ if (ap) {
+ if (*ap != '\0')
+ return (unsigned char)*ap;
+ ap = 0;
+ }
+ if (p == 0)
+ return EOF;
+ while ((unsigned char)*p >= ARG1
+ && (unsigned char)*p <= ARG1 + MAX_ARG - 1) {
+ int i = (unsigned char)*p++ - ARG1;
+ if (i < argc && argv[i] != 0 && argv[i][0] != '\0') {
+ ap = argv[i];
+ return (unsigned char)*ap;
+ }
+ }
+ if (*p == '\0')
+ return EOF;
+ return (unsigned char)*p;
+}
+
+class input_stack {
+ static input *current_input;
+ static int bol_flag;
+public:
+ static void push(input *);
+ static void clear();
+ static int get_char();
+ static int peek_char();
+ static int get_location(const char **fnp, int *lnp);
+ static void push_back(unsigned char c, int was_bol = 0);
+ static int bol();
+};
+
+input *input_stack::current_input = 0;
+int input_stack::bol_flag = 0;
+
+inline int input_stack::bol()
+{
+ return bol_flag;
+}
+
+void input_stack::clear()
+{
+ while (current_input != 0) {
+ input *tem = current_input;
+ current_input = current_input->next;
+ delete tem;
+ }
+ bol_flag = 1;
+}
+
+void input_stack::push(input *in)
+{
+ in->next = current_input;
+ current_input = in;
+}
+
+void lex_init(input *top)
+{
+ input_stack::clear();
+ input_stack::push(top);
+}
+
+void lex_cleanup()
+{
+ while (input_stack::get_char() != EOF)
+ ;
+}
+
+int input_stack::get_char()
+{
+ while (current_input != 0) {
+ int c = current_input->get();
+ if (c != EOF) {
+ bol_flag = c == '\n';
+ return c;
+ }
+ // don't pop the top-level input off the stack
+ if (current_input->next == 0)
+ return EOF;
+ input *tem = current_input;
+ current_input = current_input->next;
+ delete tem;
+ }
+ return EOF;
+}
+
+int input_stack::peek_char()
+{
+ while (current_input != 0) {
+ int c = current_input->peek();
+ if (c != EOF)
+ return c;
+ if (current_input->next == 0)
+ return EOF;
+ input *tem = current_input;
+ current_input = current_input->next;
+ delete tem;
+ }
+ return EOF;
+}
+
+class char_input : public input {
+ int c;
+public:
+ char_input(int);
+ int get();
+ int peek();
+};
+
+char_input::char_input(int n) : c((unsigned char)n)
+{
+}
+
+int char_input::get()
+{
+ int n = c;
+ c = EOF;
+ return n;
+}
+
+int char_input::peek()
+{
+ return c;
+}
+
+void input_stack::push_back(unsigned char c, int was_bol)
+{
+ push(new char_input(c));
+ bol_flag = was_bol;
+}
+
+int input_stack::get_location(const char **fnp, int *lnp)
+{
+ for (input *p = current_input; p; p = p->next)
+ if (p->get_location(fnp, lnp))
+ return 1;
+ return 0;
+}
+
+string context_buffer;
+
+string token_buffer;
+double token_double;
+int token_int;
+
+void interpolate_macro_with_args(const char *body)
+{
+ char *argv[MAX_ARG];
+ int argc = 0;
+ int ignore = 0;
+ int i;
+ for (i = 0; i < MAX_ARG; i++)
+ argv[i] = 0;
+ int level = 0;
+ int c;
+ enum { NORMAL, IN_STRING, IN_STRING_QUOTED } state = NORMAL;
+ do {
+ token_buffer.clear();
+ for (;;) {
+ c = input_stack::get_char();
+ if (c == EOF) {
+ lex_error("end of input while scanning macro arguments");
+ break;
+ }
+ if (state == NORMAL && level == 0 && (c == ',' || c == ')')) {
+ if (token_buffer.length() > 0) {
+ token_buffer += '\0';
+ if (!ignore) {
+ if (argc == MAX_ARG) {
+ lex_warning("only %1 macro arguments supported", MAX_ARG);
+ ignore = 1;
+ }
+ else
+ argv[argc] = strsave(token_buffer.contents());
+ }
+ }
+ // for 'foo()', argc = 0
+ if (argc > 0 || c != ')' || i > 0)
+ if (!ignore)
+ argc++;
+ break;
+ }
+ token_buffer += char(c);
+ switch (state) {
+ case NORMAL:
+ if (c == '"')
+ state = IN_STRING;
+ else if (c == '(')
+ level++;
+ else if (c == ')')
+ level--;
+ break;
+ case IN_STRING:
+ if (c == '"')
+ state = NORMAL;
+ else if (c == '\\')
+ state = IN_STRING_QUOTED;
+ break;
+ case IN_STRING_QUOTED:
+ state = IN_STRING;
+ break;
+ }
+ }
+ } while (c != ')' && c != EOF);
+ input_stack::push(new argument_macro_input(body, argc, argv));
+}
+
+static int docmp(const char *s1, int n1, const char *s2, int n2)
+{
+ if (n1 < n2) {
+ int r = memcmp(s1, s2, n1);
+ return r ? r : -1;
+ }
+ else if (n1 > n2) {
+ int r = memcmp(s1, s2, n2);
+ return r ? r : 1;
+ }
+ else
+ return memcmp(s1, s2, n1);
+}
+
+int lookup_keyword(const char *str, int len)
+{
+ static struct keyword {
+ const char *name;
+ int token;
+ } table[] = {
+ { "Here", HERE },
+ { "above", ABOVE },
+ { "aligned", ALIGNED },
+ { "and", AND },
+ { "arc", ARC },
+ { "arrow", ARROW },
+ { "at", AT },
+ { "atan2", ATAN2 },
+ { "below", BELOW },
+ { "between", BETWEEN },
+ { "bottom", BOTTOM },
+ { "box", BOX },
+ { "by", BY },
+ { "ccw", CCW },
+ { "center", CENTER },
+ { "chop", CHOP },
+ { "circle", CIRCLE },
+ { "color", COLORED },
+ { "colored", COLORED },
+ { "colour", COLORED },
+ { "coloured", COLORED },
+ { "command", COMMAND },
+ { "copy", COPY },
+ { "cos", COS },
+ { "cw", CW },
+ { "dashed", DASHED },
+ { "define", DEFINE },
+ { "diam", DIAMETER },
+ { "diameter", DIAMETER },
+ { "do", DO },
+ { "dotted", DOTTED },
+ { "down", DOWN },
+ { "east", EAST },
+ { "ellipse", ELLIPSE },
+ { "else", ELSE },
+ { "end", END },
+ { "exp", EXP },
+ { "figname", FIGNAME },
+ { "fill", FILL },
+ { "filled", FILL },
+ { "for", FOR },
+ { "from", FROM },
+ { "height", HEIGHT },
+ { "ht", HEIGHT },
+ { "if", IF },
+ { "int", INT },
+ { "invis", INVISIBLE },
+ { "invisible", INVISIBLE },
+ { "last", LAST },
+ { "left", LEFT },
+ { "line", LINE },
+ { "ljust", LJUST },
+ { "log", LOG },
+ { "lower", LOWER },
+ { "max", K_MAX },
+ { "min", K_MIN },
+ { "move", MOVE },
+ { "north", NORTH },
+ { "of", OF },
+ { "outline", OUTLINED },
+ { "outlined", OUTLINED },
+ { "plot", PLOT },
+ { "print", PRINT },
+ { "rad", RADIUS },
+ { "radius", RADIUS },
+ { "rand", RAND },
+ { "reset", RESET },
+ { "right", RIGHT },
+ { "rjust", RJUST },
+ { "same", SAME },
+ { "sh", SH },
+ { "shaded", SHADED },
+ { "sin", SIN },
+ { "solid", SOLID },
+ { "south", SOUTH },
+ { "spline", SPLINE },
+ { "sprintf", SPRINTF },
+ { "sqrt", SQRT },
+ { "srand", SRAND },
+ { "start", START },
+ { "the", THE },
+ { "then", THEN },
+ { "thick", THICKNESS },
+ { "thickness", THICKNESS },
+ { "thru", THRU },
+ { "to", TO },
+ { "top", TOP },
+ { "undef", UNDEF },
+ { "until", UNTIL },
+ { "up", UP },
+ { "upper", UPPER },
+ { "way", WAY },
+ { "west", WEST },
+ { "wid", WIDTH },
+ { "width", WIDTH },
+ { "with", WITH },
+ { "xslanted", XSLANTED },
+ { "yslanted", YSLANTED },
+ };
+
+ const keyword *start = table;
+ const keyword *end = table + sizeof(table)/sizeof(table[0]);
+ while (start < end) {
+ // start <= target < end
+ const keyword *mid = start + (end - start)/2;
+
+ int cmp = docmp(str, len, mid->name, strlen(mid->name));
+ if (cmp == 0)
+ return mid->token;
+ if (cmp < 0)
+ end = mid;
+ else
+ start = mid + 1;
+ }
+ return 0;
+}
+
+int get_token_after_dot(int c)
+{
+ // get_token deals with the case where c is a digit
+ switch (c) {
+ case 'h':
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 't') {
+ input_stack::get_char();
+ context_buffer = ".ht";
+ return DOT_HT;
+ }
+ else if (c == 'e') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'i') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'g') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'h') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 't') {
+ input_stack::get_char();
+ context_buffer = ".height";
+ return DOT_HT;
+ }
+ input_stack::push_back('h');
+ }
+ input_stack::push_back('g');
+ }
+ input_stack::push_back('i');
+ }
+ input_stack::push_back('e');
+ }
+ input_stack::push_back('h');
+ return '.';
+ case 'x':
+ input_stack::get_char();
+ context_buffer = ".x";
+ return DOT_X;
+ case 'y':
+ input_stack::get_char();
+ context_buffer = ".y";
+ return DOT_Y;
+ case 'c':
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'e') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'n') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 't') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'e') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'r') {
+ input_stack::get_char();
+ context_buffer = ".center";
+ return DOT_C;
+ }
+ input_stack::push_back('e');
+ }
+ input_stack::push_back('t');
+ }
+ input_stack::push_back('n');
+ }
+ input_stack::push_back('e');
+ }
+ context_buffer = ".c";
+ return DOT_C;
+ case 'n':
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'e') {
+ input_stack::get_char();
+ context_buffer = ".ne";
+ return DOT_NE;
+ }
+ else if (c == 'w') {
+ input_stack::get_char();
+ context_buffer = ".nw";
+ return DOT_NW;
+ }
+ else {
+ context_buffer = ".n";
+ return DOT_N;
+ }
+ break;
+ case 'e':
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'n') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'd') {
+ input_stack::get_char();
+ context_buffer = ".end";
+ return DOT_END;
+ }
+ input_stack::push_back('n');
+ context_buffer = ".e";
+ return DOT_E;
+ }
+ context_buffer = ".e";
+ return DOT_E;
+ case 'w':
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'i') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'd') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 't') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'h') {
+ input_stack::get_char();
+ context_buffer = ".width";
+ return DOT_WID;
+ }
+ input_stack::push_back('t');
+ }
+ context_buffer = ".wid";
+ return DOT_WID;
+ }
+ input_stack::push_back('i');
+ }
+ context_buffer = ".w";
+ return DOT_W;
+ case 's':
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'e') {
+ input_stack::get_char();
+ context_buffer = ".se";
+ return DOT_SE;
+ }
+ else if (c == 'w') {
+ input_stack::get_char();
+ context_buffer = ".sw";
+ return DOT_SW;
+ }
+ else {
+ if (c == 't') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'a') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'r') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 't') {
+ input_stack::get_char();
+ context_buffer = ".start";
+ return DOT_START;
+ }
+ input_stack::push_back('r');
+ }
+ input_stack::push_back('a');
+ }
+ input_stack::push_back('t');
+ }
+ context_buffer = ".s";
+ return DOT_S;
+ }
+ break;
+ case 't':
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'o') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'p') {
+ input_stack::get_char();
+ context_buffer = ".top";
+ return DOT_N;
+ }
+ input_stack::push_back('o');
+ }
+ context_buffer = ".t";
+ return DOT_N;
+ case 'l':
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'e') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'f') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 't') {
+ input_stack::get_char();
+ context_buffer = ".left";
+ return DOT_W;
+ }
+ input_stack::push_back('f');
+ }
+ input_stack::push_back('e');
+ }
+ context_buffer = ".l";
+ return DOT_W;
+ case 'r':
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'a') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'd') {
+ input_stack::get_char();
+ context_buffer = ".rad";
+ return DOT_RAD;
+ }
+ input_stack::push_back('a');
+ }
+ else if (c == 'i') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'g') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'h') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 't') {
+ input_stack::get_char();
+ context_buffer = ".right";
+ return DOT_E;
+ }
+ input_stack::push_back('h');
+ }
+ input_stack::push_back('g');
+ }
+ input_stack::push_back('i');
+ }
+ context_buffer = ".r";
+ return DOT_E;
+ case 'b':
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'o') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 't') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 't') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'o') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'm') {
+ input_stack::get_char();
+ context_buffer = ".bottom";
+ return DOT_S;
+ }
+ input_stack::push_back('o');
+ }
+ input_stack::push_back('t');
+ }
+ context_buffer = ".bot";
+ return DOT_S;
+ }
+ input_stack::push_back('o');
+ }
+ context_buffer = ".b";
+ return DOT_S;
+ default:
+ context_buffer = '.';
+ return '.';
+ }
+}
+
+int get_token(int lookup_flag)
+{
+ context_buffer.clear();
+ for (;;) {
+ int n = 0;
+ int bol = input_stack::bol();
+ int c = input_stack::get_char();
+ if (bol && c == command_char) {
+ token_buffer.clear();
+ token_buffer += c;
+ // the newline is not part of the token
+ for (;;) {
+ c = input_stack::peek_char();
+ if (c == EOF || c == '\n')
+ break;
+ input_stack::get_char();
+ token_buffer += char(c);
+ }
+ context_buffer = token_buffer;
+ return COMMAND_LINE;
+ }
+ switch (c) {
+ case EOF:
+ return EOF;
+ case ' ':
+ case '\t':
+ break;
+ case '\\':
+ {
+ int d = input_stack::peek_char();
+ if (d != '\n') {
+ context_buffer = '\\';
+ return '\\';
+ }
+ input_stack::get_char();
+ break;
+ }
+ case '#':
+ do {
+ c = input_stack::get_char();
+ } while (c != '\n' && c != EOF);
+ if (c == '\n')
+ context_buffer = '\n';
+ return c;
+ case '"':
+ context_buffer = '"';
+ token_buffer.clear();
+ for (;;) {
+ c = input_stack::get_char();
+ if (c == '\\') {
+ context_buffer += '\\';
+ c = input_stack::peek_char();
+ if (c == '"') {
+ input_stack::get_char();
+ token_buffer += '"';
+ context_buffer += '"';
+ }
+ else
+ token_buffer += '\\';
+ }
+ else if (c == '\n') {
+ error("newline in string");
+ break;
+ }
+ else if (c == EOF) {
+ error("missing '\"'");
+ break;
+ }
+ else if (c == '"') {
+ context_buffer += '"';
+ break;
+ }
+ else {
+ context_buffer += char(c);
+ token_buffer += char(c);
+ }
+ }
+ return TEXT;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ {
+ int overflow = 0;
+ n = 0;
+ for (;;) {
+ if (n > (INT_MAX - 9)/10) {
+ overflow = 1;
+ break;
+ }
+ n *= 10;
+ n += c - '0';
+ context_buffer += char(c);
+ c = input_stack::peek_char();
+ if (c == EOF || !csdigit(c))
+ break;
+ c = input_stack::get_char();
+ }
+ token_double = n;
+ if (overflow) {
+ for (;;) {
+ token_double *= 10.0;
+ token_double += c - '0';
+ context_buffer += char(c);
+ c = input_stack::peek_char();
+ if (c == EOF || !csdigit(c))
+ break;
+ c = input_stack::get_char();
+ }
+ // if somebody asks for 1000000000000th, we will silently
+ // give them INT_MAXth
+ double temp = token_double; // work around gas 1.34/sparc bug
+ if (token_double > INT_MAX)
+ n = INT_MAX;
+ else
+ n = int(temp);
+ }
+ }
+ switch (c) {
+ case 'i':
+ case 'I':
+ context_buffer += char(c);
+ input_stack::get_char();
+ return NUMBER;
+ case '.':
+ {
+ context_buffer += '.';
+ input_stack::get_char();
+ got_dot:
+ double factor = 1.0;
+ for (;;) {
+ c = input_stack::peek_char();
+ if (c == EOF || !csdigit(c))
+ break;
+ input_stack::get_char();
+ context_buffer += char(c);
+ factor /= 10.0;
+ if (c != '0')
+ token_double += factor*(c - '0');
+ }
+ if (c != 'e' && c != 'E') {
+ if (c == 'i' || c == 'I') {
+ context_buffer += char(c);
+ input_stack::get_char();
+ }
+ return NUMBER;
+ }
+ }
+ // fall through
+ case 'e':
+ case 'E':
+ {
+ int echar = c;
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ int sign = '+';
+ if (c == '+' || c == '-') {
+ sign = c;
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == EOF || !csdigit(c)) {
+ input_stack::push_back(sign);
+ input_stack::push_back(echar);
+ return NUMBER;
+ }
+ context_buffer += char(echar);
+ context_buffer += char(sign);
+ }
+ else {
+ if (c == EOF || !csdigit(c)) {
+ input_stack::push_back(echar);
+ return NUMBER;
+ }
+ context_buffer += char(echar);
+ }
+ input_stack::get_char();
+ context_buffer += char(c);
+ n = c - '0';
+ for (;;) {
+ c = input_stack::peek_char();
+ if (c == EOF || !csdigit(c))
+ break;
+ input_stack::get_char();
+ context_buffer += char(c);
+ n = n*10 + (c - '0');
+ }
+ if (sign == '-')
+ n = -n;
+ if (c == 'i' || c == 'I') {
+ context_buffer += char(c);
+ input_stack::get_char();
+ }
+ token_double *= pow(10.0, n);
+ return NUMBER;
+ }
+ case 'n':
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'd') {
+ input_stack::get_char();
+ token_int = n;
+ context_buffer += "nd";
+ return ORDINAL;
+ }
+ input_stack::push_back('n');
+ return NUMBER;
+ case 'r':
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'd') {
+ input_stack::get_char();
+ token_int = n;
+ context_buffer += "rd";
+ return ORDINAL;
+ }
+ input_stack::push_back('r');
+ return NUMBER;
+ case 't':
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'h') {
+ input_stack::get_char();
+ token_int = n;
+ context_buffer += "th";
+ return ORDINAL;
+ }
+ input_stack::push_back('t');
+ return NUMBER;
+ case 's':
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 't') {
+ input_stack::get_char();
+ token_int = n;
+ context_buffer += "st";
+ return ORDINAL;
+ }
+ input_stack::push_back('s');
+ return NUMBER;
+ default:
+ return NUMBER;
+ }
+ break;
+ case '\'':
+ {
+ c = input_stack::peek_char();
+ if (c == 't') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == 'h') {
+ input_stack::get_char();
+ context_buffer = "'th";
+ return TH;
+ }
+ else
+ input_stack::push_back('t');
+ }
+ context_buffer = "'";
+ return '\'';
+ }
+ case '.':
+ {
+ c = input_stack::peek_char();
+ if (c != EOF && csdigit(c)) {
+ n = 0;
+ token_double = 0.0;
+ context_buffer = '.';
+ goto got_dot;
+ }
+ return get_token_after_dot(c);
+ }
+ case '<':
+ c = input_stack::peek_char();
+ if (c == '-') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ if (c == '>') {
+ input_stack::get_char();
+ context_buffer = "<->";
+ return DOUBLE_ARROW_HEAD;
+ }
+ context_buffer = "<-";
+ return LEFT_ARROW_HEAD;
+ }
+ else if (c == '=') {
+ input_stack::get_char();
+ context_buffer = "<=";
+ return LESSEQUAL;
+ }
+ context_buffer = "<";
+ return '<';
+ case '-':
+ c = input_stack::peek_char();
+ if (c == '>') {
+ input_stack::get_char();
+ context_buffer = "->";
+ return RIGHT_ARROW_HEAD;
+ }
+ context_buffer = "-";
+ return '-';
+ case '!':
+ c = input_stack::peek_char();
+ if (c == '=') {
+ input_stack::get_char();
+ context_buffer = "!=";
+ return NOTEQUAL;
+ }
+ context_buffer = "!";
+ return '!';
+ case '>':
+ c = input_stack::peek_char();
+ if (c == '=') {
+ input_stack::get_char();
+ context_buffer = ">=";
+ return GREATEREQUAL;
+ }
+ context_buffer = ">";
+ return '>';
+ case '=':
+ c = input_stack::peek_char();
+ if (c == '=') {
+ input_stack::get_char();
+ context_buffer = "==";
+ return EQUALEQUAL;
+ }
+ context_buffer = "=";
+ return '=';
+ case '&':
+ c = input_stack::peek_char();
+ if (c == '&') {
+ input_stack::get_char();
+ context_buffer = "&&";
+ return ANDAND;
+ }
+ context_buffer = "&";
+ return '&';
+ case '|':
+ c = input_stack::peek_char();
+ if (c == '|') {
+ input_stack::get_char();
+ context_buffer = "||";
+ return OROR;
+ }
+ context_buffer = "|";
+ return '|';
+ default:
+ if (c != EOF && csalpha(c)) {
+ token_buffer.clear();
+ token_buffer = c;
+ for (;;) {
+ c = input_stack::peek_char();
+ if (c == EOF || (!csalnum(c) && c != '_'))
+ break;
+ input_stack::get_char();
+ token_buffer += char(c);
+ }
+ int tok = lookup_keyword(token_buffer.contents(),
+ token_buffer.length());
+ if (tok != 0) {
+ context_buffer = token_buffer;
+ return tok;
+ }
+ char *def = 0;
+ if (lookup_flag) {
+ token_buffer += '\0';
+ def = macro_table.lookup(token_buffer.contents());
+ token_buffer.set_length(token_buffer.length() - 1);
+ if (def) {
+ if (c == '(') {
+ input_stack::get_char();
+ interpolate_macro_with_args(def);
+ }
+ else
+ input_stack::push(new macro_input(def));
+ }
+ }
+ if (!def) {
+ context_buffer = token_buffer;
+ if (csupper(token_buffer[0]))
+ return LABEL;
+ else
+ return VARIABLE;
+ }
+ }
+ else {
+ context_buffer = char(c);
+ return (unsigned char)c;
+ }
+ break;
+ }
+ }
+}
+
+int get_delimited()
+{
+ token_buffer.clear();
+ int c = input_stack::get_char();
+ while (c == ' ' || c == '\t' || c == '\n')
+ c = input_stack::get_char();
+ if (c == EOF) {
+ lex_error("missing delimiter");
+ return 0;
+ }
+ context_buffer = char(c);
+ int had_newline = 0;
+ int start = c;
+ int level = 0;
+ enum { NORMAL, IN_STRING, IN_STRING_QUOTED, DELIM_END } state = NORMAL;
+ for (;;) {
+ c = input_stack::get_char();
+ if (c == EOF) {
+ lex_error("missing closing delimiter");
+ return 0;
+ }
+ if (c == '\n')
+ had_newline = 1;
+ else if (!had_newline)
+ context_buffer += char(c);
+ switch (state) {
+ case NORMAL:
+ if (start == '{') {
+ if (c == '{') {
+ level++;
+ break;
+ }
+ if (c == '}') {
+ if (--level < 0)
+ state = DELIM_END;
+ break;
+ }
+ }
+ else {
+ if (c == start) {
+ state = DELIM_END;
+ break;
+ }
+ }
+ if (c == '"')
+ state = IN_STRING;
+ break;
+ case IN_STRING_QUOTED:
+ if (c == '\n')
+ state = NORMAL;
+ else
+ state = IN_STRING;
+ break;
+ case IN_STRING:
+ if (c == '"' || c == '\n')
+ state = NORMAL;
+ else if (c == '\\')
+ state = IN_STRING_QUOTED;
+ break;
+ case DELIM_END:
+ // This case it just to shut cfront 2.0 up.
+ default:
+ assert(0);
+ }
+ if (state == DELIM_END)
+ break;
+ token_buffer += c;
+ }
+ return 1;
+}
+
+void do_define()
+{
+ int t = get_token(0); // do not expand what we are defining
+ if (t != VARIABLE && t != LABEL) {
+ lex_error("can only define variable or placename");
+ return;
+ }
+ token_buffer += '\0';
+ string nm = token_buffer;
+ const char *name = nm.contents();
+ if (!get_delimited())
+ return;
+ token_buffer += '\0';
+ macro_table.define(name, strsave(token_buffer.contents()));
+}
+
+void do_undef()
+{
+ int t = get_token(0); // do not expand what we are undefining
+ if (t != VARIABLE && t != LABEL) {
+ lex_error("can only define variable or placename");
+ return;
+ }
+ token_buffer += '\0';
+ macro_table.define(token_buffer.contents(), 0);
+}
+
+
+class for_input : public input {
+ char *var;
+ char *body;
+ double from;
+ double to;
+ int by_is_multiplicative;
+ double by;
+ const char *p;
+ int done_newline;
+public:
+ for_input(char *, double, double, int, double, char *);
+ ~for_input();
+ int get();
+ int peek();
+};
+
+for_input::for_input(char *vr, double f, double t,
+ int bim, double b, char *bd)
+: var(vr), body(bd), from(f), to(t), by_is_multiplicative(bim), by(b),
+ p(body), done_newline(0)
+{
+}
+
+for_input::~for_input()
+{
+ free(var);
+ free(body);
+}
+
+int for_input::get()
+{
+ if (p == 0)
+ return EOF;
+ for (;;) {
+ if (*p != '\0')
+ return (unsigned char)*p++;
+ if (!done_newline) {
+ done_newline = 1;
+ return '\n';
+ }
+ double val;
+ if (!lookup_variable(var, &val)) {
+ lex_error("body of 'for' terminated enclosing block");
+ return EOF;
+ }
+ if (by_is_multiplicative)
+ val *= by;
+ else
+ val += by;
+ define_variable(var, val);
+ if ((from <= to && val > to)
+ || (from >= to && val < to)) {
+ p = 0;
+ return EOF;
+ }
+ p = body;
+ done_newline = 0;
+ }
+}
+
+int for_input::peek()
+{
+ if (p == 0)
+ return EOF;
+ if (*p != '\0')
+ return (unsigned char)*p;
+ if (!done_newline)
+ return '\n';
+ double val;
+ if (!lookup_variable(var, &val))
+ return EOF;
+ if (by_is_multiplicative) {
+ if (val * by > to)
+ return EOF;
+ }
+ else {
+ if ((from <= to && val + by > to)
+ || (from >= to && val + by < to))
+ return EOF;
+ }
+ if (*body == '\0')
+ return EOF;
+ return (unsigned char)*body;
+}
+
+void do_for(char *var, double from, double to, int by_is_multiplicative,
+ double by, char *body)
+{
+ define_variable(var, from);
+ if ((by_is_multiplicative && by <= 0)
+ || (by > 0 && from > to)
+ || (by < 0 && from < to))
+ return;
+ input_stack::push(new for_input(var, from, to,
+ by_is_multiplicative, by, body));
+}
+
+
+void do_copy(const char *filename)
+{
+ errno = 0;
+ FILE *fp = fopen(filename, "r");
+ if (fp == 0) {
+ lex_error("can't open '%1': %2", filename, strerror(errno));
+ return;
+ }
+ input_stack::push(new file_input(fp, filename));
+}
+
+class copy_thru_input : public input {
+ int done;
+ char *body;
+ char *until;
+ const char *p;
+ const char *ap;
+ int argv[MAX_ARG];
+ int argc;
+ string line;
+ int get_line();
+ virtual int inget() = 0;
+public:
+ copy_thru_input(const char *b, const char *u);
+ ~copy_thru_input();
+ int get();
+ int peek();
+};
+
+class copy_file_thru_input : public copy_thru_input {
+ input *in;
+public:
+ copy_file_thru_input(input *, const char *b, const char *u);
+ ~copy_file_thru_input();
+ int inget();
+};
+
+copy_file_thru_input::copy_file_thru_input(input *i, const char *b,
+ const char *u)
+: copy_thru_input(b, u), in(i)
+{
+}
+
+copy_file_thru_input::~copy_file_thru_input()
+{
+ delete in;
+}
+
+int copy_file_thru_input::inget()
+{
+ if (!in)
+ return EOF;
+ else
+ return in->get();
+}
+
+class copy_rest_thru_input : public copy_thru_input {
+public:
+ copy_rest_thru_input(const char *, const char *u);
+ int inget();
+};
+
+copy_rest_thru_input::copy_rest_thru_input(const char *b, const char *u)
+: copy_thru_input(b, u)
+{
+}
+
+int copy_rest_thru_input::inget()
+{
+ while (next != 0) {
+ int c = next->get();
+ if (c != EOF)
+ return c;
+ if (next->next == 0)
+ return EOF;
+ input *tem = next;
+ next = next->next;
+ delete tem;
+ }
+ return EOF;
+
+}
+
+copy_thru_input::copy_thru_input(const char *b, const char *u)
+: done(0)
+{
+ ap = 0;
+ body = process_body(b);
+ p = 0;
+ until = strsave(u);
+}
+
+
+copy_thru_input::~copy_thru_input()
+{
+ delete[] body;
+ delete[] until;
+}
+
+int copy_thru_input::get()
+{
+ if (ap) {
+ if (*ap != '\0')
+ return (unsigned char)*ap++;
+ ap = 0;
+ }
+ for (;;) {
+ if (p == 0) {
+ if (!get_line())
+ break;
+ p = body;
+ }
+ if (*p == '\0') {
+ p = 0;
+ return '\n';
+ }
+ while ((unsigned char)*p >= ARG1
+ && (unsigned char)*p <= ARG1 + MAX_ARG - 1) {
+ int i = (unsigned char)*p++ - ARG1;
+ if (i < argc && line[argv[i]] != '\0') {
+ ap = line.contents() + argv[i];
+ return (unsigned char)*ap++;
+ }
+ }
+ if (*p != '\0')
+ return (unsigned char)*p++;
+ }
+ return EOF;
+}
+
+int copy_thru_input::peek()
+{
+ if (ap) {
+ if (*ap != '\0')
+ return (unsigned char)*ap;
+ ap = 0;
+ }
+ for (;;) {
+ if (p == 0) {
+ if (!get_line())
+ break;
+ p = body;
+ }
+ if (*p == '\0')
+ return '\n';
+ while ((unsigned char)*p >= ARG1
+ && (unsigned char)*p <= ARG1 + MAX_ARG - 1) {
+ int i = (unsigned char)*p++ - ARG1;
+ if (i < argc && line[argv[i]] != '\0') {
+ ap = line.contents() + argv[i];
+ return (unsigned char)*ap;
+ }
+ }
+ if (*p != '\0')
+ return (unsigned char)*p;
+ }
+ return EOF;
+}
+
+int copy_thru_input::get_line()
+{
+ if (done)
+ return 0;
+ line.clear();
+ argc = 0;
+ int c = inget();
+ for (;;) {
+ while (c == ' ')
+ c = inget();
+ if (c == EOF || c == '\n')
+ break;
+ if (argc == MAX_ARG) {
+ do {
+ c = inget();
+ } while (c != '\n' && c != EOF);
+ break;
+ }
+ argv[argc++] = line.length();
+ do {
+ line += char(c);
+ c = inget();
+ } while (c != ' ' && c != '\n');
+ line += '\0';
+ }
+ if (until != 0 && argc > 0 && strcmp(&line[argv[0]], until) == 0) {
+ done = 1;
+ return 0;
+ }
+ return argc > 0 || c == '\n';
+}
+
+class simple_file_input : public input {
+ const char *filename;
+ int lineno;
+ FILE *fp;
+public:
+ simple_file_input(FILE *, const char *);
+ ~simple_file_input();
+ int get();
+ int peek();
+ int get_location(const char **, int *);
+};
+
+simple_file_input::simple_file_input(FILE *p, const char *s)
+: filename(s), lineno(1), fp(p)
+{
+}
+
+simple_file_input::~simple_file_input()
+{
+ // don't delete the filename
+ fclose(fp);
+}
+
+int simple_file_input::get()
+{
+ int c = getc(fp);
+ while (is_invalid_input_char(c)) {
+ error("invalid input character code %1", c);
+ c = getc(fp);
+ }
+ if (c == '\n')
+ lineno++;
+ return c;
+}
+
+int simple_file_input::peek()
+{
+ int c = getc(fp);
+ while (is_invalid_input_char(c)) {
+ error("invalid input character code %1", c);
+ c = getc(fp);
+ }
+ if (c != EOF)
+ ungetc(c, fp);
+ return c;
+}
+
+int simple_file_input::get_location(const char **fnp, int *lnp)
+{
+ *fnp = filename;
+ *lnp = lineno;
+ return 1;
+}
+
+
+void copy_file_thru(const char *filename, const char *body, const char *until)
+{
+ errno = 0;
+ FILE *fp = fopen(filename, "r");
+ if (fp == 0) {
+ lex_error("can't open '%1': %2", filename, strerror(errno));
+ return;
+ }
+ input *in = new copy_file_thru_input(new simple_file_input(fp, filename),
+ body, until);
+ input_stack::push(in);
+}
+
+void copy_rest_thru(const char *body, const char *until)
+{
+ input_stack::push(new copy_rest_thru_input(body, until));
+}
+
+void push_body(const char *s)
+{
+ input_stack::push(new char_input('\n'));
+ input_stack::push(new macro_input(s));
+}
+
+int delim_flag = 0;
+
+char *get_thru_arg()
+{
+ int c = input_stack::peek_char();
+ while (c == ' ') {
+ input_stack::get_char();
+ c = input_stack::peek_char();
+ }
+ if (c != EOF && csalpha(c)) {
+ // looks like a macro
+ input_stack::get_char();
+ token_buffer = c;
+ for (;;) {
+ c = input_stack::peek_char();
+ if (c == EOF || (!csalnum(c) && c != '_'))
+ break;
+ input_stack::get_char();
+ token_buffer += char(c);
+ }
+ context_buffer = token_buffer;
+ token_buffer += '\0';
+ char *def = macro_table.lookup(token_buffer.contents());
+ if (def)
+ return strsave(def);
+ // I guess it wasn't a macro after all; so push the macro name back.
+ // -2 because we added a '\0'
+ for (int i = token_buffer.length() - 2; i >= 0; i--)
+ input_stack::push_back(token_buffer[i]);
+ }
+ if (get_delimited()) {
+ token_buffer += '\0';
+ return strsave(token_buffer.contents());
+ }
+ else
+ return 0;
+}
+
+int lookahead_token = -1;
+string old_context_buffer;
+
+void do_lookahead()
+{
+ if (lookahead_token == -1) {
+ old_context_buffer = context_buffer;
+ lookahead_token = get_token(1);
+ }
+}
+
+int yylex()
+{
+ if (delim_flag) {
+ assert(lookahead_token == -1);
+ if (delim_flag == 2) {
+ if ((yylval.str = get_thru_arg()) != 0)
+ return DELIMITED;
+ else
+ return 0;
+ }
+ else {
+ if (get_delimited()) {
+ token_buffer += '\0';
+ yylval.str = strsave(token_buffer.contents());
+ return DELIMITED;
+ }
+ else
+ return 0;
+ }
+ }
+ for (;;) {
+ int t;
+ if (lookahead_token >= 0) {
+ t = lookahead_token;
+ lookahead_token = -1;
+ }
+ else
+ t = get_token(1);
+ switch (t) {
+ case '\n':
+ return ';';
+ case EOF:
+ return 0;
+ case DEFINE:
+ do_define();
+ break;
+ case UNDEF:
+ do_undef();
+ break;
+ case ORDINAL:
+ yylval.n = token_int;
+ return t;
+ case NUMBER:
+ yylval.x = token_double;
+ return t;
+ case COMMAND_LINE:
+ case TEXT:
+ token_buffer += '\0';
+ if (!input_stack::get_location(&yylval.lstr.filename,
+ &yylval.lstr.lineno)) {
+ yylval.lstr.filename = 0;
+ yylval.lstr.lineno = -1;
+ }
+ yylval.lstr.str = strsave(token_buffer.contents());
+ return t;
+ case LABEL:
+ case VARIABLE:
+ token_buffer += '\0';
+ yylval.str = strsave(token_buffer.contents());
+ return t;
+ case LEFT:
+ // change LEFT to LEFT_CORNER when followed by OF
+ old_context_buffer = context_buffer;
+ lookahead_token = get_token(1);
+ if (lookahead_token == OF)
+ return LEFT_CORNER;
+ else
+ return t;
+ case RIGHT:
+ // change RIGHT to RIGHT_CORNER when followed by OF
+ old_context_buffer = context_buffer;
+ lookahead_token = get_token(1);
+ if (lookahead_token == OF)
+ return RIGHT_CORNER;
+ else
+ return t;
+ case UPPER:
+ // recognise UPPER only before LEFT or RIGHT
+ old_context_buffer = context_buffer;
+ lookahead_token = get_token(1);
+ if (lookahead_token != LEFT && lookahead_token != RIGHT) {
+ yylval.str = strsave("upper");
+ return VARIABLE;
+ }
+ else
+ return t;
+ case LOWER:
+ // recognise LOWER only before LEFT or RIGHT
+ old_context_buffer = context_buffer;
+ lookahead_token = get_token(1);
+ if (lookahead_token != LEFT && lookahead_token != RIGHT) {
+ yylval.str = strsave("lower");
+ return VARIABLE;
+ }
+ else
+ return t;
+ case NORTH:
+ // recognise NORTH only before OF
+ old_context_buffer = context_buffer;
+ lookahead_token = get_token(1);
+ if (lookahead_token != OF) {
+ yylval.str = strsave("north");
+ return VARIABLE;
+ }
+ else
+ return t;
+ case SOUTH:
+ // recognise SOUTH only before OF
+ old_context_buffer = context_buffer;
+ lookahead_token = get_token(1);
+ if (lookahead_token != OF) {
+ yylval.str = strsave("south");
+ return VARIABLE;
+ }
+ else
+ return t;
+ case EAST:
+ // recognise EAST only before OF
+ old_context_buffer = context_buffer;
+ lookahead_token = get_token(1);
+ if (lookahead_token != OF) {
+ yylval.str = strsave("east");
+ return VARIABLE;
+ }
+ else
+ return t;
+ case WEST:
+ // recognise WEST only before OF
+ old_context_buffer = context_buffer;
+ lookahead_token = get_token(1);
+ if (lookahead_token != OF) {
+ yylval.str = strsave("west");
+ return VARIABLE;
+ }
+ else
+ return t;
+ case TOP:
+ // recognise TOP only before OF
+ old_context_buffer = context_buffer;
+ lookahead_token = get_token(1);
+ if (lookahead_token != OF) {
+ yylval.str = strsave("top");
+ return VARIABLE;
+ }
+ else
+ return t;
+ case BOTTOM:
+ // recognise BOTTOM only before OF
+ old_context_buffer = context_buffer;
+ lookahead_token = get_token(1);
+ if (lookahead_token != OF) {
+ yylval.str = strsave("bottom");
+ return VARIABLE;
+ }
+ else
+ return t;
+ case CENTER:
+ // recognise CENTER only before OF
+ old_context_buffer = context_buffer;
+ lookahead_token = get_token(1);
+ if (lookahead_token != OF) {
+ yylval.str = strsave("center");
+ return VARIABLE;
+ }
+ else
+ return t;
+ case START:
+ // recognise START only before OF
+ old_context_buffer = context_buffer;
+ lookahead_token = get_token(1);
+ if (lookahead_token != OF) {
+ yylval.str = strsave("start");
+ return VARIABLE;
+ }
+ else
+ return t;
+ case END:
+ // recognise END only before OF
+ old_context_buffer = context_buffer;
+ lookahead_token = get_token(1);
+ if (lookahead_token != OF) {
+ yylval.str = strsave("end");
+ return VARIABLE;
+ }
+ else
+ return t;
+ default:
+ return t;
+ }
+ }
+}
+
+void lex_error(const char *message,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ const char *filename;
+ int lineno;
+ if (!input_stack::get_location(&filename, &lineno))
+ error(message, arg1, arg2, arg3);
+ else
+ error_with_file_and_line(filename, lineno, message, arg1, arg2, arg3);
+}
+
+void lex_warning(const char *message,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ const char *filename;
+ int lineno;
+ if (!input_stack::get_location(&filename, &lineno))
+ warning(message, arg1, arg2, arg3);
+ else
+ warning_with_file_and_line(filename, lineno, message, arg1, arg2, arg3);
+}
+
+void yyerror(const char *s)
+{
+ const char *filename;
+ int lineno;
+ const char *context = 0;
+ if (lookahead_token == -1) {
+ if (context_buffer.length() > 0) {
+ context_buffer += '\0';
+ context = context_buffer.contents();
+ }
+ }
+ else {
+ if (old_context_buffer.length() > 0) {
+ old_context_buffer += '\0';
+ context = old_context_buffer.contents();
+ }
+ }
+ if (!input_stack::get_location(&filename, &lineno)) {
+ if (context) {
+ if (context[0] == '\n' && context[1] == '\0')
+ error("%1 before newline", s);
+ else
+ error("%1 before '%2'", s, context);
+ }
+ else
+ error("%1 at end of picture", s);
+ }
+ else {
+ if (context) {
+ if (context[0] == '\n' && context[1] == '\0')
+ error_with_file_and_line(filename, lineno, "%1 before newline", s);
+ else
+ error_with_file_and_line(filename, lineno, "%1 before '%2'",
+ s, context);
+ }
+ else
+ error_with_file_and_line(filename, lineno, "%1 at end of picture", s);
+ }
+}
+
diff --git a/src/preproc/pic/main.cpp b/src/preproc/pic/main.cpp
new file mode 100644
index 0000000..f7e194f
--- /dev/null
+++ b/src/preproc/pic/main.cpp
@@ -0,0 +1,664 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "pic.h"
+
+extern int yyparse();
+extern "C" const char *Version_string;
+
+output *out;
+char *graphname; // the picture box name in TeX mode
+
+bool want_flyback = false;
+// groff pic supports '.PY' to work around mm package stepping on 'PF'.
+bool want_alternate_flyback = false;
+int zero_length_line_flag = 0;
+// Non-zero means we're using a groff driver.
+int driver_extension_flag = 1;
+int compatible_flag = 0;
+int safer_flag = 1;
+int command_char = '.'; // the character that introduces lines
+ // that should be passed through transparently
+static int lf_flag = 1; // non-zero if we should attempt to understand
+ // lines beginning with '.lf'
+
+// Non-zero means a parse error was encountered.
+static int had_parse_error = 0;
+
+void do_file(const char *filename);
+
+class top_input : public input {
+ FILE *fp;
+ int bol;
+ int eof;
+ int push_back[3];
+ int start_lineno;
+public:
+ top_input(FILE *);
+ int get();
+ int peek();
+ int get_location(const char **, int *);
+};
+
+top_input::top_input(FILE *p) : fp(p), bol(1), eof(0)
+{
+ push_back[0] = push_back[1] = push_back[2] = EOF;
+ start_lineno = current_lineno;
+}
+
+int top_input::get()
+{
+ if (eof)
+ return EOF;
+ if (push_back[2] != EOF) {
+ int c = push_back[2];
+ push_back[2] = EOF;
+ return c;
+ }
+ else if (push_back[1] != EOF) {
+ int c = push_back[1];
+ push_back[1] = EOF;
+ return c;
+ }
+ else if (push_back[0] != EOF) {
+ int c = push_back[0];
+ push_back[0] = EOF;
+ return c;
+ }
+ int c = getc(fp);
+ while (is_invalid_input_char(c)) {
+ error("invalid input character code %1", int(c));
+ c = getc(fp);
+ bol = 0;
+ }
+ if (bol && c == '.') {
+ c = getc(fp);
+ if (c == 'P') {
+ c = getc(fp);
+ if (c == 'E' || c == 'F' || c == 'Y') {
+ int d = getc(fp);
+ if (d != EOF)
+ ungetc(d, fp);
+ if (d == EOF || d == ' ' || d == '\n' || compatible_flag) {
+ eof = 1;
+ want_flyback = (c == 'F');
+ want_alternate_flyback = (c == 'Y');
+ return EOF;
+ }
+ push_back[0] = c;
+ push_back[1] = 'P';
+ return '.';
+ }
+ if (c == 'S') {
+ c = getc(fp);
+ if (c != EOF)
+ ungetc(c, fp);
+ if (c == EOF || c == ' ' || c == '\n' || compatible_flag) {
+ error("nested .PS");
+ eof = 1;
+ return EOF;
+ }
+ push_back[0] = 'S';
+ push_back[1] = 'P';
+ return '.';
+ }
+ if (c != EOF)
+ ungetc(c, fp);
+ push_back[0] = 'P';
+ return '.';
+ }
+ else {
+ if (c != EOF)
+ ungetc(c, fp);
+ return '.';
+ }
+ }
+ if (c == '\n') {
+ bol = 1;
+ current_lineno++;
+ return '\n';
+ }
+ bol = 0;
+ if (c == EOF) {
+ eof = 1;
+ error("end of file before .PE, .PF, or .PY");
+ error_with_file_and_line(current_filename, start_lineno - 1,
+ ".PS was here");
+ }
+ return c;
+}
+
+int top_input::peek()
+{
+ if (eof)
+ return EOF;
+ if (push_back[2] != EOF)
+ return push_back[2];
+ if (push_back[1] != EOF)
+ return push_back[1];
+ if (push_back[0] != EOF)
+ return push_back[0];
+ int c = getc(fp);
+ while (is_invalid_input_char(c)) {
+ error("invalid input character code %1", int(c));
+ c = getc(fp);
+ bol = 0;
+ }
+ if (bol && c == '.') {
+ c = getc(fp);
+ if (c == 'P') {
+ c = getc(fp);
+ if (c == 'E' || c == 'F' || c == 'Y') {
+ int d = getc(fp);
+ if (d != EOF)
+ ungetc(d, fp);
+ if (d == EOF || d == ' ' || d == '\n' || compatible_flag) {
+ eof = 1;
+ want_flyback = (c == 'F');
+ want_alternate_flyback = (c == 'Y');
+ return EOF;
+ }
+ push_back[0] = c;
+ push_back[1] = 'P';
+ push_back[2] = '.';
+ return '.';
+ }
+ if (c == 'S') {
+ c = getc(fp);
+ if (c != EOF)
+ ungetc(c, fp);
+ if (c == EOF || c == ' ' || c == '\n' || compatible_flag) {
+ error("nested .PS");
+ eof = 1;
+ return EOF;
+ }
+ push_back[0] = 'S';
+ push_back[1] = 'P';
+ push_back[2] = '.';
+ return '.';
+ }
+ if (c != EOF)
+ ungetc(c, fp);
+ push_back[0] = 'P';
+ push_back[1] = '.';
+ return '.';
+ }
+ else {
+ if (c != EOF)
+ ungetc(c, fp);
+ push_back[0] = '.';
+ return '.';
+ }
+ }
+ if (c != EOF)
+ ungetc(c, fp);
+ if (c == '\n')
+ return '\n';
+ return c;
+}
+
+int top_input::get_location(const char **filenamep, int *linenop)
+{
+ *filenamep = current_filename;
+ *linenop = current_lineno;
+ return 1;
+}
+
+void do_picture(FILE *fp)
+{
+ want_flyback = false;
+ int c;
+ if (!graphname)
+ free(graphname);
+ graphname = strsave("graph"); // default picture name in TeX mode
+ while ((c = getc(fp)) == ' ')
+ ;
+ if (c == '<') {
+ string filename;
+ while ((c = getc(fp)) == ' ')
+ ;
+ while (c != EOF && c != ' ' && c != '\n') {
+ filename += char(c);
+ c = getc(fp);
+ }
+ if (c == ' ') {
+ do {
+ c = getc(fp);
+ } while (c != EOF && c != '\n');
+ }
+ if (c == '\n')
+ current_lineno++;
+ if (filename.length() == 0)
+ error("missing filename after '<'");
+ else {
+ filename += '\0';
+ const char *old_filename = current_filename;
+ int old_lineno = current_lineno;
+ // filenames must be permanent
+ do_file(strsave(filename.contents()));
+ current_filename = old_filename;
+ current_lineno = old_lineno;
+ }
+ out->set_location(current_filename, current_lineno);
+ }
+ else {
+ out->set_location(current_filename, current_lineno);
+ string start_line;
+ while (c != EOF) {
+ if (c == '\n') {
+ current_lineno++;
+ break;
+ }
+ start_line += c;
+ c = getc(fp);
+ }
+ if (c == EOF)
+ return;
+ start_line += '\0';
+ double wid, ht;
+ switch (sscanf(&start_line[0], "%lf %lf", &wid, &ht)) {
+ case 1:
+ ht = 0.0;
+ break;
+ case 2:
+ break;
+ default:
+ ht = wid = 0.0;
+ break;
+ }
+ out->set_desired_width_height(wid, ht);
+ out->set_args(start_line.contents());
+ lex_init(new top_input(fp));
+ if (yyparse()) {
+ had_parse_error = 1;
+ lex_error("giving up on this picture");
+ }
+ parse_cleanup();
+ lex_cleanup();
+
+ // skip the rest of the .PE/.PF/.PY line
+ while ((c = getc(fp)) != EOF && c != '\n')
+ ;
+ if (c == '\n')
+ current_lineno++;
+ out->set_location(current_filename, current_lineno);
+ }
+}
+
+void do_file(const char *filename)
+{
+ FILE *fp;
+ if (strcmp(filename, "-") == 0)
+ fp = stdin;
+ else {
+ errno = 0;
+ fp = fopen(filename, "r");
+ if (fp == 0) {
+ delete out;
+ fatal("can't open '%1': %2", filename, strerror(errno));
+ }
+ }
+ string fn(filename);
+ fn += '\0';
+ normalize_for_lf(fn);
+ current_filename = fn.contents();
+ out->set_location(current_filename, 1);
+ current_lineno = 1;
+ enum { START, MIDDLE, HAD_DOT, HAD_P, HAD_PS, HAD_l, HAD_lf } state = START;
+ for (;;) {
+ int c = getc(fp);
+ while (is_invalid_input_char(c)) {
+ error("invalid input character code %1", int(c));
+ c = getc(fp);
+ }
+ if (c == EOF)
+ break;
+ switch (state) {
+ case START:
+ if (c == '.')
+ state = HAD_DOT;
+ else {
+ putchar(c);
+ if (c == '\n') {
+ current_lineno++;
+ state = START;
+ }
+ else
+ state = MIDDLE;
+ }
+ break;
+ case MIDDLE:
+ putchar(c);
+ if (c == '\n') {
+ current_lineno++;
+ state = START;
+ }
+ break;
+ case HAD_DOT:
+ if (c == 'P')
+ state = HAD_P;
+ else if (lf_flag && c == 'l')
+ state = HAD_l;
+ else {
+ putchar('.');
+ putchar(c);
+ if (c == '\n') {
+ current_lineno++;
+ state = START;
+ }
+ else
+ state = MIDDLE;
+ }
+ break;
+ case HAD_P:
+ if (c == 'S')
+ state = HAD_PS;
+ else {
+ putchar('.');
+ putchar('P');
+ putchar(c);
+ if (c == '\n') {
+ current_lineno++;
+ state = START;
+ }
+ else
+ state = MIDDLE;
+ }
+ break;
+ case HAD_PS:
+ if (c == ' ' || c == '\n' || compatible_flag) {
+ ungetc(c, fp);
+ do_picture(fp);
+ state = START;
+ }
+ else {
+ fputs(".PS", stdout);
+ putchar(c);
+ state = MIDDLE;
+ }
+ break;
+ case HAD_l:
+ if (c == 'f')
+ state = HAD_lf;
+ else {
+ putchar('.');
+ putchar('l');
+ putchar(c);
+ if (c == '\n') {
+ current_lineno++;
+ state = START;
+ }
+ else
+ state = MIDDLE;
+ }
+ break;
+ case HAD_lf:
+ if (c == ' ' || c == '\n' || compatible_flag) {
+ string line;
+ while (c != EOF) {
+ line += c;
+ if (c == '\n') {
+ current_lineno++;
+ break;
+ }
+ c = getc(fp);
+ }
+ line += '\0';
+ interpret_lf_args(line.contents());
+ printf(".lf%s", line.contents());
+ state = START;
+ }
+ else {
+ fputs(".lf", stdout);
+ putchar(c);
+ state = MIDDLE;
+ }
+ break;
+ default:
+ assert(0);
+ }
+ }
+ switch (state) {
+ case START:
+ break;
+ case MIDDLE:
+ putchar('\n');
+ break;
+ case HAD_DOT:
+ fputs(".\n", stdout);
+ break;
+ case HAD_P:
+ fputs(".P\n", stdout);
+ break;
+ case HAD_PS:
+ fputs(".PS\n", stdout);
+ break;
+ case HAD_l:
+ fputs(".l\n", stdout);
+ break;
+ case HAD_lf:
+ fputs(".lf\n", stdout);
+ break;
+ }
+ if (fp != stdin)
+ fclose(fp);
+}
+
+#ifdef FIG_SUPPORT
+void do_whole_file(const char *filename)
+{
+ // Do not set current_filename.
+ FILE *fp;
+ if (strcmp(filename, "-") == 0)
+ fp = stdin;
+ else {
+ errno = 0;
+ fp = fopen(filename, "r");
+ if (fp == 0)
+ fatal("can't open '%1': %2", filename, strerror(errno));
+ }
+ lex_init(new file_input(fp, filename));
+ if (yyparse())
+ had_parse_error = 1;
+ parse_cleanup();
+ lex_cleanup();
+}
+#endif
+
+void usage(FILE *stream)
+{
+ fprintf(stream, "usage: %s [-CnSU] [file ...]\n", program_name);
+#ifdef TEX_SUPPORT
+ fprintf(stream, "usage: %s -t [-cCSUz] [file ...]\n", program_name);
+#endif
+#ifdef FIG_SUPPORT
+ fprintf(stream, "usage: %s -f [-v] [file]\n", program_name);
+#endif
+ fprintf(stream, "usage: %s {-v | --version}\n", program_name);
+ fprintf(stream, "usage: %s --help\n", program_name);
+}
+
+#if defined(__MSDOS__) || defined(__EMX__)
+static char *fix_program_name(char *arg, char *dflt)
+{
+ if (!arg)
+ return dflt;
+ char *prog = strchr(arg, '\0');
+ for (;;) {
+ if (prog == arg)
+ break;
+ --prog;
+ if (strchr("\\/:", *prog)) {
+ prog++;
+ break;
+ }
+ }
+ char *ext = strchr(prog, '.');
+ if (ext)
+ *ext = '\0';
+ for (char *p = prog; *p; p++)
+ if ('A' <= *p && *p <= 'Z')
+ *p = 'a' + (*p - 'A');
+ return prog;
+}
+#endif /* __MSDOS__ || __EMX__ */
+
+int main(int argc, char **argv)
+{
+ setlocale(LC_NUMERIC, "C");
+#if defined(__MSDOS__) || defined(__EMX__)
+ argv[0] = fix_program_name(argv[0], "pic");
+#endif /* __MSDOS__ || __EMX__ */
+ program_name = argv[0];
+ static char stderr_buf[BUFSIZ];
+ setbuf(stderr, stderr_buf);
+ int opt;
+#ifdef TEX_SUPPORT
+ int tex_flag = 0;
+ int tpic_flag = 0;
+#endif
+#ifdef FIG_SUPPORT
+ int whole_file_flag = 0;
+ int fig_flag = 0;
+#endif
+ static const struct option long_options[] = {
+ { "help", no_argument, 0, CHAR_MAX + 1 },
+ { "version", no_argument, 0, 'v' },
+ { NULL, 0, 0, 0 }
+ };
+ while ((opt = getopt_long(argc, argv, "T:CDSUtcvnxzpf", long_options, NULL))
+ != EOF)
+ switch (opt) {
+ case 'C':
+ compatible_flag = 1;
+ break;
+ case 'D':
+ case 'T':
+ break;
+ case 'S':
+ safer_flag = 1;
+ break;
+ case 'U':
+ safer_flag = 0;
+ break;
+ case 'f':
+#ifdef FIG_SUPPORT
+ whole_file_flag++;
+ fig_flag++;
+#else
+ fatal("fig support not included");
+#endif
+ break;
+ case 'n':
+ driver_extension_flag = 0;
+ break;
+ case 'p':
+ case 'x':
+ warning("-%1 option is obsolete", char(opt));
+ break;
+ case 't':
+#ifdef TEX_SUPPORT
+ tex_flag++;
+#else
+ fatal("TeX support not included");
+#endif
+ break;
+ case 'c':
+#ifdef TEX_SUPPORT
+ tpic_flag++;
+#else
+ fatal("TeX support not included");
+#endif
+ break;
+ case 'v':
+ {
+ printf("GNU pic (groff) version %s\n", Version_string);
+ exit(0);
+ break;
+ }
+ case 'z':
+ // zero length lines will be printed as dots
+ zero_length_line_flag++;
+ break;
+ case CHAR_MAX + 1: // --help
+ usage(stdout);
+ exit(0);
+ break;
+ case '?':
+ usage(stderr);
+ exit(1);
+ break;
+ default:
+ assert(0);
+ }
+ parse_init();
+#ifdef TEX_SUPPORT
+ if (tpic_flag) {
+ out = make_tpic_output();
+ lf_flag = 0;
+ }
+ else if (tex_flag) {
+ out = make_tex_output();
+ command_char = '\\';
+ lf_flag = 0;
+ }
+ else
+#endif
+#ifdef FIG_SUPPORT
+ if (fig_flag)
+ out = make_fig_output();
+ else
+#endif
+ {
+ out = make_troff_output();
+ printf(".do if !dPS .ds PS\n"
+ ".do if !dPE .ds PE\n"
+ ".do if !dPF .ds PF\n"
+ ".do if !dPY .ds PY\n");
+ }
+#ifdef FIG_SUPPORT
+ if (whole_file_flag) {
+ if (optind >= argc)
+ do_whole_file("-");
+ else if (argc - optind > 1) {
+ usage(stderr);
+ exit(1);
+ } else
+ do_whole_file(argv[optind]);
+ }
+ else {
+#endif
+ if (optind >= argc)
+ do_file("-");
+ else
+ for (int i = optind; i < argc; i++)
+ do_file(argv[i]);
+#ifdef FIG_SUPPORT
+ }
+#endif
+ delete out;
+ if (ferror(stdout) || fflush(stdout) < 0)
+ fatal("output error");
+ return had_parse_error;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/pic/object.cpp b/src/preproc/pic/object.cpp
new file mode 100644
index 0000000..e207fb1
--- /dev/null
+++ b/src/preproc/pic/object.cpp
@@ -0,0 +1,2079 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#include "pic.h"
+#include "ptable.h"
+#include "object.h"
+
+void print_object_list(object *);
+
+line_type::line_type()
+: type(solid), thickness(1.0)
+{
+}
+
+output::output() : args(0), desired_height(0.0), desired_width(0.0)
+{
+}
+
+output::~output()
+{
+ delete[] args;
+}
+
+void output::set_desired_width_height(double wid, double ht)
+{
+ desired_width = wid;
+ desired_height = ht;
+}
+
+void output::set_args(const char *s)
+{
+ delete[] args;
+ if (s == 0 || *s == '\0')
+ args = 0;
+ else
+ args = strsave(s);
+}
+
+int output::supports_filled_polygons()
+{
+ return 0;
+}
+
+void output::begin_block(const position &, const position &)
+{
+}
+
+void output::end_block()
+{
+}
+
+double output::compute_scale(double sc, const position &ll, const position &ur)
+{
+ distance dim = ur - ll;
+ if (desired_width != 0.0 || desired_height != 0.0) {
+ sc = 0.0;
+ if (desired_width != 0.0) {
+ if (dim.x == 0.0)
+ error("width specified for picture with zero width");
+ else
+ sc = dim.x/desired_width;
+ }
+ if (desired_height != 0.0) {
+ if (dim.y == 0.0)
+ error("height specified for picture with zero height");
+ else {
+ double tem = dim.y/desired_height;
+ if (tem > sc)
+ sc = tem;
+ }
+ }
+ return sc == 0.0 ? 1.0 : sc;
+ }
+ else {
+ if (sc <= 0.0)
+ sc = 1.0;
+ distance sdim = dim/sc;
+ double max_width = 0.0;
+ lookup_variable("maxpswid", &max_width);
+ double max_height = 0.0;
+ lookup_variable("maxpsht", &max_height);
+ if ((max_width > 0.0 && sdim.x > max_width)
+ || (max_height > 0.0 && sdim.y > max_height)) {
+ double xscale = dim.x/max_width;
+ double yscale = dim.y/max_height;
+ return xscale > yscale ? xscale : yscale;
+ }
+ else
+ return sc;
+ }
+}
+
+position::position(const place &pl)
+{
+ if (pl.obj != 0) {
+ // Use two statements to work around bug in SGI C++.
+ object *tem = pl.obj;
+ *this = tem->origin();
+ }
+ else {
+ x = pl.x;
+ y = pl.y;
+ }
+}
+
+position::position() : x(0.0), y(0.0)
+{
+}
+
+position::position(double a, double b) : x(a), y(b)
+{
+}
+
+
+int operator==(const position &a, const position &b)
+{
+ return a.x == b.x && a.y == b.y;
+}
+
+int operator!=(const position &a, const position &b)
+{
+ return a.x != b.x || a.y != b.y;
+}
+
+position &position::operator+=(const position &a)
+{
+ x += a.x;
+ y += a.y;
+ return *this;
+}
+
+position &position::operator-=(const position &a)
+{
+ x -= a.x;
+ y -= a.y;
+ return *this;
+}
+
+position &position::operator*=(double a)
+{
+ x *= a;
+ y *= a;
+ return *this;
+}
+
+position &position::operator/=(double a)
+{
+ x /= a;
+ y /= a;
+ return *this;
+}
+
+position operator-(const position &a)
+{
+ return position(-a.x, -a.y);
+}
+
+position operator+(const position &a, const position &b)
+{
+ return position(a.x + b.x, a.y + b.y);
+}
+
+position operator-(const position &a, const position &b)
+{
+ return position(a.x - b.x, a.y - b.y);
+}
+
+position operator/(const position &a, double n)
+{
+ return position(a.x/n, a.y/n);
+}
+
+position operator*(const position &a, double n)
+{
+ return position(a.x*n, a.y*n);
+}
+
+// dot product
+
+double operator*(const position &a, const position &b)
+{
+ return a.x*b.x + a.y*b.y;
+}
+
+double hypot(const position &a)
+{
+ return groff_hypot(a.x, a.y);
+}
+
+struct arrow_head_type {
+ double height;
+ double width;
+ int solid;
+};
+
+void draw_arrow(const position &pos, const distance &dir,
+ const arrow_head_type &aht, const line_type &lt,
+ char *outline_color_for_fill)
+{
+ double hyp = hypot(dir);
+ if (hyp == 0.0) {
+ error("cannot draw arrow on object with zero length");
+ return;
+ }
+ position base = -dir;
+ base *= aht.height/hyp;
+ position n(dir.y, -dir.x);
+ n *= aht.width/(hyp*2.0);
+ line_type slt = lt;
+ slt.type = line_type::solid;
+ if (aht.solid && out->supports_filled_polygons()) {
+ position v[3];
+ v[0] = pos;
+ v[1] = pos + base + n;
+ v[2] = pos + base - n;
+ // fill with outline color
+ out->set_color(outline_color_for_fill, outline_color_for_fill);
+ // make stroke thin to avoid arrow sticking
+ slt.thickness = 0.1;
+ out->polygon(v, 3, slt, 1);
+ }
+ else {
+ // use two line segments to avoid arrow sticking
+ out->line(pos + base - n, &pos, 1, slt);
+ out->line(pos + base + n, &pos, 1, slt);
+ }
+}
+
+object::object() : prev(0), next(0)
+{
+}
+
+object::~object()
+{
+}
+
+void object::move_by(const position &)
+{
+}
+
+void object::print()
+{
+}
+
+void object::print_text()
+{
+}
+
+int object::blank()
+{
+ return 0;
+}
+
+struct bounding_box {
+ int blank;
+ position ll;
+ position ur;
+
+ bounding_box();
+ void encompass(const position &);
+};
+
+bounding_box::bounding_box()
+: blank(1)
+{
+}
+
+void bounding_box::encompass(const position &pos)
+{
+ if (blank) {
+ ll = pos;
+ ur = pos;
+ blank = 0;
+ }
+ else {
+ if (pos.x < ll.x)
+ ll.x = pos.x;
+ if (pos.y < ll.y)
+ ll.y = pos.y;
+ if (pos.x > ur.x)
+ ur.x = pos.x;
+ if (pos.y > ur.y)
+ ur.y = pos.y;
+ }
+}
+
+void object::update_bounding_box(bounding_box *)
+{
+}
+
+position object::origin()
+{
+ return position(0.0,0.0);
+}
+
+position object::north()
+{
+ return origin();
+}
+
+position object::south()
+{
+ return origin();
+}
+
+position object::east()
+{
+ return origin();
+}
+
+position object::west()
+{
+ return origin();
+}
+
+position object::north_east()
+{
+ return origin();
+}
+
+position object::north_west()
+{
+ return origin();
+}
+
+position object::south_east()
+{
+ return origin();
+}
+
+position object::south_west()
+{
+ return origin();
+}
+
+position object::start()
+{
+ return origin();
+}
+
+position object::end()
+{
+ return origin();
+}
+
+position object::center()
+{
+ return origin();
+}
+
+double object::width()
+{
+ return 0.0;
+}
+
+double object::radius()
+{
+ return 0.0;
+}
+
+double object::height()
+{
+ return 0.0;
+}
+
+place *object::find_label(const char *)
+{
+ return 0;
+}
+
+segment::segment(const position &a, int n, segment *p)
+: is_absolute(n), pos(a), next(p)
+{
+}
+
+text_item::text_item(char *t, const char *fn, int ln)
+: next(0), text(t), filename(fn), lineno(ln)
+{
+ adj.h = CENTER_ADJUST;
+ adj.v = NONE_ADJUST;
+}
+
+text_item::~text_item()
+{
+ delete[] text;
+}
+
+object_spec::object_spec(object_type t) : type(t)
+{
+ flags = 0;
+ tbl = 0;
+ segment_list = 0;
+ segment_width = segment_height = 0.0;
+ segment_is_absolute = 0;
+ text = 0;
+ shaded = 0;
+ xslanted = 0;
+ yslanted = 0;
+ outlined = 0;
+ with = 0;
+ dir = RIGHT_DIRECTION;
+}
+
+object_spec::~object_spec()
+{
+ delete tbl;
+ while (segment_list != 0) {
+ segment *tem = segment_list;
+ segment_list = segment_list->next;
+ delete tem;
+ }
+ object *p = oblist.head;
+ while (p != 0) {
+ object *tem = p;
+ p = p->next;
+ delete tem;
+ }
+ while (text != 0) {
+ text_item *tem = text;
+ text = text->next;
+ delete tem;
+ }
+ delete with;
+ delete[] shaded;
+ delete[] outlined;
+}
+
+class command_object : public object {
+ char *s;
+ const char *filename;
+ int lineno;
+public:
+ command_object(char *, const char *, int);
+ ~command_object();
+ object_type type() { return OTHER_OBJECT; }
+ void print();
+};
+
+command_object::command_object(char *p, const char *fn, int ln)
+: s(p), filename(fn), lineno(ln)
+{
+}
+
+command_object::~command_object()
+{
+ delete[] s;
+}
+
+void command_object::print()
+{
+ out->command(s, filename, lineno);
+}
+
+object *make_command_object(char *s, const char *fn, int ln)
+{
+ return new command_object(s, fn, ln);
+}
+
+class mark_object : public object {
+public:
+ mark_object();
+ object_type type();
+};
+
+object *make_mark_object()
+{
+ return new mark_object();
+}
+
+mark_object::mark_object()
+{
+}
+
+object_type mark_object::type()
+{
+ return MARK_OBJECT;
+}
+
+object_list::object_list() : head(0), tail(0)
+{
+}
+
+void object_list::append(object *obj)
+{
+ if (tail == 0) {
+ obj->next = obj->prev = 0;
+ head = tail = obj;
+ }
+ else {
+ obj->prev = tail;
+ obj->next = 0;
+ tail->next = obj;
+ tail = obj;
+ }
+}
+
+void object_list::wrap_up_block(object_list *ol)
+{
+ object *p;
+ for (p = tail; p && p->type() != MARK_OBJECT; p = p->prev)
+ ;
+ assert(p != 0);
+ ol->head = p->next;
+ if (ol->head) {
+ ol->tail = tail;
+ ol->head->prev = 0;
+ }
+ else
+ ol->tail = 0;
+ tail = p->prev;
+ if (tail)
+ tail->next = 0;
+ else
+ head = 0;
+ delete p;
+}
+
+text_piece::text_piece()
+: text(0), filename(0), lineno(-1)
+{
+ adj.h = CENTER_ADJUST;
+ adj.v = NONE_ADJUST;
+}
+
+text_piece::~text_piece()
+{
+ free(text);
+}
+
+class graphic_object : public object {
+ int ntext;
+ text_piece *text;
+ int aligned;
+protected:
+ line_type lt;
+ char *outline_color;
+ char *color_fill;
+public:
+ graphic_object();
+ ~graphic_object();
+ object_type type() = 0;
+ void print_text();
+ void add_text(text_item *, int);
+ void set_dotted(double);
+ void set_dashed(double);
+ void set_thickness(double);
+ void set_invisible();
+ void set_outline_color(char *);
+ char *get_outline_color();
+ virtual void set_fill(double);
+ virtual void set_xslanted(double);
+ virtual void set_yslanted(double);
+ virtual void set_fill_color(char *);
+};
+
+graphic_object::graphic_object()
+: ntext(0), text(0), aligned(0), outline_color(0), color_fill(0)
+{
+}
+
+void graphic_object::set_dotted(double wid)
+{
+ lt.type = line_type::dotted;
+ lt.dash_width = wid;
+}
+
+void graphic_object::set_dashed(double wid)
+{
+ lt.type = line_type::dashed;
+ lt.dash_width = wid;
+}
+
+void graphic_object::set_thickness(double th)
+{
+ lt.thickness = th;
+}
+
+void graphic_object::set_fill(double)
+{
+}
+
+void graphic_object::set_xslanted(double)
+{
+}
+
+void graphic_object::set_yslanted(double)
+{
+}
+
+void graphic_object::set_fill_color(char *c)
+{
+ color_fill = strsave(c);
+}
+
+void graphic_object::set_outline_color(char *c)
+{
+ outline_color = strsave(c);
+}
+
+char *graphic_object::get_outline_color()
+{
+ return outline_color;
+}
+
+void graphic_object::set_invisible()
+{
+ lt.type = line_type::invisible;
+}
+
+void graphic_object::add_text(text_item *t, int a)
+{
+ aligned = a;
+ int len = 0;
+ text_item *p;
+ for (p = t; p; p = p->next)
+ len++;
+ if (len == 0)
+ text = 0;
+ else {
+ text = new text_piece[len];
+ for (p = t, len = 0; p; p = p->next, len++) {
+ text[len].text = p->text;
+ p->text = 0;
+ text[len].adj = p->adj;
+ text[len].filename = p->filename;
+ text[len].lineno = p->lineno;
+ }
+ }
+ ntext = len;
+}
+
+void graphic_object::print_text()
+{
+ double angle = 0.0;
+ if (aligned) {
+ position d(end() - start());
+ if (d.x != 0.0 || d.y != 0.0)
+ angle = atan2(d.y, d.x);
+ }
+ if (text != 0) {
+ out->set_color(color_fill, get_outline_color());
+ out->text(center(), text, ntext, angle);
+ out->reset_color();
+ }
+}
+
+graphic_object::~graphic_object()
+{
+ if (text)
+ delete[] text;
+}
+
+class rectangle_object : public graphic_object {
+protected:
+ position cent;
+ position dim;
+public:
+ rectangle_object(const position &);
+ double width() { return dim.x; }
+ double height() { return dim.y; }
+ position origin() { return cent; }
+ position center() { return cent; }
+ position north() { return position(cent.x, cent.y + dim.y/2.0); }
+ position south() { return position(cent.x, cent.y - dim.y/2.0); }
+ position east() { return position(cent.x + dim.x/2.0, cent.y); }
+ position west() { return position(cent.x - dim.x/2.0, cent.y); }
+ position north_east() { return position(cent.x + dim.x/2.0, cent.y + dim.y/2.0); }
+ position north_west() { return position(cent.x - dim.x/2.0, cent.y + dim.y/2.0); }
+ position south_east() { return position(cent.x + dim.x/2.0, cent.y - dim.y/2.0); }
+ position south_west() { return position(cent.x - dim.x/2.0, cent.y - dim.y/2.0); }
+ object_type type() = 0;
+ void update_bounding_box(bounding_box *);
+ void move_by(const position &);
+};
+
+rectangle_object::rectangle_object(const position &d)
+: dim(d)
+{
+}
+
+void rectangle_object::update_bounding_box(bounding_box *p)
+{
+ p->encompass(cent - dim/2.0);
+ p->encompass(cent + dim/2.0);
+}
+
+void rectangle_object::move_by(const position &a)
+{
+ cent += a;
+}
+
+class closed_object : public rectangle_object {
+public:
+ closed_object(const position &);
+ object_type type() = 0;
+ void set_fill(double);
+ void set_xslanted(double);
+ void set_yslanted(double);
+ void set_fill_color(char *fill);
+protected:
+ double fill; // < 0 if not filled
+ double xslanted; // !=0 if x is slanted
+ double yslanted; // !=0 if y is slanted
+ char *color_fill; // = 0 if not colored
+};
+
+closed_object::closed_object(const position &pos)
+: rectangle_object(pos), fill(-1.0), xslanted(0), yslanted(0), color_fill(0)
+{
+}
+
+void closed_object::set_fill(double f)
+{
+ assert(f >= 0.0);
+ fill = f;
+}
+
+/* accept positive and negative values */
+void closed_object::set_xslanted(double s)
+{
+ //assert(s >= 0.0);
+ xslanted = s;
+}
+/* accept positive and negative values */
+void closed_object::set_yslanted(double s)
+{
+ //assert(s >= 0.0);
+ yslanted = s;
+}
+
+void closed_object::set_fill_color(char *f)
+{
+ color_fill = strsave(f);
+}
+
+class box_object : public closed_object {
+ double xrad;
+ double yrad;
+public:
+ box_object(const position &, double);
+ object_type type() { return BOX_OBJECT; }
+ void print();
+ position north_east();
+ position north_west();
+ position south_east();
+ position south_west();
+};
+
+box_object::box_object(const position &pos, double r)
+: closed_object(pos), xrad(dim.x > 0 ? r : -r), yrad(dim.y > 0 ? r : -r)
+{
+}
+
+const double CHOP_FACTOR = 1.0 - 1.0/M_SQRT2;
+
+position box_object::north_east()
+{
+ return position(cent.x + dim.x/2.0 - CHOP_FACTOR*xrad,
+ cent.y + dim.y/2.0 - CHOP_FACTOR*yrad);
+}
+
+position box_object::north_west()
+{
+ return position(cent.x - dim.x/2.0 + CHOP_FACTOR*xrad,
+ cent.y + dim.y/2.0 - CHOP_FACTOR*yrad);
+}
+
+position box_object::south_east()
+{
+ return position(cent.x + dim.x/2.0 - CHOP_FACTOR*xrad,
+ cent.y - dim.y/2.0 + CHOP_FACTOR*yrad);
+}
+
+position box_object::south_west()
+{
+ return position(cent.x - dim.x/2.0 + CHOP_FACTOR*xrad,
+ cent.y - dim.y/2.0 + CHOP_FACTOR*yrad);
+}
+
+void box_object::print()
+{
+ if (lt.type == line_type::invisible && fill < 0.0 && color_fill == 0)
+ return;
+ out->set_color(color_fill, graphic_object::get_outline_color());
+ if (xrad == 0.0) {
+ distance dim2 = dim/2.0;
+ position vec[4];
+ /* error("x slanted %1", xslanted); */
+ /* error("y slanted %1", yslanted); */
+ vec[0] = cent + position(dim2.x, -(dim2.y - yslanted)); /* lr */
+ vec[1] = cent + position(dim2.x + xslanted, dim2.y + yslanted); /* ur */
+ vec[2] = cent + position(-(dim2.x - xslanted), dim2.y); /* ul */
+ vec[3] = cent + position(-(dim2.x), -dim2.y); /* ll */
+ out->polygon(vec, 4, lt, fill);
+ }
+ else {
+ distance abs_dim(fabs(dim.x), fabs(dim.y));
+ out->rounded_box(cent, abs_dim, fabs(xrad), lt, fill, color_fill);
+ }
+ out->reset_color();
+}
+
+graphic_object *object_spec::make_box(position *curpos, direction *dirp)
+{
+ static double last_box_height;
+ static double last_box_width;
+ static double last_box_radius;
+ static int have_last_box = 0;
+ if (!(flags & HAS_HEIGHT)) {
+ if ((flags & IS_SAME) && have_last_box)
+ height = last_box_height;
+ else
+ lookup_variable("boxht", &height);
+ }
+ if (!(flags & HAS_WIDTH)) {
+ if ((flags & IS_SAME) && have_last_box)
+ width = last_box_width;
+ else
+ lookup_variable("boxwid", &width);
+ }
+ if (!(flags & HAS_RADIUS)) {
+ if ((flags & IS_SAME) && have_last_box)
+ radius = last_box_radius;
+ else
+ lookup_variable("boxrad", &radius);
+ }
+ last_box_width = width;
+ last_box_height = height;
+ last_box_radius = radius;
+ have_last_box = 1;
+ radius = fabs(radius);
+ if (radius*2.0 > fabs(width))
+ radius = fabs(width/2.0);
+ if (radius*2.0 > fabs(height))
+ radius = fabs(height/2.0);
+ box_object *p = new box_object(position(width, height), radius);
+ if (!position_rectangle(p, curpos, dirp)) {
+ delete p;
+ p = 0;
+ }
+ return p;
+}
+
+// return non-zero for success
+
+int object_spec::position_rectangle(rectangle_object *p,
+ position *curpos, direction *dirp)
+{
+ position pos;
+ dir = *dirp; // ignore any direction in attribute list
+ position motion;
+ switch (dir) {
+ case UP_DIRECTION:
+ motion.y = p->height()/2.0;
+ break;
+ case DOWN_DIRECTION:
+ motion.y = -p->height()/2.0;
+ break;
+ case LEFT_DIRECTION:
+ motion.x = -p->width()/2.0;
+ break;
+ case RIGHT_DIRECTION:
+ motion.x = p->width()/2.0;
+ break;
+ default:
+ assert(0);
+ }
+ if (flags & HAS_AT) {
+ pos = at;
+ if (flags & HAS_WITH) {
+ place offset;
+ place here;
+ here.obj = p;
+ if (!with->follow(here, &offset))
+ return 0;
+ pos -= offset;
+ }
+ }
+ else {
+ pos = *curpos;
+ pos += motion;
+ }
+ p->move_by(pos);
+ pos += motion;
+ *curpos = pos;
+ return 1;
+}
+
+class block_object : public rectangle_object {
+ object_list oblist;
+ PTABLE(place) *tbl;
+public:
+ block_object(const position &, const object_list &ol, PTABLE(place) *t);
+ ~block_object();
+ place *find_label(const char *);
+ object_type type();
+ void move_by(const position &);
+ void print();
+};
+
+block_object::block_object(const position &d, const object_list &ol,
+ PTABLE(place) *t)
+: rectangle_object(d), oblist(ol), tbl(t)
+{
+}
+
+block_object::~block_object()
+{
+ delete tbl;
+ object *p = oblist.head;
+ while (p != 0) {
+ object *tem = p;
+ p = p->next;
+ delete tem;
+ }
+}
+
+void block_object::print()
+{
+ out->begin_block(south_west(), north_east());
+ print_object_list(oblist.head);
+ out->end_block();
+}
+
+static void adjust_objectless_places(PTABLE(place) *tbl, const position &a)
+{
+ // Adjust all the labels that aren't attached to objects.
+ PTABLE_ITERATOR(place) iter(tbl);
+ const char *key;
+ place *pl;
+ while (iter.next(&key, &pl))
+ if (key && csupper(key[0]) && pl->obj == 0) {
+ pl->x += a.x;
+ pl->y += a.y;
+ }
+}
+
+void block_object::move_by(const position &a)
+{
+ cent += a;
+ for (object *p = oblist.head; p; p = p->next)
+ p->move_by(a);
+ adjust_objectless_places(tbl, a);
+}
+
+
+place *block_object::find_label(const char *name)
+{
+ return tbl->lookup(name);
+}
+
+object_type block_object::type()
+{
+ return BLOCK_OBJECT;
+}
+
+graphic_object *object_spec::make_block(position *curpos, direction *dirp)
+{
+ bounding_box bb;
+ for (object *p = oblist.head; p; p = p->next)
+ p->update_bounding_box(&bb);
+ position dim;
+ if (!bb.blank) {
+ position m = -(bb.ll + bb.ur)/2.0;
+ for (object *p = oblist.head; p; p = p->next)
+ p->move_by(m);
+ adjust_objectless_places(tbl, m);
+ dim = bb.ur - bb.ll;
+ }
+ if (flags & HAS_WIDTH)
+ dim.x = width;
+ if (flags & HAS_HEIGHT)
+ dim.y = height;
+ block_object *block = new block_object(dim, oblist, tbl);
+ if (!position_rectangle(block, curpos, dirp)) {
+ delete block;
+ block = 0;
+ }
+ tbl = 0;
+ oblist.head = oblist.tail = 0;
+ return block;
+}
+
+class text_object : public rectangle_object {
+public:
+ text_object(const position &);
+ object_type type() { return TEXT_OBJECT; }
+};
+
+text_object::text_object(const position &d)
+: rectangle_object(d)
+{
+}
+
+graphic_object *object_spec::make_text(position *curpos, direction *dirp)
+{
+ if (!(flags & HAS_HEIGHT)) {
+ lookup_variable("textht", &height);
+ int nitems = 0;
+ for (text_item *t = text; t; t = t->next)
+ nitems++;
+ height *= nitems;
+ }
+ if (!(flags & HAS_WIDTH))
+ lookup_variable("textwid", &width);
+ text_object *p = new text_object(position(width, height));
+ if (!position_rectangle(p, curpos, dirp)) {
+ delete p;
+ p = 0;
+ }
+ return p;
+}
+
+
+class ellipse_object : public closed_object {
+public:
+ ellipse_object(const position &);
+ position north_east() { return position(cent.x + dim.x/(M_SQRT2*2.0),
+ cent.y + dim.y/(M_SQRT2*2.0)); }
+ position north_west() { return position(cent.x - dim.x/(M_SQRT2*2.0),
+ cent.y + dim.y/(M_SQRT2*2.0)); }
+ position south_east() { return position(cent.x + dim.x/(M_SQRT2*2.0),
+ cent.y - dim.y/(M_SQRT2*2.0)); }
+ position south_west() { return position(cent.x - dim.x/(M_SQRT2*2.0),
+ cent.y - dim.y/(M_SQRT2*2.0)); }
+ double radius() { return dim.x/2.0; }
+ object_type type() { return ELLIPSE_OBJECT; }
+ void print();
+};
+
+ellipse_object::ellipse_object(const position &d)
+: closed_object(d)
+{
+}
+
+void ellipse_object::print()
+{
+ if (lt.type == line_type::invisible && fill < 0.0 && color_fill == 0)
+ return;
+ out->set_color(color_fill, graphic_object::get_outline_color());
+ out->ellipse(cent, dim, lt, fill);
+ out->reset_color();
+}
+
+graphic_object *object_spec::make_ellipse(position *curpos, direction *dirp)
+{
+ static double last_ellipse_height;
+ static double last_ellipse_width;
+ static int have_last_ellipse = 0;
+ if (!(flags & HAS_HEIGHT)) {
+ if ((flags & IS_SAME) && have_last_ellipse)
+ height = last_ellipse_height;
+ else
+ lookup_variable("ellipseht", &height);
+ }
+ if (!(flags & HAS_WIDTH)) {
+ if ((flags & IS_SAME) && have_last_ellipse)
+ width = last_ellipse_width;
+ else
+ lookup_variable("ellipsewid", &width);
+ }
+ last_ellipse_width = width;
+ last_ellipse_height = height;
+ have_last_ellipse = 1;
+ ellipse_object *p = new ellipse_object(position(width, height));
+ if (!position_rectangle(p, curpos, dirp)) {
+ delete p;
+ return 0;
+ }
+ return p;
+}
+
+class circle_object : public ellipse_object {
+public:
+ circle_object(double);
+ object_type type() { return CIRCLE_OBJECT; }
+ void print();
+};
+
+circle_object::circle_object(double diam)
+: ellipse_object(position(diam, diam))
+{
+}
+
+void circle_object::print()
+{
+ if (lt.type == line_type::invisible && fill < 0.0 && color_fill == 0)
+ return;
+ out->set_color(color_fill, graphic_object::get_outline_color());
+ out->circle(cent, dim.x/2.0, lt, fill);
+ out->reset_color();
+}
+
+graphic_object *object_spec::make_circle(position *curpos, direction *dirp)
+{
+ static double last_circle_radius;
+ static int have_last_circle = 0;
+ if (!(flags & HAS_RADIUS)) {
+ if ((flags & IS_SAME) && have_last_circle)
+ radius = last_circle_radius;
+ else
+ lookup_variable("circlerad", &radius);
+ }
+ last_circle_radius = radius;
+ have_last_circle = 1;
+ circle_object *p = new circle_object(radius*2.0);
+ if (!position_rectangle(p, curpos, dirp)) {
+ delete p;
+ return 0;
+ }
+ return p;
+}
+
+class move_object : public graphic_object {
+ position strt;
+ position en;
+public:
+ move_object(const position &s, const position &e);
+ position origin() { return en; }
+ object_type type() { return MOVE_OBJECT; }
+ void update_bounding_box(bounding_box *);
+ void move_by(const position &);
+};
+
+move_object::move_object(const position &s, const position &e)
+: strt(s), en(e)
+{
+}
+
+void move_object::update_bounding_box(bounding_box *p)
+{
+ p->encompass(strt);
+ p->encompass(en);
+}
+
+void move_object::move_by(const position &a)
+{
+ strt += a;
+ en += a;
+}
+
+graphic_object *object_spec::make_move(position *curpos, direction *dirp)
+{
+ static position last_move;
+ static int have_last_move = 0;
+ *dirp = dir;
+ // No need to look at at since 'at' attribute sets 'from' attribute.
+ position startpos = (flags & HAS_FROM) ? from : *curpos;
+ if (!(flags & HAS_SEGMENT)) {
+ if ((flags & IS_SAME) && have_last_move)
+ segment_pos = last_move;
+ else {
+ switch (dir) {
+ case UP_DIRECTION:
+ segment_pos.y = segment_height;
+ break;
+ case DOWN_DIRECTION:
+ segment_pos.y = -segment_height;
+ break;
+ case LEFT_DIRECTION:
+ segment_pos.x = -segment_width;
+ break;
+ case RIGHT_DIRECTION:
+ segment_pos.x = segment_width;
+ break;
+ default:
+ assert(0);
+ }
+ }
+ }
+ segment_list = new segment(segment_pos, segment_is_absolute, segment_list);
+ // Reverse the segment_list so that it's in forward order.
+ segment *old = segment_list;
+ segment_list = 0;
+ while (old != 0) {
+ segment *tem = old->next;
+ old->next = segment_list;
+ segment_list = old;
+ old = tem;
+ }
+ // Compute the end position.
+ position endpos = startpos;
+ for (segment *s = segment_list; s; s = s->next)
+ if (s->is_absolute)
+ endpos = s->pos;
+ else
+ endpos += s->pos;
+ have_last_move = 1;
+ last_move = endpos - startpos;
+ move_object *p = new move_object(startpos, endpos);
+ *curpos = endpos;
+ return p;
+}
+
+class linear_object : public graphic_object {
+protected:
+ char arrow_at_start;
+ char arrow_at_end;
+ arrow_head_type aht;
+ position strt;
+ position en;
+public:
+ linear_object(const position &s, const position &e);
+ position start() { return strt; }
+ position end() { return en; }
+ void move_by(const position &);
+ void update_bounding_box(bounding_box *) = 0;
+ object_type type() = 0;
+ void add_arrows(int at_start, int at_end, const arrow_head_type &);
+};
+
+class line_object : public linear_object {
+protected:
+ position *v;
+ int n;
+public:
+ line_object(const position &s, const position &e, position *, int);
+ ~line_object();
+ position origin() { return strt; }
+ position center() { return (strt + en)/2.0; }
+ position north() { return (en.y - strt.y) > 0 ? en : strt; }
+ position south() { return (en.y - strt.y) < 0 ? en : strt; }
+ position east() { return (en.x - strt.x) > 0 ? en : strt; }
+ position west() { return (en.x - strt.x) < 0 ? en : strt; }
+ object_type type() { return LINE_OBJECT; }
+ void update_bounding_box(bounding_box *);
+ void print();
+ void move_by(const position &);
+};
+
+class arrow_object : public line_object {
+public:
+ arrow_object(const position &, const position &, position *, int);
+ object_type type() { return ARROW_OBJECT; }
+};
+
+class spline_object : public line_object {
+public:
+ spline_object(const position &, const position &, position *, int);
+ object_type type() { return SPLINE_OBJECT; }
+ void print();
+ void update_bounding_box(bounding_box *);
+};
+
+linear_object::linear_object(const position &s, const position &e)
+: arrow_at_start(0), arrow_at_end(0), strt(s), en(e)
+{
+}
+
+void linear_object::move_by(const position &a)
+{
+ strt += a;
+ en += a;
+}
+
+void linear_object::add_arrows(int at_start, int at_end,
+ const arrow_head_type &a)
+{
+ arrow_at_start = at_start;
+ arrow_at_end = at_end;
+ aht = a;
+}
+
+line_object::line_object(const position &s, const position &e,
+ position *p, int i)
+: linear_object(s, e), v(p), n(i)
+{
+}
+
+void line_object::print()
+{
+ if (lt.type == line_type::invisible)
+ return;
+ out->set_color(0, graphic_object::get_outline_color());
+ // shorten line length to avoid arrow sticking.
+ position sp = strt;
+ if (arrow_at_start) {
+ position base = v[0] - strt;
+ double hyp = hypot(base);
+ if (hyp == 0.0) {
+ error("cannot draw arrow on object with zero length");
+ return;
+ }
+ if (aht.solid && out->supports_filled_polygons()) {
+ base *= aht.height / hyp;
+ draw_arrow(strt, strt - v[0], aht, lt,
+ graphic_object::get_outline_color());
+ sp = strt + base;
+ } else {
+ base *= fabs(lt.thickness) / hyp / 72 / 4;
+ sp = strt + base;
+ draw_arrow(sp, sp - v[0], aht, lt,
+ graphic_object::get_outline_color());
+ }
+ }
+ if (arrow_at_end) {
+ position base = v[n-1] - (n > 1 ? v[n-2] : strt);
+ double hyp = hypot(base);
+ if (hyp == 0.0) {
+ error("cannot draw arrow on object with zero length");
+ return;
+ }
+ if (aht.solid && out->supports_filled_polygons()) {
+ base *= aht.height / hyp;
+ draw_arrow(en, v[n-1] - (n > 1 ? v[n-2] : strt), aht, lt,
+ graphic_object::get_outline_color());
+ v[n-1] = en - base;
+ } else {
+ base *= fabs(lt.thickness) / hyp / 72 / 4;
+ v[n-1] = en - base;
+ draw_arrow(v[n-1], v[n-1] - (n > 1 ? v[n-2] : strt), aht, lt,
+ graphic_object::get_outline_color());
+ }
+ }
+ out->line(sp, v, n, lt);
+ out->reset_color();
+}
+
+void line_object::update_bounding_box(bounding_box *p)
+{
+ p->encompass(strt);
+ for (int i = 0; i < n; i++)
+ p->encompass(v[i]);
+}
+
+void line_object::move_by(const position &pos)
+{
+ linear_object::move_by(pos);
+ for (int i = 0; i < n; i++)
+ v[i] += pos;
+}
+
+void spline_object::update_bounding_box(bounding_box *p)
+{
+ p->encompass(strt);
+ p->encompass(en);
+ /*
+
+ If
+
+ p1 = q1/2 + q2/2
+ p2 = q1/6 + q2*5/6
+ p3 = q2*5/6 + q3/6
+ p4 = q2/2 + q3/2
+ [ the points for the Bezier cubic ]
+
+ and
+
+ t = .5
+
+ then
+
+ (1-t)^3*p1 + 3*t*(t - 1)^2*p2 + 3*t^2*(1-t)*p3 + t^3*p4
+ [ the equation for the Bezier cubic ]
+
+ = .125*q1 + .75*q2 + .125*q3
+
+ */
+ for (int i = 1; i < n; i++)
+ p->encompass((i == 1 ? strt : v[i-2])*.125 + v[i-1]*.75 + v[i]*.125);
+}
+
+arrow_object::arrow_object(const position &s, const position &e,
+ position *p, int i)
+: line_object(s, e, p, i)
+{
+}
+
+spline_object::spline_object(const position &s, const position &e,
+ position *p, int i)
+: line_object(s, e, p, i)
+{
+}
+
+void spline_object::print()
+{
+ if (lt.type == line_type::invisible)
+ return;
+ out->set_color(0, graphic_object::get_outline_color());
+ // shorten line length for spline to avoid arrow sticking
+ position sp = strt;
+ if (arrow_at_start) {
+ position base = v[0] - strt;
+ double hyp = hypot(base);
+ if (hyp == 0.0) {
+ error("cannot draw arrow on object with zero length");
+ return;
+ }
+ if (aht.solid && out->supports_filled_polygons()) {
+ base *= aht.height / hyp;
+ draw_arrow(strt, strt - v[0], aht, lt,
+ graphic_object::get_outline_color());
+ sp = strt + base*0.1; // to reserve spline shape
+ } else {
+ base *= fabs(lt.thickness) / hyp / 72 / 4;
+ sp = strt + base;
+ draw_arrow(sp, sp - v[0], aht, lt,
+ graphic_object::get_outline_color());
+ }
+ }
+ if (arrow_at_end) {
+ position base = v[n-1] - (n > 1 ? v[n-2] : strt);
+ double hyp = hypot(base);
+ if (hyp == 0.0) {
+ error("cannot draw arrow on object with zero length");
+ return;
+ }
+ if (aht.solid && out->supports_filled_polygons()) {
+ base *= aht.height / hyp;
+ draw_arrow(en, v[n-1] - (n > 1 ? v[n-2] : strt), aht, lt,
+ graphic_object::get_outline_color());
+ v[n-1] = en - base*0.1; // to reserve spline shape
+ } else {
+ base *= fabs(lt.thickness) / hyp / 72 / 4;
+ v[n-1] = en - base;
+ draw_arrow(v[n-1], v[n-1] - (n > 1 ? v[n-2] : strt), aht, lt,
+ graphic_object::get_outline_color());
+ }
+ }
+ out->spline(sp, v, n, lt);
+ out->reset_color();
+}
+
+line_object::~line_object()
+{
+ delete[] v;
+}
+
+linear_object *object_spec::make_line(position *curpos, direction *dirp)
+{
+ static position last_line;
+ static int have_last_line = 0;
+ *dirp = dir;
+ // We handle 'at' only in conjunction with 'with', otherwise it is
+ // the same as the 'from' attribute.
+ position startpos;
+ if ((flags & HAS_AT) && (flags & HAS_WITH))
+ // handled later -- we need the end position
+ startpos = *curpos;
+ else if (flags & HAS_FROM)
+ startpos = from;
+ else
+ startpos = *curpos;
+ if (!(flags & HAS_SEGMENT)) {
+ if ((flags & IS_SAME) && (type == LINE_OBJECT || type == ARROW_OBJECT)
+ && have_last_line)
+ segment_pos = last_line;
+ else
+ switch (dir) {
+ case UP_DIRECTION:
+ segment_pos.y = segment_height;
+ break;
+ case DOWN_DIRECTION:
+ segment_pos.y = -segment_height;
+ break;
+ case LEFT_DIRECTION:
+ segment_pos.x = -segment_width;
+ break;
+ case RIGHT_DIRECTION:
+ segment_pos.x = segment_width;
+ break;
+ default:
+ assert(0);
+ }
+ }
+ segment_list = new segment(segment_pos, segment_is_absolute, segment_list);
+ // reverse the segment_list so that it's in forward order
+ segment *old = segment_list;
+ segment_list = 0;
+ while (old != 0) {
+ segment *tem = old->next;
+ old->next = segment_list;
+ segment_list = old;
+ old = tem;
+ }
+ // Absolutise all movements
+ position endpos = startpos;
+ int nsegments = 0;
+ segment *s;
+ for (s = segment_list; s; s = s->next, nsegments++)
+ if (s->is_absolute)
+ endpos = s->pos;
+ else {
+ endpos += s->pos;
+ s->pos = endpos;
+ s->is_absolute = 1; // to avoid confusion
+ }
+ if ((flags & HAS_AT) && (flags & HAS_WITH)) {
+ // 'tmpobj' works for arrows and splines too -- we only need positions
+ line_object tmpobj(startpos, endpos, 0, 0);
+ position pos = at;
+ place offset;
+ place here;
+ here.obj = &tmpobj;
+ if (!with->follow(here, &offset))
+ return 0;
+ pos -= offset;
+ for (s = segment_list; s; s = s->next)
+ s->pos += pos;
+ startpos += pos;
+ endpos += pos;
+ }
+ // handle chop
+ line_object *p = 0;
+ position *v = new position[nsegments];
+ int i = 0;
+ for (s = segment_list; s; s = s->next, i++)
+ v[i] = s->pos;
+ if (flags & IS_DEFAULT_CHOPPED) {
+ lookup_variable("circlerad", &start_chop);
+ end_chop = start_chop;
+ flags |= IS_CHOPPED;
+ }
+ if (flags & IS_CHOPPED) {
+ position start_chop_vec, end_chop_vec;
+ if (start_chop != 0.0) {
+ start_chop_vec = v[0] - startpos;
+ start_chop_vec *= start_chop / hypot(start_chop_vec);
+ }
+ if (end_chop != 0.0) {
+ end_chop_vec = (v[nsegments - 1]
+ - (nsegments > 1 ? v[nsegments - 2] : startpos));
+ end_chop_vec *= end_chop / hypot(end_chop_vec);
+ }
+ startpos += start_chop_vec;
+ v[nsegments - 1] -= end_chop_vec;
+ endpos -= end_chop_vec;
+ }
+ switch (type) {
+ case SPLINE_OBJECT:
+ p = new spline_object(startpos, endpos, v, nsegments);
+ break;
+ case ARROW_OBJECT:
+ p = new arrow_object(startpos, endpos, v, nsegments);
+ break;
+ case LINE_OBJECT:
+ p = new line_object(startpos, endpos, v, nsegments);
+ break;
+ default:
+ assert(0);
+ }
+ have_last_line = 1;
+ last_line = endpos - startpos;
+ *curpos = endpos;
+ return p;
+}
+
+class arc_object : public linear_object {
+ int clockwise;
+ position cent;
+ double rad;
+public:
+ arc_object(int, const position &, const position &, const position &);
+ position origin() { return cent; }
+ position center() { return cent; }
+ double radius() { return rad; }
+ position north();
+ position south();
+ position east();
+ position west();
+ position north_east();
+ position north_west();
+ position south_east();
+ position south_west();
+ void update_bounding_box(bounding_box *);
+ object_type type() { return ARC_OBJECT; }
+ void print();
+ void move_by(const position &pos);
+};
+
+arc_object::arc_object(int cw, const position &s, const position &e,
+ const position &c)
+: linear_object(s, e), clockwise(cw), cent(c)
+{
+ rad = hypot(c - s);
+}
+
+void arc_object::move_by(const position &pos)
+{
+ linear_object::move_by(pos);
+ cent += pos;
+}
+
+// we get arc corners from the corresponding circle
+
+position arc_object::north()
+{
+ position result(cent);
+ result.y += rad;
+ return result;
+}
+
+position arc_object::south()
+{
+ position result(cent);
+ result.y -= rad;
+ return result;
+}
+
+position arc_object::east()
+{
+ position result(cent);
+ result.x += rad;
+ return result;
+}
+
+position arc_object::west()
+{
+ position result(cent);
+ result.x -= rad;
+ return result;
+}
+
+position arc_object::north_east()
+{
+ position result(cent);
+ result.x += rad/M_SQRT2;
+ result.y += rad/M_SQRT2;
+ return result;
+}
+
+position arc_object::north_west()
+{
+ position result(cent);
+ result.x -= rad/M_SQRT2;
+ result.y += rad/M_SQRT2;
+ return result;
+}
+
+position arc_object::south_east()
+{
+ position result(cent);
+ result.x += rad/M_SQRT2;
+ result.y -= rad/M_SQRT2;
+ return result;
+}
+
+position arc_object::south_west()
+{
+ position result(cent);
+ result.x -= rad/M_SQRT2;
+ result.y -= rad/M_SQRT2;
+ return result;
+}
+
+
+void arc_object::print()
+{
+ if (lt.type == line_type::invisible)
+ return;
+ out->set_color(0, graphic_object::get_outline_color());
+ // handle arrow direction; make shorter line for arc
+ position sp, ep, b;
+ if (clockwise) {
+ sp = en;
+ ep = strt;
+ } else {
+ sp = strt;
+ ep = en;
+ }
+ if (arrow_at_start) {
+ double theta = aht.height / rad;
+ if (clockwise)
+ theta = - theta;
+ b = strt - cent;
+ b = position(b.x*cos(theta) - b.y*sin(theta),
+ b.x*sin(theta) + b.y*cos(theta)) + cent;
+ if (clockwise)
+ ep = b;
+ else
+ sp = b;
+ if (aht.solid && out->supports_filled_polygons()) {
+ draw_arrow(strt, strt - b, aht, lt,
+ graphic_object::get_outline_color());
+ } else {
+ position v = b;
+ theta = fabs(lt.thickness) / 72 / 4 / rad;
+ if (clockwise)
+ theta = - theta;
+ b = strt - cent;
+ b = position(b.x*cos(theta) - b.y*sin(theta),
+ b.x*sin(theta) + b.y*cos(theta)) + cent;
+ draw_arrow(b, b - v, aht, lt,
+ graphic_object::get_outline_color());
+ out->line(b, &v, 1, lt);
+ }
+ }
+ if (arrow_at_end) {
+ double theta = aht.height / rad;
+ if (!clockwise)
+ theta = - theta;
+ b = en - cent;
+ b = position(b.x*cos(theta) - b.y*sin(theta),
+ b.x*sin(theta) + b.y*cos(theta)) + cent;
+ if (clockwise)
+ sp = b;
+ else
+ ep = b;
+ if (aht.solid && out->supports_filled_polygons()) {
+ draw_arrow(en, en - b, aht, lt,
+ graphic_object::get_outline_color());
+ } else {
+ position v = b;
+ theta = fabs(lt.thickness) / 72 / 4 / rad;
+ if (!clockwise)
+ theta = - theta;
+ b = en - cent;
+ b = position(b.x*cos(theta) - b.y*sin(theta),
+ b.x*sin(theta) + b.y*cos(theta)) + cent;
+ draw_arrow(b, b - v, aht, lt,
+ graphic_object::get_outline_color());
+ out->line(b, &v, 1, lt);
+ }
+ }
+ out->arc(sp, cent, ep, lt);
+ out->reset_color();
+}
+
+inline double max(double a, double b)
+{
+ return a > b ? a : b;
+}
+
+void arc_object::update_bounding_box(bounding_box *p)
+{
+ p->encompass(strt);
+ p->encompass(en);
+ position start_offset = strt - cent;
+ if (start_offset.x == 0.0 && start_offset.y == 0.0)
+ return;
+ position end_offset = en - cent;
+ if (end_offset.x == 0.0 && end_offset.y == 0.0)
+ return;
+ double start_quad = atan2(start_offset.y, start_offset.x)/(M_PI/2.0);
+ double end_quad = atan2(end_offset.y, end_offset.x)/(M_PI/2.0);
+ if (clockwise) {
+ double temp = start_quad;
+ start_quad = end_quad;
+ end_quad = temp;
+ }
+ if (start_quad < 0.0)
+ start_quad += 4.0;
+ while (end_quad <= start_quad)
+ end_quad += 4.0;
+ double r = max(hypot(start_offset), hypot(end_offset));
+ for (int q = int(start_quad) + 1; q < end_quad; q++) {
+ position offset;
+ switch (q % 4) {
+ case 0:
+ offset.x = r;
+ break;
+ case 1:
+ offset.y = r;
+ break;
+ case 2:
+ offset.x = -r;
+ break;
+ case 3:
+ offset.y = -r;
+ break;
+ }
+ p->encompass(cent + offset);
+ }
+}
+
+// We ignore the with attribute. The at attribute always refers to the center.
+
+linear_object *object_spec::make_arc(position *curpos, direction *dirp)
+{
+ *dirp = dir;
+ int cw = (flags & IS_CLOCKWISE) != 0;
+ // compute the start
+ position startpos;
+ if (flags & HAS_FROM)
+ startpos = from;
+ else
+ startpos = *curpos;
+ if (!(flags & HAS_RADIUS))
+ lookup_variable("arcrad", &radius);
+ // compute the end
+ position endpos;
+ if (flags & HAS_TO)
+ endpos = to;
+ else {
+ position m(radius, radius);
+ // Adjust the signs.
+ if (cw) {
+ if (dir == DOWN_DIRECTION || dir == LEFT_DIRECTION)
+ m.x = -m.x;
+ if (dir == DOWN_DIRECTION || dir == RIGHT_DIRECTION)
+ m.y = -m.y;
+ *dirp = direction((dir + 3) % 4);
+ }
+ else {
+ if (dir == UP_DIRECTION || dir == LEFT_DIRECTION)
+ m.x = -m.x;
+ if (dir == DOWN_DIRECTION || dir == LEFT_DIRECTION)
+ m.y = -m.y;
+ *dirp = direction((dir + 1) % 4);
+ }
+ endpos = startpos + m;
+ }
+ // compute the center
+ position centerpos;
+ if (flags & HAS_AT)
+ centerpos = at;
+ else if (startpos == endpos)
+ centerpos = startpos;
+ else {
+ position h = (endpos - startpos)/2.0;
+ double d = hypot(h);
+ if (radius <= 0)
+ radius = .25;
+ // make the radius big enough
+ if (radius < d)
+ radius = d;
+ double alpha = acos(d/radius);
+ double theta = atan2(h.y, h.x);
+ if (cw)
+ theta -= alpha;
+ else
+ theta += alpha;
+ centerpos = position(cos(theta), sin(theta))*radius + startpos;
+ }
+ arc_object *p = new arc_object(cw, startpos, endpos, centerpos);
+ *curpos = endpos;
+ return p;
+}
+
+graphic_object *object_spec::make_linear(position *curpos, direction *dirp)
+{
+ linear_object *obj;
+ if (type == ARC_OBJECT)
+ obj = make_arc(curpos, dirp);
+ else
+ obj = make_line(curpos, dirp);
+ if (type == ARROW_OBJECT
+ && (flags & (HAS_LEFT_ARROW_HEAD|HAS_RIGHT_ARROW_HEAD)) == 0)
+ flags |= HAS_RIGHT_ARROW_HEAD;
+ if (obj && (flags & (HAS_LEFT_ARROW_HEAD|HAS_RIGHT_ARROW_HEAD))) {
+ arrow_head_type a;
+ int at_start = (flags & HAS_LEFT_ARROW_HEAD) != 0;
+ int at_end = (flags & HAS_RIGHT_ARROW_HEAD) != 0;
+ if (flags & HAS_HEIGHT)
+ a.height = height;
+ else
+ lookup_variable("arrowht", &a.height);
+ if (flags & HAS_WIDTH)
+ a.width = width;
+ else
+ lookup_variable("arrowwid", &a.width);
+ double solid;
+ lookup_variable("arrowhead", &solid);
+ a.solid = solid != 0.0;
+ obj->add_arrows(at_start, at_end, a);
+ }
+ return obj;
+}
+
+object *object_spec::make_object(position *curpos, direction *dirp)
+{
+ graphic_object *obj = 0;
+ switch (type) {
+ case BLOCK_OBJECT:
+ obj = make_block(curpos, dirp);
+ break;
+ case BOX_OBJECT:
+ obj = make_box(curpos, dirp);
+ break;
+ case TEXT_OBJECT:
+ obj = make_text(curpos, dirp);
+ break;
+ case ELLIPSE_OBJECT:
+ obj = make_ellipse(curpos, dirp);
+ break;
+ case CIRCLE_OBJECT:
+ obj = make_circle(curpos, dirp);
+ break;
+ case MOVE_OBJECT:
+ obj = make_move(curpos, dirp);
+ break;
+ case ARC_OBJECT:
+ case LINE_OBJECT:
+ case SPLINE_OBJECT:
+ case ARROW_OBJECT:
+ obj = make_linear(curpos, dirp);
+ break;
+ case MARK_OBJECT:
+ case OTHER_OBJECT:
+ default:
+ assert(0);
+ break;
+ }
+ if (obj) {
+ if (flags & IS_INVISIBLE)
+ obj->set_invisible();
+ if (text != 0)
+ obj->add_text(text, (flags & IS_ALIGNED) != 0);
+ if (flags & IS_DOTTED)
+ obj->set_dotted(dash_width);
+ else if (flags & IS_DASHED)
+ obj->set_dashed(dash_width);
+ double th;
+ if (flags & HAS_THICKNESS)
+ th = thickness;
+ else
+ lookup_variable("linethick", &th);
+ obj->set_thickness(th);
+ if (flags & IS_OUTLINED)
+ obj->set_outline_color(outlined);
+ if (flags & IS_XSLANTED)
+ obj->set_xslanted(xslanted);
+ if (flags & IS_YSLANTED)
+ obj->set_yslanted(yslanted);
+ if (flags & (IS_DEFAULT_FILLED | IS_FILLED)) {
+ if (flags & IS_SHADED)
+ obj->set_fill_color(shaded);
+ else {
+ if (flags & IS_DEFAULT_FILLED)
+ lookup_variable("fillval", &fill);
+ if (fill < 0.0)
+ error("bad fill value %1", fill);
+ else
+ obj->set_fill(fill);
+ }
+ }
+ }
+ return obj;
+}
+
+struct string_list {
+ string_list *next;
+ char *str;
+ string_list(char *);
+ ~string_list();
+};
+
+string_list::string_list(char *s)
+: next(0), str(s)
+{
+}
+
+string_list::~string_list()
+{
+ free(str);
+}
+
+/* A path is used to hold the argument to the 'with' attribute. For
+ example, '.nw' or '.A.s' or '.A'. The major operation on a path is to
+ take a place and follow the path through the place to place within the
+ place. Note that '.A.B.C.sw' will work.
+
+ For compatibility with DWB pic, 'with' accepts positions also (this
+ is incorrectly documented in CSTR 116). */
+
+path::path(corner c)
+: crn(c), label_list(0), ypath(0), is_position(0)
+{
+}
+
+path::path(position p)
+: crn(0), label_list(0), ypath(0), is_position(1)
+{
+ pos.x = p.x;
+ pos.y = p.y;
+}
+
+path::path(char *l, corner c)
+: crn(c), ypath(0), is_position(0)
+{
+ label_list = new string_list(l);
+}
+
+path::~path()
+{
+ while (label_list) {
+ string_list *tem = label_list;
+ label_list = label_list->next;
+ delete tem;
+ }
+ delete ypath;
+}
+
+void path::append(corner c)
+{
+ assert(crn == 0);
+ crn = c;
+}
+
+void path::append(char *s)
+{
+ string_list **p;
+ for (p = &label_list; *p; p = &(*p)->next)
+ ;
+ *p = new string_list(s);
+}
+
+void path::set_ypath(path *p)
+{
+ ypath = p;
+}
+
+// return non-zero for success
+
+int path::follow(const place &pl, place *result) const
+{
+ if (is_position) {
+ result->x = pos.x;
+ result->y = pos.y;
+ result->obj = 0;
+ return 1;
+ }
+ const place *p = &pl;
+ for (string_list *lb = label_list; lb; lb = lb->next)
+ if (p->obj == 0 || (p = p->obj->find_label(lb->str)) == 0) {
+ lex_error("object does not contain a place '%1'", lb->str);
+ return 0;
+ }
+ if (crn == 0 || p->obj == 0)
+ *result = *p;
+ else {
+ position ps = ((p->obj)->*(crn))();
+ result->x = ps.x;
+ result->y = ps.y;
+ result->obj = 0;
+ }
+ if (ypath) {
+ place tem;
+ if (!ypath->follow(pl, &tem))
+ return 0;
+ result->y = tem.y;
+ if (result->obj != tem.obj)
+ result->obj = 0;
+ }
+ return 1;
+}
+
+void print_object_list(object *p)
+{
+ for (; p; p = p->next) {
+ p->print();
+ p->print_text();
+ }
+}
+
+void print_picture(object *obj)
+{
+ bounding_box bb;
+ for (object *p = obj; p; p = p->next)
+ p->update_bounding_box(&bb);
+ double scale;
+ lookup_variable("scale", &scale);
+ out->start_picture(scale, bb.ll, bb.ur);
+ print_object_list(obj);
+ out->finish_picture();
+}
+
diff --git a/src/preproc/pic/object.h b/src/preproc/pic/object.h
new file mode 100644
index 0000000..e39b6a6
--- /dev/null
+++ b/src/preproc/pic/object.h
@@ -0,0 +1,227 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+struct place;
+
+enum object_type {
+ OTHER_OBJECT,
+ BOX_OBJECT,
+ CIRCLE_OBJECT,
+ ELLIPSE_OBJECT,
+ ARC_OBJECT,
+ SPLINE_OBJECT,
+ LINE_OBJECT,
+ ARROW_OBJECT,
+ MOVE_OBJECT,
+ TEXT_OBJECT,
+ BLOCK_OBJECT,
+ MARK_OBJECT
+ };
+
+struct bounding_box;
+
+struct object {
+ object *prev;
+ object *next;
+ object();
+ virtual ~object();
+ virtual position origin();
+ virtual double width();
+ virtual double radius();
+ virtual double height();
+ virtual position north();
+ virtual position south();
+ virtual position east();
+ virtual position west();
+ virtual position north_east();
+ virtual position north_west();
+ virtual position south_east();
+ virtual position south_west();
+ virtual position start();
+ virtual position end();
+ virtual position center();
+ virtual place *find_label(const char *);
+ virtual void move_by(const position &);
+ virtual int blank();
+ virtual void update_bounding_box(bounding_box *);
+ virtual object_type type() = 0;
+ virtual void print();
+ virtual void print_text();
+};
+
+typedef position (object::*corner)();
+
+struct place {
+ object *obj;
+ double x, y;
+};
+
+struct string_list;
+
+class path {
+ position pos;
+ corner crn;
+ string_list *label_list;
+ path *ypath;
+ int is_position;
+public:
+ path(corner = 0);
+ path(position);
+ path(char *, corner = 0);
+ ~path();
+ void append(corner);
+ void append(char *);
+ void set_ypath(path *);
+ int follow(const place &, place *) const;
+};
+
+struct object_list {
+ object *head;
+ object *tail;
+ object_list();
+ void append(object *);
+ void wrap_up_block(object_list *);
+};
+
+declare_ptable(place)
+
+// these go counterclockwise
+enum direction {
+ RIGHT_DIRECTION,
+ UP_DIRECTION,
+ LEFT_DIRECTION,
+ DOWN_DIRECTION
+ };
+
+struct graphics_state {
+ double x, y;
+ direction dir;
+};
+
+struct saved_state : public graphics_state {
+ saved_state *prev;
+ PTABLE(place) *tbl;
+};
+
+
+struct text_item {
+ text_item *next;
+ char *text;
+ adjustment adj;
+ const char *filename;
+ int lineno;
+
+ text_item(char *, const char *, int);
+ ~text_item();
+};
+
+const unsigned long IS_DOTTED = 01;
+const unsigned long IS_DASHED = 02;
+const unsigned long IS_CLOCKWISE = 04;
+const unsigned long IS_INVISIBLE = 020;
+const unsigned long HAS_LEFT_ARROW_HEAD = 040;
+const unsigned long HAS_RIGHT_ARROW_HEAD = 0100;
+const unsigned long HAS_SEGMENT = 0200;
+const unsigned long IS_SAME = 0400;
+const unsigned long HAS_FROM = 01000;
+const unsigned long HAS_AT = 02000;
+const unsigned long HAS_WITH = 04000;
+const unsigned long HAS_HEIGHT = 010000;
+const unsigned long HAS_WIDTH = 020000;
+const unsigned long HAS_RADIUS = 040000;
+const unsigned long HAS_TO = 0100000;
+const unsigned long IS_CHOPPED = 0200000;
+const unsigned long IS_DEFAULT_CHOPPED = 0400000;
+const unsigned long HAS_THICKNESS = 01000000;
+const unsigned long IS_FILLED = 02000000;
+const unsigned long IS_DEFAULT_FILLED = 04000000;
+const unsigned long IS_ALIGNED = 010000000;
+const unsigned long IS_SHADED = 020000000;
+const unsigned long IS_OUTLINED = 040000000;
+const unsigned long IS_XSLANTED = 0100000000;
+const unsigned long IS_YSLANTED = 0200000000;
+
+struct segment {
+ int is_absolute;
+ position pos;
+ segment *next;
+ segment(const position &, int, segment *);
+};
+
+class rectangle_object;
+class graphic_object;
+class linear_object;
+
+struct object_spec {
+ unsigned long flags;
+ object_type type;
+ object_list oblist;
+ PTABLE(place) *tbl;
+ double dash_width;
+ position from;
+ position to;
+ position at;
+ position by;
+ path *with;
+ text_item *text;
+ double height;
+ double radius;
+ double width;
+ double segment_width;
+ double segment_height;
+ double start_chop;
+ double end_chop;
+ double thickness;
+ double fill;
+ double xslanted;
+ double yslanted;
+ char *shaded;
+ char *outlined;
+ direction dir;
+ segment *segment_list;
+ position segment_pos;
+ int segment_is_absolute;
+
+ object_spec(object_type);
+ ~object_spec();
+ object *make_object(position *, direction *);
+ graphic_object *make_box(position *, direction *);
+ graphic_object *make_block(position *, direction *);
+ graphic_object *make_text(position *, direction *);
+ graphic_object *make_ellipse(position *, direction *);
+ graphic_object *make_circle(position *, direction *);
+ linear_object *make_line(position *, direction *);
+ linear_object *make_arc(position *, direction *);
+ graphic_object *make_linear(position *, direction *);
+ graphic_object *make_move(position *, direction *);
+ int position_rectangle(rectangle_object *p, position *curpos,
+ direction *dirp);
+};
+
+
+object *make_object(object_spec *, position *, direction *);
+
+object *make_mark_object();
+object *make_command_object(char *, const char *, int);
+
+int lookup_variable(const char *name, double *val);
+void define_variable(const char *name, double val);
+
+void print_picture(object *);
+
diff --git a/src/preproc/pic/output.h b/src/preproc/pic/output.h
new file mode 100644
index 0000000..f01e0a1
--- /dev/null
+++ b/src/preproc/pic/output.h
@@ -0,0 +1,82 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+struct line_type {
+ enum { invisible, solid, dotted, dashed } type;
+ double dash_width;
+ double thickness; // the thickness is in points
+
+ line_type();
+};
+
+
+class output {
+protected:
+ char *args;
+ double desired_height; // zero if no height specified
+ double desired_width; // zero if no depth specified
+ double compute_scale(double, const position &, const position &);
+public:
+ output();
+ virtual ~output();
+ void set_desired_width_height(double wid, double ht);
+ void set_args(const char *);
+ virtual void start_picture(double sc, const position &ll, const position &ur) = 0;
+ virtual void finish_picture() = 0;
+ virtual void circle(const position &, double rad,
+ const line_type &, double) = 0;
+ virtual void text(const position &, text_piece *, int, double) = 0;
+ virtual void line(const position &, const position *, int n,
+ const line_type &) = 0;
+ virtual void polygon(const position *, int n,
+ const line_type &, double) = 0;
+ virtual void spline(const position &, const position *, int n,
+ const line_type &) = 0;
+ virtual void arc(const position &, const position &, const position &,
+ const line_type &) = 0;
+ virtual void ellipse(const position &, const distance &,
+ const line_type &, double) = 0;
+ virtual void rounded_box(const position &, const distance &, double,
+ const line_type &, double, char *) = 0;
+ virtual void command(const char *, const char *, int) = 0;
+ virtual void set_location(const char *, int) {}
+ virtual void set_color(char *, char *) = 0;
+ virtual void reset_color() = 0;
+ virtual char *get_last_filled() = 0;
+ virtual char *get_outline_color() = 0;
+ virtual int supports_filled_polygons();
+ virtual void begin_block(const position &ll, const position &ur);
+ virtual void end_block();
+};
+
+extern output *out;
+
+/* #define FIG_SUPPORT 1 */
+#define TEX_SUPPORT 1
+
+output *make_troff_output();
+
+#ifdef TEX_SUPPORT
+output *make_tex_output();
+output *make_tpic_output();
+#endif /* TEX_SUPPORT */
+
+#ifdef FIG_SUPPORT
+output *make_fig_output();
+#endif /* FIG_SUPPORT */
diff --git a/src/preproc/pic/pic.1.man b/src/preproc/pic/pic.1.man
new file mode 100644
index 0000000..727cbc3
--- /dev/null
+++ b/src/preproc/pic/pic.1.man
@@ -0,0 +1,1569 @@
+.TH @g@pic @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+@g@pic \- compile pictures for
+.I troff
+or TeX
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2020 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_pic_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.\" Definitions
+.\" ====================================================================
+.
+.ie t \{\
+. ds tx T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X
+. ds lx L\h'-0.36m'\v'-0.22v'\s-2A\s0\h'-0.15m'\v'0.22v'\*[tx]
+.\}
+.el \{\
+. ds tx TeX
+. ds lx LaTeX
+.\}
+.
+.ie \n(.g .ds ic \/
+.el .ds ic \^
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY @g@pic
+.RB [ \-CnSU ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY @g@pic
+.B \-t
+.RB [ \-cCSUz ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY @g@pic
+.B \-\-help
+.YS
+.
+.
+.SY @g@pic
+.B \-v
+.
+.SY @g@pic
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The GNU implementation of
+.I pic \" generic
+is part of the
+.MR groff @MAN1EXT@
+document formatting system.
+.
+.I @g@pic
+is a
+.MR @g@troff @MAN1EXT@
+preprocessor that translates descriptions of diagrammatic pictures
+embedded in
+.MR roff @MAN7EXT@
+or \*[tx] input files into the language understood by \*[tx] or
+.IR @g@troff .
+.
+It copies the contents of each
+.I file
+to the standard output stream,
+except that lines between
+.B .PS
+and any of
+.BR .PE ,
+.BR .PF ,
+or
+.B .PY
+are interpreted as picture descriptions in the
+.I pic
+language.
+.
+End a
+.I @g@pic
+picture with
+.B .PE
+to leave the drawing position at the bottom of the picture,
+and with
+.B .PF
+or
+.B .PY
+to leave it at the top.
+.
+Normally,
+.I @g@pic
+is not executed directly by the user,
+but invoked by specifying the
+.B \-p
+option to
+.MR groff @MAN1EXT@ .
+.
+If no
+.I file
+operands are given on the command line,
+or if
+.I file
+is
+.RB \[lq] \- \[rq],
+the standard input stream is read.
+.
+.
+.P
+It is the user's responsibility to provide appropriate definitions
+of the
+.BR PS ,
+.BR PE ,
+and one or both of the
+.B PF
+and
+.B PY
+macros.
+.
+When a macro package does not supply these,
+obtain simple definitions with the
+.I groff
+option
+.BR \-mpic ;
+these will center each picture.
+.
+.
+.P
+GNU
+.I pic \" GNU
+supports
+.B PY
+as a synonym of
+.B PF
+to work around a name space collision with the
+.I mm
+macro package,
+which defines
+.B PF
+as a page footer management macro.
+.
+Use
+.B PF
+preferentially unless a similar problem faces your document.
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.B \-c
+Be more compatible with
+.IR tpic ;
+implies
+.BR \-t .
+.
+Lines beginning with
+.B \[rs]
+are not passed through transparently.
+.
+Lines beginning with
+.B .\&
+are passed through with the initial
+.B .\&
+changed to
+.BR \[rs] .
+.
+A line beginning with
+.B .ps
+is given special treatment:
+it takes an optional integer argument specifying the line thickness
+(pen size)
+in milliinches;
+a missing argument restores the previous line thickness;
+the default line thickness is 8\~milliinches.
+.
+The line thickness thus specified takes effect only when a
+non-negative line thickness has not been specified by use of the
+.B \%thickness
+attribute or by setting the
+.B \%linethick
+variable.
+.
+.
+.TP
+.B \-C
+Recognize
+.BR .PS ,
+.BR .PE ,
+.BR .PF ,
+and
+.B .PY
+even when followed by a character other than space or newline.
+.
+.
+.TP
+.B \-n
+Don't use
+.I groff
+extensions to the
+.I troff \" generic
+drawing commands.
+.
+Specify this option if a postprocessor you're using doesn't support
+these extensions,
+described in
+.MR groff_out @MAN5EXT@ .
+.
+This option also causes
+.I @g@pic
+not to use zero-length lines to draw dots in
+.I troff \" generic
+mode.
+.
+.
+.TP
+.B \-S
+Operate in
+.I safer mode;
+.B sh
+commands are ignored.
+.
+This mode,
+enabled by default,
+can be useful when operating on untrustworthy input.
+.
+.
+.TP
+.B \-t
+Produce \*[tx] output.
+.
+.
+.TP
+.B \-U
+Operate in
+.I unsafe mode;
+.B sh
+commands are interpreted.
+.
+.
+.TP
+.B \-z
+In \*[tx] mode,
+draw dots using zero-length lines.
+.
+.
+.P
+The following options supported by other versions of
+.I pic \" generic
+are ignored.
+.
+.
+.TP
+.B \-D
+Draw all lines using the \[rs]D escape sequence.
+GNU
+.I pic \" GNU
+always does this.
+.
+.TP
+.BI \-T\~ dev
+Generate output for the
+.I troff \" generic
+device
+.IR dev .
+.
+This is unnecessary because the
+.I troff \" generic
+output generated by
+GNU
+.I pic \" GNU
+is device-independent.
+.
+.
+.\" ====================================================================
+.SH Usage
+.\" ====================================================================
+.
+This section primarily discusses the differences between GNU
+.I pic \" GNU
+and the Eighth Edition Research Unix version of AT&T
+.I pic \" AT&T
+(1985).
+.
+Many of these differences also apply to later versions of AT&T
+.IR pic .
+.
+.
+.\" ====================================================================
+.SS "\*[tx] mode"
+.\" ====================================================================
+.
+\*[tx]-compatible output is produced when the
+.B \-t
+option is specified.
+.
+You must use a \*[tx] driver that supports
+.I tpic
+version 2 specials.
+.
+.RI ( tpic
+was a fork of AT&T
+.I pic \" AT&T
+by Tim Morgan of the University of California at Irvine that diverged
+from its source around 1984.
+.
+It is best known today for lending its name to a group of
+.B \[rs]special
+commands it produced for \*[tx].)
+.\" http://ftp.cs.stanford.edu/tex/texhax/texhax90.019
+.
+.
+.P
+Lines beginning with
+.B \[rs]
+are passed through transparently;
+a
+.B %
+is added to the end of the line to avoid unwanted spaces.
+.
+You can safely use this feature to change fonts or the value of
+.BR \[rs]baselineskip .
+.
+Anything else may well produce undesirable results;
+use at your own risk.
+.
+By default,
+lines beginning with a dot are not treated specially\[em]but see the
+.B \-c
+option.
+.
+.
+.P
+In \*[tx] mode,
+.I @g@pic
+will define a vbox called
+.B \[rs]graph
+for each picture.
+.
+Use GNU
+.IR pic 's \" GNU
+.B figname
+command to change the name of the vbox.
+.
+You must print that vbox yourself using the command
+.
+.RS
+.EX
+\[rs]centerline{\[rs]box\[rs]graph}
+.EE
+.RE
+.
+for instance.
+.
+Since the vbox has a height of zero
+(it is defined with
+.BR \[rs]vtop )
+this will produce slightly more vertical space above the picture than
+below it;
+.
+.RS
+.EX
+\[rs]centerline{\[rs]raise 1em\[rs]box\[rs]graph}
+.EE
+.RE
+.
+would avoid this.
+.
+To give the vbox a positive height and a depth of zero
+(as used by \*[lx]'s
+.IR \%graphics.sty ,
+for example)
+define the following macro in your document.
+.
+.RS
+.EX
+\[rs]def\[rs]gpicbox#1{%
+ \[rs]vbox{\[rs]unvbox\[rs]csname #1\[rs]endcsname\[rs]kern 0pt}}
+.EE
+.RE
+.
+You can then simply say
+.B \[rs]gpicbox{graph}
+instead of
+.BR \[rs]box\[rs]graph .
+.
+.
+.\" ====================================================================
+.SS Commands
+.\" ====================================================================
+.
+Several commands new to GNU
+.I pic \" GNU
+accept delimiters,
+shown in their synopses as braces
+.BR "{ }" .
+.
+Nesting of braces is supported.
+.
+Any other characters
+(except a space,
+tab,
+or newline)
+.\" XXX even crazy control characters, ugh--src/preproc/pic/lex.cpp:1266
+may be used as alternative delimiters,
+in which case the members of a given pair must be identical.
+.
+Strings are recognized within delimiters of either kind;
+they may contain the delimiter character or unbalanced braces.
+.
+.
+.TP
+\fBfor\fR \fIvariable\fR \fB=\fR \fIexpr1\fR \fBto\fR \fIexpr2\fR \
+[\fBby\fR [\fB*\fR]\,\fIexpr3\/\fR] \fBdo\fR \fIX\fR \fIbody\fR \fIX\fR
+Set
+.I variable
+to
+.IR expr1 .
+.
+While the value of
+.I variable
+is less than or equal to
+.IR expr2 ,
+do
+.I body
+and increment
+.I variable
+by
+.IR expr3 ;
+if
+.B by
+is not given,
+increment
+.I variable
+by 1.
+.
+If
+.I expr3
+is prefixed by
+.B *
+then
+.I variable
+will instead be multiplied by
+.IR expr3 .
+.
+The value of
+.I expr3
+can be negative for the additive case;
+.I variable
+is then tested whether it is greater than or equal to
+.IR expr2 .
+.
+For the multiplicative case,
+.I expr3
+must be greater than zero.
+.
+If the constraints aren't met,
+the loop isn't executed.
+.
+.I X
+can be any character not occurring in
+.IR body .
+.
+.TP
+\fBif\fR \fIexpr\fR \fBthen\fR \fIX\fR \fIif-true\fR \fIX\fR \
+[\fBelse\fR \fIY\fR \fIif-false\fR \fIY\fR]
+Evaluate
+.IR expr ;
+if it is non-zero then do
+.IR if-true ,
+otherwise do
+.IR if-false .
+.
+.I X
+can be any character not occurring in
+.IR if-true .
+.
+.I Y
+can be any character not occurring in
+.IR if-false .
+.
+.TP
+.BI print\~ arg\c
+\~.\|.\|.
+Concatenate and write arguments to the standard error stream followed by
+a newline.
+.
+Each
+.I arg
+must be an expression,
+a position,
+or text.
+.
+This is useful for debugging.
+.
+.TP
+.BI command\~ arg\c
+\~.\|.\|.
+.\" Move right margin to indentation since we must indent more later.
+.RS
+Concatenate arguments
+and pass them as a line to
+.I troff \" generic
+or \*[tx].
+.
+Each
+.I arg
+must be an expression,
+a position,
+or text.
+.
+.B command
+allows the values of
+.I pic
+variables to be passed to the formatter.
+.
+For example,
+.
+.RS
+.EX
+\&.PS
+x = 14
+command ".ds string x is " x "."
+\&.PE
+\[rs]*[string]
+.EE
+.RE
+.
+produces
+.
+.RS
+.EX
+x is 14.
+.EE
+.RE
+when formatted with
+.IR troff . \" generic
+.RE
+.
+.
+.TP
+\fBsh\fR \fIX\fR \fIcommand\fR \fIX\fR
+Pass
+.I command
+to a shell.
+.
+.
+.TP
+\fBcopy\fR \fB"\,\fIfilename\/\fB"\fR
+Include
+.I filename
+at this point in the file.
+.
+.
+.TP
+.BR copy\~ [ \[dq]\c
+.IB filename \[dq]\c
+.RB ]\~ thru\~\c
+.IR "X body X" \~\c \" space in roman: we must use 2-font macro with \c
+.RB [ until\~ \[dq]\c
+.IB word \[dq]\c
+]
+.TQ
+.BR copy\~ [ \[dq]\c
+.IB filename \[dq]\c
+.RB ]\~ thru\~\c
+.IR macro \~\c \" space roman because we must use 2-font macro with \c
+.RB [ until\~ \[dq]\c
+.IB word \[dq]\c
+]
+.\" Move right margin to indentation since we must indent more later.
+.RS
+This construct does
+.I body
+once for each line of
+.IR filename ;
+the line is split into blank-delimited words,
+and occurrences of
+.BI $ i
+in
+.IR body ,
+for
+.I i
+between 1 and 9,
+are replaced by the
+.IR i -th
+word of the line.
+.
+If
+.I filename
+is not given,
+lines are taken from the current input up to
+.BR .PE .
+.
+If an
+.B until
+clause is specified,
+lines will be read only until a line the first word of which is
+.IR word ;
+that line will then be discarded.
+.
+.I X
+can be any character not occurring in
+.IR body .
+.
+For example,
+.
+.RS \" now move further
+.EX
+\&.PS
+copy thru % circle at ($1,$2) % until "END"
+1 2
+3 4
+5 6
+END
+box
+\&.PE
+.EE
+.RE
+.
+and
+.
+.RS
+.EX
+\&.PS
+circle at (1,2)
+circle at (3,4)
+circle at (5,6)
+box
+\&.PE
+.EE
+.RE
+.
+are equivalent.
+.
+The commands to be performed for each line can also be taken from a
+macro defined earlier by giving the name of the macro as the argument to
+.BR thru .
+.
+The argument after
+.B thru
+is looked up as a macro name first;
+if not defined,
+its first character is interpreted as a delimiter.
+.RE
+.
+.
+.TP
+.B reset
+.TQ
+.BI reset\~ pvar1\c
+.RB [ , ]\~\c
+.IR pvar2 \~.\|.\|.
+Reset predefined variables
+.IR pvar1 ,
+.I pvar2
+\&.\|.\|.\& to their default values;
+if no arguments are given,
+reset all predefined variables to their default values.
+.
+Variable names may be separated by commas,
+spaces,
+or both.
+.
+Assigning a value to
+.B scale
+also causes all predefined variables that control dimensions to be reset
+to their default values times the new value of
+.BR scale .
+.
+.
+.TP
+\fBplot\fR \fIexpr\fR [\fB"\,\fItext\*(ic\fB"\fR]
+This is a text object which is constructed by using
+.I text
+as a format string for sprintf
+with an argument of
+.IR expr .
+.
+If
+.I text
+is omitted a format string of
+.B \[dq]%g\[dq]
+is used.
+.
+Attributes can be specified in the same way as for a normal text
+object.
+Be very careful that you specify an appropriate format string;
+.I @g@pic
+does only very limited checking of the string.
+.
+This is deprecated in favour of
+.BR sprintf .
+.
+.TP
+.IB var \~:=\~ expr
+.RS
+This syntax resembles variable assignment with
+.B =
+except that
+.I var
+must already be defined,
+and
+.I expr
+will be assigned to
+.I var
+without creating a variable local to the current block.
+.
+(By contrast,
+.B =
+defines
+.I var
+in the current block if it is not already defined there,
+and then changes the value in the current block only.)
+.
+For example,
+.
+.RS
+.EX
+.B .PS
+.B x = 3
+.B y = 3
+.B [
+.B x := 5
+.B y = 5
+.B ]
+.B print x " " y
+.B .PE
+.EE
+.RE
+.
+writes
+.
+.RS
+.EX
+5 3
+.EE
+.RE
+.
+to the standard error stream.
+.RE
+.
+.
+.\" ====================================================================
+.SS Expressions
+.\" ====================================================================
+.
+The syntax for expressions has been significantly extended.
+.
+.
+.P
+.IB x\ \[ha]\ y
+(exponentiation)
+.br
+.BI sin( x )
+.br
+.BI cos( x )
+.br
+.BI atan2( y , \ x )
+.br
+.BI log( x )
+(base 10)
+.br
+.BI exp( x )
+(base 10, i.e.\&
+.ie t 10\v'-.4m'\fIx\*(ic\fR\v'.4m')
+.el 10\[ha]\fIx\fR)
+.br
+.BI sqrt( x )
+.br
+.BI int( x )
+.br
+.B rand()
+(return a random number between 0 and 1)
+.br
+.BI rand( x )
+(return a random number between 1 and
+.IR x ;
+deprecated)
+.br
+.BI srand( x )
+(set the random number seed)
+.br
+.BI max( e1 , \ e2 )
+.br
+.BI min( e1 , \ e2 )
+.br
+.BI ! e
+.br
+\fIe1\fB && \fIe2\fR
+.br
+\fIe1\fB || \fIe2\fR
+.br
+\fIe1\fB == \fIe2\fR
+.br
+\fIe1\fB != \fIe2\fR
+.br
+\fIe1\fB >= \fIe2\fR
+.br
+\fIe1\fB > \fIe2\fR
+.br
+\fIe1\fB <= \fIe2\fR
+.br
+\fIe1\fB < \fIe2\fR
+.br
+\fB"\,\fIstr1\*(ic\fB" == "\,\fIstr2\*(ic\fB"\fR
+.br
+\fB"\,\fIstr1\*(ic\fB" != "\,\fIstr2\*(ic\fB"\fR
+.br
+.
+.
+.LP
+String comparison expressions must be parenthesised in some contexts
+to avoid ambiguity.
+.
+.
+.\" ====================================================================
+.SS "Other changes"
+.\" ====================================================================
+.
+A bare expression,
+.IR expr ,
+is acceptable as an attribute;
+it is equivalent to
+.IR dir\ expr ,
+where
+.I dir
+is the current direction.
+.
+For example
+.LP
+.RS
+.B line 2i
+.RE
+.LP
+means draw a line 2\ inches long in the current direction.
+.
+The \[oq]i\[cq]
+(or \[oq]I\[cq])
+character is ignored;
+to use another measurement unit,
+set the
+.I scale
+variable to an appropriate value.
+.
+.
+.LP
+The maximum width and height of the picture are taken from the variables
+.B maxpswid
+and
+.BR maxpsht .
+.
+Initially,
+these have values 8.5 and 11.
+.
+.
+.LP
+Scientific notation is allowed for numbers.
+For example
+.
+.
+.RS
+.LP
+.B
+x = 5e\-2
+.RE
+.
+.
+.LP
+Text attributes can be compounded.
+.
+For example,
+.
+.RS
+.LP
+.B
+"foo" above ljust
+.RE
+.
+.
+.LP
+is valid.
+.
+.
+.LP
+There is no limit to the depth to which blocks can be examined.
+.
+For example,
+.RS
+.LP
+.EX
+[A: [B: [C: box ]]] with .A.B.C.sw at 1,2
+circle at last [\^].A.B.C
+.EE
+.RE
+.
+.
+.LP
+is acceptable.
+.
+.
+.LP
+Arcs now have compass points determined by the circle of which the arc
+is a part.
+.
+.
+.LP
+Circles,
+ellipses,
+and arcs can be dotted or dashed.
+.
+In \*[tx] mode splines can be dotted or dashed also.
+.
+.
+.LP
+Boxes can have rounded corners.
+.
+The
+.B rad
+attribute specifies the radius of the quarter-circles at each corner.
+If no
+.B rad
+or
+.B diam
+attribute is given,
+a radius of
+.B boxrad
+is used.
+.
+Initially,
+.B boxrad
+has a value of\ 0.
+.
+A box with rounded corners can be dotted or dashed.
+.
+.
+.LP
+Boxes can have slanted sides.
+.
+This effectively changes the shape of a box from a rectangle to an
+arbitrary parallelogram.
+.
+The
+.B xslanted
+and
+.B yslanted
+attributes specify the x and y\~offset of the box's upper right
+corner from its default position.
+.
+.
+.LP
+The
+.B .PS
+line can have a second argument specifying a maximum height for
+the picture.
+.
+If the width of zero is specified the width will be ignored in computing
+the scaling factor for the picture.
+.
+GNU
+.I pic \" GNU
+will always scale a picture by the same amount vertically as well as
+horizontally.
+.
+This is different from DWB 2.0
+.I pic \" foreign
+which may scale a picture by a different amount vertically than
+horizontally if a height is specified.
+.
+.
+.LP
+Each text object has an invisible box associated with it.
+.
+The compass points of a text object are determined by this box.
+.
+The implicit motion associated with the object is also determined
+by this box.
+.
+The dimensions of this box are taken from the width and height
+attributes;
+if the width attribute is not supplied then the width will be taken to
+be
+.BR textwid ;
+if the height attribute is not supplied then the height will be taken to
+be the number of text strings associated with the object times
+.BR textht .
+.
+Initially,
+.B textwid
+and
+.B textht
+have a value of 0.
+.
+.
+.LP
+In
+(almost all)
+places where a quoted text string can be used,
+an expression of the form
+.
+.
+.IP
+.BI sprintf(\[dq] format \[dq],\~ arg ,\fR\~.\|.\|.\fB)
+.
+.
+.LP
+can also be used;
+this will produce the arguments formatted according to
+.IR format ,
+which should be a string as described in
+.MR printf 3
+appropriate for the number of arguments supplied.
+.
+Only the modifiers
+.RB \[lq] # \[rq],
+.RB \[lq] \- \[rq],
+.RB \[lq] + \[rq],
+and \[lq]\~\[rq] [space]),
+a minimum field width,
+an optional precision,
+and the conversion specifiers
+.BR %e ,
+.BR %E ,
+.BR %f ,
+.BR %g ,
+.BR %G ,
+and
+.B %%
+are supported.
+.
+.
+.LP
+The thickness of the lines used to draw objects is controlled by the
+.B linethick
+variable.
+.
+This gives the thickness of lines in points.
+.
+A negative value means use the default thickness:
+in \*[tx] output mode,
+this means use a thickness of 8 milliinches;
+in \*[tx] output mode with the
+.B \-c
+option,
+this means use the line thickness specified by
+.B .ps
+lines;
+in
+.I troff
+output mode,
+this means use a thickness proportional to the pointsize.
+.
+A zero value means draw the thinnest possible line supported by
+the output device.
+.
+Initially,
+it has a value of \-1.
+.
+There is also a
+.BR thick [ ness ]
+attribute.
+.
+For example,
+.
+.
+.RS
+.LP
+.B circle thickness 1.5
+.RE
+.
+.
+.LP
+would draw a circle using a line with a thickness of 1.5 points.
+.
+The thickness of lines is not affected by the
+value of the
+.B scale
+variable,
+nor by the width or height given in the
+.B .PS
+line.
+.
+.
+.LP
+Boxes
+(including boxes with rounded corners or slanted sides),
+circles and ellipses can be filled by giving them an attribute of
+.BR fill [ ed ].
+.
+This takes an optional argument of an expression with a value between
+0 and 1;
+0 will fill it with white,
+1 with black,
+values in between with a proportionally gray shade.
+.
+A value greater than 1 can also be used:
+this means fill with the
+shade of gray that is currently being used for text and lines.
+.
+Normally this will be black,
+but output devices may provide a mechanism for changing this.
+.
+Without an argument,
+then the value of the variable
+.B \%fillval
+will be used.
+.
+Initially,
+this has a value of 0.5.
+.
+The invisible attribute does not affect the filling of objects.
+.
+Any text associated with a filled object will be added after the object
+has been filled,
+so that the text will not be obscured by the filling.
+.
+.
+.P
+Additional modifiers are available to draw colored objects:
+.BR \%outline [ d ]
+sets the color of the outline,
+.B shaded
+the fill color,
+and
+.BR colo [ u ] r [ ed ]
+sets both.
+.
+All expect a subsequent string argument specifying the color.
+.
+.RS
+.EX
+circle shaded \[dq]green\[dq] outline \[dq]black\[dq]
+.EE
+.RE
+.
+Color is not yet supported in \*[tx] mode.
+.
+Device macro files like
+.I ps.tmac
+declare color names;
+you can define additional ones with the
+.B \%defcolor
+request
+(see
+.MR groff @MAN7EXT@ ).
+.
+.
+.LP
+To change the name of the vbox in \*[tx] mode,
+set the pseudo-variable
+.B \%figname
+(which is actually a specially parsed command)
+within a picture.
+.
+Example:
+.RS
+.LP
+.B .PS
+.br
+.B figname = foobar;
+.br
+.B ...
+.br
+.B .PE
+.RE
+.
+.
+.LP
+The picture is then available in the box
+.BR \[rs]foobar .
+.
+.
+.LP
+.I @g@pic
+assumes that at the beginning of a picture both glyph and fill color are
+set to the default value.
+.
+.
+.LP
+Arrow heads will be drawn as solid triangles if the variable
+.B arrowhead
+is non-zero and either \*[tx] mode is enabled or the
+.B \-n
+option has not been given.
+.
+Initially,
+.B arrowhead
+has a value of\ 1.
+.
+Solid arrow heads are always filled with the current outline color.
+.
+.
+.LP
+The
+.I troff
+output of
+.I @g@pic
+is device-independent.
+.
+The
+.B \-T
+option is therefore redundant.
+.
+All numbers are taken to be in inches;
+numbers are never interpreted to be in
+.I troff
+machine units.
+.
+.
+.LP
+Objects can have an
+.B aligned
+attribute.
+.
+This will only work if the postprocessor is
+.MR grops @MAN1EXT@
+or
+.MR gropdf @MAN1EXT@ .
+.
+Any text associated with an object having the
+.B aligned
+attribute will be rotated about the center of the object
+so that it is aligned in the direction from the start point
+to the end point of the object.
+.
+This attribute will have no effect on objects whose start and end points
+are coincident.
+.
+.
+.LP
+In places where
+.IB n th
+is allowed,
+.BI \[aq] expr \[aq]th
+is also allowed.
+.
+.RB \[lq] \[aq]th \[lq]
+is a single token:
+no space is allowed between the apostrophe and the
+.RB \[lq] th \[rq].
+.
+.
+For example,
+.IP
+.EX
+for i = 1 to 4 do {
+ line from \[aq]i\[aq]th box.nw to \[aq]i+1\[aq]th box.se
+}
+.EE
+.
+.
+.\" ====================================================================
+.SH Conversion
+.\" ====================================================================
+.
+To obtain a stand-alone picture from a
+.I @g@pic
+file,
+enclose your
+.I pic \" language
+code with
+.B .PS
+and
+.B .PE
+requests;
+.I roff
+configuration commands may be added at the beginning of the file,
+but no
+.I roff
+text.
+.
+.
+.LP
+It is necessary to feed this file into
+.I groff
+without adding any page information,
+so you must check which
+.B .PS
+and
+.B .PE
+requests are actually called.
+.
+For example,
+the
+.I mm
+macro package adds a page number,
+which is very annoying.
+.
+At the moment,
+calling standard
+.I groff
+without any macro package works.
+.
+Alternatively,
+you can define your own requests,
+e.g.,
+to do nothing:
+.
+.
+.LP
+.RS
+.EX
+\&.de PS
+\&..
+\&.de PE
+\&..
+.EE
+.RE
+.
+.
+.LP
+.I groff
+itself does not provide direct conversion into other graphics file
+formats.
+.
+But there are lots of possibilities if you first transform your
+picture into PostScript\*R format using the
+.I groff
+option
+.BR \-Tps .
+.
+Since this
+.IR ps -file
+lacks BoundingBox information it is not very useful by itself, but it
+may be fed into other conversion programs, usually named
+.BI ps2 other
+or
+.BI psto other
+or the like.
+.
+Moreover,
+the PostScript interpreter Ghostscript
+.RI ( gs (1))
+has built-in graphics conversion devices that are called with the option
+.
+.
+.LP
+.RS
+.BI "gs \-sDEVICE=" <devname>
+.RE
+.
+.
+.LP
+Call
+.
+.
+.LP
+.RS
+.B gs \-\-help
+.RE
+.
+.
+.LP
+for a list of the available devices.
+.
+.
+.LP
+An alternative may be to use the
+.B \-Tpdf
+option to convert your picture directly into
+.B PDF
+format.
+.
+The MediaBox of the file produced can be controlled by passing a
+.B \-P\-p
+papersize to
+.IR groff .
+.
+.
+.br
+.ne 3v
+.P
+As the Encapsulated PostScript File Format
+.B EPS
+is getting more and more important,
+and the conversion wasn't regarded trivial in the past you might be
+interested to know that there is a conversion tool named
+.I ps2eps
+which does the right job.
+.
+It is much better than the tool
+.I ps2epsi
+packaged with
+.IR gs .
+.
+.
+.LP
+For bitmapped graphic formats,
+you should use
+.IR pstopnm ;
+the resulting (intermediate)
+.MR pnm 5
+file can be then converted to virtually any graphics format using the
+tools of the
+.B netpbm
+package.
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @MACRODIR@/pic.tmac
+offers simple definitions of the
+.BR PS ,
+.BR PE ,
+.BR PF ,
+and
+.B PY
+macros.
+.
+.
+.\" ====================================================================
+.SH Bugs
+.\" ====================================================================
+.
+Characters that are invalid as input to GNU
+.I troff \" GNU
+(see the
+.I groff
+Texinfo manual or
+.MR groff_char @MAN7EXT@
+for a list)
+are rejected even in \*[tx] mode.
+.
+.
+.LP
+The interpretation of
+.B \%fillval
+is incompatible with the
+.I pic \" AT&T
+in Tenth Edition Research Unix,
+which interprets 0 as black and 1 as white.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.TP
+.I @DOCDIR@/\:pic\:.ps
+\[lq]Making Pictures with GNU pic\[rq],
+by Eric S.\& Raymond.
+.
+This file,
+together with its source,
+.IR pic.ms ,
+is part of the
+.I groff
+distribution.
+.
+.
+.P
+\[lq]PIC\[em]A Graphics Language for Typesetting: User Manual\[rq],
+by Brian W.\& Kernighan,
+1984
+(revised 1991),
+AT&T Bell Laboratories Computing Science Technical Report No.\& 116
+.
+.
+.P
+.I ps2eps
+is available from CTAN mirrors, e.g.,
+.UR ftp://\:ftp\:.dante\:.de/\:tex\-archive/\:support/\:ps2eps/
+.UE
+.
+.
+.LP
+W.\& Richard Stevens,
+.UR http://\:www\:.kohala\:.com/\:start/\:troff/\:pic2html\:.html
+.I Turning PIC into HTML
+.UE
+.
+.
+.LP
+W.\& Richard Stevens,
+.UR http://\:www\:.kohala\:.com/\:start/\:troff/\:pic\:.examples\:.ps
+.IR "Examples of " pic " Macros"
+.UE
+.
+.
+.LP
+.MR @g@troff @MAN1EXT@ ,
+.MR groff_out @MAN5EXT@ ,
+.MR tex 1 ,
+.MR gs 1 ,
+.MR ps2eps 1 ,
+.MR pstopnm 1 ,
+.MR ps2epsi 1 ,
+.MR pnm 5
+.
+.
+.\" Clean up.
+.rm tx
+.rm lx
+.rm ic
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_pic_1_man_C]
+.do rr *groff_pic_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/preproc/pic/pic.am b/src/preproc/pic/pic.am
new file mode 100644
index 0000000..fae1372
--- /dev/null
+++ b/src/preproc/pic/pic.am
@@ -0,0 +1,56 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+prefixexecbin_PROGRAMS += pic
+pic_CPPFLAGS = $(AM_CPPFLAGS) \
+ -I $(top_srcdir)/src/preproc/pic \
+ -I $(top_builddir)/src/preproc/pic
+pic_LDADD = libgroff.a $(LIBM) lib/libgnu.a
+pic_SOURCES = \
+ src/preproc/pic/pic.ypp \
+ src/preproc/pic/lex.cpp \
+ src/preproc/pic/main.cpp \
+ src/preproc/pic/object.cpp \
+ src/preproc/pic/common.cpp \
+ src/preproc/pic/troff.cpp \
+ src/preproc/pic/tex.cpp \
+ src/preproc/pic/pic.h \
+ src/preproc/pic/position.h \
+ src/preproc/pic/text.h \
+ src/preproc/pic/common.h \
+ src/preproc/pic/output.h \
+ src/preproc/pic/object.h
+
+PREFIXMAN1 += src/preproc/pic/pic.1
+EXTRA_DIST += \
+ src/preproc/pic/TODO \
+ src/preproc/pic/pic.1.man
+
+# Since pic_CPPFLAGS was set, all .o files have a 'pic-' prefix.
+src/preproc/pic/pic-lex.$(OBJEXT): src/preproc/pic/pic.hpp
+
+MAINTAINERCLEANFILES += \
+ src/preproc/pic/pic.cpp \
+ src/preproc/pic/pic.hpp \
+ src/preproc/pic/pic.output
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/preproc/pic/pic.cpp b/src/preproc/pic/pic.cpp
new file mode 100644
index 0000000..14b15e4
--- /dev/null
+++ b/src/preproc/pic/pic.cpp
@@ -0,0 +1,5080 @@
+/* A Bison parser, made by GNU Bison 3.8.2. */
+
+/* Bison implementation for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 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, see <https://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+ simplifying the original so-called "semantic" parser. */
+
+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+ especially those whose name start with YY_ or yy_. They are
+ private implementation details that can be changed or removed. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+/* Identify Bison output, and Bison version. */
+#define YYBISON 30802
+
+/* Bison version string. */
+#define YYBISON_VERSION "3.8.2"
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers. */
+#define YYPURE 0
+
+/* Push parsers. */
+#define YYPUSH 0
+
+/* Pull parsers. */
+#define YYPULL 1
+
+
+
+
+/* First part of user prologue. */
+#line 19 "../src/preproc/pic/pic.ypp"
+
+#include "pic.h"
+#include "ptable.h"
+#include "object.h"
+
+extern int delim_flag;
+extern void copy_rest_thru(const char *, const char *);
+extern void copy_file_thru(const char *, const char *, const char *);
+extern void push_body(const char *);
+extern void do_for(char *var, double from, double to,
+ int by_is_multiplicative, double by, char *body);
+extern void do_lookahead();
+
+/* Maximum number of characters produced by printf("%g") */
+#define GDIGITS 14
+
+int yylex();
+void yyerror(const char *);
+
+void reset(const char *nm);
+void reset_all();
+
+place *lookup_label(const char *);
+void define_label(const char *label, const place *pl);
+
+direction current_direction;
+position current_position;
+
+implement_ptable(place)
+
+PTABLE(place) top_table;
+
+PTABLE(place) *current_table = &top_table;
+saved_state *current_saved_state = 0;
+
+object_list olist;
+
+const char *ordinal_postfix(int n);
+const char *object_type_name(object_type type);
+char *format_number(const char *fmt, double n);
+char *do_sprintf(const char *fmt, const double *v, int nv);
+
+
+#line 115 "src/preproc/pic/pic.cpp"
+
+# ifndef YY_CAST
+# ifdef __cplusplus
+# define YY_CAST(Type, Val) static_cast<Type> (Val)
+# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast<Type> (Val)
+# else
+# define YY_CAST(Type, Val) ((Type) (Val))
+# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val))
+# endif
+# endif
+# ifndef YY_NULLPTR
+# if defined __cplusplus
+# if 201103L <= __cplusplus
+# define YY_NULLPTR nullptr
+# else
+# define YY_NULLPTR 0
+# endif
+# else
+# define YY_NULLPTR ((void*)0)
+# endif
+# endif
+
+/* Use api.header.include to #include this header
+ instead of duplicating it here. */
+#ifndef YY_YY_SRC_PREPROC_PIC_PIC_HPP_INCLUDED
+# define YY_YY_SRC_PREPROC_PIC_PIC_HPP_INCLUDED
+/* Debug traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int yydebug;
+#endif
+
+/* Token kinds. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ enum yytokentype
+ {
+ YYEMPTY = -2,
+ YYEOF = 0, /* "end of file" */
+ YYerror = 256, /* error */
+ YYUNDEF = 257, /* "invalid token" */
+ LABEL = 258, /* LABEL */
+ VARIABLE = 259, /* VARIABLE */
+ NUMBER = 260, /* NUMBER */
+ TEXT = 261, /* TEXT */
+ COMMAND_LINE = 262, /* COMMAND_LINE */
+ DELIMITED = 263, /* DELIMITED */
+ ORDINAL = 264, /* ORDINAL */
+ TH = 265, /* TH */
+ LEFT_ARROW_HEAD = 266, /* LEFT_ARROW_HEAD */
+ RIGHT_ARROW_HEAD = 267, /* RIGHT_ARROW_HEAD */
+ DOUBLE_ARROW_HEAD = 268, /* DOUBLE_ARROW_HEAD */
+ LAST = 269, /* LAST */
+ BOX = 270, /* BOX */
+ CIRCLE = 271, /* CIRCLE */
+ ELLIPSE = 272, /* ELLIPSE */
+ ARC = 273, /* ARC */
+ LINE = 274, /* LINE */
+ ARROW = 275, /* ARROW */
+ MOVE = 276, /* MOVE */
+ SPLINE = 277, /* SPLINE */
+ HEIGHT = 278, /* HEIGHT */
+ RADIUS = 279, /* RADIUS */
+ FIGNAME = 280, /* FIGNAME */
+ WIDTH = 281, /* WIDTH */
+ DIAMETER = 282, /* DIAMETER */
+ UP = 283, /* UP */
+ DOWN = 284, /* DOWN */
+ RIGHT = 285, /* RIGHT */
+ LEFT = 286, /* LEFT */
+ FROM = 287, /* FROM */
+ TO = 288, /* TO */
+ AT = 289, /* AT */
+ WITH = 290, /* WITH */
+ BY = 291, /* BY */
+ THEN = 292, /* THEN */
+ SOLID = 293, /* SOLID */
+ DOTTED = 294, /* DOTTED */
+ DASHED = 295, /* DASHED */
+ CHOP = 296, /* CHOP */
+ SAME = 297, /* SAME */
+ INVISIBLE = 298, /* INVISIBLE */
+ LJUST = 299, /* LJUST */
+ RJUST = 300, /* RJUST */
+ ABOVE = 301, /* ABOVE */
+ BELOW = 302, /* BELOW */
+ OF = 303, /* OF */
+ THE = 304, /* THE */
+ WAY = 305, /* WAY */
+ BETWEEN = 306, /* BETWEEN */
+ AND = 307, /* AND */
+ HERE = 308, /* HERE */
+ DOT_N = 309, /* DOT_N */
+ DOT_E = 310, /* DOT_E */
+ DOT_W = 311, /* DOT_W */
+ DOT_S = 312, /* DOT_S */
+ DOT_NE = 313, /* DOT_NE */
+ DOT_SE = 314, /* DOT_SE */
+ DOT_NW = 315, /* DOT_NW */
+ DOT_SW = 316, /* DOT_SW */
+ DOT_C = 317, /* DOT_C */
+ DOT_START = 318, /* DOT_START */
+ DOT_END = 319, /* DOT_END */
+ DOT_X = 320, /* DOT_X */
+ DOT_Y = 321, /* DOT_Y */
+ DOT_HT = 322, /* DOT_HT */
+ DOT_WID = 323, /* DOT_WID */
+ DOT_RAD = 324, /* DOT_RAD */
+ SIN = 325, /* SIN */
+ COS = 326, /* COS */
+ ATAN2 = 327, /* ATAN2 */
+ LOG = 328, /* LOG */
+ EXP = 329, /* EXP */
+ SQRT = 330, /* SQRT */
+ K_MAX = 331, /* K_MAX */
+ K_MIN = 332, /* K_MIN */
+ INT = 333, /* INT */
+ RAND = 334, /* RAND */
+ SRAND = 335, /* SRAND */
+ COPY = 336, /* COPY */
+ THRU = 337, /* THRU */
+ TOP = 338, /* TOP */
+ BOTTOM = 339, /* BOTTOM */
+ UPPER = 340, /* UPPER */
+ LOWER = 341, /* LOWER */
+ SH = 342, /* SH */
+ PRINT = 343, /* PRINT */
+ CW = 344, /* CW */
+ CCW = 345, /* CCW */
+ FOR = 346, /* FOR */
+ DO = 347, /* DO */
+ IF = 348, /* IF */
+ ELSE = 349, /* ELSE */
+ ANDAND = 350, /* ANDAND */
+ OROR = 351, /* OROR */
+ NOTEQUAL = 352, /* NOTEQUAL */
+ EQUALEQUAL = 353, /* EQUALEQUAL */
+ LESSEQUAL = 354, /* LESSEQUAL */
+ GREATEREQUAL = 355, /* GREATEREQUAL */
+ LEFT_CORNER = 356, /* LEFT_CORNER */
+ RIGHT_CORNER = 357, /* RIGHT_CORNER */
+ NORTH = 358, /* NORTH */
+ SOUTH = 359, /* SOUTH */
+ EAST = 360, /* EAST */
+ WEST = 361, /* WEST */
+ CENTER = 362, /* CENTER */
+ END = 363, /* END */
+ START = 364, /* START */
+ RESET = 365, /* RESET */
+ UNTIL = 366, /* UNTIL */
+ PLOT = 367, /* PLOT */
+ THICKNESS = 368, /* THICKNESS */
+ FILL = 369, /* FILL */
+ COLORED = 370, /* COLORED */
+ OUTLINED = 371, /* OUTLINED */
+ SHADED = 372, /* SHADED */
+ XSLANTED = 373, /* XSLANTED */
+ YSLANTED = 374, /* YSLANTED */
+ ALIGNED = 375, /* ALIGNED */
+ SPRINTF = 376, /* SPRINTF */
+ COMMAND = 377, /* COMMAND */
+ DEFINE = 378, /* DEFINE */
+ UNDEF = 379 /* UNDEF */
+ };
+ typedef enum yytokentype yytoken_kind_t;
+#endif
+/* Token kinds. */
+#define YYEMPTY -2
+#define YYEOF 0
+#define YYerror 256
+#define YYUNDEF 257
+#define LABEL 258
+#define VARIABLE 259
+#define NUMBER 260
+#define TEXT 261
+#define COMMAND_LINE 262
+#define DELIMITED 263
+#define ORDINAL 264
+#define TH 265
+#define LEFT_ARROW_HEAD 266
+#define RIGHT_ARROW_HEAD 267
+#define DOUBLE_ARROW_HEAD 268
+#define LAST 269
+#define BOX 270
+#define CIRCLE 271
+#define ELLIPSE 272
+#define ARC 273
+#define LINE 274
+#define ARROW 275
+#define MOVE 276
+#define SPLINE 277
+#define HEIGHT 278
+#define RADIUS 279
+#define FIGNAME 280
+#define WIDTH 281
+#define DIAMETER 282
+#define UP 283
+#define DOWN 284
+#define RIGHT 285
+#define LEFT 286
+#define FROM 287
+#define TO 288
+#define AT 289
+#define WITH 290
+#define BY 291
+#define THEN 292
+#define SOLID 293
+#define DOTTED 294
+#define DASHED 295
+#define CHOP 296
+#define SAME 297
+#define INVISIBLE 298
+#define LJUST 299
+#define RJUST 300
+#define ABOVE 301
+#define BELOW 302
+#define OF 303
+#define THE 304
+#define WAY 305
+#define BETWEEN 306
+#define AND 307
+#define HERE 308
+#define DOT_N 309
+#define DOT_E 310
+#define DOT_W 311
+#define DOT_S 312
+#define DOT_NE 313
+#define DOT_SE 314
+#define DOT_NW 315
+#define DOT_SW 316
+#define DOT_C 317
+#define DOT_START 318
+#define DOT_END 319
+#define DOT_X 320
+#define DOT_Y 321
+#define DOT_HT 322
+#define DOT_WID 323
+#define DOT_RAD 324
+#define SIN 325
+#define COS 326
+#define ATAN2 327
+#define LOG 328
+#define EXP 329
+#define SQRT 330
+#define K_MAX 331
+#define K_MIN 332
+#define INT 333
+#define RAND 334
+#define SRAND 335
+#define COPY 336
+#define THRU 337
+#define TOP 338
+#define BOTTOM 339
+#define UPPER 340
+#define LOWER 341
+#define SH 342
+#define PRINT 343
+#define CW 344
+#define CCW 345
+#define FOR 346
+#define DO 347
+#define IF 348
+#define ELSE 349
+#define ANDAND 350
+#define OROR 351
+#define NOTEQUAL 352
+#define EQUALEQUAL 353
+#define LESSEQUAL 354
+#define GREATEREQUAL 355
+#define LEFT_CORNER 356
+#define RIGHT_CORNER 357
+#define NORTH 358
+#define SOUTH 359
+#define EAST 360
+#define WEST 361
+#define CENTER 362
+#define END 363
+#define START 364
+#define RESET 365
+#define UNTIL 366
+#define PLOT 367
+#define THICKNESS 368
+#define FILL 369
+#define COLORED 370
+#define OUTLINED 371
+#define SHADED 372
+#define XSLANTED 373
+#define YSLANTED 374
+#define ALIGNED 375
+#define SPRINTF 376
+#define COMMAND 377
+#define DEFINE 378
+#define UNDEF 379
+
+/* Value type. */
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+union YYSTYPE
+{
+#line 65 "../src/preproc/pic/pic.ypp"
+
+ char *str;
+ int n;
+ double x;
+ struct { double x, y; } pair;
+ struct { double x; char *body; } if_data;
+ struct { char *str; const char *filename; int lineno; } lstr;
+ struct { double *v; int nv; int maxv; } dv;
+ struct { double val; int is_multiplicative; } by;
+ place pl;
+ object *obj;
+ corner crn;
+ path *pth;
+ object_spec *spec;
+ saved_state *pstate;
+ graphics_state state;
+ object_type obtype;
+
+#line 435 "src/preproc/pic/pic.cpp"
+
+};
+typedef union YYSTYPE YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+extern YYSTYPE yylval;
+
+
+int yyparse (void);
+
+
+#endif /* !YY_YY_SRC_PREPROC_PIC_PIC_HPP_INCLUDED */
+/* Symbol kind. */
+enum yysymbol_kind_t
+{
+ YYSYMBOL_YYEMPTY = -2,
+ YYSYMBOL_YYEOF = 0, /* "end of file" */
+ YYSYMBOL_YYerror = 1, /* error */
+ YYSYMBOL_YYUNDEF = 2, /* "invalid token" */
+ YYSYMBOL_LABEL = 3, /* LABEL */
+ YYSYMBOL_VARIABLE = 4, /* VARIABLE */
+ YYSYMBOL_NUMBER = 5, /* NUMBER */
+ YYSYMBOL_TEXT = 6, /* TEXT */
+ YYSYMBOL_COMMAND_LINE = 7, /* COMMAND_LINE */
+ YYSYMBOL_DELIMITED = 8, /* DELIMITED */
+ YYSYMBOL_ORDINAL = 9, /* ORDINAL */
+ YYSYMBOL_TH = 10, /* TH */
+ YYSYMBOL_LEFT_ARROW_HEAD = 11, /* LEFT_ARROW_HEAD */
+ YYSYMBOL_RIGHT_ARROW_HEAD = 12, /* RIGHT_ARROW_HEAD */
+ YYSYMBOL_DOUBLE_ARROW_HEAD = 13, /* DOUBLE_ARROW_HEAD */
+ YYSYMBOL_LAST = 14, /* LAST */
+ YYSYMBOL_BOX = 15, /* BOX */
+ YYSYMBOL_CIRCLE = 16, /* CIRCLE */
+ YYSYMBOL_ELLIPSE = 17, /* ELLIPSE */
+ YYSYMBOL_ARC = 18, /* ARC */
+ YYSYMBOL_LINE = 19, /* LINE */
+ YYSYMBOL_ARROW = 20, /* ARROW */
+ YYSYMBOL_MOVE = 21, /* MOVE */
+ YYSYMBOL_SPLINE = 22, /* SPLINE */
+ YYSYMBOL_HEIGHT = 23, /* HEIGHT */
+ YYSYMBOL_RADIUS = 24, /* RADIUS */
+ YYSYMBOL_FIGNAME = 25, /* FIGNAME */
+ YYSYMBOL_WIDTH = 26, /* WIDTH */
+ YYSYMBOL_DIAMETER = 27, /* DIAMETER */
+ YYSYMBOL_UP = 28, /* UP */
+ YYSYMBOL_DOWN = 29, /* DOWN */
+ YYSYMBOL_RIGHT = 30, /* RIGHT */
+ YYSYMBOL_LEFT = 31, /* LEFT */
+ YYSYMBOL_FROM = 32, /* FROM */
+ YYSYMBOL_TO = 33, /* TO */
+ YYSYMBOL_AT = 34, /* AT */
+ YYSYMBOL_WITH = 35, /* WITH */
+ YYSYMBOL_BY = 36, /* BY */
+ YYSYMBOL_THEN = 37, /* THEN */
+ YYSYMBOL_SOLID = 38, /* SOLID */
+ YYSYMBOL_DOTTED = 39, /* DOTTED */
+ YYSYMBOL_DASHED = 40, /* DASHED */
+ YYSYMBOL_CHOP = 41, /* CHOP */
+ YYSYMBOL_SAME = 42, /* SAME */
+ YYSYMBOL_INVISIBLE = 43, /* INVISIBLE */
+ YYSYMBOL_LJUST = 44, /* LJUST */
+ YYSYMBOL_RJUST = 45, /* RJUST */
+ YYSYMBOL_ABOVE = 46, /* ABOVE */
+ YYSYMBOL_BELOW = 47, /* BELOW */
+ YYSYMBOL_OF = 48, /* OF */
+ YYSYMBOL_THE = 49, /* THE */
+ YYSYMBOL_WAY = 50, /* WAY */
+ YYSYMBOL_BETWEEN = 51, /* BETWEEN */
+ YYSYMBOL_AND = 52, /* AND */
+ YYSYMBOL_HERE = 53, /* HERE */
+ YYSYMBOL_DOT_N = 54, /* DOT_N */
+ YYSYMBOL_DOT_E = 55, /* DOT_E */
+ YYSYMBOL_DOT_W = 56, /* DOT_W */
+ YYSYMBOL_DOT_S = 57, /* DOT_S */
+ YYSYMBOL_DOT_NE = 58, /* DOT_NE */
+ YYSYMBOL_DOT_SE = 59, /* DOT_SE */
+ YYSYMBOL_DOT_NW = 60, /* DOT_NW */
+ YYSYMBOL_DOT_SW = 61, /* DOT_SW */
+ YYSYMBOL_DOT_C = 62, /* DOT_C */
+ YYSYMBOL_DOT_START = 63, /* DOT_START */
+ YYSYMBOL_DOT_END = 64, /* DOT_END */
+ YYSYMBOL_DOT_X = 65, /* DOT_X */
+ YYSYMBOL_DOT_Y = 66, /* DOT_Y */
+ YYSYMBOL_DOT_HT = 67, /* DOT_HT */
+ YYSYMBOL_DOT_WID = 68, /* DOT_WID */
+ YYSYMBOL_DOT_RAD = 69, /* DOT_RAD */
+ YYSYMBOL_SIN = 70, /* SIN */
+ YYSYMBOL_COS = 71, /* COS */
+ YYSYMBOL_ATAN2 = 72, /* ATAN2 */
+ YYSYMBOL_LOG = 73, /* LOG */
+ YYSYMBOL_EXP = 74, /* EXP */
+ YYSYMBOL_SQRT = 75, /* SQRT */
+ YYSYMBOL_K_MAX = 76, /* K_MAX */
+ YYSYMBOL_K_MIN = 77, /* K_MIN */
+ YYSYMBOL_INT = 78, /* INT */
+ YYSYMBOL_RAND = 79, /* RAND */
+ YYSYMBOL_SRAND = 80, /* SRAND */
+ YYSYMBOL_COPY = 81, /* COPY */
+ YYSYMBOL_THRU = 82, /* THRU */
+ YYSYMBOL_TOP = 83, /* TOP */
+ YYSYMBOL_BOTTOM = 84, /* BOTTOM */
+ YYSYMBOL_UPPER = 85, /* UPPER */
+ YYSYMBOL_LOWER = 86, /* LOWER */
+ YYSYMBOL_SH = 87, /* SH */
+ YYSYMBOL_PRINT = 88, /* PRINT */
+ YYSYMBOL_CW = 89, /* CW */
+ YYSYMBOL_CCW = 90, /* CCW */
+ YYSYMBOL_FOR = 91, /* FOR */
+ YYSYMBOL_DO = 92, /* DO */
+ YYSYMBOL_IF = 93, /* IF */
+ YYSYMBOL_ELSE = 94, /* ELSE */
+ YYSYMBOL_ANDAND = 95, /* ANDAND */
+ YYSYMBOL_OROR = 96, /* OROR */
+ YYSYMBOL_NOTEQUAL = 97, /* NOTEQUAL */
+ YYSYMBOL_EQUALEQUAL = 98, /* EQUALEQUAL */
+ YYSYMBOL_LESSEQUAL = 99, /* LESSEQUAL */
+ YYSYMBOL_GREATEREQUAL = 100, /* GREATEREQUAL */
+ YYSYMBOL_LEFT_CORNER = 101, /* LEFT_CORNER */
+ YYSYMBOL_RIGHT_CORNER = 102, /* RIGHT_CORNER */
+ YYSYMBOL_NORTH = 103, /* NORTH */
+ YYSYMBOL_SOUTH = 104, /* SOUTH */
+ YYSYMBOL_EAST = 105, /* EAST */
+ YYSYMBOL_WEST = 106, /* WEST */
+ YYSYMBOL_CENTER = 107, /* CENTER */
+ YYSYMBOL_END = 108, /* END */
+ YYSYMBOL_START = 109, /* START */
+ YYSYMBOL_RESET = 110, /* RESET */
+ YYSYMBOL_UNTIL = 111, /* UNTIL */
+ YYSYMBOL_PLOT = 112, /* PLOT */
+ YYSYMBOL_THICKNESS = 113, /* THICKNESS */
+ YYSYMBOL_FILL = 114, /* FILL */
+ YYSYMBOL_COLORED = 115, /* COLORED */
+ YYSYMBOL_OUTLINED = 116, /* OUTLINED */
+ YYSYMBOL_SHADED = 117, /* SHADED */
+ YYSYMBOL_XSLANTED = 118, /* XSLANTED */
+ YYSYMBOL_YSLANTED = 119, /* YSLANTED */
+ YYSYMBOL_ALIGNED = 120, /* ALIGNED */
+ YYSYMBOL_SPRINTF = 121, /* SPRINTF */
+ YYSYMBOL_COMMAND = 122, /* COMMAND */
+ YYSYMBOL_DEFINE = 123, /* DEFINE */
+ YYSYMBOL_UNDEF = 124, /* UNDEF */
+ YYSYMBOL_125_ = 125, /* '.' */
+ YYSYMBOL_126_ = 126, /* '(' */
+ YYSYMBOL_127_ = 127, /* '`' */
+ YYSYMBOL_128_ = 128, /* '[' */
+ YYSYMBOL_129_ = 129, /* ',' */
+ YYSYMBOL_130_ = 130, /* '<' */
+ YYSYMBOL_131_ = 131, /* '>' */
+ YYSYMBOL_132_ = 132, /* '+' */
+ YYSYMBOL_133_ = 133, /* '-' */
+ YYSYMBOL_134_ = 134, /* '*' */
+ YYSYMBOL_135_ = 135, /* '/' */
+ YYSYMBOL_136_ = 136, /* '%' */
+ YYSYMBOL_137_ = 137, /* '!' */
+ YYSYMBOL_138_ = 138, /* '^' */
+ YYSYMBOL_139_ = 139, /* ';' */
+ YYSYMBOL_140_ = 140, /* '=' */
+ YYSYMBOL_141_ = 141, /* ':' */
+ YYSYMBOL_142_ = 142, /* '{' */
+ YYSYMBOL_143_ = 143, /* '}' */
+ YYSYMBOL_144_ = 144, /* ']' */
+ YYSYMBOL_145_ = 145, /* ')' */
+ YYSYMBOL_YYACCEPT = 146, /* $accept */
+ YYSYMBOL_top = 147, /* top */
+ YYSYMBOL_element_list = 148, /* element_list */
+ YYSYMBOL_middle_element_list = 149, /* middle_element_list */
+ YYSYMBOL_optional_separator = 150, /* optional_separator */
+ YYSYMBOL_separator = 151, /* separator */
+ YYSYMBOL_placeless_element = 152, /* placeless_element */
+ YYSYMBOL_153_1 = 153, /* $@1 */
+ YYSYMBOL_154_2 = 154, /* $@2 */
+ YYSYMBOL_155_3 = 155, /* $@3 */
+ YYSYMBOL_156_4 = 156, /* $@4 */
+ YYSYMBOL_157_5 = 157, /* $@5 */
+ YYSYMBOL_158_6 = 158, /* $@6 */
+ YYSYMBOL_159_7 = 159, /* $@7 */
+ YYSYMBOL_macro_name = 160, /* macro_name */
+ YYSYMBOL_reset_variables = 161, /* reset_variables */
+ YYSYMBOL_print_args = 162, /* print_args */
+ YYSYMBOL_print_arg = 163, /* print_arg */
+ YYSYMBOL_simple_if = 164, /* simple_if */
+ YYSYMBOL_165_8 = 165, /* $@8 */
+ YYSYMBOL_until = 166, /* until */
+ YYSYMBOL_any_expr = 167, /* any_expr */
+ YYSYMBOL_text_expr = 168, /* text_expr */
+ YYSYMBOL_optional_by = 169, /* optional_by */
+ YYSYMBOL_element = 170, /* element */
+ YYSYMBOL_171_9 = 171, /* @9 */
+ YYSYMBOL_172_10 = 172, /* $@10 */
+ YYSYMBOL_optional_element = 173, /* optional_element */
+ YYSYMBOL_object_spec = 174, /* object_spec */
+ YYSYMBOL_175_11 = 175, /* @11 */
+ YYSYMBOL_text = 176, /* text */
+ YYSYMBOL_sprintf_args = 177, /* sprintf_args */
+ YYSYMBOL_position = 178, /* position */
+ YYSYMBOL_position_not_place = 179, /* position_not_place */
+ YYSYMBOL_between = 180, /* between */
+ YYSYMBOL_expr_pair = 181, /* expr_pair */
+ YYSYMBOL_place = 182, /* place */
+ YYSYMBOL_label = 183, /* label */
+ YYSYMBOL_ordinal = 184, /* ordinal */
+ YYSYMBOL_optional_ordinal_last = 185, /* optional_ordinal_last */
+ YYSYMBOL_nth_primitive = 186, /* nth_primitive */
+ YYSYMBOL_object_type = 187, /* object_type */
+ YYSYMBOL_label_path = 188, /* label_path */
+ YYSYMBOL_relative_path = 189, /* relative_path */
+ YYSYMBOL_path = 190, /* path */
+ YYSYMBOL_corner = 191, /* corner */
+ YYSYMBOL_expr = 192, /* expr */
+ YYSYMBOL_expr_lower_than = 193, /* expr_lower_than */
+ YYSYMBOL_expr_not_lower_than = 194 /* expr_not_lower_than */
+};
+typedef enum yysymbol_kind_t yysymbol_kind_t;
+
+
+
+
+#ifdef short
+# undef short
+#endif
+
+/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure
+ <limits.h> and (if available) <stdint.h> are included
+ so that the code can choose integer types of a good width. */
+
+#ifndef __PTRDIFF_MAX__
+# include <limits.h> /* INFRINGES ON USER NAME SPACE */
+# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+# include <stdint.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_STDINT_H
+# endif
+#endif
+
+/* Narrow types that promote to a signed type and that can represent a
+ signed or unsigned integer of at least N bits. In tables they can
+ save space and decrease cache pressure. Promoting to a signed type
+ helps avoid bugs in integer arithmetic. */
+
+#ifdef __INT_LEAST8_MAX__
+typedef __INT_LEAST8_TYPE__ yytype_int8;
+#elif defined YY_STDINT_H
+typedef int_least8_t yytype_int8;
+#else
+typedef signed char yytype_int8;
+#endif
+
+#ifdef __INT_LEAST16_MAX__
+typedef __INT_LEAST16_TYPE__ yytype_int16;
+#elif defined YY_STDINT_H
+typedef int_least16_t yytype_int16;
+#else
+typedef short yytype_int16;
+#endif
+
+/* Work around bug in HP-UX 11.23, which defines these macros
+ incorrectly for preprocessor constants. This workaround can likely
+ be removed in 2023, as HPE has promised support for HP-UX 11.23
+ (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of
+ <https://h20195.www2.hpe.com/V2/getpdf.aspx/4AA4-7673ENW.pdf>. */
+#ifdef __hpux
+# undef UINT_LEAST8_MAX
+# undef UINT_LEAST16_MAX
+# define UINT_LEAST8_MAX 255
+# define UINT_LEAST16_MAX 65535
+#endif
+
+#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST8_TYPE__ yytype_uint8;
+#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \
+ && UINT_LEAST8_MAX <= INT_MAX)
+typedef uint_least8_t yytype_uint8;
+#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX
+typedef unsigned char yytype_uint8;
+#else
+typedef short yytype_uint8;
+#endif
+
+#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST16_TYPE__ yytype_uint16;
+#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \
+ && UINT_LEAST16_MAX <= INT_MAX)
+typedef uint_least16_t yytype_uint16;
+#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX
+typedef unsigned short yytype_uint16;
+#else
+typedef int yytype_uint16;
+#endif
+
+#ifndef YYPTRDIFF_T
+# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__
+# define YYPTRDIFF_T __PTRDIFF_TYPE__
+# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__
+# elif defined PTRDIFF_MAX
+# ifndef ptrdiff_t
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# endif
+# define YYPTRDIFF_T ptrdiff_t
+# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX
+# else
+# define YYPTRDIFF_T long
+# define YYPTRDIFF_MAXIMUM LONG_MAX
+# endif
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+# define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+# define YYSIZE_T size_t
+# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# else
+# define YYSIZE_T unsigned
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM \
+ YY_CAST (YYPTRDIFF_T, \
+ (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \
+ ? YYPTRDIFF_MAXIMUM \
+ : YY_CAST (YYSIZE_T, -1)))
+
+#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))
+
+
+/* Stored state numbers (used for stacks). */
+typedef yytype_int16 yy_state_t;
+
+/* State numbers in computations. */
+typedef int yy_state_fast_t;
+
+#ifndef YY_
+# if defined YYENABLE_NLS && YYENABLE_NLS
+# if ENABLE_NLS
+# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_(Msgid) dgettext ("bison-runtime", Msgid)
+# endif
+# endif
+# ifndef YY_
+# define YY_(Msgid) Msgid
+# endif
+#endif
+
+
+#ifndef YY_ATTRIBUTE_PURE
+# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
+# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+# define YY_ATTRIBUTE_PURE
+# endif
+#endif
+
+#ifndef YY_ATTRIBUTE_UNUSED
+# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
+# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+# else
+# define YY_ATTRIBUTE_UNUSED
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E. */
+#if ! defined lint || defined __GNUC__
+# define YY_USE(E) ((void) (E))
+#else
+# define YY_USE(E) /* empty */
+#endif
+
+/* Suppress an incorrect diagnostic about yylval being uninitialized. */
+#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__
+# if __GNUC__ * 100 + __GNUC_MINOR__ < 407
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")
+# else
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \
+ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+# endif
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
+ _Pragma ("GCC diagnostic pop")
+#else
+# define YY_INITIAL_VALUE(Value) Value
+#endif
+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END
+#endif
+#ifndef YY_INITIAL_VALUE
+# define YY_INITIAL_VALUE(Value) /* Nothing. */
+#endif
+
+#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__
+# define YY_IGNORE_USELESS_CAST_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"")
+# define YY_IGNORE_USELESS_CAST_END \
+ _Pragma ("GCC diagnostic pop")
+#endif
+#ifndef YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_END
+#endif
+
+
+#define YY_ASSERT(E) ((void) (0 && (E)))
+
+#if !defined yyoverflow
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# ifdef YYSTACK_USE_ALLOCA
+# if YYSTACK_USE_ALLOCA
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# elif defined __BUILTIN_VA_ARG_INCR
+# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+# elif defined _AIX
+# define YYSTACK_ALLOC __alloca
+# elif defined _MSC_VER
+# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+# define alloca _alloca
+# else
+# define YYSTACK_ALLOC alloca
+# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+ /* Use EXIT_SUCCESS as a witness for stdlib.h. */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's 'empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# ifndef YYSTACK_ALLOC_MAXIMUM
+ /* The OS might guarantee only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
+ to allow for a few compiler-allocated temporary stack slots. */
+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+# endif
+# else
+# define YYSTACK_ALLOC YYMALLOC
+# define YYSTACK_FREE YYFREE
+# ifndef YYSTACK_ALLOC_MAXIMUM
+# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+# endif
+# if (defined __cplusplus && ! defined EXIT_SUCCESS \
+ && ! ((defined YYMALLOC || defined malloc) \
+ && (defined YYFREE || defined free)))
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# ifndef YYMALLOC
+# define YYMALLOC malloc
+# if ! defined malloc && ! defined EXIT_SUCCESS
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# ifndef YYFREE
+# define YYFREE free
+# if ! defined free && ! defined EXIT_SUCCESS
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# endif
+#endif /* !defined yyoverflow */
+
+#if (! defined yyoverflow \
+ && (! defined __cplusplus \
+ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ yy_state_t yyss_alloc;
+ YYSTYPE yyvs_alloc;
+};
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# define YYSTACK_BYTES(N) \
+ ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
+
+# define YYCOPY_NEEDED 1
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
+ do \
+ { \
+ YYPTRDIFF_T yynewbytes; \
+ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
+ Stack = &yyptr->Stack_alloc; \
+ yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / YYSIZEOF (*yyptr); \
+ } \
+ while (0)
+
+#endif
+
+#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
+/* Copy COUNT objects from SRC to DST. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if defined __GNUC__ && 1 < __GNUC__
+# define YYCOPY(Dst, Src, Count) \
+ __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src)))
+# else
+# define YYCOPY(Dst, Src, Count) \
+ do \
+ { \
+ YYPTRDIFF_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (Dst)[yyi] = (Src)[yyi]; \
+ } \
+ while (0)
+# endif
+# endif
+#endif /* !YYCOPY_NEEDED */
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 6
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 2438
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 146
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 49
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 260
+/* YYNSTATES -- Number of states. */
+#define YYNSTATES 454
+
+/* YYMAXUTOK -- Last valid token kind. */
+#define YYMAXUTOK 379
+
+
+/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
+ as returned by yylex, with out-of-bounds checking. */
+#define YYTRANSLATE(YYX) \
+ (0 <= (YYX) && (YYX) <= YYMAXUTOK \
+ ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \
+ : YYSYMBOL_YYUNDEF)
+
+/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
+ as returned by yylex. */
+static const yytype_uint8 yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 137, 2, 2, 2, 136, 2, 2,
+ 126, 145, 134, 132, 129, 133, 125, 135, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 141, 139,
+ 130, 140, 131, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 128, 2, 144, 138, 2, 127, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 142, 2, 143, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
+ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
+ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
+ 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
+ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
+ 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
+ 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,
+ 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
+ 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
+ 115, 116, 117, 118, 119, 120, 121, 122, 123, 124
+};
+
+#if YYDEBUG
+/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
+static const yytype_int16 yyrline[] =
+{
+ 0, 275, 275, 276, 285, 290, 292, 296, 298, 302,
+ 303, 307, 315, 320, 332, 334, 336, 338, 340, 345,
+ 350, 357, 356, 372, 380, 382, 379, 393, 395, 392,
+ 405, 404, 413, 422, 421, 435, 436, 441, 442, 446,
+ 451, 456, 464, 466, 485, 492, 494, 505, 504, 516,
+ 517, 522, 524, 529, 535, 541, 543, 545, 547, 549,
+ 551, 553, 560, 564, 569, 577, 591, 597, 605, 612,
+ 618, 611, 627, 637, 638, 643, 645, 647, 649, 654,
+ 661, 668, 675, 682, 687, 694, 702, 701, 728, 734,
+ 740, 746, 752, 771, 778, 785, 792, 799, 806, 813,
+ 820, 827, 834, 849, 861, 867, 876, 883, 908, 912,
+ 918, 924, 930, 936, 941, 947, 953, 959, 966, 975,
+ 982, 998, 1015, 1020, 1025, 1030, 1035, 1040, 1045, 1050,
+ 1058, 1068, 1078, 1088, 1098, 1104, 1112, 1114, 1126, 1131,
+ 1161, 1163, 1169, 1178, 1180, 1185, 1190, 1195, 1200, 1205,
+ 1210, 1216, 1221, 1229, 1230, 1234, 1239, 1245, 1247, 1253,
+ 1259, 1265, 1274, 1284, 1286, 1295, 1297, 1305, 1307, 1312,
+ 1327, 1345, 1347, 1349, 1351, 1353, 1355, 1357, 1359, 1361,
+ 1366, 1368, 1376, 1380, 1382, 1390, 1392, 1398, 1404, 1410,
+ 1416, 1425, 1427, 1429, 1431, 1433, 1435, 1437, 1439, 1441,
+ 1443, 1445, 1447, 1449, 1451, 1453, 1455, 1457, 1459, 1461,
+ 1463, 1465, 1467, 1469, 1471, 1473, 1475, 1477, 1479, 1481,
+ 1483, 1485, 1487, 1492, 1494, 1499, 1504, 1512, 1514, 1521,
+ 1528, 1535, 1542, 1549, 1551, 1553, 1555, 1563, 1571, 1584,
+ 1586, 1588, 1597, 1606, 1619, 1628, 1637, 1646, 1648, 1650,
+ 1652, 1659, 1665, 1670, 1672, 1674, 1676, 1678, 1680, 1682,
+ 1684
+};
+#endif
+
+/** Accessing symbol of state STATE. */
+#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State])
+
+#if YYDEBUG || 0
+/* The user-facing name of the symbol whose (internal) number is
+ YYSYMBOL. No bounds checking. */
+static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
+
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+ "\"end of file\"", "error", "\"invalid token\"", "LABEL", "VARIABLE",
+ "NUMBER", "TEXT", "COMMAND_LINE", "DELIMITED", "ORDINAL", "TH",
+ "LEFT_ARROW_HEAD", "RIGHT_ARROW_HEAD", "DOUBLE_ARROW_HEAD", "LAST",
+ "BOX", "CIRCLE", "ELLIPSE", "ARC", "LINE", "ARROW", "MOVE", "SPLINE",
+ "HEIGHT", "RADIUS", "FIGNAME", "WIDTH", "DIAMETER", "UP", "DOWN",
+ "RIGHT", "LEFT", "FROM", "TO", "AT", "WITH", "BY", "THEN", "SOLID",
+ "DOTTED", "DASHED", "CHOP", "SAME", "INVISIBLE", "LJUST", "RJUST",
+ "ABOVE", "BELOW", "OF", "THE", "WAY", "BETWEEN", "AND", "HERE", "DOT_N",
+ "DOT_E", "DOT_W", "DOT_S", "DOT_NE", "DOT_SE", "DOT_NW", "DOT_SW",
+ "DOT_C", "DOT_START", "DOT_END", "DOT_X", "DOT_Y", "DOT_HT", "DOT_WID",
+ "DOT_RAD", "SIN", "COS", "ATAN2", "LOG", "EXP", "SQRT", "K_MAX", "K_MIN",
+ "INT", "RAND", "SRAND", "COPY", "THRU", "TOP", "BOTTOM", "UPPER",
+ "LOWER", "SH", "PRINT", "CW", "CCW", "FOR", "DO", "IF", "ELSE", "ANDAND",
+ "OROR", "NOTEQUAL", "EQUALEQUAL", "LESSEQUAL", "GREATEREQUAL",
+ "LEFT_CORNER", "RIGHT_CORNER", "NORTH", "SOUTH", "EAST", "WEST",
+ "CENTER", "END", "START", "RESET", "UNTIL", "PLOT", "THICKNESS", "FILL",
+ "COLORED", "OUTLINED", "SHADED", "XSLANTED", "YSLANTED", "ALIGNED",
+ "SPRINTF", "COMMAND", "DEFINE", "UNDEF", "'.'", "'('", "'`'", "'['",
+ "','", "'<'", "'>'", "'+'", "'-'", "'*'", "'/'", "'%'", "'!'", "'^'",
+ "';'", "'='", "':'", "'{'", "'}'", "']'", "')'", "$accept", "top",
+ "element_list", "middle_element_list", "optional_separator", "separator",
+ "placeless_element", "$@1", "$@2", "$@3", "$@4", "$@5", "$@6", "$@7",
+ "macro_name", "reset_variables", "print_args", "print_arg", "simple_if",
+ "$@8", "until", "any_expr", "text_expr", "optional_by", "element", "@9",
+ "$@10", "optional_element", "object_spec", "@11", "text", "sprintf_args",
+ "position", "position_not_place", "between", "expr_pair", "place",
+ "label", "ordinal", "optional_ordinal_last", "nth_primitive",
+ "object_type", "label_path", "relative_path", "path", "corner", "expr",
+ "expr_lower_than", "expr_not_lower_than", YY_NULLPTR
+};
+
+static const char *
+yysymbol_name (yysymbol_kind_t yysymbol)
+{
+ return yytname[yysymbol];
+}
+#endif
+
+#define YYPACT_NINF (-240)
+
+#define yypact_value_is_default(Yyn) \
+ ((Yyn) == YYPACT_NINF)
+
+#define YYTABLE_NINF (-206)
+
+#define yytable_value_is_error(Yyn) \
+ 0
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+static const yytype_int16 yypact[] =
+{
+ -114, -240, 20, -240, 757, -107, -240, -98, -123, -240,
+ -240, -240, -240, -240, -240, -240, -240, -240, -240, -106,
+ -240, -240, -240, -240, 9, -240, 1087, 46, 1172, 49,
+ 1597, -70, 1087, -240, -240, -114, -240, 3, -33, -240,
+ 877, -240, -240, -114, 1172, -60, 36, -14, -240, 74,
+ -240, -240, -240, -240, -240, -240, -240, -240, -240, -240,
+ -240, -240, -240, -240, -240, -240, -240, -240, -240, -34,
+ -18, 8, 38, 47, 51, 65, 101, 102, 112, 122,
+ -240, -240, 21, 150, -240, -240, -240, -240, -240, -240,
+ -240, -240, -240, 1257, 1172, 1597, 1597, 1087, -240, -240,
+ -43, -240, -240, 357, 2242, 59, 258, -240, 10, 2147,
+ -240, 1, 6, 1172, 1172, 145, -1, 2, 357, 2273,
+ -240, -240, 220, 249, 1087, -114, -114, -240, 721, -240,
+ 252, -240, -240, -240, -240, 1597, 1597, 1597, 1597, 2024,
+ 2024, 1853, 1939, 1682, 1682, 1682, 1427, 1767, -240, -240,
+ 2024, 2024, 2024, -240, -240, -240, -240, -240, -240, -240,
+ -240, 1597, 2024, 23, 23, 23, 1597, 1597, -240, -240,
+ 2282, 593, -240, 1172, -240, -240, -240, -240, 250, -240,
+ 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 458,
+ 1172, -240, -240, -240, -240, -240, -240, -240, -240, 121,
+ 107, 123, 256, 2157, 137, 261, 134, 134, -240, 1767,
+ 1767, -240, -240, -240, -240, -240, 276, -240, -240, -240,
+ -240, -240, -240, -240, -240, -240, -240, 138, -240, -240,
+ 24, 156, 235, -240, 1597, 1597, 1597, 1597, 1597, 1597,
+ 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1682,
+ 1682, 1597, -240, 134, -240, 1172, 1172, 23, 23, 1172,
+ 1172, -240, -240, 143, 757, 153, -240, -240, 280, 2282,
+ 2282, 2282, 2282, 2282, 2282, 2282, 2282, -43, 2147, -43,
+ -43, 2253, 275, 275, 295, 1002, -43, 2081, -240, -240,
+ 10, 1342, -240, 694, 2282, 2282, 2282, 2282, 2282, -240,
+ -240, -240, 2282, 2282, -98, -123, 16, 28, -240, -43,
+ 56, 302, -240, 291, -240, 155, 160, 172, 161, 164,
+ 167, 184, 185, 181, -240, 186, 188, -240, 1682, 1767,
+ 1767, -240, -240, 1682, 1682, -240, -240, -240, -240, -240,
+ 156, 279, 314, 2291, 440, 440, 413, 413, 2282, 413,
+ 413, -72, -72, 134, 134, 134, 134, -49, 117, 343,
+ 322, -240, 314, 239, 2300, -240, -240, -240, 314, 239,
+ 2300, -119, -240, -240, -240, -240, -240, 2116, 2116, -240,
+ 206, 333, -240, 123, 2131, -240, 228, -240, -240, 1172,
+ -240, -240, -240, 1172, 1172, -240, -240, -240, -110, 195,
+ 197, -47, 128, 292, 1682, 1682, 1597, -240, 1597, -240,
+ 757, -240, -240, 2116, -240, 228, 338, -240, 200, 202,
+ 212, -240, -240, -240, 1682, 1682, -240, -43, -27, 360,
+ 2282, -240, -240, 214, -240, -240, -240, -240, -240, -73,
+ 30, -240, 1512, 268, -240, -240, 216, 1597, 2282, -240,
+ -240, 2282, 354, -240
+};
+
+/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+ Performed when YYTABLE does not specify something else to do. Zero
+ means the default is an error. */
+static const yytype_int16 yydefact[] =
+{
+ 7, 9, 0, 3, 2, 8, 1, 0, 0, 136,
+ 18, 75, 76, 77, 78, 79, 80, 81, 82, 0,
+ 14, 15, 17, 16, 0, 21, 0, 0, 0, 36,
+ 0, 0, 0, 86, 69, 7, 72, 35, 32, 5,
+ 65, 83, 10, 7, 0, 0, 0, 23, 27, 0,
+ 162, 226, 227, 165, 167, 205, 204, 161, 191, 192,
+ 193, 194, 195, 196, 197, 198, 199, 200, 201, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 202, 203, 0, 0, 210, 211, 216, 217, 218, 219,
+ 220, 222, 221, 0, 0, 0, 0, 20, 42, 45,
+ 46, 140, 143, 141, 157, 0, 0, 163, 0, 44,
+ 223, 224, 0, 0, 0, 0, 52, 0, 0, 51,
+ 224, 39, 84, 0, 19, 7, 7, 4, 8, 40,
+ 0, 33, 124, 125, 126, 0, 0, 0, 0, 93,
+ 95, 97, 99, 0, 0, 0, 0, 0, 107, 108,
+ 109, 111, 120, 122, 123, 130, 131, 132, 133, 127,
+ 128, 0, 113, 0, 0, 0, 0, 0, 135, 129,
+ 92, 0, 12, 0, 38, 37, 11, 24, 0, 22,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 208, 206, 212, 214, 209, 207, 213, 215, 0,
+ 0, 143, 141, 51, 224, 0, 239, 260, 43, 0,
+ 0, 228, 229, 230, 231, 232, 0, 158, 179, 168,
+ 171, 172, 173, 174, 175, 176, 177, 0, 169, 170,
+ 0, 159, 0, 153, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 61, 260, 47, 0, 0, 0, 0, 0,
+ 0, 85, 138, 0, 0, 0, 6, 41, 0, 88,
+ 89, 90, 91, 94, 96, 98, 100, 101, 0, 102,
+ 103, 162, 165, 167, 0, 0, 105, 183, 185, 104,
+ 182, 0, 106, 0, 110, 112, 121, 134, 114, 118,
+ 119, 117, 115, 116, 162, 226, 205, 204, 66, 0,
+ 67, 68, 13, 0, 28, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 251, 0, 0, 240, 0, 0,
+ 0, 156, 142, 0, 0, 166, 144, 146, 164, 178,
+ 160, 0, 258, 259, 257, 256, 253, 255, 155, 225,
+ 254, 233, 234, 235, 236, 237, 238, 0, 0, 0,
+ 0, 55, 56, 58, 59, 54, 53, 57, 258, 60,
+ 259, 0, 87, 70, 34, 190, 182, 0, 0, 180,
+ 0, 0, 184, 0, 51, 25, 49, 241, 242, 0,
+ 244, 245, 246, 0, 0, 249, 250, 252, 0, 144,
+ 146, 0, 0, 0, 0, 0, 0, 48, 0, 137,
+ 73, 189, 188, 0, 181, 49, 0, 29, 0, 0,
+ 0, 148, 145, 147, 0, 0, 154, 149, 0, 62,
+ 139, 74, 71, 0, 26, 50, 243, 247, 248, 149,
+ 0, 151, 0, 0, 186, 150, 151, 0, 63, 30,
+ 152, 64, 0, 31
+};
+
+/* YYPGOTO[NTERM-NUM]. */
+static const yytype_int16 yypgoto[] =
+{
+ -240, -240, 17, -240, 12, 329, -240, -240, -240, -240,
+ -240, -240, -240, -240, -240, -240, 334, -76, -240, -240,
+ -42, 13, -103, -240, -127, -240, -240, -240, -240, -240,
+ 5, -240, 99, 194, 169, -44, 4, -100, -240, -240,
+ -240, -104, -240, -239, -240, -50, -26, -240, 61
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yytype_int16 yydefgoto[] =
+{
+ 0, 2, 3, 35, 264, 5, 36, 49, 313, 415,
+ 178, 386, 452, 268, 176, 37, 97, 98, 38, 360,
+ 417, 199, 116, 443, 39, 126, 410, 432, 40, 125,
+ 117, 371, 100, 101, 249, 102, 118, 104, 105, 106,
+ 107, 228, 287, 288, 289, 108, 119, 110, 120
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule whose
+ number is the opposite. If YYTABLE_NINF, syntax error. */
+static const yytype_int16 yytable[] =
+{
+ 109, 266, 229, 404, 122, 424, 109, 129, 231, 41,
+ 408, 252, 4, 50, 170, 47, -17, 44, 45, 53,
+ 6, 208, 209, 210, 54, 1, 409, 50, -16, 9,
+ 103, 99, 42, 53, 46, 421, 103, 99, 54, 174,
+ 175, 115, 375, 43, 308, 169, 380, 127, 208, 201,
+ 112, 191, 192, 121, 217, 171, 123, 172, 230, 209,
+ 210, 131, 245, 246, 247, 218, 248, 203, 177, 206,
+ 207, 109, 445, 219, 220, 221, 222, 223, 224, 225,
+ 173, 226, 179, 209, 210, 209, 210, 111, 253, 209,
+ 210, 48, 180, 111, 255, 256, 290, 202, 109, 257,
+ 258, 103, 99, 292, 441, 209, 210, 205, 181, 269,
+ 270, 271, 272, 273, 274, 275, 276, 278, 278, 278,
+ 278, 293, 193, 194, 294, 295, 296, 261, 103, 99,
+ 340, 250, 130, 41, 182, 297, 298, 94, 411, 412,
+ 302, 303, 263, 265, 31, 278, 251, 103, 103, 103,
+ 103, 94, 361, 363, 204, -17, 367, 369, 111, -17,
+ -17, 446, 209, 210, 183, 336, 337, -16, 299, 300,
+ 301, -16, -16, 184, 433, 311, 41, 185, 377, 378,
+ 195, 196, 254, 293, 293, 111, 312, 227, -140, -140,
+ 231, 186, 200, 315, 316, 317, 318, 319, 320, 321,
+ 322, 323, 325, 326, 111, 111, 111, 111, 342, 343,
+ 344, 345, 346, 347, 348, 349, 350, 351, 352, 353,
+ 354, 355, 356, 278, 278, 359, 9, 187, 188, 362,
+ 364, 376, 111, 368, 370, 290, 328, 382, 189, 329,
+ 330, 201, 277, 279, 280, 286, 405, 383, 190, 209,
+ 210, 197, 198, 103, 103, 262, 267, 425, 314, 203,
+ 209, 210, 365, 366, 218, 384, 327, 334, 331, 41,
+ 309, 335, 248, 220, 221, 222, 223, 224, 225, 338,
+ 226, 216, 339, 431, 341, 399, 400, 372, 374, 202,
+ 220, 221, 222, 223, 224, 225, 373, 226, 379, 385,
+ 387, 389, 278, 293, 293, 388, 390, 278, 278, 391,
+ 111, 111, 392, 393, 394, 234, 235, 236, 237, 238,
+ 239, 211, 212, 213, 214, 215, 395, 376, 376, 403,
+ 407, 396, 103, 397, 255, 413, 414, 103, 103, 416,
+ 422, 31, 423, 426, 435, 436, 204, 437, 357, 358,
+ 241, 242, 243, 244, 245, 246, 247, 438, 248, 444,
+ 449, 450, 453, 376, 128, 310, 124, 211, 212, 213,
+ 214, 215, 333, 434, 0, 0, 406, 0, 278, 278,
+ 429, 0, 430, 0, 200, 0, 227, 0, 0, 111,
+ 0, 0, 0, 0, 111, 111, 442, 0, 278, 278,
+ 0, 332, 418, 227, 0, 0, 419, 420, 103, 103,
+ 0, 236, 237, 238, 239, 41, 448, 0, 0, 0,
+ 0, 451, 211, 212, 213, 214, 215, 398, 103, 103,
+ 0, 0, 401, 402, -141, -141, 0, 0, 234, 235,
+ 236, 237, 238, 239, 241, 242, 243, 244, 245, 246,
+ 247, 0, 248, 0, 0, 234, 235, 236, 237, 238,
+ 239, 50, 51, 52, 9, 111, 111, 53, 0, 0,
+ 0, 0, 54, 241, 242, 243, 244, 245, 246, 247,
+ 0, 248, 0, 0, 0, 111, 111, 0, 55, 56,
+ 241, 242, 243, 244, 245, 246, 247, 0, 248, 0,
+ 0, 0, 0, 427, 428, 0, 0, 0, 0, 0,
+ 0, 57, 58, 59, 60, 61, 62, 63, 64, 65,
+ 66, 67, 68, 439, 440, 0, 0, 0, 69, 70,
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 238,
+ 239, 80, 81, 82, 83, 243, 244, 245, 246, 247,
+ 0, 248, 0, 0, 0, 0, 0, 0, 0, 84,
+ 85, 86, 87, 88, 89, 90, 91, 92, 0, 0,
+ 241, 242, 243, 244, 245, 246, 247, 0, 248, 31,
+ 0, 0, 0, 0, 113, 94, 0, 0, 0, 0,
+ 0, 95, 0, 0, 0, 114, 304, 305, 52, 9,
+ 10, 0, 53, 324, 0, 0, 0, 54, 11, 12,
+ 13, 14, 15, 16, 17, 18, 0, 0, 19, 0,
+ 0, 20, 21, 306, 307, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 57, 58, 59, 60,
+ 61, 62, 63, 64, 65, 66, 67, 68, 0, 0,
+ 0, 0, 0, 69, 70, 71, 72, 73, 74, 75,
+ 76, 77, 78, 79, 24, 0, 80, 81, 82, 83,
+ 25, 26, 0, 0, 27, 0, 28, 0, 0, 0,
+ 0, 0, 0, 0, 84, 85, 86, 87, 88, 89,
+ 90, 91, 92, 29, 0, 30, 0, 0, 0, 0,
+ 0, 0, 0, 0, 31, 32, 0, 0, 0, 93,
+ 94, 33, 0, 0, 7, 8, 95, 9, 10, 0,
+ 96, 0, 0, 0, 0, 34, 11, 12, 13, 14,
+ 15, 16, 17, 18, 0, 0, 19, 0, 0, 20,
+ 21, 22, 23, 0, 0, 0, 0, 0, 0, 0,
+ 7, 8, 0, 9, 10, 0, 0, 0, 0, 0,
+ 0, 0, 11, 12, 13, 14, 15, 16, 17, 18,
+ 0, 0, 19, 0, 0, 20, 21, 22, 23, 234,
+ 235, 236, 237, 238, 239, 0, 0, 0, 0, 0,
+ 0, 0, 24, 0, 0, 0, 0, 0, 25, 26,
+ 0, 0, 27, 0, 28, 0, 0, 0, 0, 0,
+ 0, 0, 0, 240, 241, 242, 243, 244, 245, 246,
+ 247, 29, 248, 30, 0, 0, 0, 0, 24, 0,
+ 0, 0, 31, 32, 25, 26, 0, 0, 27, 33,
+ 28, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 42, 0, 0, 34, 0, 0, 0, 29, 0, 30,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 32,
+ 50, 51, 52, 9, 0, 33, 53, 0, 132, 133,
+ 134, 54, 0, 0, 0, 0, 0, 0, 0, 34,
+ 135, 136, 0, 137, 138, 139, 140, 141, 142, 143,
+ 144, 145, 146, 147, 148, 149, 150, 151, 152, 153,
+ 154, 155, 156, 157, 158, 0, 0, 0, 0, 0,
+ 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
+ 67, 68, 0, 0, 0, 0, 0, 69, 70, 71,
+ 72, 73, 74, 75, 76, 77, 78, 79, 0, 0,
+ 80, 81, 82, 83, 0, 0, 159, 160, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 85,
+ 86, 87, 88, 89, 90, 91, 92, 0, 0, 0,
+ 161, 162, 163, 164, 165, 166, 167, 168, 31, 0,
+ 0, 0, 0, 113, 94, 50, 51, 52, 9, 0,
+ 95, 53, 0, 0, 96, 0, 54, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 55, 56, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 57, 58, 59, 60, 61,
+ 62, 63, 64, 65, 66, 67, 68, 0, 0, 0,
+ 0, 0, 69, 70, 71, 72, 73, 74, 75, 76,
+ 77, 78, 79, 0, 0, 80, 81, 82, 83, 0,
+ 50, 51, 52, 9, 0, 0, 53, 0, 0, 0,
+ 0, 54, 0, 84, 85, 86, 87, 88, 89, 90,
+ 91, 92, 0, 0, 0, 0, 0, 55, 56, 0,
+ 0, 0, 0, 31, 0, 0, 0, 284, 93, 94,
+ 0, 0, 0, 0, 0, 95, 0, 0, 0, 114,
+ 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
+ 67, 68, 0, 0, 0, 0, 0, 69, 70, 71,
+ 72, 73, 74, 75, 76, 77, 78, 79, 0, 0,
+ 80, 81, 82, 83, 0, 50, 51, 52, 9, 0,
+ 0, 53, 0, 0, 0, 0, 54, 0, 84, 85,
+ 86, 87, 88, 89, 90, 91, 92, 0, 0, 0,
+ 0, 0, 55, 56, 0, 0, 0, 0, 31, 0,
+ 0, 0, 0, 93, 94, 0, 0, 0, 0, 0,
+ 95, 0, 0, 0, 96, 57, 58, 59, 60, 61,
+ 62, 63, 64, 65, 66, 67, 68, 0, 0, 0,
+ 0, 0, 69, 70, 71, 72, 73, 74, 75, 76,
+ 77, 78, 79, 0, 0, 80, 81, 82, 83, 0,
+ 50, 51, 52, 9, 0, 0, 53, 0, 0, 0,
+ 0, 54, 0, 84, 85, 86, 87, 88, 89, 90,
+ 91, 92, 0, 0, 0, 0, 0, 55, 56, 0,
+ 0, 0, 0, 31, 0, 0, 0, 0, 113, 94,
+ 0, 0, 0, 0, 0, 95, 0, 0, 0, 114,
+ 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
+ 67, 68, 0, 0, 0, 0, 0, 69, 70, 71,
+ 72, 73, 74, 75, 76, 77, 78, 79, 0, 0,
+ 80, 81, 82, 83, 0, 50, 51, 52, 9, 0,
+ 0, 53, 0, 0, 0, 0, 54, 0, 84, 85,
+ 86, 87, 88, 89, 90, 91, 92, 0, 0, 0,
+ 0, 0, 55, 56, 0, 0, 0, 0, 31, 0,
+ 0, 0, 0, 93, 94, 0, 0, 0, 0, 0,
+ 95, 0, 0, 0, 114, 57, 58, 59, 60, 61,
+ 62, 63, 64, 65, 66, 67, 68, 0, 0, 0,
+ 0, 0, 69, 70, 71, 72, 73, 74, 75, 76,
+ 77, 78, 79, 0, 0, 80, 81, 82, 83, 0,
+ 281, 51, 52, 0, 0, 0, 282, 0, 0, 0,
+ 0, 283, 0, 84, 85, 86, 87, 88, 89, 90,
+ 91, 92, 0, 0, 0, 0, 0, 55, 56, 0,
+ 0, 0, 0, 31, 0, 0, 0, 0, 291, 94,
+ 0, 0, 0, 0, 0, 95, 0, 0, 0, 114,
+ 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
+ 67, 68, 0, 0, 0, 0, 0, 69, 70, 71,
+ 72, 73, 74, 75, 76, 77, 78, 79, 0, 0,
+ 80, 81, 82, 83, 0, 50, 51, 52, 0, 0,
+ 0, 53, 0, 0, 0, 0, 54, 0, 84, 85,
+ 86, 87, 88, 89, 90, 91, 92, 0, 0, 0,
+ 0, 0, 55, 56, 0, 0, 0, 0, 0, 0,
+ 0, 0, 284, 285, 94, 0, 0, 0, 0, 0,
+ 95, 0, 0, 0, 96, 57, 58, 59, 60, 61,
+ 62, 63, 64, 65, 66, 67, 68, 0, 0, 0,
+ 0, 0, 69, 70, 71, 72, 73, 74, 75, 76,
+ 77, 78, 79, 0, 0, 80, 81, 82, 83, 0,
+ 50, 51, 52, 0, 0, 0, 53, 0, 0, 0,
+ 0, 54, 0, 84, 85, 86, 87, 88, 89, 90,
+ 91, 92, 0, 0, 0, 0, 0, 55, 56, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 113, 94,
+ 0, 0, 0, 0, 0, 95, 447, 0, 0, 96,
+ 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
+ 67, 68, 0, 0, 0, 0, 0, 69, 70, 71,
+ 72, 73, 74, 75, 76, 77, 78, 79, 0, 0,
+ 80, 81, 82, 83, 0, 50, 51, 52, 0, 0,
+ 0, 53, 0, 0, 0, 0, 54, 0, 84, 85,
+ 86, 87, 88, 89, 90, 91, 92, 0, 0, 0,
+ 0, 0, 55, 56, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 113, 94, 0, 0, 0, 0, 0,
+ 95, 0, 0, 0, 96, 57, 58, 59, 60, 61,
+ 62, 63, 64, 65, 66, 67, 68, 0, 0, 0,
+ 0, 0, 69, 70, 71, 72, 73, 74, 75, 76,
+ 77, 78, 79, 0, 0, 80, 81, 82, 83, 0,
+ 50, 51, 52, 0, 0, 0, 53, 0, 0, 0,
+ 0, 54, 0, 84, 85, 86, 87, 88, 89, 90,
+ 91, 92, 0, 0, 0, 0, 0, 55, 56, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 93, 94,
+ 0, 0, 0, 0, 0, 95, 0, 0, 0, 96,
+ 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
+ 67, 68, 0, 0, 0, 0, 0, 69, 70, 71,
+ 72, 73, 74, 75, 76, 77, 78, 79, 0, 0,
+ 80, 81, 82, 83, 0, 0, 50, 51, 52, 0,
+ 0, 0, 53, 0, 0, 0, 0, 54, 84, 85,
+ 86, 87, 88, 89, 90, 91, 92, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 291, 94, 0, 0, 0, 0, 0,
+ 95, -205, 0, 0, 96, 0, 57, 58, 59, 60,
+ 61, 62, 63, 64, 65, 66, 67, 68, 0, 0,
+ 0, 0, 0, 69, 70, 71, 72, 73, 74, 75,
+ 76, 77, 78, 79, 0, 0, 80, 81, 82, 83,
+ 0, 0, 50, 51, 52, 0, 0, 0, 53, 0,
+ 0, 0, 0, 54, 84, 85, 86, 87, 88, 89,
+ 90, 91, 92, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 113,
+ 94, 0, 0, 0, 0, 0, 95, -204, 0, 0,
+ 96, 0, 57, 58, 59, 60, 61, 62, 63, 64,
+ 65, 66, 67, 68, 0, 0, 0, 0, 0, 69,
+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 0, 0, 80, 81, 82, 83, 0, 50, 51, 52,
+ 0, 0, 0, 53, 0, 0, 0, 0, 54, 0,
+ 84, 85, 86, 87, 88, 89, 90, 91, 92, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 113, 94, 0, 0, 0,
+ 0, 0, 95, 0, 0, 0, 96, 57, 58, 59,
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 0,
+ 0, 0, 0, 0, 69, 70, 71, 72, 73, 74,
+ 75, 76, 77, 78, 79, 0, 0, 80, 81, 82,
+ 83, 55, 56, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 84, 85, 86, 87, 88,
+ 89, 90, 91, 92, 0, 58, 59, 60, 61, 62,
+ 63, 64, 65, 66, 67, 68, 55, 56, 0, 0,
+ 113, 94, 0, 0, 0, 0, 0, 95, 0, 0,
+ 0, 96, 0, 0, 80, 81, 82, 83, 0, 0,
+ 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
+ 68, 0, 84, 85, 86, 87, 88, 89, 90, 91,
+ 92, 0, 0, 0, 0, 232, 0, 0, 233, 80,
+ 81, 82, 83, 0, 0, 232, 381, 0, 233, 0,
+ 0, 0, 0, 0, 0, 0, 0, 84, 85, 86,
+ 87, 88, 89, 90, 91, 92, 259, 260, 236, 237,
+ 238, 239, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 284, 234, 235, 236, 237, 238, 239, 0, 0,
+ 0, 0, 259, 260, 236, 237, 238, 239, 0, 0,
+ 240, 241, 242, 243, 244, 245, 246, 247, 0, 248,
+ 0, 0, 0, 0, 0, 0, 240, 241, 242, 243,
+ 244, 245, 246, 247, 0, 248, 240, 241, 242, 243,
+ 244, 245, 246, 247, 0, 248, 58, 59, 60, 61,
+ 62, 63, 64, 65, 66, 67, 68, 58, 59, 60,
+ 61, 62, 63, 64, 65, 66, 67, 68, 0, 0,
+ 0, 0, 0, 0, 0, 80, 81, 82, 83, 0,
+ 0, 0, 0, 0, 0, 0, 80, 81, 82, 83,
+ 0, 0, 0, 84, 85, 86, 87, 88, 89, 90,
+ 91, 92, 0, 0, 84, 85, 86, 87, 88, 89,
+ 90, 91, 92, 0, 0, 0, 0, 216, 259, 260,
+ 236, 237, 238, 239, 0, 0, 0, 234, 235, 236,
+ 237, 238, 239, 0, 0, 0, 234, 0, 236, 237,
+ 238, 239, 0, 0, 0, 259, 0, 236, 237, 238,
+ 239, 0, 0, 241, 242, 243, 244, 245, 246, 247,
+ 0, 248, 241, 242, 243, 244, 245, 246, 247, 0,
+ 248, 241, 242, 243, 244, 245, 246, 247, 0, 248,
+ 241, 242, 243, 244, 245, 246, 247, 0, 248
+};
+
+static const yytype_int16 yycheck[] =
+{
+ 26, 128, 106, 52, 30, 52, 32, 4, 108, 4,
+ 129, 114, 0, 3, 40, 6, 0, 140, 141, 9,
+ 0, 97, 132, 133, 14, 139, 145, 3, 0, 6,
+ 26, 26, 139, 9, 140, 145, 32, 32, 14, 3,
+ 4, 28, 281, 141, 171, 40, 285, 35, 124, 93,
+ 4, 30, 31, 4, 104, 43, 126, 44, 48, 132,
+ 133, 94, 134, 135, 136, 6, 138, 93, 82, 95,
+ 96, 97, 145, 14, 15, 16, 17, 18, 19, 20,
+ 140, 22, 8, 132, 133, 132, 133, 26, 114, 132,
+ 133, 82, 126, 32, 95, 96, 146, 93, 124, 97,
+ 98, 97, 97, 147, 131, 132, 133, 94, 126, 135,
+ 136, 137, 138, 139, 140, 141, 142, 143, 144, 145,
+ 146, 147, 101, 102, 150, 151, 152, 122, 124, 124,
+ 230, 130, 129, 128, 126, 161, 162, 127, 377, 378,
+ 166, 167, 125, 126, 121, 171, 140, 143, 144, 145,
+ 146, 127, 255, 256, 93, 139, 259, 260, 97, 143,
+ 144, 131, 132, 133, 126, 209, 210, 139, 163, 164,
+ 165, 143, 144, 126, 413, 171, 171, 126, 282, 283,
+ 30, 31, 37, 209, 210, 124, 173, 128, 132, 133,
+ 290, 126, 93, 180, 181, 182, 183, 184, 185, 186,
+ 187, 188, 189, 190, 143, 144, 145, 146, 234, 235,
+ 236, 237, 238, 239, 240, 241, 242, 243, 244, 245,
+ 246, 247, 248, 249, 250, 251, 6, 126, 126, 255,
+ 256, 281, 171, 259, 260, 285, 129, 287, 126, 132,
+ 133, 285, 143, 144, 145, 146, 129, 291, 126, 132,
+ 133, 101, 102, 249, 250, 6, 4, 129, 8, 285,
+ 132, 133, 257, 258, 6, 291, 145, 130, 145, 264,
+ 171, 10, 138, 15, 16, 17, 18, 19, 20, 3,
+ 22, 125, 144, 410, 49, 329, 330, 144, 8, 285,
+ 15, 16, 17, 18, 19, 20, 143, 22, 3, 8,
+ 145, 129, 328, 329, 330, 145, 145, 333, 334, 145,
+ 249, 250, 145, 129, 129, 95, 96, 97, 98, 99,
+ 100, 65, 66, 67, 68, 69, 145, 377, 378, 50,
+ 8, 145, 328, 145, 95, 129, 3, 333, 334, 111,
+ 145, 121, 145, 51, 6, 145, 285, 145, 249, 250,
+ 130, 131, 132, 133, 134, 135, 136, 145, 138, 145,
+ 92, 145, 8, 413, 35, 171, 32, 65, 66, 67,
+ 68, 69, 203, 415, -1, -1, 33, -1, 404, 405,
+ 406, -1, 408, -1, 285, -1, 128, -1, -1, 328,
+ -1, -1, -1, -1, 333, 334, 36, -1, 424, 425,
+ -1, 145, 389, 128, -1, -1, 393, 394, 404, 405,
+ -1, 97, 98, 99, 100, 410, 442, -1, -1, -1,
+ -1, 447, 65, 66, 67, 68, 69, 328, 424, 425,
+ -1, -1, 333, 334, 132, 133, -1, -1, 95, 96,
+ 97, 98, 99, 100, 130, 131, 132, 133, 134, 135,
+ 136, -1, 138, -1, -1, 95, 96, 97, 98, 99,
+ 100, 3, 4, 5, 6, 404, 405, 9, -1, -1,
+ -1, -1, 14, 130, 131, 132, 133, 134, 135, 136,
+ -1, 138, -1, -1, -1, 424, 425, -1, 30, 31,
+ 130, 131, 132, 133, 134, 135, 136, -1, 138, -1,
+ -1, -1, -1, 404, 405, -1, -1, -1, -1, -1,
+ -1, 53, 54, 55, 56, 57, 58, 59, 60, 61,
+ 62, 63, 64, 424, 425, -1, -1, -1, 70, 71,
+ 72, 73, 74, 75, 76, 77, 78, 79, 80, 99,
+ 100, 83, 84, 85, 86, 132, 133, 134, 135, 136,
+ -1, 138, -1, -1, -1, -1, -1, -1, -1, 101,
+ 102, 103, 104, 105, 106, 107, 108, 109, -1, -1,
+ 130, 131, 132, 133, 134, 135, 136, -1, 138, 121,
+ -1, -1, -1, -1, 126, 127, -1, -1, -1, -1,
+ -1, 133, -1, -1, -1, 137, 3, 4, 5, 6,
+ 7, -1, 9, 145, -1, -1, -1, 14, 15, 16,
+ 17, 18, 19, 20, 21, 22, -1, -1, 25, -1,
+ -1, 28, 29, 30, 31, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 53, 54, 55, 56,
+ 57, 58, 59, 60, 61, 62, 63, 64, -1, -1,
+ -1, -1, -1, 70, 71, 72, 73, 74, 75, 76,
+ 77, 78, 79, 80, 81, -1, 83, 84, 85, 86,
+ 87, 88, -1, -1, 91, -1, 93, -1, -1, -1,
+ -1, -1, -1, -1, 101, 102, 103, 104, 105, 106,
+ 107, 108, 109, 110, -1, 112, -1, -1, -1, -1,
+ -1, -1, -1, -1, 121, 122, -1, -1, -1, 126,
+ 127, 128, -1, -1, 3, 4, 133, 6, 7, -1,
+ 137, -1, -1, -1, -1, 142, 15, 16, 17, 18,
+ 19, 20, 21, 22, -1, -1, 25, -1, -1, 28,
+ 29, 30, 31, -1, -1, -1, -1, -1, -1, -1,
+ 3, 4, -1, 6, 7, -1, -1, -1, -1, -1,
+ -1, -1, 15, 16, 17, 18, 19, 20, 21, 22,
+ -1, -1, 25, -1, -1, 28, 29, 30, 31, 95,
+ 96, 97, 98, 99, 100, -1, -1, -1, -1, -1,
+ -1, -1, 81, -1, -1, -1, -1, -1, 87, 88,
+ -1, -1, 91, -1, 93, -1, -1, -1, -1, -1,
+ -1, -1, -1, 129, 130, 131, 132, 133, 134, 135,
+ 136, 110, 138, 112, -1, -1, -1, -1, 81, -1,
+ -1, -1, 121, 122, 87, 88, -1, -1, 91, 128,
+ 93, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 139, -1, -1, 142, -1, -1, -1, 110, -1, 112,
+ -1, -1, -1, -1, -1, -1, -1, -1, 121, 122,
+ 3, 4, 5, 6, -1, 128, 9, -1, 11, 12,
+ 13, 14, -1, -1, -1, -1, -1, -1, -1, 142,
+ 23, 24, -1, 26, 27, 28, 29, 30, 31, 32,
+ 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
+ 43, 44, 45, 46, 47, -1, -1, -1, -1, -1,
+ 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
+ 63, 64, -1, -1, -1, -1, -1, 70, 71, 72,
+ 73, 74, 75, 76, 77, 78, 79, 80, -1, -1,
+ 83, 84, 85, 86, -1, -1, 89, 90, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 101, 102,
+ 103, 104, 105, 106, 107, 108, 109, -1, -1, -1,
+ 113, 114, 115, 116, 117, 118, 119, 120, 121, -1,
+ -1, -1, -1, 126, 127, 3, 4, 5, 6, -1,
+ 133, 9, -1, -1, 137, -1, 14, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 30, 31, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 53, 54, 55, 56, 57,
+ 58, 59, 60, 61, 62, 63, 64, -1, -1, -1,
+ -1, -1, 70, 71, 72, 73, 74, 75, 76, 77,
+ 78, 79, 80, -1, -1, 83, 84, 85, 86, -1,
+ 3, 4, 5, 6, -1, -1, 9, -1, -1, -1,
+ -1, 14, -1, 101, 102, 103, 104, 105, 106, 107,
+ 108, 109, -1, -1, -1, -1, -1, 30, 31, -1,
+ -1, -1, -1, 121, -1, -1, -1, 125, 126, 127,
+ -1, -1, -1, -1, -1, 133, -1, -1, -1, 137,
+ 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
+ 63, 64, -1, -1, -1, -1, -1, 70, 71, 72,
+ 73, 74, 75, 76, 77, 78, 79, 80, -1, -1,
+ 83, 84, 85, 86, -1, 3, 4, 5, 6, -1,
+ -1, 9, -1, -1, -1, -1, 14, -1, 101, 102,
+ 103, 104, 105, 106, 107, 108, 109, -1, -1, -1,
+ -1, -1, 30, 31, -1, -1, -1, -1, 121, -1,
+ -1, -1, -1, 126, 127, -1, -1, -1, -1, -1,
+ 133, -1, -1, -1, 137, 53, 54, 55, 56, 57,
+ 58, 59, 60, 61, 62, 63, 64, -1, -1, -1,
+ -1, -1, 70, 71, 72, 73, 74, 75, 76, 77,
+ 78, 79, 80, -1, -1, 83, 84, 85, 86, -1,
+ 3, 4, 5, 6, -1, -1, 9, -1, -1, -1,
+ -1, 14, -1, 101, 102, 103, 104, 105, 106, 107,
+ 108, 109, -1, -1, -1, -1, -1, 30, 31, -1,
+ -1, -1, -1, 121, -1, -1, -1, -1, 126, 127,
+ -1, -1, -1, -1, -1, 133, -1, -1, -1, 137,
+ 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
+ 63, 64, -1, -1, -1, -1, -1, 70, 71, 72,
+ 73, 74, 75, 76, 77, 78, 79, 80, -1, -1,
+ 83, 84, 85, 86, -1, 3, 4, 5, 6, -1,
+ -1, 9, -1, -1, -1, -1, 14, -1, 101, 102,
+ 103, 104, 105, 106, 107, 108, 109, -1, -1, -1,
+ -1, -1, 30, 31, -1, -1, -1, -1, 121, -1,
+ -1, -1, -1, 126, 127, -1, -1, -1, -1, -1,
+ 133, -1, -1, -1, 137, 53, 54, 55, 56, 57,
+ 58, 59, 60, 61, 62, 63, 64, -1, -1, -1,
+ -1, -1, 70, 71, 72, 73, 74, 75, 76, 77,
+ 78, 79, 80, -1, -1, 83, 84, 85, 86, -1,
+ 3, 4, 5, -1, -1, -1, 9, -1, -1, -1,
+ -1, 14, -1, 101, 102, 103, 104, 105, 106, 107,
+ 108, 109, -1, -1, -1, -1, -1, 30, 31, -1,
+ -1, -1, -1, 121, -1, -1, -1, -1, 126, 127,
+ -1, -1, -1, -1, -1, 133, -1, -1, -1, 137,
+ 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
+ 63, 64, -1, -1, -1, -1, -1, 70, 71, 72,
+ 73, 74, 75, 76, 77, 78, 79, 80, -1, -1,
+ 83, 84, 85, 86, -1, 3, 4, 5, -1, -1,
+ -1, 9, -1, -1, -1, -1, 14, -1, 101, 102,
+ 103, 104, 105, 106, 107, 108, 109, -1, -1, -1,
+ -1, -1, 30, 31, -1, -1, -1, -1, -1, -1,
+ -1, -1, 125, 126, 127, -1, -1, -1, -1, -1,
+ 133, -1, -1, -1, 137, 53, 54, 55, 56, 57,
+ 58, 59, 60, 61, 62, 63, 64, -1, -1, -1,
+ -1, -1, 70, 71, 72, 73, 74, 75, 76, 77,
+ 78, 79, 80, -1, -1, 83, 84, 85, 86, -1,
+ 3, 4, 5, -1, -1, -1, 9, -1, -1, -1,
+ -1, 14, -1, 101, 102, 103, 104, 105, 106, 107,
+ 108, 109, -1, -1, -1, -1, -1, 30, 31, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 126, 127,
+ -1, -1, -1, -1, -1, 133, 134, -1, -1, 137,
+ 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
+ 63, 64, -1, -1, -1, -1, -1, 70, 71, 72,
+ 73, 74, 75, 76, 77, 78, 79, 80, -1, -1,
+ 83, 84, 85, 86, -1, 3, 4, 5, -1, -1,
+ -1, 9, -1, -1, -1, -1, 14, -1, 101, 102,
+ 103, 104, 105, 106, 107, 108, 109, -1, -1, -1,
+ -1, -1, 30, 31, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 126, 127, -1, -1, -1, -1, -1,
+ 133, -1, -1, -1, 137, 53, 54, 55, 56, 57,
+ 58, 59, 60, 61, 62, 63, 64, -1, -1, -1,
+ -1, -1, 70, 71, 72, 73, 74, 75, 76, 77,
+ 78, 79, 80, -1, -1, 83, 84, 85, 86, -1,
+ 3, 4, 5, -1, -1, -1, 9, -1, -1, -1,
+ -1, 14, -1, 101, 102, 103, 104, 105, 106, 107,
+ 108, 109, -1, -1, -1, -1, -1, 30, 31, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 126, 127,
+ -1, -1, -1, -1, -1, 133, -1, -1, -1, 137,
+ 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
+ 63, 64, -1, -1, -1, -1, -1, 70, 71, 72,
+ 73, 74, 75, 76, 77, 78, 79, 80, -1, -1,
+ 83, 84, 85, 86, -1, -1, 3, 4, 5, -1,
+ -1, -1, 9, -1, -1, -1, -1, 14, 101, 102,
+ 103, 104, 105, 106, 107, 108, 109, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 126, 127, -1, -1, -1, -1, -1,
+ 133, 48, -1, -1, 137, -1, 53, 54, 55, 56,
+ 57, 58, 59, 60, 61, 62, 63, 64, -1, -1,
+ -1, -1, -1, 70, 71, 72, 73, 74, 75, 76,
+ 77, 78, 79, 80, -1, -1, 83, 84, 85, 86,
+ -1, -1, 3, 4, 5, -1, -1, -1, 9, -1,
+ -1, -1, -1, 14, 101, 102, 103, 104, 105, 106,
+ 107, 108, 109, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 126,
+ 127, -1, -1, -1, -1, -1, 133, 48, -1, -1,
+ 137, -1, 53, 54, 55, 56, 57, 58, 59, 60,
+ 61, 62, 63, 64, -1, -1, -1, -1, -1, 70,
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ -1, -1, 83, 84, 85, 86, -1, 3, 4, 5,
+ -1, -1, -1, 9, -1, -1, -1, -1, 14, -1,
+ 101, 102, 103, 104, 105, 106, 107, 108, 109, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 126, 127, -1, -1, -1,
+ -1, -1, 133, -1, -1, -1, 137, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63, 64, -1,
+ -1, -1, -1, -1, 70, 71, 72, 73, 74, 75,
+ 76, 77, 78, 79, 80, -1, -1, 83, 84, 85,
+ 86, 30, 31, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 101, 102, 103, 104, 105,
+ 106, 107, 108, 109, -1, 54, 55, 56, 57, 58,
+ 59, 60, 61, 62, 63, 64, 30, 31, -1, -1,
+ 126, 127, -1, -1, -1, -1, -1, 133, -1, -1,
+ -1, 137, -1, -1, 83, 84, 85, 86, -1, -1,
+ 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, -1, 101, 102, 103, 104, 105, 106, 107, 108,
+ 109, -1, -1, -1, -1, 48, -1, -1, 51, 83,
+ 84, 85, 86, -1, -1, 48, 125, -1, 51, -1,
+ -1, -1, -1, -1, -1, -1, -1, 101, 102, 103,
+ 104, 105, 106, 107, 108, 109, 95, 96, 97, 98,
+ 99, 100, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 125, 95, 96, 97, 98, 99, 100, -1, -1,
+ -1, -1, 95, 96, 97, 98, 99, 100, -1, -1,
+ 129, 130, 131, 132, 133, 134, 135, 136, -1, 138,
+ -1, -1, -1, -1, -1, -1, 129, 130, 131, 132,
+ 133, 134, 135, 136, -1, 138, 129, 130, 131, 132,
+ 133, 134, 135, 136, -1, 138, 54, 55, 56, 57,
+ 58, 59, 60, 61, 62, 63, 64, 54, 55, 56,
+ 57, 58, 59, 60, 61, 62, 63, 64, -1, -1,
+ -1, -1, -1, -1, -1, 83, 84, 85, 86, -1,
+ -1, -1, -1, -1, -1, -1, 83, 84, 85, 86,
+ -1, -1, -1, 101, 102, 103, 104, 105, 106, 107,
+ 108, 109, -1, -1, 101, 102, 103, 104, 105, 106,
+ 107, 108, 109, -1, -1, -1, -1, 125, 95, 96,
+ 97, 98, 99, 100, -1, -1, -1, 95, 96, 97,
+ 98, 99, 100, -1, -1, -1, 95, -1, 97, 98,
+ 99, 100, -1, -1, -1, 95, -1, 97, 98, 99,
+ 100, -1, -1, 130, 131, 132, 133, 134, 135, 136,
+ -1, 138, 130, 131, 132, 133, 134, 135, 136, -1,
+ 138, 130, 131, 132, 133, 134, 135, 136, -1, 138,
+ 130, 131, 132, 133, 134, 135, 136, -1, 138
+};
+
+/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of
+ state STATE-NUM. */
+static const yytype_uint8 yystos[] =
+{
+ 0, 139, 147, 148, 150, 151, 0, 3, 4, 6,
+ 7, 15, 16, 17, 18, 19, 20, 21, 22, 25,
+ 28, 29, 30, 31, 81, 87, 88, 91, 93, 110,
+ 112, 121, 122, 128, 142, 149, 152, 161, 164, 170,
+ 174, 176, 139, 141, 140, 141, 140, 6, 82, 153,
+ 3, 4, 5, 9, 14, 30, 31, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63, 64, 70,
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ 83, 84, 85, 86, 101, 102, 103, 104, 105, 106,
+ 107, 108, 109, 126, 127, 133, 137, 162, 163, 176,
+ 178, 179, 181, 182, 183, 184, 185, 186, 191, 192,
+ 193, 194, 4, 126, 137, 167, 168, 176, 182, 192,
+ 194, 4, 192, 126, 162, 175, 171, 150, 151, 4,
+ 129, 94, 11, 12, 13, 23, 24, 26, 27, 28,
+ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
+ 39, 40, 41, 42, 43, 44, 45, 46, 47, 89,
+ 90, 113, 114, 115, 116, 117, 118, 119, 120, 176,
+ 192, 150, 167, 140, 3, 4, 160, 82, 156, 8,
+ 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+ 126, 30, 31, 101, 102, 30, 31, 101, 102, 167,
+ 178, 181, 182, 192, 194, 167, 192, 192, 163, 132,
+ 133, 65, 66, 67, 68, 69, 125, 191, 6, 14,
+ 15, 16, 17, 18, 19, 20, 22, 128, 187, 187,
+ 48, 183, 48, 51, 95, 96, 97, 98, 99, 100,
+ 129, 130, 131, 132, 133, 134, 135, 136, 138, 180,
+ 130, 140, 168, 192, 37, 95, 96, 97, 98, 95,
+ 96, 176, 6, 148, 150, 148, 170, 4, 159, 192,
+ 192, 192, 192, 192, 192, 192, 192, 178, 192, 178,
+ 178, 3, 9, 14, 125, 126, 178, 188, 189, 190,
+ 191, 126, 181, 192, 192, 192, 192, 192, 192, 176,
+ 176, 176, 192, 192, 3, 4, 30, 31, 170, 178,
+ 179, 182, 167, 154, 8, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 145, 167, 167, 145, 129, 132,
+ 133, 145, 145, 180, 130, 10, 181, 181, 3, 144,
+ 183, 49, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 178, 178, 192,
+ 165, 168, 192, 168, 192, 176, 176, 168, 192, 168,
+ 192, 177, 144, 143, 8, 189, 191, 187, 187, 3,
+ 189, 125, 191, 181, 192, 8, 157, 145, 145, 129,
+ 145, 145, 145, 129, 129, 145, 145, 145, 178, 181,
+ 181, 178, 178, 50, 52, 129, 33, 8, 129, 145,
+ 172, 189, 189, 129, 3, 155, 111, 166, 167, 167,
+ 167, 145, 145, 145, 52, 129, 51, 178, 178, 192,
+ 192, 170, 173, 189, 166, 6, 145, 145, 145, 178,
+ 178, 131, 36, 169, 145, 145, 131, 134, 192, 92,
+ 145, 192, 158, 8
+};
+
+/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */
+static const yytype_uint8 yyr1[] =
+{
+ 0, 146, 147, 147, 148, 149, 149, 150, 150, 151,
+ 151, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+ 152, 153, 152, 152, 154, 155, 152, 156, 157, 152,
+ 158, 152, 152, 159, 152, 152, 152, 160, 160, 161,
+ 161, 161, 162, 162, 163, 163, 163, 165, 164, 166,
+ 166, 167, 167, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 169, 169, 169, 170, 170, 170, 170, 171,
+ 172, 170, 170, 173, 173, 174, 174, 174, 174, 174,
+ 174, 174, 174, 174, 174, 174, 175, 174, 174, 174,
+ 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
+ 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
+ 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
+ 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
+ 174, 174, 174, 174, 174, 174, 176, 176, 177, 177,
+ 178, 178, 178, 179, 179, 179, 179, 179, 179, 179,
+ 179, 179, 179, 180, 180, 181, 181, 182, 182, 182,
+ 182, 182, 183, 183, 183, 184, 184, 185, 185, 186,
+ 186, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+ 188, 188, 189, 189, 189, 190, 190, 190, 190, 190,
+ 190, 191, 191, 191, 191, 191, 191, 191, 191, 191,
+ 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
+ 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
+ 191, 191, 191, 192, 192, 193, 194, 194, 194, 194,
+ 194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
+ 194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
+ 194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
+ 194
+};
+
+/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */
+static const yytype_int8 yyr2[] =
+{
+ 0, 2, 1, 1, 3, 1, 3, 0, 1, 1,
+ 2, 3, 3, 4, 1, 1, 1, 1, 1, 2,
+ 2, 0, 3, 2, 0, 0, 7, 0, 0, 6,
+ 0, 10, 1, 0, 4, 1, 1, 1, 1, 2,
+ 2, 3, 1, 2, 1, 1, 1, 0, 5, 0,
+ 2, 1, 1, 3, 3, 3, 3, 3, 3, 3,
+ 3, 2, 0, 2, 3, 1, 4, 4, 4, 0,
+ 0, 6, 1, 0, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2, 3, 0, 4, 3, 3,
+ 3, 3, 2, 2, 3, 2, 3, 2, 3, 2,
+ 3, 3, 3, 3, 3, 3, 3, 2, 2, 2,
+ 3, 2, 3, 2, 3, 3, 3, 3, 3, 3,
+ 2, 3, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 3, 2, 1, 5, 0, 3,
+ 1, 1, 3, 1, 3, 5, 3, 5, 5, 5,
+ 7, 6, 8, 1, 4, 3, 3, 1, 2, 2,
+ 3, 1, 1, 1, 3, 1, 3, 1, 2, 2,
+ 2, 1, 1, 1, 1, 1, 1, 1, 2, 1,
+ 2, 3, 1, 1, 2, 1, 5, 4, 3, 3,
+ 2, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
+ 1, 1, 2, 2, 2, 2, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 3, 1, 1, 2, 2,
+ 2, 2, 2, 3, 3, 3, 3, 3, 3, 2,
+ 3, 4, 4, 6, 4, 4, 4, 6, 6, 4,
+ 4, 3, 4, 3, 3, 3, 3, 3, 3, 3,
+ 2
+};
+
+
+enum { YYENOMEM = -2 };
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrorlab
+#define YYNOMEM goto yyexhaustedlab
+
+
+#define YYRECOVERING() (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value) \
+ do \
+ if (yychar == YYEMPTY) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ YYPOPSTACK (yylen); \
+ yystate = *yyssp; \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror (YY_("syntax error: cannot back up")); \
+ YYERROR; \
+ } \
+ while (0)
+
+/* Backward compatibility with an undocumented macro.
+ Use YYerror or YYUNDEF. */
+#define YYERRCODE YYUNDEF
+
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (0)
+
+
+
+
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yy_symbol_print (stderr, \
+ Kind, Value); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (0)
+
+
+/*-----------------------------------.
+| Print this symbol's value on YYO. |
+`-----------------------------------*/
+
+static void
+yy_symbol_value_print (FILE *yyo,
+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep)
+{
+ FILE *yyoutput = yyo;
+ YY_USE (yyoutput);
+ if (!yyvaluep)
+ return;
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YY_USE (yykind);
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+/*---------------------------.
+| Print this symbol on YYO. |
+`---------------------------*/
+
+static void
+yy_symbol_print (FILE *yyo,
+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep)
+{
+ YYFPRINTF (yyo, "%s %s (",
+ yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind));
+
+ yy_symbol_value_print (yyo, yykind, yyvaluep);
+ YYFPRINTF (yyo, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included). |
+`------------------------------------------------------------------*/
+
+static void
+yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop)
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (; yybottom <= yytop; yybottom++)
+ {
+ int yybot = *yybottom;
+ YYFPRINTF (stderr, " %d", yybot);
+ }
+ YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+
+static void
+yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp,
+ int yyrule)
+{
+ int yylno = yyrline[yyrule];
+ int yynrhs = yyr2[yyrule];
+ int yyi;
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n",
+ yyrule - 1, yylno);
+ /* The symbols being reduced. */
+ for (yyi = 0; yyi < yynrhs; yyi++)
+ {
+ YYFPRINTF (stderr, " $%d = ", yyi + 1);
+ yy_symbol_print (stderr,
+ YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]),
+ &yyvsp[(yyi + 1) - (yynrhs)]);
+ YYFPRINTF (stderr, "\n");
+ }
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (yyssp, yyvsp, Rule); \
+} while (0)
+
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args) ((void) 0)
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+
+
+
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
+
+static void
+yydestruct (const char *yymsg,
+ yysymbol_kind_t yykind, YYSTYPE *yyvaluep)
+{
+ YY_USE (yyvaluep);
+ if (!yymsg)
+ yymsg = "Deleting";
+ YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YY_USE (yykind);
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+/* Lookahead token kind. */
+int yychar;
+
+/* The semantic value of the lookahead symbol. */
+YYSTYPE yylval;
+/* Number of syntax errors so far. */
+int yynerrs;
+
+
+
+
+/*----------.
+| yyparse. |
+`----------*/
+
+int
+yyparse (void)
+{
+ yy_state_fast_t yystate = 0;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus = 0;
+
+ /* Refer to the stacks through separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* Their size. */
+ YYPTRDIFF_T yystacksize = YYINITDEPTH;
+
+ /* The state stack: array, bottom, top. */
+ yy_state_t yyssa[YYINITDEPTH];
+ yy_state_t *yyss = yyssa;
+ yy_state_t *yyssp = yyss;
+
+ /* The semantic value stack: array, bottom, top. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs = yyvsa;
+ YYSTYPE *yyvsp = yyvs;
+
+ int yyn;
+ /* The return value of yyparse. */
+ int yyresult;
+ /* Lookahead symbol kind. */
+ yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY;
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+
+
+
+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
+
+ /* The number of symbols on the RHS of the reduced rule.
+ Keep to zero when no symbol should be popped. */
+ int yylen = 0;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ goto yysetstate;
+
+
+/*------------------------------------------------------------.
+| yynewstate -- push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. So pushing a state here evens the stacks. */
+ yyssp++;
+
+
+/*--------------------------------------------------------------------.
+| yysetstate -- set current state (the top of the stack) to yystate. |
+`--------------------------------------------------------------------*/
+yysetstate:
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+ YY_ASSERT (0 <= yystate && yystate < YYNSTATES);
+ YY_IGNORE_USELESS_CAST_BEGIN
+ *yyssp = YY_CAST (yy_state_t, yystate);
+ YY_IGNORE_USELESS_CAST_END
+ YY_STACK_PRINT (yyss, yyssp);
+
+ if (yyss + yystacksize - 1 <= yyssp)
+#if !defined yyoverflow && !defined YYSTACK_RELOCATE
+ YYNOMEM;
+#else
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYPTRDIFF_T yysize = yyssp - yyss + 1;
+
+# if defined yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ yy_state_t *yyss1 = yyss;
+ YYSTYPE *yyvs1 = yyvs;
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow (YY_("memory exhausted"),
+ &yyss1, yysize * YYSIZEOF (*yyssp),
+ &yyvs1, yysize * YYSIZEOF (*yyvsp),
+ &yystacksize);
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+# else /* defined YYSTACK_RELOCATE */
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+ YYNOMEM;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ yy_state_t *yyss1 = yyss;
+ union yyalloc *yyptr =
+ YY_CAST (union yyalloc *,
+ YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
+ if (! yyptr)
+ YYNOMEM;
+ YYSTACK_RELOCATE (yyss_alloc, yyss);
+ YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+
+ YY_IGNORE_USELESS_CAST_BEGIN
+ YYDPRINTF ((stderr, "Stack size increased to %ld\n",
+ YY_CAST (long, yystacksize)));
+ YY_IGNORE_USELESS_CAST_END
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ YYABORT;
+ }
+#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
+
+
+ if (yystate == YYFINAL)
+ YYACCEPT;
+
+ goto yybackup;
+
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+ /* Do appropriate processing given the current state. Read a
+ lookahead token if we need one and don't already have one. */
+
+ /* First try to decide what to do without reference to lookahead token. */
+ yyn = yypact[yystate];
+ if (yypact_value_is_default (yyn))
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token\n"));
+ yychar = yylex ();
+ }
+
+ if (yychar <= YYEOF)
+ {
+ yychar = YYEOF;
+ yytoken = YYSYMBOL_YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else if (yychar == YYerror)
+ {
+ /* The scanner already issued an error message, process directly
+ to error recovery. But do not keep the error token as
+ lookahead, it is too special and may lead us to an endless
+ loop in error recovery. */
+ yychar = YYUNDEF;
+ yytoken = YYSYMBOL_YYerror;
+ goto yyerrlab1;
+ }
+ else
+ {
+ yytoken = YYTRANSLATE (yychar);
+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+ }
+
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+ goto yydefault;
+ yyn = yytable[yyn];
+ if (yyn <= 0)
+ {
+ if (yytable_value_is_error (yyn))
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ /* Shift the lookahead token. */
+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+ yystate = yyn;
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+ /* Discard the shifted token. */
+ yychar = YYEMPTY;
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ '$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 3: /* top: element_list */
+#line 277 "../src/preproc/pic/pic.ypp"
+ {
+ if (olist.head)
+ print_picture(olist.head);
+ }
+#line 2343 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 4: /* element_list: optional_separator middle_element_list optional_separator */
+#line 286 "../src/preproc/pic/pic.ypp"
+ { (yyval.pl) = (yyvsp[-1].pl); }
+#line 2349 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 5: /* middle_element_list: element */
+#line 291 "../src/preproc/pic/pic.ypp"
+ { (yyval.pl) = (yyvsp[0].pl); }
+#line 2355 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 6: /* middle_element_list: middle_element_list separator element */
+#line 293 "../src/preproc/pic/pic.ypp"
+ { (yyval.pl) = (yyvsp[-2].pl); }
+#line 2361 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 11: /* placeless_element: FIGNAME '=' macro_name */
+#line 308 "../src/preproc/pic/pic.ypp"
+ {
+ delete[] graphname;
+ graphname = new char[strlen((yyvsp[0].str)) + 1];
+ strcpy(graphname, (yyvsp[0].str));
+ delete[] (yyvsp[0].str);
+ }
+#line 2372 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 12: /* placeless_element: VARIABLE '=' any_expr */
+#line 316 "../src/preproc/pic/pic.ypp"
+ {
+ define_variable((yyvsp[-2].str), (yyvsp[0].x));
+ free((yyvsp[-2].str));
+ }
+#line 2381 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 13: /* placeless_element: VARIABLE ':' '=' any_expr */
+#line 321 "../src/preproc/pic/pic.ypp"
+ {
+ place *p = lookup_label((yyvsp[-3].str));
+ if (!p) {
+ lex_error("variable '%1' not defined", (yyvsp[-3].str));
+ YYABORT;
+ }
+ p->obj = 0;
+ p->x = (yyvsp[0].x);
+ p->y = 0.0;
+ free((yyvsp[-3].str));
+ }
+#line 2397 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 14: /* placeless_element: UP */
+#line 333 "../src/preproc/pic/pic.ypp"
+ { current_direction = UP_DIRECTION; }
+#line 2403 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 15: /* placeless_element: DOWN */
+#line 335 "../src/preproc/pic/pic.ypp"
+ { current_direction = DOWN_DIRECTION; }
+#line 2409 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 16: /* placeless_element: LEFT */
+#line 337 "../src/preproc/pic/pic.ypp"
+ { current_direction = LEFT_DIRECTION; }
+#line 2415 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 17: /* placeless_element: RIGHT */
+#line 339 "../src/preproc/pic/pic.ypp"
+ { current_direction = RIGHT_DIRECTION; }
+#line 2421 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 18: /* placeless_element: COMMAND_LINE */
+#line 341 "../src/preproc/pic/pic.ypp"
+ {
+ olist.append(make_command_object((yyvsp[0].lstr).str, (yyvsp[0].lstr).filename,
+ (yyvsp[0].lstr).lineno));
+ }
+#line 2430 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 19: /* placeless_element: COMMAND print_args */
+#line 346 "../src/preproc/pic/pic.ypp"
+ {
+ olist.append(make_command_object((yyvsp[0].lstr).str, (yyvsp[0].lstr).filename,
+ (yyvsp[0].lstr).lineno));
+ }
+#line 2439 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 20: /* placeless_element: PRINT print_args */
+#line 351 "../src/preproc/pic/pic.ypp"
+ {
+ fprintf(stderr, "%s\n", (yyvsp[0].lstr).str);
+ delete[] (yyvsp[0].lstr).str;
+ fflush(stderr);
+ }
+#line 2449 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 21: /* $@1: %empty */
+#line 357 "../src/preproc/pic/pic.ypp"
+ { delim_flag = 1; }
+#line 2455 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 22: /* placeless_element: SH $@1 DELIMITED */
+#line 359 "../src/preproc/pic/pic.ypp"
+ {
+ delim_flag = 0;
+ if (safer_flag)
+ lex_error("unsafe to run command '%1'; ignoring",
+ (yyvsp[0].str));
+ else {
+ int retval = system((yyvsp[0].str));
+ if (retval < 0)
+ lex_error("error running command '%1': system()"
+ " returned %2", (yyvsp[0].str), retval);
+ }
+ delete[] (yyvsp[0].str);
+ }
+#line 2473 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 23: /* placeless_element: COPY TEXT */
+#line 373 "../src/preproc/pic/pic.ypp"
+ {
+ if (yychar < 0)
+ do_lookahead();
+ do_copy((yyvsp[0].lstr).str);
+ // do not delete the filename
+ }
+#line 2484 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 24: /* $@2: %empty */
+#line 380 "../src/preproc/pic/pic.ypp"
+ { delim_flag = 2; }
+#line 2490 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 25: /* $@3: %empty */
+#line 382 "../src/preproc/pic/pic.ypp"
+ { delim_flag = 0; }
+#line 2496 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 26: /* placeless_element: COPY TEXT THRU $@2 DELIMITED $@3 until */
+#line 384 "../src/preproc/pic/pic.ypp"
+ {
+ if (yychar < 0)
+ do_lookahead();
+ copy_file_thru((yyvsp[-5].lstr).str, (yyvsp[-2].str), (yyvsp[0].str));
+ // do not delete the filename
+ delete[] (yyvsp[-2].str);
+ delete[] (yyvsp[0].str);
+ }
+#line 2509 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 27: /* $@4: %empty */
+#line 393 "../src/preproc/pic/pic.ypp"
+ { delim_flag = 2; }
+#line 2515 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 28: /* $@5: %empty */
+#line 395 "../src/preproc/pic/pic.ypp"
+ { delim_flag = 0; }
+#line 2521 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 29: /* placeless_element: COPY THRU $@4 DELIMITED $@5 until */
+#line 397 "../src/preproc/pic/pic.ypp"
+ {
+ if (yychar < 0)
+ do_lookahead();
+ copy_rest_thru((yyvsp[-2].str), (yyvsp[0].str));
+ delete[] (yyvsp[-2].str);
+ delete[] (yyvsp[0].str);
+ }
+#line 2533 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 30: /* $@6: %empty */
+#line 405 "../src/preproc/pic/pic.ypp"
+ { delim_flag = 1; }
+#line 2539 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 31: /* placeless_element: FOR VARIABLE '=' expr TO expr optional_by DO $@6 DELIMITED */
+#line 407 "../src/preproc/pic/pic.ypp"
+ {
+ delim_flag = 0;
+ if (yychar < 0)
+ do_lookahead();
+ do_for((yyvsp[-8].str), (yyvsp[-6].x), (yyvsp[-4].x), (yyvsp[-3].by).is_multiplicative, (yyvsp[-3].by).val, (yyvsp[0].str));
+ }
+#line 2550 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 32: /* placeless_element: simple_if */
+#line 414 "../src/preproc/pic/pic.ypp"
+ {
+ if (yychar < 0)
+ do_lookahead();
+ if ((yyvsp[0].if_data).x != 0.0)
+ push_body((yyvsp[0].if_data).body);
+ delete[] (yyvsp[0].if_data).body;
+ }
+#line 2562 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 33: /* $@7: %empty */
+#line 422 "../src/preproc/pic/pic.ypp"
+ { delim_flag = 1; }
+#line 2568 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 34: /* placeless_element: simple_if ELSE $@7 DELIMITED */
+#line 424 "../src/preproc/pic/pic.ypp"
+ {
+ delim_flag = 0;
+ if (yychar < 0)
+ do_lookahead();
+ if ((yyvsp[-3].if_data).x != 0.0)
+ push_body((yyvsp[-3].if_data).body);
+ else
+ push_body((yyvsp[0].str));
+ free((yyvsp[-3].if_data).body);
+ free((yyvsp[0].str));
+ }
+#line 2584 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 36: /* placeless_element: RESET */
+#line 437 "../src/preproc/pic/pic.ypp"
+ { define_variable("scale", 1.0); }
+#line 2590 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 39: /* reset_variables: RESET VARIABLE */
+#line 447 "../src/preproc/pic/pic.ypp"
+ {
+ reset((yyvsp[0].str));
+ delete[] (yyvsp[0].str);
+ }
+#line 2599 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 40: /* reset_variables: reset_variables VARIABLE */
+#line 452 "../src/preproc/pic/pic.ypp"
+ {
+ reset((yyvsp[0].str));
+ delete[] (yyvsp[0].str);
+ }
+#line 2608 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 41: /* reset_variables: reset_variables ',' VARIABLE */
+#line 457 "../src/preproc/pic/pic.ypp"
+ {
+ reset((yyvsp[0].str));
+ delete[] (yyvsp[0].str);
+ }
+#line 2617 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 42: /* print_args: print_arg */
+#line 465 "../src/preproc/pic/pic.ypp"
+ { (yyval.lstr) = (yyvsp[0].lstr); }
+#line 2623 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 43: /* print_args: print_args print_arg */
+#line 467 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.lstr).str = new char[strlen((yyvsp[-1].lstr).str) + strlen((yyvsp[0].lstr).str) + 1];
+ strcpy((yyval.lstr).str, (yyvsp[-1].lstr).str);
+ strcat((yyval.lstr).str, (yyvsp[0].lstr).str);
+ delete[] (yyvsp[-1].lstr).str;
+ delete[] (yyvsp[0].lstr).str;
+ if ((yyvsp[-1].lstr).filename) {
+ (yyval.lstr).filename = (yyvsp[-1].lstr).filename;
+ (yyval.lstr).lineno = (yyvsp[-1].lstr).lineno;
+ }
+ else if ((yyvsp[0].lstr).filename) {
+ (yyval.lstr).filename = (yyvsp[0].lstr).filename;
+ (yyval.lstr).lineno = (yyvsp[0].lstr).lineno;
+ }
+ }
+#line 2643 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 44: /* print_arg: expr */
+#line 486 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.lstr).str = new char[GDIGITS + 1];
+ sprintf((yyval.lstr).str, "%g", (yyvsp[0].x));
+ (yyval.lstr).filename = 0;
+ (yyval.lstr).lineno = 0;
+ }
+#line 2654 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 45: /* print_arg: text */
+#line 493 "../src/preproc/pic/pic.ypp"
+ { (yyval.lstr) = (yyvsp[0].lstr); }
+#line 2660 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 46: /* print_arg: position */
+#line 495 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.lstr).str = new char[GDIGITS + 2 + GDIGITS + 1];
+ sprintf((yyval.lstr).str, "%g, %g", (yyvsp[0].pair).x, (yyvsp[0].pair).y);
+ (yyval.lstr).filename = 0;
+ (yyval.lstr).lineno = 0;
+ }
+#line 2671 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 47: /* $@8: %empty */
+#line 505 "../src/preproc/pic/pic.ypp"
+ { delim_flag = 1; }
+#line 2677 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 48: /* simple_if: IF any_expr THEN $@8 DELIMITED */
+#line 507 "../src/preproc/pic/pic.ypp"
+ {
+ delim_flag = 0;
+ (yyval.if_data).x = (yyvsp[-3].x);
+ (yyval.if_data).body = (yyvsp[0].str);
+ }
+#line 2687 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 49: /* until: %empty */
+#line 516 "../src/preproc/pic/pic.ypp"
+ { (yyval.str) = 0; }
+#line 2693 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 50: /* until: UNTIL TEXT */
+#line 518 "../src/preproc/pic/pic.ypp"
+ { (yyval.str) = (yyvsp[0].lstr).str; }
+#line 2699 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 51: /* any_expr: expr */
+#line 523 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = (yyvsp[0].x); }
+#line 2705 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 52: /* any_expr: text_expr */
+#line 525 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = (yyvsp[0].x); }
+#line 2711 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 53: /* text_expr: text EQUALEQUAL text */
+#line 530 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.x) = strcmp((yyvsp[-2].lstr).str, (yyvsp[0].lstr).str) == 0;
+ delete[] (yyvsp[-2].lstr).str;
+ delete[] (yyvsp[0].lstr).str;
+ }
+#line 2721 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 54: /* text_expr: text NOTEQUAL text */
+#line 536 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.x) = strcmp((yyvsp[-2].lstr).str, (yyvsp[0].lstr).str) != 0;
+ delete[] (yyvsp[-2].lstr).str;
+ delete[] (yyvsp[0].lstr).str;
+ }
+#line 2731 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 55: /* text_expr: text_expr ANDAND text_expr */
+#line 542 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = ((yyvsp[-2].x) != 0.0 && (yyvsp[0].x) != 0.0); }
+#line 2737 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 56: /* text_expr: text_expr ANDAND expr */
+#line 544 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = ((yyvsp[-2].x) != 0.0 && (yyvsp[0].x) != 0.0); }
+#line 2743 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 57: /* text_expr: expr ANDAND text_expr */
+#line 546 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = ((yyvsp[-2].x) != 0.0 && (yyvsp[0].x) != 0.0); }
+#line 2749 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 58: /* text_expr: text_expr OROR text_expr */
+#line 548 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = ((yyvsp[-2].x) != 0.0 || (yyvsp[0].x) != 0.0); }
+#line 2755 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 59: /* text_expr: text_expr OROR expr */
+#line 550 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = ((yyvsp[-2].x) != 0.0 || (yyvsp[0].x) != 0.0); }
+#line 2761 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 60: /* text_expr: expr OROR text_expr */
+#line 552 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = ((yyvsp[-2].x) != 0.0 || (yyvsp[0].x) != 0.0); }
+#line 2767 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 61: /* text_expr: '!' text_expr */
+#line 554 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = ((yyvsp[0].x) == 0.0); }
+#line 2773 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 62: /* optional_by: %empty */
+#line 560 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.by).val = 1.0;
+ (yyval.by).is_multiplicative = 0;
+ }
+#line 2782 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 63: /* optional_by: BY expr */
+#line 565 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.by).val = (yyvsp[0].x);
+ (yyval.by).is_multiplicative = 0;
+ }
+#line 2791 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 64: /* optional_by: BY '*' expr */
+#line 570 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.by).val = (yyvsp[0].x);
+ (yyval.by).is_multiplicative = 1;
+ }
+#line 2800 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 65: /* element: object_spec */
+#line 578 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.pl).obj = (yyvsp[0].spec)->make_object(&current_position,
+ &current_direction);
+ if ((yyval.pl).obj == 0)
+ YYABORT;
+ delete (yyvsp[0].spec);
+ if ((yyval.pl).obj)
+ olist.append((yyval.pl).obj);
+ else {
+ (yyval.pl).x = current_position.x;
+ (yyval.pl).y = current_position.y;
+ }
+ }
+#line 2818 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 66: /* element: LABEL ':' optional_separator element */
+#line 592 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.pl) = (yyvsp[0].pl);
+ define_label((yyvsp[-3].str), & (yyval.pl));
+ free((yyvsp[-3].str));
+ }
+#line 2828 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 67: /* element: LABEL ':' optional_separator position_not_place */
+#line 598 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.pl).obj = 0;
+ (yyval.pl).x = (yyvsp[0].pair).x;
+ (yyval.pl).y = (yyvsp[0].pair).y;
+ define_label((yyvsp[-3].str), & (yyval.pl));
+ free((yyvsp[-3].str));
+ }
+#line 2840 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 68: /* element: LABEL ':' optional_separator place */
+#line 606 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.pl) = (yyvsp[0].pl);
+ define_label((yyvsp[-3].str), & (yyval.pl));
+ free((yyvsp[-3].str));
+ }
+#line 2850 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 69: /* @9: %empty */
+#line 612 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.state).x = current_position.x;
+ (yyval.state).y = current_position.y;
+ (yyval.state).dir = current_direction;
+ }
+#line 2860 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 70: /* $@10: %empty */
+#line 618 "../src/preproc/pic/pic.ypp"
+ {
+ current_position.x = (yyvsp[-2].state).x;
+ current_position.y = (yyvsp[-2].state).y;
+ current_direction = (yyvsp[-2].state).dir;
+ }
+#line 2870 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 71: /* element: '{' @9 element_list '}' $@10 optional_element */
+#line 624 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.pl) = (yyvsp[-3].pl);
+ }
+#line 2878 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 72: /* element: placeless_element */
+#line 628 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.pl).obj = 0;
+ (yyval.pl).x = current_position.x;
+ (yyval.pl).y = current_position.y;
+ }
+#line 2888 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 73: /* optional_element: %empty */
+#line 637 "../src/preproc/pic/pic.ypp"
+ {}
+#line 2894 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 74: /* optional_element: element */
+#line 639 "../src/preproc/pic/pic.ypp"
+ {}
+#line 2900 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 75: /* object_spec: BOX */
+#line 644 "../src/preproc/pic/pic.ypp"
+ { (yyval.spec) = new object_spec(BOX_OBJECT); }
+#line 2906 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 76: /* object_spec: CIRCLE */
+#line 646 "../src/preproc/pic/pic.ypp"
+ { (yyval.spec) = new object_spec(CIRCLE_OBJECT); }
+#line 2912 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 77: /* object_spec: ELLIPSE */
+#line 648 "../src/preproc/pic/pic.ypp"
+ { (yyval.spec) = new object_spec(ELLIPSE_OBJECT); }
+#line 2918 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 78: /* object_spec: ARC */
+#line 650 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = new object_spec(ARC_OBJECT);
+ (yyval.spec)->dir = current_direction;
+ }
+#line 2927 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 79: /* object_spec: LINE */
+#line 655 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = new object_spec(LINE_OBJECT);
+ lookup_variable("lineht", & (yyval.spec)->segment_height);
+ lookup_variable("linewid", & (yyval.spec)->segment_width);
+ (yyval.spec)->dir = current_direction;
+ }
+#line 2938 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 80: /* object_spec: ARROW */
+#line 662 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = new object_spec(ARROW_OBJECT);
+ lookup_variable("lineht", & (yyval.spec)->segment_height);
+ lookup_variable("linewid", & (yyval.spec)->segment_width);
+ (yyval.spec)->dir = current_direction;
+ }
+#line 2949 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 81: /* object_spec: MOVE */
+#line 669 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = new object_spec(MOVE_OBJECT);
+ lookup_variable("moveht", & (yyval.spec)->segment_height);
+ lookup_variable("movewid", & (yyval.spec)->segment_width);
+ (yyval.spec)->dir = current_direction;
+ }
+#line 2960 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 82: /* object_spec: SPLINE */
+#line 676 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = new object_spec(SPLINE_OBJECT);
+ lookup_variable("lineht", & (yyval.spec)->segment_height);
+ lookup_variable("linewid", & (yyval.spec)->segment_width);
+ (yyval.spec)->dir = current_direction;
+ }
+#line 2971 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 83: /* object_spec: text */
+#line 683 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = new object_spec(TEXT_OBJECT);
+ (yyval.spec)->text = new text_item((yyvsp[0].lstr).str, (yyvsp[0].lstr).filename, (yyvsp[0].lstr).lineno);
+ }
+#line 2980 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 84: /* object_spec: PLOT expr */
+#line 688 "../src/preproc/pic/pic.ypp"
+ {
+ lex_warning("'plot' is deprecated; use 'sprintf'"
+ " instead");
+ (yyval.spec) = new object_spec(TEXT_OBJECT);
+ (yyval.spec)->text = new text_item(format_number(0, (yyvsp[0].x)), 0, -1);
+ }
+#line 2991 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 85: /* object_spec: PLOT expr text */
+#line 695 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = new object_spec(TEXT_OBJECT);
+ (yyval.spec)->text = new text_item(format_number((yyvsp[0].lstr).str, (yyvsp[-1].x)),
+ (yyvsp[0].lstr).filename, (yyvsp[0].lstr).lineno);
+ delete[] (yyvsp[0].lstr).str;
+ }
+#line 3002 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 86: /* @11: %empty */
+#line 702 "../src/preproc/pic/pic.ypp"
+ {
+ saved_state *p = new saved_state;
+ (yyval.pstate) = p;
+ p->x = current_position.x;
+ p->y = current_position.y;
+ p->dir = current_direction;
+ p->tbl = current_table;
+ p->prev = current_saved_state;
+ current_position.x = 0.0;
+ current_position.y = 0.0;
+ current_table = new PTABLE(place);
+ current_saved_state = p;
+ olist.append(make_mark_object());
+ }
+#line 3021 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 87: /* object_spec: '[' @11 element_list ']' */
+#line 717 "../src/preproc/pic/pic.ypp"
+ {
+ current_position.x = (yyvsp[-2].pstate)->x;
+ current_position.y = (yyvsp[-2].pstate)->y;
+ current_direction = (yyvsp[-2].pstate)->dir;
+ (yyval.spec) = new object_spec(BLOCK_OBJECT);
+ olist.wrap_up_block(& (yyval.spec)->oblist);
+ (yyval.spec)->tbl = current_table;
+ current_table = (yyvsp[-2].pstate)->tbl;
+ current_saved_state = (yyvsp[-2].pstate)->prev;
+ delete (yyvsp[-2].pstate);
+ }
+#line 3037 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 88: /* object_spec: object_spec HEIGHT expr */
+#line 729 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->height = (yyvsp[0].x);
+ (yyval.spec)->flags |= HAS_HEIGHT;
+ }
+#line 3047 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 89: /* object_spec: object_spec RADIUS expr */
+#line 735 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->radius = (yyvsp[0].x);
+ (yyval.spec)->flags |= HAS_RADIUS;
+ }
+#line 3057 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 90: /* object_spec: object_spec WIDTH expr */
+#line 741 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->width = (yyvsp[0].x);
+ (yyval.spec)->flags |= HAS_WIDTH;
+ }
+#line 3067 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 91: /* object_spec: object_spec DIAMETER expr */
+#line 747 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->radius = (yyvsp[0].x)/2.0;
+ (yyval.spec)->flags |= HAS_RADIUS;
+ }
+#line 3077 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 92: /* object_spec: object_spec expr */
+#line 753 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ (yyval.spec)->flags |= HAS_SEGMENT;
+ switch ((yyval.spec)->dir) {
+ case UP_DIRECTION:
+ (yyval.spec)->segment_pos.y += (yyvsp[0].x);
+ break;
+ case DOWN_DIRECTION:
+ (yyval.spec)->segment_pos.y -= (yyvsp[0].x);
+ break;
+ case RIGHT_DIRECTION:
+ (yyval.spec)->segment_pos.x += (yyvsp[0].x);
+ break;
+ case LEFT_DIRECTION:
+ (yyval.spec)->segment_pos.x -= (yyvsp[0].x);
+ break;
+ }
+ }
+#line 3100 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 93: /* object_spec: object_spec UP */
+#line 772 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ (yyval.spec)->dir = UP_DIRECTION;
+ (yyval.spec)->flags |= HAS_SEGMENT;
+ (yyval.spec)->segment_pos.y += (yyval.spec)->segment_height;
+ }
+#line 3111 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 94: /* object_spec: object_spec UP expr */
+#line 779 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->dir = UP_DIRECTION;
+ (yyval.spec)->flags |= HAS_SEGMENT;
+ (yyval.spec)->segment_pos.y += (yyvsp[0].x);
+ }
+#line 3122 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 95: /* object_spec: object_spec DOWN */
+#line 786 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ (yyval.spec)->dir = DOWN_DIRECTION;
+ (yyval.spec)->flags |= HAS_SEGMENT;
+ (yyval.spec)->segment_pos.y -= (yyval.spec)->segment_height;
+ }
+#line 3133 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 96: /* object_spec: object_spec DOWN expr */
+#line 793 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->dir = DOWN_DIRECTION;
+ (yyval.spec)->flags |= HAS_SEGMENT;
+ (yyval.spec)->segment_pos.y -= (yyvsp[0].x);
+ }
+#line 3144 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 97: /* object_spec: object_spec RIGHT */
+#line 800 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ (yyval.spec)->dir = RIGHT_DIRECTION;
+ (yyval.spec)->flags |= HAS_SEGMENT;
+ (yyval.spec)->segment_pos.x += (yyval.spec)->segment_width;
+ }
+#line 3155 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 98: /* object_spec: object_spec RIGHT expr */
+#line 807 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->dir = RIGHT_DIRECTION;
+ (yyval.spec)->flags |= HAS_SEGMENT;
+ (yyval.spec)->segment_pos.x += (yyvsp[0].x);
+ }
+#line 3166 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 99: /* object_spec: object_spec LEFT */
+#line 814 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ (yyval.spec)->dir = LEFT_DIRECTION;
+ (yyval.spec)->flags |= HAS_SEGMENT;
+ (yyval.spec)->segment_pos.x -= (yyval.spec)->segment_width;
+ }
+#line 3177 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 100: /* object_spec: object_spec LEFT expr */
+#line 821 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->dir = LEFT_DIRECTION;
+ (yyval.spec)->flags |= HAS_SEGMENT;
+ (yyval.spec)->segment_pos.x -= (yyvsp[0].x);
+ }
+#line 3188 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 101: /* object_spec: object_spec FROM position */
+#line 828 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->flags |= HAS_FROM;
+ (yyval.spec)->from.x = (yyvsp[0].pair).x;
+ (yyval.spec)->from.y = (yyvsp[0].pair).y;
+ }
+#line 3199 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 102: /* object_spec: object_spec TO position */
+#line 835 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ if ((yyval.spec)->flags & HAS_SEGMENT)
+ (yyval.spec)->segment_list = new segment((yyval.spec)->segment_pos,
+ (yyval.spec)->segment_is_absolute,
+ (yyval.spec)->segment_list);
+ (yyval.spec)->flags |= HAS_SEGMENT;
+ (yyval.spec)->segment_pos.x = (yyvsp[0].pair).x;
+ (yyval.spec)->segment_pos.y = (yyvsp[0].pair).y;
+ (yyval.spec)->segment_is_absolute = 1;
+ (yyval.spec)->flags |= HAS_TO;
+ (yyval.spec)->to.x = (yyvsp[0].pair).x;
+ (yyval.spec)->to.y = (yyvsp[0].pair).y;
+ }
+#line 3218 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 103: /* object_spec: object_spec AT position */
+#line 850 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->flags |= HAS_AT;
+ (yyval.spec)->at.x = (yyvsp[0].pair).x;
+ (yyval.spec)->at.y = (yyvsp[0].pair).y;
+ if ((yyval.spec)->type != ARC_OBJECT) {
+ (yyval.spec)->flags |= HAS_FROM;
+ (yyval.spec)->from.x = (yyvsp[0].pair).x;
+ (yyval.spec)->from.y = (yyvsp[0].pair).y;
+ }
+ }
+#line 3234 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 104: /* object_spec: object_spec WITH path */
+#line 862 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->flags |= HAS_WITH;
+ (yyval.spec)->with = (yyvsp[0].pth);
+ }
+#line 3244 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 105: /* object_spec: object_spec WITH position */
+#line 868 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->flags |= HAS_WITH;
+ position pos;
+ pos.x = (yyvsp[0].pair).x;
+ pos.y = (yyvsp[0].pair).y;
+ (yyval.spec)->with = new path(pos);
+ }
+#line 3257 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 106: /* object_spec: object_spec BY expr_pair */
+#line 877 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->flags |= HAS_SEGMENT;
+ (yyval.spec)->segment_pos.x += (yyvsp[0].pair).x;
+ (yyval.spec)->segment_pos.y += (yyvsp[0].pair).y;
+ }
+#line 3268 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 107: /* object_spec: object_spec THEN */
+#line 884 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ if (!((yyval.spec)->flags & HAS_SEGMENT))
+ switch ((yyval.spec)->dir) {
+ case UP_DIRECTION:
+ (yyval.spec)->segment_pos.y += (yyval.spec)->segment_width;
+ break;
+ case DOWN_DIRECTION:
+ (yyval.spec)->segment_pos.y -= (yyval.spec)->segment_width;
+ break;
+ case RIGHT_DIRECTION:
+ (yyval.spec)->segment_pos.x += (yyval.spec)->segment_width;
+ break;
+ case LEFT_DIRECTION:
+ (yyval.spec)->segment_pos.x -= (yyval.spec)->segment_width;
+ break;
+ }
+ (yyval.spec)->segment_list = new segment((yyval.spec)->segment_pos,
+ (yyval.spec)->segment_is_absolute,
+ (yyval.spec)->segment_list);
+ (yyval.spec)->flags &= ~HAS_SEGMENT;
+ (yyval.spec)->segment_pos.x = (yyval.spec)->segment_pos.y = 0.0;
+ (yyval.spec)->segment_is_absolute = 0;
+ }
+#line 3297 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 108: /* object_spec: object_spec SOLID */
+#line 909 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec); // nothing
+ }
+#line 3305 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 109: /* object_spec: object_spec DOTTED */
+#line 913 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ (yyval.spec)->flags |= IS_DOTTED;
+ lookup_variable("dashwid", & (yyval.spec)->dash_width);
+ }
+#line 3315 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 110: /* object_spec: object_spec DOTTED expr */
+#line 919 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->flags |= IS_DOTTED;
+ (yyval.spec)->dash_width = (yyvsp[0].x);
+ }
+#line 3325 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 111: /* object_spec: object_spec DASHED */
+#line 925 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ (yyval.spec)->flags |= IS_DASHED;
+ lookup_variable("dashwid", & (yyval.spec)->dash_width);
+ }
+#line 3335 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 112: /* object_spec: object_spec DASHED expr */
+#line 931 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->flags |= IS_DASHED;
+ (yyval.spec)->dash_width = (yyvsp[0].x);
+ }
+#line 3345 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 113: /* object_spec: object_spec FILL */
+#line 937 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ (yyval.spec)->flags |= IS_DEFAULT_FILLED;
+ }
+#line 3354 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 114: /* object_spec: object_spec FILL expr */
+#line 942 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->flags |= IS_FILLED;
+ (yyval.spec)->fill = (yyvsp[0].x);
+ }
+#line 3364 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 115: /* object_spec: object_spec XSLANTED expr */
+#line 948 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->flags |= IS_XSLANTED;
+ (yyval.spec)->xslanted = (yyvsp[0].x);
+ }
+#line 3374 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 116: /* object_spec: object_spec YSLANTED expr */
+#line 954 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->flags |= IS_YSLANTED;
+ (yyval.spec)->yslanted = (yyvsp[0].x);
+ }
+#line 3384 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 117: /* object_spec: object_spec SHADED text */
+#line 960 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->flags |= (IS_SHADED | IS_FILLED);
+ (yyval.spec)->shaded = new char[strlen((yyvsp[0].lstr).str)+1];
+ strcpy((yyval.spec)->shaded, (yyvsp[0].lstr).str);
+ }
+#line 3395 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 118: /* object_spec: object_spec COLORED text */
+#line 967 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->flags |= (IS_SHADED | IS_OUTLINED | IS_FILLED);
+ (yyval.spec)->shaded = new char[strlen((yyvsp[0].lstr).str)+1];
+ strcpy((yyval.spec)->shaded, (yyvsp[0].lstr).str);
+ (yyval.spec)->outlined = new char[strlen((yyvsp[0].lstr).str)+1];
+ strcpy((yyval.spec)->outlined, (yyvsp[0].lstr).str);
+ }
+#line 3408 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 119: /* object_spec: object_spec OUTLINED text */
+#line 976 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->flags |= IS_OUTLINED;
+ (yyval.spec)->outlined = new char[strlen((yyvsp[0].lstr).str)+1];
+ strcpy((yyval.spec)->outlined, (yyvsp[0].lstr).str);
+ }
+#line 3419 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 120: /* object_spec: object_spec CHOP */
+#line 983 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ // line chop chop means line chop 0 chop 0
+ if ((yyval.spec)->flags & IS_DEFAULT_CHOPPED) {
+ (yyval.spec)->flags |= IS_CHOPPED;
+ (yyval.spec)->flags &= ~IS_DEFAULT_CHOPPED;
+ (yyval.spec)->start_chop = (yyval.spec)->end_chop = 0.0;
+ }
+ else if ((yyval.spec)->flags & IS_CHOPPED) {
+ (yyval.spec)->end_chop = 0.0;
+ }
+ else {
+ (yyval.spec)->flags |= IS_DEFAULT_CHOPPED;
+ }
+ }
+#line 3439 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 121: /* object_spec: object_spec CHOP expr */
+#line 999 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ if ((yyval.spec)->flags & IS_DEFAULT_CHOPPED) {
+ (yyval.spec)->flags |= IS_CHOPPED;
+ (yyval.spec)->flags &= ~IS_DEFAULT_CHOPPED;
+ (yyval.spec)->start_chop = 0.0;
+ (yyval.spec)->end_chop = (yyvsp[0].x);
+ }
+ else if ((yyval.spec)->flags & IS_CHOPPED) {
+ (yyval.spec)->end_chop = (yyvsp[0].x);
+ }
+ else {
+ (yyval.spec)->start_chop = (yyval.spec)->end_chop = (yyvsp[0].x);
+ (yyval.spec)->flags |= IS_CHOPPED;
+ }
+ }
+#line 3460 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 122: /* object_spec: object_spec SAME */
+#line 1016 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ (yyval.spec)->flags |= IS_SAME;
+ }
+#line 3469 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 123: /* object_spec: object_spec INVISIBLE */
+#line 1021 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ (yyval.spec)->flags |= IS_INVISIBLE;
+ }
+#line 3478 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 124: /* object_spec: object_spec LEFT_ARROW_HEAD */
+#line 1026 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ (yyval.spec)->flags |= HAS_LEFT_ARROW_HEAD;
+ }
+#line 3487 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 125: /* object_spec: object_spec RIGHT_ARROW_HEAD */
+#line 1031 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ (yyval.spec)->flags |= HAS_RIGHT_ARROW_HEAD;
+ }
+#line 3496 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 126: /* object_spec: object_spec DOUBLE_ARROW_HEAD */
+#line 1036 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ (yyval.spec)->flags |= (HAS_LEFT_ARROW_HEAD|HAS_RIGHT_ARROW_HEAD);
+ }
+#line 3505 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 127: /* object_spec: object_spec CW */
+#line 1041 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ (yyval.spec)->flags |= IS_CLOCKWISE;
+ }
+#line 3514 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 128: /* object_spec: object_spec CCW */
+#line 1046 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ (yyval.spec)->flags &= ~IS_CLOCKWISE;
+ }
+#line 3523 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 129: /* object_spec: object_spec text */
+#line 1051 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ text_item **p;
+ for (p = & (yyval.spec)->text; *p; p = &(*p)->next)
+ ;
+ *p = new text_item((yyvsp[0].lstr).str, (yyvsp[0].lstr).filename, (yyvsp[0].lstr).lineno);
+ }
+#line 3535 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 130: /* object_spec: object_spec LJUST */
+#line 1059 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ if ((yyval.spec)->text) {
+ text_item *p;
+ for (p = (yyval.spec)->text; p->next; p = p->next)
+ ;
+ p->adj.h = LEFT_ADJUST;
+ }
+ }
+#line 3549 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 131: /* object_spec: object_spec RJUST */
+#line 1069 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ if ((yyval.spec)->text) {
+ text_item *p;
+ for (p = (yyval.spec)->text; p->next; p = p->next)
+ ;
+ p->adj.h = RIGHT_ADJUST;
+ }
+ }
+#line 3563 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 132: /* object_spec: object_spec ABOVE */
+#line 1079 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ if ((yyval.spec)->text) {
+ text_item *p;
+ for (p = (yyval.spec)->text; p->next; p = p->next)
+ ;
+ p->adj.v = ABOVE_ADJUST;
+ }
+ }
+#line 3577 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 133: /* object_spec: object_spec BELOW */
+#line 1089 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ if ((yyval.spec)->text) {
+ text_item *p;
+ for (p = (yyval.spec)->text; p->next; p = p->next)
+ ;
+ p->adj.v = BELOW_ADJUST;
+ }
+ }
+#line 3591 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 134: /* object_spec: object_spec THICKNESS expr */
+#line 1099 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-2].spec);
+ (yyval.spec)->flags |= HAS_THICKNESS;
+ (yyval.spec)->thickness = (yyvsp[0].x);
+ }
+#line 3601 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 135: /* object_spec: object_spec ALIGNED */
+#line 1105 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.spec) = (yyvsp[-1].spec);
+ (yyval.spec)->flags |= IS_ALIGNED;
+ }
+#line 3610 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 136: /* text: TEXT */
+#line 1113 "../src/preproc/pic/pic.ypp"
+ { (yyval.lstr) = (yyvsp[0].lstr); }
+#line 3616 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 137: /* text: SPRINTF '(' TEXT sprintf_args ')' */
+#line 1115 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.lstr).filename = (yyvsp[-2].lstr).filename;
+ (yyval.lstr).lineno = (yyvsp[-2].lstr).lineno;
+ (yyval.lstr).str = do_sprintf((yyvsp[-2].lstr).str, (yyvsp[-1].dv).v, (yyvsp[-1].dv).nv);
+ delete[] (yyvsp[-1].dv).v;
+ free((yyvsp[-2].lstr).str);
+ }
+#line 3628 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 138: /* sprintf_args: %empty */
+#line 1126 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.dv).v = 0;
+ (yyval.dv).nv = 0;
+ (yyval.dv).maxv = 0;
+ }
+#line 3638 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 139: /* sprintf_args: sprintf_args ',' expr */
+#line 1132 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.dv) = (yyvsp[-2].dv);
+ if ((yyval.dv).nv >= (yyval.dv).maxv) {
+ if ((yyval.dv).nv == 0) {
+ (yyval.dv).v = new double[4];
+ (yyval.dv).maxv = 4;
+ }
+ else {
+ double *oldv = (yyval.dv).v;
+ (yyval.dv).maxv *= 2;
+#if 0
+ (yyval.dv).v = new double[(yyval.dv).maxv];
+ memcpy((yyval.dv).v, oldv, (yyval.dv).nv*sizeof(double));
+#else
+ // workaround for bug in Compaq C++ V6.5-033
+ // for Compaq Tru64 UNIX V5.1A (Rev. 1885)
+ double *foo = new double[(yyval.dv).maxv];
+ memcpy(foo, oldv, (yyval.dv).nv*sizeof(double));
+ (yyval.dv).v = foo;
+#endif
+ delete[] oldv;
+ }
+ }
+ (yyval.dv).v[(yyval.dv).nv] = (yyvsp[0].x);
+ (yyval.dv).nv += 1;
+ }
+#line 3669 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 140: /* position: position_not_place */
+#line 1162 "../src/preproc/pic/pic.ypp"
+ { (yyval.pair) = (yyvsp[0].pair); }
+#line 3675 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 141: /* position: place */
+#line 1164 "../src/preproc/pic/pic.ypp"
+ {
+ position pos = (yyvsp[0].pl);
+ (yyval.pair).x = pos.x;
+ (yyval.pair).y = pos.y;
+ }
+#line 3685 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 142: /* position: '(' place ')' */
+#line 1170 "../src/preproc/pic/pic.ypp"
+ {
+ position pos = (yyvsp[-1].pl);
+ (yyval.pair).x = pos.x;
+ (yyval.pair).y = pos.y;
+ }
+#line 3695 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 143: /* position_not_place: expr_pair */
+#line 1179 "../src/preproc/pic/pic.ypp"
+ { (yyval.pair) = (yyvsp[0].pair); }
+#line 3701 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 144: /* position_not_place: position '+' expr_pair */
+#line 1181 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.pair).x = (yyvsp[-2].pair).x + (yyvsp[0].pair).x;
+ (yyval.pair).y = (yyvsp[-2].pair).y + (yyvsp[0].pair).y;
+ }
+#line 3710 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 145: /* position_not_place: '(' position '+' expr_pair ')' */
+#line 1186 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.pair).x = (yyvsp[-3].pair).x + (yyvsp[-1].pair).x;
+ (yyval.pair).y = (yyvsp[-3].pair).y + (yyvsp[-1].pair).y;
+ }
+#line 3719 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 146: /* position_not_place: position '-' expr_pair */
+#line 1191 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.pair).x = (yyvsp[-2].pair).x - (yyvsp[0].pair).x;
+ (yyval.pair).y = (yyvsp[-2].pair).y - (yyvsp[0].pair).y;
+ }
+#line 3728 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 147: /* position_not_place: '(' position '-' expr_pair ')' */
+#line 1196 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.pair).x = (yyvsp[-3].pair).x - (yyvsp[-1].pair).x;
+ (yyval.pair).y = (yyvsp[-3].pair).y - (yyvsp[-1].pair).y;
+ }
+#line 3737 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 148: /* position_not_place: '(' position ',' position ')' */
+#line 1201 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.pair).x = (yyvsp[-3].pair).x;
+ (yyval.pair).y = (yyvsp[-1].pair).y;
+ }
+#line 3746 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 149: /* position_not_place: expr between position AND position */
+#line 1206 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.pair).x = (1.0 - (yyvsp[-4].x))*(yyvsp[-2].pair).x + (yyvsp[-4].x)*(yyvsp[0].pair).x;
+ (yyval.pair).y = (1.0 - (yyvsp[-4].x))*(yyvsp[-2].pair).y + (yyvsp[-4].x)*(yyvsp[0].pair).y;
+ }
+#line 3755 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 150: /* position_not_place: '(' expr between position AND position ')' */
+#line 1211 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.pair).x = (1.0 - (yyvsp[-5].x))*(yyvsp[-3].pair).x + (yyvsp[-5].x)*(yyvsp[-1].pair).x;
+ (yyval.pair).y = (1.0 - (yyvsp[-5].x))*(yyvsp[-3].pair).y + (yyvsp[-5].x)*(yyvsp[-1].pair).y;
+ }
+#line 3764 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 151: /* position_not_place: expr_not_lower_than '<' position ',' position '>' */
+#line 1217 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.pair).x = (1.0 - (yyvsp[-5].x))*(yyvsp[-3].pair).x + (yyvsp[-5].x)*(yyvsp[-1].pair).x;
+ (yyval.pair).y = (1.0 - (yyvsp[-5].x))*(yyvsp[-3].pair).y + (yyvsp[-5].x)*(yyvsp[-1].pair).y;
+ }
+#line 3773 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 152: /* position_not_place: '(' expr_not_lower_than '<' position ',' position '>' ')' */
+#line 1222 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.pair).x = (1.0 - (yyvsp[-6].x))*(yyvsp[-4].pair).x + (yyvsp[-6].x)*(yyvsp[-2].pair).x;
+ (yyval.pair).y = (1.0 - (yyvsp[-6].x))*(yyvsp[-4].pair).y + (yyvsp[-6].x)*(yyvsp[-2].pair).y;
+ }
+#line 3782 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 155: /* expr_pair: expr ',' expr */
+#line 1235 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.pair).x = (yyvsp[-2].x);
+ (yyval.pair).y = (yyvsp[0].x);
+ }
+#line 3791 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 156: /* expr_pair: '(' expr_pair ')' */
+#line 1240 "../src/preproc/pic/pic.ypp"
+ { (yyval.pair) = (yyvsp[-1].pair); }
+#line 3797 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 157: /* place: label */
+#line 1246 "../src/preproc/pic/pic.ypp"
+ { (yyval.pl) = (yyvsp[0].pl); }
+#line 3803 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 158: /* place: label corner */
+#line 1248 "../src/preproc/pic/pic.ypp"
+ {
+ path pth((yyvsp[0].crn));
+ if (!pth.follow((yyvsp[-1].pl), & (yyval.pl)))
+ YYABORT;
+ }
+#line 3813 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 159: /* place: corner label */
+#line 1254 "../src/preproc/pic/pic.ypp"
+ {
+ path pth((yyvsp[-1].crn));
+ if (!pth.follow((yyvsp[0].pl), & (yyval.pl)))
+ YYABORT;
+ }
+#line 3823 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 160: /* place: corner OF label */
+#line 1260 "../src/preproc/pic/pic.ypp"
+ {
+ path pth((yyvsp[-2].crn));
+ if (!pth.follow((yyvsp[0].pl), & (yyval.pl)))
+ YYABORT;
+ }
+#line 3833 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 161: /* place: HERE */
+#line 1266 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.pl).x = current_position.x;
+ (yyval.pl).y = current_position.y;
+ (yyval.pl).obj = 0;
+ }
+#line 3843 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 162: /* label: LABEL */
+#line 1275 "../src/preproc/pic/pic.ypp"
+ {
+ place *p = lookup_label((yyvsp[0].str));
+ if (!p) {
+ lex_error("there is no place '%1'", (yyvsp[0].str));
+ YYABORT;
+ }
+ (yyval.pl) = *p;
+ free((yyvsp[0].str));
+ }
+#line 3857 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 163: /* label: nth_primitive */
+#line 1285 "../src/preproc/pic/pic.ypp"
+ { (yyval.pl).obj = (yyvsp[0].obj); }
+#line 3863 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 164: /* label: label '.' LABEL */
+#line 1287 "../src/preproc/pic/pic.ypp"
+ {
+ path pth((yyvsp[0].str));
+ if (!pth.follow((yyvsp[-2].pl), & (yyval.pl)))
+ YYABORT;
+ }
+#line 3873 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 165: /* ordinal: ORDINAL */
+#line 1296 "../src/preproc/pic/pic.ypp"
+ { (yyval.n) = (yyvsp[0].n); }
+#line 3879 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 166: /* ordinal: '`' any_expr TH */
+#line 1298 "../src/preproc/pic/pic.ypp"
+ {
+ // XXX Check for overflow (and non-integers?).
+ (yyval.n) = (int)(yyvsp[-1].x);
+ }
+#line 3888 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 167: /* optional_ordinal_last: LAST */
+#line 1306 "../src/preproc/pic/pic.ypp"
+ { (yyval.n) = 1; }
+#line 3894 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 168: /* optional_ordinal_last: ordinal LAST */
+#line 1308 "../src/preproc/pic/pic.ypp"
+ { (yyval.n) = (yyvsp[-1].n); }
+#line 3900 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 169: /* nth_primitive: ordinal object_type */
+#line 1313 "../src/preproc/pic/pic.ypp"
+ {
+ int count = 0;
+ object *p;
+ for (p = olist.head; p != 0; p = p->next)
+ if (p->type() == (yyvsp[0].obtype) && ++count == (yyvsp[-1].n)) {
+ (yyval.obj) = p;
+ break;
+ }
+ if (p == 0) {
+ lex_error("there is no %1%2 %3", (yyvsp[-1].n), ordinal_postfix((yyvsp[-1].n)),
+ object_type_name((yyvsp[0].obtype)));
+ YYABORT;
+ }
+ }
+#line 3919 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 170: /* nth_primitive: optional_ordinal_last object_type */
+#line 1328 "../src/preproc/pic/pic.ypp"
+ {
+ int count = 0;
+ object *p;
+ for (p = olist.tail; p != 0; p = p->prev)
+ if (p->type() == (yyvsp[0].obtype) && ++count == (yyvsp[-1].n)) {
+ (yyval.obj) = p;
+ break;
+ }
+ if (p == 0) {
+ lex_error("there is no %1%2 last %3", (yyvsp[-1].n),
+ ordinal_postfix((yyvsp[-1].n)), object_type_name((yyvsp[0].obtype)));
+ YYABORT;
+ }
+ }
+#line 3938 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 171: /* object_type: BOX */
+#line 1346 "../src/preproc/pic/pic.ypp"
+ { (yyval.obtype) = BOX_OBJECT; }
+#line 3944 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 172: /* object_type: CIRCLE */
+#line 1348 "../src/preproc/pic/pic.ypp"
+ { (yyval.obtype) = CIRCLE_OBJECT; }
+#line 3950 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 173: /* object_type: ELLIPSE */
+#line 1350 "../src/preproc/pic/pic.ypp"
+ { (yyval.obtype) = ELLIPSE_OBJECT; }
+#line 3956 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 174: /* object_type: ARC */
+#line 1352 "../src/preproc/pic/pic.ypp"
+ { (yyval.obtype) = ARC_OBJECT; }
+#line 3962 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 175: /* object_type: LINE */
+#line 1354 "../src/preproc/pic/pic.ypp"
+ { (yyval.obtype) = LINE_OBJECT; }
+#line 3968 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 176: /* object_type: ARROW */
+#line 1356 "../src/preproc/pic/pic.ypp"
+ { (yyval.obtype) = ARROW_OBJECT; }
+#line 3974 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 177: /* object_type: SPLINE */
+#line 1358 "../src/preproc/pic/pic.ypp"
+ { (yyval.obtype) = SPLINE_OBJECT; }
+#line 3980 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 178: /* object_type: '[' ']' */
+#line 1360 "../src/preproc/pic/pic.ypp"
+ { (yyval.obtype) = BLOCK_OBJECT; }
+#line 3986 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 179: /* object_type: TEXT */
+#line 1362 "../src/preproc/pic/pic.ypp"
+ { (yyval.obtype) = TEXT_OBJECT; }
+#line 3992 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 180: /* label_path: '.' LABEL */
+#line 1367 "../src/preproc/pic/pic.ypp"
+ { (yyval.pth) = new path((yyvsp[0].str)); }
+#line 3998 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 181: /* label_path: label_path '.' LABEL */
+#line 1369 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.pth) = (yyvsp[-2].pth);
+ (yyval.pth)->append((yyvsp[0].str));
+ }
+#line 4007 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 182: /* relative_path: corner */
+#line 1377 "../src/preproc/pic/pic.ypp"
+ { (yyval.pth) = new path((yyvsp[0].crn)); }
+#line 4013 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 183: /* relative_path: label_path */
+#line 1381 "../src/preproc/pic/pic.ypp"
+ { (yyval.pth) = (yyvsp[0].pth); }
+#line 4019 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 184: /* relative_path: label_path corner */
+#line 1383 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.pth) = (yyvsp[-1].pth);
+ (yyval.pth)->append((yyvsp[0].crn));
+ }
+#line 4028 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 185: /* path: relative_path */
+#line 1391 "../src/preproc/pic/pic.ypp"
+ { (yyval.pth) = (yyvsp[0].pth); }
+#line 4034 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 186: /* path: '(' relative_path ',' relative_path ')' */
+#line 1393 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.pth) = (yyvsp[-3].pth);
+ (yyval.pth)->set_ypath((yyvsp[-1].pth));
+ }
+#line 4043 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 187: /* path: ORDINAL LAST object_type relative_path */
+#line 1399 "../src/preproc/pic/pic.ypp"
+ {
+ lex_warning("'%1%2 last %3' in 'with' argument ignored",
+ (yyvsp[-3].n), ordinal_postfix((yyvsp[-3].n)), object_type_name((yyvsp[-1].obtype)));
+ (yyval.pth) = (yyvsp[0].pth);
+ }
+#line 4053 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 188: /* path: LAST object_type relative_path */
+#line 1405 "../src/preproc/pic/pic.ypp"
+ {
+ lex_warning("'last %1' in 'with' argument ignored",
+ object_type_name((yyvsp[-1].obtype)));
+ (yyval.pth) = (yyvsp[0].pth);
+ }
+#line 4063 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 189: /* path: ORDINAL object_type relative_path */
+#line 1411 "../src/preproc/pic/pic.ypp"
+ {
+ lex_warning("'%1%2 %3' in 'with' argument ignored",
+ (yyvsp[-2].n), ordinal_postfix((yyvsp[-2].n)), object_type_name((yyvsp[-1].obtype)));
+ (yyval.pth) = (yyvsp[0].pth);
+ }
+#line 4073 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 190: /* path: LABEL relative_path */
+#line 1417 "../src/preproc/pic/pic.ypp"
+ {
+ lex_warning("initial '%1' in 'with' argument ignored", (yyvsp[-1].str));
+ delete[] (yyvsp[-1].str);
+ (yyval.pth) = (yyvsp[0].pth);
+ }
+#line 4083 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 191: /* corner: DOT_N */
+#line 1426 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::north; }
+#line 4089 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 192: /* corner: DOT_E */
+#line 1428 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::east; }
+#line 4095 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 193: /* corner: DOT_W */
+#line 1430 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::west; }
+#line 4101 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 194: /* corner: DOT_S */
+#line 1432 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::south; }
+#line 4107 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 195: /* corner: DOT_NE */
+#line 1434 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::north_east; }
+#line 4113 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 196: /* corner: DOT_SE */
+#line 1436 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object:: south_east; }
+#line 4119 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 197: /* corner: DOT_NW */
+#line 1438 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::north_west; }
+#line 4125 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 198: /* corner: DOT_SW */
+#line 1440 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::south_west; }
+#line 4131 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 199: /* corner: DOT_C */
+#line 1442 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::center; }
+#line 4137 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 200: /* corner: DOT_START */
+#line 1444 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::start; }
+#line 4143 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 201: /* corner: DOT_END */
+#line 1446 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::end; }
+#line 4149 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 202: /* corner: TOP */
+#line 1448 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::north; }
+#line 4155 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 203: /* corner: BOTTOM */
+#line 1450 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::south; }
+#line 4161 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 204: /* corner: LEFT */
+#line 1452 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::west; }
+#line 4167 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 205: /* corner: RIGHT */
+#line 1454 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::east; }
+#line 4173 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 206: /* corner: UPPER LEFT */
+#line 1456 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::north_west; }
+#line 4179 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 207: /* corner: LOWER LEFT */
+#line 1458 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::south_west; }
+#line 4185 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 208: /* corner: UPPER RIGHT */
+#line 1460 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::north_east; }
+#line 4191 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 209: /* corner: LOWER RIGHT */
+#line 1462 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::south_east; }
+#line 4197 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 210: /* corner: LEFT_CORNER */
+#line 1464 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::west; }
+#line 4203 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 211: /* corner: RIGHT_CORNER */
+#line 1466 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::east; }
+#line 4209 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 212: /* corner: UPPER LEFT_CORNER */
+#line 1468 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::north_west; }
+#line 4215 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 213: /* corner: LOWER LEFT_CORNER */
+#line 1470 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::south_west; }
+#line 4221 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 214: /* corner: UPPER RIGHT_CORNER */
+#line 1472 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::north_east; }
+#line 4227 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 215: /* corner: LOWER RIGHT_CORNER */
+#line 1474 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::south_east; }
+#line 4233 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 216: /* corner: NORTH */
+#line 1476 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::north; }
+#line 4239 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 217: /* corner: SOUTH */
+#line 1478 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::south; }
+#line 4245 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 218: /* corner: EAST */
+#line 1480 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::east; }
+#line 4251 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 219: /* corner: WEST */
+#line 1482 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::west; }
+#line 4257 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 220: /* corner: CENTER */
+#line 1484 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::center; }
+#line 4263 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 221: /* corner: START */
+#line 1486 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::start; }
+#line 4269 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 222: /* corner: END */
+#line 1488 "../src/preproc/pic/pic.ypp"
+ { (yyval.crn) = &object::end; }
+#line 4275 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 223: /* expr: expr_lower_than */
+#line 1493 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = (yyvsp[0].x); }
+#line 4281 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 224: /* expr: expr_not_lower_than */
+#line 1495 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = (yyvsp[0].x); }
+#line 4287 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 225: /* expr_lower_than: expr '<' expr */
+#line 1500 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = ((yyvsp[-2].x) < (yyvsp[0].x)); }
+#line 4293 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 226: /* expr_not_lower_than: VARIABLE */
+#line 1505 "../src/preproc/pic/pic.ypp"
+ {
+ if (!lookup_variable((yyvsp[0].str), & (yyval.x))) {
+ lex_error("there is no variable '%1'", (yyvsp[0].str));
+ YYABORT;
+ }
+ free((yyvsp[0].str));
+ }
+#line 4305 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 227: /* expr_not_lower_than: NUMBER */
+#line 1513 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = (yyvsp[0].x); }
+#line 4311 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 228: /* expr_not_lower_than: place DOT_X */
+#line 1515 "../src/preproc/pic/pic.ypp"
+ {
+ if ((yyvsp[-1].pl).obj != 0)
+ (yyval.x) = (yyvsp[-1].pl).obj->origin().x;
+ else
+ (yyval.x) = (yyvsp[-1].pl).x;
+ }
+#line 4322 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 229: /* expr_not_lower_than: place DOT_Y */
+#line 1522 "../src/preproc/pic/pic.ypp"
+ {
+ if ((yyvsp[-1].pl).obj != 0)
+ (yyval.x) = (yyvsp[-1].pl).obj->origin().y;
+ else
+ (yyval.x) = (yyvsp[-1].pl).y;
+ }
+#line 4333 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 230: /* expr_not_lower_than: place DOT_HT */
+#line 1529 "../src/preproc/pic/pic.ypp"
+ {
+ if ((yyvsp[-1].pl).obj != 0)
+ (yyval.x) = (yyvsp[-1].pl).obj->height();
+ else
+ (yyval.x) = 0.0;
+ }
+#line 4344 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 231: /* expr_not_lower_than: place DOT_WID */
+#line 1536 "../src/preproc/pic/pic.ypp"
+ {
+ if ((yyvsp[-1].pl).obj != 0)
+ (yyval.x) = (yyvsp[-1].pl).obj->width();
+ else
+ (yyval.x) = 0.0;
+ }
+#line 4355 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 232: /* expr_not_lower_than: place DOT_RAD */
+#line 1543 "../src/preproc/pic/pic.ypp"
+ {
+ if ((yyvsp[-1].pl).obj != 0)
+ (yyval.x) = (yyvsp[-1].pl).obj->radius();
+ else
+ (yyval.x) = 0.0;
+ }
+#line 4366 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 233: /* expr_not_lower_than: expr '+' expr */
+#line 1550 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = (yyvsp[-2].x) + (yyvsp[0].x); }
+#line 4372 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 234: /* expr_not_lower_than: expr '-' expr */
+#line 1552 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = (yyvsp[-2].x) - (yyvsp[0].x); }
+#line 4378 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 235: /* expr_not_lower_than: expr '*' expr */
+#line 1554 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = (yyvsp[-2].x) * (yyvsp[0].x); }
+#line 4384 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 236: /* expr_not_lower_than: expr '/' expr */
+#line 1556 "../src/preproc/pic/pic.ypp"
+ {
+ if ((yyvsp[0].x) == 0.0) {
+ lex_error("division by zero");
+ YYABORT;
+ }
+ (yyval.x) = (yyvsp[-2].x)/(yyvsp[0].x);
+ }
+#line 4396 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 237: /* expr_not_lower_than: expr '%' expr */
+#line 1564 "../src/preproc/pic/pic.ypp"
+ {
+ if ((yyvsp[0].x) == 0.0) {
+ lex_error("modulus by zero");
+ YYABORT;
+ }
+ (yyval.x) = fmod((yyvsp[-2].x), (yyvsp[0].x));
+ }
+#line 4408 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 238: /* expr_not_lower_than: expr '^' expr */
+#line 1572 "../src/preproc/pic/pic.ypp"
+ {
+ errno = 0;
+ (yyval.x) = pow((yyvsp[-2].x), (yyvsp[0].x));
+ if (errno == EDOM) {
+ lex_error("arguments to '^' operator out of domain");
+ YYABORT;
+ }
+ if (errno == ERANGE) {
+ lex_error("result of '^' operator out of range");
+ YYABORT;
+ }
+ }
+#line 4425 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 239: /* expr_not_lower_than: '-' expr */
+#line 1585 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = -(yyvsp[0].x); }
+#line 4431 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 240: /* expr_not_lower_than: '(' any_expr ')' */
+#line 1587 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = (yyvsp[-1].x); }
+#line 4437 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 241: /* expr_not_lower_than: SIN '(' any_expr ')' */
+#line 1589 "../src/preproc/pic/pic.ypp"
+ {
+ errno = 0;
+ (yyval.x) = sin((yyvsp[-1].x));
+ if (errno == ERANGE) {
+ lex_error("sin result out of range");
+ YYABORT;
+ }
+ }
+#line 4450 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 242: /* expr_not_lower_than: COS '(' any_expr ')' */
+#line 1598 "../src/preproc/pic/pic.ypp"
+ {
+ errno = 0;
+ (yyval.x) = cos((yyvsp[-1].x));
+ if (errno == ERANGE) {
+ lex_error("cos result out of range");
+ YYABORT;
+ }
+ }
+#line 4463 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 243: /* expr_not_lower_than: ATAN2 '(' any_expr ',' any_expr ')' */
+#line 1607 "../src/preproc/pic/pic.ypp"
+ {
+ errno = 0;
+ (yyval.x) = atan2((yyvsp[-3].x), (yyvsp[-1].x));
+ if (errno == EDOM) {
+ lex_error("atan2 argument out of domain");
+ YYABORT;
+ }
+ if (errno == ERANGE) {
+ lex_error("atan2 result out of range");
+ YYABORT;
+ }
+ }
+#line 4480 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 244: /* expr_not_lower_than: LOG '(' any_expr ')' */
+#line 1620 "../src/preproc/pic/pic.ypp"
+ {
+ errno = 0;
+ (yyval.x) = log10((yyvsp[-1].x));
+ if (errno == ERANGE) {
+ lex_error("log result out of range");
+ YYABORT;
+ }
+ }
+#line 4493 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 245: /* expr_not_lower_than: EXP '(' any_expr ')' */
+#line 1629 "../src/preproc/pic/pic.ypp"
+ {
+ errno = 0;
+ (yyval.x) = pow(10.0, (yyvsp[-1].x));
+ if (errno == ERANGE) {
+ lex_error("exp result out of range");
+ YYABORT;
+ }
+ }
+#line 4506 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 246: /* expr_not_lower_than: SQRT '(' any_expr ')' */
+#line 1638 "../src/preproc/pic/pic.ypp"
+ {
+ errno = 0;
+ (yyval.x) = sqrt((yyvsp[-1].x));
+ if (errno == EDOM) {
+ lex_error("sqrt argument out of domain");
+ YYABORT;
+ }
+ }
+#line 4519 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 247: /* expr_not_lower_than: K_MAX '(' any_expr ',' any_expr ')' */
+#line 1647 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = (yyvsp[-3].x) > (yyvsp[-1].x) ? (yyvsp[-3].x) : (yyvsp[-1].x); }
+#line 4525 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 248: /* expr_not_lower_than: K_MIN '(' any_expr ',' any_expr ')' */
+#line 1649 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = (yyvsp[-3].x) < (yyvsp[-1].x) ? (yyvsp[-3].x) : (yyvsp[-1].x); }
+#line 4531 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 249: /* expr_not_lower_than: INT '(' any_expr ')' */
+#line 1651 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = (yyvsp[-1].x) < 0 ? -floor(-(yyvsp[-1].x)) : floor((yyvsp[-1].x)); }
+#line 4537 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 250: /* expr_not_lower_than: RAND '(' any_expr ')' */
+#line 1653 "../src/preproc/pic/pic.ypp"
+ {
+ lex_error("use of 'rand' with an argument is"
+ " deprecated; shift and scale 'rand()' with"
+ " arithmetic instead");
+ (yyval.x) = 1.0 + floor(((rand()&0x7fff)/double(0x7fff))*(yyvsp[-1].x));
+ }
+#line 4548 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 251: /* expr_not_lower_than: RAND '(' ')' */
+#line 1660 "../src/preproc/pic/pic.ypp"
+ {
+ /* return a random number in the range [0,1) */
+ /* portable, but not very random */
+ (yyval.x) = (rand() & 0x7fff) / double(0x8000);
+ }
+#line 4558 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 252: /* expr_not_lower_than: SRAND '(' any_expr ')' */
+#line 1666 "../src/preproc/pic/pic.ypp"
+ {
+ (yyval.x) = 0;
+ srand((unsigned int)(yyvsp[-1].x));
+ }
+#line 4567 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 253: /* expr_not_lower_than: expr LESSEQUAL expr */
+#line 1671 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = ((yyvsp[-2].x) <= (yyvsp[0].x)); }
+#line 4573 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 254: /* expr_not_lower_than: expr '>' expr */
+#line 1673 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = ((yyvsp[-2].x) > (yyvsp[0].x)); }
+#line 4579 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 255: /* expr_not_lower_than: expr GREATEREQUAL expr */
+#line 1675 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = ((yyvsp[-2].x) >= (yyvsp[0].x)); }
+#line 4585 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 256: /* expr_not_lower_than: expr EQUALEQUAL expr */
+#line 1677 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = ((yyvsp[-2].x) == (yyvsp[0].x)); }
+#line 4591 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 257: /* expr_not_lower_than: expr NOTEQUAL expr */
+#line 1679 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = ((yyvsp[-2].x) != (yyvsp[0].x)); }
+#line 4597 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 258: /* expr_not_lower_than: expr ANDAND expr */
+#line 1681 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = ((yyvsp[-2].x) != 0.0 && (yyvsp[0].x) != 0.0); }
+#line 4603 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 259: /* expr_not_lower_than: expr OROR expr */
+#line 1683 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = ((yyvsp[-2].x) != 0.0 || (yyvsp[0].x) != 0.0); }
+#line 4609 "src/preproc/pic/pic.cpp"
+ break;
+
+ case 260: /* expr_not_lower_than: '!' expr */
+#line 1685 "../src/preproc/pic/pic.ypp"
+ { (yyval.x) = ((yyvsp[0].x) == 0.0); }
+#line 4615 "src/preproc/pic/pic.cpp"
+ break;
+
+
+#line 4619 "src/preproc/pic/pic.cpp"
+
+ default: break;
+ }
+ /* User semantic actions sometimes alter yychar, and that requires
+ that yytoken be updated with the new translation. We take the
+ approach of translating immediately before every use of yytoken.
+ One alternative is translating here after every semantic action,
+ but that translation would be missed if the semantic action invokes
+ YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
+ if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an
+ incorrect destructor might then be invoked immediately. In the
+ case of YYERROR or YYBACKUP, subsequent parser actions might lead
+ to an incorrect destructor call or verbose syntax error message
+ before the lookahead is translated. */
+ YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc);
+
+ YYPOPSTACK (yylen);
+ yylen = 0;
+
+ *++yyvsp = yyval;
+
+ /* Now 'shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+ {
+ const int yylhs = yyr1[yyn] - YYNTOKENS;
+ const int yyi = yypgoto[yylhs] + *yyssp;
+ yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp
+ ? yytable[yyi]
+ : yydefgoto[yylhs]);
+ }
+
+ goto yynewstate;
+
+
+/*--------------------------------------.
+| yyerrlab -- here on detecting error. |
+`--------------------------------------*/
+yyerrlab:
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar);
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+ yyerror (YY_("syntax error"));
+ }
+
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ if (yychar <= YYEOF)
+ {
+ /* Return failure if at end of input. */
+ if (yychar == YYEOF)
+ YYABORT;
+ }
+ else
+ {
+ yydestruct ("Error: discarding",
+ yytoken, &yylval);
+ yychar = YYEMPTY;
+ }
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+ goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR. |
+`---------------------------------------------------*/
+yyerrorlab:
+ /* Pacify compilers when the user code never invokes YYERROR and the
+ label yyerrorlab therefore never appears in user code. */
+ if (0)
+ YYERROR;
+ ++yynerrs;
+
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYERROR. */
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+ yystate = *yyssp;
+ goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR. |
+`-------------------------------------------------------------*/
+yyerrlab1:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ /* Pop stack until we find a state that shifts the error token. */
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (!yypact_value_is_default (yyn))
+ {
+ yyn += YYSYMBOL_YYerror;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
+
+
+ yydestruct ("Error: popping",
+ YY_ACCESSING_SYMBOL (yystate), yyvsp);
+ YYPOPSTACK (1);
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+
+ /* Shift the error token. */
+ YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp);
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturnlab;
+
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturnlab;
+
+
+/*-----------------------------------------------------------.
+| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. |
+`-----------------------------------------------------------*/
+yyexhaustedlab:
+ yyerror (YY_("memory exhausted"));
+ yyresult = 2;
+ goto yyreturnlab;
+
+
+/*----------------------------------------------------------.
+| yyreturnlab -- parsing is finished, clean up and return. |
+`----------------------------------------------------------*/
+yyreturnlab:
+ if (yychar != YYEMPTY)
+ {
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = YYTRANSLATE (yychar);
+ yydestruct ("Cleanup: discarding lookahead",
+ yytoken, &yylval);
+ }
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYABORT or YYACCEPT. */
+ YYPOPSTACK (yylen);
+ YY_STACK_PRINT (yyss, yyssp);
+ while (yyssp != yyss)
+ {
+ yydestruct ("Cleanup: popping",
+ YY_ACCESSING_SYMBOL (+*yyssp), yyvsp);
+ YYPOPSTACK (1);
+ }
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+
+ return yyresult;
+}
+
+#line 1689 "../src/preproc/pic/pic.ypp"
+
+
+/* bison defines const to be empty unless __STDC__ is defined, which it
+isn't under cfront */
+
+#ifdef const
+#undef const
+#endif
+
+static struct {
+ const char *name;
+ double val;
+ int scaled; // non-zero if val should be multiplied by scale
+} defaults_table[] = {
+ { "arcrad", .25, 1 },
+ { "arrowht", .1, 1 },
+ { "arrowwid", .05, 1 },
+ { "circlerad", .25, 1 },
+ { "boxht", .5, 1 },
+ { "boxwid", .75, 1 },
+ { "boxrad", 0.0, 1 },
+ { "dashwid", .05, 1 },
+ { "ellipseht", .5, 1 },
+ { "ellipsewid", .75, 1 },
+ { "moveht", .5, 1 },
+ { "movewid", .5, 1 },
+ { "lineht", .5, 1 },
+ { "linewid", .5, 1 },
+ { "textht", 0.0, 1 },
+ { "textwid", 0.0, 1 },
+ { "scale", 1.0, 0 },
+ { "linethick", -1.0, 0 }, // in points
+ { "fillval", .5, 0 },
+ { "arrowhead", 1.0, 0 },
+ { "maxpswid", 8.5, 0 },
+ { "maxpsht", 11.0, 0 },
+};
+
+place *lookup_label(const char *label)
+{
+ saved_state *state = current_saved_state;
+ PTABLE(place) *tbl = current_table;
+ for (;;) {
+ place *pl = tbl->lookup(label);
+ if (pl)
+ return pl;
+ if (!state)
+ return 0;
+ tbl = state->tbl;
+ state = state->prev;
+ }
+}
+
+void define_label(const char *label, const place *pl)
+{
+ place *p = new place[1];
+ *p = *pl;
+ current_table->define(label, p);
+}
+
+int lookup_variable(const char *name, double *val)
+{
+ place *pl = lookup_label(name);
+ if (pl) {
+ *val = pl->x;
+ return 1;
+ }
+ return 0;
+}
+
+void define_variable(const char *name, double val)
+{
+ place *p = new place[1];
+ p->obj = 0;
+ p->x = val;
+ p->y = 0.0;
+ current_table->define(name, p);
+ if (strcmp(name, "scale") == 0) {
+ // When the scale changes, reset all scaled predefined variables to
+ // their default values.
+ for (unsigned int i = 0;
+ i < sizeof(defaults_table)/sizeof(defaults_table[0]); i++)
+ if (defaults_table[i].scaled)
+ define_variable(defaults_table[i].name, val*defaults_table[i].val);
+ }
+}
+
+// called once only (not once per parse)
+
+void parse_init()
+{
+ current_direction = RIGHT_DIRECTION;
+ current_position.x = 0.0;
+ current_position.y = 0.0;
+ // This resets everything to its default value.
+ reset_all();
+}
+
+void reset(const char *nm)
+{
+ for (unsigned int i = 0;
+ i < sizeof(defaults_table)/sizeof(defaults_table[0]); i++)
+ if (strcmp(nm, defaults_table[i].name) == 0) {
+ double val = defaults_table[i].val;
+ if (defaults_table[i].scaled) {
+ double scale;
+ lookup_variable("scale", &scale);
+ val *= scale;
+ }
+ define_variable(defaults_table[i].name, val);
+ return;
+ }
+ lex_error("'%1' is not a predefined variable", nm);
+}
+
+void reset_all()
+{
+ // We only have to explicitly reset the predefined variables that
+ // aren't scaled because 'scale' is not scaled, and changing the
+ // value of 'scale' will reset all the predefined variables that
+ // are scaled.
+ for (unsigned int i = 0;
+ i < sizeof(defaults_table)/sizeof(defaults_table[0]); i++)
+ if (!defaults_table[i].scaled)
+ define_variable(defaults_table[i].name, defaults_table[i].val);
+}
+
+// called after each parse
+
+void parse_cleanup()
+{
+ while (current_saved_state != 0) {
+ delete current_table;
+ current_table = current_saved_state->tbl;
+ saved_state *tem = current_saved_state;
+ current_saved_state = current_saved_state->prev;
+ delete tem;
+ }
+ assert(current_table == &top_table);
+ PTABLE_ITERATOR(place) iter(current_table);
+ const char *key;
+ place *pl;
+ while (iter.next(&key, &pl))
+ if (pl->obj != 0) {
+ position pos = pl->obj->origin();
+ pl->obj = 0;
+ pl->x = pos.x;
+ pl->y = pos.y;
+ }
+ while (olist.head != 0) {
+ object *tem = olist.head;
+ olist.head = olist.head->next;
+ delete tem;
+ }
+ olist.tail = 0;
+ current_direction = RIGHT_DIRECTION;
+ current_position.x = 0.0;
+ current_position.y = 0.0;
+}
+
+const char *ordinal_postfix(int n)
+{
+ if (n < 10 || n > 20)
+ switch (n % 10) {
+ case 1:
+ return "st";
+ case 2:
+ return "nd";
+ case 3:
+ return "rd";
+ }
+ return "th";
+}
+
+const char *object_type_name(object_type type)
+{
+ switch (type) {
+ case BOX_OBJECT:
+ return "box";
+ case CIRCLE_OBJECT:
+ return "circle";
+ case ELLIPSE_OBJECT:
+ return "ellipse";
+ case ARC_OBJECT:
+ return "arc";
+ case SPLINE_OBJECT:
+ return "spline";
+ case LINE_OBJECT:
+ return "line";
+ case ARROW_OBJECT:
+ return "arrow";
+ case MOVE_OBJECT:
+ return "move";
+ case TEXT_OBJECT:
+ return "\"\"";
+ case BLOCK_OBJECT:
+ return "[]";
+ case OTHER_OBJECT:
+ case MARK_OBJECT:
+ default:
+ break;
+ }
+ return "object";
+}
+
+static char sprintf_buf[1024];
+
+char *format_number(const char *fmt, double n)
+{
+ if (0 /* nullptr */ == fmt)
+ fmt = "%g";
+ return do_sprintf(fmt, &n, 1);
+}
+
+char *do_sprintf(const char *fmt, const double *v, int nv)
+{
+ // Define valid conversion specifiers and modifiers.
+ static const char spcs[] = "eEfgG%";
+ static const char mods[] = "#-+ 0123456789.";
+ string result;
+ int i = 0;
+ string one_format;
+ while (*fmt) {
+ if ('%' == *fmt) {
+ one_format += *fmt++;
+ for (; *fmt != '\0' && strchr(mods, *fmt) != 0; fmt++)
+ one_format += *fmt;
+ if ('\0' == *fmt || strchr(spcs, *fmt) == 0) {
+ lex_error("invalid sprintf conversion specifier '%1'", *fmt);
+ result += one_format;
+ result += fmt;
+ break;
+ }
+ if ('%' == *fmt) {
+ fmt++;
+ snprintf(sprintf_buf, sizeof(sprintf_buf), "%%");
+ }
+ else {
+ if (i >= nv) {
+ lex_error("too few arguments to sprintf");
+ result += one_format;
+ result += fmt;
+ break;
+ }
+ one_format += *fmt++;
+ one_format += '\0';
+// We validated the format string above. Most conversion specifiers are
+// rejected, including `n`.
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+ snprintf(sprintf_buf, sizeof(sprintf_buf),
+ one_format.contents(), v[i++]);
+#pragma GCC diagnostic pop
+ }
+ one_format.clear();
+ result += sprintf_buf;
+ }
+ else
+ result += *fmt++;
+ }
+ result += '\0';
+ return strsave(result.contents());
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/pic/pic.h b/src/preproc/pic/pic.h
new file mode 100644
index 0000000..1a99498
--- /dev/null
+++ b/src/preproc/pic/pic.h
@@ -0,0 +1,122 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <math.h>
+#include <stdlib.h>
+
+#ifdef NEED_DECLARATION_RAND
+#undef rand
+extern "C" {
+ int rand();
+}
+#endif /* NEED_DECLARATION_RAND */
+
+#ifdef NEED_DECLARATION_SRAND
+#undef srand
+extern "C" {
+#ifdef RET_TYPE_SRAND_IS_VOID
+ void srand(unsigned int);
+#else
+ int srand(unsigned int);
+#endif
+}
+#endif /* NEED_DECLARATION_SRAND */
+
+#ifndef HAVE_FMOD
+extern "C" {
+ double fmod(double, double);
+}
+#endif
+
+#include "cset.h"
+#include "stringclass.h"
+#include "lf.h"
+#include "errarg.h"
+#include "error.h"
+#include "position.h"
+#include "text.h"
+#include "output.h"
+
+#ifndef M_SQRT2
+#define M_SQRT2 1.41421356237309504880
+#endif
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+class input {
+ input *next;
+public:
+ input();
+ virtual ~input();
+ virtual int get() = 0;
+ virtual int peek() = 0;
+ virtual int get_location(const char **, int *);
+ friend class input_stack;
+ friend class copy_rest_thru_input;
+};
+
+class file_input : public input {
+ FILE *fp;
+ const char *filename;
+ int lineno;
+ string line;
+ const char *ptr;
+ int read_line();
+public:
+ file_input(FILE *, const char *);
+ ~file_input();
+ int get();
+ int peek();
+ int get_location(const char **, int *);
+};
+
+void lex_init(input *);
+int get_location(char **, int *);
+
+void do_copy(const char *file);
+void parse_init();
+void parse_cleanup();
+
+void lex_error(const char *message,
+ const errarg &arg1 = empty_errarg,
+ const errarg &arg2 = empty_errarg,
+ const errarg &arg3 = empty_errarg);
+
+void lex_warning(const char *message,
+ const errarg &arg1 = empty_errarg,
+ const errarg &arg2 = empty_errarg,
+ const errarg &arg3 = empty_errarg);
+
+void lex_cleanup();
+
+extern bool want_flyback;
+extern bool want_alternate_flyback;
+extern int command_char;
+// zero_length_line_flag is non-zero if zero-length lines are drawn
+// as dots by the output device
+extern int zero_length_line_flag;
+extern int driver_extension_flag;
+extern int compatible_flag;
+extern int safer_flag;
+extern char *graphname;
diff --git a/src/preproc/pic/pic.hpp b/src/preproc/pic/pic.hpp
new file mode 100644
index 0000000..c162496
--- /dev/null
+++ b/src/preproc/pic/pic.hpp
@@ -0,0 +1,348 @@
+/* A Bison parser, made by GNU Bison 3.8.2. */
+
+/* Bison interface for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 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, see <https://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+ especially those whose name start with YY_ or yy_. They are
+ private implementation details that can be changed or removed. */
+
+#ifndef YY_YY_SRC_PREPROC_PIC_PIC_HPP_INCLUDED
+# define YY_YY_SRC_PREPROC_PIC_PIC_HPP_INCLUDED
+/* Debug traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int yydebug;
+#endif
+
+/* Token kinds. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ enum yytokentype
+ {
+ YYEMPTY = -2,
+ YYEOF = 0, /* "end of file" */
+ YYerror = 256, /* error */
+ YYUNDEF = 257, /* "invalid token" */
+ LABEL = 258, /* LABEL */
+ VARIABLE = 259, /* VARIABLE */
+ NUMBER = 260, /* NUMBER */
+ TEXT = 261, /* TEXT */
+ COMMAND_LINE = 262, /* COMMAND_LINE */
+ DELIMITED = 263, /* DELIMITED */
+ ORDINAL = 264, /* ORDINAL */
+ TH = 265, /* TH */
+ LEFT_ARROW_HEAD = 266, /* LEFT_ARROW_HEAD */
+ RIGHT_ARROW_HEAD = 267, /* RIGHT_ARROW_HEAD */
+ DOUBLE_ARROW_HEAD = 268, /* DOUBLE_ARROW_HEAD */
+ LAST = 269, /* LAST */
+ BOX = 270, /* BOX */
+ CIRCLE = 271, /* CIRCLE */
+ ELLIPSE = 272, /* ELLIPSE */
+ ARC = 273, /* ARC */
+ LINE = 274, /* LINE */
+ ARROW = 275, /* ARROW */
+ MOVE = 276, /* MOVE */
+ SPLINE = 277, /* SPLINE */
+ HEIGHT = 278, /* HEIGHT */
+ RADIUS = 279, /* RADIUS */
+ FIGNAME = 280, /* FIGNAME */
+ WIDTH = 281, /* WIDTH */
+ DIAMETER = 282, /* DIAMETER */
+ UP = 283, /* UP */
+ DOWN = 284, /* DOWN */
+ RIGHT = 285, /* RIGHT */
+ LEFT = 286, /* LEFT */
+ FROM = 287, /* FROM */
+ TO = 288, /* TO */
+ AT = 289, /* AT */
+ WITH = 290, /* WITH */
+ BY = 291, /* BY */
+ THEN = 292, /* THEN */
+ SOLID = 293, /* SOLID */
+ DOTTED = 294, /* DOTTED */
+ DASHED = 295, /* DASHED */
+ CHOP = 296, /* CHOP */
+ SAME = 297, /* SAME */
+ INVISIBLE = 298, /* INVISIBLE */
+ LJUST = 299, /* LJUST */
+ RJUST = 300, /* RJUST */
+ ABOVE = 301, /* ABOVE */
+ BELOW = 302, /* BELOW */
+ OF = 303, /* OF */
+ THE = 304, /* THE */
+ WAY = 305, /* WAY */
+ BETWEEN = 306, /* BETWEEN */
+ AND = 307, /* AND */
+ HERE = 308, /* HERE */
+ DOT_N = 309, /* DOT_N */
+ DOT_E = 310, /* DOT_E */
+ DOT_W = 311, /* DOT_W */
+ DOT_S = 312, /* DOT_S */
+ DOT_NE = 313, /* DOT_NE */
+ DOT_SE = 314, /* DOT_SE */
+ DOT_NW = 315, /* DOT_NW */
+ DOT_SW = 316, /* DOT_SW */
+ DOT_C = 317, /* DOT_C */
+ DOT_START = 318, /* DOT_START */
+ DOT_END = 319, /* DOT_END */
+ DOT_X = 320, /* DOT_X */
+ DOT_Y = 321, /* DOT_Y */
+ DOT_HT = 322, /* DOT_HT */
+ DOT_WID = 323, /* DOT_WID */
+ DOT_RAD = 324, /* DOT_RAD */
+ SIN = 325, /* SIN */
+ COS = 326, /* COS */
+ ATAN2 = 327, /* ATAN2 */
+ LOG = 328, /* LOG */
+ EXP = 329, /* EXP */
+ SQRT = 330, /* SQRT */
+ K_MAX = 331, /* K_MAX */
+ K_MIN = 332, /* K_MIN */
+ INT = 333, /* INT */
+ RAND = 334, /* RAND */
+ SRAND = 335, /* SRAND */
+ COPY = 336, /* COPY */
+ THRU = 337, /* THRU */
+ TOP = 338, /* TOP */
+ BOTTOM = 339, /* BOTTOM */
+ UPPER = 340, /* UPPER */
+ LOWER = 341, /* LOWER */
+ SH = 342, /* SH */
+ PRINT = 343, /* PRINT */
+ CW = 344, /* CW */
+ CCW = 345, /* CCW */
+ FOR = 346, /* FOR */
+ DO = 347, /* DO */
+ IF = 348, /* IF */
+ ELSE = 349, /* ELSE */
+ ANDAND = 350, /* ANDAND */
+ OROR = 351, /* OROR */
+ NOTEQUAL = 352, /* NOTEQUAL */
+ EQUALEQUAL = 353, /* EQUALEQUAL */
+ LESSEQUAL = 354, /* LESSEQUAL */
+ GREATEREQUAL = 355, /* GREATEREQUAL */
+ LEFT_CORNER = 356, /* LEFT_CORNER */
+ RIGHT_CORNER = 357, /* RIGHT_CORNER */
+ NORTH = 358, /* NORTH */
+ SOUTH = 359, /* SOUTH */
+ EAST = 360, /* EAST */
+ WEST = 361, /* WEST */
+ CENTER = 362, /* CENTER */
+ END = 363, /* END */
+ START = 364, /* START */
+ RESET = 365, /* RESET */
+ UNTIL = 366, /* UNTIL */
+ PLOT = 367, /* PLOT */
+ THICKNESS = 368, /* THICKNESS */
+ FILL = 369, /* FILL */
+ COLORED = 370, /* COLORED */
+ OUTLINED = 371, /* OUTLINED */
+ SHADED = 372, /* SHADED */
+ XSLANTED = 373, /* XSLANTED */
+ YSLANTED = 374, /* YSLANTED */
+ ALIGNED = 375, /* ALIGNED */
+ SPRINTF = 376, /* SPRINTF */
+ COMMAND = 377, /* COMMAND */
+ DEFINE = 378, /* DEFINE */
+ UNDEF = 379 /* UNDEF */
+ };
+ typedef enum yytokentype yytoken_kind_t;
+#endif
+/* Token kinds. */
+#define YYEMPTY -2
+#define YYEOF 0
+#define YYerror 256
+#define YYUNDEF 257
+#define LABEL 258
+#define VARIABLE 259
+#define NUMBER 260
+#define TEXT 261
+#define COMMAND_LINE 262
+#define DELIMITED 263
+#define ORDINAL 264
+#define TH 265
+#define LEFT_ARROW_HEAD 266
+#define RIGHT_ARROW_HEAD 267
+#define DOUBLE_ARROW_HEAD 268
+#define LAST 269
+#define BOX 270
+#define CIRCLE 271
+#define ELLIPSE 272
+#define ARC 273
+#define LINE 274
+#define ARROW 275
+#define MOVE 276
+#define SPLINE 277
+#define HEIGHT 278
+#define RADIUS 279
+#define FIGNAME 280
+#define WIDTH 281
+#define DIAMETER 282
+#define UP 283
+#define DOWN 284
+#define RIGHT 285
+#define LEFT 286
+#define FROM 287
+#define TO 288
+#define AT 289
+#define WITH 290
+#define BY 291
+#define THEN 292
+#define SOLID 293
+#define DOTTED 294
+#define DASHED 295
+#define CHOP 296
+#define SAME 297
+#define INVISIBLE 298
+#define LJUST 299
+#define RJUST 300
+#define ABOVE 301
+#define BELOW 302
+#define OF 303
+#define THE 304
+#define WAY 305
+#define BETWEEN 306
+#define AND 307
+#define HERE 308
+#define DOT_N 309
+#define DOT_E 310
+#define DOT_W 311
+#define DOT_S 312
+#define DOT_NE 313
+#define DOT_SE 314
+#define DOT_NW 315
+#define DOT_SW 316
+#define DOT_C 317
+#define DOT_START 318
+#define DOT_END 319
+#define DOT_X 320
+#define DOT_Y 321
+#define DOT_HT 322
+#define DOT_WID 323
+#define DOT_RAD 324
+#define SIN 325
+#define COS 326
+#define ATAN2 327
+#define LOG 328
+#define EXP 329
+#define SQRT 330
+#define K_MAX 331
+#define K_MIN 332
+#define INT 333
+#define RAND 334
+#define SRAND 335
+#define COPY 336
+#define THRU 337
+#define TOP 338
+#define BOTTOM 339
+#define UPPER 340
+#define LOWER 341
+#define SH 342
+#define PRINT 343
+#define CW 344
+#define CCW 345
+#define FOR 346
+#define DO 347
+#define IF 348
+#define ELSE 349
+#define ANDAND 350
+#define OROR 351
+#define NOTEQUAL 352
+#define EQUALEQUAL 353
+#define LESSEQUAL 354
+#define GREATEREQUAL 355
+#define LEFT_CORNER 356
+#define RIGHT_CORNER 357
+#define NORTH 358
+#define SOUTH 359
+#define EAST 360
+#define WEST 361
+#define CENTER 362
+#define END 363
+#define START 364
+#define RESET 365
+#define UNTIL 366
+#define PLOT 367
+#define THICKNESS 368
+#define FILL 369
+#define COLORED 370
+#define OUTLINED 371
+#define SHADED 372
+#define XSLANTED 373
+#define YSLANTED 374
+#define ALIGNED 375
+#define SPRINTF 376
+#define COMMAND 377
+#define DEFINE 378
+#define UNDEF 379
+
+/* Value type. */
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+union YYSTYPE
+{
+#line 65 "../src/preproc/pic/pic.ypp"
+
+ char *str;
+ int n;
+ double x;
+ struct { double x, y; } pair;
+ struct { double x; char *body; } if_data;
+ struct { char *str; const char *filename; int lineno; } lstr;
+ struct { double *v; int nv; int maxv; } dv;
+ struct { double val; int is_multiplicative; } by;
+ place pl;
+ object *obj;
+ corner crn;
+ path *pth;
+ object_spec *spec;
+ saved_state *pstate;
+ graphics_state state;
+ object_type obtype;
+
+#line 334 "src/preproc/pic/pic.hpp"
+
+};
+typedef union YYSTYPE YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+extern YYSTYPE yylval;
+
+
+int yyparse (void);
+
+
+#endif /* !YY_YY_SRC_PREPROC_PIC_PIC_HPP_INCLUDED */
diff --git a/src/preproc/pic/pic.ypp b/src/preproc/pic/pic.ypp
new file mode 100644
index 0000000..b2fa6dc
--- /dev/null
+++ b/src/preproc/pic/pic.ypp
@@ -0,0 +1,1957 @@
+/* Copyright (C) 1989-2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+%{
+#include "pic.h"
+#include "ptable.h"
+#include "object.h"
+
+extern int delim_flag;
+extern void copy_rest_thru(const char *, const char *);
+extern void copy_file_thru(const char *, const char *, const char *);
+extern void push_body(const char *);
+extern void do_for(char *var, double from, double to,
+ int by_is_multiplicative, double by, char *body);
+extern void do_lookahead();
+
+/* Maximum number of characters produced by printf("%g") */
+#define GDIGITS 14
+
+int yylex();
+void yyerror(const char *);
+
+void reset(const char *nm);
+void reset_all();
+
+place *lookup_label(const char *);
+void define_label(const char *label, const place *pl);
+
+direction current_direction;
+position current_position;
+
+implement_ptable(place)
+
+PTABLE(place) top_table;
+
+PTABLE(place) *current_table = &top_table;
+saved_state *current_saved_state = 0;
+
+object_list olist;
+
+const char *ordinal_postfix(int n);
+const char *object_type_name(object_type type);
+char *format_number(const char *fmt, double n);
+char *do_sprintf(const char *fmt, const double *v, int nv);
+
+%}
+
+%expect 2
+
+%union {
+ char *str;
+ int n;
+ double x;
+ struct { double x, y; } pair;
+ struct { double x; char *body; } if_data;
+ struct { char *str; const char *filename; int lineno; } lstr;
+ struct { double *v; int nv; int maxv; } dv;
+ struct { double val; int is_multiplicative; } by;
+ place pl;
+ object *obj;
+ corner crn;
+ path *pth;
+ object_spec *spec;
+ saved_state *pstate;
+ graphics_state state;
+ object_type obtype;
+}
+
+%token <str> LABEL
+%token <str> VARIABLE
+%token <x> NUMBER
+%token <lstr> TEXT
+%token <lstr> COMMAND_LINE
+%token <str> DELIMITED
+%token <n> ORDINAL
+%token TH
+%token LEFT_ARROW_HEAD
+%token RIGHT_ARROW_HEAD
+%token DOUBLE_ARROW_HEAD
+%token LAST
+%token BOX
+%token CIRCLE
+%token ELLIPSE
+%token ARC
+%token LINE
+%token ARROW
+%token MOVE
+%token SPLINE
+%token HEIGHT
+%token RADIUS
+%token FIGNAME
+%token WIDTH
+%token DIAMETER
+%token UP
+%token DOWN
+%token RIGHT
+%token LEFT
+%token FROM
+%token TO
+%token AT
+%token WITH
+%token BY
+%token THEN
+%token SOLID
+%token DOTTED
+%token DASHED
+%token CHOP
+%token SAME
+%token INVISIBLE
+%token LJUST
+%token RJUST
+%token ABOVE
+%token BELOW
+%token OF
+%token THE
+%token WAY
+%token BETWEEN
+%token AND
+%token HERE
+%token DOT_N
+%token DOT_E
+%token DOT_W
+%token DOT_S
+%token DOT_NE
+%token DOT_SE
+%token DOT_NW
+%token DOT_SW
+%token DOT_C
+%token DOT_START
+%token DOT_END
+%token DOT_X
+%token DOT_Y
+%token DOT_HT
+%token DOT_WID
+%token DOT_RAD
+%token SIN
+%token COS
+%token ATAN2
+%token LOG
+%token EXP
+%token SQRT
+%token K_MAX
+%token K_MIN
+%token INT
+%token RAND
+%token SRAND
+%token COPY
+%token THRU
+%token TOP
+%token BOTTOM
+%token UPPER
+%token LOWER
+%token SH
+%token PRINT
+%token CW
+%token CCW
+%token FOR
+%token DO
+%token IF
+%token ELSE
+%token ANDAND
+%token OROR
+%token NOTEQUAL
+%token EQUALEQUAL
+%token LESSEQUAL
+%token GREATEREQUAL
+%token LEFT_CORNER
+%token RIGHT_CORNER
+%token NORTH
+%token SOUTH
+%token EAST
+%token WEST
+%token CENTER
+%token END
+%token START
+%token RESET
+%token UNTIL
+%token PLOT
+%token THICKNESS
+%token FILL
+%token COLORED
+%token OUTLINED
+%token SHADED
+%token XSLANTED
+%token YSLANTED
+%token ALIGNED
+%token SPRINTF
+%token COMMAND
+
+%token DEFINE
+%token UNDEF
+
+%left '.'
+
+/* this ensures that plot 17 "%g" parses as (plot 17 "%g") */
+%left PLOT
+%left TEXT SPRINTF
+
+/* give text adjustments higher precedence than TEXT, so that
+box "foo" above ljust == box ("foo" above ljust)
+*/
+
+%left LJUST RJUST ABOVE BELOW
+
+%left LEFT RIGHT
+/* Give attributes that take an optional expression a higher
+precedence than left and right, so that, e.g., 'line chop left'
+parses properly. */
+%left CHOP SOLID DASHED DOTTED UP DOWN FILL COLORED OUTLINED
+%left XSLANTED YSLANTED
+%left LABEL
+
+%left VARIABLE NUMBER '(' SIN COS ATAN2 LOG EXP SQRT K_MAX K_MIN INT RAND SRAND LAST
+%left ORDINAL HERE '`'
+
+%left BOX CIRCLE ELLIPSE ARC LINE ARROW SPLINE '['
+
+/* these need to be lower than '-' */
+%left HEIGHT RADIUS WIDTH DIAMETER FROM TO AT THICKNESS
+
+/* these must have higher precedence than CHOP so that 'label %prec CHOP'
+works */
+%left DOT_N DOT_E DOT_W DOT_S DOT_NE DOT_SE DOT_NW DOT_SW DOT_C
+%left DOT_START DOT_END TOP BOTTOM LEFT_CORNER RIGHT_CORNER
+%left UPPER LOWER NORTH SOUTH EAST WEST CENTER START END
+
+%left ','
+%left OROR
+%left ANDAND
+%left EQUALEQUAL NOTEQUAL
+%left '<' '>' LESSEQUAL GREATEREQUAL
+
+%left BETWEEN OF
+%left AND
+
+%left '+' '-'
+%left '*' '/' '%'
+%right '!'
+%right '^'
+
+%type <x> expr expr_lower_than expr_not_lower_than any_expr text_expr
+%type <by> optional_by
+%type <pair> expr_pair position_not_place
+%type <if_data> simple_if
+%type <obj> nth_primitive
+%type <crn> corner
+%type <pth> path label_path relative_path
+%type <pl> place label element element_list middle_element_list
+%type <spec> object_spec
+%type <pair> position
+%type <obtype> object_type
+%type <n> optional_ordinal_last ordinal
+%type <str> macro_name until
+%type <dv> sprintf_args
+%type <lstr> text print_args print_arg
+
+%%
+
+top:
+ optional_separator
+ | element_list
+ {
+ if (olist.head)
+ print_picture(olist.head);
+ }
+ ;
+
+
+element_list:
+ optional_separator middle_element_list optional_separator
+ { $$ = $2; }
+ ;
+
+middle_element_list:
+ element
+ { $$ = $1; }
+ | middle_element_list separator element
+ { $$ = $1; }
+ ;
+
+optional_separator:
+ /* empty */
+ | separator
+ ;
+
+separator:
+ ';'
+ | separator ';'
+ ;
+
+placeless_element:
+ FIGNAME '=' macro_name
+ {
+ delete[] graphname;
+ graphname = new char[strlen($3) + 1];
+ strcpy(graphname, $3);
+ delete[] $3;
+ }
+ |
+ VARIABLE '=' any_expr
+ {
+ define_variable($1, $3);
+ free($1);
+ }
+ | VARIABLE ':' '=' any_expr
+ {
+ place *p = lookup_label($1);
+ if (!p) {
+ lex_error("variable '%1' not defined", $1);
+ YYABORT;
+ }
+ p->obj = 0;
+ p->x = $4;
+ p->y = 0.0;
+ free($1);
+ }
+ | UP
+ { current_direction = UP_DIRECTION; }
+ | DOWN
+ { current_direction = DOWN_DIRECTION; }
+ | LEFT
+ { current_direction = LEFT_DIRECTION; }
+ | RIGHT
+ { current_direction = RIGHT_DIRECTION; }
+ | COMMAND_LINE
+ {
+ olist.append(make_command_object($1.str, $1.filename,
+ $1.lineno));
+ }
+ | COMMAND print_args
+ {
+ olist.append(make_command_object($2.str, $2.filename,
+ $2.lineno));
+ }
+ | PRINT print_args
+ {
+ fprintf(stderr, "%s\n", $2.str);
+ delete[] $2.str;
+ fflush(stderr);
+ }
+ | SH
+ { delim_flag = 1; }
+ DELIMITED
+ {
+ delim_flag = 0;
+ if (safer_flag)
+ lex_error("unsafe to run command '%1'; ignoring",
+ $3);
+ else {
+ int retval = system($3);
+ if (retval < 0)
+ lex_error("error running command '%1': system()"
+ " returned %2", $3, retval);
+ }
+ delete[] $3;
+ }
+ | COPY TEXT
+ {
+ if (yychar < 0)
+ do_lookahead();
+ do_copy($2.str);
+ // do not delete the filename
+ }
+ | COPY TEXT THRU
+ { delim_flag = 2; }
+ DELIMITED
+ { delim_flag = 0; }
+ until
+ {
+ if (yychar < 0)
+ do_lookahead();
+ copy_file_thru($2.str, $5, $7);
+ // do not delete the filename
+ delete[] $5;
+ delete[] $7;
+ }
+ | COPY THRU
+ { delim_flag = 2; }
+ DELIMITED
+ { delim_flag = 0; }
+ until
+ {
+ if (yychar < 0)
+ do_lookahead();
+ copy_rest_thru($4, $6);
+ delete[] $4;
+ delete[] $6;
+ }
+ | FOR VARIABLE '=' expr TO expr optional_by DO
+ { delim_flag = 1; }
+ DELIMITED
+ {
+ delim_flag = 0;
+ if (yychar < 0)
+ do_lookahead();
+ do_for($2, $4, $6, $7.is_multiplicative, $7.val, $10);
+ }
+ | simple_if
+ {
+ if (yychar < 0)
+ do_lookahead();
+ if ($1.x != 0.0)
+ push_body($1.body);
+ delete[] $1.body;
+ }
+ | simple_if ELSE
+ { delim_flag = 1; }
+ DELIMITED
+ {
+ delim_flag = 0;
+ if (yychar < 0)
+ do_lookahead();
+ if ($1.x != 0.0)
+ push_body($1.body);
+ else
+ push_body($4);
+ free($1.body);
+ free($4);
+ }
+ | reset_variables
+ | RESET
+ { define_variable("scale", 1.0); }
+ ;
+
+macro_name:
+ VARIABLE
+ | LABEL
+ ;
+
+reset_variables:
+ RESET VARIABLE
+ {
+ reset($2);
+ delete[] $2;
+ }
+ | reset_variables VARIABLE
+ {
+ reset($2);
+ delete[] $2;
+ }
+ | reset_variables ',' VARIABLE
+ {
+ reset($3);
+ delete[] $3;
+ }
+ ;
+
+print_args:
+ print_arg
+ { $$ = $1; }
+ | print_args print_arg
+ {
+ $$.str = new char[strlen($1.str) + strlen($2.str) + 1];
+ strcpy($$.str, $1.str);
+ strcat($$.str, $2.str);
+ delete[] $1.str;
+ delete[] $2.str;
+ if ($1.filename) {
+ $$.filename = $1.filename;
+ $$.lineno = $1.lineno;
+ }
+ else if ($2.filename) {
+ $$.filename = $2.filename;
+ $$.lineno = $2.lineno;
+ }
+ }
+ ;
+
+print_arg:
+ expr %prec ','
+ {
+ $$.str = new char[GDIGITS + 1];
+ sprintf($$.str, "%g", $1);
+ $$.filename = 0;
+ $$.lineno = 0;
+ }
+ | text
+ { $$ = $1; }
+ | position %prec ','
+ {
+ $$.str = new char[GDIGITS + 2 + GDIGITS + 1];
+ sprintf($$.str, "%g, %g", $1.x, $1.y);
+ $$.filename = 0;
+ $$.lineno = 0;
+ }
+ ;
+
+simple_if:
+ IF any_expr THEN
+ { delim_flag = 1; }
+ DELIMITED
+ {
+ delim_flag = 0;
+ $$.x = $2;
+ $$.body = $5;
+ }
+ ;
+
+until:
+ /* empty */
+ { $$ = 0; }
+ | UNTIL TEXT
+ { $$ = $2.str; }
+ ;
+
+any_expr:
+ expr
+ { $$ = $1; }
+ | text_expr
+ { $$ = $1; }
+ ;
+
+text_expr:
+ text EQUALEQUAL text
+ {
+ $$ = strcmp($1.str, $3.str) == 0;
+ delete[] $1.str;
+ delete[] $3.str;
+ }
+ | text NOTEQUAL text
+ {
+ $$ = strcmp($1.str, $3.str) != 0;
+ delete[] $1.str;
+ delete[] $3.str;
+ }
+ | text_expr ANDAND text_expr
+ { $$ = ($1 != 0.0 && $3 != 0.0); }
+ | text_expr ANDAND expr
+ { $$ = ($1 != 0.0 && $3 != 0.0); }
+ | expr ANDAND text_expr
+ { $$ = ($1 != 0.0 && $3 != 0.0); }
+ | text_expr OROR text_expr
+ { $$ = ($1 != 0.0 || $3 != 0.0); }
+ | text_expr OROR expr
+ { $$ = ($1 != 0.0 || $3 != 0.0); }
+ | expr OROR text_expr
+ { $$ = ($1 != 0.0 || $3 != 0.0); }
+ | '!' text_expr
+ { $$ = ($2 == 0.0); }
+ ;
+
+
+optional_by:
+ /* empty */
+ {
+ $$.val = 1.0;
+ $$.is_multiplicative = 0;
+ }
+ | BY expr
+ {
+ $$.val = $2;
+ $$.is_multiplicative = 0;
+ }
+ | BY '*' expr
+ {
+ $$.val = $3;
+ $$.is_multiplicative = 1;
+ }
+ ;
+
+element:
+ object_spec
+ {
+ $$.obj = $1->make_object(&current_position,
+ &current_direction);
+ if ($$.obj == 0)
+ YYABORT;
+ delete $1;
+ if ($$.obj)
+ olist.append($$.obj);
+ else {
+ $$.x = current_position.x;
+ $$.y = current_position.y;
+ }
+ }
+ | LABEL ':' optional_separator element
+ {
+ $$ = $4;
+ define_label($1, & $$);
+ free($1);
+ }
+ | LABEL ':' optional_separator position_not_place
+ {
+ $$.obj = 0;
+ $$.x = $4.x;
+ $$.y = $4.y;
+ define_label($1, & $$);
+ free($1);
+ }
+ | LABEL ':' optional_separator place
+ {
+ $$ = $4;
+ define_label($1, & $$);
+ free($1);
+ }
+ | '{'
+ {
+ $<state>$.x = current_position.x;
+ $<state>$.y = current_position.y;
+ $<state>$.dir = current_direction;
+ }
+ element_list '}'
+ {
+ current_position.x = $<state>2.x;
+ current_position.y = $<state>2.y;
+ current_direction = $<state>2.dir;
+ }
+ optional_element
+ {
+ $$ = $3;
+ }
+ | placeless_element
+ {
+ $$.obj = 0;
+ $$.x = current_position.x;
+ $$.y = current_position.y;
+ }
+ ;
+
+optional_element:
+ /* empty */
+ {}
+ | element
+ {}
+ ;
+
+object_spec:
+ BOX
+ { $$ = new object_spec(BOX_OBJECT); }
+ | CIRCLE
+ { $$ = new object_spec(CIRCLE_OBJECT); }
+ | ELLIPSE
+ { $$ = new object_spec(ELLIPSE_OBJECT); }
+ | ARC
+ {
+ $$ = new object_spec(ARC_OBJECT);
+ $$->dir = current_direction;
+ }
+ | LINE
+ {
+ $$ = new object_spec(LINE_OBJECT);
+ lookup_variable("lineht", & $$->segment_height);
+ lookup_variable("linewid", & $$->segment_width);
+ $$->dir = current_direction;
+ }
+ | ARROW
+ {
+ $$ = new object_spec(ARROW_OBJECT);
+ lookup_variable("lineht", & $$->segment_height);
+ lookup_variable("linewid", & $$->segment_width);
+ $$->dir = current_direction;
+ }
+ | MOVE
+ {
+ $$ = new object_spec(MOVE_OBJECT);
+ lookup_variable("moveht", & $$->segment_height);
+ lookup_variable("movewid", & $$->segment_width);
+ $$->dir = current_direction;
+ }
+ | SPLINE
+ {
+ $$ = new object_spec(SPLINE_OBJECT);
+ lookup_variable("lineht", & $$->segment_height);
+ lookup_variable("linewid", & $$->segment_width);
+ $$->dir = current_direction;
+ }
+ | text %prec TEXT
+ {
+ $$ = new object_spec(TEXT_OBJECT);
+ $$->text = new text_item($1.str, $1.filename, $1.lineno);
+ }
+ | PLOT expr
+ {
+ lex_warning("'plot' is deprecated; use 'sprintf'"
+ " instead");
+ $$ = new object_spec(TEXT_OBJECT);
+ $$->text = new text_item(format_number(0, $2), 0, -1);
+ }
+ | PLOT expr text
+ {
+ $$ = new object_spec(TEXT_OBJECT);
+ $$->text = new text_item(format_number($3.str, $2),
+ $3.filename, $3.lineno);
+ delete[] $3.str;
+ }
+ | '['
+ {
+ saved_state *p = new saved_state;
+ $<pstate>$ = p;
+ p->x = current_position.x;
+ p->y = current_position.y;
+ p->dir = current_direction;
+ p->tbl = current_table;
+ p->prev = current_saved_state;
+ current_position.x = 0.0;
+ current_position.y = 0.0;
+ current_table = new PTABLE(place);
+ current_saved_state = p;
+ olist.append(make_mark_object());
+ }
+ element_list ']'
+ {
+ current_position.x = $<pstate>2->x;
+ current_position.y = $<pstate>2->y;
+ current_direction = $<pstate>2->dir;
+ $$ = new object_spec(BLOCK_OBJECT);
+ olist.wrap_up_block(& $$->oblist);
+ $$->tbl = current_table;
+ current_table = $<pstate>2->tbl;
+ current_saved_state = $<pstate>2->prev;
+ delete $<pstate>2;
+ }
+ | object_spec HEIGHT expr
+ {
+ $$ = $1;
+ $$->height = $3;
+ $$->flags |= HAS_HEIGHT;
+ }
+ | object_spec RADIUS expr
+ {
+ $$ = $1;
+ $$->radius = $3;
+ $$->flags |= HAS_RADIUS;
+ }
+ | object_spec WIDTH expr
+ {
+ $$ = $1;
+ $$->width = $3;
+ $$->flags |= HAS_WIDTH;
+ }
+ | object_spec DIAMETER expr
+ {
+ $$ = $1;
+ $$->radius = $3/2.0;
+ $$->flags |= HAS_RADIUS;
+ }
+ | object_spec expr %prec HEIGHT
+ {
+ $$ = $1;
+ $$->flags |= HAS_SEGMENT;
+ switch ($$->dir) {
+ case UP_DIRECTION:
+ $$->segment_pos.y += $2;
+ break;
+ case DOWN_DIRECTION:
+ $$->segment_pos.y -= $2;
+ break;
+ case RIGHT_DIRECTION:
+ $$->segment_pos.x += $2;
+ break;
+ case LEFT_DIRECTION:
+ $$->segment_pos.x -= $2;
+ break;
+ }
+ }
+ | object_spec UP
+ {
+ $$ = $1;
+ $$->dir = UP_DIRECTION;
+ $$->flags |= HAS_SEGMENT;
+ $$->segment_pos.y += $$->segment_height;
+ }
+ | object_spec UP expr
+ {
+ $$ = $1;
+ $$->dir = UP_DIRECTION;
+ $$->flags |= HAS_SEGMENT;
+ $$->segment_pos.y += $3;
+ }
+ | object_spec DOWN
+ {
+ $$ = $1;
+ $$->dir = DOWN_DIRECTION;
+ $$->flags |= HAS_SEGMENT;
+ $$->segment_pos.y -= $$->segment_height;
+ }
+ | object_spec DOWN expr
+ {
+ $$ = $1;
+ $$->dir = DOWN_DIRECTION;
+ $$->flags |= HAS_SEGMENT;
+ $$->segment_pos.y -= $3;
+ }
+ | object_spec RIGHT
+ {
+ $$ = $1;
+ $$->dir = RIGHT_DIRECTION;
+ $$->flags |= HAS_SEGMENT;
+ $$->segment_pos.x += $$->segment_width;
+ }
+ | object_spec RIGHT expr
+ {
+ $$ = $1;
+ $$->dir = RIGHT_DIRECTION;
+ $$->flags |= HAS_SEGMENT;
+ $$->segment_pos.x += $3;
+ }
+ | object_spec LEFT
+ {
+ $$ = $1;
+ $$->dir = LEFT_DIRECTION;
+ $$->flags |= HAS_SEGMENT;
+ $$->segment_pos.x -= $$->segment_width;
+ }
+ | object_spec LEFT expr
+ {
+ $$ = $1;
+ $$->dir = LEFT_DIRECTION;
+ $$->flags |= HAS_SEGMENT;
+ $$->segment_pos.x -= $3;
+ }
+ | object_spec FROM position
+ {
+ $$ = $1;
+ $$->flags |= HAS_FROM;
+ $$->from.x = $3.x;
+ $$->from.y = $3.y;
+ }
+ | object_spec TO position
+ {
+ $$ = $1;
+ if ($$->flags & HAS_SEGMENT)
+ $$->segment_list = new segment($$->segment_pos,
+ $$->segment_is_absolute,
+ $$->segment_list);
+ $$->flags |= HAS_SEGMENT;
+ $$->segment_pos.x = $3.x;
+ $$->segment_pos.y = $3.y;
+ $$->segment_is_absolute = 1;
+ $$->flags |= HAS_TO;
+ $$->to.x = $3.x;
+ $$->to.y = $3.y;
+ }
+ | object_spec AT position
+ {
+ $$ = $1;
+ $$->flags |= HAS_AT;
+ $$->at.x = $3.x;
+ $$->at.y = $3.y;
+ if ($$->type != ARC_OBJECT) {
+ $$->flags |= HAS_FROM;
+ $$->from.x = $3.x;
+ $$->from.y = $3.y;
+ }
+ }
+ | object_spec WITH path
+ {
+ $$ = $1;
+ $$->flags |= HAS_WITH;
+ $$->with = $3;
+ }
+ | object_spec WITH position %prec ','
+ {
+ $$ = $1;
+ $$->flags |= HAS_WITH;
+ position pos;
+ pos.x = $3.x;
+ pos.y = $3.y;
+ $$->with = new path(pos);
+ }
+ | object_spec BY expr_pair
+ {
+ $$ = $1;
+ $$->flags |= HAS_SEGMENT;
+ $$->segment_pos.x += $3.x;
+ $$->segment_pos.y += $3.y;
+ }
+ | object_spec THEN
+ {
+ $$ = $1;
+ if (!($$->flags & HAS_SEGMENT))
+ switch ($$->dir) {
+ case UP_DIRECTION:
+ $$->segment_pos.y += $$->segment_width;
+ break;
+ case DOWN_DIRECTION:
+ $$->segment_pos.y -= $$->segment_width;
+ break;
+ case RIGHT_DIRECTION:
+ $$->segment_pos.x += $$->segment_width;
+ break;
+ case LEFT_DIRECTION:
+ $$->segment_pos.x -= $$->segment_width;
+ break;
+ }
+ $$->segment_list = new segment($$->segment_pos,
+ $$->segment_is_absolute,
+ $$->segment_list);
+ $$->flags &= ~HAS_SEGMENT;
+ $$->segment_pos.x = $$->segment_pos.y = 0.0;
+ $$->segment_is_absolute = 0;
+ }
+ | object_spec SOLID
+ {
+ $$ = $1; // nothing
+ }
+ | object_spec DOTTED
+ {
+ $$ = $1;
+ $$->flags |= IS_DOTTED;
+ lookup_variable("dashwid", & $$->dash_width);
+ }
+ | object_spec DOTTED expr
+ {
+ $$ = $1;
+ $$->flags |= IS_DOTTED;
+ $$->dash_width = $3;
+ }
+ | object_spec DASHED
+ {
+ $$ = $1;
+ $$->flags |= IS_DASHED;
+ lookup_variable("dashwid", & $$->dash_width);
+ }
+ | object_spec DASHED expr
+ {
+ $$ = $1;
+ $$->flags |= IS_DASHED;
+ $$->dash_width = $3;
+ }
+ | object_spec FILL
+ {
+ $$ = $1;
+ $$->flags |= IS_DEFAULT_FILLED;
+ }
+ | object_spec FILL expr
+ {
+ $$ = $1;
+ $$->flags |= IS_FILLED;
+ $$->fill = $3;
+ }
+ | object_spec XSLANTED expr
+ {
+ $$ = $1;
+ $$->flags |= IS_XSLANTED;
+ $$->xslanted = $3;
+ }
+ | object_spec YSLANTED expr
+ {
+ $$ = $1;
+ $$->flags |= IS_YSLANTED;
+ $$->yslanted = $3;
+ }
+ | object_spec SHADED text
+ {
+ $$ = $1;
+ $$->flags |= (IS_SHADED | IS_FILLED);
+ $$->shaded = new char[strlen($3.str)+1];
+ strcpy($$->shaded, $3.str);
+ }
+ | object_spec COLORED text
+ {
+ $$ = $1;
+ $$->flags |= (IS_SHADED | IS_OUTLINED | IS_FILLED);
+ $$->shaded = new char[strlen($3.str)+1];
+ strcpy($$->shaded, $3.str);
+ $$->outlined = new char[strlen($3.str)+1];
+ strcpy($$->outlined, $3.str);
+ }
+ | object_spec OUTLINED text
+ {
+ $$ = $1;
+ $$->flags |= IS_OUTLINED;
+ $$->outlined = new char[strlen($3.str)+1];
+ strcpy($$->outlined, $3.str);
+ }
+ | object_spec CHOP
+ {
+ $$ = $1;
+ // line chop chop means line chop 0 chop 0
+ if ($$->flags & IS_DEFAULT_CHOPPED) {
+ $$->flags |= IS_CHOPPED;
+ $$->flags &= ~IS_DEFAULT_CHOPPED;
+ $$->start_chop = $$->end_chop = 0.0;
+ }
+ else if ($$->flags & IS_CHOPPED) {
+ $$->end_chop = 0.0;
+ }
+ else {
+ $$->flags |= IS_DEFAULT_CHOPPED;
+ }
+ }
+ | object_spec CHOP expr
+ {
+ $$ = $1;
+ if ($$->flags & IS_DEFAULT_CHOPPED) {
+ $$->flags |= IS_CHOPPED;
+ $$->flags &= ~IS_DEFAULT_CHOPPED;
+ $$->start_chop = 0.0;
+ $$->end_chop = $3;
+ }
+ else if ($$->flags & IS_CHOPPED) {
+ $$->end_chop = $3;
+ }
+ else {
+ $$->start_chop = $$->end_chop = $3;
+ $$->flags |= IS_CHOPPED;
+ }
+ }
+ | object_spec SAME
+ {
+ $$ = $1;
+ $$->flags |= IS_SAME;
+ }
+ | object_spec INVISIBLE
+ {
+ $$ = $1;
+ $$->flags |= IS_INVISIBLE;
+ }
+ | object_spec LEFT_ARROW_HEAD
+ {
+ $$ = $1;
+ $$->flags |= HAS_LEFT_ARROW_HEAD;
+ }
+ | object_spec RIGHT_ARROW_HEAD
+ {
+ $$ = $1;
+ $$->flags |= HAS_RIGHT_ARROW_HEAD;
+ }
+ | object_spec DOUBLE_ARROW_HEAD
+ {
+ $$ = $1;
+ $$->flags |= (HAS_LEFT_ARROW_HEAD|HAS_RIGHT_ARROW_HEAD);
+ }
+ | object_spec CW
+ {
+ $$ = $1;
+ $$->flags |= IS_CLOCKWISE;
+ }
+ | object_spec CCW
+ {
+ $$ = $1;
+ $$->flags &= ~IS_CLOCKWISE;
+ }
+ | object_spec text %prec TEXT
+ {
+ $$ = $1;
+ text_item **p;
+ for (p = & $$->text; *p; p = &(*p)->next)
+ ;
+ *p = new text_item($2.str, $2.filename, $2.lineno);
+ }
+ | object_spec LJUST
+ {
+ $$ = $1;
+ if ($$->text) {
+ text_item *p;
+ for (p = $$->text; p->next; p = p->next)
+ ;
+ p->adj.h = LEFT_ADJUST;
+ }
+ }
+ | object_spec RJUST
+ {
+ $$ = $1;
+ if ($$->text) {
+ text_item *p;
+ for (p = $$->text; p->next; p = p->next)
+ ;
+ p->adj.h = RIGHT_ADJUST;
+ }
+ }
+ | object_spec ABOVE
+ {
+ $$ = $1;
+ if ($$->text) {
+ text_item *p;
+ for (p = $$->text; p->next; p = p->next)
+ ;
+ p->adj.v = ABOVE_ADJUST;
+ }
+ }
+ | object_spec BELOW
+ {
+ $$ = $1;
+ if ($$->text) {
+ text_item *p;
+ for (p = $$->text; p->next; p = p->next)
+ ;
+ p->adj.v = BELOW_ADJUST;
+ }
+ }
+ | object_spec THICKNESS expr
+ {
+ $$ = $1;
+ $$->flags |= HAS_THICKNESS;
+ $$->thickness = $3;
+ }
+ | object_spec ALIGNED
+ {
+ $$ = $1;
+ $$->flags |= IS_ALIGNED;
+ }
+ ;
+
+text:
+ TEXT
+ { $$ = $1; }
+ | SPRINTF '(' TEXT sprintf_args ')'
+ {
+ $$.filename = $3.filename;
+ $$.lineno = $3.lineno;
+ $$.str = do_sprintf($3.str, $4.v, $4.nv);
+ delete[] $4.v;
+ free($3.str);
+ }
+ ;
+
+sprintf_args:
+ /* empty */
+ {
+ $$.v = 0;
+ $$.nv = 0;
+ $$.maxv = 0;
+ }
+ | sprintf_args ',' expr
+ {
+ $$ = $1;
+ if ($$.nv >= $$.maxv) {
+ if ($$.nv == 0) {
+ $$.v = new double[4];
+ $$.maxv = 4;
+ }
+ else {
+ double *oldv = $$.v;
+ $$.maxv *= 2;
+#if 0
+ $$.v = new double[$$.maxv];
+ memcpy($$.v, oldv, $$.nv*sizeof(double));
+#else
+ // workaround for bug in Compaq C++ V6.5-033
+ // for Compaq Tru64 UNIX V5.1A (Rev. 1885)
+ double *foo = new double[$$.maxv];
+ memcpy(foo, oldv, $$.nv*sizeof(double));
+ $$.v = foo;
+#endif
+ delete[] oldv;
+ }
+ }
+ $$.v[$$.nv] = $3;
+ $$.nv += 1;
+ }
+ ;
+
+position:
+ position_not_place
+ { $$ = $1; }
+ | place
+ {
+ position pos = $1;
+ $$.x = pos.x;
+ $$.y = pos.y;
+ }
+ | '(' place ')'
+ {
+ position pos = $2;
+ $$.x = pos.x;
+ $$.y = pos.y;
+ }
+ ;
+
+position_not_place:
+ expr_pair
+ { $$ = $1; }
+ | position '+' expr_pair
+ {
+ $$.x = $1.x + $3.x;
+ $$.y = $1.y + $3.y;
+ }
+ | '(' position '+' expr_pair ')'
+ {
+ $$.x = $2.x + $4.x;
+ $$.y = $2.y + $4.y;
+ }
+ | position '-' expr_pair
+ {
+ $$.x = $1.x - $3.x;
+ $$.y = $1.y - $3.y;
+ }
+ | '(' position '-' expr_pair ')'
+ {
+ $$.x = $2.x - $4.x;
+ $$.y = $2.y - $4.y;
+ }
+ | '(' position ',' position ')'
+ {
+ $$.x = $2.x;
+ $$.y = $4.y;
+ }
+ | expr between position AND position
+ {
+ $$.x = (1.0 - $1)*$3.x + $1*$5.x;
+ $$.y = (1.0 - $1)*$3.y + $1*$5.y;
+ }
+ | '(' expr between position AND position ')'
+ {
+ $$.x = (1.0 - $2)*$4.x + $2*$6.x;
+ $$.y = (1.0 - $2)*$4.y + $2*$6.y;
+ }
+ /* the next two rules cause harmless shift/reduce warnings */
+ | expr_not_lower_than '<' position ',' position '>'
+ {
+ $$.x = (1.0 - $1)*$3.x + $1*$5.x;
+ $$.y = (1.0 - $1)*$3.y + $1*$5.y;
+ }
+ | '(' expr_not_lower_than '<' position ',' position '>' ')'
+ {
+ $$.x = (1.0 - $2)*$4.x + $2*$6.x;
+ $$.y = (1.0 - $2)*$4.y + $2*$6.y;
+ }
+ ;
+
+between:
+ BETWEEN
+ | OF THE WAY BETWEEN
+ ;
+
+expr_pair:
+ expr ',' expr
+ {
+ $$.x = $1;
+ $$.y = $3;
+ }
+ | '(' expr_pair ')'
+ { $$ = $2; }
+ ;
+
+place:
+ /* line at A left == line (at A) left */
+ label %prec CHOP
+ { $$ = $1; }
+ | label corner
+ {
+ path pth($2);
+ if (!pth.follow($1, & $$))
+ YYABORT;
+ }
+ | corner label
+ {
+ path pth($1);
+ if (!pth.follow($2, & $$))
+ YYABORT;
+ }
+ | corner OF label
+ {
+ path pth($1);
+ if (!pth.follow($3, & $$))
+ YYABORT;
+ }
+ | HERE
+ {
+ $$.x = current_position.x;
+ $$.y = current_position.y;
+ $$.obj = 0;
+ }
+ ;
+
+label:
+ LABEL
+ {
+ place *p = lookup_label($1);
+ if (!p) {
+ lex_error("there is no place '%1'", $1);
+ YYABORT;
+ }
+ $$ = *p;
+ free($1);
+ }
+ | nth_primitive
+ { $$.obj = $1; }
+ | label '.' LABEL
+ {
+ path pth($3);
+ if (!pth.follow($1, & $$))
+ YYABORT;
+ }
+ ;
+
+ordinal:
+ ORDINAL
+ { $$ = $1; }
+ | '`' any_expr TH
+ {
+ // XXX Check for overflow (and non-integers?).
+ $$ = (int)$2;
+ }
+ ;
+
+optional_ordinal_last:
+ LAST
+ { $$ = 1; }
+ | ordinal LAST
+ { $$ = $1; }
+ ;
+
+nth_primitive:
+ ordinal object_type
+ {
+ int count = 0;
+ object *p;
+ for (p = olist.head; p != 0; p = p->next)
+ if (p->type() == $2 && ++count == $1) {
+ $$ = p;
+ break;
+ }
+ if (p == 0) {
+ lex_error("there is no %1%2 %3", $1, ordinal_postfix($1),
+ object_type_name($2));
+ YYABORT;
+ }
+ }
+ | optional_ordinal_last object_type
+ {
+ int count = 0;
+ object *p;
+ for (p = olist.tail; p != 0; p = p->prev)
+ if (p->type() == $2 && ++count == $1) {
+ $$ = p;
+ break;
+ }
+ if (p == 0) {
+ lex_error("there is no %1%2 last %3", $1,
+ ordinal_postfix($1), object_type_name($2));
+ YYABORT;
+ }
+ }
+ ;
+
+object_type:
+ BOX
+ { $$ = BOX_OBJECT; }
+ | CIRCLE
+ { $$ = CIRCLE_OBJECT; }
+ | ELLIPSE
+ { $$ = ELLIPSE_OBJECT; }
+ | ARC
+ { $$ = ARC_OBJECT; }
+ | LINE
+ { $$ = LINE_OBJECT; }
+ | ARROW
+ { $$ = ARROW_OBJECT; }
+ | SPLINE
+ { $$ = SPLINE_OBJECT; }
+ | '[' ']'
+ { $$ = BLOCK_OBJECT; }
+ | TEXT
+ { $$ = TEXT_OBJECT; }
+ ;
+
+label_path:
+ '.' LABEL
+ { $$ = new path($2); }
+ | label_path '.' LABEL
+ {
+ $$ = $1;
+ $$->append($3);
+ }
+ ;
+
+relative_path:
+ corner %prec CHOP
+ { $$ = new path($1); }
+ /* give this a lower precedence than LEFT and RIGHT so that
+ [A: box] with .A left == [A: box] with (.A left) */
+ | label_path %prec TEXT
+ { $$ = $1; }
+ | label_path corner
+ {
+ $$ = $1;
+ $$->append($2);
+ }
+ ;
+
+path:
+ relative_path
+ { $$ = $1; }
+ | '(' relative_path ',' relative_path ')'
+ {
+ $$ = $2;
+ $$->set_ypath($4);
+ }
+ /* The rest of these rules are a compatibility sop. */
+ | ORDINAL LAST object_type relative_path
+ {
+ lex_warning("'%1%2 last %3' in 'with' argument ignored",
+ $1, ordinal_postfix($1), object_type_name($3));
+ $$ = $4;
+ }
+ | LAST object_type relative_path
+ {
+ lex_warning("'last %1' in 'with' argument ignored",
+ object_type_name($2));
+ $$ = $3;
+ }
+ | ORDINAL object_type relative_path
+ {
+ lex_warning("'%1%2 %3' in 'with' argument ignored",
+ $1, ordinal_postfix($1), object_type_name($2));
+ $$ = $3;
+ }
+ | LABEL relative_path
+ {
+ lex_warning("initial '%1' in 'with' argument ignored", $1);
+ delete[] $1;
+ $$ = $2;
+ }
+ ;
+
+corner:
+ DOT_N
+ { $$ = &object::north; }
+ | DOT_E
+ { $$ = &object::east; }
+ | DOT_W
+ { $$ = &object::west; }
+ | DOT_S
+ { $$ = &object::south; }
+ | DOT_NE
+ { $$ = &object::north_east; }
+ | DOT_SE
+ { $$ = &object:: south_east; }
+ | DOT_NW
+ { $$ = &object::north_west; }
+ | DOT_SW
+ { $$ = &object::south_west; }
+ | DOT_C
+ { $$ = &object::center; }
+ | DOT_START
+ { $$ = &object::start; }
+ | DOT_END
+ { $$ = &object::end; }
+ | TOP
+ { $$ = &object::north; }
+ | BOTTOM
+ { $$ = &object::south; }
+ | LEFT
+ { $$ = &object::west; }
+ | RIGHT
+ { $$ = &object::east; }
+ | UPPER LEFT
+ { $$ = &object::north_west; }
+ | LOWER LEFT
+ { $$ = &object::south_west; }
+ | UPPER RIGHT
+ { $$ = &object::north_east; }
+ | LOWER RIGHT
+ { $$ = &object::south_east; }
+ | LEFT_CORNER
+ { $$ = &object::west; }
+ | RIGHT_CORNER
+ { $$ = &object::east; }
+ | UPPER LEFT_CORNER
+ { $$ = &object::north_west; }
+ | LOWER LEFT_CORNER
+ { $$ = &object::south_west; }
+ | UPPER RIGHT_CORNER
+ { $$ = &object::north_east; }
+ | LOWER RIGHT_CORNER
+ { $$ = &object::south_east; }
+ | NORTH
+ { $$ = &object::north; }
+ | SOUTH
+ { $$ = &object::south; }
+ | EAST
+ { $$ = &object::east; }
+ | WEST
+ { $$ = &object::west; }
+ | CENTER
+ { $$ = &object::center; }
+ | START
+ { $$ = &object::start; }
+ | END
+ { $$ = &object::end; }
+ ;
+
+expr:
+ expr_lower_than
+ { $$ = $1; }
+ | expr_not_lower_than
+ { $$ = $1; }
+ ;
+
+expr_lower_than:
+ expr '<' expr
+ { $$ = ($1 < $3); }
+ ;
+
+expr_not_lower_than:
+ VARIABLE
+ {
+ if (!lookup_variable($1, & $$)) {
+ lex_error("there is no variable '%1'", $1);
+ YYABORT;
+ }
+ free($1);
+ }
+ | NUMBER
+ { $$ = $1; }
+ | place DOT_X
+ {
+ if ($1.obj != 0)
+ $$ = $1.obj->origin().x;
+ else
+ $$ = $1.x;
+ }
+ | place DOT_Y
+ {
+ if ($1.obj != 0)
+ $$ = $1.obj->origin().y;
+ else
+ $$ = $1.y;
+ }
+ | place DOT_HT
+ {
+ if ($1.obj != 0)
+ $$ = $1.obj->height();
+ else
+ $$ = 0.0;
+ }
+ | place DOT_WID
+ {
+ if ($1.obj != 0)
+ $$ = $1.obj->width();
+ else
+ $$ = 0.0;
+ }
+ | place DOT_RAD
+ {
+ if ($1.obj != 0)
+ $$ = $1.obj->radius();
+ else
+ $$ = 0.0;
+ }
+ | expr '+' expr
+ { $$ = $1 + $3; }
+ | expr '-' expr
+ { $$ = $1 - $3; }
+ | expr '*' expr
+ { $$ = $1 * $3; }
+ | expr '/' expr
+ {
+ if ($3 == 0.0) {
+ lex_error("division by zero");
+ YYABORT;
+ }
+ $$ = $1/$3;
+ }
+ | expr '%' expr
+ {
+ if ($3 == 0.0) {
+ lex_error("modulus by zero");
+ YYABORT;
+ }
+ $$ = fmod($1, $3);
+ }
+ | expr '^' expr
+ {
+ errno = 0;
+ $$ = pow($1, $3);
+ if (errno == EDOM) {
+ lex_error("arguments to '^' operator out of domain");
+ YYABORT;
+ }
+ if (errno == ERANGE) {
+ lex_error("result of '^' operator out of range");
+ YYABORT;
+ }
+ }
+ | '-' expr %prec '!'
+ { $$ = -$2; }
+ | '(' any_expr ')'
+ { $$ = $2; }
+ | SIN '(' any_expr ')'
+ {
+ errno = 0;
+ $$ = sin($3);
+ if (errno == ERANGE) {
+ lex_error("sin result out of range");
+ YYABORT;
+ }
+ }
+ | COS '(' any_expr ')'
+ {
+ errno = 0;
+ $$ = cos($3);
+ if (errno == ERANGE) {
+ lex_error("cos result out of range");
+ YYABORT;
+ }
+ }
+ | ATAN2 '(' any_expr ',' any_expr ')'
+ {
+ errno = 0;
+ $$ = atan2($3, $5);
+ if (errno == EDOM) {
+ lex_error("atan2 argument out of domain");
+ YYABORT;
+ }
+ if (errno == ERANGE) {
+ lex_error("atan2 result out of range");
+ YYABORT;
+ }
+ }
+ | LOG '(' any_expr ')'
+ {
+ errno = 0;
+ $$ = log10($3);
+ if (errno == ERANGE) {
+ lex_error("log result out of range");
+ YYABORT;
+ }
+ }
+ | EXP '(' any_expr ')'
+ {
+ errno = 0;
+ $$ = pow(10.0, $3);
+ if (errno == ERANGE) {
+ lex_error("exp result out of range");
+ YYABORT;
+ }
+ }
+ | SQRT '(' any_expr ')'
+ {
+ errno = 0;
+ $$ = sqrt($3);
+ if (errno == EDOM) {
+ lex_error("sqrt argument out of domain");
+ YYABORT;
+ }
+ }
+ | K_MAX '(' any_expr ',' any_expr ')'
+ { $$ = $3 > $5 ? $3 : $5; }
+ | K_MIN '(' any_expr ',' any_expr ')'
+ { $$ = $3 < $5 ? $3 : $5; }
+ | INT '(' any_expr ')'
+ { $$ = $3 < 0 ? -floor(-$3) : floor($3); }
+ | RAND '(' any_expr ')'
+ {
+ lex_error("use of 'rand' with an argument is"
+ " deprecated; shift and scale 'rand()' with"
+ " arithmetic instead");
+ $$ = 1.0 + floor(((rand()&0x7fff)/double(0x7fff))*$3);
+ }
+ | RAND '(' ')'
+ {
+ /* return a random number in the range [0,1) */
+ /* portable, but not very random */
+ $$ = (rand() & 0x7fff) / double(0x8000);
+ }
+ | SRAND '(' any_expr ')'
+ {
+ $$ = 0;
+ srand((unsigned int)$3);
+ }
+ | expr LESSEQUAL expr
+ { $$ = ($1 <= $3); }
+ | expr '>' expr
+ { $$ = ($1 > $3); }
+ | expr GREATEREQUAL expr
+ { $$ = ($1 >= $3); }
+ | expr EQUALEQUAL expr
+ { $$ = ($1 == $3); }
+ | expr NOTEQUAL expr
+ { $$ = ($1 != $3); }
+ | expr ANDAND expr
+ { $$ = ($1 != 0.0 && $3 != 0.0); }
+ | expr OROR expr
+ { $$ = ($1 != 0.0 || $3 != 0.0); }
+ | '!' expr
+ { $$ = ($2 == 0.0); }
+
+ ;
+
+%%
+
+/* bison defines const to be empty unless __STDC__ is defined, which it
+isn't under cfront */
+
+#ifdef const
+#undef const
+#endif
+
+static struct {
+ const char *name;
+ double val;
+ int scaled; // non-zero if val should be multiplied by scale
+} defaults_table[] = {
+ { "arcrad", .25, 1 },
+ { "arrowht", .1, 1 },
+ { "arrowwid", .05, 1 },
+ { "circlerad", .25, 1 },
+ { "boxht", .5, 1 },
+ { "boxwid", .75, 1 },
+ { "boxrad", 0.0, 1 },
+ { "dashwid", .05, 1 },
+ { "ellipseht", .5, 1 },
+ { "ellipsewid", .75, 1 },
+ { "moveht", .5, 1 },
+ { "movewid", .5, 1 },
+ { "lineht", .5, 1 },
+ { "linewid", .5, 1 },
+ { "textht", 0.0, 1 },
+ { "textwid", 0.0, 1 },
+ { "scale", 1.0, 0 },
+ { "linethick", -1.0, 0 }, // in points
+ { "fillval", .5, 0 },
+ { "arrowhead", 1.0, 0 },
+ { "maxpswid", 8.5, 0 },
+ { "maxpsht", 11.0, 0 },
+};
+
+place *lookup_label(const char *label)
+{
+ saved_state *state = current_saved_state;
+ PTABLE(place) *tbl = current_table;
+ for (;;) {
+ place *pl = tbl->lookup(label);
+ if (pl)
+ return pl;
+ if (!state)
+ return 0;
+ tbl = state->tbl;
+ state = state->prev;
+ }
+}
+
+void define_label(const char *label, const place *pl)
+{
+ place *p = new place[1];
+ *p = *pl;
+ current_table->define(label, p);
+}
+
+int lookup_variable(const char *name, double *val)
+{
+ place *pl = lookup_label(name);
+ if (pl) {
+ *val = pl->x;
+ return 1;
+ }
+ return 0;
+}
+
+void define_variable(const char *name, double val)
+{
+ place *p = new place[1];
+ p->obj = 0;
+ p->x = val;
+ p->y = 0.0;
+ current_table->define(name, p);
+ if (strcmp(name, "scale") == 0) {
+ // When the scale changes, reset all scaled predefined variables to
+ // their default values.
+ for (unsigned int i = 0;
+ i < sizeof(defaults_table)/sizeof(defaults_table[0]); i++)
+ if (defaults_table[i].scaled)
+ define_variable(defaults_table[i].name, val*defaults_table[i].val);
+ }
+}
+
+// called once only (not once per parse)
+
+void parse_init()
+{
+ current_direction = RIGHT_DIRECTION;
+ current_position.x = 0.0;
+ current_position.y = 0.0;
+ // This resets everything to its default value.
+ reset_all();
+}
+
+void reset(const char *nm)
+{
+ for (unsigned int i = 0;
+ i < sizeof(defaults_table)/sizeof(defaults_table[0]); i++)
+ if (strcmp(nm, defaults_table[i].name) == 0) {
+ double val = defaults_table[i].val;
+ if (defaults_table[i].scaled) {
+ double scale;
+ lookup_variable("scale", &scale);
+ val *= scale;
+ }
+ define_variable(defaults_table[i].name, val);
+ return;
+ }
+ lex_error("'%1' is not a predefined variable", nm);
+}
+
+void reset_all()
+{
+ // We only have to explicitly reset the predefined variables that
+ // aren't scaled because 'scale' is not scaled, and changing the
+ // value of 'scale' will reset all the predefined variables that
+ // are scaled.
+ for (unsigned int i = 0;
+ i < sizeof(defaults_table)/sizeof(defaults_table[0]); i++)
+ if (!defaults_table[i].scaled)
+ define_variable(defaults_table[i].name, defaults_table[i].val);
+}
+
+// called after each parse
+
+void parse_cleanup()
+{
+ while (current_saved_state != 0) {
+ delete current_table;
+ current_table = current_saved_state->tbl;
+ saved_state *tem = current_saved_state;
+ current_saved_state = current_saved_state->prev;
+ delete tem;
+ }
+ assert(current_table == &top_table);
+ PTABLE_ITERATOR(place) iter(current_table);
+ const char *key;
+ place *pl;
+ while (iter.next(&key, &pl))
+ if (pl->obj != 0) {
+ position pos = pl->obj->origin();
+ pl->obj = 0;
+ pl->x = pos.x;
+ pl->y = pos.y;
+ }
+ while (olist.head != 0) {
+ object *tem = olist.head;
+ olist.head = olist.head->next;
+ delete tem;
+ }
+ olist.tail = 0;
+ current_direction = RIGHT_DIRECTION;
+ current_position.x = 0.0;
+ current_position.y = 0.0;
+}
+
+const char *ordinal_postfix(int n)
+{
+ if (n < 10 || n > 20)
+ switch (n % 10) {
+ case 1:
+ return "st";
+ case 2:
+ return "nd";
+ case 3:
+ return "rd";
+ }
+ return "th";
+}
+
+const char *object_type_name(object_type type)
+{
+ switch (type) {
+ case BOX_OBJECT:
+ return "box";
+ case CIRCLE_OBJECT:
+ return "circle";
+ case ELLIPSE_OBJECT:
+ return "ellipse";
+ case ARC_OBJECT:
+ return "arc";
+ case SPLINE_OBJECT:
+ return "spline";
+ case LINE_OBJECT:
+ return "line";
+ case ARROW_OBJECT:
+ return "arrow";
+ case MOVE_OBJECT:
+ return "move";
+ case TEXT_OBJECT:
+ return "\"\"";
+ case BLOCK_OBJECT:
+ return "[]";
+ case OTHER_OBJECT:
+ case MARK_OBJECT:
+ default:
+ break;
+ }
+ return "object";
+}
+
+static char sprintf_buf[1024];
+
+char *format_number(const char *fmt, double n)
+{
+ if (0 /* nullptr */ == fmt)
+ fmt = "%g";
+ return do_sprintf(fmt, &n, 1);
+}
+
+char *do_sprintf(const char *fmt, const double *v, int nv)
+{
+ // Define valid conversion specifiers and modifiers.
+ static const char spcs[] = "eEfgG%";
+ static const char mods[] = "#-+ 0123456789.";
+ string result;
+ int i = 0;
+ string one_format;
+ while (*fmt) {
+ if ('%' == *fmt) {
+ one_format += *fmt++;
+ for (; *fmt != '\0' && strchr(mods, *fmt) != 0; fmt++)
+ one_format += *fmt;
+ if ('\0' == *fmt || strchr(spcs, *fmt) == 0) {
+ lex_error("invalid sprintf conversion specifier '%1'", *fmt);
+ result += one_format;
+ result += fmt;
+ break;
+ }
+ if ('%' == *fmt) {
+ fmt++;
+ snprintf(sprintf_buf, sizeof(sprintf_buf), "%%");
+ }
+ else {
+ if (i >= nv) {
+ lex_error("too few arguments to sprintf");
+ result += one_format;
+ result += fmt;
+ break;
+ }
+ one_format += *fmt++;
+ one_format += '\0';
+// We validated the format string above. Most conversion specifiers are
+// rejected, including `n`.
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+ snprintf(sprintf_buf, sizeof(sprintf_buf),
+ one_format.contents(), v[i++]);
+#pragma GCC diagnostic pop
+ }
+ one_format.clear();
+ result += sprintf_buf;
+ }
+ else
+ result += *fmt++;
+ }
+ result += '\0';
+ return strsave(result.contents());
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/pic/position.h b/src/preproc/pic/position.h
new file mode 100644
index 0000000..fb32737
--- /dev/null
+++ b/src/preproc/pic/position.h
@@ -0,0 +1,46 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+struct place;
+struct position {
+ double x;
+ double y;
+ position(double, double );
+ position();
+ position(const place &);
+ position &operator+=(const position &);
+ position &operator-=(const position &);
+ position &operator*=(double);
+ position &operator/=(double);
+};
+
+position operator-(const position &);
+position operator+(const position &, const position &);
+position operator-(const position &, const position &);
+position operator/(const position &, double);
+position operator*(const position &, double);
+// dot product
+double operator*(const position &, const position &);
+int operator==(const position &, const position &);
+int operator!=(const position &, const position &);
+
+double hypot(const position &a);
+
+typedef position distance;
+
diff --git a/src/preproc/pic/tex.cpp b/src/preproc/pic/tex.cpp
new file mode 100644
index 0000000..c6071af
--- /dev/null
+++ b/src/preproc/pic/tex.cpp
@@ -0,0 +1,458 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "pic.h"
+
+#ifdef TEX_SUPPORT
+
+#include "common.h"
+
+class tex_output : public common_output {
+public:
+ tex_output();
+ ~tex_output();
+ void start_picture(double, const position &ll, const position &ur);
+ void finish_picture();
+ void text(const position &, text_piece *, int, double);
+ void line(const position &, const position *, int n,
+ const line_type &);
+ void polygon(const position *, int n,
+ const line_type &, double);
+ void spline(const position &, const position *, int n,
+ const line_type &);
+ void arc(const position &, const position &, const position &,
+ const line_type &);
+ void circle(const position &, double rad, const line_type &, double);
+ void ellipse(const position &, const distance &, const line_type &, double);
+ void command(const char *, const char *, int);
+ void set_color(char *, char *);
+ void reset_color();
+ char *get_last_filled();
+ char *get_outline_color();
+ int supports_filled_polygons();
+private:
+ position upper_left;
+ double height;
+ double width;
+ double scale;
+ double pen_size;
+
+ void point(const position &);
+ void dot(const position &, const line_type &);
+ void solid_arc(const position &cent, double rad, double start_angle,
+ double end_angle, const line_type &lt);
+ position transform(const position &);
+protected:
+ virtual void set_pen_size(double ps);
+};
+
+// convert inches to milliinches
+
+inline int milliinches(double x)
+{
+ return int(x*1000.0 + .5);
+}
+
+inline position tex_output::transform(const position &pos)
+{
+ return position((pos.x - upper_left.x)/scale,
+ (upper_left.y - pos.y)/scale);
+}
+
+output *make_tex_output()
+{
+ return new tex_output;
+}
+
+tex_output::tex_output()
+{
+}
+
+tex_output::~tex_output()
+{
+}
+
+const int DEFAULT_PEN_SIZE = 8;
+
+void tex_output::set_pen_size(double ps)
+{
+ if (ps < 0.0)
+ ps = -1.0;
+ if (ps != pen_size) {
+ pen_size = ps;
+ printf(" \\special{pn %d}%%\n",
+ ps < 0.0 ? DEFAULT_PEN_SIZE : int(ps*(1000.0/72.0) + .5));
+ }
+}
+
+void tex_output::start_picture(double sc, const position &ll,
+ const position &ur)
+{
+ upper_left.x = ll.x;
+ upper_left.y = ur.y;
+ scale = compute_scale(sc, ll, ur);
+ height = (ur.y - ll.y)/scale;
+ width = (ur.x - ll.x)/scale;
+ /* The point of \vskip 0pt is to ensure that the vtop gets
+ a height of 0 rather than the height of the hbox; this
+ might be non-zero if text from text attributes lies outside pic's
+ idea of the bounding box of the picture. */
+ /* \newbox and \newdimen are defined with \outer in plain.tex and can't
+ be used directly in an \if clause. */
+ printf("\\expandafter\\ifx\\csname %s\\endcsname\\relax\n"
+ " \\csname newbox\\expandafter\\endcsname\\csname %s\\endcsname\n"
+ "\\fi\n"
+ "\\ifx\\graphtemp\\undefined\n"
+ " \\csname newdimen\\endcsname\\graphtemp\n"
+ "\\fi\n"
+ "\\expandafter\\setbox\\csname %s\\endcsname\n"
+ " =\\vtop{\\vskip 0pt\\hbox{%%\n",
+ graphname, graphname, graphname);
+ pen_size = -2.0;
+}
+
+void tex_output::finish_picture()
+{
+ printf(" \\hbox{\\vrule depth%.3fin width0pt height 0pt}%%\n"
+ " \\kern %.3fin\n"
+ " }%%\n"
+ "}%%\n",
+ height, width);
+}
+
+void tex_output::text(const position &center, text_piece *v, int n, double)
+{
+ position c = transform(center);
+ for (int i = 0; i < n; i++)
+ if (v[i].text != 0 && *v[i].text != '\0') {
+ int j = 2*i - n + 1;
+ if (v[i].adj.v == ABOVE_ADJUST)
+ j--;
+ else if (v[i].adj.v == BELOW_ADJUST)
+ j++;
+ if (j == 0) {
+ printf(" \\graphtemp=.5ex\n"
+ " \\advance\\graphtemp by %.3fin\n", c.y);
+ }
+ else {
+ printf(" \\graphtemp=\\baselineskip\n"
+ " \\multiply\\graphtemp by %d\n"
+ " \\divide\\graphtemp by 2\n"
+ " \\advance\\graphtemp by .5ex\n"
+ " \\advance\\graphtemp by %.3fin\n",
+ j, c.y);
+ }
+ printf(" \\rlap{\\kern %.3fin\\lower\\graphtemp", c.x);
+ fputs("\\hbox to 0pt{", stdout);
+ if (v[i].adj.h != LEFT_ADJUST)
+ fputs("\\hss ", stdout);
+ fputs(v[i].text, stdout);
+ if (v[i].adj.h != RIGHT_ADJUST)
+ fputs("\\hss", stdout);
+ fputs("}}%\n", stdout);
+ }
+}
+
+void tex_output::point(const position &pos)
+{
+ position p = transform(pos);
+ printf(" \\special{pa %d %d}%%\n", milliinches(p.x), milliinches(p.y));
+}
+
+void tex_output::line(const position &start, const position *v, int n,
+ const line_type &lt)
+{
+ set_pen_size(lt.thickness);
+ point(start);
+ for (int i = 0; i < n; i++)
+ point(v[i]);
+ fputs(" \\special{", stdout);
+ switch(lt.type) {
+ case line_type::invisible:
+ fputs("ip", stdout);
+ break;
+ case line_type::solid:
+ fputs("fp", stdout);
+ break;
+ case line_type::dotted:
+ printf("dt %.3f", lt.dash_width/scale);
+ break;
+ case line_type::dashed:
+ printf("da %.3f", lt.dash_width/scale);
+ break;
+ }
+ fputs("}%\n", stdout);
+}
+
+void tex_output::polygon(const position *v, int n,
+ const line_type &lt, double fill)
+{
+ if (fill >= 0.0) {
+ if (fill > 1.0)
+ fill = 1.0;
+ printf(" \\special{sh %.3f}%%\n", fill);
+ }
+ line(v[n-1], v, n, lt);
+}
+
+void tex_output::spline(const position &start, const position *v, int n,
+ const line_type &lt)
+{
+ if (lt.type == line_type::invisible)
+ return;
+ set_pen_size(lt.thickness);
+ point(start);
+ for (int i = 0; i < n; i++)
+ point(v[i]);
+ fputs(" \\special{sp", stdout);
+ switch(lt.type) {
+ case line_type::solid:
+ break;
+ case line_type::dotted:
+ printf(" %.3f", -lt.dash_width/scale);
+ break;
+ case line_type::dashed:
+ printf(" %.3f", lt.dash_width/scale);
+ break;
+ case line_type::invisible:
+ assert(0);
+ }
+ fputs("}%\n", stdout);
+}
+
+void tex_output::solid_arc(const position &cent, double rad,
+ double start_angle, double end_angle,
+ const line_type &lt)
+{
+ set_pen_size(lt.thickness);
+ position c = transform(cent);
+ printf(" \\special{ar %d %d %d %d %f %f}%%\n",
+ milliinches(c.x),
+ milliinches(c.y),
+ milliinches(rad/scale),
+ milliinches(rad/scale),
+ -end_angle,
+ (-end_angle > -start_angle) ? (double)M_PI * 2 - start_angle
+ : -start_angle);
+}
+
+void tex_output::arc(const position &start, const position &cent,
+ const position &end, const line_type &lt)
+{
+ switch (lt.type) {
+ case line_type::invisible:
+ break;
+ case line_type::dashed:
+ dashed_arc(start, cent, end, lt);
+ break;
+ case line_type::dotted:
+ dotted_arc(start, cent, end, lt);
+ break;
+ case line_type::solid:
+ {
+ position c;
+ if (!compute_arc_center(start, cent, end, &c)) {
+ line(start, &end, 1, lt);
+ break;
+ }
+ solid_arc(c,
+ hypot(cent - start),
+ atan2(start.y - c.y, start.x - c.x),
+ atan2(end.y - c.y, end.x - c.x),
+ lt);
+ break;
+ }
+ }
+}
+
+void tex_output::circle(const position &cent, double rad,
+ const line_type &lt, double fill)
+{
+ if (fill >= 0.0 && lt.type != line_type::solid) {
+ if (fill > 1.0)
+ fill = 1.0;
+ line_type ilt;
+ ilt.type = line_type::invisible;
+ ellipse(cent, position(rad*2.0, rad*2.0), ilt, fill);
+ }
+ switch (lt.type) {
+ case line_type::dashed:
+ dashed_circle(cent, rad, lt);
+ break;
+ case line_type::invisible:
+ break;
+ case line_type::solid:
+ ellipse(cent, position(rad*2.0,rad*2.0), lt, fill);
+ break;
+ case line_type::dotted:
+ dotted_circle(cent, rad, lt);
+ break;
+ default:
+ assert(0);
+ }
+}
+
+void tex_output::ellipse(const position &cent, const distance &dim,
+ const line_type &lt, double fill)
+{
+ if (lt.type == line_type::invisible) {
+ if (fill < 0.0)
+ return;
+ }
+ else
+ set_pen_size(lt.thickness);
+ if (fill >= 0.0) {
+ if (fill > 1.0)
+ fill = 1.0;
+ printf(" \\special{sh %.3f}%%\n", fill);
+ }
+ position c = transform(cent);
+ switch (lt.type) {
+ case line_type::solid:
+ case line_type::invisible:
+ printf(" \\special{%s %d %d %d %d 0 6.28319}%%\n",
+ (lt.type == line_type::invisible ? "ia" : "ar"),
+ milliinches(c.x),
+ milliinches(c.y),
+ milliinches(dim.x/(2.0*scale)),
+ milliinches(dim.y/(2.0*scale)));
+ break;
+ case line_type::dashed:
+ dashed_ellipse(cent, dim / scale, lt);
+ break;
+ case line_type::dotted:
+ dotted_ellipse(cent, dim / scale, lt);
+ break;
+ default:
+ assert(0);
+ }
+}
+
+void tex_output::command(const char *s, const char *, int)
+{
+ fputs(s, stdout);
+ putchar('%'); // avoid unwanted spaces
+ putchar('\n');
+}
+
+int tex_output::supports_filled_polygons()
+{
+ return 1;
+}
+
+void tex_output::dot(const position &pos, const line_type &lt)
+{
+ if (zero_length_line_flag) {
+ line_type slt = lt;
+ slt.type = line_type::solid;
+ line(pos, &pos, 1, slt);
+ }
+ else {
+ int dot_rad = int(lt.thickness*(1000.0/(72.0*2)) + .5);
+ if (dot_rad == 0)
+ dot_rad = 1;
+ position p = transform(pos);
+ printf(" \\special{sh 1}%%\n"
+ " \\special{ia %d %d %d %d 0 6.28319}%%\n",
+ milliinches(p.x), milliinches(p.y), dot_rad, dot_rad);
+ }
+}
+
+void tex_output::set_color(char *, char *)
+{
+ /* not implemented yet */
+}
+
+void tex_output::reset_color()
+{
+ /* not implemented yet */
+}
+
+char *tex_output::get_last_filled()
+{
+ /* not implemented yet */
+ return NULL;
+}
+
+char *tex_output::get_outline_color()
+{
+ /* not implemented yet */
+ return NULL;
+}
+
+class tpic_output : public tex_output {
+public:
+ tpic_output();
+ void command(const char *, const char *, int);
+private:
+ void set_pen_size(double ps);
+ int default_pen_size;
+ int prev_default_pen_size;
+};
+
+tpic_output::tpic_output()
+: default_pen_size(DEFAULT_PEN_SIZE), prev_default_pen_size(DEFAULT_PEN_SIZE)
+{
+}
+
+void tpic_output::command(const char *s, const char *filename, int lineno)
+{
+ assert(s[0] == '.');
+ if (s[1] == 'p' && s[2] == 's' && (s[3] == '\0' || !csalpha(s[3]))) {
+ const char *p = s + 3;
+ while (csspace(*p))
+ p++;
+ if (*p == '\0') {
+ int temp = default_pen_size;
+ default_pen_size = prev_default_pen_size;
+ prev_default_pen_size = temp;
+ }
+ else {
+ char *ptr;
+ int temp = (int)strtol(p, &ptr, 10);
+ if (temp == 0 && ptr == p)
+ error_with_file_and_line(filename, lineno,
+ "argument to '.ps' not an integer");
+ else if (temp < 0)
+ error_with_file_and_line(filename, lineno,
+ "negative pen size");
+ else {
+ prev_default_pen_size = default_pen_size;
+ default_pen_size = temp;
+ }
+ }
+ }
+ else
+ printf("\\%s%%\n", s + 1);
+}
+
+void tpic_output::set_pen_size(double ps)
+{
+ if (ps < 0.0)
+ printf(" \\special{pn %d}%%\n", default_pen_size);
+ else
+ tex_output::set_pen_size(ps);
+}
+
+output *make_tpic_output()
+{
+ return new tpic_output;
+}
+
+#endif
diff --git a/src/preproc/pic/text.h b/src/preproc/pic/text.h
new file mode 100644
index 0000000..9b9353f
--- /dev/null
+++ b/src/preproc/pic/text.h
@@ -0,0 +1,46 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+enum hadjustment {
+ CENTER_ADJUST,
+ LEFT_ADJUST,
+ RIGHT_ADJUST
+ };
+
+enum vadjustment {
+ NONE_ADJUST,
+ ABOVE_ADJUST,
+ BELOW_ADJUST
+ };
+
+struct adjustment {
+ hadjustment h;
+ vadjustment v;
+};
+
+struct text_piece {
+ char *text;
+ adjustment adj;
+ const char *filename;
+ int lineno;
+
+ text_piece();
+ ~text_piece();
+};
diff --git a/src/preproc/pic/troff.cpp b/src/preproc/pic/troff.cpp
new file mode 100644
index 0000000..3dc87a7
--- /dev/null
+++ b/src/preproc/pic/troff.cpp
@@ -0,0 +1,579 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "pic.h"
+#include "common.h"
+
+
+const double RELATIVE_THICKNESS = -1.0;
+const double BAD_THICKNESS = -2.0;
+
+class simple_output : public common_output {
+ virtual void simple_line(const position &, const position &) = 0;
+ virtual void simple_spline(const position &, const position *, int n) = 0;
+ virtual void simple_arc(const position &, const position &,
+ const position &) = 0;
+ virtual void simple_circle(int, const position &, double rad) = 0;
+ virtual void simple_ellipse(int, const position &, const distance &) = 0;
+ virtual void simple_polygon(int, const position *, int) = 0;
+ virtual void line_thickness(double) = 0;
+ virtual void set_fill(double) = 0;
+ virtual void set_color(char *, char *) = 0;
+ virtual void reset_color() = 0;
+ virtual char *get_last_filled() = 0;
+ void dot(const position &, const line_type &) = 0;
+public:
+ void start_picture(double sc, const position &ll, const position &ur) = 0;
+ void finish_picture() = 0;
+ void text(const position &, text_piece *, int, double) = 0;
+ void line(const position &, const position *, int n,
+ const line_type &);
+ void polygon(const position *, int n,
+ const line_type &, double);
+ void spline(const position &, const position *, int n,
+ const line_type &);
+ void arc(const position &, const position &, const position &,
+ const line_type &);
+ void circle(const position &, double rad, const line_type &, double);
+ void ellipse(const position &, const distance &, const line_type &, double);
+ int supports_filled_polygons();
+};
+
+int simple_output::supports_filled_polygons()
+{
+ return driver_extension_flag != 0;
+}
+
+void simple_output::arc(const position &start, const position &cent,
+ const position &end, const line_type &lt)
+{
+ switch (lt.type) {
+ case line_type::solid:
+ line_thickness(lt.thickness);
+ simple_arc(start, cent, end);
+ break;
+ case line_type::invisible:
+ break;
+ case line_type::dashed:
+ dashed_arc(start, cent, end, lt);
+ break;
+ case line_type::dotted:
+ dotted_arc(start, cent, end, lt);
+ break;
+ }
+}
+
+void simple_output::line(const position &start, const position *v, int n,
+ const line_type &lt)
+{
+ position pos = start;
+ line_thickness(lt.thickness);
+ for (int i = 0; i < n; i++) {
+ switch (lt.type) {
+ case line_type::solid:
+ simple_line(pos, v[i]);
+ break;
+ case line_type::dotted:
+ {
+ distance vec(v[i] - pos);
+ double dist = hypot(vec);
+ int ndots = int(dist/lt.dash_width + .5);
+ if (ndots == 0)
+ dot(pos, lt);
+ else {
+ vec /= double(ndots);
+ for (int j = 0; j <= ndots; j++)
+ dot(pos + vec*j, lt);
+ }
+ }
+ break;
+ case line_type::dashed:
+ {
+ distance vec(v[i] - pos);
+ double dist = hypot(vec);
+ if (dist <= lt.dash_width*2.0)
+ simple_line(pos, v[i]);
+ else {
+ int ndashes = int((dist - lt.dash_width)/(lt.dash_width*2.0) + .5);
+ distance dash_vec = vec*(lt.dash_width/dist);
+ double dash_gap = (dist - lt.dash_width)/ndashes;
+ distance dash_gap_vec = vec*(dash_gap/dist);
+ for (int j = 0; j <= ndashes; j++) {
+ position s(pos + dash_gap_vec*j);
+ simple_line(s, s + dash_vec);
+ }
+ }
+ }
+ break;
+ case line_type::invisible:
+ break;
+ default:
+ assert(0);
+ }
+ pos = v[i];
+ }
+}
+
+void simple_output::spline(const position &start, const position *v, int n,
+ const line_type &lt)
+{
+ line_thickness(lt.thickness);
+ simple_spline(start, v, n);
+}
+
+void simple_output::polygon(const position *v, int n,
+ const line_type &lt, double fill)
+{
+ if (driver_extension_flag && ((fill >= 0.0) || (get_last_filled() != 0))) {
+ if (get_last_filled() == 0)
+ set_fill(fill);
+ simple_polygon(1, v, n);
+ }
+ if (lt.type == line_type::solid && driver_extension_flag) {
+ line_thickness(lt.thickness);
+ simple_polygon(0, v, n);
+ }
+ else if (lt.type != line_type::invisible) {
+ line_thickness(lt.thickness);
+ line(v[n - 1], v, n, lt);
+ }
+}
+
+void simple_output::circle(const position &cent, double rad,
+ const line_type &lt, double fill)
+{
+ if (driver_extension_flag && ((fill >= 0.0) || (get_last_filled() != 0))) {
+ if (get_last_filled() == 0)
+ set_fill(fill);
+ simple_circle(1, cent, rad);
+ }
+ line_thickness(lt.thickness);
+ switch (lt.type) {
+ case line_type::invisible:
+ break;
+ case line_type::dashed:
+ dashed_circle(cent, rad, lt);
+ break;
+ case line_type::dotted:
+ dotted_circle(cent, rad, lt);
+ break;
+ case line_type::solid:
+ simple_circle(0, cent, rad);
+ break;
+ default:
+ assert(0);
+ }
+}
+
+void simple_output::ellipse(const position &cent, const distance &dim,
+ const line_type &lt, double fill)
+{
+ if (driver_extension_flag && ((fill >= 0.0) || (get_last_filled() != 0))) {
+ if (get_last_filled() == 0)
+ set_fill(fill);
+ simple_ellipse(1, cent, dim);
+ }
+ if (lt.type != line_type::invisible)
+ line_thickness(lt.thickness);
+ switch (lt.type) {
+ case line_type::invisible:
+ break;
+ case line_type::dotted:
+ dotted_ellipse(cent, dim, lt);
+ break;
+ case line_type::dashed:
+ dashed_ellipse(cent, dim, lt);
+ break;
+ case line_type::solid:
+ simple_ellipse(0, cent, dim);
+ break;
+ default:
+ assert(0);
+ }
+}
+
+class troff_output : public simple_output {
+ const char *last_filename;
+ position upper_left;
+ double height;
+ double scale;
+ double last_line_thickness;
+ double last_fill;
+ char *last_filled; // color
+ char *last_outlined; // color
+public:
+ troff_output();
+ ~troff_output();
+ void start_picture(double, const position &ll, const position &ur);
+ void finish_picture();
+ void text(const position &, text_piece *, int, double);
+ void dot(const position &, const line_type &);
+ void command(const char *, const char *, int);
+ void set_location(const char *, int);
+ void simple_line(const position &, const position &);
+ void simple_spline(const position &, const position *, int n);
+ void simple_arc(const position &, const position &, const position &);
+ void simple_circle(int, const position &, double rad);
+ void simple_ellipse(int, const position &, const distance &);
+ void simple_polygon(int, const position *, int);
+ void line_thickness(double p);
+ void set_fill(double);
+ void set_color(char *, char *);
+ void reset_color();
+ char *get_last_filled();
+ char *get_outline_color();
+ position transform(const position &);
+};
+
+output *make_troff_output()
+{
+ return new troff_output;
+}
+
+troff_output::troff_output()
+: last_filename(0), last_line_thickness(BAD_THICKNESS),
+ last_fill(-1.0), last_filled(0), last_outlined(0)
+{
+}
+
+troff_output::~troff_output()
+{
+ free((char *)last_filename);
+}
+
+inline position troff_output::transform(const position &pos)
+{
+ return position((pos.x - upper_left.x)/scale,
+ (upper_left.y - pos.y)/scale);
+}
+
+#define FILL_REG "00"
+
+// If this register > 0, then pic will generate \X'ps: ...' commands
+// if the aligned attribute is used.
+#define GROPS_REG "0p"
+
+// If this register is defined, geqn won't produce '\x's.
+#define EQN_NO_EXTRA_SPACE_REG "0x"
+
+void troff_output::start_picture(double sc,
+ const position &ll, const position &ur)
+{
+ upper_left.x = ll.x;
+ upper_left.y = ur.y;
+ scale = compute_scale(sc, ll, ur);
+ height = (ur.y - ll.y)/scale;
+ double width = (ur.x - ll.x)/scale;
+ printf(".PS %.3fi %.3fi", height, width);
+ if (args)
+ printf(" %s\n", args);
+ else
+ putchar('\n');
+ printf(".\\\" %g %g %g %g\n", ll.x, ll.y, ur.x, ur.y);
+ printf(".\\\" %.3fi %.3fi %.3fi %.3fi\n", 0.0, height, width, 0.0);
+ printf(".nr " FILL_REG " \\n(.u\n.nf\n");
+ printf(".nr " EQN_NO_EXTRA_SPACE_REG " 1\n");
+ // This guarantees that if the picture is used in a diversion it will
+ // have the right width.
+ printf("\\h'%.3fi'\n.sp -1\n", width);
+}
+
+void troff_output::finish_picture()
+{
+ line_thickness(BAD_THICKNESS);
+ last_fill = -1.0; // force it to be reset for each picture
+ reset_color();
+ if (!(want_flyback || want_alternate_flyback))
+ printf(".sp %.3fi+1\n", height);
+ printf(".if \\n(" FILL_REG " .fi\n");
+ printf(".br\n");
+ printf(".nr " EQN_NO_EXTRA_SPACE_REG " 0\n");
+ // this is a little gross
+ set_location(current_filename, current_lineno);
+ if (want_flyback)
+ fputs(".PF\n", stdout);
+ else if (want_alternate_flyback)
+ fputs(".PY\n", stdout);
+ else
+ fputs(".PE\n", stdout);
+}
+
+void troff_output::command(const char *s,
+ const char *filename, int lineno)
+{
+ if (filename != 0)
+ set_location(filename, lineno);
+ fputs(s, stdout);
+ putchar('\n');
+}
+
+void troff_output::simple_circle(int filled, const position &cent, double rad)
+{
+ position c = transform(cent);
+ printf("\\h'%.3fi'"
+ "\\v'%.3fi'"
+ "\\D'%c %.3fi'"
+ "\n.sp -1\n",
+ c.x - rad/scale,
+ c.y,
+ (filled ? 'C' : 'c'),
+ rad*2.0/scale);
+}
+
+void troff_output::simple_ellipse(int filled, const position &cent,
+ const distance &dim)
+{
+ position c = transform(cent);
+ printf("\\h'%.3fi'"
+ "\\v'%.3fi'"
+ "\\D'%c %.3fi %.3fi'"
+ "\n.sp -1\n",
+ c.x - dim.x/(2.0*scale),
+ c.y,
+ (filled ? 'E' : 'e'),
+ dim.x/scale, dim.y/scale);
+}
+
+void troff_output::simple_arc(const position &start, const distance &cent,
+ const distance &end)
+{
+ position s = transform(start);
+ position c = transform(cent);
+ distance cv = c - s;
+ distance ev = transform(end) - c;
+ printf("\\h'%.3fi'"
+ "\\v'%.3fi'"
+ "\\D'a %.3fi %.3fi %.3fi %.3fi'"
+ "\n.sp -1\n",
+ s.x, s.y, cv.x, cv.y, ev.x, ev.y);
+}
+
+void troff_output::simple_line(const position &start, const position &end)
+{
+ position s = transform(start);
+ distance ev = transform(end) - s;
+ printf("\\h'%.3fi'"
+ "\\v'%.3fi'"
+ "\\D'l %.3fi %.3fi'"
+ "\n.sp -1\n",
+ s.x, s.y, ev.x, ev.y);
+}
+
+void troff_output::simple_spline(const position &start,
+ const position *v, int n)
+{
+ position pos = transform(start);
+ printf("\\h'%.3fi'"
+ "\\v'%.3fi'",
+ pos.x, pos.y);
+ fputs("\\D'~ ", stdout);
+ for (int i = 0; i < n; i++) {
+ position temp = transform(v[i]);
+ distance d = temp - pos;
+ pos = temp;
+ if (i != 0)
+ putchar(' ');
+ printf("%.3fi %.3fi", d.x, d.y);
+ }
+ printf("'\n.sp -1\n");
+}
+
+// a solid polygon
+
+void troff_output::simple_polygon(int filled, const position *v, int n)
+{
+ position pos = transform(v[0]);
+ printf("\\h'%.3fi'"
+ "\\v'%.3fi'",
+ pos.x, pos.y);
+ printf("\\D'%c ", (filled ? 'P' : 'p'));
+ for (int i = 1; i < n; i++) {
+ position temp = transform(v[i]);
+ distance d = temp - pos;
+ pos = temp;
+ if (i != 1)
+ putchar(' ');
+ printf("%.3fi %.3fi", d.x, d.y);
+ }
+ printf("'\n.sp -1\n");
+}
+
+const double TEXT_AXIS = 0.22; // in ems
+
+static const char *choose_delimiter(const char *text)
+{
+ if (strchr(text, '\'') == 0)
+ return "'";
+ else
+ return "\\(ts";
+}
+
+void troff_output::text(const position &center, text_piece *v, int n,
+ double ang)
+{
+ line_thickness(BAD_THICKNESS); // text might use lines (e.g., in equations)
+ int rotate_flag = 0;
+ if (driver_extension_flag && ang != 0.0) {
+ rotate_flag = 1;
+ position c = transform(center);
+ printf(".if \\n(" GROPS_REG " \\{\\\n"
+ "\\h'%.3fi'"
+ "\\v'%.3fi'"
+ "\\X'ps: exec gsave currentpoint 2 copy translate %.4f rotate neg exch neg exch translate'"
+ "\n.sp -1\n"
+ ".\\}\n",
+ c.x, c.y, -ang*180.0/M_PI);
+ }
+ for (int i = 0; i < n; i++)
+ if (v[i].text != 0 && *v[i].text != '\0') {
+ position c = transform(center);
+ if (v[i].filename != 0)
+ set_location(v[i].filename, v[i].lineno);
+ printf("\\h'%.3fi", c.x);
+ const char *delim = choose_delimiter(v[i].text);
+ if (v[i].adj.h == RIGHT_ADJUST)
+ printf("-\\w%s%s%su", delim, v[i].text, delim);
+ else if (v[i].adj.h != LEFT_ADJUST)
+ printf("-(\\w%s%s%su/2u)", delim, v[i].text, delim);
+ putchar('\'');
+ printf("\\v'%.3fi-(%dv/2u)+%dv+%.2fm",
+ c.y,
+ n - 1,
+ i,
+ TEXT_AXIS);
+ if (v[i].adj.v == ABOVE_ADJUST)
+ printf("-.5v");
+ else if (v[i].adj.v == BELOW_ADJUST)
+ printf("+.5v");
+ putchar('\'');
+ fputs(v[i].text, stdout);
+ fputs("\n.sp -1\n", stdout);
+ }
+ if (rotate_flag)
+ printf(".if \\n(" GROPS_REG " \\{\\\n"
+ "\\X'ps: exec grestore'\n.sp -1\n"
+ ".\\}\n");
+}
+
+void troff_output::line_thickness(double p)
+{
+ if (p < 0.0)
+ p = RELATIVE_THICKNESS;
+ if (driver_extension_flag && p != last_line_thickness) {
+ printf("\\D't %.3fp'\\h'%.3fp'\n.sp -1\n", p, -p);
+ last_line_thickness = p;
+ }
+}
+
+void troff_output::set_fill(double f)
+{
+ if (driver_extension_flag && f != last_fill) {
+ // \D'Fg ...' emits a node only in compatibility mode,
+ // thus we add a dummy node
+ printf("\\&\\D'Fg %.3f'\n.sp -1\n", 1.0 - f);
+ last_fill = f;
+ }
+ if (last_filled) {
+ free(last_filled);
+ last_filled = 0;
+ printf(".fcolor\n");
+ }
+}
+
+void troff_output::set_color(char *color_fill, char *color_outlined)
+{
+ if (driver_extension_flag) {
+ if (last_filled || last_outlined) {
+ reset_color();
+ }
+ // .gcolor and .fcolor emit a node in compatibility mode only,
+ // but that won't work anyway
+ if (color_fill) {
+ printf(".fcolor %s\n", color_fill);
+ last_filled = strsave(color_fill);
+ }
+ if (color_outlined) {
+ printf(".gcolor %s\n", color_outlined);
+ last_outlined = strsave(color_outlined);
+ }
+ }
+}
+
+void troff_output::reset_color()
+{
+ if (driver_extension_flag) {
+ if (last_filled) {
+ printf(".fcolor\n");
+ free(last_filled);
+ last_filled = 0;
+ }
+ if (last_outlined) {
+ printf(".gcolor\n");
+ free(last_outlined);
+ last_outlined = 0;
+ }
+ }
+}
+
+char *troff_output::get_last_filled()
+{
+ return last_filled;
+}
+
+char *troff_output::get_outline_color()
+{
+ return last_outlined;
+}
+
+const double DOT_AXIS = .044;
+
+void troff_output::dot(const position &cent, const line_type &lt)
+{
+ if (driver_extension_flag) {
+ line_thickness(lt.thickness);
+ simple_line(cent, cent);
+ }
+ else {
+ position c = transform(cent);
+ printf("\\h'%.3fi-(\\w'.'u/2u)'"
+ "\\v'%.3fi+%.2fm'"
+ ".\n.sp -1\n",
+ c.x,
+ c.y,
+ DOT_AXIS);
+ }
+}
+
+void troff_output::set_location(const char *s, int n)
+{
+ if (last_filename != 0 && strcmp(s, last_filename) == 0)
+ printf(".lf %d\n", n);
+ else {
+ printf(".lf %d %s\n", n, s);
+ char *lfn = strdup(s);
+ if (0 == lfn)
+ fatal("memory allocation failure while copying file name");
+ last_filename = lfn;
+ }
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/preconv/preconv.1.man b/src/preproc/preconv/preconv.1.man
new file mode 100644
index 0000000..1535bae
--- /dev/null
+++ b/src/preproc/preconv/preconv.1.man
@@ -0,0 +1,559 @@
+.TH preconv @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+preconv \- prepare files for typesetting with
+.I groff
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2006-2020 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_preconv_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY preconv
+.RB [ \-dr ]
+.RB [ \-D\~\c
+.IR fallback-encoding ]
+.RB [ \-e\~\c
+.IR encoding ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY preconv
+.B \-h
+.
+.SY preconv
+.B \-\-help
+.YS
+.
+.
+.SY preconv
+.B \-v
+.
+.SY preconv
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I preconv
+reads each
+.IR file ,
+converts its encoded characters to a form
+.MR @g@troff @MAN1EXT@
+can interpret,
+and sends the result to the standard output stream.
+.
+Currently,
+this means that code points in the range 0\[en]127
+(in US-ASCII,
+ISO\~8859,
+or Unicode)
+remain as-is and the remainder are converted to the
+.I groff
+special character form
+.RB \[lq] \[rs][\c
+.BI u XXXX ]\c
+\[rq],
+where
+.I XXXX
+is a hexadecimal number of four to six digits corresponding to a Unicode
+code point.
+.
+By default,
+.I preconv
+also inserts a
+.I roff
+.B .lf
+request at the beginning of each
+.IR file ,
+identifying it for the benefit of later processing
+(including diagnostic messages);
+the
+.B \-r
+option suppresses this behavior.
+.
+.
+.PP
+In typical usage scenarios,
+.I preconv
+need not be run directly;
+instead it should be invoked with the
+.B \-k
+or
+.B \-K
+options of
+.IR groff .
+.
+If no
+.I file
+operands are given on the command line,
+or if
+.I file
+is
+.RB \[lq] \- \[rq],
+the standard input stream is read.
+.
+.
+.PP
+.I preconv
+tries to find the input encoding with the following algorithm,
+stopping at the first success.
+.
+.
+.IP 1. 4n
+If the input encoding has been explicitly specified with option
+.BR \-e ,
+use it.
+.
+.
+.IP 2.
+If the input starts with a Unicode Byte Order Mark,
+determine the encoding as UTF-8,
+UTF-16,
+or UTF-32 accordingly.
+.
+.
+.IP 3.
+If the input stream is seekable,
+check the first and second input lines for a recognized GNU\~Emacs
+file-local variable identifying the character encoding,
+here referred to as the \[lq]coding tag\[rq] for brevity.
+.
+If found,
+use it.
+.
+.
+.IP 4.
+If the input stream is seekable,
+and if the
+.I uchardet
+library is available on the system,
+use it to try to infer the encoding of the file.
+.
+.
+.IP 5.
+If the
+.B \-D
+option specifies an encoding,
+use it.
+.
+.
+.IP 6.
+Use the encoding specified by the current locale
+.RI ( LC_CTYPE ),
+unless the locale is
+\[lq]C\[rq],
+\[lq]POSIX\[rq],
+or empty,
+in which case assume Latin-1
+(ISO\~8859-1).
+.
+.
+.PP
+The coding tag and
+.I uchardet
+methods in the above procedure rely upon a seekable input stream;
+when
+.I preconv
+reads from a pipe,
+the stream is not seekable,
+and these detection methods are skipped.
+.
+If character encoding detection of your input files is unreliable,
+arrange for one of the other methods to succeed by using
+.IR preconv 's
+.B \-D
+or
+.B \-e
+options,
+or by configuring your locale appropriately.
+.
+.I groff
+also supports a
+.I \%GROFF_ENCODING
+environment variable,
+which can be overridden by its
+.B \-K
+option.
+.
+Valid values for
+(or parameters to)
+all of these are enumerated in the lists of recognized coding tags in
+the next subsection,
+and are further influenced by
+.I iconv
+library support.
+.
+.
+.\" ====================================================================
+.SS "Coding tags"
+.\" ====================================================================
+.
+Text editors that support more than a single character encoding need
+tags within the input files to mark the file's encoding.
+.
+While it is possible to guess the right input encoding with the help of
+heuristics that are reliable for a preponderance of natural language
+texts,
+they are not absolutely reliable.
+.
+Heuristics can fail on inputs that are too short or don't represent a
+natural language.
+.
+.
+.PP
+Consequently,
+.I preconv
+supports the coding tag convention used by GNU\~Emacs
+(with some restrictions).
+.
+This notation appears in specially marked regions of an input file
+designated for \[lq]file-local variables\[rq].
+.
+.
+.PP
+.I preconv
+interprets the following syntax if it occurs in a
+.I roff
+comment
+in the first or second line of the input file.
+.
+Both \[lq]\[rs]"\[rq] and \[lq]\[rs]#\[rq] comment forms are recognized,
+but the control
+(or no-break control)
+character must be the default and must begin the line.
+.
+Similarly,
+the escape character must be the default.
+.
+.
+.RS
+.EX
+.B \-*\- \c
+.RB [.\|.\|. ; ]\~\c
+.B coding: \c
+.I encoding\c
+.RB [ ;\~ .\|.\|.\&]\~\c
+.B \-*\-
+.EE
+.RE
+.
+.
+.PP
+The only variable
+.I preconv
+interprets is \[lq]coding\[rq],
+which can take the values listed below.
+.
+.
+.PP
+The following list comprises all MIME \[lq]charset\[rq] parameter values
+recognized,
+case-insensitively,
+by
+.IR preconv .
+.
+.RS
+\%big5,
+\%cp1047,
+\%euc\-jp,
+\%euc\-kr,
+\%gb2312,
+\%iso\-8859\-1,
+\%iso\-8859\-2,
+\%iso\-8859\-5,
+\%iso\-8859\-7,
+\%iso\-8859\-9,
+\%iso\-8859\-13,
+\%iso\-8859\-15,
+\%koi8\-r,
+\%us\-ascii,
+\%utf\-8,
+\%utf\-16,
+\%utf\-16be,
+\%utf\-16le
+.RE
+.
+.
+.PP
+In addition,
+the following list of other coding tags is recognized,
+each of which is mapped to an appropriate value from the list above.
+.
+.RS
+\%ascii,
+\%chinese\-big5,
+\%chinese\-euc,
+\%chinese\-iso\-8bit,
+\%cn\-big5,
+\%cn\-gb,
+\%cn\-gb\-2312,
+\%cp878,
+\%csascii,
+\%csisolatin1,
+\%cyrillic\-iso\-8bit,
+\%cyrillic\-koi8,
+\%euc\-china,
+\%euc\-cn,
+\%euc\-japan,
+\%euc\-japan\-1990,
+\%euc\-korea,
+\%greek\-iso\-8bit,
+\%iso\-10646/utf8,
+\%iso\-10646/utf\-8,
+\%iso\-latin\-1,
+\%iso\-latin\-2,
+\%iso\-latin\-5,
+\%iso\-latin\-7,
+\%iso\-latin\-9,
+\%japanese\-euc,
+\%japanese\-iso\-8bit,
+\%jis8,
+\%koi8,
+\%korean\-euc,
+\%korean\-iso\-8bit,
+\%latin\-0,
+\%latin1,
+\%latin\-1,
+\%latin\-2,
+\%latin\-5,
+\%latin\-7,
+\%latin\-9,
+\%mule\-utf\-8,
+\%mule\-utf\-16,
+\%mule\-utf\-16be,
+\%mule\-utf\-16\-be,
+\%mule\-utf\-16be\-with\-signature,
+\%mule\-utf\-16le,
+\%mule\-utf\-16\-le,
+\%mule\-utf\-16le\-with\-signature,
+\%utf8,
+\%utf\-16\-be,
+\%utf\-16\-be\-with\-signature,
+\%utf\-16be\-with\-signature,
+\%utf\-16\-le,
+\%utf\-16\-le\-with\-signature,
+\%utf\-16le\-with\-signature
+.RE
+.
+.
+.PP
+Trailing
+\[lq]\-dos\[rq],
+\[lq]\-unix\[rq],
+and
+\[lq]\-mac\[rq]
+suffixes on coding tags
+(which indicate the end-of-line convention used in the file)
+are disregarded for the purpose of comparison with the above tags.
+.
+.
+.\" ====================================================================
+.SS "\f[I]iconv\f[] support"
+.\" ====================================================================
+.
+While
+.I preconv
+recognizes all of the coding tags listed above,
+it is capable on its own of interpreting only three encodings:
+Latin-1,
+code page 1047,
+and UTF-8.
+.
+If
+.I iconv
+support is configured at compile time and available at run time,
+all others are passed to
+.I iconv
+library functions,
+which may recognize many additional encoding strings.
+.
+The command
+.RB \[lq] preconv\~\-v \[rq]
+discloses whether
+.I iconv
+support is configured.
+.
+.
+.PP
+The use of
+.I iconv
+means that characters in the input that encode invalid code points for
+that encoding may be dropped from the output stream or mapped to the
+Unicode replacement character
+(U+FFFD).
+.
+Compare the following examples using the input \[lq]caf\['e]\[rq]
+(note the \[lq]e\[rq] with an acute accent),
+which due to its short length challenges inference of the encoding used.
+.
+.RS
+.EX
+printf \[aq]caf\[rs]351\[rs]n\[aq] | LC_ALL=en_US.UTF\-8 preconv
+printf \[aq]caf\[rs]351\[rs]n\[aq] | preconv \-e us\-ascii
+printf \[aq]caf\[rs]351\[rs]n\[aq] | preconv \-e latin\-1
+.EE
+.RE
+.
+The fate of the accented \[lq]e\[rq] differs in each case.
+.
+In the first,
+.I uchardet
+fails to detect an encoding
+(though the library on your system may behave differently)
+and
+.I preconv
+falls back to the locale settings,
+where octal 351 starts an incomplete UTF-8 sequence and results in the
+Unicode replacement character.
+.
+In the second,
+it is not a representable character in the declared input encoding of
+US-ASCII and is discarded by
+.IR iconv .
+.
+In the last,
+it is correctly detected and mapped.
+.
+.
+.\" ====================================================================
+.SS Limitations
+.\" ====================================================================
+.
+.I preconv
+cannot perform any transformation on input that it cannot see.
+.
+Examples include files that are interpolated by preprocessors that run
+subsequently,
+including
+.MR @g@soelim @MAN1EXT@ ;
+files included by
+.I @g@troff
+itself through
+.RB \[lq] so \[rq]
+and similar requests;
+and string definitions passed to
+.I @g@troff
+through its
+.B \-d
+command-line option.
+.
+.
+.P
+.I preconv
+assumes that its input uses the default escape character,
+a backslash
+.BR \[rs] ,
+and writes special character escape sequences accordingly.
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-h
+and
+.B \-\-help
+display a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.B \-d
+Emit debugging messages to the standard error stream.
+.
+.
+.TP
+.BI \-D\~ fallback-encoding
+Report
+.I fallback-encoding
+if all detection methods fail.
+.
+.
+.TP
+.BI \-e\~ encoding
+Skip detection and assume
+.IR encoding ;
+see
+.IR groff 's
+.B \-K
+option.
+.
+.
+.TP
+.B \-r
+Write files \[lq]raw\[rq];
+do not add
+.B .lf
+requests.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.MR groff @MAN1EXT@ ,
+.MR iconv 3 ,
+.MR locale 7
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_preconv_1_man_C]
+.do rr *groff_preconv_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/preproc/preconv/preconv.am b/src/preproc/preconv/preconv.am
new file mode 100644
index 0000000..199ff66
--- /dev/null
+++ b/src/preproc/preconv/preconv.am
@@ -0,0 +1,37 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+bin_PROGRAMS += preconv
+preconv_LDADD = libgroff.a $(LIBM) $(LIBICONV) $(UCHARDET_LIBS) \
+ lib/libgnu.a
+preconv_SOURCES = src/preproc/preconv/preconv.cpp
+preconv_CPPFLAGS = $(AM_CPPFLAGS) $(UCHARDET_CFLAGS)
+man1_MANS += src/preproc/preconv/preconv.1
+EXTRA_DIST += src/preproc/preconv/preconv.1.man
+
+preconv_TESTS = \
+ src/preproc/preconv/tests/do-not-seek-the-unseekable.sh \
+ src/preproc/preconv/tests/smoke-test.sh
+TESTS += $(preconv_TESTS)
+EXTRA_DIST += $(preconv_TESTS)
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/preproc/preconv/preconv.cpp b/src/preproc/preconv/preconv.cpp
new file mode 100644
index 0000000..d403425
--- /dev/null
+++ b/src/preproc/preconv/preconv.cpp
@@ -0,0 +1,1318 @@
+/* Copyright (C) 2005-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <assert.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/stat.h>
+#ifdef HAVE_UCHARDET
+#include <uchardet/uchardet.h>
+#endif
+
+#include "errarg.h"
+#include "error.h"
+#include "localcharset.h"
+#include "nonposix.h"
+#include "stringclass.h"
+#include "lf.h"
+
+#include <locale.h>
+
+#if HAVE_ICONV
+# include <iconv.h>
+# ifdef WORDS_BIGENDIAN
+# define UNICODE "UTF-32BE"
+# else
+# define UNICODE "UTF-32LE"
+# endif
+#endif
+
+#define MAX_VAR_LEN 100
+
+extern "C" const char *Version_string;
+
+char fallback_encoding[MAX_VAR_LEN];
+char user_encoding[MAX_VAR_LEN];
+char encoding_string[MAX_VAR_LEN];
+bool is_debugging = false;
+int raw_flag = 0;
+
+struct conversion {
+ const char *from;
+ const char *to;
+};
+
+// The official list of MIME tags can be found at
+//
+// http://www.iana.org/assignments/character-sets
+//
+// For encodings which don't have a MIME tag we use GNU iconv's encoding
+// names (which also work with the portable GNU libiconv package). They
+// are marked with '*'.
+//
+// Encodings specific to XEmacs and Emacs are marked as such; no mark means
+// that they are used by both Emacs and XEmacs.
+//
+// Encodings marked with '--' are special to Emacs, XEmacs, or other
+// applications and shouldn't be used for data exchange.
+//
+// 'Not covered' means that the encoding can be handled neither by GNU iconv
+// nor by libiconv, or just one of them has support for it.
+//
+// A special case is VIQR encoding: Despite of having a MIME tag it is
+// missing in both libiconv 1.10 and iconv (coming with GNU libc 2.3.6).
+//
+// Finally, we add all aliases of GNU iconv for 'ascii', 'latin1', and
+// 'utf8' to catch those encoding names before iconv is called.
+//
+// Note that most entries are commented out -- only a small, (rather)
+// reliable and stable subset of encodings is recognized (for coding tags)
+// which are still in greater use today (January 2006). Most notably, all
+// Windows-specific encodings are not selected because they lack stability:
+// Microsoft has changed the mappings instead of creating new versions.
+//
+// Please contact the groff list if you find the selection inadequate.
+
+static const conversion
+emacs_to_mime[] = {
+ {"ascii", "US-ASCII"}, // Emacs
+ {"big5", "Big5"},
+ {"chinese-big5", "Big5"}, // Emacs
+ {"chinese-euc", "GB2312"}, // XEmacs
+ {"chinese-iso-8bit", "GB2312"}, // Emacs
+ {"cn-big5", "Big5"},
+ {"cn-gb", "GB2312"}, // Emacs
+ {"cn-gb-2312", "GB2312"},
+ {"cp878", "KOI8-R"}, // Emacs
+ {"cp1047", "CP1047"}, // EBCDIC
+ {"csascii", "US-ASCII"}, // alias
+ {"csisolatin1", "ISO-8859-1"}, // alias
+ {"cyrillic-iso-8bit", "ISO-8859-5"}, // Emacs
+ {"cyrillic-koi8", "KOI8-R"}, // not KOI8!, Emacs
+ {"euc-china", "GB2312"}, // Emacs
+ {"euc-cn", "GB2312"}, // Emacs
+ {"euc-japan", "EUC-JP"},
+ {"euc-japan-1990", "EUC-JP"}, // Emacs
+ {"euc-jp", "EUC-JP"},
+ {"euc-korea", "EUC-KR"},
+ {"euc-kr", "EUC-KR"},
+ {"gb2312", "GB2312"},
+ {"greek-iso-8bit", "ISO-8859-7"},
+ {"iso-10646/utf8", "UTF-8"}, // alias
+ {"iso-10646/utf-8", "UTF-8"}, // alias
+ {"iso-8859-1", "ISO-8859-1"},
+ {"iso-8859-13", "ISO-8859-13"}, // Emacs
+ {"iso-8859-15", "ISO-8859-15"},
+ {"iso-8859-2", "ISO-8859-2"},
+ {"iso-8859-5", "ISO-8859-5"},
+ {"iso-8859-7", "ISO-8859-7"},
+ {"iso-8859-9", "ISO-8859-9"},
+ {"iso-latin-1", "ISO-8859-1"},
+ {"iso-latin-2", "ISO-8859-2"}, // Emacs
+ {"iso-latin-5", "ISO-8859-9"}, // Emacs
+ {"iso-latin-7", "ISO-8859-13"}, // Emacs
+ {"iso-latin-9", "ISO-8859-15"}, // Emacs
+ {"japanese-iso-8bit", "EUC-JP"}, // Emacs
+ {"japanese-euc", "EUC-JP"}, // XEmacs
+ {"jis8", "EUC-JP"}, // XEmacs
+ {"koi8", "KOI8-R"}, // not KOI8!, Emacs
+ {"koi8-r", "KOI8-R"},
+ {"korean-euc", "EUC-KR"}, // XEmacs
+ {"korean-iso-8bit", "EUC-KR"}, // Emacs
+ {"latin1", "ISO-8859-1"}, // alias
+ {"latin-0", "ISO-8859-15"}, // Emacs
+ {"latin-1", "ISO-8859-1"}, // Emacs
+ {"latin-2", "ISO-8859-2"}, // Emacs
+ {"latin-5", "ISO-8859-9"}, // Emacs
+ {"latin-7", "ISO-8859-13"}, // Emacs
+ {"latin-9", "ISO-8859-15"}, // Emacs
+ {"mule-utf-16", "UTF-16"}, // Emacs
+ {"mule-utf-16be", "UTF-16BE"}, // Emacs
+ {"mule-utf-16-be", "UTF-16BE"}, // Emacs
+ {"mule-utf-16be-with-signature", "UTF-16"}, // Emacs, not UTF-16BE
+ {"mule-utf-16le", "UTF-16LE"}, // Emacs
+ {"mule-utf-16-le", "UTF-16LE"}, // Emacs
+ {"mule-utf-16le-with-signature", "UTF-16"}, // Emacs, not UTF-16LE
+ {"mule-utf-8", "UTF-8"}, // Emacs
+ {"us-ascii", "US-ASCII"}, // Emacs
+ {"utf8", "UTF-8"}, // alias
+ {"utf-16", "UTF-16"}, // Emacs
+ {"utf-16be", "UTF-16BE"}, // Emacs
+ {"utf-16-be", "UTF-16BE"}, // Emacs
+ {"utf-16be-with-signature", "UTF-16"}, // Emacs, not UTF-16BE
+ {"utf-16-be-with-signature", "UTF-16"}, // Emacs, not UTF-16BE
+ {"utf-16le", "UTF-16LE"}, // Emacs
+ {"utf-16-le", "UTF-16LE"}, // Emacs
+ {"utf-16le-with-signature", "UTF-16"}, // Emacs, not UTF-16LE
+ {"utf-16-le-with-signature", "UTF-16"}, // Emacs, not UTF-16LE
+ {"utf-8", "UTF-8"}, // Emacs
+
+// {"alternativnyj", ""}, // ?
+// {"arabic-iso-8bit", "ISO-8859-6"}, // Emacs
+// {"binary", ""}, // --
+// {"chinese-hz", "HZ-GB-2312"}, // Emacs
+// {"chinese-iso-7bit", "ISO-2022-CN"}, // Emacs
+// {"chinese-iso-8bit-with-esc", ""}, // --
+// {"compound-text", ""}, // --
+// {"compound-text-with-extension", ""}, // --
+// {"cp1125", "cp1125"}, // *
+// {"cp1250", "windows-1250"},// Emacs
+// {"cp1251", "windows-1251"},// Emacs
+// {"cp1252", "windows-1252"},// Emacs
+// {"cp1253", "windows-1253"},// Emacs
+// {"cp1254", "windows-1254"},// Emacs
+// {"cp1255", "windows-1255"},// Emacs
+// {"cp1256", "windows-1256"},// Emacs
+// {"cp1257", "windows-1257"},// Emacs
+// {"cp1258", "windows-1258"},// Emacs
+// {"cp437", "cp437"}, // Emacs
+// {"cp720", ""}, // not covered
+// {"cp737", "cp737"}, // *, Emacs
+// {"cp775", "cp775"}, // Emacs
+// {"cp850", "cp850"}, // Emacs
+// {"cp851", "cp851"}, // Emacs
+// {"cp852", "cp852"}, // Emacs
+// {"cp855", "cp855"}, // Emacs
+// {"cp857", "cp857"}, // Emacs
+// {"cp860", "cp860"}, // Emacs
+// {"cp861", "cp861"}, // Emacs
+// {"cp862", "cp862"}, // Emacs
+// {"cp863", "cp863"}, // Emacs
+// {"cp864", "cp864"}, // Emacs
+// {"cp865", "cp865"}, // Emacs
+// {"cp866", "cp866"}, // Emacs
+// {"cp866u", "cp1125"}, // *, Emacs
+// {"cp869", "cp869"}, // Emacs
+// {"cp874", "cp874"}, // *, Emacs
+// {"cp932", "cp932"}, // *, Emacs
+// {"cp936", "cp936"}, // Emacs
+// {"cp949", "cp949"}, // *, Emacs
+// {"cp950", "cp950"}, // *, Emacs
+// {"ctext", ""}, // --
+// {"ctext-no-compositions", ""}, // --
+// {"ctext-with-extensions", ""}, // --
+// {"cyrillic-alternativnyj", ""}, // ?, Emacs
+// {"cyrillic-iso-8bit-with-esc", ""}, // --
+// {"cyrillic-koi8-t", "KOI8-T"}, // *, Emacs
+// {"devanagari", ""}, // not covered
+// {"dos", ""}, // --
+// {"emacs-mule", ""}, // --
+// {"euc-jisx0213", "EUC-JISX0213"},// *, XEmacs?
+// {"euc-jisx0213-with-esc", ""}, // XEmacs?
+// {"euc-taiwan", "EUC-TW"}, // *, Emacs
+// {"euc-tw", "EUC-TW"}, // *, Emacs
+// {"georgian-ps", "GEORGIAN-PS"}, // *, Emacs
+// {"greek-iso-8bit-with-esc", ""}, // --
+// {"hebrew-iso-8bit", "ISO-8859-8"}, // Emacs
+// {"hebrew-iso-8bit-with-esc", ""}, // --
+// {"hz", "HZ-GB-2312"},
+// {"hz-gb-2312", "HZ-GB-2312"},
+// {"in-is13194", ""}, // not covered
+// {"in-is13194-devanagari", ""}, // not covered
+// {"in-is13194-with-esc", ""}, // --
+// {"iso-2022-7", ""}, // XEmacs?
+// {"iso-2022-7bit", ""}, // --
+// {"iso-2022-7bit-lock", ""}, // --
+// {"iso-2022-7bit-lock-ss2", ""}, // --
+// {"iso-2022-7bit-ss2", ""}, // --
+// {"iso-2022-8", ""}, // XEmacs?
+// {"iso-2022-8bit", ""}, // XEmacs?
+// {"iso-2022-8bit-lock", ""}, // XEmacs?
+// {"iso-2022-8bit-lock-ss2", ""}, // XEmacs?
+// {"iso-2022-8bit-ss2", ""}, // --
+// {"iso-2022-cjk", ""}, // --
+// {"iso-2022-cn", "ISO-2022-CN"}, // Emacs
+// {"iso-2022-cn-ext", "ISO-2022-CN-EXT"},// Emacs
+// {"iso-2022-int-1", ""}, // --
+// {"iso-2022-jp", "ISO-2022-JP"},
+// {"iso-2022-jp-1978-irv", "ISO-2022-JP"},
+// {"iso-2022-jp-2", "ISO-2022-JP-2"},
+// {"iso-2022-jp-3", "ISO-2022-JP-3"},// *, XEmacs?
+// {"iso-2022-jp-3-compatible", ""}, // XEmacs?
+// {"iso-2022-jp-3-strict", "ISO-2022-JP-3"},// *, XEmacs?
+// {"iso-2022-kr", "ISO-2022-KR"},
+// {"iso-2022-lock", ""}, // XEmacs?
+// {"iso-8859-10", "ISO-8859-10"}, // Emacs
+// {"iso-8859-11", "ISO-8859-11"}, // *, Emacs
+// {"iso-8859-14", "ISO-8859-14"}, // Emacs
+// {"iso-8859-16", "ISO-8859-16"},
+// {"iso-8859-3", "ISO-8859-3"},
+// {"iso-8859-4", "ISO-8859-4"},
+// {"iso-8859-6", "ISO-8859-6"},
+// {"iso-8859-8", "ISO-8859-8"},
+// {"iso-8859-8-e", "ISO-8859-8"},
+// {"iso-8859-8-i", "ISO-8859-8"}, // Emacs
+// {"iso-latin-10", "ISO-8859-16"}, // Emacs
+// {"iso-latin-1-with-esc", ""}, // --
+// {"iso-latin-2-with-esc", ""}, // --
+// {"iso-latin-3", "ISO-8859-3"}, // Emacs
+// {"iso-latin-3-with-esc", ""}, // --
+// {"iso-latin-4", "ISO-8859-4"}, // Emacs
+// {"iso-latin-4-with-esc", ""}, // --
+// {"iso-latin-5-with-esc", ""}, // --
+// {"iso-latin-6", "ISO-8859-10"}, // Emacs
+// {"iso-latin-8", "ISO-8859-14"}, // Emacs
+// {"iso-safe", ""}, // --
+// {"japanese-iso-7bit-1978-irv", "ISO-2022-JP"}, // Emacs
+// {"japanese-iso-8bit-with-esc", ""}, // --
+// {"japanese-shift-jis", "Shift_JIS"}, // Emacs
+// {"japanese-shift-jisx0213", ""}, // XEmacs?
+// {"jis7", "ISO-2022-JP"}, // Xemacs
+// {"junet", "ISO-2022-JP"},
+// {"koi8-t", "KOI8-T"}, // *, Emacs
+// {"koi8-u", "KOI8-U"}, // Emacs
+// {"korean-iso-7bit-lock", "ISO-2022-KR"},
+// {"korean-iso-8bit-with-esc", ""}, // --
+// {"lao", ""}, // not covered
+// {"lao-with-esc", ""}, // --
+// {"latin-10", "ISO-8859-16"}, // Emacs
+// {"latin-3", "ISO-8859-3"}, // Emacs
+// {"latin-4", "ISO-8859-4"}, // Emacs
+// {"latin-6", "ISO-8859-10"}, // Emacs
+// {"latin-8", "ISO-8859-14"}, // Emacs
+// {"mac", ""}, // --
+// {"mac-roman", "MACINTOSH"}, // Emacs
+// {"mik", ""}, // not covered
+// {"next", "NEXTSTEP"}, // *, Emacs
+// {"no-conversion", ""}, // --
+// {"old-jis", "ISO-2022-JP"},
+// {"pt154", "PT154"}, // Emacs
+// {"raw-text", ""}, // --
+// {"ruscii", "cp1125"}, // *, Emacs
+// {"shift-jis", "Shift_JIS"}, // XEmacs
+// {"shift_jis", "Shift_JIS"},
+// {"shift_jisx0213", "Shift_JISX0213"},// *, XEmacs?
+// {"sjis", "Shift_JIS"}, // Emacs
+// {"tcvn", "TCVN"}, // *, Emacs
+// {"tcvn-5712", "TCVN"}, // *, Emacs
+// {"thai-tis620", "TIS-620"},
+// {"thai-tis620-with-esc", ""}, // --
+// {"th-tis620", "TIS-620"},
+// {"tibetan", ""}, // not covered
+// {"tibetan-iso-8bit", ""}, // not covered
+// {"tibetan-iso-8bit-with-esc", ""}, // --
+// {"tis-620", "TIS-620"},
+// {"tis620", "TIS-620"},
+// {"undecided", ""}, // --
+// {"unix", ""}, // --
+// {"utf-7", "UTF-7"}, // Emacs
+// {"utf-7-safe", ""}, // XEmacs?
+// {"utf-8-ws", "UTF-8"}, // XEmacs?
+// {"vietnamese-tcvn", "TCVN"}, // *, Emacs
+// {"vietnamese-viqr", "VIQR"}, // not covered
+// {"vietnamese-viscii", "VISCII"},
+// {"vietnamese-vscii", ""}, // not covered
+// {"viqr", "VIQR"}, // not covered
+// {"viscii", "VISCII"},
+// {"vscii", ""}, // not covered
+// {"windows-037", ""}, // not covered
+// {"windows-10000", ""}, // not covered
+// {"windows-10001", ""}, // not covered
+// {"windows-10006", ""}, // not covered
+// {"windows-10007", ""}, // not covered
+// {"windows-10029", ""}, // not covered
+// {"windows-10079", ""}, // not covered
+// {"windows-10081", ""}, // not covered
+// {"windows-1026", ""}, // not covered
+// {"windows-1200", ""}, // not covered
+// {"windows-1250", "windows-1250"},
+// {"windows-1251", "windows-1251"},
+// {"windows-1252", "windows-1252"},
+// {"windows-1253", "windows-1253"},
+// {"windows-1254", "windows-1254"},
+// {"windows-1255", "windows-1255"},
+// {"windows-1256", "windows-1256"},
+// {"windows-1257", "windows-1257"},
+// {"windows-1258", "windows-1258"},
+// {"windows-1361", "cp1361"}, // *, XEmacs
+// {"windows-437", "cp437"}, // XEmacs
+// {"windows-500", ""}, // not covered
+// {"windows-708", ""}, // not covered
+// {"windows-709", ""}, // not covered
+// {"windows-710", ""}, // not covered
+// {"windows-720", ""}, // not covered
+// {"windows-737", "cp737"}, // *, XEmacs
+// {"windows-775", "cp775"}, // XEmacs
+// {"windows-850", "cp850"}, // XEmacs
+// {"windows-852", "cp852"}, // XEmacs
+// {"windows-855", "cp855"}, // XEmacs
+// {"windows-857", "cp857"}, // XEmacs
+// {"windows-860", "cp860"}, // XEmacs
+// {"windows-861", "cp861"}, // XEmacs
+// {"windows-862", "cp862"}, // XEmacs
+// {"windows-863", "cp863"}, // XEmacs
+// {"windows-864", "cp864"}, // XEmacs
+// {"windows-865", "cp865"}, // XEmacs
+// {"windows-866", "cp866"}, // XEmacs
+// {"windows-869", "cp869"}, // XEmacs
+// {"windows-874", "cp874"}, // XEmacs
+// {"windows-875", ""}, // not covered
+// {"windows-932", "cp932"}, // *, XEmacs
+// {"windows-936", "cp936"}, // XEmacs
+// {"windows-949", "cp949"}, // *, XEmacs
+// {"windows-950", "cp950"}, // *, XEmacs
+// {"x-ctext", ""}, // --
+// {"x-ctext-with-extensions", ""}, // --
+
+ {NULL, NULL},
+};
+
+// ---------------------------------------------------------
+// Convert encoding name from emacs to mime.
+// ---------------------------------------------------------
+char *
+emacs2mime(char *emacs_enc)
+{
+ int emacs_enc_len = strlen(emacs_enc);
+ if (emacs_enc_len > 4
+ && !strcasecmp(emacs_enc + emacs_enc_len - 4, "-dos"))
+ emacs_enc[emacs_enc_len - 4] = 0;
+ if (emacs_enc_len > 4
+ && !strcasecmp(emacs_enc + emacs_enc_len - 4, "-mac"))
+ emacs_enc[emacs_enc_len - 4] = 0;
+ if (emacs_enc_len > 5
+ && !strcasecmp(emacs_enc + emacs_enc_len - 5, "-unix"))
+ emacs_enc[emacs_enc_len - 5] = 0;
+ for (const conversion *table = emacs_to_mime; table->from; table++)
+ if (!strcasecmp(emacs_enc, table->from))
+ return (char *)table->to;
+ return emacs_enc;
+}
+
+// ---------------------------------------------------------
+// Print out Unicode entity if value is greater than 0x7F.
+// ---------------------------------------------------------
+inline void
+unicode_entity(int u)
+{
+ if (u < 0x80)
+ putchar(u);
+ else {
+ // Handle no-break space and soft hyphen specially--they are input
+ // characters only, not glyphs. See groff_char(7).
+ if (u == 0xA0) {
+ putchar('\\');
+ putchar('~');
+ }
+ else if (u == 0xAD) {
+ putchar('\\');
+ putchar('%');
+ }
+ else
+ printf("\\[u%04X]", u);
+ }
+}
+
+// ---------------------------------------------------------
+// Conversion functions. All functions take 'data', which
+// normally holds the first two lines, and a file pointer.
+// ---------------------------------------------------------
+
+// Conversion from ISO-8859-1 (aka Latin-1) to Unicode.
+void
+conversion_latin1(FILE *fp, const string &data)
+{
+ int len = data.length();
+ const unsigned char *ptr = (const unsigned char *)data.contents();
+ for (int i = 0; i < len; i++)
+ unicode_entity(ptr[i]);
+ int c = -1;
+ while ((c = getc(fp)) != EOF)
+ unicode_entity(c);
+}
+
+// A future version of groff shall support UTF-8 natively.
+// In this case, the UTF-8 stuff here in this file will be
+// moved to the troff program.
+
+struct utf8 {
+ FILE *fp;
+ unsigned char s[6];
+ enum {
+ FIRST = 0,
+ SECOND,
+ THIRD,
+ FOURTH,
+ FIFTH,
+ SIXTH
+ } byte;
+ int expected_byte_count;
+ bool emit_invalid_utf8_warning;
+ bool emit_incomplete_utf8_warning;
+ utf8(FILE *);
+ ~utf8();
+ void add(unsigned char);
+ void invalid();
+ void incomplete();
+};
+
+utf8::utf8(FILE *f) : fp(f), byte(FIRST), expected_byte_count(1),
+ emit_invalid_utf8_warning(true),
+ emit_incomplete_utf8_warning(true)
+{
+ // empty
+}
+
+utf8::~utf8()
+{
+ if (byte != FIRST)
+ incomplete();
+}
+
+inline void
+utf8::add(unsigned char c)
+{
+ s[byte] = c;
+ if (byte == FIRST) {
+ if (c < 0x80)
+ unicode_entity(c);
+ else if (c < 0xC0)
+ invalid();
+ else if (c < 0xE0) {
+ expected_byte_count = 2;
+ byte = SECOND;
+ }
+ else if (c < 0xF0) {
+ expected_byte_count = 3;
+ byte = SECOND;
+ }
+ else if (c < 0xF8) {
+ expected_byte_count = 4;
+ byte = SECOND;
+ }
+ else if (c < 0xFC) {
+ expected_byte_count = 5;
+ byte = SECOND;
+ }
+ else if (c < 0xFE) {
+ expected_byte_count = 6;
+ byte = SECOND;
+ }
+ else
+ invalid();
+ return;
+ }
+ if (c < 0x80 || c > 0xBF) {
+ incomplete();
+ add(c);
+ return;
+ }
+ switch (byte) {
+ case FIRST:
+ // can't happen
+ break;
+ case SECOND:
+ if (expected_byte_count == 2) {
+ if (s[0] < 0xC2)
+ invalid();
+ else
+ unicode_entity(((s[0] & 0x1F) << 6)
+ | (s[1] ^ 0x80));
+ byte = FIRST;
+ }
+ else
+ byte = THIRD;
+ break;
+ case THIRD:
+ if (expected_byte_count == 3) {
+ if (!(s[0] >= 0xE1 || s[1] >= 0xA0))
+ invalid();
+ else
+ unicode_entity(((s[0] & 0x1F) << 12)
+ | ((s[1] ^ 0x80) << 6)
+ | (s[2] ^ 0x80));
+ byte = FIRST;
+ }
+ else
+ byte = FOURTH;
+ break;
+ case FOURTH:
+ // We reject everything greater than 0x10FFFF.
+ if (expected_byte_count == 4) {
+ if (!((s[0] >= 0xF1 || s[1] >= 0x90)
+ && (s[0] < 0xF4 || (s[0] == 0xF4 && s[1] < 0x90))))
+ invalid();
+ else
+ unicode_entity(((s[0] & 0x07) << 18)
+ | ((s[1] ^ 0x80) << 12)
+ | ((s[2] ^ 0x80) << 6)
+ | (s[3] ^ 0x80));
+ byte = FIRST;
+ }
+ else
+ byte = FIFTH;
+ break;
+ case FIFTH:
+ if (expected_byte_count == 5) {
+ invalid();
+ byte = FIRST;
+ }
+ else
+ byte = SIXTH;
+ break;
+ case SIXTH:
+ invalid();
+ byte = FIRST;
+ break;
+ }
+}
+
+// We use fprintf(stderr) instead of libgroff's debug() because we need
+// to output longs, and libgroff's errprint() doesn't support that.
+
+void
+utf8::invalid()
+{
+ if (is_debugging && emit_invalid_utf8_warning) {
+ fprintf(stderr, " invalid UTF-8 sequence(s) in input stream:"
+ " replacing each such sequence with 0xFFFD\n");
+ emit_invalid_utf8_warning = false;
+ }
+ unicode_entity(0xFFFD);
+ byte = FIRST;
+}
+
+void
+utf8::incomplete()
+{
+ if (is_debugging && emit_incomplete_utf8_warning) {
+ fprintf(stderr, " incomplete UTF-8 sequence(s) in input stream:"
+ " replacing each such sequence with 0xFFFD\n");
+ emit_incomplete_utf8_warning = false;
+ }
+ unicode_entity(0xFFFD);
+ byte = FIRST;
+}
+
+// Conversion from UTF-8 to Unicode.
+void
+conversion_utf8(FILE *fp, const string &data)
+{
+ utf8 u(fp);
+ int len = data.length();
+ const unsigned char *ptr = (const unsigned char *)data.contents();
+ for (int i = 0; i < len; i++)
+ u.add(ptr[i]);
+ int c = -1;
+ while ((c = getc(fp)) != EOF)
+ u.add(c);
+ return;
+}
+
+// Conversion from cp1047 (EBCDIC) to UTF-8.
+void
+conversion_cp1047(FILE *fp, const string &data)
+{
+ static unsigned char cp1047[] = {
+ 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, // 0x00
+ 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x9D, 0x85, 0x08, 0x87, // 0x10
+ 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x0A, 0x17, 0x1B, // 0x20
+ 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07,
+ 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, // 0x30
+ 0x98, 0x99, 0x9A, 0x9B, 0x14, 0x15, 0x9E, 0x1A,
+ 0x20, 0xA0, 0xE2, 0xE4, 0xE0, 0xE1, 0xE3, 0xE5, // 0x40
+ 0xE7, 0xF1, 0xA2, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
+ 0x26, 0xE9, 0xEA, 0xEB, 0xE8, 0xED, 0xEE, 0xEF, // 0x50
+ 0xEC, 0xDF, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x5E,
+ 0x2D, 0x2F, 0xC2, 0xC4, 0xC0, 0xC1, 0xC3, 0xC5, // 0x60
+ 0xC7, 0xD1, 0xA6, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
+ 0xF8, 0xC9, 0xCA, 0xCB, 0xC8, 0xCD, 0xCE, 0xCF, // 0x70
+ 0xCC, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
+ 0xD8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, // 0x80
+ 0x68, 0x69, 0xAB, 0xBB, 0xF0, 0xFD, 0xFE, 0xB1,
+ 0xB0, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, // 0x90
+ 0x71, 0x72, 0xAA, 0xBA, 0xE6, 0xB8, 0xC6, 0xA4,
+ 0xB5, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, // 0xA0
+ 0x79, 0x7A, 0xA1, 0xBF, 0xD0, 0x5B, 0xDE, 0xAE,
+ 0xAC, 0xA3, 0xA5, 0xB7, 0xA9, 0xA7, 0xB6, 0xBC, // 0xB0
+ 0xBD, 0xBE, 0xDD, 0xA8, 0xAF, 0x5D, 0xB4, 0xD7,
+ 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, // 0xC0
+ 0x48, 0x49, 0xAD, 0xF4, 0xF6, 0xF2, 0xF3, 0xF5,
+ 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, // 0xD0
+ 0x51, 0x52, 0xB9, 0xFB, 0xFC, 0xF9, 0xFA, 0xFF,
+ 0x5C, 0xF7, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, // 0xE0
+ 0x59, 0x5A, 0xB2, 0xD4, 0xD6, 0xD2, 0xD3, 0xD5,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // 0xF0
+ 0x38, 0x39, 0xB3, 0xDB, 0xDC, 0xD9, 0xDA, 0x9F,
+ };
+ int len = data.length();
+ const unsigned char *ptr = (const unsigned char *)data.contents();
+ for (int i = 0; i < len; i++)
+ unicode_entity(cp1047[ptr[i]]);
+ int c = -1;
+ while ((c = getc(fp)) != EOF)
+ unicode_entity(cp1047[c]);
+}
+
+// Locale-sensible conversion.
+#if HAVE_ICONV
+void
+conversion_iconv(FILE *fp, const string &data, char *enc)
+{
+ iconv_t handle = iconv_open(UNICODE, enc);
+ if (handle == (iconv_t)-1) {
+ if (errno == EINVAL) {
+ error("encoding system '%1' not supported by iconv()", enc);
+ return;
+ }
+ fatal("iconv_open failed");
+ }
+ char inbuf[BUFSIZ];
+ int outbuf[BUFSIZ];
+ char *outptr = (char *)outbuf;
+ size_t outbytes_left = BUFSIZ * sizeof (int);
+ // Handle 'data'.
+ char *inptr = (char *)data.contents();
+ size_t inbytes_left = data.length();
+ char *limit;
+ while (inbytes_left > 0) {
+ size_t status = iconv(handle,
+ (ICONV_CONST char **)&inptr, &inbytes_left,
+ &outptr, &outbytes_left);
+ if (status == (size_t)-1) {
+ if (errno == EILSEQ) {
+ // Invalid byte sequence. XXX
+ inptr++;
+ inbytes_left--;
+ }
+ else if (errno == E2BIG) {
+ // Output buffer is full.
+ limit = (char *)outbuf + BUFSIZ * sizeof (int) - outbytes_left;
+ for (int *ptr = outbuf; (char *)ptr < limit; ptr++)
+ unicode_entity(*ptr);
+ memmove(outbuf, outptr, outbytes_left);
+ outptr = (char *)outbuf + outbytes_left;
+ outbytes_left = BUFSIZ * sizeof (int) - outbytes_left;
+ }
+ else if (errno == EINVAL) {
+ // 'data' ends with partial input sequence.
+ memcpy(inbuf, inptr, inbytes_left);
+ break;
+ }
+ }
+ }
+ // Handle 'fp' and switch to 'inbuf'.
+ size_t read_bytes;
+ char *read_start = inbuf + inbytes_left;
+ while ((read_bytes = fread(read_start, 1, BUFSIZ - inbytes_left, fp)) > 0) {
+ inptr = inbuf;
+ inbytes_left += read_bytes;
+ while (inbytes_left > 0) {
+ size_t status = iconv(handle,
+ (ICONV_CONST char **)&inptr, &inbytes_left,
+ &outptr, &outbytes_left);
+ if (status == (size_t)-1) {
+ if (errno == EILSEQ) {
+ // Invalid byte sequence. XXX
+ inptr++;
+ inbytes_left--;
+ }
+ else if (errno == E2BIG) {
+ // Output buffer is full.
+ limit = (char *)outbuf + BUFSIZ * sizeof (int) - outbytes_left;
+ for (int *ptr = outbuf; (char *)ptr < limit; ptr++)
+ unicode_entity(*ptr);
+ memmove(outbuf, outptr, outbytes_left);
+ outptr = (char *)outbuf + outbytes_left;
+ outbytes_left = BUFSIZ * sizeof (int) - outbytes_left;
+ }
+ else if (errno == EINVAL) {
+ // 'inbuf' ends with partial input sequence.
+ memmove(inbuf, inptr, inbytes_left);
+ break;
+ }
+ }
+ }
+ read_start = inbuf + inbytes_left;
+ }
+ iconv_close(handle);
+ // XXX use ferror?
+ limit = (char *)outbuf + BUFSIZ * sizeof (int) - outbytes_left;
+ for (int *ptr = outbuf; (char *)ptr < limit; ptr++)
+ unicode_entity(*ptr);
+}
+#endif /* HAVE_ICONV */
+
+// ---------------------------------------------------------
+// Handle Byte Order Mark.
+//
+// Since we have a chicken-and-egg problem it's necessary
+// to handle the BOM manually if it is in the data stream.
+// As documented in the Unicode book it is very unlikely
+// that any normal text file (regardless of the encoding)
+// starts with the bytes which represent a BOM.
+//
+// Return the BOM in string 'BOM'; 'data' then starts with
+// the byte after the BOM. This function reads (at most)
+// four bytes from the data stream.
+//
+// Return encoding if a BOM is found, NULL otherwise.
+// ---------------------------------------------------------
+const char *
+get_BOM(FILE *fp, string &BOM, string &data)
+{
+ // The BOM is U+FEFF. We have thus the following possible
+ // representations.
+ //
+ // UTF-8: 0xEFBBBF
+ // UTF-16: 0xFEFF or 0xFFFE
+ // UTF-32: 0x0000FEFF or 0xFFFE0000
+ static struct {
+ int len;
+ const char *str;
+ const char *name;
+ } BOM_table[] = {
+ {4, "\x00\x00\xFE\xFF", "UTF-32"},
+ {4, "\xFF\xFE\x00\x00", "UTF-32"},
+ {3, "\xEF\xBB\xBF", "UTF-8"},
+ {2, "\xFE\xFF", "UTF-16"},
+ {2, "\xFF\xFE", "UTF-16"},
+ };
+ const int BOM_table_len = sizeof (BOM_table) / sizeof (BOM_table[0]);
+ char BOM_string[4];
+ const char *retval = NULL;
+ int len;
+ for (len = 0; len < 4; len++) {
+ int c = getc(fp);
+ if (c == EOF)
+ break;
+ BOM_string[len] = char(c);
+ }
+ int i;
+ for (i = 0; i < BOM_table_len; i++) {
+ if (BOM_table[i].len <= len
+ && memcmp(BOM_string, BOM_table[i].str, BOM_table[i].len) == 0)
+ break;
+ }
+ int j = 0;
+ if (i < BOM_table_len) {
+ for (; j < BOM_table[i].len; j++)
+ BOM += BOM_string[j];
+ retval = BOM_table[i].name;
+ }
+ for (; j < len; j++)
+ data += BOM_string[j];
+ return retval;
+}
+
+// ---------------------------------------------------------
+// Get first two lines from input stream.
+//
+// Return string (allocated with 'new') without zero bytes
+// or NULL in case no coding tag can occur in the data
+// (which is stored unmodified in 'data').
+// ---------------------------------------------------------
+char *
+get_tag_lines(FILE *fp, string &data)
+{
+ int newline_count = 0;
+ int c, prev = -1;
+ // Handle CR, LF, and CRLF as line separators.
+ for (int i = 0; i < data.length(); i++) {
+ c = data[i];
+ if (c == '\n' || c == '\r')
+ newline_count++;
+ if (c == '\n' && prev == '\r')
+ newline_count--;
+ prev = c;
+ }
+ if (newline_count > 1)
+ return NULL;
+ bool emit_warning = true;
+ for (int lines = newline_count; lines < 2; lines++) {
+ while ((c = getc(fp)) != EOF) {
+ if (c == '\0' && is_debugging && emit_warning) {
+ warning("null byte(s) found in input stream:"
+ " search for coding tag might return false result");
+ emit_warning = false;
+ }
+ data += char(c);
+ if (c == '\n' || c == '\r')
+ break;
+ }
+ // Handle CR, LF, and CRLF as line separators.
+ if (c == '\r') {
+ c = getc(fp);
+ if (c != EOF && c != '\n')
+ ungetc(c, fp);
+ else
+ data += char(c);
+ }
+ }
+ return data.extract();
+}
+
+// ---------------------------------------------------------
+// Check whether C string starts with a comment.
+//
+// Return 1 if true, 0 otherwise.
+// ---------------------------------------------------------
+int
+is_comment_line(char *s)
+{
+ if (!s || !*s)
+ return 0;
+ if (*s == '.' || *s == '\'')
+ {
+ s++;
+ while (*s == ' ' || *s == '\t')
+ s++;
+ if (*s && *s == '\\')
+ {
+ s++;
+ if (*s == '"' || *s == '#')
+ return 1;
+ }
+ }
+ else if (*s == '\\')
+ {
+ s++;
+ if (*s == '#')
+ return 1;
+ }
+ return 0;
+}
+
+// ---------------------------------------------------------
+// Get a value/variable pair from a local variables list
+// in a C string which look like this:
+//
+// <variable1>: <value1>; <variable2>: <value2>; ...
+//
+// Leading and trailing blanks are ignored. There might be
+// more than one blank after ':' and ';'.
+//
+// Return position of next value/variable pair or NULL if
+// at end of data.
+// ---------------------------------------------------------
+char *
+get_variable_value_pair(char *d1, char **variable, char **value)
+{
+ static char var[MAX_VAR_LEN], val[MAX_VAR_LEN];
+ *variable = var;
+ *value = val;
+ while (*d1 == ' ' || *d1 == '\t')
+ d1++;
+ // Get variable.
+ int l = 0;
+ while (l < MAX_VAR_LEN - 1 && *d1 && !strchr(";: \t", *d1))
+ var[l++] = *(d1++);
+ var[l] = 0;
+ // Skip everything until ':', ';', or end of data.
+ while (*d1 && *d1 != ':' && *d1 != ';')
+ d1++;
+ val[0] = 0;
+ if (!*d1)
+ return NULL;
+ if (*d1 == ';')
+ return d1 + 1;
+ d1++;
+ while (*d1 == ' ' || *d1 == '\t')
+ d1++;
+ // Get value.
+ l = 0;
+ while (l < MAX_VAR_LEN - 1 && *d1 && !strchr("; \t", *d1))
+ val[l++] = *(d1++);
+ val[l] = 0;
+ // Skip everything until ';' or end of data.
+ while (*d1 && *d1 != ';')
+ d1++;
+ if (*d1 == ';')
+ return d1 + 1;
+ return NULL;
+}
+
+// ---------------------------------------------------------
+// Check coding tag in the read buffer.
+//
+// We search for the following line:
+//
+// <comment> ... -*-<local variables list>-*-
+//
+// ('...' might be anything).
+//
+// <comment> can be one of the following syntax forms at the
+// beginning of the line:
+//
+// .\" .\# '\" '\# \#
+//
+// There can be whitespace after the leading '.' or "'".
+//
+// The local variables list must occur within the first
+// comment block at the very beginning of the data stream.
+//
+// Within the <local variables list>, we search for
+//
+// coding: <value>
+//
+// which specifies the coding system used for the data
+// stream.
+//
+// Return <value> if found, NULL otherwise.
+//
+// Note that null bytes in the data are skipped before applying
+// the algorithm. This should work even with files encoded as
+// UTF-16 or UTF-32 (or its siblings) in most cases.
+// ---------------------------------------------------------
+char *
+check_coding_tag(FILE *fp, string &data)
+{
+ char *inbuf = get_tag_lines(fp, data);
+ char *lineend;
+ for (char *p = inbuf; is_comment_line(p); p = lineend + 1) {
+ if ((lineend = strchr(p, '\n')) == NULL)
+ break;
+ *lineend = 0; // switch temporarily to '\0'
+ char *d1 = strstr(p, "-*-");
+ char *d2 = 0;
+ if (d1)
+ d2 = strstr(d1 + 3, "-*-");
+ *lineend = '\n'; // restore newline
+ if (!d1 || !d2)
+ continue;
+ *d2 = 0; // switch temporarily to '\0'
+ d1 += 3;
+ while (d1) {
+ char *variable, *value;
+ d1 = get_variable_value_pair(d1, &variable, &value);
+ if (!strcasecmp(variable, "coding")) {
+ *d2 = '-'; // restore '-'
+ free(inbuf);
+ return value;
+ }
+ }
+ *d2 = '-'; // restore '-'
+ }
+ free(inbuf);
+ return NULL;
+}
+
+char *
+detect_file_encoding(FILE *fp)
+{
+#ifdef HAVE_UCHARDET
+ uchardet_t ud = NULL;
+ struct stat stat_buf;
+ size_t len, read_bytes;
+ char *data = NULL;
+ int res, current_position;
+ const char *charset;
+ char *ret = NULL;
+
+ current_position = ftell(fp);
+ /* Due to BOM and tag detection, we are not at the beginning of the
+ file. */
+ rewind(fp);
+ if (fstat(fileno(fp), &stat_buf) != 0) {
+ error("fstat: %1", strerror(errno));
+ goto end;
+ }
+ len = stat_buf.st_size;
+ if (is_debugging)
+ fprintf(stderr, " len: %lu\n", (unsigned long)len);
+ if (len == 0)
+ goto end;
+ data = (char *)calloc(len, 1);
+ read_bytes = fread(data, 1, len, fp);
+ if (read_bytes == 0) {
+ error("fread: %1", strerror(errno));
+ goto end;
+ }
+ /* We rewind back to the original position */
+ if (fseek(fp, current_position, SEEK_SET) != 0) {
+ fatal("fseek: %1", strerror(errno));
+ goto end;
+ }
+ ud = uchardet_new();
+ res = uchardet_handle_data(ud, data, len);
+ if (res != 0) {
+ debug(" uchardet_handle_data: error %1\n", res);
+ goto end;
+ }
+ if (is_debugging)
+ fprintf(stderr, " uchardet read: %lu bytes\n",
+ (unsigned long)read_bytes);
+ uchardet_data_end(ud);
+ charset = uchardet_get_charset(ud);
+ if (is_debugging) {
+ if (charset)
+ fprintf(stderr, " charset: %s\n", charset);
+ else
+ fprintf(stderr, " charset is NULL\n");
+ }
+ /* uchardet 0.0.1 could return an empty string instead of NULL */
+ if (charset && *charset) {
+ ret = (char *)malloc(strlen(charset) + 1);
+ strcpy(ret, charset);
+ }
+
+end:
+ if (ud)
+ uchardet_delete(ud);
+ if (data)
+ free(data);
+
+ return ret;
+#else /* not HAVE_UCHARDET */
+ return NULL;
+#endif /* not HAVE_UCHARDET */
+}
+
+// ---------------------------------------------------------
+// Handle an input file. If `filename` is "-", read the
+// standard input stream.
+//
+// Return 1 on success, 0 otherwise.
+// ---------------------------------------------------------
+int
+do_file(const char *filename)
+{
+ FILE *fp;
+ string BOM, data;
+ bool is_seekable = false;
+ string reported_filename;
+
+ // TODO: Consider moving some of this into a `quoted_file_name`
+ // function in libgroff.
+ if (strcmp(filename, "-") == 0) {
+ fp = stdin;
+ reported_filename = string("<standard input>");
+ }
+ else {
+ fp = fopen(filename, FOPEN_RB);
+ reported_filename = "'" + string(filename) + "'";
+ }
+ if (!fp) {
+ error("can't open %1: %2", reported_filename.contents(),
+ strerror(errno));
+ return 0;
+ }
+ if (is_debugging)
+ fprintf(stderr, "processing %s\n", reported_filename.contents());
+ if (fseek(fp, 0L, SEEK_SET) == 0)
+ is_seekable = true;
+ else {
+ SET_BINARY(fileno(fp));
+ if (is_debugging)
+ fprintf(stderr, " stream is not seekable: %s\n",
+ strerror(errno));
+ }
+ const char *BOM_encoding = get_BOM(fp, BOM, data);
+ // Determine the encoding.
+ char *encoding;
+ int must_free_encoding = 0;
+ if (user_encoding[0]) {
+ if (is_debugging) {
+ fprintf(stderr, " user-specified encoding '%s', "
+ "no search for coding tag\n",
+ user_encoding);
+ if (BOM_encoding && strcmp(BOM_encoding, user_encoding))
+ fprintf(stderr, " but BOM in data stream implies encoding '%s'!\n",
+ BOM_encoding);
+ }
+ encoding = (char *)user_encoding;
+ }
+ else if (BOM_encoding) {
+ if (is_debugging)
+ fprintf(stderr, " found BOM, no search for coding tag\n");
+ encoding = (char *)BOM_encoding;
+ }
+ else {
+ // 'check_coding_tag' returns a pointer to a static array (or NULL).
+ char *file_encoding = check_coding_tag(fp, data);
+ if (!file_encoding) {
+ if (is_debugging)
+ fprintf(stderr, " no coding tag\n");
+ if (is_seekable)
+ file_encoding = detect_file_encoding(fp);
+ if (!file_encoding) {
+ if (is_debugging)
+ fprintf(stderr, " could not detect encoding with uchardet\n");
+ file_encoding = fallback_encoding;
+ }
+ else
+ must_free_encoding = 1;
+ }
+ else
+ if (is_debugging)
+ fprintf(stderr, " coding tag: '%s'\n", file_encoding);
+ encoding = file_encoding;
+ }
+ strncpy(encoding_string, encoding, MAX_VAR_LEN - 1);
+ encoding_string[MAX_VAR_LEN - 1] = 0;
+ if (must_free_encoding)
+ free(encoding);
+ encoding = encoding_string;
+ // Translate from MIME & Emacs encoding names to locale encoding names.
+ encoding = emacs2mime(encoding_string);
+ if (encoding[0] == '\0') {
+ error("encoding '%1' not supported, not a portable encoding",
+ encoding_string);
+ return 0;
+ }
+ if (is_debugging)
+ fprintf(stderr, " encoding used: '%s'\n", encoding);
+ if (!raw_flag) {
+ string fn(filename);
+ fn += '\0';
+ normalize_for_lf(fn);
+ printf(".lf 1 %s\n", fn.contents());
+ }
+ int success = 1;
+ // Call converter (converters write to stdout).
+ if (!strcasecmp(encoding, "ISO-8859-1"))
+ conversion_latin1(fp, BOM + data);
+ else if (!strcasecmp(encoding, "UTF-8"))
+ conversion_utf8(fp, data);
+ else if (!strcasecmp(encoding, "cp1047"))
+ conversion_cp1047(fp, BOM + data);
+ else {
+#if HAVE_ICONV
+ conversion_iconv(fp, BOM + data, encoding);
+#else
+ error("encoding system '%1' not supported", encoding);
+ success = 0;
+#endif /* HAVE_ICONV */
+ }
+ if (fp != stdin)
+ fclose(fp);
+ return success;
+}
+
+// ---------------------------------------------------------
+// Print usage.
+// ---------------------------------------------------------
+void
+usage(FILE *stream)
+{
+ fprintf(stream,
+"usage: %s [-dr] [-D fallback-encoding] [-e encoding] [file ...]\n"
+"usage: %s {-v | --version}\n"
+"usage: %s {-h | --help}\n",
+ program_name, program_name, program_name);
+ if (stdout == stream) {
+ fprintf(stream,
+"\n"
+"Read each file, convert its encoded characters to a form GNU"
+" troff(1)\n"
+"can interpret, and send the result to the standard output stream.\n"
+"The default fallback encoding is '%s'. See the preconv(1) manual"
+" page.\n",
+ fallback_encoding);
+ exit(EXIT_SUCCESS);
+ }
+}
+
+// ---------------------------------------------------------
+// Main routine.
+// ---------------------------------------------------------
+int
+main(int argc, char **argv)
+{
+ program_name = argv[0];
+ // Determine the fallback encoding. This must be done before
+ // getopt() is called since the usage message shows the fallback
+ // encoding.
+ setlocale(LC_ALL, "");
+ char *locale = getlocale(LC_CTYPE);
+ if (!locale || !strcmp(locale, "C") || !strcmp(locale, "POSIX"))
+ strcpy(fallback_encoding, "latin1");
+ else {
+ strncpy(fallback_encoding, locale_charset(), MAX_VAR_LEN - 1);
+ fallback_encoding[MAX_VAR_LEN - 1] = 0;
+ }
+
+ program_name = argv[0];
+ int opt;
+ static const struct option long_options[] = {
+ { "help", no_argument, 0, 'h' },
+ { "version", no_argument, 0, 'v' },
+ { NULL, 0, 0, 0 }
+ };
+ // Parse the command-line options.
+ while ((opt = getopt_long(argc, argv,
+ "dD:e:hrv", long_options, NULL)) != EOF)
+ switch (opt) {
+ case 'v':
+ printf("GNU preconv (groff) version %s %s iconv support and %s uchardet support\n",
+ Version_string,
+#ifdef HAVE_ICONV
+ "with",
+#else
+ "without",
+#endif /* HAVE_ICONV */
+#ifdef HAVE_UCHARDET
+ "with"
+#else
+ "without"
+#endif /* HAVE_UCHARDET */
+ );
+ exit(0);
+ break;
+ case 'd':
+ is_debugging = true;
+ break;
+ case 'e':
+ if (optarg) {
+ strncpy(user_encoding, optarg, MAX_VAR_LEN - 1);
+ user_encoding[MAX_VAR_LEN - 1] = 0;
+ }
+ else
+ user_encoding[0] = 0;
+ break;
+ case 'D':
+ if (optarg) {
+ strncpy(fallback_encoding, optarg, MAX_VAR_LEN - 1);
+ fallback_encoding[MAX_VAR_LEN - 1] = 0;
+ }
+ break;
+ case 'r':
+ raw_flag = 1;
+ break;
+ case 'h':
+ usage(stdout);
+ break;
+ case '?':
+ usage(stderr);
+ exit(1);
+ break;
+ default:
+ assert(0);
+ }
+ int nbad = 0;
+ if (is_debugging)
+ fprintf(stderr, "fallback encoding: '%s'\n", fallback_encoding);
+ if (optind >= argc)
+ nbad += !do_file("-");
+ else
+ for (int i = optind; i < argc; i++)
+ nbad += !do_file(argv[i]);
+ if (ferror(stdout) || fflush(stdout) < 0)
+ fatal("output error");
+ return nbad != 0;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/preconv/tests/do-not-seek-the-unseekable.sh b/src/preproc/preconv/tests/do-not-seek-the-unseekable.sh
new file mode 100755
index 0000000..2b1142d
--- /dev/null
+++ b/src/preproc/preconv/tests/do-not-seek-the-unseekable.sh
@@ -0,0 +1,59 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+set -e
+
+preconv="${abs_top_builddir:-.}/preconv"
+
+fail=
+
+wail () {
+ echo FAILED >&2
+ fail=YES
+}
+
+# Scrape debugging output to see if we're skipping unseekable streams.
+# This is fragile, but we don't want to lock the language of diagnostic
+# messages (especially debugging ones). If this test fails, check the
+# text of the command's debugging output for a mismatch before
+# investigating deeper problems.
+
+echo "testing seekability of file operand '-'" >&2
+output=$(printf '' | "$preconv" -d - 2>&1)
+echo "$output" | grep -q "stream is not seekable" || wail
+
+# /dev/stdin might not exist in a chroot. Or, if it's not (a symbolic
+# link to) a character special device, the next test will not be valid,
+# as when using GNU Make's `-j` option.
+#
+# Similarly, we must have a controlling terminal.
+test -z "$fail"
+echo "skipping if /dev/stdin is not a character device" >&2
+test -c /dev/stdin || exit 77 # skip
+echo "skipping if there is no controlling terminal" >&2
+test "$(tty)" != "not a tty" || exit 77 # skip
+
+echo "testing seekability of standard input stream" >&2
+output=$(printf '' | "$preconv" -d /dev/stdin 2>&1)
+echo "$output" | grep -q "stream is not seekable" || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/preproc/preconv/tests/smoke-test.sh b/src/preproc/preconv/tests/smoke-test.sh
new file mode 100755
index 0000000..4131416
--- /dev/null
+++ b/src/preproc/preconv/tests/smoke-test.sh
@@ -0,0 +1,88 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+# Ensure a predictable character encoding.
+export LC_ALL=C
+
+set -e
+
+preconv="${abs_top_builddir:-.}/preconv"
+
+echo "testing -e flag override of BOM detection" >&2
+printf '\376\377\0\100\0\n' \
+ | "$preconv" -d -e euc-kr 2>&1 > /dev/null \
+ | grep -q "no search for coding tag"
+
+echo "testing detection of UTF-32BE BOM" >&2
+printf '\0\0\376\377\0\0\0\100\0\0\0\n' \
+ | "$preconv" -d 2>&1 > /dev/null \
+ | grep -q "found BOM"
+
+echo "testing detection of UTF-32LE BOM" >&2
+printf '\377\376\0\0\100\0\0\0\n\0\0\0' \
+ | "$preconv" -d 2>&1 > /dev/null \
+ | grep -q "found BOM"
+
+echo "testing detection of UTF-16BE BOM" >&2
+printf '\376\377\0\100\0\n' \
+ | "$preconv" -d 2>&1 > /dev/null \
+ | grep -q "found BOM"
+
+echo "testing detection of UTF-16LE BOM" >&2
+printf '\377\376\100\0\n\0' \
+ | "$preconv" -d 2>&1 > /dev/null \
+ | grep -q "found BOM"
+
+echo "testing detection of UTF-8 BOM" >&2
+printf '\357\273\277@\n' \
+ | "$preconv" -d 2>&1 > /dev/null \
+ | grep -q "found BOM"
+
+# We do not find a coding tag on piped input because it isn't seekable.
+echo "testing detection of Emacs coding tag in piped input" >&2
+printf '.\\" -*- coding: euc-kr; -*-\\n' \
+ | "$preconv" -d 2>&1 >/dev/null \
+ | grep -q "no coding tag"
+
+# We need uchardet to work to get past this point.
+echo "testing uchardet detection of encoding" >&2
+"$preconv" -v | grep -q 'with uchardet support' || exit 77
+
+# Instead of using temporary files, which in all fastidiousness means
+# cleaning them up even if we're interrupted, which in turn means
+# setting up signal handlers, we use files in the build tree.
+
+doc=contrib/mm/groff_mmse.7
+echo "testing uchardet detection on Latin-1 document $doc" >&2
+"$preconv" -d -D us-ascii 2>&1 >/dev/null $doc \
+ | grep -q 'charset: ISO-8859-1'
+
+# uchardet can't seek on a pipe either.
+echo "testing uchardet detection on pipe (expect fallback to -D)" >&2
+printf 'Eat at the caf\351.\n' \
+ | "$preconv" -d -D euc-kr 2>&1 > /dev/null \
+ | grep -q "encoding used: 'EUC-KR'"
+
+# Fall back to the locale. preconv assumes Latin-1 for C instead of
+# US-ASCII.
+echo "testing fallback to locale setting in environment" >&2
+printf 'Eat at the caf\351.\n' \
+ | "$preconv" -d 2>&1 > /dev/null \
+ | grep -q "encoding used: 'ISO-8859-1'"
diff --git a/src/preproc/refer/TODO b/src/preproc/refer/TODO
new file mode 100644
index 0000000..36f4508
--- /dev/null
+++ b/src/preproc/refer/TODO
@@ -0,0 +1,124 @@
+inline references
+
+Some sort of macro/subroutine that can cover several references.
+
+move-punctuation should ignore multiple punctuation characters.
+
+Make the index files machine independent.
+
+Allow search keys to be negated (with !) to indicate that the
+reference should not contain the key. Ignore negated keys during
+indexed searching.
+
+Provide an option with lkbib and lookbib that prints the location
+(filename, position) of each reference. Need to map filename_id's
+back to filenames.
+
+Rename join-authors to join-fields. Have a separate label-join-fields
+command used by @ and #.
+
+Have some sort of quantifier: e.g., $.n#A means execute '$.n' for each
+instance of an A field, setting $ to that field, and then join the
+results using the join-authors command.
+
+no-text-in-bracket command which says not to allow post_text and
+pre_text when the [] flags has been given. Useful for superscripted
+footnotes.
+
+Make it possible to translate - to \(en in page ranges.
+
+Trim eign a bit.
+
+In indexed searching discard all numeric keys except dates.
+
+Allow '\ ' to separate article from first word.
+
+%also
+
+Option automatically to supply [] flags in every reference.
+
+See if we can avoid requiring a comma before jr. and so on
+in find_last_name().
+
+Cache sortified authors in authors string during tentative evaluation of
+label specification.
+
+Possibly don't allow * and % expressions in the first part of ?:, | or
+& expressions.
+
+Handle better the case where <> occurs inside functions and in the
+first operand of ~. Or perhaps implement <> using some magic character
+in the string.
+
+Should special treatment be given to lines beginning with . in
+references? (Unix refer seems to treat them like '%').
+
+Add global flag to control whether all files should be stat-ed after
+loading, and whether they should be stat-ed before each search.
+Perhaps make this dependent on the number of files there are.
+
+Option to truncate keys to truncate_len in linear searching.
+
+Allow multiple -f options in indxbib.
+
+In indxbib, possibly store common words rather than common words
+filename. In this case store only words that are actually present in
+the file.
+
+Perhaps we should put out an obnoxious copyright message when lookbib
+starts up.
+
+Provide an option that writes a file containing just the references
+actually used. Useful if you want to distribute a document.
+
+Have a magic token such that
+%A <sort stuff><magic token><print stuff>
+will print as though it were
+%A <print stuff>
+but sort as though it were
+%A <sort stuff>
+Do we need this if we can specify author alternatives for sorting?
+No, provided we have separate alternatives for @.
+
+In consider_authors when last names are ambiguous we might be able to
+use just the first name and not Jr. bit. Or we might be able to
+abbreviate the author.
+
+It ought to be possible to specify an alternative field to sort on
+instead of date. (ie if there's a field giving the type of document --
+these references should sort after any years)
+
+Provide a way to execute a command using a command-line option.
+
+Option to set the label-spec as a command-line option (-L).
+
+Command to specify which fields can occur multiple times:
+multiple AE
+
+Command to specify how various fields sort:
+aort-as-name A
+sort-as-date D
+sort-as-title T
+sort-as-other O
+
+Command to specify which fields are author fields:
+# if we don't have A use field Q
+author-fields AQ
+
+Commands to set properties of tokens.
+sortify-token \(ae ae
+uppercase-token \[ae] \[AE]
+
+Command to set the names of months:
+months january february march april may ...
+
+Perhaps provide some sort of macro capability:
+# perhaps a macro capability
+defmacro foo
+annotation-field $1
+endef
+
+Command to control strings used in capitalization
+capitalize-start \s+2
+capitalize-end \s-2
+(perhaps make these arguments to the capitalize command.)
diff --git a/src/preproc/refer/command.cpp b/src/preproc/refer/command.cpp
new file mode 100644
index 0000000..b49e2be
--- /dev/null
+++ b/src/preproc/refer/command.cpp
@@ -0,0 +1,814 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "refer.h"
+#include "refid.h"
+#include "search.h"
+#include "command.h"
+
+cset cs_field_name = csalpha;
+
+class input_item {
+ input_item *next;
+ char *filename;
+ int first_lineno;
+ string buffer;
+ const char *ptr;
+ const char *end;
+public:
+ input_item(string &, const char *, int = 1);
+ ~input_item();
+ int get_char();
+ int peek_char();
+ void skip_char();
+ void get_location(const char **, int *);
+
+ friend class input_stack;
+};
+
+input_item::input_item(string &s, const char *fn, int ln)
+: filename(strsave(fn)), first_lineno(ln)
+{
+ buffer.move(s);
+ ptr = buffer.contents();
+ end = ptr + buffer.length();
+}
+
+input_item::~input_item()
+{
+ delete[] filename;
+}
+
+inline int input_item::peek_char()
+{
+ if (ptr >= end)
+ return EOF;
+ else
+ return (unsigned char)*ptr;
+}
+
+inline int input_item::get_char()
+{
+ if (ptr >= end)
+ return EOF;
+ else
+ return (unsigned char)*ptr++;
+}
+
+inline void input_item::skip_char()
+{
+ ptr++;
+}
+
+void input_item::get_location(const char **filenamep, int *linenop)
+{
+ *filenamep = filename;
+ if (ptr == buffer.contents())
+ *linenop = first_lineno;
+ else {
+ int ln = first_lineno;
+ const char *e = ptr - 1;
+ for (const char *p = buffer.contents(); p < e; p++)
+ if (*p == '\n')
+ ln++;
+ ln--; // Back up to identify line number _before_ last seen newline.
+ *linenop = ln;
+ }
+ return;
+}
+
+class input_stack {
+ static input_item *top;
+public:
+ static void init();
+ static int get_char();
+ static int peek_char();
+ static void skip_char() { top->skip_char(); }
+ static void push_file(const char *);
+ static void push_string(string &, const char *, int);
+ static void error(const char *format,
+ const errarg &arg1 = empty_errarg,
+ const errarg &arg2 = empty_errarg,
+ const errarg &arg3 = empty_errarg);
+};
+
+input_item *input_stack::top = 0;
+
+void input_stack::init()
+{
+ while (top) {
+ input_item *tem = top;
+ top = top->next;
+ delete tem;
+ }
+}
+
+int input_stack::get_char()
+{
+ while (top) {
+ int c = top->get_char();
+ if (c >= 0)
+ return c;
+ input_item *tem = top;
+ top = top->next;
+ delete tem;
+ }
+ return -1;
+}
+
+int input_stack::peek_char()
+{
+ while (top) {
+ int c = top->peek_char();
+ if (c >= 0)
+ return c;
+ input_item *tem = top;
+ top = top->next;
+ delete tem;
+ }
+ return -1;
+}
+
+void input_stack::push_file(const char *fn)
+{
+ FILE *fp;
+ if (strcmp(fn, "-") == 0) {
+ fp = stdin;
+ fn = "<standard input>";
+ }
+ else {
+ errno = 0;
+ fp = fopen(fn, "r");
+ if (fp == 0) {
+ error("can't open '%1': %2", fn, strerror(errno));
+ return;
+ }
+ }
+ string buf;
+ bool is_at_beginning_of_line = true;
+ int lineno = 1;
+ for (;;) {
+ int c = getc(fp);
+ if (is_at_beginning_of_line && c == '.') {
+ // replace lines beginning with .R1 or .R2 with a blank line
+ c = getc(fp);
+ if (c == 'R') {
+ c = getc(fp);
+ if (c == '1' || c == '2') {
+ int cc = c;
+ c = getc(fp);
+ if (compatible_flag || c == ' ' || c == '\n' || c == EOF) {
+ while (c != '\n' && c != EOF)
+ c = getc(fp);
+ }
+ else {
+ buf += '.';
+ buf += 'R';
+ buf += cc;
+ }
+ }
+ else {
+ buf += '.';
+ buf += 'R';
+ }
+ }
+ else
+ buf += '.';
+ }
+ if (c == EOF)
+ break;
+ if (is_invalid_input_char(c))
+ error_with_file_and_line(fn, lineno,
+ "invalid input character code %1", c);
+ else {
+ buf += c;
+ if (c == '\n') {
+ is_at_beginning_of_line = true;
+ lineno++;
+ }
+ else
+ is_at_beginning_of_line = false;
+ }
+ }
+ if (fp != stdin)
+ fclose(fp);
+ if (buf.length() > 0 && buf[buf.length() - 1] != '\n')
+ buf += '\n';
+ input_item *it = new input_item(buf, fn);
+ it->next = top;
+ top = it;
+}
+
+void input_stack::push_string(string &s, const char *filename, int lineno)
+{
+ input_item *it = new input_item(s, filename, lineno);
+ it->next = top;
+ top = it;
+}
+
+void input_stack::error(const char *format, const errarg &arg1,
+ const errarg &arg2, const errarg &arg3)
+{
+ const char *filename;
+ int lineno;
+ for (input_item *it = top; it; it = it->next) {
+ it->get_location(&filename, &lineno);
+ error_with_file_and_line(filename, lineno, format, arg1, arg2, arg3);
+ return;
+ }
+ ::error(format, arg1, arg2, arg3);
+}
+
+void command_error(const char *format, const errarg &arg1,
+ const errarg &arg2, const errarg &arg3)
+{
+ input_stack::error(format, arg1, arg2, arg3);
+}
+
+// # not recognized in ""
+// \<newline> is recognized in ""
+// # does not conceal newline
+// if missing closing quote, word extends to end of line
+// no special treatment of \ other than before newline
+// \<newline> not recognized after #
+// ; allowed as alternative to newline
+// ; not recognized in ""
+// don't clear word_buffer; just append on
+// return -1 for EOF, 0 for newline, 1 for word
+
+int get_word(string &word_buffer)
+{
+ int c = input_stack::get_char();
+ for (;;) {
+ if (c == '#') {
+ do {
+ c = input_stack::get_char();
+ } while (c != '\n' && c != EOF);
+ break;
+ }
+ if (c == '\\' && input_stack::peek_char() == '\n')
+ input_stack::skip_char();
+ else if (c != ' ' && c != '\t')
+ break;
+ c = input_stack::get_char();
+ }
+ if (c == EOF)
+ return -1;
+ if (c == '\n' || c == ';')
+ return 0;
+ if (c == '"') {
+ for (;;) {
+ c = input_stack::peek_char();
+ if (c == EOF || c == '\n')
+ break;
+ input_stack::skip_char();
+ if (c == '"') {
+ int d = input_stack::peek_char();
+ if (d == '"')
+ input_stack::skip_char();
+ else
+ break;
+ }
+ else if (c == '\\') {
+ int d = input_stack::peek_char();
+ if (d == '\n')
+ input_stack::skip_char();
+ else
+ word_buffer += '\\';
+ }
+ else
+ word_buffer += c;
+ }
+ return 1;
+ }
+ word_buffer += c;
+ for (;;) {
+ c = input_stack::peek_char();
+ if (c == ' ' || c == '\t' || c == '\n' || c == '#' || c == ';')
+ break;
+ input_stack::skip_char();
+ if (c == '\\') {
+ int d = input_stack::peek_char();
+ if (d == '\n')
+ input_stack::skip_char();
+ else
+ word_buffer += '\\';
+ }
+ else
+ word_buffer += c;
+ }
+ return 1;
+}
+
+union argument {
+ const char *s;
+ int n;
+};
+
+// This is for debugging.
+
+static void echo_command(int argc, argument *argv)
+{
+ for (int i = 0; i < argc; i++)
+ fprintf(stderr, "%s\n", argv[i].s);
+}
+
+static void include_command(int argc, argument *argv)
+{
+ assert(argc == 1);
+ input_stack::push_file(argv[0].s);
+}
+
+static void capitalize_command(int argc, argument *argv)
+{
+ if (argc > 0)
+ capitalize_fields = argv[0].s;
+ else
+ capitalize_fields.clear();
+}
+
+static void accumulate_command(int, argument *)
+{
+ accumulate = 1;
+}
+
+static void no_accumulate_command(int, argument *)
+{
+ accumulate = 0;
+}
+
+static void move_punctuation_command(int, argument *)
+{
+ move_punctuation = 1;
+}
+
+static void no_move_punctuation_command(int, argument *)
+{
+ move_punctuation = 0;
+}
+
+static void sort_command(int argc, argument *argv)
+{
+ if (argc == 0)
+ sort_fields = "AD";
+ else
+ sort_fields = argv[0].s;
+ accumulate = 1;
+}
+
+static void no_sort_command(int, argument *)
+{
+ sort_fields.clear();
+}
+
+static void articles_command(int argc, argument *argv)
+{
+ articles.clear();
+ int i;
+ for (i = 0; i < argc; i++) {
+ articles += argv[i].s;
+ articles += '\0';
+ }
+ int len = articles.length();
+ for (i = 0; i < len; i++)
+ articles[i] = cmlower(articles[i]);
+}
+
+static void database_command(int argc, argument *argv)
+{
+ for (int i = 0; i < argc; i++)
+ database_list.add_file(argv[i].s);
+}
+
+static void default_database_command(int, argument *)
+{
+ search_default = 1;
+}
+
+static void no_default_database_command(int, argument *)
+{
+ search_default = 0;
+}
+
+static void bibliography_command(int argc, argument *argv)
+{
+ have_bibliography = 1;
+ const char *saved_filename = current_filename;
+ int saved_lineno = current_lineno;
+ int saved_label_in_text = label_in_text;
+ label_in_text = 0;
+ if (!accumulate)
+ fputs(".]<\n", stdout);
+ for (int i = 0; i < argc; i++)
+ do_bib(argv[i].s);
+ if (accumulate)
+ output_references();
+ else
+ fputs(".]>\n", stdout);
+ current_filename = saved_filename;
+ current_lineno = saved_lineno;
+ label_in_text = saved_label_in_text;
+}
+
+static void annotate_command(int argc, argument *argv)
+{
+ if (argc > 0)
+ annotation_field = argv[0].s[0];
+ else
+ annotation_field = 'X';
+ if (argc == 2)
+ annotation_macro = argv[1].s;
+ else
+ annotation_macro = "AP";
+}
+
+static void no_annotate_command(int, argument *)
+{
+ annotation_macro.clear();
+ annotation_field = -1;
+}
+
+static void reverse_command(int, argument *argv)
+{
+ reverse_fields = argv[0].s;
+}
+
+static void no_reverse_command(int, argument *)
+{
+ reverse_fields.clear();
+}
+
+static void abbreviate_command(int argc, argument *argv)
+{
+ abbreviate_fields = argv[0].s;
+ period_before_initial = argc > 1 ? argv[1].s : ". ";
+ period_before_last_name = argc > 2 ? argv[2].s : ". ";
+ period_before_other = argc > 3 ? argv[3].s : ". ";
+ period_before_hyphen = argc > 4 ? argv[4].s : ".";
+}
+
+static void no_abbreviate_command(int, argument *)
+{
+ abbreviate_fields.clear();
+}
+
+string search_ignore_fields;
+
+static void search_ignore_command(int argc, argument *argv)
+{
+ if (argc > 0)
+ search_ignore_fields = argv[0].s;
+ else
+ search_ignore_fields = "XYZ";
+ search_ignore_fields += '\0';
+ linear_ignore_fields = search_ignore_fields.contents();
+}
+
+static void no_search_ignore_command(int, argument *)
+{
+ linear_ignore_fields = "";
+}
+
+static void search_truncate_command(int argc, argument *argv)
+{
+ if (argc > 0)
+ linear_truncate_len = argv[0].n;
+ else
+ linear_truncate_len = 6;
+}
+
+static void no_search_truncate_command(int, argument *)
+{
+ linear_truncate_len = -1;
+}
+
+static void discard_command(int argc, argument *argv)
+{
+ if (argc == 0)
+ discard_fields = "XYZ";
+ else
+ discard_fields = argv[0].s;
+ accumulate = 1;
+}
+
+static void no_discard_command(int, argument *)
+{
+ discard_fields.clear();
+}
+
+static void label_command(int, argument *argv)
+{
+ set_label_spec(argv[0].s);
+}
+
+static void abbreviate_label_ranges_command(int argc, argument *argv)
+{
+ abbreviate_label_ranges = 1;
+ label_range_indicator = argc > 0 ? argv[0].s : "-";
+}
+
+static void no_abbreviate_label_ranges_command(int, argument *)
+{
+ abbreviate_label_ranges = 0;
+}
+
+static void label_in_reference_command(int, argument *)
+{
+ label_in_reference = 1;
+}
+
+static void no_label_in_reference_command(int, argument *)
+{
+ label_in_reference = 0;
+}
+
+static void label_in_text_command(int, argument *)
+{
+ label_in_text = 1;
+}
+
+static void no_label_in_text_command(int, argument *)
+{
+ label_in_text = 0;
+}
+
+static void sort_adjacent_labels_command(int, argument *)
+{
+ sort_adjacent_labels = 1;
+}
+
+static void no_sort_adjacent_labels_command(int, argument *)
+{
+ sort_adjacent_labels = 0;
+}
+
+static void date_as_label_command(int argc, argument *argv)
+{
+ if (set_date_label_spec(argc > 0 ? argv[0].s : "D%a*"))
+ date_as_label = 1;
+}
+
+static void no_date_as_label_command(int, argument *)
+{
+ date_as_label = 0;
+}
+
+static void short_label_command(int, argument *argv)
+{
+ if (set_short_label_spec(argv[0].s))
+ short_label_flag = 1;
+}
+
+static void no_short_label_command(int, argument *)
+{
+ short_label_flag = 0;
+}
+
+static void compatible_command(int, argument *)
+{
+ compatible_flag = 1;
+}
+
+static void no_compatible_command(int, argument *)
+{
+ compatible_flag = 0;
+}
+
+static void join_authors_command(int argc, argument *argv)
+{
+ join_authors_exactly_two = argv[0].s;
+ join_authors_default = argc > 1 ? argv[1].s : argv[0].s;
+ join_authors_last_two = argc == 3 ? argv[2].s : argv[0].s;
+}
+
+static void bracket_label_command(int, argument *argv)
+{
+ pre_label = argv[0].s;
+ post_label = argv[1].s;
+ sep_label = argv[2].s;
+}
+
+static void separate_label_second_parts_command(int, argument *argv)
+{
+ separate_label_second_parts = argv[0].s;
+}
+
+static void et_al_command(int argc, argument *argv)
+{
+ et_al = argv[0].s;
+ et_al_min_elide = argv[1].n;
+ if (et_al_min_elide < 1)
+ et_al_min_elide = 1;
+ et_al_min_total = argc >= 3 ? argv[2].n : 0;
+}
+
+static void no_et_al_command(int, argument *)
+{
+ et_al.clear();
+ et_al_min_elide = 0;
+}
+
+typedef void (*command_t)(int, argument *);
+
+/* arg_types is a string describing the numbers and types of arguments.
+s means a string, i means an integer, f is a list of fields, F is
+a single field,
+? means that the previous argument is optional, * means that the
+previous argument can occur any number of times. */
+
+struct S {
+ const char *name;
+ command_t func;
+ const char *arg_types;
+} command_table[] = {
+ { "include", include_command, "s" },
+ { "echo", echo_command, "s*" },
+ { "capitalize", capitalize_command, "f?" },
+ { "accumulate", accumulate_command, "" },
+ { "no-accumulate", no_accumulate_command, "" },
+ { "move-punctuation", move_punctuation_command, "" },
+ { "no-move-punctuation", no_move_punctuation_command, "" },
+ { "sort", sort_command, "s?" },
+ { "no-sort", no_sort_command, "" },
+ { "articles", articles_command, "s*" },
+ { "database", database_command, "ss*" },
+ { "default-database", default_database_command, "" },
+ { "no-default-database", no_default_database_command, "" },
+ { "bibliography", bibliography_command, "ss*" },
+ { "annotate", annotate_command, "F?s?" },
+ { "no-annotate", no_annotate_command, "" },
+ { "reverse", reverse_command, "s" },
+ { "no-reverse", no_reverse_command, "" },
+ { "abbreviate", abbreviate_command, "ss?s?s?s?" },
+ { "no-abbreviate", no_abbreviate_command, "" },
+ { "search-ignore", search_ignore_command, "f?" },
+ { "no-search-ignore", no_search_ignore_command, "" },
+ { "search-truncate", search_truncate_command, "i?" },
+ { "no-search-truncate", no_search_truncate_command, "" },
+ { "discard", discard_command, "f?" },
+ { "no-discard", no_discard_command, "" },
+ { "label", label_command, "s" },
+ { "abbreviate-label-ranges", abbreviate_label_ranges_command, "s?" },
+ { "no-abbreviate-label-ranges", no_abbreviate_label_ranges_command, "" },
+ { "label-in-reference", label_in_reference_command, "" },
+ { "no-label-in-reference", no_label_in_reference_command, "" },
+ { "label-in-text", label_in_text_command, "" },
+ { "no-label-in-text", no_label_in_text_command, "" },
+ { "sort-adjacent-labels", sort_adjacent_labels_command, "" },
+ { "no-sort-adjacent-labels", no_sort_adjacent_labels_command, "" },
+ { "date-as-label", date_as_label_command, "s?" },
+ { "no-date-as-label", no_date_as_label_command, "" },
+ { "short-label", short_label_command, "s" },
+ { "no-short-label", no_short_label_command, "" },
+ { "compatible", compatible_command, "" },
+ { "no-compatible", no_compatible_command, "" },
+ { "join-authors", join_authors_command, "sss?" },
+ { "bracket-label", bracket_label_command, "sss" },
+ { "separate-label-second-parts", separate_label_second_parts_command, "s" },
+ { "et-al", et_al_command, "sii?" },
+ { "no-et-al", no_et_al_command, "" },
+};
+
+static int check_args(const char *types, const char *name,
+ int argc, argument *argv)
+{
+ int argno = 0;
+ while (*types) {
+ if (argc == 0) {
+ if (types[1] == '?')
+ break;
+ else if (types[1] == '*') {
+ assert(types[2] == '\0');
+ break;
+ }
+ else {
+ input_stack::error("missing argument for command '%1'", name);
+ return 0;
+ }
+ }
+ switch (*types) {
+ case 's':
+ break;
+ case 'i':
+ {
+ char *ptr;
+ long n = strtol(argv->s, &ptr, 10);
+ if ((n == 0 && ptr == argv->s)
+ || *ptr != '\0') {
+ input_stack::error("argument %1 for command '%2' must be an integer",
+ argno + 1, name);
+ return 0;
+ }
+ argv->n = (int)n;
+ break;
+ }
+ case 'f':
+ {
+ for (const char *ptr = argv->s; *ptr != '\0'; ptr++)
+ if (!cs_field_name(*ptr)) {
+ input_stack::error("argument %1 for command '%2' must be a list of fields",
+ argno + 1, name);
+ return 0;
+ }
+ break;
+ }
+ case 'F':
+ if (argv->s[0] == '\0' || argv->s[1] != '\0'
+ || !cs_field_name(argv->s[0])) {
+ input_stack::error("argument %1 for command '%2' must be a field name",
+ argno + 1, name);
+ return 0;
+ }
+ break;
+ default:
+ assert(0);
+ }
+ if (types[1] == '?')
+ types += 2;
+ else if (types[1] != '*')
+ types += 1;
+ --argc;
+ ++argv;
+ ++argno;
+ }
+ if (argc > 0) {
+ input_stack::error("too many arguments for command '%1'", name);
+ return 0;
+ }
+ return 1;
+}
+
+static void execute_command(const char *name, int argc, argument *argv)
+{
+ for (unsigned int i = 0;
+ i < sizeof(command_table)/sizeof(command_table[0]); i++)
+ if (strcmp(name, command_table[i].name) == 0) {
+ if (check_args(command_table[i].arg_types, name, argc, argv))
+ (*command_table[i].func)(argc, argv);
+ return;
+ }
+ input_stack::error("unknown command '%1'", name);
+}
+
+static void command_loop()
+{
+ string command;
+ for (;;) {
+ command.clear();
+ int res = get_word(command);
+ if (res != 1) {
+ if (res == 0)
+ continue;
+ break;
+ }
+ int argc = 0;
+ command += '\0';
+ while ((res = get_word(command)) == 1) {
+ argc++;
+ command += '\0';
+ }
+ argument *argv = new argument[argc];
+ const char *ptr = command.contents();
+ for (int i = 0; i < argc; i++)
+ argv[i].s = ptr = strchr(ptr, '\0') + 1;
+ execute_command(command.contents(), argc, argv);
+ delete[] argv;
+ if (res == -1)
+ break;
+ }
+}
+
+void process_commands(string &s, const char *file, int lineno)
+{
+ const char *saved_filename = current_filename;
+ int saved_lineno = current_lineno;
+ input_stack::init();
+ current_filename = file;
+ // Report diagnostics with respect to line _before_ last newline seen.
+ current_lineno = lineno - 1;
+ input_stack::push_string(s, file, lineno);
+ command_loop();
+ current_filename = saved_filename;
+ current_lineno = saved_lineno;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/refer/command.h b/src/preproc/refer/command.h
new file mode 100644
index 0000000..db850f4
--- /dev/null
+++ b/src/preproc/refer/command.h
@@ -0,0 +1,35 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+void process_commands(string &s, const char *file, int lineno);
+
+extern int have_bibliography;
+extern int accumulate;
+extern int move_punctuation;
+extern int search_default;
+extern search_list database_list;
+extern int label_in_text;
+extern int label_in_reference;
+extern int sort_adjacent_labels;
+extern string pre_label;
+extern string post_label;
+extern string sep_label;
+
+extern void do_bib(const char *);
+extern void output_references();
diff --git a/src/preproc/refer/label.cpp b/src/preproc/refer/label.cpp
new file mode 100644
index 0000000..f8c1645
--- /dev/null
+++ b/src/preproc/refer/label.cpp
@@ -0,0 +1,2607 @@
+/* A Bison parser, made by GNU Bison 3.8.2. */
+
+/* Bison implementation for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 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, see <https://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+ simplifying the original so-called "semantic" parser. */
+
+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+ especially those whose name start with YY_ or yy_. They are
+ private implementation details that can be changed or removed. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+/* Identify Bison output, and Bison version. */
+#define YYBISON 30802
+
+/* Bison version string. */
+#define YYBISON_VERSION "3.8.2"
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers. */
+#define YYPURE 0
+
+/* Push parsers. */
+#define YYPUSH 0
+
+/* Pull parsers. */
+#define YYPULL 1
+
+
+
+
+/* First part of user prologue. */
+#line 19 "../src/preproc/refer/label.ypp"
+
+
+#include "refer.h"
+#include "refid.h"
+#include "ref.h"
+#include "token.h"
+
+int yylex();
+void yyerror(const char *);
+
+static const char *format_serial(char c, int n);
+
+struct label_info {
+ int start;
+ int length;
+ int count;
+ int total;
+ label_info(const string &);
+};
+
+label_info *lookup_label(const string &label);
+
+struct expression {
+ enum {
+ // Does the tentative label depend on the reference?
+ CONTAINS_VARIABLE = 01,
+ CONTAINS_STAR = 02,
+ CONTAINS_FORMAT = 04,
+ CONTAINS_AT = 010
+ };
+ virtual ~expression() { }
+ virtual void evaluate(int, const reference &, string &,
+ substring_position &) = 0;
+ virtual unsigned analyze() { return 0; }
+};
+
+class at_expr : public expression {
+public:
+ at_expr() { }
+ void evaluate(int, const reference &, string &, substring_position &);
+ unsigned analyze() { return CONTAINS_VARIABLE|CONTAINS_AT; }
+};
+
+class format_expr : public expression {
+ char type;
+ int width;
+ int first_number;
+public:
+ format_expr(char c, int w = 0, int f = 1)
+ : type(c), width(w), first_number(f) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+ unsigned analyze() { return CONTAINS_FORMAT; }
+};
+
+class field_expr : public expression {
+ int number;
+ char name;
+public:
+ field_expr(char nm, int num) : number(num), name(nm) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+ unsigned analyze() { return CONTAINS_VARIABLE; }
+};
+
+class literal_expr : public expression {
+ string s;
+public:
+ literal_expr(const char *ptr, int len) : s(ptr, len) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+};
+
+class unary_expr : public expression {
+protected:
+ expression *expr;
+public:
+ unary_expr(expression *e) : expr(e) { }
+ ~unary_expr() { delete expr; }
+ void evaluate(int, const reference &, string &, substring_position &) = 0;
+ unsigned analyze() { return expr ? expr->analyze() : 0; }
+};
+
+// This caches the analysis of an expression.
+
+class analyzed_expr : public unary_expr {
+ unsigned flags;
+public:
+ analyzed_expr(expression *);
+ void evaluate(int, const reference &, string &, substring_position &);
+ unsigned analyze() { return flags; }
+};
+
+class star_expr : public unary_expr {
+public:
+ star_expr(expression *e) : unary_expr(e) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+ unsigned analyze() {
+ return ((expr ? (expr->analyze() & ~CONTAINS_VARIABLE) : 0)
+ | CONTAINS_STAR);
+ }
+};
+
+typedef void map_func(const char *, const char *, string &);
+
+class map_expr : public unary_expr {
+ map_func *func;
+public:
+ map_expr(expression *e, map_func *f) : unary_expr(e), func(f) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+};
+
+typedef const char *extractor_func(const char *, const char *, const char **);
+
+class extractor_expr : public unary_expr {
+ int part;
+ extractor_func *func;
+public:
+ enum { BEFORE = +1, MATCH = 0, AFTER = -1 };
+ extractor_expr(expression *e, extractor_func *f, int pt)
+ : unary_expr(e), part(pt), func(f) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+};
+
+class truncate_expr : public unary_expr {
+ int n;
+public:
+ truncate_expr(expression *e, int i) : unary_expr(e), n(i) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+};
+
+class separator_expr : public unary_expr {
+public:
+ separator_expr(expression *e) : unary_expr(e) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+};
+
+class binary_expr : public expression {
+protected:
+ expression *expr1;
+ expression *expr2;
+public:
+ binary_expr(expression *e1, expression *e2) : expr1(e1), expr2(e2) { }
+ ~binary_expr() { delete expr1; delete expr2; }
+ void evaluate(int, const reference &, string &, substring_position &) = 0;
+ unsigned analyze() {
+ return (expr1 ? expr1->analyze() : 0) | (expr2 ? expr2->analyze() : 0);
+ }
+};
+
+class alternative_expr : public binary_expr {
+public:
+ alternative_expr(expression *e1, expression *e2) : binary_expr(e1, e2) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+};
+
+class list_expr : public binary_expr {
+public:
+ list_expr(expression *e1, expression *e2) : binary_expr(e1, e2) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+};
+
+class substitute_expr : public binary_expr {
+public:
+ substitute_expr(expression *e1, expression *e2) : binary_expr(e1, e2) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+};
+
+class ternary_expr : public expression {
+protected:
+ expression *expr1;
+ expression *expr2;
+ expression *expr3;
+public:
+ ternary_expr(expression *e1, expression *e2, expression *e3)
+ : expr1(e1), expr2(e2), expr3(e3) { }
+ ~ternary_expr() { delete expr1; delete expr2; delete expr3; }
+ void evaluate(int, const reference &, string &, substring_position &) = 0;
+ unsigned analyze() {
+ return ((expr1 ? expr1->analyze() : 0)
+ | (expr2 ? expr2->analyze() : 0)
+ | (expr3 ? expr3->analyze() : 0));
+ }
+};
+
+class conditional_expr : public ternary_expr {
+public:
+ conditional_expr(expression *e1, expression *e2, expression *e3)
+ : ternary_expr(e1, e2, e3) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+};
+
+static expression *parsed_label = 0;
+static expression *parsed_date_label = 0;
+static expression *parsed_short_label = 0;
+
+static expression *parse_result;
+
+string literals;
+
+
+#line 270 "src/preproc/refer/label.cpp"
+
+# ifndef YY_CAST
+# ifdef __cplusplus
+# define YY_CAST(Type, Val) static_cast<Type> (Val)
+# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast<Type> (Val)
+# else
+# define YY_CAST(Type, Val) ((Type) (Val))
+# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val))
+# endif
+# endif
+# ifndef YY_NULLPTR
+# if defined __cplusplus
+# if 201103L <= __cplusplus
+# define YY_NULLPTR nullptr
+# else
+# define YY_NULLPTR 0
+# endif
+# else
+# define YY_NULLPTR ((void*)0)
+# endif
+# endif
+
+/* Use api.header.include to #include this header
+ instead of duplicating it here. */
+#ifndef YY_YY_SRC_PREPROC_REFER_LABEL_HPP_INCLUDED
+# define YY_YY_SRC_PREPROC_REFER_LABEL_HPP_INCLUDED
+/* Debug traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int yydebug;
+#endif
+
+/* Token kinds. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ enum yytokentype
+ {
+ YYEMPTY = -2,
+ YYEOF = 0, /* "end of file" */
+ YYerror = 256, /* error */
+ YYUNDEF = 257, /* "invalid token" */
+ TOKEN_LETTER = 258, /* TOKEN_LETTER */
+ TOKEN_LITERAL = 259, /* TOKEN_LITERAL */
+ TOKEN_DIGIT = 260 /* TOKEN_DIGIT */
+ };
+ typedef enum yytokentype yytoken_kind_t;
+#endif
+/* Token kinds. */
+#define YYEMPTY -2
+#define YYEOF 0
+#define YYerror 256
+#define YYUNDEF 257
+#define TOKEN_LETTER 258
+#define TOKEN_LITERAL 259
+#define TOKEN_DIGIT 260
+
+/* Value type. */
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+union YYSTYPE
+{
+#line 218 "../src/preproc/refer/label.ypp"
+
+ int num;
+ expression *expr;
+ struct { int ndigits; int val; } dig;
+ struct { int start; int len; } str;
+
+#line 340 "src/preproc/refer/label.cpp"
+
+};
+typedef union YYSTYPE YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+extern YYSTYPE yylval;
+
+
+int yyparse (void);
+
+
+#endif /* !YY_YY_SRC_PREPROC_REFER_LABEL_HPP_INCLUDED */
+/* Symbol kind. */
+enum yysymbol_kind_t
+{
+ YYSYMBOL_YYEMPTY = -2,
+ YYSYMBOL_YYEOF = 0, /* "end of file" */
+ YYSYMBOL_YYerror = 1, /* error */
+ YYSYMBOL_YYUNDEF = 2, /* "invalid token" */
+ YYSYMBOL_TOKEN_LETTER = 3, /* TOKEN_LETTER */
+ YYSYMBOL_TOKEN_LITERAL = 4, /* TOKEN_LITERAL */
+ YYSYMBOL_TOKEN_DIGIT = 5, /* TOKEN_DIGIT */
+ YYSYMBOL_6_ = 6, /* '?' */
+ YYSYMBOL_7_ = 7, /* ':' */
+ YYSYMBOL_8_ = 8, /* '|' */
+ YYSYMBOL_9_ = 9, /* '&' */
+ YYSYMBOL_10_ = 10, /* '~' */
+ YYSYMBOL_11_ = 11, /* '@' */
+ YYSYMBOL_12_ = 12, /* '%' */
+ YYSYMBOL_13_ = 13, /* '.' */
+ YYSYMBOL_14_ = 14, /* '+' */
+ YYSYMBOL_15_ = 15, /* '-' */
+ YYSYMBOL_16_ = 16, /* '*' */
+ YYSYMBOL_17_ = 17, /* '(' */
+ YYSYMBOL_18_ = 18, /* ')' */
+ YYSYMBOL_19_ = 19, /* '<' */
+ YYSYMBOL_20_ = 20, /* '>' */
+ YYSYMBOL_YYACCEPT = 21, /* $accept */
+ YYSYMBOL_expr = 22, /* expr */
+ YYSYMBOL_conditional = 23, /* conditional */
+ YYSYMBOL_optional_conditional = 24, /* optional_conditional */
+ YYSYMBOL_alternative = 25, /* alternative */
+ YYSYMBOL_list = 26, /* list */
+ YYSYMBOL_substitute = 27, /* substitute */
+ YYSYMBOL_string = 28, /* string */
+ YYSYMBOL_optional_number = 29, /* optional_number */
+ YYSYMBOL_number = 30, /* number */
+ YYSYMBOL_digits = 31, /* digits */
+ YYSYMBOL_flag = 32 /* flag */
+};
+typedef enum yysymbol_kind_t yysymbol_kind_t;
+
+
+
+
+#ifdef short
+# undef short
+#endif
+
+/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure
+ <limits.h> and (if available) <stdint.h> are included
+ so that the code can choose integer types of a good width. */
+
+#ifndef __PTRDIFF_MAX__
+# include <limits.h> /* INFRINGES ON USER NAME SPACE */
+# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+# include <stdint.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_STDINT_H
+# endif
+#endif
+
+/* Narrow types that promote to a signed type and that can represent a
+ signed or unsigned integer of at least N bits. In tables they can
+ save space and decrease cache pressure. Promoting to a signed type
+ helps avoid bugs in integer arithmetic. */
+
+#ifdef __INT_LEAST8_MAX__
+typedef __INT_LEAST8_TYPE__ yytype_int8;
+#elif defined YY_STDINT_H
+typedef int_least8_t yytype_int8;
+#else
+typedef signed char yytype_int8;
+#endif
+
+#ifdef __INT_LEAST16_MAX__
+typedef __INT_LEAST16_TYPE__ yytype_int16;
+#elif defined YY_STDINT_H
+typedef int_least16_t yytype_int16;
+#else
+typedef short yytype_int16;
+#endif
+
+/* Work around bug in HP-UX 11.23, which defines these macros
+ incorrectly for preprocessor constants. This workaround can likely
+ be removed in 2023, as HPE has promised support for HP-UX 11.23
+ (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of
+ <https://h20195.www2.hpe.com/V2/getpdf.aspx/4AA4-7673ENW.pdf>. */
+#ifdef __hpux
+# undef UINT_LEAST8_MAX
+# undef UINT_LEAST16_MAX
+# define UINT_LEAST8_MAX 255
+# define UINT_LEAST16_MAX 65535
+#endif
+
+#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST8_TYPE__ yytype_uint8;
+#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \
+ && UINT_LEAST8_MAX <= INT_MAX)
+typedef uint_least8_t yytype_uint8;
+#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX
+typedef unsigned char yytype_uint8;
+#else
+typedef short yytype_uint8;
+#endif
+
+#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST16_TYPE__ yytype_uint16;
+#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \
+ && UINT_LEAST16_MAX <= INT_MAX)
+typedef uint_least16_t yytype_uint16;
+#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX
+typedef unsigned short yytype_uint16;
+#else
+typedef int yytype_uint16;
+#endif
+
+#ifndef YYPTRDIFF_T
+# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__
+# define YYPTRDIFF_T __PTRDIFF_TYPE__
+# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__
+# elif defined PTRDIFF_MAX
+# ifndef ptrdiff_t
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# endif
+# define YYPTRDIFF_T ptrdiff_t
+# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX
+# else
+# define YYPTRDIFF_T long
+# define YYPTRDIFF_MAXIMUM LONG_MAX
+# endif
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+# define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+# define YYSIZE_T size_t
+# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# else
+# define YYSIZE_T unsigned
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM \
+ YY_CAST (YYPTRDIFF_T, \
+ (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \
+ ? YYPTRDIFF_MAXIMUM \
+ : YY_CAST (YYSIZE_T, -1)))
+
+#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))
+
+
+/* Stored state numbers (used for stacks). */
+typedef yytype_int8 yy_state_t;
+
+/* State numbers in computations. */
+typedef int yy_state_fast_t;
+
+#ifndef YY_
+# if defined YYENABLE_NLS && YYENABLE_NLS
+# if ENABLE_NLS
+# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_(Msgid) dgettext ("bison-runtime", Msgid)
+# endif
+# endif
+# ifndef YY_
+# define YY_(Msgid) Msgid
+# endif
+#endif
+
+
+#ifndef YY_ATTRIBUTE_PURE
+# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
+# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+# define YY_ATTRIBUTE_PURE
+# endif
+#endif
+
+#ifndef YY_ATTRIBUTE_UNUSED
+# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
+# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+# else
+# define YY_ATTRIBUTE_UNUSED
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E. */
+#if ! defined lint || defined __GNUC__
+# define YY_USE(E) ((void) (E))
+#else
+# define YY_USE(E) /* empty */
+#endif
+
+/* Suppress an incorrect diagnostic about yylval being uninitialized. */
+#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__
+# if __GNUC__ * 100 + __GNUC_MINOR__ < 407
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")
+# else
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \
+ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+# endif
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
+ _Pragma ("GCC diagnostic pop")
+#else
+# define YY_INITIAL_VALUE(Value) Value
+#endif
+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END
+#endif
+#ifndef YY_INITIAL_VALUE
+# define YY_INITIAL_VALUE(Value) /* Nothing. */
+#endif
+
+#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__
+# define YY_IGNORE_USELESS_CAST_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"")
+# define YY_IGNORE_USELESS_CAST_END \
+ _Pragma ("GCC diagnostic pop")
+#endif
+#ifndef YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_END
+#endif
+
+
+#define YY_ASSERT(E) ((void) (0 && (E)))
+
+#if !defined yyoverflow
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# ifdef YYSTACK_USE_ALLOCA
+# if YYSTACK_USE_ALLOCA
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# elif defined __BUILTIN_VA_ARG_INCR
+# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+# elif defined _AIX
+# define YYSTACK_ALLOC __alloca
+# elif defined _MSC_VER
+# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+# define alloca _alloca
+# else
+# define YYSTACK_ALLOC alloca
+# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+ /* Use EXIT_SUCCESS as a witness for stdlib.h. */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's 'empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# ifndef YYSTACK_ALLOC_MAXIMUM
+ /* The OS might guarantee only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
+ to allow for a few compiler-allocated temporary stack slots. */
+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+# endif
+# else
+# define YYSTACK_ALLOC YYMALLOC
+# define YYSTACK_FREE YYFREE
+# ifndef YYSTACK_ALLOC_MAXIMUM
+# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+# endif
+# if (defined __cplusplus && ! defined EXIT_SUCCESS \
+ && ! ((defined YYMALLOC || defined malloc) \
+ && (defined YYFREE || defined free)))
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# ifndef YYMALLOC
+# define YYMALLOC malloc
+# if ! defined malloc && ! defined EXIT_SUCCESS
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# ifndef YYFREE
+# define YYFREE free
+# if ! defined free && ! defined EXIT_SUCCESS
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# endif
+#endif /* !defined yyoverflow */
+
+#if (! defined yyoverflow \
+ && (! defined __cplusplus \
+ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ yy_state_t yyss_alloc;
+ YYSTYPE yyvs_alloc;
+};
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# define YYSTACK_BYTES(N) \
+ ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
+
+# define YYCOPY_NEEDED 1
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
+ do \
+ { \
+ YYPTRDIFF_T yynewbytes; \
+ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
+ Stack = &yyptr->Stack_alloc; \
+ yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / YYSIZEOF (*yyptr); \
+ } \
+ while (0)
+
+#endif
+
+#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
+/* Copy COUNT objects from SRC to DST. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if defined __GNUC__ && 1 < __GNUC__
+# define YYCOPY(Dst, Src, Count) \
+ __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src)))
+# else
+# define YYCOPY(Dst, Src, Count) \
+ do \
+ { \
+ YYPTRDIFF_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (Dst)[yyi] = (Src)[yyi]; \
+ } \
+ while (0)
+# endif
+# endif
+#endif /* !YYCOPY_NEEDED */
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 21
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 39
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 21
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 12
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 34
+/* YYNSTATES -- Number of states. */
+#define YYNSTATES 49
+
+/* YYMAXUTOK -- Last valid token kind. */
+#define YYMAXUTOK 260
+
+
+/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
+ as returned by yylex, with out-of-bounds checking. */
+#define YYTRANSLATE(YYX) \
+ (0 <= (YYX) && (YYX) <= YYMAXUTOK \
+ ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \
+ : YYSYMBOL_YYUNDEF)
+
+/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
+ as returned by yylex. */
+static const yytype_int8 yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 12, 9, 2,
+ 17, 18, 16, 14, 2, 15, 13, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 7, 2,
+ 19, 2, 20, 6, 11, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 8, 2, 10, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
+ 5
+};
+
+#if YYDEBUG
+/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
+static const yytype_int16 yyrline[] =
+{
+ 0, 246, 246, 251, 253, 259, 260, 265, 267, 269,
+ 274, 276, 281, 283, 288, 290, 295, 297, 299, 315,
+ 319, 350, 352, 354, 356, 358, 364, 365, 370, 372,
+ 377, 379, 386, 387, 389
+};
+#endif
+
+/** Accessing symbol of state STATE. */
+#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State])
+
+#if YYDEBUG || 0
+/* The user-facing name of the symbol whose (internal) number is
+ YYSYMBOL. No bounds checking. */
+static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
+
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+ "\"end of file\"", "error", "\"invalid token\"", "TOKEN_LETTER",
+ "TOKEN_LITERAL", "TOKEN_DIGIT", "'?'", "':'", "'|'", "'&'", "'~'", "'@'",
+ "'%'", "'.'", "'+'", "'-'", "'*'", "'('", "')'", "'<'", "'>'", "$accept",
+ "expr", "conditional", "optional_conditional", "alternative", "list",
+ "substitute", "string", "optional_number", "number", "digits", "flag", YY_NULLPTR
+};
+
+static const char *
+yysymbol_name (yysymbol_kind_t yysymbol)
+{
+ return yytname[yysymbol];
+}
+#endif
+
+#define YYPACT_NINF (-26)
+
+#define yypact_value_is_default(Yyn) \
+ ((Yyn) == YYPACT_NINF)
+
+#define YYTABLE_NINF (-1)
+
+#define yytable_value_is_error(Yyn) \
+ 0
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+static const yytype_int8 yypact[] =
+{
+ 2, 11, -26, -26, 12, 2, 2, 24, -26, -26,
+ 21, 2, 18, -6, -26, 26, -26, -26, 27, 15,
+ 14, -26, 2, 2, 2, 18, 2, -3, 11, 11,
+ -26, -26, -26, -26, -26, 28, 2, 2, -6, -26,
+ -26, 33, 26, 26, 2, 11, -26, -26, 26
+};
+
+/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+ Performed when YYTABLE does not specify something else to do. Zero
+ means the default is an error. */
+static const yytype_int8 yydefact[] =
+{
+ 5, 16, 15, 14, 0, 5, 5, 0, 6, 2,
+ 3, 7, 10, 12, 28, 17, 18, 30, 19, 0,
+ 0, 1, 5, 0, 0, 11, 0, 32, 0, 0,
+ 23, 29, 31, 24, 25, 0, 8, 9, 13, 33,
+ 34, 0, 21, 22, 0, 26, 4, 20, 27
+};
+
+/* YYPGOTO[NTERM-NUM]. */
+static const yytype_int8 yypgoto[] =
+{
+ -26, -26, -7, -4, -26, -1, -11, 13, -26, -25,
+ -26, -26
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yytype_int8 yydefgoto[] =
+{
+ 0, 7, 8, 9, 10, 11, 12, 13, 47, 15,
+ 18, 41
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule whose
+ number is the opposite. If YYTABLE_NINF, syntax error. */
+static const yytype_int8 yytable[] =
+{
+ 25, 19, 20, 42, 43, 1, 2, 27, 28, 29,
+ 30, 39, 40, 3, 4, 16, 14, 17, 35, 5,
+ 48, 6, 36, 37, 21, 25, 25, 22, 26, 23,
+ 24, 31, 32, 33, 34, 44, 45, 46, 0, 38
+};
+
+static const yytype_int8 yycheck[] =
+{
+ 11, 5, 6, 28, 29, 3, 4, 13, 14, 15,
+ 16, 14, 15, 11, 12, 3, 5, 5, 22, 17,
+ 45, 19, 23, 24, 0, 36, 37, 6, 10, 8,
+ 9, 5, 5, 18, 20, 7, 3, 44, -1, 26
+};
+
+/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of
+ state STATE-NUM. */
+static const yytype_int8 yystos[] =
+{
+ 0, 3, 4, 11, 12, 17, 19, 22, 23, 24,
+ 25, 26, 27, 28, 5, 30, 3, 5, 31, 24,
+ 24, 0, 6, 8, 9, 27, 10, 13, 14, 15,
+ 16, 5, 5, 18, 20, 24, 26, 26, 28, 14,
+ 15, 32, 30, 30, 7, 3, 23, 29, 30
+};
+
+/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */
+static const yytype_int8 yyr1[] =
+{
+ 0, 21, 22, 23, 23, 24, 24, 25, 25, 25,
+ 26, 26, 27, 27, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 29, 29, 30, 30,
+ 31, 31, 32, 32, 32
+};
+
+/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */
+static const yytype_int8 yyr2[] =
+{
+ 0, 2, 1, 1, 5, 0, 1, 1, 3, 3,
+ 1, 2, 1, 3, 1, 1, 1, 2, 2, 2,
+ 5, 3, 3, 2, 3, 3, 0, 1, 1, 2,
+ 1, 2, 0, 1, 1
+};
+
+
+enum { YYENOMEM = -2 };
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrorlab
+#define YYNOMEM goto yyexhaustedlab
+
+
+#define YYRECOVERING() (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value) \
+ do \
+ if (yychar == YYEMPTY) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ YYPOPSTACK (yylen); \
+ yystate = *yyssp; \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror (YY_("syntax error: cannot back up")); \
+ YYERROR; \
+ } \
+ while (0)
+
+/* Backward compatibility with an undocumented macro.
+ Use YYerror or YYUNDEF. */
+#define YYERRCODE YYUNDEF
+
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (0)
+
+
+
+
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yy_symbol_print (stderr, \
+ Kind, Value); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (0)
+
+
+/*-----------------------------------.
+| Print this symbol's value on YYO. |
+`-----------------------------------*/
+
+static void
+yy_symbol_value_print (FILE *yyo,
+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep)
+{
+ FILE *yyoutput = yyo;
+ YY_USE (yyoutput);
+ if (!yyvaluep)
+ return;
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YY_USE (yykind);
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+/*---------------------------.
+| Print this symbol on YYO. |
+`---------------------------*/
+
+static void
+yy_symbol_print (FILE *yyo,
+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep)
+{
+ YYFPRINTF (yyo, "%s %s (",
+ yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind));
+
+ yy_symbol_value_print (yyo, yykind, yyvaluep);
+ YYFPRINTF (yyo, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included). |
+`------------------------------------------------------------------*/
+
+static void
+yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop)
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (; yybottom <= yytop; yybottom++)
+ {
+ int yybot = *yybottom;
+ YYFPRINTF (stderr, " %d", yybot);
+ }
+ YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+
+static void
+yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp,
+ int yyrule)
+{
+ int yylno = yyrline[yyrule];
+ int yynrhs = yyr2[yyrule];
+ int yyi;
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n",
+ yyrule - 1, yylno);
+ /* The symbols being reduced. */
+ for (yyi = 0; yyi < yynrhs; yyi++)
+ {
+ YYFPRINTF (stderr, " $%d = ", yyi + 1);
+ yy_symbol_print (stderr,
+ YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]),
+ &yyvsp[(yyi + 1) - (yynrhs)]);
+ YYFPRINTF (stderr, "\n");
+ }
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (yyssp, yyvsp, Rule); \
+} while (0)
+
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args) ((void) 0)
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+
+
+
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
+
+static void
+yydestruct (const char *yymsg,
+ yysymbol_kind_t yykind, YYSTYPE *yyvaluep)
+{
+ YY_USE (yyvaluep);
+ if (!yymsg)
+ yymsg = "Deleting";
+ YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YY_USE (yykind);
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+/* Lookahead token kind. */
+int yychar;
+
+/* The semantic value of the lookahead symbol. */
+YYSTYPE yylval;
+/* Number of syntax errors so far. */
+int yynerrs;
+
+
+
+
+/*----------.
+| yyparse. |
+`----------*/
+
+int
+yyparse (void)
+{
+ yy_state_fast_t yystate = 0;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus = 0;
+
+ /* Refer to the stacks through separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* Their size. */
+ YYPTRDIFF_T yystacksize = YYINITDEPTH;
+
+ /* The state stack: array, bottom, top. */
+ yy_state_t yyssa[YYINITDEPTH];
+ yy_state_t *yyss = yyssa;
+ yy_state_t *yyssp = yyss;
+
+ /* The semantic value stack: array, bottom, top. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs = yyvsa;
+ YYSTYPE *yyvsp = yyvs;
+
+ int yyn;
+ /* The return value of yyparse. */
+ int yyresult;
+ /* Lookahead symbol kind. */
+ yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY;
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+
+
+
+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
+
+ /* The number of symbols on the RHS of the reduced rule.
+ Keep to zero when no symbol should be popped. */
+ int yylen = 0;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ goto yysetstate;
+
+
+/*------------------------------------------------------------.
+| yynewstate -- push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. So pushing a state here evens the stacks. */
+ yyssp++;
+
+
+/*--------------------------------------------------------------------.
+| yysetstate -- set current state (the top of the stack) to yystate. |
+`--------------------------------------------------------------------*/
+yysetstate:
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+ YY_ASSERT (0 <= yystate && yystate < YYNSTATES);
+ YY_IGNORE_USELESS_CAST_BEGIN
+ *yyssp = YY_CAST (yy_state_t, yystate);
+ YY_IGNORE_USELESS_CAST_END
+ YY_STACK_PRINT (yyss, yyssp);
+
+ if (yyss + yystacksize - 1 <= yyssp)
+#if !defined yyoverflow && !defined YYSTACK_RELOCATE
+ YYNOMEM;
+#else
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYPTRDIFF_T yysize = yyssp - yyss + 1;
+
+# if defined yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ yy_state_t *yyss1 = yyss;
+ YYSTYPE *yyvs1 = yyvs;
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow (YY_("memory exhausted"),
+ &yyss1, yysize * YYSIZEOF (*yyssp),
+ &yyvs1, yysize * YYSIZEOF (*yyvsp),
+ &yystacksize);
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+# else /* defined YYSTACK_RELOCATE */
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+ YYNOMEM;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ yy_state_t *yyss1 = yyss;
+ union yyalloc *yyptr =
+ YY_CAST (union yyalloc *,
+ YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
+ if (! yyptr)
+ YYNOMEM;
+ YYSTACK_RELOCATE (yyss_alloc, yyss);
+ YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+
+ YY_IGNORE_USELESS_CAST_BEGIN
+ YYDPRINTF ((stderr, "Stack size increased to %ld\n",
+ YY_CAST (long, yystacksize)));
+ YY_IGNORE_USELESS_CAST_END
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ YYABORT;
+ }
+#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
+
+
+ if (yystate == YYFINAL)
+ YYACCEPT;
+
+ goto yybackup;
+
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+ /* Do appropriate processing given the current state. Read a
+ lookahead token if we need one and don't already have one. */
+
+ /* First try to decide what to do without reference to lookahead token. */
+ yyn = yypact[yystate];
+ if (yypact_value_is_default (yyn))
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token\n"));
+ yychar = yylex ();
+ }
+
+ if (yychar <= YYEOF)
+ {
+ yychar = YYEOF;
+ yytoken = YYSYMBOL_YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else if (yychar == YYerror)
+ {
+ /* The scanner already issued an error message, process directly
+ to error recovery. But do not keep the error token as
+ lookahead, it is too special and may lead us to an endless
+ loop in error recovery. */
+ yychar = YYUNDEF;
+ yytoken = YYSYMBOL_YYerror;
+ goto yyerrlab1;
+ }
+ else
+ {
+ yytoken = YYTRANSLATE (yychar);
+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+ }
+
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+ goto yydefault;
+ yyn = yytable[yyn];
+ if (yyn <= 0)
+ {
+ if (yytable_value_is_error (yyn))
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ /* Shift the lookahead token. */
+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+ yystate = yyn;
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+ /* Discard the shifted token. */
+ yychar = YYEMPTY;
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ '$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 2: /* expr: optional_conditional */
+#line 247 "../src/preproc/refer/label.ypp"
+ { parse_result = ((yyvsp[0].expr) ? new analyzed_expr((yyvsp[0].expr)) : 0); }
+#line 1370 "src/preproc/refer/label.cpp"
+ break;
+
+ case 3: /* conditional: alternative */
+#line 252 "../src/preproc/refer/label.ypp"
+ { (yyval.expr) = (yyvsp[0].expr); }
+#line 1376 "src/preproc/refer/label.cpp"
+ break;
+
+ case 4: /* conditional: alternative '?' optional_conditional ':' conditional */
+#line 254 "../src/preproc/refer/label.ypp"
+ { (yyval.expr) = new conditional_expr((yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1382 "src/preproc/refer/label.cpp"
+ break;
+
+ case 5: /* optional_conditional: %empty */
+#line 259 "../src/preproc/refer/label.ypp"
+ { (yyval.expr) = 0; }
+#line 1388 "src/preproc/refer/label.cpp"
+ break;
+
+ case 6: /* optional_conditional: conditional */
+#line 261 "../src/preproc/refer/label.ypp"
+ { (yyval.expr) = (yyvsp[0].expr); }
+#line 1394 "src/preproc/refer/label.cpp"
+ break;
+
+ case 7: /* alternative: list */
+#line 266 "../src/preproc/refer/label.ypp"
+ { (yyval.expr) = (yyvsp[0].expr); }
+#line 1400 "src/preproc/refer/label.cpp"
+ break;
+
+ case 8: /* alternative: alternative '|' list */
+#line 268 "../src/preproc/refer/label.ypp"
+ { (yyval.expr) = new alternative_expr((yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1406 "src/preproc/refer/label.cpp"
+ break;
+
+ case 9: /* alternative: alternative '&' list */
+#line 270 "../src/preproc/refer/label.ypp"
+ { (yyval.expr) = new conditional_expr((yyvsp[-2].expr), (yyvsp[0].expr), 0); }
+#line 1412 "src/preproc/refer/label.cpp"
+ break;
+
+ case 10: /* list: substitute */
+#line 275 "../src/preproc/refer/label.ypp"
+ { (yyval.expr) = (yyvsp[0].expr); }
+#line 1418 "src/preproc/refer/label.cpp"
+ break;
+
+ case 11: /* list: list substitute */
+#line 277 "../src/preproc/refer/label.ypp"
+ { (yyval.expr) = new list_expr((yyvsp[-1].expr), (yyvsp[0].expr)); }
+#line 1424 "src/preproc/refer/label.cpp"
+ break;
+
+ case 12: /* substitute: string */
+#line 282 "../src/preproc/refer/label.ypp"
+ { (yyval.expr) = (yyvsp[0].expr); }
+#line 1430 "src/preproc/refer/label.cpp"
+ break;
+
+ case 13: /* substitute: substitute '~' string */
+#line 284 "../src/preproc/refer/label.ypp"
+ { (yyval.expr) = new substitute_expr((yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1436 "src/preproc/refer/label.cpp"
+ break;
+
+ case 14: /* string: '@' */
+#line 289 "../src/preproc/refer/label.ypp"
+ { (yyval.expr) = new at_expr; }
+#line 1442 "src/preproc/refer/label.cpp"
+ break;
+
+ case 15: /* string: TOKEN_LITERAL */
+#line 291 "../src/preproc/refer/label.ypp"
+ {
+ (yyval.expr) = new literal_expr(literals.contents() + (yyvsp[0].str).start,
+ (yyvsp[0].str).len);
+ }
+#line 1451 "src/preproc/refer/label.cpp"
+ break;
+
+ case 16: /* string: TOKEN_LETTER */
+#line 296 "../src/preproc/refer/label.ypp"
+ { (yyval.expr) = new field_expr((yyvsp[0].num), 0); }
+#line 1457 "src/preproc/refer/label.cpp"
+ break;
+
+ case 17: /* string: TOKEN_LETTER number */
+#line 298 "../src/preproc/refer/label.ypp"
+ { (yyval.expr) = new field_expr((yyvsp[-1].num), (yyvsp[0].num) - 1); }
+#line 1463 "src/preproc/refer/label.cpp"
+ break;
+
+ case 18: /* string: '%' TOKEN_LETTER */
+#line 300 "../src/preproc/refer/label.ypp"
+ {
+ switch ((yyvsp[0].num)) {
+ case 'I':
+ case 'i':
+ case 'A':
+ case 'a':
+ (yyval.expr) = new format_expr((yyvsp[0].num));
+ break;
+ default:
+ command_error("unrecognized format '%1'", char((yyvsp[0].num)));
+ (yyval.expr) = new format_expr('a');
+ break;
+ }
+ }
+#line 1482 "src/preproc/refer/label.cpp"
+ break;
+
+ case 19: /* string: '%' digits */
+#line 316 "../src/preproc/refer/label.ypp"
+ {
+ (yyval.expr) = new format_expr('0', (yyvsp[0].dig).ndigits, (yyvsp[0].dig).val);
+ }
+#line 1490 "src/preproc/refer/label.cpp"
+ break;
+
+ case 20: /* string: string '.' flag TOKEN_LETTER optional_number */
+#line 320 "../src/preproc/refer/label.ypp"
+ {
+ switch ((yyvsp[-1].num)) {
+ case 'l':
+ (yyval.expr) = new map_expr((yyvsp[-4].expr), lowercase);
+ break;
+ case 'u':
+ (yyval.expr) = new map_expr((yyvsp[-4].expr), uppercase);
+ break;
+ case 'c':
+ (yyval.expr) = new map_expr((yyvsp[-4].expr), capitalize);
+ break;
+ case 'r':
+ (yyval.expr) = new map_expr((yyvsp[-4].expr), reverse_name);
+ break;
+ case 'a':
+ (yyval.expr) = new map_expr((yyvsp[-4].expr), abbreviate_name);
+ break;
+ case 'y':
+ (yyval.expr) = new extractor_expr((yyvsp[-4].expr), find_year, (yyvsp[-2].num));
+ break;
+ case 'n':
+ (yyval.expr) = new extractor_expr((yyvsp[-4].expr), find_last_name, (yyvsp[-2].num));
+ break;
+ default:
+ (yyval.expr) = (yyvsp[-4].expr);
+ command_error("unknown function '%1'", char((yyvsp[-1].num)));
+ break;
+ }
+ }
+#line 1524 "src/preproc/refer/label.cpp"
+ break;
+
+ case 21: /* string: string '+' number */
+#line 351 "../src/preproc/refer/label.ypp"
+ { (yyval.expr) = new truncate_expr((yyvsp[-2].expr), (yyvsp[0].num)); }
+#line 1530 "src/preproc/refer/label.cpp"
+ break;
+
+ case 22: /* string: string '-' number */
+#line 353 "../src/preproc/refer/label.ypp"
+ { (yyval.expr) = new truncate_expr((yyvsp[-2].expr), -(yyvsp[0].num)); }
+#line 1536 "src/preproc/refer/label.cpp"
+ break;
+
+ case 23: /* string: string '*' */
+#line 355 "../src/preproc/refer/label.ypp"
+ { (yyval.expr) = new star_expr((yyvsp[-1].expr)); }
+#line 1542 "src/preproc/refer/label.cpp"
+ break;
+
+ case 24: /* string: '(' optional_conditional ')' */
+#line 357 "../src/preproc/refer/label.ypp"
+ { (yyval.expr) = (yyvsp[-1].expr); }
+#line 1548 "src/preproc/refer/label.cpp"
+ break;
+
+ case 25: /* string: '<' optional_conditional '>' */
+#line 359 "../src/preproc/refer/label.ypp"
+ { (yyval.expr) = new separator_expr((yyvsp[-1].expr)); }
+#line 1554 "src/preproc/refer/label.cpp"
+ break;
+
+ case 26: /* optional_number: %empty */
+#line 364 "../src/preproc/refer/label.ypp"
+ { (yyval.num) = -1; }
+#line 1560 "src/preproc/refer/label.cpp"
+ break;
+
+ case 27: /* optional_number: number */
+#line 366 "../src/preproc/refer/label.ypp"
+ { (yyval.num) = (yyvsp[0].num); }
+#line 1566 "src/preproc/refer/label.cpp"
+ break;
+
+ case 28: /* number: TOKEN_DIGIT */
+#line 371 "../src/preproc/refer/label.ypp"
+ { (yyval.num) = (yyvsp[0].num); }
+#line 1572 "src/preproc/refer/label.cpp"
+ break;
+
+ case 29: /* number: number TOKEN_DIGIT */
+#line 373 "../src/preproc/refer/label.ypp"
+ { (yyval.num) = (yyvsp[-1].num)*10 + (yyvsp[0].num); }
+#line 1578 "src/preproc/refer/label.cpp"
+ break;
+
+ case 30: /* digits: TOKEN_DIGIT */
+#line 378 "../src/preproc/refer/label.ypp"
+ { (yyval.dig).ndigits = 1; (yyval.dig).val = (yyvsp[0].num); }
+#line 1584 "src/preproc/refer/label.cpp"
+ break;
+
+ case 31: /* digits: digits TOKEN_DIGIT */
+#line 380 "../src/preproc/refer/label.ypp"
+ { (yyval.dig).ndigits = (yyvsp[-1].dig).ndigits + 1; (yyval.dig).val = (yyvsp[-1].dig).val*10 + (yyvsp[0].num); }
+#line 1590 "src/preproc/refer/label.cpp"
+ break;
+
+ case 32: /* flag: %empty */
+#line 386 "../src/preproc/refer/label.ypp"
+ { (yyval.num) = 0; }
+#line 1596 "src/preproc/refer/label.cpp"
+ break;
+
+ case 33: /* flag: '+' */
+#line 388 "../src/preproc/refer/label.ypp"
+ { (yyval.num) = 1; }
+#line 1602 "src/preproc/refer/label.cpp"
+ break;
+
+ case 34: /* flag: '-' */
+#line 390 "../src/preproc/refer/label.ypp"
+ { (yyval.num) = -1; }
+#line 1608 "src/preproc/refer/label.cpp"
+ break;
+
+
+#line 1612 "src/preproc/refer/label.cpp"
+
+ default: break;
+ }
+ /* User semantic actions sometimes alter yychar, and that requires
+ that yytoken be updated with the new translation. We take the
+ approach of translating immediately before every use of yytoken.
+ One alternative is translating here after every semantic action,
+ but that translation would be missed if the semantic action invokes
+ YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
+ if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an
+ incorrect destructor might then be invoked immediately. In the
+ case of YYERROR or YYBACKUP, subsequent parser actions might lead
+ to an incorrect destructor call or verbose syntax error message
+ before the lookahead is translated. */
+ YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc);
+
+ YYPOPSTACK (yylen);
+ yylen = 0;
+
+ *++yyvsp = yyval;
+
+ /* Now 'shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+ {
+ const int yylhs = yyr1[yyn] - YYNTOKENS;
+ const int yyi = yypgoto[yylhs] + *yyssp;
+ yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp
+ ? yytable[yyi]
+ : yydefgoto[yylhs]);
+ }
+
+ goto yynewstate;
+
+
+/*--------------------------------------.
+| yyerrlab -- here on detecting error. |
+`--------------------------------------*/
+yyerrlab:
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar);
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+ yyerror (YY_("syntax error"));
+ }
+
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ if (yychar <= YYEOF)
+ {
+ /* Return failure if at end of input. */
+ if (yychar == YYEOF)
+ YYABORT;
+ }
+ else
+ {
+ yydestruct ("Error: discarding",
+ yytoken, &yylval);
+ yychar = YYEMPTY;
+ }
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+ goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR. |
+`---------------------------------------------------*/
+yyerrorlab:
+ /* Pacify compilers when the user code never invokes YYERROR and the
+ label yyerrorlab therefore never appears in user code. */
+ if (0)
+ YYERROR;
+ ++yynerrs;
+
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYERROR. */
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+ yystate = *yyssp;
+ goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR. |
+`-------------------------------------------------------------*/
+yyerrlab1:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ /* Pop stack until we find a state that shifts the error token. */
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (!yypact_value_is_default (yyn))
+ {
+ yyn += YYSYMBOL_YYerror;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
+
+
+ yydestruct ("Error: popping",
+ YY_ACCESSING_SYMBOL (yystate), yyvsp);
+ YYPOPSTACK (1);
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+
+ /* Shift the error token. */
+ YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp);
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturnlab;
+
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturnlab;
+
+
+/*-----------------------------------------------------------.
+| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. |
+`-----------------------------------------------------------*/
+yyexhaustedlab:
+ yyerror (YY_("memory exhausted"));
+ yyresult = 2;
+ goto yyreturnlab;
+
+
+/*----------------------------------------------------------.
+| yyreturnlab -- parsing is finished, clean up and return. |
+`----------------------------------------------------------*/
+yyreturnlab:
+ if (yychar != YYEMPTY)
+ {
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = YYTRANSLATE (yychar);
+ yydestruct ("Cleanup: discarding lookahead",
+ yytoken, &yylval);
+ }
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYABORT or YYACCEPT. */
+ YYPOPSTACK (yylen);
+ YY_STACK_PRINT (yyss, yyssp);
+ while (yyssp != yyss)
+ {
+ yydestruct ("Cleanup: popping",
+ YY_ACCESSING_SYMBOL (+*yyssp), yyvsp);
+ YYPOPSTACK (1);
+ }
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+
+ return yyresult;
+}
+
+#line 393 "../src/preproc/refer/label.ypp"
+
+
+/* bison defines const to be empty unless __STDC__ is defined, which it
+isn't under cfront */
+
+#ifdef const
+#undef const
+#endif
+
+const char *spec_ptr;
+const char *spec_end;
+const char *spec_cur;
+
+static char uppercase_array[] = {
+ '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',
+};
+
+static char lowercase_array[] = {
+ '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',
+};
+
+int yylex()
+{
+ while (spec_ptr < spec_end && csspace(*spec_ptr))
+ spec_ptr++;
+ spec_cur = spec_ptr;
+ if (spec_ptr >= spec_end)
+ return 0;
+ unsigned char c = *spec_ptr++;
+ if (csalpha(c)) {
+ yylval.num = c;
+ return TOKEN_LETTER;
+ }
+ if (csdigit(c)) {
+ yylval.num = c - '0';
+ return TOKEN_DIGIT;
+ }
+ if (c == '\'') {
+ yylval.str.start = literals.length();
+ for (; spec_ptr < spec_end; spec_ptr++) {
+ if (*spec_ptr == '\'') {
+ if (++spec_ptr < spec_end && *spec_ptr == '\'')
+ literals += '\'';
+ else {
+ yylval.str.len = literals.length() - yylval.str.start;
+ return TOKEN_LITERAL;
+ }
+ }
+ else
+ literals += *spec_ptr;
+ }
+ yylval.str.len = literals.length() - yylval.str.start;
+ return TOKEN_LITERAL;
+ }
+ return c;
+}
+
+int set_label_spec(const char *label_spec)
+{
+ spec_cur = spec_ptr = label_spec;
+ spec_end = strchr(label_spec, '\0');
+ literals.clear();
+ if (yyparse())
+ return 0;
+ delete parsed_label;
+ parsed_label = parse_result;
+ return 1;
+}
+
+int set_date_label_spec(const char *label_spec)
+{
+ spec_cur = spec_ptr = label_spec;
+ spec_end = strchr(label_spec, '\0');
+ literals.clear();
+ if (yyparse())
+ return 0;
+ delete parsed_date_label;
+ parsed_date_label = parse_result;
+ return 1;
+}
+
+int set_short_label_spec(const char *label_spec)
+{
+ spec_cur = spec_ptr = label_spec;
+ spec_end = strchr(label_spec, '\0');
+ literals.clear();
+ if (yyparse())
+ return 0;
+ delete parsed_short_label;
+ parsed_short_label = parse_result;
+ return 1;
+}
+
+void yyerror(const char *message)
+{
+ if (spec_cur < spec_end)
+ command_error("label specification %1 before '%2'", message, spec_cur);
+ else
+ command_error("label specification %1 at end of string",
+ message, spec_cur);
+}
+
+void at_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &)
+{
+ if (tentative)
+ ref.canonicalize_authors(result);
+ else {
+ const char *end, *start = ref.get_authors(&end);
+ if (start)
+ result.append(start, end - start);
+ }
+}
+
+void format_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &)
+{
+ if (tentative)
+ return;
+ const label_info *lp = ref.get_label_ptr();
+ int num = lp == 0 ? ref.get_number() : lp->count;
+ if (type != '0')
+ result += format_serial(type, num + 1);
+ else {
+ const char *ptr = i_to_a(num + first_number);
+ int pad = width - strlen(ptr);
+ while (--pad >= 0)
+ result += '0';
+ result += ptr;
+ }
+}
+
+static const char *format_serial(char c, int n)
+{
+ assert(n > 0);
+ static char buf[128]; // more than enough.
+ switch (c) {
+ case 'i':
+ case 'I':
+ {
+ char *p = buf;
+ // troff uses z and w to represent 10000 and 5000 in Roman
+ // numerals; I can find no historical basis for this usage
+ const char *s = c == 'i' ? "zwmdclxvi" : "ZWMDCLXVI";
+ if (n >= 40000)
+ return i_to_a(n);
+ while (n >= 10000) {
+ *p++ = s[0];
+ n -= 10000;
+ }
+ for (int i = 1000; i > 0; i /= 10, s += 2) {
+ int m = n/i;
+ n -= m*i;
+ switch (m) {
+ case 3:
+ *p++ = s[2];
+ /* falls through */
+ case 2:
+ *p++ = s[2];
+ /* falls through */
+ case 1:
+ *p++ = s[2];
+ break;
+ case 4:
+ *p++ = s[2];
+ *p++ = s[1];
+ break;
+ case 8:
+ *p++ = s[1];
+ *p++ = s[2];
+ *p++ = s[2];
+ *p++ = s[2];
+ break;
+ case 7:
+ *p++ = s[1];
+ *p++ = s[2];
+ *p++ = s[2];
+ break;
+ case 6:
+ *p++ = s[1];
+ *p++ = s[2];
+ break;
+ case 5:
+ *p++ = s[1];
+ break;
+ case 9:
+ *p++ = s[2];
+ *p++ = s[0];
+ }
+ }
+ *p = 0;
+ break;
+ }
+ case 'a':
+ case 'A':
+ {
+ char *p = buf;
+ // this is derived from troff/reg.c
+ while (n > 0) {
+ int d = n % 26;
+ if (d == 0)
+ d = 26;
+ n -= d;
+ n /= 26;
+ *p++ = c == 'a' ? lowercase_array[d - 1] :
+ uppercase_array[d - 1];
+ }
+ *p-- = 0;
+ // Reverse it.
+ char *q = buf;
+ while (q < p) {
+ char temp = *q;
+ *q = *p;
+ *p = temp;
+ --p;
+ ++q;
+ }
+ break;
+ }
+ default:
+ assert(0);
+ }
+ return buf;
+}
+
+void field_expr::evaluate(int, const reference &ref,
+ string &result, substring_position &)
+{
+ const char *end;
+ const char *start = ref.get_field(name, &end);
+ if (start) {
+ start = nth_field(number, start, &end);
+ if (start)
+ result.append(start, end - start);
+ }
+}
+
+void literal_expr::evaluate(int, const reference &,
+ string &result, substring_position &)
+{
+ result += s;
+}
+
+analyzed_expr::analyzed_expr(expression *e)
+: unary_expr(e), flags(e ? e->analyze() : 0)
+{
+}
+
+void analyzed_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &pos)
+{
+ if (expr)
+ expr->evaluate(tentative, ref, result, pos);
+}
+
+void star_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &pos)
+{
+ const label_info *lp = ref.get_label_ptr();
+ if (!tentative
+ && (lp == 0 || lp->total > 1)
+ && expr)
+ expr->evaluate(tentative, ref, result, pos);
+}
+
+void separator_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &pos)
+{
+ int start_length = result.length();
+ int is_first = pos.start < 0;
+ if (expr)
+ expr->evaluate(tentative, ref, result, pos);
+ if (is_first) {
+ pos.start = start_length;
+ pos.length = result.length() - start_length;
+ }
+}
+
+void map_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &)
+{
+ if (expr) {
+ string temp;
+ substring_position temp_pos;
+ expr->evaluate(tentative, ref, temp, temp_pos);
+ (*func)(temp.contents(), temp.contents() + temp.length(), result);
+ }
+}
+
+void extractor_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &)
+{
+ if (expr) {
+ string temp;
+ substring_position temp_pos;
+ expr->evaluate(tentative, ref, temp, temp_pos);
+ const char *end, *start = (*func)(temp.contents(),
+ temp.contents() + temp.length(),
+ &end);
+ switch (part) {
+ case BEFORE:
+ if (start)
+ result.append(temp.contents(), start - temp.contents());
+ else
+ result += temp;
+ break;
+ case MATCH:
+ if (start)
+ result.append(start, end - start);
+ break;
+ case AFTER:
+ if (start)
+ result.append(end, temp.contents() + temp.length() - end);
+ break;
+ default:
+ assert(0);
+ }
+ }
+}
+
+static void first_part(int len, const char *ptr, const char *end,
+ string &result)
+{
+ for (;;) {
+ const char *token_start = ptr;
+ if (!get_token(&ptr, end))
+ break;
+ const token_info *ti = lookup_token(token_start, ptr);
+ int counts = ti->sortify_non_empty(token_start, ptr);
+ if (counts && --len < 0)
+ break;
+ if (counts || ti->is_accent())
+ result.append(token_start, ptr - token_start);
+ }
+}
+
+static void last_part(int len, const char *ptr, const char *end,
+ string &result)
+{
+ const char *start = ptr;
+ int count = 0;
+ for (;;) {
+ const char *token_start = ptr;
+ if (!get_token(&ptr, end))
+ break;
+ const token_info *ti = lookup_token(token_start, ptr);
+ if (ti->sortify_non_empty(token_start, ptr))
+ count++;
+ }
+ ptr = start;
+ int skip = count - len;
+ if (skip > 0) {
+ for (;;) {
+ const char *token_start = ptr;
+ if (!get_token(&ptr, end))
+ assert(0);
+ const token_info *ti = lookup_token(token_start, ptr);
+ if (ti->sortify_non_empty(token_start, ptr) && --skip < 0) {
+ ptr = token_start;
+ break;
+ }
+ }
+ }
+ first_part(len, ptr, end, result);
+}
+
+void truncate_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &)
+{
+ if (expr) {
+ string temp;
+ substring_position temp_pos;
+ expr->evaluate(tentative, ref, temp, temp_pos);
+ const char *start = temp.contents();
+ const char *end = start + temp.length();
+ if (n > 0)
+ first_part(n, start, end, result);
+ else if (n < 0)
+ last_part(-n, start, end, result);
+ }
+}
+
+void alternative_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &pos)
+{
+ int start_length = result.length();
+ if (expr1)
+ expr1->evaluate(tentative, ref, result, pos);
+ if (result.length() == start_length && expr2)
+ expr2->evaluate(tentative, ref, result, pos);
+}
+
+void list_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &pos)
+{
+ if (expr1)
+ expr1->evaluate(tentative, ref, result, pos);
+ if (expr2)
+ expr2->evaluate(tentative, ref, result, pos);
+}
+
+void substitute_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &pos)
+{
+ int start_length = result.length();
+ if (expr1)
+ expr1->evaluate(tentative, ref, result, pos);
+ if (result.length() > start_length && result[result.length() - 1] == '-') {
+ // ought to see if pos covers the -
+ result.set_length(result.length() - 1);
+ if (expr2)
+ expr2->evaluate(tentative, ref, result, pos);
+ }
+}
+
+void conditional_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &pos)
+{
+ string temp;
+ substring_position temp_pos;
+ if (expr1)
+ expr1->evaluate(tentative, ref, temp, temp_pos);
+ if (temp.length() > 0) {
+ if (expr2)
+ expr2->evaluate(tentative, ref, result, pos);
+ }
+ else {
+ if (expr3)
+ expr3->evaluate(tentative, ref, result, pos);
+ }
+}
+
+void reference::pre_compute_label()
+{
+ if (parsed_label != 0
+ && (parsed_label->analyze() & expression::CONTAINS_VARIABLE)) {
+ label.clear();
+ substring_position temp_pos;
+ parsed_label->evaluate(1, *this, label, temp_pos);
+ label_ptr = lookup_label(label);
+ }
+}
+
+void reference::compute_label()
+{
+ label.clear();
+ if (parsed_label)
+ parsed_label->evaluate(0, *this, label, separator_pos);
+ if (short_label_flag && parsed_short_label)
+ parsed_short_label->evaluate(0, *this, short_label, short_separator_pos);
+ if (date_as_label) {
+ string new_date;
+ if (parsed_date_label) {
+ substring_position temp_pos;
+ parsed_date_label->evaluate(0, *this, new_date, temp_pos);
+ }
+ set_date(new_date);
+ }
+ if (label_ptr)
+ label_ptr->count += 1;
+}
+
+void reference::immediate_compute_label()
+{
+ if (label_ptr)
+ label_ptr->total = 2; // force use of disambiguator
+ compute_label();
+}
+
+int reference::merge_labels(reference **v, int n, label_type type,
+ string &result)
+{
+ if (abbreviate_label_ranges)
+ return merge_labels_by_number(v, n, type, result);
+ else
+ return merge_labels_by_parts(v, n, type, result);
+}
+
+int reference::merge_labels_by_number(reference **v, int n, label_type type,
+ string &result)
+{
+ if (n <= 1)
+ return 0;
+ int num = get_number();
+ // Only merge three or more labels.
+ if (v[0]->get_number() != num + 1
+ || v[1]->get_number() != num + 2)
+ return 0;
+ int i;
+ for (i = 2; i < n; i++)
+ if (v[i]->get_number() != num + i + 1)
+ break;
+ result = get_label(type);
+ result += label_range_indicator;
+ result += v[i - 1]->get_label(type);
+ return i;
+}
+
+const substring_position &reference::get_separator_pos(label_type type) const
+{
+ if (type == SHORT_LABEL && short_label_flag)
+ return short_separator_pos;
+ else
+ return separator_pos;
+}
+
+const string &reference::get_label(label_type type) const
+{
+ if (type == SHORT_LABEL && short_label_flag)
+ return short_label;
+ else
+ return label;
+}
+
+int reference::merge_labels_by_parts(reference **v, int n, label_type type,
+ string &result)
+{
+ if (n <= 0)
+ return 0;
+ const string &lb = get_label(type);
+ const substring_position &sp = get_separator_pos(type);
+ if (sp.start < 0
+ || sp.start != v[0]->get_separator_pos(type).start
+ || memcmp(lb.contents(), v[0]->get_label(type).contents(),
+ sp.start) != 0)
+ return 0;
+ result = lb;
+ int i = 0;
+ do {
+ result += separate_label_second_parts;
+ const substring_position &s = v[i]->get_separator_pos(type);
+ int sep_end_pos = s.start + s.length;
+ result.append(v[i]->get_label(type).contents() + sep_end_pos,
+ v[i]->get_label(type).length() - sep_end_pos);
+ } while (++i < n
+ && sp.start == v[i]->get_separator_pos(type).start
+ && memcmp(lb.contents(), v[i]->get_label(type).contents(),
+ sp.start) == 0);
+ return i;
+}
+
+string label_pool;
+
+label_info::label_info(const string &s)
+: start(label_pool.length()), length(s.length()), count(0), total(1)
+{
+ label_pool += s;
+}
+
+static label_info **label_table = 0;
+static int label_table_size = 0;
+static int label_table_used = 0;
+
+label_info *lookup_label(const string &label)
+{
+ if (label_table == 0) {
+ label_table = new label_info *[17];
+ label_table_size = 17;
+ for (int i = 0; i < 17; i++)
+ label_table[i] = 0;
+ }
+ unsigned h = hash_string(label.contents(), label.length()) % label_table_size;
+ label_info **ptr;
+ for (ptr = label_table + h;
+ *ptr != 0;
+ (ptr == label_table)
+ ? (ptr = label_table + label_table_size - 1)
+ : ptr--)
+ if ((*ptr)->length == label.length()
+ && memcmp(label_pool.contents() + (*ptr)->start, label.contents(),
+ label.length()) == 0) {
+ (*ptr)->total += 1;
+ return *ptr;
+ }
+ label_info *result = *ptr = new label_info(label);
+ if (++label_table_used * 2 > label_table_size) {
+ // Rehash the table.
+ label_info **old_table = label_table;
+ int old_size = label_table_size;
+ label_table_size = next_size(label_table_size);
+ label_table = new label_info *[label_table_size];
+ int i;
+ for (i = 0; i < label_table_size; i++)
+ label_table[i] = 0;
+ for (i = 0; i < old_size; i++)
+ if (old_table[i]) {
+ h = hash_string(label_pool.contents() + old_table[i]->start,
+ old_table[i]->length);
+ label_info **p;
+ for (p = label_table + (h % label_table_size);
+ *p != 0;
+ (p == label_table)
+ ? (p = label_table + label_table_size - 1)
+ : --p)
+ ;
+ *p = old_table[i];
+ }
+ delete[] old_table;
+ }
+ return result;
+}
+
+void clear_labels()
+{
+ for (int i = 0; i < label_table_size; i++) {
+ delete label_table[i];
+ label_table[i] = 0;
+ }
+ label_table_used = 0;
+ label_pool.clear();
+}
+
+static void consider_authors(reference **start, reference **end, int i);
+
+void compute_labels(reference **v, int n)
+{
+ if (parsed_label
+ && (parsed_label->analyze() & expression::CONTAINS_AT)
+ && sort_fields.length() >= 2
+ && sort_fields[0] == 'A'
+ && sort_fields[1] == '+')
+ consider_authors(v, v + n, 0);
+ for (int i = 0; i < n; i++)
+ v[i]->compute_label();
+}
+
+
+/* A reference with a list of authors <A0,A1,...,AN> _needs_ author i
+where 0 <= i <= N if there exists a reference with a list of authors
+<B0,B1,...,BM> such that <A0,A1,...,AN> != <B0,B1,...,BM> and M >= i
+and Aj = Bj for 0 <= j < i. In this case if we can't say "A0,
+A1,...,A(i-1) et al" because this would match both <A0,A1,...,AN> and
+<B0,B1,...,BM>. If a reference needs author i we only have to call
+need_author(j) for some j >= i such that the reference also needs
+author j. */
+
+/* This function handles 2 tasks:
+determine which authors are needed (cannot be elided with et al.);
+determine which authors can have only last names in the labels.
+
+References >= start and < end have the same first i author names.
+Also they're sorted by A+. */
+
+static void consider_authors(reference **start, reference **end, int i)
+{
+ if (start >= end)
+ return;
+ reference **p = start;
+ if (i >= (*p)->get_nauthors()) {
+ for (++p; p < end && i >= (*p)->get_nauthors(); p++)
+ ;
+ if (p < end && i > 0) {
+ // If we have an author list <A B C> and an author list <A B C D>,
+ // then both lists need C.
+ for (reference **q = start; q < end; q++)
+ (*q)->need_author(i - 1);
+ }
+ start = p;
+ }
+ while (p < end) {
+ reference **last_name_start = p;
+ reference **name_start = p;
+ for (++p;
+ p < end && i < (*p)->get_nauthors()
+ && same_author_last_name(**last_name_start, **p, i);
+ p++) {
+ if (!same_author_name(**name_start, **p, i)) {
+ consider_authors(name_start, p, i + 1);
+ name_start = p;
+ }
+ }
+ consider_authors(name_start, p, i + 1);
+ if (last_name_start == name_start) {
+ for (reference **q = last_name_start; q < p; q++)
+ (*q)->set_last_name_unambiguous(i);
+ }
+ // If we have an author list <A B C D> and <A B C E>, then the lists
+ // need author D and E respectively.
+ if (name_start > start || p < end) {
+ for (reference **q = last_name_start; q < p; q++)
+ (*q)->need_author(i);
+ }
+ }
+}
+
+int same_author_last_name(const reference &r1, const reference &r2, int n)
+{
+ const char *ae1;
+ const char *as1 = r1.get_sort_field(0, n, 0, &ae1);
+ const char *ae2;
+ const char *as2 = r2.get_sort_field(0, n, 0, &ae2);
+ if (!as1 && !as2) return 1; // they are the same
+ if (!as1 || !as2) return 0;
+ return ae1 - as1 == ae2 - as2 && memcmp(as1, as2, ae1 - as1) == 0;
+}
+
+int same_author_name(const reference &r1, const reference &r2, int n)
+{
+ const char *ae1;
+ const char *as1 = r1.get_sort_field(0, n, -1, &ae1);
+ const char *ae2;
+ const char *as2 = r2.get_sort_field(0, n, -1, &ae2);
+ if (!as1 && !as2) return 1; // they are the same
+ if (!as1 || !as2) return 0;
+ return ae1 - as1 == ae2 - as2 && memcmp(as1, as2, ae1 - as1) == 0;
+}
+
+
+void int_set::set(int i)
+{
+ assert(i >= 0);
+ int bytei = i >> 3;
+ if (bytei >= v.length()) {
+ int old_length = v.length();
+ v.set_length(bytei + 1);
+ for (int j = old_length; j <= bytei; j++)
+ v[j] = 0;
+ }
+ v[bytei] |= 1 << (i & 7);
+}
+
+int int_set::get(int i) const
+{
+ assert(i >= 0);
+ int bytei = i >> 3;
+ return bytei >= v.length() ? 0 : (v[bytei] & (1 << (i & 7))) != 0;
+}
+
+void reference::set_last_name_unambiguous(int i)
+{
+ last_name_unambiguous.set(i);
+}
+
+void reference::need_author(int n)
+{
+ if (n > last_needed_author)
+ last_needed_author = n;
+}
+
+const char *reference::get_authors(const char **end) const
+{
+ if (!computed_authors) {
+ ((reference *)this)->computed_authors = 1;
+ string &result = ((reference *)this)->authors;
+ int na = get_nauthors();
+ result.clear();
+ for (int i = 0; i < na; i++) {
+ if (last_name_unambiguous.get(i)) {
+ const char *e, *start = get_author_last_name(i, &e);
+ assert(start != 0);
+ result.append(start, e - start);
+ }
+ else {
+ const char *e, *start = get_author(i, &e);
+ assert(start != 0);
+ result.append(start, e - start);
+ }
+ if (i == last_needed_author
+ && et_al.length() > 0
+ && et_al_min_elide > 0
+ && last_needed_author + et_al_min_elide < na
+ && na >= et_al_min_total) {
+ result += et_al;
+ break;
+ }
+ if (i < na - 1) {
+ if (na == 2)
+ result += join_authors_exactly_two;
+ else if (i < na - 2)
+ result += join_authors_default;
+ else
+ result += join_authors_last_two;
+ }
+ }
+ }
+ const char *start = authors.contents();
+ *end = start + authors.length();
+ return start;
+}
+
+int reference::get_nauthors() const
+{
+ if (nauthors < 0) {
+ const char *dummy;
+ int na;
+ for (na = 0; get_author(na, &dummy) != 0; na++)
+ ;
+ ((reference *)this)->nauthors = na;
+ }
+ return nauthors;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/refer/label.hpp b/src/preproc/refer/label.hpp
new file mode 100644
index 0000000..9f79fd2
--- /dev/null
+++ b/src/preproc/refer/label.hpp
@@ -0,0 +1,98 @@
+/* A Bison parser, made by GNU Bison 3.8.2. */
+
+/* Bison interface for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 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, see <https://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+ especially those whose name start with YY_ or yy_. They are
+ private implementation details that can be changed or removed. */
+
+#ifndef YY_YY_SRC_PREPROC_REFER_LABEL_HPP_INCLUDED
+# define YY_YY_SRC_PREPROC_REFER_LABEL_HPP_INCLUDED
+/* Debug traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int yydebug;
+#endif
+
+/* Token kinds. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ enum yytokentype
+ {
+ YYEMPTY = -2,
+ YYEOF = 0, /* "end of file" */
+ YYerror = 256, /* error */
+ YYUNDEF = 257, /* "invalid token" */
+ TOKEN_LETTER = 258, /* TOKEN_LETTER */
+ TOKEN_LITERAL = 259, /* TOKEN_LITERAL */
+ TOKEN_DIGIT = 260 /* TOKEN_DIGIT */
+ };
+ typedef enum yytokentype yytoken_kind_t;
+#endif
+/* Token kinds. */
+#define YYEMPTY -2
+#define YYEOF 0
+#define YYerror 256
+#define YYUNDEF 257
+#define TOKEN_LETTER 258
+#define TOKEN_LITERAL 259
+#define TOKEN_DIGIT 260
+
+/* Value type. */
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+union YYSTYPE
+{
+#line 218 "../src/preproc/refer/label.ypp"
+
+ int num;
+ expression *expr;
+ struct { int ndigits; int val; } dig;
+ struct { int start; int len; } str;
+
+#line 84 "src/preproc/refer/label.hpp"
+
+};
+typedef union YYSTYPE YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+extern YYSTYPE yylval;
+
+
+int yyparse (void);
+
+
+#endif /* !YY_YY_SRC_PREPROC_REFER_LABEL_HPP_INCLUDED */
diff --git a/src/preproc/refer/label.ypp b/src/preproc/refer/label.ypp
new file mode 100644
index 0000000..f5210d5
--- /dev/null
+++ b/src/preproc/refer/label.ypp
@@ -0,0 +1,1195 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+%{
+
+#include "refer.h"
+#include "refid.h"
+#include "ref.h"
+#include "token.h"
+
+int yylex();
+void yyerror(const char *);
+
+static const char *format_serial(char c, int n);
+
+struct label_info {
+ int start;
+ int length;
+ int count;
+ int total;
+ label_info(const string &);
+};
+
+label_info *lookup_label(const string &label);
+
+struct expression {
+ enum {
+ // Does the tentative label depend on the reference?
+ CONTAINS_VARIABLE = 01,
+ CONTAINS_STAR = 02,
+ CONTAINS_FORMAT = 04,
+ CONTAINS_AT = 010
+ };
+ virtual ~expression() { }
+ virtual void evaluate(int, const reference &, string &,
+ substring_position &) = 0;
+ virtual unsigned analyze() { return 0; }
+};
+
+class at_expr : public expression {
+public:
+ at_expr() { }
+ void evaluate(int, const reference &, string &, substring_position &);
+ unsigned analyze() { return CONTAINS_VARIABLE|CONTAINS_AT; }
+};
+
+class format_expr : public expression {
+ char type;
+ int width;
+ int first_number;
+public:
+ format_expr(char c, int w = 0, int f = 1)
+ : type(c), width(w), first_number(f) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+ unsigned analyze() { return CONTAINS_FORMAT; }
+};
+
+class field_expr : public expression {
+ int number;
+ char name;
+public:
+ field_expr(char nm, int num) : number(num), name(nm) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+ unsigned analyze() { return CONTAINS_VARIABLE; }
+};
+
+class literal_expr : public expression {
+ string s;
+public:
+ literal_expr(const char *ptr, int len) : s(ptr, len) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+};
+
+class unary_expr : public expression {
+protected:
+ expression *expr;
+public:
+ unary_expr(expression *e) : expr(e) { }
+ ~unary_expr() { delete expr; }
+ void evaluate(int, const reference &, string &, substring_position &) = 0;
+ unsigned analyze() { return expr ? expr->analyze() : 0; }
+};
+
+// This caches the analysis of an expression.
+
+class analyzed_expr : public unary_expr {
+ unsigned flags;
+public:
+ analyzed_expr(expression *);
+ void evaluate(int, const reference &, string &, substring_position &);
+ unsigned analyze() { return flags; }
+};
+
+class star_expr : public unary_expr {
+public:
+ star_expr(expression *e) : unary_expr(e) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+ unsigned analyze() {
+ return ((expr ? (expr->analyze() & ~CONTAINS_VARIABLE) : 0)
+ | CONTAINS_STAR);
+ }
+};
+
+typedef void map_func(const char *, const char *, string &);
+
+class map_expr : public unary_expr {
+ map_func *func;
+public:
+ map_expr(expression *e, map_func *f) : unary_expr(e), func(f) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+};
+
+typedef const char *extractor_func(const char *, const char *, const char **);
+
+class extractor_expr : public unary_expr {
+ int part;
+ extractor_func *func;
+public:
+ enum { BEFORE = +1, MATCH = 0, AFTER = -1 };
+ extractor_expr(expression *e, extractor_func *f, int pt)
+ : unary_expr(e), part(pt), func(f) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+};
+
+class truncate_expr : public unary_expr {
+ int n;
+public:
+ truncate_expr(expression *e, int i) : unary_expr(e), n(i) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+};
+
+class separator_expr : public unary_expr {
+public:
+ separator_expr(expression *e) : unary_expr(e) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+};
+
+class binary_expr : public expression {
+protected:
+ expression *expr1;
+ expression *expr2;
+public:
+ binary_expr(expression *e1, expression *e2) : expr1(e1), expr2(e2) { }
+ ~binary_expr() { delete expr1; delete expr2; }
+ void evaluate(int, const reference &, string &, substring_position &) = 0;
+ unsigned analyze() {
+ return (expr1 ? expr1->analyze() : 0) | (expr2 ? expr2->analyze() : 0);
+ }
+};
+
+class alternative_expr : public binary_expr {
+public:
+ alternative_expr(expression *e1, expression *e2) : binary_expr(e1, e2) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+};
+
+class list_expr : public binary_expr {
+public:
+ list_expr(expression *e1, expression *e2) : binary_expr(e1, e2) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+};
+
+class substitute_expr : public binary_expr {
+public:
+ substitute_expr(expression *e1, expression *e2) : binary_expr(e1, e2) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+};
+
+class ternary_expr : public expression {
+protected:
+ expression *expr1;
+ expression *expr2;
+ expression *expr3;
+public:
+ ternary_expr(expression *e1, expression *e2, expression *e3)
+ : expr1(e1), expr2(e2), expr3(e3) { }
+ ~ternary_expr() { delete expr1; delete expr2; delete expr3; }
+ void evaluate(int, const reference &, string &, substring_position &) = 0;
+ unsigned analyze() {
+ return ((expr1 ? expr1->analyze() : 0)
+ | (expr2 ? expr2->analyze() : 0)
+ | (expr3 ? expr3->analyze() : 0));
+ }
+};
+
+class conditional_expr : public ternary_expr {
+public:
+ conditional_expr(expression *e1, expression *e2, expression *e3)
+ : ternary_expr(e1, e2, e3) { }
+ void evaluate(int, const reference &, string &, substring_position &);
+};
+
+static expression *parsed_label = 0;
+static expression *parsed_date_label = 0;
+static expression *parsed_short_label = 0;
+
+static expression *parse_result;
+
+string literals;
+
+%}
+
+%union {
+ int num;
+ expression *expr;
+ struct { int ndigits; int val; } dig;
+ struct { int start; int len; } str;
+}
+
+/* uppercase or lowercase letter */
+%token <num> TOKEN_LETTER
+/* literal characters */
+%token <str> TOKEN_LITERAL
+/* digit */
+%token <num> TOKEN_DIGIT
+
+%type <expr> conditional
+%type <expr> alternative
+%type <expr> list
+%type <expr> string
+%type <expr> substitute
+%type <expr> optional_conditional
+%type <num> number
+%type <dig> digits
+%type <num> optional_number
+%type <num> flag
+
+%%
+
+expr:
+ optional_conditional
+ { parse_result = ($1 ? new analyzed_expr($1) : 0); }
+ ;
+
+conditional:
+ alternative
+ { $$ = $1; }
+ | alternative '?' optional_conditional ':' conditional
+ { $$ = new conditional_expr($1, $3, $5); }
+ ;
+
+optional_conditional:
+ /* empty */
+ { $$ = 0; }
+ | conditional
+ { $$ = $1; }
+ ;
+
+alternative:
+ list
+ { $$ = $1; }
+ | alternative '|' list
+ { $$ = new alternative_expr($1, $3); }
+ | alternative '&' list
+ { $$ = new conditional_expr($1, $3, 0); }
+ ;
+
+list:
+ substitute
+ { $$ = $1; }
+ | list substitute
+ { $$ = new list_expr($1, $2); }
+ ;
+
+substitute:
+ string
+ { $$ = $1; }
+ | substitute '~' string
+ { $$ = new substitute_expr($1, $3); }
+ ;
+
+string:
+ '@'
+ { $$ = new at_expr; }
+ | TOKEN_LITERAL
+ {
+ $$ = new literal_expr(literals.contents() + $1.start,
+ $1.len);
+ }
+ | TOKEN_LETTER
+ { $$ = new field_expr($1, 0); }
+ | TOKEN_LETTER number
+ { $$ = new field_expr($1, $2 - 1); }
+ | '%' TOKEN_LETTER
+ {
+ switch ($2) {
+ case 'I':
+ case 'i':
+ case 'A':
+ case 'a':
+ $$ = new format_expr($2);
+ break;
+ default:
+ command_error("unrecognized format '%1'", char($2));
+ $$ = new format_expr('a');
+ break;
+ }
+ }
+
+ | '%' digits
+ {
+ $$ = new format_expr('0', $2.ndigits, $2.val);
+ }
+ | string '.' flag TOKEN_LETTER optional_number
+ {
+ switch ($4) {
+ case 'l':
+ $$ = new map_expr($1, lowercase);
+ break;
+ case 'u':
+ $$ = new map_expr($1, uppercase);
+ break;
+ case 'c':
+ $$ = new map_expr($1, capitalize);
+ break;
+ case 'r':
+ $$ = new map_expr($1, reverse_name);
+ break;
+ case 'a':
+ $$ = new map_expr($1, abbreviate_name);
+ break;
+ case 'y':
+ $$ = new extractor_expr($1, find_year, $3);
+ break;
+ case 'n':
+ $$ = new extractor_expr($1, find_last_name, $3);
+ break;
+ default:
+ $$ = $1;
+ command_error("unknown function '%1'", char($4));
+ break;
+ }
+ }
+
+ | string '+' number
+ { $$ = new truncate_expr($1, $3); }
+ | string '-' number
+ { $$ = new truncate_expr($1, -$3); }
+ | string '*'
+ { $$ = new star_expr($1); }
+ | '(' optional_conditional ')'
+ { $$ = $2; }
+ | '<' optional_conditional '>'
+ { $$ = new separator_expr($2); }
+ ;
+
+optional_number:
+ /* empty */
+ { $$ = -1; }
+ | number
+ { $$ = $1; }
+ ;
+
+number:
+ TOKEN_DIGIT
+ { $$ = $1; }
+ | number TOKEN_DIGIT
+ { $$ = $1*10 + $2; }
+ ;
+
+digits:
+ TOKEN_DIGIT
+ { $$.ndigits = 1; $$.val = $1; }
+ | digits TOKEN_DIGIT
+ { $$.ndigits = $1.ndigits + 1; $$.val = $1.val*10 + $2; }
+ ;
+
+
+flag:
+ /* empty */
+ { $$ = 0; }
+ | '+'
+ { $$ = 1; }
+ | '-'
+ { $$ = -1; }
+ ;
+
+%%
+
+/* bison defines const to be empty unless __STDC__ is defined, which it
+isn't under cfront */
+
+#ifdef const
+#undef const
+#endif
+
+const char *spec_ptr;
+const char *spec_end;
+const char *spec_cur;
+
+static char uppercase_array[] = {
+ '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',
+};
+
+static char lowercase_array[] = {
+ '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',
+};
+
+int yylex()
+{
+ while (spec_ptr < spec_end && csspace(*spec_ptr))
+ spec_ptr++;
+ spec_cur = spec_ptr;
+ if (spec_ptr >= spec_end)
+ return 0;
+ unsigned char c = *spec_ptr++;
+ if (csalpha(c)) {
+ yylval.num = c;
+ return TOKEN_LETTER;
+ }
+ if (csdigit(c)) {
+ yylval.num = c - '0';
+ return TOKEN_DIGIT;
+ }
+ if (c == '\'') {
+ yylval.str.start = literals.length();
+ for (; spec_ptr < spec_end; spec_ptr++) {
+ if (*spec_ptr == '\'') {
+ if (++spec_ptr < spec_end && *spec_ptr == '\'')
+ literals += '\'';
+ else {
+ yylval.str.len = literals.length() - yylval.str.start;
+ return TOKEN_LITERAL;
+ }
+ }
+ else
+ literals += *spec_ptr;
+ }
+ yylval.str.len = literals.length() - yylval.str.start;
+ return TOKEN_LITERAL;
+ }
+ return c;
+}
+
+int set_label_spec(const char *label_spec)
+{
+ spec_cur = spec_ptr = label_spec;
+ spec_end = strchr(label_spec, '\0');
+ literals.clear();
+ if (yyparse())
+ return 0;
+ delete parsed_label;
+ parsed_label = parse_result;
+ return 1;
+}
+
+int set_date_label_spec(const char *label_spec)
+{
+ spec_cur = spec_ptr = label_spec;
+ spec_end = strchr(label_spec, '\0');
+ literals.clear();
+ if (yyparse())
+ return 0;
+ delete parsed_date_label;
+ parsed_date_label = parse_result;
+ return 1;
+}
+
+int set_short_label_spec(const char *label_spec)
+{
+ spec_cur = spec_ptr = label_spec;
+ spec_end = strchr(label_spec, '\0');
+ literals.clear();
+ if (yyparse())
+ return 0;
+ delete parsed_short_label;
+ parsed_short_label = parse_result;
+ return 1;
+}
+
+void yyerror(const char *message)
+{
+ if (spec_cur < spec_end)
+ command_error("label specification %1 before '%2'", message, spec_cur);
+ else
+ command_error("label specification %1 at end of string",
+ message, spec_cur);
+}
+
+void at_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &)
+{
+ if (tentative)
+ ref.canonicalize_authors(result);
+ else {
+ const char *end, *start = ref.get_authors(&end);
+ if (start)
+ result.append(start, end - start);
+ }
+}
+
+void format_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &)
+{
+ if (tentative)
+ return;
+ const label_info *lp = ref.get_label_ptr();
+ int num = lp == 0 ? ref.get_number() : lp->count;
+ if (type != '0')
+ result += format_serial(type, num + 1);
+ else {
+ const char *ptr = i_to_a(num + first_number);
+ int pad = width - strlen(ptr);
+ while (--pad >= 0)
+ result += '0';
+ result += ptr;
+ }
+}
+
+static const char *format_serial(char c, int n)
+{
+ assert(n > 0);
+ static char buf[128]; // more than enough.
+ switch (c) {
+ case 'i':
+ case 'I':
+ {
+ char *p = buf;
+ // troff uses z and w to represent 10000 and 5000 in Roman
+ // numerals; I can find no historical basis for this usage
+ const char *s = c == 'i' ? "zwmdclxvi" : "ZWMDCLXVI";
+ if (n >= 40000)
+ return i_to_a(n);
+ while (n >= 10000) {
+ *p++ = s[0];
+ n -= 10000;
+ }
+ for (int i = 1000; i > 0; i /= 10, s += 2) {
+ int m = n/i;
+ n -= m*i;
+ switch (m) {
+ case 3:
+ *p++ = s[2];
+ /* falls through */
+ case 2:
+ *p++ = s[2];
+ /* falls through */
+ case 1:
+ *p++ = s[2];
+ break;
+ case 4:
+ *p++ = s[2];
+ *p++ = s[1];
+ break;
+ case 8:
+ *p++ = s[1];
+ *p++ = s[2];
+ *p++ = s[2];
+ *p++ = s[2];
+ break;
+ case 7:
+ *p++ = s[1];
+ *p++ = s[2];
+ *p++ = s[2];
+ break;
+ case 6:
+ *p++ = s[1];
+ *p++ = s[2];
+ break;
+ case 5:
+ *p++ = s[1];
+ break;
+ case 9:
+ *p++ = s[2];
+ *p++ = s[0];
+ }
+ }
+ *p = 0;
+ break;
+ }
+ case 'a':
+ case 'A':
+ {
+ char *p = buf;
+ // this is derived from troff/reg.c
+ while (n > 0) {
+ int d = n % 26;
+ if (d == 0)
+ d = 26;
+ n -= d;
+ n /= 26;
+ *p++ = c == 'a' ? lowercase_array[d - 1] :
+ uppercase_array[d - 1];
+ }
+ *p-- = 0;
+ // Reverse it.
+ char *q = buf;
+ while (q < p) {
+ char temp = *q;
+ *q = *p;
+ *p = temp;
+ --p;
+ ++q;
+ }
+ break;
+ }
+ default:
+ assert(0);
+ }
+ return buf;
+}
+
+void field_expr::evaluate(int, const reference &ref,
+ string &result, substring_position &)
+{
+ const char *end;
+ const char *start = ref.get_field(name, &end);
+ if (start) {
+ start = nth_field(number, start, &end);
+ if (start)
+ result.append(start, end - start);
+ }
+}
+
+void literal_expr::evaluate(int, const reference &,
+ string &result, substring_position &)
+{
+ result += s;
+}
+
+analyzed_expr::analyzed_expr(expression *e)
+: unary_expr(e), flags(e ? e->analyze() : 0)
+{
+}
+
+void analyzed_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &pos)
+{
+ if (expr)
+ expr->evaluate(tentative, ref, result, pos);
+}
+
+void star_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &pos)
+{
+ const label_info *lp = ref.get_label_ptr();
+ if (!tentative
+ && (lp == 0 || lp->total > 1)
+ && expr)
+ expr->evaluate(tentative, ref, result, pos);
+}
+
+void separator_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &pos)
+{
+ int start_length = result.length();
+ int is_first = pos.start < 0;
+ if (expr)
+ expr->evaluate(tentative, ref, result, pos);
+ if (is_first) {
+ pos.start = start_length;
+ pos.length = result.length() - start_length;
+ }
+}
+
+void map_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &)
+{
+ if (expr) {
+ string temp;
+ substring_position temp_pos;
+ expr->evaluate(tentative, ref, temp, temp_pos);
+ (*func)(temp.contents(), temp.contents() + temp.length(), result);
+ }
+}
+
+void extractor_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &)
+{
+ if (expr) {
+ string temp;
+ substring_position temp_pos;
+ expr->evaluate(tentative, ref, temp, temp_pos);
+ const char *end, *start = (*func)(temp.contents(),
+ temp.contents() + temp.length(),
+ &end);
+ switch (part) {
+ case BEFORE:
+ if (start)
+ result.append(temp.contents(), start - temp.contents());
+ else
+ result += temp;
+ break;
+ case MATCH:
+ if (start)
+ result.append(start, end - start);
+ break;
+ case AFTER:
+ if (start)
+ result.append(end, temp.contents() + temp.length() - end);
+ break;
+ default:
+ assert(0);
+ }
+ }
+}
+
+static void first_part(int len, const char *ptr, const char *end,
+ string &result)
+{
+ for (;;) {
+ const char *token_start = ptr;
+ if (!get_token(&ptr, end))
+ break;
+ const token_info *ti = lookup_token(token_start, ptr);
+ int counts = ti->sortify_non_empty(token_start, ptr);
+ if (counts && --len < 0)
+ break;
+ if (counts || ti->is_accent())
+ result.append(token_start, ptr - token_start);
+ }
+}
+
+static void last_part(int len, const char *ptr, const char *end,
+ string &result)
+{
+ const char *start = ptr;
+ int count = 0;
+ for (;;) {
+ const char *token_start = ptr;
+ if (!get_token(&ptr, end))
+ break;
+ const token_info *ti = lookup_token(token_start, ptr);
+ if (ti->sortify_non_empty(token_start, ptr))
+ count++;
+ }
+ ptr = start;
+ int skip = count - len;
+ if (skip > 0) {
+ for (;;) {
+ const char *token_start = ptr;
+ if (!get_token(&ptr, end))
+ assert(0);
+ const token_info *ti = lookup_token(token_start, ptr);
+ if (ti->sortify_non_empty(token_start, ptr) && --skip < 0) {
+ ptr = token_start;
+ break;
+ }
+ }
+ }
+ first_part(len, ptr, end, result);
+}
+
+void truncate_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &)
+{
+ if (expr) {
+ string temp;
+ substring_position temp_pos;
+ expr->evaluate(tentative, ref, temp, temp_pos);
+ const char *start = temp.contents();
+ const char *end = start + temp.length();
+ if (n > 0)
+ first_part(n, start, end, result);
+ else if (n < 0)
+ last_part(-n, start, end, result);
+ }
+}
+
+void alternative_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &pos)
+{
+ int start_length = result.length();
+ if (expr1)
+ expr1->evaluate(tentative, ref, result, pos);
+ if (result.length() == start_length && expr2)
+ expr2->evaluate(tentative, ref, result, pos);
+}
+
+void list_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &pos)
+{
+ if (expr1)
+ expr1->evaluate(tentative, ref, result, pos);
+ if (expr2)
+ expr2->evaluate(tentative, ref, result, pos);
+}
+
+void substitute_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &pos)
+{
+ int start_length = result.length();
+ if (expr1)
+ expr1->evaluate(tentative, ref, result, pos);
+ if (result.length() > start_length && result[result.length() - 1] == '-') {
+ // ought to see if pos covers the -
+ result.set_length(result.length() - 1);
+ if (expr2)
+ expr2->evaluate(tentative, ref, result, pos);
+ }
+}
+
+void conditional_expr::evaluate(int tentative, const reference &ref,
+ string &result, substring_position &pos)
+{
+ string temp;
+ substring_position temp_pos;
+ if (expr1)
+ expr1->evaluate(tentative, ref, temp, temp_pos);
+ if (temp.length() > 0) {
+ if (expr2)
+ expr2->evaluate(tentative, ref, result, pos);
+ }
+ else {
+ if (expr3)
+ expr3->evaluate(tentative, ref, result, pos);
+ }
+}
+
+void reference::pre_compute_label()
+{
+ if (parsed_label != 0
+ && (parsed_label->analyze() & expression::CONTAINS_VARIABLE)) {
+ label.clear();
+ substring_position temp_pos;
+ parsed_label->evaluate(1, *this, label, temp_pos);
+ label_ptr = lookup_label(label);
+ }
+}
+
+void reference::compute_label()
+{
+ label.clear();
+ if (parsed_label)
+ parsed_label->evaluate(0, *this, label, separator_pos);
+ if (short_label_flag && parsed_short_label)
+ parsed_short_label->evaluate(0, *this, short_label, short_separator_pos);
+ if (date_as_label) {
+ string new_date;
+ if (parsed_date_label) {
+ substring_position temp_pos;
+ parsed_date_label->evaluate(0, *this, new_date, temp_pos);
+ }
+ set_date(new_date);
+ }
+ if (label_ptr)
+ label_ptr->count += 1;
+}
+
+void reference::immediate_compute_label()
+{
+ if (label_ptr)
+ label_ptr->total = 2; // force use of disambiguator
+ compute_label();
+}
+
+int reference::merge_labels(reference **v, int n, label_type type,
+ string &result)
+{
+ if (abbreviate_label_ranges)
+ return merge_labels_by_number(v, n, type, result);
+ else
+ return merge_labels_by_parts(v, n, type, result);
+}
+
+int reference::merge_labels_by_number(reference **v, int n, label_type type,
+ string &result)
+{
+ if (n <= 1)
+ return 0;
+ int num = get_number();
+ // Only merge three or more labels.
+ if (v[0]->get_number() != num + 1
+ || v[1]->get_number() != num + 2)
+ return 0;
+ int i;
+ for (i = 2; i < n; i++)
+ if (v[i]->get_number() != num + i + 1)
+ break;
+ result = get_label(type);
+ result += label_range_indicator;
+ result += v[i - 1]->get_label(type);
+ return i;
+}
+
+const substring_position &reference::get_separator_pos(label_type type) const
+{
+ if (type == SHORT_LABEL && short_label_flag)
+ return short_separator_pos;
+ else
+ return separator_pos;
+}
+
+const string &reference::get_label(label_type type) const
+{
+ if (type == SHORT_LABEL && short_label_flag)
+ return short_label;
+ else
+ return label;
+}
+
+int reference::merge_labels_by_parts(reference **v, int n, label_type type,
+ string &result)
+{
+ if (n <= 0)
+ return 0;
+ const string &lb = get_label(type);
+ const substring_position &sp = get_separator_pos(type);
+ if (sp.start < 0
+ || sp.start != v[0]->get_separator_pos(type).start
+ || memcmp(lb.contents(), v[0]->get_label(type).contents(),
+ sp.start) != 0)
+ return 0;
+ result = lb;
+ int i = 0;
+ do {
+ result += separate_label_second_parts;
+ const substring_position &s = v[i]->get_separator_pos(type);
+ int sep_end_pos = s.start + s.length;
+ result.append(v[i]->get_label(type).contents() + sep_end_pos,
+ v[i]->get_label(type).length() - sep_end_pos);
+ } while (++i < n
+ && sp.start == v[i]->get_separator_pos(type).start
+ && memcmp(lb.contents(), v[i]->get_label(type).contents(),
+ sp.start) == 0);
+ return i;
+}
+
+string label_pool;
+
+label_info::label_info(const string &s)
+: start(label_pool.length()), length(s.length()), count(0), total(1)
+{
+ label_pool += s;
+}
+
+static label_info **label_table = 0;
+static int label_table_size = 0;
+static int label_table_used = 0;
+
+label_info *lookup_label(const string &label)
+{
+ if (label_table == 0) {
+ label_table = new label_info *[17];
+ label_table_size = 17;
+ for (int i = 0; i < 17; i++)
+ label_table[i] = 0;
+ }
+ unsigned h = hash_string(label.contents(), label.length()) % label_table_size;
+ label_info **ptr;
+ for (ptr = label_table + h;
+ *ptr != 0;
+ (ptr == label_table)
+ ? (ptr = label_table + label_table_size - 1)
+ : ptr--)
+ if ((*ptr)->length == label.length()
+ && memcmp(label_pool.contents() + (*ptr)->start, label.contents(),
+ label.length()) == 0) {
+ (*ptr)->total += 1;
+ return *ptr;
+ }
+ label_info *result = *ptr = new label_info(label);
+ if (++label_table_used * 2 > label_table_size) {
+ // Rehash the table.
+ label_info **old_table = label_table;
+ int old_size = label_table_size;
+ label_table_size = next_size(label_table_size);
+ label_table = new label_info *[label_table_size];
+ int i;
+ for (i = 0; i < label_table_size; i++)
+ label_table[i] = 0;
+ for (i = 0; i < old_size; i++)
+ if (old_table[i]) {
+ h = hash_string(label_pool.contents() + old_table[i]->start,
+ old_table[i]->length);
+ label_info **p;
+ for (p = label_table + (h % label_table_size);
+ *p != 0;
+ (p == label_table)
+ ? (p = label_table + label_table_size - 1)
+ : --p)
+ ;
+ *p = old_table[i];
+ }
+ delete[] old_table;
+ }
+ return result;
+}
+
+void clear_labels()
+{
+ for (int i = 0; i < label_table_size; i++) {
+ delete label_table[i];
+ label_table[i] = 0;
+ }
+ label_table_used = 0;
+ label_pool.clear();
+}
+
+static void consider_authors(reference **start, reference **end, int i);
+
+void compute_labels(reference **v, int n)
+{
+ if (parsed_label
+ && (parsed_label->analyze() & expression::CONTAINS_AT)
+ && sort_fields.length() >= 2
+ && sort_fields[0] == 'A'
+ && sort_fields[1] == '+')
+ consider_authors(v, v + n, 0);
+ for (int i = 0; i < n; i++)
+ v[i]->compute_label();
+}
+
+
+/* A reference with a list of authors <A0,A1,...,AN> _needs_ author i
+where 0 <= i <= N if there exists a reference with a list of authors
+<B0,B1,...,BM> such that <A0,A1,...,AN> != <B0,B1,...,BM> and M >= i
+and Aj = Bj for 0 <= j < i. In this case if we can't say "A0,
+A1,...,A(i-1) et al" because this would match both <A0,A1,...,AN> and
+<B0,B1,...,BM>. If a reference needs author i we only have to call
+need_author(j) for some j >= i such that the reference also needs
+author j. */
+
+/* This function handles 2 tasks:
+determine which authors are needed (cannot be elided with et al.);
+determine which authors can have only last names in the labels.
+
+References >= start and < end have the same first i author names.
+Also they're sorted by A+. */
+
+static void consider_authors(reference **start, reference **end, int i)
+{
+ if (start >= end)
+ return;
+ reference **p = start;
+ if (i >= (*p)->get_nauthors()) {
+ for (++p; p < end && i >= (*p)->get_nauthors(); p++)
+ ;
+ if (p < end && i > 0) {
+ // If we have an author list <A B C> and an author list <A B C D>,
+ // then both lists need C.
+ for (reference **q = start; q < end; q++)
+ (*q)->need_author(i - 1);
+ }
+ start = p;
+ }
+ while (p < end) {
+ reference **last_name_start = p;
+ reference **name_start = p;
+ for (++p;
+ p < end && i < (*p)->get_nauthors()
+ && same_author_last_name(**last_name_start, **p, i);
+ p++) {
+ if (!same_author_name(**name_start, **p, i)) {
+ consider_authors(name_start, p, i + 1);
+ name_start = p;
+ }
+ }
+ consider_authors(name_start, p, i + 1);
+ if (last_name_start == name_start) {
+ for (reference **q = last_name_start; q < p; q++)
+ (*q)->set_last_name_unambiguous(i);
+ }
+ // If we have an author list <A B C D> and <A B C E>, then the lists
+ // need author D and E respectively.
+ if (name_start > start || p < end) {
+ for (reference **q = last_name_start; q < p; q++)
+ (*q)->need_author(i);
+ }
+ }
+}
+
+int same_author_last_name(const reference &r1, const reference &r2, int n)
+{
+ const char *ae1;
+ const char *as1 = r1.get_sort_field(0, n, 0, &ae1);
+ const char *ae2;
+ const char *as2 = r2.get_sort_field(0, n, 0, &ae2);
+ if (!as1 && !as2) return 1; // they are the same
+ if (!as1 || !as2) return 0;
+ return ae1 - as1 == ae2 - as2 && memcmp(as1, as2, ae1 - as1) == 0;
+}
+
+int same_author_name(const reference &r1, const reference &r2, int n)
+{
+ const char *ae1;
+ const char *as1 = r1.get_sort_field(0, n, -1, &ae1);
+ const char *ae2;
+ const char *as2 = r2.get_sort_field(0, n, -1, &ae2);
+ if (!as1 && !as2) return 1; // they are the same
+ if (!as1 || !as2) return 0;
+ return ae1 - as1 == ae2 - as2 && memcmp(as1, as2, ae1 - as1) == 0;
+}
+
+
+void int_set::set(int i)
+{
+ assert(i >= 0);
+ int bytei = i >> 3;
+ if (bytei >= v.length()) {
+ int old_length = v.length();
+ v.set_length(bytei + 1);
+ for (int j = old_length; j <= bytei; j++)
+ v[j] = 0;
+ }
+ v[bytei] |= 1 << (i & 7);
+}
+
+int int_set::get(int i) const
+{
+ assert(i >= 0);
+ int bytei = i >> 3;
+ return bytei >= v.length() ? 0 : (v[bytei] & (1 << (i & 7))) != 0;
+}
+
+void reference::set_last_name_unambiguous(int i)
+{
+ last_name_unambiguous.set(i);
+}
+
+void reference::need_author(int n)
+{
+ if (n > last_needed_author)
+ last_needed_author = n;
+}
+
+const char *reference::get_authors(const char **end) const
+{
+ if (!computed_authors) {
+ ((reference *)this)->computed_authors = 1;
+ string &result = ((reference *)this)->authors;
+ int na = get_nauthors();
+ result.clear();
+ for (int i = 0; i < na; i++) {
+ if (last_name_unambiguous.get(i)) {
+ const char *e, *start = get_author_last_name(i, &e);
+ assert(start != 0);
+ result.append(start, e - start);
+ }
+ else {
+ const char *e, *start = get_author(i, &e);
+ assert(start != 0);
+ result.append(start, e - start);
+ }
+ if (i == last_needed_author
+ && et_al.length() > 0
+ && et_al_min_elide > 0
+ && last_needed_author + et_al_min_elide < na
+ && na >= et_al_min_total) {
+ result += et_al;
+ break;
+ }
+ if (i < na - 1) {
+ if (na == 2)
+ result += join_authors_exactly_two;
+ else if (i < na - 2)
+ result += join_authors_default;
+ else
+ result += join_authors_last_two;
+ }
+ }
+ }
+ const char *start = authors.contents();
+ *end = start + authors.length();
+ return start;
+}
+
+int reference::get_nauthors() const
+{
+ if (nauthors < 0) {
+ const char *dummy;
+ int na;
+ for (na = 0; get_author(na, &dummy) != 0; na++)
+ ;
+ ((reference *)this)->nauthors = na;
+ }
+ return nauthors;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/refer/ref.cpp b/src/preproc/refer/ref.cpp
new file mode 100644
index 0000000..9e1b5e7
--- /dev/null
+++ b/src/preproc/refer/ref.cpp
@@ -0,0 +1,1161 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "refer.h"
+#include "refid.h"
+#include "ref.h"
+#include "token.h"
+
+static const char *find_day(const char *, const char *, const char **);
+static int find_month(const char *start, const char *end);
+static void abbreviate_names(string &);
+
+#define DEFAULT_ARTICLES "the\000a\000an"
+
+string articles(DEFAULT_ARTICLES, sizeof(DEFAULT_ARTICLES));
+
+// Multiple occurrences of fields are separated by FIELD_SEPARATOR.
+const char FIELD_SEPARATOR = '\0';
+
+const char MULTI_FIELD_NAMES[] = "AE";
+const char *AUTHOR_FIELDS = "AQ";
+
+enum { OTHER, JOURNAL_ARTICLE, BOOK, ARTICLE_IN_BOOK, TECH_REPORT, BELL_TM };
+
+const char *reference_types[] = {
+ "other",
+ "journal-article",
+ "book",
+ "article-in-book",
+ "tech-report",
+ "bell-tm",
+};
+
+static string temp_fields[256];
+
+reference::reference(const char *start, int len, reference_id *ridp)
+: h(0), merged(0), no(-1), field(0), nfields(0), label_ptr(0),
+ computed_authors(0), last_needed_author(-1), nauthors(-1)
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ field_index[i] = NULL_FIELD_INDEX;
+ if (ridp)
+ rid = *ridp;
+ if (start == 0)
+ return;
+ if (len <= 0)
+ return;
+ const char *end = start + len;
+ const char *ptr = start;
+ assert(*ptr == '%');
+ while (ptr < end) {
+ if (ptr + 1 < end && ptr[1] != '\0'
+ && ((ptr[1] != '%' && ptr[1] == annotation_field)
+ || (ptr + 2 < end && ptr[1] == '%' && ptr[2] != '\0'
+ && discard_fields.search(ptr[2]) < 0))) {
+ if (ptr[1] == '%')
+ ptr++;
+ string &f = temp_fields[(unsigned char)ptr[1]];
+ ptr += 2;
+ while (ptr < end && csspace(*ptr))
+ ptr++;
+ for (;;) {
+ for (;;) {
+ if (ptr >= end) {
+ f += '\n';
+ break;
+ }
+ f += *ptr;
+ if (*ptr++ == '\n')
+ break;
+ }
+ if (ptr >= end || *ptr == '%')
+ break;
+ }
+ }
+ else if (ptr + 1 < end && ptr[1] != '\0' && ptr[1] != '%'
+ && discard_fields.search(ptr[1]) < 0) {
+ string &f = temp_fields[(unsigned char)ptr[1]];
+ if (f.length() > 0) {
+ if (strchr(MULTI_FIELD_NAMES, ptr[1]) != 0)
+ f += FIELD_SEPARATOR;
+ else
+ f.clear();
+ }
+ ptr += 2;
+ if (ptr < end) {
+ if (*ptr == ' ')
+ ptr++;
+ for (;;) {
+ const char *p = ptr;
+ while (ptr < end && *ptr != '\n')
+ ptr++;
+ // strip trailing white space
+ const char *q = ptr;
+ while (q > p && q[-1] != '\n' && csspace(q[-1]))
+ q--;
+ while (p < q)
+ f += *p++;
+ if (ptr >= end)
+ break;
+ ptr++;
+ if (ptr >= end)
+ break;
+ if (*ptr == '%')
+ break;
+ f += ' ';
+ }
+ }
+ }
+ else {
+ // skip this field
+ for (;;) {
+ while (ptr < end && *ptr++ != '\n')
+ ;
+ if (ptr >= end || *ptr == '%')
+ break;
+ }
+ }
+ }
+ for (i = 0; i < 256; i++)
+ if (temp_fields[i].length() > 0)
+ nfields++;
+ field = new string[nfields];
+ int j = 0;
+ for (i = 0; i < 256; i++)
+ if (temp_fields[i].length() > 0) {
+ field[j].move(temp_fields[i]);
+ if (abbreviate_fields.search(i) >= 0)
+ abbreviate_names(field[j]);
+ field_index[i] = j;
+ j++;
+ }
+}
+
+reference::~reference()
+{
+ if (nfields > 0)
+ delete[] field;
+}
+
+// ref is the inline, this is the database ref
+
+void reference::merge(reference &ref)
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (field_index[i] != NULL_FIELD_INDEX)
+ temp_fields[i].move(field[field_index[i]]);
+ for (i = 0; i < 256; i++)
+ if (ref.field_index[i] != NULL_FIELD_INDEX)
+ temp_fields[i].move(ref.field[ref.field_index[i]]);
+ for (i = 0; i < 256; i++)
+ field_index[i] = NULL_FIELD_INDEX;
+ int old_nfields = nfields;
+ nfields = 0;
+ for (i = 0; i < 256; i++)
+ if (temp_fields[i].length() > 0)
+ nfields++;
+ if (nfields != old_nfields) {
+ if (old_nfields > 0)
+ delete[] field;
+ field = new string[nfields];
+ }
+ int j = 0;
+ for (i = 0; i < 256; i++)
+ if (temp_fields[i].length() > 0) {
+ field[j].move(temp_fields[i]);
+ field_index[i] = j;
+ j++;
+ }
+ merged = 1;
+}
+
+void reference::insert_field(unsigned char c, string &s)
+{
+ assert(s.length() > 0);
+ if (field_index[c] != NULL_FIELD_INDEX) {
+ field[field_index[c]].move(s);
+ return;
+ }
+ assert(field_index[c] == NULL_FIELD_INDEX);
+ string *old_field = field;
+ field = new string[nfields + 1];
+ int pos = 0;
+ int i;
+ for (i = 0; i < int(c); i++)
+ if (field_index[i] != NULL_FIELD_INDEX)
+ pos++;
+ for (i = 0; i < pos; i++)
+ field[i].move(old_field[i]);
+ field[pos].move(s);
+ for (i = pos; i < nfields; i++)
+ field[i + 1].move(old_field[i]);
+ if (nfields > 0)
+ delete[] old_field;
+ nfields++;
+ field_index[c] = pos;
+ for (i = c + 1; i < 256; i++)
+ if (field_index[i] != NULL_FIELD_INDEX)
+ field_index[i] += 1;
+}
+
+void reference::delete_field(unsigned char c)
+{
+ if (field_index[c] == NULL_FIELD_INDEX)
+ return;
+ string *old_field = field;
+ field = new string[nfields - 1];
+ int i;
+ for (i = 0; i < int(field_index[c]); i++)
+ field[i].move(old_field[i]);
+ for (i = field_index[c]; i < nfields - 1; i++)
+ field[i].move(old_field[i + 1]);
+ if (nfields > 0)
+ delete[] old_field;
+ nfields--;
+ field_index[c] = NULL_FIELD_INDEX;
+ for (i = c + 1; i < 256; i++)
+ if (field_index[i] != NULL_FIELD_INDEX)
+ field_index[i] -= 1;
+}
+
+void reference::compute_hash_code()
+{
+ if (!rid.is_null())
+ h = rid.hash();
+ else {
+ h = 0;
+ for (int i = 0; i < nfields; i++)
+ if (field[i].length() > 0) {
+ h <<= 4;
+ h ^= hash_string(field[i].contents(), field[i].length());
+ }
+ }
+}
+
+void reference::set_number(int n)
+{
+ no = n;
+}
+
+const char SORT_SEP = '\001';
+const char SORT_SUB_SEP = '\002';
+const char SORT_SUB_SUB_SEP = '\003';
+
+// sep specifies additional word separators
+
+void sortify_words(const char *s, const char *end, const char *sep,
+ string &result)
+{
+ int non_empty = 0;
+ int need_separator = 0;
+ for (;;) {
+ const char *token_start = s;
+ if (!get_token(&s, end))
+ break;
+ if ((s - token_start == 1
+ && (*token_start == ' '
+ || *token_start == '\n'
+ || (sep && *token_start != '\0'
+ && strchr(sep, *token_start) != 0)))
+ || (s - token_start == 2
+ && token_start[0] == '\\' && token_start[1] == ' ')) {
+ if (non_empty)
+ need_separator = 1;
+ }
+ else {
+ const token_info *ti = lookup_token(token_start, s);
+ if (ti->sortify_non_empty(token_start, s)) {
+ if (need_separator) {
+ result += ' ';
+ need_separator = 0;
+ }
+ ti->sortify(token_start, s, result);
+ non_empty = 1;
+ }
+ }
+ }
+}
+
+void sortify_word(const char *s, const char *end, string &result)
+{
+ for (;;) {
+ const char *token_start = s;
+ if (!get_token(&s, end))
+ break;
+ const token_info *ti = lookup_token(token_start, s);
+ ti->sortify(token_start, s, result);
+ }
+}
+
+void sortify_other(const char *s, int len, string &key)
+{
+ sortify_words(s, s + len, 0, key);
+}
+
+void sortify_title(const char *s, int len, string &key)
+{
+ const char *end = s + len;
+ for (; s < end && (*s == ' ' || *s == '\n'); s++)
+ ;
+ const char *ptr = s;
+ for (;;) {
+ const char *token_start = ptr;
+ if (!get_token(&ptr, end))
+ break;
+ if (ptr - token_start == 1
+ && (*token_start == ' ' || *token_start == '\n'))
+ break;
+ }
+ if (ptr < end) {
+ unsigned int first_word_len = ptr - s - 1;
+ const char *ae = articles.contents() + articles.length();
+ for (const char *a = articles.contents();
+ a < ae;
+ a = strchr(a, '\0') + 1)
+ if (first_word_len == strlen(a)) {
+ unsigned int j;
+ for (j = 0; j < first_word_len; j++)
+ if (a[j] != cmlower(s[j]))
+ break;
+ if (j >= first_word_len) {
+ s = ptr;
+ for (; s < end && (*s == ' ' || *s == '\n'); s++)
+ ;
+ break;
+ }
+ }
+ }
+ sortify_words(s, end, 0, key);
+}
+
+void sortify_name(const char *s, int len, string &key)
+{
+ const char *last_name_end;
+ const char *last_name = find_last_name(s, s + len, &last_name_end);
+ sortify_word(last_name, last_name_end, key);
+ key += SORT_SUB_SUB_SEP;
+ if (last_name > s)
+ sortify_words(s, last_name, ".", key);
+ key += SORT_SUB_SUB_SEP;
+ if (last_name_end < s + len)
+ sortify_words(last_name_end, s + len, ".,", key);
+}
+
+void sortify_date(const char *s, int len, string &key)
+{
+ const char *year_end;
+ const char *year_start = find_year(s, s + len, &year_end);
+ if (!year_start) {
+ // Things without years are often 'forthcoming', so it makes sense
+ // that they sort after things with explicit years.
+ key += 'A';
+ sortify_words(s, s + len, 0, key);
+ return;
+ }
+ int n = year_end - year_start;
+ while (n < 4) {
+ key += '0';
+ n++;
+ }
+ while (year_start < year_end)
+ key += *year_start++;
+ int m = find_month(s, s + len);
+ if (m < 0)
+ return;
+ key += 'A' + m;
+ const char *day_end;
+ const char *day_start = find_day(s, s + len, &day_end);
+ if (!day_start)
+ return;
+ if (day_end - day_start == 1)
+ key += '0';
+ while (day_start < day_end)
+ key += *day_start++;
+}
+
+// SORT_{SUB,SUB_SUB}_SEP can creep in from use of @ in label specification.
+
+void sortify_label(const char *s, int len, string &key)
+{
+ const char *end = s + len;
+ for (;;) {
+ const char *ptr;
+ for (ptr = s;
+ ptr < end && *ptr != SORT_SUB_SEP && *ptr != SORT_SUB_SUB_SEP;
+ ptr++)
+ ;
+ if (ptr > s)
+ sortify_words(s, ptr, 0, key);
+ s = ptr;
+ if (s >= end)
+ break;
+ key += *s++;
+ }
+}
+
+void reference::compute_sort_key()
+{
+ if (sort_fields.length() == 0)
+ return;
+ sort_fields += '\0';
+ const char *sf = sort_fields.contents();
+ int first_time = 1;
+ while (*sf != '\0') {
+ if (!first_time)
+ sort_key += SORT_SEP;
+ first_time = 0;
+ char f = *sf++;
+ int n = 1;
+ if (*sf == '+') {
+ n = INT_MAX;
+ sf++;
+ }
+ else if (csdigit(*sf)) {
+ char *ptr;
+ long l = strtol(sf, &ptr, 10);
+ if (l == 0 && ptr == sf)
+ ;
+ else {
+ sf = ptr;
+ if (l < 0) {
+ n = 1;
+ }
+ else {
+ n = int(l);
+ }
+ }
+ }
+ if (f == '.')
+ sortify_label(label.contents(), label.length(), sort_key);
+ else if (f == AUTHOR_FIELDS[0])
+ sortify_authors(n, sort_key);
+ else
+ sortify_field(f, n, sort_key);
+ }
+ sort_fields.set_length(sort_fields.length() - 1);
+}
+
+void reference::sortify_authors(int n, string &result) const
+{
+ for (const char *p = AUTHOR_FIELDS; *p != '\0'; p++)
+ if (contains_field(*p)) {
+ sortify_field(*p, n, result);
+ return;
+ }
+ sortify_field(AUTHOR_FIELDS[0], n, result);
+}
+
+void reference::canonicalize_authors(string &result) const
+{
+ int len = result.length();
+ sortify_authors(INT_MAX, result);
+ if (result.length() > len)
+ result += SORT_SUB_SEP;
+}
+
+void reference::sortify_field(unsigned char f, int n, string &result) const
+{
+ typedef void (*sortify_t)(const char *, int, string &);
+ sortify_t sortifier = sortify_other;
+ switch (f) {
+ case 'A':
+ case 'E':
+ sortifier = sortify_name;
+ break;
+ case 'D':
+ sortifier = sortify_date;
+ break;
+ case 'B':
+ case 'J':
+ case 'T':
+ sortifier = sortify_title;
+ break;
+ }
+ int fi = field_index[(unsigned char)f];
+ if (fi != NULL_FIELD_INDEX) {
+ string &str = field[fi];
+ const char *start = str.contents();
+ const char *end = start + str.length();
+ for (int i = 0; i < n && start < end; i++) {
+ const char *p = start;
+ while (start < end && *start != FIELD_SEPARATOR)
+ start++;
+ if (i > 0)
+ result += SORT_SUB_SEP;
+ (*sortifier)(p, start - p, result);
+ if (start < end)
+ start++;
+ }
+ }
+}
+
+int compare_reference(const reference &r1, const reference &r2)
+{
+ assert(r1.no >= 0);
+ assert(r2.no >= 0);
+ const char *s1 = r1.sort_key.contents();
+ int n1 = r1.sort_key.length();
+ const char *s2 = r2.sort_key.contents();
+ int n2 = r2.sort_key.length();
+ for (; n1 > 0 && n2 > 0; --n1, --n2, ++s1, ++s2)
+ if (*s1 != *s2)
+ return (int)(unsigned char)*s1 - (int)(unsigned char)*s2;
+ if (n2 > 0)
+ return -1;
+ if (n1 > 0)
+ return 1;
+ return r1.no - r2.no;
+}
+
+int same_reference(const reference &r1, const reference &r2)
+{
+ if (!r1.rid.is_null() && r1.rid == r2.rid)
+ return 1;
+ if (r1.h != r2.h)
+ return 0;
+ if (r1.nfields != r2.nfields)
+ return 0;
+ int i = 0;
+ for (i = 0; i < 256; i++)
+ if (r1.field_index != r2.field_index)
+ return 0;
+ for (i = 0; i < r1.nfields; i++)
+ if (r1.field[i] != r2.field[i])
+ return 0;
+ return 1;
+}
+
+const char *find_last_name(const char *start, const char *end,
+ const char **endp)
+{
+ const char *ptr = start;
+ const char *last_word = start;
+ for (;;) {
+ const char *token_start = ptr;
+ if (!get_token(&ptr, end))
+ break;
+ if (ptr - token_start == 1) {
+ if (*token_start == ',') {
+ *endp = token_start;
+ return last_word;
+ }
+ else if (*token_start == ' ' || *token_start == '\n') {
+ if (ptr < end && *ptr != ' ' && *ptr != '\n')
+ last_word = ptr;
+ }
+ }
+ }
+ *endp = end;
+ return last_word;
+}
+
+void abbreviate_name(const char *ptr, const char *end, string &result)
+{
+ const char *last_name_end;
+ const char *last_name_start = find_last_name(ptr, end, &last_name_end);
+ int need_period = 0;
+ for (;;) {
+ const char *token_start = ptr;
+ if (!get_token(&ptr, last_name_start))
+ break;
+ const token_info *ti = lookup_token(token_start, ptr);
+ if (need_period) {
+ if ((ptr - token_start == 1 && *token_start == ' ')
+ || (ptr - token_start == 2 && token_start[0] == '\\'
+ && token_start[1] == ' '))
+ continue;
+ if (ti->is_upper())
+ result += period_before_initial;
+ else
+ result += period_before_other;
+ need_period = 0;
+ }
+ result.append(token_start, ptr - token_start);
+ if (ti->is_upper()) {
+ const char *lower_ptr = ptr;
+ int first_token = 1;
+ for (;;) {
+ token_start = ptr;
+ if (!get_token(&ptr, last_name_start))
+ break;
+ if ((ptr - token_start == 1 && *token_start == ' ')
+ || (ptr - token_start == 2 && token_start[0] == '\\'
+ && token_start[1] == ' '))
+ break;
+ ti = lookup_token(token_start, ptr);
+ if (ti->is_hyphen()) {
+ const char *ptr1 = ptr;
+ if (get_token(&ptr1, last_name_start)) {
+ ti = lookup_token(ptr, ptr1);
+ if (ti->is_upper()) {
+ result += period_before_hyphen;
+ result.append(token_start, ptr1 - token_start);
+ ptr = ptr1;
+ }
+ }
+ }
+ else if (ti->is_upper()) {
+ // MacDougal -> MacD.
+ result.append(lower_ptr, ptr - lower_ptr);
+ lower_ptr = ptr;
+ first_token = 1;
+ }
+ else if (first_token && ti->is_accent()) {
+ result.append(token_start, ptr - token_start);
+ lower_ptr = ptr;
+ }
+ first_token = 0;
+ }
+ need_period = 1;
+ }
+ }
+ if (need_period)
+ result += period_before_last_name;
+ result.append(last_name_start, end - last_name_start);
+}
+
+static void abbreviate_names(string &result)
+{
+ string str;
+ str.move(result);
+ const char *ptr = str.contents();
+ const char *end = ptr + str.length();
+ while (ptr < end) {
+ const char *name_end = (char *)memchr(ptr, FIELD_SEPARATOR, end - ptr);
+ if (name_end == 0)
+ name_end = end;
+ abbreviate_name(ptr, name_end, result);
+ if (name_end >= end)
+ break;
+ ptr = name_end + 1;
+ result += FIELD_SEPARATOR;
+ }
+}
+
+void reverse_name(const char *ptr, const char *name_end, string &result)
+{
+ const char *last_name_end;
+ const char *last_name_start = find_last_name(ptr, name_end, &last_name_end);
+ result.append(last_name_start, last_name_end - last_name_start);
+ while (last_name_start > ptr
+ && (last_name_start[-1] == ' ' || last_name_start[-1] == '\n'))
+ last_name_start--;
+ if (last_name_start > ptr) {
+ result += ", ";
+ result.append(ptr, last_name_start - ptr);
+ }
+ if (last_name_end < name_end)
+ result.append(last_name_end, name_end - last_name_end);
+}
+
+void reverse_names(string &result, int n)
+{
+ if (n <= 0)
+ return;
+ string str;
+ str.move(result);
+ const char *ptr = str.contents();
+ const char *end = ptr + str.length();
+ while (ptr < end) {
+ if (--n < 0) {
+ result.append(ptr, end - ptr);
+ break;
+ }
+ const char *name_end = (char *)memchr(ptr, FIELD_SEPARATOR, end - ptr);
+ if (name_end == 0)
+ name_end = end;
+ reverse_name(ptr, name_end, result);
+ if (name_end >= end)
+ break;
+ ptr = name_end + 1;
+ result += FIELD_SEPARATOR;
+ }
+}
+
+// Return number of field separators.
+
+int join_fields(string &f)
+{
+ const char *ptr = f.contents();
+ int len = f.length();
+ int nfield_seps = 0;
+ int j;
+ for (j = 0; j < len; j++)
+ if (ptr[j] == FIELD_SEPARATOR)
+ nfield_seps++;
+ if (nfield_seps == 0)
+ return 0;
+ string temp;
+ int field_seps_left = nfield_seps;
+ for (j = 0; j < len; j++) {
+ if (ptr[j] == FIELD_SEPARATOR) {
+ if (nfield_seps == 1)
+ temp += join_authors_exactly_two;
+ else if (--field_seps_left == 0)
+ temp += join_authors_last_two;
+ else
+ temp += join_authors_default;
+ }
+ else
+ temp += ptr[j];
+ }
+ f = temp;
+ return nfield_seps;
+}
+
+void uppercase(const char *start, const char *end, string &result)
+{
+ for (;;) {
+ const char *token_start = start;
+ if (!get_token(&start, end))
+ break;
+ const token_info *ti = lookup_token(token_start, start);
+ ti->upper_case(token_start, start, result);
+ }
+}
+
+void lowercase(const char *start, const char *end, string &result)
+{
+ for (;;) {
+ const char *token_start = start;
+ if (!get_token(&start, end))
+ break;
+ const token_info *ti = lookup_token(token_start, start);
+ ti->lower_case(token_start, start, result);
+ }
+}
+
+void capitalize(const char *ptr, const char *end, string &result)
+{
+ int in_small_point_size = 0;
+ for (;;) {
+ const char *start = ptr;
+ if (!get_token(&ptr, end))
+ break;
+ const token_info *ti = lookup_token(start, ptr);
+ const char *char_end = ptr;
+ int is_lower = ti->is_lower();
+ if ((is_lower || ti->is_upper()) && get_token(&ptr, end)) {
+ const token_info *ti2 = lookup_token(char_end, ptr);
+ if (!ti2->is_accent())
+ ptr = char_end;
+ }
+ if (is_lower) {
+ if (!in_small_point_size) {
+ result += "\\s-2";
+ in_small_point_size = 1;
+ }
+ ti->upper_case(start, char_end, result);
+ result.append(char_end, ptr - char_end);
+ }
+ else {
+ if (in_small_point_size) {
+ result += "\\s+2";
+ in_small_point_size = 0;
+ }
+ result.append(start, ptr - start);
+ }
+ }
+ if (in_small_point_size)
+ result += "\\s+2";
+}
+
+void capitalize_field(string &str)
+{
+ string temp;
+ capitalize(str.contents(), str.contents() + str.length(), temp);
+ str.move(temp);
+}
+
+int is_terminated(const char *ptr, const char *end)
+{
+ const char *last_token = end;
+ for (;;) {
+ const char *p = ptr;
+ if (!get_token(&ptr, end))
+ break;
+ last_token = p;
+ }
+ return end - last_token == 1
+ && (*last_token == '.' || *last_token == '!' || *last_token == '?');
+}
+
+void reference::output(FILE *fp)
+{
+ fputs(".]-\n", fp);
+ for (int i = 0; i < 256; i++)
+ if (field_index[i] != NULL_FIELD_INDEX && i != annotation_field) {
+ string &f = field[field_index[i]];
+ if (!csdigit(i)) {
+ int j = reverse_fields.search(i);
+ if (j >= 0) {
+ int n;
+ int len = reverse_fields.length();
+ if (++j < len && csdigit(reverse_fields[j])) {
+ n = reverse_fields[j] - '0';
+ for (++j; j < len && csdigit(reverse_fields[j]); j++)
+ // should check for overflow
+ n = n*10 + reverse_fields[j] - '0';
+ }
+ else
+ n = INT_MAX;
+ reverse_names(f, n);
+ }
+ }
+ int is_multiple = join_fields(f) > 0;
+ if (capitalize_fields.search(i) >= 0)
+ capitalize_field(f);
+ if (memchr(f.contents(), '\n', f.length()) == 0) {
+ fprintf(fp, ".ds [%c ", i);
+ if (f[0] == ' ' || f[0] == '\\' || f[0] == '"')
+ putc('"', fp);
+ put_string(f, fp);
+ putc('\n', fp);
+ }
+ else {
+ fprintf(fp, ".de [%c\n", i);
+ put_string(f, fp);
+ fputs("..\n", fp);
+ }
+ if (i == 'P') {
+ int multiple_pages = 0;
+ const char *s = f.contents();
+ const char *end = f.contents() + f.length();
+ for (;;) {
+ const char *token_start = s;
+ if (!get_token(&s, end))
+ break;
+ const token_info *ti = lookup_token(token_start, s);
+ if (ti->is_hyphen() || ti->is_range_sep()) {
+ multiple_pages = 1;
+ break;
+ }
+ }
+ fprintf(fp, ".nr [P %d\n", multiple_pages);
+ }
+ else if (i == 'E')
+ fprintf(fp, ".nr [E %d\n", is_multiple);
+ }
+ for (const char *p = "TAO"; *p; p++) {
+ int fi = field_index[(unsigned char)*p];
+ if (fi != NULL_FIELD_INDEX) {
+ string &f = field[fi];
+ fprintf(fp, ".nr [%c %d\n", *p,
+ is_terminated(f.contents(), f.contents() + f.length()));
+ }
+ }
+ int t = classify();
+ fprintf(fp, ".][ %d %s\n", t, reference_types[t]);
+ if (annotation_macro.length() > 0 && annotation_field >= 0
+ && field_index[annotation_field] != NULL_FIELD_INDEX) {
+ putc('.', fp);
+ put_string(annotation_macro, fp);
+ putc('\n', fp);
+ put_string(field[field_index[annotation_field]], fp);
+ }
+}
+
+void reference::print_sort_key_comment(FILE *fp)
+{
+ fputs(".\\\"", fp);
+ put_string(sort_key, fp);
+ putc('\n', fp);
+}
+
+const char *find_year(const char *start, const char *end, const char **endp)
+{
+ for (;;) {
+ while (start < end && !csdigit(*start))
+ start++;
+ const char *ptr = start;
+ if (start == end)
+ break;
+ while (ptr < end && csdigit(*ptr))
+ ptr++;
+ if (ptr - start == 4 || ptr - start == 3
+ || (ptr - start == 2
+ && (start[0] >= '4' || (start[0] == '3' && start[1] >= '2')))) {
+ *endp = ptr;
+ return start;
+ }
+ start = ptr;
+ }
+ return 0;
+}
+
+static const char *find_day(const char *start, const char *end,
+ const char **endp)
+{
+ for (;;) {
+ while (start < end && !csdigit(*start))
+ start++;
+ const char *ptr = start;
+ if (start == end)
+ break;
+ while (ptr < end && csdigit(*ptr))
+ ptr++;
+ if ((ptr - start == 1 && start[0] != '0')
+ || (ptr - start == 2 &&
+ (start[0] == '1'
+ || start[0] == '2'
+ || (start[0] == '3' && start[1] <= '1')
+ || (start[0] == '0' && start[1] != '0')))) {
+ *endp = ptr;
+ return start;
+ }
+ start = ptr;
+ }
+ return 0;
+}
+
+static int find_month(const char *start, const char *end)
+{
+ static const char *months[] = {
+ "january",
+ "february",
+ "march",
+ "april",
+ "may",
+ "june",
+ "july",
+ "august",
+ "september",
+ "october",
+ "november",
+ "december",
+ };
+ for (;;) {
+ while (start < end && !csalpha(*start))
+ start++;
+ const char *ptr = start;
+ if (start == end)
+ break;
+ while (ptr < end && csalpha(*ptr))
+ ptr++;
+ if (ptr - start >= 3) {
+ for (unsigned int i = 0; i < sizeof(months)/sizeof(months[0]); i++) {
+ const char *q = months[i];
+ const char *p = start;
+ for (; p < ptr; p++, q++)
+ if (cmlower(*p) != *q)
+ break;
+ if (p >= ptr)
+ return i;
+ }
+ }
+ start = ptr;
+ }
+ return -1;
+}
+
+int reference::contains_field(char c) const
+{
+ return field_index[(unsigned char)c] != NULL_FIELD_INDEX;
+}
+
+int reference::classify()
+{
+ if (contains_field('J'))
+ return JOURNAL_ARTICLE;
+ if (contains_field('B'))
+ return ARTICLE_IN_BOOK;
+ if (contains_field('G'))
+ return TECH_REPORT;
+ if (contains_field('R'))
+ return TECH_REPORT;
+ if (contains_field('I'))
+ return BOOK;
+ if (contains_field('M'))
+ return BELL_TM;
+ return OTHER;
+}
+
+const char *reference::get_year(const char **endp) const
+{
+ if (field_index['D'] != NULL_FIELD_INDEX) {
+ string &date = field[field_index['D']];
+ const char *start = date.contents();
+ const char *end = start + date.length();
+ return find_year(start, end, endp);
+ }
+ else
+ return 0;
+}
+
+const char *reference::get_field(unsigned char c, const char **endp) const
+{
+ if (field_index[c] != NULL_FIELD_INDEX) {
+ string &f = field[field_index[c]];
+ const char *start = f.contents();
+ *endp = start + f.length();
+ return start;
+ }
+ else
+ return 0;
+}
+
+const char *reference::get_date(const char **endp) const
+{
+ return get_field('D', endp);
+}
+
+const char *nth_field(int i, const char *start, const char **endp)
+{
+ while (--i >= 0) {
+ start = (char *)memchr(start, FIELD_SEPARATOR, *endp - start);
+ if (!start)
+ return 0;
+ start++;
+ }
+ const char *e = (char *)memchr(start, FIELD_SEPARATOR, *endp - start);
+ if (e)
+ *endp = e;
+ return start;
+}
+
+const char *reference::get_author(int i, const char **endp) const
+{
+ for (const char *f = AUTHOR_FIELDS; *f != '\0'; f++) {
+ const char *start = get_field(*f, endp);
+ if (start) {
+ if (strchr(MULTI_FIELD_NAMES, *f) != 0)
+ return nth_field(i, start, endp);
+ else if (i == 0)
+ return start;
+ else
+ return 0;
+ }
+ }
+ return 0;
+}
+
+const char *reference::get_author_last_name(int i, const char **endp) const
+{
+ for (const char *f = AUTHOR_FIELDS; *f != '\0'; f++) {
+ const char *start = get_field(*f, endp);
+ if (start) {
+ if (strchr(MULTI_FIELD_NAMES, *f) != 0) {
+ start = nth_field(i, start, endp);
+ if (!start)
+ return 0;
+ }
+ if (*f == 'A')
+ return find_last_name(start, *endp, endp);
+ else
+ return start;
+ }
+ }
+ return 0;
+}
+
+void reference::set_date(string &d)
+{
+ if (d.length() == 0)
+ delete_field('D');
+ else
+ insert_field('D', d);
+}
+
+int same_year(const reference &r1, const reference &r2)
+{
+ const char *ye1;
+ const char *ys1 = r1.get_year(&ye1);
+ const char *ye2;
+ const char *ys2 = r2.get_year(&ye2);
+ if (ys1 == 0) {
+ if (ys2 == 0)
+ return same_date(r1, r2);
+ else
+ return 0;
+ }
+ else if (ys2 == 0)
+ return 0;
+ else if (ye1 - ys1 != ye2 - ys2)
+ return 0;
+ else
+ return memcmp(ys1, ys2, ye1 - ys1) == 0;
+}
+
+int same_date(const reference &r1, const reference &r2)
+{
+ const char *e1;
+ const char *s1 = r1.get_date(&e1);
+ const char *e2;
+ const char *s2 = r2.get_date(&e2);
+ if (s1 == 0)
+ return s2 == 0;
+ else if (s2 == 0)
+ return 0;
+ else if (e1 - s1 != e2 - s2)
+ return 0;
+ else
+ return memcmp(s1, s2, e1 - s1) == 0;
+}
+
+const char *reference::get_sort_field(int i, int si, int ssi,
+ const char **endp) const
+{
+ const char *start = sort_key.contents();
+ const char *end = start + sort_key.length();
+ if (i < 0) {
+ *endp = end;
+ return start;
+ }
+ while (--i >= 0) {
+ start = (char *)memchr(start, SORT_SEP, end - start);
+ if (!start)
+ return 0;
+ start++;
+ }
+ const char *e = (char *)memchr(start, SORT_SEP, end - start);
+ if (e)
+ end = e;
+ if (si < 0) {
+ *endp = end;
+ return start;
+ }
+ while (--si >= 0) {
+ start = (char *)memchr(start, SORT_SUB_SEP, end - start);
+ if (!start)
+ return 0;
+ start++;
+ }
+ e = (char *)memchr(start, SORT_SUB_SEP, end - start);
+ if (e)
+ end = e;
+ if (ssi < 0) {
+ *endp = end;
+ return start;
+ }
+ while (--ssi >= 0) {
+ start = (char *)memchr(start, SORT_SUB_SUB_SEP, end - start);
+ if (!start)
+ return 0;
+ start++;
+ }
+ e = (char *)memchr(start, SORT_SUB_SUB_SEP, end - start);
+ if (e)
+ end = e;
+ *endp = end;
+ return start;
+}
+
diff --git a/src/preproc/refer/ref.h b/src/preproc/refer/ref.h
new file mode 100644
index 0000000..1205a28
--- /dev/null
+++ b/src/preproc/refer/ref.h
@@ -0,0 +1,127 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+// declarations to avoid friend name injection problems
+int compare_reference(const reference &, const reference &);
+int same_reference(const reference &, const reference &);
+int same_year(const reference &, const reference &);
+int same_date(const reference &, const reference &);
+int same_author_last_name(const reference &, const reference &, int);
+int same_author_name(const reference &, const reference &, int);
+
+struct label_info;
+
+enum label_type { NORMAL_LABEL, SHORT_LABEL };
+const int N_LABEL_TYPES = 2;
+
+struct substring_position {
+ int start;
+ int length;
+ substring_position() : start(-1) { }
+};
+
+class int_set {
+ string v;
+public:
+ int_set() { }
+ void set(int i);
+ int get(int i) const;
+};
+
+class reference {
+private:
+ unsigned h;
+ reference_id rid;
+ int merged;
+ string sort_key;
+ int no;
+ string *field;
+ int nfields;
+ unsigned char field_index[256];
+ enum { NULL_FIELD_INDEX = 255 };
+ string label;
+ substring_position separator_pos;
+ string short_label;
+ substring_position short_separator_pos;
+ label_info *label_ptr;
+ string authors;
+ int computed_authors;
+ int last_needed_author;
+ int nauthors;
+ int_set last_name_unambiguous;
+
+ int contains_field(char) const;
+ void insert_field(unsigned char, string &s);
+ void delete_field(unsigned char);
+ void set_date(string &);
+ const char *get_sort_field(int i, int si, int ssi, const char **endp) const;
+ int merge_labels_by_parts(reference **, int, label_type, string &);
+ int merge_labels_by_number(reference **, int, label_type, string &);
+public:
+ reference(const char * = 0, int = -1, reference_id * = 0);
+ ~reference();
+ void output(FILE *);
+ void print_sort_key_comment(FILE *);
+ void set_number(int);
+ int get_number() const { return no; }
+ unsigned hash() const { return h; }
+ const string &get_label(label_type type) const;
+ const substring_position &get_separator_pos(label_type) const;
+ int is_merged() const { return merged; }
+ void compute_sort_key();
+ void compute_hash_code();
+ void pre_compute_label();
+ void compute_label();
+ void immediate_compute_label();
+ int classify();
+ void merge(reference &);
+ int merge_labels(reference **, int, label_type, string &);
+ int get_nauthors() const;
+ void need_author(int);
+ void set_last_name_unambiguous(int);
+ void sortify_authors(int, string &) const;
+ void canonicalize_authors(string &) const;
+ void sortify_field(unsigned char, int, string &) const;
+ const char *get_author(int, const char **) const;
+ const char *get_author_last_name(int, const char **) const;
+ const char *get_date(const char **) const;
+ const char *get_year(const char **) const;
+ const char *get_field(unsigned char, const char **) const;
+ const label_info *get_label_ptr() const { return label_ptr; }
+ const char *get_authors(const char **) const;
+ // for sorting
+ friend int compare_reference(const reference &r1, const reference &r2);
+ // for merging
+ friend int same_reference(const reference &, const reference &);
+ friend int same_year(const reference &, const reference &);
+ friend int same_date(const reference &, const reference &);
+ friend int same_author_last_name(const reference &, const reference &, int);
+ friend int same_author_name(const reference &, const reference &, int);
+};
+
+const char *find_year(const char *, const char *, const char **);
+const char *find_last_name(const char *, const char *, const char **);
+
+const char *nth_field(int i, const char *start, const char **endp);
+
+void capitalize(const char *ptr, const char *end, string &result);
+void reverse_name(const char *ptr, const char *end, string &result);
+void uppercase(const char *ptr, const char *end, string &result);
+void lowercase(const char *ptr, const char *end, string &result);
+void abbreviate_name(const char *ptr, const char *end, string &result);
diff --git a/src/preproc/refer/refer.1.man b/src/preproc/refer/refer.1.man
new file mode 100644
index 0000000..210afe7
--- /dev/null
+++ b/src/preproc/refer/refer.1.man
@@ -0,0 +1,2020 @@
+.TH @g@refer @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+@g@refer \- process bibliographic references for
+.I groff
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2021 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_refer_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY @g@refer
+.RB [ \-bCenPRS ]
+.RB [ \-a\~\c
+.IR n ]
+.RB [ \-B
+.IB field . macro\c
+]
+.RB [ \-c\~\c
+.IR fields ]
+.RB [ \-f\~\c
+.IR n ]
+.RB [ \-i\~\c
+.IR fields ]
+.RB [ \-k\~\c
+.IR field ]
+.RB [ \-l\~\c
+.IR range-expression ]
+.RB [ \-p\~\c
+.IR database-file ]
+.RB [ \-s\~\c
+.IR fields ]
+.RB [ \-t\~\c
+.IR n ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY @g@refer
+.B \-\-help
+.YS
+.
+.
+.SY @g@refer
+.B \-v
+.
+.SY @g@refer
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The GNU implementation of
+.I \%refer \" generic
+is part of the
+.MR groff @MAN1EXT@
+document formatting system.
+.
+.I @g@refer
+is a
+.MR @g@troff @MAN1EXT@
+preprocessor that prepares bibilographic citations by looking up
+keywords specified in a
+.MR roff @MAN7EXT@
+input document,
+obviating the need to type such annotations,
+and permitting the citation style in formatted output to be altered
+independently and systematically.
+.
+It copies the contents of each
+.I file
+to the standard output stream,
+except that it interprets lines between
+.B .[
+and
+.B .]\&
+as citations to be translated into
+.I groff
+input,
+and lines between
+.B .R1
+and
+.B .R2
+as instructions regarding how citations are to be processed.
+.
+Normally,
+.I @g@refer
+is not executed directly by the user,
+but invoked by specifying the
+.B \-R
+option to
+.MR groff @MAN1EXT@ .
+.
+If no
+.I file
+operands are given on the command line,
+or if
+.I file
+is
+.RB \[lq] \- \[rq],
+the standard input stream is read.
+.
+.
+.LP
+Each citation specifies a reference.
+.
+The citation can specify a reference that is contained in a
+bibliographic database by giving a set of keywords that only that
+reference contains.
+.
+Alternatively it can specify a reference by supplying a database record
+in the citation.
+.
+A combination of these alternatives is also possible.
+.
+.
+.LP
+For each citation,
+.I @g@refer
+can produce a mark in the text.
+.
+This mark consists of some label which can be separated from the text
+and from other labels in various ways.
+.
+For each reference it also outputs
+.MR groff @MAN7EXT@
+language commands that can be used by a macro package to produce a
+formatted reference for each citation.
+.
+The output of
+.I @g@refer
+must therefore be processed using a suitable macro package,
+such as
+.\" .IR man ,
+.IR me ,
+.IR mm ,
+.IR mom ,
+or
+.IR ms .
+.
+The commands to format a citation's reference can be output immediately
+after the citation,
+or the references may be accumulated,
+and the commands output at some later point.
+.
+If the references are accumulated,
+then multiple citations of the same reference will produce a single
+formatted reference.
+.
+.
+.LP
+The interpretation of lines between
+.B .R1
+and
+.B .R2
+as prepreocessor commands is a feature of GNU
+.IR \%refer . \" GNU
+.
+Documents making use of this feature can still be processed by AT&T
+.I \%refer \" AT&T
+just by adding the lines
+.
+.RS
+.EX
+\&.de R1
+\&.ig R2
+\&..
+.EE
+.RE
+.
+to the beginning of the document.
+.
+This will cause
+.MR @g@troff @MAN1EXT@
+to ignore everything between
+.B .R1
+and
+.BR .R2 .
+.
+The effect of some commands can also be achieved by options.
+.
+These options are supported mainly for compatibility with AT&T
+.IR \%refer . \" AT&T
+.
+It is usually more convenient to use commands.
+.
+.
+.LP
+.I @g@refer
+generates
+.B .lf
+requests so that file names and line numbers in messages produced by
+commands that read
+.I @g@refer
+output will be correct;
+it also interprets lines beginning with
+.B .lf
+so that file names and line numbers in the messages and
+.B .lf
+lines that it produces will be accurate even if the input has been
+preprocessed by a command such as
+.MR @g@soelim @MAN1EXT@ .
+.
+.
+.\" ====================================================================
+.SS "Bibliographic databases"
+.\" ====================================================================
+.
+The bibliographic database is a text file consisting of records
+separated by one or more blank lines.
+.
+Within each record fields start with a
+.B %
+at the beginning of a line.
+.
+Each field has a one character name that immediately follows the
+.BR % .
+It is best to use only upper and lower case letters for the names
+of fields.
+.
+The name of the field should be followed by exactly one space,
+and then by the contents of the field.
+.
+Empty fields are ignored.
+.
+The conventional meaning of each field is as follows:
+.
+.
+.TP
+.B %A
+The name of an author.
+.
+If the name contains a suffix such as \[lq]Jr.\&\[rq],
+it should be separated from the last name by a comma.
+.
+There can be multiple occurrences of the
+.B %A
+field.
+.
+The order is significant.
+.
+It is a good idea always to supply an
+.B %A
+field or a
+.B %Q
+field.
+.
+.
+.TP
+.B %B
+For an article that is part of a book,
+the title of the book.
+.
+.
+.TP
+.B %C
+The place (city) of publication.
+.
+.
+.TP
+.B %D
+The date of publication.
+.
+The year should be specified in full.
+.
+If the month is specified,
+the name rather than the number of the month should be used,
+but only the first three letters are required.
+.
+It is a good idea always to supply a
+.B %D
+field;
+if the date is unknown,
+a value such as
+.B in press
+or
+.B unknown
+can be used.
+.
+.
+.TP
+.B %E
+For an article that is part of a book,
+the name of an editor of the book.
+.
+Where the work has editors and no authors,
+the names of the editors should be given as
+.B %A
+fields and
+.RB \[lq] ,\~(ed.)\& \[rq]
+or
+.RB \[lq] ,\~(eds.)\& \[rq]
+should be appended to the last author.
+.
+.
+.TP
+.B %G
+U.S. government ordering number.
+.
+.
+.TP
+.B %I
+The publisher (issuer).
+.
+.
+.TP
+.B %J
+For an article in a journal,
+the name of the journal.
+.
+.
+.TP
+.B %K
+Keywords to be used for searching.
+.
+.
+.TP
+.B %L
+Label.
+.
+.
+.TP
+.B %N
+Journal issue number.
+.
+.
+.TP
+.B %O
+Other information.
+.
+This is usually printed at the end of the reference.
+.
+.
+.TP
+.B %P
+Page number.
+.
+A range of pages can be specified as
+.IB m \- \c
+.IR n .
+.
+.
+.TP
+.B %Q
+The name of the author,
+if the author is not a person.
+.
+This will only be used if there are no
+.B %A
+fields.
+.
+There can only be one
+.B %Q
+field.
+.
+.
+.TP
+.B %R
+Technical report number.
+.
+.
+.TP
+.B %S
+Series name.
+.
+.
+.TP
+.B %T
+Title.
+.
+For an article in a book or journal,
+this should be the title of the article.
+.
+.
+.TP
+.B %V
+Volume number of the journal or book.
+.
+.
+.TP
+.B %X
+Annotation.
+.
+.
+.LP
+For all fields except
+.B %A
+and
+.BR %E ,
+if there is more than one occurrence of a particular field in a record,
+only the last such field will be used.
+.
+.
+.P
+If accent strings are used,
+they should follow the character to be accented.
+.
+This means that an
+.I ms
+document must call the
+.B .AM
+macro when it initializes.
+.
+Accent strings should not be quoted:
+use one
+.B \e
+rather than two.
+.
+Accent strings are an obsolescent feature of the
+.I me
+and
+.I ms
+macro packages;
+modern documents should use
+.I groff
+special character escape sequences instead;
+see
+.MR groff_char @MAN7EXT@ .
+.
+.
+.\" ====================================================================
+.SS Citations
+.\" ====================================================================
+.
+Citations have a characteristic format.
+.
+.RS
+.EX
+.BI .[ opening-text
+.I flags keywords
+.I fields
+.BI .] closing-text
+.EE
+.RE
+.
+.
+.LP
+The
+.IR opening-text ,
+.IR closing-text ,
+and
+.I flags
+components are optional.
+.
+Only one of the
+.I keywords
+and
+.I fields
+components need be specified.
+.
+.
+.LP
+The
+.I keywords
+component says to search the bibliographic databases for a reference
+that contains all the words in
+.IR keywords .
+.
+It is an error if more than one reference is found.
+.
+.
+.LP
+The
+.I fields
+components specifies additional fields to replace or supplement those
+specified in the reference.
+.
+When references are being accumulated and the
+.I keywords
+component is non-empty,
+then additional fields should be specified only on the first occasion
+that a particular reference is cited,
+and will apply to all citations of that reference.
+.
+.
+.br
+.ne 2v
+.LP
+The
+.I opening-text
+and
+.I closing-text
+components specify strings to be used to bracket the label instead of
+those in the
+.B \%bracket\-label
+command.
+.
+If either of these components is non-empty,
+the strings specified in the
+.B \%bracket\-label
+command will not be used;
+this behavior can be altered using the
+.B [
+and
+.B ]
+flags.
+.
+Leading and trailing spaces are significant for these components.
+.
+.
+.LP
+The
+.I flags
+component is a list of non-alphanumeric characters each of which
+modifies the treatment of this particular citation.
+.
+AT&T
+.I \%refer \" AT&T
+will treat these flags as part of the keywords and so will ignore them
+since they are non-alphanumeric.
+.
+The following flags are currently recognized.
+.
+.
+.TP
+.B #
+Use the label specified by the
+.B \%short\-label
+command,
+instead of that specified by the
+.B \%label
+command.
+.
+If no short label has been specified,
+the normal label will be used.
+.
+Typically the short label is used with author-date labels and consists
+of only the date and possibly a disambiguating letter;
+the
+.RB \[lq] # \[rq]
+is supposed to be suggestive of a numeric type of label.
+.
+.
+.TP
+.B [
+Precede
+.I opening-text
+with the first string specified in the
+.B \%bracket\-label
+command.
+.
+.
+.TP
+.B ]
+Follow
+.I closing-text
+with the second string specified in the
+.B \%bracket\-label
+command.
+.
+.
+.LP
+An advantage of using the
+.B [
+and
+.B ]
+flags rather than including the brackets in
+.I opening-text
+and
+.I closing-text
+is that
+.
+you can change the style of bracket used in the document just by
+changing the
+.B \%bracket\-label
+command.
+.
+Another is that sorting and merging of citations will not necessarily be
+inhibited if the flags are used.
+.
+.
+.LP
+If a label is to be inserted into the text,
+it will be attached to the line preceding the
+.B .[
+line.
+.
+If there is no such line,
+then an extra line will be inserted before the
+.B .[
+line and a warning will be given.
+.
+.
+.LP
+There is no special notation for making a citation to multiple
+references.
+.
+Just use a sequence of citations,
+one for each reference.
+.
+Don't put anything between the citations.
+.
+The labels for all the citations will be attached to the line preceding
+the first citation.
+.
+The labels may also be sorted or merged.
+.
+See the description of the
+.B <>
+label expression,
+and of the
+.B \%sort\-adjacent\-labels
+and
+.B \%abbreviate\-label\-ranges
+commands.
+.
+A label will not be merged if its citation has a non-empty
+.I opening-text
+or
+.IR closing-text .
+.
+However,
+the labels for a citation using the
+.B ]
+flag and without any
+.I closing-text
+immediately followed by a citation using the
+.B [
+flag and without any
+.I opening-text
+may be sorted and merged
+even though the first citation's
+.I opening-text
+or the second citation's
+.I closing-text
+is non-empty.
+.
+(If you wish to prevent this,
+use the dummy character escape sequence
+.B \[rs]&
+as the first citation's
+.IR closing-text .)
+.
+.
+.\" ====================================================================
+.SS Commands
+.\" ====================================================================
+.
+Commands are contained between lines starting with
+.B .R1
+and
+.BR .R2 .
+.
+Recognition of these lines can be prevented by the
+.B \-R
+option.
+.
+When a
+.B .R1
+line is recognized any accumulated references are flushed out.
+.
+Neither
+.B .R1
+nor
+.B .R2
+lines,
+nor anything between them,
+is output.
+.
+.
+.P
+Commands are separated by newlines or semicolons.
+.
+A number sign
+.RB ( # )
+introduces a comment that extends to the end of the line,
+but does not conceal the newline.
+.
+Each command is broken up into words.
+.
+Words are separated by spaces or tabs.
+.
+A word that begins with a (neutral) double quote
+.RB ( \[dq] )
+extends to the next double quote that is not followed by another double
+quote.
+.
+If there is no such double quote,
+the word extends to the end of the line.
+.
+Pairs of double quotes in a word beginning with a double quote collapse
+to one double quote.
+.
+Neither a number sign nor a semicolon is recognized inside double
+quotes.
+.
+A line can be continued by ending it with a backslash
+.RB \[lq] \[rs] \[rq];
+this works everywhere except after a number sign.
+.
+.
+.LP
+.ds n \fR*\fP\"
+Each command
+.I name
+that is marked with \*n has an associated negative command
+.BI no\- name
+that undoes the effect of
+.IR name .
+.
+For example,
+the
+.B no\-sort
+command specifies that references should not be sorted.
+.
+The negative commands take no arguments.
+.
+.
+.LP
+In the following description each argument must be a single word;
+.I field
+is used for a single upper or lower case letter naming a field;
+.I fields
+is used for a sequence of such letters;
+.I m
+and
+.I n
+are used for a non-negative numbers;
+.I string
+is used for an arbitrary string;
+.I file
+is used for the name of a file.
+.
+.
+.TP
+.BI abbreviate\*n\~ fields\~string1\~string2\~string3\~string4
+Abbreviate the first names of
+.IR fields .
+.
+An initial letter will be separated from another initial letter by
+.IR string1 ,
+from the last name by
+.IR string2 ,
+and from anything else
+(such as \[lq]von\[rq] or \[lq]de\[rq])
+by
+.IR string3 .
+.
+These default to a period followed by a space.
+.
+In a hyphenated first name,
+the initial of the first part of the name will be separated from the
+hyphen by
+.IR string4 ;
+this defaults to a period.
+.
+No attempt is made to handle any ambiguities that might
+result from abbreviation.
+.
+Names are abbreviated before sorting and before label construction.
+.
+.
+.TP
+.BI abbreviate\-label\-ranges\*n\~ string
+.
+Three or more adjacent labels that refer to consecutive references
+will be abbreviated to a label consisting of the first label,
+followed by
+.IR string ,
+followed by the last label.
+.
+This is mainly useful with numeric labels.
+.
+If
+.I string
+is omitted,
+it defaults to
+.RB \[lq] \- \[rq].
+.
+.
+.TP
+.B accumulate\*n
+Accumulate references instead of writing out each reference
+as it is encountered.
+.
+Accumulated references will be written out whenever a reference
+of the form
+.
+.RS
+.RS
+.EX
+.B .[
+.B $LIST$
+.B .]
+.EE
+.RE
+.
+is encountered,
+after all input files have been processed,
+and whenever a
+.B .R1
+line is recognized.
+.RE
+.
+.
+.TP
+.BI annotate\*n\~ "field string"
+.I field
+is an annotation;
+print it at the end of the reference as a paragraph preceded by the line
+.
+.RS
+.IP
+.BI . string
+.
+.
+.LP
+If
+.I string
+is omitted,
+it will default to
+.BR AP ;
+if
+.I field
+is also omitted it will default to
+.BR X .
+.
+Only one field can be an annotation.
+.RE
+.
+.
+.TP
+.BI articles\~ string\~\c
+\&.\|.\|.
+Each
+.I string
+is a definite or indefinite article,
+and should be ignored at the beginning of
+.B T
+fields when sorting.
+.
+Initially,
+\[lq]a\[rq],
+\[lq]an\[rq],
+and
+\[lq]the\[rq] are recognized as articles.
+.
+.
+.TP
+.BI bibliography\~ file\~\c
+\&.\|.\|.
+.
+Write out all the references contained in each bibliographic database
+.IR file .
+.
+This command should come last in an
+.BR .R1 / .R2
+block.
+.
+.
+.TP
+.BI bracket\-label\~ "string1 string2 string3"
+In the text,
+bracket each label with
+.I string1
+and
+.IR string2 .
+.
+An occurrence of
+.I string2
+immediately followed by
+.I string1
+will be turned into
+.IR string3 .
+.
+The default behavior is as follows.
+.
+.RS \" RS twice to get inboard of the tagged paragraph indentation.
+.RS
+.EX
+.B bracket\-label \e*([. \e*(.] \[dq], \[dq]
+.EE
+.RE
+.RE
+.
+.
+.TP
+.BI capitalize\~ fields
+Convert
+.I fields
+to caps and small caps.
+.
+.
+.TP
+.B compatible\*n
+Recognize
+.B .R1
+and
+.B .R2
+even when followed by a character other than space or newline.
+.
+.
+.TP
+.BI database\~ file\~\c
+\&.\|.\|.
+Search each bibliographic database
+.IR file .
+.
+For each
+.IR file ,
+if an index
+.RI file @INDEX_SUFFIX@
+created by
+.MR @g@indxbib @MAN1EXT@
+exists,
+then it will be searched instead;
+each index can cover multiple databases.
+.
+.
+.TP
+.BI date\-as\-label\*n\~ string
+.I string
+is a label expression that specifies a string with which to replace the
+.B D
+field after constructing the label.
+.
+See subsection \[lq]Label expressions\[rq] below for a description of
+label expressions.
+.
+This command is useful if you do not want explicit labels in the
+reference list,
+but instead want to handle any necessary disambiguation by qualifying
+the date in some way.
+.
+The label used in the text would typically be some combination of the
+author and date.
+.
+In most cases you should also use the
+.B \%no\-label\-in\-reference
+command.
+.
+For example,
+.
+.RS \" RS twice to get inboard of the tagged paragraph indentation.
+.RS
+.EX
+.B date\-as\-label D.+yD.y%a*D.\-y
+.EE
+.RE
+.
+would attach a disambiguating letter to the year part of the
+.B D
+field in the reference.
+.RE
+.
+.
+.TP
+.B default\-database\*n
+The default database should be searched.
+.
+This is the default behavior,
+so the negative version of this command is more useful.
+.
+.I @g@refer
+determines whether the default database should be searched
+on the first occasion that it needs to do a search.
+.
+Thus a
+.B \%no\-default\-database
+command must be given before then,
+in order to be effective.
+.
+.
+.TP
+.BI discard\*n\~ fields
+When the reference is read,
+.I fields
+should be discarded;
+no string definitions for
+.I fields
+will be output.
+.
+Initially,
+.I fields
+are
+.BR XYZ .
+.
+.
+.TP
+.BI et\-al\*n\~ "string m n"
+Control use of
+.B et al.\&
+in the evaluation of
+.B @
+expressions in label expressions.
+.
+If the number of authors needed to make the author sequence unambiguous
+is
+.I u
+and the total number of authors is
+.I t
+then the last
+.IR t \|\-\| u
+authors will be replaced by
+.I string
+provided that
+.IR t \|\-\| u
+is not less than
+.I m
+and
+.I t
+is not less than
+.IR n .
+.
+The default behavior is as follows.
+.
+.RS \" RS twice to get inboard of the tagged paragraph indentation.
+.RS
+.EX
+.B et\-al \[dq] et al\[dq] 2 3
+.EE
+.RE
+.
+Note the absence of a dot from the end of the abbreviation,
+which is arguably not correct.
+.
+.RI ( "Et al" [.]
+is short for
+.IR "et alli" ,
+as
+.I etc.\&
+is short for
+.IR "et cetera".)
+.RE
+.
+.
+.TP
+.BI include\~ file
+Include
+.I file
+and interpret the contents as commands.
+.
+.
+.TP
+.BI join\-authors\~ "string1 string2 string3"
+Join multiple authors together with
+.IR string s.
+.
+When there are exactly two authors,
+they will be joined with
+.IR string1 .
+.
+When there are more than two authors,
+all but the last two will be joined with
+.IR string2 ,
+and the last two authors will be joined with
+.IR string3 .
+.
+If
+.I string3
+is omitted,
+it will default to
+.IR string1 ;
+if
+.I string2
+is also omitted it will also default to
+.IR string1 .
+.
+For example,
+.
+.RS
+.RS
+.EX
+join\-authors \[dq] and \[dq] \[dq], \[dq] \[dq], and \[dq]
+.EE
+.RE
+.
+will restore the default method for joining authors.
+.RE
+.
+.
+.TP
+.B label\-in\-reference\*n
+When outputting the reference,
+define the string
+.B [F
+to be the reference's label.
+.
+This is the default behavior,
+so the negative version of this command is more useful.
+.
+.
+.TP
+.B label\-in\-text\*n
+For each reference output a label in the text.
+.
+The label will be separated from the surrounding text as described in
+the
+.B \%bracket\-label
+command.
+.
+This is the default behavior,
+so the negative version of this command is more useful.
+.
+.
+.TP
+.BI label\~ string
+.I string
+is a label expression describing how to label each reference.
+.
+.
+.TP
+.BI separate\-label\-second\-parts\~ string
+When merging two-part labels,
+separate the second part of the second label from the first label with
+.IR string .
+.
+See the description of the
+.B <>
+label expression.
+.
+.
+.TP
+.B move\-punctuation\*n
+In the text,
+move any punctuation at the end of line past the label.
+.
+It is usually a good idea to give this command unless you are using
+superscripted numbers as labels.
+.
+.
+.TP
+.BI reverse\*n\~ string
+Reverse the fields whose names
+are in
+.IR string .
+.
+Each field name can be followed by a number which says how many such
+fields should be reversed.
+.
+If no number is given for a field,
+all such fields will be reversed.
+.
+.
+.TP
+.BI search\-ignore\*n\~ fields
+While searching for keys in databases for which no index exists,
+ignore the contents of
+.IR fields .
+.
+Initially,
+fields
+.B XYZ
+are ignored.
+.
+.
+.TP
+.BI search\-truncate\*n\~ n
+Only require the first
+.I n
+characters of keys to be given.
+.
+In effect when searching for a given key words in the database are
+truncated to the maximum of
+.I n
+and the length of the key.
+.
+Initially,
+.I n
+is\~6.
+.
+.
+.TP
+.BI short\-label\*n\~ string
+.I string
+is a label expression that specifies an alternative
+(usually shorter)
+style of label.
+.
+This is used when the
+.B #
+flag is given in the citation.
+.
+When using author-date style labels,
+the identity of the author or authors is sometimes clear from the
+context,
+and so it may be desirable to omit the author or authors from the label.
+.
+The
+.B \%short\-label
+command will typically be used to specify a label containing just
+a date and possibly a disambiguating letter.
+.
+.
+.TP
+.BI sort\*n\~ string
+Sort references according to
+.IR string .
+.
+References will automatically be accumulated.
+.
+.I string
+should be a list of field names,
+each followed by a number,
+indicating how many fields with the name should be used for sorting.
+.
+.RB \[lq] + \[rq]
+can be used to indicate that all the fields with the name should be
+used.
+.
+Also
+.B .\&
+can be used to indicate the references should be sorted using the
+(tentative) label.
+.
+(Subsection \[lq]Label expressions\[rq] below describes the concept of a
+tentative label.)
+.
+.
+.TP
+.B sort\-adjacent\-labels\*n
+Sort labels that are adjacent in the text according to their position
+in the reference list.
+.
+This command should usually be given if the
+.B \%abbreviate\-label\-ranges
+command has been given,
+or if the label expression contains a
+.B <>
+expression.
+.
+This will have no effect unless references are being accumulated.
+.
+.
+.\" ====================================================================
+.SS "Label expressions"
+.\" ====================================================================
+.
+Label expressions can be evaluated both normally and tentatively.
+.
+The result of normal evaluation is used for output.
+.
+The result of tentative evaluation,
+called the
+.IR "tentative label" ,
+is used to gather the information that normal evaluation needs to
+disambiguate the label.
+.
+Label expressions specified by the
+.B \%date\-as\-label
+and
+.B \%short\-label
+commands are not evaluated tentatively.
+.
+Normal and tentative evaluation are the same for all types of expression
+other than
+.BR @ ,
+.BR * ,
+and
+.B %
+expressions.
+.
+The description below applies to normal evaluation,
+except where otherwise specified.
+.
+.
+.TP
+.I field
+.TQ
+.I field\~n
+The
+.IR n -th
+part of
+.IR field .
+.
+If
+.I n
+is omitted,
+it defaults to\~1.
+.
+.
+.TP
+.BI \[aq] string \[aq]
+The characters in
+.I string
+literally.
+.
+.
+.TP
+.B @
+All the authors joined as specified by the
+.B \%join\-authors
+command.
+.
+The whole of each author's name will be used.
+.
+However,
+if the references are sorted by author
+(that is,
+the sort specification starts with
+.RB \[lq] A+ \[rq]),
+then authors' last names will be used instead,
+provided that this does not introduce ambiguity,
+and also an initial subsequence of the authors may be used instead of
+all the authors,
+again provided that this does not introduce ambiguity.
+.
+The use of only the last name for the
+.IR i -th
+author of some reference
+is considered to be ambiguous if
+there is some other reference,
+such that the first
+.IR i \|\-\|1
+authors of the references are the same,
+the
+.IR i -th
+authors are not the same,
+but the
+.IR i -th
+authors last names are the same.
+.
+A proper initial subsequence of the sequence of authors for some
+reference is considered to be ambiguous if there is a reference with
+some other sequence of authors which also has that subsequence as a
+proper initial subsequence.
+.
+When an initial subsequence of authors is used,
+the remaining authors are replaced by the string specified by the
+.B \%et\-al
+command;
+this command may also specify additional requirements that must be
+met before an initial subsequence can be used.
+.
+.B @
+tentatively evaluates to a canonical representation of the authors,
+such that authors that compare equally for sorting purpose will have
+the same representation.
+.
+.
+.TP
+.BI % n
+.TQ
+.B %a
+.TQ
+.B %A
+.TQ
+.B %i
+.TQ
+.B %I
+The serial number of the reference formatted according to the
+character following the
+.BR % .
+The serial number of a reference is\~1 plus the number of earlier
+references with same tentative label as this reference.
+.
+These expressions tentatively evaluate to an empty string.
+.
+.TP
+.IB expr *
+If there is another reference with the same tentative label as this
+reference,
+then
+.IR expr ,
+otherwise an empty string.
+.
+It tentatively evaluates to an empty string.
+.
+.
+.TP
+.IB expr + n
+.TQ
+.IB expr \- n
+The first
+.RB ( + )
+or last
+.RB ( \- )
+.I n
+upper or lower case letters or digits of
+.IR expr .
+.
+.I roff
+special characters
+(such as
+.BR \e(\[aq]a )
+count as a single letter.
+.
+Accent strings are retained but do not count towards the total.
+.
+.
+.TP
+.IB expr .l
+.I expr
+converted to lowercase.
+.
+.
+.TP
+.IB expr .u
+.I expr
+converted to uppercase.
+.
+.
+.TP
+.IB expr .c
+.I expr
+converted to caps and small caps.
+.
+.
+.TP
+.IB expr .r
+.I expr
+reversed so that the last name is first.
+.
+.
+.TP
+.IB expr .a
+.I expr
+with first names abbreviated.
+.
+Fields specified in the
+.B \%abbreviate
+command are abbreviated before any labels are evaluated.
+.
+Thus
+.B .a
+is useful only when you want a field to be abbreviated in a label
+but not in a reference.
+.
+.
+.TP
+.IB expr .y
+The year part of
+.IR expr .
+.
+.
+.TP
+.IB expr .+y
+The part of
+.I expr
+before the year,
+or the whole of
+.I expr
+if it does not contain a year.
+.
+.
+.TP
+.IB expr .\-y
+The part of
+.I expr
+after the year,
+or an empty string if
+.I expr
+does not contain a year.
+.
+.
+.TP
+.IB expr .n
+The last name part of
+.IR expr .
+.
+.
+.TP
+.IB expr1 \[ti] expr2
+.I expr1
+except that if the last character of
+.I expr1
+is
+.B \-
+then it will be replaced by
+.IR expr2 .
+.
+.
+.TP
+.I expr1 expr2
+The concatenation of
+.I expr1
+and
+.IR expr2 .
+.
+.
+.TP
+.IB expr1 | expr2
+If
+.I expr1
+is non-empty then
+.I expr1
+otherwise
+.IR expr2 .
+.
+.
+.TP
+.IB expr1 & expr2
+If
+.I expr1
+is non-empty
+then
+.I expr2
+otherwise an empty string.
+.
+.
+.TP
+.IB expr1 ? expr2 : expr3
+If
+.I expr1
+is non-empty
+then
+.I expr2
+otherwise
+.IR expr3 .
+.
+.
+.TP
+.BI < expr >
+The label is in two parts,
+which are separated by
+.IR expr .
+.
+Two adjacent two-part labels which have the same first part will be
+merged by appending the second part of the second label onto the first
+label separated by the string specified in the
+.B \%separate\-label\-second\-parts
+command
+(initially,
+a comma followed by a space);
+the resulting label will also be a two-part label with the same first
+part as before merging,
+and so additional labels can be merged into it.
+.
+It is permissible for the first part to be empty;
+this may be desirable for expressions used in the
+.B \%short\-label
+command.
+.
+.
+.TP
+.BI ( expr )
+The same as
+.IR expr .
+.
+Used for grouping.
+.
+.
+.LP
+The above expressions are listed in order of precedence
+(highest first);
+.B &
+and
+.B |
+have the same precedence.
+.
+.
+.\" ====================================================================
+.SS "Macro interface"
+.\" ====================================================================
+.
+Each reference starts with a call to the macro
+.BR ]\- .
+.
+The string
+.B [F
+will be defined to be the label for this reference,
+unless the
+.B \%no\-label\-in\-reference
+command has been given.
+.
+There then follows a series of string definitions,
+one for each field:
+string
+.BI [ X
+corresponds to field
+.IR X .
+.
+The register
+.B [P
+is set to\~1 if the
+.B P
+field contains a range of pages.
+.
+The
+.BR [T ,
+.B [A
+and
+.B [O
+registers are set to\~1 according as the
+.BR T ,
+.B A
+and
+.B O
+fields end with any of
+.B .?!\&
+(an end-of-sentence character).
+.
+The
+.B [E
+register will be set to\~1 if the
+.B [E
+string contains more than one name.
+.
+The reference is followed by a call to the
+.B ][
+macro.
+.
+The first argument to this macro gives a number representing
+the type of the reference.
+.
+If a reference contains a
+.B J
+field,
+it will be classified as type\~1,
+otherwise if it contains a
+.B B
+field,
+it will be type\~3,
+otherwise if it contains a
+.B G
+or
+.B R
+field it will be type\~4,
+otherwise if it contains an
+.B I
+field it will be type\~2,
+otherwise it will be type\~0.
+.
+The second argument is a symbolic name for the type:
+.BR other ,
+.BR \%journal\-article ,
+.BR book ,
+.BR \%article\-in\-book ,
+or
+.BR \%tech\-report .
+.
+Groups of references that have been accumulated or are produced by the
+.B \%bibliography
+command are preceded by a call to the
+.B ]<
+macro and followed by a call to the
+.B ]>
+macro.
+.
+.
+.br
+.ne 4v
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.B \-R
+Don't recognize lines beginning with
+.BR .R1 / .R2 .
+.
+.
+.P
+Other options are equivalent to
+.I @g@refer
+commands.
+.
+.
+.TP 16n
+.BI \-a\~ n
+.B reverse
+.BI A n
+.
+.
+.TP
+.B \-b
+.B "\%no\-label\-in\-text; \%no\-label\-in\-reference"
+.
+.
+.TP
+.B \-B
+See below.
+.
+.
+.TP
+.BI \-c\~ fields
+.B capitalize
+.I fields
+.
+.
+.TP
+.B \-C
+.B compatible
+.
+.
+.TP
+.B \-e
+.B accumulate
+.
+.
+.TP
+.BI \-f\~ n
+.B \%label
+.BI % n
+.
+.
+.TP
+.BI \-i\~ fields
+.B search\-ignore
+.I fields
+.
+.
+.TP
+.B \-k
+.B \%label
+.B L\[ti]%a
+.
+.
+.TP
+.BI \-k\~ field
+.B \%label
+.IB field \[ti]%a
+.
+.
+.TP
+.B \-l
+.B \%label
+.B A.nD.y%a
+.
+.
+.TP
+.BI \-l\~ m
+.B \%label
+.BI A.n+ m D.y%a
+.
+.
+.TP
+.BI \-l\~, n
+.B \%label
+.BI A.nD.y\- n %a
+.
+.
+.TP
+.BI \-l\~ m , n
+.B \%label
+.BI A.n+ m D.y\- n %a
+.
+.
+.TP
+.B \-n
+.B \%no\-default\-database
+.
+.
+.TP
+.BI \-p\~ db-file
+.B database
+.I db-file
+.
+.
+.TP
+.B \-P
+.B move\-punctuation
+.
+.
+.TP
+.BI \-s\~ spec
+.B sort
+.I spec
+.
+.
+.TP
+.B \-S
+.B \%label \[dq](A.n|Q) \[aq], \[aq] (D.y|D)\[dq]; \
+\%bracket-\%label \[dq]\~(\[dq]\~)\~\[dq];\~\[dq]
+.
+.
+.TP
+.BI \-t\~ n
+.B search\-truncate
+.I n
+.
+.
+.P
+The
+.B B
+option has command equivalents with the addition that the file names
+specified on the command line are processed as if they were arguments to
+the
+.B \%bibliography
+command instead of in the normal way.
+.
+.
+.TP 16n
+.B \-B
+.B "annotate X AP; \%no\-label\-in\-reference"
+.
+.
+.TP
+.BI \-B\~ field . macro
+.B annotate
+.I field
+.IB macro ;
+.B \%no\-label\-in\-reference
+.
+.
+.\" ====================================================================
+.SH Environment
+.\" ====================================================================
+.
+.TP
+.I REFER
+If set,
+overrides the default database.
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @DEFAULT_INDEX@
+Default database.
+.
+.
+.TP
+.RI file @INDEX_SUFFIX@
+Index files.
+.
+.
+.TP
+.I @MACRODIR@/\:refer\:.tmac
+defines macros and strings facilitating integration with macro packages
+that wish to support
+.IR @g@refer .
+.
+.
+.LP
+.I @g@refer
+uses temporary files.
+.
+See the
+.MR groff @MAN1EXT@
+man page for details of where such files are created.
+.
+.
+.\" ====================================================================
+.SH Bugs
+.\" ====================================================================
+.
+In label expressions,
+.B <>
+expressions are ignored inside
+.BI . char
+expressions.
+.
+.
+.\" ====================================================================
+.SH Examples
+.\" ====================================================================
+.
+We can illustrate the operation of
+.I @g@refer
+with a sample bibliographic database containing one entry and a simple
+.I roff
+document to cite that entry.
+.
+.
+.P
+.RS
+.EX
+$ \c
+.B cat > my\-db\-file
+.B %A Daniel P.\[rs]& Friedman
+.B %A Matthias Felleisen
+.B %C Cambridge, Massachusetts
+.B %D 1996
+.B %I The MIT Press
+.B %T The Little Schemer, Fourth Edition
+$ \c
+.B refer -p my\-db\-file
+.B Read the book
+.B .[
+.B friedman
+.B .]
+.B on your summer vacation.
+.I <Control+D>
+\&.lf 1 \-
+Read the book\[rs]*([.1\[rs]*(.]
+\&.ds [F 1
+\&.]\-
+\&.ds [A Daniel P. Friedman and Matthias Felleisen
+\&.ds [C Cambridge, Massachusetts
+\&.ds [D 1996
+\&.ds [I The MIT Press
+\&.ds [T The Little Schemer, Fourth Edition
+\&.nr [T 0
+\&.nr [A 0
+\&.][ 2 book
+\&.lf 5 \-
+on your summer vacation.
+.EE
+.RE
+.
+.
+.P
+The foregoing shows us that
+.I @g@refer
+(a) produces a label \[lq]1\[rq];
+(b) brackets that label with interpolations of the
+.RB \[lq] [. \[rq]
+and
+.RB \[lq] .] \[rq]
+strings;
+(c) calls a macro
+.RB \[lq] ]\- \[rq];
+(d) defines strings and registers containing the label and bibliographic
+data for the reference;
+(e) calls a macro
+.RB \[lq] ][ \[rq];
+and (f) uses the
+.B lf
+request to restore the line numbers of the original input.
+.
+As discussed in subsection \[lq]Macro interface\[rq] above,
+it is up to the document or a macro package to employ and format this
+information usefully.
+.
+Let us see how we might turn
+.MR groff_ms @MAN7EXT@
+to this task.
+.
+.
+.P
+.RS
+.EX
+$ \c
+.B REFER=my\-db\-file groff \-R \-ms
+.B .LP
+.B Read the book
+.B .[
+.B friedman
+.B .]
+.B on your summer vacation.
+.B Commentary is available.\[rs]*{*\[rs]*}
+.B .FS \[rs]*{*\[rs]*}
+.B Space reserved for penetrating insight.
+.B .FE
+.EE
+.RE
+.
+.
+.LP
+.IR ms 's
+automatic footnote numbering mechanism is not aware of
+.IR @g@refer 's
+label numbering,
+so we have manually specified a (superscripted) symbolic footnote for
+our non-bibliographic aside.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+\[lq]Some Applications of Inverted Indexes on the Unix System\[rq],
+by M.\& E.\& Lesk,
+1978,
+AT&T Bell Laboratories Computing Science Technical Report No.\& 69.
+.
+.
+.LP
+.MR @g@indxbib @MAN1EXT@ ,
+.MR @g@lookbib @MAN1EXT@ ,
+.MR lkbib @MAN1EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_refer_1_man_C]
+.do rr *groff_refer_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/preproc/refer/refer.am b/src/preproc/refer/refer.am
new file mode 100644
index 0000000..273f334
--- /dev/null
+++ b/src/preproc/refer/refer.am
@@ -0,0 +1,61 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+prefixexecbin_PROGRAMS += refer
+refer_CPPFLAGS = $(AM_CPPFLAGS) -I $(top_srcdir)/src/preproc/refer
+refer_LDADD = libbib.a libgroff.a $(LIBM) lib/libgnu.a
+refer_SOURCES = \
+ src/preproc/refer/command.cpp \
+ src/preproc/refer/ref.cpp \
+ src/preproc/refer/refer.cpp \
+ src/preproc/refer/token.cpp \
+ src/preproc/refer/label.ypp \
+ src/preproc/refer/refer.h \
+ src/preproc/refer/ref.h \
+ src/preproc/refer/token.h \
+ src/preproc/refer/command.h
+
+PREFIXMAN1 += src/preproc/refer/refer.1
+EXTRA_DIST += \
+ src/preproc/refer/TODO \
+ src/preproc/refer/refer.1.man
+
+# Since refer_CPPFLAGS was set, all .o files have a 'refer-' prefix.
+src/preproc/refer/refer-command.$(OBJEXT): defs.h
+src/preproc/refer/refer-ref.$(OBJEXT): defs.h
+src/preproc/refer/refer-refer.$(OBJEXT): defs.h
+src/preproc/refer/refer-token.$(OBJEXT): defs.h
+src/preproc/refer/refer-label.$(OBJEXT): defs.h
+
+MAINTAINERCLEANFILES += \
+ src/preproc/refer/label.cpp \
+ src/preproc/refer/label.hpp \
+ src/preproc/refer/label.output
+
+refer_TESTS = \
+ src/preproc/refer/tests/report-correct-line-numbers.sh
+TESTS += $(refer_TESTS)
+EXTRA_DIST += \
+ $(refer_TESTS) \
+ src/preproc/refer/tests/artifacts/62124.bib
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/preproc/refer/refer.cpp b/src/preproc/refer/refer.cpp
new file mode 100644
index 0000000..a5c291e
--- /dev/null
+++ b/src/preproc/refer/refer.cpp
@@ -0,0 +1,1267 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "refer.h"
+#include "refid.h"
+#include "ref.h"
+#include "token.h"
+#include "search.h"
+#include "command.h"
+
+extern "C" const char *Version_string;
+
+const char PRE_LABEL_MARKER = '\013';
+const char POST_LABEL_MARKER = '\014';
+const char LABEL_MARKER = '\015'; // label_type is added on
+
+#define FORCE_LEFT_BRACKET 04
+#define FORCE_RIGHT_BRACKET 010
+
+static FILE *outfp = stdout;
+
+string capitalize_fields;
+string reverse_fields;
+string abbreviate_fields;
+string period_before_last_name = ". ";
+string period_before_initial = ".";
+string period_before_hyphen = "";
+string period_before_other = ". ";
+string sort_fields;
+int annotation_field = -1;
+string annotation_macro;
+string discard_fields = "XYZ";
+string pre_label = "\\*([.";
+string post_label = "\\*(.]";
+string sep_label = ", ";
+int have_bibliography = 0;
+int accumulate = 0;
+int move_punctuation = 0;
+int abbreviate_label_ranges = 0;
+string label_range_indicator;
+int label_in_text = 1;
+int label_in_reference = 1;
+int date_as_label = 0;
+int sort_adjacent_labels = 0;
+// Join exactly two authors with this.
+string join_authors_exactly_two = " and ";
+// When there are more than two authors join the last two with this.
+string join_authors_last_two = ", and ";
+// Otherwise join authors with this.
+string join_authors_default = ", ";
+string separate_label_second_parts = ", ";
+// Use this string to represent that there are other authors.
+string et_al = " et al";
+// Use et al only if it can replace at least this many authors.
+int et_al_min_elide = 2;
+// Use et al only if the total number of authors is at least this.
+int et_al_min_total = 3;
+
+
+int compatible_flag = 0;
+
+int short_label_flag = 0;
+
+static bool recognize_R1_R2 = true;
+
+search_list database_list;
+int search_default = 1;
+static int default_database_loaded = 0;
+
+static reference **citation = 0;
+static int ncitations = 0;
+static int citation_max = 0;
+
+static reference **reference_hash_table = 0;
+static int hash_table_size;
+static int nreferences = 0;
+
+static int need_syncing = 0;
+string pending_line;
+string pending_lf_lines;
+
+static void output_pending_line();
+static unsigned immediately_handle_reference(const string &);
+static void immediately_output_references();
+static unsigned store_reference(const string &);
+static void divert_to_temporary_file();
+static reference *make_reference(const string &, unsigned *);
+static void usage(FILE *stream);
+static void do_file(const char *);
+static void split_punct(string &line, string &punct);
+static void output_citation_group(reference **v, int n, label_type,
+ FILE *fp);
+static void possibly_load_default_database();
+
+int main(int argc, char **argv)
+{
+ program_name = argv[0];
+ static char stderr_buf[BUFSIZ];
+ setbuf(stderr, stderr_buf);
+ outfp = stdout;
+ int finished_options = 0;
+ int bib_flag = 0;
+ int done_spec = 0;
+
+ // TODO: Migrate to getopt_long; see, e.g., src/preproc/eqn/main.cpp.
+ for (--argc, ++argv;
+ !finished_options && argc > 0 && argv[0][0] == '-'
+ && argv[0][1] != '\0';
+ argv++, argc--) {
+ const char *opt = argv[0] + 1;
+ while (opt != 0 && *opt != '\0') {
+ switch (*opt) {
+ case 'C':
+ compatible_flag = 1;
+ opt++;
+ break;
+ case 'B':
+ bib_flag = 1;
+ label_in_reference = 0;
+ label_in_text = 0;
+ ++opt;
+ if (*opt == '\0') {
+ annotation_field = 'X';
+ annotation_macro = "AP";
+ }
+ else if (csalnum(opt[0]) && opt[1] == '.' && opt[2] != '\0') {
+ annotation_field = opt[0];
+ annotation_macro = opt + 2;
+ }
+ opt = 0;
+ break;
+ case 'P':
+ move_punctuation = 1;
+ opt++;
+ break;
+ case 'R':
+ recognize_R1_R2 = false;
+ opt++;
+ break;
+ case 'S':
+ // Not a very useful spec.
+ set_label_spec("(A.n|Q)', '(D.y|D)");
+ done_spec = 1;
+ pre_label = " (";
+ post_label = ")";
+ sep_label = "; ";
+ opt++;
+ break;
+ case 'V':
+ do_verify = true;
+ opt++;
+ break;
+ case 'f':
+ {
+ const char *num = 0;
+ if (*++opt == '\0') {
+ if (argc > 1) {
+ num = *++argv;
+ --argc;
+ }
+ else {
+ error("'f' option requires an argument");
+ usage(stderr);
+ exit(1);
+ }
+ }
+ else {
+ num = opt;
+ opt = 0;
+ }
+ const char *ptr;
+ for (ptr = num; *ptr; ptr++)
+ if (!csdigit(*ptr)) {
+ error("invalid character '%1' in argument to 'f' option",
+ *ptr);
+ break;
+ }
+ if (*ptr == '\0') {
+ string spec;
+ spec = '%';
+ spec += num;
+ spec += '\0';
+ set_label_spec(spec.contents());
+ done_spec = 1;
+ }
+ break;
+ }
+ case 'b':
+ label_in_text = 0;
+ label_in_reference = 0;
+ opt++;
+ break;
+ case 'e':
+ accumulate = 1;
+ opt++;
+ break;
+ case 'c':
+ capitalize_fields = ++opt;
+ opt = 0;
+ break;
+ case 'k':
+ {
+ char buf[5];
+ if (csalpha(*++opt))
+ buf[0] = *opt++;
+ else {
+ if (*opt != '\0')
+ error("invalid field name '%1' in argument to 'k' option",
+ *opt++);
+ buf[0] = 'L';
+ }
+ buf[1] = '~';
+ buf[2] = '%';
+ buf[3] = 'a';
+ buf[4] = '\0';
+ set_label_spec(buf);
+ done_spec = 1;
+ }
+ break;
+ case 'a':
+ {
+ const char *ptr;
+ for (ptr = ++opt; *ptr; ptr++)
+ if (!csdigit(*ptr)) {
+ error("'a' option argument must be an integer");
+ break;
+ }
+ if (*ptr == '\0') {
+ reverse_fields = 'A';
+ reverse_fields += opt;
+ }
+ opt = 0;
+ }
+ break;
+ case 'i':
+ linear_ignore_fields = ++opt;
+ opt = 0;
+ break;
+ case 'l':
+ {
+ char buf[INT_DIGITS*2 + 11]; // A.n+2D.y-3%a
+ strcpy(buf, "A.n");
+ if (*++opt != '\0' && *opt != ',') {
+ char *ptr;
+ long n = strtol(opt, &ptr, 10);
+ if (n == 0 && ptr == opt) {
+ error("invalid integer '%1' in 'l' option argument", opt);
+ opt = 0;
+ break;
+ }
+ if (n < 0)
+ n = 0;
+ opt = ptr;
+ sprintf(strchr(buf, '\0'), "+%ld", n);
+ }
+ strcat(buf, "D.y");
+ if (*opt == ',')
+ opt++;
+ if (*opt != '\0') {
+ char *ptr;
+ long n = strtol(opt, &ptr, 10);
+ if (n == 0 && ptr == opt) {
+ error("invalid integer '%1' in 'l' option argument", opt);
+ opt = 0;
+ break;
+ }
+ if (n < 0)
+ n = 0;
+ sprintf(strchr(buf, '\0'), "-%ld", n);
+ opt = ptr;
+ if (*opt != '\0')
+ error("argument to 'l' option not of form 'm,n'");
+ }
+ strcat(buf, "%a");
+ if (!set_label_spec(buf))
+ assert(0 == "set_label_spec() failed");
+ done_spec = 1;
+ }
+ break;
+ case 'n':
+ search_default = 0;
+ opt++;
+ break;
+ case 'p':
+ {
+ const char *filename = 0;
+ if (*++opt == '\0') {
+ if (argc > 1) {
+ filename = *++argv;
+ argc--;
+ }
+ else {
+ error("option 'p' requires an argument");
+ usage(stderr);
+ exit(1);
+ }
+ }
+ else {
+ filename = opt;
+ opt = 0;
+ }
+ database_list.add_file(filename);
+ }
+ break;
+ case 's':
+ if (*++opt == '\0')
+ sort_fields = "AD";
+ else {
+ sort_fields = opt;
+ opt = 0;
+ }
+ accumulate = 1;
+ break;
+ case 't':
+ {
+ char *ptr;
+ long n = strtol(opt, &ptr, 10);
+ if (n == 0 && ptr == opt) {
+ error("invalid integer '%1' in 't' option argument", opt);
+ opt = 0;
+ break;
+ }
+ if (n < 1)
+ n = 1;
+ linear_truncate_len = int(n);
+ opt = ptr;
+ break;
+ }
+ case '-':
+ if (opt[1] == '\0') {
+ finished_options = 1;
+ opt++;
+ break;
+ }
+ if (strcmp(opt, "-version") == 0) {
+ case 'v':
+ printf("GNU refer (groff) version %s\n", Version_string);
+ exit(0);
+ break;
+ }
+ if (strcmp(opt, "-help") == 0) {
+ usage(stdout);
+ exit(0);
+ break;
+ }
+ // fall through
+ default:
+ error("unrecognized option '%1'", opt);
+ usage(stderr);
+ exit(1);
+ break;
+ }
+ }
+ }
+ if (!done_spec)
+ set_label_spec("%1");
+ if (argc <= 0) {
+ if (bib_flag)
+ do_bib("-");
+ else
+ do_file("-");
+ }
+ else {
+ for (int i = 0; i < argc; i++) {
+ if (bib_flag)
+ do_bib(argv[i]);
+ else
+ do_file(argv[i]);
+ }
+ }
+ if (accumulate)
+ output_references();
+ if (fflush(stdout) < 0)
+ fatal("output error: %1", strerror(errno));
+ return 0;
+}
+
+static void usage(FILE *stream)
+{
+ fprintf(stream,
+"usage: %s [-bCenPRS] [-aN] [-cXYZ] [-fN] [-iXYZ] [-kX] [-lM,N]"
+" [-p db-file] [-sXYZ] [-tN] [-Bl.m] [file ...]\n"
+"usage: %s {-v | --version}\n"
+"usage: %s --help\n",
+ program_name, program_name, program_name);
+}
+
+static void possibly_load_default_database()
+{
+ if (search_default && !default_database_loaded) {
+ char *filename = getenv("REFER");
+ if (filename)
+ database_list.add_file(filename);
+ else
+ database_list.add_file(DEFAULT_INDEX, 1);
+ default_database_loaded = 1;
+ }
+}
+
+static bool is_list(const string &str)
+{
+ const char *start = str.contents();
+ const char *end = start + str.length();
+ while (end > start && csspace(end[-1]))
+ end--;
+ while (start < end && csspace(*start))
+ start++;
+ return end - start == 6 && memcmp(start, "$LIST$", 6) == 0;
+}
+
+static void do_file(const char *filename)
+{
+ FILE *fp;
+ if (strcmp(filename, "-") == 0) {
+ fp = stdin;
+ }
+ else {
+ errno = 0;
+ fp = fopen(filename, "r");
+ if (fp == 0) {
+ error("can't open '%1': %2", filename, strerror(errno));
+ return;
+ }
+ }
+ string fn(filename);
+ fn += '\0';
+ normalize_for_lf(fn);
+ current_filename = fn.contents();
+ fprintf(outfp, ".lf 1 %s\n", current_filename);
+ current_lineno = 1;
+ string line;
+ for (;;) {
+ line.clear();
+ for (;;) {
+ int c = getc(fp);
+ if (EOF == c) {
+ if (line.length() > 0)
+ line += '\n';
+ break;
+ }
+ if (is_invalid_input_char(c))
+ error("invalid input character code %1", c);
+ else {
+ line += c;
+ if ('\n' == c)
+ break;
+ }
+ }
+ int len = line.length();
+ if (len == 0)
+ break;
+ current_lineno++;
+ if (len >= 2 && line[0] == '.' && line[1] == '[') {
+ int start_lineno = current_lineno;
+ bool at_start_of_line = true;
+ string str;
+ string post;
+ string pre(line.contents() + 2, line.length() - 3);
+ for (;;) {
+ int c = getc(fp);
+ if (EOF == c) {
+ error_with_file_and_line(current_filename, start_lineno,
+ "missing '.]' line");
+ break;
+ }
+ if (at_start_of_line)
+ current_lineno++;
+ if (at_start_of_line && '.' == c) {
+ int d = getc(fp);
+ if (d == ']') {
+ while ((d = getc(fp)) != '\n' && d != EOF) {
+ if (is_invalid_input_char(d))
+ error("invalid input character code %1", d);
+ else
+ post += d;
+ }
+ break;
+ }
+ if (d != EOF)
+ ungetc(d, fp);
+ }
+ if (is_invalid_input_char(c))
+ error("invalid input character code %1", c);
+ else
+ str += c;
+ at_start_of_line = ('\n' == c);
+ }
+ if (is_list(str)) {
+ output_pending_line();
+ if (accumulate)
+ output_references();
+ else
+ error("found '$LIST$' but not accumulating references");
+ }
+ else {
+ unsigned flags = (accumulate
+ ? store_reference(str)
+ : immediately_handle_reference(str));
+ if (label_in_text) {
+ if (accumulate && outfp == stdout)
+ divert_to_temporary_file();
+ if (pending_line.length() == 0) {
+ warning("can't attach citation to previous line");
+ }
+ else
+ pending_line.set_length(pending_line.length() - 1);
+ string punct;
+ if (move_punctuation)
+ split_punct(pending_line, punct);
+ int have_text = pre.length() > 0 || post.length() > 0;
+ label_type lt = label_type(flags & ~(FORCE_LEFT_BRACKET
+ |FORCE_RIGHT_BRACKET));
+ if ((flags & FORCE_LEFT_BRACKET) || !have_text)
+ pending_line += PRE_LABEL_MARKER;
+ pending_line += pre;
+ char lm = LABEL_MARKER + (int)lt;
+ pending_line += lm;
+ pending_line += post;
+ if ((flags & FORCE_RIGHT_BRACKET) || !have_text)
+ pending_line += POST_LABEL_MARKER;
+ pending_line += punct;
+ pending_line += '\n';
+ }
+ }
+ need_syncing = 1;
+ }
+ else if (len >= 4
+ && '.' == line[0] && 'l' == line[1] && 'f' == line[2]
+ && (compatible_flag || '\n' == line[3] || ' ' == line[3]))
+ {
+ pending_lf_lines += line;
+ line += '\0';
+ if (interpret_lf_args(line.contents() + 3))
+ current_lineno--;
+ }
+ else if (recognize_R1_R2
+ && len >= 4
+ && '.' == line[0] && 'R' == line[1] && '1' == line[2]
+ && (compatible_flag || '\n' == line[3] || ' ' == line[3]))
+ {
+ line.clear();
+ int start_lineno = current_lineno;
+ bool at_start_of_line = true;
+ for (;;) {
+ int c = getc(fp);
+ if (c != EOF && at_start_of_line)
+ current_lineno++;
+ if (at_start_of_line && '.' == c) {
+ c = getc(fp);
+ if ('R' == c) {
+ c = getc(fp);
+ if ('2' == c) {
+ c = getc(fp);
+ if (compatible_flag || ' ' == c || '\n' == c || EOF == c)
+ {
+ while (c != EOF && c != '\n')
+ c = getc(fp);
+ break;
+ }
+ else {
+ line += '.';
+ line += 'R';
+ line += '2';
+ }
+ }
+ else {
+ line += '.';
+ line += 'R';
+ }
+ }
+ else
+ line += '.';
+ }
+ if (EOF == c) {
+ error_with_file_and_line(current_filename, start_lineno,
+ "missing '.R2' line");
+ break;
+ }
+ if (is_invalid_input_char(c))
+ error_with_file_and_line(current_filename, start_lineno,
+ "invalid input character code %1",
+ c);
+ else {
+ line += c;
+ at_start_of_line = ('\n' == c);
+ }
+ }
+ output_pending_line();
+ if (accumulate)
+ output_references();
+ else
+ nreferences = 0;
+ process_commands(line, current_filename, start_lineno + 1);
+ need_syncing = 1;
+ }
+ else {
+ output_pending_line();
+ pending_line = line;
+ }
+ }
+ need_syncing = 0;
+ output_pending_line();
+ if (fp != stdin)
+ fclose(fp);
+}
+
+class label_processing_state {
+ enum {
+ NORMAL,
+ PENDING_LABEL,
+ PENDING_LABEL_POST,
+ PENDING_LABEL_POST_PRE,
+ PENDING_POST
+ } state;
+ label_type type; // type of pending labels
+ int count; // number of pending labels
+ reference **rptr; // pointer to next reference
+ int rcount; // number of references left
+ FILE *fp;
+ int handle_pending(int c);
+public:
+ label_processing_state(reference **, int, FILE *);
+ ~label_processing_state();
+ void process(int c);
+};
+
+static void output_pending_line()
+{
+ if (label_in_text && !accumulate && ncitations > 0) {
+ label_processing_state state(citation, ncitations, outfp);
+ int len = pending_line.length();
+ for (int i = 0; i < len; i++)
+ state.process((unsigned char)(pending_line[i]));
+ }
+ else
+ put_string(pending_line, outfp);
+ pending_line.clear();
+ if (pending_lf_lines.length() > 0) {
+ put_string(pending_lf_lines, outfp);
+ pending_lf_lines.clear();
+ }
+ if (!accumulate)
+ immediately_output_references();
+ if (need_syncing) {
+ fprintf(outfp, ".lf %d %s\n", current_lineno, current_filename);
+ need_syncing = 0;
+ }
+}
+
+static void split_punct(string &line, string &punct)
+{
+ const char *start = line.contents();
+ const char *end = start + line.length();
+ const char *ptr = start;
+ const char *last_token_start = 0;
+ for (;;) {
+ if (ptr >= end)
+ break;
+ last_token_start = ptr;
+ if (*ptr == PRE_LABEL_MARKER || *ptr == POST_LABEL_MARKER
+ || (*ptr >= LABEL_MARKER
+ && *ptr < LABEL_MARKER + N_LABEL_TYPES))
+ ptr++;
+ else if (!get_token(&ptr, end))
+ break;
+ }
+ if (last_token_start) {
+ const token_info *ti = lookup_token(last_token_start, end);
+ if (ti->is_punct()) {
+ punct.append(last_token_start, end - last_token_start);
+ line.set_length(last_token_start - start);
+ }
+ }
+}
+
+static void divert_to_temporary_file()
+{
+ outfp = xtmpfile();
+}
+
+static void store_citation(reference *ref)
+{
+ if (ncitations >= citation_max) {
+ if (citation == 0)
+ citation = new reference*[citation_max = 100];
+ else {
+ reference **old_citation = citation;
+ citation_max *= 2;
+ citation = new reference *[citation_max];
+ memcpy(citation, old_citation, ncitations*sizeof(reference *));
+ delete[] old_citation;
+ }
+ }
+ citation[ncitations++] = ref;
+}
+
+static unsigned store_reference(const string &str)
+{
+ if (reference_hash_table == 0) {
+ reference_hash_table = new reference *[17];
+ hash_table_size = 17;
+ for (int i = 0; i < hash_table_size; i++)
+ reference_hash_table[i] = 0;
+ }
+ unsigned flags;
+ reference *ref = make_reference(str, &flags);
+ ref->compute_hash_code();
+ unsigned h = ref->hash();
+ reference **ptr;
+ for (ptr = reference_hash_table + (h % hash_table_size);
+ *ptr != 0;
+ ((ptr == reference_hash_table)
+ ? (ptr = reference_hash_table + hash_table_size - 1)
+ : --ptr))
+ if (same_reference(**ptr, *ref))
+ break;
+ if (*ptr != 0) {
+ if (ref->is_merged())
+ warning("fields ignored because reference already used");
+ delete ref;
+ ref = *ptr;
+ }
+ else {
+ *ptr = ref;
+ ref->set_number(nreferences);
+ nreferences++;
+ ref->pre_compute_label();
+ ref->compute_sort_key();
+ if (nreferences*2 >= hash_table_size) {
+ // Rehash it.
+ reference **old_table = reference_hash_table;
+ int old_size = hash_table_size;
+ hash_table_size = next_size(hash_table_size);
+ reference_hash_table = new reference*[hash_table_size];
+ int i;
+ for (i = 0; i < hash_table_size; i++)
+ reference_hash_table[i] = 0;
+ for (i = 0; i < old_size; i++)
+ if (old_table[i]) {
+ reference **p;
+ for (p = (reference_hash_table
+ + (old_table[i]->hash() % hash_table_size));
+ *p;
+ ((p == reference_hash_table)
+ ? (p = reference_hash_table + hash_table_size - 1)
+ : --p))
+ ;
+ *p = old_table[i];
+ }
+ delete[] old_table;
+ }
+ }
+ if (label_in_text)
+ store_citation(ref);
+ return flags;
+}
+
+unsigned immediately_handle_reference(const string &str)
+{
+ unsigned flags;
+ reference *ref = make_reference(str, &flags);
+ ref->set_number(nreferences);
+ if (label_in_text || label_in_reference) {
+ ref->pre_compute_label();
+ ref->immediate_compute_label();
+ }
+ nreferences++;
+ store_citation(ref);
+ return flags;
+}
+
+static void immediately_output_references()
+{
+ for (int i = 0; i < ncitations; i++) {
+ reference *ref = citation[i];
+ if (label_in_reference) {
+ fputs(".ds [F ", outfp);
+ const string &label = ref->get_label(NORMAL_LABEL);
+ if (label.length() > 0
+ && (label[0] == ' ' || label[0] == '\\' || label[0] == '"'))
+ putc('"', outfp);
+ put_string(label, outfp);
+ putc('\n', outfp);
+ }
+ ref->output(outfp);
+ delete ref;
+ }
+ ncitations = 0;
+}
+
+static void output_citation_group(reference **v, int n, label_type type,
+ FILE *fp)
+{
+ if (sort_adjacent_labels) {
+ // Do an insertion sort. Usually n will be very small.
+ for (int i = 1; i < n; i++) {
+ int num = v[i]->get_number();
+ reference *temp = v[i];
+ int j;
+ for (j = i - 1; j >= 0 && v[j]->get_number() > num; j--)
+ v[j + 1] = v[j];
+ v[j + 1] = temp;
+ }
+ }
+ // This messes up if !accumulate.
+ if (accumulate && n > 1) {
+ // remove duplicates
+ int j = 1;
+ for (int i = 1; i < n; i++)
+ if (v[i]->get_label(type) != v[i - 1]->get_label(type))
+ v[j++] = v[i];
+ n = j;
+ }
+ string merged_label;
+ for (int i = 0; i < n; i++) {
+ int nmerged = v[i]->merge_labels(v + i + 1, n - i - 1, type,
+ merged_label);
+ if (nmerged > 0) {
+ put_string(merged_label, fp);
+ i += nmerged;
+ }
+ else
+ put_string(v[i]->get_label(type), fp);
+ if (i < n - 1)
+ put_string(sep_label, fp);
+ }
+}
+
+
+label_processing_state::label_processing_state(reference **p, int n,
+ FILE *f)
+: state(NORMAL), count(0), rptr(p), rcount(n), fp(f)
+{
+}
+
+label_processing_state::~label_processing_state()
+{
+ int handled = handle_pending(EOF);
+ assert(!handled);
+ assert(rcount == 0);
+}
+
+int label_processing_state::handle_pending(int c)
+{
+ switch (state) {
+ case NORMAL:
+ break;
+ case PENDING_LABEL:
+ if (POST_LABEL_MARKER == c) {
+ state = PENDING_LABEL_POST;
+ return 1;
+ }
+ else {
+ output_citation_group(rptr, count, type, fp);
+ rptr += count ;
+ rcount -= count;
+ state = NORMAL;
+ }
+ break;
+ case PENDING_LABEL_POST:
+ if (PRE_LABEL_MARKER == c) {
+ state = PENDING_LABEL_POST_PRE;
+ return 1;
+ }
+ else {
+ output_citation_group(rptr, count, type, fp);
+ rptr += count;
+ rcount -= count;
+ put_string(post_label, fp);
+ state = NORMAL;
+ }
+ break;
+ case PENDING_LABEL_POST_PRE:
+ if (c >= LABEL_MARKER
+ && c < LABEL_MARKER + N_LABEL_TYPES
+ && c - LABEL_MARKER == type) {
+ count += 1;
+ state = PENDING_LABEL;
+ return 1;
+ }
+ else {
+ output_citation_group(rptr, count, type, fp);
+ rptr += count;
+ rcount -= count;
+ put_string(sep_label, fp);
+ state = NORMAL;
+ }
+ break;
+ case PENDING_POST:
+ if (PRE_LABEL_MARKER == c) {
+ put_string(sep_label, fp);
+ state = NORMAL;
+ return 1;
+ }
+ else {
+ put_string(post_label, fp);
+ state = NORMAL;
+ }
+ break;
+ }
+ return 0;
+}
+
+void label_processing_state::process(int c)
+{
+ if (handle_pending(c))
+ return;
+ assert(state == NORMAL);
+ switch (c) {
+ case PRE_LABEL_MARKER:
+ put_string(pre_label, fp);
+ state = NORMAL;
+ break;
+ case POST_LABEL_MARKER:
+ state = PENDING_POST;
+ break;
+ case LABEL_MARKER:
+ case LABEL_MARKER + 1:
+ count = 1;
+ state = PENDING_LABEL;
+ type = label_type(c - LABEL_MARKER);
+ break;
+ default:
+ state = NORMAL;
+ putc(c, fp);
+ break;
+ }
+}
+
+extern "C" {
+
+int rcompare(const void *p1, const void *p2)
+{
+ return compare_reference(**(reference **)p1, **(reference **)p2);
+}
+
+}
+
+void output_references()
+{
+ assert(accumulate);
+ if (!hash_table_size) {
+ if (have_bibliography)
+ error("nothing to reference (probably 'bibliography' before"
+ " 'sort')");
+ accumulate = 0;
+ nreferences = 0;
+ return;
+ }
+ if (nreferences > 0) {
+ int j = 0;
+ int i;
+ for (i = 0; i < hash_table_size; i++)
+ if (reference_hash_table[i] != 0)
+ reference_hash_table[j++] = reference_hash_table[i];
+ assert(j == nreferences);
+ for (; j < hash_table_size; j++)
+ reference_hash_table[j] = 0;
+ qsort(reference_hash_table, nreferences, sizeof(reference*),
+ rcompare);
+ for (i = 0; i < nreferences; i++)
+ reference_hash_table[i]->set_number(i);
+ compute_labels(reference_hash_table, nreferences);
+ }
+ if (outfp != stdout) {
+ rewind(outfp);
+ {
+ label_processing_state state(citation, ncitations, stdout);
+ int c;
+ while ((c = getc(outfp)) != EOF)
+ state.process(c);
+ }
+ ncitations = 0;
+ fclose(outfp);
+ outfp = stdout;
+ }
+ if (nreferences > 0) {
+ fputs(".]<\n", outfp);
+ for (int i = 0; i < nreferences; i++) {
+ if (sort_fields.length() > 0)
+ reference_hash_table[i]->print_sort_key_comment(outfp);
+ if (label_in_reference) {
+ fputs(".ds [F ", outfp);
+ const string &label
+ = reference_hash_table[i]->get_label(NORMAL_LABEL);
+ if (label.length() > 0
+ && (label[0] == ' ' || label[0] == '\\' || label[0] == '"'))
+ putc('"', outfp);
+ put_string(label, outfp);
+ putc('\n', outfp);
+ }
+ reference_hash_table[i]->output(outfp);
+ delete reference_hash_table[i];
+ reference_hash_table[i] = 0;
+ }
+ fputs(".]>\n", outfp);
+ nreferences = 0;
+ }
+ clear_labels();
+}
+
+static reference *find_reference(const char *query, int query_len)
+{
+ // This is so that error messages look better.
+ while (query_len > 0 && csspace(query[query_len - 1]))
+ query_len--;
+ string str;
+ for (int i = 0; i < query_len; i++)
+ str += query[i] == '\n' ? ' ' : query[i];
+ str += '\0';
+ possibly_load_default_database();
+ search_list_iterator iter(&database_list, str.contents());
+ reference_id rid;
+ const char *start;
+ int len;
+ if (!iter.next(&start, &len, &rid)) {
+ error("no matches for '%1'", str.contents());
+ return 0;
+ }
+ const char *end = start + len;
+ while (start < end) {
+ if (*start == '%')
+ break;
+ while (start < end && *start++ != '\n')
+ ;
+ }
+ if (start >= end) {
+ error("found a reference for '%1' but it didn't contain any fields",
+ str.contents());
+ return 0;
+ }
+ reference *result = new reference(start, end - start, &rid);
+ if (iter.next(&start, &len, &rid))
+ warning("multiple matches for '%1'", str.contents());
+ return result;
+}
+
+static reference *make_reference(const string &str, unsigned *flagsp)
+{
+ const char *start = str.contents();
+ const char *end = start + str.length();
+ const char *ptr = start;
+ while (ptr < end) {
+ if (*ptr == '%')
+ break;
+ while (ptr < end && *ptr++ != '\n')
+ ;
+ }
+ *flagsp = 0;
+ for (; start < ptr; start++) {
+ if (*start == '#')
+ *flagsp = (SHORT_LABEL | (*flagsp & (FORCE_RIGHT_BRACKET
+ | FORCE_LEFT_BRACKET)));
+ else if (*start == '[')
+ *flagsp |= FORCE_LEFT_BRACKET;
+ else if (*start == ']')
+ *flagsp |= FORCE_RIGHT_BRACKET;
+ else if (!csspace(*start))
+ break;
+ }
+ if (start >= end) {
+ error("empty reference");
+ return new reference;
+ }
+ reference *database_ref = 0;
+ if (start < ptr)
+ database_ref = find_reference(start, ptr - start);
+ reference *inline_ref = 0;
+ if (ptr < end)
+ inline_ref = new reference(ptr, end - ptr);
+ if (inline_ref) {
+ if (database_ref) {
+ database_ref->merge(*inline_ref);
+ delete inline_ref;
+ return database_ref;
+ }
+ else
+ return inline_ref;
+ }
+ else if (database_ref)
+ return database_ref;
+ else
+ return new reference;
+}
+
+static void do_ref(const string &str)
+{
+ if (accumulate)
+ (void)store_reference(str);
+ else {
+ (void)immediately_handle_reference(str);
+ immediately_output_references();
+ }
+}
+
+static void trim_blanks(string &str)
+{
+ const char *start = str.contents();
+ const char *end = start + str.length();
+ while (end > start && end[-1] != '\n' && csspace(end[-1]))
+ --end;
+ str.set_length(end - start);
+}
+
+void do_bib(const char *filename)
+{
+ FILE *fp;
+ if (strcmp(filename, "-") == 0)
+ fp = stdin;
+ else {
+ errno = 0;
+ fp = fopen(filename, "r");
+ if (fp == 0) {
+ error("can't open '%1': %2", filename, strerror(errno));
+ return;
+ }
+ current_filename = filename;
+ }
+ current_lineno = 1;
+ enum {
+ START, MIDDLE, BODY, BODY_START, BODY_BLANK, BODY_DOT
+ } state = START;
+ string body;
+ for (;;) {
+ int c = getc(fp);
+ if (EOF == c)
+ break;
+ if (is_invalid_input_char(c)) {
+ error("invalid input character code %1", c);
+ continue;
+ }
+ switch (state) {
+ case START:
+ if ('%' == c) {
+ body = c;
+ state = BODY;
+ }
+ else if (c != '\n')
+ state = MIDDLE;
+ break;
+ case MIDDLE:
+ if ('\n' == c)
+ state = START;
+ break;
+ case BODY:
+ body += c;
+ if ('\n' == c)
+ state = BODY_START;
+ break;
+ case BODY_START:
+ if ('\n' == c) {
+ do_ref(body);
+ state = START;
+ }
+ else if ('.' == c)
+ state = BODY_DOT;
+ else if (csspace(c)) {
+ state = BODY_BLANK;
+ body += c;
+ }
+ else {
+ body += c;
+ state = BODY;
+ }
+ break;
+ case BODY_BLANK:
+ if ('\n' == c) {
+ trim_blanks(body);
+ do_ref(body);
+ state = START;
+ }
+ else if (csspace(c))
+ body += c;
+ else {
+ body += c;
+ state = BODY;
+ }
+ break;
+ case BODY_DOT:
+ if (']' == c) {
+ do_ref(body);
+ state = MIDDLE;
+ }
+ else {
+ body += '.';
+ body += c;
+ state = ('\n' == c) ? BODY_START : BODY;
+ }
+ break;
+ default:
+ assert(0 == "unhandled case while parsing bibliography file");
+ }
+ if ('\n' == c)
+ current_lineno++;
+ }
+ switch (state) {
+ case START:
+ case MIDDLE:
+ break;
+ case BODY:
+ body += '\n';
+ do_ref(body);
+ break;
+ case BODY_DOT:
+ case BODY_START:
+ do_ref(body);
+ break;
+ case BODY_BLANK:
+ trim_blanks(body);
+ do_ref(body);
+ break;
+ }
+ fclose(fp);
+}
+
+// from the Dragon Book
+
+unsigned hash_string(const char *s, int len)
+{
+ const char *end = s + len;
+ unsigned h = 0, g;
+ while (s < end) {
+ h <<= 4;
+ h += *s++;
+ if ((g = h & 0xf0000000) != 0) {
+ h ^= g >> 24;
+ h ^= g;
+ }
+ }
+ return h;
+}
+
+int next_size(int n)
+{
+ static const int table_sizes[] = {
+ 101, 503, 1009, 2003, 3001, 4001, 5003, 10007, 20011, 40009,
+ 80021, 160001, 500009, 1000003, 2000003, 4000037, 8000009,
+ 16000057, 32000011, 64000031, 128000003, 0
+ };
+
+ const int *p;
+ for (p = table_sizes; *p <= n && *p != 0; p++)
+ ;
+ assert(*p != 0);
+ return *p;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/refer/refer.h b/src/preproc/refer/refer.h
new file mode 100644
index 0000000..3ebff27
--- /dev/null
+++ b/src/preproc/refer/refer.h
@@ -0,0 +1,81 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <stdlib.h>
+#include <errno.h>
+
+#include "errarg.h"
+#include "error.h"
+#include "stringclass.h"
+#include "cset.h"
+#include "cmap.h"
+#include "lf.h"
+
+#include "defs.h"
+
+unsigned hash_string(const char *, int);
+int next_size(int);
+
+extern string capitalize_fields;
+extern string reverse_fields;
+extern string abbreviate_fields;
+extern string period_before_last_name;
+extern string period_before_initial;
+extern string period_before_hyphen;
+extern string period_before_other;
+extern string sort_fields;
+extern int annotation_field;
+extern string annotation_macro;
+extern string discard_fields;
+extern string articles;
+extern int abbreviate_label_ranges;
+extern string label_range_indicator;
+extern int date_as_label;
+extern string join_authors_exactly_two;
+extern string join_authors_last_two;
+extern string join_authors_default;
+extern string separate_label_second_parts;
+extern string et_al;
+extern int et_al_min_elide;
+extern int et_al_min_total;
+
+extern int compatible_flag;
+
+extern int set_label_spec(const char *);
+extern int set_date_label_spec(const char *);
+extern int set_short_label_spec(const char *);
+
+extern int short_label_flag;
+
+void clear_labels();
+void command_error(const char *,
+ const errarg &arg1 = empty_errarg,
+ const errarg &arg2 = empty_errarg,
+ const errarg &arg3 = empty_errarg);
+
+class reference;
+
+void compute_labels(reference **, int);
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/refer/tests/artifacts/62124.bib b/src/preproc/refer/tests/artifacts/62124.bib
new file mode 100644
index 0000000..1093837
--- /dev/null
+++ b/src/preproc/refer/tests/artifacts/62124.bib
@@ -0,0 +1,4 @@
+%A ÂIrritablé, X.
+%T ˆUniversit\*'e de Grenoble. ‰Cours donn\*'es aux Houches.
+%Z ˆMon dieu, Consiel !‰
+%Z NOTE: This file is deliberately not valid UTF-8. Try Latin-1.
diff --git a/src/preproc/refer/tests/report-correct-line-numbers.sh b/src/preproc/refer/tests/report-correct-line-numbers.sh
new file mode 100755
index 0000000..19cae53
--- /dev/null
+++ b/src/preproc/refer/tests/report-correct-line-numbers.sh
@@ -0,0 +1,136 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+refer="${abs_top_builddir:-.}/refer"
+
+fail=
+
+wail () {
+ echo FAILED >&2
+ fail=YES
+}
+
+# Regression-test Savannah #62124. Ensure correct line numbers in
+# diagnostics on bibliography files.
+
+# Locate directory containing our test artifacts.
+artifact_dir=
+
+for buildroot in . .. ../..
+do
+ d=$buildroot/src/preproc/refer/tests/artifacts
+ if [ -d "$d" ]
+ then
+ artifact_dir=$d
+ break
+ fi
+done
+
+# If we can't find it, we can't test.
+test -z "$artifact_dir" && exit 77 # skip
+
+input=".
+.R1
+bibliography $artifact_dir/62124.bib
+cattywumpus
+.R2
+.
+.R1
+bibliography $artifact_dir/62124.bib
+cattywumpus
+.R2"
+
+# We want standard error _only_.
+output=$(echo "$input" | "$refer" -e -p "$artifact_dir"/62124.bib \
+ 2>&1 >/dev/null)
+
+# We should get every complaint about the bibliography twice because it
+# is dumped twice; the line numbers should not change because they're
+# problems with the bibliography file, not the input file.
+
+# We're pattern-matching diagnostic output here, which is a delicate
+# thing to do. If a test failure occurs, ensure the diagnostic message
+# text hasn't changed before assuming a deeper logic problem.
+
+echo "checking line number of invalid character on bibliography line 1"
+count=$(echo "$output" | grep -c "refer:.*/62124.bib:1:.*code 129")
+test $count -eq 2 || wail
+
+echo "checking line number of first invalid character on bibliography" \
+ "line 2"
+count=$(echo "$output" | grep -c "refer:.*/62124.bib:2:.*code 136")
+test $count -eq 2 || wail
+
+echo "checking line number of second invalid character on" \
+ "bibliography line 2"
+count=$(echo "$output" | grep -c "refer:.*/62124.bib:2:.*code 137")
+test $count -eq 2 || wail
+
+echo "checking line number of first invalid character on" \
+ "bibliography line 3"
+count=$(echo "$output" | grep -c "refer:.*/62124.bib:3:.*code 136")
+test $count -eq 2 || wail
+
+echo "checking line number of second invalid character on" \
+ "bibliography line 3"
+count=$(echo "$output" | grep -c "refer:.*/62124.bib:3:.*code 137")
+test $count -eq 2 || wail
+
+# Problems with the input file should also be accurately located.
+
+echo "checking line number of invalid refer(1) command on input line 4"
+echo "$output"
+echo "$output" | grep -q "refer:.*:4:.*unknown command" || wail
+
+echo "checking line number of invalid refer(1) command on input line 9"
+echo "$output"
+echo "$output" | grep -q "refer:.*:9:.*unknown command" || wail
+
+# Regression-test Savannah #62391.
+
+output=$(printf '\0201\n' | "$refer" 2>&1 >/dev/null)
+
+echo "checking line number of invalid input character on input line 1"
+echo "$output" | grep -q "refer:.*:1:.*invalid input character" \
+ || wail
+
+output=$(printf '.R1\nbogus \0200\n.R2\n' | "$refer" 2>&1 >/dev/null)
+
+echo "checking line number of invalid input character after refer(1)" \
+ "command on input line 2"
+echo "$output" | grep -q "refer:.*:2:.*invalid input character" \
+ || wail
+
+output=$(printf '.R1\ndatabase nonexistent.bib\n.R2\n' | "$refer" 2>&1 \
+ >/dev/null)
+
+echo "checking line number of attempt to load nonexistent database"
+echo "$output" | grep -q "refer:.*:2:.*can't open 'nonexistent\.bib':" \
+ || wail
+
+output=$(printf '.R1\ninclude nonexistent.bib\n.R2\n' | "$refer" 2>&1 \
+ >/dev/null)
+
+echo "checking line number of attempt to load nonexistent inclusion"
+echo "$output" | grep -q "refer:.*:2:.*can't open 'nonexistent\.bib':" \
+ || wail
+test -z "$fail" || exit 1
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/preproc/refer/token.cpp b/src/preproc/refer/token.cpp
new file mode 100644
index 0000000..e643cbd
--- /dev/null
+++ b/src/preproc/refer/token.cpp
@@ -0,0 +1,377 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "refer.h"
+#include "token.h"
+
+#define TOKEN_TABLE_SIZE 1009
+// I believe in Icelandic thorn sorts after z.
+#define THORN_SORT_KEY "{"
+
+struct token_table_entry {
+ const char *tok;
+ token_info ti;
+ token_table_entry();
+};
+
+token_table_entry token_table[TOKEN_TABLE_SIZE];
+int ntokens = 0;
+
+static void skip_name(const char **ptr, const char *end)
+{
+ if (*ptr < end) {
+ switch (*(*ptr)++) {
+ case '(':
+ if (*ptr < end) {
+ *ptr += 1;
+ if (*ptr < end)
+ *ptr += 1;
+ }
+ break;
+ case '[':
+ while (*ptr < end)
+ if (*(*ptr)++ == ']')
+ break;
+ break;
+ }
+ }
+}
+
+int get_token(const char **ptr, const char *end)
+{
+ if (*ptr >= end)
+ return 0;
+ char c = *(*ptr)++;
+ if (c == '\\' && *ptr < end) {
+ switch (**ptr) {
+ default:
+ *ptr += 1;
+ break;
+ case '(':
+ case '[':
+ skip_name(ptr, end);
+ break;
+ case '*':
+ case 'f':
+ *ptr += 1;
+ skip_name(ptr, end);
+ break;
+ }
+ }
+ return 1;
+}
+
+token_info::token_info()
+: type(TOKEN_OTHER), sort_key(0), other_case(0)
+{
+}
+
+void token_info::set(token_type t, const char *sk, const char *oc)
+{
+ assert(oc == 0 || t == TOKEN_UPPER || t == TOKEN_LOWER);
+ type = t;
+ sort_key = sk;
+ other_case = oc;
+}
+
+void token_info::sortify(const char *start, const char *end, string &result)
+ const
+{
+ if (sort_key)
+ result += sort_key;
+ else if (type == TOKEN_UPPER || type == TOKEN_LOWER) {
+ for (; start < end; start++)
+ if (csalpha(*start))
+ result += cmlower(*start);
+ }
+}
+
+int token_info::sortify_non_empty(const char *start, const char *end) const
+{
+ if (sort_key)
+ return *sort_key != '\0';
+ if (type != TOKEN_UPPER && type != TOKEN_LOWER)
+ return 0;
+ for (; start < end; start++)
+ if (csalpha(*start))
+ return 1;
+ return 0;
+}
+
+
+void token_info::lower_case(const char *start, const char *end,
+ string &result) const
+{
+ if (type != TOKEN_UPPER) {
+ while (start < end)
+ result += *start++;
+ }
+ else if (other_case)
+ result += other_case;
+ else {
+ while (start < end)
+ result += cmlower(*start++);
+ }
+}
+
+void token_info::upper_case(const char *start, const char *end,
+ string &result) const
+{
+ if (type != TOKEN_LOWER) {
+ while (start < end)
+ result += *start++;
+ }
+ else if (other_case)
+ result += other_case;
+ else {
+ while (start < end)
+ result += cmupper(*start++);
+ }
+}
+
+token_table_entry::token_table_entry()
+: tok(0)
+{
+}
+
+static void store_token(const char *tok, token_type typ,
+ const char *sk = 0, const char *oc = 0)
+{
+ unsigned n = hash_string(tok, strlen(tok)) % TOKEN_TABLE_SIZE;
+ for (;;) {
+ if (token_table[n].tok == 0) {
+ if (++ntokens == TOKEN_TABLE_SIZE)
+ assert(0);
+ token_table[n].tok = tok;
+ break;
+ }
+ if (strcmp(tok, token_table[n].tok) == 0)
+ break;
+ if (n == 0)
+ n = TOKEN_TABLE_SIZE - 1;
+ else
+ --n;
+ }
+ token_table[n].ti.set(typ, sk, oc);
+}
+
+
+token_info default_token_info;
+
+const token_info *lookup_token(const char *start, const char *end)
+{
+ unsigned n = hash_string(start, end - start) % TOKEN_TABLE_SIZE;
+ for (;;) {
+ if (token_table[n].tok == 0)
+ break;
+ if (strlen(token_table[n].tok) == size_t(end - start)
+ && memcmp(token_table[n].tok, start, end - start) == 0)
+ return &(token_table[n].ti);
+ if (n == 0)
+ n = TOKEN_TABLE_SIZE - 1;
+ else
+ --n;
+ }
+ return &default_token_info;
+}
+
+static void init_ascii()
+{
+ const char *p;
+ for (p = "abcdefghijklmnopqrstuvwxyz"; *p; p++) {
+ char buf[2];
+ buf[0] = *p;
+ buf[1] = '\0';
+ store_token(strsave(buf), TOKEN_LOWER);
+ buf[0] = cmupper(buf[0]);
+ store_token(strsave(buf), TOKEN_UPPER);
+ }
+ for (p = "0123456789"; *p; p++) {
+ char buf[2];
+ buf[0] = *p;
+ buf[1] = '\0';
+ const char *s = strsave(buf);
+ store_token(s, TOKEN_OTHER, s);
+ }
+ for (p = ".,:;?!"; *p; p++) {
+ char buf[2];
+ buf[0] = *p;
+ buf[1] = '\0';
+ store_token(strsave(buf), TOKEN_PUNCT);
+ }
+ store_token("-", TOKEN_HYPHEN);
+}
+
+static void store_letter(const char *lower, const char *upper,
+ const char *sort_key = 0)
+{
+ store_token(lower, TOKEN_LOWER, sort_key, upper);
+ store_token(upper, TOKEN_UPPER, sort_key, lower);
+}
+
+static void init_letter(unsigned char uc_code, unsigned char lc_code,
+ const char *sort_key)
+{
+ char lbuf[2];
+ lbuf[0] = lc_code;
+ lbuf[1] = 0;
+ char ubuf[2];
+ ubuf[0] = uc_code;
+ ubuf[1] = 0;
+ store_letter(strsave(lbuf), strsave(ubuf), sort_key);
+}
+
+static void init_latin1()
+{
+ init_letter(0xc0, 0xe0, "a");
+ init_letter(0xc1, 0xe1, "a");
+ init_letter(0xc2, 0xe2, "a");
+ init_letter(0xc3, 0xe3, "a");
+ init_letter(0xc4, 0xe4, "a");
+ init_letter(0xc5, 0xe5, "a");
+ init_letter(0xc6, 0xe6, "ae");
+ init_letter(0xc7, 0xe7, "c");
+ init_letter(0xc8, 0xe8, "e");
+ init_letter(0xc9, 0xe9, "e");
+ init_letter(0xca, 0xea, "e");
+ init_letter(0xcb, 0xeb, "e");
+ init_letter(0xcc, 0xec, "i");
+ init_letter(0xcd, 0xed, "i");
+ init_letter(0xce, 0xee, "i");
+ init_letter(0xcf, 0xef, "i");
+
+ init_letter(0xd0, 0xf0, "d");
+ init_letter(0xd1, 0xf1, "n");
+ init_letter(0xd2, 0xf2, "o");
+ init_letter(0xd3, 0xf3, "o");
+ init_letter(0xd4, 0xf4, "o");
+ init_letter(0xd5, 0xf5, "o");
+ init_letter(0xd6, 0xf6, "o");
+ init_letter(0xd8, 0xf8, "o");
+ init_letter(0xd9, 0xf9, "u");
+ init_letter(0xda, 0xfa, "u");
+ init_letter(0xdb, 0xfb, "u");
+ init_letter(0xdc, 0xfc, "u");
+ init_letter(0xdd, 0xfd, "y");
+ init_letter(0xde, 0xfe, THORN_SORT_KEY);
+
+ store_token("\337", TOKEN_LOWER, "ss", "SS");
+ store_token("\377", TOKEN_LOWER, "y", "Y");
+}
+
+static void init_two_char_letter(char l1, char l2, char u1, char u2,
+ const char *sk = 0)
+{
+ char buf[6];
+ buf[0] = '\\';
+ buf[1] = '(';
+ buf[2] = l1;
+ buf[3] = l2;
+ buf[4] = '\0';
+ const char *p = strsave(buf);
+ buf[2] = u1;
+ buf[3] = u2;
+ store_letter(p, strsave(buf), sk);
+ buf[1] = '[';
+ buf[4] = ']';
+ buf[5] = '\0';
+ p = strsave(buf);
+ buf[2] = l1;
+ buf[3] = l2;
+ store_letter(strsave(buf), p, sk);
+
+}
+
+static void init_special_chars()
+{
+ const char *p;
+ for (p = "':^`~"; *p; p++)
+ for (const char *q = "aeiouy"; *q; q++) {
+ // Use a variable to work around bug in gcc 2.0
+ char c = cmupper(*q);
+ init_two_char_letter(*p, *q, *p, c);
+ }
+ for (p = "/l/o~n,coeaeij"; *p; p += 2) {
+ // Use variables to work around bug in gcc 2.0
+ char c0 = cmupper(p[0]);
+ char c1 = cmupper(p[1]);
+ init_two_char_letter(p[0], p[1], c0, c1);
+ }
+ init_two_char_letter('v', 's', 'v', 'S', "s");
+ init_two_char_letter('v', 'z', 'v', 'Z', "z");
+ init_two_char_letter('o', 'a', 'o', 'A', "a");
+ init_two_char_letter('T', 'p', 'T', 'P', THORN_SORT_KEY);
+ init_two_char_letter('-', 'd', '-', 'D');
+
+ store_token("\\(ss", TOKEN_LOWER, 0, "SS");
+ store_token("\\[ss]", TOKEN_LOWER, 0, "SS");
+
+ store_token("\\(Sd", TOKEN_LOWER, "d", "\\(-D");
+ store_token("\\[Sd]", TOKEN_LOWER, "d", "\\[-D]");
+ store_token("\\(hy", TOKEN_HYPHEN);
+ store_token("\\[hy]", TOKEN_HYPHEN);
+ store_token("\\(en", TOKEN_RANGE_SEP);
+ store_token("\\[en]", TOKEN_RANGE_SEP);
+}
+
+static void init_strings()
+{
+ char buf[6];
+ buf[0] = '\\';
+ buf[1] = '*';
+ for (const char *p = "'`^^,:~v_o./;"; *p; p++) {
+ buf[2] = *p;
+ buf[3] = '\0';
+ store_token(strsave(buf), TOKEN_ACCENT);
+ buf[2] = '[';
+ buf[3] = *p;
+ buf[4] = ']';
+ buf[5] = '\0';
+ store_token(strsave(buf), TOKEN_ACCENT);
+ }
+
+ // -ms special letters
+ store_letter("\\*(th", "\\*(Th", THORN_SORT_KEY);
+ store_letter("\\*[th]", "\\*[Th]", THORN_SORT_KEY);
+ store_letter("\\*(d-", "\\*(D-");
+ store_letter("\\*[d-]", "\\*[D-]");
+ store_letter("\\*(ae", "\\*(Ae", "ae");
+ store_letter("\\*[ae]", "\\*[Ae]", "ae");
+ store_letter("\\*(oe", "\\*(Oe", "oe");
+ store_letter("\\*[oe]", "\\*[Oe]", "oe");
+
+ store_token("\\*3", TOKEN_LOWER, "y", "Y");
+ store_token("\\*8", TOKEN_LOWER, "ss", "SS");
+ store_token("\\*q", TOKEN_LOWER, "o", "O");
+}
+
+struct token_initer {
+ token_initer();
+};
+
+static token_initer the_token_initer;
+
+token_initer::token_initer()
+{
+ init_ascii();
+ init_latin1();
+ init_special_chars();
+ init_strings();
+ default_token_info.set(TOKEN_OTHER);
+}
diff --git a/src/preproc/refer/token.h b/src/preproc/refer/token.h
new file mode 100644
index 0000000..9cd688c
--- /dev/null
+++ b/src/preproc/refer/token.h
@@ -0,0 +1,87 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+enum token_type {
+ TOKEN_OTHER,
+ TOKEN_UPPER,
+ TOKEN_LOWER,
+ TOKEN_ACCENT,
+ TOKEN_PUNCT,
+ TOKEN_HYPHEN,
+ TOKEN_RANGE_SEP
+};
+
+class token_info {
+private:
+ token_type type;
+ const char *sort_key;
+ const char *other_case;
+public:
+ token_info();
+ void set(token_type, const char *sk = 0, const char *oc = 0);
+ void lower_case(const char *start, const char *end, string &result) const;
+ void upper_case(const char *start, const char *end, string &result) const;
+ void sortify(const char *start, const char *end, string &result) const;
+ int sortify_non_empty(const char *start, const char *end) const;
+ int is_upper() const;
+ int is_lower() const;
+ int is_accent() const;
+ int is_other() const;
+ int is_punct() const;
+ int is_hyphen() const;
+ int is_range_sep() const;
+};
+
+inline int token_info::is_upper() const
+{
+ return type == TOKEN_UPPER;
+}
+
+inline int token_info::is_lower() const
+{
+ return type == TOKEN_LOWER;
+}
+
+inline int token_info::is_accent() const
+{
+ return type == TOKEN_ACCENT;
+}
+
+inline int token_info::is_other() const
+{
+ return type == TOKEN_OTHER;
+}
+
+inline int token_info::is_punct() const
+{
+ return type == TOKEN_PUNCT;
+}
+
+inline int token_info::is_hyphen() const
+{
+ return type == TOKEN_HYPHEN;
+}
+
+inline int token_info::is_range_sep() const
+{
+ return type == TOKEN_RANGE_SEP;
+}
+
+int get_token(const char **ptr, const char *end);
+const token_info *lookup_token(const char *start, const char *end);
diff --git a/src/preproc/soelim/TODO b/src/preproc/soelim/TODO
new file mode 100644
index 0000000..f2a3924
--- /dev/null
+++ b/src/preproc/soelim/TODO
@@ -0,0 +1 @@
+Understand .pso.
diff --git a/src/preproc/soelim/soelim.1.man b/src/preproc/soelim/soelim.1.man
new file mode 100644
index 0000000..4a1c042
--- /dev/null
+++ b/src/preproc/soelim/soelim.1.man
@@ -0,0 +1,456 @@
+'\" p
+.TH @g@soelim @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+@g@soelim \- recursively interpolate source requests in
+.I roff
+or other text files
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2020 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_soelim_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.\" Man pages are seldom preprocessed with pic(1).
+.mso pic.tmac
+.
+.
+.\" ====================================================================
+.\" Definitions
+.\" ====================================================================
+.
+.ie t .ds tx T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X
+.el .ds tx TeX
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY @g@soelim
+.RB [ \-Crt ]
+.RB [ \-I
+.IR dir ]
+.RI [ input-file\~ .\|.\|.]
+.YS
+.
+.
+.SY @g@soelim
+.B \-\-help
+.YS
+.
+.
+.SY @g@soelim
+.B \-v
+.
+.SY @g@soelim
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+GNU
+.I soelim \" GNU
+is a preprocessor for the
+.MR groff @MAN7EXT@
+document formatting system.
+.
+.I @g@soelim
+works as a filter to eliminate source requests in
+.MR roff @MAN7EXT@
+input files;
+that is,
+it replaces lines of the form
+.RB \[lq] .so
+.IR included-file \[rq]
+within each text
+.I input-file
+with the contents of
+.IR included-file ,
+recursively.
+.
+By default,
+it writes
+.B lf
+requests as well to record the name and line number of each
+.I input-file
+and
+.IR included-file ,
+so that any diagnostics produced by later processing can be accurately
+traced to the original input.
+.
+Options allow this information to be suppressed
+.RB ( \-r )
+or supplied in \*[tx] comments instead
+.RB ( \-t ).
+.
+In the absence of
+.I input-file
+arguments,
+.I @g@soelim
+reads the standard input stream.
+.
+Output is written to the standard output stream.
+.
+.
+.PP
+If the name of a
+.I macro-file
+contains a backslash,
+use
+.B \[rs]\[rs]
+or
+.B \[rs]e
+to embed it.
+.
+To embed a space,
+write
+.RB \[lq] \[rs]\~ \[rq]
+(backslash followed by a space).
+.
+Any other escape sequence in
+.IR macro-file ,
+including
+.RB \[lq] \[rs][rs] \[rq],
+prevents
+.I @g@soelim
+from replacing the source request.
+.
+.
+.PP
+The dot must be at the beginning of a line and must be followed by
+.RB \[lq] so \[rq]
+without intervening spaces or tabs for
+.I @g@soelim
+to handle it.
+.
+This convention allows source requests to be \[lq]protected\[rq] from
+processing by
+.IR @g@soelim ,
+for instance as part of macro definitions or
+.RB \[lq] if \[rq]
+requests.
+.
+.
+.PP
+There must also be at least one space between
+.RB \[lq] so \[rq]
+and its
+.I macro-file
+argument.
+.
+The
+.B \-C
+option overrides this requirement.
+.
+.
+.PP
+The foregoing is the limit of
+.IR @g@soelim 's
+understanding of the
+.I roff
+language;
+it does not,
+for example,
+replace the input line
+.
+.RS
+.EX
+\&.if 1 .so otherfile
+.EE
+.RE
+.
+with the contents of
+.IR otherfile .
+.
+With its
+.B \-r
+option,
+therefore,
+.I @g@soelim
+can be used to process text files in general,
+to flatten a tree of input documents.
+.
+.
+.PP
+.I soelim \" generic
+was designed to handle situations where the target of a
+.I roff \" generic
+source request requires a preprocessor such as
+.MR @g@eqn @MAN1EXT@ ,
+.MR @g@pic @MAN1EXT@ ,
+.MR @g@refer @MAN1EXT@ ,
+or
+.MR @g@tbl @MAN1EXT@ .
+.
+The usual processing sequence of
+.MR groff @MAN1EXT@
+is as follows.
+.
+.\" Does this groff installation use a command prefix? In installed
+.\" pages, this comparison will not look like it needs to be dynamically
+.\" decided.
+.\"
+.\" This is done so that the box sizes (in the pic(1) diagram) and arrow
+.\" alignments (in the text alternative) can remain fixed.
+.if !'@g@'\%' \{\
+In the diagrams below,
+the traditional names for
+.I soelim
+and
+.I troff
+are used;
+on this system,
+the GNU versions are installed as
+.I @g@soelim
+and
+.IR @g@troff .
+.\}
+.
+.
+.PP
+.ie t \{\
+.PS
+.ps 10
+.vs 12
+box invisible width 0.5 height 0.4 "input" "file";
+move to last box .bottom;
+down;
+arrow 0.3;
+box invisible width 0.8 height 0.2 "preprocessor";
+move to last box .right
+right;
+arrow 0.3;
+A: box invisible width 0.35 height 0.2 "troff";
+move to last box .top;
+up;
+move 0.3;
+box invisible width 0.6 height 0.4 "sourced" "file";
+line <- up 0.3 from A.top;
+move to A.right;
+right;
+arrow 0.3;
+box invisible width 0.85 height 0.2 "postprocessor";
+move to last box .bottom;
+down;
+arrow 0.3;
+box invisible width 0.5 height 0.4 "output" "file"
+.ps
+.vs
+.PE
+.\}
+.el \{\
+.EX
+ input sourced
+ file file
+ \[bv] \[bv]
+ \[da] \[da]
+ preprocessor \[an]\[->] troff \[an]\[->] postprocessor
+ \[bv]
+ \[da]
+ output
+ file
+.EE
+.\}
+.PP
+That is,
+files sourced with
+.RB \[lq] so \[rq]
+are normally read
+.I only
+by the formatter,
+.IR @g@troff .
+.
+.I @g@soelim
+is
+.I not
+required for
+.I @g@troff
+to source files.
+.
+.
+.PP
+If a file to be sourced should also be preprocessed,
+it must already be read
+.I before
+the input file passes through the preprocessor.
+.
+.IR @g@soelim ,
+normally invoked via
+.IR groff 's
+.B \-s
+option,
+handles this.
+.
+.
+.PP
+.ie t \{\
+.PS
+.ps 10
+.vs 12
+box invisible width 0.5 height 0.4 "input" "file";
+move to last box .bottom;
+down;
+arrow 0.3;
+A: box invisible width 0.5 height 0.2 "soelim";
+line <- 0.3;
+box invisible width 0.5 height 0.4 "sourced" "file";
+move to A.right;
+right;
+arrow 0.3;
+box invisible width 0.8 height 0.2 "preprocessor";
+arrow 0.3;
+box invisible width 0.35 height 0.2 "troff";
+arrow 0.3
+box invisible width 0.85 height 0.2 "postprocessor";
+move to last box .bottom;
+down;
+arrow 0.3;
+box invisible width 0.5 height 0.4 "output" "file"
+.ps
+.vs
+.PE
+.\}
+.el \{\
+.EX
+ input
+ file
+ \[bv]
+ \[da]
+ soelim \[an]\[->] preprocessor \[an]\[->] troff \[an]\[->] \
+postprocessor
+ \[ua] \[bv]
+ \[bv] \[da]
+ sourced output
+ file file
+.EE
+.\}
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.B \-C
+Recognize an input line starting with
+.B .so
+even if a character other than a space or newline follows.
+.
+.TP
+.BI \-I\~ dir
+Search the directory
+.I dir
+path for
+.I input-
+and
+.I included-files.
+.
+.B \-I
+may be specified more than once;
+each
+.I dir
+is searched in the given order.
+.
+To search the current working directory before others,
+add
+.RB \[lq] "\-I .\&" \[rq]
+at the desired place;
+it is otherwise searched last.
+.
+.
+.TP
+.B \-r
+Write files \[lq]raw\[rq];
+do not add
+.B lf
+requests.
+.
+.
+.TP
+.B \-t
+Emit \*[tx] comment lines starting with
+.RB \[lq] % \[rq]
+indicating the current file and line number,
+rather than
+.B lf
+requests for the same purpose.
+.
+.
+.PP
+If both
+.B \-r
+and
+.B \-t
+are given,
+the last one specified controls.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.MR groff @MAN1EXT@
+.
+.
+.\" Clean up.
+.rm tx
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_soelim_1_man_C]
+.do rr *groff_soelim_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/preproc/soelim/soelim.am b/src/preproc/soelim/soelim.am
new file mode 100644
index 0000000..1aa7941
--- /dev/null
+++ b/src/preproc/soelim/soelim.am
@@ -0,0 +1,31 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+prefixexecbin_PROGRAMS += soelim
+soelim_LDADD = libgroff.a $(LIBM) lib/libgnu.a
+soelim_SOURCES = src/preproc/soelim/soelim.cpp
+PREFIXMAN1 += src/preproc/soelim/soelim.1
+EXTRA_DIST += \
+ src/preproc/soelim/TODO \
+ src/preproc/soelim/soelim.1.man
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/preproc/soelim/soelim.cpp b/src/preproc/soelim/soelim.cpp
new file mode 100644
index 0000000..bafc5cd
--- /dev/null
+++ b/src/preproc/soelim/soelim.cpp
@@ -0,0 +1,315 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+#include <stdlib.h>
+
+#include "errarg.h"
+#include "error.h"
+#include "stringclass.h"
+#include "nonposix.h"
+#include "searchpath.h"
+#include "lf.h"
+
+// The include search path initially contains only the current directory.
+static search_path include_search_path(0, 0, 0, 1);
+
+int compatible_flag = 0;
+int raw_flag = 0;
+int tex_flag = 0;
+
+extern "C" const char *Version_string;
+
+int do_file(const char *);
+
+
+void usage(FILE *stream)
+{
+ fprintf(stream, "usage: %s [-Crt] [-I dir] [file ...]\n"
+ "usage: %s {-v | --version}\n"
+ "usage: %s --help\n",
+ program_name, program_name, program_name);
+}
+
+int main(int argc, char **argv)
+{
+ program_name = argv[0];
+ int opt;
+ static const struct option long_options[] = {
+ { "help", no_argument, 0, CHAR_MAX + 1 },
+ { "version", no_argument, 0, 'v' },
+ { NULL, 0, 0, 0 }
+ };
+ while ((opt = getopt_long(argc, argv, "CI:rtv", long_options, NULL)) != EOF)
+ switch (opt) {
+ case 'v':
+ printf("GNU soelim (groff) version %s\n", Version_string);
+ exit(0);
+ break;
+ case 'C':
+ compatible_flag = 1;
+ break;
+ case 'I':
+ include_search_path.command_line_dir(optarg);
+ break;
+ case 'r':
+ raw_flag = 1;
+ break;
+ case 't':
+ tex_flag = 1;
+ break;
+ case CHAR_MAX + 1: // --help
+ usage(stdout);
+ exit(0);
+ break;
+ case '?':
+ usage(stderr);
+ exit(1);
+ break;
+ default:
+ assert(0);
+ }
+ int nbad = 0;
+ if (optind >= argc)
+ nbad += !do_file("-");
+ else
+ for (int i = optind; i < argc; i++)
+ nbad += !do_file(argv[i]);
+ if (ferror(stdout) || fflush(stdout) < 0)
+ fatal("output error");
+ return nbad != 0;
+}
+
+void set_location()
+{
+ if (!raw_flag) {
+ if (!tex_flag)
+ printf(".lf %d %s\n", current_lineno, current_filename);
+ else
+ printf("%% file %s, line %d\n", current_filename, current_lineno);
+ }
+}
+
+void do_so(const char *line)
+{
+ const char *p = line;
+ while (*p == ' ')
+ p++;
+ string filename;
+ int success = 1;
+ for (const char *q = p;
+ success && *q != '\0' && *q != '\n' && *q != ' ';
+ q++)
+ if (*q == '\\') {
+ switch (*++q) {
+ case 'e':
+ case '\\':
+ filename += '\\';
+ break;
+ case ' ':
+ filename += ' ';
+ break;
+ default:
+ success = 0;
+ break;
+ }
+ }
+ else
+ filename += char(*q);
+ if (success && filename.length() > 0) {
+ filename += '\0';
+ const char *fn = current_filename;
+ int ln = current_lineno;
+ current_lineno--;
+ if (do_file(filename.contents())) {
+ current_filename = fn;
+ current_lineno = ln;
+ set_location();
+ return;
+ }
+ current_lineno++;
+ }
+ fputs(".so", stdout);
+ fputs(line, stdout);
+}
+
+int do_file(const char *filename)
+{
+ char *file_name_in_path = 0;
+ FILE *fp = include_search_path.open_file_cautious(filename,
+ &file_name_in_path);
+ int err = errno;
+ string whole_filename(file_name_in_path ? file_name_in_path : filename);
+ whole_filename += '\0';
+ free(file_name_in_path);
+ if (fp == 0) {
+ error("can't open '%1': %2", whole_filename.contents(), strerror(err));
+ return 0;
+ }
+ normalize_for_lf(whole_filename);
+ current_filename = whole_filename.contents();
+ current_lineno = 1;
+ set_location();
+ enum { START, MIDDLE, HAD_DOT, HAD_s, HAD_so, HAD_l, HAD_lf } state = START;
+ for (;;) {
+ int c = getc(fp);
+ if (c == EOF)
+ break;
+ switch (state) {
+ case START:
+ if (c == '.')
+ state = HAD_DOT;
+ else {
+ putchar(c);
+ if (c == '\n') {
+ current_lineno++;
+ state = START;
+ }
+ else
+ state = MIDDLE;
+ }
+ break;
+ case MIDDLE:
+ putchar(c);
+ if (c == '\n') {
+ current_lineno++;
+ state = START;
+ }
+ break;
+ case HAD_DOT:
+ if (c == 's')
+ state = HAD_s;
+ else if (c == 'l')
+ state = HAD_l;
+ else {
+ putchar('.');
+ putchar(c);
+ if (c == '\n') {
+ current_lineno++;
+ state = START;
+ }
+ else
+ state = MIDDLE;
+ }
+ break;
+ case HAD_s:
+ if (c == 'o')
+ state = HAD_so;
+ else {
+ putchar('.');
+ putchar('s');
+ putchar(c);
+ if (c == '\n') {
+ current_lineno++;
+ state = START;
+ }
+ else
+ state = MIDDLE;
+ }
+ break;
+ case HAD_so:
+ if (c == ' ' || c == '\n' || compatible_flag) {
+ string line;
+ for (; c != EOF && c != '\n'; c = getc(fp))
+ line += c;
+ current_lineno++;
+ line += '\n';
+ line += '\0';
+ do_so(line.contents());
+ state = START;
+ }
+ else {
+ fputs(".so", stdout);
+ putchar(c);
+ state = MIDDLE;
+ }
+ break;
+ case HAD_l:
+ if (c == 'f')
+ state = HAD_lf;
+ else {
+ putchar('.');
+ putchar('l');
+ putchar(c);
+ if (c == '\n') {
+ current_lineno++;
+ state = START;
+ }
+ else
+ state = MIDDLE;
+ }
+ break;
+ case HAD_lf:
+ if (c == ' ' || c == '\n' || compatible_flag) {
+ string line;
+ for (; c != EOF && c != '\n'; c = getc(fp))
+ line += c;
+ current_lineno++;
+ line += '\n';
+ line += '\0';
+ interpret_lf_args(line.contents());
+ printf(".lf%s", line.contents());
+ state = START;
+ }
+ else {
+ fputs(".lf", stdout);
+ putchar(c);
+ state = MIDDLE;
+ }
+ break;
+ default:
+ assert(0);
+ }
+ }
+ switch (state) {
+ case HAD_DOT:
+ fputs(".\n", stdout);
+ break;
+ case HAD_l:
+ fputs(".l\n", stdout);
+ break;
+ case HAD_s:
+ fputs(".s\n", stdout);
+ break;
+ case HAD_lf:
+ fputs(".lf\n", stdout);
+ break;
+ case HAD_so:
+ fputs(".so\n", stdout);
+ break;
+ case MIDDLE:
+ putc('\n', stdout);
+ break;
+ case START:
+ break;
+ }
+ if (fp != stdin)
+ fclose(fp);
+ current_filename = 0;
+ return 1;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/tbl/main.cpp b/src/preproc/tbl/main.cpp
new file mode 100644
index 0000000..db105c2
--- /dev/null
+++ b/src/preproc/tbl/main.cpp
@@ -0,0 +1,1692 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "table.h"
+
+#define MAX_POINT_SIZE 99
+#define MAX_VERTICAL_SPACING 72
+
+extern "C" const char *Version_string;
+
+int compatible_flag = 0;
+
+class table_input {
+ FILE *fp;
+ enum { START, MIDDLE,
+ REREAD_T, REREAD_TE, REREAD_E,
+ LEADER_1, LEADER_2, LEADER_3, LEADER_4,
+ END, ERROR } state;
+ string unget_stack;
+public:
+ table_input(FILE *);
+ int get();
+ int ended() { return unget_stack.empty() && state == END; }
+ void unget(char);
+};
+
+table_input::table_input(FILE *p)
+: fp(p), state(START)
+{
+}
+
+void table_input::unget(char c)
+{
+ assert(c != '\0');
+ unget_stack += c;
+ if (c == '\n')
+ current_lineno--;
+}
+
+int table_input::get()
+{
+ int len = unget_stack.length();
+ if (len != 0) {
+ unsigned char c = unget_stack[len - 1];
+ unget_stack.set_length(len - 1);
+ if (c == '\n')
+ current_lineno++;
+ return c;
+ }
+ int c;
+ for (;;) {
+ switch (state) {
+ case START:
+ if ((c = getc(fp)) == '.') {
+ if ((c = getc(fp)) == 'T') {
+ if ((c = getc(fp)) == 'E') {
+ if (compatible_flag) {
+ state = END;
+ return EOF;
+ }
+ else {
+ c = getc(fp);
+ if (c != EOF)
+ ungetc(c, fp);
+ if (c == EOF || c == ' ' || c == '\n') {
+ state = END;
+ return EOF;
+ }
+ state = REREAD_TE;
+ return '.';
+ }
+ }
+ else {
+ if (c != EOF)
+ ungetc(c, fp);
+ state = REREAD_T;
+ return '.';
+ }
+ }
+ else {
+ if (c != EOF)
+ ungetc(c, fp);
+ state = MIDDLE;
+ return '.';
+ }
+ }
+ else if (c == EOF) {
+ state = ERROR;
+ return EOF;
+ }
+ else {
+ if (c == '\n')
+ current_lineno++;
+ else {
+ state = MIDDLE;
+ if (c == '\0') {
+ error("invalid input character code 0");
+ break;
+ }
+ }
+ return c;
+ }
+ break;
+ case MIDDLE:
+ // handle line continuation and uninterpreted leader character
+ if ((c = getc(fp)) == '\\') {
+ c = getc(fp);
+ if (c == '\n') {
+ current_lineno++;
+ c = getc(fp);
+ }
+ else if (c == 'a' && compatible_flag) {
+ state = LEADER_1;
+ return '\\';
+ }
+ else {
+ if (c != EOF)
+ ungetc(c, fp);
+ c = '\\';
+ }
+ }
+ if (c == EOF) {
+ state = ERROR;
+ return EOF;
+ }
+ else {
+ if (c == '\n') {
+ state = START;
+ current_lineno++;
+ }
+ else if (c == '\0') {
+ error("invalid input character code 0");
+ break;
+ }
+ return c;
+ }
+ case REREAD_T:
+ state = MIDDLE;
+ return 'T';
+ case REREAD_TE:
+ state = REREAD_E;
+ return 'T';
+ case REREAD_E:
+ state = MIDDLE;
+ return 'E';
+ case LEADER_1:
+ state = LEADER_2;
+ return '*';
+ case LEADER_2:
+ state = LEADER_3;
+ return '(';
+ case LEADER_3:
+ state = LEADER_4;
+ return PREFIX_CHAR;
+ case LEADER_4:
+ state = MIDDLE;
+ return LEADER_CHAR;
+ case END:
+ case ERROR:
+ return EOF;
+ }
+ }
+}
+
+void process_input_file(FILE *);
+void process_table(table_input &in);
+
+void process_input_file(FILE *fp)
+{
+ enum { START, MIDDLE, HAD_DOT, HAD_T, HAD_TS, HAD_l, HAD_lf } state;
+ state = START;
+ int c;
+ while ((c = getc(fp)) != EOF)
+ switch (state) {
+ case START:
+ if (c == '.')
+ state = HAD_DOT;
+ else {
+ if (c == '\n')
+ current_lineno++;
+ else
+ state = MIDDLE;
+ putchar(c);
+ }
+ break;
+ case MIDDLE:
+ if (c == '\n') {
+ current_lineno++;
+ state = START;
+ }
+ putchar(c);
+ break;
+ case HAD_DOT:
+ if (c == 'T')
+ state = HAD_T;
+ else if (c == 'l')
+ state = HAD_l;
+ else {
+ putchar('.');
+ putchar(c);
+ if (c == '\n') {
+ current_lineno++;
+ state = START;
+ }
+ else
+ state = MIDDLE;
+ }
+ break;
+ case HAD_T:
+ if (c == 'S')
+ state = HAD_TS;
+ else {
+ putchar('.');
+ putchar('T');
+ putchar(c);
+ if (c == '\n') {
+ current_lineno++;
+ state = START;
+ }
+ else
+ state = MIDDLE;
+ }
+ break;
+ case HAD_TS:
+ if (c == ' ' || c == '\n' || compatible_flag) {
+ putchar('.');
+ putchar('T');
+ putchar('S');
+ while (c != '\n') {
+ if (c == EOF) {
+ error("end of file at beginning of table");
+ return;
+ }
+ putchar(c);
+ c = getc(fp);
+ }
+ putchar('\n');
+ current_lineno++;
+ {
+ table_input input(fp);
+ process_table(input);
+ set_troff_location(current_filename, current_lineno);
+ if (input.ended()) {
+ fputs(".TE", stdout);
+ while ((c = getc(fp)) != '\n') {
+ if (c == EOF) {
+ putchar('\n');
+ return;
+ }
+ putchar(c);
+ }
+ putchar('\n');
+ current_lineno++;
+ }
+ }
+ state = START;
+ }
+ else {
+ fputs(".TS", stdout);
+ putchar(c);
+ state = MIDDLE;
+ }
+ break;
+ case HAD_l:
+ if (c == 'f')
+ state = HAD_lf;
+ else {
+ putchar('.');
+ putchar('l');
+ putchar(c);
+ if (c == '\n') {
+ current_lineno++;
+ state = START;
+ }
+ else
+ state = MIDDLE;
+ }
+ break;
+ case HAD_lf:
+ if (c == ' ' || c == '\n' || compatible_flag) {
+ string line;
+ while (c != EOF) {
+ line += c;
+ if (c == '\n') {
+ current_lineno++;
+ break;
+ }
+ c = getc(fp);
+ }
+ line += '\0';
+ interpret_lf_args(line.contents());
+ printf(".lf%s", line.contents());
+ state = START;
+ }
+ else {
+ fputs(".lf", stdout);
+ putchar(c);
+ state = MIDDLE;
+ }
+ break;
+ default:
+ assert(0 == "invalid `state` in switch");
+ }
+ switch(state) {
+ case START:
+ break;
+ case MIDDLE:
+ putchar('\n');
+ break;
+ case HAD_DOT:
+ fputs(".\n", stdout);
+ break;
+ case HAD_l:
+ fputs(".l\n", stdout);
+ break;
+ case HAD_T:
+ fputs(".T\n", stdout);
+ break;
+ case HAD_lf:
+ fputs(".lf\n", stdout);
+ break;
+ case HAD_TS:
+ fputs(".TS\n", stdout);
+ break;
+ }
+ if (fp != stdin)
+ fclose(fp);
+}
+
+struct options {
+ unsigned flags;
+ int linesize;
+ char delim[2];
+ char tab_char;
+ char decimal_point_char;
+
+ options();
+};
+
+options::options()
+: flags(0), linesize(0), tab_char('\t'), decimal_point_char('.')
+{
+ delim[0] = delim[1] = '\0';
+}
+
+// Return non-zero if p and q are the same ignoring case.
+
+int strieq(const char *p, const char *q)
+{
+ for (; cmlower(*p) == cmlower(*q); p++, q++)
+ if (*p == '\0')
+ return 1;
+ return 0;
+}
+
+// Handle region options. Return a null pointer if we should give up on
+// this table.
+options *process_options(table_input &in)
+{
+ options *opt = new options;
+ string line;
+ int level = 0;
+ for (;;) {
+ int c = in.get();
+ if (c == EOF) {
+ int i = line.length();
+ while (--i >= 0)
+ in.unget(line[i]);
+ return opt;
+ }
+ if (c == '\n') {
+ in.unget(c);
+ int i = line.length();
+ while (--i >= 0)
+ in.unget(line[i]);
+ return opt;
+ }
+ else if (c == '(')
+ level++;
+ else if (c == ')')
+ level--;
+ else if (c == ';' && 0 == level) {
+ line += '\0';
+ break;
+ }
+ line += c;
+ }
+ if (line.empty())
+ return opt;
+ char *p = &line[0];
+ for (;;) {
+ while (!csalpha(*p) && *p != '\0')
+ p++;
+ if (*p == '\0')
+ break;
+ char *q = p;
+ while (csalpha(*q))
+ q++;
+ char *arg = 0;
+ if (*q != '(' && *q != '\0')
+ *q++ = '\0';
+ while (csspace(*q))
+ q++;
+ if (*q == '(') {
+ *q++ = '\0';
+ arg = q;
+ while (*q != ')' && *q != '\0')
+ q++;
+ if (*q == '\0')
+ error("'%1' region option argument missing closing parenthesis",
+ arg);
+ else
+ *q++ = '\0';
+ }
+ if (*p == '\0') {
+ if (arg)
+ error("'%1' region option argument cannot be empty", arg);
+ }
+ else if (strieq(p, "tab")) {
+ if (!arg)
+ error("'tab' region option requires argument in parentheses");
+ else {
+ if (arg[0] == '\0' || arg[1] != '\0')
+ error("'tab' region option argument must be a single"
+ " character");
+ else
+ opt->tab_char = arg[0];
+ }
+ }
+ else if (strieq(p, "linesize")) {
+ if (!arg)
+ error("'linesize' region option requires argument in"
+ " parentheses");
+ else {
+ if (sscanf(arg, "%d", &opt->linesize) != 1)
+ error("invalid argument to 'linesize' region option: '%1'",
+ arg);
+ else if (opt->linesize <= 0) {
+ error("'linesize' region option argument must be positive");
+ opt->linesize = 0;
+ }
+ }
+ }
+ else if (strieq(p, "delim")) {
+ if (!arg)
+ error("'delim' region option requires argument in parentheses");
+ else if (arg[0] == '\0' || arg[1] == '\0' || arg[2] != '\0')
+ error("argument to 'delim' option must be two characters");
+ else {
+ opt->delim[0] = arg[0];
+ opt->delim[1] = arg[1];
+ }
+ }
+ else if (strieq(p, "center") || strieq(p, "centre")) {
+ if (arg)
+ error("'center' region option does not take an argument");
+ opt->flags |= table::CENTER;
+ }
+ else if (strieq(p, "expand")) {
+ if (arg)
+ error("'expand' region option does not take an argument");
+ opt->flags |= table::EXPAND;
+ opt->flags |= table::GAP_EXPAND;
+ }
+ else if (strieq(p, "box") || strieq(p, "frame")) {
+ if (arg)
+ error("'box' region option does not take an argument");
+ opt->flags |= table::BOX;
+ }
+ else if (strieq(p, "doublebox") || strieq(p, "doubleframe")) {
+ if (arg)
+ error("'doublebox' region option does not take an argument");
+ opt->flags |= table::DOUBLEBOX;
+ }
+ else if (strieq(p, "allbox")) {
+ if (arg)
+ error("'allbox' region option does not take an argument");
+ opt->flags |= table::ALLBOX;
+ }
+ else if (strieq(p, "nokeep")) {
+ if (arg)
+ error("'nokeep' region option does not take an argument");
+ opt->flags |= table::NOKEEP;
+ }
+ else if (strieq(p, "nospaces")) {
+ if (arg)
+ error("'nospaces' region option does not take an argument");
+ opt->flags |= table::NOSPACES;
+ }
+ else if (strieq(p, "nowarn")) {
+ if (arg)
+ error("'nowarn' region option does not take an argument");
+ opt->flags |= table::NOWARN;
+ }
+ else if (strieq(p, "decimalpoint")) {
+ if (!arg)
+ error("'decimalpoint' region option requires argument in"
+ " parentheses");
+ else {
+ if (arg[0] == '\0' || arg[1] != '\0')
+ error("'decimalpoint' region option argument must be a single"
+ " character");
+ else
+ opt->decimal_point_char = arg[0];
+ }
+ }
+ else if (strieq(p, "experimental")) {
+ opt->flags |= table::EXPERIMENTAL;
+ }
+ else {
+ error("unrecognized region option '%1'", p);
+ // delete opt;
+ // return 0;
+ }
+ p = q;
+ }
+ return opt;
+}
+
+entry_modifier::entry_modifier()
+: vertical_alignment(CENTER), zero_width(0), stagger(0)
+{
+ vertical_spacing.inc = vertical_spacing.val = 0;
+ point_size.inc = point_size.val = 0;
+}
+
+entry_modifier::~entry_modifier()
+{
+}
+
+entry_format::entry_format() : type(FORMAT_LEFT)
+{
+}
+
+entry_format::entry_format(format_type t) : type(t)
+{
+}
+
+void entry_format::debug_print() const
+{
+ switch (type) {
+ case FORMAT_LEFT:
+ putc('l', stderr);
+ break;
+ case FORMAT_CENTER:
+ putc('c', stderr);
+ break;
+ case FORMAT_RIGHT:
+ putc('r', stderr);
+ break;
+ case FORMAT_NUMERIC:
+ putc('n', stderr);
+ break;
+ case FORMAT_ALPHABETIC:
+ putc('a', stderr);
+ break;
+ case FORMAT_SPAN:
+ putc('s', stderr);
+ break;
+ case FORMAT_VSPAN:
+ putc('^', stderr);
+ break;
+ case FORMAT_HLINE:
+ putc('_', stderr);
+ break;
+ case FORMAT_DOUBLE_HLINE:
+ putc('=', stderr);
+ break;
+ default:
+ assert(0 == "invalid column classifier in switch");
+ break;
+ }
+ if (point_size.val != 0) {
+ putc('p', stderr);
+ if (point_size.inc > 0)
+ putc('+', stderr);
+ else if (point_size.inc < 0)
+ putc('-', stderr);
+ fprintf(stderr, "%d ", point_size.val);
+ }
+ if (vertical_spacing.val != 0) {
+ putc('v', stderr);
+ if (vertical_spacing.inc > 0)
+ putc('+', stderr);
+ else if (vertical_spacing.inc < 0)
+ putc('-', stderr);
+ fprintf(stderr, "%d ", vertical_spacing.val);
+ }
+ if (!font.empty()) {
+ putc('f', stderr);
+ put_string(font, stderr);
+ putc(' ', stderr);
+ }
+ if (!macro.empty()) {
+ putc('m', stderr);
+ put_string(macro, stderr);
+ putc(' ', stderr);
+ }
+ switch (vertical_alignment) {
+ case entry_modifier::CENTER:
+ break;
+ case entry_modifier::TOP:
+ putc('t', stderr);
+ break;
+ case entry_modifier::BOTTOM:
+ putc('d', stderr);
+ break;
+ }
+ if (zero_width)
+ putc('z', stderr);
+ if (stagger)
+ putc('u', stderr);
+}
+
+struct format {
+ int nrows;
+ int ncolumns;
+ int *separation;
+ string *width;
+ char *equal;
+ char *expand;
+ entry_format **entry;
+ char **vline;
+
+ format(int nr, int nc);
+ ~format();
+ void add_rows(int n);
+};
+
+format::format(int nr, int nc) : nrows(nr), ncolumns(nc)
+{
+ int i;
+ separation = ncolumns > 1 ? new int[ncolumns - 1] : 0;
+ for (i = 0; i < ncolumns-1; i++)
+ separation[i] = -1;
+ width = new string[ncolumns];
+ equal = new char[ncolumns];
+ expand = new char[ncolumns];
+ for (i = 0; i < ncolumns; i++) {
+ equal[i] = 0;
+ expand[i] = 0;
+ }
+ entry = new entry_format *[nrows];
+ for (i = 0; i < nrows; i++)
+ entry[i] = new entry_format[ncolumns];
+ vline = new char*[nrows];
+ for (i = 0; i < nrows; i++) {
+ vline[i] = new char[ncolumns+1];
+ for (int j = 0; j < ncolumns+1; j++)
+ vline[i][j] = 0;
+ }
+}
+
+void format::add_rows(int n)
+{
+ int i;
+ char **old_vline = vline;
+ vline = new char*[nrows + n];
+ for (i = 0; i < nrows; i++)
+ vline[i] = old_vline[i];
+ delete[] old_vline;
+ for (i = 0; i < n; i++) {
+ vline[nrows + i] = new char[ncolumns + 1];
+ for (int j = 0; j < ncolumns + 1; j++)
+ vline[nrows + i][j] = 0;
+ }
+ entry_format **old_entry = entry;
+ entry = new entry_format *[nrows + n];
+ for (i = 0; i < nrows; i++)
+ entry[i] = old_entry[i];
+ delete[] old_entry;
+ for (i = 0; i < n; i++)
+ entry[nrows + i] = new entry_format[ncolumns];
+ nrows += n;
+}
+
+format::~format()
+{
+ delete[] separation;
+ delete[] width;
+ delete[] equal;
+ delete[] expand;
+ for (int i = 0; i < nrows; i++) {
+ delete[] vline[i];
+ delete[] entry[i];
+ }
+ delete[] vline;
+ delete[] entry;
+}
+
+struct input_entry_format : public entry_format {
+ input_entry_format *next;
+ string width;
+ int separation;
+ int vline;
+ int vline_count;
+ bool is_last_column;
+ bool is_equal_width;
+ int expand;
+ input_entry_format(format_type, input_entry_format * = 0);
+ ~input_entry_format();
+ void debug_print();
+};
+
+input_entry_format::input_entry_format(format_type t, input_entry_format *p)
+: entry_format(t), next(p)
+{
+ separation = -1;
+ is_last_column = false;
+ vline = 0;
+ vline_count = 0;
+ is_equal_width = false;
+ expand = 0;
+}
+
+input_entry_format::~input_entry_format()
+{
+}
+
+void free_input_entry_format_list(input_entry_format *list)
+{
+ while (list) {
+ input_entry_format *tem = list;
+ list = list->next;
+ delete tem;
+ }
+}
+
+void input_entry_format::debug_print()
+{
+ int i;
+ for (i = 0; i < vline_count; i++)
+ putc('|', stderr);
+ entry_format::debug_print();
+ if (!width.empty()) {
+ putc('w', stderr);
+ putc('(', stderr);
+ put_string(width, stderr);
+ putc(')', stderr);
+ }
+ if (is_equal_width)
+ putc('e', stderr);
+ if (expand)
+ putc('x', stderr);
+ if (separation >= 0)
+ fprintf(stderr, "%d", separation);
+ for (i = 0; i < vline; i++)
+ putc('|', stderr);
+ if (is_last_column)
+ putc(',', stderr);
+}
+
+// Interpret a table format specification, like "CC,LR.". Return null
+// pointer if we should give up on this table. If this is a
+// continuation format line, `current_format` will be the current format
+// line.
+format *process_format(table_input &in, options *opt,
+ format *current_format = 0)
+{
+ input_entry_format *list = 0 /* nullptr */;
+ bool have_expand = false;
+ bool is_first_row = true;
+ int c = in.get();
+ for (;;) {
+ int vline_count = 0;
+ bool got_format = false;
+ bool got_period = false;
+ format_type t = FORMAT_LEFT;
+ for (;;) {
+ if (c == EOF) {
+ error("end of input while processing table format"
+ " specification");
+ free_input_entry_format_list(list);
+ list = 0 /* nullptr */;
+ return 0 /* nullptr */;
+ }
+ switch (c) {
+ case 'n':
+ case 'N':
+ t = FORMAT_NUMERIC;
+ got_format = true;
+ break;
+ case 'a':
+ case 'A':
+ got_format = true;
+ t = FORMAT_ALPHABETIC;
+ break;
+ case 'c':
+ case 'C':
+ got_format = true;
+ t = FORMAT_CENTER;
+ break;
+ case 'l':
+ case 'L':
+ got_format = true;
+ t = FORMAT_LEFT;
+ break;
+ case 'r':
+ case 'R':
+ got_format = true;
+ t = FORMAT_RIGHT;
+ break;
+ case 's':
+ case 'S':
+ got_format = true;
+ t = FORMAT_SPAN;
+ break;
+ case '^':
+ got_format = true;
+ t = FORMAT_VSPAN;
+ break;
+ case '_':
+ case '-': // tbl also accepts this
+ got_format = true;
+ t = FORMAT_HLINE;
+ if (is_first_row)
+ opt->flags |= table::HAS_TOP_HLINE;
+ break;
+ case '=':
+ got_format = true;
+ t = FORMAT_DOUBLE_HLINE;
+ break;
+ case '.':
+ got_period = true;
+ break;
+ case '|':
+ // leading vertical line in row
+ opt->flags |= table::HAS_TOP_VLINE;
+ vline_count++;
+ // list->vline_count is updated later
+ break;
+ case ' ':
+ case '\t':
+ case '\n':
+ break;
+ default:
+ if (c == opt->tab_char)
+ break;
+ error("invalid column classifier '%1'", char(c));
+ free_input_entry_format_list(list);
+ list = 0 /* nullptr */;
+ return 0 /* nullptr */;
+ }
+ if (got_period)
+ break;
+ c = in.get();
+ if (got_format)
+ break;
+ }
+ if (got_period)
+ break;
+ list = new input_entry_format(t, list);
+ if (vline_count > 2) {
+ vline_count = 2;
+ error("more than 2 vertical lines at beginning of row description");
+ }
+ list->vline_count = vline_count;
+ // Now handle modifiers.
+ vline_count = 0;
+ bool is_valid_modifier_sequence = true;
+ do {
+ switch (c) {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ {
+ int w = 0;
+ do {
+ w = w*10 + (c - '0');
+ c = in.get();
+ } while (c != EOF && csdigit(c));
+ list->separation = w;
+ }
+ break;
+ case 'B':
+ case 'b':
+ c = in.get();
+ list->font = "B";
+ break;
+ case 'd':
+ case 'D':
+ c = in.get();
+ list->vertical_alignment = entry_modifier::BOTTOM;
+ break;
+ case 'e':
+ case 'E':
+ c = in.get();
+ list->is_equal_width = true;
+ // 'e' and 'x' are mutually exclusive
+ list->expand = 0;
+ break;
+ case 'f':
+ case 'F':
+ do {
+ c = in.get();
+ } while (c == ' ' || c == '\t');
+ if (c == EOF) {
+ error("'f' column modifier missing font name or mounting"
+ " position");
+ break;
+ }
+ if (c == '(') {
+ for (;;) {
+ c = in.get();
+ if (c == EOF || c == ' ' || c == '\t') {
+ error("'f' column modifier missing closing parenthesis");
+ break;
+ }
+ if (c == ')') {
+ c = in.get();
+ break;
+ }
+ list->font += char(c);
+ }
+ }
+ else {
+ list->font = c;
+ char cc = c;
+ c = in.get();
+ if (!csdigit(cc)
+ && c != EOF && c != ' ' && c != '\t' && c != '.' && c != '\n') {
+ list->font += char(c);
+ c = in.get();
+ }
+ }
+ break;
+ case 'I':
+ case 'i':
+ c = in.get();
+ list->font = "I";
+ break;
+ case 'm':
+ case 'M':
+ do {
+ c = in.get();
+ } while (c == ' ' || c == '\t');
+ if (c == EOF) {
+ error("'m' column modifier missing macro name");
+ break;
+ }
+ if (c == '(') {
+ for (;;) {
+ c = in.get();
+ if (c == EOF || c == ' ' || c == '\t') {
+ error("'m' column modifier missing closing parenthesis");
+ break;
+ }
+ if (c == ')') {
+ c = in.get();
+ break;
+ }
+ list->macro += char(c);
+ }
+ }
+ else {
+ list->macro = c;
+ char cc = c;
+ c = in.get();
+ if (!csdigit(cc)
+ && c != EOF && c != ' ' && c != '\t' && c != '.' && c != '\n') {
+ list->macro += char(c);
+ c = in.get();
+ }
+ }
+ break;
+ case 'p':
+ case 'P':
+ {
+ inc_number &ps = list->point_size;
+ ps.val = 0;
+ ps.inc = 0;
+ c = in.get();
+ if (c == '+' || c == '-') {
+ ps.inc = (c == '+' ? 1 : -1);
+ c = in.get();
+ }
+ if (c == EOF || !csdigit(c)) {
+ warning("'p' column modifier must be followed by"
+ " (optionally signed) integer; ignoring");
+ ps.inc = 0;
+ }
+ else {
+ do {
+ ps.val *= 10;
+ ps.val += c - '0';
+ c = in.get();
+ } while (c != EOF && csdigit(c));
+ }
+ if (ps.val > MAX_POINT_SIZE || ps.val < -MAX_POINT_SIZE) {
+ warning("'p' column modifier argument magnitude of %1"
+ " points out of range (> %2); ignoring", ps.val,
+ MAX_POINT_SIZE);
+ ps.val = 0;
+ ps.inc = 0;
+ }
+ break;
+ }
+ case 't':
+ case 'T':
+ c = in.get();
+ list->vertical_alignment = entry_modifier::TOP;
+ break;
+ case 'u':
+ case 'U':
+ c = in.get();
+ list->stagger = 1;
+ break;
+ case 'v':
+ case 'V':
+ {
+ inc_number &vs = list->vertical_spacing;
+ vs.val = 0;
+ vs.inc = 0;
+ c = in.get();
+ if (c == '+' || c == '-') {
+ vs.inc = (c == '+' ? 1 : -1);
+ c = in.get();
+ }
+ if (c == EOF || !csdigit(c)) {
+ warning("'v' column modifier must be followed by"
+ " (optionally signed) integer; ignoring");
+ vs.inc = 0;
+ }
+ else {
+ do {
+ vs.val *= 10;
+ vs.val += c - '0';
+ c = in.get();
+ } while (c != EOF && csdigit(c));
+ }
+ if (vs.val > MAX_VERTICAL_SPACING
+ || vs.val < -MAX_VERTICAL_SPACING) {
+ warning("'v' column modifier argument magnitude of %1"
+ " points out of range (> %2); ignoring", vs.val,
+ MAX_VERTICAL_SPACING);
+ vs.val = 0;
+ vs.inc = 0;
+ }
+ break;
+ }
+ case 'w':
+ case 'W':
+ c = in.get();
+ while (c == ' ' || c == '\t')
+ c = in.get();
+ if (c == '(') {
+ list->width = "";
+ c = in.get();
+ while (c != ')') {
+ if (c == EOF || c == '\n') {
+ error("'w' column modifier missing closing parenthesis");
+ free_input_entry_format_list(list);
+ list = 0 /* nullptr */;
+ return 0 /* nullptr */;
+ }
+ list->width += c;
+ c = in.get();
+ }
+ c = in.get();
+ }
+ else {
+ if (c == '+' || c == '-') {
+ list->width = char(c);
+ c = in.get();
+ }
+ else
+ list->width = "";
+ if (c == EOF || !csdigit(c))
+ error("invalid argument to 'w' modifier");
+ else {
+ do {
+ list->width += char(c);
+ c = in.get();
+ } while (c != EOF && csdigit(c));
+ }
+ }
+ // 'w' and 'x' are mutually exclusive
+ list->expand = 0;
+ break;
+ case 'x':
+ case 'X':
+ c = in.get();
+ list->expand = 1;
+ // 'x' and 'e' are mutually exclusive
+ list->is_equal_width = false;
+ // 'x' and 'w' are mutually exclusive
+ list->width = "";
+ break;
+ case 'z':
+ case 'Z':
+ c = in.get();
+ list->zero_width = 1;
+ break;
+ case '|':
+ if (is_first_row)
+ opt->flags |= table::HAS_TOP_VLINE;
+ c = in.get();
+ vline_count++;
+ break;
+ case ' ':
+ case '\t':
+ c = in.get();
+ break;
+ default:
+ if (c == opt->tab_char)
+ c = in.get();
+ else
+ is_valid_modifier_sequence = false;
+ break;
+ }
+ } while (is_valid_modifier_sequence);
+ if (vline_count > 2) {
+ vline_count = 2;
+ error("more than 2 vertical lines after column descriptor");
+ }
+ list->vline += vline_count;
+ if (c == '\n' || c == ',') {
+ vline_count = 0;
+ is_first_row = false;
+ c = in.get();
+ list->is_last_column = true;
+ }
+ }
+ if (c == '.') {
+ do {
+ c = in.get();
+ } while (c == ' ' || c == '\t');
+ if (c != '\n') {
+ error("'.' is not the last character of the table format");
+ free_input_entry_format_list(list);
+ list = 0 /* nullptr */;
+ return 0 /* nullptr */;
+ }
+ }
+ if (!list) {
+ error("table format specification is empty");
+ free_input_entry_format_list(list);
+ list = 0 /* nullptr */;
+ return 0 /* nullptr */;
+ }
+ list->is_last_column = true;
+ // now reverse the list so that the first row is at the beginning
+ input_entry_format *rev = 0;
+ while (list != 0) {
+ input_entry_format *tem = list->next;
+ list->next = rev;
+ rev = list;
+ list = tem;
+ }
+ list = rev;
+ input_entry_format *tem;
+
+#if 0
+ for (tem = list; tem; tem = tem->next)
+ tem->debug_print();
+ putc('\n', stderr);
+#endif
+ // compute number of columns and rows
+ int ncolumns = 0;
+ int nrows = 0;
+ int col = 0;
+ for (tem = list; tem; tem = tem->next) {
+ if (tem->is_last_column) {
+ if (col >= ncolumns)
+ ncolumns = col + 1;
+ col = 0;
+ nrows++;
+ }
+ else
+ col++;
+ }
+ int row;
+ format *f;
+ if (current_format) {
+ if (ncolumns > current_format->ncolumns) {
+ error("cannot increase the number of columns in a continued format");
+ free_input_entry_format_list(list);
+ list = 0 /* nullptr */;
+ return 0 /* nullptr */;
+ }
+ f = current_format;
+ row = f->nrows;
+ f->add_rows(nrows);
+ }
+ else {
+ f = new format(nrows, ncolumns);
+ row = 0;
+ }
+ col = 0;
+ for (tem = list; tem; tem = tem->next) {
+ f->entry[row][col] = *tem;
+ if (col < ncolumns - 1) {
+ // use the greatest separation
+ if (tem->separation > f->separation[col]) {
+ if (current_format)
+ error("cannot change column separation in continued format");
+ else
+ f->separation[col] = tem->separation;
+ }
+ }
+ else if (tem->separation >= 0)
+ error("column separation specified for last column");
+ if (tem->is_equal_width && !f->equal[col]) {
+ if (current_format)
+ error("cannot change which columns are equal in continued format");
+ else
+ f->equal[col] = 1;
+ }
+ if (tem->expand && !f->expand[col]) {
+ if (current_format)
+ error("cannot change which columns are expanded in continued format");
+ else {
+ f->expand[col] = 1;
+ have_expand = true;
+ }
+ }
+ if (!tem->width.empty()) {
+ // use the last width
+ if (!f->width[col].empty() && f->width[col] != tem->width)
+ error("multiple widths for column %1", col + 1);
+ f->width[col] = tem->width;
+ }
+ if (tem->vline_count)
+ f->vline[row][col] = tem->vline_count;
+ f->vline[row][col + 1] = tem->vline;
+ if (tem->is_last_column) {
+ row++;
+ col = 0;
+ }
+ else
+ col++;
+ }
+ free_input_entry_format_list(list);
+ list = 0 /* nullptr */;
+ for (col = 0; col < ncolumns; col++) {
+ entry_format *e = f->entry[f->nrows - 1] + col;
+ if (e->type != FORMAT_HLINE
+ && e->type != FORMAT_DOUBLE_HLINE
+ && e->type != FORMAT_SPAN)
+ break;
+ }
+ if (col >= ncolumns) {
+ error("last row of format is all lines");
+ delete f;
+ return 0 /* nullptr */;
+ }
+ if (have_expand && (opt->flags & table::EXPAND)) {
+ error("'x' column modifier encountered; ignoring region option"
+ " 'expand'");
+ opt->flags &= ~table::EXPAND;
+ }
+ return f;
+}
+
+table *process_data(table_input &in, format *f, options *opt)
+{
+ char tab_char = opt->tab_char;
+ int ncolumns = f->ncolumns;
+ int current_row = 0;
+ int format_index = 0;
+ bool give_up = false;
+ enum { DATA_INPUT_LINE, TROFF_INPUT_LINE, SINGLE_HLINE, DOUBLE_HLINE } type;
+ table *tbl = new table(ncolumns, opt->flags, opt->linesize,
+ opt->decimal_point_char);
+ if (opt->delim[0] != '\0')
+ tbl->set_delim(opt->delim[0], opt->delim[1]);
+ for (;;) {
+ // first determine what type of line this is
+ int c = in.get();
+ if (c == EOF)
+ break;
+ if (c == '.') {
+ int d = in.get();
+ if (d != EOF && csdigit(d)) {
+ in.unget(d);
+ type = DATA_INPUT_LINE;
+ }
+ else {
+ in.unget(d);
+ type = TROFF_INPUT_LINE;
+ }
+ }
+ else if (c == '_' || c == '=') {
+ int d = in.get();
+ if (d == '\n') {
+ if (c == '_')
+ type = SINGLE_HLINE;
+ else
+ type = DOUBLE_HLINE;
+ if (0 == current_row)
+ tbl->flags |= table::HAS_TOP_HLINE;
+ }
+ else {
+ in.unget(d);
+ type = DATA_INPUT_LINE;
+ }
+ }
+ else {
+ type = DATA_INPUT_LINE;
+ }
+ switch (type) {
+ case DATA_INPUT_LINE:
+ {
+ string input_entry;
+ if (format_index >= f->nrows)
+ format_index = f->nrows - 1;
+ // A format row that is all lines doesn't use up a data line.
+ while (format_index < f->nrows - 1) {
+ int cnt;
+ for (cnt = 0; cnt < ncolumns; cnt++) {
+ entry_format *e = f->entry[format_index] + cnt;
+ if (e->type != FORMAT_HLINE
+ && e->type != FORMAT_DOUBLE_HLINE
+ // Unfortunately tbl treats a span as needing data.
+ // && e->type != FORMAT_SPAN
+ )
+ break;
+ }
+ if (cnt < ncolumns)
+ break;
+ for (cnt = 0; cnt < ncolumns; cnt++)
+ tbl->add_entry(current_row, cnt, input_entry,
+ f->entry[format_index] + cnt, current_filename,
+ current_lineno);
+ tbl->add_vlines(current_row, f->vline[format_index]);
+ format_index++;
+ current_row++;
+ }
+ entry_format *line_format = f->entry[format_index];
+ int col = 0;
+ bool seen_row_comment = false;
+ for (;;) {
+ if (c == tab_char || c == '\n') {
+ int ln = current_lineno;
+ if (c == '\n')
+ --ln;
+ if ((opt->flags & table::NOSPACES))
+ input_entry.remove_spaces();
+ while (col < ncolumns
+ && line_format[col].type == FORMAT_SPAN) {
+ tbl->add_entry(current_row, col, "", &line_format[col],
+ current_filename, ln);
+ col++;
+ }
+ if (c == '\n' && input_entry.length() == 2
+ && input_entry[0] == 'T' && input_entry[1] == '{') {
+ input_entry = "";
+ ln++;
+ enum {
+ START, MIDDLE, GOT_T, GOT_RIGHT_BRACE, GOT_DOT,
+ GOT_l, GOT_lf, END
+ } state = START;
+ while (state != END) {
+ c = in.get();
+ if (c == EOF)
+ break;
+ switch (state) {
+ case START:
+ if (c == 'T')
+ state = GOT_T;
+ else if (c == '.')
+ state = GOT_DOT;
+ else {
+ input_entry += c;
+ if (c != '\n')
+ state = MIDDLE;
+ }
+ break;
+ case GOT_T:
+ if (c == '}')
+ state = GOT_RIGHT_BRACE;
+ else {
+ input_entry += 'T';
+ input_entry += c;
+ state = c == '\n' ? START : MIDDLE;
+ }
+ break;
+ case GOT_DOT:
+ if (c == 'l')
+ state = GOT_l;
+ else {
+ input_entry += '.';
+ input_entry += c;
+ state = c == '\n' ? START : MIDDLE;
+ }
+ break;
+ case GOT_l:
+ if (c == 'f')
+ state = GOT_lf;
+ else {
+ input_entry += ".l";
+ input_entry += c;
+ state = c == '\n' ? START : MIDDLE;
+ }
+ break;
+ case GOT_lf:
+ if (c == ' ' || c == '\n' || compatible_flag) {
+ string args;
+ input_entry += ".lf";
+ while (c != EOF) {
+ args += c;
+ if (c == '\n')
+ break;
+ c = in.get();
+ }
+ args += '\0';
+ interpret_lf_args(args.contents());
+ // remove the '\0'
+ args.set_length(args.length() - 1);
+ input_entry += args;
+ state = START;
+ }
+ else {
+ input_entry += ".lf";
+ input_entry += c;
+ state = MIDDLE;
+ }
+ break;
+ case GOT_RIGHT_BRACE:
+ if ((opt->flags & table::NOSPACES)) {
+ while (c == ' ')
+ c = in.get();
+ if (c == EOF)
+ break;
+ }
+ if (c == '\n' || c == tab_char)
+ state = END;
+ else {
+ input_entry += 'T';
+ input_entry += '}';
+ input_entry += c;
+ state = MIDDLE;
+ }
+ break;
+ case MIDDLE:
+ if (c == '\n')
+ state = START;
+ input_entry += c;
+ break;
+ case END:
+ default:
+ assert(0 == "invalid `state` in switch");
+ }
+ }
+ if (c == EOF) {
+ error("end of data in middle of text block");
+ give_up = true;
+ break;
+ }
+ }
+ if (col >= ncolumns) {
+ if (!input_entry.empty()) {
+ if (input_entry.length() >= 2
+ && input_entry[0] == '\\'
+ && input_entry[1] == '"')
+ seen_row_comment = true;
+ else if (!seen_row_comment) {
+ if (c == '\n')
+ in.unget(c);
+ input_entry += '\0';
+ error("excess table entry '%1' discarded",
+ input_entry.contents());
+ if (c == '\n')
+ (void)in.get();
+ }
+ }
+ }
+ else
+ tbl->add_entry(current_row, col, input_entry,
+ &line_format[col], current_filename, ln);
+ col++;
+ if (c == '\n')
+ break;
+ input_entry = "";
+ }
+ else
+ input_entry += c;
+ c = in.get();
+ if (c == EOF)
+ break;
+ }
+ if (give_up)
+ break;
+ input_entry = "";
+ for (; col < ncolumns; col++)
+ tbl->add_entry(current_row, col, input_entry, &line_format[col],
+ current_filename, current_lineno - 1);
+ tbl->add_vlines(current_row, f->vline[format_index]);
+ current_row++;
+ format_index++;
+ }
+ break;
+ case TROFF_INPUT_LINE:
+ {
+ string line;
+ int ln = current_lineno;
+ for (;;) {
+ line += c;
+ if (c == '\n')
+ break;
+ c = in.get();
+ if (c == EOF) {
+ break;
+ }
+ }
+ tbl->add_text_line(current_row, line, current_filename, ln);
+ if (line.length() >= 4
+ && line[0] == '.' && line[1] == 'T' && line[2] == '&') {
+ format *newf = process_format(in, opt, f);
+ if (newf == 0)
+ give_up = true;
+ else
+ f = newf;
+ }
+ if (line.length() >= 3
+ && line[0] == '.' && line[1] == 'l' && line[2] == 'f') {
+ line += '\0';
+ interpret_lf_args(line.contents() + 3);
+ }
+ }
+ break;
+ case SINGLE_HLINE:
+ tbl->add_single_hline(current_row);
+ break;
+ case DOUBLE_HLINE:
+ tbl->add_double_hline(current_row);
+ break;
+ default:
+ assert(0 == "invalid `type` in switch");
+ }
+ if (give_up)
+ break;
+ }
+ if (!give_up && current_row == 0) {
+ error("no real data");
+ give_up = true;
+ }
+ if (give_up) {
+ delete tbl;
+ return 0;
+ }
+ // Do this here rather than at the beginning in case continued formats
+ // change it.
+ int i;
+ for (i = 0; i < ncolumns - 1; i++)
+ if (f->separation[i] >= 0)
+ tbl->set_column_separation(i, f->separation[i]);
+ for (i = 0; i < ncolumns; i++)
+ if (!f->width[i].empty())
+ tbl->set_minimum_width(i, f->width[i]);
+ for (i = 0; i < ncolumns; i++)
+ if (f->equal[i])
+ tbl->set_equal_column(i);
+ for (i = 0; i < ncolumns; i++)
+ if (f->expand[i])
+ tbl->set_expand_column(i);
+ return tbl;
+}
+
+void process_table(table_input &in)
+{
+ options *opt = 0 /* nullptr */;
+ format *fmt = 0 /* nullptr */;
+ table *tbl = 0 /* nullptr */;
+ if ((opt = process_options(in)) != 0 /* nullptr */
+ && (fmt = process_format(in, opt)) != 0 /* nullptr */
+ && (tbl = process_data(in, fmt, opt)) != 0 /* nullptr */) {
+ tbl->print();
+ delete tbl;
+ }
+ else {
+ error("giving up on this table region");
+ while (in.get() != EOF)
+ ;
+ }
+ delete opt;
+ delete fmt;
+ if (!in.ended())
+ error("premature end of file");
+}
+
+static void usage(FILE *stream)
+{
+ fprintf(stream,
+"usage: %s [-C] [file ...]\n"
+"usage: %s {-v | --version}\n"
+"usage: %s --help\n",
+ program_name, program_name, program_name);
+}
+
+int main(int argc, char **argv)
+{
+ program_name = argv[0];
+ static char stderr_buf[BUFSIZ];
+ setbuf(stderr, stderr_buf);
+ int opt;
+ static const struct option long_options[] = {
+ { "help", no_argument, 0, CHAR_MAX + 1 },
+ { "version", no_argument, 0, 'v' },
+ { NULL, 0, 0, 0 }
+ };
+ while ((opt = getopt_long(argc, argv, "vC", long_options, NULL))
+ != EOF)
+ switch (opt) {
+ case 'C':
+ compatible_flag = 1;
+ break;
+ case 'v':
+ {
+ printf("GNU tbl (groff) version %s\n", Version_string);
+ exit(EXIT_SUCCESS);
+ break;
+ }
+ case CHAR_MAX + 1: // --help
+ usage(stdout);
+ exit(EXIT_SUCCESS);
+ break;
+ case '?':
+ usage(stderr);
+ exit(EXIT_FAILURE);
+ break;
+ default:
+ assert(0 == "unhandled getopt_long return value");
+ }
+ printf(".if !\\n(.g .ab GNU tbl requires groff extensions; aborting\n"
+ ".do if !dTS .ds TS\n"
+ ".do if !dT& .ds T&\n"
+ ".do if !dTE .ds TE\n");
+ if (argc > optind) {
+ for (int i = optind; i < argc; i++)
+ if (argv[i][0] == '-' && argv[i][1] == '\0') {
+ current_filename = "-";
+ current_lineno = 1;
+ printf(".lf 1 -\n");
+ process_input_file(stdin);
+ }
+ else {
+ errno = 0;
+ FILE *fp = fopen(argv[i], "r");
+ if (fp == 0) {
+ current_filename = 0 /* nullptr */;
+ fatal("can't open '%1': %2", argv[i], strerror(errno));
+ }
+ else {
+ current_lineno = 1;
+ string fn(argv[i]);
+ fn += '\0';
+ normalize_for_lf(fn);
+ current_filename = fn.contents();
+ printf(".lf 1 %s\n", current_filename);
+ process_input_file(fp);
+ }
+ }
+ }
+ else {
+ current_filename = "-";
+ current_lineno = 1;
+ printf(".lf 1 -\n");
+ process_input_file(stdin);
+ }
+ if (ferror(stdout) || fflush(stdout) < 0)
+ fatal("output error");
+ return 0;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/tbl/table.cpp b/src/preproc/tbl/table.cpp
new file mode 100644
index 0000000..c391c90
--- /dev/null
+++ b/src/preproc/tbl/table.cpp
@@ -0,0 +1,3161 @@
+/* Copyright (C) 1989-2023 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "table.h"
+
+#define BAR_HEIGHT ".25m"
+#define DOUBLE_LINE_SEP "2p"
+#define HALF_DOUBLE_LINE_SEP "1p"
+#define LINE_SEP "2p"
+#define BODY_DEPTH ".25m"
+
+const int DEFAULT_COLUMN_SEPARATION = 3;
+
+#define DELIMITER_CHAR "\\[tbl]"
+#define SEPARATION_FACTOR_REG PREFIX "sep"
+#define LEFTOVER_FACTOR_REG PREFIX "leftover"
+#define BOTTOM_REG PREFIX "bot"
+#define RESET_MACRO_NAME PREFIX "init"
+#define LINESIZE_REG PREFIX "lps"
+#define TOP_REG PREFIX "top"
+#define CURRENT_ROW_REG PREFIX "crow"
+#define LAST_PASSED_ROW_REG PREFIX "passed"
+#define TRANSPARENT_STRING_NAME PREFIX "trans"
+#define QUOTE_STRING_NAME PREFIX "quote"
+#define SECTION_DIVERSION_NAME PREFIX "section"
+#define SECTION_DIVERSION_FLAG_REG PREFIX "sflag"
+#define SAVED_VERTICAL_POS_REG PREFIX "vert"
+#define NEED_BOTTOM_RULE_REG PREFIX "brule"
+#define USE_KEEPS_REG PREFIX "usekeeps"
+#define KEEP_MACRO_NAME PREFIX "keep"
+#define RELEASE_MACRO_NAME PREFIX "release"
+#define SAVED_FONT_REG PREFIX "fnt"
+#define SAVED_SIZE_REG PREFIX "sz"
+#define SAVED_FILL_REG PREFIX "fll"
+#define SAVED_INDENT_REG PREFIX "ind"
+#define SAVED_CENTER_REG PREFIX "cent"
+#define SAVED_TABS_NAME PREFIX "tabs"
+#define SAVED_INTER_WORD_SPACE_SIZE PREFIX "ss"
+#define SAVED_INTER_SENTENCE_SPACE_SIZE PREFIX "sss"
+#define TABLE_DIVERSION_NAME PREFIX "table"
+#define TABLE_DIVERSION_FLAG_REG PREFIX "tflag"
+#define TABLE_KEEP_MACRO_NAME PREFIX "tkeep"
+#define TABLE_RELEASE_MACRO_NAME PREFIX "trelease"
+#define NEEDED_REG PREFIX "needed"
+#define REPEATED_MARK_MACRO PREFIX "rmk"
+#define REPEATED_VPT_MACRO PREFIX "rvpt"
+#define SUPPRESS_BOTTOM_REG PREFIX "supbot"
+#define SAVED_DN_REG PREFIX "dn"
+#define SAVED_HYPHENATION_MODE_REG PREFIX "hyphmode"
+#define SAVED_HYPHENATION_LANG_NAME PREFIX "hyphlang"
+#define SAVED_HYPHENATION_MAX_LINES_REG PREFIX "hyphmaxlines"
+#define SAVED_HYPHENATION_MARGIN_REG PREFIX "hyphmargin"
+#define SAVED_HYPHENATION_SPACE_REG PREFIX "hyphspace"
+#define SAVED_NUMBERING_LINENO PREFIX "linenumber"
+#define SAVED_NUMBERING_SUPPRESSION_COUNT PREFIX "linenumbersuppresscnt"
+#define STARTING_PAGE_REG PREFIX "starting-page"
+#define IS_BOXED_REG PREFIX "is-boxed"
+#define PREVIOUS_PAGE_REG PREFIX "previous-page"
+
+// this must be one character
+#define COMPATIBLE_REG PREFIX "c"
+
+// for use with `ig` requests embedded inside macro definitions
+#define NOP_NAME PREFIX "nop"
+
+#define AVAILABLE_WIDTH_REG PREFIX "available-width"
+#define EXPAND_REG PREFIX "expansion-amount"
+
+#define LEADER_REG PREFIX LEADER
+
+#define BLOCK_WIDTH_PREFIX PREFIX "tbw"
+#define BLOCK_DIVERSION_PREFIX PREFIX "tbd"
+#define BLOCK_HEIGHT_PREFIX PREFIX "tbh"
+#define SPAN_WIDTH_PREFIX PREFIX "w"
+#define SPAN_LEFT_NUMERIC_WIDTH_PREFIX PREFIX "lnw"
+#define SPAN_RIGHT_NUMERIC_WIDTH_PREFIX PREFIX "rnw"
+#define SPAN_ALPHABETIC_WIDTH_PREFIX PREFIX "aw"
+#define COLUMN_SEPARATION_PREFIX PREFIX "cs"
+#define ROW_START_PREFIX PREFIX "rs"
+#define COLUMN_START_PREFIX PREFIX "cl"
+#define COLUMN_END_PREFIX PREFIX "ce"
+#define COLUMN_DIVIDE_PREFIX PREFIX "cd"
+#define ROW_TOP_PREFIX PREFIX "rt"
+
+string block_width_reg(int, int);
+string block_diversion_name(int, int);
+string block_height_reg(int, int);
+string span_width_reg(int, int);
+string span_left_numeric_width_reg(int, int);
+string span_right_numeric_width_reg(int, int);
+string span_alphabetic_width_reg(int, int);
+string column_separation_reg(int);
+string row_start_reg(int);
+string column_start_reg(int);
+string column_end_reg(int);
+string column_divide_reg(int);
+string row_top_reg(int);
+
+void set_inline_modifier(const entry_modifier *);
+void restore_inline_modifier(const entry_modifier *);
+void set_modifier(const entry_modifier *);
+int find_decimal_point(const char *, char, const char *);
+
+string an_empty_string;
+int location_force_filename = 0;
+
+void printfs(const char *,
+ const string &arg1 = an_empty_string,
+ const string &arg2 = an_empty_string,
+ const string &arg3 = an_empty_string,
+ const string &arg4 = an_empty_string,
+ const string &arg5 = an_empty_string);
+
+void prints(const string &);
+
+inline void prints(char c)
+{
+ putchar(c);
+}
+
+inline void prints(const char *s)
+{
+ fputs(s, stdout);
+}
+
+void prints(const string &s)
+{
+ if (!s.empty())
+ fwrite(s.contents(), 1, s.length(), stdout);
+}
+
+struct horizontal_span {
+ horizontal_span *next;
+ int start_col;
+ int end_col;
+ horizontal_span(int, int, horizontal_span *);
+};
+
+class single_line_entry;
+class double_line_entry;
+class simple_entry;
+
+class table_entry {
+friend class table;
+ table_entry *next;
+ int input_lineno;
+ const char *input_filename;
+protected:
+ int start_row;
+ int end_row;
+ int start_col;
+ int end_col;
+ const table *parent;
+ const entry_modifier *mod;
+public:
+ void set_location();
+ table_entry(const table *, const entry_modifier *);
+ virtual ~table_entry();
+ virtual int divert(int, const string *, int *, int);
+ virtual void do_width();
+ virtual void do_depth();
+ virtual void print() = 0;
+ virtual void position_vertically() = 0;
+ virtual single_line_entry *to_single_line_entry();
+ virtual double_line_entry *to_double_line_entry();
+ virtual simple_entry *to_simple_entry();
+ virtual int line_type();
+ virtual void note_double_vrule_on_right(int);
+ virtual void note_double_vrule_on_left(int);
+};
+
+class simple_entry : public table_entry {
+public:
+ simple_entry(const table *, const entry_modifier *);
+ void print();
+ void position_vertically();
+ simple_entry *to_simple_entry();
+ virtual void add_tab();
+ virtual void simple_print(int);
+};
+
+class empty_entry : public simple_entry {
+public:
+ empty_entry(const table *, const entry_modifier *);
+ int line_type();
+};
+
+class text_entry : public simple_entry {
+protected:
+ char *contents;
+ void print_contents();
+public:
+ text_entry(const table *, const entry_modifier *, char *);
+ ~text_entry();
+};
+
+void text_entry::print_contents()
+{
+ set_inline_modifier(mod);
+ prints(contents);
+ restore_inline_modifier(mod);
+}
+
+class repeated_char_entry : public text_entry {
+public:
+ repeated_char_entry(const table *, const entry_modifier *, char *);
+ void simple_print(int);
+};
+
+class simple_text_entry : public text_entry {
+public:
+ simple_text_entry(const table *, const entry_modifier *, char *);
+ void do_width();
+};
+
+class left_text_entry : public simple_text_entry {
+public:
+ left_text_entry(const table *, const entry_modifier *, char *);
+ void simple_print(int);
+ void add_tab();
+};
+
+class right_text_entry : public simple_text_entry {
+public:
+ right_text_entry(const table *, const entry_modifier *, char *);
+ void simple_print(int);
+ void add_tab();
+};
+
+class center_text_entry : public simple_text_entry {
+public:
+ center_text_entry(const table *, const entry_modifier *, char *);
+ void simple_print(int);
+ void add_tab();
+};
+
+class numeric_text_entry : public text_entry {
+ int dot_pos;
+public:
+ numeric_text_entry(const table *, const entry_modifier *, char *, int);
+ void do_width();
+ void simple_print(int);
+};
+
+class alphabetic_text_entry : public text_entry {
+public:
+ alphabetic_text_entry(const table *, const entry_modifier *, char *);
+ void do_width();
+ void simple_print(int);
+ void add_tab();
+};
+
+class line_entry : public simple_entry {
+protected:
+ char double_vrule_on_right;
+ char double_vrule_on_left;
+public:
+ line_entry(const table *, const entry_modifier *);
+ void note_double_vrule_on_right(int);
+ void note_double_vrule_on_left(int);
+ void simple_print(int) = 0;
+};
+
+class single_line_entry : public line_entry {
+public:
+ single_line_entry(const table *, const entry_modifier *);
+ void simple_print(int);
+ single_line_entry *to_single_line_entry();
+ int line_type();
+};
+
+class double_line_entry : public line_entry {
+public:
+ double_line_entry(const table *, const entry_modifier *);
+ void simple_print(int);
+ double_line_entry *to_double_line_entry();
+ int line_type();
+};
+
+class short_line_entry : public simple_entry {
+public:
+ short_line_entry(const table *, const entry_modifier *);
+ void simple_print(int);
+ int line_type();
+};
+
+class short_double_line_entry : public simple_entry {
+public:
+ short_double_line_entry(const table *, const entry_modifier *);
+ void simple_print(int);
+ int line_type();
+};
+
+class block_entry : public table_entry {
+ char *contents;
+protected:
+ void do_divert(int, int, const string *, int *, int);
+public:
+ block_entry(const table *, const entry_modifier *, char *);
+ ~block_entry();
+ int divert(int, const string *, int *, int);
+ void do_depth();
+ void position_vertically();
+ void print() = 0;
+};
+
+class left_block_entry : public block_entry {
+public:
+ left_block_entry(const table *, const entry_modifier *, char *);
+ void print();
+};
+
+class right_block_entry : public block_entry {
+public:
+ right_block_entry(const table *, const entry_modifier *, char *);
+ void print();
+};
+
+class center_block_entry : public block_entry {
+public:
+ center_block_entry(const table *, const entry_modifier *, char *);
+ void print();
+};
+
+class alphabetic_block_entry : public block_entry {
+public:
+ alphabetic_block_entry(const table *, const entry_modifier *, char *);
+ void print();
+ int divert(int, const string *, int *, int);
+};
+
+table_entry::table_entry(const table *p, const entry_modifier *m)
+: next(0), input_lineno(-1), input_filename(0),
+ start_row(-1), end_row(-1), start_col(-1), end_col(-1), parent(p), mod(m)
+{
+}
+
+table_entry::~table_entry()
+{
+}
+
+int table_entry::divert(int, const string *, int *, int)
+{
+ return 0;
+}
+
+void table_entry::do_width()
+{
+}
+
+single_line_entry *table_entry::to_single_line_entry()
+{
+ return 0;
+}
+
+double_line_entry *table_entry::to_double_line_entry()
+{
+ return 0;
+}
+
+simple_entry *table_entry::to_simple_entry()
+{
+ return 0;
+}
+
+void table_entry::do_depth()
+{
+}
+
+void table_entry::set_location()
+{
+ set_troff_location(input_filename, input_lineno);
+}
+
+int table_entry::line_type()
+{
+ return -1;
+}
+
+void table_entry::note_double_vrule_on_right(int)
+{
+}
+
+void table_entry::note_double_vrule_on_left(int)
+{
+}
+
+simple_entry::simple_entry(const table *p, const entry_modifier *m)
+: table_entry(p, m)
+{
+}
+
+void simple_entry::add_tab()
+{
+ // do nothing
+}
+
+void simple_entry::simple_print(int)
+{
+ // do nothing
+}
+
+void simple_entry::position_vertically()
+{
+ if (start_row != end_row)
+ switch (mod->vertical_alignment) {
+ case entry_modifier::TOP:
+ printfs(".sp |\\n[%1]u\n", row_start_reg(start_row));
+ break;
+ case entry_modifier::CENTER:
+ // Perform the motion in two stages so that the center is rounded
+ // vertically upwards even if net vertical motion is upwards.
+ printfs(".sp |\\n[%1]u\n", row_start_reg(start_row));
+ printfs(".sp \\n[" BOTTOM_REG "]u-\\n[%1]u-1v/2u\n",
+ row_start_reg(start_row));
+ break;
+ case entry_modifier::BOTTOM:
+ printfs(".sp |\\n[%1]u+\\n[" BOTTOM_REG "]u-\\n[%1]u-1v\n",
+ row_start_reg(start_row));
+ break;
+ default:
+ assert(0 == "simple entry vertical position modifier not TOP,"
+ " CENTER, or BOTTOM");
+ }
+}
+
+void simple_entry::print()
+{
+ prints(".ta");
+ add_tab();
+ prints('\n');
+ set_location();
+ prints("\\&");
+ simple_print(0);
+ prints('\n');
+}
+
+simple_entry *simple_entry::to_simple_entry()
+{
+ return this;
+}
+
+empty_entry::empty_entry(const table *p, const entry_modifier *m)
+: simple_entry(p, m)
+{
+}
+
+int empty_entry::line_type()
+{
+ return 0;
+}
+
+text_entry::text_entry(const table *p, const entry_modifier *m, char *s)
+: simple_entry(p, m), contents(s)
+{
+}
+
+text_entry::~text_entry()
+{
+ free(contents);
+}
+
+repeated_char_entry::repeated_char_entry(const table *p,
+ const entry_modifier *m, char *s)
+: text_entry(p, m, s)
+{
+}
+
+void repeated_char_entry::simple_print(int)
+{
+ printfs("\\h'|\\n[%1]u'", column_start_reg(start_col));
+ set_inline_modifier(mod);
+ printfs("\\l" DELIMITER_CHAR "\\n[%1]u\\&",
+ span_width_reg(start_col, end_col));
+ prints(contents);
+ prints(DELIMITER_CHAR);
+ restore_inline_modifier(mod);
+}
+
+simple_text_entry::simple_text_entry(const table *p,
+ const entry_modifier *m, char *s)
+: text_entry(p, m, s)
+{
+}
+
+void simple_text_entry::do_width()
+{
+ set_location();
+ printfs(".nr %1 \\n[%1]>?\\w" DELIMITER_CHAR,
+ span_width_reg(start_col, end_col));
+ print_contents();
+ prints(DELIMITER_CHAR "\n");
+}
+
+left_text_entry::left_text_entry(const table *p,
+ const entry_modifier *m, char *s)
+: simple_text_entry(p, m, s)
+{
+}
+
+void left_text_entry::simple_print(int)
+{
+ printfs("\\h'|\\n[%1]u'", column_start_reg(start_col));
+ print_contents();
+}
+
+// The only point of this is to make '\a' "work" as in Unix tbl. Grrr.
+
+void left_text_entry::add_tab()
+{
+ printfs(" \\n[%1]u", column_end_reg(end_col));
+}
+
+right_text_entry::right_text_entry(const table *p,
+ const entry_modifier *m, char *s)
+: simple_text_entry(p, m, s)
+{
+}
+
+void right_text_entry::simple_print(int)
+{
+ printfs("\\h'|\\n[%1]u'", column_start_reg(start_col));
+ prints("\002\003");
+ print_contents();
+ prints("\002");
+}
+
+void right_text_entry::add_tab()
+{
+ printfs(" \\n[%1]u", column_end_reg(end_col));
+}
+
+center_text_entry::center_text_entry(const table *p,
+ const entry_modifier *m, char *s)
+: simple_text_entry(p, m, s)
+{
+}
+
+void center_text_entry::simple_print(int)
+{
+ printfs("\\h'|\\n[%1]u'", column_start_reg(start_col));
+ prints("\002\003");
+ print_contents();
+ prints("\003\002");
+}
+
+void center_text_entry::add_tab()
+{
+ printfs(" \\n[%1]u", column_end_reg(end_col));
+}
+
+numeric_text_entry::numeric_text_entry(const table *p,
+ const entry_modifier *m,
+ char *s, int pos)
+: text_entry(p, m, s), dot_pos(pos)
+{
+}
+
+void numeric_text_entry::do_width()
+{
+ if (dot_pos != 0) {
+ set_location();
+ printfs(".nr %1 0\\w" DELIMITER_CHAR,
+ block_width_reg(start_row, start_col));
+ set_inline_modifier(mod);
+ for (int i = 0; i < dot_pos; i++)
+ prints(contents[i]);
+ restore_inline_modifier(mod);
+ prints(DELIMITER_CHAR "\n");
+ printfs(".nr %1 \\n[%1]>?\\n[%2]\n",
+ span_left_numeric_width_reg(start_col, end_col),
+ block_width_reg(start_row, start_col));
+ }
+ else
+ printfs(".nr %1 0\n", block_width_reg(start_row, start_col));
+ if (contents[dot_pos] != '\0') {
+ set_location();
+ printfs(".nr %1 \\n[%1]>?\\w" DELIMITER_CHAR,
+ span_right_numeric_width_reg(start_col, end_col));
+ set_inline_modifier(mod);
+ prints(contents + dot_pos);
+ restore_inline_modifier(mod);
+ prints(DELIMITER_CHAR "\n");
+ }
+}
+
+void numeric_text_entry::simple_print(int)
+{
+ printfs("\\h'|(\\n[%1]u-\\n[%2]u-\\n[%3]u/2u+\\n[%2]u+\\n[%4]u-\\n[%5]u)'",
+ span_width_reg(start_col, end_col),
+ span_left_numeric_width_reg(start_col, end_col),
+ span_right_numeric_width_reg(start_col, end_col),
+ column_start_reg(start_col),
+ block_width_reg(start_row, start_col));
+ print_contents();
+}
+
+alphabetic_text_entry::alphabetic_text_entry(const table *p,
+ const entry_modifier *m,
+ char *s)
+: text_entry(p, m, s)
+{
+}
+
+void alphabetic_text_entry::do_width()
+{
+ set_location();
+ printfs(".nr %1 \\n[%1]>?\\w" DELIMITER_CHAR,
+ span_alphabetic_width_reg(start_col, end_col));
+ print_contents();
+ prints(DELIMITER_CHAR "\n");
+}
+
+void alphabetic_text_entry::simple_print(int)
+{
+ printfs("\\h'|\\n[%1]u'", column_start_reg(start_col));
+ printfs("\\h'\\n[%1]u-\\n[%2]u/2u'",
+ span_width_reg(start_col, end_col),
+ span_alphabetic_width_reg(start_col, end_col));
+ print_contents();
+}
+
+// The only point of this is to make '\a' "work" as in Unix tbl. Grrr.
+
+void alphabetic_text_entry::add_tab()
+{
+ printfs(" \\n[%1]u", column_end_reg(end_col));
+}
+
+block_entry::block_entry(const table *p, const entry_modifier *m, char *s)
+: table_entry(p, m), contents(s)
+{
+}
+
+block_entry::~block_entry()
+{
+ delete[] contents;
+}
+
+void block_entry::position_vertically()
+{
+ if (start_row != end_row)
+ switch(mod->vertical_alignment) {
+ case entry_modifier::TOP:
+ printfs(".sp |\\n[%1]u\n", row_start_reg(start_row));
+ break;
+ case entry_modifier::CENTER:
+ // Perform the motion in two stages so that the center is rounded
+ // vertically upwards even if net vertical motion is upwards.
+ printfs(".sp |\\n[%1]u\n", row_start_reg(start_row));
+ printfs(".sp \\n[" BOTTOM_REG "]u-\\n[%1]u-\\n[%2]u/2u\n",
+ row_start_reg(start_row),
+ block_height_reg(start_row, start_col));
+ break;
+ case entry_modifier::BOTTOM:
+ printfs(".sp |\\n[%1]u+\\n[" BOTTOM_REG "]u-\\n[%1]u-\\n[%2]u\n",
+ row_start_reg(start_row),
+ block_height_reg(start_row, start_col));
+ break;
+ default:
+ assert(0 == "block entry vertical position modifier not TOP,"
+ " CENTER, or BOTTOM");
+ }
+ if (mod->stagger)
+ prints(".sp -.5v\n");
+}
+
+int block_entry::divert(int ncols, const string *mw, int *sep, int do_expand)
+{
+ do_divert(0, ncols, mw, sep, do_expand);
+ return 1;
+}
+
+void block_entry::do_divert(int alphabetic, int ncols, const string *mw,
+ int *sep, int do_expand)
+{
+ int i;
+ for (i = start_col; i <= end_col; i++)
+ if (parent->expand[i])
+ break;
+ if (i > end_col) {
+ if (do_expand)
+ return;
+ }
+ else {
+ if (!do_expand)
+ return;
+ }
+ printfs(".di %1\n", block_diversion_name(start_row, start_col));
+ prints(".if \\n[" SAVED_FILL_REG "] .fi\n"
+ ".in 0\n");
+ prints(".ll ");
+ for (i = start_col; i <= end_col; i++)
+ if (mw[i].empty() && !parent->expand[i])
+ break;
+ if (i > end_col) {
+ // Every column spanned by this entry has a minimum width.
+ for (int j = start_col; j <= end_col; j++) {
+ if (j > start_col) {
+ if (sep)
+ printfs("+%1n", as_string(sep[j - 1]));
+ prints('+');
+ }
+ if (parent->expand[j])
+ prints("\\n[" EXPAND_REG "]u");
+ else
+ printfs("(n;%1)", mw[j]);
+ }
+ printfs(">?\\n[%1]u", span_width_reg(start_col, end_col));
+ }
+ else
+ // Assign each column with a block entry 1/(n+1) of the line
+ // width, where n is the column count.
+ printfs("(u;\\n[%1]>?(\\n[.l]*%2/%3))",
+ span_width_reg(start_col, end_col),
+ as_string(end_col - start_col + 1),
+ as_string(ncols + 1));
+ if (alphabetic)
+ prints("-2n");
+ prints("\n");
+ prints(".ss \\n[" SAVED_INTER_WORD_SPACE_SIZE "]"
+ " \\n[" SAVED_INTER_SENTENCE_SPACE_SIZE "]\n");
+ prints(".cp \\n(" COMPATIBLE_REG "\n");
+ set_modifier(mod);
+ set_location();
+ prints(contents);
+ prints(".br\n.di\n.cp 0\n");
+ if (!mod->zero_width) {
+ if (alphabetic) {
+ printfs(".nr %1 \\n[%1]>?(\\n[dl]+2n)\n",
+ span_width_reg(start_col, end_col));
+ printfs(".nr %1 \\n[%1]>?\\n[dl]\n",
+ span_alphabetic_width_reg(start_col, end_col));
+ }
+ else
+ printfs(".nr %1 \\n[%1]>?\\n[dl]\n",
+ span_width_reg(start_col, end_col));
+ }
+ printfs(".nr %1 \\n[dn]\n", block_height_reg(start_row, start_col));
+ printfs(".nr %1 \\n[dl]\n", block_width_reg(start_row, start_col));
+ prints("." RESET_MACRO_NAME "\n"
+ ".in \\n[" SAVED_INDENT_REG "]u\n"
+ ".nf\n");
+ // the block might have contained .lf commands
+ location_force_filename = 1;
+}
+
+void block_entry::do_depth()
+{
+ printfs(".nr " BOTTOM_REG " \\n[" BOTTOM_REG "]>?(\\n[%1]+\\n[%2])\n",
+ row_start_reg(start_row),
+ block_height_reg(start_row, start_col));
+}
+
+left_block_entry::left_block_entry(const table *p,
+ const entry_modifier *m, char *s)
+: block_entry(p, m, s)
+{
+}
+
+void left_block_entry::print()
+{
+ printfs(".in +\\n[%1]u\n", column_start_reg(start_col));
+ printfs(".%1\n", block_diversion_name(start_row, start_col));
+ prints(".in\n");
+}
+
+right_block_entry::right_block_entry(const table *p,
+ const entry_modifier *m, char *s)
+: block_entry(p, m, s)
+{
+}
+
+void right_block_entry::print()
+{
+ printfs(".in +\\n[%1]u+\\n[%2]u-\\n[%3]u\n",
+ column_start_reg(start_col),
+ span_width_reg(start_col, end_col),
+ block_width_reg(start_row, start_col));
+ printfs(".%1\n", block_diversion_name(start_row, start_col));
+ prints(".in\n");
+}
+
+center_block_entry::center_block_entry(const table *p,
+ const entry_modifier *m, char *s)
+: block_entry(p, m, s)
+{
+}
+
+void center_block_entry::print()
+{
+ printfs(".in +\\n[%1]u+(\\n[%2]u-\\n[%3]u/2u)\n",
+ column_start_reg(start_col),
+ span_width_reg(start_col, end_col),
+ block_width_reg(start_row, start_col));
+ printfs(".%1\n", block_diversion_name(start_row, start_col));
+ prints(".in\n");
+}
+
+alphabetic_block_entry::alphabetic_block_entry(const table *p,
+ const entry_modifier *m,
+ char *s)
+: block_entry(p, m, s)
+{
+}
+
+int alphabetic_block_entry::divert(int ncols, const string *mw, int *sep,
+ int do_expand)
+{
+ do_divert(1, ncols, mw, sep, do_expand);
+ return 1;
+}
+
+void alphabetic_block_entry::print()
+{
+ printfs(".in +\\n[%1]u+(\\n[%2]u-\\n[%3]u/2u)\n",
+ column_start_reg(start_col),
+ span_width_reg(start_col, end_col),
+ span_alphabetic_width_reg(start_col, end_col));
+ printfs(".%1\n", block_diversion_name(start_row, start_col));
+ prints(".in\n");
+}
+
+line_entry::line_entry(const table *p, const entry_modifier *m)
+: simple_entry(p, m), double_vrule_on_right(0), double_vrule_on_left(0)
+{
+}
+
+void line_entry::note_double_vrule_on_right(int is_corner)
+{
+ double_vrule_on_right = is_corner ? 1 : 2;
+}
+
+void line_entry::note_double_vrule_on_left(int is_corner)
+{
+ double_vrule_on_left = is_corner ? 1 : 2;
+}
+
+single_line_entry::single_line_entry(const table *p, const entry_modifier *m)
+: line_entry(p, m)
+{
+}
+
+int single_line_entry::line_type()
+{
+ return 1;
+}
+
+void single_line_entry::simple_print(int dont_move)
+{
+ printfs("\\h'|\\n[%1]u",
+ column_divide_reg(start_col));
+ if (double_vrule_on_left) {
+ prints(double_vrule_on_left == 1 ? "-" : "+");
+ prints(HALF_DOUBLE_LINE_SEP);
+ }
+ prints("'");
+ if (!dont_move)
+ prints("\\v'-" BAR_HEIGHT "'");
+ printfs("\\s[\\n[" LINESIZE_REG "]]" "\\D'l |\\n[%1]u",
+ column_divide_reg(end_col+1));
+ if (double_vrule_on_right) {
+ prints(double_vrule_on_left == 1 ? "+" : "-");
+ prints(HALF_DOUBLE_LINE_SEP);
+ }
+ prints("0'\\s0");
+ if (!dont_move)
+ prints("\\v'" BAR_HEIGHT "'");
+}
+
+single_line_entry *single_line_entry::to_single_line_entry()
+{
+ return this;
+}
+
+double_line_entry::double_line_entry(const table *p,
+ const entry_modifier *m)
+: line_entry(p, m)
+{
+}
+
+int double_line_entry::line_type()
+{
+ return 2;
+}
+
+void double_line_entry::simple_print(int dont_move)
+{
+ if (!dont_move)
+ prints("\\v'-" BAR_HEIGHT "'");
+ printfs("\\h'|\\n[%1]u",
+ column_divide_reg(start_col));
+ if (double_vrule_on_left) {
+ prints(double_vrule_on_left == 1 ? "-" : "+");
+ prints(HALF_DOUBLE_LINE_SEP);
+ }
+ prints("'");
+ printfs("\\v'-" HALF_DOUBLE_LINE_SEP "'"
+ "\\s[\\n[" LINESIZE_REG "]]"
+ "\\D'l |\\n[%1]u",
+ column_divide_reg(end_col+1));
+ if (double_vrule_on_right)
+ prints("-" HALF_DOUBLE_LINE_SEP);
+ prints(" 0'");
+ printfs("\\v'" DOUBLE_LINE_SEP "'"
+ "\\D'l |\\n[%1]u",
+ column_divide_reg(start_col));
+ if (double_vrule_on_right) {
+ prints(double_vrule_on_left == 1 ? "+" : "-");
+ prints(HALF_DOUBLE_LINE_SEP);
+ }
+ prints(" 0'");
+ prints("\\s0"
+ "\\v'-" HALF_DOUBLE_LINE_SEP "'");
+ if (!dont_move)
+ prints("\\v'" BAR_HEIGHT "'");
+}
+
+double_line_entry *double_line_entry::to_double_line_entry()
+{
+ return this;
+}
+
+short_line_entry::short_line_entry(const table *p, const entry_modifier *m)
+: simple_entry(p, m)
+{
+}
+
+int short_line_entry::line_type()
+{
+ return 1;
+}
+
+void short_line_entry::simple_print(int dont_move)
+{
+ if (mod->stagger)
+ prints("\\v'-.5v'");
+ if (!dont_move)
+ prints("\\v'-" BAR_HEIGHT "'");
+ printfs("\\h'|\\n[%1]u'", column_start_reg(start_col));
+ printfs("\\s[\\n[" LINESIZE_REG "]]"
+ "\\D'l \\n[%1]u 0'"
+ "\\s0",
+ span_width_reg(start_col, end_col));
+ if (!dont_move)
+ prints("\\v'" BAR_HEIGHT "'");
+ if (mod->stagger)
+ prints("\\v'.5v'");
+}
+
+short_double_line_entry::short_double_line_entry(const table *p,
+ const entry_modifier *m)
+: simple_entry(p, m)
+{
+}
+
+int short_double_line_entry::line_type()
+{
+ return 2;
+}
+
+void short_double_line_entry::simple_print(int dont_move)
+{
+ if (mod->stagger)
+ prints("\\v'-.5v'");
+ if (!dont_move)
+ prints("\\v'-" BAR_HEIGHT "'");
+ printfs("\\h'|\\n[%2]u'"
+ "\\v'-" HALF_DOUBLE_LINE_SEP "'"
+ "\\s[\\n[" LINESIZE_REG "]]"
+ "\\D'l \\n[%1]u 0'"
+ "\\v'" DOUBLE_LINE_SEP "'"
+ "\\D'l |\\n[%2]u 0'"
+ "\\s0"
+ "\\v'-" HALF_DOUBLE_LINE_SEP "'",
+ span_width_reg(start_col, end_col),
+ column_start_reg(start_col));
+ if (!dont_move)
+ prints("\\v'" BAR_HEIGHT "'");
+ if (mod->stagger)
+ prints("\\v'.5v'");
+}
+
+void set_modifier(const entry_modifier *m)
+{
+ if (!m->font.empty())
+ printfs(".ft %1\n", m->font);
+ if (m->point_size.val != 0) {
+ prints(".ps ");
+ if (m->point_size.inc > 0)
+ prints('+');
+ else if (m->point_size.inc < 0)
+ prints('-');
+ printfs("%1\n", as_string(m->point_size.val));
+ }
+ if (m->vertical_spacing.val != 0) {
+ prints(".vs ");
+ if (m->vertical_spacing.inc > 0)
+ prints('+');
+ else if (m->vertical_spacing.inc < 0)
+ prints('-');
+ printfs("%1\n", as_string(m->vertical_spacing.val));
+ }
+ if (!m->macro.empty())
+ printfs(".%1\n", m->macro);
+}
+
+void set_inline_modifier(const entry_modifier *m)
+{
+ if (!m->font.empty())
+ printfs("\\f[%1]", m->font);
+ if (m->point_size.val != 0) {
+ prints("\\s[");
+ if (m->point_size.inc > 0)
+ prints('+');
+ else if (m->point_size.inc < 0)
+ prints('-');
+ printfs("%1]", as_string(m->point_size.val));
+ }
+ if (m->stagger)
+ prints("\\v'-.5v'");
+}
+
+void restore_inline_modifier(const entry_modifier *m)
+{
+ if (!m->font.empty())
+ prints("\\f[\\n[" SAVED_FONT_REG "]]");
+ if (m->point_size.val != 0)
+ prints("\\s[\\n[" SAVED_SIZE_REG "]]");
+ if (m->stagger)
+ prints("\\v'.5v'");
+}
+
+struct stuff {
+ stuff *next;
+ int row; // occurs before row 'row'
+ char printed; // has it been printed?
+
+ stuff(int);
+ virtual void print(table *) = 0;
+ virtual ~stuff();
+ virtual int is_single_line() { return 0; };
+ virtual int is_double_line() { return 0; };
+};
+
+stuff::stuff(int r) : next(0), row(r), printed(0)
+{
+}
+
+stuff::~stuff()
+{
+}
+
+struct text_stuff : public stuff {
+ string contents;
+ const char *filename;
+ int lineno;
+
+ text_stuff(const string &, int, const char *, int);
+ ~text_stuff();
+ void print(table *);
+};
+
+text_stuff::text_stuff(const string &s, int r, const char *fn, int ln)
+: stuff(r), contents(s), filename(fn), lineno(ln)
+{
+}
+
+text_stuff::~text_stuff()
+{
+}
+
+void text_stuff::print(table *)
+{
+ printed = 1;
+ prints(".cp \\n(" COMPATIBLE_REG "\n");
+ set_troff_location(filename, lineno);
+ prints(contents);
+ prints(".cp 0\n");
+ location_force_filename = 1; // it might have been a .lf command
+}
+
+struct single_hline_stuff : public stuff {
+ single_hline_stuff(int);
+ void print(table *);
+ int is_single_line();
+};
+
+single_hline_stuff::single_hline_stuff(int r) : stuff(r)
+{
+}
+
+void single_hline_stuff::print(table *tbl)
+{
+ printed = 1;
+ tbl->print_single_hline(row);
+}
+
+int single_hline_stuff::is_single_line()
+{
+ return 1;
+}
+
+struct double_hline_stuff : stuff {
+ double_hline_stuff(int);
+ void print(table *);
+ int is_double_line();
+};
+
+double_hline_stuff::double_hline_stuff(int r) : stuff(r)
+{
+}
+
+void double_hline_stuff::print(table *tbl)
+{
+ printed = 1;
+ tbl->print_double_hline(row);
+}
+
+int double_hline_stuff::is_double_line()
+{
+ return 1;
+}
+
+struct vertical_rule {
+ vertical_rule *next;
+ int start_row;
+ int end_row;
+ int col;
+ char is_double;
+ string top_adjust;
+ string bot_adjust;
+
+ vertical_rule(int, int, int, int, vertical_rule *);
+ ~vertical_rule();
+ void contribute_to_bottom_macro(table *);
+ void print();
+};
+
+vertical_rule::vertical_rule(int sr, int er, int c, int dbl,
+ vertical_rule *p)
+: next(p), start_row(sr), end_row(er), col(c), is_double(dbl)
+{
+}
+
+vertical_rule::~vertical_rule()
+{
+}
+
+void vertical_rule::contribute_to_bottom_macro(table *tbl)
+{
+ printfs(".if \\n[" CURRENT_ROW_REG "]>=%1",
+ as_string(start_row));
+ if (end_row != tbl->get_nrows() - 1)
+ printfs("&(\\n[" CURRENT_ROW_REG "]<%1)",
+ as_string(end_row));
+ prints(" \\{\\\n");
+ printfs(". if %1<=\\n[" LAST_PASSED_ROW_REG "] .nr %2 \\n[#T]\n",
+ as_string(start_row),
+ row_top_reg(start_row));
+ const char *offset_table[3];
+ if (is_double) {
+ offset_table[0] = "-" HALF_DOUBLE_LINE_SEP;
+ offset_table[1] = "+" HALF_DOUBLE_LINE_SEP;
+ offset_table[2] = 0;
+ }
+ else {
+ offset_table[0] = "";
+ offset_table[1] = 0;
+ }
+ for (const char **offsetp = offset_table; *offsetp; offsetp++) {
+ prints(". sp -1\n"
+ "\\v'" BODY_DEPTH);
+ if (!bot_adjust.empty())
+ printfs("+%1", bot_adjust);
+ prints("'");
+ printfs("\\h'\\n[%1]u%3'\\s[\\n[" LINESIZE_REG "]]\\D'l 0 |\\n[%2]u-1v",
+ column_divide_reg(col),
+ row_top_reg(start_row),
+ *offsetp);
+ if (!bot_adjust.empty())
+ printfs("-(%1)", bot_adjust);
+ // don't perform the top adjustment if the top is actually #T
+ if (!top_adjust.empty())
+ printfs("+((%1)*(%2>\\n[" LAST_PASSED_ROW_REG "]))",
+ top_adjust,
+ as_string(start_row));
+ prints("'\\s0\n");
+ }
+ prints(".\\}\n");
+}
+
+void vertical_rule::print()
+{
+ printfs("\\*[" TRANSPARENT_STRING_NAME "]"
+ ".if %1<=\\*[" QUOTE_STRING_NAME "]\\n[" LAST_PASSED_ROW_REG "] "
+ ".nr %2 \\*[" QUOTE_STRING_NAME "]\\n[#T]\n",
+ as_string(start_row),
+ row_top_reg(start_row));
+ const char *offset_table[3];
+ if (is_double) {
+ offset_table[0] = "-" HALF_DOUBLE_LINE_SEP;
+ offset_table[1] = "+" HALF_DOUBLE_LINE_SEP;
+ offset_table[2] = 0;
+ }
+ else {
+ offset_table[0] = "";
+ offset_table[1] = 0;
+ }
+ for (const char **offsetp = offset_table; *offsetp; offsetp++) {
+ prints("\\*[" TRANSPARENT_STRING_NAME "].sp -1\n"
+ "\\*[" TRANSPARENT_STRING_NAME "]\\v'" BODY_DEPTH);
+ if (!bot_adjust.empty())
+ printfs("+%1", bot_adjust);
+ prints("'");
+ printfs("\\h'\\n[%1]u%3'"
+ "\\s[\\n[" LINESIZE_REG "]]"
+ "\\D'l 0 |\\*[" QUOTE_STRING_NAME "]\\n[%2]u-1v",
+ column_divide_reg(col),
+ row_top_reg(start_row),
+ *offsetp);
+ if (!bot_adjust.empty())
+ printfs("-(%1)", bot_adjust);
+ // don't perform the top adjustment if the top is actually #T
+ if (!top_adjust.empty())
+ printfs("+((%1)*(%2>\\*[" QUOTE_STRING_NAME "]\\n["
+ LAST_PASSED_ROW_REG "]))",
+ top_adjust,
+ as_string(start_row));
+ prints("'"
+ "\\s0\n");
+ }
+}
+
+table::table(int nc, unsigned f, int ls, char dpc)
+: nrows(0), ncolumns(nc), linesize(ls), decimal_point_char(dpc),
+ vrule_list(0), stuff_list(0), span_list(0),
+ entry_list(0), entry_list_tailp(&entry_list), entry(0),
+ vline(0), row_is_all_lines(0), left_separation(0),
+ right_separation(0), total_separation(0), allocated_rows(0), flags(f)
+{
+ minimum_width = new string[ncolumns];
+ column_separation = ncolumns > 1 ? new int[ncolumns - 1] : 0;
+ equal = new char[ncolumns];
+ expand = new char[ncolumns];
+ int i;
+ for (i = 0; i < ncolumns; i++) {
+ equal[i] = 0;
+ expand[i] = 0;
+ }
+ for (i = 0; i < ncolumns - 1; i++)
+ column_separation[i] = DEFAULT_COLUMN_SEPARATION;
+ delim[0] = delim[1] = '\0';
+}
+
+table::~table()
+{
+ for (int i = 0; i < nrows; i++) {
+ delete[] entry[i];
+ delete[] vline[i];
+ }
+ delete[] entry;
+ delete[] vline;
+ while (entry_list) {
+ table_entry *tem = entry_list;
+ entry_list = entry_list->next;
+ delete tem;
+ }
+ delete[] minimum_width;
+ delete[] column_separation;
+ delete[] equal;
+ delete[] expand;
+ while (stuff_list) {
+ stuff *tem = stuff_list;
+ stuff_list = stuff_list->next;
+ delete tem;
+ }
+ while (vrule_list) {
+ vertical_rule *tem = vrule_list;
+ vrule_list = vrule_list->next;
+ delete tem;
+ }
+ delete[] row_is_all_lines;
+ while (span_list) {
+ horizontal_span *tem = span_list;
+ span_list = span_list->next;
+ delete tem;
+ }
+}
+
+void table::set_delim(char c1, char c2)
+{
+ delim[0] = c1;
+ delim[1] = c2;
+}
+
+void table::set_minimum_width(int c, const string &w)
+{
+ assert(c >= 0 && c < ncolumns);
+ minimum_width[c] = w;
+}
+
+void table::set_column_separation(int c, int n)
+{
+ assert(c >= 0 && c < ncolumns - 1);
+ column_separation[c] = n;
+}
+
+void table::set_equal_column(int c)
+{
+ assert(c >= 0 && c < ncolumns);
+ equal[c] = 1;
+}
+
+void table::set_expand_column(int c)
+{
+ assert(c >= 0 && c < ncolumns);
+ expand[c] = 1;
+}
+
+void table::add_stuff(stuff *p)
+{
+ stuff **pp;
+ for (pp = &stuff_list; *pp; pp = &(*pp)->next)
+ ;
+ *pp = p;
+}
+
+void table::add_text_line(int r, const string &s, const char *filename,
+ int lineno)
+{
+ add_stuff(new text_stuff(s, r, filename, lineno));
+}
+
+void table::add_single_hline(int r)
+{
+ add_stuff(new single_hline_stuff(r));
+}
+
+void table::add_double_hline(int r)
+{
+ add_stuff(new double_hline_stuff(r));
+}
+
+void table::allocate(int r)
+{
+ if (r >= nrows) {
+ typedef table_entry **PPtable_entry; // work around g++ 1.36.1 bug
+ if (r >= allocated_rows) {
+ if (allocated_rows == 0) {
+ allocated_rows = 16;
+ if (allocated_rows <= r)
+ allocated_rows = r + 1;
+ entry = new PPtable_entry[allocated_rows];
+ vline = new char*[allocated_rows];
+ }
+ else {
+ table_entry ***old_entry = entry;
+ int old_allocated_rows = allocated_rows;
+ allocated_rows *= 2;
+ if (allocated_rows <= r)
+ allocated_rows = r + 1;
+ entry = new PPtable_entry[allocated_rows];
+ memcpy(entry, old_entry, sizeof(table_entry**)*old_allocated_rows);
+ delete[] old_entry;
+ char **old_vline = vline;
+ vline = new char*[allocated_rows];
+ memcpy(vline, old_vline, sizeof(char*)*old_allocated_rows);
+ delete[] old_vline;
+ }
+ }
+ assert(allocated_rows > r);
+ while (nrows <= r) {
+ entry[nrows] = new table_entry*[ncolumns];
+ int i;
+ for (i = 0; i < ncolumns; i++)
+ entry[nrows][i] = 0;
+ vline[nrows] = new char[ncolumns+1];
+ for (i = 0; i < ncolumns+1; i++)
+ vline[nrows][i] = 0;
+ nrows++;
+ }
+ }
+}
+
+void table::do_hspan(int r, int c)
+{
+ assert(r >= 0 && c >= 0 && r < nrows && c < ncolumns);
+ if (c == 0) {
+ error("first column cannot be horizontally spanned");
+ return;
+ }
+ table_entry *e = entry[r][c];
+ if (e) {
+ assert(e->start_row <= r && r <= e->end_row
+ && e->start_col <= c && c <= e->end_col
+ && e->end_row - e->start_row > 0
+ && e->end_col - e->start_col > 0);
+ return;
+ }
+ e = entry[r][c-1];
+ // e can be 0 if we had an empty entry or an error
+ if (e == 0)
+ return;
+ if (e->start_row != r) {
+ /*
+ l l
+ ^ s */
+ error("impossible horizontal span at row %1, column %2", r + 1,
+ c + 1);
+ }
+ else {
+ e->end_col = c;
+ entry[r][c] = e;
+ }
+}
+
+void table::do_vspan(int r, int c)
+{
+ assert(r >= 0 && c >= 0 && r < nrows && c < ncolumns);
+ if (0 == r) {
+ error("first row cannot be vertically spanned");
+ return;
+ }
+ table_entry *e = entry[r][c];
+ if (e) {
+ assert(e->start_row <= r);
+ assert(r <= e->end_row);
+ assert(e->start_col <= c);
+ assert(c <= e->end_col);
+ assert((e->end_row - e->start_row) > 0);
+ assert((e->end_col - e->start_col) > 0);
+ return;
+ }
+ e = entry[r-1][c];
+ // e can be a null pointer if we had an empty entry or an error
+ if (0 == e)
+ return;
+ if (e->start_col != c) {
+ /* l s
+ l ^ */
+ error("impossible vertical span at row %1, column %2", r + 1,
+ c + 1);
+ }
+ else {
+ for (int i = c; i <= e->end_col; i++) {
+ assert(entry[r][i] == 0);
+ entry[r][i] = e;
+ }
+ e->end_row = r;
+ }
+}
+
+int find_decimal_point(const char *s, char decimal_point_char,
+ const char *delim)
+{
+ if (s == 0 || *s == '\0')
+ return -1;
+ const char *p;
+ int in_delim = 0; // is p within eqn delimiters?
+ // tbl recognises \& even within eqn delimiters; I don't
+ for (p = s; *p; p++)
+ if (in_delim) {
+ if (*p == delim[1])
+ in_delim = 0;
+ }
+ else if (*p == delim[0])
+ in_delim = 1;
+ else if (p[0] == '\\' && p[1] == '&')
+ return p - s;
+ int possible_pos = -1;
+ in_delim = 0;
+ for (p = s; *p; p++)
+ if (in_delim) {
+ if (*p == delim[1])
+ in_delim = 0;
+ }
+ else if (*p == delim[0])
+ in_delim = 1;
+ else if (p[0] == decimal_point_char && csdigit(p[1]))
+ possible_pos = p - s;
+ if (possible_pos >= 0)
+ return possible_pos;
+ in_delim = 0;
+ for (p = s; *p; p++)
+ if (in_delim) {
+ if (*p == delim[1])
+ in_delim = 0;
+ }
+ else if (*p == delim[0])
+ in_delim = 1;
+ else if (csdigit(*p))
+ possible_pos = p + 1 - s;
+ return possible_pos;
+}
+
+void table::add_entry(int r, int c, const string &str,
+ const entry_format *f, const char *fn, int ln)
+{
+ allocate(r);
+ table_entry *e = 0;
+ char *s = str.extract();
+ if (str.search('\n') >= 0) {
+ bool was_changed = false;
+ for (int i = 0; s[i] != '\0'; i++)
+ if ((i > 0) && (s[(i - 1)] == '\\') && (s[i] == 'R')) {
+ s[i] = '&';
+ was_changed = true;
+ }
+ if (was_changed)
+ error_with_file_and_line(fn, ln, "repeating a glyph with '\\R'"
+ " is not allowed in a text block");
+ }
+ if (str == "\\_") {
+ e = new short_line_entry(this, f);
+ }
+ else if (str == "\\=") {
+ e = new short_double_line_entry(this, f);
+ }
+ else if (str == "_") {
+ single_line_entry *lefte;
+ if (c > 0 && entry[r][c-1] != 0 &&
+ (lefte = entry[r][c-1]->to_single_line_entry()) != 0
+ && lefte->start_row == r
+ && lefte->mod->stagger == f->stagger) {
+ lefte->end_col = c;
+ entry[r][c] = lefte;
+ }
+ else
+ e = new single_line_entry(this, f);
+ }
+ else if (str == "=") {
+ double_line_entry *lefte;
+ if (c > 0 && entry[r][c-1] != 0 &&
+ (lefte = entry[r][c-1]->to_double_line_entry()) != 0
+ && lefte->start_row == r
+ && lefte->mod->stagger == f->stagger) {
+ lefte->end_col = c;
+ entry[r][c] = lefte;
+ }
+ else
+ e = new double_line_entry(this, f);
+ }
+ else if (str == "\\^") {
+ if (r == 0) {
+ error("first row cannot contain a vertical span entry '\\^'");
+ e = new empty_entry(this, f);
+ }
+ else
+ do_vspan(r, c);
+ }
+ else {
+ int is_block = str.search('\n') >= 0;
+ switch (f->type) {
+ case FORMAT_SPAN:
+ assert(str.empty());
+ do_hspan(r, c);
+ break;
+ case FORMAT_LEFT:
+ if (!str.empty()) {
+ if (is_block)
+ e = new left_block_entry(this, f, s);
+ else
+ e = new left_text_entry(this, f, s);
+ }
+ else
+ e = new empty_entry(this, f);
+ break;
+ case FORMAT_CENTER:
+ if (!str.empty()) {
+ if (is_block)
+ e = new center_block_entry(this, f, s);
+ else
+ e = new center_text_entry(this, f, s);
+ }
+ else
+ e = new empty_entry(this, f);
+ break;
+ case FORMAT_RIGHT:
+ if (!str.empty()) {
+ if (is_block)
+ e = new right_block_entry(this, f, s);
+ else
+ e = new right_text_entry(this, f, s);
+ }
+ else
+ e = new empty_entry(this, f);
+ break;
+ case FORMAT_NUMERIC:
+ if (!str.empty()) {
+ if (is_block) {
+ error_with_file_and_line(fn, ln, "can't have numeric text block");
+ e = new left_block_entry(this, f, s);
+ }
+ else {
+ int pos = find_decimal_point(s, decimal_point_char, delim);
+ if (pos < 0)
+ e = new center_text_entry(this, f, s);
+ else
+ e = new numeric_text_entry(this, f, s, pos);
+ }
+ }
+ else
+ e = new empty_entry(this, f);
+ break;
+ case FORMAT_ALPHABETIC:
+ if (!str.empty()) {
+ if (is_block)
+ e = new alphabetic_block_entry(this, f, s);
+ else
+ e = new alphabetic_text_entry(this, f, s);
+ }
+ else
+ e = new empty_entry(this, f);
+ break;
+ case FORMAT_VSPAN:
+ do_vspan(r, c);
+ break;
+ case FORMAT_HLINE:
+ if ((str.length() != 0) && (str != "\\&"))
+ error_with_file_and_line(fn, ln,
+ "ignoring non-empty data entry using"
+ " '_' column classifier");
+ e = new single_line_entry(this, f);
+ break;
+ case FORMAT_DOUBLE_HLINE:
+ if ((str.length() != 0) && (str != "\\&"))
+ error_with_file_and_line(fn, ln,
+ "ignoring non-empty data entry using"
+ " '=' column classifier");
+ e = new double_line_entry(this, f);
+ break;
+ default:
+ assert(0 == "table column format not in FORMAT_{SPAN,LEFT,CENTER,"
+ "RIGHT,NUMERIC,ALPHABETIC,VSPAN,HLINE,DOUBLE_HLINE}");
+ }
+ }
+ if (e) {
+ table_entry *preve = entry[r][c];
+ if (preve) {
+ /* c s
+ ^ l */
+ error_with_file_and_line(fn, ln, "row %1, column %2 already"
+ " spanned",
+ r + 1, c + 1);
+ delete e;
+ }
+ else {
+ e->input_lineno = ln;
+ e->input_filename = fn;
+ e->start_row = e->end_row = r;
+ e->start_col = e->end_col = c;
+ *entry_list_tailp = e;
+ entry_list_tailp = &e->next;
+ entry[r][c] = e;
+ }
+ }
+}
+
+// add vertical lines for row r
+
+void table::add_vlines(int r, const char *v)
+{
+ allocate(r);
+ bool lwarned = false;
+ bool twarned = false;
+ for (int i = 0; i < ncolumns+1; i++) {
+ assert(v[i] < 3);
+ if (v[i] && (flags & (BOX | ALLBOX | DOUBLEBOX)) && (i == 0)
+ && (!lwarned)) {
+ error("ignoring vertical line at leading edge of boxed table");
+ lwarned = true;
+ }
+ else if (v[i] && (flags & (BOX | ALLBOX | DOUBLEBOX))
+ && (i == ncolumns) && (!twarned)) {
+ error("ignoring vertical line at trailing edge of boxed table");
+ twarned = true;
+ }
+ else
+ vline[r][i] = v[i];
+ }
+}
+
+void table::check()
+{
+ table_entry *p = entry_list;
+ int i, j;
+ while (p) {
+ for (i = p->start_row; i <= p->end_row; i++)
+ for (j = p->start_col; j <= p->end_col; j++)
+ assert(entry[i][j] == p);
+ p = p->next;
+ }
+}
+
+void table::print()
+{
+ location_force_filename = 1;
+ check();
+ init_output();
+ determine_row_type();
+ compute_widths();
+ if (!(flags & CENTER))
+ prints(".if \\n[" SAVED_CENTER_REG "] \\{\\\n");
+ prints(". in +(u;\\n[.l]-\\n[.i]-\\n[TW]/2>?-\\n[.i])\n"
+ ". nr " SAVED_INDENT_REG " \\n[.i]\n");
+ if (!(flags & CENTER))
+ prints(".\\}\n");
+ build_vrule_list();
+ define_bottom_macro();
+ do_top();
+ for (int i = 0; i < nrows; i++)
+ do_row(i);
+ do_bottom();
+}
+
+void table::determine_row_type()
+{
+ row_is_all_lines = new char[nrows];
+ for (int i = 0; i < nrows; i++) {
+ bool had_single = false;
+ bool had_double = false;
+ bool had_non_line = false;
+ for (int c = 0; c < ncolumns; c++) {
+ table_entry *e = entry[i][c];
+ if (e != 0) {
+ if (e->start_row == e->end_row) {
+ int t = e->line_type();
+ switch (t) {
+ case -1:
+ had_non_line = true;
+ break;
+ case 0:
+ // empty
+ break;
+ case 1:
+ had_single = true;
+ break;
+ case 2:
+ had_double = true;
+ break;
+ default:
+ assert(0 == "table entry line type not in {-1, 0, 1, 2}");
+ }
+ if (had_non_line)
+ break;
+ }
+ c = e->end_col;
+ }
+ }
+ if (had_non_line)
+ row_is_all_lines[i] = 0;
+ else if (had_double)
+ row_is_all_lines[i] = 2;
+ else if (had_single)
+ row_is_all_lines[i] = 1;
+ else
+ row_is_all_lines[i] = 0;
+ }
+}
+
+int table::count_expand_columns()
+{
+ int count = 0;
+ for (int i = 0; i < ncolumns; i++)
+ if (expand[i])
+ count++;
+ return count;
+}
+
+void table::init_output()
+{
+ prints(".\\\" initialize output\n");
+ prints(".nr " COMPATIBLE_REG " \\n(.C\n"
+ ".cp 0\n");
+ if (linesize > 0)
+ printfs(".nr " LINESIZE_REG " %1\n", as_string(linesize));
+ else
+ prints(".nr " LINESIZE_REG " \\n[.s]\n");
+ if (!(flags & CENTER))
+ prints(".nr " SAVED_CENTER_REG " \\n[.ce]\n");
+ if (compatible_flag)
+ prints(".ds " LEADER_REG " \\a\n");
+ if (!(flags & NOKEEP))
+ prints(".if !r " USE_KEEPS_REG " .nr " USE_KEEPS_REG " 1\n");
+ prints(".de " RESET_MACRO_NAME "\n"
+ ". ft \\n[.f]\n"
+ ". ps \\n[.s]\n"
+ ". vs \\n[.v]u\n"
+ ". in \\n[.i]u\n"
+ ". ll \\n[.l]u\n"
+ ". ls \\n[.L]\n"
+ ". hy \\\\n[" SAVED_HYPHENATION_MODE_REG "]\n"
+ ". hla \\\\*[" SAVED_HYPHENATION_LANG_NAME "]\n"
+ ". hlm \\\\n[" SAVED_HYPHENATION_MAX_LINES_REG "]\n"
+ ". hym \\\\n[" SAVED_HYPHENATION_MARGIN_REG "]\n"
+ ". hys \\\\n[" SAVED_HYPHENATION_SPACE_REG "]\n"
+ ". ad \\n[.j]\n"
+ ". ie \\n[.u] .fi\n"
+ ". el .nf\n"
+ ". ce \\n[.ce]\n"
+ ". ta \\\\*[" SAVED_TABS_NAME "]\n"
+ ". ss \\\\n[" SAVED_INTER_WORD_SPACE_SIZE "]"
+ " \\\\n[" SAVED_INTER_SENTENCE_SPACE_SIZE "]\n"
+ "..\n"
+ ".nr " SAVED_INDENT_REG " \\n[.i]\n"
+ ".nr " SAVED_FONT_REG " \\n[.f]\n"
+ ".nr " SAVED_SIZE_REG " \\n[.s]\n"
+ ".nr " SAVED_FILL_REG " \\n[.u]\n"
+ ".ds " SAVED_TABS_NAME " \\n[.tabs]\n"
+ ".nr " SAVED_INTER_WORD_SPACE_SIZE " \\n[.ss]\n"
+ ".nr " SAVED_INTER_SENTENCE_SPACE_SIZE " \\n[.sss]\n"
+ ".nr " SAVED_HYPHENATION_MODE_REG " \\n[.hy]\n"
+ ".ds " SAVED_HYPHENATION_LANG_NAME " \\n[.hla]\n"
+ ".nr " SAVED_HYPHENATION_MAX_LINES_REG " (\\n[.hlm])\n"
+ ".nr " SAVED_HYPHENATION_MARGIN_REG " \\n[.hym]\n"
+ ".nr " SAVED_HYPHENATION_SPACE_REG " \\n[.hys]\n"
+ ".nr T. 0\n"
+ ".nr " CURRENT_ROW_REG " 0-1\n"
+ ".nr " LAST_PASSED_ROW_REG " 0-1\n"
+ ".nr " SECTION_DIVERSION_FLAG_REG " 0\n"
+ ".ds " TRANSPARENT_STRING_NAME "\n"
+ ".ds " QUOTE_STRING_NAME "\n"
+ ".nr " NEED_BOTTOM_RULE_REG " 1\n"
+ ".nr " SUPPRESS_BOTTOM_REG " 0\n"
+ ".eo\n"
+ ".de " REPEATED_MARK_MACRO "\n"
+ ". mk \\$1\n"
+ ". if !'\\n(.z'' \\!." REPEATED_MARK_MACRO " \"\\$1\"\n"
+ "..\n"
+ ".de " REPEATED_VPT_MACRO "\n"
+ ". vpt \\$1\n"
+ ". if !'\\n(.z'' \\!." REPEATED_VPT_MACRO " \"\\$1\"\n"
+ "..\n");
+ if (!(flags & NOKEEP)) {
+ prints(".de " KEEP_MACRO_NAME "\n"
+ ". if '\\n[.z]'' \\{\\\n"
+ ". ds " QUOTE_STRING_NAME " \\\\\n"
+ ". ds " TRANSPARENT_STRING_NAME " \\!\n"
+ ". di " SECTION_DIVERSION_NAME "\n"
+ ". nr " SECTION_DIVERSION_FLAG_REG " 1\n"
+ ". in 0\n"
+ ". \\}\n"
+ "..\n"
+ // Protect '#' in macro name from being interpreted by eqn.
+ ".ig\n"
+ ".EQ\n"
+ "delim off\n"
+ ".EN\n"
+ "..\n"
+ ".de " RELEASE_MACRO_NAME "\n"
+ ". if \\n[" SECTION_DIVERSION_FLAG_REG "] \\{\\\n"
+ ". di\n"
+ ". in \\n[" SAVED_INDENT_REG "]u\n"
+ ". nr " SAVED_DN_REG " \\n[dn]\n"
+ ". ds " QUOTE_STRING_NAME "\n"
+ ". ds " TRANSPARENT_STRING_NAME "\n"
+ ". nr " SECTION_DIVERSION_FLAG_REG " 0\n"
+ ". if \\n[.t]<=\\n[dn] \\{\\\n"
+ ". nr T. 1\n"
+ ". T#\n"
+ ". nr " SUPPRESS_BOTTOM_REG " 1\n"
+ ". sp \\n[.t]u\n"
+ ". nr " SUPPRESS_BOTTOM_REG " 0\n"
+ ". mk #T\n"
+ ". \\}\n");
+ if (!(flags & NOWARN)) {
+ prints(". if \\n[.t]<=\\n[" SAVED_DN_REG "] \\{\\\n");
+ // eqn(1) delimiters have already been switched off.
+ entry_list->set_location();
+ // Since we turn off traps, troff won't go into an infinite loop
+ // when we output the table row; it will just flow off the bottom
+ // of the page.
+ prints(". tmc \\n[.F]:\\n[.c]: warning:\n"
+ ". tm1 \" table row does not fit on page \\n%\n");
+ prints(". \\}\n");
+ }
+ prints(". nf\n"
+ ". ls 1\n"
+ ". " SECTION_DIVERSION_NAME "\n"
+ ". ls\n"
+ ". rm " SECTION_DIVERSION_NAME "\n"
+ ". \\}\n"
+ "..\n"
+ ".ig\n"
+ ".EQ\n"
+ "delim on\n"
+ ".EN\n"
+ "..\n"
+ ".nr " TABLE_DIVERSION_FLAG_REG " 0\n"
+ ".de " TABLE_KEEP_MACRO_NAME "\n"
+ ". if '\\n[.z]'' \\{\\\n"
+ ". di " TABLE_DIVERSION_NAME "\n"
+ ". nr " TABLE_DIVERSION_FLAG_REG " 1\n"
+ ". \\}\n"
+ "..\n"
+ ".de " TABLE_RELEASE_MACRO_NAME "\n"
+ ". if \\n[" TABLE_DIVERSION_FLAG_REG "] \\{\\\n"
+ ". br\n"
+ ". di\n"
+ ". nr " SAVED_DN_REG " \\n[dn]\n"
+ ". ne \\n[dn]u+\\n[.V]u\n"
+ ". ie \\n[.t]<=\\n[" SAVED_DN_REG "] \\{\\\n");
+ // Protect characters in diagnostic message (especially :, [, ])
+ // from being interpreted by eqn.
+ prints(". ds " NOP_NAME " \\\" empty\n");
+ prints(". ig " NOP_NAME "\n"
+ ".EQ\n"
+ "delim off\n"
+ ".EN\n"
+ ". " NOP_NAME "\n");
+ entry_list->set_location();
+ prints(". nr " PREVIOUS_PAGE_REG " (\\n% - 1)\n"
+ ". tmc \\n[.F]:\\n[.c]: error:\n"
+ ". tmc \" boxed table does not fit on page"
+ " \\n[" PREVIOUS_PAGE_REG "];\n"
+ ". tm1 \" use .TS H/.TH with a supporting macro package"
+ "\n"
+ ". rr " PREVIOUS_PAGE_REG "\n");
+ prints(". ig " NOP_NAME "\n"
+ ".EQ\n"
+ "delim on\n"
+ ".EN\n"
+ ". " NOP_NAME "\n");
+ prints(". \\}\n"
+ ". el \\{\\\n"
+ ". in 0\n"
+ ". ls 1\n"
+ ". nf\n"
+ ". " TABLE_DIVERSION_NAME "\n"
+ ". \\}\n"
+ ". rm " TABLE_DIVERSION_NAME "\n"
+ ". \\}\n"
+ "..\n");
+ }
+ prints(".ec\n"
+ ".ce 0\n");
+ prints(".nr " SAVED_NUMBERING_LINENO " \\n[ln]\n"
+ ".nr ln 0\n"
+ ".nr " SAVED_NUMBERING_SUPPRESSION_COUNT " \\n[.nn]\n"
+ ".nn 2147483647\n"); // 2^31-1; inelegant but effective
+ prints(".nf\n");
+}
+
+string block_width_reg(int r, int c)
+{
+ static char name[sizeof(BLOCK_WIDTH_PREFIX)+INT_DIGITS+1+INT_DIGITS];
+ sprintf(name, BLOCK_WIDTH_PREFIX "%d,%d", r, c);
+ return string(name);
+}
+
+string block_diversion_name(int r, int c)
+{
+ static char name[sizeof(BLOCK_DIVERSION_PREFIX)+INT_DIGITS+1+INT_DIGITS];
+ sprintf(name, BLOCK_DIVERSION_PREFIX "%d,%d", r, c);
+ return string(name);
+}
+
+string block_height_reg(int r, int c)
+{
+ static char name[sizeof(BLOCK_HEIGHT_PREFIX)+INT_DIGITS+1+INT_DIGITS];
+ sprintf(name, BLOCK_HEIGHT_PREFIX "%d,%d", r, c);
+ return string(name);
+}
+
+string span_width_reg(int start_col, int end_col)
+{
+ static char name[sizeof(SPAN_WIDTH_PREFIX)+INT_DIGITS+1+INT_DIGITS];
+ sprintf(name, SPAN_WIDTH_PREFIX "%d", start_col);
+ if (end_col != start_col)
+ sprintf(strchr(name, '\0'), ",%d", end_col);
+ return string(name);
+}
+
+string span_left_numeric_width_reg(int start_col, int end_col)
+{
+ static char name[sizeof(SPAN_LEFT_NUMERIC_WIDTH_PREFIX)+INT_DIGITS+1+INT_DIGITS];
+ sprintf(name, SPAN_LEFT_NUMERIC_WIDTH_PREFIX "%d", start_col);
+ if (end_col != start_col)
+ sprintf(strchr(name, '\0'), ",%d", end_col);
+ return string(name);
+}
+
+string span_right_numeric_width_reg(int start_col, int end_col)
+{
+ static char name[sizeof(SPAN_RIGHT_NUMERIC_WIDTH_PREFIX)+INT_DIGITS+1+INT_DIGITS];
+ sprintf(name, SPAN_RIGHT_NUMERIC_WIDTH_PREFIX "%d", start_col);
+ if (end_col != start_col)
+ sprintf(strchr(name, '\0'), ",%d", end_col);
+ return string(name);
+}
+
+string span_alphabetic_width_reg(int start_col, int end_col)
+{
+ static char name[sizeof(SPAN_ALPHABETIC_WIDTH_PREFIX)+INT_DIGITS+1+INT_DIGITS];
+ sprintf(name, SPAN_ALPHABETIC_WIDTH_PREFIX "%d", start_col);
+ if (end_col != start_col)
+ sprintf(strchr(name, '\0'), ",%d", end_col);
+ return string(name);
+}
+
+string column_separation_reg(int col)
+{
+ static char name[sizeof(COLUMN_SEPARATION_PREFIX)+INT_DIGITS];
+ sprintf(name, COLUMN_SEPARATION_PREFIX "%d", col);
+ return string(name);
+}
+
+string row_start_reg(int row)
+{
+ static char name[sizeof(ROW_START_PREFIX)+INT_DIGITS];
+ sprintf(name, ROW_START_PREFIX "%d", row);
+ return string(name);
+}
+
+string column_start_reg(int col)
+{
+ static char name[sizeof(COLUMN_START_PREFIX)+INT_DIGITS];
+ sprintf(name, COLUMN_START_PREFIX "%d", col);
+ return string(name);
+}
+
+string column_end_reg(int col)
+{
+ static char name[sizeof(COLUMN_END_PREFIX)+INT_DIGITS];
+ sprintf(name, COLUMN_END_PREFIX "%d", col);
+ return string(name);
+}
+
+string column_divide_reg(int col)
+{
+ static char name[sizeof(COLUMN_DIVIDE_PREFIX)+INT_DIGITS];
+ sprintf(name, COLUMN_DIVIDE_PREFIX "%d", col);
+ return string(name);
+}
+
+string row_top_reg(int row)
+{
+ static char name[sizeof(ROW_TOP_PREFIX)+INT_DIGITS];
+ sprintf(name, ROW_TOP_PREFIX "%d", row);
+ return string(name);
+}
+
+void init_span_reg(int start_col, int end_col)
+{
+ printfs(".nr %1 \\n(.H\n.nr %2 0\n.nr %3 0\n.nr %4 0\n",
+ span_width_reg(start_col, end_col),
+ span_alphabetic_width_reg(start_col, end_col),
+ span_left_numeric_width_reg(start_col, end_col),
+ span_right_numeric_width_reg(start_col, end_col));
+}
+
+void compute_span_width(int start_col, int end_col)
+{
+ printfs(".nr %1 \\n[%1]>?(\\n[%2]+\\n[%3])\n"
+ ".if \\n[%4] .nr %1 \\n[%1]>?(\\n[%4]+2n)\n",
+ span_width_reg(start_col, end_col),
+ span_left_numeric_width_reg(start_col, end_col),
+ span_right_numeric_width_reg(start_col, end_col),
+ span_alphabetic_width_reg(start_col, end_col));
+}
+
+// Increase the widths of columns so that the width of any spanning
+// entry is not greater than the sum of the widths of the columns that
+// it spans. Ensure that the widths of columns remain equal.
+
+void table::divide_span(int start_col, int end_col)
+{
+ assert(end_col > start_col);
+ printfs(".nr " NEEDED_REG " \\n[%1]-(\\n[%2]",
+ span_width_reg(start_col, end_col),
+ span_width_reg(start_col, start_col));
+ int i;
+ for (i = start_col + 1; i <= end_col; i++) {
+ // The column separation may shrink with the expand option.
+ if (!(flags & EXPAND))
+ printfs("+%1n", as_string(column_separation[i - 1]));
+ printfs("+\\n[%1]", span_width_reg(i, i));
+ }
+ prints(")\n");
+ printfs(".nr " NEEDED_REG " \\n[" NEEDED_REG "]/%1\n",
+ as_string(end_col - start_col + 1));
+ prints(".if \\n[" NEEDED_REG "] \\{\\\n");
+ for (i = start_col; i <= end_col; i++)
+ printfs(". nr %1 +\\n[" NEEDED_REG "]\n",
+ span_width_reg(i, i));
+ int equal_flag = 0;
+ for (i = start_col; i <= end_col && !equal_flag; i++)
+ if (equal[i] || expand[i])
+ equal_flag = 1;
+ if (equal_flag) {
+ for (i = 0; i < ncolumns; i++)
+ if (i < start_col || i > end_col)
+ printfs(". nr %1 +\\n[" NEEDED_REG "]\n",
+ span_width_reg(i, i));
+ }
+ prints(".\\}\n");
+}
+
+void table::sum_columns(int start_col, int end_col, int do_expand)
+{
+ assert(end_col > start_col);
+ int i;
+ for (i = start_col; i <= end_col; i++)
+ if (expand[i])
+ break;
+ if (i > end_col) {
+ if (do_expand)
+ return;
+ }
+ else {
+ if (!do_expand)
+ return;
+ }
+ printfs(".nr %1 \\n[%2]",
+ span_width_reg(start_col, end_col),
+ span_width_reg(start_col, start_col));
+ for (i = start_col + 1; i <= end_col; i++)
+ printfs("+(%1*\\n[" SEPARATION_FACTOR_REG "])+\\n[%2]",
+ as_string(column_separation[i - 1]),
+ span_width_reg(i, i));
+ prints('\n');
+}
+
+horizontal_span::horizontal_span(int sc, int ec, horizontal_span *p)
+: next(p), start_col(sc), end_col(ec)
+{
+}
+
+void table::build_span_list()
+{
+ span_list = 0;
+ table_entry *p = entry_list;
+ while (p) {
+ if (p->end_col != p->start_col) {
+ horizontal_span *q;
+ for (q = span_list; q; q = q->next)
+ if (q->start_col == p->start_col
+ && q->end_col == p->end_col)
+ break;
+ if (!q)
+ span_list = new horizontal_span(p->start_col, p->end_col, span_list);
+ }
+ p = p->next;
+ }
+ // Now sort span_list primarily by order of end_row, and secondarily
+ // by reverse order of start_row. This ensures that if we divide
+ // spans using the order in span_list, we will get reasonable results.
+ horizontal_span *unsorted = span_list;
+ span_list = 0;
+ while (unsorted) {
+ horizontal_span **pp;
+ for (pp = &span_list; *pp; pp = &(*pp)->next)
+ if (unsorted->end_col < (*pp)->end_col
+ || (unsorted->end_col == (*pp)->end_col
+ && (unsorted->start_col > (*pp)->start_col)))
+ break;
+ horizontal_span *tem = unsorted->next;
+ unsorted->next = *pp;
+ *pp = unsorted;
+ unsorted = tem;
+ }
+}
+
+void table::compute_overall_width()
+{
+ prints(".\\\" compute overall width\n");
+ if (!(flags & GAP_EXPAND)) {
+ if (left_separation)
+ printfs(".if n .ll -%1n\n", as_string(left_separation));
+ if (right_separation)
+ printfs(".if n .ll -%1n\n", as_string(right_separation));
+ }
+ // Compute the amount of horizontal space available for expansion,
+ // measuring every column _including_ those eligible for expansion.
+ // This is the minimum required to set the table without compression.
+ prints(".nr " EXPAND_REG " 0\n");
+ prints(".nr " AVAILABLE_WIDTH_REG " \\n[.l]-\\n[.i]");
+ for (int i = 0; i < ncolumns; i++)
+ printfs("-\\n[%1]", span_width_reg(i, i));
+ if (total_separation)
+ printfs("-%1n", as_string(total_separation));
+ prints("\n");
+ // If the "expand" region option was given, a different warning will
+ // be issued later (if "nowarn" was not also specified).
+ if ((!(flags & NOWARN)) && (!(flags & EXPAND))) {
+ prints(".if \\n[" AVAILABLE_WIDTH_REG "]<0 \\{\\\n");
+ // Protect characters in diagnostic message (especially :, [, ])
+ // from being interpreted by eqn.
+ prints(". ig\n"
+ ".EQ\n"
+ "delim off\n"
+ ".EN\n"
+ ". .\n");
+ entry_list->set_location();
+ prints(". tmc \\n[.F]:\\n[.c]: warning:\n"
+ ". tm1 \" table wider than line length minus indentation"
+ "\n");
+ prints(". ig\n"
+ ".EQ\n"
+ "delim on\n"
+ ".EN\n"
+ ". .\n");
+ prints(". nr " AVAILABLE_WIDTH_REG " 0\n");
+ prints(".\\}\n");
+ }
+ // Now do a similar computation, this time omitting columns that
+ // _aren't_ undergoing expansion. The difference is the amount of
+ // space we have to distribute among the expanded columns.
+ bool do_expansion = false;
+ for (int i = 0; i < ncolumns; i++)
+ if (expand[i]) {
+ do_expansion = true;
+ break;
+ }
+ if (do_expansion) {
+ prints(".if \\n[" AVAILABLE_WIDTH_REG "] \\\n");
+ prints(". nr " EXPAND_REG " \\n[.l]-\\n[.i]");
+ for (int i = 0; i < ncolumns; i++)
+ if (!expand[i])
+ printfs("-\\n[%1]", span_width_reg(i, i));
+ if (total_separation)
+ printfs("-%1n", as_string(total_separation));
+ prints("\n");
+ int colcount = count_expand_columns();
+ if (colcount > 1)
+ printfs(".nr " EXPAND_REG " \\n[" EXPAND_REG "]/%1\n",
+ as_string(colcount));
+ for (int i = 0; i < ncolumns; i++)
+ if (expand[i])
+ printfs(".nr %1 \\n[%1]>?\\n[" EXPAND_REG "]\n",
+ span_width_reg(i, i));
+ }
+}
+
+void table::compute_total_separation()
+{
+ if (flags & (ALLBOX | BOX | DOUBLEBOX))
+ left_separation = right_separation = 1;
+ else {
+ for (int r = 0; r < nrows; r++) {
+ if (vline[r][0] > 0)
+ left_separation = 1;
+ if (vline[r][ncolumns] > 0)
+ right_separation = 1;
+ }
+ }
+ total_separation = left_separation + right_separation;
+ for (int c = 0; c < ncolumns - 1; c++)
+ total_separation += column_separation[c];
+}
+
+void table::compute_separation_factor()
+{
+ prints(".\\\" compute column separation factor\n");
+ // Don't let the separation factor be negative.
+ prints(".nr " SEPARATION_FACTOR_REG " \\n[.l]-\\n[.i]");
+ for (int i = 0; i < ncolumns; i++)
+ printfs("-\\n[%1]", span_width_reg(i, i));
+ printfs("/%1\n", as_string(total_separation));
+ // Store the remainder for use in compute_column_positions().
+ if (flags & GAP_EXPAND) {
+ prints(".if n \\\n");
+ prints(". nr " LEFTOVER_FACTOR_REG " \\n[.l]-\\n[.i]");
+ for (int i = 0; i < ncolumns; i++)
+ printfs("-\\n[%1]", span_width_reg(i, i));
+ printfs("%%%1\n", as_string(total_separation));
+ }
+ prints(".ie \\n[" SEPARATION_FACTOR_REG "]<=0 \\{\\\n");
+ if (!(flags & NOWARN)) {
+ // Protect characters in diagnostic message (especially :, [, ])
+ // from being interpreted by eqn.
+ prints(".ig\n"
+ ".EQ\n"
+ "delim off\n"
+ ".EN\n"
+ "..\n");
+ entry_list->set_location();
+ prints(".tmc \\n[.F]:\\n[.c]: warning:\n"
+ ".tm1 \" table column separation reduced to zero\n"
+ ".nr " SEPARATION_FACTOR_REG " 0\n");
+ }
+ prints(".\\}\n"
+ ".el .if \\n[" SEPARATION_FACTOR_REG "]<1n \\{\\\n");
+ if (!(flags & NOWARN)) {
+ entry_list->set_location();
+ prints(".tmc \\n[.F]:\\n[.c]: warning:\n"
+ ".tm1 \" table column separation reduced to fit line"
+ " length\n");
+ prints(".ig\n"
+ ".EQ\n"
+ "delim on\n"
+ ".EN\n"
+ "..\n");
+ }
+ prints(".\\}\n");
+}
+
+void table::compute_column_positions()
+{
+ prints(".\\\" compute column positions\n");
+ printfs(".nr %1 0\n", column_divide_reg(0));
+ printfs(".nr %1 %2n\n", column_start_reg(0),
+ as_string(left_separation));
+ // In nroff mode, compensate for width of vertical rule.
+ if (left_separation)
+ printfs(".if n .nr %1 +1n\n", column_start_reg(0));
+ int i;
+ for (i = 1;; i++) {
+ printfs(".nr %1 \\n[%2]+\\n[%3]\n",
+ column_end_reg(i-1),
+ column_start_reg(i-1),
+ span_width_reg(i-1, i-1));
+ if (i >= ncolumns)
+ break;
+ printfs(".nr %1 \\n[%2]+(%3*\\n[" SEPARATION_FACTOR_REG "])\n",
+ column_start_reg(i),
+ column_end_reg(i-1),
+ as_string(column_separation[i-1]));
+ // If we have leftover expansion room in a table using the "expand"
+ // region option, put it prior to the last column so that the table
+ // looks as if expanded to the available line length.
+ if ((ncolumns > 2) && (flags & GAP_EXPAND) && (i == (ncolumns - 1)))
+ printfs(".if n .if \\n[" LEFTOVER_FACTOR_REG "] .nr %1 +(1n>?\\n["
+ LEFTOVER_FACTOR_REG "])\n",
+ column_start_reg(i));
+ printfs(".nr %1 \\n[%2]+\\n[%3]/2\n",
+ column_divide_reg(i),
+ column_end_reg(i-1),
+ column_start_reg(i));
+ }
+ printfs(".nr %1 \\n[%2]+%3n\n",
+ column_divide_reg(ncolumns),
+ column_end_reg(i-1),
+ as_string(right_separation));
+ printfs(".nr TW \\n[%1]\n",
+ column_divide_reg(ncolumns));
+ if (flags & DOUBLEBOX) {
+ printfs(".nr %1 +" DOUBLE_LINE_SEP "\n", column_divide_reg(0));
+ printfs(".nr %1 -" DOUBLE_LINE_SEP "\n", column_divide_reg(ncolumns));
+ }
+}
+
+void table::make_columns_equal()
+{
+ int first = -1; // index of first equal column
+ int i;
+ for (i = 0; i < ncolumns; i++)
+ if (equal[i]) {
+ if (first < 0) {
+ printfs(".nr %1 \\n[%1]", span_width_reg(i, i));
+ first = i;
+ }
+ else
+ printfs(">?\\n[%1]", span_width_reg(i, i));
+ }
+ if (first >= 0) {
+ prints('\n');
+ for (i = first + 1; i < ncolumns; i++)
+ if (equal[i])
+ printfs(".nr %1 \\n[%2]\n",
+ span_width_reg(i, i),
+ span_width_reg(first, first));
+ }
+}
+
+void table::compute_widths()
+{
+ prints(".\\\" compute column widths\n");
+ build_span_list();
+ int i;
+ horizontal_span *p;
+ // These values get refined later.
+ prints(".nr " SEPARATION_FACTOR_REG " 1n\n");
+ for (i = 0; i < ncolumns; i++) {
+ init_span_reg(i, i);
+ if (!minimum_width[i].empty())
+ printfs(".nr %1 (n;%2)\n", span_width_reg(i, i), minimum_width[i]);
+ }
+ for (p = span_list; p; p = p->next)
+ init_span_reg(p->start_col, p->end_col);
+ // Compute all field widths except for blocks.
+ table_entry *q;
+ for (q = entry_list; q; q = q->next)
+ if (!q->mod->zero_width)
+ q->do_width();
+ // Compute all span widths, not handling blocks yet.
+ for (i = 0; i < ncolumns; i++)
+ compute_span_width(i, i);
+ for (p = span_list; p; p = p->next)
+ compute_span_width(p->start_col, p->end_col);
+ // Making columns equal normally increases the width of some columns.
+ make_columns_equal();
+ // Note that divide_span keeps equal width columns equal.
+ // This function might increase the width of some columns, too.
+ for (p = span_list; p; p = p->next)
+ divide_span(p->start_col, p->end_col);
+ compute_total_separation();
+ for (p = span_list; p; p = p->next)
+ sum_columns(p->start_col, p->end_col, 0);
+ // Now handle unexpanded blocks.
+ bool had_spanning_block = false;
+ bool had_equal_block = false;
+ for (q = entry_list; q; q = q->next)
+ if (q->divert(ncolumns, minimum_width,
+ (flags & EXPAND) ? column_separation : 0, 0)) {
+ if (q->end_col > q->start_col)
+ had_spanning_block = true;
+ for (i = q->start_col; i <= q->end_col && !had_equal_block; i++)
+ if (equal[i])
+ had_equal_block = true;
+ }
+ // Adjust widths.
+ if (had_equal_block)
+ make_columns_equal();
+ if (had_spanning_block)
+ for (p = span_list; p; p = p->next)
+ divide_span(p->start_col, p->end_col);
+ compute_overall_width();
+ if ((flags & EXPAND) && total_separation != 0) {
+ compute_separation_factor();
+ for (p = span_list; p; p = p->next)
+ sum_columns(p->start_col, p->end_col, 0);
+ }
+ else {
+ // Handle expanded blocks.
+ for (p = span_list; p; p = p->next)
+ sum_columns(p->start_col, p->end_col, 1);
+ for (q = entry_list; q; q = q->next)
+ if (q->divert(ncolumns, minimum_width, 0, 1)) {
+ if (q->end_col > q->start_col)
+ had_spanning_block = true;
+ }
+ // Adjust widths again.
+ if (had_spanning_block)
+ for (p = span_list; p; p = p->next)
+ divide_span(p->start_col, p->end_col);
+ }
+ compute_column_positions();
+}
+
+void table::print_single_hline(int r)
+{
+ prints(".vs " LINE_SEP ">?\\n[.V]u\n"
+ ".ls 1\n"
+ "\\v'" BODY_DEPTH "'"
+ "\\s[\\n[" LINESIZE_REG "]]");
+ if (r > nrows - 1)
+ prints("\\D'l |\\n[TW]u 0'");
+ else {
+ int start_col = 0;
+ for (;;) {
+ while (start_col < ncolumns
+ && entry[r][start_col] != 0
+ && entry[r][start_col]->start_row != r)
+ start_col++;
+ int end_col;
+ for (end_col = start_col;
+ end_col < ncolumns
+ && (entry[r][end_col] == 0
+ || entry[r][end_col]->start_row == r);
+ end_col++)
+ ;
+ if (end_col <= start_col)
+ break;
+ printfs("\\h'|\\n[%1]u",
+ column_divide_reg(start_col));
+ if ((r > 0 && vline[r-1][start_col] == 2)
+ || (r < nrows && vline[r][start_col] == 2))
+ prints("-" HALF_DOUBLE_LINE_SEP);
+ prints("'");
+ printfs("\\D'l |\\n[%1]u",
+ column_divide_reg(end_col));
+ if ((r > 0 && vline[r-1][end_col] == 2)
+ || (r < nrows && vline[r][end_col] == 2))
+ prints("+" HALF_DOUBLE_LINE_SEP);
+ prints(" 0'");
+ start_col = end_col;
+ }
+ }
+ prints("\\s0\n");
+ prints(".ls\n"
+ ".vs\n");
+}
+
+void table::print_double_hline(int r)
+{
+ prints(".vs " LINE_SEP "+" DOUBLE_LINE_SEP
+ ">?\\n[.V]u\n"
+ ".ls 1\n"
+ "\\v'" BODY_DEPTH "'"
+ "\\s[\\n[" LINESIZE_REG "]]");
+ if (r > nrows - 1)
+ prints("\\v'-" DOUBLE_LINE_SEP "'"
+ "\\D'l |\\n[TW]u 0'"
+ "\\v'" DOUBLE_LINE_SEP "'"
+ "\\h'|0'"
+ "\\D'l |\\n[TW]u 0'");
+ else {
+ int start_col = 0;
+ for (;;) {
+ while (start_col < ncolumns
+ && entry[r][start_col] != 0
+ && entry[r][start_col]->start_row != r)
+ start_col++;
+ int end_col;
+ for (end_col = start_col;
+ end_col < ncolumns
+ && (entry[r][end_col] == 0
+ || entry[r][end_col]->start_row == r);
+ end_col++)
+ ;
+ if (end_col <= start_col)
+ break;
+ const char *left_adjust = 0;
+ if ((r > 0 && vline[r-1][start_col] == 2)
+ || (r < nrows && vline[r][start_col] == 2))
+ left_adjust = "-" HALF_DOUBLE_LINE_SEP;
+ const char *right_adjust = 0;
+ if ((r > 0 && vline[r-1][end_col] == 2)
+ || (r < nrows && vline[r][end_col] == 2))
+ right_adjust = "+" HALF_DOUBLE_LINE_SEP;
+ printfs("\\v'-" DOUBLE_LINE_SEP "'"
+ "\\h'|\\n[%1]u",
+ column_divide_reg(start_col));
+ if (left_adjust)
+ prints(left_adjust);
+ prints("'");
+ printfs("\\D'l |\\n[%1]u",
+ column_divide_reg(end_col));
+ if (right_adjust)
+ prints(right_adjust);
+ prints(" 0'");
+ printfs("\\v'" DOUBLE_LINE_SEP "'"
+ "\\h'|\\n[%1]u",
+ column_divide_reg(start_col));
+ if (left_adjust)
+ prints(left_adjust);
+ prints("'");
+ printfs("\\D'l |\\n[%1]u",
+ column_divide_reg(end_col));
+ if (right_adjust)
+ prints(right_adjust);
+ prints(" 0'");
+ start_col = end_col;
+ }
+ }
+ prints("\\s0\n"
+ ".ls\n"
+ ".vs\n");
+}
+
+void table::compute_vrule_top_adjust(int start_row, int col, string &result)
+{
+ if (row_is_all_lines[start_row] && start_row < nrows - 1) {
+ if (row_is_all_lines[start_row] == 2)
+ result = LINE_SEP ">?\\n[.V]u" "+" DOUBLE_LINE_SEP;
+ else
+ result = LINE_SEP ">?\\n[.V]u";
+ start_row++;
+ }
+ else {
+ result = "";
+ if (start_row == 0)
+ return;
+ for (stuff *p = stuff_list; p && p->row <= start_row; p = p->next)
+ if (p->row == start_row
+ && (p->is_single_line() || p->is_double_line()))
+ return;
+ }
+ int left = 0;
+ if (col > 0) {
+ table_entry *e = entry[start_row-1][col-1];
+ if (e && e->start_row == e->end_row) {
+ if (e->to_double_line_entry() != 0)
+ left = 2;
+ else if (e->to_single_line_entry() != 0)
+ left = 1;
+ }
+ }
+ int right = 0;
+ if (col < ncolumns) {
+ table_entry *e = entry[start_row-1][col];
+ if (e && e->start_row == e->end_row) {
+ if (e->to_double_line_entry() != 0)
+ right = 2;
+ else if (e->to_single_line_entry() != 0)
+ right = 1;
+ }
+ }
+ if (row_is_all_lines[start_row-1] == 0) {
+ if (left > 0 || right > 0) {
+ result += "-" BODY_DEPTH "-" BAR_HEIGHT;
+ if ((left == 2 && right != 2) || (right == 2 && left != 2))
+ result += "-" HALF_DOUBLE_LINE_SEP;
+ else if (left == 2 && right == 2)
+ result += "+" HALF_DOUBLE_LINE_SEP;
+ }
+ }
+ else if (row_is_all_lines[start_row-1] == 2) {
+ if ((left == 2 && right != 2) || (right == 2 && left != 2))
+ result += "-" DOUBLE_LINE_SEP;
+ else if (left == 1 || right == 1)
+ result += "-" HALF_DOUBLE_LINE_SEP;
+ }
+}
+
+void table::compute_vrule_bot_adjust(int end_row, int col, string &result)
+{
+ if (row_is_all_lines[end_row] && end_row > 0) {
+ end_row--;
+ result = "";
+ }
+ else {
+ stuff *p;
+ for (p = stuff_list; p && p->row < end_row + 1; p = p->next)
+ ;
+ if (p && p->row == end_row + 1 && p->is_double_line()) {
+ result = "-" DOUBLE_LINE_SEP;
+ return;
+ }
+ if ((p != 0 && p->row == end_row + 1)
+ || end_row == nrows - 1) {
+ result = "";
+ return;
+ }
+ if (row_is_all_lines[end_row+1] == 1)
+ result = LINE_SEP;
+ else if (row_is_all_lines[end_row+1] == 2)
+ result = LINE_SEP "+" DOUBLE_LINE_SEP;
+ else
+ result = "";
+ }
+ int left = 0;
+ if (col > 0) {
+ table_entry *e = entry[end_row+1][col-1];
+ if (e && e->start_row == e->end_row) {
+ if (e->to_double_line_entry() != 0)
+ left = 2;
+ else if (e->to_single_line_entry() != 0)
+ left = 1;
+ }
+ }
+ int right = 0;
+ if (col < ncolumns) {
+ table_entry *e = entry[end_row+1][col];
+ if (e && e->start_row == e->end_row) {
+ if (e->to_double_line_entry() != 0)
+ right = 2;
+ else if (e->to_single_line_entry() != 0)
+ right = 1;
+ }
+ }
+ if (row_is_all_lines[end_row+1] == 0) {
+ if (left > 0 || right > 0) {
+ result = "1v-" BODY_DEPTH "-" BAR_HEIGHT;
+ if ((left == 2 && right != 2) || (right == 2 && left != 2))
+ result += "+" HALF_DOUBLE_LINE_SEP;
+ else if (left == 2 && right == 2)
+ result += "-" HALF_DOUBLE_LINE_SEP;
+ }
+ }
+ else if (row_is_all_lines[end_row+1] == 2) {
+ if (left == 2 && right == 2)
+ result += "-" DOUBLE_LINE_SEP;
+ else if (left != 2 && right != 2 && (left == 1 || right == 1))
+ result += "-" HALF_DOUBLE_LINE_SEP;
+ }
+}
+
+void table::add_vertical_rule(int start_row, int end_row,
+ int col, int is_double)
+{
+ vrule_list = new vertical_rule(start_row, end_row, col, is_double,
+ vrule_list);
+ compute_vrule_top_adjust(start_row, col, vrule_list->top_adjust);
+ compute_vrule_bot_adjust(end_row, col, vrule_list->bot_adjust);
+}
+
+void table::build_vrule_list()
+{
+ int col;
+ if (flags & ALLBOX) {
+ for (col = 1; col < ncolumns; col++) {
+ int start_row = 0;
+ for (;;) {
+ while (start_row < nrows && vline_spanned(start_row, col))
+ start_row++;
+ if (start_row >= nrows)
+ break;
+ int end_row = start_row;
+ while (end_row < nrows && !vline_spanned(end_row, col))
+ end_row++;
+ end_row--;
+ add_vertical_rule(start_row, end_row, col, 0);
+ start_row = end_row + 1;
+ }
+ }
+ }
+ if (flags & (BOX | ALLBOX | DOUBLEBOX)) {
+ add_vertical_rule(0, nrows - 1, 0, 0);
+ add_vertical_rule(0, nrows - 1, ncolumns, 0);
+ }
+ for (int end_row = 0; end_row < nrows; end_row++)
+ for (col = 0; col < ncolumns+1; col++)
+ if (vline[end_row][col] > 0
+ && !vline_spanned(end_row, col)
+ && (end_row == nrows - 1
+ || vline[end_row+1][col] != vline[end_row][col]
+ || vline_spanned(end_row+1, col))) {
+ int start_row;
+ for (start_row = end_row - 1;
+ start_row >= 0
+ && vline[start_row][col] == vline[end_row][col]
+ && !vline_spanned(start_row, col);
+ start_row--)
+ ;
+ start_row++;
+ add_vertical_rule(start_row, end_row, col, vline[end_row][col] > 1);
+ }
+ for (vertical_rule *p = vrule_list; p; p = p->next)
+ if (p->is_double)
+ for (int r = p->start_row; r <= p->end_row; r++) {
+ if (p->col > 0 && entry[r][p->col-1] != 0
+ && entry[r][p->col-1]->end_col == p->col-1) {
+ int is_corner = r == p->start_row || r == p->end_row;
+ entry[r][p->col-1]->note_double_vrule_on_right(is_corner);
+ }
+ if (p->col < ncolumns && entry[r][p->col] != 0
+ && entry[r][p->col]->start_col == p->col) {
+ int is_corner = r == p->start_row || r == p->end_row;
+ entry[r][p->col]->note_double_vrule_on_left(is_corner);
+ }
+ }
+}
+
+void table::define_bottom_macro()
+{
+ prints(".\\\" define bottom macro\n");
+ prints(".eo\n"
+ // protect # in macro name against eqn
+ ".ig\n"
+ ".EQ\n"
+ "delim off\n"
+ ".EN\n"
+ "..\n"
+ ".de T#\n"
+ ". if !\\n[" SUPPRESS_BOTTOM_REG "] \\{\\\n"
+ ". " REPEATED_VPT_MACRO " 0\n"
+ ". mk " SAVED_VERTICAL_POS_REG "\n");
+ if (flags & (BOX | ALLBOX | DOUBLEBOX)) {
+ prints(". if \\n[T.]&\\n[" NEED_BOTTOM_RULE_REG "] \\{\\\n");
+ print_single_hline(0);
+ prints(". \\}\n");
+ }
+ prints(". ls 1\n");
+ for (vertical_rule *p = vrule_list; p; p = p->next)
+ p->contribute_to_bottom_macro(this);
+ if (flags & DOUBLEBOX)
+ prints(". if \\n[T.] \\{\\\n"
+ ". vs " DOUBLE_LINE_SEP ">?\\n[.V]u\n"
+ "\\v'" BODY_DEPTH "'\\s[\\n[" LINESIZE_REG "]]"
+ "\\D'l \\n[TW]u 0'\\s0\n"
+ ". vs\n"
+ ". \\}\n"
+ ". if \\n[" LAST_PASSED_ROW_REG "]>=0 "
+ ".nr " TOP_REG " \\n[#T]-" DOUBLE_LINE_SEP "\n"
+ ". sp -1\n"
+ "\\v'" BODY_DEPTH "'\\s[\\n[" LINESIZE_REG "]]"
+ "\\D'l 0 |\\n[" TOP_REG "]u-1v'\\s0\n"
+ ". sp -1\n"
+ "\\v'" BODY_DEPTH "'\\h'|\\n[TW]u'\\s[\\n[" LINESIZE_REG "]]"
+ "\\D'l 0 |\\n[" TOP_REG "]u-1v'\\s0\n");
+ prints(". ls\n");
+ prints(". nr " LAST_PASSED_ROW_REG " \\n[" CURRENT_ROW_REG "]\n"
+ ". sp |\\n[" SAVED_VERTICAL_POS_REG "]u\n"
+ ". " REPEATED_VPT_MACRO " 1\n");
+ if ((flags & NOKEEP) && (flags & (BOX | DOUBLEBOX | ALLBOX)))
+ prints(". if (\\n% > \\n[" STARTING_PAGE_REG "]) \\{\\\n"
+ ". tmc \\n[.F]:\\n[.c]: warning:\n"
+ ". tmc \" boxed, unkept table does not fit on page\n"
+ ". tm1 \" \\n[" STARTING_PAGE_REG "]\n"
+ ". \\}\n");
+ prints(". \\}\n"
+ "..\n"
+ ".ig\n"
+ ".EQ\n"
+ "delim on\n"
+ ".EN\n"
+ "..\n"
+ ".ec\n");
+}
+
+// is the vertical line before column c in row r horizontally spanned?
+
+int table::vline_spanned(int r, int c)
+{
+ assert(r >= 0 && r < nrows && c >= 0 && c < ncolumns + 1);
+ return (c != 0 && c != ncolumns && entry[r][c] != 0
+ && entry[r][c]->start_col != c
+ // horizontally spanning lines don't count
+ && entry[r][c]->to_double_line_entry() == 0
+ && entry[r][c]->to_single_line_entry() == 0);
+}
+
+int table::row_begins_section(int r)
+{
+ assert(r >= 0 && r < nrows);
+ for (int i = 0; i < ncolumns; i++)
+ if (entry[r][i] && entry[r][i]->start_row != r)
+ return 0;
+ return 1;
+}
+
+int table::row_ends_section(int r)
+{
+ assert(r >= 0 && r < nrows);
+ for (int i = 0; i < ncolumns; i++)
+ if (entry[r][i] && entry[r][i]->end_row != r)
+ return 0;
+ return 1;
+}
+
+void table::do_row(int r)
+{
+ printfs(".\\\" do row %1\n", i_to_a(r));
+ if (!(flags & NOKEEP) && row_begins_section(r))
+ prints(".if \\n[" USE_KEEPS_REG "] ." KEEP_MACRO_NAME "\n");
+ bool had_line = false;
+ stuff *p;
+ for (p = stuff_list; p && p->row < r; p = p->next)
+ ;
+ for (stuff *p1 = p; p1 && p1->row == r; p1 = p1->next)
+ if (!p1->printed && (p1->is_single_line() || p1->is_double_line())) {
+ had_line = true;
+ break;
+ }
+ if (!had_line && !row_is_all_lines[r])
+ printfs("." REPEATED_MARK_MACRO " %1\n", row_top_reg(r));
+ had_line = false;
+ for (; p && p->row == r; p = p->next)
+ if (!p->printed) {
+ p->print(this);
+ if (!had_line && (p->is_single_line() || p->is_double_line())) {
+ printfs("." REPEATED_MARK_MACRO " %1\n", row_top_reg(r));
+ had_line = true;
+ }
+ }
+ // change the row *after* printing the stuff list (which might contain .TH)
+ printfs("\\*[" TRANSPARENT_STRING_NAME "].nr " CURRENT_ROW_REG " %1\n",
+ as_string(r));
+ if (!had_line && row_is_all_lines[r])
+ printfs("." REPEATED_MARK_MACRO " %1\n", row_top_reg(r));
+ // we might have had a .TH, for example, since we last tried
+ if (!(flags & NOKEEP) && row_begins_section(r))
+ prints(".if \\n[" USE_KEEPS_REG "] ." KEEP_MACRO_NAME "\n");
+ printfs(".mk %1\n", row_start_reg(r));
+ prints(".mk " BOTTOM_REG "\n"
+ "." REPEATED_VPT_MACRO " 0\n");
+ int c;
+ int row_is_blank = 1;
+ int first_start_row = r;
+ for (c = 0; c < ncolumns; c++) {
+ table_entry *e = entry[r][c];
+ if (e) {
+ if (e->end_row == r) {
+ e->do_depth();
+ if (e->start_row < first_start_row)
+ first_start_row = e->start_row;
+ row_is_blank = 0;
+ }
+ c = e->end_col;
+ }
+ }
+ if (row_is_blank)
+ prints(".nr " BOTTOM_REG " +1v\n");
+ if (row_is_all_lines[r]) {
+ prints(".vs " LINE_SEP);
+ if (row_is_all_lines[r] == 2)
+ prints("+" DOUBLE_LINE_SEP);
+ prints(">?\\n[.V]u\n.ls 1\n");
+ prints("\\&");
+ prints("\\v'" BODY_DEPTH);
+ if (row_is_all_lines[r] == 2)
+ prints("-" HALF_DOUBLE_LINE_SEP);
+ prints("'");
+ for (c = 0; c < ncolumns; c++) {
+ table_entry *e = entry[r][c];
+ if (e) {
+ if (e->end_row == e->start_row)
+ e->to_simple_entry()->simple_print(1);
+ c = e->end_col;
+ }
+ }
+ prints("\n");
+ prints(".ls\n"
+ ".vs\n");
+ prints(".nr " BOTTOM_REG " \\n[" BOTTOM_REG "]>?\\n[.d]\n");
+ printfs(".sp |\\n[%1]u\n", row_start_reg(r));
+ }
+ for (int i = row_is_all_lines[r] ? r - 1 : r;
+ i >= first_start_row;
+ i--) {
+ simple_entry *first = 0;
+ for (c = 0; c < ncolumns; c++) {
+ table_entry *e = entry[r][c];
+ if (e) {
+ if (e->end_row == r && e->start_row == i) {
+ simple_entry *simple = e->to_simple_entry();
+ if (simple) {
+ if (!first) {
+ prints(".ta");
+ first = simple;
+ }
+ simple->add_tab();
+ }
+ }
+ c = e->end_col;
+ }
+ }
+ if (first) {
+ prints('\n');
+ first->position_vertically();
+ first->set_location();
+ prints("\\&");
+ first->simple_print(0);
+ for (c = first->end_col + 1; c < ncolumns; c++) {
+ table_entry *e = entry[r][c];
+ if (e) {
+ if (e->end_row == r && e->start_row == i) {
+ simple_entry *simple = e->to_simple_entry();
+ if (simple) {
+ if (e->end_row != e->start_row) {
+ prints('\n');
+ simple->position_vertically();
+ prints("\\&");
+ }
+ simple->simple_print(0);
+ }
+ }
+ c = e->end_col;
+ }
+ }
+ prints('\n');
+ prints(".nr " BOTTOM_REG " \\n[" BOTTOM_REG "]>?\\n[.d]\n");
+ printfs(".sp |\\n[%1]u\n", row_start_reg(r));
+ }
+ }
+ for (c = 0; c < ncolumns; c++) {
+ table_entry *e = entry[r][c];
+ if (e) {
+ if (e->end_row == r && e->to_simple_entry() == 0) {
+ e->position_vertically();
+ e->print();
+ prints(".nr " BOTTOM_REG " \\n[" BOTTOM_REG "]>?\\n[.d]\n");
+ printfs(".sp |\\n[%1]u\n", row_start_reg(r));
+ }
+ c = e->end_col;
+ }
+ }
+ prints("." REPEATED_VPT_MACRO " 1\n"
+ ".sp |\\n[" BOTTOM_REG "]u\n"
+ "\\*[" TRANSPARENT_STRING_NAME "].nr " NEED_BOTTOM_RULE_REG " 1\n");
+ if (r != nrows - 1 && (flags & ALLBOX)) {
+ print_single_hline(r + 1);
+ prints("\\*[" TRANSPARENT_STRING_NAME "].nr " NEED_BOTTOM_RULE_REG " 0\n");
+ }
+ if (r != nrows - 1) {
+ if (p && p->row == r + 1
+ && (p->is_single_line() || p->is_double_line())) {
+ p->print(this);
+ prints("\\*[" TRANSPARENT_STRING_NAME "].nr " NEED_BOTTOM_RULE_REG
+ " 0\n");
+ }
+ int printed_one = 0;
+ for (vertical_rule *vr = vrule_list; vr; vr = vr->next)
+ if (vr->end_row == r) {
+ if (!printed_one) {
+ prints("." REPEATED_VPT_MACRO " 0\n");
+ printed_one = 1;
+ }
+ vr->print();
+ }
+ if (printed_one)
+ prints("." REPEATED_VPT_MACRO " 1\n");
+ if (!(flags & NOKEEP) && row_ends_section(r))
+ prints(".if \\n[" USE_KEEPS_REG "] ." RELEASE_MACRO_NAME "\n");
+ }
+}
+
+void table::do_top()
+{
+ prints(".\\\" do top\n");
+ prints(".ss \\n[" SAVED_INTER_WORD_SPACE_SIZE "]\n");
+ prints(".fc \002\003\n");
+ if (flags & (BOX | DOUBLEBOX | ALLBOX))
+ prints(".nr " IS_BOXED_REG " 1\n");
+ else
+ prints(".nr " IS_BOXED_REG " 0\n");
+ if (!(flags & NOKEEP) && (flags & (BOX | DOUBLEBOX | ALLBOX)))
+ prints("." TABLE_KEEP_MACRO_NAME "\n");
+ if (flags & DOUBLEBOX) {
+ prints(".ls 1\n"
+ ".vs " LINE_SEP ">?\\n[.V]u\n"
+ "\\v'" BODY_DEPTH "'\\s[\\n[" LINESIZE_REG "]]\\D'l \\n[TW]u 0'\\s0\n"
+ ".vs\n"
+ "." REPEATED_MARK_MACRO " " TOP_REG "\n"
+ ".vs " DOUBLE_LINE_SEP ">?\\n[.V]u\n");
+ printfs("\\v'" BODY_DEPTH "'"
+ "\\s[\\n[" LINESIZE_REG "]]"
+ "\\h'\\n[%1]u'"
+ "\\D'l |\\n[%2]u 0'"
+ "\\s0"
+ "\n",
+ column_divide_reg(0),
+ column_divide_reg(ncolumns));
+ prints(".ls\n"
+ ".vs\n");
+ }
+ else if (flags & (ALLBOX | BOX))
+ print_single_hline(0);
+ // On terminal devices, a vertical rule on the first row of the table
+ // will stick out 1v above it if it the table is unboxed or lacks a
+ // horizontal rule on the first row. This is necessary for grotty's
+ // rule intersection detection. We must make room for it so that the
+ // vertical rule is not drawn above the top of the page.
+ else if ((flags & HAS_TOP_VLINE) && !(flags & HAS_TOP_HLINE))
+ prints(".if n .sp\n");
+ prints(".nr " STARTING_PAGE_REG " \\n%\n");
+ //printfs(".mk %1\n", row_top_reg(0));
+}
+
+void table::do_bottom()
+{
+ prints(".\\\" do bottom\n");
+ // print stuff after last row
+ for (stuff *p = stuff_list; p; p = p->next)
+ if (p->row > nrows - 1)
+ p->print(this);
+ if (!(flags & NOKEEP))
+ prints(".if \\n[" USE_KEEPS_REG "] ." RELEASE_MACRO_NAME "\n");
+ printfs(".mk %1\n", row_top_reg(nrows));
+ prints(".nr " NEED_BOTTOM_RULE_REG " 1\n"
+ ".nr T. 1\n"
+ // protect # in macro name against eqn
+ ".ig\n"
+ ".EQ\n"
+ "delim off\n"
+ ".EN\n"
+ "..\n"
+ ".T#\n"
+ ".ig\n"
+ ".EQ\n"
+ "delim on\n"
+ ".EN\n"
+ "..\n");
+ if (!(flags & NOKEEP) && (flags & (BOX | DOUBLEBOX | ALLBOX)))
+ prints("." TABLE_RELEASE_MACRO_NAME "\n");
+ if (flags & DOUBLEBOX)
+ prints(".sp " DOUBLE_LINE_SEP "\n");
+ // Horizontal box lines take up an entire row on nroff devices (maybe
+ // a half-row if we ever support [emulators of] devices like the
+ // Teletype Model 37 with half-line motions).
+ if (flags & (BOX | DOUBLEBOX | ALLBOX))
+ prints(".if n .sp\n");
+ // Space again for the doublebox option, until we can draw that more
+ // attractively; see Savannah #43637.
+ if (flags & DOUBLEBOX)
+ prints(".if n .sp\n");
+ prints("." RESET_MACRO_NAME "\n"
+ ".nn \\n[" SAVED_NUMBERING_SUPPRESSION_COUNT "]\n"
+ ".ie \\n[" SAVED_NUMBERING_LINENO "] "
+ ".nm \\n[" SAVED_NUMBERING_LINENO "]\n"
+ ".el .nm\n"
+ ".fc\n"
+ ".cp \\n(" COMPATIBLE_REG "\n");
+}
+
+int table::get_nrows()
+{
+ return nrows;
+}
+
+const char *last_filename = 0;
+
+void set_troff_location(const char *fn, int ln)
+{
+ if (!location_force_filename && last_filename != 0
+ && strcmp(fn, last_filename) == 0)
+ printfs(".lf %1\n", as_string(ln));
+ else {
+ string filename(fn);
+ filename += '\0';
+ normalize_for_lf(filename);
+ printfs(".lf %1 %2\n", as_string(ln), filename.contents());
+ last_filename = fn;
+ location_force_filename = 0;
+ }
+}
+
+void printfs(const char *s, const string &arg1, const string &arg2,
+ const string &arg3, const string &arg4, const string &arg5)
+{
+ if (s) {
+ char c;
+ while ((c = *s++) != '\0') {
+ if (c == '%') {
+ switch (*s++) {
+ case '1':
+ prints(arg1);
+ break;
+ case '2':
+ prints(arg2);
+ break;
+ case '3':
+ prints(arg3);
+ break;
+ case '4':
+ prints(arg4);
+ break;
+ case '5':
+ prints(arg5);
+ break;
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ break;
+ case '%':
+ prints('%');
+ break;
+ default:
+ assert(0 == "printfs format character not in [1-9%]");
+ }
+ }
+ else
+ prints(c);
+ }
+ }
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/tbl/table.h b/src/preproc/tbl/table.h
new file mode 100644
index 0000000..62346fa
--- /dev/null
+++ b/src/preproc/tbl/table.h
@@ -0,0 +1,179 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <stdlib.h>
+#include <ctype.h>
+#include <errno.h>
+
+#include "cset.h"
+#include "cmap.h"
+#include "stringclass.h"
+#include "errarg.h"
+#include "error.h"
+#include "lf.h"
+
+// PREFIX and PREFIX_CHAR must be the same.
+#define PREFIX "3"
+#define PREFIX_CHAR '3'
+
+// LEADER and LEADER_CHAR must be the same.
+#define LEADER "a"
+#define LEADER_CHAR 'a'
+
+struct inc_number {
+ short inc;
+ short val;
+};
+
+struct entry_modifier {
+ inc_number point_size;
+ inc_number vertical_spacing;
+ string font;
+ string macro;
+ enum { CENTER, TOP, BOTTOM } vertical_alignment;
+ char zero_width;
+ char stagger;
+
+ entry_modifier();
+ ~entry_modifier();
+};
+
+enum format_type {
+ FORMAT_LEFT,
+ FORMAT_CENTER,
+ FORMAT_RIGHT,
+ FORMAT_NUMERIC,
+ FORMAT_ALPHABETIC,
+ FORMAT_SPAN,
+ FORMAT_VSPAN,
+ FORMAT_HLINE,
+ FORMAT_DOUBLE_HLINE
+};
+
+struct entry_format : public entry_modifier {
+ format_type type;
+
+ entry_format(format_type);
+ entry_format();
+ void debug_print() const;
+};
+
+class table_entry;
+struct horizontal_span;
+struct stuff;
+struct vertical_rule;
+
+class table {
+ int nrows;
+ int ncolumns;
+ int linesize;
+ char delim[2];
+ char decimal_point_char;
+ vertical_rule *vrule_list;
+ stuff *stuff_list;
+ horizontal_span *span_list;
+ table_entry *entry_list;
+ table_entry **entry_list_tailp;
+ table_entry ***entry;
+ char **vline;
+ char *row_is_all_lines;
+ string *minimum_width;
+ int *column_separation;
+ char *equal;
+ int left_separation; // from a vertical rule or box border, in ens
+ int right_separation; // from a vertical rule or box border, in ens
+ int total_separation;
+ int allocated_rows;
+ void build_span_list();
+ void compute_overall_width();
+ void do_hspan(int r, int c);
+ void do_vspan(int r, int c);
+ void allocate(int r);
+ void compute_widths();
+ void divide_span(int, int);
+ void sum_columns(int, int, int);
+ void compute_total_separation();
+ void compute_separation_factor();
+ void compute_column_positions();
+ void do_row(int);
+ void init_output();
+ void add_stuff(stuff *);
+ void do_top();
+ void do_bottom();
+ void do_vertical_rules();
+ void build_vrule_list();
+ void add_vertical_rule(int, int, int, int);
+ void define_bottom_macro();
+ int vline_spanned(int r, int c);
+ int row_begins_section(int);
+ int row_ends_section(int);
+ void make_columns_equal();
+ void compute_vrule_top_adjust(int, int, string &);
+ void compute_vrule_bot_adjust(int, int, string &);
+ void determine_row_type();
+ int count_expand_columns();
+public:
+ unsigned flags;
+ enum {
+ CENTER = 0x00000001,
+ EXPAND = 0x00000002,
+ BOX = 0x00000004,
+ ALLBOX = 0x00000008,
+ DOUBLEBOX = 0x00000010,
+ NOKEEP = 0x00000020,
+ NOSPACES = 0x00000040,
+ NOWARN = 0x00000080,
+ // The next few properties help manage nroff mode output.
+ HAS_TOP_VLINE = 0x00000100,
+ HAS_TOP_HLINE = 0x00000200,
+ GAP_EXPAND = 0x00000400,
+ EXPERIMENTAL = 0x80000000 // undocumented
+ };
+ char *expand;
+ table(int nc, unsigned flags, int linesize, char decimal_point_char);
+ ~table();
+
+ void add_text_line(int r, const string &, const char *, int);
+ void add_single_hline(int r);
+ void add_double_hline(int r);
+ void add_entry(int r, int c, const string &, const entry_format *,
+ const char *, int lineno);
+ void add_vlines(int r, const char *);
+ void check();
+ void print();
+ void set_minimum_width(int c, const string &w);
+ void set_column_separation(int c, int n);
+ void set_equal_column(int c);
+ void set_expand_column(int c);
+ void set_delim(char c1, char c2);
+ void print_single_hline(int r);
+ void print_double_hline(int r);
+ int get_nrows();
+};
+
+void set_troff_location(const char *, int);
+
+extern int compatible_flag;
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/preproc/tbl/tbl.1.man b/src/preproc/tbl/tbl.1.man
new file mode 100644
index 0000000..4c9a98a
--- /dev/null
+++ b/src/preproc/tbl/tbl.1.man
@@ -0,0 +1,2018 @@
+'\" t
+.TH @g@tbl @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+@g@tbl \- prepare tables for
+.I groff
+documents
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2023 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_tbl_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY @g@tbl
+.RB [ \-C ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY @g@tbl
+.B \-\-help
+.YS
+.
+.
+.SY @g@tbl
+.B \-v
+.
+.SY @g@tbl
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The GNU implementation of
+.I tbl \" generic
+is part of the
+.MR groff @MAN1EXT@
+document formatting system.
+.
+.I @g@tbl
+is a
+.MR @g@troff @MAN1EXT@
+preprocessor that translates descriptions of tables embedded in
+.MR roff @MAN7EXT@
+input files into the language understood by
+.IR @g@troff .
+.
+It copies the contents of each
+.I file
+to the standard output stream,
+except that lines between
+.B .TS
+and
+.B .TE
+are interpreted as table descriptions.
+.
+While GNU
+.IR tbl 's \" GNU
+input syntax is highly compatible with AT&T
+.IR tbl , \" AT&T
+the output GNU
+.I tbl \" GNU
+produces cannot be processed by AT&T
+.IR troff ; \" AT&T
+GNU
+.I troff \" GNU
+(or a
+.I troff \" generic
+implementing any GNU extensions employed)
+must be used.
+.
+Normally,
+.I @g@tbl
+is not executed directly by the user,
+but invoked by specifying the
+.B \-t
+option to
+.MR groff @MAN1EXT@ .
+.
+If no
+.I file
+operands are given on the command line,
+or if
+.I file
+is
+.RB \[lq] \- \[rq],
+.I @g@tbl
+reads the standard input stream.
+.
+.
+.\" ====================================================================
+.SS Overview
+.\" ====================================================================
+.
+.I @g@tbl
+expects to find table descriptions between input lines that begin with
+.B .TS
+(table start)
+and
+.B .TE
+(table end).
+.
+Each such
+.I table region
+encloses one or more table descriptions.
+.
+Within a table region,
+table descriptions beyond the first must each be preceded
+by an input line beginning with
+.BR .T& .
+.
+This mechanism does not start a new table region;
+all table descriptions are treated as part of their
+.BR .TS / .TE
+enclosure,
+even if they are boxed or have column headings that repeat on subsequent
+pages
+(see below).
+.
+.
+.P
+(Experienced
+.I roff
+users should observe that
+.I @g@tbl
+is not a
+.I roff
+language interpreter:
+the default control character must be used,
+and no spaces or tabs are permitted between the control character and
+the macro name.
+.
+These
+.I @g@tbl
+input tokens remain as-is in the output,
+where they become ordinary macro calls.
+.
+Macro packages often define
+.BR TS ,
+.BR T& ,
+and
+.B TE
+macros to handle issues of table placement on the page.
+.
+.I @g@tbl
+produces
+.I groff
+code to define these macros as empty if their definitions do not exist
+when the formatter encounters a table region.)
+.
+.
+.P
+Each table region may begin with
+.I region options,
+and must contain one or more
+.I table definitions;
+each table definition contains a
+.I format specification
+followed by one or more input lines (rows) of
+.I entries.
+.
+These entries comprise the
+.I table data.
+.
+.
+.
+.\" ====================================================================
+.SS "Region options"
+.\" ====================================================================
+.
+The line immediately following the
+.B .TS
+token may specify region options,
+keywords that influence the interpretation or rendering of the region as
+a whole or all table entries within it indiscriminately.
+.
+They must be separated by commas,
+spaces,
+or tabs.
+.
+Those that require a parenthesized argument permit spaces and tabs
+between the option's name and the opening parenthesis.
+.
+Options accumulate and cannot be unset within a region once declared;
+if an option that takes a parameter is repeated,
+the last occurrence controls.
+.
+If present,
+the set of region options must be terminated with a semicolon
+.RB ( ; ).
+.
+.
+.P
+Any of the
+.BR allbox ,
+.BR box ,
+.BR doublebox ,
+.BR frame ,
+and
+.B doubleframe
+region options makes a table \[lq]boxed\[rq] for the purpose of later
+discussion.
+.
+.
+.TP
+.B allbox
+Enclose each table entry in a box;
+implies
+.BR box .
+.
+.
+.TP
+.B box
+Enclose the entire table region in a box.
+.
+As a GNU extension,
+the alternative option name
+.B frame
+is also recognized.
+.
+.
+.TP
+.B center
+Center the table region with respect to the current indentation and line
+length;
+the default is to left-align it.
+.
+As a GNU extension,
+the alternative option name
+.B centre
+is also recognized.
+.
+.
+.TP
+.BI decimalpoint( c )
+Recognize character
+.I c
+as the decimal separator in columns using the
+.B N
+(numeric) classifier
+(see subsection \[lq]Column classifiers\[rq] below).
+.
+This is a GNU extension.
+.
+.
+.TP
+.BI delim( xy )
+Recognize characters
+.I x
+.RI and\~ y
+as start and end delimiters,
+respectively,
+for
+.MR @g@eqn @MAN1EXT@
+input,
+and ignore input between them.
+.
+.I x
+.RI and\~ y
+need not be distinct.
+.
+.
+.TP
+.B doublebox
+Enclose the entire table region in a double box;
+implies
+.BR box .
+.
+As a GNU extension,
+the alternative option name
+.B \%doubleframe
+is also recognized.
+.
+.
+.TP
+.B expand
+Spread the table horizontally to fill the available space
+(line length minus indentation)
+by increasing column separation.
+.
+Ordinarily,
+a table is made only as wide as necessary to accommodate the widths of
+its entries and its column separations
+(whether specified or default).
+.
+When
+.B expand
+applies to a table that exceeds the available horizontal space,
+column separation is reduced as far as necessary
+(even to zero).
+.
+.I @g@tbl
+produces
+.I groff
+input that issues a diagnostic if such compression occurs.
+.
+The column modifier
+.B x
+(see below)
+overrides this option.
+.
+.
+.TP
+.BI linesize( n )
+Draw lines or rules
+(e.g.,
+from
+.BR box )
+with a thickness of
+.IR n \~points.
+.
+The default is the current type size when the region begins.
+.
+This option is ignored on terminal devices.
+.
+.
+.TP
+.B nokeep
+Don't use
+.I roff
+diversions to manage page breaks.
+.
+Normally,
+.I @g@tbl
+employs them to avoid breaking a page within a table row.
+.
+This usage can sometimes interact badly with macro packages' own use of
+diversions\[em]when footnotes,
+for example,
+are employed.
+.
+This is a GNU extension.
+.
+.
+.TP
+.B nospaces
+Ignore leading and trailing spaces in table entries.
+.
+This is a GNU extension.
+.
+.
+.TP
+.B nowarn
+Suppress diagnostic messages produced at document formatting time when
+the line or page lengths are inadequate to contain a table row.
+.
+This is a GNU extension.
+.
+.
+.\" TODO: How about "right"? (and "left" for symmetry)
+.TP
+.BI tab( c )
+Use the character
+.I c
+instead of a tab to separate entries in a row of table data.
+.
+.
+.\" ====================================================================
+.SS "Table format specification"
+.\" ====================================================================
+.
+The table format specification is mandatory:
+it determines the number of columns in the table and directs how the
+entries within it are to be typeset.
+.
+The format specification is a series of column
+.I descriptors.
+.
+Each descriptor encodes a
+.I classifier
+followed by zero or more
+.I modifiers.
+.
+Classifiers are letters
+(recognized case-insensitively)
+or punctuation symbols;
+modifiers consist of or begin with letters or numerals.
+.
+Spaces,
+tabs,
+newlines,
+and commas separate descriptors.
+.
+Newlines and commas are special;
+they apply the descriptors following them to a subsequent row of the
+table.
+.
+(This enables column headings to be centered or emboldened while the
+table entries for the data are not,
+for instance.)
+.
+We term the resulting group of column descriptors a
+.I row definition.
+.
+Within a row definition,
+separation between column descriptors
+(by spaces or tabs)
+is often optional;
+only some modifiers,
+described below,
+make separation necessary.
+.
+.
+.P
+Each column descriptor begins with a mandatory
+.I classifier,
+a character that selects from one of several arrangements.
+.
+Some determine the positioning of table entries within a rectangular
+cell:
+centered,
+left-aligned,
+numeric
+(aligned to a configurable decimal separator),
+and so on.
+.
+Others perform special operations like drawing lines or spanning entries
+from adjacent cells in the table.
+.
+Except for
+.RB \[lq] | \[rq],
+any classifier can be followed by one or more
+.I modifiers;
+some of these accept an argument,
+which in GNU
+.I tbl \" GNU
+can be parenthesized.
+.\" AT&T tbl allowed parentheses only after 'w'.
+.\" TODO: Accept parentheses after 'p' and 'v'.
+.
+Modifiers select fonts,
+set the type size,
+.\"define the column width,
+.\"adjust inter-column spacing, \" slack text for window/orphan control
+and perform other tasks described below.
+.
+.
+.P
+The format specification can occupy multiple input lines,
+but must conclude with a dot
+.RB \[lq] .\& \[rq]
+followed by a newline.
+.
+Each row definition is applied in turn to one row of the table.
+.
+The last row definition is applied to rows of table data in excess of
+the row definitions.
+.
+.
+.P
+For clarity in this document's examples,
+we shall write classifiers in uppercase and modifiers in lowercase.
+.
+Thus,
+.RB \[lq] CbCb,LR.\& \[rq]
+defines two rows of two columns.
+.
+The first row's entries are centered and boldfaced;
+the second and any further rows' first and second columns are left- and
+right-aligned,
+respectively.
+.
+.\" slack text for window/orphan control
+.\"If more rows of entries are added to the table data,
+.\"they reuse the row definition
+.\".RB \[lq] LR \[rq].
+.
+.
+.P
+The row definition with the most column descriptors determines the
+number of columns in the table;
+any row definition with fewer is implicitly extended on the right-hand
+side with
+.B L
+classifiers as many times as necessary to make the table rectangular.
+.
+.
+.\" ====================================================================
+.SS "Column classifiers"
+.\" ====================================================================
+.
+The
+.BR L ,
+.BR R ,
+and
+.B C
+classifiers are the easiest to understand and use.
+.
+.
+.TP
+.BR A ,\~ a
+Center longest entry in this column,
+left-align remaining entries in the column with respect to the centered
+entry,
+then indent all entries by one en.
+.
+Such \[lq]alphabetic\[rq] entries
+(hence the name of the classifier)
+can be used in the same column as
+.BR L -classified
+entries,
+as in
+.RB \[lq] LL,AR.\& \[rq].
+.
+The
+.B A
+entries are often termed \[lq]sub-columns\[rq] due to their indentation.
+.
+.
+.TP
+.BR C ,\~ c
+Center entry within the column.
+.
+.
+.TP
+.BR L ,\~ l
+Left-align entry within the column.
+.
+.
+.TP
+.BR N ,\~ n
+Numerically align entry in the column.
+.
+.I @g@tbl
+aligns columns of numbers vertically at the units place.
+.
+If multiple decimal separators are adjacent to a digit,
+it uses the rightmost one for vertical alignment.
+.
+If there is no decimal separator,
+the rightmost digit is used for vertical alignment;
+otherwise,
+.I @g@tbl
+centers the entry within the column.
+.
+The
+.I roff
+dummy character
+.B \[rs]&
+in an entry marks the glyph preceding it
+(if any)
+as the units place;
+if multiple instances occur in the data,
+the leftmost is used for alignment.
+.
+.
+.IP
+If
+.BR N -classified
+entries share a column with
+.B L
+or
+.BR R \~entries,
+.I @g@tbl
+centers the widest
+.BR N \~entry
+with respect to the widest
+.B L
+or
+.BR R \~entry,
+preserving the alignment of
+.BR N \~entries
+with respect to each other.
+.
+.
+.IP
+The appearance of
+.I @g@eqn
+equations
+within
+.BR N -classified
+columns
+can be troublesome due to the foregoing textual scan for a decimal
+separator.
+.
+Use the
+.B \%delim
+region option to make
+.I @g@tbl
+ignore the data within
+.I eqn
+delimiters for that purpose.
+.
+.
+.TP
+.BR R ,\~ r
+Right-align entry within the column.
+.
+.
+.TP
+.BR S ,\~ s
+Span previous entry on the left into this column.
+.
+.
+.TP
+.B \[ha]
+Span entry in the same column from the previous row into this row.
+.
+.
+.TP
+.BR _ ,\~ \-
+Replace table entry with a horizontal rule.
+.
+An empty table entry is expected to correspond to this classifier;
+if data are found there,
+.I @g@tbl
+issues a diagnostic message.
+.
+.
+.TP
+.B =
+Replace table entry with a double horizontal rule.
+.
+An empty table entry is expected to correspond to this classifier;
+if data are found there,
+.I @g@tbl
+issues a diagnostic message.
+.
+.
+.TP
+.B |
+Place a vertical rule (line) on the corresponding row of the table
+(if two of these are adjacent,
+a double vertical rule).
+.
+This classifier does not contribute to the column count and no table
+entries correspond to it.
+.
+A
+.B |
+to the left of the first column descriptor or to the right of the last
+one produces a vertical rule at the edge of the table;
+these are redundant
+(and ignored)
+in boxed tables.
+.
+.
+.P
+To change the table format within a
+.I @g@tbl
+region,
+use the
+.B .T&
+token at the start of a line.
+.
+It is followed by a format specification and table data,
+but
+.I not
+region options.
+.
+The quantity of columns in a new table format thus introduced cannot
+increase relative to the previous table format;
+in that case,
+you must end the table region and start another.
+.
+If that will not serve because the region uses box options or the
+columns align in an undesirable manner,
+you must design the initial table format specification to include the
+maximum quantity of columns required,
+and use the
+.B S
+horizontal spanning classifier where necessary to achieve the desired
+columnar alignment.
+.
+.
+.P
+Attempting to horizontally span in the first column or vertically span
+on the first row is an error.
+.
+Non-rectangular span areas are also not supported.
+.
+.
+.\" ====================================================================
+.SS "Column modifiers"
+.\" ====================================================================
+.
+Any number of modifiers can follow a column classifier.
+.
+Arguments to modifiers,
+where accepted,
+are case-sensitive.
+.
+If the same modifier is applied to a column specifier more than once,
+or if conflicting modifiers are applied,
+only the last occurrence has effect.
+.
+The
+.RB modifier\~ x
+is mutually exclusive with
+.B e
+.RB and\~ w ,
+but
+.B e
+is not mutually exclusive
+.RB with\~ w ;
+if these are used in combination,
+.BR x \~unsets
+both
+.B e
+.RB and\~ w ,
+while either
+.B e
+or
+.B w
+.RB overrides\~ x .
+.
+.
+.br
+.ne 4v \" Keep next two tagged paragraphs together.
+.TP
+.BR b ,\~ B
+Typeset entry in boldface,
+abbreviating
+.BR f(B) .
+.
+.
+.TP
+.BR d ,\~ D
+Align a vertically spanned table entry to the bottom
+(\[lq]down\[rq]),
+instead of the center,
+of its range.
+.
+This is a GNU extension.
+.
+.
+.TP
+.BR e ,\~ E
+Equalize the widths of columns with this modifier.
+.
+The column with the largest width controls.
+.
+This modifier sets the default line length used in a text block.
+.
+.
+.TP
+.BR f ,\~ F
+Select the typeface for the table entry.
+.
+This modifier must be followed by a font or style name
+(one or two characters not starting with a digit),
+font mounting position
+(a single digit),
+or a name or mounting position of any length in parentheses.
+.
+The last form is a GNU extension.
+.
+(The parameter corresponds to that accepted by the
+.I troff \" generic
+.B ft
+request.)
+.
+A one-character argument not in parentheses must be separated by one or
+more spaces or tabs from what follows.
+.
+.
+.TP
+.BR i ,\~ I
+Typeset entry in an oblique or italic face,
+abbreviating
+.BR f(I) .
+.
+.
+.TP
+.BR m ,\~ M
+Call a
+.I groff
+macro before typesetting a text block
+(see subsection \[lq]Text blocks\[rq] below).
+.
+This is a GNU extension.
+.
+This modifier must be followed by a macro name of one or two characters
+or a name of any length in parentheses.
+.
+A one-character macro name not in parentheses must be separated by one
+or more spaces or tabs from what follows.
+.
+The named macro must be defined before the table region containing this
+column modifier is encountered.
+.
+The macro should contain only simple
+.I groff
+requests to change text formatting,
+like adjustment or hyphenation.
+.
+The macro is called
+.I after
+the column modifiers
+.BR b ,
+.BR f ,
+.BR i ,
+.BR p ,
+and
+.B v
+take effect;
+it can thus override other column modifiers.
+.
+.
+.TP
+.BR p ,\~ P
+Set the type size for the table entry.
+.
+This modifier must be followed by an
+.RI integer\~ n
+with an optional leading sign.
+.
+If unsigned,
+the type size is set to
+.IR n \~scaled
+points.
+.
+Otherwise,
+the type size is incremented or decremented per the sign by
+.IR n \~scaled
+points.
+.
+The use of a signed multi-digit number is a GNU extension.
+.
+(The parameter corresponds to that accepted by the
+.I troff \" generic
+.B ps
+request.)
+.
+If a type size modifier is followed by a column separation modifier
+(see below),
+they must be separated by at least one space or tab.
+.\" TODO: Allow parentheses so scaling units and fractional values can
+.\" be used?
+.
+.
+.TP
+.BR t ,\~ T
+Align a vertically spanned table entry to the top,
+instead of the center,
+of its range.
+.
+.
+.TP
+.BR u ,\~ U
+Move the column up one half-line,
+\[lq]staggering\[rq] the rows.
+.
+This is a GNU extension.
+.
+.
+.TP
+.BR v ,\~ V
+Set the vertical spacing to be used in a text block.
+.
+This modifier must be followed by an
+.RI integer\~ n
+with an optional leading sign.
+.
+If unsigned,
+the vertical spacing is set to
+.IR n\~ points.
+.
+Otherwise,
+the vertical spacing is incremented or decremented per the sign by
+.IR n\~ points.
+.
+The use of a signed multi-digit number is a GNU extension.
+.
+(This parameter corresponds to that accepted by the
+.I troff \" generic
+.B vs
+request.)
+.
+If a vertical spacing modifier is followed by a column separation
+modifier
+(see below),
+they must be separated by at least one space or tab.
+.\" TODO: Allow parentheses so scaling units and fractional values can
+.\" be used?
+.
+.
+.TP
+.BR w ,\~ W
+Set the column's minimum width.
+.
+This modifier must be followed by a number,
+which is either a unitless integer,
+or a
+.I roff
+horizontal measurement in parentheses.
+.
+Parentheses are required if the width is to be followed immediately by
+an explicit column separation
+(alternatively,
+follow the width with one or more spaces or tabs).
+.
+If no unit is specified,
+ens are assumed.
+.
+This modifier sets the default line length used in a text block.
+.
+.
+.TP
+.BR x ,\~ X
+Expand the column.
+.
+After computing the column widths,
+distribute any remaining line length evenly over all columns bearing
+this modifier.
+.
+Applying the
+.BR x \~modifier
+to more than one column is a GNU extension.
+.\" 'x' wasn't documented at all in Lesk 1979.
+.
+This modifier sets the default line length used in a text block.
+.
+.
+.TP
+.BR z ,\~ Z
+Ignore the table entries corresponding to this column for width
+calculation purposes;
+that is,
+compute the column's width using only the information in its descriptor.
+.
+.
+.TP
+.I n
+A numeric suffix on a column descriptor sets the separation distance
+(in ens)
+from the succeeding column;
+the default separation is
+.BR 3n .
+.
+This separation is
+proportionally multiplied if the
+.B expand
+region option is in effect;
+in the case of tables wider than the output line length,
+this separation might be zero.
+.
+A negative separation cannot be specified.
+.
+A separation amount after the last column in a row is nonsensical and
+provokes a diagnostic from
+.IR @g@tbl .
+.
+.
+.\" ====================================================================
+.SS "Table data"
+.\" ====================================================================
+.
+The table data come after the format specification.
+.
+Each input line corresponds to a table row,
+except that a backslash at the end of a line of table data continues an
+entry on the next input line.
+.
+(Text blocks,
+discussed below,
+also spread table entries across multiple input lines.)
+.
+Table entries within a row are separated in the input by a tab character
+by default;
+see the
+.B tab
+region option above.
+.
+Excess entries in a row of table data
+(those that have no corresponding column descriptor,
+not even an implicit one arising from rectangularization of the table)
+are discarded with a diagnostic message.
+.
+.I roff
+control lines are accepted between rows of table data and within text
+blocks.
+.
+If you wish to visibly mark an empty table entry in the document source,
+populate it with the
+.B \[rs]&
+.I roff
+dummy character.
+.
+The table data are interrupted by a line consisting of the
+.B .T&
+input token,
+and conclude with the line
+.BR .TE .
+.
+.
+.P
+Ordinarily,
+a table entry is typeset rigidly.
+.
+It is not filled,
+broken,
+hyphenated,
+adjusted,
+or populated with additional inter-sentence space.
+.
+.I @g@tbl
+instructs the formatter to measure each table entry as it occurs in the
+input,
+updating the width required by its corresponding column.
+.
+If the
+.B z
+modifier applies to the column,
+this measurement is ignored;
+if
+.B w
+applies and its argument is larger than this width,
+that argument is used instead.
+.
+In contrast to conventional
+.I roff
+input
+(within a paragraph,
+say),
+changes to text formatting,
+such as font selection or vertical spacing,
+do not persist between entries.
+.
+.
+.P
+Several forms of table entry are interpreted specially.
+.
+.
+.IP \[bu] 2n
+If a table row contains only an underscore or equals sign
+.RB ( _
+or
+.BR = ),
+a single or double horizontal rule (line),
+respectively,
+is drawn across the table at that point.
+.
+.
+.IP \[bu] 2n
+A table entry containing only
+.B _
+or
+.B =
+on an otherwise populated row is replaced by a single or double
+horizontal rule,
+respectively,
+joining its
+neighbors.
+.
+.
+.IP \[bu] 2n
+Prefixing a lone underscore or equals sign with a backslash also has
+meaning.
+.
+If a table entry consists only of
+.B \[rs]_
+or
+.B \[rs]=
+on an otherwise populated row,
+it is replaced by a single or double horizontal rule,
+respectively,
+that does
+.I not
+(quite) join its neighbors.
+.
+.
+.IP \[bu]
+A table entry consisting of
+.BI \[rs]R x\c
+,
+where
+.IR x \~is
+any
+.I roff
+ordinary or special character,
+is replaced by enough repetitions of the glyph corresponding
+.RI to\~ x
+to fill the column,
+albeit without joining its neighbors.
+.\" TODO: Bad things happen if there's garbage in the entry after 'x',
+.\" which can be a *roff special character escape sequence, so
+.\" validation is not trivial.
+.
+.
+.IP \[bu]
+On any row but the first,
+a table entry of
+.B \[rs]\[ha]
+causes the entry above it to span down into the current one.
+.
+.
+.P
+On occasion,
+these special tokens may be required as literal table data.
+.
+To use either
+.B _
+or
+.B =
+literally and alone in an entry,
+prefix or suffix it with the
+.I roff
+dummy character
+.BR \[rs]& .
+.
+To express
+.BR \[rs]_ ,
+.BR \[rs]= ,
+or
+.BR \[rs]R ,
+use a
+.I roff
+escape sequence to interpolate the backslash
+.RB ( \[rs]e
+or
+.BR \[rs][rs] ).
+.
+A reliable way to emplace the
+.B \[rs]\[ha]
+glyph sequence within a table entry is to use a pair of
+.I groff
+special character escape sequences
+.RB ( \[rs][rs]\[rs][ha] ).
+.
+.
+.P
+Rows of table entries can be interleaved with
+.I groff
+control lines;
+these do not count as table data.
+.
+On such lines the default control character
+.RB ( .\& )
+must be used
+(and not changed);
+the no-break control character is not recognized.
+.
+To start the first table entry in a row with a dot,
+precede it with the
+.I roff
+dummy character
+.BR \[rs]& .
+.
+.
+.\" ====================================================================
+.SS "Text blocks"
+.\" ====================================================================
+.
+An ordinary table entry's contents can make a column,
+and therefore the table,
+excessively wide;
+the table then exceeds the line length of the page,
+and becomes ugly or is exposed to truncation by the output device.
+.
+When a table entry requires more conventional typesetting,
+breaking across more than one output line
+(and thereby increasing the height of its row),
+it can be placed within a
+.I text block.
+.
+.
+.P
+.I @g@tbl
+interprets a table entry beginning with
+.RB \[lq] T{ \[rq]
+at the end of an input line not as table data,
+but as a token starting a text block.
+.
+Similarly,
+.RB \[lq] T} \[rq]
+at the start of an input line ends a text block;
+it must also end the table entry.
+.
+Text block tokens can share an input line with other table data
+(preceding
+.B T{
+and following
+.BR T} ).
+.
+Input lines between these tokens are formatted in a diversion by
+.IR troff . \" generic
+.
+Text blocks cannot be nested.
+.
+Multiple text blocks can occur in a table row.
+.
+.
+.P
+Text blocks are formatted as was the text prior to the table,
+modified by applicable column descriptors.
+.
+Specifically,
+the classifiers
+.BR A ,
+.BR C ,
+.BR L ,
+.BR N ,
+.BR R ,
+and
+.B S
+determine a text block's
+.I alignment
+within its cell,
+but not its
+.I adjustment.
+.
+Add
+.B na
+or
+.B ad
+requests to the beginning of a text block to alter its adjustment
+distinctly from other text in the document.
+.
+As with other table entries,
+when a text block ends,
+any alterations to formatting parameters are discarded.
+.
+They do not affect subsequent table entries,
+not even other text blocks.
+.
+.
+.P
+.ne 2v
+If
+.B w
+or
+.B x
+modifiers are not specified for
+.I all
+columns of a text block's span,
+the default length of the text block
+(more precisely,
+the line length used to process the text block diversion)
+is computed as
+.IR L \[tmu] C /( N +1),
+.\" ...and rounded to the horizontal motion quantum of the output device
+where
+.I L
+is the current line length,
+.I C
+the number of columns spanned by the text block,
+and
+.I N
+the number of columns in the table.
+.
+If necessary,
+you can also control a text block's width by including an
+.B ll
+(line length)
+request in it prior to any text to be formatted.
+.
+Because a diversion is used to format the text block,
+its height and width are subsequently available in the registers
+.B dn
+and
+.BR dl ,
+respectively.
+.
+.
+.\" ====================================================================
+.SS \f[I]roff\f[] interface
+.\" ====================================================================
+.
+The register
+.B TW
+stores the width of the table region in basic units;
+it can't be used within the region itself,
+but is defined before the
+.B .TE
+token is output so that a
+.I groff
+macro named
+.B TE
+can make use of it.
+.
+.B T.\&
+is a Boolean-valued register indicating whether the bottom of the table
+is being processed.
+.
+The
+.B #T
+register marks the top of the table.
+.
+Avoid using these names for any other purpose.
+.
+.
+.P
+.I @g@tbl
+also defines a macro
+.B T#
+to produce the bottom and side lines of a boxed table.
+.
+While
+.I @g@tbl
+itself arranges for the output to include a call of this macro at the
+end of such a table,
+it can also be used by macro packages to create boxes for multi-page
+tables by calling it from a page footer macro that is itself called by
+a trap planted near the bottom of the page.
+.
+See section \[lq]Limitations\[rq] below for more on multi-page tables.
+.
+.
+.P
+GNU
+.I tbl \" GNU
+.\" AT&T tbl used all kinds of registers; many began with "3".
+internally employs register,
+string,
+macro,
+and diversion names beginning with the
+.RB numeral\~ 3 .
+.
+A document to be preprocessed with GNU
+.I tbl \" GNU
+should not use any such identifiers.
+.\" XXX: Why are they not named starting with "gtbl*" or something? GNU
+.\" tbl turns AT&T troff compatibility mode off anyway.
+.
+.
+.\" ====================================================================
+.SS "Interaction with \f[I]@g@eqn\f[]"
+.\" ====================================================================
+.
+.I @g@tbl
+should always be called before
+.MR @g@eqn @MAN1EXT@ .
+.
+(\c
+.MR groff @MAN1EXT@
+automatically arranges preprocessors in the correct order.)
+.
+Don't call the
+.B EQ
+and
+.B EN
+macros within tables;
+instead,
+set up delimiters in your
+.I eqn \" generic
+input and use the
+.B \%delim
+region option so that
+.I @g@tbl
+will recognize them.
+.
+.
+.br
+.ne 5v \" Keep enough space for heading, intro sentence, and first item.
+.\" ====================================================================
+.SS "GNU \f[I]tbl\f[] enhancements"
+.\" ====================================================================
+.
+In addition to extensions noted above,
+GNU
+.I tbl \" GNU
+removes constraints endured by users of AT&T
+.IR tbl .\" AT&T
+.
+.
+.IP \[bu] 2n
+Region options can be specified in any lettercase.
+.
+.
+.IP \[bu]
+There is no limit on the number of columns in a table,
+regardless of their classification,
+nor any limit on the number of text blocks.
+.
+.
+.IP \[bu]
+All table rows are considered when deciding column widths,
+not just those occurring in the first 200 input lines of a region.
+.
+Similarly,
+table continuation
+.RB ( .T& )
+tokens are recognized outside a region's first 200 input lines.
+.
+.
+.IP \[bu]
+Numeric and alphabetic entries may appear in the same column.
+.
+.
+.IP \[bu]
+Numeric and alphabetic entries may span horizontally.
+.
+.
+.\" ====================================================================
+.SS "Using GNU \f[I]tbl\f[] within macros"
+.\" ====================================================================
+.
+You can embed a table region inside a macro definition.
+.
+However,
+since
+.I @g@tbl
+writes its own macro definitions at the beginning of each table region,
+it is necessary to call end macros instead of ending macro definitions
+with
+.RB \[lq] ..\& \[rq].
+.\" XXX: Why don't we fix that by ending all of tbl's own macro
+.\" definitions with a call to a macro in its own reserved name space?
+.
+Additionally,
+the escape character must be disabled. \" XXX: Why?
+.
+.
+.P
+Not all
+.I @g@tbl
+features can be exercised from such macros because
+.I @g@tbl
+is a
+.I roff
+preprocessor:
+it sees the input earlier than
+.I @g@troff
+does.
+.
+For example,
+vertically aligning decimal separators fails if the numbers containing
+them occur as macro or string parameters;
+the alignment is performed by
+.I @g@tbl
+itself,
+which sees only
+.BR \[rs]$1 ,
+.BR \[rs]$2 ,
+and so on,
+and therefore can't recognize a decimal separator that only appears
+later when
+.I @g@troff
+interpolates a macro or string definition.
+.
+.
+.\" XXX: The following is a general caveat about preprocessors; move it.
+.P
+Using
+.I @g@tbl
+macros within conditional input
+(that is,
+contingent upon an
+.BR if ,
+.BR ie ,
+.BR el ,
+or
+.B while
+request)
+can result in misleading line numbers in subsequent diagnostics.
+.
+.I @g@tbl
+unconditionally injects its output into the source document,
+but the conditional branch containing it may not be taken,
+and if it is not,
+the
+.B lf
+requests that
+.I @g@tbl
+injects to restore the source line number cannot take effect.
+.
+Consider copying the input line counter register
+.B c.\&
+and restoring its value at a convenient location after applicable
+arithmetic.
+.
+.
+.br
+.ne 5v
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.B \-C
+Enable AT&T compatibility mode:
+recognize
+.B .TS
+and
+.B .TE
+even when followed by a character other than space or newline.
+.
+Furthermore,
+interpret the uninterpreted leader escape sequence
+.BR \[rs]a .
+.
+.
+.\" ====================================================================
+.SH Limitations
+.\" ====================================================================
+.
+Multi-page tables,
+if boxed and/or if you want their column headings repeated after page
+breaks,
+require support at the time the document is formatted.
+.
+A convention for such support has arisen in macro packages such as
+.IR ms ,
+.IR mm ,
+and
+.IR me .
+.
+To use it,
+follow the
+.B .TS
+token with a space and then
+.RB \[lq] H \[rq];
+this will be interpreted by the formatter
+as a
+.B TS
+macro call with an
+.B H
+argument.
+.
+Then,
+within the table data,
+call the
+.B TH
+macro;
+this informs the macro package where the headings end.
+.
+If your table has no such heading rows,
+or you do not desire their repetition,
+call
+.B TH
+immediately after the table format specification.
+.
+If a multi-page table is boxed or has repeating column headings,
+do not enclose it with keep/release macros,
+or divert it in any other way.
+.
+Further,
+the
+.B bp
+request will not cause a page break in a
+.RB \[lq] "TS H" \[rq]
+table.
+.
+Define a macro to wrap
+.BR bp :
+invoke it normally if there is no current diversion.
+.
+Otherwise,
+pass the macro call to the enclosing diversion using the transparent
+line escape sequence
+.BR \[rs]!\& ;
+this will \[lq]bubble up\[rq] the page break to the output device.
+.
+See section \[lq]Examples\[rq] below for a demonstration.
+.
+.
+.P
+Double horizontal rules are not supported by
+.MR grotty @MAN1EXT@ ;
+single rules are used instead.
+.
+.I \%grotty
+also ignores half-line motions,
+so the
+.B u
+column modifier has no effect.
+.
+On terminal devices
+.RI (\[lq] nroff\~ mode\[rq]),
+horizontal rules and box borders occupy a full vee of space;
+this amount is doubled for
+.B doublebox
+tables.
+.
+Tables using these features thus require more vertical space in
+.I nroff
+mode than in
+.I troff
+mode:
+write
+.B ne
+requests accordingly.
+.
+Vertical rules between columns are drawn in the space between columns in
+.I nroff
+mode;
+using double vertical rules and/or reducing the column separation below
+the default can make them ugly or overstrike them with table data.
+.
+.
+.P
+A text block within a table must be able to fit on one page.
+.
+.
+.P
+Using
+.B \[rs]a
+to put leaders in table entries does not work
+in GNU
+.IR tbl , \" GNU
+except in compatibility mode.
+.
+This is correct behavior:
+.B \[rs]a
+is an
+.I uninterpreted
+leader.
+.
+You can still use the
+.I roff
+leader character (Control+A) or define a string to use
+.B \[rs]a
+as it was designed:
+to be interpreted only in copy mode.
+.
+.
+.RS
+.P
+.EX
+\&.ds a \[rs]a
+\&.TS
+\&box center tab(;);
+\&Lw(2i)0 L.
+\&Population\[rs]*a;6,327,119
+\&.TE
+.EE
+.RE
+.
+.
+.\" We use a real leader to avoid defining a string in a man page.
+.P
+.TS
+box center tab(;);
+Lw(2i)0 L.
+Population;6,327,119
+.TE
+.
+.
+.P
+A leading and/or trailing
+.B |
+in a format specification,
+such as
+.RB \[lq] |LCR|.\& \[rq],
+produces an en space between the vertical rules and the content of the
+adjacent columns.
+.
+If no such space is desired
+(so that the rule abuts the content),
+you can introduce \[lq]dummy\[rq] columns with zero separation and empty
+corresponding table entries before and/or after.
+.
+.
+.RS
+.P
+.EX
+\&.TS
+\&center tab(#);
+\&R0|L C R0|L.
+_
+\&#levulose#glucose#dextrose#
+_
+\&.TE
+.EE
+.RE
+.
+.
+.P
+These dummy columns have zero width and are therefore invisible;
+unfortunately they usually don't work as intended on terminal devices.
+.
+.
+.if t \{\
+.TS
+center tab(#);
+R0|L C R0|L.
+_
+#levulose#glucose#dextrose#
+_
+.TE
+.\}
+.
+.
+.\" ====================================================================
+.SH Examples
+.\" ====================================================================
+.
+It can be easier to acquire the language of
+.I tbl \" generic
+through examples than formal description,
+especially at first.
+.
+.
+.\" Note: This example is nearly at the column limit (78n) for nroff
+.\" output. Recast with care.
+.RS
+.P
+.EX
+\&.TS
+box center tab(#);
+Cb Cb
+L L.
+Ability#Application
+Strength#crushes a tomato
+Dexterity#dodges a thrown tomato
+Constitution#eats a month-old tomato without becoming ill
+Intelligence#knows that a tomato is a fruit
+Wisdom#chooses \[rs]f[I]not\[rs]f[] to put tomato in a fruit salad
+Charisma#sells obligate carnivores tomato-based fruit salads
+\&.TE
+.EE
+.RE
+.
+.
+.P
+.TS
+box center tab(#);
+Cb Cb
+L L.
+Ability#Application
+Strength#crushes a tomato
+Dexterity#dodges a thrown tomato
+Constitution#eats a month-old tomato without becoming ill
+Intelligence#knows that a tomato is a fruit
+Wisdom#chooses \f[I]not\f[] to put tomato in a fruit salad
+Charisma#sells obligate carnivores tomato-based fruit salads
+.TE
+.
+.
+.P
+The
+.B A
+and
+.B N
+column classifiers can be easier to grasp in visual rendering than in
+description.
+.
+.
+.RS
+.P
+.EX
+\&.TS
+center tab(;);
+CbS,LN,AN.
+Daily energy intake (in MJ)
+Macronutrients
+\&.\[rs]" assume 3 significant figures of precision
+Carbohydrates;4.5
+Fats;2.25
+Protein;3
+\&.T&
+LN,AN.
+Mineral
+Pu\-239;14.6
+_
+\&.T&
+LN.
+Total;\[rs][ti]24.4
+\&.TE
+.EE
+.RE
+.
+.
+.RS
+.P
+.TS
+center tab(;);
+CbS,LN,AN.
+Daily energy intake (in MJ)
+.\" assume 3 significant figures of precision
+Macronutrients
+Carbohydrates;4.5
+Fats;2.25
+Protein;3
+.T&
+LN,AN.
+Mineral
+Pu-239;14.6
+_
+.T&
+LN.
+Total;\[ti]24.4
+.TE
+.RE
+.
+.
+.br
+.ne 12v
+.P
+Next,
+we'll lightly adapt a compact presentation of spanning,
+vertical alignment,
+and zero-width column modifiers from the
+.I mandoc
+reference for its
+.I tbl \" generic
+interpreter.
+.
+It rewards close study.
+.
+.
+.RS
+.P
+.EX
+\&.TS
+box center tab(:);
+Lz S | Rt
+Ld| Cb| \[ha]
+\[ha] | Rz S.
+left:r
+l:center:
+:right
+\&.TE
+.EE
+.RE
+.
+.
+.RS
+.P
+.TS
+box center tab(:);
+Lz S | Rt
+Ld| Cb| ^
+^ | Rz S.
+left:r
+l:center:
+:right
+.TE
+.RE
+.
+.
+.P
+.ne 2v
+Row staggering is not visually achievable on terminal devices,
+but a table using it can remain comprehensible nonetheless.
+.
+.
+.RS
+.P
+.EX
+\&.TS
+center tab(|);
+Cf(BI) Cf(BI) Cf(B), C C Cu.
+n|n\[rs]f[B]\[rs][tmu]\[rs]f[]n|difference
+1|1
+2|4|3
+3|9|5
+4|16|7
+5|25|9
+6|36|11
+\&.TE
+.EE
+.RE
+.
+.
+.RS
+.P
+.TS
+center tab(|);
+Cf(BI) Cf(BI) Cf(B), C C Cu.
+n|n\f[B]\[tmu]\f[]n|difference
+1|1
+2|4|3
+3|9|5
+4|16|7
+5|25|9
+6|36|11
+.TE
+.RE
+.
+.
+.P
+Some
+.I @g@tbl
+features cannot be illustrated in the limited environment of a portable
+man page.
+.
+.
+.\" TODO: Find a better example than this.
+.\".P
+.\"As noted above,
+.\"we can embed a table region in a
+.\".I groff
+.\"macro definition.
+.\".
+.\".IR @g@tbl ,
+.\"however,
+.\"cannot know what will result from any macro argument interpolations,
+.\"so we might confine such interpolations to one column of the table and
+.\"apply the
+.\".B x
+.\"modifier to it.
+.\".
+.\".
+.\".RS
+.\".P
+.\".EX
+.\"\&.de END
+.\"\&..
+.\"\&.eo
+.\"\&.de MYTABLE END
+.\"\&.TS
+.\"\&allbox tab(;);
+.\"\&C Lx.
+.\"\&This is table \[rs]$1.;\[rs]$2
+.\"\&.TE
+.\"\&.END
+.\"\&.ec
+.\"\&.MYTABLE 1 alpha
+.\"\&.MYTABLE 2 beta
+.\"\&.MYTABLE 3 "gamma delta"
+.\".EE
+.\".RE
+.\"
+.\"
+.P
+We can define a macro outside of a
+.I tbl \" generic
+region that we can call from within it to cause a page break inside a
+multi-page boxed table.
+.
+You can choose a different name;
+be sure to change both occurrences of \[lq]BP\[rq].
+.
+.
+.RS
+.P
+.ne 4v
+.EX
+\&.de BP
+\&.\& ie \[aq]\[rs]\[rs]n(.z\[aq]\[aq] \&.bp \[rs]\[rs]$1
+\&.\& el \[rs]!.BP \[rs]\[rs]$1
+\&..
+.EE
+.RE
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+\[lq]Tbl\[em]A Program to Format Tables\[rq],
+by M.\& E.\& Lesk,
+1976
+(revised 16 January 1979),
+AT&T Bell Laboratories Computing Science Technical Report No.\& 49.
+.
+.
+.P
+The spanning example above was taken from
+.UR https://man.openbsd.org/tbl.7
+.IR mandoc 's
+man page for its
+.I tbl \" mandoc
+implementation
+.UE .
+.
+.
+.P
+.MR groff @MAN1EXT@ ,
+.MR @g@troff @MAN1EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_tbl_1_man_C]
+.do rr *groff_tbl_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/preproc/tbl/tbl.am b/src/preproc/tbl/tbl.am
new file mode 100644
index 0000000..d4b0edb
--- /dev/null
+++ b/src/preproc/tbl/tbl.am
@@ -0,0 +1,54 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+prefixexecbin_PROGRAMS += tbl
+tbl_LDADD = libgroff.a $(LIBM) lib/libgnu.a
+tbl_SOURCES = \
+ src/preproc/tbl/main.cpp \
+ src/preproc/tbl/table.cpp \
+ src/preproc/tbl/table.h
+PREFIXMAN1 += src/preproc/tbl/tbl.1
+EXTRA_DIST += src/preproc/tbl/tbl.1.man
+
+tbl_TESTS = \
+ src/preproc/tbl/tests/boxes-and-vertical-rules.sh \
+ src/preproc/tbl/tests/check-horizontal-line-length.sh \
+ src/preproc/tbl/tests/check-line-intersections.sh \
+ src/preproc/tbl/tests/check-vertical-line-length.sh \
+ src/preproc/tbl/tests/cooperate-with-nm-request.sh \
+ src/preproc/tbl/tests/count-continued-input-lines.sh \
+ src/preproc/tbl/tests/do-not-overdraw-page-top-in-nroff-mode.sh \
+ src/preproc/tbl/tests/do-not-overlap-bottom-border-in-nroff.sh \
+ src/preproc/tbl/tests/do-not-segv-on-invalid-vertical-span-entry.sh \
+ src/preproc/tbl/tests/do-not-segv-when-backslash-R-in-text-block.sh \
+ src/preproc/tbl/tests/expand-region-option-works.sh \
+ src/preproc/tbl/tests/format-time-diagnostics-work.sh \
+ src/preproc/tbl/tests/save-and-restore-hyphenation-parameters.sh \
+ src/preproc/tbl/tests/save-and-restore-inter-sentence-space.sh \
+ src/preproc/tbl/tests/save-and-restore-line-numbering.sh \
+ src/preproc/tbl/tests/save-and-restore-tab-stops.sh \
+ src/preproc/tbl/tests/warn-on-long-boxed-unkept-table.sh \
+ src/preproc/tbl/tests/x-column-modifier-works.sh
+TESTS += $(tbl_TESTS)
+EXTRA_DIST += $(tbl_TESTS)
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/preproc/tbl/tests/boxes-and-vertical-rules.sh b/src/preproc/tbl/tests/boxes-and-vertical-rules.sh
new file mode 100755
index 0000000..0471188
--- /dev/null
+++ b/src/preproc/tbl/tests/boxes-and-vertical-rules.sh
@@ -0,0 +1,174 @@
+#!/bin/sh
+#
+# Copyright (C) 2023 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo ...FAILED >&2
+ fail=YES
+}
+
+# Test behavior of unexpanded tables using boxes and/or vertical rules.
+
+# Case 1: "naked" table
+
+input='.ll 64n
+.nf
+1234567890123456789012345678901234567890123456789012345678901234
+.fi
+.TS
+tab(@);
+L L L L L.
+abcdef@abcdef@abcdef@abcdef@abcdef
+.TE
+.pl \n(nlu'
+
+echo "checking unboxed table without vertical rules" >&2
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii)
+echo "$output"
+# 3 spaces between table entries
+echo "$output" | sed -n '2p' \
+ | grep -qx 'abcdef abcdef abcdef abcdef abcdef' || wail
+
+# Case 2: left-hand vertical rule
+
+input='.ll 64n
+.nf
+1234567890123456789012345678901234567890123456789012345678901234
+.fi
+.TS
+tab(@);
+| L L L L L.
+abcdef@abcdef@abcdef@abcdef@abcdef
+.TE
+.pl \n(nlu'
+
+echo "checking unboxed table with left-hand rule" >&2
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii)
+echo "$output"
+# 3 spaces between table entries
+echo "$output" | sed -n '3p' \
+ | grep -qx '| abcdef abcdef abcdef abcdef abcdef' || wail
+
+# Case 3: right-hand vertical rule
+
+input='.ll 64n
+.nf
+1234567890123456789012345678901234567890123456789012345678901234
+.fi
+.TS
+tab(@);
+L L L L L |.
+abcdef@abcdef@abcdef@abcdef@abcdef
+.TE
+.pl \n(nlu'
+
+echo "checking unboxed table with right-hand rule" >&2
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii)
+echo "$output"
+# 3 spaces between table entries
+echo "$output" | sed -n '3p' \
+ | grep -qx 'abcdef abcdef abcdef abcdef abcdef |' || wail
+
+# Case 4: vertical rule on both ends
+
+input='.ll 64n
+.nf
+1234567890123456789012345678901234567890123456789012345678901234
+.fi
+.TS
+tab(@);
+| L L L L L |.
+abcdef@abcdef@abcdef@abcdef@abcdef
+.TE
+.pl \n(nlu'
+
+echo "checking unboxed table with both rules" >&2
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii)
+echo "$output"
+# 3 spaces between table entries
+echo "$output" | sed -n '3p' \
+ | grep -qx '| abcdef abcdef abcdef abcdef abcdef |' || wail
+
+# Case 5: vertical rule on both ends and interior rule
+
+input='.ll 64n
+.nf
+1234567890123456789012345678901234567890123456789012345678901234
+.fi
+.TS
+tab(@);
+| L L L | L L |.
+abcdef@abcdef@abcdef@abcdef@abcdef
+.TE
+.pl \n(nlu'
+
+echo "checking unboxed table with both edge and interior rules" >&2
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii)
+echo "$output"
+# 3 spaces between table entries
+echo "$output" | sed -n '3p' \
+ | grep -qx '| abcdef abcdef abcdef | abcdef abcdef |' || wail
+
+# Case 6: boxed table
+
+input='.ll 64n
+.nf
+1234567890123456789012345678901234567890123456789012345678901234
+.fi
+.TS
+box tab(@);
+L L L L L.
+abcdef@abcdef@abcdef@abcdef@abcdef
+.TE
+.pl \n(nlu'
+
+echo "checking boxed table without interior rules" >&2
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii)
+echo "$output"
+# 3 spaces between table entries
+echo "$output" | sed -n '3p' \
+ | grep -qx '| abcdef abcdef abcdef abcdef abcdef |' || wail
+
+# Case 7: boxed table with interior vertical rule
+
+input='.ll 64n
+.nf
+1234567890123456789012345678901234567890123456789012345678901234
+.fi
+.TS
+box tab(@);
+L L L | L L.
+abcdef@abcdef@abcdef@abcdef@abcdef
+.TE
+.pl \n(nlu'
+
+echo "checking boxed table with interior rules" >&2
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii)
+echo "$output"
+# 3 spaces between table entries
+echo "$output" | sed -n '3p' \
+ | grep -qx '| abcdef abcdef abcdef | abcdef abcdef |' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/preproc/tbl/tests/check-horizontal-line-length.sh b/src/preproc/tbl/tests/check-horizontal-line-length.sh
new file mode 100755
index 0000000..3d5e2a2
--- /dev/null
+++ b/src/preproc/tbl/tests/check-horizontal-line-length.sh
@@ -0,0 +1,78 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ echo "$output"
+ fail=yes
+}
+
+# GNU tbl draws horizontal lines 1n wider than they need to be on nroff
+# devices to enable them to cross a vertical line on the right-hand
+# side.
+
+input='.ll 10n
+.TS
+L.
+_
+1234567890
+.TE
+.pl \n(nlu
+'
+
+echo "checking length of plain horizontal rule" >&2
+output=$(printf "%s" "$input" | "$groff" -Tascii -t)
+echo "$output" | grep -Eqx -- '-{11}' || wail
+
+input='.ll 12n
+.TS
+| L |.
+_
+1234567890
+_
+.TE
+.pl \n(nlu
+'
+
+echo "checking intersection of vertical and horizontal rules" >&2
+output=$(printf "%s" "$input" | "$groff" -Tascii -t)
+echo "$output" | sed -n '1p' | grep -Eqx '\+-{12}\+' || wail
+echo "$output" | sed -n '3p' | grep -Eqx '\+-{12}\+' || wail
+
+input='.ll 12n
+.TS
+box;
+L.
+1234567890
+.TE
+.pl \n(nlu
+'
+
+echo "checking width of boxed table" >&2
+output=$(printf "%s" "$input" | "$groff" -Tascii -t)
+echo "$output" | sed -n '1p' | grep -Eqx '\+-{12}\+' || wail
+echo "$output" | sed -n '3p' | grep -Eqx '\+-{12}\+' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/preproc/tbl/tests/check-line-intersections.sh b/src/preproc/tbl/tests/check-line-intersections.sh
new file mode 100755
index 0000000..2012beb
--- /dev/null
+++ b/src/preproc/tbl/tests/check-line-intersections.sh
@@ -0,0 +1,52 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ echo "$output"
+ fail=yes
+}
+
+input='.TS
+allbox tab(@);
+L L L.
+a@b@c
+d@e@f
+g@h@i
+.TE
+'
+
+output=$(printf "%s" "$input" | "$groff" -Tascii -t)
+echo "$output"
+
+for l in 1 3 5 7
+do
+ echo "checking intersections on line $l"
+ echo "$output" | sed -n ${l}p | grep -Fqx '+---+---+---+' || wail
+done
+
+# TODO: Check `-Tutf8` output for correct crossing glyph identities.
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/preproc/tbl/tests/check-vertical-line-length.sh b/src/preproc/tbl/tests/check-vertical-line-length.sh
new file mode 100755
index 0000000..1aafd09
--- /dev/null
+++ b/src/preproc/tbl/tests/check-vertical-line-length.sh
@@ -0,0 +1,49 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ echo "$output"
+ fail=yes
+}
+
+# GNU tbl draws vertical lines 1v taller than they need to be on nroff
+# devices to enable them to cross a potential horizontal line in the
+# table.
+
+input='.ll 12n
+.TS
+| L |.
+_
+1234567890
+.TE
+.pl \n(nlu
+'
+
+echo "checking length of plain vertical rule" >&2
+output=$(printf "%s" "$input" | "$groff" -Tascii -t)
+echo "$output" | sed -n '2p' | grep -Fqx -- '| 1234567890 |' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/preproc/tbl/tests/cooperate-with-nm-request.sh b/src/preproc/tbl/tests/cooperate-with-nm-request.sh
new file mode 100755
index 0000000..cfbd750
--- /dev/null
+++ b/src/preproc/tbl/tests/cooperate-with-nm-request.sh
@@ -0,0 +1,47 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+set -e
+
+# Regression-test Savannah #59812.
+#
+# A nonzero value of \n[ln] should not cause spurious numbering of table
+# rows.
+
+DOC='\
+.nf
+foo
+.nm 1
+bar
+.nm
+baz
+.TS
+l.
+qux
+.TE
+'
+
+OUTPUT=$(printf "%s" "$DOC" | "$groff" -Tascii -t)
+
+echo "$OUTPUT" | grep -Fqx qux
+
+# vim:set ai noet sw=4 ts=4 tw=72:
diff --git a/src/preproc/tbl/tests/count-continued-input-lines.sh b/src/preproc/tbl/tests/count-continued-input-lines.sh
new file mode 100755
index 0000000..4682788
--- /dev/null
+++ b/src/preproc/tbl/tests/count-continued-input-lines.sh
@@ -0,0 +1,43 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+set -e
+
+# Regression-test Savannah #62191.
+#
+# Line continuation in a row of table data should not make the input
+# line counter inaccurate.
+
+input='.this-is-line-1
+.TS
+L.
+foo\
+bar\
+baz\
+qux
+.TE
+.this-is-line-9'
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -t -ww -z 2>&1)
+echo "$output" | grep -q '^troff.*:9:.*this-is-line-9'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/preproc/tbl/tests/do-not-overdraw-page-top-in-nroff-mode.sh b/src/preproc/tbl/tests/do-not-overdraw-page-top-in-nroff-mode.sh
new file mode 100755
index 0000000..c4698f1
--- /dev/null
+++ b/src/preproc/tbl/tests/do-not-overdraw-page-top-in-nroff-mode.sh
@@ -0,0 +1,225 @@
+#!/bin/sh
+#
+# Copyright (C) 2022-2023 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+grotty="${abs_top_builddir:-.}/grotty"
+
+fail=
+
+wail () {
+ echo ...FAILED >&2
+ fail=YES
+}
+
+# Regression-test Savannah #63449.
+#
+# In nroff mode, a table at the top of the page (i.e., one starting at
+# the first possible output line, with no vertical margin) that has
+# vertical rules should not overdraw the page top and provoke a warning
+# from grotty about "character(s) above [the] first line [being]
+# discarded".
+
+# Case 1: No horizontal rules; vertical rule at leading column.
+input='.TS
+| L.
+foo
+.TE'
+
+tmp=$(printf "%s\n" "$input" | "$groff" -t -Z -Tascii -P-cbou)
+output=$(printf "%s" "$tmp" | "$grotty" -F ./font 2>/dev/null)
+error=$(printf "%s" "$tmp" | "$grotty" -F ./font 2>&1 >/dev/null)
+echo "$output"
+
+echo "checking that no diagnostic messages are produced by grotty (1)"
+echo "$error" | grep -q 'grotty:' && wail
+
+echo "checking that a lone vertical rule starts the first output line"
+echo "$output" | sed -n '1p' | grep -Fqx '|' || wail
+
+# Case 2: No horizontal rules; vertical rule between columns.
+input='.TS
+tab(@);
+L | L.
+foo@bar
+.TE'
+
+tmp=$(printf "%s\n" "$input" | "$groff" -t -Z -Tascii -P-cbou)
+output=$(printf "%s" "$tmp" | "$grotty" -F ./font 2>/dev/null)
+error=$(printf "%s" "$tmp" | "$grotty" -F ./font 2>&1 >/dev/null)
+echo "$output"
+
+echo "checking that no diagnostic messages are produced by grotty (2)"
+echo "$error" | grep -q 'grotty:' && wail
+
+echo "checking that a lone vertical rule ends the first output line"
+echo "$output" | sed -n '1p' | grep -Eqx ' +\|' || wail
+
+# Case 3: No horizontal rules; vertical rule at trailing column.
+input='.TS
+L |.
+foo
+.TE'
+
+tmp=$(printf "%s\n" "$input" | "$groff" -t -Z -Tascii -P-cbou)
+output=$(printf "%s" "$tmp" | "$grotty" -F ./font 2>/dev/null)
+error=$(printf "%s" "$tmp" | "$grotty" -F ./font 2>&1 >/dev/null)
+echo "$output"
+
+echo "checking that no diagnostic messages are produced by grotty (3)"
+echo "$error" | grep -q 'grotty:' && wail
+
+echo "checking that a lone vertical rule ends the first output line"
+echo "$output" | sed -n '1p' | grep -Eqx ' +\|' || wail
+
+# Case 4: Vertical rule with horizontal rule in row description.
+input='.TS
+_
+L |.
+foo
+.TE'
+
+tmp=$(printf "%s\n" "$input" | "$groff" -t -Z -Tascii -P-cbou)
+output=$(printf "%s" "$tmp" | "$grotty" -F ./font 2>/dev/null)
+error=$(printf "%s" "$tmp" | "$grotty" -F ./font 2>&1 >/dev/null)
+echo "$output"
+
+echo "checking that no diagnostic messages are produced by grotty (4)"
+echo "$error" | grep -q 'grotty:' && wail
+
+echo "checking that intersection is placed on the first output line"
+echo "$output" | sed -n '1p' | grep -q '+' || wail
+
+# Case 5: Vertical rule with horizontal rule as first table datum.
+input='.TS
+L |.
+_
+foo
+.TE'
+
+tmp=$(printf "%s\n" "$input" | "$groff" -t -Z -Tascii -P-cbou)
+output=$(printf "%s" "$tmp" | "$grotty" -F ./font 2>/dev/null)
+error=$(printf "%s" "$tmp" | "$grotty" -F ./font 2>&1 >/dev/null)
+echo "$output"
+
+echo "checking that no diagnostic messages are produced by grotty (5)"
+echo "$error" | grep -q 'grotty:' && wail
+
+echo "checking that intersection is placed on the first output line"
+echo "$output" | sed -n '1p' | grep -q '+' || wail
+
+# Case 6: Horizontal rule as non-first row description with vertical
+# rule.
+input='.TS
+L,_,L |.
+foo
+bar
+.TE'
+
+tmp=$(printf "%s\n" "$input" | "$groff" -t -Z -Tascii -P-cbou)
+output=$(printf "%s" "$tmp" | "$grotty" -F ./font 2>/dev/null)
+error=$(printf "%s" "$tmp" | "$grotty" -F ./font 2>&1 >/dev/null)
+echo "$output"
+
+echo "checking that no diagnostic messages are produced by grotty (6)"
+echo "$error" | grep -q 'grotty:' && wail
+
+echo "checking that table data begin on first output line"
+echo "$output" | sed -n '1p' | grep -q 'foo' || wail
+
+# Also ensure that no collateral damage arises in related cases.
+
+# Case 7: Horizontal rule as first table datum with no vertical rule.
+input='.TS
+L.
+_
+foo
+.TE'
+
+tmp=$(printf "%s\n" "$input" | "$groff" -t -Z -Tascii -P-cbou)
+output=$(printf "%s" "$tmp" | "$grotty" -F ./font 2>/dev/null)
+error=$(printf "%s" "$tmp" | "$grotty" -F ./font 2>&1 >/dev/null)
+echo "$output"
+
+echo "checking that no diagnostic messages are produced by grotty (7)"
+echo "$error" | grep -q 'grotty:' && wail
+
+echo "checking that horizontal rule is placed on the first output line"
+echo "$output" | sed -n '1p' | grep -q '^---' || wail
+
+# Case 8: Horizontal rule as last table datum with no vertical rule.
+input='.TS
+L.
+foo
+_
+.TE
+.ec @
+.pl @n(nlu'
+
+tmp=$(printf "%s\n" "$input" | "$groff" -t -Z -Tascii -P-cbou)
+output=$(printf "%s" "$tmp" | "$grotty" -F ./font 2>/dev/null)
+error=$(printf "%s" "$tmp" | "$grotty" -F ./font 2>&1 >/dev/null)
+echo "$output"
+
+echo "checking that no diagnostic messages are produced by grotty (8)"
+echo "$error" | grep -q 'grotty:' && wail
+
+echo "checking that horizontal rule is placed on the last output line"
+echo "$output" | sed -n '$p' | grep -q '^---' || wail
+
+# Case 9: Horizontal rule in row description with no vertical rule.
+input='.TS
+_
+L.
+foo
+.TE'
+
+tmp=$(printf "%s\n" "$input" | "$groff" -t -Z -Tascii -P-cbou)
+output=$(printf "%s" "$tmp" | "$grotty" -F ./font 2>/dev/null)
+error=$(printf "%s" "$tmp" | "$grotty" -F ./font 2>&1 >/dev/null)
+echo "$output"
+
+echo "checking that no diagnostic messages are produced by grotty (9)"
+echo "$error" | grep -q 'grotty:' && wail
+
+echo "checking that intersection is placed on the first output line"
+echo "$output" | sed -n '1p' | grep -q '^---' || wail
+
+# Case 10: Horizontal rule as non-first row description with no vertical
+# rule.
+input='.TS
+L,_,L.
+foo
+bar
+.TE'
+
+tmp=$(printf "%s\n" "$input" | "$groff" -t -Z -Tascii -P-cbou)
+output=$(printf "%s" "$tmp" | "$grotty" -F ./font 2>/dev/null)
+error=$(printf "%s" "$tmp" | "$grotty" -F ./font 2>&1 >/dev/null)
+echo "$output"
+
+echo "checking that no diagnostic messages are produced by grotty (10)"
+echo "$error" | grep -q 'grotty:' && wail
+
+echo "checking that table data begin on first output line"
+echo "$output" | sed -n '1p' | grep -q 'foo' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/preproc/tbl/tests/do-not-overlap-bottom-border-in-nroff.sh b/src/preproc/tbl/tests/do-not-overlap-bottom-border-in-nroff.sh
new file mode 100755
index 0000000..4f63eed
--- /dev/null
+++ b/src/preproc/tbl/tests/do-not-overlap-bottom-border-in-nroff.sh
@@ -0,0 +1,62 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ fail=yes
+}
+
+# Regression-test Savannah #49390.
+
+input='foo
+.TS
+box;
+L.
+bar
+.TE
+baz
+.pl \n(nlu
+'
+
+echo "checking for post-table text non-overlap of (single) box border"
+output=$(printf "%s" "$input" | "$groff" -t -Tascii)
+echo "$output" | grep -q baz || wail
+
+input='foo
+.TS
+doublebox;
+L.
+bar
+.TE
+baz
+.pl \n(nlu
+'
+
+echo "checking for post-table text non-overlap of double box border"
+output=$(printf "%s" "$input" | "$groff" -t -Tascii)
+echo "$output" | grep -q baz || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/preproc/tbl/tests/do-not-segv-on-invalid-vertical-span-entry.sh b/src/preproc/tbl/tests/do-not-segv-on-invalid-vertical-span-entry.sh
new file mode 100755
index 0000000..1d672ec
--- /dev/null
+++ b/src/preproc/tbl/tests/do-not-segv-on-invalid-vertical-span-entry.sh
@@ -0,0 +1,41 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+tbl="${abs_top_builddir:-.}/tbl"
+
+# Regression-test Savannah #61417.
+#
+# Don't segfault because we tried to span down from an invalid span that
+# tbl neglected to replace with an empty table entry.
+
+test -f core && exit 77 # skip
+
+input=$(cat <<EOF
+.TS
+l.
+\^
+\^
+.TE
+EOF
+)
+output=$(printf "%s" "$input" | "$tbl")
+! test -f core
+
+# vim:set ai noet sw=4 ts=4 tw=72:
diff --git a/src/preproc/tbl/tests/do-not-segv-when-backslash-R-in-text-block.sh b/src/preproc/tbl/tests/do-not-segv-when-backslash-R-in-text-block.sh
new file mode 100755
index 0000000..30bd9f6
--- /dev/null
+++ b/src/preproc/tbl/tests/do-not-segv-when-backslash-R-in-text-block.sh
@@ -0,0 +1,75 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ fail=yes
+}
+
+# Regression-test Savannah #62366.
+#
+# Do not SEGV when a text block begins with a repeating glyph token, and
+# do not malformat the output if it ends with one.
+
+test -f core && exit 77 # skip
+
+input='.TS
+L.
+T{
+\Ra
+T}
+.TE
+.TS
+L.
+T{
+foo
+\Ra
+T}
+.TE
+.TS
+L.
+T{
+foo
+\Ra
+bar
+T}
+.TE'
+
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii -P-cbou)
+
+echo "checking that tbl doesn't segfault" >&2
+test -f core && wail
+
+echo "checking text block starting with repeating glyph" >&2
+echo "$output" | sed -n 1p | grep -qx 'a' || wail
+
+echo "checking text block ending with repeating glyph" >&2
+echo "$output" | sed -n 2p | grep -qx 'foo a' || wail
+
+echo "checking text block containing repeating glyph" >&2
+echo "$output" | sed -n 3p | grep -qx 'foo a bar' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/preproc/tbl/tests/expand-region-option-works.sh b/src/preproc/tbl/tests/expand-region-option-works.sh
new file mode 100755
index 0000000..97da39d
--- /dev/null
+++ b/src/preproc/tbl/tests/expand-region-option-works.sh
@@ -0,0 +1,173 @@
+#!/bin/sh
+#
+# Copyright (C) 2023 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo ...FAILED >&2
+ fail=YES
+}
+
+# Ensure that the "expand" region option expands to the line length.
+
+# Case 1: "naked" table
+
+input='.ll 64n
+.nf
+1234567890123456789012345678901234567890123456789012345678901234
+.fi
+.TS
+expand tab(@);
+L L L L L.
+abcdef@abcdef@abcdef@abcdef@abcdef
+.TE
+.pl \n(nlu'
+
+echo "checking unboxed table without vertical rules" >&2
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii)
+echo "$output"
+echo "$output" | sed -n '2p' \
+ | grep -Eqx '(abcdef {8,9}){4}abcdef' || wail
+
+# Case 2: left-hand vertical rule
+
+input='.ll 64n
+.nf
+1234567890123456789012345678901234567890123456789012345678901234
+.fi
+.TS
+expand tab(@);
+| L L L L L.
+abcdef@abcdef@abcdef@abcdef@abcdef
+.TE
+.pl \n(nlu'
+
+echo "checking unboxed table with left-hand rule" >&2
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii)
+echo "$output"
+echo "$output" | sed -n '3p' \
+ | grep -Eqx '\| abcdef {8}abcdef {7}abcdef {8}abcdef {9}abcdef' \
+ || wail
+
+# Case 3: right-hand vertical rule
+
+input='.ll 64n
+.nf
+1234567890123456789012345678901234567890123456789012345678901234
+.fi
+.TS
+expand tab(@);
+L L L L L |.
+abcdef@abcdef@abcdef@abcdef@abcdef
+.TE
+.pl \n(nlu'
+
+echo "checking unboxed table with right-hand rule" >&2
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii)
+echo "$output"
+echo "$output" | sed -n '3p' \
+ | grep -Eqx 'abcdef {8}abcdef {7}abcdef {8}abcdef {9}abcdef \|' \
+ || wail
+
+# Case 4: vertical rule on both ends
+
+input='.ll 64n
+.nf
+1234567890123456789012345678901234567890123456789012345678901234
+.fi
+.TS
+expand tab(@);
+| L L L L L |.
+abcdef@abcdef@abcdef@abcdef@abcdef
+.TE
+.pl \n(nlu'
+
+echo "checking unboxed table with both rules" >&2
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii)
+echo "$output"
+echo "$output" | sed -n '3p' \
+ | grep -Eqx '\| abcdef {7}abcdef {7}abcdef {8}abcdef {8}abcdef \|' \
+ || wail
+
+# Case 5: vertical rule on both ends and interior rule
+
+input='.ll 64n
+.nf
+1234567890123456789012345678901234567890123456789012345678901234
+.fi
+.TS
+expand tab(@);
+| L L L | L L |.
+abcdef@abcdef@abcdef@abcdef@abcdef
+.TE
+.pl \n(nlu'
+
+echo "checking unboxed table with both edge and interior rules" >&2
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii)
+echo "$output"
+echo "$output" | sed -n '3p' \
+ | grep -Eqx \
+ '\| abcdef {7}abcdef {7}abcdef {4}\| {3}abcdef {8}abcdef \|' || wail
+
+# Case 6: boxed table
+
+input='.ll 64n
+.nf
+1234567890123456789012345678901234567890123456789012345678901234
+.fi
+.TS
+box expand tab(@);
+L L L L L.
+abcdef@abcdef@abcdef@abcdef@abcdef
+.TE
+.pl \n(nlu'
+
+echo "checking boxed table without interior rules" >&2
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii)
+echo "$output"
+echo "$output" | sed -n '3p' \
+ | grep -Eqx '\| abcdef {7}abcdef {7}abcdef {8}abcdef {8}abcdef \|' \
+ || wail
+
+# Case 7: boxed table with interior vertical rule
+
+input='.ll 64n
+.nf
+1234567890123456789012345678901234567890123456789012345678901234
+.fi
+.TS
+box expand tab(@);
+L L L | L L.
+abcdef@abcdef@abcdef@abcdef@abcdef
+.TE
+.pl \n(nlu'
+
+echo "checking boxed table with interior rule" >&2
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii)
+echo "$output"
+echo "$output" | sed -n '3p' \
+ | grep -Eqx \
+ '\| abcdef {7}abcdef {7}abcdef {4}\| {3}abcdef {8}abcdef \|' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/preproc/tbl/tests/format-time-diagnostics-work.sh b/src/preproc/tbl/tests/format-time-diagnostics-work.sh
new file mode 100755
index 0000000..9d422bd
--- /dev/null
+++ b/src/preproc/tbl/tests/format-time-diagnostics-work.sh
@@ -0,0 +1,268 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+set -e
+
+# Ensure we get diagnostics when we expect to, and not when we don't.
+#
+# Do NOT pattern-match the text of the diagnostic messages; those should
+# be left flexible. (Some day they might even be localized.)
+
+# As of this writing, there are 5 distinct format-time diagnostic
+# messages that tbl writes roff code to generate, one of which can be
+# produced two different ways.
+
+# Diagnostic #1: a row overruns the page bottom
+input='.pl 2v
+.TS
+;
+L.
+T{
+.nf
+1
+2
+3
+T}
+.TE
+'
+
+echo "checking for diagnostic when row with text box overruns page" \
+ "bottom"
+output=$(printf "%s" "$input" | "$groff" -Tascii -t 2>&1 >/dev/null)
+nlines=$(echo "$output" | grep . | wc -l)
+test $nlines -eq 1
+
+echo "checking 'nowarn' suppression of diagnostic when row with text" \
+ "box overruns page bottom"
+input_nowarn=$(printf "%s" "$input" | sed 's/;/nowarn;/')
+output=$(printf "%s" "$input_nowarn" \
+ | "$groff" -Tascii -t 2>&1 >/dev/null)
+nlines=$(echo "$output" | grep . | wc -l)
+test $nlines -eq 0
+
+echo "checking 'nokeep' suppression of diagnostic when row with text" \
+ "box overruns page bottom"
+input_nowarn=$(printf "%s" "$input" | sed 's/;/nokeep;/')
+output=$(printf "%s" "$input_nowarn" \
+ | "$groff" -Tascii -t 2>&1 >/dev/null)
+nlines=$(echo "$output" | grep . | wc -l)
+test $nlines -eq 0
+
+# The other way to get "diagnostic #1" is to have a row that is too
+# tall _without_ involving a text block, for instance by having a font
+# or vertical spacing that is too high.
+input='.pl 2v
+.vs 3v
+.TS
+;
+L.
+1
+.TE
+'
+
+echo "checking for diagnostic when row with large vertical spacing" \
+ "overruns page bottom"
+output=$(printf "%s" "$input" | "$groff" -Tascii -t 2>&1 >/dev/null)
+nlines=$(echo "$output" | grep . | wc -l)
+test $nlines -eq 1
+
+echo "checking 'nowarn' suppression of diagnostic when row with large" \
+ "vertical spacing overruns page bottom"
+input_nowarn=$(printf "%s" "$input" | sed 's/;/nowarn;/')
+output=$(printf "%s" "$input_nowarn" \
+ | "$groff" -Tascii -t 2>&1 >/dev/null)
+nlines=$(echo "$output" | grep . | wc -l)
+test $nlines -eq 0
+
+echo "checking 'nokeep' suppression of diagnostic when row with large" \
+ "vertical spacing overruns page bottom"
+input_nowarn=$(printf "%s" "$input" | sed 's/;/nokeep;/')
+output=$(printf "%s" "$input_nowarn" \
+ | "$groff" -Tascii -t 2>&1 >/dev/null)
+nlines=$(echo "$output" | grep . | wc -l)
+test $nlines -eq 0
+
+# Diagnostic #2: a boxed table won't fit on a page
+
+input='.pl 2v
+.vs 3v
+.TS
+box;
+L.
+1
+.TE
+'
+
+echo "checking for diagnostic when boxed table won't fit on page"
+output=$(printf "%s" "$input" | "$groff" -Tascii -t 2>&1 >/dev/null)
+nlines=$(echo "$output" | grep . | wc -l)
+test $nlines -eq 1
+
+# The above is an error, so the "nowarn" region option won't shut it up.
+#
+# However, "nokeep" does--but arguably shouldn't. See
+# <https://savannah.gnu.org/bugs/?61878>. If that gets fixed, we should
+# test that we still get a diagnostic even with the option given.
+
+# Diagnostic #3: unexpanded columns overrun the line length
+#
+# Case 1: no 'x' column modifiers used
+
+input='.pl 2v
+.ll 10n
+.TS
+;
+L.
+12345678901
+.TE
+'
+
+echo "checking for diagnostic when unexpanded columns overrun line" \
+ "length (1)"
+output=$(printf "%s" "$input" | "$groff" -Tascii -t 2>&1 >/dev/null)
+nlines=$(echo "$output" | grep . | wc -l)
+test $nlines -eq 1
+
+echo "checking 'nowarn' suppression of diagnostic when unexpanded" \
+ "columns overrun line length (1)"
+input_nowarn=$(printf "%s" "$input" | sed 's/;/nowarn;/')
+output=$(printf "%s" "$input_nowarn" \
+ | "$groff" -Tascii -t 2>&1 >/dev/null)
+nlines=$(echo "$output" | grep . | wc -l)
+test $nlines -eq 0
+
+# Avoiding keeps won't get you out of this one.
+echo "checking 'nokeep' NON-suppression of diagnostic when unexpanded" \
+ "columns overrun line length (1)"
+input_nowarn=$(printf "%s" "$input" | sed 's/;/nokeep;/')
+output=$(printf "%s" "$input_nowarn" \
+ | "$groff" -Tascii -t 2>&1 >/dev/null)
+nlines=$(echo "$output" | grep . | wc -l)
+test $nlines -eq 1
+
+# Case 2: 'x' column modifier used
+#
+# This worked as a "get out of jail (warning) free" card in groff 1.22.4
+# and earlier; i.e., it incorrectly suppressed the warning. See
+# Savannah #61854.
+
+input='.pl 2v
+.ll 10n
+.TS
+;
+Lx.
+12345678901
+.TE
+'
+
+echo "checking for diagnostic when unexpanded columns overrun line" \
+ "length (2)"
+output=$(printf "%s" "$input" | "$groff" -Tascii -t 2>&1 >/dev/null)
+nlines=$(echo "$output" | grep . | wc -l)
+test $nlines -eq 1
+
+echo "checking 'nowarn' suppression of diagnostic when unexpanded" \
+ "columns overrun line length (2)"
+input_nowarn=$(printf "%s" "$input" | sed 's/;/nowarn;/')
+output=$(printf "%s" "$input_nowarn" \
+ | "$groff" -Tascii -t 2>&1 >/dev/null)
+nlines=$(echo "$output" | grep . | wc -l)
+test $nlines -eq 0
+
+# Avoiding keeps won't get you out of this one.
+echo "checking 'nokeep' NON-suppression of diagnostic when unexpanded" \
+ "columns overrun line length (2)"
+input_nowarn=$(printf "%s" "$input" | sed 's/;/nokeep;/')
+output=$(printf "%s" "$input_nowarn" \
+ | "$groff" -Tascii -t 2>&1 >/dev/null)
+nlines=$(echo "$output" | grep . | wc -l)
+test $nlines -eq 1
+
+# Diagnostic #4: expanded table gets all column separation squashed out
+
+input='.pl 3v
+.ll 10n
+.TS
+tab(;) expand;
+L L.
+abcde;fghij
+.TE
+'
+
+echo "checking for diagnostic when region-expanded table has column" \
+ "separation eliminated"
+output=$(printf "%s" "$input" | "$groff" -Tascii -t 2>&1 >/dev/null)
+nlines=$(echo "$output" | grep . | wc -l)
+test $nlines -eq 1
+
+echo "checking 'nowarn' suppression of diagnostic when" \
+ "region-expanded table has column separation eliminated"
+input_nowarn=$(printf "%s" "$input" | sed 's/;$/ nowarn;/')
+output=$(printf "%s" "$input_nowarn" \
+ | "$groff" -Tascii -t 2>&1 >/dev/null)
+nlines=$(echo "$output" | grep . | wc -l)
+test $nlines -eq 0
+
+# Avoiding keeps won't get you out of this one.
+echo "checking 'nokeep' NON-suppression of diagnostic when" \
+ "region-expanded table has column separation eliminated"
+input_nowarn=$(printf "%s" "$input" | sed 's/;$/ nokeep;/')
+output=$(printf "%s" "$input_nowarn" \
+ | "$groff" -Tascii -t 2>&1 >/dev/null)
+nlines=$(echo "$output" | grep . | wc -l)
+test $nlines -eq 1
+
+# Diagnostic #5: expanded table gets column separation reduced
+
+input='.pl 3v
+.ll 10n
+.TS
+tab(;) expand;
+L L.
+abcd;efgh
+.TE
+'
+
+echo "checking for diagnostic when region-expanded table has column" \
+ "separation reduced"
+output=$(printf "%s" "$input" | "$groff" -Tascii -t 2>&1 >/dev/null)
+nlines=$(echo "$output" | grep . | wc -l)
+test $nlines -eq 1
+
+echo "checking 'nowarn' suppression of diagnostic when" \
+ "region-expanded table has column separation reduced"
+input_nowarn=$(printf "%s" "$input" | sed 's/;$/ nowarn;/')
+output=$(printf "%s" "$input_nowarn" \
+ | "$groff" -Tascii -t 2>&1 >/dev/null)
+nlines=$(echo "$output" | grep . | wc -l)
+test $nlines -eq 0
+
+# Avoiding keeps won't get you out of this one.
+echo "checking 'nokeep' NON-suppression of diagnostic when" \
+ "region-expanded table has column separation reduced"
+input_nowarn=$(printf "%s" "$input" | sed 's/;$/ nokeep;/')
+output=$(printf "%s" "$input_nowarn" \
+ | "$groff" -Tascii -t 2>&1 >/dev/null)
+nlines=$(echo "$output" | grep . | wc -l)
+test $nlines -eq 1
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/preproc/tbl/tests/save-and-restore-hyphenation-parameters.sh b/src/preproc/tbl/tests/save-and-restore-hyphenation-parameters.sh
new file mode 100755
index 0000000..e368b31
--- /dev/null
+++ b/src/preproc/tbl/tests/save-and-restore-hyphenation-parameters.sh
@@ -0,0 +1,58 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+set -e
+
+# Regression-test Savannah #59971.
+#
+# Hyphenation needs to be restored between (and after) text blocks just
+# as adjustment is.
+
+EXAMPLE='.nr LL 78n
+.hw a-bc-def-ghij-klmno-pqrstu-vwxyz
+.LP
+Here is a table with hyphenation disabled in its text block.
+.
+.TS
+l lx.
+foo T{
+.nh
+abcdefghijklmnopqrstuvwxyz
+abcdefghijklmnopqrstuvwxyz
+abcdefghijklmnopqrstuvwxyz
+T}
+.TE
+.
+Let us see if hyphenation is enabled again as it should be.
+abcdefghijklmnopqrstuvwxyz'
+
+OUTPUT=$(printf "%s\n" "$EXAMPLE" | "$groff" -Tascii -P-cbou -t -ms)
+
+echo "$OUTPUT"
+
+echo "testing whether hyphenation disabled in table text block" >&2
+! echo "$OUTPUT" | grep '^foo' | grep -- '-$'
+
+echo "testing whether hyphenation enabled after table" >&2
+echo "$OUTPUT" | grep -qx 'Let us see.*lmno-'
+
+# vim:set ai noet sw=4 ts=4 tw=72:
diff --git a/src/preproc/tbl/tests/save-and-restore-inter-sentence-space.sh b/src/preproc/tbl/tests/save-and-restore-inter-sentence-space.sh
new file mode 100755
index 0000000..e9a06d8
--- /dev/null
+++ b/src/preproc/tbl/tests/save-and-restore-inter-sentence-space.sh
@@ -0,0 +1,79 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo ...FAILED >&2
+ fail=YES
+}
+
+# Regression-test Savannah #61909.
+#
+# Inter-sentence space should not be applied to the content of ordinary
+# table entries. They are set "rigidly" (tbl(1)), also without filling,
+# adjustment, hyphenation or breaking. If you want those things, use a
+# text block.
+
+input='.ss 12 120
+Before one.
+Before two.
+.TS
+L.
+.\" two spaces
+Foo. Bar.
+.\" four spaces
+Baz. Qux.
+.\" two spaces
+T{
+Ack. Nak.
+T}
+.TE
+After one.
+After two.
+'
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -t)
+echo "$output"
+
+echo "checking that inter-sentence space is altered too early"
+echo "$output" \
+ | grep -Fqx 'Before one. Before two.' || wail # 11 spaces
+
+echo "checking that inter-sentence space is not applied to ordinary" \
+ "table entries (1)"
+echo "$output" | grep -Fqx 'Foo. Bar.' || wail # 2 spaces
+
+echo "checking that inter-sentence space is not applied to ordinary" \
+ "table entries (2)"
+echo "$output" | grep -Fqx 'Baz. Qux.' || wail # 4 spaces
+
+echo "checking that inter-sentence space is applied to text blocks"
+echo "$output" | grep -Fqx 'Ack. Nak.' || wail # 11 spaces
+
+echo "checking that inter-sentence space is restored after table"
+echo "$output" \
+ | grep -Fqx 'After one. After two.' || wail # 11 spaces
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/preproc/tbl/tests/save-and-restore-line-numbering.sh b/src/preproc/tbl/tests/save-and-restore-line-numbering.sh
new file mode 100755
index 0000000..592b43a
--- /dev/null
+++ b/src/preproc/tbl/tests/save-and-restore-line-numbering.sh
@@ -0,0 +1,85 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo ...FAILED >&2
+ fail=YES
+}
+
+# Regression-test Savannah #60140.
+#
+# Line numbering needs to be suspended within a table and restored
+# afterward. Historical implementations handled line numbering in
+# tables badly when text blocks were used.
+
+input='.nm 1
+Here is a line of output.
+Sic transit adispicing meatballs.
+We pad it out with more content to ensure that the line breaks.
+.TS
+L.
+This is my table.
+There are many like it but this one is mine.
+T{
+Ut enim ad minima veniam,
+quis nostrum exercitationem ullam corporis suscipitlaboriosam,
+nisi ut aliquid ex ea commodi consequatur?
+T}
+.TE
+What is the line number now?'
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -t)
+echo "$output"
+
+echo "testing that line numbering is suppressed in table" >&2
+echo "$output" | grep -Fqx 'This is my table.' || wail
+
+echo "testing that line numbering is restored after table" >&2
+echo "$output" | grep -Eq '3 +What is the line number now\?' || wail
+
+input='.nf
+.nm 1
+test of line numbering suppression
+five
+four
+.nn 3
+three
+.TS
+L.
+I am a table.
+I have two rows.
+.TE
+two
+one
+numbering returns here'
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -t)
+echo "$output"
+
+echo "testing that suppressed numbering is restored correctly" >&2
+echo "$output" | grep -Eq '4 +numbering returns here' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/preproc/tbl/tests/save-and-restore-tab-stops.sh b/src/preproc/tbl/tests/save-and-restore-tab-stops.sh
new file mode 100755
index 0000000..b98922a
--- /dev/null
+++ b/src/preproc/tbl/tests/save-and-restore-tab-stops.sh
@@ -0,0 +1,84 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #42978.
+#
+# When tbl changes the tab stops, it needs to restore them.
+#
+# Based on an example by Bjarni Igni Gislason.
+
+EXAMPLE='.TH tbl\-tabs\-test 1 2020-10-20 "groff test suite"
+.SH Name
+tbl\-tabs\-test \- see if tbl messes up the tab stops
+.SH Description
+Do not use tabs in man pages outside of
+.BR .TS / .TE
+regions.
+.PP
+But if you do.\|.\|.
+.PP
+.TS
+l l l.
+table entries long enough to change the tab stops
+.TE
+.PP
+.EX
+#!/bin/sh
+case $#
+1)
+ if foo
+ then
+ bar
+ else
+ if baz
+ then
+ qux
+ fi
+ fi
+;;
+esac
+.EE'
+
+OUTPUT=$(printf "%s\n" "$EXAMPLE" | "$groff" -Tascii -P-cbou -t -man)
+FAIL=
+
+if ! echo "$OUTPUT" | grep -Eq '^ {12}if foo$'
+then
+ FAIL=yes
+ echo "first tab stop is wrong" >&2
+fi
+
+if ! echo "$OUTPUT" | grep -Eq '^ {17}bar$'
+then
+ FAIL=yes
+ echo "second tab stop is wrong" >&2
+fi
+
+if ! echo "$OUTPUT" | grep -Eq '^ {22}qux$'
+then
+ FAIL=yes
+ echo "third tab stop is wrong" >&2
+fi
+
+test -z "$FAIL"
+
+# vim:set ai noet sw=4 ts=4 tw=72:
diff --git a/src/preproc/tbl/tests/warn-on-long-boxed-unkept-table.sh b/src/preproc/tbl/tests/warn-on-long-boxed-unkept-table.sh
new file mode 100755
index 0000000..621a752
--- /dev/null
+++ b/src/preproc/tbl/tests/warn-on-long-boxed-unkept-table.sh
@@ -0,0 +1,56 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo ...FAILED >&2
+ fail=YES
+}
+
+# Regression-test Savannah #61878.
+#
+# A boxed, unkept table that overruns the page bottom will produce ugly
+# output; it looks especially bizarre in nroff mode.
+#
+# We set the page length to 2v to force a problem (any boxed table in
+# nroff mode needs 3 vees minimum), and put a page break at the start to
+# catch an incorrectly initialized starting page number for the table.
+
+input='.pl 2v
+.bp
+.TS
+box nokeep;
+L.
+Z
+.TE'
+
+output=$(printf "%s" "$input" | "$groff" -t -Tascii 2>/dev/null)
+error=$(printf "%s" "$input" | "$groff" -t -Tascii 2>&1 >/dev/null)
+echo "$output"
+
+echo "checking that a diagnostic message is produced"
+echo "$error" | grep -q 'warning: boxed.*page 2$' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/preproc/tbl/tests/x-column-modifier-works.sh b/src/preproc/tbl/tests/x-column-modifier-works.sh
new file mode 100755
index 0000000..da9b890
--- /dev/null
+++ b/src/preproc/tbl/tests/x-column-modifier-works.sh
@@ -0,0 +1,172 @@
+#!/bin/sh
+#
+# Copyright (C) 2023 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo ...FAILED >&2
+ fail=YES
+}
+
+# Ensure that the "x" column modifier causes table expansion to the line
+# length.
+
+# Case 1: "naked" table
+
+input='.ll 64n
+.nf
+1234567890123456789012345678901234567890123456789012345678901234
+.fi
+.TS
+tab(@);
+Lx L L L L.
+abcdef@abcdef@abcdef@abcdef@abcdef
+.TE
+.pl \n(nlu'
+
+echo "checking unboxed table without vertical rules" >&2
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii)
+echo "$output"
+echo "$output" | sed -n '2p' \
+ | grep -Eqx 'abcdef {25}(abcdef {3}){3}abcdef' || wail
+
+# Case 2: left-hand vertical rule
+
+input='.ll 64n
+.nf
+1234567890123456789012345678901234567890123456789012345678901234
+.fi
+.TS
+tab(@);
+| Lx L L L L.
+abcdef@abcdef@abcdef@abcdef@abcdef
+.TE
+.pl \n(nlu'
+
+echo "checking unboxed table with left-hand rule" >&2
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii)
+echo "$output"
+echo "$output" | sed -n '3p' \
+ | grep -Eqx '\| abcdef {23}(abcdef {3}){3}abcdef' || wail
+
+# Case 3: right-hand vertical rule
+
+input='.ll 64n
+.nf
+1234567890123456789012345678901234567890123456789012345678901234
+.fi
+.TS
+tab(@);
+Lx L L L L |.
+abcdef@abcdef@abcdef@abcdef@abcdef
+.TE
+.pl \n(nlu'
+
+echo "checking unboxed table with right-hand rule" >&2
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii)
+echo "$output"
+echo "$output" | sed -n '3p' \
+ | grep -Eqx 'abcdef {23}(abcdef {3}){3}abcdef \|' || wail
+
+# Case 4: vertical rule on both ends
+
+input='.ll 64n
+.nf
+1234567890123456789012345678901234567890123456789012345678901234
+.fi
+.TS
+tab(@);
+| Lx L L L L |.
+abcdef@abcdef@abcdef@abcdef@abcdef
+.TE
+.pl \n(nlu'
+
+echo "checking unboxed table with both rules" >&2
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii)
+echo "$output"
+echo "$output" | sed -n '3p' \
+ | grep -Eqx '\| abcdef {21}(abcdef {3}){3}abcdef \|' || wail
+
+# Case 5: vertical rule on both ends and interior rule
+
+input='.ll 64n
+.nf
+1234567890123456789012345678901234567890123456789012345678901234
+.fi
+.TS
+tab(@);
+| Lx L L | L L |.
+abcdef@abcdef@abcdef@abcdef@abcdef
+.TE
+.pl \n(nlu'
+
+echo "checking unboxed table with both edge and interior rules" >&2
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii)
+echo "$output"
+echo "$output" | sed -n '3p' \
+ | grep -Eqx \
+ '\| abcdef {21}abcdef {3}abcdef \| abcdef {3}abcdef \|' \
+ || wail
+
+# Case 6: boxed table
+
+input='.ll 64n
+.nf
+1234567890123456789012345678901234567890123456789012345678901234
+.fi
+.TS
+box tab(@);
+Lx L L L L.
+abcdef@abcdef@abcdef@abcdef@abcdef
+.TE
+.pl \n(nlu'
+
+echo "checking boxed table without interior rules" >&2
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii)
+echo "$output"
+echo "$output" | sed -n '3p' \
+ | grep -Eqx '\| abcdef {21}(abcdef {3}){3}abcdef \|' || wail
+
+# Case 7: boxed table with interior vertical rule
+
+input='.ll 64n
+.nf
+1234567890123456789012345678901234567890123456789012345678901234
+.fi
+.TS
+box tab(@);
+Lx L L | L L.
+abcdef@abcdef@abcdef@abcdef@abcdef
+.TE
+.pl \n(nlu'
+
+echo "checking boxed table with interior rules" >&2
+output=$(printf "%s\n" "$input" | "$groff" -t -Tascii)
+echo "$output"
+echo "$output" | sed -n '3p' \
+ | grep -Eqx \
+ '\| abcdef {21}abcdef {3}abcdef \| abcdef {3}abcdef \|' \
+ || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/roff/groff/groff.1.man b/src/roff/groff/groff.1.man
new file mode 100644
index 0000000..c551326
--- /dev/null
+++ b/src/roff/groff/groff.1.man
@@ -0,0 +1,2403 @@
+.TH groff @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+groff \- front end to the GNU
+.I roff
+document formatting system
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2022 Free Software Foundation, Inc.
+.\"
+.\" This file is part of groff, the GNU roff type-setting system.
+.\"
+.\" Permission is granted to copy, distribute and/or modify this
+.\" document under the terms of the GNU Free Documentation License,
+.\" Version 1.3 or any later version published by the Free Software
+.\" Foundation; with no Invariant Sections, 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.\" Define a string for the TeX logo.
+.ie t .ds TeX T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X
+.el .ds TeX TeX
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY groff
+.RB [ \-abcCeEgGijklNpRsStUVXzZ ]
+.RB [ \-d\~\c
+.IR ctext ]
+.RB [ \-d\~\c
+.IB string =\c
+.IR text ]
+.RB [ \-D\~\c
+.IR fallback-encoding ]
+.RB [ \-f\~\c
+.IR font-family ]
+.RB [ \-F\~\c
+.IR font-directory ]
+.RB [ \-I\~\c
+.IR inclusion-directory ]
+.RB [ \-K\~\c
+.IR input-encoding ]
+.RB [ \-L\~\c
+.IR spooler-argument ]
+.RB [ \-m\~\c
+.IR macro-package ]
+.RB [ \-M\~\c
+.IR macro-directory ]
+.RB [ \-n\~\c
+.IR page-number ]
+.RB [ \-o\~\c
+.IR page-list ]
+.RB [ \-P\~\c
+.IR postprocessor-argument ]
+.RB [ \-r\~\c
+.IR cnumeric-expression ]
+.RB [ \-r\~\c
+.IB register =\c
+.IR numeric-expression ]
+.RB [ \-T\~\c
+.IR output-device ]
+.RB [ \-w\~\c
+.IR warning-category ]
+.RB [ \-W\~\c
+.IR warning-category ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY groff
+.B \-h
+.
+.SY groff
+.B \-\-help
+.YS
+.
+.
+.SY groff
+.B \-v
+.RI [ option\~ .\|.\|.\&]
+.RI [ file\~ .\|.\|.]
+.
+.SY groff
+.B \-\-version
+.RI [ option\~ .\|.\|.\&]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I groff
+is the primary front end to the GNU
+.I roff
+document formatting system.
+.
+.\" BEGIN Keep parallel with groff.texi node "What Is groff?".
+.\" This language is slightly expanded from that in the "ANNOUNCE" file
+.\" and on the groff home page.
+GNU
+.I roff
+is a typesetting system that reads plain text input files that include
+formatting commands to produce output in PostScript,
+PDF,
+HTML,
+DVI,
+or other formats,
+or for display to a terminal.
+.
+Formatting commands can be low-level typesetting primitives,
+macros from a supplied package,
+or user-defined macros.
+.
+All three approaches can be combined.
+.
+If no
+.I file
+operands are specified,
+or if
+.I file
+is
+.RB \[lq] \- \[rq],
+.I groff
+reads the standard input stream.
+.
+.
+.P
+A reimplementation and extension of the typesetter from AT&T Unix,
+.I groff
+is present on most POSIX systems owing to its long association with Unix
+manuals
+(including man pages).
+.
+It and its predecessor are notable for their production of several
+best-selling software engineering texts.
+.
+.I groff
+is capable of producing typographically sophisticated documents while
+consuming minimal system resources.
+.\" END Keep parallel with groff.texi node "What Is groff?".
+.
+.
+.P
+The
+.I groff
+command orchestrates the execution of preprocessors,
+the transformation of input documents into a device-independent page
+description language,
+and the production of output from that language.
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-h
+and
+.B \-\-help
+display a usage message and exit.
+.
+.
+.P
+Because
+.I groff
+is intended to subsume most users' direct invocations of the
+.MR @g@troff @MAN1EXT@
+formatter,
+the two programs share a set of options.
+.
+However,
+.I groff
+has some options that
+.I @g@troff
+does not share,
+and others which
+.I groff
+interprets differently.
+.
+At the same time,
+not all valid
+.I @g@troff
+options can be given to
+.IR groff .
+.
+.
+.\" ====================================================================
+.SS "\f[I]groff\f[]-specific options"
+.\" ====================================================================
+.
+The following options either do not exist in
+GNU
+.I troff \" GNU
+or are interpreted differently by
+.IR groff .
+.
+.
+.TP
+.BI \-D\~ enc
+Set fallback input encoding used by
+.MR preconv @MAN1EXT@
+to
+.IR enc ;
+implies
+.BR \-k .
+.
+.
+.TP
+.B \-e
+Run
+.MR @g@eqn @MAN1EXT@
+preprocessor.
+.
+.
+.TP
+.B \-g
+Run
+.MR @g@grn @MAN1EXT@
+preprocessor.
+.
+.
+.TP
+.B \-G
+Run
+.MR grap 1
+preprocessor;
+implies
+.BR \-p .
+.
+.
+.TP
+.BI \-I\~ dir
+Works as
+.IR @g@troff 's
+option
+(see below),
+but also implies
+.B \-g
+and
+.BR \-s .
+.
+It is passed to
+.MR @g@soelim @MAN1EXT@
+and the output driver,
+and
+.I @g@grn
+is passed an
+.B \-M
+option with
+.I dir
+as its argument.
+.
+.
+.TP
+.B \-j
+Run
+.MR @g@chem @MAN1EXT@
+preprocessor;
+implies
+.BR \-p .
+.
+.
+.TP
+.B \-k
+Run
+.MR preconv @MAN1EXT@
+preprocessor.
+.
+Refer to its man page for its behavior if neither of
+.IR groff 's
+.B \-K
+or
+.B \-D
+options is also specified.
+.
+.
+.TP
+.BI \-K\~ enc
+Set input encoding used by
+.MR preconv @MAN1EXT@
+to
+.IR enc ;
+implies
+.BR \-k .
+.
+.
+.TP
+.B \-l
+Send the output to a spooler program for printing.
+.
+The
+.RB \[lq] print \[rq]
+directive in the device description file
+specifies the default command to be used;
+see
+.MR groff_font @MAN5EXT@ .
+.
+If no such directive is present for the output device,
+.ie '@PSPRINT@'' \{\
+this option is ignored.
+.\}
+.el \{\
+output is piped to
+.MR @PSPRINT@ 1 .
+.\}
+.
+See options
+.B \-L
+and
+.BR \-X .
+.
+.
+.TP
+.BI \-L\~ arg
+Pass
+.I arg
+to the print spooler program.
+.
+If multiple
+.IR arg s
+are required,
+pass each with a separate
+.B \-L
+option.
+.
+.I groff
+does not prefix an option dash to
+.I arg
+before passing it to the spooler program.
+.
+.
+.TP
+.B \-M
+Works as
+.IR @g@troff 's
+option
+(see below),
+but is also passed to
+.MR @g@eqn @MAN1EXT@ ,
+.MR grap @MAN1EXT@ ,
+and
+.MR @g@grn @MAN1EXT@ .
+.
+.
+.TP
+.B \-N
+Prohibit newlines between
+.I eqn \" language
+delimiters:
+pass
+.B \-N
+to
+.MR @g@eqn @MAN1EXT@ .
+.
+.
+.TP
+.B \-p
+Run
+.MR @g@pic @MAN1EXT@
+preprocessor.
+.
+.
+.TP
+.BI \-P\~ arg
+Pass
+.I arg
+to the postprocessor.
+.
+If multiple
+.IR arg s
+are required,
+pass each with a separate
+.B \-P
+option.
+.
+.I groff
+does not prefix an option dash to
+.I arg
+before passing it to the postprocessor.
+.
+.
+.TP
+.B \-R
+Run
+.MR @g@refer @MAN1EXT@
+preprocessor.
+.
+No mechanism is provided for passing arguments to
+.I @g@refer
+because most
+.I @g@refer
+options have equivalent language elements that can be specified within
+the document.
+.
+.
+.TP
+.B \-s
+Run
+.MR @g@soelim @MAN1EXT@
+preprocessor.
+.
+.
+.TP
+.B \-S
+Operate in \[lq]safer\[rq] mode;
+see
+.B \-U
+below for its opposite.
+.
+For security reasons,
+safer mode is enabled by default.
+.
+.
+.TP
+.B \-t
+Run
+.MR @g@tbl @MAN1EXT@
+preprocessor.
+.
+.
+.TP
+.BI \-T\~ dev
+Direct
+.I @g@troff
+to format the input for the output device
+.IR dev .
+.
+.I groff
+then calls an output driver to convert
+.IR @g@troff 's
+output to a form appropriate for
+.IR dev ;
+see subsection \[lq]Output devices\[rq] below.
+.
+.
+.TP
+.B \-U
+Operate in unsafe mode:
+pass the
+.B \-U
+option to
+.I @g@pic
+and
+.IR @g@troff .
+.
+.
+.TP
+.B \-v
+.TQ
+.B \-\-version
+Write version information for
+.I groff
+and all programs run by it to the standard output stream;
+that is,
+the given command line is processed in the usual way,
+passing
+.B \-v
+to the formatter and any pre- or postprocessors invoked.
+.
+.
+.TP
+.B \-V
+Output the pipeline that
+.I groff
+would run to the standard output stream,
+but do not execute it.
+.
+If given more than once,
+.I groff
+both writes and runs the pipeline.
+.
+.
+.TP
+.B \-X
+Use
+.MR gxditview @MAN1EXT@
+instead of the usual postprocessor to (pre)view a document on an X11
+display.
+.
+Combining this option with
+.B \-Tps
+uses the font metrics of the PostScript device,
+whereas the
+.B \-TX75
+and
+.B \-TX100
+options use the metrics of X11 fonts.
+.
+.
+.TP
+.B \-Z
+Disable postprocessing.
+.
+.I @g@troff
+output will appear on the standard output stream
+(unless suppressed with
+.BR \-z );
+see
+.MR groff_out @MAN5EXT@
+for a description of this format.
+.
+.
+.\" ====================================================================
+.SS "Transparent options"
+.\" ====================================================================
+.
+The following options are passed as-is to the formatter program
+.MR @g@troff @MAN1EXT@
+and described in more detail in its man page.
+.
+.
+.TP
+.B \-a
+Generate a plain text approximation of the typeset output.
+.
+.
+.TP
+.B \-b
+Write a backtrace to the standard error stream on each error or warning.
+.
+.
+.TP
+.B \-c
+Start with color output disabled.
+.
+.
+.TP
+.B \-C
+Enable AT&T
+.I troff \" AT&T
+compatibility mode;
+implies
+.BR \-c .
+.
+.
+.TP
+.BI \-d\~ cs
+.TQ
+.BI \-d\~ name = string
+Define string.
+.
+.
+.TP
+.B \-E
+Inhibit
+.I @g@troff
+error messages;
+implies
+.BR \-Ww .
+.
+.
+.TP
+.BI \-f\~ fam
+Set default font family.
+.
+.
+.TP
+.BI \-F\~ dir
+Search in directory
+.I dir
+for the selected output device's directory of device and font
+description files.
+.
+.
+.TP
+.B \-i
+Process standard input after the specified input files.
+.
+.
+.TP
+.BI \-I\~ dir
+Search
+.I dir
+for input files.
+.
+.
+.TP
+.BI \-m\~ name
+Process
+.RI name .tmac
+before input files.
+.
+.
+.TP
+.BI \-M\~ dir
+Search directory
+.I dir
+for macro files.
+.
+.
+.TP
+.BI \-n\~ num
+Number the first page
+.IR num .
+.
+.
+.TP
+.BI \-o\~ list
+Output only pages in
+.IR list .
+.
+.
+.TP
+.BI \-r\~ cnumeric-expression
+.TQ
+.BI \-r\~ register = numeric-expression
+Define register.
+.
+.
+.TP
+.BI \-w\~ name
+.TQ
+.BI \-W\~ name
+Enable
+.RB ( \-w )
+or inhibit
+.RB ( \-W )
+emission of warnings in category
+.IR name .
+.
+.
+.TP
+.B \-z
+Suppress formatted device-independent output of
+.IR @g@troff .
+.
+.
+.\" ====================================================================
+.SH Usage
+.\" ====================================================================
+.
+The architecture of the GNU
+.I roff
+system
+follows that of other device-independent
+.I roff
+implementations,
+comprising preprocessors,
+macro packages,
+output drivers
+(or \[lq]postprocessors\[rq]),
+a suite of utilities,
+and the formatter
+.I @g@troff
+at its heart.
+.
+See
+.MR roff @MAN7EXT@
+for a survey of how a
+.I roff
+system works.
+.
+.
+.P
+The front end programs available in the GNU
+.I roff
+system make it easier to use than traditional
+.IR roff s
+that required the construction of pipelines or use of temporary files to
+carry a source document from maintainable form to device-ready output.
+.
+The discussion below summarizes the constituent parts of the GNU
+.I roff
+system.
+.
+It complements
+.MR roff @MAN7EXT@
+with
+.IR groff -specific
+information.
+.
+.
+.\" ====================================================================
+.SS "Getting started"
+.\" ====================================================================
+.
+Those who prefer to learn by experimenting or are desirous of rapid
+feedback from the system may wish to start with a \[lq]Hello,
+world!\&\[rq] document.
+.
+.
+.P
+.EX
+$ \c
+.B echo \[dq]Hello, world!\[dq] | groff \-Tascii \
+| sed \[aq]/\[ha]$/d\[aq]
+Hello, world!
+.EE
+.
+.
+.P
+We used a
+.I sed
+command only to eliminate the 65 blank lines that would otherwise flood
+the terminal screen.
+.
+.RI ( roff
+systems were developed in the days of paper-based terminals with 66
+lines to a page.)
+.
+.
+.P
+Today's users may prefer output to a UTF-8-capable terminal.
+.
+.
+.P
+.EX
+$ \c
+.B echo \[dq]Hello, world!\[dq] | groff \-Tutf8 \
+| sed \[aq]/\[ha]$/d\[aq]
+.EE
+.
+.
+.P
+Producing PDF,
+HTML,
+or \*[TeX]'s DVI is also straightforward.
+.
+The hard part may be selecting a viewer program for the output.
+.
+.
+.P
+.EX
+$ \c
+.B echo \[dq]Hello, world!\[dq] | groff \-Tpdf > hello.pdf
+$ \c
+.B evince hello.pdf
+$ \c
+.B echo \[dq]Hello, world!\[dq] | groff \-Thtml > hello.html
+$ \c
+.B firefox hello.html
+$ \c
+.B echo \[dq]Hello, world!\[dq] | groff \-Tdvi > hello.dvi
+$ \c
+.B xdvi hello.html
+.EE
+.
+.
+.\" ====================================================================
+.SS "Using \f[I]groff\f[] as a REPL"
+.\" ====================================================================
+.
+Those with a programmer's bent may be pleased to know that they can use
+.I groff
+in a read-evaluate-print loop (REPL).
+.
+Doing so can be handy to verify one's understanding of the formatter's
+behavior and/or the syntax it accepts.
+.
+Turning on all warnings with
+.B \-ww
+can aid this goal.
+.
+.
+.P
+.EX
+$ \c
+.B groff \-ww \-Tutf8
+.B \[rs]# This is a comment. Let\[aq]s define a register.
+.B .nr a 1
+.B \[rs]# Do integer arithmetic with operators evaluated left-to-right.
+.B .nr b \[rs]n[a]+5/2
+.ne 2v
+.B \[rs]# Let\[aq]s get the result on the standard error stream.
+.B .tm \[rs]n[b]
+3
+.B \[rs]# Now we\[aq]ll define a string.
+.B .ds name Leslie\[rs]" This is another form of comment.
+.B .nr b (\[rs]n[a] + (7/2))
+.B \[rs]# Center the next two text input lines.
+.B .ce 2
+.B Hi, \[rs]*[name].
+.B Your secret number is \[rs]n[b].
+.B \[rs]# We will see that the division rounded toward zero.
+.B It is
+.B \[rs]# Here\[aq]s an if-else control structure.
+.B .ie (\[rs]n[b] % 2) odd.
+.B .el even.
+.B \[rs]# This trick sets the page length to the current vertical
+.B \[rs]# position, so that blank lines don\[aq]t spew when we\[aq]re \
+done.
+.B .pl \[rs]n[nl]u
+.I <Control-D>
+ Hi, Leslie.
+ Your secret number is 4.
+It is even.
+.EE
+.
+.
+.\" ====================================================================
+.SS "Paper format"
+.\" ====================================================================
+.
+In GNU
+.IR roff ,
+the page dimensions for the formatter
+.I @g@troff
+and for output devices are handled separately.
+.
+In the formatter,
+requests are used to set the page length
+.RB ( .pl ),
+page offset
+(or left margin,
+.BR .po ),
+and line length
+.RB ( .ll ).
+.
+The right margin is not explicitly configured;
+the combination of page offset and line length provides the information
+necessary to derive it.
+.
+The
+.I papersize
+macro package,
+automatically loaded by
+.IR @g@troff ,
+provides an interface for configuring page dimensions by convenient
+names,
+like \[lq]letter\[rq] or
+\[lq]A4\[rq];
+see
+.MR groff_tmac @MAN5EXT@ .
+.
+The formatter's default in this installation is
+.RB \[lq] @PAGE@ \[rq].
+.
+.
+.P
+It is up to each macro package to respect the page dimensions configured
+in this way.
+.
+Some offer alternative mechanisms.
+.
+.
+.P
+For each output device,
+the size of the output medium can be set in its
+.I DESC
+file.
+.
+Most output drivers also recognize a command-line option
+.B \-p
+to override the default dimensions and an option
+.B \-l
+to use landscape orientation.
+.
+See
+.MR groff_font @MAN5EXT@
+for a description of the
+.B papersize
+directive,
+which takes an argument of the same form as
+.BR \-p .
+.
+The output driver's man page,
+such as
+.MR grops @MAN1EXT@ ,
+may also be helpful.
+.
+.I groff
+uses the command-line option
+.B \-P
+to pass options to output devices;
+for example,
+use the following for PostScript output on A4 paper in landscape
+orientation.
+.
+.
+.IP
+.EX
+groff \-Tps \-dpaper=a4l \-P\-pa4 \-P\-l \-ms foo.ms > foo.ps
+.EE
+.
+.
+.\" ====================================================================
+.SS "Front end"
+.\" ====================================================================
+.
+The
+.I groff
+program is a wrapper around the
+.MR @g@troff @MAN1EXT@
+program.
+.
+It allows one to specify preprocessors via command-line options and
+automatically runs the appropriate postprocessor for the selected
+output device.
+.
+Doing so,
+the manual construction of pipelines or management of temporary files
+required of users of traditional
+.MR roff @MAN7EXT@
+systems can be avoided.
+.
+Use the
+.MR grog @MAN1EXT@
+program to infer an appropriate
+.I groff
+command line to format a document.
+.
+.
+.\" ====================================================================
+.SS Language
+.\" ====================================================================
+.
+Input to a
+.I roff
+system is in plain text interleaved with control lines and escape
+sequences.
+.
+The combination constitutes a document in one of a family of languages
+we also call
+.IR roff ;
+see
+.MR roff @MAN7EXT@
+for background.
+.
+An overview of GNU
+.I roff
+language syntax and features,
+including lists of all supported escape sequences,
+requests,
+and predefined registers,
+can be found in
+.MR groff @MAN7EXT@ .
+.
+GNU
+.I roff
+extensions to the AT&T
+.I troff
+language,
+a common subset of
+.I roff
+dialects extant today,
+are detailed in
+.MR groff_diff @MAN7EXT@ .
+.
+.
+.\" ====================================================================
+.SS Preprocessors
+.\" ====================================================================
+.
+A preprocessor interprets a domain-specific language that produces
+.I roff
+language output.
+.
+Frequently,
+such input is confined to sections or regions of a
+.I roff
+input file
+(bracketed with macro calls specific to each preprocessor),
+which it replaces.
+.
+Preprocessors therefore often interpret a subset of
+.I roff
+syntax along with their own language.
+.
+GNU
+.I roff
+provides reimplementations of most preprocessors familiar to users of
+AT&T
+.IR troff ; \" AT&T
+these routinely have extended features and/or require GNU
+.I troff \" GNU
+to format their output.
+.
+.
+.br
+.ne 10v
+.P
+.RS
+.TS
+tab($);
+Li Lx.
+@g@tbl$lays out tables;
+@g@eqn$typesets mathematics;
+@g@pic$draws diagrams;
+@g@refer$processes bibliographic references;
+@g@soelim$preprocesses \[lq]sourced\[rq] input files;
+@g@grn$T{
+renders
+.MR gremlin 1
+diagrams;
+T}
+@g@chem$T{
+draws chemical structural formul\[ae]
+using
+.IR pic ; \" generic
+T}
+gperl$T{
+populates
+.I groff
+registers and strings using
+.MR perl 1 ;
+T}
+glilypond$T{
+embeds
+.I LilyPond
+sheet music;
+and
+T}
+gpinyin$T{
+eases Mandarin Chinese input using Hanyu Pinyin.
+T}
+.TE
+.RE
+.
+.
+.P
+A preprocessor unique to GNU
+.I roff
+is
+.MR preconv @MAN1EXT@ ,
+which converts various input encodings to something GNU
+.I troff \" GNU
+can understand.
+.
+When used,
+it is run before any other preprocessors.
+.
+.
+.P
+Most preprocessors enclose content between a pair of characteristic
+tokens.
+.
+Such a token must occur at the beginning of an input line and use the
+dot control character.
+.
+Spaces and tabs must not follow the control character or precede the
+end of the input line.
+.
+Deviating from these rules defeats a token's recognition by the
+preprocessor.
+.
+Tokens are generally preserved in preprocessor output and interpreted as
+macro calls subsequently by
+.IR @g@troff .
+.
+The
+.I @g@ideal
+preprocessor is not yet available in
+.IR groff .
+.
+.
+.P
+.TS
+box, center, tab (^);
+c | c | c
+CfCR | CfCR | CfCR.
+preprocessor^starting token^ending token
+=
+@g@chem^.cstart^.cend
+@g@eqn^.EQ^.EN
+grap^.G1^.G2
+@g@grn^.GS^.GE
+.\" Keep the .IF line below the @g@ideal line.
+@g@ideal^.IS^.IE
+^^.IF
+.\" Keep the .PF line below the @g@pic line.
+@g@pic^.PS^.PE
+^^.PF
+^^.PY
+@g@refer^.R1^.R2
+@g@tbl^.TS^.TE
+_
+glilypond^.lilypond start^.lilypond stop
+gperl^.Perl start^.Perl stop
+gpinyin^.pinyin start^.pinyin stop
+.TE
+.
+.
+.\" ====================================================================
+.SS "Macro packages"
+.\" ====================================================================
+.
+Macro files are
+.I roff
+input files designed to produce no output themselves but instead ease
+the preparation of other
+.I roff
+documents.
+.
+When a macro file is installed at a standard location and suitable for
+use by a general audience,
+it is termed a
+.IR "macro package" .
+.
+.
+.P
+Macro packages can be loaded prior to any
+.I roff
+input documents with the
+.BR \-m \~option.
+.
+The GNU
+.I roff
+system implements most well-known macro packages for AT&T
+.I troff \" AT&T
+.\" exceptions: mpm, mv
+in a compatible way and extends them.
+.
+These have one- or two-letter names arising from intense practices of
+naming economy in early Unix culture,
+a laconic approach that led to many of the packages being identified in
+general usage with the
+.I nroff
+and
+.I troff
+option letter used to invoke them,
+sometimes to punning effect,
+as with \[lq]man\[rq]
+(short for \[lq]manual\[rq]),
+and even with the option dash,
+as in the case of the
+.I s
+package,
+much better known as
+.I ms
+or even
+.IR \-ms .
+.
+.
+.P
+Macro packages serve a variety of purposes.
+.
+Some are \[lq]full-service\[rq] packages,
+adopting responsibility for page layout among other fundamental tasks,
+and defining their own lexicon of macros for document composition;
+each such package stands alone and a given document can use at most one.
+.
+.
+.TP
+.I an
+is used to compose man pages in the format originating in Version\~7
+Unix (1979);
+see
+.MR groff_man @MAN7EXT@ .
+.
+It can be specified on the command line as
+.BR \-man .
+.
+.
+.TP
+.I doc
+is used to compose man pages in the format originating in 4.3BSD-Reno
+(1990);
+see
+.MR groff_mdoc @MAN7EXT@ .
+.
+It can be specified on the command line as
+.BR \-mdoc .
+.
+.
+.TP
+.I e
+is the Berkeley general-purpose macro suite,
+developed as an alternative to AT&T's
+.IR s ;
+see
+.MR groff_me @MAN7EXT@ .
+.
+It can be specified on the command line as
+.BR \-me .
+.
+.
+.TP
+.I m
+implements the format used by the
+second-generation AT&T macro suite for general documents,
+a successor to
+.IR s ;
+see
+.MR groff_mm @MAN7EXT@ .
+.
+It can be specified on the command line as
+.BR \-mm .
+.
+.
+.TP
+.I om
+(invariably called \[lq]mom\[rq])
+is a modern package written by Peter Schaffter specifically for GNU
+.IR roff .
+.
+Consult the
+.UR file://\:@HTMLDOCDIR@/\:mom/\:toc\:.html
+.I mom
+HTML manual
+.UE
+for extensive documentation.
+.
+She\[em]for
+.I mom
+takes the female pronoun\[em]can be specified on the command line as
+.BR \-mom .
+.
+.
+.TP
+.I s
+is the original AT&T general-purpose document format;
+see
+.MR groff_ms @MAN7EXT@ .
+.
+It can be specified on the command line as
+.BR \-ms .
+.
+.
+.P
+Others are supplemental.
+.
+For instance,
+.
+.I \%andoc
+is a wrapper package specific to GNU
+.I roff
+that recognizes whether a document uses
+.I man
+or
+.I mdoc
+format and loads the corresponding macro package.
+.
+It can be specified on the command line as
+.BR \%\-mandoc .
+.
+A
+.MR man 1
+librarian program \" such as man-db, since 2001
+may use this macro file to delegate loading of the correct macro
+package;
+it is thus unnecessary for
+.I man
+itself to scan the contents of a document to decide the issue.
+.
+.
+.P
+Many macro files augment the function of the full-service packages,
+or of
+.I roff
+documents that do not employ such a package\[em]the latter are sometimes
+characterized as \[lq]raw\[rq].
+.
+These auxiliary packages are described,
+along with
+details of macro file naming and placement,
+in
+.MR groff_tmac @MAN5EXT@ .
+.
+.
+.\" ====================================================================
+.SS Formatters
+.\" ====================================================================
+.
+The formatter,
+the program that interprets
+.I roff
+language input,
+is
+.MR @g@troff @MAN1EXT@ .
+.
+It provides the features of the AT&T
+.I troff \" AT&T
+and
+.I nroff \" AT&T
+programs as well as many extensions.
+.
+The command-line option
+.B \-C
+switches
+.I @g@troff
+into
+.IR "compatibility mode" ,
+which tries to emulate AT&T
+.I troff \" AT&T
+as closely as is practical to enable the formatting of documents written
+for the older system.
+.
+.
+.P
+A shell script,
+.MR @g@nroff @MAN1EXT@ ,
+emulates the behavior of AT&T
+.IR nroff . \" AT&T
+.
+It attempts to correctly encode the output based on the locale,
+relieving the user of the need to specify an output device with the
+.B \-T
+option and is therefore convenient for use with terminal output devices,
+described in the next subsection.
+.
+.
+.P
+GNU
+.I troff \" GNU
+generates output in a device-independent,
+but not device-agnostic,
+page description language detailed in
+.MR groff_out @MAN5EXT@ .
+.
+.
+.\" ====================================================================
+.SS "Output devices"
+.\" ====================================================================
+.
+.I @g@troff
+output is formatted for a particular
+.IR "output device" ,
+typically specified by the
+.B \-T
+option to the formatter or a front end.
+.
+If neither this option nor the
+.I \%GROFF_TYPESETTER
+environment variable is used,
+the default output device is
+.BR @DEVICE@ .
+.
+An output device may be any of the following.
+.
+.
+.TP 9n \" to fit "X100\-12" even on troff devices
+.B ascii
+for terminals using the ISO 646 1991:IRV character set and encoding,
+also known as US-ASCII.
+.
+.
+.TP
+.B cp1047
+for terminals using the IBM code page 1047 character set and encoding.
+.
+.
+.TP
+.B dvi
+for TeX DVI format.
+.
+.
+.TP
+.B html
+.TQ
+.B xhtml
+for HTML and XHTML output,
+respectively.
+.
+.
+.TP
+.B latin1
+for terminals using the ISO Latin-1
+(ISO 8859-1)
+character set and encoding.
+.
+.
+.TP
+.B lbp
+for Canon CaPSL printers
+(LBP-4 and LBP-8 series laser printers).
+.
+.
+.TP
+.B lj4
+for HP LaserJet4-compatible
+(or other PCL5-compatible)
+printers.
+.
+.
+.TP
+.B pdf
+for PDF output.
+.
+.
+.TP
+.B ps
+for PostScript output.
+.
+.
+.TP
+.B utf8
+for terminals using the ISO 10646 (\[lq]Unicode\[rq]) character set in
+UTF-8 encoding.
+.
+.
+.TP
+.B X75
+for previewing with
+.I \%gxditview
+using
+75 dpi resolution and a
+10-point base type size.
+.
+.
+.TP
+.B X75\-12
+for previewing with
+.I \%gxditview
+using
+75 dpi resolution and a
+12-point base type size.
+.
+.
+.TP
+.B X100
+for previewing with
+.I \%gxditview
+using
+100 dpi resolution and a
+10-point base type size.
+.
+.
+.TP
+.B X100\-12
+for previewing with
+.I \%gxditview
+using
+100 dpi resolution
+and a
+12-point base type size.
+.
+.
+.\" ====================================================================
+.SS Postprocessors
+.\" ====================================================================
+.
+Any program that interprets the output of
+GNU
+.I troff \" GNU
+is a
+postprocessor.
+.
+The postprocessors provided by GNU
+.I roff
+are
+.IR "output drivers" ,
+which prepare a document for viewing or printing.
+.
+Postprocessors for other purposes,
+such as page resequencing or statistical measurement of a document,
+are conceivable.
+.
+.
+.P
+An output driver supports one or more output devices,
+each with its own device description file.
+.
+A device determines its postprocessor with the
+.B postpro
+directive in its device description file;
+see
+.MR groff_font @MAN5EXT@ .
+.
+The
+.B \-X
+option overrides this selection,
+causing
+.I \%gxditview
+to serve as the output driver.
+.
+.
+.TP
+.MR grodvi @MAN1EXT@
+provides
+.BR dvi .
+.
+.
+.TP
+.MR grohtml @MAN1EXT@
+provides
+.B html
+and
+.BR xhtml .
+.
+.
+.TP
+.MR grolbp @MAN1EXT@
+provides
+.BR lbp .
+.
+.
+.TP
+.MR grolj4 @MAN1EXT@
+provides
+.BR lj4 .
+.
+.
+.TP
+.MR gropdf @MAN1EXT@
+provides
+.BR pdf .
+.
+.
+.TP
+.MR grops @MAN1EXT@
+provides
+.BR ps .
+.
+.
+.TP
+.MR grotty @MAN1EXT@
+provides
+.BR ascii ,
+.BR cp1047 ,
+.BR latin1 ,
+and
+.BR utf8 .
+.
+.
+.TP
+.MR gxditview @MAN1EXT@
+provides
+.BR X75 ,
+.BR X75\-12 ,
+.BR X100 ,
+and
+.BR X100\-12 ,
+and additionally can preview
+.BR ps .
+.
+.
+.\" ====================================================================
+.SS Utilities
+.\" ====================================================================
+.
+GNU
+.I roff
+includes a suite of utilities.
+.
+.
+.TP
+.MR gdiffmk @MAN1EXT@
+marks differences between a pair of
+.I roff
+input files.
+.
+.
+.TP
+.MR grog @MAN1EXT@
+infers the
+.I groff
+command a document requires.
+.
+.
+.P
+Several utilities prepare descriptions of fonts,
+enabling the formatter to use them when producing output for a given
+device.
+.
+.
+.TP
+.MR addftinfo @MAN1EXT@
+adds information to AT&T
+.I troff \" AT&T
+font description files to enable their use with
+GNU
+.IR troff .\" GNU
+.
+.
+.TP
+.MR afmtodit @MAN1EXT@
+creates font description files for PostScript Type\~1 fonts.
+.
+.
+.TP
+.MR pfbtops @MAN1EXT@
+translates a PostScript Type\~1 font in PFB
+(Printer Font Binary)
+format to PFA
+(Printer Font ASCII),
+which can then be interpreted by
+.IR \%afmtodit .
+.
+.
+.TP
+.MR hpftodit @MAN1EXT@
+creates font description files for the HP LaserJet\~4 family of
+printers.
+.
+.
+.TP
+.MR tfmtodit @MAN1EXT@
+creates font description files for the TeX DVI device.
+.
+.
+.TP
+.MR xtotroff @MAN1EXT@
+creates font description files for X Window System core fonts.
+.
+.
+.P
+A trio of tools transform material constructed using
+.I roff
+preprocessor languages into graphical image files.
+.
+.
+.TP
+.MR eqn2graph @MAN1EXT@
+converts an
+.I eqn
+equation into a cropped image.
+.
+.
+.TP
+.MR grap2graph @MAN1EXT@
+converts a
+.I grap
+diagram into a cropped image.
+.
+.
+.TP
+.MR pic2graph @MAN1EXT@
+converts a
+.I pic
+diagram into a cropped image.
+.
+.
+.P
+Another set of programs works with the bibliographic data files used
+by the
+.MR refer @MAN1EXT@
+preprocessor.
+.
+.
+.TP
+.MR @g@indxbib @MAN1EXT@
+makes inverted indices for bibliographic databases,
+speeding lookup operations on them.
+.
+.
+.TP
+.MR lkbib @MAN1EXT@
+searches the databases.
+.
+.
+.TP
+.MR @g@lookbib @MAN1EXT@
+interactively searches
+the databases.
+.
+.
+.\" ====================================================================
+.SH "Exit status"
+.\" ====================================================================
+.
+.I groff
+exits with a failure status if there was a problem parsing its arguments
+and a successful status if either of the options
+.B \-h
+or
+.B \-\-help
+was specified.
+.
+Otherwise,
+.I groff
+runs a pipeline to process its input;
+if all commands within the pipeline exit successfully,
+.I groff
+does likewise.
+.
+If not,
+.IR groff 's
+exit status encodes a summary of problems encountered,
+setting bit\~0 if a command exited with a failure status,
+bit\~1 if a command was terminated with a signal,
+and bit\~2 if a command could not be executed.
+.
+(Thus,
+if all three misfortunes befell one's pipeline,
+.I groff
+would exit with status 2\[ha]0 + 2\[ha]1 + 2\[ha]2 = 1+2+4 = 7.)
+.
+To troubleshoot pipeline problems,
+you may wish to re-run the
+.I groff
+command with the
+.B \-V
+option and break the reported pipeline down into separate stages,
+inspecting the exit status of and diagnostic messages emitted by each
+command.
+.
+.
+.\" ====================================================================
+.SH Environment
+.\" ====================================================================
+.
+Normally,
+the path separator in environment variables ending with
+.I PATH
+is the colon;
+this may vary depending on the operating system.
+.
+For example,
+Windows uses a semicolon instead.
+.
+.
+.TP
+.I GROFF_BIN_PATH
+This search path,
+followed by
+.IR PATH ,
+is used to locate commands executed by
+.IR groff .
+.
+If it is not set,
+the installation directory of the GNU
+.I roff
+executables,
+.IR @BINDIR@ ,
+is searched before
+.IR PATH .
+.
+.
+.TP
+.I GROFF_COMMAND_PREFIX
+GNU
+.I roff
+can be configured at compile time to apply a prefix to the names of the
+programs it provides that had a counterpart in AT&T
+.IR troff , \" AT&T
+so that name collisions are avoided at run time.
+.
+The default prefix is empty.
+.
+.
+.IP
+When used,
+this prefix is conventionally the letter \[lq]g\[rq].
+.
+For example,
+GNU
+.I troff \" GNU
+would be installed as
+.IR gtroff .
+.
+Besides
+.IR troff , \" GNU
+the prefix applies to
+the formatter
+.IR nroff ; \" GNU
+the preprocessors
+.IR eqn , \" generic
+.IR grn , \" generic
+.IR pic , \" generic
+.IR \%refer , \" generic
+.IR tbl , \" generic
+and
+.IR \%soelim ; \" generic
+and the utilities
+.I \%indxbib \" generic
+and
+.IR \%lookbib . \" generic
+.
+.
+.TP
+.I GROFF_ENCODING
+The value of this variable is passed to the
+.IR preconv (@MAN1EXT@)
+preprocessor's
+.B \-e
+option to select the character encoding of input files.
+.
+This variable's existence implies
+the
+.I groff
+option
+.BR \-k .
+.
+If set but empty,
+.I groff
+calls
+.I preconv
+without an
+.B \-e
+option.
+.
+.IR groff 's
+.B \-K
+option overrides
+.IR \%GROFF_ENCODING .
+.
+.
+.TP
+.I GROFF_FONT_PATH
+Seek the selected output device's directory of device and font
+description files in this list of directories.
+.
+See
+.MR @g@troff @MAN1EXT@
+and
+.MR groff_font @MAN5EXT@ .
+.
+.
+.TP
+.I GROFF_TMAC_PATH
+Seek macro files in this list of directories.
+.
+See
+.MR @g@troff @MAN1EXT@
+and
+.MR groff_tmac @MAN5EXT@ .
+.
+.
+.TP
+.I GROFF_TMPDIR
+Create temporary files in this directory.
+.
+If not set,
+but the environment variable
+.I \%TMPDIR
+is set,
+temporary files are created there instead.
+.
+On Windows systems,
+if neither of the foregoing are set,
+the environment variables
+.I TMP
+and
+.I TEMP
+(in that order)
+are checked also.
+.
+Otherwise,
+temporary files are created in
+.IR /tmp .
+.
+The
+.MR @g@refer @MAN1EXT@ ,
+.MR grohtml @MAN1EXT@ ,
+and
+.MR grops @MAN1EXT@
+commands use temporary files.
+.
+.
+.TP
+.I GROFF_TYPESETTER
+Set the default output device.
+.
+If empty or not set,
+.B @DEVICE@
+is used.
+.
+The
+.B \-T
+option overrides
+.IR \%GROFF_TYPESETTER .
+.
+.
+.TP
+.I SOURCE_DATE_EPOCH
+A time stamp
+(expressed as seconds since the Unix epoch)
+to use as the output creation time stamp in place of the current time.
+.
+The time is converted to human-readable form using
+.MR localtime 3
+when the formatter starts up and stored in registers usable by documents
+and macro packages.
+.
+.
+.TP
+.I TZ
+The time zone to use when converting the current time
+(or value of
+.IR SOURCE_DATE_EPOCH )
+to human-readable form;
+see
+.MR tzset 3 .
+.
+.
+.\" ====================================================================
+.SH Examples
+.\" ====================================================================
+.
+.I roff
+systems are best known for formatting man pages.
+.
+Once a
+.MR man 1
+librarian program has located a man page,
+it may execute a
+.I groff
+command much like the following.
+.
+.RS
+.EX
+groff \-t \-man \-Tutf8 /usr/share/man/man1/groff.1
+.EE
+.RE
+.
+The librarian will also pipe the output through a pager,
+which might not interpret the SGR terminal escape sequences
+.I groff
+emits for boldface,
+underlining,
+or italics;
+see section \[lq]Limitations\[rq] below.
+.
+.
+.P
+To process a
+.I roff
+input file using the preprocessors
+.I @g@tbl
+and
+.I @g@pic
+and the
+.I me
+macro package in the way to which AT&T
+.I troff \" AT&T
+users were accustomed,
+one would type
+(or script)
+a pipeline.
+.
+.
+.IP
+.EX
+@g@pic foo.me | @g@tbl | @g@troff \-me \-Tutf8 | grotty
+.EE
+.
+.
+.P
+Using
+.IR groff ,
+this pipe can be shortened to an equivalent command.
+.
+.IP
+.EX
+groff \-p \-t \-me \-T utf8 foo.me
+.EE
+.
+.
+.P
+An even easier way to do this is to use
+.MR grog @MAN1EXT@
+to guess the preprocessor and macro options and execute the result by
+using the command substitution feature of the shell.
+.
+.IP
+.EX
+$(grog \-Tutf8 foo.me)
+.EE
+.
+.
+.P
+Each command-line option to a postprocessor must be specified with any
+required leading dashes
+.RB \[lq] \- \[rq]
+.\" No GNU roff postprocessor uses long options for anything except
+.\" --help or --version.
+.\"or
+.\".RB \[lq] \-\- \[rq]
+because
+.I groff
+passes the arguments as-is to the postprocessor;
+this permits arbitrary arguments to be transmitted.
+.
+For example,
+to pass a title to the
+.I gxditview
+postprocessor,
+the shell commands
+.
+.RS
+.EX
+groff \-X \-P \-title \-P \[aq]trial run\[aq] mydoc.t
+.EE
+.RE
+.
+and
+.
+.RS
+.EX
+groff \-X \-Z mydoc.t | gxditview \-title \[aq]trial run\[aq] \-
+.EE
+.RE
+.
+are equivalent.
+.
+.
+.\" ====================================================================
+.SH Limitations
+.\" ====================================================================
+.
+When paging output for the
+.BR ascii ,
+.BR cp1047 ,
+.BR latin1 ,
+and
+.B utf8
+devices,
+programs like
+.MR more 1
+and
+.MR less 1
+may require command-line options to correctly handle some terminal
+escape sequences;
+see
+.MR grotty @MAN1EXT@ .
+.
+.
+.P
+On EBCDIC hosts such as OS/390 Unix,
+the output devices
+.B ascii
+and
+.B latin1
+aren't available.
+.
+Conversely,
+the output device
+.B cp1047
+is not available on systems based on the ISO\~646 or ISO\~8859 character
+encoding standards.
+.
+.
+.\" ====================================================================
+.SH "Installation directories"
+.\" ====================================================================
+.
+GNU
+.I roff
+installs files in varying locations depending on its compile-time
+configuration.
+.
+On this installation,
+the following locations are used.
+.
+.
+.if !'@APPDEFDIR@'' \{\
+.TP
+.I @APPDEFDIR@
+Application defaults directory for
+.MR gxditview @MAN1EXT@ .
+.\}
+.
+.
+.TP
+.I @BINDIR@
+Directory containing
+.IR groff 's
+executable commands.
+.
+.
+.TP
+.I @COMMON_WORDS_FILE@
+List of common words for
+.MR indxbib @MAN1EXT@ .
+.
+.
+.TP
+.I @DATASUBDIR@
+Directory for data files.
+.
+.
+.TP
+.I @DEFAULT_INDEX@
+Default index for
+.MR lkbib @MAN1EXT@
+and
+.MR refer @MAN1EXT@ .
+.
+.
+.TP
+.I @DOCDIR@
+Documentation directory.
+.
+.
+.TP
+.I @EXAMPLEDIR@
+Example directory.
+.
+.
+.TP
+.I @FONTDIR@
+Font directory.
+.
+.
+.TP
+.I @HTMLDOCDIR@
+HTML documentation directory.
+.
+.
+.TP
+.I @LEGACYFONTDIR@
+Legacy font directory.
+.
+.
+.TP
+.I @LOCALFONTDIR@
+Local font directory.
+.
+.
+.TP
+.I @LOCALMACRODIR@
+Local macro package
+.RI ( tmac
+file) directory.
+.
+.
+.TP
+.I @MACRODIR@
+Macro package
+.RI ( tmac
+file) directory.
+.
+.
+.TP
+.I @OLDFONTDIR@
+Font directory for compatibility with old versions of
+.IR groff ;
+see
+.MR grops @MAN1EXT@ .
+.
+.
+.TP
+.I @PDFDOCDIR@
+PDF documentation directory.
+.
+.
+.if !'@COMPATIBILITY_WRAPPERS@'no' \{\
+.TP
+.I @SYSTEMMACRODIR@
+System macro package
+.RI ( tmac
+file) directory.
+.\}
+.
+.
+.\" ====================================================================
+.SS "\f[I]groff\f[] macro directory"
+.\" ====================================================================
+.
+Most macro files supplied with GNU
+.I roff
+are stored in
+.I @MACRODIR@
+for the installation corresponding to this document.
+.
+As a rule,
+multiple directories are searched for macro files;
+see
+.MR @g@troff @MAN1EXT@ .
+.
+For a catalog of macro files GNU
+.I roff
+provides,
+see
+.MR groff_tmac @MAN5EXT@ .
+.
+.
+.\" ====================================================================
+.SS "\f[I]groff\f[] device and font description directory"
+.\" ====================================================================
+.
+Device and font description files supplied with GNU
+.I roff
+are stored in
+.I @FONTDIR@
+for the installation corresponding to this document.
+.
+As a rule,
+multiple directories are searched for device and font description files;
+see
+.MR @g@troff @MAN1EXT@ .
+.
+For the formats of these files,
+see
+.MR groff_font @MAN5EXT@ .
+.
+.
+.\" ====================================================================
+.SH Availability
+.\" ====================================================================
+.
+Obtain links to
+.I groff
+releases for download,
+its source repository,
+discussion mailing lists,
+a support ticket tracker,
+and further information from the
+.UR http://\:www\:.gnu\:.org/\:software/\:groff
+.I groff
+page of the GNU website
+.UE .
+.
+.
+.P
+A free implementation of the
+.I grap
+preprocessor,
+written by
+.MT faber@\:lunabase\:.org
+Ted Faber
+.ME ,
+can be found at the
+.UR http://\:www\:.lunabase\:.org/\:\[ti]faber/\:Vault/\:software/\
+\:grap/
+.I grap
+website
+.UE .
+.
+.I groff
+supports only this
+.IR grap .
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+.I groff
+(both the front-end command and the overall system)
+was primarily written by
+.MT jjc@\:jclark\:.com
+James Clark
+.ME .
+.
+Contributors to this document include Clark,
+Trent A.\& Fisher,
+.MT wl@gnu.org
+Werner Lemberg
+.ME ,
+.MT groff\-bernd.warken\-72@\:web\:.de
+Bernd Warken
+.ME ,
+and
+.MT g.branden\:.robinson@\:gmail\:.com
+G.\& Branden Robinson
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is the primary
+.I groff
+manual.
+.
+You can browse it interactively with \[lq]info groff\[rq].
+.
+.
+.\" groff ships 59 man pages generated from 58 source files. The
+.\" numbered comments refer to their sorting order in the source tree,
+.\" so that it is easier to tell that we've enumerated all of them.
+.TP
+Introduction, \c
+history, \c
+and further reading:
+.MR roff @MAN7EXT@ \" #23
+.
+.
+.TP
+.RI "Viewer for\~" groff "\~(and AT&T device-independent\~" troff \
+)\~documents:
+.MR gxditview @MAN1EXT@ \" #33
+.
+.
+.TP
+Preprocessors:
+.MR @g@chem @MAN1EXT@ , \" #1
+.MR @g@eqn @MAN1EXT@ , \" #34
+.MR @g@neqn @MAN1EXT@ , \" #35
+.MR glilypond @MAN1EXT@ , \" #4
+.MR @g@grn @MAN1EXT@ , \" #36
+.MR preconv @MAN1EXT@ , \" #38
+.MR gperl @MAN1EXT@ , \" #5
+.MR @g@pic @MAN1EXT@ , \" #37
+.MR gpinyin @MAN1EXT@ , \" #6
+.MR @g@refer @MAN1EXT@ , \" #39
+.MR @g@soelim @MAN1EXT@ , \" #40
+.MR @g@tbl @MAN1EXT@ \" #41
+.
+.
+.TP
+Macro packages and package-specific utilities:
+.MR groff_hdtbl @MAN7EXT@ , \" #9
+.MR groff_man @MAN7EXT@ , \" #55a
+.MR groff_man_style @MAN7EXT@ , \" #55b
+.MR groff_mdoc @MAN7EXT@ , \" #56
+.MR groff_me @MAN7EXT@ , \" #57
+.MR groff_mm @MAN7EXT@ , \" # 10
+.MR groff_mmse @MAN7EXT@ , \" # 11
+.MR mmroff @MAN1EXT@ , \" #12
+.MR groff_mom @MAN7EXT@ , \" #13
+.MR pdfmom @MAN1EXT@ , \" #30
+.MR groff_ms @MAN7EXT@ , \" #58
+.MR groff_rfc1345 @MAN7EXT@ , \" 16
+.MR groff_trace @MAN7EXT@ , \" #59
+.MR groff_www @MAN7EXT@ \" #60
+.
+.
+.TP
+Bibliographic database management tools:
+.MR @g@indxbib @MAN1EXT@ , \" #49
+.MR lkbib @MAN1EXT@ , \" #50
+.MR @g@lookbib @MAN1EXT@ \" #51
+.
+.
+.TP
+Language, \c
+conventions, \c
+and GNU extensions:
+.MR groff @MAN7EXT@ , \" #17
+.MR groff_char @MAN7EXT@ , \" #18
+.MR groff_diff @MAN7EXT@ , \" #19
+.MR groff_font @MAN5EXT@ , \" #20
+.MR groff_tmac @MAN5EXT@ \" #22
+.
+.
+.TP
+Intermediate output language:
+.MR groff_out @MAN5EXT@ \" #21
+.
+.
+.TP
+Formatter program:
+.MR @g@troff @MAN1EXT@ \" #45
+.
+.
+.TP
+Formatter wrappers:
+.\".MR groff @MAN1EXT@ , \" 42 -- this page
+.MR @g@nroff @MAN1EXT@ , \" #44
+.MR pdfroff @MAN1EXT@ \" #14
+.
+.
+.TP
+Postprocessors for output devices:
+.MR grodvi @MAN1EXT@ , \" #24
+.MR grohtml @MAN1EXT@ , \" #25
+.MR grolbp @MAN1EXT@ , \" #26
+.MR grolj4 @MAN1EXT@ , \" #27
+.MR gropdf @MAN1EXT@ , \" #29
+.MR grops @MAN1EXT@ , \" #31
+.MR grotty @MAN1EXT@ \" #32
+.
+.
+.TP
+Font support utilities:
+.MR addftinfo @MAN1EXT@ , \" #46
+.MR afmtodit @MAN1EXT@ , \" #47
+.MR hpftodit @MAN1EXT@ , \" #48
+.MR pfbtops @MAN1EXT@ , \" #52
+.MR tfmtodit @MAN1EXT@ , \" #53
+.MR xtotroff @MAN1EXT@ \" #54
+.
+.
+.TP
+Graphics conversion utilities:
+.MR eqn2graph @MAN1EXT@ , \" #2
+.MR grap2graph @MAN1EXT@ , \" #7
+.MR pic2graph @MAN1EXT@ \" #15
+.
+.
+.TP
+Difference-marking utility:
+.MR gdiffmk @MAN1EXT@ \" #3
+.
+.
+.TP
+\[lq]groff guess\[rq] utility:
+.MR grog @MAN1EXT@ \" #43
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_1_man_C]
+.do rr *groff_groff_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/roff/groff/groff.am b/src/roff/groff/groff.am
new file mode 100644
index 0000000..8937d4c
--- /dev/null
+++ b/src/roff/groff/groff.am
@@ -0,0 +1,87 @@
+# Copyright (C) 1993-2020 Free Software Foundation, Inc.
+#
+# Original Makefile.sub rewritten by
+# Bernd Warken <groff-bernd.warken-72@web.de>
+# and Werner LEMBERG <wl@gnu.org>
+#
+# Automake migration by
+# Bertrand Garrigues <bertrand.garrigues@laposte.net>
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+bin_PROGRAMS += groff
+groff_LDADD = \
+ libgroff.a \
+ lib/libgnu.a \
+ $(LIBM)
+groff_SOURCES = \
+ src/roff/groff/groff.cpp \
+ src/roff/groff/pipeline.c \
+ src/roff/groff/pipeline.h
+src/roff/groff/groff.$(OBJEXT): defs.h
+man1_MANS += src/roff/groff/groff.1
+EXTRA_DIST += src/roff/groff/groff.1.man
+
+groff_TESTS = \
+ src/roff/groff/tests/ab_works.sh \
+ src/roff/groff/tests/adjustment_works.sh \
+ src/roff/groff/tests/break_zero-length_output_line_sanely.sh \
+ src/roff/groff/tests/device_control_escapes_express_basic_latin.sh \
+ src/roff/groff/tests/do_not_loop_infinitely_when_breaking_cjk.sh \
+ src/roff/groff/tests/dot-cp_register_works.sh \
+ src/roff/groff/tests/dot-nm_register_works.sh \
+ src/roff/groff/tests/dot-nn_register_works.sh \
+ src/roff/groff/tests/evc_produces_no_output_if_invalid.sh \
+ src/roff/groff/tests/fp_should_not_traverse_directories.sh \
+ src/roff/groff/tests/handle_special_input_code_points.sh \
+ src/roff/groff/tests/html_works_with_grn_and_eqn.sh \
+ src/roff/groff/tests/initialization_is_quiet.sh \
+ src/roff/groff/tests/localization_works.sh \
+ src/roff/groff/tests/msoquiet_works.sh \
+ src/roff/groff/tests/on_latin1_device_oq_is_0x27.sh \
+ src/roff/groff/tests/output_driver_C_and_G_options_work.sh \
+ src/roff/groff/tests/recognize_end_of_sentence.sh \
+ src/roff/groff/tests/regression_savannah_56555.sh \
+ src/roff/groff/tests/regression_savannah_58153.sh \
+ src/roff/groff/tests/regression_savannah_58162.sh \
+ src/roff/groff/tests/regression_savannah_58337.sh \
+ src/roff/groff/tests/regression_savannah_59202.sh \
+ src/roff/groff/tests/smoke-test_html_device.sh \
+ src/roff/groff/tests/some_escapes_accept_newline_delimiters.sh \
+ src/roff/groff/tests/soquiet_works.sh \
+ src/roff/groff/tests/string_case_xform_errors.sh \
+ src/roff/groff/tests/string_case_xform_requests.sh \
+ src/roff/groff/tests/string_case_xform_unicode_escape.sh \
+ src/roff/groff/tests/substring_works.sh \
+ src/roff/groff/tests/use_point_size_escape_with_single_digit_arg.sh
+TESTS += $(groff_TESTS)
+EXTRA_DIST += $(groff_TESTS)
+
+# required test artifacts
+EXTRA_DIST += \
+ src/roff/groff/tests/artifacts/HONEYPOT \
+ src/roff/groff/tests/artifacts/devascii/README
+
+groff_XFAIL_TESTS = \
+ src/roff/groff/tests/string_case_xform_unicode_escape.sh
+XFAIL_TESTS += $(groff_XFAIL_TESTS)
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/roff/groff/groff.cpp b/src/roff/groff/groff.cpp
new file mode 100644
index 0000000..4eb7329
--- /dev/null
+++ b/src/roff/groff/groff.cpp
@@ -0,0 +1,866 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+// A front end for groff.
+
+#include "lib.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdlib.h>
+
+#include "errarg.h"
+#include "error.h"
+#include "stringclass.h"
+#include "cset.h"
+#include "font.h"
+#include "device.h"
+#include "pipeline.h"
+#include "nonposix.h"
+#include "relocate.h"
+#include "defs.h"
+
+#define GXDITVIEW "gxditview"
+
+// troff will be passed an argument of -rXREG=1 if the -X option is
+// specified
+#define XREG ".X"
+
+#ifdef NEED_DECLARATION_PUTENV
+extern "C" {
+ int putenv(const char *);
+}
+#endif /* NEED_DECLARATION_PUTENV */
+
+// The number of commands must be in sync with MAX_COMMANDS in
+// pipeline.h.
+
+// grap, chem, and ideal must come before pic;
+// tbl must come before eqn
+const int PRECONV_INDEX = 0;
+const int SOELIM_INDEX = PRECONV_INDEX + 1;
+const int REFER_INDEX = SOELIM_INDEX + 1;
+const int GRAP_INDEX = REFER_INDEX + 1;
+const int CHEM_INDEX = GRAP_INDEX + 1;
+const int IDEAL_INDEX = CHEM_INDEX + 1;
+const int PIC_INDEX = IDEAL_INDEX + 1;
+const int TBL_INDEX = PIC_INDEX + 1;
+const int GRN_INDEX = TBL_INDEX + 1;
+const int EQN_INDEX = GRN_INDEX + 1;
+const int TROFF_INDEX = EQN_INDEX + 1;
+const int POST_INDEX = TROFF_INDEX + 1;
+const int SPOOL_INDEX = POST_INDEX + 1;
+
+const int NCOMMANDS = SPOOL_INDEX + 1;
+
+class possible_command {
+ char *name;
+ string args;
+ char **argv;
+
+ void build_argv();
+public:
+ possible_command();
+ ~possible_command();
+ void clear_name();
+ void set_name(const char *);
+ void set_name(const char *, const char *);
+ const char *get_name();
+ void append_arg(const char *, const char * = 0 /* nullptr */);
+ void insert_arg(const char *);
+ void insert_args(string s);
+ void clear_args();
+ char **get_argv();
+ void print(int is_last, FILE *fp);
+};
+
+extern "C" const char *Version_string;
+
+int lflag = 0;
+char *spooler = 0 /* nullptr */;
+char *postdriver = 0 /* nullptr */;
+char *predriver = 0 /* nullptr */;
+bool need_postdriver = true;
+char *saved_path = 0 /* nullptr */;
+char *groff_bin_path = 0 /* nullptr */;
+char *groff_font_path = 0 /* nullptr */;
+
+possible_command commands[NCOMMANDS];
+
+int run_commands(int no_pipe);
+void print_commands(FILE *);
+void append_arg_to_string(const char *arg, string &str);
+void handle_unknown_desc_command(const char *command, const char *arg,
+ const char *filename, int lineno);
+const char *xbasename(const char *);
+
+void usage(FILE *stream);
+
+static char *xstrdup(const char *s) {
+ if (0 /* nullptr */ == s)
+ return const_cast<char *>(s);
+ char *str = strdup(s);
+ if (0 /* nullptr */ == str)
+ fatal("unable to copy string: %1", strerror(errno));
+ return str;
+}
+
+static void xputenv(const char *s) {
+ if (putenv(const_cast<char *>(s)) != 0)
+ fatal("unable to write to environment: %1", strerror(errno));
+ return;
+}
+
+static void xexit(int status) {
+ free(spooler);
+ free(predriver);
+ free(postdriver);
+ free(saved_path);
+ free(groff_bin_path);
+ free(groff_font_path);
+ exit(status);
+}
+
+int main(int argc, char **argv)
+{
+ program_name = argv[0];
+ static char stderr_buf[BUFSIZ];
+ setbuf(stderr, stderr_buf);
+ assert(NCOMMANDS <= MAX_COMMANDS);
+ string Pargs, Largs, Fargs;
+ int Kflag = 0;
+ int vflag = 0;
+ int Vflag = 0;
+ int zflag = 0;
+ int iflag = 0;
+ int Xflag = 0;
+ int oflag = 0;
+ int safer_flag = 1;
+ int is_xhtml = 0;
+ int eflag = 0;
+ int need_pic = 0;
+ int opt;
+ const char *command_prefix = getenv("GROFF_COMMAND_PREFIX");
+ const char *encoding = getenv("GROFF_ENCODING");
+ if (!command_prefix)
+ command_prefix = PROG_PREFIX;
+ commands[TROFF_INDEX].set_name(command_prefix, "troff");
+ static const struct option long_options[] = {
+ { "help", no_argument, 0, 'h' },
+ { "version", no_argument, 0, 'v' },
+ { NULL, 0, 0, 0 }
+ };
+ while ((opt = getopt_long(
+ argc, argv,
+ "abcCd:D:eEf:F:gGhiI:jJkK:lL:m:M:"
+ "n:No:pP:r:RsStT:UvVw:W:XzZ",
+ long_options, NULL))
+ != EOF) {
+ char buf[3];
+ buf[0] = '-';
+ buf[1] = opt;
+ buf[2] = '\0';
+ switch (opt) {
+ case 'i':
+ iflag = 1;
+ break;
+ case 'I':
+ commands[GRN_INDEX].set_name(command_prefix, "grn");
+ commands[GRN_INDEX].append_arg("-M", optarg);
+ commands[SOELIM_INDEX].set_name(command_prefix, "soelim");
+ commands[SOELIM_INDEX].append_arg(buf, optarg);
+ // .psbb may need to search for files
+ commands[TROFF_INDEX].append_arg(buf, optarg);
+ // \X'ps:import' may need to search for files
+ Pargs += buf;
+ Pargs += optarg;
+ Pargs += '\0';
+ break;
+ case 'D':
+ commands[PRECONV_INDEX].set_name("preconv");
+ commands[PRECONV_INDEX].append_arg("-D", optarg);
+ break;
+ case 'K':
+ commands[PRECONV_INDEX].append_arg("-e", optarg);
+ Kflag = 1;
+ // fall through
+ case 'k':
+ commands[PRECONV_INDEX].set_name("preconv");
+ break;
+ case 't':
+ commands[TBL_INDEX].set_name(command_prefix, "tbl");
+ break;
+ case 'J':
+ // commands[IDEAL_INDEX].set_name(command_prefix, "gideal");
+ // need_pic = 1;
+ break;
+ case 'j':
+ commands[CHEM_INDEX].set_name(command_prefix, "chem");
+ need_pic = 1;
+ break;
+ case 'p':
+ commands[PIC_INDEX].set_name(command_prefix, "pic");
+ break;
+ case 'g':
+ commands[GRN_INDEX].set_name(command_prefix, "grn");
+ break;
+ case 'G':
+ commands[GRAP_INDEX].set_name(command_prefix, "grap");
+ need_pic = 1;
+ break;
+ case 'e':
+ eflag = 1;
+ commands[EQN_INDEX].set_name(command_prefix, "eqn");
+ break;
+ case 's':
+ commands[SOELIM_INDEX].set_name(command_prefix, "soelim");
+ break;
+ case 'R':
+ commands[REFER_INDEX].set_name(command_prefix, "refer");
+ break;
+ case 'z':
+ case 'a':
+ commands[TROFF_INDEX].append_arg(buf);
+ // fall through
+ case 'Z':
+ zflag++;
+ need_postdriver = false;
+ break;
+ case 'l':
+ lflag++;
+ break;
+ case 'V':
+ Vflag++;
+ break;
+ case 'v':
+ vflag = 1;
+ printf("GNU groff version %s\n", Version_string);
+ printf(
+ "Copyright (C) 2022 Free Software Foundation, Inc.\n"
+ "GNU groff comes with ABSOLUTELY NO WARRANTY.\n"
+ "You may redistribute copies of groff and its subprograms\n"
+ "under the terms of the GNU General Public License.\n"
+ "For more information about these matters, see the file\n"
+ "named COPYING.\n");
+ printf("\ncalled subprograms:\n\n");
+ fflush(stdout);
+ // Pass -v to all possible subprograms
+ commands[PRECONV_INDEX].append_arg(buf);
+ commands[CHEM_INDEX].append_arg(buf);
+ commands[IDEAL_INDEX].append_arg(buf);
+ commands[POST_INDEX].append_arg(buf);
+ // fall through
+ case 'C':
+ commands[SOELIM_INDEX].append_arg(buf);
+ commands[REFER_INDEX].append_arg(buf);
+ commands[PIC_INDEX].append_arg(buf);
+ commands[GRAP_INDEX].append_arg(buf);
+ commands[TBL_INDEX].append_arg(buf);
+ commands[GRN_INDEX].append_arg(buf);
+ commands[EQN_INDEX].append_arg(buf);
+ commands[TROFF_INDEX].append_arg(buf);
+ break;
+ case 'N':
+ commands[EQN_INDEX].append_arg(buf);
+ break;
+ case 'h':
+ usage(stdout);
+ break;
+ case 'E':
+ case 'b':
+ commands[TROFF_INDEX].append_arg(buf);
+ break;
+ case 'c':
+ commands[TROFF_INDEX].append_arg(buf);
+ break;
+ case 'S':
+ safer_flag = 1;
+ break;
+ case 'U':
+ safer_flag = 0;
+ break;
+ case 'T':
+ if (strcmp(optarg, "xhtml") == 0) {
+ // force soelim to aid the html preprocessor
+ commands[SOELIM_INDEX].set_name(command_prefix, "soelim");
+ Pargs += "-x";
+ Pargs += '\0';
+ Pargs += 'x';
+ Pargs += '\0';
+ is_xhtml = 1;
+ device = "html";
+ break;
+ }
+ if (strcmp(optarg, "html") == 0)
+ // force soelim to aid the html preprocessor
+ commands[SOELIM_INDEX].set_name(command_prefix, "soelim");
+ if (strcmp(optarg, "Xps") == 0) {
+ warning("-TXps option is obsolete: use -X -Tps instead");
+ device = "ps";
+ Xflag++;
+ }
+ else
+ device = optarg;
+ break;
+ case 'F':
+ font::command_line_font_dir(optarg);
+ if (Fargs.length() > 0) {
+ Fargs += PATH_SEP_CHAR;
+ Fargs += optarg;
+ }
+ else
+ Fargs = optarg;
+ break;
+ case 'o':
+ oflag = 1;
+ // fall through
+ case 'f':
+ case 'm':
+ case 'r':
+ case 'd':
+ case 'n':
+ case 'w':
+ case 'W':
+ commands[TROFF_INDEX].append_arg(buf, optarg);
+ break;
+ case 'M':
+ commands[EQN_INDEX].append_arg(buf, optarg);
+ commands[GRAP_INDEX].append_arg(buf, optarg);
+ commands[GRN_INDEX].append_arg(buf, optarg);
+ commands[TROFF_INDEX].append_arg(buf, optarg);
+ break;
+ case 'P':
+ Pargs += optarg;
+ Pargs += '\0';
+ break;
+ case 'L':
+ append_arg_to_string(optarg, Largs);
+ break;
+ case 'X':
+ Xflag++;
+ need_postdriver = false;
+ break;
+ case '?':
+ usage(stderr);
+ xexit(EXIT_FAILURE);
+ break;
+ default:
+ assert(0 == "no case to handle option character");
+ break;
+ }
+ }
+ if (need_pic)
+ commands[PIC_INDEX].set_name(command_prefix, "pic");
+ if (encoding) {
+ commands[PRECONV_INDEX].set_name("preconv");
+ if (!Kflag && *encoding)
+ commands[PRECONV_INDEX].append_arg("-e", encoding);
+ }
+ if (!safer_flag) {
+ commands[TROFF_INDEX].insert_arg("-U");
+ commands[PIC_INDEX].append_arg("-U");
+ }
+ font::set_unknown_desc_command_handler(handle_unknown_desc_command);
+ const char *desc = font::load_desc();
+ if (0 /* nullptr */ == desc)
+ fatal("cannot load 'DESC' description file for device '%1'",
+ device);
+ if (need_postdriver && (0 /* nullptr */ == postdriver))
+ fatal_with_file_and_line(desc, 0, "device description file missing"
+ " 'postpro' directive");
+ if (predriver && !zflag) {
+ commands[TROFF_INDEX].insert_arg(commands[TROFF_INDEX].get_name());
+ commands[TROFF_INDEX].set_name(predriver);
+ // pass the device arguments to the predrivers as well
+ commands[TROFF_INDEX].insert_args(Pargs);
+ if (eflag && is_xhtml)
+ commands[TROFF_INDEX].insert_arg("-e");
+ if (vflag)
+ commands[TROFF_INDEX].insert_arg("-v");
+ }
+ const char *real_driver = 0 /* nullptr */;
+ if (Xflag) {
+ real_driver = postdriver;
+ postdriver = xstrdup(GXDITVIEW); // so we can free() it in xexit()
+ commands[TROFF_INDEX].append_arg("-r" XREG "=", "1");
+ }
+ if (postdriver)
+ commands[POST_INDEX].set_name(postdriver);
+ int gxditview_flag = postdriver
+ && strcmp(xbasename(postdriver), GXDITVIEW) == 0;
+ if (gxditview_flag && argc - optind == 1) {
+ commands[POST_INDEX].append_arg("-title");
+ commands[POST_INDEX].append_arg(argv[optind]);
+ commands[POST_INDEX].append_arg("-xrm");
+ commands[POST_INDEX].append_arg("*iconName:", argv[optind]);
+ string filename_string("|");
+ append_arg_to_string(argv[0], filename_string);
+ append_arg_to_string("-Z", filename_string);
+ for (int i = 1; i < argc; i++)
+ append_arg_to_string(argv[i], filename_string);
+ filename_string += '\0';
+ commands[POST_INDEX].append_arg("-filename");
+ commands[POST_INDEX].append_arg(filename_string.contents());
+ }
+ if (gxditview_flag && Xflag) {
+ string print_string(real_driver);
+ if (spooler) {
+ print_string += " | ";
+ print_string += spooler;
+ print_string += Largs;
+ }
+ print_string += '\0';
+ commands[POST_INDEX].append_arg("-printCommand");
+ commands[POST_INDEX].append_arg(print_string.contents());
+ }
+ const char *p = Pargs.contents();
+ const char *end = p + Pargs.length();
+ while (p < end) {
+ commands[POST_INDEX].append_arg(p);
+ p = strchr(p, '\0') + 1;
+ }
+ if (gxditview_flag)
+ commands[POST_INDEX].append_arg("-");
+ if (lflag && !vflag && !Xflag && spooler) {
+ commands[SPOOL_INDEX].set_name(BSHELL);
+ commands[SPOOL_INDEX].append_arg(BSHELL_DASH_C);
+ Largs += '\0';
+ Largs = spooler + Largs;
+ commands[SPOOL_INDEX].append_arg(Largs.contents());
+ }
+ if (zflag) {
+ commands[POST_INDEX].set_name(0 /* nullptr */);
+ commands[SPOOL_INDEX].set_name(0 /* nullptr */);
+ }
+ commands[TROFF_INDEX].append_arg("-T", device);
+ if (strcmp(device, "html") == 0) {
+ if (is_xhtml) {
+ if (oflag)
+ fatal("'-o' option is invalid with device 'xhtml'");
+ if (zflag)
+ commands[EQN_INDEX].append_arg("-Tmathml:xhtml");
+ else if (eflag)
+ commands[EQN_INDEX].clear_name();
+ }
+ else {
+ if (oflag)
+ fatal("'-o' option is invalid with device 'html'");
+ // html renders equations as images via ps
+ commands[EQN_INDEX].append_arg("-Tps:html");
+ }
+ }
+ else
+ commands[EQN_INDEX].append_arg("-T", device);
+
+ commands[GRN_INDEX].append_arg("-T", device);
+
+ int first_index;
+ for (first_index = 0; first_index < TROFF_INDEX; first_index++)
+ if (commands[first_index].get_name() != 0 /* nullptr */)
+ break;
+ if (optind < argc) {
+ if (argv[optind][0] == '-' && argv[optind][1] != '\0')
+ commands[first_index].append_arg("--");
+ for (int i = optind; i < argc; i++)
+ commands[first_index].append_arg(argv[i]);
+ if (iflag)
+ commands[first_index].append_arg("-");
+ }
+ if (Fargs.length() > 0) {
+ string e = "GROFF_FONT_PATH";
+ e += '=';
+ e += Fargs;
+ char *fontpath = getenv("GROFF_FONT_PATH");
+ if (fontpath && *fontpath) {
+ e += PATH_SEP_CHAR;
+ e += fontpath;
+ }
+ e += '\0';
+ groff_font_path = xstrdup(e.contents());
+ xputenv(groff_font_path);
+ }
+ {
+ // we save the original path in GROFF_PATH__ and put it into the
+ // environment -- troff will pick it up later.
+ char *path = getenv("PATH");
+ string g = "GROFF_PATH__";
+ g += '=';
+ if (path && *path)
+ g += path;
+ g += '\0';
+ saved_path = xstrdup(g.contents());
+ xputenv(saved_path);
+ char *binpath = getenv("GROFF_BIN_PATH");
+ string f = "PATH";
+ f += '=';
+ if (binpath && *binpath)
+ f += binpath;
+ else {
+ binpath = relocatep(BINPATH);
+ f += binpath;
+ }
+ if (path && *path) {
+ f += PATH_SEP_CHAR;
+ f += path;
+ }
+ f += '\0';
+ groff_bin_path = xstrdup(f.contents());
+ xputenv(groff_bin_path);
+ }
+ if (Vflag)
+ print_commands(Vflag == 1 ? stdout : stderr);
+ if (Vflag == 1)
+ xexit(EXIT_SUCCESS);
+ xexit(run_commands(vflag));
+}
+
+const char *xbasename(const char *s)
+{
+ if (!s)
+ return 0 /* nullptr */;
+ // DIR_SEPS[] are possible directory separator characters; see
+ // nonposix.h. We want the rightmost separator of all possible ones.
+ // Example: d:/foo\\bar.
+ const char *p = strrchr(s, DIR_SEPS[0]), *p1;
+ const char *sep = &DIR_SEPS[1];
+
+ while (*sep)
+ {
+ p1 = strrchr(s, *sep);
+ if (p1 && (!p || p1 > p))
+ p = p1;
+ sep++;
+ }
+ return p ? p + 1 : s;
+}
+
+void handle_unknown_desc_command(const char *command, const char *arg,
+ const char *filename, int lineno)
+{
+ if (strcmp(command, "print") == 0) {
+ if (arg == 0 /* nullptr */)
+ error_with_file_and_line(filename, lineno, "'print' directive"
+ " requires an argument");
+ else
+ spooler = xstrdup(arg);
+ return;
+ }
+ if (strcmp(command, "prepro") == 0) {
+ if (arg == 0 /* nullptr */)
+ error("'prepro' directive requires an argument");
+ else {
+ for (const char *p = arg; *p; p++)
+ if (csspace(*p)) {
+ error_with_file_and_line(filename, lineno, "invalid 'prepro'"
+ " directive argument '%1': program"
+ " name required", arg);
+ }
+ predriver = xstrdup(arg);
+ }
+ return;
+ }
+ if (strcmp(command, "postpro") == 0) {
+ if (arg == 0 /* nullptr */)
+ error_with_file_and_line(filename, lineno, "'postpro' directive"
+ " requires an argument");
+ else {
+ for (const char *p = arg; *p; p++)
+ if (csspace(*p)) {
+ error_with_file_and_line(filename, lineno, "invalid 'postpro'"
+ " directive argument '%1': program"
+ " name required", arg);
+ return;
+ }
+ postdriver = xstrdup(arg);
+ }
+ return;
+ }
+}
+
+void print_commands(FILE *fp)
+{
+ int last;
+ for (last = SPOOL_INDEX; last >= 0; last--)
+ if (commands[last].get_name() != 0 /* nullptr */)
+ break;
+ for (int i = 0; i <= last; i++)
+ if (commands[i].get_name() != 0 /* nullptr */)
+ commands[i].print(i == last, fp);
+}
+
+// Run the commands. Return the code with which to exit.
+
+int run_commands(int no_pipe)
+{
+ char **v[NCOMMANDS]; // vector of argv arrays to pipe together
+ int ncommands = 0;
+ for (int i = 0; i < NCOMMANDS; i++)
+ if (commands[i].get_name() != 0 /* nullptr */)
+ v[ncommands++] = commands[i].get_argv();
+ return run_pipeline(ncommands, v, no_pipe);
+}
+
+possible_command::possible_command()
+: name(0), argv(0)
+{
+}
+
+possible_command::~possible_command()
+{
+ free(name);
+ delete[] argv;
+}
+
+void possible_command::set_name(const char *s)
+{
+ free(name);
+ name = xstrdup(s);
+}
+
+void possible_command::clear_name()
+{
+ delete[] name;
+ delete[] argv;
+ name = NULL;
+ argv = NULL;
+}
+
+void possible_command::set_name(const char *s1, const char *s2)
+{
+ free(name);
+ name = (char*)malloc(strlen(s1) + strlen(s2) + 1);
+ strcpy(name, s1);
+ strcat(name, s2);
+}
+
+const char *possible_command::get_name()
+{
+ return name;
+}
+
+void possible_command::clear_args()
+{
+ args.clear();
+}
+
+void possible_command::append_arg(const char *s, const char *t)
+{
+ args += s;
+ if (t)
+ args += t;
+ args += '\0';
+}
+
+void possible_command::insert_arg(const char *s)
+{
+ string str(s);
+ str += '\0';
+ str += args;
+ args = str;
+}
+
+void possible_command::insert_args(string s)
+{
+ const char *p = s.contents();
+ const char *end = p + s.length();
+ int l = 0;
+ if (p >= end)
+ return;
+ // find the total number of arguments in our string
+ do {
+ l++;
+ p = strchr(p, '\0') + 1;
+ } while (p < end);
+ // now insert each argument preserving the order
+ for (int i = l - 1; i >= 0; i--) {
+ p = s.contents();
+ for (int j = 0; j < i; j++)
+ p = strchr(p, '\0') + 1;
+ insert_arg(p);
+ }
+}
+
+void possible_command::build_argv()
+{
+ if (argv)
+ return;
+ // Count the number of arguments.
+ int len = args.length();
+ int argc = 1;
+ char *p = 0 /* nullptr */;
+ if (len > 0) {
+ p = &args[0];
+ for (int i = 0; i < len; i++)
+ if (p[i] == '\0')
+ argc++;
+ }
+ // Build an argument vector.
+ argv = new char *[argc + 1];
+ argv[0] = name;
+ for (int i = 1; i < argc; i++) {
+ argv[i] = p;
+ p = strchr(p, '\0') + 1;
+ }
+ argv[argc] = 0 /* nullptr */;
+}
+
+void possible_command::print(int is_last, FILE *fp)
+{
+ build_argv();
+ if (IS_BSHELL(argv[0])
+ && argv[1] != 0 /* nullptr */
+ && strcmp(argv[1], BSHELL_DASH_C) == 0
+ && argv[2] != 0 /* nullptr */ && argv[3] == 0 /* nullptr */)
+ fputs(argv[2], fp);
+ else {
+ fputs(argv[0], fp);
+ string str;
+ for (int i = 1; argv[i] != 0 /* nullptr */; i++) {
+ str.clear();
+ append_arg_to_string(argv[i], str);
+ put_string(str, fp);
+ }
+ }
+ if (is_last)
+ putc('\n', fp);
+ else
+ fputs(" | ", fp);
+}
+
+void append_arg_to_string(const char *arg, string &str)
+{
+ str += ' ';
+ int needs_quoting = 0;
+ // Native Windows programs don't support '..' style of quoting, so
+ // always behave as if ARG included the single quote character.
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ int contains_single_quote = 1;
+#else
+ int contains_single_quote = 0;
+#endif
+ const char*p;
+ for (p = arg; *p != '\0'; p++)
+ switch (*p) {
+ case ';':
+ case '&':
+ case '(':
+ case ')':
+ case '|':
+ case '^':
+ case '<':
+ case '>':
+ case '\n':
+ case ' ':
+ case '\t':
+ case '\\':
+ case '"':
+ case '$':
+ case '?':
+ case '*':
+ needs_quoting = 1;
+ break;
+ case '\'':
+ contains_single_quote = 1;
+ break;
+ }
+ if (contains_single_quote || arg[0] == '\0') {
+ str += '"';
+ for (p = arg; *p != '\0'; p++)
+ switch (*p) {
+#if !(defined(_WIN32) && !defined(__CYGWIN__))
+ case '"':
+ case '\\':
+ case '$':
+ str += '\\';
+#else
+ case '"':
+ case '\\':
+ if (*p == '"' || (*p == '\\' && p[1] == '"'))
+ str += '\\';
+#endif
+ // fall through
+ default:
+ str += *p;
+ break;
+ }
+ str += '"';
+ }
+ else if (needs_quoting) {
+ str += '\'';
+ str += arg;
+ str += '\'';
+ }
+ else
+ str += arg;
+}
+
+char **possible_command::get_argv()
+{
+ build_argv();
+ return argv;
+}
+
+void usage(FILE *stream)
+{
+ // Add `J` to the cluster if we ever get ideal(1) support.
+ fprintf(stream,
+"usage: %s [-abcCeEgGijklNpRsStUVXzZ] [-d ctext] [-d string=text]"
+" [-D fallback-encoding] [-f font-family] [-F font-directory]"
+" [-I inclusion-directory] [-K input-encoding] [-L spooler-argument]"
+" [-m macro-package] [-M macro-directory] [-n page-number]"
+" [-o page-list] [-P postprocessor-argument] [-r cnumeric-expression]"
+" [-r register=numeric-expression] [-T output-device]"
+" [-w warning-category] [-W warning-category]"
+" [file ...]\n"
+"usage: %s {-v | --version}\n"
+"usage: %s {-h | --help}\n",
+ program_name, program_name, program_name);
+ if (stdout == stream) {
+ fputs(
+"\n"
+"groff (GNU roff) is a typesetting system that reads plain text input\n"
+"files that include formatting commands to produce output in\n"
+"PostScript, PDF, HTML, or DVI formats or for display to a terminal.\n"
+"See the groff(1) manual page.\n",
+ stream);
+ exit(EXIT_SUCCESS);
+ }
+}
+
+extern "C" {
+
+void c_error(const char *format, const char *arg1, const char *arg2,
+ const char *arg3)
+{
+ error(format, arg1, arg2, arg3);
+}
+
+void c_fatal(const char *format, const char *arg1, const char *arg2,
+ const char *arg3)
+{
+ fatal(format, arg1, arg2, arg3);
+}
+
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/roff/groff/pipeline.c b/src/roff/groff/pipeline.c
new file mode 100644
index 0000000..defafc2
--- /dev/null
+++ b/src/roff/groff/pipeline.c
@@ -0,0 +1,589 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <signal.h>
+#include <errno.h>
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_STRERROR
+#include <string.h>
+#else
+extern char *strerror();
+#endif
+
+#ifdef _POSIX_VERSION
+
+#include <sys/wait.h>
+#define PID_T pid_t
+
+#else /* not _POSIX_VERSION */
+
+/* traditional Unix */
+
+#define WIFEXITED(s) (((s) & 0377) == 0)
+#define WIFSTOPPED(s) (((s) & 0377) == 0177)
+#define WIFSIGNALED(s) (((s) & 0377) != 0 && (((s) & 0377) != 0177))
+#define WEXITSTATUS(s) (((s) >> 8) & 0377)
+#define WTERMSIG(s) ((s) & 0177)
+#define WSTOPSIG(s) (((s) >> 8) & 0377)
+
+#ifndef WCOREFLAG
+#define WCOREFLAG 0200
+#endif
+
+#define PID_T int
+
+#endif /* not _POSIX_VERSION */
+
+/* SVR4 uses WCOREFLG; Net 2 uses WCOREFLAG. */
+#ifndef WCOREFLAG
+#ifdef WCOREFLG
+#define WCOREFLAG WCOREFLG
+#endif /* WCOREFLG */
+#endif /* not WCOREFLAG */
+
+#ifndef WCOREDUMP
+#ifdef WCOREFLAG
+#define WCOREDUMP(s) ((s) & WCOREFLAG)
+#else /* not WCOREFLAG */
+#define WCOREDUMP(s) (0)
+#endif /* WCOREFLAG */
+#endif /* not WCOREDUMP */
+
+#include "pipeline.h"
+
+/* Prototype */
+int run_pipeline(int, char ***, int);
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern void c_error(const char *, const char *, const char *,
+ const char *);
+extern void c_fatal(const char *, const char *, const char *,
+ const char *);
+extern const char *i_to_a(int); /* from libgroff */
+
+#ifdef __cplusplus
+}
+#endif
+
+static void sys_fatal(const char *);
+static const char *xstrsignal(int);
+
+
+#if defined(__MSDOS__) \
+ || (defined(_WIN32) && !defined(_UWIN) && !defined(__CYGWIN__)) \
+ || defined(__EMX__)
+
+#include <process.h>
+#include <fcntl.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "nonposix.h"
+
+static const char *sh = "sh";
+static const char *cmd = "cmd";
+static const char *command = "command";
+
+extern int strcasecmp(const char *, const char *);
+
+char *sbasename(const char *path)
+{
+ char *base;
+ const char *p1, *p2;
+
+ p1 = path;
+ if ((p2 = strrchr(p1, '\\'))
+ || (p2 = strrchr(p1, '/'))
+ || (p2 = strrchr(p1, ':')))
+ p1 = p2 + 1;
+ if ((p2 = strrchr(p1, '.'))
+ && ((strcasecmp(p2, ".exe") == 0)
+ || (strcasecmp(p2, ".com") == 0)))
+ ;
+ else
+ p2 = p1 + strlen(p1);
+
+ base = malloc((size_t)(p2 - p1));
+ strncpy(base, p1, p2 - p1);
+ *(base + (p2 - p1)) = '\0';
+
+ return(base);
+}
+
+/* Get the name of the system shell */
+char *system_shell_name(void)
+{
+ const char *shell_name;
+
+ /*
+ Use a Unixy shell if it's installed. Use SHELL if set; otherwise,
+ let spawnlp try to find sh; if that fails, use COMSPEC if set; if
+ not, try cmd.exe; if that fails, default to command.com.
+ */
+
+ if ((shell_name = getenv("SHELL")) != NULL)
+ ;
+ else if (spawnlp(_P_WAIT, sh, sh, "-c", ":", NULL) == 0)
+ shell_name = sh;
+ else if ((shell_name = getenv("COMSPEC")) != NULL)
+ ;
+ else if (spawnlp(_P_WAIT, cmd, cmd, "/c", ";", NULL) == 0)
+ shell_name = cmd;
+ else
+ shell_name = command;
+
+ return sbasename(shell_name);
+}
+
+const char *system_shell_dash_c(void)
+{
+ char *shell_name;
+ const char *dash_c;
+
+ shell_name = system_shell_name();
+
+ /* Assume that if the shell name ends in 'sh', it's Unixy */
+ if (strcasecmp(shell_name + strlen(shell_name) - strlen("sh"), "sh") == 0)
+ dash_c = "-c";
+ else
+ dash_c = "/c";
+
+ free(shell_name);
+ return dash_c;
+}
+
+int is_system_shell(const char *prog)
+{
+ int result;
+ char *this_prog, *system_shell;
+
+ if (!prog) /* paranoia */
+ return 0;
+
+ this_prog = sbasename(prog);
+ system_shell = system_shell_name();
+
+ result = strcasecmp(this_prog, system_shell) == 0;
+
+ free(this_prog);
+ free(system_shell);
+
+ return result;
+}
+
+#ifdef _WIN32
+
+/*
+ Windows 32 doesn't have fork(), so we need to start asynchronous child
+ processes with spawn() rather than exec(). If there is more than one
+ command, i.e., a pipeline, the parent must set up each child's I/O
+ redirection prior to the spawn. The original stdout must be restored
+ before spawning the last process in the pipeline, and the original
+ stdin must be restored in the parent after spawning the last process
+ and before waiting for any of the children.
+*/
+
+int run_pipeline(int ncommands, char ***commands, int no_pipe)
+{
+ int i;
+ int last_input = 0; /* pacify some compilers */
+ int save_stdin = 0;
+ int save_stdout = 0;
+ int ret = 0;
+ char err_str[BUFSIZ];
+ PID_T pids[MAX_COMMANDS];
+
+ for (i = 0; i < ncommands; i++) {
+ int pdes[2];
+ PID_T pid;
+
+ /* If no_pipe is set, just run the commands in sequence
+ to show the version numbers */
+ if (ncommands > 1 && !no_pipe) {
+ /* last command doesn't need a new pipe */
+ if (i < ncommands - 1) {
+ if (pipe(pdes) < 0) {
+ sprintf(err_str, "%s: pipe", commands[i][0]);
+ sys_fatal(err_str);
+ }
+ }
+ /* 1st command; writer */
+ if (i == 0) {
+ /* save stdin */
+ if ((save_stdin = dup(STDIN_FILENO)) < 0)
+ sys_fatal("dup stdin");
+ /* save stdout */
+ if ((save_stdout = dup(STDOUT_FILENO)) < 0)
+ sys_fatal("dup stdout");
+
+ /* connect stdout to write end of pipe */
+ if (dup2(pdes[1], STDOUT_FILENO) < 0) {
+ sprintf(err_str, "%s: dup2(stdout)", commands[i][0]);
+ sys_fatal(err_str);
+ }
+ if (close(pdes[1]) < 0) {
+ sprintf(err_str, "%s: close(pipe[WRITE])", commands[i][0]);
+ sys_fatal(err_str);
+ }
+ /*
+ Save the read end of the pipe so that it can be connected to
+ stdin of the next program in the pipeline during the next
+ pass through the loop.
+ */
+ last_input = pdes[0];
+ }
+ /* reader and writer */
+ else if (i < ncommands - 1) {
+ /* connect stdin to read end of last pipe */
+ if (dup2(last_input, STDIN_FILENO) < 0) {
+ sprintf(err_str, " %s: dup2(stdin)", commands[i][0]);
+ sys_fatal(err_str);
+ }
+ if (close(last_input) < 0) {
+ sprintf(err_str, "%s: close(last_input)", commands[i][0]);
+ sys_fatal(err_str);
+ }
+ /* connect stdout to write end of new pipe */
+ if (dup2(pdes[1], STDOUT_FILENO) < 0) {
+ sprintf(err_str, "%s: dup2(stdout)", commands[i][0]);
+ sys_fatal(err_str);
+ }
+ if (close(pdes[1]) < 0) {
+ sprintf(err_str, "%s: close(pipe[WRITE])", commands[i][0]);
+ sys_fatal(err_str);
+ }
+ last_input = pdes[0];
+ }
+ /* last command; reader */
+ else {
+ /* connect stdin to read end of last pipe */
+ if (dup2(last_input, STDIN_FILENO) < 0) {
+ sprintf(err_str, "%s: dup2(stdin)", commands[i][0]);
+ sys_fatal(err_str);
+ }
+ if (close(last_input) < 0) {
+ sprintf(err_str, "%s: close(last_input)", commands[i][0]);
+ sys_fatal(err_str);
+ }
+ /* restore original stdout */
+ if (dup2(save_stdout, STDOUT_FILENO) < 0) {
+ sprintf(err_str, "%s: dup2(save_stdout))", commands[i][0]);
+ sys_fatal(err_str);
+ }
+ /* close stdout copy */
+ if (close(save_stdout) < 0) {
+ sprintf(err_str, "%s: close(save_stdout)", commands[i][0]);
+ sys_fatal(err_str);
+ }
+ }
+ }
+ if ((pid = spawnvp(_P_NOWAIT, commands[i][0], commands[i])) < 0) {
+ c_error("couldn't exec %1: %2",
+ commands[i][0], strerror(errno), (char *)0);
+ _exit(EXEC_FAILED_EXIT_STATUS);
+ }
+ pids[i] = pid;
+ }
+
+ if (ncommands > 1 && !no_pipe) {
+ /* restore original stdin if it was redirected */
+ if (dup2(save_stdin, STDIN_FILENO) < 0) {
+ sprintf(err_str, "dup2(save_stdin))");
+ sys_fatal(err_str);
+ }
+ /* close stdin copy */
+ if (close(save_stdin) < 0) {
+ sprintf(err_str, "close(save_stdin)");
+ sys_fatal(err_str);
+ }
+ }
+
+ for (i = 0; i < ncommands; i++) {
+ int status;
+ PID_T pid;
+
+ pid = pids[i];
+ if ((pid = WAIT(&status, pid, _WAIT_CHILD)) < 0) {
+ sprintf(err_str, "%s: wait", commands[i][0]);
+ sys_fatal(err_str);
+ }
+ else if (status != 0)
+ ret |= 1;
+ }
+ return ret;
+}
+
+#else /* not _WIN32 */
+
+/* MS-DOS doesn't have 'fork', so we need to simulate the pipe by
+ running the programs in sequence with standard streams redirected to
+ and from temporary files.
+*/
+
+
+/* A signal handler that just records that a signal has happened. */
+static int child_interrupted;
+
+static RETSIGTYPE signal_catcher(int signo)
+{
+ child_interrupted++;
+}
+
+int run_pipeline(int ncommands, char ***commands, int no_pipe)
+{
+ int save_stdin = dup(0);
+ int save_stdout = dup(1);
+ char *tmpfiles[2];
+ int infile = 0;
+ int outfile = 1;
+ int i, f, ret = 0;
+
+ /* Choose names for a pair of temporary files to implement the pipeline.
+ Microsoft's 'tempnam' uses the directory specified by 'getenv("TMP")'
+ if it exists; in case it doesn't, try the GROFF alternatives, or
+ 'getenv("TEMP")' as last resort -- at least one of these had better
+ be set, since Microsoft's default has a high probability of failure. */
+ char *tmpdir;
+ if ((tmpdir = getenv("GROFF_TMPDIR")) == NULL
+ && (tmpdir = getenv("TMPDIR")) == NULL)
+ tmpdir = getenv("TEMP");
+
+ /* Don't use 'tmpnam' here: Microsoft's implementation yields unusable
+ file names if current directory is on network share with read-only
+ root. */
+ tmpfiles[0] = tempnam(tmpdir, NULL);
+ tmpfiles[1] = tempnam(tmpdir, NULL);
+
+ for (i = 0; i < ncommands; i++) {
+ int exit_status;
+ RETSIGTYPE (*prev_handler)(int);
+
+ if (i && !no_pipe) {
+ /* redirect stdin from temp file */
+ f = open(tmpfiles[infile], O_RDONLY|O_BINARY, 0666);
+ if (f < 0)
+ sys_fatal("open stdin");
+ if (dup2(f, 0) < 0)
+ sys_fatal("dup2 stdin");
+ if (close(f) < 0)
+ sys_fatal("close stdin");
+ }
+ if ((i < ncommands - 1) && !no_pipe) {
+ /* redirect stdout to temp file */
+ f = open(tmpfiles[outfile], O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0666);
+ if (f < 0)
+ sys_fatal("open stdout");
+ if (dup2(f, 1) < 0)
+ sys_fatal("dup2 stdout");
+ if (close(f) < 0)
+ sys_fatal("close stdout");
+ }
+ else if (dup2(save_stdout, 1) < 0)
+ sys_fatal("restore stdout");
+
+ /* run the program */
+ child_interrupted = 0;
+ prev_handler = signal(SIGINT, signal_catcher);
+ exit_status = spawnvp(P_WAIT, commands[i][0], commands[i]);
+ signal(SIGINT, prev_handler);
+ if (child_interrupted) {
+ c_error("%1: Interrupted", commands[i][0], (char *)0, (char *)0);
+ ret |= 2;
+ }
+ else if (exit_status < 0) {
+ c_error("couldn't exec %1: %2",
+ commands[i][0], strerror(errno), (char *)0);
+ ret |= 4;
+ }
+ if (exit_status != 0)
+ ret |= 1;
+ /* There's no sense to continue with the pipe if one of the
+ programs has ended abnormally, is there? */
+ if (ret != 0)
+ break;
+ /* swap temp files: make output of this program be input for the next */
+ infile = 1 - infile;
+ outfile = 1 - outfile;
+ }
+ if (dup2(save_stdin, 0) < 0)
+ sys_fatal("restore stdin");
+ unlink(tmpfiles[0]);
+ unlink(tmpfiles[1]);
+ return ret;
+}
+
+#endif /* not _WIN32 */
+
+#else /* not __MSDOS__, not _WIN32 */
+
+int run_pipeline(int ncommands, char ***commands, int no_pipe)
+{
+ int i;
+ int last_input = 0;
+ PID_T pids[MAX_COMMANDS];
+ int ret = 0;
+ int proc_count = ncommands;
+
+ for (i = 0; i < ncommands; i++) {
+ int pdes[2];
+ PID_T pid;
+
+ if ((i != ncommands - 1) && !no_pipe) {
+ if (pipe(pdes) < 0)
+ sys_fatal("pipe");
+ }
+ pid = fork();
+ if (pid < 0)
+ sys_fatal("fork");
+ if (pid == 0) {
+ /* child */
+ if (last_input != 0) {
+ if (close(0) < 0)
+ sys_fatal("close");
+ if (dup(last_input) < 0)
+ sys_fatal("dup");
+ if (close(last_input) < 0)
+ sys_fatal("close");
+ }
+ if ((i != ncommands - 1) && !no_pipe) {
+ if (close(1) < 0)
+ sys_fatal("close");
+ if (dup(pdes[1]) < 0)
+ sys_fatal("dup");
+ if (close(pdes[1]) < 0)
+ sys_fatal("close");
+ if (close(pdes[0]))
+ sys_fatal("close");
+ }
+ execvp(commands[i][0], commands[i]);
+ c_error("couldn't exec %1: %2",
+ commands[i][0], strerror(errno), (char *)0);
+ _exit(EXEC_FAILED_EXIT_STATUS);
+ }
+ /* in the parent */
+ if (last_input != 0) {
+ if (close(last_input) < 0)
+ sys_fatal("close");
+ }
+ if ((i != ncommands - 1) && !no_pipe) {
+ if (close(pdes[1]) < 0)
+ sys_fatal("close");
+ last_input = pdes[0];
+ }
+ pids[i] = pid;
+ }
+ while (proc_count > 0) {
+ int status;
+ PID_T pid = wait(&status);
+
+ if (pid < 0)
+ sys_fatal("wait");
+ for (i = 0; i < ncommands; i++)
+ if (pids[i] == pid) {
+ pids[i] = -1;
+ --proc_count;
+ if (WIFSIGNALED(status)) {
+ int sig = WTERMSIG(status);
+#ifdef SIGPIPE
+ if (sig == SIGPIPE) {
+ if (i == ncommands - 1) {
+ /* This works around a problem that occurred when using the
+ rerasterize action in gxditview. What seemed to be
+ happening (on SunOS 4.1.1) was that pclose() closed the
+ pipe and waited for groff, gtroff got a SIGPIPE, but
+ gpic blocked writing to gtroff, and so groff blocked
+ waiting for gpic and gxditview blocked waiting for
+ groff. I don't understand why gpic wasn't getting a
+ SIGPIPE. */
+ int j;
+
+ for (j = 0; j < ncommands; j++)
+ if (pids[j] > 0)
+ (void)kill(pids[j], SIGPIPE);
+ }
+ }
+ else
+#endif /* SIGPIPE */
+ {
+ c_error("%1: %2%3",
+ commands[i][0],
+ xstrsignal(sig),
+ WCOREDUMP(status) ? " (core dumped)" : "");
+ ret |= 2;
+ }
+ }
+ else if (WIFEXITED(status)) {
+ int exit_status = WEXITSTATUS(status);
+
+ if (exit_status == EXEC_FAILED_EXIT_STATUS)
+ ret |= 4;
+ else if (exit_status != 0)
+ ret |= 1;
+ }
+ else
+ c_error("unexpected status %1", i_to_a(status), (char *)0,
+ (char *)0);
+ break;
+ }
+ }
+ return ret;
+}
+
+#endif /* not __MSDOS__, not _WIN32 */
+
+static void sys_fatal(const char *s)
+{
+ c_fatal("%1: %2", s, strerror(errno), (char *)0);
+}
+
+static const char *xstrsignal(int n)
+{
+ static char buf[sizeof("Signal ") + 1 + sizeof(int) * 3];
+
+#ifdef NSIG
+#if HAVE_DECL_STRSIGNAL
+ if (n >= 0 && n < NSIG && strsignal(n) != 0)
+ return strsignal(n);
+#else
+#if HAVE_DECL_SYS_SIGLIST
+ if (n >= 0 && n < NSIG && sys_siglist[n] != 0)
+ return sys_siglist[n];
+#endif /* HAVE_DECL_SYS_SIGLIST */
+#endif /* HAVE_DECL_STRSIGNAL */
+#endif /* NSIG */
+ sprintf(buf, "Signal %d", n);
+ return buf;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/roff/groff/pipeline.h b/src/roff/groff/pipeline.h
new file mode 100644
index 0000000..17c02a6
--- /dev/null
+++ b/src/roff/groff/pipeline.h
@@ -0,0 +1,30 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef __cplusplus
+extern "C" {
+ int run_pipeline(int, char ***, int);
+}
+#endif
+
+/* run_pipeline can handle at most this many commands,
+ see the const numbers in groff.cpp */
+#define MAX_COMMANDS 15
+
+/* Children exit with this status if execvp fails. */
+#define EXEC_FAILED_EXIT_STATUS 0xff
diff --git a/src/roff/groff/tests/ab_works.sh b/src/roff/groff/tests/ab_works.sh
new file mode 100755
index 0000000..b353837
--- /dev/null
+++ b/src/roff/groff/tests/ab_works.sh
@@ -0,0 +1,46 @@
+#!/bin/sh
+#
+# Copyright (C) 2021-2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Verify exit status and regression-test Savannah #60782.
+#
+# We don't test the X11 devices because groff launches an X client,
+# which has to be killed. Using "-z" to avoid this masks the bug.
+
+# Keep preconv from being run.
+unset GROFF_ENCODING
+
+for d in ascii cp1047 dvi html latin1 lbp lj4 pdf ps utf8
+do
+ echo "verifying exit status of .ab request using $d device" >&2
+ printf '.ab\n' | "$groff" -Z -T$d
+ test $? -eq 1 || exit 1
+done
+
+echo "verifying empty output of .ab request with no arguments" >&2
+OUT=$(printf '.ab\n' | "$groff" -Z -Tascii 2>&1)
+test "$OUT" = "" || exit 1
+
+echo "verifying that arguments to .ab request go to stderr" >&2
+OUT=$(printf '.ab foo\n' | "$groff" -Z -Tascii 2>&1 > /dev/null)
+test "$OUT" = "foo" || exit 1
+
+# vim:set autoindent expandtab shiftwidth=2 tabstop=2 textwidth=72:
diff --git a/src/roff/groff/tests/adjustment_works.sh b/src/roff/groff/tests/adjustment_works.sh
new file mode 100755
index 0000000..e4cd65d
--- /dev/null
+++ b/src/roff/groff/tests/adjustment_works.sh
@@ -0,0 +1,92 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+set -e
+
+DOC='.pl 1v
+.ll 9n
+foo bar\p
+.na
+foo bar\p
+.ad l
+foo bar\p
+.na
+foo bar\p
+.ad b
+foo bar\p
+.na
+foo bar\p
+.ad c
+foo bar\p
+.na
+foo bar\p
+.ad r
+foo bar\p
+.na
+foo bar\p
+.ad
+foo bar\p
+.ad b
+.ad 100
+foo bar\p'
+
+OUTPUT=$(echo "$DOC" | "$groff" -Tascii)
+B='foo bar' # 3 spaces
+L='foo bar' # left or off
+C=' foo bar' # trailing space truncated
+R=' foo bar' # 2 leading spaces
+
+echo "verifying default adjustment mode 'b'" >&2
+echo "$OUTPUT" | sed -n '1p' | grep -Fqx "$B"
+
+echo "verifying that .na works" >&2
+echo "$OUTPUT" | sed -n '2p' | grep -Fqx "$L"
+
+echo "verifying adjustment mode 'l'" >&2
+echo "$OUTPUT" | sed -n '3p' | grep -Fqx "$L"
+
+echo "verifying that .na works after '.ad l'" >&2
+echo "$OUTPUT" | sed -n '4p' | grep -Fqx "$L"
+
+echo "verifying adjustment mode 'b'" >&2
+echo "$OUTPUT" | sed -n '5p' | grep -Fqx "$B"
+
+echo "verifying that .na works after '.ad b'" >&2
+echo "$OUTPUT" | sed -n '6p' | grep -Fqx "$L"
+
+echo "verifying adjustment mode 'c'" >&2
+echo "$OUTPUT" | sed -n '7p' | grep -Fqx "$C"
+
+echo "verifying that .na works after '.ad c'" >&2
+echo "$OUTPUT" | sed -n '8p' | grep -Fqx "$L"
+
+echo "verifying adjustment mode 'r'" >&2
+echo "$OUTPUT" | sed -n '9p' | grep -Fqx "$R"
+
+echo "verifying that .na works after '.ad r'" >&2
+echo "$OUTPUT" | sed -n '10p' | grep -Fqx "$L"
+
+echo "verifying that '.ad' restores previous adjustment mode" >&2
+echo "$OUTPUT" | sed -n '11p' | grep -Fqx "$R"
+
+echo "verifying that out-of-range adjustment mode 100 is ignored" >&2
+echo "$OUTPUT" | sed -n '12p' | grep -Fqx "$B"
diff --git a/src/roff/groff/tests/artifacts/HONEYPOT b/src/roff/groff/tests/artifacts/HONEYPOT
new file mode 100644
index 0000000..51a57dd
--- /dev/null
+++ b/src/roff/groff/tests/artifacts/HONEYPOT
@@ -0,0 +1,15 @@
+name HONEYPOT
+spacewidth 24
+charset
+a 0 0 77
+b 0 0 79
+d 0 0 76
+e 0 0 82
+i 0 0 105
+l 0 0 65
+m 0 0 109
+o 0 0 86
+r 0 0 73
+s 0 0 115
+w 0 0 69
+y 0 0 121
diff --git a/src/roff/groff/tests/artifacts/devascii/README b/src/roff/groff/tests/artifacts/devascii/README
new file mode 100644
index 0000000..d89ba03
--- /dev/null
+++ b/src/roff/groff/tests/artifacts/devascii/README
@@ -0,0 +1 @@
+This directory is intentionally empty (apart from this file).
diff --git a/src/roff/groff/tests/break_zero-length_output_line_sanely.sh b/src/roff/groff/tests/break_zero-length_output_line_sanely.sh
new file mode 100755
index 0000000..8d6deb0
--- /dev/null
+++ b/src/roff/groff/tests/break_zero-length_output_line_sanely.sh
@@ -0,0 +1,43 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+set -e
+
+# Do not core dump when attempting to distribute a space amount of zero
+# if someone sets the line length to zero. See Savannah #61089.
+# Reproducer courtesy of John Gardner.
+
+INPUT='.de _
+. na
+. nh
+. ll 0
+. di A
+\&\\$1
+. di
+. br
+..
+._ " XYZ"
+.A
+'
+
+OUTPUT=$(printf "%s" "$INPUT" | "$groff" -Tascii)
+echo "$OUTPUT" | grep -qx XYZ
diff --git a/src/roff/groff/tests/device_control_escapes_express_basic_latin.sh b/src/roff/groff/tests/device_control_escapes_express_basic_latin.sh
new file mode 100755
index 0000000..6418913
--- /dev/null
+++ b/src/roff/groff/tests/device_control_escapes_express_basic_latin.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+fail=
+
+# Confirm translation of a groff special character escape sequence to a
+# basic Latin character when used in a device control escape sequence.
+#
+# $1 is the special character escape _without_ the leading backslash.
+# $2 is the expected output character _shell-quoted as necessary_.
+# $3 is a human-readable glyph description for the test log.
+# $4 is the groff -T device name under test.
+check_char () {
+ sc=$1
+ output=$2
+ description=$3
+ device=$4
+ printf 'checking conversion of \\%s to %s (%s) on device %s' \
+ "$sc" "$output" "$description" "$device" >&2
+ if ! printf '\\X#\\%s %s#\n' "$sc" "$desc" | "$groff" -T$device -Z \
+ | grep -Fqx 'x X '$output' '
+ then
+ printf '...FAILED' >&2
+ fail=yes
+ fi
+ printf '\n' >&2
+}
+
+for device in utf8 html
+do
+ check_char - - "minus sign" $device
+ check_char '[aq]' "'" "neutral apostrophe" $device
+ check_char '[dq]' '"' "double quote" $device
+ check_char '[ga]' '`' "grave accent" $device
+ check_char '[ha]' ^ "caret/hat" $device
+ check_char '[rs]' '\' "reverse solidus/backslash" $device
+ check_char '[ti]' '~' "tilde" $device
+done
+
+test -z "$fail" || exit 1
+
+# vim:set autoindent expandtab shiftwidth=2 tabstop=2 textwidth=72:
diff --git a/src/roff/groff/tests/do_not_loop_infinitely_when_breaking_cjk.sh b/src/roff/groff/tests/do_not_loop_infinitely_when_breaking_cjk.sh
new file mode 100755
index 0000000..4f4a12a
--- /dev/null
+++ b/src/roff/groff/tests/do_not_loop_infinitely_when_breaking_cjk.sh
@@ -0,0 +1,29 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+set -e
+
+DOC='ン
+ã‚ã‚AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+'
+
+echo "$DOC" | "$groff" -D utf8 -Tutf8 -mja
diff --git a/src/roff/groff/tests/dot-cp_register_works.sh b/src/roff/groff/tests/dot-cp_register_works.sh
new file mode 100755
index 0000000..ffbb402
--- /dev/null
+++ b/src/roff/groff/tests/dot-cp_register_works.sh
@@ -0,0 +1,48 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+DOC='.pl 1v
+A
+.do if 1 \n[.cp] \" Get initial compatibility state (depends on -C).
+B
+.do if 1 \n[.cp] \" Did observing the state change it?
+.cp 1
+C
+.do if 1 \n[.cp] \" Saved compatibility state should be 1 now.
+.cp 0
+D
+.do if 1 \n[.cp] \" Verify 1->0 transition.
+.cp 1
+E
+.do if 1 \n[.cp] \" Verify 0->1 transition.
+.cp 0
+F
+.if !\n[.C] \n[.cp] \" Outside of .do context, should return -1.
+'
+
+set -e
+
+printf "%s" "$DOC" | "$groff" -Tascii \
+ | grep -x "A 0 B 0 C 1 D 0 E 1 F -1"
+
+printf "%s" "$DOC" | "$groff" -C -Tascii \
+ | grep -x "A 1 B 1 C 1 D 0 E 1 F -1"
diff --git a/src/roff/groff/tests/dot-nm_register_works.sh b/src/roff/groff/tests/dot-nm_register_works.sh
new file mode 100755
index 0000000..809bbd3
--- /dev/null
+++ b/src/roff/groff/tests/dot-nm_register_works.sh
@@ -0,0 +1,40 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+DOC='\
+.nf
+foo (\n[.nm])
+.nm 1
+bar (\n[.nm])
+.nn
+baz (\n[.nm])
+.nm
+qux (\n[.nm])
+.fi
+'
+
+set -e
+
+printf '%s' "$DOC" | "$groff" -T utf8 | grep -Fqx 'foo (0)'
+printf '%s' "$DOC" | "$groff" -T utf8 | grep -Fqx ' 1 bar (1)'
+printf '%s' "$DOC" | "$groff" -T utf8 | grep -Fqx 'baz (1)'
+printf '%s' "$DOC" | "$groff" -T utf8 | grep -Fqx 'qux (0)'
diff --git a/src/roff/groff/tests/dot-nn_register_works.sh b/src/roff/groff/tests/dot-nn_register_works.sh
new file mode 100755
index 0000000..0998cb0
--- /dev/null
+++ b/src/roff/groff/tests/dot-nn_register_works.sh
@@ -0,0 +1,77 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Unit test .nn register.
+
+fail=
+
+wail () {
+ echo ...FAILED >&2
+ fail=YES
+}
+
+input='.ec @
+.de is-numbered
+. nop This line
+. ie (@@n[.nm] & (1-@@n[.nn])) IS
+. el ISN'"'"'T
+. nop numbered.
+. br
+..
+Test line numbering.
+.is-numbered
+.nm 1
+.nn 2
+.is-numbered
+.is-numbered
+.is-numbered
+.nm
+.is-numbered
+.pl @n[nl]u'
+
+# Apply line numbers to the output externally for easy grepping.
+output=$(echo "$input" | $groff -Tascii | nl)
+echo "$output"
+
+echo "verifying that line 1 isn't numbered" >&2
+echo "$output" | \
+ grep -Eq "[[:space:]]+1[[:space:]]+Test line numbering\." || wail
+
+echo "verifying that line 2 isn't numbered" >&2
+echo "$output" | \
+ grep -Eq "[[:space:]]+2[[:space:]]+This line ISN'T" || wail
+
+echo "verifying that line 3 isn't numbered" >&2
+echo "$output" | \
+ grep -Eq "[[:space:]]+3[[:space:]]+This line ISN'T" || wail
+
+echo "verifying that line 4 is numbered" >&2
+echo "$output" | \
+ grep -Eq "[[:space:]]+4[[:space:]]+1 +This line IS numbered" || wail
+
+echo "verifying that line 5 isn't numbered" >&2
+echo "$output" | \
+ grep -Eq "[[:space:]]+5[[:space:]]+This line ISN'T" || wail
+
+test -z "$fail"
+
+# vim:set autoindent expandtab shiftwidth=2 tabstop=2 textwidth=72:
diff --git a/src/roff/groff/tests/evc_produces_no_output_if_invalid.sh b/src/roff/groff/tests/evc_produces_no_output_if_invalid.sh
new file mode 100755
index 0000000..47b0d1d
--- /dev/null
+++ b/src/roff/groff/tests/evc_produces_no_output_if_invalid.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #60913.
+
+test -z "$(printf '.evc foo bar\n' | "$groff")"
diff --git a/src/roff/groff/tests/fp_should_not_traverse_directories.sh b/src/roff/groff/tests/fp_should_not_traverse_directories.sh
new file mode 100755
index 0000000..f60f42f
--- /dev/null
+++ b/src/roff/groff/tests/fp_should_not_traverse_directories.sh
@@ -0,0 +1,63 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #61424.
+#
+# The `fp` request should not be able to access font description files
+# outside of the device and font description search path (configurable
+# with the -F option and GROFF_FONT_PATH environment variable).
+#
+# An absolute file name _won't_ work: it gets dev\*[.T]/ stuck on the
+# front of it by libgroff.
+#
+# Locate directory containing our test artifacts.
+artifact_dir=
+base=src/roff/groff/tests
+device=artifacts
+
+for buildroot in . .. ../..
+do
+ d=$buildroot/$base/$device
+ if [ -d "$d" ]
+ then
+ artifact_dir=$d
+ break
+ fi
+done
+
+# If we can't find it, we can't test.
+test -z "$artifact_dir" && exit 77 # skip
+
+input='.fp 5 ../HONEYPOT
+.ft 5
+word
+.fp 5 HONEYPOT ../HONEYPOT
+.ft HONEYPOT
+.br
+my word is able
+.pl \n[nl]u'
+
+output=$(printf "%s" "$input" | "$groff" -b -ww -F "$artifact_dir" \
+ -Tascii)
+echo "$output" | grep -Fx word
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/roff/groff/tests/handle_special_input_code_points.sh b/src/roff/groff/tests/handle_special_input_code_points.sh
new file mode 100755
index 0000000..c996150
--- /dev/null
+++ b/src/roff/groff/tests/handle_special_input_code_points.sh
@@ -0,0 +1,47 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #58962.
+
+# Keep preconv from being run.
+unset GROFF_ENCODING
+
+input='.if " "\~" .tm input no-break space matches \\~
+.if "­"\%" .tm input soft hyphen matches \\%'
+
+fail=
+
+wail () {
+ echo "...FAILED"
+ fail=yes
+}
+
+output=$(printf "%s\n" "$input" | "$groff" -Z 2>&1)
+echo "$output"
+
+printf "checking that input no-break space is mapped to \\~\n"
+echo "$output" | grep -qx 'input no-break space matches \\~' || wail
+
+printf "checking that input soft hyphen is mapped to \\%%\n"
+echo "$output" | grep -qx 'input soft hyphen matches \\%' || wail
+
+test -z "$fail"
diff --git a/src/roff/groff/tests/html_works_with_grn_and_eqn.sh b/src/roff/groff/tests/html_works_with_grn_and_eqn.sh
new file mode 100755
index 0000000..e070944
--- /dev/null
+++ b/src/roff/groff/tests/html_works_with_grn_and_eqn.sh
@@ -0,0 +1,46 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Keep this list of programs in sync with GROFF_CHECK_GROHTML_PROGRAMS
+# in m4/groff.m4.
+for cmd in pnmcrop pnmcut pnmtopng pnmtops psselect
+do
+ if ! command -v $cmd >/dev/null
+ then
+ echo "cannot locate '$cmd' command; skipping test" >&2
+ exit 77 # skip
+ fi
+done
+
+# Commit c71b4ef4aa provoked an infinite loop in post-grohtml with these
+# preprocessors.
+
+input='.EQ
+gsize 12
+delim $$
+.EN
+.pp
+.pp
+The faster clocks are $ PN $'
+
+output=$("$groff" -b -ww -Thtml -eg -me "$input")
+test -n "$output"
diff --git a/src/roff/groff/tests/initialization_is_quiet.sh b/src/roff/groff/tests/initialization_is_quiet.sh
new file mode 100755
index 0000000..38ac81f
--- /dev/null
+++ b/src/roff/groff/tests/initialization_is_quiet.sh
@@ -0,0 +1,59 @@
+#!/bin/sh
+#
+# Copyright (C) 2021-2023 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo ...FAILED >&2
+ fail=YES
+}
+
+# Regression-test Savannah #60874.
+#
+# groff should start up in any supported locale, in compatibility mode
+# or not, without producing diagnostics.
+
+# Keep preconv from being run.
+#
+# The "unset" in Solaris /usr/xpg4/bin/sh can actually fail.
+if ! unset GROFF_ENCODING
+then
+ echo "unable to clear environment; skipping" >&2
+ exit 77
+fi
+
+for compat in "" " -C"
+do
+ for locale in cs de en fr it ja sv zh
+ do
+ echo testing \"-m $locale$compat\" >&2
+ output=$("$groff" -ww -m $locale$compat -a </dev/null 2>/dev/null)
+ error=$("$groff" -ww -m $locale$compat -z </dev/null 2>&1)
+ test -n "$error" && echo "$error"
+ test -n "$output" && echo "$output"
+ test -n "$error$output" && wail
+ done
+done
+
+test -z "$fail"
+
+# vim:set autoindent expandtab shiftwidth=4 tabstop=4 textwidth=72:
diff --git a/src/roff/groff/tests/localization_works.sh b/src/roff/groff/tests/localization_works.sh
new file mode 100755
index 0000000..0585259
--- /dev/null
+++ b/src/roff/groff/tests/localization_works.sh
@@ -0,0 +1,61 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+set -e
+
+DOC='\*[locale]'
+
+echo "testing default localization (English)" >&2
+OUTPUT=$(echo "$DOC" | "$groff" -Tascii)
+echo "$OUTPUT" | grep -qx english
+
+echo "testing Czech localization" >&2
+OUTPUT=$(echo "$DOC" | "$groff" -Tascii -m cs)
+echo "$OUTPUT" | grep -qx czech
+
+echo "testing German localization" >&2
+OUTPUT=$(echo "$DOC" | "$groff" -Tascii -m de)
+echo "$OUTPUT" | grep -qx german
+
+echo "testing English localization" >&2
+OUTPUT=$(echo "$DOC" | "$groff" -Tascii -m en)
+echo "$OUTPUT" | grep -qx english
+
+echo "testing French localization" >&2
+OUTPUT=$(echo "$DOC" | "$groff" -Tascii -m fr)
+echo "$OUTPUT" | grep -qx french
+
+echo "testing Italian localization" >&2
+OUTPUT=$(echo "$DOC" | "$groff" -Tascii -m it)
+echo "$OUTPUT" | grep -qx italian
+
+echo "testing Japanese localization" >&2
+OUTPUT=$(echo "$DOC" | "$groff" -Tascii -m ja)
+echo "$OUTPUT" | grep -qx japanese
+
+echo "testing Swedish localization" >&2
+OUTPUT=$(echo "$DOC" | "$groff" -Tascii -m sv)
+echo "$OUTPUT" | grep -qx swedish
+
+echo "testing Chinese localization" >&2
+OUTPUT=$(echo "$DOC" | "$groff" -Tascii -m zh)
+echo "$OUTPUT" | grep -qx chinese
diff --git a/src/roff/groff/tests/msoquiet_works.sh b/src/roff/groff/tests/msoquiet_works.sh
new file mode 100755
index 0000000..80c085a
--- /dev/null
+++ b/src/roff/groff/tests/msoquiet_works.sh
@@ -0,0 +1,35 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+set -e
+
+# Keep preconv from being run.
+unset GROFF_ENCODING
+
+DOC='.msoquiet nonexistent'
+
+OUTPUT=$(echo "$DOC" | "$groff" -Tascii 2>&1)
+echo "$OUTPUT"
+
+echo "testing that .msoquiet of nonexistent file produces no warning" \
+ >&2
+test -z "$OUTPUT"
diff --git a/src/roff/groff/tests/on_latin1_device_oq_is_0x27.sh b/src/roff/groff/tests/on_latin1_device_oq_is_0x27.sh
new file mode 100755
index 0000000..b2c17bc
--- /dev/null
+++ b/src/roff/groff/tests/on_latin1_device_oq_is_0x27.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+#
+# Copyright (C) 2019-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# This test fails with some versions of GNU Bash, such as 3.2; the here
+# document nested within a command substitution confuses it.
+#
+# https://lists.gnu.org/archive/html/bug-bash/2017-02/msg00024.html
+
+expected="' = '"
+actual=$(printf '.pl 1v\n\\[oq] = '"'"'\n' | "$groff" -Tlatin1)
+test "$actual" = "$expected"
diff --git a/src/roff/groff/tests/output_driver_C_and_G_options_work.sh b/src/roff/groff/tests/output_driver_C_and_G_options_work.sh
new file mode 100755
index 0000000..2bb1cc3
--- /dev/null
+++ b/src/roff/groff/tests/output_driver_C_and_G_options_work.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Feed groff empty input documents and verify that expected comments
+# emerge from the output drivers.
+
+# Expect Creator: and CreationDate: comments.
+echo "testing presence of Creator: comment in HTML output" >&2
+echo | "$groff" -Thtml | grep -Fq '<!-- Creator:'
+
+echo "testing presence of CreationDate: comment in HTML output" >&2
+echo | "$groff" -Thtml | grep -Fq '<!-- CreationDate:'
+
+# Make sure the options are recognized so we can distinguish a match
+# failure. We can't use -Z or -z because they keep the output driver
+# from running at all.
+for OPT in -C -G
+do
+ if ! echo | "$groff" -Thtml -P$OPT > /dev/null
+ then
+ echo "option $OPT not recognized!" >&2
+ exit 2
+ fi
+done
+
+# Now shut them off.
+echo "testing absence of Creator: comment in HTML output" >&2
+! echo | "$groff" -Thtml -P-G | grep -Fq '<!-- Creator:'
+
+echo "testing absence of CreationDate: comment in HTML output" >&2
+! echo | "$groff" -Thtml -P-C | grep -Fq '<!-- CreationDate:'
diff --git a/src/roff/groff/tests/recognize_end_of_sentence.sh b/src/roff/groff/tests/recognize_end_of_sentence.sh
new file mode 100755
index 0000000..aa1e4dc
--- /dev/null
+++ b/src/roff/groff/tests/recognize_end_of_sentence.sh
@@ -0,0 +1,33 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Verify that the characters trailing the period are all transparent for
+# purposes of end-of-sentence recognition. We use UTF-8 so we won't get
+# warnings about \[dg] and \[dd] missing from other encodings.
+#
+# Also confirm that we get _two_ spaces after the end of a sentence.
+
+"$groff" -Tutf8 <<EOF | grep -qE 'Eat\.[^ ]+ Drink\.'
+.pl 1v
+Eat."')]*\[dg]\[dd]\[rq]\[cq]
+Drink.
+EOF
diff --git a/src/roff/groff/tests/regression_savannah_56555.sh b/src/roff/groff/tests/regression_savannah_56555.sh
new file mode 100755
index 0000000..3d13f16
--- /dev/null
+++ b/src/roff/groff/tests/regression_savannah_56555.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+#
+# Copyright (C) 2019-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Check for segfault if we try to write a glyph before setting up.
+# Savannah #56555.
+"$groff" >/dev/null <<EOF
+\!ta
+EOF
diff --git a/src/roff/groff/tests/regression_savannah_58153.sh b/src/roff/groff/tests/regression_savannah_58153.sh
new file mode 100755
index 0000000..25771fd
--- /dev/null
+++ b/src/roff/groff/tests/regression_savannah_58153.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+#
+# Copyright (C) 2020-2023 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Ensure that we get backtrace output across file and pipe boundaries.
+# Savannah #58153.
+OUT=$("$groff" -b -ww -U 2>&1 >/dev/null <<EOF
+.ec @
+.pso printf '@s[-20]'
+EOF
+)
+
+set -e
+
+printf "%s\n" "$OUT" | grep -qw 'backtrace: pipe'
+printf "%s\n" "$OUT" | grep -qw 'backtrace: file'
diff --git a/src/roff/groff/tests/regression_savannah_58162.sh b/src/roff/groff/tests/regression_savannah_58162.sh
new file mode 100755
index 0000000..d744e99
--- /dev/null
+++ b/src/roff/groff/tests/regression_savannah_58162.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+set -e
+
+# Compatibility mode should not get shut off by macro file inclusion.
+printf '.ds FOO FAIL\n\\*[FOO]' | "$groff" -C -Tutf8 | grep -Fx 'FOO]'
diff --git a/src/roff/groff/tests/regression_savannah_58337.sh b/src/roff/groff/tests/regression_savannah_58337.sh
new file mode 100755
index 0000000..7928651
--- /dev/null
+++ b/src/roff/groff/tests/regression_savannah_58337.sh
@@ -0,0 +1,32 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+set -e
+
+# groff should ignore negative inter-word and inter-sentence space
+# sizes. And certainly not fail an assertion. Savannah #58337.
+"$groff" -Tascii <<EOF | grep -Fqx 'A B. C.'
+.pl 1v
+.ss -1 -1
+A B.
+C.
+EOF
diff --git a/src/roff/groff/tests/regression_savannah_59202.sh b/src/roff/groff/tests/regression_savannah_59202.sh
new file mode 100755
index 0000000..6d8bdc1
--- /dev/null
+++ b/src/roff/groff/tests/regression_savannah_59202.sh
@@ -0,0 +1,29 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# troff should not segfault when its standard output is closed.
+# Savannah #59202.
+
+# If a core file already exists, it should be dealt with; skip test.
+test -e core && exit 77
+echo | "$groff" >&-
+! test -e core
diff --git a/src/roff/groff/tests/smoke-test_html_device.sh b/src/roff/groff/tests/smoke-test_html_device.sh
new file mode 100755
index 0000000..877fc28
--- /dev/null
+++ b/src/roff/groff/tests/smoke-test_html_device.sh
@@ -0,0 +1,90 @@
+#!/bin/sh
+#
+# Copyright (C) 2020, 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Keep this list of programs in sync with GROFF_CHECK_GROHTML_PROGRAMS
+# in m4/groff.m4.
+for cmd in pnmcrop pnmcut pnmtopng pnmtops psselect
+do
+ if ! command -v $cmd >/dev/null
+ then
+ echo "cannot locate '$cmd' command; skipping test" >&2
+ exit 77 # skip
+ fi
+done
+
+fail=
+
+wail () {
+ echo ...FAILED >&2
+ fail=yes
+}
+
+cleanup () {
+ rm -f grohtml-[0-9]*-[12].png
+ trap - HUP INT QUIT TERM
+}
+
+trap 'trap "" HUP INT QUIT TERM; cleanup; kill -s INT $$' \
+ HUP INT QUIT TERM
+
+input='.TS
+L.
+foobar
+.TE'
+
+# Inline images are named grohtml-$$-<image sequence number>.png.
+
+echo "checking production of inline image for tbl(1) table" >&2
+output=$(echo "$input" | "$groff" -t -Thtml)
+echo "$output" | grep -q '<img src="grohtml-[0-9]\+-1.png"' || wail
+
+input='.EQ
+x sup 2 + y sup 2 = z sup 2
+.EN'
+
+echo "checking production of inline image for eqn(1) equation" >&2
+output=$(echo "$input" | "$groff" -e -Thtml)
+echo "$output" | grep -q '<img src="grohtml-[0-9]\+-2.png"' || wail
+
+cleanup
+
+# We can't run remaining tests if the environment doesn't support UTF-8.
+test "$(locale charmap)" = UTF-8 || exit 77 # skip
+
+# Check two forms of character transformation.
+#
+# dash's built-in printf doesn't support \x or \u escapes, so likely
+# other shells don't either, and expecting one that does to be in the
+# $PATH seems optimistic. So use UTF-8 octal bytes directly.
+echo "checking -k -Thtml" >&2
+printf '\303\241' | "$groff" -k -Thtml | grep -qx '<p>&aacute;</p>' \
+ || wail
+
+# We test compatibility-mode HTML output somewhat differently since
+# preconv only emits groffish \[uXXXX] escapes for non-ASCII codepoints.
+echo "checking -C -k -Thtml" >&2
+printf "\('a" | "$groff" -C -k -Thtml | grep -qx '<p>&aacute;</p>' \
+ || wail
+
+test -z "$fail"
+
+# vim:set autoindent expandtab shiftwidth=2 tabstop=2 textwidth=72:
diff --git a/src/roff/groff/tests/some_escapes_accept_newline_delimiters.sh b/src/roff/groff/tests/some_escapes_accept_newline_delimiters.sh
new file mode 100755
index 0000000..96be055
--- /dev/null
+++ b/src/roff/groff/tests/some_escapes_accept_newline_delimiters.sh
@@ -0,0 +1,128 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ fail=yes
+}
+
+# Regression-test Savannah #63011.
+#
+# A handful of escape sequences bizarrely accept newlines as argument
+# delimiters. Don't throw diagnostics if they are used.
+
+input="\A
+ABC
+D
+.pl \n(nlu"
+
+echo "checking that newline is accepted as delimiter to 'A' escape" >&2
+error=$(printf "%s\n" "$input" | "$groff" -Tascii -ww -z 2>&1)
+test -z "$error" || wail
+
+echo "checking correct handling of newline delimiter to 'A' escape" >&2
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -ww)
+test "$output" = "1 D" || wail
+
+input=".sp
+\b
+ABC
+D
+.pl \n(nlu"
+
+echo "checking that newline is accepted as delimiter to 'b' escape" >&2
+error=$(printf "%s\n" "$input" | "$groff" -Tascii -ww -z 2>&1)
+test -z "$error" || wail
+
+echo "checking correct handling of newline delimiter to 'b' escape" >&2
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -ww)
+echo "$output" | grep -Fqx "B D" || wail
+
+input="\o
+ABC
+D
+.pl \n(nlu"
+
+echo "checking that newline is accepted as delimiter to 'o' escape" >&2
+error=$(printf "%s\n" "$input" | "$groff" -Tascii -ww -z 2>&1)
+test -z "$error" || wail
+
+echo "checking correct handling of newline delimiter to 'o' escape" >&2
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -ww \
+ | LC_ALL=C od -t c)
+# 7 spaces between C and D.
+printf "%s\n" "$output" \
+ | grep -Eqx '0000000 +A +\\b +B +\\b +C D +\\n *' || wail
+
+input="\w
+ABC
+D
+.pl \n(nlu"
+
+echo "checking that newline is accepted as delimiter to 'w' escape" >&2
+error=$(printf "%s\n" "$input" | "$groff" -Tascii -ww -z 2>&1)
+test -z "$error" || wail
+
+echo "checking correct handling of newline delimiter to 'w' escape" >&2
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -ww)
+test "$output" = "72 D" || wail
+
+input="\X
+tty: link http://example.com
+D
+.pl \n(nlu"
+
+echo "checking that newline is accepted as delimiter to 'X' escape" >&2
+error=$(printf "%s\n" "$input" | "$groff" -Tascii -ww -z 2>&1)
+test -z "$error" || wail
+
+echo "checking correct handling of newline delimiter to 'X' escape" >&2
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -ww -P -c)
+test "$output" = ' D' || wail
+
+input="\Z
+ABC
+D
+.pl \n(nlu"
+
+echo "checking that newline is accepted as delimiter to 'Z' escape" >&2
+error=$(printf "%s\n" "$input" | "$groff" -Tascii -ww -z 2>&1)
+test -z "$error" || wail
+
+# This looks really weird but is consistent. A newline used as a
+# delimiter still gets interpreted as an input line ending. What we see
+# here is: 'ABC' is formatted, the drawing position is reset to the
+# beginning of the line, a word space (from filling, overstriking 'A')
+# goes on the output, followed by 'D', so it appears as 'ADC'.
+#
+# `printf '\\Z@ABC@\nD\n'` produces the same output.
+echo "checking correct handling of newline delimiter to 'Z' escape" >&2
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -ww \
+ | LC_ALL=C od -t c)
+printf "%s\n" "$output" | grep -Eqx '0000000 +A +B +\\b +D +C +\\n *' \
+ || wail
+
+test -z "$fail"
+
+# vim:set autoindent expandtab shiftwidth=2 tabstop=2 textwidth=72:
diff --git a/src/roff/groff/tests/soquiet_works.sh b/src/roff/groff/tests/soquiet_works.sh
new file mode 100755
index 0000000..e2ea286
--- /dev/null
+++ b/src/roff/groff/tests/soquiet_works.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+set -e
+
+# Keep preconv from being run.
+unset GROFF_ENCODING
+
+DOC='.soquiet nonexistent'
+
+OUTPUT=$(echo "$DOC" | "$groff" -Tascii 2>&1)
+echo "$OUTPUT"
+
+echo "testing that .soquiet of nonexistent file produces no error" >&2
+test -z "$OUTPUT"
diff --git a/src/roff/groff/tests/string_case_xform_errors.sh b/src/roff/groff/tests/string_case_xform_errors.sh
new file mode 100755
index 0000000..a16d763
--- /dev/null
+++ b/src/roff/groff/tests/string_case_xform_errors.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+#
+# Copyright (C) 2019-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+expected="troff:<standard input>:1: error: cannot apply string case transformation to a request ('br')"
+
+actual=$("$groff" -Tutf8 2>&1 <<EOF
+.stringdown br
+EOF
+)
+
+echo "$actual" | grep -qx "$expected"
diff --git a/src/roff/groff/tests/string_case_xform_requests.sh b/src/roff/groff/tests/string_case_xform_requests.sh
new file mode 100755
index 0000000..a9b8fa6
--- /dev/null
+++ b/src/roff/groff/tests/string_case_xform_requests.sh
@@ -0,0 +1,32 @@
+#!/bin/sh
+#
+# Copyright (C) 2019-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+input=".pl 1v
+.ds resume R\\['e]sum\\['e]\\\"
+\\*[resume]
+.stringdown resume
+\\*[resume]
+.stringup resume
+\\*[resume]"
+expected="Résumé résumé RÉSUMÉ"
+actual=$(echo "$input" | "$groff" -Tutf8)
+test "$actual" = "$expected"
diff --git a/src/roff/groff/tests/string_case_xform_unicode_escape.sh b/src/roff/groff/tests/string_case_xform_unicode_escape.sh
new file mode 100755
index 0000000..529e0c3
--- /dev/null
+++ b/src/roff/groff/tests/string_case_xform_unicode_escape.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+#
+# Copyright (C) 2019-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# The following is what we expect in the future when we support Unicode
+# case transformations.
+expected="attaché ATTACHÉ"
+
+# For now, we expect problems like this:
+# troff: backtrace: '<standard input>':4: string 'attache'
+# troff: backtrace: file '<standard input>':5
+# troff: <standard input>:5: warning: can't find special character
+# 'U0065_0301'
+
+actual=$("$groff" -Tutf8 2>&1 <<EOF
+.pl 1v
+.ds attache attach\\[u0065_0301]\\\"
+\\*[attache]
+.stringup attache
+\\*[attache]
+EOF
+)
+
+echo "$actual" | grep -Fqx "$expected"
diff --git a/src/roff/groff/tests/substring_works.sh b/src/roff/groff/tests/substring_works.sh
new file mode 100755
index 0000000..a57d579
--- /dev/null
+++ b/src/roff/groff/tests/substring_works.sh
@@ -0,0 +1,120 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# This test is based on a contribution by Jim Avera; see
+# <https://savannah.gnu.org/bugs/?60802>.
+
+"$groff" -z -ww <<'EOF'
+.
+.nr debug 1
+.de debugmsg
+. if \\n[debug] .tm \\$*
+..
+.de errormsg
+. tm ERROR: \\$*
+. nr nerrors (\\n[nerrors]+1)
+..
+.nr nerrors 0
+.
+.\" .substring xx n1 [n2]
+.\" Replace contents of string named xx with the substring bounded by
+.\" zero-based indices indices n1 and n2. Negative indices count
+.\" backwards from the end of the string. If omitted, n2 is `-1`.
+.\"
+.\" If n1 > n2, n1 and n2 are swapped. If n1 equals or exceeds the
+.\" string length, it is set to `-1`.
+.\"
+.\" NOT YET IMPLEMENTED:
+.\" If n1 > n2, or if n1 equals or exceeds the string length, then
+.\" any contents of xx are replaced with the empty string.
+.\"
+.de jtest \" input_string n1 n2 expected_result
+. if \\n[.$]<4 .ab jtest: expected at least 4 arguments, got \\n[.$]
+. ds t*input "\\$1
+. ds t*n1 \\$2
+. ds t*n2 \\$3
+. ds t*expected "\\$4
+. shift 4
+. ds t*comment "\\$*
+.
+. ds t*str "\\*[t*input]
+. ie '\\*[t*n2]'' .substring t*str \\*[t*n1]
+. el .substring t*str \\*[t*n1] \\*[t*n2]
+. ie '\\*[t*str]'\\*[t*expected]' \{\
+. debugmsg .substring '\\*[t*input]' \\*[t*n1] \\*[t*n2] -> \
+'\\*[t*str]' (OK) \\*[t*comment]
+. \}
+. el \{\
+. errormsg .substring '\\*[t*input]' \\*[t*n1] \\*[t*n2] yielded \
+'\\*[t*str]', EXPECTED '\\*[t*expected]' \\*[t*comment]
+. \}
+..
+.
+.debugmsg --- Pick a single character from non-empty ---
+.jtest "abc" 0 0 "a"
+.jtest "abc" 1 1 "b"
+.jtest "abc" 2 2 "c"
+.
+.debugmsg --- Pick multiple characters from non-empty ---
+.jtest "abcd" 0 1 "ab"
+.jtest "abcd" 1 1 "b"
+.jtest "abcd" 0 3 "abcd"
+.jtest "abcd" 0 -1 "abcd"
+.jtest "abcd" 0 "" "abcd"
+.jtest "abcd" 1 3 "bcd"
+.jtest "abcd" 2 3 "cd"
+.jtest "abcd" 3 3 "d"
+.
+.debugmsg --- Omit n2 with non-empty input and non-empty result ---
+.jtest "abc" 0 "" "abc"
+.jtest "abc" 1 "" "bc"
+.jtest "abc" 2 "" "c"
+.jtest "a" 0 "" "a"
+.
+.\"debugmsg --- Specify empty substring with n2==(n1-1) ---
+.\"jtest "abcd" 3 2 ""
+.\"jtest "abcd" 2 1 ""
+.\"jtest "abcd" 1 0 ""
+.debugmsg --- Pick multiple characters from non-empty using inverted \
+range ---
+.jtest "abcd" 3 2 "cd"
+.jtest "abcd" 2 1 "bc"
+.jtest "abcd" 1 0 "ab"
+.
+.\"debugmsg --- Specify empty substring with n1==length and n2 omitted ---
+.\"jtest "abcd" 4 "" ""
+.\"jtest "abc" 3 "" ""
+.\"jtest "ab" 2 "" ""
+.\"jtest "a" 1 "" ""
+.\"jtest "" 0 "" ""
+.debugmsg --- Pick single character using out-of-bounds start index \
+(unless string empty) ---
+.jtest "abcd" 4 "" "d"
+.jtest "abc" 3 "" "c"
+.jtest "ab" 2 "" "b"
+.jtest "a" 1 "" "a"
+.jtest "" 0 "" ""
+.jtest "" 0 -1 ""
+.jtest "" 0 -2 ""
+.
+.if \n[nerrors] .ab Aborting, got \n[nerrors] errors.
+EOF
diff --git a/src/roff/groff/tests/use_point_size_escape_with_single_digit_arg.sh b/src/roff/groff/tests/use_point_size_escape_with_single_digit_arg.sh
new file mode 100755
index 0000000..0d1cacd
--- /dev/null
+++ b/src/roff/groff/tests/use_point_size_escape_with_single_digit_arg.sh
@@ -0,0 +1,44 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+export GROFF_TYPESETTER=
+
+# The vertical space is so that the 36-point 'A' won't be truncated by
+# the top of the page. That could be confusing and misleading to anyone
+# who ever has to troubleshoot this test case.
+DOC=".vs 10v
+\s36A"
+
+set -e
+
+# Verify that the idiosyncratic behavior of \sN is supported in
+# compatibility mode...
+echo "testing \s36A in compatibility mode (36-point 'A')" >&2
+echo "$DOC" | "$groff" -C -Z | grep -qx 's36000'
+
+# ...and not in regular mode.
+echo "testing \s36A in non-compatibility mode (3-point '6A')" >&2
+echo "$DOC" | "$groff" -Z | grep -qx 's3000'
+
+# Check that we get a diagnostic when relying on the ambiguous form.
+echo "testing for diagnostic on \s36 in compatibility mode" >&2
+echo "$DOC" | "$groff" -C -Z 2>&1 >/dev/null \
+ | grep -q 'ambiguous type size in escape sequence'
diff --git a/src/roff/nroff/nroff.1.man b/src/roff/nroff/nroff.1.man
new file mode 100644
index 0000000..cdefee1
--- /dev/null
+++ b/src/roff/nroff/nroff.1.man
@@ -0,0 +1,358 @@
+.TH @g@nroff @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+@g@nroff \- format documents with
+.I groff
+for TTY (terminal) devices
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2021 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_nroff_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY @g@nroff
+.RB [ \-bcCEhikpRStUVz ]
+.RB [ \-d\~\c
+.IR ctext ]
+.RB [ \-d\~\c
+.IB string =\c
+.IR text ]
+.RB [ \-K\~\c
+.IR fallback-encoding ]
+.RB [ \-m\~\c
+.IR macro-package ]
+.RB [ \-M\~\c
+.IR macro-directory ]
+.RB [ \-n\~\c
+.IR page-number ]
+.RB [ \-o\~\c
+.IR page-list ]
+.RB [ \-P\~\c
+.IR postprocessor-argument ]
+.RB [ \-r\~\c
+.IR cnumeric-expression ]
+.RB [ \-r\~\c
+.IB register =\c
+.IR numeric-expression ]
+.RB [ \-T\~\c
+.IR output-device ]
+.RB [ \-w\~\c
+.IR warning-category ]
+.RB [ \-W\~\c
+.IR warning-category ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY @g@nroff
+.B \-\-help
+.YS
+.
+.
+.SY @g@nroff
+.B \-v
+.
+.SY @g@nroff
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I @g@nroff
+formats documents written in the
+.MR groff @MAN7EXT@
+language for typewriter-like devices such as terminal emulators.
+.
+GNU
+.I nroff \" GNU
+emulates the AT&T
+.I nroff \" AT&T
+command using
+.MR groff @MAN1EXT@ .
+.
+.I @g@nroff
+generates output via
+.MR grotty @MAN1EXT@ ,
+.IR groff 's
+terminal output driver,
+which needs to know the character encoding scheme used by the device.
+.
+Consequently,
+acceptable arguments to the
+.B \-T
+option are
+.BR ascii ,
+.BR latin1 ,
+.BR utf8 ,
+and
+.BR cp1047 ;
+any others are ignored.
+.
+If neither the
+.I \%GROFF_TYPESETTER
+environment variable nor the
+.B \-T
+command-line option
+(which overrides the environment variable)
+specifies a (valid) device,
+.I @g@nroff
+consults the locale to select an appropriate output device.
+.
+It first tries the
+.MR locale 1
+program,
+then checks several locale-related environment variables;
+see section \[lq]Environment\[rq] below.
+.
+If all of the foregoing fail,
+.B \-Tascii
+is implied.
+.
+.
+.P
+The
+.BR \-b ,
+.BR \-c ,
+.BR \-C ,
+.BR \-d ,
+.BR \-E ,
+.BR \-i ,
+.BR \-m ,
+.BR \-M ,
+.BR \-n ,
+.BR \-o ,
+.BR \-r ,
+.BR \-U ,
+.BR \-w ,
+.BR \-W ,
+and
+.B \-z
+options have the effects described in
+.MR @g@troff @MAN1EXT@ .
+.
+.B \-c
+and
+.B \-h
+imply
+.RB \[lq] \-P\-c \[rq]
+and
+.RB \[lq] \-P\-h \[rq],
+respectively;
+.B \-c
+is also interpreted directly by
+.IR @g@troff .
+.
+In addition,
+this implementation ignores the AT&T
+.I nroff \" AT&T
+options
+.BR \-e ,
+.BR \-q ,
+and
+.B \-s
+(which are not implemented in
+.IR groff ).
+.
+The options
+.BR \-k ,
+.BR \-K ,
+.BR \-p ,
+.BR \-P ,
+.BR \-R ,
+.BR \-t ,
+and
+.B \-S
+are documented in
+.MR groff @MAN1EXT@ .
+.
+.B \-V
+causes
+.I @g@nroff
+to display the constructed
+.I groff
+command on the standard output stream,
+but does not execute it.
+.
+.B \-v
+and
+.B \-\-version
+show version information about
+.I @g@nroff
+and the programs it runs,
+while
+.B \-\-help
+displays a usage message;
+all exit afterward.
+.
+.
+.\" ====================================================================
+.SH "Exit status"
+.\" ====================================================================
+.
+.I @g@nroff
+exits with error
+.RB status\~ 2
+if there was a problem parsing its arguments,
+with
+.RB status\~ 0
+if any of the options
+.BR \-V ,
+.BR \-v ,
+.BR \-\-version ,
+or
+.B \-\-help
+were specified,
+and with the status of
+.I groff
+otherwise.
+.
+.
+.\" ====================================================================
+.SH Environment
+.\" ====================================================================
+.
+Normally,
+the path separator in environment variables ending with
+.I PATH
+is the colon;
+this may vary depending on the operating system.
+.
+For example,
+Windows uses a semicolon instead.
+.
+.
+.TP
+.I GROFF_BIN_PATH
+is a colon-separated list of directories in which to search for the
+.I groff
+executable before searching in
+.IR PATH .
+.
+If unset,
+.I @BINDIR@
+is used.
+.
+.
+.TP
+.I GROFF_TYPESETTER
+specifies the default output device for
+.IR groff .
+.
+.
+.TP
+.I LC_ALL
+.TQ
+.I LC_CTYPE
+.TQ
+.I LANG
+.TQ
+.I LESSCHARSET
+are pattern-matched in this order for contents matching standard
+character encodings supported by
+.I groff
+in the event no
+.B \-T
+option is given and
+.I \%GROFF_TYPESETTER
+is unset,
+or the values specified are invalid.
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @MACRODIR@/\:\%tty\-char\:.tmac
+defines fallback definitions of
+.I roff
+special characters.
+.
+These definitions more poorly optically approximate typeset output
+than those of
+.I tty.tmac
+in favor of communicating semantic information.
+.
+.I nroff
+loads it automatically.
+.
+.
+.\" ====================================================================
+.SH Notes
+.\" ====================================================================
+.
+Pager programs like
+.MR more 1
+and
+.MR less 1
+may require command-line options to correctly handle some output
+sequences;
+see
+.MR grotty @MAN1EXT@ .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.MR groff @MAN1EXT@ ,
+.MR @g@troff @MAN1EXT@ ,
+.MR grotty @MAN1EXT@ ,
+.MR locale 1 ,
+.MR roff @MAN7EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_nroff_1_man_C]
+.do rr *groff_nroff_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/roff/nroff/nroff.am b/src/roff/nroff/nroff.am
new file mode 100644
index 0000000..82738d9
--- /dev/null
+++ b/src/roff/nroff/nroff.am
@@ -0,0 +1,44 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+prefixexecbin_SCRIPTS += nroff
+nroff_srcdir = $(top_srcdir)/src/roff/nroff
+PREFIXMAN1 += src/roff/nroff/nroff.1
+EXTRA_DIST += \
+ src/roff/nroff/nroff.1.man \
+ src/roff/nroff/nroff.sh
+
+nroff_TESTS = \
+ src/roff/nroff/tests/verbose_option_works.sh
+TESTS += $(nroff_TESTS)
+EXTRA_DIST += $(nroff_TESTS)
+
+nroff: $(nroff_srcdir)/nroff.sh $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)rm -f $@ \
+ && sed -f $(SH_DEPS_SED_SCRIPT) \
+ -e $(SH_SCRIPT_SED_CMD) \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ $(nroff_srcdir)/nroff.sh \
+ >$@ \
+ && chmod +x $@
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/roff/nroff/nroff.sh b/src/roff/nroff/nroff.sh
new file mode 100644
index 0000000..77f5c06
--- /dev/null
+++ b/src/roff/nroff/nroff.sh
@@ -0,0 +1,204 @@
+#! /bin/sh
+# Emulate nroff with groff.
+#
+# Copyright (C) 1992-2021 Free Software Foundation, Inc.
+#
+# Written by James Clark, Werner Lemberg, and G. Branden Robinson.
+#
+# 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 (GPL) as published
+# by the Free Software Foundation, either version 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+prog="$0"
+
+T=
+Topt=
+opts=
+dry_run=
+is_option_argument_pending=
+
+usage="usage: $prog [-bcCEhikpRStUVz] [-d ctext] [-d string=text] \
+[-K fallback-encoding] [-m macro-package] [-M macro-directory] \
+[-n page-number] [-o page-list] [-P postprocessor-argument] \
+[-r cnumeric-expression] [-r register=numeric-expression] \
+[-T output-device] [-w warning-category] [-W warning-category] \
+[file ...]
+usage: $prog {-v | --version}
+usage: $prog --help"
+
+for arg
+do
+ if [ -n "$is_option_argument_pending" ]
+ then
+ is_option_argument_pending=
+ opts="$opts $arg"
+ shift
+ continue
+ fi
+
+ case $arg in
+ -c)
+ opts="$opts $arg -P-c" ;;
+ -h)
+ opts="$opts -P-h" ;;
+ -[eq] | -s*)
+ # ignore these options
+ ;;
+ -[dKmMnoPrTwW])
+ is_option_argument_pending=yes
+ opts="$opts $arg" ;;
+ -[bCEikpRStUz] | -[dKMmrnoPwW]*)
+ opts="$opts $arg" ;;
+ -T*)
+ Topt=$arg ;;
+ -u*)
+ # -u is for Solaris compatibility and not otherwise documented.
+ #
+ # Solaris 2.2 through at least Solaris 9 'man' invokes
+ # 'nroff -u0 ... | col -x'. Ignore the -u0, since 'less' and
+ # 'more' can use the emboldening info. But disable SGR, since
+ # Solaris 'col' mishandles it.
+ opts="$opts -P-c" ;;
+ -V)
+ dry_run=yes ;;
+ -v | --version)
+ echo "GNU nroff (groff) version @VERSION@"
+ opts="$opts $arg" ;;
+ --help)
+ echo "$usage"
+ exit 0 ;;
+ --)
+ shift
+ break ;;
+ -)
+ break ;;
+ -*)
+ echo "$prog: usage error: invalid option '$arg'" >&2
+ echo "$usage" >&2
+ exit 2 ;;
+ *)
+ break ;;
+ esac
+ shift
+done
+
+if [ -n "$is_option_argument_pending" ]
+then
+ echo "$prog: usage error: option '$arg' requires an argument" >&2
+ exit 2
+fi
+
+# Determine the -T option. Was a valid one specified?
+case "$Topt" in
+ -Tascii | -Tlatin1 | -Tutf8 | -Tcp1047)
+ T=$Topt ;;
+esac
+
+# -T option absent or invalid; try environment.
+if [ -z "$T" ]
+then
+ Tenv=-T$GROFF_TYPESETTER
+ case "$Tenv" in
+ -Tascii | -Tlatin1 | -Tutf8 | -Tcp1047)
+ T=$Tenv ;;
+ esac
+fi
+
+# Finally, infer a -T option from the locale. Try 'locale charmap'
+# first because it is the most reliable, then look at environment
+# variables.
+if [ -z "$T" ]
+then
+ # The separate `exec` is to work around a ~2004 bug in Cygwin sh.exe.
+ case "`exec 2>/dev/null ; locale charmap`" in
+ UTF-8)
+ Tloc=utf8 ;;
+ ISO-8859-1 | ISO-8859-15)
+ Tloc=latin1 ;;
+ IBM-1047)
+ Tloc=cp1047 ;;
+ *)
+ # Some old shells don't support ${FOO:-bar} expansion syntax. We
+ # should switch to it when it is safe to abandon support for them.
+ case "${LC_ALL-${LC_CTYPE-${LANG}}}" in
+ *.UTF-8)
+ Tloc=utf8 ;;
+ iso_8859_1 | *.ISO-8859-1 | *.ISO8859-1 | \
+ iso_8859_15 | *.ISO-8859-15 | *.ISO8859-15)
+ Tloc=latin1 ;;
+ *.IBM-1047)
+ Tloc=cp1047 ;;
+ *)
+ case "$LESSCHARSET" in
+ utf-8)
+ Tloc=utf8 ;;
+ latin1)
+ Tloc=latin1 ;;
+ cp1047)
+ Tloc=cp1047 ;;
+ *)
+ Tloc=ascii ;;
+ esac ;;
+ esac ;;
+ esac
+ T=-T$Tloc
+fi
+
+# Load nroff-style character definitions too.
+opts="-mtty-char$opts"
+
+# Set up the 'GROFF_BIN_PATH' variable to be exported in the current
+# 'GROFF_RUNTIME' environment.
+@GROFF_BIN_PATH_SETUP@
+export GROFF_BIN_PATH
+
+# Let our test harness redirect us. See LC_ALL comment above.
+groff=${GROFF_TEST_GROFF-groff}
+
+# Note 1: It would be nice to apply the DRY ("Don't Repeat Yourself")
+# principle here and store the entire command string to be executed into
+# a variable, and then either display it or execute it. For example:
+#
+# cmd="PATH=... groff ... $@"
+# ...
+# printf "%s\n" "$cmd"
+# ...
+# eval $cmd
+#
+# Unfortunately, the shell is a nightmarish hellscape of quoting issues.
+# Naïve attempts to solve the problem fail when arguments to nroff
+# contain embedded whitespace or shell metacharacters. The solution
+# below works with those, but there is insufficient quoting in -V (dry
+# run) mode, such that you can't copy-and-paste the output of 'nroff -V'
+# if you pass it a filename like foo"bar (with the embedded quotation
+# mark) and expect it to run without further quoting.
+#
+# If POSIX adopts Bash's ${var@Q} or an equivalent, this issue can be
+# revisited.
+#
+# Note 2: The construction '${1+"@$"}' preserves the absence of
+# arguments in old shells; see "Shell Substitutions" in the GNU Autoconf
+# manual. We don't want 'nroff' to become 'groff ... ""' if $# equals
+# zero.
+if [ -n "$dry_run" ]
+then
+ echo PATH="$GROFF_RUNTIME$PATH" $groff $T $opts ${1+"$@"}
+else
+ PATH="$GROFF_RUNTIME$PATH" $groff $T $opts ${1+"$@"}
+fi
+
+# Local Variables:
+# fill-column: 72
+# End:
+# vim: set autoindent expandtab shiftwidth=2 softtabstop=2 textwidth=72:
diff --git a/src/roff/nroff/tests/verbose_option_works.sh b/src/roff/nroff/tests/verbose_option_works.sh
new file mode 100755
index 0000000..85ca8f0
--- /dev/null
+++ b/src/roff/nroff/tests/verbose_option_works.sh
@@ -0,0 +1,68 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+# Ensure a predictable character encoding.
+export LC_ALL=C
+export LESSCHARSET=
+export GROFF_TYPESETTER=
+
+set -e
+
+export GROFF_TEST_GROFF=${abs_top_builddir:-.}/test-groff
+
+# The $PATH used by an installed nroff at runtime does not match what
+# we're trying to test, which should be using the groff and runtime
+# support from the build tree. Therefore the $PATH that nroff -V
+# reports will _always_ be wrong for test purposes. Skip over it.
+#
+# If the build environment has a directory in the $PATH matching
+# "test-groff " (with the trailing space), failure may result if sed
+# doesn't match greedily. POSIX says it should.
+sedexpr='s/^PATH=.*test-groff /test-groff /'
+PATH=${abs_top_builddir:-.}:$PATH
+
+nroff_ver=$(nroff -v | awk 'NR == 1 {print $NF}')
+groff_ver=$(nroff -v | awk 'NR == 2 {print $NF}')
+
+echo nroff: $nroff_ver >&2
+echo groff: $groff_ver >&2
+test "$nroff_ver" = "$groff_ver"
+
+echo "testing 'nroff -V'" >&2
+nroff -V | sed "$sedexpr" | grep -x "test-groff -Tascii -mtty-char"
+
+echo "testing 'nroff -V 1'" >&2
+nroff -V 1 | sed "$sedexpr" | grep -x "test-groff -Tascii -mtty-char 1"
+
+echo "testing 'nroff -V \"1a 1b\"'" >&2
+nroff -V \"1a 1b\" | sed "$sedexpr" \
+ | grep -x "test-groff -Tascii -mtty-char \"1a 1b\""
+
+echo "testing 'nroff -V \"1a 1b\" 2'" >&2
+nroff -V \"1a 1b\" 2 | sed "$sedexpr" \
+ | grep -x "test-groff -Tascii -mtty-char \"1a 1b\" 2"
+
+echo "testing 'nroff -V 1a\\\"1b 2'" >&2
+nroff -V 1a\"1b 2 | sed "$sedexpr" \
+ | grep -x "test-groff -Tascii -mtty-char 1a\"1b 2"
+
+echo "testing 'nroff -V -d FOO=BAR 1'" >&2
+nroff -V -d FOO=BAR 1 | sed "$sedexpr" \
+ | grep -x "test-groff -Tascii -mtty-char -d FOO=BAR 1"
diff --git a/src/roff/troff/TODO b/src/roff/troff/TODO
new file mode 100644
index 0000000..533167a
--- /dev/null
+++ b/src/roff/troff/TODO
@@ -0,0 +1,125 @@
+A line prefix request to make e.g. French quotation possible:
+
+ He said: >> blablablabla
+ >> blablabla blabla bla
+ >> blabla blabla bla bla
+ >> bla bla bla blablabla
+ >> blabla. <<
+
+Give a more helpful error message when the indent is set to a value
+greater than the line-length.
+
+Tracing. This is a pain to implement because requests are responsible
+for reading their own arguments.
+
+Possibly implement -s option (stop every N pages). This functionality
+would be more appropriate in a postprocessor.
+
+Line breaking should be smarter. In particular, it should be possible
+to shrink spaces. Also avoid having a line that's been shrunk a lot
+next to a line that's been stretched a lot. The difficulty is to
+design a mechanism that allows the user complete control over the
+decision of where to break the line.
+
+Provide a mechanism to control the shape of the rag in non-justified
+text.
+
+Add a discretionary break escape sequence. \='...'...'...' like TeX.
+
+Think about kerning between characters and spaces. (Need to implement
+get_breakpoints and split methods for kern_pair_node class.)
+
+In troff, if .L > 1 when a diversion is reread in no-fill mode, then
+extra line-spacing is added on. Groff at the moment treats line-spacing
+like vertical spacing and doesn't do this.
+
+Suppose \(ch comes from a special font S, and that the current font is
+R. Suppose that R contains a hyphen character and that S does not.
+Suppose that the current font is R. Suppose that \(ch is in a word
+and has a non-zero hyphen-type. Then we ought to be able to hyphenate,
+but we won't be able to because we will look for the hyphen only in
+font S and not in font R.
+
+Perhaps the current interpolation depth should be accessible in a number
+register.
+
+Should \w deal with a newline like \X?
+
+Have another look at uses of token::delimiter. Perhaps we need to
+distinguish the case where we want to see if a token could start a
+number, from the case where we want to see if it could occur somewhere
+in a number expression.
+
+Provide a facility like copy thru in pic.
+
+Fancier implementation of font families which doesn't group fonts into
+families purely on the basis of their names.
+
+In the DESC file make the number of fonts optional if they are all on
+one line.
+
+Number register to give the diversion level.
+
+Time various alternative implementations of scale (both in font.c and
+number.c). On a sparc it's faster to always do it in floating point.
+
+Devise a more compact representation for the hyphenation patterns trie.
+
+Have a per-environment parameter to increase letter-spacing.
+
+Request to set character height.
+
+Request to set character slant.
+
+Support non-uniformly scalable fonts. Perhaps associate a suffix with
+a particular range of sizes. E.g.,
+ sizesuffix .display 14-512
+Then is you ask for R at pointsize 16, groff will first look for
+R.display and then R. Probably necessary to be able to specify a
+separate unitwidth for each sizesuffix (e.g., uuu for X).
+
+Make it possible to suppress hyphenation on a word-by-word basis.
+(Perhaps store hyphenation flags in tfont.)
+
+Possibly allow multiple simultaneous input line traps.
+
+Unpaddable, breakable space escape sequence.
+
+Support hanging punctuation.
+
+In justified text, if the last line of a paragraph is only a little
+bit short it might be desirable to justify the line. Allow the user
+control over this.
+
+The pm request could print where the macro was defined. Also could
+optionally print the contents of a macro.
+
+Provide some way to round numbers to multiples of the current
+horizontal or vertical motion quantum.
+
+Better string-processing support (search).
+
+Generalized ligatures.
+
+Request to remove an environment. (Maintain a count of the references
+to the environment from the environment table, environment dictionary
+or environment stack.)
+
+Perhaps in the nr request a leading '-' should only be recognized as a
+decrement when it's at the same interpolation depth as the request.
+
+Don't ever change a charinfo. Create new variants instead and chain
+them together.
+
+Unix troff appears to read the first character of a request name in
+copy mode. Should we do the same?
+
+Number register giving name of end macro.
+
+More thorough range checking.
+
+Provide syntax for octal and hexadecimal numeric constants. Perhaps
+o#100 and x#7f as per Scheme. Or perhaps PostScript 16#7f. Ambiguity
+between whether 'c' is treated as digit or scaling indicator.
+
+Local variables.
diff --git a/src/roff/troff/charinfo.h b/src/roff/troff/charinfo.h
new file mode 100644
index 0000000..0a7a481
--- /dev/null
+++ b/src/roff/troff/charinfo.h
@@ -0,0 +1,301 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <vector>
+#include <utility>
+
+extern int class_flag; // set if there was a call to '.class'
+extern void get_flags();
+
+class macro;
+
+class charinfo : glyph {
+ static int next_index;
+ charinfo *translation;
+ macro *mac;
+ unsigned char special_translation;
+ unsigned char hyphenation_code;
+ unsigned int flags;
+ unsigned char ascii_code;
+ unsigned char asciify_code;
+ char not_found;
+ char transparent_translate; // non-zero means translation applies
+ // to transparent throughput
+ char translate_input; // non-zero means that asciify_code is
+ // active for .asciify (set by .trin)
+ char_mode mode;
+ // Unicode character classes
+ std::vector<std::pair<int, int> > ranges;
+ std::vector<charinfo *> nested_classes;
+public:
+ enum { // Values for the flags bitmask. See groff
+ // manual, description of the '.cflags' request.
+ ENDS_SENTENCE = 0x01,
+ BREAK_BEFORE = 0x02,
+ BREAK_AFTER = 0x04,
+ OVERLAPS_HORIZONTALLY = 0x08,
+ OVERLAPS_VERTICALLY = 0x10,
+ TRANSPARENT = 0x20,
+ IGNORE_HCODES = 0x40,
+ DONT_BREAK_BEFORE = 0x80,
+ DONT_BREAK_AFTER = 0x100,
+ INTER_CHAR_SPACE = 0x200
+ };
+ enum {
+ TRANSLATE_NONE,
+ TRANSLATE_SPACE,
+ TRANSLATE_DUMMY,
+ TRANSLATE_STRETCHABLE_SPACE,
+ TRANSLATE_HYPHEN_INDICATOR
+ };
+ symbol nm;
+ charinfo(symbol);
+ glyph *as_glyph();
+ int ends_sentence();
+ int overlaps_vertically();
+ int overlaps_horizontally();
+ int can_break_before();
+ int can_break_after();
+ int transparent();
+ int ignore_hcodes();
+ int prohibit_break_before();
+ int prohibit_break_after();
+ int inter_char_space();
+ unsigned char get_hyphenation_code();
+ unsigned char get_ascii_code();
+ unsigned char get_asciify_code();
+ int get_unicode_code();
+ void set_hyphenation_code(unsigned char);
+ void set_ascii_code(unsigned char);
+ void set_asciify_code(unsigned char);
+ void set_translation_input();
+ int get_translation_input();
+ charinfo *get_translation(int = 0);
+ void set_translation(charinfo *, int, int);
+ void get_flags();
+ void set_flags(unsigned int);
+ void set_special_translation(int, int);
+ int get_special_translation(int = 0);
+ macro *set_macro(macro *);
+ macro *setx_macro(macro *, char_mode);
+ macro *get_macro();
+ int first_time_not_found();
+ void set_number(int);
+ int get_number();
+ int numbered();
+ int is_normal();
+ int is_fallback();
+ int is_special();
+ symbol *get_symbol();
+ void add_to_class(int);
+ void add_to_class(int, int);
+ void add_to_class(charinfo *);
+ bool is_class();
+ bool contains(int, bool = false);
+ bool contains(symbol, bool = false);
+ bool contains(charinfo *, bool = false);
+};
+
+charinfo *get_charinfo(symbol);
+extern charinfo *charset_table[];
+charinfo *get_charinfo_by_number(int);
+
+inline int charinfo::overlaps_horizontally()
+{
+ if (class_flag)
+ ::get_flags();
+ return flags & OVERLAPS_HORIZONTALLY;
+}
+
+inline int charinfo::overlaps_vertically()
+{
+ if (class_flag)
+ ::get_flags();
+ return flags & OVERLAPS_VERTICALLY;
+}
+
+inline int charinfo::can_break_before()
+{
+ if (class_flag)
+ ::get_flags();
+ return flags & BREAK_BEFORE;
+}
+
+inline int charinfo::can_break_after()
+{
+ if (class_flag)
+ ::get_flags();
+ return flags & BREAK_AFTER;
+}
+
+inline int charinfo::ends_sentence()
+{
+ if (class_flag)
+ ::get_flags();
+ return flags & ENDS_SENTENCE;
+}
+
+inline int charinfo::transparent()
+{
+ if (class_flag)
+ ::get_flags();
+ return flags & TRANSPARENT;
+}
+
+inline int charinfo::ignore_hcodes()
+{
+ if (class_flag)
+ ::get_flags();
+ return flags & IGNORE_HCODES;
+}
+
+inline int charinfo::prohibit_break_before()
+{
+ if (class_flag)
+ ::get_flags();
+ return flags & DONT_BREAK_BEFORE;
+}
+
+inline int charinfo::prohibit_break_after()
+{
+ if (class_flag)
+ ::get_flags();
+ return flags & DONT_BREAK_AFTER;
+}
+
+inline int charinfo::inter_char_space()
+{
+ if (class_flag)
+ ::get_flags();
+ return flags & INTER_CHAR_SPACE;
+}
+
+inline int charinfo::numbered()
+{
+ return number >= 0;
+}
+
+inline int charinfo::is_normal()
+{
+ return mode == CHAR_NORMAL;
+}
+
+inline int charinfo::is_fallback()
+{
+ return mode == CHAR_FALLBACK;
+}
+
+inline int charinfo::is_special()
+{
+ return mode == CHAR_SPECIAL;
+}
+
+inline charinfo *charinfo::get_translation(int transparent_throughput)
+{
+ return (transparent_throughput && !transparent_translate
+ ? 0
+ : translation);
+}
+
+inline unsigned char charinfo::get_hyphenation_code()
+{
+ return hyphenation_code;
+}
+
+inline unsigned char charinfo::get_ascii_code()
+{
+ return ascii_code;
+}
+
+inline unsigned char charinfo::get_asciify_code()
+{
+ return (translate_input ? asciify_code : 0);
+}
+
+inline void charinfo::set_flags(unsigned int c)
+{
+ flags = c;
+}
+
+inline glyph *charinfo::as_glyph()
+{
+ return this;
+}
+
+inline void charinfo::set_translation_input()
+{
+ translate_input = 1;
+}
+
+inline int charinfo::get_translation_input()
+{
+ return translate_input;
+}
+
+inline int charinfo::get_special_translation(int transparent_throughput)
+{
+ return (transparent_throughput && !transparent_translate
+ ? int(TRANSLATE_NONE)
+ : special_translation);
+}
+
+inline macro *charinfo::get_macro()
+{
+ return mac;
+}
+
+inline int charinfo::first_time_not_found()
+{
+ if (not_found)
+ return 0;
+ else {
+ not_found = 1;
+ return 1;
+ }
+}
+
+inline symbol *charinfo::get_symbol()
+{
+ return &nm;
+}
+
+inline void charinfo::add_to_class(int c)
+{
+ class_flag = 1;
+ // TODO ranges cumbersome for single characters?
+ ranges.push_back(std::pair<int, int>(c, c));
+}
+
+inline void charinfo::add_to_class(int lo,
+ int hi)
+{
+ class_flag = 1;
+ ranges.push_back(std::pair<int, int>(lo, hi));
+}
+
+inline void charinfo::add_to_class(charinfo *ci)
+{
+ class_flag = 1;
+ nested_classes.push_back(ci);
+}
+
+inline bool charinfo::is_class()
+{
+ return (!ranges.empty() || !nested_classes.empty());
+}
diff --git a/src/roff/troff/column.cpp b/src/roff/troff/column.cpp
new file mode 100644
index 0000000..55563ba
--- /dev/null
+++ b/src/roff/troff/column.cpp
@@ -0,0 +1,731 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef COLUMN
+
+#include "troff.h"
+#include "symbol.h"
+#include "dictionary.h"
+#include "hvunits.h"
+#include "env.h"
+#include "request.h"
+#include "node.h"
+#include "token.h"
+#include "div.h"
+#include "reg.h"
+#include "stringclass.h"
+
+void output_file::vjustify(vunits, symbol)
+{
+ // do nothing
+}
+
+struct justification_spec;
+struct output_line;
+
+class column : public output_file {
+private:
+ output_file *out;
+ vunits bottom;
+ output_line *col;
+ output_line **tail;
+ void add_output_line(output_line *);
+ void begin_page(int pageno, vunits page_length);
+ void flush();
+ void print_line(hunits, vunits, node *, vunits, vunits);
+ void vjustify(vunits, symbol);
+ void transparent_char(unsigned char c);
+ void copy_file(hunits, vunits, const char *);
+ int is_printing();
+ void check_bottom();
+public:
+ column();
+ ~column();
+ void start();
+ void output();
+ void justify(const justification_spec &);
+ void trim();
+ void reset();
+ vunits get_bottom();
+ vunits get_last_extra_space();
+ int is_active() { return out != 0; }
+};
+
+column *the_column = 0;
+
+struct transparent_output_line;
+struct vjustify_output_line;
+
+class output_line {
+ output_line *next;
+public:
+ output_line();
+ virtual ~output_line();
+ virtual void output(output_file *, vunits);
+ virtual transparent_output_line *as_transparent_output_line();
+ virtual vjustify_output_line *as_vjustify_output_line();
+ virtual vunits distance();
+ virtual vunits height();
+ virtual void reset();
+ virtual vunits extra_space(); // post line
+ friend class column;
+ friend class justification_spec;
+};
+
+class position_output_line : public output_line {
+ vunits dist;
+public:
+ position_output_line(vunits);
+ vunits distance();
+};
+
+class node_output_line : public position_output_line {
+ node *nd;
+ hunits page_offset;
+ vunits before;
+ vunits after;
+public:
+ node_output_line(vunits, node *, hunits, vunits, vunits);
+ ~node_output_line();
+ void output(output_file *, vunits);
+ vunits height();
+ vunits extra_space();
+};
+
+class vjustify_output_line : public position_output_line {
+ vunits current;
+ symbol typ;
+public:
+ vjustify_output_line(vunits dist, symbol);
+ vunits height();
+ vjustify_output_line *as_vjustify_output_line();
+ void vary(vunits amount);
+ void reset();
+ symbol type();
+};
+
+inline symbol vjustify_output_line::type()
+{
+ return typ;
+}
+
+class copy_file_output_line : public position_output_line {
+ symbol filename;
+ hunits hpos;
+public:
+ copy_file_output_line(vunits, const char *, hunits);
+ void output(output_file *, vunits);
+};
+
+class transparent_output_line : public output_line {
+ string buf;
+public:
+ transparent_output_line();
+ void output(output_file *, vunits);
+ void append_char(unsigned char c);
+ transparent_output_line *as_transparent_output_line();
+};
+
+output_line::output_line() : next(0)
+{
+}
+
+output_line::~output_line()
+{
+}
+
+void output_line::reset()
+{
+}
+
+transparent_output_line *output_line::as_transparent_output_line()
+{
+ return 0;
+}
+
+vjustify_output_line *output_line::as_vjustify_output_line()
+{
+ return 0;
+}
+
+void output_line::output(output_file *, vunits)
+{
+}
+
+vunits output_line::distance()
+{
+ return V0;
+}
+
+vunits output_line::height()
+{
+ return V0;
+}
+
+vunits output_line::extra_space()
+{
+ return V0;
+}
+
+position_output_line::position_output_line(vunits d)
+: dist(d)
+{
+}
+
+vunits position_output_line::distance()
+{
+ return dist;
+}
+
+node_output_line::node_output_line(vunits d, node *n, hunits po, vunits b, vunits a)
+: position_output_line(d), nd(n), page_offset(po), before(b), after(a)
+{
+}
+
+node_output_line::~node_output_line()
+{
+ delete_node_list(nd);
+}
+
+void node_output_line::output(output_file *out, vunits pos)
+{
+ out->print_line(page_offset, pos, nd, before, after);
+ nd = 0;
+}
+
+vunits node_output_line::height()
+{
+ return after;
+}
+
+vunits node_output_line::extra_space()
+{
+ return after;
+}
+
+vjustify_output_line::vjustify_output_line(vunits d, symbol t)
+: position_output_line(d), typ(t)
+{
+}
+
+void vjustify_output_line::reset()
+{
+ current = V0;
+}
+
+vunits vjustify_output_line::height()
+{
+ return current;
+}
+
+vjustify_output_line *vjustify_output_line::as_vjustify_output_line()
+{
+ return this;
+}
+
+inline void vjustify_output_line::vary(vunits amount)
+{
+ current += amount;
+}
+
+transparent_output_line::transparent_output_line()
+{
+}
+
+transparent_output_line *transparent_output_line::as_transparent_output_line()
+{
+ return this;
+}
+
+void transparent_output_line::append_char(unsigned char c)
+{
+ assert(c != 0);
+ buf += c;
+}
+
+void transparent_output_line::output(output_file *out, vunits)
+{
+ int len = buf.length();
+ for (int i = 0; i < len; i++)
+ out->transparent_char(buf[i]);
+}
+
+copy_file_output_line::copy_file_output_line(vunits d, const char *f, hunits h)
+: position_output_line(d), hpos(h), filename(f)
+{
+}
+
+void copy_file_output_line::output(output_file *out, vunits pos)
+{
+ out->copy_file(hpos, pos, filename.contents());
+}
+
+column::column()
+: bottom(V0), col(0), tail(&col), out(0)
+{
+}
+
+column::~column()
+{
+ assert(out != 0);
+ error("automatically outputting column before exiting");
+ output();
+ delete the_output;
+}
+
+void column::start()
+{
+ assert(out == 0);
+ if (!the_output)
+ init_output();
+ assert(the_output != 0);
+ out = the_output;
+ the_output = this;
+}
+
+void column::begin_page(int pageno, vunits page_length)
+{
+ assert(out != 0);
+ if (col) {
+ error("automatically outputting column before beginning next page");
+ output();
+ the_output->begin_page(pageno, page_length);
+ }
+ else
+ out->begin_page(pageno, page_length);
+
+}
+
+void column::flush()
+{
+ assert(out != 0);
+ out->flush();
+}
+
+int column::is_printing()
+{
+ assert(out != 0);
+ return out->is_printing();
+}
+
+vunits column::get_bottom()
+{
+ return bottom;
+}
+
+void column::add_output_line(output_line *ln)
+{
+ *tail = ln;
+ bottom += ln->distance();
+ bottom += ln->height();
+ ln->next = 0;
+ tail = &(*tail)->next;
+}
+
+void column::print_line(hunits page_offset, vunits pos, node *nd,
+ vunits before, vunits after)
+{
+ assert(out != 0);
+ add_output_line(new node_output_line(pos - bottom, nd, page_offset, before, after));
+}
+
+void column::vjustify(vunits pos, symbol typ)
+{
+ assert(out != 0);
+ add_output_line(new vjustify_output_line(pos - bottom, typ));
+}
+
+void column::transparent_char(unsigned char c)
+{
+ assert(out != 0);
+ transparent_output_line *tl = 0;
+ if (*tail)
+ tl = (*tail)->as_transparent_output_line();
+ if (!tl) {
+ tl = new transparent_output_line;
+ add_output_line(tl);
+ }
+ tl->append_char(c);
+}
+
+void column::copy_file(hunits page_offset, vunits pos, const char *filename)
+{
+ assert(out != 0);
+ add_output_line(new copy_file_output_line(pos - bottom, filename, page_offset));
+}
+
+void column::trim()
+{
+ output_line **spp = 0;
+ for (output_line **pp = &col; *pp; pp = &(*pp)->next)
+ if ((*pp)->as_vjustify_output_line() == 0)
+ spp = 0;
+ else if (!spp)
+ spp = pp;
+ if (spp) {
+ output_line *ln = *spp;
+ *spp = 0;
+ tail = spp;
+ while (ln) {
+ output_line *tem = ln->next;
+ bottom -= ln->distance();
+ bottom -= ln->height();
+ delete ln;
+ ln = tem;
+ }
+ }
+}
+
+void column::reset()
+{
+ bottom = V0;
+ for (output_line *ln = col; ln; ln = ln->next) {
+ bottom += ln->distance();
+ ln->reset();
+ bottom += ln->height();
+ }
+}
+
+void column::check_bottom()
+{
+ vunits b;
+ for (output_line *ln = col; ln; ln = ln->next) {
+ b += ln->distance();
+ b += ln->height();
+ }
+ assert(b == bottom);
+}
+
+void column::output()
+{
+ assert(out != 0);
+ vunits vpos(V0);
+ output_line *ln = col;
+ while (ln) {
+ vpos += ln->distance();
+ ln->output(out, vpos);
+ vpos += ln->height();
+ output_line *tem = ln->next;
+ delete ln;
+ ln = tem;
+ }
+ tail = &col;
+ bottom = V0;
+ col = 0;
+ the_output = out;
+ out = 0;
+}
+
+vunits column::get_last_extra_space()
+{
+ if (!col)
+ return V0;
+ for (output_line *p = col; p->next; p = p->next)
+ ;
+ return p->extra_space();
+}
+
+class justification_spec {
+ vunits height;
+ symbol *type;
+ vunits *amount;
+ int n;
+ int maxn;
+public:
+ justification_spec(vunits);
+ ~justification_spec();
+ void append(symbol t, vunits v);
+ void justify(output_line *, vunits *bottomp) const;
+};
+
+justification_spec::justification_spec(vunits h)
+: height(h), n(0), maxn(10)
+{
+ type = new symbol[maxn];
+ amount = new vunits[maxn];
+}
+
+justification_spec::~justification_spec()
+{
+ delete[] type;
+ delete[] amount;
+}
+
+void justification_spec::append(symbol t, vunits v)
+{
+ if (v <= V0) {
+ if (v < V0)
+ warning(WARN_RANGE,
+ "maximum space for vertical justification must not be negative");
+ else
+ warning(WARN_RANGE,
+ "maximum space for vertical justification must not be zero");
+ return;
+ }
+ if (n >= maxn) {
+ maxn *= 2;
+ symbol *old_type = type;
+ type = new symbol[maxn];
+ int i;
+ for (i = 0; i < n; i++)
+ type[i] = old_type[i];
+ delete[] old_type;
+ vunits *old_amount = amount;
+ amount = new vunits[maxn];
+ for (i = 0; i < n; i++)
+ amount[i] = old_amount[i];
+ delete[] old_amount;
+ }
+ assert(n < maxn);
+ type[n] = t;
+ amount[n] = v;
+ n++;
+}
+
+void justification_spec::justify(output_line *col, vunits *bottomp) const
+{
+ if (*bottomp >= height)
+ return;
+ vunits total;
+ output_line *p;
+ for (p = col; p; p = p->next) {
+ vjustify_output_line *sp = p->as_vjustify_output_line();
+ if (sp) {
+ symbol t = sp->type();
+ for (int i = 0; i < n; i++) {
+ if (t == type[i])
+ total += amount[i];
+ }
+ }
+ }
+ vunits gap = height - *bottomp;
+ for (p = col; p; p = p->next) {
+ vjustify_output_line *sp = p->as_vjustify_output_line();
+ if (sp) {
+ symbol t = sp->type();
+ for (int i = 0; i < n; i++) {
+ if (t == type[i]) {
+ if (total <= gap) {
+ sp->vary(amount[i]);
+ gap -= amount[i];
+ }
+ else {
+ // gap < total
+ vunits v = scale(amount[i], gap, total);
+ sp->vary(v);
+ gap -= v;
+ }
+ total -= amount[i];
+ }
+ }
+ }
+ }
+ assert(total == V0);
+ *bottomp = height - gap;
+}
+
+void column::justify(const justification_spec &js)
+{
+ check_bottom();
+ js.justify(col, &bottom);
+ check_bottom();
+}
+
+void column_justify()
+{
+ vunits height;
+ if (!the_column->is_active())
+ error("can't justify column - column not active");
+ else if (get_vunits(&height, 'v')) {
+ justification_spec js(height);
+ symbol nm = get_long_name(true /* required */);
+ if (!nm.is_null()) {
+ vunits v;
+ if (get_vunits(&v, 'v')) {
+ js.append(nm, v);
+ int err = 0;
+ while (has_arg()) {
+ nm = get_long_name(true /* required */);
+ if (nm.is_null()) {
+ err = 1;
+ break;
+ }
+ if (!get_vunits(&v, 'v')) {
+ err = 1;
+ break;
+ }
+ js.append(nm, v);
+ }
+ if (!err)
+ the_column->justify(js);
+ }
+ }
+ }
+ skip_line();
+}
+
+void column_start()
+{
+ if (the_column->is_active())
+ error("can't start column - column already active");
+ else
+ the_column->start();
+ skip_line();
+}
+
+void column_output()
+{
+ if (!the_column->is_active())
+ error("can't output column - column not active");
+ else
+ the_column->output();
+ skip_line();
+}
+
+void column_trim()
+{
+ if (!the_column->is_active())
+ error("can't trim column - column not active");
+ else
+ the_column->trim();
+ skip_line();
+}
+
+void column_reset()
+{
+ if (!the_column->is_active())
+ error("can't reset column - column not active");
+ else
+ the_column->reset();
+ skip_line();
+}
+
+class column_bottom_reg : public reg {
+public:
+ const char *get_string();
+};
+
+const char *column_bottom_reg::get_string()
+{
+ return i_to_a(the_column->get_bottom().to_units());
+}
+
+class column_extra_space_reg : public reg {
+public:
+ const char *get_string();
+};
+
+const char *column_extra_space_reg::get_string()
+{
+ return i_to_a(the_column->get_last_extra_space().to_units());
+}
+
+class column_active_reg : public reg {
+public:
+ const char *get_string();
+};
+
+const char *column_active_reg::get_string()
+{
+ return the_column->is_active() ? "1" : "0";
+}
+
+static int no_vjustify_mode = 0;
+
+class vjustify_node : public node {
+ symbol typ;
+public:
+ vjustify_node(symbol);
+ int reread(int *);
+ const char *type();
+ int same(node *);
+ node *copy();
+};
+
+vjustify_node::vjustify_node(symbol t)
+: typ(t)
+{
+}
+
+node *vjustify_node::copy()
+{
+ return new vjustify_node(typ, div_nest_level);
+}
+
+const char *vjustify_node::type()
+{
+ return "vjustify_node";
+}
+
+int vjustify_node::same(node *nd)
+{
+ return typ == ((vjustify_node *)nd)->typ;
+}
+
+int vjustify_node::reread(int *bolp)
+{
+ curdiv->vjustify(typ);
+ *bolp = 1;
+ return 1;
+}
+
+void macro_diversion::vjustify(symbol type)
+{
+ if (!no_vjustify_mode)
+ mac->append(new vjustify_node(type));
+}
+
+void top_level_diversion::vjustify(symbol type)
+{
+ if (no_space_mode || no_vjustify_mode)
+ return;
+ assert(first_page_begun); // I'm not sure about this.
+ the_output->vjustify(vertical_position, type);
+}
+
+void no_vjustify()
+{
+ skip_line();
+ no_vjustify_mode = 1;
+}
+
+void restore_vjustify()
+{
+ skip_line();
+ no_vjustify_mode = 0;
+}
+
+void init_column_requests()
+{
+ the_column = new column;
+ init_request("cols", column_start);
+ init_request("colo", column_output);
+ init_request("colj", column_justify);
+ init_request("colr", column_reset);
+ init_request("colt", column_trim);
+ init_request("nvj", no_vjustify);
+ init_request("rvj", restore_vjustify);
+ register_dictionary.define(".colb", new column_bottom_reg);
+ register_dictionary.define(".colx", new column_extra_space_reg);
+ register_dictionary.define(".cola", new column_active_reg);
+ register_dictionary.define(".nvj",
+ new readonly_register(&no_vjustify_mode));
+}
+
+#endif /* COLUMN */
diff --git a/src/roff/troff/dictionary.cpp b/src/roff/troff/dictionary.cpp
new file mode 100644
index 0000000..08afbd3
--- /dev/null
+++ b/src/roff/troff/dictionary.cpp
@@ -0,0 +1,209 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#include "troff.h"
+#include "dictionary.h"
+
+// is 'p' a good size for a hash table
+
+static int is_good_size(unsigned int p)
+{
+ const unsigned int SMALL = 10;
+ unsigned int i;
+ for (i = 2; i <= p/2; i++)
+ if (p % i == 0)
+ return 0;
+ for (i = 0x100; i != 0; i <<= 8)
+ if (i % p <= SMALL || i % p > p - SMALL)
+ return 0;
+ return 1;
+}
+
+dictionary::dictionary(int n) : size(n), used(0), threshold(0.5), factor(1.5)
+{
+ table = new association[n];
+}
+
+// see Knuth, Sorting and Searching, p518, Algorithm L
+// we can't use double-hashing because we want a remove function
+
+void *dictionary::lookup(symbol s, void *v)
+{
+ int i;
+ for (i = int(s.hash() % size);
+ table[i].v != 0;
+ i == 0 ? i = size - 1: --i)
+ if (s == table[i].s) {
+ if (v != 0) {
+ void *temp = table[i].v;
+ table[i].v = v;
+ return temp;
+ }
+ else
+ return table[i].v;
+ }
+ if (v == 0)
+ return 0;
+ ++used;
+ table[i].v = v;
+ table[i].s = s;
+ if ((double)used/(double)size >= threshold || used + 1 >= size) {
+ int old_size = size;
+ size = int(size*factor);
+ while (!is_good_size(size))
+ ++size;
+ association *old_table = table;
+ table = new association[size];
+ used = 0;
+ for (i = 0; i < old_size; i++)
+ if (old_table[i].v != 0)
+ (void)lookup(old_table[i].s, old_table[i].v);
+ delete[] old_table;
+ }
+ return 0;
+}
+
+void *dictionary::lookup(const char *p)
+{
+ symbol s(p, MUST_ALREADY_EXIST);
+ if (s.is_null())
+ return 0;
+ else
+ return lookup(s);
+}
+
+// see Knuth, Sorting and Searching, p527, Algorithm R
+
+void *dictionary::remove(symbol s)
+{
+ // this relies on the fact that we are using linear probing
+ int i;
+ for (i = int(s.hash() % size);
+ table[i].v != 0 && s != table[i].s;
+ i == 0 ? i = size - 1: --i)
+ ;
+ void *p = table[i].v;
+ while (table[i].v != 0) {
+ table[i].v = 0;
+ int j = i;
+ int r;
+ do {
+ --i;
+ if (i < 0)
+ i = size - 1;
+ if (table[i].v == 0)
+ break;
+ r = int(table[i].s.hash() % size);
+ } while ((i <= r && r < j) || (r < j && j < i) || (j < i && i <= r));
+ table[j] = table[i];
+ }
+ if (p != 0)
+ --used;
+ return p;
+}
+
+dictionary_iterator::dictionary_iterator(dictionary &d) : dict(&d), i(0)
+{
+}
+
+int dictionary_iterator::get(symbol *sp, void **vp)
+{
+ for (; i < dict->size; i++)
+ if (dict->table[i].v) {
+ *sp = dict->table[i].s;
+ *vp = dict->table[i].v;
+ i++;
+ return 1;
+ }
+ return 0;
+}
+
+object_dictionary_iterator::object_dictionary_iterator(object_dictionary &od)
+: di(od.d)
+{
+}
+
+object::object() : rcount(0)
+{
+}
+
+object::~object()
+{
+}
+
+void object::add_reference()
+{
+ rcount += 1;
+}
+
+void object::remove_reference()
+{
+ if (--rcount == 0)
+ delete this;
+}
+
+object_dictionary::object_dictionary(int n) : d(n)
+{
+}
+
+object *object_dictionary::lookup(symbol nm)
+{
+ return (object *)d.lookup(nm);
+}
+
+void object_dictionary::define(symbol nm, object *obj)
+{
+ obj->add_reference();
+ obj = (object *)d.lookup(nm, obj);
+ if (obj)
+ obj->remove_reference();
+}
+
+void object_dictionary::rename(symbol oldnm, symbol newnm)
+{
+ object *obj = (object *)d.remove(oldnm);
+ if (obj) {
+ obj = (object *)d.lookup(newnm, obj);
+ if (obj)
+ obj->remove_reference();
+ }
+}
+
+void object_dictionary::remove(symbol nm)
+{
+ object *obj = (object *)d.remove(nm);
+ if (obj)
+ obj->remove_reference();
+}
+
+// Return non-zero if oldnm was defined.
+
+int object_dictionary::alias(symbol newnm, symbol oldnm)
+{
+ object *obj = (object *)d.lookup(oldnm);
+ if (obj) {
+ obj->add_reference();
+ obj = (object *)d.lookup(newnm, obj);
+ if (obj)
+ obj->remove_reference();
+ return 1;
+ }
+ return 0;
+}
diff --git a/src/roff/troff/dictionary.h b/src/roff/troff/dictionary.h
new file mode 100644
index 0000000..71c4f3f
--- /dev/null
+++ b/src/roff/troff/dictionary.h
@@ -0,0 +1,91 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+
+// there is no distinction between name with no value and name with NULL value
+// null names are not permitted (they will be ignored).
+
+struct association {
+ symbol s;
+ void *v;
+ association() : v(0) {}
+};
+
+class dictionary;
+
+class dictionary_iterator {
+ dictionary *dict;
+ int i;
+public:
+ dictionary_iterator(dictionary &);
+ int get(symbol *, void **);
+};
+
+class dictionary {
+ int size;
+ int used;
+ double threshold;
+ double factor;
+ association *table;
+ void rehash(int);
+public:
+ dictionary(int);
+ void *lookup(symbol s, void *v=0); // returns value associated with key
+ void *lookup(const char *);
+ // if second parameter not NULL, value will be replaced
+ void *remove(symbol);
+ friend class dictionary_iterator;
+};
+
+class object {
+ int rcount;
+ public:
+ object();
+ virtual ~object();
+ void add_reference();
+ void remove_reference();
+};
+
+class object_dictionary;
+
+class object_dictionary_iterator {
+ dictionary_iterator di;
+public:
+ object_dictionary_iterator(object_dictionary &);
+ int get(symbol *, object **);
+};
+
+class object_dictionary {
+ dictionary d;
+public:
+ object_dictionary(int);
+ object *lookup(symbol nm);
+ void define(symbol nm, object *obj);
+ void rename(symbol oldnm, symbol newnm);
+ void remove(symbol nm);
+ int alias(symbol newnm, symbol oldnm);
+ friend class object_dictionary_iterator;
+};
+
+
+inline int object_dictionary_iterator::get(symbol *sp, object **op)
+{
+ return di.get(sp, (void **)op);
+}
diff --git a/src/roff/troff/div.cpp b/src/roff/troff/div.cpp
new file mode 100644
index 0000000..d195baf
--- /dev/null
+++ b/src/roff/troff/div.cpp
@@ -0,0 +1,1212 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+// diversions
+
+#include "troff.h"
+#include "dictionary.h"
+#include "hvunits.h"
+#include "stringclass.h"
+#include "mtsm.h"
+#include "env.h"
+#include "request.h"
+#include "node.h"
+#include "token.h"
+#include "div.h"
+#include "reg.h"
+
+#include "nonposix.h"
+
+bool is_exit_underway = false;
+bool is_eoi_macro_finished = false;
+bool seen_last_page_ejector = false;
+static bool began_page_in_eoi_macro = false;
+int last_page_number = 0; // if > 0, the number of the last page
+ // specified with -o
+
+static int last_post_line_extra_space = 0; // needed for \n(.a
+static int nl_reg_contents = -1;
+static int dl_reg_contents = 0;
+static int dn_reg_contents = 0;
+static int vertical_position_traps_flag = 1;
+static vunits truncated_space;
+static vunits needed_space;
+
+diversion::diversion(symbol s)
+: prev(0), nm(s), vertical_position(V0), high_water_mark(V0),
+ any_chars_added(0), no_space_mode(0), needs_push(0), saved_seen_break(0),
+ saved_seen_space(0), saved_seen_eol(0), saved_suppress_next_eol(0),
+ marked_place(V0)
+{
+}
+
+struct vertical_size {
+ vunits pre_extra, post_extra, pre, post;
+ vertical_size(vunits vs, vunits post_vs);
+};
+
+vertical_size::vertical_size(vunits vs, vunits post_vs)
+: pre_extra(V0), post_extra(V0), pre(vs), post(post_vs)
+{
+}
+
+void node::set_vertical_size(vertical_size *)
+{
+}
+
+void extra_size_node::set_vertical_size(vertical_size *v)
+{
+ if (n < V0) {
+ if (-n > v->pre_extra)
+ v->pre_extra = -n;
+ }
+ else if (n > v->post_extra)
+ v->post_extra = n;
+}
+
+void vertical_size_node::set_vertical_size(vertical_size *v)
+{
+ if (n < V0)
+ v->pre = -n;
+ else
+ v->post = n;
+}
+
+top_level_diversion *topdiv;
+
+diversion *curdiv;
+
+void do_divert(int append, int boxing)
+{
+ tok.skip();
+ symbol nm = get_name();
+ if (nm.is_null()) {
+ if (curdiv->prev) {
+ curenv->seen_break = curdiv->saved_seen_break;
+ curenv->seen_space = curdiv->saved_seen_space;
+ curenv->seen_eol = curdiv->saved_seen_eol;
+ curenv->suppress_next_eol = curdiv->saved_suppress_next_eol;
+ if (boxing) {
+ curenv->line = curdiv->saved_line;
+ curenv->width_total = curdiv->saved_width_total;
+ curenv->space_total = curdiv->saved_space_total;
+ curenv->saved_indent = curdiv->saved_saved_indent;
+ curenv->target_text_length = curdiv->saved_target_text_length;
+ curenv->prev_line_interrupted = curdiv->saved_prev_line_interrupted;
+ }
+ diversion *temp = curdiv;
+ curdiv = curdiv->prev;
+ delete temp;
+ }
+ else
+ warning(WARN_DI, "diversion stack underflow");
+ }
+ else {
+ macro_diversion *md = new macro_diversion(nm, append);
+ md->prev = curdiv;
+ curdiv = md;
+ curdiv->saved_seen_break = curenv->seen_break;
+ curdiv->saved_seen_space = curenv->seen_space;
+ curdiv->saved_seen_eol = curenv->seen_eol;
+ curdiv->saved_suppress_next_eol = curenv->suppress_next_eol;
+ curenv->seen_break = 0;
+ curenv->seen_space = 0;
+ curenv->seen_eol = 0;
+ if (boxing) {
+ curdiv->saved_line = curenv->line;
+ curdiv->saved_width_total = curenv->width_total;
+ curdiv->saved_space_total = curenv->space_total;
+ curdiv->saved_saved_indent = curenv->saved_indent;
+ curdiv->saved_target_text_length = curenv->target_text_length;
+ curdiv->saved_prev_line_interrupted = curenv->prev_line_interrupted;
+ curenv->line = 0;
+ curenv->start_line();
+ }
+ }
+ skip_line();
+}
+
+void divert()
+{
+ do_divert(0, 0);
+}
+
+void divert_append()
+{
+ do_divert(1, 0);
+}
+
+void box()
+{
+ do_divert(0, 1);
+}
+
+void box_append()
+{
+ do_divert(1, 1);
+}
+
+void diversion::need(vunits n)
+{
+ vunits d = distance_to_next_trap();
+ if (d < n) {
+ truncated_space = -d;
+ needed_space = n;
+ space(d, 1);
+ }
+}
+
+macro_diversion::macro_diversion(symbol s, int append)
+: diversion(s), max_width(H0)
+{
+#if 0
+ if (append) {
+ /* We don't allow recursive appends, e.g.:
+
+ .da a
+ .a
+ .di
+
+ This causes an infinite loop in troff anyway.
+ This is because the user could do
+
+ .as a foo
+
+ in the diversion, and this would mess things up royally,
+ since there would be two things appending to the same
+ macro_header.
+ To make it work, we would have to copy the _contents_
+ of the macro into which we were diverting; this doesn't
+ strike me as worthwhile.
+ However,
+
+ .di a
+ .a
+ .a
+ .di
+
+ will work and will make 'a' contain two copies of what it contained
+ before; in troff, 'a' would contain nothing. */
+ request_or_macro *rm
+ = (request_or_macro *)request_dictionary.remove(s);
+ if (!rm || (mac = rm->to_macro()) == 0)
+ mac = new macro;
+ }
+ else
+ mac = new macro;
+#endif
+ // We can now catch the situation described above by comparing
+ // the length of the charlist in the macro_header with the length
+ // stored in the macro. When we detect this, we copy the contents.
+ mac = new macro(1);
+ if (append) {
+ request_or_macro *rm
+ = (request_or_macro *)request_dictionary.lookup(s);
+ if (rm) {
+ macro *m = rm->to_macro();
+ if (m)
+ *mac = *m;
+ }
+ }
+}
+
+macro_diversion::~macro_diversion()
+{
+ request_or_macro *rm = (request_or_macro *)request_dictionary.lookup(nm);
+ macro *m = rm ? rm->to_macro() : 0;
+ if (m) {
+ *m = *mac;
+ delete mac;
+ }
+ else
+ request_dictionary.define(nm, mac);
+ mac = 0;
+ dl_reg_contents = max_width.to_units();
+ dn_reg_contents = vertical_position.to_units();
+}
+
+vunits macro_diversion::distance_to_next_trap()
+{
+ if (!diversion_trap.is_null() && diversion_trap_pos > vertical_position)
+ return diversion_trap_pos - vertical_position;
+ else
+ // Subtract vresolution so that vunits::vunits does not overflow.
+ return vunits(INT_MAX - vresolution);
+}
+
+void macro_diversion::transparent_output(unsigned char c)
+{
+ mac->append(c);
+}
+
+void macro_diversion::transparent_output(node *n)
+{
+ mac->append(n);
+}
+
+void macro_diversion::output(node *nd, int retain_size,
+ vunits vs, vunits post_vs, hunits width)
+{
+ no_space_mode = 0;
+ vertical_size v(vs, post_vs);
+ while (nd != 0) {
+ nd->set_vertical_size(&v);
+ node *temp = nd;
+ nd = nd->next;
+ if (temp->interpret(mac))
+ delete temp;
+ else {
+#if 1
+ temp->freeze_space();
+#endif
+ mac->append(temp);
+ }
+ }
+ last_post_line_extra_space = v.post_extra.to_units();
+ if (!retain_size) {
+ v.pre = vs;
+ v.post = post_vs;
+ }
+ if (width > max_width)
+ max_width = width;
+ vunits x = v.pre + v.pre_extra + v.post + v.post_extra;
+ if (vertical_position_traps_flag
+ && !diversion_trap.is_null() && diversion_trap_pos > vertical_position
+ && diversion_trap_pos <= vertical_position + x) {
+ vunits trunc = vertical_position + x - diversion_trap_pos;
+ if (trunc > v.post)
+ trunc = v.post;
+ v.post -= trunc;
+ x -= trunc;
+ truncated_space = trunc;
+ spring_trap(diversion_trap);
+ }
+ mac->append(new vertical_size_node(-v.pre));
+ mac->append(new vertical_size_node(v.post));
+ mac->append('\n');
+ vertical_position += x;
+ if (vertical_position - v.post > high_water_mark)
+ high_water_mark = vertical_position - v.post;
+}
+
+void macro_diversion::space(vunits n, int)
+{
+ if (vertical_position_traps_flag
+ && !diversion_trap.is_null() && diversion_trap_pos > vertical_position
+ && diversion_trap_pos <= vertical_position + n) {
+ truncated_space = vertical_position + n - diversion_trap_pos;
+ n = diversion_trap_pos - vertical_position;
+ spring_trap(diversion_trap);
+ }
+ else if (n + vertical_position < V0)
+ n = -vertical_position;
+ mac->append(new diverted_space_node(n));
+ vertical_position += n;
+}
+
+void macro_diversion::copy_file(const char *filename)
+{
+ mac->append(new diverted_copy_file_node(filename));
+}
+
+top_level_diversion::top_level_diversion()
+: page_number(0), page_count(0), last_page_count(-1),
+ page_length(units_per_inch*11),
+ prev_page_offset(units_per_inch), page_offset(units_per_inch),
+ page_trap_list(0), have_next_page_number(0),
+ ejecting_page(0), before_first_page(1)
+{
+}
+
+// find the next trap after pos
+
+trap *top_level_diversion::find_next_trap(vunits *next_trap_pos)
+{
+ trap *next_trap = 0;
+ for (trap *pt = page_trap_list; pt != 0; pt = pt->next)
+ if (!pt->nm.is_null()) {
+ if (pt->position >= V0) {
+ if (pt->position > vertical_position
+ && pt->position < page_length
+ && (next_trap == 0 || pt->position < *next_trap_pos)) {
+ next_trap = pt;
+ *next_trap_pos = pt->position;
+ }
+ }
+ else {
+ vunits pos = pt->position;
+ pos += page_length;
+ if (pos > 0
+ && pos > vertical_position
+ && (next_trap == 0 || pos < *next_trap_pos)) {
+ next_trap = pt;
+ *next_trap_pos = pos;
+ }
+ }
+ }
+ return next_trap;
+}
+
+vunits top_level_diversion::distance_to_next_trap()
+{
+ vunits d;
+ if (!find_next_trap(&d))
+ return page_length - vertical_position;
+ else
+ return d - vertical_position;
+}
+
+void top_level_diversion::output(node *nd, int retain_size,
+ vunits vs, vunits post_vs, hunits width)
+{
+ no_space_mode = 0;
+ vunits next_trap_pos;
+ trap *next_trap = find_next_trap(&next_trap_pos);
+ if (before_first_page && begin_page())
+ fatal("sorry, I didn't manage to begin the first page in time: use an explicit .br request");
+ vertical_size v(vs, post_vs);
+ for (node *tem = nd; tem != 0; tem = tem->next)
+ tem->set_vertical_size(&v);
+ last_post_line_extra_space = v.post_extra.to_units();
+ if (!retain_size) {
+ v.pre = vs;
+ v.post = post_vs;
+ }
+ vertical_position += v.pre;
+ vertical_position += v.pre_extra;
+ the_output->print_line(page_offset, vertical_position, nd,
+ v.pre + v.pre_extra, v.post_extra, width);
+ vertical_position += v.post_extra;
+ if (vertical_position > high_water_mark)
+ high_water_mark = vertical_position;
+ if (vertical_position_traps_flag && vertical_position >= page_length)
+ begin_page();
+ else if (vertical_position_traps_flag
+ && next_trap != 0 && vertical_position >= next_trap_pos) {
+ nl_reg_contents = vertical_position.to_units();
+ truncated_space = v.post;
+ spring_trap(next_trap->nm);
+ }
+ else if (v.post > V0) {
+ vertical_position += v.post;
+ if (vertical_position_traps_flag
+ && next_trap != 0 && vertical_position >= next_trap_pos) {
+ truncated_space = vertical_position - next_trap_pos;
+ vertical_position = next_trap_pos;
+ nl_reg_contents = vertical_position.to_units();
+ spring_trap(next_trap->nm);
+ }
+ else if (vertical_position_traps_flag && vertical_position >= page_length)
+ begin_page();
+ else
+ nl_reg_contents = vertical_position.to_units();
+ }
+ else
+ nl_reg_contents = vertical_position.to_units();
+}
+
+void top_level_diversion::transparent_output(unsigned char c)
+{
+ if (before_first_page && begin_page())
+ // This can only happen with the .output request.
+ fatal("sorry, I didn't manage to begin the first page in time: use an explicit .br request");
+ const char *s = asciify(c);
+ while (*s)
+ the_output->transparent_char(*s++);
+}
+
+void top_level_diversion::transparent_output(node * /*n*/)
+{
+ if (getenv("GROFF_ENABLE_TRANSPARENCY_WARNINGS") != 0 /* nullptr */)
+ error("can't transparently output node at top level");
+}
+
+void top_level_diversion::copy_file(const char *filename)
+{
+ if (before_first_page && begin_page())
+ fatal("sorry, I didn't manage to begin the first page in time: use an explicit .br request");
+ the_output->copy_file(page_offset, vertical_position, filename);
+}
+
+void top_level_diversion::space(vunits n, int forced)
+{
+ if (no_space_mode) {
+ if (!forced)
+ return;
+ else
+ no_space_mode = 0;
+ }
+ if (before_first_page) {
+ begin_page(n);
+ return;
+ }
+ vunits next_trap_pos;
+ trap *next_trap = find_next_trap(&next_trap_pos);
+ vunits y = vertical_position + n;
+ if (curenv->get_vertical_spacing().to_units())
+ curenv->seen_space += n.to_units()
+ / curenv->get_vertical_spacing().to_units();
+ if (vertical_position_traps_flag && next_trap != 0 && y >= next_trap_pos) {
+ vertical_position = next_trap_pos;
+ nl_reg_contents = vertical_position.to_units();
+ truncated_space = y - vertical_position;
+ spring_trap(next_trap->nm);
+ }
+ else if (y < V0) {
+ vertical_position = V0;
+ nl_reg_contents = vertical_position.to_units();
+ }
+ else if (vertical_position_traps_flag && y >= page_length && n >= V0)
+ begin_page(y - page_length);
+ else {
+ vertical_position = y;
+ nl_reg_contents = vertical_position.to_units();
+ }
+}
+
+trap::trap(symbol s, vunits n, trap *p)
+: next(p), position(n), nm(s)
+{
+}
+
+void top_level_diversion::add_trap(symbol nam, vunits pos)
+{
+ trap *first_free_slot = 0;
+ trap **p;
+ for (p = &page_trap_list; *p; p = &(*p)->next) {
+ if ((*p)->nm.is_null()) {
+ if (first_free_slot == 0)
+ first_free_slot = *p;
+ }
+ else if ((*p)->position == pos) {
+ (*p)->nm = nam;
+ return;
+ }
+ }
+ if (first_free_slot) {
+ first_free_slot->nm = nam;
+ first_free_slot->position = pos;
+ }
+ else
+ *p = new trap(nam, pos, 0);
+}
+
+void top_level_diversion::remove_trap(symbol nam)
+{
+ for (trap *p = page_trap_list; p; p = p->next)
+ if (p->nm == nam) {
+ p->nm = NULL_SYMBOL;
+ return;
+ }
+}
+
+void top_level_diversion::remove_trap_at(vunits pos)
+{
+ for (trap *p = page_trap_list; p; p = p->next)
+ if (p->position == pos) {
+ p->nm = NULL_SYMBOL;
+ return;
+ }
+}
+
+void top_level_diversion::change_trap(symbol nam, vunits pos)
+{
+ for (trap *p = page_trap_list; p; p = p->next)
+ if (p->nm == nam) {
+ p->position = pos;
+ return;
+ }
+ warning(WARN_MAC, "cannot move unplanted trap macro '%1'",
+ nam.contents());
+}
+
+void top_level_diversion::print_traps()
+{
+ for (trap *p = page_trap_list; p; p = p->next)
+ if (p->nm.is_null())
+ fprintf(stderr, " empty\n");
+ else
+ fprintf(stderr, "%s\t%d\n", p->nm.contents(), p->position.to_units());
+ fflush(stderr);
+}
+
+void end_diversions()
+{
+ while (curdiv != topdiv) {
+ error("automatically ending diversion '%1' on exit",
+ curdiv->nm.contents());
+ diversion *tem = curdiv;
+ curdiv = curdiv->prev;
+ delete tem;
+ }
+}
+
+void cleanup_and_exit(int exit_code)
+{
+ if (the_output) {
+ the_output->trailer(topdiv->get_page_length());
+ // If we're already dying, don't call the_output's destructor. See
+ // node.cpp:real_output_file::~real_output_file().
+ if (!the_output->is_dying)
+ delete the_output;
+ }
+ FLUSH_INPUT_PIPE(STDIN_FILENO);
+ exit(exit_code);
+}
+
+// Returns non-zero if it sprung a top-of-page trap.
+// The optional parameter is for the .trunc register.
+int top_level_diversion::begin_page(vunits n)
+{
+ if (is_exit_underway) {
+ if (page_count == last_page_count
+ ? curenv->is_empty()
+ : (is_eoi_macro_finished && (seen_last_page_ejector
+ || began_page_in_eoi_macro)))
+ cleanup_and_exit(EXIT_SUCCESS);
+ if (!is_eoi_macro_finished)
+ began_page_in_eoi_macro = true;
+ }
+ if (last_page_number > 0 && page_number == last_page_number)
+ cleanup_and_exit(EXIT_SUCCESS);
+ if (!the_output)
+ init_output();
+ ++page_count;
+ if (have_next_page_number) {
+ page_number = next_page_number;
+ have_next_page_number = 0;
+ }
+ else if (before_first_page == 1)
+ page_number = 1;
+ else
+ page_number++;
+ // spring the top of page trap if there is one
+ vunits next_trap_pos;
+ vertical_position = -vresolution;
+ trap *next_trap = find_next_trap(&next_trap_pos);
+ vertical_position = V0;
+ high_water_mark = V0;
+ ejecting_page = 0;
+ // If before_first_page was 2, then the top of page transition was undone
+ // using eg .nr nl 0-1. See nl_reg::set_value.
+ if (before_first_page != 2)
+ the_output->begin_page(page_number, page_length);
+ before_first_page = 0;
+ nl_reg_contents = vertical_position.to_units();
+ if (vertical_position_traps_flag && next_trap != 0 && next_trap_pos == V0) {
+ truncated_space = n;
+ spring_trap(next_trap->nm);
+ return 1;
+ }
+ else
+ return 0;
+}
+
+void continue_page_eject()
+{
+ if (topdiv->get_ejecting()) {
+ if (curdiv != topdiv)
+ error("can't continue page ejection because of current diversion");
+ else if (!vertical_position_traps_flag)
+ error("can't continue page ejection because vertical position traps disabled");
+ else {
+ push_page_ejector();
+ topdiv->space(topdiv->get_page_length(), 1);
+ }
+ }
+}
+
+void top_level_diversion::set_next_page_number(int n)
+{
+ next_page_number= n;
+ have_next_page_number = 1;
+}
+
+int top_level_diversion::get_next_page_number()
+{
+ return have_next_page_number ? next_page_number : page_number + 1;
+}
+
+void top_level_diversion::set_page_length(vunits n)
+{
+ page_length = n;
+}
+
+diversion::~diversion()
+{
+}
+
+void page_offset()
+{
+ hunits n;
+ // The troff manual says that the default scaling indicator is v,
+ // but it is in fact m: v wouldn't make sense for a horizontally
+ // oriented request.
+ if (!has_arg() || !get_hunits(&n, 'm', topdiv->page_offset))
+ n = topdiv->prev_page_offset;
+ topdiv->prev_page_offset = topdiv->page_offset;
+ topdiv->page_offset = n;
+ topdiv->modified_tag.incl(MTSM_PO);
+ skip_line();
+}
+
+void page_length()
+{
+ vunits n;
+ if (has_arg() && get_vunits(&n, 'v', topdiv->get_page_length()))
+ topdiv->set_page_length(n);
+ else
+ topdiv->set_page_length(11*units_per_inch);
+ skip_line();
+}
+
+void when_request()
+{
+ vunits n;
+ if (get_vunits(&n, 'v')) {
+ symbol s = get_name();
+ if (s.is_null())
+ topdiv->remove_trap_at(n);
+ else
+ topdiv->add_trap(s, n);
+ }
+ skip_line();
+}
+
+void begin_page()
+{
+ int got_arg = 0;
+ int n = 0; /* pacify compiler */
+ if (has_arg() && get_integer(&n, topdiv->get_page_number()))
+ got_arg = 1;
+ while (!tok.is_newline() && !tok.is_eof())
+ tok.next();
+ if (curdiv == topdiv) {
+ if (topdiv->before_first_page) {
+ if (!break_flag) {
+ if (got_arg)
+ topdiv->set_next_page_number(n);
+ if (got_arg || !topdiv->no_space_mode)
+ topdiv->begin_page();
+ }
+ else if (topdiv->no_space_mode && !got_arg)
+ topdiv->begin_page();
+ else {
+ /* Given this
+
+ .wh 0 x
+ .de x
+ .tm \\n%
+ ..
+ .bp 3
+
+ troff prints
+
+ 1
+ 3
+
+ This code makes groff do the same. */
+
+ push_page_ejector();
+ topdiv->begin_page();
+ if (got_arg)
+ topdiv->set_next_page_number(n);
+ topdiv->set_ejecting();
+ }
+ }
+ else {
+ push_page_ejector();
+ if (break_flag)
+ curenv->do_break();
+ if (got_arg)
+ topdiv->set_next_page_number(n);
+ if (!(topdiv->no_space_mode && !got_arg))
+ topdiv->set_ejecting();
+ }
+ }
+ tok.next();
+}
+
+void no_space()
+{
+ curdiv->no_space_mode = 1;
+ skip_line();
+}
+
+void restore_spacing()
+{
+ curdiv->no_space_mode = 0;
+ skip_line();
+}
+
+/* It is necessary to generate a break before reading the argument,
+because otherwise arguments using | will be wrong. But if we just
+generate a break as usual, then the line forced out may spring a trap
+and thus push a macro onto the input stack before we have had a chance
+to read the argument to the sp request. We resolve this dilemma by
+setting, before generating the break, a flag which will postpone the
+actual pushing of the macro associated with the trap sprung by the
+outputting of the line forced out by the break till after we have read
+the argument to the request. If the break did cause a trap to be
+sprung, then we don't actually do the space. */
+
+void space_request()
+{
+ postpone_traps();
+ if (break_flag)
+ curenv->do_break();
+ vunits n;
+ if (!has_arg() || !get_vunits(&n, 'v'))
+ n = curenv->get_vertical_spacing();
+ while (!tok.is_newline() && !tok.is_eof())
+ tok.next();
+ if (!unpostpone_traps() && !curdiv->no_space_mode)
+ curdiv->space(n);
+ else
+ // The line might have had line spacing that was truncated.
+ truncated_space += n;
+
+ tok.next();
+}
+
+void blank_line()
+{
+ curenv->do_break();
+ if (!trap_sprung_flag && !curdiv->no_space_mode)
+ curdiv->space(curenv->get_vertical_spacing());
+ else
+ truncated_space += curenv->get_vertical_spacing();
+}
+
+/* need_space might spring a trap and so we must be careful that the
+BEGIN_TRAP token is not skipped over. */
+
+void need_space()
+{
+ vunits n;
+ if (!has_arg() || !get_vunits(&n, 'v'))
+ n = curenv->get_vertical_spacing();
+ while (!tok.is_newline() && !tok.is_eof())
+ tok.next();
+ curdiv->need(n);
+ tok.next();
+}
+
+void page_number()
+{
+ int n;
+
+ // the ps4html register is set if we are using -Tps
+ // to generate images for html
+ // XXX: Yuck! Get rid of this; macro packages already test the
+ // register before invoking .pn.
+ reg *r = (reg *)register_dictionary.lookup("ps4html");
+ if (r == NULL)
+ if (has_arg() && get_integer(&n, topdiv->get_page_number()))
+ topdiv->set_next_page_number(n);
+ skip_line();
+}
+
+vunits saved_space;
+
+void save_vertical_space()
+{
+ vunits x;
+ if (!has_arg() || !get_vunits(&x, 'v'))
+ x = curenv->get_vertical_spacing();
+ if (curdiv->distance_to_next_trap() > x)
+ curdiv->space(x, 1);
+ else
+ saved_space = x;
+ skip_line();
+}
+
+void output_saved_vertical_space()
+{
+ while (!tok.is_newline() && !tok.is_eof())
+ tok.next();
+ if (saved_space > V0)
+ curdiv->space(saved_space, 1);
+ saved_space = V0;
+ tok.next();
+}
+
+void flush_output()
+{
+ while (!tok.is_newline() && !tok.is_eof())
+ tok.next();
+ if (break_flag)
+ curenv->do_break();
+ if (the_output)
+ the_output->flush();
+ tok.next();
+}
+
+void macro_diversion::set_diversion_trap(symbol s, vunits n)
+{
+ diversion_trap = s;
+ diversion_trap_pos = n;
+}
+
+void macro_diversion::clear_diversion_trap()
+{
+ diversion_trap = NULL_SYMBOL;
+}
+
+void top_level_diversion::set_diversion_trap(symbol, vunits)
+{
+ error("can't set diversion trap when no current diversion");
+}
+
+void top_level_diversion::clear_diversion_trap()
+{
+ error("can't clear diversion trap when no current diversion");
+}
+
+void diversion_trap()
+{
+ vunits n;
+ if (has_arg() && get_vunits(&n, 'v')) {
+ symbol s = get_name();
+ if (!s.is_null())
+ curdiv->set_diversion_trap(s, n);
+ else
+ curdiv->clear_diversion_trap();
+ }
+ else
+ curdiv->clear_diversion_trap();
+ skip_line();
+}
+
+void change_trap()
+{
+ symbol s = get_name(true /* required */);
+ if (!s.is_null()) {
+ vunits x;
+ if (has_arg() && get_vunits(&x, 'v'))
+ topdiv->change_trap(s, x);
+ else
+ topdiv->remove_trap(s);
+ }
+ skip_line();
+}
+
+void print_traps()
+{
+ topdiv->print_traps();
+ skip_line();
+}
+
+void mark()
+{
+ symbol s = get_name();
+ if (s.is_null())
+ curdiv->marked_place = curdiv->get_vertical_position();
+ else if (curdiv == topdiv)
+ set_number_reg(s, nl_reg_contents);
+ else
+ set_number_reg(s, curdiv->get_vertical_position().to_units());
+ skip_line();
+}
+
+// This is truly bizarre. It is documented in the SQ manual.
+
+void return_request()
+{
+ vunits dist = curdiv->marked_place - curdiv->get_vertical_position();
+ if (has_arg()) {
+ if (tok.ch() == '-') {
+ tok.next();
+ vunits x;
+ if (get_vunits(&x, 'v'))
+ dist = -x;
+ }
+ else {
+ vunits x;
+ if (get_vunits(&x, 'v'))
+ dist = x >= V0 ? x - curdiv->get_vertical_position() : V0;
+ }
+ }
+ if (dist < V0)
+ curdiv->space(dist);
+ skip_line();
+}
+
+void vertical_position_traps()
+{
+ int n;
+ if (has_arg() && get_integer(&n))
+ vertical_position_traps_flag = (n != 0);
+ else
+ vertical_position_traps_flag = 1;
+ skip_line();
+}
+
+class page_offset_reg : public reg {
+public:
+ bool get_value(units *);
+ const char *get_string();
+};
+
+bool page_offset_reg::get_value(units *res)
+{
+ *res = topdiv->get_page_offset().to_units();
+ return true;
+}
+
+const char *page_offset_reg::get_string()
+{
+ return i_to_a(topdiv->get_page_offset().to_units());
+}
+
+class page_length_reg : public reg {
+public:
+ bool get_value(units *);
+ const char *get_string();
+};
+
+bool page_length_reg::get_value(units *res)
+{
+ *res = topdiv->get_page_length().to_units();
+ return true;
+}
+
+const char *page_length_reg::get_string()
+{
+ return i_to_a(topdiv->get_page_length().to_units());
+}
+
+class vertical_position_reg : public reg {
+public:
+ bool get_value(units *);
+ const char *get_string();
+};
+
+bool vertical_position_reg::get_value(units *res)
+{
+ if (curdiv == topdiv && topdiv->before_first_page)
+ *res = -1;
+ else
+ *res = curdiv->get_vertical_position().to_units();
+ return true;
+}
+
+const char *vertical_position_reg::get_string()
+{
+ if (curdiv == topdiv && topdiv->before_first_page)
+ return "-1";
+ else
+ return i_to_a(curdiv->get_vertical_position().to_units());
+}
+
+class high_water_mark_reg : public reg {
+public:
+ bool get_value(units *);
+ const char *get_string();
+};
+
+bool high_water_mark_reg::get_value(units *res)
+{
+ *res = curdiv->get_high_water_mark().to_units();
+ return true;
+}
+
+const char *high_water_mark_reg::get_string()
+{
+ return i_to_a(curdiv->get_high_water_mark().to_units());
+}
+
+class distance_to_next_trap_reg : public reg {
+public:
+ bool get_value(units *);
+ const char *get_string();
+};
+
+bool distance_to_next_trap_reg::get_value(units *res)
+{
+ *res = curdiv->distance_to_next_trap().to_units();
+ return true;
+}
+
+const char *distance_to_next_trap_reg::get_string()
+{
+ return i_to_a(curdiv->distance_to_next_trap().to_units());
+}
+
+class diversion_name_reg : public reg {
+public:
+ const char *get_string();
+};
+
+const char *diversion_name_reg::get_string()
+{
+ return curdiv->get_diversion_name();
+}
+
+class page_number_reg : public general_reg {
+public:
+ page_number_reg();
+ bool get_value(units *);
+ void set_value(units);
+};
+
+page_number_reg::page_number_reg()
+{
+}
+
+void page_number_reg::set_value(units n)
+{
+ topdiv->set_page_number(n);
+}
+
+bool page_number_reg::get_value(units *res)
+{
+ *res = topdiv->get_page_number();
+ return true;
+}
+
+class next_page_number_reg : public reg {
+public:
+ const char *get_string();
+};
+
+const char *next_page_number_reg::get_string()
+{
+ return i_to_a(topdiv->get_next_page_number());
+}
+
+class page_ejecting_reg : public reg {
+public:
+ const char *get_string();
+};
+
+const char *page_ejecting_reg::get_string()
+{
+ return i_to_a(topdiv->get_ejecting());
+}
+
+class constant_vunits_reg : public reg {
+ vunits *p;
+public:
+ constant_vunits_reg(vunits *);
+ const char *get_string();
+};
+
+constant_vunits_reg::constant_vunits_reg(vunits *q) : p(q)
+{
+}
+
+const char *constant_vunits_reg::get_string()
+{
+ return i_to_a(p->to_units());
+}
+
+class nl_reg : public variable_reg {
+public:
+ nl_reg();
+ void set_value(units);
+};
+
+nl_reg::nl_reg() : variable_reg(&nl_reg_contents)
+{
+}
+
+void nl_reg::set_value(units n)
+{
+ variable_reg::set_value(n);
+ // Setting nl to a negative value when the vertical position in
+ // the top-level diversion is 0 undoes the top of page transition,
+ // so that the header macro will be called as if the top of page
+ // transition hasn't happened. This is used by Larry Wall's
+ // wrapman program. Setting before_first_page to 2 rather than 1,
+ // tells top_level_diversion::begin_page not to call
+ // output_file::begin_page again.
+ if (n < 0 && topdiv->get_vertical_position() == V0)
+ topdiv->before_first_page = 2;
+}
+
+class no_space_mode_reg : public reg {
+public:
+ bool get_value(units *);
+ const char *get_string();
+};
+
+bool no_space_mode_reg::get_value(units *val)
+{
+ *val = curdiv->no_space_mode;
+ return true;
+}
+
+const char *no_space_mode_reg::get_string()
+{
+ return curdiv->no_space_mode ? "1" : "0";
+}
+
+void init_div_requests()
+{
+ init_request("box", box);
+ init_request("boxa", box_append);
+ init_request("bp", begin_page);
+ init_request("ch", change_trap);
+ init_request("da", divert_append);
+ init_request("di", divert);
+ init_request("dt", diversion_trap);
+ init_request("fl", flush_output);
+ init_request("mk", mark);
+ init_request("ne", need_space);
+ init_request("ns", no_space);
+ init_request("os", output_saved_vertical_space);
+ init_request("pl", page_length);
+ init_request("pn", page_number);
+ init_request("po", page_offset);
+ init_request("ptr", print_traps);
+ init_request("rs", restore_spacing);
+ init_request("rt", return_request);
+ init_request("sp", space_request);
+ init_request("sv", save_vertical_space);
+ init_request("vpt", vertical_position_traps);
+ init_request("wh", when_request);
+ register_dictionary.define(".a",
+ new readonly_register(&last_post_line_extra_space));
+ register_dictionary.define(".d", new vertical_position_reg);
+ register_dictionary.define(".h", new high_water_mark_reg);
+ register_dictionary.define(".ne",
+ new constant_vunits_reg(&needed_space));
+ register_dictionary.define(".ns", new no_space_mode_reg);
+ register_dictionary.define(".o", new page_offset_reg);
+ register_dictionary.define(".p", new page_length_reg);
+ register_dictionary.define(".pe", new page_ejecting_reg);
+ register_dictionary.define(".pn", new next_page_number_reg);
+ register_dictionary.define(".t", new distance_to_next_trap_reg);
+ register_dictionary.define(".trunc",
+ new constant_vunits_reg(&truncated_space));
+ register_dictionary.define(".vpt",
+ new readonly_register(&vertical_position_traps_flag));
+ register_dictionary.define(".z", new diversion_name_reg);
+ register_dictionary.define("dl", new variable_reg(&dl_reg_contents));
+ register_dictionary.define("dn", new variable_reg(&dn_reg_contents));
+ register_dictionary.define("nl", new nl_reg);
+ register_dictionary.define("%", new page_number_reg);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/roff/troff/div.h b/src/roff/troff/div.h
new file mode 100644
index 0000000..15c7807
--- /dev/null
+++ b/src/roff/troff/div.h
@@ -0,0 +1,175 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+void do_divert(int append, int boxing);
+void end_diversions();
+void page_offset();
+
+class diversion {
+ friend void do_divert(int append, int boxing);
+ friend void end_diversions();
+ diversion *prev;
+ node *saved_line;
+ hunits saved_width_total;
+ int saved_space_total;
+ hunits saved_saved_indent;
+ hunits saved_target_text_length;
+ int saved_prev_line_interrupted;
+protected:
+ symbol nm;
+ vunits vertical_position;
+ vunits high_water_mark;
+public:
+ int any_chars_added;
+ int no_space_mode;
+ int needs_push;
+ int saved_seen_break;
+ int saved_seen_space;
+ int saved_seen_eol;
+ int saved_suppress_next_eol;
+ state_set modified_tag;
+ vunits marked_place;
+ diversion(symbol s = NULL_SYMBOL);
+ virtual ~diversion();
+ virtual void output(node *nd, int retain_size, vunits vs, vunits post_vs,
+ hunits width) = 0;
+ virtual void transparent_output(unsigned char) = 0;
+ virtual void transparent_output(node *) = 0;
+ virtual void space(vunits distance, int forced = 0) = 0;
+#ifdef COLUMN
+ virtual void vjustify(symbol) = 0;
+#endif /* COLUMN */
+ vunits get_vertical_position() { return vertical_position; }
+ vunits get_high_water_mark() { return high_water_mark; }
+ virtual vunits distance_to_next_trap() = 0;
+ void need(vunits);
+ const char *get_diversion_name() { return nm.contents(); }
+ virtual void set_diversion_trap(symbol, vunits) = 0;
+ virtual void clear_diversion_trap() = 0;
+ virtual void copy_file(const char *filename) = 0;
+ virtual int is_diversion() = 0;
+};
+
+class macro;
+
+class macro_diversion : public diversion {
+ macro *mac;
+ hunits max_width;
+ symbol diversion_trap;
+ vunits diversion_trap_pos;
+public:
+ macro_diversion(symbol, int);
+ ~macro_diversion();
+ void output(node *nd, int retain_size, vunits vs, vunits post_vs,
+ hunits width);
+ void transparent_output(unsigned char);
+ void transparent_output(node *);
+ void space(vunits distance, int forced = 0);
+#ifdef COLUMN
+ void vjustify(symbol);
+#endif /* COLUMN */
+ vunits distance_to_next_trap();
+ void set_diversion_trap(symbol, vunits);
+ void clear_diversion_trap();
+ void copy_file(const char *filename);
+ int is_diversion() { return 1; }
+};
+
+struct trap {
+ trap *next;
+ vunits position;
+ symbol nm;
+ trap(symbol, vunits, trap *);
+};
+
+class output_file;
+
+class top_level_diversion : public diversion {
+ int page_number;
+ int page_count;
+ int last_page_count;
+ vunits page_length;
+ hunits prev_page_offset;
+ hunits page_offset;
+ trap *page_trap_list;
+ trap *find_next_trap(vunits *);
+ int have_next_page_number;
+ int next_page_number;
+ int ejecting_page; // Is the current page being ejected?
+public:
+ int before_first_page;
+ top_level_diversion();
+ void output(node *nd, int retain_size, vunits vs, vunits post_vs,
+ hunits width);
+ void transparent_output(unsigned char);
+ void transparent_output(node *);
+ void space(vunits distance, int forced = 0);
+#ifdef COLUMN
+ void vjustify(symbol);
+#endif /* COLUMN */
+ hunits get_page_offset() { return page_offset; }
+ vunits get_page_length() { return page_length; }
+ vunits distance_to_next_trap();
+ void add_trap(symbol nm, vunits pos);
+ void change_trap(symbol nm, vunits pos);
+ void remove_trap(symbol);
+ void remove_trap_at(vunits pos);
+ void print_traps();
+ int get_page_count() { return page_count; }
+ int get_page_number() { return page_number; }
+ int get_next_page_number();
+ void set_page_number(int n) { page_number = n; }
+ int begin_page(vunits = V0);
+ void set_next_page_number(int);
+ void set_page_length(vunits);
+ void copy_file(const char *filename);
+ int get_ejecting() { return ejecting_page; }
+ void set_ejecting() { ejecting_page = 1; }
+ friend void page_offset();
+ void set_diversion_trap(symbol, vunits);
+ void clear_diversion_trap();
+ void set_last_page() { last_page_count = page_count; }
+ int is_diversion() { return 0; }
+};
+
+extern top_level_diversion *topdiv;
+extern diversion *curdiv;
+
+extern bool is_exit_underway;
+extern bool is_eoi_macro_finished;
+extern bool seen_last_page_ejector;
+extern int last_page_number;
+
+void spring_trap(symbol); // implemented by input.c
+extern int trap_sprung_flag;
+void postpone_traps();
+int unpostpone_traps();
+
+void push_page_ejector();
+void continue_page_eject();
+void handle_first_page_transition();
+void blank_line();
+void begin_page();
+
+extern void cleanup_and_exit(int);
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/roff/troff/env.cpp b/src/roff/troff/env.cpp
new file mode 100644
index 0000000..9f00284
--- /dev/null
+++ b/src/roff/troff/env.cpp
@@ -0,0 +1,4138 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "troff.h"
+#include "dictionary.h"
+#include "hvunits.h"
+#include "stringclass.h"
+#include "mtsm.h"
+#include "env.h"
+#include "request.h"
+#include "node.h"
+#include "token.h"
+#include "div.h"
+#include "reg.h"
+#include "font.h"
+#include "charinfo.h"
+#include "macropath.h"
+#include "input.h"
+#include <math.h>
+
+symbol default_family("T");
+
+enum { ADJUST_LEFT = 0,
+ ADJUST_BOTH = 1,
+ ADJUST_CENTER = 3,
+ ADJUST_RIGHT = 5,
+ ADJUST_MAX = 5
+};
+
+enum {
+ // Not all combinations are valid; see hyphenate_request() below.
+ HYPHEN_NONE = 0,
+ HYPHEN_DEFAULT = 1,
+ HYPHEN_NOT_LAST_LINE = 2,
+ HYPHEN_NOT_LAST_CHARS = 4,
+ HYPHEN_NOT_FIRST_CHARS = 8,
+ HYPHEN_LAST_CHAR = 16,
+ HYPHEN_FIRST_CHAR = 32,
+ HYPHEN_MAX = 63
+};
+
+struct env_list_node {
+ environment *env;
+ env_list_node *next;
+ env_list_node(environment *e, env_list_node *p) : env(e), next(p) {}
+};
+
+env_list_node *env_stack;
+dictionary env_dictionary(10);
+environment *curenv;
+static int next_line_number = 0;
+extern int suppress_push;
+extern statem *get_diversion_state();
+
+charinfo *field_delimiter_char;
+charinfo *padding_indicator_char;
+
+int translate_space_to_dummy = 0;
+
+class pending_output_line {
+ node *nd;
+ int no_fill;
+ int was_centered;
+ vunits vs;
+ vunits post_vs;
+ hunits width;
+#ifdef WIDOW_CONTROL
+ int last_line; // Is it the last line of the paragraph?
+#endif /* WIDOW_CONTROL */
+public:
+ pending_output_line *next;
+
+ pending_output_line(node *, int, vunits, vunits, hunits, int,
+ pending_output_line * = 0);
+ ~pending_output_line();
+ int output();
+
+#ifdef WIDOW_CONTROL
+ friend void environment::mark_last_line();
+ friend void environment::output(node *, int, vunits, vunits, hunits, int);
+#endif /* WIDOW_CONTROL */
+};
+
+pending_output_line::pending_output_line(node *n, int nf, vunits v, vunits pv,
+ hunits w, int ce,
+ pending_output_line *p)
+: nd(n), no_fill(nf), was_centered(ce), vs(v), post_vs(pv), width(w),
+#ifdef WIDOW_CONTROL
+ last_line(0),
+#endif /* WIDOW_CONTROL */
+ next(p)
+{
+}
+
+pending_output_line::~pending_output_line()
+{
+ delete_node_list(nd);
+}
+
+int pending_output_line::output()
+{
+ if (trap_sprung_flag)
+ return 0;
+#ifdef WIDOW_CONTROL
+ if (next && next->last_line && !no_fill) {
+ curdiv->need(vs + post_vs + vunits(vresolution));
+ if (trap_sprung_flag) {
+ next->last_line = 0; // Try to avoid infinite loops.
+ return 0;
+ }
+ }
+#endif
+ curenv->construct_format_state(nd, was_centered, !no_fill);
+ curdiv->output(nd, no_fill, vs, post_vs, width);
+ nd = 0;
+ return 1;
+}
+
+void environment::output(node *nd, int no_fill_flag,
+ vunits vs, vunits post_vs,
+ hunits width, int was_centered)
+{
+#ifdef WIDOW_CONTROL
+ while (pending_lines) {
+ if (widow_control && !pending_lines->no_fill && !pending_lines->next)
+ break;
+ if (!pending_lines->output())
+ break;
+ pending_output_line *tem = pending_lines;
+ pending_lines = pending_lines->next;
+ delete tem;
+ }
+#else /* WIDOW_CONTROL */
+ output_pending_lines();
+#endif /* WIDOW_CONTROL */
+ if (!trap_sprung_flag && !pending_lines
+#ifdef WIDOW_CONTROL
+ && (!widow_control || no_fill_flag)
+#endif /* WIDOW_CONTROL */
+ ) {
+ curenv->construct_format_state(nd, was_centered, !no_fill_flag);
+ curdiv->output(nd, no_fill_flag, vs, post_vs, width);
+ } else {
+ pending_output_line **p;
+ for (p = &pending_lines; *p; p = &(*p)->next)
+ ;
+ *p = new pending_output_line(nd, no_fill_flag, vs, post_vs, width,
+ was_centered);
+ }
+}
+
+// a line from .tl goes at the head of the queue
+
+void environment::output_title(node *nd, int no_fill_flag,
+ vunits vs, vunits post_vs,
+ hunits width)
+{
+ if (!trap_sprung_flag)
+ curdiv->output(nd, no_fill_flag, vs, post_vs, width);
+ else
+ pending_lines = new pending_output_line(nd, no_fill_flag, vs, post_vs,
+ width, 0, pending_lines);
+}
+
+void environment::output_pending_lines()
+{
+ while (pending_lines && pending_lines->output()) {
+ pending_output_line *tem = pending_lines;
+ pending_lines = pending_lines->next;
+ delete tem;
+ }
+}
+
+#ifdef WIDOW_CONTROL
+
+void environment::mark_last_line()
+{
+ if (!widow_control || !pending_lines)
+ return;
+ pending_output_line *p;
+ for (p = pending_lines; p->next; p = p->next)
+ ;
+ if (!p->no_fill)
+ p->last_line = 1;
+}
+
+void widow_control_request()
+{
+ int n;
+ if (has_arg() && get_integer(&n))
+ curenv->widow_control = n != 0;
+ else
+ curenv->widow_control = 1;
+ skip_line();
+}
+
+#endif /* WIDOW_CONTROL */
+
+/* font_size functions */
+
+size_range *font_size::size_table = 0;
+int font_size::nranges = 0;
+
+extern "C" {
+
+int compare_ranges(const void *p1, const void *p2)
+{
+ return ((size_range *)p1)->min - ((size_range *)p2)->min;
+}
+
+}
+
+void font_size::init_size_table(int *sizes)
+{
+ nranges = 0;
+ while (sizes[nranges*2] != 0)
+ nranges++;
+ assert(nranges > 0);
+ size_table = new size_range[nranges];
+ for (int i = 0; i < nranges; i++) {
+ size_table[i].min = sizes[i*2];
+ size_table[i].max = sizes[i*2 + 1];
+ }
+ qsort(size_table, nranges, sizeof(size_range), compare_ranges);
+}
+
+font_size::font_size(int sp)
+{
+ for (int i = 0; i < nranges; i++) {
+ if (sp < size_table[i].min) {
+ if (i > 0 && size_table[i].min - sp >= sp - size_table[i - 1].max)
+ p = size_table[i - 1].max;
+ else
+ p = size_table[i].min;
+ return;
+ }
+ if (sp <= size_table[i].max) {
+ p = sp;
+ return;
+ }
+ }
+ p = size_table[nranges - 1].max;
+}
+
+int font_size::to_units()
+{
+ return scale(p, units_per_inch, sizescale*72);
+}
+
+// we can't do this in a static constructor because various dictionaries
+// have to get initialized first
+
+static symbol default_environment_name("0");
+
+void init_environments()
+{
+ curenv = new environment(default_environment_name);
+ (void)env_dictionary.lookup(default_environment_name, curenv);
+}
+
+void tab_character()
+{
+ curenv->tab_char = get_optional_char();
+ skip_line();
+}
+
+void leader_character()
+{
+ curenv->leader_char = get_optional_char();
+ skip_line();
+}
+
+void environment::add_char(charinfo *ci)
+{
+ int s;
+ node *gc_np = 0;
+ if (interrupted)
+ ;
+ // don't allow fields in dummy environments
+ else if (ci == field_delimiter_char && !dummy) {
+ if (current_field)
+ wrap_up_field();
+ else
+ start_field();
+ }
+ else if (current_field && ci == padding_indicator_char)
+ add_padding();
+ else if (current_tab) {
+ if (tab_contents == 0)
+ tab_contents = new line_start_node;
+ if (ci != hyphen_indicator_char)
+ tab_contents = tab_contents->add_char(ci, this, &tab_width, &s, &gc_np);
+ else
+ tab_contents = tab_contents->add_discretionary_hyphen();
+ }
+ else {
+ if (line == 0)
+ start_line();
+#if 0
+ fprintf(stderr, "current line is\n");
+ line->debug_node_list();
+#endif
+ if (ci != hyphen_indicator_char)
+ line = line->add_char(ci, this, &width_total, &space_total, &gc_np);
+ else
+ line = line->add_discretionary_hyphen();
+ }
+#if 0
+ fprintf(stderr, "now after we have added character the line is\n");
+ line->debug_node_list();
+#endif
+ if ((!suppress_push) && gc_np) {
+ if (gc_np && (gc_np->state == 0)) {
+ gc_np->state = construct_state(0);
+ gc_np->push_state = get_diversion_state();
+ }
+ else if (line && (line->state == 0)) {
+ line->state = construct_state(0);
+ line->push_state = get_diversion_state();
+ }
+ }
+#if 0
+ fprintf(stderr, "now we have possibly added the state the line is\n");
+ line->debug_node_list();
+#endif
+}
+
+node *environment::make_char_node(charinfo *ci)
+{
+ return make_node(ci, this);
+}
+
+void environment::add_node(node *n)
+{
+ if (n == 0)
+ return;
+ if (!suppress_push) {
+ if (n->is_special && n->state == NULL)
+ n->state = construct_state(0);
+ n->push_state = get_diversion_state();
+ }
+
+ if (current_tab || current_field)
+ n->freeze_space();
+ if (interrupted) {
+ delete n;
+ }
+ else if (current_tab) {
+ n->next = tab_contents;
+ tab_contents = n;
+ tab_width += n->width();
+ }
+ else {
+ if (line == 0) {
+ if (discarding && n->discardable()) {
+ // XXX possibly: input_line_start -= n->width();
+ delete n;
+ return;
+ }
+ start_line();
+ }
+ width_total += n->width();
+ space_total += n->nspaces();
+ n->next = line;
+ line = n;
+ construct_new_line_state(line);
+ }
+}
+
+void environment::add_hyphen_indicator()
+{
+ if (current_tab || interrupted || current_field
+ || hyphen_indicator_char != 0)
+ return;
+ if (line == 0)
+ start_line();
+ line = line->add_discretionary_hyphen();
+}
+
+int environment::get_hyphenation_flags()
+{
+ return hyphenation_flags;
+}
+
+int environment::get_hyphen_line_max()
+{
+ return hyphen_line_max;
+}
+
+int environment::get_hyphen_line_count()
+{
+ return hyphen_line_count;
+}
+
+int environment::get_center_lines()
+{
+ return center_lines;
+}
+
+int environment::get_right_justify_lines()
+{
+ return right_justify_lines;
+}
+
+int environment::get_no_number_count()
+{
+ return no_number_count;
+}
+
+void environment::add_italic_correction()
+{
+ if (current_tab) {
+ if (tab_contents)
+ tab_contents = tab_contents->add_italic_correction(&tab_width);
+ }
+ else if (line)
+ line = line->add_italic_correction(&width_total);
+}
+
+void environment::space_newline()
+{
+ assert(!current_tab && !current_field);
+ if (interrupted)
+ return;
+ hunits x = H0;
+ hunits sw = env_space_width(this);
+ hunits ssw = env_sentence_space_width(this);
+ if (!translate_space_to_dummy) {
+ x = sw;
+ if (node_list_ends_sentence(line) == 1)
+ x += ssw;
+ }
+ width_list *w = new width_list(sw, ssw);
+ if (node_list_ends_sentence(line) == 1)
+ w->next = new width_list(sw, ssw);
+ if (line != 0 && line->merge_space(x, sw, ssw)) {
+ width_total += x;
+ return;
+ }
+ add_node(new word_space_node(x, get_fill_color(), w));
+ possibly_break_line(0, spread_flag);
+ spread_flag = 0;
+}
+
+void environment::space()
+{
+ space(env_space_width(this), env_sentence_space_width(this));
+}
+
+void environment::space(hunits space_width, hunits sentence_space_width)
+{
+ if (interrupted)
+ return;
+ if (current_field && padding_indicator_char == 0) {
+ add_padding();
+ return;
+ }
+ hunits x = translate_space_to_dummy ? H0 : space_width;
+ node *p = current_tab ? tab_contents : line;
+ hunits *tp = current_tab ? &tab_width : &width_total;
+ if (p && p->nspaces() == 1 && p->width() == x
+ && node_list_ends_sentence(p->next) == 1) {
+ hunits xx = translate_space_to_dummy ? H0 : sentence_space_width;
+ if (p->merge_space(xx, space_width, sentence_space_width)) {
+ *tp += xx;
+ return;
+ }
+ }
+ if (p && p->merge_space(x, space_width, sentence_space_width)) {
+ *tp += x;
+ return;
+ }
+ add_node(new word_space_node(x,
+ get_fill_color(),
+ new width_list(space_width,
+ sentence_space_width)));
+ possibly_break_line(0, spread_flag);
+ spread_flag = 0;
+}
+
+static node *do_underline_special(bool do_underline_spaces)
+{
+ macro m;
+ m.append_str("x u ");
+ m.append(do_underline_spaces ? '1' : '0');
+ return new special_node(m, 1);
+}
+
+bool environment::set_font(symbol nm)
+{
+ if (interrupted) {
+ warning(WARN_FONT, "ignoring font selection on interrupted line");
+ return true; // "no operation" is successful
+ }
+ if (nm == symbol("P") || nm.is_empty()) {
+ if (family->make_definite(prev_fontno) < 0)
+ return false;
+ int tem = fontno;
+ fontno = prev_fontno;
+ prev_fontno = tem;
+ }
+ else {
+ prev_fontno = fontno;
+ int n = symbol_fontno(nm);
+ if (n < 0) {
+ n = next_available_font_position();
+ if (!mount_font(n, nm))
+ return false;
+ }
+ if (family->make_definite(n) < 0)
+ return false;
+ fontno = n;
+ }
+ if (underline_spaces && fontno != prev_fontno) {
+ if (fontno == get_underline_fontno())
+ add_node(do_underline_special(true));
+ if (prev_fontno == get_underline_fontno())
+ add_node(do_underline_special(false));
+ }
+ return true;
+}
+
+bool environment::set_font(int n)
+{
+ if (interrupted)
+ return false;
+ if (is_good_fontno(n)) {
+ prev_fontno = fontno;
+ fontno = n;
+ }
+ else {
+ warning(WARN_FONT, "no font mounted at position %1", n);
+ return false;
+ }
+ return true;
+}
+
+void environment::set_family(symbol fam)
+{
+ if (interrupted)
+ return;
+ if (fam.is_null() || fam.is_empty()) {
+ int previous_mounting_position = prev_family->make_definite(fontno);
+ assert(previous_mounting_position >= 0);
+ if (previous_mounting_position < 0)
+ return;
+ font_family *tem = family;
+ family = prev_family;
+ prev_family = tem;
+ }
+ else {
+ font_family *f = lookup_family(fam);
+ // If the family isn't already in the dictionary, looking it up will
+ // create an entry for it. That doesn't mean that it will be
+ // resolvable to a real font when combined with a style name.
+ assert((f != 0 /* nullptr */) &&
+ (0 != "font family dictionary lookup"));
+ if (0 /* nullptr */ == f)
+ return;
+ if (f->make_definite(fontno) < 0) {
+ error("no font family named '%1' exists", fam.contents());
+ return;
+ }
+ prev_family = family;
+ family = f;
+ }
+}
+
+void environment::set_size(int n)
+{
+ if (interrupted)
+ return;
+ if (n == 0) {
+ font_size temp = prev_size;
+ prev_size = size;
+ size = temp;
+ int temp2 = prev_requested_size;
+ prev_requested_size = requested_size;
+ requested_size = temp2;
+ }
+ else {
+ prev_size = size;
+ size = font_size(n);
+ prev_requested_size = requested_size;
+ requested_size = n;
+ }
+}
+
+void environment::set_char_height(int n)
+{
+ if (interrupted)
+ return;
+ if (n == requested_size || n <= 0)
+ char_height = 0;
+ else
+ char_height = n;
+}
+
+void environment::set_char_slant(int n)
+{
+ if (interrupted)
+ return;
+ char_slant = n;
+}
+
+color *environment::get_prev_glyph_color()
+{
+ return prev_glyph_color;
+}
+
+color *environment::get_glyph_color()
+{
+ return glyph_color;
+}
+
+color *environment::get_prev_fill_color()
+{
+ return prev_fill_color;
+}
+
+color *environment::get_fill_color()
+{
+ return fill_color;
+}
+
+void environment::set_glyph_color(color *c)
+{
+ if (interrupted)
+ return;
+ curenv->prev_glyph_color = curenv->glyph_color;
+ curenv->glyph_color = c;
+}
+
+void environment::set_fill_color(color *c)
+{
+ if (interrupted)
+ return;
+ curenv->prev_fill_color = curenv->fill_color;
+ curenv->fill_color = c;
+}
+
+environment::environment(symbol nm)
+: dummy(0),
+ prev_line_length((units_per_inch*13)/2),
+ line_length((units_per_inch*13)/2),
+ prev_title_length((units_per_inch*13)/2),
+ title_length((units_per_inch*13)/2),
+ prev_size(sizescale*10),
+ size(sizescale*10),
+ requested_size(sizescale*10),
+ prev_requested_size(sizescale*10),
+ char_height(0),
+ char_slant(0),
+ space_size(12),
+ sentence_space_size(12),
+ adjust_mode(ADJUST_BOTH),
+ fill(1),
+ interrupted(0),
+ prev_line_interrupted(0),
+ center_lines(0),
+ right_justify_lines(0),
+ prev_vertical_spacing(points_to_units(12)),
+ vertical_spacing(points_to_units(12)),
+ prev_post_vertical_spacing(0),
+ post_vertical_spacing(0),
+ prev_line_spacing(1),
+ line_spacing(1),
+ prev_indent(0),
+ indent(0),
+ temporary_indent(0),
+ have_temporary_indent(0),
+ underline_lines(0),
+ underline_spaces(0),
+ input_trap_count(0),
+ continued_input_trap(0),
+ line(0),
+ prev_text_length(0),
+ width_total(0),
+ space_total(0),
+ input_line_start(0),
+ line_tabs(0),
+ current_tab(TAB_NONE),
+ leader_node(0),
+ tab_char(0),
+ leader_char(charset_table['.']),
+ current_field(0),
+ discarding(0),
+ spread_flag(0),
+ margin_character_flags(0),
+ margin_character_node(0),
+ margin_character_distance(points_to_units(10)),
+ numbering_nodes(0),
+ number_text_separation(1),
+ line_number_indent(0),
+ line_number_multiple(1),
+ no_number_count(0),
+ hyphenation_flags(1),
+ hyphen_line_count(0),
+ hyphen_line_max(-1),
+ hyphenation_space(H0),
+ hyphenation_margin(H0),
+ composite(0),
+ pending_lines(0),
+#ifdef WIDOW_CONTROL
+ widow_control(0),
+#endif /* WIDOW_CONTROL */
+ glyph_color(&default_color),
+ prev_glyph_color(&default_color),
+ fill_color(&default_color),
+ prev_fill_color(&default_color),
+ seen_space(0),
+ seen_eol(0),
+ suppress_next_eol(0),
+ seen_break(0),
+ tabs(units_per_inch/2, TAB_LEFT),
+ name(nm),
+ control_char('.'),
+ no_break_control_char('\''),
+ hyphen_indicator_char(0)
+{
+ prev_family = family = lookup_family(default_family);
+ prev_fontno = fontno = 1;
+ if (!is_good_fontno(1))
+ fatal("font mounted at position 1 is not valid");
+ if (family->make_definite(1) < 0)
+ fatal("invalid default font family '%1'",
+ default_family.contents());
+ prev_fontno = fontno;
+}
+
+environment::environment(const environment *e)
+: dummy(1),
+ prev_line_length(e->prev_line_length),
+ line_length(e->line_length),
+ prev_title_length(e->prev_title_length),
+ title_length(e->title_length),
+ prev_size(e->prev_size),
+ size(e->size),
+ requested_size(e->requested_size),
+ prev_requested_size(e->prev_requested_size),
+ char_height(e->char_height),
+ char_slant(e->char_slant),
+ prev_fontno(e->prev_fontno),
+ fontno(e->fontno),
+ prev_family(e->prev_family),
+ family(e->family),
+ space_size(e->space_size),
+ sentence_space_size(e->sentence_space_size),
+ adjust_mode(e->adjust_mode),
+ fill(e->fill),
+ interrupted(0),
+ prev_line_interrupted(0),
+ center_lines(0),
+ right_justify_lines(0),
+ prev_vertical_spacing(e->prev_vertical_spacing),
+ vertical_spacing(e->vertical_spacing),
+ prev_post_vertical_spacing(e->prev_post_vertical_spacing),
+ post_vertical_spacing(e->post_vertical_spacing),
+ prev_line_spacing(e->prev_line_spacing),
+ line_spacing(e->line_spacing),
+ prev_indent(e->prev_indent),
+ indent(e->indent),
+ temporary_indent(0),
+ have_temporary_indent(0),
+ underline_lines(0),
+ underline_spaces(0),
+ input_trap_count(0),
+ continued_input_trap(0),
+ line(0),
+ prev_text_length(e->prev_text_length),
+ width_total(0),
+ space_total(0),
+ input_line_start(0),
+ line_tabs(e->line_tabs),
+ current_tab(TAB_NONE),
+ leader_node(0),
+ tab_char(e->tab_char),
+ leader_char(e->leader_char),
+ current_field(0),
+ discarding(0),
+ spread_flag(0),
+ margin_character_flags(e->margin_character_flags),
+ margin_character_node(e->margin_character_node),
+ margin_character_distance(e->margin_character_distance),
+ numbering_nodes(0),
+ number_text_separation(e->number_text_separation),
+ line_number_indent(e->line_number_indent),
+ line_number_multiple(e->line_number_multiple),
+ no_number_count(e->no_number_count),
+ hyphenation_flags(e->hyphenation_flags),
+ hyphen_line_count(0),
+ hyphen_line_max(e->hyphen_line_max),
+ hyphenation_space(e->hyphenation_space),
+ hyphenation_margin(e->hyphenation_margin),
+ composite(0),
+ pending_lines(0),
+#ifdef WIDOW_CONTROL
+ widow_control(e->widow_control),
+#endif /* WIDOW_CONTROL */
+ glyph_color(e->glyph_color),
+ prev_glyph_color(e->prev_glyph_color),
+ fill_color(e->fill_color),
+ prev_fill_color(e->prev_fill_color),
+ seen_space(e->seen_space),
+ seen_eol(e->seen_eol),
+ suppress_next_eol(e->suppress_next_eol),
+ seen_break(e->seen_break),
+ tabs(e->tabs),
+ name(e->name), // so that, e.g., '.if "\n[.ev]"0"' works
+ control_char(e->control_char),
+ no_break_control_char(e->no_break_control_char),
+ hyphen_indicator_char(e->hyphen_indicator_char)
+{
+}
+
+void environment::copy(const environment *e)
+{
+ prev_line_length = e->prev_line_length;
+ line_length = e->line_length;
+ prev_title_length = e->prev_title_length;
+ title_length = e->title_length;
+ prev_size = e->prev_size;
+ size = e->size;
+ prev_requested_size = e->prev_requested_size;
+ requested_size = e->requested_size;
+ char_height = e->char_height;
+ char_slant = e->char_slant;
+ space_size = e->space_size;
+ sentence_space_size = e->sentence_space_size;
+ adjust_mode = e->adjust_mode;
+ fill = e->fill;
+ interrupted = 0;
+ prev_line_interrupted = 0;
+ center_lines = 0;
+ right_justify_lines = 0;
+ prev_vertical_spacing = e->prev_vertical_spacing;
+ vertical_spacing = e->vertical_spacing;
+ prev_post_vertical_spacing = e->prev_post_vertical_spacing,
+ post_vertical_spacing = e->post_vertical_spacing,
+ prev_line_spacing = e->prev_line_spacing;
+ line_spacing = e->line_spacing;
+ prev_indent = e->prev_indent;
+ indent = e->indent;
+ have_temporary_indent = 0;
+ temporary_indent = 0;
+ underline_lines = 0;
+ underline_spaces = 0;
+ input_trap_count = 0;
+ continued_input_trap = 0;
+ prev_text_length = e->prev_text_length;
+ width_total = 0;
+ space_total = 0;
+ input_line_start = 0;
+ control_char = e->control_char;
+ no_break_control_char = e->no_break_control_char;
+ hyphen_indicator_char = e->hyphen_indicator_char;
+ spread_flag = 0;
+ line = 0;
+ pending_lines = 0;
+ discarding = 0;
+ tabs = e->tabs;
+ line_tabs = e->line_tabs;
+ current_tab = TAB_NONE;
+ current_field = 0;
+ margin_character_flags = e->margin_character_flags;
+ if (e->margin_character_node)
+ margin_character_node = e->margin_character_node->copy();
+ margin_character_distance = e->margin_character_distance;
+ numbering_nodes = 0;
+ number_text_separation = e->number_text_separation;
+ line_number_multiple = e->line_number_multiple;
+ line_number_indent = e->line_number_indent;
+ no_number_count = e->no_number_count;
+ tab_char = e->tab_char;
+ leader_char = e->leader_char;
+ hyphenation_flags = e->hyphenation_flags;
+ fontno = e->fontno;
+ prev_fontno = e->prev_fontno;
+ dummy = e->dummy;
+ family = e->family;
+ prev_family = e->prev_family;
+ leader_node = 0;
+#ifdef WIDOW_CONTROL
+ widow_control = e->widow_control;
+#endif /* WIDOW_CONTROL */
+ hyphen_line_max = e->hyphen_line_max;
+ hyphen_line_count = 0;
+ hyphenation_space = e->hyphenation_space;
+ hyphenation_margin = e->hyphenation_margin;
+ composite = 0;
+ glyph_color= e->glyph_color;
+ prev_glyph_color = e->prev_glyph_color;
+ fill_color = e->fill_color;
+ prev_fill_color = e->prev_fill_color;
+}
+
+environment::~environment()
+{
+ delete leader_node;
+ delete_node_list(line);
+ delete_node_list(numbering_nodes);
+}
+
+hunits environment::get_input_line_position()
+{
+ hunits n;
+ if (line == 0)
+ n = -input_line_start;
+ else
+ n = width_total - input_line_start;
+ if (current_tab)
+ n += tab_width;
+ return n;
+}
+
+void environment::set_input_line_position(hunits n)
+{
+ input_line_start = line == 0 ? -n : width_total - n;
+ if (current_tab)
+ input_line_start += tab_width;
+}
+
+hunits environment::get_line_length()
+{
+ return line_length;
+}
+
+hunits environment::get_saved_line_length()
+{
+ if (line)
+ return target_text_length + saved_indent;
+ else
+ return line_length;
+}
+
+vunits environment::get_vertical_spacing()
+{
+ return vertical_spacing;
+}
+
+vunits environment::get_post_vertical_spacing()
+{
+ return post_vertical_spacing;
+}
+
+int environment::get_line_spacing()
+{
+ return line_spacing;
+}
+
+vunits environment::total_post_vertical_spacing()
+{
+ vunits tem(post_vertical_spacing);
+ if (line_spacing > 1)
+ tem += (line_spacing - 1)*vertical_spacing;
+ return tem;
+}
+
+int environment::get_bold()
+{
+ return get_bold_fontno(fontno);
+}
+
+hunits environment::get_digit_width()
+{
+ return env_digit_width(this);
+}
+
+int environment::get_adjust_mode()
+{
+ return adjust_mode;
+}
+
+int environment::get_fill()
+{
+ return fill;
+}
+
+hunits environment::get_indent()
+{
+ return indent;
+}
+
+hunits environment::get_saved_indent()
+{
+ if (line)
+ return saved_indent;
+ else if (have_temporary_indent)
+ return temporary_indent;
+ else
+ return indent;
+}
+
+hunits environment::get_temporary_indent()
+{
+ return temporary_indent;
+}
+
+hunits environment::get_title_length()
+{
+ return title_length;
+}
+
+node *environment::get_prev_char()
+{
+ for (node *n = current_tab ? tab_contents : line; n; n = n->next) {
+ node *last = n->last_char_node();
+ if (last)
+ return last;
+ }
+ return 0;
+}
+
+hunits environment::get_prev_char_width()
+{
+ node *last = get_prev_char();
+ if (!last)
+ return H0;
+ return last->width();
+}
+
+hunits environment::get_prev_char_skew()
+{
+ node *last = get_prev_char();
+ if (!last)
+ return H0;
+ return last->skew();
+}
+
+vunits environment::get_prev_char_height()
+{
+ node *last = get_prev_char();
+ if (!last)
+ return V0;
+ vunits min, max;
+ last->vertical_extent(&min, &max);
+ return -min;
+}
+
+vunits environment::get_prev_char_depth()
+{
+ node *last = get_prev_char();
+ if (!last)
+ return V0;
+ vunits min, max;
+ last->vertical_extent(&min, &max);
+ return max;
+}
+
+hunits environment::get_text_length()
+{
+ hunits n = line == 0 ? H0 : width_total;
+ if (current_tab)
+ n += tab_width;
+ return n;
+}
+
+hunits environment::get_prev_text_length()
+{
+ return prev_text_length;
+}
+
+
+static int sb_reg_contents = 0;
+static int st_reg_contents = 0;
+static int ct_reg_contents = 0;
+static int rsb_reg_contents = 0;
+static int rst_reg_contents = 0;
+static int skw_reg_contents = 0;
+static int ssc_reg_contents = 0;
+
+void environment::width_registers()
+{
+ // this is used to implement \w; it sets the st, sb, ct registers
+ vunits min = 0, max = 0, cur = 0;
+ int character_type = 0;
+ ssc_reg_contents = line ? line->subscript_correction().to_units() : 0;
+ skw_reg_contents = line ? line->skew().to_units() : 0;
+ line = reverse_node_list(line);
+ vunits real_min = V0;
+ vunits real_max = V0;
+ vunits v1, v2;
+ for (node *tem = line; tem; tem = tem->next) {
+ tem->vertical_extent(&v1, &v2);
+ v1 += cur;
+ if (v1 < real_min)
+ real_min = v1;
+ v2 += cur;
+ if (v2 > real_max)
+ real_max = v2;
+ if ((cur += tem->vertical_width()) < min)
+ min = cur;
+ else if (cur > max)
+ max = cur;
+ character_type |= tem->character_type();
+ }
+ line = reverse_node_list(line);
+ st_reg_contents = -min.to_units();
+ sb_reg_contents = -max.to_units();
+ rst_reg_contents = -real_min.to_units();
+ rsb_reg_contents = -real_max.to_units();
+ ct_reg_contents = character_type;
+}
+
+node *environment::extract_output_line()
+{
+ if (current_tab)
+ wrap_up_tab();
+ node *n = line;
+ line = 0;
+ return n;
+}
+
+/* environment related requests */
+
+void environment_switch()
+{
+ if (curenv->is_dummy()) {
+ error("cannot switch out of dummy environment");
+ }
+ else {
+ symbol nm = get_long_name();
+ if (nm.is_null()) {
+ if (env_stack == 0)
+ error("environment stack underflow");
+ else {
+ int seen_space = curenv->seen_space;
+ int seen_eol = curenv->seen_eol;
+ int suppress_next_eol = curenv->suppress_next_eol;
+ curenv = env_stack->env;
+ curenv->seen_space = seen_space;
+ curenv->seen_eol = seen_eol;
+ curenv->suppress_next_eol = suppress_next_eol;
+ env_list_node *tem = env_stack;
+ env_stack = env_stack->next;
+ delete tem;
+ }
+ }
+ else {
+ environment *e = (environment *)env_dictionary.lookup(nm);
+ if (!e) {
+ e = new environment(nm);
+ (void)env_dictionary.lookup(nm, e);
+ }
+ env_stack = new env_list_node(curenv, env_stack);
+ curenv = e;
+ }
+ }
+ skip_line();
+}
+
+void environment_copy()
+{
+ environment *e=0;
+ tok.skip();
+ symbol nm = get_long_name();
+ if (nm.is_null()) {
+ error("no environment specified to copy from");
+ }
+ else {
+ e = (environment *)env_dictionary.lookup(nm);
+ if (e)
+ curenv->copy(e);
+ else
+ error("cannot copy from nonexistent environment '%1'",
+ nm.contents());
+ }
+ skip_line();
+}
+
+void fill_color_change()
+{
+ symbol s = get_name();
+ if (s.is_null())
+ curenv->set_fill_color(curenv->get_prev_fill_color());
+ else
+ do_fill_color(s);
+ skip_line();
+}
+
+void glyph_color_change()
+{
+ symbol s = get_name();
+ if (s.is_null())
+ curenv->set_glyph_color(curenv->get_prev_glyph_color());
+ else
+ do_glyph_color(s);
+ skip_line();
+}
+
+static symbol P_symbol("P");
+
+void font_change()
+{
+ symbol s = get_name();
+ bool is_number = true;
+ if (s.is_null() || s == P_symbol) {
+ s = P_symbol;
+ is_number = false;
+ }
+ else {
+ for (const char *p = s.contents(); p != 0 && *p != 0; p++)
+ if (!csdigit(*p)) {
+ is_number = false;
+ break;
+ }
+ }
+ // environment::set_font warns if a bogus mounting position is
+ // requested. We must warn here if a bogus font name is selected.
+ if (is_number)
+ (void) curenv->set_font(atoi(s.contents()));
+ else
+ if (!curenv->set_font(s))
+ warning(WARN_FONT, "cannot select font '%1'", s.contents());
+ skip_line();
+}
+
+void family_change()
+{
+ symbol s = get_name();
+ curenv->set_family(s);
+ skip_line();
+}
+
+void point_size()
+{
+ int n;
+ if (has_arg() && get_number(&n, 'z', curenv->get_requested_point_size())) {
+ if (n <= 0)
+ n = 1;
+ curenv->set_size(n);
+ }
+ else
+ curenv->set_size(0);
+ skip_line();
+}
+
+void override_sizes()
+{
+ int n = 16;
+ int *sizes = new int[n];
+ int i = 0;
+ char *buf = read_string();
+ if (!buf)
+ return;
+ char *p = strtok(buf, " \t");
+ for (;;) {
+ if (!p)
+ break;
+ int lower, upper;
+ switch (sscanf(p, "%d-%d", &lower, &upper)) {
+ case 1:
+ upper = lower;
+ // fall through
+ case 2:
+ if (lower <= upper && lower >= 0)
+ break;
+ // fall through
+ default:
+ warning(WARN_RANGE, "bad size range '%1'", p);
+ return;
+ }
+ if (i + 2 > n) {
+ int *old_sizes = sizes;
+ sizes = new int[n*2];
+ memcpy(sizes, old_sizes, n*sizeof(int));
+ n *= 2;
+ delete[] old_sizes;
+ }
+ sizes[i++] = lower;
+ if (lower == 0)
+ break;
+ sizes[i++] = upper;
+ p = strtok(0, " \t");
+ }
+ font_size::init_size_table(sizes);
+}
+
+void space_size()
+{
+ int n;
+ if (get_integer(&n)) {
+ if (n < 0)
+ warning(WARN_RANGE, "negative word space size ignored: '%1'", n);
+ else
+ curenv->space_size = n;
+ if (has_arg() && get_integer(&n))
+ if (n < 0)
+ warning(WARN_RANGE, "negative sentence space size ignored: "
+ "'%1'", n);
+ else
+ curenv->sentence_space_size = n;
+ else
+ curenv->sentence_space_size = curenv->space_size;
+ }
+ skip_line();
+}
+
+void fill()
+{
+ while (!tok.is_newline() && !tok.is_eof())
+ tok.next();
+ if (break_flag)
+ curenv->do_break();
+ curenv->fill = 1;
+ tok.next();
+}
+
+void no_fill()
+{
+ while (!tok.is_newline() && !tok.is_eof())
+ tok.next();
+ if (break_flag)
+ curenv->do_break();
+ curenv->fill = 0;
+ curenv->suppress_next_eol = 1;
+ tok.next();
+}
+
+void center()
+{
+ int n;
+ if (!has_arg() || !get_integer(&n))
+ n = 1;
+ else if (n < 0)
+ n = 0;
+ while (!tok.is_newline() && !tok.is_eof())
+ tok.next();
+ if (break_flag)
+ curenv->do_break();
+ curenv->right_justify_lines = 0;
+ curenv->center_lines = n;
+ curdiv->modified_tag.incl(MTSM_CE);
+ tok.next();
+}
+
+void right_justify()
+{
+ int n;
+ if (!has_arg() || !get_integer(&n))
+ n = 1;
+ else if (n < 0)
+ n = 0;
+ while (!tok.is_newline() && !tok.is_eof())
+ tok.next();
+ if (break_flag)
+ curenv->do_break();
+ curenv->center_lines = 0;
+ curenv->right_justify_lines = n;
+ curdiv->modified_tag.incl(MTSM_RJ);
+ tok.next();
+}
+
+void line_length()
+{
+ hunits temp;
+ hunits minimum_length = font::hor;
+ if (has_arg() && get_hunits(&temp, 'm', curenv->line_length)) {
+ if (temp < minimum_length) {
+ warning(WARN_RANGE, "invalid line length %1u rounded to device"
+ " horizontal motion quantum", temp.to_units());
+ temp = minimum_length;
+ }
+ }
+ else
+ temp = curenv->prev_line_length;
+ curenv->prev_line_length = curenv->line_length;
+ curenv->line_length = temp;
+ curdiv->modified_tag.incl(MTSM_LL);
+ skip_line();
+}
+
+void title_length()
+{
+ hunits temp;
+ hunits minimum_length = font::hor;
+ if (has_arg() && get_hunits(&temp, 'm', curenv->title_length)) {
+ if (temp < minimum_length) {
+ warning(WARN_RANGE, "invalid title length %1u rounded to device"
+ " horizontal motion quantum", temp.to_units());
+ temp = minimum_length;
+ }
+ }
+ else
+ temp = curenv->prev_title_length;
+ curenv->prev_title_length = curenv->title_length;
+ curenv->title_length = temp;
+ skip_line();
+}
+
+void vertical_spacing()
+{
+ vunits temp;
+ if (has_arg() && get_vunits(&temp, 'p', curenv->vertical_spacing)) {
+ if (temp < V0) {
+ warning(WARN_RANGE, "vertical spacing must not be negative");
+ temp = vresolution;
+ }
+ }
+ else
+ temp = curenv->prev_vertical_spacing;
+ curenv->prev_vertical_spacing = curenv->vertical_spacing;
+ curenv->vertical_spacing = temp;
+ skip_line();
+}
+
+void post_vertical_spacing()
+{
+ vunits temp;
+ if (has_arg() && get_vunits(&temp, 'p', curenv->post_vertical_spacing)) {
+ if (temp < V0) {
+ warning(WARN_RANGE,
+ "post vertical spacing must be greater than or equal to 0");
+ temp = V0;
+ }
+ }
+ else
+ temp = curenv->prev_post_vertical_spacing;
+ curenv->prev_post_vertical_spacing = curenv->post_vertical_spacing;
+ curenv->post_vertical_spacing = temp;
+ skip_line();
+}
+
+void line_spacing()
+{
+ int temp;
+ if (has_arg() && get_integer(&temp)) {
+ if (temp < 1) {
+ warning(WARN_RANGE, "value %1 out of range: interpreted as 1", temp);
+ temp = 1;
+ }
+ }
+ else
+ temp = curenv->prev_line_spacing;
+ curenv->prev_line_spacing = curenv->line_spacing;
+ curenv->line_spacing = temp;
+ skip_line();
+}
+
+void indent()
+{
+ hunits temp;
+ if (has_arg() && get_hunits(&temp, 'm', curenv->indent)) {
+ if (temp < H0) {
+ warning(WARN_RANGE, "indent cannot be negative");
+ temp = H0;
+ }
+ }
+ else
+ temp = curenv->prev_indent;
+ while (!tok.is_newline() && !tok.is_eof())
+ tok.next();
+ if (break_flag)
+ curenv->do_break();
+ curenv->have_temporary_indent = 0;
+ curenv->prev_indent = curenv->indent;
+ curenv->indent = temp;
+ curdiv->modified_tag.incl(MTSM_IN);
+ tok.next();
+}
+
+void temporary_indent()
+{
+ int err = 0;
+ hunits temp;
+ if (!get_hunits(&temp, 'm', curenv->get_indent()))
+ err = 1;
+ while (!tok.is_newline() && !tok.is_eof())
+ tok.next();
+ if (break_flag)
+ curenv->do_break();
+ if (temp < H0) {
+ warning(WARN_RANGE, "total indent cannot be negative");
+ temp = H0;
+ }
+ if (!err) {
+ curenv->temporary_indent = temp;
+ curenv->have_temporary_indent = 1;
+ curdiv->modified_tag.incl(MTSM_TI);
+ }
+ tok.next();
+}
+
+void do_underline(int underline_spaces)
+{
+ int n;
+ if (!has_arg() || !get_integer(&n))
+ n = 1;
+ if (n <= 0) {
+ if (curenv->underline_lines > 0) {
+ curenv->prev_fontno = curenv->fontno;
+ curenv->fontno = curenv->pre_underline_fontno;
+ if (underline_spaces) {
+ curenv->underline_spaces = 0;
+ curenv->add_node(do_underline_special(false));
+ }
+ }
+ curenv->underline_lines = 0;
+ }
+ else {
+ curenv->underline_lines = n;
+ curenv->pre_underline_fontno = curenv->fontno;
+ curenv->fontno = get_underline_fontno();
+ if (underline_spaces) {
+ curenv->underline_spaces = 1;
+ curenv->add_node(do_underline_special(true));
+ }
+ }
+ skip_line();
+}
+
+void continuous_underline()
+{
+ do_underline(1);
+}
+
+void underline()
+{
+ do_underline(0);
+}
+
+void control_char()
+{
+ curenv->control_char = '.';
+ if (has_arg()) {
+ if (tok.ch() == 0)
+ error("bad control character");
+ else
+ curenv->control_char = tok.ch();
+ }
+ skip_line();
+}
+
+void no_break_control_char()
+{
+ curenv->no_break_control_char = '\'';
+ if (has_arg()) {
+ if (tok.ch() == 0)
+ error("bad control character");
+ else
+ curenv->no_break_control_char = tok.ch();
+ }
+ skip_line();
+}
+
+void margin_character()
+{
+ while (tok.is_space())
+ tok.next();
+ charinfo *ci = tok.get_char();
+ if (ci) {
+ // Call tok.next() only after making the node so that
+ // .mc \s+9\(br\s0 works.
+ node *nd = curenv->make_char_node(ci);
+ tok.next();
+ if (nd) {
+ delete curenv->margin_character_node;
+ curenv->margin_character_node = nd;
+ curenv->margin_character_flags = MARGIN_CHARACTER_ON
+ | MARGIN_CHARACTER_NEXT;
+ hunits d;
+ if (has_arg() && get_hunits(&d, 'm'))
+ curenv->margin_character_distance = d;
+ }
+ }
+ else {
+ check_missing_character();
+ curenv->margin_character_flags &= ~MARGIN_CHARACTER_ON;
+ if (curenv->margin_character_flags == 0) {
+ delete curenv->margin_character_node;
+ curenv->margin_character_node = 0;
+ }
+ }
+ skip_line();
+}
+
+void number_lines()
+{
+ delete_node_list(curenv->numbering_nodes);
+ curenv->numbering_nodes = 0;
+ if (has_arg()) {
+ node *nd = 0;
+ for (int i = '9'; i >= '0'; i--) {
+ node *tem = make_node(charset_table[i], curenv);
+ if (!tem) {
+ skip_line();
+ return;
+ }
+ tem->next = nd;
+ nd = tem;
+ }
+ curenv->numbering_nodes = nd;
+ curenv->line_number_digit_width = env_digit_width(curenv);
+ int n;
+ if (!tok.usable_as_delimiter()) {
+ if (get_integer(&n, next_line_number)) {
+ next_line_number = n;
+ if (next_line_number < 0) {
+ warning(WARN_RANGE, "negative line number");
+ next_line_number = 0;
+ }
+ }
+ }
+ else
+ while (!tok.is_space() && !tok.is_newline() && !tok.is_eof())
+ tok.next();
+ if (has_arg()) {
+ if (!tok.usable_as_delimiter()) {
+ if (get_integer(&n)) {
+ if (n <= 0) {
+ warning(WARN_RANGE, "negative or zero line number multiple");
+ }
+ else
+ curenv->line_number_multiple = n;
+ }
+ }
+ else
+ while (!tok.is_space() && !tok.is_newline() && !tok.is_eof())
+ tok.next();
+ if (has_arg()) {
+ if (!tok.usable_as_delimiter()) {
+ if (get_integer(&n))
+ curenv->number_text_separation = n;
+ }
+ else
+ while (!tok.is_space() && !tok.is_newline() && !tok.is_eof())
+ tok.next();
+ if (has_arg() && !tok.usable_as_delimiter() && get_integer(&n))
+ curenv->line_number_indent = n;
+ }
+ }
+ }
+ skip_line();
+}
+
+void no_number()
+{
+ int n;
+ if (has_arg() && get_integer(&n))
+ curenv->no_number_count = n > 0 ? n : 0;
+ else
+ curenv->no_number_count = 1;
+ skip_line();
+}
+
+void no_hyphenate()
+{
+ curenv->hyphenation_flags = 0;
+ skip_line();
+}
+
+void hyphenate_request()
+{
+ int n;
+ if (has_arg() && get_integer(&n)) {
+ if (n < HYPHEN_NONE) {
+ warning(WARN_RANGE, "negative hyphenation flags ignored: %1", n);
+ } else if (n > HYPHEN_MAX) {
+ warning(WARN_RANGE, "unknown hyphenation flags ignored (maximum "
+ "%1): %2", HYPHEN_MAX, n);
+ } else if (((n & HYPHEN_DEFAULT) && (n & ~HYPHEN_DEFAULT))
+ || ((n & HYPHEN_FIRST_CHAR) && (n & HYPHEN_NOT_FIRST_CHARS))
+ || ((n & HYPHEN_LAST_CHAR) && (n & HYPHEN_NOT_LAST_CHARS)))
+ warning(WARN_SYNTAX, "contradictory hyphenation flags ignored: "
+ "%1", n);
+ else
+ curenv->hyphenation_flags = n;
+ }
+ else
+ curenv->hyphenation_flags = 1;
+ skip_line();
+}
+
+void hyphen_char()
+{
+ curenv->hyphen_indicator_char = get_optional_char();
+ skip_line();
+}
+
+void hyphen_line_max_request()
+{
+ int n;
+ if (has_arg() && get_integer(&n))
+ curenv->hyphen_line_max = n;
+ else
+ curenv->hyphen_line_max = -1;
+ skip_line();
+}
+
+void environment::interrupt()
+{
+ if (!dummy) {
+ add_node(new transparent_dummy_node);
+ interrupted = 1;
+ }
+}
+
+void environment::newline()
+{
+ int was_centered = 0;
+ if (underline_lines > 0) {
+ if (--underline_lines == 0) {
+ prev_fontno = fontno;
+ fontno = pre_underline_fontno;
+ if (underline_spaces) {
+ underline_spaces = 0;
+ add_node(do_underline_special(false));
+ }
+ }
+ }
+ if (current_field)
+ wrap_up_field();
+ if (current_tab)
+ wrap_up_tab();
+ // strip trailing spaces
+ while (line != 0 && line->discardable()) {
+ width_total -= line->width();
+ space_total -= line->nspaces();
+ node *tem = line;
+ line = line->next;
+ delete tem;
+ }
+ node *to_be_output = 0;
+ hunits to_be_output_width;
+ prev_line_interrupted = 0;
+ if (dummy)
+ space_newline();
+ else if (interrupted) {
+ interrupted = 0;
+ // see environment::final_break
+ prev_line_interrupted = is_exit_underway ? 2 : 1;
+ }
+ else if (center_lines > 0) {
+ --center_lines;
+ hunits x = target_text_length - width_total;
+ if (x > H0)
+ saved_indent += x/2;
+ to_be_output = line;
+ was_centered = 1;
+ to_be_output_width = width_total;
+ line = 0;
+ }
+ else if (right_justify_lines > 0) {
+ --right_justify_lines;
+ hunits x = target_text_length - width_total;
+ if (x > H0)
+ saved_indent += x;
+ to_be_output = line;
+ to_be_output_width = width_total;
+ line = 0;
+ }
+ else if (fill)
+ space_newline();
+ else {
+ to_be_output = line;
+ to_be_output_width = width_total;
+ line = 0;
+ }
+ input_line_start = line == 0 ? H0 : width_total;
+ if (to_be_output) {
+ if (is_html && !fill) {
+ curdiv->modified_tag.incl(MTSM_EOL);
+ if (suppress_next_eol)
+ suppress_next_eol = 0;
+ else
+ seen_eol = 1;
+ }
+
+ output_line(to_be_output, to_be_output_width, was_centered);
+ hyphen_line_count = 0;
+ }
+ if (input_trap_count > 0) {
+ if (!(continued_input_trap && prev_line_interrupted))
+ if (--input_trap_count == 0)
+ spring_trap(input_trap);
+ }
+}
+
+void environment::output_line(node *n, hunits width, int was_centered)
+{
+ prev_text_length = width;
+ if (margin_character_flags) {
+ hunits d = line_length + margin_character_distance - saved_indent - width;
+ if (d > 0) {
+ n = new hmotion_node(d, get_fill_color(), n);
+ width += d;
+ }
+ margin_character_flags &= ~MARGIN_CHARACTER_NEXT;
+ node *tem;
+ if (!margin_character_flags) {
+ tem = margin_character_node;
+ margin_character_node = 0;
+ }
+ else
+ tem = margin_character_node->copy();
+ tem->next = n;
+ n = tem;
+ width += tem->width();
+ }
+ node *nn = 0;
+ while (n != 0) {
+ node *tem = n->next;
+ n->next = nn;
+ nn = n;
+ n = tem;
+ }
+ if (!saved_indent.is_zero())
+ nn = new hmotion_node(saved_indent, get_fill_color(), nn);
+ width += saved_indent;
+ if (no_number_count > 0)
+ --no_number_count;
+ else if (numbering_nodes) {
+ hunits w = (line_number_digit_width
+ *(3+line_number_indent+number_text_separation));
+ if (next_line_number % line_number_multiple != 0)
+ nn = new hmotion_node(w, get_fill_color(), nn);
+ else {
+ hunits x = w;
+ nn = new hmotion_node(number_text_separation * line_number_digit_width,
+ get_fill_color(), nn);
+ x -= number_text_separation*line_number_digit_width;
+ char buf[30];
+ sprintf(buf, "%3d", next_line_number);
+ for (char *p = strchr(buf, '\0') - 1; p >= buf && *p != ' '; --p) {
+ node *gn = numbering_nodes;
+ for (int count = *p - '0'; count > 0; count--)
+ gn = gn->next;
+ gn = gn->copy();
+ x -= gn->width();
+ gn->next = nn;
+ nn = gn;
+ }
+ nn = new hmotion_node(x, get_fill_color(), nn);
+ }
+ width += w;
+ ++next_line_number;
+ }
+ output(nn, !fill, vertical_spacing, total_post_vertical_spacing(), width,
+ was_centered);
+}
+
+void environment::start_line()
+{
+ assert(line == 0);
+ discarding = 0;
+ line = new line_start_node;
+ if (have_temporary_indent) {
+ saved_indent = temporary_indent;
+ have_temporary_indent = 0;
+ }
+ else
+ saved_indent = indent;
+ target_text_length = line_length - saved_indent;
+ width_total = H0;
+ space_total = 0;
+}
+
+hunits environment::get_hyphenation_space()
+{
+ return hyphenation_space;
+}
+
+void hyphenation_space_request()
+{
+ hunits n;
+ if (get_hunits(&n, 'm')) {
+ if (n < H0) {
+ warning(WARN_RANGE, "hyphenation space cannot be negative");
+ n = H0;
+ }
+ curenv->hyphenation_space = n;
+ }
+ skip_line();
+}
+
+hunits environment::get_hyphenation_margin()
+{
+ return hyphenation_margin;
+}
+
+void hyphenation_margin_request()
+{
+ hunits n;
+ if (get_hunits(&n, 'm')) {
+ if (n < H0) {
+ warning(WARN_RANGE, "hyphenation margin cannot be negative");
+ n = H0;
+ }
+ curenv->hyphenation_margin = n;
+ }
+ skip_line();
+}
+
+breakpoint *environment::choose_breakpoint()
+{
+ hunits x = width_total;
+ int s = space_total;
+ node *n = line;
+ breakpoint *best_bp = 0; // the best breakpoint so far
+ int best_bp_fits = 0;
+ while (n != 0) {
+ x -= n->width();
+ s -= n->nspaces();
+ breakpoint *bp = n->get_breakpoints(x, s);
+ while (bp != 0) {
+ if (bp->width <= target_text_length) {
+ if (!bp->hyphenated) {
+ breakpoint *tem = bp->next;
+ bp->next = 0;
+ while (tem != 0) {
+ breakpoint *tem1 = tem;
+ tem = tem->next;
+ delete tem1;
+ }
+ if (best_bp_fits
+ // Decide whether to use the hyphenated breakpoint.
+ && (hyphen_line_max < 0
+ // Only choose the hyphenated breakpoint if it would not
+ // exceed the maximum number of consecutive hyphenated
+ // lines.
+ || hyphen_line_count + 1 <= hyphen_line_max)
+ && !(adjust_mode == ADJUST_BOTH
+ // Don't choose the hyphenated breakpoint if the line
+ // can be justified by adding no more than
+ // hyphenation_space to any word space.
+ ? (bp->nspaces > 0
+ && (((target_text_length - bp->width
+ + (bp->nspaces - 1)*hresolution)/bp->nspaces)
+ <= hyphenation_space))
+ // Don't choose the hyphenated breakpoint if the line
+ // is no more than hyphenation_margin short.
+ : target_text_length - bp->width <= hyphenation_margin)) {
+ delete bp;
+ return best_bp;
+ }
+ if (best_bp)
+ delete best_bp;
+ return bp;
+ }
+ else {
+ if ((adjust_mode == ADJUST_BOTH
+ ? hyphenation_space == H0
+ : hyphenation_margin == H0)
+ && (hyphen_line_max < 0
+ || hyphen_line_count + 1 <= hyphen_line_max)) {
+ // No need to consider a non-hyphenated breakpoint.
+ if (best_bp)
+ delete best_bp;
+ breakpoint *tem = bp->next;
+ bp->next = 0;
+ while (tem != 0) {
+ breakpoint *tem1 = tem;
+ tem = tem->next;
+ delete tem1;
+ }
+ return bp;
+ }
+ // It fits but it's hyphenated.
+ if (!best_bp_fits) {
+ if (best_bp)
+ delete best_bp;
+ best_bp = bp;
+ bp = bp->next;
+ best_bp_fits = 1;
+ }
+ else {
+ breakpoint *tem = bp;
+ bp = bp->next;
+ delete tem;
+ }
+ }
+ }
+ else {
+ if (best_bp)
+ delete best_bp;
+ best_bp = bp;
+ bp = bp->next;
+ }
+ }
+ n = n->next;
+ }
+ if (best_bp) {
+ if (!best_bp_fits)
+ output_warning(WARN_BREAK, "cannot break line");
+ return best_bp;
+ }
+ return 0;
+}
+
+void environment::hyphenate_line(int start_here)
+{
+ assert(line != 0);
+ hyphenation_type prev_type = line->get_hyphenation_type();
+ node **startp;
+ if (start_here)
+ startp = &line;
+ else
+ for (startp = &line->next; *startp != 0; startp = &(*startp)->next) {
+ hyphenation_type this_type = (*startp)->get_hyphenation_type();
+ if (prev_type == HYPHEN_BOUNDARY && this_type == HYPHEN_MIDDLE)
+ break;
+ prev_type = this_type;
+ }
+ if (*startp == 0)
+ return;
+ node *tem = *startp;
+ do {
+ tem = tem->next;
+ } while (tem != 0 && tem->get_hyphenation_type() == HYPHEN_MIDDLE);
+ int inhibit = (tem != 0 && tem->get_hyphenation_type() == HYPHEN_INHIBIT);
+ node *end = tem;
+ hyphen_list *sl = 0;
+ tem = *startp;
+ node *forward = 0;
+ int i = 0;
+ while (tem != end) {
+ sl = tem->get_hyphen_list(sl, &i);
+ node *tem1 = tem;
+ tem = tem->next;
+ tem1->next = forward;
+ forward = tem1;
+ }
+ if (!inhibit) {
+ // this is for characters like hyphen and emdash
+ int prev_code = 0;
+ for (hyphen_list *h = sl; h; h = h->next) {
+ h->breakable = (prev_code != 0
+ && h->next != 0
+ && h->next->hyphenation_code != 0);
+ prev_code = h->hyphenation_code;
+ }
+ }
+ if (hyphenation_flags != 0
+ && !inhibit
+ // this may not be right if we have extra space on this line
+ && !((hyphenation_flags & HYPHEN_NOT_LAST_LINE)
+ && (curdiv->distance_to_next_trap()
+ <= vertical_spacing + total_post_vertical_spacing()))
+ && i >= (4
+ - (hyphenation_flags & HYPHEN_FIRST_CHAR ? 1 : 0)
+ - (hyphenation_flags & HYPHEN_LAST_CHAR ? 1 : 0)
+ + (hyphenation_flags & HYPHEN_NOT_FIRST_CHARS ? 1 : 0)
+ + (hyphenation_flags & HYPHEN_NOT_LAST_CHARS ? 1 : 0)))
+ hyphenate(sl, hyphenation_flags);
+ while (forward != 0) {
+ node *tem1 = forward;
+ forward = forward->next;
+ tem1->next = 0;
+ tem = tem1->add_self(tem, &sl);
+ }
+ *startp = tem;
+}
+
+static node *node_list_reverse(node *n)
+{
+ node *res = 0;
+ while (n) {
+ node *tem = n;
+ n = n->next;
+ tem->next = res;
+ res = tem;
+ }
+ return res;
+}
+
+static void distribute_space(node *n, int nspaces, hunits desired_space,
+ bool force_reverse_node_list = false)
+{
+ if (desired_space.is_zero() || nspaces == 0)
+ return;
+ // Positive desired space is the typical case. Negative desired space
+ // is possible if we have overrun an unbreakable line. But we should
+ // not get here if there are no adjustable space nodes to adjust.
+ assert(nspaces > 0);
+ // Space cannot always be distributed evenly among all of the space
+ // nodes in the node list: there are limits to device resolution. We
+ // add space until we run out, which might happen before the end of
+ // the line. To achieve uniform typographical grayness and avoid
+ // rivers, we switch the end from which space is initially distributed
+ // with each line requiring it, unless compelled to reverse it. The
+ // node list's natural ordering is in the direction of text flow, so
+ // we distribute space initially from the left, unlike AT&T troff.
+ static bool do_reverse_node_list = false;
+ if (force_reverse_node_list || do_reverse_node_list)
+ n = node_list_reverse(n);
+ if (!force_reverse_node_list && spread_limit >= 0
+ && desired_space.to_units() > 0) {
+ hunits em = curenv->get_size();
+ double Ems = (double)desired_space.to_units() / nspaces
+ / (em.is_zero() ? hresolution : em.to_units());
+ if (Ems > spread_limit)
+ output_warning(WARN_BREAK, "spreading %1m per space", Ems);
+ }
+ for (node *tem = n; tem; tem = tem->next)
+ tem->spread_space(&nspaces, &desired_space);
+ if (force_reverse_node_list || do_reverse_node_list)
+ (void)node_list_reverse(n);
+ if (!force_reverse_node_list)
+ do_reverse_node_list = !do_reverse_node_list;
+}
+
+void environment::possibly_break_line(int start_here, int forced)
+{
+ int was_centered = center_lines > 0;
+ if (!fill || current_tab || current_field || dummy)
+ return;
+ while (line != 0
+ && (forced
+ // When a macro follows a paragraph in fill mode, the
+ // current line should not be empty.
+ || (width_total - line->width()) > target_text_length)) {
+ hyphenate_line(start_here);
+ breakpoint *bp = choose_breakpoint();
+ if (bp == 0)
+ // we'll find one eventually
+ return;
+ node *pre, *post;
+ node **ndp = &line;
+ while (*ndp != bp->nd)
+ ndp = &(*ndp)->next;
+ bp->nd->split(bp->index, &pre, &post);
+ *ndp = post;
+ hunits extra_space_width = H0;
+ switch(adjust_mode) {
+ case ADJUST_BOTH:
+ if (bp->nspaces != 0)
+ extra_space_width = target_text_length - bp->width;
+ else if (bp->width > 0 && target_text_length > 0
+ && target_text_length > bp->width)
+ output_warning(WARN_BREAK, "cannot adjust line");
+ break;
+ case ADJUST_CENTER:
+ saved_indent += (target_text_length - bp->width)/2;
+ was_centered = 1;
+ break;
+ case ADJUST_RIGHT:
+ saved_indent += target_text_length - bp->width;
+ break;
+ }
+ distribute_space(pre, bp->nspaces, extra_space_width);
+ hunits output_width = bp->width + extra_space_width;
+ // This should become an assert() when we can get reliable width
+ // data from CJK glyphs. See Savannah #44018.
+ if (output_width <= 0) {
+ double output_width_in_ems = output_width.to_units();
+ output_warning(WARN_BREAK, "line has non-positive width %1m",
+ output_width_in_ems);
+ return;
+ }
+ input_line_start -= output_width;
+ if (bp->hyphenated)
+ hyphen_line_count++;
+ else
+ hyphen_line_count = 0;
+ delete bp;
+ space_total = 0;
+ width_total = 0;
+ node *first_non_discardable = 0;
+ node *tem;
+ for (tem = line; tem != 0; tem = tem->next)
+ if (!tem->discardable())
+ first_non_discardable = tem;
+ node *to_be_discarded;
+ if (first_non_discardable) {
+ to_be_discarded = first_non_discardable->next;
+ first_non_discardable->next = 0;
+ for (tem = line; tem != 0; tem = tem->next) {
+ width_total += tem->width();
+ space_total += tem->nspaces();
+ }
+ discarding = 0;
+ }
+ else {
+ discarding = 1;
+ to_be_discarded = line;
+ line = 0;
+ }
+ // Do output_line() here so that line will be 0 iff the
+ // the environment will be empty.
+ output_line(pre, output_width, was_centered);
+ while (to_be_discarded != 0) {
+ tem = to_be_discarded;
+ to_be_discarded = to_be_discarded->next;
+ input_line_start -= tem->width();
+ delete tem;
+ }
+ if (line != 0) {
+ if (have_temporary_indent) {
+ saved_indent = temporary_indent;
+ have_temporary_indent = 0;
+ }
+ else
+ saved_indent = indent;
+ target_text_length = line_length - saved_indent;
+ }
+ }
+}
+
+/*
+Do the break at the end of input after the end macro (if any).
+
+Unix troff behaves as follows: if the last line is
+
+foo bar\c
+
+it will output foo on the current page, and bar on the next page;
+if the last line is
+
+foo\c
+
+or
+
+foo bar
+
+everything will be output on the current page. This behaviour must be
+considered a bug.
+
+The problem is that some macro packages rely on this. For example,
+the ATK macros have an end macro that emits \c if it needs to print a
+table of contents but doesn't do a 'bp in the end macro; instead the
+'bp is done in the bottom of page trap. This works with Unix troff,
+provided that the current environment is not empty at the end of the
+input file.
+
+The following will make macro packages that do that sort of thing work
+even if the current environment is empty at the end of the input file.
+If the last input line used \c and this line occurred in the end macro,
+then we'll force everything out on the current page, but we'll make
+sure that the environment isn't empty so that we won't exit at the
+bottom of this page.
+*/
+
+void environment::final_break()
+{
+ if (prev_line_interrupted == 2) {
+ do_break();
+ add_node(new transparent_dummy_node);
+ }
+ else
+ do_break();
+}
+
+node *environment::make_tag(const char *nm, int i)
+{
+ if (is_html) {
+ /*
+ * need to emit tag for post-grohtml
+ * but we check to see whether we can emit specials
+ */
+ if (curdiv == topdiv && topdiv->before_first_page)
+ topdiv->begin_page();
+
+ macro m;
+ m.append_str("devtag:");
+ for (const char *p = nm; *p; p++)
+ if (!is_invalid_input_char((unsigned char)*p))
+ m.append(*p);
+ m.append(' ');
+ m.append_int(i);
+ return new special_node(m);
+ }
+ return 0;
+}
+
+void environment::dump_troff_state()
+{
+#define SPACES " "
+ fprintf(stderr, SPACES "register 'in' = %d\n", curenv->indent.to_units());
+ if (curenv->have_temporary_indent)
+ fprintf(stderr, SPACES "register 'ti' = %d\n",
+ curenv->temporary_indent.to_units());
+ fprintf(stderr, SPACES "centered lines 'ce' = %d\n", curenv->center_lines);
+ fprintf(stderr, SPACES "register 'll' = %d\n",
+ curenv->line_length.to_units());
+ fprintf(stderr, SPACES "fill 'fi=1/nf=0' = %d\n", curenv->fill);
+ fprintf(stderr, SPACES "page offset 'po' = %d\n",
+ topdiv->get_page_offset().to_units());
+ fprintf(stderr, SPACES "seen_break = %d\n", curenv->seen_break);
+ fprintf(stderr, SPACES "seen_space = %d\n", curenv->seen_space);
+ fflush(stderr);
+#undef SPACES
+}
+
+statem *environment::construct_state(int only_eol)
+{
+ if (is_html) {
+ statem *s = new statem();
+ if (!only_eol) {
+ s->add_tag(MTSM_IN, indent);
+ s->add_tag(MTSM_LL, line_length);
+ s->add_tag(MTSM_PO, topdiv->get_page_offset().to_units());
+ s->add_tag(MTSM_RJ, right_justify_lines);
+ if (have_temporary_indent)
+ s->add_tag(MTSM_TI, temporary_indent);
+ s->add_tag_ta();
+ if (seen_break)
+ s->add_tag(MTSM_BR);
+ if (seen_space != 0)
+ s->add_tag(MTSM_SP, seen_space);
+ seen_break = 0;
+ seen_space = 0;
+ }
+ if (seen_eol) {
+ s->add_tag(MTSM_EOL);
+ s->add_tag(MTSM_CE, center_lines);
+ }
+ seen_eol = 0;
+ return s;
+ }
+ else
+ return NULL;
+}
+
+void environment::construct_format_state(node *n, int was_centered,
+ int filling)
+{
+ if (is_html) {
+ // find first glyph node which has a state.
+ while (n != 0 && n->state == 0)
+ n = n->next;
+ if (n == 0 || (n->state == 0))
+ return;
+ if (seen_space != 0)
+ n->state->add_tag(MTSM_SP, seen_space);
+ if (seen_eol && topdiv == curdiv)
+ n->state->add_tag(MTSM_EOL);
+ seen_space = 0;
+ seen_eol = 0;
+ if (was_centered)
+ n->state->add_tag(MTSM_CE, center_lines+1);
+ else
+ n->state->add_tag_if_unknown(MTSM_CE, 0);
+ n->state->add_tag_if_unknown(MTSM_FI, filling);
+ n = n->next;
+ while (n != 0) {
+ if (n->state != 0) {
+ n->state->sub_tag_ce();
+ n->state->add_tag_if_unknown(MTSM_FI, filling);
+ }
+ n = n->next;
+ }
+ }
+}
+
+void environment::construct_new_line_state(node *n)
+{
+ if (is_html) {
+ // find first glyph node which has a state.
+ while (n != 0 && n->state == 0)
+ n = n->next;
+ if (n == 0 || n->state == 0)
+ return;
+ if (seen_space != 0)
+ n->state->add_tag(MTSM_SP, seen_space);
+ if (seen_eol && topdiv == curdiv)
+ n->state->add_tag(MTSM_EOL);
+ seen_space = 0;
+ seen_eol = 0;
+ }
+}
+
+extern int global_diverted_space;
+
+void environment::do_break(int do_spread)
+{
+ int was_centered = 0;
+ if (curdiv == topdiv && topdiv->before_first_page) {
+ topdiv->begin_page();
+ return;
+ }
+ if (current_tab)
+ wrap_up_tab();
+ if (line) {
+ // this is so that hyphenation works
+ if (line->nspaces() == 0) {
+ line = new space_node(H0, get_fill_color(), line);
+ space_total++;
+ }
+ possibly_break_line(0, do_spread);
+ }
+ while (line != 0 && line->discardable()) {
+ width_total -= line->width();
+ space_total -= line->nspaces();
+ node *tem = line;
+ line = line->next;
+ delete tem;
+ }
+ discarding = 0;
+ input_line_start = H0;
+ if (line != 0) {
+ if (fill) {
+ switch (adjust_mode) {
+ case ADJUST_CENTER:
+ saved_indent += (target_text_length - width_total)/2;
+ was_centered = 1;
+ break;
+ case ADJUST_RIGHT:
+ saved_indent += target_text_length - width_total;
+ break;
+ }
+ }
+ node *tem = line;
+ line = 0;
+ output_line(tem, width_total, was_centered);
+ hyphen_line_count = 0;
+ }
+ prev_line_interrupted = 0;
+#ifdef WIDOW_CONTROL
+ mark_last_line();
+ output_pending_lines();
+#endif /* WIDOW_CONTROL */
+ if (!global_diverted_space) {
+ curdiv->modified_tag.incl(MTSM_BR);
+ seen_break = 1;
+ }
+}
+
+int environment::is_empty()
+{
+ return !current_tab && line == 0 && pending_lines == 0;
+}
+
+void do_break_request(int spread)
+{
+ while (!tok.is_newline() && !tok.is_eof())
+ tok.next();
+ if (break_flag)
+ curenv->do_break(spread);
+ tok.next();
+}
+
+void break_request()
+{
+ do_break_request(0);
+}
+
+void break_spread_request()
+{
+ do_break_request(1);
+}
+
+void title()
+{
+ if (curdiv == topdiv && topdiv->before_first_page) {
+ handle_initial_title();
+ return;
+ }
+ node *part[3];
+ hunits part_width[3];
+ part[0] = part[1] = part[2] = 0;
+ environment env(curenv);
+ environment *oldenv = curenv;
+ curenv = &env;
+ read_title_parts(part, part_width);
+ curenv = oldenv;
+ curenv->size = env.size;
+ curenv->prev_size = env.prev_size;
+ curenv->requested_size = env.requested_size;
+ curenv->prev_requested_size = env.prev_requested_size;
+ curenv->char_height = env.char_height;
+ curenv->char_slant = env.char_slant;
+ curenv->fontno = env.fontno;
+ curenv->prev_fontno = env.prev_fontno;
+ curenv->glyph_color = env.glyph_color;
+ curenv->prev_glyph_color = env.prev_glyph_color;
+ curenv->fill_color = env.fill_color;
+ curenv->prev_fill_color = env.prev_fill_color;
+ node *n = 0;
+ node *p = part[2];
+ while (p != 0) {
+ node *tem = p;
+ p = p->next;
+ tem->next = n;
+ n = tem;
+ }
+ hunits length_title(curenv->title_length);
+ hunits f = length_title - part_width[1];
+ hunits f2 = f/2;
+ n = new hmotion_node(f2 - part_width[2], curenv->get_fill_color(), n);
+ p = part[1];
+ while (p != 0) {
+ node *tem = p;
+ p = p->next;
+ tem->next = n;
+ n = tem;
+ }
+ n = new hmotion_node(f - f2 - part_width[0], curenv->get_fill_color(), n);
+ p = part[0];
+ while (p != 0) {
+ node *tem = p;
+ p = p->next;
+ tem->next = n;
+ n = tem;
+ }
+ curenv->output_title(n, !curenv->fill, curenv->vertical_spacing,
+ curenv->total_post_vertical_spacing(), length_title);
+ curenv->hyphen_line_count = 0;
+ tok.next();
+}
+
+void adjust()
+{
+ curenv->adjust_mode |= 1;
+ if (has_arg()) {
+ switch (tok.ch()) {
+ case 'l':
+ curenv->adjust_mode = ADJUST_LEFT;
+ break;
+ case 'r':
+ curenv->adjust_mode = ADJUST_RIGHT;
+ break;
+ case 'c':
+ curenv->adjust_mode = ADJUST_CENTER;
+ break;
+ case 'b':
+ case 'n':
+ curenv->adjust_mode = ADJUST_BOTH;
+ break;
+ default:
+ int n;
+ if (get_integer(&n)) {
+ if (n < 0)
+ warning(WARN_RANGE, "negative adjustment mode");
+ else if (n > ADJUST_MAX)
+ warning(WARN_RANGE, "out-of-range adjustment mode ignored: "
+ "%1", n);
+ else
+ curenv->adjust_mode = n;
+ }
+ }
+ }
+ skip_line();
+}
+
+void no_adjust()
+{
+ curenv->adjust_mode &= ~1;
+ skip_line();
+}
+
+void do_input_trap(int continued)
+{
+ curenv->input_trap_count = 0;
+ if (continued)
+ curenv->continued_input_trap = 1;
+ else
+ curenv->continued_input_trap = 0;
+ int n;
+ if (has_arg() && get_integer(&n)) {
+ if (n <= 0)
+ warning(WARN_RANGE,
+ "number of lines for input trap must be greater than zero");
+ else {
+ symbol s = get_name(true /* required */);
+ if (!s.is_null()) {
+ curenv->input_trap_count = n;
+ curenv->input_trap = s;
+ }
+ }
+ }
+ skip_line();
+}
+
+void input_trap()
+{
+ do_input_trap(0);
+}
+
+void input_trap_continued()
+{
+ do_input_trap(1);
+}
+
+/* tabs */
+
+// must not be R or C or L or a legitimate part of a number expression
+const char TAB_REPEAT_CHAR = 'T';
+
+struct tab {
+ tab *next;
+ hunits pos;
+ tab_type type;
+ tab(hunits, tab_type);
+ enum { BLOCK = 1024 };
+};
+
+tab::tab(hunits x, tab_type t) : next(0), pos(x), type(t)
+{
+}
+
+tab_stops::tab_stops(hunits distance, tab_type type)
+: initial_list(0)
+{
+ repeated_list = new tab(distance, type);
+}
+
+tab_stops::~tab_stops()
+{
+ clear();
+}
+
+tab_type tab_stops::distance_to_next_tab(hunits curpos, hunits *distance)
+{
+ hunits nextpos;
+
+ return distance_to_next_tab(curpos, distance, &nextpos);
+}
+
+tab_type tab_stops::distance_to_next_tab(hunits curpos,
+ hunits *distance,
+ hunits *nextpos)
+{
+ hunits lastpos = 0;
+ tab *tem;
+ for (tem = initial_list; tem && tem->pos <= curpos; tem = tem->next)
+ lastpos = tem->pos;
+ if (tem) {
+ *distance = tem->pos - curpos;
+ *nextpos = tem->pos;
+ return tem->type;
+ }
+ if (repeated_list == 0)
+ return TAB_NONE;
+ hunits base = lastpos;
+ for (;;) {
+ for (tem = repeated_list; tem && tem->pos + base <= curpos;
+ tem = tem->next)
+ lastpos = tem->pos;
+ if (tem) {
+ *distance = tem->pos + base - curpos;
+ *nextpos = tem->pos + base;
+ return tem->type;
+ }
+ if (lastpos < 0)
+ lastpos = 0;
+ base += lastpos;
+ }
+ return TAB_NONE;
+}
+
+const char *tab_stops::to_string()
+{
+ static char *buf = 0;
+ static int buf_size = 0;
+ // figure out a maximum on the amount of space we can need
+ int count = 0;
+ tab *p;
+ for (p = initial_list; p; p = p->next)
+ ++count;
+ for (p = repeated_list; p; p = p->next)
+ ++count;
+ // (10 for digits + 1 for u + 1 for 'C' or 'R') + 2 for ' &' + 1 for '\0'
+ int need = count*12 + 3;
+ if (buf == 0 || need > buf_size) {
+ if (buf)
+ delete[] buf;
+ buf_size = need;
+ buf = new char[buf_size];
+ }
+ char *ptr = buf;
+ for (p = initial_list; p; p = p->next) {
+ strcpy(ptr, i_to_a(p->pos.to_units()));
+ ptr = strchr(ptr, '\0');
+ *ptr++ = 'u';
+ *ptr = '\0';
+ switch (p->type) {
+ case TAB_LEFT:
+ break;
+ case TAB_RIGHT:
+ *ptr++ = 'R';
+ break;
+ case TAB_CENTER:
+ *ptr++ = 'C';
+ break;
+ case TAB_NONE:
+ default:
+ assert(0);
+ }
+ }
+ if (repeated_list)
+ *ptr++ = TAB_REPEAT_CHAR;
+ for (p = repeated_list; p; p = p->next) {
+ strcpy(ptr, i_to_a(p->pos.to_units()));
+ ptr = strchr(ptr, '\0');
+ *ptr++ = 'u';
+ *ptr = '\0';
+ switch (p->type) {
+ case TAB_LEFT:
+ break;
+ case TAB_RIGHT:
+ *ptr++ = 'R';
+ break;
+ case TAB_CENTER:
+ *ptr++ = 'C';
+ break;
+ case TAB_NONE:
+ default:
+ assert(0);
+ }
+ }
+ *ptr++ = '\0';
+ return buf;
+}
+
+tab_stops::tab_stops() : initial_list(0), repeated_list(0)
+{
+}
+
+tab_stops::tab_stops(const tab_stops &ts)
+: initial_list(0), repeated_list(0)
+{
+ tab **p = &initial_list;
+ tab *t = ts.initial_list;
+ while (t) {
+ *p = new tab(t->pos, t->type);
+ t = t->next;
+ p = &(*p)->next;
+ }
+ p = &repeated_list;
+ t = ts.repeated_list;
+ while (t) {
+ *p = new tab(t->pos, t->type);
+ t = t->next;
+ p = &(*p)->next;
+ }
+}
+
+void tab_stops::clear()
+{
+ while (initial_list) {
+ tab *tem = initial_list;
+ initial_list = initial_list->next;
+ delete tem;
+ }
+ while (repeated_list) {
+ tab *tem = repeated_list;
+ repeated_list = repeated_list->next;
+ delete tem;
+ }
+}
+
+void tab_stops::add_tab(hunits pos, tab_type type, int repeated)
+{
+ tab **p;
+ for (p = repeated ? &repeated_list : &initial_list; *p; p = &(*p)->next)
+ ;
+ *p = new tab(pos, type);
+}
+
+
+void tab_stops::operator=(const tab_stops &ts)
+{
+ clear();
+ tab **p = &initial_list;
+ tab *t = ts.initial_list;
+ while (t) {
+ *p = new tab(t->pos, t->type);
+ t = t->next;
+ p = &(*p)->next;
+ }
+ p = &repeated_list;
+ t = ts.repeated_list;
+ while (t) {
+ *p = new tab(t->pos, t->type);
+ t = t->next;
+ p = &(*p)->next;
+ }
+}
+
+void set_tabs()
+{
+ hunits pos;
+ hunits prev_pos = 0;
+ bool is_first_stop = true;
+ bool is_repeating_stop = false;
+ tab_stops tabs;
+ while (has_arg()) {
+ if (tok.ch() == TAB_REPEAT_CHAR) {
+ tok.next();
+ is_repeating_stop = true;
+ prev_pos = 0;
+ }
+ if (!get_hunits(&pos, 'm', prev_pos))
+ break;
+ tab_type type = TAB_LEFT;
+ if (tok.ch() == 'C') {
+ tok.next();
+ type = TAB_CENTER;
+ }
+ else if (tok.ch() == 'R') {
+ tok.next();
+ type = TAB_RIGHT;
+ }
+ else if (tok.ch() == 'L') {
+ tok.next();
+ }
+ if (pos <= prev_pos && ((!is_first_stop) || is_repeating_stop))
+ warning(WARN_RANGE,
+ "positions of tab stops must be strictly increasing");
+ else {
+ tabs.add_tab(pos, type, is_repeating_stop);
+ prev_pos = pos;
+ is_first_stop = false;
+ }
+ }
+ curenv->tabs = tabs;
+ curdiv->modified_tag.incl(MTSM_TA);
+ skip_line();
+}
+
+const char *environment::get_tabs()
+{
+ return tabs.to_string();
+}
+
+tab_type environment::distance_to_next_tab(hunits *distance)
+{
+ return line_tabs
+ ? curenv->tabs.distance_to_next_tab(get_text_length(), distance)
+ : curenv->tabs.distance_to_next_tab(get_input_line_position(), distance);
+}
+
+tab_type environment::distance_to_next_tab(hunits *distance, hunits *leftpos)
+{
+ return line_tabs
+ ? curenv->tabs.distance_to_next_tab(get_text_length(), distance, leftpos)
+ : curenv->tabs.distance_to_next_tab(get_input_line_position(), distance,
+ leftpos);
+}
+
+void field_characters()
+{
+ field_delimiter_char = get_optional_char();
+ if (field_delimiter_char)
+ padding_indicator_char = get_optional_char();
+ else
+ padding_indicator_char = 0;
+ skip_line();
+}
+
+void line_tabs_request()
+{
+ int n;
+ if (has_arg() && get_integer(&n))
+ curenv->line_tabs = n != 0;
+ else
+ curenv->line_tabs = 1;
+ skip_line();
+}
+
+int environment::get_line_tabs()
+{
+ return line_tabs;
+}
+
+void environment::wrap_up_tab()
+{
+ if (!current_tab)
+ return;
+ if (line == 0)
+ start_line();
+ hunits tab_amount;
+ switch (current_tab) {
+ case TAB_RIGHT:
+ tab_amount = tab_distance - tab_width;
+ line = make_tab_node(tab_amount, line);
+ break;
+ case TAB_CENTER:
+ tab_amount = tab_distance - tab_width/2;
+ line = make_tab_node(tab_amount, line);
+ break;
+ case TAB_NONE:
+ case TAB_LEFT:
+ default:
+ assert(0);
+ }
+ width_total += tab_amount;
+ width_total += tab_width;
+ if (current_field) {
+ if (tab_precedes_field) {
+ pre_field_width += tab_amount;
+ tab_precedes_field = 0;
+ }
+ field_distance -= tab_amount;
+ field_spaces += tab_field_spaces;
+ }
+ if (tab_contents != 0) {
+ node *tem;
+ for (tem = tab_contents; tem->next != 0; tem = tem->next)
+ ;
+ tem->next = line;
+ line = tab_contents;
+ }
+ tab_field_spaces = 0;
+ tab_contents = 0;
+ tab_width = H0;
+ tab_distance = H0;
+ current_tab = TAB_NONE;
+}
+
+node *environment::make_tab_node(hunits d, node *next)
+{
+ if (leader_node != 0 && d < 0) {
+ error("motion generated by leader cannot be negative");
+ delete leader_node;
+ leader_node = 0;
+ }
+ if (!leader_node)
+ return new hmotion_node(d, 1, 0, get_fill_color(), next);
+ node *n = new hline_node(d, leader_node, next);
+ leader_node = 0;
+ return n;
+}
+
+void environment::handle_tab(int is_leader)
+{
+ hunits d;
+ hunits absolute;
+ if (current_tab)
+ wrap_up_tab();
+ charinfo *ci = is_leader ? leader_char : tab_char;
+ delete leader_node;
+ leader_node = ci ? make_char_node(ci) : 0;
+ tab_type t = distance_to_next_tab(&d, &absolute);
+ switch (t) {
+ case TAB_NONE:
+ return;
+ case TAB_LEFT:
+ add_node(make_tag("tab L", absolute.to_units()));
+ add_node(make_tab_node(d));
+ return;
+ case TAB_RIGHT:
+ add_node(make_tag("tab R", absolute.to_units()));
+ break;
+ case TAB_CENTER:
+ add_node(make_tag("tab C", absolute.to_units()));
+ break;
+ default:
+ assert(0);
+ }
+ tab_width = 0;
+ tab_distance = d;
+ tab_contents = 0;
+ current_tab = t;
+ tab_field_spaces = 0;
+}
+
+void environment::start_field()
+{
+ assert(!current_field);
+ hunits d;
+ if (distance_to_next_tab(&d) != TAB_NONE) {
+ pre_field_width = get_text_length();
+ field_distance = d;
+ current_field = 1;
+ field_spaces = 0;
+ tab_field_spaces = 0;
+ for (node *p = line; p; p = p->next)
+ if (p->nspaces()) {
+ p->freeze_space();
+ space_total--;
+ }
+ tab_precedes_field = current_tab != TAB_NONE;
+ }
+ else
+ error("zero field width");
+}
+
+void environment::wrap_up_field()
+{
+ if (!current_tab && field_spaces == 0)
+ add_padding();
+ hunits padding = field_distance - (get_text_length() - pre_field_width);
+ if (current_tab && tab_field_spaces != 0) {
+ hunits tab_padding = scale(padding,
+ tab_field_spaces,
+ field_spaces + tab_field_spaces);
+ padding -= tab_padding;
+ distribute_space(tab_contents, tab_field_spaces, tab_padding,
+ true /* force reversal of node list */);
+ tab_field_spaces = 0;
+ tab_width += tab_padding;
+ }
+ if (field_spaces != 0) {
+ distribute_space(line, field_spaces, padding,
+ true /* force reversal of node list */);
+ width_total += padding;
+ if (current_tab) {
+ // the start of the tab has been moved to the right by padding, so
+ tab_distance -= padding;
+ if (tab_distance <= H0) {
+ // use the next tab stop instead
+ current_tab = tabs.distance_to_next_tab(get_input_line_position()
+ - tab_width,
+ &tab_distance);
+ if (current_tab == TAB_NONE || current_tab == TAB_LEFT) {
+ width_total += tab_width;
+ if (current_tab == TAB_LEFT) {
+ line = make_tab_node(tab_distance, line);
+ width_total += tab_distance;
+ current_tab = TAB_NONE;
+ }
+ if (tab_contents != 0) {
+ node *tem;
+ for (tem = tab_contents; tem->next != 0; tem = tem->next)
+ ;
+ tem->next = line;
+ line = tab_contents;
+ tab_contents = 0;
+ }
+ tab_width = H0;
+ tab_distance = H0;
+ }
+ }
+ }
+ }
+ current_field = 0;
+}
+
+void environment::add_padding()
+{
+ if (current_tab) {
+ tab_contents = new space_node(H0, get_fill_color(), tab_contents);
+ tab_field_spaces++;
+ }
+ else {
+ if (line == 0)
+ start_line();
+ line = new space_node(H0, get_fill_color(), line);
+ field_spaces++;
+ }
+}
+
+typedef int (environment::*INT_FUNCP)();
+typedef vunits (environment::*VUNITS_FUNCP)();
+typedef hunits (environment::*HUNITS_FUNCP)();
+typedef const char *(environment::*STRING_FUNCP)();
+
+class int_env_reg : public reg {
+ INT_FUNCP func;
+ public:
+ int_env_reg(INT_FUNCP);
+ const char *get_string();
+ bool get_value(units *val);
+};
+
+class vunits_env_reg : public reg {
+ VUNITS_FUNCP func;
+ public:
+ vunits_env_reg(VUNITS_FUNCP f);
+ const char *get_string();
+ bool get_value(units *val);
+};
+
+
+class hunits_env_reg : public reg {
+ HUNITS_FUNCP func;
+ public:
+ hunits_env_reg(HUNITS_FUNCP f);
+ const char *get_string();
+ bool get_value(units *val);
+};
+
+class string_env_reg : public reg {
+ STRING_FUNCP func;
+public:
+ string_env_reg(STRING_FUNCP);
+ const char *get_string();
+};
+
+int_env_reg::int_env_reg(INT_FUNCP f) : func(f)
+{
+}
+
+bool int_env_reg::get_value(units *val)
+{
+ *val = (curenv->*func)();
+ return true;
+}
+
+const char *int_env_reg::get_string()
+{
+ return i_to_a((curenv->*func)());
+}
+
+vunits_env_reg::vunits_env_reg(VUNITS_FUNCP f) : func(f)
+{
+}
+
+bool vunits_env_reg::get_value(units *val)
+{
+ *val = (curenv->*func)().to_units();
+ return true;
+}
+
+const char *vunits_env_reg::get_string()
+{
+ return i_to_a((curenv->*func)().to_units());
+}
+
+hunits_env_reg::hunits_env_reg(HUNITS_FUNCP f) : func(f)
+{
+}
+
+bool hunits_env_reg::get_value(units *val)
+{
+ *val = (curenv->*func)().to_units();
+ return true;
+}
+
+const char *hunits_env_reg::get_string()
+{
+ return i_to_a((curenv->*func)().to_units());
+}
+
+string_env_reg::string_env_reg(STRING_FUNCP f) : func(f)
+{
+}
+
+const char *string_env_reg::get_string()
+{
+ return (curenv->*func)();
+}
+
+class horizontal_place_reg : public general_reg {
+public:
+ horizontal_place_reg();
+ bool get_value(units *);
+ void set_value(units);
+};
+
+horizontal_place_reg::horizontal_place_reg()
+{
+}
+
+bool horizontal_place_reg::get_value(units *res)
+{
+ *res = curenv->get_input_line_position().to_units();
+ return true;
+}
+
+void horizontal_place_reg::set_value(units n)
+{
+ curenv->set_input_line_position(hunits(n));
+}
+
+int environment::get_zoom()
+{
+ return env_get_zoom(this);
+}
+
+int environment::get_numbering_nodes()
+{
+ return (curenv->numbering_nodes ? 1 : 0);
+}
+
+const char *environment::get_font_family_string()
+{
+ return family->nm.contents();
+}
+
+const char *environment::get_glyph_color_string()
+{
+ return glyph_color->nm.contents();
+}
+
+const char *environment::get_fill_color_string()
+{
+ return fill_color->nm.contents();
+}
+
+const char *environment::get_font_name_string()
+{
+ symbol f = get_font_name(fontno, this);
+ return f.contents();
+}
+
+const char *environment::get_style_name_string()
+{
+ symbol f = get_style_name(fontno);
+ return f.contents();
+}
+
+const char *environment::get_name_string()
+{
+ return name.contents();
+}
+
+// Convert a quantity in scaled points to ascii decimal fraction.
+
+const char *sptoa(int sp)
+{
+ assert(sp > 0);
+ assert(sizescale > 0);
+ if (sizescale == 1)
+ return i_to_a(sp);
+ if (sp % sizescale == 0)
+ return i_to_a(sp/sizescale);
+ // See if 1/sizescale is exactly representable as a decimal fraction,
+ // ie its only prime factors are 2 and 5.
+ int n = sizescale;
+ int power2 = 0;
+ while ((n & 1) == 0) {
+ n >>= 1;
+ power2++;
+ }
+ int power5 = 0;
+ while ((n % 5) == 0) {
+ n /= 5;
+ power5++;
+ }
+ if (n == 1) {
+ int decimal_point = power5 > power2 ? power5 : power2;
+ if (decimal_point <= 10) {
+ int factor = 1;
+ int t;
+ for (t = decimal_point - power2; --t >= 0;)
+ factor *= 2;
+ for (t = decimal_point - power5; --t >= 0;)
+ factor *= 5;
+ if (factor == 1 || sp <= INT_MAX/factor)
+ return if_to_a(sp*factor, decimal_point);
+ }
+ }
+ double s = double(sp)/double(sizescale);
+ double factor = 10.0;
+ double val = s;
+ int decimal_point = 0;
+ do {
+ double v = ceil(s*factor);
+ if (v > INT_MAX)
+ break;
+ val = v;
+ factor *= 10.0;
+ } while (++decimal_point < 10);
+ return if_to_a(int(val), decimal_point);
+}
+
+const char *environment::get_point_size_string()
+{
+ return sptoa(curenv->get_point_size());
+}
+
+const char *environment::get_requested_point_size_string()
+{
+ return sptoa(curenv->get_requested_point_size());
+}
+
+void environment::print_env()
+{
+ // at the time of calling .pev, those values are always zero or
+ // meaningless:
+ //
+ // char_height, char_slant,
+ // interrupted
+ // current_tab, tab_width, tab_distance
+ // current_field, field_distance, pre_field_width, field_spaces,
+ // tab_field_spaces, tab_precedes_field
+ // composite
+ //
+ errprint(" previous line length: %1u\n", prev_line_length.to_units());
+ errprint(" line length: %1u\n", line_length.to_units());
+ errprint(" previous title length: %1u\n", prev_title_length.to_units());
+ errprint(" title length: %1u\n", title_length.to_units());
+ errprint(" previous size: %1p (%2s)\n",
+ prev_size.to_points(), prev_size.to_scaled_points());
+ errprint(" size: %1p (%2s)\n",
+ size.to_points(), size.to_scaled_points());
+ errprint(" previous requested size: %1s\n", prev_requested_size);
+ errprint(" requested size: %1s\n", requested_size);
+ errprint(" previous font number: %1\n", prev_fontno);
+ errprint(" font number: %1\n", fontno);
+ errprint(" previous family: '%1'\n", prev_family->nm.contents());
+ errprint(" family: '%1'\n", family->nm.contents());
+ errprint(" space size: %1/36 em\n", space_size);
+ errprint(" sentence space size: %1/36 em\n", sentence_space_size);
+ errprint(" previous line interrupted: %1\n",
+ prev_line_interrupted ? "yes" : "no");
+ errprint(" fill mode: %1\n", fill ? "on" : "off");
+ errprint(" adjust mode: %1\n",
+ adjust_mode == ADJUST_LEFT
+ ? "left"
+ : adjust_mode == ADJUST_BOTH
+ ? "both"
+ : adjust_mode == ADJUST_CENTER
+ ? "center"
+ : "right");
+ if (center_lines)
+ errprint(" lines to center: %1\n", center_lines);
+ if (right_justify_lines)
+ errprint(" lines to right justify: %1\n", right_justify_lines);
+ errprint(" previous vertical spacing: %1u\n",
+ prev_vertical_spacing.to_units());
+ errprint(" vertical spacing: %1u\n", vertical_spacing.to_units());
+ errprint(" previous post-vertical spacing: %1u\n",
+ prev_post_vertical_spacing.to_units());
+ errprint(" post-vertical spacing: %1u\n",
+ post_vertical_spacing.to_units());
+ errprint(" previous line spacing: %1\n", prev_line_spacing);
+ errprint(" line spacing: %1\n", line_spacing);
+ errprint(" previous indentation: %1u\n", prev_indent.to_units());
+ errprint(" indentation: %1u\n", indent.to_units());
+ errprint(" temporary indentation: %1u\n", temporary_indent.to_units());
+ errprint(" have temporary indentation: %1\n",
+ have_temporary_indent ? "yes" : "no");
+ errprint(" currently used indentation: %1u\n", saved_indent.to_units());
+ errprint(" target text length: %1u\n", target_text_length.to_units());
+ if (underline_lines) {
+ errprint(" lines to underline: %1\n", underline_lines);
+ errprint(" font number before underlining: %1\n", pre_underline_fontno);
+ errprint(" underline spaces: %1\n", underline_spaces ? "yes" : "no");
+ }
+ if (input_trap.contents()) {
+ errprint(" input trap macro: '%1'\n", input_trap.contents());
+ errprint(" input trap line counter: %1\n", input_trap_count);
+ errprint(" continued input trap: %1\n",
+ continued_input_trap ? "yes" : "no");
+ }
+ errprint(" previous text length: %1u\n", prev_text_length.to_units());
+ errprint(" total width: %1u\n", width_total.to_units());
+ errprint(" total number of spaces: %1\n", space_total);
+ errprint(" input line start: %1u\n", input_line_start.to_units());
+ errprint(" line tabs: %1\n", line_tabs ? "yes" : "no");
+ errprint(" discarding: %1\n", discarding ? "yes" : "no");
+ errprint(" spread flag set: %1\n", spread_flag ? "yes" : "no"); // \p
+ if (margin_character_node) {
+ errprint(" margin character flags: %1\n",
+ margin_character_flags == MARGIN_CHARACTER_ON
+ ? "on"
+ : margin_character_flags == MARGIN_CHARACTER_NEXT
+ ? "next"
+ : margin_character_flags == (MARGIN_CHARACTER_ON
+ | MARGIN_CHARACTER_NEXT)
+ ? "on, next"
+ : "none");
+ errprint(" margin character distance: %1u\n",
+ margin_character_distance.to_units());
+ }
+ if (numbering_nodes) {
+ errprint(" line number digit width: %1u\n",
+ line_number_digit_width.to_units());
+ errprint(" separation between number and text: %1 digit spaces\n",
+ number_text_separation);
+ errprint(" line number indentation: %1 digit spaces\n",
+ line_number_indent);
+ errprint(" print line numbers every %1line%1\n",
+ line_number_multiple > 1 ? i_to_a(line_number_multiple) : "",
+ line_number_multiple > 1 ? "s" : "");
+ errprint(" lines not to enumerate: %1\n", no_number_count);
+ }
+ string hf = hyphenation_flags ? "on" : "off";
+ if (hyphenation_flags & HYPHEN_NOT_LAST_LINE)
+ hf += ", not last line";
+ if (hyphenation_flags & HYPHEN_LAST_CHAR)
+ hf += ", last char";
+ if (hyphenation_flags & HYPHEN_NOT_LAST_CHARS)
+ hf += ", not last two chars";
+ if (hyphenation_flags & HYPHEN_FIRST_CHAR)
+ hf += ", first char";
+ if (hyphenation_flags & HYPHEN_NOT_FIRST_CHARS)
+ hf += ", not first two chars";
+ hf += '\0';
+ errprint(" hyphenation_flags: %1\n", hf.contents());
+ errprint(" number of consecutive hyphenated lines: %1\n",
+ hyphen_line_count);
+ errprint(" maximum number of consecutive hyphenated lines: %1\n",
+ hyphen_line_max);
+ errprint(" hyphenation space: %1u\n", hyphenation_space.to_units());
+ errprint(" hyphenation margin: %1u\n", hyphenation_margin.to_units());
+#ifdef WIDOW_CONTROL
+ errprint(" widow control: %1\n", widow_control ? "yes" : "no");
+#endif /* WIDOW_CONTROL */
+}
+
+void print_env()
+{
+ errprint("Current Environment:\n");
+ curenv->print_env();
+ dictionary_iterator iter(env_dictionary);
+ symbol s;
+ environment *e;
+ while (iter.get(&s, (void **)&e)) {
+ assert(!s.is_null());
+ errprint("Environment %1:\n", s.contents());
+ if (e != curenv)
+ e->print_env();
+ else
+ errprint(" current\n");
+ }
+ fflush(stderr);
+ skip_line();
+}
+
+#define init_int_env_reg(name, func) \
+ register_dictionary.define(name, new int_env_reg(&environment::func))
+
+#define init_vunits_env_reg(name, func) \
+ register_dictionary.define(name, new vunits_env_reg(&environment::func))
+
+#define init_hunits_env_reg(name, func) \
+ register_dictionary.define(name, new hunits_env_reg(&environment::func))
+
+#define init_string_env_reg(name, func) \
+ register_dictionary.define(name, new string_env_reg(&environment::func))
+
+void init_env_requests()
+{
+ init_request("ad", adjust);
+ init_request("br", break_request);
+ init_request("brp", break_spread_request);
+ init_request("c2", no_break_control_char);
+ init_request("cc", control_char);
+ init_request("ce", center);
+ init_request("cu", continuous_underline);
+ init_request("ev", environment_switch);
+ init_request("evc", environment_copy);
+ init_request("fam", family_change);
+ init_request("fc", field_characters);
+ init_request("fi", fill);
+ init_request("fcolor", fill_color_change);
+ init_request("ft", font_change);
+ init_request("gcolor", glyph_color_change);
+ init_request("hc", hyphen_char);
+ init_request("hlm", hyphen_line_max_request);
+ init_request("hy", hyphenate_request);
+ init_request("hym", hyphenation_margin_request);
+ init_request("hys", hyphenation_space_request);
+ init_request("in", indent);
+ init_request("it", input_trap);
+ init_request("itc", input_trap_continued);
+ init_request("lc", leader_character);
+ init_request("linetabs", line_tabs_request);
+ init_request("ll", line_length);
+ init_request("ls", line_spacing);
+ init_request("lt", title_length);
+ init_request("mc", margin_character);
+ init_request("na", no_adjust);
+ init_request("nf", no_fill);
+ init_request("nh", no_hyphenate);
+ init_request("nm", number_lines);
+ init_request("nn", no_number);
+ init_request("pev", print_env);
+ init_request("ps", point_size);
+ init_request("pvs", post_vertical_spacing);
+ init_request("rj", right_justify);
+ init_request("sizes", override_sizes);
+ init_request("ss", space_size);
+ init_request("ta", set_tabs);
+ init_request("ti", temporary_indent);
+ init_request("tc", tab_character);
+ init_request("tl", title);
+ init_request("ul", underline);
+ init_request("vs", vertical_spacing);
+#ifdef WIDOW_CONTROL
+ init_request("wdc", widow_control_request);
+#endif /* WIDOW_CONTROL */
+ init_int_env_reg(".b", get_bold);
+ init_vunits_env_reg(".cdp", get_prev_char_depth);
+ init_int_env_reg(".ce", get_center_lines);
+ init_vunits_env_reg(".cht", get_prev_char_height);
+ init_hunits_env_reg(".csk", get_prev_char_skew);
+ init_string_env_reg(".ev", get_name_string);
+ init_int_env_reg(".f", get_font);
+ init_string_env_reg(".fam", get_font_family_string);
+ init_string_env_reg(".fn", get_font_name_string);
+ init_int_env_reg(".height", get_char_height);
+ init_int_env_reg(".hlc", get_hyphen_line_count);
+ init_int_env_reg(".hlm", get_hyphen_line_max);
+ init_int_env_reg(".hy", get_hyphenation_flags);
+ init_hunits_env_reg(".hym", get_hyphenation_margin);
+ init_hunits_env_reg(".hys", get_hyphenation_space);
+ init_hunits_env_reg(".i", get_indent);
+ init_hunits_env_reg(".in", get_saved_indent);
+ init_int_env_reg(".int", get_prev_line_interrupted);
+ init_int_env_reg(".linetabs", get_line_tabs);
+ init_hunits_env_reg(".lt", get_title_length);
+ init_int_env_reg(".j", get_adjust_mode);
+ init_hunits_env_reg(".k", get_text_length);
+ init_int_env_reg(".L", get_line_spacing);
+ init_hunits_env_reg(".l", get_line_length);
+ init_hunits_env_reg(".ll", get_saved_line_length);
+ init_string_env_reg(".M", get_fill_color_string);
+ init_string_env_reg(".m", get_glyph_color_string);
+ init_hunits_env_reg(".n", get_prev_text_length);
+ init_int_env_reg(".nm", get_numbering_nodes);
+ init_int_env_reg(".nn", get_no_number_count);
+ init_int_env_reg(".ps", get_point_size);
+ init_int_env_reg(".psr", get_requested_point_size);
+ init_vunits_env_reg(".pvs", get_post_vertical_spacing);
+ init_int_env_reg(".rj", get_right_justify_lines);
+ init_string_env_reg(".s", get_point_size_string);
+ init_int_env_reg(".slant", get_char_slant);
+ init_int_env_reg(".ss", get_space_size);
+ init_int_env_reg(".sss", get_sentence_space_size);
+ init_string_env_reg(".sr", get_requested_point_size_string);
+ init_string_env_reg(".sty", get_style_name_string);
+ init_string_env_reg(".tabs", get_tabs);
+ init_int_env_reg(".u", get_fill);
+ init_vunits_env_reg(".v", get_vertical_spacing);
+ init_hunits_env_reg(".w", get_prev_char_width);
+ init_int_env_reg(".zoom", get_zoom);
+ register_dictionary.define("ct", new variable_reg(&ct_reg_contents));
+ register_dictionary.define("hp", new horizontal_place_reg);
+ register_dictionary.define("ln", new variable_reg(&next_line_number));
+ register_dictionary.define("rsb", new variable_reg(&rsb_reg_contents));
+ register_dictionary.define("rst", new variable_reg(&rst_reg_contents));
+ register_dictionary.define("sb", new variable_reg(&sb_reg_contents));
+ register_dictionary.define("skw", new variable_reg(&skw_reg_contents));
+ register_dictionary.define("ssc", new variable_reg(&ssc_reg_contents));
+ register_dictionary.define("st", new variable_reg(&st_reg_contents));
+}
+
+// Hyphenation - TeX's hyphenation algorithm with a less fancy implementation.
+
+struct trie_node;
+
+class trie {
+ trie_node *tp;
+ virtual void do_match(int len, void *val) = 0;
+ virtual void do_delete(void *) = 0;
+ void delete_trie_node(trie_node *);
+public:
+ trie() : tp(0) {}
+ virtual ~trie(); // virtual to shut up g++
+ void insert(const char *, int, void *);
+ // find calls do_match for each match it finds
+ void find(const char *pat, int patlen);
+ void clear();
+};
+
+class hyphen_trie : private trie {
+ int *h;
+ void do_match(int i, void *v);
+ void do_delete(void *v);
+ void insert_pattern(const char *pat, int patlen, int *num);
+ void insert_hyphenation(dictionary *ex, const char *pat, int patlen);
+ int hpf_getc(FILE *f);
+public:
+ hyphen_trie() {}
+ ~hyphen_trie() {}
+ void hyphenate(const char *word, int len, int *hyphens);
+ void read_patterns_file(const char *name, int append, dictionary *ex);
+};
+
+struct hyphenation_language {
+ symbol name;
+ dictionary exceptions;
+ hyphen_trie patterns;
+ hyphenation_language(symbol nm) : name(nm), exceptions(501) {}
+ ~hyphenation_language() { }
+};
+
+dictionary language_dictionary(5);
+hyphenation_language *current_language = 0;
+
+static void set_hyphenation_language()
+{
+ symbol nm = get_name(true /* required */);
+ if (!nm.is_null()) {
+ current_language = (hyphenation_language *)language_dictionary.lookup(nm);
+ if (!current_language) {
+ current_language = new hyphenation_language(nm);
+ (void)language_dictionary.lookup(nm, (void *)current_language);
+ }
+ }
+ skip_line();
+}
+
+const int WORD_MAX = 256; // we use unsigned char for offsets in
+ // hyphenation exceptions
+
+static void hyphen_word()
+{
+ if (!current_language) {
+ error("no current hyphenation language");
+ skip_line();
+ return;
+ }
+ char buf[WORD_MAX + 1];
+ unsigned char pos[WORD_MAX + 2];
+ for (;;) {
+ tok.skip();
+ if (tok.is_newline() || tok.is_eof())
+ break;
+ int i = 0;
+ int npos = 0;
+ while (i < WORD_MAX && !tok.is_space() && !tok.is_newline()
+ && !tok.is_eof()) {
+ charinfo *ci = tok.get_char(true /* required */);
+ if (ci == 0) {
+ skip_line();
+ return;
+ }
+ tok.next();
+ if (ci->get_ascii_code() == '-') {
+ if (i > 0 && (npos == 0 || pos[npos - 1] != i))
+ pos[npos++] = i;
+ }
+ else {
+ unsigned char c = ci->get_hyphenation_code();
+ if (c == 0)
+ break;
+ buf[i++] = c;
+ }
+ }
+ if (i > 0) {
+ pos[npos] = 0;
+ buf[i] = 0;
+ unsigned char *tem = new unsigned char[npos + 1];
+ memcpy(tem, pos, npos + 1);
+ tem = (unsigned char *)current_language->exceptions.lookup(symbol(buf),
+ tem);
+ if (tem)
+ delete[] tem;
+ }
+ }
+ skip_line();
+}
+
+struct trie_node {
+ char c;
+ trie_node *down;
+ trie_node *right;
+ void *val;
+ trie_node(char, trie_node *);
+};
+
+trie_node::trie_node(char ch, trie_node *p)
+: c(ch), down(0), right(p), val(0)
+{
+}
+
+trie::~trie()
+{
+ clear();
+}
+
+void trie::clear()
+{
+ delete_trie_node(tp);
+ tp = 0;
+}
+
+
+void trie::delete_trie_node(trie_node *p)
+{
+ if (p) {
+ delete_trie_node(p->down);
+ delete_trie_node(p->right);
+ if (p->val)
+ do_delete(p->val);
+ delete p;
+ }
+}
+
+void trie::insert(const char *pat, int patlen, void *val)
+{
+ trie_node **p = &tp;
+ assert(patlen > 0 && pat != 0);
+ for (;;) {
+ while (*p != 0 && (*p)->c < pat[0])
+ p = &((*p)->right);
+ if (*p == 0 || (*p)->c != pat[0])
+ *p = new trie_node(pat[0], *p);
+ if (--patlen == 0) {
+ (*p)->val = val;
+ break;
+ }
+ ++pat;
+ p = &((*p)->down);
+ }
+}
+
+void trie::find(const char *pat, int patlen)
+{
+ trie_node *p = tp;
+ for (int i = 0; p != 0 && i < patlen; i++) {
+ while (p != 0 && p->c < pat[i])
+ p = p->right;
+ if (p != 0 && p->c == pat[i]) {
+ if (p->val != 0)
+ do_match(i+1, p->val);
+ p = p->down;
+ }
+ else
+ break;
+ }
+}
+
+struct operation {
+ operation *next;
+ short distance;
+ short num;
+ operation(int, int, operation *);
+};
+
+operation::operation(int i, int j, operation *op)
+: next(op), distance(j), num(i)
+{
+}
+
+void hyphen_trie::insert_pattern(const char *pat, int patlen, int *num)
+{
+ operation *op = 0;
+ for (int i = 0; i < patlen+1; i++)
+ if (num[i] != 0)
+ op = new operation(num[i], patlen - i, op);
+ insert(pat, patlen, op);
+}
+
+void hyphen_trie::insert_hyphenation(dictionary *ex, const char *pat,
+ int patlen)
+{
+ char buf[WORD_MAX + 2];
+ unsigned char pos[WORD_MAX + 2];
+ int i = 0, j = 0;
+ int npos = 0;
+ while (j < patlen) {
+ unsigned char c = pat[j++];
+ if (c == '-') {
+ if (i > 0 && (npos == 0 || pos[npos - 1] != i))
+ pos[npos++] = i;
+ }
+ else if (c == ' ')
+ buf[i++] = ' ';
+ else
+ buf[i++] = hpf_code_table[c];
+ }
+ if (i > 0) {
+ pos[npos] = 0;
+ buf[i] = 0;
+ unsigned char *tem = new unsigned char[npos + 1];
+ memcpy(tem, pos, npos + 1);
+ tem = (unsigned char *)ex->lookup(symbol(buf), tem);
+ if (tem)
+ delete[] tem;
+ }
+}
+
+void hyphen_trie::hyphenate(const char *word, int len, int *hyphens)
+{
+ int j;
+ for (j = 0; j < len + 1; j++)
+ hyphens[j] = 0;
+ for (j = 0; j < len - 1; j++) {
+ h = hyphens + j;
+ find(word + j, len - j);
+ }
+}
+
+inline int max(int m, int n)
+{
+ return m > n ? m : n;
+}
+
+void hyphen_trie::do_match(int i, void *v)
+{
+ operation *op = (operation *)v;
+ while (op != 0) {
+ h[i - op->distance] = max(h[i - op->distance], op->num);
+ op = op->next;
+ }
+}
+
+void hyphen_trie::do_delete(void *v)
+{
+ operation *op = (operation *)v;
+ while (op) {
+ operation *tem = op;
+ op = tem->next;
+ delete tem;
+ }
+}
+
+/* We use very simple rules to parse TeX's hyphenation patterns.
+
+ . '%' starts a comment even if preceded by '\'.
+
+ . No support for digraphs and like '\$'.
+
+ . '^^xx' ('x' is 0-9 or a-f), and '^^x' (character code of 'x' in the
+ range 0-127) are recognized; other use of '^' causes an error.
+
+ . No macro expansion.
+
+ . We check for the expression '\patterns{...}' (possibly with
+ whitespace before and after the braces). Everything between the
+ braces is taken as hyphenation patterns. Consequently, '{' and '}'
+ are not allowed in patterns.
+
+ . Similarly, '\hyphenation{...}' gives a list of hyphenation
+ exceptions.
+
+ . '\endinput' is recognized also.
+
+ . For backwards compatibility, if '\patterns' is missing, the
+ whole file is treated as a list of hyphenation patterns (only
+ recognizing '%' as the start of a comment.
+
+*/
+
+int hyphen_trie::hpf_getc(FILE *f)
+{
+ int c = getc(f);
+ int c1;
+ int cc = 0;
+ if (c != '^')
+ return c;
+ c = getc(f);
+ if (c != '^')
+ goto fail;
+ c = getc(f);
+ c1 = getc(f);
+ if (((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f'))
+ && ((c1 >= '0' && c1 <= '9') || (c1 >= 'a' && c1 <= 'f'))) {
+ if (c >= '0' && c <= '9')
+ c -= '0';
+ else
+ c = c - 'a' + 10;
+ if (c1 >= '0' && c1 <= '9')
+ c1 -= '0';
+ else
+ c1 = c1 - 'a' + 10;
+ cc = c * 16 + c1;
+ }
+ else {
+ ungetc(c1, f);
+ if (c >= 0 && c <= 63)
+ cc = c + 64;
+ else if (c >= 64 && c <= 127)
+ cc = c - 64;
+ else
+ goto fail;
+ }
+ return cc;
+fail:
+ error("invalid ^, ^^x, or ^^xx character in hyphenation patterns file");
+ return c;
+}
+
+void hyphen_trie::read_patterns_file(const char *name, int append,
+ dictionary *ex)
+{
+ if (!append)
+ clear();
+ char buf[WORD_MAX + 1];
+ for (int i = 0; i < WORD_MAX + 1; i++)
+ buf[i] = 0;
+ int num[WORD_MAX + 1];
+ errno = 0;
+ char *path = 0;
+ FILE *fp = mac_path->open_file(name, &path);
+ if (fp == 0) {
+ error("can't find hyphenation patterns file '%1'", name);
+ return;
+ }
+ int c = hpf_getc(fp);
+ int have_patterns = 0; // we've seen \patterns
+ int final_pattern = 0; // 1 if we have a trailing closing brace
+ int have_hyphenation = 0; // we've seen \hyphenation
+ int final_hyphenation = 0; // 1 if we have a trailing closing brace
+ int have_keyword = 0; // we've seen either \patterns or \hyphenation
+ int traditional = 0; // don't handle \patterns
+ for (;;) {
+ for (;;) {
+ if (c == '%') { // skip comments
+ do {
+ c = getc(fp);
+ } while (c != EOF && c != '\n');
+ }
+ if (c == EOF || !csspace(c))
+ break;
+ c = hpf_getc(fp);
+ }
+ if (c == EOF) {
+ if (have_keyword || traditional) // we are done
+ break;
+ else { // rescan file in 'traditional' mode
+ rewind(fp);
+ traditional = 1;
+ c = hpf_getc(fp);
+ continue;
+ }
+ }
+ int i = 0;
+ num[0] = 0;
+ if (!(c == '{' || c == '}')) { // skip braces at line start
+ do { // scan patterns
+ if (csdigit(c))
+ num[i] = c - '0';
+ else {
+ buf[i++] = c;
+ num[i] = 0;
+ }
+ c = hpf_getc(fp);
+ } while (i < WORD_MAX && c != EOF && !csspace(c)
+ && c != '%' && c != '{' && c != '}');
+ }
+ if (!traditional) {
+ if (i >= 9 && !strncmp(buf + i - 9, "\\patterns", 9)) {
+ while (csspace(c))
+ c = hpf_getc(fp);
+ if (c == '{') {
+ if (have_patterns || have_hyphenation)
+ error("\\patterns is not allowed inside of %1 group",
+ have_patterns ? "\\patterns" : "\\hyphenation");
+ else {
+ have_patterns = 1;
+ have_keyword = 1;
+ }
+ c = hpf_getc(fp);
+ continue;
+ }
+ }
+ else if (i >= 12 && !strncmp(buf + i - 12, "\\hyphenation", 12)) {
+ while (csspace(c))
+ c = hpf_getc(fp);
+ if (c == '{') {
+ if (have_patterns || have_hyphenation)
+ error("\\hyphenation is not allowed inside of %1 group",
+ have_patterns ? "\\patterns" : "\\hyphenation");
+ else {
+ have_hyphenation = 1;
+ have_keyword = 1;
+ }
+ c = hpf_getc(fp);
+ continue;
+ }
+ }
+ else if (strstr(buf, "\\endinput")) {
+ if (have_patterns || have_hyphenation)
+ error("found \\endinput inside of %1 group",
+ have_patterns ? "\\patterns" : "\\hyphenation");
+ break;
+ }
+ else if (c == '}') {
+ if (have_patterns) {
+ have_patterns = 0;
+ if (i > 0)
+ final_pattern = 1;
+ }
+ else if (have_hyphenation) {
+ have_hyphenation = 0;
+ if (i > 0)
+ final_hyphenation = 1;
+ }
+ c = hpf_getc(fp);
+ }
+ else if (c == '{') {
+ if (have_patterns || have_hyphenation)
+ error("'{' is not allowed within %1 group",
+ have_patterns ? "\\patterns" : "\\hyphenation");
+ c = hpf_getc(fp); // skipped if not starting \patterns
+ // or \hyphenation
+ }
+ }
+ else {
+ if (c == '{' || c == '}')
+ c = hpf_getc(fp);
+ }
+ if (i > 0) {
+ if (have_patterns || final_pattern || traditional) {
+ for (int j = 0; j < i; j++)
+ buf[j] = hpf_code_table[(unsigned char)buf[j]];
+ insert_pattern(buf, i, num);
+ final_pattern = 0;
+ }
+ else if (have_hyphenation || final_hyphenation) {
+ // hyphenation exceptions in a pattern file are subject to `.hy'
+ // restrictions; we mark such entries with a trailing space
+ buf[i++] = ' ';
+ insert_hyphenation(ex, buf, i);
+ final_hyphenation = 0;
+ }
+ }
+ }
+ fclose(fp);
+ free(path);
+ return;
+}
+
+void hyphenate(hyphen_list *h, unsigned flags)
+{
+ if (!current_language)
+ return;
+ while (h) {
+ while (h && h->hyphenation_code == 0)
+ h = h->next;
+ int len = 0;
+ char hbuf[WORD_MAX + 2];
+ char *buf = hbuf + 1;
+ hyphen_list *tem;
+ for (tem = h; tem && len < WORD_MAX; tem = tem->next) {
+ if (tem->hyphenation_code != 0)
+ buf[len++] = tem->hyphenation_code;
+ else
+ break;
+ }
+ hyphen_list *nexth = tem;
+ if (len >= 2) {
+ // check `.hw' entries
+ buf[len] = 0;
+ unsigned char *pos
+ = (unsigned char *)current_language->exceptions.lookup(buf);
+ if (pos != 0) {
+ int j = 0;
+ int i = 1;
+ for (tem = h; tem != 0; tem = tem->next, i++)
+ if (pos[j] == i) {
+ tem->hyphen = 1;
+ j++;
+ }
+ }
+ else {
+ // check `\hyphenation' entries from pattern files;
+ // such entries are marked with a trailing space
+ buf[len] = ' ';
+ buf[len + 1] = 0;
+ pos = (unsigned char *)current_language->exceptions.lookup(buf);
+ if (pos != 0) {
+ int j = 0;
+ int i = 1;
+ tem = h;
+ if (pos[j] == i) {
+ if (flags & HYPHEN_FIRST_CHAR)
+ tem->hyphen = 1;
+ j++;
+ }
+ tem = tem->next;
+ i++;
+ if (pos[j] == i) {
+ if (!(flags & HYPHEN_NOT_FIRST_CHARS))
+ tem->hyphen = 1;
+ j++;
+ }
+ tem = tem->next;
+ i++;
+ if (!(flags & HYPHEN_LAST_CHAR))
+ --len;
+ if (flags & HYPHEN_NOT_LAST_CHARS)
+ --len;
+ for (; i < len && tem; tem = tem->next, i++)
+ if (pos[j] == i) {
+ tem->hyphen = 1;
+ j++;
+ }
+ }
+ else {
+ hbuf[0] = hbuf[len + 1] = '.';
+ int num[WORD_MAX + 3];
+ current_language->patterns.hyphenate(hbuf, len + 2, num);
+ // The position of a hyphenation point gets marked with an odd
+ // number. Example:
+ //
+ // hbuf: . h e l p f u l .
+ // num: 0 0 0 2 4 3 0 0 0 0
+ if (!(flags & HYPHEN_FIRST_CHAR))
+ num[2] = 0;
+ if (flags & HYPHEN_NOT_FIRST_CHARS)
+ num[3] = 0;
+ if (flags & HYPHEN_LAST_CHAR)
+ ++len;
+ if (flags & HYPHEN_NOT_LAST_CHARS)
+ --len;
+ int i;
+ for (i = 2, tem = h; i < len && tem; tem = tem->next, i++)
+ if (num[i] & 1)
+ tem->hyphen = 1;
+ }
+ }
+ }
+ h = nexth;
+ }
+}
+
+static void do_hyphenation_patterns_file(bool append)
+{
+ symbol name = get_long_name(true /* required */);
+ if (!name.is_null()) {
+ if (!current_language)
+ error("no current hyphenation language");
+ else
+ current_language->patterns.read_patterns_file(
+ name.contents(), append,
+ &current_language->exceptions);
+ }
+ skip_line();
+}
+
+static void hyphenation_patterns_file()
+{
+ do_hyphenation_patterns_file(false /* append */);
+}
+
+static void hyphenation_patterns_file_append()
+{
+ do_hyphenation_patterns_file(true /* append */);
+}
+
+class hyphenation_language_reg : public reg {
+public:
+ const char *get_string();
+};
+
+const char *hyphenation_language_reg::get_string()
+{
+ return current_language ? current_language->name.contents() : "";
+}
+
+void init_hyphen_requests()
+{
+ init_request("hw", hyphen_word);
+ init_request("hla", set_hyphenation_language);
+ init_request("hpf", hyphenation_patterns_file);
+ init_request("hpfa", hyphenation_patterns_file_append);
+ register_dictionary.define(".hla", new hyphenation_language_reg);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/roff/troff/env.h b/src/roff/troff/env.h
new file mode 100644
index 0000000..f6c1d21
--- /dev/null
+++ b/src/roff/troff/env.h
@@ -0,0 +1,421 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+class statem;
+
+struct size_range {
+ int min;
+ int max;
+};
+
+class font_size {
+ static size_range *size_table;
+ static int nranges;
+ int p;
+public:
+ font_size();
+ font_size(int points);
+ int to_points();
+ int to_scaled_points();
+ int to_units();
+ int operator==(font_size);
+ int operator!=(font_size);
+ static void init_size_table(int *sizes);
+};
+
+inline font_size::font_size() : p(0)
+{
+}
+
+inline int font_size::operator==(font_size fs)
+{
+ return p == fs.p;
+}
+
+inline int font_size::operator!=(font_size fs)
+{
+ return p != fs.p;
+}
+
+inline int font_size::to_scaled_points()
+{
+ return p;
+}
+
+inline int font_size::to_points()
+{
+ return p/sizescale;
+}
+
+class environment;
+
+hunits env_digit_width(environment *);
+hunits env_space_width(environment *);
+hunits env_sentence_space_width(environment *);
+hunits env_narrow_space_width(environment *);
+hunits env_half_narrow_space_width(environment *);
+int env_get_zoom(environment *);
+
+struct tab;
+
+enum tab_type { TAB_NONE, TAB_LEFT, TAB_CENTER, TAB_RIGHT };
+
+class tab_stops {
+ tab *initial_list;
+ tab *repeated_list;
+public:
+ tab_stops();
+ tab_stops(hunits distance, tab_type type);
+ tab_stops(const tab_stops &);
+ ~tab_stops();
+ void operator=(const tab_stops &);
+ tab_type distance_to_next_tab(hunits pos, hunits *distance);
+ tab_type distance_to_next_tab(hunits curpos, hunits *distance, hunits *leftpos);
+ void clear();
+ void add_tab(hunits pos, tab_type type, int repeated);
+ const char *to_string();
+};
+
+const unsigned MARGIN_CHARACTER_ON = 1;
+const unsigned MARGIN_CHARACTER_NEXT = 2;
+
+class charinfo;
+struct node;
+struct breakpoint;
+class font_family;
+class pending_output_line;
+
+// declarations to avoid friend name injection problems
+void title_length();
+void space_size();
+void fill();
+void no_fill();
+void adjust();
+void no_adjust();
+void center();
+void right_justify();
+void vertical_spacing();
+void post_vertical_spacing();
+void line_spacing();
+void line_length();
+void indent();
+void temporary_indent();
+void do_underline(int);
+void do_input_trap(int);
+void set_tabs();
+void margin_character();
+void no_number();
+void number_lines();
+void leader_character();
+void tab_character();
+void hyphenate_request();
+void no_hyphenate();
+void hyphen_line_max_request();
+void hyphenation_space_request();
+void hyphenation_margin_request();
+void line_width();
+#if 0
+void tabs_save();
+void tabs_restore();
+#endif
+void line_tabs_request();
+void title();
+#ifdef WIDOW_CONTROL
+void widow_control_request();
+#endif /* WIDOW_CONTROL */
+
+class environment {
+ int dummy; // dummy environment used for \w
+ hunits prev_line_length;
+ hunits line_length;
+ hunits prev_title_length;
+ hunits title_length;
+ font_size prev_size;
+ font_size size;
+ int requested_size;
+ int prev_requested_size;
+ int char_height;
+ int char_slant;
+ int prev_fontno;
+ int fontno;
+ font_family *prev_family;
+ font_family *family;
+ int space_size; // in 36ths of an em
+ int sentence_space_size; // same but for spaces at the end of sentences
+ int adjust_mode;
+ int fill;
+ int interrupted;
+ int prev_line_interrupted;
+ int center_lines;
+ int right_justify_lines;
+ vunits prev_vertical_spacing;
+ vunits vertical_spacing;
+ vunits prev_post_vertical_spacing;
+ vunits post_vertical_spacing;
+ int prev_line_spacing;
+ int line_spacing;
+ hunits prev_indent;
+ hunits indent;
+ hunits temporary_indent;
+ int have_temporary_indent;
+ hunits saved_indent;
+ hunits target_text_length;
+ int pre_underline_fontno;
+ int underline_lines;
+ int underline_spaces;
+ symbol input_trap;
+ int input_trap_count;
+ int continued_input_trap;
+ node *line; // in reverse order
+ hunits prev_text_length;
+ hunits width_total;
+ int space_total;
+ hunits input_line_start;
+ node *tab_contents;
+ hunits tab_width;
+ hunits tab_distance;
+ int line_tabs;
+ tab_type current_tab;
+ node *leader_node;
+ charinfo *tab_char;
+ charinfo *leader_char;
+ int current_field; // is there a current field?
+ hunits field_distance;
+ hunits pre_field_width;
+ int field_spaces;
+ int tab_field_spaces;
+ int tab_precedes_field;
+ int discarding;
+ int spread_flag; // set by \p
+ unsigned margin_character_flags;
+ node *margin_character_node;
+ hunits margin_character_distance;
+ node *numbering_nodes;
+ hunits line_number_digit_width;
+ int number_text_separation; // in digit spaces
+ int line_number_indent; // in digit spaces
+ int line_number_multiple;
+ int no_number_count;
+ unsigned hyphenation_flags;
+ int hyphen_line_count;
+ int hyphen_line_max;
+ hunits hyphenation_space;
+ hunits hyphenation_margin;
+ int composite; // used for construction of composite char?
+ pending_output_line *pending_lines;
+#ifdef WIDOW_CONTROL
+ int widow_control;
+#endif /* WIDOW_CONTROL */
+ color *glyph_color;
+ color *prev_glyph_color;
+ color *fill_color;
+ color *prev_fill_color;
+
+ tab_type distance_to_next_tab(hunits *);
+ tab_type distance_to_next_tab(hunits *distance, hunits *leftpos);
+ void start_line();
+ void output_line(node *, hunits, int);
+ void output(node *nd, int retain_size, vunits vs, vunits post_vs,
+ hunits width, int was_centered);
+ void output_title(node *nd, int retain_size, vunits vs, vunits post_vs,
+ hunits width);
+#ifdef WIDOW_CONTROL
+ void mark_last_line();
+#endif /* WIDOW_CONTROL */
+ breakpoint *choose_breakpoint();
+ void hyphenate_line(int start_here = 0);
+ void start_field();
+ void wrap_up_field();
+ void add_padding();
+ node *make_tab_node(hunits d, node *next = 0);
+ node *get_prev_char();
+public:
+ int seen_space;
+ int seen_eol;
+ int suppress_next_eol;
+ int seen_break;
+ tab_stops tabs;
+ const symbol name;
+ unsigned char control_char;
+ unsigned char no_break_control_char;
+ charinfo *hyphen_indicator_char;
+
+ environment(symbol);
+ environment(const environment *); // for temporary environment
+ ~environment();
+ statem *construct_state(int only_eol);
+ void print_env();
+ void copy(const environment *);
+ int is_dummy() { return dummy; }
+ int is_empty();
+ int is_composite() { return composite; }
+ void set_composite() { composite = 1; }
+ vunits get_vertical_spacing(); // .v
+ vunits get_post_vertical_spacing(); // .pvs
+ int get_line_spacing(); // .L
+ vunits total_post_vertical_spacing();
+ int get_point_size() { return size.to_scaled_points(); }
+ font_size get_font_size() { return size; }
+ int get_size() { return size.to_units(); }
+ int get_requested_point_size() { return requested_size; }
+ int get_char_height() { return char_height; }
+ int get_char_slant() { return char_slant; }
+ hunits get_digit_width();
+ int get_font() { return fontno; }; // .f
+ int get_zoom(); // .zoom
+ int get_numbering_nodes(); // .nm
+ font_family *get_family() { return family; }
+ int get_bold(); // .b
+ int get_adjust_mode(); // .j
+ int get_fill(); // .u
+ hunits get_indent(); // .i
+ hunits get_temporary_indent();
+ hunits get_line_length(); // .l
+ hunits get_saved_line_length(); // .ll
+ hunits get_saved_indent(); // .in
+ hunits get_title_length();
+ hunits get_prev_char_width(); // .w
+ hunits get_prev_char_skew();
+ vunits get_prev_char_height();
+ vunits get_prev_char_depth();
+ hunits get_text_length(); // .k
+ hunits get_prev_text_length(); // .n
+ hunits get_space_width() { return env_space_width(this); }
+ int get_space_size() { return space_size; } // in ems/36
+ int get_sentence_space_size() { return sentence_space_size; }
+ hunits get_narrow_space_width() { return env_narrow_space_width(this); }
+ hunits get_half_narrow_space_width()
+ { return env_half_narrow_space_width(this); }
+ hunits get_input_line_position();
+ const char *get_tabs();
+ int get_line_tabs();
+ int get_hyphenation_flags();
+ int get_hyphen_line_max();
+ int get_hyphen_line_count();
+ hunits get_hyphenation_space();
+ hunits get_hyphenation_margin();
+ int get_center_lines();
+ int get_right_justify_lines();
+ int get_no_number_count();
+ int get_prev_line_interrupted() { return prev_line_interrupted; }
+ color *get_fill_color();
+ color *get_glyph_color();
+ color *get_prev_glyph_color();
+ color *get_prev_fill_color();
+ void set_glyph_color(color *c);
+ void set_fill_color(color *c);
+ node *make_char_node(charinfo *);
+ node *extract_output_line();
+ void width_registers();
+ void wrap_up_tab();
+ bool set_font(int);
+ bool set_font(symbol);
+ void set_family(symbol);
+ void set_size(int);
+ void set_char_height(int);
+ void set_char_slant(int);
+ void set_input_line_position(hunits); // used by \n(hp
+ void interrupt();
+ void spread() { spread_flag = 1; }
+ void possibly_break_line(int start_here = 0, int forced = 0);
+ void do_break(int spread = 0); // .br
+ void final_break();
+ node *make_tag(const char *name, int i);
+ void newline();
+ void handle_tab(int is_leader = 0); // do a tab or leader
+ void add_node(node *);
+ void add_char(charinfo *);
+ void add_hyphen_indicator();
+ void add_italic_correction();
+ void space();
+ void space(hunits, hunits);
+ void space_newline();
+ const char *get_glyph_color_string();
+ const char *get_fill_color_string();
+ const char *get_font_family_string();
+ const char *get_font_name_string();
+ const char *get_style_name_string();
+ const char *get_name_string();
+ const char *get_point_size_string();
+ const char *get_requested_point_size_string();
+ void output_pending_lines();
+ void construct_format_state(node *n, int was_centered, int fill);
+ void construct_new_line_state(node *n);
+ void dump_troff_state();
+
+ friend void title_length();
+ friend void space_size();
+ friend void fill();
+ friend void no_fill();
+ friend void adjust();
+ friend void no_adjust();
+ friend void center();
+ friend void right_justify();
+ friend void vertical_spacing();
+ friend void post_vertical_spacing();
+ friend void line_spacing();
+ friend void line_length();
+ friend void indent();
+ friend void temporary_indent();
+ friend void do_underline(int);
+ friend void do_input_trap(int);
+ friend void set_tabs();
+ friend void margin_character();
+ friend void no_number();
+ friend void number_lines();
+ friend void leader_character();
+ friend void tab_character();
+ friend void hyphenate_request();
+ friend void no_hyphenate();
+ friend void hyphen_line_max_request();
+ friend void hyphenation_space_request();
+ friend void hyphenation_margin_request();
+ friend void line_width();
+#if 0
+ friend void tabs_save();
+ friend void tabs_restore();
+#endif
+ friend void line_tabs_request();
+ friend void title();
+#ifdef WIDOW_CONTROL
+ friend void widow_control_request();
+#endif /* WIDOW_CONTROL */
+
+ friend void do_divert(int append, int boxing);
+};
+
+extern environment *curenv;
+extern void pop_env();
+extern void push_env(int);
+
+void init_environments();
+void read_hyphen_file(const char *name);
+
+extern double spread_limit;
+
+extern int break_flag;
+extern symbol default_family;
+extern int translate_space_to_dummy;
+
+extern unsigned char hpf_code_table[];
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/roff/troff/hvunits.h b/src/roff/troff/hvunits.h
new file mode 100644
index 0000000..e47a0a0
--- /dev/null
+++ b/src/roff/troff/hvunits.h
@@ -0,0 +1,339 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+class vunits {
+ int n;
+public:
+ vunits();
+ vunits(units);
+ units to_units();
+ int is_zero();
+ vunits& operator+=(const vunits&);
+ vunits& operator-=(const vunits&);
+ friend inline vunits scale(vunits n, units x, units y); // scale n by x/y
+ friend inline vunits scale(vunits n, vunits x, vunits y);
+ friend inline vunits operator +(const vunits&, const vunits&);
+ friend inline vunits operator -(const vunits&, const vunits&);
+ friend inline vunits operator -(const vunits&);
+ friend inline int operator /(const vunits&, const vunits&);
+ friend inline vunits operator /(const vunits&, int);
+ friend inline vunits operator *(const vunits&, int);
+ friend inline vunits operator *(int, const vunits&);
+ friend inline int operator <(const vunits&, const vunits&);
+ friend inline int operator >(const vunits&, const vunits&);
+ friend inline int operator <=(const vunits&, const vunits&);
+ friend inline int operator >=(const vunits&, const vunits&);
+ friend inline int operator ==(const vunits&, const vunits&);
+ friend inline int operator !=(const vunits&, const vunits&);
+};
+
+extern const vunits V0;
+
+
+class hunits {
+ int n;
+public:
+ hunits();
+ hunits(units);
+ units to_units();
+ int is_zero();
+ hunits& operator+=(const hunits&);
+ hunits& operator-=(const hunits&);
+ friend inline hunits scale(hunits n, units x, units y); // scale n by x/y
+ friend inline hunits scale(hunits n, double x);
+ friend inline hunits operator +(const hunits&, const hunits&);
+ friend inline hunits operator -(const hunits&, const hunits&);
+ friend inline hunits operator -(const hunits&);
+ friend inline int operator /(const hunits&, const hunits&);
+ friend inline hunits operator /(const hunits&, int);
+ friend inline hunits operator *(const hunits&, int);
+ friend inline hunits operator *(int, const hunits&);
+ friend inline int operator <(const hunits&, const hunits&);
+ friend inline int operator >(const hunits&, const hunits&);
+ friend inline int operator <=(const hunits&, const hunits&);
+ friend inline int operator >=(const hunits&, const hunits&);
+ friend inline int operator ==(const hunits&, const hunits&);
+ friend inline int operator !=(const hunits&, const hunits&);
+};
+
+extern const hunits H0;
+
+extern int get_vunits(vunits *, unsigned char si);
+extern int get_hunits(hunits *, unsigned char si);
+extern int get_vunits(vunits *, unsigned char si, vunits prev_value);
+extern int get_hunits(hunits *, unsigned char si, hunits prev_value);
+
+inline vunits:: vunits() : n(0)
+{
+}
+
+inline units vunits::to_units()
+{
+ return n*vresolution;
+}
+
+inline int vunits::is_zero()
+{
+ return n == 0;
+}
+
+inline vunits operator +(const vunits & x, const vunits & y)
+{
+ vunits r;
+ r = x;
+ r.n += y.n;
+ return r;
+}
+
+inline vunits operator -(const vunits & x, const vunits & y)
+{
+ vunits r;
+ r = x;
+ r.n -= y.n;
+ return r;
+}
+
+inline vunits operator -(const vunits & x)
+{
+ vunits r;
+ r.n = -x.n;
+ return r;
+}
+
+inline int operator /(const vunits & x, const vunits & y)
+{
+ return x.n/y.n;
+}
+
+inline vunits operator /(const vunits & x, int n)
+{
+ vunits r;
+ r = x;
+ r.n /= n;
+ return r;
+}
+
+inline vunits operator *(const vunits & x, int n)
+{
+ vunits r;
+ r = x;
+ r.n *= n;
+ return r;
+}
+
+inline vunits operator *(int n, const vunits & x)
+{
+ vunits r;
+ r = x;
+ r.n *= n;
+ return r;
+}
+
+inline int operator <(const vunits & x, const vunits & y)
+{
+ return x.n < y.n;
+}
+
+inline int operator >(const vunits & x, const vunits & y)
+{
+ return x.n > y.n;
+}
+
+inline int operator <=(const vunits & x, const vunits & y)
+{
+ return x.n <= y.n;
+}
+
+inline int operator >=(const vunits & x, const vunits & y)
+{
+ return x.n >= y.n;
+}
+
+inline int operator ==(const vunits & x, const vunits & y)
+{
+ return x.n == y.n;
+}
+
+inline int operator !=(const vunits & x, const vunits & y)
+{
+ return x.n != y.n;
+}
+
+
+inline vunits& vunits::operator+=(const vunits & x)
+{
+ n += x.n;
+ return *this;
+}
+
+inline vunits& vunits::operator-=(const vunits & x)
+{
+ n -= x.n;
+ return *this;
+}
+
+inline hunits:: hunits() : n(0)
+{
+}
+
+inline units hunits::to_units()
+{
+ return n*hresolution;
+}
+
+inline int hunits::is_zero()
+{
+ return n == 0;
+}
+
+inline hunits operator +(const hunits & x, const hunits & y)
+{
+ hunits r;
+ r = x;
+ r.n += y.n;
+ return r;
+}
+
+inline hunits operator -(const hunits & x, const hunits & y)
+{
+ hunits r;
+ r = x;
+ r.n -= y.n;
+ return r;
+}
+
+inline hunits operator -(const hunits & x)
+{
+ hunits r;
+ r = x;
+ r.n = -x.n;
+ return r;
+}
+
+inline int operator /(const hunits & x, const hunits & y)
+{
+ return x.n/y.n;
+}
+
+inline hunits operator /(const hunits & x, int n)
+{
+ hunits r;
+ r = x;
+ r.n /= n;
+ return r;
+}
+
+inline hunits operator *(const hunits & x, int n)
+{
+ hunits r;
+ r = x;
+ r.n *= n;
+ return r;
+}
+
+inline hunits operator *(int n, const hunits & x)
+{
+ hunits r;
+ r = x;
+ r.n *= n;
+ return r;
+}
+
+inline int operator <(const hunits & x, const hunits & y)
+{
+ return x.n < y.n;
+}
+
+inline int operator >(const hunits & x, const hunits & y)
+{
+ return x.n > y.n;
+}
+
+inline int operator <=(const hunits & x, const hunits & y)
+{
+ return x.n <= y.n;
+}
+
+inline int operator >=(const hunits & x, const hunits & y)
+{
+ return x.n >= y.n;
+}
+
+inline int operator ==(const hunits & x, const hunits & y)
+{
+ return x.n == y.n;
+}
+
+inline int operator !=(const hunits & x, const hunits & y)
+{
+ return x.n != y.n;
+}
+
+
+inline hunits& hunits::operator+=(const hunits & x)
+{
+ n += x.n;
+ return *this;
+}
+
+inline hunits& hunits::operator-=(const hunits & x)
+{
+ n -= x.n;
+ return *this;
+}
+
+inline hunits scale(hunits n, units x, units y)
+{
+ hunits r;
+ r.n = scale(n.n, x, y);
+ return r;
+}
+
+inline vunits scale(vunits n, units x, units y)
+{
+ vunits r;
+ r.n = scale(n.n, x, y);
+ return r;
+}
+
+inline vunits scale(vunits n, vunits x, vunits y)
+{
+ vunits r;
+ r.n = scale(n.n, x.n, y.n);
+ return r;
+}
+
+inline hunits scale(hunits n, double x)
+{
+ hunits r;
+ r.n = int(n.n*x);
+ return r;
+}
+
+inline units scale(units n, double x)
+{
+ return int(n*x);
+}
+
+inline units points_to_units(units n)
+{
+ return scale(n, units_per_inch, 72);
+}
+
diff --git a/src/roff/troff/input.cpp b/src/roff/troff/input.cpp
new file mode 100644
index 0000000..292ee73
--- /dev/null
+++ b/src/roff/troff/input.cpp
@@ -0,0 +1,9209 @@
+/* Copyright (C) 1989-2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "troff.h"
+#include "dictionary.h"
+#include "hvunits.h"
+#include "stringclass.h"
+#include "mtsm.h"
+#include "env.h"
+#include "request.h"
+#include "node.h"
+#include "token.h"
+#include "div.h"
+#include "reg.h"
+#include "font.h"
+#include "charinfo.h"
+#include "macropath.h"
+#include "input.h"
+#include "defs.h"
+#include "unicode.h"
+#include "curtime.h"
+
+// Needed for getpid() and isatty()
+#include "posix.h"
+
+#include "nonposix.h"
+
+#ifdef NEED_DECLARATION_PUTENV
+extern "C" {
+ int putenv(const char *);
+}
+#endif /* NEED_DECLARATION_PUTENV */
+
+#define MACRO_PREFIX "tmac."
+#define MACRO_POSTFIX ".tmac"
+#define INITIAL_STARTUP_FILE "troffrc"
+#define FINAL_STARTUP_FILE "troffrc-end"
+#define DEFAULT_INPUT_STACK_LIMIT 1000
+
+#ifndef DEFAULT_WARNING_MASK
+// warnings that are enabled by default
+#define DEFAULT_WARNING_MASK \
+ (WARN_CHAR|WARN_NUMBER|WARN_BREAK|WARN_SPACE|WARN_FONT|WARN_FILE)
+#endif
+
+// initial size of buffer for reading names; expanded as necessary
+#define ABUF_SIZE 16
+
+extern "C" const char *program_name;
+extern "C" const char *Version_string;
+
+#ifdef COLUMN
+void init_column_requests();
+#endif /* COLUMN */
+
+static node *read_draw_node();
+static void read_color_draw_node(token &);
+static void push_token(const token &);
+void copy_file();
+#ifdef COLUMN
+void vjustify();
+#endif /* COLUMN */
+void transparent_file();
+
+token tok;
+int break_flag = 0;
+int class_flag = 0;
+int color_flag = 1; // colors are on by default
+static int backtrace_flag = 0;
+#ifndef POPEN_MISSING
+char *pipe_command = 0;
+#endif
+charinfo *charset_table[256];
+unsigned char hpf_code_table[256];
+
+static int warning_mask = DEFAULT_WARNING_MASK;
+static int inhibit_errors = 0;
+static int ignoring = 0;
+
+static void enable_warning(const char *);
+static void disable_warning(const char *);
+
+static int escape_char = '\\';
+static symbol end_of_input_macro_name;
+static symbol blank_line_macro_name;
+static symbol leading_spaces_macro_name;
+static int compatible_flag = 0;
+static int do_old_compatible_flag = -1; // for .do request
+int ascii_output_flag = 0;
+int suppress_output_flag = 0;
+int is_html = 0;
+int begin_level = 0; // number of nested \O escapes
+
+int have_input = 0; // whether \f, \F, \D'F...', \H, \m, \M,
+ // \O[345], \R, \s, or \S has been processed
+ // in token::next()
+int old_have_input = 0; // value of have_input right before \n
+bool device_has_tcommand = false; // 't' output command supported
+int unsafe_flag = 0; // safer by default
+
+bool have_multiple_params = false; // e.g., \[e aa], \*[foo bar]
+
+double spread_limit = -3.0 - 1.0; // negative means deactivated
+
+double warn_scale;
+char warn_scaling_indicator;
+int debug_state = 0; // turns on debugging of the html troff state
+
+search_path *mac_path = &safer_macro_path;
+
+// Defaults to the current directory.
+search_path include_search_path(0, 0, 0, 1);
+
+static int get_copy(node**, bool = false, bool = false);
+static void copy_mode_error(const char *,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg);
+
+enum read_mode { ALLOW_EMPTY, WITH_ARGS, NO_ARGS };
+static symbol read_escape_parameter(read_mode = NO_ARGS);
+static symbol read_long_escape_parameters(read_mode = NO_ARGS);
+static void interpolate_string(symbol);
+static void interpolate_string_with_args(symbol);
+static void interpolate_macro(symbol, bool = false);
+static void interpolate_number_format(symbol);
+static void interpolate_environment_variable(symbol);
+
+static symbol composite_glyph_name(symbol);
+static void interpolate_arg(symbol);
+static request_or_macro *lookup_request(symbol);
+static int get_delim_number(units *, unsigned char);
+static int get_delim_number(units *, unsigned char, units);
+static symbol do_get_long_name(bool, char);
+static int get_line_arg(units *res, unsigned char si, charinfo **cp);
+static bool read_size(int *);
+static symbol get_delim_name();
+static void init_registers();
+static void trapping_blank_line();
+
+class input_iterator;
+input_iterator *make_temp_iterator(const char *);
+const char *input_char_description(int);
+
+void process_input_stack();
+void chop_macro(); // declare to avoid friend name injection
+
+
+void set_escape_char()
+{
+ if (has_arg()) {
+ if (tok.ch() == 0) {
+ error("cannot select invalid escape character; using '\\'");
+ escape_char = '\\';
+ }
+ else
+ escape_char = tok.ch();
+ }
+ else
+ escape_char = '\\';
+ skip_line();
+}
+
+void escape_off()
+{
+ escape_char = 0;
+ skip_line();
+}
+
+static int saved_escape_char = '\\';
+
+void save_escape_char()
+{
+ saved_escape_char = escape_char;
+ skip_line();
+}
+
+void restore_escape_char()
+{
+ escape_char = saved_escape_char;
+ skip_line();
+}
+
+struct arg_list;
+
+class input_iterator {
+public:
+ input_iterator();
+ input_iterator(int is_div);
+ virtual ~input_iterator() {}
+ int get(node **);
+ friend class input_stack;
+ int is_diversion;
+ statem *diversion_state;
+protected:
+ const unsigned char *ptr;
+ const unsigned char *eptr;
+ input_iterator *next;
+private:
+ virtual int fill(node **);
+ virtual int peek();
+ virtual int has_args() { return 0; }
+ virtual int nargs() { return 0; }
+ virtual input_iterator *get_arg(int) { return 0; }
+ virtual arg_list *get_arg_list() { return 0; }
+ virtual symbol get_macro_name() { return NULL_SYMBOL; }
+ virtual int space_follows_arg(int) { return 0; }
+ virtual int get_break_flag() { return 0; }
+ virtual int get_location(int, const char **, int *) { return 0; }
+ virtual void backtrace() {}
+ virtual int set_location(const char *, int) { return 0; }
+ virtual int next_file(FILE *, const char *) { return 0; }
+ virtual void shift(int) {}
+ virtual int is_boundary() {return 0; }
+ virtual int is_file() { return 0; }
+ virtual int is_macro() { return 0; }
+ virtual void save_compatible_flag(int) {}
+ virtual int get_compatible_flag() { return 0; }
+};
+
+input_iterator::input_iterator()
+: is_diversion(0), ptr(0), eptr(0)
+{
+}
+
+input_iterator::input_iterator(int is_div)
+: is_diversion(is_div), ptr(0), eptr(0)
+{
+}
+
+int input_iterator::fill(node **)
+{
+ return EOF;
+}
+
+int input_iterator::peek()
+{
+ return EOF;
+}
+
+inline int input_iterator::get(node **p)
+{
+ return ptr < eptr ? *ptr++ : fill(p);
+}
+
+class input_boundary : public input_iterator {
+public:
+ int is_boundary() { return 1; }
+};
+
+class input_return_boundary : public input_iterator {
+public:
+ int is_boundary() { return 2; }
+};
+
+class file_iterator : public input_iterator {
+ FILE *fp;
+ int lineno;
+ const char *filename;
+ int popened;
+ int newline_flag;
+ int seen_escape;
+ enum { BUF_SIZE = 512 };
+ unsigned char buf[BUF_SIZE];
+ void close();
+public:
+ file_iterator(FILE *, const char *, int = 0);
+ ~file_iterator();
+ int fill(node **);
+ int peek();
+ int get_location(int, const char **, int *);
+ void backtrace();
+ int set_location(const char *, int);
+ int next_file(FILE *, const char *);
+ int is_file();
+};
+
+file_iterator::file_iterator(FILE *f, const char *fn, int po)
+: fp(f), lineno(1), filename(fn), popened(po),
+ newline_flag(0), seen_escape(0)
+{
+ if ((font::use_charnames_in_special) && (fn != 0)) {
+ if (!the_output)
+ init_output();
+ the_output->put_filename(fn, po);
+ }
+}
+
+file_iterator::~file_iterator()
+{
+ close();
+}
+
+void file_iterator::close()
+{
+ if (fp == stdin)
+ clearerr(stdin);
+#ifndef POPEN_MISSING
+ else if (popened)
+ pclose(fp);
+#endif /* not POPEN_MISSING */
+ else
+ fclose(fp);
+}
+
+int file_iterator::is_file()
+{
+ return 1;
+}
+
+int file_iterator::next_file(FILE *f, const char *s)
+{
+ close();
+ filename = s;
+ fp = f;
+ lineno = 1;
+ newline_flag = 0;
+ seen_escape = 0;
+ popened = 0;
+ ptr = 0;
+ eptr = 0;
+ return 1;
+}
+
+int file_iterator::fill(node **)
+{
+ if (newline_flag)
+ lineno++;
+ newline_flag = 0;
+ unsigned char *p = buf;
+ ptr = p;
+ unsigned char *e = p + BUF_SIZE;
+ while (p < e) {
+ int c = getc(fp);
+ if (c == EOF)
+ break;
+ if (is_invalid_input_char(c))
+ warning(WARN_INPUT, "invalid input character code %1", int(c));
+ else {
+ *p++ = c;
+ if (c == '\n') {
+ seen_escape = 0;
+ newline_flag = 1;
+ break;
+ }
+ seen_escape = (c == '\\');
+ }
+ }
+ if (p > buf) {
+ eptr = p;
+ return *ptr++;
+ }
+ else {
+ eptr = p;
+ return EOF;
+ }
+}
+
+int file_iterator::peek()
+{
+ int c = getc(fp);
+ while (is_invalid_input_char(c)) {
+ warning(WARN_INPUT, "invalid input character code %1", int(c));
+ c = getc(fp);
+ }
+ if (c != EOF)
+ ungetc(c, fp);
+ return c;
+}
+
+int file_iterator::get_location(int /*allow_macro*/,
+ const char **filenamep, int *linenop)
+{
+ *linenop = lineno;
+ if (filename != 0 && strcmp(filename, "-") == 0)
+ *filenamep = "<standard input>";
+ else
+ *filenamep = filename;
+ return 1;
+}
+
+void file_iterator::backtrace()
+{
+ const char *f;
+ int n;
+ // Get side effect of filename rewrite if stdin.
+ (void) get_location(0, &f, &n);
+ if (program_name)
+ fprintf(stderr, "%s: ", program_name);
+ errprint("backtrace: %3 '%1':%2\n", f, n, popened ? "pipe" : "file");
+}
+
+int file_iterator::set_location(const char *f, int ln)
+{
+ if (f) {
+ filename = f;
+ if (!the_output)
+ init_output();
+ the_output->put_filename(f, 0);
+ }
+ lineno = ln;
+ return 1;
+}
+
+input_iterator nil_iterator;
+
+class input_stack {
+public:
+ static int get(node **);
+ static int peek();
+ static void push(input_iterator *);
+ static input_iterator *get_arg(int);
+ static arg_list *get_arg_list();
+ static symbol get_macro_name();
+ static int space_follows_arg(int);
+ static int get_break_flag();
+ static int nargs();
+ static int get_location(int, const char **, int *);
+ static int set_location(const char *, int);
+ static void backtrace();
+ static void next_file(FILE *, const char *);
+ static void end_file();
+ static void shift(int n);
+ static void add_boundary();
+ static void add_return_boundary();
+ static int is_return_boundary();
+ static void remove_boundary();
+ static int get_level();
+ static int get_div_level();
+ static void increase_level();
+ static void decrease_level();
+ static void clear();
+ static void pop_macro();
+ static void save_compatible_flag(int);
+ static int get_compatible_flag();
+ static statem *get_diversion_state();
+ static void check_end_diversion(input_iterator *t);
+ static int limit;
+ static int div_level;
+ static statem *diversion_state;
+private:
+ static input_iterator *top;
+ static int level;
+ static int finish_get(node **);
+ static int finish_peek();
+};
+
+input_iterator *input_stack::top = &nil_iterator;
+int input_stack::level = 0;
+int input_stack::limit = DEFAULT_INPUT_STACK_LIMIT;
+int input_stack::div_level = 0;
+statem *input_stack::diversion_state = 0;
+int suppress_push=0;
+
+
+inline int input_stack::get_level()
+{
+ return level;
+}
+
+inline void input_stack::increase_level()
+{
+ level++;
+}
+
+inline void input_stack::decrease_level()
+{
+ level--;
+}
+
+inline int input_stack::get_div_level()
+{
+ return div_level;
+}
+
+inline int input_stack::get(node **np)
+{
+ int res = (top->ptr < top->eptr) ? *top->ptr++ : finish_get(np);
+ if (res == '\n') {
+ old_have_input = have_input;
+ have_input = 0;
+ }
+ return res;
+}
+
+int input_stack::finish_get(node **np)
+{
+ for (;;) {
+ int c = top->fill(np);
+ if (c != EOF || top->is_boundary())
+ return c;
+ if (top == &nil_iterator)
+ break;
+ input_iterator *tem = top;
+ check_end_diversion(tem);
+#if defined(DEBUGGING)
+ if (debug_state)
+ if (tem->is_diversion)
+ fprintf(stderr,
+ "in diversion level = %d\n", input_stack::get_div_level());
+#endif
+ top = top->next;
+ level--;
+ delete tem;
+ if (top->ptr < top->eptr)
+ return *top->ptr++;
+ }
+ assert(level == 0);
+ return EOF;
+}
+
+inline int input_stack::peek()
+{
+ return (top->ptr < top->eptr) ? *top->ptr : finish_peek();
+}
+
+void input_stack::check_end_diversion(input_iterator *t)
+{
+ if (t->is_diversion) {
+ div_level--;
+ if (diversion_state)
+ delete diversion_state;
+ diversion_state = t->diversion_state;
+ }
+}
+
+int input_stack::finish_peek()
+{
+ for (;;) {
+ int c = top->peek();
+ if (c != EOF || top->is_boundary())
+ return c;
+ if (top == &nil_iterator)
+ break;
+ input_iterator *tem = top;
+ check_end_diversion(tem);
+ top = top->next;
+ level--;
+ delete tem;
+ if (top->ptr < top->eptr)
+ return *top->ptr;
+ }
+ assert(level == 0);
+ return EOF;
+}
+
+void input_stack::add_boundary()
+{
+ push(new input_boundary);
+}
+
+void input_stack::add_return_boundary()
+{
+ push(new input_return_boundary);
+}
+
+int input_stack::is_return_boundary()
+{
+ return top->is_boundary() == 2;
+}
+
+void input_stack::remove_boundary()
+{
+ assert(top->is_boundary());
+ input_iterator *temp = top->next;
+ check_end_diversion(top);
+
+ delete top;
+ top = temp;
+ level--;
+}
+
+void input_stack::push(input_iterator *in)
+{
+ if (in == 0)
+ return;
+ if (++level > limit && limit > 0)
+ fatal("input stack limit exceeded (probable infinite loop)");
+ in->next = top;
+ top = in;
+ if (top->is_diversion) {
+ div_level++;
+ in->diversion_state = diversion_state;
+ diversion_state = curenv->construct_state(0);
+#if defined(DEBUGGING)
+ if (debug_state) {
+ curenv->dump_troff_state();
+ fflush(stderr);
+ }
+#endif
+ }
+#if defined(DEBUGGING)
+ if (debug_state)
+ if (top->is_diversion) {
+ fprintf(stderr,
+ "in diversion level = %d\n", input_stack::get_div_level());
+ fflush(stderr);
+ }
+#endif
+}
+
+statem *get_diversion_state()
+{
+ return input_stack::get_diversion_state();
+}
+
+statem *input_stack::get_diversion_state()
+{
+ if (0 == diversion_state)
+ return 0;
+ else
+ return new statem(diversion_state);
+}
+
+input_iterator *input_stack::get_arg(int i)
+{
+ input_iterator *p;
+ for (p = top; p != 0; p = p->next)
+ if (p->has_args())
+ return p->get_arg(i);
+ return 0;
+}
+
+arg_list *input_stack::get_arg_list()
+{
+ input_iterator *p;
+ for (p = top; p != 0; p = p->next)
+ if (p->has_args())
+ return p->get_arg_list();
+ return 0;
+}
+
+symbol input_stack::get_macro_name()
+{
+ input_iterator *p;
+ for (p = top; p != 0; p = p->next)
+ if (p->has_args())
+ return p->get_macro_name();
+ return NULL_SYMBOL;
+}
+
+int input_stack::space_follows_arg(int i)
+{
+ input_iterator *p;
+ for (p = top; p != 0; p = p->next)
+ if (p->has_args())
+ return p->space_follows_arg(i);
+ return 0;
+}
+
+int input_stack::get_break_flag()
+{
+ return top->get_break_flag();
+}
+
+void input_stack::shift(int n)
+{
+ for (input_iterator *p = top; p; p = p->next)
+ if (p->has_args()) {
+ p->shift(n);
+ return;
+ }
+}
+
+int input_stack::nargs()
+{
+ for (input_iterator *p =top; p != 0; p = p->next)
+ if (p->has_args())
+ return p->nargs();
+ return 0;
+}
+
+int input_stack::get_location(int allow_macro, const char **filenamep, int *linenop)
+{
+ for (input_iterator *p = top; p; p = p->next)
+ if (p->get_location(allow_macro, filenamep, linenop))
+ return 1;
+ return 0;
+}
+
+void input_stack::backtrace()
+{
+ for (input_iterator *p = top; p; p = p->next)
+ p->backtrace();
+}
+
+int input_stack::set_location(const char *filename, int lineno)
+{
+ for (input_iterator *p = top; p; p = p->next)
+ if (p->set_location(filename, lineno))
+ return 1;
+ return 0;
+}
+
+void input_stack::next_file(FILE *fp, const char *s)
+{
+ input_iterator **pp;
+ for (pp = &top; *pp != &nil_iterator; pp = &(*pp)->next)
+ if ((*pp)->next_file(fp, s))
+ return;
+ if (++level > limit && limit > 0)
+ fatal("input stack limit exceeded");
+ *pp = new file_iterator(fp, s);
+ (*pp)->next = &nil_iterator;
+}
+
+void input_stack::end_file()
+{
+ for (input_iterator **pp = &top; *pp != &nil_iterator; pp = &(*pp)->next)
+ if ((*pp)->is_file()) {
+ input_iterator *tem = *pp;
+ check_end_diversion(tem);
+ *pp = (*pp)->next;
+ delete tem;
+ level--;
+ return;
+ }
+}
+
+void input_stack::clear()
+{
+ int nboundaries = 0;
+ while (top != &nil_iterator) {
+ if (top->is_boundary())
+ nboundaries++;
+ input_iterator *tem = top;
+ check_end_diversion(tem);
+ top = top->next;
+ level--;
+ delete tem;
+ }
+ // Keep while_request happy.
+ for (; nboundaries > 0; --nboundaries)
+ add_return_boundary();
+}
+
+void input_stack::pop_macro()
+{
+ int nboundaries = 0;
+ int is_macro = 0;
+ do {
+ if (top->next == &nil_iterator)
+ break;
+ if (top->is_boundary())
+ nboundaries++;
+ is_macro = top->is_macro();
+ input_iterator *tem = top;
+ check_end_diversion(tem);
+ top = top->next;
+ level--;
+ delete tem;
+ } while (!is_macro);
+ // Keep while_request happy.
+ for (; nboundaries > 0; --nboundaries)
+ add_return_boundary();
+}
+
+inline void input_stack::save_compatible_flag(int f)
+{
+ top->save_compatible_flag(f);
+}
+
+inline int input_stack::get_compatible_flag()
+{
+ return top->get_compatible_flag();
+}
+
+void backtrace_request()
+{
+ input_stack::backtrace();
+ fflush(stderr);
+ skip_line();
+}
+
+void next_file()
+{
+ symbol nm = get_long_name();
+ while (!tok.is_newline() && !tok.is_eof())
+ tok.next();
+ if (nm.is_null())
+ input_stack::end_file();
+ else {
+ errno = 0;
+ FILE *fp = include_search_path.open_file_cautious(nm.contents());
+ if (!fp)
+ error("can't open '%1': %2", nm.contents(), strerror(errno));
+ else
+ input_stack::next_file(fp, nm.contents());
+ }
+ tok.next();
+}
+
+void shift()
+{
+ int n;
+ if (!has_arg() || !get_integer(&n))
+ n = 1;
+ input_stack::shift(n);
+ skip_line();
+}
+
+static char get_char_for_escape_parameter(bool allow_space = false)
+{
+ int c = get_copy(0 /* nullptr */, false /* is defining */,
+ true /* handle \E */);
+ switch (c) {
+ case EOF:
+ copy_mode_error("end of input in escape sequence");
+ return '\0';
+ default:
+ if (!is_invalid_input_char(c))
+ break;
+ // fall through
+ case '\n':
+ if (c == '\n')
+ input_stack::push(make_temp_iterator("\n"));
+ // fall through
+ case ' ':
+ if (c == ' ' && allow_space)
+ break;
+ // fall through
+ case '\t':
+ case '\001':
+ case '\b':
+ copy_mode_error("%1 is not allowed in an escape sequence parameter",
+ input_char_description(c));
+ return '\0';
+ }
+ return c;
+}
+
+static symbol read_two_char_escape_parameter()
+{
+ char buf[3];
+ buf[0] = get_char_for_escape_parameter();
+ if (buf[0] != '\0') {
+ buf[1] = get_char_for_escape_parameter();
+ if (buf[1] == '\0')
+ buf[0] = 0;
+ else
+ buf[2] = 0;
+ }
+ return symbol(buf);
+}
+
+static symbol read_long_escape_parameters(read_mode mode)
+{
+ int start_level = input_stack::get_level();
+ char abuf[ABUF_SIZE];
+ char *buf = abuf;
+ int buf_size = ABUF_SIZE;
+ int i = 0;
+ char c;
+ int have_char = 0;
+ for (;;) {
+ c = get_char_for_escape_parameter(have_char && mode == WITH_ARGS);
+ if (c == 0) {
+ if (buf != abuf)
+ delete[] buf;
+ return NULL_SYMBOL;
+ }
+ have_char = 1;
+ if (mode == WITH_ARGS && c == ' ')
+ break;
+ if (i + 2 > buf_size) {
+ if (buf == abuf) {
+ buf = new char[ABUF_SIZE*2];
+ memcpy(buf, abuf, buf_size);
+ buf_size = ABUF_SIZE*2;
+ }
+ else {
+ char *old_buf = buf;
+ buf = new char[buf_size*2];
+ memcpy(buf, old_buf, buf_size);
+ buf_size *= 2;
+ delete[] old_buf;
+ }
+ }
+ if (c == ']' && input_stack::get_level() == start_level)
+ break;
+ buf[i++] = c;
+ }
+ buf[i] = 0;
+ if (c == ' ')
+ have_multiple_params = true;
+ if (buf == abuf) {
+ if (i == 0) {
+ if (mode != ALLOW_EMPTY)
+ copy_mode_error("empty escape name");
+ return EMPTY_SYMBOL;
+ }
+ return symbol(abuf);
+ }
+ else {
+ symbol s(buf);
+ delete[] buf;
+ return s;
+ }
+}
+
+static symbol read_escape_parameter(read_mode mode)
+{
+ char c = get_char_for_escape_parameter();
+ if (c == 0)
+ return NULL_SYMBOL;
+ if (c == '(')
+ return read_two_char_escape_parameter();
+ if (c == '[' && !compatible_flag)
+ return read_long_escape_parameters(mode);
+ char buf[2];
+ buf[0] = c;
+ buf[1] = '\0';
+ return symbol(buf);
+}
+
+static symbol read_increment_and_escape_parameter(int *incp)
+{
+ char c = get_char_for_escape_parameter();
+ switch (c) {
+ case 0:
+ *incp = 0;
+ return NULL_SYMBOL;
+ case '(':
+ *incp = 0;
+ return read_two_char_escape_parameter();
+ case '+':
+ *incp = 1;
+ return read_escape_parameter();
+ case '-':
+ *incp = -1;
+ return read_escape_parameter();
+ case '[':
+ if (!compatible_flag) {
+ *incp = 0;
+ return read_long_escape_parameters();
+ }
+ break;
+ }
+ *incp = 0;
+ char buf[2];
+ buf[0] = c;
+ buf[1] = '\0';
+ return symbol(buf);
+}
+
+static int get_copy(node **nd, bool is_defining, bool handle_escape_E)
+{
+ for (;;) {
+ int c = input_stack::get(nd);
+ if (c == PUSH_GROFF_MODE) {
+ input_stack::save_compatible_flag(compatible_flag);
+ compatible_flag = 0;
+ continue;
+ }
+ if (c == PUSH_COMP_MODE) {
+ input_stack::save_compatible_flag(compatible_flag);
+ compatible_flag = 1;
+ continue;
+ }
+ if (c == POP_GROFFCOMP_MODE) {
+ compatible_flag = input_stack::get_compatible_flag();
+ continue;
+ }
+ if (c == BEGIN_QUOTE) {
+ input_stack::increase_level();
+ continue;
+ }
+ if (c == END_QUOTE) {
+ input_stack::decrease_level();
+ continue;
+ }
+ if (c == DOUBLE_QUOTE)
+ continue;
+ if (c == ESCAPE_E && handle_escape_E)
+ c = escape_char;
+ if (c == ESCAPE_NEWLINE) {
+ if (is_defining)
+ return c;
+ do {
+ c = input_stack::get(nd);
+ } while (c == ESCAPE_NEWLINE);
+ }
+ if (c != escape_char || escape_char <= 0)
+ return c;
+ again:
+ c = input_stack::peek();
+ switch(c) {
+ case 0:
+ return escape_char;
+ case '"':
+ (void)input_stack::get(0);
+ while ((c = input_stack::get(0)) != '\n' && c != EOF)
+ ;
+ return c;
+ case '#': // Like \" but newline is ignored.
+ (void)input_stack::get(0);
+ while ((c = input_stack::get(0)) != '\n')
+ if (c == EOF)
+ return EOF;
+ break;
+ case '$':
+ {
+ (void)input_stack::get(0);
+ symbol s = read_escape_parameter();
+ if (!(s.is_null() || s.is_empty()))
+ interpolate_arg(s);
+ break;
+ }
+ case '*':
+ {
+ (void)input_stack::get(0);
+ symbol s = read_escape_parameter(WITH_ARGS);
+ if (!(s.is_null() || s.is_empty())) {
+ if (have_multiple_params) {
+ have_multiple_params = false;
+ interpolate_string_with_args(s);
+ }
+ else
+ interpolate_string(s);
+ }
+ break;
+ }
+ case 'a':
+ (void)input_stack::get(0);
+ return '\001';
+ case 'e':
+ (void)input_stack::get(0);
+ return ESCAPE_e;
+ case 'E':
+ (void)input_stack::get(0);
+ if (handle_escape_E)
+ goto again;
+ return ESCAPE_E;
+ case 'n':
+ {
+ (void)input_stack::get(0);
+ int inc;
+ symbol s = read_increment_and_escape_parameter(&inc);
+ if (!(s.is_null() || s.is_empty()))
+ interpolate_number_reg(s, inc);
+ break;
+ }
+ case 'g':
+ {
+ (void)input_stack::get(0);
+ symbol s = read_escape_parameter();
+ if (!(s.is_null() || s.is_empty()))
+ interpolate_number_format(s);
+ break;
+ }
+ case 't':
+ (void)input_stack::get(0);
+ return '\t';
+ case 'V':
+ {
+ (void)input_stack::get(0);
+ symbol s = read_escape_parameter();
+ if (!(s.is_null() || s.is_empty()))
+ interpolate_environment_variable(s);
+ break;
+ }
+ case '\n':
+ (void)input_stack::get(0);
+ if (is_defining)
+ return ESCAPE_NEWLINE;
+ break;
+ case ' ':
+ (void)input_stack::get(0);
+ return ESCAPE_SPACE;
+ case '~':
+ (void)input_stack::get(0);
+ return ESCAPE_TILDE;
+ case ':':
+ (void)input_stack::get(0);
+ return ESCAPE_COLON;
+ case '|':
+ (void)input_stack::get(0);
+ return ESCAPE_BAR;
+ case '^':
+ (void)input_stack::get(0);
+ return ESCAPE_CIRCUMFLEX;
+ case '{':
+ (void)input_stack::get(0);
+ return ESCAPE_LEFT_BRACE;
+ case '}':
+ (void)input_stack::get(0);
+ return ESCAPE_RIGHT_BRACE;
+ case '`':
+ (void)input_stack::get(0);
+ return ESCAPE_LEFT_QUOTE;
+ case '\'':
+ (void)input_stack::get(0);
+ return ESCAPE_RIGHT_QUOTE;
+ case '-':
+ (void)input_stack::get(0);
+ return ESCAPE_HYPHEN;
+ case '_':
+ (void)input_stack::get(0);
+ return ESCAPE_UNDERSCORE;
+ case 'c':
+ (void)input_stack::get(0);
+ return ESCAPE_c;
+ case '!':
+ (void)input_stack::get(0);
+ return ESCAPE_BANG;
+ case '?':
+ (void)input_stack::get(0);
+ return ESCAPE_QUESTION;
+ case '&':
+ (void)input_stack::get(0);
+ return ESCAPE_AMPERSAND;
+ case ')':
+ (void)input_stack::get(0);
+ return ESCAPE_RIGHT_PARENTHESIS;
+ case '.':
+ (void)input_stack::get(0);
+ return c;
+ case '%':
+ (void)input_stack::get(0);
+ return ESCAPE_PERCENT;
+ default:
+ if (c == escape_char) {
+ (void)input_stack::get(0);
+ return c;
+ }
+ else
+ return escape_char;
+ }
+ }
+}
+
+class non_interpreted_char_node : public node {
+ unsigned char c;
+public:
+ non_interpreted_char_node(unsigned char);
+ node *copy();
+ int interpret(macro *);
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+};
+
+int non_interpreted_char_node::same(node *nd)
+{
+ return c == ((non_interpreted_char_node *)nd)->c;
+}
+
+const char *non_interpreted_char_node::type()
+{
+ return "non_interpreted_char_node";
+}
+
+int non_interpreted_char_node::force_tprint()
+{
+ return 0;
+}
+
+int non_interpreted_char_node::is_tag()
+{
+ return 0;
+}
+
+non_interpreted_char_node::non_interpreted_char_node(unsigned char n) : c(n)
+{
+ assert(n != 0);
+}
+
+node *non_interpreted_char_node::copy()
+{
+ return new non_interpreted_char_node(c);
+}
+
+int non_interpreted_char_node::interpret(macro *mac)
+{
+ mac->append(c);
+ return 1;
+}
+
+static void do_width();
+static node *do_non_interpreted();
+static node *do_special();
+static node *do_suppress(symbol nm);
+static void do_register();
+
+dictionary color_dictionary(501);
+
+static color *lookup_color(symbol nm)
+{
+ assert(!nm.is_null());
+ if (nm == default_symbol)
+ return &default_color;
+ color *c = (color *)color_dictionary.lookup(nm);
+ if (c == 0)
+ warning(WARN_COLOR, "color '%1' not defined", nm.contents());
+ return c;
+}
+
+void do_glyph_color(symbol nm)
+{
+ if (nm.is_null())
+ return;
+ if (nm.is_empty())
+ curenv->set_glyph_color(curenv->get_prev_glyph_color());
+ else {
+ color *tem = lookup_color(nm);
+ if (tem)
+ curenv->set_glyph_color(tem);
+ else
+ (void)color_dictionary.lookup(nm, new color(nm));
+ }
+}
+
+void do_fill_color(symbol nm)
+{
+ if (nm.is_null())
+ return;
+ if (nm.is_empty())
+ curenv->set_fill_color(curenv->get_prev_fill_color());
+ else {
+ color *tem = lookup_color(nm);
+ if (tem)
+ curenv->set_fill_color(tem);
+ else
+ (void)color_dictionary.lookup(nm, new color(nm));
+ }
+}
+
+static unsigned int get_color_element(const char *scheme, const char *col)
+{
+ units val;
+ if (!get_number(&val, 'f')) {
+ warning(WARN_COLOR, "%1 in %2 definition set to 0", col, scheme);
+ tok.next();
+ return 0;
+ }
+ if (val < 0) {
+ warning(WARN_RANGE, "%1 cannot be negative: set to 0", col);
+ return 0;
+ }
+ if (val > color::MAX_COLOR_VAL+1) {
+ warning(WARN_RANGE, "%1 cannot be greater than 1", col);
+ // we change 0x10000 to 0xffff
+ return color::MAX_COLOR_VAL;
+ }
+ return (unsigned int)val;
+}
+
+static color *read_rgb(char end = 0)
+{
+ symbol component = do_get_long_name(0, end);
+ if (component.is_null()) {
+ warning(WARN_COLOR, "missing rgb color values");
+ return 0;
+ }
+ const char *s = component.contents();
+ color *col = new color;
+ if (*s == '#') {
+ if (!col->read_rgb(s)) {
+ warning(WARN_COLOR, "expecting rgb color definition,"
+ " not '%1'", s);
+ delete col;
+ return 0;
+ }
+ }
+ else {
+ if (!end)
+ input_stack::push(make_temp_iterator(" "));
+ input_stack::push(make_temp_iterator(s));
+ tok.next();
+ unsigned int r = get_color_element("rgb color", "red component");
+ unsigned int g = get_color_element("rgb color", "green component");
+ unsigned int b = get_color_element("rgb color", "blue component");
+ col->set_rgb(r, g, b);
+ }
+ return col;
+}
+
+static color *read_cmy(char end = 0)
+{
+ symbol component = do_get_long_name(0, end);
+ if (component.is_null()) {
+ warning(WARN_COLOR, "missing cmy color values");
+ return 0;
+ }
+ const char *s = component.contents();
+ color *col = new color;
+ if (*s == '#') {
+ if (!col->read_cmy(s)) {
+ warning(WARN_COLOR, "expecting cmy color definition,"
+ " not '%1'", s);
+ delete col;
+ return 0;
+ }
+ }
+ else {
+ if (!end)
+ input_stack::push(make_temp_iterator(" "));
+ input_stack::push(make_temp_iterator(s));
+ tok.next();
+ unsigned int c = get_color_element("cmy color", "cyan component");
+ unsigned int m = get_color_element("cmy color", "magenta component");
+ unsigned int y = get_color_element("cmy color", "yellow component");
+ col->set_cmy(c, m, y);
+ }
+ return col;
+}
+
+static color *read_cmyk(char end = 0)
+{
+ symbol component = do_get_long_name(0, end);
+ if (component.is_null()) {
+ warning(WARN_COLOR, "missing cmyk color values");
+ return 0;
+ }
+ const char *s = component.contents();
+ color *col = new color;
+ if (*s == '#') {
+ if (!col->read_cmyk(s)) {
+ warning(WARN_COLOR, "expecting cmyk color definition,"
+ " not '%1'", s);
+ delete col;
+ return 0;
+ }
+ }
+ else {
+ if (!end)
+ input_stack::push(make_temp_iterator(" "));
+ input_stack::push(make_temp_iterator(s));
+ tok.next();
+ unsigned int c = get_color_element("cmyk color", "cyan component");
+ unsigned int m = get_color_element("cmyk color", "magenta component");
+ unsigned int y = get_color_element("cmyk color", "yellow component");
+ unsigned int k = get_color_element("cmyk color", "black component");
+ col->set_cmyk(c, m, y, k);
+ }
+ return col;
+}
+
+static color *read_gray(char end = 0)
+{
+ symbol component = do_get_long_name(0, end);
+ if (component.is_null()) {
+ warning(WARN_COLOR, "missing gray value");
+ return 0;
+ }
+ const char *s = component.contents();
+ color *col = new color;
+ if (*s == '#') {
+ if (!col->read_gray(s)) {
+ warning(WARN_COLOR, "expecting gray definition,"
+ " not '%1'", s);
+ delete col;
+ return 0;
+ }
+ }
+ else {
+ if (!end)
+ input_stack::push(make_temp_iterator("\n"));
+ input_stack::push(make_temp_iterator(s));
+ tok.next();
+ unsigned int g = get_color_element("gray", "gray value");
+ col->set_gray(g);
+ }
+ return col;
+}
+
+static void activate_color()
+{
+ int n;
+ if (has_arg() && get_integer(&n))
+ color_flag = n != 0;
+ else
+ color_flag = 1;
+ skip_line();
+}
+
+static void define_color()
+{
+ symbol color_name = get_long_name(true /* required */);
+ if (color_name.is_null()) {
+ skip_line();
+ return;
+ }
+ if (color_name == default_symbol) {
+ warning(WARN_COLOR, "default color can't be redefined");
+ skip_line();
+ return;
+ }
+ symbol style = get_long_name(true /* required */);
+ if (style.is_null()) {
+ skip_line();
+ return;
+ }
+ color *col;
+ if (strcmp(style.contents(), "rgb") == 0)
+ col = read_rgb();
+ else if (strcmp(style.contents(), "cmyk") == 0)
+ col = read_cmyk();
+ else if (strcmp(style.contents(), "gray") == 0)
+ col = read_gray();
+ else if (strcmp(style.contents(), "grey") == 0)
+ col = read_gray();
+ else if (strcmp(style.contents(), "cmy") == 0)
+ col = read_cmy();
+ else {
+ warning(WARN_COLOR, "unknown color space '%1';"
+ " use 'rgb', 'cmyk', 'gray' or 'cmy'", style.contents());
+ skip_line();
+ return;
+ }
+ if (col) {
+ col->nm = color_name;
+ (void)color_dictionary.lookup(color_name, col);
+ }
+ skip_line();
+}
+
+node *do_overstrike()
+{
+ overstrike_node *on = new overstrike_node;
+ int start_level = input_stack::get_level();
+ token start;
+ start.next();
+ for (;;) {
+ tok.next();
+ if (tok.is_newline()) {
+ input_stack::push(make_temp_iterator("\n"));
+ break;
+ }
+ if (tok.is_eof()) {
+ warning(WARN_DELIM, "missing closing delimiter in overstrike"
+ " escape sequence (got %1)", tok.description());
+ // Synthesize an input line ending.
+ input_stack::push(make_temp_iterator("\n"));
+ break;
+ }
+ if (tok == start
+ && (compatible_flag || input_stack::get_level() == start_level))
+ break;
+ if (tok.is_horizontal_space())
+ on->overstrike(tok.nd->copy());
+ else if (tok.is_unstretchable_space())
+ {
+ node *n = new hmotion_node(curenv->get_space_width(),
+ curenv->get_fill_color());
+ on->overstrike(n);
+ }
+ else {
+ charinfo *ci = tok.get_char(true /* required */);
+ if (ci) {
+ node *n = curenv->make_char_node(ci);
+ if (n)
+ on->overstrike(n);
+ }
+ }
+ }
+ return on;
+}
+
+static node *do_bracket()
+{
+ bracket_node *bn = new bracket_node;
+ int start_level = input_stack::get_level();
+ token start;
+ start.next();
+ for (;;) {
+ tok.next();
+ if (tok.is_newline()) {
+ input_stack::push(make_temp_iterator("\n"));
+ break;
+ }
+ if (tok.is_eof()) {
+ warning(WARN_DELIM, "missing closing delimiter in"
+ " bracket-building escape sequence (got %1)",
+ tok.description());
+ // Synthesize an input line ending.
+ input_stack::push(make_temp_iterator("\n"));
+ break;
+ }
+ if (tok == start
+ && (compatible_flag || input_stack::get_level() == start_level))
+ break;
+ charinfo *ci = tok.get_char(true /* required */);
+ if (ci) {
+ node *n = curenv->make_char_node(ci);
+ if (n)
+ bn->bracket(n);
+ }
+ }
+ return bn;
+}
+
+static int do_name_test()
+{
+ int start_level = input_stack::get_level();
+ token start;
+ start.next();
+ bool got_bad_char = false;
+ bool got_some_char = false;
+ for (;;) {
+ tok.next();
+ if (tok.is_newline() || tok.is_eof()) {
+ if (tok != start)
+ warning(WARN_DELIM, "missing closing delimiter in identifier"
+ " validation escape sequence (got %1)",
+ tok.description());
+ // Synthesize an input line ending.
+ input_stack::push(make_temp_iterator("\n"));
+ break;
+ }
+ if (tok == start
+ && (compatible_flag || input_stack::get_level() == start_level))
+ break;
+ if (!tok.ch())
+ got_bad_char = true;
+ got_some_char = true;
+ }
+ return (got_some_char && !got_bad_char);
+}
+
+static int do_expr_test()
+{
+ token start;
+ start.next();
+ int start_level = input_stack::get_level();
+ if (!start.usable_as_delimiter(true /* report error */))
+ return 0;
+ tok.next();
+ // disable all warning and error messages temporarily
+ int saved_warning_mask = warning_mask;
+ int saved_inhibit_errors = inhibit_errors;
+ warning_mask = 0;
+ inhibit_errors = 1;
+ int dummy;
+ int result = get_number_rigidly(&dummy, 'u');
+ warning_mask = saved_warning_mask;
+ inhibit_errors = saved_inhibit_errors;
+ if (tok == start && input_stack::get_level() == start_level)
+ return result;
+ // ignore everything up to the delimiter in case we aren't right there
+ for (;;) {
+ tok.next();
+ if (tok.is_newline() || tok.is_eof()) {
+ warning(WARN_DELIM, "missing closing delimiter in"
+ " expression test escape sequence (got %1)",
+ tok.description());
+ input_stack::push(make_temp_iterator("\n"));
+ break;
+ }
+ if (tok == start && input_stack::get_level() == start_level)
+ break;
+ }
+ return 0;
+}
+
+#if 0
+static node *do_zero_width()
+{
+ token start;
+ start.next();
+ int start_level = input_stack::get_level();
+ environment env(curenv);
+ environment *oldenv = curenv;
+ curenv = &env;
+ for (;;) {
+ tok.next();
+ if (tok.is_newline() || tok.is_eof()) {
+ error("missing closing delimiter");
+ break;
+ }
+ if (tok == start
+ && (compatible_flag || input_stack::get_level() == start_level))
+ break;
+ tok.process();
+ }
+ curenv = oldenv;
+ node *rev = env.extract_output_line();
+ node *n = 0;
+ while (rev) {
+ node *tem = rev;
+ rev = rev->next;
+ tem->next = n;
+ n = tem;
+ }
+ return new zero_width_node(n);
+}
+
+#else
+
+// It's undesirable for \Z to change environments, because then
+// \n(.w won't work as expected.
+
+static node *do_zero_width()
+{
+ node *rev = new dummy_node;
+ int start_level = input_stack::get_level();
+ token start;
+ start.next();
+ for (;;) {
+ tok.next();
+ if (tok.is_newline() || tok.is_eof()) {
+ if (tok != start)
+ warning(WARN_DELIM, "missing closing delimiter in"
+ " zero-width escape sequence (got %1)",
+ tok.description());
+ // Synthesize an input line ending.
+ input_stack::push(make_temp_iterator("\n"));
+ break;
+ }
+ if (tok == start
+ && (compatible_flag || input_stack::get_level() == start_level))
+ break;
+ if (!tok.add_to_zero_width_node_list(&rev))
+ error("invalid token in argument to escaped 'Z'");
+ }
+ node *n = 0;
+ while (rev) {
+ node *tem = rev;
+ rev = rev->next;
+ tem->next = n;
+ n = tem;
+ }
+ return new zero_width_node(n);
+}
+
+#endif
+
+token_node *node::get_token_node()
+{
+ return 0;
+}
+
+class token_node : public node {
+public:
+ token tk;
+ token_node(const token &t);
+ node *copy();
+ token_node *get_token_node();
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+};
+
+token_node::token_node(const token &t) : tk(t)
+{
+}
+
+node *token_node::copy()
+{
+ return new token_node(tk);
+}
+
+token_node *token_node::get_token_node()
+{
+ return this;
+}
+
+int token_node::same(node *nd)
+{
+ return tk == ((token_node *)nd)->tk;
+}
+
+const char *token_node::type()
+{
+ return "token_node";
+}
+
+int token_node::force_tprint()
+{
+ return 0;
+}
+
+int token_node::is_tag()
+{
+ return 0;
+}
+
+token::token() : nd(0), type(TOKEN_EMPTY)
+{
+}
+
+token::~token()
+{
+ delete nd;
+}
+
+token::token(const token &t)
+: nm(t.nm), c(t.c), val(t.val), dim(t.dim), type(t.type)
+{
+ // Use two statements to work around bug in SGI C++.
+ node *tem = t.nd;
+ nd = tem ? tem->copy() : 0;
+}
+
+void token::operator=(const token &t)
+{
+ delete nd;
+ nm = t.nm;
+ // Use two statements to work around bug in SGI C++.
+ node *tem = t.nd;
+ nd = tem ? tem->copy() : 0;
+ c = t.c;
+ val = t.val;
+ dim = t.dim;
+ type = t.type;
+}
+
+void token::skip()
+{
+ while (is_space())
+ next();
+}
+
+bool has_arg()
+{
+ while (tok.is_space())
+ tok.next();
+ return !tok.is_newline();
+}
+
+void token::make_space()
+{
+ type = TOKEN_SPACE;
+}
+
+void token::make_newline()
+{
+ type = TOKEN_NEWLINE;
+}
+
+void token::next()
+{
+ if (nd) {
+ delete nd;
+ nd = 0;
+ }
+ units x;
+ for (;;) {
+ node *n = 0;
+ int cc = input_stack::get(&n);
+ if (cc != escape_char || escape_char == 0) {
+ handle_ordinary_char:
+ switch(cc) {
+ case INPUT_NO_BREAK_SPACE:
+ type = TOKEN_STRETCHABLE_SPACE;
+ return;
+ case INPUT_SOFT_HYPHEN:
+ type = TOKEN_HYPHEN_INDICATOR;
+ return;
+ case PUSH_GROFF_MODE:
+ input_stack::save_compatible_flag(compatible_flag);
+ compatible_flag = 0;
+ continue;
+ case PUSH_COMP_MODE:
+ input_stack::save_compatible_flag(compatible_flag);
+ compatible_flag = 1;
+ continue;
+ case POP_GROFFCOMP_MODE:
+ compatible_flag = input_stack::get_compatible_flag();
+ continue;
+ case BEGIN_QUOTE:
+ input_stack::increase_level();
+ continue;
+ case END_QUOTE:
+ input_stack::decrease_level();
+ continue;
+ case DOUBLE_QUOTE:
+ continue;
+ case EOF:
+ type = TOKEN_EOF;
+ return;
+ case TRANSPARENT_FILE_REQUEST:
+ case TITLE_REQUEST:
+ case COPY_FILE_REQUEST:
+#ifdef COLUMN
+ case VJUSTIFY_REQUEST:
+#endif /* COLUMN */
+ type = TOKEN_REQUEST;
+ c = cc;
+ return;
+ case BEGIN_TRAP:
+ type = TOKEN_BEGIN_TRAP;
+ return;
+ case END_TRAP:
+ type = TOKEN_END_TRAP;
+ return;
+ case LAST_PAGE_EJECTOR:
+ seen_last_page_ejector = 1;
+ // fall through
+ case PAGE_EJECTOR:
+ type = TOKEN_PAGE_EJECTOR;
+ return;
+ case ESCAPE_PERCENT:
+ ESCAPE_PERCENT:
+ type = TOKEN_HYPHEN_INDICATOR;
+ return;
+ case ESCAPE_SPACE:
+ ESCAPE_SPACE:
+ type = TOKEN_UNSTRETCHABLE_SPACE;
+ return;
+ case ESCAPE_TILDE:
+ ESCAPE_TILDE:
+ type = TOKEN_STRETCHABLE_SPACE;
+ return;
+ case ESCAPE_COLON:
+ ESCAPE_COLON:
+ type = TOKEN_ZERO_WIDTH_BREAK;
+ return;
+ case ESCAPE_e:
+ ESCAPE_e:
+ type = TOKEN_ESCAPE;
+ return;
+ case ESCAPE_E:
+ goto handle_escape_char;
+ case ESCAPE_BAR:
+ ESCAPE_BAR:
+ type = TOKEN_HORIZONTAL_SPACE;
+ nd = new hmotion_node(curenv->get_narrow_space_width(),
+ curenv->get_fill_color());
+ return;
+ case ESCAPE_CIRCUMFLEX:
+ ESCAPE_CIRCUMFLEX:
+ type = TOKEN_HORIZONTAL_SPACE;
+ nd = new hmotion_node(curenv->get_half_narrow_space_width(),
+ curenv->get_fill_color());
+ return;
+ case ESCAPE_NEWLINE:
+ have_input = 0;
+ break;
+ case ESCAPE_LEFT_BRACE:
+ ESCAPE_LEFT_BRACE:
+ type = TOKEN_LEFT_BRACE;
+ return;
+ case ESCAPE_RIGHT_BRACE:
+ ESCAPE_RIGHT_BRACE:
+ type = TOKEN_RIGHT_BRACE;
+ return;
+ case ESCAPE_LEFT_QUOTE:
+ ESCAPE_LEFT_QUOTE:
+ type = TOKEN_SPECIAL;
+ nm = symbol("ga");
+ return;
+ case ESCAPE_RIGHT_QUOTE:
+ ESCAPE_RIGHT_QUOTE:
+ type = TOKEN_SPECIAL;
+ nm = symbol("aa");
+ return;
+ case ESCAPE_HYPHEN:
+ ESCAPE_HYPHEN:
+ type = TOKEN_SPECIAL;
+ nm = symbol("-");
+ return;
+ case ESCAPE_UNDERSCORE:
+ ESCAPE_UNDERSCORE:
+ type = TOKEN_SPECIAL;
+ nm = symbol("ul");
+ return;
+ case ESCAPE_c:
+ ESCAPE_c:
+ type = TOKEN_INTERRUPT;
+ return;
+ case ESCAPE_BANG:
+ ESCAPE_BANG:
+ type = TOKEN_TRANSPARENT;
+ return;
+ case ESCAPE_QUESTION:
+ ESCAPE_QUESTION:
+ nd = do_non_interpreted();
+ if (nd) {
+ type = TOKEN_NODE;
+ return;
+ }
+ break;
+ case ESCAPE_AMPERSAND:
+ ESCAPE_AMPERSAND:
+ type = TOKEN_DUMMY;
+ return;
+ case ESCAPE_RIGHT_PARENTHESIS:
+ ESCAPE_RIGHT_PARENTHESIS:
+ type = TOKEN_TRANSPARENT_DUMMY;
+ return;
+ case '\b':
+ type = TOKEN_BACKSPACE;
+ return;
+ case ' ':
+ type = TOKEN_SPACE;
+ return;
+ case '\t':
+ type = TOKEN_TAB;
+ return;
+ case '\n':
+ type = TOKEN_NEWLINE;
+ return;
+ case '\001':
+ type = TOKEN_LEADER;
+ return;
+ case 0:
+ {
+ assert(n != 0);
+ token_node *tn = n->get_token_node();
+ if (tn) {
+ *this = tn->tk;
+ delete tn;
+ }
+ else {
+ nd = n;
+ type = TOKEN_NODE;
+ }
+ }
+ return;
+ default:
+ type = TOKEN_CHAR;
+ c = cc;
+ return;
+ }
+ }
+ else {
+ handle_escape_char:
+ cc = input_stack::get(&n);
+ switch(cc) {
+ case '(':
+ nm = read_two_char_escape_parameter();
+ type = TOKEN_SPECIAL;
+ return;
+ case EOF:
+ type = TOKEN_EOF;
+ error("end of input after escape character");
+ return;
+ case '`':
+ goto ESCAPE_LEFT_QUOTE;
+ case '\'':
+ goto ESCAPE_RIGHT_QUOTE;
+ case '-':
+ goto ESCAPE_HYPHEN;
+ case '_':
+ goto ESCAPE_UNDERSCORE;
+ case '%':
+ goto ESCAPE_PERCENT;
+ case ' ':
+ goto ESCAPE_SPACE;
+ case '0':
+ nd = new hmotion_node(curenv->get_digit_width(),
+ curenv->get_fill_color());
+ type = TOKEN_HORIZONTAL_SPACE;
+ return;
+ case '|':
+ goto ESCAPE_BAR;
+ case '^':
+ goto ESCAPE_CIRCUMFLEX;
+ case '/':
+ type = TOKEN_ITALIC_CORRECTION;
+ return;
+ case ',':
+ type = TOKEN_NODE;
+ nd = new left_italic_corrected_node;
+ return;
+ case '&':
+ goto ESCAPE_AMPERSAND;
+ case ')':
+ goto ESCAPE_RIGHT_PARENTHESIS;
+ case '!':
+ goto ESCAPE_BANG;
+ case '?':
+ goto ESCAPE_QUESTION;
+ case '~':
+ goto ESCAPE_TILDE;
+ case ':':
+ goto ESCAPE_COLON;
+ case '"':
+ while ((cc = input_stack::get(0)) != '\n' && cc != EOF)
+ ;
+ if (cc == '\n')
+ type = TOKEN_NEWLINE;
+ else
+ type = TOKEN_EOF;
+ return;
+ case '#': // Like \" but newline is ignored.
+ while ((cc = input_stack::get(0)) != '\n')
+ if (cc == EOF) {
+ type = TOKEN_EOF;
+ return;
+ }
+ break;
+ case '$':
+ {
+ symbol s = read_escape_parameter();
+ if (!(s.is_null() || s.is_empty()))
+ interpolate_arg(s);
+ break;
+ }
+ case '*':
+ {
+ symbol s = read_escape_parameter(WITH_ARGS);
+ if (!(s.is_null() || s.is_empty())) {
+ if (have_multiple_params) {
+ have_multiple_params = false;
+ interpolate_string_with_args(s);
+ }
+ else
+ interpolate_string(s);
+ }
+ break;
+ }
+ case 'a':
+ nd = new non_interpreted_char_node('\001');
+ type = TOKEN_NODE;
+ return;
+ case 'A':
+ c = '0' + do_name_test();
+ type = TOKEN_CHAR;
+ return;
+ case 'b':
+ nd = do_bracket();
+ type = TOKEN_NODE;
+ return;
+ case 'B':
+ c = '0' + do_expr_test();
+ type = TOKEN_CHAR;
+ return;
+ case 'c':
+ goto ESCAPE_c;
+ case 'C':
+ nm = get_delim_name();
+ if (nm.is_null())
+ break;
+ type = TOKEN_SPECIAL;
+ return;
+ case 'd':
+ type = TOKEN_NODE;
+ nd = new vmotion_node(curenv->get_size() / 2,
+ curenv->get_fill_color());
+ return;
+ case 'D':
+ nd = read_draw_node();
+ if (!nd)
+ break;
+ type = TOKEN_NODE;
+ return;
+ case 'e':
+ goto ESCAPE_e;
+ case 'E':
+ goto handle_escape_char;
+ case 'f':
+ {
+ symbol s = read_escape_parameter(ALLOW_EMPTY);
+ if (s.is_null())
+ break;
+ const char *p;
+ for (p = s.contents(); *p != '\0'; p++)
+ if (!csdigit(*p))
+ break;
+ // environment::set_font warns if a bogus mounting position is
+ // requested. We must warn here if a bogus font name is
+ // selected.
+ if (*p != '\0' || s.is_empty()) {
+ if (!curenv->set_font(s))
+ warning(WARN_FONT, "cannot select font '%1'",
+ s.contents());
+ }
+ else
+ (void) curenv->set_font(atoi(s.contents()));
+ if (!compatible_flag)
+ have_input = 1;
+ break;
+ }
+ case 'F':
+ {
+ symbol s = read_escape_parameter(ALLOW_EMPTY);
+ if (s.is_null())
+ break;
+ curenv->set_family(s);
+ have_input = 1;
+ break;
+ }
+ case 'g':
+ {
+ symbol s = read_escape_parameter();
+ if (!(s.is_null() || s.is_empty()))
+ interpolate_number_format(s);
+ break;
+ }
+ case 'h':
+ if (!get_delim_number(&x, 'm'))
+ break;
+ type = TOKEN_HORIZONTAL_SPACE;
+ nd = new hmotion_node(x, curenv->get_fill_color());
+ return;
+ case 'H':
+ // don't take height increments relative to previous height if
+ // in compatibility mode
+ if (!compatible_flag && curenv->get_char_height()) {
+ if (get_delim_number(&x, 'z', curenv->get_char_height()))
+ curenv->set_char_height(x);
+ }
+ else {
+ if (get_delim_number(&x, 'z', curenv->get_requested_point_size()))
+ curenv->set_char_height(x);
+ }
+ if (!compatible_flag)
+ have_input = 1;
+ break;
+ case 'k':
+ nm = read_escape_parameter();
+ if (nm.is_null() || nm.is_empty())
+ break;
+ type = TOKEN_MARK_INPUT;
+ return;
+ case 'l':
+ case 'L':
+ {
+ charinfo *s = 0;
+ if (!get_line_arg(&x, (cc == 'l' ? 'm': 'v'), &s))
+ break;
+ if (s == 0)
+ s = get_charinfo(cc == 'l' ? "ru" : "br");
+ type = TOKEN_NODE;
+ node *char_node = curenv->make_char_node(s);
+ if (cc == 'l')
+ nd = new hline_node(x, char_node);
+ else
+ nd = new vline_node(x, char_node);
+ return;
+ }
+ case 'm':
+ do_glyph_color(read_escape_parameter(ALLOW_EMPTY));
+ if (!compatible_flag)
+ have_input = 1;
+ break;
+ case 'M':
+ do_fill_color(read_escape_parameter(ALLOW_EMPTY));
+ if (!compatible_flag)
+ have_input = 1;
+ break;
+ case 'n':
+ {
+ int inc;
+ symbol s = read_increment_and_escape_parameter(&inc);
+ if (!(s.is_null() || s.is_empty()))
+ interpolate_number_reg(s, inc);
+ break;
+ }
+ case 'N':
+ if (!get_delim_number(&val, 0))
+ break;
+ if (val < 0) {
+ warning(WARN_CHAR, "invalid numbered character %1", val);
+ break;
+ }
+ type = TOKEN_NUMBERED_CHAR;
+ return;
+ case 'o':
+ nd = do_overstrike();
+ type = TOKEN_NODE;
+ return;
+ case 'O':
+ nd = do_suppress(read_escape_parameter());
+ if (!nd)
+ break;
+ type = TOKEN_NODE;
+ return;
+ case 'p':
+ type = TOKEN_SPREAD;
+ return;
+ case 'r':
+ type = TOKEN_NODE;
+ nd = new vmotion_node(-curenv->get_size(), curenv->get_fill_color());
+ return;
+ case 'R':
+ do_register();
+ if (!compatible_flag)
+ have_input = 1;
+ break;
+ case 's':
+ if (read_size(&x))
+ curenv->set_size(x);
+ if (!compatible_flag)
+ have_input = 1;
+ break;
+ case 'S':
+ if (get_delim_number(&x, 0))
+ curenv->set_char_slant(x);
+ if (!compatible_flag)
+ have_input = 1;
+ break;
+ case 't':
+ type = TOKEN_NODE;
+ nd = new non_interpreted_char_node('\t');
+ return;
+ case 'u':
+ type = TOKEN_NODE;
+ nd = new vmotion_node(-curenv->get_size() / 2,
+ curenv->get_fill_color());
+ return;
+ case 'v':
+ if (!get_delim_number(&x, 'v'))
+ break;
+ type = TOKEN_NODE;
+ nd = new vmotion_node(x, curenv->get_fill_color());
+ return;
+ case 'V':
+ {
+ symbol s = read_escape_parameter();
+ if (!(s.is_null() || s.is_empty()))
+ interpolate_environment_variable(s);
+ break;
+ }
+ case 'w':
+ do_width();
+ break;
+ case 'x':
+ if (!get_delim_number(&x, 'v'))
+ break;
+ type = TOKEN_NODE;
+ nd = new extra_size_node(x);
+ return;
+ case 'X':
+ nd = do_special();
+ if (!nd)
+ break;
+ type = TOKEN_NODE;
+ return;
+ case 'Y':
+ {
+ symbol s = read_escape_parameter();
+ if (s.is_null() || s.is_empty())
+ break;
+ request_or_macro *p = lookup_request(s);
+ macro *m = p->to_macro();
+ if (!m) {
+ error("can't transparently throughput a request");
+ break;
+ }
+ nd = new special_node(*m);
+ type = TOKEN_NODE;
+ return;
+ }
+ case 'z':
+ {
+ next();
+ if (type == TOKEN_NODE || type == TOKEN_HORIZONTAL_SPACE)
+ nd = new zero_width_node(nd);
+ else {
+ charinfo *ci = get_char(true /* required */);
+ if (ci == 0)
+ break;
+ node *gn = curenv->make_char_node(ci);
+ if (gn == 0)
+ break;
+ nd = new zero_width_node(gn);
+ type = TOKEN_NODE;
+ }
+ return;
+ }
+ case 'Z':
+ nd = do_zero_width();
+ if (nd == 0)
+ break;
+ type = TOKEN_NODE;
+ return;
+ case '{':
+ goto ESCAPE_LEFT_BRACE;
+ case '}':
+ goto ESCAPE_RIGHT_BRACE;
+ case '\n':
+ break;
+ case '[':
+ if (!compatible_flag) {
+ symbol s = read_long_escape_parameters(WITH_ARGS);
+ if (s.is_null() || s.is_empty())
+ break;
+ if (have_multiple_params) {
+ have_multiple_params = false;
+ nm = composite_glyph_name(s);
+ }
+ else {
+ const char *gn = check_unicode_name(s.contents());
+ if (gn) {
+ const char *gn_decomposed = decompose_unicode(gn);
+ if (gn_decomposed)
+ gn = &gn_decomposed[1];
+ const char *groff_gn = unicode_to_glyph_name(gn);
+ if (groff_gn)
+ nm = symbol(groff_gn);
+ else {
+ char *buf = new char[strlen(gn) + 1 + 1];
+ strcpy(buf, "u");
+ strcat(buf, gn);
+ nm = symbol(buf);
+ delete[] buf;
+ }
+ }
+ else
+ nm = symbol(s.contents());
+ }
+ type = TOKEN_SPECIAL;
+ return;
+ }
+ goto handle_ordinary_char;
+ default:
+ if (cc != escape_char && cc != '.')
+ warning(WARN_ESCAPE, "escape character ignored before %1",
+ input_char_description(cc));
+ goto handle_ordinary_char;
+ }
+ }
+ }
+}
+
+int token::operator==(const token &t)
+{
+ if (type != t.type)
+ return 0;
+ switch(type) {
+ case TOKEN_CHAR:
+ return c == t.c;
+ case TOKEN_SPECIAL:
+ return nm == t.nm;
+ case TOKEN_NUMBERED_CHAR:
+ return val == t.val;
+ default:
+ return 1;
+ }
+}
+
+int token::operator!=(const token &t)
+{
+ return !(*this == t);
+}
+
+// is token a suitable delimiter (like ')?
+
+bool token::usable_as_delimiter(bool report_error)
+{
+ switch(type) {
+ case TOKEN_CHAR:
+ switch(c) {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ case '+':
+ case '-':
+ case '/':
+ case '*':
+ case '%':
+ case '<':
+ case '>':
+ case '=':
+ case '&':
+ case ':':
+ case '(':
+ case ')':
+ case '.':
+ if (report_error)
+ error("character '%1' is not allowed as a starting delimiter",
+ char(c));
+ return false;
+ default:
+ return true;
+ }
+ case TOKEN_NODE:
+ // the user doesn't know what a node is
+ if (report_error)
+ error("missing argument or invalid starting delimiter");
+ return false;
+ case TOKEN_SPACE:
+ case TOKEN_STRETCHABLE_SPACE:
+ case TOKEN_UNSTRETCHABLE_SPACE:
+ case TOKEN_HORIZONTAL_SPACE:
+ case TOKEN_TAB:
+ case TOKEN_NEWLINE:
+ if (report_error)
+ error("%1 is not allowed as a starting delimiter", description());
+ return false;
+ default:
+ return true;
+ }
+}
+
+const char *token::description()
+{
+ static char buf[4];
+ switch (type) {
+ case TOKEN_BACKSPACE:
+ return "a backspace character";
+ case TOKEN_CHAR:
+ if (c == INPUT_DELETE)
+ return "a delete character";
+ else {
+ buf[0] = '\'';
+ buf[1] = c;
+ buf[2] = '\'';
+ buf[3] = '\0';
+ return buf;
+ }
+ case TOKEN_DUMMY:
+ return "an escaped '&'";
+ case TOKEN_ESCAPE:
+ return "an escaped 'e'";
+ case TOKEN_HYPHEN_INDICATOR:
+ return "an escaped '%'";
+ case TOKEN_INTERRUPT:
+ return "an escaped 'c'";
+ case TOKEN_ITALIC_CORRECTION:
+ return "an escaped '/'";
+ case TOKEN_LEADER:
+ return "a leader character";
+ case TOKEN_LEFT_BRACE:
+ return "an escaped '{'";
+ case TOKEN_MARK_INPUT:
+ return "an escaped 'k'";
+ case TOKEN_NEWLINE:
+ return "a newline";
+ case TOKEN_NODE:
+ return "a node";
+ case TOKEN_NUMBERED_CHAR:
+ return "an escaped 'N'";
+ case TOKEN_RIGHT_BRACE:
+ return "an escaped '}'";
+ case TOKEN_SPACE:
+ return "a space";
+ case TOKEN_SPECIAL:
+ return "a special character";
+ case TOKEN_SPREAD:
+ return "an escaped 'p'";
+ case TOKEN_STRETCHABLE_SPACE:
+ return "an escaped '~'";
+ case TOKEN_UNSTRETCHABLE_SPACE:
+ return "an escaped ' '";
+ case TOKEN_HORIZONTAL_SPACE:
+ return "a horizontal motion";
+ case TOKEN_TAB:
+ return "a tab character";
+ case TOKEN_TRANSPARENT:
+ return "an escaped '!'";
+ case TOKEN_TRANSPARENT_DUMMY:
+ return "an escaped ')'";
+ case TOKEN_ZERO_WIDTH_BREAK:
+ return "an escaped ':'";
+ case TOKEN_EOF:
+ return "end of input";
+ default:
+ break;
+ }
+ return "a magic token";
+}
+
+void skip_line()
+{
+ while (!tok.is_newline())
+ if (tok.is_eof())
+ return;
+ else
+ tok.next();
+ tok.next();
+}
+
+void compatible()
+{
+ int n;
+ if (has_arg() && get_integer(&n))
+ compatible_flag = n != 0;
+ else
+ compatible_flag = 1;
+ skip_line();
+}
+
+static void diagnose_missing_identifier(bool required)
+{
+ if (tok.is_newline() || tok.is_eof()) {
+ if (required)
+ warning(WARN_MISSING, "missing identifier");
+ }
+ else if (tok.is_right_brace() || tok.is_tab()) {
+ const char *start = tok.description();
+ do {
+ tok.next();
+ } while (tok.is_space() || tok.is_right_brace() || tok.is_tab());
+ if (!tok.is_newline() && !tok.is_eof())
+ error("%1 is not allowed before an argument", start);
+ else if (required)
+ warning(WARN_MISSING, "missing identifier");
+ }
+ else if (required)
+ error("expected identifier, got %1", tok.description());
+ else
+ error("expected identifier, got %1; treated as missing",
+ tok.description());
+}
+
+static void diagnose_invalid_identifier()
+{
+ if (!tok.is_newline() && !tok.is_eof() && !tok.is_space()
+ && !tok.is_tab() && !tok.is_right_brace()
+ // We don't want to give a warning for .el\{
+ && !tok.is_left_brace())
+ error("%1 is not allowed in an identifier", tok.description());
+}
+
+symbol get_name(bool required)
+{
+ if (compatible_flag) {
+ char buf[3];
+ tok.skip();
+ if ((buf[0] = tok.ch()) != 0) {
+ tok.next();
+ if ((buf[1] = tok.ch()) != 0) {
+ buf[2] = 0;
+ tok.make_space();
+ }
+ else
+ diagnose_invalid_identifier();
+ return symbol(buf);
+ }
+ else {
+ diagnose_missing_identifier(required);
+ return NULL_SYMBOL;
+ }
+ }
+ else
+ return get_long_name(required);
+}
+
+symbol get_long_name(bool required)
+{
+ return do_get_long_name(required, 0);
+}
+
+static symbol do_get_long_name(bool required, char end)
+{
+ while (tok.is_space())
+ tok.next();
+ char abuf[ABUF_SIZE];
+ char *buf = abuf;
+ int buf_size = ABUF_SIZE;
+ int i = 0;
+ for (;;) {
+ // If end != 0 we normally have to append a null byte
+ if (i + 2 > buf_size) {
+ if (buf == abuf) {
+ buf = new char[ABUF_SIZE*2];
+ memcpy(buf, abuf, buf_size);
+ buf_size = ABUF_SIZE*2;
+ }
+ else {
+ char *old_buf = buf;
+ buf = new char[buf_size*2];
+ memcpy(buf, old_buf, buf_size);
+ buf_size *= 2;
+ delete[] old_buf;
+ }
+ }
+ if ((buf[i] = tok.ch()) == 0 || buf[i] == end)
+ break;
+ i++;
+ tok.next();
+ }
+ if (i == 0) {
+ diagnose_missing_identifier(required);
+ return NULL_SYMBOL;
+ }
+ if (end && buf[i] == end)
+ buf[i+1] = '\0';
+ else
+ diagnose_invalid_identifier();
+ if (buf == abuf)
+ return symbol(buf);
+ else {
+ symbol s(buf);
+ delete[] buf;
+ return s;
+ }
+}
+
+void exit_troff()
+{
+ is_exit_underway = true;
+ topdiv->set_last_page();
+ if (!end_of_input_macro_name.is_null()) {
+ spring_trap(end_of_input_macro_name);
+ tok.next();
+ process_input_stack();
+ }
+ curenv->final_break();
+ tok.next();
+ process_input_stack();
+ end_diversions();
+ if (topdiv->get_page_length() > 0) {
+ is_eoi_macro_finished = true;
+ topdiv->set_ejecting();
+ static unsigned char buf[2] = { LAST_PAGE_EJECTOR, '\0' };
+ input_stack::push(make_temp_iterator((char *)buf));
+ topdiv->space(topdiv->get_page_length(), 1);
+ tok.next();
+ process_input_stack();
+ seen_last_page_ejector = 1; // should be set already
+ topdiv->set_ejecting();
+ push_page_ejector();
+ topdiv->space(topdiv->get_page_length(), 1);
+ tok.next();
+ process_input_stack();
+ }
+ cleanup_and_exit(EXIT_SUCCESS);
+}
+
+// This implements .ex. The input stack must be cleared before calling
+// exit_troff().
+
+void exit_request()
+{
+ input_stack::clear();
+ if (is_exit_underway)
+ tok.next();
+ else
+ exit_troff();
+}
+
+void return_macro_request()
+{
+ if (has_arg() && tok.ch())
+ input_stack::pop_macro();
+ input_stack::pop_macro();
+ tok.next();
+}
+
+void eoi_macro()
+{
+ end_of_input_macro_name = get_name();
+ skip_line();
+}
+
+void blank_line_macro()
+{
+ blank_line_macro_name = get_name();
+ skip_line();
+}
+
+void leading_spaces_macro()
+{
+ leading_spaces_macro_name = get_name();
+ skip_line();
+}
+
+static void trapping_blank_line()
+{
+ if (!blank_line_macro_name.is_null())
+ spring_trap(blank_line_macro_name);
+ else
+ blank_line();
+}
+
+void do_request()
+{
+ assert(do_old_compatible_flag == -1);
+ do_old_compatible_flag = compatible_flag;
+ compatible_flag = 0;
+ symbol nm = get_name();
+ if (nm.is_null())
+ skip_line();
+ else
+ interpolate_macro(nm, true /* don't want next token */);
+ compatible_flag = do_old_compatible_flag;
+ do_old_compatible_flag = -1;
+ request_or_macro *p = lookup_request(nm);
+ macro *m = p->to_macro();
+ if (m)
+ tok.next();
+}
+
+inline int possibly_handle_first_page_transition()
+{
+ if (topdiv->before_first_page && curdiv == topdiv && !curenv->is_dummy()) {
+ handle_first_page_transition();
+ return 1;
+ }
+ else
+ return 0;
+}
+
+static int transparent_translate(int cc)
+{
+ if (!is_invalid_input_char(cc)) {
+ charinfo *ci = charset_table[cc];
+ switch (ci->get_special_translation(1)) {
+ case charinfo::TRANSLATE_SPACE:
+ return ' ';
+ case charinfo::TRANSLATE_STRETCHABLE_SPACE:
+ return ESCAPE_TILDE;
+ case charinfo::TRANSLATE_DUMMY:
+ return ESCAPE_AMPERSAND;
+ case charinfo::TRANSLATE_HYPHEN_INDICATOR:
+ return ESCAPE_PERCENT;
+ }
+ // This is really ugly.
+ ci = ci->get_translation(1);
+ if (ci) {
+ int c = ci->get_ascii_code();
+ if (c != '\0')
+ return c;
+ if (getenv("GROFF_ENABLE_TRANSPARENCY_WARNINGS")
+ != 0 /* nullptr */)
+ error("can't translate %1 to special character '%2'"
+ " in transparent throughput",
+ input_char_description(cc),
+ ci->nm.contents());
+ }
+ }
+ return cc;
+}
+
+class int_stack {
+ struct int_stack_element {
+ int n;
+ int_stack_element *next;
+ } *top;
+public:
+ int_stack();
+ ~int_stack();
+ void push(int);
+ int is_empty();
+ int pop();
+};
+
+int_stack::int_stack()
+{
+ top = 0;
+}
+
+int_stack::~int_stack()
+{
+ while (top != 0) {
+ int_stack_element *temp = top;
+ top = top->next;
+ delete temp;
+ }
+}
+
+int int_stack::is_empty()
+{
+ return top == 0;
+}
+
+void int_stack::push(int n)
+{
+ int_stack_element *p = new int_stack_element;
+ p->next = top;
+ p->n = n;
+ top = p;
+}
+
+int int_stack::pop()
+{
+ assert(top != 0);
+ int_stack_element *p = top;
+ top = top->next;
+ int n = p->n;
+ delete p;
+ return n;
+}
+
+int node::reread(int *)
+{
+ return 0;
+}
+
+int global_diverted_space = 0;
+
+int diverted_space_node::reread(int *bolp)
+{
+ global_diverted_space = 1;
+ if (curenv->get_fill())
+ trapping_blank_line();
+ else
+ curdiv->space(n);
+ global_diverted_space = 0;
+ *bolp = 1;
+ return 1;
+}
+
+int diverted_copy_file_node::reread(int *bolp)
+{
+ curdiv->copy_file(filename.contents());
+ *bolp = 1;
+ return 1;
+}
+
+int word_space_node::reread(int *)
+{
+ if (unformat) {
+ for (width_list *w = orig_width; w; w = w->next)
+ curenv->space(w->width, w->sentence_width);
+ unformat = 0;
+ return 1;
+ }
+ return 0;
+}
+
+int unbreakable_space_node::reread(int *)
+{
+ return 0;
+}
+
+int hmotion_node::reread(int *)
+{
+ if (unformat && was_tab) {
+ curenv->handle_tab(0);
+ unformat = 0;
+ return 1;
+ }
+ return 0;
+}
+
+static int leading_spaces_number = 0;
+static int leading_spaces_space = 0;
+
+void process_input_stack()
+{
+ int_stack trap_bol_stack;
+ int bol = 1;
+ for (;;) {
+ int suppress_next = 0;
+ switch (tok.type) {
+ case token::TOKEN_CHAR:
+ {
+ unsigned char ch = tok.c;
+ if (bol && !have_input
+ && (ch == curenv->control_char
+ || ch == curenv->no_break_control_char)) {
+ break_flag = ch == curenv->control_char;
+ // skip tabs as well as spaces here
+ do {
+ tok.next();
+ } while (tok.is_white_space());
+ symbol nm = get_name();
+#if defined(DEBUGGING)
+ if (debug_state) {
+ if (! nm.is_null()) {
+ if (strcmp(nm.contents(), "test") == 0) {
+ fprintf(stderr, "found it!\n");
+ fflush(stderr);
+ }
+ fprintf(stderr, "interpreting [%s]", nm.contents());
+ if (strcmp(nm.contents(), "di") == 0 && topdiv != curdiv)
+ fprintf(stderr, " currently in diversion: %s",
+ curdiv->get_diversion_name());
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ }
+ }
+#endif
+ if (nm.is_null())
+ skip_line();
+ else {
+ interpolate_macro(nm);
+#if defined(DEBUGGING)
+ if (debug_state) {
+ fprintf(stderr, "finished interpreting [%s] and environment state is\n", nm.contents());
+ curenv->dump_troff_state();
+ }
+#endif
+ }
+ suppress_next = 1;
+ }
+ else {
+ if (possibly_handle_first_page_transition())
+ ;
+ else {
+ for (;;) {
+#if defined(DEBUGGING)
+ if (debug_state) {
+ fprintf(stderr, "found [%c]\n", ch); fflush(stderr);
+ }
+#endif
+ curenv->add_char(charset_table[ch]);
+ tok.next();
+ if (tok.type != token::TOKEN_CHAR)
+ break;
+ ch = tok.c;
+ }
+ suppress_next = 1;
+ bol = 0;
+ }
+ }
+ break;
+ }
+ case token::TOKEN_TRANSPARENT:
+ {
+ if (bol) {
+ if (possibly_handle_first_page_transition())
+ ;
+ else {
+ int cc;
+ do {
+ node *n;
+ cc = get_copy(&n);
+ if (cc != EOF) {
+ if (cc != '\0')
+ curdiv->transparent_output(transparent_translate(cc));
+ else
+ curdiv->transparent_output(n);
+ }
+ } while (cc != '\n' && cc != EOF);
+ if (cc == EOF)
+ curdiv->transparent_output('\n');
+ }
+ }
+ break;
+ }
+ case token::TOKEN_NEWLINE:
+ {
+ if (bol && !old_have_input
+ && !curenv->get_prev_line_interrupted())
+ trapping_blank_line();
+ else {
+ curenv->newline();
+ bol = 1;
+ }
+ break;
+ }
+ case token::TOKEN_REQUEST:
+ {
+ int request_code = tok.c;
+ tok.next();
+ switch (request_code) {
+ case TITLE_REQUEST:
+ title();
+ break;
+ case COPY_FILE_REQUEST:
+ copy_file();
+ break;
+ case TRANSPARENT_FILE_REQUEST:
+ transparent_file();
+ break;
+#ifdef COLUMN
+ case VJUSTIFY_REQUEST:
+ vjustify();
+ break;
+#endif /* COLUMN */
+ default:
+ assert(0);
+ break;
+ }
+ suppress_next = 1;
+ break;
+ }
+ case token::TOKEN_SPACE:
+ {
+ if (possibly_handle_first_page_transition())
+ ;
+ else if (bol && !curenv->get_prev_line_interrupted()) {
+ int nspaces = 0;
+ // save space_width now so that it isn't changed by \f or \s
+ // which we wouldn't notice here
+ hunits space_width = curenv->get_space_width();
+ do {
+ nspaces += tok.nspaces();
+ tok.next();
+ } while (tok.is_space());
+ if (tok.is_newline())
+ trapping_blank_line();
+ else {
+ push_token(tok);
+ leading_spaces_number = nspaces;
+ leading_spaces_space = space_width.to_units() * nspaces;
+ if (!leading_spaces_macro_name.is_null())
+ spring_trap(leading_spaces_macro_name);
+ else {
+ curenv->do_break();
+ curenv->add_node(new hmotion_node(space_width * nspaces,
+ curenv->get_fill_color()));
+ }
+ bol = 0;
+ }
+ }
+ else {
+ curenv->space();
+ bol = 0;
+ }
+ break;
+ }
+ case token::TOKEN_EOF:
+ return;
+ case token::TOKEN_NODE:
+ case token::TOKEN_HORIZONTAL_SPACE:
+ {
+ if (possibly_handle_first_page_transition())
+ ;
+ else if (tok.nd->reread(&bol)) {
+ delete tok.nd;
+ tok.nd = 0;
+ }
+ else {
+ curenv->add_node(tok.nd);
+ tok.nd = 0;
+ bol = 0;
+ curenv->possibly_break_line(1);
+ }
+ break;
+ }
+ case token::TOKEN_PAGE_EJECTOR:
+ {
+ continue_page_eject();
+ // I think we just want to preserve bol.
+ // bol = 1;
+ break;
+ }
+ case token::TOKEN_BEGIN_TRAP:
+ {
+ trap_bol_stack.push(bol);
+ bol = 1;
+ have_input = 0;
+ break;
+ }
+ case token::TOKEN_END_TRAP:
+ {
+ if (trap_bol_stack.is_empty())
+ error("spurious end trap token detected!");
+ else
+ bol = trap_bol_stack.pop();
+ have_input = 0;
+
+ /* I'm not totally happy about this. But I can't think of any other
+ way to do it. Doing an output_pending_lines() whenever a
+ TOKEN_END_TRAP is detected doesn't work: for example,
+
+ .wh -1i x
+ .de x
+ 'bp
+ ..
+ .wh -.5i y
+ .de y
+ .tl ''-%-''
+ ..
+ .br
+ .ll .5i
+ .sp |\n(.pu-1i-.5v
+ a\%very\%very\%long\%word
+
+ will print all but the first lines from the word immediately
+ after the footer, rather than on the next page. */
+
+ if (trap_bol_stack.is_empty())
+ curenv->output_pending_lines();
+ break;
+ }
+ default:
+ {
+ bol = 0;
+ tok.process();
+ break;
+ }
+ }
+ if (!suppress_next)
+ tok.next();
+ trap_sprung_flag = 0;
+ }
+}
+
+#ifdef WIDOW_CONTROL
+
+void flush_pending_lines()
+{
+ while (!tok.is_newline() && !tok.is_eof())
+ tok.next();
+ curenv->output_pending_lines();
+ tok.next();
+}
+
+#endif /* WIDOW_CONTROL */
+
+request_or_macro::request_or_macro()
+{
+}
+
+macro *request_or_macro::to_macro()
+{
+ return 0;
+}
+
+request::request(REQUEST_FUNCP pp) : p(pp)
+{
+}
+
+void request::invoke(symbol, bool)
+{
+ (*p)();
+}
+
+struct char_block {
+ enum { SIZE = 128 };
+ unsigned char s[SIZE];
+ char_block *next;
+ char_block();
+};
+
+char_block::char_block()
+: next(0)
+{
+}
+
+class char_list {
+public:
+ char_list();
+ ~char_list();
+ void append(unsigned char);
+ void set(unsigned char, int);
+ unsigned char get(int);
+ int length();
+private:
+ unsigned char *ptr;
+ int len;
+ char_block *head;
+ char_block *tail;
+ friend class macro_header;
+ friend class string_iterator;
+};
+
+char_list::char_list()
+: ptr(0), len(0), head(0), tail(0)
+{
+}
+
+char_list::~char_list()
+{
+ while (head != 0) {
+ char_block *tem = head;
+ head = head->next;
+ delete tem;
+ }
+}
+
+int char_list::length()
+{
+ return len;
+}
+
+void char_list::append(unsigned char c)
+{
+ if (tail == 0) {
+ head = tail = new char_block;
+ ptr = tail->s;
+ }
+ else {
+ if (ptr >= tail->s + char_block::SIZE) {
+ tail->next = new char_block;
+ tail = tail->next;
+ ptr = tail->s;
+ }
+ }
+ *ptr++ = c;
+ len++;
+}
+
+void char_list::set(unsigned char c, int offset)
+{
+ assert(len > offset);
+ // optimization for access at the end
+ int boundary = len - len % char_block::SIZE;
+ if (offset >= boundary) {
+ *(tail->s + offset - boundary) = c;
+ return;
+ }
+ char_block *tem = head;
+ int l = 0;
+ for (;;) {
+ l += char_block::SIZE;
+ if (l > offset) {
+ *(tem->s + offset % char_block::SIZE) = c;
+ return;
+ }
+ tem = tem->next;
+ }
+}
+
+unsigned char char_list::get(int offset)
+{
+ assert(len > offset);
+ // optimization for access at the end
+ int boundary = len - len % char_block::SIZE;
+ if (offset >= boundary)
+ return *(tail->s + offset - boundary);
+ char_block *tem = head;
+ int l = 0;
+ for (;;) {
+ l += char_block::SIZE;
+ if (l > offset)
+ return *(tem->s + offset % char_block::SIZE);
+ tem = tem->next;
+ }
+}
+
+class node_list {
+ node *head;
+ node *tail;
+public:
+ node_list();
+ ~node_list();
+ void append(node *);
+ int length();
+ node *extract();
+
+ friend class macro_header;
+ friend class string_iterator;
+};
+
+void node_list::append(node *n)
+{
+ if (head == 0) {
+ n->next = 0;
+ head = tail = n;
+ }
+ else {
+ n->next = 0;
+ tail = tail->next = n;
+ }
+}
+
+int node_list::length()
+{
+ int total = 0;
+ for (node *n = head; n != 0; n = n->next)
+ ++total;
+ return total;
+}
+
+node_list::node_list()
+{
+ head = tail = 0;
+}
+
+node *node_list::extract()
+{
+ node *temp = head;
+ head = tail = 0;
+ return temp;
+}
+
+node_list::~node_list()
+{
+ delete_node_list(head);
+}
+
+class macro_header {
+public:
+ int count;
+ char_list cl;
+ node_list nl;
+ macro_header() { count = 1; }
+ macro_header *copy(int);
+};
+
+macro::~macro()
+{
+ if (p != 0 && --(p->count) <= 0)
+ delete p;
+}
+
+macro::macro()
+: is_a_diversion(0), is_a_string(1)
+{
+ if (!input_stack::get_location(1, &filename, &lineno)) {
+ filename = 0;
+ lineno = 0;
+ }
+ len = 0;
+ empty_macro = 1;
+ p = 0;
+}
+
+macro::macro(const macro &m)
+: filename(m.filename), lineno(m.lineno), len(m.len),
+ empty_macro(m.empty_macro), is_a_diversion(m.is_a_diversion),
+ is_a_string(m.is_a_string), p(m.p)
+{
+ if (p != 0)
+ p->count++;
+}
+
+macro::macro(int is_div)
+: is_a_diversion(is_div)
+{
+ if (!input_stack::get_location(1, &filename, &lineno)) {
+ filename = 0;
+ lineno = 0;
+ }
+ len = 0;
+ empty_macro = 1;
+ is_a_string = 1;
+ p = 0;
+}
+
+int macro::is_diversion()
+{
+ return is_a_diversion;
+}
+
+int macro::is_string()
+{
+ return is_a_string;
+}
+
+void macro::clear_string_flag()
+{
+ is_a_string = 0;
+}
+
+macro &macro::operator=(const macro &m)
+{
+ // don't assign object
+ if (m.p != 0)
+ m.p->count++;
+ if (p != 0 && --(p->count) <= 0)
+ delete p;
+ p = m.p;
+ filename = m.filename;
+ lineno = m.lineno;
+ len = m.len;
+ empty_macro = m.empty_macro;
+ is_a_diversion = m.is_a_diversion;
+ is_a_string = m.is_a_string;
+ return *this;
+}
+
+void macro::append(unsigned char c)
+{
+ assert(c != 0);
+ if (p == 0)
+ p = new macro_header;
+ if (p->cl.length() != len) {
+ macro_header *tem = p->copy(len);
+ if (--(p->count) <= 0)
+ delete p;
+ p = tem;
+ }
+ p->cl.append(c);
+ ++len;
+ if (c != PUSH_GROFF_MODE && c != PUSH_COMP_MODE && c != POP_GROFFCOMP_MODE)
+ empty_macro = 0;
+}
+
+void macro::set(unsigned char c, int offset)
+{
+ assert(p != 0);
+ assert(c != 0);
+ p->cl.set(c, offset);
+}
+
+unsigned char macro::get(int offset)
+{
+ assert(p != 0);
+ return p->cl.get(offset);
+}
+
+int macro::length()
+{
+ return len;
+}
+
+void macro::append_str(const char *s)
+{
+ int i = 0;
+
+ if (s) {
+ while (s[i] != (char)0) {
+ append(s[i]);
+ i++;
+ }
+ }
+}
+
+void macro::append(node *n)
+{
+ assert(n != 0);
+ if (p == 0)
+ p = new macro_header;
+ if (p->cl.length() != len) {
+ macro_header *tem = p->copy(len);
+ if (--(p->count) <= 0)
+ delete p;
+ p = tem;
+ }
+ p->cl.append(0);
+ p->nl.append(n);
+ ++len;
+ empty_macro = 0;
+}
+
+void macro::append_unsigned(unsigned int i)
+{
+ unsigned int j = i / 10;
+ if (j != 0)
+ append_unsigned(j);
+ append(((unsigned char)(((int)'0') + i % 10)));
+}
+
+void macro::append_int(int i)
+{
+ if (i < 0) {
+ append('-');
+ i = -i;
+ }
+ append_unsigned((unsigned int)i);
+}
+
+void macro::print_size()
+{
+ errprint("%1", len);
+}
+
+// make a copy of the first n bytes
+
+macro_header *macro_header::copy(int n)
+{
+ macro_header *p = new macro_header;
+ char_block *bp = cl.head;
+ unsigned char *ptr = bp->s;
+ node *nd = nl.head;
+ while (--n >= 0) {
+ if (ptr >= bp->s + char_block::SIZE) {
+ bp = bp->next;
+ ptr = bp->s;
+ }
+ unsigned char c = *ptr++;
+ p->cl.append(c);
+ if (c == 0) {
+ p->nl.append(nd->copy());
+ nd = nd->next;
+ }
+ }
+ return p;
+}
+
+void print_macros()
+{
+ object_dictionary_iterator iter(request_dictionary);
+ request_or_macro *rm;
+ symbol s;
+ while (iter.get(&s, (object **)&rm)) {
+ assert(!s.is_null());
+ macro *m = rm->to_macro();
+ if (m) {
+ errprint("%1\t", s.contents());
+ m->print_size();
+ errprint("\n");
+ }
+ }
+ fflush(stderr);
+ skip_line();
+}
+
+class string_iterator : public input_iterator {
+ macro mac;
+ const char *how_invoked;
+ int newline_flag;
+ int lineno;
+ char_block *bp;
+ int count; // of characters remaining
+ node *nd;
+ int saved_compatible_flag;
+ int with_break; // inherited from the caller
+protected:
+ symbol nm;
+ string_iterator();
+public:
+ string_iterator(const macro &, const char * = 0, symbol = NULL_SYMBOL);
+ int fill(node **);
+ int peek();
+ int get_location(int, const char **, int *);
+ void backtrace();
+ int get_break_flag() { return with_break; }
+ void save_compatible_flag(int f) { saved_compatible_flag = f; }
+ int get_compatible_flag() { return saved_compatible_flag; }
+ int is_diversion();
+};
+
+string_iterator::string_iterator(const macro &m, const char *p, symbol s)
+: input_iterator(m.is_a_diversion), mac(m), how_invoked(p), newline_flag(0),
+ lineno(1), nm(s)
+{
+ count = mac.len;
+ if (count != 0) {
+ bp = mac.p->cl.head;
+ nd = mac.p->nl.head;
+ ptr = eptr = bp->s;
+ }
+ else {
+ bp = 0;
+ nd = 0;
+ ptr = eptr = 0;
+ }
+ with_break = input_stack::get_break_flag();
+}
+
+string_iterator::string_iterator()
+{
+ bp = 0;
+ nd = 0;
+ ptr = eptr = 0;
+ newline_flag = 0;
+ how_invoked = 0;
+ lineno = 1;
+ count = 0;
+ with_break = input_stack::get_break_flag();
+}
+
+int string_iterator::is_diversion()
+{
+ return mac.is_diversion();
+}
+
+int string_iterator::fill(node **np)
+{
+ if (newline_flag)
+ lineno++;
+ newline_flag = 0;
+ if (count <= 0)
+ return EOF;
+ const unsigned char *p = eptr;
+ if (p >= bp->s + char_block::SIZE) {
+ bp = bp->next;
+ p = bp->s;
+ }
+ if (*p == '\0') {
+ if (np) {
+ *np = nd->copy();
+ if (is_diversion())
+ (*np)->div_nest_level = input_stack::get_div_level();
+ else
+ (*np)->div_nest_level = 0;
+ }
+ nd = nd->next;
+ eptr = ptr = p + 1;
+ count--;
+ return 0;
+ }
+ const unsigned char *e = bp->s + char_block::SIZE;
+ if (e - p > count)
+ e = p + count;
+ ptr = p;
+ while (p < e) {
+ unsigned char c = *p;
+ if (c == '\n' || c == ESCAPE_NEWLINE) {
+ newline_flag = 1;
+ p++;
+ break;
+ }
+ if (c == '\0')
+ break;
+ p++;
+ }
+ eptr = p;
+ count -= p - ptr;
+ return *ptr++;
+}
+
+int string_iterator::peek()
+{
+ if (count <= 0)
+ return EOF;
+ const unsigned char *p = eptr;
+ if (p >= bp->s + char_block::SIZE) {
+ p = bp->next->s;
+ }
+ return *p;
+}
+
+int string_iterator::get_location(int allow_macro,
+ const char **filep, int *linep)
+{
+ if (!allow_macro)
+ return 0;
+ if (mac.filename == 0)
+ return 0;
+ *filep = mac.filename;
+ *linep = mac.lineno + lineno - 1;
+ return 1;
+}
+
+void string_iterator::backtrace()
+{
+ if (mac.filename) {
+ if (program_name)
+ fprintf(stderr, "%s: ", program_name);
+ errprint("backtrace: '%1':%2", mac.filename,
+ mac.lineno + lineno - 1);
+ if (how_invoked) {
+ if (!nm.is_null())
+ errprint(": %1 '%2'\n", how_invoked, nm.contents());
+ else
+ errprint(": %1\n", how_invoked);
+ }
+ else
+ errprint("\n");
+ }
+}
+
+class temp_iterator : public input_iterator {
+ unsigned char *base;
+ temp_iterator(const char *, int len);
+public:
+ ~temp_iterator();
+ friend input_iterator *make_temp_iterator(const char *);
+};
+
+#ifdef __GNUG__
+inline
+#endif
+temp_iterator::temp_iterator(const char *s, int len)
+{
+ base = new unsigned char[len];
+ if (len > 0)
+ memcpy(base, s, len);
+ ptr = base;
+ eptr = base + len;
+}
+
+temp_iterator::~temp_iterator()
+{
+ delete[] base;
+}
+
+
+input_iterator *make_temp_iterator(const char *s)
+{
+ if (s == 0)
+ return new temp_iterator(s, 0);
+ else {
+ int n = strlen(s);
+ return new temp_iterator(s, n);
+ }
+}
+
+// this is used when macros with arguments are interpolated
+
+struct arg_list {
+ macro mac;
+ int space_follows;
+ arg_list *next;
+ arg_list(const macro &, int);
+ arg_list(const arg_list *);
+ ~arg_list();
+};
+
+arg_list::arg_list(const macro &m, int s) : mac(m), space_follows(s), next(0)
+{
+}
+
+arg_list::arg_list(const arg_list *al)
+: next(0)
+{
+ mac = al->mac;
+ space_follows = al->space_follows;
+ arg_list **a = &next;
+ arg_list *p = al->next;
+ while (p) {
+ *a = new arg_list(p->mac, p->space_follows);
+ p = p->next;
+ a = &(*a)->next;
+ }
+}
+
+arg_list::~arg_list()
+{
+}
+
+class macro_iterator : public string_iterator {
+ arg_list *args;
+ int argc;
+ int with_break; // whether called as .foo or 'foo
+public:
+ macro_iterator(symbol, macro &, const char * = "macro", int = 0);
+ macro_iterator();
+ ~macro_iterator();
+ int has_args() { return 1; }
+ input_iterator *get_arg(int);
+ arg_list *get_arg_list();
+ symbol get_macro_name();
+ int space_follows_arg(int);
+ int get_break_flag() { return with_break; }
+ int nargs() { return argc; }
+ void add_arg(const macro &, int);
+ void shift(int);
+ int is_macro() { return 1; }
+ int is_diversion();
+};
+
+input_iterator *macro_iterator::get_arg(int i)
+{
+ if (i == 0)
+ return make_temp_iterator(nm.contents());
+ if (i > 0 && i <= argc) {
+ arg_list *p = args;
+ for (int j = 1; j < i; j++) {
+ assert(p != 0);
+ p = p->next;
+ }
+ return new string_iterator(p->mac);
+ }
+ else
+ return 0;
+}
+
+arg_list *macro_iterator::get_arg_list()
+{
+ return args;
+}
+
+symbol macro_iterator::get_macro_name()
+{
+ return nm;
+}
+
+int macro_iterator::space_follows_arg(int i)
+{
+ if (i > 0 && i <= argc) {
+ arg_list *p = args;
+ for (int j = 1; j < i; j++) {
+ assert(p != 0);
+ p = p->next;
+ }
+ return p->space_follows;
+ }
+ else
+ return 0;
+}
+
+void macro_iterator::add_arg(const macro &m, int s)
+{
+ arg_list **p;
+ for (p = &args; *p; p = &((*p)->next))
+ ;
+ *p = new arg_list(m, s);
+ ++argc;
+}
+
+void macro_iterator::shift(int n)
+{
+ while (n > 0 && argc > 0) {
+ arg_list *tem = args;
+ args = args->next;
+ delete tem;
+ --argc;
+ --n;
+ }
+}
+
+// This gets used by, e.g., .if '\?xxx\?''.
+
+int operator==(const macro &m1, const macro &m2)
+{
+ if (m1.len != m2.len)
+ return 0;
+ string_iterator iter1(m1);
+ string_iterator iter2(m2);
+ int n = m1.len;
+ while (--n >= 0) {
+ node *nd1 = 0;
+ int c1 = iter1.get(&nd1);
+ assert(c1 != EOF);
+ node *nd2 = 0;
+ int c2 = iter2.get(&nd2);
+ assert(c2 != EOF);
+ if (c1 != c2) {
+ if (c1 == 0)
+ delete nd1;
+ else if (c2 == 0)
+ delete nd2;
+ return 0;
+ }
+ if (c1 == 0) {
+ assert(nd1 != 0);
+ assert(nd2 != 0);
+ int are_same = nd1->type() == nd2->type() && nd1->same(nd2);
+ delete nd1;
+ delete nd2;
+ if (!are_same)
+ return 0;
+ }
+ }
+ return 1;
+}
+
+static void interpolate_macro(symbol nm, bool do_not_want_next_token)
+{
+ request_or_macro *p = (request_or_macro *)request_dictionary.lookup(nm);
+ if (p == 0) {
+ int warned = 0;
+ const char *s = nm.contents();
+ if (strlen(s) > 2) {
+ request_or_macro *r;
+ char buf[3];
+ buf[0] = s[0];
+ buf[1] = s[1];
+ buf[2] = '\0';
+ r = (request_or_macro *)request_dictionary.lookup(symbol(buf));
+ if (r) {
+ macro *m = r->to_macro();
+ if (!m || !m->empty())
+ warned = warning(WARN_SPACE,
+ "macro '%1' not defined "
+ "(possibly missing space after '%2')",
+ nm.contents(), buf);
+ }
+ }
+ if (!warned) {
+ warning(WARN_MAC, "macro '%1' not defined", nm.contents());
+ p = new macro;
+ request_dictionary.define(nm, p);
+ }
+ }
+ if (p)
+ p->invoke(nm, do_not_want_next_token);
+ else {
+ skip_line();
+ return;
+ }
+}
+
+static void decode_args(macro_iterator *mi)
+{
+ if (!tok.is_newline() && !tok.is_eof()) {
+ node *n;
+ int c = get_copy(&n);
+ for (;;) {
+ while (c == ' ')
+ c = get_copy(&n);
+ if (c == '\n' || c == EOF)
+ break;
+ macro arg;
+ int quote_input_level = 0;
+ int done_tab_warning = 0;
+ arg.append(compatible_flag ? PUSH_COMP_MODE : PUSH_GROFF_MODE);
+ // we store discarded double quotes for \$^
+ if (c == '"') {
+ arg.append(DOUBLE_QUOTE);
+ quote_input_level = input_stack::get_level();
+ c = get_copy(&n);
+ }
+ while (c != EOF && c != '\n' && !(c == ' ' && quote_input_level == 0)) {
+ if (quote_input_level > 0 && c == '"'
+ && (compatible_flag
+ || input_stack::get_level() == quote_input_level)) {
+ arg.append(DOUBLE_QUOTE);
+ c = get_copy(&n);
+ if (c == '"') {
+ arg.append(c);
+ c = get_copy(&n);
+ }
+ else
+ break;
+ }
+ else {
+ if (c == 0)
+ arg.append(n);
+ else {
+ if (c == '\t' && quote_input_level == 0 && !done_tab_warning) {
+ warning(WARN_TAB, "tab character in unquoted macro argument");
+ done_tab_warning = 1;
+ }
+ arg.append(c);
+ }
+ c = get_copy(&n);
+ }
+ }
+ arg.append(POP_GROFFCOMP_MODE);
+ mi->add_arg(arg, (c == ' '));
+ }
+ }
+}
+
+static void decode_string_args(macro_iterator *mi)
+{
+ node *n;
+ int c = get_copy(&n);
+ for (;;) {
+ while (c == ' ')
+ c = get_copy(&n);
+ if (c == '\n' || c == EOF) {
+ error("missing ']'");
+ break;
+ }
+ if (c == ']')
+ break;
+ macro arg;
+ int quote_input_level = 0;
+ int done_tab_warning = 0;
+ if (c == '"') {
+ quote_input_level = input_stack::get_level();
+ c = get_copy(&n);
+ }
+ while (c != EOF && c != '\n'
+ && !(c == ']' && quote_input_level == 0)
+ && !(c == ' ' && quote_input_level == 0)) {
+ if (quote_input_level > 0 && c == '"'
+ && input_stack::get_level() == quote_input_level) {
+ c = get_copy(&n);
+ if (c == '"') {
+ arg.append(c);
+ c = get_copy(&n);
+ }
+ else
+ break;
+ }
+ else {
+ if (c == 0)
+ arg.append(n);
+ else {
+ if (c == '\t' && quote_input_level == 0 && !done_tab_warning) {
+ warning(WARN_TAB, "tab character in unquoted string argument");
+ done_tab_warning = 1;
+ }
+ arg.append(c);
+ }
+ c = get_copy(&n);
+ }
+ }
+ mi->add_arg(arg, (c == ' '));
+ }
+}
+
+void macro::invoke(symbol nm, bool do_not_want_next_token)
+{
+ macro_iterator *mi = new macro_iterator(nm, *this);
+ decode_args(mi);
+ input_stack::push(mi);
+ // we must delay tok.next() in case the function has been called by
+ // do_request to assure proper handling of compatible_flag
+ if (!do_not_want_next_token)
+ tok.next();
+}
+
+macro *macro::to_macro()
+{
+ return this;
+}
+
+int macro::empty()
+{
+ return empty_macro == 1;
+}
+
+macro_iterator::macro_iterator(symbol s, macro &m, const char *how_called,
+ int init_args)
+: string_iterator(m, how_called, s), args(0), argc(0), with_break(break_flag)
+{
+ if (init_args) {
+ arg_list *al = input_stack::get_arg_list();
+ if (al) {
+ args = new arg_list(al);
+ argc = input_stack::nargs();
+ }
+ }
+}
+
+macro_iterator::macro_iterator() : args(0), argc(0), with_break(break_flag)
+{
+}
+
+macro_iterator::~macro_iterator()
+{
+ while (args != 0) {
+ arg_list *tem = args;
+ args = args->next;
+ delete tem;
+ }
+}
+
+dictionary composite_dictionary(17);
+
+void composite_request()
+{
+ symbol from = get_name(true /* required */);
+ if (!from.is_null()) {
+ const char *from_gn = glyph_name_to_unicode(from.contents());
+ if (!from_gn) {
+ from_gn = check_unicode_name(from.contents());
+ if (!from_gn) {
+ error("invalid composite glyph name '%1'", from.contents());
+ skip_line();
+ return;
+ }
+ }
+ const char *from_decomposed = decompose_unicode(from_gn);
+ if (from_decomposed)
+ from_gn = &from_decomposed[1];
+ symbol to = get_name(true /* required */);
+ if (to.is_null())
+ composite_dictionary.remove(symbol(from_gn));
+ else {
+ const char *to_gn = glyph_name_to_unicode(to.contents());
+ if (!to_gn) {
+ to_gn = check_unicode_name(to.contents());
+ if (!to_gn) {
+ error("invalid composite glyph name '%1'", to.contents());
+ skip_line();
+ return;
+ }
+ }
+ const char *to_decomposed = decompose_unicode(to_gn);
+ if (to_decomposed)
+ to_gn = &to_decomposed[1];
+ if (strcmp(from_gn, to_gn) == 0)
+ composite_dictionary.remove(symbol(from_gn));
+ else
+ (void)composite_dictionary.lookup(symbol(from_gn), (void *)to_gn);
+ }
+ }
+ skip_line();
+}
+
+static symbol composite_glyph_name(symbol nm)
+{
+ macro_iterator *mi = new macro_iterator();
+ decode_string_args(mi);
+ input_stack::push(mi);
+ const char *gn = glyph_name_to_unicode(nm.contents());
+ if (!gn) {
+ gn = check_unicode_name(nm.contents());
+ if (!gn) {
+ error("invalid base glyph '%1' in composite glyph name", nm.contents());
+ return EMPTY_SYMBOL;
+ }
+ }
+ const char *gn_decomposed = decompose_unicode(gn);
+ string glyph_name(gn_decomposed ? &gn_decomposed[1] : gn);
+ string gl;
+ int n = input_stack::nargs();
+ for (int i = 1; i <= n; i++) {
+ glyph_name += '_';
+ input_iterator *p = input_stack::get_arg(i);
+ gl.clear();
+ int c;
+ while ((c = p->get(0)) != EOF)
+ if (c != DOUBLE_QUOTE)
+ gl += c;
+ gl += '\0';
+ const char *u = glyph_name_to_unicode(gl.contents());
+ if (!u) {
+ u = check_unicode_name(gl.contents());
+ if (!u) {
+ error("invalid component '%1' in composite glyph name",
+ gl.contents());
+ return EMPTY_SYMBOL;
+ }
+ }
+ const char *decomposed = decompose_unicode(u);
+ if (decomposed)
+ u = &decomposed[1];
+ void *mapped_composite = composite_dictionary.lookup(symbol(u));
+ if (mapped_composite)
+ u = (const char *)mapped_composite;
+ glyph_name += u;
+ }
+ glyph_name += '\0';
+ const char *groff_gn = unicode_to_glyph_name(glyph_name.contents());
+ if (groff_gn)
+ return symbol(groff_gn);
+ gl.clear();
+ gl += 'u';
+ gl += glyph_name;
+ return symbol(gl.contents());
+}
+
+int trap_sprung_flag = 0;
+int postpone_traps_flag = 0;
+symbol postponed_trap;
+
+void spring_trap(symbol nm)
+{
+ assert(!nm.is_null());
+ trap_sprung_flag = 1;
+ if (postpone_traps_flag) {
+ postponed_trap = nm;
+ return;
+ }
+ static char buf[2] = { BEGIN_TRAP, '\0' };
+ static char buf2[2] = { END_TRAP, '\0' };
+ input_stack::push(make_temp_iterator(buf2));
+ request_or_macro *p = lookup_request(nm);
+ // We don't perform this validation at the time the trap is planted
+ // because a request name might be replaced by a macro by the time the
+ // trap springs.
+ macro *m = p->to_macro();
+ if (m)
+ input_stack::push(new macro_iterator(nm, *m, "trap-called macro"));
+ else
+ error("trap failed to spring: '%1' is a request", nm.contents());
+ input_stack::push(make_temp_iterator(buf));
+}
+
+void postpone_traps()
+{
+ postpone_traps_flag = 1;
+}
+
+int unpostpone_traps()
+{
+ postpone_traps_flag = 0;
+ if (!postponed_trap.is_null()) {
+ spring_trap(postponed_trap);
+ postponed_trap = NULL_SYMBOL;
+ return 1;
+ }
+ else
+ return 0;
+}
+
+void read_request()
+{
+ macro_iterator *mi = new macro_iterator;
+ int reading_from_terminal = isatty(fileno(stdin));
+ int had_prompt = 0;
+ if (!tok.is_newline() && !tok.is_eof()) {
+ int c = get_copy(0);
+ while (c == ' ')
+ c = get_copy(0);
+ while (c != EOF && c != '\n' && c != ' ') {
+ if (!is_invalid_input_char(c)) {
+ if (reading_from_terminal)
+ fputc(c, stderr);
+ had_prompt = 1;
+ }
+ c = get_copy(0);
+ }
+ if (c == ' ') {
+ tok.make_space();
+ decode_args(mi);
+ }
+ }
+ if (reading_from_terminal) {
+ fputc(had_prompt ? ':' : '\a', stderr);
+ fflush(stderr);
+ }
+ input_stack::push(mi);
+ macro mac;
+ int nl = 0;
+ int c;
+ while ((c = getchar()) != EOF) {
+ if (is_invalid_input_char(c))
+ warning(WARN_INPUT, "invalid input character code %1", int(c));
+ else {
+ if (c == '\n') {
+ if (nl)
+ break;
+ else
+ nl = 1;
+ }
+ else
+ nl = 0;
+ mac.append(c);
+ }
+ }
+ if (reading_from_terminal)
+ clearerr(stdin);
+ input_stack::push(new string_iterator(mac));
+ tok.next();
+}
+
+enum define_mode { DEFINE_NORMAL, DEFINE_APPEND, DEFINE_IGNORE };
+enum calling_mode { CALLING_NORMAL, CALLING_INDIRECT };
+enum comp_mode { COMP_IGNORE, COMP_DISABLE, COMP_ENABLE };
+
+void do_define_string(define_mode mode, comp_mode comp)
+{
+ symbol nm;
+ node *n = 0; // pacify compiler
+ int c;
+ nm = get_name(true /* required */);
+ if (nm.is_null()) {
+ skip_line();
+ return;
+ }
+ if (tok.is_newline())
+ c = '\n';
+ else if (tok.is_tab())
+ c = '\t';
+ else if (!tok.is_space()) {
+ error("bad string definition");
+ skip_line();
+ return;
+ }
+ else
+ c = get_copy(&n);
+ while (c == ' ')
+ c = get_copy(&n);
+ if (c == '"')
+ c = get_copy(&n);
+ macro mac;
+ request_or_macro *rm = (request_or_macro *)request_dictionary.lookup(nm);
+ macro *mm = rm ? rm->to_macro() : 0;
+ if (mode == DEFINE_APPEND && mm)
+ mac = *mm;
+ if (comp == COMP_DISABLE)
+ mac.append(PUSH_GROFF_MODE);
+ else if (comp == COMP_ENABLE)
+ mac.append(PUSH_COMP_MODE);
+ while (c != '\n' && c != EOF) {
+ if (c == 0)
+ mac.append(n);
+ else
+ mac.append((unsigned char)c);
+ c = get_copy(&n);
+ }
+ if (comp == COMP_DISABLE || comp == COMP_ENABLE)
+ mac.append(POP_GROFFCOMP_MODE);
+ if (!mm) {
+ mm = new macro;
+ request_dictionary.define(nm, mm);
+ }
+ *mm = mac;
+ tok.next();
+}
+
+void define_string()
+{
+ do_define_string(DEFINE_NORMAL,
+ compatible_flag ? COMP_ENABLE: COMP_IGNORE);
+}
+
+void define_nocomp_string()
+{
+ do_define_string(DEFINE_NORMAL, COMP_DISABLE);
+}
+
+void append_string()
+{
+ do_define_string(DEFINE_APPEND,
+ compatible_flag ? COMP_ENABLE : COMP_IGNORE);
+}
+
+void append_nocomp_string()
+{
+ do_define_string(DEFINE_APPEND, COMP_DISABLE);
+}
+
+void do_define_character(char_mode mode, const char *font_name)
+{
+ node *n = 0; // pacify compiler
+ int c;
+ tok.skip();
+ charinfo *ci = tok.get_char(true /* required */);
+ if (ci == 0) {
+ skip_line();
+ return;
+ }
+ if (font_name) {
+ string s(font_name);
+ s += ' ';
+ s += ci->nm.contents();
+ s += '\0';
+ ci = get_charinfo(symbol(s.contents()));
+ }
+ tok.next();
+ if (tok.is_newline())
+ c = '\n';
+ else if (tok.is_tab())
+ c = '\t';
+ else if (!tok.is_space()) {
+ error("bad character definition");
+ skip_line();
+ return;
+ }
+ else
+ c = get_copy(&n);
+ while (c == ' ' || c == '\t')
+ c = get_copy(&n);
+ if (c == '"')
+ c = get_copy(&n);
+ macro *m = new macro;
+ while (c != '\n' && c != EOF) {
+ if (c == 0)
+ m->append(n);
+ else
+ m->append((unsigned char)c);
+ c = get_copy(&n);
+ }
+ m = ci->setx_macro(m, mode);
+ if (m)
+ delete m;
+ tok.next();
+}
+
+void define_character()
+{
+ do_define_character(CHAR_NORMAL);
+}
+
+void define_fallback_character()
+{
+ do_define_character(CHAR_FALLBACK);
+}
+
+void define_special_character()
+{
+ do_define_character(CHAR_SPECIAL);
+}
+
+static void remove_character()
+{
+ tok.skip();
+ while (!tok.is_newline() && !tok.is_eof()) {
+ if (!tok.is_space() && !tok.is_tab()) {
+ charinfo *ci = tok.get_char(true /* required */);
+ if (!ci)
+ break;
+ macro *m = ci->set_macro(0);
+ if (m)
+ delete m;
+ }
+ tok.next();
+ }
+ skip_line();
+}
+
+static void interpolate_string(symbol nm)
+{
+ request_or_macro *p = lookup_request(nm);
+ macro *m = p->to_macro();
+ if (!m)
+ error("cannot interpolate request '%1'", nm.contents());
+ else {
+ if (m->is_string()) {
+ string_iterator *si = new string_iterator(*m, "string", nm);
+ input_stack::push(si);
+ }
+ else {
+ // if a macro is called as a string, \$0 doesn't get changed
+ macro_iterator *mi = new macro_iterator(input_stack::get_macro_name(),
+ *m, "string", 1);
+ input_stack::push(mi);
+ }
+ }
+}
+
+static void interpolate_string_with_args(symbol nm)
+{
+ request_or_macro *p = lookup_request(nm);
+ macro *m = p->to_macro();
+ if (!m)
+ error("cannot interpolate request '%1'", nm.contents());
+ else {
+ macro_iterator *mi = new macro_iterator(nm, *m);
+ decode_string_args(mi);
+ input_stack::push(mi);
+ }
+}
+
+static void interpolate_arg(symbol nm)
+{
+ const char *s = nm.contents();
+ if (!s || *s == '\0')
+ copy_mode_error("missing positional argument number");
+ else if (s[1] == 0 && csdigit(s[0]))
+ input_stack::push(input_stack::get_arg(s[0] - '0'));
+ else if (s[0] == '*' && s[1] == '\0') {
+ int limit = input_stack::nargs();
+ string args;
+ for (int i = 1; i <= limit; i++) {
+ input_iterator *p = input_stack::get_arg(i);
+ int c;
+ while ((c = p->get(0)) != EOF)
+ if (c != DOUBLE_QUOTE)
+ args += c;
+ if (i != limit)
+ args += ' ';
+ delete p;
+ }
+ if (limit > 0) {
+ args += '\0';
+ input_stack::push(make_temp_iterator(args.contents()));
+ }
+ }
+ else if (s[0] == '@' && s[1] == '\0') {
+ int limit = input_stack::nargs();
+ string args;
+ for (int i = 1; i <= limit; i++) {
+ args += '"';
+ args += char(BEGIN_QUOTE);
+ input_iterator *p = input_stack::get_arg(i);
+ int c;
+ while ((c = p->get(0)) != EOF)
+ if (c != DOUBLE_QUOTE)
+ args += c;
+ args += char(END_QUOTE);
+ args += '"';
+ if (i != limit)
+ args += ' ';
+ delete p;
+ }
+ if (limit > 0) {
+ args += '\0';
+ input_stack::push(make_temp_iterator(args.contents()));
+ }
+ }
+ else if (s[0] == '^' && s[1] == '\0') {
+ int limit = input_stack::nargs();
+ string args;
+ int c = input_stack::peek();
+ for (int i = 1; i <= limit; i++) {
+ input_iterator *p = input_stack::get_arg(i);
+ while ((c = p->get(0)) != EOF) {
+ if (c == DOUBLE_QUOTE)
+ c = '"';
+ args += c;
+ }
+ if (input_stack::space_follows_arg(i))
+ args += ' ';
+ delete p;
+ }
+ if (limit > 0) {
+ args += '\0';
+ input_stack::push(make_temp_iterator(args.contents()));
+ }
+ }
+ else {
+ const char *p;
+ for (p = s; *p && csdigit(*p); p++)
+ ;
+ if (*p)
+ copy_mode_error("invalid positional argument number '%1'", s);
+ else
+ input_stack::push(input_stack::get_arg(atoi(s)));
+ }
+}
+
+void handle_first_page_transition()
+{
+ push_token(tok);
+ topdiv->begin_page();
+}
+
+// We push back a token by wrapping it up in a token_node, and
+// wrapping that up in a string_iterator.
+
+static void push_token(const token &t)
+{
+ macro m;
+ m.append(new token_node(t));
+ input_stack::push(new string_iterator(m));
+}
+
+void push_page_ejector()
+{
+ static char buf[2] = { PAGE_EJECTOR, '\0' };
+ input_stack::push(make_temp_iterator(buf));
+}
+
+void handle_initial_request(unsigned char code)
+{
+ char buf[2];
+ buf[0] = code;
+ buf[1] = '\0';
+ macro mac;
+ mac.append(new token_node(tok));
+ input_stack::push(new string_iterator(mac));
+ input_stack::push(make_temp_iterator(buf));
+ topdiv->begin_page();
+ tok.next();
+}
+
+void handle_initial_title()
+{
+ handle_initial_request(TITLE_REQUEST);
+}
+
+void do_define_macro(define_mode mode, calling_mode calling, comp_mode comp)
+{
+ symbol nm, term, dot_symbol(".");
+ if (calling == CALLING_INDIRECT) {
+ symbol temp1 = get_name(true /* required */);
+ if (temp1.is_null()) {
+ skip_line();
+ return;
+ }
+ symbol temp2 = get_name();
+ input_stack::push(make_temp_iterator("\n"));
+ if (!temp2.is_null()) {
+ interpolate_string(temp2);
+ input_stack::push(make_temp_iterator(" "));
+ }
+ interpolate_string(temp1);
+ input_stack::push(make_temp_iterator(" "));
+ tok.next();
+ }
+ if (mode == DEFINE_NORMAL || mode == DEFINE_APPEND) {
+ nm = get_name(true /* required */);
+ if (nm.is_null()) {
+ skip_line();
+ return;
+ }
+ }
+ term = get_name(); // the request that terminates the definition
+ if (term.is_null())
+ term = dot_symbol;
+ while (!tok.is_newline() && !tok.is_eof())
+ tok.next();
+ const char *start_filename;
+ int start_lineno;
+ int have_start_location = input_stack::get_location(0, &start_filename,
+ &start_lineno);
+ node *n;
+ // doing this here makes the line numbers come out right
+ int c = get_copy(&n, true /* is defining*/);
+ macro mac;
+ macro *mm = 0;
+ if (mode == DEFINE_NORMAL || mode == DEFINE_APPEND) {
+ request_or_macro *rm =
+ (request_or_macro *)request_dictionary.lookup(nm);
+ if (rm)
+ mm = rm->to_macro();
+ if (mm && mode == DEFINE_APPEND)
+ mac = *mm;
+ }
+ int bol = 1;
+ if (comp == COMP_DISABLE)
+ mac.append(PUSH_GROFF_MODE);
+ else if (comp == COMP_ENABLE)
+ mac.append(PUSH_COMP_MODE);
+ for (;;) {
+ if (c == '\n')
+ mac.clear_string_flag();
+ while (c == ESCAPE_NEWLINE) {
+ if (mode == DEFINE_NORMAL || mode == DEFINE_APPEND)
+ mac.append(c);
+ c = get_copy(&n, true /* is defining */);
+ }
+ if (bol && c == '.') {
+ const char *s = term.contents();
+ int d = 0;
+ // see if it matches term
+ int i = 0;
+ if (s[0] != 0) {
+ while ((d = get_copy(&n)) == ' ' || d == '\t')
+ ;
+ if ((unsigned char)s[0] == d) {
+ for (i = 1; s[i] != 0; i++) {
+ d = get_copy(&n);
+ if ((unsigned char)s[i] != d)
+ break;
+ }
+ }
+ }
+ if (s[i] == 0
+ && ((i == 2 && compatible_flag)
+ || (d = get_copy(&n)) == ' '
+ || d == '\n')) { // we found it
+ if (d == '\n')
+ tok.make_newline();
+ else
+ tok.make_space();
+ if (mode == DEFINE_APPEND || mode == DEFINE_NORMAL) {
+ if (!mm) {
+ mm = new macro;
+ request_dictionary.define(nm, mm);
+ }
+ if (comp == COMP_DISABLE || comp == COMP_ENABLE)
+ mac.append(POP_GROFFCOMP_MODE);
+ *mm = mac;
+ }
+ if (term != dot_symbol) {
+ ignoring = 0;
+ interpolate_macro(term);
+ }
+ else
+ skip_line();
+ return;
+ }
+ if (mode == DEFINE_APPEND || mode == DEFINE_NORMAL) {
+ mac.append(c);
+ for (int j = 0; j < i; j++)
+ mac.append(s[j]);
+ }
+ c = d;
+ }
+ if (c == EOF) {
+ if (mode == DEFINE_NORMAL || mode == DEFINE_APPEND) {
+ if (have_start_location)
+ error_with_file_and_line(start_filename, start_lineno,
+ "end of file while defining macro '%1'",
+ nm.contents());
+ else
+ error("end of file while defining macro '%1'", nm.contents());
+ }
+ else {
+ if (have_start_location)
+ error_with_file_and_line(start_filename, start_lineno,
+ "end of file while ignoring input lines");
+ else
+ error("end of file while ignoring input lines");
+ }
+ tok.next();
+ return;
+ }
+ if (mode == DEFINE_NORMAL || mode == DEFINE_APPEND) {
+ if (c == 0)
+ mac.append(n);
+ else
+ mac.append(c);
+ }
+ bol = (c == '\n');
+ c = get_copy(&n, true /* is defining */);
+ }
+}
+
+void define_macro()
+{
+ do_define_macro(DEFINE_NORMAL, CALLING_NORMAL,
+ compatible_flag ? COMP_ENABLE : COMP_IGNORE);
+}
+
+void define_nocomp_macro()
+{
+ do_define_macro(DEFINE_NORMAL, CALLING_NORMAL, COMP_DISABLE);
+}
+
+void define_indirect_macro()
+{
+ do_define_macro(DEFINE_NORMAL, CALLING_INDIRECT,
+ compatible_flag ? COMP_ENABLE : COMP_IGNORE);
+}
+
+void define_indirect_nocomp_macro()
+{
+ do_define_macro(DEFINE_NORMAL, CALLING_INDIRECT, COMP_DISABLE);
+}
+
+void append_macro()
+{
+ do_define_macro(DEFINE_APPEND, CALLING_NORMAL,
+ compatible_flag ? COMP_ENABLE : COMP_IGNORE);
+}
+
+void append_nocomp_macro()
+{
+ do_define_macro(DEFINE_APPEND, CALLING_NORMAL, COMP_DISABLE);
+}
+
+void append_indirect_macro()
+{
+ do_define_macro(DEFINE_APPEND, CALLING_INDIRECT,
+ compatible_flag ? COMP_ENABLE : COMP_IGNORE);
+}
+
+void append_indirect_nocomp_macro()
+{
+ do_define_macro(DEFINE_APPEND, CALLING_INDIRECT, COMP_DISABLE);
+}
+
+void ignore()
+{
+ ignoring = 1;
+ do_define_macro(DEFINE_IGNORE, CALLING_NORMAL, COMP_IGNORE);
+ ignoring = 0;
+}
+
+void remove_macro()
+{
+ for (;;) {
+ symbol s = get_name();
+ if (s.is_null())
+ break;
+ request_dictionary.remove(s);
+ }
+ skip_line();
+}
+
+void rename_macro()
+{
+ symbol s1 = get_name(true /* required */);
+ if (!s1.is_null()) {
+ symbol s2 = get_name(true /* required */);
+ if (!s2.is_null())
+ request_dictionary.rename(s1, s2);
+ }
+ skip_line();
+}
+
+void alias_macro()
+{
+ symbol s1 = get_name(true /* required */);
+ if (!s1.is_null()) {
+ symbol s2 = get_name(true /* required */);
+ if (!s2.is_null()) {
+ if (!request_dictionary.alias(s1, s2))
+ warning(WARN_MAC, "macro '%1' not defined", s2.contents());
+ }
+ }
+ skip_line();
+}
+
+void chop_macro()
+{
+ symbol s = get_name(true /* required */);
+ if (!s.is_null()) {
+ request_or_macro *p = lookup_request(s);
+ macro *m = p->to_macro();
+ if (!m)
+ error("cannot chop request");
+ else if (m->empty())
+ error("cannot chop empty macro");
+ else {
+ int have_restore = 0;
+ // we have to check for additional save/restore pairs which could be
+ // there due to empty am1 requests.
+ for (;;) {
+ if (m->get(m->len - 1) != POP_GROFFCOMP_MODE)
+ break;
+ have_restore = 1;
+ m->len -= 1;
+ if (m->get(m->len - 1) != PUSH_GROFF_MODE
+ && m->get(m->len - 1) != PUSH_COMP_MODE)
+ break;
+ have_restore = 0;
+ m->len -= 1;
+ if (m->len == 0)
+ break;
+ }
+ if (m->len == 0)
+ error("cannot chop empty macro");
+ else {
+ if (have_restore)
+ m->set(POP_GROFFCOMP_MODE, m->len - 1);
+ else
+ m->len -= 1;
+ }
+ }
+ }
+ skip_line();
+}
+
+enum case_xform_mode { STRING_UPCASE, STRING_DOWNCASE };
+
+// Case-transform each byte of the string argument's contents.
+void do_string_case_transform(case_xform_mode mode)
+{
+ assert((mode == STRING_DOWNCASE) || (mode == STRING_UPCASE));
+ symbol s = get_name(true /* required */);
+ if (s.is_null()) {
+ skip_line();
+ return;
+ }
+ request_or_macro *p = lookup_request(s);
+ macro *m = p->to_macro();
+ if (!m) {
+ error("cannot apply string case transformation to a request ('%1')",
+ s.contents());
+ skip_line();
+ return;
+ }
+ string_iterator iter1(*m);
+ macro *mac = new macro;
+ int len = m->macro::length();
+ for (int l = 0; l < len; l++) {
+ int nc, c = iter1.get(0);
+ if (c == PUSH_GROFF_MODE
+ || c == PUSH_COMP_MODE
+ || c == POP_GROFFCOMP_MODE)
+ nc = c;
+ else if (c == EOF)
+ break;
+ else
+ if (mode == STRING_DOWNCASE)
+ nc = tolower(c);
+ else
+ nc = toupper(c);
+ mac->append(nc);
+ }
+ request_dictionary.define(s, mac);
+ tok.next();
+}
+
+// Uppercase-transform each byte of the string argument's contents.
+void stringdown_request() {
+ do_string_case_transform(STRING_DOWNCASE);
+}
+
+// Lowercase-transform each byte of the string argument's contents.
+void stringup_request() {
+ do_string_case_transform(STRING_UPCASE);
+}
+
+void substring_request()
+{
+ int start; // 0, 1, ..., n-1 or -1, -2, ...
+ symbol s = get_name(true /* required */);
+ if (!s.is_null() && get_integer(&start)) {
+ request_or_macro *p = lookup_request(s);
+ macro *m = p->to_macro();
+ if (!m)
+ error("cannot apply 'substring' on a request");
+ else {
+ int end = -1;
+ if (!has_arg() || get_integer(&end)) {
+ int real_length = 0; // 1, 2, ..., n
+ string_iterator iter1(*m);
+ for (int l = 0; l < m->len; l++) {
+ int c = iter1.get(0);
+ if (c == PUSH_GROFF_MODE
+ || c == PUSH_COMP_MODE
+ || c == POP_GROFFCOMP_MODE)
+ continue;
+ if (c == EOF)
+ break;
+ real_length++;
+ }
+ if (start < 0)
+ start += real_length;
+ if (end < 0)
+ end += real_length;
+ if (start > end) {
+ int tem = start;
+ start = end;
+ end = tem;
+ }
+ if (start >= real_length || end < 0) {
+ warning(WARN_RANGE,
+ "start and end index of substring out of range");
+ m->len = 0;
+ if (m->p) {
+ if (--(m->p->count) <= 0)
+ delete m->p;
+ m->p = 0;
+ }
+ skip_line();
+ return;
+ }
+ if (start < 0) {
+ warning(WARN_RANGE,
+ "start index of substring out of range, set to 0");
+ start = 0;
+ }
+ if (end >= real_length) {
+ warning(WARN_RANGE,
+ "end index of substring out of range, set to string length");
+ end = real_length - 1;
+ }
+ // now extract the substring
+ string_iterator iter(*m);
+ int i;
+ for (i = 0; i < start; i++) {
+ int c = iter.get(0);
+ while (c == PUSH_GROFF_MODE
+ || c == PUSH_COMP_MODE
+ || c == POP_GROFFCOMP_MODE)
+ c = iter.get(0);
+ if (c == EOF)
+ break;
+ }
+ macro mac;
+ for (; i <= end; i++) {
+ node *nd = 0; // pacify compiler
+ int c = iter.get(&nd);
+ while (c == PUSH_GROFF_MODE
+ || c == PUSH_COMP_MODE
+ || c == POP_GROFFCOMP_MODE)
+ c = iter.get(0);
+ if (c == EOF)
+ break;
+ if (c == 0)
+ mac.append(nd);
+ else
+ mac.append((unsigned char)c);
+ }
+ *m = mac;
+ }
+ }
+ }
+ skip_line();
+}
+
+void length_request()
+{
+ symbol ret;
+ ret = get_name(true /* required */);
+ if (ret.is_null()) {
+ skip_line();
+ return;
+ }
+ int c;
+ node *n;
+ if (tok.is_newline())
+ c = '\n';
+ else if (tok.is_tab())
+ c = '\t';
+ else if (!tok.is_space()) {
+ error("bad string definition");
+ skip_line();
+ return;
+ }
+ else
+ c = get_copy(&n);
+ while (c == ' ')
+ c = get_copy(&n);
+ if (c == '"')
+ c = get_copy(&n);
+ int len = 0;
+ while (c != '\n' && c != EOF) {
+ ++len;
+ c = get_copy(&n);
+ }
+ reg *r = (reg*)register_dictionary.lookup(ret);
+ if (r)
+ r->set_value(len);
+ else
+ set_number_reg(ret, len);
+ tok.next();
+}
+
+void asciify_macro()
+{
+ symbol s = get_name(true /* required */);
+ if (!s.is_null()) {
+ request_or_macro *p = lookup_request(s);
+ macro *m = p->to_macro();
+ if (!m)
+ error("cannot asciify request");
+ else {
+ macro am;
+ string_iterator iter(*m);
+ for (;;) {
+ node *nd = 0; // pacify compiler
+ int c = iter.get(&nd);
+ if (c == EOF)
+ break;
+ if (c != 0)
+ am.append(c);
+ else
+ nd->asciify(&am);
+ }
+ *m = am;
+ }
+ }
+ skip_line();
+}
+
+void unformat_macro()
+{
+ symbol s = get_name(true /* required */);
+ if (!s.is_null()) {
+ request_or_macro *p = lookup_request(s);
+ macro *m = p->to_macro();
+ if (!m)
+ error("cannot unformat request");
+ else {
+ macro am;
+ string_iterator iter(*m);
+ for (;;) {
+ node *nd = 0; // pacify compiler
+ int c = iter.get(&nd);
+ if (c == EOF)
+ break;
+ if (c != 0)
+ am.append(c);
+ else {
+ if (nd->set_unformat_flag())
+ am.append(nd);
+ }
+ }
+ *m = am;
+ }
+ }
+ skip_line();
+}
+
+static void interpolate_environment_variable(symbol nm)
+{
+ const char *s = getenv(nm.contents());
+ if (s && *s)
+ input_stack::push(make_temp_iterator(s));
+}
+
+void interpolate_number_reg(symbol nm, int inc)
+{
+ reg *r = lookup_number_reg(nm);
+ if (inc < 0)
+ r->decrement();
+ else if (inc > 0)
+ r->increment();
+ input_stack::push(make_temp_iterator(r->get_string()));
+}
+
+static void interpolate_number_format(symbol nm)
+{
+ reg *r = (reg *)register_dictionary.lookup(nm);
+ if (r)
+ input_stack::push(make_temp_iterator(r->get_format()));
+}
+
+static int get_delim_number(units *n, unsigned char si, int prev_value)
+{
+ token start;
+ start.next();
+ if (start.usable_as_delimiter(true /* report error */)) {
+ tok.next();
+ if (get_number(n, si, prev_value)) {
+ if (start != tok)
+ warning(WARN_DELIM, "closing delimiter does not match");
+ return 1;
+ }
+ }
+ return 0;
+}
+
+static int get_delim_number(units *n, unsigned char si)
+{
+ token start;
+ start.next();
+ if (start.usable_as_delimiter(true /* report error */)) {
+ tok.next();
+ if (get_number(n, si)) {
+ if (start != tok)
+ warning(WARN_DELIM, "closing delimiter does not match");
+ return 1;
+ }
+ }
+ return 0;
+}
+
+static int get_line_arg(units *n, unsigned char si, charinfo **cp)
+{
+ token start;
+ start.next();
+ int start_level = input_stack::get_level();
+ if (!start.usable_as_delimiter(true /* report error */))
+ return 0;
+ tok.next();
+ if (get_number(n, si)) {
+ if (tok.is_dummy() || tok.is_transparent_dummy())
+ tok.next();
+ if (!(start == tok && input_stack::get_level() == start_level)) {
+ *cp = tok.get_char(true /* required */);
+ tok.next();
+ }
+ if (!(start == tok && input_stack::get_level() == start_level))
+ warning(WARN_DELIM, "closing delimiter does not match");
+ return 1;
+ }
+ return 0;
+}
+
+static bool read_size(int *x)
+{
+ tok.next();
+ int c = tok.ch();
+ int inc = 0;
+ if (c == '-') {
+ inc = -1;
+ tok.next();
+ c = tok.ch();
+ }
+ else if (c == '+') {
+ inc = 1;
+ tok.next();
+ c = tok.ch();
+ }
+ int val = 0; // pacify compiler
+ bool contains_invalid_digit = false;
+ if (c == '(') {
+ tok.next();
+ c = tok.ch();
+ if (!inc) {
+ // allow an increment either before or after the left parenthesis
+ if (c == '-') {
+ inc = -1;
+ tok.next();
+ c = tok.ch();
+ }
+ else if (c == '+') {
+ inc = 1;
+ tok.next();
+ c = tok.ch();
+ }
+ }
+ if (!csdigit(c))
+ contains_invalid_digit = true;
+ else {
+ val = c - '0';
+ tok.next();
+ c = tok.ch();
+ if (!csdigit(c))
+ contains_invalid_digit = true;
+ else {
+ val = val*10 + (c - '0');
+ val *= sizescale;
+ }
+ }
+ }
+ else if (csdigit(c)) {
+ val = c - '0';
+ if (compatible_flag && !inc && c != '0' && c < '4') {
+ // Support legacy \sNN syntax.
+ tok.next();
+ c = tok.ch();
+ if (!csdigit(c))
+ contains_invalid_digit = true;
+ else {
+ val = val*10 + (c - '0');
+ error("ambiguous type size in escape sequence; rewrite to use"
+ " '%1s(%2' or similar", static_cast<char>(escape_char),
+ val);
+ }
+ }
+ val *= sizescale;
+ }
+ else if (!tok.usable_as_delimiter(true /* report error */))
+ return false;
+ else {
+ token start(tok);
+ tok.next();
+ c = tok.ch();
+ if (!inc && (c == '-' || c == '+')) {
+ inc = c == '+' ? 1 : -1;
+ tok.next();
+ }
+ if (!get_number(&val, 'z'))
+ return false;
+ if (!(start.ch() == '[' && tok.ch() == ']') && start != tok) {
+ if (start.ch() == '[')
+ error("missing ']' in type size escape sequence");
+ else
+ error("missing closing delimiter in type size escape sequence");
+ return false;
+ }
+ }
+ if (contains_invalid_digit) {
+ if (c)
+ error("expected valid digit in type size escape sequence, got %1",
+ input_char_description(c));
+ else
+ error("invalid digit in type size escape sequence");
+ return false;
+ }
+ else {
+ switch (inc) {
+ case 0:
+ if (val == 0) {
+ // special case -- point size 0 means "revert to previous size"
+ *x = 0;
+ return true;
+ }
+ *x = val;
+ break;
+ case 1:
+ *x = curenv->get_requested_point_size() + val;
+ break;
+ case -1:
+ *x = curenv->get_requested_point_size() - val;
+ break;
+ default:
+ assert(0);
+ }
+ if (*x <= 0) {
+ warning(WARN_RANGE,
+ "type size escape sequence results in non-positive size"
+ " %1u; setting it to 1u", *x);
+ *x = 1;
+ }
+ return true;
+ }
+}
+
+static symbol get_delim_name()
+{
+ token start;
+ start.next();
+ if (start.is_eof()) {
+ error("end of input at start of delimited name");
+ return NULL_SYMBOL;
+ }
+ if (start.is_newline()) {
+ error("can't delimit name with a newline");
+ return NULL_SYMBOL;
+ }
+ int start_level = input_stack::get_level();
+ char abuf[ABUF_SIZE];
+ char *buf = abuf;
+ int buf_size = ABUF_SIZE;
+ int i = 0;
+ for (;;) {
+ if (i + 1 > buf_size) {
+ if (buf == abuf) {
+ buf = new char[ABUF_SIZE*2];
+ memcpy(buf, abuf, buf_size);
+ buf_size = ABUF_SIZE*2;
+ }
+ else {
+ char *old_buf = buf;
+ buf = new char[buf_size*2];
+ memcpy(buf, old_buf, buf_size);
+ buf_size *= 2;
+ delete[] old_buf;
+ }
+ }
+ tok.next();
+ if (tok == start
+ && (compatible_flag || input_stack::get_level() == start_level))
+ break;
+ if ((buf[i] = tok.ch()) == 0) {
+ error("missing delimiter (got %1)", tok.description());
+ if (buf != abuf)
+ delete[] buf;
+ return NULL_SYMBOL;
+ }
+ i++;
+ }
+ buf[i] = '\0';
+ if (buf == abuf) {
+ if (i == 0) {
+ error("empty delimited name");
+ return NULL_SYMBOL;
+ }
+ else
+ return symbol(buf);
+ }
+ else {
+ symbol s(buf);
+ delete[] buf;
+ return s;
+ }
+}
+
+// Implement \R
+
+static void do_register()
+{
+ token start;
+ start.next();
+ if (!start.usable_as_delimiter(true /* report error */))
+ return;
+ tok.next();
+ symbol nm = get_long_name(true /* required */);
+ if (nm.is_null())
+ return;
+ while (tok.is_space())
+ tok.next();
+ reg *r = (reg *)register_dictionary.lookup(nm);
+ int prev_value;
+ if (!r || !r->get_value(&prev_value))
+ prev_value = 0;
+ int val;
+ if (!get_number(&val, 'u', prev_value))
+ return;
+ if (start != tok)
+ warning(WARN_DELIM, "closing delimiter does not match");
+ if (r)
+ r->set_value(val);
+ else
+ set_number_reg(nm, val);
+}
+
+// this implements the \w escape sequence
+
+static void do_width()
+{
+ int start_level = input_stack::get_level();
+ token start;
+ start.next();
+ environment env(curenv);
+ environment *oldenv = curenv;
+ curenv = &env;
+ for (;;) {
+ tok.next();
+ if (tok.is_newline() || tok.is_eof()) {
+ if (tok != start)
+ warning(WARN_DELIM, "missing closing delimiter in"
+ " width computation escape sequence (got %1)",
+ tok.description());
+ // Synthesize an input line ending.
+ input_stack::push(make_temp_iterator("\n"));
+ break;
+ }
+ if (tok == start
+ && (compatible_flag || input_stack::get_level() == start_level))
+ break;
+ tok.process();
+ }
+ env.wrap_up_tab();
+ units x = env.get_input_line_position().to_units();
+ input_stack::push(make_temp_iterator(i_to_a(x)));
+ env.width_registers();
+ curenv = oldenv;
+ have_input = 0;
+}
+
+charinfo *page_character;
+
+void set_page_character()
+{
+ page_character = get_optional_char();
+ skip_line();
+}
+
+static const symbol percent_symbol("%");
+
+void read_title_parts(node **part, hunits *part_width)
+{
+ tok.skip();
+ if (tok.is_newline() || tok.is_eof())
+ return;
+ token start(tok);
+ int start_level = input_stack::get_level();
+ tok.next();
+ for (int i = 0; i < 3; i++) {
+ while (!tok.is_newline() && !tok.is_eof()) {
+ if (tok == start
+ && (compatible_flag || input_stack::get_level() == start_level)) {
+ tok.next();
+ break;
+ }
+ if (page_character != 0 && tok.get_char() == page_character)
+ interpolate_number_reg(percent_symbol, 0);
+ else
+ tok.process();
+ tok.next();
+ }
+ curenv->wrap_up_tab();
+ part_width[i] = curenv->get_input_line_position();
+ part[i] = curenv->extract_output_line();
+ }
+ while (!tok.is_newline() && !tok.is_eof())
+ tok.next();
+}
+
+class non_interpreted_node : public node {
+ macro mac;
+public:
+ non_interpreted_node(const macro &);
+ int interpret(macro *);
+ node *copy();
+ int ends_sentence();
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+};
+
+non_interpreted_node::non_interpreted_node(const macro &m) : mac(m)
+{
+}
+
+int non_interpreted_node::ends_sentence()
+{
+ return 2;
+}
+
+int non_interpreted_node::same(node *nd)
+{
+ return mac == ((non_interpreted_node *)nd)->mac;
+}
+
+const char *non_interpreted_node::type()
+{
+ return "non_interpreted_node";
+}
+
+int non_interpreted_node::force_tprint()
+{
+ return 0;
+}
+
+int non_interpreted_node::is_tag()
+{
+ return 0;
+}
+
+node *non_interpreted_node::copy()
+{
+ return new non_interpreted_node(mac);
+}
+
+int non_interpreted_node::interpret(macro *m)
+{
+ string_iterator si(mac);
+ node *n = 0; // pacify compiler
+ for (;;) {
+ int c = si.get(&n);
+ if (c == EOF)
+ break;
+ if (c == 0)
+ m->append(n);
+ else
+ m->append(c);
+ }
+ return 1;
+}
+
+static node *do_non_interpreted()
+{
+ node *n;
+ int c;
+ macro mac;
+ while ((c = get_copy(&n)) != ESCAPE_QUESTION && c != EOF && c != '\n')
+ if (c == 0)
+ mac.append(n);
+ else
+ mac.append(c);
+ if (c == EOF || c == '\n') {
+ error("unterminated transparent embedding escape sequence");
+ return 0;
+ }
+ return new non_interpreted_node(mac);
+}
+
+static void encode_char(macro *mac, char c)
+{
+ if (c == '\0') {
+ if (tok.is_stretchable_space()
+ || tok.is_unstretchable_space())
+ mac->append(' ');
+ else if (tok.is_special()) {
+ const char *sc;
+ if (font::use_charnames_in_special) {
+ charinfo *ci = tok.get_char(true /* required */);
+ sc = ci->get_symbol()->contents();
+ }
+ else
+ sc = tok.get_char()->get_symbol()->contents();
+ if (strcmp("-", sc) == 0)
+ mac->append('-');
+ else if (strcmp("aq", sc) == 0)
+ mac->append('\'');
+ else if (strcmp("dq", sc) == 0)
+ mac->append('"');
+ else if (strcmp("ga", sc) == 0)
+ mac->append('`');
+ else if (strcmp("ha", sc) == 0)
+ mac->append('^');
+ else if (strcmp("rs", sc) == 0)
+ mac->append('\\');
+ else if (strcmp("ti", sc) == 0)
+ mac->append('~');
+ else {
+ if (font::use_charnames_in_special) {
+ if (sc[0] != (char)0) {
+ mac->append('\\');
+ mac->append('[');
+ int i = 0;
+ while (sc[i] != (char)0) {
+ mac->append(sc[i]);
+ i++;
+ }
+ mac->append(']');
+ }
+ else
+ error("special character '%1' cannot be used within"
+ " device control escape sequence", sc);
+ }
+ }
+ }
+ else if (!(tok.is_hyphen_indicator()
+ || tok.is_dummy()
+ || tok.is_transparent_dummy()
+ || tok.is_zero_width_break()))
+ error("%1 is invalid within device control escape sequence",
+ tok.description());
+ }
+ else {
+ if ((font::use_charnames_in_special) && (c == '\\')) {
+ /*
+ * add escape escape sequence
+ */
+ mac->append(c);
+ }
+ mac->append(c);
+ }
+}
+
+static node *do_special()
+{
+ int start_level = input_stack::get_level();
+ token start;
+ start.next();
+ macro mac;
+ for (;;) {
+ tok.next();
+ if (tok.is_newline()) {
+ input_stack::push(make_temp_iterator("\n"));
+ break;
+ }
+ if (tok.is_eof()) {
+ warning(WARN_DELIM, "missing closing delimiter in device control"
+ " escape sequence (got %1)", tok.description());
+ // Synthesize an input line ending.
+ input_stack::push(make_temp_iterator("\n"));
+ break;
+ }
+ if (tok == start
+ && (compatible_flag || input_stack::get_level() == start_level))
+ break;
+ unsigned char c;
+ if (tok.is_space())
+ c = ' ';
+ else if (tok.is_tab())
+ c = '\t';
+ else if (tok.is_leader())
+ c = '\001';
+ else if (tok.is_backspace())
+ c = '\b';
+ else
+ c = tok.ch();
+ encode_char(&mac, c);
+ }
+ return new special_node(mac);
+}
+
+void device_request()
+{
+ if (!tok.is_newline() && !tok.is_eof()) {
+ int c;
+ macro mac;
+ for (;;) {
+ c = get_copy(0);
+ if (c == '"') {
+ c = get_copy(0);
+ break;
+ }
+ if (c != ' ' && c != '\t')
+ break;
+ }
+ for (; c != '\n' && c != EOF; c = get_copy(0))
+ mac.append(c);
+ curenv->add_node(new special_node(mac));
+ }
+ tok.next();
+}
+
+void device_macro_request()
+{
+ symbol s = get_name(true /* required */);
+ if (!(s.is_null() || s.is_empty())) {
+ request_or_macro *p = lookup_request(s);
+ macro *m = p->to_macro();
+ if (m)
+ curenv->add_node(new special_node(*m));
+ else
+ error("can't transparently throughput a request");
+ }
+ skip_line();
+}
+
+void output_request()
+{
+ if (!tok.is_newline() && !tok.is_eof()) {
+ int c;
+ for (;;) {
+ c = get_copy(0);
+ if (c == '"') {
+ c = get_copy(0);
+ break;
+ }
+ if (c != ' ' && c != '\t')
+ break;
+ }
+ for (; c != '\n' && c != EOF; c = get_copy(0))
+ topdiv->transparent_output(c);
+ topdiv->transparent_output('\n');
+ }
+ tok.next();
+}
+
+extern int image_no; // from node.cpp
+
+static node *do_suppress(symbol nm)
+{
+ if (nm.is_null() || nm.is_empty()) {
+ error("output suppression escape sequence requires an argument");
+ return 0;
+ }
+ const char *s = nm.contents();
+ switch (*s) {
+ case '0':
+ if (begin_level == 0)
+ // suppress generation of glyphs
+ return new suppress_node(0, 0);
+ break;
+ case '1':
+ if (begin_level == 0)
+ // enable generation of glyphs
+ return new suppress_node(1, 0);
+ break;
+ case '2':
+ if (begin_level == 0)
+ return new suppress_node(1, 1);
+ break;
+ case '3':
+ have_input = 1;
+ begin_level++;
+ break;
+ case '4':
+ have_input = 1;
+ begin_level--;
+ break;
+ case '5':
+ {
+ s++; // move over '5'
+ char position = *s;
+ if (*s == (char)0) {
+ error("missing position and filename in output suppression"
+ " escape sequence");
+ return 0;
+ }
+ if (!(position == 'l'
+ || position == 'r'
+ || position == 'c'
+ || position == 'i')) {
+ error("expected position 'l', 'r', 'c', or 'i' in output"
+ " suppression escape sequence, got '%1'", position);
+ return 0;
+ }
+ s++; // onto image name
+ if (s == (char *)0) {
+ error("missing image name in output suppression escape"
+ " sequence");
+ return 0;
+ }
+ image_no++;
+ if (begin_level == 0)
+ return new suppress_node(symbol(s), position, image_no);
+ else
+ have_input = 1;
+ }
+ break;
+ default:
+ error("invalid argument '%1' to output suppression escape sequence",
+ *s);
+ }
+ return 0;
+}
+
+void special_node::tprint(troff_output_file *out)
+{
+ tprint_start(out);
+ string_iterator iter(mac);
+ for (;;) {
+ int c = iter.get(0);
+ if (c == EOF)
+ break;
+ for (const char *s = ::asciify(c); *s; s++)
+ tprint_char(out, *s);
+ }
+ tprint_end(out);
+}
+
+int get_file_line(const char **filename, int *lineno)
+{
+ return input_stack::get_location(0, filename, lineno);
+}
+
+void line_file()
+{
+ int n;
+ if (get_integer(&n)) {
+ const char *filename = 0;
+ if (has_arg()) {
+ symbol s = get_long_name();
+ filename = s.contents();
+ }
+ (void)input_stack::set_location(filename, n-1);
+ }
+ skip_line();
+}
+
+static int nroff_mode = 0;
+
+static void nroff_request()
+{
+ nroff_mode = 1;
+ skip_line();
+}
+
+static void troff_request()
+{
+ nroff_mode = 0;
+ skip_line();
+}
+
+static void skip_alternative()
+{
+ int level = 0;
+ // ensure that ".if 0\{" works as expected
+ if (tok.is_left_brace())
+ level++;
+ int c;
+ for (;;) {
+ c = input_stack::get(0);
+ if (c == EOF)
+ break;
+ if (c == ESCAPE_LEFT_BRACE)
+ ++level;
+ else if (c == ESCAPE_RIGHT_BRACE)
+ --level;
+ else if (c == escape_char && escape_char > 0)
+ switch(input_stack::get(0)) {
+ case '{':
+ ++level;
+ break;
+ case '}':
+ --level;
+ break;
+ case '"':
+ while ((c = input_stack::get(0)) != '\n' && c != EOF)
+ ;
+ }
+ /*
+ Note that the level can properly be < 0, e.g.
+
+ .if 1 \{\
+ .if 0 \{\
+ .\}\}
+
+ So don't give an error message in this case.
+ */
+ if (level <= 0 && c == '\n')
+ break;
+ }
+ tok.next();
+}
+
+static void begin_alternative()
+{
+ while (tok.is_space() || tok.is_left_brace())
+ tok.next();
+}
+
+void nop_request()
+{
+ while (tok.is_space())
+ tok.next();
+}
+
+static int_stack if_else_stack;
+
+int do_if_request()
+{
+ int invert = 0;
+ while (tok.is_space())
+ tok.next();
+ while (tok.ch() == '!') {
+ tok.next();
+ invert = !invert;
+ }
+ int result;
+ unsigned char c = tok.ch();
+ if (compatible_flag)
+ switch (c) {
+ case 'F':
+ case 'S':
+ case 'c':
+ case 'd':
+ case 'm':
+ case 'r':
+ warning(WARN_SYNTAX,
+ "conditional operator '%1' used in compatibility mode",
+ c);
+ break;
+ default:
+ break;
+ }
+ if (c == 't') {
+ tok.next();
+ result = !nroff_mode;
+ }
+ else if (c == 'n') {
+ tok.next();
+ result = nroff_mode;
+ }
+ else if (c == 'v') {
+ tok.next();
+ result = 0;
+ }
+ else if (c == 'o') {
+ result = (topdiv->get_page_number() & 1);
+ tok.next();
+ }
+ else if (c == 'e') {
+ result = !(topdiv->get_page_number() & 1);
+ tok.next();
+ }
+ else if (c == 'd' || c == 'r') {
+ tok.next();
+ symbol nm = get_name(true /* required */);
+ if (nm.is_null()) {
+ skip_alternative();
+ return 0;
+ }
+ result = (c == 'd'
+ ? request_dictionary.lookup(nm) != 0
+ : register_dictionary.lookup(nm) != 0);
+ }
+ else if (c == 'm') {
+ tok.next();
+ symbol nm = get_long_name(true /* required */);
+ if (nm.is_null()) {
+ skip_alternative();
+ return 0;
+ }
+ result = (nm == default_symbol
+ || color_dictionary.lookup(nm) != 0);
+ }
+ else if (c == 'c') {
+ tok.next();
+ tok.skip();
+ charinfo *ci = tok.get_char(true /* required */);
+ if (ci == 0) {
+ skip_alternative();
+ return 0;
+ }
+ result = character_exists(ci, curenv);
+ tok.next();
+ }
+ else if (c == 'F') {
+ tok.next();
+ symbol nm = get_long_name(true /* required */);
+ if (nm.is_null()) {
+ skip_alternative();
+ return 0;
+ }
+ result = check_font(curenv->get_family()->nm, nm);
+ }
+ else if (c == 'S') {
+ tok.next();
+ symbol nm = get_long_name(true /* required */);
+ if (nm.is_null()) {
+ skip_alternative();
+ return 0;
+ }
+ result = check_style(nm);
+ }
+ else if (tok.is_space())
+ result = 0;
+ else if (tok.usable_as_delimiter()) {
+ token delim = tok;
+ int delim_level = input_stack::get_level();
+ environment env1(curenv);
+ environment env2(curenv);
+ environment *oldenv = curenv;
+ curenv = &env1;
+ suppress_push = 1;
+ for (int i = 0; i < 2; i++) {
+ for (;;) {
+ tok.next();
+ if (tok.is_newline() || tok.is_eof()) {
+ warning(WARN_DELIM, "missing closing delimiter in output"
+ " comparison operator (got %1)", tok.description());
+ tok.next();
+ curenv = oldenv;
+ return 0;
+ }
+ if (tok == delim
+ && (compatible_flag || input_stack::get_level() == delim_level))
+ break;
+ tok.process();
+ }
+ curenv = &env2;
+ }
+ node *n1 = env1.extract_output_line();
+ node *n2 = env2.extract_output_line();
+ result = same_node_list(n1, n2);
+ delete_node_list(n1);
+ delete_node_list(n2);
+ curenv = oldenv;
+ have_input = 0;
+ suppress_push = 0;
+ tok.next();
+ }
+ else {
+ units n;
+ if (!get_number(&n, 'u')) {
+ skip_alternative();
+ return 0;
+ }
+ else
+ result = n > 0;
+ }
+ if (invert)
+ result = !result;
+ if (result)
+ begin_alternative();
+ else
+ skip_alternative();
+ return result;
+}
+
+void if_else_request()
+{
+ if_else_stack.push(do_if_request());
+}
+
+void if_request()
+{
+ do_if_request();
+}
+
+void else_request()
+{
+ if (if_else_stack.is_empty()) {
+ warning(WARN_EL, "unbalanced 'el' request");
+ skip_alternative();
+ }
+ else {
+ if (if_else_stack.pop())
+ skip_alternative();
+ else
+ begin_alternative();
+ }
+}
+
+static int while_depth = 0;
+static int while_break_flag = 0;
+
+void while_request()
+{
+ macro mac;
+ int escaped = 0;
+ int level = 0;
+ mac.append(new token_node(tok));
+ for (;;) {
+ node *n = 0; // pacify compiler
+ int c = input_stack::get(&n);
+ if (c == EOF)
+ break;
+ if (c == 0) {
+ escaped = 0;
+ mac.append(n);
+ }
+ else if (escaped) {
+ if (c == '{')
+ level += 1;
+ else if (c == '}')
+ level -= 1;
+ escaped = 0;
+ mac.append(c);
+ }
+ else {
+ if (c == ESCAPE_LEFT_BRACE)
+ level += 1;
+ else if (c == ESCAPE_RIGHT_BRACE)
+ level -= 1;
+ else if (c == escape_char)
+ escaped = 1;
+ mac.append(c);
+ if (c == '\n' && level <= 0)
+ break;
+ }
+ }
+ if (level != 0)
+ error("unbalanced brace escape sequences");
+ else {
+ while_depth++;
+ input_stack::add_boundary();
+ for (;;) {
+ input_stack::push(new string_iterator(mac, "while loop"));
+ tok.next();
+ if (!do_if_request()) {
+ while (input_stack::get(0) != EOF)
+ ;
+ break;
+ }
+ process_input_stack();
+ if (while_break_flag || input_stack::is_return_boundary()) {
+ while_break_flag = 0;
+ break;
+ }
+ }
+ input_stack::remove_boundary();
+ while_depth--;
+ }
+ tok.next();
+}
+
+void while_break_request()
+{
+ if (!while_depth) {
+ error("no while loop");
+ skip_line();
+ }
+ else {
+ while_break_flag = 1;
+ while (input_stack::get(0) != EOF)
+ ;
+ tok.next();
+ }
+}
+
+void while_continue_request()
+{
+ if (!while_depth) {
+ error("no while loop");
+ skip_line();
+ }
+ else {
+ while (input_stack::get(0) != EOF)
+ ;
+ tok.next();
+ }
+}
+
+void do_source(bool quietly)
+{
+ symbol nm = get_long_name(true /* required */);
+ if (nm.is_null())
+ skip_line();
+ else {
+ while (!tok.is_newline() && !tok.is_eof())
+ tok.next();
+ errno = 0;
+ FILE *fp = include_search_path.open_file_cautious(nm.contents());
+ if (fp)
+ input_stack::push(new file_iterator(fp, nm.contents()));
+ else
+ // Suppress diagnostic only if we're operating quietly and it's an
+ // expected problem.
+ if (!(quietly && (ENOENT == errno)))
+ error("can't open '%1': %2", nm.contents(), strerror(errno));
+ tok.next();
+ }
+}
+
+// .so
+
+void source()
+{
+ do_source(false /* not quietly*/ );
+}
+
+// .soquiet: like .so, but silently ignore files that can't be opened
+// due to their nonexistence
+
+void source_quietly()
+{
+ do_source(true /* quietly */ );
+}
+
+// like .so but use popen()
+
+void pipe_source()
+{
+ if (!unsafe_flag) {
+ error("'pso' request is not allowed in safer mode");
+ skip_line();
+ }
+ else {
+#ifdef POPEN_MISSING
+ error("pipes not available on this system");
+ skip_line();
+#else /* not POPEN_MISSING */
+ if (tok.is_newline() || tok.is_eof())
+ error("missing command");
+ else {
+ int c;
+ while ((c = get_copy(0)) == ' ' || c == '\t')
+ ;
+ int buf_size = 24;
+ char *buf = new char[buf_size];
+ int buf_used = 0;
+ for (; c != '\n' && c != EOF; c = get_copy(0)) {
+ const char *s = asciify(c);
+ int slen = strlen(s);
+ if (buf_used + slen + 1> buf_size) {
+ char *old_buf = buf;
+ int old_buf_size = buf_size;
+ buf_size *= 2;
+ buf = new char[buf_size];
+ memcpy(buf, old_buf, old_buf_size);
+ delete[] old_buf;
+ }
+ strcpy(buf + buf_used, s);
+ buf_used += slen;
+ }
+ buf[buf_used] = '\0';
+ errno = 0;
+ FILE *fp = popen(buf, POPEN_RT);
+ if (fp)
+ input_stack::push(new file_iterator(fp, symbol(buf).contents(), 1));
+ else
+ error("can't open pipe to process '%1': %2", buf, strerror(errno));
+ delete[] buf;
+ }
+ tok.next();
+#endif /* not POPEN_MISSING */
+ }
+}
+
+// .psbb
+//
+// Extract bounding box limits from PostScript file, and assign
+// them to the following four gtroff registers:--
+//
+static int llx_reg_contents = 0;
+static int lly_reg_contents = 0;
+static int urx_reg_contents = 0;
+static int ury_reg_contents = 0;
+
+// Manifest constants to specify the status of bounding box range
+// acquisition; (note that PSBB_RANGE_IS_BAD is also suitable for
+// assignment as a default ordinate property value).
+//
+#define PSBB_RANGE_IS_BAD 0
+#define PSBB_RANGE_IS_SET 1
+#define PSBB_RANGE_AT_END 2
+
+// Maximum input line length, for DSC conformance, and options to
+// control how it will be enforced; caller should select either of
+// DSC_LINE_MAX_IGNORED, to allow partial line collection spread
+// across multiple calls, or DSC_LINE_MAX_ENFORCE, to truncate
+// excess length lines at the DSC limit.
+//
+// Note that DSC_LINE_MAX_CHECKED is reserved for internal use by
+// ps_locator::get_line(), and should not be specified in any call;
+// also, handling of DSC_LINE_MAX_IGNORED, as a get_line() option,
+// is currently unimplemented.
+//
+#define DSC_LINE_MAX 255
+#define DSC_LINE_MAX_IGNORED -1
+#define DSC_LINE_MAX_ENFORCE 0
+#define DSC_LINE_MAX_CHECKED 1
+
+// Input characters to be considered as white space, when reading
+// PostScript file comments.
+//
+cset white_space("\n\r \t");
+
+// Class psbb_locator
+//
+// This locally declared and implemented class provides the methods
+// to be used for retrieval of bounding box properties from a specified
+// PostScript or PDF file.
+//
+class psbb_locator
+{
+ public:
+ // Only the class constructor is exposed publicly; instantiation of
+ // a class object will retrieve the requisite bounding box properties
+ // from the specified file, and assign them to gtroff registers.
+ //
+ psbb_locator(const char *);
+
+ private:
+ FILE *fp;
+ const char *filename;
+ char buf[2 + DSC_LINE_MAX];
+ int llx, lly, urx, ury;
+
+ // CRLF handling hook, for get_line() function.
+ //
+ int lastc;
+
+ // Private method functions facilitate implementation of the
+ // class constructor; none are used in any other context.
+ //
+ int get_line(int);
+ inline bool get_header_comment(void);
+ inline const char *context_args(const char *);
+ inline const char *context_args(const char *, const char *);
+ inline const char *bounding_box_args(void);
+ int parse_bounding_box(const char *);
+ inline void assign_registers(void);
+ inline int skip_to_trailer(void);
+};
+
+// psbb_locator class constructor.
+//
+psbb_locator::psbb_locator(const char *fname):
+filename(fname), llx(0), lly(0), urx(0), ury(0), lastc(EOF)
+{
+ // PS files might contain non-printable characters, such as ^Z
+ // and CRs not followed by an LF, so open them in binary mode.
+ //
+ fp = include_search_path.open_file_cautious(filename, 0, FOPEN_RB);
+ if (fp) {
+ // After successfully opening the file, acquire the first
+ // line, whence we may determine the file format...
+ //
+ if (get_line(DSC_LINE_MAX_ENFORCE) == 0)
+ //
+ // ...except in the case of an empty file, which we are
+ // unable to process further.
+ //
+ error("'%1' is empty", filename);
+
+# if 0
+ else if (context_args("%PDF-")) {
+ // TODO: PDF files specify a /MediaBox, as the equivalent
+ // of %%BoundingBox; we must implement a handler for this.
+ }
+# endif
+
+ else if (context_args("%!PS-Adobe-")) {
+ //
+ // PostScript files -- strictly, we expect EPS -- should
+ // specify a %%BoundingBox comment; locate it, initially
+ // expecting to find it in the comments header...
+ //
+ const char *context = NULL;
+ while ((context == NULL) && get_header_comment()) {
+ if ((context = bounding_box_args()) != NULL) {
+
+ // When the "%%BoundingBox" comment is found, it may simply
+ // specify the bounding box property values, or it may defer
+ // assignment to a similar trailer comment...
+ //
+ int status = parse_bounding_box(context);
+ if (status == PSBB_RANGE_AT_END) {
+ //
+ // ...in which case we must locate the trailer, and search
+ // for the appropriate specification within it.
+ //
+ if (skip_to_trailer() > 0) {
+ while ((context = bounding_box_args()) == NULL
+ && get_line(DSC_LINE_MAX_ENFORCE) > 0)
+ ;
+ if (context != NULL) {
+ //
+ // When we find a bounding box specification here...
+ //
+ if ((status = parse_bounding_box(context)) == PSBB_RANGE_AT_END)
+ //
+ // ...we must ensure it is not a further attempt to defer
+ // assignment to a trailer, (which we are already parsing).
+ //
+ error("'(atend)' is not allowed in trailer of '%1'",
+ filename);
+ }
+ }
+ else
+ // The trailer could not be found, so there is no context in
+ // which a trailing %%BoundingBox comment might be located.
+ //
+ context = NULL;
+ }
+ if (status == PSBB_RANGE_IS_BAD) {
+ //
+ // This arises when we found a %%BoundingBox comment, but
+ // we were unable to extract a valid set of range values from
+ // it; all we can do is diagnose this.
+ //
+ error("the arguments to the %%%%BoundingBox comment in '%1' are bad",
+ filename);
+ }
+ }
+ }
+ if (context == NULL)
+ //
+ // Conversely, this arises when no value specifying %%BoundingBox
+ // comment has been found, in any appropriate location...
+ //
+ error("%%%%BoundingBox comment not found in '%1'", filename);
+ }
+ else
+ // ...while this indicates that there was no appropriate file format
+ // identifier, on the first line of the input file.
+ //
+ error("'%1' does not conform to the Document Structuring Conventions",
+ filename);
+
+ // Regardless of success or failure of bounding box property acquisition,
+ // we did successfully open an input file, so we must now close it...
+ //
+ fclose(fp);
+ }
+ else
+ // ...but in this case, we did not successfully open any input file.
+ //
+ error("can't open '%1': %2", filename, strerror(errno));
+
+ // Irrespective of whether or not we were able to successfully acquire the
+ // bounding box properties, we ALWAYS update the associated gtroff registers.
+ //
+ assign_registers();
+}
+
+// psbb_locator::parse_bounding_box()
+//
+// Parse the argument to a %%BoundingBox comment, returning:
+// PSBB_RANGE_IS_SET if it contains four numbers,
+// PSBB_RANGE_AT_END if it contains "(atend)", or
+// PSBB_RANGE_IS_BAD otherwise.
+//
+int psbb_locator::parse_bounding_box(const char *context)
+{
+ // The Document Structuring Conventions say that the numbers
+ // should be integers.
+ //
+ int status = PSBB_RANGE_IS_SET;
+ if (sscanf(context, "%d %d %d %d", &llx, &lly, &urx, &ury) != 4) {
+ //
+ // Unfortunately some broken applications get this wrong;
+ // try to parse them as doubles instead...
+ //
+ double x1, x2, x3, x4;
+ if (sscanf(context, "%lf %lf %lf %lf", &x1, &x2, &x3, &x4) == 4) {
+ llx = (int)x1;
+ lly = (int)x2;
+ urx = (int)x3;
+ ury = (int)x4;
+ }
+ else {
+ // ...but if we can't parse four numbers, skip over any
+ // initial white space...
+ //
+ while (*context == '\x20' || *context == '\t')
+ context++;
+
+ // ...before checking for "(atend)", and setting the
+ // appropriate exit status accordingly.
+ //
+ status = (context_args("(atend)", context) == NULL)
+ ? llx = lly = urx = ury = PSBB_RANGE_IS_BAD
+ : PSBB_RANGE_AT_END;
+ }
+ }
+ return status;
+}
+
+// ps_locator::get_line()
+//
+// Collect an input record from a PostScript or PDF file.
+//
+// Inputs:
+// buf pointer to caller's input buffer.
+// fp FILE stream pointer, whence input is read.
+// filename name of input file, (for diagnostic use only).
+// dscopt DSC_LINE_MAX_ENFORCE or DSC_LINE_MAX_IGNORED.
+//
+// Returns the number of input characters stored into caller's
+// buffer, or zero at end of input stream.
+//
+// FIXME: Currently, get_line() always scans an entire line of
+// input, but returns only as much as will fit in caller's buffer;
+// the return value is always a positive integer, or zero, with no
+// way of indicating to caller, that there was more data than the
+// buffer could accommodate. A future enhancement could mitigate
+// this, returning a negative value in the event of truncation, or
+// even allowing for piecewise retrieval of excessively long lines
+// in successive reads; (this may be necessary to properly support
+// DSC_LINE_MAX_IGNORED, which is currently unimplemented).
+//
+int psbb_locator::get_line(int dscopt)
+{
+ int c, count = 0;
+ do {
+ // Collect input characters into caller's buffer, until we
+ // encounter a line terminator, or end of file...
+ //
+ while (((c = getc(fp)) != '\n') && (c != '\r') && (c != EOF)) {
+ if ((((lastc = c) < 0x1b) && !white_space(c)) || (c == 0x7f))
+ //
+ // ...rejecting any which may be designated as invalid.
+ //
+ error("invalid input character code %1 in '%2'", int(c), filename);
+
+ // On reading a valid input character, and when there is
+ // room in caller's buffer...
+ //
+ else if (count < DSC_LINE_MAX)
+ //
+ // ...store it.
+ //
+ buf[count++] = c;
+
+ // We have a valid input character, but it will not fit
+ // into caller's buffer; if enforcing DSC conformity...
+ //
+ else if (dscopt == DSC_LINE_MAX_ENFORCE) {
+ //
+ // ...diagnose and truncate.
+ //
+ dscopt = DSC_LINE_MAX_CHECKED;
+ error("PostScript file '%1' is non-conforming "
+ "because length of line exceeds 255", filename);
+ }
+ }
+ // Reading LF may be a special case: when it immediately
+ // follows a CR which terminated the preceding input line,
+ // we deem it to complete a CRLF terminator for the already
+ // collected preceding line; discard it, and restart input
+ // collection for the current line.
+ //
+ } while ((lastc == '\r') && ((lastc = c) == '\n'));
+
+ // For each collected input line, record its actual terminator,
+ // substitute our preferred LF terminator...
+ //
+ if (((lastc = c) != EOF) || (count > 0))
+ buf[count++] = '\n';
+
+ // ...and append the required C-string (NUL) terminator, before
+ // returning the actual count of input characters stored.
+ //
+ buf[count] = '\0';
+ return count;
+}
+
+// psbb_locator::context_args()
+//
+// Inputs:
+// tag literal text to be matched at start of input line
+//
+// Returns a pointer to the trailing substring of the current
+// input line, following an initial substring matching the "tag"
+// argument, or NULL if "tag" is not matched.
+//
+inline const char *psbb_locator::context_args(const char *tag)
+{
+ return context_args(tag, buf);
+}
+
+// psbb_locator::context_args()
+//
+// Overloaded variant of the preceding function, operating on
+// an alternative input buffer, (which may represent a terminal
+// substring of the psbb_locator's primary input line buffer).
+//
+// Inputs:
+// tag literal text to be matched at start of buffer
+// p pointer to text to be checked for "tag" match
+//
+// Returns a pointer to the trailing substring of the specified
+// text buffer, following an initial substring matching the "tag"
+// argument, or NULL if "tag" is not matched.
+//
+inline const char *psbb_locator::context_args(const char *tag, const char *p)
+{
+ size_t len = strlen(tag);
+ return (strncmp(tag, p, len) == 0) ? p + len : NULL;
+}
+
+// psbb_locator::bounding_box_args()
+//
+// Returns a pointer to the arguments string, within the current
+// input line, when this represents a PostScript "%%BoundingBox:"
+// comment, or NULL otherwise.
+//
+inline const char *psbb_locator::bounding_box_args(void)
+{
+ return context_args("%%BoundingBox:");
+}
+
+// psbb_locator::assign_registers()
+//
+// Copies the bounding box properties established within the
+// class object, to the associated gtroff registers.
+//
+inline void psbb_locator::assign_registers(void)
+{
+ llx_reg_contents = llx;
+ lly_reg_contents = lly;
+ urx_reg_contents = urx;
+ ury_reg_contents = ury;
+}
+
+// psbb_locator::get_header_comment()
+//
+// Fetch a line of PostScript input; return true if it complies with
+// the formatting requirements for header comments, and it is not an
+// "%%EndComments" line; otherwise return false.
+//
+inline bool psbb_locator::get_header_comment(void)
+{
+ return
+ // The first necessary requirement, for returning true,
+ // is that the input line is not empty, (i.e. not EOF).
+ //
+ get_line(DSC_LINE_MAX_ENFORCE) != 0
+
+ // In header comments, '%X' ('X' any printable character
+ // except whitespace) is also acceptable.
+ //
+ && (buf[0] == '%') && !white_space(buf[1])
+
+ // Finally, the input line must not say "%%EndComments".
+ //
+ && context_args("%%EndComments") == NULL;
+}
+
+// psbb_locator::skip_to_trailer()
+//
+// Reposition the PostScript input stream, such that the next get_line()
+// will retrieve the first line, if any, following a "%%Trailer" comment;
+// returns a positive integer value if the "%%Trailer" comment is found,
+// or zero if it is not.
+//
+inline int psbb_locator::skip_to_trailer(void)
+{
+ // Begin by considering a chunk of the input file starting 512 bytes
+ // before its end, and search it for a "%%Trailer" comment; if none is
+ // found, incrementally double the chunk size while it remains within
+ // a 32768L byte range, and search again...
+ //
+ for (ssize_t offset = 512L; offset > 0L; offset <<= 1) {
+ int status, failed;
+ if ((offset > 32768L) || ((failed = fseek(fp, -offset, SEEK_END)) != 0))
+ //
+ // ...ultimately resetting the offset to zero, and simply seeking
+ // to the start of the file, to terminate the cycle and do a "last
+ // ditch" search of the entire file, if any backward seek fails, or
+ // if we reach the arbitrary 32768L byte range limit.
+ //
+ failed = fseek(fp, offset = 0L, SEEK_SET);
+
+ // Following each successful seek...
+ //
+ if (!failed) {
+ //
+ // ...perform a search by reading lines from the input stream...
+ //
+ do { status = get_line(DSC_LINE_MAX_ENFORCE);
+ //
+ // ...until we either exhaust the available stream data, or
+ // we have located a "%%Trailer" comment line.
+ //
+ } while ((status != 0) && (context_args("%%Trailer") == NULL));
+ if (status > 0)
+ //
+ // We found the "%%Trailer" comment, so we may immediately
+ // return, with the stream positioned appropriately...
+ //
+ return status;
+ }
+ }
+ // ...otherwise, we report that no "%%Trailer" comment was found.
+ //
+ return 0;
+}
+
+// ps_bbox_request()
+//
+// Handle the .psbb request.
+//
+void ps_bbox_request()
+{
+ // Parse input line, to extract file name.
+ //
+ symbol nm = get_long_name(true /* required */);
+ if (nm.is_null())
+ //
+ // No file name specified: ignore the entire request.
+ //
+ skip_line();
+ else {
+ // File name acquired: swallow the rest of the line.
+ //
+ while (!tok.is_newline() && !tok.is_eof())
+ tok.next();
+ errno = 0;
+
+ // Update {llx,lly,urx,ury}_reg_contents:
+ // declaring this class instance achieves this, as an
+ // intentional side effect of object construction.
+ //
+ psbb_locator do_ps_file(nm.contents());
+
+ // All done for .psbb; move on, to continue
+ // input stream processing.
+ //
+ tok.next();
+ }
+}
+
+const char *asciify(int c)
+{
+ static char buf[3];
+ buf[0] = escape_char == '\0' ? '\\' : escape_char;
+ buf[1] = buf[2] = '\0';
+ switch (c) {
+ case ESCAPE_QUESTION:
+ buf[1] = '?';
+ break;
+ case ESCAPE_AMPERSAND:
+ buf[1] = '&';
+ break;
+ case ESCAPE_RIGHT_PARENTHESIS:
+ buf[1] = ')';
+ break;
+ case ESCAPE_UNDERSCORE:
+ buf[1] = '_';
+ break;
+ case ESCAPE_BAR:
+ buf[1] = '|';
+ break;
+ case ESCAPE_CIRCUMFLEX:
+ buf[1] = '^';
+ break;
+ case ESCAPE_LEFT_BRACE:
+ buf[1] = '{';
+ break;
+ case ESCAPE_RIGHT_BRACE:
+ buf[1] = '}';
+ break;
+ case ESCAPE_LEFT_QUOTE:
+ buf[1] = '`';
+ break;
+ case ESCAPE_RIGHT_QUOTE:
+ buf[1] = '\'';
+ break;
+ case ESCAPE_HYPHEN:
+ buf[1] = '-';
+ break;
+ case ESCAPE_BANG:
+ buf[1] = '!';
+ break;
+ case ESCAPE_c:
+ buf[1] = 'c';
+ break;
+ case ESCAPE_e:
+ buf[1] = 'e';
+ break;
+ case ESCAPE_E:
+ buf[1] = 'E';
+ break;
+ case ESCAPE_PERCENT:
+ buf[1] = '%';
+ break;
+ case ESCAPE_SPACE:
+ buf[1] = ' ';
+ break;
+ case ESCAPE_TILDE:
+ buf[1] = '~';
+ break;
+ case ESCAPE_COLON:
+ buf[1] = ':';
+ break;
+ case PUSH_GROFF_MODE:
+ case PUSH_COMP_MODE:
+ case POP_GROFFCOMP_MODE:
+ buf[0] = '\0';
+ break;
+ default:
+ if (is_invalid_input_char(c))
+ buf[0] = '\0';
+ else
+ buf[0] = c;
+ break;
+ }
+ return buf;
+}
+
+const char *input_char_description(int c)
+{
+ switch (c) {
+ case '\n':
+ return "a newline character";
+ case '\b':
+ return "a backspace character";
+ case '\001':
+ return "a leader character";
+ case '\t':
+ return "a tab character";
+ case ' ':
+ return "a space character";
+ case '\0':
+ return "a node";
+ }
+ size_t bufsz = sizeof "magic character code " + INT_DIGITS + 1;
+ // repeat expression; no VLAs in ISO C++
+ static char buf[sizeof "magic character code " + INT_DIGITS + 1];
+ (void) memset(buf, 0, bufsz);
+ if (is_invalid_input_char(c)) {
+ const char *s = asciify(c);
+ if (*s) {
+ buf[0] = '\'';
+ strcpy(buf + 1, s);
+ strcat(buf, "'");
+ return buf;
+ }
+ sprintf(buf, "magic character code %d", c);
+ return buf;
+ }
+ if (csprint(c)) {
+ buf[0] = '\'';
+ buf[1] = c;
+ buf[2] = '\'';
+ return buf;
+ }
+ sprintf(buf, "character code %d", c);
+ return buf;
+}
+
+void tag()
+{
+ if (!tok.is_newline() && !tok.is_eof()) {
+ string s;
+ int c;
+ for (;;) {
+ c = get_copy(0);
+ if (c == '"') {
+ c = get_copy(0);
+ break;
+ }
+ if (c != ' ' && c != '\t')
+ break;
+ }
+ s = "x X ";
+ for (; c != '\n' && c != EOF; c = get_copy(0))
+ s += (char)c;
+ s += '\n';
+ curenv->add_node(new tag_node(s, 0));
+ }
+ tok.next();
+}
+
+void taga()
+{
+ if (!tok.is_newline() && !tok.is_eof()) {
+ string s;
+ int c;
+ for (;;) {
+ c = get_copy(0);
+ if (c == '"') {
+ c = get_copy(0);
+ break;
+ }
+ if (c != ' ' && c != '\t')
+ break;
+ }
+ s = "x X ";
+ for (; c != '\n' && c != EOF; c = get_copy(0))
+ s += (char)c;
+ s += '\n';
+ curenv->add_node(new tag_node(s, 1));
+ }
+ tok.next();
+}
+
+// .tm, .tm1, and .tmc
+
+void do_terminal(int newline, int string_like)
+{
+ if (!tok.is_newline() && !tok.is_eof()) {
+ int c;
+ for (;;) {
+ c = get_copy(0);
+ if (string_like && c == '"') {
+ c = get_copy(0);
+ break;
+ }
+ if (c != ' ' && c != '\t')
+ break;
+ }
+ for (; c != '\n' && c != EOF; c = get_copy(0))
+ fputs(asciify(c), stderr);
+ }
+ if (newline)
+ fputc('\n', stderr);
+ fflush(stderr);
+ tok.next();
+}
+
+void terminal()
+{
+ do_terminal(1, 0);
+}
+
+void terminal1()
+{
+ do_terminal(1, 1);
+}
+
+void terminal_continue()
+{
+ do_terminal(0, 1);
+}
+
+dictionary stream_dictionary(20);
+
+void do_open(int append)
+{
+ symbol stream = get_name(true /* required */);
+ if (!stream.is_null()) {
+ symbol filename = get_long_name(true /* required */);
+ if (!filename.is_null()) {
+ errno = 0;
+ FILE *fp = fopen(filename.contents(), append ? "a" : "w");
+ if (!fp) {
+ error("can't open '%1' for %2: %3",
+ filename.contents(),
+ append ? "appending" : "writing",
+ strerror(errno));
+ fp = (FILE *)stream_dictionary.remove(stream);
+ }
+ else
+ fp = (FILE *)stream_dictionary.lookup(stream, fp);
+ if (fp)
+ fclose(fp);
+ }
+ }
+ skip_line();
+}
+
+void open_request()
+{
+ if (!unsafe_flag) {
+ error("'open' request is not allowed in safer mode");
+ skip_line();
+ }
+ else
+ do_open(0);
+}
+
+void opena_request()
+{
+ if (!unsafe_flag) {
+ error("'opena' request is not allowed in safer mode");
+ skip_line();
+ }
+ else
+ do_open(1);
+}
+
+void close_request()
+{
+ symbol stream = get_name(true /* required */);
+ if (!stream.is_null()) {
+ FILE *fp = (FILE *)stream_dictionary.remove(stream);
+ if (!fp)
+ error("no stream named '%1'", stream.contents());
+ else
+ fclose(fp);
+ }
+ skip_line();
+}
+
+// .write and .writec
+
+void do_write_request(int newline)
+{
+ symbol stream = get_name(true /* required */);
+ if (stream.is_null()) {
+ skip_line();
+ return;
+ }
+ FILE *fp = (FILE *)stream_dictionary.lookup(stream);
+ if (!fp) {
+ error("no stream named '%1'", stream.contents());
+ skip_line();
+ return;
+ }
+ int c;
+ while ((c = get_copy(0)) == ' ')
+ ;
+ if (c == '"')
+ c = get_copy(0);
+ for (; c != '\n' && c != EOF; c = get_copy(0))
+ fputs(asciify(c), fp);
+ if (newline)
+ fputc('\n', fp);
+ fflush(fp);
+ tok.next();
+}
+
+void write_request()
+{
+ do_write_request(1);
+}
+
+void write_request_continue()
+{
+ do_write_request(0);
+}
+
+void write_macro_request()
+{
+ symbol stream = get_name(true /* required */);
+ if (stream.is_null()) {
+ skip_line();
+ return;
+ }
+ FILE *fp = (FILE *)stream_dictionary.lookup(stream);
+ if (!fp) {
+ error("no stream named '%1'", stream.contents());
+ skip_line();
+ return;
+ }
+ symbol s = get_name(true /* required */);
+ if (s.is_null()) {
+ skip_line();
+ return;
+ }
+ request_or_macro *p = lookup_request(s);
+ macro *m = p->to_macro();
+ if (!m)
+ error("cannot write request");
+ else {
+ string_iterator iter(*m);
+ for (;;) {
+ int c = iter.get(0);
+ if (c == EOF)
+ break;
+ fputs(asciify(c), fp);
+ }
+ fflush(fp);
+ }
+ skip_line();
+}
+
+void warnscale_request()
+{
+ if (has_arg()) {
+ char c = tok.ch();
+ if (c == 'u')
+ warn_scale = 1.0;
+ else if (c == 'i')
+ warn_scale = (double)units_per_inch;
+ else if (c == 'c')
+ warn_scale = (double)units_per_inch / 2.54;
+ else if (c == 'p')
+ warn_scale = (double)units_per_inch / 72.0;
+ else if (c == 'P')
+ warn_scale = (double)units_per_inch / 6.0;
+ else {
+ warning(WARN_SCALE,
+ "scaling unit '%1' invalid; using 'i' instead", c);
+ c = 'i';
+ }
+ warn_scaling_indicator = c;
+ }
+ skip_line();
+}
+
+void spreadwarn_request()
+{
+ hunits n;
+ if (has_arg() && get_hunits(&n, 'm')) {
+ if (n < 0)
+ n = 0;
+ hunits em = curenv->get_size();
+ spread_limit = (double)n.to_units()
+ / (em.is_zero() ? hresolution : em.to_units());
+ }
+ else
+ spread_limit = -spread_limit - 1; // no arg toggles on/off without
+ // changing value; we mirror at
+ // -0.5 to make zero a valid value
+ skip_line();
+}
+
+static void init_charset_table()
+{
+ char buf[16];
+ strcpy(buf, "char");
+ for (int i = 0; i < 256; i++) {
+ strcpy(buf + 4, i_to_a(i));
+ charset_table[i] = get_charinfo(symbol(buf));
+ charset_table[i]->set_ascii_code(i);
+ if (csalpha(i))
+ charset_table[i]->set_hyphenation_code(cmlower(i));
+ }
+ charset_table['.']->set_flags(charinfo::ENDS_SENTENCE);
+ charset_table['?']->set_flags(charinfo::ENDS_SENTENCE);
+ charset_table['!']->set_flags(charinfo::ENDS_SENTENCE);
+ charset_table['-']->set_flags(charinfo::BREAK_AFTER);
+ charset_table['"']->set_flags(charinfo::TRANSPARENT);
+ charset_table['\'']->set_flags(charinfo::TRANSPARENT);
+ charset_table[')']->set_flags(charinfo::TRANSPARENT);
+ charset_table[']']->set_flags(charinfo::TRANSPARENT);
+ charset_table['*']->set_flags(charinfo::TRANSPARENT);
+ get_charinfo(symbol("dg"))->set_flags(charinfo::TRANSPARENT);
+ get_charinfo(symbol("dd"))->set_flags(charinfo::TRANSPARENT);
+ get_charinfo(symbol("rq"))->set_flags(charinfo::TRANSPARENT);
+ get_charinfo(symbol("cq"))->set_flags(charinfo::TRANSPARENT);
+ get_charinfo(symbol("em"))->set_flags(charinfo::BREAK_AFTER);
+ get_charinfo(symbol("hy"))->set_flags(charinfo::BREAK_AFTER);
+ get_charinfo(symbol("ul"))->set_flags(charinfo::OVERLAPS_HORIZONTALLY);
+ get_charinfo(symbol("rn"))->set_flags(charinfo::OVERLAPS_HORIZONTALLY);
+ get_charinfo(symbol("radicalex"))->set_flags(charinfo::OVERLAPS_HORIZONTALLY);
+ get_charinfo(symbol("sqrtex"))->set_flags(charinfo::OVERLAPS_HORIZONTALLY);
+ get_charinfo(symbol("ru"))->set_flags(charinfo::OVERLAPS_HORIZONTALLY);
+ get_charinfo(symbol("br"))->set_flags(charinfo::OVERLAPS_VERTICALLY);
+ page_character = charset_table['%'];
+}
+
+static void init_hpf_code_table()
+{
+ for (int i = 0; i < 256; i++)
+ hpf_code_table[i] = cmlower(i);
+}
+
+static void do_translate(int translate_transparent, int translate_input)
+{
+ tok.skip();
+ while (!tok.is_newline() && !tok.is_eof()) {
+ if (tok.is_space()) {
+ // This is a really bizarre troff feature.
+ tok.next();
+ translate_space_to_dummy = tok.is_dummy();
+ if (tok.is_newline() || tok.is_eof())
+ break;
+ error("cannot translate space character; ignoring");
+ tok.next();
+ continue;
+ }
+ charinfo *ci1 = tok.get_char(true /* required */);
+ if (ci1 == 0)
+ break;
+ tok.next();
+ if (tok.is_newline() || tok.is_eof()) {
+ ci1->set_special_translation(charinfo::TRANSLATE_SPACE,
+ translate_transparent);
+ break;
+ }
+ if (tok.is_space())
+ ci1->set_special_translation(charinfo::TRANSLATE_SPACE,
+ translate_transparent);
+ else if (tok.is_stretchable_space())
+ ci1->set_special_translation(charinfo::TRANSLATE_STRETCHABLE_SPACE,
+ translate_transparent);
+ else if (tok.is_dummy())
+ ci1->set_special_translation(charinfo::TRANSLATE_DUMMY,
+ translate_transparent);
+ else if (tok.is_hyphen_indicator())
+ ci1->set_special_translation(charinfo::TRANSLATE_HYPHEN_INDICATOR,
+ translate_transparent);
+ else {
+ charinfo *ci2 = tok.get_char(true /* required */);
+ if (ci2 == 0)
+ break;
+ if (ci1 == ci2)
+ ci1->set_translation(0, translate_transparent, translate_input);
+ else
+ ci1->set_translation(ci2, translate_transparent, translate_input);
+ }
+ tok.next();
+ }
+ skip_line();
+}
+
+void translate()
+{
+ do_translate(1, 0);
+}
+
+void translate_no_transparent()
+{
+ do_translate(0, 0);
+}
+
+void translate_input()
+{
+ do_translate(1, 1);
+}
+
+void char_flags()
+{
+ int flags;
+ if (get_integer(&flags))
+ while (has_arg()) {
+ charinfo *ci = tok.get_char(true /* required */);
+ if (ci) {
+ charinfo *tem = ci->get_translation();
+ if (tem)
+ ci = tem;
+ ci->set_flags(flags);
+ }
+ tok.next();
+ }
+ skip_line();
+}
+
+void hyphenation_code()
+{
+ tok.skip();
+ while (!tok.is_newline() && !tok.is_eof()) {
+ charinfo *ci = tok.get_char(true /* required */);
+ if (ci == 0)
+ break;
+ tok.next();
+ tok.skip();
+ unsigned char c = tok.ch();
+ if (c == 0) {
+ error("hyphenation code must be ordinary character");
+ break;
+ }
+ if (csdigit(c)) {
+ error("hyphenation code cannot be digit");
+ break;
+ }
+ ci->set_hyphenation_code(c);
+ if (ci->get_translation()
+ && ci->get_translation()->get_translation_input())
+ ci->get_translation()->set_hyphenation_code(c);
+ tok.next();
+ tok.skip();
+ }
+ skip_line();
+}
+
+void hyphenation_patterns_file_code()
+{
+ tok.skip();
+ while (!tok.is_newline() && !tok.is_eof()) {
+ int n1, n2;
+ if (get_integer(&n1) && (0 <= n1 && n1 <= 255)) {
+ if (!has_arg()) {
+ error("missing output hyphenation code");
+ break;
+ }
+ if (get_integer(&n2) && (0 <= n2 && n2 <= 255)) {
+ hpf_code_table[n1] = n2;
+ tok.skip();
+ }
+ else {
+ error("output hyphenation code must be integer in the range 0..255");
+ break;
+ }
+ }
+ else {
+ error("input hyphenation code must be integer in the range 0..255");
+ break;
+ }
+ }
+ skip_line();
+}
+
+dictionary char_class_dictionary(501);
+
+void define_class()
+{
+ tok.skip();
+ symbol nm = get_name(true /* required */);
+ if (nm.is_null()) {
+ skip_line();
+ return;
+ }
+ charinfo *ci = get_charinfo(nm);
+ charinfo *child1 = 0, *child2 = 0;
+ while (!tok.is_newline() && !tok.is_eof()) {
+ tok.skip();
+ if (child1 != 0 && tok.ch() == '-') {
+ tok.next();
+ child2 = tok.get_char(true /* required */);
+ if (!child2) {
+ warning(WARN_MISSING,
+ "missing end of character range in class '%1'",
+ nm.contents());
+ skip_line();
+ return;
+ }
+ if (child1->is_class() || child2->is_class()) {
+ warning(WARN_SYNTAX,
+ "a nested character class is not allowed in a range"
+ " definition");
+ skip_line();
+ return;
+ }
+ int u1 = child1->get_unicode_code();
+ int u2 = child2->get_unicode_code();
+ if (u1 < 0) {
+ warning(WARN_SYNTAX,
+ "invalid start value in character range");
+ skip_line();
+ return;
+ }
+ if (u2 < 0) {
+ warning(WARN_SYNTAX,
+ "invalid end value in character range");
+ skip_line();
+ return;
+ }
+ ci->add_to_class(u1, u2);
+ child1 = child2 = 0;
+ }
+ else if (child1 != 0) {
+ if (child1->is_class()) {
+ if (ci == child1) {
+ warning(WARN_SYNTAX, "invalid cyclic class nesting");
+ skip_line();
+ return;
+ }
+ ci->add_to_class(child1);
+ }
+ else {
+ int u1 = child1->get_unicode_code();
+ if (u1 < 0) {
+ warning(WARN_SYNTAX,
+ "invalid character value in class '%1'",
+ nm.contents());
+ skip_line();
+ return;
+ }
+ ci->add_to_class(u1);
+ }
+ child1 = 0;
+ }
+ child1 = tok.get_char(true /* required */);
+ tok.next();
+ if (!child1) {
+ if (!tok.is_newline())
+ skip_line();
+ break;
+ }
+ }
+ if (child1 != 0) {
+ if (child1->is_class()) {
+ if (ci == child1) {
+ warning(WARN_SYNTAX, "invalid cyclic class nesting");
+ skip_line();
+ return;
+ }
+ ci->add_to_class(child1);
+ }
+ else {
+ int u1 = child1->get_unicode_code();
+ if (u1 < 0) {
+ warning(WARN_SYNTAX,
+ "invalid character value in class '%1'",
+ nm.contents());
+ skip_line();
+ return;
+ }
+ ci->add_to_class(u1);
+ }
+ child1 = 0;
+ }
+ if (!ci->is_class()) {
+ warning(WARN_SYNTAX,
+ "empty class definition for '%1'",
+ nm.contents());
+ skip_line();
+ return;
+ }
+ (void)char_class_dictionary.lookup(nm, ci);
+ skip_line();
+}
+
+charinfo *token::get_char(bool required)
+{
+ if (type == TOKEN_CHAR)
+ return charset_table[c];
+ if (type == TOKEN_SPECIAL)
+ return get_charinfo(nm);
+ if (type == TOKEN_NUMBERED_CHAR)
+ return get_charinfo_by_number(val);
+ if (type == TOKEN_ESCAPE) {
+ if (escape_char != 0)
+ return charset_table[escape_char];
+ else {
+ // XXX: Is this possible? token::add_to_zero_width_node_list()
+ // and token::process() don't add this token type if the escape
+ // character is null. If not, this should be an assert(). Also
+ // see escape_off().
+ error("escaped 'e' used while escape sequences disabled");
+ return 0;
+ }
+ }
+ if (required) {
+ if (type == TOKEN_EOF || type == TOKEN_NEWLINE)
+ warning(WARN_MISSING, "missing ordinary or special character");
+ else
+ error("expected ordinary or special character, got %1",
+ description());
+ }
+ return 0;
+}
+
+charinfo *get_optional_char()
+{
+ while (tok.is_space())
+ tok.next();
+ charinfo *ci = tok.get_char();
+ if (!ci)
+ check_missing_character();
+ else
+ tok.next();
+ return ci;
+}
+
+void check_missing_character()
+{
+ if (!tok.is_newline() && !tok.is_eof() && !tok.is_right_brace()
+ && !tok.is_tab())
+ error("expected ordinary or special character, got %1; treated as"
+ " missing", tok.description());
+}
+
+// this is for \Z
+
+int token::add_to_zero_width_node_list(node **pp)
+{
+ hunits w;
+ int s;
+ node *n = 0;
+ switch (type) {
+ case TOKEN_CHAR:
+ *pp = (*pp)->add_char(charset_table[c], curenv, &w, &s);
+ break;
+ case TOKEN_DUMMY:
+ n = new dummy_node;
+ break;
+ case TOKEN_ESCAPE:
+ if (escape_char != 0)
+ *pp = (*pp)->add_char(charset_table[escape_char], curenv, &w, &s);
+ break;
+ case TOKEN_HYPHEN_INDICATOR:
+ *pp = (*pp)->add_discretionary_hyphen();
+ break;
+ case TOKEN_ITALIC_CORRECTION:
+ *pp = (*pp)->add_italic_correction(&w);
+ break;
+ case TOKEN_LEFT_BRACE:
+ break;
+ case TOKEN_MARK_INPUT:
+ set_number_reg(nm, curenv->get_input_line_position().to_units());
+ break;
+ case TOKEN_NODE:
+ case TOKEN_HORIZONTAL_SPACE:
+ n = nd;
+ nd = 0;
+ break;
+ case TOKEN_NUMBERED_CHAR:
+ *pp = (*pp)->add_char(get_charinfo_by_number(val), curenv, &w, &s);
+ break;
+ case TOKEN_RIGHT_BRACE:
+ break;
+ case TOKEN_SPACE:
+ n = new hmotion_node(curenv->get_space_width(),
+ curenv->get_fill_color());
+ break;
+ case TOKEN_SPECIAL:
+ *pp = (*pp)->add_char(get_charinfo(nm), curenv, &w, &s);
+ break;
+ case TOKEN_STRETCHABLE_SPACE:
+ n = new unbreakable_space_node(curenv->get_space_width(),
+ curenv->get_fill_color());
+ break;
+ case TOKEN_UNSTRETCHABLE_SPACE:
+ n = new space_char_hmotion_node(curenv->get_space_width(),
+ curenv->get_fill_color());
+ break;
+ case TOKEN_TRANSPARENT_DUMMY:
+ n = new transparent_dummy_node;
+ break;
+ case TOKEN_ZERO_WIDTH_BREAK:
+ n = new space_node(H0, curenv->get_fill_color());
+ n->freeze_space();
+ n->is_escape_colon();
+ break;
+ default:
+ return 0;
+ }
+ if (n) {
+ n->next = *pp;
+ *pp = n;
+ }
+ return 1;
+}
+
+void token::process()
+{
+ if (possibly_handle_first_page_transition())
+ return;
+ switch (type) {
+ case TOKEN_BACKSPACE:
+ curenv->add_node(new hmotion_node(-curenv->get_space_width(),
+ curenv->get_fill_color()));
+ break;
+ case TOKEN_CHAR:
+ curenv->add_char(charset_table[c]);
+ break;
+ case TOKEN_DUMMY:
+ curenv->add_node(new dummy_node);
+ break;
+ case TOKEN_EMPTY:
+ assert(0);
+ break;
+ case TOKEN_EOF:
+ assert(0);
+ break;
+ case TOKEN_ESCAPE:
+ if (escape_char != 0)
+ curenv->add_char(charset_table[escape_char]);
+ break;
+ case TOKEN_BEGIN_TRAP:
+ case TOKEN_END_TRAP:
+ case TOKEN_PAGE_EJECTOR:
+ // these are all handled in process_input_stack()
+ break;
+ case TOKEN_HYPHEN_INDICATOR:
+ curenv->add_hyphen_indicator();
+ break;
+ case TOKEN_INTERRUPT:
+ curenv->interrupt();
+ break;
+ case TOKEN_ITALIC_CORRECTION:
+ curenv->add_italic_correction();
+ break;
+ case TOKEN_LEADER:
+ curenv->handle_tab(1);
+ break;
+ case TOKEN_LEFT_BRACE:
+ break;
+ case TOKEN_MARK_INPUT:
+ set_number_reg(nm, curenv->get_input_line_position().to_units());
+ break;
+ case TOKEN_NEWLINE:
+ curenv->newline();
+ break;
+ case TOKEN_NODE:
+ case TOKEN_HORIZONTAL_SPACE:
+ curenv->add_node(nd);
+ nd = 0;
+ break;
+ case TOKEN_NUMBERED_CHAR:
+ curenv->add_char(get_charinfo_by_number(val));
+ break;
+ case TOKEN_REQUEST:
+ // handled in process_input_stack()
+ break;
+ case TOKEN_RIGHT_BRACE:
+ break;
+ case TOKEN_SPACE:
+ curenv->space();
+ break;
+ case TOKEN_SPECIAL:
+ curenv->add_char(get_charinfo(nm));
+ break;
+ case TOKEN_SPREAD:
+ curenv->spread();
+ break;
+ case TOKEN_STRETCHABLE_SPACE:
+ curenv->add_node(new unbreakable_space_node(curenv->get_space_width(),
+ curenv->get_fill_color()));
+ break;
+ case TOKEN_UNSTRETCHABLE_SPACE:
+ curenv->add_node(new space_char_hmotion_node(curenv->get_space_width(),
+ curenv->get_fill_color()));
+ break;
+ case TOKEN_TAB:
+ curenv->handle_tab(0);
+ break;
+ case TOKEN_TRANSPARENT:
+ break;
+ case TOKEN_TRANSPARENT_DUMMY:
+ curenv->add_node(new transparent_dummy_node);
+ break;
+ case TOKEN_ZERO_WIDTH_BREAK:
+ {
+ node *tmp = new space_node(H0, curenv->get_fill_color());
+ tmp->freeze_space();
+ tmp->is_escape_colon();
+ curenv->add_node(tmp);
+ break;
+ }
+ default:
+ assert(0);
+ }
+}
+
+class nargs_reg : public reg {
+public:
+ const char *get_string();
+};
+
+const char *nargs_reg::get_string()
+{
+ return i_to_a(input_stack::nargs());
+}
+
+class lineno_reg : public reg {
+public:
+ const char *get_string();
+};
+
+const char *lineno_reg::get_string()
+{
+ int line;
+ const char *file;
+ if (!input_stack::get_location(0, &file, &line))
+ line = 0;
+ return i_to_a(line);
+}
+
+class writable_lineno_reg : public general_reg {
+public:
+ writable_lineno_reg();
+ void set_value(units);
+ bool get_value(units *);
+};
+
+writable_lineno_reg::writable_lineno_reg()
+{
+}
+
+bool writable_lineno_reg::get_value(units *res)
+{
+ int line;
+ const char *file;
+ if (!input_stack::get_location(0, &file, &line))
+ return false;
+ *res = line;
+ return true;
+}
+
+void writable_lineno_reg::set_value(units n)
+{
+ input_stack::set_location(0, n);
+}
+
+class filename_reg : public reg {
+public:
+ const char *get_string();
+};
+
+const char *filename_reg::get_string()
+{
+ int line;
+ const char *file;
+ if (input_stack::get_location(0, &file, &line))
+ return file;
+ else
+ return 0;
+}
+
+class break_flag_reg : public reg {
+public:
+ const char *get_string();
+};
+
+const char *break_flag_reg::get_string()
+{
+ return i_to_a(input_stack::get_break_flag());
+}
+
+class readonly_text_register : public reg {
+ const char *s;
+public:
+ readonly_text_register(const char *);
+ const char *get_string();
+};
+
+readonly_text_register::readonly_text_register(const char *p) : s(p)
+{
+}
+
+const char *readonly_text_register::get_string()
+{
+ return s;
+}
+
+readonly_register::readonly_register(int *q) : p(q)
+{
+}
+
+const char *readonly_register::get_string()
+{
+ return i_to_a(*p);
+}
+
+void abort_request()
+{
+ int c;
+ if (tok.is_eof())
+ c = EOF;
+ else if (tok.is_newline())
+ c = '\n';
+ else {
+ while ((c = get_copy(0)) == ' ')
+ ;
+ }
+ if (!(c == EOF || c == '\n')) {
+ for (; c != '\n' && c != EOF; c = get_copy(0))
+ fputs(asciify(c), stderr);
+ fputc('\n', stderr);
+ }
+ fflush(stderr);
+ cleanup_and_exit(EXIT_FAILURE);
+}
+
+char *read_string()
+{
+ int len = 256;
+ char *s = new char[len];
+ int c;
+ while ((c = get_copy(0)) == ' ')
+ ;
+ int i = 0;
+ while (c != '\n' && c != EOF) {
+ if (!is_invalid_input_char(c)) {
+ if (i + 2 > len) {
+ char *tem = s;
+ s = new char[len*2];
+ memcpy(s, tem, len);
+ len *= 2;
+ delete[] tem;
+ }
+ s[i++] = c;
+ }
+ c = get_copy(0);
+ }
+ s[i] = '\0';
+ tok.next();
+ if (i == 0) {
+ delete[] s;
+ return 0;
+ }
+ return s;
+}
+
+void pipe_output()
+{
+ if (!unsafe_flag) {
+ error("'pi' request is not allowed in safer mode");
+ skip_line();
+ }
+ else {
+#ifdef POPEN_MISSING
+ error("pipes not available on this system");
+ skip_line();
+#else /* not POPEN_MISSING */
+ if (the_output) {
+ error("can't pipe: output already started");
+ skip_line();
+ }
+ else {
+ char *pc;
+ if ((pc = read_string()) == 0)
+ error("can't pipe to empty command");
+ if (pipe_command) {
+ char *s = new char[strlen(pipe_command) + strlen(pc) + 1 + 1];
+ strcpy(s, pipe_command);
+ strcat(s, "|");
+ strcat(s, pc);
+ delete[] pipe_command;
+ delete[] pc;
+ pipe_command = s;
+ }
+ else
+ pipe_command = pc;
+ }
+#endif /* not POPEN_MISSING */
+ }
+}
+
+static int system_status;
+
+void system_request()
+{
+ if (!unsafe_flag) {
+ error("'sy' request is not allowed in safer mode");
+ skip_line();
+ }
+ else {
+ char *command = read_string();
+ if (!command)
+ error("empty command");
+ else {
+ system_status = system(command);
+ delete[] command;
+ }
+ }
+}
+
+void copy_file()
+{
+ if (curdiv == topdiv && topdiv->before_first_page) {
+ handle_initial_request(COPY_FILE_REQUEST);
+ return;
+ }
+ symbol filename = get_long_name(true /* required */);
+ while (!tok.is_newline() && !tok.is_eof())
+ tok.next();
+ if (break_flag)
+ curenv->do_break();
+ if (!filename.is_null())
+ curdiv->copy_file(filename.contents());
+ tok.next();
+}
+
+#ifdef COLUMN
+
+void vjustify()
+{
+ if (curdiv == topdiv && topdiv->before_first_page) {
+ handle_initial_request(VJUSTIFY_REQUEST);
+ return;
+ }
+ symbol type = get_long_name(true /* required */);
+ if (!type.is_null())
+ curdiv->vjustify(type);
+ skip_line();
+}
+
+#endif /* COLUMN */
+
+void transparent_file()
+{
+ if (curdiv == topdiv && topdiv->before_first_page) {
+ handle_initial_request(TRANSPARENT_FILE_REQUEST);
+ return;
+ }
+ symbol filename = get_long_name(true /* required */);
+ while (!tok.is_newline() && !tok.is_eof())
+ tok.next();
+ if (break_flag)
+ curenv->do_break();
+ if (!filename.is_null()) {
+ errno = 0;
+ FILE *fp = include_search_path.open_file_cautious(filename.contents());
+ if (!fp)
+ error("can't open '%1': %2", filename.contents(), strerror(errno));
+ else {
+ int bol = 1;
+ for (;;) {
+ int c = getc(fp);
+ if (c == EOF)
+ break;
+ if (is_invalid_input_char(c))
+ warning(WARN_INPUT, "invalid input character code %1", int(c));
+ else {
+ curdiv->transparent_output(c);
+ bol = c == '\n';
+ }
+ }
+ if (!bol)
+ curdiv->transparent_output('\n');
+ fclose(fp);
+ }
+ }
+ tok.next();
+}
+
+class page_range {
+ int first;
+ int last;
+public:
+ page_range *next;
+ page_range(int, int, page_range *);
+ int contains(int n);
+};
+
+page_range::page_range(int i, int j, page_range *p)
+: first(i), last(j), next(p)
+{
+}
+
+int page_range::contains(int n)
+{
+ return n >= first && (last <= 0 || n <= last);
+}
+
+page_range *output_page_list = 0;
+
+int in_output_page_list(int n)
+{
+ if (!output_page_list)
+ return 1;
+ for (page_range *p = output_page_list; p; p = p->next)
+ if (p->contains(n))
+ return 1;
+ return 0;
+}
+
+static void parse_output_page_list(char *p)
+{
+ for (;;) {
+ int i;
+ if (*p == '-')
+ i = 1;
+ else if (csdigit(*p)) {
+ i = 0;
+ do
+ i = i*10 + *p++ - '0';
+ while (csdigit(*p));
+ }
+ else
+ break;
+ int j;
+ if (*p == '-') {
+ p++;
+ j = 0;
+ if (csdigit(*p)) {
+ do
+ j = j*10 + *p++ - '0';
+ while (csdigit(*p));
+ }
+ }
+ else
+ j = i;
+ if (j == 0)
+ last_page_number = -1;
+ else if (last_page_number >= 0 && j > last_page_number)
+ last_page_number = j;
+ output_page_list = new page_range(i, j, output_page_list);
+ if (*p != ',')
+ break;
+ ++p;
+ }
+ if (*p != '\0') {
+ error("bad output page list");
+ output_page_list = 0;
+ }
+}
+
+static FILE *open_mac_file(const char *mac, char **path)
+{
+ // Try `mac`.tmac first, then tmac.`mac`. Expect ENOENT errors.
+ char *s1 = new char[strlen(mac)+strlen(MACRO_POSTFIX)+1];
+ strcpy(s1, mac);
+ strcat(s1, MACRO_POSTFIX);
+ FILE *fp = mac_path->open_file(s1, path);
+ if (!fp && ENOENT != errno)
+ error("can't open macro file '%1': %2", s1, strerror(errno));
+ delete[] s1;
+ if (!fp) {
+ char *s2 = new char[strlen(mac)+strlen(MACRO_PREFIX)+1];
+ strcpy(s2, MACRO_PREFIX);
+ strcat(s2, mac);
+ fp = mac_path->open_file(s2, path);
+ if (!fp && ENOENT != errno)
+ error("can't open macro file '%1': %2", s2, strerror(errno));
+ delete[] s2;
+ }
+ return fp;
+}
+
+static void process_macro_file(const char *mac)
+{
+ char *path;
+ FILE *fp = open_mac_file(mac, &path);
+ if (!fp)
+ fatal("unable to open macro file for -m argument '%1'", mac);
+ const char *s = symbol(path).contents();
+ free(path);
+ input_stack::push(new file_iterator(fp, s));
+ tok.next();
+ process_input_stack();
+}
+
+static void process_startup_file(const char *filename)
+{
+ char *path;
+ search_path *orig_mac_path = mac_path;
+ mac_path = &config_macro_path;
+ FILE *fp = mac_path->open_file(filename, &path);
+ if (fp) {
+ input_stack::push(new file_iterator(fp, symbol(path).contents()));
+ free(path);
+ tok.next();
+ process_input_stack();
+ }
+ mac_path = orig_mac_path;
+}
+
+void do_macro_source(bool quietly)
+{
+ symbol nm = get_long_name(true /* required */);
+ if (nm.is_null())
+ skip_line();
+ else {
+ while (!tok.is_newline() && !tok.is_eof())
+ tok.next();
+ char *path;
+ FILE *fp = mac_path->open_file(nm.contents(), &path);
+ // .mso cannot go through open_mac_file, which handles the -m option
+ // and expects only an identifier like "s" or "an", not a file name.
+ // We need to do it here manually: If we have tmac.FOOBAR, try
+ // FOOBAR.tmac and vice versa.
+ if (!fp) {
+ const char *fn = nm.contents();
+ size_t fnlen = strlen(fn);
+ if (strncasecmp(fn, MACRO_PREFIX, sizeof(MACRO_PREFIX) - 1) == 0) {
+ char *s = new char[fnlen + sizeof(MACRO_POSTFIX)];
+ strcpy(s, fn + sizeof(MACRO_PREFIX) - 1);
+ strcat(s, MACRO_POSTFIX);
+ fp = mac_path->open_file(s, &path);
+ delete[] s;
+ }
+ if (!fp) {
+ if (strncasecmp(fn + fnlen - sizeof(MACRO_POSTFIX) + 1,
+ MACRO_POSTFIX, sizeof(MACRO_POSTFIX) - 1) == 0) {
+ char *s = new char[fnlen + sizeof(MACRO_PREFIX)];
+ strcpy(s, MACRO_PREFIX);
+ strncat(s, fn, fnlen - sizeof(MACRO_POSTFIX) + 1);
+ fp = mac_path->open_file(s, &path);
+ delete[] s;
+ }
+ }
+ }
+ if (fp) {
+ input_stack::push(new file_iterator(fp, symbol(path).contents()));
+ free(path);
+ }
+ else
+ // Suppress diagnostic only if we're operating quietly and it's an
+ // expected problem.
+ if (!quietly && (ENOENT == errno))
+ warning(WARN_FILE, "can't open macro file '%1': %2",
+ nm.contents(), strerror(errno));
+ tok.next();
+ }
+}
+
+// .mso
+
+void macro_source()
+{
+ do_macro_source(false /* not quietly (if WARN_FILE enabled) */ );
+}
+
+// .msoquiet: like .mso, but silently ignore files that can't be opened
+// due to their nonexistence
+
+void macro_source_quietly()
+{
+ do_macro_source(true /* quietly */ );
+}
+
+static void process_input_file(const char *name)
+{
+ FILE *fp;
+ if (strcmp(name, "-") == 0) {
+ clearerr(stdin);
+ fp = stdin;
+ }
+ else {
+ errno = 0;
+ fp = include_search_path.open_file_cautious(name);
+ if (!fp)
+ fatal("can't open '%1': %2", name, strerror(errno));
+ }
+ input_stack::push(new file_iterator(fp, name));
+ tok.next();
+ process_input_stack();
+}
+
+// make sure the_input is empty before calling this
+
+static int evaluate_expression(const char *expr, units *res)
+{
+ input_stack::push(make_temp_iterator(expr));
+ tok.next();
+ int success = get_number(res, 'u');
+ while (input_stack::get(0) != EOF)
+ ;
+ return success;
+}
+
+static void do_register_assignment(const char *s)
+{
+ const char *p = strchr(s, '=');
+ if (!p) {
+ char buf[2];
+ buf[0] = s[0];
+ buf[1] = 0;
+ units n;
+ if (evaluate_expression(s + 1, &n))
+ set_number_reg(buf, n);
+ }
+ else {
+ char *buf = new char[p - s + 1];
+ memcpy(buf, s, p - s);
+ buf[p - s] = 0;
+ units n;
+ if (evaluate_expression(p + 1, &n))
+ set_number_reg(buf, n);
+ delete[] buf;
+ }
+}
+
+static void set_string(const char *name, const char *value)
+{
+ macro *m = new macro;
+ for (const char *p = value; *p; p++)
+ if (!is_invalid_input_char((unsigned char)*p))
+ m->append(*p);
+ request_dictionary.define(name, m);
+}
+
+static void do_string_assignment(const char *s)
+{
+ const char *p = strchr(s, '=');
+ if (!p) {
+ char buf[2];
+ buf[0] = s[0];
+ buf[1] = 0;
+ set_string(buf, s + 1);
+ }
+ else {
+ char *buf = new char[p - s + 1];
+ memcpy(buf, s, p - s);
+ buf[p - s] = 0;
+ set_string(buf, p + 1);
+ delete[] buf;
+ }
+}
+
+struct string_list {
+ const char *s;
+ string_list *next;
+ string_list(const char *ss) : s(ss), next(0) {}
+};
+
+#if 0
+static void prepend_string(const char *s, string_list **p)
+{
+ string_list *l = new string_list(s);
+ l->next = *p;
+ *p = l;
+}
+#endif
+
+static void add_string(const char *s, string_list **p)
+{
+ while (*p)
+ p = &((*p)->next);
+ *p = new string_list(s);
+}
+
+void usage(FILE *stream, const char *prog)
+{
+ fprintf(stream,
+"usage: %s [-abcCEiRUz] [-d ct] [-d string=text] [-f font-family]"
+" [-F font-directory] [-I inclusion-directory] [-m macro-package]"
+" [-M macro-directory] [-n page-number] [-o page-list]"
+" [-r cnumeric-expression] [-r register=numeric-expression]"
+" [-T output-device] [-w warning-category] [-W warning-category]"
+" [file ...]\n"
+"usage: %s {-v | --version}\n"
+"usage: %s {-h | --help}\n",
+ prog, prog, prog);
+}
+
+int main(int argc, char **argv)
+{
+ program_name = argv[0];
+ static char stderr_buf[BUFSIZ];
+ setbuf(stderr, stderr_buf);
+ int c;
+ string_list *macros = 0;
+ string_list *register_assignments = 0;
+ string_list *string_assignments = 0;
+ int iflag = 0;
+ int tflag = 0;
+ int fflag = 0;
+ int nflag = 0;
+ int no_rc = 0; // don't process troffrc and troffrc-end
+ int next_page_number = 0; // pacify compiler
+ opterr = 0;
+ hresolution = vresolution = 1;
+ // restore $PATH if called from groff
+ char* groff_path = getenv("GROFF_PATH__");
+ if (groff_path) {
+ string e = "PATH";
+ e += '=';
+ if (*groff_path)
+ e += groff_path;
+ e += '\0';
+ if (putenv(strsave(e.contents())))
+ fatal("putenv failed");
+ }
+ setlocale(LC_CTYPE, "");
+ static const struct option long_options[] = {
+ { "help", no_argument, 0, CHAR_MAX + 1 },
+ { "version", no_argument, 0, 'v' },
+ { 0, 0, 0, 0 }
+ };
+#if defined(DEBUGGING)
+#define DEBUG_OPTION "D"
+#else
+#define DEBUG_OPTION ""
+#endif
+ while ((c = getopt_long(argc, argv,
+ "abciI:vw:W:zCEf:m:n:o:r:d:F:M:T:tqs:RU"
+ DEBUG_OPTION, long_options, 0))
+ != EOF)
+ switch(c) {
+ case 'v':
+ {
+ printf("GNU troff (groff) version %s\n", Version_string);
+ exit(0);
+ break;
+ }
+ case 'I':
+ // Search path for .psbb files
+ // and most other non-system input files.
+ include_search_path.command_line_dir(optarg);
+ break;
+ case 'T':
+ device = optarg;
+ tflag = 1;
+ is_html = (strcmp(device, "html") == 0);
+ break;
+ case 'C':
+ compatible_flag = 1;
+ // fall through
+ case 'c':
+ color_flag = 0;
+ break;
+ case 'M':
+ macro_path.command_line_dir(optarg);
+ safer_macro_path.command_line_dir(optarg);
+ config_macro_path.command_line_dir(optarg);
+ break;
+ case 'F':
+ font::command_line_font_dir(optarg);
+ break;
+ case 'm':
+ add_string(optarg, &macros);
+ break;
+ case 'E':
+ inhibit_errors = 1;
+ break;
+ case 'R':
+ no_rc = 1;
+ break;
+ case 'w':
+ enable_warning(optarg);
+ break;
+ case 'W':
+ disable_warning(optarg);
+ break;
+ case 'i':
+ iflag = 1;
+ break;
+ case 'b':
+ backtrace_flag = 1;
+ break;
+ case 'a':
+ ascii_output_flag = 1;
+ break;
+ case 'z':
+ suppress_output_flag = 1;
+ break;
+ case 'n':
+ if (sscanf(optarg, "%d", &next_page_number) == 1)
+ nflag++;
+ else
+ error("bad page number");
+ break;
+ case 'o':
+ parse_output_page_list(optarg);
+ break;
+ case 'd':
+ if (*optarg == '\0')
+ error("'-d' requires non-empty argument");
+ else if (*optarg == '=')
+ error("malformed argument to '-d'; string name cannot be empty"
+ " or contain an equals sign");
+ else
+ add_string(optarg, &string_assignments);
+ break;
+ case 'r':
+ if (*optarg == '\0')
+ error("'-r' requires non-empty argument");
+ else if (*optarg == '=')
+ error("malformed argument to '-r'; register name cannot be"
+ " empty or contain an equals sign");
+ else
+ add_string(optarg, &register_assignments);
+ break;
+ case 'f':
+ default_family = symbol(optarg);
+ fflag = 1;
+ break;
+ case 'q':
+ case 's':
+ case 't':
+ // silently ignore these
+ break;
+ case 'U':
+ unsafe_flag = 1; // unsafe behaviour
+ break;
+#if defined(DEBUGGING)
+ case 'D':
+ debug_state = 1;
+ break;
+#endif
+ case CHAR_MAX + 1: // --help
+ usage(stdout, argv[0]);
+ exit(0);
+ break;
+ case '?':
+ usage(stderr, argv[0]);
+ exit(1);
+ break; // never reached
+ default:
+ assert(0);
+ }
+ if (unsafe_flag)
+ mac_path = &macro_path;
+ set_string(".T", device);
+ init_charset_table();
+ init_hpf_code_table();
+ if (0 /* nullptr */ == font::load_desc())
+ fatal("cannot load 'DESC' description file for device '%1'",
+ device);
+ units_per_inch = font::res;
+ hresolution = font::hor;
+ vresolution = font::vert;
+ sizescale = font::sizescale;
+ device_has_tcommand = font::has_tcommand;
+ warn_scale = (double)units_per_inch;
+ warn_scaling_indicator = 'i';
+ if (!fflag && font::family != 0 && *font::family != '\0')
+ default_family = symbol(font::family);
+ font_size::init_size_table(font::sizes);
+ int i;
+ int j = 1;
+ if (font::style_table)
+ for (i = 0; font::style_table[i]; i++)
+ // Mounting a style can't actually fail due to a bad style name;
+ // that's not determined until the full font name is resolved.
+ // The DESC file also can't provoke a problem by requesting over a
+ // thousand slots in the style table.
+ if (!mount_style(j++, symbol(font::style_table[i])))
+ warning(WARN_FONT, "cannot mount style '%1' directed by 'DESC'"
+ " file for device '%2'", font::style_table[i], device);
+ for (i = 0; font::font_name_table[i]; i++, j++)
+ // In the DESC file, a font name of 0 (zero) means "leave this
+ // position empty".
+ if (strcmp(font::font_name_table[i], "0") != 0)
+ if (!mount_font(j, symbol(font::font_name_table[i])))
+ warning(WARN_FONT, "cannot mount font '%1' directed by 'DESC'"
+ " file for device '%2'", font::font_name_table[i],
+ device);
+ curdiv = topdiv = new top_level_diversion;
+ if (nflag)
+ topdiv->set_next_page_number(next_page_number);
+ init_input_requests();
+ init_env_requests();
+ init_div_requests();
+#ifdef COLUMN
+ init_column_requests();
+#endif /* COLUMN */
+ init_node_requests();
+ register_dictionary.define(".T", new readonly_text_register(tflag ? "1" : "0"));
+ init_registers();
+ init_reg_requests();
+ init_hyphen_requests();
+ init_environments();
+ while (string_assignments) {
+ do_string_assignment(string_assignments->s);
+ string_list *tem = string_assignments;
+ string_assignments = string_assignments->next;
+ delete tem;
+ }
+ while (register_assignments) {
+ do_register_assignment(register_assignments->s);
+ string_list *tem = register_assignments;
+ register_assignments = register_assignments->next;
+ delete tem;
+ }
+ if (!no_rc)
+ process_startup_file(INITIAL_STARTUP_FILE);
+ while (macros) {
+ process_macro_file(macros->s);
+ string_list *tem = macros;
+ macros = macros->next;
+ delete tem;
+ }
+ if (!no_rc)
+ process_startup_file(FINAL_STARTUP_FILE);
+ for (i = optind; i < argc; i++)
+ process_input_file(argv[i]);
+ if (optind >= argc || iflag)
+ process_input_file("-");
+ exit_troff();
+ return 0; // not reached
+}
+
+void warn_request()
+{
+ int n;
+ if (has_arg() && get_integer(&n)) {
+ if (n & ~WARN_TOTAL) {
+ warning(WARN_RANGE, "warning mask must be between 0 and %1", WARN_TOTAL);
+ n &= WARN_TOTAL;
+ }
+ warning_mask = n;
+ }
+ else
+ warning_mask = WARN_TOTAL;
+ skip_line();
+}
+
+static void init_registers()
+{
+#ifdef LONG_FOR_TIME_T
+ long
+#else /* not LONG_FOR_TIME_T */
+ time_t
+#endif /* not LONG_FOR_TIME_T */
+ t = current_time();
+ struct tm *tt = localtime(&t);
+ set_number_reg("seconds", int(tt->tm_sec));
+ set_number_reg("minutes", int(tt->tm_min));
+ set_number_reg("hours", int(tt->tm_hour));
+ set_number_reg("dw", int(tt->tm_wday + 1));
+ set_number_reg("dy", int(tt->tm_mday));
+ set_number_reg("mo", int(tt->tm_mon + 1));
+ set_number_reg("year", int(1900 + tt->tm_year));
+ set_number_reg("yr", int(tt->tm_year));
+ set_number_reg("$$", getpid());
+ register_dictionary.define(".A",
+ new readonly_text_register(ascii_output_flag
+ ? "1"
+ : "0"));
+}
+
+/*
+ * registers associated with \O
+ */
+
+static int output_reg_minx_contents = -1;
+static int output_reg_miny_contents = -1;
+static int output_reg_maxx_contents = -1;
+static int output_reg_maxy_contents = -1;
+
+void check_output_limits(int x, int y)
+{
+ if ((output_reg_minx_contents == -1) || (x < output_reg_minx_contents))
+ output_reg_minx_contents = x;
+ if (x > output_reg_maxx_contents)
+ output_reg_maxx_contents = x;
+ if ((output_reg_miny_contents == -1) || (y < output_reg_miny_contents))
+ output_reg_miny_contents = y;
+ if (y > output_reg_maxy_contents)
+ output_reg_maxy_contents = y;
+}
+
+void reset_output_registers()
+{
+ output_reg_minx_contents = -1;
+ output_reg_miny_contents = -1;
+ output_reg_maxx_contents = -1;
+ output_reg_maxy_contents = -1;
+}
+
+void get_output_registers(int *minx, int *miny, int *maxx, int *maxy)
+{
+ *minx = output_reg_minx_contents;
+ *miny = output_reg_miny_contents;
+ *maxx = output_reg_maxx_contents;
+ *maxy = output_reg_maxy_contents;
+}
+
+void init_input_requests()
+{
+ init_request("ab", abort_request);
+ init_request("als", alias_macro);
+ init_request("am", append_macro);
+ init_request("am1", append_nocomp_macro);
+ init_request("ami", append_indirect_macro);
+ init_request("ami1", append_indirect_nocomp_macro);
+ init_request("as", append_string);
+ init_request("as1", append_nocomp_string);
+ init_request("asciify", asciify_macro);
+ init_request("backtrace", backtrace_request);
+ init_request("blm", blank_line_macro);
+ init_request("break", while_break_request);
+ init_request("cf", copy_file);
+ init_request("cflags", char_flags);
+ init_request("char", define_character);
+ init_request("chop", chop_macro);
+ init_request("class", define_class);
+ init_request("close", close_request);
+ init_request("color", activate_color);
+ init_request("composite", composite_request);
+ init_request("continue", while_continue_request);
+ init_request("cp", compatible);
+ init_request("de", define_macro);
+ init_request("de1", define_nocomp_macro);
+ init_request("defcolor", define_color);
+ init_request("dei", define_indirect_macro);
+ init_request("dei1", define_indirect_nocomp_macro);
+ init_request("device", device_request);
+ init_request("devicem", device_macro_request);
+ init_request("do", do_request);
+ init_request("ds", define_string);
+ init_request("ds1", define_nocomp_string);
+ init_request("ec", set_escape_char);
+ init_request("ecr", restore_escape_char);
+ init_request("ecs", save_escape_char);
+ init_request("el", else_request);
+ init_request("em", eoi_macro);
+ init_request("eo", escape_off);
+ init_request("ex", exit_request);
+ init_request("fchar", define_fallback_character);
+#ifdef WIDOW_CONTROL
+ init_request("fpl", flush_pending_lines);
+#endif /* WIDOW_CONTROL */
+ init_request("hcode", hyphenation_code);
+ init_request("hpfcode", hyphenation_patterns_file_code);
+ init_request("ie", if_else_request);
+ init_request("if", if_request);
+ init_request("ig", ignore);
+ init_request("length", length_request);
+ init_request("lf", line_file);
+ init_request("lsm", leading_spaces_macro);
+ init_request("mso", macro_source);
+ init_request("msoquiet", macro_source_quietly);
+ init_request("nop", nop_request);
+ init_request("nroff", nroff_request);
+ init_request("nx", next_file);
+ init_request("open", open_request);
+ init_request("opena", opena_request);
+ init_request("output", output_request);
+ init_request("pc", set_page_character);
+ init_request("pi", pipe_output);
+ init_request("pm", print_macros);
+ init_request("psbb", ps_bbox_request);
+#ifndef POPEN_MISSING
+ init_request("pso", pipe_source);
+#endif /* not POPEN_MISSING */
+ init_request("rchar", remove_character);
+ init_request("rd", read_request);
+ init_request("return", return_macro_request);
+ init_request("rm", remove_macro);
+ init_request("rn", rename_macro);
+ init_request("schar", define_special_character);
+ init_request("shift", shift);
+ init_request("so", source);
+ init_request("soquiet", source_quietly);
+ init_request("spreadwarn", spreadwarn_request);
+ init_request("stringdown", stringdown_request);
+ init_request("stringup", stringup_request);
+ init_request("substring", substring_request);
+ init_request("sy", system_request);
+ init_request("tag", tag);
+ init_request("taga", taga);
+ init_request("tm", terminal);
+ init_request("tm1", terminal1);
+ init_request("tmc", terminal_continue);
+ init_request("tr", translate);
+ init_request("trf", transparent_file);
+ init_request("trin", translate_input);
+ init_request("trnt", translate_no_transparent);
+ init_request("troff", troff_request);
+ init_request("unformat", unformat_macro);
+#ifdef COLUMN
+ init_request("vj", vjustify);
+#endif /* COLUMN */
+ init_request("warn", warn_request);
+ init_request("warnscale", warnscale_request);
+ init_request("while", while_request);
+ init_request("write", write_request);
+ init_request("writec", write_request_continue);
+ init_request("writem", write_macro_request);
+ register_dictionary.define(".$", new nargs_reg);
+ register_dictionary.define(".br", new break_flag_reg);
+ register_dictionary.define(".C", new readonly_register(&compatible_flag));
+ register_dictionary.define(".cp", new readonly_register(&do_old_compatible_flag));
+ register_dictionary.define(".O", new variable_reg(&begin_level));
+ register_dictionary.define(".c", new lineno_reg);
+ register_dictionary.define(".color", new readonly_register(&color_flag));
+ register_dictionary.define(".F", new filename_reg);
+ register_dictionary.define(".g", new readonly_text_register("1"));
+ register_dictionary.define(".H", new readonly_register(&hresolution));
+ register_dictionary.define(".R", new readonly_text_register("10000"));
+ register_dictionary.define(".U", new readonly_register(&unsafe_flag));
+ register_dictionary.define(".V", new readonly_register(&vresolution));
+ register_dictionary.define(".warn", new readonly_register(&warning_mask));
+ extern const char *major_version;
+ register_dictionary.define(".x", new readonly_text_register(major_version));
+ extern const char *revision;
+ register_dictionary.define(".Y", new readonly_text_register(revision));
+ extern const char *minor_version;
+ register_dictionary.define(".y", new readonly_text_register(minor_version));
+ register_dictionary.define("c.", new writable_lineno_reg);
+ register_dictionary.define("llx", new variable_reg(&llx_reg_contents));
+ register_dictionary.define("lly", new variable_reg(&lly_reg_contents));
+ register_dictionary.define("lsn", new variable_reg(&leading_spaces_number));
+ register_dictionary.define("lss", new variable_reg(&leading_spaces_space));
+ register_dictionary.define("opmaxx",
+ new variable_reg(&output_reg_maxx_contents));
+ register_dictionary.define("opmaxy",
+ new variable_reg(&output_reg_maxy_contents));
+ register_dictionary.define("opminx",
+ new variable_reg(&output_reg_minx_contents));
+ register_dictionary.define("opminy",
+ new variable_reg(&output_reg_miny_contents));
+ register_dictionary.define("slimit",
+ new variable_reg(&input_stack::limit));
+ register_dictionary.define("systat", new variable_reg(&system_status));
+ register_dictionary.define("urx", new variable_reg(&urx_reg_contents));
+ register_dictionary.define("ury", new variable_reg(&ury_reg_contents));
+}
+
+object_dictionary request_dictionary(501);
+
+void init_request(const char *s, REQUEST_FUNCP f)
+{
+ request_dictionary.define(s, new request(f));
+}
+
+static request_or_macro *lookup_request(symbol nm)
+{
+ assert(!nm.is_null());
+ request_or_macro *p = (request_or_macro *)request_dictionary.lookup(nm);
+ if (p == 0) {
+ warning(WARN_MAC, "macro '%1' not defined", nm.contents());
+ p = new macro;
+ request_dictionary.define(nm, p);
+ }
+ return p;
+}
+
+node *charinfo_to_node_list(charinfo *ci, const environment *envp)
+{
+ // Don't interpret character definitions in compatible mode.
+ int old_compatible_flag = compatible_flag;
+ compatible_flag = 0;
+ int old_escape_char = escape_char;
+ escape_char = '\\';
+ macro *mac = ci->set_macro(0);
+ assert(mac != 0);
+ environment *oldenv = curenv;
+ environment env(envp);
+ curenv = &env;
+ curenv->set_composite();
+ token old_tok = tok;
+ input_stack::add_boundary();
+ string_iterator *si =
+ new string_iterator(*mac, "composite character", ci->nm);
+ input_stack::push(si);
+ // we don't use process_input_stack, because we don't want to recognise
+ // requests
+ for (;;) {
+ tok.next();
+ if (tok.is_eof())
+ break;
+ if (tok.is_newline()) {
+ error("composite character mustn't contain newline");
+ while (!tok.is_eof())
+ tok.next();
+ break;
+ }
+ else
+ tok.process();
+ }
+ node *n = curenv->extract_output_line();
+ input_stack::remove_boundary();
+ ci->set_macro(mac);
+ tok = old_tok;
+ curenv = oldenv;
+ compatible_flag = old_compatible_flag;
+ escape_char = old_escape_char;
+ have_input = 0;
+ return n;
+}
+
+static node *read_draw_node()
+{
+ token start;
+ start.next();
+ if (!start.usable_as_delimiter(true /* report error */)){
+ do {
+ tok.next();
+ } while (tok != start && !tok.is_newline() && !tok.is_eof());
+ }
+ else {
+ tok.next();
+ if (tok == start)
+ error("missing argument");
+ else {
+ unsigned char type = tok.ch();
+ if (type == 'F') {
+ read_color_draw_node(start);
+ return 0;
+ }
+ tok.next();
+ int maxpoints = 10;
+ hvpair *point = new hvpair[maxpoints];
+ int npoints = 0;
+ int no_last_v = 0;
+ bool err = false;
+ int i;
+ for (i = 0; tok != start; i++) {
+ if (i == maxpoints) {
+ hvpair *oldpoint = point;
+ point = new hvpair[maxpoints*2];
+ for (int j = 0; j < maxpoints; j++)
+ point[j] = oldpoint[j];
+ maxpoints *= 2;
+ delete[] oldpoint;
+ }
+ if (tok.is_newline() || tok.is_eof()) {
+ warning(WARN_DELIM, "missing closing delimiter in drawing"
+ " escape sequence (got %1)", tok.description());
+ err = true;
+ break;
+ }
+ if (!get_hunits(&point[i].h,
+ type == 'f' || type == 't' ? 'u' : 'm')) {
+ err = true;
+ break;
+ }
+ ++npoints;
+ tok.skip();
+ point[i].v = V0;
+ if (tok == start) {
+ no_last_v = 1;
+ break;
+ }
+ if (!get_vunits(&point[i].v, 'v')) {
+ err = false;
+ break;
+ }
+ tok.skip();
+ }
+ while (tok != start && !tok.is_newline() && !tok.is_eof())
+ tok.next();
+ if (!err) {
+ switch (type) {
+ case 'l':
+ if (npoints != 1 || no_last_v) {
+ error("two arguments needed for line");
+ npoints = 1;
+ }
+ break;
+ case 'c':
+ if (npoints != 1 || !no_last_v) {
+ error("one argument needed for circle");
+ npoints = 1;
+ point[0].v = V0;
+ }
+ break;
+ case 'e':
+ if (npoints != 1 || no_last_v) {
+ error("two arguments needed for ellipse");
+ npoints = 1;
+ }
+ break;
+ case 'a':
+ if (npoints != 2 || no_last_v) {
+ error("four arguments needed for arc");
+ npoints = 2;
+ }
+ break;
+ case '~':
+ if (no_last_v)
+ error("even number of arguments needed for spline");
+ break;
+ case 'f':
+ if (npoints != 1 || !no_last_v) {
+ error("one argument needed for gray shade");
+ npoints = 1;
+ point[0].v = V0;
+ }
+ default:
+ // silently pass it through
+ break;
+ }
+ draw_node *dn = new draw_node(type, point, npoints,
+ curenv->get_font_size(),
+ curenv->get_glyph_color(),
+ curenv->get_fill_color());
+ delete[] point;
+ return dn;
+ }
+ else {
+ delete[] point;
+ }
+ }
+ }
+ return 0;
+}
+
+static void read_color_draw_node(token &start)
+{
+ tok.next();
+ if (tok == start) {
+ error("missing color scheme");
+ return;
+ }
+ unsigned char scheme = tok.ch();
+ tok.next();
+ color *col = 0;
+ char end = start.ch();
+ switch (scheme) {
+ case 'c':
+ col = read_cmy(end);
+ break;
+ case 'd':
+ col = &default_color;
+ break;
+ case 'g':
+ col = read_gray(end);
+ break;
+ case 'k':
+ col = read_cmyk(end);
+ break;
+ case 'r':
+ col = read_rgb(end);
+ break;
+ }
+ if (col)
+ curenv->set_fill_color(col);
+ while (tok != start) {
+ if (tok.is_newline() || tok.is_eof()) {
+ warning(WARN_DELIM, "missing closing delimiter in color space"
+ " drawing escape sequence (got %1)", tok.description());
+ input_stack::push(make_temp_iterator("\n"));
+ break;
+ }
+ tok.next();
+ }
+ have_input = 1;
+}
+
+static struct {
+ const char *name;
+ int mask;
+} warning_table[] = {
+ { "char", WARN_CHAR },
+ { "range", WARN_RANGE },
+ { "break", WARN_BREAK },
+ { "delim", WARN_DELIM },
+ { "el", WARN_EL },
+ { "scale", WARN_SCALE },
+ { "number", WARN_NUMBER },
+ { "syntax", WARN_SYNTAX },
+ { "tab", WARN_TAB },
+ { "right-brace", WARN_RIGHT_BRACE },
+ { "missing", WARN_MISSING },
+ { "input", WARN_INPUT },
+ { "escape", WARN_ESCAPE },
+ { "space", WARN_SPACE },
+ { "font", WARN_FONT },
+ { "di", WARN_DI },
+ { "mac", WARN_MAC },
+ { "reg", WARN_REG },
+ { "ig", WARN_IG },
+ { "color", WARN_COLOR },
+ { "file", WARN_FILE },
+ { "all", WARN_TOTAL & ~(WARN_DI | WARN_MAC | WARN_REG) },
+ { "w", WARN_TOTAL },
+ { "default", DEFAULT_WARNING_MASK },
+};
+
+static int lookup_warning(const char *name)
+{
+ for (unsigned int i = 0;
+ i < sizeof(warning_table)/sizeof(warning_table[0]);
+ i++)
+ if (strcmp(name, warning_table[i].name) == 0)
+ return warning_table[i].mask;
+ return 0;
+}
+
+static void enable_warning(const char *name)
+{
+ int mask = lookup_warning(name);
+ if (mask)
+ warning_mask |= mask;
+ else
+ error("unrecognized warning category '%1'", name);
+}
+
+static void disable_warning(const char *name)
+{
+ int mask = lookup_warning(name);
+ if (mask)
+ warning_mask &= ~mask;
+ else
+ error("unrecognized warning category '%1'", name);
+}
+
+static void copy_mode_error(const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ if (ignoring) {
+ static const char prefix[] = "(in ignored input) ";
+ char *s = new char[sizeof(prefix) + strlen(format)];
+ strcpy(s, prefix);
+ strcat(s, format);
+ warning(WARN_IG, s, arg1, arg2, arg3);
+ delete[] s;
+ }
+ else
+ error(format, arg1, arg2, arg3);
+}
+
+enum error_type { DEBUG, WARNING, OUTPUT_WARNING, ERROR, FATAL };
+
+static void do_error(error_type type,
+ const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ const char *filename;
+ int lineno;
+ if (inhibit_errors && type < FATAL)
+ return;
+ if (backtrace_flag)
+ input_stack::backtrace();
+ if (!get_file_line(&filename, &lineno))
+ filename = 0;
+ if (filename) {
+ if (program_name)
+ errprint("%1:", program_name);
+ errprint("%1:%2: ", filename, lineno);
+ }
+ else if (program_name)
+ fprintf(stderr, "%s: ", program_name);
+ switch (type) {
+ case FATAL:
+ fputs("fatal error: ", stderr);
+ break;
+ case ERROR:
+ fputs("error: ", stderr);
+ break;
+ case WARNING:
+ fputs("warning: ", stderr);
+ break;
+ case DEBUG:
+ fputs("debug: ", stderr);
+ break;
+ case OUTPUT_WARNING:
+ double fromtop = topdiv->get_vertical_position().to_units() / warn_scale;
+ fprintf(stderr, "warning [p %d, %.1f%c",
+ topdiv->get_page_number(), fromtop, warn_scaling_indicator);
+ if (topdiv != curdiv) {
+ double fromtop1 = curdiv->get_vertical_position().to_units()
+ / warn_scale;
+ fprintf(stderr, ", div '%s', %.1f%c",
+ curdiv->get_diversion_name(), fromtop1, warn_scaling_indicator);
+ }
+ fprintf(stderr, "]: ");
+ break;
+ }
+ errprint(format, arg1, arg2, arg3);
+ fputc('\n', stderr);
+ fflush(stderr);
+ if (type == FATAL)
+ cleanup_and_exit(EXIT_FAILURE);
+}
+
+void debug(const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ do_error(DEBUG, format, arg1, arg2, arg3);
+}
+
+int warning(warning_type t,
+ const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ if ((t & warning_mask) != 0) {
+ do_error(WARNING, format, arg1, arg2, arg3);
+ return 1;
+ }
+ else
+ return 0;
+}
+
+int output_warning(warning_type t,
+ const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ if ((t & warning_mask) != 0) {
+ do_error(OUTPUT_WARNING, format, arg1, arg2, arg3);
+ return 1;
+ }
+ else
+ return 0;
+}
+
+void error(const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ do_error(ERROR, format, arg1, arg2, arg3);
+}
+
+void fatal(const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ do_error(FATAL, format, arg1, arg2, arg3);
+}
+
+void fatal_with_file_and_line(const char *filename, int lineno,
+ const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ if (program_name)
+ fprintf(stderr, "%s:", program_name);
+ fprintf(stderr, "%s:", filename);
+ if (lineno > 0)
+ fprintf(stderr, "%d:", lineno);
+ fputs(" fatal error: ", stderr);
+ errprint(format, arg1, arg2, arg3);
+ fputc('\n', stderr);
+ fflush(stderr);
+ cleanup_and_exit(EXIT_FAILURE);
+}
+
+void error_with_file_and_line(const char *filename, int lineno,
+ const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ if (program_name)
+ fprintf(stderr, "%s:", program_name);
+ fprintf(stderr, "%s:", filename);
+ if (lineno > 0)
+ fprintf(stderr, "%d:", lineno);
+ fputs(" error: ", stderr);
+ errprint(format, arg1, arg2, arg3);
+ fputc('\n', stderr);
+ fflush(stderr);
+}
+
+void debug_with_file_and_line(const char *filename,
+ int lineno,
+ const char *format,
+ const errarg &arg1,
+ const errarg &arg2,
+ const errarg &arg3)
+{
+ if (program_name)
+ fprintf(stderr, "%s:", program_name);
+ fprintf(stderr, "%s:", filename);
+ if (lineno > 0)
+ fprintf(stderr, "%d:", lineno);
+ fputs(" debug: ", stderr);
+ errprint(format, arg1, arg2, arg3);
+ fputc('\n', stderr);
+ fflush(stderr);
+}
+
+dictionary charinfo_dictionary(501);
+
+charinfo *get_charinfo(symbol nm)
+{
+ void *p = charinfo_dictionary.lookup(nm);
+ if (p != 0)
+ return (charinfo *)p;
+ charinfo *cp = new charinfo(nm);
+ (void)charinfo_dictionary.lookup(nm, cp);
+ return cp;
+}
+
+int charinfo::next_index = 0;
+
+charinfo::charinfo(symbol s)
+: translation(0), mac(0), special_translation(TRANSLATE_NONE),
+ hyphenation_code(0), flags(0), ascii_code(0), asciify_code(0),
+ not_found(0), transparent_translate(1), translate_input(0),
+ mode(CHAR_NORMAL), nm(s)
+{
+ index = next_index++;
+ number = -1;
+ get_flags();
+}
+
+int charinfo::get_unicode_code()
+{
+ if (ascii_code != '\0')
+ return ascii_code;
+ return glyph_to_unicode(this);
+}
+
+void charinfo::set_hyphenation_code(unsigned char c)
+{
+ hyphenation_code = c;
+}
+
+void charinfo::set_translation(charinfo *ci, int tt, int ti)
+{
+ translation = ci;
+ if (ci && ti) {
+ if (hyphenation_code != 0)
+ ci->set_hyphenation_code(hyphenation_code);
+ if (asciify_code != 0)
+ ci->set_asciify_code(asciify_code);
+ else if (ascii_code != 0)
+ ci->set_asciify_code(ascii_code);
+ ci->set_translation_input();
+ }
+ special_translation = TRANSLATE_NONE;
+ transparent_translate = tt;
+}
+
+// Recompute flags for all entries in the charinfo dictionary.
+void get_flags()
+{
+ dictionary_iterator iter(charinfo_dictionary);
+ charinfo *ci;
+ symbol s;
+ while (iter.get(&s, (void **)&ci)) {
+ assert(!s.is_null());
+ ci->get_flags();
+ }
+ class_flag = 0;
+}
+
+// Get the union of all flags affecting this charinfo.
+void charinfo::get_flags()
+{
+ dictionary_iterator iter(char_class_dictionary);
+ charinfo *ci;
+ symbol s;
+ while (iter.get(&s, (void **)&ci)) {
+ assert(!s.is_null());
+ if (ci->contains(get_unicode_code())) {
+#if defined(DEBUGGING)
+ if (debug_state)
+ fprintf(stderr, "charinfo::get_flags %p %s %d\n",
+ (void *)ci, ci->nm.contents(), ci->flags);
+#endif
+ flags |= ci->flags;
+ }
+ }
+}
+
+void charinfo::set_special_translation(int c, int tt)
+{
+ special_translation = c;
+ translation = 0;
+ transparent_translate = tt;
+}
+
+void charinfo::set_ascii_code(unsigned char c)
+{
+ ascii_code = c;
+}
+
+void charinfo::set_asciify_code(unsigned char c)
+{
+ asciify_code = c;
+}
+
+macro *charinfo::set_macro(macro *m)
+{
+ macro *tem = mac;
+ mac = m;
+ return tem;
+}
+
+macro *charinfo::setx_macro(macro *m, char_mode cm)
+{
+ macro *tem = mac;
+ mac = m;
+ mode = cm;
+ return tem;
+}
+
+void charinfo::set_number(int n)
+{
+ assert(n >= 0);
+ number = n;
+}
+
+int charinfo::get_number()
+{
+ assert(number >= 0);
+ return number;
+}
+
+bool charinfo::contains(int c, bool already_called)
+{
+ if (already_called) {
+ warning(WARN_SYNTAX,
+ "cyclic nested class detected while processing character code %1",
+ c);
+ return false;
+ }
+ std::vector<std::pair<int, int> >::const_iterator ranges_iter;
+ ranges_iter = ranges.begin();
+ while (ranges_iter != ranges.end()) {
+ if (c >= ranges_iter->first && c <= ranges_iter->second) {
+#if defined(DEBUGGING)
+ if (debug_state)
+ fprintf(stderr, "charinfo::contains(%d)\n", c);
+#endif
+ return true;
+ }
+ ++ranges_iter;
+ }
+
+ std::vector<charinfo *>::const_iterator nested_iter;
+ nested_iter = nested_classes.begin();
+ while (nested_iter != nested_classes.end()) {
+ if ((*nested_iter)->contains(c, true))
+ return true;
+ ++nested_iter;
+ }
+
+ return false;
+}
+
+bool charinfo::contains(symbol s, bool already_called)
+{
+ if (already_called) {
+ warning(WARN_SYNTAX,
+ "cyclic nested class detected while processing symbol %1",
+ s.contents());
+ return false;
+ }
+ const char *unicode = glyph_name_to_unicode(s.contents());
+ if (unicode != 0 && strchr(unicode, '_') == 0) {
+ char *ignore;
+ int c = (int)strtol(unicode, &ignore, 16);
+ return contains(c, true);
+ }
+ else
+ return false;
+}
+
+bool charinfo::contains(charinfo *, bool)
+{
+ // TODO
+ return false;
+}
+
+symbol UNNAMED_SYMBOL("---");
+
+// For numbered characters not between 0 and 255, we make a symbol out
+// of the number and store them in this dictionary.
+
+dictionary numbered_charinfo_dictionary(11);
+
+charinfo *get_charinfo_by_number(int n)
+{
+ static charinfo *number_table[256];
+
+ if (n >= 0 && n < 256) {
+ charinfo *ci = number_table[n];
+ if (!ci) {
+ ci = new charinfo(UNNAMED_SYMBOL);
+ ci->set_number(n);
+ number_table[n] = ci;
+ }
+ return ci;
+ }
+ else {
+ symbol ns(i_to_a(n));
+ charinfo *ci = (charinfo *)numbered_charinfo_dictionary.lookup(ns);
+ if (!ci) {
+ ci = new charinfo(UNNAMED_SYMBOL);
+ ci->set_number(n);
+ (void)numbered_charinfo_dictionary.lookup(ns, ci);
+ }
+ return ci;
+ }
+}
+
+// This overrides the same function from libgroff; while reading font
+// definition files it puts single-letter glyph names into
+// 'charset_table' and converts glyph names of the form '\x' ('x' a
+// single letter) into 'x'. Consequently, symbol("x") refers to glyph
+// name '\x', not 'x'.
+
+glyph *name_to_glyph(const char *nm)
+{
+ charinfo *ci;
+ if (nm[1] == 0)
+ ci = charset_table[nm[0] & 0xff];
+ else if (nm[0] == '\\' && nm[2] == 0)
+ ci = get_charinfo(symbol(nm + 1));
+ else
+ ci = get_charinfo(symbol(nm));
+ return ci->as_glyph();
+}
+
+glyph *number_to_glyph(int n)
+{
+ return get_charinfo_by_number(n)->as_glyph();
+}
+
+const char *glyph_to_name(glyph *g)
+{
+ charinfo *ci = (charinfo *)g; // Every glyph is actually a charinfo.
+ return (ci->nm != UNNAMED_SYMBOL ? ci->nm.contents() : 0);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/roff/troff/input.h b/src/roff/troff/input.h
new file mode 100644
index 0000000..e78124f
--- /dev/null
+++ b/src/roff/troff/input.h
@@ -0,0 +1,120 @@
+/* Copyright (C) 2001-2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+/* special character codes */
+
+#ifndef IS_EBCDIC_HOST
+
+const int ESCAPE_QUESTION = 015;
+const int BEGIN_TRAP = 016;
+const int END_TRAP = 017;
+const int PAGE_EJECTOR = 020;
+const int ESCAPE_NEWLINE = 021;
+const int ESCAPE_AMPERSAND = 022;
+const int ESCAPE_UNDERSCORE = 023;
+const int ESCAPE_BAR = 024;
+const int ESCAPE_CIRCUMFLEX = 025;
+const int ESCAPE_LEFT_BRACE = 026;
+const int ESCAPE_RIGHT_BRACE = 027;
+const int ESCAPE_LEFT_QUOTE = 030;
+const int ESCAPE_RIGHT_QUOTE = 031;
+const int ESCAPE_HYPHEN = 032;
+const int ESCAPE_BANG = 033;
+const int ESCAPE_c = 034;
+const int ESCAPE_e = 035;
+const int ESCAPE_PERCENT = 036;
+const int ESCAPE_SPACE = 037;
+
+const int INPUT_DELETE = 0177;
+
+const int TITLE_REQUEST = 0200;
+const int COPY_FILE_REQUEST = 0201;
+const int TRANSPARENT_FILE_REQUEST = 0202;
+#ifdef COLUMN
+const int VJUSTIFY_REQUEST = 0203;
+#endif /* COLUMN */
+const int ESCAPE_E = 0204;
+const int LAST_PAGE_EJECTOR = 0205;
+const int ESCAPE_RIGHT_PARENTHESIS = 0206;
+const int ESCAPE_TILDE = 0207;
+const int ESCAPE_COLON = 0210;
+const int PUSH_GROFF_MODE = 0211;
+const int PUSH_COMP_MODE = 0212;
+const int POP_GROFFCOMP_MODE = 0213;
+const int BEGIN_QUOTE = 0214;
+const int END_QUOTE = 0215;
+const int DOUBLE_QUOTE = 0216;
+const int INPUT_NO_BREAK_SPACE = 0240;
+const int INPUT_SOFT_HYPHEN= 0255;
+
+#else /* IS_EBCDIC_HOST */
+
+const int INPUT_DELETE = 007;
+
+const int ESCAPE_QUESTION = 010;
+const int BEGIN_TRAP = 011;
+const int END_TRAP = 013;
+const int PAGE_EJECTOR = 015;
+const int ESCAPE_NEWLINE = 016;
+const int ESCAPE_AMPERSAND = 017;
+const int ESCAPE_UNDERSCORE = 020;
+const int ESCAPE_BAR = 021;
+const int ESCAPE_CIRCUMFLEX = 022;
+const int ESCAPE_LEFT_BRACE = 023;
+const int ESCAPE_RIGHT_BRACE = 024;
+const int ESCAPE_LEFT_QUOTE = 027;
+const int ESCAPE_RIGHT_QUOTE = 030;
+const int ESCAPE_HYPHEN = 031;
+const int ESCAPE_BANG = 032;
+const int ESCAPE_c = 033;
+const int ESCAPE_e = 034;
+const int ESCAPE_PERCENT = 035;
+const int ESCAPE_SPACE = 036;
+
+const int TITLE_REQUEST = 060;
+const int COPY_FILE_REQUEST = 061;
+const int TRANSPARENT_FILE_REQUEST = 062;
+#ifdef COLUMN
+const int VJUSTIFY_REQUEST = 063;
+#endif /* COLUMN */
+const int ESCAPE_E = 064;
+const int LAST_PAGE_EJECTOR = 065;
+const int ESCAPE_RIGHT_PARENTHESIS = 066;
+const int ESCAPE_TILDE = 067;
+const int ESCAPE_COLON = 070;
+const int PUSH_GROFF_MODE = 071;
+const int PUSH_COMP_MODE = 072;
+const int POP_GROFFCOMP_MODE = 073;
+const int BEGIN_QUOTE = 074;
+const int END_QUOTE = 075;
+const int DOUBLE_QUOTE = 076;
+
+const int INPUT_NO_BREAK_SPACE = 0101;
+const int INPUT_SOFT_HYPHEN= 0312;
+
+#endif /* IS_EBCDIC_HOST */
+
+extern void do_glyph_color(symbol);
+extern void do_fill_color(symbol);
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/roff/troff/mtsm.cpp b/src/roff/troff/mtsm.cpp
new file mode 100644
index 0000000..058b9b1
--- /dev/null
+++ b/src/roff/troff/mtsm.cpp
@@ -0,0 +1,651 @@
+/* Copyright (C) 2003-2020 Free Software Foundation, Inc.
+ Written by Gaius Mulley (gaius@glam.ac.uk)
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+// mtsm: minimum troff state machine
+
+extern int debug_state;
+
+#include "troff.h"
+#include "hvunits.h"
+#include "stringclass.h"
+#include "mtsm.h"
+#include "env.h"
+
+#if defined(DEBUGGING)
+static int no_of_statems = 0;
+#endif
+
+int_value::int_value()
+: value(0), is_known(0)
+{
+}
+
+int_value::~int_value()
+{
+}
+
+void int_value::diff(FILE *fp, const char *s, int_value compare)
+{
+ if (differs(compare)) {
+ fputs("x X ", fp);
+ fputs(s, fp);
+ fputs(" ", fp);
+ fputs(i_to_a(compare.value), fp);
+ fputs("\n", fp);
+ value = compare.value;
+ is_known = 1;
+ if (debug_state)
+ fflush(fp);
+ }
+}
+
+void int_value::set(int v)
+{
+ is_known = 1;
+ value = v;
+}
+
+void int_value::unset()
+{
+ is_known = 0;
+}
+
+void int_value::set_if_unknown(int v)
+{
+ if (!is_known)
+ set(v);
+}
+
+int int_value::differs(int_value compare)
+{
+ return compare.is_known
+ && (!is_known || value != compare.value);
+}
+
+bool_value::bool_value()
+{
+}
+
+bool_value::~bool_value()
+{
+}
+
+void bool_value::diff(FILE *fp, const char *s, bool_value compare)
+{
+ if (differs(compare)) {
+ fputs("x X ", fp);
+ fputs(s, fp);
+ fputs("\n", fp);
+ value = compare.value;
+ is_known = 1;
+ if (debug_state)
+ fflush(fp);
+ }
+}
+
+units_value::units_value()
+{
+}
+
+units_value::~units_value()
+{
+}
+
+void units_value::diff(FILE *fp, const char *s, units_value compare)
+{
+ if (differs(compare)) {
+ fputs("x X ", fp);
+ fputs(s, fp);
+ fputs(" ", fp);
+ fputs(i_to_a(compare.value), fp);
+ fputs("\n", fp);
+ value = compare.value;
+ is_known = 1;
+ if (debug_state)
+ fflush(fp);
+ }
+}
+
+void units_value::set(hunits v)
+{
+ is_known = 1;
+ value = v.to_units();
+}
+
+int units_value::differs(units_value compare)
+{
+ return compare.is_known
+ && (!is_known || value != compare.value);
+}
+
+string_value::string_value()
+: value(string("")), is_known(0)
+{
+}
+
+string_value::~string_value()
+{
+}
+
+void string_value::diff(FILE *fp, const char *s, string_value compare)
+{
+ if (differs(compare)) {
+ fputs("x X ", fp);
+ fputs(s, fp);
+ fputs(" ", fp);
+ fputs(compare.value.contents(), fp);
+ fputs("\n", fp);
+ value = compare.value;
+ is_known = 1;
+ }
+}
+
+void string_value::set(string v)
+{
+ is_known = 1;
+ value = v;
+}
+
+void string_value::unset()
+{
+ is_known = 0;
+}
+
+int string_value::differs(string_value compare)
+{
+ return compare.is_known
+ && (!is_known || value != compare.value);
+}
+
+statem::statem()
+{
+#if defined(DEBUGGING)
+ issue_no = no_of_statems;
+ no_of_statems++;
+#endif
+}
+
+statem::statem(statem *copy)
+{
+ int i;
+ for (i = 0; i < LAST_BOOL; i++)
+ bool_values[i] = copy->bool_values[i];
+ for (i = 0; i < LAST_INT; i++)
+ int_values[i] = copy->int_values[i];
+ for (i = 0; i < LAST_UNITS; i++)
+ units_values[i] = copy->units_values[i];
+ for (i = 0; i < LAST_STRING; i++)
+ string_values[i] = copy->string_values[i];
+#if defined(DEBUGGING)
+ issue_no = copy->issue_no;
+#endif
+}
+
+statem::~statem()
+{
+}
+
+void statem::flush(FILE *fp, statem *compare)
+{
+ int_values[MTSM_FI].diff(fp, "devtag:.fi",
+ compare->int_values[MTSM_FI]);
+ int_values[MTSM_RJ].diff(fp, "devtag:.rj",
+ compare->int_values[MTSM_RJ]);
+ int_values[MTSM_SP].diff(fp, "devtag:.sp",
+ compare->int_values[MTSM_SP]);
+ units_values[MTSM_IN].diff(fp, "devtag:.in",
+ compare->units_values[MTSM_IN]);
+ units_values[MTSM_LL].diff(fp, "devtag:.ll",
+ compare->units_values[MTSM_LL]);
+ units_values[MTSM_PO].diff(fp, "devtag:.po",
+ compare->units_values[MTSM_PO]);
+ string_values[MTSM_TA].diff(fp, "devtag:.ta",
+ compare->string_values[MTSM_TA]);
+ units_values[MTSM_TI].diff(fp, "devtag:.ti",
+ compare->units_values[MTSM_TI]);
+ int_values[MTSM_CE].diff(fp, "devtag:.ce",
+ compare->int_values[MTSM_CE]);
+ bool_values[MTSM_EOL].diff(fp, "devtag:.eol",
+ compare->bool_values[MTSM_EOL]);
+ bool_values[MTSM_BR].diff(fp, "devtag:.br",
+ compare->bool_values[MTSM_BR]);
+#if defined(DEBUGGING)
+ if (debug_state) {
+ fprintf(stderr, "compared state %d\n", compare->issue_no);
+ fflush(stderr);
+ }
+#endif
+}
+
+void statem::add_tag(int_value_state t, int v)
+{
+ int_values[t].set(v);
+}
+
+void statem::add_tag(units_value_state t, hunits v)
+{
+ units_values[t].set(v);
+}
+
+void statem::add_tag(bool_value_state t)
+{
+ bool_values[t].set(1);
+}
+
+void statem::add_tag(string_value_state t, string v)
+{
+ string_values[t].set(v);
+}
+
+void statem::add_tag_if_unknown(int_value_state t, int v)
+{
+ int_values[t].set_if_unknown(v);
+}
+
+void statem::sub_tag_ce()
+{
+ int_values[MTSM_CE].unset();
+}
+
+/*
+ * add_tag_ta - add the tab settings to the minimum troff state machine
+ */
+
+void statem::add_tag_ta()
+{
+ if (is_html) {
+ string s = string("");
+ hunits d, l;
+ enum tab_type t;
+ do {
+ t = curenv->tabs.distance_to_next_tab(l, &d);
+ l += d;
+ switch (t) {
+ case TAB_LEFT:
+ s += " L ";
+ s += as_string(l.to_units());
+ break;
+ case TAB_CENTER:
+ s += " C ";
+ s += as_string(l.to_units());
+ break;
+ case TAB_RIGHT:
+ s += " R ";
+ s += as_string(l.to_units());
+ break;
+ case TAB_NONE:
+ break;
+ }
+ } while (t != TAB_NONE && l < curenv->get_line_length());
+ s += '\0';
+ string_values[MTSM_TA].set(s);
+ }
+}
+
+void statem::update(statem *older, statem *newer, int_value_state t)
+{
+ if (newer->int_values[t].differs(older->int_values[t])
+ && !newer->int_values[t].is_known)
+ newer->int_values[t].set(older->int_values[t].value);
+}
+
+void statem::update(statem *older, statem *newer, units_value_state t)
+{
+ if (newer->units_values[t].differs(older->units_values[t])
+ && !newer->units_values[t].is_known)
+ newer->units_values[t].set(older->units_values[t].value);
+}
+
+void statem::update(statem *older, statem *newer, bool_value_state t)
+{
+ if (newer->bool_values[t].differs(older->bool_values[t])
+ && !newer->bool_values[t].is_known)
+ newer->bool_values[t].set(older->bool_values[t].value);
+}
+
+void statem::update(statem *older, statem *newer, string_value_state t)
+{
+ if (newer->string_values[t].differs(older->string_values[t])
+ && !newer->string_values[t].is_known)
+ newer->string_values[t].set(older->string_values[t].value);
+}
+
+void statem::merge(statem *newer, statem *older)
+{
+ if (newer == 0 || older == 0)
+ return;
+ update(older, newer, MTSM_EOL);
+ update(older, newer, MTSM_BR);
+ update(older, newer, MTSM_FI);
+ update(older, newer, MTSM_LL);
+ update(older, newer, MTSM_PO);
+ update(older, newer, MTSM_RJ);
+ update(older, newer, MTSM_SP);
+ update(older, newer, MTSM_TA);
+ update(older, newer, MTSM_TI);
+ update(older, newer, MTSM_CE);
+}
+
+stack::stack()
+: next(0), state(0)
+{
+}
+
+stack::stack(statem *s, stack *n)
+: next(n), state(s)
+{
+}
+
+stack::~stack()
+{
+ if (state)
+ delete state;
+ if (next)
+ delete next;
+}
+
+mtsm::mtsm()
+: sp(0)
+{
+ driver = new statem();
+}
+
+mtsm::~mtsm()
+{
+ delete driver;
+ if (sp)
+ delete sp;
+}
+
+/*
+ * push_state - push the current troff state and use 'n' as
+ * the new troff state.
+ */
+
+void mtsm::push_state(statem *n)
+{
+ if (is_html) {
+#if defined(DEBUGGING)
+ if (debug_state) {
+ fprintf(stderr, "--> state %d pushed\n", n->issue_no);
+ fflush(stderr);
+ }
+#endif
+ sp = new stack(n, sp);
+ }
+}
+
+void mtsm::pop_state()
+{
+ if (is_html) {
+#if defined(DEBUGGING)
+ if (debug_state) {
+ fprintf(stderr, "--> state popped\n");
+ fflush(stderr);
+ }
+#endif
+ if (sp == 0)
+ fatal("empty state machine stack");
+ sp->state = 0;
+ stack *t = sp;
+ sp = sp->next;
+ t->next = 0;
+ delete t;
+ }
+}
+
+/*
+ * inherit - scan the stack and collects inherited values.
+ */
+
+void mtsm::inherit(statem *s, int reset_bool)
+{
+ if (sp && sp->state) {
+ if (s->units_values[MTSM_IN].is_known
+ && sp->state->units_values[MTSM_IN].is_known)
+ s->units_values[MTSM_IN].value += sp->state->units_values[MTSM_IN].value;
+ s->update(sp->state, s, MTSM_FI);
+ s->update(sp->state, s, MTSM_LL);
+ s->update(sp->state, s, MTSM_PO);
+ s->update(sp->state, s, MTSM_RJ);
+ s->update(sp->state, s, MTSM_TA);
+ s->update(sp->state, s, MTSM_TI);
+ s->update(sp->state, s, MTSM_CE);
+ if (sp->state->bool_values[MTSM_BR].is_known
+ && sp->state->bool_values[MTSM_BR].value) {
+ if (reset_bool)
+ sp->state->bool_values[MTSM_BR].set(0);
+ s->bool_values[MTSM_BR].set(1);
+#if defined(DEBUGGING)
+ if (debug_state)
+ fprintf(stderr, "inherited br from pushed state %d\n",
+ sp->state->issue_no);
+#endif
+ }
+ else if (s->bool_values[MTSM_BR].is_known
+ && s->bool_values[MTSM_BR].value)
+ if (! s->int_values[MTSM_CE].is_known)
+ s->bool_values[MTSM_BR].unset();
+ if (sp->state->bool_values[MTSM_EOL].is_known
+ && sp->state->bool_values[MTSM_EOL].value) {
+ if (reset_bool)
+ sp->state->bool_values[MTSM_EOL].set(0);
+ s->bool_values[MTSM_EOL].set(1);
+ }
+ }
+}
+
+void mtsm::flush(FILE *fp, statem *s, string tag_list)
+{
+ if (is_html && s) {
+ inherit(s, 1);
+ driver->flush(fp, s);
+ // Set rj, ce, ti to unknown if they were known and
+ // we have seen an eol or br. This ensures that these values
+ // are emitted during the next glyph (as they step from n..0
+ // at each newline).
+ if ((driver->bool_values[MTSM_EOL].is_known
+ && driver->bool_values[MTSM_EOL].value)
+ || (driver->bool_values[MTSM_BR].is_known
+ && driver->bool_values[MTSM_BR].value)) {
+ if (driver->units_values[MTSM_TI].is_known)
+ driver->units_values[MTSM_TI].is_known = 0;
+ if (driver->int_values[MTSM_RJ].is_known
+ && driver->int_values[MTSM_RJ].value > 0)
+ driver->int_values[MTSM_RJ].is_known = 0;
+ if (driver->int_values[MTSM_CE].is_known
+ && driver->int_values[MTSM_CE].value > 0)
+ driver->int_values[MTSM_CE].is_known = 0;
+ }
+ // reset the boolean values
+ driver->bool_values[MTSM_BR].set(0);
+ driver->bool_values[MTSM_EOL].set(0);
+ // reset space value
+ driver->int_values[MTSM_SP].set(0);
+ // lastly write out any direct tag entries
+ if (tag_list != string("")) {
+ string t = tag_list + '\0';
+ fputs(t.contents(), fp);
+ }
+ }
+}
+
+/*
+ * display_state - dump out a synopsis of the state to stderr.
+ */
+
+void statem::display_state()
+{
+ fprintf(stderr, " <state ");
+ if (bool_values[MTSM_BR].is_known) {
+ if (bool_values[MTSM_BR].value)
+ fprintf(stderr, "[br]");
+ else
+ fprintf(stderr, "[!br]");
+ }
+ if (bool_values[MTSM_EOL].is_known) {
+ if (bool_values[MTSM_EOL].value)
+ fprintf(stderr, "[eol]");
+ else
+ fprintf(stderr, "[!eol]");
+ }
+ if (int_values[MTSM_SP].is_known) {
+ if (int_values[MTSM_SP].value)
+ fprintf(stderr, "[sp %d]", int_values[MTSM_SP].value);
+ else
+ fprintf(stderr, "[!sp]");
+ }
+ fprintf(stderr, ">");
+ fflush(stderr);
+}
+
+int mtsm::has_changed(int_value_state t, statem *s)
+{
+ return driver->int_values[t].differs(s->int_values[t]);
+}
+
+int mtsm::has_changed(units_value_state t, statem *s)
+{
+ return driver->units_values[t].differs(s->units_values[t]);
+}
+
+int mtsm::has_changed(bool_value_state t, statem *s)
+{
+ return driver->bool_values[t].differs(s->bool_values[t]);
+}
+
+int mtsm::has_changed(string_value_state t, statem *s)
+{
+ return driver->string_values[t].differs(s->string_values[t]);
+}
+
+int mtsm::changed(statem *s)
+{
+ if (s == 0 || !is_html)
+ return 0;
+ s = new statem(s);
+ inherit(s, 0);
+ int result = has_changed(MTSM_EOL, s)
+ || has_changed(MTSM_BR, s)
+ || has_changed(MTSM_FI, s)
+ || has_changed(MTSM_IN, s)
+ || has_changed(MTSM_LL, s)
+ || has_changed(MTSM_PO, s)
+ || has_changed(MTSM_RJ, s)
+ || has_changed(MTSM_SP, s)
+ || has_changed(MTSM_TA, s)
+ || has_changed(MTSM_CE, s);
+ delete s;
+ return result;
+}
+
+void mtsm::add_tag(FILE *fp, string s)
+{
+ fflush(fp);
+ s += '\0';
+ fputs(s.contents(), fp);
+}
+
+/*
+ * state_set class
+ */
+
+state_set::state_set()
+: boolset(0), intset(0), unitsset(0), stringset(0)
+{
+}
+
+state_set::~state_set()
+{
+}
+
+void state_set::incl(bool_value_state b)
+{
+ boolset |= 1 << (int)b;
+}
+
+void state_set::incl(int_value_state i)
+{
+ intset |= 1 << (int)i;
+}
+
+void state_set::incl(units_value_state u)
+{
+ unitsset |= 1 << (int)u;
+}
+
+void state_set::incl(string_value_state s)
+{
+ stringset |= 1 << (int)s;
+}
+
+void state_set::excl(bool_value_state b)
+{
+ boolset &= ~(1 << (int)b);
+}
+
+void state_set::excl(int_value_state i)
+{
+ intset &= ~(1 << (int)i);
+}
+
+void state_set::excl(units_value_state u)
+{
+ unitsset &= ~(1 << (int)u);
+}
+
+void state_set::excl(string_value_state s)
+{
+ stringset &= ~(1 << (int)s);
+}
+
+int state_set::is_in(bool_value_state b)
+{
+ return (boolset & (1 << (int)b)) != 0;
+}
+
+int state_set::is_in(int_value_state i)
+{
+ return (intset & (1 << (int)i)) != 0;
+}
+
+int state_set::is_in(units_value_state u)
+{
+ return (unitsset & (1 << (int)u)) != 0;
+}
+
+int state_set::is_in(string_value_state s)
+{
+ return (stringset & (1 << (int)s)) != 0;
+}
+
+void state_set::add(units_value_state, int n)
+{
+ unitsset += n;
+}
+
+units state_set::val(units_value_state)
+{
+ return unitsset;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/roff/troff/mtsm.h b/src/roff/troff/mtsm.h
new file mode 100644
index 0000000..cfca73d
--- /dev/null
+++ b/src/roff/troff/mtsm.h
@@ -0,0 +1,165 @@
+// -*- C++ -*-
+/* Copyright (C) 2003-2020 Free Software Foundation, Inc.
+ *
+ * mtsm.h
+ *
+ * written by Gaius Mulley (gaius@glam.ac.uk)
+ *
+ * provides a minimal troff state machine which is necessary to
+ * emit meta tags for the post-grohtml device driver.
+ */
+
+/*
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+struct int_value {
+ int value;
+ int is_known;
+ int_value();
+ ~int_value();
+ void diff(FILE *, const char *, int_value);
+ int differs(int_value);
+ void set(int);
+ void unset();
+ void set_if_unknown(int);
+};
+
+struct bool_value : public int_value {
+ bool_value();
+ ~bool_value();
+ void diff(FILE *, const char *, bool_value);
+};
+
+struct units_value : public int_value {
+ units_value();
+ ~units_value();
+ void diff(FILE *, const char *, units_value);
+ int differs(units_value);
+ void set(hunits);
+};
+
+struct string_value {
+ string value;
+ int is_known;
+ string_value();
+ ~string_value();
+ void diff(FILE *, const char *, string_value);
+ int differs(string_value);
+ void set(string);
+ void unset();
+};
+
+enum bool_value_state {
+ MTSM_EOL,
+ MTSM_BR,
+ LAST_BOOL
+};
+enum int_value_state {
+ MTSM_FI,
+ MTSM_RJ,
+ MTSM_CE,
+ MTSM_SP,
+ LAST_INT
+};
+enum units_value_state {
+ MTSM_IN,
+ MTSM_LL,
+ MTSM_PO,
+ MTSM_TI,
+ LAST_UNITS
+};
+enum string_value_state {
+ MTSM_TA,
+ LAST_STRING
+};
+
+struct statem {
+#if defined(DEBUGGING)
+ int issue_no;
+#endif
+ bool_value bool_values[LAST_BOOL];
+ int_value int_values[LAST_INT];
+ units_value units_values[LAST_UNITS];
+ string_value string_values[LAST_STRING];
+ statem();
+ statem(statem *);
+ ~statem();
+ void flush(FILE *, statem *);
+ int changed(statem *);
+ void merge(statem *, statem *);
+ void add_tag(int_value_state, int);
+ void add_tag(bool_value_state);
+ void add_tag(units_value_state, hunits);
+ void add_tag(string_value_state, string);
+ void sub_tag_ce();
+ void add_tag_if_unknown(int_value_state, int);
+ void add_tag_ta();
+ void display_state();
+ void update(statem *, statem *, int_value_state);
+ void update(statem *, statem *, bool_value_state);
+ void update(statem *, statem *, units_value_state);
+ void update(statem *, statem *, string_value_state);
+};
+
+struct stack {
+ stack *next;
+ statem *state;
+ stack();
+ stack(statem *, stack *);
+ ~stack();
+};
+
+class mtsm {
+ statem *driver;
+ stack *sp;
+ int has_changed(int_value_state, statem *);
+ int has_changed(bool_value_state, statem *);
+ int has_changed(units_value_state, statem *);
+ int has_changed(string_value_state, statem *);
+ void inherit(statem *, int);
+public:
+ mtsm();
+ ~mtsm();
+ void push_state(statem *);
+ void pop_state();
+ void flush(FILE *, statem *, string);
+ int changed(statem *);
+ void add_tag(FILE *, string);
+};
+
+class state_set {
+ int boolset;
+ int intset;
+ int unitsset;
+ int stringset;
+public:
+ state_set();
+ ~state_set();
+ void incl(bool_value_state);
+ void incl(int_value_state);
+ void incl(units_value_state);
+ void incl(string_value_state);
+ void excl(bool_value_state);
+ void excl(int_value_state);
+ void excl(units_value_state);
+ void excl(string_value_state);
+ int is_in(bool_value_state);
+ int is_in(int_value_state);
+ int is_in(units_value_state);
+ int is_in(string_value_state);
+ void add(units_value_state, int);
+ units val(units_value_state);
+};
diff --git a/src/roff/troff/node.cpp b/src/roff/troff/node.cpp
new file mode 100644
index 0000000..d17198d
--- /dev/null
+++ b/src/roff/troff/node.cpp
@@ -0,0 +1,6656 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+extern int debug_state;
+
+#include "troff.h"
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "dictionary.h"
+#include "hvunits.h"
+#include "stringclass.h"
+#include "mtsm.h"
+#include "env.h"
+#include "request.h"
+#include "node.h"
+#include "token.h"
+#include "div.h"
+#include "reg.h"
+#include "font.h"
+#include "charinfo.h"
+#include "input.h"
+#include "geometry.h"
+
+#include "nonposix.h"
+
+#ifdef _POSIX_VERSION
+
+#include <sys/wait.h>
+
+#else /* not _POSIX_VERSION */
+
+/* traditional Unix */
+
+#define WIFEXITED(s) (((s) & 0377) == 0)
+#define WEXITSTATUS(s) (((s) >> 8) & 0377)
+#define WTERMSIG(s) ((s) & 0177)
+#define WIFSTOPPED(s) (((s) & 0377) == 0177)
+#define WSTOPSIG(s) (((s) >> 8) & 0377)
+#define WIFSIGNALED(s) (((s) & 0377) != 0 && (((s) & 0377) != 0177))
+
+#endif /* not _POSIX_VERSION */
+
+// declarations to avoid friend name injections
+class tfont;
+class tfont_spec;
+tfont *make_tfont(tfont_spec &);
+
+
+/*
+ * how many boundaries of images have been written? Useful for
+ * debugging grohtml
+ */
+
+int image_no = 0;
+static int suppress_start_page = 0;
+
+#define STORE_WIDTH 1
+
+symbol HYPHEN_SYMBOL("hy");
+
+// Character used when a hyphen is inserted at a line break.
+static charinfo *soft_hyphen_char;
+
+enum constant_space_type {
+ CONSTANT_SPACE_NONE,
+ CONSTANT_SPACE_RELATIVE,
+ CONSTANT_SPACE_ABSOLUTE
+ };
+
+struct special_font_list {
+ int n;
+ special_font_list *next;
+};
+
+special_font_list *global_special_fonts;
+static int global_ligature_mode = 1;
+static int global_kern_mode = 1;
+
+class track_kerning_function {
+ int non_zero;
+ units min_size;
+ hunits min_amount;
+ units max_size;
+ hunits max_amount;
+public:
+ track_kerning_function();
+ track_kerning_function(units, hunits, units, hunits);
+ int operator==(const track_kerning_function &);
+ int operator!=(const track_kerning_function &);
+ hunits compute(int point_size);
+};
+
+struct font_lookup_info {
+ int position;
+ int requested_position;
+ char *requested_name;
+ font_lookup_info();
+};
+
+font_lookup_info::font_lookup_info() : position(-1),
+ requested_position(-1), requested_name(0)
+{
+}
+
+// embolden fontno when this is the current font
+
+struct conditional_bold {
+ conditional_bold *next;
+ int fontno;
+ hunits offset;
+ conditional_bold(int, hunits, conditional_bold * = 0);
+};
+
+class font_info {
+ tfont *last_tfont;
+ int number;
+ font_size last_size;
+ int last_height;
+ int last_slant;
+ symbol internal_name;
+ symbol external_name;
+ font *fm;
+ char is_bold;
+ hunits bold_offset;
+ track_kerning_function track_kern;
+ constant_space_type is_constant_spaced;
+ units constant_space;
+ int last_ligature_mode;
+ int last_kern_mode;
+ conditional_bold *cond_bold_list;
+ void flush();
+public:
+ special_font_list *sf;
+ font_info(symbol, int, symbol, font *);
+ int contains(charinfo *);
+ void set_bold(hunits);
+ void unbold();
+ void set_conditional_bold(int, hunits);
+ void conditional_unbold(int);
+ void set_track_kern(track_kerning_function &);
+ void set_constant_space(constant_space_type, units = 0);
+ int is_named(symbol);
+ symbol get_name();
+ tfont *get_tfont(font_size, int, int, int);
+ hunits get_space_width(font_size, int);
+ hunits get_narrow_space_width(font_size);
+ hunits get_half_narrow_space_width(font_size);
+ int get_bold(hunits *);
+ int is_special();
+ int is_style();
+ void set_zoom(int);
+ int get_zoom();
+ friend symbol get_font_name(int, environment *);
+ friend symbol get_style_name(int);
+};
+
+class tfont_spec {
+protected:
+ symbol name;
+ int input_position;
+ font *fm;
+ font_size size;
+ char is_bold;
+ char is_constant_spaced;
+ int ligature_mode;
+ int kern_mode;
+ hunits bold_offset;
+ hunits track_kern; // add this to the width
+ hunits constant_space_width;
+ int height;
+ int slant;
+public:
+ tfont_spec(symbol, int, font *, font_size, int, int);
+ tfont_spec(const tfont_spec &spec) { *this = spec; }
+ tfont_spec plain();
+ int operator==(const tfont_spec &);
+ friend tfont *font_info::get_tfont(font_size fs, int, int, int);
+};
+
+class tfont : public tfont_spec {
+ static tfont *tfont_list;
+ tfont *next;
+ tfont *plain_version;
+public:
+ tfont(tfont_spec &);
+ int contains(charinfo *);
+ hunits get_width(charinfo *c);
+ int get_bold(hunits *);
+ int get_constant_space(hunits *);
+ hunits get_track_kern();
+ tfont *get_plain();
+ font_size get_size();
+ int get_zoom();
+ symbol get_name();
+ charinfo *get_lig(charinfo *c1, charinfo *c2);
+ int get_kern(charinfo *c1, charinfo *c2, hunits *res);
+ int get_input_position();
+ int get_character_type(charinfo *);
+ int get_height();
+ int get_slant();
+ vunits get_char_height(charinfo *);
+ vunits get_char_depth(charinfo *);
+ hunits get_char_skew(charinfo *);
+ hunits get_italic_correction(charinfo *);
+ hunits get_left_italic_correction(charinfo *);
+ hunits get_subscript_correction(charinfo *);
+ friend tfont *make_tfont(tfont_spec &);
+};
+
+inline int env_definite_font(environment *env)
+{
+ return env->get_family()->make_definite(env->get_font());
+}
+
+/* font_info functions */
+
+static font_info **font_table = 0;
+static int font_table_size = 0;
+
+font_info::font_info(symbol nm, int n, symbol enm, font *f)
+: last_tfont(0), number(n), last_size(0),
+ internal_name(nm), external_name(enm), fm(f),
+ is_bold(0), is_constant_spaced(CONSTANT_SPACE_NONE), last_ligature_mode(1),
+ last_kern_mode(1), cond_bold_list(0), sf(0)
+{
+}
+
+inline int font_info::contains(charinfo *ci)
+{
+ return fm != 0 && fm->contains(ci->as_glyph());
+}
+
+inline int font_info::is_special()
+{
+ return fm != 0 && fm->is_special();
+}
+
+inline int font_info::is_style()
+{
+ return fm == 0;
+}
+
+void font_info::set_zoom(int zoom)
+{
+ assert(fm != 0);
+ fm->set_zoom(zoom);
+}
+
+inline int font_info::get_zoom()
+{
+ if (is_style())
+ return 0;
+ return fm->get_zoom();
+}
+
+tfont *make_tfont(tfont_spec &spec)
+{
+ for (tfont *p = tfont::tfont_list; p; p = p->next)
+ if (*p == spec)
+ return p;
+ return new tfont(spec);
+}
+
+int env_get_zoom(environment *env)
+{
+ int fontno = env->get_family()->make_definite(env->get_font());
+ return font_table[fontno]->get_zoom();
+}
+
+// this is the current_font, fontno is where we found the character,
+// presumably a special font
+
+tfont *font_info::get_tfont(font_size fs, int height, int slant, int fontno)
+{
+ if (last_tfont == 0 || fs != last_size
+ || height != last_height || slant != last_slant
+ || global_ligature_mode != last_ligature_mode
+ || global_kern_mode != last_kern_mode
+ || fontno != number) {
+ font_info *f = font_table[fontno];
+ tfont_spec spec(f->external_name, f->number, f->fm, fs, height, slant);
+ for (conditional_bold *p = cond_bold_list; p; p = p->next)
+ if (p->fontno == fontno) {
+ spec.is_bold = 1;
+ spec.bold_offset = p->offset;
+ break;
+ }
+ if (!spec.is_bold && is_bold) {
+ spec.is_bold = 1;
+ spec.bold_offset = bold_offset;
+ }
+ spec.track_kern = track_kern.compute(fs.to_scaled_points());
+ spec.ligature_mode = global_ligature_mode;
+ spec.kern_mode = global_kern_mode;
+ switch (is_constant_spaced) {
+ case CONSTANT_SPACE_NONE:
+ break;
+ case CONSTANT_SPACE_ABSOLUTE:
+ spec.is_constant_spaced = 1;
+ spec.constant_space_width = constant_space;
+ break;
+ case CONSTANT_SPACE_RELATIVE:
+ spec.is_constant_spaced = 1;
+ spec.constant_space_width
+ = scale(constant_space*fs.to_scaled_points(),
+ units_per_inch,
+ 36*72*sizescale);
+ break;
+ default:
+ assert(0);
+ }
+ if (fontno != number)
+ return make_tfont(spec);
+ // save font for comparison purposes
+ last_tfont = make_tfont(spec);
+ // save font related values not contained in tfont
+ last_size = fs;
+ last_height = height;
+ last_slant = slant;
+ last_ligature_mode = global_ligature_mode;
+ last_kern_mode = global_kern_mode;
+ }
+ return last_tfont;
+}
+
+int font_info::get_bold(hunits *res)
+{
+ if (is_bold) {
+ *res = bold_offset;
+ return 1;
+ }
+ else
+ return 0;
+}
+
+void font_info::unbold()
+{
+ if (is_bold) {
+ is_bold = 0;
+ flush();
+ }
+}
+
+void font_info::set_bold(hunits offset)
+{
+ if (!is_bold || offset != bold_offset) {
+ is_bold = 1;
+ bold_offset = offset;
+ flush();
+ }
+}
+
+void font_info::set_conditional_bold(int fontno, hunits offset)
+{
+ for (conditional_bold *p = cond_bold_list; p; p = p->next)
+ if (p->fontno == fontno) {
+ if (offset != p->offset) {
+ p->offset = offset;
+ flush();
+ }
+ return;
+ }
+ cond_bold_list = new conditional_bold(fontno, offset, cond_bold_list);
+}
+
+conditional_bold::conditional_bold(int f, hunits h, conditional_bold *x)
+: next(x), fontno(f), offset(h)
+{
+}
+
+void font_info::conditional_unbold(int fontno)
+{
+ for (conditional_bold **p = &cond_bold_list; *p; p = &(*p)->next)
+ if ((*p)->fontno == fontno) {
+ conditional_bold *tem = *p;
+ *p = (*p)->next;
+ delete tem;
+ flush();
+ return;
+ }
+}
+
+void font_info::set_constant_space(constant_space_type type, units x)
+{
+ if (type != is_constant_spaced
+ || (type != CONSTANT_SPACE_NONE && x != constant_space)) {
+ flush();
+ is_constant_spaced = type;
+ constant_space = x;
+ }
+}
+
+void font_info::set_track_kern(track_kerning_function &tk)
+{
+ if (track_kern != tk) {
+ track_kern = tk;
+ flush();
+ }
+}
+
+void font_info::flush()
+{
+ last_tfont = 0;
+}
+
+int font_info::is_named(symbol s)
+{
+ return internal_name == s;
+}
+
+symbol font_info::get_name()
+{
+ return internal_name;
+}
+
+symbol get_font_name(int fontno, environment *env)
+{
+ symbol f = font_table[fontno]->get_name();
+ if (font_table[fontno]->is_style()) {
+ return concat(env->get_family()->nm, f);
+ }
+ return f;
+}
+
+symbol get_style_name(int fontno)
+{
+ if (font_table[fontno]->is_style())
+ return font_table[fontno]->get_name();
+ else
+ return EMPTY_SYMBOL;
+}
+
+hunits font_info::get_space_width(font_size fs, int space_sz)
+{
+ if (is_constant_spaced == CONSTANT_SPACE_NONE)
+ return scale(hunits(fm->get_space_width(fs.to_scaled_points())),
+ space_sz, 12);
+ else if (is_constant_spaced == CONSTANT_SPACE_ABSOLUTE)
+ return constant_space;
+ else
+ return scale(constant_space*fs.to_scaled_points(),
+ units_per_inch, 36*72*sizescale);
+}
+
+hunits font_info::get_narrow_space_width(font_size fs)
+{
+ charinfo *ci = get_charinfo(symbol("|"));
+ if (fm->contains(ci->as_glyph()))
+ return hunits(fm->get_width(ci->as_glyph(), fs.to_scaled_points()));
+ else
+ return hunits(fs.to_units()/6);
+}
+
+hunits font_info::get_half_narrow_space_width(font_size fs)
+{
+ charinfo *ci = get_charinfo(symbol("^"));
+ if (fm->contains(ci->as_glyph()))
+ return hunits(fm->get_width(ci->as_glyph(), fs.to_scaled_points()));
+ else
+ return hunits(fs.to_units()/12);
+}
+
+/* tfont */
+
+tfont_spec::tfont_spec(symbol nm, int n, font *f,
+ font_size s, int h, int sl)
+: name(nm), input_position(n), fm(f), size(s),
+ is_bold(0), is_constant_spaced(0), ligature_mode(1), kern_mode(1),
+ height(h), slant(sl)
+{
+ if (height == size.to_scaled_points())
+ height = 0;
+}
+
+int tfont_spec::operator==(const tfont_spec &spec)
+{
+ if (fm == spec.fm
+ && size == spec.size
+ && input_position == spec.input_position
+ && name == spec.name
+ && height == spec.height
+ && slant == spec.slant
+ && (is_bold
+ ? (spec.is_bold && bold_offset == spec.bold_offset)
+ : !spec.is_bold)
+ && track_kern == spec.track_kern
+ && (is_constant_spaced
+ ? (spec.is_constant_spaced
+ && constant_space_width == spec.constant_space_width)
+ : !spec.is_constant_spaced)
+ && ligature_mode == spec.ligature_mode
+ && kern_mode == spec.kern_mode)
+ return 1;
+ else
+ return 0;
+}
+
+tfont_spec tfont_spec::plain()
+{
+ return tfont_spec(name, input_position, fm, size, height, slant);
+}
+
+hunits tfont::get_width(charinfo *c)
+{
+ if (is_constant_spaced)
+ return constant_space_width;
+ else if (is_bold)
+ return (hunits(fm->get_width(c->as_glyph(), size.to_scaled_points()))
+ + track_kern + bold_offset);
+ else
+ return (hunits(fm->get_width(c->as_glyph(), size.to_scaled_points()))
+ + track_kern);
+}
+
+vunits tfont::get_char_height(charinfo *c)
+{
+ vunits v = fm->get_height(c->as_glyph(), size.to_scaled_points());
+ if (height != 0 && height != size.to_scaled_points())
+ return scale(v, height, size.to_scaled_points());
+ else
+ return v;
+}
+
+vunits tfont::get_char_depth(charinfo *c)
+{
+ vunits v = fm->get_depth(c->as_glyph(), size.to_scaled_points());
+ if (height != 0 && height != size.to_scaled_points())
+ return scale(v, height, size.to_scaled_points());
+ else
+ return v;
+}
+
+hunits tfont::get_char_skew(charinfo *c)
+{
+ return hunits(fm->get_skew(c->as_glyph(), size.to_scaled_points(), slant));
+}
+
+hunits tfont::get_italic_correction(charinfo *c)
+{
+ return hunits(fm->get_italic_correction(c->as_glyph(), size.to_scaled_points()));
+}
+
+hunits tfont::get_left_italic_correction(charinfo *c)
+{
+ return hunits(fm->get_left_italic_correction(c->as_glyph(),
+ size.to_scaled_points()));
+}
+
+hunits tfont::get_subscript_correction(charinfo *c)
+{
+ return hunits(fm->get_subscript_correction(c->as_glyph(),
+ size.to_scaled_points()));
+}
+
+inline int tfont::get_input_position()
+{
+ return input_position;
+}
+
+inline int tfont::contains(charinfo *ci)
+{
+ return fm->contains(ci->as_glyph());
+}
+
+inline int tfont::get_character_type(charinfo *ci)
+{
+ return fm->get_character_type(ci->as_glyph());
+}
+
+inline int tfont::get_bold(hunits *res)
+{
+ if (is_bold) {
+ *res = bold_offset;
+ return 1;
+ }
+ else
+ return 0;
+}
+
+inline int tfont::get_constant_space(hunits *res)
+{
+ if (is_constant_spaced) {
+ *res = constant_space_width;
+ return 1;
+ }
+ else
+ return 0;
+}
+
+inline hunits tfont::get_track_kern()
+{
+ return track_kern;
+}
+
+inline tfont *tfont::get_plain()
+{
+ return plain_version;
+}
+
+inline font_size tfont::get_size()
+{
+ return size;
+}
+
+inline int tfont::get_zoom()
+{
+ return fm->get_zoom();
+}
+
+inline symbol tfont::get_name()
+{
+ return name;
+}
+
+inline int tfont::get_height()
+{
+ return height;
+}
+
+inline int tfont::get_slant()
+{
+ return slant;
+}
+
+symbol SYMBOL_ff("ff");
+symbol SYMBOL_fi("fi");
+symbol SYMBOL_fl("fl");
+symbol SYMBOL_Fi("Fi");
+symbol SYMBOL_Fl("Fl");
+
+charinfo *tfont::get_lig(charinfo *c1, charinfo *c2)
+{
+ if (ligature_mode == 0)
+ return 0;
+ charinfo *ci = 0;
+ if (c1->get_ascii_code() == 'f') {
+ switch (c2->get_ascii_code()) {
+ case 'f':
+ if (fm->has_ligature(font::LIG_ff))
+ ci = get_charinfo(SYMBOL_ff);
+ break;
+ case 'i':
+ if (fm->has_ligature(font::LIG_fi))
+ ci = get_charinfo(SYMBOL_fi);
+ break;
+ case 'l':
+ if (fm->has_ligature(font::LIG_fl))
+ ci = get_charinfo(SYMBOL_fl);
+ break;
+ }
+ }
+ else if (ligature_mode != 2 && c1->nm == SYMBOL_ff) {
+ switch (c2->get_ascii_code()) {
+ case 'i':
+ if (fm->has_ligature(font::LIG_ffi))
+ ci = get_charinfo(SYMBOL_Fi);
+ break;
+ case 'l':
+ if (fm->has_ligature(font::LIG_ffl))
+ ci = get_charinfo(SYMBOL_Fl);
+ break;
+ }
+ }
+ if (ci != 0 && fm->contains(ci->as_glyph()))
+ return ci;
+ return 0;
+}
+
+inline int tfont::get_kern(charinfo *c1, charinfo *c2, hunits *res)
+{
+ if (kern_mode == 0)
+ return 0;
+ else {
+ int n = fm->get_kern(c1->as_glyph(),
+ c2->as_glyph(),
+ size.to_scaled_points());
+ if (n) {
+ *res = hunits(n);
+ return 1;
+ }
+ else
+ return 0;
+ }
+}
+
+tfont *tfont::tfont_list = 0;
+
+tfont::tfont(tfont_spec &spec) : tfont_spec(spec)
+{
+ next = tfont_list;
+ tfont_list = this;
+ tfont_spec plain_spec = plain();
+ tfont *p;
+ for (p = tfont_list; p; p = p->next)
+ if (*p == plain_spec) {
+ plain_version = p;
+ break;
+ }
+ if (!p)
+ plain_version = new tfont(plain_spec);
+}
+
+/* output_file */
+
+class real_output_file : public output_file {
+#ifndef POPEN_MISSING
+ int piped;
+#endif
+ int printing; // decision via optional page list
+ int output_on; // \O[0] or \O[1] escape sequences
+ virtual void really_transparent_char(unsigned char) = 0;
+ virtual void really_print_line(hunits x, vunits y, node *n,
+ vunits before, vunits after, hunits width) = 0;
+ virtual void really_begin_page(int pageno, vunits page_length) = 0;
+ virtual void really_copy_file(hunits x, vunits y, const char *filename);
+ virtual void really_put_filename(const char *, int);
+ virtual void really_on();
+ virtual void really_off();
+public:
+ FILE *fp;
+ real_output_file();
+ ~real_output_file();
+ void flush();
+ void transparent_char(unsigned char);
+ void print_line(hunits x, vunits y, node *n, vunits before, vunits after, hunits width);
+ void begin_page(int pageno, vunits page_length);
+ void put_filename(const char *, int);
+ void on();
+ void off();
+ int is_on();
+ int is_printing();
+ void copy_file(hunits x, vunits y, const char *filename);
+};
+
+class suppress_output_file : public real_output_file {
+public:
+ suppress_output_file();
+ void really_transparent_char(unsigned char);
+ void really_print_line(hunits x, vunits y, node *n, vunits, vunits, hunits width);
+ void really_begin_page(int pageno, vunits page_length);
+};
+
+class ascii_output_file : public real_output_file {
+public:
+ ascii_output_file();
+ void really_transparent_char(unsigned char);
+ void really_print_line(hunits x, vunits y, node *n, vunits, vunits, hunits width);
+ void really_begin_page(int pageno, vunits page_length);
+ void outc(unsigned char c);
+ void outs(const char *s);
+};
+
+void ascii_output_file::outc(unsigned char c)
+{
+ fputc(c, fp);
+}
+
+void ascii_output_file::outs(const char *s)
+{
+ fputc('<', fp);
+ if (s)
+ fputs(s, fp);
+ fputc('>', fp);
+}
+
+struct hvpair;
+
+class troff_output_file : public real_output_file {
+ units hpos;
+ units vpos;
+ units output_vpos;
+ units output_hpos;
+ int force_motion;
+ int current_size;
+ int current_slant;
+ int current_height;
+ tfont *current_tfont;
+ color *current_fill_color;
+ color *current_glyph_color;
+ int current_font_number;
+ symbol *font_position;
+ int nfont_positions;
+ enum { TBUF_SIZE = 256 };
+ char tbuf[TBUF_SIZE];
+ int tbuf_len;
+ int tbuf_kern;
+ int begun_page;
+ int cur_div_level;
+ string tag_list;
+ void do_motion();
+ void put(char c);
+ void put(unsigned char c);
+ void put(int i);
+ void put(unsigned int i);
+ void put(const char *s);
+ void set_font(tfont *tf);
+ void flush_tbuf();
+public:
+ troff_output_file();
+ ~troff_output_file();
+ void trailer(vunits page_length);
+ void put_char(charinfo *, tfont *, color *, color *);
+ void put_char_width(charinfo *, tfont *, color *, color *, hunits, hunits);
+ void right(hunits);
+ void down(vunits);
+ void moveto(hunits, vunits);
+ void start_special(tfont *, color *, color *, int = 0);
+ void start_special();
+ void special_char(unsigned char c);
+ void end_special();
+ void word_marker();
+ void really_transparent_char(unsigned char c);
+ void really_print_line(hunits x, vunits y, node *n, vunits before, vunits after, hunits width);
+ void really_begin_page(int pageno, vunits page_length);
+ void really_copy_file(hunits x, vunits y, const char *filename);
+ void really_put_filename(const char *, int);
+ void really_on();
+ void really_off();
+ void draw(char, hvpair *, int, font_size, color *, color *);
+ void determine_line_limits (char code, hvpair *point, int npoints);
+ void check_charinfo(tfont *tf, charinfo *ci);
+ void glyph_color(color *c);
+ void fill_color(color *c);
+ int get_hpos() { return hpos; }
+ int get_vpos() { return vpos; }
+ void add_to_tag_list(string s);
+ friend void space_char_hmotion_node::tprint(troff_output_file *);
+ friend void unbreakable_space_node::tprint(troff_output_file *);
+};
+
+static void put_string(const char *s, FILE *fp)
+{
+ for (; *s != '\0'; ++s)
+ putc(*s, fp);
+}
+
+inline void troff_output_file::put(char c)
+{
+ putc(c, fp);
+}
+
+inline void troff_output_file::put(unsigned char c)
+{
+ putc(c, fp);
+}
+
+inline void troff_output_file::put(const char *s)
+{
+ put_string(s, fp);
+}
+
+inline void troff_output_file::put(int i)
+{
+ put_string(i_to_a(i), fp);
+}
+
+inline void troff_output_file::put(unsigned int i)
+{
+ put_string(ui_to_a(i), fp);
+}
+
+void troff_output_file::start_special(tfont *tf, color *gcol, color *fcol,
+ int no_init_string)
+{
+ set_font(tf);
+ glyph_color(gcol);
+ fill_color(fcol);
+ flush_tbuf();
+ do_motion();
+ if (!no_init_string)
+ put("x X ");
+}
+
+void troff_output_file::start_special()
+{
+ flush_tbuf();
+ do_motion();
+ put("x X ");
+}
+
+void troff_output_file::special_char(unsigned char c)
+{
+ put(c);
+ if (c == '\n')
+ put('+');
+}
+
+void troff_output_file::end_special()
+{
+ put('\n');
+}
+
+inline void troff_output_file::moveto(hunits h, vunits v)
+{
+ hpos = h.to_units();
+ vpos = v.to_units();
+}
+
+void troff_output_file::really_print_line(hunits x, vunits y, node *n,
+ vunits before, vunits after, hunits)
+{
+ moveto(x, y);
+ while (n != 0) {
+ // Check whether we should push the current troff state and use
+ // the state at the start of the invocation of this diversion.
+ if (n->div_nest_level > cur_div_level && n->push_state) {
+ state.push_state(n->push_state);
+ cur_div_level = n->div_nest_level;
+ }
+ // Has the current diversion level decreased? Then we must pop the
+ // troff state.
+ while (n->div_nest_level < cur_div_level) {
+ state.pop_state();
+ cur_div_level = n->div_nest_level;
+ }
+ // Now check whether the state has changed.
+ if ((is_on() || n->force_tprint())
+ && (state.changed(n->state) || n->is_tag() || n->is_special)) {
+ flush_tbuf();
+ do_motion();
+ force_motion = 1;
+ flush();
+ state.flush(fp, n->state, tag_list);
+ tag_list = string("");
+ flush();
+ }
+ n->tprint(this);
+ n = n->next;
+ }
+ flush_tbuf();
+ // This ensures that transparent throughput will have a more predictable
+ // position.
+ do_motion();
+ force_motion = 1;
+ hpos = 0;
+ put('n');
+ put(before.to_units());
+ put(' ');
+ put(after.to_units());
+ put('\n');
+}
+
+inline void troff_output_file::word_marker()
+{
+ flush_tbuf();
+ if (is_on())
+ put('w');
+}
+
+inline void troff_output_file::right(hunits n)
+{
+ hpos += n.to_units();
+}
+
+inline void troff_output_file::down(vunits n)
+{
+ vpos += n.to_units();
+}
+
+void troff_output_file::do_motion()
+{
+ if (force_motion) {
+ put('V');
+ put(vpos);
+ put('\n');
+ put('H');
+ put(hpos);
+ put('\n');
+ }
+ else {
+ if (hpos != output_hpos) {
+ units n = hpos - output_hpos;
+ if (n > 0 && n < hpos) {
+ put('h');
+ put(n);
+ }
+ else {
+ put('H');
+ put(hpos);
+ }
+ put('\n');
+ }
+ if (vpos != output_vpos) {
+ units n = vpos - output_vpos;
+ if (n > 0 && n < vpos) {
+ put('v');
+ put(n);
+ }
+ else {
+ put('V');
+ put(vpos);
+ }
+ put('\n');
+ }
+ }
+ output_vpos = vpos;
+ output_hpos = hpos;
+ force_motion = 0;
+}
+
+void troff_output_file::flush_tbuf()
+{
+ if (!is_on()) {
+ tbuf_len = 0;
+ return;
+ }
+
+ if (tbuf_len == 0)
+ return;
+ if (tbuf_kern == 0)
+ put('t');
+ else {
+ put('u');
+ put(tbuf_kern);
+ put(' ');
+ }
+ check_output_limits(hpos, vpos);
+ check_output_limits(hpos, vpos - current_size);
+
+ for (int i = 0; i < tbuf_len; i++)
+ put(tbuf[i]);
+ put('\n');
+ tbuf_len = 0;
+}
+
+void troff_output_file::check_charinfo(tfont *tf, charinfo *ci)
+{
+ if (!is_on())
+ return;
+
+ int height = tf->get_char_height(ci).to_units();
+ int width = tf->get_width(ci).to_units()
+ + tf->get_italic_correction(ci).to_units();
+ int depth = tf->get_char_depth(ci).to_units();
+ check_output_limits(output_hpos, output_vpos - height);
+ check_output_limits(output_hpos + width, output_vpos + depth);
+}
+
+void troff_output_file::put_char_width(charinfo *ci, tfont *tf,
+ color *gcol, color *fcol,
+ hunits w, hunits k)
+{
+ int kk = k.to_units();
+ if (!is_on()) {
+ flush_tbuf();
+ hpos += w.to_units() + kk;
+ return;
+ }
+ set_font(tf);
+ unsigned char c = ci->get_ascii_code();
+ if (c == '\0') {
+ glyph_color(gcol);
+ fill_color(fcol);
+ flush_tbuf();
+ do_motion();
+ check_charinfo(tf, ci);
+ if (ci->numbered()) {
+ put('N');
+ put(ci->get_number());
+ }
+ else {
+ put('C');
+ const char *s = ci->nm.contents();
+ if (s[1] == 0) {
+ put('\\');
+ put(s[0]);
+ }
+ else
+ put(s);
+ }
+ put('\n');
+ hpos += w.to_units() + kk;
+ }
+ else if (device_has_tcommand) {
+ if (tbuf_len > 0 && hpos == output_hpos && vpos == output_vpos
+ && (!gcol || gcol == current_glyph_color)
+ && (!fcol || fcol == current_fill_color)
+ && kk == tbuf_kern
+ && tbuf_len < TBUF_SIZE) {
+ check_charinfo(tf, ci);
+ tbuf[tbuf_len++] = c;
+ output_hpos += w.to_units() + kk;
+ hpos = output_hpos;
+ return;
+ }
+ glyph_color(gcol);
+ fill_color(fcol);
+ flush_tbuf();
+ do_motion();
+ check_charinfo(tf, ci);
+ tbuf[tbuf_len++] = c;
+ output_hpos += w.to_units() + kk;
+ tbuf_kern = kk;
+ hpos = output_hpos;
+ }
+ else {
+ // flush_tbuf();
+ int n = hpos - output_hpos;
+ check_charinfo(tf, ci);
+ // check_output_limits(output_hpos, output_vpos);
+ if (vpos == output_vpos
+ && (!gcol || gcol == current_glyph_color)
+ && (!fcol || fcol == current_fill_color)
+ && n > 0 && n < 100 && !force_motion) {
+ put(char(n/10 + '0'));
+ put(char(n%10 + '0'));
+ put(c);
+ output_hpos = hpos;
+ }
+ else {
+ glyph_color(gcol);
+ fill_color(fcol);
+ do_motion();
+ put('c');
+ put(c);
+ }
+ hpos += w.to_units() + kk;
+ }
+}
+
+void troff_output_file::put_char(charinfo *ci, tfont *tf,
+ color *gcol, color *fcol)
+{
+ flush_tbuf();
+ if (!is_on())
+ return;
+ set_font(tf);
+ unsigned char c = ci->get_ascii_code();
+ if (c == '\0') {
+ glyph_color(gcol);
+ fill_color(fcol);
+ flush_tbuf();
+ do_motion();
+ if (ci->numbered()) {
+ put('N');
+ put(ci->get_number());
+ }
+ else {
+ put('C');
+ const char *s = ci->nm.contents();
+ if (s[1] == 0) {
+ put('\\');
+ put(s[0]);
+ }
+ else
+ put(s);
+ }
+ put('\n');
+ }
+ else {
+ int n = hpos - output_hpos;
+ if (vpos == output_vpos
+ && (!gcol || gcol == current_glyph_color)
+ && (!fcol || fcol == current_fill_color)
+ && n > 0 && n < 100) {
+ put(char(n/10 + '0'));
+ put(char(n%10 + '0'));
+ put(c);
+ output_hpos = hpos;
+ }
+ else {
+ glyph_color(gcol);
+ fill_color(fcol);
+ flush_tbuf();
+ do_motion();
+ put('c');
+ put(c);
+ }
+ }
+}
+
+// set_font calls 'flush_tbuf' if necessary.
+
+void troff_output_file::set_font(tfont *tf)
+{
+ if (current_tfont == tf)
+ return;
+ flush_tbuf();
+ int n = tf->get_input_position();
+ symbol nm = tf->get_name();
+ if (n >= nfont_positions || font_position[n] != nm) {
+ put("x font ");
+ put(n);
+ put(' ');
+ put(nm.contents());
+ put('\n');
+ if (n >= nfont_positions) {
+ int old_nfont_positions = nfont_positions;
+ symbol *old_font_position = font_position;
+ nfont_positions *= 3;
+ nfont_positions /= 2;
+ if (nfont_positions <= n)
+ nfont_positions = n + 10;
+ font_position = new symbol[nfont_positions];
+ memcpy(font_position, old_font_position,
+ old_nfont_positions*sizeof(symbol));
+ delete[] old_font_position;
+ }
+ font_position[n] = nm;
+ }
+ if (current_font_number != n) {
+ put('f');
+ put(n);
+ put('\n');
+ current_font_number = n;
+ }
+ int zoom = tf->get_zoom();
+ int size;
+ if (zoom)
+ size = scale(tf->get_size().to_scaled_points(),
+ zoom, 1000);
+ else
+ size = tf->get_size().to_scaled_points();
+ if (current_size != size) {
+ put('s');
+ put(size);
+ put('\n');
+ current_size = size;
+ }
+ int slant = tf->get_slant();
+ if (current_slant != slant) {
+ put("x Slant ");
+ put(slant);
+ put('\n');
+ current_slant = slant;
+ }
+ int height = tf->get_height();
+ if (current_height != height) {
+ put("x Height ");
+ put(height == 0 ? current_size : height);
+ put('\n');
+ current_height = height;
+ }
+ current_tfont = tf;
+}
+
+// fill_color calls 'flush_tbuf' and 'do_motion' if necessary.
+
+void troff_output_file::fill_color(color *col)
+{
+ if (!col || current_fill_color == col)
+ return;
+ current_fill_color = col;
+ if (!color_flag)
+ return;
+ flush_tbuf();
+ do_motion();
+ put("DF");
+ unsigned int components[4];
+ color_scheme cs;
+ cs = col->get_components(components);
+ switch (cs) {
+ case DEFAULT:
+ put('d');
+ break;
+ case RGB:
+ put("r ");
+ put(Red);
+ put(' ');
+ put(Green);
+ put(' ');
+ put(Blue);
+ break;
+ case CMY:
+ put("c ");
+ put(Cyan);
+ put(' ');
+ put(Magenta);
+ put(' ');
+ put(Yellow);
+ break;
+ case CMYK:
+ put("k ");
+ put(Cyan);
+ put(' ');
+ put(Magenta);
+ put(' ');
+ put(Yellow);
+ put(' ');
+ put(Black);
+ break;
+ case GRAY:
+ put("g ");
+ put(Gray);
+ break;
+ }
+ put('\n');
+}
+
+// glyph_color calls 'flush_tbuf' and 'do_motion' if necessary.
+
+void troff_output_file::glyph_color(color *col)
+{
+ if (!col || current_glyph_color == col)
+ return;
+ current_glyph_color = col;
+ if (!color_flag)
+ return;
+ flush_tbuf();
+ // grotty doesn't like a color command if the vertical position is zero.
+ do_motion();
+ put("m");
+ unsigned int components[4];
+ color_scheme cs;
+ cs = col->get_components(components);
+ switch (cs) {
+ case DEFAULT:
+ put('d');
+ break;
+ case RGB:
+ put("r ");
+ put(Red);
+ put(' ');
+ put(Green);
+ put(' ');
+ put(Blue);
+ break;
+ case CMY:
+ put("c ");
+ put(Cyan);
+ put(' ');
+ put(Magenta);
+ put(' ');
+ put(Yellow);
+ break;
+ case CMYK:
+ put("k ");
+ put(Cyan);
+ put(' ');
+ put(Magenta);
+ put(' ');
+ put(Yellow);
+ put(' ');
+ put(Black);
+ break;
+ case GRAY:
+ put("g ");
+ put(Gray);
+ break;
+ }
+ put('\n');
+}
+
+void troff_output_file::add_to_tag_list(string s)
+{
+ if (tag_list == string(""))
+ tag_list = s;
+ else {
+ tag_list += string("\n");
+ tag_list += s;
+ }
+}
+
+// determine_line_limits - works out the smallest box which will contain
+// the entity, code, built from the point array.
+void troff_output_file::determine_line_limits(char code, hvpair *point,
+ int npoints)
+{
+ int i, x, y;
+
+ if (!is_on())
+ return;
+
+ switch (code) {
+ case 'c':
+ case 'C':
+ // only the h field is used when defining a circle
+ check_output_limits(output_hpos,
+ output_vpos - point[0].h.to_units()/2);
+ check_output_limits(output_hpos + point[0].h.to_units(),
+ output_vpos + point[0].h.to_units()/2);
+ break;
+ case 'E':
+ case 'e':
+ check_output_limits(output_hpos,
+ output_vpos - point[0].v.to_units()/2);
+ check_output_limits(output_hpos + point[0].h.to_units(),
+ output_vpos + point[0].v.to_units()/2);
+ break;
+ case 'P':
+ case 'p':
+ x = output_hpos;
+ y = output_vpos;
+ check_output_limits(x, y);
+ for (i = 0; i < npoints; i++) {
+ x += point[i].h.to_units();
+ y += point[i].v.to_units();
+ check_output_limits(x, y);
+ }
+ break;
+ case 't':
+ x = output_hpos;
+ y = output_vpos;
+ for (i = 0; i < npoints; i++) {
+ x += point[i].h.to_units();
+ y += point[i].v.to_units();
+ check_output_limits(x, y);
+ }
+ break;
+ case 'a':
+ double c[2];
+ int p[4];
+ int minx, miny, maxx, maxy;
+ x = output_hpos;
+ y = output_vpos;
+ p[0] = point[0].h.to_units();
+ p[1] = point[0].v.to_units();
+ p[2] = point[1].h.to_units();
+ p[3] = point[1].v.to_units();
+ if (adjust_arc_center(p, c)) {
+ check_output_arc_limits(x, y,
+ p[0], p[1], p[2], p[3],
+ c[0], c[1],
+ &minx, &maxx, &miny, &maxy);
+ check_output_limits(minx, miny);
+ check_output_limits(maxx, maxy);
+ break;
+ }
+ // fall through
+ case 'l':
+ x = output_hpos;
+ y = output_vpos;
+ check_output_limits(x, y);
+ for (i = 0; i < npoints; i++) {
+ x += point[i].h.to_units();
+ y += point[i].v.to_units();
+ check_output_limits(x, y);
+ }
+ break;
+ default:
+ x = output_hpos;
+ y = output_vpos;
+ for (i = 0; i < npoints; i++) {
+ x += point[i].h.to_units();
+ y += point[i].v.to_units();
+ check_output_limits(x, y);
+ }
+ }
+}
+
+void troff_output_file::draw(char code, hvpair *point, int npoints,
+ font_size fsize, color *gcol, color *fcol)
+{
+ int i;
+ glyph_color(gcol);
+ fill_color(fcol);
+ flush_tbuf();
+ do_motion();
+ if (is_on()) {
+ int size = fsize.to_scaled_points();
+ if (current_size != size) {
+ put('s');
+ put(size);
+ put('\n');
+ current_size = size;
+ current_tfont = 0;
+ }
+ put('D');
+ put(code);
+ if (code == 'c') {
+ put(' ');
+ put(point[0].h.to_units());
+ }
+ else
+ for (i = 0; i < npoints; i++) {
+ put(' ');
+ put(point[i].h.to_units());
+ put(' ');
+ put(point[i].v.to_units());
+ }
+ determine_line_limits(code, point, npoints);
+ }
+
+ for (i = 0; i < npoints; i++)
+ output_hpos += point[i].h.to_units();
+ hpos = output_hpos;
+ if (code != 'e') {
+ for (i = 0; i < npoints; i++)
+ output_vpos += point[i].v.to_units();
+ vpos = output_vpos;
+ }
+ if (is_on())
+ put('\n');
+}
+
+void troff_output_file::really_on()
+{
+ flush_tbuf();
+ force_motion = 1;
+ do_motion();
+}
+
+void troff_output_file::really_off()
+{
+ flush_tbuf();
+}
+
+void troff_output_file::really_put_filename(const char *filename, int po)
+{
+ flush_tbuf();
+ put("x F ");
+ if (po)
+ put("<");
+ put(filename);
+ if (po)
+ put(">");
+ put('\n');
+}
+
+void troff_output_file::really_begin_page(int pageno, vunits page_length)
+{
+ flush_tbuf();
+ if (begun_page) {
+ if (page_length > V0) {
+ put('V');
+ put(page_length.to_units());
+ put('\n');
+ }
+ }
+ else
+ begun_page = 1;
+ current_tfont = 0;
+ current_font_number = -1;
+ current_size = 0;
+ // current_height = 0;
+ // current_slant = 0;
+ hpos = 0;
+ vpos = 0;
+ output_hpos = 0;
+ output_vpos = 0;
+ force_motion = 1;
+ for (int i = 0; i < nfont_positions; i++)
+ font_position[i] = NULL_SYMBOL;
+ put('p');
+ put(pageno);
+ put('\n');
+}
+
+void troff_output_file::really_copy_file(hunits x, vunits y,
+ const char *filename)
+{
+ moveto(x, y);
+ flush_tbuf();
+ do_motion();
+ errno = 0;
+ FILE *ifp = include_search_path.open_file_cautious(filename);
+ if (ifp == 0)
+ error("can't open '%1': %2", filename, strerror(errno));
+ else {
+ int c;
+ while ((c = getc(ifp)) != EOF)
+ put(char(c));
+ fclose(ifp);
+ }
+ force_motion = 1;
+ current_size = 0;
+ current_tfont = 0;
+ current_font_number = -1;
+ for (int i = 0; i < nfont_positions; i++)
+ font_position[i] = NULL_SYMBOL;
+}
+
+void troff_output_file::really_transparent_char(unsigned char c)
+{
+ put(c);
+}
+
+troff_output_file::~troff_output_file()
+{
+ delete[] font_position;
+}
+
+void troff_output_file::trailer(vunits page_length)
+{
+ flush_tbuf();
+ if (page_length > V0) {
+ put("x trailer\n");
+ put('V');
+ put(page_length.to_units());
+ put('\n');
+ }
+ put("x stop\n");
+}
+
+troff_output_file::troff_output_file()
+: current_slant(0), current_height(0), current_fill_color(0),
+ current_glyph_color(0), nfont_positions(10), tbuf_len(0), begun_page(0),
+ cur_div_level(0)
+{
+ font_position = new symbol[nfont_positions];
+ put("x T ");
+ put(device);
+ put('\n');
+ put("x res ");
+ put(units_per_inch);
+ put(' ');
+ put(hresolution);
+ put(' ');
+ put(vresolution);
+ put('\n');
+ put("x init\n");
+}
+
+/* output_file */
+
+output_file *the_output = 0;
+
+output_file::output_file()
+{
+ is_dying = false;
+}
+
+output_file::~output_file()
+{
+}
+
+void output_file::trailer(vunits)
+{
+}
+
+void output_file::put_filename(const char *, int)
+{
+}
+
+void output_file::on()
+{
+}
+
+void output_file::off()
+{
+}
+
+real_output_file::real_output_file()
+: printing(0), output_on(1)
+{
+#ifndef POPEN_MISSING
+ if (pipe_command) {
+ if ((fp = popen(pipe_command, POPEN_WT)) != 0) {
+ piped = 1;
+ return;
+ }
+ error("pipe open failed: %1", strerror(errno));
+ }
+ piped = 0;
+#endif /* not POPEN_MISSING */
+ fp = stdout;
+}
+
+real_output_file::~real_output_file()
+{
+ if (!fp)
+ return;
+ // Prevent destructor from recursing; see div.cpp:cleanup_and_exit().
+ is_dying = true;
+ // To avoid looping, set fp to 0 before calling fatal().
+ if (ferror(fp)) {
+ fp = 0;
+ fatal("error on output file stream");
+ }
+ else if (fflush(fp) < 0) {
+ fp = 0;
+ fatal("unable to flush output file: %1", strerror(errno));
+ }
+#ifndef POPEN_MISSING
+ if (piped) {
+ int result = pclose(fp);
+ fp = 0;
+ if (result < 0)
+ fatal("unable to close pipe: %1", strerror(errno));
+ if (!WIFEXITED(result))
+ error("output process '%1' got fatal signal %2",
+ pipe_command,
+ WIFSIGNALED(result) ? WTERMSIG(result) : WSTOPSIG(result));
+ else {
+ int exit_status = WEXITSTATUS(result);
+ if (exit_status != 0)
+ error("output process '%1' exited with status %2",
+ pipe_command, exit_status);
+ }
+ }
+ else
+#endif /* not POPEN MISSING */
+ if (fclose(fp) < 0) {
+ fp = 0;
+ fatal("unable to close output file: %1", strerror(errno));
+ }
+}
+
+void real_output_file::flush()
+{
+ // To avoid looping, set fp to 0 before calling fatal().
+ if (fflush(fp) < 0) {
+ fp = 0;
+ fatal("unable to flush output file: %1", strerror(errno));
+ }
+}
+
+int real_output_file::is_printing()
+{
+ return printing;
+}
+
+void real_output_file::begin_page(int pageno, vunits page_length)
+{
+ printing = in_output_page_list(pageno);
+ if (printing)
+ really_begin_page(pageno, page_length);
+}
+
+void real_output_file::copy_file(hunits x, vunits y, const char *filename)
+{
+ if (printing && output_on)
+ really_copy_file(x, y, filename);
+ check_output_limits(x.to_units(), y.to_units());
+}
+
+void real_output_file::transparent_char(unsigned char c)
+{
+ if (printing && output_on)
+ really_transparent_char(c);
+}
+
+void real_output_file::print_line(hunits x, vunits y, node *n,
+ vunits before, vunits after, hunits width)
+{
+ if (printing)
+ really_print_line(x, y, n, before, after, width);
+ delete_node_list(n);
+}
+
+void real_output_file::really_copy_file(hunits, vunits, const char *)
+{
+ // do nothing
+}
+
+void real_output_file::put_filename(const char *filename, int po)
+{
+ really_put_filename(filename, po);
+}
+
+void real_output_file::really_put_filename(const char *, int)
+{
+}
+
+void real_output_file::on()
+{
+ really_on();
+ if (output_on == 0)
+ output_on = 1;
+}
+
+void real_output_file::off()
+{
+ really_off();
+ output_on = 0;
+}
+
+int real_output_file::is_on()
+{
+ return output_on;
+}
+
+void real_output_file::really_on()
+{
+}
+
+void real_output_file::really_off()
+{
+}
+
+/* ascii_output_file */
+
+void ascii_output_file::really_transparent_char(unsigned char c)
+{
+ putc(c, fp);
+}
+
+void ascii_output_file::really_print_line(hunits, vunits, node *n,
+ vunits, vunits, hunits)
+{
+ while (n != 0) {
+ n->ascii_print(this);
+ n = n->next;
+ }
+ fputc('\n', fp);
+}
+
+void ascii_output_file::really_begin_page(int /*pageno*/, vunits /*page_length*/)
+{
+ fputs("<beginning of page>\n", fp);
+}
+
+ascii_output_file::ascii_output_file()
+{
+}
+
+/* suppress_output_file */
+
+suppress_output_file::suppress_output_file()
+{
+}
+
+void suppress_output_file::really_print_line(hunits, vunits, node *, vunits, vunits, hunits)
+{
+}
+
+void suppress_output_file::really_begin_page(int, vunits)
+{
+}
+
+void suppress_output_file::really_transparent_char(unsigned char)
+{
+}
+
+/* glyphs, ligatures, kerns, discretionary breaks */
+
+class charinfo_node : public node {
+protected:
+ charinfo *ci;
+public:
+ charinfo_node(charinfo *, statem *, int, node * = 0);
+ int ends_sentence();
+ int overlaps_vertically();
+ int overlaps_horizontally();
+};
+
+charinfo_node::charinfo_node(charinfo *c, statem *s, int pop, node *x)
+: node(x, s, pop), ci(c)
+{
+}
+
+int charinfo_node::ends_sentence()
+{
+ if (ci->ends_sentence())
+ return 1;
+ else if (ci->transparent())
+ return 2;
+ else
+ return 0;
+}
+
+int charinfo_node::overlaps_horizontally()
+{
+ return ci->overlaps_horizontally();
+}
+
+int charinfo_node::overlaps_vertically()
+{
+ return ci->overlaps_vertically();
+}
+
+class glyph_node : public charinfo_node {
+protected:
+ tfont *tf;
+ color *gcol;
+ color *fcol; /* this is needed for grotty */
+#ifdef STORE_WIDTH
+ hunits wid;
+ glyph_node(charinfo *, tfont *, color *, color *, hunits,
+ statem *, int, node * = 0);
+#endif
+public:
+ glyph_node(charinfo *, tfont *, color *, color *,
+ statem *, int, node * = 0);
+ ~glyph_node() {}
+ node *copy();
+ node *merge_glyph_node(glyph_node *);
+ node *merge_self(node *);
+ hunits width();
+ node *last_char_node();
+ units size();
+ void vertical_extent(vunits *, vunits *);
+ hunits subscript_correction();
+ hunits italic_correction();
+ hunits left_italic_correction();
+ hunits skew();
+ hyphenation_type get_hyphenation_type();
+ tfont *get_tfont();
+ color *get_glyph_color();
+ color *get_fill_color();
+ void tprint(troff_output_file *);
+ void zero_width_tprint(troff_output_file *);
+ hyphen_list *get_hyphen_list(hyphen_list *, int *);
+ node *add_self(node *, hyphen_list **);
+ void ascii_print(ascii_output_file *);
+ void asciify(macro *);
+ int character_type();
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+ void debug_node();
+};
+
+class ligature_node : public glyph_node {
+ node *n1;
+ node *n2;
+#ifdef STORE_WIDTH
+ ligature_node(charinfo *, tfont *, color *, color *, hunits,
+ node *, node *, statem *, int, node * = 0);
+#endif
+public:
+ void *operator new(size_t);
+ void operator delete(void *);
+ ligature_node(charinfo *, tfont *, color *, color *,
+ node *, node *, statem *, int, node * = 0);
+ ~ligature_node();
+ node *copy();
+ node *add_self(node *, hyphen_list **);
+ hyphen_list *get_hyphen_list(hyphen_list *, int *);
+ void ascii_print(ascii_output_file *);
+ void asciify(macro *);
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+};
+
+class kern_pair_node : public node {
+ hunits amount;
+ node *n1;
+ node *n2;
+public:
+ kern_pair_node(hunits, node *, node *, statem *, int, node * = 0);
+ ~kern_pair_node();
+ node *copy();
+ node *merge_glyph_node(glyph_node *);
+ node *add_self(node *, hyphen_list **);
+ hyphen_list *get_hyphen_list(hyphen_list *, int *);
+ node *add_discretionary_hyphen();
+ hunits width();
+ node *last_char_node();
+ hunits italic_correction();
+ hunits subscript_correction();
+ void tprint(troff_output_file *);
+ hyphenation_type get_hyphenation_type();
+ int ends_sentence();
+ void ascii_print(ascii_output_file *);
+ void asciify(macro *);
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+ void vertical_extent(vunits *, vunits *);
+};
+
+class dbreak_node : public node {
+ node *none;
+ node *pre;
+ node *post;
+public:
+ dbreak_node(node *, node *, statem *, int, node * = 0);
+ ~dbreak_node();
+ node *copy();
+ node *merge_glyph_node(glyph_node *);
+ node *add_discretionary_hyphen();
+ hunits width();
+ node *last_char_node();
+ hunits italic_correction();
+ hunits subscript_correction();
+ void tprint(troff_output_file *);
+ breakpoint *get_breakpoints(hunits width, int ns, breakpoint *rest = 0,
+ int is_inner = 0);
+ int nbreaks();
+ int ends_sentence();
+ void split(int, node **, node **);
+ hyphenation_type get_hyphenation_type();
+ void ascii_print(ascii_output_file *);
+ void asciify(macro *);
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+};
+
+void *ligature_node::operator new(size_t n)
+{
+ return new char[n];
+}
+
+void ligature_node::operator delete(void *p)
+{
+ delete[] (char *)p;
+}
+
+glyph_node::glyph_node(charinfo *c, tfont *t, color *gc, color *fc,
+ statem *s, int pop, node *x)
+: charinfo_node(c, s, pop, x), tf(t), gcol(gc), fcol(fc)
+{
+#ifdef STORE_WIDTH
+ wid = tf->get_width(ci);
+#endif
+}
+
+#ifdef STORE_WIDTH
+glyph_node::glyph_node(charinfo *c, tfont *t,
+ color *gc, color *fc, hunits w,
+ statem *s, int pop, node *x)
+: charinfo_node(c, s, pop, x), tf(t), gcol(gc), fcol(fc), wid(w)
+{
+}
+#endif
+
+node *glyph_node::copy()
+{
+#ifdef STORE_WIDTH
+ return new glyph_node(ci, tf, gcol, fcol, wid, state, div_nest_level);
+#else
+ return new glyph_node(ci, tf, gcol, fcol, state, div_nest_level);
+#endif
+}
+
+node *glyph_node::merge_self(node *nd)
+{
+ return nd->merge_glyph_node(this);
+}
+
+int glyph_node::character_type()
+{
+ return tf->get_character_type(ci);
+}
+
+node *glyph_node::add_self(node *n, hyphen_list **p)
+{
+ assert(ci->get_hyphenation_code() == (*p)->hyphenation_code);
+ next = 0;
+ node *nn;
+ if (n == 0 || (nn = n->merge_glyph_node(this)) == 0) {
+ next = n;
+ nn = this;
+ }
+ if ((*p)->hyphen)
+ nn = nn->add_discretionary_hyphen();
+ hyphen_list *pp = *p;
+ *p = (*p)->next;
+ delete pp;
+ return nn;
+}
+
+units glyph_node::size()
+{
+ return tf->get_size().to_units();
+}
+
+hyphen_list *glyph_node::get_hyphen_list(hyphen_list *tail, int *count)
+{
+ (*count)++;
+ return new hyphen_list(ci->get_hyphenation_code(), tail);
+}
+
+tfont *node::get_tfont()
+{
+ return 0;
+}
+
+tfont *glyph_node::get_tfont()
+{
+ return tf;
+}
+
+color *node::get_glyph_color()
+{
+ return 0;
+}
+
+color *glyph_node::get_glyph_color()
+{
+ return gcol;
+}
+
+color *node::get_fill_color()
+{
+ return 0;
+}
+
+color *glyph_node::get_fill_color()
+{
+ return fcol;
+}
+
+node *node::merge_glyph_node(glyph_node *)
+{
+ return 0;
+}
+
+node *glyph_node::merge_glyph_node(glyph_node *gn)
+{
+ if (tf == gn->tf && gcol == gn->gcol && fcol == gn->fcol) {
+ charinfo *lig;
+ if ((lig = tf->get_lig(ci, gn->ci)) != 0) {
+ node *next1 = next;
+ next = 0;
+ return new ligature_node(lig, tf, gcol, fcol, this, gn, state,
+ gn->div_nest_level, next1);
+ }
+ hunits kern;
+ if (tf->get_kern(ci, gn->ci, &kern)) {
+ node *next1 = next;
+ next = 0;
+ return new kern_pair_node(kern, this, gn, state,
+ gn->div_nest_level, next1);
+ }
+ }
+ return 0;
+}
+
+#ifdef STORE_WIDTH
+inline
+#endif
+hunits glyph_node::width()
+{
+#ifdef STORE_WIDTH
+ return wid;
+#else
+ return tf->get_width(ci);
+#endif
+}
+
+node *glyph_node::last_char_node()
+{
+ return this;
+}
+
+void glyph_node::vertical_extent(vunits *min, vunits *max)
+{
+ *min = -tf->get_char_height(ci);
+ *max = tf->get_char_depth(ci);
+}
+
+hunits glyph_node::skew()
+{
+ return tf->get_char_skew(ci);
+}
+
+hunits glyph_node::subscript_correction()
+{
+ return tf->get_subscript_correction(ci);
+}
+
+hunits glyph_node::italic_correction()
+{
+ return tf->get_italic_correction(ci);
+}
+
+hunits glyph_node::left_italic_correction()
+{
+ return tf->get_left_italic_correction(ci);
+}
+
+hyphenation_type glyph_node::get_hyphenation_type()
+{
+ return HYPHEN_MIDDLE;
+}
+
+void glyph_node::ascii_print(ascii_output_file *ascii)
+{
+ unsigned char c = ci->get_ascii_code();
+ if (c != 0)
+ ascii->outc(c);
+ else
+ ascii->outs(ci->nm.contents());
+}
+
+void glyph_node::debug_node()
+{
+ unsigned char c = ci->get_ascii_code();
+ fprintf(stderr, "{ %s [", type());
+ if (c)
+ fprintf(stderr, "%c", c);
+ else
+ fprintf(stderr, "%s", ci->nm.contents());
+ if (push_state)
+ fprintf(stderr, " <push_state>");
+ if (state)
+ state->display_state();
+ fprintf(stderr, " nest level %d", div_nest_level);
+ fprintf(stderr, "]}\n");
+ fflush(stderr);
+}
+
+ligature_node::ligature_node(charinfo *c, tfont *t, color *gc, color *fc,
+ node *gn1, node *gn2, statem *s,
+ int pop, node *x)
+: glyph_node(c, t, gc, fc, s, pop, x), n1(gn1), n2(gn2)
+{
+}
+
+#ifdef STORE_WIDTH
+ligature_node::ligature_node(charinfo *c, tfont *t, color *gc, color *fc,
+ hunits w, node *gn1, node *gn2, statem *s,
+ int pop, node *x)
+: glyph_node(c, t, gc, fc, w, s, pop, x), n1(gn1), n2(gn2)
+{
+}
+#endif
+
+ligature_node::~ligature_node()
+{
+ delete n1;
+ delete n2;
+}
+
+node *ligature_node::copy()
+{
+#ifdef STORE_WIDTH
+ return new ligature_node(ci, tf, gcol, fcol, wid, n1->copy(), n2->copy(),
+ state, div_nest_level);
+#else
+ return new ligature_node(ci, tf, gcol, fcol, n1->copy(), n2->copy(),
+ state, div_nest_level);
+#endif
+}
+
+void ligature_node::ascii_print(ascii_output_file *ascii)
+{
+ n1->ascii_print(ascii);
+ n2->ascii_print(ascii);
+}
+
+hyphen_list *ligature_node::get_hyphen_list(hyphen_list *tail, int *count)
+{
+ hyphen_list *hl = n2->get_hyphen_list(tail, count);
+ return n1->get_hyphen_list(hl, count);
+}
+
+node *ligature_node::add_self(node *n, hyphen_list **p)
+{
+ n = n1->add_self(n, p);
+ n = n2->add_self(n, p);
+ n1 = n2 = 0;
+ delete this;
+ return n;
+}
+
+kern_pair_node::kern_pair_node(hunits n, node *first, node *second,
+ statem* s, int pop, node *x)
+: node(x, s, pop), amount(n), n1(first), n2(second)
+{
+}
+
+dbreak_node::dbreak_node(node *n, node *p, statem *s, int pop, node *x)
+: node(x, s, pop), none(n), pre(p), post(0)
+{
+}
+
+node *dbreak_node::merge_glyph_node(glyph_node *gn)
+{
+ glyph_node *gn2 = (glyph_node *)gn->copy();
+ node *new_none = none ? none->merge_glyph_node(gn) : 0;
+ node *new_post = post ? post->merge_glyph_node(gn2) : 0;
+ if (new_none == 0 && new_post == 0) {
+ delete gn2;
+ return 0;
+ }
+ if (new_none != 0)
+ none = new_none;
+ else {
+ gn->next = none;
+ none = gn;
+ }
+ if (new_post != 0)
+ post = new_post;
+ else {
+ gn2->next = post;
+ post = gn2;
+ }
+ return this;
+}
+
+node *kern_pair_node::merge_glyph_node(glyph_node *gn)
+{
+ node *nd = n2->merge_glyph_node(gn);
+ if (nd == 0)
+ return 0;
+ n2 = nd;
+ nd = n2->merge_self(n1);
+ if (nd) {
+ nd->next = next;
+ n1 = 0;
+ n2 = 0;
+ delete this;
+ return nd;
+ }
+ return this;
+}
+
+hunits kern_pair_node::italic_correction()
+{
+ return n2->italic_correction();
+}
+
+hunits kern_pair_node::subscript_correction()
+{
+ return n2->subscript_correction();
+}
+
+void kern_pair_node::vertical_extent(vunits *min, vunits *max)
+{
+ n1->vertical_extent(min, max);
+ vunits min2, max2;
+ n2->vertical_extent(&min2, &max2);
+ if (min2 < *min)
+ *min = min2;
+ if (max2 > *max)
+ *max = max2;
+}
+
+node *kern_pair_node::add_discretionary_hyphen()
+{
+ tfont *tf = n1->get_tfont();
+ if (tf) {
+ if (tf->contains(soft_hyphen_char)) {
+ color *gcol = n2->get_glyph_color();
+ color *fcol = n2->get_fill_color();
+ node *next1 = next;
+ next = 0;
+ node *n = copy();
+ glyph_node *gn = new glyph_node(soft_hyphen_char, tf, gcol, fcol,
+ state, div_nest_level);
+ node *nn = n->merge_glyph_node(gn);
+ if (nn == 0) {
+ gn->next = n;
+ nn = gn;
+ }
+ return new dbreak_node(this, nn, state, div_nest_level, next1);
+ }
+ }
+ return this;
+}
+
+kern_pair_node::~kern_pair_node()
+{
+ if (n1 != 0)
+ delete n1;
+ if (n2 != 0)
+ delete n2;
+}
+
+dbreak_node::~dbreak_node()
+{
+ delete_node_list(pre);
+ delete_node_list(post);
+ delete_node_list(none);
+}
+
+node *kern_pair_node::copy()
+{
+ return new kern_pair_node(amount, n1->copy(), n2->copy(), state,
+ div_nest_level);
+}
+
+node *copy_node_list(node *n)
+{
+ node *p = 0;
+ while (n != 0) {
+ node *nn = n->copy();
+ nn->next = p;
+ p = nn;
+ n = n->next;
+ }
+ while (p != 0) {
+ node *pp = p->next;
+ p->next = n;
+ n = p;
+ p = pp;
+ }
+ return n;
+}
+
+void delete_node_list(node *n)
+{
+ while (n != 0) {
+ node *tem = n;
+ n = n->next;
+ delete tem;
+ }
+}
+
+node *dbreak_node::copy()
+{
+ dbreak_node *p = new dbreak_node(copy_node_list(none), copy_node_list(pre),
+ state, div_nest_level);
+ p->post = copy_node_list(post);
+ return p;
+}
+
+hyphen_list *node::get_hyphen_list(hyphen_list *tail, int *)
+{
+ return tail;
+}
+
+hyphen_list *kern_pair_node::get_hyphen_list(hyphen_list *tail, int *count)
+{
+ hyphen_list *hl = n2->get_hyphen_list(tail, count);
+ return n1->get_hyphen_list(hl, count);
+}
+
+class hyphen_inhibitor_node : public node {
+public:
+ hyphen_inhibitor_node(node * = 0);
+ node *copy();
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+ hyphenation_type get_hyphenation_type();
+};
+
+hyphen_inhibitor_node::hyphen_inhibitor_node(node *nd) : node(nd)
+{
+}
+
+node *hyphen_inhibitor_node::copy()
+{
+ return new hyphen_inhibitor_node;
+}
+
+int hyphen_inhibitor_node::same(node *)
+{
+ return 1;
+}
+
+const char *hyphen_inhibitor_node::type()
+{
+ return "hyphen_inhibitor_node";
+}
+
+int hyphen_inhibitor_node::force_tprint()
+{
+ return 0;
+}
+
+int hyphen_inhibitor_node::is_tag()
+{
+ return 0;
+}
+
+hyphenation_type hyphen_inhibitor_node::get_hyphenation_type()
+{
+ return HYPHEN_INHIBIT;
+}
+
+/* add_discretionary_hyphen methods */
+
+node *dbreak_node::add_discretionary_hyphen()
+{
+ if (post)
+ post = post->add_discretionary_hyphen();
+ if (none)
+ none = none->add_discretionary_hyphen();
+ return this;
+}
+
+node *node::add_discretionary_hyphen()
+{
+ tfont *tf = get_tfont();
+ if (!tf)
+ return new hyphen_inhibitor_node(this);
+ if (tf->contains(soft_hyphen_char)) {
+ color *gcol = get_glyph_color();
+ color *fcol = get_fill_color();
+ node *next1 = next;
+ next = 0;
+ node *n = copy();
+ glyph_node *gn = new glyph_node(soft_hyphen_char, tf, gcol, fcol,
+ state, div_nest_level);
+ node *n1 = n->merge_glyph_node(gn);
+ if (n1 == 0) {
+ gn->next = n;
+ n1 = gn;
+ }
+ return new dbreak_node(this, n1, state, div_nest_level, next1);
+ }
+ return this;
+}
+
+node *node::merge_self(node *)
+{
+ return 0;
+}
+
+node *node::add_self(node *n, hyphen_list ** /*p*/)
+{
+ next = n;
+ return this;
+}
+
+node *kern_pair_node::add_self(node *n, hyphen_list **p)
+{
+ n = n1->add_self(n, p);
+ n = n2->add_self(n, p);
+ n1 = n2 = 0;
+ delete this;
+ return n;
+}
+
+hunits node::width()
+{
+ return H0;
+}
+
+node *node::last_char_node()
+{
+ return 0;
+}
+
+int node::force_tprint()
+{
+ return 0;
+}
+
+int node::is_tag()
+{
+ return 0;
+}
+
+int node::get_break_code()
+{
+ return 0;
+}
+
+hunits hmotion_node::width()
+{
+ return n;
+}
+
+units node::size()
+{
+ return points_to_units(10);
+}
+
+void node::debug_node()
+{
+ fprintf(stderr, "{ %s ", type());
+ if (push_state)
+ fprintf(stderr, " <push_state>");
+ if (state)
+ fprintf(stderr, " <state>");
+ fprintf(stderr, " nest level %d", div_nest_level);
+ fprintf(stderr, " }\n");
+ fflush(stderr);
+}
+
+void node::debug_node_list()
+{
+ node *n = next;
+
+ debug_node();
+ while (n != 0) {
+ n->debug_node();
+ n = n->next;
+ }
+}
+
+hunits kern_pair_node::width()
+{
+ return n1->width() + n2->width() + amount;
+}
+
+node *kern_pair_node::last_char_node()
+{
+ node *nd = n2->last_char_node();
+ if (nd)
+ return nd;
+ return n1->last_char_node();
+}
+
+hunits dbreak_node::width()
+{
+ hunits x = H0;
+ for (node *n = none; n != 0; n = n->next)
+ x += n->width();
+ return x;
+}
+
+node *dbreak_node::last_char_node()
+{
+ for (node *n = none; n; n = n->next) {
+ node *last_node = n->last_char_node();
+ if (last_node)
+ return last_node;
+ }
+ return 0;
+}
+
+hunits dbreak_node::italic_correction()
+{
+ return none ? none->italic_correction() : H0;
+}
+
+hunits dbreak_node::subscript_correction()
+{
+ return none ? none->subscript_correction() : H0;
+}
+
+class italic_corrected_node : public node {
+ node *n;
+ hunits x;
+public:
+ italic_corrected_node(node *, hunits, statem *, int, node * = 0);
+ ~italic_corrected_node();
+ node *copy();
+ void ascii_print(ascii_output_file *);
+ void asciify(macro *);
+ hunits width();
+ node *last_char_node();
+ void vertical_extent(vunits *, vunits *);
+ int ends_sentence();
+ int overlaps_horizontally();
+ int overlaps_vertically();
+ int same(node *);
+ hyphenation_type get_hyphenation_type();
+ tfont *get_tfont();
+ hyphen_list *get_hyphen_list(hyphen_list *, int *);
+ int character_type();
+ void tprint(troff_output_file *);
+ hunits subscript_correction();
+ hunits skew();
+ node *add_self(node *, hyphen_list **);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+};
+
+node *node::add_italic_correction(hunits *wd)
+{
+ hunits ic = italic_correction();
+ if (ic.is_zero())
+ return this;
+ else {
+ node *next1 = next;
+ next = 0;
+ *wd += ic;
+ return new italic_corrected_node(this, ic, state, div_nest_level, next1);
+ }
+}
+
+italic_corrected_node::italic_corrected_node(node *nn, hunits xx, statem *s,
+ int pop, node *p)
+: node(p, s, pop), n(nn), x(xx)
+{
+ assert(n != 0);
+}
+
+italic_corrected_node::~italic_corrected_node()
+{
+ delete n;
+}
+
+node *italic_corrected_node::copy()
+{
+ return new italic_corrected_node(n->copy(), x, state, div_nest_level);
+}
+
+hunits italic_corrected_node::width()
+{
+ return n->width() + x;
+}
+
+void italic_corrected_node::vertical_extent(vunits *min, vunits *max)
+{
+ n->vertical_extent(min, max);
+}
+
+void italic_corrected_node::tprint(troff_output_file *out)
+{
+ n->tprint(out);
+ out->right(x);
+}
+
+hunits italic_corrected_node::skew()
+{
+ return n->skew() - x/2;
+}
+
+hunits italic_corrected_node::subscript_correction()
+{
+ return n->subscript_correction() - x;
+}
+
+void italic_corrected_node::ascii_print(ascii_output_file *out)
+{
+ n->ascii_print(out);
+}
+
+int italic_corrected_node::ends_sentence()
+{
+ return n->ends_sentence();
+}
+
+int italic_corrected_node::overlaps_horizontally()
+{
+ return n->overlaps_horizontally();
+}
+
+int italic_corrected_node::overlaps_vertically()
+{
+ return n->overlaps_vertically();
+}
+
+node *italic_corrected_node::last_char_node()
+{
+ return n->last_char_node();
+}
+
+tfont *italic_corrected_node::get_tfont()
+{
+ return n->get_tfont();
+}
+
+hyphenation_type italic_corrected_node::get_hyphenation_type()
+{
+ return n->get_hyphenation_type();
+}
+
+node *italic_corrected_node::add_self(node *nd, hyphen_list **p)
+{
+ nd = n->add_self(nd, p);
+ hunits not_interested;
+ nd = nd->add_italic_correction(&not_interested);
+ n = 0;
+ delete this;
+ return nd;
+}
+
+hyphen_list *italic_corrected_node::get_hyphen_list(hyphen_list *tail,
+ int *count)
+{
+ return n->get_hyphen_list(tail, count);
+}
+
+int italic_corrected_node::character_type()
+{
+ return n->character_type();
+}
+
+class break_char_node : public node {
+ node *ch;
+ char break_code;
+ char prev_break_code;
+ color *col;
+public:
+ break_char_node(node *, int, int, color *, node * = 0);
+ break_char_node(node *, int, int, color *, statem *, int, node * = 0);
+ ~break_char_node();
+ node *copy();
+ hunits width();
+ vunits vertical_width();
+ node *last_char_node();
+ int character_type();
+ int ends_sentence();
+ node *add_self(node *, hyphen_list **);
+ hyphen_list *get_hyphen_list(hyphen_list *, int *);
+ void tprint(troff_output_file *);
+ void zero_width_tprint(troff_output_file *);
+ void ascii_print(ascii_output_file *);
+ void asciify(macro *);
+ hyphenation_type get_hyphenation_type();
+ int overlaps_vertically();
+ int overlaps_horizontally();
+ units size();
+ tfont *get_tfont();
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+ int get_break_code();
+};
+
+break_char_node::break_char_node(node *n, int bc, int pbc, color *c, node *x)
+: node(x), ch(n), break_code(bc), prev_break_code(pbc), col(c)
+{
+}
+
+break_char_node::break_char_node(node *n, int bc, int pbc, color *c,
+ statem *s, int pop, node *x)
+: node(x, s, pop), ch(n), break_code(bc), prev_break_code(pbc), col(c)
+{
+}
+
+break_char_node::~break_char_node()
+{
+ delete ch;
+}
+
+node *break_char_node::copy()
+{
+ return new break_char_node(ch->copy(), break_code, prev_break_code,
+ col, state, div_nest_level);
+}
+
+hunits break_char_node::width()
+{
+ return ch->width();
+}
+
+vunits break_char_node::vertical_width()
+{
+ return ch->vertical_width();
+}
+
+node *break_char_node::last_char_node()
+{
+ return ch->last_char_node();
+}
+
+int break_char_node::character_type()
+{
+ return ch->character_type();
+}
+
+int break_char_node::ends_sentence()
+{
+ return ch->ends_sentence();
+}
+
+enum break_char_type {
+ CAN_BREAK_BEFORE = 0x01,
+ CAN_BREAK_AFTER = 0x02,
+ IGNORE_HCODES = 0x04,
+ PROHIBIT_BREAK_BEFORE = 0x08,
+ PROHIBIT_BREAK_AFTER = 0x10,
+ INTER_CHAR_SPACE = 0x20
+};
+
+node *break_char_node::add_self(node *n, hyphen_list **p)
+{
+ int have_space_node = 0;
+ assert((*p)->hyphenation_code == 0);
+ if (break_code & CAN_BREAK_BEFORE) {
+ if ((*p)->breakable || break_code & IGNORE_HCODES) {
+ n = new space_node(H0, col, n);
+ n->freeze_space();
+ have_space_node = 1;
+ }
+ }
+ if (!have_space_node) {
+ if (prev_break_code & INTER_CHAR_SPACE
+ || prev_break_code & PROHIBIT_BREAK_AFTER) {
+ if (break_code & PROHIBIT_BREAK_BEFORE)
+ // stretchable zero-width space not implemented yet
+ ;
+ else {
+ // breakable, stretchable zero-width space not implemented yet
+ n = new space_node(H0, col, n);
+ n->freeze_space();
+ }
+ }
+ }
+ next = n;
+ n = this;
+ if (break_code & CAN_BREAK_AFTER) {
+ if ((*p)->breakable || break_code & IGNORE_HCODES) {
+ n = new space_node(H0, col, n);
+ n->freeze_space();
+ }
+ }
+ hyphen_list *pp = *p;
+ *p = (*p)->next;
+ delete pp;
+ return n;
+}
+
+hyphen_list *break_char_node::get_hyphen_list(hyphen_list *tail, int *)
+{
+ return new hyphen_list(0, tail);
+}
+
+hyphenation_type break_char_node::get_hyphenation_type()
+{
+ return HYPHEN_MIDDLE;
+}
+
+void break_char_node::ascii_print(ascii_output_file *ascii)
+{
+ ch->ascii_print(ascii);
+}
+
+int break_char_node::overlaps_vertically()
+{
+ return ch->overlaps_vertically();
+}
+
+int break_char_node::overlaps_horizontally()
+{
+ return ch->overlaps_horizontally();
+}
+
+units break_char_node::size()
+{
+ return ch->size();
+}
+
+tfont *break_char_node::get_tfont()
+{
+ return ch->get_tfont();
+}
+
+node *extra_size_node::copy()
+{
+ return new extra_size_node(n, state, div_nest_level);
+}
+
+extra_size_node::extra_size_node(vunits i, statem *s, int pop)
+: node(0, s, pop), n(i)
+{
+}
+
+extra_size_node::extra_size_node(vunits i)
+: n(i)
+{
+}
+
+node *vertical_size_node::copy()
+{
+ return new vertical_size_node(n, state, div_nest_level);
+}
+
+vertical_size_node::vertical_size_node(vunits i, statem *s, int pop)
+: node(0, s, pop), n(i)
+{
+}
+
+vertical_size_node::vertical_size_node(vunits i)
+: n(i)
+{
+}
+
+node *hmotion_node::copy()
+{
+ return new hmotion_node(n, was_tab, unformat, col, state, div_nest_level);
+}
+
+node *space_char_hmotion_node::copy()
+{
+ return new space_char_hmotion_node(n, col, state, div_nest_level);
+}
+
+vmotion_node::vmotion_node(vunits i, color *c)
+: n(i), col(c)
+{
+}
+
+vmotion_node::vmotion_node(vunits i, color *c, statem *s, int pop)
+: node(0, s, pop), n(i), col(c)
+{
+}
+
+node *vmotion_node::copy()
+{
+ return new vmotion_node(n, col, state, div_nest_level);
+}
+
+node *dummy_node::copy()
+{
+ return new dummy_node;
+}
+
+node *transparent_dummy_node::copy()
+{
+ return new transparent_dummy_node;
+}
+
+hline_node::~hline_node()
+{
+ if (n)
+ delete n;
+}
+
+hline_node::hline_node(hunits i, node *c, node *nxt)
+: node(nxt), x(i), n(c)
+{
+}
+
+hline_node::hline_node(hunits i, node *c, statem *s, int pop, node *nxt)
+: node(nxt, s, pop), x(i), n(c)
+{
+}
+
+node *hline_node::copy()
+{
+ return new hline_node(x, n ? n->copy() : 0, state, div_nest_level);
+}
+
+hunits hline_node::width()
+{
+ return x < H0 ? H0 : x;
+}
+
+vline_node::vline_node(vunits i, node *c, node *nxt)
+: node(nxt), x(i), n(c)
+{
+}
+
+vline_node::vline_node(vunits i, node *c, statem *s, int pop, node *nxt)
+: node(nxt, s, pop), x(i), n(c)
+{
+}
+
+vline_node::~vline_node()
+{
+ if (n)
+ delete n;
+}
+
+node *vline_node::copy()
+{
+ return new vline_node(x, n ? n->copy() : 0, state, div_nest_level);
+}
+
+hunits vline_node::width()
+{
+ return n == 0 ? H0 : n->width();
+}
+
+zero_width_node::zero_width_node(node *nd, statem *s, int pop)
+: node(0, s, pop), n(nd)
+{
+}
+
+zero_width_node::zero_width_node(node *nd)
+: n(nd)
+{
+}
+
+zero_width_node::~zero_width_node()
+{
+ delete_node_list(n);
+}
+
+node *zero_width_node::copy()
+{
+ return new zero_width_node(copy_node_list(n), state, div_nest_level);
+}
+
+int node_list_character_type(node *p)
+{
+ int t = 0;
+ for (; p; p = p->next)
+ t |= p->character_type();
+ return t;
+}
+
+int zero_width_node::character_type()
+{
+ return node_list_character_type(n);
+}
+
+void node_list_vertical_extent(node *p, vunits *min, vunits *max)
+{
+ *min = V0;
+ *max = V0;
+ vunits cur_vpos = V0;
+ vunits v1, v2;
+ for (; p; p = p->next) {
+ p->vertical_extent(&v1, &v2);
+ v1 += cur_vpos;
+ if (v1 < *min)
+ *min = v1;
+ v2 += cur_vpos;
+ if (v2 > *max)
+ *max = v2;
+ cur_vpos += p->vertical_width();
+ }
+}
+
+void zero_width_node::vertical_extent(vunits *min, vunits *max)
+{
+ node_list_vertical_extent(n, min, max);
+}
+
+overstrike_node::overstrike_node()
+: list(0), max_width(H0)
+{
+}
+
+overstrike_node::overstrike_node(statem *s, int pop)
+: node(0, s, pop), list(0), max_width(H0)
+{
+}
+
+overstrike_node::~overstrike_node()
+{
+ delete_node_list(list);
+}
+
+node *overstrike_node::copy()
+{
+ overstrike_node *on = new overstrike_node(state, div_nest_level);
+ for (node *tem = list; tem; tem = tem->next)
+ on->overstrike(tem->copy());
+ return on;
+}
+
+void overstrike_node::overstrike(node *n)
+{
+ if (n == 0)
+ return;
+ hunits w = n->width();
+ if (w > max_width)
+ max_width = w;
+ node **p;
+ for (p = &list; *p; p = &(*p)->next)
+ ;
+ n->next = 0;
+ *p = n;
+}
+
+hunits overstrike_node::width()
+{
+ return max_width;
+}
+
+bracket_node::bracket_node()
+: list(0), max_width(H0)
+{
+}
+
+bracket_node::bracket_node(statem *s, int pop)
+: node(0, s, pop), list(0), max_width(H0)
+{
+}
+
+bracket_node::~bracket_node()
+{
+ delete_node_list(list);
+}
+
+node *bracket_node::copy()
+{
+ bracket_node *on = new bracket_node(state, div_nest_level);
+ node *last_node = 0;
+ node *tem;
+ if (list)
+ list->last = 0;
+ for (tem = list; tem; tem = tem->next) {
+ if (tem->next)
+ tem->next->last = tem;
+ last_node = tem;
+ }
+ for (tem = last_node; tem; tem = tem->last)
+ on->bracket(tem->copy());
+ return on;
+}
+
+void bracket_node::bracket(node *n)
+{
+ if (n == 0)
+ return;
+ hunits w = n->width();
+ if (w > max_width)
+ max_width = w;
+ n->next = list;
+ list = n;
+}
+
+hunits bracket_node::width()
+{
+ return max_width;
+}
+
+int node::nspaces()
+{
+ return 0;
+}
+
+int node::merge_space(hunits, hunits, hunits)
+{
+ return 0;
+}
+
+
+space_node::space_node(hunits nn, color *c, node *p)
+: node(p, 0, 0), n(nn), set(0), was_escape_colon(0), col(c)
+{
+}
+
+space_node::space_node(hunits nn, int s, int flag, color *c, statem *st,
+ int pop, node *p)
+: node(p, st, pop), n(nn), set(s), was_escape_colon(flag), col(c)
+{
+}
+
+#if 0
+space_node::~space_node()
+{
+}
+#endif
+
+node *space_node::copy()
+{
+ return new space_node(n, set, was_escape_colon, col, state, div_nest_level);
+}
+
+int space_node::force_tprint()
+{
+ return 0;
+}
+
+int space_node::is_tag()
+{
+ return 0;
+}
+
+int space_node::nspaces()
+{
+ return set ? 0 : 1;
+}
+
+int space_node::merge_space(hunits h, hunits, hunits)
+{
+ n += h;
+ return 1;
+}
+
+hunits space_node::width()
+{
+ return n;
+}
+
+void node::spread_space(int*, hunits*)
+{
+}
+
+void space_node::spread_space(int *n_spaces, hunits *desired_space)
+{
+ if (!set) {
+ assert(*n_spaces > 0);
+ if (*n_spaces == 1) {
+ n += *desired_space;
+ *desired_space = H0;
+ }
+ else {
+ hunits extra = *desired_space / *n_spaces;
+ *desired_space -= extra;
+ n += extra;
+ }
+ *n_spaces -= 1;
+ set = 1;
+ }
+}
+
+void node::freeze_space()
+{
+}
+
+void space_node::freeze_space()
+{
+ set = 1;
+}
+
+void node::is_escape_colon()
+{
+}
+
+void space_node::is_escape_colon()
+{
+ was_escape_colon = 1;
+}
+
+diverted_space_node::diverted_space_node(vunits d, statem *s, int pop,
+ node *p)
+: node(p, s, pop), n(d)
+{
+}
+
+diverted_space_node::diverted_space_node(vunits d, node *p)
+: node(p), n(d)
+{
+}
+
+node *diverted_space_node::copy()
+{
+ return new diverted_space_node(n, state, div_nest_level);
+}
+
+diverted_copy_file_node::diverted_copy_file_node(symbol s, statem *st,
+ int pop, node *p)
+: node(p, st, pop), filename(s)
+{
+}
+
+diverted_copy_file_node::diverted_copy_file_node(symbol s, node *p)
+: node(p), filename(s)
+{
+}
+
+node *diverted_copy_file_node::copy()
+{
+ return new diverted_copy_file_node(filename, state, div_nest_level);
+}
+
+int node::ends_sentence()
+{
+ return 0;
+}
+
+int kern_pair_node::ends_sentence()
+{
+ switch (n2->ends_sentence()) {
+ case 0:
+ return 0;
+ case 1:
+ return 1;
+ case 2:
+ break;
+ default:
+ assert(0);
+ }
+ return n1->ends_sentence();
+}
+
+int node_list_ends_sentence(node *n)
+{
+ for (; n != 0; n = n->next)
+ switch (n->ends_sentence()) {
+ case 0:
+ return 0;
+ case 1:
+ return 1;
+ case 2:
+ break;
+ default:
+ assert(0);
+ }
+ return 2;
+}
+
+int dbreak_node::ends_sentence()
+{
+ return node_list_ends_sentence(none);
+}
+
+int node::overlaps_horizontally()
+{
+ return 0;
+}
+
+int node::overlaps_vertically()
+{
+ return 0;
+}
+
+int node::discardable()
+{
+ return 0;
+}
+
+int space_node::discardable()
+{
+ return set ? 0 : 1;
+}
+
+vunits node::vertical_width()
+{
+ return V0;
+}
+
+vunits vline_node::vertical_width()
+{
+ return x;
+}
+
+vunits vmotion_node::vertical_width()
+{
+ return n;
+}
+
+int node::set_unformat_flag()
+{
+ return 1;
+}
+
+int node::character_type()
+{
+ return 0;
+}
+
+hunits node::subscript_correction()
+{
+ return H0;
+}
+
+hunits node::italic_correction()
+{
+ return H0;
+}
+
+hunits node::left_italic_correction()
+{
+ return H0;
+}
+
+hunits node::skew()
+{
+ return H0;
+}
+
+/* vertical_extent methods */
+
+void node::vertical_extent(vunits *min, vunits *max)
+{
+ vunits v = vertical_width();
+ if (v < V0) {
+ *min = v;
+ *max = V0;
+ }
+ else {
+ *max = v;
+ *min = V0;
+ }
+}
+
+void vline_node::vertical_extent(vunits *min, vunits *max)
+{
+ if (n == 0)
+ node::vertical_extent(min, max);
+ else {
+ vunits cmin, cmax;
+ n->vertical_extent(&cmin, &cmax);
+ vunits h = n->size();
+ if (x < V0) {
+ if (-x < h) {
+ *min = x;
+ *max = V0;
+ }
+ else {
+ // we print the first character and then move up, so
+ *max = cmax;
+ // we print the last character and then move up h
+ *min = cmin + h;
+ if (*min > V0)
+ *min = V0;
+ *min += x;
+ }
+ }
+ else {
+ if (x < h) {
+ *max = x;
+ *min = V0;
+ }
+ else {
+ // we move down by h and then print the first character, so
+ *min = cmin + h;
+ if (*min > V0)
+ *min = V0;
+ *max = x + cmax;
+ }
+ }
+ }
+}
+
+/* ascii_print methods */
+
+static void ascii_print_reverse_node_list(ascii_output_file *ascii, node *n)
+{
+ if (n == 0)
+ return;
+ ascii_print_reverse_node_list(ascii, n->next);
+ n->ascii_print(ascii);
+}
+
+void dbreak_node::ascii_print(ascii_output_file *ascii)
+{
+ ascii_print_reverse_node_list(ascii, none);
+}
+
+void kern_pair_node::ascii_print(ascii_output_file *ascii)
+{
+ n1->ascii_print(ascii);
+ n2->ascii_print(ascii);
+}
+
+void node::ascii_print(ascii_output_file *)
+{
+}
+
+void space_node::ascii_print(ascii_output_file *ascii)
+{
+ if (!n.is_zero())
+ ascii->outc(' ');
+}
+
+void hmotion_node::ascii_print(ascii_output_file *ascii)
+{
+ // this is pretty arbitrary
+ if (n >= points_to_units(2))
+ ascii->outc(' ');
+}
+
+void space_char_hmotion_node::ascii_print(ascii_output_file *ascii)
+{
+ ascii->outc(' ');
+}
+
+/* asciify methods */
+
+void node::asciify(macro *m)
+{
+ m->append(this);
+}
+
+void glyph_node::asciify(macro *m)
+{
+ unsigned char c = ci->get_asciify_code();
+ if (c == 0)
+ c = ci->get_ascii_code();
+ if (c != 0) {
+ m->append(c);
+ delete this;
+ }
+ else
+ m->append(this);
+}
+
+void kern_pair_node::asciify(macro *m)
+{
+ n1->asciify(m);
+ n2->asciify(m);
+ n1 = n2 = 0;
+ delete this;
+}
+
+static void asciify_reverse_node_list(macro *m, node *n)
+{
+ if (n == 0)
+ return;
+ asciify_reverse_node_list(m, n->next);
+ n->asciify(m);
+}
+
+void dbreak_node::asciify(macro *m)
+{
+ asciify_reverse_node_list(m, none);
+ none = 0;
+ delete this;
+}
+
+void ligature_node::asciify(macro *m)
+{
+ n1->asciify(m);
+ n2->asciify(m);
+ n1 = n2 = 0;
+ delete this;
+}
+
+void break_char_node::asciify(macro *m)
+{
+ ch->asciify(m);
+ ch = 0;
+ delete this;
+}
+
+void italic_corrected_node::asciify(macro *m)
+{
+ n->asciify(m);
+ n = 0;
+ delete this;
+}
+
+void left_italic_corrected_node::asciify(macro *m)
+{
+ if (n) {
+ n->asciify(m);
+ n = 0;
+ }
+ delete this;
+}
+
+void hmotion_node::asciify(macro *m)
+{
+ if (was_tab) {
+ m->append('\t');
+ delete this;
+ }
+ else
+ m->append(this);
+}
+
+space_char_hmotion_node::space_char_hmotion_node(hunits i, color *c,
+ statem *s, int pop,
+ node *nxt)
+: hmotion_node(i, c, s, pop, nxt)
+{
+}
+
+space_char_hmotion_node::space_char_hmotion_node(hunits i, color *c,
+ node *nxt)
+: hmotion_node(i, c, 0, 0, nxt)
+{
+}
+
+void space_char_hmotion_node::asciify(macro *m)
+{
+ m->append(ESCAPE_SPACE);
+ delete this;
+}
+
+void space_node::asciify(macro *m)
+{
+ if (was_escape_colon) {
+ m->append(ESCAPE_COLON);
+ delete this;
+ }
+ else
+ m->append(this);
+}
+
+void word_space_node::asciify(macro *m)
+{
+ for (width_list *w = orig_width; w; w = w->next)
+ m->append(' ');
+ delete this;
+}
+
+void unbreakable_space_node::asciify(macro *m)
+{
+ m->append(ESCAPE_TILDE);
+ delete this;
+}
+
+void line_start_node::asciify(macro *)
+{
+ delete this;
+}
+
+void vertical_size_node::asciify(macro *)
+{
+ delete this;
+}
+
+breakpoint *node::get_breakpoints(hunits /*width*/, int /*nspaces*/,
+ breakpoint *rest, int /*is_inner*/)
+{
+ return rest;
+}
+
+int node::nbreaks()
+{
+ return 0;
+}
+
+breakpoint *space_node::get_breakpoints(hunits wd, int ns,
+ breakpoint *rest, int is_inner)
+{
+ if (next && next->discardable())
+ return rest;
+ breakpoint *bp = new breakpoint;
+ bp->next = rest;
+ bp->width = wd;
+ bp->nspaces = ns;
+ bp->hyphenated = 0;
+ if (is_inner) {
+ assert(rest != 0);
+ bp->index = rest->index + 1;
+ bp->nd = rest->nd;
+ }
+ else {
+ bp->nd = this;
+ bp->index = 0;
+ }
+ return bp;
+}
+
+int space_node::nbreaks()
+{
+ if (next && next->discardable())
+ return 0;
+ else
+ return 1;
+}
+
+static breakpoint *node_list_get_breakpoints(node *p, hunits *widthp,
+ int ns, breakpoint *rest)
+{
+ if (p != 0) {
+ rest = p->get_breakpoints(*widthp,
+ ns,
+ node_list_get_breakpoints(p->next, widthp, ns,
+ rest),
+ 1);
+ *widthp += p->width();
+ }
+ return rest;
+}
+
+breakpoint *dbreak_node::get_breakpoints(hunits wd, int ns,
+ breakpoint *rest, int is_inner)
+{
+ breakpoint *bp = new breakpoint;
+ bp->next = rest;
+ bp->width = wd;
+ for (node *tem = pre; tem != 0; tem = tem->next)
+ bp->width += tem->width();
+ bp->nspaces = ns;
+ bp->hyphenated = 1;
+ if (is_inner) {
+ assert(rest != 0);
+ bp->index = rest->index + 1;
+ bp->nd = rest->nd;
+ }
+ else {
+ bp->nd = this;
+ bp->index = 0;
+ }
+ return node_list_get_breakpoints(none, &wd, ns, bp);
+}
+
+int dbreak_node::nbreaks()
+{
+ int i = 1;
+ for (node *tem = none; tem != 0; tem = tem->next)
+ i += tem->nbreaks();
+ return i;
+}
+
+void node::split(int /*where*/, node ** /*prep*/, node ** /*postp*/)
+{
+ assert(0);
+}
+
+void space_node::split(int where, node **pre, node **post)
+{
+ assert(where == 0);
+ *pre = next;
+ *post = 0;
+ delete this;
+}
+
+static void node_list_split(node *p, int *wherep, node **prep, node **postp)
+{
+ if (p == 0)
+ return;
+ int nb = p->nbreaks();
+ node_list_split(p->next, wherep, prep, postp);
+ if (*wherep < 0) {
+ p->next = *postp;
+ *postp = p;
+ }
+ else if (*wherep < nb) {
+ p->next = *prep;
+ p->split(*wherep, prep, postp);
+ }
+ else {
+ p->next = *prep;
+ *prep = p;
+ }
+ *wherep -= nb;
+}
+
+void dbreak_node::split(int where, node **prep, node **postp)
+{
+ assert(where >= 0);
+ if (where == 0) {
+ *postp = post;
+ post = 0;
+ if (pre == 0)
+ *prep = next;
+ else {
+ node *tem;
+ for (tem = pre; tem->next != 0; tem = tem->next)
+ ;
+ tem->next = next;
+ *prep = pre;
+ }
+ pre = 0;
+ delete this;
+ }
+ else {
+ *prep = next;
+ where -= 1;
+ node_list_split(none, &where, prep, postp);
+ none = 0;
+ delete this;
+ }
+}
+
+hyphenation_type node::get_hyphenation_type()
+{
+ return HYPHEN_BOUNDARY;
+}
+
+hyphenation_type dbreak_node::get_hyphenation_type()
+{
+ return HYPHEN_INHIBIT;
+}
+
+hyphenation_type kern_pair_node::get_hyphenation_type()
+{
+ return HYPHEN_MIDDLE;
+}
+
+hyphenation_type dummy_node::get_hyphenation_type()
+{
+ return HYPHEN_MIDDLE;
+}
+
+hyphenation_type transparent_dummy_node::get_hyphenation_type()
+{
+ return HYPHEN_MIDDLE;
+}
+
+hyphenation_type hmotion_node::get_hyphenation_type()
+{
+ return HYPHEN_MIDDLE;
+}
+
+hyphenation_type space_char_hmotion_node::get_hyphenation_type()
+{
+ return HYPHEN_MIDDLE;
+}
+
+hyphenation_type overstrike_node::get_hyphenation_type()
+{
+ return HYPHEN_MIDDLE;
+}
+
+hyphenation_type space_node::get_hyphenation_type()
+{
+ if (was_escape_colon)
+ return HYPHEN_MIDDLE;
+ return HYPHEN_BOUNDARY;
+}
+
+hyphenation_type unbreakable_space_node::get_hyphenation_type()
+{
+ return HYPHEN_MIDDLE;
+}
+
+int node::interpret(macro *)
+{
+ return 0;
+}
+
+special_node::special_node(const macro &m, int n)
+: mac(m), no_init_string(n)
+{
+ font_size fs = curenv->get_font_size();
+ int char_height = curenv->get_char_height();
+ int char_slant = curenv->get_char_slant();
+ int fontno = env_definite_font(curenv);
+ tf = font_table[fontno]->get_tfont(fs, char_height, char_slant, fontno);
+ if (curenv->is_composite())
+ tf = tf->get_plain();
+ gcol = curenv->get_glyph_color();
+ fcol = curenv->get_fill_color();
+ is_special = 1;
+}
+
+special_node::special_node(const macro &m, tfont *t,
+ color *gc, color *fc,
+ statem *s, int pop,
+ int n)
+: node(0, s, pop), mac(m), tf(t), gcol(gc), fcol(fc), no_init_string(n)
+{
+ is_special = 1;
+}
+
+int special_node::same(node *n)
+{
+ return mac == ((special_node *)n)->mac
+ && tf == ((special_node *)n)->tf
+ && gcol == ((special_node *)n)->gcol
+ && fcol == ((special_node *)n)->fcol
+ && no_init_string == ((special_node *)n)->no_init_string;
+}
+
+const char *special_node::type()
+{
+ return "special_node";
+}
+
+int special_node::ends_sentence()
+{
+ return 2;
+}
+
+int special_node::force_tprint()
+{
+ return 0;
+}
+
+int special_node::is_tag()
+{
+ return 0;
+}
+
+node *special_node::copy()
+{
+ return new special_node(mac, tf, gcol, fcol, state, div_nest_level,
+ no_init_string);
+}
+
+void special_node::tprint_start(troff_output_file *out)
+{
+ out->start_special(tf, gcol, fcol, no_init_string);
+}
+
+void special_node::tprint_char(troff_output_file *out, unsigned char c)
+{
+ out->special_char(c);
+}
+
+void special_node::tprint_end(troff_output_file *out)
+{
+ out->end_special();
+}
+
+tfont *special_node::get_tfont()
+{
+ return tf;
+}
+
+/* suppress_node */
+
+suppress_node::suppress_node(int on_or_off, int issue_limits)
+: is_on(on_or_off), emit_limits(issue_limits), filename(0), position(0),
+ image_id(0)
+{
+}
+
+suppress_node::suppress_node(symbol f, char p, int id)
+: is_on(2), emit_limits(0), filename(f), position(p), image_id(id)
+{
+ is_special = 1;
+}
+
+suppress_node::suppress_node(int issue_limits, int on_or_off,
+ symbol f, char p, int id,
+ statem *s, int pop)
+: node(0, s, pop), is_on(on_or_off), emit_limits(issue_limits), filename(f),
+ position(p), image_id(id)
+{
+}
+
+int suppress_node::same(node *n)
+{
+ return ((is_on == ((suppress_node *)n)->is_on)
+ && (emit_limits == ((suppress_node *)n)->emit_limits)
+ && (filename == ((suppress_node *)n)->filename)
+ && (position == ((suppress_node *)n)->position)
+ && (image_id == ((suppress_node *)n)->image_id));
+}
+
+const char *suppress_node::type()
+{
+ return "suppress_node";
+}
+
+node *suppress_node::copy()
+{
+ return new suppress_node(emit_limits, is_on, filename, position, image_id,
+ state, div_nest_level);
+}
+
+/* tag_node */
+
+tag_node::tag_node()
+: delayed(0)
+{
+ is_special = 1;
+}
+
+tag_node::tag_node(string s, int delay)
+: tag_string(s), delayed(delay)
+{
+ is_special = !delay;
+}
+
+tag_node::tag_node(string s, statem *st, int pop, int delay)
+: node(0, st, pop), tag_string(s), delayed(delay)
+{
+ is_special = !delay;
+}
+
+node *tag_node::copy()
+{
+ return new tag_node(tag_string, state, div_nest_level, delayed);
+}
+
+void tag_node::tprint(troff_output_file *out)
+{
+ if (delayed)
+ out->add_to_tag_list(tag_string);
+ else
+ out->state.add_tag(out->fp, tag_string);
+}
+
+int tag_node::same(node *nd)
+{
+ return tag_string == ((tag_node *)nd)->tag_string
+ && delayed == ((tag_node *)nd)->delayed;
+}
+
+const char *tag_node::type()
+{
+ return "tag_node";
+}
+
+int tag_node::force_tprint()
+{
+ return !delayed;
+}
+
+int tag_node::is_tag()
+{
+ return !delayed;
+}
+
+int tag_node::ends_sentence()
+{
+ return 2;
+}
+
+// Get contents of register `p` as integer.
+// Used only by suppress_node::tprint().
+static int get_register(const char *p)
+{
+ assert(p != 0 /* nullptr */);
+ reg *r = (reg *)register_dictionary.lookup(p);
+ assert(r != 0 /* nullptr */);
+ units value;
+ assert(r->get_value(&value));
+ return int(value);
+}
+
+// Get contents of register `p` as string.
+// Used only by suppress_node::tprint().
+static const char *get_string(const char *p)
+{
+ assert(p != 0 /* nullptr */);
+ reg *r = (reg *)register_dictionary.lookup(p);
+ assert(r != 0 /* nullptr */);
+ return r->get_string();
+}
+
+void suppress_node::put(troff_output_file *out, const char *s)
+{
+ int i = 0;
+ while (s[i] != (char)0) {
+ out->special_char(s[i]);
+ i++;
+ }
+}
+
+/*
+ * We need to remember the start of the image and its name (\O5). But
+ * we won't always need this information; for instance, \O2 is used to
+ * produce a bounding box with no associated image or position thereof.
+ */
+
+static char last_position = 0;
+static const char *image_filename = "";
+static size_t image_filename_len = 0;
+static int subimage_counter = 0;
+
+/*
+ * tprint - if (is_on == 2)
+ * remember current position (l, r, c, i) and filename
+ * else
+ * if (emit_limits)
+ * if (html)
+ * emit image tag
+ * else
+ * emit postscript bounds for image
+ * else
+ * if (suppress boolean differs from current state)
+ * alter state
+ * reset registers
+ * record current page
+ * set low water mark.
+ */
+
+void suppress_node::tprint(troff_output_file *out)
+{
+ int current_page = topdiv->get_page_number();
+ // Does the node have an associated position and file name?
+ if (is_on == 2) {
+ // Save them for future bounding box limits.
+ last_position = position;
+ image_filename = strsave(filename.contents());
+ image_filename_len = strlen(image_filename);
+ }
+ else { // is_on = 0 or 1
+ // Now check whether the suppress node requires us to issue limits.
+ if (emit_limits) {
+ const size_t namebuflen = 8192;
+ char name[namebuflen] = { '\0' };
+ // Jump through a flaming hoop to avoid a "format nonliteral"
+ // warning from blindly using sprintf...and avoid trouble from
+ // mischievous image stems.
+ //
+ // Keep this format string synced with pre-html:makeFileName().
+ const char format[] = "%d";
+ const size_t format_len = strlen(format);
+ const char *percent_position = strstr(image_filename, format);
+ if (percent_position) {
+ subimage_counter++;
+ assert(sizeof subimage_counter <= 8);
+ // A 64-bit signed int produces up to 19 decimal digits.
+ char *subimage_number = (char *)malloc(20); // 19 digits + \0
+ if (0 == subimage_number)
+ fatal("memory allocation failure");
+ // Replace the %d in the filename with this number.
+ size_t enough = image_filename_len + 19 - format_len;
+ char *new_name = (char *)malloc(enough);
+ if (0 == new_name)
+ fatal("memory allocation failure");
+ ptrdiff_t prefix_length = percent_position - image_filename;
+ strncpy(new_name, image_filename, prefix_length);
+ sprintf(subimage_number, "%d", subimage_counter);
+ size_t number_length = strlen(subimage_number);
+ strcpy(new_name + prefix_length, subimage_number);
+ // Skip over the format in the source string.
+ const char *suffix_src = image_filename + prefix_length
+ + format_len;
+ char *suffix_dst = new_name + prefix_length + number_length;
+ strcpy(suffix_dst, suffix_src);
+ // Ensure the new string fits with room for a terminal '\0'.
+ const size_t len = strlen(new_name);
+ if (len > (namebuflen - 1))
+ error("constructed file name in suppressed output escape"
+ " sequence is too long (>= %1 bytes); skipping image",
+ (int)namebuflen);
+ else
+ strncpy(name, new_name, (namebuflen - 1));
+ free(new_name);
+ free(subimage_number);
+ }
+ else {
+ if (image_filename_len > (namebuflen - 1))
+ error("file name in suppressed output escape sequence is too"
+ " long (>= %1 bytes); skipping image", (int)namebuflen);
+ else
+ strcpy(name, image_filename);
+ }
+ if (is_html) {
+ switch (last_position) {
+ case 'c':
+ out->start_special();
+ put(out, "devtag:.centered-image");
+ break;
+ case 'r':
+ out->start_special();
+ put(out, "devtag:.right-image");
+ break;
+ case 'l':
+ out->start_special();
+ put(out, "devtag:.left-image");
+ break;
+ case 'i':
+ ;
+ default:
+ ;
+ }
+ out->end_special();
+ out->start_special();
+ put(out, "devtag:.auto-image ");
+ put(out, name);
+ out->end_special();
+ }
+ else {
+ // postscript (or other device)
+ if (suppress_start_page > 0
+ && (current_page != suppress_start_page))
+ error("suppression limit registers span more than a page;"
+ " grohtml-info for image %1 will be wrong", image_no);
+ // if (topdiv->get_page_number() != suppress_start_page)
+ // fprintf(stderr, "end of image and topdiv page = %d and"
+ // " suppress_start_page = %d\n",
+ // topdiv->get_page_number(), suppress_start_page);
+
+ // `name` will contain a "%d" in which the image_no is placed.
+ fprintf(stderr,
+ "grohtml-info:page %d %d %d %d %d %d %s %d %d"
+ " %s:%s\n",
+ topdiv->get_page_number(),
+ get_register("opminx"), get_register("opminy"),
+ get_register("opmaxx"), get_register("opmaxy"),
+ // page offset + line length
+ get_register(".o") + get_register(".l"),
+ name, hresolution, vresolution, get_string(".F"),
+ get_string(".c"));
+ fflush(stderr);
+ }
+ }
+ else { // We are not emitting limits.
+ if (is_on) {
+ out->on();
+ reset_output_registers();
+ }
+ else
+ out->off();
+ suppress_start_page = current_page;
+ }
+ } // is_on
+}
+
+int suppress_node::force_tprint()
+{
+ return is_on;
+}
+
+int suppress_node::is_tag()
+{
+ return is_on;
+}
+
+hunits suppress_node::width()
+{
+ return H0;
+}
+
+/* composite_node */
+
+class composite_node : public charinfo_node {
+ node *n;
+ tfont *tf;
+public:
+ composite_node(node *, charinfo *, tfont *, statem *, int, node * = 0);
+ ~composite_node();
+ node *copy();
+ hunits width();
+ node *last_char_node();
+ units size();
+ void tprint(troff_output_file *);
+ hyphenation_type get_hyphenation_type();
+ void ascii_print(ascii_output_file *);
+ void asciify(macro *);
+ hyphen_list *get_hyphen_list(hyphen_list *, int *);
+ node *add_self(node *, hyphen_list **);
+ tfont *get_tfont();
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+ void vertical_extent(vunits *, vunits *);
+ vunits vertical_width();
+};
+
+composite_node::composite_node(node *p, charinfo *c, tfont *t, statem *s,
+ int pop, node *x)
+: charinfo_node(c, s, pop, x), n(p), tf(t)
+{
+}
+
+composite_node::~composite_node()
+{
+ delete_node_list(n);
+}
+
+node *composite_node::copy()
+{
+ return new composite_node(copy_node_list(n), ci, tf, state, div_nest_level);
+}
+
+hunits composite_node::width()
+{
+ hunits x;
+ if (tf->get_constant_space(&x))
+ return x;
+ x = H0;
+ for (node *tem = n; tem; tem = tem->next)
+ x += tem->width();
+ hunits offset;
+ if (tf->get_bold(&offset))
+ x += offset;
+ x += tf->get_track_kern();
+ return x;
+}
+
+node *composite_node::last_char_node()
+{
+ return this;
+}
+
+vunits composite_node::vertical_width()
+{
+ vunits v = V0;
+ for (node *tem = n; tem; tem = tem->next)
+ v += tem->vertical_width();
+ return v;
+}
+
+units composite_node::size()
+{
+ return tf->get_size().to_units();
+}
+
+hyphenation_type composite_node::get_hyphenation_type()
+{
+ return HYPHEN_MIDDLE;
+}
+
+void composite_node::asciify(macro *m)
+{
+ unsigned char c = ci->get_asciify_code();
+ if (c == 0)
+ c = ci->get_ascii_code();
+ if (c != 0) {
+ m->append(c);
+ delete this;
+ }
+ else
+ m->append(this);
+}
+
+void composite_node::ascii_print(ascii_output_file *ascii)
+{
+ unsigned char c = ci->get_ascii_code();
+ if (c != 0)
+ ascii->outc(c);
+ else
+ ascii->outs(ci->nm.contents());
+
+}
+
+hyphen_list *composite_node::get_hyphen_list(hyphen_list *tail, int *count)
+{
+ (*count)++;
+ return new hyphen_list(ci->get_hyphenation_code(), tail);
+}
+
+node *composite_node::add_self(node *nn, hyphen_list **p)
+{
+ assert(ci->get_hyphenation_code() == (*p)->hyphenation_code);
+ next = nn;
+ nn = this;
+ if ((*p)->hyphen)
+ nn = nn->add_discretionary_hyphen();
+ hyphen_list *pp = *p;
+ *p = (*p)->next;
+ delete pp;
+ return nn;
+}
+
+tfont *composite_node::get_tfont()
+{
+ return tf;
+}
+
+node *reverse_node_list(node *n)
+{
+ node *r = 0;
+ while (n) {
+ node *tem = n;
+ n = n->next;
+ tem->next = r;
+ r = tem;
+ }
+ return r;
+}
+
+void composite_node::vertical_extent(vunits *minimum, vunits *maximum)
+{
+ n = reverse_node_list(n);
+ node_list_vertical_extent(n, minimum, maximum);
+ n = reverse_node_list(n);
+}
+
+width_list::width_list(hunits w, hunits s)
+: width(w), sentence_width(s), next(0)
+{
+}
+
+width_list::width_list(width_list *w)
+: width(w->width), sentence_width(w->sentence_width), next(0)
+{
+}
+
+word_space_node::word_space_node(hunits d, color *c, width_list *w, node *x)
+: space_node(d, c, x), orig_width(w), unformat(0)
+{
+}
+
+word_space_node::word_space_node(hunits d, int s, color *c, width_list *w,
+ int flag, statem *st, int pop, node *x)
+: space_node(d, s, 0, c, st, pop, x), orig_width(w), unformat(flag)
+{
+}
+
+word_space_node::~word_space_node()
+{
+ width_list *w = orig_width;
+ while (w != 0) {
+ width_list *tmp = w;
+ w = w->next;
+ delete tmp;
+ }
+}
+
+node *word_space_node::copy()
+{
+ assert(orig_width != 0);
+ width_list *w_old_curr = orig_width;
+ width_list *w_new_curr = new width_list(w_old_curr);
+ width_list *w_new = w_new_curr;
+ w_old_curr = w_old_curr->next;
+ while (w_old_curr != 0) {
+ w_new_curr->next = new width_list(w_old_curr);
+ w_new_curr = w_new_curr->next;
+ w_old_curr = w_old_curr->next;
+ }
+ return new word_space_node(n, set, col, w_new, unformat, state,
+ div_nest_level);
+}
+
+int word_space_node::set_unformat_flag()
+{
+ unformat = 1;
+ return 1;
+}
+
+void word_space_node::tprint(troff_output_file *out)
+{
+ out->fill_color(col);
+ out->word_marker();
+ out->right(n);
+}
+
+int word_space_node::merge_space(hunits h, hunits sw, hunits ssw)
+{
+ n += h;
+ assert(orig_width != 0);
+ width_list *w = orig_width;
+ for (; w->next; w = w->next)
+ ;
+ w->next = new width_list(sw, ssw);
+ return 1;
+}
+
+unbreakable_space_node::unbreakable_space_node(hunits d, color *c, node *x)
+: word_space_node(d, c, 0, x)
+{
+}
+
+unbreakable_space_node::unbreakable_space_node(hunits d, int s,
+ color *c, statem *st, int pop,
+ node *x)
+: word_space_node(d, s, c, 0, 0, st, pop, x)
+{
+}
+
+node *unbreakable_space_node::copy()
+{
+ return new unbreakable_space_node(n, set, col, state, div_nest_level);
+}
+
+int unbreakable_space_node::force_tprint()
+{
+ return 0;
+}
+
+int unbreakable_space_node::is_tag()
+{
+ return 0;
+}
+
+breakpoint *unbreakable_space_node::get_breakpoints(hunits, int,
+ breakpoint *rest, int)
+{
+ return rest;
+}
+
+int unbreakable_space_node::nbreaks()
+{
+ return 0;
+}
+
+void unbreakable_space_node::split(int, node **, node **)
+{
+ assert(0);
+}
+
+int unbreakable_space_node::merge_space(hunits, hunits, hunits)
+{
+ return 0;
+}
+
+hvpair::hvpair()
+{
+}
+
+draw_node::draw_node(char c, hvpair *p, int np, font_size s,
+ color *gc, color *fc)
+: npoints(np), sz(s), gcol(gc), fcol(fc), code(c)
+{
+ point = new hvpair[npoints];
+ for (int i = 0; i < npoints; i++)
+ point[i] = p[i];
+}
+
+draw_node::draw_node(char c, hvpair *p, int np, font_size s,
+ color *gc, color *fc, statem *st, int pop)
+: node(0, st, pop), npoints(np), sz(s), gcol(gc), fcol(fc), code(c)
+{
+ point = new hvpair[npoints];
+ for (int i = 0; i < npoints; i++)
+ point[i] = p[i];
+}
+
+int draw_node::same(node *n)
+{
+ draw_node *nd = (draw_node *)n;
+ if (code != nd->code || npoints != nd->npoints || sz != nd->sz
+ || gcol != nd->gcol || fcol != nd->fcol)
+ return 0;
+ for (int i = 0; i < npoints; i++)
+ if (point[i].h != nd->point[i].h || point[i].v != nd->point[i].v)
+ return 0;
+ return 1;
+}
+
+const char *draw_node::type()
+{
+ return "draw_node";
+}
+
+int draw_node::force_tprint()
+{
+ return 0;
+}
+
+int draw_node::is_tag()
+{
+ return 0;
+}
+
+draw_node::~draw_node()
+{
+ if (point)
+ delete[] point;
+}
+
+hunits draw_node::width()
+{
+ hunits x = H0;
+ for (int i = 0; i < npoints; i++)
+ x += point[i].h;
+ return x;
+}
+
+vunits draw_node::vertical_width()
+{
+ if (code == 'e')
+ return V0;
+ vunits x = V0;
+ for (int i = 0; i < npoints; i++)
+ x += point[i].v;
+ return x;
+}
+
+node *draw_node::copy()
+{
+ return new draw_node(code, point, npoints, sz, gcol, fcol, state,
+ div_nest_level);
+}
+
+void draw_node::tprint(troff_output_file *out)
+{
+ out->draw(code, point, npoints, sz, gcol, fcol);
+}
+
+/* tprint methods */
+
+void glyph_node::tprint(troff_output_file *out)
+{
+ tfont *ptf = tf->get_plain();
+ if (ptf == tf)
+ out->put_char_width(ci, ptf, gcol, fcol, width(), H0);
+ else {
+ hunits offset;
+ int bold = tf->get_bold(&offset);
+ hunits w = ptf->get_width(ci);
+ hunits k = H0;
+ hunits x;
+ int cs = tf->get_constant_space(&x);
+ if (cs) {
+ x -= w;
+ if (bold)
+ x -= offset;
+ hunits x2 = x/2;
+ out->right(x2);
+ k = x - x2;
+ }
+ else
+ k = tf->get_track_kern();
+ if (bold) {
+ out->put_char(ci, ptf, gcol, fcol);
+ out->right(offset);
+ }
+ out->put_char_width(ci, ptf, gcol, fcol, w, k);
+ }
+}
+
+void glyph_node::zero_width_tprint(troff_output_file *out)
+{
+ tfont *ptf = tf->get_plain();
+ hunits offset;
+ int bold = tf->get_bold(&offset);
+ hunits x;
+ int cs = tf->get_constant_space(&x);
+ if (cs) {
+ x -= ptf->get_width(ci);
+ if (bold)
+ x -= offset;
+ x = x/2;
+ out->right(x);
+ }
+ out->put_char(ci, ptf, gcol, fcol);
+ if (bold) {
+ out->right(offset);
+ out->put_char(ci, ptf, gcol, fcol);
+ out->right(-offset);
+ }
+ if (cs)
+ out->right(-x);
+}
+
+void break_char_node::tprint(troff_output_file *t)
+{
+ ch->tprint(t);
+}
+
+void break_char_node::zero_width_tprint(troff_output_file *t)
+{
+ ch->zero_width_tprint(t);
+}
+
+void hline_node::tprint(troff_output_file *out)
+{
+ if (x < H0) {
+ out->right(x);
+ x = -x;
+ }
+ if (n == 0) {
+ out->right(x);
+ return;
+ }
+ hunits w = n->width();
+ if (w <= H0) {
+ error("horizontal line drawing character must have positive width");
+ out->right(x);
+ return;
+ }
+ int i = int(x/w);
+ if (i == 0) {
+ hunits xx = x - w;
+ hunits xx2 = xx/2;
+ out->right(xx2);
+ if (out->is_on())
+ n->tprint(out);
+ out->right(xx - xx2);
+ }
+ else {
+ hunits rem = x - w*i;
+ if (rem > H0) {
+ if (n->overlaps_horizontally()) {
+ if (out->is_on())
+ n->tprint(out);
+ out->right(rem - w);
+ }
+ else
+ out->right(rem);
+ }
+ while (--i >= 0)
+ if (out->is_on())
+ n->tprint(out);
+ }
+}
+
+void vline_node::tprint(troff_output_file *out)
+{
+ if (n == 0) {
+ out->down(x);
+ return;
+ }
+ vunits h = n->size();
+ int overlaps = n->overlaps_vertically();
+ vunits y = x;
+ if (y < V0) {
+ y = -y;
+ int i = y / h;
+ vunits rem = y - i*h;
+ if (i == 0) {
+ out->right(n->width());
+ out->down(-rem);
+ }
+ else {
+ while (--i > 0) {
+ n->zero_width_tprint(out);
+ out->down(-h);
+ }
+ if (overlaps) {
+ n->zero_width_tprint(out);
+ out->down(-rem);
+ if (out->is_on())
+ n->tprint(out);
+ out->down(-h);
+ }
+ else {
+ if (out->is_on())
+ n->tprint(out);
+ out->down(-h - rem);
+ }
+ }
+ }
+ else {
+ int i = y / h;
+ vunits rem = y - i*h;
+ if (i == 0) {
+ out->down(rem);
+ out->right(n->width());
+ }
+ else {
+ out->down(h);
+ if (overlaps)
+ n->zero_width_tprint(out);
+ out->down(rem);
+ while (--i > 0) {
+ n->zero_width_tprint(out);
+ out->down(h);
+ }
+ if (out->is_on())
+ n->tprint(out);
+ }
+ }
+}
+
+void zero_width_node::tprint(troff_output_file *out)
+{
+ if (!n)
+ return;
+ if (!n->next) {
+ n->zero_width_tprint(out);
+ return;
+ }
+ int hpos = out->get_hpos();
+ int vpos = out->get_vpos();
+ node *tem = n;
+ while (tem) {
+ tem->tprint(out);
+ tem = tem->next;
+ }
+ out->moveto(hpos, vpos);
+}
+
+void overstrike_node::tprint(troff_output_file *out)
+{
+ hunits pos = H0;
+ for (node *tem = list; tem; tem = tem->next) {
+ hunits x = (max_width - tem->width())/2;
+ out->right(x - pos);
+ pos = x;
+ tem->zero_width_tprint(out);
+ }
+ out->right(max_width - pos);
+}
+
+void bracket_node::tprint(troff_output_file *out)
+{
+ if (list == 0)
+ return;
+ int npieces = 0;
+ node *tem;
+ for (tem = list; tem; tem = tem->next)
+ ++npieces;
+ vunits h = list->size();
+ vunits totalh = h*npieces;
+ vunits y = (totalh - h)/2;
+ out->down(y);
+ for (tem = list; tem; tem = tem->next) {
+ tem->zero_width_tprint(out);
+ out->down(-h);
+ }
+ out->right(max_width);
+ out->down(totalh - y);
+}
+
+void node::tprint(troff_output_file *)
+{
+}
+
+void node::zero_width_tprint(troff_output_file *out)
+{
+ int hpos = out->get_hpos();
+ int vpos = out->get_vpos();
+ tprint(out);
+ out->moveto(hpos, vpos);
+}
+
+void space_node::tprint(troff_output_file *out)
+{
+ out->fill_color(col);
+ out->right(n);
+}
+
+void hmotion_node::tprint(troff_output_file *out)
+{
+ out->fill_color(col);
+ out->right(n);
+}
+
+void space_char_hmotion_node::tprint(troff_output_file *out)
+{
+ out->fill_color(col);
+ if (is_html) {
+ // we emit the space width as a negative glyph index
+ out->flush_tbuf();
+ out->do_motion();
+ out->put('N');
+ out->put(-n.to_units());
+ out->put('\n');
+ }
+ out->right(n);
+}
+
+void vmotion_node::tprint(troff_output_file *out)
+{
+ out->fill_color(col);
+ out->down(n);
+}
+
+void kern_pair_node::tprint(troff_output_file *out)
+{
+ n1->tprint(out);
+ out->right(amount);
+ n2->tprint(out);
+}
+
+static void tprint_reverse_node_list(troff_output_file *out, node *n)
+{
+ if (n == 0)
+ return;
+ tprint_reverse_node_list(out, n->next);
+ n->tprint(out);
+}
+
+void dbreak_node::tprint(troff_output_file *out)
+{
+ tprint_reverse_node_list(out, none);
+}
+
+void composite_node::tprint(troff_output_file *out)
+{
+ hunits bold_offset;
+ int is_bold = tf->get_bold(&bold_offset);
+ hunits track_kern = tf->get_track_kern();
+ hunits constant_space;
+ int is_constant_spaced = tf->get_constant_space(&constant_space);
+ hunits x = H0;
+ if (is_constant_spaced) {
+ x = constant_space;
+ for (node *tem = n; tem; tem = tem->next)
+ x -= tem->width();
+ if (is_bold)
+ x -= bold_offset;
+ hunits x2 = x/2;
+ out->right(x2);
+ x -= x2;
+ }
+ if (is_bold) {
+ int hpos = out->get_hpos();
+ int vpos = out->get_vpos();
+ tprint_reverse_node_list(out, n);
+ out->moveto(hpos, vpos);
+ out->right(bold_offset);
+ }
+ tprint_reverse_node_list(out, n);
+ if (is_constant_spaced)
+ out->right(x);
+ else
+ out->right(track_kern);
+}
+
+static node *make_composite_node(charinfo *s, environment *env)
+{
+ int fontno = env_definite_font(env);
+ if (fontno < 0) {
+ error("cannot format composite glyph: no current font");
+ return 0;
+ }
+ assert(fontno < font_table_size && font_table[fontno] != 0);
+ node *n = charinfo_to_node_list(s, env);
+ font_size fs = env->get_font_size();
+ int char_height = env->get_char_height();
+ int char_slant = env->get_char_slant();
+ tfont *tf = font_table[fontno]->get_tfont(fs, char_height, char_slant,
+ fontno);
+ if (env->is_composite())
+ tf = tf->get_plain();
+ return new composite_node(n, s, tf, 0, 0, 0);
+}
+
+static node *make_glyph_node(charinfo *s, environment *env,
+ bool want_warnings = true)
+{
+ int fontno = env_definite_font(env);
+ if (fontno < 0) {
+ error("cannot format glyph: no current font");
+ return 0;
+ }
+ assert(fontno < font_table_size && font_table[fontno] != 0);
+ int fn = fontno;
+ int found = font_table[fontno]->contains(s);
+ if (!found) {
+ macro *mac = s->get_macro();
+ if (mac && s->is_fallback())
+ return make_composite_node(s, env);
+ if (s->numbered()) {
+ if (want_warnings)
+ warning(WARN_CHAR, "character code %1 not defined in current"
+ " font", s->get_number());
+ return 0;
+ }
+ special_font_list *sf = font_table[fontno]->sf;
+ while (sf != 0 && !found) {
+ fn = sf->n;
+ if (font_table[fn])
+ found = font_table[fn]->contains(s);
+ sf = sf->next;
+ }
+ if (!found) {
+ symbol f = font_table[fontno]->get_name();
+ string gl(f.contents());
+ gl += ' ';
+ gl += s->nm.contents();
+ gl += '\0';
+ charinfo *ci = get_charinfo(symbol(gl.contents()));
+ if (ci && ci->get_macro())
+ return make_composite_node(ci, env);
+ }
+ if (!found) {
+ sf = global_special_fonts;
+ while (sf != 0 && !found) {
+ fn = sf->n;
+ if (font_table[fn])
+ found = font_table[fn]->contains(s);
+ sf = sf->next;
+ }
+ }
+ if (!found)
+ if (mac && s->is_special())
+ return make_composite_node(s, env);
+ if (!found) {
+ for (fn = 0; fn < font_table_size; fn++)
+ if (font_table[fn]
+ && font_table[fn]->is_special()
+ && font_table[fn]->contains(s)) {
+ found = 1;
+ break;
+ }
+ }
+ if (!found) {
+ if (want_warnings && s->first_time_not_found()) {
+ unsigned char input_code = s->get_ascii_code();
+ if (input_code != 0) {
+ if (csgraph(input_code))
+ warning(WARN_CHAR, "character '%1' not defined",
+ input_code);
+ else
+ warning(WARN_CHAR, "character with input code %1 not"
+ " defined", int(input_code));
+ }
+ else if (s->nm.contents()) {
+ const char *nm = s->nm.contents();
+ const char *backslash = (nm[1] == 0) ? "\\" : "";
+ warning(WARN_CHAR, "special character '%1%2' not defined",
+ backslash, nm);
+ }
+ }
+ return 0;
+ }
+ }
+ font_size fs = env->get_font_size();
+ int char_height = env->get_char_height();
+ int char_slant = env->get_char_slant();
+ tfont *tf = font_table[fontno]->get_tfont(fs, char_height, char_slant, fn);
+ if (env->is_composite())
+ tf = tf->get_plain();
+ color *gcol = env->get_glyph_color();
+ color *fcol = env->get_fill_color();
+ return new glyph_node(s, tf, gcol, fcol, 0, 0);
+}
+
+node *make_node(charinfo *ci, environment *env)
+{
+ switch (ci->get_special_translation()) {
+ case charinfo::TRANSLATE_SPACE:
+ return new space_char_hmotion_node(env->get_space_width(),
+ env->get_fill_color());
+ case charinfo::TRANSLATE_STRETCHABLE_SPACE:
+ return new unbreakable_space_node(env->get_space_width(),
+ env->get_fill_color());
+ case charinfo::TRANSLATE_DUMMY:
+ return new dummy_node;
+ case charinfo::TRANSLATE_HYPHEN_INDICATOR:
+ error("translation to \\%% ignored in this context");
+ break;
+ }
+ charinfo *tem = ci->get_translation();
+ if (tem)
+ ci = tem;
+ macro *mac = ci->get_macro();
+ if (mac && ci->is_normal())
+ return make_composite_node(ci, env);
+ else
+ return make_glyph_node(ci, env);
+}
+
+bool character_exists(charinfo *ci, environment *env)
+{
+ if (ci->get_special_translation() != charinfo::TRANSLATE_NONE)
+ return true;
+ charinfo *tem = ci->get_translation();
+ if (tem)
+ ci = tem;
+ if (ci->get_macro())
+ return true;
+ node *nd = make_glyph_node(ci, env, false /* don't want warnings */);
+ if (nd) {
+ delete nd;
+ return true;
+ }
+ return false;
+}
+
+node *node::add_char(charinfo *ci, environment *env,
+ hunits *widthp, int *spacep, node **glyph_comp_np)
+{
+ node *res;
+ switch (ci->get_special_translation()) {
+ case charinfo::TRANSLATE_SPACE:
+ res = new space_char_hmotion_node(env->get_space_width(),
+ env->get_fill_color(), this);
+ *widthp += res->width();
+ return res;
+ case charinfo::TRANSLATE_STRETCHABLE_SPACE:
+ res = new unbreakable_space_node(env->get_space_width(),
+ env->get_fill_color(), this);
+ res->freeze_space();
+ *widthp += res->width();
+ *spacep += res->nspaces();
+ return res;
+ case charinfo::TRANSLATE_DUMMY:
+ return new dummy_node(this);
+ case charinfo::TRANSLATE_HYPHEN_INDICATOR:
+ return add_discretionary_hyphen();
+ }
+ charinfo *tem = ci->get_translation();
+ if (tem)
+ ci = tem;
+ macro *mac = ci->get_macro();
+ if (mac && ci->is_normal()) {
+ res = make_composite_node(ci, env);
+ if (res) {
+ res->next = this;
+ *widthp += res->width();
+ if (glyph_comp_np)
+ *glyph_comp_np = res;
+ }
+ else {
+ if (glyph_comp_np)
+ *glyph_comp_np = res;
+ return this;
+ }
+ }
+ else {
+ node *gn = make_glyph_node(ci, env);
+ if (gn == 0)
+ return this;
+ else {
+ hunits old_width = width();
+ node *p = gn->merge_self(this);
+ if (p == 0) {
+ *widthp += gn->width();
+ gn->next = this;
+ res = gn;
+ }
+ else {
+ *widthp += p->width() - old_width;
+ res = p;
+ }
+ if (glyph_comp_np)
+ *glyph_comp_np = res;
+ }
+ }
+ int break_code = 0;
+ if (ci->can_break_before())
+ break_code = CAN_BREAK_BEFORE;
+ if (ci->can_break_after())
+ break_code |= CAN_BREAK_AFTER;
+ if (ci->ignore_hcodes())
+ break_code |= IGNORE_HCODES;
+ if (ci->prohibit_break_before())
+ break_code = PROHIBIT_BREAK_BEFORE;
+ if (ci->prohibit_break_after())
+ break_code |= PROHIBIT_BREAK_AFTER;
+ if (ci->inter_char_space())
+ break_code |= INTER_CHAR_SPACE;
+ if (break_code) {
+ node *next1 = res->next;
+ res->next = 0;
+ res = new break_char_node(res, break_code, get_break_code(),
+ env->get_fill_color(), next1);
+ }
+ return res;
+}
+
+#ifdef __GNUG__
+inline
+#endif
+int same_node(node *n1, node *n2)
+{
+ if (n1 != 0) {
+ if (n2 != 0)
+ return n1->type() == n2->type() && n1->same(n2);
+ else
+ return 0;
+ }
+ else
+ return n2 == 0;
+}
+
+int same_node_list(node *n1, node *n2)
+{
+ while (n1 && n2) {
+ if (n1->type() != n2->type() || !n1->same(n2))
+ return 0;
+ n1 = n1->next;
+ n2 = n2->next;
+ }
+ return !n1 && !n2;
+}
+
+int extra_size_node::same(node *nd)
+{
+ return n == ((extra_size_node *)nd)->n;
+}
+
+const char *extra_size_node::type()
+{
+ return "extra_size_node";
+}
+
+int extra_size_node::force_tprint()
+{
+ return 0;
+}
+
+int extra_size_node::is_tag()
+{
+ return 0;
+}
+
+int vertical_size_node::same(node *nd)
+{
+ return n == ((vertical_size_node *)nd)->n;
+}
+
+const char *vertical_size_node::type()
+{
+ return "vertical_size_node";
+}
+
+int vertical_size_node::set_unformat_flag()
+{
+ return 0;
+}
+
+int vertical_size_node::force_tprint()
+{
+ return 0;
+}
+
+int vertical_size_node::is_tag()
+{
+ return 0;
+}
+
+int hmotion_node::same(node *nd)
+{
+ return n == ((hmotion_node *)nd)->n
+ && col == ((hmotion_node *)nd)->col;
+}
+
+const char *hmotion_node::type()
+{
+ return "hmotion_node";
+}
+
+int hmotion_node::set_unformat_flag()
+{
+ unformat = 1;
+ return 1;
+}
+
+int hmotion_node::force_tprint()
+{
+ return 0;
+}
+
+int hmotion_node::is_tag()
+{
+ return 0;
+}
+
+node *hmotion_node::add_self(node *nd, hyphen_list **p)
+{
+ next = nd;
+ hyphen_list *pp = *p;
+ *p = (*p)->next;
+ delete pp;
+ return this;
+}
+
+hyphen_list *hmotion_node::get_hyphen_list(hyphen_list *tail, int *)
+{
+ return new hyphen_list(0, tail);
+}
+
+int space_char_hmotion_node::same(node *nd)
+{
+ return n == ((space_char_hmotion_node *)nd)->n
+ && col == ((space_char_hmotion_node *)nd)->col;
+}
+
+const char *space_char_hmotion_node::type()
+{
+ return "space_char_hmotion_node";
+}
+
+int space_char_hmotion_node::force_tprint()
+{
+ return 0;
+}
+
+int space_char_hmotion_node::is_tag()
+{
+ return 0;
+}
+
+node *space_char_hmotion_node::add_self(node *nd, hyphen_list **p)
+{
+ next = nd;
+ hyphen_list *pp = *p;
+ *p = (*p)->next;
+ delete pp;
+ return this;
+}
+
+hyphen_list *space_char_hmotion_node::get_hyphen_list(hyphen_list *tail,
+ int *)
+{
+ return new hyphen_list(0, tail);
+}
+
+int vmotion_node::same(node *nd)
+{
+ return n == ((vmotion_node *)nd)->n
+ && col == ((vmotion_node *)nd)->col;
+}
+
+const char *vmotion_node::type()
+{
+ return "vmotion_node";
+}
+
+int vmotion_node::force_tprint()
+{
+ return 0;
+}
+
+int vmotion_node::is_tag()
+{
+ return 0;
+}
+
+int hline_node::same(node *nd)
+{
+ return x == ((hline_node *)nd)->x && same_node(n, ((hline_node *)nd)->n);
+}
+
+const char *hline_node::type()
+{
+ return "hline_node";
+}
+
+int hline_node::force_tprint()
+{
+ return 0;
+}
+
+int hline_node::is_tag()
+{
+ return 0;
+}
+
+int vline_node::same(node *nd)
+{
+ return x == ((vline_node *)nd)->x && same_node(n, ((vline_node *)nd)->n);
+}
+
+const char *vline_node::type()
+{
+ return "vline_node";
+}
+
+int vline_node::force_tprint()
+{
+ return 0;
+}
+
+int vline_node::is_tag()
+{
+ return 0;
+}
+
+int dummy_node::same(node * /*nd*/)
+{
+ return 1;
+}
+
+const char *dummy_node::type()
+{
+ return "dummy_node";
+}
+
+int dummy_node::force_tprint()
+{
+ return 0;
+}
+
+int dummy_node::is_tag()
+{
+ return 0;
+}
+
+int transparent_dummy_node::same(node * /*nd*/)
+{
+ return 1;
+}
+
+const char *transparent_dummy_node::type()
+{
+ return "transparent_dummy_node";
+}
+
+int transparent_dummy_node::force_tprint()
+{
+ return 0;
+}
+
+int transparent_dummy_node::is_tag()
+{
+ return 0;
+}
+
+int transparent_dummy_node::ends_sentence()
+{
+ return 2;
+}
+
+int zero_width_node::same(node *nd)
+{
+ return same_node_list(n, ((zero_width_node *)nd)->n);
+}
+
+const char *zero_width_node::type()
+{
+ return "zero_width_node";
+}
+
+int zero_width_node::force_tprint()
+{
+ return 0;
+}
+
+int zero_width_node::is_tag()
+{
+ return 0;
+}
+
+int italic_corrected_node::same(node *nd)
+{
+ return (x == ((italic_corrected_node *)nd)->x
+ && same_node(n, ((italic_corrected_node *)nd)->n));
+}
+
+const char *italic_corrected_node::type()
+{
+ return "italic_corrected_node";
+}
+
+int italic_corrected_node::force_tprint()
+{
+ return 0;
+}
+
+int italic_corrected_node::is_tag()
+{
+ return 0;
+}
+
+left_italic_corrected_node::left_italic_corrected_node(node *xx)
+: node(xx), n(0)
+{
+}
+
+left_italic_corrected_node::left_italic_corrected_node(statem *s, int pop,
+ node *xx)
+: node(xx, s, pop), n(0)
+{
+}
+
+left_italic_corrected_node::~left_italic_corrected_node()
+{
+ delete n;
+}
+
+node *left_italic_corrected_node::merge_glyph_node(glyph_node *gn)
+{
+ if (n == 0) {
+ hunits lic = gn->left_italic_correction();
+ if (!lic.is_zero()) {
+ x = lic;
+ n = gn;
+ return this;
+ }
+ }
+ else {
+ node *nd = n->merge_glyph_node(gn);
+ if (nd) {
+ n = nd;
+ x = n->left_italic_correction();
+ return this;
+ }
+ }
+ return 0;
+}
+
+node *left_italic_corrected_node::copy()
+{
+ left_italic_corrected_node *nd =
+ new left_italic_corrected_node(state, div_nest_level);
+ if (n) {
+ nd->n = n->copy();
+ nd->x = x;
+ }
+ return nd;
+}
+
+void left_italic_corrected_node::tprint(troff_output_file *out)
+{
+ if (n) {
+ out->right(x);
+ n->tprint(out);
+ }
+}
+
+const char *left_italic_corrected_node::type()
+{
+ return "left_italic_corrected_node";
+}
+
+int left_italic_corrected_node::force_tprint()
+{
+ return 0;
+}
+
+int left_italic_corrected_node::is_tag()
+{
+ return 0;
+}
+
+int left_italic_corrected_node::same(node *nd)
+{
+ return (x == ((left_italic_corrected_node *)nd)->x
+ && same_node(n, ((left_italic_corrected_node *)nd)->n));
+}
+
+void left_italic_corrected_node::ascii_print(ascii_output_file *out)
+{
+ if (n)
+ n->ascii_print(out);
+}
+
+hunits left_italic_corrected_node::width()
+{
+ return n ? n->width() + x : H0;
+}
+
+void left_italic_corrected_node::vertical_extent(vunits *minimum,
+ vunits *maximum)
+{
+ if (n)
+ n->vertical_extent(minimum, maximum);
+ else
+ node::vertical_extent(minimum, maximum);
+}
+
+hunits left_italic_corrected_node::skew()
+{
+ return n ? n->skew() + x/2 : H0;
+}
+
+hunits left_italic_corrected_node::subscript_correction()
+{
+ return n ? n->subscript_correction() : H0;
+}
+
+hunits left_italic_corrected_node::italic_correction()
+{
+ return n ? n->italic_correction() : H0;
+}
+
+int left_italic_corrected_node::ends_sentence()
+{
+ return n ? n->ends_sentence() : 0;
+}
+
+int left_italic_corrected_node::overlaps_horizontally()
+{
+ return n ? n->overlaps_horizontally() : 0;
+}
+
+int left_italic_corrected_node::overlaps_vertically()
+{
+ return n ? n->overlaps_vertically() : 0;
+}
+
+node *left_italic_corrected_node::last_char_node()
+{
+ return n ? n->last_char_node() : 0;
+}
+
+tfont *left_italic_corrected_node::get_tfont()
+{
+ return n ? n->get_tfont() : 0;
+}
+
+hyphenation_type left_italic_corrected_node::get_hyphenation_type()
+{
+ if (n)
+ return n->get_hyphenation_type();
+ else
+ return HYPHEN_MIDDLE;
+}
+
+hyphen_list *left_italic_corrected_node::get_hyphen_list(hyphen_list *tail,
+ int *count)
+{
+ return n ? n->get_hyphen_list(tail, count) : tail;
+}
+
+node *left_italic_corrected_node::add_self(node *nd, hyphen_list **p)
+{
+ if (n) {
+ nd = new left_italic_corrected_node(state, div_nest_level, nd);
+ nd = n->add_self(nd, p);
+ n = 0;
+ delete this;
+ return nd;
+ }
+ else {
+ next = nd;
+ return this;
+ }
+}
+
+int left_italic_corrected_node::character_type()
+{
+ return n ? n->character_type() : 0;
+}
+
+int overstrike_node::same(node *nd)
+{
+ return same_node_list(list, ((overstrike_node *)nd)->list);
+}
+
+const char *overstrike_node::type()
+{
+ return "overstrike_node";
+}
+
+int overstrike_node::force_tprint()
+{
+ return 0;
+}
+
+int overstrike_node::is_tag()
+{
+ return 0;
+}
+
+node *overstrike_node::add_self(node *n, hyphen_list **p)
+{
+ next = n;
+ hyphen_list *pp = *p;
+ *p = (*p)->next;
+ delete pp;
+ return this;
+}
+
+hyphen_list *overstrike_node::get_hyphen_list(hyphen_list *tail, int *)
+{
+ return new hyphen_list(0, tail);
+}
+
+int bracket_node::same(node *nd)
+{
+ return same_node_list(list, ((bracket_node *)nd)->list);
+}
+
+const char *bracket_node::type()
+{
+ return "bracket_node";
+}
+
+int bracket_node::force_tprint()
+{
+ return 0;
+}
+
+int bracket_node::is_tag()
+{
+ return 0;
+}
+
+int composite_node::same(node *nd)
+{
+ return ci == ((composite_node *)nd)->ci
+ && same_node_list(n, ((composite_node *)nd)->n);
+}
+
+const char *composite_node::type()
+{
+ return "composite_node";
+}
+
+int composite_node::force_tprint()
+{
+ return 0;
+}
+
+int composite_node::is_tag()
+{
+ return 0;
+}
+
+int glyph_node::same(node *nd)
+{
+ return ci == ((glyph_node *)nd)->ci
+ && tf == ((glyph_node *)nd)->tf
+ && gcol == ((glyph_node *)nd)->gcol
+ && fcol == ((glyph_node *)nd)->fcol;
+}
+
+const char *glyph_node::type()
+{
+ return "glyph_node";
+}
+
+int glyph_node::force_tprint()
+{
+ return 0;
+}
+
+int glyph_node::is_tag()
+{
+ return 0;
+}
+
+int ligature_node::same(node *nd)
+{
+ return (same_node(n1, ((ligature_node *)nd)->n1)
+ && same_node(n2, ((ligature_node *)nd)->n2)
+ && glyph_node::same(nd));
+}
+
+const char *ligature_node::type()
+{
+ return "ligature_node";
+}
+
+int ligature_node::force_tprint()
+{
+ return 0;
+}
+
+int ligature_node::is_tag()
+{
+ return 0;
+}
+
+int kern_pair_node::same(node *nd)
+{
+ return (amount == ((kern_pair_node *)nd)->amount
+ && same_node(n1, ((kern_pair_node *)nd)->n1)
+ && same_node(n2, ((kern_pair_node *)nd)->n2));
+}
+
+const char *kern_pair_node::type()
+{
+ return "kern_pair_node";
+}
+
+int kern_pair_node::force_tprint()
+{
+ return 0;
+}
+
+int kern_pair_node::is_tag()
+{
+ return 0;
+}
+
+int dbreak_node::same(node *nd)
+{
+ return (same_node_list(none, ((dbreak_node *)nd)->none)
+ && same_node_list(pre, ((dbreak_node *)nd)->pre)
+ && same_node_list(post, ((dbreak_node *)nd)->post));
+}
+
+const char *dbreak_node::type()
+{
+ return "dbreak_node";
+}
+
+int dbreak_node::force_tprint()
+{
+ return 0;
+}
+
+int dbreak_node::is_tag()
+{
+ return 0;
+}
+
+int break_char_node::same(node *nd)
+{
+ return break_code == ((break_char_node *)nd)->break_code
+ && col == ((break_char_node *)nd)->col
+ && same_node(ch, ((break_char_node *)nd)->ch);
+}
+
+const char *break_char_node::type()
+{
+ return "break_char_node";
+}
+
+int break_char_node::force_tprint()
+{
+ return 0;
+}
+
+int break_char_node::is_tag()
+{
+ return 0;
+}
+
+int break_char_node::get_break_code()
+{
+ return break_code;
+}
+
+int line_start_node::same(node * /*nd*/)
+{
+ return 1;
+}
+
+const char *line_start_node::type()
+{
+ return "line_start_node";
+}
+
+int line_start_node::force_tprint()
+{
+ return 0;
+}
+
+int line_start_node::is_tag()
+{
+ return 0;
+}
+
+int space_node::same(node *nd)
+{
+ return n == ((space_node *)nd)->n
+ && set == ((space_node *)nd)->set
+ && col == ((space_node *)nd)->col;
+}
+
+const char *space_node::type()
+{
+ return "space_node";
+}
+
+int word_space_node::same(node *nd)
+{
+ return n == ((word_space_node *)nd)->n
+ && set == ((word_space_node *)nd)->set
+ && col == ((word_space_node *)nd)->col;
+}
+
+const char *word_space_node::type()
+{
+ return "word_space_node";
+}
+
+int word_space_node::force_tprint()
+{
+ return 0;
+}
+
+int word_space_node::is_tag()
+{
+ return 0;
+}
+
+void unbreakable_space_node::tprint(troff_output_file *out)
+{
+ out->fill_color(col);
+ if (is_html) {
+ // we emit the space width as a negative glyph index
+ out->flush_tbuf();
+ out->do_motion();
+ out->put('N');
+ out->put(-n.to_units());
+ out->put('\n');
+ }
+ out->right(n);
+}
+
+int unbreakable_space_node::same(node *nd)
+{
+ return n == ((unbreakable_space_node *)nd)->n
+ && set == ((unbreakable_space_node *)nd)->set
+ && col == ((unbreakable_space_node *)nd)->col;
+}
+
+const char *unbreakable_space_node::type()
+{
+ return "unbreakable_space_node";
+}
+
+node *unbreakable_space_node::add_self(node *nd, hyphen_list **p)
+{
+ next = nd;
+ hyphen_list *pp = *p;
+ *p = (*p)->next;
+ delete pp;
+ return this;
+}
+
+hyphen_list *unbreakable_space_node::get_hyphen_list(hyphen_list *tail, int *)
+{
+ return new hyphen_list(0, tail);
+}
+
+int diverted_space_node::same(node *nd)
+{
+ return n == ((diverted_space_node *)nd)->n;
+}
+
+const char *diverted_space_node::type()
+{
+ return "diverted_space_node";
+}
+
+int diverted_space_node::force_tprint()
+{
+ return 0;
+}
+
+int diverted_space_node::is_tag()
+{
+ return 0;
+}
+
+int diverted_copy_file_node::same(node *nd)
+{
+ return filename == ((diverted_copy_file_node *)nd)->filename;
+}
+
+const char *diverted_copy_file_node::type()
+{
+ return "diverted_copy_file_node";
+}
+
+int diverted_copy_file_node::force_tprint()
+{
+ return 0;
+}
+
+int diverted_copy_file_node::is_tag()
+{
+ return 0;
+}
+
+// Grow the font_table so that its size is > n.
+
+static void grow_font_table(int n)
+{
+ assert(n >= font_table_size);
+ font_info **old_font_table = font_table;
+ int old_font_table_size = font_table_size;
+ font_table_size = font_table_size ? (font_table_size*3)/2 : 10;
+ if (font_table_size <= n)
+ font_table_size = n + 10;
+ font_table = new font_info *[font_table_size];
+ if (old_font_table_size)
+ memcpy(font_table, old_font_table,
+ old_font_table_size*sizeof(font_info *));
+ delete[] old_font_table;
+ for (int i = old_font_table_size; i < font_table_size; i++)
+ font_table[i] = 0;
+}
+
+dictionary font_translation_dictionary(17);
+
+static symbol get_font_translation(symbol nm)
+{
+ void *p = font_translation_dictionary.lookup(nm);
+ return p ? symbol((char *)p) : nm;
+}
+
+dictionary font_dictionary(50);
+
+static bool mount_font_no_translate(int n, symbol name,
+ symbol external_name,
+ bool check_only = false)
+{
+ assert(n >= 0);
+ // We store the address of this char in `font_dictionary` to indicate
+ // that we've previously tried to mount the font and failed.
+ static char a_char;
+ font *fm = 0 /* nullptr */;
+ void *p = font_dictionary.lookup(external_name);
+ if (0 /* nullptr */ == p) {
+ fm = font::load_font(external_name.contents(), check_only);
+ if (check_only)
+ return fm != 0 /* nullptr */;
+ if (0 /* nullptr */ == fm) {
+ (void)font_dictionary.lookup(external_name, &a_char);
+ return false;
+ }
+ (void)font_dictionary.lookup(name, fm);
+ }
+ else if (p == &a_char) {
+ return false;
+ }
+ else
+ fm = (font*)p;
+ if (check_only)
+ return true;
+ if (n >= font_table_size) {
+ if (n - font_table_size > 1000) {
+ error("font position too much larger than first unused position");
+ return false;
+ }
+ grow_font_table(n);
+ }
+ else if (font_table[n] != 0 /* nullptr */)
+ delete font_table[n];
+ font_table[n] = new font_info(name, n, external_name, fm);
+ font_family::invalidate_fontno(n);
+ return true;
+}
+
+bool mount_font(int n, symbol name, symbol external_name)
+{
+ assert(n >= 0);
+ name = get_font_translation(name);
+ if (external_name.is_null())
+ external_name = name;
+ else
+ external_name = get_font_translation(external_name);
+ return mount_font_no_translate(n, name, external_name);
+}
+
+int check_font(symbol fam, symbol name)
+{
+ if (check_style(name))
+ name = concat(fam, name);
+ return mount_font_no_translate(0, name, name, true /* check only */);
+}
+
+int check_style(symbol s)
+{
+ int i = symbol_fontno(s);
+ return i < 0 ? 0 : font_table[i]->is_style();
+}
+
+bool mount_style(int n, symbol name)
+{
+ assert(n >= 0);
+ if (n >= font_table_size) {
+ if (n - font_table_size > 1000) {
+ error("font position too much larger than first unused position");
+ return false;
+ }
+ grow_font_table(n);
+ }
+ else if (font_table[n] != 0)
+ delete font_table[n];
+ font_table[n] = new font_info(get_font_translation(name), n,
+ NULL_SYMBOL, 0);
+ font_family::invalidate_fontno(n);
+ return true;
+}
+
+/* global functions */
+
+void font_translate()
+{
+ symbol from = get_name(true /* required */);
+ if (!from.is_null()) {
+ symbol to = get_name();
+ if (to.is_null() || from == to)
+ font_translation_dictionary.remove(from);
+ else
+ (void)font_translation_dictionary.lookup(from, (void *)to.contents());
+ }
+ skip_line();
+}
+
+void font_position()
+{
+ int n;
+ if (get_integer(&n)) {
+ if (n < 0)
+ error("negative font position");
+ else {
+ symbol internal_name = get_name(true /* required */);
+ if (!internal_name.is_null()) {
+ symbol external_name = get_long_name();
+ if (!mount_font(n, internal_name, external_name)) {
+ string msg;
+ if (external_name != 0 /* nullptr */)
+ msg += string(" from file '") + external_name.contents()
+ + string("'");
+ msg += '\0';
+ error("cannot load font '%1'%2 for mounting",
+ internal_name.contents(), msg.contents());
+ }
+ }
+ }
+ }
+ skip_line();
+}
+
+font_family::font_family(symbol s)
+: map_size(10), nm(s)
+{
+ map = new int[map_size];
+ for (int i = 0; i < map_size; i++)
+ map[i] = -1;
+}
+
+font_family::~font_family()
+{
+ delete[] map;
+}
+
+// Resolve a requested font mounting position to a mounting position
+// usable by the output driver. (Positions 1 through 4 are typically
+// allocated to styles, and are not usable thus.) A return value of
+// `-1` indicates failure.
+int font_family::make_definite(int mounting_position)
+{
+ assert(mounting_position >= 0);
+ int pos = mounting_position;
+ if (pos < 0)
+ return -1;
+ if (pos < map_size && map[pos] >= 0)
+ return map[pos];
+ if (!(pos < font_table_size && font_table[pos] != 0))
+ return -1;
+ if (pos >= map_size) {
+ int old_map_size = map_size;
+ int *old_map = map;
+ map_size *= 3;
+ map_size /= 2;
+ if (pos >= map_size)
+ map_size = pos + 10;
+ map = new int[map_size];
+ memcpy(map, old_map, old_map_size * sizeof (int));
+ delete[] old_map;
+ for (int j = old_map_size; j < map_size; j++)
+ map[j] = -1;
+ }
+ if (!(font_table[pos]->is_style()))
+ return map[pos] = pos;
+ symbol sty = font_table[pos]->get_name();
+ symbol f = concat(nm, sty);
+ int n;
+ // Don't use symbol_fontno, because that might return a style and
+ // because we don't want to translate the name.
+ for (n = 0; n < font_table_size; n++)
+ if (font_table[n] != 0 && font_table[n]->is_named(f)
+ && !font_table[n]->is_style())
+ break;
+ if (n >= font_table_size) {
+ n = next_available_font_position();
+ if (!mount_font_no_translate(n, f, f))
+ return -1;
+ }
+ return map[pos] = n;
+}
+
+dictionary family_dictionary(5);
+
+font_family *lookup_family(symbol nm)
+{
+ font_family *f = (font_family *)family_dictionary.lookup(nm);
+ if (!f) {
+ f = new font_family(nm);
+ (void)family_dictionary.lookup(nm, f);
+ }
+ return f;
+}
+
+void font_family::invalidate_fontno(int n)
+{
+ assert(n >= 0 && n < font_table_size);
+ dictionary_iterator iter(family_dictionary);
+ symbol nam;
+ font_family *fam;
+ while (iter.get(&nam, (void **)&fam)) {
+ int mapsize = fam->map_size;
+ if (n < mapsize)
+ fam->map[n] = -1;
+ for (int i = 0; i < mapsize; i++)
+ if (fam->map[i] == n)
+ fam->map[i] = -1;
+ }
+}
+
+void style()
+{
+ int n;
+ if (get_integer(&n)) {
+ if (n < 0)
+ error("negative font position");
+ else {
+ symbol internal_name = get_name(true /* required */);
+ if (!internal_name.is_null())
+ (void) mount_style(n, internal_name);
+ }
+ }
+ skip_line();
+}
+
+static void font_lookup_error(font_lookup_info& finfo,
+ const char *msg)
+{
+ if (finfo.requested_name)
+ error("cannot load font '%1' %2", finfo.requested_name, msg);
+ else
+ error("cannot load font at position %1 %2",
+ finfo.requested_position, msg);
+}
+
+// Read the next token and look it up as a font name or position number.
+// Return lookup success. Store, in the supplied struct argument, the
+// requested name or position, and the position actually resolved; -1
+// means not found (see `font_lookup_info` constructor).
+static bool has_font(font_lookup_info *finfo)
+{
+ int n;
+ tok.skip();
+ if (tok.usable_as_delimiter()) {
+ symbol s = get_name(true /* required */);
+ finfo->requested_name = (char *)s.contents();
+ if (!s.is_null()) {
+ n = symbol_fontno(s);
+ if (n < 0) {
+ n = next_available_font_position();
+ if (mount_font(n, s))
+ finfo->position = n;
+ }
+ finfo->position = curenv->get_family()->make_definite(n);
+ }
+ }
+ else if (get_integer(&n)) {
+ finfo->requested_position = n;
+ if (!(n < 0 || n >= font_table_size || font_table[n] == 0))
+ finfo->position = curenv->get_family()->make_definite(n);
+ }
+ return (finfo->position != -1);
+}
+
+static int underline_fontno = 2;
+
+void underline_font()
+{
+ font_lookup_info finfo;
+ if (!has_font(&finfo))
+ font_lookup_error(finfo, "to make it the underline font");
+ else
+ underline_fontno = finfo.position;
+ skip_line();
+}
+
+int get_underline_fontno()
+{
+ return underline_fontno;
+}
+
+void define_font_special_character()
+{
+ font_lookup_info finfo;
+ if (!has_font(&finfo)) {
+ font_lookup_error(finfo, "to define font-specific fallback glyph");
+ // Normally we skip the remainder of the line unconditionally at the
+ // end of a request-implementing function, but do_define_character()
+ // will eat the rest of it for us.
+ skip_line();
+ }
+ else {
+ symbol f = font_table[finfo.position]->get_name();
+ do_define_character(CHAR_FONT_SPECIAL, f.contents());
+ }
+}
+
+void remove_font_special_character()
+{
+ font_lookup_info finfo;
+ if (!has_font(&finfo))
+ font_lookup_error(finfo, "to remove font-specific fallback glyph");
+ else {
+ symbol f = font_table[finfo.position]->get_name();
+ while (!tok.is_newline() && !tok.is_eof()) {
+ if (!tok.is_space() && !tok.is_tab()) {
+ charinfo *s = tok.get_char(true /* required */);
+ string gl(f.contents());
+ gl += ' ';
+ gl += s->nm.contents();
+ gl += '\0';
+ charinfo *ci = get_charinfo(symbol(gl.contents()));
+ if (!ci)
+ break;
+ macro *m = ci->set_macro(0);
+ if (m)
+ delete m;
+ }
+ tok.next();
+ }
+ }
+ skip_line();
+}
+
+static void read_special_fonts(special_font_list **sp)
+{
+ special_font_list *s = *sp;
+ *sp = 0;
+ while (s != 0) {
+ special_font_list *tem = s;
+ s = s->next;
+ delete tem;
+ }
+ special_font_list **p = sp;
+ while (has_arg()) {
+ font_lookup_info finfo;
+ if (!has_font(&finfo))
+ font_lookup_error(finfo, "to mark it as special");
+ else {
+ special_font_list *tem = new special_font_list;
+ tem->n = finfo.position;
+ tem->next = 0;
+ *p = tem;
+ p = &(tem->next);
+ }
+ }
+}
+
+void font_special_request()
+{
+ font_lookup_info finfo;
+ if (!has_font(&finfo))
+ font_lookup_error(finfo, "to mark other fonts as special"
+ " contingently upon it"); // a mouthful :-/
+ else
+ read_special_fonts(&font_table[finfo.position]->sf);
+ skip_line();
+}
+
+void special_request()
+{
+ read_special_fonts(&global_special_fonts);
+ skip_line();
+}
+
+void font_zoom_request()
+{
+ font_lookup_info finfo;
+ if (!has_font(&finfo))
+ font_lookup_error(finfo, "to set a zoom factor for it");
+ else {
+ int n = finfo.position;
+ if (font_table[n]->is_style())
+ warning(WARN_FONT, "can't set zoom factor for a style");
+ else {
+ int zoom;
+ if (has_arg() && get_integer(&zoom)) {
+ if (zoom < 0)
+ warning(WARN_FONT, "can't use negative zoom factor");
+ else
+ font_table[n]->set_zoom(zoom);
+ }
+ else
+ font_table[n]->set_zoom(0);
+ }
+ }
+ skip_line();
+}
+
+int next_available_font_position()
+{
+ int i;
+ for (i = 1; i < font_table_size && font_table[i] != 0; i++)
+ ;
+ return i;
+}
+
+int symbol_fontno(symbol s)
+{
+ s = get_font_translation(s);
+ for (int i = 0; i < font_table_size; i++)
+ if (font_table[i] != 0 && font_table[i]->is_named(s))
+ return i;
+ return -1;
+}
+
+int is_good_fontno(int n)
+{
+ return n >= 0 && n < font_table_size && font_table[n] != 0;
+}
+
+int get_bold_fontno(int n)
+{
+ if (n >= 0 && n < font_table_size && font_table[n] != 0) {
+ hunits offset;
+ if (font_table[n]->get_bold(&offset))
+ return offset.to_units() + 1;
+ else
+ return 0;
+ }
+ else
+ return 0;
+}
+
+hunits env_digit_width(environment *env)
+{
+ node *n = make_glyph_node(charset_table['0'], env);
+ if (n) {
+ hunits x = n->width();
+ delete n;
+ return x;
+ }
+ else
+ return H0;
+}
+
+hunits env_space_width(environment *env)
+{
+ int fn = env_definite_font(env);
+ font_size fs = env->get_font_size();
+ if (fn < 0 || fn >= font_table_size || font_table[fn] == 0)
+ return scale(fs.to_units()/3, env->get_space_size(), 12);
+ else
+ return font_table[fn]->get_space_width(fs, env->get_space_size());
+}
+
+hunits env_sentence_space_width(environment *env)
+{
+ int fn = env_definite_font(env);
+ font_size fs = env->get_font_size();
+ if (fn < 0 || fn >= font_table_size || font_table[fn] == 0)
+ return scale(fs.to_units()/3, env->get_sentence_space_size(), 12);
+ else
+ return font_table[fn]->get_space_width(fs, env->get_sentence_space_size());
+}
+
+hunits env_half_narrow_space_width(environment *env)
+{
+ int fn = env_definite_font(env);
+ font_size fs = env->get_font_size();
+ if (fn < 0 || fn >= font_table_size || font_table[fn] == 0)
+ return 0;
+ else
+ return font_table[fn]->get_half_narrow_space_width(fs);
+}
+
+hunits env_narrow_space_width(environment *env)
+{
+ int fn = env_definite_font(env);
+ font_size fs = env->get_font_size();
+ if (fn < 0 || fn >= font_table_size || font_table[fn] == 0)
+ return 0;
+ else
+ return font_table[fn]->get_narrow_space_width(fs);
+}
+
+void bold_font()
+{
+ font_lookup_info finfo;
+ if (!has_font(&finfo))
+ font_lookup_error(finfo, "for emboldening");
+ else {
+ int n = finfo.position;
+ if (has_arg()) {
+ // This is a bit non-orthogonal, but faithful to CSTR #54. We can
+ // only conditionally embolden a font specified by name, not
+ // position, so ".bd S B 4" works but ".bd 5 3 4" does not. The
+ // latter bolds the font at position 5 unconditionally, and
+ // ignores the third argument.
+ if (tok.usable_as_delimiter()) {
+ font_lookup_info finfo2;
+ if (!has_font(&finfo2))
+ font_lookup_error(finfo2, "for conditional emboldening");
+ else {
+ int f = finfo2.position;
+ units offset;
+ if (has_arg() && get_number(&offset, 'u') && offset >= 1)
+ font_table[f]->set_conditional_bold(n, hunits(offset - 1));
+ else
+ font_table[f]->conditional_unbold(n);
+ }
+ }
+ else {
+ font_lookup_info finfo2;
+ if (!has_font(&finfo2))
+ font_lookup_error(finfo2, "for conditional emboldening");
+ units offset;
+ if (get_number(&offset, 'u') && offset >= 1)
+ font_table[n]->set_bold(hunits(offset - 1));
+ else
+ font_table[n]->unbold();
+ }
+ }
+ else
+ font_table[n]->unbold();
+ }
+ skip_line();
+}
+
+track_kerning_function::track_kerning_function() : non_zero(0)
+{
+}
+
+track_kerning_function::track_kerning_function(int min_s, hunits min_a,
+ int max_s, hunits max_a)
+: non_zero(1), min_size(min_s), min_amount(min_a), max_size(max_s),
+ max_amount(max_a)
+{
+}
+
+int track_kerning_function::operator==(const track_kerning_function &tk)
+{
+ if (non_zero)
+ return (tk.non_zero
+ && min_size == tk.min_size
+ && min_amount == tk.min_amount
+ && max_size == tk.max_size
+ && max_amount == tk.max_amount);
+ else
+ return !tk.non_zero;
+}
+
+int track_kerning_function::operator!=(const track_kerning_function &tk)
+{
+ if (non_zero)
+ return (!tk.non_zero
+ || min_size != tk.min_size
+ || min_amount != tk.min_amount
+ || max_size != tk.max_size
+ || max_amount != tk.max_amount);
+ else
+ return tk.non_zero;
+}
+
+hunits track_kerning_function::compute(int size)
+{
+ if (non_zero) {
+ if (max_size <= min_size)
+ return min_amount;
+ else if (size <= min_size)
+ return min_amount;
+ else if (size >= max_size)
+ return max_amount;
+ else
+ return (scale(max_amount, size - min_size, max_size - min_size)
+ + scale(min_amount, max_size - size, max_size - min_size));
+ }
+ else
+ return H0;
+}
+
+void track_kern()
+{
+ font_lookup_info finfo;
+ if (!has_font(&finfo))
+ font_lookup_error(finfo, "for track kerning");
+ else {
+ int n = finfo.position, min_s, max_s;
+ hunits min_a, max_a;
+ if (has_arg()
+ && get_number(&min_s, 'z')
+ && get_hunits(&min_a, 'p')
+ && get_number(&max_s, 'z')
+ && get_hunits(&max_a, 'p')) {
+ track_kerning_function tk(min_s, min_a, max_s, max_a);
+ font_table[n]->set_track_kern(tk);
+ }
+ else {
+ track_kerning_function tk;
+ font_table[n]->set_track_kern(tk);
+ }
+ }
+ skip_line();
+}
+
+void constant_space()
+{
+ font_lookup_info finfo;
+ if (!has_font(&finfo))
+ font_lookup_error(finfo, "for constant spacing");
+ else {
+ int n = finfo.position, x, y;
+ if (!has_arg() || !get_integer(&x))
+ font_table[n]->set_constant_space(CONSTANT_SPACE_NONE);
+ else {
+ if (!has_arg() || !get_number(&y, 'z'))
+ font_table[n]->set_constant_space(CONSTANT_SPACE_RELATIVE, x);
+ else
+ font_table[n]->set_constant_space(CONSTANT_SPACE_ABSOLUTE,
+ scale(y*x,
+ units_per_inch,
+ 36*72*sizescale));
+ }
+ }
+ skip_line();
+}
+
+void ligature()
+{
+ int lig;
+ if (has_arg() && get_integer(&lig) && lig >= 0 && lig <= 2)
+ global_ligature_mode = lig;
+ else
+ global_ligature_mode = 1;
+ skip_line();
+}
+
+void kern_request()
+{
+ int k;
+ if (has_arg() && get_integer(&k))
+ global_kern_mode = k != 0;
+ else
+ global_kern_mode = 1;
+ skip_line();
+}
+
+void set_soft_hyphen_char()
+{
+ soft_hyphen_char = get_optional_char();
+ if (!soft_hyphen_char)
+ soft_hyphen_char = get_charinfo(HYPHEN_SYMBOL);
+ skip_line();
+}
+
+void init_output()
+{
+ if (suppress_output_flag)
+ the_output = new suppress_output_file;
+ else if (ascii_output_flag)
+ the_output = new ascii_output_file;
+ else
+ the_output = new troff_output_file;
+}
+
+class next_available_font_position_reg : public reg {
+public:
+ const char *get_string();
+};
+
+const char *next_available_font_position_reg::get_string()
+{
+ return i_to_a(next_available_font_position());
+}
+
+class printing_reg : public reg {
+public:
+ const char *get_string();
+};
+
+const char *printing_reg::get_string()
+{
+ if (the_output)
+ return the_output->is_printing() ? "1" : "0";
+ else
+ return "0";
+}
+
+void init_node_requests()
+{
+ init_request("bd", bold_font);
+ init_request("cs", constant_space);
+ init_request("fp", font_position);
+ init_request("fschar", define_font_special_character);
+ init_request("fspecial", font_special_request);
+ init_request("fzoom", font_zoom_request);
+ init_request("ftr", font_translate);
+ init_request("kern", kern_request);
+ init_request("lg", ligature);
+ init_request("rfschar", remove_font_special_character);
+ init_request("shc", set_soft_hyphen_char);
+ init_request("special", special_request);
+ init_request("sty", style);
+ init_request("tkf", track_kern);
+ init_request("uf", underline_font);
+ register_dictionary.define(".fp", new next_available_font_position_reg);
+ register_dictionary.define(".kern",
+ new readonly_register(&global_kern_mode));
+ register_dictionary.define(".lg",
+ new readonly_register(&global_ligature_mode));
+ register_dictionary.define(".P", new printing_reg);
+ soft_hyphen_char = get_charinfo(HYPHEN_SYMBOL);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/roff/troff/node.h b/src/roff/troff/node.h
new file mode 100644
index 0000000..de82753
--- /dev/null
+++ b/src/roff/troff/node.h
@@ -0,0 +1,670 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+struct hyphen_list {
+ unsigned char hyphen;
+ unsigned char breakable;
+ unsigned char hyphenation_code;
+ hyphen_list *next;
+ hyphen_list(unsigned char code, hyphen_list *p = 0);
+};
+
+void hyphenate(hyphen_list *, unsigned);
+
+enum hyphenation_type { HYPHEN_MIDDLE, HYPHEN_BOUNDARY, HYPHEN_INHIBIT };
+
+class ascii_output_file;
+
+struct breakpoint;
+struct vertical_size;
+class charinfo;
+
+class macro;
+
+class troff_output_file;
+class tfont;
+class environment;
+
+class glyph_node;
+class diverted_space_node;
+class token_node;
+
+struct node {
+ node *next;
+ node *last;
+ statem *state;
+ statem *push_state;
+ int div_nest_level;
+ int is_special;
+ node();
+ node(node *);
+ node(node *, statem *, int);
+ node *add_char(charinfo *, environment *, hunits *, int *, node ** = 0);
+
+ virtual ~node();
+ virtual node *copy() = 0;
+ virtual int set_unformat_flag();
+ virtual int force_tprint() = 0;
+ virtual int is_tag() = 0;
+ virtual int get_break_code();
+ virtual hunits width();
+ virtual hunits subscript_correction();
+ virtual hunits italic_correction();
+ virtual hunits left_italic_correction();
+ virtual hunits skew();
+ virtual int nspaces();
+ virtual int merge_space(hunits, hunits, hunits);
+ virtual vunits vertical_width();
+ virtual node *last_char_node();
+ virtual void vertical_extent(vunits *, vunits *);
+ virtual int character_type();
+ virtual void set_vertical_size(vertical_size *);
+ virtual int ends_sentence();
+ virtual node *merge_self(node *);
+ virtual node *add_discretionary_hyphen();
+ virtual node *add_self(node *, hyphen_list **);
+ virtual hyphen_list *get_hyphen_list(hyphen_list *, int *);
+ virtual void ascii_print(ascii_output_file *);
+ virtual void asciify(macro *);
+ virtual int discardable();
+ virtual void spread_space(int *, hunits *);
+ virtual void freeze_space();
+ virtual void is_escape_colon();
+ virtual breakpoint *get_breakpoints(hunits, int, breakpoint * = 0, int = 0);
+ virtual int nbreaks();
+ virtual void split(int, node **, node **);
+ virtual hyphenation_type get_hyphenation_type();
+ virtual int reread(int *);
+ virtual token_node *get_token_node();
+ virtual int overlaps_vertically();
+ virtual int overlaps_horizontally();
+ virtual units size();
+ virtual int interpret(macro *);
+
+ virtual node *merge_glyph_node(glyph_node *);
+ virtual tfont *get_tfont();
+ virtual color *get_glyph_color();
+ virtual color *get_fill_color();
+ virtual void tprint(troff_output_file *);
+ virtual void zero_width_tprint(troff_output_file *);
+
+ node *add_italic_correction(hunits *);
+
+ virtual int same(node *) = 0;
+ virtual const char *type() = 0;
+ virtual void debug_node();
+ virtual void debug_node_list();
+};
+
+inline node::node()
+: next(0), last(0), state(0), push_state(0), div_nest_level(0), is_special(0)
+{
+}
+
+inline node::node(node *n)
+: next(n), last(0), state(0), push_state(0), div_nest_level(0), is_special(0)
+{
+}
+
+inline node::node(node *n, statem *s, int divlevel)
+: next(n), last(0), push_state(0), div_nest_level(divlevel), is_special(0)
+{
+ if (s)
+ state = new statem(s);
+ else
+ state = 0;
+}
+
+inline node::~node()
+{
+ if (state != 0)
+ delete state;
+ if (push_state != 0)
+ delete push_state;
+}
+
+// 0 means it doesn't, 1 means it does, 2 means it's transparent
+
+int node_list_ends_sentence(node *);
+
+struct breakpoint {
+ breakpoint *next;
+ hunits width;
+ int nspaces;
+ node *nd;
+ int index;
+ char hyphenated;
+};
+
+class line_start_node : public node {
+public:
+ line_start_node() {}
+ node *copy() { return new line_start_node; }
+ int same(node *);
+ int force_tprint();
+ int is_tag();
+ const char *type();
+ void asciify(macro *);
+};
+
+class space_node : public node {
+private:
+protected:
+ hunits n;
+ char set;
+ char was_escape_colon;
+ color *col; /* for grotty */
+ space_node(hunits, int, int, color *, statem *, int, node * = 0);
+public:
+ space_node(hunits, color *, node * = 0);
+ node *copy();
+ int nspaces();
+ hunits width();
+ int discardable();
+ int merge_space(hunits, hunits, hunits);
+ void freeze_space();
+ void is_escape_colon();
+ void spread_space(int *, hunits *);
+ void tprint(troff_output_file *);
+ breakpoint *get_breakpoints(hunits, int, breakpoint * = 0, int = 0);
+ int nbreaks();
+ void split(int, node **, node **);
+ void ascii_print(ascii_output_file *);
+ int same(node *);
+ void asciify(macro *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+ hyphenation_type get_hyphenation_type();
+};
+
+struct width_list {
+ hunits width;
+ hunits sentence_width;
+ width_list *next;
+ width_list(hunits, hunits);
+ width_list(width_list *);
+};
+
+class word_space_node : public space_node {
+protected:
+ width_list *orig_width;
+ unsigned char unformat;
+ word_space_node(hunits, int, color *, width_list *, int, statem *, int,
+ node * = 0);
+public:
+ word_space_node(hunits, color *, width_list *, node * = 0);
+ ~word_space_node();
+ node *copy();
+ int reread(int *);
+ int set_unformat_flag();
+ void tprint(troff_output_file *);
+ int same(node *);
+ void asciify(macro *);
+ const char *type();
+ int merge_space(hunits, hunits, hunits);
+ int force_tprint();
+ int is_tag();
+};
+
+class unbreakable_space_node : public word_space_node {
+ unbreakable_space_node(hunits, int, color *, statem *, int, node * = 0);
+public:
+ unbreakable_space_node(hunits, color *, node * = 0);
+ node *copy();
+ int reread(int *);
+ void tprint(troff_output_file *);
+ int same(node *);
+ void asciify(macro *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+ breakpoint *get_breakpoints(hunits, int, breakpoint * = 0, int = 0);
+ int nbreaks();
+ void split(int, node **, node **);
+ int merge_space(hunits, hunits, hunits);
+ node *add_self(node *, hyphen_list **);
+ hyphen_list *get_hyphen_list(hyphen_list *, int *);
+ hyphenation_type get_hyphenation_type();
+};
+
+class diverted_space_node : public node {
+public:
+ vunits n;
+ diverted_space_node(vunits, node * = 0);
+ diverted_space_node(vunits, statem *, int, node * = 0);
+ node *copy();
+ int reread(int *);
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+};
+
+class diverted_copy_file_node : public node {
+ symbol filename;
+public:
+ vunits n;
+ diverted_copy_file_node(symbol, node * = 0);
+ diverted_copy_file_node(symbol, statem *, int, node * = 0);
+ node *copy();
+ int reread(int *);
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+};
+
+class extra_size_node : public node {
+ vunits n;
+public:
+ extra_size_node(vunits);
+ extra_size_node(vunits, statem *, int);
+ void set_vertical_size(vertical_size *);
+ node *copy();
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+};
+
+class vertical_size_node : public node {
+ vunits n;
+public:
+ vertical_size_node(vunits, statem *, int);
+ vertical_size_node(vunits);
+ void set_vertical_size(vertical_size *);
+ void asciify(macro *);
+ node *copy();
+ int set_unformat_flag();
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+};
+
+class hmotion_node : public node {
+protected:
+ hunits n;
+ unsigned char was_tab;
+ unsigned char unformat;
+ color *col; /* for grotty */
+public:
+ hmotion_node(hunits i, color *c, node *nxt = 0)
+ : node(nxt), n(i), was_tab(0), unformat(0), col(c) {}
+ hmotion_node(hunits i, color *c, statem *s, int divlevel, node *nxt = 0)
+ : node(nxt, s, divlevel), n(i), was_tab(0), unformat(0), col(c) {}
+ hmotion_node(hunits i, int flag1, int flag2, color *c, statem *s,
+ int divlevel, node *nxt = 0)
+ : node(nxt, s, divlevel), n(i), was_tab(flag1), unformat(flag2),
+ col(c) {}
+ hmotion_node(hunits i, int flag1, int flag2, color *c, node *nxt = 0)
+ : node(nxt), n(i), was_tab(flag1), unformat(flag2), col(c) {}
+ node *copy();
+ int reread(int *);
+ int set_unformat_flag();
+ void asciify(macro *);
+ void tprint(troff_output_file *);
+ hunits width();
+ void ascii_print(ascii_output_file *);
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+ node *add_self(node *, hyphen_list **);
+ hyphen_list *get_hyphen_list(hyphen_list *, int *);
+ hyphenation_type get_hyphenation_type();
+};
+
+class space_char_hmotion_node : public hmotion_node {
+public:
+ space_char_hmotion_node(hunits, color *, node * = 0);
+ space_char_hmotion_node(hunits, color *, statem *, int, node * = 0);
+ node *copy();
+ void ascii_print(ascii_output_file *);
+ void asciify(macro *);
+ void tprint(troff_output_file *);
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+ node *add_self(node *, hyphen_list **);
+ hyphen_list *get_hyphen_list(hyphen_list *, int *);
+ hyphenation_type get_hyphenation_type();
+};
+
+class vmotion_node : public node {
+ vunits n;
+ color *col; /* for grotty */
+public:
+ vmotion_node(vunits, color *);
+ vmotion_node(vunits, color *, statem *, int);
+ void tprint(troff_output_file *);
+ node *copy();
+ vunits vertical_width();
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+};
+
+class hline_node : public node {
+ hunits x;
+ node *n;
+public:
+ hline_node(hunits, node *, node * = 0);
+ hline_node(hunits, node *, statem *, int, node * = 0);
+ ~hline_node();
+ node *copy();
+ hunits width();
+ void tprint(troff_output_file *);
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+};
+
+class vline_node : public node {
+ vunits x;
+ node *n;
+public:
+ vline_node(vunits, node *, node * = 0);
+ vline_node(vunits, node *, statem *, int, node * = 0);
+ ~vline_node();
+ node *copy();
+ void tprint(troff_output_file *);
+ hunits width();
+ vunits vertical_width();
+ void vertical_extent(vunits *, vunits *);
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+};
+
+class dummy_node : public node {
+public:
+ dummy_node(node *nd = 0) : node(nd) {}
+ node *copy();
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+ hyphenation_type get_hyphenation_type();
+};
+
+class transparent_dummy_node : public node {
+public:
+ transparent_dummy_node(node *nd = 0) : node(nd) {}
+ node *copy();
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+ int ends_sentence();
+ hyphenation_type get_hyphenation_type();
+};
+
+class zero_width_node : public node {
+ node *n;
+public:
+ zero_width_node(node *);
+ zero_width_node(node *, statem *, int);
+ ~zero_width_node();
+ node *copy();
+ void tprint(troff_output_file *);
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+ void append(node *);
+ int character_type();
+ void vertical_extent(vunits *, vunits *);
+};
+
+class left_italic_corrected_node : public node {
+ node *n;
+ hunits x;
+public:
+ left_italic_corrected_node(node * = 0);
+ left_italic_corrected_node(statem *, int, node * = 0);
+ ~left_italic_corrected_node();
+ void tprint(troff_output_file *);
+ void ascii_print(ascii_output_file *);
+ void asciify(macro *);
+ node *copy();
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+ hunits width();
+ node *last_char_node();
+ void vertical_extent(vunits *, vunits *);
+ int ends_sentence();
+ int overlaps_horizontally();
+ int overlaps_vertically();
+ hyphenation_type get_hyphenation_type();
+ tfont *get_tfont();
+ int character_type();
+ hunits skew();
+ hunits italic_correction();
+ hunits subscript_correction();
+ hyphen_list *get_hyphen_list(hyphen_list *, int *);
+ node *add_self(node *, hyphen_list **);
+ node *merge_glyph_node(glyph_node *);
+};
+
+class overstrike_node : public node {
+ node *list;
+ hunits max_width;
+public:
+ overstrike_node();
+ overstrike_node(statem *, int);
+ ~overstrike_node();
+ node *copy();
+ void tprint(troff_output_file *);
+ void overstrike(node *); // add another node to be overstruck
+ hunits width();
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+ node *add_self(node *, hyphen_list **);
+ hyphen_list *get_hyphen_list(hyphen_list *, int *);
+ hyphenation_type get_hyphenation_type();
+};
+
+class bracket_node : public node {
+ node *list;
+ hunits max_width;
+public:
+ bracket_node();
+ bracket_node(statem *, int);
+ ~bracket_node();
+ node *copy();
+ void tprint(troff_output_file *);
+ void bracket(node *); // add another node to be overstruck
+ hunits width();
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+};
+
+class special_node : public node {
+ macro mac;
+ tfont *tf;
+ color *gcol;
+ color *fcol;
+ int no_init_string;
+ void tprint_start(troff_output_file *);
+ void tprint_char(troff_output_file *, unsigned char);
+ void tprint_end(troff_output_file *);
+public:
+ special_node(const macro &, int = 0);
+ special_node(const macro &, tfont *, color *, color *, statem *, int,
+ int = 0);
+ node *copy();
+ void tprint(troff_output_file *);
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+ int ends_sentence();
+ tfont *get_tfont();
+};
+
+class suppress_node : public node {
+ int is_on;
+ int emit_limits; // must we issue the extent of the area written out?
+ symbol filename;
+ char position;
+ int image_id;
+public:
+ suppress_node(int, int);
+ suppress_node(symbol, char, int);
+ suppress_node(int, int, symbol, char, int, statem *, int);
+ suppress_node(int, int, symbol, char, int);
+ node *copy();
+ void tprint(troff_output_file *);
+ hunits width();
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+private:
+ void put(troff_output_file *, const char *);
+};
+
+class tag_node : public node {
+public:
+ string tag_string;
+ int delayed;
+ tag_node();
+ tag_node(string, int);
+ tag_node(string, statem *, int, int);
+ node *copy();
+ void tprint(troff_output_file *);
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+ int ends_sentence();
+};
+
+struct hvpair {
+ hunits h;
+ vunits v;
+ hvpair();
+};
+
+class draw_node : public node {
+ int npoints;
+ font_size sz;
+ color *gcol;
+ color *fcol;
+ char code;
+ hvpair *point;
+public:
+ draw_node(char, hvpair *, int, font_size, color *, color *);
+ draw_node(char, hvpair *, int, font_size, color *, color *, statem *, int);
+ ~draw_node();
+ hunits width();
+ vunits vertical_width();
+ node *copy();
+ void tprint(troff_output_file *);
+ int same(node *);
+ const char *type();
+ int force_tprint();
+ int is_tag();
+};
+
+class charinfo;
+node *make_node(charinfo *, environment *);
+bool character_exists(charinfo *, environment *);
+
+int same_node_list(node *, node *);
+node *reverse_node_list(node *);
+void delete_node_list(node *);
+node *copy_node_list(node *);
+
+int get_bold_fontno(int);
+
+inline hyphen_list::hyphen_list(unsigned char code, hyphen_list *p)
+: hyphen(0), breakable(0), hyphenation_code(code), next(p)
+{
+}
+
+extern void read_desc();
+extern bool mount_font(int, symbol, symbol = NULL_SYMBOL);
+extern int check_font(symbol, symbol);
+extern int check_style(symbol);
+extern bool mount_style(int, symbol);
+extern int is_good_fontno(int);
+extern int symbol_fontno(symbol);
+extern int next_available_font_position();
+extern void init_size_table(int *);
+extern int get_underline_fontno();
+
+class output_file {
+ char make_g_plus_plus_shut_up;
+public:
+ output_file();
+ bool is_dying;
+ virtual ~output_file();
+ virtual void trailer(vunits);
+ virtual void flush() = 0;
+ virtual void transparent_char(unsigned char) = 0;
+ virtual void print_line(hunits x, vunits y, node *n,
+ vunits before, vunits after, hunits width) = 0;
+ virtual void begin_page(int pageno, vunits page_length) = 0;
+ virtual void copy_file(hunits x, vunits y, const char *filename) = 0;
+ virtual int is_printing() = 0;
+ virtual void put_filename(const char *, int);
+ virtual void on();
+ virtual void off();
+#ifdef COLUMN
+ virtual void vjustify(vunits, symbol);
+#endif /* COLUMN */
+ mtsm state;
+};
+
+#ifndef POPEN_MISSING
+extern char *pipe_command;
+#endif
+
+extern output_file *the_output;
+extern void init_output();
+int in_output_page_list(int);
+
+class font_family {
+ int *map;
+ int map_size;
+public:
+ const symbol nm;
+ font_family(symbol);
+ ~font_family();
+ int make_definite(int);
+ static void invalidate_fontno(int);
+};
+
+font_family *lookup_family(symbol);
+symbol get_font_name(int, environment *);
+symbol get_style_name(int);
+extern search_path include_search_path;
diff --git a/src/roff/troff/number.cpp b/src/roff/troff/number.cpp
new file mode 100644
index 0000000..348b557
--- /dev/null
+++ b/src/roff/troff/number.cpp
@@ -0,0 +1,712 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#include "troff.h"
+#include "hvunits.h"
+#include "stringclass.h"
+#include "mtsm.h"
+#include "env.h"
+#include "token.h"
+#include "div.h"
+
+const vunits V0; // zero in vertical units
+const hunits H0; // zero in horizontal units
+
+int hresolution = 1;
+int vresolution = 1;
+int units_per_inch;
+int sizescale;
+
+static bool is_valid_expression(units *v, int scaling_unit,
+ bool is_parenthesized,
+ bool is_mandatory = false);
+static bool is_valid_expression_start();
+
+int get_vunits(vunits *res, unsigned char si)
+{
+ if (!is_valid_expression_start())
+ return 0;
+ units x;
+ if (is_valid_expression(&x, si, false /* is_parenthesized */)) {
+ *res = vunits(x);
+ return 1;
+ }
+ else
+ return 0;
+}
+
+int get_hunits(hunits *res, unsigned char si)
+{
+ if (!is_valid_expression_start())
+ return 0;
+ units x;
+ if (is_valid_expression(&x, si, false /* is_parenthesized */)) {
+ *res = hunits(x);
+ return 1;
+ }
+ else
+ return 0;
+}
+
+// for \B
+
+int get_number_rigidly(units *res, unsigned char si)
+{
+ if (!is_valid_expression_start())
+ return 0;
+ units x;
+ if (is_valid_expression(&x, si, false /* is_parenthesized */,
+ true /* is_mandatory */)) {
+ *res = x;
+ return 1;
+ }
+ else
+ return 0;
+}
+
+int get_number(units *res, unsigned char si)
+{
+ if (!is_valid_expression_start())
+ return 0;
+ units x;
+ if (is_valid_expression(&x, si, false /* is_parenthesized */)) {
+ *res = x;
+ return 1;
+ }
+ else
+ return 0;
+}
+
+int get_integer(int *res)
+{
+ if (!is_valid_expression_start())
+ return 0;
+ units x;
+ if (is_valid_expression(&x, 0, false /* is_parenthesized */)) {
+ *res = x;
+ return 1;
+ }
+ else
+ return 0;
+}
+
+enum incr_number_result { BAD, ABSOLUTE, INCREMENT, DECREMENT };
+
+static incr_number_result get_incr_number(units *res, unsigned char);
+
+int get_vunits(vunits *res, unsigned char si, vunits prev_value)
+{
+ units v;
+ switch (get_incr_number(&v, si)) {
+ case BAD:
+ return 0;
+ case ABSOLUTE:
+ *res = v;
+ break;
+ case INCREMENT:
+ *res = prev_value + v;
+ break;
+ case DECREMENT:
+ *res = prev_value - v;
+ break;
+ default:
+ assert(0 == "unhandled switch case returned by get_incr_number()");
+ }
+ return 1;
+}
+
+int get_hunits(hunits *res, unsigned char si, hunits prev_value)
+{
+ units v;
+ switch (get_incr_number(&v, si)) {
+ case BAD:
+ return 0;
+ case ABSOLUTE:
+ *res = v;
+ break;
+ case INCREMENT:
+ *res = prev_value + v;
+ break;
+ case DECREMENT:
+ *res = prev_value - v;
+ break;
+ default:
+ assert(0 == "unhandled switch case returned by get_incr_number()");
+ }
+ return 1;
+}
+
+int get_number(units *res, unsigned char si, units prev_value)
+{
+ units v;
+ switch (get_incr_number(&v, si)) {
+ case BAD:
+ return 0;
+ case ABSOLUTE:
+ *res = v;
+ break;
+ case INCREMENT:
+ *res = prev_value + v;
+ break;
+ case DECREMENT:
+ *res = prev_value - v;
+ break;
+ default:
+ assert(0 == "unhandled switch case returned by get_incr_number()");
+ }
+ return 1;
+}
+
+int get_integer(int *res, int prev_value)
+{
+ units v;
+ switch (get_incr_number(&v, 0)) {
+ case BAD:
+ return 0;
+ case ABSOLUTE:
+ *res = v;
+ break;
+ case INCREMENT:
+ *res = prev_value + int(v);
+ break;
+ case DECREMENT:
+ *res = prev_value - int(v);
+ break;
+ default:
+ assert(0 == "unhandled switch case returned by get_incr_number()");
+ }
+ return 1;
+}
+
+
+static incr_number_result get_incr_number(units *res, unsigned char si)
+{
+ if (!is_valid_expression_start())
+ return BAD;
+ incr_number_result result = ABSOLUTE;
+ if (tok.ch() == '+') {
+ tok.next();
+ result = INCREMENT;
+ }
+ else if (tok.ch() == '-') {
+ tok.next();
+ result = DECREMENT;
+ }
+ if (is_valid_expression(res, si, false /* is_parenthesized */))
+ return result;
+ else
+ return BAD;
+}
+
+static bool is_valid_expression_start()
+{
+ while (tok.is_space())
+ tok.next();
+ if (tok.is_newline()) {
+ warning(WARN_MISSING, "numeric expression missing");
+ return false;
+ }
+ if (tok.is_tab()) {
+ warning(WARN_TAB, "expected numeric expression, got %1",
+ tok.description());
+ return false;
+ }
+ if (tok.is_right_brace()) {
+ warning(WARN_RIGHT_BRACE, "expected numeric expression, got right"
+ "brace escape sequence");
+ return false;
+ }
+ return true;
+}
+
+enum { OP_LEQ = 'L', OP_GEQ = 'G', OP_MAX = 'X', OP_MIN = 'N' };
+
+#define SCALING_UNITS "icfPmnpuvMsz"
+
+static bool is_valid_term(units *v, int scaling_unit,
+ bool is_parenthesized, bool is_mandatory);
+
+static bool is_valid_expression(units *v, int scaling_unit,
+ bool is_parenthesized,
+ bool is_mandatory)
+{
+ int result = is_valid_term(v, scaling_unit, is_parenthesized,
+ is_mandatory);
+ while (result) {
+ if (is_parenthesized)
+ tok.skip();
+ int op = tok.ch();
+ switch (op) {
+ case '+':
+ case '-':
+ case '/':
+ case '*':
+ case '%':
+ case ':':
+ case '&':
+ tok.next();
+ break;
+ case '>':
+ tok.next();
+ if (tok.ch() == '=') {
+ tok.next();
+ op = OP_GEQ;
+ }
+ else if (tok.ch() == '?') {
+ tok.next();
+ op = OP_MAX;
+ }
+ break;
+ case '<':
+ tok.next();
+ if (tok.ch() == '=') {
+ tok.next();
+ op = OP_LEQ;
+ }
+ else if (tok.ch() == '?') {
+ tok.next();
+ op = OP_MIN;
+ }
+ break;
+ case '=':
+ tok.next();
+ if (tok.ch() == '=')
+ tok.next();
+ break;
+ default:
+ return result;
+ }
+ units v2;
+ if (!is_valid_term(&v2, scaling_unit, is_parenthesized,
+ is_mandatory))
+ return false;
+ int overflow = 0;
+ switch (op) {
+ case '<':
+ *v = *v < v2;
+ break;
+ case '>':
+ *v = *v > v2;
+ break;
+ case OP_LEQ:
+ *v = *v <= v2;
+ break;
+ case OP_GEQ:
+ *v = *v >= v2;
+ break;
+ case OP_MIN:
+ if (*v > v2)
+ *v = v2;
+ break;
+ case OP_MAX:
+ if (*v < v2)
+ *v = v2;
+ break;
+ case '=':
+ *v = *v == v2;
+ break;
+ case '&':
+ *v = *v > 0 && v2 > 0;
+ break;
+ case ':':
+ *v = *v > 0 || v2 > 0;
+ break;
+ case '+':
+ if (v2 < 0) {
+ if (*v < INT_MIN - v2)
+ overflow = 1;
+ }
+ else if (v2 > 0) {
+ if (*v > INT_MAX - v2)
+ overflow = 1;
+ }
+ if (overflow) {
+ error("addition overflow");
+ return false;
+ }
+ *v += v2;
+ break;
+ case '-':
+ if (v2 < 0) {
+ if (*v > INT_MAX + v2)
+ overflow = 1;
+ }
+ else if (v2 > 0) {
+ if (*v < INT_MIN + v2)
+ overflow = 1;
+ }
+ if (overflow) {
+ error("subtraction overflow");
+ return false;
+ }
+ *v -= v2;
+ break;
+ case '*':
+ if (v2 < 0) {
+ if (*v > 0) {
+ if ((unsigned)*v > -(unsigned)INT_MIN / -(unsigned)v2)
+ overflow = 1;
+ }
+ else if (-(unsigned)*v > INT_MAX / -(unsigned)v2)
+ overflow = 1;
+ }
+ else if (v2 > 0) {
+ if (*v > 0) {
+ if (*v > INT_MAX / v2)
+ overflow = 1;
+ }
+ else if (-(unsigned)*v > -(unsigned)INT_MIN / v2)
+ overflow = 1;
+ }
+ if (overflow) {
+ error("multiplication overflow");
+ return false;
+ }
+ *v *= v2;
+ break;
+ case '/':
+ if (v2 == 0) {
+ error("division by zero");
+ return false;
+ }
+ *v /= v2;
+ break;
+ case '%':
+ if (v2 == 0) {
+ error("modulus by zero");
+ return false;
+ }
+ *v %= v2;
+ break;
+ default:
+ assert(0 == "unhandled switch case while processing operator");
+ }
+ }
+ return result;
+}
+
+static bool is_valid_term(units *v, int scaling_unit,
+ bool is_parenthesized, bool is_mandatory)
+{
+ int negative = 0;
+ for (;;)
+ if (is_parenthesized && tok.is_space())
+ tok.next();
+ else if (tok.ch() == '+')
+ tok.next();
+ else if (tok.ch() == '-') {
+ tok.next();
+ negative = !negative;
+ }
+ else
+ break;
+ unsigned char c = tok.ch();
+ switch (c) {
+ case '|':
+ // | is not restricted to the outermost level
+ // tbl uses this
+ tok.next();
+ if (!is_valid_term(v, scaling_unit, is_parenthesized, is_mandatory))
+ return false;
+ int tem;
+ tem = (scaling_unit == 'v'
+ ? curdiv->get_vertical_position().to_units()
+ : curenv->get_input_line_position().to_units());
+ if (tem >= 0) {
+ if (*v < INT_MIN + tem) {
+ error("numeric overflow");
+ return false;
+ }
+ }
+ else {
+ if (*v > INT_MAX + tem) {
+ error("numeric overflow");
+ return false;
+ }
+ }
+ *v -= tem;
+ if (negative) {
+ if (*v == INT_MIN) {
+ error("numeric overflow");
+ return false;
+ }
+ *v = -*v;
+ }
+ return true;
+ case '(':
+ tok.next();
+ c = tok.ch();
+ if (c == ')') {
+ if (is_mandatory)
+ return false;
+ warning(WARN_SYNTAX, "empty parentheses");
+ tok.next();
+ *v = 0;
+ return true;
+ }
+ else if (c != 0 && strchr(SCALING_UNITS, c) != 0) {
+ tok.next();
+ if (tok.ch() == ';') {
+ tok.next();
+ scaling_unit = c;
+ }
+ else {
+ error("expected ';' after scaling unit, got %1",
+ tok.description());
+ return false;
+ }
+ }
+ else if (c == ';') {
+ scaling_unit = 0;
+ tok.next();
+ }
+ if (!is_valid_expression(v, scaling_unit,
+ true /* is_parenthesized */, is_mandatory))
+ return false;
+ tok.skip();
+ if (tok.ch() != ')') {
+ if (is_mandatory)
+ return false;
+ warning(WARN_SYNTAX, "expected ')', got %1", tok.description());
+ }
+ else
+ tok.next();
+ if (negative) {
+ if (*v == INT_MIN) {
+ error("numeric overflow");
+ return false;
+ }
+ *v = -*v;
+ }
+ return true;
+ case '.':
+ *v = 0;
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ *v = 0;
+ do {
+ if (*v > INT_MAX/10) {
+ error("numeric overflow");
+ return false;
+ }
+ *v *= 10;
+ if (*v > INT_MAX - (int(c) - '0')) {
+ error("numeric overflow");
+ return false;
+ }
+ *v += c - '0';
+ tok.next();
+ c = tok.ch();
+ } while (csdigit(c));
+ break;
+ case '/':
+ case '*':
+ case '%':
+ case ':':
+ case '&':
+ case '>':
+ case '<':
+ case '=':
+ warning(WARN_SYNTAX, "empty left operand to '%1' operator", c);
+ *v = 0;
+ return is_mandatory ? false : true;
+ default:
+ warning(WARN_NUMBER, "expected numeric expression, got %1",
+ tok.description());
+ return false;
+ }
+ int divisor = 1;
+ if (tok.ch() == '.') {
+ tok.next();
+ for (;;) {
+ c = tok.ch();
+ if (!csdigit(c))
+ break;
+ // we may multiply the divisor by 254 later on
+ if (divisor <= INT_MAX/2540 && *v <= (INT_MAX - 9)/10) {
+ *v *= 10;
+ *v += c - '0';
+ divisor *= 10;
+ }
+ tok.next();
+ }
+ }
+ int si = scaling_unit;
+ int do_next = 0;
+ if ((c = tok.ch()) != 0 && strchr(SCALING_UNITS, c) != 0) {
+ switch (scaling_unit) {
+ case 0:
+ warning(WARN_SCALE, "scaling unit invalid in context");
+ break;
+ case 'z':
+ if (c != 'u' && c != 'z') {
+ warning(WARN_SCALE, "'%1' scaling unit invalid in context;"
+ " convert to 'z' or 'u'", c);
+ break;
+ }
+ si = c;
+ break;
+ case 'u':
+ si = c;
+ break;
+ default:
+ if (c == 'z') {
+ warning(WARN_SCALE, "'z' scaling unit invalid in context");
+ break;
+ }
+ si = c;
+ break;
+ }
+ // Don't do tok.next() here because the next token might be \s,
+ // which would affect the interpretation of m.
+ do_next = 1;
+ }
+ switch (si) {
+ case 'i':
+ *v = scale(*v, units_per_inch, divisor);
+ break;
+ case 'c':
+ *v = scale(*v, units_per_inch*100, divisor*254);
+ break;
+ case 0:
+ case 'u':
+ if (divisor != 1)
+ *v /= divisor;
+ break;
+ case 'f':
+ *v = scale(*v, 65536, divisor);
+ break;
+ case 'p':
+ *v = scale(*v, units_per_inch, divisor*72);
+ break;
+ case 'P':
+ *v = scale(*v, units_per_inch, divisor*6);
+ break;
+ case 'm':
+ {
+ // Convert to hunits so that with -Tascii 'm' behaves as in nroff.
+ hunits em = curenv->get_size();
+ *v = scale(*v, em.is_zero() ? hresolution : em.to_units(),
+ divisor);
+ }
+ break;
+ case 'M':
+ {
+ hunits em = curenv->get_size();
+ *v = scale(*v, em.is_zero() ? hresolution : em.to_units(),
+ (divisor * 100));
+ }
+ break;
+ case 'n':
+ {
+ // Convert to hunits so that with -Tascii 'n' behaves as in nroff.
+ hunits en = curenv->get_size() / 2;
+ *v = scale(*v, en.is_zero() ? hresolution : en.to_units(),
+ divisor);
+ }
+ break;
+ case 'v':
+ *v = scale(*v, curenv->get_vertical_spacing().to_units(), divisor);
+ break;
+ case 's':
+ while (divisor > INT_MAX/(sizescale*72)) {
+ divisor /= 10;
+ *v /= 10;
+ }
+ *v = scale(*v, units_per_inch, divisor*sizescale*72);
+ break;
+ case 'z':
+ *v = scale(*v, sizescale, divisor);
+ break;
+ default:
+ assert(0 == "unhandled switch case when processing scaling unit");
+ }
+ if (do_next)
+ tok.next();
+ if (negative) {
+ if (*v == INT_MIN) {
+ error("numeric overflow");
+ return false;
+ }
+ *v = -*v;
+ }
+ return true;
+}
+
+units scale(units n, units x, units y)
+{
+ assert(x >= 0 && y > 0);
+ if (x == 0)
+ return 0;
+ if (n >= 0) {
+ if (n <= INT_MAX/x)
+ return (n*x)/y;
+ }
+ else {
+ if (-(unsigned)n <= -(unsigned)INT_MIN/x)
+ return (n*x)/y;
+ }
+ double res = n*double(x)/double(y);
+ if (res > INT_MAX) {
+ error("numeric overflow");
+ return INT_MAX;
+ }
+ else if (res < INT_MIN) {
+ error("numeric overflow");
+ return INT_MIN;
+ }
+ return int(res);
+}
+
+vunits::vunits(units x)
+{
+ // Don't depend on rounding direction when dividing negative integers.
+ if (vresolution == 1)
+ n = x;
+ else
+ n = (x < 0
+ ? -((-x + (vresolution / 2) - 1) / vresolution)
+ : (x + (vresolution / 2) - 1) / vresolution);
+}
+
+hunits::hunits(units x)
+{
+ // Don't depend on rounding direction when dividing negative integers.
+ if (hresolution == 1)
+ n = x;
+ else
+ n = (x < 0
+ ? -((-x + (hresolution / 2) - 1) / hresolution)
+ : (x + (hresolution / 2) - 1) / hresolution);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/roff/troff/reg.cpp b/src/roff/troff/reg.cpp
new file mode 100644
index 0000000..6b7689d
--- /dev/null
+++ b/src/roff/troff/reg.cpp
@@ -0,0 +1,479 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "troff.h"
+#include "dictionary.h"
+#include "token.h"
+#include "request.h"
+#include "reg.h"
+
+object_dictionary register_dictionary(101);
+
+bool reg::get_value(units * /*d*/)
+{
+ return false;
+}
+
+void reg::increment()
+{
+ error("can't increment read-only register");
+}
+
+void reg::decrement()
+{
+ error("can't decrement read-only register");
+}
+
+void reg::set_increment(units /*n*/)
+{
+ error("can't automatically increment read-only register");
+}
+
+void reg::alter_format(char /*f*/, int /*w*/)
+{
+ error("can't assign format of read-only register");
+}
+
+const char *reg::get_format()
+{
+ return "0";
+}
+
+void reg::set_value(units /*n*/)
+{
+ error("can't write read-only register");
+}
+
+general_reg::general_reg() : format('1'), width(0), inc(0)
+{
+}
+
+static char uppercase_array[] = {
+ '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',
+};
+
+static char lowercase_array[] = {
+ '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',
+};
+
+static const char *number_value_to_ascii(int value, char format, int width)
+{
+ static char buf[128]; // must be at least 21
+ switch(format) {
+ case '1':
+ if (width <= 0)
+ return i_to_a(value);
+ else if (width > int(sizeof(buf) - 2))
+ sprintf(buf, "%.*d", int(sizeof(buf) - 2), int(value));
+ else
+ sprintf(buf, "%.*d", width, int(value));
+ break;
+ case 'i':
+ case 'I':
+ {
+ char *p = buf;
+ // troff uses z and w to represent 10000 and 5000 in Roman
+ // numerals; I can find no historical basis for this usage
+ const char *s = format == 'i' ? "zwmdclxvi" : "ZWMDCLXVI";
+ int n = int(value);
+ if (n >= 40000 || n <= -40000) {
+ error("magnitude of '%1' too big for i or I format", n);
+ return i_to_a(n);
+ }
+ if (n == 0) {
+ *p++ = '0';
+ *p = 0;
+ break;
+ }
+ if (n < 0) {
+ *p++ = '-';
+ n = -n;
+ }
+ while (n >= 10000) {
+ *p++ = s[0];
+ n -= 10000;
+ }
+ for (int i = 1000; i > 0; i /= 10, s += 2) {
+ int m = n/i;
+ n -= m*i;
+ switch (m) {
+ case 3:
+ *p++ = s[2];
+ /* falls through */
+ case 2:
+ *p++ = s[2];
+ /* falls through */
+ case 1:
+ *p++ = s[2];
+ break;
+ case 4:
+ *p++ = s[2];
+ *p++ = s[1];
+ break;
+ case 8:
+ *p++ = s[1];
+ *p++ = s[2];
+ *p++ = s[2];
+ *p++ = s[2];
+ break;
+ case 7:
+ *p++ = s[1];
+ *p++ = s[2];
+ *p++ = s[2];
+ break;
+ case 6:
+ *p++ = s[1];
+ *p++ = s[2];
+ break;
+ case 5:
+ *p++ = s[1];
+ break;
+ case 9:
+ *p++ = s[2];
+ *p++ = s[0];
+ }
+ }
+ *p = 0;
+ break;
+ }
+ case 'a':
+ case 'A':
+ {
+ int n = value;
+ char *p = buf;
+ if (n == 0) {
+ *p++ = '0';
+ *p = 0;
+ }
+ else {
+ if (n < 0) {
+ n = -n;
+ *p++ = '-';
+ }
+ // this is a bit tricky
+ while (n > 0) {
+ int d = n % 26;
+ if (d == 0)
+ d = 26;
+ n -= d;
+ n /= 26;
+ *p++ = format == 'a' ? lowercase_array[d - 1] :
+ uppercase_array[d - 1];
+ }
+ *p-- = 0;
+ char *q = buf[0] == '-' ? buf + 1 : buf;
+ while (q < p) {
+ char temp = *q;
+ *q = *p;
+ *p = temp;
+ --p;
+ ++q;
+ }
+ }
+ break;
+ }
+ default:
+ assert(0);
+ break;
+ }
+ return buf;
+}
+
+const char *general_reg::get_string()
+{
+ units n;
+ if (!get_value(&n))
+ return "";
+ return number_value_to_ascii(n, format, width);
+}
+
+
+void general_reg::increment()
+{
+ int n;
+ if (get_value(&n))
+ set_value(n + inc);
+}
+
+void general_reg::decrement()
+{
+ int n;
+ if (get_value(&n))
+ set_value(n - inc);
+}
+
+void general_reg::set_increment(units n)
+{
+ inc = n;
+}
+
+void general_reg::alter_format(char f, int w)
+{
+ format = f;
+ width = w;
+}
+
+static const char *number_format_to_ascii(char format, int width)
+{
+ static char buf[24];
+ if (format == '1') {
+ if (width > 0) {
+ int n = width;
+ if (n > int(sizeof(buf)) - 1)
+ n = int(sizeof(buf)) - 1;
+ sprintf(buf, "%.*d", n, 0);
+ return buf;
+ }
+ else
+ return "0";
+ }
+ else {
+ buf[0] = format;
+ buf[1] = '\0';
+ return buf;
+ }
+}
+
+const char *general_reg::get_format()
+{
+ return number_format_to_ascii(format, width);
+}
+
+class number_reg : public general_reg {
+ units value;
+public:
+ number_reg();
+ bool get_value(units *);
+ void set_value(units);
+};
+
+number_reg::number_reg() : value(0)
+{
+}
+
+bool number_reg::get_value(units *res)
+{
+ *res = value;
+ return true;
+}
+
+void number_reg::set_value(units n)
+{
+ value = n;
+}
+
+variable_reg::variable_reg(units *p) : ptr(p)
+{
+}
+
+void variable_reg::set_value(units n)
+{
+ *ptr = n;
+}
+
+bool variable_reg::get_value(units *res)
+{
+ *res = *ptr;
+ return true;
+}
+
+void define_number_reg()
+{
+ symbol nm = get_name(true /* required */);
+ if (nm.is_null()) {
+ skip_line();
+ return;
+ }
+ reg *r = (reg *)register_dictionary.lookup(nm);
+ units v;
+ units prev_value;
+ if (!r || !r->get_value(&prev_value))
+ prev_value = 0;
+ if (get_number(&v, 'u', prev_value)) {
+ if (r == 0) {
+ r = new number_reg;
+ register_dictionary.define(nm, r);
+ }
+ r->set_value(v);
+ if (tok.is_space() && has_arg() && get_number(&v, 'u'))
+ r->set_increment(v);
+ }
+ skip_line();
+}
+
+#if 0
+void inline_define_reg()
+{
+ token start;
+ start.next();
+ if (!start.delimiter(true /* report error */))
+ return;
+ tok.next();
+ symbol nm = get_name(true /* required */);
+ if (nm.is_null())
+ return;
+ reg *r = (reg *)register_dictionary.lookup(nm);
+ if (r == 0) {
+ r = new number_reg;
+ register_dictionary.define(nm, r);
+ }
+ units v;
+ units prev_value;
+ if (!r->get_value(&prev_value))
+ prev_value = 0;
+ if (get_number(&v, 'u', prev_value)) {
+ r->set_value(v);
+ if (start != tok) {
+ if (get_number(&v, 'u')) {
+ r->set_increment(v);
+ if (start != tok)
+ warning(WARN_DELIM, "closing delimiter does not match");
+ }
+ }
+ }
+}
+#endif
+
+void set_number_reg(symbol nm, units n)
+{
+ reg *r = (reg *)register_dictionary.lookup(nm);
+ if (r == 0) {
+ r = new number_reg;
+ register_dictionary.define(nm, r);
+ }
+ r->set_value(n);
+}
+
+reg *lookup_number_reg(symbol nm)
+{
+ reg *r = (reg *)register_dictionary.lookup(nm);
+ if (r == 0) {
+ warning(WARN_REG, "register '%1' not defined", nm.contents());
+ r = new number_reg;
+ register_dictionary.define(nm, r);
+ }
+ return r;
+}
+
+void alter_format()
+{
+ symbol nm = get_name(true /* required */);
+ if (nm.is_null()) {
+ skip_line();
+ return;
+ }
+ reg *r = (reg *)register_dictionary.lookup(nm);
+ if (r == 0) {
+ r = new number_reg;
+ register_dictionary.define(nm, r);
+ }
+ tok.skip();
+ char c = tok.ch();
+ if (csdigit(c)) {
+ int n = 0;
+ do {
+ ++n;
+ tok.next();
+ } while (csdigit(tok.ch()));
+ r->alter_format('1', n);
+ }
+ else if (c == 'i' || c == 'I' || c == 'a' || c == 'A')
+ r->alter_format(c);
+ else if (tok.is_newline() || tok.is_eof())
+ warning(WARN_MISSING, "missing register format");
+ else
+ if (!cscntrl(c))
+ error("invalid register format '%1'", c);
+ else
+ error("invalid register format (got %1)", tok.description());
+ skip_line();
+}
+
+void remove_reg()
+{
+ for (;;) {
+ symbol s = get_name();
+ if (s.is_null())
+ break;
+ register_dictionary.remove(s);
+ }
+ skip_line();
+}
+
+void alias_reg()
+{
+ symbol s1 = get_name(true /* required */);
+ if (!s1.is_null()) {
+ symbol s2 = get_name(true /* required */);
+ if (!s2.is_null()) {
+ if (!register_dictionary.alias(s1, s2))
+ warning(WARN_REG, "register '%1' not defined", s2.contents());
+ }
+ }
+ skip_line();
+}
+
+void rename_reg()
+{
+ symbol s1 = get_name(true /* required */);
+ if (!s1.is_null()) {
+ symbol s2 = get_name(true /* required */);
+ if (!s2.is_null())
+ register_dictionary.rename(s1, s2);
+ }
+ skip_line();
+}
+
+void print_number_regs()
+{
+ object_dictionary_iterator iter(register_dictionary);
+ reg *r;
+ symbol s;
+ while (iter.get(&s, (object **)&r)) {
+ assert(!s.is_null());
+ errprint("%1\t", s.contents());
+ const char *p = r->get_string();
+ if (p)
+ errprint(p);
+ errprint("\n");
+ }
+ fflush(stderr);
+ skip_line();
+}
+
+void init_reg_requests()
+{
+ init_request("rr", remove_reg);
+ init_request("nr", define_number_reg);
+ init_request("af", alter_format);
+ init_request("aln", alias_reg);
+ init_request("rnn", rename_reg);
+ init_request("pnr", print_number_regs);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/roff/troff/reg.h b/src/roff/troff/reg.h
new file mode 100644
index 0000000..132bcf1
--- /dev/null
+++ b/src/roff/troff/reg.h
@@ -0,0 +1,74 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+class reg : public object {
+public:
+ virtual const char *get_string() = 0;
+ virtual bool get_value(units *);
+ virtual void increment();
+ virtual void decrement();
+ virtual void set_increment(units);
+ virtual void alter_format(char f, int w = 0);
+ virtual const char *get_format();
+ virtual void set_value(units);
+};
+
+class readonly_register : public reg {
+ int *p;
+public:
+ readonly_register(int *);
+ const char *get_string();
+};
+
+class general_reg : public reg {
+ char format;
+ int width;
+ int inc;
+public:
+ general_reg();
+ const char *get_string();
+ void increment();
+ void decrement();
+ void alter_format(char f, int w = 0);
+ void set_increment(units);
+ const char *get_format();
+ void add_value(units);
+
+ void set_value(units) = 0;
+ bool get_value(units *) = 0;
+};
+
+class variable_reg : public general_reg {
+ units *ptr;
+public:
+ variable_reg(int *);
+ void set_value(units);
+ bool get_value(units *);
+};
+
+extern object_dictionary register_dictionary;
+extern void set_number_reg(symbol nm, units n);
+extern void check_output_limits(int x, int y);
+extern void reset_output_registers();
+
+reg *lookup_number_reg(symbol);
+#if 0
+void inline_define_reg();
+#endif
diff --git a/src/roff/troff/request.h b/src/roff/troff/request.h
new file mode 100644
index 0000000..0991e49
--- /dev/null
+++ b/src/roff/troff/request.h
@@ -0,0 +1,97 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+typedef void (*REQUEST_FUNCP)();
+
+class macro;
+
+class request_or_macro : public object {
+public:
+ request_or_macro();
+ virtual void invoke(symbol, bool) = 0;
+ virtual macro *to_macro();
+};
+
+class request : public request_or_macro {
+ REQUEST_FUNCP p;
+public:
+ void invoke(symbol, bool);
+ request(REQUEST_FUNCP);
+};
+
+void delete_request_or_macro(request_or_macro *);
+
+extern object_dictionary request_dictionary;
+
+class macro_header;
+struct node;
+
+class macro : public request_or_macro {
+ const char *filename; // where was it defined?
+ int lineno;
+ int len;
+ int empty_macro;
+ int is_a_diversion;
+ int is_a_string; // if it contains no newline
+public:
+ macro_header *p;
+ macro();
+ ~macro();
+ macro(const macro &);
+ macro(int);
+ macro &operator=(const macro &);
+ void append(unsigned char);
+ void append(node *);
+ void append_unsigned(unsigned int);
+ void append_int(int);
+ void append_str(const char *);
+ void set(unsigned char, int);
+ unsigned char get(int);
+ int length();
+ void invoke(symbol, bool);
+ macro *to_macro();
+ void print_size();
+ int empty();
+ int is_diversion();
+ int is_string();
+ void clear_string_flag();
+ friend class string_iterator;
+ friend void chop_macro();
+ friend void substring_request();
+ friend int operator==(const macro &, const macro &);
+};
+
+extern void init_input_requests();
+extern void init_markup_requests();
+extern void init_div_requests();
+extern void init_node_requests();
+extern void init_reg_requests();
+extern void init_env_requests();
+extern void init_hyphen_requests();
+extern void init_request(const char *, REQUEST_FUNCP);
+
+class charinfo;
+class environment;
+
+node *charinfo_to_node_list(charinfo *, const environment *);
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/roff/troff/token.h b/src/roff/troff/token.h
new file mode 100644
index 0000000..bd76055
--- /dev/null
+++ b/src/roff/troff/token.h
@@ -0,0 +1,249 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+class charinfo;
+struct node;
+class vunits;
+
+class token {
+ symbol nm;
+ node *nd;
+ unsigned char c;
+ int val;
+ units dim;
+ enum token_type {
+ TOKEN_BACKSPACE,
+ TOKEN_BEGIN_TRAP,
+ TOKEN_CHAR, // a normal printing character
+ TOKEN_DUMMY, // \&
+ TOKEN_EMPTY, // this is the initial value
+ TOKEN_END_TRAP,
+ TOKEN_ESCAPE, // \e
+ TOKEN_HYPHEN_INDICATOR,
+ TOKEN_INTERRUPT, // \c
+ TOKEN_ITALIC_CORRECTION, // \/
+ TOKEN_LEADER, // ^A
+ TOKEN_LEFT_BRACE,
+ TOKEN_MARK_INPUT, // \k -- 'nm' is the name of the register
+ TOKEN_NEWLINE, // newline
+ TOKEN_NODE,
+ TOKEN_NUMBERED_CHAR,
+ TOKEN_PAGE_EJECTOR,
+ TOKEN_REQUEST,
+ TOKEN_RIGHT_BRACE,
+ TOKEN_SPACE, // ' ' -- ordinary space
+ TOKEN_SPECIAL, // a special character -- \' \` \- \(xx \[xxx]
+ TOKEN_SPREAD, // \p -- break and spread output line
+ TOKEN_STRETCHABLE_SPACE, // \~
+ TOKEN_UNSTRETCHABLE_SPACE, // '\ '
+ TOKEN_HORIZONTAL_SPACE, // \|, \^, \0, \h
+ TOKEN_TAB, // tab
+ TOKEN_TRANSPARENT, // \!
+ TOKEN_TRANSPARENT_DUMMY, // \)
+ TOKEN_ZERO_WIDTH_BREAK, // \:
+ TOKEN_EOF // end of file
+ } type;
+public:
+ token();
+ ~token();
+ token(const token &);
+ void operator=(const token &);
+ void next();
+ void process();
+ void skip();
+ int nspaces(); // 1 if space, 0 otherwise
+ bool is_eof();
+ bool is_space();
+ bool is_stretchable_space();
+ bool is_unstretchable_space();
+ bool is_horizontal_space();
+ bool is_white_space();
+ bool is_special();
+ bool is_newline();
+ bool is_tab();
+ bool is_leader();
+ bool is_backspace();
+ bool usable_as_delimiter(bool = false);
+ bool is_dummy();
+ bool is_transparent_dummy();
+ bool is_transparent();
+ bool is_left_brace();
+ bool is_right_brace();
+ bool is_page_ejector();
+ bool is_hyphen_indicator();
+ bool is_zero_width_break();
+ int operator==(const token &); // need this for delimiters, and for conditions
+ int operator!=(const token &); // ditto
+ unsigned char ch();
+ charinfo *get_char(bool = false);
+ int add_to_zero_width_node_list(node **);
+ void make_space();
+ void make_newline();
+ const char *description();
+
+ friend void process_input_stack();
+ friend node *do_overstrike();
+};
+
+extern token tok; // the current token
+
+extern symbol get_name(bool = false);
+extern symbol get_long_name(bool = false);
+extern charinfo *get_optional_char();
+extern char *read_string();
+extern void check_missing_character();
+extern void skip_line();
+extern void handle_initial_title();
+
+enum char_mode {
+ CHAR_NORMAL,
+ CHAR_FALLBACK,
+ CHAR_FONT_SPECIAL,
+ CHAR_SPECIAL
+};
+
+extern void do_define_character(char_mode, const char * = 0);
+
+class hunits;
+extern void read_title_parts(node **part, hunits *part_width);
+
+extern int get_number_rigidly(units *result, unsigned char si);
+
+extern int get_number(units *result, unsigned char si);
+extern int get_integer(int *result);
+
+extern int get_number(units *result, unsigned char si, units prev_value);
+extern int get_integer(int *result, int prev_value);
+
+void interpolate_number_reg(symbol, int);
+
+const char *asciify(int c);
+
+inline bool token::is_newline()
+{
+ return type == TOKEN_NEWLINE;
+}
+
+inline bool token::is_space()
+{
+ return type == TOKEN_SPACE;
+}
+
+inline bool token::is_stretchable_space()
+{
+ return type == TOKEN_STRETCHABLE_SPACE;
+}
+
+inline bool token::is_unstretchable_space()
+{
+ return type == TOKEN_UNSTRETCHABLE_SPACE;
+}
+
+inline bool token::is_horizontal_space()
+{
+ return type == TOKEN_HORIZONTAL_SPACE;
+}
+
+inline bool token::is_special()
+{
+ return type == TOKEN_SPECIAL;
+}
+
+inline int token::nspaces()
+{
+ return (int)(type == TOKEN_SPACE);
+}
+
+inline bool token::is_white_space()
+{
+ return type == TOKEN_SPACE || type == TOKEN_TAB;
+}
+
+inline bool token::is_transparent()
+{
+ return type == TOKEN_TRANSPARENT;
+}
+
+inline bool token::is_page_ejector()
+{
+ return type == TOKEN_PAGE_EJECTOR;
+}
+
+inline unsigned char token::ch()
+{
+ return type == TOKEN_CHAR ? c : 0;
+}
+
+inline bool token::is_eof()
+{
+ return type == TOKEN_EOF;
+}
+
+inline bool token::is_dummy()
+{
+ return type == TOKEN_DUMMY;
+}
+
+inline bool token::is_transparent_dummy()
+{
+ return type == TOKEN_TRANSPARENT_DUMMY;
+}
+
+inline bool token::is_left_brace()
+{
+ return type == TOKEN_LEFT_BRACE;
+}
+
+inline bool token::is_right_brace()
+{
+ return type == TOKEN_RIGHT_BRACE;
+}
+
+inline bool token::is_tab()
+{
+ return type == TOKEN_TAB;
+}
+
+inline bool token::is_leader()
+{
+ return type == TOKEN_LEADER;
+}
+
+inline bool token::is_backspace()
+{
+ return type == TOKEN_BACKSPACE;
+}
+
+inline bool token::is_hyphen_indicator()
+{
+ return type == TOKEN_HYPHEN_INDICATOR;
+}
+
+inline bool token::is_zero_width_break()
+{
+ return type == TOKEN_ZERO_WIDTH_BREAK;
+}
+
+bool has_arg();
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/roff/troff/troff.1.man b/src/roff/troff/troff.1.man
new file mode 100644
index 0000000..d83c4a5
--- /dev/null
+++ b/src/roff/troff/troff.1.man
@@ -0,0 +1,1047 @@
+'\" t
+.TH @g@troff @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+@g@troff \- GNU
+.I roff
+typesetter and document formatter
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2021 Free Software Foundation, Inc.
+.\"
+.\" This file is part of groff, the GNU roff type-setting system.
+.\"
+.\" Permission is granted to copy, distribute and/or modify this
+.\" document under the terms of the GNU Free Documentation License,
+.\" Version 1.3 or any later version published by the Free Software
+.\" Foundation; with no Invariant Sections, 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_troff_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY @g@troff
+.RB [ \-abcCEiRUz ]
+.RB [ \-d\~\c
+.IR ctext ]
+.RB [ \-d\~\c
+.IB string =\c
+.IR text ]
+.RB [ \-f\~\c
+.IR font-family ]
+.RB [ \-F\~\c
+.IR font-directory ]
+.RB [ \-I\~\c
+.IR inclusion-directory ]
+.RB [ \-m\~\c
+.IR macro-package ]
+.RB [ \-M\~\c
+.IR macro-directory ]
+.RB [ \-n\~\c
+.IR page-number ]
+.RB [ \-o\~\c
+.IR page-list ]
+.RB [ \-r\~\c
+.IR cnumeric-expression ]
+.RB [ \-r\~\c
+.IB register =\c
+.IR numeric-expression ]
+.RB [ \-T\~\c
+.IR output-device ]
+.RB [ \-w\~\c
+.IR warning-category ]
+.RB [ \-W\~\c
+.IR warning-category ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY @g@troff
+.B \-\-help
+.YS
+.
+.
+.SY @g@troff
+.B \-v
+.
+.SY @g@troff
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+GNU
+.I troff \" GNU
+transforms
+.MR groff @MAN7EXT@
+language input into the device-independent output format described in
+.MR groff_out @MAN5EXT@ ;
+.I @g@troff
+is thus the heart of the GNU
+.I roff
+document formatting system.
+.
+If no
+.I file
+operands are given on the command line,
+or if
+.I file
+is
+.RB \[lq] \- \[rq],
+the standard input stream is read.
+.
+.
+.P
+GNU
+.I troff \" GNU
+is functionally compatible with the AT&T
+.I troff \" AT&T
+typesetter and features numerous extensions.
+.
+Many people prefer to use the
+.MR groff @MAN1EXT@
+command,
+a front end which also runs preprocessors and output drivers in the
+appropriate order and with appropriate options.
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-h
+and
+.B \-\-help
+display a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.B \-a
+Generate a plain text approximation of the typeset output.
+.
+The read-only register
+.B .A
+is set to\~1.
+.
+This option produces a sort of abstract preview of the formatted output.
+.
+.
+.RS
+.IP \[bu] 2n
+Page breaks are marked by a phrase in angle brackets;
+for example,
+\[lq]<beginning of page>\[rq].
+.
+.
+.IP \[bu]
+Lines are broken where they would be in the formatted output.
+.
+.
+.IP \[bu]
+A horizontal motion of any size is represented as one space.
+.
+Adjacent horizontal motions are not combined.
+.
+Inter-sentence space nodes
+(those arising from the second argument to the
+.B .ss
+request)
+are not represented.
+.
+.
+.IP \[bu]
+Vertical motions are not represented.
+.
+.
+.IP \[bu]
+Special characters are rendered in angle brackets;
+for example,
+the default soft hyphen character appears as
+\[lq]<hy>\[rq].
+.RE
+.
+.
+.IP
+The above description should not be considered a specification;
+the details of
+.B \-a
+output are subject to change.
+.
+.
+.TP
+.B \-b
+Write a backtrace reporting the state of
+.IR @g@troff 's
+input parser to the standard error stream with each diagnostic message.
+.
+The line numbers given in the backtrace might not always be correct,
+because
+.IR @g@troff 's
+idea of line numbers can be confused by requests that append to
+.\" strings or (??? strings never contain newlines)
+macros.
+.
+.
+.TP
+.B \-c
+Start with color output disabled.
+.
+.
+.TP
+.B \-C
+Enable AT&T
+.I troff \" AT&T
+compatibility mode;
+implies
+.BR \-c .
+.
+See
+.MR groff_diff @MAN7EXT@ .
+.
+.
+.TP
+.BI \-d\~ ctext
+.TQ
+.BI \-d\~ string = text
+Define
+.I roff
+.RI string\~ c
+or
+.I string
+as
+.I text.
+.
+.IR c \~must
+be one character;
+.I string
+can be of arbitrary length.
+.
+Such string assignments happen before any macro file is loaded,
+including the startup file.
+.
+Due to
+.MR getopt_long 3
+limitations,
+.IR c\~ cannot
+be,
+and
+.I string
+cannot contain,
+an equals sign,
+even though that is a valid character in a
+.I roff
+identifier.
+.
+.
+.TP
+.B \-E
+Inhibit
+.I @g@troff
+error messages;
+implies
+.BR \-Ww .
+.
+This option does
+.I not
+suppress messages sent to the standard error stream by documents or
+macro packages using
+.B tm
+or related requests.
+.
+.
+.TP
+.BI \-f\~ fam
+Use
+.I fam
+as the default font family.
+.
+.
+.TP
+.BI \-F\~ dir
+Search in directory
+.I dir
+for the selected output device's directory of device and font
+description files.
+.
+See the description of
+.I GROFF_FONT_PATH
+in section \[lq]Environment\[rq] below for the default search locations
+and ordering.
+.
+.
+.TP
+.B \-i
+Read the standard input stream after all named input files have been
+processed.
+.
+.
+.TP
+.BI \-I\~ dir
+Search the directory
+.I dir
+for files
+(those named on the command line;
+in
+.BR psbb ,
+.BR so ,
+and
+.B soquiet
+requests;
+and in
+.RB \[lq] "\[rs]X\[aq]ps: import\[aq]" \[rq],
+.RB \[lq] "\[rs]X\[aq]ps: file\[aq]" \[rq],
+and
+.RB \[lq] "\[rs]X\[aq]pdf: pdfpic\[aq]" \[rq]
+device control escape sequences).
+.
+.B \-I
+may be specified more than once;
+each
+.I dir
+is searched in the given order.
+.
+To search the current working directory before others,
+add
+.RB \[lq] "\-I .\&" \[rq]
+at the desired place;
+it is otherwise searched last.
+.
+.B \-I
+works similarly to,
+and is named for,
+the \[lq]include\[rq]
+option of Unix C compilers.
+.
+.
+.TP
+.BI \-m\~ name
+Process the file
+.RI name .tmac
+prior to any input files.
+.
+If not found,
+.IR tmac. name
+is attempted.
+.
+.I name
+(in both arrangements)
+is presumed to be a macro file;
+see the description of
+.I GROFF_TMAC_PATH
+in section \[lq]Environment\[rq] below for the default search locations
+and ordering.
+.
+.
+.TP
+.BI \-M\~ dir
+Search directory
+.I dir
+for macro files.
+.
+See the description of
+.I GROFF_TMAC_PATH
+in section \[lq]Environment\[rq] below for the default search locations
+and ordering.
+.
+.
+.TP
+.BI \-n\~ num
+Begin numbering pages at
+.I num.
+.
+The default
+.RB is\~ 1 .
+.
+.
+.TP
+.BI \-o\~ list
+Output only pages in
+.I list,
+which is a comma-separated list of inclusive page ranges;
+.I n
+means page
+.I n,
+.IB m \- n
+means every page
+.RI between\~ m
+.RI and\~ n ,
+.BI \- n
+means every page up
+.RI to\~ n ,
+and
+.IB n \-
+means every page from
+.IR n \~on.
+.
+.I @g@troff
+stops processing and exits after formatting the last page enumerated in
+.I list.
+.
+.
+.TP
+.BI \-r\~ cnumeric-expression
+.TQ
+.BI \-r\~ register = numeric-expression
+Define
+.I roff
+.RI register\~ c
+or
+.I register
+as
+.I numeric-expression.
+.
+.IR c \~must
+be a one-character name;
+.I register
+can be of arbitrary length.
+.
+Such register assignments happen before any macro file is loaded,
+including the startup file.
+.
+Due to
+.MR getopt_long 3
+limitations,
+.IR c\~ cannot
+be,
+and
+.I register
+cannot contain,
+an equals sign,
+even though that is a valid character in a
+.I roff
+identifier.
+.
+.
+.TP
+.B \-R
+Don't load
+.I troffrc
+and
+.IR troffrc\-end .
+.
+.
+.TP
+.BI \-T\~ dev
+Prepare output for device
+.I dev.
+.
+The default is
+.BR @DEVICE@ ;
+see
+.MR groff @MAN1EXT@ .
+.
+.
+.TP
+.B \-U
+Operate in
+.I unsafe mode,
+enabling the
+.BR open ,
+.BR opena ,
+.BR pi ,
+.BR pso ,
+and
+.B sy
+requests,
+which are disabled by default because they allow an untrusted input
+document to write to arbitrary file names and run arbitrary commands.
+.
+This option also adds the current directory to the macro package search
+path;
+see the
+.B \-m
+and
+.B \-M
+options above.
+.
+.
+.TP
+.BI \-w\~ name
+.TQ
+.BI \-W\~ name
+Enable
+.RB ( \-w )
+or inhibit
+.RB ( \-W )
+warnings in category
+.I name.
+.
+See section \[lq]Warnings\[rq] below.
+.
+.
+.TP
+.B \-z
+Suppress formatted output.
+.
+.
+.\" ====================================================================
+.SH Warnings
+.\" ====================================================================
+.
+.\" BEGIN Keep parallel with groff.texi node "Warnings".
+.\" Caveat: the Texinfo manual sorts them by number, not name.
+Warning diagnostics emitted by
+.I @g@troff
+are divided into named,
+numbered categories.
+.
+The name associated with each warning category is used by the
+.B \-w
+and
+.B \-W
+options.
+.
+Each category is also assigned a power of two;
+the sum of enabled category codes is used by the
+.B warn
+request and the
+.B .warn
+register.
+.
+Warnings of each category are produced under the following
+circumstances.
+.
+.
+.P
+.TS
+tab(@), center, box;
+c c c | c c c
+r rI lB | r rI lB.
+Bit@Code@Category@Bit@Code@Category
+_
+0@1@char@10@1024@reg
+1@2@number@11@2048@tab
+2@4@break@12@4096@right\-brace
+3@8@delim@13@8192@missing
+4@16@el@14@16384@input
+5@32@scale@15@32768@escape
+6@64@range@16@65536@space
+7@128@syntax@17@131072@font
+8@256@di@18@262144@ig
+9@512@mac@19@524288@color
+@@@20@1048576@file
+.TE
+.
+.
+.P
+.nr x \w'\fBright\-brace'+1n+\w'00000'u
+.ta \nxuR
+.
+.
+.TP \nxu+3n
+.BR break "\t4"
+A filled output line could not be broken such that its length was less
+than the output line length
+.BR \[rs]n[.l] .
+.
+This category is enabled by default.
+.
+.
+.TP
+.BR char "\t1"
+No mounted font defines a glyph for the requested character.
+.
+This category is enabled by default.
+.
+.
+.TP
+.BR color "\t524288"
+An undefined color name was selected,
+an attempt was made to define a color using an unrecognized color space,
+an invalid component in a color definition was encountered,
+or an attempt was made to redefine a default color.
+.
+.
+.TP
+.BR delim "\t8"
+The closing delimiter in an escape sequence was missing or mismatched.
+.
+.
+.TP
+.BR di "\t256"
+A
+.BR di ,
+.BR da ,
+.BR box ,
+or
+.B boxa
+request was invoked without an argument when there was no current
+diversion.
+.
+.
+.TP
+.BR el "\t16"
+The
+.B el
+request was encountered with no prior corresponding
+.B ie
+request.
+.
+.
+.TP
+.BR escape "\t32768"
+An unsupported escape sequence was encountered.
+.
+.
+.TP
+.BR file "\t1048576"
+An attempt was made to load a file that does not exist.
+.
+This category is enabled by default.
+.
+.
+.TP
+.BR font "\t131072"
+A non-existent font was selected,
+or the selection was ignored because a font selection escape sequence
+was used after the output line continuation escape sequence on an input
+line.
+.
+This category is enabled by default.
+.
+.
+.TP
+.BR ig "\t262144"
+An invalid escape sequence occurred in input ignored using the
+.B ig
+request.
+.
+This warning category diagnoses a condition that is an error when it
+occurs in non-ignored input.
+.
+.
+.TP
+.BR input "\t16384"
+An invalid character occurred on the input stream.
+.
+.
+.TP
+.BR mac "\t512"
+An undefined string,
+macro,
+or diversion was used.
+.
+When such an object is dereferenced,
+an empty one of that name is automatically created.
+.
+So,
+unless it is later deleted,
+at most one warning is given for each.
+.
+.
+.IP
+This warning is also emitted upon an attempt to move an unplanted trap
+macro.
+.
+In such cases,
+the unplanted macro is
+.I not
+dereferenced,
+so it is not created if it does not exist.
+.
+.
+.TP
+.BR missing "\t8192"
+A request was invoked with a mandatory argument absent.
+.
+.
+.TP
+.BR number "\t2"
+An invalid numeric expression was encountered.
+.
+This category is enabled by default.
+.
+.
+.TP
+.BR range "\t64"
+A numeric expression was out of range for its context.
+.
+.
+.TP
+.BR reg "\t1024"
+An undefined register was used.
+.
+When an undefined register is dereferenced,
+it is automatically defined with a value of\~0.
+.
+So,
+unless it is later deleted,
+at most one warning is given for each.
+.
+.
+.TP
+.BR right\-brace "\t4096"
+A right brace escape sequence
+.B \[rs]}
+was encountered where a number was expected.
+.
+.
+.TP
+.BR scale "\t32"
+A scaling unit inappropriate to its context was used in a numeric
+expression.
+.
+.
+.TP
+.BR space "\t65536"
+A space was missing between a request or macro and its argument.
+.
+This warning is produced when an undefined name longer than two
+characters is encountered and the first two characters of the name
+constitute a defined name.
+.
+No request is invoked,
+no macro called,
+and an empty macro is not defined.
+.
+This category is enabled by default.
+.
+It never occurs in compatibility mode.
+.
+.
+.TP
+.BR syntax "\t128"
+A self-contradictory hyphenation mode was requested;
+an empty or incomplete numeric expression was encountered;
+an operand to a numeric operator was missing;
+an attempt was made to define a recursive,
+empty,
+or nonsensical character class;
+or a
+.I groff
+extension conditional expression operator was used while in
+compatibility mode.
+.
+.
+.TP
+.BR tab "\t2048"
+A tab character was encountered where a number was expected,
+or appeared in an unquoted macro argument.
+.
+.
+.P
+Two warning names group other warning categories for convenience.
+.
+.
+.TP
+.B all
+All warning categories except
+.BR di ,
+.BR mac ,
+and
+.BR reg .
+.
+This shorthand is intended to produce all warnings that are useful with
+macro packages and documents written for AT&T
+.I troff \" AT&T
+and its descendants,
+which have less fastidious diagnostics than GNU
+.IR troff . \" GNU
+.
+.
+.TP
+.B w
+All warning categories.
+.
+Authors of documents and macro packages targeting
+.I groff
+are encouraged to use this setting.
+.\" END Keep parallel with groff.texi node "Warnings".
+.
+.
+.\" ====================================================================
+.SH Environment
+.\" ====================================================================
+.
+.I GROFF_FONT_PATH
+and
+.I GROFF_TMAC_PATH
+each accept a search path of directories;
+that is,
+a list of directory names separated by the system's path component
+separator character.
+.
+On Unix systems,
+this character is a colon (:);
+on Windows systems,
+it is a semicolon (;).
+.
+.
+.TP
+.I GROFF_FONT_PATH
+A list of directories in which to seek the selected output device's
+directory of device and font description files.
+.
+.I @g@troff
+will scan directories given as arguments to any specified
+.B \-F
+options before these,
+then in a site-specific directory
+.RI ( @LOCALFONTDIR@ ),
+a standard location
+.RI ( @FONTDIR@ ),
+and a compatibility directory
+.RI ( @LEGACYFONTDIR@ )
+after them.
+.
+.
+.TP
+.I GROFF_TMAC_PATH
+A list of directories in which to search for macro files.
+.
+.I @g@troff
+will scan directories given as arguments to any specified
+.B \-M
+options before these,
+then the current directory
+(only if in unsafe mode),
+the user's home directory,
+.if !'@COMPATIBILITY_WRAPPERS@'no' \{\
+a platform-specific directory
+.RI ( @SYSTEMMACRODIR@ ),
+.\}
+a site-specific directory
+.RI ( @LOCALMACRODIR@ ),
+and a standard location
+.RI ( @MACRODIR@ )
+after them.
+.
+.
+.TP
+.I GROFF_TYPESETTER
+Set the default output device.
+.
+If empty or not set,
+.B @DEVICE@
+is used.
+.
+The
+.B \-T
+option overrides
+.IR \%GROFF_TYPESETTER .
+.
+.
+.TP
+.I SOURCE_DATE_EPOCH
+A timestamp
+(expressed as seconds since the Unix epoch)
+to use as the output creation timestamp in place of the current time.
+.
+The time is converted to human-readable form using
+.MR localtime 3
+when the formatter starts up and stored in registers usable by documents
+and macro packages.
+.
+.
+.TP
+.I TZ
+The timezone to use when converting the current time
+(or value of
+.IR SOURCE_DATE_EPOCH )
+to human-readable form;
+see
+.MR tzset 3 .
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @MACRODIR@/\:\%troffrc
+is an initialization macro file loaded before any macro packages
+specified with
+.B \-m
+options.
+.
+.
+.TP
+.I @MACRODIR@/\:\%troffrc\-end
+is an initialization macro file loaded after all macro packages
+specified with
+.B \-m
+options.
+.
+.
+.TP
+.IR @MACRODIR@/\: name \:.tmac
+are macro files distributed with
+.IR groff .
+.
+.
+.TP
+.IR @FONTDIR@/\:\%dev name /\:DESC
+describes the output device
+.IR name .
+.
+.
+.TP
+.IR @FONTDIR@/\:\%dev name / F
+describes the font
+.I F
+of device
+.I name.
+.
+.
+.P
+.I troffrc
+and
+.I troffrc\-end
+are sought neither in the current nor the home directory by default for
+security reasons,
+even if the
+.B \-U
+option is specified.
+.
+Use the
+.B \-M
+command-line option or the
+.I GROFF_TMAC_PATH
+environment variable to add these directories to the search path if
+necessary.
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+The GNU version of
+.I troff \" generic
+was originally written by James Clark;
+he also wrote the original version of this document,
+which was updated by
+.MT wl@\:gnu\:.org
+Werner Lemberg
+.ME ,
+.MT groff\-bernd\:.warken\-72@\:web\:.de
+Bernd Warken
+.ME ,
+and
+.MT g.branden\:.robinson@\:gmail\:.com
+G.\& Branden Robinson
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is the primary
+.I groff
+manual.
+.
+You can browse it interactively with \[lq]info groff\[rq].
+.
+.
+.TP
+.MR groff @MAN1EXT@
+offers an overview of the GNU
+.I roff
+system
+and describes its front end executable.
+.
+.
+.TP
+.MR groff @MAN7EXT@
+details the
+.I groff
+language,
+including a short but complete reference of all predefined requests,
+registers,
+and escape sequences.
+.
+.
+.TP
+.MR groff_char @MAN7EXT@
+explains the syntax of
+.I groff
+special character escape sequences,
+and lists all special characters predefined by the language.
+.
+.
+.TP
+.MR groff_diff @MAN7EXT@
+enumerates the differences between
+AT&T device-independent
+.I troff \" AT&T
+and
+.IR groff .
+.
+.
+.TP
+.MR groff_font @MAN5EXT@
+covers the format of
+.I groff
+device and font description files.
+.
+.
+.TP
+.MR groff_out @MAN5EXT@
+describes the format of
+.IR @g@troff 's
+output.
+.
+.
+.TP
+.MR groff_tmac @MAN5EXT@
+includes information about macro files that ship with
+.IR groff .
+.
+.
+.TP
+.MR roff @MAN7EXT@
+supplies background on
+.I roff
+systems in general,
+including pointers to further related documentation.
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_troff_1_man_C]
+.do rr *groff_troff_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/roff/troff/troff.am b/src/roff/troff/troff.am
new file mode 100644
index 0000000..42ac7fa
--- /dev/null
+++ b/src/roff/troff/troff.am
@@ -0,0 +1,66 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+prefixexecbin_PROGRAMS += troff
+PREFIXMAN1 += src/roff/troff/troff.1
+EXTRA_DIST += \
+ src/roff/troff/column.cpp \
+ src/roff/troff/troff.1.man \
+ src/roff/troff/TODO
+troff_LDADD = libgroff.a lib/libgnu.a $(LIBM)
+troff_SOURCES = \
+ src/roff/troff/dictionary.cpp \
+ src/roff/troff/div.cpp \
+ src/roff/troff/env.cpp \
+ src/roff/troff/input.cpp \
+ src/roff/troff/mtsm.cpp \
+ src/roff/troff/node.cpp \
+ src/roff/troff/number.cpp \
+ src/roff/troff/reg.cpp \
+ src/roff/troff/env.h \
+ src/roff/troff/node.h \
+ src/roff/troff/troff.h \
+ src/roff/troff/div.h \
+ src/roff/troff/reg.h \
+ src/roff/troff/dictionary.h \
+ src/roff/troff/input.h \
+ src/roff/troff/mtsm.h \
+ src/roff/troff/token.h \
+ src/roff/troff/charinfo.h \
+ src/roff/troff/request.h \
+ src/roff/troff/hvunits.h
+
+nodist_troff_SOURCES = src/roff/troff/majorminor.cpp
+
+src/roff/troff/input.$(OBJEXT): defs.h
+CLEANFILES += src/roff/troff/majorminor.cpp
+
+src/roff/troff/majorminor.cpp: $(top_srcdir)/.version
+ $(AM_V_at)printf 'const char *major_version = "%s";\n' \
+ $(MAJOR_VERSION) > $@.tmp
+ $(AM_V_at)printf 'const char *minor_version = "%s";\n' \
+ $(MINOR_VERSION) >> $@.tmp
+ $(AM_V_at)printf 'const char *revision = "%s";\n' \
+ $(REVISION) >> $@.tmp
+ $(AM_V_GEN)mv $@.tmp $@
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/roff/troff/troff.h b/src/roff/troff/troff.h
new file mode 100644
index 0000000..8cef744
--- /dev/null
+++ b/src/roff/troff/troff.h
@@ -0,0 +1,97 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#include "lib.h"
+
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <time.h>
+
+#include "color.h"
+#include "device.h"
+#include "searchpath.h"
+
+typedef int units;
+
+extern units scale(units n, units x, units y); // scale n by x/y
+
+extern units units_per_inch;
+
+extern int ascii_output_flag;
+extern int suppress_output_flag;
+extern int color_flag;
+extern int is_html;
+
+extern bool device_has_tcommand;
+extern int vresolution;
+extern int hresolution;
+extern int sizescale;
+
+extern search_path *mac_path;
+
+#include "cset.h"
+#include "cmap.h"
+#include "errarg.h"
+#include "error.h"
+
+enum warning_type {
+ WARN_CHAR = 01,
+ WARN_NUMBER = 02,
+ WARN_BREAK = 04,
+ WARN_DELIM = 010,
+ WARN_EL = 020,
+ WARN_SCALE = 040,
+ WARN_RANGE = 0100,
+ WARN_SYNTAX = 0200,
+ WARN_DI = 0400,
+ WARN_MAC = 01000,
+ WARN_REG = 02000,
+ WARN_TAB = 04000,
+ WARN_RIGHT_BRACE = 010000,
+ WARN_MISSING = 020000,
+ WARN_INPUT = 040000,
+ WARN_ESCAPE = 0100000,
+ WARN_SPACE = 0200000,
+ WARN_FONT = 0400000,
+ WARN_IG = 01000000,
+ WARN_COLOR = 02000000,
+ WARN_FILE = 04000000
+ // change WARN_TOTAL if you add more warning types
+};
+
+const int WARN_TOTAL = 07777777;
+
+int warning(warning_type, const char *,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg);
+int output_warning(warning_type, const char *,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg,
+ const errarg & = empty_errarg);
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/utils/addftinfo/addftinfo.1.man b/src/utils/addftinfo/addftinfo.1.man
new file mode 100644
index 0000000..a719136
--- /dev/null
+++ b/src/utils/addftinfo/addftinfo.1.man
@@ -0,0 +1,236 @@
+.TH addftinfo @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+addftinfo \- add font metrics to
+.I troff
+fonts for use with
+.I groff
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2020 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_addftinfo_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY addftinfo
+.RB [ \-asc\-height\~\c
+.IR n ]
+.RB [ \-body\-depth\~\c
+.IR n ]
+.RB [ \-body\-height\~\c
+.IR n ]
+.RB [ \-cap\-height\~\c
+.IR n ]
+.RB [ \-comma\-depth\~\c
+.IR n ]
+.RB [ \-desc\-depth\~\c
+.IR n ]
+.RB [ \-fig\-height\~\c
+.IR n ]
+.RB [ \-x\-height\~\c
+.IR n ]
+.I resolution
+.I unit-width
+.I font
+.YS
+.
+.
+.SY addftinfo
+.B \-\-help
+.YS
+.
+.
+.SY addftinfo
+.B \-v
+.
+.SY addftinfo
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I addftinfo
+reads an
+.RI AT&T \~troff
+font description file
+.IR font ,
+adds additional font metric information required by
+.\" We need the "GNU" below because the @g@ prefix might be empty.
+.RI GNU \~@g@troff (@MAN1EXT@),
+and writes the combined result to the standard output.
+.
+The information added is derived from the font's existing parameters and
+assumptions about traditional
+.I troff
+names for characters.
+.
+Among the font metrics added are the heights and depths of characters
+(how far each extends vertically above and below the baseline).
+.
+The
+.I resolution
+and
+.I unit-width
+arguments should be the same as the corresponding parameters in the
+.I DESC
+file.
+.
+.I font
+is the name of the file describing the font;
+if
+.I font
+ends with
+.RB \[lq] I \[rq],
+the font is assumed to be oblique
+(or italic).
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.P
+All other options change parameters that are used to derive the heights
+and depths.
+.
+Like the existing quantities in the font description file,
+each
+.RI value\~ n
+is in
+.I "scaled points,"
+.RI inches/ resolution
+for a font whose type size is
+.IR unit-width ;
+see
+.MR groff_font @MAN5EXT@ .
+.
+.
+.TP
+.BI \-asc\-height \~n
+height of characters with ascenders,
+such as \[lq]b\[rq],
+\[lq]d\[rq],
+or \[lq]l\[rq]
+.
+.
+.TP
+.BI \-body\-depth \~n
+depth of characters such as parentheses
+.
+.
+.TP
+.BI \-body\-height \~n
+height of characters such as parentheses
+.
+.
+.TP
+.BI \-cap\-height \~n
+height of uppercase letters such as \[lq]A\[rq]
+.
+.
+.TP
+.BI \-comma\-depth \~n
+depth of a comma
+.
+.
+.TP
+.BI \-desc\-depth \~n
+depth of characters with descenders,
+such as \[lq]p\[rq],
+\[lq]q\[rq],
+or \[lq]y\[rq]
+.
+.
+.TP
+.B \-fig\-height
+height of figures (numerals)
+.
+.
+.TP
+.BI \-x\-height \~n
+height of lowercase letters without ascenders such as \[lq]x\[rq]
+.
+.
+.P
+.I addftinfo
+makes no attempt to use the specified parameters to infer unspecified
+parameters.
+.
+If a parameter is not specified,
+the default will be used.
+.
+The defaults are chosen to produce reasonable values for a Times font.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.MR groff_font @MAN5EXT@ ,
+.MR groff @MAN1EXT@ ,
+.MR groff_char @MAN7EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_addftinfo_1_man_C]
+.do rr *groff_addftinfo_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/utils/addftinfo/addftinfo.am b/src/utils/addftinfo/addftinfo.am
new file mode 100644
index 0000000..dd51372
--- /dev/null
+++ b/src/utils/addftinfo/addftinfo.am
@@ -0,0 +1,35 @@
+# Automake rules for 'src utils addftinfo'
+#
+# Copyright (C) 2014-2020 Free Software Foundation, Inc.
+#
+# '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 of the License, 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 this program. If not, see
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+#
+########################################################################
+
+bin_PROGRAMS += addftinfo
+man1_MANS += src/utils/addftinfo/addftinfo.1
+EXTRA_DIST += src/utils/addftinfo/addftinfo.1.man
+addftinfo_LDADD = libgroff.a lib/libgnu.a
+addftinfo_SOURCES = \
+ src/utils/addftinfo/addftinfo.cpp \
+ src/utils/addftinfo/guess.cpp \
+ src/utils/addftinfo/guess.h
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/utils/addftinfo/addftinfo.cpp b/src/utils/addftinfo/addftinfo.cpp
new file mode 100644
index 0000000..6f4facf
--- /dev/null
+++ b/src/utils/addftinfo/addftinfo.cpp
@@ -0,0 +1,237 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <errno.h>
+#include "errarg.h"
+#include "error.h"
+#include "stringclass.h"
+#include "cset.h"
+#include "guess.h"
+
+extern "C" const char *Version_string;
+
+static void usage(FILE *stream);
+static void usage();
+static void usage(const char *problem);
+static void version();
+static void convert_font(const font_params &, FILE *, FILE *);
+
+typedef int font_params::*param_t;
+
+static struct {
+ const char *name;
+ param_t par;
+} param_table[] = {
+ { "asc-height", &font_params::asc_height },
+ { "body-depth", &font_params::body_depth },
+ { "body-height", &font_params::body_height },
+ { "cap-height", &font_params::cap_height },
+ { "comma-depth", &font_params::comma_depth },
+ { "desc-depth", &font_params::desc_depth },
+ { "fig-height", &font_params::fig_height },
+ { "x-height", &font_params::x_height },
+};
+
+// These are all in thousandths of an em.
+// These values are correct for PostScript Times Roman.
+
+#define DEFAULT_X_HEIGHT 448
+#define DEFAULT_FIG_HEIGHT 676
+#define DEFAULT_ASC_HEIGHT 682
+#define DEFAULT_BODY_HEIGHT 676
+#define DEFAULT_CAP_HEIGHT 662
+#define DEFAULT_COMMA_DEPTH 143
+#define DEFAULT_DESC_DEPTH 217
+#define DEFAULT_BODY_DEPTH 177
+
+int main(int argc, char **argv)
+{
+ program_name = argv[0];
+ int i;
+ for (i = 1; i < argc; i++) {
+ if (!strcmp(argv[i], "-v") || !strcmp(argv[i],"--version"))
+ version();
+ if (!strcmp(argv[i],"--help")) {
+ usage(stdout);
+ exit(0);
+ }
+ }
+ if (argc < 4)
+ usage("insufficient arguments");
+ /* The next couple of usage() calls cannot provide a meaningful
+ diagnostic because we don't know whether sscanf() failed on a
+ required parameter or an option. A refactor could fix this. */
+ int resolution;
+ if (sscanf(argv[argc-3], "%d", &resolution) != 1)
+ usage();
+ if (resolution <= 0)
+ fatal("resolution must be positive");
+ int unitwidth;
+ if (sscanf(argv[argc-2], "%d", &unitwidth) != 1)
+ usage();
+ if (unitwidth <= 0)
+ fatal("unit width must be positive");
+ font_params param;
+ const char *font = argv[argc-1];
+ param.italic = (font[0] != '\0' && strchr(font, '\0')[-1] == 'I');
+ param.em = (resolution*unitwidth)/72;
+ param.x_height = DEFAULT_X_HEIGHT;
+ param.fig_height = DEFAULT_FIG_HEIGHT;
+ param.asc_height = DEFAULT_ASC_HEIGHT;
+ param.body_height = DEFAULT_BODY_HEIGHT;
+ param.cap_height = DEFAULT_CAP_HEIGHT;
+ param.comma_depth = DEFAULT_COMMA_DEPTH;
+ param.desc_depth = DEFAULT_DESC_DEPTH;
+ param.body_depth = DEFAULT_BODY_DEPTH;
+ for (i = 1; i < argc && argv[i][0] == '-'; i++) {
+ if (argv[i][1] == '-' && argv[i][2] == '\0') {
+ i++;
+ break;
+ }
+ if (i + 1 >= argc)
+ usage("option requires argument");
+ size_t j;
+ for (j = 0;; j++) {
+ if (j >= sizeof(param_table)/sizeof(param_table[0]))
+ fatal("parameter '%1' not recognized", argv[i] + 1);
+ if (strcmp(param_table[j].name, argv[i] + 1) == 0)
+ break;
+ }
+ if (sscanf(argv[i+1], "%d", &(param.*(param_table[j].par))) != 1)
+ fatal("invalid option argument '%1'", argv[i+1]);
+ i++;
+ }
+ if (argc - i != 3)
+ usage("insufficient arguments");
+ errno = 0;
+ FILE *infp = fopen(font, "r");
+ if (infp == 0)
+ fatal("can't open '%1': %2", font, strerror(errno));
+ convert_font(param, infp, stdout);
+ return 0;
+}
+
+static void usage(FILE *stream)
+{
+ fprintf(stream, "usage: %s", program_name);
+ size_t len = sizeof(param_table)/sizeof(param_table[0]);
+ for (size_t i = 0; i < len; i++)
+ fprintf(stream, " [-%s n]", param_table[i].name);
+ fputs(" resolution unit-width font\n", stream);
+ fprintf(stream, "usage: %s {-v | --version}\n"
+ "usage: %s --help\n", program_name, program_name);
+}
+
+static void usage()
+{
+ usage(stderr);
+ exit(1);
+}
+
+static void usage(const char *problem)
+{
+ error("%1", problem);
+ usage();
+}
+
+static void version()
+{
+ printf("GNU addftinfo (groff) version %s\n", Version_string);
+ exit(0);
+}
+
+static int get_line(FILE *fp, string *p)
+{
+ int c;
+ p->clear();
+ while ((c = getc(fp)) != EOF) {
+ *p += char(c);
+ if (c == '\n')
+ break;
+ }
+ return p->length() > 0;
+}
+
+static void convert_font(const font_params &param, FILE *infp,
+ FILE *outfp)
+{
+ string s;
+ while (get_line(infp, &s)) {
+ put_string(s, outfp);
+ if (s.length() >= 8
+ && strncmp(&s[0], "charset", 7))
+ break;
+ }
+ while (get_line(infp, &s)) {
+ s += '\0';
+ string name;
+ const char *p = s.contents();
+ while (csspace(*p))
+ p++;
+ while (*p != '\0' && !csspace(*p))
+ name += *p++;
+ while (csspace(*p))
+ p++;
+ for (const char *q = s.contents(); q < p; q++)
+ putc(*q, outfp);
+ char *next;
+ char_metric metric;
+ metric.width = (int)strtol(p, &next, 10);
+ if (next != p) {
+ printf("%d", metric.width);
+ p = next;
+ metric.type = (int)strtol(p, &next, 10);
+ if (next != p) {
+ name += '\0';
+ guess(name.contents(), param, &metric);
+ if (metric.sk == 0) {
+ if (metric.left_ic == 0) {
+ if (metric.ic == 0) {
+ if (metric.depth == 0) {
+ if (metric.height != 0)
+ printf(",%d", metric.height);
+ }
+ else
+ printf(",%d,%d", metric.height, metric.depth);
+ }
+ else
+ printf(",%d,%d,%d", metric.height, metric.depth,
+ metric.ic);
+ }
+ else
+ printf(",%d,%d,%d,%d", metric.height, metric.depth,
+ metric.ic, metric.left_ic);
+ }
+ else
+ printf(",%d,%d,%d,%d,%d", metric.height, metric.depth,
+ metric.ic, metric.left_ic, metric.sk);
+ }
+ }
+ fputs(p, outfp);
+ }
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/utils/addftinfo/guess.cpp b/src/utils/addftinfo/guess.cpp
new file mode 100644
index 0000000..08bbe05
--- /dev/null
+++ b/src/utils/addftinfo/guess.cpp
@@ -0,0 +1,489 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "guess.h"
+
+void guess(const char *s, const font_params &param, char_metric *metric)
+{
+ int &height = metric->height;
+ int &depth = metric->depth;
+
+ metric->ic = 0;
+ metric->left_ic = 0;
+ metric->sk = 0;
+ height = 0;
+ depth = 0;
+ if (s[0] == '\0' || (s[1] != '\0' && s[2] != '\0'))
+ goto do_default;
+#define HASH(c1, c2) (((unsigned char)(c1) << 8) | (unsigned char)(c2))
+ switch (HASH(s[0], s[1])) {
+ default:
+ do_default:
+ if (metric->type & 01)
+ depth = param.desc_depth;
+ if (metric->type & 02)
+ height = param.asc_height;
+ else
+ height = param.x_height;
+ break;
+ case HASH('\\', '|'):
+ case HASH('\\', '^'):
+ case HASH('\\', '&'):
+ // these have zero height and depth
+ break;
+ case HASH('f', 0):
+ height = param.asc_height;
+ if (param.italic)
+ depth = param.desc_depth;
+ break;
+ case HASH('a', 0):
+ case HASH('c', 0):
+ case HASH('e', 0):
+ case HASH('m', 0):
+ case HASH('n', 0):
+ case HASH('o', 0):
+ case HASH('r', 0):
+ case HASH('s', 0):
+ case HASH('u', 0):
+ case HASH('v', 0):
+ case HASH('w', 0):
+ case HASH('x', 0):
+ case HASH('z', 0):
+ height = param.x_height;
+ break;
+ case HASH('i', 0):
+ height = param.x_height;
+ break;
+ case HASH('b', 0):
+ case HASH('d', 0):
+ case HASH('h', 0):
+ case HASH('k', 0):
+ case HASH('l', 0):
+ case HASH('F', 'i'):
+ case HASH('F', 'l'):
+ case HASH('f', 'f'):
+ case HASH('f', 'i'):
+ case HASH('f', 'l'):
+ height = param.asc_height;
+ break;
+ case HASH('t', 0):
+ height = param.asc_height;
+ break;
+ case HASH('g', 0):
+ case HASH('p', 0):
+ case HASH('q', 0):
+ case HASH('y', 0):
+ height = param.x_height;
+ depth = param.desc_depth;
+ break;
+ case HASH('j', 0):
+ height = param.x_height;
+ depth = param.desc_depth;
+ break;
+ case HASH('A', 0):
+ case HASH('B', 0):
+ case HASH('C', 0):
+ case HASH('D', 0):
+ case HASH('E', 0):
+ case HASH('F', 0):
+ case HASH('G', 0):
+ case HASH('H', 0):
+ case HASH('I', 0):
+ case HASH('J', 0):
+ case HASH('K', 0):
+ case HASH('L', 0):
+ case HASH('M', 0):
+ case HASH('N', 0):
+ case HASH('O', 0):
+ case HASH('P', 0):
+ case HASH('Q', 0):
+ case HASH('R', 0):
+ case HASH('S', 0):
+ case HASH('T', 0):
+ case HASH('U', 0):
+ case HASH('V', 0):
+ case HASH('W', 0):
+ case HASH('X', 0):
+ case HASH('Y', 0):
+ case HASH('Z', 0):
+ height = param.cap_height;
+ break;
+ case HASH('*', 'A'):
+ case HASH('*', 'B'):
+ case HASH('*', 'C'):
+ case HASH('*', 'D'):
+ case HASH('*', 'E'):
+ case HASH('*', 'F'):
+ case HASH('*', 'G'):
+ case HASH('*', 'H'):
+ case HASH('*', 'I'):
+ case HASH('*', 'K'):
+ case HASH('*', 'L'):
+ case HASH('*', 'M'):
+ case HASH('*', 'N'):
+ case HASH('*', 'O'):
+ case HASH('*', 'P'):
+ case HASH('*', 'Q'):
+ case HASH('*', 'R'):
+ case HASH('*', 'S'):
+ case HASH('*', 'T'):
+ case HASH('*', 'U'):
+ case HASH('*', 'W'):
+ case HASH('*', 'X'):
+ case HASH('*', 'Y'):
+ case HASH('*', 'Z'):
+ height = param.cap_height;
+ break;
+ case HASH('0', 0):
+ case HASH('1', 0):
+ case HASH('2', 0):
+ case HASH('3', 0):
+ case HASH('4', 0):
+ case HASH('5', 0):
+ case HASH('6', 0):
+ case HASH('7', 0):
+ case HASH('8', 0):
+ case HASH('9', 0):
+ case HASH('1', '2'):
+ case HASH('1', '4'):
+ case HASH('3', '4'):
+ height = param.fig_height;
+ break;
+ case HASH('(', 0):
+ case HASH(')', 0):
+ case HASH('[', 0):
+ case HASH(']', 0):
+ case HASH('{', 0):
+ case HASH('}', 0):
+ height = param.body_height;
+ depth = param.body_depth;
+ break;
+ case HASH('i', 's'):
+ height = (param.em*3)/4;
+ depth = param.em/4;
+ break;
+ case HASH('*', 'a'):
+ case HASH('*', 'e'):
+ case HASH('*', 'i'):
+ case HASH('*', 'k'):
+ case HASH('*', 'n'):
+ case HASH('*', 'o'):
+ case HASH('*', 'p'):
+ case HASH('*', 's'):
+ case HASH('*', 't'):
+ case HASH('*', 'u'):
+ case HASH('*', 'w'):
+ height = param.x_height;
+ break;
+ case HASH('*', 'd'):
+ case HASH('*', 'l'):
+ height = param.asc_height;
+ break;
+ case HASH('*', 'g'):
+ case HASH('*', 'h'):
+ case HASH('*', 'm'):
+ case HASH('*', 'r'):
+ case HASH('*', 'x'):
+ case HASH('*', 'y'):
+ height = param.x_height;
+ depth = param.desc_depth;
+ break;
+ case HASH('*', 'b'):
+ case HASH('*', 'c'):
+ case HASH('*', 'f'):
+ case HASH('*', 'q'):
+ case HASH('*', 'z'):
+ height = param.asc_height;
+ depth = param.desc_depth;
+ break;
+ case HASH('t', 's'):
+ height = param.x_height;
+ depth = param.desc_depth;
+ break;
+ case HASH('!', 0):
+ case HASH('?', 0):
+ case HASH('"', 0):
+ case HASH('#', 0):
+ case HASH('$', 0):
+ case HASH('%', 0):
+ case HASH('&', 0):
+ case HASH('*', 0):
+ case HASH('+', 0):
+ height = param.asc_height;
+ break;
+ case HASH('`', 0):
+ case HASH('\'', 0):
+ height = param.asc_height;
+ break;
+ case HASH('~', 0):
+ case HASH('^', 0):
+ case HASH('a', 'a'):
+ case HASH('g', 'a'):
+ height = param.asc_height;
+ break;
+ case HASH('r', 'u'):
+ case HASH('.', 0):
+ break;
+ case HASH(',', 0):
+ depth = param.comma_depth;
+ break;
+ case HASH('m', 'i'):
+ case HASH('-', 0):
+ case HASH('h', 'y'):
+ case HASH('e', 'm'):
+ height = param.x_height;
+ break;
+ case HASH(':', 0):
+ height = param.x_height;
+ break;
+ case HASH(';', 0):
+ height = param.x_height;
+ depth = param.comma_depth;
+ break;
+ case HASH('=', 0):
+ case HASH('e', 'q'):
+ height = param.x_height;
+ break;
+ case HASH('<', 0):
+ case HASH('>', 0):
+ case HASH('>', '='):
+ case HASH('<', '='):
+ case HASH('@', 0):
+ case HASH('/', 0):
+ case HASH('|', 0):
+ case HASH('\\', 0):
+ height = param.asc_height;
+ break;
+ case HASH('_', 0):
+ case HASH('u', 'l'):
+ case HASH('\\', '_'):
+ depth = param.em/4;
+ break;
+ case HASH('r', 'n'):
+ height = (param.em*3)/4;
+ break;
+ case HASH('s', 'r'):
+ height = (param.em*3)/4;
+ depth = param.em/4;
+ break;
+ case HASH('b', 'u'):
+ case HASH('s', 'q'):
+ case HASH('d', 'e'):
+ case HASH('d', 'g'):
+ case HASH('f', 'm'):
+ case HASH('c', 't'):
+ case HASH('r', 'g'):
+ case HASH('c', 'o'):
+ case HASH('p', 'l'):
+ case HASH('*', '*'):
+ case HASH('s', 'c'):
+ case HASH('s', 'l'):
+ case HASH('=', '='):
+ case HASH('~', '='):
+ case HASH('a', 'p'):
+ case HASH('!', '='):
+ case HASH('-', '>'):
+ case HASH('<', '-'):
+ case HASH('u', 'a'):
+ case HASH('d', 'a'):
+ case HASH('m', 'u'):
+ case HASH('d', 'i'):
+ case HASH('+', '-'):
+ case HASH('c', 'u'):
+ case HASH('c', 'a'):
+ case HASH('s', 'b'):
+ case HASH('s', 'p'):
+ case HASH('i', 'b'):
+ case HASH('i', 'p'):
+ case HASH('i', 'f'):
+ case HASH('p', 'd'):
+ case HASH('g', 'r'):
+ case HASH('n', 'o'):
+ case HASH('p', 't'):
+ case HASH('e', 's'):
+ case HASH('m', 'o'):
+ case HASH('b', 'r'):
+ case HASH('d', 'd'):
+ case HASH('r', 'h'):
+ case HASH('l', 'h'):
+ case HASH('o', 'r'):
+ case HASH('c', 'i'):
+ height = param.asc_height;
+ break;
+ case HASH('l', 't'):
+ case HASH('l', 'b'):
+ case HASH('r', 't'):
+ case HASH('r', 'b'):
+ case HASH('l', 'k'):
+ case HASH('r', 'k'):
+ case HASH('b', 'v'):
+ case HASH('l', 'f'):
+ case HASH('r', 'f'):
+ case HASH('l', 'c'):
+ case HASH('r', 'c'):
+ height = (param.em*3)/4;
+ depth = param.em/4;
+ break;
+#if 0
+ case HASH('%', '0'):
+ case HASH('-', '+'):
+ case HASH('-', 'D'):
+ case HASH('-', 'd'):
+ case HASH('-', 'd'):
+ case HASH('-', 'h'):
+ case HASH('.', 'i'):
+ case HASH('.', 'j'):
+ case HASH('/', 'L'):
+ case HASH('/', 'O'):
+ case HASH('/', 'l'):
+ case HASH('/', 'o'):
+ case HASH('=', '~'):
+ case HASH('A', 'E'):
+ case HASH('A', 'h'):
+ case HASH('A', 'N'):
+ case HASH('C', 's'):
+ case HASH('D', 'o'):
+ case HASH('F', 'c'):
+ case HASH('F', 'o'):
+ case HASH('I', 'J'):
+ case HASH('I', 'm'):
+ case HASH('O', 'E'):
+ case HASH('O', 'f'):
+ case HASH('O', 'K'):
+ case HASH('O', 'm'):
+ case HASH('O', 'R'):
+ case HASH('P', 'o'):
+ case HASH('R', 'e'):
+ case HASH('S', '1'):
+ case HASH('S', '2'):
+ case HASH('S', '3'):
+ case HASH('T', 'P'):
+ case HASH('T', 'p'):
+ case HASH('Y', 'e'):
+ case HASH('\\', '-'):
+ case HASH('a', '"'):
+ case HASH('a', '-'):
+ case HASH('a', '.'):
+ case HASH('a', '^'):
+ case HASH('a', 'b'):
+ case HASH('a', 'c'):
+ case HASH('a', 'd'):
+ case HASH('a', 'e'):
+ case HASH('a', 'h'):
+ case HASH('a', 'o'):
+ case HASH('a', 't'):
+ case HASH('a', '~'):
+ case HASH('b', 'a'):
+ case HASH('b', 'b'):
+ case HASH('b', 's'):
+ case HASH('c', '*'):
+ case HASH('c', '+'):
+ case HASH('f', '/'):
+ case HASH('f', 'a'):
+ case HASH('f', 'c'):
+ case HASH('f', 'o'):
+ case HASH('h', 'a'):
+ case HASH('h', 'o'):
+ case HASH('i', 'j'):
+ case HASH('l', 'A'):
+ case HASH('l', 'B'):
+ case HASH('l', 'C'):
+ case HASH('m', 'd'):
+ case HASH('n', 'c'):
+ case HASH('n', 'e'):
+ case HASH('n', 'm'):
+ case HASH('o', 'A'):
+ case HASH('o', 'a'):
+ case HASH('o', 'e'):
+ case HASH('o', 'q'):
+ case HASH('p', 'l'):
+ case HASH('p', 'p'):
+ case HASH('p', 's'):
+ case HASH('r', '!'):
+ case HASH('r', '?'):
+ case HASH('r', 'A'):
+ case HASH('r', 'B'):
+ case HASH('r', 'C'):
+ case HASH('r', 's'):
+ case HASH('s', 'h'):
+ case HASH('s', 's'):
+ case HASH('t', 'e'):
+ case HASH('t', 'f'):
+ case HASH('t', 'i'):
+ case HASH('t', 'm'):
+ case HASH('~', '~'):
+ case HASH('v', 'S'):
+ case HASH('v', 'Z'):
+ case HASH('v', 's'):
+ case HASH('v', 'z'):
+ case HASH('^', 'A'):
+ case HASH('^', 'E'):
+ case HASH('^', 'I'):
+ case HASH('^', 'O'):
+ case HASH('^', 'U'):
+ case HASH('^', 'a'):
+ case HASH('^', 'e'):
+ case HASH('^', 'i'):
+ case HASH('^', 'o'):
+ case HASH('^', 'u'):
+ case HASH('`', 'A'):
+ case HASH('`', 'E'):
+ case HASH('`', 'I'):
+ case HASH('`', 'O'):
+ case HASH('`', 'U'):
+ case HASH('`', 'a'):
+ case HASH('`', 'e'):
+ case HASH('`', 'i'):
+ case HASH('`', 'o'):
+ case HASH('`', 'u'):
+ case HASH('~', 'A'):
+ case HASH('~', 'N'):
+ case HASH('~', 'O'):
+ case HASH('~', 'a'):
+ case HASH('~', 'n'):
+ case HASH('~', 'o'):
+ case HASH('\'', 'A'):
+ case HASH('\'', 'C'):
+ case HASH('\'', 'E'):
+ case HASH('\'', 'I'):
+ case HASH('\'', 'O'):
+ case HASH('\'', 'U'):
+ case HASH('\'', 'a'):
+ case HASH('\'', 'c'):
+ case HASH('\'', 'e'):
+ case HASH('\'', 'i'):
+ case HASH('\'', 'o'):
+ case HASH('\'', 'u')
+ case HASH(':', 'A'):
+ case HASH(':', 'E'):
+ case HASH(':', 'I'):
+ case HASH(':', 'O'):
+ case HASH(':', 'U'):
+ case HASH(':', 'Y'):
+ case HASH(':', 'a'):
+ case HASH(':', 'e'):
+ case HASH(':', 'i'):
+ case HASH(':', 'o'):
+ case HASH(':', 'u'):
+ case HASH(':', 'y'):
+ case HASH(',', 'C'):
+ case HASH(',', 'c'):
+#endif
+ }
+}
diff --git a/src/utils/addftinfo/guess.h b/src/utils/addftinfo/guess.h
new file mode 100644
index 0000000..d763fe0
--- /dev/null
+++ b/src/utils/addftinfo/guess.h
@@ -0,0 +1,43 @@
+// -*- C++ -*-
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+struct font_params {
+ int italic;
+ int em;
+ int x_height;
+ int fig_height;
+ int cap_height;
+ int asc_height;
+ int body_height;
+ int comma_depth;
+ int desc_depth;
+ int body_depth;
+};
+
+struct char_metric {
+ int width;
+ int type;
+ int height;
+ int depth;
+ int ic;
+ int left_ic;
+ int sk;
+};
+
+void guess(const char *s, const font_params &param, char_metric *metric);
diff --git a/src/utils/afmtodit/afmtodit.1.man b/src/utils/afmtodit/afmtodit.1.man
new file mode 100644
index 0000000..7b0a39f
--- /dev/null
+++ b/src/utils/afmtodit/afmtodit.1.man
@@ -0,0 +1,635 @@
+.TH afmtodit @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+afmtodit \- adapt Adobe Font Metrics files for
+.I groff
+PostScript and PDF output
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2020 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_afmtodit_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY afmtodit
+.RB [ \-ckmnsx ]
+.RB [ \-a\~\c
+.IR slant ]
+.RB [ \-d\~\c
+.IR device-description-file ]
+.RB [ \-e\~\c
+.IR encoding-file ]
+.RB [ \-f\~\c
+.IR internal-name ]
+.RB [ \-i\~\c
+.IR italic-correction-factor ]
+.RB [ \-o\~\c
+.IR output-file ]
+.RB [ \-w\~\c
+.IR space-width ]
+.I afm-file
+.I map-file
+.I font-description-file
+.YS
+.
+.
+.SY afmtodit
+.B \-\-help
+.YS
+.
+.
+.SY afmtodit
+.B \-v
+.
+.SY afmtodit
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I \%afmtodit
+adapts an
+Adobe Font Metric
+file,
+.IR afm-file ,
+for use with the
+.B ps
+and
+.B pdf
+output devices of
+.MR @g@troff @MAN1EXT@ .
+.
+.I map-file
+associates a
+.I groff
+ordinary or special character name with a PostScript glyph name.
+.
+Output is written in
+.MR groff_font @MAN5EXT@
+format to
+.I font-description-file,
+a file named for the intended
+.I groff
+font name
+(but see the
+.B \-o
+option).
+.
+.
+.LP
+.I map-file
+should contain a sequence of lines of the form
+.
+.RS
+.EX
+.I ps-glyph groff-char
+.EE
+.RE
+.
+where
+.I ps-glyph
+is the PostScript glyph name and
+.I groff-char
+is a
+.I groff
+ordinary
+(if of unit length)
+or special
+(if longer)
+character identifier.
+.
+The same
+.I ps-glyph
+can occur multiple times in the file;
+each
+.I groff-char
+must occur at most once.
+.
+Lines starting with \[lq]#\[rq] and blank lines are ignored.
+.
+If the file isn't found in the current directory,
+it is sought in the
+.I devps/generate
+subdirectory of the default font directory.
+.
+.
+.LP
+If a PostScript glyph is not mentioned in
+.IR map-file ,
+and a
+.I groff
+character name can't be deduced using the Adobe Glyph List
+(AGL,
+built into
+.IR afmtodit ),
+then
+.I \%afmtodit
+puts the PostScript glyph into the
+.I groff
+font description file as an unnamed glyph which can only be accessed
+by the \[lq]\eN\[rq] escape sequence in a
+.I roff
+document.
+.
+In particular,
+this is true for glyph variants named in the form
+.RI \[lq] foo . bar \[rq];
+all glyph names containing one or more periods are mapped to unnamed
+entities.
+.
+Unless
+.B \-e
+is specified,
+the encoding defined in the AFM file
+(i.e.,
+entries
+with non-negative codes)
+is used.
+.
+Refer to section \[lq]Using Symbols\[rq] in
+.IR "Groff: The GNU Implementation of troff" ,
+the
+.I groff
+Texinfo manual,
+or
+.MR groff_char @MAN7EXT@ ,
+which describe how
+.I groff
+character identifiers are constructed.
+.
+.
+.LP
+Glyphs not encoded in the AFM file
+(i.e.,
+entries indexed as \[lq]\-1\[rq])
+are still available in
+.IR groff ;
+they get glyph index values greater than 255
+(or greater than the biggest code used in the AFM file in the unlikely
+case that it is greater than 255)
+in the
+.I groff
+font description file.
+.
+Unencoded glyph indices don't have a specific order;
+it is best to access them only via special character identifiers.
+.
+.
+.P
+If the font file proper
+(not just its metrics)
+is available,
+listing it in the files
+.I @FONTDIR@/\:\%devps/\:\%download
+and
+.I @FONTDIR@/\:\%devpdf/\:\%download
+enables it to be embedded in the output produced by
+.MR grops @MAN1EXT@
+and
+.MR gropdf @MAN1EXT@ ,
+respectively.
+.
+.
+.P
+If the
+.B \-i
+option is used,
+.I \%afmtodit
+automatically generates an italic correction,
+a left italic correction,
+and a subscript correction for each glyph
+(the significance of these is explained in
+.MR groff_font @MAN5EXT@ );
+they can be specified for individual glyphs by
+adding to the
+.I afm-file
+lines of the form:
+.
+.RS
+.EX
+.RI italicCorrection \~ps-glyph\~n
+.RI leftItalicCorrection \~ps-glyph\~n
+.RI subscriptCorrection \~ps-glyph\~n
+.EE
+.RE
+.
+where
+.I ps-glyph
+is the PostScript glyph name,
+and
+.I n
+is the desired value of the corresponding parameter in thousandths of an
+em.
+.
+Such parameters are normally needed only for italic
+(or oblique)
+fonts.
+.
+.
+.P
+The
+.B \-s
+option should be given if the font is \[lq]special\[rq],
+meaning that
+.I groff
+should search it whenever a glyph is not found in the current font.
+.
+In that case,
+.I font-description-file
+should be listed as an argument to the
+.B fonts
+directive in the output device's
+.I DESC
+file;
+if it is not special,
+there is no need to do so,
+since
+.MR @g@troff @MAN1EXT@
+will automatically mount it when it is first used.
+.
+.
+.br
+.ne 7v
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \%\-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.BI \-a\~ slant
+Use
+.I slant
+as the slant (\[lq]angle\[rq]) parameter in the font description file;
+this is used by
+.I groff
+in the positioning of accents.
+.
+By default
+.I \%afmtodit
+uses the negative of the
+.B \%ItalicAngle
+specified in the AFM file;
+with true italic fonts it is sometimes desirable to use a slant that is
+less than this.
+.
+If you find that an italic font places accents over base glyphs
+too far to the right,
+use
+.B \-a
+to give it a smaller slant.
+.
+.
+.TP
+.B \-c
+Include comments in the font description file identifying the PostScript
+font.
+.
+.
+.TP
+.BI \-d\~ device-description-file
+The device description file is
+.I desc-file
+rather than the default
+.IR DESC .
+.
+If not found in the current directory,
+the
+.I devps
+subdirectory of the default font directory is searched
+(this is true for both the default device description file and a file
+given with option
+.BR \-d ).
+.
+.
+.TP
+.BI \-e\~ encoding-file
+The PostScript font should be reencoded to use the encoding described
+in
+.IR enc-file .
+.
+The format of
+.I enc-file
+is described in
+.MR grops @MAN1EXT@ .
+.
+If not found in the current directory,
+the
+.I devps
+subdirectory of the default font directory is searched.
+.
+.
+.TP
+.BI \-f\~ internal-name
+The internal name of the
+.I groff
+font is set to
+.IR name .
+.
+.
+.TP
+.BI \-i\~ italic-correction-factor
+Generate an italic correction for each glyph so that its width plus its
+italic correction is equal to
+.I italic-correction-factor
+thousandths of an em
+plus the amount by which the right edge of the glyph's bounding box is
+to the right of its origin.
+.
+If this would result in a negative italic correction,
+use a zero italic correction instead.
+.
+.
+.IP
+Also generate a subscript correction equal to the
+product of the tangent of the slant of the font and
+four fifths of the x-height of the font.
+.
+If this would result in a subscript correction greater than the italic
+correction,
+use a subscript correction equal to the italic correction instead.
+.
+.
+.IP
+Also generate a left italic correction for each glyph equal to
+.I italic-correction-factor
+thousandths of an em
+plus the amount by which the left edge of the glyph's bounding box is to
+the left of its origin.
+.
+The left italic correction may be negative unless option
+.B \-m
+is given.
+.
+.
+.IP
+This option is normally needed only with italic
+(or oblique)
+fonts.
+.
+The font description files distributed with
+.I groff
+were created using an option of
+.B \-i50
+for italic fonts.
+.
+.
+.TP
+.BI \-o\~ output-file
+Write to
+.I output-file
+instead of
+.I font-description-file.
+.
+.
+.TP
+.B \-k
+Omit any kerning data from the
+.I groff
+font;
+use only for monospaced (constant-width) fonts.
+.
+.
+.TP
+.B \-m
+Prevent negative left italic correction values.
+.
+Font description files for roman styles distributed with
+.I groff
+were created with
+.RB \[lq] \-i0\~\-m \[rq]
+to improve spacing with
+.MR @g@eqn @MAN1EXT@ .
+.
+.
+.TP
+.B \-n
+Don't output a
+.B ligatures
+command for this font;
+use with monospaced (constant-width) fonts.
+.
+.
+.TP
+.B \-s
+Add the
+.B special
+directive to the font description file.
+.
+.
+.TP
+.BI \-w\~ space-width
+Use
+.I space-width
+as the with of inter-word spaces.
+.
+.
+.TP
+.B \-x
+Don't use the built-in Adobe Glyph List.
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @FONTDIR@/\:\%devps/\:DESC
+describes the
+.B ps
+output device.
+.
+.
+.TP
+.IR @FONTDIR@/\:\%devps/ F
+describes the font known
+.RI as\~ F
+on device
+.BR ps .
+.
+.
+.TP
+.I @FONTDIR@/\:\%devps/\:\%download
+lists fonts available for embedding within the PostScript document
+(or download to the device).
+.
+.
+.TP
+.I @FONTDIR@/\:\%devps/\:\%generate/\:\%dingbats.map
+.TQ
+.I @FONTDIR@/\:\%devps/\:\%generate/\:\%dingbats\-reversed.map
+.TQ
+.I @FONTDIR@/\:\%devps/\:\%generate/\:\%slanted\-symbol.map
+.TQ
+.I @FONTDIR@/\:\%devps/\:\%generate/\:\%symbol.map
+.TQ
+.I @FONTDIR@/\:\%devps/\:\%generate/\:\%text.map
+map names in the Adobe Glyph List to
+.I groff
+special character identifiers for Zapf Dingbats
+.RB ( ZD ),
+reversed Zapf Dingbats
+.RB ( ZDR ),
+slanted symbol
+.RB ( SS ),
+symbol
+.RB ( S ),
+and text fonts,
+respectively.
+.
+These
+.IR map-file s
+are used to produce the font description files provided with
+.I groff
+for the
+.I \%grops
+output driver.
+.
+.
+.\" ====================================================================
+.SH Diagnostics
+.\" ====================================================================
+.
+.TP
+.RI "AGL name \[aq]" x "\[aq] already mapped to groff name \[aq]" y\c
+.RI "\[aq]; ignoring AGL name \[aq]uni" XXXX \[aq]
+You can disregard these if they're in the form shown,
+where the ignored AGL name contains four hexadecimal digits
+.IR XXXX .
+.
+The Adobe Glyph List (AGL) has its own names for glyphs;
+they are often
+different from
+.IR groff 's
+special character names.
+.
+.I \%afmtodit
+is constructing a mapping from
+.I groff
+special character names to AGL names;
+this can be a one-to-one or many-to-one mapping,
+but one-to-many will not work,
+so
+.I \%afmtodit
+discards the excess mappings.
+.
+For example,
+if
+.I x
+is
+.BR *D ,
+.I y
+is
+.BR \%Delta ,
+and
+.I z
+is
+.BR uni0394 ,
+.I \%afmtodit
+is telling you that the
+.I groff
+font description that it is writing cannot map the
+.I groff
+special character
+.B \[rs][*D]
+to AGL glyphs
+.B \%Delta
+and
+.B uni0394
+at the same time.
+.
+.
+.IP
+If you get a message like this but are unhappy with which mapping is
+ignored,
+a remedy is to craft an alternative
+.I map-file
+and re-run
+.I \%afmtodit
+using it.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is the primary
+.I groff
+manual.
+.
+Section \[lq]Using Symbols\[rq] may be of particular note.
+.
+You can browse it interactively with \[lq]info \[aq](groff)Using
+\%Symbols\[aq]\[rq].
+.
+.
+.LP
+.MR groff @MAN1EXT@ ,
+.MR gropdf @MAN1EXT@ ,
+.MR grops @MAN1EXT@ ,
+.MR groff_font @MAN5EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_afmtodit_1_man_C]
+.do rr *groff_afmtodit_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/utils/afmtodit/afmtodit.am b/src/utils/afmtodit/afmtodit.am
new file mode 100644
index 0000000..fda095d
--- /dev/null
+++ b/src/utils/afmtodit/afmtodit.am
@@ -0,0 +1,56 @@
+# Automake rules for 'src utils afmtodit'
+#
+# Copyright (C) 2013-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+########################################################################
+
+afmtodit_srcdir = $(top_srcdir)/src/utils/afmtodit
+
+bin_SCRIPTS += afmtodit
+man1_MANS += src/utils/afmtodit/afmtodit.1
+EXTRA_DIST += \
+ src/utils/afmtodit/afmtodit.1.man \
+ src/utils/afmtodit/afmtodit.pl \
+ src/utils/afmtodit/afmtodit.tables \
+ src/utils/afmtodit/make-afmtodit-tables
+
+afmtodit: $(afmtodit_srcdir)/afmtodit.pl $(afmtodit_srcdir)/afmtodit.tables
+ $(AM_V_GEN)if test -n "$(PERL)"; then \
+ sed -e "s|[@]PERL[@]|$(PERL)|" \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e "s|[@]FONTDIR[@]|$(fontdir)|" \
+ -e "/[@]afmtodit.tables[@]/ r $(afmtodit_srcdir)/afmtodit.tables" \
+ -e "/[@]afmtodit.tables[@]/ d" \
+ $(afmtodit_srcdir)/afmtodit.pl \
+ >afmtodit; \
+ else \
+ sed -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e "s|[@]FONTDIR[@]|$(fontdir)|" \
+ -e "/[@]afmtodit.tables[@]/ r $(afmtodit_srcdir)/afmtodit.tables" \
+ -e "/[@]afmtodit.tables[@]/ d" \
+ $(afmtodit_srcdir)/afmtodit.pl \
+ >afmtodit; \
+ fi \
+ && chmod +x afmtodit
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/utils/afmtodit/afmtodit.pl b/src/utils/afmtodit/afmtodit.pl
new file mode 100644
index 0000000..c6b67cc
--- /dev/null
+++ b/src/utils/afmtodit/afmtodit.pl
@@ -0,0 +1,645 @@
+#!@PERL@
+# Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+use warnings;
+use strict;
+
+@afmtodit.tables@
+
+my $prog = $0;
+my $groff_sys_fontdir = "@FONTDIR@";
+my $want_help;
+my $space_width = 0;
+
+our ($opt_a, $opt_c, $opt_d, $opt_e, $opt_f, $opt_i, $opt_k,
+ $opt_m, $opt_n, $opt_o, $opt_s, $opt_v, $opt_x);
+
+use Getopt::Long qw(:config gnu_getopt);
+GetOptions( "a=s", "c", "d=s", "e=s", "f=s", "i=s", "k", "m", "n",
+ "o=s", "s", "v", "w=i" => \$space_width, "x", "version" => \$opt_v,
+ "help" => \$want_help
+);
+
+my $afmtodit_version = "GNU afmtodit (groff) version @VERSION@";
+
+if ($opt_v) {
+ print "$afmtodit_version\n";
+ exit 0;
+}
+
+sub croak {
+ my $msg = shift;
+ print STDERR "$prog: error: $msg";
+ exit(1);
+}
+
+sub usage {
+ my $stream = *STDOUT;
+ my $had_error = shift;
+ $stream = *STDERR if $had_error;
+ print $stream "usage: $prog [-ckmnsx] [-a slant]" .
+ " [-d device-description-file] [-e encoding-file]" .
+ " [-f internal-name] [-i italic-correction-factor]" .
+ " [-o output-file] [-w space-width] afm-file map-file" .
+ " font-description-file\n" .
+ "usage: $prog {-v | --version}\n" .
+ "usage: $prog --help\n";
+ unless ($had_error) {
+ print $stream "\n" .
+"Adapt an Adobe Font Metric file, afm-file, for use with the 'ps'\n" .
+"and 'pdf' output devices of groff(1). See the afmtodit(1) manual " .
+"page.\n";
+ }
+ my $status = 0;
+ $status = 2 if ($had_error);
+ exit($status);
+}
+
+&usage(0) if ($want_help);
+
+if ($#ARGV != 2) {
+ print STDERR "$prog: usage error: insufficient arguments\n";
+ &usage(1);
+}
+
+my $afm = $ARGV[0];
+my $map = $ARGV[1];
+my $fontfile = $ARGV[2];
+my $outfile = $opt_o || $fontfile;
+my $desc = $opt_d || "DESC";
+my $sys_map = $groff_sys_fontdir . "/devps/generate/" . $map;
+my $sys_desc = $groff_sys_fontdir . "/devps/" . $desc;
+
+# read the afm file
+
+my $psname;
+my ($notice, $version, $fullname, $familyname, @comments);
+my $italic_angle = 0;
+my (@kern1, @kern2, @kernx);
+my (%italic_correction, %left_italic_correction);
+my %subscript_correction;
+# my %ligs
+my %ligatures;
+my (@encoding, %in_encoding);
+my (%width, %height, %depth);
+my (%left_side_bearing, %right_side_bearing);
+
+open(AFM, $afm) || croak("unable to open '$ARGV[0]': $!\n");
+
+while (<AFM>) {
+ chomp;
+ s/\x0D$//;
+ my @field = split(' ');
+ next if $#field < 0;
+ if ($field[0] eq "FontName") {
+ $psname = $field[1];
+ if($opt_f) {
+ $psname = $opt_f;
+ }
+ }
+ elsif($field[0] eq "Notice") {
+ $notice = $_;
+ }
+ elsif($field[0] eq "Version") {
+ $version = $_;
+ }
+ elsif($field[0] eq "FullName") {
+ $fullname = $_;
+ }
+ elsif($field[0] eq "FamilyName") {
+ $familyname = $_;
+ }
+ elsif($field[0] eq "Comment") {
+ push(@comments, $_);
+ }
+ elsif($field[0] eq "ItalicAngle") {
+ $italic_angle = -$field[1];
+ }
+ elsif ($field[0] eq "KPX") {
+ if ($#field == 3) {
+ push(@kern1, $field[1]);
+ push(@kern2, $field[2]);
+ push(@kernx, $field[3]);
+ }
+ }
+ elsif ($field[0] eq "italicCorrection") {
+ $italic_correction{$field[1]} = $field[2];
+ }
+ elsif ($field[0] eq "leftItalicCorrection") {
+ $left_italic_correction{$field[1]} = $field[2];
+ }
+ elsif ($field[0] eq "subscriptCorrection") {
+ $subscript_correction{$field[1]} = $field[2];
+ }
+ elsif ($field[0] eq "StartCharMetrics") {
+ while (<AFM>) {
+ @field = split(' ');
+ next if $#field < 0;
+ last if ($field[0] eq "EndCharMetrics");
+ if ($field[0] eq "C") {
+ my $w;
+ my $wx = 0;
+ my $n = "";
+# %ligs = ();
+ my $lly = 0;
+ my $ury = 0;
+ my $llx = 0;
+ my $urx = 0;
+ my $c = $field[1];
+ my $i = 2;
+ while ($i <= $#field) {
+ if ($field[$i] eq "WX") {
+ $w = $field[$i + 1];
+ $i += 2;
+ }
+ elsif ($field[$i] eq "N") {
+ $n = $field[$i + 1];
+ $i += 2;
+ }
+ elsif ($field[$i] eq "B") {
+ $llx = $field[$i + 1];
+ $lly = $field[$i + 2];
+ $urx = $field[$i + 3];
+ $ury = $field[$i + 4];
+ $i += 5;
+ }
+# elsif ($field[$i] eq "L") {
+# $ligs{$field[$i + 2]} = $field[$i + 1];
+# $i += 3;
+# }
+ else {
+ while ($i <= $#field && $field[$i] ne ";") {
+ $i++;
+ }
+ $i++;
+ }
+ }
+ if (!$opt_e && $c != -1) {
+ $encoding[$c] = $n;
+ $in_encoding{$n} = 1;
+ }
+ $width{$n} = $w;
+ $height{$n} = $ury;
+ $depth{$n} = -$lly;
+ $left_side_bearing{$n} = -$llx;
+ $right_side_bearing{$n} = $urx - $w;
+# foreach my $lig (sort keys %ligs) {
+# $ligatures{$lig} = $n . " " . $ligs{$lig};
+# }
+ }
+ }
+ }
+}
+close(AFM);
+
+# read the DESC file
+
+my ($sizescale, $resolution, $unitwidth);
+$sizescale = 1;
+
+open(DESC, $desc) || open(DESC, $sys_desc) ||
+ croak("unable to open '$desc' or '$sys_desc': $!\n");
+while (<DESC>) {
+ next if /^#/;
+ chop;
+ my @field = split(' ');
+ next if $#field < 0;
+ last if $field[0] eq "charset";
+ if ($field[0] eq "res") {
+ $resolution = $field[1];
+ }
+ elsif ($field[0] eq "unitwidth") {
+ $unitwidth = $field[1];
+ }
+ elsif ($field[0] eq "sizescale") {
+ $sizescale = $field[1];
+ }
+}
+close(DESC);
+
+if ($opt_e) {
+ # read the encoding file
+
+ my $sys_opt_e = $groff_sys_fontdir . "/devps/" . $opt_e;
+ open(ENCODING, $opt_e) || open(ENCODING, $sys_opt_e) ||
+ croak("unable to open '$opt_e' or '$sys_opt_e': $!\n");
+ while (<ENCODING>) {
+ next if /^#/;
+ chop;
+ my @field = split(' ');
+ next if $#field < 0;
+ if ($#field == 1) {
+ if ($field[1] >= 0 && defined $width{$field[0]}) {
+ $encoding[$field[1]] = $field[0];
+ $in_encoding{$field[0]} = 1;
+ }
+ }
+ }
+ close(ENCODING);
+}
+
+# read the map file
+
+my (%nmap, %map);
+
+open(MAP, $map) || open(MAP, $sys_map) ||
+ croak("unable to open '$map' or '$sys_map': $!\n");
+while (<MAP>) {
+ next if /^#/;
+ chop;
+ my @field = split(' ');
+ next if $#field < 0;
+ if ($#field == 1) {
+ if ($field[1] eq "space") {
+ # The PostScript character "space" is automatically mapped
+ # to the groff character "space"; this is for grops.
+ warn "$prog: you are not allowed to map to " .
+ "the groff character 'space'";
+ }
+ elsif ($field[0] eq "space") {
+ warn "$prog: you are not allowed to map " .
+ "the PostScript character 'space'";
+ }
+ else {
+ $nmap{$field[0]} += 0;
+ $map{$field[0], $nmap{$field[0]}} = $field[1];
+ $nmap{$field[0]} += 1;
+
+ # There is more than one way to make a PS glyph name;
+ # let us try Unicode names with both 'uni' and 'u' prefixes.
+ my $utmp = $AGL_to_unicode{$field[0]};
+ if (defined $utmp && $utmp =~ /^[0-9A-F]{4}$/) {
+ foreach my $unicodepsname ("uni" . $utmp, "u" . $utmp) {
+ $nmap{$unicodepsname} += 0;
+ $map{$unicodepsname, $nmap{$unicodepsname}} = $field[1];
+ $nmap{$unicodepsname} += 1;
+ }
+ }
+ }
+ }
+}
+close(MAP);
+
+$italic_angle = $opt_a if $opt_a;
+
+
+if (!$opt_x) {
+ my %mapped;
+ my $i = ($#encoding > 256) ? ($#encoding + 1) : 256;
+ foreach my $ch (sort keys %width) {
+ # add unencoded characters
+ if (!$in_encoding{$ch}) {
+ $encoding[$i] = $ch;
+ $i++;
+ }
+ if ($nmap{$ch}) {
+ for (my $j = 0; $j < $nmap{$ch}; $j++) {
+ if (defined $mapped{$map{$ch, $j}}) {
+ print STDERR "$prog: AGL name"
+ . " '$mapped{$map{$ch, $j}}' already mapped to"
+ . " groff name '$map{$ch, $j}'; ignoring AGL"
+ . " name '$ch'\n";
+ }
+ else {
+ $mapped{$map{$ch, $j}} = $ch;
+ }
+ }
+ }
+ else {
+ my $u = ""; # the resulting groff glyph name
+ my $ucomp = ""; # Unicode string before decomposition
+ my $utmp = ""; # temporary value
+ my $component = "";
+ my $nv = 0;
+
+ # Step 1:
+ # Drop all characters from the glyph name starting with the
+ # first occurrence of a period (U+002E FULL STOP), if any.
+ # ?? We avoid mapping of glyphs with periods, since they are
+ # likely to be variant glyphs, leading to a 'many ps glyphs --
+ # one groff glyph' conflict.
+ #
+ # If multiple glyphs in the font represent the same character
+ # in the Unicode standard, as do 'A' and 'A.swash', for example,
+ # they can be differentiated by using the same base name with
+ # different suffixes. This suffix (the part of glyph name that
+ # follows the first period) does not participate in the
+ # computation of a character sequence. It can be used by font
+ # designers to indicate some characteristics of the glyph. The
+ # suffix may contain periods or any other permitted characters.
+ # Small cap A, for example, could be named 'uni0041.sc' or
+ # 'A.sc'.
+
+ next if $ch =~ /\./;
+
+ # Step 2:
+ # Split the remaining string into a sequence of components,
+ # using the underscore character (U+005F LOW LINE) as the
+ # delimiter.
+
+ while ($ch =~ /([^_]+)/g) {
+ $component = $1;
+
+ # Step 3:
+ # Map each component to a character string according to the
+ # procedure below:
+ #
+ # * If the component is in the Adobe Glyph List, then map
+ # it to the corresponding character in that list.
+
+ $utmp = $AGL_to_unicode{$component};
+ if ($utmp) {
+ $utmp = "U+" . $utmp;
+ }
+
+ # * Otherwise, if the component is of the form 'uni'
+ # (U+0075 U+006E U+0069) followed by a sequence of
+ # uppercase hexadecimal digits (0 .. 9, A .. F, i.e.,
+ # U+0030 .. U+0039, U+0041 .. U+0046), the length of
+ # that sequence is a multiple of four, and each group of
+ # four digits represents a number in the set {0x0000 ..
+ # 0xD7FF, 0xE000 .. 0xFFFF}, then interpret each such
+ # number as a Unicode scalar value and map the component
+ # to the string made of those scalar values.
+
+ elsif ($component =~ /^uni([0-9A-F]{4})+$/) {
+ while ($component =~ /([0-9A-F]{4})/g) {
+ $nv = hex("0x" . $1);
+ if ($nv <= 0xD7FF || $nv >= 0xE000) {
+ $utmp .= "U+" . $1;
+ }
+ else {
+ $utmp = "";
+ last;
+ }
+ }
+ }
+
+ # * Otherwise, if the component is of the form 'u' (U+0075)
+ # followed by a sequence of four to six uppercase
+ # hexadecimal digits {0 .. 9, A .. F} (U+0030 .. U+0039,
+ # U+0041 .. U+0046), and those digits represent a number
+ # in {0x0000 .. 0xD7FF, 0xE000 .. 0x10FFFF}, then
+ # interpret this number as a Unicode scalar value and map
+ # the component to the string made of this scalar value.
+
+ elsif ($component =~ /^u([0-9A-F]{4,6})$/) {
+ $nv = hex("0x" . $1);
+ if ($nv <= 0xD7FF || ($nv >= 0xE000 && $nv <= 0x10FFFF)) {
+ $utmp = "U+" . $1;
+ }
+ }
+
+ # Finally, concatenate those strings; the result is the
+ # character string to which the glyph name is mapped.
+
+ $ucomp .= $utmp if $utmp;
+ }
+
+ # Unicode decomposition
+ while ($ucomp =~ /([0-9A-F]{4,6})/g) {
+ $component = $1;
+ $utmp = $unicode_decomposed{$component};
+ $u .= "_" . ($utmp ? $utmp : $component);
+ }
+ $u =~ s/^_/u/;
+ if ($u) {
+ if (defined $mapped{$u}) {
+ warn "$prog: both $mapped{$u} and $ch map to $u";
+ }
+ else {
+ $mapped{$u} = $ch;
+ }
+ $nmap{$ch} += 1;
+ $map{$ch, "0"} = $u;
+ }
+ }
+ }
+}
+
+# Check explicitly for groff's standard ligatures -- many afm files don't
+# have proper 'L' entries.
+
+my %default_ligatures = (
+ "fi", "f i",
+ "fl", "f l",
+ "ff", "f f",
+ "ffi", "ff i",
+ "ffl", "ff l",
+);
+
+foreach my $lig (sort keys %default_ligatures) {
+ if (defined $width{$lig} && !defined $ligatures{$lig}) {
+ $ligatures{$lig} = $default_ligatures{$lig};
+ }
+}
+
+# print it all out
+
+open(FONT, ">$outfile") ||
+ croak("unable to open '$outfile' for writing: $!\n");
+select(FONT);
+
+print("# This file was generated with $afmtodit_version.\n");
+print("#\n");
+print("# $fullname\n") if defined $fullname;
+print("# $version\n") if defined $version;
+print("# $familyname\n") if defined $familyname;
+
+if ($opt_c) {
+ print("#\n");
+ if (defined $notice || @comments) {
+ print("# The original AFM file contains the following comments:\n");
+ print("#\n");
+ print("# $notice\n") if defined $notice;
+ foreach my $comment (@comments) {
+ print("# $comment\n");
+ }
+ }
+ else {
+ print("# The original AFM file contains no comments.\n");
+ }
+}
+
+print("\n");
+
+my $name = $fontfile;
+$name =~ s@.*/@@;
+
+my $sw = 0;
+$sw = conv($width{"space"}) if defined $width{"space"};
+$sw = $space_width if ($space_width);
+
+print("name $name\n");
+print("internalname $psname\n") if $psname;
+print("special\n") if $opt_s;
+printf("slant %g\n", $italic_angle) if $italic_angle != 0;
+printf("spacewidth %d\n", $sw) if $sw;
+
+if ($opt_e) {
+ my $e = $opt_e;
+ $e =~ s@.*/@@;
+ print("encoding $e\n");
+}
+
+if (!$opt_n && %ligatures) {
+ print("ligatures");
+ foreach my $lig (sort keys %ligatures) {
+ print(" $lig");
+ }
+ print(" 0\n");
+}
+
+if (!$opt_k && $#kern1 >= 0) {
+ print("\n");
+ print("kernpairs\n");
+
+ for (my $i = 0; $i <= $#kern1; $i++) {
+ my $c1 = $kern1[$i];
+ my $c2 = $kern2[$i];
+ if (defined $nmap{$c1} && $nmap{$c1} != 0
+ && defined $nmap{$c2} && $nmap{$c2} != 0) {
+ for (my $j = 0; $j < $nmap{$c1}; $j++) {
+ for (my $k = 0; $k < $nmap{$c2}; $k++) {
+ if ($kernx[$i] != 0) {
+ printf("%s %s %d\n",
+ $map{$c1, $j},
+ $map{$c2, $k},
+ conv($kernx[$i]));
+ }
+ }
+ }
+ }
+ }
+}
+
+my ($asc_boundary, $desc_boundary, $xheight, $slant);
+
+# characters not shorter than asc_boundary are considered to have ascenders
+
+$asc_boundary = 0;
+$asc_boundary = $height{"t"} if defined $height{"t"};
+$asc_boundary -= 1;
+
+# likewise for descenders
+
+$desc_boundary = 0;
+$desc_boundary = $depth{"g"} if defined $depth{"g"};
+$desc_boundary = $depth{"j"} if defined $depth{"g"} && $depth{"j"} < $desc_boundary;
+$desc_boundary = $depth{"p"} if defined $depth{"p"} && $depth{"p"} < $desc_boundary;
+$desc_boundary = $depth{"q"} if defined $depth{"q"} && $depth{"q"} < $desc_boundary;
+$desc_boundary = $depth{"y"} if defined $depth{"y"} && $depth{"y"} < $desc_boundary;
+$desc_boundary -= 1;
+
+if (defined $height{"x"}) {
+ $xheight = $height{"x"};
+}
+elsif (defined $height{"alpha"}) {
+ $xheight = $height{"alpha"};
+}
+else {
+ $xheight = 450;
+}
+
+$italic_angle = $italic_angle*3.14159265358979323846/180.0;
+$slant = sin($italic_angle)/cos($italic_angle);
+$slant = 0 if $slant < 0;
+
+print("\n");
+print("charset\n");
+for (my $i = 0; $i <= $#encoding; $i++) {
+ my $ch = $encoding[$i];
+ if (defined $ch && $ch ne "" && $ch ne "space") {
+ $map{$ch, "0"} = "---" if !defined $nmap{$ch} || $nmap{$ch} == 0;
+ my $type = 0;
+ my $h = $height{$ch};
+ $h = 0 if $h < 0;
+ my $d = $depth{$ch};
+ $d = 0 if $d < 0;
+ $type = 1 if $d >= $desc_boundary;
+ $type += 2 if $h >= $asc_boundary;
+ printf("%s\t%d", $map{$ch, "0"}, conv($width{$ch}));
+ my $italic_correction = 0;
+ my $left_math_fit = 0;
+ my $subscript_correction = 0;
+ if (defined $opt_i) {
+ $italic_correction = $right_side_bearing{$ch} + $opt_i;
+ $italic_correction = 0 if $italic_correction < 0;
+ $subscript_correction = $slant * $xheight * .8;
+ $subscript_correction = $italic_correction if
+ $subscript_correction > $italic_correction;
+ $left_math_fit = $left_side_bearing{$ch} + $opt_i;
+ if (defined $opt_m) {
+ $left_math_fit = 0 if $left_math_fit < 0;
+ }
+ }
+ if (defined $italic_correction{$ch}) {
+ $italic_correction = $italic_correction{$ch};
+ }
+ if (defined $left_italic_correction{$ch}) {
+ $left_math_fit = $left_italic_correction{$ch};
+ }
+ if (defined $subscript_correction{$ch}) {
+ $subscript_correction = $subscript_correction{$ch};
+ }
+ if ($subscript_correction != 0) {
+ printf(",%d,%d", conv($h), conv($d));
+ printf(",%d,%d,%d", conv($italic_correction),
+ conv($left_math_fit),
+ conv($subscript_correction));
+ }
+ elsif ($left_math_fit != 0) {
+ printf(",%d,%d", conv($h), conv($d));
+ printf(",%d,%d", conv($italic_correction),
+ conv($left_math_fit));
+ }
+ elsif ($italic_correction != 0) {
+ printf(",%d,%d", conv($h), conv($d));
+ printf(",%d", conv($italic_correction));
+ }
+ elsif ($d != 0) {
+ printf(",%d,%d", conv($h), conv($d));
+ }
+ else {
+ # always put the height in to stop groff guessing
+ printf(",%d", conv($h));
+ }
+ printf("\t%d", $type);
+ printf("\t%d\t%s\n", $i, $ch);
+ if (defined $nmap{$ch}) {
+ for (my $j = 1; $j < $nmap{$ch}; $j++) {
+ printf("%s\t\"\n", $map{$ch, $j});
+ }
+ }
+ }
+ if (defined $ch && $ch eq "space" && defined $width{"space"}) {
+ printf("space\t%d\t0\t%d\tspace\n", conv($width{"space"}), $i);
+ }
+}
+
+sub conv {
+ $_[0]*$unitwidth*$resolution/(72*1000*$sizescale) +
+ ($_[0] < 0 ? -.5 : .5);
+}
+
+# Local Variables:
+# fill-column: 72
+# mode: CPerl
+# End:
+# vim: set cindent noexpandtab shiftwidth=2 softtabstop=2 textwidth=72:
diff --git a/src/utils/afmtodit/afmtodit.tables b/src/utils/afmtodit/afmtodit.tables
new file mode 100644
index 0000000..16e3647
--- /dev/null
+++ b/src/utils/afmtodit/afmtodit.tables
@@ -0,0 +1,6163 @@
+# This table was algorithmically derived from the file 'UnicodeData.txt'
+# for Unicode 15.0.0, available from unicode.org,
+# on 2022-10-09.
+my %unicode_decomposed = (
+ "00C0", "0041_0300",
+ "00C1", "0041_0301",
+ "00C2", "0041_0302",
+ "00C3", "0041_0303",
+ "00C4", "0041_0308",
+ "00C5", "0041_030A",
+ "00C7", "0043_0327",
+ "00C8", "0045_0300",
+ "00C9", "0045_0301",
+ "00CA", "0045_0302",
+ "00CB", "0045_0308",
+ "00CC", "0049_0300",
+ "00CD", "0049_0301",
+ "00CE", "0049_0302",
+ "00CF", "0049_0308",
+ "00D1", "004E_0303",
+ "00D2", "004F_0300",
+ "00D3", "004F_0301",
+ "00D4", "004F_0302",
+ "00D5", "004F_0303",
+ "00D6", "004F_0308",
+ "00D9", "0055_0300",
+ "00DA", "0055_0301",
+ "00DB", "0055_0302",
+ "00DC", "0055_0308",
+ "00DD", "0059_0301",
+ "00E0", "0061_0300",
+ "00E1", "0061_0301",
+ "00E2", "0061_0302",
+ "00E3", "0061_0303",
+ "00E4", "0061_0308",
+ "00E5", "0061_030A",
+ "00E7", "0063_0327",
+ "00E8", "0065_0300",
+ "00E9", "0065_0301",
+ "00EA", "0065_0302",
+ "00EB", "0065_0308",
+ "00EC", "0069_0300",
+ "00ED", "0069_0301",
+ "00EE", "0069_0302",
+ "00EF", "0069_0308",
+ "00F1", "006E_0303",
+ "00F2", "006F_0300",
+ "00F3", "006F_0301",
+ "00F4", "006F_0302",
+ "00F5", "006F_0303",
+ "00F6", "006F_0308",
+ "00F9", "0075_0300",
+ "00FA", "0075_0301",
+ "00FB", "0075_0302",
+ "00FC", "0075_0308",
+ "00FD", "0079_0301",
+ "00FF", "0079_0308",
+ "0100", "0041_0304",
+ "0101", "0061_0304",
+ "0102", "0041_0306",
+ "0103", "0061_0306",
+ "0104", "0041_0328",
+ "0105", "0061_0328",
+ "0106", "0043_0301",
+ "0107", "0063_0301",
+ "0108", "0043_0302",
+ "0109", "0063_0302",
+ "010A", "0043_0307",
+ "010B", "0063_0307",
+ "010C", "0043_030C",
+ "010D", "0063_030C",
+ "010E", "0044_030C",
+ "010F", "0064_030C",
+ "0112", "0045_0304",
+ "0113", "0065_0304",
+ "0114", "0045_0306",
+ "0115", "0065_0306",
+ "0116", "0045_0307",
+ "0117", "0065_0307",
+ "0118", "0045_0328",
+ "0119", "0065_0328",
+ "011A", "0045_030C",
+ "011B", "0065_030C",
+ "011C", "0047_0302",
+ "011D", "0067_0302",
+ "011E", "0047_0306",
+ "011F", "0067_0306",
+ "0120", "0047_0307",
+ "0121", "0067_0307",
+ "0122", "0047_0327",
+ "0123", "0067_0327",
+ "0124", "0048_0302",
+ "0125", "0068_0302",
+ "0128", "0049_0303",
+ "0129", "0069_0303",
+ "012A", "0049_0304",
+ "012B", "0069_0304",
+ "012C", "0049_0306",
+ "012D", "0069_0306",
+ "012E", "0049_0328",
+ "012F", "0069_0328",
+ "0130", "0049_0307",
+ "0134", "004A_0302",
+ "0135", "006A_0302",
+ "0136", "004B_0327",
+ "0137", "006B_0327",
+ "0139", "004C_0301",
+ "013A", "006C_0301",
+ "013B", "004C_0327",
+ "013C", "006C_0327",
+ "013D", "004C_030C",
+ "013E", "006C_030C",
+ "0143", "004E_0301",
+ "0144", "006E_0301",
+ "0145", "004E_0327",
+ "0146", "006E_0327",
+ "0147", "004E_030C",
+ "0148", "006E_030C",
+ "014C", "004F_0304",
+ "014D", "006F_0304",
+ "014E", "004F_0306",
+ "014F", "006F_0306",
+ "0150", "004F_030B",
+ "0151", "006F_030B",
+ "0154", "0052_0301",
+ "0155", "0072_0301",
+ "0156", "0052_0327",
+ "0157", "0072_0327",
+ "0158", "0052_030C",
+ "0159", "0072_030C",
+ "015A", "0053_0301",
+ "015B", "0073_0301",
+ "015C", "0053_0302",
+ "015D", "0073_0302",
+ "015E", "0053_0327",
+ "015F", "0073_0327",
+ "0160", "0053_030C",
+ "0161", "0073_030C",
+ "0162", "0054_0327",
+ "0163", "0074_0327",
+ "0164", "0054_030C",
+ "0165", "0074_030C",
+ "0168", "0055_0303",
+ "0169", "0075_0303",
+ "016A", "0055_0304",
+ "016B", "0075_0304",
+ "016C", "0055_0306",
+ "016D", "0075_0306",
+ "016E", "0055_030A",
+ "016F", "0075_030A",
+ "0170", "0055_030B",
+ "0171", "0075_030B",
+ "0172", "0055_0328",
+ "0173", "0075_0328",
+ "0174", "0057_0302",
+ "0175", "0077_0302",
+ "0176", "0059_0302",
+ "0177", "0079_0302",
+ "0178", "0059_0308",
+ "0179", "005A_0301",
+ "017A", "007A_0301",
+ "017B", "005A_0307",
+ "017C", "007A_0307",
+ "017D", "005A_030C",
+ "017E", "007A_030C",
+ "01A0", "004F_031B",
+ "01A1", "006F_031B",
+ "01AF", "0055_031B",
+ "01B0", "0075_031B",
+ "01CD", "0041_030C",
+ "01CE", "0061_030C",
+ "01CF", "0049_030C",
+ "01D0", "0069_030C",
+ "01D1", "004F_030C",
+ "01D2", "006F_030C",
+ "01D3", "0055_030C",
+ "01D4", "0075_030C",
+ "01D5", "0055_0308_0304",
+ "01D6", "0075_0308_0304",
+ "01D7", "0055_0308_0301",
+ "01D8", "0075_0308_0301",
+ "01D9", "0055_0308_030C",
+ "01DA", "0075_0308_030C",
+ "01DB", "0055_0308_0300",
+ "01DC", "0075_0308_0300",
+ "01DE", "0041_0308_0304",
+ "01DF", "0061_0308_0304",
+ "01E0", "0041_0307_0304",
+ "01E1", "0061_0307_0304",
+ "01E2", "00C6_0304",
+ "01E3", "00E6_0304",
+ "01E6", "0047_030C",
+ "01E7", "0067_030C",
+ "01E8", "004B_030C",
+ "01E9", "006B_030C",
+ "01EA", "004F_0328",
+ "01EB", "006F_0328",
+ "01EC", "004F_0328_0304",
+ "01ED", "006F_0328_0304",
+ "01EE", "01B7_030C",
+ "01EF", "0292_030C",
+ "01F0", "006A_030C",
+ "01F4", "0047_0301",
+ "01F5", "0067_0301",
+ "01F8", "004E_0300",
+ "01F9", "006E_0300",
+ "01FA", "0041_030A_0301",
+ "01FB", "0061_030A_0301",
+ "01FC", "00C6_0301",
+ "01FD", "00E6_0301",
+ "01FE", "00D8_0301",
+ "01FF", "00F8_0301",
+ "0200", "0041_030F",
+ "0201", "0061_030F",
+ "0202", "0041_0311",
+ "0203", "0061_0311",
+ "0204", "0045_030F",
+ "0205", "0065_030F",
+ "0206", "0045_0311",
+ "0207", "0065_0311",
+ "0208", "0049_030F",
+ "0209", "0069_030F",
+ "020A", "0049_0311",
+ "020B", "0069_0311",
+ "020C", "004F_030F",
+ "020D", "006F_030F",
+ "020E", "004F_0311",
+ "020F", "006F_0311",
+ "0210", "0052_030F",
+ "0211", "0072_030F",
+ "0212", "0052_0311",
+ "0213", "0072_0311",
+ "0214", "0055_030F",
+ "0215", "0075_030F",
+ "0216", "0055_0311",
+ "0217", "0075_0311",
+ "0218", "0053_0326",
+ "0219", "0073_0326",
+ "021A", "0054_0326",
+ "021B", "0074_0326",
+ "021E", "0048_030C",
+ "021F", "0068_030C",
+ "0226", "0041_0307",
+ "0227", "0061_0307",
+ "0228", "0045_0327",
+ "0229", "0065_0327",
+ "022A", "004F_0308_0304",
+ "022B", "006F_0308_0304",
+ "022C", "004F_0303_0304",
+ "022D", "006F_0303_0304",
+ "022E", "004F_0307",
+ "022F", "006F_0307",
+ "0230", "004F_0307_0304",
+ "0231", "006F_0307_0304",
+ "0232", "0059_0304",
+ "0233", "0079_0304",
+ "0340", "0300",
+ "0341", "0301",
+ "0343", "0313",
+ "0344", "0308_0301",
+ "0374", "02B9",
+ "037E", "003B",
+ "0385", "00A8_0301",
+ "0386", "0391_0301",
+ "0387", "00B7",
+ "0388", "0395_0301",
+ "0389", "0397_0301",
+ "038A", "0399_0301",
+ "038C", "039F_0301",
+ "038E", "03A5_0301",
+ "038F", "03A9_0301",
+ "0390", "03B9_0308_0301",
+ "03AA", "0399_0308",
+ "03AB", "03A5_0308",
+ "03AC", "03B1_0301",
+ "03AD", "03B5_0301",
+ "03AE", "03B7_0301",
+ "03AF", "03B9_0301",
+ "03B0", "03C5_0308_0301",
+ "03CA", "03B9_0308",
+ "03CB", "03C5_0308",
+ "03CC", "03BF_0301",
+ "03CD", "03C5_0301",
+ "03CE", "03C9_0301",
+ "03D3", "03D2_0301",
+ "03D4", "03D2_0308",
+ "0400", "0415_0300",
+ "0401", "0415_0308",
+ "0403", "0413_0301",
+ "0407", "0406_0308",
+ "040C", "041A_0301",
+ "040D", "0418_0300",
+ "040E", "0423_0306",
+ "0419", "0418_0306",
+ "0439", "0438_0306",
+ "0450", "0435_0300",
+ "0451", "0435_0308",
+ "0453", "0433_0301",
+ "0457", "0456_0308",
+ "045C", "043A_0301",
+ "045D", "0438_0300",
+ "045E", "0443_0306",
+ "0476", "0474_030F",
+ "0477", "0475_030F",
+ "04C1", "0416_0306",
+ "04C2", "0436_0306",
+ "04D0", "0410_0306",
+ "04D1", "0430_0306",
+ "04D2", "0410_0308",
+ "04D3", "0430_0308",
+ "04D6", "0415_0306",
+ "04D7", "0435_0306",
+ "04DA", "04D8_0308",
+ "04DB", "04D9_0308",
+ "04DC", "0416_0308",
+ "04DD", "0436_0308",
+ "04DE", "0417_0308",
+ "04DF", "0437_0308",
+ "04E2", "0418_0304",
+ "04E3", "0438_0304",
+ "04E4", "0418_0308",
+ "04E5", "0438_0308",
+ "04E6", "041E_0308",
+ "04E7", "043E_0308",
+ "04EA", "04E8_0308",
+ "04EB", "04E9_0308",
+ "04EC", "042D_0308",
+ "04ED", "044D_0308",
+ "04EE", "0423_0304",
+ "04EF", "0443_0304",
+ "04F0", "0423_0308",
+ "04F1", "0443_0308",
+ "04F2", "0423_030B",
+ "04F3", "0443_030B",
+ "04F4", "0427_0308",
+ "04F5", "0447_0308",
+ "04F8", "042B_0308",
+ "04F9", "044B_0308",
+ "0622", "0627_0653",
+ "0623", "0627_0654",
+ "0624", "0648_0654",
+ "0625", "0627_0655",
+ "0626", "064A_0654",
+ "06C0", "06D5_0654",
+ "06C2", "06C1_0654",
+ "06D3", "06D2_0654",
+ "0929", "0928_093C",
+ "0931", "0930_093C",
+ "0934", "0933_093C",
+ "0958", "0915_093C",
+ "0959", "0916_093C",
+ "095A", "0917_093C",
+ "095B", "091C_093C",
+ "095C", "0921_093C",
+ "095D", "0922_093C",
+ "095E", "092B_093C",
+ "095F", "092F_093C",
+ "09CB", "09C7_09BE",
+ "09CC", "09C7_09D7",
+ "09DC", "09A1_09BC",
+ "09DD", "09A2_09BC",
+ "09DF", "09AF_09BC",
+ "0A33", "0A32_0A3C",
+ "0A36", "0A38_0A3C",
+ "0A59", "0A16_0A3C",
+ "0A5A", "0A17_0A3C",
+ "0A5B", "0A1C_0A3C",
+ "0A5E", "0A2B_0A3C",
+ "0B48", "0B47_0B56",
+ "0B4B", "0B47_0B3E",
+ "0B4C", "0B47_0B57",
+ "0B5C", "0B21_0B3C",
+ "0B5D", "0B22_0B3C",
+ "0B94", "0B92_0BD7",
+ "0BCA", "0BC6_0BBE",
+ "0BCB", "0BC7_0BBE",
+ "0BCC", "0BC6_0BD7",
+ "0C48", "0C46_0C56",
+ "0CC0", "0CBF_0CD5",
+ "0CC7", "0CC6_0CD5",
+ "0CC8", "0CC6_0CD6",
+ "0CCA", "0CC6_0CC2",
+ "0CCB", "0CC6_0CC2_0CD5",
+ "0D4A", "0D46_0D3E",
+ "0D4B", "0D47_0D3E",
+ "0D4C", "0D46_0D57",
+ "0DDA", "0DD9_0DCA",
+ "0DDC", "0DD9_0DCF",
+ "0DDD", "0DD9_0DCF_0DCA",
+ "0DDE", "0DD9_0DDF",
+ "0F43", "0F42_0FB7",
+ "0F4D", "0F4C_0FB7",
+ "0F52", "0F51_0FB7",
+ "0F57", "0F56_0FB7",
+ "0F5C", "0F5B_0FB7",
+ "0F69", "0F40_0FB5",
+ "0F73", "0F71_0F72",
+ "0F75", "0F71_0F74",
+ "0F76", "0FB2_0F80",
+ "0F78", "0FB3_0F80",
+ "0F81", "0F71_0F80",
+ "0F93", "0F92_0FB7",
+ "0F9D", "0F9C_0FB7",
+ "0FA2", "0FA1_0FB7",
+ "0FA7", "0FA6_0FB7",
+ "0FAC", "0FAB_0FB7",
+ "0FB9", "0F90_0FB5",
+ "1026", "1025_102E",
+ "1B06", "1B05_1B35",
+ "1B08", "1B07_1B35",
+ "1B0A", "1B09_1B35",
+ "1B0C", "1B0B_1B35",
+ "1B0E", "1B0D_1B35",
+ "1B12", "1B11_1B35",
+ "1B3B", "1B3A_1B35",
+ "1B3D", "1B3C_1B35",
+ "1B40", "1B3E_1B35",
+ "1B41", "1B3F_1B35",
+ "1B43", "1B42_1B35",
+ "1E00", "0041_0325",
+ "1E01", "0061_0325",
+ "1E02", "0042_0307",
+ "1E03", "0062_0307",
+ "1E04", "0042_0323",
+ "1E05", "0062_0323",
+ "1E06", "0042_0331",
+ "1E07", "0062_0331",
+ "1E08", "0043_0327_0301",
+ "1E09", "0063_0327_0301",
+ "1E0A", "0044_0307",
+ "1E0B", "0064_0307",
+ "1E0C", "0044_0323",
+ "1E0D", "0064_0323",
+ "1E0E", "0044_0331",
+ "1E0F", "0064_0331",
+ "1E10", "0044_0327",
+ "1E11", "0064_0327",
+ "1E12", "0044_032D",
+ "1E13", "0064_032D",
+ "1E14", "0045_0304_0300",
+ "1E15", "0065_0304_0300",
+ "1E16", "0045_0304_0301",
+ "1E17", "0065_0304_0301",
+ "1E18", "0045_032D",
+ "1E19", "0065_032D",
+ "1E1A", "0045_0330",
+ "1E1B", "0065_0330",
+ "1E1C", "0045_0327_0306",
+ "1E1D", "0065_0327_0306",
+ "1E1E", "0046_0307",
+ "1E1F", "0066_0307",
+ "1E20", "0047_0304",
+ "1E21", "0067_0304",
+ "1E22", "0048_0307",
+ "1E23", "0068_0307",
+ "1E24", "0048_0323",
+ "1E25", "0068_0323",
+ "1E26", "0048_0308",
+ "1E27", "0068_0308",
+ "1E28", "0048_0327",
+ "1E29", "0068_0327",
+ "1E2A", "0048_032E",
+ "1E2B", "0068_032E",
+ "1E2C", "0049_0330",
+ "1E2D", "0069_0330",
+ "1E2E", "0049_0308_0301",
+ "1E2F", "0069_0308_0301",
+ "1E30", "004B_0301",
+ "1E31", "006B_0301",
+ "1E32", "004B_0323",
+ "1E33", "006B_0323",
+ "1E34", "004B_0331",
+ "1E35", "006B_0331",
+ "1E36", "004C_0323",
+ "1E37", "006C_0323",
+ "1E38", "004C_0323_0304",
+ "1E39", "006C_0323_0304",
+ "1E3A", "004C_0331",
+ "1E3B", "006C_0331",
+ "1E3C", "004C_032D",
+ "1E3D", "006C_032D",
+ "1E3E", "004D_0301",
+ "1E3F", "006D_0301",
+ "1E40", "004D_0307",
+ "1E41", "006D_0307",
+ "1E42", "004D_0323",
+ "1E43", "006D_0323",
+ "1E44", "004E_0307",
+ "1E45", "006E_0307",
+ "1E46", "004E_0323",
+ "1E47", "006E_0323",
+ "1E48", "004E_0331",
+ "1E49", "006E_0331",
+ "1E4A", "004E_032D",
+ "1E4B", "006E_032D",
+ "1E4C", "004F_0303_0301",
+ "1E4D", "006F_0303_0301",
+ "1E4E", "004F_0303_0308",
+ "1E4F", "006F_0303_0308",
+ "1E50", "004F_0304_0300",
+ "1E51", "006F_0304_0300",
+ "1E52", "004F_0304_0301",
+ "1E53", "006F_0304_0301",
+ "1E54", "0050_0301",
+ "1E55", "0070_0301",
+ "1E56", "0050_0307",
+ "1E57", "0070_0307",
+ "1E58", "0052_0307",
+ "1E59", "0072_0307",
+ "1E5A", "0052_0323",
+ "1E5B", "0072_0323",
+ "1E5C", "0052_0323_0304",
+ "1E5D", "0072_0323_0304",
+ "1E5E", "0052_0331",
+ "1E5F", "0072_0331",
+ "1E60", "0053_0307",
+ "1E61", "0073_0307",
+ "1E62", "0053_0323",
+ "1E63", "0073_0323",
+ "1E64", "0053_0301_0307",
+ "1E65", "0073_0301_0307",
+ "1E66", "0053_030C_0307",
+ "1E67", "0073_030C_0307",
+ "1E68", "0053_0323_0307",
+ "1E69", "0073_0323_0307",
+ "1E6A", "0054_0307",
+ "1E6B", "0074_0307",
+ "1E6C", "0054_0323",
+ "1E6D", "0074_0323",
+ "1E6E", "0054_0331",
+ "1E6F", "0074_0331",
+ "1E70", "0054_032D",
+ "1E71", "0074_032D",
+ "1E72", "0055_0324",
+ "1E73", "0075_0324",
+ "1E74", "0055_0330",
+ "1E75", "0075_0330",
+ "1E76", "0055_032D",
+ "1E77", "0075_032D",
+ "1E78", "0055_0303_0301",
+ "1E79", "0075_0303_0301",
+ "1E7A", "0055_0304_0308",
+ "1E7B", "0075_0304_0308",
+ "1E7C", "0056_0303",
+ "1E7D", "0076_0303",
+ "1E7E", "0056_0323",
+ "1E7F", "0076_0323",
+ "1E80", "0057_0300",
+ "1E81", "0077_0300",
+ "1E82", "0057_0301",
+ "1E83", "0077_0301",
+ "1E84", "0057_0308",
+ "1E85", "0077_0308",
+ "1E86", "0057_0307",
+ "1E87", "0077_0307",
+ "1E88", "0057_0323",
+ "1E89", "0077_0323",
+ "1E8A", "0058_0307",
+ "1E8B", "0078_0307",
+ "1E8C", "0058_0308",
+ "1E8D", "0078_0308",
+ "1E8E", "0059_0307",
+ "1E8F", "0079_0307",
+ "1E90", "005A_0302",
+ "1E91", "007A_0302",
+ "1E92", "005A_0323",
+ "1E93", "007A_0323",
+ "1E94", "005A_0331",
+ "1E95", "007A_0331",
+ "1E96", "0068_0331",
+ "1E97", "0074_0308",
+ "1E98", "0077_030A",
+ "1E99", "0079_030A",
+ "1E9B", "017F_0307",
+ "1EA0", "0041_0323",
+ "1EA1", "0061_0323",
+ "1EA2", "0041_0309",
+ "1EA3", "0061_0309",
+ "1EA4", "0041_0302_0301",
+ "1EA5", "0061_0302_0301",
+ "1EA6", "0041_0302_0300",
+ "1EA7", "0061_0302_0300",
+ "1EA8", "0041_0302_0309",
+ "1EA9", "0061_0302_0309",
+ "1EAA", "0041_0302_0303",
+ "1EAB", "0061_0302_0303",
+ "1EAC", "0041_0323_0302",
+ "1EAD", "0061_0323_0302",
+ "1EAE", "0041_0306_0301",
+ "1EAF", "0061_0306_0301",
+ "1EB0", "0041_0306_0300",
+ "1EB1", "0061_0306_0300",
+ "1EB2", "0041_0306_0309",
+ "1EB3", "0061_0306_0309",
+ "1EB4", "0041_0306_0303",
+ "1EB5", "0061_0306_0303",
+ "1EB6", "0041_0323_0306",
+ "1EB7", "0061_0323_0306",
+ "1EB8", "0045_0323",
+ "1EB9", "0065_0323",
+ "1EBA", "0045_0309",
+ "1EBB", "0065_0309",
+ "1EBC", "0045_0303",
+ "1EBD", "0065_0303",
+ "1EBE", "0045_0302_0301",
+ "1EBF", "0065_0302_0301",
+ "1EC0", "0045_0302_0300",
+ "1EC1", "0065_0302_0300",
+ "1EC2", "0045_0302_0309",
+ "1EC3", "0065_0302_0309",
+ "1EC4", "0045_0302_0303",
+ "1EC5", "0065_0302_0303",
+ "1EC6", "0045_0323_0302",
+ "1EC7", "0065_0323_0302",
+ "1EC8", "0049_0309",
+ "1EC9", "0069_0309",
+ "1ECA", "0049_0323",
+ "1ECB", "0069_0323",
+ "1ECC", "004F_0323",
+ "1ECD", "006F_0323",
+ "1ECE", "004F_0309",
+ "1ECF", "006F_0309",
+ "1ED0", "004F_0302_0301",
+ "1ED1", "006F_0302_0301",
+ "1ED2", "004F_0302_0300",
+ "1ED3", "006F_0302_0300",
+ "1ED4", "004F_0302_0309",
+ "1ED5", "006F_0302_0309",
+ "1ED6", "004F_0302_0303",
+ "1ED7", "006F_0302_0303",
+ "1ED8", "004F_0323_0302",
+ "1ED9", "006F_0323_0302",
+ "1EDA", "004F_031B_0301",
+ "1EDB", "006F_031B_0301",
+ "1EDC", "004F_031B_0300",
+ "1EDD", "006F_031B_0300",
+ "1EDE", "004F_031B_0309",
+ "1EDF", "006F_031B_0309",
+ "1EE0", "004F_031B_0303",
+ "1EE1", "006F_031B_0303",
+ "1EE2", "004F_031B_0323",
+ "1EE3", "006F_031B_0323",
+ "1EE4", "0055_0323",
+ "1EE5", "0075_0323",
+ "1EE6", "0055_0309",
+ "1EE7", "0075_0309",
+ "1EE8", "0055_031B_0301",
+ "1EE9", "0075_031B_0301",
+ "1EEA", "0055_031B_0300",
+ "1EEB", "0075_031B_0300",
+ "1EEC", "0055_031B_0309",
+ "1EED", "0075_031B_0309",
+ "1EEE", "0055_031B_0303",
+ "1EEF", "0075_031B_0303",
+ "1EF0", "0055_031B_0323",
+ "1EF1", "0075_031B_0323",
+ "1EF2", "0059_0300",
+ "1EF3", "0079_0300",
+ "1EF4", "0059_0323",
+ "1EF5", "0079_0323",
+ "1EF6", "0059_0309",
+ "1EF7", "0079_0309",
+ "1EF8", "0059_0303",
+ "1EF9", "0079_0303",
+ "1F00", "03B1_0313",
+ "1F01", "03B1_0314",
+ "1F02", "03B1_0313_0300",
+ "1F03", "03B1_0314_0300",
+ "1F04", "03B1_0313_0301",
+ "1F05", "03B1_0314_0301",
+ "1F06", "03B1_0313_0342",
+ "1F07", "03B1_0314_0342",
+ "1F08", "0391_0313",
+ "1F09", "0391_0314",
+ "1F0A", "0391_0313_0300",
+ "1F0B", "0391_0314_0300",
+ "1F0C", "0391_0313_0301",
+ "1F0D", "0391_0314_0301",
+ "1F0E", "0391_0313_0342",
+ "1F0F", "0391_0314_0342",
+ "1F10", "03B5_0313",
+ "1F11", "03B5_0314",
+ "1F12", "03B5_0313_0300",
+ "1F13", "03B5_0314_0300",
+ "1F14", "03B5_0313_0301",
+ "1F15", "03B5_0314_0301",
+ "1F18", "0395_0313",
+ "1F19", "0395_0314",
+ "1F1A", "0395_0313_0300",
+ "1F1B", "0395_0314_0300",
+ "1F1C", "0395_0313_0301",
+ "1F1D", "0395_0314_0301",
+ "1F20", "03B7_0313",
+ "1F21", "03B7_0314",
+ "1F22", "03B7_0313_0300",
+ "1F23", "03B7_0314_0300",
+ "1F24", "03B7_0313_0301",
+ "1F25", "03B7_0314_0301",
+ "1F26", "03B7_0313_0342",
+ "1F27", "03B7_0314_0342",
+ "1F28", "0397_0313",
+ "1F29", "0397_0314",
+ "1F2A", "0397_0313_0300",
+ "1F2B", "0397_0314_0300",
+ "1F2C", "0397_0313_0301",
+ "1F2D", "0397_0314_0301",
+ "1F2E", "0397_0313_0342",
+ "1F2F", "0397_0314_0342",
+ "1F30", "03B9_0313",
+ "1F31", "03B9_0314",
+ "1F32", "03B9_0313_0300",
+ "1F33", "03B9_0314_0300",
+ "1F34", "03B9_0313_0301",
+ "1F35", "03B9_0314_0301",
+ "1F36", "03B9_0313_0342",
+ "1F37", "03B9_0314_0342",
+ "1F38", "0399_0313",
+ "1F39", "0399_0314",
+ "1F3A", "0399_0313_0300",
+ "1F3B", "0399_0314_0300",
+ "1F3C", "0399_0313_0301",
+ "1F3D", "0399_0314_0301",
+ "1F3E", "0399_0313_0342",
+ "1F3F", "0399_0314_0342",
+ "1F40", "03BF_0313",
+ "1F41", "03BF_0314",
+ "1F42", "03BF_0313_0300",
+ "1F43", "03BF_0314_0300",
+ "1F44", "03BF_0313_0301",
+ "1F45", "03BF_0314_0301",
+ "1F48", "039F_0313",
+ "1F49", "039F_0314",
+ "1F4A", "039F_0313_0300",
+ "1F4B", "039F_0314_0300",
+ "1F4C", "039F_0313_0301",
+ "1F4D", "039F_0314_0301",
+ "1F50", "03C5_0313",
+ "1F51", "03C5_0314",
+ "1F52", "03C5_0313_0300",
+ "1F53", "03C5_0314_0300",
+ "1F54", "03C5_0313_0301",
+ "1F55", "03C5_0314_0301",
+ "1F56", "03C5_0313_0342",
+ "1F57", "03C5_0314_0342",
+ "1F59", "03A5_0314",
+ "1F5B", "03A5_0314_0300",
+ "1F5D", "03A5_0314_0301",
+ "1F5F", "03A5_0314_0342",
+ "1F60", "03C9_0313",
+ "1F61", "03C9_0314",
+ "1F62", "03C9_0313_0300",
+ "1F63", "03C9_0314_0300",
+ "1F64", "03C9_0313_0301",
+ "1F65", "03C9_0314_0301",
+ "1F66", "03C9_0313_0342",
+ "1F67", "03C9_0314_0342",
+ "1F68", "03A9_0313",
+ "1F69", "03A9_0314",
+ "1F6A", "03A9_0313_0300",
+ "1F6B", "03A9_0314_0300",
+ "1F6C", "03A9_0313_0301",
+ "1F6D", "03A9_0314_0301",
+ "1F6E", "03A9_0313_0342",
+ "1F6F", "03A9_0314_0342",
+ "1F70", "03B1_0300",
+ "1F71", "03B1_0301",
+ "1F72", "03B5_0300",
+ "1F73", "03B5_0301",
+ "1F74", "03B7_0300",
+ "1F75", "03B7_0301",
+ "1F76", "03B9_0300",
+ "1F77", "03B9_0301",
+ "1F78", "03BF_0300",
+ "1F79", "03BF_0301",
+ "1F7A", "03C5_0300",
+ "1F7B", "03C5_0301",
+ "1F7C", "03C9_0300",
+ "1F7D", "03C9_0301",
+ "1F80", "03B1_0313_0345",
+ "1F81", "03B1_0314_0345",
+ "1F82", "03B1_0313_0300_0345",
+ "1F83", "03B1_0314_0300_0345",
+ "1F84", "03B1_0313_0301_0345",
+ "1F85", "03B1_0314_0301_0345",
+ "1F86", "03B1_0313_0342_0345",
+ "1F87", "03B1_0314_0342_0345",
+ "1F88", "0391_0313_0345",
+ "1F89", "0391_0314_0345",
+ "1F8A", "0391_0313_0300_0345",
+ "1F8B", "0391_0314_0300_0345",
+ "1F8C", "0391_0313_0301_0345",
+ "1F8D", "0391_0314_0301_0345",
+ "1F8E", "0391_0313_0342_0345",
+ "1F8F", "0391_0314_0342_0345",
+ "1F90", "03B7_0313_0345",
+ "1F91", "03B7_0314_0345",
+ "1F92", "03B7_0313_0300_0345",
+ "1F93", "03B7_0314_0300_0345",
+ "1F94", "03B7_0313_0301_0345",
+ "1F95", "03B7_0314_0301_0345",
+ "1F96", "03B7_0313_0342_0345",
+ "1F97", "03B7_0314_0342_0345",
+ "1F98", "0397_0313_0345",
+ "1F99", "0397_0314_0345",
+ "1F9A", "0397_0313_0300_0345",
+ "1F9B", "0397_0314_0300_0345",
+ "1F9C", "0397_0313_0301_0345",
+ "1F9D", "0397_0314_0301_0345",
+ "1F9E", "0397_0313_0342_0345",
+ "1F9F", "0397_0314_0342_0345",
+ "1FA0", "03C9_0313_0345",
+ "1FA1", "03C9_0314_0345",
+ "1FA2", "03C9_0313_0300_0345",
+ "1FA3", "03C9_0314_0300_0345",
+ "1FA4", "03C9_0313_0301_0345",
+ "1FA5", "03C9_0314_0301_0345",
+ "1FA6", "03C9_0313_0342_0345",
+ "1FA7", "03C9_0314_0342_0345",
+ "1FA8", "03A9_0313_0345",
+ "1FA9", "03A9_0314_0345",
+ "1FAA", "03A9_0313_0300_0345",
+ "1FAB", "03A9_0314_0300_0345",
+ "1FAC", "03A9_0313_0301_0345",
+ "1FAD", "03A9_0314_0301_0345",
+ "1FAE", "03A9_0313_0342_0345",
+ "1FAF", "03A9_0314_0342_0345",
+ "1FB0", "03B1_0306",
+ "1FB1", "03B1_0304",
+ "1FB2", "03B1_0300_0345",
+ "1FB3", "03B1_0345",
+ "1FB4", "03B1_0301_0345",
+ "1FB6", "03B1_0342",
+ "1FB7", "03B1_0342_0345",
+ "1FB8", "0391_0306",
+ "1FB9", "0391_0304",
+ "1FBA", "0391_0300",
+ "1FBB", "0391_0301",
+ "1FBC", "0391_0345",
+ "1FBE", "03B9",
+ "1FC1", "00A8_0342",
+ "1FC2", "03B7_0300_0345",
+ "1FC3", "03B7_0345",
+ "1FC4", "03B7_0301_0345",
+ "1FC6", "03B7_0342",
+ "1FC7", "03B7_0342_0345",
+ "1FC8", "0395_0300",
+ "1FC9", "0395_0301",
+ "1FCA", "0397_0300",
+ "1FCB", "0397_0301",
+ "1FCC", "0397_0345",
+ "1FCD", "1FBF_0300",
+ "1FCE", "1FBF_0301",
+ "1FCF", "1FBF_0342",
+ "1FD0", "03B9_0306",
+ "1FD1", "03B9_0304",
+ "1FD2", "03B9_0308_0300",
+ "1FD3", "03B9_0308_0301",
+ "1FD6", "03B9_0342",
+ "1FD7", "03B9_0308_0342",
+ "1FD8", "0399_0306",
+ "1FD9", "0399_0304",
+ "1FDA", "0399_0300",
+ "1FDB", "0399_0301",
+ "1FDD", "1FFE_0300",
+ "1FDE", "1FFE_0301",
+ "1FDF", "1FFE_0342",
+ "1FE0", "03C5_0306",
+ "1FE1", "03C5_0304",
+ "1FE2", "03C5_0308_0300",
+ "1FE3", "03C5_0308_0301",
+ "1FE4", "03C1_0313",
+ "1FE5", "03C1_0314",
+ "1FE6", "03C5_0342",
+ "1FE7", "03C5_0308_0342",
+ "1FE8", "03A5_0306",
+ "1FE9", "03A5_0304",
+ "1FEA", "03A5_0300",
+ "1FEB", "03A5_0301",
+ "1FEC", "03A1_0314",
+ "1FED", "00A8_0300",
+ "1FEE", "00A8_0301",
+ "1FEF", "0060",
+ "1FF2", "03C9_0300_0345",
+ "1FF3", "03C9_0345",
+ "1FF4", "03C9_0301_0345",
+ "1FF6", "03C9_0342",
+ "1FF7", "03C9_0342_0345",
+ "1FF8", "039F_0300",
+ "1FF9", "039F_0301",
+ "1FFA", "03A9_0300",
+ "1FFB", "03A9_0301",
+ "1FFC", "03A9_0345",
+ "1FFD", "00B4",
+ "2000", "2002",
+ "2001", "2003",
+ "2126", "03A9",
+ "212A", "004B",
+ "212B", "0041_030A",
+ "219A", "2190_0338",
+ "219B", "2192_0338",
+ "21AE", "2194_0338",
+ "21CD", "21D0_0338",
+ "21CE", "21D4_0338",
+ "21CF", "21D2_0338",
+ "2204", "2203_0338",
+ "2209", "2208_0338",
+ "220C", "220B_0338",
+ "2224", "2223_0338",
+ "2226", "2225_0338",
+ "2241", "223C_0338",
+ "2244", "2243_0338",
+ "2247", "2245_0338",
+ "2249", "2248_0338",
+ "2260", "003D_0338",
+ "2262", "2261_0338",
+ "226D", "224D_0338",
+ "226E", "003C_0338",
+ "226F", "003E_0338",
+ "2270", "2264_0338",
+ "2271", "2265_0338",
+ "2274", "2272_0338",
+ "2275", "2273_0338",
+ "2278", "2276_0338",
+ "2279", "2277_0338",
+ "2280", "227A_0338",
+ "2281", "227B_0338",
+ "2284", "2282_0338",
+ "2285", "2283_0338",
+ "2288", "2286_0338",
+ "2289", "2287_0338",
+ "22AC", "22A2_0338",
+ "22AD", "22A8_0338",
+ "22AE", "22A9_0338",
+ "22AF", "22AB_0338",
+ "22E0", "227C_0338",
+ "22E1", "227D_0338",
+ "22E2", "2291_0338",
+ "22E3", "2292_0338",
+ "22EA", "22B2_0338",
+ "22EB", "22B3_0338",
+ "22EC", "22B4_0338",
+ "22ED", "22B5_0338",
+ "2329", "3008",
+ "232A", "3009",
+ "2ADC", "2ADD_0338",
+ "304C", "304B_3099",
+ "304E", "304D_3099",
+ "3050", "304F_3099",
+ "3052", "3051_3099",
+ "3054", "3053_3099",
+ "3056", "3055_3099",
+ "3058", "3057_3099",
+ "305A", "3059_3099",
+ "305C", "305B_3099",
+ "305E", "305D_3099",
+ "3060", "305F_3099",
+ "3062", "3061_3099",
+ "3065", "3064_3099",
+ "3067", "3066_3099",
+ "3069", "3068_3099",
+ "3070", "306F_3099",
+ "3071", "306F_309A",
+ "3073", "3072_3099",
+ "3074", "3072_309A",
+ "3076", "3075_3099",
+ "3077", "3075_309A",
+ "3079", "3078_3099",
+ "307A", "3078_309A",
+ "307C", "307B_3099",
+ "307D", "307B_309A",
+ "3094", "3046_3099",
+ "309E", "309D_3099",
+ "30AC", "30AB_3099",
+ "30AE", "30AD_3099",
+ "30B0", "30AF_3099",
+ "30B2", "30B1_3099",
+ "30B4", "30B3_3099",
+ "30B6", "30B5_3099",
+ "30B8", "30B7_3099",
+ "30BA", "30B9_3099",
+ "30BC", "30BB_3099",
+ "30BE", "30BD_3099",
+ "30C0", "30BF_3099",
+ "30C2", "30C1_3099",
+ "30C5", "30C4_3099",
+ "30C7", "30C6_3099",
+ "30C9", "30C8_3099",
+ "30D0", "30CF_3099",
+ "30D1", "30CF_309A",
+ "30D3", "30D2_3099",
+ "30D4", "30D2_309A",
+ "30D6", "30D5_3099",
+ "30D7", "30D5_309A",
+ "30D9", "30D8_3099",
+ "30DA", "30D8_309A",
+ "30DC", "30DB_3099",
+ "30DD", "30DB_309A",
+ "30F4", "30A6_3099",
+ "30F7", "30EF_3099",
+ "30F8", "30F0_3099",
+ "30F9", "30F1_3099",
+ "30FA", "30F2_3099",
+ "30FE", "30FD_3099",
+ "F900", "8C48",
+ "F901", "66F4",
+ "F902", "8ECA",
+ "F903", "8CC8",
+ "F904", "6ED1",
+ "F905", "4E32",
+ "F906", "53E5",
+ "F907", "9F9C",
+ "F908", "9F9C",
+ "F909", "5951",
+ "F90A", "91D1",
+ "F90B", "5587",
+ "F90C", "5948",
+ "F90D", "61F6",
+ "F90E", "7669",
+ "F90F", "7F85",
+ "F910", "863F",
+ "F911", "87BA",
+ "F912", "88F8",
+ "F913", "908F",
+ "F914", "6A02",
+ "F915", "6D1B",
+ "F916", "70D9",
+ "F917", "73DE",
+ "F918", "843D",
+ "F919", "916A",
+ "F91A", "99F1",
+ "F91B", "4E82",
+ "F91C", "5375",
+ "F91D", "6B04",
+ "F91E", "721B",
+ "F91F", "862D",
+ "F920", "9E1E",
+ "F921", "5D50",
+ "F922", "6FEB",
+ "F923", "85CD",
+ "F924", "8964",
+ "F925", "62C9",
+ "F926", "81D8",
+ "F927", "881F",
+ "F928", "5ECA",
+ "F929", "6717",
+ "F92A", "6D6A",
+ "F92B", "72FC",
+ "F92C", "90CE",
+ "F92D", "4F86",
+ "F92E", "51B7",
+ "F92F", "52DE",
+ "F930", "64C4",
+ "F931", "6AD3",
+ "F932", "7210",
+ "F933", "76E7",
+ "F934", "8001",
+ "F935", "8606",
+ "F936", "865C",
+ "F937", "8DEF",
+ "F938", "9732",
+ "F939", "9B6F",
+ "F93A", "9DFA",
+ "F93B", "788C",
+ "F93C", "797F",
+ "F93D", "7DA0",
+ "F93E", "83C9",
+ "F93F", "9304",
+ "F940", "9E7F",
+ "F941", "8AD6",
+ "F942", "58DF",
+ "F943", "5F04",
+ "F944", "7C60",
+ "F945", "807E",
+ "F946", "7262",
+ "F947", "78CA",
+ "F948", "8CC2",
+ "F949", "96F7",
+ "F94A", "58D8",
+ "F94B", "5C62",
+ "F94C", "6A13",
+ "F94D", "6DDA",
+ "F94E", "6F0F",
+ "F94F", "7D2F",
+ "F950", "7E37",
+ "F951", "964B",
+ "F952", "52D2",
+ "F953", "808B",
+ "F954", "51DC",
+ "F955", "51CC",
+ "F956", "7A1C",
+ "F957", "7DBE",
+ "F958", "83F1",
+ "F959", "9675",
+ "F95A", "8B80",
+ "F95B", "62CF",
+ "F95C", "6A02",
+ "F95D", "8AFE",
+ "F95E", "4E39",
+ "F95F", "5BE7",
+ "F960", "6012",
+ "F961", "7387",
+ "F962", "7570",
+ "F963", "5317",
+ "F964", "78FB",
+ "F965", "4FBF",
+ "F966", "5FA9",
+ "F967", "4E0D",
+ "F968", "6CCC",
+ "F969", "6578",
+ "F96A", "7D22",
+ "F96B", "53C3",
+ "F96C", "585E",
+ "F96D", "7701",
+ "F96E", "8449",
+ "F96F", "8AAA",
+ "F970", "6BBA",
+ "F971", "8FB0",
+ "F972", "6C88",
+ "F973", "62FE",
+ "F974", "82E5",
+ "F975", "63A0",
+ "F976", "7565",
+ "F977", "4EAE",
+ "F978", "5169",
+ "F979", "51C9",
+ "F97A", "6881",
+ "F97B", "7CE7",
+ "F97C", "826F",
+ "F97D", "8AD2",
+ "F97E", "91CF",
+ "F97F", "52F5",
+ "F980", "5442",
+ "F981", "5973",
+ "F982", "5EEC",
+ "F983", "65C5",
+ "F984", "6FFE",
+ "F985", "792A",
+ "F986", "95AD",
+ "F987", "9A6A",
+ "F988", "9E97",
+ "F989", "9ECE",
+ "F98A", "529B",
+ "F98B", "66C6",
+ "F98C", "6B77",
+ "F98D", "8F62",
+ "F98E", "5E74",
+ "F98F", "6190",
+ "F990", "6200",
+ "F991", "649A",
+ "F992", "6F23",
+ "F993", "7149",
+ "F994", "7489",
+ "F995", "79CA",
+ "F996", "7DF4",
+ "F997", "806F",
+ "F998", "8F26",
+ "F999", "84EE",
+ "F99A", "9023",
+ "F99B", "934A",
+ "F99C", "5217",
+ "F99D", "52A3",
+ "F99E", "54BD",
+ "F99F", "70C8",
+ "F9A0", "88C2",
+ "F9A1", "8AAA",
+ "F9A2", "5EC9",
+ "F9A3", "5FF5",
+ "F9A4", "637B",
+ "F9A5", "6BAE",
+ "F9A6", "7C3E",
+ "F9A7", "7375",
+ "F9A8", "4EE4",
+ "F9A9", "56F9",
+ "F9AA", "5BE7",
+ "F9AB", "5DBA",
+ "F9AC", "601C",
+ "F9AD", "73B2",
+ "F9AE", "7469",
+ "F9AF", "7F9A",
+ "F9B0", "8046",
+ "F9B1", "9234",
+ "F9B2", "96F6",
+ "F9B3", "9748",
+ "F9B4", "9818",
+ "F9B5", "4F8B",
+ "F9B6", "79AE",
+ "F9B7", "91B4",
+ "F9B8", "96B8",
+ "F9B9", "60E1",
+ "F9BA", "4E86",
+ "F9BB", "50DA",
+ "F9BC", "5BEE",
+ "F9BD", "5C3F",
+ "F9BE", "6599",
+ "F9BF", "6A02",
+ "F9C0", "71CE",
+ "F9C1", "7642",
+ "F9C2", "84FC",
+ "F9C3", "907C",
+ "F9C4", "9F8D",
+ "F9C5", "6688",
+ "F9C6", "962E",
+ "F9C7", "5289",
+ "F9C8", "677B",
+ "F9C9", "67F3",
+ "F9CA", "6D41",
+ "F9CB", "6E9C",
+ "F9CC", "7409",
+ "F9CD", "7559",
+ "F9CE", "786B",
+ "F9CF", "7D10",
+ "F9D0", "985E",
+ "F9D1", "516D",
+ "F9D2", "622E",
+ "F9D3", "9678",
+ "F9D4", "502B",
+ "F9D5", "5D19",
+ "F9D6", "6DEA",
+ "F9D7", "8F2A",
+ "F9D8", "5F8B",
+ "F9D9", "6144",
+ "F9DA", "6817",
+ "F9DB", "7387",
+ "F9DC", "9686",
+ "F9DD", "5229",
+ "F9DE", "540F",
+ "F9DF", "5C65",
+ "F9E0", "6613",
+ "F9E1", "674E",
+ "F9E2", "68A8",
+ "F9E3", "6CE5",
+ "F9E4", "7406",
+ "F9E5", "75E2",
+ "F9E6", "7F79",
+ "F9E7", "88CF",
+ "F9E8", "88E1",
+ "F9E9", "91CC",
+ "F9EA", "96E2",
+ "F9EB", "533F",
+ "F9EC", "6EBA",
+ "F9ED", "541D",
+ "F9EE", "71D0",
+ "F9EF", "7498",
+ "F9F0", "85FA",
+ "F9F1", "96A3",
+ "F9F2", "9C57",
+ "F9F3", "9E9F",
+ "F9F4", "6797",
+ "F9F5", "6DCB",
+ "F9F6", "81E8",
+ "F9F7", "7ACB",
+ "F9F8", "7B20",
+ "F9F9", "7C92",
+ "F9FA", "72C0",
+ "F9FB", "7099",
+ "F9FC", "8B58",
+ "F9FD", "4EC0",
+ "F9FE", "8336",
+ "F9FF", "523A",
+ "FA00", "5207",
+ "FA01", "5EA6",
+ "FA02", "62D3",
+ "FA03", "7CD6",
+ "FA04", "5B85",
+ "FA05", "6D1E",
+ "FA06", "66B4",
+ "FA07", "8F3B",
+ "FA08", "884C",
+ "FA09", "964D",
+ "FA0A", "898B",
+ "FA0B", "5ED3",
+ "FA0C", "5140",
+ "FA0D", "55C0",
+ "FA10", "585A",
+ "FA12", "6674",
+ "FA15", "51DE",
+ "FA16", "732A",
+ "FA17", "76CA",
+ "FA18", "793C",
+ "FA19", "795E",
+ "FA1A", "7965",
+ "FA1B", "798F",
+ "FA1C", "9756",
+ "FA1D", "7CBE",
+ "FA1E", "7FBD",
+ "FA20", "8612",
+ "FA22", "8AF8",
+ "FA25", "9038",
+ "FA26", "90FD",
+ "FA2A", "98EF",
+ "FA2B", "98FC",
+ "FA2C", "9928",
+ "FA2D", "9DB4",
+ "FA2E", "90DE",
+ "FA2F", "96B7",
+ "FA30", "4FAE",
+ "FA31", "50E7",
+ "FA32", "514D",
+ "FA33", "52C9",
+ "FA34", "52E4",
+ "FA35", "5351",
+ "FA36", "559D",
+ "FA37", "5606",
+ "FA38", "5668",
+ "FA39", "5840",
+ "FA3A", "58A8",
+ "FA3B", "5C64",
+ "FA3C", "5C6E",
+ "FA3D", "6094",
+ "FA3E", "6168",
+ "FA3F", "618E",
+ "FA40", "61F2",
+ "FA41", "654F",
+ "FA42", "65E2",
+ "FA43", "6691",
+ "FA44", "6885",
+ "FA45", "6D77",
+ "FA46", "6E1A",
+ "FA47", "6F22",
+ "FA48", "716E",
+ "FA49", "722B",
+ "FA4A", "7422",
+ "FA4B", "7891",
+ "FA4C", "793E",
+ "FA4D", "7949",
+ "FA4E", "7948",
+ "FA4F", "7950",
+ "FA50", "7956",
+ "FA51", "795D",
+ "FA52", "798D",
+ "FA53", "798E",
+ "FA54", "7A40",
+ "FA55", "7A81",
+ "FA56", "7BC0",
+ "FA57", "7DF4",
+ "FA58", "7E09",
+ "FA59", "7E41",
+ "FA5A", "7F72",
+ "FA5B", "8005",
+ "FA5C", "81ED",
+ "FA5D", "8279",
+ "FA5E", "8279",
+ "FA5F", "8457",
+ "FA60", "8910",
+ "FA61", "8996",
+ "FA62", "8B01",
+ "FA63", "8B39",
+ "FA64", "8CD3",
+ "FA65", "8D08",
+ "FA66", "8FB6",
+ "FA67", "9038",
+ "FA68", "96E3",
+ "FA69", "97FF",
+ "FA6A", "983B",
+ "FA6B", "6075",
+ "FA6C", "242EE",
+ "FA6D", "8218",
+ "FA70", "4E26",
+ "FA71", "51B5",
+ "FA72", "5168",
+ "FA73", "4F80",
+ "FA74", "5145",
+ "FA75", "5180",
+ "FA76", "52C7",
+ "FA77", "52FA",
+ "FA78", "559D",
+ "FA79", "5555",
+ "FA7A", "5599",
+ "FA7B", "55E2",
+ "FA7C", "585A",
+ "FA7D", "58B3",
+ "FA7E", "5944",
+ "FA7F", "5954",
+ "FA80", "5A62",
+ "FA81", "5B28",
+ "FA82", "5ED2",
+ "FA83", "5ED9",
+ "FA84", "5F69",
+ "FA85", "5FAD",
+ "FA86", "60D8",
+ "FA87", "614E",
+ "FA88", "6108",
+ "FA89", "618E",
+ "FA8A", "6160",
+ "FA8B", "61F2",
+ "FA8C", "6234",
+ "FA8D", "63C4",
+ "FA8E", "641C",
+ "FA8F", "6452",
+ "FA90", "6556",
+ "FA91", "6674",
+ "FA92", "6717",
+ "FA93", "671B",
+ "FA94", "6756",
+ "FA95", "6B79",
+ "FA96", "6BBA",
+ "FA97", "6D41",
+ "FA98", "6EDB",
+ "FA99", "6ECB",
+ "FA9A", "6F22",
+ "FA9B", "701E",
+ "FA9C", "716E",
+ "FA9D", "77A7",
+ "FA9E", "7235",
+ "FA9F", "72AF",
+ "FAA0", "732A",
+ "FAA1", "7471",
+ "FAA2", "7506",
+ "FAA3", "753B",
+ "FAA4", "761D",
+ "FAA5", "761F",
+ "FAA6", "76CA",
+ "FAA7", "76DB",
+ "FAA8", "76F4",
+ "FAA9", "774A",
+ "FAAA", "7740",
+ "FAAB", "78CC",
+ "FAAC", "7AB1",
+ "FAAD", "7BC0",
+ "FAAE", "7C7B",
+ "FAAF", "7D5B",
+ "FAB0", "7DF4",
+ "FAB1", "7F3E",
+ "FAB2", "8005",
+ "FAB3", "8352",
+ "FAB4", "83EF",
+ "FAB5", "8779",
+ "FAB6", "8941",
+ "FAB7", "8986",
+ "FAB8", "8996",
+ "FAB9", "8ABF",
+ "FABA", "8AF8",
+ "FABB", "8ACB",
+ "FABC", "8B01",
+ "FABD", "8AFE",
+ "FABE", "8AED",
+ "FABF", "8B39",
+ "FAC0", "8B8A",
+ "FAC1", "8D08",
+ "FAC2", "8F38",
+ "FAC3", "9072",
+ "FAC4", "9199",
+ "FAC5", "9276",
+ "FAC6", "967C",
+ "FAC7", "96E3",
+ "FAC8", "9756",
+ "FAC9", "97DB",
+ "FACA", "97FF",
+ "FACB", "980B",
+ "FACC", "983B",
+ "FACD", "9B12",
+ "FACE", "9F9C",
+ "FACF", "2284A",
+ "FAD0", "22844",
+ "FAD1", "233D5",
+ "FAD2", "3B9D",
+ "FAD3", "4018",
+ "FAD4", "4039",
+ "FAD5", "25249",
+ "FAD6", "25CD0",
+ "FAD7", "27ED3",
+ "FAD8", "9F43",
+ "FAD9", "9F8E",
+ "FB1D", "05D9_05B4",
+ "FB1F", "05F2_05B7",
+ "FB2A", "05E9_05C1",
+ "FB2B", "05E9_05C2",
+ "FB2C", "05E9_05BC_05C1",
+ "FB2D", "05E9_05BC_05C2",
+ "FB2E", "05D0_05B7",
+ "FB2F", "05D0_05B8",
+ "FB30", "05D0_05BC",
+ "FB31", "05D1_05BC",
+ "FB32", "05D2_05BC",
+ "FB33", "05D3_05BC",
+ "FB34", "05D4_05BC",
+ "FB35", "05D5_05BC",
+ "FB36", "05D6_05BC",
+ "FB38", "05D8_05BC",
+ "FB39", "05D9_05BC",
+ "FB3A", "05DA_05BC",
+ "FB3B", "05DB_05BC",
+ "FB3C", "05DC_05BC",
+ "FB3E", "05DE_05BC",
+ "FB40", "05E0_05BC",
+ "FB41", "05E1_05BC",
+ "FB43", "05E3_05BC",
+ "FB44", "05E4_05BC",
+ "FB46", "05E6_05BC",
+ "FB47", "05E7_05BC",
+ "FB48", "05E8_05BC",
+ "FB49", "05E9_05BC",
+ "FB4A", "05EA_05BC",
+ "FB4B", "05D5_05B9",
+ "FB4C", "05D1_05BF",
+ "FB4D", "05DB_05BF",
+ "FB4E", "05E4_05BF",
+ "1109A", "11099_110BA",
+ "1109C", "1109B_110BA",
+ "110AB", "110A5_110BA",
+ "1112E", "11131_11127",
+ "1112F", "11132_11127",
+ "1134B", "11347_1133E",
+ "1134C", "11347_11357",
+ "114BB", "114B9_114BA",
+ "114BC", "114B9_114B0",
+ "114BE", "114B9_114BD",
+ "115BA", "115B8_115AF",
+ "115BB", "115B9_115AF",
+ "11938", "11935_11930",
+ "1D15E", "1D157_1D165",
+ "1D15F", "1D158_1D165",
+ "1D160", "1D158_1D165_1D16E",
+ "1D161", "1D158_1D165_1D16F",
+ "1D162", "1D158_1D165_1D170",
+ "1D163", "1D158_1D165_1D171",
+ "1D164", "1D158_1D165_1D172",
+ "1D1BB", "1D1B9_1D165",
+ "1D1BC", "1D1BA_1D165",
+ "1D1BD", "1D1B9_1D165_1D16E",
+ "1D1BE", "1D1BA_1D165_1D16E",
+ "1D1BF", "1D1B9_1D165_1D16F",
+ "1D1C0", "1D1BA_1D165_1D16F",
+ "2F800", "4E3D",
+ "2F801", "4E38",
+ "2F802", "4E41",
+ "2F803", "20122",
+ "2F804", "4F60",
+ "2F805", "4FAE",
+ "2F806", "4FBB",
+ "2F807", "5002",
+ "2F808", "507A",
+ "2F809", "5099",
+ "2F80A", "50E7",
+ "2F80B", "50CF",
+ "2F80C", "349E",
+ "2F80D", "2063A",
+ "2F80E", "514D",
+ "2F80F", "5154",
+ "2F810", "5164",
+ "2F811", "5177",
+ "2F812", "2051C",
+ "2F813", "34B9",
+ "2F814", "5167",
+ "2F815", "518D",
+ "2F816", "2054B",
+ "2F817", "5197",
+ "2F818", "51A4",
+ "2F819", "4ECC",
+ "2F81A", "51AC",
+ "2F81B", "51B5",
+ "2F81C", "291DF",
+ "2F81D", "51F5",
+ "2F81E", "5203",
+ "2F81F", "34DF",
+ "2F820", "523B",
+ "2F821", "5246",
+ "2F822", "5272",
+ "2F823", "5277",
+ "2F824", "3515",
+ "2F825", "52C7",
+ "2F826", "52C9",
+ "2F827", "52E4",
+ "2F828", "52FA",
+ "2F829", "5305",
+ "2F82A", "5306",
+ "2F82B", "5317",
+ "2F82C", "5349",
+ "2F82D", "5351",
+ "2F82E", "535A",
+ "2F82F", "5373",
+ "2F830", "537D",
+ "2F831", "537F",
+ "2F832", "537F",
+ "2F833", "537F",
+ "2F834", "20A2C",
+ "2F835", "7070",
+ "2F836", "53CA",
+ "2F837", "53DF",
+ "2F838", "20B63",
+ "2F839", "53EB",
+ "2F83A", "53F1",
+ "2F83B", "5406",
+ "2F83C", "549E",
+ "2F83D", "5438",
+ "2F83E", "5448",
+ "2F83F", "5468",
+ "2F840", "54A2",
+ "2F841", "54F6",
+ "2F842", "5510",
+ "2F843", "5553",
+ "2F844", "5563",
+ "2F845", "5584",
+ "2F846", "5584",
+ "2F847", "5599",
+ "2F848", "55AB",
+ "2F849", "55B3",
+ "2F84A", "55C2",
+ "2F84B", "5716",
+ "2F84C", "5606",
+ "2F84D", "5717",
+ "2F84E", "5651",
+ "2F84F", "5674",
+ "2F850", "5207",
+ "2F851", "58EE",
+ "2F852", "57CE",
+ "2F853", "57F4",
+ "2F854", "580D",
+ "2F855", "578B",
+ "2F856", "5832",
+ "2F857", "5831",
+ "2F858", "58AC",
+ "2F859", "214E4",
+ "2F85A", "58F2",
+ "2F85B", "58F7",
+ "2F85C", "5906",
+ "2F85D", "591A",
+ "2F85E", "5922",
+ "2F85F", "5962",
+ "2F860", "216A8",
+ "2F861", "216EA",
+ "2F862", "59EC",
+ "2F863", "5A1B",
+ "2F864", "5A27",
+ "2F865", "59D8",
+ "2F866", "5A66",
+ "2F867", "36EE",
+ "2F868", "36FC",
+ "2F869", "5B08",
+ "2F86A", "5B3E",
+ "2F86B", "5B3E",
+ "2F86C", "219C8",
+ "2F86D", "5BC3",
+ "2F86E", "5BD8",
+ "2F86F", "5BE7",
+ "2F870", "5BF3",
+ "2F871", "21B18",
+ "2F872", "5BFF",
+ "2F873", "5C06",
+ "2F874", "5F53",
+ "2F875", "5C22",
+ "2F876", "3781",
+ "2F877", "5C60",
+ "2F878", "5C6E",
+ "2F879", "5CC0",
+ "2F87A", "5C8D",
+ "2F87B", "21DE4",
+ "2F87C", "5D43",
+ "2F87D", "21DE6",
+ "2F87E", "5D6E",
+ "2F87F", "5D6B",
+ "2F880", "5D7C",
+ "2F881", "5DE1",
+ "2F882", "5DE2",
+ "2F883", "382F",
+ "2F884", "5DFD",
+ "2F885", "5E28",
+ "2F886", "5E3D",
+ "2F887", "5E69",
+ "2F888", "3862",
+ "2F889", "22183",
+ "2F88A", "387C",
+ "2F88B", "5EB0",
+ "2F88C", "5EB3",
+ "2F88D", "5EB6",
+ "2F88E", "5ECA",
+ "2F88F", "2A392",
+ "2F890", "5EFE",
+ "2F891", "22331",
+ "2F892", "22331",
+ "2F893", "8201",
+ "2F894", "5F22",
+ "2F895", "5F22",
+ "2F896", "38C7",
+ "2F897", "232B8",
+ "2F898", "261DA",
+ "2F899", "5F62",
+ "2F89A", "5F6B",
+ "2F89B", "38E3",
+ "2F89C", "5F9A",
+ "2F89D", "5FCD",
+ "2F89E", "5FD7",
+ "2F89F", "5FF9",
+ "2F8A0", "6081",
+ "2F8A1", "393A",
+ "2F8A2", "391C",
+ "2F8A3", "6094",
+ "2F8A4", "226D4",
+ "2F8A5", "60C7",
+ "2F8A6", "6148",
+ "2F8A7", "614C",
+ "2F8A8", "614E",
+ "2F8A9", "614C",
+ "2F8AA", "617A",
+ "2F8AB", "618E",
+ "2F8AC", "61B2",
+ "2F8AD", "61A4",
+ "2F8AE", "61AF",
+ "2F8AF", "61DE",
+ "2F8B0", "61F2",
+ "2F8B1", "61F6",
+ "2F8B2", "6210",
+ "2F8B3", "621B",
+ "2F8B4", "625D",
+ "2F8B5", "62B1",
+ "2F8B6", "62D4",
+ "2F8B7", "6350",
+ "2F8B8", "22B0C",
+ "2F8B9", "633D",
+ "2F8BA", "62FC",
+ "2F8BB", "6368",
+ "2F8BC", "6383",
+ "2F8BD", "63E4",
+ "2F8BE", "22BF1",
+ "2F8BF", "6422",
+ "2F8C0", "63C5",
+ "2F8C1", "63A9",
+ "2F8C2", "3A2E",
+ "2F8C3", "6469",
+ "2F8C4", "647E",
+ "2F8C5", "649D",
+ "2F8C6", "6477",
+ "2F8C7", "3A6C",
+ "2F8C8", "654F",
+ "2F8C9", "656C",
+ "2F8CA", "2300A",
+ "2F8CB", "65E3",
+ "2F8CC", "66F8",
+ "2F8CD", "6649",
+ "2F8CE", "3B19",
+ "2F8CF", "6691",
+ "2F8D0", "3B08",
+ "2F8D1", "3AE4",
+ "2F8D2", "5192",
+ "2F8D3", "5195",
+ "2F8D4", "6700",
+ "2F8D5", "669C",
+ "2F8D6", "80AD",
+ "2F8D7", "43D9",
+ "2F8D8", "6717",
+ "2F8D9", "671B",
+ "2F8DA", "6721",
+ "2F8DB", "675E",
+ "2F8DC", "6753",
+ "2F8DD", "233C3",
+ "2F8DE", "3B49",
+ "2F8DF", "67FA",
+ "2F8E0", "6785",
+ "2F8E1", "6852",
+ "2F8E2", "6885",
+ "2F8E3", "2346D",
+ "2F8E4", "688E",
+ "2F8E5", "681F",
+ "2F8E6", "6914",
+ "2F8E7", "3B9D",
+ "2F8E8", "6942",
+ "2F8E9", "69A3",
+ "2F8EA", "69EA",
+ "2F8EB", "6AA8",
+ "2F8EC", "236A3",
+ "2F8ED", "6ADB",
+ "2F8EE", "3C18",
+ "2F8EF", "6B21",
+ "2F8F0", "238A7",
+ "2F8F1", "6B54",
+ "2F8F2", "3C4E",
+ "2F8F3", "6B72",
+ "2F8F4", "6B9F",
+ "2F8F5", "6BBA",
+ "2F8F6", "6BBB",
+ "2F8F7", "23A8D",
+ "2F8F8", "21D0B",
+ "2F8F9", "23AFA",
+ "2F8FA", "6C4E",
+ "2F8FB", "23CBC",
+ "2F8FC", "6CBF",
+ "2F8FD", "6CCD",
+ "2F8FE", "6C67",
+ "2F8FF", "6D16",
+ "2F900", "6D3E",
+ "2F901", "6D77",
+ "2F902", "6D41",
+ "2F903", "6D69",
+ "2F904", "6D78",
+ "2F905", "6D85",
+ "2F906", "23D1E",
+ "2F907", "6D34",
+ "2F908", "6E2F",
+ "2F909", "6E6E",
+ "2F90A", "3D33",
+ "2F90B", "6ECB",
+ "2F90C", "6EC7",
+ "2F90D", "23ED1",
+ "2F90E", "6DF9",
+ "2F90F", "6F6E",
+ "2F910", "23F5E",
+ "2F911", "23F8E",
+ "2F912", "6FC6",
+ "2F913", "7039",
+ "2F914", "701E",
+ "2F915", "701B",
+ "2F916", "3D96",
+ "2F917", "704A",
+ "2F918", "707D",
+ "2F919", "7077",
+ "2F91A", "70AD",
+ "2F91B", "20525",
+ "2F91C", "7145",
+ "2F91D", "24263",
+ "2F91E", "719C",
+ "2F91F", "243AB",
+ "2F920", "7228",
+ "2F921", "7235",
+ "2F922", "7250",
+ "2F923", "24608",
+ "2F924", "7280",
+ "2F925", "7295",
+ "2F926", "24735",
+ "2F927", "24814",
+ "2F928", "737A",
+ "2F929", "738B",
+ "2F92A", "3EAC",
+ "2F92B", "73A5",
+ "2F92C", "3EB8",
+ "2F92D", "3EB8",
+ "2F92E", "7447",
+ "2F92F", "745C",
+ "2F930", "7471",
+ "2F931", "7485",
+ "2F932", "74CA",
+ "2F933", "3F1B",
+ "2F934", "7524",
+ "2F935", "24C36",
+ "2F936", "753E",
+ "2F937", "24C92",
+ "2F938", "7570",
+ "2F939", "2219F",
+ "2F93A", "7610",
+ "2F93B", "24FA1",
+ "2F93C", "24FB8",
+ "2F93D", "25044",
+ "2F93E", "3FFC",
+ "2F93F", "4008",
+ "2F940", "76F4",
+ "2F941", "250F3",
+ "2F942", "250F2",
+ "2F943", "25119",
+ "2F944", "25133",
+ "2F945", "771E",
+ "2F946", "771F",
+ "2F947", "771F",
+ "2F948", "774A",
+ "2F949", "4039",
+ "2F94A", "778B",
+ "2F94B", "4046",
+ "2F94C", "4096",
+ "2F94D", "2541D",
+ "2F94E", "784E",
+ "2F94F", "788C",
+ "2F950", "78CC",
+ "2F951", "40E3",
+ "2F952", "25626",
+ "2F953", "7956",
+ "2F954", "2569A",
+ "2F955", "256C5",
+ "2F956", "798F",
+ "2F957", "79EB",
+ "2F958", "412F",
+ "2F959", "7A40",
+ "2F95A", "7A4A",
+ "2F95B", "7A4F",
+ "2F95C", "2597C",
+ "2F95D", "25AA7",
+ "2F95E", "25AA7",
+ "2F95F", "7AEE",
+ "2F960", "4202",
+ "2F961", "25BAB",
+ "2F962", "7BC6",
+ "2F963", "7BC9",
+ "2F964", "4227",
+ "2F965", "25C80",
+ "2F966", "7CD2",
+ "2F967", "42A0",
+ "2F968", "7CE8",
+ "2F969", "7CE3",
+ "2F96A", "7D00",
+ "2F96B", "25F86",
+ "2F96C", "7D63",
+ "2F96D", "4301",
+ "2F96E", "7DC7",
+ "2F96F", "7E02",
+ "2F970", "7E45",
+ "2F971", "4334",
+ "2F972", "26228",
+ "2F973", "26247",
+ "2F974", "4359",
+ "2F975", "262D9",
+ "2F976", "7F7A",
+ "2F977", "2633E",
+ "2F978", "7F95",
+ "2F979", "7FFA",
+ "2F97A", "8005",
+ "2F97B", "264DA",
+ "2F97C", "26523",
+ "2F97D", "8060",
+ "2F97E", "265A8",
+ "2F97F", "8070",
+ "2F980", "2335F",
+ "2F981", "43D5",
+ "2F982", "80B2",
+ "2F983", "8103",
+ "2F984", "440B",
+ "2F985", "813E",
+ "2F986", "5AB5",
+ "2F987", "267A7",
+ "2F988", "267B5",
+ "2F989", "23393",
+ "2F98A", "2339C",
+ "2F98B", "8201",
+ "2F98C", "8204",
+ "2F98D", "8F9E",
+ "2F98E", "446B",
+ "2F98F", "8291",
+ "2F990", "828B",
+ "2F991", "829D",
+ "2F992", "52B3",
+ "2F993", "82B1",
+ "2F994", "82B3",
+ "2F995", "82BD",
+ "2F996", "82E6",
+ "2F997", "26B3C",
+ "2F998", "82E5",
+ "2F999", "831D",
+ "2F99A", "8363",
+ "2F99B", "83AD",
+ "2F99C", "8323",
+ "2F99D", "83BD",
+ "2F99E", "83E7",
+ "2F99F", "8457",
+ "2F9A0", "8353",
+ "2F9A1", "83CA",
+ "2F9A2", "83CC",
+ "2F9A3", "83DC",
+ "2F9A4", "26C36",
+ "2F9A5", "26D6B",
+ "2F9A6", "26CD5",
+ "2F9A7", "452B",
+ "2F9A8", "84F1",
+ "2F9A9", "84F3",
+ "2F9AA", "8516",
+ "2F9AB", "273CA",
+ "2F9AC", "8564",
+ "2F9AD", "26F2C",
+ "2F9AE", "455D",
+ "2F9AF", "4561",
+ "2F9B0", "26FB1",
+ "2F9B1", "270D2",
+ "2F9B2", "456B",
+ "2F9B3", "8650",
+ "2F9B4", "865C",
+ "2F9B5", "8667",
+ "2F9B6", "8669",
+ "2F9B7", "86A9",
+ "2F9B8", "8688",
+ "2F9B9", "870E",
+ "2F9BA", "86E2",
+ "2F9BB", "8779",
+ "2F9BC", "8728",
+ "2F9BD", "876B",
+ "2F9BE", "8786",
+ "2F9BF", "45D7",
+ "2F9C0", "87E1",
+ "2F9C1", "8801",
+ "2F9C2", "45F9",
+ "2F9C3", "8860",
+ "2F9C4", "8863",
+ "2F9C5", "27667",
+ "2F9C6", "88D7",
+ "2F9C7", "88DE",
+ "2F9C8", "4635",
+ "2F9C9", "88FA",
+ "2F9CA", "34BB",
+ "2F9CB", "278AE",
+ "2F9CC", "27966",
+ "2F9CD", "46BE",
+ "2F9CE", "46C7",
+ "2F9CF", "8AA0",
+ "2F9D0", "8AED",
+ "2F9D1", "8B8A",
+ "2F9D2", "8C55",
+ "2F9D3", "27CA8",
+ "2F9D4", "8CAB",
+ "2F9D5", "8CC1",
+ "2F9D6", "8D1B",
+ "2F9D7", "8D77",
+ "2F9D8", "27F2F",
+ "2F9D9", "20804",
+ "2F9DA", "8DCB",
+ "2F9DB", "8DBC",
+ "2F9DC", "8DF0",
+ "2F9DD", "208DE",
+ "2F9DE", "8ED4",
+ "2F9DF", "8F38",
+ "2F9E0", "285D2",
+ "2F9E1", "285ED",
+ "2F9E2", "9094",
+ "2F9E3", "90F1",
+ "2F9E4", "9111",
+ "2F9E5", "2872E",
+ "2F9E6", "911B",
+ "2F9E7", "9238",
+ "2F9E8", "92D7",
+ "2F9E9", "92D8",
+ "2F9EA", "927C",
+ "2F9EB", "93F9",
+ "2F9EC", "9415",
+ "2F9ED", "28BFA",
+ "2F9EE", "958B",
+ "2F9EF", "4995",
+ "2F9F0", "95B7",
+ "2F9F1", "28D77",
+ "2F9F2", "49E6",
+ "2F9F3", "96C3",
+ "2F9F4", "5DB2",
+ "2F9F5", "9723",
+ "2F9F6", "29145",
+ "2F9F7", "2921A",
+ "2F9F8", "4A6E",
+ "2F9F9", "4A76",
+ "2F9FA", "97E0",
+ "2F9FB", "2940A",
+ "2F9FC", "4AB2",
+ "2F9FD", "29496",
+ "2F9FE", "980B",
+ "2F9FF", "980B",
+ "2FA00", "9829",
+ "2FA01", "295B6",
+ "2FA02", "98E2",
+ "2FA03", "4B33",
+ "2FA04", "9929",
+ "2FA05", "99A7",
+ "2FA06", "99C2",
+ "2FA07", "99FE",
+ "2FA08", "4BCE",
+ "2FA09", "29B30",
+ "2FA0A", "9B12",
+ "2FA0B", "9C40",
+ "2FA0C", "9CFD",
+ "2FA0D", "4CCE",
+ "2FA0E", "4CED",
+ "2FA0F", "9D67",
+ "2FA10", "2A0CE",
+ "2FA11", "4CF8",
+ "2FA12", "2A105",
+ "2FA13", "2A20E",
+ "2FA14", "2A291",
+ "2FA15", "9EBB",
+ "2FA16", "4D56",
+ "2FA17", "9EF9",
+ "2FA18", "9EFE",
+ "2FA19", "9F05",
+ "2FA1A", "9F0F",
+ "2FA1B", "9F16",
+ "2FA1C", "9F3B",
+ "2FA1D", "2A600",
+);
+
+# This table was algorithmically derived from the Adobe Glyph List (AGL)
+# file 'glyphlist.txt' from the GitHub Adobe Type Tools agl-aglfn
+# project, on 2022-10-09.
+#
+# See "groff:" comments for altered mappings.
+my %AGL_to_unicode = (
+ "A", "0041",
+ "AE", "00C6",
+ "AEacute", "01FC",
+ "AEmacron", "01E2",
+ "Aacute", "00C1",
+ "Abreve", "0102",
+ "Abreveacute", "1EAE",
+ "Abrevecyrillic", "04D0",
+ "Abrevedotbelow", "1EB6",
+ "Abrevegrave", "1EB0",
+ "Abrevehookabove", "1EB2",
+ "Abrevetilde", "1EB4",
+ "Acaron", "01CD",
+ "Acircle", "24B6",
+ "Acircumflex", "00C2",
+ "Acircumflexacute", "1EA4",
+ "Acircumflexdotbelow", "1EAC",
+ "Acircumflexgrave", "1EA6",
+ "Acircumflexhookabove", "1EA8",
+ "Acircumflextilde", "1EAA",
+ "Acyrillic", "0410",
+ "Adblgrave", "0200",
+ "Adieresis", "00C4",
+ "Adieresiscyrillic", "04D2",
+ "Adieresismacron", "01DE",
+ "Adotbelow", "1EA0",
+ "Adotmacron", "01E0",
+ "Agrave", "00C0",
+ "Ahookabove", "1EA2",
+ "Aiecyrillic", "04D4",
+ "Ainvertedbreve", "0202",
+ "Alpha", "0391",
+ "Alphatonos", "0386",
+ "Amacron", "0100",
+ "Amonospace", "FF21",
+ "Aogonek", "0104",
+ "Aring", "00C5",
+ "Aringacute", "01FA",
+ "Aringbelow", "1E00",
+ "Atilde", "00C3",
+ "Aybarmenian", "0531",
+ "B", "0042",
+ "Bcircle", "24B7",
+ "Bdotaccent", "1E02",
+ "Bdotbelow", "1E04",
+ "Becyrillic", "0411",
+ "Benarmenian", "0532",
+ "Beta", "0392",
+ "Bhook", "0181",
+ "Blinebelow", "1E06",
+ "Bmonospace", "FF22",
+ "Btopbar", "0182",
+ "C", "0043",
+ "Caarmenian", "053E",
+ "Cacute", "0106",
+ "Ccaron", "010C",
+ "Ccedilla", "00C7",
+ "Ccedillaacute", "1E08",
+ "Ccircle", "24B8",
+ "Ccircumflex", "0108",
+ "Cdot", "010A",
+ "Cdotaccent", "010A",
+ "Chaarmenian", "0549",
+ "Cheabkhasiancyrillic", "04BC",
+ "Checyrillic", "0427",
+ "Chedescenderabkhasiancyrillic", "04BE",
+ "Chedescendercyrillic", "04B6",
+ "Chedieresiscyrillic", "04F4",
+ "Cheharmenian", "0543",
+ "Chekhakassiancyrillic", "04CB",
+ "Cheverticalstrokecyrillic", "04B8",
+ "Chi", "03A7",
+ "Chook", "0187",
+ "Cmonospace", "FF23",
+ "Coarmenian", "0551",
+ "D", "0044",
+ "DZ", "01F1",
+ "DZcaron", "01C4",
+ "Daarmenian", "0534",
+ "Dafrican", "0189",
+ "Dcaron", "010E",
+ "Dcedilla", "1E10",
+ "Dcircle", "24B9",
+ "Dcircumflexbelow", "1E12",
+ "Dcroat", "0110",
+ "Ddotaccent", "1E0A",
+ "Ddotbelow", "1E0C",
+ "Decyrillic", "0414",
+ "Deicoptic", "03EE",
+ "Delta", "0394", # groff: not U+2206
+ "Deltagreek", "0394",
+ "Dhook", "018A",
+ "Digammagreek", "03DC",
+ "Djecyrillic", "0402",
+ "Dlinebelow", "1E0E",
+ "Dmonospace", "FF24",
+ "Dslash", "0110",
+ "Dtopbar", "018B",
+ "Dz", "01F2",
+ "Dzcaron", "01C5",
+ "Dzeabkhasiancyrillic", "04E0",
+ "Dzecyrillic", "0405",
+ "Dzhecyrillic", "040F",
+ "E", "0045",
+ "Eacute", "00C9",
+ "Ebreve", "0114",
+ "Ecaron", "011A",
+ "Ecedillabreve", "1E1C",
+ "Echarmenian", "0535",
+ "Ecircle", "24BA",
+ "Ecircumflex", "00CA",
+ "Ecircumflexacute", "1EBE",
+ "Ecircumflexbelow", "1E18",
+ "Ecircumflexdotbelow", "1EC6",
+ "Ecircumflexgrave", "1EC0",
+ "Ecircumflexhookabove", "1EC2",
+ "Ecircumflextilde", "1EC4",
+ "Ecyrillic", "0404",
+ "Edblgrave", "0204",
+ "Edieresis", "00CB",
+ "Edot", "0116",
+ "Edotaccent", "0116",
+ "Edotbelow", "1EB8",
+ "Efcyrillic", "0424",
+ "Egrave", "00C8",
+ "Eharmenian", "0537",
+ "Ehookabove", "1EBA",
+ "Eightroman", "2167",
+ "Einvertedbreve", "0206",
+ "Eiotifiedcyrillic", "0464",
+ "Elcyrillic", "041B",
+ "Elevenroman", "216A",
+ "Emacron", "0112",
+ "Emacronacute", "1E16",
+ "Emacrongrave", "1E14",
+ "Emcyrillic", "041C",
+ "Emonospace", "FF25",
+ "Encyrillic", "041D",
+ "Endescendercyrillic", "04A2",
+ "Eng", "014A",
+ "Enghecyrillic", "04A4",
+ "Enhookcyrillic", "04C7",
+ "Eogonek", "0118",
+ "Eopen", "0190",
+ "Epsilon", "0395",
+ "Epsilontonos", "0388",
+ "Ercyrillic", "0420",
+ "Ereversed", "018E",
+ "Ereversedcyrillic", "042D",
+ "Escyrillic", "0421",
+ "Esdescendercyrillic", "04AA",
+ "Esh", "01A9",
+ "Eta", "0397",
+ "Etarmenian", "0538",
+ "Etatonos", "0389",
+ "Eth", "00D0",
+ "Etilde", "1EBC",
+ "Etildebelow", "1E1A",
+ "Euro", "20AC",
+ "Ezh", "01B7",
+ "Ezhcaron", "01EE",
+ "Ezhreversed", "01B8",
+ "F", "0046",
+ "Fcircle", "24BB",
+ "Fdotaccent", "1E1E",
+ "Feharmenian", "0556",
+ "Feicoptic", "03E4",
+ "Fhook", "0191",
+ "Fitacyrillic", "0472",
+ "Fiveroman", "2164",
+ "Fmonospace", "FF26",
+ "Fourroman", "2163",
+ "G", "0047",
+ "GBsquare", "3387",
+ "Gacute", "01F4",
+ "Gamma", "0393",
+ "Gammaafrican", "0194",
+ "Gangiacoptic", "03EA",
+ "Gbreve", "011E",
+ "Gcaron", "01E6",
+ "Gcedilla", "0122",
+ "Gcircle", "24BC",
+ "Gcircumflex", "011C",
+ "Gcommaaccent", "0122",
+ "Gdot", "0120",
+ "Gdotaccent", "0120",
+ "Gecyrillic", "0413",
+ "Ghadarmenian", "0542",
+ "Ghemiddlehookcyrillic", "0494",
+ "Ghestrokecyrillic", "0492",
+ "Gheupturncyrillic", "0490",
+ "Ghook", "0193",
+ "Gimarmenian", "0533",
+ "Gjecyrillic", "0403",
+ "Gmacron", "1E20",
+ "Gmonospace", "FF27",
+ "Gsmallhook", "029B",
+ "Gstroke", "01E4",
+ "H", "0048",
+ "H18533", "25CF",
+ "H18543", "25AA",
+ "H18551", "25AB",
+ "H22073", "25A1",
+ "HPsquare", "33CB",
+ "Haabkhasiancyrillic", "04A8",
+ "Hadescendercyrillic", "04B2",
+ "Hardsigncyrillic", "042A",
+ "Hbar", "0126",
+ "Hbrevebelow", "1E2A",
+ "Hcedilla", "1E28",
+ "Hcircle", "24BD",
+ "Hcircumflex", "0124",
+ "Hdieresis", "1E26",
+ "Hdotaccent", "1E22",
+ "Hdotbelow", "1E24",
+ "Hmonospace", "FF28",
+ "Hoarmenian", "0540",
+ "Horicoptic", "03E8",
+ "Hzsquare", "3390",
+ "I", "0049",
+ "IAcyrillic", "042F",
+ "IJ", "0132",
+ "IUcyrillic", "042E",
+ "Iacute", "00CD",
+ "Ibreve", "012C",
+ "Icaron", "01CF",
+ "Icircle", "24BE",
+ "Icircumflex", "00CE",
+ "Icyrillic", "0406",
+ "Idblgrave", "0208",
+ "Idieresis", "00CF",
+ "Idieresisacute", "1E2E",
+ "Idieresiscyrillic", "04E4",
+ "Idot", "0130",
+ "Idotaccent", "0130",
+ "Idotbelow", "1ECA",
+ "Iebrevecyrillic", "04D6",
+ "Iecyrillic", "0415",
+ "Ifraktur", "2111",
+ "Igrave", "00CC",
+ "Ihookabove", "1EC8",
+ "Iicyrillic", "0418",
+ "Iinvertedbreve", "020A",
+ "Iishortcyrillic", "0419",
+ "Imacron", "012A",
+ "Imacroncyrillic", "04E2",
+ "Imonospace", "FF29",
+ "Iniarmenian", "053B",
+ "Iocyrillic", "0401",
+ "Iogonek", "012E",
+ "Iota", "0399",
+ "Iotaafrican", "0196",
+ "Iotadieresis", "03AA",
+ "Iotatonos", "038A",
+ "Istroke", "0197",
+ "Itilde", "0128",
+ "Itildebelow", "1E2C",
+ "Izhitsacyrillic", "0474",
+ "Izhitsadblgravecyrillic", "0476",
+ "J", "004A",
+ "Jaarmenian", "0541",
+ "Jcircle", "24BF",
+ "Jcircumflex", "0134",
+ "Jecyrillic", "0408",
+ "Jheharmenian", "054B",
+ "Jmonospace", "FF2A",
+ "K", "004B",
+ "KBsquare", "3385",
+ "KKsquare", "33CD",
+ "Kabashkircyrillic", "04A0",
+ "Kacute", "1E30",
+ "Kacyrillic", "041A",
+ "Kadescendercyrillic", "049A",
+ "Kahookcyrillic", "04C3",
+ "Kappa", "039A",
+ "Kastrokecyrillic", "049E",
+ "Kaverticalstrokecyrillic", "049C",
+ "Kcaron", "01E8",
+ "Kcedilla", "0136",
+ "Kcircle", "24C0",
+ "Kcommaaccent", "0136",
+ "Kdotbelow", "1E32",
+ "Keharmenian", "0554",
+ "Kenarmenian", "053F",
+ "Khacyrillic", "0425",
+ "Kheicoptic", "03E6",
+ "Khook", "0198",
+ "Kjecyrillic", "040C",
+ "Klinebelow", "1E34",
+ "Kmonospace", "FF2B",
+ "Koppacyrillic", "0480",
+ "Koppagreek", "03DE",
+ "Ksicyrillic", "046E",
+ "L", "004C",
+ "LJ", "01C7",
+ "Lacute", "0139",
+ "Lambda", "039B",
+ "Lcaron", "013D",
+ "Lcedilla", "013B",
+ "Lcircle", "24C1",
+ "Lcircumflexbelow", "1E3C",
+ "Lcommaaccent", "013B",
+ "Ldot", "013F",
+ "Ldotaccent", "013F",
+ "Ldotbelow", "1E36",
+ "Ldotbelowmacron", "1E38",
+ "Liwnarmenian", "053C",
+ "Lj", "01C8",
+ "Ljecyrillic", "0409",
+ "Llinebelow", "1E3A",
+ "Lmonospace", "FF2C",
+ "Lslash", "0141",
+ "M", "004D",
+ "MBsquare", "3386",
+ "Macute", "1E3E",
+ "Mcircle", "24C2",
+ "Mdotaccent", "1E40",
+ "Mdotbelow", "1E42",
+ "Menarmenian", "0544",
+ "Mmonospace", "FF2D",
+ "Mturned", "019C",
+ "Mu", "039C",
+ "N", "004E",
+ "NJ", "01CA",
+ "Nacute", "0143",
+ "Ncaron", "0147",
+ "Ncedilla", "0145",
+ "Ncircle", "24C3",
+ "Ncircumflexbelow", "1E4A",
+ "Ncommaaccent", "0145",
+ "Ndotaccent", "1E44",
+ "Ndotbelow", "1E46",
+ "Nhookleft", "019D",
+ "Nineroman", "2168",
+ "Nj", "01CB",
+ "Njecyrillic", "040A",
+ "Nlinebelow", "1E48",
+ "Nmonospace", "FF2E",
+ "Nowarmenian", "0546",
+ "Ntilde", "00D1",
+ "Nu", "039D",
+ "O", "004F",
+ "OE", "0152",
+ "Oacute", "00D3",
+ "Obarredcyrillic", "04E8",
+ "Obarreddieresiscyrillic", "04EA",
+ "Obreve", "014E",
+ "Ocaron", "01D1",
+ "Ocenteredtilde", "019F",
+ "Ocircle", "24C4",
+ "Ocircumflex", "00D4",
+ "Ocircumflexacute", "1ED0",
+ "Ocircumflexdotbelow", "1ED8",
+ "Ocircumflexgrave", "1ED2",
+ "Ocircumflexhookabove", "1ED4",
+ "Ocircumflextilde", "1ED6",
+ "Ocyrillic", "041E",
+ "Odblacute", "0150",
+ "Odblgrave", "020C",
+ "Odieresis", "00D6",
+ "Odieresiscyrillic", "04E6",
+ "Odotbelow", "1ECC",
+ "Ograve", "00D2",
+ "Oharmenian", "0555",
+ "Ohm", "2126",
+ "Ohookabove", "1ECE",
+ "Ohorn", "01A0",
+ "Ohornacute", "1EDA",
+ "Ohorndotbelow", "1EE2",
+ "Ohorngrave", "1EDC",
+ "Ohornhookabove", "1EDE",
+ "Ohorntilde", "1EE0",
+ "Ohungarumlaut", "0150",
+ "Oi", "01A2",
+ "Oinvertedbreve", "020E",
+ "Omacron", "014C",
+ "Omacronacute", "1E52",
+ "Omacrongrave", "1E50",
+ "Omega", "03A9", # groff: not U+2126
+ "Omegacyrillic", "0460",
+ "Omegagreek", "03A9",
+ "Omegaroundcyrillic", "047A",
+ "Omegatitlocyrillic", "047C",
+ "Omegatonos", "038F",
+ "Omicron", "039F",
+ "Omicrontonos", "038C",
+ "Omonospace", "FF2F",
+ "Oneroman", "2160",
+ "Oogonek", "01EA",
+ "Oogonekmacron", "01EC",
+ "Oopen", "0186",
+ "Oslash", "00D8",
+ "Oslashacute", "01FE",
+ "Ostrokeacute", "01FE",
+ "Otcyrillic", "047E",
+ "Otilde", "00D5",
+ "Otildeacute", "1E4C",
+ "Otildedieresis", "1E4E",
+ "P", "0050",
+ "Pacute", "1E54",
+ "Pcircle", "24C5",
+ "Pdotaccent", "1E56",
+ "Pecyrillic", "041F",
+ "Peharmenian", "054A",
+ "Pemiddlehookcyrillic", "04A6",
+ "Phi", "03A6",
+ "Phook", "01A4",
+ "Pi", "03A0",
+ "Piwrarmenian", "0553",
+ "Pmonospace", "FF30",
+ "Psi", "03A8",
+ "Psicyrillic", "0470",
+ "Q", "0051",
+ "Qcircle", "24C6",
+ "Qmonospace", "FF31",
+ "R", "0052",
+ "Raarmenian", "054C",
+ "Racute", "0154",
+ "Rcaron", "0158",
+ "Rcedilla", "0156",
+ "Rcircle", "24C7",
+ "Rcommaaccent", "0156",
+ "Rdblgrave", "0210",
+ "Rdotaccent", "1E58",
+ "Rdotbelow", "1E5A",
+ "Rdotbelowmacron", "1E5C",
+ "Reharmenian", "0550",
+ "Rfraktur", "211C",
+ "Rho", "03A1",
+ "Rinvertedbreve", "0212",
+ "Rlinebelow", "1E5E",
+ "Rmonospace", "FF32",
+ "Rsmallinverted", "0281",
+ "Rsmallinvertedsuperior", "02B6",
+ "S", "0053",
+ "SF010000", "250C",
+ "SF020000", "2514",
+ "SF030000", "2510",
+ "SF040000", "2518",
+ "SF050000", "253C",
+ "SF060000", "252C",
+ "SF070000", "2534",
+ "SF080000", "251C",
+ "SF090000", "2524",
+ "SF100000", "2500",
+ "SF110000", "2502",
+ "SF190000", "2561",
+ "SF200000", "2562",
+ "SF210000", "2556",
+ "SF220000", "2555",
+ "SF230000", "2563",
+ "SF240000", "2551",
+ "SF250000", "2557",
+ "SF260000", "255D",
+ "SF270000", "255C",
+ "SF280000", "255B",
+ "SF360000", "255E",
+ "SF370000", "255F",
+ "SF380000", "255A",
+ "SF390000", "2554",
+ "SF400000", "2569",
+ "SF410000", "2566",
+ "SF420000", "2560",
+ "SF430000", "2550",
+ "SF440000", "256C",
+ "SF450000", "2567",
+ "SF460000", "2568",
+ "SF470000", "2564",
+ "SF480000", "2565",
+ "SF490000", "2559",
+ "SF500000", "2558",
+ "SF510000", "2552",
+ "SF520000", "2553",
+ "SF530000", "256B",
+ "SF540000", "256A",
+ "Sacute", "015A",
+ "Sacutedotaccent", "1E64",
+ "Sampigreek", "03E0",
+ "Scaron", "0160",
+ "Scarondotaccent", "1E66",
+ "Scedilla", "015E",
+ "Schwa", "018F",
+ "Schwacyrillic", "04D8",
+ "Schwadieresiscyrillic", "04DA",
+ "Scircle", "24C8",
+ "Scircumflex", "015C",
+ "Scommaaccent", "0218",
+ "Sdotaccent", "1E60",
+ "Sdotbelow", "1E62",
+ "Sdotbelowdotaccent", "1E68",
+ "Seharmenian", "054D",
+ "Sevenroman", "2166",
+ "Shaarmenian", "0547",
+ "Shacyrillic", "0428",
+ "Shchacyrillic", "0429",
+ "Sheicoptic", "03E2",
+ "Shhacyrillic", "04BA",
+ "Shimacoptic", "03EC",
+ "Sigma", "03A3",
+ "Sixroman", "2165",
+ "Smonospace", "FF33",
+ "Softsigncyrillic", "042C",
+ "Stigmagreek", "03DA",
+ "T", "0054",
+ "Tau", "03A4",
+ "Tbar", "0166",
+ "Tcaron", "0164",
+ "Tcedilla", "0162",
+ "Tcircle", "24C9",
+ "Tcircumflexbelow", "1E70",
+ "Tcommaaccent", "0162",
+ "Tdotaccent", "1E6A",
+ "Tdotbelow", "1E6C",
+ "Tecyrillic", "0422",
+ "Tedescendercyrillic", "04AC",
+ "Tenroman", "2169",
+ "Tetsecyrillic", "04B4",
+ "Theta", "0398",
+ "Thook", "01AC",
+ "Thorn", "00DE",
+ "Threeroman", "2162",
+ "Tiwnarmenian", "054F",
+ "Tlinebelow", "1E6E",
+ "Tmonospace", "FF34",
+ "Toarmenian", "0539",
+ "Tonefive", "01BC",
+ "Tonesix", "0184",
+ "Tonetwo", "01A7",
+ "Tretroflexhook", "01AE",
+ "Tsecyrillic", "0426",
+ "Tshecyrillic", "040B",
+ "Twelveroman", "216B",
+ "Tworoman", "2161",
+ "U", "0055",
+ "Uacute", "00DA",
+ "Ubreve", "016C",
+ "Ucaron", "01D3",
+ "Ucircle", "24CA",
+ "Ucircumflex", "00DB",
+ "Ucircumflexbelow", "1E76",
+ "Ucyrillic", "0423",
+ "Udblacute", "0170",
+ "Udblgrave", "0214",
+ "Udieresis", "00DC",
+ "Udieresisacute", "01D7",
+ "Udieresisbelow", "1E72",
+ "Udieresiscaron", "01D9",
+ "Udieresiscyrillic", "04F0",
+ "Udieresisgrave", "01DB",
+ "Udieresismacron", "01D5",
+ "Udotbelow", "1EE4",
+ "Ugrave", "00D9",
+ "Uhookabove", "1EE6",
+ "Uhorn", "01AF",
+ "Uhornacute", "1EE8",
+ "Uhorndotbelow", "1EF0",
+ "Uhorngrave", "1EEA",
+ "Uhornhookabove", "1EEC",
+ "Uhorntilde", "1EEE",
+ "Uhungarumlaut", "0170",
+ "Uhungarumlautcyrillic", "04F2",
+ "Uinvertedbreve", "0216",
+ "Ukcyrillic", "0478",
+ "Umacron", "016A",
+ "Umacroncyrillic", "04EE",
+ "Umacrondieresis", "1E7A",
+ "Umonospace", "FF35",
+ "Uogonek", "0172",
+ "Upsilon", "03A5",
+ "Upsilon1", "03D2",
+ "Upsilonacutehooksymbolgreek", "03D3",
+ "Upsilonafrican", "01B1",
+ "Upsilondieresis", "03AB",
+ "Upsilondieresishooksymbolgreek", "03D4",
+ "Upsilonhooksymbol", "03D2",
+ "Upsilontonos", "038E",
+ "Uring", "016E",
+ "Ushortcyrillic", "040E",
+ "Ustraightcyrillic", "04AE",
+ "Ustraightstrokecyrillic", "04B0",
+ "Utilde", "0168",
+ "Utildeacute", "1E78",
+ "Utildebelow", "1E74",
+ "V", "0056",
+ "Vcircle", "24CB",
+ "Vdotbelow", "1E7E",
+ "Vecyrillic", "0412",
+ "Vewarmenian", "054E",
+ "Vhook", "01B2",
+ "Vmonospace", "FF36",
+ "Voarmenian", "0548",
+ "Vtilde", "1E7C",
+ "W", "0057",
+ "Wacute", "1E82",
+ "Wcircle", "24CC",
+ "Wcircumflex", "0174",
+ "Wdieresis", "1E84",
+ "Wdotaccent", "1E86",
+ "Wdotbelow", "1E88",
+ "Wgrave", "1E80",
+ "Wmonospace", "FF37",
+ "X", "0058",
+ "Xcircle", "24CD",
+ "Xdieresis", "1E8C",
+ "Xdotaccent", "1E8A",
+ "Xeharmenian", "053D",
+ "Xi", "039E",
+ "Xmonospace", "FF38",
+ "Y", "0059",
+ "Yacute", "00DD",
+ "Yatcyrillic", "0462",
+ "Ycircle", "24CE",
+ "Ycircumflex", "0176",
+ "Ydieresis", "0178",
+ "Ydotaccent", "1E8E",
+ "Ydotbelow", "1EF4",
+ "Yericyrillic", "042B",
+ "Yerudieresiscyrillic", "04F8",
+ "Ygrave", "1EF2",
+ "Yhook", "01B3",
+ "Yhookabove", "1EF6",
+ "Yiarmenian", "0545",
+ "Yicyrillic", "0407",
+ "Yiwnarmenian", "0552",
+ "Ymonospace", "FF39",
+ "Ytilde", "1EF8",
+ "Yusbigcyrillic", "046A",
+ "Yusbigiotifiedcyrillic", "046C",
+ "Yuslittlecyrillic", "0466",
+ "Yuslittleiotifiedcyrillic", "0468",
+ "Z", "005A",
+ "Zaarmenian", "0536",
+ "Zacute", "0179",
+ "Zcaron", "017D",
+ "Zcircle", "24CF",
+ "Zcircumflex", "1E90",
+ "Zdot", "017B",
+ "Zdotaccent", "017B",
+ "Zdotbelow", "1E92",
+ "Zecyrillic", "0417",
+ "Zedescendercyrillic", "0498",
+ "Zedieresiscyrillic", "04DE",
+ "Zeta", "0396",
+ "Zhearmenian", "053A",
+ "Zhebrevecyrillic", "04C1",
+ "Zhecyrillic", "0416",
+ "Zhedescendercyrillic", "0496",
+ "Zhedieresiscyrillic", "04DC",
+ "Zlinebelow", "1E94",
+ "Zmonospace", "FF3A",
+ "Zstroke", "01B5",
+ "a", "0061",
+ "aabengali", "0986",
+ "aacute", "00E1",
+ "aadeva", "0906",
+ "aagujarati", "0A86",
+ "aagurmukhi", "0A06",
+ "aamatragurmukhi", "0A3E",
+ "aarusquare", "3303",
+ "aavowelsignbengali", "09BE",
+ "aavowelsigndeva", "093E",
+ "aavowelsigngujarati", "0ABE",
+ "abbreviationmarkarmenian", "055F",
+ "abbreviationsigndeva", "0970",
+ "abengali", "0985",
+ "abopomofo", "311A",
+ "abreve", "0103",
+ "abreveacute", "1EAF",
+ "abrevecyrillic", "04D1",
+ "abrevedotbelow", "1EB7",
+ "abrevegrave", "1EB1",
+ "abrevehookabove", "1EB3",
+ "abrevetilde", "1EB5",
+ "acaron", "01CE",
+ "acircle", "24D0",
+ "acircumflex", "00E2",
+ "acircumflexacute", "1EA5",
+ "acircumflexdotbelow", "1EAD",
+ "acircumflexgrave", "1EA7",
+ "acircumflexhookabove", "1EA9",
+ "acircumflextilde", "1EAB",
+ "acute", "00B4",
+ "acutebelowcmb", "0317",
+ "acutecmb", "0301",
+ "acutecomb", "0301",
+ "acutedeva", "0954",
+ "acutelowmod", "02CF",
+ "acutetonecmb", "0341",
+ "acyrillic", "0430",
+ "adblgrave", "0201",
+ "addakgurmukhi", "0A71",
+ "adeva", "0905",
+ "adieresis", "00E4",
+ "adieresiscyrillic", "04D3",
+ "adieresismacron", "01DF",
+ "adotbelow", "1EA1",
+ "adotmacron", "01E1",
+ "ae", "00E6",
+ "aeacute", "01FD",
+ "aekorean", "3150",
+ "aemacron", "01E3",
+ "afii00208", "2015",
+ "afii08941", "20A4",
+ "afii10017", "0410",
+ "afii10018", "0411",
+ "afii10019", "0412",
+ "afii10020", "0413",
+ "afii10021", "0414",
+ "afii10022", "0415",
+ "afii10023", "0401",
+ "afii10024", "0416",
+ "afii10025", "0417",
+ "afii10026", "0418",
+ "afii10027", "0419",
+ "afii10028", "041A",
+ "afii10029", "041B",
+ "afii10030", "041C",
+ "afii10031", "041D",
+ "afii10032", "041E",
+ "afii10033", "041F",
+ "afii10034", "0420",
+ "afii10035", "0421",
+ "afii10036", "0422",
+ "afii10037", "0423",
+ "afii10038", "0424",
+ "afii10039", "0425",
+ "afii10040", "0426",
+ "afii10041", "0427",
+ "afii10042", "0428",
+ "afii10043", "0429",
+ "afii10044", "042A",
+ "afii10045", "042B",
+ "afii10046", "042C",
+ "afii10047", "042D",
+ "afii10048", "042E",
+ "afii10049", "042F",
+ "afii10050", "0490",
+ "afii10051", "0402",
+ "afii10052", "0403",
+ "afii10053", "0404",
+ "afii10054", "0405",
+ "afii10055", "0406",
+ "afii10056", "0407",
+ "afii10057", "0408",
+ "afii10058", "0409",
+ "afii10059", "040A",
+ "afii10060", "040B",
+ "afii10061", "040C",
+ "afii10062", "040E",
+ "afii10065", "0430",
+ "afii10066", "0431",
+ "afii10067", "0432",
+ "afii10068", "0433",
+ "afii10069", "0434",
+ "afii10070", "0435",
+ "afii10071", "0451",
+ "afii10072", "0436",
+ "afii10073", "0437",
+ "afii10074", "0438",
+ "afii10075", "0439",
+ "afii10076", "043A",
+ "afii10077", "043B",
+ "afii10078", "043C",
+ "afii10079", "043D",
+ "afii10080", "043E",
+ "afii10081", "043F",
+ "afii10082", "0440",
+ "afii10083", "0441",
+ "afii10084", "0442",
+ "afii10085", "0443",
+ "afii10086", "0444",
+ "afii10087", "0445",
+ "afii10088", "0446",
+ "afii10089", "0447",
+ "afii10090", "0448",
+ "afii10091", "0449",
+ "afii10092", "044A",
+ "afii10093", "044B",
+ "afii10094", "044C",
+ "afii10095", "044D",
+ "afii10096", "044E",
+ "afii10097", "044F",
+ "afii10098", "0491",
+ "afii10099", "0452",
+ "afii10100", "0453",
+ "afii10101", "0454",
+ "afii10102", "0455",
+ "afii10103", "0456",
+ "afii10104", "0457",
+ "afii10105", "0458",
+ "afii10106", "0459",
+ "afii10107", "045A",
+ "afii10108", "045B",
+ "afii10109", "045C",
+ "afii10110", "045E",
+ "afii10145", "040F",
+ "afii10146", "0462",
+ "afii10147", "0472",
+ "afii10148", "0474",
+ "afii10193", "045F",
+ "afii10194", "0463",
+ "afii10195", "0473",
+ "afii10196", "0475",
+ "afii10846", "04D9",
+ "afii299", "200E",
+ "afii300", "200F",
+ "afii301", "200D",
+ "afii57381", "066A",
+ "afii57388", "060C",
+ "afii57392", "0660",
+ "afii57393", "0661",
+ "afii57394", "0662",
+ "afii57395", "0663",
+ "afii57396", "0664",
+ "afii57397", "0665",
+ "afii57398", "0666",
+ "afii57399", "0667",
+ "afii57400", "0668",
+ "afii57401", "0669",
+ "afii57403", "061B",
+ "afii57407", "061F",
+ "afii57409", "0621",
+ "afii57410", "0622",
+ "afii57411", "0623",
+ "afii57412", "0624",
+ "afii57413", "0625",
+ "afii57414", "0626",
+ "afii57415", "0627",
+ "afii57416", "0628",
+ "afii57417", "0629",
+ "afii57418", "062A",
+ "afii57419", "062B",
+ "afii57420", "062C",
+ "afii57421", "062D",
+ "afii57422", "062E",
+ "afii57423", "062F",
+ "afii57424", "0630",
+ "afii57425", "0631",
+ "afii57426", "0632",
+ "afii57427", "0633",
+ "afii57428", "0634",
+ "afii57429", "0635",
+ "afii57430", "0636",
+ "afii57431", "0637",
+ "afii57432", "0638",
+ "afii57433", "0639",
+ "afii57434", "063A",
+ "afii57440", "0640",
+ "afii57441", "0641",
+ "afii57442", "0642",
+ "afii57443", "0643",
+ "afii57444", "0644",
+ "afii57445", "0645",
+ "afii57446", "0646",
+ "afii57448", "0648",
+ "afii57449", "0649",
+ "afii57450", "064A",
+ "afii57451", "064B",
+ "afii57452", "064C",
+ "afii57453", "064D",
+ "afii57454", "064E",
+ "afii57455", "064F",
+ "afii57456", "0650",
+ "afii57457", "0651",
+ "afii57458", "0652",
+ "afii57470", "0647",
+ "afii57505", "06A4",
+ "afii57506", "067E",
+ "afii57507", "0686",
+ "afii57508", "0698",
+ "afii57509", "06AF",
+ "afii57511", "0679",
+ "afii57512", "0688",
+ "afii57513", "0691",
+ "afii57514", "06BA",
+ "afii57519", "06D2",
+ "afii57534", "06D5",
+ "afii57636", "20AA",
+ "afii57645", "05BE",
+ "afii57658", "05C3",
+ "afii57664", "05D0",
+ "afii57665", "05D1",
+ "afii57666", "05D2",
+ "afii57667", "05D3",
+ "afii57668", "05D4",
+ "afii57669", "05D5",
+ "afii57670", "05D6",
+ "afii57671", "05D7",
+ "afii57672", "05D8",
+ "afii57673", "05D9",
+ "afii57674", "05DA",
+ "afii57675", "05DB",
+ "afii57676", "05DC",
+ "afii57677", "05DD",
+ "afii57678", "05DE",
+ "afii57679", "05DF",
+ "afii57680", "05E0",
+ "afii57681", "05E1",
+ "afii57682", "05E2",
+ "afii57683", "05E3",
+ "afii57684", "05E4",
+ "afii57685", "05E5",
+ "afii57686", "05E6",
+ "afii57687", "05E7",
+ "afii57688", "05E8",
+ "afii57689", "05E9",
+ "afii57690", "05EA",
+ "afii57694", "FB2A",
+ "afii57695", "FB2B",
+ "afii57700", "FB4B",
+ "afii57705", "FB1F",
+ "afii57716", "05F0",
+ "afii57717", "05F1",
+ "afii57718", "05F2",
+ "afii57723", "FB35",
+ "afii57793", "05B4",
+ "afii57794", "05B5",
+ "afii57795", "05B6",
+ "afii57796", "05BB",
+ "afii57797", "05B8",
+ "afii57798", "05B7",
+ "afii57799", "05B0",
+ "afii57800", "05B2",
+ "afii57801", "05B1",
+ "afii57802", "05B3",
+ "afii57803", "05C2",
+ "afii57804", "05C1",
+ "afii57806", "05B9",
+ "afii57807", "05BC",
+ "afii57839", "05BD",
+ "afii57841", "05BF",
+ "afii57842", "05C0",
+ "afii57929", "02BC",
+ "afii61248", "2105",
+ "afii61289", "2113",
+ "afii61352", "2116",
+ "afii61573", "202C",
+ "afii61574", "202D",
+ "afii61575", "202E",
+ "afii61664", "200C",
+ "afii63167", "066D",
+ "afii64937", "02BD",
+ "agrave", "00E0",
+ "agujarati", "0A85",
+ "agurmukhi", "0A05",
+ "ahiragana", "3042",
+ "ahookabove", "1EA3",
+ "aibengali", "0990",
+ "aibopomofo", "311E",
+ "aideva", "0910",
+ "aiecyrillic", "04D5",
+ "aigujarati", "0A90",
+ "aigurmukhi", "0A10",
+ "aimatragurmukhi", "0A48",
+ "ainarabic", "0639",
+ "ainfinalarabic", "FECA",
+ "aininitialarabic", "FECB",
+ "ainmedialarabic", "FECC",
+ "ainvertedbreve", "0203",
+ "aivowelsignbengali", "09C8",
+ "aivowelsigndeva", "0948",
+ "aivowelsigngujarati", "0AC8",
+ "akatakana", "30A2",
+ "akatakanahalfwidth", "FF71",
+ "akorean", "314F",
+ "alef", "05D0",
+ "alefarabic", "0627",
+ "alefdageshhebrew", "FB30",
+ "aleffinalarabic", "FE8E",
+ "alefhamzaabovearabic", "0623",
+ "alefhamzaabovefinalarabic", "FE84",
+ "alefhamzabelowarabic", "0625",
+ "alefhamzabelowfinalarabic", "FE88",
+ "alefhebrew", "05D0",
+ "aleflamedhebrew", "FB4F",
+ "alefmaddaabovearabic", "0622",
+ "alefmaddaabovefinalarabic", "FE82",
+ "alefmaksuraarabic", "0649",
+ "alefmaksurafinalarabic", "FEF0",
+ "alefmaksurainitialarabic", "FEF3",
+ "alefmaksuramedialarabic", "FEF4",
+ "alefpatahhebrew", "FB2E",
+ "alefqamatshebrew", "FB2F",
+ "aleph", "2135",
+ "allequal", "224C",
+ "alpha", "03B1",
+ "alphatonos", "03AC",
+ "amacron", "0101",
+ "amonospace", "FF41",
+ "ampersand", "0026",
+ "ampersandmonospace", "FF06",
+ "amsquare", "33C2",
+ "anbopomofo", "3122",
+ "angbopomofo", "3124",
+ "angkhankhuthai", "0E5A",
+ "angle", "2220",
+ "anglebracketleft", "3008",
+ "anglebracketleftvertical", "FE3F",
+ "anglebracketright", "3009",
+ "anglebracketrightvertical", "FE40",
+ "angleleft", "2329",
+ "angleright", "232A",
+ "angstrom", "212B",
+ "anoteleia", "0387",
+ "anudattadeva", "0952",
+ "anusvarabengali", "0982",
+ "anusvaradeva", "0902",
+ "anusvaragujarati", "0A82",
+ "aogonek", "0105",
+ "apaatosquare", "3300",
+ "aparen", "249C",
+ "apostrophearmenian", "055A",
+ "apostrophemod", "02BC",
+ "approaches", "2250",
+ "approxequal", "2248",
+ "approxequalorimage", "2252",
+ "approximatelyequal", "2245",
+ "araeaekorean", "318E",
+ "araeakorean", "318D",
+ "arc", "2312",
+ "arighthalfring", "1E9A",
+ "aring", "00E5",
+ "aringacute", "01FB",
+ "aringbelow", "1E01",
+ "arrowboth", "2194",
+ "arrowdashdown", "21E3",
+ "arrowdashleft", "21E0",
+ "arrowdashright", "21E2",
+ "arrowdashup", "21E1",
+ "arrowdblboth", "21D4",
+ "arrowdbldown", "21D3",
+ "arrowdblleft", "21D0",
+ "arrowdblright", "21D2",
+ "arrowdblup", "21D1",
+ "arrowdown", "2193",
+ "arrowdownleft", "2199",
+ "arrowdownright", "2198",
+ "arrowdownwhite", "21E9",
+ "arrowheaddownmod", "02C5",
+ "arrowheadleftmod", "02C2",
+ "arrowheadrightmod", "02C3",
+ "arrowheadupmod", "02C4",
+ "arrowleft", "2190",
+ "arrowleftdbl", "21D0",
+ "arrowleftdblstroke", "21CD",
+ "arrowleftoverright", "21C6",
+ "arrowleftwhite", "21E6",
+ "arrowright", "2192",
+ "arrowrightdblstroke", "21CF",
+ "arrowrightheavy", "279E",
+ "arrowrightoverleft", "21C4",
+ "arrowrightwhite", "21E8",
+ "arrowtableft", "21E4",
+ "arrowtabright", "21E5",
+ "arrowup", "2191",
+ "arrowupdn", "2195",
+ "arrowupdnbse", "21A8",
+ "arrowupdownbase", "21A8",
+ "arrowupleft", "2196",
+ "arrowupleftofdown", "21C5",
+ "arrowupright", "2197",
+ "arrowupwhite", "21E7",
+ "asciicircum", "005E",
+ "asciicircummonospace", "FF3E",
+ "asciitilde", "007E",
+ "asciitildemonospace", "FF5E",
+ "ascript", "0251",
+ "ascriptturned", "0252",
+ "asmallhiragana", "3041",
+ "asmallkatakana", "30A1",
+ "asmallkatakanahalfwidth", "FF67",
+ "asterisk", "002A",
+ "asteriskaltonearabic", "066D",
+ "asteriskarabic", "066D",
+ "asteriskmath", "2217",
+ "asteriskmonospace", "FF0A",
+ "asterisksmall", "FE61",
+ "asterism", "2042",
+ "asymptoticallyequal", "2243",
+ "at", "0040",
+ "atilde", "00E3",
+ "atmonospace", "FF20",
+ "atsmall", "FE6B",
+ "aturned", "0250",
+ "aubengali", "0994",
+ "aubopomofo", "3120",
+ "audeva", "0914",
+ "augujarati", "0A94",
+ "augurmukhi", "0A14",
+ "aulengthmarkbengali", "09D7",
+ "aumatragurmukhi", "0A4C",
+ "auvowelsignbengali", "09CC",
+ "auvowelsigndeva", "094C",
+ "auvowelsigngujarati", "0ACC",
+ "avagrahadeva", "093D",
+ "aybarmenian", "0561",
+ "ayin", "05E2",
+ "ayinaltonehebrew", "FB20",
+ "ayinhebrew", "05E2",
+ "b", "0062",
+ "babengali", "09AC",
+ "backslash", "005C",
+ "backslashmonospace", "FF3C",
+ "badeva", "092C",
+ "bagujarati", "0AAC",
+ "bagurmukhi", "0A2C",
+ "bahiragana", "3070",
+ "bahtthai", "0E3F",
+ "bakatakana", "30D0",
+ "bar", "007C",
+ "barmonospace", "FF5C",
+ "bbopomofo", "3105",
+ "bcircle", "24D1",
+ "bdotaccent", "1E03",
+ "bdotbelow", "1E05",
+ "beamedsixteenthnotes", "266C",
+ "because", "2235",
+ "becyrillic", "0431",
+ "beharabic", "0628",
+ "behfinalarabic", "FE90",
+ "behinitialarabic", "FE91",
+ "behiragana", "3079",
+ "behmedialarabic", "FE92",
+ "behmeeminitialarabic", "FC9F",
+ "behmeemisolatedarabic", "FC08",
+ "behnoonfinalarabic", "FC6D",
+ "bekatakana", "30D9",
+ "benarmenian", "0562",
+ "bet", "05D1",
+ "beta", "03B2",
+ "betasymbolgreek", "03D0",
+ "betdagesh", "FB31",
+ "betdageshhebrew", "FB31",
+ "bethebrew", "05D1",
+ "betrafehebrew", "FB4C",
+ "bhabengali", "09AD",
+ "bhadeva", "092D",
+ "bhagujarati", "0AAD",
+ "bhagurmukhi", "0A2D",
+ "bhook", "0253",
+ "bihiragana", "3073",
+ "bikatakana", "30D3",
+ "bilabialclick", "0298",
+ "bindigurmukhi", "0A02",
+ "birusquare", "3331",
+ "blackcircle", "25CF",
+ "blackdiamond", "25C6",
+ "blackdownpointingtriangle", "25BC",
+ "blackleftpointingpointer", "25C4",
+ "blackleftpointingtriangle", "25C0",
+ "blacklenticularbracketleft", "3010",
+ "blacklenticularbracketleftvertical", "FE3B",
+ "blacklenticularbracketright", "3011",
+ "blacklenticularbracketrightvertical", "FE3C",
+ "blacklowerlefttriangle", "25E3",
+ "blacklowerrighttriangle", "25E2",
+ "blackrectangle", "25AC",
+ "blackrightpointingpointer", "25BA",
+ "blackrightpointingtriangle", "25B6",
+ "blacksmallsquare", "25AA",
+ "blacksmilingface", "263B",
+ "blacksquare", "25A0",
+ "blackstar", "2605",
+ "blackupperlefttriangle", "25E4",
+ "blackupperrighttriangle", "25E5",
+ "blackuppointingsmalltriangle", "25B4",
+ "blackuppointingtriangle", "25B2",
+ "blank", "2423",
+ "blinebelow", "1E07",
+ "block", "2588",
+ "bmonospace", "FF42",
+ "bobaimaithai", "0E1A",
+ "bohiragana", "307C",
+ "bokatakana", "30DC",
+ "bparen", "249D",
+ "bqsquare", "33C3",
+ "braceleft", "007B",
+ "braceleftmonospace", "FF5B",
+ "braceleftsmall", "FE5B",
+ "braceleftvertical", "FE37",
+ "braceright", "007D",
+ "bracerightmonospace", "FF5D",
+ "bracerightsmall", "FE5C",
+ "bracerightvertical", "FE38",
+ "bracketleft", "005B",
+ "bracketleftmonospace", "FF3B",
+ "bracketright", "005D",
+ "bracketrightmonospace", "FF3D",
+ "breve", "02D8",
+ "brevebelowcmb", "032E",
+ "brevecmb", "0306",
+ "breveinvertedbelowcmb", "032F",
+ "breveinvertedcmb", "0311",
+ "breveinverteddoublecmb", "0361",
+ "bridgebelowcmb", "032A",
+ "bridgeinvertedbelowcmb", "033A",
+ "brokenbar", "00A6",
+ "bstroke", "0180",
+ "btopbar", "0183",
+ "buhiragana", "3076",
+ "bukatakana", "30D6",
+ "bullet", "2022",
+ "bulletinverse", "25D8",
+ "bulletoperator", "2219",
+ "bullseye", "25CE",
+ "c", "0063",
+ "caarmenian", "056E",
+ "cabengali", "099A",
+ "cacute", "0107",
+ "cadeva", "091A",
+ "cagujarati", "0A9A",
+ "cagurmukhi", "0A1A",
+ "calsquare", "3388",
+ "candrabindubengali", "0981",
+ "candrabinducmb", "0310",
+ "candrabindudeva", "0901",
+ "candrabindugujarati", "0A81",
+ "capslock", "21EA",
+ "careof", "2105",
+ "caron", "02C7",
+ "caronbelowcmb", "032C",
+ "caroncmb", "030C",
+ "carriagereturn", "21B5",
+ "cbopomofo", "3118",
+ "ccaron", "010D",
+ "ccedilla", "00E7",
+ "ccedillaacute", "1E09",
+ "ccircle", "24D2",
+ "ccircumflex", "0109",
+ "ccurl", "0255",
+ "cdot", "010B",
+ "cdotaccent", "010B",
+ "cdsquare", "33C5",
+ "cedilla", "00B8",
+ "cedillacmb", "0327",
+ "cent", "00A2",
+ "centigrade", "2103",
+ "centmonospace", "FFE0",
+ "chaarmenian", "0579",
+ "chabengali", "099B",
+ "chadeva", "091B",
+ "chagujarati", "0A9B",
+ "chagurmukhi", "0A1B",
+ "chbopomofo", "3114",
+ "cheabkhasiancyrillic", "04BD",
+ "checkmark", "2713",
+ "checyrillic", "0447",
+ "chedescenderabkhasiancyrillic", "04BF",
+ "chedescendercyrillic", "04B7",
+ "chedieresiscyrillic", "04F5",
+ "cheharmenian", "0573",
+ "chekhakassiancyrillic", "04CC",
+ "cheverticalstrokecyrillic", "04B9",
+ "chi", "03C7",
+ "chieuchacirclekorean", "3277",
+ "chieuchaparenkorean", "3217",
+ "chieuchcirclekorean", "3269",
+ "chieuchkorean", "314A",
+ "chieuchparenkorean", "3209",
+ "chochangthai", "0E0A",
+ "chochanthai", "0E08",
+ "chochingthai", "0E09",
+ "chochoethai", "0E0C",
+ "chook", "0188",
+ "cieucacirclekorean", "3276",
+ "cieucaparenkorean", "3216",
+ "cieuccirclekorean", "3268",
+ "cieuckorean", "3148",
+ "cieucparenkorean", "3208",
+ "cieucuparenkorean", "321C",
+ "circle", "25CB",
+ "circlemultiply", "2297",
+ "circleot", "2299",
+ "circleplus", "2295",
+ "circlepostalmark", "3036",
+ "circlewithlefthalfblack", "25D0",
+ "circlewithrighthalfblack", "25D1",
+ "circumflex", "02C6",
+ "circumflexbelowcmb", "032D",
+ "circumflexcmb", "0302",
+ "clear", "2327",
+ "clickalveolar", "01C2",
+ "clickdental", "01C0",
+ "clicklateral", "01C1",
+ "clickretroflex", "01C3",
+ "club", "2663",
+ "clubsuitblack", "2663",
+ "clubsuitwhite", "2667",
+ "cmcubedsquare", "33A4",
+ "cmonospace", "FF43",
+ "cmsquaredsquare", "33A0",
+ "coarmenian", "0581",
+ "colon", "003A",
+ "colonmonetary", "20A1",
+ "colonmonospace", "FF1A",
+ "colonsign", "20A1",
+ "colonsmall", "FE55",
+ "colontriangularhalfmod", "02D1",
+ "colontriangularmod", "02D0",
+ "comma", "002C",
+ "commaabovecmb", "0313",
+ "commaaboverightcmb", "0315",
+ "commaarabic", "060C",
+ "commaarmenian", "055D",
+ "commamonospace", "FF0C",
+ "commareversedabovecmb", "0314",
+ "commareversedmod", "02BD",
+ "commasmall", "FE50",
+ "commaturnedabovecmb", "0312",
+ "commaturnedmod", "02BB",
+ "compass", "263C",
+ "congruent", "2245",
+ "contourintegral", "222E",
+ "control", "2303",
+ "controlACK", "0006",
+ "controlBEL", "0007",
+ "controlBS", "0008",
+ "controlCAN", "0018",
+ "controlCR", "000D",
+ "controlDC1", "0011",
+ "controlDC2", "0012",
+ "controlDC3", "0013",
+ "controlDC4", "0014",
+ "controlDEL", "007F",
+ "controlDLE", "0010",
+ "controlEM", "0019",
+ "controlENQ", "0005",
+ "controlEOT", "0004",
+ "controlESC", "001B",
+ "controlETB", "0017",
+ "controlETX", "0003",
+ "controlFF", "000C",
+ "controlFS", "001C",
+ "controlGS", "001D",
+ "controlHT", "0009",
+ "controlLF", "000A",
+ "controlNAK", "0015",
+ "controlRS", "001E",
+ "controlSI", "000F",
+ "controlSO", "000E",
+ "controlSOT", "0002",
+ "controlSTX", "0001",
+ "controlSUB", "001A",
+ "controlSYN", "0016",
+ "controlUS", "001F",
+ "controlVT", "000B",
+ "copyright", "00A9",
+ "cornerbracketleft", "300C",
+ "cornerbracketlefthalfwidth", "FF62",
+ "cornerbracketleftvertical", "FE41",
+ "cornerbracketright", "300D",
+ "cornerbracketrighthalfwidth", "FF63",
+ "cornerbracketrightvertical", "FE42",
+ "corporationsquare", "337F",
+ "cosquare", "33C7",
+ "coverkgsquare", "33C6",
+ "cparen", "249E",
+ "cruzeiro", "20A2",
+ "cstretched", "0297",
+ "curlyand", "22CF",
+ "curlyor", "22CE",
+ "currency", "00A4",
+ "d", "0064",
+ "daarmenian", "0564",
+ "dabengali", "09A6",
+ "dadarabic", "0636",
+ "dadeva", "0926",
+ "dadfinalarabic", "FEBE",
+ "dadinitialarabic", "FEBF",
+ "dadmedialarabic", "FEC0",
+ "dagesh", "05BC",
+ "dageshhebrew", "05BC",
+ "dagger", "2020",
+ "daggerdbl", "2021",
+ "dagujarati", "0AA6",
+ "dagurmukhi", "0A26",
+ "dahiragana", "3060",
+ "dakatakana", "30C0",
+ "dalarabic", "062F",
+ "dalet", "05D3",
+ "daletdagesh", "FB33",
+ "daletdageshhebrew", "FB33",
+ "dalethatafpatah", "05D3_05B2",
+ "dalethatafpatahhebrew", "05D3_05B2",
+ "dalethatafsegol", "05D3_05B1",
+ "dalethatafsegolhebrew", "05D3_05B1",
+ "dalethebrew", "05D3",
+ "dalethiriq", "05D3_05B4",
+ "dalethiriqhebrew", "05D3_05B4",
+ "daletholam", "05D3_05B9",
+ "daletholamhebrew", "05D3_05B9",
+ "daletpatah", "05D3_05B7",
+ "daletpatahhebrew", "05D3_05B7",
+ "daletqamats", "05D3_05B8",
+ "daletqamatshebrew", "05D3_05B8",
+ "daletqubuts", "05D3_05BB",
+ "daletqubutshebrew", "05D3_05BB",
+ "daletsegol", "05D3_05B6",
+ "daletsegolhebrew", "05D3_05B6",
+ "daletsheva", "05D3_05B0",
+ "daletshevahebrew", "05D3_05B0",
+ "dalettsere", "05D3_05B5",
+ "dalettserehebrew", "05D3_05B5",
+ "dalfinalarabic", "FEAA",
+ "dammaarabic", "064F",
+ "dammalowarabic", "064F",
+ "dammatanaltonearabic", "064C",
+ "dammatanarabic", "064C",
+ "danda", "0964",
+ "dargahebrew", "05A7",
+ "dargalefthebrew", "05A7",
+ "dasiapneumatacyrilliccmb", "0485",
+ "dblanglebracketleft", "300A",
+ "dblanglebracketleftvertical", "FE3D",
+ "dblanglebracketright", "300B",
+ "dblanglebracketrightvertical", "FE3E",
+ "dblarchinvertedbelowcmb", "032B",
+ "dblarrowleft", "21D4",
+ "dblarrowright", "21D2",
+ "dbldanda", "0965",
+ "dblgravecmb", "030F",
+ "dblintegral", "222C",
+ "dbllowline", "2017",
+ "dbllowlinecmb", "0333",
+ "dbloverlinecmb", "033F",
+ "dblprimemod", "02BA",
+ "dblverticalbar", "2016",
+ "dblverticallineabovecmb", "030E",
+ "dbopomofo", "3109",
+ "dbsquare", "33C8",
+ "dcaron", "010F",
+ "dcedilla", "1E11",
+ "dcircle", "24D3",
+ "dcircumflexbelow", "1E13",
+ "dcroat", "0111",
+ "ddabengali", "09A1",
+ "ddadeva", "0921",
+ "ddagujarati", "0AA1",
+ "ddagurmukhi", "0A21",
+ "ddalarabic", "0688",
+ "ddalfinalarabic", "FB89",
+ "dddhadeva", "095C",
+ "ddhabengali", "09A2",
+ "ddhadeva", "0922",
+ "ddhagujarati", "0AA2",
+ "ddhagurmukhi", "0A22",
+ "ddotaccent", "1E0B",
+ "ddotbelow", "1E0D",
+ "decimalseparatorarabic", "066B",
+ "decimalseparatorpersian", "066B",
+ "decyrillic", "0434",
+ "degree", "00B0",
+ "dehihebrew", "05AD",
+ "dehiragana", "3067",
+ "deicoptic", "03EF",
+ "dekatakana", "30C7",
+ "deleteleft", "232B",
+ "deleteright", "2326",
+ "delta", "03B4",
+ "deltaturned", "018D",
+ "denominatorminusonenumeratorbengali", "09F8",
+ "dezh", "02A4",
+ "dhabengali", "09A7",
+ "dhadeva", "0927",
+ "dhagujarati", "0AA7",
+ "dhagurmukhi", "0A27",
+ "dhook", "0257",
+ "dialytikatonos", "0385",
+ "dialytikatonoscmb", "0344",
+ "diamond", "2666",
+ "diamondsuitwhite", "2662",
+ "dieresis", "00A8",
+ "dieresisbelowcmb", "0324",
+ "dieresiscmb", "0308",
+ "dieresistonos", "0385",
+ "dihiragana", "3062",
+ "dikatakana", "30C2",
+ "dittomark", "3003",
+ "divide", "00F7",
+ "divides", "2223",
+ "divisionslash", "2215",
+ "djecyrillic", "0452",
+ "dkshade", "2593",
+ "dlinebelow", "1E0F",
+ "dlsquare", "3397",
+ "dmacron", "0111",
+ "dmonospace", "FF44",
+ "dnblock", "2584",
+ "dochadathai", "0E0E",
+ "dodekthai", "0E14",
+ "dohiragana", "3069",
+ "dokatakana", "30C9",
+ "dollar", "0024",
+ "dollarmonospace", "FF04",
+ "dollarsmall", "FE69",
+ "dong", "20AB",
+ "dorusquare", "3326",
+ "dotaccent", "02D9",
+ "dotaccentcmb", "0307",
+ "dotbelowcmb", "0323",
+ "dotbelowcomb", "0323",
+ "dotkatakana", "30FB",
+ "dotlessi", "0131",
+ "dotlessjstrokehook", "0284",
+ "dotmath", "22C5",
+ "dottedcircle", "25CC",
+ "doubleyodpatah", "FB1F",
+ "doubleyodpatahhebrew", "FB1F",
+ "downtackbelowcmb", "031E",
+ "downtackmod", "02D5",
+ "dparen", "249F",
+ "dtail", "0256",
+ "dtopbar", "018C",
+ "duhiragana", "3065",
+ "dukatakana", "30C5",
+ "dz", "01F3",
+ "dzaltone", "02A3",
+ "dzcaron", "01C6",
+ "dzcurl", "02A5",
+ "dzeabkhasiancyrillic", "04E1",
+ "dzecyrillic", "0455",
+ "dzhecyrillic", "045F",
+ "e", "0065",
+ "eacute", "00E9",
+ "earth", "2641",
+ "ebengali", "098F",
+ "ebopomofo", "311C",
+ "ebreve", "0115",
+ "ecandradeva", "090D",
+ "ecandragujarati", "0A8D",
+ "ecandravowelsigndeva", "0945",
+ "ecandravowelsigngujarati", "0AC5",
+ "ecaron", "011B",
+ "ecedillabreve", "1E1D",
+ "echarmenian", "0565",
+ "echyiwnarmenian", "0587",
+ "ecircle", "24D4",
+ "ecircumflex", "00EA",
+ "ecircumflexacute", "1EBF",
+ "ecircumflexbelow", "1E19",
+ "ecircumflexdotbelow", "1EC7",
+ "ecircumflexgrave", "1EC1",
+ "ecircumflexhookabove", "1EC3",
+ "ecircumflextilde", "1EC5",
+ "ecyrillic", "0454",
+ "edblgrave", "0205",
+ "edeva", "090F",
+ "edieresis", "00EB",
+ "edot", "0117",
+ "edotaccent", "0117",
+ "edotbelow", "1EB9",
+ "eegurmukhi", "0A0F",
+ "eematragurmukhi", "0A47",
+ "efcyrillic", "0444",
+ "egrave", "00E8",
+ "egujarati", "0A8F",
+ "eharmenian", "0567",
+ "ehbopomofo", "311D",
+ "ehiragana", "3048",
+ "ehookabove", "1EBB",
+ "eibopomofo", "311F",
+ "eight", "0038",
+ "eightarabic", "0668",
+ "eightbengali", "09EE",
+ "eightcircle", "2467",
+ "eightcircleinversesansserif", "2791",
+ "eightdeva", "096E",
+ "eighteencircle", "2471",
+ "eighteenparen", "2485",
+ "eighteenperiod", "2499",
+ "eightgujarati", "0AEE",
+ "eightgurmukhi", "0A6E",
+ "eighthackarabic", "0668",
+ "eighthangzhou", "3028",
+ "eighthnotebeamed", "266B",
+ "eightideographicparen", "3227",
+ "eightinferior", "2088",
+ "eightmonospace", "FF18",
+ "eightparen", "247B",
+ "eightperiod", "248F",
+ "eightpersian", "06F8",
+ "eightroman", "2177",
+ "eightsuperior", "2078",
+ "eightthai", "0E58",
+ "einvertedbreve", "0207",
+ "eiotifiedcyrillic", "0465",
+ "ekatakana", "30A8",
+ "ekatakanahalfwidth", "FF74",
+ "ekonkargurmukhi", "0A74",
+ "ekorean", "3154",
+ "elcyrillic", "043B",
+ "element", "2208",
+ "elevencircle", "246A",
+ "elevenparen", "247E",
+ "elevenperiod", "2492",
+ "elevenroman", "217A",
+ "ellipsis", "2026",
+ "ellipsisvertical", "22EE",
+ "emacron", "0113",
+ "emacronacute", "1E17",
+ "emacrongrave", "1E15",
+ "emcyrillic", "043C",
+ "emdash", "2014",
+ "emdashvertical", "FE31",
+ "emonospace", "FF45",
+ "emphasismarkarmenian", "055B",
+ "emptyset", "2205",
+ "enbopomofo", "3123",
+ "encyrillic", "043D",
+ "endash", "2013",
+ "endashvertical", "FE32",
+ "endescendercyrillic", "04A3",
+ "eng", "014B",
+ "engbopomofo", "3125",
+ "enghecyrillic", "04A5",
+ "enhookcyrillic", "04C8",
+ "enspace", "2002",
+ "eogonek", "0119",
+ "eokorean", "3153",
+ "eopen", "025B",
+ "eopenclosed", "029A",
+ "eopenreversed", "025C",
+ "eopenreversedclosed", "025E",
+ "eopenreversedhook", "025D",
+ "eparen", "24A0",
+ "epsilon", "03B5",
+ "epsilontonos", "03AD",
+ "equal", "003D",
+ "equalmonospace", "FF1D",
+ "equalsmall", "FE66",
+ "equalsuperior", "207C",
+ "equivalence", "2261",
+ "erbopomofo", "3126",
+ "ercyrillic", "0440",
+ "ereversed", "0258",
+ "ereversedcyrillic", "044D",
+ "escyrillic", "0441",
+ "esdescendercyrillic", "04AB",
+ "esh", "0283",
+ "eshcurl", "0286",
+ "eshortdeva", "090E",
+ "eshortvowelsigndeva", "0946",
+ "eshreversedloop", "01AA",
+ "eshsquatreversed", "0285",
+ "esmallhiragana", "3047",
+ "esmallkatakana", "30A7",
+ "esmallkatakanahalfwidth", "FF6A",
+ "estimated", "212E",
+ "eta", "03B7",
+ "etarmenian", "0568",
+ "etatonos", "03AE",
+ "eth", "00F0",
+ "etilde", "1EBD",
+ "etildebelow", "1E1B",
+ "etnahtafoukhhebrew", "0591",
+ "etnahtafoukhlefthebrew", "0591",
+ "etnahtahebrew", "0591",
+ "etnahtalefthebrew", "0591",
+ "eturned", "01DD",
+ "eukorean", "3161",
+ "euro", "20AC",
+ "evowelsignbengali", "09C7",
+ "evowelsigndeva", "0947",
+ "evowelsigngujarati", "0AC7",
+ "exclam", "0021",
+ "exclamarmenian", "055C",
+ "exclamdbl", "203C",
+ "exclamdown", "00A1",
+ "exclammonospace", "FF01",
+ "existential", "2203",
+ "ezh", "0292",
+ "ezhcaron", "01EF",
+ "ezhcurl", "0293",
+ "ezhreversed", "01B9",
+ "ezhtail", "01BA",
+ "f", "0066",
+ "fadeva", "095E",
+ "fagurmukhi", "0A5E",
+ "fahrenheit", "2109",
+ "fathaarabic", "064E",
+ "fathalowarabic", "064E",
+ "fathatanarabic", "064B",
+ "fbopomofo", "3108",
+ "fcircle", "24D5",
+ "fdotaccent", "1E1F",
+ "feharabic", "0641",
+ "feharmenian", "0586",
+ "fehfinalarabic", "FED2",
+ "fehinitialarabic", "FED3",
+ "fehmedialarabic", "FED4",
+ "feicoptic", "03E5",
+ "female", "2640",
+ "ff", "FB00",
+ "ffi", "FB03",
+ "ffl", "FB04",
+ "fi", "FB01",
+ "fifteencircle", "246E",
+ "fifteenparen", "2482",
+ "fifteenperiod", "2496",
+ "figuredash", "2012",
+ "filledbox", "25A0",
+ "filledrect", "25AC",
+ "finalkaf", "05DA",
+ "finalkafdagesh", "FB3A",
+ "finalkafdageshhebrew", "FB3A",
+ "finalkafhebrew", "05DA",
+ "finalkafqamats", "05DA_05B8",
+ "finalkafqamatshebrew", "05DA_05B8",
+ "finalkafsheva", "05DA_05B0",
+ "finalkafshevahebrew", "05DA_05B0",
+ "finalmem", "05DD",
+ "finalmemhebrew", "05DD",
+ "finalnun", "05DF",
+ "finalnunhebrew", "05DF",
+ "finalpe", "05E3",
+ "finalpehebrew", "05E3",
+ "finaltsadi", "05E5",
+ "finaltsadihebrew", "05E5",
+ "firsttonechinese", "02C9",
+ "fisheye", "25C9",
+ "fitacyrillic", "0473",
+ "five", "0035",
+ "fivearabic", "0665",
+ "fivebengali", "09EB",
+ "fivecircle", "2464",
+ "fivecircleinversesansserif", "278E",
+ "fivedeva", "096B",
+ "fiveeighths", "215D",
+ "fivegujarati", "0AEB",
+ "fivegurmukhi", "0A6B",
+ "fivehackarabic", "0665",
+ "fivehangzhou", "3025",
+ "fiveideographicparen", "3224",
+ "fiveinferior", "2085",
+ "fivemonospace", "FF15",
+ "fiveparen", "2478",
+ "fiveperiod", "248C",
+ "fivepersian", "06F5",
+ "fiveroman", "2174",
+ "fivesuperior", "2075",
+ "fivethai", "0E55",
+ "fl", "FB02",
+ "florin", "0192",
+ "fmonospace", "FF46",
+ "fmsquare", "3399",
+ "fofanthai", "0E1F",
+ "fofathai", "0E1D",
+ "fongmanthai", "0E4F",
+ "forall", "2200",
+ "four", "0034",
+ "fourarabic", "0664",
+ "fourbengali", "09EA",
+ "fourcircle", "2463",
+ "fourcircleinversesansserif", "278D",
+ "fourdeva", "096A",
+ "fourgujarati", "0AEA",
+ "fourgurmukhi", "0A6A",
+ "fourhackarabic", "0664",
+ "fourhangzhou", "3024",
+ "fourideographicparen", "3223",
+ "fourinferior", "2084",
+ "fourmonospace", "FF14",
+ "fournumeratorbengali", "09F7",
+ "fourparen", "2477",
+ "fourperiod", "248B",
+ "fourpersian", "06F4",
+ "fourroman", "2173",
+ "foursuperior", "2074",
+ "fourteencircle", "246D",
+ "fourteenparen", "2481",
+ "fourteenperiod", "2495",
+ "fourthai", "0E54",
+ "fourthtonechinese", "02CB",
+ "fparen", "24A1",
+ "fraction", "2044",
+ "franc", "20A3",
+ "g", "0067",
+ "gabengali", "0997",
+ "gacute", "01F5",
+ "gadeva", "0917",
+ "gafarabic", "06AF",
+ "gaffinalarabic", "FB93",
+ "gafinitialarabic", "FB94",
+ "gafmedialarabic", "FB95",
+ "gagujarati", "0A97",
+ "gagurmukhi", "0A17",
+ "gahiragana", "304C",
+ "gakatakana", "30AC",
+ "gamma", "03B3",
+ "gammalatinsmall", "0263",
+ "gammasuperior", "02E0",
+ "gangiacoptic", "03EB",
+ "gbopomofo", "310D",
+ "gbreve", "011F",
+ "gcaron", "01E7",
+ "gcedilla", "0123",
+ "gcircle", "24D6",
+ "gcircumflex", "011D",
+ "gcommaaccent", "0123",
+ "gdot", "0121",
+ "gdotaccent", "0121",
+ "gecyrillic", "0433",
+ "gehiragana", "3052",
+ "gekatakana", "30B2",
+ "geometricallyequal", "2251",
+ "gereshaccenthebrew", "059C",
+ "gereshhebrew", "05F3",
+ "gereshmuqdamhebrew", "059D",
+ "germandbls", "00DF",
+ "gershayimaccenthebrew", "059E",
+ "gershayimhebrew", "05F4",
+ "getamark", "3013",
+ "ghabengali", "0998",
+ "ghadarmenian", "0572",
+ "ghadeva", "0918",
+ "ghagujarati", "0A98",
+ "ghagurmukhi", "0A18",
+ "ghainarabic", "063A",
+ "ghainfinalarabic", "FECE",
+ "ghaininitialarabic", "FECF",
+ "ghainmedialarabic", "FED0",
+ "ghemiddlehookcyrillic", "0495",
+ "ghestrokecyrillic", "0493",
+ "gheupturncyrillic", "0491",
+ "ghhadeva", "095A",
+ "ghhagurmukhi", "0A5A",
+ "ghook", "0260",
+ "ghzsquare", "3393",
+ "gihiragana", "304E",
+ "gikatakana", "30AE",
+ "gimarmenian", "0563",
+ "gimel", "05D2",
+ "gimeldagesh", "FB32",
+ "gimeldageshhebrew", "FB32",
+ "gimelhebrew", "05D2",
+ "gjecyrillic", "0453",
+ "glottalinvertedstroke", "01BE",
+ "glottalstop", "0294",
+ "glottalstopinverted", "0296",
+ "glottalstopmod", "02C0",
+ "glottalstopreversed", "0295",
+ "glottalstopreversedmod", "02C1",
+ "glottalstopreversedsuperior", "02E4",
+ "glottalstopstroke", "02A1",
+ "glottalstopstrokereversed", "02A2",
+ "gmacron", "1E21",
+ "gmonospace", "FF47",
+ "gohiragana", "3054",
+ "gokatakana", "30B4",
+ "gparen", "24A2",
+ "gpasquare", "33AC",
+ "gradient", "2207",
+ "grave", "0060",
+ "gravebelowcmb", "0316",
+ "gravecmb", "0300",
+ "gravecomb", "0300",
+ "gravedeva", "0953",
+ "gravelowmod", "02CE",
+ "gravemonospace", "FF40",
+ "gravetonecmb", "0340",
+ "greater", "003E",
+ "greaterequal", "2265",
+ "greaterequalorless", "22DB",
+ "greatermonospace", "FF1E",
+ "greaterorequivalent", "2273",
+ "greaterorless", "2277",
+ "greateroverequal", "2267",
+ "greatersmall", "FE65",
+ "gscript", "0261",
+ "gstroke", "01E5",
+ "guhiragana", "3050",
+ "guillemotleft", "00AB",
+ "guillemotright", "00BB",
+ "guilsinglleft", "2039",
+ "guilsinglright", "203A",
+ "gukatakana", "30B0",
+ "guramusquare", "3318",
+ "gysquare", "33C9",
+ "h", "0068",
+ "haabkhasiancyrillic", "04A9",
+ "haaltonearabic", "06C1",
+ "habengali", "09B9",
+ "hadescendercyrillic", "04B3",
+ "hadeva", "0939",
+ "hagujarati", "0AB9",
+ "hagurmukhi", "0A39",
+ "haharabic", "062D",
+ "hahfinalarabic", "FEA2",
+ "hahinitialarabic", "FEA3",
+ "hahiragana", "306F",
+ "hahmedialarabic", "FEA4",
+ "haitusquare", "332A",
+ "hakatakana", "30CF",
+ "hakatakanahalfwidth", "FF8A",
+ "halantgurmukhi", "0A4D",
+ "hamzaarabic", "0621",
+ "hamzadammaarabic", "0621_064F",
+ "hamzadammatanarabic", "0621_064C",
+ "hamzafathaarabic", "0621_064E",
+ "hamzafathatanarabic", "0621_064B",
+ "hamzalowarabic", "0621",
+ "hamzalowkasraarabic", "0621_0650",
+ "hamzalowkasratanarabic", "0621_064D",
+ "hamzasukunarabic", "0621_0652",
+ "hangulfiller", "3164",
+ "hardsigncyrillic", "044A",
+ "harpoonleftbarbup", "21BC",
+ "harpoonrightbarbup", "21C0",
+ "hasquare", "33CA",
+ "hatafpatah", "05B2",
+ "hatafpatah16", "05B2",
+ "hatafpatah23", "05B2",
+ "hatafpatah2f", "05B2",
+ "hatafpatahhebrew", "05B2",
+ "hatafpatahnarrowhebrew", "05B2",
+ "hatafpatahquarterhebrew", "05B2",
+ "hatafpatahwidehebrew", "05B2",
+ "hatafqamats", "05B3",
+ "hatafqamats1b", "05B3",
+ "hatafqamats28", "05B3",
+ "hatafqamats34", "05B3",
+ "hatafqamatshebrew", "05B3",
+ "hatafqamatsnarrowhebrew", "05B3",
+ "hatafqamatsquarterhebrew", "05B3",
+ "hatafqamatswidehebrew", "05B3",
+ "hatafsegol", "05B1",
+ "hatafsegol17", "05B1",
+ "hatafsegol24", "05B1",
+ "hatafsegol30", "05B1",
+ "hatafsegolhebrew", "05B1",
+ "hatafsegolnarrowhebrew", "05B1",
+ "hatafsegolquarterhebrew", "05B1",
+ "hatafsegolwidehebrew", "05B1",
+ "hbar", "0127",
+ "hbopomofo", "310F",
+ "hbrevebelow", "1E2B",
+ "hcedilla", "1E29",
+ "hcircle", "24D7",
+ "hcircumflex", "0125",
+ "hdieresis", "1E27",
+ "hdotaccent", "1E23",
+ "hdotbelow", "1E25",
+ "he", "05D4",
+ "heart", "2665",
+ "heartsuitblack", "2665",
+ "heartsuitwhite", "2661",
+ "hedagesh", "FB34",
+ "hedageshhebrew", "FB34",
+ "hehaltonearabic", "06C1",
+ "heharabic", "0647",
+ "hehebrew", "05D4",
+ "hehfinalaltonearabic", "FBA7",
+ "hehfinalalttwoarabic", "FEEA",
+ "hehfinalarabic", "FEEA",
+ "hehhamzaabovefinalarabic", "FBA5",
+ "hehhamzaaboveisolatedarabic", "FBA4",
+ "hehinitialaltonearabic", "FBA8",
+ "hehinitialarabic", "FEEB",
+ "hehiragana", "3078",
+ "hehmedialaltonearabic", "FBA9",
+ "hehmedialarabic", "FEEC",
+ "heiseierasquare", "337B",
+ "hekatakana", "30D8",
+ "hekatakanahalfwidth", "FF8D",
+ "hekutaarusquare", "3336",
+ "henghook", "0267",
+ "herutusquare", "3339",
+ "het", "05D7",
+ "hethebrew", "05D7",
+ "hhook", "0266",
+ "hhooksuperior", "02B1",
+ "hieuhacirclekorean", "327B",
+ "hieuhaparenkorean", "321B",
+ "hieuhcirclekorean", "326D",
+ "hieuhkorean", "314E",
+ "hieuhparenkorean", "320D",
+ "hihiragana", "3072",
+ "hikatakana", "30D2",
+ "hikatakanahalfwidth", "FF8B",
+ "hiriq", "05B4",
+ "hiriq14", "05B4",
+ "hiriq21", "05B4",
+ "hiriq2d", "05B4",
+ "hiriqhebrew", "05B4",
+ "hiriqnarrowhebrew", "05B4",
+ "hiriqquarterhebrew", "05B4",
+ "hiriqwidehebrew", "05B4",
+ "hlinebelow", "1E96",
+ "hmonospace", "FF48",
+ "hoarmenian", "0570",
+ "hohipthai", "0E2B",
+ "hohiragana", "307B",
+ "hokatakana", "30DB",
+ "hokatakanahalfwidth", "FF8E",
+ "holam", "05B9",
+ "holam19", "05B9",
+ "holam26", "05B9",
+ "holam32", "05B9",
+ "holamhebrew", "05B9",
+ "holamnarrowhebrew", "05B9",
+ "holamquarterhebrew", "05B9",
+ "holamwidehebrew", "05B9",
+ "honokhukthai", "0E2E",
+ "hookabovecomb", "0309",
+ "hookcmb", "0309",
+ "hookpalatalizedbelowcmb", "0321",
+ "hookretroflexbelowcmb", "0322",
+ "hoonsquare", "3342",
+ "horicoptic", "03E9",
+ "horizontalbar", "2015",
+ "horncmb", "031B",
+ "hotsprings", "2668",
+ "house", "2302",
+ "hparen", "24A3",
+ "hsuperior", "02B0",
+ "hturned", "0265",
+ "huhiragana", "3075",
+ "huiitosquare", "3333",
+ "hukatakana", "30D5",
+ "hukatakanahalfwidth", "FF8C",
+ "hungarumlaut", "02DD",
+ "hungarumlautcmb", "030B",
+ "hv", "0195",
+ "hyphen", "002D",
+ "hyphenmonospace", "FF0D",
+ "hyphensmall", "FE63",
+ "hyphentwo", "2010",
+ "i", "0069",
+ "iacute", "00ED",
+ "iacyrillic", "044F",
+ "ibengali", "0987",
+ "ibopomofo", "3127",
+ "ibreve", "012D",
+ "icaron", "01D0",
+ "icircle", "24D8",
+ "icircumflex", "00EE",
+ "icyrillic", "0456",
+ "idblgrave", "0209",
+ "ideographearthcircle", "328F",
+ "ideographfirecircle", "328B",
+ "ideographicallianceparen", "323F",
+ "ideographiccallparen", "323A",
+ "ideographiccentrecircle", "32A5",
+ "ideographicclose", "3006",
+ "ideographiccomma", "3001",
+ "ideographiccommaleft", "FF64",
+ "ideographiccongratulationparen", "3237",
+ "ideographiccorrectcircle", "32A3",
+ "ideographicearthparen", "322F",
+ "ideographicenterpriseparen", "323D",
+ "ideographicexcellentcircle", "329D",
+ "ideographicfestivalparen", "3240",
+ "ideographicfinancialcircle", "3296",
+ "ideographicfinancialparen", "3236",
+ "ideographicfireparen", "322B",
+ "ideographichaveparen", "3232",
+ "ideographichighcircle", "32A4",
+ "ideographiciterationmark", "3005",
+ "ideographiclaborcircle", "3298",
+ "ideographiclaborparen", "3238",
+ "ideographicleftcircle", "32A7",
+ "ideographiclowcircle", "32A6",
+ "ideographicmedicinecircle", "32A9",
+ "ideographicmetalparen", "322E",
+ "ideographicmoonparen", "322A",
+ "ideographicnameparen", "3234",
+ "ideographicperiod", "3002",
+ "ideographicprintcircle", "329E",
+ "ideographicreachparen", "3243",
+ "ideographicrepresentparen", "3239",
+ "ideographicresourceparen", "323E",
+ "ideographicrightcircle", "32A8",
+ "ideographicsecretcircle", "3299",
+ "ideographicselfparen", "3242",
+ "ideographicsocietyparen", "3233",
+ "ideographicspace", "3000",
+ "ideographicspecialparen", "3235",
+ "ideographicstockparen", "3231",
+ "ideographicstudyparen", "323B",
+ "ideographicsunparen", "3230",
+ "ideographicsuperviseparen", "323C",
+ "ideographicwaterparen", "322C",
+ "ideographicwoodparen", "322D",
+ "ideographiczero", "3007",
+ "ideographmetalcircle", "328E",
+ "ideographmooncircle", "328A",
+ "ideographnamecircle", "3294",
+ "ideographsuncircle", "3290",
+ "ideographwatercircle", "328C",
+ "ideographwoodcircle", "328D",
+ "ideva", "0907",
+ "idieresis", "00EF",
+ "idieresisacute", "1E2F",
+ "idieresiscyrillic", "04E5",
+ "idotbelow", "1ECB",
+ "iebrevecyrillic", "04D7",
+ "iecyrillic", "0435",
+ "ieungacirclekorean", "3275",
+ "ieungaparenkorean", "3215",
+ "ieungcirclekorean", "3267",
+ "ieungkorean", "3147",
+ "ieungparenkorean", "3207",
+ "igrave", "00EC",
+ "igujarati", "0A87",
+ "igurmukhi", "0A07",
+ "ihiragana", "3044",
+ "ihookabove", "1EC9",
+ "iibengali", "0988",
+ "iicyrillic", "0438",
+ "iideva", "0908",
+ "iigujarati", "0A88",
+ "iigurmukhi", "0A08",
+ "iimatragurmukhi", "0A40",
+ "iinvertedbreve", "020B",
+ "iishortcyrillic", "0439",
+ "iivowelsignbengali", "09C0",
+ "iivowelsigndeva", "0940",
+ "iivowelsigngujarati", "0AC0",
+ "ij", "0133",
+ "ikatakana", "30A4",
+ "ikatakanahalfwidth", "FF72",
+ "ikorean", "3163",
+ "ilde", "02DC",
+ "iluyhebrew", "05AC",
+ "imacron", "012B",
+ "imacroncyrillic", "04E3",
+ "imageorapproximatelyequal", "2253",
+ "imatragurmukhi", "0A3F",
+ "imonospace", "FF49",
+ "increment", "2206",
+ "infinity", "221E",
+ "iniarmenian", "056B",
+ "integral", "222B",
+ "integralbottom", "2321",
+ "integralbt", "2321",
+ "integraltop", "2320",
+ "integraltp", "2320",
+ "intersection", "2229",
+ "intisquare", "3305",
+ "invbullet", "25D8",
+ "invcircle", "25D9",
+ "invsmileface", "263B",
+ "iocyrillic", "0451",
+ "iogonek", "012F",
+ "iota", "03B9",
+ "iotadieresis", "03CA",
+ "iotadieresistonos", "0390",
+ "iotalatin", "0269",
+ "iotatonos", "03AF",
+ "iparen", "24A4",
+ "irigurmukhi", "0A72",
+ "ismallhiragana", "3043",
+ "ismallkatakana", "30A3",
+ "ismallkatakanahalfwidth", "FF68",
+ "issharbengali", "09FA",
+ "istroke", "0268",
+ "iterationhiragana", "309D",
+ "iterationkatakana", "30FD",
+ "itilde", "0129",
+ "itildebelow", "1E2D",
+ "iubopomofo", "3129",
+ "iucyrillic", "044E",
+ "ivowelsignbengali", "09BF",
+ "ivowelsigndeva", "093F",
+ "ivowelsigngujarati", "0ABF",
+ "izhitsacyrillic", "0475",
+ "izhitsadblgravecyrillic", "0477",
+ "j", "006A",
+ "jaarmenian", "0571",
+ "jabengali", "099C",
+ "jadeva", "091C",
+ "jagujarati", "0A9C",
+ "jagurmukhi", "0A1C",
+ "jbopomofo", "3110",
+ "jcaron", "01F0",
+ "jcircle", "24D9",
+ "jcircumflex", "0135",
+ "jcrossedtail", "029D",
+ "jdotlessstroke", "025F",
+ "jecyrillic", "0458",
+ "jeemarabic", "062C",
+ "jeemfinalarabic", "FE9E",
+ "jeeminitialarabic", "FE9F",
+ "jeemmedialarabic", "FEA0",
+ "jeharabic", "0698",
+ "jehfinalarabic", "FB8B",
+ "jhabengali", "099D",
+ "jhadeva", "091D",
+ "jhagujarati", "0A9D",
+ "jhagurmukhi", "0A1D",
+ "jheharmenian", "057B",
+ "jis", "3004",
+ "jmonospace", "FF4A",
+ "jparen", "24A5",
+ "jsuperior", "02B2",
+ "k", "006B",
+ "kabashkircyrillic", "04A1",
+ "kabengali", "0995",
+ "kacute", "1E31",
+ "kacyrillic", "043A",
+ "kadescendercyrillic", "049B",
+ "kadeva", "0915",
+ "kaf", "05DB",
+ "kafarabic", "0643",
+ "kafdagesh", "FB3B",
+ "kafdageshhebrew", "FB3B",
+ "kaffinalarabic", "FEDA",
+ "kafhebrew", "05DB",
+ "kafinitialarabic", "FEDB",
+ "kafmedialarabic", "FEDC",
+ "kafrafehebrew", "FB4D",
+ "kagujarati", "0A95",
+ "kagurmukhi", "0A15",
+ "kahiragana", "304B",
+ "kahookcyrillic", "04C4",
+ "kakatakana", "30AB",
+ "kakatakanahalfwidth", "FF76",
+ "kappa", "03BA",
+ "kappasymbolgreek", "03F0",
+ "kapyeounmieumkorean", "3171",
+ "kapyeounphieuphkorean", "3184",
+ "kapyeounpieupkorean", "3178",
+ "kapyeounssangpieupkorean", "3179",
+ "karoriisquare", "330D",
+ "kashidaautoarabic", "0640",
+ "kashidaautonosidebearingarabic", "0640",
+ "kasmallkatakana", "30F5",
+ "kasquare", "3384",
+ "kasraarabic", "0650",
+ "kasratanarabic", "064D",
+ "kastrokecyrillic", "049F",
+ "katahiraprolongmarkhalfwidth", "FF70",
+ "kaverticalstrokecyrillic", "049D",
+ "kbopomofo", "310E",
+ "kcalsquare", "3389",
+ "kcaron", "01E9",
+ "kcedilla", "0137",
+ "kcircle", "24DA",
+ "kcommaaccent", "0137",
+ "kdotbelow", "1E33",
+ "keharmenian", "0584",
+ "kehiragana", "3051",
+ "kekatakana", "30B1",
+ "kekatakanahalfwidth", "FF79",
+ "kenarmenian", "056F",
+ "kesmallkatakana", "30F6",
+ "kgreenlandic", "0138",
+ "khabengali", "0996",
+ "khacyrillic", "0445",
+ "khadeva", "0916",
+ "khagujarati", "0A96",
+ "khagurmukhi", "0A16",
+ "khaharabic", "062E",
+ "khahfinalarabic", "FEA6",
+ "khahinitialarabic", "FEA7",
+ "khahmedialarabic", "FEA8",
+ "kheicoptic", "03E7",
+ "khhadeva", "0959",
+ "khhagurmukhi", "0A59",
+ "khieukhacirclekorean", "3278",
+ "khieukhaparenkorean", "3218",
+ "khieukhcirclekorean", "326A",
+ "khieukhkorean", "314B",
+ "khieukhparenkorean", "320A",
+ "khokhaithai", "0E02",
+ "khokhonthai", "0E05",
+ "khokhuatthai", "0E03",
+ "khokhwaithai", "0E04",
+ "khomutthai", "0E5B",
+ "khook", "0199",
+ "khorakhangthai", "0E06",
+ "khzsquare", "3391",
+ "kihiragana", "304D",
+ "kikatakana", "30AD",
+ "kikatakanahalfwidth", "FF77",
+ "kiroguramusquare", "3315",
+ "kiromeetorusquare", "3316",
+ "kirosquare", "3314",
+ "kiyeokacirclekorean", "326E",
+ "kiyeokaparenkorean", "320E",
+ "kiyeokcirclekorean", "3260",
+ "kiyeokkorean", "3131",
+ "kiyeokparenkorean", "3200",
+ "kiyeoksioskorean", "3133",
+ "kjecyrillic", "045C",
+ "klinebelow", "1E35",
+ "klsquare", "3398",
+ "kmcubedsquare", "33A6",
+ "kmonospace", "FF4B",
+ "kmsquaredsquare", "33A2",
+ "kohiragana", "3053",
+ "kohmsquare", "33C0",
+ "kokaithai", "0E01",
+ "kokatakana", "30B3",
+ "kokatakanahalfwidth", "FF7A",
+ "kooposquare", "331E",
+ "koppacyrillic", "0481",
+ "koreanstandardsymbol", "327F",
+ "koroniscmb", "0343",
+ "kparen", "24A6",
+ "kpasquare", "33AA",
+ "ksicyrillic", "046F",
+ "ktsquare", "33CF",
+ "kturned", "029E",
+ "kuhiragana", "304F",
+ "kukatakana", "30AF",
+ "kukatakanahalfwidth", "FF78",
+ "kvsquare", "33B8",
+ "kwsquare", "33BE",
+ "l", "006C",
+ "labengali", "09B2",
+ "lacute", "013A",
+ "ladeva", "0932",
+ "lagujarati", "0AB2",
+ "lagurmukhi", "0A32",
+ "lakkhangyaothai", "0E45",
+ "lamaleffinalarabic", "FEFC",
+ "lamalefhamzaabovefinalarabic", "FEF8",
+ "lamalefhamzaaboveisolatedarabic", "FEF7",
+ "lamalefhamzabelowfinalarabic", "FEFA",
+ "lamalefhamzabelowisolatedarabic", "FEF9",
+ "lamalefisolatedarabic", "FEFB",
+ "lamalefmaddaabovefinalarabic", "FEF6",
+ "lamalefmaddaaboveisolatedarabic", "FEF5",
+ "lamarabic", "0644",
+ "lambda", "03BB",
+ "lambdastroke", "019B",
+ "lamed", "05DC",
+ "lameddagesh", "FB3C",
+ "lameddageshhebrew", "FB3C",
+ "lamedhebrew", "05DC",
+ "lamedholam", "05DC_05B9",
+ "lamedholamdagesh", "05DC_05B9_05BC",
+ "lamedholamdageshhebrew", "05DC_05B9_05BC",
+ "lamedholamhebrew", "05DC_05B9",
+ "lamfinalarabic", "FEDE",
+ "lamhahinitialarabic", "FCCA",
+ "laminitialarabic", "FEDF",
+ "lamjeeminitialarabic", "FCC9",
+ "lamkhahinitialarabic", "FCCB",
+ "lamlamhehisolatedarabic", "FDF2",
+ "lammedialarabic", "FEE0",
+ "lammeemhahinitialarabic", "FD88",
+ "lammeeminitialarabic", "FCCC",
+ "lammeemjeeminitialarabic", "FEDF_FEE4_FEA0",
+ "lammeemkhahinitialarabic", "FEDF_FEE4_FEA8",
+ "largecircle", "25EF",
+ "lbar", "019A",
+ "lbelt", "026C",
+ "lbopomofo", "310C",
+ "lcaron", "013E",
+ "lcedilla", "013C",
+ "lcircle", "24DB",
+ "lcircumflexbelow", "1E3D",
+ "lcommaaccent", "013C",
+ "ldot", "0140",
+ "ldotaccent", "0140",
+ "ldotbelow", "1E37",
+ "ldotbelowmacron", "1E39",
+ "leftangleabovecmb", "031A",
+ "lefttackbelowcmb", "0318",
+ "less", "003C",
+ "lessequal", "2264",
+ "lessequalorgreater", "22DA",
+ "lessmonospace", "FF1C",
+ "lessorequivalent", "2272",
+ "lessorgreater", "2276",
+ "lessoverequal", "2266",
+ "lesssmall", "FE64",
+ "lezh", "026E",
+ "lfblock", "258C",
+ "lhookretroflex", "026D",
+ "lira", "20A4",
+ "liwnarmenian", "056C",
+ "lj", "01C9",
+ "ljecyrillic", "0459",
+ "lladeva", "0933",
+ "llagujarati", "0AB3",
+ "llinebelow", "1E3B",
+ "llladeva", "0934",
+ "llvocalicbengali", "09E1",
+ "llvocalicdeva", "0961",
+ "llvocalicvowelsignbengali", "09E3",
+ "llvocalicvowelsigndeva", "0963",
+ "lmiddletilde", "026B",
+ "lmonospace", "FF4C",
+ "lmsquare", "33D0",
+ "lochulathai", "0E2C",
+ "logicaland", "2227",
+ "logicalnot", "00AC",
+ "logicalnotreversed", "2310",
+ "logicalor", "2228",
+ "lolingthai", "0E25",
+ "longs", "017F",
+ "lowlinecenterline", "FE4E",
+ "lowlinecmb", "0332",
+ "lowlinedashed", "FE4D",
+ "lozenge", "25CA",
+ "lparen", "24A7",
+ "lslash", "0142",
+ "lsquare", "2113",
+ "ltshade", "2591",
+ "luthai", "0E26",
+ "lvocalicbengali", "098C",
+ "lvocalicdeva", "090C",
+ "lvocalicvowelsignbengali", "09E2",
+ "lvocalicvowelsigndeva", "0962",
+ "lxsquare", "33D3",
+ "m", "006D",
+ "mabengali", "09AE",
+ "macron", "00AF",
+ "macronbelowcmb", "0331",
+ "macroncmb", "0304",
+ "macronlowmod", "02CD",
+ "macronmonospace", "FFE3",
+ "macute", "1E3F",
+ "madeva", "092E",
+ "magujarati", "0AAE",
+ "magurmukhi", "0A2E",
+ "mahapakhhebrew", "05A4",
+ "mahapakhlefthebrew", "05A4",
+ "mahiragana", "307E",
+ "maichattawathai", "0E4B",
+ "maiekthai", "0E48",
+ "maihanakatthai", "0E31",
+ "maitaikhuthai", "0E47",
+ "maithothai", "0E49",
+ "maitrithai", "0E4A",
+ "maiyamokthai", "0E46",
+ "makatakana", "30DE",
+ "makatakanahalfwidth", "FF8F",
+ "male", "2642",
+ "mansyonsquare", "3347",
+ "maqafhebrew", "05BE",
+ "mars", "2642",
+ "masoracirclehebrew", "05AF",
+ "masquare", "3383",
+ "mbopomofo", "3107",
+ "mbsquare", "33D4",
+ "mcircle", "24DC",
+ "mcubedsquare", "33A5",
+ "mdotaccent", "1E41",
+ "mdotbelow", "1E43",
+ "meemarabic", "0645",
+ "meemfinalarabic", "FEE2",
+ "meeminitialarabic", "FEE3",
+ "meemmedialarabic", "FEE4",
+ "meemmeeminitialarabic", "FCD1",
+ "meemmeemisolatedarabic", "FC48",
+ "meetorusquare", "334D",
+ "mehiragana", "3081",
+ "meizierasquare", "337E",
+ "mekatakana", "30E1",
+ "mekatakanahalfwidth", "FF92",
+ "mem", "05DE",
+ "memdagesh", "FB3E",
+ "memdageshhebrew", "FB3E",
+ "memhebrew", "05DE",
+ "menarmenian", "0574",
+ "merkhahebrew", "05A5",
+ "merkhakefulahebrew", "05A6",
+ "merkhakefulalefthebrew", "05A6",
+ "merkhalefthebrew", "05A5",
+ "mhook", "0271",
+ "mhzsquare", "3392",
+ "middledotkatakanahalfwidth", "FF65",
+ "middot", "00B7",
+ "mieumacirclekorean", "3272",
+ "mieumaparenkorean", "3212",
+ "mieumcirclekorean", "3264",
+ "mieumkorean", "3141",
+ "mieumpansioskorean", "3170",
+ "mieumparenkorean", "3204",
+ "mieumpieupkorean", "316E",
+ "mieumsioskorean", "316F",
+ "mihiragana", "307F",
+ "mikatakana", "30DF",
+ "mikatakanahalfwidth", "FF90",
+ "minus", "2212",
+ "minusbelowcmb", "0320",
+ "minuscircle", "2296",
+ "minusmod", "02D7",
+ "minusplus", "2213",
+ "minute", "2032",
+ "miribaarusquare", "334A",
+ "mirisquare", "3349",
+ "mlonglegturned", "0270",
+ "mlsquare", "3396",
+ "mmcubedsquare", "33A3",
+ "mmonospace", "FF4D",
+ "mmsquaredsquare", "339F",
+ "mohiragana", "3082",
+ "mohmsquare", "33C1",
+ "mokatakana", "30E2",
+ "mokatakanahalfwidth", "FF93",
+ "molsquare", "33D6",
+ "momathai", "0E21",
+ "moverssquare", "33A7",
+ "moverssquaredsquare", "33A8",
+ "mparen", "24A8",
+ "mpasquare", "33AB",
+ "mssquare", "33B3",
+ "mturned", "026F",
+ "mu", "03BC", # groff: not U+00B5
+ "mu1", "00B5",
+ "muasquare", "3382",
+ "muchgreater", "226B",
+ "muchless", "226A",
+ "mufsquare", "338C",
+ "mugreek", "03BC",
+ "mugsquare", "338D",
+ "muhiragana", "3080",
+ "mukatakana", "30E0",
+ "mukatakanahalfwidth", "FF91",
+ "mulsquare", "3395",
+ "multiply", "00D7",
+ "mumsquare", "339B",
+ "munahhebrew", "05A3",
+ "munahlefthebrew", "05A3",
+ "musicalnote", "266A",
+ "musicalnotedbl", "266B",
+ "musicflatsign", "266D",
+ "musicsharpsign", "266F",
+ "mussquare", "33B2",
+ "muvsquare", "33B6",
+ "muwsquare", "33BC",
+ "mvmegasquare", "33B9",
+ "mvsquare", "33B7",
+ "mwmegasquare", "33BF",
+ "mwsquare", "33BD",
+ "n", "006E",
+ "nabengali", "09A8",
+ "nabla", "2207",
+ "nacute", "0144",
+ "nadeva", "0928",
+ "nagujarati", "0AA8",
+ "nagurmukhi", "0A28",
+ "nahiragana", "306A",
+ "nakatakana", "30CA",
+ "nakatakanahalfwidth", "FF85",
+ "napostrophe", "0149",
+ "nasquare", "3381",
+ "nbopomofo", "310B",
+ "nbspace", "00A0",
+ "ncaron", "0148",
+ "ncedilla", "0146",
+ "ncircle", "24DD",
+ "ncircumflexbelow", "1E4B",
+ "ncommaaccent", "0146",
+ "ndotaccent", "1E45",
+ "ndotbelow", "1E47",
+ "nehiragana", "306D",
+ "nekatakana", "30CD",
+ "nekatakanahalfwidth", "FF88",
+ "newsheqelsign", "20AA",
+ "nfsquare", "338B",
+ "ngabengali", "0999",
+ "ngadeva", "0919",
+ "ngagujarati", "0A99",
+ "ngagurmukhi", "0A19",
+ "ngonguthai", "0E07",
+ "nhiragana", "3093",
+ "nhookleft", "0272",
+ "nhookretroflex", "0273",
+ "nieunacirclekorean", "326F",
+ "nieunaparenkorean", "320F",
+ "nieuncieuckorean", "3135",
+ "nieuncirclekorean", "3261",
+ "nieunhieuhkorean", "3136",
+ "nieunkorean", "3134",
+ "nieunpansioskorean", "3168",
+ "nieunparenkorean", "3201",
+ "nieunsioskorean", "3167",
+ "nieuntikeutkorean", "3166",
+ "nihiragana", "306B",
+ "nikatakana", "30CB",
+ "nikatakanahalfwidth", "FF86",
+ "nikhahitthai", "0E4D",
+ "nine", "0039",
+ "ninearabic", "0669",
+ "ninebengali", "09EF",
+ "ninecircle", "2468",
+ "ninecircleinversesansserif", "2792",
+ "ninedeva", "096F",
+ "ninegujarati", "0AEF",
+ "ninegurmukhi", "0A6F",
+ "ninehackarabic", "0669",
+ "ninehangzhou", "3029",
+ "nineideographicparen", "3228",
+ "nineinferior", "2089",
+ "ninemonospace", "FF19",
+ "nineparen", "247C",
+ "nineperiod", "2490",
+ "ninepersian", "06F9",
+ "nineroman", "2178",
+ "ninesuperior", "2079",
+ "nineteencircle", "2472",
+ "nineteenparen", "2486",
+ "nineteenperiod", "249A",
+ "ninethai", "0E59",
+ "nj", "01CC",
+ "njecyrillic", "045A",
+ "nkatakana", "30F3",
+ "nkatakanahalfwidth", "FF9D",
+ "nlegrightlong", "019E",
+ "nlinebelow", "1E49",
+ "nmonospace", "FF4E",
+ "nmsquare", "339A",
+ "nnabengali", "09A3",
+ "nnadeva", "0923",
+ "nnagujarati", "0AA3",
+ "nnagurmukhi", "0A23",
+ "nnnadeva", "0929",
+ "nohiragana", "306E",
+ "nokatakana", "30CE",
+ "nokatakanahalfwidth", "FF89",
+ "nonbreakingspace", "00A0",
+ "nonenthai", "0E13",
+ "nonuthai", "0E19",
+ "noonarabic", "0646",
+ "noonfinalarabic", "FEE6",
+ "noonghunnaarabic", "06BA",
+ "noonghunnafinalarabic", "FB9F",
+ "noonhehinitialarabic", "FEE7_FEEC",
+ "nooninitialarabic", "FEE7",
+ "noonjeeminitialarabic", "FCD2",
+ "noonjeemisolatedarabic", "FC4B",
+ "noonmedialarabic", "FEE8",
+ "noonmeeminitialarabic", "FCD5",
+ "noonmeemisolatedarabic", "FC4E",
+ "noonnoonfinalarabic", "FC8D",
+ "notcontains", "220C",
+ "notelement", "2209",
+ "notelementof", "2209",
+ "notequal", "2260",
+ "notgreater", "226F",
+ "notgreaternorequal", "2271",
+ "notgreaternorless", "2279",
+ "notidentical", "2262",
+ "notless", "226E",
+ "notlessnorequal", "2270",
+ "notparallel", "2226",
+ "notprecedes", "2280",
+ "notsubset", "2284",
+ "notsucceeds", "2281",
+ "notsuperset", "2285",
+ "nowarmenian", "0576",
+ "nparen", "24A9",
+ "nssquare", "33B1",
+ "nsuperior", "207F",
+ "ntilde", "00F1",
+ "nu", "03BD",
+ "nuhiragana", "306C",
+ "nukatakana", "30CC",
+ "nukatakanahalfwidth", "FF87",
+ "nuktabengali", "09BC",
+ "nuktadeva", "093C",
+ "nuktagujarati", "0ABC",
+ "nuktagurmukhi", "0A3C",
+ "numbersign", "0023",
+ "numbersignmonospace", "FF03",
+ "numbersignsmall", "FE5F",
+ "numeralsigngreek", "0374",
+ "numeralsignlowergreek", "0375",
+ "numero", "2116",
+ "nun", "05E0",
+ "nundagesh", "FB40",
+ "nundageshhebrew", "FB40",
+ "nunhebrew", "05E0",
+ "nvsquare", "33B5",
+ "nwsquare", "33BB",
+ "nyabengali", "099E",
+ "nyadeva", "091E",
+ "nyagujarati", "0A9E",
+ "nyagurmukhi", "0A1E",
+ "o", "006F",
+ "oacute", "00F3",
+ "oangthai", "0E2D",
+ "obarred", "0275",
+ "obarredcyrillic", "04E9",
+ "obarreddieresiscyrillic", "04EB",
+ "obengali", "0993",
+ "obopomofo", "311B",
+ "obreve", "014F",
+ "ocandradeva", "0911",
+ "ocandragujarati", "0A91",
+ "ocandravowelsigndeva", "0949",
+ "ocandravowelsigngujarati", "0AC9",
+ "ocaron", "01D2",
+ "ocircle", "24DE",
+ "ocircumflex", "00F4",
+ "ocircumflexacute", "1ED1",
+ "ocircumflexdotbelow", "1ED9",
+ "ocircumflexgrave", "1ED3",
+ "ocircumflexhookabove", "1ED5",
+ "ocircumflextilde", "1ED7",
+ "ocyrillic", "043E",
+ "odblacute", "0151",
+ "odblgrave", "020D",
+ "odeva", "0913",
+ "odieresis", "00F6",
+ "odieresiscyrillic", "04E7",
+ "odotbelow", "1ECD",
+ "oe", "0153",
+ "oekorean", "315A",
+ "ogonek", "02DB",
+ "ogonekcmb", "0328",
+ "ograve", "00F2",
+ "ogujarati", "0A93",
+ "oharmenian", "0585",
+ "ohiragana", "304A",
+ "ohookabove", "1ECF",
+ "ohorn", "01A1",
+ "ohornacute", "1EDB",
+ "ohorndotbelow", "1EE3",
+ "ohorngrave", "1EDD",
+ "ohornhookabove", "1EDF",
+ "ohorntilde", "1EE1",
+ "ohungarumlaut", "0151",
+ "oi", "01A3",
+ "oinvertedbreve", "020F",
+ "okatakana", "30AA",
+ "okatakanahalfwidth", "FF75",
+ "okorean", "3157",
+ "olehebrew", "05AB",
+ "omacron", "014D",
+ "omacronacute", "1E53",
+ "omacrongrave", "1E51",
+ "omdeva", "0950",
+ "omega", "03C9",
+ "omega1", "03D6",
+ "omegacyrillic", "0461",
+ "omegalatinclosed", "0277",
+ "omegaroundcyrillic", "047B",
+ "omegatitlocyrillic", "047D",
+ "omegatonos", "03CE",
+ "omgujarati", "0AD0",
+ "omicron", "03BF",
+ "omicrontonos", "03CC",
+ "omonospace", "FF4F",
+ "one", "0031",
+ "onearabic", "0661",
+ "onebengali", "09E7",
+ "onecircle", "2460",
+ "onecircleinversesansserif", "278A",
+ "onedeva", "0967",
+ "onedotenleader", "2024",
+ "oneeighth", "215B",
+ "onegujarati", "0AE7",
+ "onegurmukhi", "0A67",
+ "onehackarabic", "0661",
+ "onehalf", "00BD",
+ "onehangzhou", "3021",
+ "oneideographicparen", "3220",
+ "oneinferior", "2081",
+ "onemonospace", "FF11",
+ "onenumeratorbengali", "09F4",
+ "oneparen", "2474",
+ "oneperiod", "2488",
+ "onepersian", "06F1",
+ "onequarter", "00BC",
+ "oneroman", "2170",
+ "onesuperior", "00B9",
+ "onethai", "0E51",
+ "onethird", "2153",
+ "oogonek", "01EB",
+ "oogonekmacron", "01ED",
+ "oogurmukhi", "0A13",
+ "oomatragurmukhi", "0A4B",
+ "oopen", "0254",
+ "oparen", "24AA",
+ "openbullet", "25E6",
+ "option", "2325",
+ "ordfeminine", "00AA",
+ "ordmasculine", "00BA",
+ "orthogonal", "221F",
+ "oshortdeva", "0912",
+ "oshortvowelsigndeva", "094A",
+ "oslash", "00F8",
+ "oslashacute", "01FF",
+ "osmallhiragana", "3049",
+ "osmallkatakana", "30A9",
+ "osmallkatakanahalfwidth", "FF6B",
+ "ostrokeacute", "01FF",
+ "otcyrillic", "047F",
+ "otilde", "00F5",
+ "otildeacute", "1E4D",
+ "otildedieresis", "1E4F",
+ "oubopomofo", "3121",
+ "overline", "203E",
+ "overlinecenterline", "FE4A",
+ "overlinecmb", "0305",
+ "overlinedashed", "FE49",
+ "overlinedblwavy", "FE4C",
+ "overlinewavy", "FE4B",
+ "overscore", "00AF",
+ "ovowelsignbengali", "09CB",
+ "ovowelsigndeva", "094B",
+ "ovowelsigngujarati", "0ACB",
+ "p", "0070",
+ "paampssquare", "3380",
+ "paasentosquare", "332B",
+ "pabengali", "09AA",
+ "pacute", "1E55",
+ "padeva", "092A",
+ "pagedown", "21DF",
+ "pageup", "21DE",
+ "pagujarati", "0AAA",
+ "pagurmukhi", "0A2A",
+ "pahiragana", "3071",
+ "paiyannoithai", "0E2F",
+ "pakatakana", "30D1",
+ "palatalizationcyrilliccmb", "0484",
+ "palochkacyrillic", "04C0",
+ "pansioskorean", "317F",
+ "paragraph", "00B6",
+ "parallel", "2225",
+ "parenleft", "0028",
+ "parenleftaltonearabic", "FD3E",
+ "parenleftinferior", "208D",
+ "parenleftmonospace", "FF08",
+ "parenleftsmall", "FE59",
+ "parenleftsuperior", "207D",
+ "parenleftvertical", "FE35",
+ "parenright", "0029",
+ "parenrightaltonearabic", "FD3F",
+ "parenrightinferior", "208E",
+ "parenrightmonospace", "FF09",
+ "parenrightsmall", "FE5A",
+ "parenrightsuperior", "207E",
+ "parenrightvertical", "FE36",
+ "partialdiff", "2202",
+ "paseqhebrew", "05C0",
+ "pashtahebrew", "0599",
+ "pasquare", "33A9",
+ "patah", "05B7",
+ "patah11", "05B7",
+ "patah1d", "05B7",
+ "patah2a", "05B7",
+ "patahhebrew", "05B7",
+ "patahnarrowhebrew", "05B7",
+ "patahquarterhebrew", "05B7",
+ "patahwidehebrew", "05B7",
+ "pazerhebrew", "05A1",
+ "pbopomofo", "3106",
+ "pcircle", "24DF",
+ "pdotaccent", "1E57",
+ "pe", "05E4",
+ "pecyrillic", "043F",
+ "pedagesh", "FB44",
+ "pedageshhebrew", "FB44",
+ "peezisquare", "333B",
+ "pefinaldageshhebrew", "FB43",
+ "peharabic", "067E",
+ "peharmenian", "057A",
+ "pehebrew", "05E4",
+ "pehfinalarabic", "FB57",
+ "pehinitialarabic", "FB58",
+ "pehiragana", "307A",
+ "pehmedialarabic", "FB59",
+ "pekatakana", "30DA",
+ "pemiddlehookcyrillic", "04A7",
+ "perafehebrew", "FB4E",
+ "percent", "0025",
+ "percentarabic", "066A",
+ "percentmonospace", "FF05",
+ "percentsmall", "FE6A",
+ "period", "002E",
+ "periodarmenian", "0589",
+ "periodcentered", "00B7",
+ "periodhalfwidth", "FF61",
+ "periodmonospace", "FF0E",
+ "periodsmall", "FE52",
+ "perispomenigreekcmb", "0342",
+ "perpendicular", "22A5",
+ "perthousand", "2030",
+ "peseta", "20A7",
+ "pfsquare", "338A",
+ "phabengali", "09AB",
+ "phadeva", "092B",
+ "phagujarati", "0AAB",
+ "phagurmukhi", "0A2B",
+ "phi", "03C6",
+ "phi1", "03D5",
+ "phieuphacirclekorean", "327A",
+ "phieuphaparenkorean", "321A",
+ "phieuphcirclekorean", "326C",
+ "phieuphkorean", "314D",
+ "phieuphparenkorean", "320C",
+ "philatin", "0278",
+ "phinthuthai", "0E3A",
+ "phisymbolgreek", "03D5",
+ "phook", "01A5",
+ "phophanthai", "0E1E",
+ "phophungthai", "0E1C",
+ "phosamphaothai", "0E20",
+ "pi", "03C0",
+ "pieupacirclekorean", "3273",
+ "pieupaparenkorean", "3213",
+ "pieupcieuckorean", "3176",
+ "pieupcirclekorean", "3265",
+ "pieupkiyeokkorean", "3172",
+ "pieupkorean", "3142",
+ "pieupparenkorean", "3205",
+ "pieupsioskiyeokkorean", "3174",
+ "pieupsioskorean", "3144",
+ "pieupsiostikeutkorean", "3175",
+ "pieupthieuthkorean", "3177",
+ "pieuptikeutkorean", "3173",
+ "pihiragana", "3074",
+ "pikatakana", "30D4",
+ "pisymbolgreek", "03D6",
+ "piwrarmenian", "0583",
+ "plus", "002B",
+ "plusbelowcmb", "031F",
+ "pluscircle", "2295",
+ "plusminus", "00B1",
+ "plusmod", "02D6",
+ "plusmonospace", "FF0B",
+ "plussmall", "FE62",
+ "plussuperior", "207A",
+ "pmonospace", "FF50",
+ "pmsquare", "33D8",
+ "pohiragana", "307D",
+ "pointingindexdownwhite", "261F",
+ "pointingindexleftwhite", "261C",
+ "pointingindexrightwhite", "261E",
+ "pointingindexupwhite", "261D",
+ "pokatakana", "30DD",
+ "poplathai", "0E1B",
+ "postalmark", "3012",
+ "postalmarkface", "3020",
+ "pparen", "24AB",
+ "precedes", "227A",
+ "prescription", "211E",
+ "primemod", "02B9",
+ "primereversed", "2035",
+ "product", "220F",
+ "projective", "2305",
+ "prolongedkana", "30FC",
+ "propellor", "2318",
+ "propersubset", "2282",
+ "propersuperset", "2283",
+ "proportion", "2237",
+ "proportional", "221D",
+ "psi", "03C8",
+ "psicyrillic", "0471",
+ "psilipneumatacyrilliccmb", "0486",
+ "pssquare", "33B0",
+ "puhiragana", "3077",
+ "pukatakana", "30D7",
+ "pvsquare", "33B4",
+ "pwsquare", "33BA",
+ "q", "0071",
+ "qadeva", "0958",
+ "qadmahebrew", "05A8",
+ "qafarabic", "0642",
+ "qaffinalarabic", "FED6",
+ "qafinitialarabic", "FED7",
+ "qafmedialarabic", "FED8",
+ "qamats", "05B8",
+ "qamats10", "05B8",
+ "qamats1a", "05B8",
+ "qamats1c", "05B8",
+ "qamats27", "05B8",
+ "qamats29", "05B8",
+ "qamats33", "05B8",
+ "qamatsde", "05B8",
+ "qamatshebrew", "05B8",
+ "qamatsnarrowhebrew", "05B8",
+ "qamatsqatanhebrew", "05B8",
+ "qamatsqatannarrowhebrew", "05B8",
+ "qamatsqatanquarterhebrew", "05B8",
+ "qamatsqatanwidehebrew", "05B8",
+ "qamatsquarterhebrew", "05B8",
+ "qamatswidehebrew", "05B8",
+ "qarneyparahebrew", "059F",
+ "qbopomofo", "3111",
+ "qcircle", "24E0",
+ "qhook", "02A0",
+ "qmonospace", "FF51",
+ "qof", "05E7",
+ "qofdagesh", "FB47",
+ "qofdageshhebrew", "FB47",
+ "qofhatafpatah", "05E7_05B2",
+ "qofhatafpatahhebrew", "05E7_05B2",
+ "qofhatafsegol", "05E7_05B1",
+ "qofhatafsegolhebrew", "05E7_05B1",
+ "qofhebrew", "05E7",
+ "qofhiriq", "05E7_05B4",
+ "qofhiriqhebrew", "05E7_05B4",
+ "qofholam", "05E7_05B9",
+ "qofholamhebrew", "05E7_05B9",
+ "qofpatah", "05E7_05B7",
+ "qofpatahhebrew", "05E7_05B7",
+ "qofqamats", "05E7_05B8",
+ "qofqamatshebrew", "05E7_05B8",
+ "qofqubuts", "05E7_05BB",
+ "qofqubutshebrew", "05E7_05BB",
+ "qofsegol", "05E7_05B6",
+ "qofsegolhebrew", "05E7_05B6",
+ "qofsheva", "05E7_05B0",
+ "qofshevahebrew", "05E7_05B0",
+ "qoftsere", "05E7_05B5",
+ "qoftserehebrew", "05E7_05B5",
+ "qparen", "24AC",
+ "quarternote", "2669",
+ "qubuts", "05BB",
+ "qubuts18", "05BB",
+ "qubuts25", "05BB",
+ "qubuts31", "05BB",
+ "qubutshebrew", "05BB",
+ "qubutsnarrowhebrew", "05BB",
+ "qubutsquarterhebrew", "05BB",
+ "qubutswidehebrew", "05BB",
+ "question", "003F",
+ "questionarabic", "061F",
+ "questionarmenian", "055E",
+ "questiondown", "00BF",
+ "questiongreek", "037E",
+ "questionmonospace", "FF1F",
+ "quotedbl", "0022",
+ "quotedblbase", "201E",
+ "quotedblleft", "201C",
+ "quotedblmonospace", "FF02",
+ "quotedblprime", "301E",
+ "quotedblprimereversed", "301D",
+ "quotedblright", "201D",
+ "quoteleft", "2018",
+ "quoteleftreversed", "201B",
+ "quotereversed", "201B",
+ "quoteright", "2019",
+ "quoterightn", "0149",
+ "quotesinglbase", "201A",
+ "quotesingle", "0027",
+ "quotesinglemonospace", "FF07",
+ "r", "0072",
+ "raarmenian", "057C",
+ "rabengali", "09B0",
+ "racute", "0155",
+ "radeva", "0930",
+ "radical", "221A",
+ "radoverssquare", "33AE",
+ "radoverssquaredsquare", "33AF",
+ "radsquare", "33AD",
+ "rafe", "05BF",
+ "rafehebrew", "05BF",
+ "ragujarati", "0AB0",
+ "ragurmukhi", "0A30",
+ "rahiragana", "3089",
+ "rakatakana", "30E9",
+ "rakatakanahalfwidth", "FF97",
+ "ralowerdiagonalbengali", "09F1",
+ "ramiddlediagonalbengali", "09F0",
+ "ramshorn", "0264",
+ "ratio", "2236",
+ "rbopomofo", "3116",
+ "rcaron", "0159",
+ "rcedilla", "0157",
+ "rcircle", "24E1",
+ "rcommaaccent", "0157",
+ "rdblgrave", "0211",
+ "rdotaccent", "1E59",
+ "rdotbelow", "1E5B",
+ "rdotbelowmacron", "1E5D",
+ "referencemark", "203B",
+ "reflexsubset", "2286",
+ "reflexsuperset", "2287",
+ "registered", "00AE",
+ "reharabic", "0631",
+ "reharmenian", "0580",
+ "rehfinalarabic", "FEAE",
+ "rehiragana", "308C",
+ "rehyehaleflamarabic", "0631_FEF3_FE8E_0644",
+ "rekatakana", "30EC",
+ "rekatakanahalfwidth", "FF9A",
+ "resh", "05E8",
+ "reshdageshhebrew", "FB48",
+ "reshhatafpatah", "05E8_05B2",
+ "reshhatafpatahhebrew", "05E8_05B2",
+ "reshhatafsegol", "05E8_05B1",
+ "reshhatafsegolhebrew", "05E8_05B1",
+ "reshhebrew", "05E8",
+ "reshhiriq", "05E8_05B4",
+ "reshhiriqhebrew", "05E8_05B4",
+ "reshholam", "05E8_05B9",
+ "reshholamhebrew", "05E8_05B9",
+ "reshpatah", "05E8_05B7",
+ "reshpatahhebrew", "05E8_05B7",
+ "reshqamats", "05E8_05B8",
+ "reshqamatshebrew", "05E8_05B8",
+ "reshqubuts", "05E8_05BB",
+ "reshqubutshebrew", "05E8_05BB",
+ "reshsegol", "05E8_05B6",
+ "reshsegolhebrew", "05E8_05B6",
+ "reshsheva", "05E8_05B0",
+ "reshshevahebrew", "05E8_05B0",
+ "reshtsere", "05E8_05B5",
+ "reshtserehebrew", "05E8_05B5",
+ "reversedtilde", "223D",
+ "reviahebrew", "0597",
+ "reviamugrashhebrew", "0597",
+ "revlogicalnot", "2310",
+ "rfishhook", "027E",
+ "rfishhookreversed", "027F",
+ "rhabengali", "09DD",
+ "rhadeva", "095D",
+ "rho", "03C1",
+ "rhook", "027D",
+ "rhookturned", "027B",
+ "rhookturnedsuperior", "02B5",
+ "rhosymbolgreek", "03F1",
+ "rhotichookmod", "02DE",
+ "rieulacirclekorean", "3271",
+ "rieulaparenkorean", "3211",
+ "rieulcirclekorean", "3263",
+ "rieulhieuhkorean", "3140",
+ "rieulkiyeokkorean", "313A",
+ "rieulkiyeoksioskorean", "3169",
+ "rieulkorean", "3139",
+ "rieulmieumkorean", "313B",
+ "rieulpansioskorean", "316C",
+ "rieulparenkorean", "3203",
+ "rieulphieuphkorean", "313F",
+ "rieulpieupkorean", "313C",
+ "rieulpieupsioskorean", "316B",
+ "rieulsioskorean", "313D",
+ "rieulthieuthkorean", "313E",
+ "rieultikeutkorean", "316A",
+ "rieulyeorinhieuhkorean", "316D",
+ "rightangle", "221F",
+ "righttackbelowcmb", "0319",
+ "righttriangle", "22BF",
+ "rihiragana", "308A",
+ "rikatakana", "30EA",
+ "rikatakanahalfwidth", "FF98",
+ "ring", "02DA",
+ "ringbelowcmb", "0325",
+ "ringcmb", "030A",
+ "ringhalfleft", "02BF",
+ "ringhalfleftarmenian", "0559",
+ "ringhalfleftbelowcmb", "031C",
+ "ringhalfleftcentered", "02D3",
+ "ringhalfright", "02BE",
+ "ringhalfrightbelowcmb", "0339",
+ "ringhalfrightcentered", "02D2",
+ "rinvertedbreve", "0213",
+ "rittorusquare", "3351",
+ "rlinebelow", "1E5F",
+ "rlongleg", "027C",
+ "rlonglegturned", "027A",
+ "rmonospace", "FF52",
+ "rohiragana", "308D",
+ "rokatakana", "30ED",
+ "rokatakanahalfwidth", "FF9B",
+ "roruathai", "0E23",
+ "rparen", "24AD",
+ "rrabengali", "09DC",
+ "rradeva", "0931",
+ "rragurmukhi", "0A5C",
+ "rreharabic", "0691",
+ "rrehfinalarabic", "FB8D",
+ "rrvocalicbengali", "09E0",
+ "rrvocalicdeva", "0960",
+ "rrvocalicgujarati", "0AE0",
+ "rrvocalicvowelsignbengali", "09C4",
+ "rrvocalicvowelsigndeva", "0944",
+ "rrvocalicvowelsigngujarati", "0AC4",
+ "rtblock", "2590",
+ "rturned", "0279",
+ "rturnedsuperior", "02B4",
+ "ruhiragana", "308B",
+ "rukatakana", "30EB",
+ "rukatakanahalfwidth", "FF99",
+ "rupeemarkbengali", "09F2",
+ "rupeesignbengali", "09F3",
+ "ruthai", "0E24",
+ "rvocalicbengali", "098B",
+ "rvocalicdeva", "090B",
+ "rvocalicgujarati", "0A8B",
+ "rvocalicvowelsignbengali", "09C3",
+ "rvocalicvowelsigndeva", "0943",
+ "rvocalicvowelsigngujarati", "0AC3",
+ "s", "0073",
+ "sabengali", "09B8",
+ "sacute", "015B",
+ "sacutedotaccent", "1E65",
+ "sadarabic", "0635",
+ "sadeva", "0938",
+ "sadfinalarabic", "FEBA",
+ "sadinitialarabic", "FEBB",
+ "sadmedialarabic", "FEBC",
+ "sagujarati", "0AB8",
+ "sagurmukhi", "0A38",
+ "sahiragana", "3055",
+ "sakatakana", "30B5",
+ "sakatakanahalfwidth", "FF7B",
+ "sallallahoualayhewasallamarabic", "FDFA",
+ "samekh", "05E1",
+ "samekhdagesh", "FB41",
+ "samekhdageshhebrew", "FB41",
+ "samekhhebrew", "05E1",
+ "saraaathai", "0E32",
+ "saraaethai", "0E41",
+ "saraaimaimalaithai", "0E44",
+ "saraaimaimuanthai", "0E43",
+ "saraamthai", "0E33",
+ "saraathai", "0E30",
+ "saraethai", "0E40",
+ "saraiithai", "0E35",
+ "saraithai", "0E34",
+ "saraothai", "0E42",
+ "saraueethai", "0E37",
+ "sarauethai", "0E36",
+ "sarauthai", "0E38",
+ "sarauuthai", "0E39",
+ "sbopomofo", "3119",
+ "scaron", "0161",
+ "scarondotaccent", "1E67",
+ "scedilla", "015F",
+ "schwa", "0259",
+ "schwacyrillic", "04D9",
+ "schwadieresiscyrillic", "04DB",
+ "schwahook", "025A",
+ "scircle", "24E2",
+ "scircumflex", "015D",
+ "scommaaccent", "0219",
+ "sdotaccent", "1E61",
+ "sdotbelow", "1E63",
+ "sdotbelowdotaccent", "1E69",
+ "seagullbelowcmb", "033C",
+ "second", "2033",
+ "secondtonechinese", "02CA",
+ "section", "00A7",
+ "seenarabic", "0633",
+ "seenfinalarabic", "FEB2",
+ "seeninitialarabic", "FEB3",
+ "seenmedialarabic", "FEB4",
+ "segol", "05B6",
+ "segol13", "05B6",
+ "segol1f", "05B6",
+ "segol2c", "05B6",
+ "segolhebrew", "05B6",
+ "segolnarrowhebrew", "05B6",
+ "segolquarterhebrew", "05B6",
+ "segoltahebrew", "0592",
+ "segolwidehebrew", "05B6",
+ "seharmenian", "057D",
+ "sehiragana", "305B",
+ "sekatakana", "30BB",
+ "sekatakanahalfwidth", "FF7E",
+ "semicolon", "003B",
+ "semicolonarabic", "061B",
+ "semicolonmonospace", "FF1B",
+ "semicolonsmall", "FE54",
+ "semivoicedmarkkana", "309C",
+ "semivoicedmarkkanahalfwidth", "FF9F",
+ "sentisquare", "3322",
+ "sentosquare", "3323",
+ "seven", "0037",
+ "sevenarabic", "0667",
+ "sevenbengali", "09ED",
+ "sevencircle", "2466",
+ "sevencircleinversesansserif", "2790",
+ "sevendeva", "096D",
+ "seveneighths", "215E",
+ "sevengujarati", "0AED",
+ "sevengurmukhi", "0A6D",
+ "sevenhackarabic", "0667",
+ "sevenhangzhou", "3027",
+ "sevenideographicparen", "3226",
+ "seveninferior", "2087",
+ "sevenmonospace", "FF17",
+ "sevenparen", "247A",
+ "sevenperiod", "248E",
+ "sevenpersian", "06F7",
+ "sevenroman", "2176",
+ "sevensuperior", "2077",
+ "seventeencircle", "2470",
+ "seventeenparen", "2484",
+ "seventeenperiod", "2498",
+ "seventhai", "0E57",
+ "sfthyphen", "00AD",
+ "shaarmenian", "0577",
+ "shabengali", "09B6",
+ "shacyrillic", "0448",
+ "shaddaarabic", "0651",
+ "shaddadammaarabic", "FC61",
+ "shaddadammatanarabic", "FC5E",
+ "shaddafathaarabic", "FC60",
+ "shaddafathatanarabic", "0651_064B",
+ "shaddakasraarabic", "FC62",
+ "shaddakasratanarabic", "FC5F",
+ "shade", "2592",
+ "shadedark", "2593",
+ "shadelight", "2591",
+ "shademedium", "2592",
+ "shadeva", "0936",
+ "shagujarati", "0AB6",
+ "shagurmukhi", "0A36",
+ "shalshelethebrew", "0593",
+ "shbopomofo", "3115",
+ "shchacyrillic", "0449",
+ "sheenarabic", "0634",
+ "sheenfinalarabic", "FEB6",
+ "sheeninitialarabic", "FEB7",
+ "sheenmedialarabic", "FEB8",
+ "sheicoptic", "03E3",
+ "sheqel", "20AA",
+ "sheqelhebrew", "20AA",
+ "sheva", "05B0",
+ "sheva115", "05B0",
+ "sheva15", "05B0",
+ "sheva22", "05B0",
+ "sheva2e", "05B0",
+ "shevahebrew", "05B0",
+ "shevanarrowhebrew", "05B0",
+ "shevaquarterhebrew", "05B0",
+ "shevawidehebrew", "05B0",
+ "shhacyrillic", "04BB",
+ "shimacoptic", "03ED",
+ "shin", "05E9",
+ "shindagesh", "FB49",
+ "shindageshhebrew", "FB49",
+ "shindageshshindot", "FB2C",
+ "shindageshshindothebrew", "FB2C",
+ "shindageshsindot", "FB2D",
+ "shindageshsindothebrew", "FB2D",
+ "shindothebrew", "05C1",
+ "shinhebrew", "05E9",
+ "shinshindot", "FB2A",
+ "shinshindothebrew", "FB2A",
+ "shinsindot", "FB2B",
+ "shinsindothebrew", "FB2B",
+ "shook", "0282",
+ "sigma", "03C3",
+ "sigma1", "03C2",
+ "sigmafinal", "03C2",
+ "sigmalunatesymbolgreek", "03F2",
+ "sihiragana", "3057",
+ "sikatakana", "30B7",
+ "sikatakanahalfwidth", "FF7C",
+ "siluqhebrew", "05BD",
+ "siluqlefthebrew", "05BD",
+ "similar", "223C",
+ "sindothebrew", "05C2",
+ "siosacirclekorean", "3274",
+ "siosaparenkorean", "3214",
+ "sioscieuckorean", "317E",
+ "sioscirclekorean", "3266",
+ "sioskiyeokkorean", "317A",
+ "sioskorean", "3145",
+ "siosnieunkorean", "317B",
+ "siosparenkorean", "3206",
+ "siospieupkorean", "317D",
+ "siostikeutkorean", "317C",
+ "six", "0036",
+ "sixarabic", "0666",
+ "sixbengali", "09EC",
+ "sixcircle", "2465",
+ "sixcircleinversesansserif", "278F",
+ "sixdeva", "096C",
+ "sixgujarati", "0AEC",
+ "sixgurmukhi", "0A6C",
+ "sixhackarabic", "0666",
+ "sixhangzhou", "3026",
+ "sixideographicparen", "3225",
+ "sixinferior", "2086",
+ "sixmonospace", "FF16",
+ "sixparen", "2479",
+ "sixperiod", "248D",
+ "sixpersian", "06F6",
+ "sixroman", "2175",
+ "sixsuperior", "2076",
+ "sixteencircle", "246F",
+ "sixteencurrencydenominatorbengali", "09F9",
+ "sixteenparen", "2483",
+ "sixteenperiod", "2497",
+ "sixthai", "0E56",
+ "slash", "002F",
+ "slashmonospace", "FF0F",
+ "slong", "017F",
+ "slongdotaccent", "1E9B",
+ "smileface", "263A",
+ "smonospace", "FF53",
+ "sofpasuqhebrew", "05C3",
+ "softhyphen", "00AD",
+ "softsigncyrillic", "044C",
+ "sohiragana", "305D",
+ "sokatakana", "30BD",
+ "sokatakanahalfwidth", "FF7F",
+ "soliduslongoverlaycmb", "0338",
+ "solidusshortoverlaycmb", "0337",
+ "sorusithai", "0E29",
+ "sosalathai", "0E28",
+ "sosothai", "0E0B",
+ "sosuathai", "0E2A",
+ "space", "0020",
+ "spacehackarabic", "0020",
+ "spade", "2660",
+ "spadesuitblack", "2660",
+ "spadesuitwhite", "2664",
+ "sparen", "24AE",
+ "squarebelowcmb", "033B",
+ "squarecc", "33C4",
+ "squarecm", "339D",
+ "squarediagonalcrosshatchfill", "25A9",
+ "squarehorizontalfill", "25A4",
+ "squarekg", "338F",
+ "squarekm", "339E",
+ "squarekmcapital", "33CE",
+ "squareln", "33D1",
+ "squarelog", "33D2",
+ "squaremg", "338E",
+ "squaremil", "33D5",
+ "squaremm", "339C",
+ "squaremsquared", "33A1",
+ "squareorthogonalcrosshatchfill", "25A6",
+ "squareupperlefttolowerrightfill", "25A7",
+ "squareupperrighttolowerleftfill", "25A8",
+ "squareverticalfill", "25A5",
+ "squarewhitewithsmallblack", "25A3",
+ "srsquare", "33DB",
+ "ssabengali", "09B7",
+ "ssadeva", "0937",
+ "ssagujarati", "0AB7",
+ "ssangcieuckorean", "3149",
+ "ssanghieuhkorean", "3185",
+ "ssangieungkorean", "3180",
+ "ssangkiyeokkorean", "3132",
+ "ssangnieunkorean", "3165",
+ "ssangpieupkorean", "3143",
+ "ssangsioskorean", "3146",
+ "ssangtikeutkorean", "3138",
+ "sterling", "00A3",
+ "sterlingmonospace", "FFE1",
+ "strokelongoverlaycmb", "0336",
+ "strokeshortoverlaycmb", "0335",
+ "subset", "2282",
+ "subsetnotequal", "228A",
+ "subsetorequal", "2286",
+ "succeeds", "227B",
+ "suchthat", "220B",
+ "suhiragana", "3059",
+ "sukatakana", "30B9",
+ "sukatakanahalfwidth", "FF7D",
+ "sukunarabic", "0652",
+ "summation", "2211",
+ "sun", "263C",
+ "superset", "2283",
+ "supersetnotequal", "228B",
+ "supersetorequal", "2287",
+ "svsquare", "33DC",
+ "syouwaerasquare", "337C",
+ "t", "0074",
+ "tabengali", "09A4",
+ "tackdown", "22A4",
+ "tackleft", "22A3",
+ "tadeva", "0924",
+ "tagujarati", "0AA4",
+ "tagurmukhi", "0A24",
+ "taharabic", "0637",
+ "tahfinalarabic", "FEC2",
+ "tahinitialarabic", "FEC3",
+ "tahiragana", "305F",
+ "tahmedialarabic", "FEC4",
+ "taisyouerasquare", "337D",
+ "takatakana", "30BF",
+ "takatakanahalfwidth", "FF80",
+ "tatweelarabic", "0640",
+ "tau", "03C4",
+ "tav", "05EA",
+ "tavdages", "FB4A",
+ "tavdagesh", "FB4A",
+ "tavdageshhebrew", "FB4A",
+ "tavhebrew", "05EA",
+ "tbar", "0167",
+ "tbopomofo", "310A",
+ "tcaron", "0165",
+ "tccurl", "02A8",
+ "tcedilla", "0163",
+ "tcheharabic", "0686",
+ "tchehfinalarabic", "FB7B",
+ "tchehinitialarabic", "FB7C",
+ "tchehmedialarabic", "FB7D",
+ "tchehmeeminitialarabic", "FB7C_FEE4",
+ "tcircle", "24E3",
+ "tcircumflexbelow", "1E71",
+ "tcommaaccent", "0163",
+ "tdieresis", "1E97",
+ "tdotaccent", "1E6B",
+ "tdotbelow", "1E6D",
+ "tecyrillic", "0442",
+ "tedescendercyrillic", "04AD",
+ "teharabic", "062A",
+ "tehfinalarabic", "FE96",
+ "tehhahinitialarabic", "FCA2",
+ "tehhahisolatedarabic", "FC0C",
+ "tehinitialarabic", "FE97",
+ "tehiragana", "3066",
+ "tehjeeminitialarabic", "FCA1",
+ "tehjeemisolatedarabic", "FC0B",
+ "tehmarbutaarabic", "0629",
+ "tehmarbutafinalarabic", "FE94",
+ "tehmedialarabic", "FE98",
+ "tehmeeminitialarabic", "FCA4",
+ "tehmeemisolatedarabic", "FC0E",
+ "tehnoonfinalarabic", "FC73",
+ "tekatakana", "30C6",
+ "tekatakanahalfwidth", "FF83",
+ "telephone", "2121",
+ "telephoneblack", "260E",
+ "telishagedolahebrew", "05A0",
+ "telishaqetanahebrew", "05A9",
+ "tencircle", "2469",
+ "tenideographicparen", "3229",
+ "tenparen", "247D",
+ "tenperiod", "2491",
+ "tenroman", "2179",
+ "tesh", "02A7",
+ "tet", "05D8",
+ "tetdagesh", "FB38",
+ "tetdageshhebrew", "FB38",
+ "tethebrew", "05D8",
+ "tetsecyrillic", "04B5",
+ "tevirhebrew", "059B",
+ "tevirlefthebrew", "059B",
+ "thabengali", "09A5",
+ "thadeva", "0925",
+ "thagujarati", "0AA5",
+ "thagurmukhi", "0A25",
+ "thalarabic", "0630",
+ "thalfinalarabic", "FEAC",
+ "thanthakhatthai", "0E4C",
+ "theharabic", "062B",
+ "thehfinalarabic", "FE9A",
+ "thehinitialarabic", "FE9B",
+ "thehmedialarabic", "FE9C",
+ "thereexists", "2203",
+ "therefore", "2234",
+ "theta", "03B8",
+ "theta1", "03D1",
+ "thetasymbolgreek", "03D1",
+ "thieuthacirclekorean", "3279",
+ "thieuthaparenkorean", "3219",
+ "thieuthcirclekorean", "326B",
+ "thieuthkorean", "314C",
+ "thieuthparenkorean", "320B",
+ "thirteencircle", "246C",
+ "thirteenparen", "2480",
+ "thirteenperiod", "2494",
+ "thonangmonthothai", "0E11",
+ "thook", "01AD",
+ "thophuthaothai", "0E12",
+ "thorn", "00FE",
+ "thothahanthai", "0E17",
+ "thothanthai", "0E10",
+ "thothongthai", "0E18",
+ "thothungthai", "0E16",
+ "thousandcyrillic", "0482",
+ "thousandsseparatorarabic", "066C",
+ "thousandsseparatorpersian", "066C",
+ "three", "0033",
+ "threearabic", "0663",
+ "threebengali", "09E9",
+ "threecircle", "2462",
+ "threecircleinversesansserif", "278C",
+ "threedeva", "0969",
+ "threeeighths", "215C",
+ "threegujarati", "0AE9",
+ "threegurmukhi", "0A69",
+ "threehackarabic", "0663",
+ "threehangzhou", "3023",
+ "threeideographicparen", "3222",
+ "threeinferior", "2083",
+ "threemonospace", "FF13",
+ "threenumeratorbengali", "09F6",
+ "threeparen", "2476",
+ "threeperiod", "248A",
+ "threepersian", "06F3",
+ "threequarters", "00BE",
+ "threeroman", "2172",
+ "threesuperior", "00B3",
+ "threethai", "0E53",
+ "thzsquare", "3394",
+ "tihiragana", "3061",
+ "tikatakana", "30C1",
+ "tikatakanahalfwidth", "FF81",
+ "tikeutacirclekorean", "3270",
+ "tikeutaparenkorean", "3210",
+ "tikeutcirclekorean", "3262",
+ "tikeutkorean", "3137",
+ "tikeutparenkorean", "3202",
+ "tilde", "02DC",
+ "tildebelowcmb", "0330",
+ "tildecmb", "0303",
+ "tildecomb", "0303",
+ "tildedoublecmb", "0360",
+ "tildeoperator", "223C",
+ "tildeoverlaycmb", "0334",
+ "tildeverticalcmb", "033E",
+ "timescircle", "2297",
+ "tipehahebrew", "0596",
+ "tipehalefthebrew", "0596",
+ "tippigurmukhi", "0A70",
+ "titlocyrilliccmb", "0483",
+ "tiwnarmenian", "057F",
+ "tlinebelow", "1E6F",
+ "tmonospace", "FF54",
+ "toarmenian", "0569",
+ "tohiragana", "3068",
+ "tokatakana", "30C8",
+ "tokatakanahalfwidth", "FF84",
+ "tonebarextrahighmod", "02E5",
+ "tonebarextralowmod", "02E9",
+ "tonebarhighmod", "02E6",
+ "tonebarlowmod", "02E8",
+ "tonebarmidmod", "02E7",
+ "tonefive", "01BD",
+ "tonesix", "0185",
+ "tonetwo", "01A8",
+ "tonos", "0384",
+ "tonsquare", "3327",
+ "topatakthai", "0E0F",
+ "tortoiseshellbracketleft", "3014",
+ "tortoiseshellbracketleftsmall", "FE5D",
+ "tortoiseshellbracketleftvertical", "FE39",
+ "tortoiseshellbracketright", "3015",
+ "tortoiseshellbracketrightsmall", "FE5E",
+ "tortoiseshellbracketrightvertical", "FE3A",
+ "totaothai", "0E15",
+ "tpalatalhook", "01AB",
+ "tparen", "24AF",
+ "trademark", "2122",
+ "tretroflexhook", "0288",
+ "triagdn", "25BC",
+ "triaglf", "25C4",
+ "triagrt", "25BA",
+ "triagup", "25B2",
+ "ts", "02A6",
+ "tsadi", "05E6",
+ "tsadidagesh", "FB46",
+ "tsadidageshhebrew", "FB46",
+ "tsadihebrew", "05E6",
+ "tsecyrillic", "0446",
+ "tsere", "05B5",
+ "tsere12", "05B5",
+ "tsere1e", "05B5",
+ "tsere2b", "05B5",
+ "tserehebrew", "05B5",
+ "tserenarrowhebrew", "05B5",
+ "tserequarterhebrew", "05B5",
+ "tserewidehebrew", "05B5",
+ "tshecyrillic", "045B",
+ "ttabengali", "099F",
+ "ttadeva", "091F",
+ "ttagujarati", "0A9F",
+ "ttagurmukhi", "0A1F",
+ "tteharabic", "0679",
+ "ttehfinalarabic", "FB67",
+ "ttehinitialarabic", "FB68",
+ "ttehmedialarabic", "FB69",
+ "tthabengali", "09A0",
+ "tthadeva", "0920",
+ "tthagujarati", "0AA0",
+ "tthagurmukhi", "0A20",
+ "tturned", "0287",
+ "tuhiragana", "3064",
+ "tukatakana", "30C4",
+ "tukatakanahalfwidth", "FF82",
+ "tusmallhiragana", "3063",
+ "tusmallkatakana", "30C3",
+ "tusmallkatakanahalfwidth", "FF6F",
+ "twelvecircle", "246B",
+ "twelveparen", "247F",
+ "twelveperiod", "2493",
+ "twelveroman", "217B",
+ "twentycircle", "2473",
+ "twentyhangzhou", "5344",
+ "twentyparen", "2487",
+ "twentyperiod", "249B",
+ "two", "0032",
+ "twoarabic", "0662",
+ "twobengali", "09E8",
+ "twocircle", "2461",
+ "twocircleinversesansserif", "278B",
+ "twodeva", "0968",
+ "twodotenleader", "2025",
+ "twodotleader", "2025",
+ "twodotleadervertical", "FE30",
+ "twogujarati", "0AE8",
+ "twogurmukhi", "0A68",
+ "twohackarabic", "0662",
+ "twohangzhou", "3022",
+ "twoideographicparen", "3221",
+ "twoinferior", "2082",
+ "twomonospace", "FF12",
+ "twonumeratorbengali", "09F5",
+ "twoparen", "2475",
+ "twoperiod", "2489",
+ "twopersian", "06F2",
+ "tworoman", "2171",
+ "twostroke", "01BB",
+ "twosuperior", "00B2",
+ "twothai", "0E52",
+ "twothirds", "2154",
+ "u", "0075",
+ "uacute", "00FA",
+ "ubar", "0289",
+ "ubengali", "0989",
+ "ubopomofo", "3128",
+ "ubreve", "016D",
+ "ucaron", "01D4",
+ "ucircle", "24E4",
+ "ucircumflex", "00FB",
+ "ucircumflexbelow", "1E77",
+ "ucyrillic", "0443",
+ "udattadeva", "0951",
+ "udblacute", "0171",
+ "udblgrave", "0215",
+ "udeva", "0909",
+ "udieresis", "00FC",
+ "udieresisacute", "01D8",
+ "udieresisbelow", "1E73",
+ "udieresiscaron", "01DA",
+ "udieresiscyrillic", "04F1",
+ "udieresisgrave", "01DC",
+ "udieresismacron", "01D6",
+ "udotbelow", "1EE5",
+ "ugrave", "00F9",
+ "ugujarati", "0A89",
+ "ugurmukhi", "0A09",
+ "uhiragana", "3046",
+ "uhookabove", "1EE7",
+ "uhorn", "01B0",
+ "uhornacute", "1EE9",
+ "uhorndotbelow", "1EF1",
+ "uhorngrave", "1EEB",
+ "uhornhookabove", "1EED",
+ "uhorntilde", "1EEF",
+ "uhungarumlaut", "0171",
+ "uhungarumlautcyrillic", "04F3",
+ "uinvertedbreve", "0217",
+ "ukatakana", "30A6",
+ "ukatakanahalfwidth", "FF73",
+ "ukcyrillic", "0479",
+ "ukorean", "315C",
+ "umacron", "016B",
+ "umacroncyrillic", "04EF",
+ "umacrondieresis", "1E7B",
+ "umatragurmukhi", "0A41",
+ "umonospace", "FF55",
+ "underscore", "005F",
+ "underscoredbl", "2017",
+ "underscoremonospace", "FF3F",
+ "underscorevertical", "FE33",
+ "underscorewavy", "FE4F",
+ "union", "222A",
+ "universal", "2200",
+ "uogonek", "0173",
+ "uparen", "24B0",
+ "upblock", "2580",
+ "upperdothebrew", "05C4",
+ "upsilon", "03C5",
+ "upsilondieresis", "03CB",
+ "upsilondieresistonos", "03B0",
+ "upsilonlatin", "028A",
+ "upsilontonos", "03CD",
+ "uptackbelowcmb", "031D",
+ "uptackmod", "02D4",
+ "uragurmukhi", "0A73",
+ "uring", "016F",
+ "ushortcyrillic", "045E",
+ "usmallhiragana", "3045",
+ "usmallkatakana", "30A5",
+ "usmallkatakanahalfwidth", "FF69",
+ "ustraightcyrillic", "04AF",
+ "ustraightstrokecyrillic", "04B1",
+ "utilde", "0169",
+ "utildeacute", "1E79",
+ "utildebelow", "1E75",
+ "uubengali", "098A",
+ "uudeva", "090A",
+ "uugujarati", "0A8A",
+ "uugurmukhi", "0A0A",
+ "uumatragurmukhi", "0A42",
+ "uuvowelsignbengali", "09C2",
+ "uuvowelsigndeva", "0942",
+ "uuvowelsigngujarati", "0AC2",
+ "uvowelsignbengali", "09C1",
+ "uvowelsigndeva", "0941",
+ "uvowelsigngujarati", "0AC1",
+ "v", "0076",
+ "vadeva", "0935",
+ "vagujarati", "0AB5",
+ "vagurmukhi", "0A35",
+ "vakatakana", "30F7",
+ "vav", "05D5",
+ "vavdagesh", "FB35",
+ "vavdagesh65", "FB35",
+ "vavdageshhebrew", "FB35",
+ "vavhebrew", "05D5",
+ "vavholam", "FB4B",
+ "vavholamhebrew", "FB4B",
+ "vavvavhebrew", "05F0",
+ "vavyodhebrew", "05F1",
+ "vcircle", "24E5",
+ "vdotbelow", "1E7F",
+ "vecyrillic", "0432",
+ "veharabic", "06A4",
+ "vehfinalarabic", "FB6B",
+ "vehinitialarabic", "FB6C",
+ "vehmedialarabic", "FB6D",
+ "vekatakana", "30F9",
+ "venus", "2640",
+ "verticalbar", "007C",
+ "verticallineabovecmb", "030D",
+ "verticallinebelowcmb", "0329",
+ "verticallinelowmod", "02CC",
+ "verticallinemod", "02C8",
+ "vewarmenian", "057E",
+ "vhook", "028B",
+ "vikatakana", "30F8",
+ "viramabengali", "09CD",
+ "viramadeva", "094D",
+ "viramagujarati", "0ACD",
+ "visargabengali", "0983",
+ "visargadeva", "0903",
+ "visargagujarati", "0A83",
+ "vmonospace", "FF56",
+ "voarmenian", "0578",
+ "voicediterationhiragana", "309E",
+ "voicediterationkatakana", "30FE",
+ "voicedmarkkana", "309B",
+ "voicedmarkkanahalfwidth", "FF9E",
+ "vokatakana", "30FA",
+ "vparen", "24B1",
+ "vtilde", "1E7D",
+ "vturned", "028C",
+ "vuhiragana", "3094",
+ "vukatakana", "30F4",
+ "w", "0077",
+ "wacute", "1E83",
+ "waekorean", "3159",
+ "wahiragana", "308F",
+ "wakatakana", "30EF",
+ "wakatakanahalfwidth", "FF9C",
+ "wakorean", "3158",
+ "wasmallhiragana", "308E",
+ "wasmallkatakana", "30EE",
+ "wattosquare", "3357",
+ "wavedash", "301C",
+ "wavyunderscorevertical", "FE34",
+ "wawarabic", "0648",
+ "wawfinalarabic", "FEEE",
+ "wawhamzaabovearabic", "0624",
+ "wawhamzaabovefinalarabic", "FE86",
+ "wbsquare", "33DD",
+ "wcircle", "24E6",
+ "wcircumflex", "0175",
+ "wdieresis", "1E85",
+ "wdotaccent", "1E87",
+ "wdotbelow", "1E89",
+ "wehiragana", "3091",
+ "weierstrass", "2118",
+ "wekatakana", "30F1",
+ "wekorean", "315E",
+ "weokorean", "315D",
+ "wgrave", "1E81",
+ "whitebullet", "25E6",
+ "whitecircle", "25CB",
+ "whitecircleinverse", "25D9",
+ "whitecornerbracketleft", "300E",
+ "whitecornerbracketleftvertical", "FE43",
+ "whitecornerbracketright", "300F",
+ "whitecornerbracketrightvertical", "FE44",
+ "whitediamond", "25C7",
+ "whitediamondcontainingblacksmalldiamond", "25C8",
+ "whitedownpointingsmalltriangle", "25BF",
+ "whitedownpointingtriangle", "25BD",
+ "whiteleftpointingsmalltriangle", "25C3",
+ "whiteleftpointingtriangle", "25C1",
+ "whitelenticularbracketleft", "3016",
+ "whitelenticularbracketright", "3017",
+ "whiterightpointingsmalltriangle", "25B9",
+ "whiterightpointingtriangle", "25B7",
+ "whitesmallsquare", "25AB",
+ "whitesmilingface", "263A",
+ "whitesquare", "25A1",
+ "whitestar", "2606",
+ "whitetelephone", "260F",
+ "whitetortoiseshellbracketleft", "3018",
+ "whitetortoiseshellbracketright", "3019",
+ "whiteuppointingsmalltriangle", "25B5",
+ "whiteuppointingtriangle", "25B3",
+ "wihiragana", "3090",
+ "wikatakana", "30F0",
+ "wikorean", "315F",
+ "wmonospace", "FF57",
+ "wohiragana", "3092",
+ "wokatakana", "30F2",
+ "wokatakanahalfwidth", "FF66",
+ "won", "20A9",
+ "wonmonospace", "FFE6",
+ "wowaenthai", "0E27",
+ "wparen", "24B2",
+ "wring", "1E98",
+ "wsuperior", "02B7",
+ "wturned", "028D",
+ "wynn", "01BF",
+ "x", "0078",
+ "xabovecmb", "033D",
+ "xbopomofo", "3112",
+ "xcircle", "24E7",
+ "xdieresis", "1E8D",
+ "xdotaccent", "1E8B",
+ "xeharmenian", "056D",
+ "xi", "03BE",
+ "xmonospace", "FF58",
+ "xparen", "24B3",
+ "xsuperior", "02E3",
+ "y", "0079",
+ "yaadosquare", "334E",
+ "yabengali", "09AF",
+ "yacute", "00FD",
+ "yadeva", "092F",
+ "yaekorean", "3152",
+ "yagujarati", "0AAF",
+ "yagurmukhi", "0A2F",
+ "yahiragana", "3084",
+ "yakatakana", "30E4",
+ "yakatakanahalfwidth", "FF94",
+ "yakorean", "3151",
+ "yamakkanthai", "0E4E",
+ "yasmallhiragana", "3083",
+ "yasmallkatakana", "30E3",
+ "yasmallkatakanahalfwidth", "FF6C",
+ "yatcyrillic", "0463",
+ "ycircle", "24E8",
+ "ycircumflex", "0177",
+ "ydieresis", "00FF",
+ "ydotaccent", "1E8F",
+ "ydotbelow", "1EF5",
+ "yeharabic", "064A",
+ "yehbarreearabic", "06D2",
+ "yehbarreefinalarabic", "FBAF",
+ "yehfinalarabic", "FEF2",
+ "yehhamzaabovearabic", "0626",
+ "yehhamzaabovefinalarabic", "FE8A",
+ "yehhamzaaboveinitialarabic", "FE8B",
+ "yehhamzaabovemedialarabic", "FE8C",
+ "yehinitialarabic", "FEF3",
+ "yehmedialarabic", "FEF4",
+ "yehmeeminitialarabic", "FCDD",
+ "yehmeemisolatedarabic", "FC58",
+ "yehnoonfinalarabic", "FC94",
+ "yehthreedotsbelowarabic", "06D1",
+ "yekorean", "3156",
+ "yen", "00A5",
+ "yenmonospace", "FFE5",
+ "yeokorean", "3155",
+ "yeorinhieuhkorean", "3186",
+ "yerahbenyomohebrew", "05AA",
+ "yerahbenyomolefthebrew", "05AA",
+ "yericyrillic", "044B",
+ "yerudieresiscyrillic", "04F9",
+ "yesieungkorean", "3181",
+ "yesieungpansioskorean", "3183",
+ "yesieungsioskorean", "3182",
+ "yetivhebrew", "059A",
+ "ygrave", "1EF3",
+ "yhook", "01B4",
+ "yhookabove", "1EF7",
+ "yiarmenian", "0575",
+ "yicyrillic", "0457",
+ "yikorean", "3162",
+ "yinyang", "262F",
+ "yiwnarmenian", "0582",
+ "ymonospace", "FF59",
+ "yod", "05D9",
+ "yoddagesh", "FB39",
+ "yoddageshhebrew", "FB39",
+ "yodhebrew", "05D9",
+ "yodyodhebrew", "05F2",
+ "yodyodpatahhebrew", "FB1F",
+ "yohiragana", "3088",
+ "yoikorean", "3189",
+ "yokatakana", "30E8",
+ "yokatakanahalfwidth", "FF96",
+ "yokorean", "315B",
+ "yosmallhiragana", "3087",
+ "yosmallkatakana", "30E7",
+ "yosmallkatakanahalfwidth", "FF6E",
+ "yotgreek", "03F3",
+ "yoyaekorean", "3188",
+ "yoyakorean", "3187",
+ "yoyakthai", "0E22",
+ "yoyingthai", "0E0D",
+ "yparen", "24B4",
+ "ypogegrammeni", "037A",
+ "ypogegrammenigreekcmb", "0345",
+ "yr", "01A6",
+ "yring", "1E99",
+ "ysuperior", "02B8",
+ "ytilde", "1EF9",
+ "yturned", "028E",
+ "yuhiragana", "3086",
+ "yuikorean", "318C",
+ "yukatakana", "30E6",
+ "yukatakanahalfwidth", "FF95",
+ "yukorean", "3160",
+ "yusbigcyrillic", "046B",
+ "yusbigiotifiedcyrillic", "046D",
+ "yuslittlecyrillic", "0467",
+ "yuslittleiotifiedcyrillic", "0469",
+ "yusmallhiragana", "3085",
+ "yusmallkatakana", "30E5",
+ "yusmallkatakanahalfwidth", "FF6D",
+ "yuyekorean", "318B",
+ "yuyeokorean", "318A",
+ "yyabengali", "09DF",
+ "yyadeva", "095F",
+ "z", "007A",
+ "zaarmenian", "0566",
+ "zacute", "017A",
+ "zadeva", "095B",
+ "zagurmukhi", "0A5B",
+ "zaharabic", "0638",
+ "zahfinalarabic", "FEC6",
+ "zahinitialarabic", "FEC7",
+ "zahiragana", "3056",
+ "zahmedialarabic", "FEC8",
+ "zainarabic", "0632",
+ "zainfinalarabic", "FEB0",
+ "zakatakana", "30B6",
+ "zaqefgadolhebrew", "0595",
+ "zaqefqatanhebrew", "0594",
+ "zarqahebrew", "0598",
+ "zayin", "05D6",
+ "zayindagesh", "FB36",
+ "zayindageshhebrew", "FB36",
+ "zayinhebrew", "05D6",
+ "zbopomofo", "3117",
+ "zcaron", "017E",
+ "zcircle", "24E9",
+ "zcircumflex", "1E91",
+ "zcurl", "0291",
+ "zdot", "017C",
+ "zdotaccent", "017C",
+ "zdotbelow", "1E93",
+ "zecyrillic", "0437",
+ "zedescendercyrillic", "0499",
+ "zedieresiscyrillic", "04DF",
+ "zehiragana", "305C",
+ "zekatakana", "30BC",
+ "zero", "0030",
+ "zeroarabic", "0660",
+ "zerobengali", "09E6",
+ "zerodeva", "0966",
+ "zerogujarati", "0AE6",
+ "zerogurmukhi", "0A66",
+ "zerohackarabic", "0660",
+ "zeroinferior", "2080",
+ "zeromonospace", "FF10",
+ "zeropersian", "06F0",
+ "zerosuperior", "2070",
+ "zerothai", "0E50",
+ "zerowidthjoiner", "FEFF",
+ "zerowidthnonjoiner", "200C",
+ "zerowidthspace", "200B",
+ "zeta", "03B6",
+ "zhbopomofo", "3113",
+ "zhearmenian", "056A",
+ "zhebrevecyrillic", "04C2",
+ "zhecyrillic", "0436",
+ "zhedescendercyrillic", "0497",
+ "zhedieresiscyrillic", "04DD",
+ "zihiragana", "3058",
+ "zikatakana", "30B8",
+ "zinorhebrew", "05AE",
+ "zlinebelow", "1E95",
+ "zmonospace", "FF5A",
+ "zohiragana", "305E",
+ "zokatakana", "30BE",
+ "zparen", "24B5",
+ "zretroflexhook", "0290",
+ "zstroke", "01B6",
+ "zuhiragana", "305A",
+ "zukatakana", "30BA",
+);
diff --git a/src/utils/afmtodit/make-afmtodit-tables b/src/utils/afmtodit/make-afmtodit-tables
new file mode 100755
index 0000000..937bb72
--- /dev/null
+++ b/src/utils/afmtodit/make-afmtodit-tables
@@ -0,0 +1,139 @@
+#! /bin/sh
+#
+# make-afmtodit-tables -- script for creating the 'unicode_decomposed'
+# and 'AGL_to_unicode' tables
+#
+# Copyright (C) 2005-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+#
+# usage:
+#
+# make-afmtodit-tables \
+# UnicodeData.txt version-string glyphlist.txt > afmtodit.in
+#
+# 'UnicodeData.txt' is the central database file from the Unicode
+# standard. Unfortunately, it doesn't contain a version number, which
+# must be thus provided manually as an additional parameter.
+#
+# 'glyphlist.txt' holds the Adobe Glyph List (AGL).
+#
+# This program needs a C preprocessor.
+#
+
+if [ $# -ne 3 ]
+then
+ echo "usage: $0 UnicodeData.txt UNICODE-VERSION-STRING" \
+ "glyphlist.txt > afmtodit.tables"
+ exit 2
+fi
+
+unicode_data="$1"
+unicode_version="$2"
+glyph_list="$3"
+
+for f in "$1" "$3"
+do
+ if ! [ -r "$f" ]
+ then
+ echo "$0: '$f' does not exist or is not readable" >&2
+ exit 1
+ fi
+done
+
+# Handle UnicodeData.txt.
+#
+# Remove ranges and control characters,
+# then extract the decomposition field,
+# then remove lines without decomposition,
+# then remove all compatibility decompositions.
+cat "$1" \
+| sed -e '/^[^;]*;</d' \
+| sed -e 's/;[^;]*;[^;]*;[^;]*;[^;]*;\([^;]*\);.*$/;\1/' \
+| sed -e '/^[^;]*;$/d' \
+| sed -e '/^[^;]*;</d' > $$1
+
+# Prepare input for running cpp.
+cat $$1 \
+| sed -e 's/^\([^;]*\);/#define \1 /' \
+ -e 's/ / u/g' > $$2
+cat $$1 \
+| sed -e 's/^\([^;]*\);.*$/\1 u\1/' >> $$2
+
+# Run C preprocessor to recursively decompose.
+"${CPP:-cpp}" $$2 $$3
+
+# Convert it back to original format.
+cat $$3 \
+| sed -e '/#/d' \
+ -e '/^$/d' \
+ -e 's/ \+/ /g' \
+ -e 's/ *$//' \
+ -e 's/u//g' \
+ -e 's/^\([^ ]*\) /\1;/' > $$4
+
+# Write comment.
+cat <<END
+# This table was algorithmically derived from the file 'UnicodeData.txt'
+# for Unicode $unicode_version, available from unicode.org,
+# on `date '+%Y-%m-%d'`.
+END
+
+# Emit first table.
+echo 'my %unicode_decomposed = ('
+cat $$4 \
+| sed -e 's/ /_/g' \
+ -e 's/\(.*\);\(.*\)/ "\1", "\2",/'
+echo ');'
+echo ''
+
+# Write comment.
+cat <<END
+# This table was algorithmically derived from the Adobe Glyph List (AGL)
+# file 'glyphlist.txt' from the GitHub Adobe Type Tools agl-aglfn
+# project, on `date '+%Y-%m-%d'`.
+#
+# See "groff:" comments for altered mappings.
+END
+
+# Convert AGL syntax to a chunk of Perl.
+cat "$3" \
+| sed -e '/#/d' \
+ -e 's/ /_/g' \
+ -e '/;\(E\|F[0-8]\)/d' \
+ -e 's/\(.*\);\(.*\)/ "\1", "\2",/' > $$5
+
+# Perform groff replacements.
+sed \
+ -e 's/\("Delta"\), "2206",$/\1, "0394", # groff: not U+2206/' \
+ -e 's/\("Omega"\), "2126",$/\1, "03A9", # groff: not U+2126/' \
+ -e 's/\("mu"\), "00B5",$/\1, "03BC", # groff: not U+00B5/' \
+ < $$5 > $$6
+
+# Emit second table.
+echo 'my %AGL_to_unicode = ('
+cat $$6
+echo ');'
+
+# Remove temporary files.
+rm $$1 $$2 $$3 $$4 $$5 $$6
+
+# Local Variables:
+# fill-column: 72
+# End:
+# vim: set textwidth=72:
diff --git a/src/utils/grog/grog.1.man b/src/utils/grog/grog.1.man
new file mode 100644
index 0000000..efcd728
--- /dev/null
+++ b/src/utils/grog/grog.1.man
@@ -0,0 +1,628 @@
+.TH grog @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+grog \- \(lqgroff guess\(rq\(eminfer the
+.I groff
+command a document requires
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2021 Free Software Foundation, Inc.
+.\"
+.\" This file is part of grog, which is part of groff, a free software
+.\" project. You can redistribute it and/or modify it under the terms
+.\" of the GNU General Public License version 2 (GPL2) as published by
+.\" the Free Software Foundation.
+.\"
+.\" 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.
+.\"
+.\" The text for GPL2 is available in the internet at
+.\" <http://www.gnu.org/licenses/gpl2.0.txt>.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_grog_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY grog
+.RB [ \-\-run ]
+.RB [ \-\-ligatures ]
+.RI [ groff-option\~ .\|.\|.\&]
+.RB [ \-\- ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY grog
+.B \-h
+.
+.SY grog
+.B \-\-help
+.YS
+.
+.
+.SY grog
+.B \-v
+.
+.SY grog
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I grog
+reads its input
+and guesses which
+.MR groff @MAN1EXT@
+options are needed to render it.
+.
+If no operands are given,
+or if
+.I file
+is
+.RB \[lq] \- \[rq],
+.I grog
+reads the standard input stream.
+.
+The corresponding
+.I groff
+command is normally written to the standard output stream.
+.
+With the option
+.BR \-\-run ,
+the inferred command is written to the standard error stream and then
+executed.
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-h
+and
+.B \-\-help
+display a usage message,
+whereas
+.B \-v
+and
+.B \-\-version
+display version information;
+all exit afterward.
+.
+.
+.TP
+.B \-\-ligatures
+includes the arguments
+.B \-P\-y \-PU
+in the inferred
+.I groff
+command.
+.
+These are supported only by the
+.B pdf
+output device.
+.
+.
+.TP
+.B \-\-run
+writes the inferred command to the standard error stream and then
+executes it.
+.
+.
+.P
+All other specified short options
+(that is,
+arguments beginning with a minus sign
+.RB \[lq] \- \[rq]
+followed by a letter)
+are interpreted as
+.I groff
+options or option clusters with or without an option argument.
+.
+Such options are included in the constructed
+.I groff
+command line.
+.
+.
+.\" ====================================================================
+.SH Details
+.\" ====================================================================
+.
+.I grog
+reads each
+.I file
+operand,
+pattern-matching strings that are statistically likely to be
+characteristic of
+.MR roff @MAN7EXT@
+documents.
+.
+It tries to guess which of the following
+.I groff
+options are required to correctly render the input:
+.BR \-e ,
+.BR \-g ,
+.BR \-G ,
+.BR \-j ,
+.\" gideal is not implemented yet.
+.\" .BR \-J ,
+.BR \-p ,
+.BR \-R ,
+.\".BR \-s ,
+.B \-t
+(preprocessors);
+and
+.BR \-man ,
+.BR \-mdoc ,
+.BR \-mdoc\-old ,
+.BR \-me ,
+.BR \-mm ,
+.BR \-mom ,
+and
+.B \-ms
+(macro packages).
+.
+The inferred
+.I groff
+command including these options and any
+.I file
+parameters is written to the standard output stream.
+.
+.
+.P
+It is possible to specify arbitrary
+.I groff
+options on the command line.
+.
+These are included in the inferred command without change.
+.
+Choices of
+.I groff
+options include
+.B \-C
+to enable AT&T
+.I troff
+compatibility mode and
+.B \-T
+to select a non-default output device.
+.
+If the input is not encoded in US-ASCII,
+ISO 8859-1,
+or IBM code page 1047,
+specification of a
+.I groff
+option to run the
+.MR preconv @MAN1EXT@
+preprocessor is advised;
+see the
+.BR \-D ,
+.BR \-k ,
+and
+.B \-K
+options of
+.MR groff @MAN1EXT@ .
+.
+For UTF-8 input,
+.B \-k
+is a good choice.
+.
+.
+.P
+.I groff
+may issue diagnostic messages when an inappropriate
+.B \-m
+option,
+or multiple conflicting ones,
+are specified.
+.
+Consequently,
+it is best to specify no
+.B \-m
+options to
+.I grog
+unless it cannot correctly infer all of the
+.B \-m
+arguments a document requires.
+.
+A
+.I roff
+document can also be written without recourse to any macro package.
+.
+In such cases,
+.I grog
+will infer a
+.I groff
+command without an
+.B \-m
+option.
+.
+.
+.\" ====================================================================
+.SS Limitations
+.\" ====================================================================
+.
+.I grog
+presumes that the input does not change the escape,
+control,
+or no-break control characters.
+.
+.I grog
+does not parse
+.I roff
+input line continuation or control structures
+(brace escape sequences and the
+.RB \[lq] if \[rq],
+.RB \[lq] ie \[rq],
+and
+.RB \[lq] el \[rq]
+requests)
+nor
+.IR groff 's
+.RB \[lq] while \[rq].
+.
+Thus the input
+.
+.RS
+.EX
+\&.if \[rs]
+t .NH 1
+\&.if n .SH
+Introduction
+.EE
+.RE
+.
+will conceal the use of the
+.I ms
+macros
+.B NH
+and
+.B SH
+from
+.IR grog .
+.
+Such constructions are regarded by
+.IR grog 's
+implementors as insufficiently common to cause many inference problems.
+.
+Preprocessors can be even stricter when matching macro calls that
+bracket the regions of an input file they replace.
+.
+.IR pic ,
+for example,
+requires
+.BR PS ,
+.BR PE ,
+and
+.B PF
+calls to immediately follow the default control character at the
+beginning of a line.
+.
+.
+.P
+Detection of the
+.B \-s
+option
+(the
+.MR @g@soelim @MAN1EXT@
+preprocessor)
+is tricky;
+to correctly infer its necessity would require
+.I grog
+to recursively open all files given as arguments to the
+.B .so
+request under the same conditions that
+.I @g@soelim
+itself does so;
+see its man page.
+.
+Recall that
+.I @g@soelim
+is necessary only if sourced files need to be preprocessed.
+.
+Therefore,
+as a workaround,
+you may want to run the input through
+.I @g@soelim
+manually,
+piping it to
+.IR grog ,
+and compare the output to running
+.I grog
+on the input directly.
+.
+If the
+.RI \[lq] @g@soelim \[rq]ed
+input causes
+.I grog
+to infer additional preprocessor options,
+then
+.B \-s
+is likely necessary.
+.
+.
+.RS
+.P
+.EX
+$ \c
+.B printf \[dq].TS\[rs]nl.\[rs]nI\[aq]m a table.\[rs]n.TE\[rs]n\[dq] > \
+3.roff
+$ \c
+.B printf \[dq].so 3.roff\[rs]n\[dq] > 2.roff
+$ \c
+.B printf \[dq].XP\[rs]n.so 2.roff\[rs]n\[dq] > 1.roff
+$ \c
+.B grog 1.roff
+groff \-ms 1.roff
+$ \c
+.B @g@soelim 1.roff | grog
+groff \-t \-ms \-
+.EE
+.RE
+.
+.
+.P
+In the foregoing example,
+we see that this procedure enabled
+.I grog
+to detect
+.MR @g@tbl @MAN1EXT@
+macros,
+so we would add
+.B \-s
+as well as the detected
+.B \-t
+option to a revised
+.I grog
+or
+.I groff
+command.
+.
+.
+.RS
+.P
+.EX
+$ \c
+.B grog \-st 1.roff
+groff \-st \-ms 1.roff
+.EE
+.RE
+.
+.
+.\" ====================================================================
+.SH "Exit status"
+.\" ====================================================================
+.
+.I grog
+exits with error status
+.B 1
+if a macro package appears to be in use by the input document,
+but
+.I grog
+was unable to infer which one,
+or
+.B 2
+if there were problems handling an option or operand.
+.
+It otherwise exits with status
+.BR 0 .
+.
+(If the
+.B \-\-run
+option is specified,
+.IR groff 's
+exit status is discarded.)
+.
+Inferring no preprocessors or macro packages is not an error condition;
+a valid
+.I roff
+document need not use either.
+.
+Even plain text is valid input,
+if one is mindful of the syntax of the control and escape characters.
+.
+.
+.\" ====================================================================
+.SH Examples
+.\" ====================================================================
+.
+Running
+.
+.RS
+.EX
+.B grog @DOCDIR@/meintro.me
+.EE
+.RE
+at the command line results in
+.RS
+.EX
+groff \-me @DOCDIR@/meintro.me
+.EE
+.RE
+.
+because
+.I grog
+recognizes that the file
+.I meintro.me
+is written using macros from the
+.I me
+package.
+.
+The command
+.
+.RS
+.EX
+.B grog @DOCDIR@/pic.ms
+.EE
+.RE
+.
+outputs
+.
+.RS
+.EX
+groff \-e \-p \-t \-ms @DOCDIR@/pic.ms
+.EE
+.RE
+.
+on the other hand.
+.
+Besides discerning the
+.I ms
+macro package,
+.I grog
+recognizes that the file
+.I pic.ms
+additionally needs the combination of
+.B \-t
+for
+.IR tbl ,
+.B \-e
+for
+.IR eqn ,
+and
+.B \-p
+for
+.IR pic .
+.
+.
+.\" XXX: grog no longer (June 2021) attempts to detect this scenario.
+.\" It's also not a practical one; full-service macro packages don't
+.\" generally support being "unloaded" for subsequent processing of
+.\" another document using a different one. We do achieve it, with
+.\" care, in groff with man(7) and mdoc(7) (see andoc.tmac).
+.\" .P
+.\" If both of the former example files are combined in the command
+.\" .
+.\" .RS
+.\" .EX
+.\" .B grog meintro.me pic.ms
+.\" .EE
+.\" .RE
+.\" .
+.\" a diagnostic message is sent to the standard error stream because
+.\" some macro packages cannot be combined.
+.\" .
+.\" Nevertheless the corresponding output with the wrong options is
+.\" written to standard output:
+.\" .
+.\" .RS
+.\" .EX
+.\" groff \-t \-e \-p \-ms meintro.me pic.ms
+.\" .EE
+.\" .RE
+.\" .
+.\" and
+.\" .I grog
+.\" terminates with an error exit status.
+.
+.
+.P
+Consider a file
+.IR \%doc/\:\%grnexampl.me ,
+which uses the
+.I @g@grn
+preprocessor to include a
+.MR gremlin 1
+picture file in an
+.I me \" generic
+document.
+.
+Let's say we want to suppress color output,
+produce a DVI file,
+and get backtraces for any errors that
+.I @g@troff
+encounters.
+.
+The command
+.
+.RS
+.EX
+.B grog \-bc \-Idoc \-Tdvi doc/grnexmpl.me
+.EE
+.RE
+.
+is processed by
+.I grog
+into
+.
+.RS
+.EX
+groff \-bc \-Idoc \-Tdvi \-e \-g \-me doc/grnexmpl.me
+.EE
+.RE
+.
+where we can see that
+.I grog
+has inferred the
+.I me \" generic
+macro package along with the
+.I eqn \" generic
+and
+.I grn \" generic
+preprocessors.
+.
+(The input file is located in
+.I @DOCDIR@
+if you'd like to try this example yourself.)
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+.I grog
+was originally written in Bourne shell by James Clark.
+.
+The current implementation in Perl was written by
+.MT groff\-bernd\:.warken\-72@\:web\:.de
+Bernd Warken
+.ME
+and heavily revised by
+.MT g.branden\:.robinson@\:gmail\:.com
+G.\& Branden Robinson
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.MR groff @MAN1EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_grog_1_man_C]
+.do rr *groff_grog_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/utils/grog/grog.am b/src/utils/grog/grog.am
new file mode 100644
index 0000000..f7ca5eb
--- /dev/null
+++ b/src/utils/grog/grog.am
@@ -0,0 +1,50 @@
+# Copyright (C) 1993-2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+grog_srcdir = $(top_srcdir)/src/utils/grog
+bin_SCRIPTS += grog
+man1_MANS += src/utils/grog/grog.1
+EXTRA_DIST += \
+ src/utils/grog/grog.1.man \
+ src/utils/grog/grog.pl \
+ src/utils/grog/tests/foo.man
+
+grog: $(grog_srcdir)/grog.pl $(SH_DEPS_SED_SCRIPT)
+ $(AM_V_GEN)$(RM) $@ \
+ && sed -f "$(SH_DEPS_SED_SCRIPT)" \
+ -e "s|[@]PERL[@]|$(PERL)|" \
+ -e "s|[@]VERSION[@]|$(VERSION)|" \
+ -e "$(SH_SCRIPT_SED_CMD)" \
+ $(grog_srcdir)/grog.pl \
+ >$@ \
+ && chmod +x $@
+
+grog_TESTS = \
+ src/utils/grog/tests/PF-does-not-start-pic-region.sh \
+ src/utils/grog/tests/avoid-refer-fakeout.sh \
+ src/utils/grog/tests/preserve-groff-options.sh \
+ src/utils/grog/tests/recognize-perl-pod.sh \
+ src/utils/grog/tests/smoke-test.sh
+TESTS += $(grog_TESTS)
+EXTRA_DIST += $(grog_TESTS)
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/utils/grog/grog.pl b/src/utils/grog/grog.pl
new file mode 100644
index 0000000..28973c5
--- /dev/null
+++ b/src/utils/grog/grog.pl
@@ -0,0 +1,721 @@
+#!@PERL@
+# grog - guess options for groff command
+# Inspired by doctype script in Kernighan & Pike, Unix Programming
+# Environment, pp 306-8.
+
+# Copyright (C) 1993-2021 Free Software Foundation, Inc.
+# Written by James Clark.
+# Rewritten in Perl by Bernd Warken <groff-bernd.warken-72@web.de>.
+# Hacked up by G. Branden Robinson, 2021.
+
+# This file is part of 'grog', 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 of the License, 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 this program. If not, see
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+use warnings;
+use strict;
+
+use File::Spec;
+
+my $groff_version = 'DEVELOPMENT';
+
+my @command = (); # the constructed groff command
+my @requested_package = (); # arguments to '-m' grog options
+my @inferred_preprocessor = (); # preprocessors the document uses
+my @inferred_main_package = (); # full-service package(s) detected
+my $main_package; # full-service package we go with
+my $do_run = 0; # run generated 'groff' command
+my $use_compatibility_mode = 0; # is -C being passed to groff?
+
+my %preprocessor_for_macro = (
+ 'EQ', 'eqn',
+ 'G1', 'grap',
+ 'GS', 'grn',
+ 'PS', 'pic',
+ '[', 'refer',
+ #'so', 'soelim', # Can't be inferred this way; see grog man page.
+ 'TS', 'tbl',
+ 'cstart', 'chem',
+ 'lilypond', 'glilypond',
+ 'Perl', 'gperl',
+ 'pinyin', 'gpinyin',
+);
+
+my $program_name = $0;
+{
+ my ($v, $d, $f) = File::Spec->splitpath($program_name);
+ $program_name = $f;
+}
+
+my %user_macro;
+my %score = ();
+
+my @input_file;
+
+# .TH is both a man(7) macro and often used with tbl(1). We expect to
+# find .TH in ms(7) documents only between .TS and .TE calls, and in
+# man(7) documents only as the first macro call.
+my $have_seen_first_macro_call = 0;
+# man(7) and ms(7) use many of the same macro names; do extra checking.
+my $man_score = 0;
+my $ms_score = 0;
+
+my $had_inference_problem = 0;
+my $had_processing_problem = 0;
+my $have_any_valid_arguments = 0;
+
+
+sub fail {
+ my $text = shift;
+ print STDERR "$program_name: error: $text\n";
+ $had_processing_problem = 1;
+}
+
+
+sub warn {
+ my $text = shift;
+ print STDERR "$program_name: warning: $text\n";
+}
+
+
+sub process_arguments {
+ my $no_more_options = 0;
+ my $delayed_option = '';
+ my $was_minus = 0;
+ my $optarg = 0;
+ my $pdf_with_ligatures = 0;
+
+ foreach my $arg (@ARGV) {
+ if ( $optarg ) {
+ push @command, $arg;
+ $optarg = 0;
+ next;
+ }
+
+ if ($no_more_options) {
+ push @input_file, $arg;
+ next;
+ }
+
+ if ($delayed_option) {
+ if ($delayed_option eq '-m') {
+ push @requested_package, $arg;
+ $arg = '';
+ } else {
+ push @command, $delayed_option;
+ }
+
+ push @command, $arg if $arg;
+ $delayed_option = '';
+ next;
+ }
+
+ unless ( $arg =~ /^-/ ) { # file name, no opt, no optarg
+ push @input_file, $arg;
+ next;
+ }
+
+ # now $arg starts with '-'
+
+ if ($arg eq '-') {
+ unless ($was_minus) {
+ push @input_file, $arg;
+ $was_minus = 1;
+ }
+ next;
+ }
+
+ if ($arg eq '--') {
+ $no_more_options = 1;
+ next;
+ }
+
+ # Handle options that cause an early exit.
+ &version() if ($arg eq '-v' || $arg eq '--version');
+ &usage(0) if ($arg eq '-h' || $arg eq '--help');
+
+ if ($arg =~ '^--.') {
+ if ($arg =~ '^--(run|with-ligatures)$') {
+ $do_run = 1 if ($arg eq '--run');
+ $pdf_with_ligatures = 1 if ($arg eq '--with-ligatures');
+ } else {
+ &fail("unrecognized grog option '$arg'; ignored");
+ &usage(1);
+ }
+ next;
+ }
+
+ # Handle groff options that take an argument.
+
+ # Handle the option argument being separated by whitespace.
+ if ($arg =~ /^-[dfFIKLmMnoPrTwW]$/) {
+ $delayed_option = $arg;
+ next;
+ }
+
+ # Handle '-m' option without subsequent whitespace.
+ if ($arg =~ /^-m/) {
+ my $package = $arg;
+ $package =~ s/-m//;
+ push @requested_package, $package;
+ next;
+ }
+
+ # Treat anything else as (possibly clustered) groff options that
+ # take no arguments.
+
+ # Our do_line() needs to know if it should do compatibility parsing.
+ $use_compatibility_mode = 1 if ($arg =~ /C/);
+
+ push @command, $arg;
+ }
+
+ if ($pdf_with_ligatures) {
+ push @command, '-P-y';
+ push @command, '-PU';
+ }
+
+ @input_file = ('-') unless (@input_file);
+} # process_arguments()
+
+
+sub process_input {
+ foreach my $file (@input_file) {
+ unless ( open(FILE, $file eq "-" ? $file : "< $file") ) {
+ &fail("cannot open '$file': $!");
+ next;
+ }
+
+ $have_any_valid_arguments = 1;
+
+ while (my $line = <FILE>) {
+ chomp $line;
+ &do_line($line);
+ }
+
+ close(FILE);
+ } # end foreach
+} # process_input()
+
+
+# Push item onto inferred full-service list only if not already present.
+sub push_main_package {
+ my $pkg = shift;
+ if (!grep(/^$pkg/, @inferred_main_package)) {
+ push @inferred_main_package, $pkg;
+ }
+} # push_main_package()
+
+
+sub do_line {
+ my $command; # request or macro name
+ my $args; # request or macro arguments
+
+ my $line = shift;
+
+ # Check for a Perl Pod::Man comment.
+ #
+ # An alternative to this kludge is noted below: if a "standard" macro
+ # is redefined, we could delete it from the relevant lists and
+ # hashes.
+ if ($line =~ /\\\" Automatically generated by Pod::Man/) {
+ $man_score += 100;
+ }
+
+ # Strip comments.
+ $line =~ s/\\".*//;
+ $line =~ s/\\#.*// unless $use_compatibility_mode;
+
+ return unless ($line =~ /^[.']/); # Ignore text lines.
+
+ # Perform preprocessor checks; they scan their inputs using a rump
+ # interpretation of roff(7) syntax that requires the default control
+ # character and no space between it and the macro name. In AT&T
+ # compatibility mode, no space (or newline!) is required after the
+ # macro name, either. We mimic the preprocessors themselves; eqn(1),
+ # for instance, does not recognize '.EN' if '.EQ' has not been seen.
+ my $boundary = '\\b';
+ $boundary = '' if ($use_compatibility_mode);
+
+ if ($line =~ /^\.(\S\S)$boundary/ || $line =~ /^\.(\[)/) {
+ my $macro = $1;
+ # groff identifiers can have extremely weird characters in them.
+ # The ones we care about are conventionally named, but me(7)
+ # documents can call macros like '+c', so quote carefully.
+ if (grep(/^\Q$macro\E$/, keys %preprocessor_for_macro)) {
+ my $preproc = $preprocessor_for_macro{$macro};
+ if (!grep(/$preproc/, @inferred_preprocessor)) {
+ push @inferred_preprocessor, $preproc;
+ }
+ }
+ }
+
+ # Normalize control lines; convert no-break control character to the
+ # regular one and remove unnecessary whitespace.
+ $line =~ s/^['.]\s*/./;
+ $line =~ s/\s+$//;
+
+ return if ($line =~ /^\.$/); # Ignore empty request.
+ return if ($line =~ /^\.\\?\.$/); # Ignore macro definition ends.
+
+ # Split control line into a request or macro call and its arguments.
+
+ # Handle single-letter macro names.
+ if ($line =~ /^\.(\S)(\s+(.*))?$/) {
+ $command = $1;
+ $args = $2;
+ # Handle two-letter macro/request names in compatibility mode.
+ } elsif ($use_compatibility_mode) {
+ $line =~ /^\.(\S\S)\s*(.*)$/;
+ $command = $1;
+ $args = $2;
+ # Handle multi-letter macro/request names in groff mode.
+ } else {
+ $line =~ /^\.(\S+)(\s+(.*))?$/;
+ $command = $1;
+ $args = $3;
+ }
+
+ $command = '' unless ($command);
+ $args = '' unless ($args);
+
+ ######################################################################
+ # user-defined macros
+
+ # If the line calls a user-defined macro, skip it.
+ return if (exists $user_macro{$command});
+
+ # These are all requests supported by groff 1.23.0.
+ my @request = ('ab', 'ad', 'af', 'aln', 'als', 'am', 'am1', 'ami',
+ 'ami1', 'as', 'as1', 'asciify', 'backtrace', 'bd',
+ 'blm', 'box', 'boxa', 'bp', 'br', 'brp', 'break', 'c2',
+ 'cc', 'ce', 'cf', 'cflags', 'ch', 'char', 'chop',
+ 'class', 'close', 'color', 'composite', 'continue',
+ 'cp', 'cs', 'cu', 'da', 'de', 'de1', 'defcolor', 'dei',
+ 'dei1', 'device', 'devicem', 'di', 'do', 'ds', 'ds1',
+ 'dt', 'ec', 'ecr', 'ecs', 'el', 'em', 'eo', 'ev',
+ 'evc', 'ex', 'fam', 'fc', 'fchar', 'fcolor', 'fi',
+ 'fp', 'fschar', 'fspecial', 'ft', 'ftr', 'fzoom',
+ 'gcolor', 'hc', 'hcode', 'hla', 'hlm', 'hpf', 'hpfa',
+ 'hpfcode', 'hw', 'hy', 'hym', 'hys', 'ie', 'if', 'ig',
+ 'in', 'it', 'itc', 'kern', 'lc', 'length', 'linetabs',
+ 'lf', 'lg', 'll', 'lsm', 'ls', 'lt', 'mc', 'mk', 'mso',
+ 'msoquiet', 'na', 'ne', 'nf', 'nh', 'nm', 'nn', 'nop',
+ 'nr', 'nroff', 'ns', 'nx', 'open', 'opena', 'os',
+ 'output', 'pc', 'pev', 'pi', 'pl', 'pm', 'pn', 'pnr',
+ 'po', 'ps', 'psbb', 'pso', 'ptr', 'pvs', 'rchar', 'rd',
+ 'return', 'rfschar', 'rj', 'rm', 'rn', 'rnn', 'rr',
+ 'rs', 'rt', 'schar', 'shc', 'shift', 'sizes', 'so',
+ 'soquiet', 'sp', 'special', 'spreadwarn', 'ss',
+ 'stringdown', 'stringup', 'sty', 'substring', 'sv',
+ 'sy', 'ta', 'tc', 'ti', 'tkf', 'tl', 'tm', 'tm1',
+ 'tmc', 'tr', 'trf', 'trin', 'trnt', 'troff', 'uf',
+ 'ul', 'unformat', 'vpt', 'vs', 'warn', 'warnscale',
+ 'wh', 'while', 'write', 'writec', 'writem');
+
+ # Add user-defined macro names to %user_macro.
+ #
+ # Macros can also be defined with .dei{,1}, ami{,1}, but supporting
+ # that would be a heavy lift for the benefit of users that probably
+ # don't require grog's help. --GBR
+ if ($command =~ /^(de|am)1?$/) {
+ my $name = $args;
+ # Strip off any end macro.
+ $name =~ s/\s+.*$//;
+ # Handle special cases of macros starting with '[' or ']'.
+ if ($name =~ /^[][]/) {
+ delete $preprocessor_for_macro{'['};
+ }
+ # XXX: If the macro name shadows a standard macro name, maybe we
+ # should delete the latter from our lists and hashes. This might
+ # depend on whether the document is trying to remain compatible
+ # with an existing interface, or simply colliding with names they
+ # don't care about (consider a raw roff document that defines 'PP').
+ # --GBR
+ $user_macro{$name} = 0 unless (exists $user_macro{$name});
+ return;
+ }
+
+ # XXX: Handle .rm as well?
+
+ # Ignore all other requests. Again, macro names can contain Perl
+ # regex metacharacters, so be careful.
+ return if (grep(/^\Q$command\E$/, @request));
+ # What remains must be a macro name.
+ my $macro = $command;
+
+ $have_seen_first_macro_call = 1;
+ $score{$macro}++;
+
+
+ ######################################################################
+ # macro package (tmac)
+ ######################################################################
+
+ # man and ms share too many macro names for the following approach to
+ # be fruitful for many documents; see &infer_man_or_ms_package.
+ #
+ # We can put one thumb on the scale, however.
+ if ((!$have_seen_first_macro_call) && ($macro eq 'TH')) {
+ # TH as the first call in a document screams man(7).
+ $man_score += 100;
+ }
+
+ ##########
+ # mdoc
+ if ($macro =~ /^Dd$/) {
+ &push_main_package('doc');
+ return;
+ }
+
+ ##########
+ # old mdoc
+ if ($macro =~ /^(Tp|Dp|De|Cx|Cl)$/) {
+ &push_main_package('doc-old');
+ return;
+ }
+
+ ##########
+ # me
+
+ if ($macro =~ /^(
+ [ilnp]p|
+ n[12]|
+ sh
+ )$/x) {
+ &push_main_package('e');
+ return;
+ }
+
+
+ #############
+ # mm and mmse
+
+ if ($macro =~ /^(
+ H|
+ MULB|
+ LO|
+ LT|
+ NCOL|
+ PH|
+ SA
+ )$/x) {
+ if ($macro =~ /^LO$/) {
+ if ( $args =~ /^(DNAMN|MDAT|BIL|KOMP|DBET|BET|SIDOR)/ ) {
+ &push_main_package('mse');
+ return;
+ }
+ } elsif ($macro =~ /^LT$/) {
+ if ( $args =~ /^(SVV|SVH)/ ) {
+ &push_main_package('mse');
+ return;
+ }
+ }
+ &push_main_package('m');
+ return;
+ }
+
+ ##########
+ # mom
+
+ if ($macro =~ /^(
+ ALD|
+ AUTHOR|
+ CHAPTER_TITLE|
+ CHAPTER|
+ COLLATE|
+ DOCHEADER|
+ DOCTITLE|
+ DOCTYPE|
+ DOC_COVER|
+ FAMILY|
+ FAM|
+ FT|
+ LEFT|
+ LL|
+ LS|
+ NEWPAGE|
+ NO_TOC_ENTRY|
+ PAGENUMBER|
+ PAGE|
+ PAGINATION|
+ PAPER|
+ PRINTSTYLE|
+ PT_SIZE|
+ START|
+ TITLE|
+ TOC_AFTER_HERE
+ TOC|
+ T_MARGIN|
+ )$/x) {
+ &push_main_package('om');
+ return;
+ }
+} # do_line()
+
+my @preprocessor = ();
+
+
+sub infer_preprocessors {
+ my %option_for_preprocessor = (
+ 'eqn', '-e',
+ 'grap', '-G',
+ 'grn', '-g',
+ 'pic', '-p',
+ 'refer', '-R',
+ #'soelim', '-s', # Can't be inferred this way; see grog man page.
+ 'tbl', '-t',
+ 'chem', '-j'
+ );
+
+ # Use a temporary list we can sort later. We want the options to show
+ # up in a stable order for testing purposes instead of the order their
+ # macros turn up in the input. groff doesn't care about the order.
+ my @opt = ();
+
+ foreach my $preproc (@inferred_preprocessor) {
+ my $preproc_option = $option_for_preprocessor{$preproc};
+
+ if ($preproc_option) {
+ push @opt, $preproc_option;
+ } else {
+ push @preprocessor, $preproc;
+ }
+ }
+ push @command, sort @opt;
+} # infer_preprocessors()
+
+
+# Return true (1) if either the man or ms package is inferred.
+sub infer_man_or_ms_package {
+ my @macro_ms = ('RP', 'TL', 'AU', 'AI', 'DA', 'ND', 'AB', 'AE',
+ 'QP', 'QS', 'QE', 'XP',
+ 'NH',
+ 'R',
+ 'CW',
+ 'BX', 'UL', 'LG', 'NL',
+ 'KS', 'KF', 'KE', 'B1', 'B2',
+ 'DS', 'DE', 'LD', 'ID', 'BD', 'CD', 'RD',
+ 'FS', 'FE',
+ 'OH', 'OF', 'EH', 'EF', 'P1',
+ 'TA', '1C', '2C', 'MC',
+ 'XS', 'XE', 'XA', 'TC', 'PX',
+ 'IX', 'SG');
+
+ my @macro_man = ('BR', 'IB', 'IR', 'RB', 'RI', 'P', 'TH', 'TP', 'SS',
+ 'HP', 'PD',
+ 'AT', 'UC',
+ 'SB',
+ 'EE', 'EX',
+ 'OP',
+ 'MT', 'ME', 'SY', 'YS', 'TQ', 'UR', 'UE');
+
+ my @macro_man_or_ms = ('B', 'I', 'BI',
+ 'DT',
+ 'RS', 'RE',
+ 'SH',
+ 'SM',
+ 'IP', 'LP', 'PP');
+
+ for my $key (@macro_man_or_ms, @macro_man, @macro_ms) {
+ $score{$key} = 0 unless exists $score{$key};
+ }
+
+ # Compute a score for each package by counting occurrences of their
+ # characteristic macros.
+ foreach my $key (@macro_man_or_ms) {
+ $man_score += $score{$key};
+ $ms_score += $score{$key};
+ }
+
+ foreach my $key (@macro_man) {
+ $man_score += $score{$key};
+ }
+
+ foreach my $key (@macro_ms) {
+ $ms_score += $score{$key};
+ }
+
+ if (!$ms_score && !$man_score) {
+ # The input may be a "raw" roff document; this is not a problem,
+ # but it does mean no package was inferred.
+ return 0;
+ } elsif ($ms_score == $man_score) {
+ # If there was no TH call, it's not a (valid) man(7) document.
+ if (!$score{'TH'}) {
+ &push_main_package('s');
+ } else {
+ &warn("document ambiguous; disambiguate with -man or -ms option");
+ $had_inference_problem = 1;
+ }
+ return 0;
+ } elsif ($ms_score > $man_score) {
+ &push_main_package('s');
+ } else {
+ &push_main_package('an');
+ }
+
+ return 1;
+} # infer_man_or_ms_package()
+
+
+sub construct_command {
+ my @main_package = ('an', 'doc', 'doc-old', 'e', 'm', 'om', 's');
+ my $file_args_included; # file args now only at 1st preproc
+ unshift @command, 'groff';
+ if (@preprocessor) {
+ my @progs;
+ $progs[0] = shift @preprocessor;
+ push(@progs, @input_file);
+ for (@preprocessor) {
+ push @progs, '|';
+ push @progs, $_;
+ }
+ push @progs, '|';
+ unshift @command, @progs;
+ $file_args_included = 1;
+ } else {
+ $file_args_included = 0;
+ }
+
+ foreach (@command) {
+ next unless /\s/;
+ # when one argument has several words, use accents
+ $_ = "'" . $_ . "'";
+ }
+
+ my $have_ambiguous_main_package = 0;
+ my $inferred_main_package_count = scalar @inferred_main_package;
+
+ # Did we infer multiple full-service packages?
+ if ($inferred_main_package_count > 1) {
+ $have_ambiguous_main_package = 1;
+ # For each one the user explicitly requested...
+ for my $pkg (@requested_package) {
+ # ...did it resolve the ambiguity for us?
+ if (grep(/$pkg/, @inferred_main_package)) {
+ @inferred_main_package = ($pkg);
+ $have_ambiguous_main_package = 0;
+ last;
+ }
+ }
+ } elsif ($inferred_main_package_count == 1) {
+ $main_package = shift @inferred_main_package;
+ }
+
+ if ($have_ambiguous_main_package) {
+ # TODO: Alphabetical is probably not the best ordering here. We
+ # should tally up scores on a per-package basis generally, not just
+ # for an and s.
+ for my $pkg (@main_package) {
+ if (grep(/$pkg/, @inferred_main_package)) {
+ $main_package = $pkg;
+ &warn("document ambiguous (choosing '$main_package'"
+ . " from '@inferred_main_package'); disambiguate with -m"
+ . " option");
+ $had_inference_problem = 1;
+ last;
+ }
+ }
+ }
+
+ # If a full-service package was explicitly requested, warn if the
+ # inference differs from the request. This also ensures that all -m
+ # arguments are placed in the same order that the user gave them;
+ # caveat dictator.
+ my @auxiliary_package_argument = ();
+ for my $pkg (@requested_package) {
+ my $is_auxiliary_package = 1;
+ if (grep(/$pkg/, @main_package)) {
+ $is_auxiliary_package = 0;
+ if ($pkg ne $main_package) {
+ &warn("overriding inferred package '$main_package'"
+ . " with requested package '$pkg'");
+ $main_package = $pkg;
+ }
+ }
+ if ($is_auxiliary_package) {
+ push @auxiliary_package_argument, "-m" . $pkg;
+ }
+ }
+
+ push @command, '-m' . $main_package if ($main_package);
+ push @command, @auxiliary_package_argument;
+ push @command, @input_file unless ($file_args_included);
+
+ #########
+ # execute the 'groff' command here with option '--run'
+ if ( $do_run ) { # with --run
+ print STDERR "@command\n";
+ my $cmd = join ' ', @command;
+ system($cmd);
+ } else {
+ print "@command\n";
+ }
+} # construct_command()
+
+
+sub usage {
+ my $stream = *STDOUT;
+ my $had_error = shift;
+ $stream = *STDERR if $had_error;
+ my $grog = $program_name;
+ print $stream "usage: $grog [--ligatures] [--run]" .
+ " [groff-option ...] [--] [file ...]\n" .
+ "usage: $grog {-v | --version}\n" .
+ "usage: $grog {-h | --help}\n";
+ unless ($had_error) {
+ print $stream "\n" .
+"Read each roff(7) input FILE and attempt to infer an appropriate\n" .
+"groff(1) command to format it. See the grog(1) manual page.\n";
+ }
+ exit $had_error;
+}
+
+
+sub version {
+ print "GNU $program_name (groff) $groff_version\n";
+ exit 0;
+} # version()
+
+
+# initialize
+
+my $in_unbuilt_source_tree = 0;
+{
+ my $at = '@';
+ $in_unbuilt_source_tree = 1 if ('@VERSION@' eq "${at}VERSION${at}");
+}
+
+$groff_version = '@VERSION@' unless ($in_unbuilt_source_tree);
+
+&process_arguments();
+&process_input();
+
+if ($have_any_valid_arguments) {
+ &infer_preprocessors();
+ &infer_man_or_ms_package() if (scalar @inferred_main_package != 1);
+ &construct_command();
+}
+
+exit 2 if ($had_processing_problem);
+exit 1 if ($had_inference_problem);
+exit 0;
+
+# Local Variables:
+# fill-column: 72
+# mode: CPerl
+# End:
+# vim: set cindent noexpandtab shiftwidth=2 softtabstop=2 textwidth=72:
diff --git a/src/utils/grog/tests/PF-does-not-start-pic-region.sh b/src/utils/grog/tests/PF-does-not-start-pic-region.sh
new file mode 100755
index 0000000..d3b871f
--- /dev/null
+++ b/src/utils/grog/tests/PF-does-not-start-pic-region.sh
@@ -0,0 +1,33 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+grog="${abs_top_builddir:-.}/grog"
+
+# Regression test Savannah #60772.
+#
+# .PF does not _start_ a pic(1) region; it ends one.
+
+DOC='.PF
+.PE'
+
+echo "$DOC" | "$grog" \
+ | grep -Fqx 'groff -'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/utils/grog/tests/avoid-refer-fakeout.sh b/src/utils/grog/tests/avoid-refer-fakeout.sh
new file mode 100755
index 0000000..f163bed
--- /dev/null
+++ b/src/utils/grog/tests/avoid-refer-fakeout.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+grog="${abs_top_builddir:-.}/grog"
+
+# Regression-test Savannah #61520.
+#
+# Don't be fooled by documents (like xterm's ctlseqs.ms) that define
+# macros with names that start with '[' or ']'.
+
+input=".de []
+..
+.[] foo"
+
+echo "$input" | "$grog" | grep -Fqx 'groff -'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/utils/grog/tests/foo.man b/src/utils/grog/tests/foo.man
new file mode 100644
index 0000000..28e9fe6
--- /dev/null
+++ b/src/utils/grog/tests/foo.man
@@ -0,0 +1,146 @@
+.\" Automatically generated by Pod::Man 4.10 (Pod::Simple 3.35)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings. \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote. \*(C+ will
+.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
+.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
+.\" nothing in troff, for use with C<>.
+.tr \(*W-
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+. ds -- \(*W-
+. ds PI pi
+. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
+. ds L" ""
+. ds R" ""
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds -- \|\(em\|
+. ds PI \(*p
+. ds L" ``
+. ds R" ''
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear. Run. Save yourself. No user-serviceable parts.
+. \" fudge factors for nroff and troff
+.if n \{\
+. ds #H 0
+. ds #V .8m
+. ds #F .3m
+. ds #[ \f1
+. ds #] \fP
+.\}
+.if t \{\
+. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+. ds #V .6m
+. ds #F 0
+. ds #[ \&
+. ds #] \&
+.\}
+. \" simple accents for nroff and troff
+.if n \{\
+. ds ' \&
+. ds ` \&
+. ds ^ \&
+. ds , \&
+. ds ~ ~
+. ds /
+.\}
+.if t \{\
+. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+. \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+. \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+. \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+. ds : e
+. ds 8 ss
+. ds o a
+. ds d- d\h'-1'\(ga
+. ds D- D\h'-1'\(hy
+. ds th \o'bp'
+. ds Th \o'LP'
+. ds ae ae
+. ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ========================================================================
+.\"
+.IX Title "FOO 1"
+.TH FOO 1 "2021-06-30" "perl v5.28.1" "User Contributed Perl Documentation"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH "Name"
+.IX Header "Name"
+foo \- a frobnicator
+.SH "Description"
+.IX Header "Description"
+This is my program.
diff --git a/src/utils/grog/tests/preserve-groff-options.sh b/src/utils/grog/tests/preserve-groff-options.sh
new file mode 100755
index 0000000..3290798
--- /dev/null
+++ b/src/utils/grog/tests/preserve-groff-options.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+grog="${abs_top_builddir:-.}/grog"
+
+# Regression test Savannah #57873.
+#
+# Don't mangle groff options.
+
+echo | "$grog" -ww -fN -P-pa5 -ra5=0 \
+ | grep -Fqx 'groff -ww -fN -P-pa5 -ra5=0 -'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/utils/grog/tests/recognize-perl-pod.sh b/src/utils/grog/tests/recognize-perl-pod.sh
new file mode 100755
index 0000000..bc13ece
--- /dev/null
+++ b/src/utils/grog/tests/recognize-perl-pod.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+grog="${abs_top_builddir:-.}/grog"
+doc="${abs_top_srcdir:-..}/src/utils/grog/tests/foo.man"
+
+# Regression test Savannah #59622.
+#
+# Recognize the strongly-accented dialect of man(7) produced by
+# pod2man(1).
+
+"$grog" "$doc" | grep '^groff -man .*/src/utils/grog/tests/foo\.man'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/utils/grog/tests/smoke-test.sh b/src/utils/grog/tests/smoke-test.sh
new file mode 100755
index 0000000..2da1fc4
--- /dev/null
+++ b/src/utils/grog/tests/smoke-test.sh
@@ -0,0 +1,153 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+set -e
+
+grog="${abs_top_builddir:-.}/grog"
+src="${abs_top_srcdir:-..}"
+
+doc=src/preproc/eqn/neqn.1
+echo "testing simple man(7) page $doc" >&2
+"$grog" "$doc" | \
+ grep -Fqx 'groff -man '"$doc"
+
+doc=src/preproc/tbl/tbl.1
+echo "testing tbl(1)-using man(7) page $doc" >&2
+"$grog" "$doc" | \
+ grep -Fqx 'groff -t -man '"$doc"
+
+doc=man/groff_diff.7
+echo "testing eqn(1)-using man(7) page $doc" >&2
+"$grog" "$doc" | \
+ grep -Fqx 'groff -e -man '"$doc"
+
+# BUG: grog doesn't yet handle .if, .ie, .while.
+#doc=src/preproc/soelim/soelim.1
+#echo "testing pic(1)-using man(7) page $doc" >&2
+#"$grog" "$doc" | \
+# grep -Fqx 'groff -p -man '"$doc"
+
+doc=tmac/groff_mdoc.7
+echo "testing tbl(1)-using mdoc(7) page $doc" >&2
+"$grog" "$doc" | \
+ grep -Fqx 'groff -t -mdoc '"$doc"
+
+doc=$src/doc/meintro.me.in
+echo "testing me(7) document $doc" >&2
+"$grog" "$doc" | \
+ grep -Fqx 'groff -me '"$doc"
+
+doc=$src/doc/meintro_fr.me.in
+echo "testing tbl(1)-using me(7) document $doc" >&2
+"$grog" "$doc" | \
+ grep -Fqx 'groff -t -me '"$doc"
+
+doc=$src/doc/meref.me.in
+echo "testing me(7) document $doc" >&2
+"$grog" "$doc" | \
+ grep -Fqx 'groff -me '"$doc"
+
+doc=$src/doc/grnexmpl.me
+echo "testing grn(1)- and eqn(1)-using me(7) document $doc" >&2
+"$grog" "$doc" | \
+ grep -Fqx 'groff -e -g -me '"$doc"
+
+doc=$src/contrib/mm/examples/letter.mm
+echo "testing mm(7) document $doc" >&2
+"$grog" "$doc" | \
+ grep -Fqx 'groff -mm '"$doc"
+
+doc=$src/contrib/mom/examples/copyright-chapter.mom
+echo "testing mom(7) document $doc" >&2
+"$grog" "$doc" | \
+ grep -Fqx 'groff -mom '"$doc"
+
+doc=$src/contrib/mom/examples/copyright-default.mom
+echo "testing mom(7) document $doc" >&2
+"$grog" "$doc" | \
+ grep -Fqx 'groff -mom '"$doc"
+
+doc=$src/contrib/mom/examples/letter.mom
+echo "testing mom(7) document $doc" >&2
+"$grog" "$doc" | \
+ grep -Fqx 'groff -mom '"$doc"
+
+doc=$src/contrib/mom/examples/mom-pdf.mom
+echo "testing mom(7) document $doc" >&2
+"$grog" "$doc" | \
+ grep -Fqx 'groff -mom '"$doc"
+
+doc=$src/contrib/mom/examples/mon_premier_doc.mom
+echo "testing mom(7) document $doc" >&2
+"$grog" "$doc" | \
+ grep -Fqx 'groff -mom '"$doc"
+
+doc=$src/contrib/mom/examples/sample_docs.mom
+echo "testing mom(7) document $doc" >&2
+"$grog" "$doc" | \
+ grep -Fqx 'groff -mom '"$doc"
+
+doc=$src/contrib/mom/examples/slide-demo.mom
+echo "testing mom(7) document $doc" >&2
+"$grog" "$doc" | \
+ grep -Fqx 'groff -e -p -t -mom '"$doc"
+
+doc=$src/contrib/mom/examples/typesetting.mom
+echo "testing mom(7) document $doc" >&2
+"$grog" "$doc" | \
+ grep -Fqx 'groff -mom '"$doc"
+
+doc=$src/contrib/pdfmark/cover.ms
+echo "testing ms(7) document $doc" >&2
+"$grog" "$doc" | \
+ grep -Fqx 'groff -ms '"$doc"
+
+doc=$src/contrib/pdfmark/pdfmark.ms
+echo "testing ms(7) document $doc" >&2
+"$grog" "$doc" | \
+ grep -Fqx 'groff -ms '"$doc"
+
+doc=$src/doc/ms.ms
+echo "testing eqn(1)- and tbl(1)-using ms(7) document $doc" >&2
+"$grog" "$doc" | \
+ grep -Fqx 'groff -e -t -ms '"$doc"
+
+doc=$src/doc/pic.ms
+echo "testing tbl(1)-, eqn(1)-, and pic(1)-using ms(7) document $doc" \
+ >&2
+"$grog" "$doc" | \
+ grep -Fqx 'groff -e -p -t -ms '"$doc"
+
+doc=$src/doc/webpage.ms
+echo "testing ms(7) document $doc" >&2
+# BUG: Should detect -mwww (and -mpspic?) too.
+"$grog" "$doc" | \
+ grep -Fqx 'groff -ms '"$doc"
+
+# Test manual specification of auxiliary macro packages.
+echo "testing ms(7) document $doc with '-m www' option" >&2
+"$grog" "$doc" -m www | \
+ grep -Fqx 'groff -ms -mwww '"$doc"
+
+echo "testing ms(7) document $doc with '-mwww' option" >&2
+"$grog" "$doc" -mwww | \
+ grep -Fqx 'groff -ms -mwww '"$doc"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/src/utils/hpftodit/hpftodit.1.man b/src/utils/hpftodit/hpftodit.1.man
new file mode 100644
index 0000000..12e3af7
--- /dev/null
+++ b/src/utils/hpftodit/hpftodit.1.man
@@ -0,0 +1,476 @@
+.TH hpftodit @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+hpftodit \- create font description files for use with
+.I groff
+and
+.I grolj4
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1994-2020 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_hpftodit_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY hpftodit
+.RB [ \-aqs ]
+.RB [ \-i\~\c
+.IR n ]
+.I tfm-file
+.I map-file
+.I font-description
+.YS
+.
+.
+.SY hpftodit
+.B \-d
+.I tfm-file
+.RI [ map-file ]
+.YS
+.
+.
+.SY hpftodit
+.B \-\-help
+.YS
+.
+.
+.SY hpftodit
+.B \-v
+.
+.SY hpftodit
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I hpftodit
+creates a font description file for use with a Hewlett-Packard
+LaserJet\~4-\%series
+(or newer)
+printer with the
+.MR grolj4 @MAN1EXT@
+output driver of
+.MR groff @MAN1EXT@ ,
+using data from an HP tagged font metric (TFM) file.
+.
+.I tfm-file
+is the name of the font's TFM file;
+Intellifont and TrueType TFM files are supported,
+but symbol set TFM files are not.
+.
+.I map-file
+is a file giving the
+.I groff
+special character identifiers for glyphs in the font;
+this file should consist of a sequence of lines of the form
+.RS
+.EX
+.IR "m u c1 c2 " "\&.\|.\|.\& [#" " comment" "]"
+.EE
+.RE
+where
+.I m
+is a decimal integer giving the glyph's MSL
+(Master Symbol List)
+number,
+.I u
+is a hexadecimal integer giving its Unicode character code,
+and
+.IR c1 ,
+.IR c2 ", .\|.\|."
+are its
+.I groff
+glyph names
+(see
+.MR groff_char @MAN7EXT@
+for a list).
+.
+The values can be separated by any number of spaces and/or tabs.
+.
+The Unicode value must use uppercase hexadecimal digits A\^\[en]\^F,
+and must lack a leading
+.RB \[lq] 0x \[rq],
+.RB \[lq] u \[rq],
+or
+.RB \[lq] U+ \[rq].
+.
+Unicode values corresponding to composite glyphs are decomposed;
+that is
+.RB \[lq] u00C0 \[rq]
+becomes
+.RB \[lq] u0041_0300 \[rq].
+.
+A glyph without a
+.I groff
+special character identifier may be named
+.BI u XXXX
+if the glyph corresponds to a Unicode value,
+or as an unnamed glyph
+.RB \[lq] \-\-\- \[rq].
+.
+If the given Unicode value is in the Private Use Area (PUA)
+(0xE000\^\[en]\^0xF8FF),
+the glyph is included as an unnamed glyph.
+.
+Refer to
+.MR groff_diff @MAN1EXT@
+for additional information about unnamed glyphs and how to access them.
+.
+.
+.P
+Blank lines and lines beginning with
+.RB \[lq] # \[rq]
+are ignored.
+.
+A
+.RB \[lq] # \[rq]
+following one or more
+.I groff
+names begins a comment.
+.
+Because
+.RB \[lq] # \[rq]
+is a valid
+.I groff
+name,
+it must appear first in a list of
+.I groff
+names if a comment is included,
+as in
+.
+.RS
+.EX
+3 0023 # # number sign
+.EE
+.RE
+.
+or
+.
+.RS
+.EX
+3 0023 # sh # number sign
+.EE
+.RE
+.
+whereas in
+.
+.RS
+.EX
+3 0023 sh # # number sign
+.EE
+.RE
+.
+the first
+.RB \[lq] # \[rq]
+is interpreted as the beginning of the comment.
+.
+.
+.P
+Output is written in
+.MR groff_font @MAN5EXT@
+format to
+.I font-description,
+a file named for the intended
+.I groff
+font name;
+if this operand is
+.RB \[lq] \- \[rq],
+the font description is written to the standard output stream.
+.
+.
+.LP
+If the
+.B \-i
+option is used,
+.I hpftodit
+automatically will generate an italic correction,
+a left italic correction,
+and a subscript correction for each glyph
+(the significance of these parameters is explained in
+.MR groff_font @MAN5EXT@ ).
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.B \-a
+Include glyphs in the TFM file that are not included in
+.IR map-file .
+.
+A glyph with corresponding Unicode value is given the name
+.RI u XXXX ;
+a glyph without a Unicode value is included as an unnamed glyph
+\[lq]\-\^\-\^\-\[rq].
+.
+A glyph with a Unicode value in the Private Use Area
+(0xE000\^\[en]\^0xF8FF)
+is also included as an unnamed glyph.
+.
+.
+.IP
+This option provides a simple means of adding Unicode-named and
+unnamed glyphs to a font without including them in the map file,
+but it affords little control over which glyphs are placed in a regular
+font and which are placed in a special font.
+.
+The presence or absence of the
+.B \-s
+option has some effect on which glyphs are included:
+without it,
+only the \[lq]text\[rq] symbol sets are searched for matching glyphs;
+with it,
+only the \[lq]mathematical\[rq] symbol sets are searched.
+.
+Nonetheless,
+restricting the symbol sets searched isn't very selective\[em]many
+glyphs are placed in both regular and special fonts.
+.
+Normally,
+.B \-a
+should be used only as a last resort.
+.
+.
+.TP
+.B \-d
+Dump information about the TFM file to the standard output stream;
+use this to ensure that a TFM file is a proper match for a font,
+and that its contents are suitable.
+.
+The information includes the values of important TFM tags and a listing
+(by MSL number for Intellifont TFM files or by Unicode value for
+TrueType TFM files)
+of the glyphs included in the TFM file.
+.
+The unit of measure \[lq]DU\[rq] for some tags indicates design units;
+there are 8782\~design units per em for Intellifont fonts,
+and 2048\~design units per em for TrueType fonts.
+.
+Note that the accessibility of a glyph depends on its inclusion in a
+symbol set;
+some TFM files list many glyphs but only a few symbol sets.
+.
+.
+.IP
+The glyph listing includes the glyph index within the TFM file,
+the MSL or Unicode value,
+and the symbol set and character code that will be used to print the
+glyph.
+.
+If
+.I map-file
+is given,
+.I groff
+names are given for matching glyphs.
+.
+If only the glyph index and MSL or Unicode value are given,
+the glyph does not appear in any supported symbol set and cannot be
+printed.
+.
+.
+.IP
+With the
+.B \-d
+option,
+.I map-file
+is optional,
+and
+.I output-font
+is ignored if given.
+.
+.
+.TP
+.BI \-i\~ n
+Generate an italic correction for each glyph so that its width plus its
+italic correction is equal to
+.I n
+thousandths of an em plus the amount by which the right edge of the
+glyphs's bounding box is to the right of its origin.
+.
+If a negative italic correction would result,
+use a zero italic correction instead.
+.
+.
+.IP
+Also generate a subscript correction equal to the product of the tangent
+of the slant of the font and four fifths of the x-height of the font.
+.
+If a subscript correction greater than the italic correction would
+result,
+use a subscript correction equal to the italic correction instead.
+.
+.
+.IP
+Also generate a left italic correction for each glyph equal to
+.I n
+thousandths of an em plus the amount by which the left edge of the
+glyphs's bounding box is to the left of its origin.
+.
+The left italic correction may be negative.
+.
+.
+.IP
+This option normally is needed only with italic or oblique fonts;
+a value of 50
+(0.05\~em)
+usually is a reasonable choice.
+.
+.
+.TP
+.B \-q
+Suppress warnings about glyphs in the map file that were not found in
+the TFM file.
+.
+Warnings never are given for unnamed glyphs or by glyphs named by their
+Unicode values.
+.
+This option is useful when sending the output of
+.I hpftodit
+to the standard output stream.
+.
+.
+.TP
+.B \-s
+Add the
+.B special
+directive to the font description file,
+affecting the order in which HP symbol sets are searched for each glyph.
+.
+Without this option,
+the \[lq]text\[rq] sets are searched before the \[lq]mathematical\[rq]
+symbol sets.
+.
+With it,
+the search order is reversed.
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @FONTDIR@/\:\%devlj4/\:DESC
+describes the
+.B lj4
+output device.
+.
+.
+.TP
+.IR @FONTDIR@/\:\%devlj4/ F
+describes the font known
+.RI as\~ F
+on device
+.BR lj4 .
+.
+.
+.TP
+.I @FONTDIR@/\:\%devlj4/\:\%generate/\:\%Makefile
+is a
+.MR make 1
+script that uses
+.MR hpftodit @MAN1EXT@
+to prepare the
+.I groff
+font description files above from HP TFM data;
+in can be used to regenerate them in the event the TFM files are
+updated.
+.
+.
+.TP
+.I @FONTDIR@/\:\%devlj4/\:\%generate/\:\%special\:.awk
+is an
+.MR awk 1
+script that corrects the Intellifont-based height metrics for several
+glyphs in the
+.B S
+(special) font for TrueType CG Times used in the HP LaserJet\~4000 and
+later.
+.
+.
+.TP
+.I @FONTDIR@/\:\%devlj4/\:\%generate/\:\%special\:.map
+.TQ
+.I @FONTDIR@/\:\%devlj4/\:\%generate/\:\%symbol\:.map
+.TQ
+.I @FONTDIR@/\:\%devlj4/\:\%generate/\:text\:.map
+.TQ
+.I @FONTDIR@/\:\%devlj4/\:\%generate/\:\%wingdings.map
+map MSL indices and HP Unicode PUA assignments to
+.I groff
+special character identifiers.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.MR groff @MAN1EXT@ ,
+.MR groff_diff @MAN1EXT@ ,
+.MR grolj4 @MAN1EXT@ ,
+.MR groff_font @MAN5EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_hpftodit_1_man_C]
+.do rr *groff_hpftodit_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/utils/hpftodit/hpftodit.am b/src/utils/hpftodit/hpftodit.am
new file mode 100644
index 0000000..e31e8f5
--- /dev/null
+++ b/src/utils/hpftodit/hpftodit.am
@@ -0,0 +1,34 @@
+# Automake rules for 'src utils hpftodit'
+#
+# Copyright (C) 2014-2020 Free Software Foundation, Inc.
+#
+# '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 of the License, 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 this program. If not, see
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+#
+########################################################################
+
+bin_PROGRAMS += hpftodit
+man1_MANS += src/utils/hpftodit/hpftodit.1
+EXTRA_DIST += src/utils/hpftodit/hpftodit.1.man
+hpftodit_LDADD = libgroff.a $(LIBM) lib/libgnu.a
+hpftodit_SOURCES = \
+ src/utils/hpftodit/hpftodit.cpp \
+ src/utils/hpftodit/hpuni.cpp
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/utils/hpftodit/hpftodit.cpp b/src/utils/hpftodit/hpftodit.cpp
new file mode 100644
index 0000000..4982e19
--- /dev/null
+++ b/src/utils/hpftodit/hpftodit.cpp
@@ -0,0 +1,1465 @@
+/* Copyright (C) 1994-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/*
+TODO
+devise new names for useful characters
+option to specify symbol sets to look in
+put filename in error messages (or fix lib)
+*/
+
+#include "lib.h"
+
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "posix.h"
+#include "errarg.h"
+#include "error.h"
+#include "cset.h"
+#include "nonposix.h"
+#include "unicode.h"
+
+extern "C" const char *Version_string;
+extern const char *hp_msl_to_unicode_code(const char *);
+
+#define SIZEOF(v) (sizeof(v)/sizeof(v[0]))
+#define equal(a, b) (strcmp(a, b) == 0)
+// only valid if is_uname(c) has returned true
+#define is_decomposed(c) strchr(c, '_')
+
+#define NO 0
+#define YES 1
+
+#define MSL 0
+#define SYMSET 1
+#define UNICODE 2
+
+#define UNNAMED "---"
+
+static double multiplier = 3.0; // make Agfa-based unitwidth an integer
+
+inline
+int scale(int n)
+{
+ return int(n * multiplier + 0.5);
+}
+
+// tags in TFM file
+
+enum tag_type {
+ min_tag = 400,
+ type_tag = 400,
+ copyright_tag = 401,
+ comment_tag = 402,
+ charcode_tag = 403, // MSL for Intellifont, Unicode for TrueType
+ symbol_set_tag = 404,
+ unique_identifier_tag = 405,
+ inches_per_point_tag = 406,
+ nominal_point_size_tag = 407,
+ design_units_per_em_tag = 408,
+ posture_tag = 409,
+ type_structure_tag = 410,
+ stroke_weight_tag = 411,
+ spacing_tag = 412,
+ slant_tag = 413,
+ appearance_width_tag = 414,
+ serif_style_tag = 415,
+ font_name_tag = 417,
+ typeface_source_tag = 418,
+ average_width_tag = 419,
+ max_width_tag = 420,
+ word_spacing_tag = 421,
+ recommended_line_spacing_tag = 422,
+ cap_height_tag = 423,
+ x_height_tag = 424,
+ max_ascent_tag = 425,
+ max_descent_tag = 426,
+ lower_ascent_tag = 427,
+ lower_descent_tag = 428,
+ underscore_depth_tag = 429,
+ underscore_thickness_tag = 430,
+ uppercase_accent_height_tag = 431,
+ lowercase_accent_height_tag = 432,
+ width_tag = 433,
+ vertical_escapement_tag = 434,
+ left_extent_tag = 435,
+ right_extent_tag = 436,
+ ascent_tag = 437,
+ descent_tag = 438,
+ pair_kern_tag = 439,
+ sector_kern_tag = 440,
+ track_kern_tag = 441,
+ typeface_tag = 442,
+ panose_tag = 443,
+ max_tag = 443
+};
+
+const char *tag_name[] = {
+ "Symbol Set",
+ "Font Type" // MSL for Intellifont, Unicode for TrueType
+};
+
+// types in TFM file
+enum {
+ BYTE_TYPE = 1,
+ ASCII_TYPE = 2, // NUL-terminated string
+ USHORT_TYPE = 3,
+ LONG_TYPE = 4, // unused
+ RATIONAL_TYPE = 5, // 8-byte numerator + 8-byte denominator
+ SIGNED_BYTE_TYPE = 16, // unused
+ SIGNED_SHORT_TYPE = 17,
+ SIGNED_LONG_TYPE = 18 // unused
+};
+
+typedef unsigned char byte;
+typedef unsigned short uint16;
+typedef short int16;
+typedef unsigned int uint32;
+
+class File {
+public:
+ File(const char *);
+ void skip(int n);
+ byte get_byte();
+ uint16 get_uint16();
+ uint32 get_uint32();
+ uint32 get_uint32(char *orig);
+ void seek(uint32 n);
+private:
+ unsigned char *buf_;
+ const unsigned char *ptr_;
+ const unsigned char *end_;
+};
+
+struct entry {
+ char present;
+ uint16 type;
+ uint32 count;
+ uint32 value;
+ char orig_value[4];
+ entry() : present(0) { }
+};
+
+struct char_info {
+ uint16 charcode;
+ uint16 width;
+ int16 ascent;
+ int16 descent;
+ int16 left_extent;
+ uint16 right_extent;
+ uint16 symbol_set;
+ unsigned char code;
+};
+
+const uint16 NO_GLYPH = 0xffff;
+const uint16 NO_SYMBOL_SET = 0;
+
+struct name_list {
+ char *name;
+ name_list *next;
+ name_list(const char *s, name_list *p) : name(strsave(s)), next(p) { }
+ ~name_list() { delete[] name; }
+};
+
+struct symbol_set {
+ uint16 select;
+ uint16 index[256];
+};
+
+#define SYMBOL_SET(n, c) ((n) * 32 + ((c) - 64))
+
+uint16 text_symbol_sets[] = {
+ SYMBOL_SET(19, 'U'), // Windows Latin 1 ("ANSI", code page 1252)
+ SYMBOL_SET(9, 'E'), // Windows Latin 2, Code Page 1250
+ SYMBOL_SET(5, 'T'), // Code Page 1254
+ SYMBOL_SET(7, 'J'), // Desktop
+ SYMBOL_SET(6, 'J'), // Microsoft Publishing
+ SYMBOL_SET(0, 'N'), // Latin 1 (subset of 19U,
+ // so we should never get here)
+ SYMBOL_SET(2, 'N'), // Latin 2 (subset of 9E,
+ // so we should never get here)
+ SYMBOL_SET(8, 'U'), // HP Roman 8
+ SYMBOL_SET(10, 'J'), // PS Standard
+ SYMBOL_SET(9, 'U'), // Windows 3.0 "ANSI"
+ SYMBOL_SET(1, 'U'), // U.S. Legal
+
+ SYMBOL_SET(12, 'J'), // MC Text
+ SYMBOL_SET(10, 'U'), // PC Code Page 437
+ SYMBOL_SET(11, 'U'), // PC Code Page 437N
+ SYMBOL_SET(17, 'U'), // PC Code Page 852
+ SYMBOL_SET(12, 'U'), // PC Code Page 850
+ SYMBOL_SET(9, 'T'), // PC Code Page 437T
+ 0
+};
+
+uint16 special_symbol_sets[] = {
+ SYMBOL_SET(8, 'M'), // Math 8
+ SYMBOL_SET(5, 'M'), // PS Math
+ SYMBOL_SET(15, 'U'), // Pi font
+ SYMBOL_SET(13, 'J'), // Ventura International
+ SYMBOL_SET(19, 'M'), // Symbol font
+ SYMBOL_SET(579, 'L'), // Wingdings
+ 0
+};
+
+entry tags[max_tag + 1 - min_tag];
+
+char_info *char_table;
+uint32 nchars = 0;
+
+unsigned int charcode_name_table_size = 0;
+name_list **charcode_name_table = NULL;
+
+symbol_set *symbol_set_table;
+unsigned int n_symbol_sets;
+
+static int debug_flag = NO;
+static int special_flag = NO; // not a special font
+static int italic_flag = NO; // don't add italic correction
+static int italic_sep;
+static int all_flag = NO; // don't include glyphs not in mapfile
+static int quiet_flag = NO; // don't suppress warnings about symbols not found
+
+static char *hp_msl_to_ucode_name(int);
+static char *unicode_to_ucode_name(int);
+static int is_uname(char *);
+static char *show_symset(unsigned int);
+static void usage(FILE *);
+static void usage();
+static const char *xbasename(const char *);
+static void read_tags(File &);
+static int check_type();
+static void check_units(File &, const int, double *, double *);
+static int read_map(const char *, const int);
+static void require_tag(tag_type);
+static void dump_ascii(File &, tag_type);
+static void dump_tags(File &);
+static void dump_symbol_sets(File &);
+static void dump_symbols(int);
+static void output_font_name(File &);
+static void output_spacewidth();
+static void output_pclweight();
+static void output_pclproportional();
+static void read_and_output_pcltypeface(File &);
+static void output_pclstyle();
+static void output_slant();
+static void output_ligatures();
+static void read_symbol_sets(File &);
+static void read_and_output_kernpairs(File &);
+static void output_charset(const int);
+static void read_char_table(File &);
+
+inline
+entry &tag_info(tag_type t)
+{
+ return tags[t - min_tag];
+}
+
+int
+main(int argc, char **argv)
+{
+ program_name = argv[0];
+
+ int opt;
+ int res = 1200; // PCL unit of measure for cursor moves
+ int scalesize = 4; // LaserJet 4 only allows 1/4 point increments
+ int unitwidth = 6350;
+ double ppi; // points per inch
+ double upem; // design units per em
+
+ static const struct option long_options[] = {
+ { "help", no_argument, 0, CHAR_MAX + 1 },
+ { "version", no_argument, 0, 'v' },
+ { NULL, 0, 0, 0 }
+ };
+ while ((opt = getopt_long(argc, argv, "adsqvi:", long_options, NULL)) != EOF) {
+ switch (opt) {
+ case 'a':
+ all_flag = YES;
+ break;
+ case 'd':
+ debug_flag = YES;
+ break;
+ case 's':
+ special_flag = YES;
+ break;
+ case 'i':
+ italic_flag = YES;
+ italic_sep = atoi(optarg); // design units
+ break;
+ case 'q':
+ quiet_flag = YES; // suppress warnings about symbols not found
+ break;
+ case 'v':
+ printf("GNU hpftodit (groff) version %s\n", Version_string);
+ exit(0);
+ break;
+ case CHAR_MAX + 1: // --help
+ usage(stdout);
+ exit(0);
+ break;
+ case '?':
+ usage();
+ break;
+ default:
+ assert(0);
+ }
+ }
+
+ if (debug_flag && argc - optind < 1)
+ usage();
+ else if (!debug_flag && argc - optind != 3)
+ usage();
+ File f(argv[optind]);
+ read_tags(f);
+ int tfm_type = check_type();
+ if (debug_flag)
+ dump_tags(f);
+ if (!debug_flag && !read_map(argv[optind + 1], tfm_type))
+ exit(1);
+ else if (debug_flag && argc - optind > 1)
+ read_map(argv[optind + 1], tfm_type);
+ current_filename = NULL;
+ current_lineno = -1; // no line numbers
+ if (!debug_flag && !equal(argv[optind + 2], "-"))
+ if (freopen(argv[optind + 2], "w", stdout) == NULL)
+ fatal("cannot open '%1': %2", argv[optind + 2], strerror(errno));
+ current_filename = argv[optind];
+
+ check_units(f, tfm_type, &ppi, &upem);
+ if (tfm_type == UNICODE) // don't calculate for Intellifont TFMs
+ multiplier = double(res) / upem / ppi * unitwidth / scalesize;
+ if (italic_flag)
+ // convert from thousandths of an em to design units
+ italic_sep = int(italic_sep * upem / 1000 + 0.5);
+
+ read_char_table(f);
+ if (nchars == 0)
+ fatal("no characters");
+
+ if (!debug_flag) {
+ output_font_name(f);
+ printf("name %s\n", xbasename(argv[optind + 2]));
+ if (special_flag)
+ printf("special\n");
+ output_spacewidth();
+ output_slant();
+ read_and_output_pcltypeface(f);
+ output_pclproportional();
+ output_pclweight();
+ output_pclstyle();
+ }
+ read_symbol_sets(f);
+ if (debug_flag)
+ dump_symbols(tfm_type);
+ else {
+ output_ligatures();
+ read_and_output_kernpairs(f);
+ output_charset(tfm_type);
+ }
+ return 0;
+}
+
+static void
+usage(FILE *stream)
+{
+ fprintf(stream,
+"usage: %s [-aqs] [-i n] tfm-file map-file output-font\n"
+"usage: %s -d tfm-file [map-file]\n"
+"usage: %s {-v | --version}\n"
+"usage: %s --help\n",
+ program_name, program_name, program_name, program_name);
+}
+
+static void
+usage()
+{
+ usage(stderr);
+ exit(1);
+}
+
+File::File(const char *s)
+{
+ // We need to read the file in binary mode because hpftodit relies
+ // on byte counts.
+ int fd = open(s, O_RDONLY | O_BINARY);
+ if (fd < 0)
+ fatal("cannot open '%1': %2", s, strerror(errno));
+ current_filename = s;
+ struct stat sb;
+ if (fstat(fd, &sb) < 0)
+ fatal("cannot stat: %1", strerror(errno));
+ if (!S_ISREG(sb.st_mode))
+ fatal("not a regular file");
+ buf_ = new unsigned char[sb.st_size];
+ long nread = read(fd, buf_, sb.st_size);
+ if (nread < 0)
+ fatal("read error: %1", strerror(errno));
+ if (nread != sb.st_size)
+ fatal("read unexpected number of bytes");
+ ptr_ = buf_;
+ end_ = buf_ + sb.st_size;
+}
+
+void
+File::skip(int n)
+{
+ if (end_ - ptr_ < n)
+ fatal("unexpected end of file");
+ ptr_ += n;
+}
+
+void
+File::seek(uint32 n)
+{
+ if (uint32(end_ - buf_) < n)
+ fatal("unexpected end of file");
+ ptr_ = buf_ + n;
+}
+
+byte
+File::get_byte()
+{
+ if (ptr_ >= end_)
+ fatal("unexpected end of file");
+ return *ptr_++;
+}
+
+uint16
+File::get_uint16()
+{
+ if (end_ - ptr_ < 2)
+ fatal("unexpected end of file");
+ uint16 n = *ptr_++;
+ return n + (*ptr_++ << 8);
+}
+
+uint32
+File::get_uint32()
+{
+ if (end_ - ptr_ < 4)
+ fatal("unexpected end of file");
+ uint32 n = *ptr_++;
+ for (int i = 0; i < 3; i++)
+ n += *ptr_++ << (i + 1)*8;
+ return n;
+}
+
+uint32
+File::get_uint32(char *orig)
+{
+ if (end_ - ptr_ < 4)
+ fatal("unexpected end of file");
+ unsigned char v = *ptr_++;
+ uint32 n = v;
+ orig[0] = v;
+ for (int i = 1; i < 4; i++) {
+ v = *ptr_++;
+ orig[i] = v;
+ n += v << i*8;
+ }
+ return n;
+}
+
+static void
+read_tags(File &f)
+{
+ if (f.get_byte() != 'I' || f.get_byte() != 'I')
+ fatal("not an Intel format TFM file");
+ f.skip(6);
+ uint16 ntags = f.get_uint16();
+ entry dummy;
+ for (uint16 i = 0; i < ntags; i++) {
+ uint16 tag = f.get_uint16();
+ entry *p;
+ if (min_tag <= tag && tag <= max_tag)
+ p = tags + (tag - min_tag);
+ else
+ p = &dummy;
+ p->present = 1;
+ p->type = f.get_uint16();
+ p->count = f.get_uint32();
+ p->value = f.get_uint32(p->orig_value);
+ }
+}
+
+static int
+check_type()
+{
+ require_tag(type_tag);
+ int tfm_type = tag_info(type_tag).value;
+ switch (tfm_type) {
+ case MSL:
+ case UNICODE:
+ break;
+ case SYMSET:
+ fatal("cannot handle Symbol Set TFM files");
+ break;
+ default:
+ fatal("unknown type tag %1", tfm_type);
+ }
+ return tfm_type;
+}
+
+static void
+check_units(File &f, const int tfm_type, double *ppi, double *upem)
+{
+ require_tag(design_units_per_em_tag);
+ f.seek(tag_info(design_units_per_em_tag).value);
+ uint32 num = f.get_uint32();
+ uint32 den = f.get_uint32();
+ if (tfm_type == MSL && (num != 8782 || den != 1))
+ fatal("design units per em != 8782/1");
+ *upem = double(num) / den;
+ require_tag(inches_per_point_tag);
+ f.seek(tag_info(inches_per_point_tag).value);
+ num = f.get_uint32();
+ den = f.get_uint32();
+ if (tfm_type == MSL && (num != 100 || den != 7231))
+ fatal("inches per point not 100/7231");
+ *ppi = double(den) / num;
+}
+
+static void
+require_tag(tag_type t)
+{
+ if (!tag_info(t).present)
+ fatal("tag %1 missing", int(t));
+}
+
+// put a human-readable font name in the file
+static void
+output_font_name(File &f)
+{
+ char *p;
+
+ if (!tag_info(font_name_tag).present)
+ return;
+ int count = tag_info(font_name_tag).count;
+ char *font_name = new char[count];
+
+ if (count > 4) { // value is a file offset to the string
+ f.seek(tag_info(font_name_tag).value);
+ int n = count;
+ p = font_name;
+ while (--n)
+ *p++ = f.get_byte();
+ }
+ else // orig_value contains the string
+ sprintf(font_name, "%.*s",
+ count, tag_info(font_name_tag).orig_value);
+
+ // remove any trailing space
+ p = font_name + count - 1;
+ while (csspace(*--p))
+ ;
+ *(p + 1) = '\0';
+ printf("# %s\n", font_name);
+ delete[] font_name;
+}
+
+static void
+output_spacewidth()
+{
+ require_tag(word_spacing_tag);
+ printf("spacewidth %d\n", scale(tag_info(word_spacing_tag).value));
+}
+
+static void
+read_symbol_sets(File &f)
+{
+ uint32 symbol_set_dir_length = tag_info(symbol_set_tag).count;
+ uint16 *symbol_set_selectors;
+ n_symbol_sets = symbol_set_dir_length/14;
+ symbol_set_table = new symbol_set[n_symbol_sets];
+ unsigned int i;
+
+ for (i = 0; i < nchars; i++)
+ char_table[i].symbol_set = NO_SYMBOL_SET;
+
+ for (i = 0; i < n_symbol_sets; i++) {
+ f.seek(tag_info(symbol_set_tag).value + i*14);
+ (void)f.get_uint32(); // offset to symbol set name
+ uint32 off1 = f.get_uint32(); // offset to selection string
+ uint32 off2 = f.get_uint32(); // offset to symbol set index array
+
+ f.seek(off1);
+ uint16 kind = 0; // HP-GL "Kind 1" symbol set value
+ unsigned int j;
+ for (j = 0; j < off2 - off1; j++) {
+ unsigned char c = f.get_byte();
+ if ('0' <= c && c <= '9') // value
+ kind = kind*10 + (c - '0');
+ else if ('A' <= c && c <= 'Z') // terminator
+ kind = kind*32 + (c - 64);
+ }
+ symbol_set_table[i].select = kind;
+ for (j = 0; j < 256; j++)
+ symbol_set_table[i].index[j] = f.get_uint16();
+ }
+
+ symbol_set_selectors = (special_flag ? special_symbol_sets
+ : text_symbol_sets);
+ for (i = 0; symbol_set_selectors[i] != 0; i++) {
+ unsigned int j;
+ for (j = 0; j < n_symbol_sets; j++)
+ if (symbol_set_table[j].select == symbol_set_selectors[i])
+ break;
+ if (j < n_symbol_sets) {
+ for (int k = 0; k < 256; k++) {
+ uint16 idx = symbol_set_table[j].index[k];
+ if (idx != NO_GLYPH
+ && char_table[idx].symbol_set == NO_SYMBOL_SET) {
+ char_table[idx].symbol_set = symbol_set_table[j].select;
+ char_table[idx].code = k;
+ }
+ }
+ }
+ }
+
+ if (all_flag)
+ return;
+
+ symbol_set_selectors = (special_flag ? text_symbol_sets
+ : special_symbol_sets);
+ for (i = 0; symbol_set_selectors[i] != 0; i++) {
+ unsigned int j;
+ for (j = 0; j < n_symbol_sets; j++)
+ if (symbol_set_table[j].select == symbol_set_selectors[i])
+ break;
+ if (j < n_symbol_sets) {
+ for (int k = 0; k < 256; k++) {
+ uint16 idx = symbol_set_table[j].index[k];
+ if (idx != NO_GLYPH
+ && char_table[idx].symbol_set == NO_SYMBOL_SET) {
+ char_table[idx].symbol_set = symbol_set_table[j].select;
+ char_table[idx].code = k;
+ }
+ }
+ }
+ }
+ return;
+}
+
+static void
+read_char_table(File &f)
+{
+ require_tag(charcode_tag);
+ nchars = tag_info(charcode_tag).count;
+ char_table = new char_info[nchars];
+
+ f.seek(tag_info(charcode_tag).value);
+ uint32 i;
+ for (i = 0; i < nchars; i++)
+ char_table[i].charcode = f.get_uint16();
+
+ require_tag(width_tag);
+ f.seek(tag_info(width_tag).value);
+ for (i = 0; i < nchars; i++)
+ char_table[i].width = f.get_uint16();
+
+ require_tag(ascent_tag);
+ f.seek(tag_info(ascent_tag).value);
+ for (i = 0; i < nchars; i++) {
+ char_table[i].ascent = f.get_uint16();
+ if (char_table[i].ascent < 0)
+ char_table[i].ascent = 0;
+ }
+
+ require_tag(descent_tag);
+ f.seek(tag_info(descent_tag).value);
+ for (i = 0; i < nchars; i++) {
+ char_table[i].descent = f.get_uint16();
+ if (char_table[i].descent > 0)
+ char_table[i].descent = 0;
+ }
+
+ require_tag(left_extent_tag);
+ f.seek(tag_info(left_extent_tag).value);
+ for (i = 0; i < nchars; i++)
+ char_table[i].left_extent = int16(f.get_uint16());
+
+ require_tag(right_extent_tag);
+ f.seek(tag_info(right_extent_tag).value);
+ for (i = 0; i < nchars; i++)
+ char_table[i].right_extent = f.get_uint16();
+}
+
+static void
+output_pclweight()
+{
+ require_tag(stroke_weight_tag);
+ int stroke_weight = tag_info(stroke_weight_tag).value;
+ int pcl_stroke_weight;
+ if (stroke_weight < 128)
+ pcl_stroke_weight = -3;
+ else if (stroke_weight == 128)
+ pcl_stroke_weight = 0;
+ else if (stroke_weight <= 145)
+ pcl_stroke_weight = 1;
+ else if (stroke_weight <= 179)
+ pcl_stroke_weight = 3;
+ else
+ pcl_stroke_weight = 4;
+ printf("pclweight %d\n", pcl_stroke_weight);
+}
+
+static void
+output_pclproportional()
+{
+ require_tag(spacing_tag);
+ printf("pclproportional %d\n", tag_info(spacing_tag).value == 0);
+}
+
+static void
+read_and_output_pcltypeface(File &f)
+{
+ printf("pcltypeface ");
+ require_tag(typeface_tag);
+ if (tag_info(typeface_tag).count > 4) {
+ f.seek(tag_info(typeface_tag).value);
+ for (uint32 i = 0; i < tag_info(typeface_tag).count; i++) {
+ unsigned char c = f.get_byte();
+ if (c == '\0')
+ break;
+ putchar(c);
+ }
+ }
+ else
+ printf("%.4s", tag_info(typeface_tag).orig_value);
+ printf("\n");
+}
+
+static void
+output_pclstyle()
+{
+ unsigned pcl_style = 0;
+ // older tfms don't have the posture tag
+ if (tag_info(posture_tag).present) {
+ if (tag_info(posture_tag).value)
+ pcl_style |= 1;
+ }
+ else {
+ require_tag(slant_tag);
+ if (tag_info(slant_tag).value != 0)
+ pcl_style |= 1;
+ }
+ require_tag(appearance_width_tag);
+ if (tag_info(appearance_width_tag).value < 100) // guess
+ pcl_style |= 4;
+ printf("pclstyle %d\n", pcl_style);
+}
+
+static void
+output_slant()
+{
+ require_tag(slant_tag);
+ int slant = int16(tag_info(slant_tag).value);
+ if (slant != 0)
+ printf("slant %f\n", slant/100.0);
+}
+
+static void
+output_ligatures()
+{
+ // don't use ligatures for fixed space font
+ require_tag(spacing_tag);
+ if (tag_info(spacing_tag).value != 0)
+ return;
+ static const char *ligature_names[] = {
+ "fi", "fl", "ff", "ffi", "ffl"
+ };
+
+ static const char *ligature_chars[] = {
+ "fi", "fl", "ff", "Fi", "Fl"
+ };
+
+ unsigned ligature_mask = 0;
+ unsigned int i;
+ for (i = 0; i < nchars; i++) {
+ uint16 charcode = char_table[i].charcode;
+ if (charcode < charcode_name_table_size
+ && char_table[i].symbol_set != NO_SYMBOL_SET) {
+ for (name_list *p = charcode_name_table[charcode]; p; p = p->next)
+ for (unsigned int j = 0; j < SIZEOF(ligature_chars); j++)
+ if (strcmp(p->name, ligature_chars[j]) == 0) {
+ ligature_mask |= 1 << j;
+ break;
+ }
+ }
+ }
+ if (ligature_mask) {
+ printf("ligatures");
+ for (i = 0; i < SIZEOF(ligature_names); i++)
+ if (ligature_mask & (1 << i))
+ printf(" %s", ligature_names[i]);
+ printf(" 0\n");
+ }
+}
+
+static void
+read_and_output_kernpairs(File &f)
+{
+ if (tag_info(pair_kern_tag).present) {
+ printf("kernpairs\n");
+ f.seek(tag_info(pair_kern_tag).value);
+ uint16 n_pairs = f.get_uint16();
+ for (int i = 0; i < n_pairs; i++) {
+ uint16 i1 = f.get_uint16();
+ uint16 i2 = f.get_uint16();
+ int16 val = int16(f.get_uint16());
+ if (char_table[i1].symbol_set != NO_SYMBOL_SET
+ && char_table[i2].symbol_set != NO_SYMBOL_SET
+ && char_table[i1].charcode < charcode_name_table_size
+ && char_table[i2].charcode < charcode_name_table_size) {
+ for (name_list *p = charcode_name_table[char_table[i1].charcode];
+ p;
+ p = p->next)
+ for (name_list *q = charcode_name_table[char_table[i2].charcode];
+ q;
+ q = q->next)
+ if (!equal(p->name, UNNAMED) && !equal(q->name, UNNAMED))
+ printf("%s %s %d\n", p->name, q->name, scale(val));
+ }
+ }
+ }
+}
+
+static void
+output_charset(const int tfm_type)
+{
+ require_tag(slant_tag);
+ double slant_angle = int16(tag_info(slant_tag).value)*PI/18000.0;
+ double slant = sin(slant_angle)/cos(slant_angle);
+
+ if (italic_flag)
+ require_tag(x_height_tag);
+ require_tag(lower_ascent_tag);
+ require_tag(lower_descent_tag);
+
+ printf("charset\n");
+ unsigned int i;
+ for (i = 0; i < nchars; i++) {
+ uint16 charcode = char_table[i].charcode;
+
+ // the glyph is bound to one of the searched symbol sets
+ if (char_table[i].symbol_set != NO_SYMBOL_SET) {
+ // the character was in the map file
+ if (charcode < charcode_name_table_size && charcode_name_table[charcode])
+ printf("%s", charcode_name_table[charcode]->name);
+ else if (!all_flag)
+ continue;
+ else if (tfm_type == MSL)
+ printf("%s", hp_msl_to_ucode_name(charcode));
+ else
+ printf("%s", unicode_to_ucode_name(charcode));
+
+ printf("\t%d,%d",
+ scale(char_table[i].width), scale(char_table[i].ascent));
+
+ int depth = scale(-char_table[i].descent);
+ if (depth < 0)
+ depth = 0;
+ int italic_correction = 0;
+ int left_italic_correction = 0;
+ int subscript_correction = 0;
+
+ if (italic_flag) {
+ italic_correction = scale(char_table[i].right_extent
+ - char_table[i].width
+ + italic_sep);
+ if (italic_correction < 0)
+ italic_correction = 0;
+ subscript_correction = int((tag_info(x_height_tag).value
+ * slant * .8) + .5);
+ if (subscript_correction > italic_correction)
+ subscript_correction = italic_correction;
+ left_italic_correction = scale(italic_sep
+ - char_table[i].left_extent);
+ }
+
+ if (subscript_correction != 0)
+ printf(",%d,%d,%d,%d",
+ depth, italic_correction, left_italic_correction,
+ subscript_correction);
+ else if (left_italic_correction != 0)
+ printf(",%d,%d,%d", depth, italic_correction, left_italic_correction);
+ else if (italic_correction != 0)
+ printf(",%d,%d", depth, italic_correction);
+ else if (depth != 0)
+ printf(",%d", depth);
+ // This is fairly arbitrary. Fortunately it doesn't much matter.
+ unsigned type = 0;
+ if (char_table[i].ascent > int16(tag_info(lower_ascent_tag).value)*9/10)
+ type |= 2;
+ if (char_table[i].descent < int16(tag_info(lower_descent_tag).value)*9/10)
+ type |= 1;
+ printf("\t%d\t%d", type,
+ char_table[i].symbol_set*256 + char_table[i].code);
+
+ if (tfm_type == UNICODE) {
+ if (charcode >= 0xE000 && charcode <= 0xF8FF)
+ printf("\t-- HP PUA U+%04X", charcode);
+ else
+ printf("\t-- U+%04X", charcode);
+ }
+ else
+ printf("\t-- MSL %4d", charcode);
+ printf(" (%3s %3d)\n",
+ show_symset(char_table[i].symbol_set), char_table[i].code);
+
+ if (charcode < charcode_name_table_size
+ && charcode_name_table[charcode])
+ for (name_list *p = charcode_name_table[charcode]->next;
+ p; p = p->next)
+ printf("%s\t\"\n", p->name);
+ }
+ // warnings about characters in mapfile not found in TFM
+ else if (charcode < charcode_name_table_size
+ && charcode_name_table[charcode]) {
+ char *name = charcode_name_table[charcode]->name;
+ // don't warn about Unicode or unnamed glyphs
+ // that aren't in the TFM file
+ if (tfm_type == UNICODE && !quiet_flag && !equal(name, UNNAMED)
+ && !is_uname(name)) {
+ fprintf(stderr, "%s: warning: symbol U+%04X (%s",
+ program_name, charcode, name);
+ for (name_list *p = charcode_name_table[charcode]->next;
+ p; p = p->next)
+ fprintf(stderr, ", %s", p->name);
+ fprintf(stderr, ") not in any searched symbol set\n");
+ }
+ else if (!quiet_flag && !equal(name, UNNAMED) && !is_uname(name)) {
+ fprintf(stderr, "%s: warning: symbol MSL %d (%s",
+ program_name, charcode, name);
+ for (name_list *p = charcode_name_table[charcode]->next;
+ p; p = p->next)
+ fprintf(stderr, ", %s", p->name);
+ fprintf(stderr, ") not in any searched symbol set\n");
+ }
+ }
+ }
+}
+
+#define em_fract(a) (upem >= 0 ? double(a)/upem : 0)
+
+static void
+dump_tags(File &f)
+{
+ double upem = -1.0;
+
+ printf("TFM tags\n"
+ "\n"
+ "tag# type count value\n"
+ "---------------------\n");
+
+ for (int i = min_tag; i <= max_tag; i++) {
+ enum tag_type t = tag_type(i);
+ if (tag_info(t).present) {
+ printf("%4d %4d %5d", i, tag_info(t).type, tag_info(t).count);
+ switch (tag_info(t).type) {
+ case BYTE_TYPE:
+ case USHORT_TYPE:
+ printf(" %5u", tag_info(t).value);
+ switch (i) {
+ case type_tag:
+ printf(" Font Type ");
+ switch (tag_info(t).value) {
+ case MSL:
+ case SYMSET:
+ printf("(Intellifont)");
+ break;
+ case UNICODE:
+ printf("(TrueType)");
+ }
+ break;
+ case charcode_tag:
+ printf(" Number of Symbols (%u)", tag_info(t).count);
+ break;
+ case symbol_set_tag:
+ printf(" Symbol Sets (%u): ",
+ tag_info(symbol_set_tag).count / 14);
+ dump_symbol_sets(f);
+ break;
+ case type_structure_tag:
+ printf(" Type Structure (%u)", tag_info(t).value);
+ break;
+ case stroke_weight_tag:
+ printf(" Stroke Weight (%u)", tag_info(t).value);
+ break;
+ case spacing_tag:
+ printf(" Spacing ");
+ switch (tag_info(t).value) {
+ case 0:
+ printf("(Proportional)");
+ break;
+ case 1:
+ printf("(Fixed Pitch: %u DU: %.2f em)", tag_info(t).value,
+ em_fract(tag_info(t).value));
+ break;
+ }
+ break;
+ case appearance_width_tag:
+ printf(" Appearance Width (%u)", tag_info(t).value);
+ break;
+ case serif_style_tag:
+ printf(" Serif Style (%u)", tag_info(t).value);
+ break;
+ case posture_tag:
+ printf(" Posture (%s)", tag_info(t).value == 0
+ ? "Upright"
+ : tag_info(t).value == 1
+ ? "Italic"
+ : "Alternate Italic");
+ break;
+ case max_width_tag:
+ printf(" Maximum Width (%u DU: %.2f em)", tag_info(t).value,
+ em_fract(tag_info(t).value));
+ break;
+ case word_spacing_tag:
+ printf(" Interword Spacing (%u DU: %.2f em)", tag_info(t).value,
+ em_fract(tag_info(t).value));
+ break;
+ case recommended_line_spacing_tag:
+ printf(" Recommended Line Spacing (%u DU: %.2f em)", tag_info(t).value,
+ em_fract(tag_info(t).value));
+ break;
+ case x_height_tag:
+ printf(" x-Height (%u DU: %.2f em)", tag_info(t).value,
+ em_fract(tag_info(t).value));
+ break;
+ case cap_height_tag:
+ printf(" Cap Height (%u DU: %.2f em)", tag_info(t).value,
+ em_fract(tag_info(t).value));
+ break;
+ case max_ascent_tag:
+ printf(" Maximum Ascent (%u DU: %.2f em)", tag_info(t).value,
+ em_fract(tag_info(t).value));
+ break;
+ case lower_ascent_tag:
+ printf(" Lowercase Ascent (%u DU: %.2f em)", tag_info(t).value,
+ em_fract(tag_info(t).value));
+ break;
+ case underscore_thickness_tag:
+ printf(" Underscore Thickness (%u DU: %.2f em)", tag_info(t).value,
+ em_fract(tag_info(t).value));
+ break;
+ case uppercase_accent_height_tag:
+ printf(" Uppercase Accent Height (%u DU: %.2f em)", tag_info(t).value,
+ em_fract(tag_info(t).value));
+ break;
+ case lowercase_accent_height_tag:
+ printf(" Lowercase Accent Height (%u DU: %.2f em)", tag_info(t).value,
+ em_fract(tag_info(t).value));
+ break;
+ case width_tag:
+ printf(" Horizontal Escapement array");
+ break;
+ case vertical_escapement_tag:
+ printf(" Vertical Escapement array");
+ break;
+ case right_extent_tag:
+ printf(" Right Extent array");
+ break;
+ case ascent_tag:
+ printf(" Character Ascent array");
+ break;
+ case pair_kern_tag:
+ f.seek(tag_info(t).value);
+ printf(" Kern Pairs (%u)", f.get_uint16());
+ break;
+ case panose_tag:
+ printf(" PANOSE Classification array");
+ break;
+ }
+ break;
+ case SIGNED_SHORT_TYPE:
+ printf(" %5d", int16(tag_info(t).value));
+ switch (i) {
+ case slant_tag:
+ printf(" Slant (%.2f degrees)", double(tag_info(t).value) / 100);
+ break;
+ case max_descent_tag:
+ printf(" Maximum Descent (%d DU: %.2f em)", int16(tag_info(t).value),
+ em_fract(int16(tag_info(t).value)));
+ break;
+ case lower_descent_tag:
+ printf(" Lowercase Descent (%d DU: %.2f em)", int16(tag_info(t).value),
+ em_fract(int16(tag_info(t).value)));
+ break;
+ case underscore_depth_tag:
+ printf(" Underscore Depth (%d DU: %.2f em)", int16(tag_info(t).value),
+ em_fract(int16(tag_info(t).value)));
+ break;
+ case left_extent_tag:
+ printf(" Left Extent array");
+ break;
+ // The type of this tag has changed from SHORT to SIGNED SHORT
+ // in TFM version 1.3.0.
+ case ascent_tag:
+ printf(" Character Ascent array");
+ break;
+ case descent_tag:
+ printf(" Character Descent array");
+ break;
+ }
+ break;
+ case RATIONAL_TYPE:
+ printf(" %5u", tag_info(t).value);
+ switch (i) {
+ case inches_per_point_tag:
+ printf(" Inches per Point");
+ break;
+ case nominal_point_size_tag:
+ printf(" Nominal Point Size");
+ break;
+ case design_units_per_em_tag:
+ printf(" Design Units per Em");
+ break;
+ case average_width_tag:
+ printf(" Average Width");
+ break;
+ }
+ if (tag_info(t).count == 1) {
+ f.seek(tag_info(t).value);
+ uint32 num = f.get_uint32();
+ uint32 den = f.get_uint32();
+ if (i == design_units_per_em_tag)
+ upem = double(num) / den;
+ printf(" (%u/%u = %g)", num, den, double(num)/den);
+ }
+ break;
+ case ASCII_TYPE:
+ printf(" %5u ", tag_info(t).value);
+ switch (i) {
+ case comment_tag:
+ printf("Comment ");
+ break;
+ case copyright_tag:
+ printf("Copyright ");
+ break;
+ case unique_identifier_tag:
+ printf("Unique ID ");
+ break;
+ case font_name_tag:
+ printf("Typeface Name ");
+ break;
+ case typeface_source_tag:
+ printf("Typeface Source ");
+ break;
+ case typeface_tag:
+ printf("PCL Typeface ");
+ break;
+ }
+ dump_ascii(f, t);
+ }
+ putchar('\n');
+ }
+ }
+ putchar('\n');
+}
+#undef em_fract
+
+static void
+dump_ascii(File &f, tag_type t)
+{
+ putchar('"');
+ if (tag_info(t).count > 4) {
+ int count = tag_info(t).count;
+ f.seek(tag_info(t).value);
+ while (--count)
+ printf("%c", f.get_byte());
+ }
+ else
+ printf("%.4s", tag_info(t).orig_value);
+ putchar('"');
+}
+
+static void
+dump_symbol_sets(File &f)
+{
+ uint32 symbol_set_dir_length = tag_info(symbol_set_tag).count;
+ uint32 num_symbol_sets = symbol_set_dir_length / 14;
+
+ for (uint32 i = 0; i < num_symbol_sets; i++) {
+ f.seek(tag_info(symbol_set_tag).value + i * 14);
+ (void)f.get_uint32(); // offset to symbol set name
+ uint32 off1 = f.get_uint32(); // offset to selection string
+ uint32 off2 = f.get_uint32(); // offset to symbol set index array
+ f.seek(off1);
+ for (uint32 j = 0; j < off2 - off1; j++) {
+ unsigned char c = f.get_byte();
+ if ('0' <= c && c <= '9')
+ putchar(c);
+ else if ('A' <= c && c <= 'Z')
+ printf(i < num_symbol_sets - 1 ? "%c," : "%c", c);
+ }
+ }
+}
+
+static void
+dump_symbols(int tfm_type)
+{
+ printf("Symbols:\n"
+ "\n"
+ " glyph id# symbol set name(s)\n"
+ "----------------------------------\n");
+ for (uint32 i = 0; i < nchars; i++) {
+ uint16 charcode = char_table[i].charcode;
+ if (charcode < charcode_name_table_size
+ && charcode_name_table[charcode]) {
+ if (char_table[i].symbol_set != NO_SYMBOL_SET) {
+ printf(tfm_type == UNICODE ? "%4d (U+%04X) (%3s %3d) %s"
+ : "%4d (MSL %4d) (%3s %3d) %s",
+ i, charcode,
+ show_symset(char_table[i].symbol_set),
+ char_table[i].code,
+ charcode_name_table[charcode]->name);
+ for (name_list *p = charcode_name_table[charcode]->next;
+ p; p = p->next)
+ printf(", %s", p->name);
+ putchar('\n');
+ }
+ }
+ else {
+ printf(tfm_type == UNICODE ? "%4d (U+%04X) "
+ : "%4d (MSL %4d) ",
+ i, charcode);
+ if (char_table[i].symbol_set != NO_SYMBOL_SET)
+ printf("(%3s %3d)",
+ show_symset(char_table[i].symbol_set), char_table[i].code);
+ putchar('\n');
+ }
+ }
+ putchar('\n');
+}
+
+static char *
+show_symset(unsigned int symset)
+{
+ // A 64-bit unsigned int produces up to 20 decimal digits.
+ assert(sizeof(unsigned int) <= 8);
+ static char symset_str[22]; // 20 digits + symset char + \0
+ sprintf(symset_str, "%u%c", symset / 32, (symset & 31) + 64);
+ return symset_str;
+}
+
+static char *
+hp_msl_to_ucode_name(int msl)
+{
+ // A 64-bit signed int produces up to 19 decimal digits plus a sign.
+ assert(sizeof(int) <= 8);
+ char codestr[21]; // 19 digits + possible sign + \0
+ sprintf(codestr, "%d", msl);
+ const char *ustr = hp_msl_to_unicode_code(codestr);
+ if (ustr == NULL)
+ ustr = UNNAMED;
+ else {
+ char *nonum;
+ int ucode = int(strtol(ustr, &nonum, 16));
+ // don't allow PUA code points as Unicode names
+ if (ucode >= 0xE000 && ucode <= 0xF8FF)
+ ustr = UNNAMED;
+ }
+ if (!equal(ustr, UNNAMED)) {
+ const char *uname_decomposed = decompose_unicode(ustr);
+ if (uname_decomposed)
+ // 1st char is the number of components
+ ustr = uname_decomposed + 1;
+ }
+ char *value = new char[strlen(ustr) + 1];
+ sprintf(value, equal(ustr, UNNAMED) ? UNNAMED : "u%s", ustr);
+ return value;
+}
+
+static char *
+unicode_to_ucode_name(int ucode)
+{
+ // A 64-bit signed int produces up to 16 hexadecimal digits.
+ assert(sizeof(int) <= 8);
+ const char *ustr;
+ char codestr[17]; // 16 hex digits + \0
+
+ // don't allow PUA code points as Unicode names
+ if (ucode >= 0xE000 && ucode <= 0xF8FF)
+ ustr = UNNAMED;
+ else {
+ sprintf(codestr, "%04X", ucode);
+ ustr = codestr;
+ }
+ if (!equal(ustr, UNNAMED)) {
+ const char *uname_decomposed = decompose_unicode(ustr);
+ if (uname_decomposed)
+ // 1st char is the number of components
+ ustr = uname_decomposed + 1;
+ }
+ char *value = new char[strlen(ustr) + 1];
+ sprintf(value, equal(ustr, UNNAMED) ? UNNAMED : "u%s", ustr);
+ return value;
+}
+
+static int
+is_uname(char *name)
+{
+ size_t i;
+ size_t len = strlen(name);
+ if (len % 5)
+ return 0;
+
+ if (name[0] != 'u')
+ return 0;
+ for (i = 1; i < 4; i++)
+ if (!csxdigit(name[i]))
+ return 0;
+ for (i = 5; i < len; i++)
+ if (i % 5 ? !csxdigit(name[i]) : name[i] != '_')
+ return 0;
+
+ return 1;
+}
+
+static int
+read_map(const char *file, const int tfm_type)
+{
+ errno = 0;
+ FILE *fp = fopen(file, "r");
+ if (!fp) {
+ error("can't open '%1': %2", file, strerror(errno));
+ return 0;
+ }
+ current_filename = file;
+ char buf[512];
+ current_lineno = 0;
+ char *nonum;
+ while (fgets(buf, int(sizeof(buf)), fp)) {
+ current_lineno++;
+ char *ptr = buf;
+ while (csspace(*ptr))
+ ptr++;
+ if (*ptr == '\0' || *ptr == '#')
+ continue;
+ ptr = strtok(ptr, " \n\t");
+ if (!ptr)
+ continue;
+
+ int msl_code = int(strtol(ptr, &nonum, 10));
+ if (*nonum != '\0') {
+ if (csxdigit(*nonum))
+ error("bad MSL map: got hex code (%1)", ptr);
+ else if (ptr == nonum)
+ error("bad MSL map: bad MSL code (%1)", ptr);
+ else
+ error("bad MSL map");
+ fclose(fp);
+ return 0;
+ }
+
+ ptr = strtok(NULL, " \n\t");
+ if (!ptr)
+ continue;
+ int unicode = int(strtol(ptr, &nonum, 16));
+ if (*nonum != '\0') {
+ if (ptr == nonum)
+ error("bad Unicode value (%1)", ptr);
+ else
+ error("bad Unicode map");
+ fclose(fp);
+ return 0;
+ }
+ if (strlen(ptr) != 4) {
+ error("bad Unicode value (%1)", ptr);
+ return 0;
+ }
+
+ int n = tfm_type == MSL ? msl_code : unicode;
+ if (tfm_type == UNICODE && n > 0xFFFF) {
+ // greatest value supported by TFM files
+ error("bad Unicode value (%1): greatest value is 0xFFFF", ptr);
+ fclose(fp);
+ return 0;
+ }
+ else if (n < 0) {
+ error("negative code value (%1)", ptr);
+ fclose(fp);
+ return 0;
+ }
+
+ ptr = strtok(NULL, " \n\t");
+ if (!ptr) { // groff name
+ error("missing name(s)");
+ fclose(fp);
+ return 0;
+ }
+ // leave decomposed Unicode values alone
+ else if (is_uname(ptr) && !is_decomposed(ptr))
+ ptr = unicode_to_ucode_name(strtol(ptr + 1, &nonum, 16));
+
+ if (size_t(n) >= charcode_name_table_size) {
+ size_t old_size = charcode_name_table_size;
+ name_list **old_table = charcode_name_table;
+ charcode_name_table_size = n + 256;
+ charcode_name_table = new name_list *[charcode_name_table_size];
+ if (old_table) {
+ memcpy(charcode_name_table, old_table, old_size*sizeof(name_list *));
+ delete[] old_table;
+ }
+ for (size_t i = old_size; i < charcode_name_table_size; i++)
+ charcode_name_table[i] = NULL;
+ }
+
+ // a '#' that isn't the first groff name begins a comment
+ for (int names = 1; ptr; ptr = strtok(NULL, " \n\t")) {
+ if (names++ > 1 && *ptr == '#')
+ break;
+ charcode_name_table[n] = new name_list(ptr, charcode_name_table[n]);
+ }
+ }
+ fclose(fp);
+ return 1;
+}
+
+static const char *
+xbasename(const char *s)
+{
+ // DIR_SEPS[] are possible directory separator characters, see
+ // nonposix.h. We want the rightmost separator of all possible
+ // ones. Example: d:/foo\\bar.
+ const char *b = strrchr(s, DIR_SEPS[0]), *b1;
+ const char *sep = &DIR_SEPS[1];
+
+ while (*sep)
+ {
+ b1 = strrchr(s, *sep);
+ if (b1 && (!b || b1 > b))
+ b = b1;
+ sep++;
+ }
+ return b ? b + 1 : s;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/utils/hpftodit/hpuni.cpp b/src/utils/hpftodit/hpuni.cpp
new file mode 100644
index 0000000..b3f933f
--- /dev/null
+++ b/src/utils/hpftodit/hpuni.cpp
@@ -0,0 +1,697 @@
+// -*- C++ -*-
+/* Copyright (C) 2003-2020 Free Software Foundation, Inc.
+ Written by Jeff Conrad (jeff_conrad@msn.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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+#include "stringclass.h"
+#include "ptable.h"
+
+#include "unicode.h"
+
+struct hp_msl_to_unicode {
+ char *value;
+};
+
+declare_ptable(hp_msl_to_unicode)
+implement_ptable(hp_msl_to_unicode)
+
+PTABLE(hp_msl_to_unicode) hp_msl_to_unicode_table;
+
+struct S {
+ const char *key;
+ const char *value;
+} hp_msl_to_unicode_list[] = {
+ { "1", "0021", }, // Exclamation Mark
+ { "2", "0022", }, // Neutral Double Quote
+ { "3", "0023", }, // Number Sign
+ { "4", "0024", }, // Dollar Sign
+ { "5", "0025", }, // Per Cent Sign
+ { "6", "0026", }, // Ampersand
+ { "8", "2019", }, // Single Close Quote (9)
+ { "9", "0028", }, // Left Parenthesis
+ { "10", "0029", }, // Right Parenthesis
+ { "11", "002A", }, // Asterisk
+ { "12", "002B", }, // Plus Sign
+ { "13", "002C", }, // Comma, or Decimal Separator
+ { "14", "002D", }, // Hyphen
+ { "15", "002E", }, // Period, or Full Stop
+ { "16", "002F", }, // Solidus, or Slash
+ { "17", "0030", }, // Numeral Zero
+ { "18", "0031", }, // Numeral One
+ { "19", "0032", }, // Numeral Two
+ { "20", "0033", }, // Numeral Three
+ { "21", "0034", }, // Numeral Four
+ { "22", "0035", }, // Numeral Five
+ { "23", "0036", }, // Numeral Six
+ { "24", "0037", }, // Numeral Seven
+ { "25", "0038", }, // Numeral Eight
+ { "26", "0039", }, // Numeral Nine
+ { "27", "003A", }, // Colon
+ { "28", "003B", }, // Semicolon
+ { "29", "003C", }, // Less Than Sign
+ { "30", "003D", }, // Equals Sign
+ { "31", "003E", }, // Greater Than Sign
+ { "32", "003F", }, // Question Mark
+ { "33", "0040", }, // Commercial At
+ { "34", "0041", }, // Uppercase A
+ { "35", "0042", }, // Uppercase B
+ { "36", "0043", }, // Uppercase C
+ { "37", "0044", }, // Uppercase D
+ { "38", "0045", }, // Uppercase E
+ { "39", "0046", }, // Uppercase F
+ { "40", "0047", }, // Uppercase G
+ { "41", "0048", }, // Uppercase H
+ { "42", "0049", }, // Uppercase I
+ { "43", "004A", }, // Uppercase J
+ { "44", "004B", }, // Uppercase K
+ { "45", "004C", }, // Uppercase L
+ { "46", "004D", }, // Uppercase M
+ { "47", "004E", }, // Uppercase N
+ { "48", "004F", }, // Uppercase O
+ { "49", "0050", }, // Uppercase P
+ { "50", "0051", }, // Uppercase Q
+ { "51", "0052", }, // Uppercase R
+ { "52", "0053", }, // Uppercase S
+ { "53", "0054", }, // Uppercase T
+ { "54", "0055", }, // Uppercase U
+ { "55", "0056", }, // Uppercase V
+ { "56", "0057", }, // Uppercase W
+ { "57", "0058", }, // Uppercase X
+ { "58", "0059", }, // Uppercase Y
+ { "59", "005A", }, // Uppercase Z
+ { "60", "005B", }, // Left Bracket
+ { "61", "005C", }, // Reverse Solidus, or Backslash
+ { "62", "005D", }, // Right Bracket
+ { "63", "005E", }, // Circumflex, Exponent, or Pointer
+ { "64", "005F", }, // Underline or Underscore Character
+ { "66", "2018", }, // Single Open Quote (6)
+ { "67", "0061", }, // Lowercase A
+ { "68", "0062", }, // Lowercase B
+ { "69", "0063", }, // Lowercase C
+ { "70", "0064", }, // Lowercase D
+ { "71", "0065", }, // Lowercase E
+ { "72", "0066", }, // Lowercase F
+ { "73", "0067", }, // Lowercase G
+ { "74", "0068", }, // Lowercase H
+ { "75", "0069", }, // Lowercase I
+ { "76", "006A", }, // Lowercase J
+ { "77", "006B", }, // Lowercase K
+ { "78", "006C", }, // Lowercase L
+ { "79", "006D", }, // Lowercase M
+ { "80", "006E", }, // Lowercase N
+ { "81", "006F", }, // Lowercase O
+ { "82", "0070", }, // Lowercase P
+ { "83", "0071", }, // Lowercase Q
+ { "84", "0072", }, // Lowercase R
+ { "85", "0073", }, // Lowercase S
+ { "86", "0074", }, // Lowercase T
+ { "87", "0075", }, // Lowercase U
+ { "88", "0076", }, // Lowercase V
+ { "89", "0077", }, // Lowercase W
+ { "90", "0078", }, // Lowercase X
+ { "91", "0079", }, // Lowercase Y
+ { "92", "007A", }, // Lowercase Z
+ { "93", "007B", }, // Left Brace
+ { "94", "007C", }, // Long Vertical Mark
+ { "95", "007D", }, // Right Brace
+ { "96", "007E", }, // One Wavy Line Approximate
+ { "97", "2592", }, // Medium Shading Character
+ { "99", "00C0", }, // Uppercase A Grave
+ { "100", "00C2", }, // Uppercase A Circumflex
+ { "101", "00C8", }, // Uppercase E Grave
+ { "102", "00CA", }, // Uppercase E Circumflex
+ { "103", "00CB", }, // Uppercase E Dieresis
+ { "104", "00CE", }, // Uppercase I Circumflex
+ { "105", "00CF", }, // Uppercase I Dieresis
+ { "106", "00B4", }, // Lowercase Acute Accent (Spacing)
+ { "107", "0060", }, // Lowercase Grave Accent (Spacing)
+ { "108", "02C6", }, // Lowercase Circumflex Accent (Spacing)
+ { "109", "00A8", }, // Lowercase Dieresis Accent (Spacing)
+ { "110", "02DC", }, // Lowercase Tilde Accent (Spacing)
+ { "111", "00D9", }, // Uppercase U Grave
+ { "112", "00DB", }, // Uppercase U Circumflex
+ { "113", "00AF", }, // Overline, or Overscore Character
+ { "114", "00DD", }, // Uppercase Y Acute
+ { "115", "00FD", }, // Lowercase Y Acute
+ { "116", "00B0", }, // Degree Sign
+ { "117", "00C7", }, // Uppercase C Cedilla
+ { "118", "00E7", }, // Lowercase C Cedilla
+ { "119", "00D1", }, // Uppercase N Tilde
+ { "120", "00F1", }, // Lowercase N Tilde
+ { "121", "00A1", }, // Inverted Exclamation
+ { "122", "00BF", }, // Inverted Question Mark
+ { "123", "00A4", }, // Currency Symbol
+ { "124", "00A3", }, // Pound Sterling Sign
+ { "125", "00A5", }, // Yen Sign
+ { "126", "00A7", }, // Section Mark
+ { "127", "0192", }, // Florin Sign
+ { "128", "00A2", }, // Cent Sign
+ { "129", "00E2", }, // Lowercase A Circumflex
+ { "130", "00EA", }, // Lowercase E Circumflex
+ { "131", "00F4", }, // Lowercase O Circumflex
+ { "132", "00FB", }, // Lowercase U Circumflex
+ { "133", "00E1", }, // Lowercase A Acute
+ { "134", "00E9", }, // Lowercase E Acute
+ { "135", "00F3", }, // Lowercase O Acute
+ { "136", "00FA", }, // Lowercase U Acute
+ { "137", "00E0", }, // Lowercase A Grave
+ { "138", "00E8", }, // Lowercase E Grave
+ { "139", "00F2", }, // Lowercase O Grave
+ { "140", "00F9", }, // Lowercase U Grave
+ { "141", "00E4", }, // Lowercase A Dieresis
+ { "142", "00EB", }, // Lowercase E Dieresis
+ { "143", "00F6", }, // Lowercase O Dieresis
+ { "144", "00FC", }, // Lowercase U Dieresis
+ { "145", "00C5", }, // Uppercase A Ring
+ { "146", "00EE", }, // Lowercase I Circumflex
+ { "147", "00D8", }, // Uppercase O Oblique
+ { "148", "00C6", }, // Uppercase AE Diphthong
+ { "149", "00E5", }, // Lowercase A Ring
+ { "150", "00ED", }, // Lowercase I Acute
+ { "151", "00F8", }, // Lowercase O Oblique
+ { "152", "00E6", }, // Lowercase AE Diphthong
+ { "153", "00C4", }, // Uppercase A Dieresis
+ { "154", "00EC", }, // Lowercase I Grave
+ { "155", "00D6", }, // Uppercase O Dieresis
+ { "156", "00DC", }, // Uppercase U Dieresis
+ { "157", "00C9", }, // Uppercase E Acute
+ { "158", "00EF", }, // Lowercase I Dieresis
+ { "159", "00DF", }, // Lowercase Es-zet Ligature
+ { "160", "00D4", }, // Uppercase O Circumflex
+ { "161", "00C1", }, // Uppercase A Acute
+ { "162", "00C3", }, // Uppercase A Tilde
+ { "163", "00E3", }, // Lowercase A Tilde
+ { "164", "00D0", }, // Uppercase Eth
+//{ "164", "0110", }, // Uppercase D-Stroke
+ { "165", "00F0", }, // Lowercase Eth
+ { "166", "00CD", }, // Uppercase I Acute
+ { "167", "00CC", }, // Uppercase I Grave
+ { "168", "00D3", }, // Uppercase O Acute
+ { "169", "00D2", }, // Uppercase O Grave
+ { "170", "00D5", }, // Uppercase O Tilde
+ { "171", "00F5", }, // Lowercase O Tilde
+ { "172", "0160", }, // Uppercase S Hacek
+ { "173", "0161", }, // Lowercase S Hacek
+ { "174", "00DA", }, // Uppercase U Acute
+ { "175", "0178", }, // Uppercase Y Dieresis
+ { "176", "00FF", }, // Lowercase Y Dieresis
+ { "177", "00DE", }, // Uppercase Thorn
+ { "178", "00FE", }, // Lowercase Thorn
+ { "180", "00B5", }, // Lowercase Greek Mu, or Micro
+ { "181", "00B6", }, // Pilcrow, or Paragraph Sign
+ { "182", "00BE", }, // Vulgar Fraction 3/4
+ { "183", "2212", }, // Minus Sign
+ { "184", "00BC", }, // Vulgar Fraction 1/4
+ { "185", "00BD", }, // Vulgar Fraction 1/2
+ { "186", "00AA", }, // Female Ordinal
+ { "187", "00BA", }, // Male Ordinal
+ { "188", "00AB", }, // Left Pointing Double Angle Quote
+ { "189", "25A0", }, // Medium Solid Square Box
+ { "190", "00BB", }, // Right Pointing Double Angle Quote
+ { "191", "00B1", }, // Plus Over Minus Sign
+ { "192", "00A6", }, // Broken Vertical Mark
+ { "193", "00A9", }, // Copyright Sign
+ { "194", "00AC", }, // Not Sign
+ { "195", "00AD", }, // Soft Hyphen
+ { "196", "00AE", }, // Registered Sign
+ { "197", "00B2", }, // Superior Numeral 2
+ { "198", "00B3", }, // Superior Numeral 3
+ { "199", "00B8", }, // Lowercase Cedilla (Spacing)
+ { "200", "00B9", }, // Superior Numeral 1
+ { "201", "00D7", }, // Multiply Sign
+ { "202", "00F7", }, // Divide Sign
+ { "203", "263A", }, // Open Smiling Face
+ { "204", "263B", }, // Solid Smiling Face
+ { "205", "2665", }, // Solid Heart, Card Suit
+ { "206", "2666", }, // Solid Diamond, Card Suit
+ { "207", "2663", }, // Solid Club, Card Suit
+ { "208", "2660", }, // Solid Spade, Card Suit
+ { "209", "25CF", }, // Medium Solid Round Bullet
+ { "210", "25D8", }, // Large Solid square with White Dot
+ { "211", "EFFD", }, // Large Open Round Bullet
+ { "212", "25D9", }, // Large Solid square with White Circle
+ { "213", "2642", }, // Male Symbol
+ { "214", "2640", }, // Female Symbol
+ { "215", "266A", }, // Musical Note
+ { "216", "266B", }, // Pair Of Musical Notes
+ { "217", "263C", }, // Compass, or Eight Pointed Sun
+ { "218", "25BA", }, // Right Solid Arrowhead
+ { "219", "25C4", }, // Left Solid Arrowhead
+ { "220", "2195", }, // Up/Down Arrow
+ { "221", "203C", }, // Double Exclamation Mark
+ { "222", "25AC", }, // Thick Horizontal Mark
+ { "223", "21A8", }, // Up/Down Arrow Baseline
+ { "224", "2191", }, // Up Arrow
+ { "225", "2193", }, // Down Arrow
+ { "226", "2192", }, // Right Arrow
+ { "227", "2190", }, // Left Arrow
+ { "229", "2194", }, // Left/Right Arrow
+ { "230", "25B2", }, // Up Solid Arrowhead
+ { "231", "25BC", }, // Down Solid Arrowhead
+ { "232", "20A7", }, // Pesetas Sign
+ { "233", "2310", }, // Reversed Not Sign
+ { "234", "2591", }, // Light Shading Character
+ { "235", "2593", }, // Dark Shading Character
+ { "236", "2502", }, // Box Draw Line, Vert. 1
+ { "237", "2524", }, // Box Draw Right Tee, Vert. 1 Horiz. 1
+ { "238", "2561", }, // Box Draw Right Tee, Vert. 1 Horiz. 2
+ { "239", "2562", }, // Box Draw Right Tee, Vert. 2 Horiz. 1
+ { "240", "2556", }, // Box Draw Upper Right Corner, Vert. 2 Horiz. 1
+ { "241", "2555", }, // Box Draw Upper Right Corner, Vert. 1 Horiz. 2
+ { "242", "2563", }, // Box Draw Right Tee, Vert. 2 Horiz. 2
+ { "243", "2551", }, // Box Draw Lines, Vert. 2
+ { "244", "2557", }, // Box Draw Upper Right Corner, Vert. 2 Horiz. 2
+ { "245", "255D", }, // Box Draw Lower Right Corner, Vert. 2 Horiz. 2
+ { "246", "255C", }, // Box Draw Lower Right Corner, Vert. 2 Horiz. 1
+ { "247", "255B", }, // Box Draw Lower Right Corner, Vert. 1 Horiz. 2
+ { "248", "2510", }, // Box Draw Upper Right Corner, Vert. 1, Horiz. 1
+ { "249", "2514", }, // Box Draw Lower Left Corner, Vert. 1, Horiz. 1
+ { "250", "2534", }, // Box Draw Bottom Tee, Vert. 1 Horiz. 1
+ { "251", "252C", }, // Box Draw Top Tee, Vert. 1 Horiz. 1
+ { "252", "251C", }, // Box Draw Left Tee, Vert. 1 Horiz. 1
+ { "253", "2500", }, // Box Draw Line, Horiz. 1
+ { "254", "253C", }, // Box Draw Cross, Vert. 1 Horiz. 1
+ { "255", "255E", }, // Box Draw Left Tee, Vert. 1 Horiz. 2
+ { "256", "255F", }, // Box Draw Left Tee, Vert. 2 Horz. 1
+ { "257", "255A", }, // Box Draw Lower Left Corner, Vert. 2 Horiz. 2
+ { "258", "2554", }, // Box Draw Upper Left Corner, Vert. 2 Horiz. 2
+ { "259", "2569", }, // Box Draw Bottom Tee, Vert. 2 Horiz. 2
+ { "260", "2566", }, // Box Draw Top Tee, Vert. 2 Horiz. 2
+ { "261", "2560", }, // Box Draw Left Tee, Vert. 2 Horiz. 2
+ { "262", "2550", }, // Box Draw Lines, Horiz. 2
+ { "263", "256C", }, // Box Draw Cross Open Center, Vert. 2 Horiz. 2
+ { "264", "2567", }, // Box Draw Bottom Tee, Vert. 1 Horiz. 2
+ { "265", "2568", }, // Box Draw Bottom Tee, Vert. 2 Horiz. 1
+ { "266", "2564", }, // Box Draw Top Tee, Vert. 1 Horiz. 2
+ { "267", "2565", }, // Box Draw Top Tee, Vert. 2 Horiz. 1
+ { "268", "2559", }, // Box Draw Lower Left Corner, Vert. 2 Horiz. 1
+ { "269", "2558", }, // Box Draw Lower Left Corner, Vert. 1 Horiz. 2
+ { "270", "2552", }, // Box Draw Upper Left Corner, Vert. 1 Horiz. 2
+ { "271", "2553", }, // Box Draw Upper Left Corner, Vert. 2 Horiz. 1
+ { "272", "256B", }, // Box Draw Cross, Vert. 2 Horiz. 1
+ { "273", "256A", }, // Box Draw Cross, Vert. 1 Horiz. 2
+ { "274", "2518", }, // Box Draw Lower Right Corner, Vert. 1 Horiz. 1
+ { "275", "250C", }, // Box Draw Upper Left Corner, Vert. 1, Horiz. 1
+ { "276", "2588", }, // Solid Full High/Wide
+ { "277", "2584", }, // Bottom Half Solid Rectangle
+ { "278", "258C", }, // Left Half Solid Rectangle
+ { "279", "2590", }, // Right Half Solid Rectangle
+ { "280", "2580", }, // Top Half Solid Rectangle
+ { "290", "2126", }, // Uppercase Greek Omega, or Ohms
+ { "292", "221E", }, // Infinity Symbol
+ { "295", "2229", }, // Set Intersection Symbol
+ { "296", "2261", }, // Exactly Equals Sign
+ { "297", "2265", }, // Greater Than or Equal Sign
+ { "298", "2264", }, // Less Than or Equal Sign
+ { "299", "2320", }, // Top Integral
+ { "300", "2321", }, // Bottom Integral
+ { "301", "2248", }, // Two Wavy Line Approximate Sign
+//{ "302", "00B7", }, // Middle Dot, or Centered Period (see 2219)
+//{ "302", "2219", }, // Centered Period, Middle Dot
+ { "302", "2219", }, // Math Dot, Centered Period
+ { "303", "221A", }, // Radical Symbol, Standalone Diagonal
+ { "305", "25AA", }, // Small Solid Square Box
+ { "306", "013F", }, // Uppercase L-Dot
+ { "307", "0140", }, // Lowercase L-Dot
+ { "308", "2113", }, // Litre Symbol
+ { "309", "0149", }, // Lowercase Apostrophe-N
+ { "310", "2032", }, // Prime, Minutes, or Feet Symbol
+ { "311", "2033", }, // Double Prime, Seconds, or Inches Symbol
+ { "312", "2020", }, // Dagger Symbol
+ { "313", "2122", }, // Trademark Sign
+ { "314", "2017", }, // Double Underline Character
+ { "315", "02C7", }, // Lowercase Hacek Accent (Spacing)
+ { "316", "02DA", }, // Lowercase Ring Accent (Spacing)
+ { "317", "EFF9", }, // Uppercase Acute Accent (Spacing)
+ { "318", "EFF8", }, // Uppercase Grave Accent (Spacing)
+ { "319", "EFF7", }, // Uppercase Circumflex Accent (Spacing)
+ { "320", "EFF6", }, // Uppercase Dieresis Accent (Spacing)
+ { "321", "EFF5", }, // Uppercase Tilde Accent (Spacing)
+ { "322", "EFF4", }, // Uppercase Hacek Accent (Spacing)
+ { "323", "EFF3", }, // Uppercase Ring Accent (Spacing)
+ { "324", "2215", }, // Vulgar Fraction Bar
+ { "325", "2014", }, // Em Dash
+ { "326", "2013", }, // En Dash
+ { "327", "2021", }, // Double Dagger Symbol
+ { "328", "0131", }, // Lowercase Undotted I
+ { "329", "0027", }, // Neutral Single Quote
+ { "330", "EFF2", }, // Uppercase Cedilla (Spacing)
+ { "331", "2022", }, // Small Solid Round Bullet
+ { "332", "207F", }, // Superior Lowercase N
+ { "333", "2302", }, // Home Plate
+ { "335", "0138", }, // Lowercase Kra
+ { "338", "0166", }, // Uppercase T-Stroke
+ { "339", "0167", }, // Lowercase T-Stroke
+ { "340", "014A", }, // Uppercase Eng
+ { "341", "014B", }, // Lowercase Eng
+ { "342", "0111", }, // Lowercase D-Stroke
+ { "400", "0102", }, // Uppercase A Breve
+ { "401", "0103", }, // Lowercase A Breve
+ { "402", "0100", }, // Uppercase A Macron
+ { "403", "0101", }, // Lowercase A Macron
+ { "404", "0104", }, // Uppercase A Ogonek
+ { "405", "0105", }, // Lowercase A Ogonek
+ { "406", "0106", }, // Uppercase C Acute
+ { "407", "0107", }, // Lowercase C Acute
+ { "410", "010C", }, // Uppercase C Hacek
+ { "411", "010D", }, // Lowercase C Hacek
+ { "414", "010E", }, // Uppercase D Hacek
+ { "415", "010F", }, // Lowercase D Hacek
+ { "416", "011A", }, // Uppercase E Hacek
+ { "417", "011B", }, // Lowercase E Hacek
+ { "418", "0116", }, // Uppercase E Overdot
+ { "419", "0117", }, // Lowercase E Overdot
+ { "420", "0112", }, // Uppercase E Macron
+ { "421", "0113", }, // Lowercase E Macron
+ { "422", "0118", }, // Uppercase E Ogonek
+ { "423", "0119", }, // Lowercase E Ogonek
+ { "428", "0122", }, // Uppercase G Cedilla
+ { "429", "0123", }, // Lowercase G Cedilla
+ { "432", "012E", }, // Uppercase I Ogonek
+ { "433", "012F", }, // Lowercase I Ogonek
+ { "434", "012A", }, // Uppercase I Macron
+ { "435", "012B", }, // Lowercase I Macron
+ { "438", "0136", }, // Uppercase K Cedilla
+ { "439", "0137", }, // Lowercase K Cedilla
+ { "440", "0139", }, // Uppercase L Acute
+ { "441", "013A", }, // Lowercase L Acute
+ { "442", "013D", }, // Uppercase L Hacek
+ { "443", "013E", }, // Lowercase L Hacek
+ { "444", "013B", }, // Uppercase L Cedilla
+ { "445", "013C", }, // Lowercase L Cedilla
+ { "446", "0143", }, // Uppercase N Acute
+ { "447", "0144", }, // Lowercase N Acute
+ { "448", "0147", }, // Uppercase N Hacek
+ { "449", "0148", }, // Lowercase N Hacek
+ { "450", "0145", }, // Uppercase N Cedilla
+ { "451", "0146", }, // Lowercase N Cedilla
+ { "452", "0150", }, // Uppercase O Double Acute
+ { "453", "0151", }, // Lowercase O Double Acute
+ { "454", "014C", }, // Uppercase O Macron
+ { "455", "014D", }, // Lowercase O Macron
+ { "456", "0154", }, // Uppercase R Acute
+ { "457", "0155", }, // Lowercase R Acute
+ { "458", "0158", }, // Uppercase R Hacek
+ { "459", "0159", }, // Lowercase R Hacek
+ { "460", "0156", }, // Uppercase R Cedilla
+ { "461", "0157", }, // Lowercase R Cedilla
+ { "462", "015A", }, // Uppercase S Acute
+ { "463", "015B", }, // Lowercase S Acute
+ { "466", "0164", }, // Uppercase T Hacek
+ { "467", "0165", }, // Lowercase T Hacek
+ { "468", "0162", }, // Uppercase T Cedilla
+ { "469", "0163", }, // Lowercase T Cedilla
+ { "470", "0168", }, // Uppercase U Tilde
+ { "471", "0169", }, // Lowercase U Tilde
+ { "474", "0170", }, // Uppercase U Double Acute
+ { "475", "0171", }, // Lowercase U Double Acute
+ { "476", "016E", }, // Uppercase U Ring
+ { "477", "016F", }, // Lowercase U Ring
+ { "478", "016A", }, // Uppercase U Macron
+ { "479", "016B", }, // Lowercase U Macron
+ { "480", "0172", }, // Uppercase U Ogonek
+ { "481", "0173", }, // Lowercase U Ogonek
+ { "482", "0179", }, // Uppercase Z Acute
+ { "483", "017A", }, // Lowercase Z Acute
+ { "484", "017B", }, // Uppercase Z Overdot
+ { "485", "017C", }, // Lowercase Z Overdot
+ { "486", "0128", }, // Uppercase I Tilde
+ { "487", "0129", }, // Lowercase I Tilde
+ { "500", "EFBF", }, // Radical, Diagonal, Composite
+ { "501", "221D", }, // Proportional To Symbol
+ { "502", "212F", }, // Napierian (italic e)
+ { "503", "03F5", }, // Alternate Lowercase Greek Epsilon
+//{ "503", "EFEC", }, // Alternate Lowercase Greek Epsilon
+ { "504", "2234", }, // Therefore Symbol
+ { "505", "0393", }, // Uppercase Greek Gamma
+ { "506", "2206", }, // Increment Symbol (Delta)
+ { "507", "0398", }, // Uppercase Greek Theta
+ { "508", "039B", }, // Uppercase Greek Lambda
+ { "509", "039E", }, // Uppercase Greek Xi
+ { "510", "03A0", }, // Uppercase Greek Pi
+ { "511", "03A3", }, // Uppercase Greek Sigma
+ { "512", "03A5", }, // Uppercase Greek Upsilon
+ { "513", "03A6", }, // Uppercase Greek Phi
+ { "514", "03A8", }, // Uppercase Greek Psi
+ { "515", "03A9", }, // Uppercase Greek Omega
+ { "516", "2207", }, // Nabla Symbol (inverted Delta)
+ { "517", "2202", }, // Partial Differential Delta Symbol
+ { "518", "03C2", }, // Lowercase Sigma, Terminal
+ { "519", "2260", }, // Not Equal To Symbol
+ { "520", "EFEB", }, // Underline, Composite
+ { "521", "2235", }, // Because Symbol
+ { "522", "03B1", }, // Lowercase Greek Alpha
+ { "523", "03B2", }, // Lowercase Greek Beta
+ { "524", "03B3", }, // Lowercase Greek Gamma
+ { "525", "03B4", }, // Lowercase Greek Delta
+ { "526", "03B5", }, // Lowercase Greek Epsilon
+ { "527", "03B6", }, // Lowercase Greek Zeta
+ { "528", "03B7", }, // Lowercase Greek Eta
+ { "529", "03B8", }, // Lowercase Greek Theta
+ { "530", "03B9", }, // Lowercase Greek Iota
+ { "531", "03BA", }, // Lowercase Greek Kappa
+ { "532", "03BB", }, // Lowercase Greek Lambda
+ { "533", "03BC", }, // Lowercase Greek Mu
+ { "534", "03BD", }, // Lowercase Greek Nu
+ { "535", "03BE", }, // Lowercase Greek Xi
+ { "536", "03BF", }, // Lowercase Greek Omicron
+ { "537", "03C0", }, // Lowercase Greek Pi
+ { "538", "03C1", }, // Lowercase Greek Rho
+ { "539", "03C3", }, // Lowercase Greek Sigma
+ { "540", "03C4", }, // Lowercase Greek Tau
+ { "541", "03C5", }, // Lowercase Greek Upsilon
+ { "542", "03C6", }, // Lowercase Greek Phi
+ { "543", "03C7", }, // Lowercase Greek Chi
+ { "544", "03C8", }, // Lowercase Greek Psi
+ { "545", "03C9", }, // Lowercase Greek Omega
+ { "546", "03D1", }, // Lowercase Greek Theta, Open
+ { "547", "03D5", }, // Lowercase Greek Phi, Open
+ { "548", "03D6", }, // Lowercase Pi, Alternate
+ { "549", "2243", }, // Wavy Over Straight Approximate Symbol
+ { "550", "2262", }, // Not Exactly Equal To Symbol
+ { "551", "21D1", }, // Up Arrow Double Stroke
+ { "552", "21D2", }, // Right Arrow Double Stroke
+ { "553", "21D3", }, // Down Arrow Double Stroke
+ { "554", "21D0", }, // Left Arrow Double Stroke
+ { "555", "21D5", }, // Up/Down Arrow Double Stroke
+ { "556", "21D4", }, // Left/Right Arrow Double Stroke
+ { "557", "21C4", }, // Right Over Left Arrow
+ { "558", "21C6", }, // Left Over Right Arrow
+ { "559", "EFE9", }, // Vector Symbol
+ { "560", "0305", }, // Overline, Composite
+ { "561", "2200", }, // For All Symbol, or Universal (inverted A)
+ { "562", "2203", }, // There Exists Symbol, or Existential (inverted E)
+ { "563", "22A4", }, // Top Symbol
+ { "564", "22A5", }, // Bottom Symbol
+ { "565", "222A", }, // Set Union Symbol
+ { "566", "2208", }, // Element-Of Symbol
+ { "567", "220B", }, // Contains Symbol
+ { "568", "2209", }, // Not-Element-Of Symbol
+ { "569", "2282", }, // Proper Subset Symbol
+ { "570", "2283", }, // Proper Superset Symbol
+ { "571", "2284", }, // Not Proper Subset Symbol
+ { "572", "2285", }, // Not Proper Superset Symbol
+ { "573", "2286", }, // Subset Symbol
+ { "574", "2287", }, // Superset Symbol
+ { "575", "2295", }, // Plus In Circle Symbol
+ { "576", "2299", }, // Dot In Circle Symbol
+ { "577", "2297", }, // Times In Circle Symbol
+ { "578", "2296", }, // Minus In Circle Symbol
+ { "579", "2298", }, // Slash In Circle Symbol
+ { "580", "2227", }, // Logical And Symbol
+ { "581", "2228", }, // Logical Or Symbol
+ { "582", "22BB", }, // Exclusive Or Symbol
+ { "583", "2218", }, // Functional Composition Symbol
+ { "584", "20DD", }, // Large Open Circle
+ { "585", "22A3", }, // Assertion Symbol
+ { "586", "22A2", }, // Backwards Assertion Symbol
+ { "587", "222B", }, // Integral Symbol
+ { "588", "222E", }, // Curvilinear Integral Symbol
+ { "589", "2220", }, // Angle Symbol
+ { "590", "2205", }, // Empty Set Symbol
+ { "591", "2135", }, // Hebrew Aleph
+ { "592", "2136", }, // Hebrew Beth
+ { "593", "2137", }, // Hebrew Gimmel
+ { "594", "212D", }, // Fraktur Uppercase C
+ { "595", "2111", }, // Fraktur Uppercase I
+ { "596", "211C", }, // Fraktur Uppercase R
+ { "597", "2128", }, // Fraktur Uppercase Z
+ { "598", "23A1", }, // Top Segment Left Bracket (Left Square Bracket Upper Corner)
+ { "599", "23A3", }, // Bottom Segment Left Bracket (Left Square Bracket Lower Corner)
+ { "600", "239B", }, // Top Segment Left Brace (Left Parenthesis Upper Hook)
+//{ "600", "23A7", }, // Top Segment Left Brace (Right Curly Bracket Upper Hook)
+ { "601", "23A8", }, // Middle Segment Left Brace (Right Curly Bracket Middle Piece)
+ { "602", "239D", }, // Bottom Segment LeftBrace (Left Parenthesis Lower Hook)
+//{ "602", "23A9", }, // Bottom Segment Left Brace (Right Curly Bracket Lower Hook)
+ { "603", "EFD4", }, // Middle Segment Curvilinear Integral
+ { "604", "EFD3", }, // Top Left Segment Summation
+ { "605", "2225", }, // Double Vertical Line, Composite
+ { "606", "EFD2", }, // Bottom Left Segment Summation
+ { "607", "EFD1", }, // Bottom Diagonal Summation
+ { "608", "23A4", }, // Top Segment Right Bracket (Right Square Bracket Upper Corner)
+ { "609", "23A6", }, // Bottom Segment Right Bracket (Right Square Bracket Lower Corner)
+ { "610", "239E", }, // Top Segment Right Brace (Right Parenthesis Upper Hook)
+//{ "610", "23AB", }, // Top Segment Right Brace (Right Curly Bracket Upper Hook)
+ { "611", "23AC", }, // Middle Segment Right Brace (Right Curly Bracket Middle Piece)
+ { "612", "23A0", }, // Bottom Segment Right ( Right Parenthesis Lower Hook)
+//{ "612", "23AD", }, // Bottom Segment Right Brace (Right Curly Bracket Lower Hook)
+ { "613", "239C", }, // Thick Vertical Line, Composite (Left Parenthesis Extension)
+//{ "613", "239F", }, // Thick Vertical Line, Composite (Right Parenthesis Extension)
+//{ "613", "23AA", }, // Thick Vertical Line, Composite (Curly Bracket Extension)
+//{ "613", "23AE", }, // Thick Vertical Line, Composite (Integral Extension)
+ { "614", "2223", }, // Thin Vertical Line, Composite
+ { "615", "EFDC", }, // Bottom Segment of Vertical Radical
+ { "616", "EFD0", }, // Top Right Segment Summation
+ { "617", "EFCF", }, // Middle Segment Summation
+ { "618", "EFCE", }, // Bottom Right Segment Summation
+ { "619", "EFCD", }, // Top Diagonal Summation
+ { "620", "2213", }, // Minus Over Plus Sign
+ { "621", "2329", }, // Left Angle Bracket
+ { "622", "232A", }, // Right Angle Bracket
+ { "623", "EFFF", }, // Mask Symbol
+ { "624", "2245", }, // Wavy Over Two Straight Approximate Symbol
+ { "625", "2197", }, // 45 Degree Arrow
+ { "626", "2198", }, // -45 Degree Arrow
+ { "627", "2199", }, // -135 Degree Arrow
+ { "628", "2196", }, // 135 Degree Arrow
+ { "629", "25B5", }, // Up Open Triangle
+ { "630", "25B9", }, // Right Open Triangle
+ { "631", "25BF", }, // Down Open Triangle
+ { "632", "25C3", }, // Left Open Triangle
+ { "633", "226A", }, // Much Less Than Sign
+ { "634", "226B", }, // Much Greater Than Sign
+ { "635", "2237", }, // Proportional To Symbol (4 dots)
+ { "636", "225C", }, // Defined As Symbol
+ { "637", "03DD", }, // Lowercase Greek Digamma
+ { "638", "210F", }, // Planck's Constant divided by 2 pi
+ { "639", "2112", }, // Laplace Transform Symbol
+ { "640", "EFFE", }, // Power Set
+ { "641", "2118", }, // Weierstrassian Symbol
+ { "642", "2211", }, // Summation Symbol (large Sigma)
+ { "643", "301A", }, // Left Double Bracket
+ { "644", "EFC9", }, // Middle Segment Double Bracket
+ { "645", "301B", }, // Right Double Bracket
+ { "646", "256D", }, // Box Draw Left Top Round Corner
+ { "647", "2570", }, // Box Draw Left Bottom Round Corner
+ { "648", "EFC8", }, // Extender Large Union/Product
+ { "649", "EFC7", }, // Bottom Segment Large Union
+ { "650", "EFC6", }, // Top Segment Large Intersection
+ { "651", "EFC5", }, // Top Segment Left Double Bracket
+ { "652", "EFC4", }, // Bottom Segment Left Double Bracket
+ { "653", "EFFC", }, // Large Open Square Box
+ { "654", "25C7", }, // Open Diamond
+ { "655", "256E", }, // Box Draw Right Top Round Corner
+ { "656", "256F", }, // Box Draw Right Bottom Round Corner
+ { "657", "EFC3", }, // Bottom Segment Large Bottom Product
+ { "658", "EFC2", }, // Top Segment Large Top Product
+ { "659", "EFC1", }, // Top Segment Right Double Bracket
+ { "660", "EFC0", }, // Bottom Segment Right Double Bracket
+ { "661", "EFFB", }, // Large Solid Square Box
+ { "662", "25C6", }, // Solid Diamond
+ { "663", "220D", }, // Such That Symbol (rotated lc epsilon)
+ { "664", "2217", }, // Math Asterisk
+ { "665", "23AF", }, // Horizontal Arrow Extender (Horizontal Line Extension)
+ { "666", "EFCB", }, // Double Horizontal Arrow Extender
+ { "667", "EFCC", }, // Inverted Complement of 0xEFCF or MSL 617
+ { "668", "221F", }, // Right Angle Symbol
+ { "669", "220F", }, // Product Symbol (large Pi)
+ { "684", "25CA", }, // Lozenge, Diamond
+ { "1000", "2070", }, // Superior Numeral 0
+ { "1001", "2074", }, // Superior Numeral 4
+ { "1002", "2075", }, // Superior Numeral 5
+ { "1003", "2076", }, // Superior Numeral 6
+ { "1004", "2077", }, // Superior Numeral 7
+ { "1005", "2078", }, // Superior Numeral 8
+ { "1006", "2079", }, // Superior Numeral 9
+ { "1017", "201C", }, // Double Open Quote (6)
+ { "1018", "201D", }, // Double Close Quote (9)
+ { "1019", "201E", }, // Double Baseline Quote (9)
+ { "1020", "2003", }, // Em Space
+ { "1021", "2002", }, // En Space
+ { "1023", "2009", }, // Thin Space
+ { "1028", "2026", }, // Ellipsis
+ { "1030", "EFF1", }, // Uppercase Ogonek (Spacing)
+ { "1031", "017E", }, // Lowercase Z Hacek
+ { "1034", "2120", }, // Service Mark
+ { "1036", "211E", }, // Prescription Sign
+//{ "1040", "F001", }, // Lowercase FI Ligature
+ { "1040", "FB01", }, // Lowercase FI Ligature
+//{ "1041", "F002", }, // Lowercase FL Ligature
+ { "1041", "FB02", }, // Lowercase FL Ligature
+ { "1042", "FB00", }, // Lowercase FF Ligature
+ { "1043", "FB03", }, // Lowercase FFI Ligature
+ { "1044", "FB04", }, // Lowercase FFL Ligature
+ { "1045", "EFF0", }, // Uppercase Double Acute Accent (Spacing)
+ { "1047", "0133", }, // Lowercase IJ Ligature
+ { "1060", "2105", }, // Care Of Symbol
+ { "1061", "011E", }, // Uppercase G Breve
+ { "1062", "011F", }, // Lowercase G Breve
+ { "1063", "015E", }, // Uppercase S Cedilla
+ { "1064", "015F", }, // Lowercase S Cedilla
+ { "1065", "0130", }, // Uppercase I Overdot
+ { "1067", "201A", }, // Single Baseline Quote (9)
+ { "1068", "2030", }, // Per Mill Sign
+ { "1069", "20AC", }, // Euro
+ { "1084", "02C9", }, // Lowercase Macron Accent (Spacing)
+ { "1086", "02D8", }, // Lowercase Breve Accent (Spacing)
+ { "1088", "02D9", }, // Lowercase Overdot Accent (Spacing)
+ { "1090", "0153", }, // Lowercase OE Ligature
+ { "1091", "0152", }, // Uppercase OE Ligature
+ { "1092", "2039", }, // Left Pointing Single Angle Quote
+ { "1093", "203A", }, // Right Pointing Single Angle Quote
+ { "1094", "25A1", }, // Medium Open Square Box
+ { "1095", "0141", }, // Uppercase L-Stroke
+ { "1096", "0142", }, // Lowercase L-Stroke
+ { "1097", "02DD", }, // Lowercase Double Acute Accent (Spacing)
+ { "1098", "02DB", }, // Lowercase Ogonek (Spacing)
+ { "1099", "21B5", }, // Carriage Return Symbol
+ { "1100", "EFDB", }, // Full Size Serif Registered
+ { "1101", "EFDA", }, // Full Size Serif Copyright
+ { "1102", "EFD9", }, // Full Size Serif Trademark
+ { "1103", "EFD8", }, // Full Size Sans Registered
+ { "1104", "EFD7", }, // Full Size Sans Copyright
+ { "1105", "EFD6", }, // Full Size Sans Trademark
+ { "1106", "017D", }, // Uppercase Z Hacek
+ { "1107", "0132", }, // Uppercase IJ Ligature
+ { "1108", "25AB", }, // Small Open Square Box
+ { "1109", "25E6", }, // Small Open Round Bullet
+ { "1110", "25CB", }, // Medium Open Round Bullet
+ { "1111", "EFFA", }, // Large Solid Round Bullet
+ { "3812", "F000", }, // Ornament, Apple
+};
+
+// global constructor
+static struct hp_msl_to_unicode_init {
+ hp_msl_to_unicode_init();
+} _hp_msl_to_unicode_init;
+
+hp_msl_to_unicode_init::hp_msl_to_unicode_init() {
+ for (unsigned int i = 0;
+ i < sizeof(hp_msl_to_unicode_list)/sizeof(hp_msl_to_unicode_list[0]);
+ i++) {
+ hp_msl_to_unicode *ptu = new hp_msl_to_unicode[1];
+ ptu->value = (char *)hp_msl_to_unicode_list[i].value;
+ hp_msl_to_unicode_table.define(hp_msl_to_unicode_list[i].key, ptu);
+ }
+}
+
+const char *hp_msl_to_unicode_code(const char *s)
+{
+ hp_msl_to_unicode *result = hp_msl_to_unicode_table.lookup(s);
+ return result ? result->value : 0;
+}
diff --git a/src/utils/indxbib/eign b/src/utils/indxbib/eign
new file mode 100644
index 0000000..7718c8b
--- /dev/null
+++ b/src/utils/indxbib/eign
@@ -0,0 +1,133 @@
+a
+i
+the
+to
+of
+and
+in
+is
+it
+for
+that
+if
+you
+this
+be
+on
+with
+not
+have
+are
+or
+as
+from
+can
+but
+by
+at
+an
+will
+no
+all
+was
+do
+there
+my
+one
+so
+we
+they
+what
+would
+any
+which
+about
+get
+your
+use
+some
+me
+then
+name
+like
+out
+when
+up
+time
+other
+more
+only
+just
+end
+also
+know
+how
+new
+should
+been
+than
+them
+he
+who
+make
+may
+people
+these
+now
+their
+here
+into
+first
+could
+way
+had
+see
+work
+well
+were
+two
+very
+where
+while
+us
+because
+good
+same
+even
+much
+most
+many
+such
+long
+his
+over
+last
+since
+right
+before
+our
+without
+too
+those
+why
+must
+part
+being
+current
+back
+still
+go
+point
+value
+each
+did
+both
+true
+off
+say
+another
+state
+might
+under
+start
+try
diff --git a/src/utils/indxbib/indxbib.1.man b/src/utils/indxbib/indxbib.1.man
new file mode 100644
index 0000000..df02fcc
--- /dev/null
+++ b/src/utils/indxbib/indxbib.1.man
@@ -0,0 +1,347 @@
+.TH @g@indxbib @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+@g@indxbib \- make inverted index for bibliographic databases
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2020 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_indxbib_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY @g@indxbib
+.RB [ \-w ]
+.RB [ \-c\~\c
+.IR \%common-words-file ]
+.RB [ \-d\~\c
+.IR dir ]
+.RB [ \-f\~\c
+.IR \%list-file ]
+.RB [ \-h\~\c
+.IR \%min-hash-table-size ]
+.RB [ \-i\~\c
+.IR \%excluded-fields ]
+.RB [ \-k\~\c
+.IR \%max-keys-per-record ]
+.RB [ \-l\~\c
+.IR \%min-key-length ]
+.RB [ \-n\~\c
+.IR \%threshold ]
+.RB [ \-o\~\c
+.IR file ]
+.RB [ \-t\~\c
+.IR \%max-key-length ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY @g@indxbib
+.B \-\-help
+.YS
+.
+.
+.SY @g@indxbib
+.B \-v
+.
+.SY @g@indxbib
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I @g@indxbib
+makes an inverted index for the bibliographic databases in each
+.I file
+for use with
+.MR @g@refer @MAN1EXT@ ,
+.MR @g@lookbib @MAN1EXT@ ,
+and
+.MR lkbib @MAN1EXT@ .
+.
+Each created index is named
+.RI file @INDEX_SUFFIX@ ;
+writing is done to a temporary file which is then renamed to this.
+.
+If no
+.I file
+operands are given on the command line because the
+.B \-f
+option has been used,
+and no
+.B \-o
+option is given,
+the index will be named
+.IR \%@DEFAULT_INDEX_NAME@@INDEX_SUFFIX@ .
+.
+.
+.LP
+Bibliographic databases are divided into records by blank lines.
+.
+Within a record,
+each field starts with a
+.B %
+character at the beginning of a line.
+.
+Fields have a one letter name that follows the
+.B %
+character.
+.
+.
+.LP
+The values set by the
+.BR \-c ,
+.BR \-l ,
+.BR \-n ,
+and
+.B \-t
+options are stored in the index:
+when the index is searched,
+keys will be discarded and truncated in a
+manner appropriate to these options;
+the original keys will be used for verifying that any record
+found using the index actually contains the keys.
+.
+This means that a user of an index need not know whether these
+options were used in the creation of the index,
+provided that not all the keys to be searched for
+would have been discarded during indexing
+and that the user supplies at least the part of each key
+that would have remained after being truncated during indexing.
+.
+The value set by the
+.B \-i
+option is also stored in the index
+and will be used in verifying records found using the index.
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.BI \-c\~ common-words-file
+Read the list of common words from
+.I common-words-file
+instead of
+.IR \%@COMMON_WORDS_FILE@ .
+.
+.
+.TP
+.BI \-d\~ dir
+Use
+.I dir
+as the name of the directory to store in the index,
+instead of that returned by
+.MR getcwd 2 .
+.
+Typically,
+.I dir
+will be a symbolic link whose target is the current working directory.
+.
+.
+.TP
+.BI \-f\~ list-file
+Read the files to be indexed from
+.IR list-file .
+.
+If
+.I list-file
+is
+.BR \- ,
+files will be read from the standard input stream.
+.
+The
+.B \-f
+option can be given at most once.
+.
+.
+.TP
+.BI \-h\~ min-hash-table-size
+Use the first prime number greater than or equal to
+the argument for the size of the hash table.
+.
+Larger values
+will usually make searching faster,
+but will make the index file larger
+and cause
+.I @g@indxbib
+to use more memory.
+.
+The default hash table size is 997.
+.
+.
+.TP
+.BI \-i\~ excluded-fields
+Don't index the contents of fields whose names are in
+.IR excluded-fields .
+.
+Field names are one character each.
+.
+If this option is not present,
+.I @g@indxbib
+excludes fields
+.BR X ,
+.BR Y ,
+and
+.BR Z .
+.
+.
+.TP
+.BI \-k\~ max-keys-per-record
+Use no more keys per input record than specified in the argument.
+.
+If this option is not present,
+the maximum is 100.
+.
+.
+.TP
+.BI \-l\~ min-key-length
+Discard any key whose length in characters is shorter than the value of
+the argument.
+.
+If this option is not present,
+the minimum key length
+is 3.
+.
+.
+.TP
+.BI \-n\~ threshold
+Discard the
+.I threshold
+most common words from the common words file.
+.
+If this option is not present,
+the 100 most common words are discarded.
+.
+.
+.TP
+.BI \-o\~ basename
+Name the index
+.RI basename @INDEX_SUFFIX@ .
+.
+.
+.TP
+.BI \-t\~ max-key-length
+Truncate keys to
+.I max-key-length
+in characters.
+.
+If this option is not present,
+keys are truncated to 6 characters.
+.
+.
+.TP
+.B \-w
+Index whole files.
+.
+Each file is a separate record.
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.RI \%file @INDEX_SUFFIX@
+index for
+.I file
+.
+.
+.TP
+.I \%@DEFAULT_INDEX_NAME@@INDEX_SUFFIX@
+default index name
+.
+.
+.TP
+.I \%@COMMON_WORDS_FILE@
+contains the list of common words.
+.
+The traditional name,
+.RI \[lq] eign \[rq],
+is an abbreviation of \[lq]English ignored [word list]\[rq].
+.
+.
+.TP
+.IR \%indxbib XXXXXX
+temporary file
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+\[lq]Some Applications of Inverted Indexes on the Unix System\[rq],
+by M.\& E.\& Lesk,
+1978,
+AT&T Bell Laboratories Computing Science Technical Report No.\& 69.
+.
+.
+.LP
+.MR @g@refer @MAN1EXT@ ,
+.MR lkbib @MAN1EXT@ ,
+.MR @g@lookbib @MAN1EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_indxbib_1_man_C]
+.do rr *groff_indxbib_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/utils/indxbib/indxbib.am b/src/utils/indxbib/indxbib.am
new file mode 100644
index 0000000..d2a7d5a
--- /dev/null
+++ b/src/utils/indxbib/indxbib.am
@@ -0,0 +1,57 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+indxbib_srcdir = $(top_srcdir)/src/utils/indxbib
+prefixexecbin_PROGRAMS += indxbib
+indxbib_SOURCES = \
+ src/utils/indxbib/indxbib.cpp \
+ src/utils/indxbib/signal.c
+src/utils/indxbib/indxbib.$(OBJEXT): defs.h
+indxbib_LDADD = libbib.a libgroff.a $(LIBM) lib/libgnu.a
+PREFIXMAN1 += src/utils/indxbib/indxbib.1
+EXTRA_DIST += \
+ src/utils/indxbib/indxbib.1.man \
+ src/utils/indxbib/eign
+
+install-data-local: install_indxbib
+install_indxbib: $(indxbib_srcdir)/eign
+ -test -d $(DESTDIR)$(datadir) \
+ || $(mkinstalldirs) $(DESTDIR)$(datadir)
+ -test -d $(DESTDIR)$(dataprogramdir) \
+ || $(mkinstalldirs) $(DESTDIR)$(dataprogramdir)
+ -test -d $(DESTDIR)$(datasubdir) \
+ || $(mkinstalldirs) $(DESTDIR)$(datasubdir)
+ if test -f /usr/lib/eign; then \
+ rm -f $(DESTDIR)$(common_words_file); \
+ ln -s /usr/lib/eign $(DESTDIR)$(common_words_file) 2>/dev/null \
+ || ln /usr/lib/eign $(DESTDIR)$(common_words_file) 2>/dev/null \
+ || cp /usr/lib/eign $(DESTDIR)$(common_words_file); \
+ else \
+ rm -f $(DESTDIR)$(common_words_file); \
+ $(INSTALL_DATA) $(indxbib_srcdir)/eign $(DESTDIR)$(common_words_file); \
+ fi
+
+uninstall-local: uninstall_indxbib
+uninstall_indxbib:
+ rm -f $(DESTDIR)$(common_words_file)
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/utils/indxbib/indxbib.cpp b/src/utils/indxbib/indxbib.cpp
new file mode 100644
index 0000000..ad8bb0e
--- /dev/null
+++ b/src/utils/indxbib/indxbib.cpp
@@ -0,0 +1,803 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+
+#include "posix.h"
+#include "errarg.h"
+#include "error.h"
+#include "stringclass.h"
+#include "cset.h"
+#include "cmap.h"
+
+#include "defs.h"
+#include "index.h"
+
+#include "nonposix.h"
+
+extern "C" const char *Version_string;
+
+#define DEFAULT_HASH_TABLE_SIZE 997
+#define TEMP_INDEX_TEMPLATE "indxbibXXXXXX"
+
+// (2^n - MALLOC_OVERHEAD) should be a good argument for malloc().
+
+#define MALLOC_OVERHEAD 16
+
+#ifdef BLOCK_SIZE
+#undef BLOCK_SIZE
+#endif
+
+const int BLOCK_SIZE = ((1024 - MALLOC_OVERHEAD - sizeof(struct block *)
+ - sizeof(int)) / sizeof(int));
+struct block {
+ block *next;
+ int used;
+ int v[BLOCK_SIZE];
+
+ block(block *p = 0) : next(p), used(0) { }
+};
+
+struct block;
+
+union table_entry {
+ block *ptr;
+ int count;
+};
+
+struct word_list {
+ word_list *next;
+ char *str;
+ int len;
+ word_list(const char *, int, word_list *);
+};
+
+table_entry *hash_table;
+int hash_table_size = DEFAULT_HASH_TABLE_SIZE;
+// We make this the same size as hash_table so we only have to do one
+// mod per key.
+static word_list **common_words_table = 0;
+char *key_buffer;
+
+FILE *indxfp;
+int ntags = 0;
+string filenames;
+char *temp_index_file = 0;
+
+const char *ignore_fields = "XYZ";
+const char *common_words_file = COMMON_WORDS_FILE;
+int n_ignore_words = 100;
+int truncate_len = 6;
+int shortest_len = 3;
+int max_keys_per_item = 100;
+
+static void usage(FILE *stream);
+static void write_hash_table();
+static void init_hash_table();
+static void read_common_words_file();
+static int store_key(char *s, int len);
+static void possibly_store_key(char *s, int len);
+static int do_whole_file(const char *filename);
+static int do_file(const char *filename);
+static void store_reference(int filename_index, int pos, int len);
+static void check_integer_arg(char opt, const char *arg, int min, int *res);
+static void store_filename(const char *);
+static void fwrite_or_die(const void *ptr, int size, int nitems, FILE *fp);
+static char *get_cwd();
+
+extern "C" {
+ void cleanup();
+ void catch_fatal_signals();
+ void ignore_fatal_signals();
+}
+
+int main(int argc, char **argv)
+{
+ program_name = argv[0];
+ static char stderr_buf[BUFSIZ];
+ setbuf(stderr, stderr_buf);
+
+ const char *base_name = 0;
+ typedef int (*parser_t)(const char *);
+ parser_t parser = do_file;
+ const char *directory = 0;
+ const char *foption = 0;
+ int opt;
+ static const struct option long_options[] = {
+ { "help", no_argument, 0, CHAR_MAX + 1 },
+ { "version", no_argument, 0, 'v' },
+ { NULL, 0, 0, 0 }
+ };
+ while ((opt = getopt_long(argc, argv, "c:o:h:i:k:l:t:n:c:d:f:vw",
+ long_options, NULL))
+ != EOF)
+ switch (opt) {
+ case 'c':
+ common_words_file = optarg;
+ break;
+ case 'd':
+ directory = optarg;
+ break;
+ case 'f':
+ foption = optarg;
+ break;
+ case 'h':
+ {
+ int requested_hash_table_size;
+ check_integer_arg('h', optarg, 1, &requested_hash_table_size);
+ hash_table_size = requested_hash_table_size;
+ if ((hash_table_size > 2) && (hash_table_size % 2) == 0)
+ hash_table_size++;
+ while (!is_prime(hash_table_size))
+ hash_table_size += 2;
+ if (hash_table_size != requested_hash_table_size)
+ warning("requested hash table size %1 is not prime: using %2"
+ " instead", optarg, hash_table_size);
+ }
+ break;
+ case 'i':
+ ignore_fields = optarg;
+ break;
+ case 'k':
+ check_integer_arg('k', optarg, 1, &max_keys_per_item);
+ break;
+ case 'l':
+ check_integer_arg('l', optarg, 0, &shortest_len);
+ break;
+ case 'n':
+ check_integer_arg('n', optarg, 0, &n_ignore_words);
+ break;
+ case 'o':
+ base_name = optarg;
+ break;
+ case 't':
+ check_integer_arg('t', optarg, 1, &truncate_len);
+ break;
+ case 'w':
+ parser = do_whole_file;
+ break;
+ case 'v':
+ printf("GNU indxbib (groff) version %s\n", Version_string);
+ exit(0);
+ break;
+ case CHAR_MAX + 1: // --help
+ usage(stdout);
+ exit(0);
+ break;
+ case '?':
+ usage(stderr);
+ exit(1);
+ break;
+ default:
+ assert(0);
+ break;
+ }
+ if (optind >= argc && foption == 0)
+ fatal("no files and no -f option");
+ if (!directory) {
+ char *path = get_cwd();
+ store_filename(path);
+ delete[] path;
+ }
+ else
+ store_filename(directory);
+ init_hash_table();
+ store_filename(common_words_file);
+ store_filename(ignore_fields);
+ key_buffer = new char[truncate_len];
+ read_common_words_file();
+ if (!base_name)
+ base_name = optind < argc ? argv[optind] : DEFAULT_INDEX_NAME;
+ const char *p = strrchr(base_name, DIR_SEPS[0]), *p1;
+ const char *sep = &DIR_SEPS[1];
+ while (*sep) {
+ p1 = strrchr(base_name, *sep);
+ if (p1 && (!p || p1 > p))
+ p = p1;
+ sep++;
+ }
+ size_t name_max;
+ if (p) {
+ char *dir = strsave(base_name);
+ dir[p - base_name] = '\0';
+ name_max = file_name_max(dir);
+ delete[] dir;
+ }
+ else
+ name_max = file_name_max(".");
+ const char *filename = p ? p + 1 : base_name;
+ if (strlen(filename) + sizeof(INDEX_SUFFIX) - 1 > name_max)
+ fatal("'%1.%2' is too long for a filename", filename, INDEX_SUFFIX);
+ if (p) {
+ p++;
+ temp_index_file = new char[p - base_name + sizeof(TEMP_INDEX_TEMPLATE)];
+ memcpy(temp_index_file, base_name, p - base_name);
+ strcpy(temp_index_file + (p - base_name), TEMP_INDEX_TEMPLATE);
+ }
+ else {
+ temp_index_file = strsave(TEMP_INDEX_TEMPLATE);
+ }
+ catch_fatal_signals();
+ int fd = mkstemp(temp_index_file);
+ if (fd < 0)
+ fatal("can't create temporary index file: %1", strerror(errno));
+ indxfp = fdopen(fd, FOPEN_WB);
+ if (indxfp == 0)
+ fatal("fdopen failed");
+ if (fseek(indxfp, sizeof(index_header), 0) < 0)
+ fatal("can't seek past index header: %1", strerror(errno));
+ int failed = 0;
+ if (foption) {
+ FILE *fp = stdin;
+ if (strcmp(foption, "-") != 0) {
+ errno = 0;
+ fp = fopen(foption, "r");
+ if (!fp)
+ fatal("can't open '%1': %2", foption, strerror(errno));
+ }
+ string path;
+ int lineno = 1;
+ for (;;) {
+ int c;
+ for (c = getc(fp); c != '\n' && c != EOF; c = getc(fp)) {
+ if (c == '\0')
+ error_with_file_and_line(foption, lineno,
+ "nul character in pathname ignored");
+ else
+ path += c;
+ }
+ if (path.length() > 0) {
+ path += '\0';
+ if (!(*parser)(path.contents()))
+ failed = 1;
+ path.clear();
+ }
+ if (c == EOF)
+ break;
+ lineno++;
+ }
+ if (fp != stdin)
+ fclose(fp);
+ }
+ for (int i = optind; i < argc; i++)
+ if (!(*parser)(argv[i]))
+ failed = 1;
+ write_hash_table();
+ if (fclose(indxfp) < 0)
+ fatal("error closing temporary index file: %1", strerror(errno));
+ char *index_file = new char[strlen(base_name) + sizeof(INDEX_SUFFIX)];
+ strcpy(index_file, base_name);
+ strcat(index_file, INDEX_SUFFIX);
+#ifdef HAVE_RENAME
+#ifdef __EMX__
+ if (access(index_file, R_OK) == 0)
+ unlink(index_file);
+#endif /* __EMX__ */
+ if (rename(temp_index_file, index_file) < 0) {
+#ifdef __MSDOS__
+ // RENAME could fail on plain MS-DOS filesystems because
+ // INDEX_FILE is an invalid filename, e.g. it has multiple dots.
+ char *fname = p ? index_file + (p - base_name) : 0;
+ char *dot = 0;
+
+ // Replace the dot with an underscore and try again.
+ if (fname
+ && (dot = strchr(fname, '.')) != 0
+ && strcmp(dot, INDEX_SUFFIX) != 0)
+ *dot = '_';
+ if (rename(temp_index_file, index_file) < 0)
+#endif
+ fatal("can't rename temporary index file: %1", strerror(errno));
+ }
+#else /* not HAVE_RENAME */
+ ignore_fatal_signals();
+ if (unlink(index_file) < 0) {
+ if (errno != ENOENT)
+ fatal("can't unlink '%1': %2", index_file, strerror(errno));
+ }
+ if (link(temp_index_file, index_file) < 0)
+ fatal("can't link temporary index file: %1", strerror(errno));
+ if (unlink(temp_index_file) < 0)
+ fatal("can't unlink temporary index file: %1", strerror(errno));
+#endif /* not HAVE_RENAME */
+ temp_index_file = 0;
+ return failed;
+}
+
+static void usage(FILE *stream)
+{
+ fprintf(stream,
+"usage: %s [-w] [-c common-words-file] [-d dir] [-f list-file]"
+" [-h min-hash-table-size] [-i excluded-fields]"
+" [-k max-keys-per-record] [-l min-key-length]"
+" [-n threshold] [-o file] [-t max-key-length] [file ...]\n"
+"usage: %s {-v | --version}\n"
+"usage: %s --help\n",
+ program_name, program_name, program_name);
+}
+
+static void check_integer_arg(char opt, const char *arg, int min, int *res)
+{
+ char *ptr;
+ long n = strtol(arg, &ptr, 10);
+ if (n == 0 && ptr == arg)
+ error("argument to -%1 not an integer", opt);
+ else if (n < min)
+ error("argument to -%1 must not be less than %2", opt, min);
+ else {
+ if (n > INT_MAX)
+ error("argument to -%1 greater than maximum integer", opt);
+ else if (*ptr != '\0')
+ error("junk after integer argument to -%1", opt);
+ *res = int(n);
+ }
+}
+
+static char *get_cwd()
+{
+ char *buf;
+ int size = 12;
+
+ for (;;) {
+ buf = new char[size];
+ if (getcwd(buf, size))
+ break;
+ if (errno != ERANGE)
+ fatal("cannot get current working directory: %1", strerror(errno));
+ delete[] buf;
+ if (size == INT_MAX)
+ fatal("current working directory longer than INT_MAX");
+ if (size > INT_MAX/2)
+ size = INT_MAX;
+ else
+ size *= 2;
+ }
+ return buf;
+}
+
+word_list::word_list(const char *s, int n, word_list *p)
+: next(p), len(n)
+{
+ str = new char[n];
+ memcpy(str, s, n);
+}
+
+static void read_common_words_file()
+{
+ if (n_ignore_words <= 0)
+ return;
+ errno = 0;
+ FILE *fp = fopen(common_words_file, "r");
+ if (!fp)
+ fatal("can't open '%1': %2", common_words_file, strerror(errno));
+ common_words_table = new word_list * [hash_table_size];
+ for (int i = 0; i < hash_table_size; i++)
+ common_words_table[i] = 0;
+ int count = 0;
+ int key_len = 0;
+ for (;;) {
+ int c = getc(fp);
+ while (c != EOF && !csalnum(c))
+ c = getc(fp);
+ if (c == EOF)
+ break;
+ do {
+ if (key_len < truncate_len)
+ key_buffer[key_len++] = cmlower(c);
+ c = getc(fp);
+ } while (c != EOF && csalnum(c));
+ if (key_len >= shortest_len) {
+ int h = hash(key_buffer, key_len) % hash_table_size;
+ common_words_table[h] = new word_list(key_buffer, key_len,
+ common_words_table[h]);
+ }
+ if (++count >= n_ignore_words)
+ break;
+ key_len = 0;
+ if (c == EOF)
+ break;
+ }
+ n_ignore_words = count;
+ fclose(fp);
+}
+
+static int do_whole_file(const char *filename)
+{
+ errno = 0;
+ FILE *fp = fopen(filename, "r");
+ if (!fp) {
+ error("can't open '%1': %2", filename, strerror(errno));
+ return 0;
+ }
+ int count = 0;
+ int key_len = 0;
+ int c;
+ while ((c = getc(fp)) != EOF) {
+ if (csalnum(c)) {
+ key_len = 1;
+ key_buffer[0] = c;
+ while ((c = getc(fp)) != EOF) {
+ if (!csalnum(c))
+ break;
+ if (key_len < truncate_len)
+ key_buffer[key_len++] = c;
+ }
+ if (store_key(key_buffer, key_len)) {
+ if (++count >= max_keys_per_item)
+ break;
+ }
+ if (c == EOF)
+ break;
+ }
+ }
+ store_reference(filenames.length(), 0, 0);
+ store_filename(filename);
+ fclose(fp);
+ return 1;
+}
+
+static int do_file(const char *filename)
+{
+ errno = 0;
+ // Need binary I/O for MS-DOS/MS-Windows, because indxbib relies on
+ // byte counts to be consistent with fseek.
+ FILE *fp = fopen(filename, FOPEN_RB);
+ if (fp == 0) {
+ error("can't open '%1': %2", filename, strerror(errno));
+ return 0;
+ }
+ int filename_index = filenames.length();
+ store_filename(filename);
+
+ enum {
+ START, // at the start of the file; also in between references
+ BOL, // in the middle of a reference, at the beginning of the line
+ PERCENT, // seen a percent at the beginning of the line
+ IGNORE, // ignoring a field
+ IGNORE_BOL, // at the beginning of a line ignoring a field
+ KEY, // in the middle of a key
+ DISCARD, // after truncate_len bytes of a key
+ MIDDLE // in between keys
+ } state = START;
+
+ // In states START, BOL, IGNORE_BOL, space_count how many spaces at
+ // the beginning have been seen. In states PERCENT, IGNORE, KEY,
+ // MIDDLE space_count must be 0.
+ int space_count = 0;
+ int byte_count = 0; // bytes read
+ int key_len = 0;
+ int ref_start = -1; // position of start of current reference
+ for (;;) {
+ int c = getc(fp);
+ if (c == EOF)
+ break;
+ // We opened the file in binary mode, so we need to skip
+ // every CR character before a Newline.
+ if (c == '\r') {
+ int peek = getc(fp);
+ if (peek == '\n') {
+ byte_count++;
+ c = peek;
+ }
+ else
+ ungetc(peek, fp);
+ }
+#if defined(__MSDOS__) || defined(_MSC_VER) || defined(__EMX__)
+ else if (c == 0x1a) // ^Z means EOF in text files
+ break;
+#endif
+ byte_count++;
+ switch (state) {
+ case START:
+ if (c == ' ' || c == '\t') {
+ space_count++;
+ break;
+ }
+ if (c == '\n') {
+ space_count = 0;
+ break;
+ }
+ ref_start = byte_count - space_count - 1;
+ space_count = 0;
+ if (c == '%')
+ state = PERCENT;
+ else if (csalnum(c)) {
+ state = KEY;
+ key_buffer[0] = c;
+ key_len = 1;
+ }
+ else
+ state = MIDDLE;
+ break;
+ case BOL:
+ switch (c) {
+ case '%':
+ if (space_count > 0) {
+ space_count = 0;
+ state = MIDDLE;
+ }
+ else
+ state = PERCENT;
+ break;
+ case ' ':
+ case '\t':
+ space_count++;
+ break;
+ case '\n':
+ store_reference(filename_index, ref_start,
+ byte_count - 1 - space_count - ref_start);
+ state = START;
+ space_count = 0;
+ break;
+ default:
+ space_count = 0;
+ if (csalnum(c)) {
+ state = KEY;
+ key_buffer[0] = c;
+ key_len = 1;
+ }
+ else
+ state = MIDDLE;
+ }
+ break;
+ case PERCENT:
+ if (strchr(ignore_fields, c) != 0)
+ state = IGNORE;
+ else if (c == '\n')
+ state = BOL;
+ else
+ state = MIDDLE;
+ break;
+ case IGNORE:
+ if (c == '\n')
+ state = IGNORE_BOL;
+ break;
+ case IGNORE_BOL:
+ switch (c) {
+ case '%':
+ if (space_count > 0) {
+ state = IGNORE;
+ space_count = 0;
+ }
+ else
+ state = PERCENT;
+ break;
+ case ' ':
+ case '\t':
+ space_count++;
+ break;
+ case '\n':
+ store_reference(filename_index, ref_start,
+ byte_count - 1 - space_count - ref_start);
+ state = START;
+ space_count = 0;
+ break;
+ default:
+ space_count = 0;
+ state = IGNORE;
+ }
+ break;
+ case KEY:
+ if (csalnum(c)) {
+ if (key_len < truncate_len)
+ key_buffer[key_len++] = c;
+ else
+ state = DISCARD;
+ }
+ else {
+ possibly_store_key(key_buffer, key_len);
+ key_len = 0;
+ if (c == '\n')
+ state = BOL;
+ else
+ state = MIDDLE;
+ }
+ break;
+ case DISCARD:
+ if (!csalnum(c)) {
+ possibly_store_key(key_buffer, key_len);
+ key_len = 0;
+ if (c == '\n')
+ state = BOL;
+ else
+ state = MIDDLE;
+ }
+ break;
+ case MIDDLE:
+ if (csalnum(c)) {
+ state = KEY;
+ key_buffer[0] = c;
+ key_len = 1;
+ }
+ else if (c == '\n')
+ state = BOL;
+ break;
+ default:
+ assert(0);
+ }
+ }
+ switch (state) {
+ case START:
+ break;
+ case DISCARD:
+ case KEY:
+ possibly_store_key(key_buffer, key_len);
+ // fall through
+ case BOL:
+ case PERCENT:
+ case IGNORE_BOL:
+ case IGNORE:
+ case MIDDLE:
+ store_reference(filename_index, ref_start,
+ byte_count - ref_start - space_count);
+ break;
+ default:
+ assert(0);
+ }
+ fclose(fp);
+ return 1;
+}
+
+static void store_reference(int filename_index, int pos, int len)
+{
+ tag t;
+ t.filename_index = filename_index;
+ t.start = pos;
+ t.length = len;
+ fwrite_or_die(&t, sizeof(t), 1, indxfp);
+ ntags++;
+}
+
+static void store_filename(const char *fn)
+{
+ filenames += fn;
+ filenames += '\0';
+}
+
+static void init_hash_table()
+{
+ hash_table = new table_entry[hash_table_size];
+ for (int i = 0; i < hash_table_size; i++)
+ hash_table[i].ptr = 0;
+}
+
+static void possibly_store_key(char *s, int len)
+{
+ static int last_tagno = -1;
+ static int key_count;
+ if (last_tagno != ntags) {
+ last_tagno = ntags;
+ key_count = 0;
+ }
+ if (key_count < max_keys_per_item) {
+ if (store_key(s, len))
+ key_count++;
+ }
+}
+
+static int store_key(char *s, int len)
+{
+ if (len < shortest_len)
+ return 0;
+ int is_number = 1;
+ for (int i = 0; i < len; i++)
+ if (!csdigit(s[i])) {
+ is_number = 0;
+ s[i] = cmlower(s[i]);
+ }
+ if (is_number && !(len == 4 && s[0] == '1' && s[1] == '9'))
+ return 0;
+ int h = hash(s, len) % hash_table_size;
+ if (common_words_table) {
+ for (word_list *ptr = common_words_table[h]; ptr; ptr = ptr->next)
+ if (len == ptr->len && memcmp(s, ptr->str, len) == 0)
+ return 0;
+ }
+ table_entry *pp = hash_table + h;
+ if (!pp->ptr)
+ pp->ptr = new block;
+ else if (pp->ptr->v[pp->ptr->used - 1] == ntags)
+ return 1;
+ else if (pp->ptr->used >= BLOCK_SIZE)
+ pp->ptr = new block(pp->ptr);
+ pp->ptr->v[(pp->ptr->used)++] = ntags;
+ return 1;
+}
+
+static void write_hash_table()
+{
+ const int minus_one = -1;
+ int li = 0;
+ for (int i = 0; i < hash_table_size; i++) {
+ block *ptr = hash_table[i].ptr;
+ if (!ptr)
+ hash_table[i].count = -1;
+ else {
+ hash_table[i].count = li;
+ block *rev = 0;
+ while (ptr) {
+ block *tem = ptr;
+ ptr = ptr->next;
+ tem->next = rev;
+ rev = tem;
+ }
+ while (rev) {
+ fwrite_or_die(rev->v, sizeof(int), rev->used, indxfp);
+ li += rev->used;
+ block *tem = rev;
+ rev = rev->next;
+ delete tem;
+ }
+ fwrite_or_die(&minus_one, sizeof(int), 1, indxfp);
+ li += 1;
+ }
+ }
+ if (sizeof(table_entry) == sizeof(int))
+ fwrite_or_die(hash_table, sizeof(int), hash_table_size, indxfp);
+ else {
+ // write it out word by word
+ for (int i = 0; i < hash_table_size; i++)
+ fwrite_or_die(&hash_table[i].count, sizeof(int), 1, indxfp);
+ }
+ fwrite_or_die(filenames.contents(), 1, filenames.length(), indxfp);
+ if (fseek(indxfp, 0, 0) < 0)
+ fatal("error seeking on index file: %1", strerror(errno));
+ index_header h;
+ h.magic = INDEX_MAGIC;
+ h.version = INDEX_VERSION;
+ h.tags_size = ntags;
+ h.lists_size = li;
+ h.table_size = hash_table_size;
+ h.strings_size = filenames.length();
+ h.truncate = truncate_len;
+ h.shortest = shortest_len;
+ h.common = n_ignore_words;
+ fwrite_or_die(&h, sizeof(h), 1, indxfp);
+}
+
+static void fwrite_or_die(const void *ptr, int size, int nitems, FILE *fp)
+{
+ if (fwrite(ptr, size, nitems, fp) != (size_t)nitems)
+ fatal("fwrite failed: %1", strerror(errno));
+}
+
+void fatal_error_exit()
+{
+ cleanup();
+ exit(3);
+}
+
+extern "C" {
+
+void cleanup()
+{
+ if (temp_index_file)
+ unlink(temp_index_file);
+}
+
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/utils/indxbib/signal.c b/src/utils/indxbib/signal.c
new file mode 100644
index 0000000..2231b64
--- /dev/null
+++ b/src/utils/indxbib/signal.c
@@ -0,0 +1,77 @@
+/* Copyright (C) 1992-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Unfortunately vendors seem to have problems writing a <signal.h>
+that is correct for C++, so we implement all signal handling in C. */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <signal.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Prototype */
+void catch_fatal_signals(void);
+
+extern void cleanup(void);
+
+static RETSIGTYPE handle_fatal_signal(int signum)
+{
+ signal(signum, SIG_DFL);
+ cleanup();
+#ifdef HAVE_KILL
+ kill(getpid(), signum);
+#else
+ /* MS-DOS and Win32 don't have kill(); the best compromise is
+ probably to use exit() instead. */
+ exit(signum);
+#endif
+}
+
+void catch_fatal_signals(void)
+{
+#ifdef SIGHUP
+ signal(SIGHUP, handle_fatal_signal);
+#endif
+ signal(SIGINT, handle_fatal_signal);
+ signal(SIGTERM, handle_fatal_signal);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#ifndef HAVE_RENAME
+
+void ignore_fatal_signals()
+{
+#ifdef SIGHUP
+ signal(SIGHUP, SIG_IGN);
+#endif
+ signal(SIGINT, SIG_IGN);
+ signal(SIGTERM, SIG_IGN);
+}
+
+#endif /* not HAVE_RENAME */
diff --git a/src/utils/lkbib/lkbib.1.man b/src/utils/lkbib/lkbib.1.man
new file mode 100644
index 0000000..59ef19f
--- /dev/null
+++ b/src/utils/lkbib/lkbib.1.man
@@ -0,0 +1,212 @@
+.TH lkbib @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+lkbib \- search bibliographic databases
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2020 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_lkbib_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY lkbib
+.RB [ \-n ]
+.RB [ \-i\~\c
+.IR fields ]
+.RB [ \-p\~\c
+.IR file ]
+\&.\|.\|.\&
+.RB [ \-t\~\c
+.IR n ]
+.I key
+\&.\|.\|.
+.YS
+.
+.
+.SY lkbib
+.B \-\-help
+.YS
+.
+.
+.SY lkbib
+.B \-v
+.
+.SY lkbib
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I \%lkbib
+searches bibliographic databases for references containing keywords
+.I key
+and writes any references found to the standard output
+stream.
+.
+It reads databases given by
+.B \-p
+options
+and then
+(unless
+.B \-n
+is given)
+a default database.
+.
+The default database is taken from the
+.I \%REFER
+environment variable if it is set,
+otherwise it is
+.IR @DEFAULT_INDEX@ .
+.
+For each database
+.I file
+to be searched,
+if an index
+.RI file @INDEX_SUFFIX@
+created by
+.MR @g@indxbib @MAN1EXT@
+exists,
+then it will be searched instead;
+each index can cover multiple databases.
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.BI \-i\~ string
+When searching files for which no index exists,
+ignore the contents of fields whose names are in
+.IR string .
+.
+.
+.TP
+.B \-n
+Suppress search of default database.
+.
+.
+.TP
+.BI \-p\~ file
+Search
+.IR file .
+.
+Multiple
+.B \-p
+options can be used.
+.
+.
+.TP
+.BI \-t\~ n
+Require only the first
+.I n
+characters of keys to be given.
+.
+The default
+is\~6.
+.
+.
+.\" ====================================================================
+.SH Environment
+.\" ====================================================================
+.
+.TP
+.I REFER
+Default database.
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I \%@DEFAULT_INDEX@
+Default database to be used if the
+.I \%REFER
+environment variable is not set.
+.
+.
+.TP
+.RI file @INDEX_SUFFIX@
+Index files.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+\[lq]Some Applications of Inverted Indexes on the Unix System\[rq],
+by M.\& E.\& Lesk,
+1978,
+AT&T Bell Laboratories Computing Science Technical Report No.\& 69.
+.
+.
+.LP
+.MR @g@refer @MAN1EXT@ ,
+.MR @g@lookbib @MAN1EXT@ ,
+.MR @g@indxbib @MAN1EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_lkbib_1_man_C]
+.do rr *groff_lkbib_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/utils/lkbib/lkbib.am b/src/utils/lkbib/lkbib.am
new file mode 100644
index 0000000..5f75596
--- /dev/null
+++ b/src/utils/lkbib/lkbib.am
@@ -0,0 +1,30 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+bin_PROGRAMS += lkbib
+man1_MANS += src/utils/lkbib/lkbib.1
+EXTRA_DIST += src/utils/lkbib/lkbib.1.man
+lkbib_LDADD = libbib.a libgroff.a $(LIBM) lib/libgnu.a
+lkbib_SOURCES = src/utils/lkbib/lkbib.cpp
+src/utils/lkbib/lkbib.$(OBJEXT): defs.h
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/utils/lkbib/lkbib.cpp b/src/utils/lkbib/lkbib.cpp
new file mode 100644
index 0000000..946bd7d
--- /dev/null
+++ b/src/utils/lkbib/lkbib.cpp
@@ -0,0 +1,144 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+
+#include "errarg.h"
+#include "error.h"
+
+#include "defs.h"
+#include "refid.h"
+#include "search.h"
+
+extern "C" const char *Version_string;
+
+static void usage(FILE *stream)
+{
+ fprintf(stream,
+ "usage: %s [-n] [-p database] [-i XYZ] [-t N] key ...\n"
+ "usage: %s {-v | --version}\n"
+ "usage: %s --help\n",
+ program_name, program_name, program_name);
+}
+
+int main(int argc, char **argv)
+{
+ program_name = argv[0];
+ static char stderr_buf[BUFSIZ];
+ setbuf(stderr, stderr_buf);
+ int search_default = 1;
+ search_list list;
+ int opt;
+ static const struct option long_options[] = {
+ { "help", no_argument, 0, CHAR_MAX + 1 },
+ { "version", no_argument, 0, 'v' },
+ { NULL, 0, 0, 0 }
+ };
+ while ((opt = getopt_long(argc, argv, "nvVi:t:p:", long_options, NULL))
+ != EOF)
+ switch (opt) {
+ case 'V':
+ do_verify = true;
+ break;
+ case 'n':
+ search_default = 0;
+ break;
+ case 'i':
+ linear_ignore_fields = optarg;
+ break;
+ case 't':
+ {
+ char *ptr;
+ long n = strtol(optarg, &ptr, 10);
+ if (n == 0 && ptr == optarg) {
+ error("bad integer '%1' in 't' option", optarg);
+ break;
+ }
+ if (n < 1)
+ n = 1;
+ linear_truncate_len = int(n);
+ break;
+ }
+ case 'v':
+ {
+ printf("GNU lkbib (groff) version %s\n", Version_string);
+ exit(0);
+ break;
+ }
+ case 'p':
+ list.add_file(optarg);
+ break;
+ case CHAR_MAX + 1: // --help
+ usage(stdout);
+ exit(0);
+ break;
+ case '?':
+ usage(stderr);
+ exit(1);
+ break;
+ default:
+ assert(0);
+ }
+ if (optind >= argc) {
+ usage(stderr);
+ exit(1);
+ }
+ char *filename = getenv("REFER");
+ if (filename)
+ list.add_file(filename);
+ else if (search_default)
+ list.add_file(DEFAULT_INDEX, 1);
+ if (list.nfiles() == 0)
+ fatal("no databases");
+ int total_len = 0;
+ int i;
+ for (i = optind; i < argc; i++)
+ total_len += strlen(argv[i]);
+ total_len += argc - optind - 1 + 1; // for spaces and '\0'
+ char *buffer = new char[total_len];
+ char *ptr = buffer;
+ for (i = optind; i < argc; i++) {
+ if (i > optind)
+ *ptr++ = ' ';
+ strcpy(ptr, argv[i]);
+ ptr = strchr(ptr, '\0');
+ }
+ search_list_iterator iter(&list, buffer);
+ const char *start;
+ int len;
+ int count;
+ for (count = 0; iter.next(&start, &len); count++) {
+ if (fwrite(start, 1, len, stdout) != (size_t)len)
+ fatal("write error on stdout: %1", strerror(errno));
+ // Can happen for last reference in file.
+ if (start[len - 1] != '\n')
+ putchar('\n');
+ putchar('\n');
+ }
+ return !count;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/utils/lookbib/lookbib.1.man b/src/utils/lookbib/lookbib.1.man
new file mode 100644
index 0000000..5d43bbb
--- /dev/null
+++ b/src/utils/lookbib/lookbib.1.man
@@ -0,0 +1,166 @@
+.TH @g@lookbib @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+@g@lookbib \- search bibliographic databases
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2020 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_lookbib_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY @g@lookbib
+.RB [ \-i\~\c
+.IR string ]
+.RB [ \-t\~\c
+.IR n ]
+.I file
+\&.\|.\|.\&
+.YS
+.
+.
+.SY @g@lookbib
+.B \-\-help
+.YS
+.
+.
+.SY @g@lookbib
+.B \-v
+.
+.SY @g@lookbib
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I @g@lookbib
+writes a prompt to the standard error stream
+(unless the standard input stream is not
+a terminal),
+reads from the standard input a line containing a set of keywords,
+searches each bibliographic database
+.I file
+for references containing those keywords,
+writes any references found to the standard output stream,
+and repeats this process until the end of input.
+.
+For each database
+.I file
+to be searched,
+if an index
+.RI file @INDEX_SUFFIX@
+created by
+.MR @g@indxbib @MAN1EXT@
+exists,
+then it will be searched instead;
+each index can cover multiple databases.
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.BI \-i\~ string
+When searching files for which no index exists,
+ignore the contents of fields whose names are in
+.IR string .
+.
+.
+.TP
+.BI \-t\~ n
+Require only the first
+.I n
+characters of keys to be given.
+.
+The default
+is\~6.
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.RI file @INDEX_SUFFIX@
+Index files.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+\[lq]Some Applications of Inverted Indexes on the Unix System\[rq],
+by M.\& E.\& Lesk,
+1978,
+AT&T Bell Laboratories Computing Science Technical Report No.\& 69.
+.
+.
+.LP
+.MR @g@refer @MAN1EXT@ ,
+.MR lkbib @MAN1EXT@ ,
+.MR @g@indxbib @MAN1EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_lookbib_1_man_C]
+.do rr *groff_lookbib_1_man_C
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/utils/lookbib/lookbib.am b/src/utils/lookbib/lookbib.am
new file mode 100644
index 0000000..75103c1
--- /dev/null
+++ b/src/utils/lookbib/lookbib.am
@@ -0,0 +1,29 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+prefixexecbin_PROGRAMS += lookbib
+PREFIXMAN1 += src/utils/lookbib/lookbib.1
+EXTRA_DIST += src/utils/lookbib/lookbib.1.man
+lookbib_LDADD = libbib.a libgroff.a $(LIBM) lib/libgnu.a
+lookbib_SOURCES = src/utils/lookbib/lookbib.cpp
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/utils/lookbib/lookbib.cpp b/src/utils/lookbib/lookbib.cpp
new file mode 100644
index 0000000..d8556c6
--- /dev/null
+++ b/src/utils/lookbib/lookbib.cpp
@@ -0,0 +1,146 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "lib.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+
+#include "errarg.h"
+#include "error.h"
+#include "cset.h"
+
+#include "refid.h"
+#include "search.h"
+
+/* for isatty() */
+#include "posix.h"
+#include "nonposix.h"
+
+extern "C" const char *Version_string;
+
+static void usage(FILE *stream)
+{
+ fprintf(stream,
+ "usage: %s [-i XYZ] [-t N] database ...\n"
+ "usage: %s {-v | --version}\n"
+ "usage: %s --help\n",
+ program_name, program_name, program_name);
+}
+
+int main(int argc, char **argv)
+{
+ program_name = argv[0];
+ static char stderr_buf[BUFSIZ];
+ setbuf(stderr, stderr_buf);
+ int opt;
+ static const struct option long_options[] = {
+ { "help", no_argument, 0, CHAR_MAX + 1 },
+ { "version", no_argument, 0, 'v' },
+ { NULL, 0, 0, 0 }
+ };
+ while ((opt = getopt_long(argc, argv, "vVi:t:", long_options, NULL)) != EOF)
+ switch (opt) {
+ case 'V':
+ do_verify = true;
+ break;
+ case 'i':
+ linear_ignore_fields = optarg;
+ break;
+ case 't':
+ {
+ char *ptr;
+ long n = strtol(optarg, &ptr, 10);
+ if (n == 0 && ptr == optarg) {
+ error("bad integer '%1' in 't' option", optarg);
+ break;
+ }
+ if (n < 1)
+ n = 1;
+ linear_truncate_len = int(n);
+ break;
+ }
+ case 'v':
+ {
+ printf("GNU lookbib (groff) version %s\n", Version_string);
+ exit(0);
+ break;
+ }
+ case CHAR_MAX + 1: // --help
+ usage(stdout);
+ exit(0);
+ break;
+ case '?':
+ usage(stderr);
+ exit(1);
+ break;
+ default:
+ assert(0);
+ }
+ if (optind >= argc) {
+ usage(stderr);
+ exit(1);
+ }
+ search_list list;
+ for (int i = optind; i < argc; i++)
+ list.add_file(argv[i]);
+ if (list.nfiles() == 0)
+ fatal("no databases");
+ char line[1024];
+ int interactive = isatty(fileno(stdin));
+ for (;;) {
+ if (interactive) {
+ fputs("> ", stderr);
+ fflush(stderr);
+ }
+ if (!fgets(line, sizeof(line), stdin))
+ break;
+ char *ptr = line;
+ while (csspace(*ptr))
+ ptr++;
+ if (*ptr == '\0')
+ continue;
+ search_list_iterator iter(&list, line);
+ const char *start;
+ int len;
+ int count;
+ for (count = 0; iter.next(&start, &len); count++) {
+ if (fwrite(start, 1, len, stdout) != (size_t)len)
+ fatal("write error on stdout: %1", strerror(errno));
+ // Can happen for last reference in file.
+ if (start[len - 1] != '\n')
+ putchar('\n');
+ putchar('\n');
+ }
+ fflush(stdout);
+ if (interactive) {
+ fprintf(stderr, "%d found\n", count);
+ fflush(stderr);
+ }
+ }
+ if (interactive)
+ putc('\n', stderr);
+ return 0;
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/utils/pfbtops/pfbtops.1.man b/src/utils/pfbtops/pfbtops.1.man
new file mode 100644
index 0000000..71140c6
--- /dev/null
+++ b/src/utils/pfbtops/pfbtops.1.man
@@ -0,0 +1,129 @@
+.TH pfbtops @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+pfbtops \- translate PostScript Printer Font Binary files to Printer
+Font ASCII
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2020 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_pfbtops_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY pfbtops
+.RI [ pfb-file ]
+.YS
+.
+.
+.SY pfbtops
+.B \-\-help
+.YS
+.
+.
+.SY pfbtops
+.B \-v
+.
+.SY pfbtops
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I pfbtops
+translates a PostScript Type\~1 font in Printer Font Binary (PFB) format
+to Printer Font ASCII (PFA) format,
+splitting overlong lines in text packets into smaller chunks.
+.
+If
+.I pfb-file
+is omitted,
+the PFB file will be read from the standard input stream.
+.
+The PFA font will be written on the standard output stream.
+.
+PostScript fonts for MS-DOS were historically supplied in PFB format.
+.
+Use of a PostScript Type\~1 font with
+.I groff
+requires conversion of its metrics
+(AFM file)
+to a
+.I groff
+font description file;
+see
+.MR afmtodit @MAN1EXT@ .
+.
+.
+.P
+The
+.B \-\-help
+option displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.MR grops @MAN1EXT@ ,
+.MR gropdf @MAN1EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_pfbtops_1_man_C]
+.do rr *groff_pfbtops_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/utils/pfbtops/pfbtops.am b/src/utils/pfbtops/pfbtops.am
new file mode 100644
index 0000000..8b7fd71
--- /dev/null
+++ b/src/utils/pfbtops/pfbtops.am
@@ -0,0 +1,32 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+bin_PROGRAMS += pfbtops
+man1_MANS += src/utils/pfbtops/pfbtops.1
+EXTRA_DIST += src/utils/pfbtops/pfbtops.1.man
+pfbtops_SOURCES = src/utils/pfbtops/pfbtops.c
+pfbtops_LDADD = libgroff.a $(LIBM) lib/libgnu.a
+# We use the following trick to force the use of C++ compiler
+# See the Automake manual, "Libtool Convenience Libraries"
+nodist_EXTRA_pfbtops_SOURCES = src/utils/pfbtops/dummy.cpp
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/utils/pfbtops/pfbtops.c b/src/utils/pfbtops/pfbtops.c
new file mode 100644
index 0000000..8fbe44a
--- /dev/null
+++ b/src/utils/pfbtops/pfbtops.c
@@ -0,0 +1,243 @@
+/* Copyright (C) 1992-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* This translates ps fonts in .pfb format to ASCII ps files. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#define __GETOPT_PREFIX groff_
+
+#include <errno.h> // errno
+#include <stdio.h>
+#include <stdlib.h> // exit(), EXIT_FAILURE, EXIT_SUCCESS
+#include <string.h> // strerror()
+#include <limits.h>
+
+#include <getopt.h>
+
+#include "nonposix.h"
+
+/* Binary bytes per output line. */
+#define BYTES_PER_LINE (64/2)
+#define MAX_LINE_LENGTH 78
+#define HEX_DIGITS "0123456789abcdef"
+
+extern const char *Version_string;
+
+static char *program_name;
+
+static void error(const char *s)
+{
+ fprintf(stderr, "%s: error: %s\n", program_name, s);
+ exit(EXIT_FAILURE);
+}
+
+static void usage(FILE *stream)
+{
+ fprintf(stream, "usage: %s [pfb-file]\n"
+ "usage: %s {-v | --version}\n"
+ "usage: %s --help\n",
+ program_name, program_name, program_name);
+}
+
+static void get_text(int n)
+{
+ int c = 0, c1;
+ int in_string = 0;
+ int is_comment = 0;
+ int count = 0;
+
+ while (--n >= 0) {
+ c = getchar();
+ if (c == '(' && !is_comment)
+ in_string++;
+ else if (c == ')' && !is_comment)
+ in_string--;
+ else if (c == '%' && !in_string)
+ is_comment = 1;
+ else if (c == '\\' && in_string) {
+ count++;
+ putchar(c);
+ if (n-- == 0)
+ break;
+ c = getchar();
+ /* don't split octal character representations */
+ if (c >= '0' && c <= '7') {
+ count++;
+ putchar(c);
+ if (n-- == 0)
+ break;
+ c = getchar();
+ if (c >= '0' && c <= '7') {
+ count++;
+ putchar(c);
+ if (n-- == 0)
+ break;
+ c = getchar();
+ if (c >= '0' && c <= '7') {
+ count++;
+ putchar(c);
+ if (n-- == 0)
+ break;
+ c = getchar();
+ }
+ }
+ }
+ }
+ if (c == EOF)
+ error("end of file in text packet");
+ else if (c == '\r') {
+ if (n-- == 0)
+ break;
+ c1 = getchar();
+ if (c1 != '\n') {
+ ungetc(c1, stdin);
+ n++;
+ }
+ c = '\n';
+ }
+ if (c == '\n') {
+ count = 0;
+ is_comment = 0;
+ }
+ else if (count >= MAX_LINE_LENGTH) {
+ if (in_string > 0) {
+ count = 1;
+ putchar('\\');
+ putchar('\n');
+ }
+ else if (is_comment) {
+ count = 2;
+ putchar('\n');
+ putchar('%');
+ }
+ else {
+ /* split at the next whitespace character */
+ while (c != ' ' && c != '\t' && c != '\f') {
+ putchar(c);
+ if (n-- == 0)
+ break;
+ c = getchar();
+ }
+ count = 0;
+ putchar('\n');
+ continue;
+ }
+ }
+ count++;
+ putchar(c);
+ }
+ if (c != '\n')
+ putchar('\n');
+}
+
+static void get_binary(int n)
+{
+ int c;
+ int count = 0;
+
+ while (--n >= 0) {
+ c = getchar();
+ if (c == EOF)
+ error("end of file in binary packet");
+ if (count >= BYTES_PER_LINE) {
+ putchar('\n');
+ count = 0;
+ }
+ count++;
+ putchar(HEX_DIGITS[(c >> 4) & 0xf]);
+ putchar(HEX_DIGITS[c & 0xf]);
+ }
+ putchar('\n');
+}
+
+int main(int argc, char **argv)
+{
+ int opt;
+ static const struct option long_options[] = {
+ { "help", no_argument, 0, CHAR_MAX + 1 },
+ { "version", no_argument, 0, 'v' },
+ { NULL, 0, 0, 0 }
+ };
+
+ program_name = argv[0];
+
+ while ((opt = getopt_long(argc, argv, "v", long_options, NULL)) != EOF) {
+ switch (opt) {
+ case 'v':
+ printf("GNU pfbtops (groff) version %s\n", Version_string);
+ exit(EXIT_SUCCESS);
+ break;
+ case CHAR_MAX + 1: /* --help */
+ usage(stdout);
+ exit(EXIT_SUCCESS);
+ break;
+ case '?':
+ usage(stderr);
+ exit(2);
+ break;
+ }
+ }
+
+ if (argc - optind > 1) {
+ usage(stderr);
+ exit(2);
+ }
+ const char *file = argv[optind];
+ if (argc > optind && !freopen(file, "r", stdin)) {
+ fprintf(stderr, "%s: error: unable to open file '%s': %s\n",
+ program_name, file, strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+ SET_BINARY(fileno(stdin));
+ for (;;) {
+ int type, c, i;
+ long n;
+
+ c = getchar();
+ if (c != 0x80)
+ error("first byte of packet not 0x80");
+ type = getchar();
+ if (type == 3)
+ break;
+ if (type != 1 && type != 2)
+ error("bad packet type");
+ n = 0;
+ for (i = 0; i < 4; i++) {
+ c = getchar();
+ if (c == EOF)
+ error("end of file in packet header");
+ n |= (long)c << (i << 3);
+ }
+ if (n < 0)
+ error("negative packet length");
+ if (type == 1)
+ get_text(n);
+ else
+ get_binary(n);
+ }
+ exit(EXIT_SUCCESS);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/utils/tfmtodit/tfmtodit.1.man b/src/utils/tfmtodit/tfmtodit.1.man
new file mode 100644
index 0000000..0f21753
--- /dev/null
+++ b/src/utils/tfmtodit/tfmtodit.1.man
@@ -0,0 +1,415 @@
+.TH tfmtodit @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+tfmtodit \- adapt TeX Font Metrics files for use with
+.I groff
+and
+.I grodvi
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2020 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_tfmtodit_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.\" Definitions
+.\" ====================================================================
+.
+.ie t .ds tx T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X
+.el .ds tx TeX
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY tfmtodit
+.RB [ \-s ]
+.RB [ \-g\~\c
+.IR gf-file ]
+.RB [ \-k\~\c
+.IR skew-char ]
+.I tfm-file
+.I map-file
+.I font-description
+.YS
+.
+.
+.SY tfmtodit
+.B \-\-help
+.YS
+.
+.
+.SY tfmtodit
+.B \-v
+.
+.SY tfmtodit
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I tfmtodit
+creates a font description file for use with
+.MR groff @MAN1EXT@ 's
+.B dvi
+output device.
+.
+.I tfm-file
+is the name of the \*(tx font metric file for the font.
+.
+.I map-file
+assigns
+.I groff
+ordinary or special character identifiers to glyph indices in the font;
+it should consist of a sequence of lines of the form
+.
+.RS
+.IR "i c1" \~\&.\|.\|.\&\~ cn
+.RE
+.
+where
+.I i
+is a position of the glyph in the font in decimal,
+and
+.I c1
+through
+.I cn
+are glyph identifiers in the form used by
+.I groff
+font descriptions.
+.
+If a glyph has no
+.I groff
+names but exists in
+.I tfm-file,
+it is put in the
+.I groff
+font description file as an unnamed glyph.
+.
+Output is written in
+.MR groff_font @MAN5EXT@
+format to
+.I font-description,
+a file named for the intended
+.I groff
+font name.
+.
+.
+.P
+If the font is \[lq]special\[rq],
+meaning that
+.I groff
+should search it whenever a glyph is not found in the current font,
+use the
+.B \-s
+option and name
+.I font-description
+in the
+.B fonts
+directive in the output device's
+.I DESC
+file.
+.
+.
+.P
+To do a good job of math typesetting,
+.I groff
+requires font metric information not present in
+.I tfm-file.
+.
+This is because \*(tx has separate math italic fonts,
+whereas
+.I groff
+uses normal italic fonts for math.
+.
+The additional information required by
+.I groff
+is given by the two arguments to the
+.B math_fit
+macro in the Metafont programs for the Computer Modern fonts.
+.
+In a text font (a font for which
+.B math_fit
+is false),
+Metafont normally ignores these two arguments.
+.
+Metafont can be made to put this information into the GF
+(\[lq]generic font\[rq])
+files it produces by loading the following definition after
+.B cmbase
+when creating
+.IR cm.base .
+.
+.RS
+.EX
+def ignore_math_fit(expr left_adjustment,right_adjustment) =
+ special "adjustment";
+ numspecial left_adjustment*16/designsize;
+ numspecial right_adjustment*16/designsize;
+ enddef;
+.EE
+.RE
+.
+For the EC font family,
+load the following definition after
+.BR exbase ;
+consider patching
+.I exbase.mf
+locally.
+.
+.RS
+.EX
+def ignore_math_fit(expr left_adjustment,right_adjustment) =
+ ori_special "adjustment";
+ ori_numspecial left_adjustment*16/designsize;
+ ori_numspecial right_adjustment*16/designsize;
+ enddef;
+.EE
+.RE
+.
+The only difference from the previous example is the \[lq]ori_\[rq]
+prefix to \[lq]special\[rq] and \[lq]numspecial\[rq].
+.
+The GF file created using this modified
+.I cm.base
+or
+.I exbase.mf
+should be specified with the
+.B \-g
+option,
+which should
+.I not
+be given for a font for which
+.B math_fit
+is true.
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.BI \-g \~gf-file
+Use the
+.I gf-file
+produced by Metafont containing
+.RB \[lq] special \[rq]
+and
+.RB \[lq] numspecial \[rq]
+commands to obtain additional font metric information.
+.
+.
+.TP
+.BI \-k \~skew-char
+The skew character of this font is at position
+.I skew-char.
+.
+.I skew-char
+should be an integer;
+it may be given in decimal,
+with a leading 0 in octal,
+or with a leading 0x in hexadecimal.
+.
+Any kerns whose second component is
+.I skew-char
+are ignored.
+.
+.
+.TP
+.B \-s
+Add the
+.B special
+directive to the font description file.
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @FONTDIR@/\:\%devdvi/\:DESC
+describes the
+.B dvi
+output device.
+.
+.
+.TP
+.IR @FONTDIR@/\:\%devdvi/ F
+describes the font known
+.RI as\~ F
+on device
+.BR dvi .
+.
+.
+.TP
+.I @FONTDIR@/\:\%devdvi/\:\%generate/\:\%ec.map
+.TQ
+.I @FONTDIR@/\:\%devdvi/\:\%generate/\:\%msam.map
+.TQ
+.I @FONTDIR@/\:\%devdvi/\:\%generate/\:\%msbm.map
+.TQ
+.I @FONTDIR@/\:\%devdvi/\:\%generate/\:\%tc.map
+.TQ
+.I @FONTDIR@/\:\%devdvi/\:\%generate/\:\%texb.map
+.TQ
+.I @FONTDIR@/\:\%devdvi/\:\%generate/\:\%texex.map
+.TQ
+.I @FONTDIR@/\:\%devdvi/\:\%generate/\:\%texi.map
+.TQ
+.I @FONTDIR@/\:\%devdvi/\:\%generate/\:\%texitt.map
+.TQ
+.I @FONTDIR@/\:\%devdvi/\:\%generate/\:\%texmi.map
+.TQ
+.I @FONTDIR@/\:\%devdvi/\:\%generate/\:\%texr.map
+.TQ
+.I @FONTDIR@/\:\%devdvi/\:\%generate/\:\%texsy.map
+.TQ
+.I @FONTDIR@/\:\%devdvi/\:\%generate/\:\%textex.map
+.TQ
+.I @FONTDIR@/\:\%devdvi/\:\%generate/\:\%textt.map
+map glyph indices in \*[tx] fonts to
+.I groff
+ordinary and special character identifiers.
+.
+.I \%ec.map
+is used for
+.BR TREC ,
+.BR TIEC ,
+.BR TBEC ,
+.BR TBIEC ,
+.BR HREC ,
+.BR HIEC ,
+.BR HBEC ,
+.BR HBIEC ,
+.BR CWEC ,
+and
+.BR CWIEC ;
+.I \%msam.map
+for
+.BR SA ;
+.I \%msbm.map
+for
+.BR SB ;
+.I \%tc.map
+for
+.BR TRTC ,
+.BR TITC ,
+.BR TBTC ,
+.BR TBITC ,
+.BR HRTC ,
+.BR HITC ,
+.BR HBTC ,
+.BR HBITC ,
+.BR CWTC ,
+and
+.BR CWITC ;
+.I \%texb.map
+for
+.BR TB ,
+.BR HR ,
+.BR HI ,
+.BR HB ,
+and
+.BR HBI ;
+.I \%texex.map
+for
+.BR EX ;
+.I \%texi.map
+for
+.B TI
+and
+.BR TBI ;
+.I \%texitt.map
+for
+.BR CWI ;
+.I \%texmi.map
+for
+.BR MI ;
+.I \%texr.map
+for
+.BR TR ;
+.I \%texsy.map
+for
+.BR S ;
+.I \%textex.map
+for
+.BR SC ;
+and
+.I \%textt.map
+for
+.BR CW .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.MR groff @MAN1EXT@ ,
+.MR grodvi @MAN1EXT@ ,
+.MR groff_font @MAN5EXT@
+.
+.
+.\" Clean up.
+.rm tx
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_tfmtodit_1_man_C]
+.do rr *groff_tfmtodit_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/utils/tfmtodit/tfmtodit.am b/src/utils/tfmtodit/tfmtodit.am
new file mode 100644
index 0000000..758fad5
--- /dev/null
+++ b/src/utils/tfmtodit/tfmtodit.am
@@ -0,0 +1,29 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+bin_PROGRAMS += tfmtodit
+man1_MANS += src/utils/tfmtodit/tfmtodit.1
+EXTRA_DIST += src/utils/tfmtodit/tfmtodit.1.man
+tfmtodit_SOURCES = src/utils/tfmtodit/tfmtodit.cpp
+tfmtodit_LDADD = libgroff.a $(LIBM) lib/libgnu.a
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/utils/tfmtodit/tfmtodit.cpp b/src/utils/tfmtodit/tfmtodit.cpp
new file mode 100644
index 0000000..3003733
--- /dev/null
+++ b/src/utils/tfmtodit/tfmtodit.cpp
@@ -0,0 +1,889 @@
+/* Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* I have tried to incorporate the changes needed for TeX 3.0 tfm files,
+but I haven't tested them. */
+
+/* Groff requires more font metric information than TeX. The reason
+for this is that TeX has separate Math Italic fonts, whereas groff
+uses normal italic fonts for math. The two additional pieces of
+information required by groff correspond to the two arguments to the
+math_fit() macro in the Metafont programs for the CM fonts. In the
+case of a font for which math_fitting is false, these two arguments
+are normally ignored by Metafont. We need to get hold of these two
+parameters and put them in the groff font file.
+
+We do this by loading this definition after cmbase when creating
+cm.base.
+
+def ignore_math_fit(expr left_adjustment,right_adjustment) =
+ special "adjustment";
+ numspecial left_adjustment*16/designsize;
+ numspecial right_adjustment*16/designsize;
+ enddef;
+
+This puts the two arguments to the math_fit macro into the gf file.
+(They will appear in the gf file immediately before the character to
+which they apply.) We then create a gf file using this cm.base. Then
+we run tfmtodit and specify this gf file with the -g option.
+
+This need only be done for a font for which math_fitting is false;
+When it's true, the left_correction and subscript_correction should
+both be zero. */
+
+#include "lib.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <math.h>
+#include <stdlib.h>
+
+#include "errarg.h"
+#include "error.h"
+#include "cset.h"
+#include "nonposix.h"
+
+extern "C" const char *Version_string;
+
+/* Values in the tfm file should be multiplied by this. */
+
+#define MULTIPLIER 1
+
+struct char_info_word {
+ unsigned char width_index;
+ unsigned char height_index;
+ unsigned char depth_index;
+ unsigned char italic_index;
+ unsigned char tag;
+ unsigned char remainder;
+};
+
+struct lig_kern_command {
+ unsigned char skip_byte;
+ unsigned char next_char;
+ unsigned char op_byte;
+ unsigned char remainder;
+};
+
+class tfm {
+ int bc;
+ int ec;
+ int nw;
+ int nh;
+ int nd;
+ int ni;
+ int nl;
+ int nk;
+ int np;
+ int cs;
+ int ds;
+ char_info_word *char_info;
+ int *width;
+ int *height;
+ int *depth;
+ int *italic;
+ lig_kern_command *lig_kern;
+ int *kern;
+ int *param;
+public:
+ tfm();
+ ~tfm();
+ int load(const char *);
+ int contains(int);
+ int get_width(int);
+ int get_height(int);
+ int get_depth(int);
+ int get_italic(int);
+ int get_param(int, int *);
+ int get_checksum();
+ int get_design_size();
+ int get_lig(unsigned char, unsigned char, unsigned char *);
+ friend class kern_iterator;
+};
+
+class kern_iterator {
+ tfm *t;
+ int c;
+ int i;
+public:
+ kern_iterator(tfm *);
+ int next(unsigned char *c1, unsigned char *c2, int *k);
+};
+
+
+kern_iterator::kern_iterator(tfm *p)
+: t(p), c(t->bc), i(-1)
+{
+}
+
+int kern_iterator::next(unsigned char *c1, unsigned char *c2, int *k)
+{
+ for (; c <= t->ec; c++)
+ if (t->char_info[c - t->bc].tag == 1) {
+ if (i < 0) {
+ i = t->char_info[c - t->bc].remainder;
+ if (t->lig_kern[i].skip_byte > 128)
+ i = (256*t->lig_kern[i].op_byte
+ + t->lig_kern[i].remainder);
+ }
+ for (;;) {
+ int skip = t->lig_kern[i].skip_byte;
+ if (skip <= 128 && t->lig_kern[i].op_byte >= 128) {
+ *c1 = c;
+ *c2 = t->lig_kern[i].next_char;
+ *k = t->kern[256*(t->lig_kern[i].op_byte - 128)
+ + t->lig_kern[i].remainder];
+ if (skip == 128) {
+ c++;
+ i = -1;
+ }
+ else
+ i += skip + 1;
+ return 1;
+ }
+ if (skip >= 128)
+ break;
+ i += skip + 1;
+ }
+ i = -1;
+ }
+ return 0;
+}
+
+tfm::tfm()
+: char_info(0), width(0), height(0), depth(0), italic(0), lig_kern(0),
+ kern(0), param(0)
+{
+}
+
+int tfm::get_lig(unsigned char c1, unsigned char c2, unsigned char *cp)
+{
+ if (contains(c1) && char_info[c1 - bc].tag == 1) {
+ int i = char_info[c1 - bc].remainder;
+ if (lig_kern[i].skip_byte > 128)
+ i = 256*lig_kern[i].op_byte + lig_kern[i].remainder;
+ for (;;) {
+ int skip = lig_kern[i].skip_byte;
+ if (skip > 128)
+ break;
+ // We are only interested in normal ligatures, for which
+ // op_byte == 0.
+ if (lig_kern[i].op_byte == 0
+ && lig_kern[i].next_char == c2) {
+ *cp = lig_kern[i].remainder;
+ return 1;
+ }
+ if (skip == 128)
+ break;
+ i += skip + 1;
+ }
+ }
+ return 0;
+}
+
+int tfm::contains(int i)
+{
+ return i >= bc && i <= ec && char_info[i - bc].width_index != 0;
+}
+
+int tfm::get_width(int i)
+{
+ return width[char_info[i - bc].width_index];
+}
+
+int tfm::get_height(int i)
+{
+ return height[char_info[i - bc].height_index];
+}
+
+int tfm::get_depth(int i)
+{
+ return depth[char_info[i - bc].depth_index];
+}
+
+int tfm::get_italic(int i)
+{
+ return italic[char_info[i - bc].italic_index];
+}
+
+int tfm::get_param(int i, int *p)
+{
+ if (i <= 0 || i > np)
+ return 0;
+ else {
+ *p = param[i - 1];
+ return 1;
+ }
+}
+
+int tfm::get_checksum()
+{
+ return cs;
+}
+
+int tfm::get_design_size()
+{
+ return ds;
+}
+
+tfm::~tfm()
+{
+ delete[] char_info;
+ delete[] width;
+ delete[] height;
+ delete[] depth;
+ delete[] italic;
+ delete[] lig_kern;
+ delete[] kern;
+ delete[] param;
+}
+
+int read2(unsigned char *&s)
+{
+ int n;
+ n = *s++ << 8;
+ n |= *s++;
+ return n;
+}
+
+int read4(unsigned char *&s)
+{
+ int n;
+ n = *s++ << 24;
+ n |= *s++ << 16;
+ n |= *s++ << 8;
+ n |= *s++;
+ return n;
+}
+
+int tfm::load(const char *file)
+{
+ errno = 0;
+ FILE *fp = fopen(file, FOPEN_RB);
+ if (!fp) {
+ error("can't open '%1': %2", file, strerror(errno));
+ return 0;
+ }
+ int c1 = getc(fp);
+ int c2 = getc(fp);
+ if (c1 == EOF || c2 == EOF) {
+ fclose(fp);
+ error("unexpected end of file on '%1'", file);
+ return 0;
+ }
+ int lf = (c1 << 8) + c2;
+ int toread = lf*4 - 2;
+ unsigned char *buf = new unsigned char[toread];
+ if (fread(buf, 1, toread, fp) != (size_t)toread) {
+ if (feof(fp))
+ error("unexpected end of file on '%1'", file);
+ else
+ error("error on file '%1'", file);
+ delete[] buf;
+ fclose(fp);
+ return 0;
+ }
+ fclose(fp);
+ if (lf < 6) {
+ error("bad TFM file '%1': impossibly short", file);
+ delete[] buf;
+ return 0;
+ }
+ unsigned char *ptr = buf;
+ int lh = read2(ptr);
+ bc = read2(ptr);
+ ec = read2(ptr);
+ nw = read2(ptr);
+ nh = read2(ptr);
+ nd = read2(ptr);
+ ni = read2(ptr);
+ nl = read2(ptr);
+ nk = read2(ptr);
+ int ne = read2(ptr);
+ np = read2(ptr);
+ if ((6 + lh + (ec - bc + 1) + nw + nh + nd + ni + nl + nk + ne + np)
+ != lf) {
+ error("bad TFM file '%1': lengths do not sum", file);
+ delete[] buf;
+ return 0;
+ }
+ if (lh < 2) {
+ error("bad TFM file '%1': header too short", file);
+ delete[] buf;
+ return 0;
+ }
+ char_info = new char_info_word[ec - bc + 1];
+ width = new int[nw];
+ height = new int[nh];
+ depth = new int[nd];
+ italic = new int[ni];
+ lig_kern = new lig_kern_command[nl];
+ kern = new int[nk];
+ param = new int[np];
+ int i;
+ cs = read4(ptr);
+ ds = read4(ptr);
+ ptr += (lh-2)*4;
+ for (i = 0; i < ec - bc + 1; i++) {
+ char_info[i].width_index = *ptr++;
+ unsigned char tem = *ptr++;
+ char_info[i].depth_index = tem & 0xf;
+ char_info[i].height_index = tem >> 4;
+ tem = *ptr++;
+ char_info[i].italic_index = tem >> 2;
+ char_info[i].tag = tem & 3;
+ char_info[i].remainder = *ptr++;
+ }
+ for (i = 0; i < nw; i++)
+ width[i] = read4(ptr);
+ for (i = 0; i < nh; i++)
+ height[i] = read4(ptr);
+ for (i = 0; i < nd; i++)
+ depth[i] = read4(ptr);
+ for (i = 0; i < ni; i++)
+ italic[i] = read4(ptr);
+ for (i = 0; i < nl; i++) {
+ lig_kern[i].skip_byte = *ptr++;
+ lig_kern[i].next_char = *ptr++;
+ lig_kern[i].op_byte = *ptr++;
+ lig_kern[i].remainder = *ptr++;
+ }
+ for (i = 0; i < nk; i++)
+ kern[i] = read4(ptr);
+ ptr += ne*4;
+ for (i = 0; i < np; i++)
+ param[i] = read4(ptr);
+ assert(ptr == buf + lf*4 - 2);
+ delete[] buf;
+ return 1;
+}
+
+class gf {
+ int left[256];
+ int right[256];
+ static int sread4(int *p, FILE *fp);
+ static int uread3(int *p, FILE *fp);
+ static int uread2(int *p, FILE *fp);
+ static int skip(int n, FILE *fp);
+public:
+ gf();
+ int load(const char *file);
+ int get_left_adjustment(int i) { return left[i]; }
+ int get_right_adjustment(int i) { return right[i]; }
+};
+
+gf::gf()
+{
+ for (int i = 0; i < 256; i++)
+ left[i] = right[i] = 0;
+}
+
+int gf::load(const char *file)
+{
+ enum {
+ paint_0 = 0,
+ paint1 = 64,
+ boc = 67,
+ boc1 = 68,
+ eoc = 69,
+ skip0 = 70,
+ skip1 = 71,
+ new_row_0 = 74,
+ xxx1 = 239,
+ yyy = 243,
+ no_op = 244,
+ pre = 247,
+ post = 248
+ };
+ int got_an_adjustment = 0;
+ int pending_adjustment = 0;
+ int left_adj = 0, right_adj = 0; // pacify compiler
+ const int gf_id_byte = 131;
+ errno = 0;
+ FILE *fp = fopen(file, FOPEN_RB);
+ if (!fp) {
+ error("can't open '%1': %2", file, strerror(errno));
+ return 0;
+ }
+ if (getc(fp) != pre || getc(fp) != gf_id_byte) {
+ error("bad gf file");
+ return 0;
+ }
+ int n = getc(fp);
+ if (n == EOF)
+ goto eof;
+ if (!skip(n, fp))
+ goto eof;
+ for (;;) {
+ int op = getc(fp);
+ if (op == EOF)
+ goto eof;
+ if (op == post)
+ break;
+ if ((op >= paint_0 && op <= paint_0 + 63)
+ || (op >= new_row_0 && op <= new_row_0 + 164))
+ continue;
+ switch (op) {
+ case no_op:
+ case eoc:
+ case skip0:
+ break;
+ case paint1:
+ case skip1:
+ if (!skip(1, fp))
+ goto eof;
+ break;
+ case paint1 + 1:
+ case skip1 + 1:
+ if (!skip(2, fp))
+ goto eof;
+ break;
+ case paint1 + 2:
+ case skip1 + 2:
+ if (!skip(3, fp))
+ goto eof;
+ break;
+ case boc:
+ {
+ int code;
+ if (!sread4(&code, fp))
+ goto eof;
+ if (pending_adjustment) {
+ pending_adjustment = 0;
+ left[code & 0377] = left_adj;
+ right[code & 0377] = right_adj;
+ }
+ if (!skip(20, fp))
+ goto eof;
+ break;
+ }
+ case boc1:
+ {
+ int code = getc(fp);
+ if (code == EOF)
+ goto eof;
+ if (pending_adjustment) {
+ pending_adjustment = 0;
+ left[code] = left_adj;
+ right[code] = right_adj;
+ }
+ if (!skip(4, fp))
+ goto eof;
+ break;
+ }
+ case xxx1:
+ {
+ int len = getc(fp);
+ if (len == EOF)
+ goto eof;
+ char buf[256];
+ if (fread(buf, 1, len, fp) != (size_t)len)
+ goto eof;
+ if (len == 10 /* strlen("adjustment") */
+ && memcmp(buf, "adjustment", len) == 0) {
+ int c = getc(fp);
+ if (c != yyy) {
+ if (c != EOF)
+ ungetc(c, fp);
+ break;
+ }
+ if (!sread4(&left_adj, fp))
+ goto eof;
+ c = getc(fp);
+ if (c != yyy) {
+ if (c != EOF)
+ ungetc(c, fp);
+ break;
+ }
+ if (!sread4(&right_adj, fp))
+ goto eof;
+ got_an_adjustment = 1;
+ pending_adjustment = 1;
+ }
+ break;
+ }
+ case xxx1 + 1:
+ if (!uread2(&n, fp) || !skip(n, fp))
+ goto eof;
+ break;
+ case xxx1 + 2:
+ if (!uread3(&n, fp) || !skip(n, fp))
+ goto eof;
+ break;
+ case xxx1 + 3:
+ if (!sread4(&n, fp) || !skip(n, fp))
+ goto eof;
+ break;
+ case yyy:
+ if (!skip(4, fp))
+ goto eof;
+ break;
+ default:
+ fatal("unrecognized opcode '%1'", op);
+ break;
+ }
+ }
+ if (!got_an_adjustment)
+ warning("no adjustment specials found in gf file");
+ return 1;
+ eof:
+ error("unexpected end of file");
+ return 0;
+}
+
+int gf::sread4(int *p, FILE *fp)
+{
+ *p = getc(fp);
+ if (*p >= 128)
+ *p -= 256;
+ *p <<= 8;
+ *p |= getc(fp);
+ *p <<= 8;
+ *p |= getc(fp);
+ *p <<= 8;
+ *p |= getc(fp);
+ return !ferror(fp) && !feof(fp);
+}
+
+int gf::uread3(int *p, FILE *fp)
+{
+ *p = getc(fp);
+ *p <<= 8;
+ *p |= getc(fp);
+ *p <<= 8;
+ *p |= getc(fp);
+ return !ferror(fp) && !feof(fp);
+}
+
+int gf::uread2(int *p, FILE *fp)
+{
+ *p = getc(fp);
+ *p <<= 8;
+ *p |= getc(fp);
+ return !ferror(fp) && !feof(fp);
+}
+
+int gf::skip(int n, FILE *fp)
+{
+ while (--n >= 0)
+ if (getc(fp) == EOF)
+ return 0;
+ return 1;
+}
+
+
+struct char_list {
+ char *ch;
+ char_list *next;
+ char_list(const char *, char_list * = 0);
+};
+
+char_list::char_list(const char *s, char_list *p) : ch(strsave(s)),
+ next(p)
+{
+}
+
+
+int read_map(const char *file, char_list **table)
+{
+ errno = 0;
+ FILE *fp = fopen(file, "r");
+ if (!fp) {
+ error("can't open '%1': %2", file, strerror(errno));
+ return 0;
+ }
+ for (int i = 0; i < 256; i++)
+ table[i] = 0;
+ char buf[512];
+ int lineno = 0;
+ while (fgets(buf, int(sizeof(buf)), fp)) {
+ lineno++;
+ char *ptr = buf;
+ while (csspace(*ptr))
+ ptr++;
+ if (*ptr == '\0' || *ptr == '#')
+ continue;
+ ptr = strtok(ptr, " \n\t");
+ if (!ptr)
+ continue;
+ int n;
+ if (sscanf(ptr, "%d", &n) != 1) {
+ error("%1:%2: bad map file", file, lineno);
+ fclose(fp);
+ return 0;
+ }
+ if (n < 0 || n > 255) {
+ error("%1:%2: code %3 out of range", file, lineno, n);
+ fclose(fp);
+ return 0;
+ }
+ ptr = strtok(0, " \n\t");
+ if (!ptr) {
+ error("%1:%2: missing names", file, lineno);
+ fclose(fp);
+ return 0;
+ }
+ for (; ptr; ptr = strtok(0, " \n\t"))
+ table[n] = new char_list(ptr, table[n]);
+ }
+ fclose(fp);
+ return 1;
+}
+
+
+/* Every character that can participate in a ligature appears in the
+lig_chars table. 'ch' gives the full-name of the character, 'name'
+gives the groff name of the character, 'i' gives its index in
+the encoding, which is filled in later (-1 if it does not appear). */
+
+struct S {
+ const char *ch;
+ int i;
+} lig_chars[] = {
+ { "f", -1 },
+ { "i", -1 },
+ { "l", -1 },
+ { "ff", -1 },
+ { "fi", -1 },
+ { "fl", -1 },
+ { "Fi", -1 },
+ { "Fl", -1 },
+};
+
+// Indices into lig_chars[].
+
+enum { CH_f, CH_i, CH_l, CH_ff, CH_fi, CH_fl, CH_ffi, CH_ffl };
+
+// Each possible ligature appears in this table.
+
+struct S2 {
+ unsigned char c1, c2, res;
+ const char *ch;
+} lig_table[] = {
+ { CH_f, CH_f, CH_ff, "ff" },
+ { CH_f, CH_i, CH_fi, "fi" },
+ { CH_f, CH_l, CH_fl, "fl" },
+ { CH_ff, CH_i, CH_ffi, "ffi" },
+ { CH_ff, CH_l, CH_ffl, "ffl" },
+ };
+
+static void usage(FILE *stream);
+
+int main(int argc, char **argv)
+{
+ program_name = argv[0];
+ int special_flag = 0;
+ int skewchar = -1;
+ int opt;
+ const char *gf_file = 0;
+ static const struct option long_options[] = {
+ { "help", no_argument, 0, CHAR_MAX + 1 },
+ { "version", no_argument, 0, 'v' },
+ { NULL, 0, 0, 0 }
+ };
+ while ((opt = getopt_long(argc, argv, "svg:k:", long_options, NULL))
+ != EOF)
+ switch (opt) {
+ case 'g':
+ gf_file = optarg;
+ break;
+ case 's':
+ special_flag = 1;
+ break;
+ case 'k':
+ {
+ char *ptr;
+ long n = strtol(optarg, &ptr, 0);
+ if ((n == 0 && ptr == optarg)
+ || *ptr != '\0'
+ || n < 0
+ || n > UCHAR_MAX)
+ error("invalid skew character position '%1'", optarg);
+ else
+ skewchar = (int)n;
+ break;
+ }
+ case 'v':
+ {
+ printf("GNU tfmtodit (groff) version %s\n", Version_string);
+ exit(0);
+ break;
+ }
+ case CHAR_MAX + 1: // --help
+ usage(stdout);
+ exit(0);
+ break;
+ case '?':
+ usage(stderr);
+ exit(1);
+ break;
+ case EOF:
+ assert(0 == "EOF encountered in option processing");
+ }
+ if (argc - optind != 3) {
+ error("insufficient arguments");
+ usage(stderr);
+ exit(1);
+ }
+ gf g;
+ if (gf_file) {
+ if (!g.load(gf_file))
+ return 1;
+ }
+ const char *tfm_file = argv[optind];
+ const char *map_file = argv[optind + 1];
+ const char *font_file = argv[optind + 2];
+ tfm t;
+ if (!t.load(tfm_file))
+ return 1;
+ char_list *table[256];
+ if (!read_map(map_file, table))
+ return 1;
+ errno = 0;
+ if (!freopen(font_file, "w", stdout)) {
+ error("can't open '%1' for writing: %2", font_file,
+ strerror(errno));
+ return 1;
+ }
+ printf("name %s\n", font_file);
+ if (special_flag)
+ fputs("special\n", stdout);
+ char *internal_name = strsave(argv[optind]);
+ int len = strlen(internal_name);
+ if (len > 4 && strcmp(internal_name + len - 4, ".tfm") == 0)
+ internal_name[len - 4] = '\0';
+ // DIR_SEPS[] are possible directory separator characters, see
+ // nonposix.h. We want the rightmost separator of all possible ones.
+ // Example: d:/foo\\bar.
+ const char *s = strrchr(internal_name, DIR_SEPS[0]), *s1;
+ const char *sep = &DIR_SEPS[1];
+ while (*sep)
+ {
+ s1 = strrchr(internal_name, *sep);
+ if (s1 && (!s || s1 > s))
+ s = s1;
+ sep++;
+ }
+ printf("internalname %s\n", s ? s + 1 : internal_name);
+ int n;
+ if (t.get_param(2, &n)) {
+ if (n > 0)
+ printf("spacewidth %d\n", n*MULTIPLIER);
+ }
+ if (t.get_param(1, &n) && n != 0)
+ printf("slant %f\n", atan2(n/double(1<<20), 1.0)*180.0/PI);
+ int xheight;
+ if (!t.get_param(5, &xheight))
+ xheight = 0;
+ unsigned int i;
+ // Print the list of ligatures.
+ // First find the indices of each character that can participate in
+ // a ligature.
+ size_t lig_char_entries = sizeof(lig_chars)/sizeof(lig_chars[0]);
+ size_t lig_table_entries = sizeof(lig_table)/sizeof(lig_table[0]);
+ for (i = 0; i < 256; i++)
+ for (unsigned int j = 0; j < lig_char_entries; j++)
+ for (char_list *p = table[i]; p; p = p->next)
+ if (strcmp(lig_chars[j].ch, p->ch) == 0)
+ lig_chars[j].i = i;
+ // For each possible ligature, if its participants all exist,
+ // and it appears as a ligature in the tfm file, include in
+ // the list of ligatures.
+ int started = 0;
+ for (i = 0; i < lig_table_entries; i++) {
+ int i1 = lig_chars[lig_table[i].c1].i;
+ int i2 = lig_chars[lig_table[i].c2].i;
+ int r = lig_chars[lig_table[i].res].i;
+ if (i1 >= 0 && i2 >= 0 && r >= 0) {
+ unsigned char c;
+ if (t.get_lig(i1, i2, &c) && c == r) {
+ if (!started) {
+ started = 1;
+ fputs("ligatures", stdout);
+ }
+ printf(" %s", lig_table[i].ch);
+ }
+ }
+ }
+ if (started)
+ fputs(" 0\n", stdout);
+ printf("checksum %d\n", t.get_checksum());
+ printf("designsize %d\n", t.get_design_size());
+ // Now print out the kerning information.
+ int had_kern = 0;
+ kern_iterator iter(&t);
+ unsigned char c1, c2;
+ int k;
+ while (iter.next(&c1, &c2, &k))
+ if (c2 != skewchar) {
+ k *= MULTIPLIER;
+ char_list *q = table[c2];
+ for (char_list *p1 = table[c1]; p1; p1 = p1->next)
+ for (char_list *p2 = q; p2; p2 = p2->next) {
+ if (!had_kern) {
+ printf("kernpairs\n");
+ had_kern = 1;
+ }
+ printf("%s %s %d\n", p1->ch, p2->ch, k);
+ }
+ }
+ printf("charset\n");
+ char_list unnamed("---");
+ for (i = 0; i < 256; i++)
+ if (t.contains(i)) {
+ char_list *p = table[i] ? table[i] : &unnamed;
+ int m[6];
+ m[0] = t.get_width(i);
+ m[1] = t.get_height(i);
+ m[2] = t.get_depth(i);
+ m[3] = t.get_italic(i);
+ m[4] = g.get_left_adjustment(i);
+ m[5] = g.get_right_adjustment(i);
+ printf("%s\t%d", p->ch, m[0]*MULTIPLIER);
+ int j;
+ for (j = int(sizeof(m)/sizeof(m[0])) - 1; j > 0; j--)
+ if (m[j] != 0)
+ break;
+ for (k = 1; k <= j; k++)
+ printf(",%d", m[k]*MULTIPLIER);
+ int type = 0;
+ if (m[2] > 0)
+ type = 1;
+ if (m[1] > xheight)
+ type += 2;
+ printf("\t%d\t%04o\n", type, i);
+ for (p = p->next; p; p = p->next)
+ printf("%s\t\"\n", p->ch);
+ }
+ return 0;
+}
+
+static void usage(FILE *stream)
+{
+ fprintf(stream,
+"usage: %s [-s] [-g gf-file] [-k skew-char] tfm-file map-file font\n"
+"usage: %s {-v | --version}\n"
+"usage: %s --help\n",
+ program_name, program_name, program_name);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C++
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/utils/xtotroff/xtotroff.1.man b/src/utils/xtotroff/xtotroff.1.man
new file mode 100644
index 0000000..17fb0db
--- /dev/null
+++ b/src/utils/xtotroff/xtotroff.1.man
@@ -0,0 +1,237 @@
+.TH xtotroff @MAN1EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+xtotroff \- convert X font metrics into
+.I groff
+font metrics
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2004-2022 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_xtotroff_1_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY xtotroff
+.RB [ \-d\~\c
+.IR destination-directory ]
+.RB [ \-r\~\c
+.IR resolution ]
+.RB [ \-s\~\c
+.IR type-size ]
+.I font-map
+.YS
+.
+.
+.SY xtotroff
+.B \-\-help
+.YS
+.
+.
+.SY xtotroff
+.B \-v
+.
+.SY xtotroff
+.B \-\-version
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I xtotroff
+uses
+.I font-map
+to create
+.MR groff @MAN1EXT@
+font description files from X11 fonts.
+.
+Each line in
+.I font-map
+consists of a series of lines of paired
+.I groff
+font names and X font names as X Logical Font Description (XLFD)
+patterns,
+with the pair members separated by spaces and/or tabs.
+.
+For example,
+an input
+.I font-map
+file consisting of the line
+.
+.RS
+.EX
+TB \-adobe\-times\-bold\-r\-normal\-\-*\-*\-*\-*\-p\-*\-iso8859\-1
+.EE
+.RE
+.
+maps the XLFD on the right to the
+.I groff
+font name
+.BR TB ,
+conventionally \[lq]Times bold\[rq].
+.
+.
+.PP
+.I xtotroff
+opens a connection to the running X server to query its font catalog,
+and aborts if it cannot.
+.
+If necessary,
+the wildcards in the XLFD patterns are populated with the arguments to
+the
+.B \-r
+and
+.B \-s
+options.
+.
+If a font name is still ambiguous,
+.I xtotroff
+aborts.
+.
+For each successful mapping,
+.I xtotroff
+creates a
+.I groff
+font description file in the current working directory
+(or that specified by the
+.B -d
+option)
+named for each
+.I groff
+font,
+and reports the mapping to the standard output stream.
+.
+.
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+.B \-\-help
+displays a usage message,
+while
+.B \-v
+and
+.B \-\-version
+show version information;
+all exit afterward.
+.
+.
+.TP
+.BI \-d\~ destination-directory
+Write font descriptions to
+.I destination-directory
+rather than the current working directory.
+.
+.
+.TP
+.BI \-r\~ resolution
+Set the resolution for all font patterns in
+.IR font-map .
+.
+The value is used for both the horizontal and vertical motion quanta.
+.
+If not specified,
+a resolution of 75dpi is assumed.
+.
+.
+.TP
+.BI \-s\~ type-size
+Set the type size in points for all font patterns in
+.IR font-map .
+.
+If not specified,
+a size of 10 points is assumed.
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @FONTDIR@/\:\%FontMap\-X11
+is the font mapping file used to produce the pre-generated font
+description files,
+supplied with
+.IR groff ,
+of X11 core fonts corresponding to the 13 base Type\~1 fonts for
+PostScript level 1.
+.
+.
+.\" ====================================================================
+.SH Bugs
+.\" ====================================================================
+.
+The only supported font encodings are \[lq]iso8859\-1\[rq] and
+\%\[lq]adobe\-\:fontspecific\[rq].
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.UR https://\:www\:.x\:.org/\:releases/\:X11R7.6/\:doc/\:xorg\-docs/\
+\:specs/\:XLFD/xlfd\:.html
+\[lq]X Logical Font Description Conventions\[rq]
+.UE ,
+by Jim Flowers and Stephen Gildea.
+.
+.
+.PP
+.MR X 7 ,
+.MR groff @MAN1EXT@ ,
+.MR gxditview @MAN1EXT@ ,
+.MR troff @MAN1EXT@ ,
+.MR groff_font @MAN5EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_xtotroff_1_man_C]
+.do rr *groff_xtotroff_1_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/src/utils/xtotroff/xtotroff.am b/src/utils/xtotroff/xtotroff.am
new file mode 100644
index 0000000..734d143
--- /dev/null
+++ b/src/utils/xtotroff/xtotroff.am
@@ -0,0 +1,41 @@
+# Copyright (C) 2014-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+if WITHOUT_X11
+XTOTROFF_MAN1 =
+else
+XTOTROFF_MAN1 = src/utils/xtotroff/xtotroff.1
+bin_PROGRAMS += xtotroff
+man1_MANS += $(XTOTROFF_MAN1)
+xtotroff_SOURCES = src/utils/xtotroff/xtotroff.c
+XLIBS=$(LIBXUTIL) $(LIBGROFF)
+xtotroff_LDADD = libxutil.a libgroff.a $(X_LIBS) $(X_PRE_LIBS) \
+ -lXaw -lXt -lX11 $(X_EXTRA_LIBS) $(LIBM) lib/libgnu.a
+xtotroff_CPPFLAGS = $(AM_CPPFLAGS) $(X_CFLAGS)
+endif
+EXTRA_DIST += src/utils/xtotroff/xtotroff.1.man
+
+# Define variable needed only for the targets that regenerate
+# descriptions of X11 core fonts (used in "maintainer mode").
+xtotroff=$(top_builddir)/xtotroff
+
+
+# Local Variables:
+# fill-column: 72
+# mode: makefile-automake
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/src/utils/xtotroff/xtotroff.c b/src/utils/xtotroff/xtotroff.c
new file mode 100644
index 0000000..368761f
--- /dev/null
+++ b/src/utils/xtotroff/xtotroff.c
@@ -0,0 +1,368 @@
+/* Copyright (C) 1992-2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/*
+ * xtotroff
+ *
+ * convert X font metrics into troff font metrics
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#define __GETOPT_PREFIX groff_
+
+#include <X11/Xlib.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <limits.h>
+
+#include <getopt.h>
+
+#include "XFontName.h"
+#include "DviChar.h"
+
+#define charWidth(fi,c) \
+ ((fi)->per_char[(c) - (fi)->min_char_or_byte2].width)
+#define charHeight(fi,c) \
+ ((fi)->per_char[(c) - (fi)->min_char_or_byte2].ascent)
+#define charDepth(fi,c) \
+ ((fi)->per_char[(c) - (fi)->min_char_or_byte2].descent)
+#define charLBearing(fi,c) \
+ ((fi)->per_char[(c) - (fi)->min_char_or_byte2].lbearing)
+#define charRBearing(fi,c) \
+ ((fi)->per_char[(c) - (fi)->min_char_or_byte2].rbearing)
+
+extern const char *Version_string;
+static char *program_name;
+
+Display *dpy;
+unsigned resolution = 75;
+unsigned point_size = 10;
+char *destdir = NULL;
+
+static bool charExists(XFontStruct * fi, int c)
+{
+ XCharStruct *p;
+
+ /* 'c' is always >= 0 */
+ if ((unsigned int) c < fi->min_char_or_byte2
+ || (unsigned int) c > fi->max_char_or_byte2)
+ return false;
+ p = fi->per_char + (c - fi->min_char_or_byte2);
+ return p->lbearing != 0 || p->rbearing != 0 || p->width != 0
+ || p->ascent != 0 || p->descent != 0 || p->attributes != 0;
+}
+
+/* Canonicalize the font name by replacing scalable parts by *s. */
+
+static bool CanonicalizeFontName(char *font_name, char *canon_font_name)
+{
+ unsigned int attributes;
+ XFontName parsed;
+
+ if (!XParseFontName(font_name, &parsed, &attributes)) {
+ fprintf(stderr, "%s: not a standard font name: \"%s\"\n",
+ program_name, font_name);
+ return false;
+ }
+
+ attributes &= ~(FontNamePixelSize | FontNameAverageWidth
+ | FontNamePointSize
+ | FontNameResolutionX | FontNameResolutionY);
+ XFormatFontName(&parsed, attributes, canon_font_name);
+ return true;
+}
+
+static bool
+FontNamesAmbiguous(const char *font_name, char **names, int count)
+{
+ char name1[2048], name2[2048];
+ int i;
+
+ if (1 == count)
+ return false;
+
+ for (i = 0; i < count; i++) {
+ if (!CanonicalizeFontName(names[i], 0 == i ? name1 : name2)) {
+ fprintf(stderr, "%s: invalid font name: \"%s\"\n", program_name,
+ names[i]);
+ return true;
+ }
+ if (i > 0 && strcmp(name1, name2) != 0) {
+ fprintf(stderr, "%s: ambiguous font name: \"%s\"", program_name,
+ font_name);
+ fprintf(stderr, " matches \"%s\"", names[0]);
+ fprintf(stderr, " and \"%s\"", names[i]);
+ return true;
+ }
+ }
+ return false;
+}
+
+static void xtotroff_exit(int status)
+{
+ free(destdir);
+ exit(status);
+}
+
+static bool MapFont(char *font_name, const char *troff_name)
+{
+ XFontStruct *fi;
+ int count;
+ char **names;
+ FILE *out;
+ unsigned int c;
+ unsigned int attributes;
+ XFontName parsed;
+ int j, k;
+ DviCharNameMap *char_map;
+ /* 'encoding' needs to hold a CharSetRegistry (256), a CharSetEncoding
+ (256) [both from XFontName.h], a dash, and a null terminator. */
+ char encoding[256 * 2 + 1 + 1];
+ char *s;
+ int wid;
+ char name_string[2048];
+
+ if (!XParseFontName(font_name, &parsed, &attributes)) {
+ fprintf(stderr, "%s: not a standard font name: \"%s\"\n",
+ program_name, font_name);
+ return false;
+ }
+
+ attributes &= ~(FontNamePixelSize | FontNameAverageWidth);
+ attributes |= FontNameResolutionX;
+ attributes |= FontNameResolutionY;
+ attributes |= FontNamePointSize;
+ parsed.ResolutionX = resolution;
+ parsed.ResolutionY = resolution;
+ parsed.PointSize = point_size * 10;
+ XFormatFontName(&parsed, attributes, name_string);
+
+ names = XListFonts(dpy, name_string, 100000, &count);
+ if (count < 1) {
+ fprintf(stderr, "%s: invalid font name: \"%s\"\n", program_name,
+ font_name);
+ return false;
+ }
+
+ if (FontNamesAmbiguous(font_name, names, count))
+ return false;
+
+ XParseFontName(names[0], &parsed, &attributes);
+ size_t sz = sizeof encoding;
+ snprintf(encoding, sz, "%s-%s", parsed.CharSetRegistry,
+ parsed.CharSetEncoding);
+ for (s = encoding; *s; s++)
+ if (isupper(*s))
+ *s = tolower(*s);
+ char_map = DviFindMap(encoding);
+ if (!char_map) {
+ fprintf(stderr, "%s: not a standard encoding: \"%s\"\n",
+ program_name, encoding);
+ return false;
+ }
+
+ fi = XLoadQueryFont(dpy, names[0]);
+ if (!fi) {
+ fprintf(stderr, "%s: font does not exist: \"%s\"\n", program_name,
+ names[0]);
+ return false;
+ }
+
+ printf("%s -> %s\n", names[0], troff_name);
+ char *file_name = (char *)troff_name;
+ size_t dirlen = strlen(destdir);
+
+ if (dirlen > 0) {
+ size_t baselen = strlen(troff_name);
+ file_name = malloc(dirlen + baselen + 2 /* '/' and '\0' */);
+ if (NULL == file_name) {
+ fprintf(stderr, "%s: fatal error: unable to allocate memory\n",
+ program_name);
+ xtotroff_exit(EXIT_FAILURE);
+ }
+ (void) strcpy(file_name, destdir);
+ file_name[dirlen] = '/';
+ (void) strcpy((file_name + dirlen + 1), troff_name);
+ }
+
+ { /* Avoid race while opening file */
+ int fd;
+ (void) unlink(file_name);
+ fd = open(file_name, O_WRONLY | O_CREAT | O_EXCL, 0600);
+ out = fdopen(fd, "w");
+ }
+
+ if (NULL == out) {
+ fprintf(stderr, "%s: unable to create '%s': %s\n", program_name,
+ file_name, strerror(errno));
+ free(file_name);
+ return false;
+ }
+ fprintf(out, "name %s\n", troff_name);
+ if (!strcmp(char_map->encoding, "adobe-fontspecific"))
+ fprintf(out, "special\n");
+ if (charExists(fi, ' ')) {
+ int w = charWidth(fi, ' ');
+ if (w > 0)
+ fprintf(out, "spacewidth %d\n", w);
+ }
+ fprintf(out, "charset\n");
+ for (c = fi->min_char_or_byte2; c <= fi->max_char_or_byte2; c++) {
+ const char *name = DviCharName(char_map, c, 0);
+ if (charExists(fi, c)) {
+ int param[5];
+
+ wid = charWidth(fi, c);
+
+ fprintf(out, "%s\t%d", name ? name : "---", wid);
+ param[0] = charHeight(fi, c);
+ param[1] = charDepth(fi, c);
+ param[2] = 0; /* charRBearing (fi, c) - wid */
+ param[3] = 0; /* charLBearing (fi, c) */
+ param[4] = 0; /* XXX */
+ for (j = 0; j < 5; j++)
+ if (param[j] < 0)
+ param[j] = 0;
+ for (j = 4; j >= 0; j--)
+ if (param[j] != 0)
+ break;
+ for (k = 0; k <= j; k++)
+ fprintf(out, ",%d", param[k]);
+ fprintf(out, "\t0\t0%o\n", c);
+
+ if (name) {
+ for (k = 1; DviCharName(char_map, c, k); k++) {
+ fprintf(out, "%s\t\"\n", DviCharName(char_map, c, k));
+ }
+ }
+ }
+ }
+ XUnloadFont(dpy, fi->fid);
+ fclose(out);
+ free(file_name);
+ return true;
+}
+
+static void usage(FILE *stream)
+{
+ fprintf(stream,
+ "usage: %s [-d destination-directory] [-r resolution]"
+ " [-s type-size] font-map\n"
+ "usage: %s {-v | --version}\n"
+ "usage: %s --help\n",
+ program_name, program_name, program_name);
+}
+
+int main(int argc, char **argv)
+{
+ char troff_name[1024];
+ char font_name[1024];
+ char line[1024];
+ char *a, *b, c;
+ FILE *map;
+ int opt;
+ static const struct option long_options[] = {
+ { "help", no_argument, 0, CHAR_MAX + 1 },
+ { "version", no_argument, 0, 'v' },
+ { NULL, 0, 0, 0 }
+ };
+
+ program_name = argv[0];
+
+ while ((opt = getopt_long(argc, argv, "d:gr:s:v", long_options,
+ NULL)) != EOF) {
+ switch (opt) {
+ case 'd':
+ destdir = strdup(optarg);
+ break;
+ case 'g':
+ /* unused; just for compatibility */
+ break;
+ case 'r':
+ sscanf(optarg, "%u", &resolution);
+ break;
+ case 's':
+ sscanf(optarg, "%u", &point_size);
+ break;
+ case 'v':
+ printf("GNU xtotroff (groff) version %s\n", Version_string);
+ xtotroff_exit(EXIT_SUCCESS);
+ break;
+ case CHAR_MAX + 1: /* --help */
+ usage(stdout);
+ xtotroff_exit(EXIT_SUCCESS);
+ break;
+ case '?':
+ usage(stderr);
+ xtotroff_exit(EXIT_FAILURE);
+ break;
+ }
+ }
+ if (argc - optind != 1) {
+ usage(stderr);
+ xtotroff_exit(EXIT_FAILURE);
+ }
+
+ dpy = XOpenDisplay(0);
+ if (!dpy) {
+ fprintf(stderr, "%s: fatal error: can't connect to the X server;"
+ " make sure the DISPLAY environment variable is set"
+ " correctly\n", program_name);
+ xtotroff_exit(EXIT_FAILURE);
+ }
+
+ map = fopen(argv[optind], "r");
+ if (NULL == map) {
+ fprintf(stderr, "%s: fatal error: unable to open map file '%s':"
+ " %s\n", program_name, argv[optind], strerror(errno));
+ xtotroff_exit(EXIT_FAILURE);
+ }
+
+ while (fgets(line, sizeof(line), map)) {
+ for (a = line, b = troff_name; *a; a++, b++) {
+ c = (*b = *a);
+ if (' ' == c || '\t' == c)
+ break;
+ }
+ *b = '\0';
+ while (*a && (' ' == *a || '\t' == *a))
+ ++a;
+ for (b = font_name; *a; a++, b++)
+ if ((*b = *a) == '\n')
+ break;
+ *b = '\0';
+ if (!MapFont(font_name, troff_name))
+ xtotroff_exit(EXIT_FAILURE);
+ }
+ xtotroff_exit(EXIT_SUCCESS);
+}
+
+// Local Variables:
+// fill-column: 72
+// mode: C
+// End:
+// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/test-groff.in b/test-groff.in
new file mode 100644
index 0000000..ff61767
--- /dev/null
+++ b/test-groff.in
@@ -0,0 +1,54 @@
+#! /bin/sh
+#
+# Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# This script runs groff without requiring that it be installed.
+
+SEP='@PATH_SEPARATOR@'
+builddir=@abs_top_builddir@
+srcdir=@abs_top_srcdir@
+
+GROFF_BIN_PATH=$builddir
+
+XENVIRONMENT=$srcdir/src/devices/xditview/GXditview.ad
+export XENVIRONMENT
+
+GROFF_COMMAND_PREFIX=
+GROFF_FONT_PATH=$builddir/font\
+$SEP$srcdir/font\
+
+GROFF_TMAC_PATH=$srcdir/tmac\
+$SEP$builddir/tmac\
+$SEP$srcdir/contrib/mom\
+$SEP$builddir/contrib/mom\
+$SEP$srcdir/contrib/hdtbl\
+$SEP$builddir/contrib/hdtbl\
+$SEP$srcdir/contrib/mm\
+$SEP$builddir/contrib/mm\
+$SEP$srcdir/contrib/mm/locale\
+$SEP$builddir/contrib/mm/locale\
+$SEP$srcdir/contrib/pdfmark\
+$SEP$builddir/contrib/pdfmark\
+$SEP$srcdir/contrib/rfc1345\
+$SEP$builddir/contrib/rfc1345\
+$SEP$srcdir/contrib/sboxes\
+$SEP$builddir/contrib/sboxes\
+
+export GROFF_BIN_PATH GROFF_COMMAND_PREFIX GROFF_FONT_PATH GROFF_TMAC_PATH
+
+exec $builddir/groff ${1+"$@"}
diff --git a/tmac/62bit.tmac b/tmac/62bit.tmac
new file mode 100644
index 0000000..f1a593e
--- /dev/null
+++ b/tmac/62bit.tmac
@@ -0,0 +1,203 @@
+.\" 62bit.tmac
+.\"
+.\" Copyright (C) 2003-2020 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 3 of the License, 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 this program. If not, see
+.\" <http://www.gnu.org/licenses/>.
+.\"
+.\"
+.\" This file provides macros for addition, multiplication, and division
+.\" of 62-bit signed integers. Its main application is to 'scale'
+.\" 31-bit values--namely, to perform the operation 'a * b / c'
+.\" accurately.
+.\"
+.\" Note that it is the duty of the user to check whether the input
+.\" values fit within 31 bits (this is the range
+.\" [-1073741824,1073741823]).
+.\"
+.
+.do nr *groff_62bit_tmac_C \n[.cp]
+.cp 0
+.
+.if d add31to62 \
+. nx
+.
+.
+.\" .add31to62 <x> <y> <z>
+.\"
+.\" Add a 31-bit signed integer to a signed 62-bit integer. Result is a
+.\" signed 62-bit integer:
+.\"
+.\" <x> + (<y>h * 2^30 + <y>l) = <z>h * 2^30 + <z>l
+.\"
+.\"
+.\" in: \n[<x>], \n[<y>h], \n[<y>l]
+.\"
+.\" out: \n[<z>h], \n[<z>l]
+.\"
+.\" Example: .add31to62 p q r
+.\"
+.\" -> input registers: \n[p], \n[qh], \n[ql]
+.\" output registers: \n[rh], \n[rl]
+.\"
+.de1 add31to62
+. nr 62bit-lo2 (\\n[\\$2l])
+. nr 62bit-hi2 (\\n[\\$2h])
+.
+. nr 62bit-i ((\\n[\\$1] + \\n[62bit-lo2]) / 1073741824)
+. nr \\$3l ((\\n[\\$1] + \\n[62bit-lo2]) % 1073741824)
+.
+. ie ((\\n[62bit-lo2] > 0) & (\\n[\\$3l] < 0)) \{\
+. nr \\$3l +1073741824
+. nr 62bit-i -1
+. \}
+. el \
+. if ((\\n[62bit-lo2] < 0) & (\\n[\\$3l] > 0)) \{\
+. nr \\$3l -1073741824
+. nr 62bit-i +1
+. \}
+.
+. nr \\$3h (\\n[62bit-hi2] + \\n[62bit-i])
+..
+.
+.
+.\" .mult31by31 <x> <y> <z>
+.\"
+.\" Multiply two 31-bit signed integers. Result is a 62-bit signed
+.\" integer:
+.\"
+.\" <x> * <y> = <z>h * 2^30 + <z>l
+.\"
+.\"
+.\" in: \n[<x>], \n[<y>]
+.\"
+.\" out: \n[<z>h], \n[<z>l]
+.\"
+.\" Example: .mult31by31 a b c
+.\"
+.\" -> input registers: \n[a], \n[b]
+.\" output registers: \n[ch], \n[cl]
+.\"
+.de1 mult31by31
+. nr 62bit-1 (\\n[\\$1])
+. nr 62bit-2 (\\n[\\$2])
+.
+. nr 62bit-sign 1
+. if !\\n[62bit-1] \{\
+. nr 62bit-sign -(\\n[62bit-sign])
+. nr 62bit-1 -(\\n[62bit-1])
+. \}
+. if !\\n[62bit-2] \{\
+. nr 62bit-sign -(\\n[62bit-sign])
+. nr 62bit-2 -(\\n[62bit-2])
+. \}
+.
+. nr 62bit-lo1 (\\n[62bit-1] % 32768)
+. nr 62bit-hi1 (\\n[62bit-1] / 32768)
+. nr 62bit-lo2 (\\n[62bit-2] % 32768)
+. nr 62bit-hi2 (\\n[62bit-2] / 32768)
+.
+. nr 62bit-lo3 (\\n[62bit-lo1] * \\n[62bit-lo2] % 1073741824)
+. nr 62bit-i1 (\\n[62bit-lo1] * \\n[62bit-hi2] % 1073741824)
+. nr 62bit-i2 (\\n[62bit-lo2] * \\n[62bit-hi1] % 1073741824)
+. nr 62bit-hi3 (\\n[62bit-hi1] * \\n[62bit-hi2] % 1073741824)
+.
+. nr 62bit-i1 (\\n[62bit-i1] + \\n[62bit-i2] % 1073741824)
+. \" check carry overflow of 62bit-i1 + 62bit-i2
+. if (\\n[62bit-i1] < \\n[62bit-i2]) \
+. nr 62bit-hi3 +32768
+.
+. nr 62bit-hi3 +(\\n[62bit-i1] / 32768)
+. \" multiply by 32768 in small steps to avoid overflow
+. nr 62bit-i 16 1
+. while \\n-[62bit-i] \
+. nr 62bit-i1 (\\n[62bit-i1] * 2 % 1073741824)
+.
+. nr 62bit-lo3 (\\n[62bit-lo3] + \\n[62bit-i1] % 1073741824)
+. \" check carry overflow of 62bit-i1 + lo
+. if (\\n[62bit-lo3] < \\n[62bit-i1]) \
+. nr 62bit-hi3 +1
+.
+. if !\\n[62bit-sign] \{\
+. nr 62bit-lo3 -(\\n[62bit-lo3])
+. nr 62bit-hi3 -(\\n[62bit-hi3])
+. \}
+. nr \\$3l \\n[62bit-lo3]
+. nr \\$3h \\n[62bit-hi3]
+..
+.
+.
+.\" .div62by31 <x> <y> <z>
+.\"
+.\" Divide a signed 62-bit integer by a 31-bit integer. Result is a
+.\" 31-bit signed integer:
+.\"
+.\" (<x>h * 2^30 + <x>l) / <y> = <z>
+.\"
+.\"
+.\" in: \n[<x>h], \n[<x>l], \n[<y>]
+.\"
+.\" out: \n[<z>]
+.\"
+.\" Example: .div62by31 foo bar baz
+.\"
+.\" -> input registers: \n[fooh] \n[fool] \n[bar]
+.\" output register: \n[baz]
+.\"
+.de1 div62by31
+. nr 62bit-lo1 \\n[\\$1l]
+. nr 62bit-hi1 \\n[\\$1h]
+. nr 62bit-2 \\n[\\$2]
+. nr 62bit-3 0
+.
+. nr 62bit-sign 1
+. if ((\\n[62bit-lo1] < 0) : (\\n[62bit-hi1] < 0)) \{\
+. nr 62bit-sign -(\\n[62bit-sign])
+. nr 62bit-lo1 -(\\n[62bit-lo1])
+. nr 62bit-hi1 -(\\n[62bit-hi1])
+. \}
+. if !\\n[62bit-2] \{\
+. nr 62bit-sign -(\\n[62bit-sign])
+. nr 62bit-2 -(\\n[62bit-2])
+. \}
+.
+. nr 62bit-i 31 1
+. while \\n-[62bit-i] \{\
+. nr 62bit-hi1 (\\n[62bit-hi1] * 2 % 1073741824)
+. nr 62bit-3 (\\n[62bit-3] * 2)
+. nr 62bit-hi1 +(\\n[62bit-lo1] / 536870912)
+.
+. if (\\n[62bit-hi1] >= \\n[62bit-2]) \{\
+. nr 62bit-hi1 -\\n[62bit-2]
+. nr 62bit-3 +1
+. \}
+. nr 62bit-lo1 (\\n[62bit-lo1] * 2 % 1073741824)
+. \}
+.
+. if !\\n[62bit-sign] \
+. nr 62bit-3 -(\\n[62bit-3])
+. nr \\$3 \\n[62bit-3]
+..
+.
+.cp \n[*groff_62bit_tmac_C]
+.do rr *groff_62bit_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/LOCALIZATION b/tmac/LOCALIZATION
new file mode 100644
index 0000000..b322a43
--- /dev/null
+++ b/tmac/LOCALIZATION
@@ -0,0 +1,60 @@
+Localization
+------------
+
+The localization process involves two groff files and zero or more
+hyphenation pattern files.
+
+1. A locale-dependent file (for example, fr.tmac for French) does one
+ or several of the following.
+
+ A. A string identifying the groff locale (e.g., "english") is set.
+ B. Locale-specific strings used by macro packages are (re)defined.
+ C. Other tweaks to macro package configuration are performed, such
+ as altering the ordering of the components of a date string.
+ D. Additional inter-sentence space is set to a language-appropriate
+ amount with the .ss request.
+ E. A hyphenation mode appropriate to the hyphenation pattern files
+ for the locale is set with the .hy request. Here's a mapping
+ from TeX hyphenation pattern minimums to groff hyphenation
+ modes.
+ \lefthyphenmin=2, \righthyphenmin=2 => 1
+ \lefthyphenmin=2, \righthyphenmin=3 => 4
+ \lefthyphenmin=1, \righthyphenmin=2 => 32
+ F. Hyphenation codes appropriate to the hyphenation pattern files
+ for the locale are set with the .hcode request.
+ G. The hyphenation language is set with the .hla request.
+ H. Support for the character encoding used by the hyphenation
+ pattern files is loaded with the .mso request.
+ I. Hyphenation pattern and exception files are loaded with the .hpf
+ and .hpfa requests.
+
+2. A locale-independent file (trans.tmac) activates the localized
+ strings set up in item B above.
+
+See the groff Texinfo manual in doc/groff.texi for descriptions of the
+requests referred to above.
+
+Localization files are named using ISO 639-1 language identifiers.
+Further specialization of locales by ISO 3166 territory codes is
+tentatively planned as of groff 1.23.0, awaiting expressions of demand.
+
+After 'trans.tmac' has been loaded, you must redefine the date strings
+in order to use the day and month names translated earlier. The date
+format also may need to be changed.
+
+- If the locale's date format is MM/DD/YYYY, use the following.
+
+ for ms: .ds DY \*[MO] \n[dy] \n[year]\"
+ for mm: .ds cov*new-date \\*[MO\\n[mo]] \\n[dy] \\n[year]\"
+ for me: .ds td \*(mo \n(dy \n(y4\"
+
+- If the locale's date format is DD/MM/YYYY, use the following.
+
+ for ms: .ds DY \n[dy] \*[MO] \n[year]\"
+ for mm: .ds cov*new-date \\n[dy] \\*[MO\\n[mo]] \\n[year]\"
+ for me: .ds td \n(dy \*(mo \n(y4\"
+
+Other date formats can be handled similarly.
+
+Note: For the mm package, in the 'ISODATE' macro, only the first
+definition of 'cov*new-date' must be changed (see 'fr.tmac').
diff --git a/tmac/TESTING-HINTS b/tmac/TESTING-HINTS
new file mode 100644
index 0000000..6e21564
--- /dev/null
+++ b/tmac/TESTING-HINTS
@@ -0,0 +1,19 @@
+Here are some hints about testing modifications to macro packages and
+manual pages.
+
+1. Use groff's '-ww' option to catch potential problems.
+ Ideally, there shouldn't be any warnings.
+
+2. For a well-formedness check, run doclifter (http://catb.org/~esr/doclifter)
+ against your page. This tool was written to lift pages to XML, but as a
+ side effect it acts as a validator that will warn you of potential problems
+ and non-portable constructs.
+
+3. The two most important groff client types are X terminal emulators
+ and Postscript printers. Eyeball-check your output under both.
+
+4. The colorized man output of the Midnight Commander (what you get by
+ pressing the F3 key on a man page) is good for making small errors
+ more visible.
+
+5. Try different terminal line lengths, say, 80 and 100 characters.
diff --git a/tmac/TODO b/tmac/TODO
new file mode 100644
index 0000000..89da313
--- /dev/null
+++ b/tmac/TODO
@@ -0,0 +1,36 @@
+Support multiple line-spacing.
+
+If we have footnotes in the abstract in RP format, then the footnote
+will appear on the cover sheet, which it should, but also on the first
+page, which it should not.
+
+Should we allow multi-page cover-sheets?
+
+Warn about automatically numbered footnotes in floating keeps.
+
+When we bring back the footnote overflow at the top of page, it would
+be more efficient to avoid diverting it again. (Need to keep track of
+footnote height.)
+
+Possibly have a place above which the footnote trap must not be
+placed.
+
+Improved indexing, not using tm, controlled by string variable (e.g.,
+-dIDX=file.idx).
+
+When changing from multi-column to narrower columns, we could avoid
+doing a @super-eject. (This might not be a good idea.)
+
+Think about cutmarks. Possibly implement CM.
+
+Implement thesis Mode (TM, CT).
+
+Implement more V10 features.
+
+Should this
+
+.LP
+.rs
+.sp \n(.tu
+
+print two pages?
diff --git a/tmac/X.tmac b/tmac/X.tmac
new file mode 100644
index 0000000..31fb20c
--- /dev/null
+++ b/tmac/X.tmac
@@ -0,0 +1,136 @@
+.\" X.tmac
+.\"
+.do nr *groff_X_tmac_C \n[.cp]
+.cp 0
+.ftr CW CR
+.ftr C CR
+.ftr CO CI
+.ftr CX CBI
+.ftr H HR
+.ftr HO HI
+.ftr HX HBI
+.ftr NX NBI
+.char \[ru] \D'l .5m 0'
+.char \[ul] \v'.25m'\D'l .5m 0'\v'-.25m'
+.char \[br] \v'.25m'\D'l 0 -1m'\v'.75m'
+.char \[rn] \v'-.75m'\D'l .5m 0'\v'.75m'
+.char \[or] \h'.1m'\Z'\D'l 0 -.675m''\h'.1m'
+.char ~ \v'-.55m'\s[\En(.s/2u]\v'.2m'\[ti]\v'-.2m'\s0\v'.55m'
+.char ^ \v'-.55m'\s[\En(.s/2u]\v'.3m'\[ha]\v'-.3m'\s0\v'.55m'
+.fchar \[va] \o'\[ua]\[da]'
+.fchar \[em] \v'-.25m'\h'.05m'\D'l .9m 0'\h'0.05m'\v'.25m'
+.fchar \[en] \-
+.fchar \[fi] fi
+.fchar \[fl] fl
+.fchar \[ff] ff
+.fchar \[Fi] f\[fi]
+.fchar \[Fl] f\[fl]
+.fchar \[ci] \v'-.25m'\h'.05m'\D'c .5m'\h'.05m'\v'.25m'
+.fchar \[sq] \h'.05m'\D'l .5m 0'\D'l 0 -.5m'\D'l -.5m 0'\D'l 0 .5m'\h'.55m'
+.fchar \[ga] \Z'\v'-.7m'\D'l .22m .18m''\h'.33m'
+.fchar \[dg] \Z'\h'.25m'\v'.15m'\D'l 0 -.8m'\v'.2m'\h'-.195m'\
+\D'l .39m 0''\h'.5m'
+.fchar \[dd] \Z'\h'.25m'\v'.15m'\D'l 0 -.8m'\v'.2m'\h'-.195m'\
+\D'l .39m 0'\v'.4m'\D'l -.39m 0''\h'.5m'
+.fchar \[lq] \[dq]
+.fchar \[rq] \[dq]
+.fchar \[Bq] ,,
+.fchar \[OE] O\h'-.25m'E
+.fchar \[oe] o\h'-.14m'e
+.fchar \[ah] \v'-.55m'\s[\En[.s]/2u]v\s0\v'.55m'
+.fchar \[ao] \v'-.55m'\s[\En[.s]*6u/10u]\D'c .25m'\s0\v'.55m'
+.fchar \[ho] \s[\En[.s]/2u]\v'.4m'c\v'-.4m'\s0
+.fchar \[lh] \[lA]
+.fchar \[rh] \[rA]
+.fchar \[bq] ,
+.fchar \[IJ] IJ
+.fchar \[ij] ij
+.fchar \[fo] <
+.fchar \[fc] >
+.fchar \[OK] \s[\En[.s]*6u/10u]\[rs]\s[0]/
+.
+.fchar \[<<] <\h'-.3m'<
+.fchar \[>>] >\h'-.3m'>
+.fchar \[|=] \v'.1m'\Z'\[mi]'\v'-.2m'\[ap]\v'.1m'
+.fchar \[nc] \v'.1m'\Z'\h'.2m'\F[T]\f[R]/'\v'-.1m'\[sp]
+.fchar \[ne] \v'.07m'\Z'\h'.2m'\F[T]\f[R]/'\v'-.07m'\[==]
+.fchar \[-h] \F[T]\f[I]\v'-.58m'\Z'\h'.1m'\D'l .3m 0''\v'.58m'h
+.fchar \[hbar] \[-h]
+.
+.de X-achar
+. \" Note that character definitions are always interpreted with
+. \" compatibility mode off.
+. fchar \\$1 \
+\\$3\
+\k[acc]\
+\h'(u;-\w'\\$2'-\w'\\$3'/2+\\En[skw]+(\w'x'*0)-\\En[skw])'\
+\v'(u;\w'x'*0+\\En[rst]+(\w'\\$3'*0)-\\En[rst])'\
+\\$2\
+\v'(u;\w'x'*0-\\En[rst]+(\w'\\$3'*0)+\\En[rst])'\
+\h'|\\En[acc]u'
+. hcode \\$1\\$4
+..
+.
+.X-achar \['C] \' C c
+.X-achar \['c] \' c c
+.X-achar \[:Y] \[ad] Y y
+.
+.fchar \[S ,] \o'S\[ac]'
+.hcode \[S ,]s
+.fchar \[s ,] \o's\[ac]'
+.hcode \[s ,]s
+.
+.de X-frac
+. schar \[\\$1\\$2] \
+\v'-.28m'\s[\\En[.s]*6u/10u]\\$1\s0\v'.28m'\
+\h'-.1m'\[f/]\h'-.1m'\
+\s[\\En[.s]*6u/10u]\\$2
+..
+.
+.de X-frac-mono
+. fschar \\$1 \[\\$2\\$3] \
+\Z'\v'-.28m'\s[\\En[.s]*5u/10u]\\$2\s0\v'.28m''\
+\Z'\h'0.25m'\[f/]'\
+\Z'\h'.35m'\s[\\En[.s]*5u/10u]\\$3\s0'\
+\h'\w'M'u'
+..
+.
+.X-frac 1 8
+.X-frac 3 8
+.X-frac 5 8
+.X-frac 7 8
+.
+.X-frac-mono CR 1 8
+.X-frac-mono CR 3 8
+.X-frac-mono CR 5 8
+.X-frac-mono CR 7 8
+.X-frac-mono CI 1 8
+.X-frac-mono CI 3 8
+.X-frac-mono CI 5 8
+.X-frac-mono CI 7 8
+.X-frac-mono CB 1 8
+.X-frac-mono CB 3 8
+.X-frac-mono CB 5 8
+.X-frac-mono CB 7 8
+.X-frac-mono CBI 1 8
+.X-frac-mono CBI 3 8
+.X-frac-mono CBI 5 8
+.X-frac-mono CBI 7 8
+.
+.if '\*[.T]'X100' \
+. char \[radicalex] \h'-\w'\[sr]'u'\[radicalex]\h'\w'\[sr]'u'
+.fchar \[sqrtex] \[radicalex]
+.
+.ie '\[char97]'a' \
+. mso latin1.tmac
+.el \
+. mso cp1047.tmac
+.
+.cp \n[*groff_X_tmac_C]
+.do rr *groff_X_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/Xps.tmac b/tmac/Xps.tmac
new file mode 100644
index 0000000..aaef0ce
--- /dev/null
+++ b/tmac/Xps.tmac
@@ -0,0 +1,65 @@
+.\" Xps.tmac
+.\"
+.do nr *groff_Xps_tmac_C \n[.cp]
+.cp 0
+.
+.mso ps.tmac
+.
+.\" Use this macro only to replace characters which do really exist in
+.\" the devps font definition files.
+.de Xps-char
+. char \\$1 \Z"\X'ps: invis'\\$2\X'ps: endinvis'"\\$1
+..
+.
+.Xps-char \[bu] \f[S]\[bu]
+.Xps-char \[f/] \f[S]\[f/]
+.Xps-char \[em] "\v'-.25m'\h'.05m'\D'l .9m 0'\h'.05m'"
+.Xps-char \[aq] '
+.Xps-char \[bq] ,
+.Xps-char \[Bq] ,,
+.Xps-char \[lq] ``
+.Xps-char \[rq] ''
+.Xps-char \[OE] OE
+.Xps-char \[oe] oe
+.Xps-char \[Fn] \f[S]\[Fn]
+.Xps-char \[vS] \o'\[ah]S'
+.Xps-char \[vs] \o'\[ah]s'
+.Xps-char \[vZ] \o'\[ah]Z'
+.Xps-char \[vz] \o'\[ah]z'
+.Xps-char \[/L] \o'/L'
+.Xps-char \[/l] \o'/l'
+.Xps-char \[:Y] \o'\[ad]Y'
+.Xps-char \[a"] \[sd]
+.Xps-char \[a.] \v'-.6m'.
+.Xps-char \[ga] "\Z'\v'-.7m'\D'l .22m .18m''"
+.Xps-char \[ab] \v'-.55m'\s[\En[.s]*6u/10u]u\s[0]
+.Xps-char \[ah] \v'-.55m'\s[\En[.s]/2u]v\s[0]
+.Xps-char \[ao] "\v'-.55m'\s[\En[.s]*6u/10u]\D'c .25m'\s[0]"
+.Xps-char \[ho] \s[\En[.s]/2u]\v'.4m'c\s[0]
+.Xps-char \[.i] i
+.Xps-char \[fo] <
+.Xps-char \[fc] >
+.Xps-char \[OK] \s[\En[.s]*6u/10u]\[rs]\s[0]/
+.Xps-char \[tm] \v'-.3m'\s[\En[.s]*6u/10u]TM\s[0]
+.Xps-char \[dd] "\Z'\h'.25m'\v'.15m'\D'l 0 -.8m'\v'.2m'\h'-.195m'\
+\D'l .39m 0'\v'.4m'\D'l -.39m 0''"
+.Xps-char \[dg] "\Z'\h'.25m'\v'.15m'\D'l 0 -.8m'\v'.2m'\h'-.195m'\
+\D'l .39m 0''"
+.Xps-char \[en] \-
+.Xps-char \[%0] %\s[\En[.s]*6u/10u]\f[I]0
+.Xps-char \[lh] \[lA]
+.Xps-char \[rh] \[rA]
+.
+.ie '\[char97]'a' \
+. mso latin1.tmac
+.el \
+. mso cp1047.tmac
+.
+.cp \n[*groff_Xps_tmac_C]
+.do rr *groff_Xps_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/an-ext.tmac b/tmac/an-ext.tmac
new file mode 100644
index 0000000..5035bb2
--- /dev/null
+++ b/tmac/an-ext.tmac
@@ -0,0 +1,205 @@
+.\" groff extension macros for man(7) package
+.\"
+.\" Copyright (C) 2007-2022 Free Software Foundation, Inc.
+.\"
+.\" Written by Eric S. Raymond <esr@thyrsus.com>
+.\" Werner Lemberg <wl@gnu.org>
+.\" G. Branden Robinson <g.branden.robinson@gmail.com>
+.\"
+.\" You may freely use, modify and/or distribute this file.
+.\"
+.\" The code below provides extension macros for the 'man' macro
+.\" package. Care has been taken to make the code portable; groff
+.\" extensions are properly hidden so that all troff implementations can
+.\" use it without changes.
+.\"
+.\" With groff, this file is sourced by the 'man' macro package itself.
+.\" Man page authors who are concerned about portability might add the
+.\" used macros directly to the prologue of the man page(s).
+.
+.
+.\" Convention: Auxiliary macros and registers start with 'm' followed
+.\" by an uppercase letter or digit.
+.
+.\" Setting the `mG` register to a positive value (e.g., on the command
+.\" line) enables usage of macros defined here that have alternative
+.\" definitions in the main groff man macro file. This is for testing.
+.\" The logic uses subtraction due to frustrating, AT&T troff-compatible
+.\" limitations on the '!' operator.
+.
+.
+.\" Protect against being sourced twice.
+.nr mZ +1
+.if \n(mZ>1 \
+. nx
+.
+.\" Define this to your implementation's constant-width typeface.
+.ds mC CW
+.if n .ds mC R
+.
+.\" Save the automatic hyphenation mode.
+.\"
+.\" In AT&T troff, there was no register exposing the hyphenation mode,
+.\" and no way to save and restore it. Set `mH` to a reasonable value
+.\" for your implementation and preference.
+.de mY
+. ie !\\n(.g \
+. nr mH 14
+. el \
+. do nr mH \\n[.hy] \" groff extension register
+..
+.
+.nr mS 0 \" in a synopsis (SY/YS)?
+.nr mE 0 \" in an example (EX/EE)?
+.
+.
+.\" Declare start of command synopsis. Sets up hanging indentation.
+.de SY
+. ie !\\n(mS \{\
+. mY
+. nh
+. nr mS 1
+. nr mA \\n(.j
+. ad l
+. nr mI \\n(.i
+. \}
+. el \{\
+. br
+. ns
+. \}
+.
+. nr mT \w'\fB\\$1\fP\ '
+. HP \\n(mTu
+. rr mT
+. B "\\$1"
+..
+.
+.
+.\" End of command synopsis. Restores adjustment.
+.de YS
+. in \\n(mIu
+. ad \\n(mA
+. hy \\n(mH
+. rr mA
+. rr mI
+. nr mS 0
+..
+.
+.
+.\" Prepare link text for mail/web hyperlinks. `MT` and `UR` call this.
+.de mV
+. ds m1 \\$1\"
+..
+.
+.
+.\" Emit hyperlink. The optional argument supplies trailing punctuation
+.\" after link text. `ME` and `UE` call this.
+.de mQ
+. mY
+. nh
+<\\*(m1>\\$1
+. hy \\n(mH
+..
+.
+.
+.\" Start URL.
+.if \n(.g-\n(mG \{\
+.de UR
+. mV \\$1
+..
+.\}
+.
+.
+.\" End URL.
+.if \n(.g-\n(mG \{\
+.de UE
+. mQ \\$1
+..
+.\}
+.
+.
+.\" Start email address.
+.if \n(.g-\n(mG \{\
+.de MT
+. mV \\$1
+..
+.\}
+.
+.
+.\" End email address.
+.if \n(.g-\n(mG \{\
+.de ME
+. mQ \\$1
+..
+.\}
+.
+.
+.\" Set a man page cross reference.
+.\" .MR page-topic page-section [trailing-text]
+.if \n(.g-\n(mG \{\
+.de MR
+. mY
+. nh
+. ie \\n(.$=1 \
+. I \\$1
+. el \
+. IR \\$1 (\\$2)\\$3
+. hy \\n(mH
+..
+.\}
+.
+.
+.\" Continuation line for .TP header.
+.de TQ
+. br
+. ns
+. TP \\$1\" no doublequotes around argument!
+..
+.
+.
+.\" Start example.
+.if \n(.g-\n(mG \{\
+.de EX
+. br
+. if !\\n(mE \{\
+. nr mF \\n(.f
+. nr mP \\n(PD
+. nr PD 1v
+. nf
+. ft \\*(mC
+. nr mE 1
+. \}
+..
+.\}
+.
+.
+.\" End example.
+.if \n(.g-\n(mG \{\
+.de EE
+. br
+. if \\n(mE \{\
+. ft \\n(mF
+. nr PD \\n(mP
+. fi
+. nr mE 0
+. \}
+..
+.\}
+.
+.
+.\" Start display.
+.de DS
+. \" XXX to be written
+..
+.
+.
+.\" End display.
+.de DE
+. \" XXX to be written
+..
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/an.tmac b/tmac/an.tmac
new file mode 100644
index 0000000..9e38ba5
--- /dev/null
+++ b/tmac/an.tmac
@@ -0,0 +1,1574 @@
+.\" groff implementation of man(7) package
+.\"
+.\" Copyright (C) 1989-2023 Free Software Foundation, Inc.
+.\" Written by James Clark (jjc@jclark.com)
+.\" Enhanced by: Werner Lemberg <wl@gnu.org>
+.\" Larry Kollar <kollar@alltel.net>
+.\" G. Branden Robinson <g.branden.robinson@gmail.com>
+.\"
+.\" Thanks to Deri James for illustrating PDF bookmark features.
+.\"
+.\" 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 3 of the License, 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 this program. If not, see
+.\" <http://www.gnu.org/licenses/>.
+.
+.
+.\" Put site additions in the file man.local, loaded near the end of
+.\" this file. To add things to TH, use '.am1 TH'.
+.
+.if !\n(.g \
+. ab groff man macros require groff extensions; aborting
+.
+.do if d TH .nx
+.
+.do nr *groff_an_tmac_C \n[.cp]
+.cp 0
+.
+.\" Package-internal names start with "an-" and are subject to change,
+.\" such as migration to "an*" (in progress).
+.
+.\" Define a string for use in diagnostic messages.
+.ds an an.tmac\"
+.
+.\" We use the .stringup request from groff 1.23, but nothing breaks if
+.\" it is undefined; the output is unchanged in appearance from earlier
+.\" releases.
+.if (\n[.x]\n[.y] < 118) \{\
+. ds an-msg \*[an]: groff man macros require groff 1.18 or later,\"
+. as an-msg " but found groff \n[.x].\n[.y]; aborting\"
+. ab \*[an-msg]
+.\}
+.
+.\" === Define macros. ===
+.\"
+.\" Macros that are part of the external interface (TH, SH, P, etc.) or
+.\" that are called by traps of any kind must be defined with `de1`
+.\" because they might be called from a context where compatibility mode
+.\" is enabled. For other macros, `de` suffices.
+.
+.de an-warn
+. tm \*[an]:\\n[.F]:\\n[.c]: warning: \\$*
+..
+.
+.de an-style-warn
+. if \\n[CHECKSTYLE] \
+. tm \*[an]:\\n[.F]:\\n[.c]: style: \\$*
+..
+.
+.de an-deprecation-warn
+. if (\\n[CHECKSTYLE] > 1) \
+. an-style-warn use of deprecated macro: .\\$0
+..
+.
+.de1 an-blank-line-trap
+. if (\\n[CHECKSTYLE] > 2) \
+. an-style-warn blank line in input
+. sp
+..
+.
+.de1 an-leading-space-trap
+. if (\\n[CHECKSTYLE] > 2) \
+. if \\n[.u] \
+. an-style-warn \\n[lsn] leading space(s) on input line
+. br
+. nop \h'\\n[lss]u'\c
+..
+.
+.\" Define alternate requests to handle continuous rendering.
+.\"
+.\" This .ne replacement avoids page breaks; instead, the page length is
+.\" increased to the necessary amount.
+.de an-ne
+. ie \\n[.$] .nr an-amount (v;\\$*)
+. el .nr an-amount 1v
+. if (\\n[an-amount] >= \\n[.t]) \
+. pl +(\\n[an-amount]u - \\n[.t]u + 1v)
+. rr an-amount
+..
+.
+.\" This .bp replacement for continuous rendering mode adjusts the page
+.\" length to the current position so that no empty lines are inserted.
+.de an-bp
+. pl \\n[nl]u
+..
+.
+.\" We need an end-of-input macro to flush any pending output line and
+.\" write the footer for the final man page rendered. We can also be
+.\" called by andoc when switching to an mdoc(7) page, irrespective of
+.\" continuous rendering mode.
+.de1 an-end
+. if !r an-TH-was-called .return
+. if \\n[cR] \{\
+. \" We might have a pending output line that is not yet broken, and
+. \" also be 1v from the bottom of the page. If we break (or flush)
+. \" the output line now, the page will get ejected afterward and
+. \" troff will exit because we're in an end-of-input macro--our
+. \" footer will never be output. So, if that is the case, further
+. \" extend the page length by 1v.
+. if ((\\n[.p] - \\n[nl]) <= \\n[.V]) .pl +1v
+. br
+. pl +1v
+. sp 1v
+. an-footer
+. \" If we're processing multiple documents and have started a new
+. \" one, draw a line between this footer and the next header.
+. if !'\\n[.F]'' \{\
+. pl +1v
+. nf
+. ti 0
+. nop \D'l \\n[LL]u 0'
+. fi
+. \}
+. \}
+. rr an-TH-was-called
+. ch an-header
+. an*break-page-with-new-number
+..
+.
+.\" Move macros into place for continuous rendering.
+.de an-set-up-continuous-rendering
+. rn ne an-real-ne
+. rn bp an-real-bp
+. rn an-ne ne
+. rn an-bp bp
+. em an-end
+..
+.
+.de an*reset-hyphenation-mode
+. ie \\n[HY] \{\
+. \" No page breaks occur in continuous rendering.
+. ie \\n[cR] \
+. nr an*hyphenation-mode \\n[\\*[locale]*hyphenation-mode-base]
+. el \
+. nr an*hyphenation-mode \\n[\\*[locale]*hyphenation-mode-trap]
+. \}
+. el \
+. nr an*hyphenation-mode 0
+. hy \\n[an*hyphenation-mode]
+..
+.
+.de an-reset-tab-stops
+. ta T .5i
+..
+.
+.de an-reset-paragraph-spacing
+. ie \\n[.$] .nr PD (v;\\$1)
+. el .nr PD (.4v >? \n[.V])
+..
+.
+.de an-reset-margin-and-inset-level
+. nr an-inset-level 1
+. nr an-margin \\n[IN]
+. nr an-saved-margin1 \\n[IN]
+. nr an-prevailing-indent \\n[IN]
+. nr an-saved-prevailing-indent1 \\n[IN]
+..
+.
+.\" Break the page and update its number depending on the C (consecutive
+.\" numbering) register.
+.\"
+.\" Corner case: if formatting multiple documents and P (starting page
+.\" number) is defined but C is not set, start numbering each document
+.\" at \n[P]. Not strictly necessary if not switching macro packages.
+.de an*break-page-with-new-number
+. ie \\n[C] .bp (\\n[%] + 1) \" argument NOT redundant before page 1
+. el \{\
+. ie r P .bp \\n[P]
+. el .bp 1
+. \}
+..
+.
+.\" Localize manual section titles for English.
+.de an*localize-strings
+. ds an*section1 General Commands Manual\"
+. ds an*section2 System Calls Manual\"
+. ds an*section3 Library Functions Manual\"
+. ds an*section4 Kernel Interfaces Manual\"
+. ds an*section5 File Formats Manual\"
+. ds an*section6 Games Manual\"
+. ds an*section7 Miscellaneous Information Manual\"
+. ds an*section8 System Manager's Manual\"
+. ds an*section9 Kernel Developer's Manual\"
+..
+.
+.\" Write a bookmark/anchor/link target $2 at hierarchical depth $1.
+.de an*bookmark
+. if \\n[an*is-output-pdf] .pdfbookmark \\$1 \\$2
+..
+.
+.\" Begin man page.
+.\" .TH topic section[ extra1[ extra2[ extra3]]]
+.de1 TH
+. if ((\\n[.$] < 2) : (\\n[.$] > 5)) \
+. an-style-warn .\\$0 expects 2 to 5 arguments, got \\n[.$]
+.
+. blm an-blank-line-trap
+. lsm an-leading-space-trap
+.
+. \" If batch processing (rendering multiple) man page documents, we
+. \" must handle the end of a previous document.
+. if \\n[an*need-titles-reset] \{\
+. if \\n[cR] .an-end
+.
+. \" Clear the page header trap so it is not sprung with stale
+. \" information.
+. ch an-header
+. an*break-page-with-new-number
+. \}
+. if \\n[C] .rr P
+.
+. nr an-TH-was-called 1 \" an-end can make certain assumptions.
+.
+. \" Set up rendering parameters. We do this in TH instead of only
+. \" once when initializing the package because when rendering multiple
+. \" pages, a previous page might have changed them.
+.
+. fam \\*[an*body-family]
+. ft R
+.
+. nr PS 10z \" default type size
+. nr PS-SS 10z
+. nr PS-SH 10.95z
+. nr VS 12p
+.
+. \" use sizes similar to LaTeX
+. if t \{\
+. ie (\\n[S] == 11) \{\
+. nr PS 10.95z
+. nr PS-SS 10.95z
+. nr PS-SH 12z
+. nr VS 13.6p
+. \}
+. el \{\
+. if (\\n[S] == 12) \{\
+. nr PS 12z
+. nr PS-SS 12z
+. nr PS-SH 14.4z
+. nr VS 14.5p
+. \}
+. \}
+. \}
+.
+. \" The previous document rendered in a batch may have been in a
+. \" different language. If this one is in English, (re-)init strings.
+. if '\\*[locale]'english' .an*localize-strings
+.
+. ps \\n[PS]u
+. vs \\n[VS]u
+. ad \\*[AD]
+. ll \\n[LL]u
+.
+. \" We've seen no tbl(1) tables yet in this document.
+. rr TW
+. nr an-was-tbl-failure-reported 0
+.
+. an*reset-hyphenation-mode
+. an-reset-tab-stops
+. an-reset-paragraph-spacing
+. an-reset-margin-and-inset-level
+.
+. nr an-tag-separation 1n
+. nr an-need-no-space-mode 0
+. nr an-need-break 0
+. nr an-is-in-diversion 0
+. nr an*is-in-example 0
+.
+. ds an*topic "\\$1\"
+. if \\n[CT] .stringup an*topic
+. ds an*section "\\$2\"
+. ie (\\n[.$] > 4) .ds an-extra3 "\\$5\"
+. el \{\
+. \" Simulate switch/case in roff.
+. ie '\\$2'1' .ds an-extra3 \\*[an*section1]\"
+. el \{.ie '\\$2'2' .ds an-extra3 \\*[an*section2]\"
+. el \{.ie '\\$2'3' .ds an-extra3 \\*[an*section3]\"
+. el \{.ie '\\$2'4' .ds an-extra3 \\*[an*section4]\"
+. el \{.ie '\\$2'5' .ds an-extra3 \\*[an*section5]\"
+. el \{.ie '\\$2'6' .ds an-extra3 \\*[an*section6]\"
+. el \{.ie '\\$2'7' .ds an-extra3 \\*[an*section7]\"
+. el \{.ie '\\$2'8' .ds an-extra3 \\*[an*section8]\"
+. el \{.ie '\\$2'9' .ds an-extra3 \\*[an*section9]\"
+. el .ds an-extra3 \" empty
+. \}\}\}\}\}\}\}\}
+. \}
+.
+. ds an-extra1 "\\$3\"
+. ie (\\n[.$] > 3) .ds an-extra2 "\\$4\"
+. el .ds an-extra2 \" empty; but .AT/.UC can override
+.
+. if '\\*[an-extra1]'' \{\
+. ds an-msg .\\$0 missing third argument; suggest document\"
+. as an-msg " modification date in ISO 8601 format (YYYY-MM-DD)\"
+. an-style-warn \\*[an-msg]
+. rm an-msg
+. \}
+.
+. if '\\*[an-extra2]'' \{\
+. ds an-msg .\\$0 missing fourth argument; suggest package/project\"
+. \" Yes, that's one double quote, then three, then two.
+. as an-msg " name and version (e.g., """groff 1.23.0"")\"
+. an-style-warn \\*[an-msg]
+. rm an-msg
+. \}
+.
+. if '\\$5\\*[an-extra3]'' \{\
+. ds an-msg .\\$0 missing fifth argument and second argument '\\$2'\"
+. as an-msg " not a recognized manual section; specify its title\"
+. an-style-warn \\*[an-msg]
+. rm an-msg
+. \}
+.
+. \" Initialize environment for headers and footers.
+. ev an*env-header-and-footer
+. ps \\n[PS]u
+. vs \\n[VS]u
+. lt \\n[LT]u
+. an*abbreviate-page-topic
+. \" If AT or UC is called, we will need to abbreviate again.
+. an*abbreviate-inner-footer
+. ev
+.
+. \" HTML gets the topic without any abbreviation, since it's metadata.
+. if \\n[an*is-output-html] \{\
+. DEVTAG-TL
+. nop \\*[an*topic]
+. DEVTAG-EO-TL
+. \}
+.
+. \" A bookmark is attached to the page header, but only on the first
+. \" page of the document.
+. nr an*was-TH-bookmark-emitted 0
+. an-header
+.
+. if !\\n[cR] \{\
+. wh 0 an-header
+. ie r FT .nr an*footer-location \\n[FT]
+. el .nr an*footer-location (-.5i)
+. wh \\n[an*footer-location]u an-footer
+. wh (\\n[an*footer-location]u - .5i) an-break-body-text
+. rr an*footer-location
+. \}
+. \}
+.
+. nr an*need-titles-reset 1
+..
+.
+.\" Support legacy AT&T and BSD Unix man pages.
+.
+.\" Designate an AT&T Unix man page.
+.\" .AT [system-id[ release-id]]
+.de1 AT
+. nop \\*[an-deprecation-warn]\\
+. ds an-extra2 "7th Edition\"
+. if "\\$1"3" .ds an-extra2 "7th Edition\"
+. if "\\$1"4" .ds an-extra2 "System III\"
+. if "\\$1"5" \{\
+. ie "\\$2"" .ds an-extra2 "System V\"
+. el .ds an-extra2 "System V Release \\$2\"
+. \}
+. ev an*env-header-and-footer
+. an*abbreviate-inner-footer
+. ev
+..
+.
+.\" Designate a BSD Unix man page.
+.\" .UC [system-id]
+.de1 UC
+. nop \\*[an-deprecation-warn]\\
+. ds an-extra2 "3rd Berkeley Distribution\"
+. if "\\$1"3" .ds an-extra2 "3rd Berkeley Distribution\"
+. if "\\$1"4" .ds an-extra2 "4th Berkeley Distribution\"
+. if "\\$1"5" .ds an-extra2 "4.2 Berkeley Distribution\"
+. if "\\$1"6" .ds an-extra2 "4.3 Berkeley Distribution\"
+. if "\\$1"7" .ds an-extra2 "4.4 Berkeley Distribution\"
+. ev an*env-header-and-footer
+. an*abbreviate-inner-footer
+. ev
+..
+.
+.\" Restore tab stops to defaults.
+.de1 DT
+. nop \\*[an-deprecation-warn]\\
+. an-reset-tab-stops
+..
+.
+.\" Restore inter-paragraph spacing to default (or set it to argument).
+.\" .PD [distance]
+.de1 PD
+. nop \\*[an-deprecation-warn]\\
+. nop \\*[an-reset-paragraph-spacing]\\
+..
+.
+.\" Write the page header; can be redefined by man.local.
+.\"
+.\" In continuous rendering mode, we need to extend the page length to
+.\" accommodate the vertical size of our header (plus any spacing).
+.if d PT .ig
+.de1 PT
+. ie \\n[cR] .pl +1v
+. el .sp .5i
+. if !\\n[an*was-TH-bookmark-emitted] \{\
+. an*bookmark 1 \E*[an*page-ref-string]
+. nr an*was-TH-bookmark-emitted 1
+. \}
+. tl '\\*[an-pageref]'\\*[an-extra3]'\\*[an-pageref]'
+. ie \\n[cR] \{\
+. pl +1v
+. sp 1v
+. \}
+. el .sp |1i
+..
+.
+.\" Write the page footer; can be redefined by man.local.
+.\"
+.\" In continuous rendering mode, we need to extend the page length to
+.\" accommodate the vertical size of our footer (plus any spacing).
+.if d BT .ig
+.de1 BT
+. if \\n[cR] .pl +1v
+. ie \\n[D] \{\
+. if o .tl '\\*[an*ifoot]'\\*[an-extra1]'\\*[an*ofoot]'
+. if e .tl '\\*[an*ofoot]'\\*[an-extra1]'\\*[an*ifoot]'
+. \}
+. el \
+. tl '\\*[an*ifoot]'\\*[an-extra1]'\\*[an*ofoot]'
+..
+.
+.\" Abbreviate the page topic if it's too long for the header. Leaves
+.\" string an-pageref defined for use in .PT and .an-footer. Also
+.\" leaves an*topic-abbv for possible use by .PT and .BT re-definers.
+.\" Call this only from within the header/footer environment.
+.de an*abbreviate-page-topic
+. ds an*topic-abbv \\*[an*topic]\" might not get abbreviated at all
+. ds an*topic-string \\*[an*topic]\"
+. ds an-ellipsis \|.\|.\|.\|\"
+. \" an*page-ref-string is left unmodified for internal use, such as
+. \" PDF bookmarks.
+. ds an*page-ref-string \\*[an*topic](\\*[an*section])\"
+. ds an-pageref \\*[an*topic-abbv](\\*[an*section])\"
+. nr an-header-width \\w'\\*[an-pageref]\\*[an-extra3]\\*[an-pageref]'
+. while (\\n[an-header-width] >= \\n[.lt]) \{\
+. \" The page topic is too long; trim some bits out of the middle.
+. length an*topic-length \\*[an*topic-string]
+. \" roff uses truncating division. Remove an additional character
+. \" on each side of the midpoint to account for the ellipsis we add
+. \" later.
+. nr an-mark1 (\\n[an*topic-length] / 2 - 2)
+. nr an-mark2 (\\n[an*topic-length] / 2 + 2)
+. ds an-prefix \\*[an*topic-string]\"
+. ds an-suffix \\*[an*topic-string]\"
+. \" Use extremum operators to ensure that the first and last
+. \" characters of the topic remain intact (in cases of pathological
+. \" shortening).
+. substring an-prefix 0 (\\n[an-mark1] >? 1)
+. substring an-suffix (\\n[an-mark2] <? \\n[an*topic-length] - 1) -1
+. ds an*topic-string \\*[an-prefix]\\*[an-suffix]\"
+. ds an*topic-abbv \\*[an-prefix]\\*[an-ellipsis]\\*[an-suffix]\"
+. \" Remeasure the formatted topic; give up if we made no progress.
+. length an*topic-new-length \\*[an*topic-string]
+. ie (\\n[an*topic-new-length] >= \\n[an*topic-length]) \
+. break
+. ds an-pageref \\*[an*topic-abbv](\\*[an*section])\"
+. nr an-header-width \
+ \\w'\\*[an-pageref]\\*[an-extra3]\\*[an-pageref]'
+. \}
+. ds an-pageref \\*[an-lic]\f[\\*[MF]]\\*[an*topic-abbv]\\*[an-ic]\
+\f[R](\\*[an*section])\"
+. rr an*topic-length-prev
+. rr an-mark1
+. rr an-mark2
+. rm an-prefix
+. rm an-suffix
+. rm an*topic-string
+. rr an*topic-length
+. rr an-header-width
+. rm an-ellipsis
+..
+.
+.\" Iterate through concatenation of arguments as a string. If a bare
+.\" backslash is found, make `an*string-contains-backslash` true. Our
+.\" caller should delete this register when done with it.
+.de an*scan-string-for-backslash
+. nr an*string-contains-backslash 0
+. nr an*index 0
+. length an*max-index \\$*
+. while (\\n[an*index] < \\n[an*max-index]) \{\
+. ds an*char \\$*
+. substring an*char \\n[an*index] \\n[an*index]
+. ec @
+. \" Use a weird delimiter to reduce lexical colorizer confusion.
+. if _@*[an*char]_\\_ .nr an*string-contains-backslash 1
+. ec
+. if \\n[an*string-contains-backslash] .break
+. nr an*index +1
+. \}
+. rm an*char
+. rr an*max-index
+. rr an*index
+..
+.
+.\" Abbreviate the `an-extra2` string (set by .TH) if it's too long for
+.\" the footer. The formatted width of the inner footer plus half that
+.\" of the center footer must be less than half the title width or we
+.\" must abbreviate. By default, `an-extra2` is placed as the inner
+.\" footer. We call its (potential) abbreviation `an*ifoot` here and
+.\" leave it defined for .BT use. (`an*ofoot` is not treated the same
+.\" way. `an-footer` regenerates it on every page because the page
+.\" number changes if present.) Shorten the inner footer if necessary
+.\" by trimming characters off the end, replacing them with an ellipsis.
+.de an*abbreviate-inner-footer
+. ds an*ifoot \\*[an-extra2]\"
+. nr an*half-title-width (\\n[.lt] / 2u)
+. nr an*half-cfoot-width (\w'\\*[an-extra1]' / 2u)
+. nr an*half-footer-width \
+ (\w'\\*[an*ifoot]' + \\n[an*half-cfoot-width])
+. if (\\n[an*half-footer-width] < \\n[an*half-title-width]) \{\
+. rr an*half-footer-width
+. rr an*half-cfoot-width
+. rr an*half-title-width
+. return
+. \}
+. an*scan-string-for-backslash \\*[an*ifoot]
+. if \\n[an*string-contains-backslash] \{\
+. an-warn not abbreviating fourth argument to 'TH' '\\*[an*ifoot]': \
+contains unsupported escape sequence
+. rr an*string-contains-backslash
+. rr an*half-footer-width
+. rr an*half-cfoot-width
+. rr an*half-title-width
+. return
+. \}
+. ds an*saved-ifoot \\*[an*ifoot]
+. ds an*ellipsis \|.\|.\|.\|\"
+. \" Remeasure with ellipsis added to inner footer so that henceforth,
+. \" the measured width strictly decreases.
+. nr an*half-footer-width \
+ (\w'\\*[an*ifoot]\\*[an*ellipsis]' + \\n[an*half-cfoot-width])
+. nr an*end-index (-2)
+. while (\\n[an*half-footer-width] >= \\n[an*half-title-width]) \{\
+. ds an*ifoot \\*[an*saved-ifoot]
+. substring an*ifoot 0 \\n[an*end-index]
+. \" Measure the string again and give up if we made no progress.
+. nr an*new-half-footer-width \
+ (\w'\\*[an*ifoot]\\*[an*ellipsis]' + \\n[an*half-cfoot-width])
+. ie (\\n[an*new-half-footer-width] >= \\n[an*half-footer-width]) \
+. break
+. nr an*half-footer-width \\n[an*new-half-footer-width]
+. nr an*end-index -1
+. \}
+. ds an*ifoot \\*[an*ifoot]\\*[an*ellipsis]\"
+. rr an*end-index
+. rr an*new-half-footer-width
+. rm an*ellipsis
+. rm an*saved-ifoot
+. rr an*string-contains-backslash
+. rr an*half-footer-width
+. rr an*half-cfoot-width
+. rr an*half-title-width
+..
+.
+.\" Prepare the header for a page of the document.
+.de1 an-header
+. if \\n[an-suppress-header-and-footer] .return
+. ev an*env-header-and-footer
+. PT
+. ev
+. ns
+..
+.
+.\" Schedule a page break when the next output line is written (not
+.\" called if continuously rendering).
+.de1 an-break-body-text
+' bp
+..
+.
+.\" Prepare the footer for a page of the document.
+.de1 an-footer
+. if \\n[an-suppress-header-and-footer] .return
+. ev an*env-header-and-footer
+. ie \\n[cR] \
+. ds an*ofoot "\\*[an-pageref]\"
+. el \{\
+. ds an*ofoot \\n[%]\"
+. if r X \{\
+. if (\\n[%] > \\n[X]) \{\
+. nr an-page-letter (\\n[%] - \\n[X])
+. ds an*ofoot \\n[X]\\n[an-page-letter]\"
+. \}
+. \}
+. \}
+. BT
+. rm an*ofoot
+. ev
+..
+.
+.\" Output the tag of a tagged paragraph, or of an indented paragraph
+.\" (IP) that has a tag. Whether we break depends on the tag width.
+.de an-write-paragraph-tag
+. br
+. di
+. ad \\*[AD]
+. nr an-is-in-diversion 0
+. ll
+. \" We must emit the diversion in a separate environment to ensure
+. \" that a possible margin character is printed correctly.
+. ev an-env-paragraph-tag
+. evc 0
+. mc
+. nf
+. in \\n[an-margin]u
+. \" Prevent page break between the tag and the rest of the paragraph.
+. ne (2v + 1u)
+. \" Does the tag fit within the paragraph indentation?
+. nr an-tag-fits \
+ (\\n[dl] + \\n[an-tag-separation] <= \\n[an-prevailing-indent])
+. if \\n[an-tag-fits] .DEVTAG-COL 1
+. an-div
+. if \\n[an-tag-fits] .sp -1v
+. ev
+. in (\\n[an-margin]u + \\n[an-prevailing-indent]u)
+. if \\n[an-tag-fits] .DEVTAG-COL 2
+. rr an-tag-fits
+..
+.
+.\" Handle macros that may take an "argument" on the next input line
+.\" producing written or drawn output: .SH, .SS, .B, .I, .SM, .SB--and
+.\" .TP, which does so mandatorily.
+.de1 an-input-trap
+. if \\n[an-devtag-needs-end-of-heading] .DEVTAG-EO-H
+. nr an-devtag-needs-end-of-heading 0
+. if \\n[an-devtag-needs-second-column] .DEVTAG-COL 2
+. nr an-devtag-needs-second-column 0
+. ft R
+. ps \\n[PS]u
+. vs \\n[VS]u
+. if \\n[an-need-break] \{\
+. br
+. nr an-need-break 0
+. \}
+. if \\n[an-need-no-space-mode] \{\
+. ns
+. nr an-need-no-space-mode 0
+. \}
+. if \\n[an-is-in-diversion] .an-write-paragraph-tag
+..
+.
+.\" Break a paragraph. Restore defaults, except for indentation.
+.de an-break-paragraph
+. ft R
+. ps \\n[PS]u
+. vs \\n[VS]u
+. sp \\n[PD]u
+. ns
+..
+.
+.\" Set arguments (or next input line producing written or drawn output
+.\" if none) as a section heading.
+.de1 SH
+. fam \\*[an*body-family]
+. an-break-paragraph
+. an-reset-margin-and-inset-level
+. fi
+. in \\n[an-margin]u
+. ti 0
+. nr an-devtag-needs-end-of-heading 1
+. DEVTAG-SH 1
+. it 1 an-input-trap
+. nr an-need-no-space-mode 1
+. nr an-need-break 1
+. ps \\n[PS-SH]u
+. ne (2v + 1u)
+. ft \\*[HF]
+. if \\n[an-remap-I-style-in-headings] .ftr I \\*[an-heading-family]BI
+. if \\n[.$] \{\
+. ds an-section-heading \\$*\"
+. if \\n[CS] .stringup an-section-heading
+. an*bookmark 2 \E*[an-section-heading]
+. nop \&\\*[an-section-heading]
+. \}
+. if \\n[an-remap-I-style-in-headings] .ftr I I
+..
+.
+.\" Set arguments (or next input line producing written or drawn output
+.\" if none) as a subsection heading.
+.de1 SS
+. fam \\*[an*body-family]
+. an-break-paragraph
+. an-reset-margin-and-inset-level
+. fi
+. in \\n[IN]u
+. ti \\n[SN]u
+. nr an-devtag-needs-end-of-heading 1
+. DEVTAG-SH 2
+. it 1 an-input-trap
+. nr an-need-no-space-mode 1
+. nr an-need-break 1
+. ps \\n[PS-SS]u
+. ne (2v + 1u)
+. ft \\*[HF]
+. if \\n[an-remap-I-style-in-headings] .ftr I \\*[an-heading-family]BI
+. if \\n[.$] \{\
+. ds an*subsection-heading \\$*\"
+. an*bookmark 3 \E*[an*subsection-heading]
+. nop \&\\$*
+. \}
+. if \\n[an-remap-I-style-in-headings] .ftr I I
+..
+.
+.\" Set arguments (or next input line producing written or drawn output
+.\" if none) in bold style.
+.de1 B
+. it 1 an-input-trap
+. ft B
+. if \\n[.$] \&\\$*
+..
+.
+.\" Set arguments (or next input line producing written or drawn output
+.\" if none) in italic style.
+.de1 I
+. it 1 an-input-trap
+. ft I
+. if \\n[.$] \,\\$*\/
+..
+.
+.\" Set arguments (or next input line producing written or drawn output
+.\" if none) at smaller type size.
+.de1 SM
+. it 1 an-input-trap
+. ps -1
+. if \\n[.$] \&\\$*
+..
+.
+.\" Set arguments (or next input line producing written or drawn output
+.\" if none) in bold style at smaller type size.
+.de1 SB
+. it 1 an-input-trap
+. ps -1
+. ft B
+. if \\n[.$] \&\\$*
+..
+.
+.\" Set an ordinary paragraph.
+.de1 P
+. an-break-paragraph
+. in \\n[an-margin]u
+. nr an-prevailing-indent \\n[IN]
+..
+.
+.\" Accommodate ms(7) paragraphing refugees.
+.als LP P
+.als PP P
+.
+.\" Set a tagged paragraph. The tag must be on the next input line
+.\" producing written or drawn output.
+.\" .TP [indent]
+.de1 TP
+. an-break-paragraph
+. if \\n[.$] .nr an-prevailing-indent (n;\\$1)
+. itc 1 an-input-trap
+. in 0
+. if !\\n[an-is-in-diversion] \{\
+. ll -\\n[an-margin]u
+. di an-div
+. na
+. \}
+. nr an-is-in-diversion 1
+..
+.
+.\" Set an indented paragraph.
+.\" .IP [marker[ indentation-amount]]
+.de1 IP
+. an-break-paragraph
+. ie !\\n[.$] \{\
+. ne (1v + 1u)
+. in (\\n[an-margin]u + \\n[an-prevailing-indent]u)
+. \}
+. el \{\
+. ie (\\n[.$] > 1) .TP "\\$2"
+. el .TP
+. nop \&\\$1
+. \}
+..
+.
+.\" Set a paragraph with a hanging indentation.
+.\" .HP [indent]
+.de1 HP
+. if !\\n[mS] \\*[an-deprecation-warn]\c
+. an-break-paragraph
+. ne (1v + 1u)
+. if \\n[.$] .nr an-prevailing-indent (n;\\$1)
+. in (\\n[an-margin]u + \\n[an-prevailing-indent]u)
+. ti \\n[an-margin]u
+. DEVTAG-COL 1
+. nr an-devtag-needs-second-column 1
+..
+.
+.\" === Define alternating font macros. ===
+.\"
+.\" Implementation notes:
+.\"
+.\" We always emit a dummy character \& before the first argument. This
+.\" is necessary only when the calling man page is in compatibility
+.\" mode; it works around the surprising AT&T semantics of \f escapes at
+.\" the beginning of an input line. See "Implementation differences" in
+.\" groff_diff(7) or the groff Texinfo manual.
+.\"
+.\" The italic correction escapes can be visually confusing. We apply
+.\" the following rules, always on the same input line.
+.\" (1) Before any italic argument, emit a left italic correction \,
+.\" before switching to the italic style.
+.\" (2) After any italic argument, emit an italic correction \/
+.\" before switching to another style.
+.\" It is true that these macros cannot know what style is used in the
+.\" input stream before or after they are called. We can make
+.\" assumptions based on pragmatics. In most cases, the caller will not
+.\" precede a call to one of these macros with \c, or add it to the
+.\" final argument given to one of these calls; when \c is absent, what
+.\" is adjacent must be a word space or output line boundary, so italic
+.\" corrections don't matter. If \c _is_ used by the caller, we can
+.\" assume that the adjacent glyphs before an IB or IR call, or the
+.\" following ones after a BI or RI call, will not be italic (and thus
+.\" will benefit from the italic correction we provide); otherwise the
+.\" caller would simply have added the relevant characters to the
+.\" arguments of the macro call.
+.\"
+.
+.\" Set each argument in bold and italics, alternately.
+.de1 BI
+. if (\\n[.$] < 2) \
+. an-style-warn .\\$0 expects at least 2 arguments, got \\n[.$]
+. if \\n[.$] \{\
+. ds an-result \&\"
+. while (\\n[.$] >= 2) \{\
+. as an-result \f[B]\\$1\,\f[I]\\$2\/\"
+. shift 2
+. \}
+. if \\n[.$] .as an-result \f[B]\\$1\"
+. nop \\*[an-result]
+. rm an-result
+. ft R
+. \}
+..
+.
+.\" Set each argument in bold and roman, alternately.
+.de1 BR
+. if (\\n[.$] < 2) \
+. an-style-warn .\\$0 expects at least 2 arguments, got \\n[.$]
+. if \\n[.$] \{\
+. ds an-result \&\"
+. while (\\n[.$] >= 2) \{\
+. as an-result \f[B]\\$1\f[R]\\$2\"
+. shift 2
+. \}
+. if \\n[.$] .as an-result \f[B]\\$1\"
+. nop \\*[an-result]
+. rm an-result
+. ft R
+. \}
+..
+.
+.\" Set each argument in italics and bold, alternately.
+.de1 IB
+. if (\\n[.$] < 2) \
+. an-style-warn .\\$0 expects at least 2 arguments, got \\n[.$]
+. if \\n[.$] \{\
+. ds an-result \&\"
+. while (\\n[.$] >= 2) \{\
+. as an-result \,\f[I]\\$1\/\f[B]\\$2\"
+. shift 2
+. \}
+. if \\n[.$] .as an-result \,\f[I]\\$1\/\"
+. nop \\*[an-result]
+. rm an-result
+. ft R
+. \}
+..
+.
+.\" Set each argument in italics and roman, alternately.
+.de1 IR
+. if (\\n[.$] < 2) \
+. an-style-warn .\\$0 expects at least 2 arguments, got \\n[.$]
+. if \\n[.$] \{\
+. ds an-result \&\"
+. while (\\n[.$] >= 2) \{\
+. as an-result \,\f[I]\\$1\/\f[R]\\$2\"
+. shift 2
+. \}
+. if \\n[.$] .as an-result \,\f[I]\\$1\/\"
+. nop \\*[an-result]
+. rm an-result
+. ft R
+. \}
+..
+.
+.\" Set each argument in roman and bold, alternately.
+.de1 RB
+. if (\\n[.$] < 2) \
+. an-style-warn .\\$0 expects at least 2 arguments, got \\n[.$]
+. if \\n[.$] \{\
+. ds an-result \&\"
+. while (\\n[.$] >= 2) \{\
+. as an-result \f[R]\\$1\f[B]\\$2\"
+. shift 2
+. \}
+. if \\n[.$] .as an-result \f[R]\\$1\"
+. nop \\*[an-result]
+. rm an-result
+. ft R
+. \}
+..
+.
+.\" Set each argument in roman and italics, alternately.
+.de1 RI
+. if (\\n[.$] < 2) \
+. an-style-warn .\\$0 expects at least 2 arguments, got \\n[.$]
+. if \\n[.$] \{\
+. ds an-result \&\"
+. while (\\n[.$] >= 2) \{\
+. as an-result \f[R]\\$1\,\f[I]\\$2\/\"
+. shift 2
+. \}
+. if \\n[.$] .as an-result \f[R]\\$1\"
+. nop \\*[an-result]
+. rm an-result
+. ft R
+. \}
+..
+.
+.\" Start a relative inset level (by the amount given in the argument).
+.\" .RS [inset-amount]
+.de1 RS
+. nr an-saved-margin\\n[an-inset-level] \\n[an-margin]
+. nr an-saved-prevailing-indent\\n[an-inset-level] \
+ \\n[an-prevailing-indent]
+. ie \\n[.$] .nr an-margin +(n;\\$1)
+. el .nr an-margin +\\n[an-prevailing-indent]
+. in \\n[an-margin]u
+. nr an-prevailing-indent \\n[IN]
+. nr an-inset-level +1
+..
+.
+.\" End relative inset level, backing up by one level (or to the level
+.\" given by the argument).
+.\" .RE [inset-level]
+.de1 RE
+. ie \\n[.$] .nr an-RE-requested-level \\$1
+. el .nr an-RE-requested-level (\\n[an-inset-level] - 1)
+. ie \\n[.$] \{\
+. if (\\n[an-RE-requested-level] = \\n[an-inset-level]) \
+. ds an-RE-problem already at level \\n[an-inset-level]\"
+. if (\\n[an-RE-requested-level] > \\n[an-inset-level]) \
+. ds an-RE-problem too large\"
+. if (\\n[an-RE-requested-level] < 1) \
+. ds an-RE-problem too small\"
+. if d an-RE-problem \
+. an-style-warn argument """\\$1""" to .\\$0 \\*[an-RE-problem]
+. rm an-RE-problem
+. \}
+. el .if !(\\n[an-RE-requested-level]) .an-style-warn unbalanced .\\$0
+. rr an-RE-requested-level
+. ie \\n[.$] .nr an-inset-level ((;\\$1) <? \\n[an-inset-level])
+. el .nr an-inset-level -1
+. nr an-inset-level (1 >? \\n[an-inset-level])
+. nr an-margin \\n[an-saved-margin\\n[an-inset-level]]
+. nr an-prevailing-indent \
+ \\n[an-saved-prevailing-indent\\n[an-inset-level]]
+. in \\n[an-margin]u
+..
+.
+.\" Deprecated: Style an option with an argument (mandatory if
+.\" specified) for a command synopsis.
+.\" .OP flag [option-parameter]
+.de1 OP
+. nop \\*[an-deprecation-warn]\\
+. if ((\\n[.$] < 1) : (\\n[.$] > 2)) \
+. an-style-warn .\\$0 expects 1 or 2 arguments, got \\n[.$]
+. ie (\\n[.$] > 1) \
+. RI [\\f[B]\\$1\f[] \~\\$2 ]
+. el \
+. RB [ \\$1 ]
+..
+.
+.\" Begin an example (typically of source code or shell input).
+.de1 EX
+. br
+. if \\n[an*is-in-example] \{\
+. an-style-warn ignoring .\\$0 while already in example
+. return
+. \}
+. ds an*saved-family \\n[.fam]
+. nr an*saved-font \\n[.f]
+. nr an*saved-paragraph-distance \\n[PD]
+. nr PD 1v
+. nf
+. \" If using the DVI output device, we have no constant-width fonts of
+. \" bold weight and, relatedly, no constant-width family (because that
+. \" requires all four styles). Remap the bold styles to normal ones.
+. ie '\*[.T]'dvi' \{\
+. ftr R CW
+. ftr B CW
+. ftr I CWI
+. ftr BI CWI
+. \}
+. el .fam \\*[an*example-family]
+. ft R
+. nr an*is-in-example 1
+..
+.
+.\" End example.
+.de EE
+. br
+. if !\\n[an*is-in-example] \{\
+. an-style-warn ignoring .\\$0 while not in example
+. return
+. \}
+. \" Undo the remappings from `EX`.
+. ie '\*[.T]'dvi' \{\
+. ftr R
+. ftr B
+. ftr I
+. ftr BI
+. \}
+. fam \\*[an*saved-family]
+. ft \\n[an*saved-font]
+. nr PD \\n[an*saved-paragraph-distance]
+. fi
+. rr an*saved-paragraph-distance
+. rr an*saved-font
+. rm an*saved-family
+. nr an*is-in-example 0
+..
+.
+.\" Store the argument and begin a diversion for link text.
+.de an*begin-hyperlink
+. ds an*hyperlink \\$1\"
+. \" We want the diversion to format as if it has an indentation of
+. \" zero (that comes for free when we switch environments), and we
+. \" want the line length reduced by the amount of indentation that
+. \" obtains when we output it.
+. nr an*saved-line-length \\n[.l]
+. nr an*saved-indentation \\n[.i]
+. \" We can only hyperlink if we're not in a diversion.
+. \" XXX: There's no fundamental reason for that, just a simple matter
+. \" of macro programming.
+. nr an*is-in-link-text-diversion 0
+. if '\\n(.z'' .nr an*is-in-link-text-diversion 1
+. if (\\n[an*is-in-link-text-diversion] & \\n[an*do-hyperlink]) \{\
+. \" Start diversion in a new environment.
+. ev an*link-text-env
+. di an*link-text-div
+. ll (\\n[an*saved-line-length]u - \\n[an*saved-indentation]u)
+. \}
+. rr an*saved-indentation
+. rr an*saved-line-length
+..
+.
+.\" Emit hyperlinked text with optional trailing text.
+.\"
+.\" The caller should set the `an*prefix` string if the hyperlink should
+.\" be prefixed with a scheme; for example, email addresses get
+.\" "mailto:", but this need not be visible when rendering an email
+.\" address on a device incapable of hyperlinking.
+.de an*end-hyperlink
+. ie (\\n[an*is-in-link-text-diversion] & \\n[an*do-hyperlink]) \{\
+. br
+. di
+. ev
+.
+. \" Was any link text present?
+. ie \\n[dn] \{\
+. if \\n[an*is-output-html] \
+. nop \X^html:<a href="\\*[an*prefix]\\*[an*hyperlink]">^\c
+. if \\n[an*is-output-terminal] \
+. nop \X^tty: link \\*[an*prefix]\\*[an*hyperlink]^\c
+. \" Strip off the final newline of the diversion and emit it.
+. chop an*link-text-div
+. an*link-text-div
+\c\" XXX: If we .nop this, HTML output is corrupted (Savannah #63470).
+. if \\n[an*is-output-html] \
+. nop \X^html:</a>^\c
+. if \\n[an*is-output-terminal] \
+. nop \X^tty: link^\c
+. \}
+. \" If there was no link text, format URI as its own link text. We
+. \" don't add angle brackets here.
+. el \{\
+. if \\n[an*is-output-html] \
+. nop \X^html:<a href="\\*[an*prefix]\\*[an*hyperlink]">\
+\\*[an*hyperlink]</a>^\c
+. if \\n[an*is-output-terminal] \
+. nop \X^tty: link \\*[an*prefix]\\*[an*hyperlink]^\
+\\*[an*hyperlink]\X^tty: link^\c
+. \}
+. nop \&\\$1\"
+. \}
+. \" If not hyperlinking, format URI in angle brackets. There was no
+. \" diversion, so the link text has already been formatted normally.
+. el \{\
+. nh
+. nop \\[la]\\*[an*hyperlink]\\[ra]\\$1
+. hy \\n[an*hyphenation-mode]
+. \}
+.
+. rr an*is-in-link-text-diversion
+..
+.
+.\" Begin email hyperlink. Input until the next `ME` call is stored in
+.\" a diversion; it becomes the link text for the hyperlinked address.
+.\" .MT nobody@example.com
+.de1 MT
+. if !(\\n[.$] = 1) \
+. an-style-warn .\\$0 expects 1 argument, got \\n[.$]
+. ds an*prefix mailto:
+. an*begin-hyperlink \\$1
+..
+.
+.\" End email hyperlink. The optional argument supplies trailing
+.\" punctuation (or, rarely, other text) after link text.
+.\" .ME [trailing-text]
+.de1 ME
+. an*end-hyperlink \\$1
+. rm an*prefix
+..
+.
+.\" Begin web hyperlink. Input until the next `UE` call is stored in
+.\" a diversion; it becomes the link text for the hyperlinked address.
+.\" .UR nobody@example.com
+.de1 UR
+. if !(\\n[.$] = 1) \
+. an-style-warn .\\$0 expects 1 argument, got \\n[.$]
+. ds an*prefix \" empty
+. an*begin-hyperlink \\$1
+..
+.
+.\" End web hyperlink. The optional argument supplies trailing
+.\" punctuation (or, rarely, other text) after link text.
+.\" .UE [trailing-text]
+.de1 UE
+. an*end-hyperlink \\$1
+. rm an*prefix
+..
+.
+.\" There is no standardized format for man page URLs, but the default
+.\" is expected to work (or be harmlessly ignored) everywhere except
+.\" macOS. Override in man.local if desired.
+.nr an*MR-URL-format 1
+.
+.\" Set a man page cross reference.
+.\" .MR page-topic page-section [trailing-text]
+.de1 MR
+. if ((\\n[.$] < 2) : (\\n[.$] > 3)) \
+. an-style-warn .\\$0 expects 2 or 3 arguments, got \\n[.$]
+. ds an*url man:\\$1(\\$2)\" used everywhere but macOS
+. if (\\n[an*MR-URL-format] = 2) \
+. ds an*url x-man-page://\\$2/\\$1\" macOS/Mac OS X since 10.3
+. if (\\n[an*MR-URL-format] = 3) \
+. ds an*url man:\\$1.\\$2\" Bwana (Mac OS X)
+. if (\\n[an*MR-URL-format] = 4) \
+. ds an*url x-man-doc://\\$2/\\$1\" ManOpen (Mac OS X pre-2005)
+. nh
+. if \\n[an*do-hyperlink] \{\
+. if \\n[an*is-output-html] \
+. nop \X^html:<a href="\\*[an*url]">^\c
+. if \\n[an*is-output-terminal] \
+. nop \X^tty: link \\*[an*url]^\c
+. \}
+. nop \&\\*[an-lic]\f[\\*[MF]]\\$1\\*[an-ic]\f[R](\\$2)\c
+. if \\n[an*do-hyperlink] \{\
+. if \\n[an*is-output-html] \
+. nop \X^html:</a>^\c
+. if \\n[an*is-output-terminal] \
+. nop \X^tty: link^\c
+. \}
+. nop \&\\$3
+. hy \\n[an*hyphenation-mode]
+..
+.
+.\" tbl(1) table support
+.
+.\" Start table.
+.de1 TS
+. \" If continuous rendering, tell tbl not to use keeps.
+. ie \\n[cR] .nr 3usekeeps 0
+. el .nr 3usekeeps 1
+. if \\n[an*is-output-html] \{\
+. nr an-TS-ll \\n[.l]
+. ll 1000n
+. \}
+. HTML-IMAGE
+..
+.
+.\" Start another table in the same region (ignored).
+.de1 T&
+..
+.
+.\" End table.
+.de1 TE
+. HTML-IMAGE-END
+. if \\n[an*is-output-html] .ll \\n[an-TS-ll]u
+. if !r TW .if !\\n[an-was-tbl-failure-reported] \{\
+. ds an-msg tbl preprocessor failed, or it or soelim was not run;\"
+. as an-msg " table(s) likely not rendered\"
+. as an-msg " (TE macro called with TW register undefined)\"
+. an-warn \\*[an-msg]
+. rm an-msg
+. nr an-was-tbl-failure-reported 1
+. \}
+..
+.
+.\" eqn(1) equation support
+.
+.\" Start equation.
+.de1 EQ
+. if \\n[an*is-output-html] \{\
+. nr an-EQ-ll \\n[.l]
+. ll 1000n
+. \}
+. HTML-IMAGE
+..
+.
+.\" End equation.
+.de1 EN
+. HTML-IMAGE-END
+. if \\n[an*is-output-html] .ll \\n[an-EQ-ll]u
+..
+.
+.
+.\" === Define strings. ===
+.\"
+.\" These strings must work in compatibility mode also.
+.
+.ds S \s'\\n(PSu'\"
+.ie c\[rg] .ds R \(rg\"
+.el .ds R (Reg.)\"
+.ie c\[tm] .ds Tm \(tm\"
+.el .ds Tm (TM)\"
+.ie c\[lq] .ds lq \(lq\"
+.el .ds lq ""\"
+.ie c\[rq] .ds rq \(rq\"
+.el .ds rq ""\"
+.
+.\" === Define/remap characters. ===
+.
+.\" For UTF-8, map the minus sign to the hyphen-minus to facilitate
+.\" copy and paste of code examples, file names, and URLs embedding it.
+.if '\*[.T]'utf8' \
+. char \- \N'45'
+.
+.\" === Initialize. ===
+.
+.mso devtag.tmac
+.nr an-devtag-needs-end-of-heading 0
+.nr an-devtag-needs-second-column 0
+.
+.\" Track whether the strings that set header and footer text need to be
+.\" reconfigured. This happens when batch-rendering and starting a new
+.\" page.
+.nr an*need-titles-reset 0
+.
+.nr an*is-output-html 0
+.if '\*[.T]'html' .nr an*is-output-html 1
+.nr an*is-output-pdf 0
+.if '\*[.T]'pdf' .nr an*is-output-pdf 1
+.nr an*is-output-terminal 0
+.if '\*(.T'ascii' .nr an*is-output-terminal 1
+.if '\*(.T'cp1047' .nr an*is-output-terminal 1
+.if '\*(.T'latin1' .nr an*is-output-terminal 1
+.if '\*(.T'utf8' .nr an*is-output-terminal 1
+.
+.nr an*can-hyperlink 0
+.if ( \n[an*is-output-html] \
+ : \n[an*is-output-pdf] \
+ : \n[an*is-output-terminal]) \
+. nr an*can-hyperlink 1
+.
+.ds an*body-family T \" Times
+.ds an*example-family C \" Courier
+.
+.\" Map monospaced fonts to standard styles for groff's nroff devices.
+.if n \{\
+. ftr CR R
+. ftr CI I
+. ftr CB B
+. ftr CBI BI
+.\}
+.
+.\" undocumented register; unset to test an-ext.tmac extension macros
+.if !r mG \
+. nr mG 1
+.
+.\" Load man macro extensions.
+.mso an-ext.tmac
+.
+.\" Load site modifications.
+.msoquiet man.local
+.
+.\" Set each rendering parameter only if its -[dr] option or man.local
+.\" did not.
+.
+.if \n[an*is-output-pdf] \{\
+. \" FIXME: The following registers are documented only in pdf.tmac.
+. if !r PDFOUTLINE.FOLDLEVEL .nr PDFOUTLINE.FOLDLEVEL 1
+. if !r PDFHREF.VIEW.LEADING .nr PDFHREF.VIEW.LEADING 10p
+.\}
+.
+.\" continuous rendering (one long page)
+.if !r cR \{\
+. ie n .nr cR 1
+. el .nr cR 0
+.\}
+.
+.\" consecutive page numbering across multiple documents
+.\"
+.\" We must use consecutive page numbers when using PostScript to
+.\" generate HTML images; we must not reset the page number at the
+.\" beginning of each document (the 'ps4html' register is automatically
+.\" added to the command line by the pre-HTML preprocessor).
+.ie !r C \
+. nr C 0
+.el \
+. if !\n[C] \
+. if \n[an*is-output-html] \{\
+. tm \*[an]: consecutive page numbering required for HTML output
+. nr C 1
+. \}
+.if \n[an*is-output-html] \
+. nr C 1
+.if r ps4html \
+. nr C 1
+.
+.\" diagnostics desired for man page style problems
+.if !r CHECKSTYLE \
+. nr CHECKSTYLE 0
+.
+.\" full capitalization of section headings
+.if !r CS \
+. nr CS 0
+.
+.\" full capitalization of page topic
+.if !r CT \
+. nr CT 0
+.
+.\" double-sided layout
+.ie !r D \
+. nr D 0
+.el \
+. if \n[D] \
+. if \n[an*is-output-html] \{\
+. tm \*[an]: ignoring double-sided layout in HTML output
+. nr D 0
+. \}
+.
+.\" footer distance
+.\"
+.\" Unlike most of these parameters, we do not set a default for FT; the
+.\" TH macro places page location traps only if not continuously
+.\" rendering.
+.if r FT \{\
+. \" Validate it. Continuous rendering ignores FT. Measuring a footer
+. \" distance from the page top isn't done. A footer distance of over
+. \" half the page length is unlikely. A footer distance of less than
+. \" one line height is too.
+. ie \n[cR] \
+. ds an-msg footer distance when continuously rendering\"
+. el \{\
+. nr an*tmp 1v
+. ds an*help " (1v=\n[an*tmp]u)\"
+. ie (\n[FT] : (\n[FT] = 0)) \
+. ds an-msg non-negative footer distance: \n[FT]u\*[an*help]\"
+. el \{\
+. ie (-(\n[FT]) > (\n[.p] / 2)) \{\
+. ds an-msg implausibly large footer distance:\"
+. as an-msg " \n[FT]u\*[an*help]\"
+. \}
+. el \
+. if (-(\n[FT]) < 1v) \{\
+. ds an-msg implausibly small footer distance:\"
+. as an-msg " \n[FT]u\*[an*help]\"
+. \}
+. rm an*help
+. rr an*tmp
+. \}
+. \}
+. if d an-msg \{\
+. tm \*[an]: ignoring \*[an-msg]
+. rr FT
+. rm an-msg
+. \}
+.\}
+.
+.\" hyphenation enablement
+.if !r HY \
+. nr HY 1
+.
+.\" standard indentation
+.if !r IN \{\
+. \" We select an integer indentation value in nroff mode because this
+. \" value is used additively for multiple purposes; rounding of
+. \" accumulating fractions would produce inconsistent results.
+. ie t .nr IN 7.2n
+. el .nr IN 7n
+.\}
+.
+.\" line length
+.if !r LL \{\
+. \" If in troff mode, respect device default.
+. ie t .nr LL \n[.l]
+. \" Otherwise, override nroff mode default of 65n.
+. el .nr LL 78n
+.\}
+.
+.\" title (header, footer) length
+.if !r LT \
+. nr LT \n[LL]u
+.
+.\" starting page number
+.\"
+.\" Unlike most of these parameters, we do not set a default for P;
+.\" troff supplies a default starting page number (1). When rendering
+.\" for the HTML output device, page numbers are concealed and used for
+.\" internal purposes like image embedding. Page numbers are not
+.\" rendered at all in continuous rendering mode.
+.if r P \{\
+. if \n[an*is-output-html] \
+. if !(\n[P] = 1) \
+. ds an-msg in HTML output\"
+. if \n[cR] \
+. ds an-msg when continuously rendering
+.\}
+.if d an-msg \{\
+. tm \*[an]: ignoring starting page number \*[an-msg]
+. rr P
+. rm an-msg
+.\}
+.
+.\" Setting the page number turns out to be tricky when batch rendering
+.\" and switching macro packages. We must use different techniques
+.\" depending on whether the transition to the first output page has
+.\" happened yet. If it has not, `nl` will be `-1` and we use `pn`. If
+.\" it has, we set `%`. Technically this is fragile since in theory a
+.\" page could assign a negative value to `nl`. We might then be
+.\" justified in saying they've broken the macro package and they get to
+.\" keep both pieces. But if not, consider using a nonce register,
+.\" initially set but then permanently cleared adjacent to this logic,
+.\" and whose state is shared with mdoc (and andoc.tmac, if necessary).
+.\"
+.\" Also, we can't use the `P` register with grohtml at all.
+.ie r ps4html \{\
+. if r P \{\
+. tm \*[an]: ignoring starting page number in HTML output
+. rr P
+. \}
+.\}
+.el \{\
+. if r P \{\
+. ie (\n[nl] = -1) .pn 0\n[P]
+. el .nr % 0\n[P]
+. \}
+.\}
+.
+.\" type size
+.if !r S \{\
+. nr S 10
+. if '\*[.T]'X75-12' \
+. nr S 12
+. if '\*[.T]'X100-12' \
+. nr S 12
+.\}
+.
+.\" subsection indentation
+.if !r SN \
+. nr SN 3n
+.
+.\" URI enablement desired
+.if !r U \
+. nr U 1
+.
+.nr an*do-hyperlink 0
+.if (\n[U] & \n[an*can-hyperlink]) .nr an*do-hyperlink 1
+.
+.\" page number after which to apply letter suffixes
+.\"
+.\" Unlike most of these parameters, we do not set a default for X; only
+.\" the macro an-footer uses it. Page numbers are not rendered at all
+.\" in continuous rendering mode.
+.if r X \{\
+. af an-page-letter a
+. if \n[an*is-output-html] \
+. ds an-msg in HTML output\"
+. if \n[cR] \
+. ds an-msg when continuously rendering
+.\}
+.if d an-msg \{\
+. tm \*[an]: ignoring page number suffix \*[an-msg]
+. rr X
+. rm an-msg
+.\}
+.
+.\" adjustment mode
+.if !d AD \
+. ds AD b\"
+.
+.\" (sub)section heading font
+.if !d HF \
+. ds HF B\"
+.
+.\" If HF is a bold style, use bold italics for italics in headings.
+.ds an-heading-style \*[HF]\"
+.substring an-heading-style -1 -1
+.ds an-heading-family \" empty
+.length an-HF-length \*[HF]
+.if (\n[an-HF-length] > 1) \{\
+. as an-heading-family \*[HF]\"
+. substring an-heading-family 0 -2
+.\}
+.if '\*[an-heading-style]'B' \
+. if F \*[an-heading-family]BI \
+. nr an-remap-I-style-in-headings 1
+.rr an-HF-length
+.rm an-heading-style
+.
+.\" man page topic font
+.if !d MF \
+. ds MF I\"
+.
+.\" Define italic correction strings. Initially, they are empty. If MF
+.\" is an oblique style, append the corrections.
+.ds an-lic \" left italic correction
+.ds an-ic \" italic correction
+.ds an*topic-style \*[MF]\"
+.substring an*topic-style -1 -1
+.if '\*[an*topic-style]'I' \{\
+. as an-lic \,\"
+. as an-ic \/\"
+.\}
+.rm an*topic-style
+.
+.if \n[cR] \
+. an-set-up-continuous-rendering
+.
+.\" If rendering HTML, suppress headers and footers.
+.nr an-suppress-header-and-footer 0
+.if \n[an*is-output-html] .nr an-suppress-header-and-footer 1
+.if r ps4html .nr an-suppress-header-and-footer 1
+.
+.cp \n[*groff_an_tmac_C]
+.do rr *groff_an_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/andoc.tmac b/tmac/andoc.tmac
new file mode 100644
index 0000000..2778a29
--- /dev/null
+++ b/tmac/andoc.tmac
@@ -0,0 +1,115 @@
+.\" andoc.tmac
+.\"
+.\" Load either an.tmac or doc.tmac. Multiple man pages can be handled.
+.\"
+.\"
+.\" Copyright (C) 1991-2020 Free Software Foundation, Inc.
+.\" Written by Werner Lemberg (wl@gnu.org),
+.\" based on a patch from Tadziu Hoffmann.
+.\"
+.\" 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 3 of the License, 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 this program. If not, see
+.\" <http://www.gnu.org/licenses/>.
+.\"
+.
+.if !\n(.g \
+. ab andoc.tmac: macros require groff extensions; aborting
+.
+.do nr *groff_andoc_tmac_C \n[.cp]
+.cp 0
+.
+.als andoc-em em
+.als andoc-bp bp
+.als andoc-ne ne
+.
+.
+.\" We must not use '.de1' for 'reload-doc' or 'reload-man'! 'doc.tmac'
+.\" unconditionally switches compatibility mode off, but '.de1' would
+.\" ignore this, restoring the mode that was active before. Similarly,
+.\" we have to switch back to the original compatibility mode for man
+.\" documents in case there is a mix of mdoc and man input files.
+.\"
+.\" Due to a bug in GNU troff it necessary to have a no-op line between
+.\" '.do' and '\*'.
+.
+.
+.de reload-doc
+. \" Flush any partially collected output line and write page footer in
+. \" continuous rendering mode.
+. do if d an-end \
+. do an-end
+.
+. \" Remove traps planted by an.tmac.
+. do ch an-header
+. do ch an-break-body-text
+. do ch an-footer
+.
+. do als em andoc-em
+. do als bp andoc-bp
+. do als ne andoc-ne
+. do blm \" no blank line trap
+. do lsm \" no leading space trap
+. em \" no end-of-input trap
+.
+. do rm Dd \" force reinitialization of doc.tmac
+. do mso doc.tmac
+.
+. do als TH reload-man
+.
+\\*(Dd\\
+..
+.
+.de reload-man
+. \" Flush any partially collected output line and write page footer in
+. \" continuous rendering mode.
+. do if d doc-end-macro \
+. do doc-end-macro
+.
+. \" Remove traps planted by mdoc/doc-{common,{n,dit}roff}.
+. do ch doc-break-body-text
+. do ch doc-header
+. do ch doc-footer
+.
+. do als em andoc-em
+. do als bp andoc-bp
+. do als ne andoc-ne
+. do blm \" no blank line trap
+. em \" no end-of-input trap
+.
+. do rm TH \" force reinitialization of an.tmac
+. do mso an.tmac
+.
+. do als Dd reload-doc
+.
+\\*(TH\\
+..
+.
+.als TH reload-man
+.als Dd reload-doc
+.
+.\" dummy equation macros -- eqnrc is read before .TH or .Dd is parsed
+.de EQ
+..
+.de EN
+..
+.
+.cp \n[*groff_andoc_tmac_C]
+.do rr *groff_andoc_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/composite.tmac b/tmac/composite.tmac
new file mode 100644
index 0000000..87ffe50
--- /dev/null
+++ b/tmac/composite.tmac
@@ -0,0 +1,30 @@
+.\" composite.tmac
+.
+.do composite ga u0300
+.do composite ` u0300
+.do composite aa u0301
+.do composite ' u0301
+.do composite a^ u0302
+.do composite ^ u0302
+.do composite a~ u0303
+.do composite ~ u0303
+.do composite a- u0304
+.do composite - u0304
+.do composite ab u0306
+.do composite a. u0307
+.do composite . u0307
+.do composite ad u0308
+.do composite : u0308
+.do composite ao u030A
+.do composite a" u030B
+.do composite " u030B
+.do composite ah u030C
+.do composite ac u0327
+.do composite , u0327
+.do composite ho u0328
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/cp1047.tmac b/tmac/cp1047.tmac
new file mode 100644
index 0000000..0e04194
--- /dev/null
+++ b/tmac/cp1047.tmac
@@ -0,0 +1,108 @@
+.\" cp1047.tmac
+.\"
+.do nr *groff_cp1047_tmac_C \n[.cp]
+.cp 0
+.\" char65 (no-break space) is translated on input
+.trin \[char66]\[^a]
+.trin \[char67]\[:a]
+.trin \[char68]\[`a]
+.trin \[char69]\['a]
+.trin \[char70]\[~a]
+.trin \[char71]\[oa]
+.trin \[char72]\[,c]
+.trin \[char73]\[~n]
+.trin \[char74]\[ct]
+.trin \[char81]\['e]
+.trin \[char82]\[^e]
+.trin \[char83]\[:e]
+.trin \[char84]\[`e]
+.trin \[char85]\['i]
+.trin \[char86]\[^i]
+.trin \[char87]\[:i]
+.trin \[char88]\[`i]
+.trin \[char89]\[ss]
+.trin \[char98]\[^A]
+.trin \[char99]\[:A]
+.trin \[char100]\[`A]
+.trin \[char101]\['A]
+.trin \[char102]\[~A]
+.trin \[char103]\[oA]
+.trin \[char104]\[,C]
+.trin \[char105]\[~N]
+.trin \[char106]\[bb]
+.trin \[char112]\[/o]
+.trin \[char113]\['E]
+.trin \[char114]\[^E]
+.trin \[char115]\[:E]
+.trin \[char116]\[`E]
+.trin \[char117]\['I]
+.trin \[char118]\[^I]
+.trin \[char119]\[:I]
+.trin \[char120]\[`I]
+.trin \[char128]\[/O]
+.trin \[char138]\[Fo]
+.trin \[char139]\[Fc]
+.trin \[char140]\[Sd]
+.trin \[char141]\['y]
+.trin \[char142]\[Tp]
+.trin \[char143]\[t+-]
+.trin \[char144]\[de]
+.trin \[char154]\[Of]
+.trin \[char155]\[Om]
+.trin \[char156]\[ae]
+.trin \[char157]\[ac]
+.trin \[char158]\[AE]
+.trin \[char159]\[Cs]
+.trin \[char160]\[mc]
+.trin \[char170]\[r!]
+.trin \[char171]\[r?]
+.trin \[char172]\[-D]
+.trin \[char174]\[TP]
+.trin \[char175]\[rg]
+.trin \[char176]\[tno]
+.trin \[char177]\[Po]
+.trin \[char178]\[Ye]
+.trin \[char179]\[pc]
+.trin \[char180]\[co]
+.trin \[char181]\[sc]
+.trin \[char182]\[ps]
+.trin \[char183]\[14]
+.trin \[char184]\[12]
+.trin \[char185]\[34]
+.trin \[char186]\['Y]
+.trin \[char187]\[ad]
+.trin \[char188]\[a-]
+.trin \[char190]\[aa]
+.trin \[char191]\[tmu]
+.\" char202 (soft hyphen) is translated on input
+.trin \[char203]\[^o]
+.trin \[char204]\[:o]
+.trin \[char205]\[`o]
+.trin \[char206]\['o]
+.trin \[char207]\[~o]
+.trin \[char218]\[S1]
+.trin \[char219]\[^u]
+.trin \[char220]\[:u]
+.trin \[char221]\[`u]
+.trin \[char222]\['u]
+.trin \[char223]\[:y]
+.trin \[char225]\[tdi]
+.trin \[char234]\[S2]
+.trin \[char235]\[^O]
+.trin \[char236]\[:O]
+.trin \[char237]\[`O]
+.trin \[char238]\['O]
+.trin \[char239]\[~O]
+.trin \[char250]\[S3]
+.trin \[char251]\[^U]
+.trin \[char252]\[:U]
+.trin \[char253]\[`U]
+.trin \[char254]\['U]
+.cp \n[*groff_cp1047_tmac_C]
+.do rr *groff_cp1047_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/cs.tmac b/tmac/cs.tmac
new file mode 100644
index 0000000..725c1cf
--- /dev/null
+++ b/tmac/cs.tmac
@@ -0,0 +1,214 @@
+.\" Czech localization for groff
+.\"
+.\" Copyright (C) 2007-2022 Free Software Foundation, Inc.
+.\" Written by Marcela Ma¹láòová (mmaslano@redhat.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 3 of the License, 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 this program. If not, see
+.\" <http://www.gnu.org/licenses/>.
+.\"
+.\" Please send comments to mmaslano@redhat.com.
+.
+.do nr *groff_cs_tmac_C \n[.cp]
+.cp 0
+.
+.
+.\" If changing from an existing locale, we need to preserve the state
+.\" of the "suppress hyphenation before a page location trap" bit.
+.nr locale*use-trap-hyphenation-mode 0
+.if d locale \
+. if \n[.hy]=\n[\*[locale]*hyphenation-mode-trap] \
+. nr locale*use-trap-hyphenation-mode 1
+.
+.
+.ds locale czech\"
+.
+.
+.\" Predefined text translations
+.
+.ds \*[locale]-abstract ABSTRAKT\"
+.ds \*[locale]-app DODATEK\"
+.ds \*[locale]-appendix_string Dodatek\"
+.ds \*[locale]-april Duben\"
+.ds \*[locale]-attribute_string z\"
+.ds \*[locale]-august Øíjen\"
+.ds \*[locale]-chapter_string Kapitola\"
+.ds \*[locale]-december Prosinec\"
+.ds \*[locale]-draft_string Koncept\"
+.ds \*[locale]-endnote_string POZNÁMKY\"
+.ds \*[locale]-february Únor\"
+.ds \*[locale]-finis_string KONEC\"
+.ds \*[locale]-friday Pátek\"
+.ds \*[locale]-january Leden\"
+.ds \*[locale]-july Èervenec\"
+.ds \*[locale]-june Èerven\"
+.ds \*[locale]-le SEZNAM ROVNIC\"
+.ds \*[locale]-letapp LICENCE\"
+.ds \*[locale]-letat ADRESÁT:\"
+.ds \*[locale]-letcn DÙVÌRNÌ\"
+.ds \*[locale]-letdate Datum\"
+.ds \*[locale]-letfc S úctou,\"
+.ds \*[locale]-letns!0 Kopie\"
+.ds \*[locale]-letns!1 Kopie (pøíjemci)\"
+.ds \*[locale]-letns!10 Kopie (pøíjemcùm)\"
+.ds \*[locale]-letns!11 Kopie (bez pøíjemcù) \[a `]\"
+.ds \*[locale]-letns!12 Shrnutí\"
+.ds \*[locale]-letns!13 Celková zpráva\"
+.ds \*[locale]-letns!14 Cc:\"
+.ds \*[locale]-letns!2 Kopie (bez pøíjemce)\"
+.ds \*[locale]-letns!3 Dodatek\"
+.ds \*[locale]-letns!4 Dodatky\"
+.ds \*[locale]-letns!5 Pøíloha\"
+.ds \*[locale]-letns!6 Pøílohy\"
+.ds \*[locale]-letns!7 Separátní\"
+.ds \*[locale]-letns!8 Dopis\"
+.ds \*[locale]-letns!9 Zpráva\"
+.ds \*[locale]-letns!copy Kopie \" (neodstraòovat mezeru)\"
+.ds \*[locale]-letns!to " pro\"
+.ds \*[locale]-letrn Vzhldem k:\"
+.ds \*[locale]-letsa Do vlastních rukou:\"
+.ds \*[locale]-letsj TÉMA:\"
+.ds \*[locale]-lf REJSTØÍK ILUSTRACÍ\"
+.ds \*[locale]-licon REJSTØÍK\"
+.ds \*[locale]-liec Citace\"
+.ds \*[locale]-liex Dokument\"
+.ds \*[locale]-lifg Ilustrace\"
+.ds \*[locale]-litb Tabulka\"
+.ds \*[locale]-lt REJSTØÍK TABULEK\"
+.ds \*[locale]-lx REJSTØÍK DOKUMENTÙ\"
+.ds \*[locale]-man-section1 Manuál u¾ivatelských pøíkazù\"
+.ds \*[locale]-man-section2 Manuál systémových volání\"
+.ds \*[locale]-man-section3 Manuál funkcí knihovny\"
+.ds \*[locale]-man-section4 Manuál rozhraní jádra\"
+.ds \*[locale]-man-section5 Manuál pro formáty souborù\"
+.ds \*[locale]-man-section6 Herní manuál\"
+.ds \*[locale]-man-section7 Rùzné informaèní manuál\"
+.ds \*[locale]-man-section8 Manuál správce systému\"
+.ds \*[locale]-man-section9 Manuál vývojáøe jádra\"
+.ds \*[locale]-march Bøezen\"
+.ds \*[locale]-may Kvìten\"
+.ds \*[locale]-monday Pondìlí\"
+.ds \*[locale]-november Listopad\"
+.ds \*[locale]-october Øíjen\"
+.ds \*[locale]-paper A4\"
+.ds \*[locale]-qrf Viz. kapitola\~\\*[Qrfh], stránka\~\\*[Qrfp].\"
+.ds \*[locale]-references Literatura\"
+.ds \*[locale]-revision_string Rev.\"
+.ds \*[locale]-rp LITERATURA\"
+.ds \*[locale]-saturday Sobota\"
+.ds \*[locale]-september Záøí\"
+.ds \*[locale]-sunday Nedìle\"
+.ds \*[locale]-thursday Ètvrtek\"
+.ds \*[locale]-toc Seznam literatury\"
+.ds \*[locale]-toc_header_string Seznam literatury\"
+.ds \*[locale]-tuesday Úterý\"
+.ds \*[locale]-wednesday Støeda\"
+.
+.
+.\" Activate the translations
+.
+.mso trans.tmac
+.
+.
+.\" ms package
+.if r GS \{\
+. \" update the date
+. ds DY \n[dy] \*[MO] \n[year]
+. \" set hyphenation flags
+. nr HY 2
+.\}
+.
+.
+.\" mm package
+.if d PH \{\
+. \" update the date with the new strings
+. ds cov*new-date \\n[dy] \\*[MO\\n[mo]] \\n[year]
+.
+. \" ISODATE and DT update
+. de ISODATE
+. 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 \\n[dy] \\*[MO\\n[mo]] \\n[year]
+. el \
+. ds cov*new-date \\n[year]-\\n[cov*mm]-\\n[cov*dd]
+. .
+.
+. als DT cov*new-date
+.\}
+.
+.
+.\" Default encoding
+.mso latin2.tmac
+.
+.ss 12 0
+.
+.\" Set up hyphenation.
+.
+.\" Czech hyphenation (\lefthyphenmin=2, \righthyphenmin=2)
+.nr \*[locale]*hyphenation-mode-base 1
+.nr \*[locale]*hyphenation-mode-trap 2
+.
+.ie \n[locale*use-trap-hyphenation-mode] \
+. hy \n[\*[locale]*hyphenation-mode-trap]
+.el \
+. hy \n[\*[locale]*hyphenation-mode-base]
+.
+.rr locale*use-trap-hyphenation-mode
+.
+.hcode á á Á á
+.hcode è è È è
+.hcode ï ï Ï ï
+.hcode é é É é
+.hcode ì ì Ì ì
+.hcode í í Í í
+.hcode ò ò Ò ò
+.hcode ó ó Ó ó
+.hcode ø ø Ø ø
+.hcode ¹ ¹ © ¹
+.hcode » » « »
+.hcode ú ú Ú ú
+.hcode ù ù Ù ù
+.hcode ý ý Ý ý
+.hcode ¾ ¾ ® ¾
+.
+.hla cs
+.hpf hyphen.cs
+.hpfa hyphenex.cs
+.
+.
+.\" man package
+.if d an \
+. an*reset-hyphenation-mode
+.
+.
+.\" me package
+.if d @R \{\
+. ds _td_format \En(dy \E*(mo \En(y4
+. ld
+.\}
+.
+.
+.cp \n[*groff_cs_tmac_C]
+.do rr *groff_cs_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" coding: latin-2
+.\" fill-column: 72
+.\" End:
+.\" vim: set fileencoding=iso-8859-2 filetype=groff textwidth=72:
diff --git a/tmac/de.tmac b/tmac/de.tmac
new file mode 100644
index 0000000..aaa97cb
--- /dev/null
+++ b/tmac/de.tmac
@@ -0,0 +1,218 @@
+.\" German localization for groff
+.\"
+.\" Copyright (C) 2006-2022 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 3 of the License, 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 this program. If not, see
+.\" <http://www.gnu.org/licenses/>.
+.\"
+.\" Please send comments to groff@gnu.org.
+.
+.do nr *groff_de_tmac_C \n[.cp]
+.cp 0
+.
+.
+.\" If changing from an existing locale, we need to preserve the state
+.\" of the "suppress hyphenation before a page location trap" bit.
+.nr locale*use-trap-hyphenation-mode 0
+.if d locale \
+. if \n[.hy]=\n[\*[locale]*hyphenation-mode-trap] \
+. nr locale*use-trap-hyphenation-mode 1
+.
+.
+.ds locale german\"
+.
+.
+.\" Predefined text translations
+.
+.ds \*[locale]-abstract Zusammenfassung\"
+.ds \*[locale]-app Anhang\"
+.ds \*[locale]-appendix_string Anhang\"
+.ds \*[locale]-april April\"
+.ds \*[locale]-attribute_string von\"
+.ds \*[locale]-august August\"
+.ds \*[locale]-chapter_string Kapitel\"
+.ds \*[locale]-december Dezember\"
+.ds \*[locale]-draft_string Entwurf\"
+.ds \*[locale]-endnote_string Bemerkungen\"
+.ds \*[locale]-february Februar\"
+.ds \*[locale]-finis_string Ende\"
+.ds \*[locale]-friday Freitag\"
+.ds \*[locale]-january Januar\"
+.ds \*[locale]-july Juli\"
+.ds \*[locale]-june Juni\"
+.ds \*[locale]-le Verzeichnis der Gleichungen\"
+.ds \*[locale]-letapp Genehmigt:\"
+.ds \*[locale]-letat An\"
+.ds \*[locale]-letcn Vertraulich\"
+.ds \*[locale]-letdate Datum\"
+.ds \*[locale]-letfc Hochachtungsvoll\"
+.ds \*[locale]-letns!0 Kopie an\"
+.ds \*[locale]-letns!1 Kopie (mit Anhang) an\"
+.ds \*[locale]-letns!10 Kopie (mit Anhängen) an\"
+.ds \*[locale]-letns!11 Kopie (ohne Anhänge) an\"
+.ds \*[locale]-letns!12 Nur Zusammenfassung an\"
+.ds \*[locale]-letns!13 Kompletter Bericht an\"
+.ds \*[locale]-letns!14 Cc:\"
+.ds \*[locale]-letns!2 Kopie (ohne Anhang) an\"
+.ds \*[locale]-letns!3 Anhang\"
+.ds \*[locale]-letns!4 Anhänge\"
+.ds \*[locale]-letns!5 Beilage\"
+.ds \*[locale]-letns!6 Beilagen\"
+.ds \*[locale]-letns!7 Separat\"
+.ds \*[locale]-letns!8 Brief an\"
+.ds \*[locale]-letns!9 Bericht an\"
+.ds \*[locale]-letns!copy Kopie \" don't remove the space!)
+.ds \*[locale]-letns!to " an\"
+.ds \*[locale]-letrn In Bezug auf:\"
+.ds \*[locale]-letsa An die zuständige Abteilung:\"
+.ds \*[locale]-letsj Betreff:\"
+.ds \*[locale]-lf Verzeichnis der Abbildungen\"
+.ds \*[locale]-licon Inhalt\"
+.ds \*[locale]-liec Gleichung\"
+.ds \*[locale]-liex Beleg\"
+.ds \*[locale]-lifg Abbildung\"
+.ds \*[locale]-litb Tabelle\"
+.ds \*[locale]-lt Verzeichnis der Tabellen\"
+.ds \*[locale]-lx Verzeichnis der Belege\"
+.ds \*[locale]-man-section1 Handbuch für allgemeine Befehle\"
+.ds \*[locale]-man-section2 Handbuch für Systemaufrufe\"
+.ds \*[locale]-man-section3 Handbuch zu Bibliotheksfunktionen\"
+.ds \*[locale]-man-section4 Handbuch zu Kernel-Schnittstellen\"
+.ds \*[locale]-man-section5 Handbuch zu Dateiformaten\"
+.ds \*[locale]-man-section6 Spielehandbuch\"
+.ds \*[locale]-man-section7 Sonstiges Informationshandbuch\"
+.ds \*[locale]-man-section8 Handbuch des Systemmanagers\"
+.ds \*[locale]-man-section9 Handbuch für Kernel-Entwickler\"
+.ds \*[locale]-march März\"
+.ds \*[locale]-may Mai\"
+.ds \*[locale]-monday Montag\"
+.ds \*[locale]-november November\"
+.ds \*[locale]-october Oktober\"
+.ds \*[locale]-paper A4\"
+.ds \*[locale]-qrf Siehe Kapitel\~\\*[Qrfh], Seite\~\\*[Qrfp].\"
+.ds \*[locale]-references Literaturverzeichnis\"
+.ds \*[locale]-revision_string Rev.\"
+.ds \*[locale]-rp Literaturverzeichnis\"
+.ds \*[locale]-saturday Samstag\"
+.ds \*[locale]-september September\"
+.ds \*[locale]-sunday Sonntag\"
+.ds \*[locale]-thursday Donnerstag\"
+.ds \*[locale]-toc Inhaltsverzeichnis\"
+.ds \*[locale]-toc_header_string Inhaltsverzeichnis\"
+.ds \*[locale]-tuesday Dienstag\"
+.ds \*[locale]-wednesday Mittwoch\"
+.
+.
+.\" Activate the translations
+.
+.mso trans.tmac
+.
+.
+.\" ms package
+.if r GS \{\
+. \" update the date
+. ds DY \n[dy].\~\*[MO] \n[year]
+. \" set hyphenation flags
+. nr HY 2
+.\}
+.
+.
+.\" mm package
+.if d PH \{\
+. \" update the date with the new strings
+. ds cov*new-date \\n[dy].\& \\*[MO\\n[mo]] \\n[year]
+.
+. \" ISODATE and DT update
+. de ISODATE
+. 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 \\n[dy].\~\\*[MO\\n[mo]] \\n[year]
+. el \
+. ds cov*new-date \\n[year]-\\n[cov*mm]-\\n[cov*dd]
+. .
+.
+. als DT cov*new-date
+.\}
+.
+.
+.\" Default encoding
+.mso latin1.tmac
+.
+.ss 12 0
+.
+.\" Set up hyphenation.
+.
+.\" German hyphenation (\lefthyphenmin=2, \righthyphenmin=2)
+.nr \*[locale]*hyphenation-mode-base 1
+.nr \*[locale]*hyphenation-mode-trap 2
+.
+.ie \n[locale*use-trap-hyphenation-mode] \
+. hy \n[\*[locale]*hyphenation-mode-trap]
+.el \
+. hy \n[\*[locale]*hyphenation-mode-base]
+.
+.rr locale*use-trap-hyphenation-mode
+.
+.hcode ä ä â â à à á á ã ã å å æ æ
+.hcode ç ç
+.hcode é é è è ë ë ê ê
+.hcode í í ì ì î î ï ï
+.hcode ñ ñ
+.hcode ó ó ò ò ô ô ö ö ø ø
+.hcode ú ú ü ü û û
+.
+.hcode Ä ä Â â À à Á á Ã ã Å å Æ æ
+.hcode Ç ç
+.hcode É é È è Ë ë Ê ê
+.hcode Í í Ì ì Î î Ï ï
+.hcode Ñ ñ
+.hcode Ó ó Ò ò Ô ô Ö ö Ø ø
+.hcode Ú ú Ü ü Û û
+.
+.hcode ß ß
+.
+.hla de
+.ie r \*[locale]-new-hyphenation-patterns \
+. hpf hyphen.den
+.el \
+. hpf hyphen.det
+.
+.
+.\" man package
+.if d an \
+. an*reset-hyphenation-mode
+.
+.
+.\" me package
+.if d @R \{\
+. ds _td_format \En(dy.\~\E*(mo.\& \En(y4
+. ld
+.\}
+.
+.
+.cp \n[*groff_de_tmac_C]
+.do rr *groff_de_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" coding: latin-1
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/den.tmac b/tmac/den.tmac
new file mode 100644
index 0000000..813e15b
--- /dev/null
+++ b/tmac/den.tmac
@@ -0,0 +1,31 @@
+.\" German localization for groff (new orthography)
+.\"
+.\" Copyright (C) 2006-2020 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 3 of the License, 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 this program. If not, see
+.\" <http://www.gnu.org/licenses/>.
+.\"
+.\" Please send comments to groff@gnu.org.
+.
+.do nr german-new-hyphenation-patterns 1
+.do mso de.tmac
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/devtag.tmac b/tmac/devtag.tmac
new file mode 100644
index 0000000..8a6204a
--- /dev/null
+++ b/tmac/devtag.tmac
@@ -0,0 +1,124 @@
+.ig
+devtag.tmac - macro package for adding tags to roff documents.
+
+------------------------------------------------------------------------
+ Legalese
+------------------------------------------------------------------------
+
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2004-2020 Free Software Foundation, Inc.
+written by Gaius Mulley <gaius@glam.ac.uk>.
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+------------------------------------------------------------------------
+ Description
+------------------------------------------------------------------------
+
+A simple set of macros to provide markup devices (currently only
+grohtml) with tags that define the meaning of the formatted text and
+also basic formatting instructions. It generalizes the tag concept used
+within grohtml and in the future it is hoped that more markup based
+devices can capitalize on this work. It also clearly defines those tags
+which are honoured by grohtml. Note that not all tags are included
+here. Some of the grohtml specific tags (header specific and jobname,
+etc.) are called directly from within www.tmac. The tags defined here
+are reasonably generic and could be applied to other devices.
+..
+.
+.do if d DEVTAG-NH .nx
+.
+.do nr *groff_devtag_tmac_C \n[.cp]
+.cp 0
+.
+.\" --------------------------------------------------------------------
+.\" DEVTAG <name>
+.\"
+.\" Emit a tag <name>
+.\"
+.de1 DEVTAG
+. tag devtag:\\$*
+..
+.\" --------------------------------------------------------------------
+.\" DEVTAG-NEXT <name>
+.\"
+.\" When the troff state changes, emit tag <name>
+.\"
+.de1 DEVTAG-NEXT
+. taga devtag:\\$*
+..
+.
+.\" --------------------------------------------------------------------
+.\" SH <level>
+.\" NH <level>
+.\" tell device we are starting a numbered heading
+.\" Takes a single parameter <level>. <level> 1
+.\" is the outer most level.
+.
+.de1 DEVTAG-NH
+. DEVTAG ".NH \\$1"
+..
+.als DEVTAG-SH DEVTAG-NH
+.
+.\" --------------------------------------------------------------------
+.\" COL <n>
+.\" indicate that the following text is aligned for the column <n>
+.\" n: [1..MAX(n)]
+.
+.de1 DEVTAG-COL
+. DEVTAG ".col \\$1"
+..
+.
+.\" --------------------------------------------------------------------
+.\" EO-H
+.\" indicate that a header has finished.
+.
+.de1 DEVTAG-EO-H
+. DEVTAG ".eo.h"
+..
+.\" --------------------------------------------------------------------
+.\" EO-TL
+.\" indicate that a title has finished.
+.
+.de1 DEVTAG-EO-TL
+. DEVTAG ".eo.tl"
+..
+.\" --------------------------------------------------------------------
+.\" TL
+.\" indicate that the following text forms a title.
+.
+.de1 DEVTAG-TL
+. DEVTAG ".tl"
+..
+.
+.\" --------------------------------------------------------------------
+.\" COL-NEXT <n>
+.\" emit a column tag just before the next glyph.
+.
+.de1 DEVTAG-COL-NEXT
+. DEVTAG-NEXT ".col \\$1"
+..
+.
+.
+.cp \n[*groff_devtag_tmac_C]
+.do rr *groff_devtag_tmac_C
+.
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/doc-old.tmac b/tmac/doc-old.tmac
new file mode 100644
index 0000000..e6bd74f
--- /dev/null
+++ b/tmac/doc-old.tmac
@@ -0,0 +1,1862 @@
+.\" Copyright (c) 1990 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in
+.\" the documentation and/or other materials provided with the
+.\" distribution.
+.\" 3. [Deleted. See
+.\" ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change]
+.\" 4. Neither the name of the University nor the names of its
+.\" contributors may be used to endorse or promote products derived
+.\" from this software without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS"
+.\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+.\" PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
+.\" CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)doc-old.tmac 5.2 (Berkeley) 3/13/91
+.\" Slightly modified by jjc@jclark.com to work with groff as well.
+.\"
+.\" Assume nroff on crt's only if cR==1
+.if n .nr cR 1
+.\" STRING CONSTANTS
+.\" DITROFF
+.if t \{\
+.\" Address Style
+.ds aD \fI
+.\" Argument Reference Style
+.ds aR \f(CO
+.\" Interactive Command Modifier (flag)
+.ds cM \f(CB
+.\" Emphasis (in the English sense - usually italics)
+.ds eM \fI
+.\" Errno Style
+.ds eR \fC
+.\" Environment Variable Style
+.ds eV \fC
+.\" Command Line Flag Style
+.ds fL \f(CB
+.\" Header String Style
+.ds Hs \fR
+.\" Interactive Command Style
+.ds iC \f(CB
+.\" Literal Style
+.ds lI \fC
+.\" Left Parenthesis Style
+.ds lP \fR\|(\|\fP
+.\" Right Parenthesis Style
+.ds rP \fR\|)\|\fP
+.\" Options Open Bracket Style
+.ds lB \fR\^[\^\fP
+.\" Options Open Bracket Style
+.ds rB \fR\^]\fP
+.\" Name (subject of manpage) Style
+.ds nM \f(CB
+.\" Pathname Style
+.ds pA \fC
+.\" Accepted punctuation string for -mdoc syntax
+.ds Pu \fR[.,:;(\^)[\^]\fR]
+.\" Section Header Style
+.ds Sp \s12\fB
+.\" .ds sT \s-2\fR
+.\" Symbolic Emphasis (boldface)
+.ds sY \f(CB
+.\" Generic Variable Style
+.ds vA \fI
+.\" Volume Title Style
+.ds Vs \fR
+.\" Cross Reference STyle (man page only)
+.ds xR \fC
+.\" Math *
+.tr *\(**
+.\}
+.\" NROFF
+.if n \{\
+.\" Address Style
+.ds aD \fI
+.\" Argument Reference Style
+.ds aR \fI
+.\" Interactive Command Modifier (flag)
+.ds cM \fB
+.\" Emphasis (in the English sense - usually italics)
+.ds eM \fI
+.\" Errno Style
+.ds eR \fR
+.\" Environment Variable Style
+.ds eV \fR
+.\" Command Line Flag Style
+.ds fL \fB
+.\" Header String Style
+.ds Hs \fR
+.\" Interactive Command Style
+.ds iC \fB
+.\" Literal Style
+.ds lI \fR
+.\" Left Parenthesis Style
+.ds lP \fR\|(\fP
+.\" Right Parenthesis Style
+.ds rP \fR\|)\fP
+.\" Options Open Bracket Style
+.ds lB \fR\|[\|\fP
+.\" Options Open Bracket Style
+.ds rB \fR\|]\fP
+.\" Name (subject of manpage) Style
+.ds nM \fB
+.\" Pathname Style
+.ds pA \fI
+.\" Accepted punctuation string for -mdoc syntax
+.ds Pu [.,;:()[]]
+.\" Section Header Style
+.ds Sp \s12\fB
+.\" .ds sT \s-2\fR
+.\" .ds sT \s-2\fR
+.\" Symbol, Mode or Mask Style
+.ds sY \fB
+.\" Generic Variable Style
+.ds vA \fI
+.\" Volume Title Style
+.ds Vs \fR
+.\" Cross Reference Style (man page only)
+.ds xR \fR
+.\}
+.\" INDENTS - Subheaders(sI), Text(Ti) between Section Headers and Subsects
+.if t \{\
+. nr sI \w'\fC,'u*5
+. nr Ti \n(sIu
+.\}
+.if n \{\
+. nr sI .5i
+. nr Ti .5i
+.\}
+.\" Flags for macros names which are used only for .Ds
+.nr dI 6n
+.nr dC 1
+.nr dL 1
+.nr dR 1
+.\" INDENT WIDTHS (for Lists)
+.\" Width Needed for Address Tag (indented amount)
+.nr Ad 12n
+.\" Angle Quote Width
+.nr Aq 12n
+.\" Width Needed for Argument
+.nr Ar 12n
+.\" Width Needed for Column offset
+.nr Cl 15n
+.\" Width needed for Interactive Command Modifier
+.nr Cm 10n
+.\" Width Needed for Complex Expressions
+.nr Cx 20n
+.\" Indent Width Needed for Display (right and left margins)
+.nr Ds 6n
+.\" Double Quote Width
+.nr Dq 12n
+.\" tI is dependent on Ds and used by .Dp
+.nr tI \n(Dsu
+.\" Width Needed for Display
+.nr Em 10n
+.\" Width Needed for Errno Types
+.nr Er 15n
+.\" Width Needed for Environment Variables
+.nr Ev 15n
+.\" Width Needed for Example Indent
+.nr Ex 10n
+.\" Width Needed for Flag
+.nr Fl 10n
+.\" Width Needed for Function
+.nr Fn 16n
+.\" Width needed for Interactive Command Name
+.nr Ic 10n
+.\" Width Needed for Constant
+.nr Li 16n
+.\" Width Needed for Math Symbol ? not sure if needed
+.nr Ms 6n
+.\" Width Needed for Name
+.nr Nm 10n
+.\" Width Needed for Option Begin
+.nr Ob 14n
+.\" Width Needed for Option End
+.nr Oe 14n
+.\" Width Needed for Option (one line)
+.nr Op 14n
+.\" Width Needed for Pathname
+.nr Pa 32n
+.\" Parenthesis Quote Width
+.nr Pq 12n
+.\" Single Quote Width
+.nr Sq 12n
+.\" Width Needed for Symbols, Modes or Masks
+.nr Sy 6n
+.\" Width needed for default or unknown text width
+.nr Tx 22n
+.\" Width Needed for Generic Variable
+.nr Va 12n
+.\" Width Needed for Cross Reference, should the cross ref be annotated.
+.nr Xr 10n
+.\" PARAGRAPH SPACE
+.if t \{\
+. nr Pp .5v
+.\}
+.if n \{\
+. nr Pp 1v
+.\}
+.\" PAGE LAYOUT
+.\" .Li Tagged Paragraph Style - zero if break on oversized tag
+.\" one if add em space and continue filling line.
+.nr tP 0
+.\" Page Layout Macro
+.de pL
+.\" DITROFF
+.ie t \{\
+.\" Header Margin
+. nr Hm .5i
+.\" Footer Margin
+. nr Fm .5i
+.\" Line length
+. nr ll 5.5i
+.\" Line length
+. ll 5.5i
+.\" Title length
+. nr lt 5.5i
+.\" Title length
+. lt 5.5i
+.\" Page offset
+. nr po 1.56i
+.\" Page offset
+. po 1.56i
+.\" Vertical space distance (from Section headers/Lists/Subsections)
+. nr vV .5v
+.\" em space
+. ds tP \|\|\|\|\|\|
+.\}
+.el \{\
+.\" Line length
+. nr ll 78n
+. ll 78n
+.\" Title length
+. nr lt 78n
+.\" Title length
+. lt 78n
+.\" Page offset
+. nr po 0i
+.\" Page offset
+. po 0i
+.\" Vertical space distance (from Section headers/Lists/Subsections)
+. nr vV 1v
+.\" em space
+. ds tP \0\0
+.\" Test for crt
+. ie \\n(cR .nr Hm 0
+. el .nr Hm .5i
+.\" Footer Margin
+. nr Fm .5i
+.\}
+..
+.\" Adjustment mode
+.if n \{\
+.ad l
+.na
+..
+.\}
+.\" PREDEFINED STRINGS
+.if t \{\
+. ds <= \(<=
+. ds >= \(>=
+. ds Lq \&``
+. ds Rq \&''
+. ds ua \(ua
+. ds aa \(aa
+. ds ga \(ga
+. ds sR \(aa
+. ds sL \(ga
+.\}
+.if n \{\
+. ds <= \&<\&=
+. ds >= \&>\&=
+. ds Rq ''
+. ds Lq ``
+. ds ua ^
+. ds aa '
+. ds ga `
+. ds sL `
+. ds sR '
+.\}
+.\" Note: The distances from the bottom or top of the page are set
+.\" in headers (macro .hK): to -1.25 for troff, and -1.167 for nroff
+.\" bottoms, and top is 0.
+.\"
+.\" .Dt Document/manpage_title section/chapter volume
+.\" The \{ and \} is necessary as roff doesn't nest if-elses
+.\" properly, especially with .ds.
+.\" TODO: separate Dt into Dt, Ch and Vt for supp docs.
+.de Dt
+.ds dT UNTITLED
+.ds vT Local
+.ds cH Null
+.\" Volume and Section Number or Chapter Number
+.if !"\\$1"" .ds dT \\$1
+.if !"\\$2"" \{\
+. ds cH \\$2
+. if "\\$3"" \{\
+. \" Volume Title if none given
+. if \\$2>=1 .if \\$2<=8 \{\
+. ds vT UNIX Reference Manual
+. if \\$2>1 .if \\$2<6 .ds vT UNIX Programmer's Manual
+. if "\\$2"8" .ds vT UNIX System Manager's Manual
+. \}
+. if "\\$2"unass" .ds vT DRAFT
+. if "\\$2"draft" .ds vT DRAFT
+. if "\\$2"paper" .ds vT Null
+. \}
+.\}
+.if !"\\$3"" \{\
+. \" Volume Title if given
+. if "\\$3"USD" .ds vT UNIX User's Supplementary Documents
+. if "\\$3"PS1" .ds vT UNIX Programmers's Supplementary Documents
+. if "\\$3"AMD" .ds vT UNIX Ancestral Manual Documents
+. if "\\$3"SMM" .ds vT UNIX System Manager's Manual
+. if "\\$3"URM" .ds vT UNIX Reference Manual
+. if "\\$3"PRM" .ds vT UNIX Programmers's Manual
+. if "\\$3"IND" .ds vT UNIX Manual Master Index
+. if "\\$3"CON" .ds vT UNIX Contributed Software Manual
+. if "\\$3"IMP" .ds vT UNIX Implementation Notes
+. if "\\$3"HOW" .ds vT UNIX How Pocket Manual
+. if "\\$3"LOCAL" .ds vT UNIX Local Manual
+. if "\\*(vT"Local" .ds vT \\$3
+.\}
+..
+.\"
+.\" .Os Operating System/Standard and Release or Version Number
+.\"
+.de Os
+.ds oS Null
+.if "\\$1"" \{\
+. ds oS \fIBSD Experimental\fP
+.\" . ds oS (\fIBag o' Bits\fP)
+.\}
+.if "\\$2"" \{\
+. ds o1 Non-Null
+.\}
+.if "\\$1"ATT" \{\
+. ds oS AT&T
+. if "\\$2"" .as oS \0UNIX
+. if "\\$2"7th" .as oS \07th Edition
+. if "\\$2"7" .as oS \07th Edition
+. if "\\$2"III" .as oS \0System III
+. if "\\$2"3" .as oS \0System III
+. if "\\$2"V" .as oS \0System V
+. if "\\$2"V.2" .as oS \0System V Release 2
+. if "\\$2"V.3" .as oS \0System V Release 3
+. if "\\$2"V.4" .as oS \0System V Release 4
+.\}
+.if "\\$1"BSD" \{\
+. if "\\$2"3" .ds oS 3rd Berkeley Distribution
+. if "\\$2"4" .ds oS 4th Berkeley Distribution
+. if "\\$2"4.1" .ds oS 4.1 Berkeley Distribution
+. if "\\$2"4.2" .ds oS 4.2 Berkeley Distribution
+. if "\\$2"4.3" .ds oS 4.3 Berkeley Distribution
+. if "\\$2"4.3+" .ds oS 4.3+tahoe Berkeley Distribution
+.\}
+.if "\\*(oS"Null" .ds oS \\$1
+.if "\\*(o1"Non-Null" .as oS \0\\$2
+.rm o1
+..
+.\"
+.\" Standards
+.\"
+.\" .de St
+.\" .ds sT Null
+.\" .if "\\$1"POSIX" \{\
+.\" . ds sT IEEE Standard POSIX
+.\" . if \\$2 .as sT \0\\$2
+.\" .\}
+.\" .if "\\$1"ANSI" \{\
+.\" . ds sT ANSI Standard
+.\" . if \\$2 .as sT \0\\$2
+.\" .\}
+.\" .if "\\$1"ISO" \{\
+.\" . ds sT ISO Standard
+.\" . if \\$2 .as sT \0\\$2
+.\" .\}
+.\" .if "\\*(sT"Null" .ds sR \\$3
+.\" ..
+.\"
+.\" .de Gp
+.\" .ie !"\\$1"" .ds gP \&\\$1 \\$2 \\$3 \\$4 \\$5
+.\" .el .ds gP Null
+.\" ..
+.\"
+.\"
+.de Dd
+.nr aa 0
+.ie \\n(.$>0 \{\
+. ie \\n(.$<4 \{\
+. ds dD \\$1 \\$2 \\$3
+. \}
+. el .tm Usage: .Dd Month Day, Year (e.g July 4, 1977).
+.\}
+.el \{\
+. ds dD Epoch
+.\}
+..
+.\"
+.\" House Keeping Macro - Make sense of dT, cH, vT, sT, gP and dS
+.\" TODO: Try to get else's for efficiency
+.\" TODO: GET RID OF .wh -1.167i (its in v7)
+.\"
+.\"
+.de hK
+.nr % 1
+.ds hT \\*(dT
+.if !"\\*(cH"Null" \{\
+. ie !"\\*(gP"Null" .as hT \|(\|\\*(cH\\*(gP\|)
+. el .as hT \\|(\\|\\*(cH\\|)
+.\}
+.if "\\*(cH"Null" .if !"\\*(gP"Null" .as hT \&\|(\|\\*(gP\|)
+.if t \{\
+. wh 0 hM
+. wh -1.25i fM
+.\}
+.if n \{\
+. ie \\n(cR \{\
+. hM
+. wh -0v fM
+. \}
+. el \{\
+. wh 0 hM
+. wh -1.167i fM
+. \}
+.\}
+.if n \{\
+. if \\n(nl==0:\\n(nl==-1 'bp
+.\}
+.if t 'bp
+.em lM
+..
+.\" Header Macro
+.\"
+.de hM
+.ev 1
+.pL
+.if !\\n(cR 'sp \\n(Hmu
+.tl @\\*(Hs\\*(hT\fP@\\*(Vs\\*(vT\fP@\\*(Hs\\*(hT\fP@
+'sp \\n(Hmu
+.ev
+..
+.\"
+.de fM
+.ev 1
+.pL
+.if !\\n(cR \{\
+' sp \\n(Fmu
+. tl @\\*(Hs\\*(oS\fP@\\*(Vs\\*(dD\fP@%@
+' bp
+.\}
+.if \\n(cR \{\
+.\" . tl @\\*(Hs\\*(oS\fP@\\*(Vs\\*(dD\fP@%@
+.\" ' bp
+.\}
+.ev
+..
+.de lM
+.fl
+.if \\n(cR \{\
+. fM
+. pl \\n(nlu
+.\}
+..
+.de Pp
+.sp \\n(Ppu
+.ne 2
+.ns
+..
+.de Lp
+.Pp
+..
+.de LP
+.tm Not a \-mdoc command: .LP
+..
+.de PP
+.tm Not a \-mdoc command: .PP
+..
+.de pp
+.tm Not a \-mdoc command: .pp
+..
+.de Co
+.tm Not a \-mdoc command: .Co
+..
+.nr z. 1
+.nr z, 1
+.nr z: 1
+.nr z; 1
+.nr z) 1
+.nr z( 1
+.nr z[ 1
+.nr z] 1
+.\" This is disgusting, troff not parse if stmt properly
+.nr z1 0
+.nr z2 0
+.nr z3 0
+.nr z4 0
+.nr z5 0
+.nr z6 0
+.nr z7 0
+.nr z8 0
+.nr z9 0
+.nr z0 0
+.nr z# 0
+.\"
+.de Ad
+.ie \\n(.$==0 \{\
+. tm Usage: .Ad address [...] \\*(Pu
+.\}
+.el \{\
+. ds sV \\*(aD
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.\" Command Line Argument Macro
+.\"
+.de Ar
+.ie \\n(.$==0 \{\
+. ie !"\\*(iM"" .as f1 \&[\|\\*(aRfile\ ...\fP\|]
+. el \&[\|\\*(aRfile\ ...\fP\|]
+.\}
+.el \{\
+. ds sV \\*(aR
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.de Em
+.ie \\n(.$==0 \{\
+. tm Usage: .Em text ... \\*(Pu
+.\}
+.el \{\
+. ds sV \\*(eM
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.de Er
+.ie \\n(.$==0 \{\
+. tm Usage: .Er ERRNOTYPE ... \\*(Pu
+. \}
+.el \{\
+. ds sV \\*(eR
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.de Ev
+.ie \\n(.$==0 \{\
+. tm Usage: .Ev ENVIRONMENT_VARIABLE(s) ... \\*(Pu
+. \}
+.el \{\
+. ds sV \\*(eV
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.\" Flag Name Macro
+.\"
+.de Fl
+.ie \\n(.$==0 \{\
+. ie !"\\*(iM"" .as f1 \&\\*(fL\-\fP
+. el \&\\*(fL\-\fP
+.\}
+.el \{\
+. nr rZ 0
+. sW \\$1
+. if (\\n(sW==1&\\n(.$==1) .rZ \\$1
+. ds sV \\*(fL
+. nr cF \\n(.f
+. ie \\n(rZ \{\
+. ie "\\*(iM"" .ds f1 \&\\*(sV\-\f\\n(cF\\$1
+. el \&\\*(sV\-\f\\n(cF\\$1
+. \}
+. el \{\
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. fB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+. \}
+.\}
+..
+.\" Interactive Commands Macro
+.\"
+.de Ic
+.ie \\n(.$==0 \{\
+. tm Usage: .Ic Interactive Commands(s) ... \\*(Pu
+.\}
+.el \{\
+. ds sV \\*(iC
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.\" Interactive Command Modifiers (flags)
+.\"
+.de Cm
+.ie \\n(.$==0 \{\
+. tm Usage: .Cm Interactive Command Modifier(s) ... \\*(Pu
+.\}
+.el \{\
+. ds sV \\*(cM
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.de Li
+.ie \\n(.$==0 \{\
+. tm Usage: .Li literal ... \\*(Pu
+. \}
+.el \{\
+. ds sV \\*(lI
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\" If in nroff or any other case where the default font
+.\" is constant width, and literal means zilch, single quote instead.
+.ie n \{\
+.de Ql
+. ie \\n(.$==0 \{\
+. tm Usage: .Ql literal ... \\*(Pu
+. \}
+. el \{\
+. Sq \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. \}
+..
+.\}
+.el \{\
+.de Ql
+. ie \\n(.$==0 \{\
+. tm Usage: .Ql literal ... \\*(Pu
+. \}
+. el \{\
+. Li \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. \}
+..
+.\}
+.\"
+.de Nm
+.ie \\n(.$==0 \{\
+. if "\\*(n1"" .tm Usage: .Nm Name(s) ... \\*(Pu
+. ie !"\\*(iM"" .as f1 \&\\*(nM\\*(n1\\$1\fP
+. el \&\\*(nM\\*(n1\\$1\fP
+.\}
+.el \{\
+. ds sV \\*(nM
+. nr cF \\n(.f
+. if \\n(nS \{\
+. rs
+. in -\\n(iSu
+. ie \\n(nS>1 .br
+. el \{\
+. sW \\$1
+. nr iS ((\\n(sW+1)*\\n(fW)u
+. \}
+. in +\\n(iSu
+. ti -\\n(iSu
+. nr nS \\n(nS+1
+. \}
+. if "\\*(n1"" .ds n1 \\$1
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.de Pa
+.ie \\n(.$==0 \{\
+\&\\*(pA~\fP
+.\}
+.el \{\
+. ds sV \\*(pA
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.de Sy
+.ie \\n(.$==0 \{\
+. tm Usage: .Sy Symbolic Text ... \\*(Pu
+. \}
+.el \{\
+. ds sV \\*(sY
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.de Ms
+.ie \\n(.$==0 \{\
+. tm Usage: .Ms Math Symbol ... \\*(Pu
+. \}
+.el \{\
+. ds sV \\*(sY
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.de Va
+.ie \\n(.$==0 \{\
+. tm Usage: .Va variable_name(s) ... \\*(Pu
+.\}
+.el \{\
+. ds sV \\*(vA
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.de nB
+.hy 0
+.if \\n(.$==0 .tm Usage error: called with empty arguments (empty quotes)?
+.ie \\n(.$>1 \{\
+. rZ \\$1
+. ie \\n(rZ .as f1 \&\f\\n(cF\\$1\fP
+. el .as f1 \&\\$1
+. rZ \\$2
+. if !\\n(rZ \{\
+. ie !"\\*(iM""\{\
+.\" I surrender
+. if "\\*(iM"Tp" .as f1 \&\ \&
+. if "\\*(iM"Dp" .as f1 \&\ \&
+. if "\\*(iM"Op" .as f1 \&\ \&
+. if "\\*(iM"Cx" .as f1 \&\ \&
+. if "\\*(iM"Dq" .as f1 \& \&
+. if "\\*(iM"Sq" .as f1 \& \&
+. if "\\*(iM"Pq" .as f1 \& \&
+. if "\\*(iM"Aq" .as f1 \& \&
+. \}
+. el .as f1 \& \&
+. \}
+. nB \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+.\}
+.el \{\
+. rZ \\$1
+. ie \\n(rZ .as f1 \&\f\\n(cF\\$1
+. el .as f1 \&\\$1\f\\n(cF
+. if "\\*(iM"" \{\&\\*(f1
+. ds f1
+. \}
+. hy
+.\}
+..
+.de fB
+.hy 0
+.if \\n(.$==0 .tm Usage error: called with empty arguments (empty quotes)?
+.ie \\n(.$>1 \{\
+. rZ \\$1
+. ie \\n(rZ .as f1 \&\f\\n(cF\\$1\fP
+. el \{\
+. ie "\\$1"-" .as f1 \&\-\-
+. el .as f1 \&\-\\$1
+. \}
+. rZ \\$2
+. if !\\n(rZ \{\
+. ie !"\\*(iM""\{\
+.\" I surrender
+. if "\\*(iM"Tp" .as f1 \&\ \&
+. if "\\*(iM"Dp" .as f1 \&\ \&
+. if "\\*(iM"Op" .as f1 \&\ \&
+. if "\\*(iM"Cx" .as f1 \&\ \&
+. if "\\*(iM"Dq" .as f1 \& \&
+. if "\\*(iM"Sq" .as f1 \& \&
+. if "\\*(iM"Pq" .as f1 \& \&
+. if "\\*(iM"Aq" .as f1 \& \&
+. \}
+. el .as f1 \& \&
+. \}
+. fB \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+.\}
+.el \{\
+. rZ \\$1
+. ie \\n(rZ .as f1 \&\f\\n(cF\\$1
+. el \{\
+. ie "\\$1"-" .as f1 \&\-\-\f\\n(cF
+. el .as f1 \&\-\\$1\f\\n(cF
+. \}
+. if "\\*(iM"" \{\&\\*(f1
+. ds f1
+. \}
+. hy
+.\}
+..
+.\"
+.\" Single quoted Items
+.\" eF, sB g[0-9] and f2
+.de Sq
+.nr eF 0
+.ie \\n(.$==0 \{\
+. ie "\\*(iM"" \&\\*(sL\&\\*sR
+. el .as f1 \&\\*(sL\&\\*(sR
+.\}
+.el \{\
+. ie "\\*(iM"" \{\
+. ds f1 \&\\*(sL
+. ds iM Sq
+. \}
+. el .as f1 \&\\*(sL
+. sB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ie \\n(eF>0 .\\*(g1 \\*(g2 \\*(g3 \\*(g4 \\*(g5 \\*(g6 \\*(g7 \\*(g8
+. el .as f1 \\*(g0
+. as f1 \\*(sR
+. if !"\\*(f2"" .as f1 \\*(f2
+. if "\\*(iM"Sq" \{\
+\&\\*(f1
+. ds f1
+. ds iM
+. \}
+. ds f2
+. rm g0 g1 g2 g3 g4 g5 g6 g7 g8 g9
+. nr eF 0
+.\}
+..
+.\"
+.\" Double quoted Items
+.de Dq
+.nr Ef 0
+.ie \\n(.$==0 \{\
+. ie "\\*(iM"" \&\\*(Lq\&\\*(Rq
+. el .as f1 \&\\*(Lq\&\\*(Rq
+.\}
+.el \{\
+. ie "\\*(iM"" \{\
+. ds f1 \&\\*(Lq
+. ds iM Dq
+. \}
+. el .as f1 \&\\*(Lq
+. Sb \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ie \\n(Ef>0 .\\*(k1 \\*(k2 \\*(k3 \\*(k4 \\*(k5 \\*(k6 \\*(k7 \\*(k8
+. el .as f1 \\*(k0
+. as f1 \\*(Rq
+. if !"\\*(f4"" .as f1 \\*(f4
+. if "\\*(iM"Dq" \{\
+\&\\*(f1
+. ds f1
+. ds iM
+. \}
+. ds f4
+. rm k0 k1 k2 k3 k4 k5 k6 k7 k8 k9
+. nr Ef 0
+.\}
+..
+.\"
+.\" Parenthesis quoted Items
+.de Pq
+.nr pQ 0
+.ie \\n(.$==0 \{\
+. ie "\\*(iM"" \&(\&)
+. el .as f1 \&(\&)
+.\}
+.el \{\
+. ie "\\*(iM"" \{\
+. ds f1 \&(
+. ds iM Pq
+. \}
+. el .as f1 \&(
+. pB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ie \\n(pQ>0 .\\*(y1 \\*(y2 \\*(y3 \\*(y4 \\*(y5 \\*(y6 \\*(y7 \\*(y8
+. el .as f1 \\*(y0
+. as f1 \&)
+. if !"\\*(f3"" .as f1 \\*(f3
+. if "\\*(iM"Pq" \{\
+\&\\*(f1
+. ds f1
+. ds iM
+. \}
+. ds f3
+. rm y0 y1 y2 y3 y4 y5 y6 y7 y8 y9
+. nr pQ 0
+.\}
+..
+.\" eF, sB g[0-9] and f2
+.de sB
+.hy 0
+.ie \\n(.$==0 .tm Sick Logic: macro sB
+.el \{\
+. ie \\n(eF>=1 .nr eF \\n(eF+1
+. el \{\
+. mN \\$1
+. if \\n(mN .nr eF \\n(eF+1
+. \}
+. rZ \\$1
+. ie \\n(rZ .as f2 \\$1
+. el \{\
+. ie \\n(eF<1 .as g\\n(eF \\$1
+. el .as g\\n(eF \\$1
+. \}
+. if \\n(.$>1 \{\
+. rZ \\$2
+. if \\n(rZ==0 \{\
+. if \\n(eF<1 \{\
+. as g\\n(eF \& \&
+. \}
+. \}
+. sB \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. \}
+.\}
+..
+.de Sb
+.hy 0
+.ie \\n(.$==0 .tm Sick Logic: macro Sb
+.el \{\
+. ie \\n(Ef>=1 .nr Ef \\n(Ef+1
+. el \{\
+. mN \\$1
+. if \\n(mN .nr Ef \\n(Ef+1
+. \}
+. rZ \\$1
+. ie \\n(rZ .as f4 \\$1
+. el \{\
+. ie \\n(Ef<1 .as k\\n(Ef \\$1
+. el .as k\\n(Ef \\$1
+. \}
+. if \\n(.$>1 \{\
+. rZ \\$2
+. if \\n(rZ==0 \{\
+. if \\n(Ef<1 \{\
+. as k\\n(Ef \& \&
+. \}
+. \}
+. Sb \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. \}
+.\}
+..
+.de pB
+.hy 0
+.ie \\n(.$==0 .tm Sick Logic: macro pB
+.el \{\
+. ie \\n(pQ>=1 .nr pQ \\n(pQ+1
+. el \{\
+. mN \\$1
+. if \\n(mN .nr pQ \\n(pQ+1
+. \}
+. rZ \\$1
+. ie \\n(rZ .as f3 \\$1
+. el \{\
+. ie \\n(pQ<1 .as y\\n(pQ \\$1
+. el .as y\\n(pQ \\$1
+. \}
+. if \\n(.$>1 \{\
+. rZ \\$2
+. if \\n(rZ==0 \{\
+. if \\n(pQ<1 \{\
+. as y\\n(pQ \& \&
+. \}
+. \}
+. pB \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. \}
+.\}
+..
+.de aQ
+.hy 0
+.ie \\n(.$==0 .tm Bad Syntax: .Aq
+.el \{\
+. ie \\n(aQ>=1 .nr aQ \\n(aQ+1
+. el \{\
+. mN \\$1
+. if \\n(mN .nr aQ \\n(aQ+1
+. \}
+. rZ \\$1
+. ie \\n(rZ .as aZ \\$1
+. el \{\
+. ie \\n(aQ<1 .as a\\n(aQ \\$1
+. el .as a\\n(aQ \\$1
+. \}
+. if \\n(.$>1 \{\
+. rZ \\$2
+. if \\n(rZ==0 \{\
+. if \\n(aQ<1 \{\
+. as a\\n(aQ \& \&
+. \}
+. \}
+. aQ \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. \}
+.\}
+..
+.\" Angle Bracket Quoted Items
+.de Aq
+.nr aQ 0
+.ie \\n(.$==0 \{\
+. ie "\\*(iM"" \&<\&>
+. el .as f1 \&<\&>
+.\}
+.el \{\
+. ie "\\*(iM"" \{\
+. ds f1 \&<
+. ds iM Aq
+. \}
+. el .as f1 \&<
+. aQ \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
+. ie \\n(aQ>0 .\\*(a1 \\*(a2 \\*(a3 \\*(a4 \\*(a5 \\*(a6 \\*(a7 \\*(a8
+. el .as f1 \\*(a0
+. as f1 \&>
+. if !"\\*(aZ"" .as f1 \\*(aZ
+. if "\\*(iM"Aq" \{\
+\&\\*(f1
+. ds f1
+. ds iM
+. \}
+. ds aZ
+. rm a0 a1 a2 a3 a4 a5 a6 a7 a8
+. nr aQ 0
+.\}
+..
+.\" macro Name test, return macro register value if true
+.if \n(.g .ig
+.de mN
+.nr mN 0
+.sW \\$1
+.if \\n(sW==2 \{\
+. if \\n(\\$1 .nr mN \\n(\\$1
+.\}
+..
+.if !\n(.g .ig
+.de mN
+.nr mN 0
+.if \A'\\$1' \{\
+. sW \\$1
+. if \\n(sW==2 \{\
+. if \\n(\\$1 .nr mN \\n(\\$1
+. \}
+.\}
+..
+.\" Punctuation test (using z registers), return 1 if true
+.if \n(.g .ig
+.de rZ
+.nr rZ 0
+.sW \\$1
+.if \\n(sW==1 \{\
+. if \\n(z\\$1==1 \{\
+. nr rZ 1
+. \}
+.\}
+..
+.if !\n(.g .ig
+.de rZ
+.nr rZ 0
+.if \A'\\$1' \{\
+. sW \\$1
+. if \\n(sW==1 \{\
+. if \\n(z\\$1==1 \{\
+. nr rZ 1
+. \}
+. \}
+.\}
+..
+.\"
+.\" sW returns number of characters in a string
+.if t \{\
+.nr fW \w'\fC,'
+.de sW
+.nr sW \w'\fC\\$1'
+.\}
+.if n \{\
+.nr fW \w'0'
+.de sW
+.nr sW \w'\\$1'
+.\}
+.ie \\n(sW>=\\n(fW \{\
+. ie \\n(sW%\\n(fW .nr sW (\\n(sW/\\n(fW)+1
+. el .nr sW \\n(sW/\\n(fW
+.\}
+.el .nr sW 0
+..
+.\" Option Expression -
+.\" TODO - add line overflow check (right!)
+.nr eP 0
+.ds e1
+.nr oE 0
+.nr hP 0
+.ds hP
+.nr Ep 0
+.de Op
+.hy 0
+.if "\\*(iM"" \{\
+. ds iM Op
+. ds f1 \&
+.\}
+.as f1 \&\\*(lB
+.\" .tm Op: \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+.dO \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+.ie !"\\$1"Cx" .oE
+.el .nr oE \\n(oE+1
+..
+.\"
+.\" just for mike, with every bite of garlic in mind (oops, i mean burp).
+.\" dO: go dOwn an argument vector and test each argument to see if
+.\" a macro name or punctuation. stash in respective place along
+.\" with its arguments.
+.nr oO 0
+.nr oP 0
+.nr aO 0
+.de dO
+.mN \\$1
+.ie \\n(mN \{\
+. if \\n(oP \{\
+. if \\n(hP \{\
+. nr oZ 1
+. oZ
+. Oz
+. \}
+. if \\n(e1==1 \{\
+.\\*(e1 \\*(e2 \\*(e3 \\*(e4 \\*(e5 \\*(e6 \\*(e7 \\*(e8 \\*(e9
+. \}
+. uO
+. if !(\\n(oO:\\n(aO) .as f1 \& \&
+. \}
+. ie "\\$1"Op" \{\
+. as f1 \&\\*(lB
+. nr aO \\n(aO+1
+. \}
+. el \{\
+. nr eP \\n(eP+1
+. ds e\\n(eP \\$1
+. nr e\\n(eP 1
+. \}
+.\}
+.el \{\
+.\" .tm dO: $1: \\$1: eP \\n(eP e[\\n(eP]: \\*(e\\n(ePEE
+. rZ \\$1
+. ie \\n(rZ \{\
+.\" .tm dO:rZ: $1: \\$1: eP \\n(eP e[\\n(eP]: \\*(e\\n(eP
+. nr hP \\n(hP+1
+. ds h\\n(hP \\$1
+. \}
+. el \{\
+.\" .tm dO:word $1: \\$1: eP \\n(eP e[\\n(eP]: \\*(e\\n(ePEE
+. if \\n(eP==0:\\n(e\\n(eP==1 .nr eP \\n(eP+1
+. if \\n(eZ .as e\\n(eP \& \&
+. as e\\n(eP " \&\\$1
+.\" . ds e\\n(eP \&\\$1
+. nr eZ \\n(eZ+1
+. \}
+.\}
+.nr oP 1
+.ie \\n(.$>1 \{\
+. dO \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+.\}
+.el \{\
+. ie \\n(e1 \{\
+.\\*(e1 \\*(e2 \\*(e3 \\*(e4 \\*(e5 \\*(e6 \\*(e7 \\*(e8 \\*(e9
+. \}
+. el \{\
+. as f1 \\*(e1
+. \}
+.\}
+..
+.\" handle old style arguments such as the arg -Idir
+.\" in adb, .Oo is a toggle.
+.de Oo
+.ie \\n(oO .nr oO 0
+.el .nr oO 1
+..
+.\" stash punctuation
+.de oZ
+.if \\n(hP>=\\n(oZ \{\
+. nr eP \\n(eP+1
+. ds e\\n(eP \\*(h\\n(oZ
+. nr oZ \\n(oZ+1
+. oZ
+.\}
+..
+.\" clean up punctuation vector
+.de Oz
+.if \\n(hP>0 \{\
+. rm h\\n(hP
+. nr hP \\n(hP-1
+. Oz
+.\}
+..
+.\" uO: go back up created vector cleaning it up along the way
+.de uO
+.if \\n(eP>0 \{\
+. rm e\\n(eP
+. rr e\\n(eP
+. nr eP \\n(eP-1
+. nr oP 0
+. nr eZ 0
+. uO
+.\}
+..
+.\" option end
+.de oE
+.uO
+.ie \\n(hP \{\
+. as f1 \\*(rB\\*(h1\\*(h2\\*(h3
+. Oz
+. nr oZ 0
+.\}
+.el \{\
+. as f1 \\*(rB
+.\}
+.ie "\\*(iM"Op" \{\
+. if \\n(aO .aO
+.if t \{\
+. if (\\n(.lu-\\n(.ku-\\n(.ou-(2*\\n(fWu))<\w'\fC\\*(f1'u .br
+.\}
+.if n \{\
+. nr aa \w'\\*(f1'u
+.\" . nr qq \\n(.lu-\\n(.ku-\\n(.ou
+.\" \&aa == \\n(aa, f1==\\*(f1, qq==\\n(qq
+. if (\\n(.lu-\\n(.ku-\\n(.ou-\\n(aau)<=(8*\\n(fWu) .br
+.\}
+\&\\*(f1
+. ds iM
+. ds f1
+. hy
+.\}
+.el .nr oE \\n(oE-1
+..
+.de aO
+.as f1 \\*(rB
+.nr aO \\n(aO-1
+.if \\n(aO >0 .aO
+..
+.\"
+.de Xr
+.if \\n(.$<=1 \{\
+. ie \\n(.$==1 \{\
+. if !"\\*(iM"" .as f1 \&\\*(xR\\$1\fP
+. if "\\*(iM"" \&\\*(xR\\$1\fP
+. \}
+. el .tm Xr Usage: .Xr manpage_name [section#] \\*(Pu
+.\}
+.if \\n(.$==2 \{\
+. rZ \\$2
+. ie "\\*(iM"" \{\
+. ie \\n(rZ \&\\*(xR\\$1\fP\\$2
+. el \&\\*(xR\\$1\fP(\\$2)
+. \}
+. el \{\
+. ie \\n(rZ .as f1 \&\\*(xR\\$1\fP\\$2
+. el .as f1 \&\\*(xR\\$1\fP(\\$2)
+. \}
+.\}
+.if \\n(.$>=3 \{\
+. rZ \\$2
+. ie \\n(rZ \{\
+. ie !"\\*(iM"" .as f1 \&\\*(xR\\$1\fP\\$2\\$3\\$4\\$5\\$6\\$7\\$8
+. el \&\\*(xR\\$1\fP\\$2\\$3\\$4\\$5\\$6\\$7\\$8
+. \}
+. el \{\
+. rZ \\$3
+. ie \\n(rZ \{\
+. if !"\\*(iM"" \{\
+. as f1 \&\\*(xR\\$1\fP(\\$2)\\$3\\$4\\$5\\$6\\$7\\$8
+. \}
+. if "\\*(iM"" \{\
+\&\\*(xR\\$1\fP(\\$2)\\$3\\$4\\$5\\$6\\$7\\$8
+. \}
+. \}
+. el \{\
+. tm rZ = \\n(rZ the arg is \\$3
+. tm Xr-XX Usage: .Xr manpage_name [section#] \\*(Pu
+. \}
+. \}
+.\}
+..
+.\"
+.\"
+.de Ex
+.tm Ex defunct, Use .Dl: \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+..
+.\" Display (one) Line of text.
+.de Dl
+.ie "\\*(iM"" \{\
+' ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i
+. in \\n(.iu+\\n(Dsu
+. mN \\$1
+. ie \\n(mN .\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. el \{\
+. nr cF \\n(.f
+.\" Literal font is none specified
+\&\\*(lI\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+. \}
+. in \\n(.iu-\\n(Dsu
+.\}
+.el \{\
+. mN \\$1
+. ie \\n(mN .\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
+. el \{\
+. nr cF \\n(.f
+. ds f1 \&\\*(lI\\&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
+. as f1 \&\f\\n(cF
+. \}
+.\}
+..
+.\"
+.\"
+.\" user set Tagged Paragraph Width (used in both Dp and Tp)
+.de Tw
+.ie \\n(.$==0 \{\
+. nr aa 0
+.\}
+.el \{\
+. mN \\$1
+. ie \\n(sW>2 \{\
+. nr tW (\\n(sW+3)*\\n(fWu)
+. \}
+. el \{\
+. ie \\n(mN .nr tW \\n(mN
+. el .nr tW \\$1
+. \}
+. nr tF 1
+.\}
+..
+.\"
+.de Dw
+.Tw \\$1
+..
+.\"
+.de Di
+.ie \\n(.$==0 \{\
+. nr tI \\n(Dsu
+.\}
+.el \{\
+. sW \\$1
+. if \\n(sW>=2 \{\
+. nr tI \\$1u
+. \}
+. if \\n(sW<2 \{\
+. if "\\$1"L" \{\
+. nr tI 0
+. \}
+. \}
+.\}
+..
+.\" tagged paragraph
+.\" initialize baby stack variables
+.nr np 0
+.nr p1 0
+.ds s\n(np
+.\"
+.de Tp
+.ie "\\$1"" .pE p s np
+.el \{\
+. ds iM Tp
+. mN \\$1
+. ie \\n(tF \{\
+. ds tC Tw
+. nr tC 1
+. nr tF 0
+. \}
+. el \{\
+. if !"Tw"\\*(s\\n(np" \{\
+. ie \\n(mN \{\
+. ds tC \\$1
+. nr tW \\n(mN
+. \}
+. el \{\
+. ds tC Tx
+. nr tW \\n(Tx
+. \}
+. if !"\\*(tC"\\*(s\\n(np" .nr tC 1
+. \}
+. \}
+. sp \\n(vVu
+. if !\\n(cR .ne 2
+. if \\n(tC \{\
+. nr np \\n(np+1
+. nr p\\n(np \\n(tW
+. ds s\\n(np \\*(tC
+. nr tC 0
+. ds tC
+. in \\n(.iu+\\n(p\\n(npu
+. \}
+. ie \\n(mN \{\
+. ds f1
+. \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. if !"\\$1"Cx" .pT st p np
+. \}
+. el \{\
+. br
+. ev 1
+. fi
+. di Td
+\&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. br
+. di
+. ev
+. na
+. ds tD \\*(Td\\
+. pT di p np
+. \}
+.\}
+..
+.\"
+.\"
+.\" Complex Expression Macro
+.\"
+.\" TODO: add length across line boundary check (like Li)
+.de Cx
+.hy 0
+.ie \\n(.$==0 \{\
+. if "\\*(iM"Cx" \{\
+. ds iM
+. if \\n(oE .oE
+\&\\*(f1
+. ds f1
+. \}
+. if "\\*(iM"Tp" .pT st p np
+. if "\\*(iM"Dp" .pT st q mp
+.\}
+.el \{\
+. if "\\*(iM"" \{\
+. ds iM Cx
+. ds f1 \&
+. \}
+. mN \\$1
+.\" Here are the args: '\\$1' '\\$2' '\\$3' '\\$4'
+. ie \\n(mN .\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. el \{\
+. as f1 \&\\$1
+. if \\n(.$>1 .Cx \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. \}
+.\}
+..
+.\" Prefix string in default font to content specified string
+.de Pf
+.Cx \\$1
+.\\$2 \\$3 \\$4 \\$5
+.Cx
+..
+.\" Suffix string in default font to content specified string
+.de Sf
+.Cx \\$1 \\$2
+.Cx \\$3
+.Cx
+..
+.\" Simple Option Begin
+.de Ob
+.hy 0
+.ie "\\*(iM"" \{\
+. ev 2
+. fi
+. di oB
+.\}
+.el \{\
+.tm shouldn't be here
+. as f1 \&[
+. mN \\$1
+. ie \\n(mN .\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. el \{\
+. as f1 \&\\$1
+. if \\n(.$>1 .Oc \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. \}
+.\}
+..
+.de Oc
+.as f1 \&\\$1
+.if \\n(.$>1 .Oc \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+..
+.de Oe
+.hy 0
+.ie "\\*(iM"" \{\
+. br
+. di
+. ev
+. ds bO \\*(oB\\
+\&[\\*(bO\&]
+.\}
+.el \{\
+. as f1 \&]
+.\}
+..
+.\" White space for Cx
+.de Ws
+.Cx \&\ \&
+..
+.\" tagged paragraph
+.\" initialize baby stack variables
+.nr mp 0
+.nr q1 0
+.ds r\n(np
+.\"
+.\" Complex Dp tag
+.de Dc
+.Dp Cx \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
+..
+.\" Complex Tp tag
+.de Tc
+.Tp Cx \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
+..
+.\" Tag with a flag and an argument with a space
+.de Ta
+.if "\\$2"" \{\
+. Tp Fl \\$1
+.\}
+.el \{\
+. Tp Fl \\$1
+. Cx \&\ \&
+. Ar \\$2 \\$3
+. Cx
+.\}
+..
+.de Da
+.Dp Cx Fl \\$1
+.Ws
+.Ar \\$2 \\$3
+.Cx
+..
+.de To
+.Tp Cx Fl \\$1
+.Ar \\$2 \\$3
+.Cx
+..
+.de Do
+.Dp Cx Fl \\$1
+.Ar \\$2 \\$3
+.Cx
+..
+.\" Blended tag toggle
+.de Bt
+.ie \\n(tP==0 .nr tP 1
+.el .nr tP 0
+..
+.\" Bullet paragraph
+.de Bu
+.Tp Sy \&\(bu
+..
+.\" Display tagged paragraph
+.de Dp
+.ie "\\$1"" \{\
+. pE q r mp
+. sp \\n(vVu
+.\}
+.el \{\
+. ds iM Dp
+. mN \\$1
+. ie \\n(tF \{\
+. ds tC Tw
+. nr tC 1
+. nr tF 0
+. \}
+. el \{\
+. if !"Tw"\\*(r\\n(mp" \{\
+. ie \\n(mN \{\
+. ds tC \\$1
+. nr tW \\n(mN
+. \}
+. el \{\
+. ds tC Tx
+. nr tW \\n(Tx
+. \}
+. if !"\\*(tC"\\*(r\\n(mp" .nr tC 1
+. \}
+. \}
+. if !\\n(cR .ne 2
+. if \\n(tC \{\
+. nr mp \\n(mp+1
+. nr q\\n(mp \\n(tW
+. ds r\\n(mp \\*(tC
+. nr tC 0
+. ds tC
+. ie \\n(tIu==\\n(Dsu .nr i\\n(mp \\n(Dsu
+. el \{\
+. nr i\\n(mp \\n(tIu
+. nr tI \\n(Dsu
+. \}
+. in \\n(.iu+\\n(i\\n(mpu
+. sp \\n(vVu
+. in \\n(.iu+\\n(\\q\\n(mpu
+. \}
+. ie \\n(mN \{\
+. \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. if !"\\$1"Cx" .pT st q mp
+. \}
+. el \{\
+. br
+. ev 1
+. fi
+. di Td
+\&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. br
+. di
+. ev
+. na
+. ds tD \\*(Td\\
+. pT di q mp
+. \}
+.\}
+..
+.\"
+.\" .pE number_stack string_stack counter
+.de pE
+.ie "\\$3"mp" \{\
+. in \\n(.iu-(\\n(\\$1\\n(\\$3u)-(\\n(i\\n(mpu)
+. rr i\\n(mp
+.\}
+.el .in \\n(.iu-\\n(\\$1\\n(\\$3u
+.\" .in \\n(.iu-\\n(\\$1\\n(\\$3u
+.if \\n(\\$3<=0 .tm Extraneous call .Tp or .Dp
+.rr \\$1\\n(\\$3
+.rm \\$2\\n(\\$3
+.nr \\$3 \\n(\\$3-1
+.ds iM
+..
+.\"
+.\" .pT [st or di] number_stack counter
+.de pT
+.ie "\\$1"st" \{\
+. nr bb \\n(\\$2\\n(\\$3u
+. ti -\\n(bbu
+. ie (\\n(\\$2\\n(\\$3u-2n)<=\w'\\*(f1'u \{\&\\*(f1\\*(tP
+. if \\n(tP==0 .br
+. \}
+. el \\*(f1\h'|\\n(\\$2\\n(\\$3u'\c
+.\}
+.el \{\
+. ti -\\n(\\$2\\n(\\$3u
+. ie (\\n(\\$2\\n(\\$3u-2n)<=\\n(dlu \{\&\\*(tD\\*(tP
+. if !\\n(tP .br
+. \}
+. el \\*(tD\h'|\\n(\\$2\\n(\\$3u'\c
+. if t 'ad
+.\}
+. ds iM
+. ds f1
+'fi
+..
+.\"
+.\" The new SH
+.\"
+.de Sh
+.\" set Sh state off, check for list state before calling indent (.In)
+.nr nS 0
+.nr sE 0
+.ie "\\$1"NAME" \{\
+.\" name state on, housekeep (headers & footers)
+. hK
+' in 0
+.\}
+.el \{\
+. if "\\$1"SYNOPSIS" .nr nS 1
+. in 0
+.\}
+.pL
+'sp
+.ns
+.ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i
+.if !\\n(cR .ne 3
+'fi
+\&\fB\\$1 \|\\$2 \|\\$3 \|\\$4 \|\\$5 \|\\$6 \|\\$7 \|\\$8 \|\\$9
+\&\fP\&
+.in \\n(.iu+\\n(Tiu
+.if "\\$1"SEE" .nr sE 1
+.ns
+..
+.\"
+.\" Nd minus sign for an en dash used in .Sh Name
+.de Nd
+\&\-\& \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+..
+.de Ss
+.sp
+.ti -.25i
+\&\fB\\$1 \|\\$2 \|\\$3 \|\\$4 \|\\$5 \|\\$6 \|\\$7 \|\\$8 \|\\$9
+\&\fP\&
+.ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i
+.if !\\n(cR .ne 2
+.br
+..
+.\" .if "\\$1"Ss" .in \\n(.iu+\\n(sIu
+.\"..
+.\"
+.\"
+.\" Column Macro
+.\"
+.hy 0
+.de Cw
+.ie \\n(.$==0 \{\
+. br
+. in \\n(.iu-\\n(eWu
+. ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i
+.\}
+.el \{\
+. Pp
+. if \\n(.$==1 \{\
+. ta \w'\\$1 'u
+. nr eW \w'\\$1 'u
+' in \\n(.iu+\\n(eWu
+. \}
+. if \\n(.$==2 \{\
+. ta \w'\\$1 'u +\w'\\$2 'u
+. nr eW \w'\\$1 'u+\w'\\$2 'u
+' in \\n(.iu+\\n(eWu
+. \}
+. if \\n(.$==3 \{\
+. ta \w'\\$1 'u +\w'\\$2 'u +\w'\\$3 'u
+. nr eW \w'\\$1 'u+\w'\\$2 'u+\w'\\$3 'u
+' in \\n(.iu+\\n(eWu
+. \}
+. if \\n(.$==4 \{\
+. ta \w'\\$1 'u +\w'\\$2 'u +\w'\\$3 'u +\w'\\$4 'u
+. nr eW \w'\\$1 'u+\w'\\$2 'u+\w'\\$3 'u +\w'\\$4 'u
+' in \\n(.iu+\\n(eWu
+. \}
+. if \\n(.$==5 \{\
+.ta \w'\\$1 'u +\w'\\$2 'u +\w'\\$3 'u +\w'\\$4 'u +\w'\\$5 'u
+.nr eW \w'\\$1 'u +\w'\\$2 'u +\w'\\$3 'u +\w'\\$4 'u +\w'\\$5 'u
+' in \\n(.iu+\\n(eWu
+. \}
+.\}
+..
+.de Cl
+.ti -\\n(eWu
+.mN \\$1
+.ie \\n(mN .\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+.el \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+..
+.nr dQ 0
+.de Ds
+.ie !"\\$1"" \{\
+. mN d\\$1
+. if \\n(mN \{\
+. nr dQ \\n(dQ+1
+. d\\$1
+. \}
+.\}
+.el .br
+.nf
+..
+.de Df
+.ie !"\\$1"" \{\
+. mN d\\$1
+. if \\n(mN \{\
+. nr dQ \\n(dQ+1
+. d\\$1
+. \}
+.\}
+.el .br
+..
+.de Dn
+\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+.nf
+..
+.de dI
+.nr d\\n(dQ \\n(dIu
+.in \\n(.iu+\\n(dIu
+..
+.de dC
+.nr d\\n(dQ (\\n(.l-\\n(.i)/4u
+.in \\n(.iu+\\n(d\\n(dQu
+..
+.de dR
+.nr d\\n(dQ (\\n(.l/3)u
+.in \\n(.iu+\\n(d\\n(dQu
+..
+.de dL
+.nr aa 0
+..
+.de De
+.br
+.if \\n(d\\n(dQ \{\
+. in \\n(.iu-\\n(d\\n(dQu
+. rr d\\n(dQ
+. nr dQ \\n(dQ-1
+.\}
+.fi
+..
+.\"
+.de Fn
+.ie \\n(.$==0 \{\
+. tm Usage: .Fn function_name function_arg(s) ... \\*(Pu
+.\}
+.el \{\
+. nr cF \\n(.f
+. ie \\n(.$==1 .ds f1 \&\\*(nM\\$1\fP\\*(lP\fP\\*(rP\fP
+. el \{\
+. ds f1 \\*(nM\\$1\fP\\*(lP
+. nr aa 0
+. rC \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. \}
+. if "\\*(iM"" \{\\&\\*(f1
+. ds f1
+. \}
+.\}
+..
+.\"
+.de rC
+.rZ \\$1
+.ie \\n(rZ \{\
+. as f1 \f\\n(cF\\*(rP\f\\n(cF\\$1\\$2\\$3\\$4\\$5\\$6\\$7
+.\}
+.el \{\
+. ie \\n(aa .as f1 \fP, \\*(aR\\$1
+. el .as f1 \\*(aR\\$1
+. nr aa 1
+. ie \\n(.$>1 .rC \\$2 \\$3 \\$4 \\$5 \\$6 \\$7
+. el .as f1 \fP\\*(rP\fP
+.\}
+..
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=nroff textwidth=72:
diff --git a/tmac/doc.tmac b/tmac/doc.tmac
new file mode 100644
index 0000000..70ec41e
--- /dev/null
+++ b/tmac/doc.tmac
@@ -0,0 +1,6957 @@
+.\" Copyright (c) 1991, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in
+.\" the documentation and/or other materials provided with the
+.\" distribution.
+.\" 3. [Deleted. See
+.\" ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change]
+.\" 4. Neither the name of the University nor the names of its
+.\" contributors may be used to endorse or promote products derived
+.\" from this software without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS"
+.\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+.\" PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
+.\" CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)doc 8.1 (Berkeley) 06/08/93
+.\"
+.\" Modified by jjc@jclark.com as follows: the doc-* files are assumed
+.\" to be installed as mdoc/doc-* rather than tmac.doc-* (the filename
+.\" 'tmac.doc-common' would be too long); when using groff, the doc-*
+.\" files are loaded using the 'mso' request.
+.\"
+.\" Modified by
+.\"
+.\" Werner LEMBERG <wl@gnu.org> and
+.\" Ruslan Ermilov <ru@freebsd.org>
+.\"
+.\" to make it more readable: using long names and many groff features,
+.\" updating and extending documentation, etc.
+.
+.
+.if !\n(.g \
+. ab groff mdoc macros require groff extensions; aborting
+.
+.
+.do if d Dd .nx
+.
+.
+.cp 0
+.
+.
+.if (\n[.x]\n[.y] < 118) \{\
+. ds doc-msg doc.tmac: groff mdoc macros require groff 1.18 or later,
+. as doc-msg " but found groff \n[.x].\n[.y]; aborting
+. ab \*[doc-msg]
+.\}
+.
+.\" Handle most rendering options.
+.
+.nr doc-is-output-html 0
+.if '\*[.T]'html' .nr doc-is-output-html 1
+.
+.\" Use -dAD to set the adjustment mode for ordinary body text.
+.if !d AD \
+. ds AD b\"
+.
+.\" Use -rC1 to consecutively number pages across multiple documents.
+.\"
+.\" We must use consecutive page numbers when using PostScript to
+.\" generate HTML images; we must not reset the page number at the
+.\" beginning of each document (the 'ps4html' register is automatically
+.\" added to the command line by the pre-HTML preprocessor).
+.ie !r C \
+. nr C 0
+.el \
+. if !\n[C] \
+. if \n[doc-is-output-html] \{\
+. tm mdoc: consecutive page numbering required for HTML output
+. nr C 1
+. \}
+.if \n[doc-is-output-html] \
+. nr C 1
+.if r ps4html \
+. nr C 1
+.
+.\" Use -rCS=1 to force capitalization of section headings.
+.if !r CS .nr CS 0
+.
+.\" Use -rCT=1 to force capitalization of page titles in headers.
+.if !r CT .nr CT 0
+.
+.\" Use -rcR=0 for multiple pages instead of a single, very long page.
+.if !r cR \{\
+. if t .nr cR 0
+. if n .nr cR 1
+.\}
+.
+.\" If continuous rendering, tell tbl not to use keeps.
+.ie \n[cR] \
+. nr 3usekeeps 0
+.el \
+. nr 3usekeeps 1
+.
+.\" double-sided layout
+.ie !r D \
+. nr D 0
+.el \
+. if \n[D] \
+. if \n[doc-is-output-html] \{\
+. tm mdoc: ignoring double-sided layout in HTML output
+. nr D 0
+. \}
+.
+.\" footer distance
+.\"
+.\" Unlike most of these parameters, we do not set a default for FT; the
+.\" doc-set-up-titles macro places page location traps only if not
+.\" continuously rendering.
+.if r FT \{\
+. \" Validate it. Continuous rendering ignores FT. Measuring a footer
+. \" distance from the page top isn't done. A footer distance of over
+. \" half the page length is unlikely. A footer distance of less than
+. \" one line height is too.
+. ie \n[cR] \
+. ds doc-msg footer distance when continuously rendering\"
+. el \{\
+. nr doc-tmp 1v
+. ds doc-help " (1v=\n[doc-tmp]u)\"
+. ie (\n[FT] : (\n[FT] = 0)) \
+. ds doc-msg non-negative footer distance: \n[FT]u\*[doc-help]\"
+. el \{\
+. ie (-(\n[FT]) > (\n[.p] / 2)) \{\
+. ds doc-msg implausibly large footer distance:\"
+. as doc-msg " \n[FT]u\*[doc-help]\"
+. \}
+. el \
+. if (-(\n[FT]) < 1v) \{\
+. ds doc-msg implausibly small footer distance:\"
+. as doc-msg " \n[FT]u\*[doc-help]\"
+. \}
+. rm doc-help
+. rr doc-tmp
+. \}
+. \}
+. if d doc-msg \{\
+. tm mdoc: ignoring \*[doc-msg]
+. rr FT
+. rm doc-msg
+. \}
+.\}
+.
+.\" (sub)section heading font
+.if !d HF \
+. ds HF B\"
+.
+.\" If HF is a bold style, use bold italics for italics in headings.
+.ds doc-heading-style \*[HF]\"
+.substring doc-heading-style -1 -1
+.ds doc-heading-family \" empty
+.length doc-HF-length \*[HF]
+.if (\n[doc-HF-length] > 1) \{\
+. as doc-heading-family \*[HF]\"
+. substring doc-heading-family 0 -2
+.\}
+.if '\*[doc-heading-style]'B' \
+. if F \*[doc-heading-family]BI \
+. nr doc-remap-I-style-in-headings 1
+.rr doc-HF-length
+.rm doc-heading-style
+.
+.\" \n[HY] is recognized for groff_man(7) compatibility, particularly
+.\" via andoc.tmac and man(1); see \n[doc-hyphen-flags] in doc-common.
+.if !r HY .nr HY 1
+.
+.\" Use -rIN=<xxx> to set the paragraph indentation amount.
+.if !r IN \{\
+. \" We select an integer indentation value in nroff mode because this
+. \" value is used additively for multiple purposes; rounding of
+. \" accumulating fractions would produce inconsistent results.
+. ie t .nr IN 7.2n
+. el .nr IN 7n
+.\}
+.
+.\" LL and LT registers are handled by the doc-setup-page-layout macro.
+.
+.\" TODO: Implement MF string.
+.
+.\" starting page number
+.\"
+.\" Unlike most of these parameters, we do not set a default for P;
+.\" troff supplies a default starting page number (1). When rendering
+.\" for the HTML output device, page numbers are concealed and used for
+.\" internal purposes like image embedding. Page numbers are not
+.\" rendered at all in continuous rendering mode.
+.if r P \{\
+. if \n[doc-is-output-html] \
+. if !(\n[P] = 1) \
+. ds doc-msg in HTML output\"
+. if \n[cR] \
+. ds doc-msg when continuously rendering
+.\}
+.if d doc-msg \{\
+. tm mdoc: ignoring starting page number \*[doc-msg]
+. rr P
+. rm doc-msg
+.\}
+.
+.\" Setting the page number turns out to be tricky when batch rendering
+.\" and switching macro packages. We must use different techniques
+.\" depending on whether the transition to the first output page has
+.\" happened yet. If it has not, `nl` will be `-1` and we use `pn`. If
+.\" it has, we set `%`. Technically this is fragile since in theory a
+.\" page could assign a negative value to `nl`. We might then be
+.\" justified in saying they've broken the macro package and they get to
+.\" keep both pieces. But if not, consider using a nonce register,
+.\" initially set but then permanently cleared adjacent to this logic,
+.\" and whose state is shared with man (and andoc.tmac, if necessary).
+.\"
+.\" Also, we can't use the `P` register with grohtml at all.
+.ie r ps4html \{\
+. if r P \{\
+. tm mdoc: ignoring starting page number in HTML output
+. rr P
+. \}
+.\}
+.el \{\
+. if r P \{\
+. ie (\n[nl] = -1) .pn 0\n[P]
+. el .nr % 0\n[P]
+. \}
+.\}
+.
+.\" Use -rSN=<xxx> to set the subsection heading indentation amount.
+.if !r SN .nr SN 3n
+.
+.\" TODO: Implement U register.
+.
+.\" page number after which to apply letter suffixes
+.\"
+.\" Unlike most of these parameters, we do not set a default for X; only
+.\" the macro an-footer uses it. Page numbers are not rendered at all
+.\" in continuous rendering mode.
+.if r X \{\
+. af doc-page-letter a
+. if \n[doc-is-output-html] \
+. ds doc-msg in HTML output\"
+. if \n[cR] \
+. ds doc-msg when continuously rendering
+.\}
+.if d doc-msg \{\
+. tm mdoc: ignoring page number suffix \*[doc-msg]
+. rr X
+. rm doc-msg
+.\}
+.
+.
+.\" Load startup files.
+.ie t \
+. mso mdoc/doc-ditroff
+.el \
+. mso mdoc/doc-nroff
+.
+.mso mdoc/doc-common
+.mso mdoc/doc-syms
+.
+.
+.\" NS doc-macro-name global string
+.\" NS name of calling request (set in each user-requestable macro)
+.
+.ds doc-macro-name
+.als doc-arg0 doc-macro-name
+.
+.
+.\" NS doc-arg-count global register
+.\" NS total number of arguments
+.\" XXX: This register name and description aren't quite right, but its
+.\" old name `doc-arg-limit` doesn't seem accurate either. Demystify.
+.
+.nr doc-arg-count 0
+.
+.
+.\" NS doc-num-args global register
+.\" NS number of arguments to handle (must be set to \n[.$] prior to
+.\" NS 'doc-parse-arg-vector' request)
+.
+.nr doc-num-args 0
+.
+.
+.\" NS doc-arg-ptr global register
+.\" NS argument pointer
+.
+.nr doc-arg-ptr 0
+.
+.
+.\" NS doc-argXXX global string
+.\" NS argument vector
+.\" NS
+.\" NS limit:
+.\" NS doc-arg-count
+.
+.ds doc-arg1
+.
+.
+.\" NS doc-typeXXX global register
+.\" NS argument type vector (macro=1, string=2, punctuation suffix=3,
+.\" NS punctuation prefix=4)
+.\" NS
+.\" NS limit:
+.\" NS doc-arg-count
+.
+.nr doc-type1 0
+.
+.
+.\" NS doc-spaceXXX global string
+.\" NS space vector
+.\" NS
+.\" NS limit:
+.\" NS doc-arg-count
+.
+.ds doc-space1
+.
+.
+.\" NS doc-parse-args macro
+.\" NS parse arguments (recursively) ('.doc-parse-args arg ...')
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-count
+.\" NS doc-arg-ptr
+.\" NS doc-argXXX
+.\" NS doc-spaceXXX
+.\" NS doc-typeXXX
+.\" NS doc-arg-ptr
+.\" NS doc-have-space
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dpa
+.\" NS doc-reg-dpa1
+.\" NS doc-str-dpa
+.
+.eo
+.de doc-parse-args
+. if !\n[doc-arg-count] \
+. doc-set-spacing-1
+.
+. nr doc-have-space 0
+.
+. if !\n[.$] \
+. return
+.
+. nr doc-arg-count +1
+.
+. \" handle '|' and '...' specially
+. ie "\$1"|" \
+. ds doc-arg\n[doc-arg-count] \f[R]|\f[]
+. el \{ .ie "\$1"..." \
+. ds doc-arg\n[doc-arg-count] \|.\|.\|.
+. el \
+. ds doc-arg\n[doc-arg-count] "\$1
+. \}
+.
+. \" get argument type and set spacing
+. doc-get-arg-type* \n[doc-arg-count]
+. nr doc-type\n[doc-arg-count] \n[doc-arg-type]
+. doc-set-spacing-\n[doc-arg-type]
+.
+. \" check whether we have processed the last parameter
+. ie (\n[.$] == 1) \
+. nr doc-arg-ptr 0
+. el \{\
+. shift
+. doc-parse-args \$@
+. \}
+.
+. nh
+..
+.ec
+.
+.
+.\" NS doc-parse-arg-vector macro
+.\" NS parse argument vector (recursive)
+.\" NS
+.\" NS cf. comments in doc-parse-args
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-count
+.\" NS doc-arg-ptr
+.\" NS doc-argXXX
+.\" NS doc-num-args
+.\" NS doc-spaceXXX
+.\" NS doc-typeXXX
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dpav
+.\" NS doc-reg-dpav1
+.\" NS doc-str-dpav
+.
+.eo
+.de doc-parse-arg-vector
+. if !\n[doc-arg-count] \
+. doc-set-spacing-1
+.
+. nr doc-arg-count +1
+.
+. ie "\*[doc-arg\n[doc-arg-count]]"|" \
+. ds doc-arg\n[doc-arg-count] \f[R]|\f[]
+. el \{ .if "\*[doc-arg\n[doc-arg-count]]"..." \
+. ds doc-arg\n[doc-arg-count] \|.\|.\|.
+. \}
+.
+. doc-get-arg-type* \n[doc-arg-count]
+. nr doc-type\n[doc-arg-count] \n[doc-arg-type]
+. doc-set-spacing-\n[doc-arg-type]
+.
+. ie (\n[doc-num-args] == 1) \{\
+. nr doc-arg-ptr 0
+. nr doc-num-args 0
+. \}
+. el \{\
+. nr doc-num-args -1
+. doc-parse-arg-vector
+. \}
+.
+. nh
+..
+.ec
+.
+.
+.\" NS doc-parse-space-vector macro
+.\" NS parse space vector (recursive)
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-count
+.\" NS doc-num-args
+.\" NS doc-spaceXXX
+.
+.eo
+.de doc-parse-space-vector
+. nr doc-arg-count +1
+.
+. doc-set-spacing-\n[doc-type\n[doc-arg-count]]
+.
+. ie (\n[doc-num-args] == 1) \
+. nr doc-num-args 0
+. el \{\
+. nr doc-num-args -1
+. doc-parse-space-vector
+. \}
+..
+.ec
+.
+.
+.\" NS doc-remaining-args macro
+.\" NS output remaining arguments as-is, separated by spaces (until
+.\" NS 'doc-num-args' is exhausted)
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-num-args
+.
+.eo
+.de doc-remaining-args
+. nr doc-arg-ptr +1
+. nop \)\*[doc-arg\n[doc-arg-ptr]]\c
+.
+. ie (\n[doc-num-args] == 1) \{\
+. nr doc-arg-ptr 0
+. nr doc-num-args 0
+. \}
+. el \{\
+. nop \)\*[doc-space]\c
+. nr doc-num-args -1
+. doc-remaining-args
+. \}
+..
+.ec
+.
+.
+.\" NS doc-append-arg macro
+.\" NS append one argument to argument vector:
+.\" NS '.doc-append-arg [arg] [type]'
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-count
+.\" NS doc-argXXX
+.\" NS doc-typeXXX
+.
+.eo
+.de doc-append-arg
+. nr doc-arg-count +1
+. ds doc-arg\n[doc-arg-count] "\$1
+. nr doc-type\n[doc-arg-count] \$2
+. doc-set-spacing-\$2
+..
+.ec
+.
+.
+.\" NS doc-print-and-reset macro
+.\" NS finish input line and clean up argument vectors
+.
+.eo
+.de doc-print-and-reset
+. if \n[doc-space-mode] \
+. nop \)
+. doc-reset-args
+..
+.ec
+.
+.
+.\" NS doc-reset-args macro
+.\" NS reset argument counters
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-count
+.\" NS doc-arg-ptr
+.\" NS doc-have-slot
+.
+.eo
+.de doc-reset-args
+. nr doc-arg-count 0
+. nr doc-arg-ptr 0
+. nr doc-have-slot 0
+.
+. hy \n[doc-hyphen-flags]
+..
+.ec
+.
+.
+.\" NS doc-curr-font global register
+.\" NS saved current font
+.
+.nr doc-curr-font \n[.f]
+.
+.
+.\" NS Fl user macro
+.\" NS handle flags (appends '-' and prints flags): '.Fl [arg ...]'
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-Fl (for communication with doc-flag-recursion)
+.\" NS
+.\" NS width register 'Fl' set in doc-common
+.
+.eo
+.de Fl
+. nr doc-curr-font \n[.f]
+. nop \*[doc-Fl-font]\c
+.
+. if !\n[doc-arg-count] \{\
+. ds doc-macro-name Fl
+. doc-parse-args \$@
+.
+. \" no arguments
+. if !\n[.$] \
+. nop \|\-\|\f[]
+. \}
+.
+. if !\n[doc-arg-count] \
+. return
+.
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-count] < \n[doc-arg-ptr]) \{\
+. \" last argument
+. nop \|\-\f[]\c
+. doc-print-and-reset
+. \}
+. el \{\
+. ie (\n[doc-type\n[doc-arg-ptr]] == 1) \{\
+. nop \|\-\f[]\c
+. \*[doc-arg\n[doc-arg-ptr]]
+. \}
+. el \{\
+. if (\n[doc-type\n[doc-arg-ptr]] == 3) \
+. nop \|\-\|\c
+.
+. nr doc-reg-Fl 1
+. doc-flag-recursion
+. \}\}
+..
+.ec
+.
+.
+.\" NS doc-flag-recursion macro
+.\" NS 'Fl' flag recursion routine (special handling)
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dfr
+.\" NS doc-reg-dfr1
+.\" NS doc-str-dfr
+.
+.eo
+.de doc-flag-recursion
+. nr doc-reg-dfr1 \n[doc-type\n[doc-arg-ptr]]
+. ds doc-str-dfr "\*[doc-arg\n[doc-arg-ptr]]
+.
+. ie (\n[doc-reg-dfr1] == 1) \{\
+. nop \f[]\c
+. \*[doc-str-dfr]
+. \}
+. el \{\
+. nr doc-reg-dfr \n[doc-arg-ptr]
+.
+. ie (\n[doc-reg-dfr1] == 2) \{\
+. \" handle vertical bar -- doc-reg-Fl is set for the first call of
+. \" doc-flag-recursion only; we need this to make '.Fl | ...' work
+. \" correctly
+. ie "\*[doc-str-dfr]"\*[Ba]" \{\
+. if \n[doc-reg-Fl] \
+. nop \|\-\*[doc-space]\c
+. nop \)\*[Ba]\c
+. \}
+. el \{\
+. ie "\*[doc-str-dfr]"\f[R]|\f[]" \{\
+. if \n[doc-reg-Fl] \
+. nop \|\-\*[doc-space]\c
+. nop \f[R]|\f[]\c
+. \}
+. el \{\
+. \" two consecutive hyphen characters?
+. ie "\*[doc-str-dfr]"-" \
+. nop \|\-\^\-\|\c
+. el \
+. nop \|\%\-\*[doc-str-dfr]\&\c
+. \}\}\}
+. el \{\
+. nop \f[\n[doc-curr-font]]\c
+. nop \)\*[doc-str-dfr]\f[]\c
+. \}
+.
+. ie (\n[doc-arg-count] == \n[doc-arg-ptr]) \{\
+. \" last argument
+. if (\n[doc-reg-dfr1] == 4) \
+. nop \|\-\c
+. nop \f[\n[doc-curr-font]]\c
+. doc-print-and-reset
+. \}
+. el \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-type\n[doc-arg-ptr]] == 3) \{\
+. ie (\n[doc-type\n[doc-reg-dfr]] == 4) \
+. nop \|\-\c
+. el \
+. nop \)\*[doc-space\n[doc-reg-dfr]]\c
+. \}
+. el \
+. nop \)\*[doc-space\n[doc-reg-dfr]]\c
+.
+. shift
+. nr doc-reg-Fl 0
+. doc-flag-recursion \$@
+. \}\}
+..
+.ec
+.
+.
+.\" NS doc-print-recursive macro
+.\" NS general name recursion routine (print remaining arguments)
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dpr
+.\" NS doc-reg-dpr1
+.\" NS doc-str-dpr
+.
+.eo
+.de doc-print-recursive
+. nr doc-reg-dpr1 \n[doc-type\n[doc-arg-ptr]]
+. ds doc-str-dpr "\*[doc-arg\n[doc-arg-ptr]]
+.
+. if \n[doc-do-capitalize] .stringup doc-str-dpr
+.
+. ie (\n[doc-reg-dpr1] == 1) \{\
+. nop \f[\n[doc-curr-font]]\c
+. \*[doc-str-dpr]
+. \}
+. el \{\
+. nr doc-reg-dpr \n[doc-arg-ptr]
+.
+. \" the '\%' prevents hyphenation on a dash ('-')
+. ie (\n[doc-reg-dpr1] == 2) \
+. nop \%\*[doc-str-dpr]\&\c
+. el \{\
+. \" punctuation character
+. nop \f[\n[doc-curr-font]]\c
+. nop \)\*[doc-str-dpr]\f[]\c
+. \}
+.
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-count] < \n[doc-arg-ptr]) \{\
+. \" last argument
+. nop \f[\n[doc-curr-font]]\c
+. doc-print-and-reset
+. \}
+. el \{\
+. nop \)\*[doc-space\n[doc-reg-dpr]]\c
+. doc-print-recursive
+. \}\}
+..
+.ec
+.
+.
+.\" NS doc-print-prefixes macro
+.\" NS print leading prefixes
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.
+.eo
+.de doc-print-prefixes
+. while (\n[doc-arg-count] >= \n[doc-arg-ptr]) \{\
+. if !(\n[doc-type\n[doc-arg-ptr]] == 4) \
+. break
+. nop \f[\n[doc-curr-font]]\c
+. nop \)\*[doc-arg\n[doc-arg-ptr]]\f[]\c
+. nr doc-arg-ptr +1
+. \}
+..
+.ec
+.
+.
+.\" NS doc-generic-macro macro
+.\" NS this is the skeleton for most simple macros
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.
+.eo
+.de doc-generic-macro
+. if !\n[doc-arg-count] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name \$0
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .\$0 \*[doc-\$0-usage] ... (#\n[.c])
+. \}
+.
+. if !\n[doc-arg-count] \
+. return
+.
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-count] >= \n[doc-arg-ptr]) \{\
+. if (\n[doc-type\n[doc-arg-ptr]] == 1) \{\
+. tmc mdoc warning: Using a macro as first argument
+. tm1 " cancels effect of .\$0 (#\n[.c])
+.
+. \" the right action here would be to reset the argument counters
+. \" and bail out -- unfortunately, a small number of manual pages
+. \" (less than 2% for FreeBSD which has been used for testing)
+. \" relied on the old behaviour (silently ignore this error),
+. \" so it is commented out
+.
+.\" doc-reset-args
+. \}
+.\" el \{\
+. nr doc-curr-font \n[.f]
+. nop \*[doc-\$0-font]\c
+. doc-print-recursive
+.\" \}
+. \}
+. el \{\
+. tm Usage: .\$0 \*[doc-\$0-usage] ... (#\n[.c])
+. doc-reset-args
+. \}
+..
+.ec
+.
+.
+.\" NS Ar user macro
+.\" NS command-line 'argument' macro: '.Ar [args ...]'
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variable:
+.\" NS doc-str-Ar-default
+.\" NS
+.\" NS width register 'Ar' set in doc-common
+.
+.ds doc-str-Ar-default "file\ .\|.\|.
+.
+.eo
+.de Ar
+. nr doc-curr-font \n[.f]
+. nop \*[doc-Ar-font]\c
+.
+. if !\n[doc-arg-count] \{\
+. ds doc-macro-name Ar
+. doc-parse-args \$@
+.
+. \" no argument
+. if !\n[.$] \
+. nop \)\*[doc-str-Ar-default]\&\f[]
+. \}
+.
+. if !\n[doc-arg-count] \
+. return
+.
+. nr doc-arg-ptr +1
+. doc-print-prefixes
+. ie (\n[doc-arg-count] < \n[doc-arg-ptr]) \{\
+. nop \)\*[doc-str-Ar-default]\&\f[]\c
+. doc-print-and-reset
+. \}
+. el \{\
+. if !(\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. \" replace previous argument (Ar) with default value
+. nr doc-arg-ptr -1
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-str-Ar-default]
+. nr doc-type\n[doc-arg-ptr] 2
+. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
+.
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-count] - \n[doc-arg-ptr])
+. nr doc-arg-count \n[doc-arg-ptr]
+. doc-parse-space-vector
+. \}
+. doc-print-recursive
+. \}
+..
+.ec
+.
+.
+.\" NS Ad user macro
+.\" NS Addresses
+.\" NS
+.\" NS width register 'Ad' set in doc-common
+.
+.als Ad doc-generic-macro
+.ds doc-Ad-usage address
+.
+.
+.\" NS doc-indent-synopsis global register
+.\" NS indentation in synopsis
+.
+.nr doc-indent-synopsis 0
+.
+.
+.\" NS doc-indent-synopsis-active global register (bool)
+.\" NS indentation in synopsis active
+.
+.nr doc-indent-synopsis-active 0
+.
+.
+.\" NS Cd user macro
+.\" NS config declaration (for section 4 SYNOPSIS)
+.\" NS
+.\" NS this function causes a break; it uses the 'Nm' font
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-indent-synopsis
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register 'Cd' set in doc-common
+.
+.eo
+.de Cd
+. if !\n[doc-arg-count] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Cd
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .Cd configuration_file_declaration ... (#\n[.c])
+. \}
+.
+. if !\n[doc-arg-count] \
+. return
+.
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-count] >= \n[doc-arg-ptr]) \{\
+. nr doc-curr-font \n[.f]
+.
+. ie \n[doc-in-synopsis-section] \{\
+. ie "\*[doc-macro-name]"Cd" \{\
+. br
+. if !\n[doc-indent-synopsis] \
+. nr doc-indent-synopsis \n[doc-display-indent]u
+. if !\n[doc-indent-synopsis-active] \
+. in +\n[doc-indent-synopsis]u
+. ti -\n[doc-indent-synopsis]u
+. nop \*[doc-Nm-font]\c
+. doc-print-recursive
+. if !\n[doc-indent-synopsis-active] \
+. in -\n[doc-indent-synopsis]u
+. \}
+. el \{\
+. nop \*[doc-Nm-font]\c
+. doc-print-recursive
+. \}\}
+. el \{\
+. nop \*[doc-Nm-font]\c
+. doc-print-recursive
+. \}\}
+. el \{\
+. tm Usage: .Cd configuration_file_declaration ... (#\n[.c])
+. doc-reset-args
+. \}
+..
+.ec
+.
+.
+.\" NS Cm user macro
+.\" NS interactive command modifier (flag)
+.\" NS
+.\" NS width register 'Cm' set in doc-common
+.
+.als Cm doc-generic-macro
+.ds doc-Cm-usage interactive_command_modifier
+.
+.
+.\" NS Dv user macro
+.\" NS defined variable
+.\" NS
+.\" NS this function uses the 'Er' font
+.\" NS
+.\" NS width register 'Dv' set in doc-common
+.
+.als Dv doc-generic-macro
+.ds doc-Dv-usage defined_variable
+.als doc-Dv-font doc-Er-font
+.
+.
+.\" NS Em user macro
+.\" NS emphasis
+.\" NS
+.\" NS width register 'Em' set in doc-common
+.
+.als Em doc-generic-macro
+.ds doc-Em-usage text
+.
+.
+.\" NS Er user macro
+.\" NS errno type
+.\" NS
+.\" NS width register 'Er' set in doc-common
+.
+.als Er doc-generic-macro
+.ds doc-Er-usage text
+.
+.
+.\" NS Ev user macro
+.\" NS environment variable
+.\" NS
+.\" NS width register 'Ev' set in doc-common
+.
+.als Ev doc-generic-macro
+.ds doc-Ev-usage text
+.
+.
+.\" NS doc-have-decl global register (bool)
+.\" NS subroutine test (in synopsis only)
+.
+.nr doc-have-decl 0
+.
+.
+.\" NS doc-have-var global register (bool)
+.\" NS whether last type is a variable type
+.
+.nr doc-have-var 0
+.
+.
+.\" NS doc-do-func-decl macro
+.\" NS do something special while in SYNOPSIS
+.\" NS
+.\" NS modifies:
+.\" NS doc-curr-font
+.\" NS doc-have-decl
+.\" NS doc-have-var
+.
+.eo
+.de doc-do-func-decl
+. if \n[doc-in-synopsis-section] \{\
+. \" if a variable type was the last thing given, want vertical space
+. if \n[doc-have-var] \{\
+. doc-paragraph
+. nr doc-have-var 0
+. \}
+. \" if a subroutine was the last thing given, want vertical space
+. if \n[doc-have-func] \{\
+. ie \n[doc-have-decl] \
+. br
+. el \
+. doc-paragraph
+. \}
+. nr doc-have-decl 1
+. \}
+.
+. nr doc-curr-font \n[.f]
+..
+.ec
+.
+.
+.\" NS Fd user macro
+.\" NS function declaration -- not callable
+.\" NS
+.\" NS this function causes a break
+.\" NS
+.\" NS width register 'Fd' set in doc-common
+.
+.eo
+.de Fd
+. ie ((\n[.$] >= 1) & (\n[doc-arg-count] == 0)) \{\
+. doc-do-func-decl
+. nop \*[doc-Fd-font]\$*
+. br
+. ft \n[doc-curr-font]
+. \}
+. el \{\
+. tm Usage: .Fd function_declaration -- Fd is not callable (#\n[.c])
+. doc-reset-args
+. \}
+..
+.ec
+.
+.
+.\" NS In user macro
+.\" NS #include statement in SYNOPSIS
+.\" NS <header.h> if not in SYNOPSIS
+.\" NS
+.\" NS this function causes a break; it uses the 'Fd' font
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-indent-synopsis
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register 'In' set in doc-common
+.
+.eo
+.de In
+. if !\n[doc-arg-count] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name In
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .In include_file ... (#\n[.c])
+. \}
+.
+. if !\n[doc-arg-count] \
+. return
+.
+. nr doc-arg-ptr +1
+. doc-print-prefixes
+. ie ((\n[doc-arg-count] >= \n[doc-arg-ptr]) & (\n[doc-type\n[doc-arg-ptr]] == 2)) \{\
+. nr doc-curr-font \n[.f]
+.
+. ie \n[doc-in-synopsis-section] \{\
+. ie "\*[doc-macro-name]"In" \{\
+. doc-do-func-decl
+. nop \*[doc-Fd-font]#include <\*[doc-arg\n[doc-arg-ptr]]>
+. ft \n[doc-curr-font]
+. br
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-count] >= \n[doc-arg-ptr]) \
+. doc-print-recursive
+. el \
+. doc-reset-args
+. \}
+. el \{\
+. ds doc-arg\n[doc-arg-ptr] "<\*[doc-Pa-font]\*[doc-arg\n[doc-arg-ptr]]
+. as doc-arg\n[doc-arg-ptr] \f[\n[doc-curr-font]]>
+. doc-print-recursive
+. \}\}
+. el \{\
+. ds doc-arg\n[doc-arg-ptr] "<\*[doc-Pa-font]\*[doc-arg\n[doc-arg-ptr]]
+. as doc-arg\n[doc-arg-ptr] \f[\n[doc-curr-font]]>
+. doc-print-recursive
+. \}\}
+. el \{\
+. tm Usage: .In include_file ... (#\n[.c])
+. doc-reset-args
+. \}
+..
+.ec
+.
+.
+.\" NS Fr user macro
+.\" NS function return value
+.\" NS
+.\" NS this function uses the 'Ar' font
+.\" NS
+.\" NS width register 'Fr' set in doc-common
+.
+.als Fr doc-generic-macro
+.ds doc-Fr-usage function_return_value
+.als doc-Fr-font doc-Ar-font
+.
+.
+.\" NS Ic user macro
+.\" NS interactive command
+.\" NS
+.\" NS width register 'Ic' set in doc-common
+.
+.als Ic doc-generic-macro
+.ds doc-Ic-usage interactive_command
+.
+.
+.\" NS Li user macro
+.\" NS literals
+.\" NS
+.\" NS width register 'Li' set in doc-common
+.
+.als Li doc-generic-macro
+.ds doc-Li-usage argument
+.
+.
+.\" NS Ms user macro
+.\" NS math symbol
+.\" NS
+.\" NS this function uses the 'Sy' font
+.\" NS
+.\" NS width register 'Ms' set in doc-common
+.
+.als Ms doc-generic-macro
+.ds doc-Ms-usage math_symbol
+.als doc-Ms-font doc-Sy-font
+.
+.
+.\" NS doc-topic-name global string
+.\" NS save first invocation of .Nm
+.
+.ds doc-topic-name \" empty
+.
+.
+.\" NS Nm user macro
+.\" NS name of command or page topic
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-topic-name
+.\" NS doc-curr-font
+.\" NS doc-indent-synopsis
+.\" NS doc-indent-synopsis-active
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register 'Nm' set in doc-common
+.
+.eo
+.de Nm
+. if !\n[doc-arg-count] \{\
+. ds doc-macro-name Nm
+. ie \n[.$] \{\
+. \" Handle '.Nm ...' in "Name" section: don't use a special font.
+. ie \n[doc-in-name-section] \{\
+. if "\*[doc-topic-name]"" \
+. ds doc-topic-name "\$1\"
+. No \$@
+. \}
+. el \
+. doc-parse-args \$@
+. \}
+. el \{\
+. ie "\*[doc-topic-name]"" \
+. tm Usage: .Nm name ... (#\n[.c])
+. el \
+. doc-parse-args \*[doc-topic-name]
+. \}\}
+.
+. if !\n[doc-arg-count] \
+. return
+.
+. nr doc-arg-ptr +1
+. doc-print-prefixes
+. ie (\n[doc-arg-count] < \n[doc-arg-ptr]) \{\
+. \" last argument
+. ie "\*[doc-topic-name]"" \{\
+. tm Usage: .Nm name ... (#\n[.c])
+. doc-reset-args
+. \}
+. el \{\
+. nop \*[doc-Nm-font]\*[doc-topic-name]\f[]\c
+. doc-print-and-reset
+. \}\}
+. el \{\
+. nr doc-curr-font \n[.f]
+.
+. ie !(\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. ie "\*[doc-topic-name]"" \
+. tm Usage: .Nm name ... (#\n[.c])
+. el \{\
+. \" replace previous argument (Nm) with default value
+. nr doc-arg-ptr -1
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-Nm-font]\*[doc-topic-name]\f[]
+. nr doc-type\n[doc-arg-ptr] 2
+. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
+.
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-count] - \n[doc-arg-ptr])
+. nr doc-arg-count \n[doc-arg-ptr]
+. doc-parse-space-vector
+. \}\}
+. el \{\
+. \" Handle '.Nm ...' in "Synopsis" section.
+. if \n[doc-in-synopsis-section] \{\
+. if "\*[doc-macro-name]"Nm" \{\
+. br
+. if !\n[doc-indent-synopsis] \{\
+. doc-get-width "\*[doc-arg\n[doc-arg-ptr]]"
+. nr doc-indent-synopsis ((\n[doc-width]u + 1u) * \n[doc-fixed-width]u)
+. \}
+. if !\n[doc-indent-synopsis-active] \{\
+. in +\n[doc-indent-synopsis]u
+. nr doc-indent-synopsis-active 1
+. \}
+. ti -\n[doc-indent-synopsis]u
+. \}\}
+.
+. nop \*[doc-Nm-font]\c
+. \}
+. doc-print-recursive
+. \}
+..
+.ec
+.
+.
+.\" NS Pa user macro
+.\" NS pathname: '.Pa [arg ...]'
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register 'Pa' set in doc-common
+.
+.eo
+.de Pa
+. if !\n[doc-arg-count] \{\
+. ds doc-macro-name Pa
+. doc-parse-args \$@
+.
+. \" default value
+. if !\n[.$] \
+. nop \*[doc-Pa-font]\[ti]\f[]
+. \}
+.
+. if !\n[doc-arg-count] \
+. return
+.
+. nr doc-arg-ptr +1
+. doc-print-prefixes
+. ie (\n[doc-arg-count] >= \n[doc-arg-ptr]) \{\
+. nr doc-curr-font \n[.f]
+. nop \*[doc-Pa-font]\c
+. if !(\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. \" replace previous argument (Pa) with default value
+. nr doc-arg-ptr -1
+. ds doc-arg\n[doc-arg-ptr] \[ti]
+. nr doc-type\n[doc-arg-ptr] 2
+. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
+.
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-count] - \n[doc-arg-ptr])
+. nr doc-arg-count \n[doc-arg-ptr]
+. doc-parse-space-vector
+. \}
+. doc-print-recursive
+. \}
+. el \{\
+. nop \*[doc-Pa-font]\[ti]\f[]\c
+. doc-print-and-reset
+. \}
+..
+.ec
+.
+.
+.\" NS Sy user macro
+.\" NS symbolics
+.\" NS
+.\" NS width register 'Sy' set in doc-common
+.
+.als Sy doc-generic-macro
+.ds doc-Sy-usage symbolic_text
+.
+.
+.\" NS Me user macro
+.\" NS menu entries
+.\" NS
+.\" NS width register 'Me' set in doc-common
+.
+.als Me doc-generic-macro
+.ds doc-Me-usage menu_entry
+.
+.
+.\" NS Tn user macro
+.\" NS trade name
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register 'Tn' set in doc-common
+.
+.eo
+.de Tn
+. if !\n[doc-arg-count] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Tn
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .Tn trade_name ... (#\n[.c])
+. \}
+.
+. if !\n[doc-arg-count] \
+. return
+.
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-count] >= \n[doc-arg-ptr]) \{\
+. nr doc-curr-font \n[.f]
+. nop \)\c
+. ie !\n[doc-is-reference] \{\
+. nop \)\*[doc-Tn-font]\c
+. doc-print-recursive
+. \}
+. el \
+. doc-do-references
+. \}
+. el \{\
+. tm Usage: .Tn trade_name ... (#\n[.c])
+. doc-reset-args
+. \}
+..
+.ec
+.
+.
+.\" NS Va user macro
+.\" NS variable name
+.\" NS
+.\" NS width register 'Va' set in doc-common
+.
+.als Va doc-generic-macro
+.ds doc-Va-usage variable_name
+.
+.
+.\" NS No user macro
+.\" NS normal text macro (default text style if mess up)
+.\" NS
+.\" NS width register 'No' set in doc-common
+.
+.als No doc-generic-macro
+.ds doc-No-usage normal_text
+.
+.
+.\" NS doc-quote-left global string
+.\" NS left quotation character for 'doc-enclose-string' and
+.\" NS 'doc-enclose-open'
+.
+.ds doc-quote-left
+.
+.
+.\" NS doc-quote-right global string
+.\" NS right quotation character for 'doc-enclose-string' and
+.\" NS 'doc-enclose-close'
+.
+.ds doc-quote-right
+.
+.
+.\" NS Op user macro
+.\" NS option expression (i.e., enclose string in square brackets)
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register 'Op' set in doc-common
+.
+.eo
+.de Op
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Op
+.
+. ds doc-quote-left "\*[doc-left-bracket]
+. ds doc-quote-right "\*[doc-right-bracket]
+.
+. doc-enclose-string \$@
+..
+.ec
+.
+.
+.\" NS Aq user macro
+.\" NS enclose string in angle brackets
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register 'Aq' set in doc-common
+.
+.eo
+.de Aq
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Aq
+.
+. ie "\*[doc-macro-name]"An" \{\
+. ds doc-quote-left <
+. ds doc-quote-right >
+. \}
+. el \{\
+. ds doc-quote-left \[la]
+. ds doc-quote-right \[ra]
+. \}
+.
+. doc-enclose-string \$@
+..
+.ec
+.
+.
+.\" NS Bq user macro
+.\" NS enclose string in square brackets
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register 'Bq' set in doc-common
+.
+.eo
+.de Bq
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Bq
+.
+. ds doc-quote-left "\*[doc-left-bracket]
+. ds doc-quote-right "\*[doc-right-bracket]
+.
+. doc-enclose-string \$@
+..
+.ec
+.
+.
+.\" NS Brq user macro
+.\" NS enclose string in braces
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register 'Brq' set in doc-common
+.
+.eo
+.de Brq
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Brq
+.
+. ds doc-quote-left {
+. ds doc-quote-right }
+.
+. doc-enclose-string \$@
+..
+.ec
+.
+.
+.\" NS Dq user macro
+.\" NS enclose string in double quotes
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register 'Dq' set in doc-common
+.
+.eo
+.de Dq
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Dq
+.
+. ds doc-quote-left "\*[Lq]
+. ds doc-quote-right "\*[Rq]
+.
+. doc-enclose-string \$@
+..
+.ec
+.
+.
+.\" NS Eq user macro
+.\" NS enclose string in user-defined quotes (args 1 and 2)
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register 'Eq' set in doc-common
+.
+.eo
+.de Eq
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Eq
+.
+. ds doc-quote-left "\$1
+. ds doc-quote-right "\$2
+.
+. shift 2
+. doc-enclose-string \$@
+..
+.ec
+.
+.
+.\" NS Pq user macro
+.\" NS enclose string in parentheses
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register 'Pq' set in doc-common
+.
+.eo
+.de Pq
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Pq
+.
+. ds doc-quote-left "\*[doc-left-parenthesis]
+. ds doc-quote-right "\*[doc-right-parenthesis]
+.
+. doc-enclose-string \$@
+..
+.ec
+.
+.
+.\" NS Ql user macro
+.\" NS quoted literal
+.\"
+.\" is in file doc-[dit|n]roff
+.
+.
+.\" NS Qq user macro
+.\" NS enclose string in straight double quotes
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register 'Qq' set in doc-common
+.
+.eo
+.de Qq
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Qq
+.
+. ds doc-quote-left "\*[q]
+. ds doc-quote-right "\*[q]
+.
+. doc-enclose-string \$@
+..
+.ec
+.
+.
+.\" NS Sq user macro
+.\" NS enclose string in single quotes
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register 'Sq' set in doc-common
+.
+.eo
+.de Sq
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Sq
+.
+. ds doc-quote-left "\*[doc-left-singlequote]
+. ds doc-quote-right "\*[doc-right-singlequote]
+.
+. doc-enclose-string \$@
+..
+.ec
+.
+.
+.\" NS Es user macro
+.\" NS set up arguments (i.e., the left and right quotation character
+.\" NS as first and second argument) for .En call
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.
+.eo
+.de Es
+. if !\n[doc-arg-count] \{\
+. ie (\n[.$] > 2) \{\
+. ds doc-macro-name Es
+. doc-parse-args \$@
+. \}
+. el \{\
+. ds doc-quote-left "\$1
+. ds doc-quote-right "\$2
+. \}\}
+.
+. if !\n[doc-arg-count] \
+. return
+.
+. nr doc-arg-ptr +1
+. ds doc-quote-left "\*[doc-arg\n[doc-arg-ptr]]
+. nr doc-arg-ptr +1
+. ds doc-quote-right "\*[doc-arg\n[doc-arg-ptr]]
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-count] >= \n[doc-arg-ptr]) \
+. doc-do-\n[doc-type\n[doc-arg-ptr]]
+. el \
+. doc-print-and-reset
+..
+.ec
+.
+.
+.\" NS doc-have-slot global register (bool)
+.\" NS set if 'doc-enclose-string' has created a slot for closing
+.\" NS delimiter
+.
+.nr doc-have-slot 0
+.
+.
+.\" NS doc-enclose-string macro
+.\" NS enclose string with given args (e.g. [ and ])
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-argXXX
+.\" NS doc-have-slot
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-des
+.\" NS doc-reg-des1
+.\" NS doc-reg-des2
+.\" NS
+.\" NS requires:
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.
+.eo
+.de doc-enclose-string
+. if \n[doc-in-synopsis-section] \
+. doc-set-hard-space
+.
+. if !\n[doc-arg-count] \{\
+. ie \n[.$] \
+. doc-parse-args \$@
+. el \{\
+. nop \)\*[doc-quote-left]\*[doc-quote-right]
+. \}\}
+.
+. if !\n[doc-arg-count] \
+. return
+.
+. nr doc-curr-font \n[.f]
+.
+. nr doc-arg-ptr +1
+. doc-print-prefixes
+. \" the final '\)' prevents hyphenation in case next character is '\%'
+. nop \)\*[doc-quote-left]\)\c
+. ie (\n[doc-arg-count] < \n[doc-arg-ptr]) \{\
+. \" last argument
+. nop \)\*[doc-quote-right]\)\c
+. doc-print-and-reset
+. \}
+. el \{\
+. \" test whether last arguments are of type closing punctuation
+. \" resp. suffix
+. ie (\n[doc-type\n[doc-arg-count]] == 3) \{\
+. nr doc-reg-des (\n[doc-arg-count] - 1)
+. while (\n[doc-type\n[doc-reg-des]] == 3) \
+. nr doc-reg-des -1
+.
+. \" prepend closing delimiter
+. nr doc-reg-des +1
+. ds doc-arg\n[doc-reg-des] "\*[doc-quote-right]\)\*[doc-arg\n[doc-reg-des]]
+. \}
+. el \{\
+. \" test whether last arguments are macros which continue the line
+. \" logically
+. nr doc-reg-des \n[doc-arg-count]
+. while (\n[doc-reg-des] >= \n[doc-arg-ptr]) \{\
+. if !\A'\*[doc-arg\n[doc-reg-des]]' \
+. break
+. if !d doc-after-\*[doc-arg\n[doc-reg-des]] \
+. break
+. nr doc-reg-des -1
+. \}
+.
+. \" if there are no trailing macros to be skipped, append argument
+. ie (\n[doc-reg-des] == \n[doc-arg-count]) \
+. doc-append-arg "\)\*[doc-quote-right]\)" 3
+. el \{\
+. \" if a previous call to 'doc-enclose-string' has already
+. \" created a slot, prepend argument
+. ie \n[doc-have-slot] \
+. ds doc-arg\n[doc-reg-des] "\*[doc-quote-right]\)\*[doc-arg\n[doc-reg-des]]
+. el \{\
+. \" we have to shift all arguments to the right
+. nr doc-reg-des +1
+. nr doc-reg-des1 \n[doc-arg-count]
+. nr doc-reg-des2 (\n[doc-arg-count] + 1)
+. while (\n[doc-reg-des1] >= \n[doc-reg-des]) \{\
+. rn doc-arg\n[doc-reg-des1] doc-arg\n[doc-reg-des2]
+. rnn doc-type\n[doc-reg-des1] doc-type\n[doc-reg-des2]
+. rn doc-space\n[doc-reg-des1] doc-space\n[doc-reg-des2]
+. nr doc-reg-des1 -1
+. nr doc-reg-des2 -1
+. \}
+. nr doc-arg-count +1
+.
+. \" finally, insert closing delimiter into the freed slot and
+. \" recompute spacing vector
+. ds doc-arg\n[doc-reg-des] "\)\*[doc-quote-right]\)
+. nr doc-type\n[doc-reg-des] 3
+. nr doc-num-args (\n[doc-arg-count] - \n[doc-reg-des] + 1)
+. nr doc-arg-count (\n[doc-reg-des] - 1)
+. doc-parse-space-vector
+. nr doc-have-slot 1
+. \}\}\}
+.
+. doc-do-\n[doc-type\n[doc-arg-ptr]]
+. \}
+.
+. if \n[doc-in-synopsis-section] \
+. doc-set-soft-space
+..
+.ec
+.
+.
+.\" NS En user macro
+.\" NS enclose arguments with quotation characters set up with '.Es'
+.
+.als En doc-enclose-string
+.
+.
+.\" NS Ao user macro
+.\" NS angle open
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register 'Ao' set in doc-common
+.
+.eo
+.de Ao
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Ao
+.
+. ie "\*[doc-macro-name]"An" \
+. ds doc-quote-left <
+. el \
+. ds doc-quote-left \[la]
+.
+. doc-enclose-open \$@
+..
+.ec
+.
+.
+.\" NS Ac user macro
+.\" NS angle close
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register 'Ac' set in doc-common
+.
+.eo
+.de Ac
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Ac
+.
+. ie "\*[doc-macro-name]"An" \
+. ds doc-quote-right >
+. el \
+. ds doc-quote-right \[ra]
+.
+. doc-enclose-close \$@
+..
+.ec
+.
+.
+.\" NS Bo user macro
+.\" NS bracket open
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register 'Bo' set in doc-common
+.
+.eo
+.de Bo
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Bo
+.
+. ds doc-quote-left "\*[doc-left-bracket]
+.
+. doc-enclose-open \$@
+..
+.ec
+.
+.
+.\" NS Bc user macro
+.\" NS bracket close
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register 'Bc' set in doc-common
+.
+.eo
+.de Bc
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Bc
+.
+. ds doc-quote-right "\*[doc-right-bracket]
+.
+. doc-enclose-close \$@
+..
+.ec
+.
+.
+.\" NS Bro user macro
+.\" NS brace open
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register 'Bro' set in doc-common
+.
+.eo
+.de Bro
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Bo
+.
+. ds doc-quote-left {
+.
+. doc-enclose-open \$@
+..
+.ec
+.
+.
+.\" NS Brc user macro
+.\" NS brace close
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register 'Brc' set in doc-common
+.
+.eo
+.de Brc
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Bc
+.
+. ds doc-quote-right }
+.
+. doc-enclose-close \$@
+..
+.ec
+.
+.
+.\" NS Do user macro
+.\" NS double quote open
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register 'Do' set in doc-common
+.
+.eo
+.de Do
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Do
+.
+. ds doc-quote-left "\*[Lq]
+.
+. doc-enclose-open \$@
+..
+.ec
+.
+.
+.\" NS Dc user macro
+.\" NS double quote close
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register 'Dc' set in doc-common
+.
+.eo
+.de Dc
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Dc
+.
+. ds doc-quote-right "\*[Rq]
+.
+. doc-enclose-close \$@
+..
+.ec
+.
+.
+.\" NS Eo user macro
+.\" NS enclose open (using first argument as beginning of enclosure)
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register 'Eo' set in doc-common
+.
+.eo
+.de Eo
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Eo
+.
+. ds doc-quote-left "\$1
+.
+. shift
+. doc-enclose-open \$@
+..
+.ec
+.
+.
+.\" NS Ec user macro
+.\" NS enclose close (using first argument as end of enclosure)
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register 'Ec' set in doc-common
+.
+.eo
+.de Ec
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Ec
+.
+. ds doc-quote-right "\$1
+.
+. shift
+. doc-enclose-close \$@
+..
+.ec
+.
+.
+.\" NS Oo user macro
+.\" NS option open
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register 'Oo' set in doc-common
+.
+.eo
+.de Oo
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Oo
+.
+. ds doc-quote-left [
+.
+. doc-enclose-open \$@
+..
+.ec
+.
+.
+.\" NS Oc user macro
+.\" NS option close
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register 'Oc' set in doc-common
+.
+.eo
+.de Oc
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Oc
+.
+. ds doc-quote-right ]
+.
+. doc-enclose-close \$@
+..
+.ec
+.
+.
+.\" NS Po user macro
+.\" NS parenthesis open
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register 'Po' set in doc-common
+.
+.eo
+.de Po
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Po
+.
+. ds doc-quote-left "\*[doc-left-parenthesis]
+.
+. doc-enclose-open \$@
+..
+.ec
+.
+.
+.\" NS Pc user macro
+.\" NS parenthesis close
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register 'Pc' set in doc-common
+.
+.eo
+.de Pc
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Pc
+.
+. ds doc-quote-right "\*[doc-right-parenthesis]
+.
+. doc-enclose-close \$@
+..
+.ec
+.
+.
+.\" NS Qo user macro
+.\" NS straight double quote open
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register 'Qo' set in doc-common
+.
+.eo
+.de Qo
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Qo
+.
+. ds doc-quote-left "\*[q]
+.
+. doc-enclose-open \$@
+..
+.ec
+.
+.
+.\" NS Qc user macro
+.\" NS straight double quote close
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register 'Qc' set in doc-common
+.
+.eo
+.de Qc
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Qc
+.
+. ds doc-quote-right "\*[q]
+.
+. doc-enclose-close \$@
+..
+.ec
+.
+.
+.\" NS So user macro
+.\" NS single quote open
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register 'So' set in doc-common
+.
+.eo
+.de So
+. if !\n[doc-arg-count] \
+. ds doc-macro-name So
+.
+. ds doc-quote-left "\*[doc-left-singlequote]
+.
+. doc-enclose-open \$@
+..
+.ec
+.
+.
+.\" NS Sc user macro
+.\" NS single quote close
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register 'Sc' set in doc-common
+.
+.eo
+.de Sc
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Sc
+.
+. ds doc-quote-right "\*[doc-right-singlequote]
+.
+. doc-enclose-close \$@
+..
+.ec
+.
+.
+.\" NS Xo user macro
+.\" NS extend open
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register 'Xo' set in doc-common
+.
+.eo
+.de Xo
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Xo
+.
+. ds doc-quote-left
+.
+. doc-enclose-open \$@
+..
+.ec
+.
+.
+.\" NS Xc user macro
+.\" NS extend close
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register 'Xc' set in doc-common
+.
+.eo
+.de Xc
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Xc
+.
+. ds doc-quote-right
+.
+. doc-enclose-close \$@
+..
+.ec
+.
+.
+.\" NS doc-nesting-level global register
+.\" NS used by 'doc-enclose-open' and 'doc-enclose-close'
+.
+.nr doc-nesting-level 0
+.
+.
+.\" NS doc-in-list global register (bool)
+.\" NS whether we are in (logical) .It
+.
+.nr doc-in-list 0
+.
+.
+.\" NS doc-enclose-open macro
+.\" NS enclose string open
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-nesting-level
+.
+.eo
+.de doc-enclose-open
+. if !\n[doc-arg-count] \
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. doc-print-prefixes
+. nr doc-arg-ptr -1
+.
+. nop \)\*[doc-quote-left]\)\c
+.
+. \" start enclosure box
+. box doc-enclosure-box\n[doc-nesting-level]
+. ev doc-enclosure-env\n[doc-nesting-level]
+. evc 0
+. in 0
+. nf
+. \" we insert something to make .chop always work
+. nop \&\c
+.
+. \" increase nesting level *after* parsing of arguments
+. nr doc-nesting-level +1
+.
+. if \n[doc-arg-count] \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-count] >= \n[doc-arg-ptr]) \
+. doc-print-recursive
+. el \
+. doc-reset-args
+. \}
+..
+.ec
+.
+.
+.\" NS doc-enclose-close macro
+.\" NS enclose string close
+.\" NS
+.\" NS modifies:
+.\" NS doc-nesting-level
+.
+.eo
+.de doc-enclose-close
+. nr doc-nesting-level -1
+.
+. \" finish enclosure box
+. br
+. ev
+. box
+. chop doc-enclosure-box\n[doc-nesting-level]
+. unformat doc-enclosure-box\n[doc-nesting-level]
+.
+. nh
+. nop \*[doc-enclosure-box\n[doc-nesting-level]]\c
+. nop \)\*[doc-quote-right]\)\c
+.
+. if !\n[doc-arg-count] \{\
+. doc-parse-args \$@
+.
+. if !\n[.$] \
+. doc-print-and-reset
+. \}
+.
+. if \n[doc-arg-count] \{\
+. ie (\n[doc-arg-count] > \n[doc-arg-ptr]) \{\
+. nop \)\*[doc-space\n[doc-arg-ptr]]\c
+. nr doc-arg-ptr +1
+. doc-print-recursive
+. \}
+. el \
+. doc-print-and-reset
+. \}
+.
+. \" shall we finish .It macro?
+. if !"\*[doc-macro-name]"It" \
+. if \n[doc-in-list] \
+. if !\n[doc-nesting-level] \
+. doc-\*[doc-list-type-stack\n[doc-list-depth]]
+..
+.ec
+.
+.
+.\" NS Pf user macro
+.\" NS prefix: '.Pf prefix arg ...'
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register 'Pf' set in doc-common
+.
+.eo
+.de Pf
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Pf
+.
+. ie \n[doc-arg-count] \{\
+. ie ((\n[doc-arg-count] - \n[doc-arg-ptr]) > 1) \{\
+. nr doc-arg-ptr +1
+. nop \)\*[doc-arg\n[doc-arg-ptr]]\c
+. \}
+. el \
+. tm mdoc warning: .Pf: trailing prefix (#\n[.c])
+. \}
+. el \{\
+. nop \)\$1\)\c
+. shift
+. ie \n[.$] \
+. doc-parse-args \$@
+. el \{\
+. tm mdoc warning: .Pf: missing arguments (#\n[.c])
+. nop \)
+. \}\}
+.
+. if \n[doc-arg-count] \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-count] < \n[doc-arg-ptr]) \
+. doc-print-and-reset
+. el \
+. doc-do-\n[doc-type\n[doc-arg-ptr]]
+. \}
+..
+.ec
+.
+.
+.\" NS Ns user macro
+.\" NS remove space (space removal done by 'doc-parse-args')
+.\" NS
+.\" NS modifies:
+.\" NS doc-argXXX
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register 'Ns' set in doc-common
+.
+.eo
+.de Ns
+. if !\n[doc-arg-count] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Ns
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .Ns must be called with arguments (#\n[.c])
+. \}
+.
+. if \n[doc-arg-count] \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-count] >= \n[doc-arg-ptr]) \
+. doc-print-recursive
+. el \
+. doc-reset-args
+. \}
+..
+.ec
+.
+.
+.\" NS Ap user macro
+.\" NS append an apostrophe
+.\" NS
+.\" NS width register 'Ap' set in doc-common
+.
+.eo
+.de Ap
+. ie !\n[doc-arg-count] \
+. tm Usage: 'Ap' cannot be first macro on a line (no '.Ap') (#\n[.c])
+. el \{\
+. nop \)'\)\c
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-count] >= \n[doc-arg-ptr]) \
+. doc-print-recursive
+. el \
+. doc-reset-args
+. \}
+..
+.ec
+.
+.
+.\" NS doc-space global string
+.\" NS current inter-argument space
+.
+.ds doc-space "\*[doc-soft-space]
+.
+.
+.\" NS doc-soft-space constant string
+.\" NS soft (stretchable) space (defined in doc-common)
+.
+.
+.\" NS doc-hard-space constant string
+.\" NS hard (unpaddable) space (defined in doc-common)
+.
+.
+.\" NS doc-set-hard-space macro
+.\" NS set current space string to hard (unpaddable) space.
+.\" NS
+.\" NS modifies:
+.\" NS doc-saved-space
+.\" NS doc-space
+.
+.eo
+.de doc-set-hard-space
+. ie "\*[doc-space]"" \
+. ds doc-saved-space "\*[doc-hard-space]
+. el \
+. ds doc-space "\*[doc-hard-space]
+..
+.ec
+.
+.
+.\" NS doc-set-soft-space macro
+.\" NS set current space string to soft space
+.\" NS
+.\" NS modifies:
+.\" NS doc-saved-space
+.\" NS doc-space
+.
+.eo
+.de doc-set-soft-space
+. ie "\*[doc-space]"" \
+. ds doc-saved-space "\*[doc-soft-space]
+. el \
+. ds doc-space "\*[doc-soft-space]
+..
+.ec
+.
+.
+.\" NS doc-space-mode global register (bool)
+.\" NS default is one (space mode on)
+.
+.nr doc-space-mode 1
+.
+.
+.\" NS doc-saved-space global string
+.\" NS saved value of 'doc-space'
+.
+.ds doc-saved-space "\*[doc-space]
+.
+.
+.\" NS doc-have-space global register (bool)
+.\" NS set if last command was horizontal space
+.
+.nr doc-have-space 0
+.
+.
+.\" NS Sm user macro
+.\" NS space mode ('.Sm'/'.Sm on'/'.Sm off')
+.\" NS
+.\" NS without argument, toggle space mode
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-count
+.\" NS doc-arg-ptr
+.\" NS doc-argXXX
+.\" NS doc-macro-name
+.\" NS doc-num-args
+.\" NS doc-saved-space
+.\" NS doc-space
+.\" NS doc-space-mode
+.\" NS doc-spaceXXX
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-Sm
+.\" NS
+.\" NS width register 'Sm' set in doc-common
+.
+.eo
+.de Sm
+. ie \n[doc-have-space] \
+. nr doc-reg-Sm 0
+. el \
+. nr doc-reg-Sm 1
+.
+. if !\n[doc-arg-count] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Sm
+. doc-parse-args \$@
+. \}
+. el \{\
+. ie \n[doc-space-mode] \{\
+. ds doc-saved-space "\*[doc-space]
+. ds doc-space
+. nr doc-space-mode 0
+. \}
+. el \{\
+. ds doc-space "\*[doc-saved-space]
+. nr doc-space-mode 1
+.
+. \" finish line only if it is interrupted and 'doc-have-space'
+. \" isn't set
+. if \n[doc-reg-Sm] \
+. if \n[.int] \
+. nop \)
+. \}
+. \}\}
+.
+. if !\n[doc-arg-count] \
+. return
+.
+. nr doc-arg-ptr +1
+.
+. \" avoid a warning message in case 'Sm' is the last parameter
+. if !d doc-arg\n[doc-arg-ptr] \
+. ds doc-arg\n[doc-arg-ptr]
+.
+. ie "\*[doc-arg\n[doc-arg-ptr]]"on" \{\
+. ds doc-space "\*[doc-saved-space]
+. nr doc-space-mode 1
+. \}
+. el \{\
+. ie "\*[doc-arg\n[doc-arg-ptr]]"off" \{\
+. ds doc-saved-space "\*[doc-space]
+. ds doc-space
+. nr doc-space-mode 0
+. \}
+. el \{\
+. \" no argument for Sm
+. nr doc-arg-ptr -1
+. ie \n[doc-space-mode] \{\
+. ds doc-saved-space "\*[doc-space]
+. ds doc-space
+. nr doc-space-mode 0
+. \}
+. el \{\
+. ds doc-space "\*[doc-saved-space]
+. nr doc-space-mode 1
+. \}
+. \}\}
+.
+. ie \n[doc-space-mode] \{\
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-count] - \n[doc-arg-ptr])
+. nr doc-arg-count \n[doc-arg-ptr]
+. if \n[doc-num-args] \
+. doc-parse-space-vector
+.
+. \" finish line only if it is interrupted and 'doc-have-space'
+. \" isn't set
+. if \n[doc-reg-Sm] \
+. if \n[.int] \
+. nop \)
+. \}
+. el \{\
+. \" reset remaining space vector elements
+. nr doc-reg-Sm (\n[doc-arg-ptr] + 1)
+. while (\n[doc-reg-Sm] <= \n[doc-arg-count]) \{\
+. ds doc-space\n[doc-reg-Sm]
+. nr doc-reg-Sm +1
+. \" the body of a 'while' request must end with the fitting '\}'!
+. \}
+. \}
+.
+. \" do we have parameters to print?
+. ie (\n[doc-arg-count] > \n[doc-arg-ptr]) \{\
+. \" skip 'Sm' argument
+. nr doc-arg-ptr +1
+. doc-print-recursive
+. \}
+. el \
+. doc-reset-args
+..
+.ec
+.
+.
+.\" NS doc-arg-type immediate register
+.\" NS argument type (macro=1, string=2, punctuation suffix=3,
+.\" NS punctuation prefix=4)
+.
+.nr doc-arg-type 0
+.
+.
+.\" NS doc-get-arg-type macro
+.\" NS get argument type
+.\" NS
+.\" NS this macro expects the width of the argument in 'doc-width'
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-type
+.
+.eo
+.de doc-get-arg-type
+. nr doc-arg-type 2
+.
+. if ((\n[doc-width] < 4) & \A'\$1') \{\
+. ie (\n[doc-width] == 1) \{\
+. if r doc-punct\$1 \
+. nr doc-arg-type \n[doc-punct\$1]
+. \}
+. el \
+. if r \$1 \
+. if d \$1 \
+. nr doc-arg-type 1
+. \}
+..
+.ec
+.
+.
+.\" NS doc-get-arg-type* macro
+.\" NS similar to as 'doc-get-arg-type' but uses doc-argXXX strings
+.\" NS
+.\" NS this macro sets the 'doc-width' register using the 'length'
+.\" NS request to get the number of characters in a string literally
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-type
+.\" NS doc-width
+.
+.eo
+.de doc-get-arg-type*
+. nr doc-arg-type 2
+. length doc-width "\*[doc-arg\$1]
+.
+. if ((\n[doc-width] < 4) & \A'\*[doc-arg\$1]') \{\
+. ie (\n[doc-width] == 1) \{\
+. if r doc-punct\*[doc-arg\$1] \
+. nr doc-arg-type \n[doc-punct\*[doc-arg\$1]]
+. \}
+. el \
+. if r \*[doc-arg\$1] \
+. if d \*[doc-arg\$1] \
+. nr doc-arg-type 1
+. \}
+..
+.ec
+.
+.
+.\" NS doc-set-spacing-1 macro
+.\" NS set spacing for macros
+.\" NS
+.\" NS modifies:
+.\" NS doc-spaceXXX
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dssfm
+.\" NS doc-reg-dssfm1
+.
+.eo
+.de doc-set-spacing-1
+. nr doc-reg-dssfm1 \n[\*[doc-arg\n[doc-arg-count]]]
+.
+. \" closing macros like .Ac, Bc., etc. have value 3 (remove space
+. \" before argument)
+. ie (\n[doc-reg-dssfm1] == 3) \{\
+. if \n[doc-arg-count] \{\
+. nr doc-reg-dssfm (\n[doc-arg-count] - 1)
+. ds doc-space\n[doc-reg-dssfm]
+. \}
+. ds doc-space\n[doc-arg-count] "\*[doc-space]
+. \}
+. el \{\
+. \" macros like .Ap and .Ns have value 2 (remove space before and
+. \" after argument)
+. ie (\n[doc-reg-dssfm1] == 2) \{\
+. if \n[doc-arg-count] \{\
+. nr doc-reg-dssfm (\n[doc-arg-count] - 1)
+. ds doc-space\n[doc-reg-dssfm]
+. \}
+. ds doc-space\n[doc-arg-count]
+. \}
+. el \
+. ds doc-space\n[doc-arg-count]
+. \}
+..
+.ec
+.
+.
+.\" NS doc-set-spacing-2 macro
+.\" NS set spacing for strings
+.\" NS
+.\" NS modifies:
+.\" NS doc-spaceXXX
+.
+.eo
+.de doc-set-spacing-2
+. ds doc-space\n[doc-arg-count] "\*[doc-space]
+..
+.ec
+.
+.
+.\" NS doc-set-spacing-3 macro
+.\" NS set spacing for punctuation suffixes
+.\" NS
+.\" NS modifies:
+.\" NS doc-spaceXXX
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dssfps
+.
+.eo
+.de doc-set-spacing-3
+. if \n[doc-arg-count] \{\
+. nr doc-reg-dssfps (\n[doc-arg-count] - 1)
+. ds doc-space\n[doc-reg-dssfps]
+. \}
+.
+. ds doc-space\n[doc-arg-count] "\*[doc-space]
+..
+.ec
+.
+.
+.\" NS doc-set-spacing-4 macro
+.\" NS set spacing for punctuation prefixes
+.\" NS
+.\" NS modifies:
+.\" NS doc-spaceXXX
+.
+.eo
+.de doc-set-spacing-4
+. ds doc-space\n[doc-arg-count]
+..
+.ec
+.
+.
+.\" type switches (on current argument doc-arg-ptr)
+.
+.
+.\" NS doc-do-1 macro
+.\" NS call request if macro
+.
+.eo
+.de doc-do-1
+. \*[doc-arg\n[doc-arg-ptr]]
+..
+.ec
+.
+.
+.\" NS doc-do-2 macro
+.\" NS call .doc-print-recursive if string
+.
+.als doc-do-2 doc-print-recursive
+.
+.
+.\" NS doc-do-3 macro
+.\" NS call .doc-print-recursive if punctuation suffix
+.
+.als doc-do-3 doc-print-recursive
+.
+.
+.\" NS doc-do-4 macro
+.\" NS call .doc-print-recursive if punctuation prefix
+.
+.als doc-do-4 doc-print-recursive
+.
+.
+.\" NS doc-fontmode-depth global register
+.\" NS font mode level
+.
+.nr doc-fontmode-depth 0
+.
+.
+.\" NS doc-fontmode-font-stackXXX global register
+.\" NS stack of saved current font values from 'Bf' macro
+.\" NS
+.\" NS limit:
+.\" NS doc-fontmode-depth
+.
+.nr doc-fontmode-font-stack0 0
+.
+.
+.\" NS doc-fontmode-size-stackXXX global register
+.\" NS stack of saved current size values from 'Bf' macro
+.\" NS
+.\" NS limit:
+.\" NS doc-fontmode-depth
+.
+.nr doc-fontmode-size-stack0 0
+.
+.
+.\" NS Bf user macro
+.\" NS begin font mode (will be begin-mode/end-mode in groff & TeX)
+.\" NS
+.\" NS modifies:
+.\" NS doc-fontmode-depth
+.\" NS doc-fontmode-font-stackXXX
+.\" NS doc-fontmode-size-stackXXX
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register 'Bf' set in doc-common
+.
+.eo
+.de Bf
+. ds doc-macro-name Bf
+.
+. ie \n[.$] \{\
+. nr doc-fontmode-depth +1
+.
+. \" save current font and size
+. nr doc-fontmode-font-stack\n[doc-fontmode-depth] \n[.f]
+. nr doc-fontmode-size-stack\n[doc-fontmode-depth] \n[.ps]
+.
+. ie "\$1"Em" \
+. nop \*[doc-Em-font]\c
+. el \{ .ie "\$1"Li" \
+. nop \*[doc-Li-font]\c
+. el \{ .ie "\$1"Sy" \
+. nop \*[doc-Sy-font]\c
+. el \{ .ie "\$1"-emphasis" \
+. nop \*[doc-Em-font]\c
+. el \{ .ie "\$1"-literal" \
+. nop \*[doc-Li-font]\c
+. el \{ .ie "\$1"-symbolic" \
+. nop \*[doc-Sy-font]\c
+. el \{\
+. tmc mdoc warning: Unknown keyword '\$1' in .Bf macro
+. tm1 " (#\n[.c])
+. \}\}\}\}\}\}\}
+. el \
+. tm Usage: .Bf [Em | -emphasis | Li | -literal | Sy | -symbolic] (#\n[.c])
+..
+.ec
+.
+.
+.\" NS Ef user macro
+.\" NS end font mode
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register 'Ef' set in doc-common
+.
+.eo
+.de Ef
+. ds doc-macro-name Ef
+.
+. ie \n[doc-fontmode-depth] \{\
+. \" restore saved font and size
+. nop \)\f[\n[doc-fontmode-font-stack\n[doc-fontmode-depth]]]\c
+. nop \)\s[\n[doc-fontmode-size-stack\n[doc-fontmode-depth]]u]\c
+.
+. nr doc-fontmode-font-stack\n[doc-fontmode-depth] 0
+. nr doc-curr-font \n[.f]
+. nr doc-fontmode-size-stack\n[doc-fontmode-depth] 0
+. nr doc-fontmode-depth -1
+. \}
+. el \
+. tm mdoc warning: Extraneous .Ef (#\n[.c])
+..
+.ec
+.
+.
+.\" NS doc-keep-type global register
+.\" NS current keep type; 1 is '-words', 2 is '-lines', 3 is unknown
+.
+.nr doc-keep-type 0
+.
+.
+.\" NS Bk user macro
+.\" NS begin keep
+.\" NS
+.\" NS modifies:
+.\" NS doc-keep-type
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register 'Bk' set in doc-common
+.
+.eo
+.de Bk
+. ds doc-macro-name Bk
+.
+. if \n[doc-keep-type] \
+. tm .Bk: nesting keeps not implemented yet. (#\n[.c])
+.
+. ie "\$1"-lines" \{\
+. nr doc-keep-type 2
+. tm .Bk -lines: Not implemented yet. (#\n[.c])
+. \}
+. el \{ .ie "\$1"-words" \{\
+. nr doc-keep-type 1
+. doc-set-hard-space
+. \}
+. el \{ .ie "\$1"" \{\
+. \" default
+. nr doc-keep-type 1
+. doc-set-hard-space
+. \}
+. el \{\
+. tm mdoc warning: Unknown keyword '\$1' in .Bk macro (#\n[.c])
+. nr doc-keep-type 3
+. \}\}\}
+.
+\#. nr doc-nesting-level +1
+..
+.ec
+.
+.
+.\" NS Ek user macro
+.\" NS end keep
+.\" NS
+.\" NS modifies:
+.\" NS doc-keep-type
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register 'Ek' set in doc-common
+.
+.eo
+.de Ek
+. ds doc-macro-name Ek
+.
+\#. nr doc-nesting-level -1
+.
+. ie \n[.$] \
+. tm Usage: .Ek (does not take arguments) (#\n[.c])
+. el \{\
+. if !\n[doc-keep-type] \
+. tm mdoc warning: .Ek found without .Bk before (#\n[.c])
+.
+. ie (\n[doc-keep-type] == 1) \
+. doc-set-soft-space
+. el \{ .if (\n[doc-keep-type] == 2) \
+. tm .Bk -lines: Not implemented yet. (#\n[.c])
+. \}\}
+.
+. nr doc-keep-type 0
+.
+\#. if !"\*[doc-out-string]"" \
+\#. doc-print-out-string
+..
+.ec
+.
+.
+.\" NS doc-display-depth global register
+.\" NS display level
+.
+.nr doc-display-depth 0
+.
+.
+.\" NS doc-is-compact global register (bool)
+.\" NS set if the 'compact' keyword is given
+.
+.nr doc-is-compact 0
+.
+.
+.\" NS doc-display-type-stackXXX global string
+.\" NS the display type stack
+.\" NS
+.\" NS limit:
+.\" NS doc-display-depth
+.
+.ds doc-display-type-stack0
+.
+.
+.\" NS doc-display-indent-stackXXX global register
+.\" NS stack of display indentation values
+.\" NS
+.\" NS limit:
+.\" NS doc-display-depth
+.
+.nr doc-display-indent-stack0 0
+.
+.
+.\" NS doc-display-ad-stackXXX global register
+.\" NS stack of saved adjustment modes
+.\" NS
+.\" NS limit:
+.\" NS doc-display-depth
+.
+.nr doc-display-ad-stack0 0
+.
+.
+.\" NS doc-display-fi-stackXXX global register
+.\" NS stack of saved fill modes
+.\" NS
+.\" NS limit:
+.\" NS doc-display-depth
+.
+.nr doc-display-fi-stack0 0
+.
+.
+.\" NS doc-display-ft-stackXXX global register
+.\" NS stack of saved fonts
+.\" NS
+.\" NS limit:
+.\" NS doc-display-depth
+.
+.nr doc-display-ft-stack0 0
+.
+.
+.\" NS doc-display-ps-stackXXX global register
+.\" NS stack of saved font sizes
+.\" NS
+.\" NS limit:
+.\" NS doc-display-depth
+.
+.nr doc-display-ps-stack0 0
+.
+.
+.\" NS Bd user macro
+.\" NS begin display
+.\" NS
+.\" NS width register 'Bd' set in doc-common
+.\" NS
+.\" NS modifies:
+.\" NS doc-curr-font
+.\" NS doc-display-depth
+.\" NS doc-display-ad-stackXXX
+.\" NS doc-display-fi-stackXXX
+.\" NS doc-display-ft-stackXXX
+.\" NS doc-display-ps-stackXXX
+.\" NS doc-display-file
+.\" NS doc-display-indent-stackXXX
+.\" NS doc-display-type-stackXXX
+.\" NS doc-is-compact
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-Bd
+.
+.eo
+.de Bd
+. ds doc-macro-name Bd
+.
+. if !\n[.$] \{\
+. tm1 "Usage: .Bd {-literal | -filled | -ragged | -centered | -unfilled}
+. tm1 " [-offset [string]] [-compact] [-file name] (#\n[.c])
+. return
+. \}
+.
+. nr doc-is-compact 0
+. ds doc-display-file
+. nr doc-reg-Bd 1
+. nr doc-display-depth +1
+.
+. \" save current adjustment and fill modes
+. nr doc-display-ad-stack\n[doc-display-depth] \n[.j]
+. nr doc-display-fi-stack\n[doc-display-depth] \n[.u]
+.
+. ie "\$1"-literal" \{\
+. ds doc-display-type-stack\n[doc-display-depth] literal
+. nr doc-display-ft-stack\n[doc-display-depth] \n[.f]
+. nr doc-display-ps-stack\n[doc-display-depth] \n[.ps]
+.
+. ie t \
+. ta T 9n
+. el \
+. ta T 8n
+. nf
+. \}
+. el \{ .ie "\$1"-filled" \{\
+. ds doc-display-type-stack\n[doc-display-depth] filled
+. ad b
+. fi
+. \}
+. el \{ .ie "\$1"-ragged" \{\
+. ds doc-display-type-stack\n[doc-display-depth] ragged
+. na
+. fi
+. \}
+. el \{ .ie "\$1"-centered" \{\
+. ds doc-display-type-stack\n[doc-display-depth] centered
+. ad c
+. fi
+. \}
+. el \{ .ie "\$1"-unfilled" \{\
+. ds doc-display-type-stack\n[doc-display-depth] unfilled
+. nf
+. \}
+. el \{\
+. tm1 "mdoc warning: Unknown keyword '\$1' (or missing display type)
+. tm1 " in .Bd macro (#\n[.c])
+. nr doc-reg-Bd 0
+. \}\}\}\}\}
+.
+. \" have we seen an argument?
+. if \n[doc-reg-Bd] \{\
+. shift
+. \" check other arguments
+. if \n[.$] \
+. doc-do-Bd-args \$@
+. \}
+.
+. \" avoid warning about non-existent register
+. if !r doc-display-indent-stack\n[doc-display-depth] \
+. nr doc-display-indent-stack\n[doc-display-depth] 0
+.
+. if \n[doc-display-indent-stack\n[doc-display-depth]] \
+. in +\n[doc-display-indent-stack\n[doc-display-depth]]u
+.
+. if !\n[doc-is-compact] \
+. sp \n[doc-display-vertical]u
+.
+. if "\*[doc-display-type-stack\n[doc-display-depth]]"literal" \
+. if t \
+. nop \*[doc-Li-font]\c
+.
+. if !\n[cR] \
+. ne 2v
+.
+. if !"\*[doc-display-file]"" \
+. so \*[doc-display-file]
+.
+. nr doc-is-compact 0
+. ds doc-display-file
+..
+.ec
+.
+.
+.\" NS doc-do-Bd-args macro
+.\" NS resolve remaining .Bd arguments
+.\" NS
+.\" NS modifies:
+.\" NS doc-display-file
+.\" NS doc-display-indent-stackXXX
+.\" NS doc-is-compact
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-ddBa
+.\" NS doc-reg-ddBa1
+.\" NS doc-reg-ddBa2
+.\" NS doc-reg-ddBa3
+.\" NS doc-reg-ddBa4
+.\" NS doc-str-ddBa
+.
+.eo
+.de doc-do-Bd-args
+. nr doc-reg-ddBa 1
+.
+. ie "\$1"-offset" \{\
+. nr doc-reg-ddBa 2
+.
+. ie "\$2"left" \
+. nr doc-display-indent-stack\n[doc-display-depth] 0
+. el \{ .ie "\$2"right" \
+. nr doc-display-indent-stack\n[doc-display-depth] (\n[.l]u / 3u)
+. el \{ .ie "\$2"center" \
+. nr doc-display-indent-stack\n[doc-display-depth] ((\n[.l]u - \n[.i]u) / 4u)
+. el \{ .ie "\$2"indent" \
+. nr doc-display-indent-stack\n[doc-display-depth] \n[doc-display-indent]u
+. el \{ .ie "\$2"indent-two" \
+. nr doc-display-indent-stack\n[doc-display-depth] (\n[doc-display-indent]u + \n[doc-display-indent]u)
+. el \
+. nr doc-reg-ddBa 1
+. \}\}\}\}
+.
+. \" not a known keyword
+. if (\n[doc-reg-ddBa] == 1) \{\
+. nr doc-reg-ddBa 2
+.
+. nr doc-reg-ddBa1 0
+. if \B'(\$2)' \{\
+. \" disable warnings related to scaling indicators (32)
+. nr doc-reg-ddBa2 \n[.warn]
+. warn (\n[.warn] - (\n[.warn] / 32 % 2 * 32))
+.
+. \" values without a scaling indicator are taken as strings;
+. \" we test whether the parameter string with and without the
+. \" last character yields identical numerical results (ignoring
+. \" the scaling indicator)
+. ds doc-str-ddBa "\$2
+. substring doc-str-ddBa 0 -2
+. if \B'(\*[doc-str-ddBa])' \{\
+. nr doc-reg-ddBa3 (;(\$2))
+. nr doc-reg-ddBa4 (\*[doc-str-ddBa])
+. if (\n[doc-reg-ddBa3] == \n[doc-reg-ddBa4]) \
+. nr doc-reg-ddBa1 1
+. \}
+.
+. \" enable all warnings again
+. warn \n[doc-reg-ddBa2]
+. \}
+.
+. ie \n[doc-reg-ddBa1] \
+. nr doc-display-indent-stack\n[doc-display-depth] \$2
+. el \{\
+. doc-get-width "\$2"
+. ie (\n[doc-width] <= 3) \{\
+. \" if the offset parameter is a macro, use the macro's
+. \" width as specified in doc-common
+. doc-get-arg-type "\$2"
+. ie (\n[doc-arg-type] == 1) \
+. nr doc-display-indent-stack\n[doc-display-depth] \n[\$2]
+. el \
+. nr doc-display-indent-stack\n[doc-display-depth] (\n[doc-width]u * \n[doc-fixed-width]u)
+. \}
+. el \
+. nr doc-display-indent-stack\n[doc-display-depth] (\n[doc-width]u * \n[doc-fixed-width]u)
+. \}\}
+. \}
+. el \{ .ie "\$1"-compact" \
+. nr doc-is-compact 1
+. el \{ .ie "\$1"-file" \{\
+. ie !"\$2"" \{\
+. ds doc-display-file "\$2
+. nr doc-reg-ddBa 2
+. \}
+. el \
+. tm mdoc warning: .Bd '-file' keyword requires argument (#\n[.c])
+. \}
+. el \
+. tm mdoc warning: Unknown keyword '\$1' in .Bd macro (#\n[.c])
+. \}\}
+.
+. if (\n[doc-reg-ddBa] < \n[.$]) \{\
+. shift \n[doc-reg-ddBa]
+. doc-do-Bd-args \$@
+. \}
+..
+.ec
+.
+.
+.\" NS Ed user macro
+.\" NS end display
+.\" NS
+.\" NS modifies:
+.\" NS doc-display-depth
+.\" NS doc-display-indent-stackXXX
+.\" NS doc-display-type-stackXXX
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register 'Ed' set in doc-common
+.
+.eo
+.de Ed
+. ds doc-macro-name Ed
+.
+. br
+.
+. if !\n[doc-display-depth] \{\
+. tm mdoc warning: Extraneous .Ed (#\n[.c])
+. nr doc-display-depth 1
+. \}
+.
+. if "\*[doc-display-type-stack\n[doc-display-depth]]"literal" \{\
+. ft \n[doc-display-ft-stack\n[doc-display-depth]]
+. ps \n[doc-display-ps-stack\n[doc-display-depth]]u
+. \}
+.
+. in -\n[doc-display-indent-stack\n[doc-display-depth]]u
+.
+. \" restore saved adjustment and fill modes
+. ie \n[doc-display-fi-stack\n[doc-display-depth]] \
+. fi
+. el \
+. nf
+. ad \n[doc-display-ad-stack\n[doc-display-depth]]
+.
+. nr doc-display-indent-stack\n[doc-display-depth] 0
+. ds doc-display-type-stack\n[doc-display-depth]
+. nr doc-display-depth -1
+..
+.ec
+.
+.
+.\" NS doc-list-type-stackXXX global string
+.\" NS stack of list types
+.\" NS
+.\" NS limit:
+.\" NS doc-list-depth
+.
+.ds doc-list-type-stack1
+.
+.
+.\" NS doc-list-indent-stackXXX global register
+.\" NS stack of list indentation values
+.\" NS
+.\" NS limit:
+.\" NS doc-list-depth
+.
+.nr doc-list-indent-stack1 0
+.
+.
+.\" NS doc-list-have-indent-stackXXX global register (bool)
+.\" NS an indentation value is active
+.\" NS
+.\" NS limit:
+.\" NS doc-list-depth
+.
+.nr doc-list-have-indent-stack1 0
+.
+.
+.\" NS Bl user macro
+.\" NS begin list
+.\" NS
+.\" NS width register 'Bl' set in doc-common
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-argXXX
+.\" NS doc-list-depth
+.\" NS doc-list-have-indent-stackXXX
+.\" NS doc-list-indent-stackXXX
+.\" NS doc-list-type-stackXXX
+.\" NS doc-macro-name
+.\" NS doc-num-args
+.\" NS doc-num-columns
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-Bl
+.
+.eo
+.de Bl
+. if !\n[.$] \{\
+. doc-Bl-usage
+. return
+. \}
+.
+. ds doc-macro-name Bl
+. nr doc-list-depth +1
+. nr doc-arg-ptr 1
+.
+. ie "\$1"-hang" \{\
+. ds doc-list-type-stack\n[doc-list-depth] hang-list
+. nr doc-list-indent-stack\n[doc-list-depth] 6n
+. nr doc-list-have-indent-stack\n[doc-list-depth] 1
+. \}
+. el \{ .ie "\$1"-tag" \{\
+. ds doc-list-type-stack\n[doc-list-depth] tag-list
+. nr doc-list-indent-stack\n[doc-list-depth] 6n
+. nr doc-list-have-indent-stack\n[doc-list-depth] 1
+. \}
+. el \{ .ie "\$1"-item" \{\
+. ds doc-list-type-stack\n[doc-list-depth] item-list
+. nr doc-list-have-indent-stack\n[doc-list-depth] 1
+. \}
+. el \{ .ie "\$1"-enum" \{\
+. ds doc-list-type-stack\n[doc-list-depth] enum-list
+. nr doc-list-indent-stack\n[doc-list-depth] 3n
+. nr doc-list-have-indent-stack\n[doc-list-depth] 1
+. \}
+. el \{ .ie "\$1"-bullet" \{\
+. ds doc-list-type-stack\n[doc-list-depth] bullet-list
+. nr doc-list-indent-stack\n[doc-list-depth] 2n
+. nr doc-list-have-indent-stack\n[doc-list-depth] 1
+. \}
+. el \{ .ie "\$1"-dash" \{\
+. ds doc-list-type-stack\n[doc-list-depth] dash-list
+. nr doc-list-indent-stack\n[doc-list-depth] 2n
+. nr doc-list-have-indent-stack\n[doc-list-depth] 1
+. \}
+. el \{ .ie "\$1"-hyphen" \{\
+. ds doc-list-type-stack\n[doc-list-depth] dash-list
+. nr doc-list-indent-stack\n[doc-list-depth] 2n
+. nr doc-list-have-indent-stack\n[doc-list-depth] 1
+. \}
+. el \{ .ie "\$1"-inset" \{\
+. ds doc-list-type-stack\n[doc-list-depth] inset-list
+. nr doc-list-have-indent-stack\n[doc-list-depth] 1
+. \}
+. el \{ .ie "\$1"-diag" \{\
+. ds doc-list-type-stack\n[doc-list-depth] diag-list
+. \}
+. el \{ .ie "\$1"-ohang" \{\
+. ds doc-list-type-stack\n[doc-list-depth] ohang-list
+. nr doc-list-have-indent-stack\n[doc-list-depth] 1
+. \}
+. el \{ .ie "\$1"-column" \{\
+. ds doc-list-type-stack\n[doc-list-depth] column-list
+. linetabs 1
+. \}
+. el \{\
+. tm1 "mdoc warning: Unknown list type '\$1' (or missing list type)
+. tm1 " in .Bl macro
+. tm
+. nr doc-arg-ptr 0
+. \}\}\}\}\}\}\}\}\}\}\}
+.
+. \" we have seen a list type
+. if !\n[doc-arg-ptr] \{\
+. doc-Bl-usage
+. doc-reset-args
+. nr doc-list-depth -1
+. return
+. \}
+.
+. shift
+.
+. \" fill argument vector
+. nr doc-reg-Bl 1
+. while (\n[doc-reg-Bl] <= \n[.$]) \{\
+. ds doc-arg\n[doc-reg-Bl] "\$[\n[doc-reg-Bl]]
+. \" dummy type and space so that doc-save-global-vars() doesn't warn
+. nr doc-type\n[doc-reg-Bl] 0
+. ds doc-space\n[doc-reg-Bl]
+. nr doc-reg-Bl +1
+. \}
+.
+. doc-increment-list-stack
+.
+. if \n[.$] \{\
+. nr doc-arg-count \n[.$]
+. nr doc-arg-ptr 0
+. doc-do-Bl-args
+.
+. in +\n[doc-list-offset-stack\n[doc-list-depth]]u
+.
+. \" initialize column list
+. if "\*[doc-list-type-stack\n[doc-list-depth]]"column-list" \{\
+. doc-set-column-tab \n[doc-num-columns]
+' in -\n[doc-column-indent-width]u
+. if !\n[doc-compact-list-stack\n[doc-list-depth]] \
+. sp \n[doc-display-vertical]u
+.
+. nf
+. nr doc-num-columns 0
+. \}\}
+.
+. doc-reset-args
+..
+.ec
+.
+.
+.\" NS doc-Bl-usage macro
+.
+.eo
+.de doc-Bl-usage
+. tm1 "Usage: .Bl {-hang | -ohang | -tag | -diag | -inset}
+. tm1 " [-width <string>]
+. tm1 " [-offset <string>] [-compact]
+. tm1 " .Bl -column [-offset <string>] <string1> <string2> ...
+. tm1 " .Bl {-item | -enum [-nested] | -bullet | -hyphen | -dash}
+. tm1 " [-offset <string>] [-compact] (#\n[.c])
+..
+.ec
+.
+.
+.\" NS doc-do-Bl-args macro
+.\" NS resolve remaining .Bl arguments
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-argXXX
+.\" NS doc-compact-list-stackXXX
+.\" NS doc-list-indent-stackXXX
+.\" NS doc-list-offset-stackXXX
+.\" NS doc-num-columns
+.\" NS doc-tag-prefix-stackXXX
+.\" NS
+.\" NS local variables:
+.\" NS doc-box-dBla
+.\" NS doc-env-dBla
+.\" NS doc-reg-dBla
+.\" NS doc-reg-dBla1
+.\" NS doc-reg-dBla2
+.\" NS doc-reg-dBla3
+.\" NS doc-reg-dBla4
+.\" NS doc-str-dBla
+.\" NS doc-str-dBla1
+.
+.eo
+.de doc-do-Bl-args
+. nr doc-arg-ptr +1
+.
+. if (\n[doc-arg-count] < \n[doc-arg-ptr]) \
+. return
+.
+. \" avoid a warning message in case e.g. '-offset' has no parameter
+. nr doc-reg-dBla (\n[doc-arg-ptr] + 1)
+. if (\n[doc-arg-count] < \n[doc-reg-dBla]) \
+. ds doc-arg\n[doc-reg-dBla]
+.
+. nr doc-reg-dBla 1
+.
+. ie "\*[doc-arg\n[doc-arg-ptr]]"-compact" \
+. nr doc-compact-list-stack\n[doc-list-depth] 1
+.
+. el \{ .ie "\*[doc-arg\n[doc-arg-ptr]]"-nested" \{\
+. ie (\n[doc-list-depth] > 1) \{\
+. nr doc-reg-dBla1 (\n[doc-list-depth] - 1)
+. ds doc-tag-prefix-stack\n[doc-list-depth] "\*[doc-tag-prefix-stack\n[doc-reg-dBla1]]
+. as doc-tag-prefix-stack\n[doc-list-depth] \n[doc-enum-list-count-stack\n[doc-reg-dBla1]].
+. length doc-reg-dBla1 "\*[doc-tag-prefix-stack\n[doc-list-depth]]
+. nr doc-list-indent-stack\n[doc-list-depth] +\n[doc-reg-dBla1]n
+. \}
+. el \
+. tm mdoc warning: '-nested' allowed with nested .Bl macros only (#\n[.c])
+. \}
+.
+. el \{ .ie "\*[doc-arg\n[doc-arg-ptr]]"-width" \{\
+. nr doc-arg-ptr +1
+. ds doc-str-dBla "\*[doc-arg\n[doc-arg-ptr]]
+. substring doc-str-dBla 0 0
+. ie '.'\*[doc-str-dBla]' \{\
+. ds doc-str-dBla "\*[doc-arg\n[doc-arg-ptr]]
+. substring doc-str-dBla 1
+. doc-first-parameter \*[doc-str-dBla]
+. doc-get-width "\*[doc-str-dfp]
+. doc-get-arg-type "\*[doc-str-dfp]
+. ie (\n[doc-arg-type] == 1) \
+. nr doc-reg-dBla1 1
+. el \
+. nr doc-reg-dBla1 0
+. \}
+. el \
+. nr doc-reg-dBla1 0
+. ds doc-str-dBla "\*[doc-arg\n[doc-arg-ptr]]
+.
+. ie \n[doc-reg-dBla1] \{\
+. \" execute string in a box to get the width of the diversion
+. ds doc-str-dBla \*[doc-arg\n[doc-arg-ptr]]
+. doc-save-global-vars
+. doc-reset-args
+. box doc-box-dBla
+. ev doc-env-dBla
+. evc 0
+. in 0
+. nf
+. nop \*[doc-str-dBla]
+. br
+. ev
+. box
+. doc-restore-global-vars
+. doc-get-width \h'\n[dl]u'
+. nr doc-list-indent-stack\n[doc-list-depth] (\n[doc-width]u * \n[doc-fixed-width]u)
+. \}
+. el \{\
+. \" test whether argument is a valid numeric expression
+. nr doc-reg-dBla1 0
+. if \B'(\*[doc-str-dBla])' \{\
+. \" disable warnings related to scaling indicators (32)
+. nr doc-reg-dBla2 \n[.warn]
+. warn (\n[.warn] - (\n[.warn] / 32 % 2 * 32))
+.
+. \" values without a scaling indicator are taken as strings;
+. \" we test whether the parameter string with and without the
+. \" last character yields identical numerical results (ignoring
+. \" the scaling indicator)
+. ds doc-str-dBla1 "\*[doc-str-dBla]
+. substring doc-str-dBla1 0 -2
+. if \B'(\*[doc-str-dBla1])' \{\
+. nr doc-reg-dBla3 (;(\*[doc-str-dBla]))
+. nr doc-reg-dBla4 (\*[doc-str-dBla1])
+. if (\n[doc-reg-dBla3] == \n[doc-reg-dBla4]) \
+. nr doc-reg-dBla1 1
+. \}
+.
+. \" enable all warnings again
+. warn \n[doc-reg-dBla2]
+. \}
+.
+. ie \n[doc-reg-dBla1] \
+. nr doc-list-indent-stack\n[doc-list-depth] (\*[doc-str-dBla])
+. el \{\
+. doc-get-arg-width \n[doc-arg-ptr]
+. ie (\n[doc-width] == 2) \{\
+. \" if the width parameter is a macro, use the macro's
+. \" width as specified in doc-common
+. doc-get-arg-type \*[doc-str-dBla]
+. ie (\n[doc-arg-type] == 1) \
+. nr doc-list-indent-stack\n[doc-list-depth] \n[\*[doc-str-dBla]]
+. el \
+. nr doc-list-indent-stack\n[doc-list-depth] (\n[doc-width]u * \n[doc-fixed-width]u)
+. \}
+. el \
+. nr doc-list-indent-stack\n[doc-list-depth] (\n[doc-width]u * \n[doc-fixed-width]u)
+. \}\}\}
+.
+. el \{ .ie "\*[doc-arg\n[doc-arg-ptr]]"-offset" \{\
+. nr doc-arg-ptr +1
+.
+. ie "\*[doc-arg\n[doc-arg-ptr]]"indent" \
+. nr doc-list-offset-stack\n[doc-list-depth] \n[doc-display-indent]u
+. el \{\
+. ds doc-str-dBla "\*[doc-arg\n[doc-arg-ptr]]
+. nr doc-reg-dBla1 0
+. if \B'(\*[doc-str-dBla])' \{\
+. nr doc-reg-dBla2 \n[.warn]
+. warn (\n[.warn] - (\n[.warn] / 32 % 2 * 32))
+.
+. ds doc-str-dBla1 "\*[doc-str-dBla]
+. substring doc-str-dBla1 0 -2
+. if \B'(\*[doc-str-dBla1])' \{\
+. nr doc-reg-dBla3 (;(\*[doc-str-dBla]))
+. nr doc-reg-dBla4 (\*[doc-str-dBla1])
+. if (\n[doc-reg-dBla3] == \n[doc-reg-dBla4]) \
+. nr doc-reg-dBla1 1
+. \}
+.
+. warn \n[doc-reg-dBla2]
+. \}
+.
+. ie \n[doc-reg-dBla1] \
+. nr doc-list-offset-stack\n[doc-list-depth] \*[doc-str-dBla]
+. el \{\
+. doc-get-arg-width \n[doc-arg-ptr]
+. ie (\n[doc-width] <= 3) \{\
+. \" if the offset parameter is a macro, use the macro's
+. \" width as specified in doc-common
+. doc-get-arg-type \*[doc-str-dBla]
+. ie (\n[doc-arg-type] == 1) \
+. nr doc-list-offset-stack\n[doc-list-depth] \n[\*[doc-str-dBla]]
+. el \
+. nr doc-list-offset-stack\n[doc-list-depth] (\n[doc-width]u * \n[doc-fixed-width]u)
+. \}
+. el \
+. nr doc-list-offset-stack\n[doc-list-depth] (\n[doc-width]u * \n[doc-fixed-width]u)
+. \}\}\}
+. el \
+. nr doc-reg-dBla 0
+. \}\}\}
+.
+. \" not a known keyword, so it specifies the width of the next column
+. \" (if it is a column list)
+. if !\n[doc-reg-dBla] \{\
+. ie "\*[doc-list-type-stack\n[doc-list-depth]]"column-list" \{\
+. nr doc-num-columns +1
+. ds doc-str-dBla \*[doc-arg\n[doc-arg-ptr]]
+. substring doc-str-dBla 0 0
+. ie '.'\*[doc-str-dBla]' \{\
+. ds doc-str-dBla "\*[doc-arg\n[doc-arg-ptr]]
+. substring doc-str-dBla 1
+. doc-first-parameter \*[doc-str-dBla]
+. doc-get-width "\*[doc-str-dfp]
+. doc-get-arg-type "\*[doc-str-dfp]
+. ie (\n[doc-arg-type] == 1) \
+. nr doc-reg-dBla1 1
+. el \
+. nr doc-reg-dBla1 0
+. \}
+. el \
+. nr doc-reg-dBla1 0
+. ds doc-str-dBla "\*[doc-arg\n[doc-arg-ptr]]
+.
+. ie \n[doc-reg-dBla1] \{\
+. \" execute string in a box to get the width of the diversion
+. ds doc-str-dBla \*[doc-arg\n[doc-arg-ptr]]
+. doc-save-global-vars
+. doc-reset-args
+. box doc-box-dBla
+. ev doc-env-dBla
+. evc 0
+. in 0
+. nf
+. nop \*[doc-str-dBla]
+. br
+. ev
+. box
+. doc-restore-global-vars
+. ds doc-arg\n[doc-num-columns] "\h'\n[dl]u'
+. \}
+. el \
+. ds doc-arg\n[doc-num-columns] "\*[doc-arg\n[doc-arg-ptr]]
+. \}
+. el \{\
+. tmc mdoc warning: Unknown keyword '\*[doc-arg\n[doc-arg-ptr]]'
+. tm1 " in .Bl macro (#\n[.c])
+. \}\}
+.
+. if (\n[doc-arg-count] > \n[doc-arg-ptr]) \
+. doc-do-Bl-args
+..
+.ec
+.
+.
+.\" NS doc-save-global-vars macro
+.\" NS save all global variables
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dsgv
+.
+.eo
+.de doc-save-global-vars
+. ds doc-macro-name-saved "\*[doc-macro-name]
+. nr doc-arg-count-saved \n[doc-arg-count]
+. nr doc-num-args-saved \n[doc-num-args]
+. nr doc-arg-ptr-saved \n[doc-arg-ptr]
+.
+. nr doc-reg-dsgv 1
+. while (\n[doc-reg-dsgv] <= \n[doc-arg-count]) \{\
+. ds doc-arg\n[doc-reg-dsgv]-saved "\*[doc-arg\n[doc-reg-dsgv]]
+. nr doc-type\n[doc-reg-dsgv]-saved \n[doc-type\n[doc-reg-dsgv]]
+. ds doc-space\n[doc-reg-dsgv]-saved "\*[doc-space\n[doc-reg-dsgv]]
+. nr doc-reg-dsgv +1
+. \}
+.
+. nr doc-curr-font-saved \n[doc-curr-font]
+. nr doc-in-name-section-saved \n[doc-in-name-section]
+. nr doc-in-synopsis-section-saved \n[doc-in-synopsis-section]
+. nr doc-in-library-section-saved \n[doc-in-library-section]
+. nr doc-indent-synopsis-saved \n[doc-indent-synopsis]
+. nr doc-indent-synopsis-active-saved \n[doc-indent-synopsis-active]
+. nr doc-have-decl-saved \n[doc-have-decl]
+. nr doc-have-var-saved \n[doc-have-var]
+. ds doc-topic-name-saved "\*[doc-topic-name]
+. ds doc-quote-left-saved "\*[doc-quote-left]
+. ds doc-quote-right-saved "\*[doc-quote-right]
+. nr doc-nesting-level-saved \n[doc-nesting-level]
+. nr doc-in-list-saved \n[doc-in-list]
+. ds doc-space-saved "\*[doc-space]
+. ds doc-saved-space-saved "\*[doc-saved-space]
+. nr doc-space-mode-saved \n[doc-space-mode]
+. nr doc-have-space-saved \n[doc-have-space]
+. nr doc-have-slot-saved \n[doc-have-slot]
+. nr doc-keep-type-saved \n[doc-keep-type]
+. nr doc-display-depth-saved \n[doc-display-depth]
+. nr doc-is-compact-saved \n[doc-is-compact]
+.
+. nr doc-reg-dsgv 0
+. while (\n[doc-reg-dsgv] <= \n[doc-display-depth]) \{\
+. ds doc-display-type-stack\n[doc-reg-dsgv]-saved "\*[doc-display-type-stack\n[doc-reg-dsgv]]
+. nr doc-display-indent-stack\n[doc-reg-dsgv]-saved \n[doc-display-indent-stack\n[doc-reg-dsgv]]
+. nr doc-display-ad-stack\n[doc-reg-dsgv]-saved \n[doc-display-ad-stack\n[doc-reg-dsgv]]
+. nr doc-display-fi-stack\n[doc-reg-dsgv]-saved \n[doc-display-fi-stack\n[doc-reg-dsgv]]
+. nr doc-display-ft-stack\n[doc-reg-dsgv]-saved \n[doc-display-ft-stack\n[doc-reg-dsgv]]
+. nr doc-display-ps-stack\n[doc-reg-dsgv]-saved \n[doc-display-ps-stack\n[doc-reg-dsgv]]
+. nr doc-reg-dsgv +1
+. \}
+.
+. nr doc-fontmode-depth-saved \n[doc-fontmode-depth]
+.
+. nr doc-reg-dsgv 1
+. while (\n[doc-reg-dsgv] <= \n[doc-fontmode-depth]) \{\
+. nr doc-fontmode-font-stack\n[doc-reg-dsgv]-saved \n[doc-fontmode-font-stack\n[doc-reg-dsgv]]
+. nr doc-fontmode-size-stack\n[doc-reg-dsgv]-saved \n[doc-fontmode-size-stack\n[doc-reg-dsgv]]
+. nr doc-reg-dsgv +1
+. \}
+.
+. nr doc-list-depth-saved \n[doc-list-depth]
+.
+. nr doc-reg-dsgv 1
+. while (\n[doc-reg-dsgv] <= \n[doc-list-depth]) \{\
+. ds doc-list-type-stack\n[doc-reg-dsgv]-saved "\*[doc-list-type-stack\n[doc-reg-dsgv]]
+. nr doc-list-have-indent-stack\n[doc-reg-dsgv]-saved \n[doc-list-have-indent-stack\n[doc-reg-dsgv]]
+. nr doc-list-indent-stack\n[doc-reg-dsgv]-saved \n[doc-list-indent-stack\n[doc-reg-dsgv]]
+. nr doc-compact-list-stack\n[doc-reg-dsgv]-saved \n[doc-compact-list-stack\n[doc-reg-dsgv]]
+. ds doc-tag-prefix-stack\n[doc-reg-dsgv]-saved "\*[doc-tag-prefix-stack\n[doc-reg-dsgv]]
+. nr doc-list-offset-stack\n[doc-reg-dsgv]-saved \n[doc-list-offset-stack\n[doc-reg-dsgv]]
+. nr doc-enum-list-count-stack\n[doc-reg-dsgv]-saved \n[doc-enum-list-count-stack\n[doc-reg-dsgv]]
+. nr doc-reg-dsgv +1
+. \}
+.
+. nr doc-curr-type-saved \n[doc-curr-type]
+. ds doc-curr-arg-saved "\*[doc-curr-arg]
+. nr doc-diag-list-input-line-count-saved \n[doc-diag-list-input-line-count]
+. nr doc-num-columns-saved \n[doc-num-columns]
+. nr doc-column-indent-width-saved \n[doc-column-indent-width]
+. nr doc-is-func-saved \n[doc-is-func]
+. nr doc-have-old-func-saved \n[doc-have-old-func]
+. nr doc-func-arg-count-saved \n[doc-func-arg-count]
+. ds doc-func-arg-saved "\*[doc-func-arg]
+. nr doc-num-func-args-saved \n[doc-num-func-args]
+. nr doc-func-args-processed-saved \n[doc-func-args-processed]
+. nr doc-have-func-saved \n[doc-have-func]
+. nr doc-is-reference-saved \n[doc-is-reference]
+. nr doc-reference-count-saved \n[doc-reference-count]
+. nr doc-author-count-saved \n[doc-author-count]
+.
+. nr doc-reg-dsgv 0
+. while (\n[doc-reg-dsgv] <= \n[doc-author-count]) \{\
+. ds doc-author-name\n[doc-reg-dsgv]-saved "\*[doc-author-name\n[doc-reg-dsgv]]
+. nr doc-reg-dsgv +1
+. \}
+.
+. nr doc-book-count-saved \n[doc-book-count]
+. ds doc-book-name-saved "\*[doc-book-name]
+. nr doc-city-count-saved \n[doc-city-count]
+. ds doc-city-name-saved "\*[doc-city-name]
+. nr doc-date-count-saved \n[doc-date-count]
+. ds doc-date-saved "\*[doc-date]
+. nr doc-publisher-count-saved \n[doc-publisher-count]
+. ds doc-publisher-name-saved "\*[doc-publisher-name]
+. nr doc-journal-count-saved \n[doc-journal-count]
+. ds doc-journal-name-saved "\*[doc-journal-name]
+. nr doc-issue-count-saved \n[doc-issue-count]
+. ds doc-issue-name-saved "\*[doc-issue-name]
+. nr doc-optional-count-saved \n[doc-optional-count]
+. ds doc-optional-string-saved "\*[doc-optional-string]
+. nr doc-page-number-count-saved \n[doc-page-number-count]
+. ds doc-page-number-string-saved "\*[doc-page-number-string]
+. nr doc-corporate-count-saved \n[doc-corporate-count]
+. ds doc-corporate-name-saved "\*[doc-corporate-name]
+. nr doc-report-count-saved \n[doc-report-count]
+. ds doc-report-name-saved "\*[doc-report-name]
+. nr doc-reference-title-count-saved \n[doc-reference-title-count]
+. ds doc-reference-title-name-saved "\*[doc-reference-title-name]
+. ds doc-reference-title-name-for-book-saved "\*[doc-reference-title-name-for-book]
+. nr doc-url-count-saved \n[doc-url-count]
+. ds doc-url-name-saved "\*[doc-url-name]
+. nr doc-volume-count-saved \n[doc-volume-count]
+. ds doc-volume-name-saved "\*[doc-volume-name]
+. nr doc-have-author-saved \n[doc-have-author]
+.
+. ds doc-page-topic-saved "\*[doc-page-topic]
+. ds doc-volume-saved "\*[doc-volume]
+. ds doc-section-saved "\*[doc-section]
+. ds doc-operating-system-saved "\*[doc-operating-system]
+. ds doc-date-string-saved "\*[doc-date-string]
+. nr doc-display-vertical-saved \n[doc-display-vertical]
+. nr doc-in-see-also-section-saved \n[doc-in-see-also-section]
+. nr doc-in-files-section-saved \n[doc-in-files-section]
+. nr doc-in-authors-section-saved \n[doc-in-authors-section]
+..
+.ec
+.
+.
+.\" NS doc-restore-global-vars macro
+.\" NS restore all global variables
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-drgv
+.
+.eo
+.de doc-restore-global-vars
+. ds doc-macro-name "\*[doc-macro-name-saved]
+. nr doc-arg-count \n[doc-arg-count-saved]
+. nr doc-num-args \n[doc-num-args-saved]
+. nr doc-arg-ptr \n[doc-arg-ptr-saved]
+.
+. nr doc-reg-drgv 1
+. while (\n[doc-reg-drgv] <= \n[doc-arg-count]) \{\
+. ds doc-arg\n[doc-reg-drgv] "\*[doc-arg\n[doc-reg-drgv]-saved]
+. nr doc-type\n[doc-reg-drgv] \n[doc-type\n[doc-reg-drgv]-saved]
+. ds doc-space\n[doc-reg-drgv] "\*[doc-space\n[doc-reg-drgv]-saved]
+. nr doc-reg-drgv +1
+. \}
+.
+. nr doc-curr-font \n[doc-curr-font-saved]
+. nr doc-in-name-section \n[doc-in-name-section-saved]
+. nr doc-in-synopsis-section \n[doc-in-synopsis-section-saved]
+. nr doc-in-library-section \n[doc-in-library-section-saved]
+. nr doc-indent-synopsis \n[doc-indent-synopsis-saved]
+. nr doc-indent-synopsis-active \n[doc-indent-synopsis-active-saved]
+. nr doc-have-decl \n[doc-have-decl-saved]
+. nr doc-have-var \n[doc-have-var-saved]
+. ds doc-topic-name "\*[doc-topic-name-saved]
+. ds doc-quote-left "\*[doc-quote-left-saved]
+. ds doc-quote-right "\*[doc-quote-right-saved]
+. nr doc-nesting-level \n[doc-nesting-level-saved]
+. nr doc-in-list \n[doc-in-list-saved]
+. ds doc-space "\*[doc-space-saved]
+. ds doc-saved-space "\*[doc-saved-space-saved]
+. nr doc-space-mode \n[doc-space-mode-saved]
+. nr doc-have-space \n[doc-have-space-saved]
+. nr doc-have-slot \n[doc-have-slot-saved]
+. nr doc-keep-type \n[doc-keep-type-saved]
+. nr doc-display-depth \n[doc-display-depth-saved]
+. nr doc-is-compact \n[doc-is-compact-saved]
+.
+. nr doc-reg-drgv 0
+. while (\n[doc-reg-drgv] <= \n[doc-display-depth]) \{\
+. ds doc-display-type-stack\n[doc-reg-drgv] "\*[doc-display-type-stack\n[doc-reg-drgv]-saved]
+. nr doc-display-indent-stack\n[doc-reg-drgv] \n[doc-display-indent-stack\n[doc-reg-drgv]-saved]
+. nr doc-display-ad-stack\n[doc-reg-drgv] \n[doc-display-ad-stack\n[doc-reg-drgv]-saved]
+. nr doc-display-fi-stack\n[doc-reg-drgv] \n[doc-display-fi-stack\n[doc-reg-drgv]-saved]
+. nr doc-display-ft-stack\n[doc-reg-drgv] \n[doc-display-ft-stack\n[doc-reg-drgv]-saved]
+. nr doc-display-ps-stack\n[doc-reg-drgv] \n[doc-display-ps-stack\n[doc-reg-drgv]-saved]
+. nr doc-reg-drgv +1
+. \}
+.
+. nr doc-fontmode-depth \n[doc-fontmode-depth-saved]
+.
+. nr doc-reg-drgv 1
+. while (\n[doc-reg-drgv] <= \n[doc-fontmode-depth]) \{\
+. nr doc-fontmode-font-stack\n[doc-reg-drgv] \n[doc-fontmode-font-stack\n[doc-reg-drgv]]-saved
+. nr doc-fontmode-size-stack\n[doc-reg-drgv] \n[doc-fontmode-size-stack\n[doc-reg-drgv]]-saved
+. nr doc-reg-drgv +1
+. \}
+.
+. nr doc-list-depth \n[doc-list-depth-saved]
+.
+. nr doc-reg-drgv 1
+. while (\n[doc-reg-drgv] <= \n[doc-list-depth]) \{\
+. ds doc-list-type-stack\n[doc-reg-drgv] "\*[doc-list-type-stack\n[doc-reg-drgv]-saved]
+. nr doc-list-have-indent-stack\n[doc-reg-drgv] \n[doc-list-have-indent-stack\n[doc-reg-drgv]-saved]
+. nr doc-list-indent-stack\n[doc-reg-drgv] \n[doc-list-indent-stack\n[doc-reg-drgv]-saved]
+. nr doc-compact-list-stack\n[doc-reg-drgv] \n[doc-compact-list-stack\n[doc-reg-drgv]-saved]
+. ds doc-tag-prefix-stack\n[doc-reg-drgv] "\*[doc-tag-prefix-stack\n[doc-reg-drgv]-saved]
+. nr doc-list-offset-stack\n[doc-reg-drgv] \n[doc-list-offset-stack\n[doc-reg-drgv]-saved]
+. nr doc-enum-list-count-stack\n[doc-reg-drgv] \n[doc-enum-list-count-stack\n[doc-reg-drgv]-saved]
+. nr doc-reg-drgv +1
+. \}
+.
+. nr doc-curr-type \n[doc-curr-type-saved]
+. ds doc-curr-arg "\*[doc-curr-arg-saved]
+. nr doc-diag-list-input-line-count \n[doc-diag-list-input-line-count-saved]
+. nr doc-num-columns \n[doc-num-columns-saved]
+. nr doc-column-indent-width \n[doc-column-indent-width-saved]
+. nr doc-is-func \n[doc-is-func-saved]
+. nr doc-have-old-func \n[doc-have-old-func-saved]
+. nr doc-func-arg-count \n[doc-func-arg-count-saved]
+. ds doc-func-arg "\*[doc-func-arg-saved]
+. nr doc-num-func-args \n[doc-num-func-args-saved]
+. nr doc-func-args-processed \n[doc-func-args-processed-saved]
+. nr doc-have-func \n[doc-have-func-saved]
+. nr doc-is-reference \n[doc-is-reference-saved]
+. nr doc-reference-count \n[doc-reference-count-saved]
+. nr doc-author-count \n[doc-author-count-saved]
+.
+. nr doc-reg-drgv 0
+. while (\n[doc-reg-drgv] <= \n[doc-author-count]) \{\
+. ds doc-author-name\n[doc-reg-drgv] "\*[doc-author-name\n[doc-reg-drgv]-saved]
+. nr doc-reg-drgv +1
+. \}
+.
+. nr doc-book-count \n[doc-book-count-saved]
+. ds doc-book-name "\*[doc-book-name-saved]
+. nr doc-city-count \n[doc-city-count-saved]
+. ds doc-city-name "\*[doc-city-name-saved]
+. nr doc-date-count \n[doc-date-count-saved]
+. ds doc-date "\*[doc-date-saved]
+. nr doc-publisher-count \n[doc-publisher-count-saved]
+. ds doc-publisher-name "\*[doc-publisher-name-saved]
+. nr doc-journal-count \n[doc-journal-count-saved]
+. ds doc-journal-name "\*[doc-journal-name-saved]
+. nr doc-issue-count \n[doc-issue-count-saved]
+. ds doc-issue-name "\*[doc-issue-name-saved]
+. nr doc-optional-count \n[doc-optional-count-saved]
+. ds doc-optional-string "\*[doc-optional-string-saved]
+. nr doc-page-number-count \n[doc-page-number-count-saved]
+. ds doc-page-number-string "\*[doc-page-number-string-saved]
+. nr doc-corporate-count \n[doc-corporate-count-saved]
+. ds doc-corporate-name "\*[doc-corporate-name-saved]
+. nr doc-report-count \n[doc-report-count-saved]
+. ds doc-report-name "\*[doc-report-name-saved]
+. nr doc-reference-title-count \n[doc-reference-title-count-saved]
+. ds doc-reference-title-name "\*[doc-reference-title-name-saved]
+. ds doc-reference-title-name-for-book "\*[doc-reference-title-name-for-book-saved]
+. nr doc-url-count \n[doc-url-count-saved]
+. ds doc-url-name "\*[doc-url-name-saved]
+. nr doc-volume-count \n[doc-volume-count-saved]
+. ds doc-volume-name "\*[doc-volume-name-saved]
+. nr doc-have-author \n[doc-have-author-saved]
+.
+. ds doc-page-topic "\*[doc-page-topic-saved]
+. ds doc-volume "\*[doc-volume-saved]
+. ds doc-section "\*[doc-section-saved]
+. ds doc-operating-system "\*[doc-operating-system-saved]
+. ds doc-date-string "\*[doc-date-string-saved]
+. nr doc-display-vertical \n[doc-display-vertical-saved]
+. nr doc-in-see-also-section \n[doc-in-see-also-section-saved]
+. nr doc-in-files-section \n[doc-in-files-section-saved]
+. nr doc-in-authors-section \n[doc-in-authors-section-saved]
+..
+.ec
+.
+.
+.\" NS El user macro
+.\" NS end list
+.\" NS
+.\" NS modifies:
+.\" NS doc-list-depth
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variables:
+.\" NS doc-str-El
+.\" NS
+.\" NS width register 'El' set in doc-common
+.
+.eo
+.de El
+. if \n[.$] \{\
+. tm Usage: .El (does not take arguments) (#\n[.c])
+. return
+. \}
+.
+. ds doc-macro-name El
+. ds doc-str-El \*[doc-list-type-stack\n[doc-list-depth]]
+.
+. ie "\*[doc-str-El]"diag-list" \
+. doc-end-list 0
+. el \{ .ie "\*[doc-str-El]"column-list" \
+. doc-end-column-list
+. el \{ .ie "\*[doc-str-El]"item-list" \
+. doc-end-list 0
+. el \{ .ie "\*[doc-str-El]"ohang-list" \
+. doc-end-list 0
+. el \{ .ie "\*[doc-str-El]"inset-list" \
+. doc-end-list 0
+. el \
+. doc-end-list 1
+. \}\}\}\}
+.
+. br
+..
+.ec
+.
+.
+.\" NS doc-curr-type global register
+.\" NS current argument type
+.
+.nr doc-curr-type 0
+.
+.
+.\" NS doc-curr-arg global string
+.\" NS current argument
+.
+.ds doc-curr-arg
+.
+.
+.\" NS doc-item-boxXXX global box
+.\" NS item boxes associated list depth
+.\" NS
+.\" NS limit:
+.\" NS doc-list-depth
+.
+.
+.\" NS It user macro
+.\" NS list item
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-argXXX
+.\" NS doc-curr-arg
+.\" NS doc-curr-type
+.\" NS doc-in-list
+.\" NS doc-macro-name
+.\" NS doc-num-args
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-It
+.\" NS doc-str-It
+.\" NS doc-XXX-list-type
+.\" NS
+.\" NS width register 'It' set in doc-common
+.
+.nr doc-bullet-list-type 1
+.nr doc-column-list-type 0
+.nr doc-dash-list-type 1
+.nr doc-diag-list-type 0
+.nr doc-enum-list-type 1
+.nr doc-hang-list-type 2
+.nr doc-inset-list-type 2
+.nr doc-item-list-type 1
+.nr doc-ohang-list-type 2
+.nr doc-tag-list-type 2
+.
+.eo
+.de It
+. ds doc-str-It \*[doc-list-type-stack\n[doc-list-depth]]
+.
+. if "\*[doc-str-It]"" \
+. tm mdoc error: .It without preceding .Bl (#\n[.c])
+.
+. if \n[doc-nesting-level] \{\
+. tmc "mdoc error: .It found in enclosing (e.g. .Ac ... .It ... .Ao)
+. tm1 " (#\n[.c])
+. \}
+.
+. br
+. if !\n[cR] \
+. ne 3v
+.
+. if \n[.$] \{\
+. ds doc-macro-name It
+.
+. \" fill argument vector
+. nr doc-reg-It 1
+. while (\n[doc-reg-It] <= \n[.$]) \{\
+. ds doc-arg\n[doc-reg-It] "\$[\n[doc-reg-It]]
+. nr doc-reg-It +1
+. \}
+.
+. nr doc-num-args \n[.$]
+. nr doc-arg-ptr 0
+. \}
+.
+. nr doc-reg-It \n[doc-\*[doc-str-It]-type]
+.
+. if \n[doc-reg-It] \{\
+. \" start item box
+. box doc-item-box\n[doc-list-depth]
+. ev doc-item-env\n[doc-list-depth]
+. evc 0
+. in 0
+. nf
+. \}
+.
+. ie (\n[doc-reg-It] == 1) \{\
+. if \n[.$] \{\
+. tm1 "mdoc warning: .It macros in lists of type '\*[doc-str-It]'
+. tm1 " don't take arguments (#\n[.c])
+. \}\}
+. el \{\
+. ie \n[.$] \{\
+. if (\n[doc-reg-It] == 2) \{\
+. \" handle list types with arguments
+. doc-parse-arg-vector
+.
+. nr doc-in-list 1
+. nr doc-arg-ptr 1
+. nr doc-curr-type \n[doc-type1]
+. ds doc-curr-arg "\*[doc-arg1]
+.
+. ie (\n[doc-type1] == 1) \
+. \*[doc-arg1]
+. el \{\
+. nr doc-arg-ptr 1
+. doc-print-recursive
+. \}\}\}
+. el \{\
+. tm1 "mdoc warning: .It macros in lists of type '\*[doc-str-It]'
+. tm1 " require arguments (#\n[.c])
+. \}
+. \}
+.
+. \" the previous call of '.doc-print-recursive' can contain calls to
+. \" opening macros like '.Ao'; we then defer the call of
+. \" 'doc-xxx-list'
+. if !\n[doc-nesting-level] \
+. doc-\*[doc-str-It]
+..
+.ec
+.
+.
+.\" NS doc-inset-list macro
+.\" NS .It item of list-type inset
+.\" NS
+.\" NS modifies:
+.\" NS doc-in-list
+.
+.eo
+.de doc-inset-list
+. \" finish item box
+. br
+. ev
+. box
+. unformat doc-item-box\n[doc-list-depth]
+.
+. doc-set-vertical-and-indent 0
+. br
+.
+. nh
+. doc-item-box\n[doc-list-depth]
+.
+. nr doc-in-list 0
+. doc-reset-args
+..
+.ec
+.
+.
+.\" NS doc-hang-list macro
+.\" NS .It item of list-type hanging tag (as opposed to tagged)
+.\" NS
+.\" NS modifies:
+.\" NS doc-have-space
+.\" NS doc-in-list
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dhl
+.\" NS doc-reg-dhl1
+.
+.eo
+.de doc-hang-list
+. \" finish item box
+. br
+. ev
+. box
+. unformat doc-item-box\n[doc-list-depth]
+.
+. doc-set-vertical-and-indent 1
+. nr doc-reg-dhl (\n[doc-list-indent-stack\n[doc-list-depth]]u + \n[doc-digit-width]u)
+. ti -\n[doc-reg-dhl]u
+.
+. nh
+. ie (\n[dl]u > \n[doc-list-indent-stack\n[doc-list-depth]]u) \
+. doc-item-box\n[doc-list-depth]
+. el \{\
+. chop doc-item-box\n[doc-list-depth]
+. nr doc-reg-dhl1 \n[.k]u
+. nop \*[doc-item-box\n[doc-list-depth]]\c
+. nop \h'|(\n[doc-reg-dhl1]u - \n[.k]u + \n[doc-reg-dhl]u)'\c
+. nr doc-have-space 1
+. \}
+.
+. nr doc-in-list 0
+. doc-reset-args
+..
+.ec
+.
+.
+.\" NS doc-ohang-list macro
+.\" NS .It item of list-type overhanging tag
+.\" NS
+.\" NS modifies:
+.\" NS doc-in-list
+.
+.eo
+.de doc-ohang-list
+. \" finish item box
+. br
+. ev
+. box
+. unformat doc-item-box\n[doc-list-depth]
+.
+. doc-set-vertical-and-indent 0
+. nh
+. doc-item-box\n[doc-list-depth]
+. br
+.
+. nr doc-in-list 0
+. doc-reset-args
+..
+.ec
+.
+.
+.\" NS doc-item-list macro
+.\" NS .It item of list-type [empty tag]
+.
+.eo
+.de doc-item-list
+. \" finish (dummy) item box
+. br
+. ev
+. box
+.
+. doc-set-vertical-and-indent 0
+. br
+.
+. doc-reset-args
+..
+.ec
+.
+.
+.\" NS doc-enum-list-count-stackXXX global register
+.\" NS stack of current enum count values
+.\" NS
+.\" NS limit:
+.\" NS doc-list-depth
+.
+.nr doc-enum-list-count-stack1 0
+.
+.
+.\" NS doc-enum-list macro
+.\" NS enumerated list
+.\" NS
+.\" NS modifies:
+.\" NS doc-enum-list-count-stackXXX
+.\" NS doc-in-list
+.
+.eo
+.de doc-enum-list
+. nr doc-in-list 1
+. nr doc-enum-list-count-stack\n[doc-list-depth] +1
+\# XXX
+\#.ll \n[doc-list-indent-stack\n[doc-list-depth]]u
+\#.rj
+. nop \*[doc-tag-prefix-stack\n[doc-list-depth]]\c
+. nop \n[doc-enum-list-count-stack\n[doc-list-depth]].\&
+. doc-do-list
+..
+.ec
+.
+.
+.\" NS doc-bullet-list macro
+.\" NS bullet paragraph list
+.\" NS
+.\" NS modifies:
+.\" NS doc-in-list
+.
+.eo
+.de doc-bullet-list
+. nr doc-in-list 1
+. nop \)\*[doc-Sy-font]\[bu]\f[]
+. doc-do-list
+..
+.ec
+.
+.
+.\" NS doc-dash-list macro
+.\" NS hyphen paragraph list (sub bullet list)
+.\" NS
+.\" NS modifies:
+.\" NS doc-in-list
+.
+.eo
+.de doc-dash-list
+. nr doc-in-list 1
+. nop \)\*[doc-Sy-font]\-\f[]
+. doc-do-list
+..
+.ec
+.
+.
+.\" NS doc-do-list macro
+.\" NS .It item of list-type enum/bullet/hyphen
+.
+.als doc-do-list doc-hang-list
+.
+.
+.\" NS doc-diag-list-input-line-count global register
+.\" NS saved line number to be checked in next diag-list item
+.
+.nr doc-diag-list-input-line-count 0
+.
+.
+.\" NS doc-diag-list macro
+.\" NS .It item of list-type diagnostic-message
+.\" NS
+.\" NS modifies:
+.\" NS doc-curr-font
+.\" NS doc-diag-list-input-line-count
+.
+.eo
+.de doc-diag-list
+. nr doc-curr-font \n[.f]
+.
+. ie ((\n[.c] - \n[doc-diag-list-input-line-count]) > 1) \{\
+. ie !\n[doc-compact-list-stack\n[doc-list-depth]] \
+. doc-paragraph
+. el \
+. br
+. \}
+. el \
+. br
+. nr doc-diag-list-input-line-count \n[.c]
+.
+. nh
+. nop \*[doc-Sy-font]\c
+. if \n[doc-num-args] \
+. doc-remaining-args
+. nop \f[\n[doc-curr-font]]\*[doc-hard-space]\c
+.
+. doc-print-and-reset
+..
+.ec
+.
+.
+.\" NS doc-tag-list macro
+.\" NS .It item of list-type 'tag'
+.\" NS
+.\" NS modifies:
+.\" NS doc-have-space
+.\" NS doc-in-list
+.\" NS
+.\" NS local variables:
+.\" NS doc-box-dtl
+.\" NS doc-reg-dtl
+.\" NS doc-reg-dtl1
+.
+.eo
+.de doc-tag-list
+. \" finish item box
+. br
+. ev
+. box
+. unformat doc-item-box\n[doc-list-depth]
+.
+. \" we use a box without '.nf' to compute the tag width (via 'dl' register)
+. box doc-box-dtl
+. ev doc-env-dtl
+. evc 0
+. fi
+. ad l
+. in 0
+. doc-item-box\n[doc-list-depth]
+. br
+. ev
+. box
+.
+. doc-set-vertical-and-indent 1
+. nr doc-reg-dtl (\n[doc-list-indent-stack\n[doc-list-depth]]u + \n[doc-digit-width]u)
+. ti -\n[doc-reg-dtl]u
+.
+. nh
+. doc-item-box\n[doc-list-depth]
+. ie (\n[dl]u > \n[doc-list-indent-stack\n[doc-list-depth]]u) \
+. br
+. el \{\
+. \" format the tag separately to prevent stretching of spaces
+. vpt 0
+. br
+. sp -1
+. vpt 1
+. nop \&\c
+. nr doc-have-space 1
+. \}
+.
+. nr doc-in-list 0
+. doc-reset-args
+..
+.ec
+.
+.
+.\" NS doc-set-vertical-and-indent macro
+.\" NS set up vertical spacing (if not compact) and indentation (with
+.\" NS offset if argument is non-zero)
+.\" NS
+.\" NS modifies:
+.\" NS doc-list-have-indent-stackXXX
+.
+.eo
+.de doc-set-vertical-and-indent
+. if !\n[doc-compact-list-stack\n[doc-list-depth]] \
+. sp \n[doc-display-vertical]u
+.
+. if \n[doc-list-have-indent-stack\n[doc-list-depth]] \{\
+. nr doc-list-have-indent-stack\n[doc-list-depth] 0
+. if \$1 \
+. in +(\n[doc-list-indent-stack\n[doc-list-depth]]u + \n[doc-digit-width]u)
+. \}
+.
+. if !\n[cR] \
+. ne 2v
+..
+.ec
+.
+.
+.\" NS doc-list-depth global register
+.\" NS list type stack counter
+.
+.nr doc-list-depth 0
+.
+.
+.\" NS doc-num-columns global register
+.\" NS number of columns
+.
+.nr doc-num-columns 0
+.
+.
+.\" NS doc-compact-list-stackXXX global register (bool)
+.\" NS stack of flags to indicate whether a particular list is compact
+.\" NS
+.\" NS limit:
+.\" NS doc-list-depth
+.
+.nr doc-compact-list-stack1 0
+.
+.
+.\" NS doc-tag-prefix-stackXXX global string
+.\" NS stack of tag prefixes (currently used for -nested -enum lists)
+.\" NS
+.\" NS limit:
+.\" NS doc-list-depth
+.
+.ds doc-tag-prefix-stack1
+.
+.
+.\" NS doc-list-offset-stackXXX global register
+.\" NS stack of list offsets
+.\" NS
+.\" NS limit:
+.\" NS doc-list-depth
+.
+.nr doc-list-offset-stack1 0
+.
+.
+.\" NS doc-end-list macro
+.\" NS list end function; resets indentation (and offset if argument
+.\" NS is non-zero)
+.\" NS
+.\" NS modifies:
+.\" NS doc-list-depth
+.\" NS doc-list-offset-stackXXX
+.
+.eo
+.de doc-end-list
+. if \$1 \
+' in -(\n[doc-list-indent-stack\n[doc-list-depth]]u + \n[doc-digit-width]u)
+.
+' in -\n[doc-list-offset-stack\n[doc-list-depth]]u
+.
+. if (\n[doc-list-depth] <= 0) \
+. tm mdoc warning: extraneous .El call (#\n[.c])
+.
+. doc-decrement-list-stack
+. nr doc-list-depth -1
+..
+.ec
+.
+.
+.\" NS doc-increment-list-stack macro
+.\" NS set up next block for list
+.\" NS
+.\" NS modifies:
+.\" NS doc-compact-list-stackXXX
+.\" NS doc-list-have-indent-stackXXX
+.\" NS doc-list-indent-stackXXX
+.\" NS doc-list-offset-stackXXX
+.\" NS doc-list-type-stackXXX
+.\" NS doc-tag-prefix-stackXXX
+.\" NS doc-enum-list-count-stackXXX
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dils
+.
+.eo
+.de doc-increment-list-stack
+. nr doc-reg-dils (\n[doc-list-depth] + 1)
+. nr doc-list-have-indent-stack\n[doc-reg-dils] 0
+. nr doc-list-indent-stack\n[doc-reg-dils] 0
+. nr doc-list-offset-stack\n[doc-reg-dils] 0
+. ds doc-tag-prefix-stack\n[doc-reg-dils]
+. ds doc-list-type-stack\n[doc-reg-dils]
+. nr doc-compact-list-stack\n[doc-reg-dils] 0
+. nr doc-enum-list-count-stack\n[doc-reg-dils] 0
+..
+.ec
+.
+.
+.\" NS doc-decrement-list-stack macro
+.\" NS decrement stack
+.\" NS
+.\" NS modifies:
+.\" NS doc-compact-list-stackXXX
+.\" NS doc-list-have-indent-stackXXX
+.\" NS doc-list-indent-stackXXX
+.\" NS doc-list-offset-stackXXX
+.\" NS doc-list-type-stackXXX
+.\" NS doc-tag-prefix-stackXXX
+.\" NS doc-enum-list-count-stackXXX
+.
+.eo
+.de doc-decrement-list-stack
+. ds doc-list-type-stack\n[doc-list-depth]
+. nr doc-list-have-indent-stack\n[doc-list-depth] 0
+. nr doc-list-indent-stack\n[doc-list-depth] 0
+. nr doc-list-offset-stack\n[doc-list-depth] 0
+. ds doc-tag-prefix-stack\n[doc-list-depth]
+. nr doc-compact-list-stack\n[doc-list-depth] 0
+. nr doc-enum-list-count-stack\n[doc-list-depth] 0
+..
+.ec
+.
+.
+.\" NS Xr user macro
+.\" NS cross reference (for man pages only)
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-Xr
+.\" NS
+.\" NS width register 'Xr' set in doc-common
+.
+.eo
+.de Xr
+. if !\n[doc-arg-count] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Xr
+. doc-parse-args \$@
+. \}
+. el \
+. doc-Xr-usage
+. \}
+.
+. if !\n[doc-arg-count] \
+. return
+.
+. nr doc-arg-ptr +1
+. doc-print-prefixes
+. ie (\n[doc-arg-count] >= \n[doc-arg-ptr]) \{\
+. \" first argument must be a string
+. ie (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. nr doc-curr-font \n[.f]
+. ds doc-arg\n[doc-arg-ptr] \*[doc-Xr-font]\*[doc-arg\n[doc-arg-ptr]]\f[]
+.
+. if (\n[doc-arg-count] > \n[doc-arg-ptr]) \{\
+. nr doc-reg-Xr (\n[doc-arg-ptr] + 1)
+. \" modify second argument if it is a string and
+. \" remove space in between
+. if (\n[doc-type\n[doc-reg-Xr]] == 2) \{\
+. ds doc-arg\n[doc-reg-Xr] \*[lp]\*[doc-arg\n[doc-reg-Xr]]\*[rp]
+. ds doc-space\n[doc-arg-ptr]
+. \}
+. \}
+. doc-print-recursive
+. \}
+. el \
+. doc-Xr-usage
+. \}
+. el \
+. doc-Xr-usage
+..
+.ec
+.
+.
+.\" NS doc-Xr-usage macro
+.
+.eo
+.de doc-Xr-usage
+. tm Usage: .Xr manpage_name [section#] ... (#\n[.c])
+. doc-reset-args
+..
+.ec
+.
+.
+.\" NS Sx user macro
+.\" NS cross section reference
+.\" NS
+.\" NS width register 'Sx' set in doc-common
+.\"
+.\" TODO: This duplicates the definition of `Dq`; figure out how to
+.\" simply wrap that macro if possible. (It's not trivial to do so
+.\" because of mdoc's design feature of recursively calling macro
+.\" arguments as macros.)
+.
+.eo
+.de Sx
+. if !\n[doc-arg-count] \
+. ds doc-macro-name Sx
+.
+. ds doc-quote-left "\*[Lq]
+. ds doc-quote-right "\*[Rq]
+.
+. doc-enclose-string \$@
+..
+.ec
+.
+.
+.\" NS doc-end-column-list macro
+.\" NS column-list end-list
+.\" NS
+.\" NS modifies:
+.\" NS doc-list-depth
+.
+.eo
+.de doc-end-column-list
+. linetabs 0
+' in -(\n[doc-list-offset-stack\n[doc-list-depth]]u + \n[doc-list-indent-stack\n[doc-list-depth]]u)
+. ta T .5i
+. fi
+. doc-decrement-list-stack
+. nr doc-list-depth -1
+..
+.ec
+.
+.
+.\" NS doc-column-indent-width global register
+.\" NS holds the indent width for a column list
+.
+.nr doc-column-indent-width 0
+.
+.
+.\" NS doc-set-column-tab macro
+.\" NS establish tabs for list-type column: '.doc-set-column-tab num_cols'
+.\" NS
+.\" NS modifies:
+.\" NS doc-column-indent-width
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dsct
+.\" NS doc-str-dsct
+.\" NS doc-str-dsct1
+.
+.eo
+.de doc-set-column-tab
+. ds doc-str-dsct
+. nr doc-reg-dsct 1
+. nr doc-column-indent-width 0
+.
+. ie (\$1 < 5) \
+. ds doc-str-dsct1 " \"
+. el \{\
+. ie (\$1 == 5) \
+. ds doc-str-dsct1 " \"
+. el \{\
+. \" XXX: this is packed abnormally close -- intercolumn width
+. \" should be configurable
+. ds doc-str-dsct1 " \"
+. \}\}
+.
+. while (\n[doc-reg-dsct] <= \$1) \{\
+. as doc-str-dsct " +\w'\*[doc-arg\n[doc-reg-dsct]]\*[doc-str-dsct1]'u
+. nr doc-column-indent-width +\w'\*[doc-arg\n[doc-reg-dsct]]\*[doc-str-dsct1]'u
+. nr doc-reg-dsct +1
+. \}
+.
+. ta \*[doc-str-dsct]
+' in +\n[doc-column-indent-width]u
+..
+.ec
+.
+.
+.\" NS doc-column-list macro
+.\" NS column items
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-list-indent-stackXXX
+.\" NS doc-spaceXXX
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dcl
+.
+.eo
+.de doc-column-list
+. if \n[doc-num-args] \
+. doc-parse-arg-vector
+. nr doc-arg-ptr +1
+.
+. if (\n[doc-arg-count] < \n[doc-arg-ptr]) \{\
+. tm Usage: .It column_string [Ta [column_string ...] ] (#\n[.c])
+. return
+. \}
+.
+. if "\*[doc-arg\n[doc-arg-ptr]]"Ta" \{\
+. nr doc-reg-dcl (\n[doc-arg-ptr] - 1)
+. ds doc-space\n[doc-reg-dcl]
+. \}
+.
+. if !\n[doc-list-indent-stack\n[doc-list-depth]] \
+. nr doc-list-indent-stack\n[doc-list-depth] \n[doc-column-indent-width]u
+. if !\n[.u] \{\
+. fi
+. in +\n[doc-column-indent-width]u
+. \}
+. ti -\n[doc-column-indent-width]u
+.
+. doc-do-\n[doc-type\n[doc-arg-ptr]]
+..
+.ec
+.
+.
+.\" NS Ta user macro
+.\" NS append tab (\t)
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS
+.\" NS width register 'Ta' set in doc-common
+.
+.eo
+.de Ta
+. ie \n[doc-arg-count] \{\
+. nr doc-arg-ptr +1
+. nop \*[doc-tab]\c
+. ie (\n[doc-arg-count] >= \n[doc-arg-ptr]) \
+. doc-do-\n[doc-type\n[doc-arg-ptr]]
+. el \
+. doc-reset-args
+. \}
+. el \{\
+. tm1 "Usage: Ta must follow column entry: e.g.
+. tm1 " .It column_string [Ta [column_string ...]] (#\n[.c])
+. \}
+..
+.ec
+.
+.
+.\" NS Dl user macro
+.\" NS display (one line) literal
+.\" NS
+.\" NS this function uses the 'Li' font
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register 'Dl' set in doc-common
+.
+.eo
+.de Dl
+. ta T .5i
+. in +\n[doc-display-indent]u
+.
+. ie \n[doc-arg-count] \{\
+. tm Usage: .Dl not callable by other macros (#\n[.c])
+. doc-reset-args
+. \}
+. el \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Dl
+. doc-parse-args \$@
+. nr doc-arg-ptr 1
+. nr doc-curr-font \n[.f]
+. nop \*[doc-Li-font]\c
+. doc-print-recursive
+. \}
+. el \
+. tm Usage: .Dl argument ... (#\n[.c])
+. \}
+.
+. in -\n[doc-display-indent]u
+..
+.ec
+.
+.
+.\" NS D1 user macro
+.\" NS display (one line)
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register 'D1' set in doc-common
+.
+.eo
+.de D1
+. ta T .5i
+. in +\n[doc-display-indent]u
+.
+. ie \n[doc-arg-count] \{\
+. tm Usage: .D1 not callable by other macros (#\n[.c])
+. doc-reset-args
+. \}
+. el \{\
+. ie \n[.$] \{\
+. ds doc-macro-name D1
+. doc-parse-args \$@
+. nr doc-arg-ptr 1
+. doc-print-recursive
+. \}
+. el \
+. tm Usage: .D1 argument ... (#\n[.c])
+. \}
+.
+. in -\n[doc-display-indent]u
+..
+.ec
+.
+.
+.\" NS Vt user macro
+.\" NS variable type (for forcing old style variable declarations);
+.\" NS this is not done in the same manner as .Ot for fortrash --
+.\" NS clean up later
+.\" NS
+.\" NS modifies:
+.\" NS doc-curr-font
+.\" NS doc-have-decl
+.\" NS doc-have-var
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register 'Vt' set in doc-common
+.
+.eo
+.de Vt
+. if !\n[doc-arg-count] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Vt
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .Vt variable_type ... (#\n[.c])
+. \}
+.
+. if !\n[doc-arg-count] \
+. return
+.
+. nr doc-arg-ptr +1
+. if (\n[doc-arg-count] < \n[doc-arg-ptr]) \{\
+. tm Usage: .Vt variable_type ... (#\n[.c])
+. doc-reset-args
+. return
+. \}
+.
+. if \n[doc-in-synopsis-section] \{\
+. \" if a function declaration was the last thing given,
+. \" want vertical space
+. if \n[doc-have-decl] \{\
+. doc-paragraph
+. nr doc-have-decl 0
+. \}
+.
+. \" if a subroutine was the last thing given, want vertical space
+. if \n[doc-have-func] \{\
+. ie \n[doc-have-var] \
+. br
+. el \
+. doc-paragraph
+. \}
+.
+. nr doc-have-var 1
+. \}
+.
+. nr doc-curr-font \n[.f]
+. nop \*[doc-Ft-font]\c
+. doc-print-recursive
+.
+. if \n[doc-in-synopsis-section] \{\
+. ie \n[doc-have-old-func] \
+. nop \*[doc-soft-space]\c
+. el \
+. br
+. \}
+..
+.ec
+.
+.
+.\" NS doc-is-func global register (bool)
+.\" NS set if subroutine (in synopsis only) (fortran only)
+.
+.nr doc-is-func 0
+.
+.
+.\" NS Ft user macro
+.\" NS function type
+.\" NS
+.\" NS modifies:
+.\" NS doc-curr-font
+.\" NS doc-have-decl
+.\" NS doc-have-var
+.\" NS doc-is-func
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register 'Ft' set in doc-common
+.
+.eo
+.de Ft
+. if !\n[doc-arg-count] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Ft
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .Ft function_type ... (#\n[.c])
+. \}
+.
+. if !\n[doc-arg-count] \
+. return
+.
+. nr doc-arg-ptr +1
+. if (\n[doc-arg-count] < \n[doc-arg-ptr]) \{\
+. tm Usage: .Ft function_type ... (#\n[.c])
+. doc-reset-args
+. return
+. \}
+.
+. if \n[doc-in-synopsis-section] \{\
+. if (\n[doc-have-func] : \n[doc-have-decl]) \{\
+. doc-paragraph
+. nr doc-have-decl 0
+. nr doc-have-var 0
+. \}
+.
+. if \n[doc-have-var] \{\
+. doc-paragraph
+. nr doc-have-var 0
+. \}
+.
+. nr doc-is-func 1
+. \}
+.
+. nr doc-curr-font \n[.f]
+. nop \*[doc-Ft-font]\c
+. doc-print-recursive
+..
+.ec
+.
+.
+.\" NS doc-have-old-func global register (bool)
+.\" NS set if 'Ot' has been called
+.
+.nr doc-have-old-func 0
+.
+.
+.\" NS Ot user macro
+.\" NS old function type (fortran -- no newline)
+.\" NS
+.\" NS modifies:
+.\" NS doc-have-decl
+.\" NS doc-have-old-func
+.\" NS doc-have-var
+.\" NS doc-is-func
+.\" NS
+.\" NS width register 'Ot' set in doc-common
+.
+.eo
+.de Ot
+. nr doc-have-old-func 1
+.
+. if \n[doc-in-synopsis-section] \{\
+. if (\n[doc-have-func] : \n[doc-have-decl]) \{\
+. doc-paragraph
+. nr doc-have-decl 0
+. nr doc-have-var 0
+. \}
+.
+. if \n[doc-have-var] \{\
+. doc-paragraph
+. nr doc-have-var 0
+. \}
+.
+. nr doc-is-func 1
+. \}
+.
+. if \n[.$] \
+. nop \*[doc-Ft-font]\$*\c
+. nop \ \f[]\c
+..
+.ec
+.
+.
+.\" NS Fa user macro
+.\" NS function arguments
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register 'Fa' set in doc-common
+.
+.eo
+.de Fa
+. if !\n[doc-arg-count] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Fa
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .Fa function_arguments ... (#\n[.c])
+. \}
+.
+. ie \n[doc-func-arg-count] \
+. doc-do-func
+. el \{\
+. nr doc-arg-ptr +1
+. if (\n[doc-arg-count] >= \n[doc-arg-ptr]) \{\
+. nr doc-curr-font \n[.f]
+. nop \*[doc-Fa-font]\c
+. doc-print-recursive
+.
+. if \n[doc-in-synopsis-section] \
+. if \n[doc-have-func] \
+. br
+. \}\}
+..
+.ec
+.
+.
+.\" NS doc-func-arg-count global register
+.\" NS how many function arguments have been processed so far
+.
+.nr doc-func-arg-count 0
+.
+.
+.\" NS doc-func-arg global string
+.\" NS work buffer for function name strings
+.
+.ds doc-func-arg
+.
+.
+.\" NS doc-num-func-args global register
+.\" NS number of function arguments
+.
+.nr doc-num-func-args 0
+.
+.
+.\" NS doc-func-args-processed global register
+.\" NS function arguments processed so far
+.
+.nr doc-func-args-processed 0
+.
+.
+.\" NS doc-do-func macro
+.\" NS internal .Fa for .Fc
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-argXXX
+.\" NS doc-func-arg
+.\" NS doc-func-arg-count
+.\" NS doc-func-args-processed
+.\" NS doc-num-func-args
+.
+.eo
+.de doc-do-func
+. if (\n[doc-arg-count] <= \n[doc-arg-ptr]) \{\
+. doc-reset-args
+. return
+. \}
+.
+. nr doc-arg-ptr +1
+.
+. ds doc-func-arg
+. nr doc-num-func-args 0
+. nr doc-func-args-processed 0
+.
+. doc-build-func-string \*[doc-arg\n[doc-arg-ptr]]
+. if (\n[doc-num-func-args] > 1) \
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-func-arg]
+.
+. if (\n[doc-func-arg-count] > 1) \{\
+. nop \f[\n[doc-curr-font]]\|\c
+. if !"\*[doc-arg\n[doc-arg-ptr]]"/*" \
+. if !"\*[doc-arg\n[doc-arg-ptr]]"*/" \
+. nop ,\)\c
+. nop \)\*[doc-space\n[doc-arg-ptr]]\*[doc-Fa-font]\c
+. nop \)\*[doc-arg\n[doc-arg-ptr]]\f[]\c
+. \}
+.
+. if (\n[doc-func-arg-count] == 1) \{\
+. nop \)\*[doc-Fa-font]\*[doc-arg\n[doc-arg-ptr]]\c
+. nop \f[]\c
+. \}
+. nr doc-func-arg-count +1
+. doc-do-func
+..
+.ec
+.
+.
+.\" NS doc-have-func global register (bool)
+.\" NS whether we have more than one function in synopsis
+.
+.nr doc-have-func 0
+.
+.
+.\" NS Fn user macro
+.\" NS functions
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-have-decl
+.\" NS doc-have-func
+.\" NS doc-have-var
+.\" NS doc-indent-synopsis
+.\" NS doc-is-func
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register 'Fn' set in doc-common
+.
+.eo
+.de Fn
+. if !\n[doc-arg-count] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Fn
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .Fn function_name [function_arg] ... (#\n[.c])
+. \}
+.
+. if !\n[doc-arg-count] \
+. return
+.
+. if \n[doc-in-synopsis-section] \{\
+. \" if there is/has been more than one subroutine declaration
+. ie \n[doc-is-func] \{\
+. br
+. nr doc-have-var 0
+. nr doc-have-decl 0
+. nr doc-is-func 0
+. \}
+. el \{\
+. if \n[doc-have-func] \{\
+. doc-paragraph
+. nr doc-have-var 0
+. nr doc-have-decl 0
+. \}\}
+.
+. if \n[doc-have-decl] \{\
+. doc-paragraph
+. nr doc-have-var 0
+. \}
+.
+. if \n[doc-have-var] \{\
+. doc-paragraph
+. nr doc-have-decl 0
+. \}
+.
+. nr doc-have-func 1
+. nr doc-is-func 0
+.
+. br
+. if !\n[doc-indent-synopsis] \
+. nr doc-indent-synopsis (4u * \n[doc-fixed-width]u)
+. if !\n[doc-indent-synopsis-active] \
+. in +\n[doc-indent-synopsis]u
+. ti -\n[doc-indent-synopsis]u
+. \}
+.
+. nr doc-arg-ptr +1
+. doc-print-prefixes
+. if (\n[doc-arg-count] < \n[doc-arg-ptr]) \{\
+. tm Usage: .Fn function_name [function_arg] ... (#\n[.c])
+. doc-reset-args
+. return
+. \}
+.
+. nr doc-curr-font \n[.f]
+. nop \*[doc-Fn-font]\*[doc-arg\n[doc-arg-ptr]]\c
+. nop \f[]\*[lp]\)\c
+.
+. nr doc-arg-ptr +1
+. if (\n[doc-arg-count] >= \n[doc-arg-ptr]) \{\
+. if (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. nop \*[doc-Fa-font]\c
+. doc-do-func-args
+. nop \f[\n[doc-curr-font]]\c
+. \}\}
+.
+. nop \)\*[rp]\)\c
+. if \n[doc-in-synopsis-section] \
+. nop \);\)\c
+.
+. ie (\n[doc-arg-count] >= \n[doc-arg-ptr]) \{\
+. \" output the space (if needed)
+. nr doc-arg-ptr -1
+. nop \)\*[doc-space\n[doc-arg-ptr]]\c
+. nr doc-arg-ptr +1
+.
+. doc-print-recursive
+. \}
+. el \
+. doc-print-and-reset
+.
+. if \n[doc-in-synopsis-section] \
+. if !\n[doc-indent-synopsis-active] \
+. in -\n[doc-indent-synopsis]u
+..
+.ec
+.
+.
+.\" NS doc-do-func-args macro
+.\" NS handle function arguments
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-argXXX
+.\" NS doc-func-arg
+.\" NS doc-func-args-processed
+.\" NS doc-num-func-args
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-ddfa
+.
+.eo
+.de doc-do-func-args
+. if \n[doc-in-synopsis-section] \{\
+. ds doc-func-arg
+. nr doc-num-func-args 0
+. nr doc-func-args-processed 0
+.
+. doc-build-func-string \*[doc-arg\n[doc-arg-ptr]]
+. if (\n[doc-num-func-args] > 1) \
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-func-arg]
+. \}
+.
+. nop \)\*[doc-arg\n[doc-arg-ptr]]\c
+. nr doc-arg-ptr +1
+.
+. if (\n[doc-arg-count] >= \n[doc-arg-ptr]) \{\
+. if (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. nr doc-reg-ddfa (\n[doc-arg-ptr] - 1)
+. nop \f[\n[doc-curr-font]]\|\c
+. if !"\*[doc-arg\n[doc-arg-ptr]]"/*" \
+. if !"\*[doc-arg\n[doc-arg-ptr]]"*/" \
+. nop ,\)\c
+. nop \)\*[doc-space\n[doc-reg-ddfa]]\f[]\|\c
+. doc-do-func-args
+. \}\}
+..
+.ec
+.
+.
+.\" NS doc-saved-nesting-level global register
+.
+.nr doc-saved-nesting-level 0
+.
+.
+.\" NS doc-in-func-enclosure global register (bool)
+.
+.nr doc-in-func-enclosure 0
+.
+.
+.\" NS Fo user macro
+.\" NS function open
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-func-arg-count
+.\" NS doc-have-decl
+.\" NS doc-have-func
+.\" NS doc-have-var
+.\" NS doc-in-func-enclosure
+.\" NS doc-indent-synopsis
+.\" NS doc-is-func
+.\" NS doc-macro-name
+.\" NS doc-saved-nesting-level
+.\" NS
+.\" NS width register 'Fo' set in doc-common
+.
+.eo
+.de Fo
+. if (\n[doc-in-func-enclosure]) \{\
+. tm mdoc error: .Fo/.Fc can't be nested (#\n[.c])
+. return
+. \}
+.
+. nr doc-saved-nesting-level \n[doc-nesting-level]
+. nr doc-in-func-enclosure 1
+.
+. if !\n[doc-arg-count] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Fo
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .Fo function_name (#\n[.c])
+. \}
+.
+. if \n[doc-in-synopsis-section] \{\
+. \" if there is/has been more than one subroutine declaration
+. ie \n[doc-is-func] \{\
+. br
+. nr doc-have-var 0
+. nr doc-have-decl 0
+. nr doc-is-func 0
+. \}
+. el \{\
+. if \n[doc-have-func] \{\
+. doc-paragraph
+. nr doc-have-var 0
+. nr doc-have-decl 0
+. \}\}
+.
+. if \n[doc-have-decl] \{\
+. doc-paragraph
+. nr doc-have-var 0
+. \}
+.
+. if \n[doc-have-var] \{\
+. doc-paragraph
+. nr doc-have-decl 0
+. \}
+.
+. nr doc-have-func 1
+. nr doc-is-func 0
+.
+. br
+. if !\n[doc-indent-synopsis] \
+. nr doc-indent-synopsis (4u * \n[doc-fixed-width]u)
+. \}
+.
+. \" start function box
+. box doc-func-box
+. ev doc-func-env
+. evc 0
+. in 0
+. nf
+.
+. nr doc-arg-ptr +1
+. doc-print-prefixes
+. if (\n[doc-arg-count] >= \n[doc-arg-ptr]) \{\
+. nr doc-func-arg-count 1
+. nr doc-curr-font \n[.f]
+.
+. nop \*[doc-Fn-font]\*[doc-arg\n[doc-arg-ptr]]\c
+. nop \f[]\*[lp]\)\c
+. doc-reset-args
+. \}
+..
+.ec
+.
+.
+.\" NS Fc user macro
+.\" NS function close
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-func-arg-count
+.\" NS doc-in-func-enclosure
+.\" NS doc-saved-nesting-level
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register 'Fc' set in doc-common
+.
+.eo
+.de Fc
+. if !\n[doc-in-func-enclosure] \{\
+. tm mdoc warning: Extraneous .Fc (#\n[.c])
+. return
+. \}
+.
+. if \n[.$] \{\
+. ds doc-macro-name Fc
+. \" the first (dummy) argument is used to get the correct spacing
+. doc-parse-args \) \$@
+. \}
+.
+. if !(\n[doc-saved-nesting-level] == \n[doc-nesting-level]) \
+. tm mdoc warning: Unbalanced enclosure commands within .Fo/.Fc
+.
+. nr doc-func-arg-count 0
+. nr doc-in-func-enclosure 0
+.
+. ie \n[doc-in-synopsis-section] \
+. nop \|\*[rp];\)
+. el \
+. nop \|\*[rp]\)
+.
+. \" finish function box
+. br
+. ev
+. box
+. chop doc-func-box
+. unformat doc-func-box
+.
+. if \n[doc-in-synopsis-section] \{\
+. if !\n[doc-indent-synopsis-active] \
+. in +\n[doc-indent-synopsis]u
+. ti -\n[doc-indent-synopsis]u
+. \}
+.
+. nh
+. nop \*[doc-func-box]\c
+.
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-count] >= \n[doc-arg-ptr]) \{\
+. nr doc-curr-font \n[.f]
+. doc-print-recursive
+. \}
+. el \
+. doc-print-and-reset
+.
+. if \n[doc-in-synopsis-section] \
+. if !\n[doc-indent-synopsis-active] \
+. in -\n[doc-indent-synopsis]u
+..
+.ec
+.
+.
+.\" NS doc-build-func-string macro
+.\" NS collect function arguments and set hard spaces in between
+.\" NS
+.\" NS modifies:
+.\" NS doc-func-arg
+.\" NS doc-func-args-processed
+.\" NS doc-num-func-args
+.
+.eo
+.de doc-build-func-string
+. if !\n[doc-num-func-args] \{\
+. nr doc-num-func-args \n[.$]
+. nr doc-func-args-processed 0
+. ds doc-func-arg
+. \}
+.
+. nr doc-func-args-processed +1
+. as doc-func-arg "\$1
+.
+. if (\n[doc-func-args-processed] < \n[doc-num-func-args]) \{\
+. as doc-func-arg "\*[doc-hard-space]
+.
+. shift
+. doc-build-func-string \$@
+. \}
+..
+.ec
+.
+.
+.\" Very crude references: Stash all reference info into boxes, print
+.\" out reference on .Re macro and clean up. Ordering very limited, no
+.\" fancy citations, but can do articles, journals, and books -- need to
+.\" add several missing options (like city etc). Should be able to grab
+.\" a refer entry, massage it a wee bit (prefix a '.' to the %[A-Z]) and
+.\" not worry (ha!).
+.
+.
+.\" NS doc-is-reference global register (bool)
+.\" NS set if in reference
+.
+.nr doc-is-reference 0
+.
+.
+.\" NS doc-reference-count global register
+.\" NS reference element counter
+.
+.nr doc-reference-count 0
+.
+.
+.\" NS Rs user macro
+.\" NS reference start
+.\" NS
+.\" NS modifies:
+.\" NS doc-is-reference
+.\" NS doc-reference-count
+.\" NS
+.\" NS width register 'Rs' set in doc-common
+.
+.eo
+.de Rs
+. ie \n[.$] \
+. tm Usage: .Rs (does not take arguments) (#\n[.c])
+. el \{\
+. nr doc-is-reference 1
+. doc-reset-reference
+. if \n[doc-in-see-also-section] \
+. doc-paragraph
+. nr doc-reference-count 0
+. \}
+..
+.ec
+.
+.
+.\" NS Re user macro
+.\" NS reference end
+.\" NS
+.\" NS modifies:
+.\" NS doc-is-reference
+.\" NS
+.\" NS width register 'Re' set in doc-common
+.
+.eo
+.de Re
+. ie \n[.$] \
+. tm Usage: .Re (does not take arguments) (#\n[.c])
+. el \{\
+. if !\n[doc-is-reference] \{\
+. tm mdoc warning: Extraneous .Re (#\n[.c])
+. return
+. \}
+. doc-print-reference
+. doc-reset-reference
+. nr doc-is-reference 0
+. \}
+..
+.ec
+.
+.
+.\" NS doc-reset-reference macro
+.\" NS reference cleanup
+.\" NS
+.\" NS modifies:
+.\" NS doc-author-count
+.\" NS doc-author-nameXXX
+.\" NS doc-book-count
+.\" NS doc-book-name
+.\" NS doc-city-count
+.\" NS doc-city-name
+.\" NS doc-corporate-count
+.\" NS doc-corporate-name
+.\" NS doc-date
+.\" NS doc-date-count
+.\" NS doc-issue-count
+.\" NS doc-issue-name
+.\" NS doc-journal-count
+.\" NS doc-journal-name
+.\" NS doc-optional-count
+.\" NS doc-optional-string
+.\" NS doc-page-number-count
+.\" NS doc-page-number-string
+.\" NS doc-publisher-count
+.\" NS doc-publisher-name
+.\" NS doc-reference-count
+.\" NS doc-reference-title-count
+.\" NS doc-reference-title-name
+.\" NS doc-reference-title-name-for-book
+.\" NS doc-report-count
+.\" NS doc-report-name
+.\" NS doc-url-count
+.\" NS doc-url-name
+.\" NS doc-volume-count
+.\" NS doc-volume-name
+.
+.eo
+.de doc-reset-reference
+. while (\n[doc-author-count]) \{\
+. ds doc-author-name\n[doc-author-count]
+. nr doc-author-count -1
+. \}
+. nr doc-journal-count 0
+. nr doc-issue-count 0
+. nr doc-optional-count 0
+. nr doc-corporate-count 0
+. nr doc-report-count 0
+. nr doc-reference-title-count 0
+. nr doc-url-count 0
+. nr doc-volume-count 0
+. nr doc-city-count 0
+. nr doc-date-count 0
+. nr doc-page-number-count 0
+. nr doc-book-count 0
+. nr doc-publisher-count 0
+. nr doc-reference-count 0
+.
+. ds doc-journal-name
+. ds doc-issue-name
+. ds doc-optional-string
+. ds doc-corporate-name
+. ds doc-report-name
+. ds doc-reference-title-name
+. ds doc-reference-title-name-for-book
+. ds doc-url-name
+. ds doc-volume-name
+. ds doc-city-name
+. ds doc-date
+. ds doc-page-number-string
+. ds doc-book-name
+. ds doc-publisher-name
+..
+.ec
+.
+.
+.\" NS doc-finish-reference macro
+.\" NS auxiliary macro for doc-print-reference
+.\" NS
+.\" NS modifies:
+.\" NS doc-reference-count
+.
+.eo
+.de doc-finish-reference
+. nr doc-reference-count -\$1
+. ie \n[doc-reference-count] \
+. nop \),
+. el \
+. nop \).
+..
+.ec
+.
+.
+.\" NS doc-print-reference macro
+.\" NS reference print
+.\" NS
+.\" NS modifies:
+.\" NS doc-reference-count
+.
+.eo
+.de doc-print-reference
+.
+. nh
+.
+. if \n[doc-author-count] \{\
+. doc-print-reference-authors
+. nr doc-reference-count -\n[doc-author-count]
+. \}
+.
+. if \n[doc-reference-title-count] \{\
+. unformat doc-reference-title-name
+. chop doc-reference-title-name
+. unformat doc-reference-title-name-for-book
+. chop doc-reference-title-name-for-book
+. ie ((\n[doc-journal-count] == 1) : (\n[doc-book-count] == 1)) \{\
+. nop \)\*[Lq]\)\*[doc-reference-title-name-for-book]\)\*[Rq]\c
+. doc-finish-reference \n[doc-reference-title-count]
+. \}
+. el \{\
+. nop \*[doc-reference-title-name]\c
+. doc-finish-reference \n[doc-reference-title-count]
+. \}\}
+.
+. if \n[doc-book-count] \{\
+. unformat doc-book-name
+. chop doc-book-name
+. nop \*[doc-book-name]\c
+. doc-finish-reference \n[doc-book-count]
+. \}
+.
+. if \n[doc-publisher-count] \{\
+. unformat doc-publisher-name
+. chop doc-publisher-name
+. nop \*[doc-publisher-name]\c
+. doc-finish-reference \n[doc-publisher-count]
+. \}
+.
+. if \n[doc-journal-count] \{\
+. unformat doc-journal-name
+. chop doc-journal-name
+. nop \*[doc-journal-name]\c
+. doc-finish-reference \n[doc-journal-count]
+. \}
+.
+. if \n[doc-report-count] \{\
+. unformat doc-report-name
+. chop doc-report-name
+. nop \*[doc-report-name]\c
+. doc-finish-reference \n[doc-report-count]
+. \}
+.
+. if \n[doc-issue-count] \{\
+. unformat doc-issue-name
+. chop doc-issue-name
+. nop \*[doc-issue-name]\c
+. doc-finish-reference \n[doc-issue-count]
+. \}
+.
+. if \n[doc-volume-count] \{\
+. unformat doc-volume-name
+. chop doc-volume-name
+. nop \*[doc-volume-name]\c
+. doc-finish-reference \n[doc-volume-count]
+. \}
+.
+. if \n[doc-url-count] \{\
+. unformat doc-url-name
+. chop doc-url-name
+. nop \*[doc-url-name]\c
+. doc-finish-reference \n[doc-url-count]
+. \}
+.
+. if \n[doc-page-number-count] \{\
+. unformat doc-page-number-string
+. chop doc-page-number-string
+. nop \*[doc-page-number-string]\c
+. doc-finish-reference \n[doc-page-number-count]
+. \}
+.
+. if \n[doc-corporate-count] \{\
+. unformat doc-corporate-name
+. chop doc-corporate-name
+. nop \*[doc-corporate-name]\c
+. doc-finish-reference \n[doc-corporate-count]
+. \}
+.
+. if \n[doc-city-count] \{\
+. unformat doc-city-name
+. chop doc-city-name
+. nop \*[doc-city-name]\c
+. doc-finish-reference \n[doc-city-count]
+. \}
+.
+. if \n[doc-date-count] \{\
+. unformat doc-date
+. chop doc-date
+. nop \*[doc-date]\c
+. doc-finish-reference \n[doc-date-count]
+. \}
+.
+. if \n[doc-optional-count] \{\
+. unformat doc-optional-string
+. chop doc-optional-string
+. nop \*[doc-optional-string]\c
+. doc-finish-reference \n[doc-optional-count]
+. \}
+.
+. if \n[doc-reference-count] \
+. tm mdoc warning: unresolved reference problem
+.
+. hy \n[doc-hyphen-flags]
+..
+.ec
+.
+.
+.\" NS doc-print-reference-authors macro
+.\" NS print out reference authors
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dpra
+.\" NS doc-str-dpra
+.
+.ds doc-str-dpra "and
+.
+.eo
+.de doc-print-reference-authors
+. nr doc-reg-dpra 1
+.
+. while (\n[doc-reg-dpra] < \n[doc-author-count]) \{\
+. unformat doc-author-name\n[doc-reg-dpra]
+. chop doc-author-name\n[doc-reg-dpra]
+. ie (\n[doc-author-count] > 2) \
+. nop \)\*[doc-author-name\n[doc-reg-dpra]],
+. el \
+. nop \)\*[doc-author-name\n[doc-reg-dpra]]
+. nr doc-reg-dpra +1
+. \}
+.
+. unformat doc-author-name\n[doc-reg-dpra]
+. chop doc-author-name\n[doc-reg-dpra]
+. if (\n[doc-author-count] > 1) \
+. nop \)\*[doc-str-dpra]
+. nop \)\*[doc-author-name\n[doc-reg-dpra]],
+..
+.ec
+.
+.
+.\" NS doc-author-count global register
+.\" NS counter of author references
+.
+.nr doc-author-count 0
+.
+.
+.\" NS doc-author-nameXXX global box
+.\" NS array of author names
+.\" NS
+.\" NS limit:
+.\" NS doc-author-count
+.
+.ds doc-author-name0
+.
+.
+.\" NS %A user macro
+.\" NS reference author(s)
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-author-count
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS doc-reference-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%A
+.\" NS
+.\" NS width register '%A' set in doc-common
+.
+.eo
+.de %A
+. if (\n[doc-arg-count] : (\n[.$] == 0)) \{\
+. tm Usage: .%A author_name ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-author-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %A
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+.
+. \" save to reference box
+. box doc-author-name\n[doc-author-count]
+. ev doc-env-%A
+. evc 0
+. in 0
+. nf
+. doc-do-references
+..
+.ec
+.
+.
+.\" NS doc-book-count global register
+.\" NS counter of book references
+.
+.nr doc-book-count 0
+.
+.
+.\" NS doc-book-name global box
+.\" NS string of collected book references
+.
+.ds doc-book-name
+.
+.
+.\" NS %B user macro
+.\" NS [reference] book name
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-book-count
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS doc-reference-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%B
+.\" NS
+.\" NS width register '%B' set in doc-common
+.
+.eo
+.de %B
+. if (\n[doc-arg-count] : (\n[.$] == 0)) \{\
+. tm Usage: .%B book_name ... (#\n[.c])
+. return
+. \}
+.
+. if \n[doc-is-reference] \{\
+. nr doc-book-count +1
+. nr doc-reference-count +1
+. \}
+.
+. ds doc-macro-name %B
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+.
+. ie \n[doc-is-reference] \{\
+. \" append to reference box
+. boxa doc-book-name
+. ev doc-env-%B
+. evc 0
+. in 0
+. nf
+. nop \*[doc-Em-font]\c
+. doc-do-references
+. \}
+. el \{\
+. nop \*[doc-Em-font]\c
+. doc-print-recursive
+. \}
+..
+.ec
+.
+.
+.\" NS doc-city-count global register
+.\" NS counter of city references
+.
+.nr doc-city-count 0
+.
+.
+.\" NS doc-city-name global box
+.\" NS string of collected city references
+.
+.ds doc-city-name
+.
+.
+.\" NS %C user macro
+.\" NS [reference] city
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-city-count
+.\" NS doc-macro-name
+.\" NS doc-reference-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%C
+.\" NS
+.\" NS width register '%C' set in doc-common
+.
+.eo
+.de %C
+. if (\n[doc-arg-count] : (\n[.$] == 0)) \{\
+. tm Usage: .%C city_name ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-city-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %C
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+.
+. \" append to reference box
+. boxa doc-city-name
+. ev doc-env-%C
+. evc 0
+. in 0
+. nf
+. doc-do-references
+..
+.ec
+.
+.
+.\" NS doc-date-count global register
+.\" NS counter of date references
+.
+.nr doc-date-count 0
+.
+.
+.\" NS doc-date global box
+.\" NS string of collected date references
+.
+.ds doc-date
+.
+.
+.\" NS %D user macro
+.\" NS [reference] date
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-date-count
+.\" NS doc-macro-name
+.\" NS doc-reference-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%D
+.\" NS
+.\" NS width register '%D' set in doc-common
+.
+.eo
+.de %D
+. if (\n[doc-arg-count] : (\n[.$] == 0)) \{\
+. tm Usage: .%D date ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-date-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %D
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+.
+. \" append to reference box
+. boxa doc-date
+. ev doc-env-%D
+. evc 0
+. in 0
+. nf
+. doc-do-references
+..
+.ec
+.
+.
+.\" NS doc-publisher-count global register
+.\" NS counter of publisher references
+.
+.nr doc-publisher-count 0
+.
+.
+.\" NS doc-publisher-name global box
+.\" NS string of collected publisher references
+.
+.ds doc-publisher-name
+.
+.
+.\" NS %I user macro
+.\" NS [reference] issuer/publisher name
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS doc-publisher-count
+.\" NS doc-reference-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%I
+.\" NS
+.\" NS width register '%I' set in doc-common
+.
+.eo
+.de %I
+. if (\n[doc-arg-count] : (\n[.$] == 0)) \{\
+. tm Usage: .%I issuer/publisher_name ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-publisher-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %I
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+.
+. \" append to reference box
+. boxa doc-publisher-name
+. ev doc-env-%I
+. evc 0
+. in 0
+. nf
+. nop \*[doc-Em-font]\c
+. doc-do-references
+..
+.ec
+.
+.
+.\" NS doc-journal-count global register
+.\" NS counter of journal references
+.
+.nr doc-journal-count 0
+.
+.
+.\" NS doc-journal-name global box
+.\" NS string of collected journal references
+.
+.ds doc-journal-name
+.
+.
+.\" NS %J user macro
+.\" NS [reference] Journal Name
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-journal-count
+.\" NS doc-macro-name
+.\" NS doc-reference-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%J
+.\" NS
+.\" NS width register '%J' set in doc-common
+.
+.eo
+.de %J
+. if (\n[doc-arg-count] : (\n[.$] == 0)) \{\
+. tm Usage: .%J journal_name ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-journal-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %J
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+.
+. \" append to reference box
+. boxa doc-journal-name
+. ev doc-env-%J
+. evc 0
+. in 0
+. nf
+. nop \*[doc-Em-font]\c
+. doc-do-references
+..
+.ec
+.
+.
+.\" NS doc-issue-count global register
+.\" NS counter of issue number references
+.
+.nr doc-issue-count 0
+.
+.
+.\" NS doc-issue-name global box
+.\" NS string of collected issue number references
+.
+.ds doc-issue-name
+.
+.
+.\" NS %N user macro
+.\" NS [reference] issue number
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-issue-count
+.\" NS doc-macro-name
+.\" NS doc-reference-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%N
+.\" NS
+.\" NS width register '%N' set in doc-common
+.
+.eo
+.de %N
+. if (\n[doc-arg-count] : (\n[.$] == 0)) \{\
+. tm Usage: .%N issue_number ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-issue-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %N
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+.
+. \" append to reference box
+. boxa doc-issue-name
+. ev doc-env-%N
+. evc 0
+. in 0
+. nf
+. doc-do-references
+..
+.ec
+.
+.
+.\" NS doc-optional-count global register
+.\" NS counter of optional information references
+.
+.nr doc-optional-count 0
+.
+.
+.\" NS doc-optional-string global box
+.\" NS string of collected optional information references
+.
+.ds doc-optional-string
+.
+.
+.\" NS %O user macro
+.\" NS [reference] optional information
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS doc-optional-count
+.\" NS doc-reference-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%O
+.\" NS
+.\" NS width register '%O' set in doc-common
+.
+.eo
+.de %O
+. if (\n[doc-arg-count] : (\n[.$] == 0)) \{\
+. tm Usage: .%O optional_information ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-optional-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %O
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+.
+. \" append to reference box
+. boxa doc-optional-string
+. ev doc-env-%O
+. evc 0
+. in 0
+. nf
+. doc-do-references
+..
+.ec
+.
+.
+.\" NS doc-page-number-count global register
+.\" NS counter of page number references
+.
+.nr doc-page-number-count 0
+.
+.
+.\" NS doc-page-number-string global box
+.\" NS string of collected page number references
+.
+.ds doc-page-number-string
+.
+.
+.\" NS %P user macro
+.\" NS [reference] page numbers
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS doc-page-number-count
+.\" NS doc-reference-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%P
+.\" NS
+.\" NS width register '%P' set in doc-common
+.
+.eo
+.de %P
+. if (\n[doc-arg-count] : (\n[.$] == 0)) \{\
+. tm Usage: .%P page_number ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-page-number-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %P
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+.
+. \" append to reference box
+. boxa doc-page-number-string
+. ev doc-env-%P
+. evc 0
+. in 0
+. nf
+. doc-do-references
+..
+.ec
+.
+.
+.\" NS doc-corporate-count global register
+.\" NS counter of corporate references
+.
+.nr doc-corporate-count 0
+.
+.
+.\" NS doc-corporate-name global box
+.\" NS string of collected corporate references
+.
+.ds doc-corporate-name
+.
+.
+.\" NS %Q user macro
+.\" NS corporate or foreign author
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-corporate-count
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS doc-reference-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%Q
+.\" NS
+.\" NS width register '%Q' set in doc-common
+.
+.eo
+.de %Q
+. if (\n[doc-arg-count] : (\n[.$] == 0)) \{\
+. tm Usage: .%Q corporate_or_foreign_author ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-corporate-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %Q
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+.
+. \" append to reference box
+. boxa doc-corporate-name
+. ev doc-env-%Q
+. evc 0
+. in 0
+. nf
+. doc-do-references
+..
+.ec
+.
+.
+.\" NS doc-report-count global register
+.\" NS counter of report references
+.
+.nr doc-report-count 0
+.
+.
+.\" NS doc-report-name global box
+.\" NS string of collected report references
+.
+.ds doc-report-name
+.
+.
+.\" NS %R user macro
+.\" NS [reference] report name
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS doc-reference-count
+.\" NS doc-report-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%R
+.\" NS
+.\" NS width register '%R' set in doc-common
+.
+.eo
+.de %R
+. if (\n[doc-arg-count] : (\n[.$] == 0)) \{\
+. tm Usage: .%R reference_report ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-report-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %R
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+.
+. \" append to reference box
+. boxa doc-report-name
+. ev doc-env-%R
+. evc 0
+. in 0
+. nf
+. doc-do-references
+..
+.ec
+.
+.
+.\" NS doc-reference-title-count global register
+.\" NS counter of reference title references
+.
+.nr doc-reference-title-count 0
+.
+.
+.\" NS doc-reference-title-name global box
+.\" NS string of collected reference title references
+.
+.ds doc-reference-title-name
+.
+.
+.\" NS doc-reference-title-name-for-book global box
+.\" NS string of collected reference title references
+.\" NS (saved with another font; this is a shortcoming of groff)
+.
+.ds doc-reference-title-name-for-book
+.
+.
+.\" NS %T user macro
+.\" NS reference title
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS doc-reference-title-count
+.\" NS doc-report-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%T
+.\" NS
+.\" NS width register '%T' set in doc-common
+.
+.eo
+.de %T
+. if (\n[doc-arg-count] : (\n[.$] == 0)) \{\
+. tm Usage: .%T reference_title ... (#\n[.c])
+. return
+. \}
+.
+. if \n[doc-is-reference] \{\
+. nr doc-reference-title-count +1
+. nr doc-reference-count +1
+. \}
+.
+. ds doc-macro-name %T
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+. ie \n[doc-is-reference] \{\
+. \" append to reference box
+. boxa doc-reference-title-name-for-book
+. ev doc-env-%T
+. evc 0
+. in 0
+. nf
+. nop \*[doc-No-font]\c
+. doc-do-references
+.
+. \" do it a second time with another font
+. ds doc-macro-name %T
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+. boxa doc-reference-title-name
+. ev doc-env-%T
+. evc 0
+. in 0
+. nf
+. nop \*[doc-Em-font]\c
+. doc-do-references
+. \}
+. el \{\
+. nop \*[doc-Em-font]\c
+. doc-print-recursive
+. \}
+..
+.ec
+.
+.
+.\" NS doc-url-count global register
+.\" NS counter of hypertext references
+.
+.nr doc-url-count 0
+.
+.
+.\" NS doc-url-name global box
+.\" NS string of collected hypertext references
+.
+.ds doc-url-name
+.
+.
+.\" NS doc-volume-count global register
+.\" NS counter of reference title references
+.
+.nr doc-volume-count 0
+.
+.
+.\" NS doc-volume-name global box
+.\" NS string of collected volume references
+.
+.ds doc-volume-name
+.
+.
+.\" NS %U user macro
+.\" NS hypertext reference
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS doc-reference-count
+.\" NS doc-url-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%U
+.\" NS
+.\" NS width register '%U' set in doc-common
+.
+.eo
+.de %U
+. if (\n[doc-arg-count] : (\n[.$] == 0)) \{\
+. tm Usage: .%U URL ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-url-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %U
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+.
+. \" append to reference box
+. boxa doc-url-name
+. ev doc-env-%U
+. evc 0
+. in 0
+. nf
+. doc-do-references
+..
+.ec
+.
+.
+.\" NS %V user macro
+.\" NS reference volume
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS doc-reference-count
+.\" NS doc-volume-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%V
+.\" NS
+.\" NS width register '%V' set in doc-common
+.
+.eo
+.de %V
+. if (\n[doc-arg-count] : (\n[.$] == 0)) \{\
+. tm Usage: .%V volume ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-volume-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %V
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+.
+. \" append to reference box
+. boxa doc-volume-name
+. ev doc-env-%V
+. evc 0
+. in 0
+. nf
+. doc-do-references
+..
+.ec
+.
+.
+.\" NS doc-do-references macro
+.\" NS reference recursion routine
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-ddr
+.\" NS doc-reg-ddr1
+.
+.eo
+.de doc-do-references
+. if !\n[doc-is-reference] \
+. tm mdoc error: .\*[doc-macro-name] found outside of .Rs ... .Re (#\n[.c])
+.
+. nr doc-reg-ddr1 \n[doc-type\n[doc-arg-ptr]]
+.
+. ie (\n[doc-reg-ddr1] == 1) \{\
+. \" .nop \f[\n[doc-curr-font]]\c
+. doc-append-arg \c 3
+. \*[doc-arg\n[doc-arg-ptr]]
+. \}
+. el \{\
+. nop \)\*[doc-arg\n[doc-arg-ptr]]\c
+.
+. ie (\n[doc-arg-count] == \n[doc-arg-ptr]) \{\
+. \" finish reference box
+. br
+. ev
+. boxa
+.
+. doc-reset-args
+. \}
+. el \{\
+. nr doc-reg-ddr \n[doc-arg-ptr]
+. nr doc-arg-ptr +1
+. nop \)\*[doc-space\n[doc-reg-ddr]]\c
+. doc-do-references
+. \}\}
+..
+.ec
+.
+.
+.\" NS Hf user macro
+.\" NS source include header files.
+.\" NS
+.\" NS modifies:
+.\" NS doc-curr-font
+.\" NS
+.\" NS width register 'Hf' set in doc-common
+.
+.eo
+.de Hf
+. ie ((\n[.$] == 1) & (\n[doc-arg-count] == 0)) \{\
+. doc-paragraph
+. nop File:
+. Pa \$1
+.
+. Bd -literal
+. so \$1
+. Ed
+.
+. doc-paragraph
+. \}
+. el \
+. Usage: .Hf file (#\n[.c])
+..
+.ec
+.
+.
+.\" NS doc-have-author global register (bool)
+.\" NS set in 'An'
+.
+.nr doc-have-author 0
+.
+.
+.\" NS An user macro
+.\" NS author name
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-have-author
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register 'An' set in doc-common
+.
+.eo
+.de An
+. if !\n[doc-arg-count] \{\
+. ie \n[.$] \{\
+. ie "\$1"-nosplit" \
+. nr doc-in-authors-section 0
+. el \{ .ie "\$1"-split" \
+. nr doc-in-authors-section 1
+. el \{\
+. ds doc-macro-name An
+. doc-parse-args \$@
+. \}\}\}
+. el \{\
+. tm1 "Usage: .An {-nosplit | -split}
+. tm1 " .An author_name ... (#\n[.c])
+. \}\}
+.
+. if \n[doc-in-authors-section] \{\
+. ie \n[doc-have-author] \
+. br
+. el \
+. nr doc-have-author 1
+. \}
+.
+. if \n[doc-arg-count] \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-count] >= \n[doc-arg-ptr]) \{\
+. nr doc-curr-font \n[.f]
+. doc-print-recursive
+. \}
+. el \{\
+. tm Usage: .An author_name ... (#\n[.c])
+. doc-reset-args
+. \}\}
+..
+.ec
+.
+.
+.\" NS Rv user macro
+.\" NS return values
+.\" NS
+.\" NS width register 'Rv' set in doc-common
+.\" NS
+.\" NS local variables:
+.\" NS doc-str-Rv-std-prefix
+.\" NS doc-str-Rv-std-suffix
+.\" NS doc-str-Rv-stds-prefix
+.\" NS doc-str-Rv-stds-and
+.\" NS doc-str-Rv-stds-suffix
+.\" NS doc-str-Rv-std0
+.
+.eo
+.ds doc-str-Rv-std-prefix "The
+.ds doc-str-Rv-std-suffix "function returns the value\~0 if successful;
+.as doc-str-Rv-std-suffix " otherwise the value\~\-1 is returned and
+.as doc-str-Rv-std-suffix " the global variable \*[doc-Va-font]errno\f[]
+.as doc-str-Rv-std-suffix " is set to indicate the error.
+.
+.ds doc-str-Rv-stds-prefix "The
+.ds doc-str-Rv-stds-and "and
+.ds doc-str-Rv-stds-suffix "functions return the value\~0 if successful;
+.as doc-str-Rv-stds-suffix " otherwise the value\~\-1 is returned and
+.as doc-str-Rv-stds-suffix " the global variable \*[doc-Va-font]errno\f[]
+.as doc-str-Rv-stds-suffix " is set to indicate the error.
+.
+.ds doc-str-Rv-std0 "Upon successful completion, the value\~0 is returned;
+.as doc-str-Rv-std0 " otherwise the value\~\-1 is returned and
+.as doc-str-Rv-std0 " the global variable \*[doc-Va-font]errno\f[]
+.as doc-str-Rv-std0 " is set to indicate the error.
+.ec
+.
+.eo
+.de Rv
+.
+.\" XXX: what does this function without '-std'?
+.
+. if \n[doc-arg-count] \{\
+. tm Usage: .Rv not callable by other macros (#\n[.c])
+. doc-reset-args
+. return
+. \}
+.
+. if !\n[.$] \{\
+. tm Usage: .Rv [-std] [<function> ...] (#\n[.c])
+. return
+. \}
+.
+. if "\$1"-std" \{\
+. nr doc-reg-Rv \*[doc-section]
+. if ((\n[doc-reg-Rv] < 2) : (\n[doc-reg-Rv] > 3)) \
+. tm Usage: .Rv -std in sections 2 and 3 only (#\n[.c])
+. br
+. shift
+. ie (\n[.$] > 1) \{\
+. nop \)\*[doc-str-Rv-stds-prefix]
+. nr doc-reg-Rv 1
+. while (\n[doc-reg-Rv] < \n[.$]) \{\
+. ie (\n[.$] > 2) \
+. Fn \$\n[doc-reg-Rv] ,
+. el \
+. Fn \$\n[doc-reg-Rv]
+. nr doc-reg-Rv +1
+. \}
+. nop \)\*[doc-str-Rv-stds-and]
+. Fn \$\n[.$]
+. nop \)\*[doc-str-Rv-stds-suffix]
+. \}
+. el \{ .ie (\n[.$] == 1) \{\
+. nop \)\*[doc-str-Rv-std-prefix]
+. Fn \$1
+. nop \)\*[doc-str-Rv-std-suffix]
+. \}
+. el \{\
+. nop \)\*[doc-str-Rv-std0]
+. \}\}\}
+..
+.ec
+.
+.
+.\" NS Ex user macro
+.\" NS exit status
+.\" NS
+.\" NS width register 'Ex' set in doc-common
+.\" NS
+.\" NS local variables:
+.\" NS doc-str-Ex-std-prefix
+.\" NS doc-str-Ex-std-suffix
+.
+.ds doc-str-Ex-std-prefix "The
+.ds doc-str-Ex-std-suffix "utility exits\~0 on success,
+.as doc-str-Ex-std-suffix " and\~>0 if an error occurs.
+.
+.ds doc-str-Ex-stds-prefix "The
+.als doc-str-Ex-stds-and doc-str-Rv-stds-and
+.ds doc-str-Ex-stds-suffix "utilities exit\~0 on success,
+.as doc-str-Ex-stds-suffix " and\~>0 if an error occurs.
+.
+.eo
+.de Ex
+.
+.\" XXX: what does this function without '-std'?
+.
+. if \n[doc-arg-count] \{\
+. tm Usage: .Ex not callable by other macros (#\n[.c])
+. doc-reset-args
+. return
+. \}
+.
+. if !\n[.$] \{\
+. tm Usage: .Ex [-std] [<utility> ...] (#\n[.c])
+. return
+. \}
+.
+. if "\$1"-std" \{\
+. nr doc-reg-Ex \*[doc-section]
+. if !((\n[doc-reg-Ex] == 1) : (\n[doc-reg-Ex] == 6) : (\n[doc-reg-Ex] == 8)) \
+. tm Usage: .Ex -std in sections 1, 6 and 8 only (#\n[.c])
+. br
+. shift
+. ie (\n[.$] > 1) \{\
+. nop \)\*[doc-str-Ex-stds-prefix]
+. nr doc-reg-Ex 1
+. while (\n[doc-reg-Ex] < \n[.$]) \{\
+. ie (\n[.$] > 2) \
+. Nm \$\n[doc-reg-Ex] ,
+. el \
+. Nm \$\n[doc-reg-Ex]
+. nr doc-reg-Ex +1
+. \}
+. nop \)\*[doc-str-Ex-stds-and]
+. Nm \$\n[.$]
+. nop \)\*[doc-str-Ex-stds-suffix]
+. \}
+. el \{\
+. nop \)\*[doc-str-Ex-std-prefix]
+. Nm \$1
+. nop \)\*[doc-str-Ex-std-suffix]
+. \}\}
+..
+.ec
+.
+.
+.\" NS Mt user macro
+.\" NS mailto (for conversion to HTML)
+.
+.eo
+.de Mt
+. \" XXX: error handling missing
+. Pa \$@
+..
+.ec
+.
+.
+.\" NS Lk user macro
+.\" NS link (for conversion to HTML)
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variables:
+.\" NS doc-lasttext-Lk
+.\" NS doc-target-Lk
+.
+.eo
+.de Lk
+. if !\n[doc-arg-count] \{\
+. ds doc-macro-name Lk
+. doc-parse-args \$@
+. \}
+.
+. if !\n[doc-arg-count] \
+. return
+.
+. \" The first argument is the target URI.
+. nr doc-arg-ptr +1
+. ds doc-target-Lk "\*[doc-arg\n[doc-arg-ptr]]
+. nr doc-arg-ptr +1
+.
+. \" Search backwards for the first closing punctuation.
+. nr doc-lasttext-Lk \n[doc-arg-count]
+. while (\n[doc-lasttext-Lk] >= \n[doc-arg-ptr]) \{\
+. if !(\n[doc-type\n[doc-lasttext-Lk]] == 3) \
+. break
+. nr doc-lasttext-Lk -1
+. \}
+.
+. \" Format the link text, if any.
+. \" XXX: The forced use of the emphasis font and a trailing colon
+. \" seems intrusive.
+. nr doc-curr-font \n[.f]
+. if (\n[doc-arg-ptr] <= \n[doc-lasttext-Lk]) \{\
+. nop \*[doc-Em-font]\c
+. while (\n[doc-arg-ptr] < \n[doc-lasttext-Lk]) \{\
+. nop \&\*[doc-arg\n[doc-arg-ptr]]
+. nr doc-arg-ptr +1
+. \}
+. nop \&\*[doc-arg\n[doc-arg-ptr]]\c
+. nop \f[\n[doc-curr-font]]:
+. nr doc-arg-ptr +1
+. \}
+.
+. \" Format the link target.
+. nop \*[doc-Lk-font]\*[doc-target-Lk]\c
+. nop \f[\n[doc-curr-font]]\c
+.
+. \" Format trailing arguments, like punctuation, if any.
+. ie (\n[doc-arg-ptr] <= \n[doc-arg-count]) \
+. doc-print-recursive
+. el \{\
+. nop \&
+. doc-reset-args
+. \}
+..
+.ec
+.
+.
+.\" NS doc-defunct-macro macro
+.\" NS this is the skeleton for defunct macros
+.\" NS
+.
+.eo
+.de doc-defunct-macro
+. tmc mdoc error: .\$0 defunct
+. if d doc-\$0-usage \
+. tmc , \*[doc-\$0-usage]
+. tm1 " (#\n[.c])
+..
+.ec
+.
+.
+.\" obsolete macros
+.
+.als Db doc-defunct-macro
+.
+.als Ds doc-defunct-macro
+.
+.als Or doc-defunct-macro
+.ds doc-Or-usage use '|'
+.
+.als Sf doc-defunct-macro
+.ds doc-Sf-usage use .Pf or .Ns
+.
+.
+.rn em e@
+.
+.eo
+.de em
+. tm1 "mdoc error: end-macro (.em) respecification is not allowed. (#\n[.c])
+. tm1 " Should this have been '.Em ...'?
+. ab
+..
+.ec
+.
+.
+.\" NS doc-empty-line macro
+.\" NS emit warning and print empty line
+.
+.eo
+.de doc-empty-line
+. if !\n[doc-display-depth] \
+. tm mdoc warning: Empty input line #\n[.c]
+. sp
+..
+.ec
+.
+.blm doc-empty-line
+.
+.
+.ec
+.
+.
+.\" For UTF-8, map the minus sign to the hyphen-minus to facilitate
+.\" copy and paste of code examples, file names, and URLs embedding it.
+.if '\*[.T]'utf8' \
+. char \- \N'45'
+.
+.
+.\" load local modifications
+.mso mdoc.local
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/dvi.tmac b/tmac/dvi.tmac
new file mode 100644
index 0000000..5ce2c4c
--- /dev/null
+++ b/tmac/dvi.tmac
@@ -0,0 +1,802 @@
+.\" dvi.tmac
+.\"
+.do nr *groff_dvi_tmac_C \n[.cp]
+.cp 0
+.
+.ftr CR CW
+.ftr C CW
+.ftr CO CWI
+.ftr CI CWI
+.ftr CB CW
+.ftr CBI CWI
+.ftr TT CW
+.ftr H HR
+.
+.special TR TI MI S SA SB CW
+.fspecial TI CWI
+.fspecial TBI CWI
+.fspecial HI CWI
+.fspecial HBI CWI
+.fspecial CW SC
+.fspecial CWI SC
+.
+.\" This uses the dvi-char-_-1 string in fixed-width fonts, dvi-char-_-0
+.\" otherwise.
+.fchar _ \R'dvi-char (\w'M' == \w'i')'\E*[dvi-char-_-\\n[dvi-char]]
+.\" Normally use a rule.
+.ds dvi-char-_-0 \Z'\v'.08m'\D'R .54m .04m''\h'.5m'
+.\" In fixed-width fonts (CW and CWI) use a real _ character.
+.ds dvi-char-_-1 _
+.
+.fchar \[/l] \
+\R'dvi-char ((\w'M' == \w'i') + \
+ (\En[.f] == \f[CWI]\En[.f]\f[]))'\E*[dvi-char-/l-\\n[dvi-char]]
+.ds dvi-char-/l-0 \[slash@for@l]l
+.ds dvi-char-/l-1 \Z'\v'0.22v'\h'-0.02m'\''l
+.ds dvi-char-/l-2 \Z'\v'0.22v'\h'-0.13m'\''l
+.
+.fchar \[/L] \
+\R'dvi-char ((\w'M' == \w'i') + \
+ (\En[.f] == \f[CWI]\En[.f]\f[]))'\E*[dvi-char-/L-\\n[dvi-char]]
+.ds dvi-char-/L-0 \h'\w'L'u-\w'\[slash@for@l]L'u'\[slash@for@l]L
+.ds dvi-char-/L-1 \Z'\v'0.22v'\h'-0.14m'\''L
+.ds dvi-char-/L-2 \Z'\v'0.22v'\h'-0.21m'\''L
+.
+.\" This is designed so that \(ul, \(rn and \(br form corners.
+.char \[br] \Z'\v'.25m'\D'R .04m -1m''
+.char \[ul] \Z'\v'.23m'\D'R .54m .04m''\h'.5m'
+.char \[rn] \Z'\v'-.77m'\D'R .54m .04m''\h'.5m'
+.
+.char \[or] \h'.1m'\Z'\D'l 0 -.675m''\h'.1m'
+.char \[ru] \Z'\v'-.02m'\D'R .54m .04m''\h'.5m'
+.
+.fchar \[sr] \v'-.75m'\[sqrt]\v'.75m'
+.fchar \[sqrtex] \D'R .5m -.04m'\v'.04m'
+.fchar \[radicalex] \v'-.75m'\D'R .5m -.04m'\v'.79m'
+.fchar \[co] \
+\z\s-2\[ci]\s0\
+\h'\w'\s-2\[ci]\s0'u-\w'\s-4C\s0'u/2u'\
+\s-4C\s0\
+\h'\w'\s-2\[ci]\s0'u-\w'\s-4C\s0'u/2u'
+.fchar \[rg] \
+\z\s-2\[ci]\s0\
+\h'\w'\s-2\[ci]\s0'u-\w'\s-4R\s0'u/2u'\
+\s-4R\s0\
+\h'\w'\s-2\[ci]\s0'u-\w'\s-4R\s0'u/2u'
+.fchar \[fm] \v'-.35m'\s[\En[.s]*7u/10u]\[prime]\s0\v'.35m'
+.fchar \[sd] \v'-.35m'\s[\En[.s]*7u/10u]\[prime]\[prime]\s0\v'.35m'
+.fchar \[de] \h'.05m'\v'-.54m'\D'c .3m'\v'.54m'\h'.05m'
+.fchar \[ct] \o'c/'
+.fchar \[sq] \
+\Z'\h'.05m'\D'R .4m -.04m'\v'.04m'\h'-.04m'\
+\D'R .04m -.4m'\v'.04m'\D'R -.4m -.04m'\D'R .04m .4m''\h'.5m'
+.\"char \[sq] \h'.05m'\D'l .4m 0'\D'l 0 -.4m'\D'l -.4m 0'\D'l 0 .4m'\h'.45m'
+.\" SC contains a real \[!=] glyph
+.schar \[!=] \[slashnot]\[eq]
+.schar \[nm] \o'\F[T]\f[R]/\[mo]'
+.fschar CW \[nm] \o'/\[mo]'
+.fschar CWI \[nm] \o'\f[CW]/\[mo]'
+.schar \[ne] \[slashnot]\[==]
+.fschar CW \[ne] \o'/\[==]'
+.fschar CWI \[ne] \o'\f[CW]/\[==]'
+.fchar \[=~] \v'.1m'\Z'\[eq]'\v'-.4m'\[ap]\v'.3m'
+.fchar \[tm] \v'-.3m'\s[\En[.s]/2u]TM\s0\v'.3m'
+.\" TC fonts contain real \[aq] glyphs
+.fschar TR \[aq] \f[TRTC]\[aq]
+.fschar TI \[aq] \f[TITC]\[aq]
+.fschar TB \[aq] \f[TBTC]\[aq]
+.fschar TBI \[aq] \f[TBITC]\[aq]
+.fschar HR \[aq] \f[HRTC]\[aq]
+.fschar HI \[aq] \f[HITC]\[aq]
+.fschar HB \[aq] \f[HBTC]\[aq]
+.fschar HBI \[aq] \f[HBITC]\[aq]
+.fschar CW \[aq] \f[CWTC]\[aq]
+.fschar CWI \[aq] \f[CWITC]\[aq]
+.fchar \[bq] ,
+.fchar \[Bq] ,\h'\w'\[rq]'u-(2u*\w"'"u)',
+.fchar \[ho] \s[\En[.s]/2u]\v'.4m'c\v'-.4m'\s0
+.fchar \[-D] \Z'\v'-.1m'\h'.05m'-'D
+.fchar \[Sd] \Z'\v'-.3m'\h'.35m'-'\[pd]
+.fchar \[TP] \
+I\h'-.25m'\v'-.33m'\s[\En[.s]*6u/10u]\v'.33m'\
+D\v'-.33m'\s0\v'.33m'
+.fchar \[Tp] \zlp
+.fchar \[nb] \[slashnot]\[sb]
+.fchar \[nc] \[slashnot]\[sp]
+.cflags 8 \[an]
+.schar \[an] \h'-.167m'\[mi]\h'-.167m'
+.fschar CW \[an] -
+.fschar CWI \[an] \f[CW]\[mi]
+.\" we follow the EC ligatures for fixed-width dashes
+.fchar \[em] --
+.fchar \[en] -
+.fchar \[hy] -
+.fschar CW \[va] \o'\[ua]\[da]'
+.fschar CWI \[va] \o'\[ua]\[da]'
+.fschar CW \[<>] \o'\[<-]\[->]'
+.fschar CWI \[<>] \o'\[<-]\[->]'
+.fchar \[lh] \[lA]
+.fchar \[rh] \[rA]
+.
+.fchar \[f/] /
+.
+.\" Define some fractions.
+.de dvi-frac
+. fchar \[\\$1\\$2] \
+\v'-.25m'\s[\\En[.s]*7u/10u]\\$1\s0\v'.25m'\
+\h'-.2m'\[f/]\h'-.2m'\
+\v'.25m'\s[\\En[.s]*7u/10u]\\$2\s0\v'-.25m'
+..
+.
+.dvi-frac 1 2
+.dvi-frac 3 4
+.dvi-frac 1 4
+.dvi-frac 1 8
+.dvi-frac 3 8
+.dvi-frac 5 8
+.dvi-frac 7 8
+.
+.\" support for ISO Latin-1
+.fchar \[S1] \v'-.2m'\s-31\s+3\v'+.2m'
+.fchar \[S2] \v'-.2m'\s-32\s+3\v'+.2m'
+.fchar \[S3] \v'-.2m'\s-33\s+3\v'+.2m'
+.fchar \[Of] \v'-.2m'\s'\En[.s]*6u/10u'\o'_a'\s0\v'.2m'
+.fchar \[Om] \v'-.2m'\s'\En[.s]*6u/10u'\o'_o'\s0\v'.2m'
+.fchar \[fo] \v'-.1m'\s-3<\s+3\v'+.1m'
+.fchar \[fc] \v'-.1m'\s-3>\s+3\v'+.1m'
+.fchar \[Fo] \v'-.1m'\s-3<\h'-.3m'<\s+3\v'+.1m'
+.fchar \[Fc] \v'-.1m'\s-3>\h'-.3m'>\s+3\v'+.1m'
+.fchar \[bb] |
+.fchar \[Cs] \o'\[mu]o'
+.
+.fchar \[IJ] IJ
+.fchar \[ij] ij
+.
+.de dvi-achar
+. \" Note that character definitions are always interpreted with
+. \" compatibility mode off.
+. fchar \\$1 \
+\\$3\
+\k[acc]\
+\h'(u;-\w'\\$2'-\w'\\$3'/2+\\En[skw]+(\w'x'*0)-\\En[skw])'\
+\v'(u;\w'x'*0+\\En[rst]+(\w'\\$3'*0)-\\En[rst])'\
+\\$2\
+\v'(u;\w'x'*0-\\En[rst]+(\w'\\$3'*0)+\\En[rst])'\
+\h'|\\En[acc]u'
+. hcode \\$1\\$4
+..
+.
+.dvi-achar \[`A] \` A a
+.dvi-achar \['A] \' A a
+.dvi-achar \[^A] ^ A a
+.dvi-achar \[~A] ~ A a
+.dvi-achar \[:A] \[ad] A a
+.dvi-achar \[oA] \[ao] A a
+.dvi-achar \['C] \' C c
+.dvi-achar \[`E] \` E e
+.dvi-achar \['E] \' E e
+.dvi-achar \[^E] ^ E e
+.dvi-achar \[:E] \[ad] E e
+.dvi-achar "\[G ab]" \[ab] G g
+.dvi-achar \[`I] \` I i
+.dvi-achar \['I] \' I i
+.dvi-achar \[^I] ^ I i
+.dvi-achar \[:I] \[ad] I i
+.dvi-achar "\[I .]" \[a.] I i
+.dvi-achar \[~N] ~ N n
+.dvi-achar \[`O] \` O o
+.dvi-achar \['O] \' O o
+.dvi-achar \[^O] ^ O o
+.dvi-achar \[~O] ~ O o
+.dvi-achar \[:O] \[ad] O o
+.dvi-achar \[`U] \` U u
+.dvi-achar \['U] \' U u
+.dvi-achar \[^U] ^ U u
+.dvi-achar \[:U] \[ad] U u
+.dvi-achar \['Y] \' Y y
+.dvi-achar \[:Y] \[ad] Y y
+.dvi-achar \[`a] \` a a
+.dvi-achar \['a] \' a a
+.dvi-achar \[^a] ^ a a
+.dvi-achar \[~a] ~ a a
+.dvi-achar \[:a] \[ad] a a
+.dvi-achar \[oa] \[ao] a a
+.dvi-achar \['c] \' c c
+.dvi-achar \[`e] \` e e
+.dvi-achar \['e] \' e e
+.dvi-achar \[^e] ^ e e
+.dvi-achar \[:e] \[ad] e e
+.dvi-achar "\[g ab]" \[ab] g g
+.dvi-achar \[`i] \` \[.i] i
+.dvi-achar \['i] \' \[.i] i
+.dvi-achar \[^i] ^ \[.i] i
+.dvi-achar \[:i] \[ad] \[.i] i
+.dvi-achar \[~n] ~ n n
+.dvi-achar \[`o] \` o o
+.dvi-achar \['o] \' o o
+.dvi-achar \[^o] ^ o o
+.dvi-achar \[~o] ~ o o
+.dvi-achar \[:o] \[ad] o o
+.dvi-achar \[`u] \` u u
+.dvi-achar \['u] \' u u
+.dvi-achar \[^u] ^ u u
+.dvi-achar \[:u] \[ad] u u
+.dvi-achar \['y] \' y y
+.dvi-achar \[:y] \[ad] y y
+.dvi-achar \[vs] \[ah] s s
+.dvi-achar \[vS] \[ah] S s
+.dvi-achar \[vz] \[ah] z z
+.dvi-achar \[vZ] \[ah] Z z
+.
+.fchar \[,C] \o'\[ac]C'
+.hcode \[,C]c
+.fchar \[,c] \o'\[ac]c'
+.hcode \[,c]c
+.fchar \[S ,] \o'S\[ac]'
+.hcode \[S ,]s
+.fchar \[s ,] \o's\[ac]'
+.hcode \[s ,]s
+.
+.\" now for color definitions
+.\"
+.\" this is a composite of MIT's X Consortium red/green/blue (rgb) color
+.\" specifications, X Consortium version 10.41, 1994.
+.\"
+.defcolor black rgb #000000
+.defcolor grey rgb #bebebe
+.defcolor dimgrey rgb #696969
+.defcolor lightgray rgb #d3d3d3
+.defcolor lightslategrey rgb #778899
+.defcolor slategray rgb #708090
+.defcolor slategray1 rgb #c6e2ff
+.defcolor slategray2 rgb #b9d3ee
+.defcolor slategray3 rgb #9fb6cd
+.defcolor slategray4 rgb #6c7b8b
+.defcolor slategrey rgb #708090
+.defcolor grey0 rgb #000000
+.defcolor grey1 rgb #030303
+.defcolor grey2 rgb #050505
+.defcolor grey3 rgb #080808
+.defcolor grey4 rgb #0a0a0a
+.defcolor grey5 rgb #0d0d0d
+.defcolor grey6 rgb #0f0f0f
+.defcolor grey7 rgb #121212
+.defcolor grey8 rgb #141414
+.defcolor grey9 rgb #171717
+.defcolor grey10 rgb #1a1a1a
+.defcolor grey11 rgb #1c1c1c
+.defcolor grey12 rgb #1f1f1f
+.defcolor grey13 rgb #212121
+.defcolor grey14 rgb #242424
+.defcolor grey15 rgb #262626
+.defcolor grey16 rgb #292929
+.defcolor grey17 rgb #2b2b2b
+.defcolor grey18 rgb #2e2e2e
+.defcolor grey19 rgb #303030
+.defcolor grey20 rgb #333333
+.defcolor grey21 rgb #363636
+.defcolor grey22 rgb #383838
+.defcolor grey23 rgb #3b3b3b
+.defcolor grey24 rgb #3d3d3d
+.defcolor grey25 rgb #404040
+.defcolor grey26 rgb #424242
+.defcolor grey27 rgb #454545
+.defcolor grey28 rgb #474747
+.defcolor grey29 rgb #4a4a4a
+.defcolor grey30 rgb #4d4d4d
+.defcolor grey31 rgb #4f4f4f
+.defcolor grey32 rgb #525252
+.defcolor grey33 rgb #545454
+.defcolor grey34 rgb #575757
+.defcolor grey35 rgb #595959
+.defcolor grey36 rgb #5c5c5c
+.defcolor grey37 rgb #5e5e5e
+.defcolor grey38 rgb #616161
+.defcolor grey39 rgb #636363
+.defcolor grey40 rgb #666666
+.defcolor grey41 rgb #696969
+.defcolor grey42 rgb #6b6b6b
+.defcolor grey43 rgb #6e6e6e
+.defcolor grey44 rgb #707070
+.defcolor grey45 rgb #737373
+.defcolor grey46 rgb #757575
+.defcolor grey47 rgb #787878
+.defcolor grey48 rgb #7a7a7a
+.defcolor grey49 rgb #7d7d7d
+.defcolor grey50 rgb #7f7f7f
+.defcolor grey51 rgb #828282
+.defcolor grey52 rgb #858585
+.defcolor grey53 rgb #878787
+.defcolor grey54 rgb #8a8a8a
+.defcolor grey55 rgb #8c8c8c
+.defcolor grey56 rgb #8f8f8f
+.defcolor grey57 rgb #919191
+.defcolor grey58 rgb #949494
+.defcolor grey59 rgb #969696
+.defcolor grey60 rgb #999999
+.defcolor grey61 rgb #9c9c9c
+.defcolor grey62 rgb #9e9e9e
+.defcolor grey63 rgb #a1a1a1
+.defcolor grey64 rgb #a3a3a3
+.defcolor grey65 rgb #a6a6a6
+.defcolor grey66 rgb #a8a8a8
+.defcolor grey67 rgb #ababab
+.defcolor grey68 rgb #adadad
+.defcolor grey69 rgb #b0b0b0
+.defcolor grey70 rgb #b3b3b3
+.defcolor grey71 rgb #b5b5b5
+.defcolor grey72 rgb #b8b8b8
+.defcolor grey73 rgb #bababa
+.defcolor grey74 rgb #bdbdbd
+.defcolor grey75 rgb #bfbfbf
+.defcolor grey76 rgb #c2c2c2
+.defcolor grey77 rgb #c4c4c4
+.defcolor grey78 rgb #c7c7c7
+.defcolor grey79 rgb #c9c9c9
+.defcolor grey80 rgb #cccccc
+.defcolor grey81 rgb #cfcfcf
+.defcolor grey82 rgb #d1d1d1
+.defcolor grey83 rgb #d4d4d4
+.defcolor grey84 rgb #d6d6d6
+.defcolor grey85 rgb #d9d9d9
+.defcolor grey86 rgb #dbdbdb
+.defcolor grey87 rgb #dedede
+.defcolor grey88 rgb #e0e0e0
+.defcolor grey89 rgb #e3e3e3
+.defcolor grey90 rgb #e5e5e5
+.defcolor grey91 rgb #e8e8e8
+.defcolor grey92 rgb #ebebeb
+.defcolor grey93 rgb #ededed
+.defcolor grey94 rgb #f0f0f0
+.defcolor grey95 rgb #f2f2f2
+.defcolor grey96 rgb #f5f5f5
+.defcolor grey97 rgb #f7f7f7
+.defcolor grey98 rgb #fafafa
+.defcolor grey99 rgb #fcfcfc
+.defcolor grey100 rgb #ffffff
+.defcolor aliceblue rgb #f0f8ff
+.defcolor blueviolet rgb #8a2be2
+.defcolor cadetblue rgb #5f9ea0
+.defcolor cadetblue1 rgb #98f5ff
+.defcolor cadetblue2 rgb #8ee5ee
+.defcolor cadetblue3 rgb #7ac5cd
+.defcolor cadetblue4 rgb #53868b
+.defcolor cornflowerblue rgb #6495ed
+.defcolor darkslateblue rgb #483d8b
+.defcolor darkturquoise rgb #00ced1
+.defcolor deepskyblue rgb #00bfff
+.defcolor deepskyblue1 rgb #00bfff
+.defcolor deepskyblue2 rgb #00b2ee
+.defcolor deepskyblue3 rgb #009acd
+.defcolor deepskyblue4 rgb #00688b
+.defcolor dodgerblue rgb #1e90ff
+.defcolor dodgerblue1 rgb #1e90ff
+.defcolor dodgerblue2 rgb #1c86ee
+.defcolor dodgerblue3 rgb #1874cd
+.defcolor dodgerblue4 rgb #104e8b
+.defcolor lightblue rgb #add8e6
+.defcolor lightblue1 rgb #bfefff
+.defcolor lightblue2 rgb #b2dfee
+.defcolor lightblue3 rgb #9ac0cd
+.defcolor lightblue4 rgb #68838b
+.defcolor lightcyan rgb #e0ffff
+.defcolor lightcyan1 rgb #e0ffff
+.defcolor lightcyan2 rgb #d1eeee
+.defcolor lightcyan3 rgb #b4cdcd
+.defcolor lightcyan4 rgb #7a8b8b
+.defcolor lightskyblue rgb #87cefa
+.defcolor lightskyblue1 rgb #b0e2ff
+.defcolor lightskyblue2 rgb #a4d3ee
+.defcolor lightskyblue3 rgb #8db6cd
+.defcolor lightskyblue4 rgb #607b8b
+.defcolor lightslateblue rgb #8470ff
+.defcolor lightsteelblue rgb #b0c4de
+.defcolor lightsteelblue1 rgb #cae1ff
+.defcolor lightsteelblue2 rgb #bcd2ee
+.defcolor lightsteelblue3 rgb #a2b5cd
+.defcolor lightsteelblue4 rgb #6e7b8b
+.defcolor mediumaquamarine rgb #66cdaa
+.defcolor mediumblue rgb #0000cd
+.defcolor mediumslateblue rgb #7b68ee
+.defcolor mediumturquoise rgb #48d1cc
+.defcolor midnightblue rgb #191970
+.defcolor navyblue rgb #000080
+.defcolor paleturquoise rgb #afeeee
+.defcolor paleturquoise1 rgb #bbffff
+.defcolor paleturquoise2 rgb #aeeeee
+.defcolor paleturquoise3 rgb #96cdcd
+.defcolor paleturquoise4 rgb #668b8b
+.defcolor powderblue rgb #b0e0e6
+.defcolor royalblue rgb #4169e1
+.defcolor royalblue1 rgb #4876ff
+.defcolor royalblue2 rgb #436eee
+.defcolor royalblue3 rgb #3a5fcd
+.defcolor royalblue4 rgb #27408b
+.defcolor skyblue rgb #87ceeb
+.defcolor skyblue1 rgb #87ceff
+.defcolor skyblue2 rgb #7ec0ee
+.defcolor skyblue3 rgb #6ca6cd
+.defcolor skyblue4 rgb #4a708b
+.defcolor slateblue rgb #6a5acd
+.defcolor slateblue1 rgb #836fff
+.defcolor slateblue2 rgb #7a67ee
+.defcolor slateblue3 rgb #6959cd
+.defcolor slateblue4 rgb #473c8b
+.defcolor steelblue rgb #4682b4
+.defcolor steelblue1 rgb #63b8ff
+.defcolor steelblue2 rgb #5cacee
+.defcolor steelblue3 rgb #4f94cd
+.defcolor steelblue4 rgb #36648b
+.defcolor aquamarine rgb #7fffd4
+.defcolor aquamarine1 rgb #7fffd4
+.defcolor aquamarine2 rgb #76eec6
+.defcolor aquamarine3 rgb #66cdaa
+.defcolor aquamarine4 rgb #458b74
+.defcolor azure rgb #f0ffff
+.defcolor azure1 rgb #f0ffff
+.defcolor azure2 rgb #e0eeee
+.defcolor azure3 rgb #c1cdcd
+.defcolor azure4 rgb #838b8b
+.defcolor blue rgb #0000ff
+.defcolor blue1 rgb #0000ff
+.defcolor blue2 rgb #0000ee
+.defcolor blue3 rgb #0000cd
+.defcolor blue4 rgb #00008b
+.defcolor cyan rgb #00ffff
+.defcolor cyan1 rgb #00ffff
+.defcolor cyan2 rgb #00eeee
+.defcolor cyan3 rgb #00cdcd
+.defcolor cyan4 rgb #008b8b
+.defcolor navy rgb #000080
+.defcolor turquoise rgb #40e0d0
+.defcolor turquoise1 rgb #00f5ff
+.defcolor turquoise2 rgb #00e5ee
+.defcolor turquoise3 rgb #00c5cd
+.defcolor turquoise4 rgb #00868b
+.defcolor darkslategray rgb #2f4f4f
+.defcolor darkslategray1 rgb #97ffff
+.defcolor darkslategray2 rgb #8deeee
+.defcolor darkslategray3 rgb #79cdcd
+.defcolor darkslategray4 rgb #528b8b
+.defcolor rosybrown rgb #bc8f8f
+.defcolor rosybrown1 rgb #ffc1c1
+.defcolor rosybrown2 rgb #eeb4b4
+.defcolor rosybrown3 rgb #cd9b9b
+.defcolor rosybrown4 rgb #8b6969
+.defcolor saddlebrown rgb #8b4513
+.defcolor sandybrown rgb #f4a460
+.defcolor beige rgb #f5f5dc
+.defcolor brown rgb #a52a2a
+.defcolor brown1 rgb #ff4040
+.defcolor brown2 rgb #ee3b3b
+.defcolor brown3 rgb #cd3333
+.defcolor brown4 rgb #8b2323
+.defcolor burlywood rgb #deb887
+.defcolor burlywood1 rgb #ffd39b
+.defcolor burlywood2 rgb #eec591
+.defcolor burlywood3 rgb #cdaa7d
+.defcolor burlywood4 rgb #8b7355
+.defcolor chocolate rgb #d2691e
+.defcolor chocolate1 rgb #ff7f24
+.defcolor chocolate2 rgb #ee7621
+.defcolor chocolate3 rgb #cd661d
+.defcolor chocolate4 rgb #8b4513
+.defcolor peru rgb #cd853f
+.defcolor tan rgb #d2b48c
+.defcolor tan1 rgb #ffa54f
+.defcolor tan2 rgb #ee9a49
+.defcolor tan3 rgb #cd853f
+.defcolor tan4 rgb #8b5a2b
+.defcolor darkgreen rgb #006400
+.defcolor darkkhaki rgb #bdb76b
+.defcolor darkolivegreen rgb #556b2f
+.defcolor darkolivegreen1 rgb #caff70
+.defcolor darkolivegreen2 rgb #bcee68
+.defcolor darkolivegreen3 rgb #a2cd5a
+.defcolor darkolivegreen4 rgb #6e8b3d
+.defcolor darkseagreen rgb #8fbc8f
+.defcolor darkseagreen1 rgb #c1ffc1
+.defcolor darkseagreen2 rgb #b4eeb4
+.defcolor darkseagreen3 rgb #9bcd9b
+.defcolor darkseagreen4 rgb #698b69
+.defcolor forestgreen rgb #228b22
+.defcolor greenyellow rgb #adff2f
+.defcolor lawngreen rgb #7cfc00
+.defcolor lightseagreen rgb #20b2aa
+.defcolor limegreen rgb #32cd32
+.defcolor mediumseagreen rgb #3cb371
+.defcolor mediumspringgreen rgb #00fa9a
+.defcolor mintcream rgb #f5fffa
+.defcolor olivedrab rgb #6b8e23
+.defcolor olivedrab1 rgb #c0ff3e
+.defcolor olivedrab2 rgb #b3ee3a
+.defcolor olivedrab3 rgb #9acd32
+.defcolor olivedrab4 rgb #698b22
+.defcolor palegreen rgb #98fb98
+.defcolor palegreen1 rgb #9aff9a
+.defcolor palegreen2 rgb #90ee90
+.defcolor palegreen3 rgb #7ccd7c
+.defcolor palegreen4 rgb #548b54
+.defcolor seagreen rgb #2e8b57
+.defcolor seagreen1 rgb #54ff9f
+.defcolor seagreen2 rgb #4eee94
+.defcolor seagreen3 rgb #43cd80
+.defcolor seagreen4 rgb #2e8b57
+.defcolor springgreen rgb #00ff7f
+.defcolor springgreen1 rgb #00ff7f
+.defcolor springgreen2 rgb #00ee76
+.defcolor springgreen3 rgb #00cd66
+.defcolor springgreen4 rgb #008b45
+.defcolor yellowgreen rgb #9acd32
+.defcolor chartreuse rgb #7fff00
+.defcolor chartreuse1 rgb #7fff00
+.defcolor chartreuse2 rgb #76ee00
+.defcolor chartreuse3 rgb #66cd00
+.defcolor chartreuse4 rgb #458b00
+.defcolor green rgb #00ff00
+.defcolor green1 rgb #00ff00
+.defcolor green2 rgb #00ee00
+.defcolor green3 rgb #00cd00
+.defcolor green4 rgb #008b00
+.defcolor khaki rgb #f0e68c
+.defcolor khaki1 rgb #fff68f
+.defcolor khaki2 rgb #eee685
+.defcolor khaki3 rgb #cdc673
+.defcolor khaki4 rgb #8b864e
+.defcolor darkorange rgb #ff8c00
+.defcolor darkorange1 rgb #ff7f00
+.defcolor darkorange2 rgb #ee7600
+.defcolor darkorange3 rgb #cd6600
+.defcolor darkorange4 rgb #8b4500
+.defcolor darksalmon rgb #e9967a
+.defcolor lightcoral rgb #f08080
+.defcolor lightsalmon rgb #ffa07a
+.defcolor lightsalmon1 rgb #ffa07a
+.defcolor lightsalmon2 rgb #ee9572
+.defcolor lightsalmon3 rgb #cd8162
+.defcolor lightsalmon4 rgb #8b5742
+.defcolor peachpuff rgb #ffdab9
+.defcolor peachpuff1 rgb #ffdab9
+.defcolor peachpuff2 rgb #eecbad
+.defcolor peachpuff3 rgb #cdaf95
+.defcolor peachpuff4 rgb #8b7765
+.defcolor bisque rgb #ffe4c4
+.defcolor bisque1 rgb #ffe4c4
+.defcolor bisque2 rgb #eed5b7
+.defcolor bisque3 rgb #cdb79e
+.defcolor bisque4 rgb #8b7d6b
+.defcolor coral rgb #ff7f50
+.defcolor coral1 rgb #ff7256
+.defcolor coral2 rgb #ee6a50
+.defcolor coral3 rgb #cd5b45
+.defcolor coral4 rgb #8b3e2f
+.defcolor honeydew rgb #f0fff0
+.defcolor honeydew1 rgb #f0fff0
+.defcolor honeydew2 rgb #e0eee0
+.defcolor honeydew3 rgb #c1cdc1
+.defcolor honeydew4 rgb #838b83
+.defcolor orange rgb #ffa500
+.defcolor orange1 rgb #ffa500
+.defcolor orange2 rgb #ee9a00
+.defcolor orange3 rgb #cd8500
+.defcolor orange4 rgb #8b5a00
+.defcolor salmon rgb #fa8072
+.defcolor salmon1 rgb #ff8c69
+.defcolor salmon2 rgb #ee8262
+.defcolor salmon3 rgb #cd7054
+.defcolor salmon4 rgb #8b4c39
+.defcolor sienna rgb #a0522d
+.defcolor sienna1 rgb #ff8247
+.defcolor sienna2 rgb #ee7942
+.defcolor sienna3 rgb #cd6839
+.defcolor sienna4 rgb #8b4726
+.defcolor deeppink rgb #ff1493
+.defcolor deeppink1 rgb #ff1493
+.defcolor deeppink2 rgb #ee1289
+.defcolor deeppink3 rgb #cd1076
+.defcolor deeppink4 rgb #8b0a50
+.defcolor hotpink rgb #ff69b4
+.defcolor hotpink1 rgb #ff6eb4
+.defcolor hotpink2 rgb #ee6aa7
+.defcolor hotpink3 rgb #cd6090
+.defcolor hotpink4 rgb #8b3a62
+.defcolor indianred rgb #cd5c5c
+.defcolor indianred1 rgb #ff6a6a
+.defcolor indianred2 rgb #ee6363
+.defcolor indianred3 rgb #cd5555
+.defcolor indianred4 rgb #8b3a3a
+.defcolor lightpink rgb #ffb6c1
+.defcolor lightpink1 rgb #ffaeb9
+.defcolor lightpink2 rgb #eea2ad
+.defcolor lightpink3 rgb #cd8c95
+.defcolor lightpink4 rgb #8b5f65
+.defcolor mediumvioletred rgb #c71585
+.defcolor mistyrose rgb #ffe4e1
+.defcolor mistyrose1 rgb #ffe4e1
+.defcolor mistyrose2 rgb #eed5d2
+.defcolor mistyrose3 rgb #cdb7b5
+.defcolor mistyrose4 rgb #8b7d7b
+.defcolor orangered rgb #ff4500
+.defcolor orangered1 rgb #ff4500
+.defcolor orangered2 rgb #ee4000
+.defcolor orangered3 rgb #cd3700
+.defcolor orangered4 rgb #8b2500
+.defcolor palevioletred rgb #db7093
+.defcolor palevioletred1 rgb #ff82ab
+.defcolor palevioletred2 rgb #ee799f
+.defcolor palevioletred3 rgb #cd6889
+.defcolor palevioletred4 rgb #8b475d
+.defcolor violetred rgb #d02090
+.defcolor violetred1 rgb #ff3e96
+.defcolor violetred2 rgb #ee3a8c
+.defcolor violetred3 rgb #cd3278
+.defcolor violetred4 rgb #8b2252
+.defcolor firebrick rgb #b22222
+.defcolor firebrick1 rgb #ff3030
+.defcolor firebrick2 rgb #ee2c2c
+.defcolor firebrick3 rgb #cd2626
+.defcolor firebrick4 rgb #8b1a1a
+.defcolor pink rgb #ffc0cb
+.defcolor pink1 rgb #ffb5c5
+.defcolor pink2 rgb #eea9b8
+.defcolor pink3 rgb #cd919e
+.defcolor pink4 rgb #8b636c
+.defcolor red rgb #ff0000
+.defcolor red1 rgb #ff0000
+.defcolor red2 rgb #ee0000
+.defcolor red3 rgb #cd0000
+.defcolor red4 rgb #8b0000
+.defcolor tomato rgb #ff6347
+.defcolor tomato1 rgb #ff6347
+.defcolor tomato2 rgb #ee5c42
+.defcolor tomato3 rgb #cd4f39
+.defcolor tomato4 rgb #8b3626
+.defcolor darkorchid rgb #9932cc
+.defcolor darkorchid1 rgb #bf3eff
+.defcolor darkorchid2 rgb #b23aee
+.defcolor darkorchid3 rgb #9a32cd
+.defcolor darkorchid4 rgb #68228b
+.defcolor darkviolet rgb #9400d3
+.defcolor lavenderblush rgb #fff0f5
+.defcolor lavenderblush1 rgb #fff0f5
+.defcolor lavenderblush2 rgb #eee0e5
+.defcolor lavenderblush3 rgb #cdc1c5
+.defcolor lavenderblush4 rgb #8b8386
+.defcolor mediumorchid rgb #ba55d3
+.defcolor mediumorchid1 rgb #e066ff
+.defcolor mediumorchid2 rgb #d15fee
+.defcolor mediumorchid3 rgb #b452cd
+.defcolor mediumorchid4 rgb #7a378b
+.defcolor mediumpurple rgb #9370db
+.defcolor mediumpurple1 rgb #ab82ff
+.defcolor mediumpurple2 rgb #9f79ee
+.defcolor mediumpurple3 rgb #8968cd
+.defcolor mediumpurple4 rgb #5d478b
+.defcolor lavender rgb #e6e6fa
+.defcolor magenta rgb #ff00ff
+.defcolor magenta1 rgb #ff00ff
+.defcolor magenta2 rgb #ee00ee
+.defcolor magenta3 rgb #cd00cd
+.defcolor magenta4 rgb #8b008b
+.defcolor maroon rgb #b03060
+.defcolor maroon1 rgb #ff34b3
+.defcolor maroon2 rgb #ee30a7
+.defcolor maroon3 rgb #cd2990
+.defcolor maroon4 rgb #8b1c62
+.defcolor orchid rgb #da70d6
+.defcolor orchid1 rgb #ff83fa
+.defcolor orchid2 rgb #ee7ae9
+.defcolor orchid3 rgb #cd69c9
+.defcolor orchid4 rgb #8b4789
+.defcolor plum rgb #dda0dd
+.defcolor plum1 rgb #ffbbff
+.defcolor plum2 rgb #eeaeee
+.defcolor plum3 rgb #cd96cd
+.defcolor plum4 rgb #8b668b
+.defcolor purple rgb #a020f0
+.defcolor purple1 rgb #9b30ff
+.defcolor purple2 rgb #912cee
+.defcolor purple3 rgb #7d26cd
+.defcolor purple4 rgb #551a8b
+.defcolor thistle rgb #d8bfd8
+.defcolor thistle1 rgb #ffe1ff
+.defcolor thistle2 rgb #eed2ee
+.defcolor thistle3 rgb #cdb5cd
+.defcolor thistle4 rgb #8b7b8b
+.defcolor violet rgb #ee82ee
+.defcolor antiquewhite rgb #faebd7
+.defcolor antiquewhite1 rgb #ffefdb
+.defcolor antiquewhite2 rgb #eedfcc
+.defcolor antiquewhite3 rgb #cdc0b0
+.defcolor antiquewhite4 rgb #8b8378
+.defcolor floralwhite rgb #fffaf0
+.defcolor ghostwhite rgb #f8f8ff
+.defcolor navajowhite rgb #ffdead
+.defcolor navajowhite1 rgb #ffdead
+.defcolor navajowhite2 rgb #eecfa1
+.defcolor navajowhite3 rgb #cdb38b
+.defcolor navajowhite4 rgb #8b795e
+.defcolor oldlace rgb #fdf5e6
+.defcolor whitesmoke rgb #f5f5f5
+.defcolor gainsboro rgb #dcdcdc
+.defcolor ivory rgb #fffff0
+.defcolor ivory1 rgb #fffff0
+.defcolor ivory2 rgb #eeeee0
+.defcolor ivory3 rgb #cdcdc1
+.defcolor ivory4 rgb #8b8b83
+.defcolor linen rgb #faf0e6
+.defcolor seashell rgb #fff5ee
+.defcolor seashell1 rgb #fff5ee
+.defcolor seashell2 rgb #eee5de
+.defcolor seashell3 rgb #cdc5bf
+.defcolor seashell4 rgb #8b8682
+.defcolor snow rgb #fffafa
+.defcolor snow1 rgb #fffafa
+.defcolor snow2 rgb #eee9e9
+.defcolor snow3 rgb #cdc9c9
+.defcolor snow4 rgb #8b8989
+.defcolor wheat rgb #f5deb3
+.defcolor wheat1 rgb #ffe7ba
+.defcolor wheat2 rgb #eed8ae
+.defcolor wheat3 rgb #cdba96
+.defcolor wheat4 rgb #8b7e66
+.defcolor white rgb #ffffff
+.defcolor blanchedalmond rgb #ffebcd
+.defcolor darkgoldenrod rgb #b8860b
+.defcolor darkgoldenrod1 rgb #ffb90f
+.defcolor darkgoldenrod2 rgb #eead0e
+.defcolor darkgoldenrod3 rgb #cd950c
+.defcolor darkgoldenrod4 rgb #8b6508
+.defcolor lemonchiffon rgb #fffacd
+.defcolor lemonchiffon1 rgb #fffacd
+.defcolor lemonchiffon2 rgb #eee9bf
+.defcolor lemonchiffon3 rgb #cdc9a5
+.defcolor lemonchiffon4 rgb #8b8970
+.defcolor lightgoldenrod rgb #eedd82
+.defcolor lightgoldenrod1 rgb #ffec8b
+.defcolor lightgoldenrod2 rgb #eedc82
+.defcolor lightgoldenrod3 rgb #cdbe70
+.defcolor lightgoldenrod4 rgb #8b814c
+.defcolor lightgoldenrodyellow rgb #fafad2
+.defcolor lightyellow rgb #ffffe0
+.defcolor lightyellow1 rgb #ffffe0
+.defcolor lightyellow2 rgb #eeeed1
+.defcolor lightyellow3 rgb #cdcdb4
+.defcolor lightyellow4 rgb #8b8b7a
+.defcolor palegoldenrod rgb #eee8aa
+.defcolor papayawhip rgb #ffefd5
+.defcolor cornsilk rgb #fff8dc
+.defcolor cornsilk1 rgb #fff8dc
+.defcolor cornsilk2 rgb #eee8cd
+.defcolor cornsilk3 rgb #cdc8b1
+.defcolor cornsilk4 rgb #8b8878
+.defcolor gold rgb #ffd700
+.defcolor gold1 rgb #ffd700
+.defcolor gold2 rgb #eec900
+.defcolor gold3 rgb #cdad00
+.defcolor gold4 rgb #8b7500
+.defcolor goldenrod rgb #daa520
+.defcolor goldenrod1 rgb #ffc125
+.defcolor goldenrod2 rgb #eeb422
+.defcolor goldenrod3 rgb #cd9b1d
+.defcolor goldenrod4 rgb #8b6914
+.defcolor moccasin rgb #ffe4b5
+.defcolor yellow rgb #ffff00
+.defcolor yellow1 rgb #ffff00
+.defcolor yellow2 rgb #eeee00
+.defcolor yellow3 rgb #cdcd00
+.defcolor yellow4 rgb #8b8b00
+.
+.ie '\[char97]'a' \
+. mso latin1.tmac
+.el \
+. mso cp1047.tmac
+.
+.cp \n[*groff_dvi_tmac_C]
+.do rr *groff_dvi_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/e.tmac b/tmac/e.tmac
new file mode 100644
index 0000000..b30a614
--- /dev/null
+++ b/tmac/e.tmac
@@ -0,0 +1,2255 @@
+.\" Copyright (c) 1988, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in
+.\" the documentation and/or other materials provided with the
+.\" distribution.
+.\" 3. [Deleted. See
+.\" ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change]
+.\" 4. Neither the name of the University nor the names of its
+.\" contributors may be used to endorse or promote products derived
+.\" from this software without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS"
+.\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+.\" PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
+.\" CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)e.tmac 8.1 (Berkeley) 06/05/93
+.\"
+.\" Modified by James Clark for use with groff.
+.\" Further modifications by Werner Lemberg, George Helffrich, and
+.\" G. Branden Robinson.
+.\"
+.\"**************************************************************
+.\"* *
+.\"* **** - M E N R O F F / T R O F F M A C R O S **** *
+.\"* *
+.\"* Produced for your edification and enjoyment by: *
+.\"* Eric Allman *
+.\"* Electronics Research Laboratory *
+.\"* U.C. Berkeley. *
+.\"* *
+.\"* VERSION 8.1 First Release: 11 Sept 1978 *
+.\"* *
+.\"* Documentation is available. *
+.\"* *
+.\"**************************************************************
+.\"
+.\" Macro definitions are annotated with a code:
+.\" *** user interface macro
+.\" $$$ macro which may be redefined by the user
+.\" to provide variant functions
+.\" --- internal macro; not to be called by user
+.\"
+.
+.do nr devtag-needs-end-of-heading 0
+.do nr devtag-needs-end-of-title 0
+.do nr devtag-needs-title 1
+.
+.do mso devtag.tmac
+.
+.if !\n(.g .ig
+.de @R \" --- initialize number register to 0, if undefined
+.do if !r\\$1 .nr \\$1 0
+..
+.
+.ds _e e.tmac\" name of macro package, for diagnostic messages
+.
+.\" emit error diagnostic
+.do de1 @err
+.ds @file \" empty
+.ds @line \" empty
+.if !'\\n[.F]'' .ds @file \\n[.F]:\"
+.if !'\\n[.c]'0' .ds @line \\n[.c]:\"
+.tm \\*(_e:\\*[@file]\\*[@line] \\$*
+.rm @file
+.rm @line
+..
+.
+.\" --- check whether grohtml needs end of title/heading
+.do de1 @html_check_need_title
+.if \\n[devtag-needs-end-of-title] \
+\{\
+. nr devtag-needs-end-of-title 0
+. DEVTAG-EO-TL
+.\}
+.if \\n[devtag-needs-title] \
+\{\
+. DEVTAG-TL
+. nr devtag-needs-title 0
+. nr devtag-needs-end-of-title 1
+.\}
+.if \\n[devtag-needs-end-of-heading] .DEVTAG-EO-H
+.nr devtag-needs-end-of-heading 0
+..
+.
+.\" If this macro were non-empty, we'd want to define it with .de1.
+.do de @check_need_title
+..
+.
+.ie '\*(.T'html' \
+. do als check_need_title @html_check_need_title
+.el \
+. do als check_need_title @check_need_title
+.
+.@R pf
+.if \n(pf .nx
+.
+.if !\n(.g .ig
+.de @S \" --- initialize string/macro to empty, if undefined
+.do if !d\\$1 .ds \\$1\" empty
+..
+.
+.@R @\" \" debugging level
+.
+.
+.\" *** INTERNAL GP MACROS ***
+.
+.
+.de @C \" --- change environments, taking info with us
+.nr _S \\n(.s
+.nr _V \\n(.v
+.nr _F \\n(.f
+.nr _J \\n(.j
+.do ds _A \\n[.fam]
+.nr _I \\n(.i
+.ev \\$1
+.ps \\n(_S
+.vs \\n(_Vu
+.ft \\n(_F
+.ad \\n(_J
+.do @fam \\*(_A
+'in \\n(_Iu
+.xl \\n($lu
+.lt \\n($lu
+.rr _S
+.rr _V
+.rr _F
+.rr _I
+.rr _J
+.ls 1
+'ce 0
+..
+.
+.de @D \" --- determine display type (Indent, Left, Center)
+.ds |p "\\$3
+.nr _d 0
+.if "\\$2"C" \
+. nr _d 1
+.if "\\$2"L" \
+. nr _d 2
+.if "\\$2"I" \
+. nr _d 3
+.if "\\$2"M" \
+. nr _d 4
+.if !\\n(_d \
+\{\
+. nr _d \\$1
+. ds |p "\\$2
+.\}
+.
+..
+.
+.rn nm @# \" --- save troff request
+.de nm \" --- turn on number mode, preserving font info
+.ie \\n(.$ \
+\{\
+. nr _S \\n(.s
+. nr _F \\n(.f
+. do if r _#p .do ps \\n[_#p]
+. do if r _#f .do ft \\n[_#f]
+. @# \\$1 \\$2 \\$3 \\$4
+. ft \\n(_F
+. ps \\n(_S
+. rr _F
+. rr _S
+.\}
+.el .@#
+..
+.
+.de @z \" --- end macro
+.if \n@>1 .tm >> @z, .z=\\n(.z ?a=\\n(?a
+.if !"\\n(.z"" \
+\{\
+. do @err unclosed block, footnote, or other diversion (\\n(.z)
+. di
+. ex
+.\}
+.if \\n(?a \
+. bp\" \" force out final table
+.ds bp
+.ds @b\" \" don't start another page
+.br
+.if \n@>1 .tm << @z
+..
+.
+.
+.\" *** STANDARD HEADERS AND FOOTERS ***
+.
+.
+.ie \n(.g .ds $* \\\\$*
+.el .ds $* \\\\$1 \\\\$2 \\\\$3 \\\\$4 \\\\$5 \\\\$6 \\\\$7 \\\\$8 \\\\$9
+.
+.de he \" *** define header
+.ie !\\n(.$ \
+\{\
+. rm |4
+. rm |5
+.\}
+.el \
+\{\
+. ds |4 "\*($*
+. ds |5 "\*($*
+.\}
+..
+.
+.de eh \" *** define even header
+.ie !\\n(.$ \
+. rm |4
+.el \
+. ds |4 "\*($*
+..
+.
+.de oh \" *** define odd header
+.ie !\\n(.$ \
+. rm |5
+.el \
+. ds |5 "\*($*
+..
+.
+.de fo \" *** define footer
+.ie !\\n(.$ \
+\{\
+. rm |6
+. rm |7
+.\}
+.el \
+\{\
+. ds |6 "\*($*
+. ds |7 "\*($*
+.\}
+..
+.
+.de ef \" *** define even footer
+.ie !\\n(.$ \
+. rm |6
+.el \
+. ds |6 "\*($*
+..
+.
+.de of \" *** define odd footer
+.ie !\\n(.$ \
+. rm |7
+.el \
+. ds |7 "\*($*
+..
+.
+.de ep \" *** end page (must be followed by a .bp)
+.if \\n(nl>0 \
+\{\
+. wh 0
+. rs
+. @b
+.\}
+..
+.
+.
+.\" *** INTERNAL HEADER AND FOOTER MACROS ***
+.
+.
+.de @h \" --- header
+.if \n@>1 .tm >> @h %=\\n% ?a=\\n(?a ?b=\\n(?b ?w=\\n(?w
+.do if (u;\\n(tm+\\n(bm+\\n(.V>\\n(.p) \{\
+. do @err insufficient page length; aborting
+. pl \\n(nlu
+. ab
+.\}
+.do if (u;\\n(.i+\\n(.o>=\\n(.l) \
+. do @err page offset plus indentation exceeds line length
+.\" initialize a pile of junk
+.nr ?h \\n(?H \" transfer "next page" to "this page"
+.nr ?H 0
+.nr ?c \\n(?C
+.nr ?C 0
+.do if d |4 .rn |4 |0
+.do if d |5 .rn |5 |1
+.do if d |6 .rn |6 |2
+.do if d |7 .rn |7 |3
+.nr _w 0 \" reset max footnote width
+.nr ?W 0 \" no wide floats this page (yet)
+.nr ?I 1
+.\" begin actual header stuff
+.ev 2
+.rs
+.if \\n(hm>0 \
+. if !'\*(.T'html' \
+. sp |\\n(hmu \" move to header position
+.@t $h\" \" output header title
+.if \\n(tm<=0 \
+. nr tm \n(.Vu
+.if !'\*(.T'html' \
+. sp |\\n(tmu \" move to top of text
+.ev
+.mk _k \" for columned output
+.if \\n(?n=1 .nm 1\" restore line numbering if n1 mode
+.nr $c 1 \" set first column
+.if \n@>4 .tm -- @h >> .ns nl=\\n(nl %=\\n% _k=\\n(_k tm=\\n(tm
+.ie \\n(?s \
+\{\
+. nr ?s 0
+. rs
+' @b
+.\}
+.el \
+. @n\" \" begin the column
+.if \n@>2 .tm << @h
+..
+.
+.de @n \" --- new column or page
+.if \n@>3 .tm >> @n nl=\\n(nl %=\\n% ?f=\\n(?f ?o=\\n(?o
+.if \\n(bm<=0 \
+. nr bm \\n(.Vu
+.if (\\n(_w<=\\n($l)&(\\n(?W=0) \
+\{\
+. \" Compute fudge factor (must be < 1P).
+. nr _b (\\n(ppp*\\n(tvu)/200u
+. if \\n(_bu>((\\n(bmu-\\n(fmu-((\\n(tpp*\\n(tvu)/100u))/2u) \
+. nr _b (\\n(ppp*\\n(tvu)/100u-\n(.Vu
+. nr _b +\\n(bmu
+.\}
+.nr _B \\n(_bu
+.ch @f
+.wh -\\n(_bu @f
+.nr _b +(\\n(ppp*\\n(tvu)/100u \" add 1 paragraph v in case sweep past
+.if \n@>2 .tm @n .p=\\n(.p bm=\\n(bm _b=\\n(_b _B=\\n(_B
+.nr ?f 0 \" reset footnote flag
+.if \\n(?o \
+\{\
+. (f _\" \" reprocess footnotes which run off page
+. nf
+. |o
+. fi
+. )f
+. rm |o
+.\}
+.nr ?o 0
+.if \\n(?T \
+\{\
+. nr _i \\n(.i
+. if \\n(?n \
+. nm \\n(ln
+. in 0
+. |h\" \" output the table header
+. in \\n(_iu
+. if \\n(?n \
+. nm
+. rr _i
+. mk #T \" for tbl commands
+. ns
+.\}
+.if (\\n(?a)&((\\n($c<2):(\\n(?w=0)) \
+\{\
+. nr ?a 0 \" output floating keep
+. @k |t
+. if \\n(?w \
+. mk _k \" don't overstrike wide keeps
+. nr ?w 0
+.\}
+.os
+.$H\" \" special column header macro
+.ns
+..
+.
+.de @f \" --- footer
+.if \n@>1 .tm >> @f %=\\n% nl=\\n(nl ?a=\\n(?a ?b=\\n(?b ?f=\\n(?f
+.if \n@>2 .nr __ \\n(.pu-\\n(nlu
+.if \n@>2 .tm @f bm=\\n(bm _B=\\n(_B _b=\\n(_b .p-nl=\\n(__
+.if \n@>2 .rr __
+.if \\n(?T \
+\{\
+. nr T. 1 \" for tbl commands (to output bottom line)
+. T# 1\" \" output the sides and bottom lines
+. br
+.\}
+.ev 2
+.ce 0
+.if \\n(?b \
+\{\
+. nr ?b 0
+. @k |b\" \" output bottom of page tables
+.\}
+.if \\n(?f \
+. @o\" \" output footnote if present
+.ie \\n($c<\\n($m \
+. @c\" \" handle new column
+.el \
+. @e\" \" new page
+.ev
+.if \n@>2 .tm << @f
+..
+.
+.de @o \" --- output footnote
+.nf
+.ls 1
+.in 0
+.if \n@>2 .tm @o last printed text = \\n(nl placing @r trap at -\\n(_B
+.wh -\\n(_Bu @r
+.if \\n(?n \
+. nm \\n(ln
+.if \\n(_f \
+. if !\\n(_f=\\n($m \
+. do @err writing \\n($m-column footnote in \
+\\n(_f-column layout
+.|f
+.nr _f 0
+.if \\n(?n \
+. nm
+.fi
+.if \n@>2 .tm @o triggered @r (?o) = \\n(?o
+.if \\n(?o \
+\{\
+. di \" just in case triggered @r
+. if \\n(dn=0 \
+\{\
+. rm |o
+. nr ?o 0
+. \}
+. nr dn \\n(_D
+. rr _D
+.\}
+.rm |f
+.ch @r
+..
+.
+.de @c \" --- new column
+.if \n@>2 .tm >> @c %=\\n%
+.rs
+.sp |\\n(_ku
+.@O +\\n($lu+\\n($su
+.nr $c +1
+.@n
+..
+.
+.de @e \" --- end page
+.if \n@>2 .tm >> @e
+.@O \\n(_ou
+.rs
+.\" Move to footer position.
+.sp |\\n(.pu-\\n(fmu-((\\n(tpp*\\n(tvu)/100u)
+.@t $f\" \" output footer title
+.nr ?h 0
+.bp
+..
+.
+.de @t \" --- output header or footer title
+.if !\\n(?h \
+\{\
+. sz \\n(tp\" \" set header/footer type fonts, etc.
+. @F \\n(tf
+. lt \\n(_Lu \" make title span entire page
+. if \\n(?n \
+. nm \\n(ln
+. nf
+. \\$1
+. br
+. if \\n(?n \
+. nm
+.\}
+..
+.
+.de $h \" $$$ print header
+.ds |z
+.if !\\n(?c \
+\{\
+. if e .ds |z "\\*(|0
+. if o .ds |z "\\*(|1
+.\}
+.if !\(ts\\*(|z\(ts\(ts \
+' tl \\*(|z
+.rm |z
+..
+.
+.de $f \" $$$ print footer
+.ds |z
+.if \\n(?c \
+\{\
+. if e .ds |z "\\*(|0
+. if o .ds |z "\\*(|1
+.\}
+.if \(ts\\*(|z\(ts\(ts \
+\{\
+. if e .ds |z "\\*(|2
+. if o .ds |z "\\*(|3
+.\}
+.if !\(ts\\*(|z\(ts\(ts \
+' tl \\*(|z
+.rm |z
+..
+.
+.de @r \" --- reprocess overflow footnotes
+.if \n@>3 .tm >> @r .z=\\n(.z ?f=\\n(?f ?a=\\n(?a ?b=\\n(?b _b=\\n(_b
+.di |o \" save overflow footnote
+.nr ?o 1
+.nr _D \\n(dn
+.ns
+..
+.
+.
+.\" *** COMMANDS WITH VARIANT DEFINITIONS ***
+.
+.
+.ie '\*(.T'html' .ds @b \" empty
+.el .rn bp @b \" --- begin page
+.
+.de bp \" *** begin new page (overrides columns)
+.nr $c \\n($m \" force new page, not new column
+.ie \\n(nl>0 \
+. @b \\$1
+.el \
+\{\
+. if \\n(.$>0 \
+. pn \\$1
+. if \\n(?I \
+. @h\" \" 'spring' the header trap
+.\}
+.br
+.wh 0 @h \" reset header
+..
+.
+.rn ll xl \" *** special line length (local)
+.de ll
+.xl \\$1
+.lt \\$1
+.nr $l \\n(.l \" *** line length (copied among ev 0, 1, and 2)
+.if (\\n($m<=1):(\\n($l>\\n(_L) \
+. nr _L \\n(.l
+..
+.
+.rn po @O \" --- local page offset
+.
+.de po \" *** page offset
+.@O \\$1
+.if \\n(.o<0 \
+. do @err page offset is negative (\\n(.ou)
+.nr _o \\n(.o
+..
+.
+.\" Redefine the groff fam request to set the family in
+.\" environment 2 as well as the current environment.
+.if !\n(.g .ig
+.do rn fam @fam \" --- set family in current environment
+.do de fam \" *** set font family in ev 2 and current ev
+.do @fam \\$1
+.ev 2
+.do @fam \\$1
+.ev
+..
+.
+.
+.\" *** MISCELLANEOUS ROFF COMMANDS ***
+.
+.
+.de hx \" *** suppress headers and footers next page
+.nr ?H 1
+..
+.
+.de ix \" *** indent, no break
+'in \\$1
+..
+.
+.de bl \" *** contiguous blank lines
+.br
+.@s \\$1
+.sp \\$1
+..
+.
+.de @s \" --- diversion-surviving space test
+.ne \\$1
+.rs
+.if !'\\n(.z'' \!.@s \\$1
+..
+.
+.\" Even with the following facilities, this package's simulation of
+.\" roff(1) line numbering features does not exhibit complete fidelity
+.\" to that program's Unix V7 behavior. roff(1) always increased the
+.\" page offset by 5n and set a three-digit line number, leaving _two_
+.\" spaces between the number and the start of unindented text. This
+.\" package indents by \n(no instead. Further, roff(1) did _not_ reduce
+.\" the line length to compensate for the increase in page offset. GBR
+.\" presumes that the document author was expected to use an `ll`
+.\" request to perform that action if desired, but has no corpus of
+.\" idiomatic, line-numbered roff(1) documents to examine.
+.\"
+.de n1 \" *** line numbering 1
+.ie \\n(.$ \
+. if '\\$1'C' \
+\{\
+. nr ?N 1
+. nr _l \\n(.l
+. ll -\\n(nou
+.\}
+.if !\\n(?N \
+. po -\\n(nou
+.nr ?n 1
+.do nr _#p \\n(.s
+.do nr _#f \\n(.f
+.nm 1
+..
+.
+.de n2 \" *** line numbering 2
+.nr _n \\n(ln-1\" save last line number that may have been output
+.ie \\n(.$ \
+\{\
+. do ie \\B`\\$1` \
+\{\
+. ds |i \\$1
+. ds |j \\$1
+. nr |l 0
+. \" Pick off leading char and rest to check.
+. do substring |i 0 0 \"
+. do length |l \\$1
+. if \\n(|l>1 .do substring |j 1\" \" for +N / -N
+. ie `\\*(|i`+` \
+. nr ln (\\n(_n)+\\*(|j
+.\" This file's brace style doesn't permit indentation of \{. --GBR
+. el \
+\{\
+. ie `\\*(|i`-` \
+. nr ln (\\n(_n)-\\*(|j
+. el \
+. nr ln \\$1 \" unsigned N
+. \}
+. do nr _#p \\n(.s
+. do nr _#f \\n(.f
+. nm \\n(ln
+. nr ?n 2
+. rm |i |j
+. rr |l
+.\}
+. el \
+. do @err invalid numeric argument to 'n2': '\\$1'
+.\}
+.el \
+\{\
+. nm
+. ie \\n(?N \
+\{\
+. ll \\n(_lu
+. rr _l
+. nr ?N 0
+.\}
+. el \
+. po +\\n(nou
+. nr ?n 0
+. nr ln 0
+.\}
+.rr _n
+..
+.
+.de pa \" *** new page
+.bp \\$1
+..
+.
+.de ro \" *** roman page numbers
+.af % i
+..
+.
+.de ar \" *** arabic page numbers
+.af % 1
+..
+.
+.de m1 \" *** position one space
+.nr _0 \\n(hmu
+.nr hm \\$1v
+.nr tm +\\n(hmu-\\n(_0u
+.rr _0
+..
+.
+.de m2 \" *** position two space
+.nr tm \\n(hmu+\\n(tpp+\\$1v
+..
+.
+.de m3 \" *** position three space
+.nr bm \\n(fmu+\\n(tpp+\\$1v
+..
+.
+.de m4 \" *** position four space
+.nr _0 \\n(fmu
+.nr fm \\$1v
+.nr bm +\\n(fmu-\\n(_0u
+..
+.
+.de sk \" *** leave a blank page (next page)
+.if \\n(.$>0 \
+. do @err ignoring argument(s) to 'sk'
+.nr ?s 1
+..
+.
+.
+.\" *** MISCELLANEOUS USER SUPPORT COMMANDS ***
+.
+.
+.if !\n(.g .ig
+.de re \" *** reset tabs (TROFF defines 15 stops default)
+.ta T 0.5i
+..
+.
+.if \n(.g .ig
+.de re
+.ta 0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i
+..
+.
+.de ba \" *** set base indent
+.ie \\n(.$ \
+. nr $i \\$1n
+.el \
+. nr $i \\n(siu*\\n($0u
+..
+.
+.de hl \" *** draw horizontal line
+.br
+.if '\*(.T'html' \
+\{\
+. HR
+. do return
+.\}
+.ie \n(.g .do nr _I \\n[.in]
+.el .nr _I \\n(.i
+\l'\\n(.lu-\\n(_Iu'
+.sp
+..
+.
+.
+.\" *** PARAGRAPHING ***
+.
+.
+.de pp \" *** paragraph
+.lp \\n(piu
+..
+.
+.de lp \" *** left aligned paragraph
+.@p
+.if \\n(.$ \
+. ti +\\$1
+.nr $p 0 1
+..
+.
+.de ip \" *** indented paragraph w/ optional tag
+.if (\\n(ii>0)&(\\n(ii<1n) \
+. nr ii \\n(iin
+.nr _0 \\n(ii
+.if \\n(.$>1 \
+. nr _0 \\$2n
+.@p \\n(_0u
+.nr _I \\n(.iu
+.in 0
+.nm
+.di |i
+\&\\$1
+.br
+.di
+.if \\n(?n \
+. nm \\n(ln
+.in \\n(_Iu
+.ds |j \\*(|i\\
+.ie \\w"\\*(|j" \
+\{\
+. ti -\\n(_0u
+. ie \\w"\\*(|j">=\\n(_0 \
+\{\
+. do DEVTAG-COL 1
+\\*(|j
+. do DEVTAG-COL-NEXT 2
+. br
+. \}
+. el \
+\{\
+. do DEVTAG-COL 1
+\\*(|j\h'|\\n(_0u'\c
+. do DEVTAG-COL 2
+. \}
+.\}
+.el .do DEVTAG-COL 2
+.rr _0
+.rm |i |j
+..
+.
+.de np \" *** numbered paragraph
+.\" use output comparison in case user has changed format of $p
+.if '\\n($p'-1' \
+. nr $p 0 \" reset number after .bu
+.nr $p +1 \" increment paragraph number
+.@p \w'\0(000)\0'u
+.ti -\w'\0(000)\0'u
+\0(\\n($p)\h'|\w'\0(000)\0'u'\c
+..
+.
+.de bu \" *** bulleted paragraph
+.br
+.\" use output comparison in case user has changed format of $p
+.if '\\n($p'-1' \
+. ns \" don't space between .bu paragraphs
+.nr $p 0-1 \" mark "bulleted paragraph" mode
+.@p \w'\0\(bu\0'u
+.ti -\w'\0\(bu\0'u
+\0\(bu\0\c
+..
+.
+.de @p \" --- initialize for paragraph
+.do check_need_title
+.if "\\n(.z"|e" .do @err eqn equation continuation unfulfilled
+.in \\n($iu+\\n(pou
+.if \\n(.$ \
+. in +\\$1n
+.ce 0
+.rj 0
+.fi
+.@F \\n(pf
+.sz \\n(pp
+.sp \\n(psu
+.ne \\n(.Lv+\\n(.Vu
+.ns
+..
+.
+.
+.\" *** SECTION HEADINGS ***
+.
+.
+.de sh \" *** section heading
+.fi
+.do check_need_title
+.if (\\n(si>0)&(\\n(si<1n) \
+. nr si \\n(sin
+.if '\*(.T'html' .nr si 0
+.ce 0
+.if '\*(.T'html' \
+\{\
+. do DEVTAG-SH \\$1
+. do nr devtag-needs-end-of-heading 1
+.\}
+.@d "\\$1" +1 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
+.if !"\\$2"_" \
+\{\
+. ds |n \&\\$2
+. $p "\\*(|n" "\\*($n" \\n($0
+. $0 "\\*(|n" "\\*($n" \\n($0
+. rm |n
+.\}
+.nr $p 0 1 \" reset .np count
+..
+.
+.de @d \" --- change section depth
+.if !""\\$1" \
+. nr $0 \\$1
+.if \\n($0&(\\n(.$>1) \
+. nr $\\n($0 \\$2
+.ds $n \&\"
+.ie \\n($0>=1 \
+\{\
+. if '\\n($1'0' \
+. nr $1 1
+. if (\\n(.$>=3) .if !"\\$3"-" \
+. nr $1 \\$3
+. as $n \\n($1
+.\}
+.el \
+. nr $1 0
+.ie \\n($0>=2 \
+\{\
+. if '\\n($2'0' \
+. nr $2 1
+. if (\\n(.$>=4) .if !"\\$4"-" \
+. nr $2 \\$4
+. as $n .\\n($2
+.\}
+.el \
+. nr $2 0
+.ie \\n($0>=3 \
+\{\
+. if '\\n($3'0' \
+. nr $3 1
+. if (\\n(.$>=5) .if !"\\$5"-" \
+. nr $3 \\$5
+. as $n .\\n($3
+.\}
+.el \
+. nr $3 0
+.ie \\n($0>=4 \
+\{\
+. if '\\n($4'0' \
+. nr $4 1
+. if (\\n(.$>=6) .if !"\\$6"-" \
+. nr $4 \\$6
+. as $n .\\n($4
+.\}
+.el \
+. nr $4 0
+.ie \\n($0>=5 \
+\{\
+. if '\\n($5'0' \
+. nr $5 1
+. if (\\n(.$>=7) .if !"\\$7"-" \
+. nr $5 \\$7
+. as $n .\\n($5
+.\}
+.el \
+. nr $5 0
+.ie \\n($0>=6 \
+\{\
+. if '\\n($6'0' \
+. nr $6 1
+. if (\\n(.$>=8) .if !"\\$8"-" \
+. nr $6 \\$8
+. as $n .\\n($6
+.\}
+.el \
+. nr $6 0
+..
+.
+.de sx \" *** heading up, no increment (2.1.1 -> 2.1)
+.ce 0
+.ul 0
+.nr _0 \\n($0-1
+.if \\n(.$ .nr _0 +1
+.if \\n(.$ .nr _0 \\$1
+.@d \\n(_0
+.rr _0
+.$p "" "" \\n($0
+.nr $p 0 1 \" reset .np count
+..
+.
+.de uh \" *** unnumbered section heading
+.$p "\\$1"
+.$0 "\\$1"
+..
+.
+.de $p \" $$$ print section heading
+.if (\\n(si>0)&(\\n(.$>2) \
+. nr $i \\$3*\\n(si
+.in \\n($iu
+.ie !"\\$1\\$2"" \
+\{\
+. sp \\n(ssu \" one of them is non-null
+. ne \\n(.Lv+\\n(.Vu+\\n(psu+((\\n(spp*\\n(tvu*\\n(.Lu)/100u)
+. \" exdent if \\$3 > 0
+. ie 0\\$3 \
+. ti -(\\n(siu-\\n(sou)
+. el \
+. ti +\\n(sou
+. @F \\n(sf
+. sz \\n(sp
+. if 0\\$3 \
+. $\\$3
+. if \w"\\$2">0 \\$2.
+. if \w"\\$1">0 \\$1\f1\ \ \&
+.\}
+.el \
+. sp \\n(psu
+.@F \\n(pf
+.sz \\n(pp
+..
+.
+.
+.\" *** COLUMNED OUTPUT ***
+.
+.
+.de 2c \" *** double columned output
+.do if d |f .do @err changing columnation with footnote pending
+.br
+.if \\n($m>1 \
+. 1c\" \" revert to 1c if already 2c
+.nr $c 1
+.nr $m 2
+.if \\n(.$>1 \
+. nr $m \\$2 \" param 2: column quantity
+.if \\n(.$>0 \
+. if !'\\$1'' \
+. nr $s \\$1n \" param 1: column separation
+.nr $l (\\n(.l-((\\n($m-1)*\\n($s))/\\n($m
+.xl \\n($lu
+.mk _k
+.ns
+..
+.
+.de 1c \" *** single columned output
+.do if d |f .do @err changing columnation with footnote pending
+.br
+.nr $c 1
+.nr $m 1
+.ll \\n(_Lu\" return to normal output
+.sp |\\n(.hu
+.@O \\n(_ou
+..
+.
+.de bc \" *** begin column
+.sp \\n(.pu
+..
+.
+.
+.\" *** FLOATING TABLES AND NONFLOATING BLOCKS ***
+.
+.
+.de (z \" *** begin floating keep
+.if \n@>4 .tm >> (z, .z=\n(.z
+.@D 4 \\$1 \\$2
+.@(
+..
+.
+.de )z \" *** end floating keep
+.if \n@>4 .tm >> )z, .z=\n(.z
+.sp \\n(zsu
+.@)
+.if \n@>4 .tm -- )z << @), .z=\n(.z
+.rr _0
+.if !\\n(?b \
+. nr dn +(\\n(ppp*\\n(tvu)/200u+\\n(zsu
+.nr dl -\n(.H \" fudge factor necessary to make it work
+.ie ((\\n(dn+\n(.V)>=\\n(.t):(\\n(?a):((\\n(dl>\\n($l)&(\\n($c>1)) \
+\{\
+. nr ?a 1
+. if (\\n(dl>\\n($l)&(\\n($m>1) \
+. nr ?w 1 \" mark wider than one column (top)
+. ds |x |t
+.\}
+.el \
+\{\
+. nr ?b 1
+. if (\\n(dl>\\n($l)&(\\n($m>1) \
+. nr ?W 1 \" mark wider than one column (bottom)
+. nr _b +\\n(dnu
+. \" avoid moving @f back past the current position
+. if \\n(.p-\\n(nl-\n(.V<\\n(_b \
+. nr _b \\n(.p-\\n(nl-\n(.V
+. ch @f -\\n(_bu
+. ds |x |b
+.\}
+.da \\*(|x \" copy to save macro
+.nf
+.ls 1
+.nr ?k 1
+.if \n@>4 .tm -- )z >> \\*(|x
+\!.if \\\\n(nl>(\\\\n(tm+2v) .ne \\n(dnu-\\n(zsu
+.|k\" \" and the body
+.if \n@>4 .tm -- )z << \\*(|x, .z=\\n(.z
+.nr ?k 0
+.rm |k\" \" remove the temp macro
+.da
+.in 0
+.ls 1
+.xl \\n($lu
+.ev
+.if \n@>4 .tm << )z, .z=\\n(.z
+..
+.
+.de @k \" --- output keep
+.if \n@>4 .tm >> @k, $1=\\$1, .z=\\n(.z
+.ev 1
+.nf
+.ls 1
+.in 0
+.if !`\\$2`ns` .sp \\n(zsu \" no pre-spacing if (b .. )b
+.if \\n(?n \
+. nm \\n(ln
+.\\$1
+.if \\n(?n \
+. nm
+.br
+.rm \\$1
+.ev
+..
+.
+.de (t \" XXX temp ref to (z
+.(z \\$1 \\$2
+..
+.
+.de )t \" XXX temp ref to )t
+.)z \\$1 \\$2
+..
+.
+.de (b \" *** begin block
+.br
+.@D 3 \\$1 \\$2
+.sp \\n(bsu
+.@(
+.if '\*(.T'html' .sp \\n(bsu
+..
+.
+.de )b \" *** end block
+.br
+.@)
+.if (\\n(bt=0):(\\n(.t<\\n(bt) \
+. ne \\n(dnu \" make it all on one page
+.@k |k ns
+.ev \" return from display environment
+.sp \\n(bsu+\\n(.Lv-1v
+..
+.
+.de @( \" --- begin keep
+.if !"\\n(.z"" .do @err invalid nested keep (\\n(.z)
+.@M
+.di |k
+\!'rs
+..
+.
+.de @M \" --- set modes for display
+.nr ?k 1
+.@C 1
+.@F \\n(df
+.if \\n($R .@V
+.vs \\n(.sp*\\n(dvu/100u
+.nf
+.if "\\*(|p"F" \
+. fi \" set fill mode if "F" parameter
+.if \\n(_d=4 \
+. in 0
+.if \\n(_d=3 \
+\{\
+. in +\\n(biu
+. xl -\\n(biu
+.\}
+.if \\n(_d=1 \
+. ce 10000
+..
+.
+.de @) \" --- end keep
+.br
+.if !"\\n(.z"|k" .do @err attempted close of never-opened keep
+.nr ?k 0
+.di
+.in 0
+.ce 0
+..
+.
+.de (c \" *** begin block centered text
+.br
+.if "\\n(.z"|c" .do @err block centering calls cannot be nested
+.if \\n(?n .nm
+.if ``\\n(.z` \
+\{\
+. @C 1\" \" Ensure env. set up for centering in open text
+. ev
+.\}
+.di |c
+..
+.
+.de )c \" *** end block centered text
+.if !"\\n(.z"|c" .do @err unmatched block centering call
+.br \" force out final line
+.di
+.if \n@>4 .tm >> .)c .l=\\n(.l .i=\\n(.i $i=\\n($i dl=\\n(dl
+.ev 1
+.ls 1
+.nr __ (\\n(.lu-\\n(.iu-\\n(dlu)/2u
+.if \\n(__u<0 .nr __ 0
+.in \\n(__u
+.rr __
+.if \n@>4 .tm -- .)c << .in .l=\\n(.l .i=\\n(.i dl=\\n(dl
+.if \\n(?n \
+. nm \\n(ln
+.nf
+.|c
+.in
+.ls
+.if \\n(?n \
+. nm
+.ev
+.rm |c
+.if \\n(?n \
+. nm \\n(ln
+..
+.
+.
+.\" *** BLOCK QUOTES (OR WHATEVER) AND LISTS ***
+.
+.
+.de (q \" *** begin block quote
+.br
+.@C 1
+.fi
+.sp \\n(qsu
+.in +\\n(qiu
+.xl -\\n(qiu
+.sz \\n(qp
+.if \\n(?n \
+. nm \\n(ln
+..
+.
+.de )q \" *** end block quote
+.br
+.if \\n(?n \
+. nm
+.ev
+.sp \\n(qsu+\\n(.Lv-1v
+.nr ?k 0
+..
+.
+.de (l \" *** begin list
+.br
+.sp \\n(bsu
+.@D 3 \\$1 \\$2
+.@M
+.if \\n(?n \
+. nm \\n(ln
+.if '\*(.T'html' .sp \\n(bsu
+..
+.
+.de )l \" *** end list
+.\" XXX: Check for keep underflow here.
+.br
+.ev
+.if \\n(?n \
+. nm \\n(ln
+.sp \\n(bsu+\\n(.Lv-1v
+.nr ?k 0
+..
+.
+.
+.\" *** PREPROCESSOR SUPPORT ***
+.
+.
+.\"
+.\" EQN
+.\"
+.de EQ \" *** equation start
+.do if \\n[devtag-needs-end-of-heading] .do DEVTAG-EO-H
+.do nr devtag-needs-end-of-heading 0
+.if "\*(.T"html" \
+\{\
+. do nr e-EQ-ll \\n(.l
+. ll 1000n
+.\}
+.do HTML-IMAGE
+.if !\\n(?e \
+\{\
+. if "\\n(.z"|e" .do @err nested eqn equation start
+. @D 1 "\\$1" "\\$2"
+. @C 2
+. di |e
+.\}
+.ls 1
+.in 0
+.nf
+..
+.
+.de EN \" *** equation end
+.br
+.do HTML-IMAGE-END
+.if "\*(.T"html" \
+. do ll \\n[e-EQ-ll]u
+.ie "\\$1"C" \
+\{\
+. nr ?e 1
+. sp \\n(esu
+.\}
+.el \
+\{\
+. nr ?e 0
+. di
+. if \\n(dn \
+. @q\" \" actual equation output
+. rm |e
+. ev
+.\}
+..
+.
+.de @q \" --- equation output
+.nr _Q \\n(dnu
+.ev
+.sp \\n(esu \" output rest of preceding text
+.if !"\\n(.z"" \!.ne \\n(_Qu
+.ne \\n(_Qu+\n(.Vu \" keep it on one page
+.@C 2\" \" .ev 2 may be jumbled from header
+.if \\n(_d=1 \
+. in (\\n(.lu+\\n($iu-\\n(dlu)/2u
+.if \\n(_d=2 \
+. in \\n($iu
+.if \\n(_d=3 \
+. in \\n(biu+\\n($iu
+.if \\n(_d=4 \
+. in 0
+.mk _q
+.if \n@>1 .tm --@q: _Q=\\n(_Q _q=\\n(_q nl=\\n(nl |p=\\*(|p
+.if !"\\*(|p"" \
+\{\
+. rs
+. sp (\\n(_Qu-\\n(.vu)/2u
+. tl """\\*(|p"
+. rt \\n(_qu
+.\}
+.if \\n(?n \
+. nm \\n(ln
+.|e
+.if \\n(?n \
+. nm
+.sp |\\n(_qu+\\n(_Qu
+.sp \\n(esu+\\n(.Lv-1v
+.rr _q
+.rr _Q
+..
+.
+.\"
+.\" TBL
+.\"
+.de TS \" *** table start
+.sp \\n(bsu
+.if "\*(.T"html" \
+\{\
+. do nr e-TS-ll \\n(.l
+. ll 1000n
+.\}
+.do HTML-IMAGE
+.@C 1
+.fi \" drop into fill mode for text boxes
+.if "\\$1"H" \
+\{\
+. di |h \" save header part
+. nr ?T 1
+.\}
+.ls 1
+.ch @f -(\\n(_bu+1v) \" set pseudo-trap for bottom line
+.if \\n(.p-\\n(_b-1v<=\\n(nl \
+. ch @f \\n(nlu+\n(.Vu
+..
+.
+.de TH \" *** end header part of table
+.nr T. 0
+.T# 0
+.if \\n(?n \!.nm
+.di
+.nr _T \\n(?T
+.nr ?T 0
+.ne \\n(dnu+1v
+.nr ?T \\n(_T
+.nr _i \\n(.i
+.if \\n(?n .nm \\n(ln
+.in 0
+.|h\" \" put in the initial header
+.in \\n(_iu
+.rr _i
+.mk #T
+..
+.
+.de TE \" *** table end
+.nr ?T 0
+.ch @f -\\n(_bu \" reset pseudo-trap
+.if \\n(.p-\\n(_b<=\\n(nl \
+. ch @f \\n(nlu+\n(.Vu
+.ev
+.do HTML-IMAGE-END
+.if "\*(.T"html" \
+. do ll \\n[e-TS-ll]u
+.sp \\n(bsu+\\n(.Lv-1v
+.re
+..
+.
+.de T&
+..
+.
+.\"
+.\" REFER
+.\"
+.do mso refer-me.tmac
+.
+.\"
+.\" IDEAL
+.\"
+.de IS \" *** start ideal picture
+.nr g7 \\n(.u
+.ls 1
+..
+.
+.de IF
+.if \\n(g7 .fi
+.ls
+..
+.
+.de IE \" *** end ideal picture
+.if \\n(g7 .fi
+.ls
+..
+.
+.de && \" no-op so we can define and end one macro inside another
+..
+.
+.\"
+.\" PIC
+.\"
+.de PS \" *** start picture: $1=height, $2=width in units or inches
+.sp 0.3
+.do HTML-IMAGE
+.nr g7 \\$2
+.in (u;\\n(.l-\\n(g7>?0/2)
+.ne \\$1u
+.nr g7 \\n(.u
+.ls 1
+.ie \\n(?n \
+\{\
+. do nr PS_nm_cnt 0
+. do de PS_nm_check && \" define macro to emit .nm at top diversion
+. if \n@>4 .tm -- PS: \\\\$1 \\\\$2 .z=\\\\n(.z PS_nm_cnt=\\\\n[PS_nm_cnt]
+. \" Multiple .PS/.PE in a keep.
+. if `\\\\$2`init` \
+. do nr PS_nm_cnt \\\\n[PS_nm_cnt]+1
+. ie `\\\\n(.z`` \
+\{\
+. if `\\\\$1`suspend` \
+. nm
+. if `\\\\$1`resume` \
+\{\
+. nm \\\\n(ln
+. do nr PS_nm_cnt \\\\n[PS_nm_cnt]-1
+. do if !\\\\n[PS_nm_cnt] \
+\{\
+. do rm PS_nm_check
+. do rr PS_nm_cnt
+.\}
+.\}
+.\}
+.el \!.PS_nm_check \\\\$1
+. &&
+. mk _q \" emit a single numbered line for PS picture
+. rs
+\&\ \" space
+. br
+. rt \\n(_qu
+. do PS_nm_check suspend init
+.\}
+..
+.
+.rm &&
+.
+.de PF \" *** end picture; "fly back" to top
+.if \\n(?n .do PS_nm_check resume
+.ls
+.in
+.if \\n(g7 .fi
+.do HTML-IMAGE-END
+..
+.
+.de PE \" *** end picture
+.PF
+.sp .6
+..
+.
+.\"
+.\" GREMLIN
+.\"
+.de GS \" *** start gremlin picture
+.ie '\*(.T'html' \
+\{\
+. ie "\\$1"L" .do HTML-IMAGE-LEFT
+. el .ie "\\$1"R" .do HTML-IMAGE-RIGHT
+. el .do HTML-IMAGE
+.\}
+.el \
+\{\
+. nr g7 (\\n(.lu-\\n(g1u)/2u
+. if "\\$1"L" .nr g7 \\n(.iu
+. if "\\$1"R" .nr g7 \\n(.lu-\\n(g1u
+. in \\n(g7u
+. nr g7 \\n(.u
+. ls 1
+. nf
+. ne \\n(g2u
+.\}
+..
+.
+.de GE \" *** end gremlin picture
+.ie '\*(.T'html' .do HTML-IMAGE-END
+.el \
+\{\
+. GF
+. sp .6
+.\}
+..
+.
+.de GF \" *** finish gremlin picture; stay at top
+.ls
+.in
+.if \\n(g7 .fi
+..
+.
+.
+.\" *** FONT AIDS ***
+.
+.
+.de sz \" *** set point size and vertical spacing
+.ps \\$1
+.if \\n($r .@v
+.vs \\n(.sp*\\n(tvu/100u \" default vs at pointsize + 20%
+..
+.
+.de @v \" --- possibly set tv from $r
+.if (1i>=240u)&(1p<=\\n($r)&(\\n($r<=4p) .nr tv \\n($r00/1p
+..
+.
+.de @V \" --- possibly set dv from $R
+.if (1i>=240u)&(1p<=\\n($R)&(\\n($R<=4p) .nr dv \\n($R00/1p
+..
+.
+.de @E \" --- store in _F argument to \f for restoring font
+.ie \\n(.f<10 \
+. ds _F \\n(.f
+.el \
+\{\
+. ie \\n(.f<100&\n(.g \
+. ds _F (\\n(.f
+. el \
+. ds _F P
+.\}
+..
+.
+.de r \" *** enter roman font
+.do check_need_title
+.@E
+.ft 1
+.if \\n(.$ \&\\$1\f\\*(_F\\$2
+.do check_need_title
+..
+.
+.de i \" *** enter italic
+.do check_need_title
+.@E
+.ft 2
+.if \\n(.$ \&\,\\$1\/\f\\*(_F\\$2
+.do check_need_title
+..
+.
+.de b \" *** enter boldface
+.do check_need_title
+.@E
+.ft 3
+.if \\n(.$ \&\\$1\f\\*(_F\\$2
+.do check_need_title
+..
+.
+.de rb \" *** enter real boldface
+.do check_need_title
+.@E
+.ft 3
+.if \\n(.$ \&\\$1\f\\*(_F\\$2
+.do check_need_title
+..
+.
+.de bi \" *** enter bold italic
+.do check_need_title
+.@E
+.ft 4
+.if \\n(.$ \&\,\\$1\/\f\\*(_F\\$2
+.do check_need_title
+..
+.
+.de u \" *** enter underlined word
+.\" If the first argument would break, then (in troff mode), this
+.\" underlines only the words appearing only the last output line, with
+.\" the underline extending all the way into the left margin.
+.ie t \\$1\l'|0\(ul'\\$2
+.el \(ul\\$1\(ul\\$2
+..
+.
+.\" This alternative version of the `u` macro uses the groff \Z
+.\" extension to get the underlining to accurately fit under the words
+.\" at the expense of no longer adjusting them. If the first argument
+.\" would break, the output line is overset.
+.if !\n(.g .ig
+.de u
+.ie t .do nop \Z'\\$1'\v'.25m'\D'l \w'\\$1'u 0'\v'-.25m'\\$2
+.el \(ul\\$1\(ul\\$2
+..
+.
+.de q \" *** enter quoted word
+\&\\*(lq\\$1\\*(rq\\$2
+..
+.
+.de bx \" *** enter boxed word
+.ie t \
+\{\
+. ie '\\*(.T'html' \\$1\\$2
+. el \k~\(br\|\\$1\|\(br\l'|\\n~u\(rn'\l'|\\n~u\(ul'\^\\$2
+.\}
+.el \
+\{\
+. ie \\n(.g .do nop \m[black]\M[white]\Z'\\$1'\h'\w'\\$1'u'\
+\m[]\M[]\\$2
+. el |\\$1|\\$2
+.\}
+..
+.
+.de sm \" *** print in smaller font
+\s-1\\$1\\s+1\\$2
+..
+.
+.de @F \" --- change font (0 -> no change)
+.nr ~ \\$1
+.if \\n~>0 \
+. ft \\n~
+.rr ~
+..
+.
+.
+.\" *** FOOTNOTING ***
+.
+.
+.de (f \" *** begin footnote
+.if "\\n(.z"|f" .do @err footnotes cannot be nested
+.if \\n(_f \
+. if !\\n(_f=\\n($m \
+. do @err queueing \\n($m-column footnote after \
+\\n(_f-column footnote
+.nr _f \\n($m
+.ie "\\n(.z"" \
+\{\
+. nr _D \\n(dn
+. nr _0 1v+\\n(nlu
+. ev 2
+. nm
+. da |f
+. in 0
+. xl \\n($lu-\\n(fuu
+. @F \\n(ff
+. sz \\n(fp
+. vs \\n(.sp*\\n(dvu/100u
+. if !\\n(?f \
+\{\
+. nr _b +1v \" allow space for $s
+. $s
+. \}
+. br
+. if \\n(.p-\\n(_b-\\n(_0-\\n(.h-1v-\\n(fs<0 \
+\{\
+. da\" \" won't fit on page at all
+. bc
+. if !\\n(?f \
+. rm |f
+. da |f
+.\" Next 5 lines could be dropped if headers had their own environment.
+. in 0 \" reset everything from .bc
+. xl \\n($lu-\\n(fuu
+. @F \\n(ff
+. sz \\n(fp
+. vs \\n(.sp*\\n(dvu/100u
+. if !\\n(?f \
+. $s
+. br
+. \}
+. rr _0
+. sp \\n(fsu
+. nr ?f 1
+. fi
+. if !"\\$1"_" \
+. ti \\n(fiu
+. if \n@>2 .tm << (f $f=\\n($f
+.\}
+.el \
+\{\
+. ev 2
+. nm
+. in 0
+. xl \\n($lu-\\n(fuu
+. @F \\n(ff
+. sz \\n(fp
+. vs \\n(.sp*\\n(dvu/100u
+. fi
+\!.(f \\$1
+\!.@N
+.\}
+..
+.
+.de @N \" --- set no fill mode in the top-level diversion
+.ie "\\n(.z"" .nf
+.el \!.@N
+..
+.
+.de )f \" *** end footnote
+.ie "\\n(.z"|f" \
+\{\
+. if \\n* .nr $f +1
+. nr * 0
+. in 0
+. da
+. ev
+. if \\n(_w<\\n(dl \
+. nr _w \\n(dl \" compute maximum fn width
+. nr _b +\\n(dn
+. ch @f -\\n(_bu
+. if \\n(.p-\\n(_b<=\\n(nl \
+. ch @f \\n(nlu+\n(.Vu
+. nr dn \\n(_D
+. rr _D
+.\}
+.el \
+\{\
+. br
+\!.)f
+. ev
+.\}
+..
+.
+.@R ff
+.if \n(ff<=0 \
+. nr ff 1 \" footnote font: Times Roman
+.@R fp
+.if \n(fp<=0 \
+. nr fp 8 \" footnote pointsize
+.
+.de $s \" $$$ footnote separator
+.nr __ 2i
+.if \\n($lu<\\n(__u .nr __ \\n($lu
+\l'\\n(__u'
+.rr __
+..
+.
+.
+.\" *** DELAYED TEXT ***
+.
+.
+.de (d \" *** begin delayed text
+.am |d )d
+.sp \\n(bsu
+.vs \\n(.sp*\\n(dvu/100u
+..
+.
+.de )d \" *** end delayed text
+.vs \\n(.sp*\\n(tvu/100u
+.nr $d +1
+..
+.
+.de pd \" *** print delayed text
+.|d
+.rm |d
+.nr $d 1
+..
+.
+.
+.\" *** INDEXES (TABLE OF CONTENTS) ***
+.
+.
+.nr _x 0 1
+.do nr _xn 0
+.af _x a
+.
+.de (x \" *** begin index entry
+.if \n@>4 .tm >> (x, .z=\\n(.z
+.ds |X x
+.if \\n(.$>0 \
+. ds |X \\$1
+.ie "\\n(.z"" \
+. nr _z 0
+.el \
+. nr _z 1
+.@\\n(_z
+..
+.
+.de @0 \" --- finish (x if no current diversion
+.am %\\*(|X )x
+.sp \\n(xsu
+.ti -\\n(piu
+..
+.
+.de @1 \" --- finish (x if current diversion
+.if "\\n(_x"z" .nr _x 0
+.de =\\n+(_x )x
+..
+.
+.de )x \" *** end index entry
+.if \n@>4 .tm >> )x, .z=\\n(.z
+.ie "\\n(.z"" \
+\{\
+. ds |x \\n%
+. if \\n(.$>0 \
+. ds |x \\$1
+. if "\\*(|x"_" \
+. ig ..
+. am %\\*(|X ..
+. if \w"\\$2">(\\n(.l-\\n(.i-\\n(.k) \
+. ti +\\n(xuu
+\\\\a\\\\t\\$2\\*(|x
+...
+. rm |x
+. rm |X
+.\}
+.el \
+\{\
+\!.(x \\*(|X
+\!\\\\*(=\\n(_x\\\\
+\!.)x \\$1 \\$2
+\!.rm =\\n(_x
+.\}
+..
+.
+.de xp \" *** print the index
+.br
+.@C 2
+.ls 1
+.vs \\n(.sp*\\n(dvu/100u
+.fi
+.in +\\n(piu
+.ds |X x
+.if \\n(.$>0 \
+. ds |X \\$1
+.xl -(\\n(xuu+\w'...'u)
+.di |x
+.%\\*(|X
+.br
+.di
+.rm %\\*(|X
+.xl \\n($lu
+.rm |X
+.ev
+.nf
+.in 0
+.ta \\n(.lu-\\n(xuuR \\n(.luR
+.|x
+.fi
+.in
+.rm |x
+..
+.
+.
+.\" *** HTML VERSIONS OF .x(, .x), AND .xp ***
+.
+.
+.do de1 (x-html \" --- create TAG and divert text
+.nr _x +1
+.nr _xn +1
+.TAG "_x\\n[_x]
+.br
+.di |x\\n[_xn]
+.br
+..
+.
+.do de1 )x-html \" --- end diversion
+.br
+.di
+..
+.
+.do de1 xp-html \" --- create list of links
+.nr _xx 1
+.br
+.ev xp-html-ev
+.sp
+.ULS
+.while \\n[_xx]<=\\n[_xn] \
+\{\
+. br
+. unformat |x\\n[_xx]
+. di xp-html-div
+. br
+. ll 100i
+. fi
+. |x\\n[_xx]
+. br
+. di
+. asciify xp-html-div
+. rm xp-html-as
+. as xp-html-as #
+. as xp-html-as _x\\n[_xx]
+. ll
+. LI
+. URL \\*[xp-html-as] "\\*[xp-html-div]
+. rm xp-html-as
+. nr _xx +1
+.\}
+.ULE
+.sp
+.ev
+..
+.
+.if '\*(.T'html' \
+\{\
+. rm (x
+. do als (x (x-html
+. rm )x
+. do als )x )x-html
+. rm xp
+. do als xp xp-html
+.\}
+.
+.
+.\" *** CHAPTERS AND TITLES ***
+.
+.
+.de +c \" *** begin chapter
+.ep\" \" force out footnotes
+.if \\n(?o:\\n(?a \
+\{\
+. bp \" force out a table or more footnote
+. rs
+. ep
+.\}
+.nr ?C 1
+.nr $f 1
+.if \\n(?R \
+. pn 1
+.bp
+.in \\n($iu \" reset the indent
+.rs
+.ie \\n(.$ \
+. $c "\\$1"
+.el \
+. sp 3
+..
+.
+.de ++ \" *** declare chapter type
+.nr _0 0
+.if "\\$1"C" \
+. nr _0 1 \" chapter
+.if "\\$1"RC" \
+. nr _0 11 \" renumbered chapter
+.if "\\$1"A" \
+. nr _0 2 \" appendix
+.if "\\$1"RA" \
+. nr _0 12 \" renumbered appendix
+.if "\\$1"P" \
+. nr _0 3 \" preliminary material
+.if "\\$1"B" \
+. nr _0 4 \" bibliographic material
+.if "\\$1"AB" \
+. nr _0 5 \" abstract
+.if \\n(_0=0 \
+. do @err invalid segment type to '++': '\\$1'
+.nr ?R 0
+.if \\n(_0>10 \
+\{\
+. nr ?R 1
+. nr _0 -10
+.\}
+.nr ch 0 1
+.if (\\n(_0=3):(\\n(_0=5) \
+. pn 1 \" must do before .ep
+.if !\\n(_0=\\n(_M .if \\n(_M=3 \
+. pn 1 \" must do before .ep
+.ep\" \" end page for correct page number types
+.if \\n(_0=1 \
+\{\
+. af ch 1
+. af % 1
+.\}
+.if \\n(_0=2 \
+\{\
+. af ch A
+. af % 1
+.\}
+.if \\n(_0=3 \
+. af % i
+.if \\n(_0=4 \
+. af % 1
+.if \\n(_0=5 \
+. af % 1
+.if \\n(.$>1 \
+. he \\$2
+.nr _M \\n(_0
+.rr _0
+..
+.
+.de $c \" $$$ print chapter title
+.sz 12
+.ft 3
+.ce 1000
+.if \\n(_M<3 \
+. nr ch +1
+.ie \\n(_M=1 \\*(wc\~\\n(ch
+.el .if \\n(_M=2 \\*(wa\~\\n(ch
+.if \w"\\$1" .sp 3-\\n(.L
+.if \w"\\$1" \\$1
+.if (\\n(_M<3):(\w"\\$1") \
+. sp 4-\\n(.L
+.ce 0
+.ft
+.sz
+.ie \\n(_M=1 \
+. $C "\\*(wc" \\n(ch "\\$1"
+.el .if \\n(_M=2 \
+. $C "\\*(wa" \\n(ch "\\$1"
+..
+.
+.de tp \" *** title page
+.hx
+.bp
+.br
+.rs
+.pn \\n%
+..
+.
+.\" *** DATE AND LOCALIZATION ***
+.ds wa Appendix\"
+.ds wc Chapter\"
+.do ds _mo1 January\"
+.do ds _mo2 February\"
+.do ds _mo3 March\"
+.do ds _mo4 April\"
+.do ds _mo5 May\"
+.do ds _mo6 June\"
+.do ds _mo7 July\"
+.do ds _mo8 August\"
+.do ds _mo9 September\"
+.do ds _mo10 October\"
+.do ds _mo11 November\"
+.do ds _mo12 December\"
+.do ds _dw1 Sunday\"
+.do ds _dw2 Monday\"
+.do ds _dw3 Tuesday\"
+.do ds _dw4 Wednesday\"
+.do ds _dw5 Thursday\"
+.do ds _dw6 Friday\"
+.do ds _dw7 Saturday\"
+.do ds _td_format \\*(mo \\n(dy, \\n(y4\"
+.
+.de ld \" *** (re-)initialize date and localization
+.\" Work around troff `yr` register's y2k problem.
+.nr y2 \\n(yr%100
+.af y2 00
+.nr y4 \\n(yr+1900
+.
+.do ds dw \\*[_dw\\n(dw]
+.do ds mo \\*[_mo\\n(mo]
+.do ds td \\*[_td_format]
+.
+.\" Set package default hyphenation mode, but override it with groff's
+.\" localized value if available.
+.hy 6
+.do if r \\*[locale]*hyphenation-mode-trap \
+. do hy \\n[\\*[locale]*hyphenation-mode-trap]
+..
+.
+.ld
+.
+.\" *** PARAMETRIC INITIALIZATIONS ***
+.
+.
+.\" In groff 1.23, we keep $v and $V to maintain 30 years of continuity,
+.\" but expose new names `tv` and `dv`, respectively, making it more
+.\" obvious that user alteration of these register values is supported.
+.\" See discussion of `$R` and `$r` below.
+.nr tv \n(.v00+\n(.sp-1/\n(.sp \" vs as % of ps for .sz request
+.nr dv \n(tv \" same for displays & footnotes
+.do aln $v tv
+.do aln $V dv
+.nr hm 4v \" header margin
+.nr tm 7v \" top margin
+.nr bm 6v \" bottom margin
+.nr fm 3v \" footer margin
+.nr tf 3 \" title font: (real) Times Bold
+.nr tp 10 \" title point size
+.nr bi 4m \" indent for blocks
+.nr pi 5n \" indent for paragraphs
+.nr pf 1 \" normal text font
+.nr pp 10 \" normal text point size
+.nr qi 4n \" indent for quotes
+.nr qp -1 \" down one point
+.nr ii 5n \" indent for .ip's and .np's
+.nr $m 1 \" max number of columns
+.nr $s 4n \" column separation
+.nr sf 3 \" section font -- Times Bold
+.nr sp 10 \" section title pointsize
+.nr ss 12p \" section prespacing
+.nr si 0 \" section indent
+.nr sx 0.2m \" super/subscript x-height adjustment
+.nr no \w'0000'u \" offset for line numbers
+.
+.@R 0x\" set by GNU pic to _disable_ \x in super/scripting
+.
+.\" *** OTHER INITIALIZATION ***
+.
+.\" Define strings for super- and subscripting. groff me does not
+.\" bother with half-line motions in nroff mode, since we have no output
+.\" driver (for that mode) that supports them; consequently we don't
+.\" emit \x escape sequences in that case either. If someone implements
+.\" a Model 37 or line printer emulator we can target, this decision
+.\" could be revisited.
+.\"
+.\" Adjust the line height with \x if the `0x` register is zero (a
+.\" pic(1) convention) by the amount in `sx` (a groff 1.23 extension).
+.ie t \
+\{\
+.ds { \v'-0.4m'\x'\\n(0x=0*-1u*\\n(sxu'\s-3
+.ds } \s+3\v'0.4m'
+.\}
+.el \
+\{\
+.ds { [\"
+.ds } ]\"
+.\}
+.\" for compatibility with traditional -me
+.\" (the first will work only in compatibility mode)
+.ds [ \*{
+.ds ] \*}
+.ds @< <\"
+.ds @> >\"
+.if \n(.g \
+\{\
+.do if c \(la .ds @< \(la\"
+.do if c \(ra .ds @> \(ra\"
+.\}
+.ie t \
+\{\
+.ds < \v'0.4m'\x'\\n(0x=0*\\n(sxu'\s-3
+.ds > \s+3\v'-0.4m'
+.\}
+.el \
+\{\
+.ds < \*(@<
+.ds > \*(@>
+.\}
+.ds - \(em
+.\" Avoid warnings from groff -ww.
+.@S |0
+.@S |1
+.@S |2
+.@S |3
+.@S $C
+.@S $H
+.@S $0
+.@S $1
+.@S $2
+.@S $3
+.@S $4
+.@S $5
+.@S $6
+.@S $7
+.@S $8
+.@S $9
+.@S ..
+.
+.@R po\" \" simulated page offset
+.@R $0\" \" section depth
+.@R $1\" \" section numbers a.b.c.d.e.f
+.@R $2\"
+.@R $3\"
+.@R $4\"
+.@R $5\"
+.@R $6\"
+.@R $i\" \" paragraph base indent
+.@R $p\" \" numbered paragraph number
+.\" [Before groff 1.06] 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 [groff 1.06], 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 the BSD -me macros and a
+.\" low resolution device is not being used, then an appropriate value
+.\" for the $v or $V register is derived from the $r or $R register.
+.\"
+.\" Thirty years later, we rename `$v` to `tv` and `$V` to `dv`.
+.@R $r\" \" ratio of vs to ps (may override tv)
+.@R $R\" \" same for displays (may override dv)
+.@R df\" \" display font: same as surrounding text
+.@R so\" \" additional section title offset
+.@R fu\" \" footnote undent
+.@R bt\" \" block keep threshold
+.@R *\" \" has \** been referenced?
+.@R ?a\" \" pending floating keep at page top?
+.@R ?b\" \" pending floating keep at page bottom?
+.@R ?C\" \" at chapter header?
+.@R ?e\" \" in equation?
+.@R ?f\" \" inside footnote?
+.@R _f\" \" column count of previous footnote
+.@R ?H\" \" suppress headers and footers next page?
+.@R ?I\" \" has the header trap been sprung?
+.@R ?N\" \" numbering with shorter line length?
+.@R ?n\" \" n1 mode?
+.@R ?o\" \" footnote overflow?
+.@R ?R\" \" renumbered chapter?
+.@R ?s\" \" skip next page?
+.@R ?T\" \" inside .TS H?
+.@R ?W\" \" wide floating keep at page bottom?
+.@R ?w\" \" wide floating keep at page top?
+.
+.nr fi 0.3i
+.nr _o \n(.o
+.nr $b 3 \" bold
+.nr ps 0.35v
+.if \n(ps<\n(.V .nr ps \n(.V
+.nr bs \n(ps \" block pre/post spacing
+.nr qs \n(ps \" quote pre/post spacing
+.nr zs 1v \" float-block pre/postspacing
+.nr xs 0.2v \" index prespacing
+.nr xu 0.5i \" index undent
+.nr fs 0.2v \" footnote prespacing
+.nr es 0.5v \" equation pre/postspacing
+.if \n(es<\n(.V .nr es \n(.V
+.wh 0 @h \" set header
+.nr $l \n(.lu \" line length (of column)
+.nr _L \n(.lu \" line length of page
+.nr $c 1 \" current column number
+.nr $f 1 \" footnote number
+.ds * \\*{\\n($f\\*}\k*\" \" footnote mark
+.nr $d 1 \" delayed text number
+.ds # [\\n($d]\" \" delayed text mark
+.nr _M 1 \" encoded document segment type
+.ds lq \(lq\" \" left quote
+.ds rq \(rq\" \" right quote
+.em @z
+.
+.\" Set line length and get .lt side effect.
+.if t .ll \n(_Lu
+.if n .ll 6.0i
+.
+.\" *** FOREIGN LETTERS AND SPECIAL CHARACTERS ***
+.
+.
+.ds #h ((1u-(\\\\n(.fu%2u))*0.13m)
+.ds #v 0.6m
+.
+.\" \" accents
+.ds ' \h'0'\k_\h'-(\\n(.wu*8/10-\*(#h)'\(aa\h'|\\n_u'
+.ds ` \h'0'\k_\h'-(\\n(.wu*7/10-\*(#h)'\(ga\h'|\\n_u'
+.
+.\" \" umlaut
+.ds : \h'0'\k_\h'-(\\n(.wu*8/10-\*(#h+0.1m)'\v'-\*(#v'\z.\h'0.2m'.\h'|\\n_u'\v'\*(#v'
+.
+.\" \" circumflex and tilde
+.ds ^ \h'0'\k_\h'-(\\n(.wu-\*(#h-0.05m)'^\h'|\\n_u'
+.ds ~ \h'0'\k_\h'-(\\n(.wu-\*(#h-0.05m)'~\h'|\\n_u'
+.
+.\" \" cedilla and czech
+.ds , \h'0'\k_\h'-(\\n(.wu)',\h'|\\n_u'
+.ds v \h'0'\k_\h'-(\\n(.wu*9/10-\*(#h)'\v'-\*(#v'\s-4v\s0\v'\*(#v'\h'|\\n_u'
+.
+.\" \" Norwegian A or angstrom
+.ds o \h'0'\k_\h'-(\\n(.wu+\w'\(de'u-\*(#h)/2u'\v'-0.4n'\z\(de\v'0.4n'\h'|\\n_u'
+.
+.\" \" there exists, for all
+.ds qe \s-2\v'0.45m'\z\(em\v'-0.625m'\z\(em\v'-0.625m'\(em\v'0.8m'\s0\h'-0.1m'\v'-0.05m'\(br\v'0.05m'\h'0.1m'
+.ds qa \z\e\h'0.35m'\z\(sl\h'-0.33m'\v'-0.3m'\s-4\(em\s0\v'0.3m'\h'0.15m'
+.rm #h #v
+.
+.de @U
+.do @err the '\\$1' macro is not supported by this version of 'me'
+..
+.
+.de lo
+.@U lo
+..
+.
+.de th
+.@U th
+..
+.
+.de ac
+.@U ac
+..
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=nroff textwidth=72:
diff --git a/tmac/ec.tmac b/tmac/ec.tmac
new file mode 100644
index 0000000..9f04a13
--- /dev/null
+++ b/tmac/ec.tmac
@@ -0,0 +1,71 @@
+.\" Switch to EC fonts.
+.\"
+.\" Load this file before any language-specific stuff.
+.\"
+.\" hcode values are not handled.
+.\"
+.
+.do nr *groff_ec_tmac_C \n[.cp]
+.cp 0
+.
+.ftr TR TREC
+.ftr TI TIEC
+.ftr TB TBEC
+.ftr TBI TBIEC
+.
+.ftr HR HREC
+.ftr HI HIEC
+.ftr HB HBEC
+.ftr HBI HBIEC
+.
+.ftr CW CWEC
+.ftr CWI CWIEC
+.
+.ftr CR CWEC
+.ftr C CWEC
+.ftr CO CWIEC
+.ftr CI CWIEC
+.ftr CB CWEC
+.ftr CBI CWIEC
+.ftr TT CWEC
+.ftr H HREC
+.
+.special MI S
+.fspecial TREC TRTC TR
+.fspecial TIEC TITC TI
+.fspecial TBEC TBTC TB
+.fspecial TBIEC TBITC TBI
+.fspecial HREC HRTC HR
+.fspecial HIEC HITC HI
+.fspecial HBEC HBTC HB
+.fspecial HBIEC HBIEC HBI
+.fspecial CWEC CWTC SC CW
+.fspecial CWIEC CWITC SC CWI
+.
+.\" remove definitions of glyphs which are in TC fonts
+.rchar \[co] \[rg]
+.rchar \[ct]
+.rchar \[tm]
+.rchar \[f/]
+.rchar \[S1] \[S2] \[S3]
+.rchar \[Of] \[Om]
+.rchar \[Cs]
+.rchar \[de]
+.
+.\" \[pl] and \[eq] must be roman
+.char \[pl] \f[TREC]+
+.char \[eq] \f[TREC]=
+.
+.schar \[nm] \o'\f[TREC]/\[mo]'
+.
+.\" an ID register
+.nr ECFONTS 1
+.
+.cp \n[*groff_ec_tmac_C]
+.do rr *groff_ec_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/en.tmac b/tmac/en.tmac
new file mode 100644
index 0000000..441ca29
--- /dev/null
+++ b/tmac/en.tmac
@@ -0,0 +1,77 @@
+.\" English localization for groff
+.\"
+.\" Copyright (C) 2021-2022 Free Software Foundation, Inc.
+.\" Written by G. Branden Robinson <g.branden.robinson.@gmail.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 3 of the License, 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 this program. If not, see
+.\" <http://www.gnu.org/licenses/>.
+.\"
+.\" Please send comments to groff@gnu.org.
+.
+.do nr *groff_en_tmac_C \n[.cp]
+.cp 0
+.
+.
+.\" If changing from an existing locale, we need to preserve the state
+.\" of the "suppress hyphenation before a page location trap" bit.
+.nr locale*use-trap-hyphenation-mode 0
+.if d locale \
+. if \n[.hy]=\n[\*[locale]*hyphenation-mode-trap] \
+. nr locale*use-trap-hyphenation-mode 1
+.
+.
+.ds locale english\"
+.
+.ss 12
+.
+.\" Set up hyphenation.
+.
+.\" English hyphenation (\lefthyphenmin=2, \righthyphenmin=3)
+.nr \*[locale]*hyphenation-mode-base 4
+.nr \*[locale]*hyphenation-mode-trap 6
+.
+.ie \n[locale*use-trap-hyphenation-mode] \
+. hy \n[\*[locale]*hyphenation-mode-trap]
+.el \
+. hy \n[\*[locale]*hyphenation-mode-base]
+.
+.rr locale*use-trap-hyphenation-mode
+.
+.hla en
+.hpf hyphen.en
+.hpfa hyphenex.en
+.
+.
+.\" man package
+.if d an \
+. an*reset-hyphenation-mode
+.
+.
+.\" me package
+.if d @R \{\
+. ds _td_format \\*(mo \\n(dy, \\n(y4\"
+. ld
+.\}
+.
+.
+.cp \n[*groff_en_tmac_C]
+.do rr *groff_en_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/eqnrc b/tmac/eqnrc
new file mode 100644
index 0000000..84f8cf9
--- /dev/null
+++ b/tmac/eqnrc
@@ -0,0 +1,67 @@
+.\" -*- nroff -*-
+.\"
+.\" Startup file for eqn.
+.do if !d EQ .ds EQ
+.do if !d EN .ds EN
+.EQ
+sdefine << %{ < back 20 < }%
+sdefine >> %{ > back 20 > }%
+
+sdefine dot %accent "\fR\(a.\fP"%
+sdefine dotdot %accent "\fR\(ad\fP"%
+sdefine vec %accent {up 52 "\s[\En[.s]/2u]\(->\s0"}%
+sdefine dyad %accent {up 52 "\s[\En[.s]/2u]\(<>\s0"}%
+
+sdefine cdot %type "binary" \(md%
+
+ifdef X75 ! define X %1% !
+ifdef X100 ! define X %1% !
+ifdef X75-12 ! define X %1% !
+ifdef X100-12 ! define X %1% !
+
+ifdef ps ! define ps|X|html %1% !
+ifdef X ! define ps|X|html %1% !
+ifdef html ! define ps|X|html %1% !
+
+ifdef ps|X|html ! sdefine inf %"\s[\En[.s]*13u/10u]\v'12M'\(if\v'-12M'\s0"% !
+
+ifdef dvi !
+sdefine int %{type "operator" vcenter \[integral]}%
+sdefine sum %{type "operator" vcenter \[sum]}%
+sdefine prod %{type "operator" vcenter \[product]}%
+sdefine coprod %{type "operator" vcenter \[coproduct]}%
+set num1 68
+set num2 39
+set denom1 69
+set denom2 34
+set sup1 41
+set sup2 36
+set sup3 29
+set sup_drop 39
+set sub_drop 5
+set axis_height 25
+set x_height 43
+set default_rule_thickness 4
+set big_op_spacing1 11
+set big_op_spacing2 16
+set big_op_spacing3 20
+set big_op_spacing4 60
+set big_op_spacing5 10
+!
+
+ifdef X ! set axis_height 32 !
+
+ifdef ps|X|html ! set draw_lines 1 !
+
+ifdef ascii ! define n %1% !
+ifdef latin1 ! define n %1% !
+ifdef utf8 ! define n %1% !
+ifdef cp1047 ! define n %1% !
+ifdef n !
+set nroff 1
+!
+
+undef X
+undef ps|X|html
+undef n
+.EN
diff --git a/tmac/europs.tmac b/tmac/europs.tmac
new file mode 100644
index 0000000..c9236ac
--- /dev/null
+++ b/tmac/europs.tmac
@@ -0,0 +1,44 @@
+.\" -*- nroff -*-
+.\"
+.\" europs.tmac
+.
+.do char \[eu] \f[EURO]\N'0'
+.
+.do if F AB .do fschar AB \[Eu] \f[EURO]\N'1'
+.do if F ABI .do fschar ABI \[Eu] \f[EURO]\N'3'
+.do if F AI .do fschar AI \[Eu] \f[EURO]\N'2'
+.do if F AR .do fschar AR \[Eu] \f[EURO]\N'0'
+.do if F BMB .do fschar BMB \[Eu] \f[EURO]\N'5'
+.do if F BMBI .do fschar BMBI \[Eu] \f[EURO]\N'7'
+.do if F BMI .do fschar BMI \[Eu] \f[EURO]\N'6'
+.do if F BMR .do fschar BMR \[Eu] \f[EURO]\N'4'
+.do if F CB .do fschar CB \[Eu] \f[EURO]\N'13'
+.do if F CBI .do fschar CBI \[Eu] \f[EURO]\N'15'
+.do if F CI .do fschar CI \[Eu] \f[EURO]\N'14'
+.do if F CR .do fschar CR \[Eu] \f[EURO]\N'12'
+.do if F HB .do fschar HB \[Eu] \f[EURO]\N'9'
+.do if F HBI .do fschar HBI \[Eu] \f[EURO]\N'11'
+.do if F HI .do fschar HI \[Eu] \f[EURO]\N'10'
+.do if F HR .do fschar HR \[Eu] \f[EURO]\N'8'
+.do if F HNB .do fschar HNB \[Eu] \f[EURO]\N'9'
+.do if F HNBI .do fschar HNBI \[Eu] \f[EURO]\N'11'
+.do if F HNI .do fschar HNI \[Eu] \f[EURO]\N'10'
+.do if F HNR .do fschar HNR \[Eu] \f[EURO]\N'8'
+.do if F NB .do fschar NB \[Eu] \f[EURO]\N'5'
+.do if F NBI .do fschar NBI \[Eu] \f[EURO]\N'7'
+.do if F NI .do fschar NI \[Eu] \f[EURO]\N'6'
+.do if F NR .do fschar NR \[Eu] \f[EURO]\N'4'
+.do if F PB .do fschar PB \[Eu] \f[EURO]\N'5'
+.do if F PBI .do fschar PBI \[Eu] \f[EURO]\N'7'
+.do if F PI .do fschar PI \[Eu] \f[EURO]\N'6'
+.do if F PR .do fschar PR \[Eu] \f[EURO]\N'4'
+.do if F TB .do fschar TB \[Eu] \f[EURO]\N'5'
+.do if F TBI .do fschar TBI \[Eu] \f[EURO]\N'7'
+.do if F TI .do fschar TI \[Eu] \f[EURO]\N'6'
+.do if F TR .do fschar TR \[Eu] \f[EURO]\N'4'
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/fallbacks.tmac b/tmac/fallbacks.tmac
new file mode 100644
index 0000000..162e57e
--- /dev/null
+++ b/tmac/fallbacks.tmac
@@ -0,0 +1,214 @@
+.\" Define device-independent fallbacks for unavailable glyphs.
+.\"
+.\" These are designed such that "troffrc" loads them early, after
+.\" composite glyph setup but before any device-specific fallbacks.
+.\" Macro files specific to an output device can therefore override the
+.\" definitions below as necessary.
+.
+.do nr *groff_fallbacks_tmac_C \n[.cp]
+.cp 0
+.
+.\" The early loading observation above also means that the conditional
+.\" expressions 'n' and 't' are not reliable. Define ersatz substitute.
+.nr fallbacks*troff-mode 1
+.if '\*[.T]'ascii' .nr fallbacks*troff-mode 0
+.if '\*[.T]'cp1047' .nr fallbacks*troff-mode 0
+.if '\*[.T]'latin1' .nr fallbacks*troff-mode 0
+.if '\*[.T]'utf8' .nr fallbacks*troff-mode 0
+.
+.\" MODIFIER LETTER CIRCUMFLEX ACCENT -> CIRCUMFLEX ACCENT
+.fchar \[u02C6] ^
+.\" SMALL TILDE -> TILDE
+.fchar \[u02DC] ~
+.\" INCREMENT -> GREEK CAPITAL LETTER DELTA
+.fchar \[u2206] \[u0394]
+.
+.
+.\" NB: as per http://unicode.org/Public/UNIDATA/NamesList.txt
+.\"
+.\" #!/usr/bin/perl
+.\" ## Ivan Shmakov, 2012.
+.\" ## This code is in the public-domain.
+.\" my $u;
+.\" while (<>) {
+.\" $u = oct ("0x" . $1)
+.\" if (/^([[:xdigit:]]{4})/);
+.\" next unless (defined ($u) && $u >= 0x2160 && $u <= 0x217F);
+.\" if (/^\s+#\s+([[:xdigit:][:blank:]]+)(\s.*)?$/) {
+.\" ## NB: may make sense to map to \[uXXXX]'s instead
+.\" printf (".fchar \\[u%04x] %s\n", $u,
+.\" pack ("U*", map { oct ("0x" . $_); } split (/ /, $1)));
+.\" $u = undef;
+.\" }
+.\" }
+.
+.fchar \[u2160] I
+.fchar \[u2161] II
+.fchar \[u2162] III
+.fchar \[u2163] IV
+.fchar \[u2164] V
+.fchar \[u2165] VI
+.fchar \[u2166] VII
+.fchar \[u2167] VIII
+.fchar \[u2168] IX
+.fchar \[u2169] X
+.fchar \[u216a] XI
+.fchar \[u216b] XII
+.fchar \[u216c] L
+.fchar \[u216d] C
+.fchar \[u216e] D
+.fchar \[u216f] M
+.fchar \[u2170] i
+.fchar \[u2171] ii
+.fchar \[u2172] iii
+.fchar \[u2173] iv
+.fchar \[u2174] v
+.fchar \[u2175] vi
+.fchar \[u2176] vii
+.fchar \[u2177] viii
+.fchar \[u2178] ix
+.fchar \[u2179] x
+.fchar \[u217a] xi
+.fchar \[u217b] xii
+.fchar \[u217c] l
+.fchar \[u217d] c
+.fchar \[u217e] d
+.fchar \[u217f] m
+.
+.\" Fonts often lack precomposed glyphs for accented Latin letters that
+.\" were not defined in ISO 8859-1 (Latin-1).
+.\"
+.\" Some of these can be ugly; on typesetter devices, much depends on
+.\" the design of the fonts used.
+.\"
+.\" groff defines no dot-above accent so we cannot construct some
+.\" composite glyphs in this way. Turkish is an especial challenge
+.\" because dotting an I (or not) results in a different base glyph.
+.\" In any case, dotless 'i' base glyphs are rare in old fonts.
+.\"
+.\" Latin-2 fallbacks
+.fchar \[A ab] \z\[ab]A
+.fchar \[A ho] \z\[ho]A
+.fchar \[C aa] \z\[aa]C
+.fchar \[C ah] \z\[ah]C
+.fchar \[D ah] \z\[ah]D
+.fchar \[u110] \z-D\" capital letter d with stroke
+.fchar \[E ah] \z\[ah]E
+.fchar \[E ho] \z\[ho]E
+.fchar \[/L] \z/L
+.fchar \[L aa] \z\[aa]L
+.fchar \[L ho] \z\[ho]L
+.fchar \[N aa] \z\[aa]N
+.fchar \[N ah] \z\[ah]N
+.fchar \[O a"] \z\[a"]O
+.fchar \[R aa] \z\[aa]R
+.fchar \[R ah] \z\[ah]R
+.fchar \[S aa] \z\[aa]S
+.fchar \[S ac] \z\[ac]S
+.fchar \[vS] \z\[ah]S
+.fchar \[T ac] \z\[ac]T
+.fchar \[T ah] \z\[ah]T
+.fchar \[U ao] \z\[ao]U
+.fchar \[U a"] \z\[a"]U
+.fchar \[Z aa] \z\[aa]Z
+.fchar \[Z a.] \z\[a.]Z
+.fchar \[vZ] \z\[ah]Z
+.
+.fchar \[a ab] \z\[ab]a
+.fchar \[a ho] \z\[ho]a
+.fchar \[c aa] \z\[aa]c
+.fchar \[c ah] \z\[ah]c
+.fchar \[d ah] \z\[ah]d
+.fchar \[u110] \z-d\" small letter d with stroke
+.fchar \[e ah] \z\[ah]e
+.fchar \[e ho] \z\[ho]e
+.fchar \[/l] \z/l
+.fchar \[l aa] \z\[aa]l
+.fchar \[l ho] \z\[ho]l
+.fchar \[n aa] \z\[aa]n
+.fchar \[n ah] \z\[ah]n
+.fchar \[o a"] \z\[a"]o
+.fchar \[r aa] \z\[aa]r
+.fchar \[r ah] \z\[ah]r
+.fchar \[s aa] \z\[aa]s
+.fchar \[s ac] \z\[ac]s
+.fchar \[vs] \z\[ah]s
+.fchar \[t ac] \z\[ac]t
+.fchar \[t ah] \z\[ah]t
+.fchar \[u ao] \z\[ao]u
+.fchar \[u a"] \z\[a"]u
+.fchar \[z aa] \z\[aa]z
+.fchar \[z a.] \z\[a.]z
+.fchar \[vz] \z\[ah]z
+.
+.\" Latin-5 fallbacks
+.fchar \[G ab] \z\[ab]G
+.fchar \[g ab] \z\[ab]g
+.
+.\" Latin-9 fallbacks
+.fchar \[OE] OE
+.fchar \[oe] oe
+.fchar \[:Y] \z\[ad]Y
+.
+.fchar \[u2000] \[u2002]\" en quad
+.fchar \[u2001] \[u2003]\" em quad
+.fchar \[u2002] \h'1/2u'\" en space
+.fchar \[u2003] \h'1'\" em space
+.fchar \[u2004] \h'1/3u'\" three-per-em space
+.fchar \[u2005] \h'1/4u'\" four-per-em space
+.fchar \[u2006] \h'1/6u'\" six-per-em space
+.fchar \[u2007] \0\" figure space
+.fchar \[u2008] \^\" punctuation space
+.fchar \[u2009] \|\" thin space
+.fchar \[u200A] \^\" hair space
+.\" Mapping U+200B awaits resolution of Savannah #58958.
+.\"fchar \[u200B] \h'0'\" zero-width space
+.\" \[u2010] is always defined thanks to uniglyph.cpp.
+.\"fchar \[u2010] -\:\" hyphen
+.\" Mapping U+2011 awaits resolution of Savannah #63354.
+.\"fchar \[u2011] -\" non-breaking hyphen (won't break w/o .hcode or \:)
+.ie \n[fallbacks*troff-mode] \
+. fchar \[u2012] \^\v'-.3m'\l'\w"\0"u'\v'+.3m'\^\" figure dash
+.el \
+. fchar \[u2012] \-
+.fchar \[u2013] \[en]\" en dash
+.fchar \[u2014] \[em]\" em dash
+.fchar \[u2015] \[em]\" horizontal bar (quotation dash)
+.fchar \[u2016] \[ba]\[ba]\" double vertical line (matrix norm)
+.if \n[fallbacks*troff-mode] \
+. fchar \[u2017] \Z'\[ul]'\v'+.1m'\[ul]\v'-.1m'\" double low line
+.\" Mapping U+201[89CD] awaits resolution of Savannah #59932.
+.\"fchar \[u2018] \[oq]\" left single quotation mark
+.\"fchar \[u2019] \[cq]\" right single quotation mark
+.\"fchar \[u201C] \[lq]\" left double quotation mark
+.\"fchar \[u201D] \[rq]\" right double quotation mark
+.\" XXX: The next two are troublesome; see Savannah #63332.
+.\"fchar \[u2020] \[dg]\" dagger
+.\"fchar \[u2021] \[dd]\" double dagger
+.fchar \[u2022] \[bu]\" bullet
+.fchar \[u2024] .\" one dot leader
+.fchar \[u2025] .\|.\" two dot leader
+.fchar \[u2026] .\|.\|.\" horizontal ellipsis
+.fchar \[u2027] \[pc]\" hyphenation point
+.\"fchar \[u2030] \[%0]\" per mille sign \" Savannah #63332 again
+.fchar \[u2032] \[fm]\" prime
+.fchar \[u2033] \[sd]\" double prime
+.fchar \[u2039] \[fo]\" left single chevron
+.fchar \[u203A] \[fc]\" right single chevron
+.if \n[fallbacks*troff-mode] \
+. fchar \[u203D] \o'?!'\" interrobang
+.\"fchar \[u203E] \[rn]\" overline \" Savannah #63332 again
+.fchar \[u2044] \[f/]\" fraction slash
+.fchar \[u2052] %\" commercial minus sign
+.fchar \[u2053] \[ti]\" swung dash
+.
+.rr fallbacks*troff-mode
+.
+.cp \n[*groff_fallbacks_tmac_C]
+.do rr *groff_fallbacks_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/fixmacros.sed b/tmac/fixmacros.sed
new file mode 100644
index 0000000..56caf9f
--- /dev/null
+++ b/tmac/fixmacros.sed
@@ -0,0 +1,7 @@
+# try to fix macros for AT&T troff so that they work without groff's -C switch
+s/^\([.'][ ]*[^\\ ][^ \\]\)\([^ ]\)/\1 \2/
+s/^\(\\![.'][ ]*[^\\ ][^ \\]\)\([^ ]\)/\1 \2/
+s/\([.'][ ]*i[ef] *[^ ]* [.'][ ]*[^\\0-9 ][^ \\]\)\([^ ]\)/\1 \2/
+s/\([.'][ ]*i[ef] *[^ ]* \\{[.'][ ]*[^\\0-9 ][^ \\]\)\([^ ]\)/\1 \2/
+s/\([.'][ ]*[da]s *[^ \\][^ \\]\)\([^ ]\)/\1 \2/
+s/\\\*\[/\\*[[]/
diff --git a/tmac/fr.tmac b/tmac/fr.tmac
new file mode 100644
index 0000000..c4719d1
--- /dev/null
+++ b/tmac/fr.tmac
@@ -0,0 +1,213 @@
+.\" French localization for groff
+.\"
+.\" Copyright (C) 2006-2022 Free Software Foundation, Inc.
+.\" Written by Fabrice Ménard (menard.fabrice@wanadoo.fr)
+.\"
+.\" 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 3 of the License, 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 this program. If not, see
+.\" <http://www.gnu.org/licenses/>.
+.\"
+.\" Please send comments to menard.fabrice@wanadoo.fr.
+.
+.do nr *groff_fr_tmac_C \n[.cp]
+.cp 0
+.
+.
+.\" If changing from an existing locale, we need to preserve the state
+.\" of the "suppress hyphenation before a page location trap" bit.
+.nr locale*use-trap-hyphenation-mode 0
+.if d locale \
+. if \n[.hy]=\n[\*[locale]*hyphenation-mode-trap] \
+. nr locale*use-trap-hyphenation-mode 1
+.
+.
+.ds locale french\"
+.
+.
+.\" Predefined text translations
+.
+.ds \*[locale]-abstract R\[E ']SUM\[E ']\"
+.ds \*[locale]-app ANNEXE\"
+.ds \*[locale]-appendix_string Annexe\"
+.ds \*[locale]-april Avril\"
+.ds \*[locale]-attribute_string par\"
+.ds \*[locale]-august Ao\[u ^]t\"
+.ds \*[locale]-chapter_string Chapitre\"
+.ds \*[locale]-december D\[e ']cembre\"
+.ds \*[locale]-draft_string Jet\"
+.ds \*[locale]-endnote_string NOTES\"
+.ds \*[locale]-february F\[e ']vrier\"
+.ds \*[locale]-finis_string FIN\"
+.ds \*[locale]-friday Vendredi\"
+.ds \*[locale]-january Janvier\"
+.ds \*[locale]-july Juillet\"
+.ds \*[locale]-june Juin\"
+.ds \*[locale]-le LISTE DES \[E ']QUATIONS\"
+.ds \*[locale]-letapp LU ET APPROUV\[E ']\"
+.ds \*[locale]-letat \[A `] L'ATTENTION DE:\"
+.ds \*[locale]-letcn CONFIDENTIEL\"
+.ds \*[locale]-letdate Date\"
+.ds \*[locale]-letfc Veuillez agr\[e ']er, Monsieur, mes salutations distingu\[e ']es.\"
+.ds \*[locale]-letns!0 Copie \[a `]\"
+.ds \*[locale]-letns!1 Exemplaire (avec destinataire) \[a `]\"
+.ds \*[locale]-letns!10 Exemplaire (avec destinataires) \[a `]\"
+.ds \*[locale]-letns!11 Exemplaire (sans destinataires) \[a `]\"
+.ds \*[locale]-letns!12 R\[e ']sum\[e '] \[a `]\"
+.ds \*[locale]-letns!13 Memorandum complet \[a `]\"
+.ds \*[locale]-letns!14 Cc:\"
+.ds \*[locale]-letns!2 Exemplaire (sans destinataire) \[a `]\"
+.ds \*[locale]-letns!3 Destinataire\"
+.ds \*[locale]-letns!4 Destinataires\"
+.ds \*[locale]-letns!5 Pi\[e `]ce jointe\"
+.ds \*[locale]-letns!6 Pi\[e `]ces jointes\"
+.ds \*[locale]-letns!7 Sous pli s\[e ']par\[e ']\"
+.ds \*[locale]-letns!8 Lettre \[a `]\"
+.ds \*[locale]-letns!9 Memorandum \[a `]\"
+.ds \*[locale]-letns!copy Copie \" (il faut un espace)\"
+.ds \*[locale]-letns!to " \[a `]\"
+.ds \*[locale]-letrn En r\[e ']f\[e ']rence \[a `]:\"
+.ds \*[locale]-letsa \[A `] la personne concern\[e ']e:\"
+.ds \*[locale]-letsj SUJET:\"
+.ds \*[locale]-lf LISTE DES ILLUSTRATIONS\"
+.ds \*[locale]-licon SOMMAIRE\"
+.ds \*[locale]-liec \[E ']quation\"
+.ds \*[locale]-liex Document\"
+.ds \*[locale]-lifg Illustration\"
+.ds \*[locale]-litb Tableau\"
+.ds \*[locale]-lt LISTE DES TABLEAUX\"
+.ds \*[locale]-lx LISTE DES DOCUMENTS\"
+.ds \*[locale]-man-section1 Manuel des commandes générales\"
+.ds \*[locale]-man-section2 Manuel des appels système\"
+.ds \*[locale]-man-section3 Manuel des fonctions de la bibliothèque\"
+.ds \*[locale]-man-section4 Manuel des interfaces du noyau\"
+.ds \*[locale]-man-section5 Manuel des formats de fichiers\"
+.ds \*[locale]-man-section6 Manuel des jeux\"
+.ds \*[locale]-man-section7 Manuel d'informations diverses\"
+.ds \*[locale]-man-section8 Manuel du gestionnaire de système\"
+.ds \*[locale]-man-section9 Manuel du développeur de noyau\"
+.ds \*[locale]-march Mars\"
+.ds \*[locale]-may Mai\"
+.ds \*[locale]-monday Lundi\"
+.ds \*[locale]-november Novembre\"
+.ds \*[locale]-october Octobre\"
+.ds \*[locale]-paper A4\"
+.ds \*[locale]-qrf Cf. chapitre \\*[Qrfh], page \\*[Qrfp].\"
+.ds \*[locale]-references Bibliographie\"
+.ds \*[locale]-revision_string R\[e ']v.\"
+.ds \*[locale]-rp BIBLIOGRAPHIE\"
+.ds \*[locale]-saturday Samedi\"
+.ds \*[locale]-september Septembre\"
+.ds \*[locale]-sunday Dimanche\"
+.ds \*[locale]-thursday Jeudi\"
+.ds \*[locale]-toc Table des mati\[e `]res\"
+.ds \*[locale]-toc_header_string Table des mati\[e `]res\"
+.ds \*[locale]-tuesday Mardi\"
+.ds \*[locale]-wednesday Mercredi\"
+.
+.
+.\" Activate the translations
+.
+.mso trans.tmac
+.
+.
+.\" ms package
+.if r GS \{\
+. \" update the date
+. ds DY \n[dy] \*[MO] \n[year]
+. \" set hyphenation flags
+. nr HY 6
+.\}
+.
+.
+.\" mm package
+.if d PH \{\
+. \" update the date with the new strings
+. ds cov*new-date \\n[dy] \\*[MO\\n[mo]] \\n[year]
+.
+. \" ISODATE and DT update
+. de ISODATE
+. 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 \\n[dy] \\*[MO\\n[mo]] \\n[year]
+. el \
+. ds cov*new-date \\n[year]-\\n[cov*mm]-\\n[cov*dd]
+. .
+.
+. als DT cov*new-date
+.\}
+.
+.
+.\" Default encoding
+.mso latin9.tmac
+.
+.ss 12 0
+.
+.\" Set up hyphenation.
+.
+.\" French hyphenation (\lefthyphenmin=2, \righthyphenmin=3)
+.nr \*[locale]*hyphenation-mode-base 4
+.nr \*[locale]*hyphenation-mode-trap 6
+.
+.ie \n[locale*use-trap-hyphenation-mode] \
+. hy \n[\*[locale]*hyphenation-mode-trap]
+.el \
+. hy \n[\*[locale]*hyphenation-mode-base]
+.
+.rr locale*use-trap-hyphenation-mode
+.
+.hcode à à À à
+.hcode â â Â â
+.hcode ç ç Ç ç
+.hcode è è È è
+.hcode é é É é
+.hcode ê ê Ê ê
+.hcode ë ë Ë ë
+.hcode î î Î î
+.hcode ï ï Ï ï
+.hcode ô ô Ô ô
+.hcode ù ù Ù ù
+.hcode û û Û û
+.hcode ü ü Ü ü
+.hcode ÿ ÿ ¾ ÿ
+.hcode ½ ½ ¼ ½
+.
+.hla fr
+.hpf hyphen.fr
+.
+.
+.\" man package
+.if d an \
+. an*reset-hyphenation-mode
+.
+.
+.\" me package
+.if d @R \{\
+. ds _td_format \En(dy \E*(mo \En(y4
+. ld
+.\}
+.
+.
+.cp \n[*groff_fr_tmac_C]
+.do rr *groff_fr_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" coding: latin-9
+.\" fill-column: 72
+.\" End:
+.\" vim: set fileencoding=iso-8859-15 filetype=groff textwidth=72:
diff --git a/tmac/groff_man.7.man.in b/tmac/groff_man.7.man.in
new file mode 100644
index 0000000..f98bee6
--- /dev/null
+++ b/tmac/groff_man.7.man.in
@@ -0,0 +1,4287 @@
+divert(-1)
+Note to maintainers of this document: while it is desirable to bracket
+material that differs between groff_man(7) and groff_man_style(7) as
+tightly as possible to honor the Don't Repeat Yourself principle, in
+GBR's opinion this maxim has limits.
+
+Consider this ghastly example:
+
+If no scaling unit is given,
+the
+.I man
+package assumes \(lqn\(rq\c
+_ifstyle()dnl
+; that is,
+approximately the width of the letter \(lqn\(rq in the font current when
+the macro is called
+(see section \(lqMeasurements\(rq in
+.MR groff @MAN7EXT@ )\c
+_endif()dnl
+\&.
+
+These man pages serve multiple goals, one of which is to serve as a
+model for good man page writing by people who examine their sources.
+
+After processing by m4, both child pages in the above case will carry \c
+escape sequences followed by text lines starting with punctuation one
+normally does not find in that position (and in the case of the period,
+which has to be protected from interpretation as a control line).
+
+This is ugly, fragile, and unnecessary; all of these traits are
+offensive to good pedagogy.
+
+Consequently, it is better to repeat a small amount of material than
+write a man page that looks like the output of docbook-to-man.
+
+define(`_ifstyle',`ifdef(`_groff_man_style',,`divert(-1)')')
+define(`_ifnotstyle',`ifdef(`_groff_man_style',`divert(-1)')')
+define(`_endif',`divert`'')
+divert`'dnl
+'\" t
+.\" This page is generated by m4 from tmac/groff_man.7.man.in.
+_ifnotstyle()dnl
+.TH groff_man @MAN7EXT@ "@MDATE@" "groff @VERSION@"
+_endif()dnl
+_ifstyle()dnl
+.TH groff_man_style @MAN7EXT@ "@MDATE@" "groff @VERSION@"
+_endif()dnl
+.SH Name
+_ifnotstyle()dnl
+groff_man \- compose manual pages with GNU
+.I roff
+_endif()dnl
+_ifstyle()dnl
+groff_man_style \- GNU
+.I roff
+man page tutorial and style guide
+_endif()dnl
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1999-2018, 2020-2021 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_man_7_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY "groff \-man"
+.RI [ option\~ .\|.\|.\&]
+.RI [ file\~ .\|.\|.]
+.
+.SY "groff \-m man"
+.RI [ option\~ .\|.\|.\&]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The GNU implementation of the
+.I man
+macro package is part of the
+.I groff
+document formatting system.
+.
+It is used to produce manual pages
+.\" We use an unbreakable space \~ here to keep the phrase intact for
+.\" its introduction; in subsequent discussion, that is not important.
+(\(lqman\~pages\(rq)
+like the one you are reading.
+.
+.
+.P
+This document presents the macros thematically;
+for those needing only a quick reference,
+the following table lists them alphabetically,
+with cross references to appropriate subsections below.
+.
+.
+_ifnotstyle()dnl
+.P
+Man page authors and maintainers who are not already experienced
+.I groff
+users should consult
+.MR groff_man_style @MAN7EXT@ ,
+an expanded version of this document,
+for additional explanations and advice.
+.
+It covers only those concepts required for man page document
+maintenance,
+and not the full breadth of the
+.I groff
+typesetting system.
+.
+.
+_endif()dnl
+.P
+.TS
+l l l.
+Macro Meaning Subsection
+.T&
+lB l l.
+_
+\&.B Bold Font style macros
+\&.BI Bold, italic alternating Font style macros
+\&.BR Bold, roman alternating Font style macros
+\&.EE Example end Document structure macros
+\&.EX Example begin Document structure macros
+\&.I Italic Font style macros
+\&.IB Italic, bold alternating Font style macros
+\&.IP Indented paragraph Paragraphing macros
+\&.IR Italic, roman alternating Font style macros
+\&.LP Begin paragraph Paragraphing macros
+\&.ME Mail-to end Hyperlink macros
+\&.MR Man page cross reference Hyperlink macros
+\&.MT Mail-to start Hyperlink macros
+\&.P Begin paragraph Paragraphing macros
+\&.PP Begin paragraph Paragraphing macros
+\&.RB Roman, bold alternating Font style macros
+\&.RE Relative inset end Document structure macros
+\&.RI Roman, italic alternating Font style macros
+\&.RS Relative inset start Document structure macros
+\&.SB Small bold Font style macros
+\&.SH Section heading Document structure macros
+\&.SM Small Font style macros
+\&.SS Subsection heading Document structure macros
+\&.SY Synopsis start Command synopsis macros
+\&.TH Title heading Document structure macros
+\&.TP Tagged paragraph Paragraphing macros
+\&.TQ Supplemental paragraph tag Paragraphing macros
+\&.UE URI end Hyperlink macros
+\&.UR URI start Hyperlink macros
+\&.YS Synopsis end Command synopsis macros
+.TE
+.
+.
+.P
+We discuss other macros
+.RB ( .AT ,
+.BR .DT ,
+.BR .HP ,
+.BR .OP ,
+.BR .PD ,
+and
+.BR .UC )
+in subsection \(lqDeprecated features\(rq below.
+.
+.
+.P
+Throughout Unix documentation,
+a manual entry is referred to simply as a \(lqman page\(rq,
+regardless of its length,
+without gendered implication,
+and irrespective of the macro package selected for its composition.
+_ifstyle()dnl
+.
+.
+.\" ====================================================================
+.\" .SS "Input file format"
+.\" ====================================================================
+.P
+Man pages should be encoded using Unicode basic Latin code points
+exclusively,
+and employ the Unix line-ending convention
+(U+000A only).
+.\" What about rare English words that require diacritics, and
+.\" proper names that require more than basic Latin?
+.\"
+.\" sentence (including end-of-sentence detection)
+.\" The above distinction works well with filling.
+.\" Don't fill your input text yourself; let groff do the work.
+.\" Also good for diffs.
+.\" escape sequences--pretty much just "see Portability"
+.
+.\" ====================================================================
+.SS "Fundamental concepts"
+.\" ====================================================================
+.\" font (family, style [elsewhere known as face])
+.\" type size
+.\" typesetter (troff device, PostScript, PDF)
+.\" terminal (nroff device, emulator, typewriter, TTY)
+.I groff
+is a programming system for typesetting:
+we thus often use the verb \(lqto set\(rq in the sense
+\(lqto typeset\(rq.
+.
+The formatter
+.MR @g@troff @MAN1EXT@
+collects words from the input and
+.I fills
+output lines with as many as will fit.
+.
+.I Words
+are separated by spaces and newlines.
+.\" Also tabs and leaders, but let's not discuss those in man(7).
+.
+A transition to a new output line is called a
+.I break.
+.
+When formatted,
+a word may be broken at hyphens,
+at
+.B \e%
+or
+.B \e:
+escape sequences
+(see subsection \(lqPortability\(rq below),
+or at predetermined locations
+if automatic hyphenation is enabled
+(see the
+.B \-rHY
+option in section \(lqOptions\(rq below).
+.
+An output line may be supplemented with
+.I inter-sentence space,
+and then optionally
+.I adjusted
+with more space to a consistent line length
+(see the
+.B \-dAD
+option).
+.
+.MR roff @MAN7EXT@
+details these processes.
+.
+.
+.P
+An input line that starts with a dot (.\&)
+or neutral apostrophe (\(aq)
+is a
+.I control line.
+.
+To call a macro,
+put its name after a dot on a control line.
+.\" You never need to indent macro calls in man(7), or call them with
+.\" the no-break control character.
+.
+We refer to macros in this document using this leading dot.
+.
+Some macros interpret
+.I arguments,
+words that follow the macro name.
+.
+A newline,
+unless escaped
+(see subsection \(lqPortability\(rq below),
+marks the end of the macro call.
+.
+An input line consisting of a dot followed by a newline
+is called the
+.I empty request;
+it does nothing.
+.
+.I Text lines
+are input lines that are not control lines.
+.
+.
+.P
+We describe below several
+.I man
+macros that plant one-line
+.I input traps:
+the next input line that directly produces formatted output is treated
+specially.
+.
+For
+.I man
+documents that follow the advice in section
+\[lq]Portability\[rq] below,
+this means that control lines using the empty request
+and uncommented input lines ending with an escaped newline
+do not spring the trap;
+anything else does
+(but see the
+.B .TP
+macro description).
+.
+.
+.\" ====================================================================
+.\" .SS "Why have a tutorial and style guide?"
+.\" ====================================================================
+.\" the processing pipeline in brief
+.\" preprocessors, roff itself, various output devices
+.\" Things that aren't groff--why you want the man page language to be
+.\" small (mandoc, Kerrisk's man7.org, manpages.debian.org, non-expert
+.\" humans).
+.\" possibly exhibit a horrorshow docbook-to-man example
+_endif()dnl
+.
+.
+.br
+.ne 6v
+.\" ====================================================================
+.SS "Macro reference preliminaries"
+.\" ====================================================================
+.
+A tagged paragraph describes each macro.
+.
+We present coupled pairs together,
+as with
+.B .EX
+and
+.BR .EE .
+.
+.
+.br
+.ne 2v
+.P
+_ifstyle()dnl
+Optional macro arguments are indicated by surrounding them with square
+brackets.
+.
+If a macro accepts multiple arguments,
+those containing space \" or tab (in Plan 9 troff [only?])
+characters must be double-quoted to be interpreted correctly.
+.
+_endif()dnl
+An empty macro argument can be specified with a pair of double-quotes
+(""),
+but the
+.I man
+package is designed such that this should seldom be necessary.
+_ifstyle()dnl
+.
+See section \(lqNotes\(rq below for examples of cases where better
+alternatives to empty arguments in macro calls are available.
+_endif()dnl
+.
+Most macro arguments will be formatted as text in the output;
+exceptions are noted.
+.
+.
+.\" ====================================================================
+.SS "Document structure macros"
+.\" ====================================================================
+.
+Document structure macros organize a man page's content.
+.
+All of them break the output line.
+.
+.B .TH
+(title heading)
+identifies the document as a man page and configures the page headers
+and footers.
+.
+Section headings
+.RB ( .SH ),
+one of which is mandatory and many of which are conventionally expected,
+facilitate location of material by the reader and aid the man page
+writer to discuss all essential aspects of the topic.
+.
+Subsection headings
+.RB ( .SS )
+are optional and permit sections that grow long to develop in a
+controlled way.
+.
+Many technical discussions benefit from examples;
+lengthy ones,
+especially those reflecting multiple lines of input to or output from
+the system,
+are usefully bracketed by
+.B .EX
+and
+.BR .EE .
+.
+When none of the foregoing meets a structural demand,
+use
+.BR .RS / .RE
+to inset a region within a (sub)section.
+.
+.
+.TP
+.BI .TH " topic section"\c
+.RI " [" footer-middle ]\c
+.RI " [" footer-inside ]\c
+.RI " [" header-middle ]
+Determine the contents of the page header and footer.
+_ifstyle()dnl
+.
+.I roff
+systems refer to these collectively as \(lqtitles\(rq.
+_endif()dnl
+.
+The subject of the man page is
+.I topic
+and the section of the manual to which it belongs is
+.I section.
+_ifstyle()dnl
+.
+This use of \(lqsection\(rq has nothing to do with the section headings
+otherwise discussed in this page;
+it arises from the organizational scheme of printed and bound Unix
+manuals.
+_endif()dnl
+.
+See
+.MR man 1
+or
+.MR intro 1
+for the manual sectioning applicable to your system.
+.
+.I topic
+and
+.I section
+are positioned together at the left and right in the header
+(with
+.I section
+in parentheses immediately appended to
+.IR topic ).
+.
+.I footer-middle
+is centered in the footer.
+.
+The arrangement of the rest of the footer depends on whether
+double-sided layout is enabled with the option
+.BR \-rD1 .
+.
+When disabled (the default),
+.I footer-inside
+is positioned at the bottom left.
+.
+Otherwise,
+.I footer-inside
+appears at the bottom left on recto (odd-numbered) pages,
+and at the bottom right on verso (even-numbered) pages.
+.
+The outside footer is the page number,
+except in the continuous-rendering mode enabled by the option
+.BR \-rcR=1 ,
+in which case it is the
+.I topic
+and
+.I section,
+as in the header.
+.
+.I header-middle
+is centered in the header.
+.
+If
+.I section
+is an integer between 1 and\~9 (inclusive),
+there is no need to specify
+.I header-middle;
+.I an.tmac
+will supply text for it.
+.
+The macro package may also abbreviate
+.I topic
+and
+.I footer-inside
+with ellipses
+_ifstyle()dnl
+.RB ( .\|.\|.\& )
+_endif()dnl
+if they would overrun the space available in the header and footer,
+respectively.
+.
+For HTML output,
+headers and footers are suppressed.
+.
+.
+.IP
+Additionally,
+this macro breaks the page,
+resetting the number to\~1
+(unless the
+.B \-rC1
+option is given).
+.
+This feature is intended only for formatting multiple
+.I man
+documents in sequence.
+.
+.
+.IP
+A valid
+.I man
+document calls
+.B .TH
+once,
+early in the file,
+prior to any other macro calls.
+_ifstyle()dnl
+.
+.
+.IP
+By convention,
+.I footer-middle
+is the date of the most recent modification to the man page source
+document,
+and
+.I footer-inside
+is the name and version or release of the project providing it.
+_endif()dnl
+.
+.
+.TP
+.BR .SH " ["\c
+.IR heading-text ]
+Set
+.I heading-text
+as a section heading.
+.
+If no argument is given,
+a one-line input trap is planted;
+text on the next line
+.\", which can be formatted with a macro, \" true but discouraged
+becomes
+.I heading-text.
+.
+The left margin is reset to zero to set the heading text in bold
+(or the font specified by the string
+.BR HF ),
+and,
+on typesetting devices,
+slightly larger than the base type size.
+.
+If the heading font
+.B \[rs]*[HF]
+is bold,
+use of an italic style in
+.I heading-text
+is mapped to the bold-italic style if available in the font family.
+.
+The inset level is reset to 1,
+setting the left margin to the value of the
+.B IN \" TODO: future: BP or BI register ("base paragraph indentation")
+register.
+.
+Text after
+.I heading-text
+is set as an ordinary paragraph
+.RB ( .P ).
+.
+.
+.IP
+The content of
+.I heading-text
+and ordering of sections follows a set of common practices,
+as has much of the layout of material within sections.
+.
+For example,
+a section called \(lqName\(rq or \(lqNAME\(rq must exist,
+must be the first section after the
+.B .TH
+call,
+and must contain only text of the form
+.RS \" Invisibly move left margin to current .IP indentation.
+.RS \" Now indent further, visibly.
+.IR topic [\c
+.BI , " another-topic"\c
+.RB "].\|.\|.\& \e\- "\c
+.I summary-description
+.RE \" Move left margin back to .IP indentation.
+for a man page to be properly indexed.
+.
+See
+_ifnotstyle()dnl
+.MR groff_man_style @MAN7EXT@
+for suggestions and
+_endif()dnl
+.MR man 7
+for the conventions prevailing on your system.
+.RE \" Move left margin back to standard position.
+.
+.
+.TP
+.BR .SS " ["\c
+.IR subheading-text ]
+Set
+.I subheading-text
+as a subsection heading indented between a section heading and an
+ordinary paragraph
+.RB ( .P ).
+.
+If no argument is given,
+a one-line input trap is planted;
+text on the next line
+.\", which can be formatted with a macro, \" true but discouraged
+becomes
+.I subheading-text.
+.
+The left margin is reset to the value of the
+.B SN
+register to set the heading text in bold
+(or the font specified by the string
+.BR HF ).
+.
+If the heading font
+.B \[rs]*[HF]
+is bold,
+use of an italic style in
+.I subheading-text
+is mapped to the bold-italic style if available in the font family.
+.
+The inset level is reset to 1,
+setting the left margin to the value of the
+.B IN \" TODO: future: BP or BI register ("base paragraph indentation")
+register.
+.
+Text after
+.I subheading-text
+is set as an ordinary paragraph
+.RB ( .P ).
+.
+.
+.TP
+.B .EX
+.TQ
+.B .EE
+Begin and end example.
+.
+After
+.BR .EX ,
+filling is disabled and a constant-width (monospaced) font is selected.
+.
+Calling
+.B .EE
+enables filling and restores the previous font.
+.
+.
+_ifstyle()dnl
+.IP
+Example regions are useful for formatting code,
+shell sessions,
+and text file contents.
+.
+An example region is not
+a \(lqliteral mode\(rq
+of any sort:
+special character escape sequences must still be used to produce correct
+glyphs for
+.BR \(aq ,
+.BR \- ,
+.BR \(rs ,
+.BR \(ha ,
+.BR \(ga ,
+and
+.BR \(ti ,
+and sentence endings are still detected and additional inter-sentence
+space applied.
+.
+If the amount of additional inter-sentence spacing is altered,
+the rendering of,
+for instance,
+regular expressions using
+.B .\&
+or
+.B ?\&
+followed by multiple spaces can change.
+.
+Use the dummy character escape sequence
+.B \(rs&
+before the spaces.
+.
+.
+_endif()dnl
+.IP
+.\" Also see subsection "History" below...
+These macros are extensions introduced in Ninth Edition Research Unix.
+.
+Systems running that
+.IR troff , \" AT&T Research Unix
+or those from
+Documenter's Workbench,
+Heirloom Doctools,
+or Plan\~9
+.I troff
+support them.
+.\" Solaris 10 troff does not support .EX/.EE. Neatroff doesn't ship
+.\" (m)an macros.
+.
+To be certain your page will be portable to systems that do not,
+copy their definitions from the
+.I \%an\-ext.tmac
+file of a
+.I groff
+installation.
+.
+.
+.TP
+.BR .RS " ["\c
+.IR inset-amount ]
+Start a new relative inset level.
+.
+The position of the left margin is saved,
+then moved right by
+.I inset-amount,
+if specified,
+and by the amount of the
+.B IN
+register otherwise.
+.
+Calls to
+.B .RS
+can be nested;
+each increments by\~1
+the inset level used by
+.BR .RE .
+.
+The level prior to any
+.B .RS
+calls is\~1.
+.
+.
+.TP
+.BR .RE " ["\c
+.IR level ]
+End a relative inset.
+.
+The left margin corresponding to inset level
+.I level
+is restored.
+.
+If no argument is given,
+the inset level is reduced by\~1.
+.
+.
+.\" ====================================================================
+.SS "Paragraphing macros"
+.\" ====================================================================
+.
+An ordinary paragraph
+.RB ( .P )
+_ifstyle()dnl
+like this one
+_endif()dnl
+is set without a first-line indentation at the current left margin.
+.
+In man pages and other technical literature,
+definition lists are frequently encountered;
+these can be set as \(lqtagged paragraphs\(rq,
+which have one
+.RB ( .TP )
+or more
+.RB ( .TQ )
+leading tags followed by a paragraph that has an additional indentation.
+.
+The indented paragraph
+.RB ( .IP )
+macro is useful to continue the indented content of a narrative started
+with
+.BR .TP ,
+or to present an itemized or ordered list.
+.
+All of these macros break the output line.
+.
+If another paragraph macro has occurred since the previous
+.B .SH
+or
+.BR .SS ,
+they
+(except for
+.BR .TQ )
+follow the break with a default amount of vertical space,
+which can be changed by the deprecated
+.B .PD
+macro;
+see subsection \(lqHorizontal and vertical spacing\(rq below.
+.
+They also reset the type size and font style to defaults
+.RB ( .TQ
+again excepted);
+see subsection \(lqFont style macros\(rq below.
+.
+.
+.br
+.ne 4v
+.TP
+.B .P
+.TQ
+.B .LP
+.TQ
+.B .PP
+Begin a new paragraph;
+these macros are synonymous.
+.
+The indentation is reset to the default value;
+the left margin,
+as affected by
+.B .RS
+and
+.BR .RE ,
+is not.
+.
+.
+.TP
+.BR .TP " ["\c
+.IR indentation ]
+Set a paragraph with a leading tag,
+and the remainder of the paragraph indented.
+.
+A one-line input trap is planted;
+text on the next line,
+which can be formatted with a macro,
+becomes the tag,
+which is placed at the current left margin.
+.
+The tag can be extended with the
+.B \(rsc
+escape sequence.
+.
+Subsequent text is indented by
+.I indentation,
+if specified,
+and by the amount of the
+.B IN
+register otherwise.
+.
+If the tag is not as wide as the indentation,
+the paragraph starts on the same line as the tag,
+at the applicable indentation,
+and continues on the following lines.
+.
+Otherwise,
+the descriptive part of the paragraph begins on the line following the
+tag.
+_ifstyle()dnl
+.
+.
+.IP
+The line containing the tag can `include' a macro call,
+for instance to set the tag in bold with
+.BR .B .
+.
+.B .TP
+was used to write the first paragraph of this description of
+.BR .TP ,
+and
+.B .IP
+the subsequent one.
+_endif()dnl
+.
+.
+.TP
+.B .TQ
+Set an additional tag for a paragraph tagged with
+.BR .TP .
+.
+An input trap is planted as with
+.BR .TP .
+.
+.
+.IP
+This macro is a GNU extension not defined on systems running
+AT&T,
+Plan\~9,
+or
+Solaris
+.IR troff ;
+see
+.I \%an\-ext.tmac
+in section \(lqFiles\(rq below.
+_ifstyle()dnl
+.
+.
+.IP
+The descriptions of
+.BR .P ,
+.BR .LP ,
+and
+.B .PP
+above were written using
+.B .TP
+and
+.BR .TQ .
+_endif()dnl
+.
+.
+.TP
+.BR .IP " ["\c
+.IR tag "] "\c
+.RI [ indentation ]
+Set an indented paragraph with an optional tag.
+.
+The
+.I tag
+and
+.I indentation
+arguments,
+if present,
+are handled as with
+.BR .TP ,
+with the exception that the
+.I tag
+argument to
+.B .IP
+cannot `include' a macro call.
+.
+.
+_ifstyle()dnl
+.IP
+Two convenient uses for
+.B .IP
+are
+.
+.
+.RS \" Invisibly move left margin to current .IP indentation.
+.RS 4n \" Now indent further, visibly.
+.IP (1) 4n
+to start a new paragraph with the same indentation as an immediately
+preceding
+.B .IP
+or
+.B .TP
+paragraph,
+if no
+.I indentation
+argument is given;
+and
+.
+.
+.IP (2)
+to set a paragraph with a short
+.I tag
+that is not semantically important,
+such as a bullet (\(bu)\(emobtained with the
+.B \e(bu
+special character escape sequence\(emor list enumerator,
+as seen in this very paragraph.
+.RE \" Move left margin back to .IP indentation.
+.RE \" Move left margin back to standard position.
+.
+.
+_endif()dnl
+.\" ====================================================================
+.SS "Command synopsis macros"
+.\" ====================================================================
+.
+.B .SY
+and
+.B .YS
+aid you to construct a command synopsis that has the classical Unix
+appearance.
+.
+They break the output line.
+.
+.\" TODO: Determine whether this (is still? was ever?) true.
+.\" Furthermore,
+.\" some tools are able to interpret these macros semantically and treat
+.\" them appropriately for localization and/or presentation.
+.
+.
+.P
+These macros are GNU extensions not defined on systems running
+AT&T,
+Plan\~9,
+or
+Solaris
+.IR troff ;
+see
+.I \%an\-ext.tmac
+in section \(lqFiles\(rq below.
+.
+.
+.TP
+.BI .SY " command"
+Begin synopsis.
+.
+A new paragraph begins at the left margin
+_ifstyle()dnl
+(as with
+.BR .P )
+_endif()dnl
+unless
+.B .SY
+has already been called without a corresponding
+.BR .YS ,
+in which case only a break is performed.
+.
+Adjustment and automatic hyphenation are disabled.
+.
+.I command
+is set in bold.
+.
+If a break is required,
+lines after the first are indented by the width of
+.I command
+plus a space.
+.
+.
+.TP
+.B .YS
+End synopsis.
+.
+Indentation,
+adjustment,
+and hyphenation
+are restored to their previous states.
+_ifstyle()dnl
+.
+.
+.P
+Multiple
+.BR .SY / .YS
+blocks can be specified,
+for instance to distinguish differing modes of operation of a complex
+command like
+.MR tar 1 ;
+each will be vertically separated as paragraphs are.
+.
+.
+.P
+.B .SY
+can be repeated before
+.B .YS
+to indicate synonymous ways of invoking a particular mode of operation.
+.
+.
+.br
+.ne 2v
+.P
+.IR groff 's
+own command-line interface serves to illustrate most of the specimens
+of synopsis syntax one is likely to encounter.
+.
+.
+.IP
+.\" from src/roff/groff/groff.1.man
+.EX
+\&.SY groff
+\&.RB [ \e-abcCeEgGijklNpRsStUVXzZ ]
+\&.RB [ \e-d\e\(ti\ec
+\&.IR cs ]
+\&.RB [ \e-d\e\(ti\ec
+\&.IB name =\ec
+\&.IR string ]
+\&.RB [ \e-D\e\(ti\ec
+\&.IR enc ]
+.EE
+.
+.I (and so on similarly)
+.
+.EX
+\&.RI [ file\e\(ti .\e|.\e|.]
+\&.YS
+\&.
+\&.
+\&.SY groff
+\&.B \e-h
+\&.
+\&.SY groff
+\&.B \e-\e-help
+\&.YS
+\&.
+\&.
+\&.SY groff
+\&.B \e-v
+\&.RI [ option\e\(ti .\e|.\e|.\e&]
+\&.RI [ file\e\(ti .\e|.\e|.]
+\&.
+\&.SY groff
+\&.B \e-\e-version
+\&.RI [ option\e\(ti .\e|.\e|.\e&]
+\&.RI [ file\e\(ti .\e|.\e|.]
+\&.YS
+.EE
+.
+.
+.P
+produces the following output.
+.
+.
+.RS
+.SY groff
+.RB [ \-abcCeEgGijklNpRsStUVXzZ ]
+.RB [ \-d\~\c
+.IR cs ]
+.RB [ \-d\~\c
+.IB name =\c
+.IR string ]
+.RB [ \-D\~\c
+.IR enc ]
+.RB [ \-f\~\c
+.IR fam ]
+.RB [ \-F\~\c
+.IR dir ]
+.RB [ \-I\~\c
+.IR dir ]
+.RB [ \-K\~\c
+.IR enc ]
+.RB [ \-L\~\c
+.IR arg ]
+.RB [ \-m\~\c
+.IR name ]
+.RB [ \-M\~\c
+.IR dir ]
+.RB [ \-n\~\c
+.IR num ]
+.RB [ \-o\~\c
+.IR list ]
+.RB [ \-P\~\c
+.IR arg ]
+.RB [ \-r\~\c
+.IR cn ]
+.RB [ \-r\~\c
+.IB reg =\c
+.IR expr ]
+.RB [ \-T\~\c
+.IR dev ]
+.RB [ \-w\~\c
+.IR name ]
+.RB [ \-W\~\c
+.IR name ]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.SY groff
+.B \-h
+.
+.SY groff
+.B \-\-help
+.YS
+.
+.
+.SY groff
+.B \-v
+.RI [ option\~ .\|.\|.\&]
+.RI [ file\~ .\|.\|.]
+.
+.SY groff
+.B \-\-version
+.RI [ option\~ .\|.\|.\&]
+.RI [ file\~ .\|.\|.]
+.YS
+.RE
+.
+.
+.P
+Several features of the above example are of note.
+.
+.
+.IP \(bu 2n
+The empty request (.),
+which does nothing,
+is used to vertically space the input file for readability by the
+document maintainer.
+.
+Do not put blank (empty) lines in a man page source document.
+.
+.
+.IP \(bu
+Command and option names are presented in
+.B bold
+to cue the user that they should be input literally.
+.
+.
+.IP \(bu
+Option dashes are specified with the
+.B \e\-
+escape sequence;
+this is an important practice to make them clearly visible and to
+facilitate copy-and-paste from the rendered man page to a shell prompt
+or text file.
+.
+.
+.IP \(bu
+Option arguments and command operands are presented in
+.I italics
+(but see subsection \(lqFont style macros\(rq below regarding terminals)
+to cue the user that they must be replaced with appropriate text.
+.
+.
+.IP \(bu
+Symbols that are neither to be typed literally nor replaced at the
+user's discretion appear in the roman style;
+brackets surround optional arguments,
+and an ellipsis indicates that the previous syntactical element may be
+repeated arbitrarily.
+.
+.
+.IP \(bu
+The non-breaking adjustable space escape sequence
+.B \e\(ti
+is used to prevent the output line from being broken within the option
+brackets;
+see subsection \(lqPortability\(rq below.
+.
+.
+.IP \(bu
+The output line continuation escape sequence
+.B \ec
+is used with font style alternation macros to allow all three font
+styles to be set without (breakable) space among them;
+see subsection \(lqPortability\(rq below.
+.
+.
+.IP \(bu
+The dummy character escape sequence
+.B \e&
+follows the ellipsis when further text will follow after space on the
+output line,
+keeping its last period from being interpreted as the end of a
+sentence
+.\" ...because it is followed by characters that are transparent to
+.\" end-of-sentence detection, and a newline...
+and causing additional inter-sentence space to be placed after it.
+.
+See subsection \(lqPortability\(rq below.
+_endif()dnl
+.
+.
+.\" ====================================================================
+.SS "Hyperlink macros"
+.\" ====================================================================
+.
+Man page cross references
+_ifstyle()dnl
+like
+.MR ls 1
+_endif()dnl
+are best presented with
+.BR .MR .
+.
+Text may be hyperlinked to email addresses with
+.BR .MT / .ME
+or other URIs with
+.BR .UR / .UE .
+.
+Hyperlinked text is supported on HTML
+.\", PDF,
+and terminal output devices;
+terminals and pager programs must support ECMA-48 OSC\~8 escape
+sequences
+(see
+.MR grotty @MAN1EXT@ ).
+.
+When device support is unavailable or disabled with the
+.B U
+register
+(see section \[lq]Options\[rq] below),
+.B .MT
+and
+.B .UR
+URIs are rendered between angle brackets after the linked text.
+.
+.
+.P
+.BR .MT ,
+.BR .ME ,
+.BR .UR ,
+and
+.B .UE
+are GNU extensions not defined on systems running
+AT&T,
+Plan\~9,
+or
+Solaris
+.IR troff ; \" Solaris
+see
+.I \%an\-ext.tmac
+in section \(lqFiles\(rq below.
+.
+Plan\~9 from User Space's
+.I troff \" plan9port
+implements
+.BR .MR .
+.
+.
+.P
+The arguments to
+.BR .MR ,
+.BR .MT ,
+and
+.B .UR
+should be prepared for typesetting since they can appear in the
+output.
+.
+Use special character escape sequences to encode Unicode basic Latin
+characters where necessary,
+particularly the hyphen-minus.
+_ifstyle()dnl
+.
+(See section \[lq]Portability\[rq] below.)
+.
+URIs can be lengthy;
+rendering them can result in jarring adjustment or variations in line
+length,
+or
+.I @g@troff
+warnings when a hyperlink is longer than an output line.
+.
+The application of non-printing break point escape sequences
+.B \e:
+after each slash
+(or series thereof),
+and before each dot
+(or series thereof)
+is recommended as a rule of thumb.
+.
+The former practice avoids forcing a trailing slash in a URI onto a
+separate output line,
+and the latter helps the reader to avoid mistakenly interpreting a dot
+at the end of a line as a period
+(or multiple dots as an ellipsis).
+.
+Thus,
+.RS
+.EX
+\&.UR http://\e:example\e:.com/\e:fb8afcfbaebc74e\e:.cc
+.EE
+.RE
+has several potential break points in the URI shown.
+.
+Consider adding break points before or after at signs in email
+addresses,
+and question marks,
+ampersands,
+and number signs in HTTP(S) URIs.
+.
+_endif()dnl
+The formatter removes
+.B \e:
+escape sequences from hyperlinks when supplying device control commands
+to output drivers.
+.
+.
+.TP
+.BI .MR "\~topic manual-section"\c
+.RI \~[ trailing-text ]
+.IR (since\~ groff \~1.23) \" TODO: remove note once novelty dies down
+Set a man page cross reference as
+\[lq]\c
+.IB topic ( manual-section )\c
+\[rq].
+.
+If
+.I trailing-text
+(typically punctuation)
+is specified,
+it follows the closing parenthesis without intervening space.
+.
+Hyphenation is disabled while the cross reference is set.
+.
+.I topic
+is set in the font specified by the
+.B MF
+string.
+.
+The cross reference hyperlinks to a URI of the form
+.RB \[lq] man:\c
+.IR topic ( manual-section )\[rq].
+_ifstyle()dnl
+.
+.
+.RS
+.IP
+.EX
+The output driver
+\&.MR grops @MAN1EXT@
+produces PostScript from
+\&.I troff
+output.
+\&.
+The Ghostscript program (\[rs]c
+\&.MR gs 1 )
+interprets PostScript and PDF.
+.EE
+.RE
+_endif()dnl
+.
+.
+.TP
+.BI .MT " address"
+.TQ
+.BR .ME " ["\c
+.IR trailing-text ]
+Identify
+.I address
+as an RFC 6068
+.I addr-spec
+for a \(lqmailto:\(rq URI with the text between the two macro
+calls as the link text.
+.
+An argument to
+.B .ME
+is placed after the link text without intervening space.
+.
+.I address
+may not be visible in the rendered document if hyperlinks are enabled
+and supported by the output driver.
+.
+If they are not,
+.I address
+is set in angle brackets after the link text and before
+.I trailing-text.
+.
+If hyperlinking is enabled but there is no link text,
+.I address
+is formatted and hyperlinked
+.I without
+angle brackets.
+_ifstyle()dnl
+.
+.
+.br
+.ne 6v
+.IP
+When rendered by
+.I groff
+to a PostScript device,
+.RS
+.IP
+.EX
+Contact
+\&.MT fred\e:.foonly@\e:fubar\e:.net
+Fred Foonly
+\&.ME
+for more information.
+.EE
+.RE
+.
+.
+.IP
+displays as \(lqContact Fred Foonly \(lafred\:.foonly@\:fubar\:.net\(ra
+for more information.\(rq.
+_endif()dnl
+.
+.
+.TP
+.BI .UR " uri"
+.TQ
+.BR .UE " ["\c
+.IR trailing-text ]
+Identify
+.I uri
+as an RFC 3986 URI hyperlink with the text between the two macro calls
+as the link text.
+.
+An argument to
+.B .UE
+is placed after the link text without intervening space.
+.
+.I uri
+may not be visible in the rendered document if hyperlinks are enabled
+and supported by the output driver.
+.
+If they are not,
+.I uri
+is set in angle brackets after the link text and before
+.I trailing-text.
+.
+If hyperlinking is enabled but there is no link text,
+.I uri
+is formatted and hyperlinked
+.I without
+angle brackets.
+_ifstyle()dnl
+.
+.
+.IP
+When rendered by
+.I groff
+to a PostScript device,
+.RS
+.IP
+.EX
+The GNU Project of the Free Software Foundation
+hosts the
+\&.UR https://\e:www\e:.gnu\e:.org/\e:software/\e:groff/
+\&.I groff
+home page
+\&.UE .
+.EE
+.RE
+.
+.
+.IP
+displays as \(lqThe GNU Project of the Free Software Foundation hosts
+the
+.I groff
+home page
+\(lahttps://\:www\:.gnu\:.org/\:software/\:groff/\(ra.\(rq.
+_endif()dnl
+.
+.
+.P
+The hyperlinking of
+.B .TP
+paragraph tags with
+.BR .UR / .UE
+and
+.BR .MT / .ME
+is not yet supported;
+if attempted,
+the hyperlink will be typeset at the beginning of the indented paragraph
+even on hyperlink-supporting devices.
+.
+.
+.\" ====================================================================
+.SS "Font style macros"
+.\" ====================================================================
+.
+The
+.I man
+macro package is limited in its font styling options,
+offering only
+.BR bold \~( .B ),
+.I italic\c
+.RB \~( .I ),
+and roman.
+.
+Italic text is usually set underscored instead on terminal devices.
+.
+The
+.B .SM
+and
+.B .SB
+macros set text in roman or bold,
+respectively,
+at a smaller type size;
+these differ visually from regular-sized roman or bold text only on
+typesetting devices.
+.
+It is often necessary to set text in different styles without
+intervening space.
+.
+The macros
+.BR .BI ,
+.BR .BR ,
+.BR .IB ,
+.BR .IR ,
+.BR .RB ,
+and
+.BR .RI ,
+where \(lqB\(rq,
+\(lqI\(rq,
+and \(lqR\(rq indicate bold,
+italic,
+and roman,
+respectively,
+set their odd- and even-numbered arguments in alternating styles,
+with no space separating them.
+_ifstyle()dnl
+.
+.
+.P
+Because font styles are presentational rather than semantic,
+conflicting traditions have arisen regarding which font styles should be
+used to mark file or path names,
+environment variables,
+and inlined literals.
+_endif()dnl
+.
+.
+.br
+.ne 2v
+.P
+The default type size and family for typesetting devices is 10-point
+Times,
+except on the
+.B \%X75\-12
+and
+.B \%X100\-12
+devices where the type size is 12 points.
+.
+The default style is roman.
+.
+.
+.TP
+.BR .B \~[\c
+.IR text ]
+Set
+.I text
+in bold.
+.
+If no argument is given,
+a one-line input trap is planted;
+text on the next line,
+which can be further formatted with a macro,
+is set in bold.
+.
+.
+_ifstyle()dnl
+.IP
+Use bold
+for literal portions of syntax synopses,
+for command-line options in running text,
+and for literals that are major topics of the subject under discussion;
+for example,
+this page uses bold for macro,
+string,
+and register names.
+.
+In an
+.BR .EX / .EE
+example of interactive I/O
+(such as a shell session),
+set only user input in bold.
+.
+.
+.
+_endif()dnl
+.TP
+.BR .I \~[\c
+.IR text ]
+Set
+.I text
+in an italic or oblique face.
+.
+If no argument is given,
+a one-line input trap is planted;
+text on the next line,
+which can be further formatted with a macro,
+is set in an italic or oblique face.
+.
+.
+_ifstyle()dnl
+.IP
+Use italics
+for file and path names,
+for environment variables,
+for C data types,
+for enumeration or preprocessor constants in C,
+for variant (user-replaceable) portions of syntax synopses,
+for the first occurrence (only) of a technical concept being introduced,
+for names of journals and of literary works longer than an article,
+and anywhere a parameter requiring replacement by the user is
+encountered.
+.
+An exception involves variant text in a context already typeset in
+italics,
+such as file or path names with replaceable components;
+in such cases,
+follow the convention of mathematical typography:
+set the file or path name in italics as usual
+but use roman for the variant part
+(see
+.B .IR
+and
+.B .RI
+below),
+and italics again in running roman text when referring to the variant
+material.
+.
+.
+_endif()dnl
+.TP
+.BR .SM \~[\c
+.IR text ]
+Set
+.I text
+one point smaller than the default type size on typesetting devices.
+.
+If no argument is given,
+a one-line input trap is planted;
+text on the next line,
+which can be further formatted with a macro,
+is set smaller.
+.
+.
+_ifstyle()dnl
+.IP
+.I Note:
+terminals will render
+.I text
+at normal size instead.
+.
+Do not rely upon
+.B .SM
+to communicate semantic information distinct from using roman style at
+normal size;
+it will be hidden from readers using such devices.
+.
+.
+_endif()dnl
+.TP
+.BR .SB \~[\c
+.IR text ]
+Set
+.I text
+in bold and
+(on typesetting devices)
+one point smaller than the default type size.
+.
+If no argument is given,
+a one-line input trap is planted;
+text on the next line,
+which can be further formatted with a macro,
+is set smaller and in bold.
+.
+This macro is an extension introduced in SunOS\~4.0.
+.
+.
+_ifstyle()dnl
+.IP
+.I Note:
+terminals will render
+.I text
+in bold at the normal size instead.
+.
+Do not rely upon
+.B .SB
+to communicate semantic information distinct from using bold style at
+normal size;
+it will be hidden from readers using such devices.
+.
+.
+.P
+Observe what is
+.I not
+prescribed for setting in bold or italics above:
+elements of \(lqsynopsis language\(rq such as ellipses and brackets
+around options;
+proper names and adjectives;
+titles of anything other than major works of literature;
+identifiers for standards documents or technical reports such as
+CSTR\~#54,
+RFC\~1918,
+Unicode\~13.0,
+or
+POSIX.1-2017;
+acronyms;
+and occurrences after the first of a technical term.
+.
+.
+.P
+Be frugal with italics for emphasis,
+and particularly with bold.
+.
+Article titles and brief runs of literal text,
+such as references to individual characters or short strings,
+including section and subsection headings of man pages,
+are suitable objects for quotation;
+see the
+.BR \e(lq ,
+.BR \e(rq ,
+.BR \e(oq ,
+and
+.B \e(cq
+escape sequences in subsection \(lqPortability\(rq below.
+.
+.
+_endif()dnl
+.P
+Unlike the above font style macros,
+the font style alternation macros below set no input traps;
+they must be given arguments to have effect.
+.
+Italic corrections are applied as appropriate.
+.
+_ifstyle()dnl
+If a space is required within an argument,
+first consider whether the same result could be achieved with as much
+clarity by using single-style macros on separate input lines.
+.
+When it cannot,
+double-quote an argument containing embedded space characters.
+.
+Setting all three different styles within a word
+presents challenges;
+it is possible with the
+.B \ec
+and/or
+.B \ef
+escape sequences.
+.
+See subsection \(lqPortability\(rq
+below for approaches.
+_endif()dnl
+.
+.
+.TP
+.BI .BI " bold-text italic-text "\c
+\&.\|.\|.\&
+Set each argument in bold and italics,
+alternately.
+.
+.
+_ifstyle()dnl
+.RS
+.IP
+.\" from src/roff/troff/troff.1.man
+.EX
+\&.BI \-r\~ register = numeric-expression
+.EE
+.RE
+.
+.
+_endif()dnl
+.TP
+.BI .BR " bold-text roman-text "\c
+\&.\|.\|.\&
+Set each argument in bold and roman,
+alternately.
+.
+.
+_ifstyle()dnl
+.RS
+.IP
+.\" from tmac/groff_ms.7.man
+.EX
+After
+\&.B .NH
+is called,
+.EE
+.RE
+.
+.
+_endif()dnl
+.TP
+.BI .IB " italic-text bold-text "\c
+\&.\|.\|.\&
+Set each argument in italics and bold,
+alternately.
+.
+.
+_ifstyle()dnl
+.RS
+.IP
+.\" from src/preproc/pic/pic.1.man
+.EX
+In places where
+\&.IB n th
+is allowed,
+.EE
+.RE
+.
+.
+_endif()dnl
+.TP
+.BI .IR " italic-text roman-text "\c
+\&.\|.\|.\&
+Set each argument in italics and roman,
+alternately.
+.
+.
+_ifstyle()dnl
+.RS
+.IP
+.\" from src/preproc/pic/pic.1.man
+.EX
+Use GNU
+\&.IR pic \[aq]s
+\&.B figname
+command to change the name of the vbox.
+.EE
+.RE
+.
+.
+_endif()dnl
+.TP
+.BI .RB " roman-text bold-text "\c
+\&.\|.\|.\&
+Set each argument in roman and bold,
+alternately.
+.
+.
+_ifstyle()dnl
+.RS
+.IP
+.\" from src/preproc/pic/pic.1.man
+.EX
+if
+\&.I file
+is
+\&.RB \[rs][lq] \[rs]\- \[rs][rq],
+the standard input stream is read.
+.RE
+.EE
+.
+.
+_endif()dnl
+.TP
+.BI .RI " roman-text italic-text "\c
+\&.\|.\|.\&
+Set each argument in roman and italics,
+alternately.
+.
+.
+_ifstyle()dnl
+.RS
+.IP
+.\" from src/preproc/pic/pic.1.man
+.EX
+\&.RI ( tpic
+was a fork of AT&T
+\&.I pic \" AT&T
+by Tim Morgan of the University of California at Irvine
+.EE
+.RE
+.
+.
+_endif()dnl
+.\" ====================================================================
+.SS "Horizontal and vertical spacing"
+.\" ====================================================================
+.
+The
+.I indentation
+argument accepted by
+.BR .IP ,
+.BR .TP ,
+and the deprecated
+.B .HP
+is a number plus an optional scaling unit,
+as is
+.BR .RS 's
+.IR inset-amount .
+.
+If no scaling unit is given,
+the
+.I man
+_ifstyle()dnl
+package assumes \(lqn\(rq;
+that is,
+the width of a letter \(lqn\(rq in the font current when the macro is
+called
+(see section \(lqMeasurements\(rq in
+.MR groff @MAN7EXT@ ).
+_endif()dnl
+_ifnotstyle()dnl
+package assumes \(lqn\(rq.
+_endif()dnl
+.
+An indentation specified in a call to
+.BR .IP ,
+.BR .TP ,
+or the deprecated
+.B .HP
+persists until
+(1) another of these macros is called with an
+.I indentation
+argument,
+or
+(2)
+.BR .SH ,
+.BR .SS ,
+or
+.B .P
+or its synonyms is called;
+these clear the indentation entirely.
+.
+.
+.P
+The left margin used by ordinary paragraphs set with
+.B .P
+(and its synonyms)
+not within an
+.BR .RS / .RE
+relative inset
+.\" TODO: future: BP or BI register ("base paragraph indentation")
+is 7.2n for typesetting devices
+and 7n for terminal devices
+(but see the
+.B \-rIN
+option).
+.
+Headers,
+footers
+(both set with
+.BR .TH ),
+and section headings
+.RB ( .SH )
+are set at the page offset
+(see
+.MR groff @MAN7EXT@ )
+and subsection headings
+.RB ( .SS )
+indented from it by 3n
+(but see the
+.B \-rSN
+option).
+.
+.\" XXX: This is not true, but they do handle it badly.
+.\" HTML output devices ignore indentation.
+_ifstyle()dnl
+.
+.
+.P
+It may be helpful to think of the left margin and indentation as related
+but distinct concepts;
+.IR groff 's
+implementation of the
+.I man
+macro package tracks them separately.
+.
+The left margin is manipulated by
+.B .RS
+and
+.B .RE
+(and by
+.\".BR .TH ,\" True but not to be encouraged within a document.
+.B .SH
+and
+.BR .SS ,
+which reset it to the default).
+.
+Indentation is controlled by the paragraphing macros
+(though,
+again,
+.\".BR .TH ,
+.B .SH
+and
+.B .SS
+reset it);
+it is imposed by the
+.BR .TP ,
+.BR .IP ,
+and deprecated
+.B .HP
+macros,
+and cancelled by
+.B .P
+and its synonyms.
+.
+An extensive example follows.
+.
+.
+.P
+This ordinary
+.RB ( .P )
+paragraph is not in a relative inset nor does it possess an indentation.
+.
+.
+.RS
+.P
+Now we have created a relative inset
+(in other words,
+moved the left margin)
+with
+.B .RS
+and started another ordinary paragraph with
+.BR .P .
+.
+.
+.TP
+.B tag
+This tagged paragraph,
+set with
+.BR .TP ,
+is still within the
+.B .RS
+region,
+but lines after the first have a supplementary indentation that the
+tag lacks.
+.
+.
+.IP
+A paragraph like this one,
+set with
+.BR .IP ,
+will appear to the reader as also associated with the tag above,
+because
+.B .IP
+re-uses the previous paragraph's indentation unless given an argument
+to change it.
+.
+This paragraph is affected both by the moved left margin
+.RB ( .RS )
+and indentation
+.RB ( .IP ).
+.
+.TS
+box;
+l.
+This table is affected both by
+the left margin and indentation.
+.TE
+.
+.
+.IP \(bu
+This indented paragraph has a bullet for a tag,
+making it more obvious that the left margin and indentation are
+distinct;
+only the former affects the tag,
+but both affect the text of the paragraph.
+.
+.
+.br
+.ne 3v
+.P
+This ordinary
+.RB ( .P )
+paragraph resets the indentation,
+but the left margin is still inset.
+.
+.TS
+box;
+l.
+This table is affected only
+by the left margin.
+.TE
+.RE
+.
+.
+.P
+Finally,
+we have ended the relative inset by using
+.BR .RE ,
+which
+(because we used only one
+.BR .RS / .RE
+pair)
+has reset the left margin to the default.
+.
+This is an ordinary
+.B .P
+paragraph.
+.
+.
+.P
+Resist the temptation to mock up tabular or multi-column output with
+tab characters or the indentation arguments to
+.BR .IP ,
+.BR .TP ,
+.BR .RS ,
+or the deprecated
+.BR .HP ;
+the result may not render comprehensibly on an output device you fail to
+check,
+or which is developed in the future.
+.
+The table preprocessor
+.MR @g@tbl @MAN1EXT@
+can likely meet your needs.
+_endif()dnl
+.
+.
+.P
+Several macros insert vertical space:
+.BR .SH ,
+.BR .SS ,
+.BR .TP ,
+.B .P
+(and its synonyms),
+.BR .IP ,
+and the deprecated
+.BR .HP .
+.
+The default inter-section and inter-paragraph spacing is
+is 1v for terminal devices
+_ifstyle()dnl
+and 0.4v for typesetting devices
+(\(lqv\(rq is a unit of vertical distance,
+where 1v is the distance between adjacent text baselines in a
+single-spaced document).
+_endif()dnl
+_ifnotstyle()dnl
+and 0.4v for typesetting devices.
+_endif()dnl
+.
+(The deprecated macro
+.B .PD
+can change this vertical spacing,
+but its use is discouraged.)
+.
+Between
+.B .EX
+and
+.B .EE
+calls,
+the inter-paragraph spacing is 1v regardless of output
+device.
+.
+.
+.\" ====================================================================
+.SS Registers
+.\" ====================================================================
+.
+Registers are described in section \(lqOptions\(rq below.
+.
+They can be set not only on the command line but in the site
+.I man.local
+file as well;
+see section \(lqFiles\(rq below.
+.
+.
+.br
+.ne 7v
+.\" ====================================================================
+.SS Strings
+.\" ====================================================================
+.
+The following strings are defined for use in man pages.
+.
+_ifnotstyle()dnl
+None of these is necessary in a contemporary man page;
+see
+.MR groff_man_style @MAN7EXT@ .
+_endif()dnl
+.
+Others are supported for configuration of rendering parameters;
+see section \(lqOptions\(rq below.
+.
+.
+.TP
+.B \e*R
+interpolates a special character escape sequence for the \(lqregistered
+sign\(rq glyph,
+.BR \e(rg ,
+if available,
+and \(lq(Reg.)\(rq otherwise.
+.
+.
+.
+.TP
+.B \e*S
+interpolates an escape sequence setting the type size to the document
+default.
+.
+.
+.TP
+.B \e*(lq
+.TQ
+.B \e*(rq
+interpolate special character escape sequences for left and right
+double-quotation marks,
+.B \e(lq
+and
+.BR \e(rq ,
+respectively.
+.
+.
+.TP
+.B \e*(Tm
+interpolates a special character escape sequence for the \(lqtrade mark
+sign\(rq glyph,
+.BR \e(tm ,
+if available,
+and \(lq(TM)\(rq otherwise.
+_ifstyle()dnl
+.
+.
+.P
+None of the above is necessary in a contemporary man page.
+.
+.B \e*S
+is superfluous,
+since type size changes are invisible on terminal devices and macros
+that change it restore its original value afterward.
+.
+Better alternatives exist for the rest;
+simply use the
+.BR \(rs(rg , \" Heirloom Doctools, mandoc, neatmkfn, Plan 9, Solaris
+.BR \(rs(lq , \" Heirloom Doctools, mandoc, neatmkfn, Plan 9
+.BR \(rs(rq , \" Heirloom Doctools, mandoc, neatmkfn, Plan 9
+and
+.B \(rs(tm \" Heirloom Doctools, mandoc, neatmkfn, Plan 9
+special character escape sequences directly.
+.
+Unless a man page author is aiming for a pathological level of
+portability,
+such as the composition of pages for consumption on simulators of 1980s
+Unix systems
+(or Solaris
+.IR troff ,
+though even it supports
+.BR \(rs(rg ),
+the above strings should be avoided.
+.
+.
+.\" ====================================================================
+.SS Portability
+.\" ====================================================================
+.
+It is wise to quote multi-word section and subsection headings;
+the
+.B .SH
+and
+.B .SS
+macros of
+.MR man 7
+implementations descended from Seventh Edition Unix supported six
+arguments at most.
+.
+A similar restriction applied to the
+.BR .B ,
+.BR .I ,
+.BR .SM ,
+and font style alternation macros.
+.
+.
+.P
+The two major syntactical categories for formatting control in the
+.I roff
+language are requests and escape sequences.
+.
+Since the
+.I man
+macros are implemented in terms of
+.I groff
+requests and escape sequences,
+one can,
+in principle,
+supplement the functionality of
+.I man
+with these lower-level elements where necessary.
+.
+.
+.br
+.ne 2v
+.P
+However,
+using raw
+.I groff
+requests
+(apart from the empty request
+.RB \(lq . \(rq)\&
+is likely to make your page render poorly when processed by other tools;
+many of these attempt to interpret page sources directly for conversion
+to HTML.
+.
+Some requests make implicit assumptions about things like character
+and page sizes that may not hold in an HTML environment;
+also,
+many of these viewers don't interpret the full
+.I groff
+vocabulary,
+a problem that can lead to portions of your text being omitted
+or presented incomprehensibly.
+.
+.
+.P
+For portability to modern viewers,
+it is best to write your page solely with the macros described in this
+page
+(except for the ones identified as deprecated,
+which should be avoided).
+.
+The macros we have described as extensions
+.RB ( .EX / .EE ,
+.BR .SY / .YS ,
+.BR .TQ ,
+.BR .UR / .UE ,
+.BR .MT / .ME ,
+.BR .MR ,
+and
+.BR .SB )
+should be used with caution,
+as they may not be built in to some viewer that is important to your
+audience.
+.
+See
+.I \%an\-ext.tmac
+in section \(lqFiles\(rq below.
+.
+.
+.P
+Similar caveats apply to escape sequences.
+.
+Some escape sequences are however required for correct typesetting
+even in man pages and usually do not cause portability problems.
+.
+Several of these render glyphs corresponding to punctuation code points
+in the Unicode basic Latin range
+(U+0000\(enU+007F)
+that are handled specially in
+.I roff
+input;
+the escape sequences below must be used to render them correctly and
+portably when documenting material that uses them
+syntactically\(emnamely,
+any of the set
+.B \(aq \- \(rs \(ha \(ga \(ti
+(apostrophe,
+dash or minus,
+backslash,
+caret,
+grave accent,
+tilde).
+.
+.
+.br
+.ne 2v
+.TP
+.B \e\(dq
+Comment.
+.
+Everything after the double-quote to the end of the input line is
+ignored.
+.
+Whole-line comments should be placed immediately after the empty request
+.RB (\(lq . \(rq).
+.
+.
+.TP
+.BI \e newline
+Join the next input line to the current one.
+.
+Except for the update of the input line counter
+(used for diagnostic messages and related purposes),
+a series of lines ending in backslash-newline appears to
+.I groff
+as a single input line.
+.
+Use this escape sequence to split excessively long input lines for
+document maintenance.
+.
+.
+.TP
+.B \e%
+Control hyphenation.
+.
+The location of this escape sequence within a word marks a hyphenation
+point,
+supplementing
+.IR groff 's
+automatic hyphenation patterns.
+.
+At the beginning of a word,
+it suppresses any hyphenation breaks within
+.I except
+those specified with
+.BR \e% .
+.
+.
+.TP
+.B \e:
+Insert a non-printing break point.
+.
+A word can break at such a point,
+but a hyphen glyph is not written to the output if it does.
+.
+This escape sequence is an input word boundary,
+so the remainder of the word is subject to hyphenation as normal.
+.
+You can use
+.B \e:
+and
+.B \e%
+in combination to control breaking of a file name or URI or to permit
+hyphenation only after certain explicit hyphens within a word.
+.
+See subsection \[lq]Hyperlink macros\[rq] above for an example.
+.
+.
+.IP
+This escape sequence is a
+.I groff
+extension also supported by Heirloom Doctools
+.I troff \" Heirloom
+050915 (September 2005),
+.I mandoc
+1.14.5 (2019-03-10),
+and
+.I neatroff
+(commit 399a4936,
+2014-02-17),
+but not by Plan\~9,
+Solaris,
+or Documenter's Workbench
+.IR troff s. \" Plan 9, Solaris, DWB
+.\" as of this writing, 2022-08-13
+.
+.
+.TP
+.B \e\(ti
+Adjustable non-breaking space.
+.
+Use this escape sequence to prevent a break inside a short phrase or
+between a numerical quantity and its corresponding unit(s).
+.
+.
+.RS
+.IP
+.EX
+Before starting the motor,
+set the output speed to\e\(ti1.
+There are 1,024\e\(tibytes in 1\e\(tiKiB.
+CSTR\e\(ti#8 documents the B\e\(tilanguage.
+.EE
+.RE
+.
+.
+.\" BEGIN Keep in sync with groff.texi node "Other Differences" and
+.\" groff_diff(7).
+.IP
+This escape sequence is a
+.I groff
+extension also supported by Heirloom Doctools
+.I troff \" Heirloom
+050915 (September 2005),
+.I mandoc
+1.9.5 (2009-09-21),
+.I neatroff
+(commit 1c6ab0f6e,
+2016-09-13),
+and
+Plan\~9 from User Space
+.I troff \" Plan 9
+(commit 93f8143600,
+2022-08-12),
+but not by Solaris
+or Documenter's Workbench
+.IR troff s. \" Solaris, DWB
+.\" as of this writing, 2022-08-13
+.\" END Keep in sync with groff.texi node "Other Differences" and
+.\" groff_diff(7).
+.
+.
+.TP
+.B \e&
+Dummy character.
+.
+Insert at the beginning of an input line to prevent a dot or apostrophe
+from being interpreted as beginning a
+.I roff
+control line.
+.
+Append to an end-of-sentence punctuation sequence to keep it from being
+recognized as such.
+.
+.
+.TP
+.B \e|
+Thin space
+(one-sixth em on typesetters,
+zero-width on terminals);
+a non-breaking space.
+.
+Used primarily in ellipses
+(\(lq.\e|.\e|.\(rq)
+to space the dots more pleasantly on typesetting devices like
+.BR dvi ,
+.BR pdf ,
+and
+.BR ps .
+.
+.
+.TP
+.B \ec
+End a text line without inserting space or attempting a break.
+.
+.\" TODO: When we explain what a "sentence" is, move this parenthetical
+.\" there.
+Normally,
+if filling is enabled,
+the end of a text line is treated like a space;
+.\" end-of-sentence detection is performed, and...
+an output line
+.I may
+be broken there
+(if not,
+an adjustable space is inserted);
+if filling is disabled,
+the line
+.I will
+be broken there,
+as in
+.BR .EX / .EE
+examples.
+.
+The next line is interpreted as usual and can `include' a macro call
+(contrast with
+.BI \e newline\/\c
+).
+.
+.B \(rsc
+is useful when three font styles are
+needed in a single word,
+as in a command synopsis.
+.
+.
+.RS
+.IP
+.\" from contrib/pdfmark/pdfroff.1.man
+.EX
+\&.RB [ \e\-\e\-stylesheet=\ec
+\&.IR name ]
+.EE
+.RE
+.
+.
+.IP
+It also helps when changing font styles in
+.BR .EX / .EE
+examples,
+since they are not filled.
+.
+.
+.RS
+.IP
+.\" from src/devices/grotty/grotty.1.man
+.EX
+\&.EX
+$ \ec
+\&.B groff \e\-T utf8 \e\-Z \ec
+\&.I file \ec
+\&.B | grotty \e\-i
+\&.EE
+.EE
+.RE
+.
+.
+.IP
+Alternatively,
+and perhaps with better portability,
+the
+.B \ef
+font selection escape sequence can be used;
+see below.
+.
+Using
+.B \ec
+to continue a
+.B .TP
+paragraph tag across multiple input lines will render incorrectly with
+.I groff
+1.22.3,
+.I mandoc
+1.14.1,
+older versions of these programs,
+and perhaps with some other formatters.
+.
+.
+.TP
+.B \ee
+Format the current escape character on the output;
+widely used in man pages to render a backslash glyph.
+.
+.\" Don't bold the .ec request in this discussion; it's not a major
+.\" topic of _this_ page as it would be in groff(7). Also, we don't
+.\" want to encourage people to mess with this old kludge by drawing
+.\" attention to it.
+It works reliably as long as the \[lq].ec\[rq] request is not used,
+which should never happen in man pages,
+and it is slightly more portable than the more explicit
+.B \e(rs
+(\(lqreverse solidus\(rq) special character escape sequence.
+.
+.
+.TP
+.BR \efB ,\~ \efI ,\~ \efR ,\~ \efP
+Switch to bold,
+italic,
+roman,
+or back to the previous style,
+respectively.
+.
+Either
+.B \ef
+or
+.B \ec
+is needed when three different font styles are required in a word.
+.
+.
+.RS
+.IP
+.\" second example from contrib/pdfmark/pdfroff.1.man
+.EX
+\&.RB [ \e\-\e\-reference\e\-dictionary=\efI\e,name\e/\efP ]
+.IP
+\&.RB [ \e\-\e\-reference\e\-dictionary=\ec
+\&.IR name ]
+.EE
+.RE
+.
+.
+.IP
+Style escape sequences may be more portable than
+.BR \ec .
+.
+As shown above,
+it is up to you to account for italic corrections with
+.\" Normally we don't quote escape sequences, but these use
+.\" potentially-confusing prose punctuation.
+.RB \(lq \^\e\|/\^ \(rq
+and
+.RB \(lq \^\e\^, \(rq,
+which are themselves GNU extensions,
+if desired and if supported by your implementation.
+.
+.
+.IP
+.B \efP
+reliably returns to the style in use immediately preceding the
+previous
+.B \ef
+escape sequence only if no
+sectioning,
+paragraph,
+or style macro calls have intervened.
+.
+.
+.IP
+As long as at most two styles are needed in a word,
+style macros like
+.B .B
+and
+.B .BI
+usually result in more readable
+.I roff
+source than
+.B \ef
+escape sequences do.
+.
+.
+.P
+Several special characters are also widely portable.
+.\" meaning: groff, Heirloom Doctools troff, neatroff, mandoc
+.
+Except for
+.BR \[rs]\- ,
+.BR \[rs](em ,
+and
+.BR \[rs](ga ,
+AT&T
+.I troff
+did not consistently `define' the characters listed below,
+.\" Only \-, \(em, and \(ga were documented in CSTR #54 (1976). CSTR
+.\" #54 (1992) offers no _comprehensive_ list but shows \(en in its
+.\" PostScript DESC file example. In DWB 3.3, \(aq was supported by the
+.\" "post" device, and \(dq by "pcl" and "Latin1".
+but its descendants,
+like Plan\~9 or Solaris
+.IR troff , \" Plan 9, Solaris
+can be made to support them by defining them in font description files,
+making them aliases of existing glyphs if necessary;
+see
+.MR groff_font @MAN5EXT@ .
+.
+.
+.TP
+.B \e\-
+Minus sign or basic Latin hyphen-minus.
+.
+This escape sequence produces the Unix command-line option dash in the
+output.
+.
+.RB \(lq \- \(rq
+is a hyphen in the
+.I roff
+language;
+some output devices replace it with U+2010
+(hyphen)
+or similar.
+.
+.
+.TP
+.B \e(aq
+Basic Latin neutral apostrophe.
+.
+Some output devices format
+.RB \(lq\| \(aq \|\(rq
+as a right single quotation mark.
+.
+.
+.br
+.ne 3v
+.TP
+.B \e(oq
+.TQ
+.B \e(cq
+Opening (left) and closing (right) single quotation marks.
+.
+Use these for paired directional single quotes,
+\(oqlike this\(cq.
+.
+.
+.TP
+.B \e(dq
+Basic Latin quotation mark
+(double quote).
+.
+Use in macro calls to prevent
+.\" This page prefers double quotes, but not here because they are more
+.\" confusing to the eye when another double quote is what is quoted!
+.RB \(oq\| \(dq \|\(rq
+.\" AT&T: .RB ` """'
+from being interpreted as beginning a quoted argument,
+or simply for readability.
+.
+.
+.RS
+.IP
+.\" from src/preproc/eqn/eqn.1.man
+.EX
+\&.TP
+\&.BI \(dqsplit \e(dq\(dq text \e(dq
+.EE
+.RE
+.
+.
+.br
+.\" XXX: We need only 2v, but 2v more are necessary due to bad
+.\" interaction with TP's own use of the ne request.
+.ne 4v
+.TP
+.B \e(lq
+.TQ
+.B \e(rq
+Left and right double quotation marks.
+.
+Use these for paired directional double quotes,
+\(lqlike this\(rq.
+.
+.
+.TP
+.B \e(em
+Em-dash.
+.
+Use for an interruption\(emsuch as this one\(emin a sentence.
+.
+.
+.TP
+.B \e(en
+En-dash.
+.
+Use to separate the ends of a range,
+particularly between numbers;
+for example,
+\(lqthe digits 1\(en9\(rq.
+.
+.
+.TP
+.B \e(ga
+Basic Latin grave accent.
+.
+Some output devices format
+.RB \(lq\| \(ga \|\(rq
+as a left single quotation mark.
+.
+.
+.TP
+.B \e(ha
+Basic Latin circumflex accent
+(\(lqhat\(rq).
+.
+Some output devices format
+.RB \(lq \(ha \(rq
+as U+02C6
+(modifier letter circumflex accent)
+or similar.
+.
+.
+.TP
+.B \e(rs
+Reverse solidus
+(backslash).
+.
+The backslash is the default escape character in the
+.I roff
+language,
+so it does not represent itself in output.
+.
+Also see
+.B \ee
+above.
+.
+.
+.TP
+.B \e(ti
+Basic Latin tilde.
+.
+Some output devices format
+.RB \(lq \(ti \(rq
+as U+02DC
+(small tilde)
+or similar.
+.
+.
+.P
+For maximum portability,
+escape sequences and special characters not listed above are better
+avoided in man pages.
+_endif()dnl
+.
+.
+.\" ====================================================================
+.SS Hooks
+.\" ====================================================================
+.
+Two macros,
+both GNU extensions,\" from groff 1.19
+are called internally by the
+.I groff man
+package to format page headers and footers and can be redefined by the
+administrator in a site's
+.I man.local
+file
+(see section \(lqFiles\(rq below).
+.
+The presentation of
+.B .TH
+above describes the default headers and footers.
+.
+Because these macros are hooks for
+.I groff man
+internals,
+man pages have no reason to call them.
+.
+Such hook definitions will likely consist of \[lq].sp\[rq] and
+\[lq].tl\[rq] requests.
+.
+They must also increase the page length with \[lq].pl\[rq] requests in
+continuous rendering mode;
+.B .PT
+furthermore has the responsibility of emitting a PDF bookmark after
+writing the first page header in a document.
+.
+Consult the existing implementations in
+.I an.tmac
+when drafting replacements.
+.
+.
+.TP
+.B .BT
+Set the page footer text
+(\(lqbottom trap\(rq).
+.
+.
+.TP
+.B .PT
+Set the page header text
+(\(lqpage trap\(rq).
+.
+.
+.P
+To remove a page header or footer entirely,
+`define' the appropriate macro as empty rather than deleting it.
+.
+.
+.\" ====================================================================
+.SS "Deprecated features"
+.\" ====================================================================
+.
+Use of the following in man pages for public distribution is
+discouraged.
+.
+.
+.TP
+.BR .AT " ["\c
+.IR system " [" release ]]
+Alter the footer for use with legacy AT&T man pages,
+overriding any definition of the
+.I footer-inside
+argument to
+.BR .TH .
+.
+This macro exists only to render man pages from historical systems.
+.
+.
+.IP
+.I system
+can be any of the following.
+.
+.
+.RS \" Invisibly move left margin to current .IP indentation.
+.RS \" Now indent further, visibly.
+.TP
+3
+7th edition
+.I (default)
+.
+.
+.TP
+4
+System III
+.
+.
+.TP
+5
+System V
+.RE \" Move left margin back to .IP indentation.
+.RE \" Move left margin back to standard position.
+.
+.
+.IP
+The optional
+.I release
+argument specifies the release number,
+as in \(lqSystem\~V Release\~3\(rq.
+.
+.
+.TP
+.B .DT
+Reset tab stops to the default
+_ifnotstyle()dnl
+(every 0.5i).
+_endif()dnl
+_ifstyle()dnl
+(every 0.5i [inches]).
+_endif()dnl
+.
+.IP
+Use of this presentation-oriented macro is deprecated.
+.
+It translates poorly to HTML,
+under which exact space control and tabulation are not readily
+available.
+.
+Thus,
+information or distinctions that you use tab stops to express are likely
+to be lost.
+.
+If you feel tempted to change the tab stops such that calling this macro
+later is desirable to restore them,
+you should probably be composing a table using
+.MR @g@tbl @MAN1EXT@
+instead.
+.
+.
+.TP
+.BR .HP " ["\c
+.IR indentation ]
+Set up a paragraph with a hanging left indentation.
+.
+The
+.I indentation
+argument,
+if present,
+is handled as with
+.BR .TP .
+.
+.
+.IP
+Use of this presentation-oriented macro is deprecated.
+.
+A hanging indentation cannot be expressed naturally under HTML,
+and
+.RI non- roff -based
+man page interpreters may treat
+.B .HP
+as an ordinary paragraph.
+.
+Thus,
+information or distinctions you mean to express with indentation may be
+lost.
+.
+.
+.TP
+.BI .OP " option-name"\/\c
+.RI " [" option-argument ]
+Indicate an optional command parameter called
+.IR option-name ,
+which is set in bold.
+.
+If the option takes an argument,
+specify
+.I option-argument
+using a noun,
+abbreviation,
+or hyphenated noun phrase.
+.
+If present,
+.I option-argument
+is preceded by a space and set in italics.
+.
+Square brackets in roman surround both arguments.
+.
+.
+.IP
+Use of this quasi-semantic macro,
+.\" https://github.com/n-t-roff/DWB3.3/blob/master/macros/man/an.sr#L37
+an extension originating in Documenter's Workbench
+.IR troff ,\" DWB
+is deprecated.
+.
+It cannot easily be used to annotate options that take optional
+arguments or options whose arguments have internal structure
+(such as a mixture of literal and variable components).
+.
+One could work around these limitations with font selection escape
+sequences,
+but it is preferable to use font style alternation macros,
+which afford greater flexibility.
+.
+.
+.TP
+.BR .PD " ["\c
+.IR vertical-space ]
+Define the vertical space between paragraphs or (sub)sections.
+.
+The optional argument
+.I vertical-space
+specifies the amount;
+the default scaling unit is \(lqv\(rq.
+.
+Without an argument,
+the spacing is reset to its default value;
+see subsection \(lqHorizontal and vertical spacing\(rq above.
+.
+.
+.IP
+Use of this presentation-oriented macro is deprecated.
+.
+It translates poorly to HTML,
+under which exact control of inter-paragraph spacing is not readily
+available.
+.
+Thus,
+information or distinctions that you use
+.B .PD
+to express are likely to be lost.
+.
+.
+.TP
+.BR .UC " ["\c
+.IR version ]
+Alter the footer for use with legacy BSD man pages,
+overriding any definition of the
+.I footer-inside
+argument to
+.BR .TH .
+.
+This macro exists only to render man pages from historical systems.
+.
+.
+.IP
+.I version
+can be any of the following.
+.
+.
+.RS \" Invisibly move left margin to current .IP indentation.
+.RS \" Now indent further, visibly.
+.TP
+3
+3rd Berkeley Distribution
+.I (default)
+.
+.
+.TP
+4
+4th Berkeley Distribution
+.
+.
+.TP
+5
+4.2 Berkeley Distribution
+.
+.
+.TP
+6
+4.3 Berkeley Distribution
+.
+.
+.TP
+7
+4.4 Berkeley Distribution
+.RE \" Move left margin back to .IP indentation.
+.RE \" Move left margin back to standard position.
+.
+.
+.\" ====================================================================
+.SS History
+.\" ====================================================================
+.
+.MT m.douglas.mcilroy@dartmouth.edu
+M.\& Douglas McIlroy
+.ME
+designed,
+implemented,
+and documented the AT&T
+.I man
+macros
+for
+Unix Version\~7 (1979) and employed them
+to edit the first volume of its
+.IR "Programmer's Manual" ,
+a compilation of all man pages supplied by the system.
+.
+That
+.I man
+supported the macros listed in this page not described as extensions,
+except
+.B .P
+.\" .SS was implemented in tmac.an but not documented in man(7).
+and the deprecated
+.B .AT
+and
+.BR .UC .
+.
+The only strings defined were
+.B R
+and
+.BR S ;
+no registers were documented.
+.
+.
+.P
+.B .UC
+appeared in 3BSD (1980).
+.
+.\" per https://archive.org/details/\
+.\" bitsavers_attunixSysalRelease3Jun80_33886798
+Unix System\~III (1980) introduced
+.B .P
+.\" ...and de-documented .LP...
+and exposed the registers
+.B IN
+and
+.BR LL ,
+.\" ...as well as \n[PD], which we implement but don't expose.
+which had been internal to Seventh Edition Unix
+.IR man .
+.
+.\" This inference is based on RCS idents of "PWB Manual Entry Macros"
+.\" from various forms of "an.src" distributed with System III (an.src
+.\" 1.35, dated 5/6/80, lacks the Tm string), Research Unix Version 10
+.\" (1.36, dated 11/11/80, has it), Ultrix 3.1 (1.37, dated 12/19/80,
+.\" retains it) and "pdp11v" (also 1.37). One source (S. S. Pirzada)
+.\" says PWB 2.0 was released in June 1979. I found no record of later
+.\" releases and cannot account for the discrepancy (field updates?).
+.\" -- GBR
+PWB/UNIX 2.0 (1980) added the
+.B Tm
+string.
+.
+4BSD (1980) added
+.\" undocumented .VS and .VE macros to mark regions with 12-point box
+.\" rules (\[br]) as margin characters, as well as...
+.B lq
+and
+.B rq
+strings.
+.
+.\" The SunOS inferences here and below are based on inspection of SunOS
+.\" 2.0 (May 1985), 3.2 (September 1986), 3.5 (January 1988), and 4.0
+.\" (December 1988) tape archives (only).
+SunOS\~2.0 (1985) recognized
+.BR C ,
+.BR D ,
+.BR P ,
+and
+.B X
+registers.
+.
+4.3BSD (1986) added
+.\" undocumented .DS and .DE macros for "displays", which are .RS/.RE
+.\" wrappers with filling disabled and vertical space of 1v before and
+.\" .5v after, as well as...
+.B .AT
+and
+.BR .P .
+.
+.\" Per Doug McIlroy in
+.\" <https://lists.gnu.org/archive/html/groff/2019-07/msg00038.html>...
+Ninth Edition Research Unix (1986) introduced
+.B .EX
+and
+.BR .EE .
+.
+SunOS\~4.0 (1988) added
+.BR .SB .
+.
+.
+.P
+The foregoing features were what James Clark implemented in early
+versions of
+.IR groff .
+.
+.
+Later,
+.I groff
+1.20 (2009) originated
+.BR .SY / .YS ,
+.BR .TQ ,
+.BR .MT / .ME ,
+and
+.BR .UR / .UE .
+.\" ...along with implementations of OP, EX, and EE.
+.
+Plan\~9 from User Space's
+.I troff \" plan9port
+introduced
+.B .MR
+in 2020.
+.\" https://github.com/9fans/plan9port/commit/\
+.\" 977b25a76ae8263e53fb4eb1abfc395769f23e3d
+.\" d32deab17bfffa5bffc5fab3e6577558e40888c5
+.\" 36cd4c58c1346375b98f517fb8568be5bb47618d
+.
+.
+.br
+.ne 4v
+.\" ====================================================================
+.SH Options
+.\" ====================================================================
+.
+The following
+.I groff
+options set registers
+(with
+.BR \-r )
+and strings
+(with
+.BR \-d )
+recognized and used by the
+.I man
+macro package.
+.
+To ensure rendering consistent with output device capabilities and
+reader preferences,
+man pages should never manipulate them.
+.
+.
+.TP
+.BI \-dAD= adjustment-mode
+Set line adjustment to
+.I adjustment-mode,
+which is typically
+.RB \[lq] b \[rq]
+for adjustment to both margins
+(the default),
+or
+.RB \[lq] l \[rq]
+for left alignment
+(ragged right margin).
+.
+Any valid argument to
+.IR groff 's
+\[lq].ad\[rq] request may be used.
+.
+See
+.MR groff @MAN7EXT@
+for less-common choices.
+.
+.
+.TP
+.B \-rcR=1
+Enable continuous rendering.
+.
+Output is not paginated;
+instead,
+one
+(potentially very long)
+page is produced.
+.
+This is the default for terminal and HTML devices.
+.
+Use
+.B \-rcR=0
+to disable it on terminal devices;
+on HTML devices,
+it cannot be disabled.
+.
+.
+.TP
+.B \-rC1
+Number output pages consecutively,
+in strictly increasing sequence,
+rather than resetting the page number to\~1
+(or the value of register
+.BR P )
+with each new
+.I man
+document.
+.
+.
+.TP
+.B \-rCS=1
+Set section headings
+(the argument(s) to
+.BR .SH )
+in full capitals.
+.
+This transformation is off by default because it discards case
+distinction information.
+.
+.
+.TP
+.B \-rCT=1
+Set the man page topic
+(the first argument to
+.BR .TH )
+in full capitals in headers and footers.
+.
+This transformation is off by default because it discards case
+distinction information.
+.
+.
+.TP
+.B \-rD1
+Enable double-sided layout,
+formatting footers for even and odd pages differently;
+see the description of
+.B .TH
+in subsection \(lqDocument structure macros\(rq above.
+.
+.
+.TP
+.BI \-rFT= footer-distance
+Set distance of the footer relative to the bottom of the page to
+.I footer-distance;
+this amount is always negative.
+.
+At one half-inch above this location,
+the page text is broken before writing the footer.
+.
+Ignored if continuous rendering is enabled.
+.
+The default is \-0.5i.
+.
+.
+.TP
+.BI \-dHF= heading-font
+Set the font used for section and subsection headings;
+the default is
+.RB \(lq B \(rq
+(bold style of the default family).
+.
+Any valid argument to
+.IR groff 's
+\[lq].ft\[rq] request may be used.
+.
+See
+.MR groff @MAN7EXT@ .
+.
+.
+.TP
+.B \-rHY=0
+Disable automatic hyphenation.
+.
+Normally,
+it is enabled\~(1).
+.
+The hyphenation mode is determined by the
+.I groff
+locale;
+see section \[lq]Localization\[lq] of
+.MR groff @MAN7EXT@ .
+.
+.
+.TP
+.BI \-rIN= standard-indentation
+Set the amount of indentation used for ordinary paragraphs
+.RB ( .P
+and its synonyms)
+and the default indentation amount used by
+.BR .IP ,
+.BR .RS ,
+.BR .TP ,
+.\" .TQ inherits its indentation from the preceding .TP.
+and the deprecated
+.BR .HP .
+.
+See subsection \(lqHorizontal and vertical spacing\(rq above for the
+default.
+.
+For
+terminal devices,
+.I standard-indentation
+should always be an integer multiple of unit \(lqn\(rq to get consistent
+indentation.
+.
+.
+.TP
+.BI \-rLL= line-length
+Set line length;
+the default is 78n for terminal devices
+and 6.5i for typesetting devices.
+.
+.
+.TP
+.BI \-rLT= title-length
+Set the line length for titles.
+_ifstyle()dnl
+.
+(\(lqTitles\(rq is the
+.I roff
+term for headers and footers.)
+_endif()dnl
+.
+By default,
+it is set to the line length
+(see
+.B \-rLL
+above).
+.
+.
+.TP
+.BI \-dMF= man-page-topic-font
+Set the font used for man page topics named in
+.B .TH
+and
+.B .MR
+calls;
+the default is
+.RB \(lq I \(rq
+(italic style of the default family).
+.
+Any valid argument to
+.IR groff 's
+\[lq].ft\[rq] request may be used.
+.
+If the
+.B MF
+string ends in \[lq]I\[rq],
+it is assumed to be an oblique typeface,
+and italic corrections are applied before and after man page topics.
+.
+.
+.TP
+.BI \-rP n
+Start enumeration of pages at
+.IR n .
+.
+The default is\~1.
+.
+.
+.TP
+.BI \-rS type-size
+Use
+.I type-size
+for the document's body text;
+acceptable values are 10,
+11,
+or 12 points.
+.
+See subsection \(lqFont style macros\(rq above for the default.
+.
+.
+.TP
+.BI \-rSN= subsection-indentation
+Set indentation of subsection headings to
+.I subsection-indentation.
+.
+See subsection \(lqHorizontal and vertical spacing\(rq above for the
+default.
+.
+.
+.br
+.ne 4v
+.TP
+.B \-rU1
+Enable generation of URI hyperlinks in the
+.I grohtml
+and
+.I grotty
+output drivers.
+.
+.I grohtml
+enables them by default;
+.I grotty
+does not,
+pending more widespread pager support for OSC\~8 escape sequences.
+.
+Use
+.B \-rU0
+to disable hyperlinks;
+this will make the arguments to
+.B MT
+and
+.B UR
+calls visible in the document text produced by link-capable drivers.
+.
+.
+.TP
+.BI \-rX p
+Number successors of
+.RI page\~ p
+as
+.IR p a,
+.IR p b,
+.IR p c,
+and so forth.
+.
+The register tracking the suffixed page letter uses format \(lqa\(rq
+(see the \(lq.af\(rq request in
+.MR groff @MAN7EXT@ ).
+.
+_ifstyle()dnl
+For example,
+the option
+.B \-rX2
+produces the following page
+numbers: 1,
+2,
+2a,
+2b,
+\&.\|.\|.\|,
+2aa,
+2ab,
+and so on.
+_endif()dnl
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @MACRODIR@/\:an\:.tmac
+Most
+.I man
+macros are defined in this file.
+.
+It also loads extensions from
+.I \%an\-ext.tmac
+(see below).
+.
+.
+.TP
+.I @MACRODIR@/\:\%andoc\:.tmac
+This brief
+.I groff
+program detects whether the
+.I man
+or
+.I mdoc
+macro package is being used by a document and loads the correct macro
+definitions,
+taking advantage of the fact that pages using them must call
+.B .TH
+or
+.BR .Dd ,
+respectively,
+before any other macros.
+.
+A
+.I man
+program or user typing,
+for example,
+.RB \[lq] "groff \-mandoc page.1" \[rq],
+need not know which package the file
+.I page.1
+uses.
+.
+Multiple man pages,
+in either format,
+can be handled;
+.I \%andoc
+reloads each macro package as necessary.
+.
+.
+.TP
+.I @MACRODIR@/\:\%an\-ext\:.tmac
+Except for
+.BR .SB ,
+definitions of macros described above as extensions
+are contained in this file;
+in some cases,
+they are simpler versions of definitions appearing in
+.IR an.tmac ,
+and are ignored if the formatter is GNU
+.IR troff .\" GNU
+.
+They are written to be compatible with AT&T
+.I troff \" AT&T
+and permissively licensed\(emnot copylefted.
+.
+To reduce the risk of name space collisions,
+string and register names begin only with
+.RB \[lq] m \[rq] .
+.
+We encourage man page authors
+who are concerned about portability to legacy Unix systems
+to copy these definitions into their pages,
+and maintainers of
+.I troff \" generic
+implementations or work-alike systems that format man pages
+to re-use them.
+.
+.
+.IP
+The definitions for these macros are read after a page calls
+.BR .TH ,
+so they will replace any macros of the same names preceding it in your
+file.
+.
+If you use your own implementations of these macros,
+they must be defined after
+.B .TH
+is called to have any effect.
+.
+Furthermore,
+it is wise to `define' such page-local macros
+(if at all)
+after the \(lqName\(rq section to accommodate timid
+.I makewhatis
+or
+.I mandb
+implementations that may give up their scan for indexing material early.
+.
+.
+.TP
+.I @MACRODIR@/\:man\:.tmac
+This is a wrapper that loads
+.IR an.tmac .
+.
+.
+.TP
+.I @MACRODIR@/\:\%mandoc\:.tmac
+This is a wrapper that loads
+.IR \%andoc.tmac .
+.
+.
+.TP
+.I @LOCALMACRODIR@/\:\%man\:\%.local
+Put site-local changes and customizations into this file.
+_ifstyle()dnl
+.
+.
+.RS
+.RS
+.P
+.EX
+\&.\e" Use narrower indentation on terminals and similar.
+\&.if n .nr IN 4n
+\&.\e" Put only one space after the end of a sentence.
+\&.ss 12 0 \e" See groff(@MAN7EXT@).
+\&.\e" Keep pages narrow even on wide terminals.
+\&.if n .if \(rsn[LL]>78n .nr LL 78n
+\&.\e" Ensure hyperlinks are enabled for terminals.
+\&.nr U 1
+.EE
+.RE
+.RE
+.
+.
+.IP
+On multi-user systems,
+it is more considerate to users whose preferences may differ from the
+administrator's to be less aggressive with such settings,
+or to permit their override with a user-specific
+.I man.local
+file.
+.
+Place the requests below at the end of the site-local file to
+manifest courtesy.
+.
+.br
+.ne 3v
+.RS
+.RS
+.EX
+\&.soquiet \eV[XDG_CONFIG_HOME]/man.local
+\&.soquiet \eV[HOME]/.man.local
+.EE
+.RE
+.
+However,
+a security-sandboxed
+.MR man 1 \" such as man-db 2.8.5
+program may lack permission to open such files.
+.RE
+.
+.
+.\" ====================================================================
+.SH Notes
+.\" ====================================================================
+.
+Some tips on troubleshooting your man pages follow.
+.
+.
+.TP
+\(bu Some ASCII characters look funny or copy and paste wrong.
+.
+On devices with large glyph repertoires,
+like UTF-8-capable terminals and PDF,
+several keyboard glyphs are mapped to code points outside the Unicode
+basic Latin range because that usually results in better typography in
+the general case.
+.
+When documenting GNU/Linux command or C language syntax,
+however,
+this translation is sometimes not desirable.
+.
+.
+.IP
+.if t .ne 2v
+.if n .ne 3v \" account for horizontal rule
+.TS
+c c
+rfCB lfCB.
+To get a \(lqliteral\(rq.\|.\|. .\|.\|.should be input.
+_
+\(aq \(rs(aq
+\- \(rs\-
+\(rs \(rs(rs
+\(ha \(rs(ha
+\(ga \(rs(ga
+\(ti \(rs(ti
+_
+.TE
+.
+.
+.IP
+Additionally,
+if a neutral double quote (") is needed in a macro argument,
+you can use
+.B \(rs(dq
+to get it.
+.
+You should
+.I not
+use
+.B \(rs(aq
+for an ordinary apostrophe
+(as in \(lqcan't\(rq)
+or
+.B \(rs\-
+for an ordinary hyphen
+(as in \(lqword-aligned\(rq).
+.
+Review subsection \(lqPortability\(rq above.
+.
+.
+.TP
+\(bu Do I ever need to use an empty macro argument ("")?
+.
+Probably not.
+.
+When this seems necessary,
+often a shorter or clearer alternative is available.
+.
+.
+.IP
+.if t .ne 10v
+.if n .ne 16v \" account for horizontal rules
+.TS
+c c
+lfCB lfCB.
+Instead of.\|.\|. .\|.\|.should be considered.
+_
+\&.TP \(dq\(dq .TP
+_
+\&.BI \(dq\(dq \fIitalic-text bold-text .IB \fIitalic-text bold-text
+_
+\&.TH foo 1 \(dq\(dq \(dqfoo 1.2.3\(dq .TH foo 1 \
+\f(CIyyyy\fP-\f(CImm\fP-\f(CIdd\fP \(dqfoo 1.2.3\(dq
+_
+\&.IP \(dq\(dq 4n .IP
+_
+\&.IP \(dq\(dq 4n .RS 4n
+\fIparagraph .P
+\fR.\|.\|. \fIparagraph
+\fR.\|.\|. .RE
+_
+\&.B one two \(dq\(dq three .B one two three
+.TE
+.
+.
+.IP
+In the title heading
+.RB ( .TH ),
+the date of the page's last revision is more important than packaging
+information;
+it should not be omitted.
+.
+Ideally,
+a page maintainer will keep both up to date.
+.
+.
+.IP
+.B .IP
+is sometimes ill-understood and misused,
+especially when no marker argument is supplied\(eman indentation
+argument is not required.
+.
+By setting an explicit indentation,
+you may be overriding the reader's preference as set with the
+.B \-rIN
+option.
+.
+If your page renders adequately without one,
+use the simpler form.
+.
+If you need to indent multiple (unmarked) paragraphs,
+consider setting an inset region with
+.B .RS
+and
+.B .RE
+instead.
+.
+.
+.IP
+In the last example,
+the empty argument does have a subtly different effect than its
+suggested replacement:
+the empty argument causes an additional space character to be
+interpolated between the arguments \(lqtwo\(rq and \(lqthree\(rq\(embut
+it is a regular breaking space,
+so it can be discarded at the end of an output line.
+.
+It is better not to be subtle,
+particularly with space,
+which can be overlooked in source and rendered forms.
+.
+.
+.TP
+.RB \(bu " .RS" " doesn't indent relative to my indented paragraph."
+.
+The
+.B .RS
+macro sets the left margin;
+that is,
+the position at which an
+.I ordinary
+paragraph
+.RB ( .P
+and its synonyms)
+will be set.
+.
+.BR .IP ,
+.BR .TP ,
+and the deprecated
+.B .HP
+use the same default indentation.
+.
+If not given an argument,
+.B .RS
+moves the left margin by this same amount.
+.
+To create an inset relative to an indented paragraph,
+call
+.B .RS
+repeatedly until an acceptable indentation is achieved,
+or give
+.B .RS
+an indentation argument that is at least as much as the paragraph's
+indentation amount relative to an adjacent
+.B .P
+paragraph.
+.
+See subsection \(lqHorizontal and vertical spacing\(rq above for the
+values.
+.
+.
+.IP
+Another approach you can use with tagged paragraphs is to place an
+.B .RS
+call immediately after the paragraph tag;
+this will also force a break regardless of the width of the tag,
+which some authors prefer.
+.
+Follow-up paragraphs under the tag can then be set with
+.B .P
+instead of
+.BR .IP .
+.
+Remember to use
+.B .RE
+to end the indented region before starting the next tagged paragraph
+(at the appropriate nesting level).
+.
+.
+.TP
+.RB \(bu " .RE" " doesn't move the inset back to the expected level."
+.TQ
+\(bu warning: scaling unit invalid in context
+.TQ
+\(bu warning: register \(aqan\-saved\-margin\c
+.IR n "\(aq not defined"
+.TQ
+\(bu warning: register \(aqan\-saved\-prevailing\-indent\c
+.IR n "\(aq not defined"
+.
+The
+.B .RS
+macro takes an
+.I indentation amount
+as an argument;
+the
+.B .RE
+macro's argument is a specific
+.I inset level.
+.
+.B .RE\~1
+goes to the level before any
+.B .RS
+macros were called,
+.B .RE\~2
+goes to the level of the first
+.B .RS
+call you made,
+and so forth.
+.
+If you desire symmetry in your macro calls,
+simply issue one
+.B .RE
+without an argument
+for each
+.B .RS
+that precedes it.
+.
+.
+.IP
+After calls to the
+.B .SH
+and
+.B .SS
+sectioning macros,
+all relative insets are cleared and calls to
+.B .RE
+have no effect until
+.B .RS
+is used again.
+.
+.
+.TP
+\(bu Do I need to keep typing the indentation in a series of \c
+.BR .IP " calls?"
+.
+Not if you don't want to change it.
+.
+Review subsection \(lqHorizontal and vertical spacing\(rq above.
+.
+.
+.IP
+.if t .ne 5v
+.if n .ne 7v \" account for horizontal rules
+.TS
+c c
+lfCB lfCB.
+Instead of.\|.\|. .\|.\|.should be considered.
+_
+\&.IP \(rs(bu 4n .IP \(rs(bu 4n
+\fIparagraph \fIparagraph
+\&.IP \(rs(bu 4n .IP \(rs(bu
+\fIanother-paragraph \fIanother-paragraph
+_
+.TE
+.
+.
+.TP
+\(bu Why doesn't the package provide a string to insert an ellipsis?
+.
+Examples of ellipsis usage are shown above,
+in subsection \[lq]Command synopsis macros\[rq].
+.
+The idiomatic
+.I roff
+ellipsis is three dots (periods)
+with thin space escape sequences
+.B \[rs]|
+internally separating them.
+.
+Since dots both begin control lines and are candidate end-of-sentence
+characters,
+however,
+it is sometimes necessary to prefix and/or suffix an ellipsis with the
+dummy character escape sequence
+.BR \[rs]& .
+.
+That fact stands even if a string is defined to contain the sequence;
+further,
+if the string ends with
+.BR \[rs]& ,
+end-of-sentence detection is defeated when you use the string at the end
+of an actual sentence.
+.
+(Ending a sentence with an ellipsis is often poor style,
+but not always.)
+.
+A hypothetical string
+.B EL
+that contained an ellipsis,
+but not the trailing dummy character
+.BR \[rs]& ,
+would then need to be suffixed with the latter
+when not ending a sentence.
+.
+.
+.IP
+.if t .ne 5v
+.if n .ne 7v \" account for horizontal rules
+.TS
+C C
+LfCB LfCB.
+Instead of.\|.\|. .\|.\|.do this.
+_
+\&.ds EL \[rs]&.\[rs]|.\[rs]|. Arguments are
+Arguments are .IR src-file\[rs]\[ti] .\[rs]|.\[rs]|.\[rs]&
+\&.IR src-file\[rs]\[ti] \[rs]*(EL\[rs]& .IR dest-dir .
+\&.IR dest-dir .
+_
+.TE
+.
+.
+.IP
+The first column practices a false economy;
+the savings in typing is offset by the cost of obscuring even the
+suggestion of an ellipsis to a casual reader of the source document,
+and reduced portability to
+.RI non- roff
+man page formatters that cannot handle string definitions.
+.
+.
+.IP
+There is an ellipsis code point in Unicode,
+and some fonts have an ellipsis glyph,
+which some man pages have accessed in a non-portable way with the
+font-dependent
+.B \[rs]N
+escape sequence.
+.
+We discourage the use of these;
+on terminals,
+they may crowd the dots into a half-width character cell,
+and will not render at all if the output device doesn't have the glyph.
+.
+In syntax synopses,
+missing ellipses can cause great confusion.
+.
+Dots and space are universally supported.
+.\" XXX: Does an unconditional _preceding_ dummy character cause
+.\" problems?
+_endif()dnl
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+The initial GNU implementation of the
+.I man
+macro package was written by James Clark. \" by 1.01
+.
+Later,
+.MT wl@\:gnu\:.org
+Werner Lemberg
+.ME
+supplied the
+.BR S , \" 1.16
+.BR LT , \" 1.18
+and
+.B cR \" 1.17
+registers,
+the last a 4.3BSD-Reno
+.IR mdoc (7)
+feature.
+.\" "Assume nroff on crt's [sic] only if cR==1"
+.\" https://minnie.tuhs.org/cgi-bin/utree.pl
+.\" ?file=4.3BSD-Reno/share/tmac/tmac.doc
+.
+.MT kollar@\:alltel\:.net
+Larry Kollar
+.ME
+added the
+.BR FT ,
+.BR HY ,
+and
+.B SN
+registers;
+the
+.B HF
+string;
+and the
+.B PT
+and
+.B BT
+macros.
+.
+.MT g.branden\:.robinson@\:gmail\:.com
+G.\& Branden Robinson
+.ME
+implemented the
+.B AD
+and
+.B MF
+strings;
+.BR CS ,
+.BR CT ,
+and
+.B U
+registers;
+and the
+.B MR
+macro. \" all 1.23
+.
+.
+Except for
+.BR .SB , \" Clark, as noted above
+the extension macros were written by
+Lemberg,
+.MT esr@\:thyrsus\:.com
+Eric S.\& Raymond
+.ME ,
+and
+Robinson. \" 1.23: MR
+.
+.
+.br
+.ne 3v
+.P
+This document was originally written for the Debian GNU/Linux system by
+.MT sgk@\:debian\:.org
+Susan G.\& Kleinmann
+.ME .
+.
+It was corrected and updated by Lemberg and Robinson.
+.
+The extension macros were documented by Raymond and Robinson.
+_ifstyle()dnl
+Raymond also originated the portability section,
+to which
+.MT schwarze@\:usta\:.de
+Ingo Schwarze
+.ME
+contributed most of the material on escape sequences.
+_endif()dnl
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.MR @g@tbl @MAN1EXT@ ,
+.MR @g@eqn @MAN1EXT@ ,
+and
+.MR @g@refer @MAN1EXT@
+are preprocessors used with man pages.
+.
+.MR man 1
+describes the man page librarian on your system.
+.
+.MR groff_mdoc @MAN7EXT@
+details the
+.I groff
+version of the BSD-originated alternative macro package for man pages.
+.
+.
+.P
+_ifstyle()dnl
+.MR groff_man @MAN7EXT@ ,
+_endif()dnl
+_ifnotstyle()dnl
+.MR groff_man_style @MAN7EXT@ ,
+_endif()dnl
+.MR groff @MAN7EXT@ ,
+.MR groff_char @MAN7EXT@ ,
+.MR man 7
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_man_7_man_C]
+.do rr *groff_groff_man_7_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/groff_mdoc.7.man b/tmac/groff_mdoc.7.man
new file mode 100644
index 0000000..d161c86
--- /dev/null
+++ b/tmac/groff_mdoc.7.man
@@ -0,0 +1,5375 @@
+'\" t
+.\" groff_mdoc.man
+.\"
+.\" A complete reference of the mdoc macro package for GNU troff.
+.\"
+.\" Based on NetBSD's mdoc.samples.7, version 1.21.
+.\"
+.\"
+.\" Warning: You can't format this file with the old mdoc macros!
+.\"
+.\"
+.\" Copyright (C) 1990, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in
+.\" the documentation and/or other materials provided with the
+.\" distribution.
+.\" 3. [Deleted. See
+.\" ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change]
+.\" 4. Neither the name of the University nor the names of its
+.\" contributors may be used to endorse or promote products derived
+.\" from this software without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS"
+.\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+.\" PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
+.\" CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)mdoc.samples.7 8.2 (Berkeley) 12/30/93
+.\"
+.\" This reference invokes every macro in the package several times and
+.\" is guaranteed to give worst-case performance for an already
+.\" extremely slow package.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_mdoc_7_man_C \n[.cp]
+.cp 0
+.
+.
+.Dd @MDATE@
+.Dt groff_mdoc 7
+.Os groff @VERSION@
+.
+.
+.Sh Name
+.
+.Nm groff_mdoc
+.Nd compose BSD-style manual (man) pages with GNU
+.Xr roff
+.
+.
+.Sh Synopsis
+.
+.Nm groff Fl m Ns Cm doc Ar file No ...
+.
+.
+.Sh Description
+.
+The GNU implementation of the
+.Xr mdoc
+macro package is part of the
+.Xr groff @MAN1EXT@
+document formatting system.
+.
+.Xr mdoc
+is a
+structurally- and semantically-oriented package for writing
+.Ux
+manual pages with
+.Xr @g@troff @MAN1EXT@ .
+.
+Its predecessor,
+the
+.Xr man 7
+package,
+primarily addressed page layout and presentational concerns,
+leaving the selection of fonts and other typesetting details to the
+individual author.
+.
+This discretion has led to divergent styling practices among authors
+using it.
+.
+.
+.Pp
+.Xr mdoc
+organizes its macros into
+.Em domains .
+.
+The
+.Em "page structure domain"
+lays out the page and
+comprises titles,
+section headings,
+displays,
+and lists.
+.
+The
+.Em "general text domain"
+supplies macros to quote or style text,
+or to interpolate common noun phrases.
+.
+The
+.Em "manual domain"
+offers semantic macros corresponding to the terminology used by
+practitioners in discussion of
+.Ux
+commands,
+routines,
+and files.
+.
+Manual domain macros distinguish
+command-line arguments and options,
+function names,
+function parameters,
+pathnames,
+variables,
+cross references to other manual pages,
+and so on.
+.
+These terms are meaningful both to the author and the readers of a
+manual page.
+.
+It is hoped that the resulting increased consistency of the man page
+corpus will enable easier translation to future documentation tools.
+.
+.
+.Pp
+Throughout
+.Ux
+documentation,
+a manual entry is referred to simply as a
+.Dq "man page" ,
+regardless of its length,
+without gendered implication,
+and irrespective of the macro package selected for its composition.
+.
+.
+.Sh "Getting started"
+.
+The
+.Xr mdoc
+package attempts to simplify man page authorship and maintenance without
+requiring mastery of the
+.Xr roff
+language.
+.
+This document presents only essential facts about
+.Xr roff.
+.
+For further background,
+including a discussion of basic typographical concepts like
+.Dq breaking ,
+.Dq filling ,
+and
+.Dq adjustment ,
+see
+.Xr roff @MAN7EXT@ .
+.
+Specialized units of measurement also arise,
+namely
+ens,
+vees,
+inches,
+and points,
+abbreviated
+.Dq n ,
+.Dq v ,
+.Dq i ,
+and
+.Dq p ,
+respectively;
+see section
+.Sx Measurements
+of
+.Xr groff @MAN7EXT@ .
+.
+.
+.Pp
+For brief examples,
+we employ an arrow notation illustrating a transformation of input on
+the left to rendered output on the right.
+.
+Consider the
+.Pf . Ic \&Dq
+macro,
+which double-quotes its arguments.
+.
+.Bl -tag -width ".Dq\ man page" -offset indent -compact
+.It Li ".Dq man page"
+\[->]
+.Dq man page
+.El
+.
+.
+.Ss Usage
+.
+An
+.Xr mdoc
+.Em macro
+is
+.Em called
+by placing the
+.Xr roff
+control character,
+.Ql .\&
+(dot)
+at the beginning of a line followed by its name.
+.\" XXX; All mdoc macro names except Brq, Bro, Brc are 2 characters long
+.\" and thus portable to old troffs. Why the innovation here, when
+.\" `Cq`, `Co`, and `Cc` were available? Try to sell this reform to
+.\" Ingo Schwarze.
+.
+In this document,
+we often discuss a macro name with this leading dot to identify it
+clearly,
+but the dot is
+.Em not
+part of its name.
+.
+Space or tab characters can separate the dot from the macro name.
+.
+Arguments may follow,
+separated from the macro name and each other by spaces,
+but
+.Em not
+tabs.
+.
+The dot at the beginning of the line prepares the formatter to expect a
+macro name.
+.
+A dot followed immediately by a newline is ignored;
+this is called the
+.Em "empty request" .
+.
+To begin an input line with a dot
+(or a neutral apostrophe
+.Ql \[aq] )
+in some context other than a macro call,
+precede it with the
+.Ql \e&
+escape sequence;
+this is a dummy character,
+not formatted for output.
+.
+The backslash is the
+.Xr roff
+escape character;
+it can appear anywhere and it always followed by at least one more
+character.
+.
+If followed by a newline,
+the backslash escapes the input line break;
+you can thus keep input lines to a reasonable length without affecting
+their interpretation.
+.
+.
+.Pp
+Macros in GNU
+.Xr troff
+accept an unlimited number of arguments,
+in contrast to other
+.Xr troff Ns No s
+that often can't handle more than nine.
+.
+In limited cases,
+arguments may be continued or extended on the next input line without
+resort to the
+.Ql \[rs] Ns Em newline
+escape sequence;
+see subsection
+.Sx "Extended arguments"
+below.
+.
+Neutral double quotes
+.Li \[dq]
+can be used to group multiple words into an argument;
+see subsection
+.Sx "Passing space characters in an argument"
+below.
+.
+.
+.Pp
+Most of
+.Xr mdoc Ns No 's
+general text and manual domain macros
+.Em parse
+their argument lists
+for
+.Em callable
+macro names.
+.
+This means that an argument in the list matching a general text or
+manual domain macro name
+(and defined to be callable)
+will be called with the remaining arguments when it is encountered.
+.
+In such cases,
+the argument,
+although the name of a macro,
+is not preceded by a dot.
+.
+Macro calls can thus be nested.
+.
+This approach to macro argument processing is a unique characteristic of
+the
+.Xr mdoc
+package,
+not a general feature of
+.Xr roff
+syntax.
+.
+.
+.Pp
+For example,
+the option macro,
+.Pf . Ic \&Op ,
+may call the flag and argument macros,
+.Pf . Ic \&Fl
+and
+.Pf . Ic \&Ar ,
+to specify an optional flag with an argument.
+.
+.\" Use width of second example below.
+.Bl -tag -width ".Op\ \e&Fl\ s\ \e&Ar bytes" -offset indent -compact
+.It Li ".Op Fl s Ar bytes"
+\[->]
+.Op Fl s Ar bytes
+.El
+.
+To prevent a word from being interpreted as a macro name,
+precede it with the dummy character.
+.
+.Bl -tag -width ".Op\ \e&Fl\ s\ \e&Ar bytes" -offset indent -compact
+.It Li ".Op \e&Fl s \e&Ar bytes"
+\[->]
+.Op \&Fl s \&Ar bytes
+.El
+.
+.
+.Pp
+In this document,
+macros whose argument lists are parsed for callable arguments are
+referred to as
+.Em parsed ,
+and those that may be called from an argument list are referred to as
+.Em callable .
+.
+This usage is a technical
+.Em "faux pas" ,
+since all
+.Xr mdoc
+macros are in fact interpreted
+(unless prevented with
+.Ql \e& ) ,
+but as it is cumbersome to constantly refer to macros as
+.Dq "being able to call other macros" ,
+we employ the term
+.Dq parsed
+instead.
+.
+Except where explicitly stated,
+all
+.Xr mdoc
+macros are parsed and callable.
+.
+.
+.Pp
+In the following,
+we term an
+.Xr mdoc
+macro that starts a line
+(with a leading dot)
+a
+.Em command
+if a distinction from those appearing as arguments of other macros is
+necessary.
+.
+.
+.Ss "Passing space characters in an argument"
+.
+Sometimes it is desirable to give a macro an argument containing one or
+more space characters,
+for instance to specify a particular arrangement of arguments demanded
+by the macro.
+.
+Additionally,
+quoting multi-word arguments that are to be treated the same makes
+.Xr mdoc
+work faster;
+macros that parse arguments do so once
+(at most)
+for each.
+.
+For example,
+the function command
+.Pf . Ic \&Fn
+expects its first argument to be the name of a function and any
+remaining arguments to be function parameters.
+.
+Because C language standards mandate the inclusion of types
+.Em and
+identifiers in the parameter lists of function definitions,
+each
+.Ql \&Fn
+parameter after the first will be at least two words in length,
+as in
+.Dq Ar "int foo" .
+.
+.
+.Pp
+There are a few ways to embed a space in a macro argument.
+.
+One is to use the unadjustable space escape sequence
+.Li \[rs] Ns Em space .
+.
+The formatter treats this escape sequence as if it were any other
+printable character,
+and will not break a line there as it would a word space when the
+output line is full.
+.
+This method is useful for macro arguments that are not expected to
+straddle an output line boundary,
+but has a drawback:
+this space does not adjust as others do when the output line is
+formatted.
+.
+An alternative is to use the unbreakable space escape sequence,
+.Ql \[rs]\[ti] ,
+which cannot break but does adjust.
+.
+This
+.Xr groff
+extension is widely but not perfectly portable.
+.
+Another method is to enclose the string in double quotes.
+.
+.Bl -tag -width ".Fn\ fetch\ \[dq]char\ *str\[dq]" -offset indent \
+-compact
+.It Li ".Fn fetch char\e *str"
+\[->]
+.Fn fetch char\ *str
+.It Li ".Fn fetch char\e\[ti]*str"
+\[->]
+.Fn fetch char\~*str
+.It Li ".Fn fetch \[dq]char *str\[dq]"
+\[->]
+.Fn fetch "char *str"
+.El
+.
+If the
+.Ql \[rs]
+before the space in the first example
+or the double quotes in the third example
+were omitted,
+.Ql .Fn
+would see three arguments,
+and the result would contain an undesired comma.
+.
+.\" Use same width as before so it's easier to see the discrepancy.
+.Bl -tag -width ".Fn\ fetch\ \[dq]char\ *str\[dq]" -offset indent \
+-compact
+.It Li ".Fn fetch char *str"
+\[->]
+.Fn fetch char *str
+.El
+.
+.
+.\".Pp
+.\" For an example of what happens when the parameter list overlaps a
+.\" newline boundary,
+.\" see the
+.\" .Sx Bugs
+.\" section.
+.
+.
+.Ss "Trailing space characters"
+.
+.\" XXX: This claim of confusion is nonsense. The formatter ignores
+.\" them. If mdoc doesn't, that's a bug or design flaw. It's still
+.\" good style not to have them. Whitespace churn makes diff(1) and
+.\" revision control users unhappy.
+.\"
+.\".Xr @g@troff
+.\"can be confused by space characters at the end of a line.
+.
+It is wise to remove trailing spaces from the ends of input lines.
+.
+Should the need arise to put a formattable space at the end of a line,
+do so with the unadjustable or unbreakable space escape sequences.
+.
+.
+.Ss "Formatting the backslash glyph"
+.
+When you need the
+.Xr roff
+escape character
+.Ql \[rs]
+to appear in the output,
+use
+.Ql \[rs]e
+or
+.Ql \[rs](rs
+instead.
+.
+Technically,
+.Ql \[rs]e
+formats the current escape character;
+it works reliably as long as no
+.Xr roff
+request is used to change it,
+which should never happen in man pages.
+.
+.Ql \[rs](rs
+is a
+.Xr groff
+special character escape sequence that explicitly formats the
+.Dq "reverse solidus"
+(backslash) glyph.
+.
+.
+.Ss "Other possible pitfalls"
+.
+.Xr "groff mdoc"
+warns when an empty input line is found outside of a
+.Em display ,
+a topic presented in subsection
+.Sx "Examples and displays"
+below.
+.
+Use empty requests to space the source document for maintenance.
+.
+.
+.Pp
+Leading spaces cause a break and are formatted.
+.
+Avoid this behaviour if possible.
+.
+Similarly,
+do not put more than one space between words in an ordinary text line;
+they are not
+.Dq normalized
+to a single space as other text formatters might do.
+.
+.
+.Pp
+Don't try to use the neutral double quote character
+.Ql \[dq]
+to represent itself in an argument.
+.
+Use the special character escape sequence
+.Ql \[rs](dq
+to format it.
+.\" That's NOT a groffism, but showed up in the "post" and "Latin1"
+.\" devices of Tenth Edition Research Unix.
+.
+Further,
+this glyph should not be used for conventional quotation;
+.Xr mdoc
+offers several quotation macros.
+.
+See subsection
+.Sx "Enclosure and quoting macros"
+below.
+.
+.
+.Pp
+The formatter attempts to detect the ends of sentences and by default
+puts the equivalent of two spaces between sentences on the same output
+line;
+see
+.Xr roff @MAN7EXT@ .
+.
+To defeat this detection in a parsed list of macro arguments,
+put
+.Ql \e&
+before the punctuation mark.
+.
+Thus,
+.
+.Bd -literal -offset indent -compact
+The
+\&.Ql .
+character.
+\&.Pp
+The
+\&.Ql \e&.
+character.
+\&.Pp
+\&.No test .
+test
+\&.Pp
+\&.No test.
+test
+.Ed
+.
+gives
+.
+.Bd -filled -offset indent -compact
+The
+.Ql .
+character
+.
+.
+.Pp
+The
+.Ql \&.
+character.
+.
+.
+.Pp
+.No test .
+test
+.
+.
+.Pp
+.No test.
+test
+.Ed
+.
+as output.
+.
+As can be seen in the first and third output lines,
+.Xr mdoc
+handles punctuation characters specially in macro arguments.
+.
+This will be explained in section
+.Sx "General syntax"
+below.
+.
+.
+.Pp
+A comment in the source file of a man page can begin with
+.Sq Li .\e"
+at the start of an input line,
+.Sq Li \e"
+after other input,
+or
+.Sq Li \e#
+anywhere
+(the last is a
+.Xr groff
+extension);
+the remainder of any such line is ignored.
+.
+.
+.Sh "A man page template"
+.
+Use
+.Xr mdoc
+to construct a man page from the following template.
+.
+.Bd -literal -offset indent
+\&.\e" The following three macro calls are required.
+\&.Dd date
+\&.Dt topic [section-identifier [section-keyword-or-title]]
+\&.Os [package-or-operating system [version-or-release]]
+\&.Sh Name
+\&.Nm topic
+\&.Nd summary-description
+\&.\e" The next heading is used in sections 2 and 3.
+\&.\e" .Sh Library
+\&.\e" The next heading is used in sections 1-4, 6, 8, and 9.
+\&.Sh Synopsis
+\&.Sh Description
+\&.\e" Uncomment and populate the following sections as needed.
+\&.\e" .Sh \[dq]Implementation notes\[dq]
+\&.\e" The next heading is used in sections 2, 3, and 9.
+\&.\e" .Sh \[dq]Return values\[dq]
+\&.\e" The next heading is used in sections 1, 3, 6, and 8.
+\&.\e" .Sh Environment
+\&.\e" .Sh Files
+\&.\e" The next heading is used in sections 1, 6, and 8.
+\&.\e" .Sh \[dq]Exit status\[dq]
+\&.\e" .Sh Examples
+\&.\e" The next heading is used in sections 1, 4, 6, 8, and 9.
+\&.\e" .Sh Diagnostics
+\&.\e" .Sh Compatibility
+\&.\e" The next heading is used in sections 2, 3, 4, and 9.
+\&.\e" .Sh Errors
+\&.\e" .Sh \[dq]See also\[dq]
+\&.\e" .Sh Standards
+\&.\e" .Sh History
+\&.\e" .Sh Authors
+\&.\e" .Sh Caveats
+\&.\e" .Sh Bugs
+.Ed
+.
+.
+.Pp
+The first items in the template are the commands
+.Pf . Ic \&Dd ,
+.Pf . Ic \&Dt ,
+and
+.Pf . Ic \&Os .
+.
+They identify the page and are discussed below in section
+.Sx "Title macros" .
+.
+.
+.Pp
+The remaining items in the template are section headings
+.Pf ( Pf . Ic \&Sh ) ;
+of which
+.Sx Name
+and
+.Sx Description
+are mandatory.
+.
+These headings are discussed in section
+.Sx "Page structure domain" ,
+which follows section
+.Sx "Manual domain" .
+.
+Familiarize yourself with manual domain macros first;
+we use them to illustrate the use of page structure domain macros.
+.
+.
+.Sh Conventions
+.
+In the descriptions of macros below,
+square brackets surround optional arguments.
+.
+An ellipsis
+.Pf ( Sq ... )
+represents repetition of the preceding argument zero or more times.
+.
+Alternative values of a parameter are separated with
+.Ql | .
+.
+If a mandatory parameter can take one of several alternative values,
+use braces to enclose the set,
+with spaces and
+.Ql |
+separating the items.
+.
+.\" XXX: Angle brackets should only be necessary when space doesn't
+.\" separate parameters.
+.\" .
+.\" Metasyntactic variables are specified within angle brackets.
+.\"Bl -tag -width 6n -offset indent -compact
+.Bl -tag -offset indent -compact
+.It Nm ztar Xo
+.Brq Cm c | Cm x
+.Op Fl w Op Fl y | Fl z
+.Op Fl f Ar archive
+.Ar member No ...
+.Xc
+.El
+.
+An alternative to using braces is to separately synopsize distinct
+operation modes,
+particularly if the list of valid optional arguments is dependent on the
+user's choice of a mandatory parameter.
+.
+.Bl -tag -offset indent -compact
+.It Nm ztar Xo
+.Cm c
+.Op Fl w Op Fl y | Fl z
+.Op Fl f Ar archive
+.Ar member No ...
+.Xc
+.It Nm ztar Xo
+.Cm x
+.Op Fl w Op Fl y | Fl z
+.Op Fl f Ar archive
+.Ar member No ...
+.Xc
+.El
+.
+.
+.Pp
+Most macros affect subsequent arguments until another macro or a newline
+is encountered.
+.
+For example,
+.Sq Li ".Li ls Bq Ar file"
+doesn't produce
+.Sq Li "ls [file]" ,
+but
+.Sq Li ls Bq Ar file .
+.
+Consequently,
+a warning message is emitted for many commands if the first argument is
+itself a macro,
+since it cancels the effect of the preceding one.
+.\" XXX: I don't think it is made clear which macros eat only one
+.\" argument and which ones devour tokens until another macro is
+.\" encountered. -- GBR
+.
+On rare occasions,
+you might want to format a word along with surrounding brackets as a
+literal.
+.
+.\" XXX: Why do we need the extra "\ " for the width parameter? Without
+.\" it, the line breaks before the arrow on a 78n terminal. But there
+.\" should be room anyway...bug?
+.\"
+.\" XXX: Arguably, Bq should respect the altered font family in a `Bl`,
+.\" but it sets the brackets and argument in Times roman. Maybe all the
+.\" enclosures work this way.
+.Bl -tag -width "Li\ \[dq]ls\ [file]\[dq]\ " -offset indent -compact
+.It Li ".Li \[dq]ls [file]\[dq]"
+\[->]
+.Li "ls [file]"
+.Em "# list any files named e, f, i, or l"
+.El
+.
+.
+.Pp
+Many macros possess an implicit width,
+used when they are contained in lists and displays.
+.
+If you avoid relying on these default measurements,
+you escape potential conflicts with site-local modifications of the
+.Xr mdoc
+package.
+.
+Explicit
+.Fl width
+and
+.Fl offset
+arguments to the
+.Pf . Ic \&Bl
+and
+.Pf . Ic \&Bd
+macros are preferable.
+.
+.
+.Sh "Title macros"
+.
+We present the
+.Sy mandatory
+title macros first due to their importance even though they formally
+belong to the page structure domain macros.
+.\" XXX: This was formerly "...for someone who wishes to start writing a
+.\" man page yesterday."
+.\"
+.\" Cute joke, but we're 800+ lines into this page source and four pages
+.\" into the document when formatted for U.S. letter paper. We lost
+.\" that kind of reader last _week_.
+.
+They designate the
+topic,
+date of last revision,
+and the operating system or software project associated with the page.
+.
+Call each once at the beginning of the document.
+.
+They populate the page headers and footers,
+which are in
+.Xr roff
+parlance termed
+.Dq titles .
+.
+.
+.Bl -tag -width 6n
+.It Li .Dd Xo
+.Ar date
+.Xc
+This first macro of any
+.Xr mdoc
+manual records the last modification date of the document source.
+.
+Arguments are concatenated and separated with space characters.
+.
+.
+.Pp
+Historically,
+.Ar date
+was written in U.S.\& traditional format,
+.Do
+.\" XXX: Em -> Ar when we de-Courierize .Ar.
+.Em Month day Li , Em year
+.Dc
+where
+.Em Month
+is the full month name in English,
+.Em day
+an integer without a leading zero,
+and
+.Em year
+the four-digit year.
+.
+This localism is not enforced,
+however.
+.
+You may prefer ISO 8601 format,
+.Em YYYY-MM-DD.
+.
+A
+.Ar date
+of the form
+.Sq Li $Mdocdate: Ar Month day year Li $
+is also recognized.
+.
+It is used in
+.Ox
+manuals to automatically insert the current date when committing.
+.
+.
+.Pp
+This macro is neither callable nor parsed.
+.
+.
+.br
+.ne 5v
+.It Li .Dt Ar topic Op Ar section-identifier \
+Op Ar section-keyword-or-title
+.
+.Ar topic
+is the subject of the man page.
+.
+A
+.Ar section-identifier
+that begins with an integer in the range 1\[en]9
+or is one of the words
+.Ql unass ,
+.Ql draft ,
+or
+.Ql paper
+selects a predefined section title.
+.
+This use of
+.Dq section
+has nothing to do with the section headings otherwise discussed in this
+page;
+it arises from the organizational scheme of printed and bound Unix
+manuals.
+.
+.
+.br
+.ne 3v
+.Pp
+In this implementation,
+the following titles are defined for integral section numbers.
+.
+.
+.Bd -unfilled -offset indent
+.TS
+Lf(CR) L.
+1 \*[doc-volume-ds-1]
+2 \*[doc-volume-ds-2]
+3 \*[doc-volume-ds-3]
+4 \*[doc-volume-ds-4]
+5 \*[doc-volume-ds-5]
+6 \*[doc-volume-ds-6]
+7 \*[doc-volume-ds-7]
+8 \*[doc-volume-ds-8]
+9 \*[doc-volume-ds-9]
+.TE
+.Ed
+.
+.
+.Pp
+A section title may be arbitrary or one of the following abbreviations.
+.
+.
+.Bd -unfilled -offset indent
+.TS
+Lf(CR) L.
+USD \*[doc-volume-ds-USD]
+PS1 \*[doc-volume-ds-PS1]
+AMD \*[doc-volume-ds-AMD]
+SMM \*[doc-volume-ds-SMM]
+URM \*[doc-volume-ds-URM]
+PRM \*[doc-volume-ds-PRM]
+KM \*[doc-volume-ds-KM]
+IND \*[doc-volume-ds-IND]
+LOCAL \*[doc-volume-ds-LOCAL]
+CON \*[doc-volume-ds-CON]
+.TE
+.Ed
+.
+.
+.Pp
+For compatibility,
+.Ql MMI
+can be used for
+.Ql IND ,
+and
+.Ql LOC
+for
+.Ql LOCAL .
+.
+Values from the previous table will specify a new section title.
+.
+If
+.Ar section-keyword-or-title
+designates a computer architecture recognized by
+.Xr "groff mdoc" ,
+its value is prepended to the default section title as specified by the
+second parameter.
+.\" mandoc(1) appears to put the architecture string after (or in place
+.\" of) the section title, in parentheses.
+.
+By default,
+the following architecture keywords are defined.
+.
+\# we use 'No' to avoid hyphenation
+.\" Resort to ps/vs violence if necessary because this macro package is
+.\" obsessed with dumping gigantic piles of identifiers on users, and I
+.\" need the space to keep this macro description to a single page in
+.\" PS/PDF(!). Lists of information like this simply beg to bit-rot.
+.\" -- GBR
+.br
+.ps -2
+.vs -2
+.Bd -ragged -offset 4n
+.No acorn26 , acorn32 , algor , alpha , amd64 , amiga , amigappc ,
+.No arc , arm , arm26 , arm32 , armish , atari , aviion ,
+.No beagle , bebox , cats , cesfic , cobalt , dreamcast ,
+.No emips , evbarm , evbmips , evbppc , evbsh3 , ews4800mips ,
+.No hp300 , hp700 , hpcarm , hpcmips , hpcsh , hppa , hppa64 ,
+.No i386 , ia64 , ibmnws , iyonix , landisk , loongson , luna68k ,
+.No luna88k , m68k , mac68k , macppc , mips , mips64 , mipsco , mmeye ,
+.No mvme68k , mvme88k , mvmeppc , netwinder , news68k , newsmips ,
+.No next68k , ofppc , palm , pc532 , playstation2 , pmax , pmppc ,
+.No powerpc , prep , rs6000 , sandpoint , sbmips , sgi , sgimips , sh3 ,
+.No shark , socppc , solbourne , sparc , sparc64 , sun2 , sun3 ,
+.No tahoe , vax , x68k , x86_64 , xen , zaurus
+.Ed
+.vs
+.ps
+.
+.
+.Pp
+If a section title is not determined after the above matches have been
+attempted,
+.Ar section-keyword-or-title
+is used.
+.
+.
+.br
+.ne 10v \" Keep explanatory paragraph with the following table.
+.Pp
+The effects of varying
+.Ql .Dt
+arguments on the page header content
+are shown below.
+.
+Observe how
+.Ql \[rs]&
+prevents the numeral\~2 from being used to look up a predefined section
+title.
+.
+.
+.Pp
+.\" On terminals, 2n is as far as we can offset without overrunning a
+.\" 78n width.
+.Bd -unfilled -offset 2n
+.TS
+tab(@);
+Lf(CR)1 L2 L C R.
+\&.Dt foo 2@\[->]@foo(2)@System Calls Manual@foo(2)
+\&.Dt foo 2 m68k@\[->]@foo(2)@m68k System Calls Manual@foo(2)
+\&.Dt foo 2 baz@\[->]@foo(2)@System Calls Manual@foo(2)
+\&.Dt foo \[rs]&2 baz@\[->]@foo(2)@baz@foo(2)
+\&.Dt foo \[dq]\[dq] baz@\[->]@foo@baz@foo
+\&.Dt foo M Z80@\[->]@foo(M)@Z80@foo(M)
+.TE
+.Ed
+.
+.
+.Pp
+.Xr roff
+strings define section titles and architecture identifiers.
+.
+Site-specific additions might be found in the file
+.Pa mdoc.local ;
+see section
+.Sx Files
+below.
+.
+.
+.Pp
+This macro is neither callable nor parsed.
+.
+.
+.It Li .Os Op Ar operating-system-or-package-name \
+Op Ar version-or-release
+.
+This macro associates the document with a software distribution.
+.
+When composing a man page to be included in the base installation of an
+operating system,
+do not provide an argument;
+.Xr mdoc
+will supply it.
+.
+In this implementation,
+that default is
+.Dq "\*[doc-default-operating-system]" .
+.
+It may be overridden in the site configuration file,
+.Pa mdoc.local ;
+see section
+.Sx Files
+below.
+.
+A portable software package maintaining its own man pages can supply
+its name and version number or release identifier as optional arguments.
+.
+A
+.Em version-or-release
+argument should use the standard nomenclature for the software
+specified.
+.
+In the following table,
+recognized
+.Em version-or-release
+arguments for some predefined operating systems are listed.
+.
+As with
+.Pf . Ic \&Dt ,
+site additions might be defined in
+.Pa mdoc.local .
+.
+.Bd -ragged -compact
+.Bl -tag -width ".No DragonFly" -offset indent
+.It ATT
+7th, 7, III, 3, V, V.2, V.3, V.4
+.It BSD
+3, 4, 4.1, 4.2, 4.3, 4.3t, 4.3T, 4.3r, 4.3R, 4.4
+.It NetBSD
+0.8, 0.8a, 0.9, 0.9a, 1.0, 1.0a, 1.1, 1.2, 1.2a, 1.2b, 1.2c, 1.2d, 1.2e,
+1.3, 1.3a, 1.4, 1.4.1, 1.4.2, 1.4.3, 1.5, 1.5.1, 1.5.2, 1.5.3, 1.6,
+1.6.1, 1.6.2, 1.6.3, 2.0, 2.0.1, 2.0.2, 2.0.3, 2.1, 3.0, 3.0.1, 3.0.2,
+3.0.3, 3.1, 3.1.1, 4.0, 4.0.1, 5.0, 5.0.1, 5.0.2, 5.1, 5.1.2, 5.1.3,
+5.1.4, 5.2, 5.2.1, 5.2.2, 6.0, 6.0.1, 6.0.2, 6.0.3, 6.0.4, 6.0.5, 6.0.6,
+6.1, 6.1.1, 6.1.2, 6.1.3, 6.1.4, 6.1.5, 7.0, 7.0.1, 7.0.2, 7.1, 7.1.1,
+7.1.2, 7.2, 8.0, 8.1
+.It FreeBSD
+1.0, 1.1, 1.1.5, 1.1.5.1, 2.0, 2.0.5, 2.1, 2.1.5, 2.1.6, 2.1.7, 2.2,
+2.2.1, 2.2.2, 2.2.5, 2.2.6, 2.2.7, 2.2.8, 2.2.9, 3.0, 3.1, 3.2, 3.3,
+3.4, 3.5, 4.0, 4.1, 4.1.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.6.2, 4.7, 4.8,
+4.9, 4.10, 4.11, 5.0, 5.1, 5.2, 5.2.1, 5.3, 5.4, 5.5, 6.0, 6.1, 6.2,
+6.3, 6.4, 7.0, 7.1, 7.2, 7.3, 7.4, 8.0, 8.1, 8.2, 8.3, 8.4, 9.0, 9.1,
+9.2, 9.3, 10.0, 10.1, 10.2, 10.3, 10.4, 11.0, 11.1, 11.2, 11.3, 12.0,
+12.1
+.It OpenBSD
+2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.1, 3.2, 3.3,
+3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7,
+4.8, 4.9, 5.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6.0, 6.1,
+6.2, 6.3, 6.4, 6.5, 6.6
+.It DragonFly
+1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.8.1, 1.9, 1.10, 1.11,
+1.12, 1.12.2, 1.13, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9,
+2.9.1, 2.10, 2.10.1, 2.11, 2.12, 2.13, 3.0, 3.0.1, 3.0.2, 3.1, 3.2,
+3.2.1, 3.2.2, 3.3, 3.4, 3.4.1, 3.4.2, 3.4.3, 3.5, 3.6, 3.6.1, 3.6.2,
+3.7, 3.8, 3.8.1, 3.8.2, 4.0, 4.0.1, 4.0.2, 4.0.3, 4.0.4, 4.0.5, 4.0.6,
+4.1, 4.2, 4.2.1, 4.2.2, 4.2.3, 4.2.4, 4.3, 4.4, 4.4.1, 4.4.2, 4.4.3,
+4.5, 4.6, 4.6.1, 4.6.2, 4.7, 4.8, 4.8.1, 4.9, 5.0, 5.0.1, 5.0.2, 5.1,
+5.2, 5.2.1, 5.2.2, 5.3, 5.4, 5.4.1, 5.4.2, 5.4.3, 5.5, 5.6, 5.6.1, 5.6.2
+.It Darwin
+8.0.0, 8.1.0, 8.2.0, 8.3.0, 8.4.0, 8.5.0, 8.6.0, 8.7.0, 8.8.0, 8.9.0,
+8.10.0, 8.11.0, 9.0.0, 9.1.0, 9.2.0, 9.3.0, 9.4.0, 9.5.0, 9.6.0, 9.7.0,
+9.8.0, 10.0.0, 10.1.0, 10.2.0, 10.3.0, 10.4.0, 10.5.0, 10.6.0, 10.7.0,
+10.8.0, 11.0.0, 11.1.0, 11.2.0, 11.3.0, 11.4.0, 11.5.0, 12.0.0, 12.1.0,
+12.2.0, 13.0.0, 13.1.0, 13.2.0, 13.3.0, 13.4.0, 14.0.0, 14.1.0, 14.2.0,
+14.3.0, 14.4.0, 14.5.0, 15.0.0, 15.1.0, 15.2.0, 15.3.0, 15.4.0, 15.5.0,
+15.6.0, 16.0.0, 16.1.0, 16.2.0, 16.3.0, 16.4.0, 16.5.0, 16.6.0, 17.0.0,
+17.1.0, 17.2.0, 17.3.0, 17.4.0, 17.5.0, 17.6.0, 17.7.0, 18.0.0, 18.1.0,
+18.2.0, 18.3.0, 18.4.0, 18.5.0, 18.6.0, 18.7.0, 19.0.0, 19.1.0, 19.2.0
+.El
+.Ed
+.
+.
+.Pp
+Historically,
+the first argument used with
+.Pf . Ic \&Dt
+was
+.Li BSD
+or
+.Li ATT .
+.
+An unrecognized version argument after
+.Li ATT
+is replaced with
+.Dq Ux ;
+for other predefined abbreviations,
+it is ignored and a warning diagnostic emitted.
+.
+Otherwise,
+unrecognized arguments are displayed verbatim in the page footer.
+.
+For instance,
+this page uses
+.Dq Li .Os groff @VERSION@
+whereas a locally produced page might employ
+.Dq Li .Os \[dq]UXYZ CS Department\[dq] ,
+omitting versioning.
+.
+.
+.Pp
+This macro is neither callable nor parsed.
+.El
+.
+.
+.br
+.ne 4v
+.Sh "Introduction to manual and general text domains"
+.
+.
+.Ss "What's in a Name" Ns ... \" XXX: Ns not scrubbed for PDF bookmark
+.
+The manual domain macro names are derived from the day to day informal
+language used to describe commands, subroutines and related files.
+Slightly different variations of this language are used to describe the
+three different aspects of writing a man page.
+First, there is the description of
+.Xr mdoc
+macro command usage.
+Second is the description of a
+.Ux
+command
+.Em with
+.Xr mdoc
+macros, and third, the description of a command to a user in the verbal
+sense; that is, discussion of a command in the text of a man page.
+.
+.
+.Pp
+In the first case,
+.Xr @g@troff
+macros are themselves a type of command;
+the general syntax for a
+.Xr troff
+command is:
+.
+.Bd -filled -offset indent
+.Li ".Xx argument1 argument2" ...
+.Ed
+.
+.
+.Pp
+.
+.Ql .Xx
+is a macro command, and anything following it are arguments to
+be processed.
+In the second case, the description of a
+.Ux
+command using the manual domain macros is a bit more involved;
+a typical
+.Sx Synopsis
+command line might be displayed as:
+.
+.Bd -filled -offset indent
+.Nm filter
+.Op Fl flag
+.Ao Ar infile Ac Ao Ar outfile Ac
+.Ed
+.
+.
+.Pp
+Here,
+.Nm filter
+is the command name and the
+bracketed string
+.Fl flag
+is a
+.Em flag
+argument designated as optional by the option brackets.
+In
+.Xr mdoc
+terms,
+.Ao Ar infile Ac
+and
+.Ao Ar outfile Ac
+are called
+.Em meta arguments ;
+in this example, the user has to replace the meta expressions given in angle
+brackets with real file names.
+Note that in this document meta arguments are used to describe
+.Xr mdoc
+commands; in most man pages, meta variables are not specifically written
+with angle brackets.
+.
+The macros that formatted the above example:
+.
+.Bd -literal -offset indent
+\&.Nm filter
+\&.Op Fl flag
+\&.Ao Ar infile Ac Ao Ar outfile Ac
+.Ed
+.
+.
+.Pp
+In the third case,
+discussion of commands and command syntax includes both examples above,
+but may add more detail.
+.
+The arguments
+.Ao Ar infile Ac
+and
+.Ao Ar outfile Ac
+from the example above might be referred to as
+.Em operands
+or
+.Em file arguments .
+.
+Some command-line argument lists are quite long:
+.
+.Bd -ragged
+.Bl -tag -width ".Nm make" -offset indent -compact
+.It Nm make
+.Op Fl eiknqrstv
+.Op Fl D Ar variable
+.Op Fl d Ar flags
+.Op Fl f Ar makefile
+.Op Fl I Ar directory
+.Op Fl j Ar max_jobs
+.Op Ar variable Ns = Ns Ar value
+.Bk
+.Op Ar target No ...
+.Ek
+.El
+.Ed
+.
+.
+.Pp
+Here one might talk about the command
+.Xr make
+and qualify the argument,
+.Ar makefile ,
+as an argument to the flag,
+.Fl f ,
+or discuss the optional file operand
+.Ar target .
+In the verbal context, such detail can prevent confusion, however the
+.Xr mdoc
+package does not have a macro for an argument
+.Em to
+a flag.
+Instead the
+.Ql \&Ar
+argument macro is used for an operand or file argument like
+.Ar target
+as well as an argument to a flag like
+.Ar variable .
+The make command line was produced from:
+.
+.Bd -literal -offset indent
+\&.Nm make
+\&.Op Fl eiknqrstv
+\&.Op Fl D Ar variable
+\&.Op Fl d Ar flags
+\&.Op Fl f Ar makefile
+\&.Op Fl I Ar directory
+\&.Op Fl j Ar max_jobs
+\&.Op Ar variable Ns = Ns Ar value
+\&.Bk
+\&.Op Ar target ...
+\&.Ek
+.Ed
+.
+.
+.Pp
+The
+.Ql .Bk
+and
+.Ql .Ek
+macros are explained in
+.Sx Keeps .
+.
+.
+.Ss "General Syntax"
+.
+The manual domain and general text domain macros share a similar syntax
+with a few minor deviations;
+most notably,
+.Ql .Ar ,
+.Ql .Fl ,
+.Ql .Nm ,
+and
+.Ql .Pa
+differ only when called without arguments; and
+.Ql .Fn
+and
+.Ql .Xr
+impose an order on their argument lists.
+.
+All manual domain macros are capable of recognizing and properly
+handling punctuation,
+provided each punctuation character is separated by a leading space.
+.
+If a command is given:
+.
+.
+.Pp
+.Dl \&.Ar sptr, ptr),
+.
+.
+.Pp
+The result is:
+.
+.
+.Pp
+.Dl Ar sptr, ptr),
+.
+.
+.Pp
+The punctuation is not recognized and all is output in the
+font used by
+.Ql .Ar .
+If the punctuation is separated by a leading white space:
+.
+.
+.Pp
+.Dl \&.Ar "sptr , ptr ) ,"
+.
+.
+.Pp
+The result is:
+.
+.
+.Pp
+.Dl Ar sptr , ptr ) ,
+.
+.
+.Pp
+The punctuation is now recognized and output in the default font
+distinguishing it from the argument strings.
+.
+To remove the special meaning from a punctuation character,
+escape it with
+.Ql \e& .
+.
+.
+.Pp
+The following punctuation characters are recognized by
+.Xr mdoc :
+.
+.Bl -column -offset indent-two XXXXXX XXXXXX XXXXXX XXXXXX
+.It Li .\& Ta Li ,\& Ta Li :\& Ta Li ;\& Ta Li (\&
+.It Li )\& Ta Li [\& Ta Li ]\& Ta Li ?\& Ta Li !\&
+.El
+.
+.
+.Pp
+.
+.Xr troff
+is limited as a macro language,
+and has difficulty when presented with a string containing certain
+mathematical,
+logical,
+or quotation character sequences:
+.
+.Bd -literal -offset indent-two
+{+,\-,/,*,%,<,>,<=,>=,=,==,&,\[ga],\[aq],"}
+.Ed
+.
+.
+.Pp
+The problem is that
+.Xr troff
+may assume it is supposed to actually perform the operation or
+evaluation suggested by the characters.
+.
+To prevent the accidental evaluation of these characters,
+escape them with
+.Ql \e& .
+.
+Typical syntax is shown in the first manual domain macro displayed
+below,
+.Ql .Ad .
+.
+.
+.Sh "Manual domain"
+.
+.
+.Ss Addresses
+.
+The address macro identifies an address construct.
+.
+.
+.Pp
+.Dl Usage: .Ad Ao address Ac ...
+.
+.
+.Pp
+.Bl -tag -width ".Li .Ad\ f1\ ,\ f2\ ,\ f3\ :" -compact -offset 15n
+.It Li ".Ad addr1"
+.Ad addr1
+.It Li ".Ad addr1 ."
+.Ad addr1 .
+.It Li ".Ad addr1 , file2"
+.Ad addr1 , file2
+.It Li ".Ad f1 , f2 , f3 :"
+.Ad f1 , f2 , f3 :
+.It Li ".Ad addr ) ) ,"
+.Ad addr ) ) ,
+.El
+.
+.
+.Pp
+The default width is 12n.
+.
+.Ss "Author Name"
+.
+The
+.Ql .An
+macro is used to specify the name of the author of the item being
+documented, or the name of the author of the actual manual page.
+.
+.
+.Pp
+.Dl Usage: .An Ao author name Ac ...
+.
+.
+.Pp
+.Bl -tag -width ".Li .An\ \[dq]Joe\ Author\[dq]\ )\ )\ ," -offset 15n
+.It Li ".An \[dq]Joe Author\[dq]"
+.An "Joe Author"
+.It Li ".An \[dq]Joe Author\[dq] ,"
+.An "Joe Author" ,
+.It Li ".An \[dq]Joe Author\[dq] Aq nobody@FreeBSD.org"
+.An "Joe Author" Aq nobody@FreeBSD.org
+.It Li ".An \[dq]Joe Author\[dq] ) ) ,"
+.An "Joe Author" ) ) ,
+.El
+.
+.
+.Pp
+The default width is 12n.
+.
+.
+.Pp
+In a section titled
+.Dq Authors ,
+.Ql \&An
+causes a break,
+allowing each new name to appear on its own line.
+.
+If this is not desirable,
+.
+.Bd -literal -offset indent
+\&.An \-nosplit
+.Ed
+.
+.
+.Pp
+.
+call will turn this off.
+To turn splitting back on, write
+.
+.Bd -literal -offset indent
+\&.An \-split
+.Ed
+.
+.
+.Ss Arguments
+.
+The
+.Li .Ar
+argument macro may be used whenever an argument is referenced.
+.
+If called without arguments,
+.Sq Ar
+is output.
+.
+This places the ellipsis in italics,
+which is ugly and incorrect,
+and will be noticed on terminals that underline text instead of using an
+oblique typeface.
+.
+We recommend using
+.Ql ".Ar file \&No ..."
+instead.
+.
+.
+.Pp
+.Dl Usage: .Ar Oo Ao argument Ac Oc No ...
+.
+.
+.Pp
+.Bl -tag -width ".Li .Ar\ file1\ file2" -compact -offset 15n
+.It Li .Ar
+.Ar
+.It Li .Ar file \&No ...
+.Ar file No ...
+.It Li ".Ar file1"
+.Ar file1
+.It Li ".Ar file1 ."
+.Ar file1 .
+.It Li ".Ar file1 file2"
+.Ar file1 file2
+.It Li ".Ar f1 f2 f3 :"
+.Ar f1 f2 f3 :
+.It Li ".Ar file ) ) ,"
+.Ar file ) ) ,
+.El
+.
+.
+.Pp
+.
+The default width is 12n.
+.
+.
+.Ss "Configuration Declaration (Section Four Only)"
+.
+The
+.Ql .Cd
+macro is used to demonstrate a
+.Xr config 8
+declaration for a device interface in a section four manual.
+.
+.
+.Pp
+.Dl Usage: .Cd Ao argument Ac ...
+.
+.
+.Pp
+.Bl -tag -width ".Li .Cd\ Xdevice\ le0\ at\ scode?X" -offset 15n
+.It Li ".Cd \[dq]device le0 at scode?\[dq]"
+.Cd "device le0 at scode?"
+.El
+.
+.
+.Pp
+In a section titled
+.Dq Synopsis ,
+.Ql \&Cd
+causes a break before and after its arguments.
+.
+.
+.Pp
+The default width is 12n.
+.
+.
+.Ss "Command Modifiers"
+.
+The command modifier is identical to the
+.Ql .Fl
+(flag) command with the exception that the
+.Ql .Cm
+macro does not assert a dash in front of every argument.
+Traditionally flags are marked by the preceding dash, however, some commands
+or subsets of commands do not use them.
+Command modifiers may also be specified in conjunction with interactive
+commands such as editor commands.
+See
+.Sx Flags .
+.
+.
+.Pp
+The default width is 10n.
+.
+.
+.Ss "Defined Variables"
+.
+A variable
+(or constant)
+that is defined in an include file is specified by the macro
+.Ql .Dv .
+.
+.
+.Pp
+.Dl Usage: .Dv Ao defined-variable Ac ...
+.
+.
+.Pp
+.Bl -tag -width ".Li .Dv\ MAXHOSTNAMELEN" -compact -offset 15n
+.It Li ".Dv MAXHOSTNAMELEN"
+.Dv MAXHOSTNAMELEN
+.It Li ".Dv TIOCGPGRP )"
+.Dv TIOCGPGRP )
+.El
+.
+.
+.Pp
+.
+The default width is 12n.
+.
+.
+.Ss Errnos
+.
+The
+.Ql .Er
+errno macro specifies the error return value for section 2,
+3,
+and\~9 library routines.
+.
+The second example below shows
+.Ql .Er
+used with the
+.Ql .Bq
+general text domain macro,
+as it would be used in a section two manual page.
+.
+.
+.Pp
+.Dl Usage: .Er Ao errno type Ac ...
+.Pp
+.Bl -tag -width ".Li .Bq\ Er\ ENOTDIR" -compact -offset 15n
+.It Li ".Er ENOENT"
+.Er ENOENT
+.It Li ".Er ENOENT ) ;"
+.Er ENOENT ) ;
+.It Li ".Bq Er ENOTDIR"
+.Bq Er ENOTDIR
+.El
+.Pp
+.
+The default width is 17n.
+.
+.
+.Ss "Environment Variables"
+.
+The
+.Ql .Ev
+macro specifies an environment variable.
+.Pp
+.Dl Usage: .Ev Ao argument Ac ...
+.Pp
+.Bl -tag -width ".Li .Ev\ PRINTER\ )\ )\ ," -compact -offset 15n
+.It Li ".Ev DISPLAY"
+.Ev DISPLAY
+.It Li ".Ev PATH ."
+.Ev PATH .
+.It Li ".Ev PRINTER ) ) ,"
+.Ev PRINTER ) ) ,
+.El
+.Pp
+.
+The default width is 15n.
+.
+.
+.Ss Flags
+.
+The
+.Ql .Fl
+macro handles command-line flags.
+It prepends a dash,
+.Ql \- ,
+to the flag.
+.
+For interactive command flags that are not prepended with a dash,
+the
+.Ql .Cm
+(command modifier)
+macro is identical,
+but without the dash.
+.
+.
+.Pp
+.Dl Usage: .Fl Ao argument Ac ...
+.Pp
+.Bl -tag -width ".Li .Fl\ xyz\ )\ ," -compact -offset 15n
+.It Li .Fl
+.Fl
+.It Li ".Fl cfv"
+.Fl cfv
+.It Li ".Fl cfv ."
+.Fl cfv .
+.It Li ".Cm cfv ."
+.Cm cfv .
+.It Li ".Fl s v t"
+.Fl s v t
+.It Li ".Fl \- ,"
+.Fl \- ,
+.It Li ".Fl xyz ) ,"
+.Fl xyz ) ,
+.It Li ".Fl |"
+.Fl |
+.El
+.Pp
+The
+.Ql .Fl
+macro without any arguments results in a dash representing stdin/stdout.
+Note that giving
+.Ql .Fl
+a single dash will result in two dashes.
+.Pp
+The default width is 12n.
+.
+.
+.Ss "Function Declarations"
+.
+The
+.Ql .Fd
+macro is used in the
+.Sx Synopsis
+section with section two or three functions.
+It is neither callable nor parsed.
+.Pp
+.Dl Usage: .Fd Ao argument Ac ...
+.Pp
+.Bl -tag -width ".Li .Fd\ X#include\ <sys/types.h>X" -compact -offset 15n
+.It Li ".Fd \[dq]#include <sys/types.h>\[dq]"
+.Fd "#include <sys/types.h>"
+.El
+.
+.
+.Pp
+In a section titled
+.Dq Synopsis ,
+.Ql \&Fd
+causes a break if a function has already been presented and a break has
+not occurred,
+leaving vertical space between one function declaration and the next.
+.\" XXX: that's not what "break" means
+.
+.
+.Pp
+In a section titled
+.Dq Synopsis ,
+the
+.Ql \&In
+macro represents the
+.Li #include
+statement,
+and is the short form of the above example.
+.
+It specifies the C\~header file as being included in a C\~program.
+.
+It also causes a break.
+.
+.
+.Pp
+While not in the
+.Dq Synopsis
+section,
+it represents the header file enclosed in angle brackets.
+.
+.
+.Pp
+.Dl Usage: .In Ao header file Ac
+.
+.
+.Pp
+.Bl -tag -width ".Li .In\ stdio.h" -compact -offset 15n
+.nr in-synopsis-section 1
+.It Li ".In stdio.h"
+.In stdio.h
+.nr in-synopsis-section 0
+.It Li ".In stdio.h"
+.In stdio.h
+.El
+.
+.
+.Ss "Function Types"
+.
+This macro is intended for the
+.Dq Synopsis
+section.
+.
+It may be used anywhere else in the man page without problems,
+but its main purpose is to present the function type
+(in BSD kernel normal form)
+for the
+.Dq Synopsis
+of sections two and three.
+.
+(It causes a break,
+allowing the function name to appear on the next line.)
+.
+.
+.Pp
+.Dl Usage: .Ft Ao type Ac ...
+.Pp
+.Bl -tag -width ".Li .Ft\ struct\ stat" -compact -offset 15n
+.It Li ".Ft struct stat"
+.Ft struct stat
+.El
+.
+.
+.Ss "Functions (Library Routines)"
+.
+The
+.Ql .Fn
+macro is modeled on
+.Tn ANSI\~C
+conventions.
+.Pp
+.Dl Usage: .Fn Ao function Ac Oo Ao parameter Ac Oc ...
+.Pp
+.Bl -tag -width ".Li .Fn\ align\ Xchar\ *ptrX\ ," -compact -offset 15n
+.It Li ".Fn getchar"
+.Fn getchar
+.It Li ".Fn strlen ) ,"
+.Fn strlen ) ,
+.It Li ".Fn align \[dq]char *ptr\[dq] ,"
+.Fn align "char *ptr" ,
+.El
+.Pp
+Note that any call to another macro signals the end of the
+.Ql .Fn
+call (it will insert a closing parenthesis at that point).
+.
+.
+.Pp
+For functions with many parameters
+(which is rare),
+the macros
+.Ql .Fo
+(function open)
+and
+.Ql .Fc
+(function close)
+may be used with
+.Ql .Fa
+(function argument).
+.Pp
+Example:
+.
+.Bd -literal -offset indent
+\&.Ft int
+\&.Fo res_mkquery
+\&.Fa "int op"
+\&.Fa "char *dname"
+\&.Fa "int class"
+\&.Fa "int type"
+\&.Fa "char *data"
+\&.Fa "int datalen"
+\&.Fa "struct rrec *newrr"
+\&.Fa "char *buf"
+\&.Fa "int buflen"
+\&.Fc
+.Ed
+.Pp
+.
+Produces:
+.
+.Bd -ragged -offset indent
+.Ft int
+.Fo res_mkquery
+.Fa "int op"
+.Fa "char *dname"
+.Fa "int class"
+.Fa "int type"
+.Fa "char *data"
+.Fa "int datalen"
+.Fa "struct rrec *newrr"
+.Fa "char *buf"
+.Fa "int buflen"
+.Fc
+.Ed
+.
+.
+.Pp
+Typically,
+in a
+.Dq Synopsis
+section,
+the function delcaration will begin the line.
+.
+If more than one function is presented in the
+.Dq Synopsis
+section and a function type has not been given,
+a break will occur,
+leaving vertical space between the current and prior function names.
+.\" XXX: that's not what "break" means
+.
+.
+.Pp
+The default width values of
+.Ql .Fn
+and
+.Ql .Fo
+are 12n and 16n,
+respectively.
+.
+.
+.Ss "Function Arguments"
+.
+The
+.Ql .Fa
+macro is used to refer to function arguments (parameters) outside of the
+.Sx Synopsis
+section of the manual or inside the
+.Sx Synopsis
+section if the enclosure macros
+.Ql .Fo
+and
+.Ql .Fc
+instead of
+.Ql .Fn
+are used.
+.Ql .Fa
+may also be used to refer to structure members.
+.Pp
+.Dl Usage: .Fa Ao function argument Ac ...
+.Pp
+.Bl -tag -width ".Li .Fa\ d_namlen\ )\ )\ ," -compact -offset 15n
+.It Li ".Fa d_namlen ) ) ,"
+.Fa d_namlen ) ) ,
+.It Li ".Fa iov_len"
+.Fa iov_len
+.El
+.Pp
+.
+The default width is 12n.
+.
+.
+.Ss "Return Values"
+.
+The
+.Ql .Rv
+macro generates text for use in the
+.Sx Return values
+section.
+.Pp
+.Dl Usage: .Rv Oo \-std Oc Op Ao function Ac ...
+.Pp
+For example,
+.Ql ".Rv \-std atexit"
+produces:
+.
+.Bd -ragged -offset indent
+\# a small hack to suppress a warning message
+.ds doc-section-old "\*[doc-section]
+.ds doc-section 3
+.Rv -std atexit
+.ds doc-section "\*[doc-section-old]
+.Ed
+.Pp
+.
+The
+.Fl std
+option is valid only for manual page sections\~2 and\~3.
+Currently, this macro does nothing if used without the
+.Fl std
+flag.
+.
+.
+.Ss "Exit Status"
+.
+The
+.Ql .Ex
+macro generates text for use in the
+.Sx Diagnostics
+section.
+.Pp
+.Dl Usage: .Ex Oo \-std Oc Op Ao utility Ac ...
+.Pp
+For example,
+.Ql ".Ex \-std cat"
+produces:
+.
+.Bd -ragged -offset indent
+\# a small hack to suppress a warning message
+.ds doc-section-old "\*[doc-section]
+.ds doc-section 1
+.Ex -std cat
+.ds doc-section "\*[doc-section-old]
+.Ed
+.Pp
+.
+The
+.Fl std
+option is valid only for manual page sections 1, 6 and\~8.
+Currently, this macro does nothing if used without the
+.Fl std
+flag.
+.
+.
+.Ss "Interactive Commands"
+.
+The
+.Ql .Ic
+macro designates an interactive or internal command.
+.Pp
+.Dl Usage: .Ic Ao argument Ac ...
+.Pp
+.Bl -tag -width ".Li .Ic\ setenv\ ,\ unsetenv" -compact -offset 15n
+.It Li ".Ic :wq"
+.Ic :wq
+.It Li ".Ic \[dq]do while {...}\[dq]"
+.Ic "do while {...}"
+.It Li ".Ic setenv , unsetenv"
+.Ic setenv , unsetenv
+.El
+.Pp
+.
+The default width is 12n.
+.
+.
+.Ss "Library Names"
+.
+The
+.Ql .Lb
+macro is used to specify the library where a particular function is compiled
+in.
+.Pp
+.Dl Usage: .Lb Ao argument Ac ...
+.Pp
+Available arguments to
+.Ql .Lb
+and their results are:
+.
+.Pp
+.Bl -tag -width ".Li librpcsec_gss" -compact -offset indent
+.It Li libarchive
+.Lb libarchive
+.It Li libarm
+.Lb libarm
+.It Li libarm32
+.Lb libarm32
+.It Li libbluetooth
+.Lb libbluetooth
+.It Li libbsm
+.Lb libbsm
+.It Li libc
+.Lb libc
+.It Li libc_r
+.Lb libc_r
+.It Li libcalendar
+.Lb libcalendar
+.It Li libcam
+.Lb libcam
+.It Li libcdk
+.Lb libcdk
+.It Li libcipher
+.Lb libcipher
+.It Li libcompat
+.Lb libcompat
+.It Li libcrypt
+.Lb libcrypt
+.It Li libcurses
+.Lb libcurses
+.It Li libdevinfo
+.Lb libdevinfo
+.It Li libdevstat
+.Lb libdevstat
+.It Li libdisk
+.Lb libdisk
+.It Li libdwarf
+.Lb libdwarf
+.It Li libedit
+.Lb libedit
+.It Li libelf
+.Lb libelf
+.It Li libevent
+.Lb libevent
+.It Li libfetch
+.Lb libfetch
+.It Li libform
+.Lb libform
+.It Li libgeom
+.Lb libgeom
+.It Li libgpib
+.Lb libgpib
+.It Li libi386
+.Lb libi386
+.It Li libintl
+.Lb libintl
+.It Li libipsec
+.Lb libipsec
+.It Li libipx
+.Lb libipx
+.It Li libiscsi
+.Lb libiscsi
+.It Li libjail
+.Lb libjail
+.It Li libkiconv
+.Lb libkiconv
+.It Li libkse
+.Lb libkse
+.It Li libkvm
+.Lb libkvm
+.It Li libm
+.Lb libm
+.It Li libm68k
+.Lb libm68k
+.It Li libmagic
+.Lb libmagic
+.It Li libmd
+.Lb libmd
+.It Li libmemstat
+.Lb libmemstat
+.It Li libmenu
+.Lb libmenu
+.It Li libnetgraph
+.Lb libnetgraph
+.It Li libnetpgp
+.Lb libnetpgp
+.It Li libossaudio
+.Lb libossaudio
+.It Li libpam
+.Lb libpam
+.It Li libpcap
+.Lb libpcap
+.It Li libpci
+.Lb libpci
+.It Li libpmc
+.Lb libpmc
+.It Li libposix
+.Lb libposix
+.It Li libprop
+.Lb libprop
+.It Li libpthread
+.Lb libpthread
+.It Li libpuffs
+.Lb libpuffs
+.It Li librefuse
+.Lb librefuse
+.It Li libresolv
+.Lb libresolv
+.It Li librpcsec_gss
+.Lb librpcsec_gss
+.It Li librpcsvc
+.Lb librpcsvc
+.It Li librt
+.Lb librt
+.It Li libsdp
+.Lb libsdp
+.It Li libssp
+.Lb libssp
+.It Li libSystem
+.Lb libSystem
+.It Li libtermcap
+.Lb libtermcap
+.It Li libterminfo
+.Lb libterminfo
+.It Li libthr
+.Lb libthr
+.It Li libufs
+.Lb libufs
+.It Li libugidfw
+.Lb libugidfw
+.It Li libulog
+.Lb libulog
+.It Li libusbhid
+.Lb libusbhid
+.It Li libutil
+.Lb libutil
+.It Li libvgl
+.Lb libvgl
+.It Li libx86_64
+.Lb libx86_64
+.It Li libz
+.Lb libz
+.El
+.
+.
+.Pp
+Site-specific additions might be found in the file
+.Pa mdoc.local ;
+see section
+.Sx Files
+below.
+.
+.
+.Pp
+In a section titled
+.Dq Library ,
+.Ql \&Lb
+causes a break before and after its arguments.
+.
+.
+.Ss Literals
+.
+The
+.Ql \&Li
+literal macro may be used for special characters,
+symbolic constants,
+and other syntactical items that should be typed exactly as displayed.
+.
+.
+.Pp
+.Dl Usage: .Li Ao argument Ac ...
+.Pp
+.Bl -tag -width ".Li .Li\ cntrl\-D\ )\ ," -compact -offset 15n
+.It Li ".Li \een"
+.Li \en
+.It Li ".Li M1 M2 M3 ;"
+.Li M1 M2 M3 ;
+.It Li ".Li cntrl\-D ) ,"
+.Li cntrl-D ) ,
+.It Li ".Li 1024 ..."
+.Li 1024 ...
+.El
+.Pp
+.
+The default width is 16n.
+.
+.
+.Ss Names
+.
+The
+.Ql \&Nm
+macro is used for the document title or page topic.
+.
+Upon its first call,
+it has the peculiarity of remembering its argument,
+which should always be the topic of the man page.
+.
+When subsequently called without arguments,
+.Ql \&Nm
+regurgitates this initial name for the sole purpose of making less work
+for the author.
+.
+Use of
+.Ql \&Nm
+is also appropriate when presenting a command synopsis for the topic of
+a man page in section 1,
+6,
+or 8.
+.
+Its behavior changes when presented with arguments of various forms.
+.
+.
+.Pp
+.Bl -tag -width ".Li .Nm\ groff_mdoc" -compact -offset 15n
+.It Li ".Nm groff_mdoc"
+.Nm groff_mdoc
+.It Li ".Nm"
+.Nm
+.It Li ".Nm \e\-mdoc"
+.Nm \-mdoc
+.It Li ".Nm foo ) ) ,"
+.Nm foo ) ) ,
+.It Li ".Nm :"
+.Nm :
+.El
+.
+.
+.Pp
+By default,
+the topic is set in boldface to reflect its prime importance in the
+discussion.
+.
+Cross references to other man page topics should use
+.Ql \&Xr ;
+including a second argument for the section number enables them to be
+hyperlinked.
+.
+By default,
+cross-referenced topics are set in italics to avoid cluttering the page
+with boldface.
+.
+.
+.Pp
+The default width is 10n.
+.
+.
+.Ss Options
+The
+.Ql .Op
+macro places option brackets around any remaining arguments on the
+command line,
+and places any trailing punctuation outside the brackets.
+.
+The macros
+.Ql .Oo
+and
+.Ql .Oc
+(which produce an opening and a closing option bracket,
+respectively)
+may be used across one or more lines or to specify the exact position of
+the closing parenthesis.
+.
+.
+.Pp
+.Dl Usage: .Op Oo Ao option Ac Oc ...
+.Pp
+.Bl -tag -width ".Li .Op\ Fl\ c\ Ar\ objfil\ Op\ Ar\ corfil\ ," -compact -offset 15n
+.It Li .Op
+.Op
+.It Li ".Op Fl k"
+.Op Fl k
+.It Li ".Op Fl k ) ."
+.Op Fl k ) .
+.It Li ".Op Fl k Ar kookfile"
+.Op Fl k Ar kookfile
+.It Li ".Op Fl k Ar kookfile ,"
+.Op Fl k Ar kookfile ,
+.It Li ".Op Ar objfil Op Ar corfil"
+.Op Ar objfil Op Ar corfil
+.It Li ".Op Fl c Ar objfil Op Ar corfil ,"
+.Op Fl c Ar objfil Op Ar corfil ,
+.It Li ".Op word1 word2"
+.Op word1 word2
+.It Li ".Li .Op Oo Ao option Ac Oc ..."
+.Li .Op Oo Ao option Ac Oc ...
+.El
+.Pp
+Here a typical example of the
+.Ql .Oo
+and
+.Ql .Oc
+macros:
+.
+.Bd -literal -offset indent
+\&.Oo
+\&.Op Fl k Ar kilobytes
+\&.Op Fl i Ar interval
+\&.Op Fl c Ar count
+\&.Oc
+.Ed
+.Pp
+.
+Produces:
+.
+.Bd -filled -offset indent
+.Oo
+.Op Fl k Ar kilobytes
+.Op Fl i Ar interval
+.Op Fl c Ar count
+.Oc
+.Ed
+.Pp
+.
+The default width values of
+.Ql .Op
+and
+.Ql .Oo
+are 14n and 10n, respectively.
+.
+.
+.Ss Pathnames
+.
+The
+.Ql .Pa
+macro formats file specifications.
+.
+If called without arguments,
+.Sq Pa
+(recognized by many shells)
+is output,
+representing the user's home directory.
+.
+.
+.Pp
+.Dl Usage: .Pa Oo Ao pathname Ac Oc ...
+.Pp
+.Bl -tag -width ".Li .Pa\ /tmp/fooXXXXX\ )\ ." -compact -offset 15n
+.It Li .Pa
+.Pa
+.It Li ".Pa /usr/share"
+.Pa /usr/share
+.It Li ".Pa /tmp/fooXXXXX ) ."
+.Pa /tmp/fooXXXXX ) .
+.El
+.Pp
+.
+The default width is 32n.
+.
+.
+.Ss Standards
+.
+The
+.Ql .St
+macro replaces standard abbreviations with their formal names.
+.Pp
+.Dl Usage: .St Ao abbreviation Ac ...
+.Pp
+Available pairs for
+.Dq Abbreviation/Formal Name
+are:
+.
+.Pp
+.Tn ANSI/ISO C
+.Pp
+.Bl -tag -width ".Li \-p1003.1g\-2000" -compact -offset indent
+.It Li \-ansiC
+.St -ansiC
+.It Li \-ansiC\-89
+.St -ansiC-89
+.It Li \-isoC
+.St -isoC
+.It Li \-isoC\-90
+.St -isoC-90
+.It Li \-isoC\-99
+.St -isoC-99
+.It Li \-isoC\-2011
+.St -isoC-2011
+.El
+.Pp
+.
+.Tn POSIX
+Part 1: System API
+.Pp
+.Bl -tag -width ".Li \-p1003.1g\-2000" -compact -offset indent
+.It Li \-iso9945\-1\-90
+.St -iso9945-1-90
+.It Li \-iso9945\-1\-96
+.St -iso9945-1-96
+.It Li \-p1003.1
+.St -p1003.1
+.It Li \-p1003.1\-88
+.St -p1003.1-88
+.It Li \-p1003.1\-90
+.St -p1003.1-90
+.It Li \-p1003.1\-96
+.St -p1003.1-96
+.It Li \-p1003.1b\-93
+.St -p1003.1b-93
+.It Li \-p1003.1c\-95
+.St -p1003.1c-95
+.It Li \-p1003.1g\-2000
+.St -p1003.1g-2000
+.It Li \-p1003.1i\-95
+.St -p1003.1i-95
+.It Li \-p1003.1\-2001
+.St -p1003.1-2001
+.It Li \-p1003.1\-2004
+.St -p1003.1-2004
+.It Li \-p1003.1\-2008
+.St -p1003.1-2008
+.El
+.Pp
+.
+.Tn POSIX
+Part 2: Shell and Utilities
+.Pp
+.Bl -tag -width ".Li \-p1003.1g\-2000" -compact -offset indent
+.It Li \-iso9945\-2\-93
+.St -iso9945-2-93
+.It Li \-p1003.2
+.St -p1003.2
+.It Li \-p1003.2\-92
+.St -p1003.2-92
+.It Li \-p1003.2a\-92
+.St -p1003.2a-92
+.El
+.Pp
+.
+X/Open
+.Pp
+.Bl -tag -width ".Li \-p1003.1g\-2000" -compact -offset indent
+.It Li \-susv1
+.St -susv1
+.It Li \-susv2
+.St -susv2
+.It Li \-susv3
+.St -susv3
+.It Li \-susv4
+.St -susv4
+.It Li \-svid4
+.St -svid4
+.It Li \-xbd5
+.St -xbd5
+.It Li \-xcu5
+.St -xcu5
+.It Li \-xcurses4.2
+.St -xcurses4.2
+.It Li \-xns5
+.St -xns5
+.It Li \-xns5.2
+.St -xns5.2
+.It Li \-xpg3
+.St -xpg3
+.It Li \-xpg4
+.St -xpg4
+.It Li \-xpg4.2
+.St -xpg4.2
+.It Li \-xsh5
+.St -xsh5
+.El
+.Pp
+.
+Miscellaneous
+.Pp
+.Bl -tag -width ".Li \-p1003.1g\-2000" -compact -offset indent
+.It Li \-ieee754
+.St -ieee754
+.It Li \-iso8601
+.St -iso8601
+.It Li \-iso8802\-3
+.St -iso8802-3
+.El
+.
+.
+.Ss "Variable Types"
+The
+.Ql .Vt
+macro may be used whenever a type is referenced.
+.
+In a section titled
+.Dq Synopsis ,
+.Ql \&Vt
+causes a break
+(useful for old-style C variable declarations).
+.
+.
+.Pp
+.Dl Usage: .Vt Ao type Ac ...
+.Pp
+.Bl -tag -width ".Li .Vt\ extern\ char\ *optarg\ ;" -compact -offset 15n
+.It Li ".Vt extern char *optarg ;"
+.Vt extern char *optarg ;
+.It Li ".Vt FILE *"
+.Vt FILE *
+.El
+.
+.
+.Ss Variables
+.
+Generic variable reference.
+.Pp
+.Dl Usage: .Va Ao variable Ac ...
+.Pp
+.Bl -tag -width ".Li .Va\ Xchar\ sX\ ]\ )\ )\ ," -compact -offset 15n
+.It Li ".Va count"
+.Va count
+.It Li ".Va settimer ,"
+.Va settimer ,
+.It Li ".Va \[dq]int *prt\[dq] ) :"
+.Va "int *prt" ) :
+.It Li ".Va \[dq]char s\[dq] ] ) ) ,"
+.Va "char s" ] ) ) ,
+.El
+.Pp
+.
+The default width is 12n.
+.
+.
+.Ss "Manual Page Cross References"
+.
+The
+.Ql .Xr
+macro expects the first argument to be a manual page name.
+.
+The optional second argument,
+if a string
+(defining the manual section),
+is
+put into parentheses.
+.
+.
+.Pp
+.Dl Usage: .Xr Ao man page name Ac Oo Ao section Ac Oc ...
+.
+.
+.Pp
+.Bl -tag -width ".Li .Xr\ xinit\ 1x\ ;" -compact -offset 15n
+.It Li ".Xr mdoc"
+.Xr mdoc
+.It Li ".Xr mdoc ,"
+.Xr mdoc ,
+.It Li ".Xr mdoc 7"
+.Xr mdoc 7
+.It Li ".Xr xinit 1x ;"
+.Xr xinit 1x ;
+.El
+.
+.
+.Pp
+The default width is 10n.
+.
+.
+.Sh "General text domain"
+.
+.
+.Ss "AT&T Macro"
+.
+.Pp
+.Dl Usage: .At Oo Ao version Ac Oc ...
+.Pp
+.Bl -tag -width ".Li .At\ v6\ ." -compact -offset 15n
+.It Li .At
+.At
+.It Li ".At v6 ."
+.At v6 .
+.El
+.Pp
+The following values for
+.Ao version Ac
+are possible:
+.Pp
+.Dl 32v, v1, v2, v3, v4, v5, v6, v7, III, V, V.1, V.2, V.3, V.4
+.
+.
+.Ss "BSD Macro"
+.
+.Pp
+.Dl "Usage: .Bx" Bro \-alpha | \-beta | \-devel Brc ...
+.Dl " .Bx" Oo Ao version Ac Oo Ao release Ac Oc Oc ...
+.Pp
+.Bl -tag -width ".Li .Bx\ -devel" -compact -offset 15n
+.It Li .Bx
+.Bx
+.It Li ".Bx 4.3 ."
+.Bx 4.3 .
+.It Li ".Bx \-devel"
+.Bx -devel
+.El
+.Pp
+.Ao version Ac
+will be prepended to the string
+.Sq Bx .
+The following values for
+.Ao release Ac
+are possible:
+.Pp
+.Dl Reno, reno, Tahoe, tahoe, Lite, lite, Lite2, lite2
+.
+.
+.Ss "NetBSD Macro"
+.
+.Pp
+.Dl Usage: .Nx Oo Ao version Ac Oc ...
+.Pp
+.Bl -tag -width ".Li .Nx\ 1.4\ ." -compact -offset 15n
+.It Li .Nx
+.Nx
+.It Li ".Nx 1.4 ."
+.Nx 1.4 .
+.El
+.Pp
+For possible values of
+.Ao version Ac
+see the description of the
+.Ql .Os
+command above in section
+.Sx "Title macros" .
+.
+.
+.Ss "FreeBSD Macro"
+.
+.Pp
+.Dl Usage: .Fx Oo Ao version Ac Oc ...
+.Pp
+.Bl -tag -width ".Li .Fx\ 2.2\ ." -compact -offset 15n
+.It Li .Fx
+.Fx
+.It Li ".Fx 2.2 ."
+.Fx 2.2 .
+.El
+.Pp
+For possible values of
+.Ao version Ac
+see the description of the
+.Ql .Os
+command above in section
+.Sx "Title macros" .
+.
+.
+.Ss "DragonFly Macro"
+.
+.Pp
+.Dl Usage: .Dx Oo Ao version Ac Oc ...
+.Pp
+.Bl -tag -width ".Li .Dx\ 1.4\ ." -compact -offset 15n
+.It Li .Dx
+.Dx
+.It Li ".Dx 1.4 ."
+.Dx 1.4 .
+.El
+.Pp
+For possible values of
+.Ao version Ac
+see the description of the
+.Ql .Os
+command above in section
+.Sx "Title macros" .
+.
+.
+.Ss "OpenBSD Macro"
+.
+.Pp
+.Dl Usage: .Ox Oo Ao version Ac Oc ...
+.Pp
+.Bl -tag -width ".Li .Ox\ 1.0" -compact -offset 15n
+.It Li ".Ox 1.0"
+.Ox 1.0
+.El
+.
+.
+.Ss "BSD/OS Macro"
+.
+.Pp
+.Dl Usage: .Bsx Oo Ao version Ac Oc ...
+.Pp
+.Bl -tag -width ".Li .Bsx\ 1.0" -compact -offset 15n
+.It Li ".Bsx 1.0"
+.Bsx 1.0
+.El
+.
+.
+.Ss "Unix Macro"
+.
+.Pp
+.Dl Usage: .Ux ...
+.Pp
+.Bl -tag -width ".Li .Ux" -compact -offset 15n
+.It Li .Ux
+.Ux
+.El
+.
+.
+.Ss "Emphasis Macro"
+.
+Text may be stressed or emphasized with the
+.Ql .Em
+macro.
+The usual font for emphasis is italic.
+.Pp
+.Dl Usage: .Em Ao argument Ac ...
+.Pp
+.Bl -tag -width ".Li .Em\ vide\ infra\ )\ )\ ," -compact -offset 15n
+.It Li ".Em does not"
+.Em does not
+.It Li ".Em exceed 1024 ."
+.Em exceed 1024 .
+.It Li ".Em vide infra ) ) ,"
+.Em vide infra ) ) ,
+.El
+.Pp
+.
+The default width is 10n.
+.
+.
+.Ss "Font Mode"
+.
+The
+.Ql .Bf
+font mode must be ended with the
+.Ql .Ef
+macro (the latter takes no arguments).
+Font modes may be nested within other font modes.
+.Pp
+.Ql .Bf
+has the following syntax:
+.Pp
+.Dl .Bf Ao font mode Ac
+.Pp
+.Ao font mode Ac
+must be one of the following three types:
+.Pp
+.Bl -tag -width ".Sy \&Sy | Fl symbolic" -compact -offset indent
+.It Sy \&Em | Fl emphasis
+Same as if the
+.Ql .Em
+macro was used for the entire block of text.
+.It Sy \&Li | Fl literal
+Same as if the
+.Ql .Li
+macro was used for the entire block of text.
+.It Sy \&Sy | Fl symbolic
+Same as if the
+.Ql .Sy
+macro was used for the entire block of text.
+.El
+.Pp
+Both macros are neither callable nor parsed.
+.
+.
+.Ss "Enclosure and Quoting Macros"
+.
+The concept of enclosure is similar to quoting.
+The object being to enclose one or more strings between a pair of characters
+like quotes or parentheses.
+The terms quoting and enclosure are used interchangeably throughout this
+document.
+Most of the one-line enclosure macros end in small letter
+.Ql q
+to give a hint of quoting, but there are a few irregularities.
+.
+For each enclosure macro,
+there is a pair of opening and closing macros that end with the
+lowercase letters
+.Ql o
+and
+.Ql c
+respectively.
+.Pp
+\# XXX
+.if t \
+. ne 10
+.
+.TS
+lb lb lb lb lb
+l l l l l.
+Quote Open Close Function Result
+\&.Aq .Ao .Ac Angle Bracket Enclosure <string>
+\&.Bq .Bo .Bc Bracket Enclosure [string]
+\&.Brq .Bro .Brc Brace Enclosure {string}
+\&.Dq .Do .Dc Double Quote \[lq]string\[rq]
+\&.Eq .Eo .Ec Enclose String (in XY) XstringY
+\&.Pq .Po .Pc Parenthesis Enclosure (string)
+\&.Ql Quoted Literal \[lq]string\[rq] or string
+\&.Qq .Qo .Qc Straight Double Quote "string"
+\&.Sq .So .Sc Single Quote \[oq]string\[cq]
+.TE
+.Pp
+All macros ending with
+.Sq q
+and
+.Sq o
+have a default width value of 12n.
+.
+.Bl -tag -width ".Li .Ec , .Eo"
+.It Li .Eo , .Ec
+These macros expect the first argument to be the opening and closing
+strings,
+respectively.
+.
+.It Li .Es , .En
+To work around the nine-argument limit in the original
+.Xr troff \" generic
+program,
+.Xr mdoc
+supports two other macros that are now obsolete.
+.
+.Ql .Es
+uses its first and second parameters as opening and closing marks which
+are then used to enclose the arguments of
+.Ql .En .
+.
+The default width value is 12n for both macros.
+.
+.It Li .Eq
+The first and second arguments of this macro are the opening and
+closing strings respectively, followed by the arguments to be enclosed.
+.It Li .Ql
+The quoted literal macro behaves differently in
+.Xr troff \" mode
+and
+.Xr nroff \" mode
+modes.
+.
+If formatted with
+.Xr @g@nroff @MAN1EXT@ ,
+a quoted literal is always quoted.
+.
+If formatted with
+.Xr @g@troff ,
+an item is only quoted if the width of the item is less than three
+constant-width characters.
+.
+This is to make short strings more visible where the font change to
+literal (constant-width) is less noticeable.
+.
+.
+.Pp
+The default width is 16n.
+.
+.It Li .Pf
+The prefix macro suppresses the whitespace between its first and second
+argument:
+.
+.Bl -tag -width ".Li .Pf\ (\ Fa\ name2" -offset indent
+.It Li ".Pf ( Fa name2"
+.Pf ( Fa name2
+.El
+.Pp
+.
+The default width is 12n.
+.Pp
+The
+.Ql .Ns
+macro (see below) performs the analogous suffix function.
+.It Li .Ap
+The
+.Ql .Ap
+macro inserts an apostrophe and exits any special text modes, continuing in
+.Ql .No
+mode.
+.El
+.Pp
+.
+Examples of quoting:
+.
+.Pp
+.Bl -tag -width ".Li .Bq\ Em\ Greek\ ,\ French\ ." -compact -offset indent
+.It Li .Aq
+.Aq
+.It Li ".Aq Pa ctype.h ) ,"
+.Aq Pa ctype.h ) ,
+.It Li .Bq
+.Bq
+.It Li ".Bq Em Greek , French ."
+.Bq Em Greek , French .
+.It Li .Dq
+.Dq
+.It Li ".Dq string abc ."
+.Dq string abc .
+.It Li ".Dq \[aq]\[rs][ha][A\-Z]\[aq]"
+.Dq '\[ha][A-Z]'
+.It Li ".Ql man mdoc"
+.Ql man mdoc
+.It Li .Qq
+.Qq
+.It Li ".Qq string ) ,"
+.Qq string ) ,
+.It Li ".Qq string Ns ),"
+.Qq string Ns ),
+.It Li .Sq
+.Sq
+.It Li ".Sq string"
+.Sq string
+.It Li ".Em or Ap ing"
+.Em or Ap ing
+.El
+.Pp
+.
+For a good example of nested enclosure macros, see the
+.Ql .Op
+option macro.
+It was created from the same underlying enclosure macros as those presented
+in the list above.
+The
+.Ql .Xo
+and
+.Ql .Xc
+extended argument list macros are discussed below.
+.
+.
+.Ss "Normal text macro"
+.
+.Ql \&No
+formats subsequent argument(s) normally,
+ending the effect of
+.Ql \&Em
+and similar.
+.
+Parsing is
+.Em not
+suppressed,
+so you must prefix words like
+.Ql \&No
+with
+.Ql \e&
+to avoid their interpretation as
+.Xr mdoc
+macros.
+.
+.
+.Pp
+.Dl Usage: .No Ar argument No ...
+.
+.
+.Pp
+.Bl -tag -width ".Li .Em\ Use\ caution\ No\ here\ ." \
+-compact -offset 15n
+.It Li ".Em Use caution No here ."
+\[->]
+.Em Use caution No here .
+.It Li ".Em No dogs allowed ."
+\[->]
+.\" We cheat here to prevent a diagnostic warning. We want to
+.\" illustrate output that may surprise the novice.
+.Em \&No No dogs allowed .
+.It Li ".Em \e&No dogs allowed ."
+\[->]
+.Em \&No dogs allowed .
+.El
+.
+.
+.Pp
+The default width is 12n.
+.
+.
+.Ss "No-Space Macro"
+.
+The
+.Ql .Ns
+macro suppresses insertion of a space between the current position and its
+first parameter.
+For example, it is useful for old style argument lists where there is no
+space between the flag and argument:
+.Pp
+.Dl "Usage:" ... Ao argument Ac \&Ns Oo Ao argument Ac Oc ...
+.Dl " " .Ns Ao argument Ac ...
+.Pp
+.Bl -tag -width ".Li .Op\ Fl\ I\ Ns\ Ar\ directory" -compact -offset 15n
+.It Li ".Op Fl I Ns Ar directory"
+.Op Fl I Ns Ar directory
+.El
+.Pp
+Note: The
+.Ql .Ns
+macro always invokes the
+.Ql .No
+macro after eliminating the space unless another macro name follows it.
+If used as a command (i.e., the second form above in the
+.Sq Usage
+line),
+.Ql .Ns
+is identical to
+.Ql .No .
+.
+.
+.Ss "(Sub)section cross references"
+.
+Use the
+.Ql .Sx
+macro to cite a (sub)section heading within the given document.
+.
+.
+.Pp
+.Dl Usage: .Sx Ao section-reference Ac ...
+.
+.
+.Pp
+.Bl -tag -width ".Li .Sx\ Files" -offset 15n
+.It Li ".Sx Files"
+\[->]
+.Sx Files
+.El
+.
+.
+.Pp
+The default width is 16n.
+.
+.
+.Ss Symbolics
+.
+The symbolic emphasis macro is generally a boldface macro in either the
+symbolic sense or the traditional English usage.
+.
+.
+.Pp
+.Dl Usage: .Sy Ao symbol Ac ...
+.
+.
+.Pp
+.Bl -tag -width ".Li .Sy\ Important\ Notice" -compact -offset 15n
+.It Li ".Sy Important Notice"
+\[->]
+.Sy Important Notice
+.El
+.
+.
+.Pp
+The default width is 6n.
+.
+.
+.Ss "Mathematical Symbols"
+.
+Use this macro for mathematical symbols and similar things.
+.
+.
+.Pp
+.Dl Usage: .Ms Ao math symbol Ac ...
+.
+.
+.Pp
+.Bl -tag -width ".Li .Ms\ sigma" -compact -offset 15n
+.It Li ".Ms sigma"
+\[->]
+.Ms sigma
+.El
+.
+.
+.Pp
+The default width is 6n.
+.
+.
+.Ss "References and Citations"
+.
+The following macros make a modest attempt to handle references.
+.
+At best,
+the macros make it convenient to manually drop in a subset of
+.Xr @g@refer @MAN1EXT@
+style references.
+.
+.
+.Pp
+.Bl -tag -width 6n -offset indent -compact
+.It Li .Rs
+Reference start
+(does not take arguments).
+.
+In a section titled
+.Dq "See also" ,
+it causes a break
+and begins collection of reference information until the reference end
+macro is read.
+.
+.It Li .Re
+Reference end (does not take arguments).
+The reference is printed.
+.It Li .%A
+Reference author name; one name per invocation.
+.It Li .%B
+Book title.
+.It Li .%C
+City/place.
+.It Li .%D
+Date.
+.It Li .%I
+Issuer/publisher name.
+.It Li .%J
+Journal name.
+.It Li .%N
+Issue number.
+.It Li .%O
+Optional information.
+.It Li .%P
+Page number.
+.It Li .%Q
+Corporate or foreign author.
+.It Li .%R
+Report name.
+.It Li .%T
+Title of article.
+.It Li .%U
+Optional hypertext reference.
+.It Li .%V
+Volume.
+.El
+.Pp
+Macros beginning with
+.Ql %
+are not callable but accept multiple arguments in the usual way.
+Only the
+.Ql .Tn
+macro is handled properly as a parameter; other macros will cause strange
+output.
+.Ql .%B
+and
+.Ql .%T
+can be used outside of the
+.Ql .Rs/.Re
+environment.
+.Pp
+Example:
+.
+.Bd -literal -offset indent
+\&.Rs
+\&.%A "Matthew Bar"
+\&.%A "John Foo"
+\&.%T "Implementation Notes on foobar(1)"
+\&.%R "Technical Report ABC\-DE\-12\-345"
+\&.%Q "Drofnats College"
+\&.%C "Nowhere"
+\&.%D "April 1991"
+\&.Re
+.Ed
+.Pp
+produces
+.
+.Bd -ragged -offset indent
+.Rs
+.%A "Matthew Bar"
+.%A "John Foo"
+.%T "Implementation Notes on foobar(1)"
+.%R "Technical Report ABC-DE-12-345"
+.%Q "Drofnats College"
+.%C "Nowhere"
+.%D "April 1991"
+.Re
+.Ed
+.
+.Ss "Trade Names or Acronyms"
+.
+The trade name macro prints its arguments at a smaller type size.
+.
+It is intended to imitate a small caps fonts for fully capitalized
+acronyms.
+.
+.
+.Pp
+.Dl Usage: .Tn Ao symbol Ac ...
+.Pp
+.Bl -tag -width ".Li .Tn\ ASCII" -compact -offset 15n
+.It Li ".Tn DEC"
+.Tn DEC
+.It Li ".Tn ASCII"
+.Tn ASCII
+.El
+.Pp
+.
+The default width is 10n.
+.
+.
+.Ss "Extended Arguments"
+.
+The
+.Li .Xo
+and
+.Li .Xc
+macros allow one to extend an argument list on a macro boundary for the
+.Ql .It
+macro (see below).
+Note that
+.Li .Xo
+and
+.Li .Xc
+are implemented similarly to all other macros opening and closing an
+enclosure (without inserting characters, of course).
+This means that the following is true for those macros also.
+.Pp
+Here is an example of
+.Ql .Xo
+using the space mode macro to turn spacing off:
+.
+.Bd -literal -offset indent
+\&.Bd \-literal \-offset indent
+\&.Sm off
+\&.It Xo Sy I Ar operation
+\&.No \een Ar count No \een
+\&.Xc
+\&.Sm on
+\&.Ed
+.Ed
+.Pp
+.
+produces
+.
+.Bd -filled -offset indent
+.Bl -tag -compact
+.Sm off
+.It Xo Sy I Ar operation
+.No \en Ar count No \en
+.Xc
+.Sm on
+.El
+.Ed
+.Pp
+.
+Another one:
+.
+.Bd -literal -offset indent
+\&.Bd \-literal \-offset indent
+\&.Sm off
+\&.It Cm S No / Ar old_pattern Xo
+\&.No / Ar new_pattern
+\&.No / Op Cm g
+\&.Xc
+\&.Sm on
+\&.Ed
+.Ed
+.Pp
+.
+produces
+.
+.Bd -filled -offset indent
+.Bl -tag -compact
+.Sm off
+.It Cm S No \&/ Ar old_pattern Xo
+.No \&/ Ar new_pattern
+.No \&/ Op Cm g
+.Xc
+.Sm on
+.El
+.Ed
+.Pp
+.
+Another example of
+.Ql .Xo
+and enclosure macros: Test the value of a variable.
+.
+.Bd -literal -offset indent
+\&.Bd \-literal \-offset indent
+\&.It Xo
+\&.Ic .ifndef
+\&.Oo \e&! Oc Ns Ar variable Oo
+\&.Ar operator variable No ...
+\&.Oc Xc
+\&.Ed
+.Ed
+.Pp
+.
+produces
+.
+.Bd -filled -offset indent
+.Bl -tag -width flag -compact
+.It Xo
+.Ic .ifndef
+.Oo \&! Oc Ns Ar variable Oo
+.Ar operator variable No ...
+.Oc Xc
+.El
+.Ed
+.Pp
+.
+.
+.Sh "Page structure domain"
+.
+.
+.Ss "Section headings"
+.
+The following
+.Ql .Sh
+section heading macros are required in every man page.
+.
+The remaining section headings are recommended at the discretion of the
+author writing the manual page.
+The
+.Ql .Sh
+macro is parsed but not generally callable.
+It can be used as an argument in a call to
+.Ql .Sh
+only; it then reactivates the default font for
+.Ql .Sh .
+.Pp
+The default width is 8n.
+.
+.Bl -tag -width ".Li .Sh\ Return\ values"
+.It Li ".Sh Name"
+The
+.Ql ".Sh Name"
+macro is mandatory.
+.
+If not specified,
+headers,
+footers,
+and page layout defaults will not be set and things will be rather
+unpleasant.
+.
+The
+.Em Name
+section consists of at least three items.
+The first is the
+.Ql .Nm
+name macro naming the subject of the man page.
+The second is the name description macro,
+.Ql .Nd ,
+which separates the subject name from the third item, which is the
+description.
+The description should be the most terse and lucid possible, as the space
+available is small.
+.Pp
+.Ql .Nd
+first prints
+.Ql \- ,
+then all its arguments.
+.
+.It Li ".Sh Library"
+This section is for section two and three function calls.
+It should consist of a single
+.Ql .Lb
+macro call;
+see
+.Sx "Library Names" .
+.
+.It Li ".Sh Synopsis"
+The
+.Sx Synopsis
+section describes the typical usage of the subject of a man page.
+The macros required are either
+.Ql .Nm ,
+.Ql .Cd ,
+or
+.Ql .Fn
+(and possibly
+.Ql .Fo ,
+.Ql .Fc ,
+.Ql .Fd ,
+and
+.Ql .Ft ) .
+The function name macro
+.Ql .Fn
+is required for manual page sections\~2 and\~3; the command and general name
+macro
+.Ql .Nm
+is required for sections 1, 5, 6, 7, and\~8.
+Section\~4 manuals require a
+.Ql .Nm ,
+.Ql .Fd
+or a
+.Ql .Cd
+configuration device usage macro.
+Several other macros may be necessary to produce the synopsis line as shown
+below:
+.
+.Bd -filled -offset indent
+.Nm cat
+.Op Fl benstuv
+.Op Fl
+.Ar file No ...
+.Ed
+.Pp
+.
+The following macros were used:
+.Pp
+.Dl ".Nm cat"
+.Dl ".Op Fl benstuv"
+.Dl ".Op Fl"
+.Dl ".Ar file No ..."
+.
+.It Li ".Sh Description"
+In most cases the first text in the
+.Sx Description
+section is a brief paragraph on the command, function or file, followed by a
+lexical list of options and respective explanations.
+To create such a list, the
+.Ql .Bl
+(begin list),
+.Ql .It
+(list item) and
+.Ql .El
+(end list)
+macros are used (see
+.Sx Lists and Columns
+below).
+.
+.It Li ".Sh Implementation notes"
+Implementation specific information should be placed here.
+.
+.It Li ".Sh Return values"
+Sections 2, 3 and\~9 function return values should go here.
+The
+.Ql .Rv
+macro may be used to generate text for use in the
+.Sx Return values
+section for most section 2 and 3 library functions;
+see
+.Sx "Return Values" .
+.El
+.Pp
+.
+The following
+.Ql .Sh
+section headings are part of the preferred manual page layout and must
+be used appropriately to maintain consistency.
+They are listed in the order in which they would be used.
+.
+.Bl -tag -width ".Li .Sh\ Compatibility"
+.It Li ".Sh Environment"
+The
+.Em Environment
+section should reveal any related environment variables and clues to their
+behavior and/or usage.
+.
+.It Li ".Sh Files"
+Files which are used or created by the man page subject should be listed via
+the
+.Ql .Pa
+macro in the
+.Sx Files
+section.
+.
+.It Li ".Sh Examples"
+There are several ways to create examples.
+See subsection
+.Sx "Examples and Displays"
+below for details.
+.
+.It Li ".Sh Diagnostics"
+Diagnostic messages from a command should be placed in this section.
+The
+.Ql .Ex
+macro may be used to generate text for use in the
+.Sx Diagnostics
+section for most section 1, 6 and\~8 commands;
+see
+.Sx "Exit Status" .
+.
+.It Li ".Sh Compatibility"
+Known compatibility issues (e.g.\& deprecated options or parameters)
+should be listed here.
+.
+.It Li ".Sh Errors"
+Specific error handling, especially from library functions (man page
+sections 2, 3, and\~9) should go here.
+The
+.Ql .Er
+macro is used to specify an error (errno).
+.
+.It Li ".Sh See also"
+References to other material on the man page topic and cross references
+to other relevant man pages should be placed in the
+.Sx "See also"
+section.
+.
+Cross references are specified using the
+.Ql .Xr
+macro.
+.
+Currently
+.Xr @g@refer @MAN1EXT@
+style references are not accommodated.
+.
+.
+.Pp
+It is recommended that the cross references be sorted by section number,
+then alphabetically by name within each section,
+then separated by commas.
+.
+Example:
+.
+.
+.Pp
+.Xr ls 1 ,
+.Xr ps 1 ,
+.Xr group 5 ,
+.Xr passwd 5
+.
+.It Li ".Sh Standards"
+If the command,
+library function,
+or file adheres to a specific implementation such as
+.St -p1003.2
+or
+.St -ansiC
+this should be noted here.
+.
+If the command does not adhere to any standard,
+its history should be noted in the
+.Em History
+section.
+.
+.It Li ".Sh History"
+Any command which does not adhere to any specific standards should be
+outlined historically in this section.
+.
+.It Li ".Sh Authors"
+Credits should be placed here.
+.
+Use the
+.Ql .An
+macro for names and the
+.Ql .Aq
+macro for email addresses within optional contact information.
+.
+Explicitly indicate whether the person authored the initial manual page
+or the software or whatever the person is being credited for.
+.It Li ".Sh Bugs"
+Blatant problems with the topic go here.
+.El
+.Pp
+.
+User-specified
+.Ql .Sh
+sections may be added; for example, this section was set with:
+.
+.Bd -literal -offset 15n
+\&.Sh "Page structure domain"
+.Ed
+.
+.
+.Ss "Subsection headings"
+.
+Subsection headings have exactly the same syntax as section headings:
+.Ql .Ss
+is parsed but not generally callable.
+It can be used as an argument in a call to
+.Ql .Ss
+only; it then reactivates the default font for
+.Ql .Ss .
+.Pp
+The default width is 8n.
+.
+.
+.Ss "Paragraphs and Line Spacing"
+.
+.Bl -tag -width ".Li .Pp"
+.It Li .Pp
+The
+.Ql .Pp
+paragraph command may be used to specify a line space where necessary.
+The macro is not necessary after a
+.Ql .Sh
+or
+.Ql .Ss
+macro or before a
+.Ql .Bl
+or
+.Ql .Bd
+macro (which both assert a vertical distance unless the
+.Fl compact
+flag is given).
+.Pp
+The macro is neither callable nor parsed and takes no arguments; an
+alternative name is
+.Ql .Lp .
+.El
+.
+.\" XXX
+.
+.\" This worked with version one, need to redo for version three
+.\" .Pp
+.\" .Ds I
+.\" .Cw (ax+bx+c) \ is\ produced\ by\ \&
+.\" .\".Cw (ax+bx+c) \&.Va_by_) \&_and_\& \&[?/]m_b1_e1_f1[?/]\&
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx\ (
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Va ax
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Sy \+
+.\" .Cx
+.\" .Cl Cx \&(\&
+.\" .Va ax
+.\" .Cx +
+.\" .Va by
+.\" .Cx +
+.\" .Va c )
+.\" .Cx \t
+.\" .Em is produced by
+.\" .Cx \t
+.\" .Li \&.Va by
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Sy \+
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Va c )
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx
+.\" .Cx
+.\" .Cw
+.\" .De
+.\" .Pp
+.\" This example shows the same equation in a different format.
+.\" The spaces
+.\" around the
+.\" .Li \&+
+.\" signs were forced with
+.\" .Li \e :
+.\" .Pp
+.\" .Ds I
+.\" .Cw (ax\ +\ bx\ +\ c) \ is\ produced\ by\ \&
+.\" .\".Cw (ax+bx+c) \&.Va_by_) \&_and_\& \&[?/]m_b1_e1_f1[?/]\&
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx\ (
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Va a
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Sy x
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx \e\ +\e\ \e&
+.\" .Cx
+.\" .Cl Cx \&(\&
+.\" .Va a
+.\" .Sy x
+.\" .Cx \ +\ \&
+.\" .Va b
+.\" .Sy y
+.\" .Cx \ +\ \&
+.\" .Va c )
+.\" .Cx \t
+.\" .Em is produced by
+.\" .Cl Cx \t\t
+.\" .Li \&.Va b
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Sy y
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx \e\ +\e\ \e&
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Va c )
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx
+.\" .Cx
+.\" .Cw
+.\" .De
+.\" .Pp
+.\" The incantation below was
+.\" lifted from the
+.\" .Xr adb 1
+.\" manual page:
+.\" .Pp
+.\" .Ds I
+.\" .Cw \&[?/]m_b1_e1_f1[?/]\& is\ produced\ by
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx Op Sy ?/
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Nm m
+.\" .Cx
+.\" .Cl Cx Op Sy ?/
+.\" .Nm m
+.\" .Ad \ b1 e1 f1
+.\" .Op Sy ?/
+.\" .Cx \t
+.\" .Em is produced by
+.\" .Cx \t
+.\" .Li \&.Ar \e\ b1 e1 f1
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Op Sy ?/
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx
+.\" .Cx
+.\" .Cw
+.\" .De
+.\" .Pp
+.
+.
+.Ss Keeps
+.
+The only keep that is implemented at this time is for words.
+.
+The macros are
+.Ql .Bk
+(begin keep)
+and
+.Ql .Ek
+(end keep).
+.
+The only option that
+.Ql .Bk
+currently accepts is
+.Fl words
+(also the default);
+this prevents breaks in the middle of options.
+.
+In the example for
+.Nm make
+command-line arguments
+(see
+.Sx What's in a Name ) ,
+the keep prevents
+.Xr @g@nroff
+from placing the flag and the argument on separate lines.
+.
+.
+.Pp
+Neither macro is callable or parsed.
+.
+.
+.Pp
+More work needs to be done on the keep macros;
+specifically,
+a
+.Fl line
+option should be added.
+.
+.
+.Ss "Examples and Displays"
+.
+There are seven types of displays.
+.
+.
+.Pp
+.Bl -tag -width ".Li .D1"
+.It Li .D1
+(This is D-one.)
+Display one line of indented text.
+This macro is parsed but not callable.
+.
+.
+.Pp
+.D1 Fl ldghfstru
+.
+.
+.Pp
+The above was produced by:
+.Li ".D1 Fl ldghfstru" .
+.
+.It Li .Dl
+(This is D-ell.)
+Display one line of indented
+.Em literal
+text.
+The
+.Ql .Dl
+example macro has been used throughout this file.
+It allows the indentation (display) of one line of text.
+Its default font is set to constant width (literal).
+.Ql .Dl
+is parsed but not callable.
+.
+.
+.Pp
+.Dl % ls \-ldg /usr/local/bin
+.
+.
+.Pp
+The above was produced by:
+.Li ".Dl % ls \e\-ldg /usr/local/bin" .
+.
+.It Li .Bd
+Begin display.
+The
+.Ql .Bd
+display must be ended with the
+.Ql .Ed
+macro.
+It has the following syntax:
+.
+.
+.Pp
+.Bd -ragged -compact
+.Bl -tag -width ".Li .Bd" -offset indent
+.It Li .Bd Xo
+.Bro \-literal | \-filled | \-unfilled | \-ragged | \-centered Brc
+.Oo \-offset Ao string Ac Oc Oo \-file Ao file name Ac Oc Oo \-compact Oc Xc
+.El
+.Ed
+.
+.
+.Pp
+.Bl -tag -width ".Fl file Ao Ar file name Ac " -compact
+.It Fl ragged
+Fill, but do not adjust the right margin (only left-justify).
+.
+.It Fl centered
+Center lines between the current left and right margin.
+.
+Note that each single line is centered.
+.
+.It Fl unfilled
+Do not fill;
+break lines where their input lines are broken.
+.
+This can produce overlong lines without warning messages.
+.
+.It Fl filled
+Display a filled block.
+The block of text is formatted (i.e., the text is justified on both the left
+and right side).
+.
+.It Fl literal
+Display block with literal font (usually fixed-width).
+.
+Useful for source code or simple tabbed or spaced text.
+.
+.It Fl file Ao Ar file name Ac
+The file whose name follows the
+.Fl file
+flag is read and displayed before any data enclosed with
+.Ql .Bd
+and
+.Ql .Ed ,
+using the selected display type.
+.
+Any
+.Xr @g@troff/ Ns Xr mdoc
+commands in the file will be processed.
+.
+.It Fl offset Ao Ar string Ac
+If
+.Fl offset
+is specified with one of the following strings, the string is interpreted to
+indicate the level of indentation for the forthcoming block of text:
+.
+.
+.Pp
+.Bl -tag -width ".Ar indent-two" -compact
+.It Ar left
+Align block on the current left margin; this is the default mode of
+.Ql .Bd .
+.It Ar center
+Supposedly center the block.
+At this time unfortunately, the block merely gets left aligned about an
+imaginary center margin.
+.It Ar indent
+Indent by one default indent value or tab.
+The default indent value is also used for the
+.Ql .D1
+and
+.Ql .Dl
+macros, so one is guaranteed the two types of displays will line up.
+The indentation value is normally set to\~6n or about two thirds of an inch
+(six constant width characters).
+.It Ar indent\-two
+Indent two times the default indent value.
+.It Ar right
+This
+.Em left
+aligns the block about two inches from the right side of the page.
+This macro needs work and perhaps may never do the right thing within
+.Xr @g@troff .
+.El
+.
+.
+.Pp
+If
+.Ao string Ac
+is a valid numeric expression instead
+.Pf ( Em with a scaling indicator other than
+.Sq Em u ) ,
+use that value for indentation.
+The most useful scaling indicators are
+.Sq m
+and
+.Sq n ,
+specifying the so-called
+.Em \&Em
+and
+.Em "En square" .
+.
+This is approximately the width of the letters
+.Sq m
+and
+.Sq n
+respectively
+of the current font
+(for
+.Xr nroff
+output,
+both scaling indicators give the same values).
+.
+If
+.Ao string Ac
+isn't a numeric expression, it is tested whether it is an
+.Xr mdoc
+macro name, and the default offset value associated with this macro is used.
+Finally, if all tests fail,
+the width of
+.Ao string Ac
+(typeset with a fixed-width font) is taken as the offset.
+.It Fl compact
+Suppress insertion of vertical space before begin of display.
+.El
+.
+.It Li .Ed
+End display (takes no arguments).
+.El
+.
+.
+.Ss "Lists and Columns"
+.
+There are several types of lists which may be initiated with the
+.Ql .Bl
+begin-list macro.
+.
+Items within the list are specified with the
+.Ql .It
+item macro,
+and each list must end with the
+.Ql .El
+macro.
+.
+Lists may be nested within themselves and within displays.
+.
+The use of columns inside of lists or lists inside of columns is
+untested.
+.
+.
+.Pp
+In addition,
+several list attributes may be specified such as the width of a tag,
+the list offset,
+and compactness
+(blank lines between items allowed or disallowed).
+.
+Most of this document has been formatted with a tag style list
+.Pf ( Fl tag ) .
+.
+.
+.Pp
+It has the following syntax forms:
+.
+.
+.Pp
+.Bd -ragged -compact
+.Bl -tag -width ".Li .Bl" -offset indent -compact
+.It Li .Bl Xo
+.Bro \-hang | \-ohang | \-tag | \-diag | \-inset Brc
+.Oo \-width Ao string Ac Oc
+.Oo \-offset Ao string Ac Oc Oo \-compact Oc Xc
+.It Li .Bl Xo
+.No \-column Oo \-offset Ao string Ac Oc
+.Ao string1 Ac Ao string2 Ac ... Xc
+.It Li .Bl Xo
+.Bro \-item | \-enum Oo \-nested Oc | \-bullet | \-hyphen | \-dash Brc
+.Oo \-offset Ao string Ac Oc Oo \-compact Oc Xc
+.El
+.Ed
+.
+.
+.Pp
+And now a detailed description of the list types.
+.
+.
+.Pp
+.Bl -tag -width ".Fl column" -compact
+.It Fl bullet
+A bullet list.
+.
+.Bd -literal -offset indent
+\&.Bl \-bullet \-offset indent \-compact
+\&.It
+Bullet one goes here.
+\&.It
+Bullet two here.
+\&.El
+.Ed
+.
+.
+.Pp
+Produces:
+.
+.
+.Pp
+.Bl -bullet -offset indent -compact
+.It
+Bullet one goes here.
+.It
+Bullet two here.
+.El
+.
+.
+.Pp
+.
+.It Fl dash No ( or Fl hyphen )
+A dash list.
+.
+.Bd -literal -offset indent
+\&.Bl \-dash \-offset indent \-compact
+\&.It
+Dash one goes here.
+\&.It
+Dash two here.
+\&.El
+.Ed
+.
+.
+.Pp
+Produces:
+.
+.
+.Pp
+.Bl -dash -offset indent -compact
+.It
+Dash one goes here.
+.It
+Dash two here.
+.El
+.
+.
+.Pp
+.It Fl enum
+An enumerated list.
+.
+.Bd -literal -offset indent
+\&.Bl \-enum \-offset indent \-compact
+\&.It
+Item one goes here.
+\&.It
+And item two here.
+\&.El
+.Ed
+.
+.
+.Pp
+The result:
+.
+.
+.Pp
+.Bl -enum -offset indent -compact
+.It
+Item one goes here.
+.It
+And item two here.
+.El
+.
+.
+.Pp
+If you want to nest enumerated lists,
+use the
+.Fl nested
+flag
+(starting with the second-level list):
+.
+.Bd -literal -offset indent
+\&.Bl \-enum \-offset indent \-compact
+\&.It
+Item one goes here
+\&.Bl \-enum \-nested \-compact
+\&.It
+Item two goes here.
+\&.It
+And item three here.
+\&.El
+\&.It
+And item four here.
+\&.El
+.Ed
+.
+.
+.Pp
+Result:
+.
+.
+.Pp
+.Bl -enum -offset indent -compact
+.It
+Item one goes here.
+.Bl -enum -nested -compact
+.It
+Item two goes here.
+.It
+And item three here.
+.El
+.It
+And item four here.
+.El
+.
+.
+.Pp
+.
+.It Fl item
+A list of type
+.Fl item
+without list markers.
+.
+.Bd -literal -offset indent
+\&.Bl \-item \-offset indent
+\&.It
+Item one goes here.
+Item one goes here.
+Item one goes here.
+\&.It
+Item two here.
+Item two here.
+Item two here.
+\&.El
+.Ed
+.
+.
+.Pp
+Produces:
+.
+.
+.Pp
+.Bl -item -offset indent
+.It
+Item one goes here.
+Item one goes here.
+Item one goes here.
+.It
+Item two here.
+Item two here.
+Item two here.
+.El
+.
+.
+.Pp
+.It Fl tag
+A list with tags.
+Use
+.Fl width
+to specify the tag width.
+.
+.
+.Pp
+.Bl -tag -width "PPID" -compact -offset indent
+.It SL
+sleep time of the process (seconds blocked)
+.It PAGEIN
+number of disk I/O operations resulting from references by the process
+to pages not loaded in core.
+.It UID
+numerical user-id of process owner
+.It PPID
+numerical id of parent of process priority
+(non-positive when in non-interruptible wait)
+.El
+.
+.
+.Pp
+The raw text:
+.
+.Bd -literal -offset indent
+\&.Bl \-tag \-width "PPID" \-compact \-offset indent
+\&.It SL
+sleep time of the process (seconds blocked)
+\&.It PAGEIN
+number of disk I/O operations resulting from references
+by the process to pages not loaded in core.
+\&.It UID
+numerical user\-id of process owner
+\&.It PPID
+numerical id of parent of process priority
+(non\-positive when in non\-interruptible wait)
+\&.El
+.Ed
+.
+.
+.Pp
+.It Fl diag
+Diag lists create section four diagnostic lists and are similar to inset
+lists except callable macros are ignored.
+The
+.Fl width
+flag is not meaningful in this context.
+.
+.
+.Pp
+Example:
+.
+.Bd -literal -offset indent
+\&.Bl \-diag
+\&.It You can't use Sy here.
+The message says all.
+\&.El
+.Ed
+.
+.
+.Pp
+produces
+.
+.Bl -diag
+.It You can't use Sy here.
+The message says all.
+.El
+.
+.
+.Pp
+.It Fl hang
+A list with hanging tags.
+.
+.Bl -hang -offset indent
+.It Em Hanged
+labels appear similar to tagged lists when the
+label is smaller than the label width.
+.It Em Longer hanged list labels
+blend into the paragraph unlike
+tagged paragraph labels.
+.El
+.
+.
+.Pp
+And the unformatted text which created it:
+.
+.Bd -literal -offset indent
+\&.Bl \-hang \-offset indent
+\&.It Em Hanged
+labels appear similar to tagged lists when the
+label is smaller than the label width.
+\&.It Em Longer hanged list labels
+blend into the paragraph unlike
+tagged paragraph labels.
+\&.El
+.Ed
+.
+.
+.Pp
+.It Fl ohang
+Lists with overhanging tags do not use indentation for the items;
+tags are written to a separate line.
+.
+.
+.Pp
+.Bl -ohang -offset indent
+.It Sy SL
+sleep time of the process (seconds blocked)
+.It Sy PAGEIN
+number of disk I/O operations resulting from references by the process
+to pages not loaded in core.
+.It Sy UID
+numerical user-id of process owner
+.It Sy PPID
+numerical id of parent of process priority
+(non-positive when in non-interruptible wait)
+.El
+.
+.
+.Pp
+The raw text:
+.
+.Bd -literal -offset indent
+\&.Bl \-ohang \-offset indent
+\&.It Sy SL
+sleep time of the process (seconds blocked)
+\&.It Sy PAGEIN
+number of disk I/O operations resulting from references
+by the process to pages not loaded in core.
+\&.It Sy UID
+numerical user\-id of process owner
+\&.It Sy PPID
+numerical id of parent of process priority
+(non\-positive when in non\-interruptible wait)
+\&.El
+.Ed
+.
+.
+.Pp
+.It Fl inset
+Here is an example of inset labels:
+.Bl -inset -offset indent
+.It Em Tag
+The tagged list (also called a tagged paragraph)
+is the most common type of list used in the
+Berkeley manuals.
+Use a
+.Fl width
+attribute as described below.
+.It Em Diag
+Diag lists create section four diagnostic lists
+and are similar to inset lists except callable
+macros are ignored.
+.It Em Hang
+Hanged labels are a matter of taste.
+.It Em Ohang
+Overhanging labels are nice when space is constrained.
+.It Em Inset
+Inset labels are useful for controlling blocks of
+paragraphs and are valuable for converting
+.Xr mdoc
+manuals to other formats.
+.El
+.
+.
+.Pp
+Here is the source text which produced the above example:
+.
+.Bd -literal -offset indent
+\&.Bl \-inset \-offset indent
+\&.It Em Tag
+The tagged list (also called a tagged paragraph)
+is the most common type of list used in the
+Berkeley manuals.
+\&.It Em Diag
+Diag lists create section four diagnostic lists
+and are similar to inset lists except callable
+macros are ignored.
+\&.It Em Hang
+Hanged labels are a matter of taste.
+\&.It Em Ohang
+Overhanging labels are nice when space is constrained.
+\&.It Em Inset
+Inset labels are useful for controlling blocks of
+paragraphs and are valuable for converting
+\&.Xr mdoc
+manuals to other formats.
+\&.El
+.Ed
+.
+.
+.Pp
+.
+.It Fl column
+This list type generates multiple columns.
+The number of columns and the width of each column is determined by the
+arguments to the
+.Fl column
+list,
+.Aq Ar string1 ,
+.Aq Ar string2 ,
+etc.
+If
+.Aq Ar stringN
+starts with a
+.Ql .\&
+(dot) immediately followed by a valid
+.Xr mdoc
+macro name, interpret
+.Aq Ar stringN
+and use the width of the result.
+Otherwise, the width of
+.Aq Ar stringN
+(typeset with a fixed-width font) is taken as the
+.Ar N Ns th
+column width.
+.
+.
+.Pp
+Each
+.Ql .It
+argument is parsed to make a row, each column within the row is a separate
+argument separated by a tab or the
+.Ql .Ta
+macro.
+.
+.
+.Pp
+The table:
+.
+.Bl -column -offset indent ".Sy String" ".Sy Nroff" ".Sy Troff"
+.It Sy String Ta Sy Nroff Ta Sy Troff
+.It Li <= Ta <= Ta \*(<=
+.It Li >= Ta >= Ta \*(>=
+.El
+.
+.
+.Pp
+was produced by:
+.
+.Bd -literal
+\&.Bl \-column \-offset indent ".Sy String" ".Sy Nroff" ".Sy Troff"
+\&.It Sy String Ta Sy Nroff Ta Sy Troff
+\&.It Li <= Ta <= Ta \e*(<=
+\&.It Li >= Ta >= Ta \e*(>=
+\&.El
+.Ed
+.
+.
+.Pp
+Don't abuse this list type!
+.
+For more complicated cases it might be far better and easier to use
+.Xr @g@tbl @MAN1EXT@ ,
+the table preprocessor.
+.El
+.
+.
+.Pp
+Other keywords:
+.
+.Bl -tag -width ".Fl indent Ao Ar string Ac"
+.It Fl width Ao Ar string Ac
+If
+.Aq Ar string
+starts with a
+.Ql .\&
+(dot) immediately followed by a valid
+.Xr mdoc
+macro name, interpret
+.Aq Ar string
+and use the width of the result.
+.
+Almost all lists in this document use this option.
+.
+.
+.Pp
+Example:
+.
+.Bd -literal -offset indent
+\&.Bl \-tag \-width ".Fl test Ao Ar string Ac"
+\&.It Fl test Ao Ar string Ac
+This is a longer sentence to show how the
+\&.Fl width
+flag works in combination with a tag list.
+\&.El
+.Ed
+.
+.
+.Pp
+gives:
+.
+.Bl -tag -width ".Fl test Ao Ar string Ac"
+.It Fl test Ao Ar string Ac
+This is a longer sentence to show how the
+.Fl width
+flag works in combination with a tag list.
+.El
+.
+.
+.Pp
+(Note that the current state of
+.Xr mdoc
+is saved before
+.Aq Ar string
+is interpreted;
+afterwards,
+all variables are restored again.
+.
+However,
+boxes
+(used for enclosures)
+can't be saved in
+.Tn GNU
+.Xr @g@troff @MAN1EXT@ ;
+as a consequence,
+arguments must always be
+.Em balanced
+to avoid nasty errors.
+.
+For example,
+do not write
+.Ql ".Ao Ar string"
+but
+.Ql ".Ao Ar string Xc"
+instead if you really need only an opening angle bracket.)
+.
+.
+.Pp
+Otherwise,
+if
+.Aq Ar string
+is a valid numeric expression
+.Em ( with a scaling indicator other than
+.Sq Em u ) ,
+use that value for indentation.
+The most useful scaling indicators are
+.Sq m
+and
+.Sq n ,
+specifying the so-called
+.Em \&Em
+and
+.Em "En square" .
+This is approximately the width of the letters
+.Sq m
+and
+.Sq n
+respectively
+of the current font
+(for
+.Xr @g@nroff
+output,
+both scaling indicators give the same values).
+.
+If
+.Aq Ar string
+isn't a numeric expression, it is tested whether it is an
+.Xr mdoc
+macro name, and the default width value associated with this macro is used.
+Finally, if all tests fail,
+the width of
+.Aq Ar string
+(typeset with a fixed-width font) is taken as the width.
+.
+.
+.Pp
+If a width is not specified for the tag list type,
+.Sq 6n
+is used.
+.It Fl offset Ao Ar string Ac
+If
+.Aq Ar string
+is
+.Ar indent ,
+a default indent value (normally set to\~6n,
+similar to the value used in
+.Ql .Dl
+or
+.Ql .Bd )
+is used.
+If
+.Aq Ar string
+is a valid numeric expression instead
+.Pf ( Em with a scaling indicator other than
+.Sq Em u ) ,
+use that value for indentation.
+The most useful scaling indicators are
+.Sq m
+and
+.Sq n ,
+specifying the so-called
+.Em \&Em
+and
+.Em "En square" .
+.
+This is approximately the width of the letters
+.Sq m
+and
+.Sq n
+respectively
+of the current font
+(for
+.Xr nroff
+output,
+both scaling indicators give the same values).
+.
+If
+.Aq Ar string
+isn't a numeric expression, it is tested whether it is an
+.Xr mdoc
+macro name, and the default offset value associated with this macro is used.
+Finally, if all tests fail,
+the width of
+.Aq Ar string
+(typeset with a fixed-width font) is taken as the offset.
+.It Fl compact
+Suppress insertion of vertical space before the list and between list items.
+.El
+.
+.
+.Sh "Miscellaneous macros"
+.
+A double handful of macros fit only uncomfortably into one of the above
+sections.
+.
+Of these,
+we couldn't find attested examples for
+.Ql \&Me
+or
+.Ql \&Ot .
+.
+They are documented here for completeness\[em]if you know their proper
+usage,
+please send a mail to
+.Mt groff@gnu.org
+and include a specimen with its provenance.
+.
+.
+.Bl -tag -width ".Li .Bt"
+.It Li .Bt
+formats boilerplate text.
+.
+.\" XXX: .Bt gets parsed (i.e., called) _and_ measured even _with_ a
+.\" leading dot. See Savannah #63672.
+.Bl -tag -width \&.Bt -offset indent
+.It Li .Bt
+\[->]
+.Bt
+.El
+.
+.
+.Pp
+It is neither callable nor parsed and takes no arguments.
+.
+Its default width is 6n.
+.
+.
+.It Li .Fr
+is an obsolete means of specifying a function return value.
+.
+.
+.Pp
+.D1 Usage: Pf . Ic \&Fr Ar return-value No ...
+.
+.
+.Pp
+.Ql \&Fr
+allows a break right before the return value
+(usually a single digit)
+which is bad typographical behaviour.
+.
+Instead,
+set the return value with the rest of the code,
+using
+.Ql \[rs]\[ti]
+to tie the return value to the previous word.
+.
+.
+.Pp
+Its default width is 12n.
+.
+.
+.It Li .Hf
+Inlines the contents of a (header) file into the document.
+.
+.
+.Pp
+.D1 Usage: Pf . Ic \&Hf Ar file
+.
+.
+.Pp
+It first prints
+.Ql File:
+followed by the file name,
+then the contents of
+.Ar file .
+.
+It is neither callable nor parsed.
+.
+.
+.It Li .Lk
+Embed hyperlink.
+.
+.
+.Pp
+.D1 Usage: Pf . Ic \&Lk Ar uri Op Ar link-text
+.
+.
+.Pp
+Its default width is 6n.
+.
+.
+.It Li .Me
+Usage unknown.
+.
+The
+.Xr mdoc
+sources describe it as a macro for
+.Dq "menu entries" .
+.
+.
+.Pp
+Its default width is 6n.
+.
+.
+.It Li .Mt
+Embed email address.
+.
+.
+.Pp
+.D1 Usage: Pf . Ic \&Mt Ar email-address
+.
+.
+.Pp
+Its default width is 6n.
+.
+.
+.It Li .Ot
+Usage unknown.
+The
+.Xr mdoc
+sources describe it as
+.Dq "old function type (fortran)" .
+.
+.
+.It Li .Sm
+Manipulate or toggle argument-spacing mode.
+.
+.
+.Pp
+.D1 Usage: Pf . Ic \&Sm Oo Li on | Li off Oc ...
+.
+.
+.Pp
+If argument-spacing mode is off,
+no spaces between macro arguments are inserted.
+.
+If called without a parameter
+(or if the next parameter is neither
+.Ql on
+nor
+.Ql off ) ,
+.Ql \&Sm
+toggles argument-spacing mode.
+.
+.
+.Pp
+Its default width is 8n.
+.\" XXX: The package demands it, but how is that meaningful?
+.
+.
+.It Li .Ud
+formats boilerplate text.
+.
+.\" XXX: .Ud gets parsed (i.e., called) _and_ measured even _with_ a
+.\" leading dot. See Savannah #63672.
+.Bl -tag -width \&.Ud -offset indent
+.It Li .Ud
+\[->]
+.Ud
+.El
+.
+.
+.Pp
+It is neither callable nor parsed and takes no arguments.
+.
+Its default width is 8n.
+.El
+.
+.
+.Sh "Predefined strings"
+.
+The following strings are predefined for compatibility with legacy
+.Xr mdoc
+documents.
+.
+Contemporary ones should use the alternatives shown in the
+.Dq Prefer
+column below.
+.
+See
+.Xr groff_char @MAN7EXT@
+for a full discussion of these special character escape sequences.
+.
+.
+.Pp
+.\" Note: This table pushes 80-column ASCII and Latin-1 terminals to
+.\" the limits of their capacity. Observe the spacing parameters of the
+.\" 2nd and 3rd columns; we had to steal a character cell from each (the
+.\" default is 3) because in the UCS column, the word "infinity" gets
+.\" written out in full, which in turn pushes the >= and Ge rows past
+.\" the 78n norm. Update with caution. See Savannah #59424.
+.TS
+Cb Lb2 Lb2 Lb Lb Lb
+Lf(CR) L2 L2 L Lf(CR) L.
+String 7-bit 8-bit UCS Prefer Meaning
+\[rs]*(<= <= <= \*[<=] \[rs](<= less than or equal to
+\[rs]*(>= >= >= \*[>=] \[rs](>= greater than or equal to
+\[rs]*(Rq " " \*[Rq] \[rs](rq right double quote
+\[rs]*(Lq " " \*[Lq] \[rs](lq left double quote
+\[rs]*(ua \[ha] \[ha] \*[ua] \[rs](ua vertical arrow up
+\[rs]*(aa \[aq] \' \*[aa] \[rs](aa acute accent
+\[rs]*(ga \` \` \*[ga] \[rs](ga grave accent
+\[rs]*(q \&" \&" \*[q] \[rs](dq neutral double quote
+\[rs]*(Pi pi pi \*[Pi] \[rs](*p lowercase pi
+\[rs]*(Ne != != \*[Ne] \[rs](!= not equals
+\[rs]*(Le <= <= \*[Le] \[rs](<= less than or equal to
+\[rs]*(Ge >= >= \*[Ge] \[rs](>= greater than or equal to
+\[rs]*(Lt < < \*[Lt] < less than
+\[rs]*(Gt > > \*[Gt] > greater than
+\[rs]*(Pm +\- \[+-] \*[Pm] \[rs](+\- plus or minus
+\[rs]*(If infinity infinity \*[If] \[rs](if infinity
+\[rs]*(Am \*[Am] \*[Am] \*[Am] & ampersand
+\[rs]*(Na \*[Na] \*[Na] \*[Na] NaN not a number
+\[rs]*(Ba \*[Ba] \*[Ba] \*[Ba] | bar
+.TE
+.
+.
+.Pp
+Some column headings are shorthand for standardized character encodings;
+\[lq]7-bit\[rq] for ISO 646:1991 IRV (US-ASCII),
+\[lq]8-bit\[rq] for ISO 8859-1 (Latin-1) and IBM code page 1047,
+and
+\[lq]UCS\[rq] for ISO 10646 (Unicode character set).
+.
+Historically, \" (\[ti]1989)
+.Xr mdoc
+configured the string definitions to fit the capabilities expected of
+the output device.
+.
+Old typesetters \" like the C/A/T
+lacked directional double quotes,
+producing repeated directional single quotes
+\[oq]\[oq]like this\[cq]\[cq];
+early versions of
+.Xr mdoc
+in fact defined the
+.Ql Lq
+and
+.Ql Rq
+strings this way. \" thanks to Ingo Schwarze for the research
+.
+Nowadays,
+output drivers \" technically, their macro files or font descriptions
+take on the responsibility of glyph substitution,
+as they possess relevant knowledge of their available repertoires.
+.
+.
+.Sh Diagnostics
+.
+The debugging macro
+.Ql .Db
+offered by
+previous versions of
+.Xr mdoc
+is unavailable in
+.Tn GNU
+.Xr @g@troff @MAN1EXT@
+since the latter provides better facilities to check parameters;
+additionally,
+.Xr "groff mdoc"
+implements many error and warning messages,
+making the package more robust and more verbose.
+.
+.
+.Pp
+The remaining debugging macro is
+.Ql .Rd ,
+which dumps the package's global register and string contents to the
+standard error stream.
+.
+A normal user will never need it.
+.
+.
+.Sh Options
+.
+The following
+.Xr groff
+options set registers
+(with
+.Fl r )
+and strings
+(with
+.Fl d )
+recognized and used by the
+.Xr mdoc
+macro package.
+.
+To ensure rendering consistent with output device capabilities and
+reader preferences,
+man pages should never manipulate them.
+.
+.
+.Pp
+Setting string
+.Ql AD
+configures the adjustment mode for most formatted text.
+.
+Typical values are
+.Ql b
+for adjustment to both margins
+(the default),
+or
+.Ql l
+for left alignment
+(ragged right margin).
+.
+Any valid argument to
+.Xr groff Ns 's
+.Ql ad
+request may be used.
+.
+See
+.Xr groff @MAN7EXT@
+for less-common choices.
+.
+.Dl groff \-Tutf8 \-dAD=l \-mdoc groff_mdoc.7 | less \-R
+.
+.
+.Pp
+Setting register
+.Ql C
+to\~1 numbers output pages consecutively,
+rather than resetting the page number to\~1
+(or the value of register
+.Ql P )
+with each new
+.Xr mdoc
+document.
+.
+.
+.Pp
+By default,
+the package inhibits page breaks,
+headers,
+and footers in the midst of the document text if it is being displayed
+with a terminal device such as
+.Sq latin1
+or
+.Sq utf8 ,
+to enable more efficient viewing of the page.
+.
+This behavior can be changed to format the page as if for 66-line
+Teletype output by setting the continuous rendering register
+.Ql cR
+to zero while calling
+.Xr groff @MAN1EXT@ .
+.
+.Dl groff \-Tlatin1 \-rcR=0 \-mdoc foo.man > foo.txt
+.
+On HTML devices,
+it cannot be disabled.
+.
+.
+.Pp
+Section headings
+(defined with
+.Ql .Sh )
+and page titles in headers
+(defined with
+.Ql .Dt )
+can be presented in full capitals by setting the registers
+.Ql CS
+and
+.Ql CT ,
+respectively,
+to 1.
+.
+These transformations are off by default because they discard case
+distinction information.
+.
+.
+.Pp
+Setting register
+.Ql D
+to\~1 enables double-sided page layout,
+which is only distinct when not continuously rendering.
+.
+It places the page number at the bottom right on odd-numbered (recto)
+pages,
+and at the bottom left on even-numbered (verso) pages,
+swapping places with the arguments to
+.Ql .Os .
+.
+.Dl groff \-Tps \-rD1 \-mdoc foo.man > foo.ps
+.
+.
+.Pp
+The value of the
+.Ql FT
+register determines the footer's distance from the page bottom;
+this amount is always negative and should specify a scaling unit.
+.
+At one half-inch above this location,
+the page text is broken before writing the footer.
+.
+It is ignored if continuous rendering is enabled.
+.
+The default is \-0.5i.
+.
+.
+.Pp
+The
+.Ql HF
+string sets
+the font used for section and subsection headings;
+the default is
+.Ql B
+(bold style of the default family).
+.
+Any valid argument to
+.Xr groff Ns 's
+.Ql ft
+request may be used.
+.
+.
+.Pp
+Normally,
+automatic hyphenation is enabled using a mode appropriate to the
+.Xr groff
+locale;
+see section \[lq]Localization\[lq] of
+.Xr groff @MAN7EXT@ .
+.
+It can be disabled by setting the
+.Ql HY
+register to zero.
+.
+.Dl groff \-Tutf8 \-rHY=0 \-mdoc foo.man | less \-R
+.
+.
+.Pp
+The paragraph and subsection heading indentation amounts can be changed
+by setting the registers
+.Ql IN
+and
+.Ql SN .
+.
+.Dl groff \-Tutf8 \-rIN=5n \-rSN=2n \-mdoc foo.man | less \-R
+.
+The default paragraph indentation is 7.2n on typesetters and 7n on
+terminals.
+.
+The default subsection heading indentation amount is 3n;
+section headings are set with an indentation of zero.
+.
+.
+.Pp
+The line and title lengths can be changed by setting the registers
+.Ql LL
+and
+.Ql LT ,
+respectively:
+.
+.Dl groff \-Tutf8 \-rLL=100n \-rLT=100n \-mdoc foo.man | less \-R
+.
+If not set,
+both registers default to 78n for terminal devices and 6.5i otherwise.
+.
+.
+.Pp
+Setting the
+.Ql P
+register starts enumeration of pages at its value.
+.
+The default is\~1.
+.
+.
+.Pp
+To change the document font size to 11p or 12p,
+set register
+.Ql S
+accordingly:
+.
+.Dl groff \-Tdvi \-rS11 \-mdoc foo.man > foo.dvi
+.
+Register
+.Ql S
+is ignored when formatting for terminal devices.
+.
+.
+.Pp
+Setting the
+.Ql X
+register to a page number
+.Ar p
+numbers its successors as
+.Ar p Ns Li a ,
+.Ar p Ns Li b ,
+.Ar p Ns Li c ,
+and so forth.
+.
+The register tracking the suffixed page letter uses format
+.Ql a
+(see the
+.Ql af
+request in
+.Xr groff @MAN7EXT@ ) .
+.
+.
+.br
+.ne 4v
+.Sh Files
+.
+.Bl -tag
+.It Pa @MACRODIR@/\:andoc\:.tmac
+This brief
+.Xr groff
+program detects whether the
+.Xr man
+or
+.Xr mdoc
+macro package is being used by a document and loads the correct macro
+definitions,
+taking advantage of the fact that pages using them must call
+.Li TH
+or
+.Li Dd ,
+respectively,
+before any other macros.
+.
+A user typing,
+for example,
+.Dl groff \-mandoc page.1
+need not know which package the file
+.Pa page.1
+uses.
+.
+Multiple man pages,
+in either format,
+can be handled;
+.Pa \%andoc\:.tmac
+reloads each macro package as necessary.
+.
+.
+.It Pa @MACRODIR@/\:doc\:.tmac
+implements the bulk of the
+.Xr groff Xr mdoc
+package and loads further components as needed from the
+.Pa mdoc
+subdirectory.
+.
+.
+.It Pa @MACRODIR@/\:mdoc\:.tmac
+is a wrapper that loads
+.Pa doc.tmac .
+.
+.
+.It Pa @MACRODIR@/\:mdoc/\:doc\-common
+defines macros,
+registers,
+and strings
+concerned with the production of formatted output.
+.\" XXX: This is a weak explanation. The boundary between doc.tmac's
+.\" concerns and doc-common's is not at all clear to GBR. Should some
+.\" of these files be merged?
+.
+It includes strings of the form
+.Ql doc\-volume\-ds\- Ns Ar X
+and
+.Ql doc\-volume\-as\- Ns Ar X
+for manual section titles and architecture identifiers,
+respectively,
+where
+.Ar X
+is an argument recognized by
+.Pf . Ic \&Dt .
+.
+.
+.It Pa @MACRODIR@/\:mdoc/\:doc\-nroff
+defines parameters appropriate for rendering to terminal devices.
+.
+.
+.It Pa @MACRODIR@/\:mdoc/\:doc\-ditroff
+defines parameters appropriate for rendering to typesetter devices.
+.
+.
+.It Pa @MACRODIR@/\:mdoc/\:doc\-syms
+defines many strings and macros that interpolate formatted text,
+such as names of operating system releases,
+*BSD libraries,
+and standards documents.
+.
+The string names are of the form
+.Ql doc\-str\- Ns Ar O Ns Li \- Ns Ar V ,
+.Ql doc\-str\-St Ns Li \-\- Ns Ar S Ns Li \- Ns Ar I
+(observe the double dashes),
+or
+.Ql doc\-str\-Lb\- Ns Ar L ,
+where
+.Ar O
+is one of the operating system macros from section
+.Sx "General text domain"
+above,
+.Ar V
+is an encoding of an operating system release
+(sometimes omitted along with the
+.Ql \-
+preceding it),
+.Ar S
+an identifier for a standards body or committee,
+.Ar I
+one for an issue of a standard promulgated by
+.Ar S ,
+and
+.Ar L
+a keyword identifying a *BSD library.
+.
+.
+.It Pa @LOCALMACRODIR@/\:mdoc\:.local
+This file houses local additions and customizations to the package.
+.
+It can be empty.
+.El
+.
+.
+.Sh "See also"
+.
+The
+.Lk https://mandoc.bsd.lv/ mandoc
+project maintains an independent implementation of the
+.Xr mdoc
+language and a renderer that directly parses its markup as well as that
+of
+.Xr man .
+.
+.
+.Pp
+.Xr groff @MAN1EXT@ ,
+.Xr man 1 ,
+.Xr @g@troff @MAN1EXT@ ,
+.Xr groff_man @MAN7EXT@ ,
+.Xr mdoc 7
+.
+.
+.Sh Bugs
+.
+Section 3f has not been added to the header routines.
+.
+.
+.Pp
+.Ql .Fn
+needs to have a check to prevent splitting up the line if its length is
+too short.
+.
+Occasionally it separates the last parenthesis,
+and sometimes looks ridiculous if output lines are being filled.
+.
+.
+.Pp
+The list and display macros do not do any keeps and certainly should be
+able to.
+.
+.
+.Pp
+As of
+.Xr groff
+1.23,
+.Ql \&Tn
+no longer changes the type size;
+this functionality may return in the next release.
+.\" Note what happens if the parameter list overlaps a newline
+.\" boundary.
+.\" to make sure a line boundary is crossed:
+.\" .Bd -literal
+.\" \&.Fn struct\e\ dictionarytable\e\ *dictionarylookup struct\e\ dictionarytable\e\ *tab[]
+.\" .Ed
+.\" .
+.\" .
+.\" .Pp
+.\" produces, nudge nudge,
+.\" .Fn struct\ dictionarytable\ *dictionarylookup char\ *h struct\ dictionarytable\ *tab[] ,
+.\" .Fn struct\ dictionarytable\ *dictionarylookup char\ *h struct\ dictionarytable\ *tab[] ,
+.\" nudge
+.\" .Fn struct\ dictionarytable\ *dictionarylookup char\ *h struct\ dictionarytable\ *tab[] .
+.\" .
+.\" .
+.\" .Pp
+.\" If double quotes are used, for example:
+.\" .Bd -literal
+.\" \&.Fn \*qstruct dictionarytable *dictionarylookup\*q \*qchar *h\*q \*qstruct dictionarytable *tab[]\*q
+.\" .Ed
+.\" .
+.\" .
+.\" .Pp
+.\" produces, nudge nudge,
+.\" .Fn "struct dictionarytable *dictionarylookup" "char *h" "struct dictionarytable *tab[]" ,
+.\" nudge
+.\" .Fn "struct dictionarytable *dictionarylookup" "char *h" "struct dictionarytable *tab[]" ,
+.\" nudge
+.\" .Fn "struct dictionarytable *dictionarylookup" "char *h" "struct dictionarytable *tab[]" .
+.\" .
+.\" .
+.\" .Pp
+.\" Not a pretty sight...
+.\" In a paragraph, a long parameter containing unpaddable spaces as
+.\" in the former example will cause
+.\" .Xr @g@troff
+.\" to break the line and spread
+.\" the remaining words out.
+.\" The latter example will adjust nicely to
+.\" justified margins, but may break in between an argument and its
+.\" declaration.
+.\" In
+.\" .Xr @g@nroff
+.\" the right margin is normally ragged and the problem is not as
+.\" severe.
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_mdoc_7_man_C]
+.do rr *groff_groff_mdoc_7_man_C
+.
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/groff_me.7.man b/tmac/groff_me.7.man
new file mode 100644
index 0000000..38735d1
--- /dev/null
+++ b/tmac/groff_me.7.man
@@ -0,0 +1,601 @@
+'\" t
+.TH groff_me @MAN7EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+groff_me \- \(lqme\(rq macro package for formatting
+.I roff
+documents
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1980, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in
+.\" the documentation and/or other materials provided with the
+.\" distribution.
+.\" 3. [Deleted. See
+.\" ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change]
+.\" 4. Neither the name of the University nor the names of its
+.\" contributors may be used to endorse or promote products derived
+.\" from this software without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS"
+.\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+.\" PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
+.\" CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)me.7 8.1 (Berkeley) 06/05/93
+.\"
+.\" Modified for groff by jjc@jclark.com
+.\" Changed to use TBL and eliminate low-level troff hackery by ESR
+.\" (this enables it to be lifted to structural markup).
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_me_7_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY "groff \-me"
+.RI [ option\~ .\|.\|.\&]
+.RI [ file\~ .\|.\|.]
+.
+.SY "groff \-m me"
+.RI [ option\~ .\|.\|.\&]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The GNU implementation of the
+.I me
+macro package is part of the
+.I groff
+document formatting system.
+.
+The
+.I me
+package of macro definitions for the
+.I roff
+language provides a convenient facility for preparing technical papers
+in various formats.
+.
+This version is based on the
+.I me
+distributed with 4.4BSD and can be used with the GNU
+.I troff
+formatter as well as those descended from AT&T
+.IR troff .
+.
+.
+.P
+Some formatter requests affect page layout unpredictably when used in
+conjunction with this package;
+however,
+the following may be used with impunity after the first call to a
+paragraphing macro like
+.B lp
+or
+.BR pp .
+.
+Some arguments are optional;
+see
+.MR groff @MAN7EXT@
+for details,
+particularly of requests whose argument list is designated with an
+ellipsis.
+.
+An asterisk
+.B *
+marks
+.I groff
+extensions.
+.
+.
+.P
+.TS
+Lb1 Li L.
+ad c set text adjustment mode to \fIc
+af r f assign format \fIf\fP to register \fIr
+am m e append to macro \fIm\fP until \fIe\fP called
+as s t append rest of line \fIt\fP to string \fIs
+bp n begin new page numbered \fIn
+br \& break output line
+ce n center next \fIn\fP output lines
+cp n en-/disable AT&T \fItroff\fP compatibility mode\fB*
+de m e define macro \fIm\fP until \fIe\fP called
+do t interpret input \fIt\fP with compatibility mode off\fB*
+ds s t define rest of line \fIt\fP as string \fIs
+el t interpret \fIt\fP if corresponding \fBie\fP false
+fc c d set field delimiter \fIc\fP and padding glyph \fId
+fi \& enable filling
+hc c set hyphenation character to \fIc
+hy m set automatic hyphenation mode to \fIm
+ie p t as \fBif\fP, but enable interpretation of later \fBel
+if p t if condition \fIp\/\fP, interpret rest of line \fIt
+in h set indentation to distance \fIh\fP
+lc c set leader repetition glyph to \fIc
+ls n set line spacing to \fIn
+mc c h set (right) margin glyph to \fIc\fP at distance \fIh
+mk r mark vertical position in register \fIr\fP
+na \& disable adjustment of text
+ne v need vertical space of distance \fIv
+nf \& disable filling
+nh \& disable automatic hyphenation
+nr r n i assign register \fIr\fP value \fIn\fP with \
+auto-increment \fIi
+ns \& begin no-space mode
+pl v set page length to \fIv
+pn n set next page number to \fIn
+po h set page offset to \fIh
+rj n right-align next \fIn\fP output lines\fB*
+rm m remove macro, string, or request \fIm
+rn m n rename macro, string, or request \fIm\fP to \fIn
+rr r remove register \fIr
+rs \& resume spacing (end no-space mode)
+rt v return to vertical position set by \fBmk\fP, or \fIv
+so f source (interpolate) input file \fIf
+sp n insert \fIn\fP lines of vertical space
+ta \fR.\|.\|. set tab stops
+tc c set tab repetition glyph to \fIc
+ti h set temporary indentation (next line only) to \fIh
+tl \fR.\|.\|. output three-part title
+tr \fR.\|.\|. translate characters
+ul n underline next \fIn\fP output lines
+.TE
+.
+.
+.P
+Except on title pages
+(produced by calling
+.BR tp ),
+.I me
+suppresses the output of vertical space at the tops of pages
+(after the output of any page header);
+the
+.B sp
+request will thus not work there.
+.
+You can instead call
+.B bl
+or enclose the desired spacing request in a diversion,
+for instance by calling
+.B (b
+and
+.BR )b .
+.
+.I me
+also intercepts the
+.B ll
+request;
+see the
+.RI \[lq] me
+Reference Manual\[rq]
+for details.
+.
+.
+.\" ====================================================================
+.SS "Name space"
+.\" ====================================================================
+.
+Objects in
+.I me
+follow a rigid naming convention.
+.
+To avoid conflict,
+any user-defined register,
+string,
+or macro
+names should be single numerals or uppercase letters,
+or any longer sequence of letters and numerals
+with at least one uppercase letter.
+.
+(For portability between BSD and
+.I groff
+.IR me ,
+limit names to
+two characters,
+and avoid the name
+.B [
+(left square bracket).)
+.
+The names employed
+by any preprocessors in use
+should also not be repurposed.
+.
+.
+.\" ====================================================================
+.SS Macros
+.\" ====================================================================
+.
+.ne 2v \" Keep at least the first entry together with the heading.
+.TS
+Lb L.
+$0 post-section heading hook
+$1 pre-section depth 1 hook
+$2 pre-section depth 2 hook
+$3 pre-section depth 3 hook
+$4 pre-section depth 4 hook
+$5 pre-section depth 5 hook
+$6 pre-section depth 6 hook
+$C post-chapter title hook
+$H page/column heading hook
+$c output chapter number and title
+$f output footer
+$h output header
+$p output section heading
+$s output footnote area separator
+(b begin block
+(c begin centered block
+(d begin delayed text
+(f begin footnote
+(l begin list
+(q begin long quotation
+(x begin index entry
+(z begin floating keep
+)b end block
+)c end centered block
+)d end delayed text
+)f end footnote
+)l end list
+)q end long quotation
+)x end index entry
+)z end floating keep
+++ set document segment type
++c begin chapter
+1c end multi-column layout
+2c begin multi-column layout
+EN end \fI@g@eqn\fP equation
+EQ begin \fI@g@eqn\fP equation
+GE end \fI@g@grn\fP picture with drawing position at bottom
+GF end \fI@g@grn\fP picture with drawing position at top
+GS start \fI@g@grn\fP picture
+IE end \fIideal\fP picture with drawing position at bottom
+IF end \fIideal\fP picture with drawing position at top
+IS start \fIideal\fP picture
+PE end \fI@g@pic\fP picture with drawing position at bottom
+PF end \fI@g@pic\fP picture with drawing position at top
+PS start \fI@g@pic\fP picture
+TE end \fI@g@tbl\fP table
+TH end heading for multi-page \fI@g@tbl\fP table
+TS start \fI@g@tbl\fP table
+b embolden argument
+ba set base indentation
+bc begin new column
+bi embolden and italicize argument
+bx box argument
+ef set even-numbered page footer
+eh set even-numbered page header
+ep end page
+fo set footer
+he set header
+hl draw horizontal line
+hx suppress next page's headers/footers
+i italicize argument
+ip begin indented paragraph
+ld reset localization and date registers and strings\fB*
+ll set line length
+lp begin fully left-aligned paragraph
+np begin numbered paragraph
+of set odd-numbered page footer
+oh set odd-numbered page header
+pd output delayed text
+pp begin first-line indented paragraph
+q quote argument
+r set argument in roman
+re reset tab stops
+sh begin numbered section
+sm set argument at smaller type size
+sx change section depth
+sz set type size and vertical spacing
+tp begin title page
+u underline argument
+uh begin unnumbered section
+xl set line length (local)
+xp output index
+.TE
+.
+.
+.P
+Some macros are provided for \(lqold\(rq
+.MR roff 1
+compatibility.
+.
+The
+.RI \(lq me
+Reference Manual\(rq
+describes alternatives for modern documents.
+.
+.
+.P
+.ne 2v \" Keep at least the first entry together with the heading.
+.TS
+Lb L.
+ar use Arabic numerals for page numbers
+bl insert space (even at page top; cf.\& \fBsp\fP)
+ix set indentation without break
+m1 set page top to header distance
+m2 set header to text distance
+m3 set text to footer distance
+m4 set footer to page bottom distance
+n1 begin output line numbering
+n2 end or alter output line numbering
+pa begin page
+ro use Roman numerals for page numbers
+sk skip next page
+.TE
+.
+.
+.\" ====================================================================
+.SS Registers
+.\" ====================================================================
+.
+.ne 2v \" Keep at least the first entry together with the heading.
+.TS
+Lb L.
+$0 section depth
+$1 first section number component
+$2 second section number component
+$3 third section number component
+$4 fourth section number component
+$5 fifth section number component
+$6 sixth section number component
+$c current column number
+$d delayed text number
+$f footnote number
+$i paragraph base indentation
+$l column width
+$m number of available columns
+$p numbered paragraph number
+$s column spacing (indentation)
+bi display (block) indentation
+bm distance from text area to page bottom
+bs display (block) pre/post space
+bt block threshold for keeps
+ch current chapter number
+df display font
+dv vertical spacing of displayed text (as percentage)\fB*
+es equation pre/post space
+ff footnote font
+fi footnote indentation (first line only)
+fm footer margin
+fp footnote type size in points
+fs footnote prespace
+fu footnote undent (right indentation)
+hm header margin
+ii indented paragraph indentation
+no line numbering offset\fB*
+pf paragraph font
+pi paragraph indentation
+po page offset
+pp paragraph type size in points
+ps paragraph prespace
+qi long quotation left/right indentation
+qp long quotation type size in points
+qs long quotation pre/post space
+sf section title font
+si section indentation per level of depth
+so additional section title offset
+sp section title type size in points
+ss section prespace
+sx super/subscript line height increase\fB*
+tf title font
+tm distance from page top to text area
+tp title type size in points
+tv vertical spacing of text (as percentage)\fB*
+xs index entry prespace
+xu index undent (right indentation)
+y2 year of the century\fB*
+y4 year\fB*
+yr year minus 1900
+zs floating keep pre/post space
+.TE
+.
+.
+.\" ====================================================================
+.SS Strings
+.\" ====================================================================
+.
+.ne 2v \" Keep at least the first entry together with the heading.
+.TS
+Lb L.
+# delayed text marker
+$n concatenated section number
+* footnote marker
+\- em dash
+< begin subscripting
+> end subscripting
+dw weekday name
+lq left double quotation mark
+mo month name
+rq right double quotation mark
+td date
+wa term for \(lqappendix\(rq used by \fB.$c*
+wc term for \(lqchapter\(rq used by \fB.$c*
+{ begin superscripting
+} end superscripting
+.TE
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @MACRODIR@/e.tmac
+implements the package.
+.
+.
+.TP
+.I @MACRODIR@/refer\-me.tmac
+implements
+.MR @g@refer @MAN1EXT@
+support for
+.IR me .
+.
+.
+.TP
+.I @MACRODIR@/me.tmac
+is a wrapper enabling the package to be loaded with
+.RB \[lq] "groff \-m me" \[rq].
+.
+.
+.\" ====================================================================
+.SH Notes
+.\" ====================================================================
+.
+Early
+.I roff
+macro packages often limited their names to a single letter,
+which followed the formatter's
+.B m
+flag letter,
+resulting in
+.IR mm ,
+.IR ms ,
+.IR mv ,
+.IR mn ,
+and so on.
+.
+.\" 'When I started writing the -me macros it began as something in my
+.\" private tree (I don't remember what I called it). Then some other
+.\" folks on the INGRES project wanted to use it, but our system admin
+.\" at the time didn't want to dicker with the system namespace at the
+.\" behest of a mere undergraduate, so he didn't like anything that was
+.\" actually descriptive lest people think it was "official". He
+.\" finally consented to "-meric" (which I always hated), since it was
+.\" obviously non-official. By the time my macros became popular around
+.\" Berkeley it got shortened to "-me", much to my relief.
+.\"
+.\" Of course, if AT&T had been willing to let Berkeley have -ms then
+.\" most likely -me would never have happened at all. Without a macro
+.\" package, nroff/troff is basically unusable; -me stepped into the
+.\" vacuum.' -- Eric Allman
+.\"
+.\" https://minnie.tuhs.org/pipermail/tuhs/2018-November/017033.html
+.
+The \(lqe\(rq in \(lqme\(rq stands for \(lqEric P.\& Allman\(rq,
+who wrote the macro package and the original technical papers
+documenting it while an undergraduate at the University of California.
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.
+Two manuals are available in source and rendered form.
+.
+On your system,
+they may be compressed and/or available in additional formats.
+.
+.
+.br
+.ne 3v
+.TP
+.I @DOCDIR@/meintro.me
+.TQ
+.I @DOCDIR@/meintro.ps
+is
+\[lq]Writing Papers with
+.I Groff
+Using
+.RI \- me \[rq],
+by Eric P.\& Allman,
+adapted for
+.I groff
+by James Clark.
+.
+.
+.br
+.ne 4v
+.TP
+.I @DOCDIR@/meref.me
+.TQ
+.I @DOCDIR@/meref.ps
+is the
+.RI \[lq] me
+Reference Manual\[rq],
+by Eric P.\& Allman,
+adapted for
+.I groff
+by James Clark and G.\& Branden Robinson.
+.
+.
+.P
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is the primary
+.I groff
+manual.
+.
+You can browse it interactively with \[lq]info groff\[rq].
+.
+.
+.P
+For preprocessors supported by
+.IR me ,
+see
+.MR @g@eqn @MAN1EXT@ ,
+.MR @g@grn @MAN1EXT@ ,
+.MR @g@pic @MAN1EXT@ ,
+.MR @g@refer @MAN1EXT@ ,
+and
+.MR @g@tbl @MAN1EXT@ .
+.
+.
+.P
+.MR groff @MAN1EXT@ ,
+.MR @g@troff @MAN1EXT@ ,
+.MR groff @MAN7EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_me_7_man_C]
+.do rr *groff_groff_me_7_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/groff_ms.7.man b/tmac/groff_ms.7.man
new file mode 100644
index 0000000..5d154f8
--- /dev/null
+++ b/tmac/groff_ms.7.man
@@ -0,0 +1,2906 @@
+'\" t
+.TH groff_ms @MAN7EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+groff_ms \- GNU
+.I roff
+manuscript macro package for formatting documents
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2023 Free Software Foundation, Inc.
+.\"
+.\" 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_ms_7_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY "groff \-m@TMAC_S_PREFIX@s"
+.RI [ option\~ .\|.\|.\&]
+.RI [ file\~ .\|.\|.]
+.
+.SY "groff \-m m@TMAC_S_PREFIX@s"
+.RI [ option\~ .\|.\|.\&]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The GNU implementation of the
+.I ms
+macro package is part of the
+.I groff
+document formatting system.
+.
+The
+.I ms
+package is suitable for the composition of
+letters,
+memoranda,
+reports,
+and books.
+.
+.
+.LP
+These
+.I groff
+macros support cover page and table of contents generation,
+automatically numbered headings,
+several paragraph styles,
+a variety of text styling options,
+footnotes,
+and multi-column page layouts.
+.
+.I ms
+supports the
+.MR @g@tbl @MAN1EXT@ ,
+.MR @g@eqn @MAN1EXT@ ,
+.MR @g@pic @MAN1EXT@ ,
+and
+.MR @g@refer @MAN1EXT@
+preprocessors for inclusion of tables,
+mathematical equations,
+diagrams,
+and standardized bibliographic citations.
+.
+.
+.LP
+This implementation is mostly compatible with the documented interface
+and behavior of AT&T Unix Version\~7
+.IR ms .
+.
+Many extensions from 4.2BSD (Berkeley)
+.\" Few changes were made in 4.3, Reno, Tahoe, or 4.4.
+and Tenth Edition Research Unix have been recreated.
+.
+.
+.\" ====================================================================
+.SH Usage
+.\" ====================================================================
+.
+The
+.I ms
+macro package expects a certain amount of structure:
+a well-formed document contains at least one paragraphing or heading
+macro call.
+.
+.\" This sentence is unique to the man page because we omit the "Basic
+.\" information" section from ms.ms.
+To compose a simple document from scratch,
+begin it by calling
+.B .LP
+or
+.BR .PP .
+.
+Longer documents have a structure as follows.
+.
+.
+.TP
+.B Document type
+Calling the
+.B RP
+macro at the beginning of your document puts the document description
+(see below)
+on a cover page.
+.
+Otherwise,
+.I ms
+places this information
+on the first page,
+followed immediately by the body text.
+.
+Some document types found in other
+.I ms
+implementations are specific to AT&T or Berkeley,
+and are not supported in
+.IR "groff ms" .
+.
+.
+.TP
+.B "Format and layout"
+By setting registers and strings,
+you can configure your document's typeface,
+margins,
+spacing,
+headers and footers,
+and footnote arrangement.
+.
+See subsection \[lq]Document control settings\[rq] below.
+.
+.
+.TP
+.B Document description
+A document description consists of any of:
+a title,
+one or more authors' names and affiliated institutions,
+an abstract,
+and a date or other identifier.
+.
+See subsection \[lq]Document description macros\[rq] below.
+.
+.
+.TP
+.B Body text
+The main matter of your document follows its description
+(if any).
+.
+.I ms
+supports highly structured text consisting of paragraphs interspersed
+with multi-level headings
+(chapters,
+sections,
+subsections,
+and so forth)
+and augmented by lists,
+footnotes,
+tables,
+diagrams,
+and similar material.
+.
+The preponderance of subsections below covers these matters.
+.
+.
+.TP
+.B "Table of contents"
+Macros enable the collection of entries for a table of contents
+(or index)
+as the material they discuss appears in the document.
+.
+You then call a macro to emit the table of contents at the end of
+your document.
+.
+The table of contents must necessarily follow the rest of the text since
+GNU
+.I troff \" GNU
+is a single-pass formatter;
+it thus cannot determine the page number of a division of the text until
+it has been set and output.
+.
+Since
+.I ms
+output was designed for the production of hard copy,
+the traditional procedure was to manually relocate the pages containing
+the table of contents between the cover page and the body text.
+.
+Today,
+page resequencing is more often done in the digital domain.
+.
+An index works similarly,
+but because it typically needs to be sorted after collection,
+its preparation requires separate processing.
+.
+.
+.\" ====================================================================
+.SS "Document control settings"
+.\" ====================================================================
+.
+The following tables list the document control registers,
+strings,
+and special characters.
+.
+For any parameter whose default is unsatisfactory,
+define it before calling any
+.I ms
+macro other than
+.BR RP .
+.
+.
+.LP
+.ne 7v
+.TS
+cb s s s
+cb cb cb cb
+lf(CR) lx l lf(CR).
+Margin settings
+Parameter Definition Effective Default
+_
+\[rs]n[PO] Page offset (left margin) next page 1i (0)
+\[rs]n[LL] Line length next paragraph 6.5i (65n)
+\[rs]n[LT] Title line length next paragraph 6.5i (65n)
+\[rs]n[HM] Top (header) margin next page 1i
+\[rs]n[FM] Bottom (footer) margin next page 1i
+_
+.TE
+.
+.
+.LP
+.ne 8v
+.TS
+cb s s s
+cb cb cb cb
+lf(CR) lx l lf(CR).
+Titles (headers, footers)
+Parameter Definition Effective Default
+_
+\[rs]*[LH] Left header text next header \f[I]empty
+\[rs]*[CH] Center header text next header \-\[rs]n[%]\-
+\[rs]*[RH] Right header text next header \f[I]empty
+\[rs]*[LF] Left footer text next footer \f[I]empty
+\[rs]*[CF] Center footer text next footer \f[I]empty
+\[rs]*[RF] Right footer text next footer \f[I]empty
+_
+.TE
+.
+.
+.LP
+.ne 6v
+.TS
+cb s s s
+cb cb cb cb
+lf(CR) lx l lf(CR).
+Text settings
+Parameter Definition Effective Default
+_
+\[rs]n[PS] Point size next paragraph 10p
+\[rs]n[VS] Vertical spacing (leading) next paragraph 12p
+\[rs]n[HY] Hyphenation mode next paragraph 6
+\[rs]*[FAM] Font family next paragraph T
+_
+.TE
+.
+.
+.LP
+.ne 6v
+.TS
+cb s s s
+cb cb cb cb
+lf(CR)2 lx l lf(CR).
+Paragraph settings
+Parameter Definition Effective Default
+_
+\[rs]n[PI] Indentation next paragraph 5n
+\[rs]n[PD] Paragraph distance (spacing) next paragraph 0.3v\
+ \f[R](\f[]1v\f[R])
+\[rs]n[QI] Quotation indentation next paragraph 5n
+\[rs]n[PORPHANS] # of initial lines kept next paragraph 1
+_
+.TE
+.
+.
+.ne 10v \" Keep table and subsequent paragraph together.
+.LP
+.TS
+cb s s s
+cb cb cb cb
+lf(CR) lx l lf(CR).
+Heading settings
+Parameter Definition Effective Default
+_
+\[rs]n[PSINCR] Point size increment next heading 1p
+\[rs]n[GROWPS] Size increase depth limit next heading 0
+\[rs]n[HORPHANS] # of following lines kept next heading 1
+\[rs]*[SN\-STYLE] Numbering style (alias) next heading \[rs]*[SN\-DOT]
+_
+.TE
+.
+.
+.LP
+.B \[rs]*[SN\-STYLE]
+can alternatively be made an alias of
+.B \[rs]*[SN\-NO\-DOT]
+with the
+.B als
+request.
+.
+.
+.LP
+.ne 8v
+.TS
+cb s s s
+cb cb cb cb
+lf(CR) lx l lf(CR).
+Footnote settings
+Parameter Definition Effective Default
+_
+\[rs]n[FI] Indentation next footnote 2n
+\[rs]n[FF] Format next footnote 0
+\[rs]n[FPS] Point size next footnote \[rs]n[PS]\-2p
+\[rs]n[FVS] Vertical spacing (leading) next footnote \[rs]n[FPS]+2p
+\[rs]n[FPD] Paragraph distance (spacing) next footnote \[rs]n[PD]/2
+\[rs]*[FR] Line length ratio \f[I]special 11/12
+_
+.TE
+.
+.
+.LP
+.ne 4v
+.TS
+cb s s s
+cb cb cb cb
+lf(CR) lx l lf(CR).
+Display settings
+Parameter Definition Effective Default
+_
+\[rs]n[DD] Display distance (spacing) \f[I]special 0.5v\
+ \f[R](\f[]1v\f[R])
+\[rs]n[DI] Display indentation \f[I]special 0.5i
+_
+.TE
+.
+.
+.LP
+.ne 3v
+.TS
+cb s s s
+cb cb cb cb
+lf(CR) lx l lf(CR).
+Other settings
+Parameter Definition Effective Default
+_
+\[rs]n[MINGW] Minimum gutter width next page 2n
+\[rs]n[TC\-MARGIN] TOC page number margin width \
+next \f[B]PX\f[] call \[rs]w\[aq]000\[aq]
+\[rs][TC\-LEADER] TOC leader character next \f[B]PX\f[] call\
+ .\[rs]h\[aq]1m\[aq]
+_
+.TE
+.
+.
+.LP
+For entries marked
+.RI \[lq] special \[rq]
+in the \[lq]Effective\[rq] column,
+see the discussion in the applicable section below.
+.
+The
+.BR PO ,
+.BR LL ,
+and
+.B LT
+register defaults vary by output device and paper format;
+the values shown are for typesetters using U.S.\& letter paper,
+and then terminals.
+.
+See section \[lq]Paper format\[rq] of
+.MR groff @MAN1EXT@ .
+.
+The
+.B PD
+and
+.B DD
+registers use the larger value if the vertical motion quantum of the
+output device is too coarse for the smaller one;
+usually,
+this is the case only for output to terminals and emulators thereof.
+.
+The \[lq]gutter\[rq] affected by
+.B \[rs]n[MINGW]
+is the gap between columns in multiple-column page arrangements.
+.
+The
+.B TC\-MARGIN
+register and
+.B TC\-LEADER
+special character affect the formatting of tables of contents assembled
+by the
+.BR XS ,
+.BR XA ,
+and
+.B XE
+macros.
+.
+.
+.\" ====================================================================
+.SS "Document description macros"
+.\" ====================================================================
+.
+Define information describing the document by calling the macros below
+in the order shown;
+.B .DA
+or
+.B .ND
+can be called to set the document date
+(or other identifier)
+at any time before (a) the abstract,
+if present,
+or (b) its information is required in a header or footer.
+.
+Use of these macros is optional,
+except that
+.B .TL
+is mandatory if any of
+.BR .RP ,
+.BR .AU ,
+.BR .AI ,
+or
+.B .AB
+is called,
+and
+.B .AE
+is mandatory if
+.B .AB
+is called.
+.
+.
+.TP
+.BR .RP\~ [ no\-repeat\-info ]\~[ no\-renumber ]
+Use the \[lq]report\[rq]
+(AT&T: \[lq]released paper\[rq])
+format for your document,
+creating a separate cover page.
+.
+The default arrangement is to place most of the document description
+(title,
+author names and institutions,
+and abstract,
+but not the date)
+at the top of the first page.
+.
+If the optional
+.B no\-\:\%repeat\-\:\%info
+argument is given,
+.I ms
+produces a cover page but does not repeat any of its information on
+subsequently
+(but see the
+.B DA
+macro below regarding the date).
+.
+Normally,
+.B .RP
+sets the page number following the cover page to\~1.
+.
+Specifying the optional
+.B no\-\:\%renumber
+argument suppresses this alteration.
+.
+Optional arguments can occur in any order.
+.
+.RB \[lq] no \[rq]
+is recognized as a synonym of
+.B no\-\:\%repeat\-\:\%info
+for AT&T compatibility.
+.
+.
+.TP
+.B .TL
+Specify the document title.
+.
+.I ms
+collects text on input lines following this call into the title until
+reaching
+.BR .AU ,
+.BR .AB ,
+or a heading or paragraphing macro call.
+.
+.
+.TP
+.B .AU
+Specify an author's name.
+.
+.I ms
+collects text on input lines following this call into the author's name
+until reaching
+.BR .AI ,
+.BR .AB ,
+another
+.BR .AU ,
+or a heading or paragraphing macro call.
+.
+Call it repeatedly to specify multiple authors.
+.
+.
+.TP
+.B .AI
+Specify the preceding author's institution.
+.
+An
+.B .AU
+call is usefully followed by at most one
+.B .AI
+call;
+if there are more,
+the last
+.B .AI
+call controls.
+.
+.I ms
+collects text on input lines following this call into the author's
+institution until reaching
+.BR .AU ,
+.BR .AB ,
+or a heading or paragraphing macro call.
+.
+.
+.TP
+.BR .DA \~[\c
+.IR x \~.\|.\|.]
+Typeset the current date,
+or any
+.RI arguments\~ x ,
+in the center footer,
+and,
+if
+.B .RP
+is also called,
+left-aligned at the end of the document description on the cover page.
+.
+.
+.TP
+.BR .ND \~[\c
+.IR x \~.\|.\|.]
+Typeset the current date,
+or any
+.RI arguments\~ x ,
+if
+.B .RP
+is also called,
+left-aligned at the end of the document description on the cover page.
+.
+This is
+.IR "groff ms" 's
+default.
+.
+.
+.TP
+.BR ".AB " [ no ]
+Begin the abstract.
+.
+.I ms
+collects text on input lines following this call into the abstract until
+reaching an
+.B .AE
+call.
+.
+By default,
+.I ms
+places the word \[lq]ABSTRACT\[rq] centered and in italics above the
+text of the abstract.
+.
+The optional argument
+.RB \[lq] no \[rq]
+suppresses this heading.
+.
+.
+.TP
+.B .AE
+End the abstract.
+.
+.
+.\" ====================================================================
+.SS "Text settings"
+.\" ====================================================================
+.
+The
+.B FAM
+string,
+a GNU extension,
+sets the font family for body text;
+the default is
+.RB \[lq] T \[rq].
+.
+The
+.B PS
+and
+.B VS
+registers set the type size and vertical spacing
+(distance between text baselines),
+respectively.
+.
+The font family and type size are ignored on terminal devices.
+.
+Setting these parameters before the first call of a heading,
+paragraphing,
+or (non-date) document description macro also applies them to headers,
+footers,
+and
+(for
+.BR FAM )
+footnotes.
+.
+.
+.br
+.ne 2v
+.P
+The
+.B HY
+register defines the automatic hyphenation mode used with the
+.B hy
+request.
+.
+Setting
+.B \[rs]n[HY]
+.RB to\~ 0
+is equivalent to using the
+.B nh
+request.
+.
+This is a Tenth Edition Research Unix extension.
+.
+.
+.\" ====================================================================
+.SS "Typographical symbols"
+.\" ====================================================================
+.
+.I ms
+provides a few strings to obtain typographical symbols not easily
+entered with the keyboard.
+.
+These and many others are available as special character escape
+sequences\[em]see
+.MR groff_char @MAN7EXT@ .
+.
+.
+.TP
+.B \[rs]*[\-]
+Interpolate an em dash.
+.
+.
+.TP
+.B \[rs]*[Q]
+.TQ
+.B \[rs]*[U]
+Interpolate typographer's quotation marks where available,
+and neutral double quotes otherwise.
+.
+.B \[rs]*[Q]
+is the left quote and
+.B \[rs]*[U]
+the right.
+.
+.
+.\" ====================================================================
+.SS Paragraphs
+.\" ====================================================================
+.
+Paragraphing macros
+.IR break ,
+or terminate,
+any pending output line so that a new paragraph can begin.
+.
+Several paragraph types are available,
+differing in how indentation
+applies to them:
+to left,
+right,
+or both margins;
+to the first output line of the paragraph,
+all output lines,
+or all but the first.
+.
+All paragraphing macro calls cause the insertion of vertical space in
+the amount stored in the
+.B PD
+register,
+except at page or column breaks,
+or adjacent to displays.
+.
+.
+.PP
+The
+.B PORPHANS
+register defines the minimum number of initial lines of any paragraph
+that must be kept together to avoid isolated lines at the bottom of a
+page.
+.
+If a new paragraph is started close to the bottom of a page,
+and there is insufficient space to accommodate
+.B \[rs]n[PORPHANS]
+lines before an automatic page break,
+then a page break is forced before the start of the paragraph.
+.
+This is a GNU extension.
+.
+.
+.TP
+.B .LP
+Set a paragraph without any (additional) indentation.
+.
+.
+.TP
+.B .PP
+Set a paragraph with a first-line left indentation in the amount stored
+in the
+.B PI
+register.
+.
+.
+.TP
+.BR .IP \~[\c
+.IR marker \~[ width ]]
+Set a paragraph with a left indentation.
+.
+The optional
+.I marker
+is not indented and is empty by default.
+.
+.I width
+overrides the indentation amount in
+.BR \[rs]n[PI] ;
+its default unit is
+.RB \[lq] n \[rq].
+.
+Once specified,
+.I width
+applies to further
+.B .IP
+calls until specified again or a heading or different paragraphing macro
+is called.
+.
+.
+.TP
+.B .QP
+Set a paragraph indented from both left and right margins by
+.BR \[rs]n[QI] .
+.
+.
+.TP
+.B .QS
+.TQ
+.B .QE
+Begin
+.RB ( QS )
+and end
+.RB ( QE )
+a region where each paragraph is indented from both margins by
+.BR \[rs]n[QI] .
+.
+The text between
+.B .QS
+and
+.B .QE
+can be structured further by use of other paragraphing macros.
+.
+.
+.TP
+.B .XP
+Set an \[lq]exdented\[rq] paragraph\[em]one with a left indentation of
+.B \[rs]n[PI]
+on every line
+.I except
+the first
+(also known as a hanging indent).
+.
+This is a Berkeley extension.
+.
+.
+.\" ====================================================================
+.SS Headings
+.\" ====================================================================
+.
+Use headings to create a hierarchical structure for your document.
+.
+The
+.I ms
+macros print headings in
+.B bold
+using the same font family and,
+by default,
+type size as the body text.
+.
+Headings are available with and without automatic numbering.
+.
+Text on input lines following the macro call becomes the heading's
+title.
+.
+Call a paragraphing macro to end the heading text and start the
+section's content.
+.
+.
+.TP
+.BR .NH \~[\c
+.IR depth ]
+Set an automatically numbered heading.
+.
+.I ms
+produces a numbered heading in the form
+.IR a . b . c .\|.\|.,
+to any level desired,
+with the numbering of each depth increasing automatically and being
+reset to zero when a more significant depth is increased.
+.
+.RB \[lq] 1 \[rq]\~is
+the most significant or coarsest division of the document.
+.
+Only non-zero values are output.
+.
+If
+.I depth
+is omitted,
+it is taken to be
+.BR 1 .
+.
+If you specify
+.I depth
+such that an ascending gap occurs relative to the previous
+.B NH
+call\[em]that is,
+you \[lq]skip a depth\[rq],
+as by
+.RB \[lq] ".NH\~1" \[rq]
+and then
+.RB \[lq] ".NH\~3" \[rq],
+.I groff ms
+emits a warning on the standard error stream.
+.
+.
+.TP
+.BI ".NH S\~" heading-depth-index\~\c
+\&.\|.\|.
+Alternatively,
+you can give
+.B NH
+a first argument
+.RB of\~\[lq] S \[rq],
+followed by integers to number the heading depths explicitly.
+.
+Further automatic numbering,
+if used,
+resumes using the specified indices as their predecessors.
+.
+.\" Although undocumented in Tuthill's 4.2BSD ms.diffs paper...
+This feature is a Berkeley extension.
+.
+.
+.P
+After
+.B .NH
+is called,
+the assigned number is made available in the strings
+.B SN\-DOT
+(as it appears in a printed heading with default formatting,
+followed by a terminating period)
+and
+.B SN\-NO\-DOT
+(with the terminating period omitted).
+.
+These are GNU extensions.
+.
+.
+.P
+You can control the style used to print numbered headings by defining an
+appropriate alias for the string
+.BR SN\-STYLE .
+.
+By default,
+.B \[rs]*[SN\-STYLE]
+is aliased to
+.BR \[rs]*[SN\-DOT] .
+.
+If you prefer to omit the terminating period from numbers appearing in
+numbered headings,
+you may alias it to
+.BR \[rs]*[SN\-NO\-DOT] .
+.
+Any such change in numbering style becomes effective from the next use
+of
+.B .NH
+following redefinition of the alias for
+.BR \[rs]*[SN\-STYLE] .
+.
+The formatted number of the current heading is available in
+.B \[rs]*[SN]
+(a feature first documented by Berkeley);
+this string facilitates its inclusion in,
+for example,
+table captions,
+equation labels,
+and
+.BR .XS / .XA / .XE
+table of contents entries.
+.
+.
+.TP
+.BR .SH \~[\c
+.IR depth ]
+Set an unnumbered heading.
+.
+The optional
+.I depth
+argument is a GNU extension indicating the heading depth corresponding
+to the
+.I depth
+argument of
+.BR .NH .
+.
+It matches the type size at which the heading is set to that of a
+numbered heading at the same depth when the
+.B \[rs]n[GROWPS]
+and
+.B \[rs]n[PSINCR]
+heading size adjustment mechanism is in effect.
+.
+.
+.P
+The
+.B PSINCR
+register defines an increment in type size to be applied to a heading at
+a lesser depth than that specified in
+.BR \[rs]n[GROWPS] .
+.
+The value of
+.B \[rs]n[PSINCR]
+should be specified in points with the
+.RB \[lq] p \[rq]
+scaling unit and may include a fractional component.
+.
+.
+.P
+The
+.B GROWPS
+register defines the heading depth above which the type size increment
+set by
+.B \[rs]n[PSINCR]
+becomes effective.
+.
+For each heading depth less than the value of
+.BR \[rs]n[GROWPS] ,
+the type size is increased by
+.BR \[rs]n[PSINCR] .
+.
+Setting
+.B \[rs]n[GROWPS]
+to a value less than\~2 disables the incremental heading size feature.
+.
+.
+.P
+In other words,
+if the value of
+.B GROWPS
+register is greater than the
+.I depth
+argument to a
+.B .NH
+or
+.B .SH
+call,
+the type size of a heading produced by these macros increases by
+.B \[rs]n[PSINCR]
+units over
+.B \[rs]n[PS]
+multiplied by the difference of
+.B \[rs]n[GROWPS]
+and
+.IR depth .
+.
+.
+.P
+The
+.B \[rs]n[HORPHANS]
+register operates in conjunction with the
+.B NH
+and
+.B SH
+macros to inhibit the printing of isolated headings at the bottom of a
+page;
+it specifies the minimum number of lines of the subsequent paragraph
+that must be kept on the same page as the heading.
+.
+If insufficient space remains on the current page to accommodate the
+heading and this number of lines of paragraph text,
+a page break is forced before the heading is printed.
+.
+Any display macro call or
+.IR tbl ,
+.IR pic ,
+or
+.I eqn
+region between the heading and the subsequent paragraph suppresses this
+grouping.
+.
+.
+.\" ====================================================================
+.SS "Typeface and decoration"
+.\" ====================================================================
+.
+.
+.P
+The
+.I ms
+macros provide a variety of ways to style text.
+.
+Attend closely to the ordering of arguments labeled
+.I pre
+and
+.I post,
+which is not intuitive.
+.
+Support for
+.I pre
+arguments is a GNU extension.
+.
+.
+.TP
+.BR .B \~[\c
+.IR text \~[ post \~[ pre ]]]
+Style
+.I text
+in bold,
+followed by
+.I post
+in the previous font style without intervening space,
+and preceded by
+.I pre
+similarly.
+.
+Without arguments,
+.I ms
+styles subsequent text in bold
+until the next
+paragraphing,
+heading,
+or no-argument typeface macro call.
+.
+.
+.TP
+.BR .R \~[\c
+.IR text \~[ post \~[ pre ]]]
+As
+.BR .B ,
+but use the roman style
+(upright text of normal weight)
+instead of bold.
+.
+Argument recognition is a GNU extension.
+.
+.
+.TP
+.BR .I \~[\c
+.IR text \~[ post \~[ pre ]]]
+As
+.BR .B ,
+but use an italic or oblique style instead of bold.
+.
+.
+.TP
+.BR .BI \~[\c
+.IR text \~[ post \~[ pre ]]]
+As
+.BR .B ,
+but use a bold italic or bold oblique style instead of upright bold.
+.
+This is a Tenth Edition Research Unix extension.
+.\" possibly 9th, but definitely not Berkeley
+.
+.
+.TP
+.BR .CW \~[\c
+.IR text \~[ post \~[ pre ]]]
+As
+.BR .B ,
+but use a constant-width (monospaced) roman typeface instead of bold.
+.
+This is a Tenth Edition Research Unix extension.
+.\" possibly 9th, but definitely not Berkeley
+.
+.
+.TP
+.BR .BX \~[\c
+.IR text ]
+Typeset
+.I text
+and draw a box around it.
+.
+On terminal devices,
+reverse video is used instead.
+.
+If you want
+.I text
+to contain space,
+use unbreakable space or horizontal motion escape sequences
+.RB ( \[rs]\[ti] ,
+.BI \[rs] space\c
+,
+.BR \[rs]\[ha] ,
+.BR \[rs]| ,
+.BR \[rs]0 ,
+or
+.BR \[rs]h ).
+.
+.
+.TP
+.BR .UL \~[\c
+.IR text \~[ post ]]
+Typeset
+.I text
+with an underline.
+.
+.I post,
+if present,
+is set after
+.I text
+with no intervening space.
+.
+.
+.TP
+.B .LG
+Set subsequent text in larger type
+(2\~points larger than the current size)
+until the next
+type size,
+paragraphing,
+or heading macro call.
+.
+You can specify this macro multiple times to enlarge the type size as
+needed.
+.
+.
+.TP
+.B .SM
+Set subsequent text in smaller type
+(2\~points smaller than the current size)
+until the next
+type size,
+paragraphing,
+or heading macro call.
+.
+You can specify this macro multiple times to reduce the type size as
+needed.
+.
+.
+.TP
+.B .NL
+Set subsequent text at the normal type size
+.RB ( \[rs]n[PS] ).
+.
+.
+.P
+When
+.I pre
+is used,
+a hyphenation control escape sequence
+.B \[rs]%
+that would ordinarily start
+.I text
+must start
+.I pre
+instead.
+.
+.
+.P
+.I groff ms
+also offers strings to begin and end super- and subscripting.
+.
+These are GNU extensions.
+.
+.
+.TP
+.B \[rs]*{
+.TQ
+.B \[rs]*}
+Begin and end superscripting,
+respectively.
+.
+.
+.TP
+.B \[rs]*<
+.TQ
+.B \[rs]*>
+Begin and end subscripting,
+respectively.
+.
+.
+.\" ====================================================================
+.SS "Indented regions"
+.\" ====================================================================
+.
+You may need to indent a region of text while otherwise formatting it
+normally.
+.
+Indented regions can be nested.
+.
+.
+.TP
+.B .RS
+Begin a region where headings,
+paragraphs,
+and displays are indented (further) by
+.BR \[rs]n[PI] .
+.
+.
+.TP
+.B .RE
+End the (next) most recent indented region.
+.
+.
+.\" ====================================================================
+.SS "Keeps, boxed keeps, and displays"
+.\" ====================================================================
+.
+On occasion,
+you may want to
+.I keep
+several lines of text,
+or a region of a document,
+together on a single page,
+preventing an automatic page break within certain boundaries.
+.
+This can cause a page break to occur earlier than it normally would.
+.
+.
+.P
+You can alternatively specify a
+.I floating keep:
+if a keep cannot fit on the current page,
+.I ms
+holds its contents and allows text following the keep
+(in the source document)
+to fill in the remainder of the current page.
+.
+When the page breaks,
+whether by reaching the end or
+.B bp
+request,
+.I ms
+puts the floating keep at the beginning of the next page.
+.
+.
+.TP
+.B .KS
+Begin a keep.
+.
+.
+.TP
+.B .KF
+Begin a floating keep.
+.
+.
+.TP
+.B .KE
+End (floating) keep.
+.
+.
+.P
+As an alternative to the keep mechanism,
+the
+.B ne
+request forces a page break if there is not at least the amount of
+vertical space specified in its argument remaining on the page.
+.
+.
+.PP
+A
+.I boxed keep
+has a frame drawn around it.
+.
+.
+.TP
+.B .B1
+Begin a keep with a box drawn around it.
+.
+.
+.TP
+.B .B2
+End boxed keep.
+.
+.
+.P
+Boxed keep macros cause breaks;
+if you need to box a word or phrase within a line,
+see the
+.B BX
+macro in section \[lq]Highlighting\[rq] above.
+.
+Box lines are drawn as close as possible to the text they enclose so
+that they are usable within paragraphs.
+.
+If you wish to place one or more paragraphs in a boxed keep,
+you may improve their appearance by calling
+.B .B1
+after the first paragraphing macro,
+and by adding a small amount of vertical space before calling
+.BR .B2 .
+.
+.
+.br
+.ne 2v
+.P
+If you want a boxed keep to float,
+you will need to enclose the
+.B .B1
+and
+.B .B2
+calls within a pair of
+.B .KF
+and
+.B .KE
+calls.
+.
+.
+.P
+.I Displays
+turn off filling;
+lines of verse or program code are shown with their lines broken as in
+the source document without requiring
+.B br
+requests between lines.
+.
+Displays can be kept on a single page or allowed to break across pages.
+.
+The
+.B DS
+macro begins a kept display of the layout specified in its first
+argument;
+non-kept displays are begun with dedicated macros corresponding to their
+layout.
+.
+.
+.TP
+.B .DS L
+.TQ
+.B .LD
+Begin
+.RB ( DS ": kept)"
+left-aligned display.
+.
+.
+.TP
+.BR .DS \~\c
+.RB [ I \~\c
+.RI [ indent ]]
+.TQ
+.BR .ID \~\c
+.RI [ indent ]
+Begin
+.RB ( DS ": kept)"
+display indented by
+.I indent
+if specified,
+.B \[rs]n[DI]
+otherwise.
+.
+.
+.TP
+.B .DS B
+.TQ
+.B .BD
+Begin
+.RB ( DS ": kept)"
+block display:
+the entire display is left-aligned,
+but indented such that the longest line in the display is centered on
+the page.
+.
+.
+.TP
+.B .DS C
+.TQ
+.B .CD
+Begin
+.RB ( DS ": kept)"
+centered display:
+each line in the display is centered.
+.
+.
+.TP
+.B .DS R
+.TQ
+.B .RD
+Begin
+.RB ( DS ": kept)"
+right-aligned display.
+.
+This is a GNU extension.
+.
+.
+.TP
+.B .DE
+End any display.
+.
+.
+.P
+The distance stored in
+.B \[rs]n[DD]
+is inserted before and after each pair of display macros;
+this is a Berkeley extension.
+.
+In
+.IR "groff ms" ,
+this distance replaces any adjacent inter-paragraph distance
+or subsequent spacing prior to a section heading.
+.
+The
+.B DI
+register is a GNU extension;
+its value is an indentation applied to displays created with
+.B .DS
+and
+.B .ID
+without arguments,
+to
+.RB \[lq] .DS\~I \[rq]
+without an indentation argument,
+and to equations set with
+.RB \[lq] .EQ\~I \[rq].
+.
+Changes to either register take effect at the next display boundary.
+.
+.
+.\" ====================================================================
+.SS "Tables, figures, equations, and references"
+.\" ====================================================================
+.
+The
+.I ms
+package is often used with the
+.IR @g@tbl ,
+.IR @g@pic ,
+.IR @g@eqn ,
+and
+.I @g@refer
+preprocessors.
+.
+The
+.B \[rs]n[DD]
+distance is also applied to regions of the document preprocessed with
+.IR @g@eqn ,
+.IR @g@pic ,
+and
+.IR @g@tbl .
+.
+Mark text meant for preprocessors by enclosing it in pairs of tokens as
+follows,
+with nothing between the dot and the macro name.
+.
+The preprocessors match these tokens only at the start of an input line.
+.
+.
+.TP
+.BR .TS " [" H "]
+.TQ
+.B .TE
+Demarcate a table to be processed by the
+.I tbl
+preprocessor.
+.
+The optional
+.BR H "\~argument"
+instructs
+.I ms
+to repeat table rows
+(often column headings)
+at the top of each new page the table spans,
+if applicable;
+calling the
+.B TH
+macro marks the end of such rows.
+.
+.MR @g@tbl @MAN1EXT@
+provides a comprehensive reference to the preprocessor and offers
+examples of its use.
+.
+.
+.TP
+.B .PS
+.TQ
+.B .PE
+.TQ
+.B .PF
+.B .PS
+begins a picture to be processed by the
+.I pic
+preprocessor;
+either of
+.B .PE
+or
+.B .PF
+ends it,
+the latter with \[lq]flyback\[rq] to the vertical position at its top.
+.
+.
+.TP
+.BR .EQ \~[\c
+.IR align \~[\c]
+.IR label ]]
+.TQ
+.B .EN
+Demarcate an equation to be processed by the
+.I eqn
+preprocessor.
+.
+The equation is centered by default;
+.I align
+can be
+.BR C ,
+.BR L ,
+.RB or\~ I
+to (explicitly) center,
+left-align,
+or indent it by
+.BR \[rs]n[DI] ,
+respectively.
+.
+If specified,
+.I label
+is set right-aligned.
+.
+.
+.TP
+.B .[
+.TQ
+.B .]
+Demarcate a bibliographic citation to be processed by the
+.I refer
+preprocessor.
+.
+.MR @g@refer @MAN1EXT@
+provides a comprehensive reference to the preprocessor and the format of
+its bibliographic database.
+.
+.
+.P
+When
+.I @g@refer
+emits collected references
+(as might be done on a \[lq]Works Cited\[rq] page),
+it interpolates the string
+.B \[rs]*[REFERENCES]
+as an unnumbered heading
+.RB ( .SH ).
+.
+.
+.br
+.ne 2v
+.P
+Attempting to place a multi-page table inside a keep can lead to
+unpleasant results,
+particularly if the
+.I tbl \" generic
+.RB \[lq] allbox \[rq]
+option is used.
+.
+.
+.\" ====================================================================
+.SS Footnotes
+.\" ====================================================================
+.
+A footnote is typically anchored to a place in the text with a
+.I marker,
+which is a small integer,
+a symbol,
+or arbitrary user-specified text.
+.
+.
+.TP
+.B \[rs]**
+Place an
+.I automatic number,
+an automatically generated numeric footnote marker,
+in the text.
+.
+Each time this string is interpolated,
+the number it produces increments by one.
+.
+Automatic numbers start at 1.
+.
+This is a Berkeley extension.
+.
+.
+.P
+Enclose the footnote text in
+.B FS
+and
+.B FE
+macro calls to set it at the nearest available \[lq]foot\[rq],
+or bottom,
+of a text column or page.
+.
+.
+.TP
+.BR .FS \~[\c
+.IR marker ]
+Begin a footnote.
+.
+The
+.B .FS\-MARK
+hook
+(see below)
+is called with any supplied
+.I marker
+argument,
+which is then also placed at the beginning of the footnote text.
+.
+If
+.I marker
+is omitted,
+the next pending automatic number enqueued by interpolation of the
+.B *
+string is used,
+and if none exists,
+nothing is prefixed.
+.
+.
+.TP
+.B .FE
+End footnote text.
+.
+.
+.P
+.I groff ms
+provides a hook macro,
+.BR FS\-MARK ,
+for user-determined operations to be performed when the
+.B FS
+macro is called.
+.
+It is passed the same arguments as
+.B .FS
+itself.
+.
+By default,
+this macro has an empty definition.
+.
+.B .FS\-MARK
+is a GNU extension.
+.
+.
+.P
+Footnote text is formatted as paragraphs are,
+using analogous parameters.
+.
+The registers
+.BR FI ,
+.BR FPD ,
+.BR FPS ,
+and
+.B FVS
+correspond to
+.BR PI ,
+.BR PD ,
+.BR PS ,
+and
+.BR VS ,
+respectively;
+.BR FPD ,
+.BR FPS ,
+and
+.B FVS
+are GNU extensions.
+.
+.
+.P
+The
+.B FF
+register controls the formatting of automatically numbered footnote
+paragraphs,
+and those for which
+.B .FS
+is given a
+.I marker
+argument,
+at the bottom of a column or page as follows.
+.
+.
+.RS
+.TP
+0
+Set an automatic number,
+or a specified
+.B FS
+.I marker
+argument,
+as a superscript
+(on typesetter devices)
+or surrounded by square brackets
+(on terminals).
+.
+The footnote paragraph is indented as with
+.B .PP
+if there is an
+.B .FS
+argument or an automatic number,
+and as with
+.B .LP
+otherwise.
+.
+This is the default.
+.
+.
+.TP
+1
+As
+.BR 0 ,
+but set the marker as regular text,
+and follow an automatic number with a period.
+.
+.
+.TP
+2
+As
+.BR 1 ,
+but without indentation
+(like
+.BR .LP ).
+.
+.
+.TP
+3
+As
+.BR 1 ,
+but set the footnote paragraph with the marker hanging
+(like
+.BR .IP ).
+.RE
+.
+.
+.\" ====================================================================
+.SS "Language and localization"
+.\" ====================================================================
+.
+.I groff ms
+provides several strings that you can customize for your own purposes,
+or redefine to adapt the macro package to languages other than English.
+.
+It is already localized for
+.\" cs, de, fr, it, sv
+Czech,
+German,
+French,
+Italian,
+and
+Swedish.
+.
+Load the desired localization macro package after
+.IR ms ;
+see
+.MR groff_tmac @MAN5EXT@ .
+.
+.
+.P
+.RS
+.TS
+cb cb
+lf(CR) lf(CR).
+String Default
+_
+\[rs]*[REFERENCES] References
+\[rs]*[ABSTRACT] \[rs]f[I]ABSTRACT\[rs]f[]
+\[rs]*[TOC] Table of Contents
+\[rs]*[MONTH1] January
+\[rs]*[MONTH2] February
+\[rs]*[MONTH3] March
+\[rs]*[MONTH4] April
+\[rs]*[MONTH5] May
+\[rs]*[MONTH6] June
+\[rs]*[MONTH7] July
+\[rs]*[MONTH8] August
+\[rs]*[MONTH9] September
+\[rs]*[MONTH10] October
+\[rs]*[MONTH11] November
+\[rs]*[MONTH12] December
+_
+.TE
+.RE
+.
+The default for
+.B ABSTRACT
+includes font selection escape sequences to set the word in italics.
+.
+.
+.\" ====================================================================
+.SS "Headers and footers"
+.\" ====================================================================
+.
+There are multiple ways to produce headers and footers.
+.
+One is to define the strings
+.BR LH ,
+.BR CH ,
+and
+.B RH
+to set the left,
+center,
+and right headers,
+respectively;
+and
+.BR LF ,
+.BR CF ,
+and
+.B RF
+to set the left,
+center,
+and right footers.
+.
+This approach suffices for documents that do not distinguish odd- and
+even-numbered pages.
+.
+.
+.P
+Another method is to call macros that set headers or footers for odd- or
+even-numbered pages.
+.
+Each such macro takes a delimited argument separating the left,
+center,
+and right header or footer texts from each other.
+.
+You can replace the neutral apostrophes (\[aq]) shown below with any
+character not appearing in the header or footer text.
+.
+These macros are Berkeley extensions.
+.
+.
+.br
+.ne 5v
+.TP
+.BR .OH \~\[aq]\c
+.IR left \[aq] center \[aq] right \[aq]
+.TQ
+.BR .OF \~\[aq]\c
+.IR left \[aq] center \[aq] right \[aq]
+.TQ
+.BR .EH \~\[aq]\c
+.IR left \[aq] center \[aq] right \[aq]
+.TQ
+.BR .EF \~\[aq]\c
+.IR left \[aq] center \[aq] right \[aq]
+The
+.B OH
+and
+.B EH
+macros define headers for odd- (recto) and even-numbered (verso) pages,
+respectively;
+the
+.B OF
+and
+.B EF
+macros define footers for them.
+.
+.
+.P
+With either method,
+a percent sign
+.B %
+in header or footer text is replaced by the current page number.
+.
+By default,
+.I ms
+places no header on a page numbered \[lq]1\[rq]
+(regardless of its number format).
+.
+.
+.TP
+.B .P1
+Typeset the header even on page\~1.
+.
+To be effective,
+this macro must be called before the header trap is sprung on any page
+numbered \[lq]1\[rq].
+.
+This is a Berkeley extension.
+.
+.
+.P
+For even greater flexibility,
+.I ms
+permits redefinition of the macros called when the page header and
+footer traps are sprung.
+.
+.B PT
+(\[lq]page trap\[rq])
+is called by
+.I ms
+when the header is to be written,
+and
+.B BT
+(\[lq]bottom trap\[rq])
+when the footer is to be.
+.
+The
+.I groff
+page location trap that
+.I ms
+sets up to format the header also calls the
+(normally undefined)
+.B HD
+macro after
+.BR .PT ;
+you can define
+.B .HD
+if you need additional processing after setting the header.
+.
+.\" Although undocumented in Tuthill's 4.2BSD ms.diffs paper...
+The
+.B HD
+hook is a Berkeley extension.
+.
+Any such macros you (re)define must implement any desired specialization
+for odd-,
+even-,
+or first numbered pages.
+.
+.
+.\" ====================================================================
+.SS "Tab stops"
+.\" ====================================================================
+.
+Use the
+.B ta
+request to set tab stops as needed.
+.
+.
+.TP
+.B .TA
+Reset the tab stops to the
+.I ms
+default
+(every 5 ens).
+.
+Redefine this macro to create a different set of default tab stops.
+.
+.
+.\" ====================================================================
+.SS Margins
+.\" ====================================================================
+.
+Control margins using the registers summarized in the \[lq]Margins\[rq]
+portion of the table in section \[lq]Document control settings\[rq]
+above.
+.
+There is no setting for the right margin;
+the combination of page offset
+.B \[rs]n[PO]
+and line length
+.B \[rs]n[LL]
+determines it.
+.
+.
+.\" ====================================================================
+.SS "Multiple columns"
+.\" ====================================================================
+.
+.I ms
+can set text in as many columns as reasonably fit on the page.
+.
+The following macros force a page break if a multi-column layout is
+active when they are called.
+.
+.B \[rs]n[MINGW]
+is the default minimum gutter width;
+it is a GNU extension.
+.
+When multiple columns are in use,
+keeps
+and the
+.B \%HORPHANS
+and
+.B \%PORPHANS
+registers
+work with respect to column breaks instead of page breaks.
+.
+.
+.TP
+.B .1C
+Arrange page text in a single column
+(the default).
+.
+.
+.TP
+.B .2C
+Arrange page text in two columns.
+.
+.
+.TP
+.BR .MC \~[\c
+.IR column-width " [" gutter-width ]]
+Arrange page text in multiple columns.
+.
+If you specify no arguments,
+it is equivalent to the
+.B 2C
+macro.
+.
+Otherwise,
+.I column-width
+is the width of each column and
+.I gutter-width
+is the minimum distance between columns.
+.
+.
+.\" ====================================================================
+.SS "Creating a table of contents"
+.\" ====================================================================
+.
+Define an entry to appear in the table of contents by bracketing its
+text between calls to the
+.B XS
+and
+.B XE
+macros.
+.
+A typical application is to call them immediately after
+.B NH
+or
+.B SH
+and repeat the heading text within them.
+.
+The
+.B XA
+macro,
+used within
+.BR .XS / .XE
+pairs,
+supplements an entry\[em]for instance,
+when it requires multiple output lines,
+whether because a heading is too long to fit or because style dictates
+that page numbers not be repeated.
+.
+You may wish to indent the text thus wrapped to correspond to its
+heading depth;
+this can be done in the entry text by prefixing it with tabs or
+horizontal motion escape sequences,
+or by providing a second argument to the
+.B XA
+macro.
+.
+.B .XS
+and
+.B .XA
+automatically associate the page number where they are called with the
+text following them,
+but they accept arguments to override this behavior.
+.
+At the end of the document,
+call
+.B TC
+or
+.B PX
+to emit the table of contents;
+.B .TC
+resets the page number
+.RB to\~ i
+(Roman numeral one),
+and then calls
+.BR PX .
+.
+All of these macros are Berkeley extensions.
+.
+.
+.TP
+.BR .XS \~[\c
+.IR page-number ]
+.TQ
+.BR .XA \~[\c
+.IR page-number \~[ indentation ]]
+.TQ
+.B .XE
+Begin,
+supplement,
+and end a table of contents entry.
+.
+Each entry is associated with
+.I page-number
+(otherwise the current page number);
+a
+.I page-number
+of
+.RB \[lq] no \[rq]
+prevents a leader and page number from being emitted for that entry.
+.
+Use of
+.B .XA
+within
+.BR .XS / .XE
+is optional;
+it can be repeated.
+.
+If
+.I indentation
+is present,
+a supplemental entry is indented by that amount;
+ens are assumed if no unit is indicated.
+.
+Text on input lines between
+.B .XS
+and
+.B .XE
+is stored for later recall by
+.BR .PX .
+.
+.
+.TP
+.BR .PX \~[ no ]
+Switch to single-column layout.
+.
+Unless
+.RB \[lq] no \[rq]
+is specified,
+center and interpolate
+.B \[rs]*[TOC]
+in bold and two points larger than the body text.
+.
+Emit the table of contents entries.
+.
+.
+.TP
+.BR .TC \~[ no ]
+Set the page number to\~1,
+the page number format to lowercase Roman numerals,
+and call
+.B PX
+(with a
+.RB \[lq] no \[rq]
+argument,
+if present).
+.
+.
+.P
+The remaining features in this subsection are GNU extensions.
+.
+.I groff ms
+obviates the need to repeat heading text after
+.B .XS
+calls.
+.
+Call
+.B .XN
+and
+.B .XH
+after
+.B .NH
+and
+.BR .SH ,
+respectively.
+.
+Text to be appended to the formatted section heading,
+but not to appear in the table of contents entry,
+can follow these calls.
+.
+.
+.TP
+.BI .XN\~ heading-text
+Format
+.I heading-text
+and create a corresponding table of contents entry;
+the indentation is computed from the
+.I depth
+argument of the preceding
+.B NH
+call.
+.
+.
+.TP
+.BI .XH\~ "depth heading-text"
+As
+.BR .XN ,
+but use
+.I depth
+to determine the indentation.
+.
+.
+.P
+.I groff ms
+encourages customization of table of contents entry production.
+.
+(Re-)define any of the following macros as desired.
+.
+.
+.TP
+.BI \%.XN\-REPLACEMENT\~ heading-text
+.TQ
+.BI \%.XH\-REPLACEMENT\~ "depth heading-text"
+These hook macros implement
+.B .XN
+and
+.BR .XH ,
+and call
+.B \%XN\-INIT
+and
+.BR \%XH\-INIT ,
+respectively,
+then call
+.B \%XH\-UPDATE\-TOC
+with the arguments given them.
+.
+.
+.TP
+.B \%.XH\-INIT
+.TQ
+.B \%.XN\-INIT
+These hook macros do nothing by default.
+.
+.
+.TP
+.BI \%.XH\-UPDATE\-TOC\~ "depth heading-text"
+Bracket
+.I heading-text
+with
+.B XS
+and
+.B XE
+calls,
+indenting it by 2 ens per level of
+.I depth
+beyond the first.
+.
+.
+.P
+You can customize the style of the leader that bridges each table of
+contents entry with its page number;
+define the
+.B TC\-LEADER
+special character by using the
+.B char
+request.
+.
+A typical leader combines the dot glyph
+.RB \[lq] .\& \[rq]
+with a horizontal motion escape sequence to spread the dots.
+.
+The width of the page number field is stored in the
+.B TC\-MARGIN
+register.
+.
+.
+.\" ====================================================================
+.SH "Differences from AT&T \f[I]ms\f[]"
+.\" ====================================================================
+.
+The
+.I groff ms
+macros are an independent reimplementation,
+using no AT&T code.
+.
+Since they take advantage of the extended features of
+.IR groff ,
+they cannot be used with AT&T
+.IR troff .
+.
+.I groff ms
+supports features described above as Berkeley and Tenth Edition Research
+Unix extensions,
+and adds several of its own.
+.
+.
+.IP \[bu] 3n
+The internals of
+.I groff ms
+differ from the internals of AT&T
+.IR ms .
+.
+Documents that depend upon implementation details of AT&T
+.I ms
+may not format properly with
+.IR "groff ms" .
+.
+Such details include macros whose function was not documented in the
+AT&T
+.I ms
+manual
+(\[lq]Typing Documents on the UNIX System: Using the \-ms Macros with
+Troff and Nroff\[rq],
+M.\& E.\& Lesk,
+Bell Laboratories,
+1978).
+.\" TODO: Use refer(1)?
+.\" XXX: We support RT anyway; maybe we should stop?
+.
+.
+.IP \[bu]
+The error-handling policy of
+.I groff ms
+is to detect and report errors,
+rather than to ignore them silently.
+.
+.
+.IP \[bu]
+Tenth Edition \" possibly 9th
+Research Unix supported
+.BR P1 / P2
+macros to bracket code examples;
+.I groff ms
+does not.
+.
+.
+.IP \[bu]
+.I groff ms
+does not work in GNU
+.IR troff 's \" GNU
+AT&T compatibility mode.
+.
+If loaded when that mode is enabled,
+it aborts processing with a diagnostic message.
+.
+.
+.IP \[bu]
+Multiple line spacing is not supported.
+.
+Use a larger vertical spacing instead.
+.
+.
+.IP \[bu]
+.I groff ms
+uses the same header and footer defaults in both
+.I nroff
+and
+.I troff
+modes
+as AT&T
+.I ms
+does in
+.I troff
+mode;
+AT&T's default in
+.I nroff
+mode is to put the date,
+in U.S.\& traditional format
+(e.g.,
+\[lq]January 1, 2021\[rq]),
+in the center footer
+(the
+.B CF
+string).
+.
+.
+.IP \[bu]
+Many
+.I groff ms
+macros,
+including those for paragraphs,
+headings,
+and displays,
+cause a reset of paragraph rendering parameters,
+and may change the indentation;
+they do so not by incrementing or decrementing it,
+but by setting it absolutely.
+.
+This can cause problems for documents that define additional macros of
+their own that try to manipulate indentation.
+.
+Use
+.B .RS
+and
+.B .RE
+instead of the
+.B in
+request.
+.
+.
+.IP \[bu]
+AT&T
+.I ms
+interpreted the values of the registers
+.B PS
+and
+.B VS
+in points,
+and did not support the use of scaling units with them.
+.
+.I groff ms
+interprets values of the registers
+.BR PS ,
+.BR VS ,
+.BR FPS ,
+and
+.BR FVS ,
+equal to or larger than\~1,000
+(one thousand)
+as decimal fractions multiplied by\~1,000.
+.
+(Register values are converted to and stored as basic
+units.
+.
+See \[lq]Measurements\[rq] in the
+.I groff
+Texinfo manual or in
+.MR groff @MAN7EXT@ ).
+.
+This threshold makes use of a scaling unit with these parameters
+practical for high-resolution devices while preserving backward
+compatibility.
+.
+It also permits expression of non-integral type sizes.
+.
+For example,
+.RB \[lq] "groff \-rPS=10.5p" \[rq]
+at the shell prompt is equivalent to placing
+.RB \[lq] ".nr PS 10.5p" \[rq]
+at the beginning of the document.
+.
+.
+.IP \[bu]
+AT&T
+.IR ms 's
+.B AU
+macro supported arguments used with some document types;
+.I groff ms
+does not.
+.
+.
+.IP \[bu]
+Right-aligned displays are available.
+.
+The AT&T
+.I ms
+manual observes that \[lq]it is tempting to assume that
+.RB \[lq] ".DS R" \[rq]
+will right adjust lines,
+but it doesn't work\[rq].
+.
+In
+.IR "groff ms" ,
+it does.
+.
+.
+.IP \[bu]
+To make
+.I groff ms
+use the default page offset
+(which also specifies the left margin),
+the
+.B PO
+register must stay undefined until the first
+.I ms
+macro is called.
+.
+This implies that
+.B \[rs]n[PO]
+should not be used early in the document,
+unless it is changed also:
+accessing an undefined register automatically defines it.
+.
+.
+.IP \[bu]
+.I groff ms
+supports the
+.B PN
+register,
+but it is not necessary;
+you can access the page number via the usual
+.B %
+register and invoke the
+.B af
+request to assign a different format to it if desired.
+.
+(If you redefine the
+.I ms
+.B PT
+macro \" I wouldn't mention that, but Lesk 1978 encourages doing so. :-/
+and desire special treatment of certain page numbers\[em]like
+.RB \[lq] 1 \[rq]\[em]you
+may need to handle a non-Arabic page number format,
+as
+.IR "groff ms" 's
+.B .PT
+does;
+see the macro package source.
+.
+.I groff ms
+aliases the
+.B PN
+register to
+.BR % .)
+.
+.
+.IP \[bu]
+The AT&T
+.I ms
+manual documents registers
+.B CW
+and
+.B GW
+as setting the default column width and \[lq]intercolumn gap\[rq],
+respectively,
+and which applied when
+.B .MC
+was called with fewer than two arguments.
+.
+.I groff ms
+instead treats
+.B .MC
+without arguments as synonymous with
+.BR .2C ;
+there is thus no occasion for a default column width register.
+.
+Further,
+the
+.B MINGW
+register
+and the second argument to
+.B .MC
+specify a
+.I minimum
+space between columns,
+not the fixed gutter width of AT&T
+.IR ms .
+.
+.
+.IP \[bu]
+The AT&T
+.I ms
+manual did not document the
+.B QI
+register;
+Berkeley and
+.I "groff ms"
+do.
+.
+.
+.IP \[bu]
+The register
+.B GS
+is set to\~1 by the
+.I groff ms
+macros,
+but is not used by the AT&T
+.I ms
+package.
+.
+Documents that need to determine whether they are being formatted with
+.I groff ms
+or another implementation should test this register.
+.
+.
+.\" ====================================================================
+.SS "Unix Version\~7 macros not implemented by \f[I]groff ms\f[]"
+.\" ====================================================================
+.
+Several macros described in the Unix Version\~7
+.I ms
+documentation are unimplemented by
+.I groff ms
+because they are specific to the requirements of documents produced
+internally by Bell Laboratories,
+some of which also require a glyph for the Bell System logo that
+.I groff
+does not support.
+.
+These macros implemented several document type formats
+(\c
+.BR EG , \" engineer's notes
+.BR IM , \" internal memorandum
+.BR MF , \" memorandum for file
+.BR MR , \" memorandum for record
+.BR TM , \" technical memorandum
+.BR TR ), \" technical report
+were meaningful only in conjunction with the use of certain document
+types
+(\c
+.BR AT , \" attachments
+.BR CS , \" cover sheet info for `TM` documents
+.BR CT , \" copies to
+.BR OK , \" "other keywords" for `TM` documents
+.BR SG ), \" signatures for `TM` documents
+stored the postal addresses of Bell Labs sites
+(\c
+.BR HO , \" Holmdel
+.BR IH , \" Naperville
+.BR MH , \" Murray Hill
+.BR PY , \" Piscataway
+.BR WH ), \" Whippany
+or lacked a stable definition over time
+(\c
+.BR UX ). \" Unix; on 1st use, add footnote identifying trademark owner
+.
+.
+.\" ====================================================================
+.SH "Legacy features"
+.\" ====================================================================
+.
+.I "groff ms"
+retains some legacy features solely to support formatting of historical
+documents;
+contemporary ones should not use them because they can render poorly.
+.
+See
+.MR groff_char @MAN7EXT@
+instead.
+.
+.
+.\" ====================================================================
+.SS "AT&T \f[I]ms\f[] accent mark strings"
+.\" ====================================================================
+.
+AT&T
+.I ms
+defined
+accent mark strings as follows.
+.
+.
+.P
+.TS
+Cb Lb
+Lf(CR) L.
+String Description
+_
+\[rs]*[\[aq]] Apply acute accent to subsequent glyph.
+\[rs]*[\[ga]] Apply grave accent to subsequent glyph.
+\[rs]*[:] Apply dieresis (umlaut) to subsequent glyph.
+\[rs]*[\[ha]] Apply circumflex accent to subsequent glyph.
+\[rs]*[\[ti]] Apply tilde accent to subsequent glyph.
+\[rs]*[C] Apply caron to subsequent glyph.
+.\" \*v was an undocumented (in Lesk 1978-11-13) synonym for \*C.
+\[rs]*[,] Apply cedilla to subsequent glyph.
+.TE
+.
+.
+.\" ====================================================================
+.SS "Berkeley \f[I]ms\f[] accent mark and glyph strings"
+.\" ====================================================================
+.
+Berkeley
+.I ms
+offered an
+.B AM
+macro;
+calling it redefined the AT&T accent mark strings
+(except for
+.BR \[rs]*C ),
+applied them to the
+.I preceding
+glyph,
+and defined additional strings,
+some for spacing glyphs.
+.
+.
+.TP
+.B .AM
+Enable alternative accent mark and glyph-producing strings.
+.
+.
+.P
+.TS
+Cb Lb
+Lf(CR) L.
+String Description
+_
+\[rs]*[\[aq]] Apply acute accent to preceding glyph.
+\[rs]*[\[ga]] Apply grave accent to preceding glyph.
+\[rs]*[:] Apply dieresis (umlaut) to preceding glyph.
+\[rs]*[\[ha]] Apply circumflex accent to preceding glyph.
+\[rs]*[\[ti]] Apply tilde accent to preceding glyph.
+\[rs]*[,] Apply cedilla to preceding glyph.
+\[rs]*[/] Apply stroke (slash) to preceding glyph.
+\[rs]*[v] Apply caron to preceding glyph.
+\[rs]*[_] Apply macron to preceding glyph.
+\[rs]*[.] Apply underdot to preceding glyph.
+\[rs]*[o] Apply ring accent to preceding glyph.
+_
+\[rs]*[?] Interpolate inverted question mark.
+\[rs]*[!] Interpolate inverted exclamation mark.
+\[rs]*[8] Interpolate small letter sharp s.
+\[rs]*[q] Interpolate small letter o with hook accent (ogonek).
+\[rs]*[3] Interpolate small letter yogh.
+\[rs]*[d-] Interpolate small letter eth.
+\[rs]*[D-] Interpolate capital letter eth.
+\[rs]*[th] Interpolate small letter thorn.
+\[rs]*[TH] Interpolate capital letter thorn.
+\[rs]*[ae] Interpolate small ae ligature.
+\[rs]*[AE] Interpolate capital ae ligature.
+\[rs]*[oe] Interpolate small oe ligature.
+\[rs]*[OE] Interpolate capital oe ligature.
+.TE
+.
+.
+.\" ====================================================================
+.SH "Naming conventions"
+.\" ====================================================================
+.
+The following conventions are used for names of macros,
+strings,
+and registers.
+.
+External names available to documents that use the
+.I groff ms
+macros contain only uppercase letters and digits.
+.
+.
+.LP
+Internally,
+the macros are divided into modules.
+.
+Conventions for identifier names are as follows.
+.
+.IP \[bu] 3n
+Names used only within one module are of the form
+.IB \%module * name\c
+\&.
+.
+.IP \[bu]
+Names used outside the module in which they are defined are of the form
+.IB \%module @ name\c
+\&.
+.
+.IP \[bu]
+Names associated with a particular environment are of the form
+.IB \%environment : name\c
+\&;
+these are used only within the
+.B par
+module.
+.
+.IP \[bu]
+.I name
+does not have a module prefix.
+.
+.IP \[bu]
+Constructed names used to implement arrays are of the form
+.IB \%array ! index\c
+\&.
+.
+.
+.PP
+Thus the
+.I groff ms
+macros reserve the following names:
+.
+.IP \[bu] 3n
+Names containing the characters
+.BR * ,
+.BR @ ,
+and\~\c
+.BR : .
+.
+.IP \[bu]
+Names containing only uppercase letters and digits.
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @MACRODIR@/\:@TMAC_S_PREFIX@s\:.tmac
+implements the package.
+.
+.
+.TP
+.I @MACRODIR@/refer\-ms.tmac
+implements
+.MR @g@refer @MAN1EXT@
+support for
+.IR ms .
+.
+.
+.TP
+.I @MACRODIR@/\:ms\:.tmac
+is a wrapper enabling the package to be loaded with
+.RB \[lq] "groff \-m ms" \[rq].
+.
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+The GNU version of the
+.I ms
+macro package was written by James Clark and contributors.
+.
+This document was written by Clark,
+.MT lkollar@\:despammed\:.com
+Larry Kollar
+.ME ,
+and
+.MT g.branden\:.robinson@\:gmail\:.com
+G.\& Branden Robinson
+.ME .
+.
+.
+.br
+.ne 8v
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+A manual is available in source and rendered form.
+.
+On your system,
+it may be compressed and/or available in additional formats.
+.
+.
+.TP
+.I @DOCDIR@/\:ms\:.ms
+.TQ
+.I @DOCDIR@/\:ms\:.ps
+\[lq]Using
+.I groff
+with the
+.I ms
+Macro Package\[rq];
+Larry Kollar and \%G.\~Branden Robinson.
+.
+.
+.br
+.ne 5v
+.TP
+.I @DOCDIR@/\:\%msboxes\:.ms
+.TQ
+.I @DOCDIR@/\:\%msboxes\:.pdf
+\[lq]Using PDF boxes with
+.I groff
+and the
+.I ms
+macros\[rq];
+Deri James.
+.
+.B \%BOXSTART
+and
+.B \%BOXSTOP
+macros are available via the
+.I sboxes
+extension package,
+enabling colored,
+bordered boxes when the
+.B pdf
+output device is used.
+.
+.
+.PP
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is the primary
+.I groff
+manual.
+.
+You can browse it interactively with \[lq]info groff\[rq].
+.
+.
+.PP
+.MR groff @MAN1EXT@ ,
+.MR @g@troff @MAN1EXT@ ,
+.MR @g@tbl @MAN1EXT@ ,
+.MR @g@pic @MAN1EXT@ ,
+.MR @g@eqn @MAN1EXT@ ,
+.MR @g@refer @MAN1EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_ms_7_man_C]
+.do rr *groff_groff_ms_7_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/groff_trace.7.man b/tmac/groff_trace.7.man
new file mode 100644
index 0000000..63da8ab
--- /dev/null
+++ b/tmac/groff_trace.7.man
@@ -0,0 +1,335 @@
+.TH groff_trace @MAN7EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+groff_trace \- macros for debugging GNU
+.I roff
+documents
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2002-2022 Free Software Foundation, Inc.
+.\"
+.\" This file is part of groff, the GNU roff type-setting system.
+.\"
+.\" Permission is granted to copy, distribute and/or modify this
+.\" document under the terms of the GNU Free Documentation License,
+.\" Version 1.3 or any later version published by the Free Software
+.\" Foundation; with no Invariant Sections, 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.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_trace_7_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY "groff \-m trace"
+.RI [ option\~ .\|.\|.\&]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I trace
+is a macro package for the
+.MR groff @MAN7EXT@
+document formatting system,
+designed as an aid for debugging documents written in its language.
+.
+It issues a message to the standard error stream upon entry to and exit
+from each macro call.
+.
+This can ease the process of isolating errors in macro definitions.
+.
+.
+.P
+Activate the package by specifying the command-line option
+.RB \[lq] \-m\~trace \[rq]
+to the formatter program
+(often
+.MR groff @MAN1EXT@ ).
+.
+You can achieve finer control by including the macro file within the
+document;
+invoke the
+.B mso
+request,
+as in
+.RB \[lq] .mso\~trace.tmac \[rq].
+.
+Only macros that are defined after this invocation are traced.
+.
+If the
+.B trace\-full
+register is set to a true value,
+as with the command-line option
+.RB \[lq] \-r\~trace\-full=1 \[rq],
+register and string assignments,
+along with some other requests,
+are traced also.
+.
+If another macro package should be traced as well,
+specify it after
+.RB \[lq] \-m\~trace \[rq]
+on the command line.
+.
+.
+.P
+The macro file
+.I trace.tmac
+is unusual because it does not contain any macros to be called by a
+user.
+.
+Instead,
+.IR groff 's
+macro definition and alteration facilities are wrapped such that they
+display diagnostic messages.
+.
+.
+.\" ====================================================================
+.SS Limitations
+.\" ====================================================================
+.
+Because
+.I trace.tmac
+wraps the
+.B de
+request
+(and its cousins),
+macro arguments are expanded one level more.
+.
+This causes problems if an argument uses four or more backslashes to
+delay interpretation of an escape sequence.
+.
+For example,
+the macro call
+.
+.RS
+.EX
+\&.foo \[rs]\[rs]\[rs]\[rs]n[bar]
+.EE
+.RE
+.
+normally passes \[lq]\[rs]\[rs]n[bar]\[rq] to macro \[lq]foo\[rq],
+but with
+.B de
+redefined,
+it passes \[lq]\[rs]n[bar]\[rq] instead.
+.
+.
+.P
+The solution to this problem is to use
+.IR groff 's
+.B \[rs]E
+escape sequence,
+an escape character that is not interpreted in copy mode.
+.
+.RS
+.EX
+\&.foo \[rs]En[bar]
+.EE
+.RE
+.
+.
+.\" ====================================================================
+.SH Examples
+.\" ====================================================================
+.
+We will illustrate
+.I trace.tmac
+using the shell's \[lq]here document\[rq] feature to supply
+.I groff
+with a document
+on the standard input stream.
+.
+Since we are interested only in diagnostic messages appearing on the
+standard error stream,
+we discard the formatted output by redirecting the standard output
+stream to
+.IR /dev/null .
+.
+.
+.\" ====================================================================
+.SS "Observing nested macro calls"
+.\" ====================================================================
+.
+Macro calls can be nested,
+even with themselves.
+.
+Tracing recurses along with them;
+this feature can help to detangle complex call stacks.
+.
+.
+.RS
+.P
+.EX
+.RB $\~ "cat <<EOF | groff \-m trace > /dev/null
+.B .de countdown
+.B . nop \[rs]\[rs]$1
+.B . nr count (\[rs]\[rs]$1 - 1)
+.B . if \[rs]\[rs]n[count] .countdown \[rs]\[rs]n[count]
+.B ..
+.B .countdown 3
+.B blastoff
+.B EOF
+\~*** .de countdown
+\~*** de trace enter: .countdown "3"
+\~\~*** de trace enter: .countdown "2"
+\~\~\~*** de trace enter: .countdown "1"
+\~\~\~*** trace exit: .countdown "1"
+\~\~*** trace exit: .countdown "2"
+\~*** trace exit: .countdown "3"
+.EE
+.RE
+.
+.
+.\" ====================================================================
+.SS "Tracing with the mso request"
+.\" ====================================================================
+.
+Now let us activate tracing within the document,
+not with a command-line option.
+.
+We might do this when using a macro package like
+.I ms
+or
+.IR mom ,
+where we may not want to be distracted by traces of macros we didn't
+write.
+.
+.
+.RS
+.P
+.EX
+.RB $\~ "cat <<EOF | groff -ms > /dev/null"
+.B .LP
+.B This is my introductory paragraph.
+.B .mso trace.tmac
+.B .de Mymac
+.B ..
+.B .Mymac
+.B .PP
+.B Let us review the existing literature.
+.B EOF
+\~*** .de Mymac
+\~*** de trace enter: .Mymac
+\~*** trace exit: .Mymac
+.EE
+.RE
+.
+.
+.P
+As tracing was not yet active when the macros \[lq]LP\[rq] and
+\[lq]PP\[rq] were defined
+(by
+.IR s.tmac ),
+their calls were not traced;
+contrast with the macro \[lq]Mymac\[rq].
+.
+.
+.br
+.ne 3v
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.I @MACRODIR@/\:trace\:.tmac
+implements the package.
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+.I trace.tmac
+was written by James Clark.
+.
+This document was written by
+.MT groff\-bernd\:.warken\-72@\:web\:.de
+Bernd Warken
+.ME
+and
+.MT g.branden\:.robinson@\:gmail\:.com
+G.\& Branden Robinson
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is the primary
+.I groff
+manual.
+.
+You can browse it interactively with \[lq]info groff\[rq].
+.
+.
+.TP
+.MR groff @MAN1EXT@
+gives an overview of the
+.I groff
+document formatting system.
+.
+.
+.TP
+.MR troff @MAN1EXT@
+supplies details of the
+.B \-m
+command-line option.
+.
+.
+.TP
+.MR groff_tmac @MAN5EXT@
+offers a survey of
+.I groff
+macro packages.
+.
+.
+.TP
+.MR groff @MAN7EXT@
+is a reference manual for the
+.I groff
+language.
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_trace_7_man_C]
+.do rr *groff_groff_trace_7_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/groff_www.7.man b/tmac/groff_www.7.man
new file mode 100644
index 0000000..599c3b7
--- /dev/null
+++ b/tmac/groff_www.7.man
@@ -0,0 +1,760 @@
+.TH groff_www @MAN7EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+groff_www \- GNU
+.I roff
+macros for authoring web pages
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2000-2020 Free Software Foundation, Inc.
+.\"
+.\" This file is part of groff, the GNU roff type-setting system.
+.\"
+.\" 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 3 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, see
+.\" <http://www.gnu.org/licenses/>.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_www_7_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Synopsis
+.\" ====================================================================
+.
+.SY "groff \-m www"
+.RI [ option\~ .\|.\|.\&]
+.RI [ file\~ .\|.\|.]
+.YS
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+This manual page describes the GNU
+.I www
+macro package,
+which is part of the
+.MR groff @MAN7EXT@
+document formatting system.
+.
+This macro file is automatically loaded by the default
+.I troffrc
+file when the formatter
+(usually
+.MR groff @MAN1EXT@ )
+is called with either of the options
+.B \-Thtml
+or
+.BR \-Txhtml .
+.
+To see hyperlinks in action,
+format this man page using one of those options.
+.
+.
+.P
+This document is a basic guide;
+the HTML output driver
+.RI ( \%grohtml )
+remains in an alpha state.
+.
+It has been included with the distribution to encourage testing.
+.
+.
+.P
+Here is a summary of the functions found in this macro set.
+.
+.
+.P
+.TS
+tab(@);
+l l.
+\&.JOBNAME@split output into multiple files
+\&.HX@automatic heading level cut off
+\&.BCL@specify colours on a web page
+\&.BGIMG@specify background image
+\&.URL@create a URL using two parameters
+\&.FTP@create an FTP reference
+\&.MTO@create an HTML email address
+\&.TAG@generate an HTML name
+\&.IMG@include an image file
+\&.PIMG@include PNG image
+\&.MPIMG@place PNG on the margin and wrap text around it
+\&.HnS@begin heading
+\&.HnE@end heading
+\&.LK@emit automatically collected links.
+\&.HR@produce a horizontal rule
+\&.NHR@suppress automatic generation of rules.
+\&.HTL@only generate HTML title
+\&.HEAD@add data to <head> block
+\&.ULS@unorder list begin
+\&.ULE@unorder list end
+\&.OLS@ordered list begin
+\&.OLE@ordered list end
+\&.DLS@definition list begin
+\&.DLE@definition list end
+\&.LI@insert a list item
+\&.DC@generate a drop capital
+\&.HTML@pass an HTML raw request to the device driver
+\&.CDS@code example begin
+\&.CDE@code example end
+\&.ALN@place links on left of main text.
+\&.LNS@start a new two-column table with links in the left.
+\&.LNE@end the two-column table.
+\&.LINKSTYLE@initialize default URL attributes.
+.TE
+.
+.
+.\" ====================================================================
+.SH Macros
+.\" ====================================================================
+.
+.TP
+.B .JOBNAME filename
+Split output into multiple HTML files.
+.
+A file is split whenever a \&.SH or \&.NH\ 1 is encountered.
+.
+Its argument is the file stem name for future output files.
+.
+This option is equivalent to
+.IR \%grohtml 's
+.B \-j
+option.
+.
+.TP
+.B .HX n
+Specify the cut off depth when generating links from section headings.
+.
+For example, a parameter of\~2 would cause
+.I \%grohtml
+to generate a list of links for
+.B .NH\ 1
+and
+.B .NH\ 2
+but not for
+.BR .NH\ 3 .
+.
+Whereas
+.
+.
+.RS
+.IP
+.EX
+\&.HX 0
+.EE
+.RE
+.
+.
+.IP
+tells
+.I \%grohtml
+that no heading links should be created at all.
+.
+Another method for turning automatic headings off is by issuing the
+command-line switch
+.B \-P\-l
+to
+.IR groff .
+.
+.
+.TP
+.BI .BCL\~ "foreground background active not-visited visited"
+This macro takes five parameters:
+foreground,
+background,
+active hypertext link,
+hypertext link not yet visited,
+and visited hypertext link colour.
+.
+.TP
+.B .BGIMG imagefile
+the only parameter to this macro is the background image file.
+.
+.TP
+.B .URL url [description] [after]
+generates a URL using either one,
+two,
+or three arguments.
+.
+The first parameter is the actual URL, the second is the name of the
+link, and the third is optional stuff to be printed immediately
+afterwards.
+.
+If
+.B description
+and
+.B after
+are absent then the
+.B URL
+becomes the anchor text.
+.
+Hyphenation is disabled while printing the actual URL;
+explicit breakpoints should be inserted with the
+.B \[rs]:
+escape sequence.
+.
+Here is how to encode
+.UR http://\:foo\:.org/
+foo
+.UE :
+.RS
+.IP
+.B .URL http://\[rs]:foo\[rs]:.org/ "foo" :
+.RE
+.
+.IP
+If this is processed by a device other than
+.B \-Thtml
+or
+.B \-Txhtml
+it appears as:
+.RS
+.IP
+foo \[la]\f[CR]http://\:foo\:.org\f[]\[ra]:
+.RE
+.
+.IP
+The URL macro can be of any type;
+for example, we can reference
+.UR pic\:.html
+Eric Raymond's
+.I pic
+guide
+.UE
+by:
+.RS
+.IP
+.B .URL pic\[rs]:.html \[dq]Eric Raymond\[aq]s pic guide\[dq]
+.RE
+.
+.TP
+.B .MTO address [description] [after]
+Generate an email HTML reference.
+.
+The first argument is mandatory as the email address.
+.
+The optional second argument is the text you see in your browser.
+.
+If an empty argument is given,
+.B address
+is used instead.
+.
+An optional third argument is stuff printed immediately afterwards.
+.
+Hyphenation is disabled while printing the actual email address.
+.
+For example,
+.MT joe@\:user\:.org
+Joe User
+.ME
+can be achieved by the following macro:
+.RS
+.IP
+.B .MTO joe@user.org \[dq]Joe User\[dq]
+.RE
+.
+.IP
+All URLs currently are treated as consuming no textual
+space in
+.IR groff .
+.
+This could be considered as a bug since it causes some problems.
+.
+To circumvent this,
+.B www.tmac
+inserts a zero-width character which expands to a harmless space (only
+if run with
+.B \-Thtml
+or
+.BR \-Txhtml ).
+.
+.TP
+.B .FTP url [description] [after]
+indicates that data can be obtained via FTP.
+.
+The first argument is the URL and the second is the browser text.
+.
+A third argument, similar to the macros above, is intended for stuff
+printed immediately afterwards.
+.
+The second and the third parameter are optional.
+.
+Hyphenation is disabled while printing the actual URL.
+.
+As an example, here is the location of the
+.UR ftp://\:ftp\:.gnu\:.org/
+GNU FTP server
+.UE .
+.
+The macro example above can be specified as:
+.RS
+.IP
+.B .FTP ftp://\[rs]:ftp\[rs]:.gnu\[rs]:.org/ \[dq]GNU FTP server\[dq] .
+.RE
+.
+.TP
+.B .TAG name
+Generates an HTML name tag from its argument.
+.
+This can then be referenced using the
+.UR #URL
+URL
+.UE
+macro.
+.
+As you can see, you must precede the tag name with
+.B #
+since it is a local reference.
+.
+This link was achieved via placing a TAG in the URL description above;
+the source looks like this:
+.
+.
+.RS
+.IP
+.EX
+\&.TP
+\&.B URL
+generates
+\&.TAG URL
+a URL using either two or three arguments.
+\&.\|.\|.
+.EE
+.RE
+.
+.
+.TP
+.B .IMG [\-R|\-L|\-C] filename [width] [height]
+Include a picture into the document.
+.
+The first argument is the horizontal location: right, left, or center
+.RB ( \-R ,
+.BR \-L ,
+or
+.BR \-C ).
+.
+Alignment is centered by default
+.RB ( \-C ).
+.
+The second argument is the filename.
+.
+The optional third and fourth arguments are the width and height.
+.
+If the width is absent it defaults to 1\~inch.
+.
+If the height is absent it defaults to the width.
+.
+This maps onto an HTML img tag.
+.
+If you are including a PNG image then it is advisable to use the
+.B PIMG
+macro.
+.
+.TP
+.B .PIMG [\-R|\-L|\-C] filename [width [height]]
+Include an image in PNG format.
+.
+This macro takes exactly the same parameters as the
+.B IMG
+macro; it has the advantage of working with PostScript and HTML devices
+also since it can automatically convert the image into the EPS format,
+using the following programs of the
+.B netpbm
+package:
+.BR pngtopnm ,
+.BR pnmcrop ,
+and
+.BR pnmtops .
+.
+If the document isn't processed with
+.B \-Thtml
+or
+.B \-Txhtml
+it is necessary to use the
+.B \-U
+option of
+.IR groff .
+.
+.TP
+.B .MPIMG [\-R|\-L] [\-G gap] filename [width [height]]
+Place a PNG image on the margin and wrap text around it.
+.
+The first parameters are optional.
+.
+The alignment: left or right
+.RB ( \-L
+or
+.BR \-R )
+specifies the margin where the picture is placed at.
+.
+The default alignment is left
+.RB ( \-L ).
+.
+Optionally,
+.BI \-G \~gap
+can be used to arrange a gap between the picture and the text that
+wraps around it.
+.
+The default gap width is zero.
+.
+.br
+The first non-optional argument is the filename.
+.
+The optional following arguments are the width and height.
+.
+If the width is absent it defaults to 1\~inch.
+.
+If the height is absent it defaults to the width.
+.
+Example:
+.
+.
+.RS
+.IP
+.EX
+\&.MPIMG \-L \-G 2c foo.png 3c 1.5c
+.EE
+.RE
+.
+.
+.IP
+The height and width may also be given as percentages.
+.
+The PostScript device calculates the width from the
+.B .l
+register and the height from the
+.B .p
+register.
+.
+For example:
+.
+.
+.RS
+.IP
+.EX
+\&.MPIMG \-L \-G 2c foo.png 15%
+.EE
+.RE
+.
+.
+.TP
+.B .HnS n
+Begin heading.
+.
+The numeric heading level
+.I n
+is specified by the first parameter.
+.
+Use this macro if your headings contain URL, FTP or MTO macros.
+.
+Example:
+.
+.
+.RS
+.IP
+.EX
+\&.HnS 1
+\&.HR
+GNU Troff
+\&.URL https://\[rs]:www\[rs]:.gnu\[rs]:.org/\[rs]:software/\[rs]:groff/
+\&\[rs][em]a
+\&.URL http://www\[rs]:.gnu\[rs]:.org/ GNU
+\&project.
+\&.HR
+\&.HnE
+.EE
+.RE
+.
+.
+.IP
+In this case you might wish to disable automatic links to headings.
+.
+This can be done via
+.B \-P\-l
+from the command line.
+.\" or by using a call to \[lq].HX 0\[rq].
+.
+.
+.TP
+.B .HnE
+End heading.
+.
+.
+.TP
+.B .LK
+Force
+.I \%grohtml
+to place the automatically generated links at this position.
+.
+.
+.TP
+.B .HR
+Generate a full-width horizontal rule for
+.B \-Thtml
+and
+.BR \-Txhtml .
+.
+No effect for all other devices.
+.
+.TP
+.B .NHR
+Suppress generation of the top and bottom rules which
+.I \%grohtml
+emits by default.
+.
+.TP
+.B .HTL
+Generate an HTML title only.
+.
+This differs from the
+.B TL
+macro of the
+.B ms
+macro package which generates both an HTML title and an <H1> heading.
+.
+Use it to provide an HTML title as search engine fodder but a graphic
+title in the document.
+.
+The macro terminates when a space or break is seen (.sp, \&.br).
+.
+.TP
+.B .HEAD
+Add arbitrary HTML data to the <head> block.
+.
+Ignored if not processed with
+.B \-Thtml
+or
+.BR \-Txhtml .
+.
+Example:
+.
+.
+.RS
+.IP
+.EX
+\&.HEAD \[dq]<link \[rs]
+ rel=\[dq]\[dq]icon\[dq]\[dq] \[rs]
+ type=\[dq]\[dq]image/png\[dq]\[dq] \[rs]
+ href=\[dq]\[dq]http://foo.org//bar.png\[dq]\[dq]/>\[dq]
+.EE
+.RE
+.
+.
+.TP
+.B .HTML
+All text after this macro is treated as raw HTML.
+.
+If the document is processed without
+.B \-Thtml
+or
+.B \-Txhtml
+then the macro is ignored.
+.
+Internally, this macro is used as a building block for other
+higher-level macros.
+.
+.IP
+For example, the
+.B BGIMG
+macro is defined as
+.
+.
+.RS
+.IP
+.EX
+\&.de BGIMG
+\&.\& HTML <body background=\[rs]\[rs]$1>
+\&..
+.EE
+.RE
+.
+.
+.TP
+.B .DC l text [color]
+Produce a drop capital.
+.
+The first parameter is the letter to be dropped and enlarged, the second
+parameter
+.B text
+is the adjoining text whose height the first letter should not exceed.
+.
+The optional third parameter is the color of the dropped letter.
+.
+It defaults to black.
+.
+.TP
+.B ".CDS"
+Start displaying a code section in constant width font.
+.
+.TP
+.B ".CDE"
+End code display
+.
+.TP
+.B ".ALN [color] [percentage]"
+Place section heading links automatically to the left of the main text.
+.
+The color argument is optional and if present indicates which HTML
+background color is to be used under the links.
+.
+The optional percentage indicates the amount of width to devote to
+displaying the links.
+.
+The default values are #eeeeee and 30 for color and percentage width,
+respectively.
+.
+This macro should only be called once at the beginning of the document.
+.
+After calling this macro each section heading emits an HTML table
+consisting of the links in the left and the section text on the right.
+.
+.TP
+.B ".LNS"
+Start a new two-column table with links in the left column.
+.
+This can be called if the document has text before the first \&.SH and
+if \&.ALN is used.
+.
+Typically this is called just before the first paragraph and after the
+main title as it indicates that text after this point should be
+positioned to the right of the left-hand navigational links.
+.
+.TP
+.B ".LNE"
+End a two-column table.
+.
+This should be called at the end of the document if \&.ALN was used.
+.
+.TP
+.B ".LINKSTYLE color [ fontstyle [ openglyph closeglyph ] ]"
+Initialize default URL attributes to be used if this macro set is not
+used with the HTML device.
+.
+The macro set initializes itself with the following call
+.
+.
+.RS
+.IP
+.EX
+\&.LINKSTYLE blue CR \e[la] \e[ra]
+.EE
+.RE
+.
+.
+.IP
+but these values will be superseded by a user call to LINKSTYLE.
+.
+.
+.\" ====================================================================
+.SH "Section heading links"
+.\" ====================================================================
+.
+By default
+.I \%grohtml
+generates links to all section headings and places these at the top of
+the HTML document.
+.
+(See
+.UR #LK
+LINKS
+.UE
+for details of how to switch this off or alter the position).
+.
+.
+.\" ====================================================================
+.SH "Limitations of \f[I]grohtml\f[]"
+.\" ====================================================================
+.
+.MR @g@tbl @MAN1EXT@
+tables are rendered as PNG images.
+.
+Paul DuBois's approach with
+.MR tblcvt 1 ,
+part of the
+.UR http://\:www\:.snake\:.net/\:software/\:troffcvt/
+.I troffcvt
+distribution
+.UE ,
+should be explored.
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.I @MACRODIR@/\:www\:.tmac
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+The
+.I www
+macro package
+was written by
+.MT gaius@\:glam\:.ac\:.uk
+Gaius Mulley
+.ME ,
+with additions by
+.MT wl@\:gnu\:.org
+Werner Lemberg
+.ME
+and
+.MT groff\-bernd\:.warken\-72@\:web\:.de
+Bernd Warken
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.MR groff @MAN1EXT@ ,
+.MR @g@troff @MAN1EXT@ ,
+.MR grohtml @MAN1EXT@ ,
+.MR netpbm 1
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_www_7_man_C]
+.do rr *groff_groff_www_7_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/html-end.tmac b/tmac/html-end.tmac
new file mode 100644
index 0000000..827d46c
--- /dev/null
+++ b/tmac/html-end.tmac
@@ -0,0 +1,31 @@
+.\" -*- nroff -*-
+.\"
+.\" html-end.tmac
+.\"
+.do nr *groff_html-end_tmac_C \n[.cp]
+.cp 0
+.
+.\" turn off all headers and footers for ms, me, and mm macro sets
+.if d EF .EF ''''
+.if d EH .EH ''''
+.if d OF .OF ''''
+.if d OH .OH ''''
+.if d ef .ef ''''
+.if d of .of ''''
+.if d oh .oh ''''
+.if d eh .eh ''''
+.tl ''''
+.
+.\" tell grohtml some default parameter values
+.pl 99999i
+.po 0
+.ll \n[.l]u
+.ta \n[.tabs]
+.
+.cp \n[*groff_html-end_tmac_C]
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/html.tmac b/tmac/html.tmac
new file mode 100644
index 0000000..887b288
--- /dev/null
+++ b/tmac/html.tmac
@@ -0,0 +1,550 @@
+.\" -*- nroff -*-
+.\"
+.\" html.tmac
+.\"
+.do nr *groff_html_tmac_C \n[.cp]
+.cp 0
+.
+.nroff
+.
+.ftr CW CR
+.ftr C CR
+.ftr CO CI
+.ftr CX CBI
+.ftr H HR
+.ftr HO HI
+.ftr HX HBI
+.ftr NX NBI
+.
+.fchar \[fi] fi
+.fchar \[fl] fl
+.fchar \[ff] ff
+.fchar \[Fi] ffi
+.fchar \[Fl] ffl
+.
+.\"
+.\" remove hyphenation
+.\"
+.nh
+.nr HY 0
+.
+.de hy
+..
+.de nh
+..
+.
+.\" avoid line breaks after hyphen-like characters.
+.cflags 0 -\[hy]\[em]\[en]
+.
+.\" Now set any characters defined in devps/S but not in devhtml to nul --
+.\" these are generated by eqn but not used by grohtml. grops generated
+.\" images during the alternative pass.
+.if !c\[radicalex] .tr \[radicalex]
+.if !c\[arrowverttp] .tr \[arrowverttp]
+.if !c\[arrowvertbt] .tr \[arrowvertbt]
+.if !c\[arrowvertex] .tr \[arrowvertex]
+.if !c\[barex] .tr \[barex]
+.if !c\[sqrtex] .tr \[sqrtex]
+.
+.\" now for the color definitions
+.\"
+.\" html-4.0 colors
+.\"
+.defcolor white rgb #ffffff
+.defcolor fuchsia rgb #ff00ff
+.
+.\" these colors are compliant with html-3.0 and above
+.defcolor aliceblue rgb #eff7ff
+.defcolor antiquewhite rgb #f9e8d2
+.defcolor antiquewhite1 rgb #feedd6
+.defcolor antiquewhite2 rgb #ebdbc5
+.defcolor antiquewhite3 rgb #c8b9a6
+.defcolor antiquewhite4 rgb #817468
+.defcolor aquamarine rgb #43b7ba
+.defcolor aquamarine1 rgb #87fdce
+.defcolor aquamarine2 rgb #7deabe
+.defcolor aquamarine3 rgb #69c69f
+.defcolor aquamarine4 rgb #417c64
+.defcolor azure rgb #efffff
+.defcolor azure2 rgb #deecec
+.defcolor azure3 rgb #bcc7c7
+.defcolor azure4 rgb #7a7d7d
+.defcolor beige rgb #f5f3d7
+.defcolor bisque rgb #fde0bc
+.defcolor bisque2 rgb #ead0ae
+.defcolor bisque3 rgb #c7af92
+.defcolor bisque4 rgb #816e59
+.defcolor black rgb #000000
+.defcolor blanchedalmond rgb #fee8c6
+.defcolor blue rgb #0000ff
+.defcolor blue1 rgb #1535ff
+.defcolor blue2 rgb #1531ec
+.defcolor blue3 rgb #1528c7
+.defcolor blue4 rgb #151b7e
+.defcolor blueviolet rgb #7931df
+.defcolor brown rgb #980517
+.defcolor brown1 rgb #f63526
+.defcolor brown2 rgb #e42d17
+.defcolor brown3 rgb #c22217
+.defcolor burlywood1 rgb #fcce8e
+.defcolor burlywood2 rgb #eabe83
+.defcolor burlywood3 rgb #c6a06d
+.defcolor burlywood4 rgb #806341
+.defcolor cadetblue rgb #578693
+.defcolor cadetblue1 rgb #99f3ff
+.defcolor cadetblue2 rgb #8ee2ec
+.defcolor cadetblue3 rgb #77bfc7
+.defcolor cadetblue4 rgb #4c787e
+.defcolor chartreuse rgb #8afb17
+.defcolor chartreuse2 rgb #7fe817
+.defcolor chartreuse3 rgb #6cc417
+.defcolor chartreuse4 rgb #437c17
+.defcolor chocolate rgb #c85a17
+.defcolor coral rgb #f76541
+.defcolor coral2 rgb #e55b3c
+.defcolor coral3 rgb #c34a2c
+.defcolor coral4 rgb #7e2817
+.defcolor cornflowerblue rgb #151b8d
+.defcolor cornsilk rgb #fff7d7
+.defcolor cornsilk2 rgb #ece5c6
+.defcolor cornsilk3 rgb #c8c2a7
+.defcolor cornsilk4 rgb #817a68
+.defcolor cyan rgb #00ffff
+.defcolor cyan1 rgb #57feff
+.defcolor cyan2 rgb #50ebec
+.defcolor cyan3 rgb #46c7c7
+.defcolor cyan4 rgb #307d7e
+.defcolor darkgoldenrod rgb #af7817
+.defcolor darkgoldenrod1 rgb #fbb117
+.defcolor darkgoldenrod2 rgb #e8a317
+.defcolor darkgoldenrod3 rgb #c58917
+.defcolor darkgoldenrod4 rgb #7f5217
+.defcolor darkgreen rgb #254117
+.defcolor darkkhaki rgb #b7ad59
+.defcolor darkolivegreen rgb #4a4117
+.defcolor darkolivegreen1 rgb #ccfb5d
+.defcolor darkolivegreen2 rgb #bce954
+.defcolor darkolivegreen3 rgb #a0c544
+.defcolor darkolivegreen4 rgb #667c26
+.defcolor darkorange rgb #f88017
+.defcolor darkorange1 rgb #f87217
+.defcolor darkorange2 rgb #e56717
+.defcolor darkorange3 rgb #c35617
+.defcolor darkorange4 rgb #7e3117
+.defcolor darkorchid rgb #7d1b7e
+.defcolor darkorchid1 rgb #b041ff
+.defcolor darkorchid2 rgb #a23bec
+.defcolor darkorchid3 rgb #8b31c7
+.defcolor darkorchid4 rgb #571b7e
+.defcolor darksalmon rgb #e18b6b
+.defcolor darkseagreen rgb #8bb381
+.defcolor darkseagreen1 rgb #c3fdb8
+.defcolor darkseagreen2 rgb #b5eaaa
+.defcolor darkseagreen3 rgb #99c68e
+.defcolor darkseagreen4 rgb #617c58
+.defcolor darkslateblue rgb #2b3856
+.defcolor darkslategray rgb #25383c
+.defcolor darkslategray1 rgb #9afeff
+.defcolor darkslategray2 rgb #8eebec
+.defcolor darkslategray3 rgb #78c7c7
+.defcolor darkslategray4 rgb #4c7d7e
+.defcolor darkturquoise rgb #3b9c9c
+.defcolor darkviolet rgb #842dce
+.defcolor deeppink rgb #f52887
+.defcolor deeppink2 rgb #e4287c
+.defcolor deeppink3 rgb #c12267
+.defcolor deeppink4 rgb #7d053f
+.defcolor deepskyblue rgb #3bb9ff
+.defcolor deepskyblue2 rgb #38acec
+.defcolor deepskyblue3 rgb #3090c7
+.defcolor deepskyblue4 rgb #25587e
+.defcolor dimgray rgb #463e41
+.defcolor dodgerblue rgb #1589ff
+.defcolor dodgerblue2 rgb #157dec
+.defcolor dodgerblue3 rgb #1569c7
+.defcolor dodgerblue4 rgb #153e7e
+.defcolor firebrick rgb #800517
+.defcolor firebrick1 rgb #f62817
+.defcolor firebrick2 rgb #e42217
+.defcolor firebrick3 rgb #c11b17
+.defcolor floralwhite rgb #fff9ee
+.defcolor forestgreen rgb #4e9258
+.defcolor gainsboro rgb #d8d9d7
+.defcolor ghostwhite rgb #f7f7ff
+.defcolor gold rgb #d4a017
+.defcolor gold1 rgb #fdd017
+.defcolor gold2 rgb #eac117
+.defcolor gold3 rgb #c7a317
+.defcolor gold4 rgb #806517
+.defcolor goldenrod rgb #edda74
+.defcolor goldenrod1 rgb #fbb917
+.defcolor goldenrod2 rgb #e9ab17
+.defcolor goldenrod3 rgb #c68e17
+.defcolor goldenrod4 rgb #805817
+.defcolor gray rgb #736f6e
+.defcolor gray0 rgb #150517
+.defcolor gray100 rgb #ffffff
+.defcolor gray18 rgb #250517
+.defcolor gray21 rgb #2b1b17
+.defcolor gray23 rgb #302217
+.defcolor gray24 rgb #302226
+.defcolor gray25 rgb #342826
+.defcolor gray26 rgb #34282c
+.defcolor gray27 rgb #382d2c
+.defcolor gray28 rgb #3b3131
+.defcolor gray29 rgb #3e3535
+.defcolor gray30 rgb #413839
+.defcolor gray31 rgb #41383c
+.defcolor gray32 rgb #463e3f
+.defcolor gray34 rgb #4a4344
+.defcolor gray35 rgb #4c4646
+.defcolor gray36 rgb #4e4848
+.defcolor gray37 rgb #504a4b
+.defcolor gray38 rgb #544e4f
+.defcolor gray39 rgb #565051
+.defcolor gray40 rgb #595454
+.defcolor gray41 rgb #5c5858
+.defcolor gray42 rgb #5f5a59
+.defcolor gray43 rgb #625d5d
+.defcolor gray44 rgb #646060
+.defcolor gray45 rgb #666362
+.defcolor gray46 rgb #696565
+.defcolor gray47 rgb #6d6968
+.defcolor gray48 rgb #6e6a6b
+.defcolor gray49 rgb #726e6d
+.defcolor gray50 rgb #747170
+.defcolor gray51 rgb #787473
+.defcolor gray52 rgb #7a7777
+.defcolor gray53 rgb #7c7979
+.defcolor gray54 rgb #807d7c
+.defcolor gray55 rgb #82807e
+.defcolor gray56 rgb #858381
+.defcolor gray57 rgb #878583
+.defcolor gray58 rgb #8b8987
+.defcolor gray59 rgb #8d8b89
+.defcolor gray60 rgb #8f8e8d
+.defcolor gray61 rgb #939190
+.defcolor gray62 rgb #959492
+.defcolor gray63 rgb #999795
+.defcolor gray64 rgb #9a9998
+.defcolor gray65 rgb #9e9c9b
+.defcolor gray66 rgb #a09f9d
+.defcolor gray67 rgb #a3a2a0
+.defcolor gray68 rgb #a5a4a3
+.defcolor gray69 rgb #a9a8a6
+.defcolor gray70 rgb #acaba9
+.defcolor gray71 rgb #aeadac
+.defcolor gray72 rgb #b1b1af
+.defcolor gray73 rgb #b3b3b1
+.defcolor gray74 rgb #b7b6b4
+.defcolor gray75 rgb #b9b8b6
+.defcolor gray76 rgb #bcbbba
+.defcolor gray77 rgb #bebebc
+.defcolor gray78 rgb #c1c1bf
+.defcolor gray79 rgb #c3c4c2
+.defcolor gray80 rgb #c7c7c5
+.defcolor gray81 rgb #cacac9
+.defcolor gray82 rgb #cccccb
+.defcolor gray83 rgb #d0cfcf
+.defcolor gray84 rgb #d2d2d1
+.defcolor gray85 rgb #d5d5d4
+.defcolor gray86 rgb #d7d7d7
+.defcolor gray87 rgb #dbdbd9
+.defcolor gray88 rgb #dddddc
+.defcolor gray89 rgb #e0e0e0
+.defcolor gray90 rgb #e2e3e1
+.defcolor gray91 rgb #e5e6e4
+.defcolor gray92 rgb #e8e9e8
+.defcolor gray93 rgb #ebebea
+.defcolor gray94 rgb #eeeeee
+.defcolor gray95 rgb #f0f1f0
+.defcolor gray96 rgb #f4f4f3
+.defcolor gray97 rgb #f6f6f5
+.defcolor gray98 rgb #f9f9fa
+.defcolor gray99 rgb #fbfbfb
+.defcolor green rgb #00ff00
+.defcolor green1 rgb #5ffb17
+.defcolor green2 rgb #59e817
+.defcolor green3 rgb #4cc417
+.defcolor green4 rgb #347c17
+.defcolor greenyellow rgb #b1fb17
+.defcolor honeydew rgb #f0feee
+.defcolor honeydew2 rgb #deebdc
+.defcolor honeydew3 rgb #bcc7b9
+.defcolor honeydew4 rgb #7a7d74
+.defcolor hotpink rgb #f660ab
+.defcolor hotpink1 rgb #f665ab
+.defcolor hotpink2 rgb #e45e9d
+.defcolor hotpink3 rgb #c25283
+.defcolor hotpink4 rgb #7d2252
+.defcolor indianred rgb #5e2217
+.defcolor indianred1 rgb #f75d59
+.defcolor indianred2 rgb #e55451
+.defcolor indianred3 rgb #c24641
+.defcolor indianred4 rgb #7e2217
+.defcolor ivory rgb #ffffee
+.defcolor ivory2 rgb #ececdc
+.defcolor ivory3 rgb #c9c7b9
+.defcolor ivory4 rgb #817d74
+.defcolor khaki rgb #ada96e
+.defcolor khaki1 rgb #fff380
+.defcolor khaki2 rgb #ede275
+.defcolor khaki3 rgb #c9be62
+.defcolor khaki4 rgb #827839
+.defcolor lavender rgb #e3e4fa
+.defcolor lavenderblush rgb #fdeef4
+.defcolor lavenderblush2 rgb #ebdde2
+.defcolor lavenderblush3 rgb #c8bbbe
+.defcolor lavenderblush4 rgb #817679
+.defcolor lawngreen rgb #87f717
+.defcolor lemonchiffon rgb #fff8c6
+.defcolor lemonchiffon2 rgb #ece5b6
+.defcolor lemonchiffon3 rgb #c9c299
+.defcolor lemonchiffon4 rgb #827b60
+.defcolor lightblue rgb #addfff
+.defcolor lightblue1 rgb #bdedff
+.defcolor lightblue2 rgb #afdcec
+.defcolor lightblue3 rgb #95b9c7
+.defcolor lightblue4 rgb #5e767e
+.defcolor lightcoral rgb #e77471
+.defcolor lightcyan rgb #e0ffff
+.defcolor lightcyan2 rgb #cfecec
+.defcolor lightcyan3 rgb #afc7c7
+.defcolor lightcyan4 rgb #717d7d
+.defcolor lightgoldenrod rgb #ecd872
+.defcolor lightgoldenrod1 rgb #ffe87c
+.defcolor lightgoldenrod2 rgb #ecd672
+.defcolor lightgoldenrod3 rgb #c8b560
+.defcolor lightgoldenrod4 rgb #817339
+.defcolor lightgoldenrodyellow rgb #faf8cc
+.defcolor lightpink rgb #faafba
+.defcolor lightpink1 rgb #f9a7b0
+.defcolor lightpink2 rgb #e799a3
+.defcolor lightpink3 rgb #c48189
+.defcolor lightpink4 rgb #7f4e52
+.defcolor lightsalmon rgb #f9966b
+.defcolor lightsalmon2 rgb #e78a61
+.defcolor lightsalmon3 rgb #c47451
+.defcolor lightsalmon4 rgb #7f462c
+.defcolor lightseagreen rgb #3ea99f
+.defcolor lightskyblue rgb #82cafa
+.defcolor lightskyblue2 rgb #a0cfec
+.defcolor lightskyblue3 rgb #87afc7
+.defcolor lightskyblue4 rgb #566d7e
+.defcolor lightslateblue rgb #736aff
+.defcolor lightslategray rgb #6d7b8d
+.defcolor lightsteelblue rgb #728fce
+.defcolor lightsteelblue1 rgb #c6deff
+.defcolor lightsteelblue2 rgb #b7ceec
+.defcolor lightsteelblue3 rgb #9aadc7
+.defcolor lightsteelblue4 rgb #646d7e
+.defcolor lightyellow rgb #fffedc
+.defcolor lightyellow2 rgb #edebcb
+.defcolor lightyellow3 rgb #c9c7aa
+.defcolor lightyellow4 rgb #827d6b
+.defcolor limegreen rgb #41a317
+.defcolor linen rgb #f9eee2
+.defcolor magenta rgb #ff00ff
+.defcolor magenta1 rgb #f43eff
+.defcolor magenta2 rgb #e238ec
+.defcolor magenta3 rgb #c031c7
+.defcolor maroon rgb #810541
+.defcolor maroon1 rgb #f535aa
+.defcolor maroon2 rgb #e3319d
+.defcolor maroon3 rgb #c12283
+.defcolor maroon4 rgb #7d0552
+.defcolor mediumaquamarine rgb #348781
+.defcolor mediumblue rgb #152dc6
+.defcolor mediumforestgreen rgb #347235
+.defcolor mediumgoldenrod rgb #ccb954
+.defcolor mediumorchid rgb #b048b5
+.defcolor mediumorchid1 rgb #d462ff
+.defcolor mediumorchid2 rgb #c45aec
+.defcolor mediumorchid3 rgb #a74ac7
+.defcolor mediumorchid4 rgb #6a287e
+.defcolor mediumpurple rgb #8467d7
+.defcolor mediumpurple1 rgb #9e7bff
+.defcolor mediumpurple2 rgb #9172ec
+.defcolor mediumpurple3 rgb #7a5dc7
+.defcolor mediumpurple4 rgb #4e387e
+.defcolor mediumseagreen rgb #306754
+.defcolor mediumslateblue rgb #5e5a80
+.defcolor mediumspringgreen rgb #348017
+.defcolor mediumturquoise rgb #48cccd
+.defcolor mediumvioletred rgb #ca226b
+.defcolor midnightblue rgb #151b54
+.defcolor mintcream rgb #f5fff9
+.defcolor mistyrose rgb #fde1dd
+.defcolor mistyrose2 rgb #ead0cc
+.defcolor mistyrose3 rgb #c6afac
+.defcolor mistyrose4 rgb #806f6c
+.defcolor moccasin rgb #fde0ac
+.defcolor navajowhite rgb #fddaa3
+.defcolor navajowhite2 rgb #eac995
+.defcolor navajowhite3 rgb #c7aa7d
+.defcolor navajowhite4 rgb #806a4b
+.defcolor navy rgb #150567
+.defcolor oldlace rgb #fcf3e2
+.defcolor olivedrab rgb #658017
+.defcolor olivedrab1 rgb #c3fb17
+.defcolor olivedrab2 rgb #b5e917
+.defcolor olivedrab3 rgb #99c517
+.defcolor olivedrab4 rgb #617c17
+.defcolor orange rgb #f87a17
+.defcolor orange1 rgb #fa9b17
+.defcolor orange2 rgb #e78e17
+.defcolor orange3 rgb #c57717
+.defcolor orange4 rgb #7f4817
+.defcolor orangered rgb #f63817
+.defcolor orangered2 rgb #e43117
+.defcolor orangered3 rgb #c22817
+.defcolor orangered4 rgb #7e0517
+.defcolor orchid rgb #e57ded
+.defcolor orchid1 rgb #f67dfa
+.defcolor orchid2 rgb #e473e7
+.defcolor orchid3 rgb #c160c3
+.defcolor orchid4 rgb #7d387c
+.defcolor palegoldenrod rgb #ede49e
+.defcolor palegreen rgb #79d867
+.defcolor palegreen1 rgb #a0fc8d
+.defcolor palegreen2 rgb #94e981
+.defcolor palegreen3 rgb #7dc56c
+.defcolor palegreen4 rgb #4e7c41
+.defcolor paleturquoise rgb #aeebec
+.defcolor paleturquoise1 rgb #bcfeff
+.defcolor paleturquoise2 rgb #adebec
+.defcolor paleturquoise3 rgb #92c7c7
+.defcolor paleturquoise4 rgb #5e7d7e
+.defcolor palevioletred rgb #d16587
+.defcolor palevioletred1 rgb #f778a1
+.defcolor palevioletred2 rgb #e56e94
+.defcolor palevioletred3 rgb #c25a7c
+.defcolor palevioletred4 rgb #7e354d
+.defcolor papayawhip rgb #feeccf
+.defcolor peachpuff rgb #fcd5b0
+.defcolor peachpuff2 rgb #eac5a3
+.defcolor peachpuff3 rgb #c6a688
+.defcolor peachpuff4 rgb #806752
+.defcolor peru rgb #c57726
+.defcolor pink rgb #faafbe
+.defcolor pink2 rgb #e7a1b0
+.defcolor pink3 rgb #c48793
+.defcolor pink4 rgb #7f525d
+.defcolor plum rgb #b93b8f
+.defcolor plum1 rgb #f9b7ff
+.defcolor plum2 rgb #e6a9ec
+.defcolor plum3 rgb #c38ec7
+.defcolor plum4 rgb #7e587e
+.defcolor powderblue rgb #addce3
+.defcolor purple rgb #8e35ef
+.defcolor purple1 rgb #893bff
+.defcolor purple2 rgb #7f38ec
+.defcolor purple3 rgb #6c2dc7
+.defcolor purple4 rgb #461b7e
+.defcolor red rgb #ff0000
+.defcolor red1 rgb #f62217
+.defcolor red2 rgb #e41b17
+.defcolor rosybrown rgb #b38481
+.defcolor rosybrown1 rgb #fbbbb9
+.defcolor rosybrown2 rgb #e8adaa
+.defcolor rosybrown3 rgb #c5908e
+.defcolor rosybrown4 rgb #7f5a58
+.defcolor royalblue rgb #2b60de
+.defcolor royalblue1 rgb #306eff
+.defcolor royalblue2 rgb #2b65ec
+.defcolor royalblue3 rgb #2554c7
+.defcolor royalblue4 rgb #15317e
+.defcolor salmon1 rgb #f88158
+.defcolor salmon2 rgb #e67451
+.defcolor salmon3 rgb #c36241
+.defcolor salmon4 rgb #7e3817
+.defcolor sandybrown rgb #ee9a4d
+.defcolor seagreen rgb #4e8975
+.defcolor seagreen1 rgb #6afb92
+.defcolor seagreen2 rgb #64e986
+.defcolor seagreen3 rgb #54c571
+.defcolor seagreen4 rgb #387c44
+.defcolor seashell rgb #fef3eb
+.defcolor seashell2 rgb #ebe2d9
+.defcolor seashell3 rgb #c8bfb6
+.defcolor seashell4 rgb #817873
+.defcolor sienna rgb #8a4117
+.defcolor sienna1 rgb #f87431
+.defcolor sienna2 rgb #e66c2c
+.defcolor sienna3 rgb #c35817
+.defcolor sienna4 rgb #7e3517
+.defcolor skyblue rgb #6698ff
+.defcolor skyblue1 rgb #82caff
+.defcolor skyblue2 rgb #79baec
+.defcolor skyblue3 rgb #659ec7
+.defcolor skyblue4 rgb #41627e
+.defcolor slateblue rgb #737ca1
+.defcolor slateblue1 rgb #7369ff
+.defcolor slateblue2 rgb #6960ec
+.defcolor slateblue3 rgb #574ec7
+.defcolor slateblue4 rgb #342d7e
+.defcolor slategray rgb #657383
+.defcolor slategray1 rgb #c2dfff
+.defcolor slategray2 rgb #b4cfec
+.defcolor slategray3 rgb #98afc7
+.defcolor slategray4 rgb #616d7e
+.defcolor snow rgb #fff9fa
+.defcolor snow2 rgb #ece7e6
+.defcolor snow3 rgb #c8c4c2
+.defcolor snow4 rgb #817c7b
+.defcolor springgreen rgb #4aa02c
+.defcolor springgreen1 rgb #5efb6e
+.defcolor springgreen2 rgb #57e964
+.defcolor springgreen3 rgb #4cc552
+.defcolor springgreen4 rgb #347c2c
+.defcolor steelblue rgb #4863a0
+.defcolor steelblue1 rgb #5cb3ff
+.defcolor steelblue2 rgb #56a5ec
+.defcolor steelblue3 rgb #488ac7
+.defcolor steelblue4 rgb #2b547e
+.defcolor tan rgb #d8af79
+.defcolor tan1 rgb #fa9b3c
+.defcolor tan2 rgb #e78e35
+.defcolor thistle rgb #d2b9d3
+.defcolor thistle1 rgb #fcdfff
+.defcolor thistle2 rgb #e9cfec
+.defcolor thistle3 rgb #c6aec7
+.defcolor thistle4 rgb #806d7e
+.defcolor tomato rgb #f75431
+.defcolor tomato2 rgb #e54c2c
+.defcolor tomato3 rgb #c23e17
+.defcolor turquoise rgb #43c6db
+.defcolor turquoise1 rgb #52f3ff
+.defcolor turquoise2 rgb #4ee2ec
+.defcolor turquoise3 rgb #43bfc7
+.defcolor turquoise4 rgb #30787e
+.defcolor violet rgb #8d38c9
+.defcolor violetred rgb #e9358a
+.defcolor violetred1 rgb #f6358a
+.defcolor violetred2 rgb #e4317f
+.defcolor violetred3 rgb #c12869
+.defcolor violetred4 rgb #7d0541
+.defcolor wheat rgb #f3daa9
+.defcolor wheat1 rgb #fee4b1
+.defcolor wheat2 rgb #ebd3a3
+.defcolor wheat3 rgb #c8b189
+.defcolor wheat4 rgb #816f54
+.defcolor yellow rgb #ffff00
+.defcolor yellow1 rgb #fffc17
+.defcolor yellowgreen rgb #52d017
+.
+.mso www.tmac
+.
+.ie '\[char97]'a' \
+. mso latin1.tmac
+.el \
+. mso cp1047.tmac
+.
+.cp \n[*groff_html_tmac_C]
+.do rr *groff_html_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/hyphen.cs b/tmac/hyphen.cs
new file mode 100644
index 0000000..c1a91d4
--- /dev/null
+++ b/tmac/hyphen.cs
@@ -0,0 +1,3672 @@
+% This is the groff hyphenation pattern file 'hyphen.cs' for Czech.
+%
+% It is based on the TeX pattern file 'czhyphen.tex', version 3 (1995),
+% prepared by Pavel ©eveèek <pavel@lingea.cz>.
+%
+% Here is the copyright message:
+%
+% This 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 file is distributed in the hope that it will be useful, but
+% WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+% General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+% 02110-1301 USA.
+%
+% Please check the original file for more details.
+%
+% It has been made suitable for groff by expanding all macros to real
+% characters in latin-2 encoding.
+%
+\patterns{
+.a2
+.a4da
+.a4de
+.a4di
+.a4do
+.a4dé
+.a4kl
+.a4ko
+.a4kr
+.a4ku
+.ale3x
+.a4ra
+.a4re
+.a4ri
+.a4ro
+.a4ry
+.a4rá
+.a4sa
+.a4se
+.a4so
+.as3t3
+.a4sy
+.a4ta
+.a4te
+.at3l
+.a4to
+.a4tr
+.a4ty
+.a4ve
+.b2
+.c2
+.ch2
+.cyk3
+.d2
+.dez3
+.d4na
+.dne4
+.dne¹4k
+.d4ny
+.dos4
+.d4ve
+.d4vì
+.d4ví
+.e2
+.e4ch
+.e4ko
+.es3k
+.es3t
+.e4ve
+.f4ri
+.g2
+.h2
+.h4le
+.h4ne
+.i2
+.i4na
+.i4ni
+.i4no
+.is3l
+.j2
+.j4ak
+.je4dl
+.j4se
+.j4zd
+.jád4
+.k2
+.k4li
+.k4ly
+.køí3d
+.l2
+.le4gr
+.li3kv
+.m2
+.mi3st4
+.moud3
+.na3è4
+.ne3c
+.neè4
+.ne3¹
+.ni2t
+.no4s3t
+.n4vp
+.ná1
+.náø4k
+.o2
+.o4bé
+.ode3
+.od3l
+.od3rá
+.o4ka
+.o4ko
+.o4na
+.o4ne
+.o4ni
+.o4no
+.o4nu
+.o4ny
+.o4nì
+.o4ní
+.o4pe
+.o4po
+.o4se
+.o4sl
+.os4to
+.os3t3r
+.os4tì
+.ot3rá
+.ot3v
+.o4tí
+.o4tø
+.ovì4t
+.o4za
+.oz3do
+.o4zi
+.o4zo
+.o4zu
+.o4¹k
+.o4¹l
+.o4¾i
+.p2
+.pa4re
+.pa3tø
+.polk4l
+.po3è4
+.p4ro
+.p4rý
+.p4se
+.pu3b
+.r2
+.rej4
+.re3s
+.ro4k
+.roze3
+.roz3r
+.ru4dl
+.s2
+.s4ch
+.s4ci
+.sem4
+.se3pn
+.s4ke
+.sk4l
+.s4ká
+.s4le
+.s4na
+.s4ny
+.s4pe
+.s4po
+.st2
+.s4tá
+.s4¾i
+.t2
+.u2
+.u4ba
+.u4be
+.u4bi
+.u4bo
+.u4de
+.u4di
+.u4do
+.u4du
+.u4dí
+.uh4n
+.uj4m
+.u4ko
+.u4ku
+.ul4h
+.u4ma
+.u4me
+.u4mi
+.u4mu
+.u4ne
+.u4ni
+.u4pa
+.u4pe
+.u4pi
+.up4n
+.u4po
+.u4pu
+.u4pá
+.u4pì
+.u4pí
+.u4ra
+.u4ro
+.u4rá
+.us2
+.u4so
+.u4st
+.u4sy
+.u4sí
+.ut2
+.u4vi
+.u4ze
+.u4èe
+.u4èi
+.u4èí
+.u4¹e
+.u4¹i
+.u4¹k
+.u¹4t
+.u4¹í
+.u4¾i
+.u¾4n
+.u4¾o
+.u4¾í
+.v2
+.va4dl
+.v4po
+.vy3
+.v4zá
+.vý1
+.v4¾i
+.y4or
+.y4ve
+.z2
+.za3
+.zao3s
+.zar2
+.zaè2
+.zd2
+.z4di
+.z4dr
+.z4ky
+.z4mn
+.z4no
+.z4nu
+.z4nì
+.z4ní
+.z4pe
+.z4po
+.z4tø
+.z4ve
+.z4vi
+.è2
+.è4te
+.é2
+.í2
+.ó2
+.¹2
+.¹e3t
+.¹4ka
+.¹4ke
+.¹4ky
+.¹4»o
+.¹4»á
+.ú2
+.ú4dù
+.¾2
+a1
+2a.
+aa3t2
+ab3lon
+ab4lý
+ab3ri
+ab4sb
+ab2st
+ac4ci
+a2d
+a3da
+a3de
+a3di
+ad2la
+a4dli
+a4dlá
+a4dlé
+ad4me
+ad4mu
+a3do
+ado4s
+a3d3ra
+ad3ri
+a3dr¾
+a3du
+a4du¾
+3a3dva
+ad3vo
+a3dy
+a3dá
+a3dé
+a3dì
+a3dí
+ad4úz
+ad4úø
+a3dù
+a3dý
+ae4vi
+afi2a
+a2g
+a3ga
+ag4fa
+a3go
+ag3ro
+a3gu
+a3gá
+ah4li
+ah3v
+a2i
+a3in
+ai4re
+a3iv
+a2jd
+a2jm
+aj4me
+aj2o
+a2k
+a3ke
+a3ki
+a3kl
+ak4ni
+a3ko
+a3kr
+a3ku
+a3ky
+a3ká
+a3ké
+a3kó
+a3kù
+a3ký
+al4fb
+al4kl
+al4tz
+al3¾í
+am4bd
+am4kl
+am4nu
+amo3s
+am4¾i
+a4nae
+a4name
+an4dt
+ane4sk
+aneu4
+an4sc
+an4sg
+an4sl
+an4sm
+an2sp
+an4sv
+an4tè
+an4¾h
+ao4ed
+ao4hm
+ao4stø
+ao4tè
+ap4r.
+a4pso
+ap3t
+a4pø.
+a2r
+a3ra
+ar4dw
+a3re
+a4rer
+ar4gl
+a3ri
+ar4kh
+a3ro
+a4rox
+ar3st
+a3ru
+ar2va
+a3ry
+a3rá
+a3ró
+ar3¹2
+ar4¹r
+a3rù
+arùs3
+a3rý
+a2s
+a3sa
+a3se
+a3sh
+a3sin
+as3ná
+a3so
+as3pi
+as4tat
+a4stk
+as4tm
+a4stru.
+as3tv
+a3su
+a3sv
+a3sy
+a3sá
+a3sé
+a3sí
+a3sù
+a2t
+a3ta
+at4ch
+a3te
+a3ti
+a4tio
+at4kl
+at3lo
+a3to
+a3tr
+at3re
+at3ron
+at3rov
+a4tru
+at4rá
+at4th
+a3tu
+a3tv
+a3ty
+a3tá
+a3té
+a3tì
+a3tí
+a3tó
+at1ø
+a4tøí.
+a3tù
+a3tý
+a2u
+au4gs
+a3uj
+auj4m
+aus3t
+a3uè
+2av
+av3d
+av4d.
+av3lo
+a4vlu
+a4vlí
+av3t
+av4ti
+2ay
+ay4on
+az3k
+az3la
+az4lé
+az3ni
+a3zp
+a2è
+a3èa
+a3èe
+a3èi
+a3èl
+aè4má
+a3èo
+a3èu
+a3èá
+a3èí
+a3èù
+a2ò
+a3òo
+a3òu
+aøe4k
+a3øí
+a4¹pl
+a4¹py
+a2»
+aú3t
+2b.
+3ba.
+ba4br
+ba4chr
+ba3ka
+ba4se
+2b1c
+b1d
+be4ef
+be4et
+bej4m
+be3p
+beu4r
+be2z3
+beze3
+b1h
+1bi
+bi2b3
+bis3
+bist4
+bi4tr
+b1j
+2bk
+3bl.
+bl4bl
+b2lem
+b2les
+3blk
+b4lán
+b2lém
+b1m
+2bn
+1bo
+bo4et
+bo4jm
+bo4ok
+bo4tr
+bou3s
+bo4¹k
+b2ral
+b2ran
+2bri
+b4rodit
+b4rou
+broz4
+b2ru
+b3ru.
+b3rub
+b2rán
+2b1s2
+bs3tr
+2b1t
+btáh4
+bu2c
+bu4en
+3by.
+bys3
+by4sm
+by4tè
+by4zn
+b2z
+1bá
+2b1è
+bé4rc
+1bì.
+bì3ta
+1bí
+3bín
+bí4rc
+2bò
+b3øa
+b3øe.
+bøe4s
+b1øí
+2b¹2
+2c.
+1ca
+cad4l
+ca4es
+2cc
+1ce
+cech4
+ced4l
+celo3
+ce4ns
+ce4ov
+ce4ps
+cer4v
+ce2u
+2ch.
+1cha
+4chalg
+3che
+4che.
+2chl
+ch4ly
+ch4mb
+2ch3n
+2cht
+4chte
+1chu
+ch4u.
+1chy
+1chá
+2chø
+1ci
+cien4c
+cik4l
+2ck2
+c4ket
+ckte4rý
+2cl
+c3la
+c3lé
+2cn
+1co
+co4at
+co4mm
+co4¾p
+c2p
+2ct
+c2ti
+ctis4
+ct4la
+ct2n
+c3tv
+c2tì
+cuk1
+1c2v
+cy2
+1cá
+1cí
+cí4pl
+2cò
+1cù
+2d.
+1da
+da3d
+da4j¹
+da4kl
+da4tr
+d1b
+d2ba
+4dbat.
+d2bá
+2d1c
+dch4l
+3dch4n
+d1d
+dd4ha
+1de
+de4bre
+de3hn
+de3jd
+dej4mo
+de3kl
+de3kv
+de2na
+de2oz
+de3sl
+de4sm
+de4so
+de2sp
+des4t
+de3str
+de1x
+de4xt
+de2z
+de3zn
+dez3o
+de3èt
+de4¾p
+2d1h
+1di
+di4gg
+4dind
+dis3k
+di4so
+d1j
+dj4us
+2dk
+d3kv
+3dl.
+d1la
+d4lab
+d4lak
+d3li
+1dln
+d2lou
+d3lou.
+d2lu
+d3luè
+d4lá¾
+d1lé
+2d1lí
+d2lù
+d1m
+1dmd
+dmý¹4
+2dn
+1do
+4dobl
+4doboj
+dob4rat
+do3by
+do3bì
+do3bý
+do1d
+4do4dd
+4do4dj
+dod4n
+do3h
+doj4m
+4dokn
+4doly
+do3mn
+domoh4
+do3p
+do4pc
+dop4n
+dor2v
+do1s
+dos4p
+dos4tiv
+do3t
+do3uk
+do3uè
+do3z2
+doz4n
+do3è
+4do4èn
+doè4t
+do4¾p
+4dran
+d4rap
+d1re
+d4ren
+3drobn
+d3ros
+d3rou
+d3ro¹
+dr4sc
+d3ru¹
+d3ré
+d3rý
+d4rýv
+2d1s2
+ds4kù
+ds4po
+d1t
+d3tl
+d3tø
+1du
+dum3ø
+du3na
+du3p
+du4pn
+2dur
+du3si
+du4í.
+d2v
+d4vac
+d3ve
+d3vl
+d3vr
+d3vy
+d3vá
+d3vì
+d3ví
+1dy
+dy4su
+d3zb
+d3zd
+d3zn
+1dá
+2d1è
+1dé
+1dì
+3dìj
+1dí
+2dò
+d1øa
+døe4k
+d4øep
+døe4pn
+d4øev
+d1øí
+d2øít
+2d¹2
+d3¹k
+d3¹t
+1dù
+3dù.
+dù3s
+1dý
+d2¾2
+2e.
+e1a
+ea3dr
+e2ar
+e1b
+eb4er
+ebez2
+eb4li
+e2bø
+e4ch.
+e3chl.
+e4chm
+e3cho
+e2chr
+e3chv
+e4ch»
+ed4be
+ed4kv
+ed1l
+ed2ma
+e3dmn
+ed3v
+ed4øí
+e1e
+ee4th
+ee3xi
+eg4gi
+e1ha
+e1he
+ehno4
+eh4nì
+e1ho
+e1hr
+e1hu
+e1hy
+e1há
+e1hý
+e1i
+eilus3
+ej3ag
+e3jas
+e1je
+e3jed
+ej3ele
+e3jez
+ej3in
+e3jis
+ej1m
+ej3mo
+e3jmu
+ej1o
+ej1u
+eju3st
+ej3v
+e2k
+e3ka
+e3ke
+e4kly
+e3ko
+e3kr
+e3ku
+e3ky
+e3ká
+e3ké
+e3kó
+e3kø
+e3kù
+e1la
+e4lau
+el4dv
+e1le
+e1lo
+e1lu
+e1ly
+el4ze
+e1lá
+e1lé
+e1lí
+e1ml
+e4mlí
+emo3k
+e1mr
+e1my
+e3má
+e1mì
+e1mí
+e3mø
+e3mù
+e1mý
+em3¾e
+en4dv
+enitos4
+en4sc
+en4si
+ent3r
+e1o
+eo3by
+eoch3r
+eod3l
+eo4du
+e4ole
+eo1s
+eo2st
+eo4tø
+eo3z
+eo4zb
+eo4zd
+eo¹e3
+epa3t
+e2pl
+e4pni
+ep2no
+e4pný
+epoè3t
+epro4zø
+ep4tl
+ep4tm
+ep4tn
+e4ptu
+epy3
+2er
+e1ra
+er4a.
+e1re
+e1ri
+e1ro
+er3s
+er4s.
+er4sn
+e1ru
+e1ry
+e1rá
+e1ré
+e1rù
+e1rý
+e1s
+e4sag
+e2sce
+e4sin
+esi4s
+e2sk
+es4k.
+e4s4kn
+es3ku.
+es3ky
+es3ké
+e2sl
+e4s3li
+e4sly
+es2m
+e4sp.
+es4pe
+e2st
+e4st.
+e4ste
+es3ti¾
+es4tol
+e4strou
+es3tán
+e1t
+e4tki
+e4tkr
+e4tli
+e4tly
+et3ri
+et3ro
+et3rù
+et1ø
+et4ún
+e1u
+eu3b
+eu3ct
+eu3d
+eu3k
+eu3m
+eu4m.
+eu3n
+eu3p
+eu3r
+eu4r.
+e4ura
+eu4ras
+eu4rg
+eu3s2
+eu3t
+e4u4t.
+eu4tra
+eu4ts
+eu3v
+eu3z
+eu3¾
+e3vd
+eve4¹
+e3v2k
+e4vsk
+evy3
+evyjad4
+evypá4t
+evy4èk
+evì4tr
+ex4ta
+e3xu
+ey4or
+ey4ov
+ezaos3
+ez4ap
+ez4bo
+ez3de
+ez3dov
+ez3du
+ez4dì
+e3ze
+ez4ed2
+ez4ej
+ez4el
+ez4er
+ez4es
+ez4ez
+ez4e¹
+ezis4
+ez4it
+ez4le
+ez4ná
+ez4nì
+ez4py
+ez2t
+ez4ác
+ez4áh
+ez4èe
+e3zí
+e3zø
+ez4øe
+e1á
+eè4kat
+e1èt
+eè4te
+e4èti
+e4ètí
+e2ò
+e3òo
+e3òu
+e3òá
+e3ón
+e1ø
+eøe4k
+eø4ku
+e3øí
+e2¹
+e3¹e
+e3¹i
+e4¹ka
+e3¹l
+e¹4lá
+e3¹o
+e¹4to
+e¹tíh4
+e3¹í
+eú1
+eúmy4
+eú3n
+eú3p
+eú3t
+eú3è
+e¾í¹4
+1f
+2f.
+fe4in
+fene4
+fe4ue
+fi4em
+fi4fl
+f2l
+f3lí
+fló4r
+fm4no
+2fn
+2fr
+f4ran
+f4ras
+3frek
+f1ri
+2fs
+fs4te
+2ft
+fu4ch
+2fé
+f2ú
+1g
+2g.
+ga4uè
+ge2s
+ghou4
+3gic
+3gin
+gi4ím
+g4lom
+2g1m
+2gn
+g4noi
+g4nos
+go1
+go4hm
+3graf
+gu4el
+gu4it
+gu3m
+gu4m.
+gus4t
+gu3v
+2h.
+ha4ag
+ha4ar
+ha4bl
+ha4br
+ha3dl
+ha4dla
+ha4ke
+has3t
+hatos4
+ha4yd
+h2b
+h2c
+2hd
+he4br
+he4id
+hej4s
+he2s
+he2u
+he3x
+hi4an
+hi3er
+hi4gh
+hi4re
+2hk
+4hla.
+h4led
+h3len
+2hli
+4h3lo.
+h3lob
+h3lop
+h3lov
+h3luj
+2h1ly
+4hlá.
+h4lás
+h3lí.
+4hlík
+2hlý
+h2m
+2h2n
+h3ne
+h4ned
+h3niv
+h4noj
+3hnìd
+3hodin
+ho3str
+hos4tì
+4hove
+4hovna
+4hovny
+4hovná
+4hovnì
+h2r
+hra4p
+2h1t
+h4tin
+h2tì
+h4tít
+hu4ch
+hu3mo
+hu4tò
+2h2v
+hyd1
+hy4do
+hy4ps
+hys3
+hy2t3r
+hy4zd
+h1è
+2hò
+hø2
+hø4by
+hý4bl
+h2¾
+2i.
+i1a
+ia3d
+ia3g2
+i4al.
+ias4t
+ia4tr
+i1b
+ib2l
+i2b1r
+i1ch
+i4ch¾
+i1d
+id4ge
+id2l
+id4lo.
+i4dlý
+i1em
+i1en
+i1et
+if1r
+ig4ne
+i1h
+i2hl
+i3hl.
+i4hli
+ih3n
+ih4na
+i3im
+i1j
+ijed4
+ij4me
+ij4mi
+i2kl
+ik3le
+ik3lo.
+ik3m
+ik4ry
+i4kve
+ik4úø
+i1l
+il4ba
+iliè4n
+i4lnu
+ilu3
+i1m
+i4mla
+i4mly
+i4mun
+i2n
+i3na
+ina3d
+in4cm
+in4dl
+i3ne
+3infe
+in4gh
+in4gp
+in4gs
+in4gt
+i3ni
+i3no
+i3nu
+i3ny
+i3ná
+i3né
+i3nì
+i3ní
+in4¹p
+i3nù
+i3ný
+i1o
+io4sk
+i2ps
+i1r
+iro4s
+i1sa
+is3c
+is4ch
+is4k.
+is3ka
+is3ke
+is3ko.
+is3kr
+is3ku
+is3kv
+is3ky
+i3slav
+is3lo
+is3lé
+is3pl
+is3po
+is1t
+is4tal
+is4tat
+is4th
+ist3v
+is3tí
+i1sy
+i3sá
+i1t
+it1r
+it4rh
+it4rp
+it4se
+it4su
+i2tv
+i1um
+iv3d
+i1x
+ix4td
+i3zp
+iz1r
+i1á
+i1èl
+iè3t
+iè4tl
+iè4to
+i2ï
+i1é
+ié4re.
+i1íc
+i1ím
+i1ó
+i1ø
+iø4kl
+iø4èe
+i2¹
+i3¹e
+i3¹i
+i¹3k
+i¹4kr
+i¹4kv
+i3¹o
+i¹4to
+i3¹u
+i3¹á
+i3¹í
+i2¾
+i3¾a
+i3¾e
+i3¾i
+i3¾o
+i3¾u
+i3¾á
+2j.
+ja2b2
+jac4k
+ja4cq
+ja3d
+ja3g
+j3akt
+j1b2
+jbyst3
+2j1c
+j2d
+j3dob
+j3dok
+j3dos
+j3dr
+j3dá
+jd4øí
+j3dù
+jech4
+j3ef
+j3ex
+jez3dí
+jg4ra
+2j1h
+1ji
+ji4ch
+jih3l
+ji4m¾
+j4ina
+jis3k
+jit4ro
+ji2zv
+j1j
+2jk
+j3kv
+2j1l
+j2m
+j3ma
+j3mi
+jmou3d
+2jmí
+2jn
+jne3
+j1ob
+j1od
+jod2ø
+j1oh
+j1op
+j4ora
+j1os
+jo3sv
+j2ov
+j3ovl
+j1o3z2
+2jp
+jpor4
+jpo4zv
+jpøíz4
+2j1r
+2j1s2
+j4sem
+j4si.
+j4sk.
+js4ko
+js4ká
+j4s4kù
+j4s4me
+j3sn
+j4sou.
+j4souc
+js4po
+j4s4te
+2j1t
+j3tl
+ju4an
+ju3na
+ju3p
+j1us
+ju3sp
+ju3t
+ju4t.
+ju3v
+ju4xt
+ju3z
+j1u¾
+ju3¾i
+2jv2
+j3vd
+j3vn
+2jz
+j3zb
+j3zd
+j3zk
+j3zn
+j3zp
+jád2r
+2j1è
+2jï
+1jí
+j3¹t
+j¹4ti
+j3¹»
+2jú1
+jú3n
+jú3è
+jú3¾
+2j¾
+1k
+2k.
+ka4bl
+ka4ch
+ka3dl
+3kaj
+ka3ka
+3kami
+3kanì
+ka2p3l
+ka2p3r
+ka2ps
+ka4pv
+ka2pø
+kas3t
+kast3r
+3kat
+ka4uè
+3kav
+3kaè
+3kaø
+ka¹3l
+ka4¹p
+2k1c
+k2d
+k2e
+ke4bl
+ke3jo
+ke4pr
+ke4ps
+3ket
+2kf
+2kk
+k2l
+3kl.
+4k3la.
+k3lej
+4k3li.
+k4lib
+k3lic
+4klièka
+4klo.
+k3los
+2k3ly
+k3lá.
+k3lé
+k3ló
+k3lý
+2k2m
+k3mì
+2kn
+kna4s
+ko3by
+3kof
+ko4jm
+ko2pø
+ko4sk
+ko2t3v
+kous3k
+3kov
+ko3zá
+4kroa
+k3rob
+k3rof
+kr2s
+kr4ú.
+2ks
+2k1t
+kt2r
+kuch4
+ku4fø
+ku4hr
+3kuj
+ku3se
+ku3si
+ku3su
+ku4th
+ku3v
+2k2v
+k4vrò
+3kyn
+ky2pr
+kyp3ø
+ky4zn
+3kác
+ká4pl
+3kár
+3káø
+2kè
+k2ò
+k2ø2
+k3øej
+k¹4ti
+3kù.
+2l.
+1la.
+la4br
+lab4s
+la3ka
+la4nq
+la4ps
+4la3si
+la4v¹
+la4y.
+la2zm
+2l1b
+2l1c
+2l1d
+ld4ne
+le4ad
+le4au
+lech3t
+leh3n
+le2i
+1lej
+le3jo
+4lej¹k
+1lel
+4lench
+lepa3d
+lepo4s
+le4pr
+le4ps
+le4sc
+le4sm
+le4sv
+let4li
+let3m
+le2tr
+le4tè
+le4uk
+le4vh
+le4vk
+le3xi
+lez3n
+2lf
+2lg
+2lh
+3lhan
+1li
+li4az
+li4bl
+li4bv
+li4dm
+lind4
+3lio
+li4tò
+li4vr
+2li¾
+2lj
+2lk
+l4kat
+l2kl
+lk4nu
+2ll
+2l1m
+2ln
+l4nul
+lo3br
+lo4id
+lo4is
+1los
+lo3sp
+lo3stø
+lo3sv
+lo2tr
+lo4tø
+lo4u.
+lo3z
+loz4d
+lo4¹k
+2lp
+l2pì
+2l1s2
+l4sla
+ls3n
+lst4n
+l4stí
+2l1t
+lt4ra
+lt4ru
+lt4ry
+lu4id
+lu4j.
+lu4k.
+lu4lk
+lu4m.
+lu4mn
+lu3pr
+lu3va
+lu3vl
+lu3vy
+lu3ví
+2lv
+2lz
+1lá.
+lá4j¹
+lá4v¹
+2l1è
+1lé.
+1lík
+lí4pl
+lí4zn
+1líø
+2lò
+2l¹2
+l3¹t
+l4¹tý
+1lù
+1lý
+lý2t
+2l2¾
+2m.
+1ma
+maj4s
+ma4kl
+ma4kr
+4mald
+mas3k
+mat3r
+ma4tra
+ma4v¹
+maz3l
+2m1b
+2m1c
+2m1d2
+m2dl
+1me
+3me.
+me4go
+me4is
+met3re
+me3x
+mezi3s
+2mf
+mh4le
+1mi
+mid3l
+mik3r
+mi4xt
+2mk2
+3m2kl
+mk4la
+mk4li
+m2l
+4mla.
+2mle
+ml3h
+ml4h.
+2mli
+ml4sc
+ml4sk
+4mlu.
+2mn
+m3na
+mna4s
+m4noh
+m3nos
+m4noz
+3mno¾
+m3ná
+m3né
+m4néz
+m3nìj
+m3ný
+1mo
+mod3r
+mo2hl
+mo2k
+mo2s
+mo4s.
+mot3ø
+4mout
+moza4
+mo3zø
+moú3
+2mp
+m4plo
+mpo4s
+m2ps
+mp4se
+mp2t
+mr2s
+2m1s2
+m4stl
+2m1t
+1mu
+mu4fl
+mu3n
+mu4n.
+mu4nd
+mu4nn
+mu4ns
+mu4n¹
+2mu¹
+2mv
+mys3lo
+my4¹k
+2mz
+3má.
+málo3
+má2s
+2mè
+m2èe
+mí1c
+mí4rò
+2m2¹
+m¹4èi
+m¹3»
+m¹4»an.
+3mù.
+3mý.
+m2¾
+1n
+2n.
+3na.
+na3ch
+na4do
+na4em
+na3h
+na4h.
+na3jd
+na3ka
+nam4ne
+na3p2
+na3s2
+na4s.
+nat2
+na3tl
+na3tø
+na3z
+naz4k
+na4z¹
+na4è.
+na3¹
+na¾4n
+2nb
+2n1c
+n4chc
+2n1d
+nd4hi
+ndo4t
+nd2re
+nd4ri
+nd4øí
+ne1d
+ne4gl
+ne1h
+ne3h4n
+ne2j
+nej3t
+nej3u
+ne3kl
+ne4kro
+ne3kv
+ne4m.
+ne3p
+ne3s2
+ne4s.
+nes4le
+ne4ss
+4nesti
+ne3tl
+net4r
+ne3ud
+ne3v2
+ne4v.
+ne3z
+nez4n
+ne3¹k
+ne3¹»
+2nf
+n3fr
+2ng
+ng1l
+ng4la
+ng4le
+ng4lí
+n4gro
+ng4vi
+nik4t
+ni4mr
+ni4m¾
+3nio
+3nisk
+2nitø
+n1j
+2nk
+2n1l
+2nn
+no3b2
+no4bs
+no3hn
+no4hs
+no4ir
+no4m¾
+no4sky
+no3sm
+no3str
+not4r
+no3z
+no4zd
+no4¹k
+2no¾
+2n1s2
+n2sa
+ns3ak
+ns4ko
+n4soc
+ns3po
+nst4ra
+2n1t
+nte4r3a
+nt4lem
+nt4r.
+nt3ru
+nt3rá
+2nub
+nu4gg
+3ny.
+2nz
+3nák
+ná3s2
+ná4s.
+2n1è
+2nï
+2nív
+2ní¾
+2nó
+2n¹2
+n3¹t
+n¹4»o
+nù2
+2n¾
+2o.
+o1a
+oang4
+o1ba
+o1be
+obe3j
+obe3s
+obe3z
+ob1l
+ob1r
+ob4rò
+o1bu
+obys4
+ob3z
+o3bé
+ob3øez
+o1c
+o4chl
+o2chr
+oc4ke
+oc4ko
+o4ct.
+oct3n
+ocy3
+oc4ún
+od3b
+odej4m
+ode3p
+ode3s
+od1l
+o4doc
+odos4
+odo4tk
+od3ra
+od4ran
+od3rù
+o3dr¾
+od3v
+od1ø
+o1e2
+oe3g
+oe3ti
+o2fl
+ofrek4
+og2
+o3gn
+o1h
+oh4ne
+o1i
+oi4ce
+o4int
+o1j
+o4jar
+oje4dl
+o4jmi
+o4jmov
+o4jmu
+o4jmù
+oj2o
+o4juz
+2oka
+ok2te
+o1l
+ol4gl
+ol4to
+o1m
+om4kl
+om2n
+o2n
+o3na
+ona4s
+o3ne
+o3ni
+o3no
+ont4ra
+o3nu
+o3ny
+o3ná
+onáø4ka
+o3nì
+o3ní
+o3nù
+o3ný
+o1o
+oo4hø
+oote2
+opoè3t
+opro4s
+o2ps
+o4ptu
+opá4t
+o4pø.
+opøej4
+opøe4jm
+o1ra
+o4rae
+or4dm
+o1re
+o1ri
+o1ro
+or3st
+o1ru
+or4vá
+o1ry
+o1rá
+o3ré
+o1rù
+orùs3
+o3rý
+o1sa
+o4sai
+ose4s
+osi4d
+o1sk
+o4s3ke
+o4sku
+osk3v
+o4ská
+o4ský
+o1sl
+os4la
+os4li
+os4lý
+os3mo
+os4mu
+o4st.
+o4stg
+o4stm
+os4tor
+os3trù
+o4sté
+o4st¹
+o4stý
+o1sy
+o1t
+ot4kl
+o4tlý
+oto3s
+ot3ro
+ot3ví
+o3tí
+o3tø
+ot3øi
+o2u
+ou3bì
+ou3dì
+ou4fl
+ou4il
+ou4is
+ou4k.
+ou3ka
+o4ukl
+ou3kr
+ou3ká
+ou3m
+oup3n
+oupo4
+ou4s.
+ou3sa
+ou3se
+ou4sk
+ou3sm
+ou4tv
+ou3v
+ou4vl
+ou4vn
+ouz3d
+o4uèk
+ou3¾i
+ovi4dla
+o4vsk
+ovy2p
+o2v¹t
+o1x
+o2z
+o3za
+oz1b
+oz4d.
+oz3dá
+oz3dì
+oz3dí
+o3ze
+oze3d2
+ozer4
+oz1h
+o3zi
+oz3j
+oz3k
+oz4ko
+oz1l
+oz3m
+o4zn.
+o3zo
+oz3p
+oz4py
+oz4pì
+oz4pí
+oz3ro
+oz3ru
+oz3rù
+oz3t
+o3zu
+o4zut
+oz3vr
+oz3vá
+o3zí
+o3zù
+ozù4s
+o1è
+oè2k
+oè4ka
+o2ò
+o3òa
+o3òo
+o1ø
+oøi2s
+o3¹k
+o4¹ku
+o4¹ky
+o3¹l
+o¹4lá
+o¹4mo
+o¹4ti
+o¹4»u
+o3¾l
+o¾4mo
+1p
+2p.
+pa4ed
+pa4es
+pa4kl
+pa3si
+pa4t.
+pat4ri
+2p1c
+pe4al
+pede4
+pe4ig
+pe4np
+peri3
+pes3t3
+pe4tra
+3peè
+pi4kr
+pi4pl
+2pk
+p2kl
+p2l
+3pl.
+4p3la.
+pl3h
+pl4h.
+4p3li.
+4plo.
+2pn
+p2nu
+po1b2
+po3c2
+3pod
+podbì4h
+pod4nes
+po3dru
+po3drá
+po3h
+poly3
+po3m2
+po4mp
+po4ol
+po3p
+po4p.
+po4pm
+po1s2
+pos4p
+post4r
+po3t2
+po4t.
+po4tn
+po3uk
+po3uè
+po3u¾
+3po3v
+po3z2
+po4zd
+poè2
+po3èk
+poè3te
+po3øí
+po4¹v
+2pp
+4pra.
+pra3st
+pr2c
+pro1
+prob2
+pro3p
+pro3t4
+pro3z
+pr2s
+4prán
+prù3
+pse4s
+2p1sk
+p4sut
+2pt
+p4tej
+p4ter
+p4tev
+pt4ri
+p3tu
+p4tá.
+pu4dl
+pu4tr
+pyt3l
+pá1
+pá2c
+pád3l
+pá4nv
+pá4sl
+2pè
+pé4rh
+2pø.
+pøe3h
+pøe3j
+pøe3t4
+pøe3z
+pøe3è2
+pøi3
+pøih4
+2p¹
+p¹4ti
+2p»
+qu2
+2r.
+1ra.
+ra4br
+ra4em
+ra4es
+ra4ff
+ra4hl
+ra4hm
+ra4jg
+ra4j¹
+2rak
+ra4nh
+ra3si
+rast4r
+ra4vv
+ra4wl
+ra4y.
+ra4yo
+ra4ïm
+4ra¾i
+r1b
+r2bl
+r1c
+rca3
+r3cha
+r3cho
+rc4ki
+r1d
+r4dla
+rdo2s
+re4ad
+re4au
+red4r
+re4et
+re3kl
+re3kvi
+re4mr
+re2sb
+res3l
+retis4
+ret4r
+re4um
+r1ha
+r3hl.
+rh3n
+r1ho
+r3hu
+r1há
+ri4bb
+1ric
+ric4ku
+ri4dg
+ri4dr
+ri4fl
+ri4gh
+ri4zm
+2rk
+r2kl
+r1l
+2r1m
+r4mio
+2rn
+rna4v¹
+rn4dr
+ro4ad
+ro3by
+rod2l
+ro3d4r
+3rofy
+ro3h
+ro4h.
+ro4jb
+ro4k¹
+rom3n
+romy4s
+ropát4
+ro2sb
+ro4skv
+ro4sky
+ro3sv
+ro3ti
+ro3tl
+ro4tè
+ro3vd
+rovì4t
+3rový
+roz3d
+roz3n
+ro4zo
+roz3v
+ro3zá
+ro4èp
+rpa3d
+2rr
+rr4ha
+rr4ho
+2r1s
+r2st
+r4stu
+rs3tvì
+rs3tvý
+2r1t
+r2th
+r4trá
+rt4sm
+rtu3
+r2t3v
+rt4zu
+1ru.
+ru3se
+ru3si
+rus3k
+ru3¾i
+3rvaní
+r1x
+1ry.
+rych3
+ryd2
+rys3ky
+rys3t
+ry4zk
+ry4zn
+ry4í.
+ry4¹k
+2rz
+rz3d
+rz3l
+rád4l
+rá4d¾
+1rák
+rá3ri
+1ráø
+r1è
+4rèitý.
+rè3t
+3ré.
+2ró
+2r¹
+r¹4ní
+rù4m.
+rùs3ta
+rù4v.
+3rý.
+rý4zn
+2s.
+sa4pf
+sa4pr
+sas3k
+s2b2
+s2c
+s3ca
+s3ce.
+sch2
+sch4l
+sch4n
+3schop
+s3ci
+sci4e
+s3cí
+s2d
+1se
+se4au
+se3h
+se4ig
+se4il
+sej4m
+se4ku
+3sel
+se3lh
+3sem
+ser4va
+se3s2
+ses4k
+se4ss
+se4stra
+se4stru
+se4stø
+set2
+se3tk
+se3tø
+se4ur
+se3z
+se3èt
+2sf
+s3fo
+3sfé
+s3fú
+1si
+3sic
+3sif
+si4fl
+sig4no
+3sik
+si3ste
+3sit
+s2j
+s3ju
+s2k
+4skac
+s4kak
+4skam
+s4kok
+2skon
+skos4
+4skot
+sk4ra
+sk4ru
+sk4ry
+4skve
+sk4vo
+s3kán
+s3kù
+3sl.
+4s3la.
+s4lav
+s3le.
+s4led
+s3lem
+s3len
+s3let
+s4lib
+s4lièi
+3sln
+4s3lo.
+s2ly
+s3ly.
+s1lí
+s2ma
+s4mek
+s2mo
+2sn
+s2na
+s3nat
+s2ne
+s3ne.
+sn4tl
+s2ná
+s3ná.
+s4níd
+1so
+sob4l
+so3br
+so4sk
+so4tv
+sou3h
+sou3s
+souz4
+so4¹k
+s2p
+s4pol
+spro4s
+1sr
+2ss
+ss4sr
+2st.
+4sta.
+s3taj
+s2tan
+st4at
+4stec
+s4tep
+st4er
+s4tero
+s4tich
+2stil
+s4tink
+4stit.
+4stiè
+st3lo
+2stn
+4sto.
+s4tona
+4stou.
+4str.
+4stram
+s4trik
+4strn
+4strác
+4stupni
+s2tv
+st4ve
+3ství
+4sty.
+s4tyl
+3sty¹
+s2tá
+4stá.
+s3táø
+4stì.
+s4tìd
+3stìh
+s2tìr
+s2tì¾
+s1tí
+2stí.
+s3tøej
+1su
+su4ba
+su4bo
+suma4
+su3ve
+s2v
+sy3c
+sych3r
+sy4nes
+sá2d
+3sáh
+sá2kl
+2s2è
+s3èi
+1sé
+1sí
+2sò
+2s»
+s3»o
+1sù
+s2¾
+2t.
+1ta.
+ta2bl
+tac4tvo
+t2a3d
+1taj
+ta4jf
+ta4jg
+4talt
+4tand
+3tanì
+t1ao
+2tark
+tast4
+ta3str
+ta4èk
+2t1b
+2t1c
+1te
+3te.
+te4ak
+te4fl
+te4in
+4teném
+teob4
+tep3l
+ters4
+tes3ta
+te4tr
+te4uc
+te4ur
+te4ut
+2tf
+2tg
+1ti
+ti4gr
+2tih
+ti3kl
+tin4g
+ti4pl
+ti3sl
+tis4tr
+ti4tr
+2titu
+tiz4r
+4tizí
+tiú3
+2ti¾
+2tk2
+t4kal
+4t2kan
+t4kat
+t2kl
+tk4la
+tk4li
+4tknì
+t2ká
+2tl
+3tl.
+4tla.
+t1le
+tles3
+3tlm
+t3lo.
+t4lou
+tlu3
+tlu4s
+t1ly
+t1lé
+2tm
+t2ma
+2tn
+t3ní
+1to
+to4as
+to3b
+tob4l
+to3dr
+to4hm
+to4ir
+2toj
+tol4s
+to4ol
+4top.
+4topt
+4topu
+2torn
+2toup
+2tp
+t3rant
+t4rea
+t4ref
+tre4t
+4tric.
+trip4
+t4rit
+t4rog
+t3rol
+tro4sk
+t4rou
+4trouh
+4troò.
+4trun
+t4rus
+4t4ru¾
+t3ráln
+4trá¹
+2trè
+t3rùm
+t3rùv
+2trý
+2t1s
+ts4ko
+ts2t
+2t1t
+tt4ch
+tt4ri
+1tu.
+tu4ff
+1tuj
+tu4lk
+2tup
+tu4r.
+tu3ry
+tu4s.
+tu4».
+tu3¾i
+t2v
+2tve
+2t3vi
+t4vinn
+t4vi¹
+t4výc
+1ty.
+ty4gø
+ty2la
+ty4øe
+ty4øh
+ty4øj
+ty4øo
+ty4ør
+ty4øú
+3tá.
+tá4fl
+t2è
+t3èi
+2tèí
+1té
+té2bl
+3tém
+1tì
+tì3d4l
+2tìh
+2tìnn
+2tìp
+1tíc
+4tíc.
+4tíce
+1tím
+2tín
+2tír
+2tø
+t4øeb
+tøeh3n
+t2øel
+t2øic
+t3øil
+tø4ti
+t1øu
+t2øá
+3tøáb
+tøí4s
+2t¹
+t3¹t
+t¹4ti
+1tù
+1tý.
+1tým
+1týø
+3tý¹
+u1
+2u.
+u2at
+u2b
+u3ba
+u3be
+u3bi
+u3bo
+ubs4t
+u3bu
+u3bá
+u3bí.
+u3bù
+uc4tí
+2u2d
+u3de
+u3di
+u3do
+u3dru
+u3du
+u3dy
+u3dí
+ue4fa
+2uf
+u2hl
+uh3lá
+uh3no
+u2in
+u2jm
+u2k
+u3ka.
+uk4aj
+uk4al
+uk4at
+u3ke
+uk3la
+uk3le
+u3ko
+u3ku
+u3ky
+uk4á.
+u3kù
+ul4fa
+ul1h
+ul4pí
+u2m
+u3ma
+u3me
+u3mi
+um4pl
+um4ru
+u3mu
+u3má
+3umø
+u2n
+un4dl
+u3ne
+u3no
+u3nu
+u3nì
+u3ní
+u3nù
+un4¾r
+u2p
+u3pa
+u3pe
+upe2r3
+u3pi
+u3pln
+u3pu
+u3py
+u3pá
+u3pì
+u3pí
+u3pù
+u2r
+u3ra
+u3re
+u3ri
+2u3ro
+u3ru
+u3ry.
+u3rá
+1urè
+u3rù
+u2s
+us3ky
+us3ká
+us3ké
+us3ký
+us1l
+us2lo
+u3so
+u4ste
+u4sty
+u4sté
+u4stì
+u3stø
+u4st¹
+u4stý
+u3su.
+u3sy
+u3sá
+u3sí
+u3sù
+u4tro
+u4trá
+u2v
+u3vi
+u3vu
+u2z
+u3ze
+u3zi
+uz1l
+u3zo
+u3zu
+u3zí
+u2è
+u3èa
+u3èe
+u3èi
+u3èo
+uè3t
+u3èu
+u3èá
+u3èí
+u2ï
+u2ò
+u2¹
+u3¹e
+u3¹i
+u¹4kl
+u3¹o
+u¹3tí
+u3¹u
+u3¹á
+u3¹í
+u2¾
+u3¾e
+u3¾o
+u3¾u
+u3¾á
+u3¾í
+1v
+2v.
+va3dl
+va4j»
+va4kl
+2v1b
+2v1c
+v2ch
+2v2d
+v4dal
+v3di
+v4dìk
+v4dìè
+ve3dle
+ve3jd
+3ven
+ve2p
+ve3ps
+vep3ø
+ves3l
+ve4sm
+ves4p
+ve3sta
+ve3t4ø
+ve2z3m
+vi4ch
+vide2
+vi4dr
+vi4et
+vi4kr
+vi2tr
+2vk
+v2kr
+v2l
+2v3la.
+4vle.
+4vlem
+2vlo
+2vm
+2vn
+v4nad
+vo3b
+vo4ic
+vo4ja
+vo4jb
+vo4jd
+vo4jj
+vo4jm
+vo4jø
+vo2s
+vo4tø
+vou3
+vous2
+v2p
+vr2c
+vr2dl
+4vrny
+v1ro
+vr4st
+vrst3v
+vrs4tvì
+2vs2
+v1sk
+v3stv
+2v2t
+vy3c
+vy3d2
+vy4dra
+vyp2
+vy3s2
+vy4sn
+vys4t
+vy3t
+vy3è
+vyè4k
+vy¹2
+vy4¹.
+vy4¹m
+vy4¹¹
+vy4¾l
+v2z2
+vz4no
+vz4né
+vz4nì
+vz4ní
+vá3ri
+2v2è
+v3èá
+v3èí
+v4èír
+vì4cm
+vì3t4a
+více3
+ví4hat
+3vín
+2vò
+2vøí
+v3øín
+v2¹2
+v¹e3s
+v3¹tí.
+3výs
+vý3t
+3vý3z
+v2¾2
+wa4fd
+3war
+wa4re
+we2
+2x.
+xand4
+2xf
+xisk4
+2xn
+3xov
+x1t
+xt4ra
+xy4sm
+y1
+y2a
+y2bl
+yb3ri
+y2ch
+y4chr
+y2d1l
+yd4lá
+y2dr
+yd4y.
+y2e
+y2gr
+y3hn
+yh4ne
+yj4ma
+yj4me
+y2kl
+yk3la
+y3klop
+yk4ly
+ymané4
+ym4kl
+yna4s
+y3ni
+ype4r
+yp4si
+yp4tá
+y2pø
+yr2v
+y2s
+y3sa
+y3se
+y3si
+ys3lu
+y3sm
+y3so
+y3sp
+ys2t
+ys3te
+yst4r
+y3su
+y3sv
+y3sy
+y3sá
+y3sé
+y3sí
+yt4me
+yu3¾
+y3vs
+yvì4t
+y3zb
+y3zd
+y3zk
+y3zn
+yz4nì
+yz4ní
+y3zp
+yz4po
+yè2k
+y2ò
+yø3b
+yøk4n
+yø4èe
+y3øí
+y2¹
+y3¹e
+y3¹i
+y3¹k
+y¹1l
+y3¹o
+y3¹p
+y3¹u
+y3¹í
+y¾2
+y3¾d
+1z
+2z.
+zab2l
+za4bs
+za4dk
+za3dl
+za4dn
+za3h
+za3i
+za3j
+za4jk
+za3k
+za4kt
+zal4k
+zam4n
+za3p2
+za3s2
+zat2
+za3tl
+zat4r
+za4ut
+za3z
+zaz4n
+za4z¹
+za4è.
+za3¹
+za¹4k
+za4¹s
+2zb
+zban4
+z2by
+zbys4
+2z1c
+2z2d
+z3di
+zdnì4ní
+z4doba
+z4dobný
+zd4re
+zd4ví
+z2e
+ze3h
+ze3p2
+4zerot
+ze3s2
+zes4p
+zet2
+zev2
+ze3vn
+ze3z
+ze4z.
+2z2f
+z1há
+z4ine
+z2j
+z3jí
+2z2k
+z3ka.
+z3ky
+z3ké
+z3kù
+z3ký
+2zl
+3zl.
+zlhos4
+zlik3
+z3ly.
+z2m2
+2zme
+z3mn
+z3my
+z4mìn
+2z2n
+3znak
+z4nal
+z3ne.
+z3nic
+z3no
+z3nu
+z3ny
+z3né
+z3nì
+z4nìl
+z3ní
+z4nít
+z4nív
+z3ný
+zo4tr
+zo4¹k
+2z2p
+z3pt
+z4pát
+3zrak
+2z1s2
+2zt
+ztros3
+z4trá
+z3tø
+3zu.
+zu3mo
+zu3mì
+zu3mí
+zu3¹
+z2v
+zva4d
+z3vaø
+z3vi
+zvik4
+zv4nì
+z3vod
+z3voj
+z4von
+zv4ro
+z4ván
+z4vìs
+z3víj
+3zy.
+2zz
+zá1
+záh2
+zá4kl.
+3záp
+zá3s2
+zá3z
+zá¹2
+2zè
+z3èl
+2zò
+z2ø
+zøej3
+z3øez
+z3øe¹
+2z¹2
+z3¹k
+z¹4ka
+z3¹t
+2z2ú1
+zú3è
+zú3¾
+zù3s
+á1b
+á2bl
+áb4ry
+á4bø.
+á3cho
+ác3ti3
+á1d
+á2dl
+ádo4s
+ádos4ti
+ád1ø
+á1ha
+á3he
+áh1l
+á3hl.
+áh3n
+á1ho
+á1hr
+á1há
+á1j
+á4jmu
+áj4mù
+á4kli
+ák4ni
+á1la
+á1le
+á1lo
+á1lu
+á1ly
+á3lé
+á1lí
+á3my
+á3mé
+á1mì
+á3mí
+á3mý
+áne4v
+á1ra
+á1re
+ár2m
+á1ro
+á1ru
+á3rù
+á1s
+á2sc
+á2s3k
+ás4k.
+ás4kl
+ás4kn
+á2sla
+ás4ly
+á2sm
+ás4po
+á2st
+át3k
+át1r
+á1tu
+á1ty
+á1tí
+á3tý
+áv4si
+áv4sí
+áz3k
+áz3ni
+ázni4c
+áz4vi
+á2ò
+á1ø
+áø4ke
+áø4kù
+á2¹
+á3¹e
+á3¹í
+2è.
+1èa
+èa4br
+2èb
+2è1c
+1èe
+3èe.
+èe1c
+èes3k
+1èi
+2èk
+è3ka.
+è3ko
+è3ku
+è3ky
+2è1m
+2èn
+è2ne
+1èo
+è2p
+2ès
+è1sk
+ès4la
+ès4sr
+2è2t
+è4tené.
+è4tený
+èt4la
+è4tový.
+3ètv
+4ètìn
+è3tí
+1èu
+1èá
+1èí
+èís3l
+1èù
+2ï.
+1ïa
+1ïo
+ïs4te
+2ï1t
+3ïuj
+é1
+é2d
+é3di
+é3do
+é2f
+é3fo
+éf1r
+é2kl
+é2l
+é2m
+é3ma
+é3me
+é3mi
+é3mo
+é3mu
+é3mù
+4ére.
+é2s
+é2t
+é3ta
+é3to
+é3tá
+é2¹
+é2¾
+ì1c
+ìd3r
+ì3ha
+ì3he
+ì3hl.
+ìh3lo
+ìh3n
+ì1ho
+ì3hu
+ì3hù
+ì3ja
+ì1je
+ì1jo
+ì3jù
+ì4klé
+ì3k2t
+ì1l
+ì1ra
+ìra3d
+ì1re
+ì1ro
+ìr3s
+ìrs4t
+ì1ru
+ì1ry
+ì1rù
+ìs3k
+ìs3n
+ìt1a3
+ìt4ac
+ìt1l
+ì1tr
+ìt3ra
+ì4traj
+ìt3v
+ì1tí
+ìt3øí
+ì2v
+ì3va
+ì3ve
+ì3vl
+ì3vo
+ì3vu
+ì3vá
+ìv3è
+ì2z
+ì3ze
+ì3zi
+ìz3n
+ì3zo
+ì3zí
+ì1ø
+ì2¹
+ì3¹e
+ì3¹i
+ì3¹o
+ì3¹u
+ì3¹á
+ì3¹í
+ì¹3»
+ì¹4»s
+ì2»
+ì3»o
+ì2¾
+ì3¾e
+ì3¾i
+ì3¾o
+ì3¾u
+ì3¾í
+í1b
+íb3ø
+í3cho
+ích4t
+íd1l
+í1h
+í2hl
+íh3n
+í1j
+íjed4
+íj4mù
+í2kr
+í1l
+í1má
+í3mé
+í1mì
+í1r
+í1sa
+í2s3k
+ís4kl
+ís4kn
+ís4l.
+ís3le
+ís4ln
+ísáh2
+í1t
+ít3k
+í3t3øe
+íz3da
+íz3de
+íz3k
+í3zna
+í3z3ni
+í3znìn
+í2ò
+í1ø
+í2¹
+í3¹e
+í3¹i
+í3¹o
+í3¹í
+1ò
+2ò.
+2òa
+òa3d
+2òk
+2òm
+3òov
+ò1s
+2ò1t
+ó1
+ó2z
+ó3za
+ó3zi
+ó3zo
+ó3zy
+2ø.
+øa4pl
+øa4ïm
+2ø2b
+2øc
+2ød
+øe3ch
+øe4dob
+øe1h
+øe3jd
+øe3kl
+øe3kv
+øe4køí
+øeo4r
+øe3p2
+øe4p.
+øe4pk
+øe4pè
+øer4v
+2øes
+øe3ska
+øe3sko
+øe2sp
+øes3po
+øe4sr
+øe3sta
+øe3stu
+øe3stá
+øe3stø
+øe3tl
+øet4ø
+øe3zd
+øe3zk
+4øezl
+øe3èt
+øi1
+øia3
+øi3h
+øi4h.
+øi4hn
+øi4jï
+øi4l.
+øi4lb
+øil2n
+4øine
+øis2
+3øi4t.
+øi4v.
+øi4vk
+øi4vn
+øi3z
+øiè4t
+øi3ø
+øi4¹.
+2øk
+ø2kl
+øk4la
+øk4li
+øk4ly
+øk4no
+2ø1l
+2ø1m
+2øn
+1øo
+2øou
+2ø2p
+2ø1s
+øs4to
+2ø1t
+ø2v
+2øz
+øá4pl
+øá2sl
+2ø1è
+2øíd
+øí4kø
+øí1s
+2ø¹
+ø3¹t
+ø¹4ti
+1¹
+2¹.
+¹ab3
+¹a4vl
+2¹1c
+¹ej4d
+¹ep3t
+¹i4mr
+2¹2k
+¹3ka
+¹3ke
+¹3k3li
+4¹3kou
+4¹kov
+3¹kr
+¹k4ro
+¹3ku.
+¹3ky
+2¹l
+¹2la
+¹2li
+¹3liv
+¹2lo
+¹lá2
+¹2lé
+¹2lý
+2¹1m
+¹mi4d
+2¹n
+¹2p
+2¹1s
+2¹t
+¹4tip
+¹t4ka
+¹t4kl
+¹4tìk
+¹2tìs
+¹4tìv
+¹4típ
+¹2v
+¹í3d
+¹2ò
+¹3¹í
+2¹2»
+¹3»o
+¹3»u
+¹3»á
+1»
+2».
+3»al
+2»k
+2»m
+2»t
+»áè4k
+1ú
+ú2c2
+ú2d
+új4ma
+ú2k
+ú2l
+ú2n
+ú2p
+ú2t
+út4ko
+ú2v
+ú2z
+úz3k
+ú2è
+3úèe
+úøe4z
+ú¹4ti
+ú2¾
+ù1b
+ù1c
+ù1hl
+ù3jd
+ù4jmový
+ù1le
+ù1my
+ù1mì
+ù1ra
+ùr4va
+ùr4vy
+ù1s2
+ù2st
+ùs3te
+ùs3tán
+ùt2
+ù3tkl
+ù2v
+ù3va
+ù3vo
+ù3vì
+ù2z
+ù3zo
+ù2¾
+ù3¾e
+ù3¾i
+ù3¾o
+ý1b
+ý3cho
+ý1d
+ýd4la
+ý1h
+ý1j
+ý1l
+ý1ml
+ý1mì
+ý2n
+ý3no
+ýpo3è4
+ý1r
+ý1s2
+ý2sk
+ý1t
+ýt4ku
+ýt4ky
+ý1u
+ý4vli
+ý3zk
+ý3zn
+ý4zvu
+ýè4nì
+ý1ø
+ý¹3l
+1¾
+2¾.
+¾a3d
+¾a4tv
+3¾aè
+2¾1b
+2¾1c
+2¾1d
+¾e2b3
+¾eh3n
+¾e4ml
+¾e4zg
+¾i4dl
+¾i4jm
+3¾il
+¾i2vl
+2¾k
+¾k4ni
+2¾l
+¾4lic
+3¾lo
+2¾1m
+2¾n
+¾on2
+2¾1s2
+2¾1t
+¾2v
+¾á4br
+¾á4nr
+2¾ï
+¾í4zn
+2¾ò
+2¾¹
+¾¹4ti
+¾¹4tì
+}
+
+% Local Variables:
+% mode: tex
+% coding: latin-2
+% fill-column: 72
+% End:
+% vim: set filetype=tex textwidth=72:
diff --git a/tmac/hyphen.den b/tmac/hyphen.den
new file mode 100644
index 0000000..3148e30
--- /dev/null
+++ b/tmac/hyphen.den
@@ -0,0 +1,23437 @@
+% This is the groff hyphenation pattern file 'hyphen.den' for German
+% with hyphenation rules for the new orthography.
+%
+% It is based on the file 'dehyphn-x-2017-03-31.pat' taken from the
+% 'dehyph-exptl-0.41' package, converted to latin-1 encoding.
+%
+% Below is the original copyright message.
+%
+% -------------------------------------------------------------------------
+%
+% TeX-Trennmuster für die reformierte (2006) deutsche Rechtschreibung
+%
+% Copyright (c) 2013-2017
+% Stephan Hennig, Werner Lemberg, Guenter Milde, Sander van Geloven,
+% Georg Pfeiffer, Gisbert W. Selke, Tobias Wendorf
+%
+% Licensed under the MIT license. Full license text available from
+%
+% http://opensource.org/licenses/mit-license.php
+%
+%
+% The word list is available from
+%
+% http://repo.or.cz/w/wortliste.git?a=commit;h=5fd786fcb1ed48448e058672f1f58d185653d8c6
+%
+% The used patgen parameters are
+%
+% 1 1 | 2 5 | 1 1 1
+% 2 2 | 2 5 | 1 2 1
+% 3 3 | 2 6 | 1 1 1
+% 4 4 | 2 6 | 1 4 1
+% 5 5 | 2 7 | 1 1 1
+% 6 6 | 2 7 | 1 6 1
+% 7 7 | 2 13 | 1 4 1
+% 8 8 | 2 13 | 1 8 1
+
+\patterns{%
+.ab1a
+.abi4t
+.ab3l
+.abo2
+.ab3ol
+.ab1or
+.ab3s2
+.ab3u
+.ade3n
+.ae3
+.aft2
+.ag4n
+.ag4r
+.ag2u
+.ai2s
+.akt2a
+.al2e
+.al3k
+.al3lei
+.al5len
+.al3se
+.al4tan
+.al4tei
+.alter6s5
+.alt3s4
+.al2tu
+.ampe4
+.amt2s1
+.amt4sc
+.ana1c
+.an3d2
+.anden6k
+.and4ri
+.an1er
+.ang2
+.an3g4li
+.angs4
+.angst3
+.ani2s
+.an3k4
+.an3na
+.an3s2
+.an4si.
+.an3z2
+.ap5p6le.
+.aps2
+.ari1e
+.ar3k2a
+.ar4m3ac
+.ar4mun
+.ar2sc
+.ar4tan
+.ar4t3ei
+.arter4
+.ar6t5erh
+.ar2tr
+.arz2
+.asbe2
+.as4ta
+.as3tr
+.ata1
+.ate2
+.at4h
+.at4r
+.au3d
+.aue2
+.au4f3
+.aufs4
+.au2s3
+.auss2
+.auß2
+.ax2
+.äm3
+.är6schl
+.ät2h
+.ät2s
+.bahn3
+.bah6ner
+.baus4
+.be3erb
+.bel2a
+.be3r4a
+.be3r2e
+.ber4g3a
+.ber6g5e6b
+.ber4g3r
+.ber4tr
+.bi4os
+.bi2t
+.bit1a
+.boge2
+.bogen3
+.bogens6
+.bo4s3k
+.bu4ser
+.by4t
+.ca2s3t
+.ch4
+.char8mes
+.chi3er
+.dab4
+.da2r1
+.dar3in
+.darm1
+.da4te.
+.da4tes
+.de2al
+.de1i
+.dein2
+.de3lo
+.de8ments
+.den4ka
+.den4kl
+.den4ko
+.de1o2
+.de3r4en
+.de1s
+.de3sk
+.des2t
+.di3el
+.di4en
+.dien4e
+.dien6st
+.dienst7a8d
+.do3b
+.do2mo
+.don4a
+.do1pe
+.dor2f1
+.dy2s3
+.ebe2r1
+.edu3s
+.eg2o
+.eh2e
+.ehe1i
+.ei3e2
+.ei3f2e
+.ei3k
+.ein3d
+.eine2
+.ei4neb
+.ein6erl
+.eise4
+.ei2sp
+.eis3s4
+.ei2s3t
+.ei4tr
+.eke2
+.ek3li
+.el2a
+.el2bi
+.el2bl
+.elb3s
+.el4fei
+.el2fl
+.el2i
+.el6st
+.em3m2
+.en1
+.en4da
+.en4d3er4
+.en2d3r
+.end3s
+.en4dü
+.en2gl
+.enn2
+.ent3
+.en2ta
+.en4tei
+.en4tio
+.en4t1r
+.en5trop
+.ents4
+.er4bei
+.er8brecht
+.er2bu
+.er4dan
+.er4dei
+.erden6k
+.er4dep
+.er4d3er
+.er1e
+.ere3c
+.erf4
+.er1i
+.ers2
+.er8stein
+.erster6
+.er8stritt.
+.er8stritten.
+.er4z3el
+.er4zen4
+.ese3le
+.es3p
+.es3ta
+.est6e
+.es3th
+.es3t3r
+.et2s
+.eu1
+.eu3g4
+.eu3r4
+.eu3t
+.ext4
+.fe3la
+.fer4no
+.fi3est
+.fi4le.
+.fi4len
+.fi2s
+.flug1
+.for2t
+.fs4
+.fu2sc
+.ga2me
+.ga4s1
+.gas3e
+.ga4t
+.gd2
+.gebe4a
+.geb2l
+.gee4
+.gel4b3r
+.gel2d1
+.ge3lu
+.ge5nar
+.ge3n4e
+.gene7cke
+.ge3n2o
+.ge3r4a
+.ge3r2e
+.ge3ro
+.ger4s
+.ge3s4a
+.ge3u
+.glan2
+.gol6der
+.gs4
+.halt4e
+.hau2t1
+.he2
+.he4bei
+.he3fe
+.he3le
+.her3an
+.he3rat
+.her6b5ra
+.he3rer
+.he3ri
+.he6r5inn
+.hin3u
+.hips4
+.hi4s
+.hof1e
+.ho4fen
+.ho4met
+.ho4st
+.ia4
+.im2a
+.ima4ge
+.im5m2
+.in1
+.ind4
+.in3gl
+.ink2
+.in3n2e
+.in3sk
+.inu1
+.ioni1
+.ire3
+.is2a
+.is3t
+.it2h
+.iv2
+.ivo3
+.joni1
+.jor3
+.ka2b3l
+.ka2i
+.ka3le
+.ka3ta
+.ka4t3io
+.ki4e
+.klang3
+.ko3b
+.kopf1
+.kor4da
+.kraf2
+.ks4
+.kus2
+.la3be
+.la3ho
+.lase2
+.le4ar
+.le4gas
+.le3n2i
+.len3z
+.lich8t7er8s
+.li2f
+.li4ve.
+.lo4g3in
+.lo2sc
+.los3s4
+.lo3ver
+.luster6
+.lus4tr
+.lut4h
+.ma3d
+.ma3ge
+.mal4e
+.ma2st
+.mat4c
+.matu3
+.md2
+.me3l2a
+.me3ne
+.me3no
+.men8schl
+.men8schw
+.ment4
+.mes4sp
+.mi2f
+.mik4
+.mil2z
+.mi2st
+.mi4t1
+.mm2
+.mutter5
+.na3no
+.na3t
+.nat2h
+.näs1c
+.nebe4n
+.ner2f
+.ne1ro
+.ne2s
+.nich2
+.nicht5e
+.ni4e
+.ni3k4l
+.no4th
+.nus4
+.oa3s
+.ob1a
+.obe2
+.ober5ei
+.of2e
+.oper4
+.or2a
+.ord4e
+.ort2
+.ort4h
+.orts3e
+.os3s
+.os4tal
+.os5t6alg
+.oste2
+.os4t3el
+.ost5end
+.os8ten8de
+.oste6re
+.os8terwe
+.os4t3r
+.os2tu
+.ot1
+.ozo4
+.öd2
+.öl3l
+.pab4
+.pa2r1e
+.par3t4h
+.pe2c
+.pe3la
+.pe3le
+.pf4
+.ph4
+.poka2
+.po4st
+.pro1
+.ps2
+.rabe4
+.ra3ch4e
+.ra3me
+.ra3sa
+.rau2m
+.rau8schl
+.räu3sc
+.re3ale
+.reb3s2
+.re3cha
+.re5insz
+.reis6e5i
+.rei4st
+.reli1
+.res6tr
+.ri4as
+.richt6e
+.ro4a
+.ro3be
+.ro2h
+.ro3m4a
+.ro2tr
+.rö2s
+.ruf3s
+.ruh2r1
+.runder6
+.rü1b
+.rü6cker6
+.sa3br
+.sali3e
+.sami1
+.sau1c
+.sau5er.
+.sch4
+.schaf8t7end
+.scheiner8
+.se3ck
+.se2ei
+.se2ha
+.sen4f
+.sen3s
+.se3re
+.se1ro
+.se2t1
+.sha2
+.si3gn
+.si4te
+.ski1e
+.skis2
+.sour2
+.spani7er.
+.spiege8lei
+.st4
+.ste2i
+.steiner8k
+.sto4re
+.sucher6
+.tage4s
+.tan4k3a
+.tan4k3l
+.ta3ra
+.tar3t
+.ta2t3h
+.ta2to
+.ta4tor
+.ta2t1u
+.te2e
+.te2f
+.tehe3
+.teiler8s
+.tei8l7ersc
+.te3l
+.te3no
+.ten3s
+.te1ra
+.te2s
+.te4st
+.tester8g
+.tester8h
+.test3r
+.th4
+.ti2e
+.ti2me
+.ti4mes
+.ti2s
+.ti8sch7end
+.tite4
+.tode4
+.to4der
+.todes5
+.to2n
+.to4nat
+.to4nin
+.to4pl
+.to2pr
+.to2w
+.tri3es
+.tro2s
+.ts4
+.tsa3
+.tse3
+.tu3ra
+.tu3ri
+.turm1
+.tur4ma
+.ub2
+.ufe2
+.ufer1
+.ul2b3
+.um3
+.uma2
+.ume2
+.umo2
+.un3a2
+.un3d
+.une2
+.un3g
+.uni4t
+.un3s
+.uns4t
+.ur3a2d
+.uran6fa
+.ur1c
+.ur1e
+.ur4inf
+.ur3o4m
+.ur1o2p
+.ur3s2
+.ut2a
+.ut3r
+.übe4
+.ve5n2e
+.voll1
+.vo4r
+.wah4l
+.wa2s
+.weg5s
+.wei4ta
+.welter8e
+.welter8kl
+.wer6ker
+.wer4kr
+.wer4tr
+.wetterer8s
+.wi4e
+.wor2
+.wort5en6
+.wor8tend
+.wor4tu
+.wur2f1
+.xe3
+.ya4l
+.zahn3
+.zel4la
+.zelle4
+.zel6leb
+.zeug4i
+.zi2e
+.zie4l3u
+.zin4ka
+.zin4s3c
+.zin4st
+.zuch2
+.zucht3
+.zug3l
+.zu4gra
+.zu2pf
+.zwe2
+.zweigen8
+.zwei8g7end
+a1ab
+aa2be
+aa1c
+a1a2ce
+aa2gr
+a1akt
+aals2t
+a1a2n
+a2ans
+a1aq
+2a2ar
+aa2r3a
+aar3b
+aar3d
+aa3rea
+aa2rei
+aarf4
+aar3g2
+aar3k4
+aar3t4
+1aas
+aata2
+aa2th
+aa4t3r
+aat4s3
+2a3au
+a1ä
+a1b
+2aba
+ab1alt
+ab2am
+ab2ant
+ab1au
+ab1ä
+ab2är
+ab2äu
+2abbat
+2abbin
+1abd
+4a3be.
+4a3bec
+abe1e
+ab1eic
+abe3i4d
+ab1eil
+ab1ein
+4ab2el
+abe2la2
+abe4l3in
+1abent
+2aber
+a2berd
+a3beri
+ab1er2k
+ab1er2r
+ab1er2z
+4abes
+abe2s1e
+ab3esse
+2ab2et
+2abew
+1abf
+1abg
+3abga
+1abh
+2abi
+4abil
+ab1ins
+ab1ir
+abi3s4t
+3ab1it
+1abk
+ab1l
+1a2bla
+a4blag
+a3blat
+a4blau
+1a2blä
+3ab3lei
+2ablet
+ab3li
+a2blin
+ab4lit
+2ablo
+1a2blö
+2ablu
+1abn
+2abo
+3a2bo.
+ab2of
+3a2bon
+4abot
+2abö
+ab3r
+a4brä
+a2bre
+2abro
+ab4ros
+2abrö
+1ab5sc
+1ab3s2p
+abst2
+ab3sz
+1abtei
+abte2s
+3abtr
+2abu
+a2bum
+ab1ur
+2abü
+1abw
+2aby
+aby4t
+3abz
+2a3ca
+ac1c
+a1cem
+a1cen
+a2ceo
+ach1a
+a1chal
+a3chari
+ach3as
+ach3au
+2achb
+a1che
+a2ch1e4c
+ach1ei
+ach4ei.
+a2chep
+a4cherf
+ach5erfa
+a4ch3erh
+a4ch3erl
+a4cherö
+a4ch3erw
+2achf
+2a1chi
+a2chim
+ach3l
+2ach3m
+ach3n
+a1cho
+a3cho.
+ach1ob
+a2cho2r
+ach3ö
+2ach3r
+2achsc
+achs4el
+ach3s4i
+ach3skr
+achs4or
+ach3su
+a4cht
+ach4tak
+ach8tersp
+ach6t5erw
+ach4t1o
+ach8traum
+ach8träume.
+ach8träumen.
+ach6trit
+acht6sal
+ach4tum
+a1chu
+ach1u2f
+ach3ü
+2achv
+4ach1w
+a2chy
+2a1ci
+4ack.
+a1ckar
+a3ckel
+a2ckin
+ack2sp
+acksta4
+2a1cl
+acon4n
+2acu
+a1ç
+a1d
+2ad.
+2ada.
+4adab
+a2dac
+a2dad
+ad2ag
+ad1ama
+a2d1an
+3adap
+4a3d2a2r3
+2adat
+a2d1au
+a3dau.
+1a2dä
+ad1c
+1add
+2ade.
+ade2al
+a3dec
+a3dee
+adefi2
+2adeg
+4aden
+ade1ra
+4ade1s
+ade3s2p
+ades4s
+2adf
+4adh
+4adi
+adi3en
+adi3er.
+adie4sc
+adi4st
+3adj
+2adli
+3admi
+4admu
+ad2ob
+1a2dop
+2adp
+2adq
+2ad3rec
+ad3rei
+ad3run
+2ads2
+ad3st
+ad3sz
+2ad2t1
+ad4te2
+adt3h
+1adv
+2a1e1
+ae2b
+a2ec
+ae2ck
+ae2d
+ae2i
+a2ek
+a3el.
+a2ela
+a2ele
+a2eli
+a3els
+ae2m
+ae2o3
+ae2p
+a3er.
+3a2er2o1
+aes2a
+ae2sc
+aes5t
+a2ew
+ae2x
+2afa
+af1ab
+a2f1a2n
+a3far
+a2f1au
+2afä
+a2f1än
+2afe
+a2f1ec
+a4fentl
+a4f1ep
+aff4a
+af2f3l
+af4flu
+aff2s
+2afi
+afi2e1i
+afi6kanz
+afi4kat
+afi2t
+2af3l
+a1flu
+2afo
+a2f3oc
+a2ford
+afo1s
+2afra
+af3rau
+af3rä
+af3re
+2afro
+af3rö
+af4rü
+af3s2a
+af3s2h
+af2si
+af2sp
+afs4t
+af2t1a
+af2tei
+af2te2l
+aft4erk
+af2t1o
+af2tö
+aft3r
+af2tra
+af4t5re
+aft4stä
+af2tur
+a2f3ur
+2afü
+afür3
+a1g
+2ag.
+2aga
+ag1a2b
+ag1a2d
+ag1ar
+a2g1au
+agd1
+ag2del
+ag2di
+ag2dr
+ag2du
+4age.
+age1i
+agein4s
+age4ler
+ag2em
+4a3gen.
+age4neb
+a2gent
+2ages
+age4sam
+age4s3i
+age2s3p
+ages6sen
+age4s3ti
+3aggr
+a2g1id
+a2gim
+2a2g1l
+ag4lan
+ag4las
+ag3le
+a4glö
+2agm
+ag2n
+ag4nat
+a4gnä
+ag4ne.
+ag4nu
+ag3rat
+a2g3re
+a2g3ri
+ag4ro
+2ags
+ag3s2ah
+ag4sam
+ag3s4eid
+ags8porta
+ags4tan
+ag1ste
+ag3stö
+2agt
+ag2th
+2agu
+a2gund
+2ah.
+a1ha
+ah2an
+ah4at
+a1hä
+2a1he
+ahe1in
+a2h1er2h
+ahe1s
+ahe1u
+a1h2i
+ahin3
+ah2l3a2
+ah2l1ä
+ah4l1ei
+ahle4na
+ah4l3erd
+ah4l3erh
+ahl1o2
+ah2lö
+ahl3sz
+ahme1i
+ahme3s
+ah3mu
+ah4n3a
+ah3nee
+ahn3el
+ah4nerd
+ahner4e
+ahner6le
+ahner4n
+ah2nin
+ah2no
+1a2hor
+ah1os
+a2h3ö
+4ahr
+ahr1a
+ah3r2e
+ahren6sc
+ahre4s
+ah3ri
+ahr6tage
+ahr6teng
+ahr2ti
+ahr4tri
+ahr4tro
+ahr4tun
+ah2ta
+ah2te2l
+ah2t1ex
+ah4t5r
+aht3s6
+a1hu
+ah1w
+a1hy
+2ai.
+ai3a4
+a1ia.
+2aib
+ai2bl
+aid2s
+ai1e4
+ai3en3
+aif4
+ai1fr
+ai3g4
+a3ik.
+ai3ke
+ai2lar
+ail3d4
+ai2lei
+ail3g
+ai2lo
+4ain
+ain2a
+a1ind
+ai5n4e
+ain3s
+ains2p
+3airb
+ai2sa
+a3isch.
+ai5schw
+ai3s2e
+ait4
+a3iv.
+a3ivl
+a3ivs
+a1j
+a2jat
+aje2
+ajekt4o
+2ak.
+a3ka.
+2aka3b4
+a2ka3d2
+2akal
+2a3kam
+2akar
+ak4at
+aka4tak
+1akaz
+4akä
+2akb
+2akc
+2akd
+2a1ke
+a2kef
+a2k1em
+a2k1ent
+a2kes
+a2keu
+4a1ki
+ak1ins
+aki1s
+1akku
+2ak3l
+ak4li
+a1kna
+2ako
+2a1kr
+4akra
+ak4ri
+2aks
+ak3sh
+ak2t1a2b
+2aktb
+ak2tel
+akt2er
+2aktik
+2aktis
+2aktm
+ak2tö
+ak2t3r
+akt4ri
+2aktsi
+2aktsp
+2aktst
+2aktw
+a1ku
+2akun
+a2kup
+2akur
+aku2s
+4a3kü
+1akz
+3akze
+a1la
+2ala.
+4alabo
+al2abr
+al1af
+al1age
+2alai
+al3akr
+al1am
+al1ana
+4aland
+a2lang
+al1anz
+al1app
+a3lar.
+al3arc
+a3lare
+al2arm
+2al3arr
+a2lart
+ala2s
+al1asi
+al1ass
+ala2t1a
+al4atm
+alat3z
+al1au
+al3aug
+a1lä
+a2l1äm
+al1än
+al1äu
+3albat
+al2bär
+alber4e
+al4berh
+al4b3er4w
+al2b1l
+al2boh
+alb3ru
+alb3s
+al2dä
+al4d3erl
+al4d3ern
+alde2s
+ald3inn
+al2dr
+alds2
+2ale
+4a3le.
+ale4ar
+al1eb
+ale2be
+al1ec
+a4l3ef
+a2l1ei
+a3l2eic
+a4l3ein
+a2l1el
+3a2lema
+alen1
+4a3len.
+3alenc
+alende4
+al3endr
+a4l3ends
+a2leng
+al2enn
+a3lentf
+ale2p
+al1epo
+4aler.
+a2l1erb
+a2l1erf
+a2l1erh
+aler4kl
+a2l3erl
+al1erm
+aler4mi
+a2l1er4r
+a2l1ert
+3a4l3erwä
+4ales
+a2l1e4sk
+a2less
+a2l1eu
+al3exi
+alf4r
+2alg.
+3algi
+al2gli
+al3glo
+1algo
+3algor
+2ali
+al2imb
+al1imm
+ali4nal
+al1ind
+a2l1inq
+al1ins
+alken1
+al2klö
+al2kne
+1alkoh
+alk3s
+alks4t
+al2lab
+al2l1an
+al2l1ap
+al2l1a2r
+al2l1au
+al3le.
+al4lec
+3allee
+al3lend
+all3erk
+al3les
+al2lid
+alli5er.
+alli7ers.
+al2lob
+al2lop
+al2löf
+al2map
+al4m3ast
+almo6de.
+a2l1ob
+3aloe
+a2lof
+4alog
+alo2ga
+alo2gr
+al1ont
+al1ort
+a2l1ö
+al2ös
+3alp.
+3alpe.
+1alph
+al2pho
+alrat4
+al3sak
+al6schei
+alsch3s
+al3ska
+al5s6terb
+al2stu
+al2sum
+al2t1ak
+al3tam
+alt1an
+1altä
+al4temu
+al4t3er5f
+al2teu
+al2tin
+alt1op
+al2tö
+al4t3rat
+al2tre
+al4t3ri
+al2t3ro
+alt4stü
+2altu
+a1lu
+alu3b4
+al2u3f
+alu3g
+al1u2k
+a2lum
+al1umb
+al1ur
+a3lus
+4aly
+al2zar
+al2zau
+alz4erk
+al2zw
+2am.
+am2a
+ama3d2
+ama3g
+a2malg
+2a3m4an
+a2m3ap
+3a2maz
+2amä
+4ame.
+a2meb
+2amel
+am4e4n1
+amen6spr
+ame3r2a
+a2m1erf
+a2meri
+ame5r2u
+ame1s
+a4mesh
+a3met
+2amf
+am4ing
+2amir
+2amis
+2amit
+2amk
+2aml
+2amm.
+2ammal
+am4mant
+am2mar
+am2mei
+am2mid
+ammi2e
+am2min
+am2mor
+am2mö
+ammu2
+amni1
+a2mö
+2ampe.
+2ampen
+am4pf
+amp2f1a2
+ampf1o
+2am2ple
+2ampo
+am3pr
+2am2s
+am3sa
+4amsc
+am4schl
+3amse
+am3s2h
+am3so
+am3sp
+am3su
+1amt.
+am2t1a2
+am4tau
+am2t1ä
+am2tei
+amt3eig
+am4tel
+am4t3ern
+am2t1ex
+am4tis
+am2tit
+am2to4
+am6tou
+am2tö
+am2t3r
+am6tre
+am4tri
+am2t1u
+2amu
+3a2mul
+2ana.
+2anab
+ana3c
+4anad
+anadi1
+an2ag
+2a3nak
+an1alg
+ana4lin
+an4a3ma
+2anan
+an4and
+2ana1s
+a5nat.
+ana4th
+a5n4atm
+ana4tr
+an3aug
+1an1äs
+1anb
+2anbas
+2anbu
+an3ch
+2and.
+3an3d2ac
+and3arm
+and3ei
+anden6ga
+an4d3ent
+and5erob
+ande2s
+an2d1ex
+and4sas
+and2so
+and6spar
+and6spas
+and2su
+4andu2
+an2d1ur
+andy1
+2ane
+4ane.
+an3e2c
+a3nee
+an2ei.
+an3eif
+3aneig
+a4neis
+3a2n1e4k
+ane2mi
+4anen
+aner4fa
+an2erh
+a4nerke
+4anern
+a4nerz.
+an4erze
+an1eth
+1anf
+2anf.
+2anfab
+3anfä
+an3fe
+2anfi
+an4fj
+anf3le
+4anfors
+anf5rau
+2anfs
+an3f2u
+2ang.
+1angab
+an2gan
+an2g1ar
+2ange.
+1angeb
+1angeh
+an2g1ei
+an4g3erf
+an4g3er4w
+an4g3erz
+2angh
+2angie
+ang1l
+an2gla
+ang3n
+ang1r
+ang3ra
+1an3gri
+2angs.
+angt4
+1anh
+2a3n2i
+ani3d
+ani3els
+ani5ers.
+ani3g2
+ani3ke
+3a4nim
+a4n3ind
+a4n3ins
+ani2o
+an3i4on
+a4niso
+2anj
+2ank.
+an2kab
+an2k1ak
+an2kan
+an2kei
+2anken
+ank5erfa
+2anki
+an2klö
+an2klu
+ank3no
+an4k3opf
+an2ko4r
+ank1r
+ank3ra
+an4kras
+ank3rä
+an2kro
+2anks
+ank3se
+anks2p
+2ankt
+1anl
+2anlad
+3anlag
+2anmo
+1anmu
+2ann.
+1annah
+an2nar
+an3ne
+an4nef
+annen3s4
+2anns
+ann4s3p
+2annt
+2ano.
+ano3b
+an1od
+2anof
+2anog
+anoi3
+a3nol
+ano2la
+1a2nom
+a3nom.
+a2n1or
+2a3nos
+2a1nö
+2anpu
+1anr
+2anrö
+an3sar
+1an3s2ä
+3anschr
+an3skr
+ans1pa
+ans3pon
+1anspr
+1anst
+ans4tr
+an3s2z
+2ant.
+an2t3ar
+anta4re
+an3t2ä
+1antá
+3antei
+an3tha
+2antie
+3antise
+2anto
+anton2
+1antr
+ant3rin
+1antw
+2anu
+an4ut
+a1nü
+1anw
+2anwi
+an2zä
+2anzb
+2anzd
+1anzei
+anze4n
+2anzg
+2anzh
+an2zid
+an2z1i4n
+2anzk
+2anzm
+2anzr
+2anzs
+2anzt
+1anzü
+3anzün
+2anzv
+2anzw
+an2zwa
+an2zwi
+2anzy
+2ao
+aof4
+ao3i
+a1op
+aopf4
+a1or
+a1os5
+aost2
+a3ot.
+aot4r
+ao3t2s
+2a1ö2
+a1p
+4ap.
+2apa
+a2pe.
+a3pel
+a2pé
+a2pf
+ap2fa
+1apfel
+2apfes
+a3pfl
+a2pht
+2api
+2ap3l
+ap4la
+ap4lä
+ap4lo
+ap2n
+a2pot
+ap3pu
+2apr
+4apro
+aps4ter
+ap5t2
+2a3pu
+2ar.
+a1ra
+a3ra.
+ar2ab
+2ar3abb
+ar3abf
+ar3abt
+ara3d2
+ar3adr
+ara3ge
+a2r3al
+a3r4ale
+a3rali
+a3ralo
+2aran
+a2r1ang
+a2r1anz
+2arap
+a2r3app
+2arar
+a3ras
+ara2st
+a2r1au
+a1rä
+1arb
+2arb.
+2arba
+ar2bak
+ar2b3at
+ar2bau
+4arbef
+ar4b3ein
+2arbek
+2arben
+2arber
+arb3erl
+4arbi
+2ar2bl
+2arbo
+2arb1r
+ar2b3re
+2arbs2
+arb3sk
+arb3so
+2arb3t4
+2arbu
+1ar1c
+2archl
+2archr
+ar2dau
+arde2l
+ar2dob
+ar2dop
+ar2d3r
+ar2du
+a2rea
+are5aler
+a2reb4
+aree2
+ar1eff
+ar1ehr
+ar1eid
+a3reih
+areim3
+a2rein
+arein4b
+arein4s
+arein4t
+a2rele
+4arem
+4a5ren.
+a5reni
+aren6sem
+are3r2a
+arer2e
+a4r3erei
+a2rerg
+a2r1er3h
+a2reri
+a2rerk
+a2rerl
+ar2erw
+are3u
+arf1r
+arf3ra
+arf2sp
+4arg.
+ar3gan
+ar2gl
+ar2gn
+2arg4o
+ar3g4r
+2arh
+2ari
+ar2ia
+a2rid
+ari3e2n
+ari3erd
+ari3erg
+ar3inf
+arin3it
+arin3s4
+ar1int
+a3rio
+ar2ir
+ar4is
+ari2su
+a3riu
+ar2kal
+ar2k1ar
+ark3aue
+ar2kil
+2ark3l
+ar4klag
+ar2kle
+ar2klo
+ark4lö
+ar2kor
+ark3s4a
+ark2se
+ark3she
+ark6tre
+ar2les
+ar3mad
+ar2m1au
+ar3m2ä
+3armee
+ar2m1eg
+ar2m1ei
+ar4merk
+arm2or
+ar2mum
+4armü
+ar2nan
+arn2el
+ar3ni
+ar4nin
+a1ro
+4aroc
+aro8ckeng
+ar1o2d
+ar1of
+aro2fe
+a3rol
+aro3m
+aron2
+a2r1o2p
+a2ror
+aros3
+a2r1ö
+2arp
+arp3fe
+2arr
+ar2r1ad
+ar2r3as
+arre4n1
+ar2r3or
+2arsa
+ar3se
+ar3s2h
+2ar3s2i
+ar2tau
+2artb
+ar3t2e
+2artei
+arter6la
+ar2the
+art3ho
+ar3t2i
+2arto
+art3r
+art4res
+2arts
+art3ske
+2artuc
+2aru
+a2r1uh
+ar1um
+a3rumm
+a2rü
+2arv
+arwa2
+2ary
+ar2zau
+ar2zä
+2arze
+2arzi
+ar2zö
+1arzt
+arz4tei
+arz4tem
+arz2t3r
+2arzu
+ar2z1w
+2asa
+a4s3aa
+a2s3af
+a3sag
+as2al
+as1am
+as3art
+asa2s
+as3at
+asau4f
+a2s3aug
+a2sä
+as3ät
+a6sca
+a4schec
+a4schef
+a4sch3ei
+a6scherg
+a3s4chi
+a2schm
+2ascht
+a3schu
+a4schum
+4a3se
+a4seb
+a4sec
+a4s1ef
+as1eie
+as1emi
+a5sen.
+ase4na
+ase4n3o
+as2er
+a4s3erke
+as4es
+ase4t
+a4sex
+a3s2hi
+as3hir
+a2s3i2k
+2asim
+asin2g
+as1inn
+2asis
+aska3s
+as3ob
+as1of
+a5sol
+a5som
+as1o2p
+as1or
+a4soz
+a2sö
+a2s1p
+aspek6to
+as2ph
+a3s2pi
+as3pio
+a4spir
+as2pra
+2as3sa
+ass2ab
+ass6aus.
+ass2e
+ass3ein
+asse3le
+as3s2i
+as3ski
+as3so
+as2spo
+as2spr
+as2st
+as3sta
+as3stei
+as3sti
+as3str
+as3stu
+2as3ta
+a1stas
+as4tati
+as4tau
+a3stä
+as3te
+ast2el
+ast2er
+as4t3ese
+as4tex
+a4s2th
+as3tie
+as3til
+as3to
+as4tof
+ast3orc
+a1str
+ast3re
+as3t4ren
+ast5roll
+as3tub
+2asu
+as2ur
+a3sus
+a2sü
+aswa2s
+2asy.
+3asyl
+a1ß
+aße4
+aßen3
+2a1t
+4ata
+at1abe
+at1abr
+at2a1f
+a5t2a3g
+at1akt
+ata3l
+a3tam
+at1apf
+at2asc
+at3att
+a2t1au
+a3tau.
+at2ax
+at1än
+4atb
+at2c
+a2teb
+a3tec
+ateien6d
+at1eig
+3a2teli
+3a2temg
+at2en
+ate4na
+atens4e
+a2tep
+ate3r4al
+ate3ran
+atern2
+ater3st
+ate2ru
+4ates
+ates4sa
+a3tet
+at2eu
+a2tew
+at2ex
+at3hag
+a3t4heb
+a2th3in
+3athl
+a4thr
+at2hu
+4a3ti
+ati3ka
+ati4kab
+ati6k5erw
+a4tinf
+ation4
+at2is
+ati2sa
+ati2se
+atis3s
+3atla
+4atli
+3atm
+4atma
+4atmä
+4atmus
+ato4man
+ato4men
+3atomk
+ato2mo
+at1ort
+ato3s
+atra4t
+a2trau
+a2t3rä
+at3re
+4atri
+at3rin
+a2t3rom
+at4ron
+at3rot
+at3rü
+at2sa
+at4schn
+at2se
+at2si
+at2s1o
+at2s1p
+ats3tät
+at3ta
+3attac
+at4tad
+at4t1ak
+at4tang
+at4tar
+at4tau
+at2tä
+4atte.
+at2t3ec
+at2tei
+att2el
+at5ter
+at3thä
+4atto
+at2t3rä
+att3s4
+at3t2u
+a3tub
+atu2n
+a3tü
+atze4l
+atz3ela
+atz3elt
+at2z1er
+a3tzere
+at2z1in
+at2zo
+atz3t4
+at2z1w
+a2u
+2au.
+2au3a2
+2aub
+au2bab
+au2ban
+au2bau
+aube4n
+au2beu
+au2blä
+au2bli
+au2blo
+au2blu
+aub2si
+4auc
+aude4r3i
+au2dr
+2aue
+aue2b
+au2ere
+aue3rei
+au5erein
+auer3ö
+au5erst.
+au3ert
+aue2s
+au2fa
+auf1an
+2aufe.
+2aufeh
+4aufen.
+3aufent
+auf1er
+au4ferk
+au2feu
+auff4
+auf3ind
+1aufla
+1aufn
+2aufo
+auf3ski
+auf3t4
+2auft.
+2aug
+aug2ar
+4augeb
+4augeh
+4augel
+aug2er
+4augl
+4augr
+au3gu
+au3h
+2au1i
+au3in
+au2is
+2auj
+auk3t
+aule2s
+aul4les
+au3lü
+4aum
+au2mal
+au4m3ent
+au2m1e2r1
+aum3eri
+au2mid
+au2mil
+aum1o
+au2mor
+aum3p2
+aum3s6
+au4mun
+4aun
+au3n2a
+aun2e
+au4nei
+au2nio
+au2no
+au3nu
+a4unz
+au1o
+2aup2
+aup4ter
+2aur2
+au3ra
+au1rh
+aurü3
+au2s1ah
+ausan8ne.
+au2sau
+2ausc
+au6schmi
+1ausd
+2ause.
+au4s1eh
+2ausen
+au4s3erb
+au4s3erf
+au4s3erk
+aus3erp
+au4serw
+1ausf
+1ausg
+au2sin
+au2sis
+1ausl
+au2so
+aus1or
+au2spr
+1ausr
+3aussag
+aus4se.
+aus3s4t
+aust2a
+2auste
+au5stein
+aust2o
+3ausü
+1ausw
+1ausz
+auße2
+2aut.
+au2t1äu
+2autb
+2aute
+au4t1e2l
+au4ten4g
+au4t3erh
+2autg
+1auto
+au4trö
+2auts2
+2auu
+2auv
+auve4
+2auw
+2aux
+2auz
+au3ze
+auz2w
+2a1ü
+a1v
+av2a
+a3vang
+avas4
+ava3t2
+avener4
+2avi
+a2vr
+2a1w
+awi3e
+a1x
+ax2am
+a2xans
+ax2e
+a3xid
+a2xio
+ay1
+2a1ya
+ay2al
+ay2as
+a1yeu
+ayma4
+ays2
+aysi1
+ay3t
+ay2u
+2a1z
+a3z4a
+aza3d
+3a4zal
+az2i
+az2o3
+a3z2u
+az2zen
+az2z1in
+az2zw
+ä1a
+1ää
+ä1b
+ä2b3l
+äb2s
+ä1ce
+ä1che
+äche1e
+äche4n
+ä1chi
+äch3l
+ä2chr
+äch4s3a
+äch2s1o
+äch2sp
+äch2st
+ächt4e
+ä1chu
+ä1ck
+ä1d
+ä2da
+äde1s2
+ä2d1ia
+ä2dr
+äd2s
+2ä1e
+äe2x
+äfe4n
+äf2fl
+äfig3
+äfigs4
+äf3l
+äf3r
+äf4ro
+äf2s
+äf3t2e
+äft4s3
+ä1g
+ä2g1a
+1ä2gä
+ägd2
+äge1i
+äge2r3a
+äge3s
+ä2g3l
+äg2n
+ä2g3r
+äg4ra
+äg3s4ta
+äg3s4tr
+1ä2gy
+äh1a
+2ä3he
+ä4h1ei
+äher8gebn
+äher5t
+ä1hi
+äh1in
+ähl1a
+äh3l2e
+äh4l3e4be
+äh5ler
+2ähm
+äh3na
+äh3ne
+1ähnl
+2ähr
+äh2rel
+äh3ri
+2ähs
+2äht
+ä1hu
+äh1w
+2äi
+ä1im
+ä1is.
+ä3isch.
+ä1isk
+ä1j
+ä1k
+äka2la
+äk3l
+ä2kle
+äk4li
+ä2k3r
+ä1la
+älbe2
+äl2bl
+älk3
+älks4
+äl2l1a
+äl2p3
+äl4schl
+äl2st
+äl3te
+ä1lu
+2äma
+ä3me
+ämer2s
+ämi3en
+2äml
+ämoni3e
+2ämp
+ämp7f4e
+äm2s
+ämt2e
+2än.
+änd2e
+än2dr
+2än2e
+äne2n1
+äne1s
+2än2f5
+änft2
+2än3g2e
+änge4ra
+2än2g3l
+än2gr
+äng3se
+2ä3n2i
+än3k2e
+än2k3l
+än2kr
+änk2s
+än3n4e4
+2äns
+än4s1a
+än2s1c
+äns2e
+änte3le
+2änz
+ä1on
+äo3s2
+ä1pa
+1äpfel
+äp2pl
+äp2pr
+äp2s1c
+äp4st
+1äq
+ä2r3a4
+är4af
+är1ä
+är2b3le
+är1c
+2ärd
+ärde4s
+2äre
+ä2r1ei
+ä2r1e2l
+är2em
+äre2n
+ä2rene
+är2er
+är2es
+ärf2s
+är3ge
+ä2rind
+är1int
+är3ke
+ärk2s
+ärm3arm
+ärme1e
+ärm3ent
+ärm2s
+är1ob
+är1of
+äro2p
+ä1rö
+är3re
+ärse2
+är2seb
+är4seh
+ärs1er
+är2si
+är3spu
+är2st
+är3str
+2ärt
+ärt4e
+är2th
+ärt2s3
+ä2rü
+1ärz
+är3ze
+är2zu
+är2zw
+2ä3s2e
+äse3g
+äse1i4
+äse5ref
+äser4ei
+äse4ren
+äser2i
+äse3t
+ä3s2kr
+ä2s1p
+2äs2s1c
+äss2e
+äss5erkr
+äss5ersa
+äss3erw
+äs2sp
+äs2s3t
+ä4s3t
+äst2e
+1ästh
+äs4tr
+ä3su
+ä1ß
+äß1erk
+äß1ers
+ä2t3a2
+2ä3te
+äte3a
+äte1e
+äte1i
+äte3l2
+äte2n
+äteo2
+ät1ob
+ä2t3r
+ät2s3a
+ät2sä
+ät4schl
+ät4schr
+ät2s1i2
+äts3l
+äts1or
+ät2s1p
+ät2s3t
+ät2tei
+ätte4n
+ät4tr
+ätze3l
+ät2zw
+2äub
+äu2b3l
+äu2br
+äu1c
+äu3d
+äude3
+äuder2
+äu3el
+2ä2uf
+1äug
+äug3l
+2äul
+2äum
+äu2ma
+äum3p
+äumpf4
+äum4s5
+2ä2un
+äun2e
+äu3nu
+2äu3r2
+äure1
+2ä3us.
+2äusc
+äu4schi
+äu4schm
+äu3s2e
+äuse1i
+ä3usg
+ä3usk
+ä3usn
+äu2sp
+äus2s1c
+1äuß
+äut2e
+äu2tr
+ä1v
+1äx
+ä1z
+â1t
+á1n
+3ba.
+b3a2ba
+2babf
+2babg
+ba2bl
+ba2br
+2b1abs
+bach7t4e
+ba4ck3er
+back3s4
+ba3d2e
+bade1i
+2b1adel
+2b1adl
+2b1adm
+b1a2dr
+ba2du
+2b1af
+bah6nene
+bais2
+b2ak
+ba2ka
+ba2k1er
+ba2k1i
+bak1l
+bak3r
+ba2kra
+ba2kre
+ba2lab
+ba2l1ak
+ba3lal
+ba2lau
+ba4l3erk
+balk4a
+balke4
+bal4l3eh
+bal4l3ei
+baller6e
+bal6ler6g
+ball6erk
+bal3ti
+2b1am
+b2ama
+ba2me
+ban2a
+3b2and
+band1a
+ban4dal
+ban4dan
+ban4dar
+ban6deng
+ban2dr
+ba3n2e
+2banf
+b1ang
+ban3gl
+ban4k1a
+banker4
+ban2kl
+ban2kn
+ban2kr
+ban2ku
+2banl
+b1anna
+ban2o
+2b1ans4
+b1an3t
+2banw
+b1anz
+ba2r3ab
+ba2rad
+bar3ast
+ba2r3at
+bar3de
+ba2rei
+ba3r2en
+barer5ei
+bar3n
+b2aro
+3bar2s
+bar3sc
+b1arz
+bar3zw
+3bas
+ba3sa
+ba2sc
+bas2i
+bas4sa
+bas4sei
+bas4st
+ba2st
+ba4t3ent
+bat2o
+3bau.
+bau3b
+bauer4l
+bauer4s
+bau1fl
+bau1fr
+bau3g2
+b2auk
+bau3r
+bau1s
+bau3s2k
+baus4t
+b1a2x
+ba1yo
+3b2ä1c
+3b2äd
+2b1äh
+b2äl
+2bärz
+b2äs
+2bäug
+4b1b
+b3be
+bbe4n3
+bbens2
+bbe4p
+bb3le.
+bb3ler
+bb2lö
+b3brec
+b3bru
+bbru2c
+bb2s
+bbu1
+2b1c
+2b5d4
+bde1s
+bdome4
+1be.
+3bea
+be3an
+be3ar
+3beb
+b1ebb
+1be1c
+2becht
+2b1e2del
+bedi4
+be1e2h
+bee2l
+be1ela
+bee4rei
+be1erl
+be1ert
+be1eta
+bef4
+2b1eff
+be3g2
+begas1
+be2he.
+beh5ri
+bei3b
+2b1eier
+bei1f4
+bei4ge.
+bei3k4
+bei3l2a
+2b1eime
+be1ind
+be1inh
+bein6hal
+bein4hi
+bei3sc
+beis2e
+bei1s4t
+beit2s
+3bek
+3bel
+be3lag
+be3las
+be3lec
+4be2lek
+be2l1en
+bel3ere
+be2let
+bel3f
+be3l2i
+beli4e
+bel3la
+belle4n3
+bel3li
+be2l3om
+be2löf
+bel3sz
+bel3t
+bel4un
+1bem
+2b1emp
+2bemul
+1ben
+be5nabe
+ben3ar
+be4nas
+be4nat
+b2ene
+be3nei
+be4n3end
+be4ners
+be4ness
+ben2eu
+3beng
+be4nis
+ben3n
+5benp
+b2ens
+ben4s3pa
+ben4spr
+benst4
+3bensz
+2b1entb
+2bentd
+4benteu
+2bentf
+ben3th
+ben6thei
+bent4r
+2b1ents
+2b3entw
+ben3un
+ben3z2
+be1o
+2b1epi
+be1ra
+be2r3am
+be2ran
+ber3a2s
+berb2
+ber3d
+b4ere
+be2re2b
+ber2ec
+bere3ck
+ber4ei.
+be4r3eiw
+be4rene
+ber4erg
+ber4erw
+bere4sc
+berf4
+3berg.
+ber4g3af
+ber4gal
+berg3as
+ber4hab
+ber4in.
+be5r6inne
+berin4s
+ber3iss
+ber3kr
+ber3n2a
+b1ernt
+be2rö
+3bers.
+ber3st4a
+bert2a
+bert2e
+bert2i
+b4eru
+ber3ze
+ber2zö
+3b2e1s
+be3s2a
+bes4abb
+be4sap
+be4sar
+be2s1er
+be2s1id
+be3s4lo
+bes2po
+bes3sa
+bess4e
+b3esst.
+bes3sz
+be4stab
+beste2
+be6stein
+bester4
+bes6terh
+best2i
+bes3tin
+be4stol
+bes4to4r
+bes3tos
+best4r
+be4s5trä
+be4s3tur
+be3s4ze
+3bet
+be3tam
+bet2sp
+be1un
+be1ur
+3bev
+3b2ew
+2b3e2x
+3b2ez
+2b5f4
+bfal2
+bfal3t
+2b1g4
+b5ga
+bge3
+bgel2e
+bge5n
+bges4
+2b1h2
+b5hä
+1bi
+3bib2
+bibe2
+biber1
+bi2c
+bien3s
+bieres4
+bie2s
+biet2s
+3bietu
+bik2a
+bi2ke.
+bi2kes
+bi2k3re
+3bil
+bi3la
+bil2an
+bi4l3ans
+bi4lau
+bil4deb
+bi2lei
+4billu
+bi2lu
+2bimp
+2b1inb
+bin2e
+b1inf
+2b1inh
+bi2nok
+2b1int
+2b1inv
+bi2o3
+biri1
+3bis
+b1iso
+bi2sp
+bis2s1c
+bi2st4
+bi3sta
+3b2it.
+b2ita
+bit2an
+b2ite
+bi3ti
+bi2tu
+bi3z2
+4b1j
+bjek4to
+2b5k4
+bl4
+2bl.
+bla3b4
+2b1lac
+b3lad
+b2lanc
+b3late
+b2latt
+b2lau.
+b3laus4
+2b3law
+2b1län
+b2läse
+3blät
+b2le
+3ble2a
+b3leb
+3blec
+b3leg
+2bleh
+b4lei.
+2b3leid
+2bleih
+b3lein
+blei3sc
+2bleit
+ble3l
+2b3lenk
+b3lese
+2blesu
+ble3s4z
+b4let
+b3leu
+2blich
+3blick
+b2lie
+2blief
+2blig
+bling4
+b2lis
+2blis.
+b2lit
+b3lite
+3blitz
+b2lo
+3b4loc
+b3los
+3b4lum
+2blun
+b2lus
+3blut
+blu4tem
+blut1o
+3blü
+2b1m
+4b5n2
+bnas4
+bni2
+bnis1
+bo4a
+bo5as
+b1o2b
+bo3ben
+bob3r
+bo2c
+bo3ch2
+bo3d2
+boe1
+bo2e3i
+2b1of
+bo3fe
+boh3re
+boh4rei
+boh2u
+bo1is
+bo2lan
+bo2lau
+bol5le
+3bon.
+bon2an
+bon2da
+bon2d1e
+bo2ne
+2b1onk
+3bons
+boo2l
+boo2ti
+b1op
+3bor.
+bo1r2an
+bo2r3as
+bo4rä
+bor2da
+bor2d3r
+bo2rei
+bo4rig
+bor2s
+b1ort
+bor4ter
+bor6t5rat
+bo4ruh
+bo2sc
+bo3se
+bo4s3p
+3bot
+bote3n4e
+bo3th
+bot2st
+bot3t
+3b2ox
+bo2xo
+bö2b3
+2böf
+2b1öl
+bölk3
+2b1p4
+bpa2g
+2b1q
+b2r4
+2br.
+b4ra.
+2b3rad
+2b4rah
+b4ra3k
+brast4
+2b3rat.
+bra4t3er4
+2b3ratg
+3brä
+4bräd
+brä4u
+2bre.
+6b5rechte
+2b3red
+2b3ref
+2breg
+b3reif
+2brek
+breli1
+3b4rem
+2b3rent
+2breo
+2b3rep
+b4rer
+bret6t5en
+bri2da
+brie4fa
+2b3riem
+b4rien
+bri2er
+b3ries
+2brigk
+b4rina
+2b3rind
+b4rio
+b4risc
+b3ritt
+2b3roh
+2b3rol
+b4ron
+2b3rost
+bro4tr
+brot3t4
+2b3rou
+3b4rö
+b4ruc
+2bruf
+b4rum
+2b3rund
+brus4
+brust3
+bru2th
+3brü
+4b3rüb
+2b1s
+b2s1ad
+bs2am
+bs3amb
+b4s3amt
+bsat2
+bsau2r
+b4s3är
+b3s2äu
+b3sc
+bsch2
+b4schan
+b6schef
+bs2chi
+b4sco
+bs2cu
+b3se.
+bse2b
+b3sel.
+bse2n1
+b3sen.
+b2s1ent
+bs1erf
+bs1erg
+bs3e4r3in
+bs1erk
+bs1ers
+b3s2es
+b3set
+b2sim
+bsi4t
+b4ski
+bs2ku
+b4sl
+b2s1of
+b3s2oh
+b4sop
+bso2r
+b2sö
+b3s2pi
+bs2pl
+bs2pu
+bss2
+bs2t
+bst1a2b
+bst1ak
+bst3ank
+bs4t1as
+b3stä
+bs3tät
+bst1er
+bst3h
+b3stic
+bst3ink
+b2stip
+b3sto
+b4stob
+b4stod
+bs4tol
+b4stor
+b3stö
+b4strac
+b2s3trä
+b4s3treu
+bs4tri
+bst3ro
+b3stü
+b4stüb
+b2s1un
+bs2zep
+bs2zi
+4b1t
+bta2s
+btast3r
+b5te
+b2t3h
+b3ti
+bti2s
+bt4r
+btran2
+bts2
+b3tü1
+buche4
+bu4chec
+bucher4
+bu6ch5ers
+bu2chi
+buch3sp
+bu2e3
+bu2f
+bul2l3a
+2bumf
+2b3umk
+2buml
+2b3umr
+bun4d3er
+bunde4s
+b1une
+bung4
+b3un3gn
+2b1unh
+bur1c
+b2urg
+burg1a
+bur4gan
+bur4gar
+bur4gin
+bur2gr
+bu3r2i
+2burn
+b3ursa
+burts3
+bu2sa
+bu2sc
+bus3cha
+bu3sche
+bu6schei
+busch3w
+bu2sin
+bu2s1p
+bu2su
+bus1un
+2büb
+bü1c
+bügel3e
+2b1v
+4b5w
+3b2y1
+by3p2
+bys4
+2b1z4
+b5ze
+bzeit1
+1c2a
+cab4
+ca3bl
+ca2c
+ca2e3
+ca3g2
+ca1h
+cal2a
+cal2f3
+cal3t
+3cam
+2can
+cana3
+ca2pe
+car3b
+car5n
+carri1
+car2s
+ca3s2a3
+cas5to
+ca3t2h
+ca1y2
+cä3
+cäs2
+c1b
+2cc
+c1ce
+c1ch2
+cchi1
+c2d2
+c3do
+2cec
+1ced
+ce2dr
+ce1er
+2cef
+ce1i
+ce3in
+2cek
+3cels
+cen3a
+ce3nu
+ceo2
+1ce1r
+cere1
+cere3u
+ce3r2i
+ce3s4h
+1cet
+ceta2
+cet1am
+ce1u
+1cé
+c1f
+c1g
+c2h
+4ch.
+2chab
+ch3a2b3i
+cha2ck
+2chaf
+2ch1a2g
+2ch1ak
+chal6l5ei
+3chanc
+chan3f
+ch1ang
+4chanl
+4chanz
+3chao
+4char.
+3chara
+3chard
+3charta
+cha2sc
+chasi1
+1chato
+2chatt
+ch5austr
+chau3t
+ch1äh
+ch1ärm
+ch1äs
+1châ
+2chb
+2chc
+2chd
+che3b4
+ch3e4ben
+ch3echt
+ch1edi
+1chef
+3chef.
+che4fer
+3chefs
+2cheh
+2chei
+ch1eim
+4chelem
+che4ler
+3chemi
+2chemp
+che4neb
+che2no
+4chents
+4chentw
+cher3a
+4ch3erbs
+6chergeb
+4cherke
+cher6zie
+ch3es4s
+ches5t
+2ch1e4ta
+2ch3e4x
+1ché
+2chf
+2chg
+2chh
+1chia
+4chic
+chi3na
+4chind
+3chines
+2chinf
+2chinh
+2ch1ins
+2ch1int
+2ch1inv
+1chip.
+1chiru
+2chiso
+2chj
+2chk
+2chl4
+ch2le
+chle2i
+ch2lu
+4ch2m
+2chn4
+chner8ei.
+c4ho
+2chob
+cho2f
+ch1off
+chof4s
+ch1oh
+cho3l2a
+ch1orc
+ch1ori
+ch2os
+ch3öl
+3chör
+2chp
+ch2r4
+2chra
+ch3rad
+2chre
+ch3rh
+4chrit
+3chromo
+3chron
+4chs
+ch2spo
+ch4stal
+2cht
+ch2tru
+2chuf
+2chuh
+2chum
+2ch1unf
+2chunm
+2chunt
+2chur
+ch1urs
+2chut
+chut4t
+4chü
+2chv
+4chw
+1chy
+2chz
+ci2ak
+ci1c
+ci1es
+cill2
+ci2na2
+c1int
+ci2s1
+1cit
+c1j
+c2k
+4ck.
+ck1a
+1cka.
+2cka2b
+2cka2c
+ck2ad
+1ck2ag
+2ckal
+cka2m
+2ckan
+2ckap
+cka4r1
+1ckat
+ck1ä
+2ckb
+2ckc
+2ckd
+1cke
+2ckef
+4ckeff
+2ck1eh
+4ck1ei
+2ckemp
+cke4na
+6cken6sem
+4ckentf
+4ckentw
+cke2ra
+ck2ere
+6ckergeb
+4ck3er4hö
+ckerk4
+ck2ern
+2cke2ro
+ck1err
+6ckerzeu
+4ckese
+4ckex
+2ckf
+2ckg
+2ckh
+1cki
+2ck1id
+ck1in
+3ck4is
+2ckk
+2ck3l
+2ckm
+2ck3n
+2ck1o2
+ck3ot
+ck3ö2
+2ckp
+2ck3r
+4cks
+cks2al
+ck3sc
+ck4spen
+cks4tri
+2ckt
+ck3te
+ckt2i
+1cku
+2ck1uh
+2ck1um3
+2ckunt
+2ck1up
+2ckü
+2ckv
+2ckw
+1cky
+2ckz
+c2l2
+cle4a
+clet4
+clin2g
+cli2p1
+clip3a
+clo1
+clo2ck
+1clu
+clu4b
+c2m2
+c3me
+c3mu
+1c2o
+3coa
+co2c
+co3ch
+3co2d2
+co4de.
+co3di
+cof3f2
+coi4
+co1it
+co2ke
+co3la3
+co2leu
+co5l2o
+3com
+com4te.
+comtes4
+con2ne
+co2pe
+co1ra
+cor2da
+co4re
+cor3t
+cos3t
+co4te
+coti2
+cô4
+2cp
+2c1q
+1c2r2
+c3rä
+3cre2
+4cree
+cre4mes
+cros4
+cry2
+2cs
+cs2a
+cs4f
+c2si
+c1s2ti
+c1s4tr
+4c1t
+c3ti4
+ctio2
+ctur6
+1c2u
+2cua
+cu2e
+cu2p3
+cussi4
+c1w
+1cy
+c1z
+3da.
+da1a
+2d1ab
+d3a2bak
+d2abä
+d2abe
+d3a2ben
+d3a2bi
+d3a2bo
+dab4ra
+da2bri
+da3brie
+d2ab4rü
+d1ac
+d2ac.
+dach3a
+da2cho
+4d3achse
+d1ad
+da2de
+dad4r
+d1af
+2daff
+dafo4n
+d1ag
+dagi4
+dag2o
+dah3l
+da1h2o
+dail5
+da1in
+2d1air
+da1is
+da2kro
+dal2a
+2d1a2lar
+dal3b2
+4d1all
+da3lö
+2d1alp
+d1alt2
+2dalte
+da1lü
+3dam
+d1amma
+4d1ammä
+damo3
+d2amp
+damp7f8erf
+4d1amt
+3d2an.
+d1ana
+da2nan
+da4nat
+2danb
+dan4ce.
+d1and2
+2danda
+d2andy
+3dane
+4d3anei
+2danf
+d1ang
+2danh
+d2ank
+dan2kl
+dan2k1o
+dan2kr
+2danna
+d1a2no
+2d1ans
+2danw
+d2anz.
+2danzi
+2danzü
+2d1ap
+d2aph
+da2por
+4dapp
+4daq
+da2r1a
+2darb2
+2d3arc
+dar2da
+dar2d1e
+dare2
+daren1
+dar3g
+3darl
+dar2m1a
+dar2m1i
+dar4mu
+da2r3o
+3dars
+2d1art
+dar2th
+dar2tr
+da2ru
+d1arz
+da1s2
+da3sh
+d1as3p
+das4t
+d1asy
+da3t2e2
+date4n
+4d3atl
+4datm
+da2tom
+dat2st
+2d3atta
+3daub
+2daud
+dau3e2
+dauer3e
+2d3au2f
+2d3aug
+2dauk
+da3unt
+2d1aus3
+3daw
+d1ax
+3däc
+2d1äg
+2d1äh
+2d1ämt
+2d1änd
+2d1äng
+2d1äp
+2däq
+2därz
+2d1ä2u
+dä3us
+2däx
+2d1b4
+dbe2e
+dbu2c
+2dc
+d3ch
+4d1d2
+d3da
+d3dä
+d3de
+d3dh
+d5do
+1de
+dea2d
+de3alo
+de3ar
+de3a2t
+d2eb4
+3debü
+de1c
+de4ca.
+de2cka
+deco3
+de2del
+de2dit
+2de3e4
+de2fa.
+2d1eff
+def4l
+deg2
+de3gl
+deh2a
+dehe2
+3dehn
+2d1ehr
+d1ei
+3d2eic
+2deid
+de3i4den
+4deie
+2deig
+de3il
+3d2eim
+4deime
+4deinb
+dein2d
+de3inse
+dein6sta
+4deinw
+2deise
+d4e1ism
+dei2sp
+2dekz
+de2l1ac
+del4ade
+de3lak
+de4l3aug
+del3änd
+del3b2
+del1ec
+delei4g
+de3lein
+2delek
+2delem
+de2len
+deler2
+deler4r
+2delf.
+2delfm
+3delik
+del2la
+dell3au
+del2l1ä
+delle2
+del4l3eb
+del4lei
+del4l3er
+de2l1ob
+del2se
+del2so
+del2s1p
+del3t4
+dem2ar
+2d1emb
+dement4
+de6mentg
+dem5ents
+de3min
+2d1emot
+2d1emp
+d2en.
+den2am
+dend2
+de2n1e2d
+de4n3end
+4denerg
+den2es
+4d3en4ge.
+de2ni
+denk3li
+denko4
+de2nos
+dens4am
+den6scho
+4den4sem
+den6sere
+den6s5tau
+2dentd
+4dentf
+2d1entg
+den3th
+2dentn
+2dentw
+2dentz
+de3nu
+den6zers
+de2ob
+2deol
+de1on
+depi2
+dep4l
+2depoc
+dep5t
+d4er.
+dera2b
+der3af
+dera2n
+de3rand
+de2r3ap
+de1ra4s
+de4r3asi
+der2bl
+4d1erbs
+2derdb
+de2re2b
+de4reck
+de4r3ei4s
+d4eren
+de4r3end
+de3r4erb
+de3r4erf
+derer3n
+der3ero
+derer4t
+derer6ze
+de2r1eu
+derf4
+d4erfl
+d2erhü
+derin4f
+de6rinnu
+derin8teg
+der3k2
+4derklä
+d2erm
+de1ro
+de2rop
+derö2
+der3r
+derst2
+der3sta
+dert7ende.
+dert4ra
+6dertrag
+der8trage
+3de3ru
+de4ruh
+de4rum
+2d1erz.
+2d1erzv
+d2es.
+de2sa
+des1ah
+de4sam
+de2s1än
+de2seb
+de4se2h
+de2sei
+2d1esel
+des3elt
+de3sem
+des4end
+desen3e
+de2set
+de4sin
+des1o
+de2sor
+de2s1p
+de3spe
+dess2
+dess4t
+dest5alt
+de3stel
+des6temp
+de5stern
+des4tex
+de1sto
+dest5rat
+de3stri
+des4tum
+de2su
+des1un
+3desw
+det2
+de3ta
+deten4t
+de2thi
+2d3etw
+2d1eul
+de1un
+de1url
+de3us
+2d1e2vid
+devil2
+de2xer
+de2xis
+2d1f6
+2d1g2
+dgas3tr
+d2ge.
+dge3r
+dger2e
+dge3s
+d2gesh
+dge2t3a
+dge4t1e
+2d1h2
+dha1s4
+4dho
+d3hu
+1di
+di2a
+di3ar
+dia3s4
+diat4
+di4ath
+3dic
+di1ce
+di3chl
+dicht6er
+4d3i2co
+d2ida
+2d1ide
+2didy
+di2e
+di3e4d
+di3enb
+die4neb
+diener6l
+di3e2ni
+dienst5r
+dien3z
+di3ers.
+dies1c
+di3e2th
+3dif
+3dig
+dige2s
+dig4n
+dik2a
+dil2s3
+2d1imb
+2dimp
+din4a
+2d1ind
+di3n2e
+2d1inf
+3ding
+2d1inh
+2d1in1it
+2d1inj
+2d1ins
+2d3int
+2d1inv
+di2o3b
+dio4n3i
+dion3s4
+di3ora
+dio5s2
+di2osk
+di1p4
+di3pt
+d1i2ra
+di4re.
+di2ren
+di2rin
+di2ris
+2d1irl
+2d1irr
+di2s1a2
+2diso
+di2sp
+di3s4per
+2d1isr
+dist2
+di1s4ta
+di2s3te
+di4stra
+di4sz
+di2ta
+dite1c
+di4t3erl
+di4t3erm
+di4t3ers
+di1the
+di2tin
+di2tob
+di4t3r
+dit3s
+di2t1u
+di5v2
+di3z2
+2d1j
+2d1k4
+4d1l2
+d3la
+dla3g
+dlap4
+d3le
+dle2ra
+dli4f
+dl3m
+dl3s
+2d3m2
+4d3n2
+d5ne
+dni2
+dnis1
+do5a
+d1ob
+3d2oba
+d1of
+do2fe
+2d1oh
+doll2
+d3o2ly
+do2mal
+do2mar
+dom2e
+domen1
+do4ming
+do2mu
+do5n2a
+do3nan
+donau1
+doni1e
+2dope
+2d1opf
+do1r4a
+2d1orc
+2d1ord
+dor2f1a
+dor2fä
+dor2f1i
+dor2fl
+dor2fo
+dor2fr
+dor2f3u
+2d1org
+dori1
+d2orn
+2dort
+dor4ter
+dor4tr
+d2os.
+dose4
+do5s2k
+2dosm
+dos3s
+dost1
+dos4t3a
+doste4c
+dos4tel
+dos6teng
+dos4tes
+dos4ti
+dos4tr
+do4s2tu
+do3ta
+do2t3o
+do2tre
+do3un
+dow2s
+dox2
+d1ö
+dö2d
+dö2f
+4döl1
+döll2
+d2ön
+3d2ör
+dö2s1c
+2d3p2
+dpass3
+dpo2st
+2d1q
+d2r4
+3d4ra.
+3d4rab
+2d3rad
+2drahm
+2d3rak
+3d4ral
+d3ramp
+d3rand
+dran3k
+2d3rast
+2draub
+2d3rauc
+d4rauf
+2draum
+2draup
+2dräd
+d4räh
+2d3rät
+2d3räu
+4dre.
+2d3rea
+d4rea.
+d4reas
+3d4reck
+2d3ref
+2dreg
+3d4reh
+dre2ha
+2d3reic
+3d4reie
+d4reiv
+d4rej
+2drek
+dreli1
+4drem
+4d3ren
+4d3rep
+4d3rer
+4dres.
+d4resc
+2drese
+dres6sei
+d4rew
+2d3rez
+2d3rh
+d3ri
+d4ri.
+3d4ria
+d4rib
+2d5ric
+d4rid
+d4rie
+d5rieg
+3drif
+4driff
+d4rift
+d4rik
+d4ril
+d4rin.
+2d5rind
+2drip
+3d4risc
+2drisi
+2driss
+3d4rit
+4dritu
+2d3rob
+d3roc
+d3rod
+d4rog
+2drohr
+3d4rohu
+d4roi
+2d3roll
+2d3rose
+d4ross
+2d3rost
+2d3rot
+2d3rou
+2d3rov
+d3row
+drö2sc
+d5rub
+3d4ruc
+2d3rud
+2d3ruh
+4d5rut
+drü1b
+drü5cke
+3d4rüs
+2d1s
+ds3ab
+d2s1alk
+d4s1amt
+d2san
+ds3ane
+ds3assi
+dsau2
+d2saut
+ds1än
+ds2äu
+4dsb
+d4schef
+d4schin
+dsch4r
+d3s2co
+d2scr
+d2s1e2b
+dse2e
+d2s1ef
+ds1eh
+d4sehe
+ds4eign
+d2sein
+d2s1emb
+dsen3er
+d2s1eng
+d2s1ent
+d2s1erf
+d2serh
+d2s1erk
+ds1err
+d2s1ers
+d2s1ert
+d2serz
+dse4t
+d2s1eta
+d2s1ev
+d2sex
+d3sha2
+ds2hak
+d4shal
+d3sho
+d4shor
+d2sid
+d2s1im
+d3s2inf
+d3s2kal
+d3s2kel
+4dsl
+d4sli
+d3soh
+d2sop
+dso2r
+ds1ori
+d2sö
+ds3part
+ds1pas
+d2s1pat
+d2spä
+d2s1pec
+d4speri
+d2s3ph
+d3s2pi
+ds2por
+d6sporto
+d3spri
+d2spro
+ds2pu
+dss4
+dst2
+d4stag
+d2stas
+ds3tauf
+d4s3täti
+d2ste
+d3stec
+d3stei
+d4steil
+d5stell
+d4stem
+d4sten
+d3s4tern
+ds2ti
+ds4til
+ds4tip
+d4stoch
+ds4tol
+d5strei
+ds4tri
+d3s4tro
+ds2tur
+ds1ums
+d2sun
+ds2zen
+2d1t
+dta2be
+d3t2ac
+dtach3
+dta2d
+dt2ag
+dta2n
+d3t2as
+dt2ax
+d5tea
+d2th
+d4thei
+dt3hi
+dt3ho
+dt4hy
+d3to2
+d4to4b
+dt2op
+d3tö
+dt3r
+dtran2
+dts2
+dt3sa
+dt5st
+dtt4
+dt2un
+d3t2ur
+d3tü
+d3ty
+1du
+du1alv
+du1ar
+dub3l
+du2bli
+du1ce
+du2f
+2d1ufe
+duf4ter
+duf4to
+duf2tr
+2d1uh
+du1i
+du2kr
+du4l3art
+2d1umb
+2dumd
+2d1u2m1e
+2dumf
+2dumg
+4d3umk
+2duml
+d2ump
+2dumr
+2d1ums
+d2ums.
+2d1umv
+du2n
+2d3un3d
+dund2a
+dun4de
+2d1unf
+dung4
+2d1ungl
+2d1uni
+dun3ke
+dun2kl
+2dunr
+dun2s
+2dunsi
+dunst3r
+2dunt
+2dunw
+2d3unz
+du1os
+dur2
+dur3au
+durch3
+2d1urk
+2d1url
+2d1urn
+2d1ursa
+2d1ur3t
+du4schn
+du4schr
+du4sch3w
+2düb
+d3über
+düns3
+2d1v2
+4d1w
+dwa2
+dwa4r
+dwes2
+dwest1
+1d2y
+4dyl
+3dyn
+dy2sp
+4d3z2
+2e1a
+e3ab
+ea2be
+e4abi
+ea2b3l
+ea2bo
+ea4br
+ea2c
+eadli4
+ea2dr
+ea2g
+ea3ga4
+ea3g4l
+eakt2
+e2akta
+e3akto
+ea2la
+e3alei
+e4alem
+ea4l3ent
+ealer2
+e3a4lerg
+ealer4t
+e3alex
+e3a2lin
+e2alo
+e2alti2
+eal3tr
+ea2l3u2
+eam3
+e2am4e
+eam1o
+eamt2
+ea4na
+ean3a2r
+ea4nä
+e3anf
+e2ano
+e3ar.
+ea2ra
+e2are
+e4are.
+ea2r1ei
+ea4rene
+e4arer
+e4ares
+ea2ro
+e3arz
+e3a2sc
+easin4
+ea4sp
+eas3s
+eate2
+eater1
+e3ath
+eat3s2
+e3at5t4
+eatu3
+e3aue
+e3auf
+eau2fe
+e4aufo
+eau3g
+eau3n
+e2av
+e3ä2
+e1b
+2eba
+e3bak
+eba2p
+e3bän
+2ebea
+2ebec
+2ebed
+ebe1er
+2ebeg
+eb2el
+ebe4ler
+ebe2lo
+ebenen3
+2eber
+ebe4ras
+ebert4
+4ebes
+ebese2
+ebe4s3eh
+2ebet
+ebet4s
+2ebew
+2ebh
+2ebi
+2ebl
+e3blä
+eb3le.
+eb3ler
+eb4leu
+e3blie
+eb3lo
+eb2lö
+2ebo
+e2bob
+ebot2
+ebö2s
+2ebr
+eb4rea
+2eb2s1
+eb4sche
+ebse2
+ebs3in
+ebs3pa
+ebs3tau
+eb4stät
+ebs3tem
+ebs3t4h
+ebs3ti
+eb3str
+2ebu
+e2bunt
+ebu2t1
+eby4t
+2e3ca
+2e3ce
+ech1am
+ech1ä
+2e1che
+ech1ei
+ech2en1
+e6ch5erzi
+e1chi
+ech3l
+ech3m
+ech3n
+e2cho.
+ech1ob
+ech3ö2
+ech3r
+ech4ri
+ech5sel
+ech3ser
+echst5re
+ech3t4ei
+ech6terh
+echter8ha
+e1chu
+ech1w
+e1ci
+eci4a
+ec4k
+ecke4n1
+e4ckerr
+eck4sta
+2eckt
+3eckty
+2e1cl
+2eco
+e3cr
+ec1s
+2ect
+e1d
+ed2a
+ed2dr
+ed2e
+ede2al
+ede3n4er
+edens1
+eden4se
+eden4sp
+edeo2
+ede2r
+eder3a
+ede4ran
+eder3t2
+edes2t
+ed2i
+e3di.
+edi3an
+2edip
+edi6teng
+e3d2o
+ed2ö
+e3drei
+ed2sal
+ed4seh
+ed2s1es
+ed2si
+ed2s1o
+ed2s1p
+ed2s3tr
+ed2s1u
+edu2s
+e3dy1
+edys4
+2ee
+ee3a4
+eeb2l
+ee1c
+ee4ce
+ee2cho
+e1e2ck
+e2ed
+eede3
+eede1s
+eed3s2
+ee3e2
+e1eff
+eef4l
+eeg4
+e1ei
+ee3ing
+eein4se
+eeis3s
+eel2e
+e3e2lek
+eele4n
+eel2ö
+e2e3m2a
+ee3mä
+e1emb
+e1emp
+e1en
+eena2g
+e2e3nä
+e2enc
+e2e3ne
+een1er
+e2eno
+een3s
+een2z
+ee3o
+e2ep
+ee3po
+eer3as
+e1erbt
+e1erd
+ee3re
+eer1ei
+ee4r3en4g
+eer2e2s
+eer3k
+ee1ro
+ee1rö2
+eer2ös
+eerst4
+eert2
+ee3r2un
+e1erz
+e2e1s2
+ee3sh
+ees3k
+ee3sp
+ee3s4t
+e2et.
+eet2a
+ee2tat
+ee2th
+eet2i
+eet4r
+ee2tu
+ee1u2
+e2ew
+eewa4r
+e1e2x
+e1f
+e2f1ad
+ef1ana
+ef1ar
+e2farc
+e2fat
+2efä
+e2fäu
+2efe
+e2f1e2b
+e3fef
+efe4l3ei
+ef1em
+e2femi
+efe2n1
+3e2f1ene
+e2fent
+efer5f
+efeuil4
+3effek
+1effi
+ef2fl
+2efi
+ef1id
+e2f1ins
+efi2s
+2efl
+ef4le
+e3f4lu
+e3flü
+2e3f2o
+2efr
+ef4reih
+ef3rol
+ef3rom
+ef4ru
+ef4rü
+efs2
+ef3so
+ef3sp
+ef2tan
+ef2tei
+2efu
+e2fum
+2efü
+e1g
+eg1a2m
+eg2anz
+egd4
+e3ge
+ege4l3au
+ege8l7ei8er
+ege4ler
+ege2lo
+eg2en
+ege4n1a
+ege6nero
+ege2ra
+ege4s5tr
+ege1u
+2egi
+2egl
+e2glo
+e2glu
+e2gn
+eg3nä
+eg3ni
+ego1p
+eg4rö
+eg4run
+egs2ag
+eg4sal
+eg4s3an
+egsau3g
+eg3se
+eg4sei
+egs2e3l
+eg4sin
+eg4sk
+eg4so
+egs2pe
+egst2
+eg4sto
+eg2th
+egung4
+egus3
+2e1ha
+eh1ach
+e3h2ah
+eh2al
+ehalt4s
+e3hand
+eh1arm
+e2harz
+e3haut
+e1hä
+e1he
+eh1eff
+eh1ein
+e3helf
+eh1elt
+e4hense
+e4h3ente
+ehen4tr
+1e2hep
+2eher
+ehe1ra
+e2h1erf
+e2h1er2l
+ehe3str
+2e1hi
+eh3im
+eh1lam
+eh2l3au
+eh1lä
+ehl3ein
+eh4lent
+eh5l2er
+ehlo2
+ehl1or
+ehl2se
+ehls2t
+2ehm
+eh2mab
+eh4mant
+eh3mu
+2ehn
+eh3na
+eh3no
+2e1ho
+eho2f
+eho2l
+eh3oly
+ehö4rer
+eh2r1a2
+ehr1ä
+ehr1e2c
+eh2rei
+eh2rel
+ehr6erle
+ehr4ern
+ehre3s
+eh4rin
+ehr1ob
+eh1roc
+ehr1of
+eh1rö
+ehs2
+eh3sh
+ehst2
+eh1ste
+2eht2
+eh3ta
+eht4r
+2e1hu
+eh1unf
+e2huni
+e3hur
+e1hü
+eh3üb
+eh1w
+e1hy
+2ei3a2
+ei2bar
+ei2bli
+ei4blu
+eibu4t
+ei4b3ute
+e4ic
+ei1ce
+ei2cho
+e2id
+ei2d1a
+ei3de
+eid4ein
+ei4deis
+eid5erre
+2eidn
+ei3do
+ei4ds
+ei1e
+eie2b
+ei3e2l
+eie2m
+4ei3e2n
+eienge4
+eien3s
+eie2t
+4eif.
+ei1flo
+1eifr
+2eig.
+2eiga
+eig2ar
+2eigä
+2eigeb
+2eigeh
+4eigeno
+5eigensc
+2eig2er
+2eiges
+2eigew
+2eigi
+ei3gl
+ei4glo
+1ei2g3n
+ei4g3rat
+2eigre
+2eigrö
+2eigru
+2eigrü
+2eigs
+2eigt
+2eigu
+4eih
+ei2hum
+ei2kak
+eik4am
+eik2ar
+eik2i
+eik2l
+ei3k4la
+ei3klä
+e2il
+2eil.
+ei2lam
+eila2n
+eil3ane
+ei4lant
+ei4lanz
+ei2lar
+2eilb
+eil3d4
+ei4lein
+eile2n1
+ei2let
+eil3f4
+eilm2
+ei2lob
+eil2ö
+2eim.
+ei2mab
+ei2m1ag
+eim3all
+eim3alp
+ei2m1or
+2eimp
+eim2p4l
+eim3sa
+ei2mur
+e4i2n1a
+ei4nac
+eina2d
+ei4n3an
+ei4na4s
+ei4n3at
+ei4n3ä
+ein6derk
+ein3ebe
+ei2nel
+ei4n3en4g
+ei6nen6se
+ein5erbe
+ei4nerf
+ei4nerk
+einer6sc
+ei2neu
+ein4fiz
+2einfo
+ein4fo.
+ein4fos
+ein3g2
+3einger
+e4ingr
+e2inhä
+ei2n3ie
+e1init
+ein3k4
+ein6karn
+3einkä
+e2inl
+ein3n2
+ein4nen
+ei2n1o2
+3einric
+e4insa
+3einsat
+e2insc
+5einschä
+ein6stal
+ein6terv
+ein4tol
+3eintö
+1einu
+ei3o2
+ei1p
+eip2f
+2eir
+eir2c
+ei3re
+e1irr
+e4is.
+ei2sa
+ei3sas
+ei6schwu
+ei4serg
+ei4s3erl
+ei6s5erst
+ei4s3erw
+1eisho
+ei3s2ky
+eis2pe
+e2iss
+eisser6s
+ei1sto
+eis4tol
+ei2sum
+ei2sur
+1eiswo
+e2it
+ei2t1a2b
+ei2tal
+ei2tan
+ei2tap
+ei2tar
+ei4tat
+2eitä
+ei2tän
+eite4ra
+ei4tess
+ei2t3h
+ei2tin
+ei2tor
+ei4trau
+ei4tro
+eitsa4g
+eitt4
+4eitu
+ei4t1um
+ei2t1ur
+eit3z2
+eiv2
+eive4
+ei2zar
+eiz1in
+2e3j
+e1k
+e3k2a
+2ekä
+1ekd
+ek2e
+e3ke.
+e3ke4n
+e3kes
+e3key
+e3k2l
+ek4n
+e3k2o
+ekor4da
+2e3kr
+ek4s1p
+2ekt
+ek2tan
+ek5t6ante
+ek2t3at
+ek2tä
+ek2te2l
+ekt3erf
+ekt3erk
+ek4t3er4z
+ekt2o
+ek2t3o4b
+2e3ku
+ekur2a
+e3k2w
+1ekz
+e1la
+ela2br
+el2abt
+el3abu
+ela2ck
+el3ader
+el1af
+2elai
+e2l1ak
+el1a2m
+el2a3mi
+e3lamp
+el1ana
+e4landa
+e2l3a2ne
+e2lanm
+e4l1ans
+e2l1ant
+e4lanw
+e2l1anz
+2elao
+e2l1ap
+e2l1ar
+ela2re
+el3a2ri
+el3arr
+ela2s
+el1a4si
+el1asp
+ela3su
+2elat
+el3aufw
+2e1lä
+2eld
+el4d3erf
+elder4p
+elder4s
+eld5erst
+el3des
+el3dri
+eld3s2
+4e3le.
+e3lea
+elea2r
+ele2c
+el3echt
+4eleh
+el3ehe.
+2elei
+e6l5ei6ern
+e2l1ein
+e3leine
+1elek
+e2l1el
+1e2lem
+2e3lem.
+e3lema
+ele2mi
+2el1emp
+2e3len.
+elen1e
+elen4k3l
+e4lense
+e2l1ent
+e3lep
+2eler
+e3ler.
+eler2a
+el1erd
+e6lereig
+el1erf
+e4ler4fa
+e4lerfi
+e2lerg
+el1erh
+el1erk
+e2l1erl
+e4l3ernä
+eler2ö
+e2l1err
+el1eru
+el1erw
+eles2
+e2l1ess
+e2l1e4ta
+ele2ti
+elet4ta
+el1evo
+el1ex
+e3lex.
+1elf.
+elf2er
+1elfm
+1elft
+elgi5er.
+elgi5ers
+el3g2l
+eli4are
+e2l1id
+2e3lie
+eli3ef.
+2elig
+e2lim
+elin3a
+eli3no
+el1ita
+2elk
+elk3s2c
+el4larb
+el4lart
+el3lär
+el5le.
+ell3ein
+ell3eis
+el4lel
+el5lend
+ellenen5
+ellen5s
+ell2er
+el3les
+el2lim
+1ellip
+el2lor
+ell2ö
+ell3sp
+elm2e
+elm3ein
+2eln
+2elo
+e2l3oa
+el1obe
+e2lof
+e2lol
+e2lonk
+e2l1or
+e3lore
+elo2ri
+e3lot
+e3l2ov
+2elö
+elö2s
+el3p4
+el4s5ein
+els2ph
+el5stern
+el2sum
+el4tans
+elte4m
+el5ten.
+el4t3ent
+elter4b
+elter4f
+elter6le
+3elter4n
+elter6sc
+elte2s
+el4tesc
+el3the
+2e1lu
+el1uf
+e2l1um
+el1ur
+el3use
+elu2t
+el3uto
+e1lü
+2ely
+e2lya
+el3z2ac
+el2zar
+el4zene
+el2zwa
+2elzy
+e1m
+e2m3a2b
+em1alk
+e2manf
+e2m1ano
+e2m1ans
+em1app
+e4m1a4s3p
+em1aus
+2emä
+em2äh
+e3mäs
+1emba
+1embo
+3embry
+em2dä
+emd1r
+em2dra
+2eme
+e2m1e2b
+e2mef
+e2mele
+e3m2en
+emen6gel
+emen3ta
+emen4t3h
+e2m1erl
+em1erw
+e4mesu
+3e2meti
+e2m1i2d
+2emie
+emi2ei
+e2mig
+emi3k2
+em1im
+2emin
+emi3n2a
+e3mind
+em1int
+1e2mir
+e3misc
+1emiss
+emi3tr
+emma3u
+em2m1ei
+e2moa
+e2mof
+e2mop
+emo3s
+1empf4
+em3pfl
+em3po
+empo1s
+em2sa
+em4scha
+em2sim
+em2spr
+em2st
+em3t4
+1e2mul
+e3mur
+2emü
+e2na
+4ena.
+e4n3a2b
+4ena2c
+e4n3ack
+2e3nad
+enadi4
+e4naf
+4enah
+en3ak
+en1al
+e4nalb
+e3nale
+en2alg
+ena3l2i
+e4nalk
+e4nalm
+e4nalo
+enal3p
+4en1am
+ena4n
+e4nand
+en3ane
+e4nant
+e4nanz
+e4n3a2p
+en3a2re
+en3ark
+en3aro
+en1as
+ena2sc
+e4nast
+2enat
+4e5nati
+e4natl
+enat4s
+e4n3att
+4enatu
+enau2f
+en3aug
+e4n3aur
+e4naut
+en1a2x
+en3a2z
+e2n1ä
+e4när
+en2ce.
+1ency
+end2ac
+en2dal
+en4dang
+2endel
+ende4lä
+en4d3es4s
+en2dex
+en3d4ort
+end3rom
+end3s4au
+end3s2l
+end3s2p
+end3sz
+en3d2um
+en3d2ü
+2ene.
+ene4ben
+en1e2c
+e2neff
+en2eid
+e3neien
+e4neige
+4eneigu
+e4nein
+e4neis
+en1e4kl
+e2n1el
+ene4le
+2ene2m
+e2nemi
+2enen
+e4nense
+e4n1ent
+en4entr
+e2n1ep
+4e3ner.
+en2era
+e2n1erd
+e4n3erei
+e2nerf
+en4erfr
+1energ
+e2nerh
+e2nerk
+e2n1erl
+e4nermi
+e4n3ermo
+4enern
+e4n3erne
+ene2ro
+e2n1err
+en1ers
+4eners.
+e2n1ert
+en4ert.
+e2n1eru
+e2n1erw
+2enes
+e4n1e2sc
+e2n1ess
+en1eta
+e2neth
+en1eul
+e2n1ev
+e4ne2x
+en3f
+enf2a
+enf2u
+1engad
+1engag
+en3g2al
+enge3r4a
+en3g2i
+en3gn
+eng2o
+1engp
+eng4ra
+eng3se
+2eni
+e3ni.
+e3nic
+e2nid
+4e3nie
+eni3er.
+eni3erp
+eni5ers.
+en3i2ko
+en3ill
+eni4m
+en1ima
+en1imi
+e2nin
+e3nio
+eni2ö
+e2nir
+e4n3iso
+e3nit2
+e3niv
+enk3aus
+enk3erg
+en4k3erk
+en3k2ü
+en2nef
+en2nel
+en4ner4f
+enn3erg
+en4n3erl
+enni6ger
+2enniv
+enns2
+enn3ste
+e2n3oa
+e2n1ob
+e3nobel
+eno2br
+e2n3oc
+e2nof
+en3ol
+eno2ma
+e2n1op
+e2n1o2r
+en2ora
+eno4ri
+4enorm
+en1ost
+4e3not
+eno2w
+2e1nö
+en1ö2d
+en3sabb
+en3sac
+en2san
+en5sche
+en2seb
+1ensem
+ensen3e
+ens3ere
+en2sid
+en3spo
+ens4por
+enst5alt
+en4s3tät
+ens4tel
+ens6temp
+ens2th
+2ens4to
+enst2ü
+ens3umf
+en5t2ag
+en4tanm
+en4tanw
+ent4ark
+1entd
+en3t2el
+ente2n
+en4terb
+1entf
+2entfo
+2entfö
+1entga
+3entgeg
+en2thi
+1enthu
+1enthü
+en4tid
+1entla
+1entn
+en2t1os
+2entö
+en4t3rol
+1entsc
+1entso
+ent4sto
+1entw
+4entwet
+3entwic
+1entz
+e2n1u
+e3nu.
+e4nur
+2enu4t
+e4nuto
+e1nü
+enü1st
+4enwü
+2e1ny2
+enz2äp
+1enzep
+enz3erg
+en4z3erk
+en4zerl
+en4z3erm
+enz5ersc
+enzlan4
+enzo2l
+e1ñ
+4eo
+e1o2b1
+eo3ben
+eo3bl
+eo3br
+eo1c
+eoch2
+eo3dr
+e1of
+eo3g2
+e1oh
+eo3la
+e3o2ly
+eom2
+e1on.
+e1ond
+e1onf
+e1onh
+e1onl
+e1onp
+e1onr
+e1ons
+eo1o
+e1opf
+e1or
+e3or.
+eo1ra
+e3orb
+e3ord
+e3ors
+eort2
+e3orw
+eo1s2
+e3os.
+eo3se
+e1oste
+eot2e
+eo1ul
+e1ö2
+e1p
+2ep2a
+epa2g
+epas6ser
+2eper
+e3p2f4
+1e2pid
+e2pig
+e2pik
+1e2pile
+e3pio
+1epis
+2epist
+1e2pit
+ep3le
+1e2poc
+eport4
+1e2pos.
+ep2p1a
+ep2pei
+eppe3l
+ep4pl
+ep2pr
+2epr
+ep3sh
+ep2tal
+ept2an
+ep2tau
+e3pu
+epu2s
+4e3q
+er1a
+e3ra.
+e2rach
+e3rad.
+e3radi
+e2radj
+e2radm
+e4radmi
+e4r3adr
+eraf4a
+era2g
+e1rah
+e1rai
+er3aic
+e2rak
+e3rake
+e1rald
+eral4eb
+er3alke
+e2r3all
+er2an.
+era4na
+eran3d4
+e3rand.
+e4rangr
+e2ranh
+e2rano
+e1rap
+er3apf
+er3apr
+e2rar
+er3are
+e3rari
+er3arr
+e3ras.
+er3asc
+e1rast
+era2ß
+e3rati
+e2ratl
+er3att
+e1raub
+e1rauc
+er3aue
+erau2f
+er3aug
+e2ra2v
+e1raw
+e2r3ax
+e1raz
+e1rä
+er1äf
+er1äh
+er1ä2m
+er1äp
+e2r1äs
+er1ätz
+3erbarm
+erb2au
+erb2e
+erb2sp
+er1c
+er3chl
+erch2o
+erda3me
+1erdb
+er3de
+2erdec
+2erdel
+er4d3en4g
+erd3erw
+erdes4t
+erdeu2
+1erdg
+er2dob
+erd3st
+2erdy
+4ere.
+er1eb
+ere4ben
+e3r2ech
+er3echs
+er1e2ck
+er1edi
+ere4dit
+er1eff
+er1e2h
+ere4i
+6e3rei.
+6e3reib
+er1eig
+4ereih
+e4r3eime
+e2rein
+er3eis.
+er5eisar
+er3eisb
+er3eisf
+er3eisr
+erei5str
+er1e2l
+e2rele
+ere3lev
+ereli1
+2e3rem
+e4r1ema
+er1emb
+e2remp
+e4remu
+2eren
+e3ren.
+e3rena
+eren1e
+e4rense
+e4rentn
+e4rents
+e3renz
+eren8z7en8d
+er1epe
+2erer.
+2ererb
+er3erf
+erer3fa
+e4rerfo
+e2r1erh
+e2rerk
+erer4kl
+e2rerl
+4erern.
+e4rerne
+e2rer2o
+erer4ri
+er1ers
+4erers.
+e8rersche
+e2rert
+2ererv
+2ererw
+2eres
+er1ess
+eres3sk
+er1e4ta
+ere2th
+e4r1e2ti
+3er1eul
+ere4vid
+erf2e
+er3for
+erf4r
+4erfür
+er4g3are
+4ergebi
+3ergebn
+4ergebü
+4ergeha
+4ergehä
+ergel6s3
+erg5elst
+4ergeni
+3ergiee
+er2gop
+4ergrem
+erg3s
+ergs2o
+ergs2p
+ergs4t
+e4rh
+1erhab
+2erhai
+4erhals
+2erham
+2erhas
+3erhebu
+er3hei
+2erher
+er3hu
+2eri
+e2riat
+e3rib
+4e3ric
+e4r3ico
+e2r1id
+eri2de
+4e3rie
+eri3e2n1
+e3ri3k
+erik4l
+4e3rin.
+er1inb
+e2rind
+e2r1ini
+er1ink
+er1inl
+er1int
+e3rio
+4eris
+e2risr
+3eritr
+e3riv
+2erk.
+2erkaj
+er3ker
+1erklä
+2erkm
+2erkre
+erk5t4
+2erl.
+2erlag
+3erlaub
+3erlebn
+4erleh
+erm2
+er3mag
+er3me
+ermen4s
+er4m3ers
+er3mi
+er4n3alt
+er3ne
+er4nene
+er4nerf
+er4nerk
+3erneue
+ern1os
+2e1ro.
+e1roa
+er1ob
+ero2bl
+ero2br
+e2r1o2f
+e1rog
+e1roh
+4e1rok
+e1rol
+er3oly
+e1rom
+er3omb
+2e3ron
+er3onk
+e2roo
+er1o2p
+e4ro4r
+eror2a
+e1ros
+1erosi
+e3rosit
+e1rou
+e1row
+er1ox
+e1roz
+erö2d
+2eröh
+erö4l
+er1ös
+er3p
+er3rä
+2erren
+er3ror
+2errü
+er3s2a
+ers4ana
+ersch4
+erse4h3u
+ers2el
+er3sen
+er5s2i
+er3sk
+er3sp
+4ersted
+er3stel
+erst5ers
+4erstil
+ers4tod
+ers6tr
+er3swi
+er3sz
+ert1ab
+erta2d
+er3tat
+4erteig
+er4t3erf
+er4t3er4g
+er4ter4h
+er4terk
+er4ters
+er2tho
+4ertö
+4ertru
+erts2e
+ert3s2p
+2eru
+eruf4s3
+e4r3uhr
+er1u2m1
+er1und
+e4rundu
+erung4
+3erup
+er3use
+e2r3uz
+erü4b
+3erweck
+er4zerk
+er4z3ers
+es3ab
+e4sabe
+e3sac
+es2ach
+e2s1a2d
+e3saf
+es3ak
+e2s3all
+es3ampl
+es2ank
+es2anm
+es2anr
+es3anz
+e3sap
+es3apf
+es3a2ra
+e3sarg
+e3sa2s
+es2ast
+es3ato
+es3aus
+esa2v
+es1ax
+2esb
+esbi5er.
+e3s2ce
+esch2
+es4chem
+es4chi
+e2s3ec
+es1ehr
+e2s3ein
+ese3in4s
+es2el
+ese4nal
+ese4neu
+esen3o
+es2ens
+esen3sk
+eser4at
+ese4r1u2
+eses2k
+e2s3e2x
+2esf
+2esh
+es2har
+es3he
+2esi
+esi3er.
+e2s1il
+esi2st
+es2kat
+e4s3ke
+e4s3kl
+es3ku
+e4sky
+es3l
+2esm
+es3ob
+es2oh
+eso2r
+eso3re
+es2ort
+e3s2ö
+e3spal
+e3s4pan
+es4park
+es2pek
+e2spel
+e4spers
+e2sph
+e3s2pi
+e3s2por
+e3spra
+e3spu
+2esr
+2ess.
+es2s1ag
+essali3
+essau4s
+1essay
+2essä
+2es3sc
+es3se
+ess4erf
+ess3erg
+es4serh
+2essk
+2esso
+es2sof
+2essp
+es2s1pa
+es2spu
+es4stab
+es3str
+es3stu
+estab4b
+esta3ge
+est1ak
+es4tanb
+es4tang
+e4stant
+e1stap
+e1star
+e4starb
+e2st1a4s
+e1stat
+e4staum
+e4staus
+es2tec
+est5eing
+est5eink
+est5einl
+e1stel
+e4sten
+es4t3eng
+est5erha
+ester6ke
+es4ter4ö
+es4t3erz
+es4t3ess
+es2th
+es2tid
+e4stig
+e1stil
+e2stip
+estmo6de
+1estni
+est1ob
+e2s3tom
+est3ori
+es4tr
+es5trac
+e3strec
+e1stu
+est3ums
+es2tur
+e1s6tü
+e3sty
+e3suh
+es1um
+e2s3ums
+es3unt
+es1ur
+2es3w
+e3sy
+es3z
+es4zene
+2e1ß
+e2ß1el
+e2ßent
+eße3re
+e2ß1er2g
+e1t
+etab4
+et2abl
+eta2c
+2e3taf
+2etal
+et1a2mi
+et4an.
+et1ant
+et4at
+etat3r
+et2ax
+et1äh
+2etb
+2e3te
+ete2e
+e4t1ein
+ete3ke
+et2en
+eten3d2
+ete2o
+eter4hö
+eter4tr
+ete2s
+2etg
+et2h
+2eth.
+e3tha
+e4t3hal
+et3hä
+1et4hi
+e2thik
+1ethn
+e4thot
+et3hü
+e2tid
+eti2m
+etin1
+e4tinf
+e2tinh
+et1ini
+eti2ta
+eti2th
+2eto
+e2t1o2f
+et2on
+eto4n3al
+etons4
+e4torg
+2etr
+e4traum
+et3rec
+e2t3res
+et4ros
+ets2c
+etscher7e
+etsch3w
+et4sh
+ets1p
+et2spe
+et2ste
+et3su
+et4sum
+ett1a
+et2ta2b
+et2tad
+et2t3ak
+etta2m
+et4tang
+et4tans
+ett2as
+et2tau
+et2tei
+ette4n1
+et2t3h
+et4tim
+et2t3r
+et2t1um
+3e2tui
+e3tur
+e3tü
+2etw
+etwa4r
+1etym
+2etz
+et2zw
+eu1a2
+eu3b4
+2euc
+euch4ta
+2eud
+eude1s
+eudi4e
+eu2eb
+euer3ei
+eue6reif
+eue6reis
+eueren4
+euerer6s
+euerer6t
+eu3eri
+eu3erk
+eu3err
+eu2esc
+4euf
+euf2a
+eu2fer
+eu2g1a
+eu6gense
+eu3g2er
+eu4g3ing
+eu2gre
+eu2gri
+eugs4
+eug3sp
+eu3h
+eu1id
+eu1in1
+1e4uk
+eu2kä
+eulan2
+euland3
+eu3l2e
+eul2i
+2e1um
+e3um.
+eu3ma
+e3umb
+e3umf
+e3uml
+e3um2s
+eum4se
+eum4s1p
+e3umw
+2euna
+eun2e
+eu4nei
+e3un2g
+eu2nio
+eu4nis
+eunk2
+eun3ka
+eu1o2
+eu1p
+eu3p2f
+eu2ral
+eu4r1an
+eu4r3ast
+e2ure
+euren2
+eu4rens
+eur4er
+eur3f4
+1euro
+e3usar
+eu2sis
+eu3sp
+eust4
+eu1sta
+eu1sto
+eu1s4tr
+eut2e
+eut2h
+1eu3tha
+eu5t2o
+eut6scha
+eut6schn
+eut6schr
+2eux
+eu2za
+eu2zo
+eu2z1w
+e3ü
+e1v
+e2vak
+e3var
+eva2s
+2ev2e
+eve5ri
+evie3le
+2evor
+e1w
+ewä2s
+e2we.
+ewei4sc
+ewert4
+e3wir
+ewi2s
+e3wit
+2ex.
+e2xam
+2exas
+ex3at
+2exc
+2exd
+e2xel
+e2xem
+ex1er
+2exes
+e1xi
+2exik
+e2xil
+e2x1in
+1exis
+ex3l
+3exp
+2exs
+2ext.
+2ex2ta
+ex2tin
+1extr
+2extu
+2extv
+2exu
+e2xum
+2e3xy
+2ey1
+ey2n
+ey4ne
+eys2
+e1z
+e3z2a
+ez2ä
+e2z1enn
+e3zi
+ezi2s
+ez2o
+e3zoh
+ez2w
+é1b
+é1c
+é1g
+égi2
+é1h
+é1l
+élu2
+é1o
+é1p
+é1r
+é1s
+é1t2
+é1u2
+é1v
+é1z2
+è1c
+è1m
+è1n
+è1r
+1ën
+ê1p
+ê4t
+1fa
+fab4
+2f1ab5b
+fa2ben
+2fabf
+2fabg
+2f1a2b5l
+2fabn
+3f2abr
+2f1ab5s
+2fabw
+fa4cheb
+fa4chel
+fa2ch3i
+fa2cho
+fach3s4p
+fa2del
+f1ader
+fa2di
+fa2dr
+fa3ec
+fah6l5ent
+5fahrt
+fai3b
+f1a2ka
+fa2ke
+f3aktio
+f2akto
+3f2aku
+fa3la
+fa3le
+fal2kl
+fal4l3ei
+fall5ent
+fal6lerk
+faller6s
+fal6scha
+fal6schl
+fal6schm
+fal2tr
+f1amt
+3f2an.
+fa2nar
+2fanb
+fand2a
+fan2gr
+2f1an3k
+2fanl
+4fann
+f1anp
+2fanr
+2fanw
+2f1an3z
+2f1a2p
+f2ar
+far2b1a
+far4bel
+far4b3er
+far4bin
+farb1l
+far2bo
+far2b3r
+far2b3u
+f3arc
+3fa5ri
+far2r1a
+far2rh
+farr3s
+2f3art
+2f3arz
+fa3s4a
+fa3sh
+fa2st
+2f1astr
+fa2ß
+f3at
+f4at.
+fa2to
+f4ats
+2f1auf
+f3aug
+f1ausb
+faus4t3r
+3f4av
+fa2xa
+1fä
+fä1c
+fäh4rin
+fäh2r1u
+f1älte
+2fäq
+2f1ärm
+2färz
+fässer4
+fäs6serk
+fäs6serw
+fä2ßer
+2f1ätz
+2fäug
+2fäx
+4f1b2
+fbau1
+fber2
+2f1c
+f3ch
+2f3d4
+fdien2
+1fe
+3fe.
+featu4
+fe2c
+f2ech
+fe3che
+fe2dr
+fe2e1i
+feein5
+fe1em
+2f1e2he
+feh4lei
+f2eie
+f2eind
+2f1eing
+fe3ins.
+2f1einw
+f1eis
+5fek
+fe2l1a
+fel3au
+fe2l1ä
+fel2da
+felde4m
+feld6erh
+fel2dr
+fel4d5ri
+2fe2lek
+2felem
+fe2l1er
+fe2les
+fe2l1o
+fel4s3oh
+fels2t
+felt2
+6fel6tern
+f2em.
+fem4m
+2f1emp
+fen1a
+fen3au
+4fenerg
+fe2ni
+fe2no
+fen3s2a
+fen5s2c
+fenst2
+f1ent
+2f3entf
+f2enti
+4f3entla
+f2ento
+2f3entw
+2f3entz
+3fep
+fe2pi
+f2er.
+fe1ra
+fe2rab
+fe2ral
+fe4rang
+fer4ant
+fe4ranz
+fe2rau
+fe2r1ä
+2ferd.
+fer3da
+ferd2e3
+f2ere
+fe2re2b
+fe2rec
+3ferei
+4f3ereig
+fe4r3eis
+f4erel
+fer3ell
+fe4rer4g
+fer4fah
+ferg4
+f4ergr
+ferie4n3
+4fer4leb
+f2ern.
+fer4nei
+fe2rö
+f4erpa
+f4erpf
+f4erpl
+f4erra
+fer4reg
+ferri2
+f2ers.
+f2ert
+fert4r
+f2erz
+fess2e
+fe2st
+fest3a4b
+fest3an
+fest3ei
+fes4t1o
+fest3r
+2f1e2ta
+fe4tag
+3fete
+fet4t3a
+fetti3s
+2feu.
+feuer3ö
+3few
+2f1ex
+3fez
+1fé
+4f1f
+ffab6s
+ff1a2d
+f3f2ak
+ff3ar
+f3fas
+ff1au
+f2f1e2b
+ffe2e
+f2f1ef
+f2f1ei
+ffe3in.
+ffe5inha
+ffe2m
+f2f1emi
+ff2en
+ff3erle
+fff4
+ffi3k
+f2fim
+ffin3s
+ff1lag
+ff3le
+ff3li
+f3flu
+f3flü
+ff1ox
+ff1rak
+f3f4rä
+ff3ro
+ffs2am
+ff2s1p
+ffs3tan
+ffs3ti
+ff3stü
+fft2
+ffus3s
+4f3g2
+fgeb2
+fge3s
+4f3h2
+1fi
+3fi.
+fi2ar
+fi3at
+fid2
+fi2do
+fien3
+fi1er2f
+fi2k1as
+fi2kel
+fi2kin
+fi2kn
+fi2k1o4
+fi2k3r
+f2il
+fi2l1an
+fil3d
+fi2les
+fi3li
+fi4lin
+fil2ip
+fil2ma
+fil2mä
+fil4med
+fil4mei
+fi2lo
+2fimp
+3f2ina
+2f1inf
+fing2
+fing4e
+fing4s4
+fi3ni
+f2ink
+fin2s
+fin3sc
+fin3sti
+2f1int
+fi2o
+fi3ol
+fi2r
+fi3ra
+fi4re
+fir3me
+fi3s2a
+fi4sch3a
+fi6schei
+fisch3l
+fisch3o
+fi4schr
+fi4sch3w
+fi3s2h
+2f1i2so
+fis2p
+fi2s3t
+fite2
+fi2tin
+fit1o2
+fi4tor
+five4
+fi2xel
+2f1j
+3f2jo
+4f1k4
+fka4t3
+f2l2
+2fl.
+f3lad
+f5land
+f4lans
+f3lap
+f4lasc
+f3lats
+flauma4
+3f4läc
+4fläd
+f3län
+f3läu
+fl4e
+f5le.
+2f3leb
+f4lee
+2f5lein
+flek3
+flekt2
+f3ler
+f4lex
+f3li.
+3f4lim
+fli4ne
+f3ling
+2flins
+2f5lon
+1f4lop
+f4lor
+1floß
+1f4lot
+flo2w
+f3lö
+4flöf
+f4lög
+1f4luc
+1f4lug
+flu4gen
+flu4ger
+1f4luss
+f4lut
+flut1o
+f4lü
+f5lüm
+4f3m2
+fma5che
+fma2d
+2f3n2
+fni2s
+1fo
+f1ob
+fo2be
+2fober
+fob2l
+2f1o2f
+3foli3
+fol2k3
+fo2na
+fo4nan
+fon3au
+fon3dr
+fo3n2er
+fo4nin
+fo2nop
+fons4
+fo2nu
+2f1op
+4f3org
+fo3rin
+3form
+for4m3a4g
+for4mas
+for4m3ei
+forni7er.
+for6schl
+for4st
+for4t3ei
+for4ter
+for2th
+for2t3r
+fort3s2
+for3tu
+for2u
+fot4r
+fo2x
+1fö
+2fö2f
+2f1ök
+4f1öl
+för4s5
+4f3p4
+2f1q
+f2r2
+f3ra.
+frach6tr
+2f3rad
+2f3rah
+fra4m
+f3rand
+f5rap
+f3rat
+1frau.
+f3rauc
+2fräd
+1f4rän
+2fre.
+f3rec
+f3red
+2fref
+2freg
+f4rei.
+f3reic
+f4reie
+frei1f
+f4reig
+frei3k2
+2freim
+2frein
+2frek
+2f3rep
+2frest
+3f4reu
+2f3ric
+fricht6e
+fri3d
+fri2e
+2frig
+f4ri3k
+f3rip
+1fris
+f4risc
+f4rist
+2f3roc
+2frol
+1f4ro2n
+fro4n1a
+f4rop
+fro2s
+f3rot
+frös2
+f3ru
+f4ruc
+f3rü
+4f1s
+f2s1al
+f2sa2n
+fs3ane
+fs3ar
+f2s1a2s
+f2saut
+fs2än
+f3sc
+f4sca
+f4sce
+f4schan
+f4schef
+f4schro
+f4scr
+f2s1e2b
+f4s1ehr
+fse2n
+fs1en1e
+f2s1ent
+f2s1er
+fse4t
+f2s1eta
+f2s1i2d
+f3s2ky
+f2s1o2
+f3soh
+f3sol
+fs2on
+f3spann
+f2s1pas
+f2sph
+f3s2pl
+f3s2por
+f2spre
+f2spro
+fs2pul
+fs3s4
+fs2t
+fs3tak
+f2stas
+f3stat
+fs3tät
+f4stäti
+f3stel
+f3stern
+fs3th
+f2stip
+fs4tol
+fst4r
+f4s3tres
+fs3trü
+fs3tut
+f4stüte
+fs1ums
+f2s1un
+f3sy
+4f1t
+f4ta.
+ft1a2be
+ft1abl
+ft1af
+ft2ag
+ft1ala
+ft1an
+ft1a2r
+f3tat
+ft3att
+f2t1äu
+fte2c
+ft1eck
+ft1edi
+ft1eh
+fte2he
+ft1eig
+ft1ein
+ft1eis
+ft1eli
+ft1emi
+f4t1ent
+ft3erfü
+ft1erk
+f2t1erl
+f2t1erz
+f2t1e2ti
+f2t1ex
+f2t3h
+f4t5hei
+f3ti
+f4tid
+ft1in
+f4tinf
+f4tins
+fto2
+f2t1of
+ft3om
+f2t3ot
+f3t4ran
+ft3res
+f4tric
+ft3ro
+ft3ruh
+ft2s1
+ft4sam
+ft3s2c
+ft4sche
+ftse2
+ft4seh
+ftsen1
+fts3i
+ft3st
+ft4staf
+fts3tät
+ft4stei
+ft4stem
+ft6stier
+ft6s5treu
+ftstro4
+ft4stru
+f2tum
+ft1urk
+ft1url
+f3tü
+ftwa4
+ft3z2
+ftze3d
+1fu
+3fuc
+3fug
+f2uh
+fuku3
+f1um
+fun6derg
+2f1unf
+fung4
+2f1ungl
+2f1u2ni
+fun2kl
+fun2ko
+fun2k3r
+fun2ku
+2f1unm
+2funr
+2funt
+f2ur
+furch2
+fu4re.
+2f3url
+fus2sa
+fus2s1p
+fus2st
+fu2ß1er
+3fut
+1fü
+2füb
+fühl4sc
+fün2
+fü2r
+2f1v
+4f1w
+f1ya
+4f1z
+fz2a
+fzeiten6
+fzei8t7end
+fz2ö
+fzu2ga
+fz2w
+3ga.
+2gabf
+2gabg
+g4abi
+ga2b3l
+gab2o
+g1abr
+gab4ri
+2gabsc
+2gabtr
+ga3bu
+2gabw
+2gabz
+ga1c
+gade2r
+ga3di
+gadi4e
+2gadl
+2ga2dr
+gae2
+ga1fl
+5gag.
+ga1k
+ga2ka
+ga2ku
+gal2a
+ga3laf
+ga2lar
+2g1alau
+2g1alg
+gal3lo
+2g1alp
+2g1alta
+2g1altd
+g1a2lu
+ga2mec
+ga3mel
+gam3ma
+5g4amo
+2g1amt
+g1ana
+2ganb
+gan3d2
+2ganf
+gan2g1a
+4gangeb
+gan2gr
+gang4sp
+gan2g1u
+2g1ank
+2ganl
+2ganmu
+3g2ano
+2ganr
+gans2
+g2ans.
+2g1ansi
+2ganst
+2ganw
+ga1ny
+g1anz
+ga3pe
+2g1app
+ga1q
+3gar.
+g2ara
+2garc
+3g2ard
+ga3r2i
+2g1arm
+ga3r2o
+gar2s
+2g1arti
+ga3ru
+2g1arz
+ga2s
+g2as.
+gas3al
+ga5schu
+gase2
+ga5se.
+ga4sei
+ga4sel
+ga4se4m
+ga4sent
+gas3s2
+5g4asse.
+g4assen
+6gassess
+gas4t3el
+gast3rä
+ga3t2a
+gat2h
+2gatm
+gat4r
+gau1c
+2g1auf
+2g3aug
+g2auk
+gau5ne
+2g1aus
+2g1aut
+2g1äp
+gär3th
+2gärz
+gä4u
+2g1b4
+gber2
+gbi2
+gbon2
+gby4t
+2g1c
+2gd
+g1da
+gd2ad
+gda3de
+g2dak
+g2dan
+g2dar
+g2dau
+g1dä1
+g2dei4
+gdel6s
+gd2en
+g2d3ent
+g2der
+gd2es
+g1do
+g2dop
+gd2or
+g1dö
+g1d3r
+gd3s2
+gdt4
+ge3a2
+geb2a
+ge3ble
+geb4lin
+gebot4
+3gebü
+ge1c
+ge3ck
+ged4
+ge1e2
+ge3ec
+geest3
+3gefä
+4g1eff
+gef4l
+gef4r
+ge3fu
+gegen1
+gegen3s4
+ge3g2l
+ge3hei
+2g1eid
+ge4ie2
+2g1eif
+ge4ig
+g2eil
+gein1
+ge1ini
+ge1inn
+2g1einr
+gein5sti
+gein2v
+ge1ir
+ge2is
+2g1eise
+gei3sh
+geis4sc
+gei2st
+2gek.
+gelb1r
+gel4b3ra
+gelb3s
+gelder4
+gel6derh
+gel6ders
+ge3lec
+gele5cke
+2ge2lek
+2gelem
+ge4lene
+gel3ere
+ge4lerk
+geler3ö
+ge4l3ers
+ge2lev
+gel3f
+gel1i4m
+gel3la
+gell2i
+gel2ö
+gel3sa
+gels2p
+gels2t
+gel3ste
+gel3sz
+gel3ta
+gelt4r
+gel3z2
+gem2
+ge4ma.
+gem6e
+4g1emp
+ge3mu
+g4en.
+ge3na
+ge4n1ac
+ge4nak
+ge4n3al
+ge4nam
+ge4nar
+ge4nat
+gen4aug
+ge3nä
+ge4näu
+g2enc
+4genda.
+4g3endmo
+gen2dr
+gen3eid
+gener4f
+4generg
+ge4n3ern
+gen6erwe
+gener4z
+ge4ness
+ge3nid
+ge2nim
+gen3k4
+gen3n
+gen4sam
+gen3sk
+gen3sz
+gen3tä
+2gentf
+gen3t4h
+gen5tr
+2gentw
+geo2ri
+ge1ou
+g2e3p4
+ge1ra
+ge2ra2b
+ge2r3al
+ge3rann
+ge4rant
+ge4r3a2r
+2gerdg
+ge4rene
+ge4reng
+ge4ren4s
+ge4r3ent
+ger2er
+gerin4f
+ger4inn
+gerin4t
+4ger4klä
+g3erlas
+ger5me
+ger3no
+2g1ernt
+ge1ro
+ge2rob
+ge2rop
+ge1r2ö
+ger4sat
+4ger4seh
+ge3r2u
+g1erzä
+ge1s2
+g2es.
+ges3auf
+3gesc
+gesch4
+ge6sche.
+ge2s3eb
+4g3e4sel.
+ge4s3elt
+ge2s3er
+ge3sha
+ge3si
+ges4pi
+ges3s4t
+gest2
+gest4a
+ge3stak
+ge3st6e
+ge4s3ter
+ges3th
+ge4s3tur
+ge3t2a
+ge4tang
+ge4tant
+g1etap
+ge3ti
+get4ri
+get3s
+ge5t4u
+2g1e1ul
+ge3u4t
+ge3wa
+4g1e2x
+2g5f4
+gfi2l
+4g1g
+gga4t
+g5ge
+gge2ne
+gg2l
+g3gla
+g3glo
+g2g3n
+gg4r
+ggs2
+2g1h
+4gh.
+gh2a
+3ghale
+gh2e
+3g2het
+3g2hie
+gh1l
+3gh2r
+ghs2
+gh3sc
+g2hu
+gh1w
+gich2
+gicht1
+gi2eb
+gie3g
+gi2e1i
+gi2e3l
+giel2a
+gie3n
+gien2e
+gi4eno
+gie3re
+gie1st
+giet2
+gif2tr
+gift5s
+gi2gu
+gi2kel
+2g1ill
+gi2me.
+gi4mes
+gi2met
+2gimp
+2gind
+gi3ne
+2g1inf
+gin2ga
+2ginh
+2g1ins
+2g1int
+2ginv
+gi2ob
+2giok
+2g3isel
+git2a
+gi3tu
+gi4us
+2g1j
+4g5k4
+gl2
+4gl.
+4g1lab
+2g1lac
+2gladu
+2g1lag
+2g1lam
+2gland
+3glanz1
+gla2s1c
+glas3t4
+3g2laub
+2g1lauf
+2gläuf
+gl3b
+g2l4e
+2g3le.
+3glea
+2g3leb
+g3lec
+4g3led
+g3lee
+2g3leg
+2gleh
+g4leic
+4g3lein
+gleiter8s
+glei4t5r
+g3len
+4glenk
+4g3ler
+glerei4
+2gles
+3gles.
+g3lese
+g3lev
+g2lia
+2glib
+3g2lid
+g2lie
+2g3lieb
+2glif
+g2lik
+4glil
+g2lim
+4glin
+g2lio
+2glis
+3g2lit
+g3lite
+g2liz
+g3lize
+g2loa
+g2lob
+g2loc
+2g3loch
+g2lok
+g2lom
+g2lop
+g2lor
+2glos
+g2lot
+2glöch
+2glös
+2glöw
+2gls
+g1lu
+2g3luf
+2gluk
+4g3lun
+g2lut
+3glü
+g1lüg
+2glw
+3g2ly
+2g1m2
+g1n
+2gn.
+g2n2a
+g4na.
+2gnac
+2g5nah
+gn4al
+gna4l3er
+2gnanl
+3g2nä
+2gnb
+2gnc
+2gnd
+gn2e
+g3neh
+2gn3ent
+gne2tr
+2gnf
+2gng
+2gnh
+g2nie
+g2nif
+g4nin
+2gnint
+2gni4s3
+gnise2
+2gnk
+2gnl
+2gnm
+g2no
+g4non
+gno1r
+g3not
+2gnp
+2gnr
+2gns
+2gnt
+2gnu
+3g2num.
+g2nü
+2gnv
+2gnw
+g2ny
+2gnz
+go4a
+goa3li
+g1ob
+go3be
+2gobj
+gob2l
+2g1o2f
+2gog
+2g1oh2
+goh3ren
+go1i
+go3in
+gol2a
+gol2fr
+3gon.
+gon2e
+3gons
+goo2
+2gope
+gopf4
+go4pos
+2gopt
+gor2a
+2gord
+2g1org
+go2s1
+gos3p
+gost2
+2g1osz
+go3t2h
+got6terb
+got6t5erg
+3gou
+go1y
+gö2f
+g1öl
+3göt
+2g3p4
+2g1q
+g2r4
+g4rab
+gra2ba
+gra2bi
+gra4bl
+2g3radl
+2g3rah
+2g3rak
+gram1
+gram8m7en8d
+gram6mer
+g3rand.
+2gra2r
+grar1e
+gra2s3a
+gra4sh
+gra4sp
+gra2st
+2g3raub
+grau3f
+2graum
+grau3sk
+2gräd
+gräs1c
+g3räu
+2g5re.
+g4reb
+2g3rec
+g3rede
+g4re2e
+2g3ref
+2grege
+2g3reic
+grei4fr
+2g3reih
+g3rein
+g3reit
+g4rem
+2g3renn
+gre3no
+gren6z5ei
+grenz3w
+g4rer
+gres6ser6
+g3ret
+g3rev
+2g3ric
+gri2e
+2g3riem
+g3riese
+g4rif
+2grig
+gril4la
+4g3ring
+4g3rinn
+g4rip
+gro2ba
+gro3ber
+gro2bl
+gro2b3r
+2groc
+2groh
+2g3rol
+gron4
+2g3rose
+g4ross
+gros6sel
+2g3rost
+g4rot
+2gröh
+2gruf.
+g4ruft
+2g3ruh
+g3rui
+2g3rum
+grun2g
+3g4rup
+3grus
+3gruß
+2g3rut
+2g3rüc
+g4rün
+4g2s1
+g4s3a2b
+g3sack
+g4sa2d
+g4s3a2k
+g3sal
+g4salb
+g4sall
+g4salm
+g4salt
+gs2am
+g4s3ama
+gs3amb
+g4s3amp
+g4sant
+gsa4p
+gs3a2r
+g3sat
+gsau2g
+g3sau4r
+gsa2v
+g3säu
+g3s2c
+g4sca
+g4s3ce
+gsch4
+g4schef
+g4s3co
+gse2
+gs2e3h
+g3s2eil
+g3s2eis
+gse4kl
+g3sel.
+g4sela
+g3seln
+gs3em
+gsen1
+g4sent
+g4ser
+g3sere
+gs3er1i
+g4se4s
+gse4t
+g4seu
+gsfi2l
+gsh4
+gs3ha
+gsi2d
+gs3i2k
+g3sil
+gs3in
+g4s3ita
+gs2ki1e
+g4sm
+g4sn
+gso2
+gso4b
+g3sol
+g4s3op
+g5s4orge
+gs2pac
+gs4pant
+g4spas
+g3s2pek
+g3s2pi
+g5s4pie
+g4s3pl
+g3spor
+gs6port.
+g6sporto
+g4s3pru
+gsrat4
+gsrü2c
+gs3s4
+gs3ta
+g3stan
+g4stanz
+g3star
+gs4tati
+gs3tä
+g3steh
+g3stein
+g3stel
+gs4tell
+gste2r
+gst3err
+g1steu
+gs2thy
+g3stif
+g3stil
+g3stim
+g3stir
+g3sto
+g4stoch
+g4stod
+g4stor
+gs3tö
+gs4tör
+gs3tr
+gst4ra
+g3s4tras
+gs4trat
+gst5reit
+gst4res
+g4streu
+gst3rit
+gst3ros
+g3stun
+gs3tü
+g4sw
+g3sy
+2g1t
+g3te
+gtei3s
+gt3h
+gt4hy
+g3t2i
+gti2m
+g3to
+gt4r
+gt2s
+g3tü
+gu4ale
+gu3am
+gu1an.
+gu1ant
+gu1as
+gu1c
+gu4d3r
+gu2e
+2gued
+guet4
+2g1u2f
+2g1uh
+gu1ins
+gu1is
+gum2e
+3gumm
+gummi1
+gun2e
+2g1unf
+g2ung.
+gunge2
+4gungew
+2g1ungl
+2g1u2ni
+2g3unk
+2gunr
+gun2s
+2gunt
+gure4
+2g1url
+gur2th
+gur2tr
+gurt3s
+guru1
+gu2s
+gus3a
+gu3sc
+guschi5
+gu3se
+gus4ser
+gus2s1o
+gus2sp
+gus4st
+gu4st
+gust3a4b
+gus3te
+gust3en
+gus6tend
+gus6terl
+gus4tr
+gu2t
+gut1a
+gut3er4h
+gut3h
+gut4sa
+gut2sp
+2güb
+3gür3
+güs3
+2g1v
+2g1w
+gy3n
+gyp2a
+2g3z2
+gzeu4gi
+hab2a
+hab2e
+h3abf
+hab2i
+2habn
+h1a2br
+h1abs
+2habw
+ha4ch3en
+ha2cho
+hacks4
+ha2del
+hade2n
+h1adle
+hado2
+h1a2dr
+2hae
+ha4far
+haf2e
+h1affä
+haf3f4l
+h2aft
+haf4to
+haf2tr
+haft4s3p
+h2agg
+h1ah
+h2ahs
+h2ai
+3hai.
+h2aj
+2haka
+ha1k4l
+2h2al.
+halan4c
+h1a2lar
+ha2lau
+hal2ba
+hal4bel
+hal4bin
+hal2b3r
+hal2bu
+2hale
+hal6lere
+hal6lerf
+hal6lerg
+ha3lo
+4halp
+hal4sei
+hal4sk
+hal2sp
+hal2st
+hal4tal
+hal4tei
+hal6t3r
+h2ame
+2h1amt
+h2an.
+2hana
+ha2nal
+ha2nan
+2hanb
+h2anbe
+h2and
+han2da
+han2d3r
+hand3s
+ha2nem
+han2f1
+han6g5end
+2hani
+han2kr
+2hanl
+2hano
+2hanr
+h1ansc
+2hanz
+2h1ap
+3h2ape
+ha2pl
+ha2po
+ha2pr
+h2a3ra
+ha4rab
+2harb
+h2ard
+har2fr
+h1arm.
+har3ma
+h2arme
+har4me.
+har4ne
+ha2rom
+hart4e
+har2th
+h1arti
+har2tr
+har4tri
+har2za
+h2as
+4ha3sa
+has4c
+has2h3
+has4sa
+hasser4
+has4s3t
+has3t
+ha2str
+h1a2ß
+ha2ta
+h3atl
+ha2t3r
+2hats
+hatt2
+h3attr
+h1audi
+h1aufb
+hau5f6lie
+hau3f4lo
+2h1aufm
+h1aufs
+h3au3g
+h1aukt
+hau2sa
+hau4san
+hau2sc
+h2ause
+hau4sel
+hau6s5ent
+hau4spa
+hau4spe
+haussen6
+hau4sur
+hau2ta
+4hauto
+hau4t3r
+ha2ve.
+häde2
+h1äff
+hä2kl
+2härz
+hä6s5chen
+2häug
+häu2s1c
+hä3usp
+2h3b4
+hba4ras
+hbe3r2e
+2h1c
+2h3d4
+hdan2
+4hea
+he3be
+heb3eis
+he2b3l
+he3br
+he3bu
+he3ch2e
+he3chi
+he1cho
+h3echs
+he3cke
+hed2g
+he2dit
+he2el
+hee3le
+he1e4m
+hee2s
+he1e2t
+h2ef.
+he2fan
+he2fau
+he2f1ei
+he3f2em
+hef3erm
+2heff
+he2fid
+he4f3ing
+he2f5l
+2hefr
+hef4ra
+he2fre
+3heft
+he2fu
+he3gu
+he2hel
+h4eib
+h1eie
+h1eif
+h1eig
+he2im
+hei4mal
+hei4man
+hei4mar
+hei4mei
+heim3p
+hei4mu
+2hein
+heine2
+hei4neb
+hei6nene
+hei4n3er
+h3eintr
+4heio
+he1ism
+he1ist
+heit4s3
+h1eiw
+hekt3a
+he2l1an
+he2l3au
+hel1ec
+he2lek
+h3elem
+he2len
+h2elf
+he3li
+hel4l3au
+hel4mei
+he3lo
+he4lof
+hel2or
+he2lö
+2helt
+2h1emb
+3hemd
+he3mi
+he4mia
+h3e4miss
+3hemm
+2h3emp
+h2en.
+hen3a2
+he4nas
+he4nat
+hen3ebe
+henen1
+hen3end
+he4nene
+he4nens
+hen3erg
+he4nerm
+he2n1e4t
+henfal4
+2henga
+hen4gag
+hen4kan
+hen4kau
+henst2
+hen3str
+hent2a
+hen3te
+hen3tr
+h1ents
+2h3entw
+h3entz
+he4n3u
+hen3z2
+4he2o
+he3on
+he3op
+he3pa
+he3ph
+h1e2pi
+hept2
+h2er.
+her3a2b
+he2rad
+4herap
+he4r3a2r
+he2rat
+herb2
+h2ere
+he2re2b
+he4reck
+her4eif
+4he3reig
+he6reis.
+her7eises
+he2rel
+he4rene
+he6rersc
+he4rerw
+h1er2fo
+6hergebn
+2herif
+herin4d
+herin4f
+he6rin6nu
+herin4s
+h1erke
+her4klä
+h5erkran
+her3la
+h2ern
+he3ro
+he4r3o2b
+he4rof
+he4rop
+he4rot
+h1erör
+hert4
+her3th
+her3tr
+her3um
+her4zap
+h3erzeu
+her2z1w
+he3s4a
+4hese
+he3si
+he3s2p
+hes6tä
+he3stro
+he2tap
+he3tä
+heter2
+he3th
+het2i
+he3t4s
+h2eu
+heu3g
+he2um
+3heusc
+he3x
+he1x2a
+2hexp
+he1y2
+1hè
+2h3f4
+hfaller6
+hfan2
+hfel2l3
+hfi2s
+hflei2
+2h3g4
+hgas1
+hget4
+2h1h2
+hhoh2
+4hi.
+4hia
+hi2ac
+hi2ang
+h1iat
+4hic
+hi1ce
+hich6t5er
+hicht6sp
+2hid
+hi3d2e
+hi2e
+hi3ens
+hier3i
+hie4rin
+hiers2
+hif3f4r
+hi2k3r
+hi2l3a4
+hile3n2
+hil2fr
+h2im
+2hima
+h3i4mit
+h4imm
+h3impe
+hi2n
+hi3nak
+hi3nam
+hi3nap
+hi5nas
+h2inde
+hi3nel
+hin2en1
+h1inf
+h1inh
+2hi3n2i
+hin3n2
+hi3no
+hin3s2
+hin2t1a
+2hio
+hi3ob
+hi4on
+hi3or
+hi2p3
+hi4pl
+hips2
+hi4pu
+hi2r
+hi3ra
+2hi3re
+hi3ri
+hir2m1a
+hir2mi
+hirn1
+hir4ner
+hir2s
+1hirt
+2his.
+his2a
+hi2se
+h1i2so
+hi3tac
+hi2tan
+hi2tel
+hi1th
+hit2i
+hit3z2e
+hi2v1o
+2h1j
+2h1k4
+hkamp2
+h2keu
+h3kö
+4hl
+hl2ag
+hla2gr
+hla2l
+hlan4d3a
+hl1ans
+hl1anz
+h1las
+h1lat
+h1laut
+h1lay
+h3läche
+h1läs
+h1läu
+hlb4
+hl3d4
+h3le.
+hle3a
+h3leb
+h3led
+hle3e4
+h3lein
+h2leis
+h3leist
+h5len.
+hle4nas
+hlenen3
+hl2enn
+h4l3entr
+h4lents
+hl2enz
+h3ler
+hle2r3a
+hl4ere
+h2lerg
+hl2erk
+h6l3er4nä
+hle3run
+hl1erw
+h4lerz
+h3les
+h4lesi
+hles4t
+hlf4
+h2lie
+h3lied
+h2lif
+h2lim
+hl1ind
+h2lip
+h2lis
+h2lit1
+hl3l2
+hlm2
+h2lo
+hl1ob
+h3loc
+h3log
+hlo2re
+h4lorm
+h3los.
+h3losi
+hlos4st
+hl2ö
+h2lös
+hl4sar
+hl2ser
+hls3ka
+hl3s2lo
+hl5s6tern
+hls3tie
+hl5str
+hl2su
+hl3t2
+h3luf
+h3luk
+h3lumpe
+h1lüf
+hlz2
+2h1m
+h3mad
+h3mag
+h3mak
+h3man
+h2mant
+h3mar
+h4marc
+h3mä
+h4mäc
+h4mäh
+h4mäl
+hm2e
+h3me.
+h3med
+hme1e4
+hmeer4s
+h3mein
+h3meld
+hme3le
+h3men
+hmen2s
+hme2ra
+hme1s2t
+h3mex
+hmi2e
+h3mil
+h3mind
+h3mini
+h3minz
+h3mirr
+h2mo
+h3mop
+h3mot
+h3m2ö
+h4möl
+hm3p2
+hm2s
+hm3sa
+hms1p
+h2mu
+h3mul
+2hn
+h2na
+hna2c
+h3nag
+h3nam
+h4nar
+h4natt
+h3nau.
+h2nä
+hn1äh
+hn3d4
+hn2e
+hne3b
+hne2e3
+h2n3ef
+hn3eig
+hn3ein
+h2nel
+hne4n1
+hn4eng
+hne4pf
+h3ner
+hner4de
+hner3ei
+h4n3e2ro
+h4n3ersa
+hn4es
+hn3ex
+hn3f4
+hnflei4
+hnhof8stras
+h2nic
+h2nid
+h2nie
+hn1im
+h2nip
+hnk4
+h2nor
+hn3sa
+hn3s2p
+hns4to
+hnsuch4
+hnts2
+h2nul
+h2n1unf
+hn3z2
+ho4ar
+ho3bern
+ho2b3l
+ho2ch3
+ho4cha
+hoche2
+ho2cka
+hocker4
+ho6ckerl
+hock3t
+4hocy
+2hod
+2ho2e
+ho2f1a2
+ho2fä
+ho2feu
+hof3f4a
+ho2f3l
+ho2f1o
+ho2f3r
+ho2fu
+2hoi
+ho2l1a2
+hol3ar
+4holdy
+3hole
+ho2l1ei
+hol3g4
+hol3k
+holl2
+ho2l1op
+hol3s
+2holy
+h3olym
+3holz
+hol6zene
+hom2e
+ho2me.
+ho2mec
+ho2med
+h2on
+4hon.
+hond4
+4hone
+hon2er
+4hong
+4honh
+4honk
+4hons
+4hony
+ho1on
+hoo2r
+2hope
+ho1ra
+ho2rak
+h1o2r2an
+ho2rar
+ho2rau
+h1or3d
+2hore
+ho4rens
+ho3ret
+2h1org
+horo2
+ho2rop
+hor3ta
+hor4ter
+h1ortu
+hose2
+ho2sei
+ho3sl
+ho4sla
+4hosö
+ho2sp
+ho3spr
+ho4ßene
+2hot.
+ho3th
+4hotr
+2hot3s2
+2ho2w1
+h1o2x
+ho1y2
+4hoz
+1h2ö
+2hö.
+hö2c
+hö3ck
+h4öh
+5höhe
+hö2s1
+h3öst
+2h3p4
+h1q
+4hr
+hra2b
+hr3a2c
+hr3ad
+hr1a2g
+h1r4ah
+h1rai
+h1rane
+hr3ap
+hr3ass
+h3rat
+h3räu
+hrb4
+hr1c
+hr3d
+h2rec
+h3r2ech
+h3red
+h3ref
+hr1eh
+h4rei.
+hrei4ba
+hrei4br
+h3reic
+h3reif
+h4r3eig
+hr4eini
+h4reinl
+h4reins
+hrei3th
+hreli1
+h3rep
+hrer6geb
+hr2erk
+h4rerla
+h6rer6leb
+hr2erm
+hrer3s
+hrer4sa
+hrer6tüc
+hr2erw
+hr2erz
+h3re2s3
+hress2
+hrest2
+hre4t
+h2r1eta
+h2r1eu
+h2rev
+h3rez
+hrg2
+h2ri
+h3ric
+h4rick
+hri4e
+h3riesl
+h3rin
+hr1int
+h4rist
+hrit6tel
+hrk4
+hr3l
+hrm2
+h3rog
+h3roh
+h1ro2l
+h4romat
+h4rome
+h4romi
+h4romo
+h4ron
+h1ropa
+hro4r
+h3rou
+h3rö2s
+hrr4
+hr2s1ac
+hr4s3and
+hr3schl
+hr2sen
+hr2s1er
+hr2set
+hr4sh
+hr2sin
+hrs3k
+hrs3l
+hr4s1of
+hr3spa
+hrst2
+hr2su
+hr2tab
+hr2tan
+hr2te2l
+hr2th
+hr2top
+hrt3ric
+hrt2sa
+hrt2se
+hrt4sin
+hrt2sp
+h3ruh
+hr1ums
+h3rut
+h3rü
+h4rüb
+h4ry
+hrz2
+4hs
+h4s3acht
+h2s1a2d
+h2s1alk
+h2sall
+h4samt
+h2san
+h2s1as
+h2sath
+h2saud
+h2s3aur
+h2saut
+h2säh
+h2säug
+h4schan
+hs4cr
+h2s3ec
+hse2e
+h4s1ehr
+h2s1eie
+h4seind
+h6seinst
+h3sele
+hse4lin
+hse4mis
+h4s3endw
+h2s1erf
+h2s1erg
+h2serh
+h2s1erk
+h2s1erl
+hs1ern
+h4sernä
+hs4erne
+h2serö
+h2s1erw
+h2serz
+h2seth
+h2sex
+h3s2ext
+hsha2k
+h2s1i2d
+hs2im
+h2s3ing
+h3s4inni
+h4s3ita
+hs2kal
+h3skand
+hs1of
+h2sofe
+h2sop
+hs1org
+h2spac
+h4s3pani
+h2s1par
+h2s1pat
+h3spec
+h3spei
+h3sperb
+h2sph
+hs4pie
+h3spoi
+h2sprä
+h2spro
+hss4
+h1sta
+hs3tabl
+h2staf
+hst3alt
+h3st2an
+h2s3tau
+h2s3täu
+h1stec
+h1stei
+h1stel
+h4stele
+h3s4terb
+h3s4tern
+h1s2ti
+hs3tie
+hs4tief
+h2stit
+h1sto
+h2stol
+h2stor
+h1str
+hst3ran
+h4s3treu
+hs4tri
+hstro2
+hs3tum
+h1stun
+h1stü
+h2s1u
+hs2ung
+4h1t
+ht1a
+h2ta2d
+ht2ag
+ht4akt.
+ht4akte
+h2tall
+h4talo
+h2talt
+h4ta2m
+h2ta2n
+ht3ane
+h3t2ank
+h3tanz
+h2tap
+h2ta2r
+ht3arr
+ht2a2s
+h2t3asi
+h2tasy
+h2t3a2t
+h3tat.
+h3tate
+h2tau
+h4tax
+ht1ä
+h2tär
+ht3e4ber
+ht1e2c
+hte3cha
+h2t1e2d
+ht1eff
+ht1e2he
+h2teif
+h2t1eig
+h4t3eilz
+h2t1eim
+ht1ein
+h2t1eis
+h2t1eke
+h4t3elas
+hte6l5ei.
+h4telek
+h4t3elfe
+h4t3elit
+hte4m
+h2t1emi
+h2temp
+h4tenga
+h4t3engl
+h4t3enta
+h4tentf
+h4tents
+hter6de.
+hterer6s
+ht3erfü
+h6terfül
+h6tergeb
+ht3ergr
+hter6gri
+ht1erh
+hter6häl
+hter8höhu
+h6terleb
+h6t5erleu
+h6terneu
+ht5erspa
+hter8spar
+ht3erst
+h6tersta
+ht3erwä
+ht3erze
+h4t1e2se
+h4t1ess
+h3tet
+h4t1e2th
+h2t1eu
+h4textr
+h2t3h2
+h4thei
+h3thera
+h3thes
+ht4heu
+h4tho
+h2ti2d
+h2t1im
+h2t1i6n3
+ht3ine
+h4tisr
+htni2
+hto2
+h2t1ob
+htod1
+h2t1of
+h4t3oly
+h2tope
+ht1or
+h4tord
+ht3rak
+h3tran
+ht3rand
+h4t3ras
+ht3rat
+ht6rates
+ht3rau
+h4traub
+ht6raume
+ht3rec
+h5treck
+h4tref
+ht3rei
+h2trek
+h2t3res
+ht4ri
+h4t5ric
+h4t5rieg
+h4t5rin
+h2t3rol
+h2t3ros
+ht3röm
+ht3ru
+h2t3rü
+h4ts
+ht2sah
+ht2sal
+ht4s3a4n
+ht2scr
+ht4sein
+ht2sel
+ht4s3end
+ht4seng
+htse2r1
+ht4s3eri
+htsha2
+ht3s4hak
+hts3k
+ht3skal
+ht2s1o
+ht2sp
+hts3tät
+hts2ti
+hts5trau
+ht4s3tur
+ht4s3tür
+htt4
+htti2
+h3tub
+htu2e
+h2t1urs
+h3tü
+ht3z2
+hu2b1a
+hu2b1ei
+hu4bel
+hu2b1en2
+hu2bi
+hu2b3l
+hu4b5r
+hu2bu
+hu1c
+hu2fa
+hu2h3a
+hu2h1i
+h1uhr
+h1uhu
+hu2kä
+hu2k1i
+huko1
+huk3t4
+hu2l3a2
+hu2lä
+hule2
+hu2l1eb
+hu2l1ei
+hu2lem
+hu4l3eng
+hu4lent
+hu2l1er
+hu2let
+hu2lid
+hu2l3in
+hull2
+hu2lo
+hu2lö
+hul3s4
+hu3m2a
+h1umh
+2h1ums
+hu2n
+h1una
+hun3d2e
+hunde3i
+hunde3s
+2hunf
+hung2
+hun3ge
+hung4s
+hungsa4
+h1uni
+h1unm
+2hunt
+h1ups
+2hur
+hur3g2
+hur2th
+hu3sa
+hu2so
+hus2s3a
+hus4ser4
+hus2s1o
+hus2sp
+hus2st
+hu2tab
+hu2ti
+hu2t1o4
+hu2t3r
+hut2t
+hut4zen
+hut4z3er
+hut2zu
+h2ü
+hübe4
+h3über
+h4übs
+h3übu
+hüf2
+hühne4
+hüs3
+2h1v
+hvil2
+2hw2
+h2wall
+hwe1c
+h1weib
+h1weih
+hwein6sa
+h2wirr
+hy2lor
+3hym
+h1yo
+3hyp
+hy2pe.
+2hy2t
+2h1z
+hz2a
+h3z2o
+hzug4
+h3z2w
+i1a
+i2aa
+i2ab
+i2ache
+i3ad.
+ia3do
+i2af
+iaf4l
+i2ag
+i4ago
+i2a1h2
+i2aj
+ia2kei
+ia2kr
+i2aku
+i3al.
+i3a2l1a2
+ial3ar
+ial3as
+ia2lä
+i3al3b4
+i3alc
+i3al3d4
+i3a2leb
+i3alef
+i3alei
+ia3lek
+i3alel
+i3aleng
+i3alent
+i3alerb
+i3alerf
+i3alerh
+i3a4lerm
+i3a2l1et
+i3alex
+i3alf
+i3alg
+i3a2lia
+i3alim
+i3a2lin
+i3alj
+i3alk
+i5al3l
+iall2a
+ial4ler
+iall2i
+i3alm
+i3aln
+ia2lon
+ia2l1o2r
+ial3p
+i3alr
+i3als
+i3al3t4
+ia2l3u4
+i3alv
+i3al3z2
+i2am
+i3am.
+i3amp
+iampe4
+i3an.
+ian2a
+ia2nal
+ian3alt
+ia2nau
+i3and2
+ia2n1e2b
+ian2er
+i3anl
+i3ans
+ian2s1p
+i3ant
+i3anw
+i3anz
+ia1o
+i2ap
+ia3pf
+i2a1q
+i3ar.
+i2a2ra
+i4ari
+i3as.
+ia3sh
+i2asi
+ia3s2p
+ias3s
+iast4
+i3at.
+i4ate
+i3at2h
+i4athe
+1iatr
+i3ats
+i3au
+ia3un
+i2av
+2iä
+i1ä2m
+i1äp
+iär2
+i1är.
+iär3m
+i1ärs
+i1ät
+i3ä4tem
+iä2ti
+iä4tr
+iät3s4
+2i1b
+ib1art
+i2b1auf
+i2b1aus
+i2baut
+ib2bli
+i2b1eig
+i2b1eis
+ibe4n1
+i2b1ep
+i6ber6geb
+ibe1ro
+i2bim
+i2b1in
+i2blad
+i2bleu
+i3blu
+ib2o
+i2bö
+i2b3rau
+i2b3ren
+ib3ric
+i2b3roc
+ib2ser
+ib4ste
+ib2un
+i2b3unk
+i2b3unt
+ibus1
+2ic
+i3ca
+ic1c
+ice1s
+ich1a
+ich6art.
+ich1ä
+i1che
+ich1ei
+ich2er
+icherin5
+i1chi
+ich1l
+ich3le
+ich3li
+i3ch4lo
+ich5m
+ich3n
+i1cho
+ich3ort
+i2ch3r
+ich6sele
+ichsen3
+ich2s1i
+ich4spe
+ich6stie
+ich4tab
+ich4tan
+ich2tr
+i1chu
+ich1w
+i1ci
+ic1in
+i3cke
+ick1s
+ickt2
+i1cl
+ic3la
+i5cu
+i1d
+id2ab
+i3d2ac
+id1a2n
+i3d2ans
+i3dat
+id1au
+id2ax
+idä1
+i2dea
+1idee
+2idel
+idel4ä
+i4demu
+ide4n1o
+iden4se
+ide2on
+i3der
+4ider.
+iderin8nu
+ide1rö
+ider6reg
+ide3so
+ides2p
+2idia
+1i2dio
+idi1s
+idni3
+id2o
+i2dol
+2idoo
+i2dö
+2i2d3r
+id4ru
+i3dsc
+id2set
+id2s1p
+idt4
+2idu
+1i2dy
+ie3a2
+ie2bä
+ie2bl
+ie2b3re
+ie2bri
+ie4b3rü
+ieb4sto
+ie1c
+ie2cho
+iech3t
+ie2ck
+ie2d3an
+ie3de
+ie2dr
+ie1e2
+ie2f1an
+ie2fau
+ie2fäh
+ief1ei
+iefe2m
+ief3f4
+ief2i
+ie2f3l
+ie4fonk
+ief1r
+ie2fro
+ie2gl
+ie4g5li
+ie3g4n
+ieg3r
+ieg4ra
+ie2gre
+ieg4s3c
+ieg4se
+ieg4st
+ie2h1in
+ieh3r4
+i1ei
+ie1ind
+i2e2l1a
+iel3d4
+i2ele
+ie2l1e2b
+iel1ec
+iel3eid
+ie2lek
+i4elen
+ie4lene
+ie4leng
+ieler4e
+ieler6fi
+ieler8geb
+ieler6ke
+ieler6la
+ieler8lebn
+iel4erw
+ieles4
+ielf4
+ieli2d
+i1ell2
+ie2lo2b
+ie4lor
+i2els2
+iel3sz
+ielt2
+iel3ta
+iem2e
+2i1en
+i3en.
+i3ena
+ien1ag
+ien4am
+ie4nas
+i3enä
+i3end
+i2ene
+ien1eb
+i3enec
+i3e2nek
+iener6fo
+ien3er4g
+iener6la
+i3enex
+i3enf
+i3eng4
+ienge4f
+ienge4z
+i3enh
+ie2nim
+ie4n3in
+i3enj
+i3enk
+i3enla
+i3enle
+i3enm
+i3enn
+i3e2no
+i3enö
+i3enp
+i3enr
+ien2s
+i3ens.
+i3en3sa
+i3en3sc
+i3en3s2e
+ien3si
+ien3s2k
+i3en3s2p
+iens6t5er
+ienst5rä
+i3en3sz
+ien4tar
+i3enth
+i3enty
+ie3nu
+ie4num
+i3env
+i3enw
+i3enz
+ie1o4
+ier3a2
+ie2rad
+ie2rap
+i3erbun
+i2ere
+ie4reck
+ie4r3eis
+ie3r2er
+ierer3k
+ie4r3erz
+ie2ret
+ierf4
+ierg4
+i1ergi
+ierk2
+i1ern
+i3ern.
+i2erni
+ie1ro
+ie2rö
+ier4re.
+ier4s3eh
+ier3sei
+iers2t
+ier3sta
+ier3ste
+ier3te
+ierts4
+ier3z2
+ie2san
+i2esc
+i2ese
+iesen3s4
+ie3s4pa
+ie4spu
+ies6ser6g
+ies2st
+iess3ti
+iest6e
+ie1str
+iet1a
+ie4tag
+ie2tan
+ie2tap
+ie2tat
+ie2tau
+ie4t3ent
+ie4t3erh
+ie4t3ert
+ie4tha
+i4ethe
+iet3her
+ie2t3ho
+ie2thy
+ie2t1o4b
+ie2t1ö2s
+ie4t3ri
+ie2t3ru
+iet2se
+i1ett
+iet3zw
+ieu2e
+i2e1un
+ie2w1u
+i1e2x
+2if
+if1ar
+i2f3arm
+if4at
+i2f1au
+if1än
+i2fec
+i2f1ef
+if1ein
+if2e4n
+i2f1erg
+if1erh
+if2far
+if2f3l
+if2fro
+iff2s
+iff4ste
+if3l
+if1lac
+i1f4lä
+iflo4
+if4los
+i1flü
+if3r
+i1fre
+if4rev
+if2s
+if3sa
+if3se
+if3sp
+if3sta
+if4t3a
+if2ted
+if2t3ef
+if4t1ei
+if2te2l
+if2tep
+if4terk
+ifte2s
+if4t3esc
+if2t1op
+ift1r
+if2tra
+if4t3ri
+if2tro
+ift3sp
+ifts2t
+ift3sz
+if2tur
+i1fy
+2i1g
+iga1i
+i2garb
+ig1art
+iga3s4
+i2g3att
+igd4
+i6gebrau
+i4gefar
+ig1ein
+ige4na
+ige6nene
+ige4nid
+ige2ra
+ig5erwer
+ig1erz
+iger4ze
+i2g1ess
+i2gim
+i2gl
+i4glag
+i4g3lim
+ig4na
+i4gnä
+i3g4neu
+ig4no
+i3g2o
+igo1p
+ig3rad
+ig3re
+ig4ren
+i2grou
+ig3sa
+igs2ag
+ig4sal
+ig3sä
+ig4schr
+ig3s2o
+ig3sp
+ig4spa
+ig3stei
+ig4sti
+ig4s3to
+ig3str
+ig6stras
+ig3s4tü
+igung4
+2i1h
+i2har
+i5hea
+ihe1e
+ih1elt
+ihe4n
+ihe1u
+ih3m
+ih3n
+ih3r
+ihs2
+ih1um.
+ih1w
+ii2
+ii3a4
+i1ie
+i3ig
+ii3h
+i1im
+i3in
+i1i4s
+i2is.
+ii3t
+i1it.
+i1j
+1i2js
+2i1k
+ika2ge
+ik1ak
+ikaken3
+i2kakt
+ik3amt
+i4k1ang
+i6kantei
+ikanten8n
+ik1art
+ik3att
+i2k1au
+i3kaz
+ik1äh
+i2kär
+4ike
+i2keb
+ik1ebe
+ike2c
+i2k1ed
+i2kef
+i2k1ei
+ike4l1
+ike2n1
+i2k1ens
+ike2ra
+i2k1e4r2e
+i2k1er2f
+i5kerfam
+i2k1er2h
+i2ker2l
+i2kero
+i2ke3ru
+i2k1eta
+i3ki.
+i3kie
+ik1in
+i2kins
+iki1s
+i2k3l
+ik4län
+i3k4leri
+i3k4let
+ik4lim
+i3klu
+i2kne
+i2k1off
+iko1p2
+ik1o4ri
+iko1s
+i2köl
+ik3rä
+i2kres
+ik4ris
+i2krö
+iks2
+ik3sa
+ik3ste
+ik3sz
+ikt3erk
+ik4t3esk
+ik2t3re
+ikt2u
+i2k1uh
+i2kup
+i3kus
+i2kü
+i1la
+i2lab
+ila2br
+i4labs
+i2l1ac
+i2l1ak
+il3a2ma
+il1anm
+il1ans
+ilan6zer
+i2larb
+il1asp
+i2l1au
+i3laub
+i3l4aufb
+i1lä1
+i2lär
+2ilb
+ilb4l
+il2c
+il5chen
+il2da
+ild3ebe
+il4d3en4t
+il3der
+ild4erp
+ilde2s
+ildi2
+ild1o
+il2dor
+il2dr
+2ile
+il1e2c
+il1ein
+il1el
+i2lemb
+il1ent
+i4lentl
+i4lents
+i2l1erd
+iler4ei
+i6lereig
+il1erf
+iler4fo
+i2ler2g
+i2l1er2h
+i4lerkl
+il1err
+i4lerri
+il2erz
+ile4th
+il1ex
+ilf2
+ilfe3s
+il2f3l
+il2f3re
+ilf4s3
+il2gl
+2ilh
+2ili
+ili3e4n3
+iliga2
+ili4g3ab
+ilik4
+i2l1ind
+i4l3init
+il1ins
+i2l1ip
+i3lip.
+i3lips
+ill2an
+il4lenn
+il3l2er
+1illu
+il2mak
+il2m1ap
+il2m1au
+ilm1ei
+il2min
+il2mor
+2ilo
+il1ob
+il2of
+il2oh
+il2op
+i2l1or
+i3lou
+il1ox
+il4sein
+ils4to
+ilt2
+il3t4h
+i1lu
+i2lum
+ilung4
+il1ur
+i3lus
+ilü4
+2ilv4
+il2zar
+il2zau
+ilz1er
+il2zwa
+imad2
+ima3i
+im2al
+i2m3anh
+im1ans
+i2marc
+im3aren
+i2m1arm
+i2m1art
+im4at
+imat5sc
+ima4tur
+i2m1aus
+i2maut
+1imbi
+i2meg
+im1ein
+i2mej
+i2mek
+i2mele
+i2melf
+im2en
+i2m1erf
+i2m1erl
+i2m1erz
+i4me3sh
+i2meti
+i2mew
+i2m1i2d
+i2mim
+i2m1ind
+i2minf
+i2m1ins
+im2mä
+im2mei
+immen1
+imm3ent
+im6menth
+1immo
+2imo
+i2m1ob
+i2mo2p
+i2mö
+1imp
+imp2fa
+im3pfo
+imp2s
+im3pse
+im3sph
+2imt
+imt2e
+im3t2i
+imt3s2
+imtu2
+2imu
+im2um
+im1urk
+2in.
+in3ab
+ina2be
+in1a2c
+in1ad
+i4n3ae
+i3nald
+inaler4
+ina6lere
+in2alp
+in1am
+in2an
+in3ana
+in3ann
+i2narb
+i2narm
+in2ars
+in3att
+i2n3au
+2inä
+i2n1äh
+in2är
+in1äs
+2ind.
+inda2
+ind2ac
+in2dal
+in2dan
+2indä
+in3de
+2inde.
+ind4eid
+2inden
+ind5erke
+inde3sp
+1index
+ind2i
+1indik
+in3dö
+2indr
+ind4ri
+ind3se
+1indus
+in3d2ü
+2ine
+i4ne4ben
+in1e2c
+i3nee
+i2neff
+in4elen
+in2em
+ine3nä
+i2neng
+i4n3enzy
+i5ner.
+i4n3erbi
+in2erh
+in3erle
+i6ner6leb
+iner4lö
+i4n3er4tr
+i4nesk
+in2et
+in1eu
+ine3un
+ine2x
+in3f4
+1infiz
+1info
+2ing
+4inga
+in2g1af
+in2g1ag
+in2g1al
+in2gam
+ing1ar
+in2g3at
+3ingeni
+in3g2er
+in4g3erw
+in2gl
+in3gla
+in3glä
+in2gor
+ing4s3am
+ings6por
+ing4s3pr
+1inhab
+2inhar
+2inhau
+2inhe
+in2i3d
+2inie
+2inig
+ini3k4r
+2inis
+ini3se
+init2
+i3nitz
+3inkarn
+1inkas
+in4k3ent
+ink4er
+in3k2ü
+inma4le
+4inn.
+inne4n
+in4ner4m
+4innl
+in2nor
+1innta
+2ino
+in1od
+in3ols
+in1or
+ino1s
+inost2
+i3no3t
+i2n1ou
+i1nö
+in1ö2d
+2inri
+ins2am
+in6samt.
+insch2
+2inse.
+in2seb
+2insed
+2insen
+ins2i
+2insk
+in4sm
+3instal
+in4s3tät
+2inst2e
+ins4tip
+3instit
+ins4to
+4instra
+ins4tri
+in4strü
+1insuf
+ins3umz
+in2sur
+in3s2z
+2inta
+in3te
+2inte.
+1integ
+2inth
+inthi1
+int2o
+2intö
+2in3t4r
+4inträ
+3intrig
+int3s
+i2n1u
+i4nuh
+in3unz
+4inverm
+invil2
+i1ny2
+in3z2e
+inz2i
+inz2u
+in3zwä
+i1ñ
+2i1o
+io1c
+io2d
+io3e4
+i2of
+iof4l
+i2oh
+io3k6r
+i3ol.
+i3om.
+io3me
+i3oms
+ion2
+i3on.
+ion3an
+io2n3au
+ion3d2
+io4nee
+i3ong
+i3onn
+io2nor
+i3ons3
+i2ony
+i2oo
+i2o1p
+i3o4pf
+i3opt
+i2or
+i3or.
+i3orc
+ior2e
+iore4n
+io1r2h
+i3orp
+i3ors
+i3ort
+i3os.
+io3sh
+io5ska
+ios2p
+i2o1st
+ios2u
+i2o3sz
+io3t
+i3ot.
+iot4r
+i3ots
+i2ou
+i2ov
+i3o2x
+i3oz.
+i1ö2k
+i1ön
+i1ös.
+i1öst
+2ip.
+i1pa
+ip2an
+i1pe
+i3per
+2ipf2
+i3pfan
+iph2
+2i1pi
+ipi3el
+ipi3en
+ip2pan
+ip3pe
+ipp1f
+ip4pl
+ip3pu
+i1pr
+2ips
+ip2sa
+ip2sei
+ip2sp
+ips3t
+ip4sta
+ip4stü
+ipt2a
+ipt2u
+2ipu
+2i1q
+i1r4a
+i3ra.
+2i3rad
+i3ras
+irat2
+i1rä
+ir1äh
+ir2b3l
+ir1c
+ir2ch1o
+ir4e
+i3ree
+2irek
+ire4na
+i3ré
+irg4s
+ir2he
+ir2i
+iri3a
+2i5rig
+2irk
+irke4n
+ir4kene
+ir2k3l
+irli4n
+ir2m1ag
+ir2mak
+ir2mau
+ir2mä
+ir2m1ei
+irme4n1
+ir2m1o2
+irm4th
+ir2mum
+ir4munt
+2irn
+ir2n3a
+ir4nat
+ir2no
+i3ro
+1iron
+i1rö
+irpla4
+irre4l
+ir2rh
+ir3sche
+ir4schl
+ir4schm
+ir4sch3r
+ir4sch3w
+ir3se3
+ir3s2h
+ir2st
+irt2s3t
+2iru
+ir1u2m
+iru2s1
+i3r2ü
+i3sac
+i4samp
+i4s1amt
+is2ap
+isa2r
+is3are
+i3sat
+i2sau
+is3auf
+isau2g
+i2säh
+i2s1än
+2isb
+i2sca
+i4schar
+i3s2che
+i4schef
+i4sch3e4h
+isch3ei
+i6schemi
+i6scher6z
+i4schin
+i5sching
+i2schl
+i2schm
+isch3ma
+i4schna
+i4sch3re
+isch3ru
+i4schüb
+i4schwa
+i6schwir
+i4schwo
+isch3wu
+i4schwü
+i2scr
+2ise
+ise3a
+ise1e
+iseh2a
+ise3hi
+is4eind
+i4seint
+is4e3li
+i6sel6ter
+ise2n1
+ise4n3a2
+is2end
+isen3s
+ise4r3ei
+is1erg
+i2serh
+i2s1erm
+i2s1es4s
+is2et
+i4s3etat
+i3s2eu
+2isf
+4ish
+isi2a
+i2s1i2d
+isin3g4
+isi1s
+i4ski
+i4sku
+is3la
+3islam
+2isma
+2ismi
+i2s1of
+1i2sol
+3isom
+is2o2n3
+isonen4
+iso6nend
+i2sop
+is1org
+is1ort
+3i2sot
+2isp
+is1pa
+i2spar
+is1pe
+is1pic
+is2por
+i2spro
+is3sa
+is4s1ac
+is4sau
+iss3che
+is6schen
+iss3erf
+iss2po
+is2st
+is3sta
+iss3tr
+is3stu
+is2sum
+is4tab
+ist3a2c
+ist2an
+is3tang
+i1stat
+is3täu
+ist4e
+i1stel
+iste4n
+istes3
+i1steu
+ist2id
+i1stil
+is3t6o
+is4toc
+is3tör
+is3tr
+ist4ra
+ist3rei
+i1stro
+is4tru
+i1stü
+i3suf
+isum3p
+i2sü
+i1ß
+iß1er2s
+it1ab.
+it1abs
+ital3a
+it1alt
+it1a2m
+it1an
+ita3ne
+it3anr
+ita2po
+it1app
+it1a2re
+it1art
+i3tat
+it1au
+i3tauc
+i2taut
+4itä
+it1änd
+i2t1äs
+ität2
+it1eff
+i2t1ei
+it2eic
+2itel
+ite4l1a
+i4telek
+i2temp
+ite2n
+iten3s2
+i4tents
+i2tepo
+i6tereig
+it2erö
+i8t7ersche
+i4t1esk
+i2t1ex
+i3text
+i5thr
+i2thy
+i5tic
+i2tid
+i5tig
+1itii
+iti3ker
+it1in1
+i4tiso
+iti3sp
+iti2v5a
+itmen2
+4ito
+it1ob
+ito4be
+i5toc
+i2t1of
+it1o2p
+it2os
+2itr
+it3raf
+it3ras
+it3rau
+it3räu
+it3re
+i4tref
+it4ret
+it3rob
+it3rom
+i2t3run
+it2sa
+its1ag
+it2s1e
+it4se2h
+it4s3e2r1
+it2s1o
+2itt
+it2teb
+itt3hä
+it2t1o4b
+it2top
+it4tri
+itt3rol
+itt6schi
+itt4seh
+itt4sei
+itt4sor
+itt2sp
+itt4sti
+it1uh
+it1ums
+it2ung
+i2tuns
+ituran4
+it1urg
+itut4
+i3tü
+it2ze2c
+itz2er
+itz3erg
+it6zergr
+it4z3erl
+it2z1w
+2i3u2
+iu4m1
+iuma2
+ium4se
+iun2
+ius3t
+i1ü4
+2i1v
+i2v1ad
+i2v1ak
+i2v1am
+iv1an
+i2v1ä
+i2veb
+i2v1ef
+iv1ei
+iv1elt
+ive4n
+iv1ene
+i2v1ent
+ive3re
+iver8folge
+iv1erh
+iver4kl
+iv1erl
+iver3s
+ive3s
+i2v1e4x
+iv1ins
+i3vol
+i2vr
+i2vun
+i2v1ur
+2i1w
+2i1x
+i2xa
+ix2em
+i3xi
+ixt2
+4i1z
+i2z1ag
+i2zan
+i2z1ap
+i3z2as
+iz1au
+i2zaus
+i2zän
+izei3c
+izeits4
+i2zele
+ize2n
+i4zener
+i2z1erl
+iz1ir
+i2zo2f
+i2zö
+i2zuna
+i2z1w
+i3z2wi
+izz4a
+í1l
+j2a
+jab4
+ja1c
+jah4r3ei
+jahr2s
+ja3l2a
+ja3ne
+jani1
+jani3t4
+ja5ru
+jas2o
+ja1st
+jat2
+je2a
+jean2s
+je2g
+jek2ta
+jek4ter
+jek4tin
+jekt3o2
+jektor4
+jek4t3r
+je2p
+jes3t
+je2t1a
+je4t3h
+je2tin
+je4tor
+je2t3r
+jet3s2
+jet3t
+je2t1u2
+je3v
+je3w
+ji2a
+jit3
+ji2v
+joa3
+jo2b1
+job3r
+jo4da
+jo2i
+jong2
+jo1r2a
+jord2
+jo2sc
+3jou
+jou2l
+j2u
+ju2b3l
+jugen6
+jugend3
+ju1i
+ju2k
+ju3l2
+jung3s4
+ju3ni
+ju3r4a
+jur2o
+jus3t
+ju3t2e1
+2j1v
+1ka
+ka3ar
+2k1abb
+kab2bl
+2kabd
+2k1a2ben
+2kabf
+2kabg
+2kabh
+2kabn
+2k3a2bo
+2k1abs
+2k1abt
+2kabw
+2kabz
+ka1c
+kade2r
+2k1adm
+2k3a2dr
+3kadu
+2kadv
+ka1f4l
+ka1fr
+kaf3t2
+kag2
+kaga3
+2k1age
+3kah
+ka1ho
+ka1in
+kaken2
+ka1k4l
+2k1akt.
+4kala.
+kala3b4
+ka2lan
+kal3d
+ka2leb
+ka4l1eh
+ka4lens
+kal3eri
+3k2alk
+kal2k1a
+kal4kan
+kal2k3l
+kall2i
+2k1allt
+ka2lop
+ka2l1os
+kal4tex
+kal4th
+ka2lu
+k2amt
+kan4al
+ka4n1a2s
+ka2nau
+3kanä
+2kanb
+kan3d4
+2kanda
+2kandä
+kan2e
+2kanf
+2kanim
+kank4
+2kanl
+2kanom
+2k1anor
+2k1ans
+k2ans.
+kan4tar
+6k5antenn
+2k1anth
+ka3nu
+4kanw
+2k1anzu
+2kanzü
+ka2o1
+3kara
+2karbe
+2karc
+k2ard
+kar3d2a
+k1area
+k2arg
+ka3r2i
+kari3es
+k2ark
+2k1arm
+kar2pf
+k2ars
+k2ar3ta
+k2arte
+k1arti
+4kartik
+karu2
+k2arw
+3k2asc
+kasi1
+kas2o
+ka4sp
+ka2s3t
+2k1ast.
+ka4ste
+kas6tras
+3kasu
+ka3sz
+ka2tan
+3kateg
+ka3t2h
+ka4t3r
+2katt4
+kau4fer
+kau2f1o
+kauf4s3a
+kauf4sp
+kaufs7tem
+k2aus.
+2k1auss
+2kausw
+kau3t2
+2kauto
+2kaz
+1kä
+k1ämi
+2k1änd
+kär2
+2k1ärg
+kä2s1c
+käse3
+4k3b4
+kbo4n
+kbu2s
+kby4
+2k3c
+2k3d4
+ke2ben
+2k1e1c
+ke2di
+k1ef
+2keff
+kefi2
+kege2
+ke2gl
+ke2he.
+ke2hen
+kehr2s
+kehr4s3o
+2k1eic
+2k1eig
+kei2li
+ke2im
+2k1ein
+ke1in2d
+kein4e
+k1ei1s
+2keise
+keit2
+ke2la
+kel1ac
+ke3lag
+ke4l3am
+kel1au
+ke2lä
+kel3b4
+keld4
+kel3eis
+2ke2lek
+ke2l1en
+ke2l1er
+kel7l4e
+kell2i
+ke2l1o2
+ke2lö
+kel3sk
+k4elt
+ke2mi
+2k1emp
+k2en.
+ken1a
+ken3au
+kend4
+ken3dr
+ke2n1e2b
+kenen1
+ke4nene
+ke4nens
+kener4n
+4ken4gag
+k5en6gel.
+ke2nim
+ken3in
+4kenlad
+4kenläd
+kenn2a
+kenn2e
+ke2no
+4kensem
+ken3si
+ken3s2k
+ken5s6tei
+ken3sz
+k3en4te.
+ken6ten.
+2kentf
+2k1entg
+ken3th
+2k1entl
+2k1ents
+2kentw
+2kentz
+ken3z2
+2ke1o2
+2kep
+ke2pl
+k2er.
+ke1ra
+ke2ran
+ke2rau
+ke2r1ä
+ker4ble
+k2erc
+2kerd
+ke2re2b
+ke3reig
+ker3ein
+4kerfah
+k4erfam
+ker2fo
+ker5g
+k3ergeb
+2kergu
+ke6rin6nu
+kerin6st
+kerin4t
+k3erken
+k2erko
+k2erl
+k3er4lau
+k3erleb
+k6erlebe
+ker2na
+ker4nei
+4k3erneu
+ker6n5eur
+k1ero
+ker8oberung.
+ke1rod
+2k3eros
+ker4reg
+k2ers.
+2kersa
+kerz2
+k1erz.
+ker4zeu
+2k1er2zi
+k6es.
+ke2sa
+k1ese
+ke2sel
+kes2sa
+ke4t1a
+ket2ag
+kete4
+ke4t1eb
+ke4tel
+ke4th
+ket3ha
+ke2tu
+ke1up
+keu6schl
+2k1e2va
+2k1e2x
+key3
+4k3f4
+2k3g2
+kga4s1
+kge3s4
+2k1h4
+kho3m
+k3hu
+ki3a
+ki4ad
+kia2r
+ki1c
+2ki2de
+ki3d4r
+k2ids
+2kidy
+ki2el
+kie4lei
+kiel3o
+2kiern
+kier2s
+kier4st
+kie2z
+ki1f4l
+ki1f4r
+ki3k4
+2ki3l2a
+2kilä
+ki3lo
+3kin.
+4kindex
+2k1indi
+2k1indu
+2k1inf
+king3s
+2kinh
+k2ini
+kini3k2
+k2inn
+ki3n4o3
+kinos2
+kin3s
+2k1inse
+2k1inst
+2k1int
+ki3or
+kio4s
+3kir
+2k1i2so
+kis2p
+kis3s
+kist2
+kis4to
+kiv2
+kive4
+2kiz
+2k3j
+2k1k4
+kkab4
+kl4
+4kl.
+4kla.
+2k1lac
+klan2
+2kland
+klan3du
+k4lar
+k1last
+k1lauf
+k3laug
+2kläd
+k2lär
+k2le
+4k3le.
+kle2br
+k3leg
+2kleh
+k3leit
+k3lem.
+2k3ler
+kle2ra
+2k3leu
+kle3us
+2klic
+k2lien
+k2lif
+2klig
+3k2lim
+k2lin
+k3lin.
+3k4lina
+k4link
+k2lip
+k2lir
+k2lisc
+2klist
+klit2s
+2k3liz
+2k3loc
+klo2i3
+2klok
+3k4lop
+k3lor
+2klose
+klost6
+2klöc
+2klöf
+k2löst
+k4löt
+k1lu
+klu4b
+k2lud
+k2lug
+k2lum
+klung4
+2klux
+2k1lüc
+2kly
+2k1m
+4kma
+kma2la
+k2n2
+2k5nach
+2k3nad
+2knah
+2k5nam
+2k3näp
+k3ne
+k4nec
+kne1e
+2knes
+2knetz
+2k5neu
+2kney
+2k5niv
+kno2b3l
+k4nol
+2knorm
+2knov
+k3nu
+2knum
+k6nur
+1ko
+ko5ad
+ko2al
+2k3oas
+kobal2
+2kobj
+kob4s
+2k1o2fe
+kof3f2
+koh4a
+kohl2e
+kohle3i
+koh3lu
+koka3
+ko3l2a
+ko3le
+kol2k3
+3kom
+4k3omn
+ko4mu
+k2on
+ko2nem
+kon2i
+kon3s4
+kont6e
+ko2nu
+2kop.
+2ko1pe
+kopfa2
+kop4fen
+kop6f5err
+2kop3s
+ko3pte
+2kopz
+ko3r2a
+kor2ba
+kor2bl
+kor2br
+2k1orc
+korden3
+korder4
+kor6derg
+ko2rel
+2k1org
+ko3ri
+kor3m
+kor4nac
+kor2n3ä
+kor4no2
+2korpi
+k2os
+ko4sk
+ko2sp
+3kost
+ko2stü
+k3osz
+ko2ter
+ko3ti
+kot4r
+kot3s2
+kot4tak
+k1ou
+ko3un
+3kow
+ko2we
+2k1o2x
+1kö
+k2öf
+k1öl
+2k1p2
+2k3q
+k2r2
+2k3rad
+2k3rah
+k4ral
+k3rats
+2kraum
+k4raw
+k4raz
+k4räc
+2kräd
+k4rän
+2k3räum
+2k5re.
+2k3reak
+2k3real
+2k3rec
+2kred.
+2k3rede
+2kredn
+2kredu
+2k3ref
+4kreg
+2k3reic
+kre1i2e4
+kreier4
+k3reif
+2k3reih
+2kreim
+krei6sei
+krei4st
+kreli1
+k3ren
+k3res
+2kresu
+k3rev
+2k3rh
+2krib
+2k3ric
+2k3ries
+2krip
+k3risi
+krob4
+k4roch
+4k3roh
+k4roi
+k4rok
+k4ron
+k4rop
+2krot
+3kroth
+k3rou
+2kröh
+2kruf
+2k3run
+4ks
+ks3a2b
+k3sac
+ksa2k
+k4s1amt
+k2san
+ks3a2r
+k2sau
+k2sav
+k2säh
+ksch4
+ks2chi
+k2s1e2b
+k2s1ec
+ks1ei
+ks2eid
+ks2eif
+k4seind
+ks2end
+k2s1eng
+k2s1ent
+ks1er
+ks2ere
+k2serf
+k2serg
+k2serk
+k2serl
+k2sers
+k2serw
+k2s1e2v
+k2sex
+ks3ha
+k2s1i2d
+k2s1in
+k2s1is
+ks3kl
+k4sm
+ks1o
+ks2on
+k2sop
+k2so2r
+k2sö
+ks1pa
+k2spal
+k3s2pat
+k2spä
+k3spe
+ks2pel
+k2sph
+ks2por
+ks2pul
+ks3s4
+k1st2
+k2stal
+k4s3tanz
+k3stat4
+k3stäl
+ks4tel
+ks2tep
+k4stier
+k2stit
+ks4tol
+k2stor
+k4strop
+k2stuc
+k2stum
+k2stur
+k2stüt
+k2s1u
+k3sul
+ks2zen
+4k1t
+kt1abr
+kt1abs
+k2t1ad
+kt1akt
+k3tal
+kt1am
+kt1an
+kt2and
+k2t1a2r
+kta4re
+kta3ri
+k2t1au
+kt3aug
+ktä3s
+kt1äu
+kt1ein
+k4t1ela
+kte4n1
+kten3s2
+k2tent
+k4tentf
+k4tents
+kten3z
+kte1ra
+kt4ere
+k4t3erfo
+kt1erg
+k2t1erh
+k2terö
+kte3ru
+kt1eta
+k2tex
+k2t3h
+k2ti2d
+kti2me
+kt3ing
+kt1ini
+kt3inn
+k2tins
+ktion4
+kt2is
+kti2s1e
+kti4ter
+k2t1of
+k3t4ran
+kt3ras
+k2t3rau
+k4tref
+kt4ro
+ktro1s
+kt3run
+kt3rü
+kt3s
+kts4a
+kts2el
+ktsen1
+kts1o
+kt4sor
+kts2pa
+kts4t
+kts2ti
+kt1s2z
+ktt2
+k3tub
+kt1ums
+k2tuns
+kturen4
+k3tü
+kt3z
+ku2al
+ku1c
+kud4r
+3kug
+ku2h
+2k1uhr
+ku3la
+ku3l2e
+ku3l2i
+4kulp
+kul4to
+kul2tr
+kum2e
+2kumg
+2k3uml
+kum2s1
+k2u3n2a
+kun3da
+kunden3
+kung4
+kun4s4
+kunst3
+2kunt
+2kunw
+2k1up.
+kur2bl
+ku2rei
+kuri2e
+kuri4er
+2k1urk
+ku2ro
+kurs1c
+kur2sp
+kur4ste
+kur4str
+2k1urt
+kus3a2r
+ku4schl
+ku2sp
+ku2s3t
+ku2su
+2kut.
+1kü
+kü1c
+3küne
+3kür
+kür4s
+2k3v
+2k1w
+k3wa
+2k3z2
+kze3l
+3la.
+la3ar
+l1ab
+3l2ab.
+la3b2a
+l2abä
+2labb
+lab2br
+2labd
+2la2ben
+4labf
+4labg
+2labh
+3labil
+la2bit
+2la2b3l
+2labn
+3lab2o
+4labo.
+la3b4ra
+2labs
+la2bus
+2labw
+2labz
+la1ce
+la2ce.
+l2ache
+lacks2
+1lad
+2l1ada
+2ladd
+3laden
+la3d2i
+2ladj
+2l1adl
+2ladm
+2l1a2dr
+3l2adu
+2laf
+la2fa
+la2f1ei
+laf1r
+laf3s
+laf3t4
+la2fu
+3lafü
+la2g1a
+lag3d
+l2ager
+4lagg
+la2gio
+lag3l
+la4g3n
+lago4
+la2gob
+2la1ho
+3lai
+lake2
+la2kin
+l2akk
+la1k4l
+la2kro
+lak3t
+2l1al
+3lala.
+la2lar
+3lali
+4lalt
+l2ama
+lami3t
+lam2m1a
+1lammf
+2lamn
+la2mor
+l2amp
+2l1amt
+lamt4s
+la4mun
+la2na
+la3nad
+la3nan
+la4nat
+la4nau
+2la4nä
+3l2and
+lan2da
+lan4dam
+land3au
+lan6d5erw
+lan6d5erz
+lan6d5inn
+lan2d3r
+la2nem
+lan3erd
+laner4f
+2lanf
+lan6g5esc
+lang3s4
+2lanha
+l2anhe
+2lanl
+2l1ann
+l1ano
+la2nof
+2l1anp
+2lans2
+l1ansi
+2lantw
+2lanw
+lan2z1w
+3lao
+2l1apf
+la2ph
+l1a2po
+lap2pl
+la2r1an
+2larc
+lar1e2b
+la2r1ei
+la2rel
+la4rene
+larf4
+lar3g
+lar3ini
+2larm.
+la2ro
+2l1arom
+l1ar3t
+lart4h
+l3arti
+3laru
+l2as.
+la4sam
+la4sä
+4lasd
+la5seb
+la4sei
+la4s1e2l
+l2asg
+2lash
+la2sin
+la2sis
+2lask
+la2so
+2la4sp
+3lasser
+lass4tr
+l2a2st
+las4t3an
+la4ste
+las4t3ri
+la4stu
+lat2ak
+la3t2e
+la4tel
+la5t4i
+2l3atl
+2latm
+lat2o
+la2tö
+la2t3ra
+lat4ri
+lat2s
+lat3st
+2lat2t1a
+lat4tan
+lat4tex
+lat2th
+lat4t3in
+lat2t3r
+latzer4
+1laub.
+lauben6s5
+lau2b3r
+laubs1
+laub4se
+lau4fin
+lau2fo
+lau4fri
+1laug
+lau3gl
+2laun.
+la4us
+3l2aus.
+2l1ausb
+lau6scha
+2lausd
+2lausf
+2lausg
+2lausl
+2lausr
+2l1auss
+2lausw
+2lausz
+2lauto
+lau2tr
+la3va
+lave4n
+1law
+lawa4
+l2ay
+lä1c
+3läd
+2l1ähn
+2lämt
+1länd
+2l1äpf
+2läq
+lär4mar
+l1ärme
+2lärz
+lä2s1c
+2lät
+2läub
+2läuc
+2läue
+1läuf
+2läug
+2läx
+1là
+4l1b
+l3bac
+l2bant
+lb3a2ri
+lbau1c
+lb1ärm
+lbb4
+lbby4
+l4b3eink
+l4b3eise
+lbe4ral
+lbe3rei
+lberin5
+lbe7s
+l4b1e4ta
+l2b1id
+l2b1ins
+l3b2lat
+l3blä
+lb3le
+l2bled
+l2bli
+l3blo
+l3b2lö
+l3b2lu
+l2b1o2ra
+lb3rea
+lb2s
+lb3sa
+lb3se
+lb4sh
+lb3si
+lb4sk
+lb3so
+lb3sp
+lbs4t
+lbst3ac
+lbst3ei
+lbst1u
+l2b1uf
+l3bum
+lbu4n
+lbzei2
+2l1c
+l3ca
+l3che
+l4chei
+l4chent
+l3chi
+lch3le
+lch3li
+l3chlo
+lch3n
+lch1ob
+lch3r
+lch3s2
+lch3ü
+lch1w
+l2ck
+l3cl
+l3co
+4l1d
+ld3a2b1
+ld2ac
+ld3a2ck
+l2dad
+l2daf
+lda2g
+l2d1ah
+l2d1ak
+l2d1al
+l2d1a4n
+ld3ane
+lda2r
+l2d3ari
+ld1arm
+ld1ass
+l3dat
+l4d3ato
+l2d1au
+ld3aus
+l3däm
+ld1är
+ld1ät
+l3de.
+lde4ben
+l2dein7
+l2deis
+l2d1elf
+l2d1e2mi
+l2d1ems
+lde4na
+lden5erg
+l4dentl
+l3der.
+l4d3erfa
+l6der6geb
+ld1erh
+l4der4he
+l3d2erl
+l6d5erlas
+l3d2ern
+l2d1er2p
+lder4tr
+lde3sa
+l2d1es2s
+lde3str
+l2dex
+ld1id
+ld1i4mi
+l2dob
+l2dop
+ldo2r
+l2d1ori
+ld2os
+ld2ö2
+ld3r
+ld4ram
+l2dran
+l2drec
+ld5rie
+ld4ris
+l3d4ru
+l2drüc
+ld3sa
+lds4an
+ld3st
+ldt4
+ld3th
+ldt5s
+ld3tu
+l2d1ul
+l2d1um
+ldwes4
+1le
+le2ad
+le3ar
+le2as
+leben4s3
+le2bl
+le2b3re
+2lec
+lech1a
+le2chi
+lech7t6e
+le2er
+le3f2a
+2l1eff
+le2g1ab
+leg1as
+le2gä
+lege1i
+le2gl
+lego3
+leg4r
+3leh
+4lehe.
+leh3r2e
+4lehs
+4leht
+lei4ble
+l2eid
+leif1a
+lei4fan
+lei4fei
+leifer6g
+leif3s
+2l1eig
+3leih
+lei3l2
+leim3p
+l2ein.
+l2eind
+lein4du
+l4eine
+lei6nerb
+le2inf
+le2ini
+4leink
+4l3einsa
+2leint
+l2einu
+le4is
+leisch5a
+lei8schei
+lei6scho
+lei6sern
+l1eisf
+leis6s5er
+l4eist
+lei4str
+lei4ßer
+l2eit
+lei2ta
+lei4to
+leit3sk
+leit3s4t
+3leko
+2lektr
+2lekz
+3l2ela
+le2le
+le3lei
+2lelek
+4leleme
+le3len
+le3les
+2lelf.
+l2eli
+l2em.
+le2mau
+le2m1ei
+3lemes
+3lemet
+lem1o2
+le2mor
+2lemp
+lem3s
+le2mu
+le4mun
+l4en.
+len1a
+le4na2d
+le4n3an
+le4n3a4t
+2lency
+4lendet
+l1endp
+4lendun
+le2n1ed
+4lenerg
+le4neur
+4leneuv
+len4gag
+len4kau
+len4k3lo
+len4klu
+l1enni
+len6sein
+4len4sem
+len3ska
+len3sz
+2lentf
+2l1entk
+4lentla
+2lentn
+4l3en4tro
+4l3entw
+lent4wä
+5lentwet
+2lentz
+2l1enzy
+leo2f
+le1os
+2lep
+3lepa
+3lepf
+4l1e2pi
+3lepr
+lep5t
+l2er.
+l2e1ra
+le2rag
+le2rap
+le2ra2s
+le2rau
+le2r1ä
+le2re2b
+ler2e3c
+l3ereig
+le4r3ei4m
+le4r3eis
+le2rel
+le4reng
+le4rerg
+lerer5k
+le4rers
+l3erfas
+2l1erfo
+l2erfr
+l2erfü
+l1erg
+l2erga
+l4ergef
+3lergeh
+6lergen.
+l4erger
+l4erges
+3l4ergew
+2lergi
+l2ergl
+l2ergr
+4l3erhol
+lerin4s
+lerk2
+l2erka
+2lerke
+l1erkl
+4lerklä
+l4erkle
+l2erko
+ler3kr
+ler3l
+5l6erlebe
+3l4erlei
+2lermä
+ler4nal
+3l4erne
+ler4nei
+2l1erö
+3l2erra
+ler4ric
+l4ers.
+l1ersa
+lers2t
+ler4sto
+le2rup
+l4erwa
+ler4wer
+2ler2wo
+2l1erz
+ler2zä
+l3erzeu
+ler2zo
+l4es.
+les2am
+les4e
+le3sei
+2l1esel
+le3s4h
+lesi1
+le3sk
+les4ki
+les2ko
+le2spo
+lest6
+le1sta
+leste3r
+lester6i
+les2ti
+le1sto
+le1str
+3lesu
+4lesw
+2lesy
+2le2tap
+2le2tat
+le2thi
+let2i
+letsche6
+let4tel
+let4top
+lett1r
+letts2
+le2u
+4leue
+3le3u2f
+l2euk
+2l1eul
+le3unt
+2leuro
+3l2eut
+le2vol
+2lex
+3lexik
+le2xis
+4l1f
+l3fah
+l2f1ec
+lfe1e
+lf3einh
+l2feis
+lf2en
+l4ferei
+lfe4rel
+lf1erl
+l3fi
+l3f4lä
+lf3led
+lf3lo
+l3f4lu
+lf3ram
+lf3res
+lf4ru
+lf4rü
+lf2spe
+lf2s3ti
+lf2su
+lfun2
+lfur1
+2l1g
+l3gas
+lga3t
+lgd4
+lgen2a
+lgens4
+lgeräu3
+l2geti
+l3g2i
+lg2lö
+l3go
+lg4p
+l3g4ra
+l3g4ro
+lgung4
+2l3h2
+4lhe
+3lhi.
+1li
+li2ad
+li4am.
+lian2g
+li2ast
+3lib4
+libi1
+li1c
+lich4ta
+lich4to
+4lick
+li2cka
+li2cl
+li3d2a
+2l1ido
+li4ds
+3lie.
+liebe4s5
+li1efa
+3liefer
+li1efk
+li3efl
+lie4n1a2
+li3ene
+lien3s
+lie4rei
+lier4sp
+lie2s1c
+3lig
+li4g3ers
+lig4n
+lig4ra
+li2gre
+li3ker
+lik2o
+likop4
+lik2sp
+lik4ter
+lik4t1o2
+lik2u
+li3l
+lil2a
+li3m2a1
+limas4
+limat4
+2limm
+3limo
+2limp
+lin2a
+li3nar
+2l1indu
+li2nef
+li2neh
+li2nep
+li2nes
+2l1inf
+2l1inh
+li5nie
+lin1it
+2l1inj
+lin4kan
+lin4kar
+link2s
+li2nol
+l2ins.
+l2insa
+4linsel
+2linsp
+2linst
+2l1insu
+2linsz
+2l1int
+li3nu
+2l1inv
+2linz
+li2o
+li4om
+3li1pf
+3lipt
+3lis.
+li3s2a
+li3schm
+li4schu
+4lis2h
+li3shi
+2l1isl
+2lisol
+2lisot
+li2sp
+liss4
+3list
+lit4a
+li2tal
+li3t2ä
+l2i3t2e
+li4t3r
+lit1s2
+lit3se
+lit3sz
+li3tu
+li6tun
+li4tur
+litz4er
+3liu
+liv2e
+li2vea
+li2ves
+livi3e
+li3vr
+4lixi
+li2zau
+li2z3ä
+lizei3
+4l3j
+2l1k
+l3kale
+lk1alp
+l3k2an
+l3kap
+l3kar.
+lk1erd
+lke3r2e
+lk2l
+lk3lad
+l3k4las
+lk3lic
+l3k4lu
+lk2men
+lk4ne
+lk5ner
+lkor2b1
+l2k3ru
+lk2s1
+lkse2
+lk4spe
+lks3t
+lkt2
+lk2ü
+4l1l
+l2labk
+ll2abr
+l2labt
+l3labu
+l3lage
+lla3gl
+l2l1am
+ll3a2ma
+l3lame
+ll2anb
+lla4ner
+l3lans.
+ll4anwa
+ll1anz
+ll1arm
+l4latm
+ll3att
+ll3aufg
+ll1aus
+ll1äm
+l2lär
+llb4
+llch4
+lld4
+ll5ebene
+l3lec
+ll1ech
+lle3er
+l2l1ef
+ll1eic
+ll1eim
+ll2eis
+l4leise
+lle2la
+l3len.
+lle4na
+llen3dr
+ll5en6dun
+l4lentf
+l4lents
+l3lep
+l3ler.
+lle2ra
+ll2ere
+l6lereig
+ller4fo
+l8lergene
+l4lergo
+l4l3ermi
+l4l3ernt
+ll3ertr
+ll2es
+ll1exe
+llf4
+llg2
+lli4gan
+l2limb
+l2l1ind
+l4linf
+ll1ins
+ll3k4
+ll3l2
+ll5m2
+ll3n2
+ll1ob
+l2lobe
+l2lof
+ll3ol
+ll1opf
+ll1or
+l4lorb
+l2lo2ri
+l2l1ou
+l3low
+ll2säu
+ll2s1es
+ll3ska
+ll2spr
+ll3t
+llt2e
+llt2i
+llti2m
+llts2
+ll1ur
+llus5t6
+l3ly
+ll3z2
+2l1m
+l2m3a2b
+l2m1ad
+lm1a2ge
+lm1aka
+l2m1a2m
+l3mana
+lm1apf
+lm1art
+lm3att
+lm1äst
+lmbu2
+lm1c
+lmd2
+lm3e4dit
+l2m1ef
+l2m1e2p
+lmer2
+l2m1erf
+l2m1erl
+l2m1erz
+l4messa
+l2m1id
+lm1ind
+lm1ins
+l2mof
+lm1orc
+lm3p2
+lmpf4
+lm3s2k
+lms6t
+lm3ste
+lm3s2z
+lm3t4
+l2mum
+l4munt
+4ln
+lna2r
+ln3are
+lnd2
+l3n2e
+lnes2s
+l2nin
+lnus2
+l1nü
+l1ny
+1lo
+lo4ak
+3lob.
+l2oba
+3lobb
+lobe2s
+2lobj
+l1o2bl
+l2obr
+lob4ri
+lo4chel
+2loe
+l1of
+lo2fe
+lo4gh
+lo2gl
+lo2gor
+lo2gre
+loh2e
+4l1ohr
+loi4r
+3lok
+4l3okk
+lo2k3r
+5loks
+l4ole
+2l3o2ly
+lomä3
+lo2min
+lo4nin
+lo2n1o
+lo2o
+2lope
+lop2p1a
+2lopt
+lor3am
+lor2an
+lo4rä
+3lorb
+2l1orc
+2l1ord
+lo3r2en
+4l1or3g2
+4lork
+4lorp
+2lort2
+lo4sa
+3lose
+lo4ske
+lo2spe
+lo2spr
+lo4ste
+los3to
+los3t4r
+4loß
+lo2ta
+lot4e
+lot2h
+lo3tha
+loti4o
+2l1ov
+lo2ve
+2lox
+1lö
+lö2b3
+2löck
+2löd
+lö2f
+2l3öfe
+2l1öhr
+2lök
+2l1öl3
+2löp
+3lösc
+3lösu
+4löß
+4löz
+2l1p
+lp2ar
+l4p1är
+lp2f
+lph4
+l3phä
+l2phir
+lp1ho
+l3phr
+lpt4
+l3pu
+2l1q
+2l3r2
+lrau2s
+lrebs2
+lre1s
+lrö2
+lrut4
+4l1s
+ls3a2b
+l3sac
+l2s1a2d
+ls2al
+l4s1amb
+l4samp
+ls2amt
+l2san
+ls3ane
+l3sare
+l3sarg
+l3sark
+lsau2
+lsau4m
+lsau4r
+l3s2äm
+ls2äug
+ls1äus
+l4schin
+l4schmü
+lschs2
+l2s1e2b
+l3seil
+ls2ele
+ls1eli
+ls1er
+l2serf
+l2serg
+l2serh
+l2serk
+l2serl
+l2sers
+l2serw
+lse2t
+ls1eta
+ls2ext
+ls3ha
+l2s1id
+l2simp
+ls2kal
+l3s4kele
+ls2ky
+l2sop
+l4s3ort.
+l3s2öl
+l2spac
+l2s3ph
+l2s1pir
+l3s2pit
+ls2po
+l3spri
+ls2pu
+l3spul
+ls3s4
+lst2a
+lstab6
+ls3tabl
+ls4taf
+lstahl3
+l2stas
+l4stat.
+l4state
+l4s3täti
+l2ste
+l3stea
+l3stec
+l3steh
+l3stei
+l4steil
+l3stel
+l3stemp
+l4sten
+ls4t3erk
+ls6terne
+ls6terns
+ls2tie
+ls4tip
+l2stit
+l4stoch
+ls4tol
+ls4tri
+ls6tru
+l2s3trü
+ls2tu
+ls4tüm
+l3suf
+ls1um
+l2s1un
+ls2und
+ls3unk
+4l1t
+l2tab
+lt1abs
+ltag4
+lt1alg
+lt1am
+l4tame
+ltampe4
+l5t2an.
+ltan3d
+l2t1ap
+lt1ara
+lt1art
+l3tarta
+l3tartu
+l2t3ato
+l2t1au
+lt3aut
+lt1äh
+ltbau1
+lte2c
+lt1eh
+l3tehu
+lt1eig
+lt1ein
+l2t1eis
+l4t1elt
+lte3mi
+lt2en
+lten6gel
+lten4sp
+lt3ents
+lte4ral
+lter4fa
+l3t2erg
+lter6ken
+lter4nä
+lt2erö
+lter4se
+l4t1esk
+lt2est
+lte3str
+l2t3h
+l3thas
+l4thei
+lt4hem
+l3t4hu
+l3tic
+l2ti2d
+ltimo4
+l3tine
+lti3t
+l2t1o4b
+l2t1o2f
+l4tord
+l4torg
+l4t1o2ri
+lto2w
+lt1öl
+lt1ös
+l4t1öt
+ltra3l
+lt3räu
+lt3rec
+lt3rei
+lt3ris
+lt3rol
+l2t3rö
+l4ts
+lts2eh
+lt2se2l
+lt4s3ort
+lt2s1pe
+lt3s2ph
+lt2sti
+lt3t
+l3tub
+lt1uh
+l2t1um
+lturan4
+ltu2r1i
+l3tü
+lu1an
+4lu2b3
+luba2
+lubs2
+lu2dr
+lu2es
+1lu2f2
+2l1ufe
+2luff
+lu3fo
+luf4t1a
+luft3e
+luf4tei
+luft3r
+lu2g1a
+lu2g1e2b
+lu2gei
+lugen1
+lu2g3i
+lug3l
+lu2go
+lu2g3r
+lug3sp
+lu2gu
+2l1uh
+lu1id
+lu1is.
+lul2ö
+lumbi1
+2lumd
+lume4
+2lumf
+2lumg
+2l1umh
+2lumk
+2luml
+l2ump
+1lumpe
+lum2ph
+2lumr
+2l1ums
+lu3mu
+2l1umw
+2lumz
+1lu2n
+2l1una
+2l1unf
+lung4sc
+2l1uni
+2lunr
+2l1uns
+2lunt
+2lunw
+4luo
+2lur
+l2ura
+lu2r1an
+lu2rei
+lu2ri
+l1urn
+lu2ro
+l1urt
+lu4ru
+2luse
+lu2sp
+lus4s3a
+lus2s1c
+lus4sei
+lus4s3er4
+lus2s1o
+lus4s1p
+lus2s3t
+lus4stä
+1lu2st
+lus6terl
+lus4t1o2
+lust3re
+lu2s1u
+lu2t3a
+lu4tas
+lu4tau
+lu2tä
+lu2t1e4g
+lu2tel
+luter2
+lu4t3erg
+luter4s
+lu6t5ersa
+2luto
+lu2t1o4f
+lu2top
+lu4t1or
+lu4t3r
+lut5schl
+3lux
+2lüb
+3lübd
+lück4e2
+lücker3
+5lüd
+2lüh
+lü2hel
+lüh1l
+2l1v2
+lva3
+l3vl
+lv3r
+4l3w
+2lx
+1ly
+ly1a
+ly3c
+2lymp
+3lyn
+ly3no
+ly1o
+ly3onn
+3lys
+ly3t
+2l1z
+l2z1ac
+l2z1ag
+l2zan
+l2z1ap
+l2zat
+lz1aus
+l2zäp
+l2zär
+lze2l
+l2zele
+l4z3enth
+l2z1er2h
+l2z1id
+lzi4m
+lz1imi
+lz3l
+l2zo2f
+l2zö
+lz3t2
+l2z1u4fe
+l2z1ur
+lzvol2
+lz1w
+lz2wec
+l2zwu
+1ma
+3ma.
+maa2
+m1ab
+m3a2bar
+m2abä
+2mabb
+m2abe
+2m3abf
+2mabg
+2mabk
+m2abli
+2mabm
+m2ab4ra
+ma2bri
+2mabs
+2mabt
+ma3chan
+mach2e
+mach8terh
+mach8t7ers
+mach4tr
+ma2ci
+mack2s
+ma3dac
+mada2m
+m2adä
+ma2del
+2m1adm
+2m1a2d4r
+ma4d2s
+mae4
+ma1f4
+mag2a
+ma2ge.
+ma2geb
+ma2gef
+ma2geg
+ma2gek
+ma2gep
+ma4ges.
+ma2get
+ma2gev
+ma2gew
+2m1agg
+magi5er.
+magi5ers
+ma3gl
+ma3g4n
+2m1ago
+mahl4st
+ma1ho
+mai4s3e
+ma2ke.
+2m1akt
+mal2ag
+mal1ak
+ma4lakt
+ma2lan
+ma2l3at
+ma2lau
+2mal2de
+m2aldi
+ma3l2e
+ma4lex
+mali1e
+mal3lo
+2mallt
+m2alp
+mal3t
+malu4
+ma2l3ut
+3malv
+ma2mid
+mam3m
+2m1a2nal
+ma2nar
+2m1a4nat
+ma2nau
+2m1anä
+2manb
+man2ce
+man3d4
+man3ers
+ma2net
+m2anfr
+man3g2
+m4angel
+man4gl
+2m1angr
+m2anh
+3manip
+2manl
+m2anle
+5m2ann
+2m1ansa
+2mansä
+man2th
+mant3he
+2mantw
+manu3
+2manw
+2manz
+m1anza
+ma2or
+ma1q
+4marag
+mar2an
+2marb
+mar3g2
+3ma1rh
+ma3r2i
+m2ark
+mar2kr
+4mar2o
+maro3d
+4marr
+mar6schl
+mar6schm
+mar6schr
+mar2sp
+mar2su
+2m1arti
+ma3r2u
+m1arz
+3mas
+ma3s4a
+mas2e
+ma3s2p
+massen3
+mas4st
+mas4ta
+mas4tel
+mas4ti
+mas4to
+mas4tr
+ma4s3z
+3maß
+ma2ta2b
+ma2tan
+ma2tä
+m3a2tel
+ma4t3erd
+ma4t3erz
+m4atme
+2matmo
+ma4tort
+mat3se
+mat3sp
+matt4r
+mat3url
+2m1au2f
+3maul
+3ma3un
+mau3r
+2mausd
+mau2ta
+m4ay
+ma1yo
+1mä
+2m1ähn
+mäh1r
+2m1änd
+2mäo
+2m1äp
+2mäq
+mär1
+mär2kl
+mär2z
+mär4zer
+3mäß
+mä3t4r
+mäu2s1c
+2m1b2
+mbe2e
+mbera2
+mbe3r2e
+mbert4
+mb4l
+mble1i
+m3b4r
+mbu3sc
+mbut2
+mby4t
+2mc
+m3ch
+2m1d
+m2dan
+m2d1a2s
+md3ato
+md1är
+mde2a
+m2dei
+mder2
+m2d1erl
+md3ras
+md3s2e
+mdt4
+m2d1um
+1me
+me3a
+meb4
+me2ben
+3mebr
+me1c
+medi3e4
+me1ef
+me3e4n1
+mee4rei
+2m1eff
+meg4
+mega3
+me4gel
+3meh
+meh6l3er
+meh6rert
+2m1eif
+2m1eig
+m2ei3l2
+mein4da
+meinde3
+meiner6k
+3m2einu
+3m2eist
+me3l4ant
+me2l1au
+melb2
+mel3d2
+melde3i
+me2lek
+2melem
+me2ler
+melet4
+2melf.
+3melk
+mel4k3ei
+mell2
+3melo
+me2lob
+mel2se
+mel3t4
+6mel6tern
+2m1e2mis
+2m1emp
+2m1e2mu
+me3nage
+me4n3an
+men3ar
+me4nas
+men3au
+2m1endl
+menen1
+4men4gag
+men3ge
+me2nim
+men3k4
+men2on
+men4se.
+6mensemb
+men4sen
+men4ser
+men6ses
+men2so
+menst4
+m4enta
+men4t3ak
+ment5eig
+men6t5ers
+2mentn
+ment4sp
+me1o
+2meou
+2meö
+2mepa
+2m1e2pi
+3m4er.
+me1ra
+me3rak
+mer4a3s4
+mera3um
+me2re2b
+me4rens
+mer4err
+mer4erw
+mer3f
+4m3ergän
+me3rid
+merin4d
+merin4t
+4merklä
+mern3s2
+m4ersh
+mer3sm
+mer4sto
+mert4r
+merz6eng
+3mes
+me2sal
+me4sä
+4meser
+mes2po
+mes1pr
+2mes2sa
+mess3an
+mes6ser6g
+mes4s1o
+mes2sp
+mes2st
+me1sto
+me3sze
+me3ta
+meta1s
+me3th
+me4trig
+met6t5en6d
+me3tu
+meu1
+2m1ex
+me2xe
+1mé
+2m1f4
+mfi2le
+2m1g2
+2m1h4
+1mi
+mi3a2b
+mia2n
+mi1ä
+mibi1
+mic1e
+mi1ch
+mi2ci
+mi3da
+mi2di.
+mi3dr
+2midy
+mie3dr
+mi3ele
+mi4e3no
+mien3s
+mierer4
+mie4rob
+mie1s
+mie2ti
+mie4to
+mie2tr
+mi1f4
+3mige
+mi3h
+mi2k1an
+mi2kar
+mi2kel
+mi2kin
+mi3k4l
+mi3kr
+mi2ku
+mi3l2a
+milch1
+mil4che
+mild4s
+mi3l2i
+4milz
+m2im2a
+2m1imm
+2mimp
+min2ac
+min5anze
+m2inde
+minde4s
+2m1indu
+mi2nef
+miner1
+mi4n3e4ri
+min2eu
+2minfo
+min2ga
+ming3s
+2minh
+mi3ni
+mini3k4
+mi3n2o
+mi4n3of
+2m1inse
+mi3nu
+mioni1
+mi1p
+3mir.
+3miri
+3mirs
+3mirw
+3mirz
+3mis.
+mi2sa
+mi3sau
+mi4scha
+mi4schr
+mi4sch3w
+mise1
+mis2p
+mis5sar
+mis4ser
+mi2ste
+mi1sto
+mi1s4tr
+3mit
+mi2ta
+mite2
+mi2t3h
+mi2to
+mi2tr
+mit3s2
+mit5sa
+mitt2e
+mi2t1u
+4mitz
+mi3v2
+2m1j
+4m1k4
+m3kn
+4m1l2
+ml3c
+m3le
+ml3f
+ml3k
+m3lo
+ml3p
+ml3s
+2m1m
+mma3a
+m2mab
+m2m1ak
+m2m1al
+m2m1ans
+mm1anz
+mm1art
+mma1st
+m2m1au
+mm1äu
+m2m1e2b
+m2m1ef
+mm1ein
+mme4lin
+mme4na
+mm2ene
+m4mentl
+m4mentw
+mme4r3a2
+mme4rec
+mme2s
+mme3sc
+mmes5t
+mme4sz
+m2m1eu
+mmgas4
+mmi3el
+mmi3k
+mm1inb
+mm1inh
+m2m1ins
+mm1int
+mmi3sc
+mmi1s4t
+mmi5tw
+mm3p2
+mmpf4
+mm2s
+mm3sa
+mm3s2i
+mm3so
+mm3s2p
+mm3sta
+mm3sti
+mmt2
+mm3te
+m2mum
+mm2un
+mmu3r
+mmül2
+mmüll1
+2m3n2
+m4nesi
+1mo
+mo2be
+2mobj
+2m1obs
+3m2od
+mo3de
+mode3s
+mo2dr
+m1of
+mo2fe
+3mog
+2mog.
+mo2g1al
+3m2oh
+moh2a
+moi3r
+mo2k1l
+mol3d
+3mom
+mom2e
+3m2on
+mo2nä
+mon4dac
+mon4del
+mon2do
+mo2ner
+mon2i
+mon2s3
+mon3sa
+mons4e
+mon3s4u
+mont2a
+mon3th
+mo1ny
+3m2o2o
+2mo1pe
+mo2per
+2m1opf
+2mopt
+mo1ra
+mo2rak
+mor2an
+mo2rar
+mor2d3a
+mor2dr
+morf4
+mor3g
+morgen5s6
+mor3t2
+3mos
+moster4
+mos2ti
+mo3ti
+mo5to
+mot4r
+mous2
+2m1o2x
+mo1y
+1mö
+möbe2
+mö2c
+2mö2f
+4mök
+2m1öl
+m1ört
+4m1p
+mpa3ne
+mpe4lin
+mpe2n1
+m2p1ene
+m2pf
+mpf1ef
+mp4f3erf
+mpf3erg
+mp6fer6ge
+mpf3erp
+mp6ferpr
+mp4f3err
+mp4f3er4z
+mpf3l
+mp2fr
+mp1haf
+mp1hos
+mp3lei
+m4p3lem.
+m2p3len
+m2p3les
+mp4lis
+m3pon
+mpor6tag
+mpor6ter6
+mp3sh
+mp3str
+m3pu
+2m1q
+2m3r2
+4m1s
+m2sam
+m2san
+m4sap
+ms1as
+m3sat
+m2sau
+msau3e
+m3sä
+m4s1än
+m3sc
+msch2
+m4sco
+m3se
+m4s1e2d
+m4s1ef
+m4sein
+m4se2le
+mse2n
+m4s1ene
+m4sent
+ms2erh
+m4s1eu
+m4sex
+mso2r
+ms1ori
+m2spä
+m2sped
+ms2po
+m2spot
+m2spro
+ms2pu
+ms3s4
+m3stä
+m3steh
+m3stei
+m3stel
+ms2ti
+m2stit
+m3s4to
+m3s4tr
+ms5trä
+m3s2tu
+ms4tü
+ms1ums
+m2sü
+m3sy
+2m1t
+mt1ab
+mt1ak
+mta2m
+mt1ar
+mt3arr
+mt3aug
+m2t1e2d
+mt1ein
+mt1eis
+mt1elt
+m4tenga
+m4t3engl
+mt1ent
+m4tentf
+m4tentg
+m4tentr
+m4tents
+m2t1erb
+m4t3erei
+m2t1erf
+m2t1erg
+m2t3e2r1i
+m2t1erk
+m2t1erl
+m2t1ers
+m2t1ert
+m2t1eta
+m2t1eu
+m2t1ev
+m2t3h
+m2ti2d
+m2tim
+m2t1in
+m2t1i2r
+mti2s
+mt1ita
+mtmen2
+mt1ob
+mt1op
+m2t1öl
+mt1ös
+m2t3ro
+m2trö
+m4ts
+mt2sa
+mt3sco
+mt2s1e
+mt3send
+mt3s2ka
+mt3s4kel
+mts3tät
+mt3stu
+mt1um
+mtu3re
+m3tü
+mt3z
+1mu
+mu1a
+mu3cke
+mu4ckel
+2m1uh
+mu3la
+3muld
+mul4lau
+3mult
+m4umb
+3mumi
+m1ums
+mum2s1p
+3mun
+mun6derf
+mu2ner2
+4m1unf
+4m3ungeb
+mu3ni
+mu4nin
+4mu4niv
+4munw
+4munz
+muru2
+mu4r1uf
+3m4us
+mu4s1a
+mu2s1o
+mu2sp
+mu2s3t
+4must.
+must4e
+mu2su
+mut1au
+mut4str
+1mü
+2müb
+3müh
+mü2her
+mühl1a
+mül4len
+3mün
+3müt
+mütter3
+2m1v
+mvoll1
+2m1w2
+mwa2
+mwa4r
+mweg4s
+mwel4
+mwelt3
+mwu1
+3my
+my1al
+my3l2
+my2s3
+2m1z2
+1na
+3na.
+2n1ab
+na2bä
+naben3s4
+n3abh
+3nabi
+na2b3l
+na2bor
+na2br
+nab4rü
+4n3abs2
+na2b3u
+3nac
+na2ch1
+nachen4
+na5chen.
+n3achse
+nach3sp
+nach8t7ersc
+nacht8raum
+5nachw
+na3dab
+4nadd
+nade4l1
+na2der
+4n1adl
+4n1adm
+4n1a2dr
+4nadv
+3nae
+2n1af
+na1fra
+nag2a
+na2gem
+4n1agg
+n1a2gi
+na3gin
+na3g4r
+3n2ah
+na2h1a
+4n3ahn
+4n3aho
+3nai
+nai2e
+n1aig
+4n1air
+nai4re
+n2ais
+2n1ak
+na2ka
+3nakä
+3nako
+na2kro
+4nakt
+n4al.
+na2l1a2
+nal3am
+na4lar
+na2lä
+2n1albk
+n2ald
+nal3da
+n4ale
+na2leb
+nal3ei
+na4l3ent
+na6lerei
+na4ler4g
+na4lerm
+na4l3erw
+nales2
+nal1et
+nal1ex
+nalf4
+nalg2
+nal3gl
+na2lid
+nal3l2a
+nal2ph
+n2als.
+nal3t2
+nal5tr
+n2alty
+na2lu
+2naly
+na2mat
+3name
+na3me.
+4na2mei
+n4a3men
+namens3
+4n1a2mer
+na2mid
+na3m4n
+3n2amo
+n1amp
+nam4sp
+2n1amt
+namt4s
+n1an
+2n3an.
+4na2na
+na4nat
+n3a4nä
+4n3anb
+n3and2
+nan1eu
+4n3anf
+4n3ang
+4nanh
+2nani
+4n3ank
+4n3anl
+3n2ann
+4n3anna
+4nano
+4n3anp
+2nanr
+4n3ans4
+2nantr
+2nanw
+n2anz.
+nanzen4
+nan6zene
+nan6zeng
+na3ot
+na2per
+n1apfe
+4napfel
+na2pos
+na2pr
+nap2si
+n1aq
+n1ar
+3nar.
+na2r1a
+2narc
+n2ard
+n2are
+3nar2i
+n2ark
+n2arle
+n2aro
+na2rom
+nar2rh
+2nart
+n2arta
+n2arth
+na3r2u
+3nas
+n4as.
+na3sä
+na4schw
+n2asf
+4n1a4sp
+nas2s1c
+4n1assi
+nas4ta
+na2str
+4nasy
+nasyl2
+na2sym
+3nat
+na4t3au
+nat1ei
+na2tem
+na2th
+4natm
+nat2o
+4natom
+5nats1
+nat4sa
+n1au
+4nauf
+nauf4fr
+nau2fr
+5naui
+3n2aul
+4nausb
+4nausd
+4nausf
+4nausg
+4nausl
+n2auso
+4nausr
+4n3auss
+4nausw
+4nausz
+3nav
+nave4
+navi5er.
+navi5ers
+1nä
+4näb
+3n4äc
+3näe
+n1äf
+3näg
+3nähe
+nä2hi
+3nähm
+4n1ähn
+nä2hu
+3näi
+2n1ä2m
+4n1än
+4näpfel
+2näq
+när4s5t
+3näs
+nä2sc
+n2äss
+4näst
+2näu
+3nä1um
+4näuß
+4n3b4
+nbe2in
+nbe3r2e
+nbes2
+nby4
+2n1c
+n2c3ab
+n3can
+n3ce4n3
+n3ces.
+n3chl
+nch3m
+n2ck
+ncor2
+n5cu
+4n1d
+n2da2d
+nda1f
+nd2ag
+n3dai
+n2d1ak
+n4dakt
+n2dana
+n2dani
+n2danl
+nd1ann
+n2d1anz
+n3dap
+nd3arr
+n3dat
+nd3att
+nd1au
+n2daut
+n2dax
+nd1c
+nde4al.
+n2d1ede
+n3dee
+n2dei
+n4dei.
+nd3elfe
+ndel3l
+ndel4s3a
+ndels5en
+nde4mot
+nden3sk
+n4dentl
+n4dents
+nde3o
+n5der.
+n5deren
+nderer3
+nd2erh
+n5deri
+nder6läs
+nde4rob
+n4de4ros
+n6der6sat
+nder5ste
+n3d2es1
+nde2se
+ndes3s
+n2deth
+ndia3
+nd1imm
+n2dob
+ndo1c
+n2dof
+ndo6na
+n2dopt
+nd1or
+n2do2ri
+ndo1st
+n2d3ott
+n2dö
+nd2ös
+nd4ram
+n2d3rat
+nd3rau
+n2d3re
+n2drif
+n2droc
+n2drod
+n2d3rö
+n2drui
+n2d3run
+nd4sene
+nd2spr
+nd3th
+nd3ti
+ndt4r
+n2duns
+ndwa5re
+ndy3
+1ne
+3ne.
+ne2ap
+3neas
+ne3at
+ne3au
+ne2bl
+2n1ebn
+neb4r
+2nec
+3neca
+3nece
+ne1ck
+neck2a
+ne2dit
+2nee
+neei2
+ne3e4in
+ne3eis
+neen2
+nee1r2
+nee3t
+n1ef
+n2ef.
+n2e3f2a
+2nefr
+2n1egg
+neg4l
+n1e2go
+neg4r
+n1e2he
+2nehe.
+2nehem
+2nehen2
+ne3her
+3nehm
+4n3ehr
+2n1ei
+3neia
+4neic
+nei4dei
+4neier
+3neigt
+3neigu
+4neing
+4neinh
+4neinl
+4neinz
+4neip
+neiss4
+ne2ke
+2n1eks
+nek3t2
+ne2l
+3ne3lä
+nel3b
+n1ele
+4nelek
+4nelem
+ne3len
+ne3l2i
+ne4lim
+ne4lit
+3nelk
+n2ell
+nel2l1a
+nel4lei
+3ne3l2o
+3nelu
+n2em.
+4n1emb
+n1emi
+4n3emp
+2n1ems
+4nemu
+3nen
+n4en.
+n2e4n3a
+ne5nac
+n2enb
+n2enc
+nen4dar
+4n1endb
+4n1endd
+4n1endf
+n1endg
+4n1endh
+4n1endk
+n1endl
+4n1endp
+4n1endt
+4n1endw
+ne2n1e2b
+nen3ei
+nene4m
+nenen1
+ne4nene
+ne2neu
+n2enf
+4n1engb
+nen4gen
+4n1engs
+4n1engt
+n1engu
+n2enh
+ne4n3i
+n2enj
+n2enk4
+n2enm
+nen4nar
+ne2no4
+nen3s2e
+nen3sk
+nen3s2p
+5n2en3t2a
+4n1entb
+4nentd
+4nentf
+5n2enti
+4n1entl
+4nentn
+5nentr
+4n1ents
+4n3entw
+4nentz
+ne4n3u
+n2env
+n2enw
+nen5z2e
+ne2o3b
+ne2oh
+ne2or
+neos4
+3nepa
+ne2pen
+2nepf
+ne2pi
+ne2pos
+nept4
+n4er.
+ne1ra
+ne2ra2b
+ne2rac
+ne2r3af
+ne2rag
+ne3r4al
+ne2ram
+ne2ran
+ne2r3ap
+n2erat
+ne2rau
+nerb2a
+4n3erbe.
+4n3erben
+2nerdb
+nere2
+ne2reb
+ne2rec
+5nerei.
+n1erf
+4nerfas
+3nerfr
+2nerfü
+2ner3g4
+3nergr
+n1erh
+4n3erhö
+3neri
+n2erj
+n1erk4
+5nerka
+n2erkö
+n2erli
+2n1erlö
+n1ermi
+n2ern.
+2n1ernä
+4n3erneu
+2n1ernt
+n1eros
+n1eröf
+ne1rös
+n2ers.
+2n1ersa
+4n3ersts
+nert4
+3nert.
+ne2rup
+n2erv
+4nerwar
+2n1erz
+nerz2a
+3nes
+n2es.
+ne2sal
+nes2an
+ne2sei
+ne2s1ev
+2ne3sh
+nesi1
+ne3ska
+ne2s1of
+ne2s1or
+ne2s1pa
+4n1es2si
+nes4sig
+ne1sta
+ne2ste
+nes3ti
+4n1est3r
+4nesyn
+3neß
+ne2tab
+2ne4tag
+net1ak
+ne2t1an
+2ne2tap
+2n1e2tat
+ne4te2l
+ne2th
+ne4t3ha
+ne3the
+ne3ti
+ne4tin
+n4ett
+net3ta
+net3te
+net3tr
+2n1e2tu
+net4zer
+net2z1i
+ne2u
+neu1c
+neu4ere
+neuer4f
+neuer4k
+neuer4r
+neuer4s
+neuer4w
+neu3g4
+n2eun
+2n1eup
+neur2
+3n2evi
+ne2vol
+n2ew
+2n1ex
+5ney
+3nez
+3né
+2n1f
+n3f2al
+nfalt4
+n3f2ang
+nf4ar
+n3f2ä
+n3f2en
+n3f2er
+nf2es
+n4fex
+nff4
+n3fi
+nfi4le.
+nf4le
+nf2o
+nfo1s
+nf4r
+nf3s2
+nf2tan
+nf2t3r
+nft4st
+nfts3tr
+nf3tu
+n2f1u
+4n1g
+n2g1a2c
+ng1ad
+n2g1ak
+ng1a2me
+ng1ams
+nga2n
+ng1and
+n2g1ans
+ng1ant
+n3g2ars
+n2g1a2v
+n2g1äl
+ng3d4
+n2g1ein
+ngelb4
+nge3l4ei
+n3g4en
+n5gene
+nge5nerw
+ngen3sa
+nge4ram
+n2g1erg
+ng3erse
+nger4zä
+n3g4es
+nge3s4a
+nge3sp
+ngg3s
+ng3hu
+n2g1id
+ng2lad
+ng2läs
+n2glic
+ng4lok
+n3glot
+n2gn
+ng3ne
+n4g3ni
+ng4nom
+ng2nu
+ng2ob
+ng1opf
+ng1or
+n2gö
+n2g3rai
+ng4ran
+n2g3rat
+ng3roc
+ngs3au
+ng4scr
+ng4s3e4h
+ng4sek
+ng4sens
+n4gt
+ng3ts
+n2gum
+ngung4
+ngzei4t
+4n3h2
+n7halts
+n5he
+nhe2r
+1ni
+3n2ia
+ni3ak
+nibb4
+ni1ce
+n1id
+3n2id.
+ni2de
+3n2i3de.
+4nidee
+n2idi
+ni3d4r
+2n3idy
+n2ie
+nie3b
+ni1el
+nie3l2a
+nie4n3
+ni3ene
+ni3eni
+nie4rei
+ni4erna
+nie2sa
+ni2eu
+nife4s3
+ni1fl
+ni2g1a2
+2n3i2gel
+2niget
+nig3li
+ni2gn
+ni2gre
+nig4san
+nig4sp
+nihi3
+ni2kar
+3nike
+ni2kel
+ni3k4erh
+ni2ki
+nik3ing
+ni2kor
+ni2k3r
+nik3t4
+3n2il
+ni3l2a
+ni3l2i
+4n3imp
+n1in1
+3nin.
+n2ina
+nin2ac
+ni2nal
+3n2inb
+2nind
+2ninf
+3ning
+ning4s
+2ninh
+4nink2
+3nino
+ni2nor
+3n2inp
+2nins
+n2ins.
+4n3int
+n2i3nu
+4n3inv
+3n2inw
+ni2ob
+ni3ok
+ni3ol
+ni3ora
+n2ip
+ni4ron
+n1irr
+3n2is
+ni4sam
+ni2san
+ni2sä
+nis3cha
+ni4schw
+ni2s1e
+ni3se.
+ni2som
+4nisot
+ni2sp
+ni3spi
+nis3s4
+ni2s1u
+2nit
+3nita
+ni2ti
+nit2o
+3nitr
+nit3s4
+nit2ta
+nit6tele
+nit6ter6g
+nit6t5er6k
+nit4tra
+nitt3ri
+nitt4sa
+ni3v2
+3nix
+2n1j
+4n1k
+nk1abr
+n2k1ac
+nka2ge
+n3kal
+n4kalg
+nk1ang
+nk1apf
+nk3art.
+nka3sc
+n2katm
+nk1aus
+n2kaut
+n2k1äh
+n2k1äp
+nke2c
+nk1ei.
+nke4lei
+n4kelem
+nke4na
+nken4te
+nk2er
+n4k3erle
+nke4ros
+nk3ersa
+nke2t
+nk1eti
+n2ketu
+nk1id
+n2kim
+nk1inh
+n2k1ins
+n4klade
+n3klag
+nk3leis
+n2k3len
+nk3les
+n3klin
+nk2lo
+nk4nac
+nk4neb
+n2knis
+n2knit
+n2k1o4be
+n2kopt
+nko2r
+nkord2
+nk1ori
+n2k1ort
+n2köl
+nk4rab
+nk3rät
+n4kre.
+n2k3rel
+n2kren
+nk3rep
+n2k3rez
+nk3ro
+n2krol
+nk2sal
+nk2se
+nk3sen
+nk2so
+nks2ti
+nk3s2z
+nk2tak
+nk2tan
+nk4tau
+nk4tent
+nk4terg
+nk4t3ern
+nkte3sk
+nkt2et
+nk2tin
+nkt1it
+nk2top
+nkt1r
+nkt3ric
+nk2tro
+nk2tru
+nkt4sen
+n2kum
+nk1ums
+nku2n
+nk1urh
+n2küb
+2n3l2
+nla3ge
+nle2ga
+nle3x
+2n1m2
+n3ma
+n3mä
+nmen2s
+n5mi
+4n1n
+nna2be
+n2nada
+n2nalg
+n2n1all
+n2nan
+nna3st
+n2nau
+n3nec
+nn2ei.
+n4nein
+n3nelb
+nne4le
+nne3lu
+nn2ens
+nner4ei
+n6n5ereig
+nner4fü
+nner6geb
+nn4ergr
+nn2erh
+nn2erk
+nner4la
+nn2ero
+nne2rö
+nn3erwa
+nner6war
+nner2z
+nne4s1e
+nn2eu
+nn2ex
+nn3f
+nng4
+n3n2i
+n4n3iso
+nnis3t
+nno2b
+nno3be
+n2nof
+n2nop
+nno2r
+nn1ori
+nn4sam
+nn3se
+nn3s2p
+nnst4
+nn4stoc
+nn2stö
+nn5t2a
+nn2th
+n2n1uf
+n2n1unf
+nn1ur
+nnvoll4
+nnvol5le
+1no
+3no.
+no5at
+n2obel
+2nobj
+no2bla
+n2oble
+3noblo
+3noblö
+2n1ob2s
+no1c
+noche4
+noch4r
+2no2d
+no3dr
+no2ed
+n1of
+no2fe
+2noff
+2n1oh
+n2ohe
+no3id.
+2n3okk
+nok2l
+n4ol.
+n3ole
+no2leu
+no4lig
+no2liv
+2no2ly
+3nom2e3
+3nomp
+non2e
+n1onk
+nons4
+n1ont
+2nony
+3n2opa
+no2per
+no2pi
+n1ops
+3nor.
+nor2a
+no2rad
+n2o1rak
+no3ral
+no3r4ar
+2norc
+nor4da
+3nordb
+nor4des
+nor2d5r
+no3r2e
+2n1org
+3norh
+3n2orl
+5norm
+norm2a
+nor3mal
+3norö
+3nors
+2n1ort
+3n2os.
+nos2e1
+no3sh
+no5sk
+no2s3p
+2no2sti
+nost1r
+2nostv
+nos2u
+no2tan
+no3tart
+no2tä
+not1e4i
+no6tentr
+no2ter2
+noterb3
+no2tex
+not3h
+no2tho
+no2t3in
+no2t3op
+no2tr
+3nov
+2n1o2x
+3noz
+2nöd
+4nö2f
+4n1ök
+4n1öl
+n2ör
+1n2öt
+4n3p4
+npa2ge
+npa2s
+npf4
+npro1
+npsy3
+2n1q
+6n3r2
+nran2
+nräu3s
+nrebe2
+nreli1
+nre3s4z
+nrö2s
+nrücker6
+4n1s
+n3sabo
+n2s1a2d
+n2s1agi
+ns3a2k
+n2sall
+ns4alp
+n2salt
+ns4anat
+n2sanm
+nsa2r
+n3s2arg
+n3sark
+nsa2s
+ns4ath
+nsau4r
+nsau2s
+n2saut
+ns2av
+ns2ax
+n2s1än
+ns2äug
+n2s1äus
+n3sche.
+n4schef
+nsch5eul
+n4schl.
+nscht4
+n3schu
+nsch7werd
+ns4cr
+ns1eb
+ns2eh
+nse2ha2
+nseh5ere
+nsei4n3
+n4seinf
+n4seint
+ns2ele
+ns3elem
+n2sem.
+n2sene
+nsen4sp
+n2sepo
+n2s1erf
+ns1erg
+n2serh
+n2s1erk
+ns4erko
+ns3erle
+n4s3erne
+n2serö
+ns1ers
+n4sersc
+ns3ertr
+n2s1erw
+n2serz
+n2seth
+n2sety
+n2s1eu
+ns2ext
+nsfi2l
+ns1id
+nsi4den
+n3sil
+n2simp
+ns2inf
+n2sini
+nsinn2
+nsinns3
+ns3int
+n3sis
+n4siso
+nsi4te
+nsi2tr
+n3s2kal
+n3s2kel
+ns2kis
+n3skle
+n3s2ky
+n3smara
+n2s1o2d
+ns1of
+n2soff
+ns4om
+n4s1ont
+n2s1op
+ns2orc
+n4s3ort.
+ns2pac
+nspa2g
+n3spe
+ns4pek
+ns2pel
+n5s4pen
+n4speri
+n4spers
+n2sph
+n3s2pi
+ns4pie
+ns4pir
+n2spo
+n2sprä
+n4s3prie
+n2spro
+nsrü2
+ns3s4
+ns3tabl
+ns8tagent
+nst1ak
+n4stale
+nsta2n1
+n3stand
+nst3ane
+n3star
+n2stas
+n4stat.
+n6staten
+ns4tati
+n4stats
+n3stäm
+n3s4tän
+nst5eife
+nst7einhe
+ns4tent
+ns2tep
+nst5erge
+n3steri
+n5s6terne
+n5s6terns
+ns4teu
+ns2ti
+n3s4tic
+n3stif
+n4stilg
+n3stim
+n2stob
+nst5opfe
+ns4tor
+ns4tric
+n4strie
+n4strik
+ns4trip
+ns6trun
+ns2tu
+nst3u4t
+ns4tüm
+n3suf
+ns2um
+ns1un
+ns2ung
+ns4unk
+ns2unw
+ns4unz
+n2s1urs
+n2sut
+n3sy
+ns4zene
+4n1t
+n3t2a3c
+ntak4ta
+nta4lin
+n4t1all
+nta2lo
+nt2alp
+nta3ne
+n4tansp
+nt1ant
+n4tanza
+n3t2arb
+nt1ark
+n3t2arm
+n3taro
+nt1ar3t
+n4tarti
+nt3artu
+n3t2arz
+n2tath
+nt1äm
+n2t1äu
+nte3au
+nte1e
+nte3g6
+nt1eh
+n3tehe
+n2teig
+n4t1ein
+n2t1eis
+nte4lin
+n2t1e2mo
+nt4en
+nte4na
+nten6te.
+ntera2
+nte6r5eis
+nt4erh
+nt4erk
+nt4erm
+nt4ern
+nt4ers
+nt4ert
+nte3sa
+n4t1es4s
+nte2st
+n6testri
+n2t1e4ta
+nteu3
+nteu6eri
+nte3v
+ntge4n
+nt3hel
+nt3ho
+nt4hos
+n3thr
+nt4hu
+n2t5hum
+nt4hy
+n3t2i
+nti3c
+ntim3p
+ntine4
+n4t3inf
+n4t3inh
+ntini1
+n5t4lem
+ntmen2
+ntmo4
+ntni2
+ntnis1
+ntopf3e
+n4torg
+n4t3o4rie
+nto1s
+nt4ral
+nt1rau
+nt4raum
+nt3rea
+nt3rec
+n5t4ree
+nt3reif
+n5trep
+nt4repr
+nt3rich
+n4t3rieg
+nt4rig
+n2troh
+n3trop
+n2t3rü
+n4ts
+nts2ah
+nt3sp
+nt4spar
+nt5spe
+nts2t
+ntt2
+n3tub
+ntu4re.
+ntu1s
+n3tü
+nt3z
+1nu
+3nu1a
+nu4ale
+nu3a2r3
+nubi1
+2nu1c
+3nud
+nude2
+3nue
+nu2es
+nuf2
+nu2fe
+3nug
+2n1uh
+3nuhi
+4nuhr
+3nui
+nuk4
+nu3kl
+nu2kr
+nul2l1a
+nulle2
+nul4l3eb
+nul4lei
+n2um.
+nu2ma
+2n3umb
+4numf
+4numg
+2numl
+3numm
+2numr
+2n1ums
+2n1umv
+4numw
+2n3umz
+nu4n
+4nuna
+4n1une
+3n2ung4
+4n3ungl
+4n1uni
+n3unk
+2nunr
+nun3s
+4nunt
+4nunv
+4nunw
+3nuo
+2nup
+2nur
+nu2ra
+nu4r2i
+nur3s
+nur2z
+3nu2s
+nu3sc
+nu3se
+nu3spo
+nuss3er4
+nus6serl
+3nut
+nu2t1a
+n3uto
+nu4t3r
+3nuu
+3nux
+3nuz
+3nü.
+2nü4b
+nür1c
+3nüs
+1nüt
+2n1v2
+n3ver
+n3vl
+nvoran4
+2n3w
+1ny.
+1nyh
+n1yo
+1nyr
+1nys
+1nyw
+4n1z
+n2z1ach
+n2z1a2g
+nza2k
+n2zan
+nz3a4ne
+n3zani
+n2zar
+nza2s
+n2zat
+n2z1au
+n2zän
+n2zär
+nze4l3a
+n6zenerg
+n4zen4se
+n4zentl
+nz3erem
+n2z1erh
+nz1erl
+nzer4lö
+nz5erste
+nzer6tra
+n4zerwe
+n3z2es
+nze3sk
+nze2t
+nz1eta
+nze3u4t
+nz1id
+nzi2ga
+nzig4s
+n2zinh
+n2z1ini
+nz1int
+nz3le
+n2zof
+n2z1op
+n2zöl
+nz3s
+nz1wa
+n2z1wä
+n2zwet
+n2zwir
+n2zwö
+n2z1wu
+ño1
+2o3a2
+o4a3bi
+o4ac
+oa3che
+oa3chi
+o4ad
+oa3de
+oad4st
+oa3in
+oa3k2e
+oak1l
+o4a3la
+o4a3mi
+oa4n
+o2a4r
+o2as
+o5ass
+o4at
+o5au
+o1ä
+o1b
+2ob.
+o3b2al
+ob2am
+ob2as
+ob1auf
+2o3b2ä
+2obb
+ob2e
+2obe.
+2obea
+2o3bec
+2obef
+o2b3ein
+2oben
+obe4na
+oben3d4
+o2ber
+o3ber.
+o4berb
+ober5eis
+1oberf
+ober3in
+oberin6g
+obe4ris
+7oberungs
+2obev
+2obez
+2o3b2i
+obi4t
+ob3ite
+3obj
+ob1la
+ob3lei
+1ob3li
+2oblo2
+2ob2lö
+ob2lu
+2obo
+ob1or
+2obö
+ob3rei
+2obrü
+ob3s2h
+ob3sk
+obs2p
+ob3sz
+2o3bu
+o4bunt
+obu2s
+obu2t3
+2o3bü
+o4büb
+2oby
+oby4t
+2oc
+o3ca
+oc1c
+o1ce
+och1a
+ocha2b
+ocha2r
+o1che
+oche4b
+o2ch1e4c
+och1eh
+och1ei
+oche2l
+ocher4k
+ochi4d
+och3l
+och3m
+och1o
+och3ö2
+och3r
+och1s
+ocht4
+o1chu
+ochu2f
+och3u4t
+och1w
+o1ci
+o1ck
+o2ckar
+o2ckau
+o3cke
+o6ck5ersc
+o3cki
+o4ckin
+ock3sz
+ock3ta
+o1cl
+o3cu
+o1ç
+o1d
+2o3d2a
+od3ak
+od2dr
+o3dec
+o3d2e3i
+odein3
+ode4l3ag
+ode2n1
+ode2s1e
+ode3sp
+o3dex
+2o3dia
+odi3c
+2odif
+2o3dir
+odium4
+2odn
+o2don
+odo4s
+2odr
+o2dre
+odt4
+2o3du
+o3dy
+2o1e2
+oe3di
+oe4m
+oen1e
+o3er
+o4e3s
+oe4sc
+o2e3t
+o3et.
+oet4h
+o3ets
+2ofa
+ofa2c
+of1a2d
+of1a2g
+of2ang
+of1au
+2ofä
+o2f1e2b
+o2f1ec
+o2f1e2d
+o2f1ei
+o2fent
+2o3fer
+o4f1erb
+2o3f2es
+o2f1e2t
+of1eun
+of2f1a
+off3erz
+of2f1in
+1offiz
+of2f3l
+of2fo
+of2f3r
+offs2
+off3sh
+off3si
+off3sp
+off3t4
+of2fu
+2ofi
+ofi3k4l
+ofi3s4
+2o1fl
+of3le
+of3li
+of4lö
+2ofo
+2ofö
+2o1fr
+of3rä
+of4rü
+of2s1
+of4sam
+of3sä
+ofs2ch
+of4sen
+of3sta
+of4staf
+of3str
+2oft
+oft2a
+of2tei
+of3th
+2ofu
+of3ur
+2o1g
+o2g1ab
+o2g1ac
+oga3d
+og1ang
+og1ans
+o2g1ei
+ogeld2
+oge2l1i
+ogener4
+ogeni3
+ogen4id
+ogerätein8
+og2gl
+o3gh
+ogi2er
+ogin1
+o2g1ini
+og1l
+og3le
+og2lo
+o3g4n
+ogo4i
+og1o2ri
+og3s2p
+og1ste
+og3sti
+2o1ha
+oh1alk
+o1hä
+o1he
+o3he.
+oh1eis
+o3hem
+o3hen.
+ohen3s
+o3her.
+o3here
+oh1er4t
+oh1er2z
+o3hes
+2o1hi
+2ohl
+ohl1a
+oh2la2d
+oh2lä
+oh3lec
+ohl1ei
+oh3lep
+ohler2
+oh4lerg
+oh4l3erh
+oh4lerw
+oh3lo
+oh4l1o2r
+ohls2e
+oh2lu
+ohm2
+1ohmi
+oh4n1ac
+ohn1ap
+oh3nee
+oh2ni
+1ohnm
+oh2n1o
+ohn3sk
+2o1ho
+ohol1e
+oho4len
+o2h1o2p
+2ohö
+oh3öl
+ohr3a2
+oh4rat
+oh2rel
+oh2rem
+ohren3s
+ohrer2
+oh4rerg
+oh3rie
+oh4rin
+oh2rol
+ohrt4r
+oh1s
+o1hu
+oh1w
+2o1hy
+2oi
+o1i2d
+oi4da
+o3ie
+o1im
+o1in
+o4ine
+oi2r
+o2isc
+o3isch.
+o1ism
+oiss2
+oi1th
+o1i4tu
+2o1j
+ojek8tori
+2o1k
+ok2a
+oka3b2
+ok3ac
+oka3i
+oka2la
+okale2
+oka6lere
+okas4t
+ok2e
+3o2kel
+oki4o
+ok1lä
+ok2li
+ok2o
+oko4pt
+ok2so
+ok2s1p
+ok5t2
+3okw
+2ol
+o1la
+ol3abu
+olaf4
+ol1ant
+ol2ar
+ol4arm
+olar3s2
+o3l2as
+olast4
+ol1a2v
+4o1lä
+ol1ät
+4olc
+ol2chr
+ol4d1am
+ol2dä
+ol2d1ed
+ol2dei
+ol4d3eng
+old5ersa
+olde2s
+ol2deu
+ol2dim
+ol2d3o
+ol4dr
+4ole.
+o2l1ef
+ol1eie
+o2l1eis
+oler2
+o2l1ert
+ole1s
+ole3s2t
+ol2e3u2
+ol1exz
+o1lé
+ol2fa
+ol2fem
+olf3ere
+ol2f3l
+olf1r
+ol2f3ra
+olft4
+olge4ne
+ol2gl
+ol2g3r
+ol2i
+olie4n1
+oli2er
+oli3k4
+oli5tu
+3oliv
+oli3ze
+ol3ke
+ol2kl
+ol2k3re
+ol2l1ac
+ol2lad
+ol2l1ak
+oll3am
+ol2l1au
+ol2l1e2b
+ol4l1e2c
+ol2l1ei
+ol2lel
+oller6ge
+ol4ler4k
+ol4l3erw
+ol4l3ess
+oll3s2a
+oll3sp
+4olo
+ol2of
+olo1p
+ol1ort
+ol3s2k
+ol4ster
+ol3t4h
+o1lu
+olu2th
+ol2y
+ol2z1a2
+ol3zan
+ol4z3ern
+ol2zim
+ol2zo
+ol2zw
+2om
+o2mab
+oma2bl
+o2m1a2ge
+om1alg
+om1all
+oma4ner
+om3ansc
+o4mante
+o2m1ap
+o2m1ars
+o2m1art
+omar4te
+o4m1a2sy
+o3mat
+o2m1au
+o2meb
+om1ebe
+o2m1ef
+o2m1ei
+o2mel
+o3meld
+o5men.
+om1ene
+o4mep
+om1er2h
+omer4s
+o2meru
+om1er2z
+omi2c3
+omiet1
+o3mig
+om1ind
+om3ing
+om1ins
+o2m1int
+om3ma
+omm2e
+o4mn
+3omni
+4omo
+o2m3oa
+o2m1org
+om1o2ri
+om3pf
+oms2
+om3sk
+om3t4
+o2mum
+o4munt
+2ona
+on3a2b
+ona3g
+o3nal
+onaler6e
+on3ann
+onan6z5ei
+on1ap
+o2narb
+ona3th
+onat2s
+on2au
+on3auf
+2onä
+on1äh
+2onc
+on2dan
+onderer5
+onde8rers
+ond1r
+on2dra
+on4drin
+ond3sk
+2one
+on1e2c
+o3nee
+o2nef
+one3h
+on3ein
+one2m
+on1ema
+one2n1
+o4n3ends
+on2eng
+onen3s2
+o3ner.
+o2n1erb
+on1erd
+oner4fa
+on1erg
+o2nerh
+on4erka
+on1erö
+on1ers
+o3nett
+on2eu
+on3f2
+2ong
+on3gla
+ong4r
+ong3s2
+on2gue
+2o3ni
+on2i3d
+onie3g
+o4nikr
+o4nim
+o4nind
+on3ing
+o4ninh
+on2inn
+o4nins
+on3k2
+1onke
+3onkel
+onli4
+onlo2c
+2onn
+on3n2an
+on3n2e
+ono1
+o3nod
+o2nof
+o2noke
+on1orc
+on3ord
+ono3s
+onot4
+ons1a
+on4sam
+on2seb
+onsen1
+onse4t
+onsi2d
+ons3ing
+on4s3l
+ons1p
+onst2a
+onst4r
+ons5tri
+on3ta
+on2t1eb
+on2te2l
+ont5end
+on4t3erl
+on2th
+on4t3rat
+2onuk
+o3nur
+2onut
+on3v
+1ony
+on3z2
+onze3in
+o1ñ
+1oog
+oo2ka
+oo2k3l
+oo2kn
+oo2mo
+o1op
+o1or
+oor3d
+oo4sk
+oos3s4
+oo2su
+oo2t1a
+oot1ei
+oo4t3h
+oo2tr
+oot2st
+oo2tur
+2o1ö2
+2op.
+o1pa
+opab4
+op1akt
+opa2le
+o3pa5s
+opa3s4t
+1ope
+2ope.
+o1pec
+2o1ped
+op1ef
+2o1pei
+o1pek
+2opel
+ope3l4a3
+2o1pen
+o2pera
+op1erh
+2opf.
+op2f3a
+op3fah
+op2fä
+o2pfe
+op2fin
+opf3la
+op1flü
+op2fo
+4oph2
+o3phe
+o1p2i
+opi5a4
+opi3er.
+opi5ers.
+opie4r3u
+opin2
+2opl
+op3lag
+o2p3le
+op3li
+o3p2n
+2o3po
+opo2la
+op2pan
+op4pl
+1oppo
+op2p3r
+2oppt
+2o1pr
+3o4psi
+op3sz
+1op3t4
+o2pum
+2opy
+2o1q
+2or.
+or1a
+2ora.
+o1raa
+2or3a2b
+o2rabb
+o2r3add
+or3adr
+o1r2ag
+1orake
+o1ral
+oral3l
+o4r3alm
+or4alt
+or2am
+or3a2mi
+o1ran3d4
+oran2f
+o4rang
+oran2m
+oran4ze
+or3ap
+2orar
+or3arr
+o1ras
+o2r3att
+2orau
+oraus6wa
+2o1raw
+o3rä
+or1änd
+or1ät
+orb2l
+or1c
+2orca
+or2ce
+2ord.
+4orda
+ord1am
+or2dar
+or2dau
+2ordb
+ord3eng
+orde4s
+or2deu
+or4d3ing
+or2d1ir
+or2dit
+1ordn
+or2do2
+2ordr
+ord3s2t
+ord3t
+2ordu
+2ordw
+2ore
+ore2a
+o2r1e2b
+o2r1e2ck
+o5ree
+or1eff
+ore2h
+or1eig
+oreli1
+orems2
+o2r1er
+o3r2ere
+orer1i
+o3r2ero
+or1e2th
+o2r1eu
+2orf
+or2far
+orf3li
+or3g4a
+2orget
+or3ghi
+2orgia
+orgi1e
+or2gl
+or3gla
+or3gle
+or2gn
+2orgr
+2orh
+2oria
+2oric
+4o3rie.
+o3rien.
+o6rienti
+o3rier
+4oril
+or1ima
+ori4mi
+4orin1
+o2rind
+2oris
+2oriu
+2ork
+or3k2a
+or4k3ar
+ork4r
+ork2s
+2orm
+or2mam
+or4mans
+orm3asp
+or2m1eb
+or4m3erf
+or4m3er4g
+or2mor
+orm3ord
+or2mum
+ormu4n
+or4muni
+or4munt
+ormwa5
+or2n1a2c
+or2nal
+or2nar
+or5ne.
+or3ni
+or4nin
+or3no1
+2o1ro
+o2r1ob
+or3oly
+oro3n2a
+oro2pe
+or1opf
+o2ro2r
+o3rou
+o2r1ox
+2o1rö
+2orp
+2orq
+2orr
+orr4a
+or3r2e
+or3rh
+2ors2
+or3s4a
+or3sh
+or3si
+or3sk
+or3sz
+or2t1ak
+or2t1an
+orta2r
+or2t1au
+or2tef
+orte4n
+or4ten5g
+ort3erb
+or4t3ere
+ort3erf
+orter6fa
+ort3erg
+or4terk
+or4t3erl
+orter6sc
+or2t3e2v
+or2the
+or2tin
+or4t3off
+or4to2r
+or2tö
+or4trau
+or4t3räu
+ort3re
+or2t1um
+2o3ru
+or2uf
+or1uh
+orum4s
+o4r3un
+o5rus
+o2rü
+o2rya
+or3z2e
+2o3s2a
+os3ad
+osal2
+osa1s
+2osc
+o2s3ca
+osch3ar
+o3sche
+osch3le
+os2co
+2ose
+ose1e
+ose1in2
+os2el
+ose2n
+o2s1er4k
+os2ex
+2osh
+o3s2hi
+os2ho
+os4hu
+2osi
+o3sk
+o4ska
+os2kal
+o4ski
+2os2kl
+2os2ko
+o4skr
+os2lo
+1osm
+os4mog
+2oso
+osol1
+o2sö
+2os1p
+os2pac
+os2pe
+os3pec
+o3sphä
+o3s2po
+os4pot
+os2pra
+2oss
+os6s3a2c
+oss3ala
+os2san
+oss3and
+os4sä
+os2sei
+os4s3en4k
+os4s3enz
+os2s1ep
+oss2er
+os4s3er4b
+osser4e
+oss5erei
+os4s3er4f
+os2sik
+os2sim
+os2s1o2
+os4son
+os2sp
+oss1pa
+os2s3t
+os4sto
+ost1a
+os4tam
+os3tarr
+osta4s
+os4tat
+ost1ei
+oste2n
+oster3e
+ost5erwe
+oster8wei
+ostes5s
+ost3eur
+os2t3h
+os2tid
+os3til
+os2tit
+ost1o4b
+os3toc
+os4t1or
+o2stö
+ost3ran
+ost3rä
+ost3re
+ost3rot
+ost3uf
+os2tug
+2osu4
+os1um
+2o3sy
+o3s4ze
+2oß
+o2ß1el
+o2ß1en2k
+o2ß1enz
+oßer2
+o2ß1erb
+o2ß1ere
+o2ß1erf
+oß1is
+2o1t
+o3tabe
+o2t1abi
+o2t1ah
+o2t1ak
+o3tal
+o3tam
+ot1ant
+ota2s
+ot1ast
+o2t1au
+o3tau.
+ot1ä
+o2teb
+ote1i
+o4t1eib
+o4t1eic
+ote3i4n
+o4t1eis
+ote4l1a
+ote4lin
+o3tem
+o4t1emi
+ot2em3p2
+ote4na
+o4tentb
+ot3entr
+ot1erb
+o4t1er2l
+o4t1erw
+ote2s
+o3the
+o4them
+o2t3hi
+o2thr
+4oti
+ot2id
+o2til
+o2t1i2m
+ot2in
+ot3inh
+otli4
+ot2o
+otob4
+ot3opf
+oto4rei
+oto1s
+o2t1ö
+o3tran
+ot3rat
+ot4rau
+ot3re
+ot3rin
+ot3roc
+ot3rus
+ot2s3at
+ot3sch
+ots2en
+ots1o
+ots1p
+ots2pe
+ot2spr
+ots3tau
+ot3sti
+ot3stra
+ott1a
+ot2tan
+ot4ta2s
+ot2teb
+ot4terh
+ot4terk
+otte2s5
+ot2t3h
+ot4tim
+ott2o
+ot2t3r
+ot3t4ra
+ot4tri
+ot3t4ru
+ot1url
+o3tü
+ouff6
+ou1f4l
+ou4ge
+ou3gl
+o1uh
+ou1is.
+ou2le.
+ou2les
+2o1um
+2o2u2n
+oun4ge.
+4o4ur
+oure2
+ou2ret
+ouri4
+ourie4
+ourme4
+our4ne.
+ou3s2i
+3outp
+out3s2
+ou3tu4
+2o1ü
+o1v
+ov2a
+2ovel
+o3ven
+ove3s4
+2ovi
+oviso3
+2ovo
+2o1w
+o3wec
+owe2r1
+o2wh
+o3wi
+o2wu
+o1x
+2ox.
+ox2a
+2oxk
+ox3l
+o2xu
+1oxy
+o1yo
+oy1s2
+2o3z2
+3o4zea
+ozen4ta
+ozes4sc
+4ozi
+ozir3
+ozon1a
+oz3z
+órd2
+ö1b
+öbe4l3i
+öb2l
+ö2b3le
+ö2b3r
+öb2s3
+ö1c
+öch1l
+ö2chr
+öch2s
+öch4ste
+öchst5ei
+öchst3r
+öchs4tu
+ö3cke
+ö1d
+ödel3l
+öde1r
+ödi3
+ödien3
+ödin3
+öd2st
+1ödu
+ö1e
+1öf
+öf2fl
+öf3l
+ö1g
+öge3le
+ögen2s1
+ö2g3l
+ö2g3r
+ö1he
+öhe4n1
+öhl2e4
+öhre4
+öh3ri
+ö1hu
+ö3ig.
+ö3isch.
+ö1ke
+1ö2ko3
+ök3r
+ök2s
+ö2l
+3öl.
+öl1a2
+öl1ei
+öl1em
+öl4en
+öl2f1ei
+ölf2er
+öl1in
+ölk4e
+öl2k3l
+ölks4
+öll1a
+öl3le
+3ölm
+öl2nar
+ölo2
+öls2
+öl3sa
+öl3sz
+öl3tu
+1ölu
+ölz2w
+ö1m
+öm2s
+ön2e
+ö3ni
+önizi1
+önn2e
+ön2s
+ön3sc
+ön3sp
+öo1
+öo2ta
+öoti1
+2öp
+ö1pe
+öpf3l
+öp4s3t
+ör3a2
+ör2b3l
+ör1c
+ör2dr
+ör3dra
+ö2r1ec
+ö2r1ei
+ö2r1e2l
+ö2r1em
+öre2n1
+ö2r1ene
+ö2rent
+ö3r2erb
+ö2r1er2e
+örer2f
+ö2rer2g
+ö2rer2l
+ör2err
+ör2erw
+ö3r2erz
+ör1ess
+ör2f3l
+ör2gl
+ö2rim
+ör2kl
+örn2e
+örner4v
+ör1o2
+örpe2
+örs2e
+ör3sk
+ört2e
+öru4
+ö2r1une
+ö2sa
+2ösc
+ö2sch3a
+ösche2
+ö4sch3ei
+öscher3
+ö6sch5erf
+ö6sch5eri
+ö2schi
+ö2sch1l
+ö2sch3m
+ö2schn
+ö2schw
+ös1ei
+ö2sein
+öse3str
+ö3set
+2ösl
+ö2sp
+ös2s1c
+ös2st
+ö2st
+öst1a2
+ös3te
+ös2th
+ös3tr
+ö3su
+ö1ß
+ößen3
+öß2ti
+ö1t
+ö4t3a
+öte4n1
+ö2t3r
+öts2
+öt2sc
+öt2tr
+ö1v2
+ö1w
+ö1z
+öze3
+özes4
+1pa.
+1paa
+1pac
+p2ad
+pa3da
+2p3a2dr
+pa1fr
+1pag4
+pa3gh
+pa1ho
+1pak
+pa1k4l
+pak4to
+3pala
+pala3t
+3palä
+3pal2e
+pa3l2i
+1palm
+pal2ma
+pal2mä
+pal2m1o
+2palt
+pal2ta
+pal4tei
+pal2tr
+pa2m3a
+pa2nar
+pa4n3at
+pan3d
+pan4ds
+pa2neu
+panf4
+pang4
+pa4nisl
+pank4
+2panl
+2pann
+panne2
+pan4n3eb
+1pa2no
+pan3sl
+pan3t4h
+1panto
+2pantr
+panz2
+pan5ze
+1pap
+papi2
+papieren8
+papie8r7end
+pap2pr
+pap4s
+pa1q
+1para
+pa4r3aff
+par3akt
+pa4rant
+2parb
+1p2arc
+par3d
+2parer
+parer8geb
+1parf
+2parfö
+2parg
+pargel6d
+1park.
+par4k3am
+par4kau
+par4kr
+1park1s
+par3m2
+par3ne
+1pa2ro
+2parp4
+2parr
+4parta
+1parti
+1partn
+3party
+par3z
+pas2e
+pa3s2p
+pas6sein
+passer4
+pas6serg
+pas2s1p
+pa4st
+2paß
+pat1a
+pat4c
+pa5t4e2
+2patel
+1pat4h
+1pati
+1pat4r
+1pau
+2p1auf
+pa3uni
+2pausz
+1pav
+pay2
+1pä
+3pä2c
+pä3cke
+pä4ck3er
+3päd
+päde2
+pä2d1er
+3pär
+3päs
+pä4t1e2h
+pä4tent
+pä4tep
+pä4t3erb
+pä2t3h
+pä2to
+pä4tr
+pät3s4
+2p1b
+2p3c
+2p1d2
+pda4
+1pe.
+pe2a2
+pea4r
+pea4s
+p1e2b
+pech1
+1peda
+1peel
+pe2en
+2pef
+4p1eff
+1peg
+pei1
+2peic
+1peil
+p2eim
+2peis
+pekt4i
+pekt4sp
+2peku
+1p4el
+3pel.
+pe2l1a2
+pe4lai
+pe2l1ä
+peld4
+3pele
+pe4l1e2h
+pe2l1er
+pe2let
+pe2leu
+peli2d
+peli4n
+pe4l3ink
+pel3inn
+pel3k
+pel3l2a
+pell4e
+pell2i
+pe2lob
+3pels
+pel3sp
+1pem
+pe3nal
+pe4nas
+pen3d2a
+pe4nen1
+pe4ni2t
+pe2n1o
+pens2a
+3pen3si
+pen3s2o3
+pens2p
+pen6ster
+1pensu
+pen3sz
+pent2a
+2pentw
+penty2
+1pep
+pe3pi
+pept2
+pe1ra
+per2am
+per3as
+pe2rau
+pe2r1ä
+pere2b
+perer2
+perer3z
+pere1s
+pe3r2i3d
+3perio
+1perle
+3pero
+per4r3an
+1pers
+2perse
+2persi
+3persp
+peru2
+pe3run
+1perü
+perwa4r
+pe3s2a
+pese2n
+1pes5s2
+pe2st
+pes4ter
+pest1o
+3pet
+pet4r
+2pex
+1pé
+2pf.
+p2f1ab
+p2fad
+p2faf
+pf1ai
+p2f1ak
+pf1am
+pf1ans
+p2fa2r
+pf3are
+p2f1au
+1pfä
+p2fär
+p2f1äu
+4pfe.
+p2fef
+p2fei
+pf1eim
+pf1ein
+pfe2l
+p3fen.
+p4fener
+p2fent
+p4f1ep
+pfe2r5a
+p4ferde
+pfer6pro
+pf4es
+pf3f4
+p2f1i2d
+pf1inn
+p2f1in3s
+pfi2s
+pf1lam
+pf4lan
+pf3lä
+pf4leg
+pf3lei
+pf3lo
+p2f3om
+p2for
+pf3r
+pf1ra
+pf4rü
+2pfs2
+pf3sa
+pf3se
+pf3sl
+pf3sz
+2pf3t4
+p2fum
+2p3g2
+pgra2
+1ph
+2ph.
+ph2a
+phal4te4
+p1hand
+3pha1s
+p1hau
+phä1
+3phän
+4phär
+2phb
+2phd
+2p1hei
+phen3d2
+phe4n1e
+phen3s2
+2ph1ers
+2phf
+2phg
+phien3
+phik1a
+phi4kan
+2phk
+ph2l
+2phm
+2phn
+p2ho.
+p2hob
+2phö
+ph4r
+2phro
+2phs
+ph3t4
+2phthe
+phu4s
+phu3t
+2p1hü
+3phy
+2phz
+pi2a1
+piab4
+pia3k4
+pi4ali
+pia3n
+piap2
+pias4
+pi1ce
+pid2
+pi2el
+piel3a
+3pier
+pie2ra
+pie4reb
+pi3gl
+1pil
+pi3le
+3pilo
+pil4zer
+pil2zw
+p2im
+3pin.
+pi2nad
+3ping
+pingen4
+ping3s
+3pins.
+3pinse
+pin3s2p
+pi2o
+pi3o2i3
+pi3onu
+pi3os
+3pip
+pi2pe
+3pirate
+pi3ri
+3pirin
+1pis
+2piso
+pit2a
+pi3t2h
+pit2s
+pitz2e
+pi2z1in
+2p1j
+2p1k2
+pku2
+1p2l2
+2pl.
+3pla
+4p3lad
+p1lah
+pla3na
+p4lau
+pla2y
+3plä
+2p3le.
+ple1c
+ple2e
+p4leg
+ple3n2
+2p3ler
+2plig
+3p4lik
+p4liz
+2p3lu
+plu2s
+2p3m2
+2p1n2
+1p2o
+pob2
+po1c
+3pock
+3pod
+3poe
+po2el
+2poh
+po2i
+po3id
+3poin
+3pol
+po2lan
+po2l1au
+pold2e
+po3li
+polo3p
+pol3z2
+pom2ph
+2pond
+pont2
+po1ob
+po2p1ak
+po2p1ar
+po1pe
+po2pl
+po3pt
+po1rau
+porf4
+por3s
+3portal
+por2th
+3porti
+3porto.
+3portos
+3portr
+por4tre
+por6tric
+poss2
+po4sta
+pos4tag
+po2stä
+pos4tei
+pos3tel
+pos4tem
+po1s4tr
+post3ra
+po2ta
+pot1ar
+3potä
+3pote
+pot2h
+po2t3in
+pott1r
+po2t1u
+po3un
+po2w4
+po3x
+pö2bl
+pö2c
+2p1p
+p2p1ab
+pp1ans
+p2pat
+pp1au
+ppe3e
+pp1ei
+ppeli5ne
+ppels2
+ppel5ste
+pp2e2n1
+ppe4na
+p2p1erz
+p2pf4
+pp1fr
+p2p1h
+p4p1i4a
+pp3l
+p4p1lac
+p4plan
+pp1lä
+p2ple
+pp3oh
+p2p1ö2
+pp3p4
+p2p3ra
+p2p5rä
+p2pri
+pp3rol
+pp3rot
+p2p3ru
+p4ps
+pp3s4a
+pps2p
+pp3sy
+ppt4
+pp5te
+p4p1um
+p2r2
+1prak
+1prax
+p4rä
+1präd
+1präf
+1präg
+1präl
+3präm
+1präp
+3präs
+1präv
+2pre.
+2prec
+3pred
+2pree1
+pre2ei
+2preg
+1prei
+3preis
+prei4s3c
+prei6sei
+2preiz
+1prem
+pren4ga
+2p3rer
+1pres
+press4e
+pri4e
+2prig
+pri2l1
+2pring
+prings4
+1prinz
+pri2t1
+prit3a
+priter4
+prit5t
+1priv
+1pro
+3prob
+pro3be
+2proc
+7p4rod
+3p4rog
+3proj
+4pross
+pro1st
+prot2e
+3proto
+2prott
+2prö
+1prüf
+1prüg
+2prüh
+2prün
+2p1s
+4ps.
+ps1ad
+ps2hi
+ps1id
+p2sö
+ps4pi
+pss4
+p2st
+p3sta
+pst1au
+p3stä
+p3stea
+p3stel
+pst3erh
+ps2th
+p3s2ti
+ps4to
+p3stö
+ps2tu
+p3stü
+3p2sy
+4psys
+ps2ze
+2p1t
+pt1a
+pt2ab
+pta2g
+pt3a4t
+p3te
+p4t1e2b
+p4t3ec
+p4t1ei
+p4tele
+p4temp
+4pten
+p4t1en2g
+p4t1ent
+p4t1ep
+pt3erei
+p4t1erw
+p4t1erz
+p4t1e2ti
+p2t3h
+p3ti
+p4t1in1
+pt3ing
+pto2mo
+pto2p
+p4tos
+pto2w
+pt3r
+pt3s2
+pt4sl
+pts4t
+pt1uh
+pt1um
+p3tung
+pt1urs
+ptü4
+3p2ty
+pt3z2
+1pu
+pu1a
+pub4
+2puc
+pu2dr
+2p1uh
+2puk
+pu2kl
+pu2k1o
+pu2lin
+pul2sp
+pul2s5t
+2pulw
+pum2pl
+3pun
+4pund
+pun2e
+pun2s
+4punt
+2pur
+pu2ra
+pu2rei
+pus2h
+pu3she
+pu2s3t
+3put
+pu5t2e
+put2s
+puzi3
+1püf
+2pül
+pül3l2
+2p1v
+2p1w
+pwa4r
+3py1
+py3t
+2p1z2
+qu4
+que3rel
+quer5n
+que4te.
+1queu
+1ra.
+r1aa
+ra2ab
+2raac
+2raal
+ra3ar
+r2a1as
+r1ab
+ra2b1ar
+r2abä
+1rabbi
+rab2bl
+2rabd
+rabdru4
+ra2bei
+rab2er
+rab3erd
+2rabf
+2rabg
+2rabh
+1r4abi
+2rabk
+r2able
+ra2bli
+ra4b5lo
+2ra2br
+2rabs4
+2rabt
+2r3abw
+1raby
+2rabz
+r2ac.
+ra2ce
+2r1acet
+ra4cheb
+ra2cho
+rach6t5rä
+ra2chu
+r2ack
+1r2ad
+r4ad.
+rada2
+ra4dam
+2radap
+3radar
+ra2dei
+3radf
+3radh
+3radio
+3rado
+3radp
+ra4d1r
+rad5ri
+rad5t4
+ra2el
+r2af
+raf3ahn
+raf3ar
+rafe2
+ra2f1er
+raf3r
+raft5s
+rages4
+2ragg
+ra3g4le
+4ragm
+ra2gn
+r2ago
+1rah.
+rahle4n
+5r4ahm
+r1ahn
+2ra1ho
+ra3hö
+4raht
+r2ai
+2raic
+rail2l
+2r3air
+ra3ke
+2rakk
+3ra1k4l
+ra2kre
+r3a2kro
+2rakti
+ra2kus
+3rakü
+2rakz
+r2al
+r4al.
+ra2la2
+ra4l3ab
+ral1ak
+ra3lamp
+rala4s
+ra2lä
+ral3b4
+3r4ald
+ra4l3end
+ra4lent
+ra4l5ern
+ra3lex
+r4ali
+ra2lid
+rali1e
+ra4lind
+ra4l3ing
+2r3alk.
+2r3alm.
+2ralp.
+4ralpe
+r4als
+ral3sk
+ral3su
+r3alt
+3r4al5t4h
+ra2l3u
+3raly
+rama3s
+ra2mei
+ra2mer
+r2ami
+r2amm
+ram4man
+ram6mens
+ram6m5ers
+ram4m3u
+2ramn
+3ramsc
+2r1amt
+ramt4s
+ran3ade
+r1a2nal
+ra2nan
+ra2nar
+ra2nau
+2ranb
+r2anbe
+r4anda
+r4ande
+ran4dep
+ran4d3er
+3r2andi
+rand3s
+rand5se
+3raner
+2ranf
+2ranga
+ran6g5e6be
+1rangi
+r2angl
+rangs2
+rang5ste
+rani1e
+r3a4nil
+ran3ka
+ran2kr
+ran2kü
+4ranl
+2r1anm
+r2anmi
+r2anmu
+2ranna
+rano2i
+2r1anp
+2ranr
+2rans
+r2ans.
+r1ansc
+ran4spa
+4r5antei
+r1anth
+2rantr
+1ranu
+2ranw
+r2anz.
+r2ap
+2rapf
+2rapo
+ra2pok
+ra2pos
+rap2pr
+2ra2pri
+2r1aq
+r1ar
+r2ar1a
+2rarc
+r2are
+3r4arei
+raren1
+r2arf4
+ra3rie
+rar3in
+ra3ris
+r3a4rist
+4r3arit
+r2ark
+raro2
+ra2rom
+2rart
+2rarz
+rar3zw
+r2as
+r4as.
+ras2a
+ra4schl
+ra3spr
+ra2sta
+r4aste
+ras4t3ei
+r3asth
+ras4to
+2rasyl
+2raß
+1rat
+r4at.
+rat1a
+rat2ak
+ra2tan
+ra2t1ei
+r3atel
+ra4tid
+2ratm
+rat2o
+2r3a2tom
+ra5tor
+rat4r
+2ratta
+2rattr
+4ratz
+rat3ze
+4rau.
+3raub.
+rau3e4n
+2rauf
+rau3fä
+2rau3g2
+3raum
+rau4m3ag
+rau4man
+rau2m1i
+3raup
+4raur
+2rausb
+3raus2c
+2rausd
+2rausf
+2rausg
+raus8gewä
+2raush
+2rausl
+rau2sp
+2rauss
+raus8scheidu
+raus5se
+2rausv
+2rausw
+2rauto
+raut1r
+rau4tra
+rau4tro
+raut5s
+1raü
+r2ax
+raxe3
+r3axt
+4räb
+3r2äd
+4räf
+rä1fr
+4räg
+2räh
+4räm
+3rän.
+3räni
+3räns
+2räp
+2räq
+2r1är
+r2är.
+rä3ra
+rä1ro
+rä2sc
+räse2
+räte1s
+3rätse
+4rätz
+rä2u
+4räue
+räu2s
+räus4c
+räu7schen.
+2räuss
+2räuß
+4räut
+2räx
+4r1b
+r2b1ab
+r3bac
+rba4del
+rb2al
+r2bang
+r2bant
+rba3re
+rb1art
+r2barz
+rb1auf
+rbb2
+rb1ech
+rbe3erf
+rbei5d2
+rbe3inf
+rb3einh
+rbe3int
+r4belä
+rbel2o
+r3ben.
+rbe3r2e
+rber6gin
+rbe3rum
+r2bim
+r2binf
+rbit2a
+rbi3tu
+rb4la2d
+r2blan
+r8blasser
+r4b3last
+r3blat
+r3blau
+r2b3le.
+r3blen
+rb3ler
+r2bleu
+rb2lin
+rb2lö
+rb2ob
+rb3ras
+rb3rea
+r8b7rechts
+rb4sam
+rb2sei
+rb2ser
+rb2s1o
+rb4stä
+rb2su
+rb2u
+rbü4b
+rby4t
+4rc
+r1ce
+rce4n
+r1che.
+r1chen
+r1ch2i
+rch3l
+r3ch4lo
+rch3m
+rch3r
+rch1s4
+rch3sp
+rch3t2a
+rchter6r
+rch1w
+r1ci
+r2ck
+r1cl
+r1ç
+4r1d
+rd2ac
+r2daf
+r2d1ak
+r2d1a2l
+rd2amm
+rd1an
+rdani1
+rd1ara
+rd1ark
+r2darz
+rdär2
+r3de.
+r2dei
+rd2ei.
+r4deis
+r2d1elb
+r2delf
+rdem6
+rden3d
+r4dengl
+rde4nu
+rde3ob
+rde3r4er
+rderin6s
+r4d3ernt
+r3des
+rde3sp
+r4d1ex
+r2d1inn
+rd1iri
+rd1ita
+r2dof
+r3don
+rd1os
+rd3oss
+rdo4st
+r2dö
+rd3rat
+r2drau
+rd4ri
+rd5ris
+rd4rö
+r3d4rü
+rd2sän
+rd3s2k
+rd3s2z
+rdt4
+rd3th
+rdt2s
+r2d1uk
+1re
+3re.
+rea2d
+rea6l5erw
+4re2am
+re3at.
+re3ats
+2reä
+re2b1a
+re2b1l
+reb1r
+reb3ra
+reb3so
+rech3ar
+4rechs
+2reck.
+2recki
+3red.
+re3da
+4redd
+2redi
+re2dik
+3redn
+3redu
+re1e
+3refe
+4reff
+r2eff.
+3refl
+3refo
+3reg
+rege4l3ä
+4r1egg
+re3gi
+2reh
+re2hac
+re2har
+rehen1
+re4hene
+re4h3ent
+re2hi
+reh1l4
+re2h1o
+re3hol
+re2hü
+r2ei.
+r2eib
+rei4bel
+rei4ble
+2reid
+r2eie
+4reier.
+rei4fei
+4reifel
+2reig
+3reigä
+3reigeh
+r4eigel
+6reigens
+3reigi
+4reign
+3reigru
+rei3l2a
+rei3l2i
+2r1eilt
+3reim
+reim2p
+r1ein
+rein2a
+rei5nac
+rei3nal
+2reinb
+rein4du
+rei3n4e3c
+reinen5
+2reinf
+re4info
+4reinn
+4r3einr
+rein8s7tre
+rein4sz
+rein6teg
+re1in2v
+4reisar
+4reisb
+reises4
+2reisf
+2reish
+2reisr
+reister6
+2reisw
+4reiti
+reit3s2
+3rek
+4re2ke
+4rekk
+r2el.
+re3lat
+2relb
+rel2e
+relea4
+re5lei
+re2lek
+4relem
+r2elev
+2relf
+2relit
+2relix
+r2ell
+rel4lar
+rel4lei
+re3lo
+r2els
+2relt
+relu2
+r4em.
+4remb
+rem2da
+re2m1ei
+r2emi
+re3mig
+2remis
+4remit
+4rempf
+rems1c
+rem4str
+2rem2u
+r4en.
+r2ena
+2rena.
+re4nac
+re3nal
+re4n3an
+2r1endg
+3rendi
+ren3dr
+ren2eu
+5renf
+4rengag
+2rengp
+3renh
+re2ni
+3renl
+3renm
+ren4nar
+ren6nene
+renns4
+renrü2
+ren6sein
+ren6serg
+rens2p
+2rentd
+2rentf
+3rentfo
+2r1entg
+r3enthä
+2r1entl
+2r1ents
+2rentw
+2rentz
+r2enz
+ren6z5er6f
+renzer6l
+ren6z5er6s
+renzer6w
+ren4z3in
+ren2zw
+re2ob
+re1on
+re3or
+3repe
+4re2pen
+2repi
+re2pis
+2repoc
+2r1e2pos
+4repp
+3repu
+3r4er.
+rera2
+2r1erb
+rer2bi
+3r2erbr
+2r1erd
+rere2
+4r3ereig
+r1e4rek
+re2r1ep
+r2erer
+2r1erf
+4rerfah
+r4erfe
+3r2erfr
+rer2fü
+r1erg
+4r3ergeb
+5rergebü
+r4ergen
+3r4erges
+2rergo
+rer2gr
+r4ergru
+rer2hö
+r1erk
+rer4kan
+rer2ke
+4r3erken
+3r2erki
+3r2erko
+r1erl
+2r3er2la
+5r4erlag
+r3erleb
+r2erli
+2rerlö
+2r1erm
+rer2n
+2r1ernä
+r1erne
+2r1erni
+4r3erns
+4r1ernt
+re1ro
+re2rob
+re4rosi
+2r1er2ö
+r1erre
+rer4reg
+rer4rei
+r1erri
+5r2ers.
+2r1ersa
+rer3sc
+r6erschi
+r2erse
+2rersp
+rer2st
+r6erstad
+r1ert4
+r2erte
+4rerträ
+r1erw
+2rerwa
+rer4wac
+rer4wec
+r4erwes
+2r1erz
+rer2zä
+3r2erzy
+3r4es.
+re2sa
+re4sam
+re3sar
+re4schw
+3rese
+re4se2h
+3resol
+3reson
+res2po
+2ress
+4resse
+res6s5erw
+4ressu
+re1sta
+res4tas
+res4tex
+2res2tu
+3resu
+re2t1ak
+re2tau
+re2thy
+re4trol
+re2u
+reu4eri
+reu3g2
+2reul
+re3uni
+2r1eur
+4reuu
+2reü
+4r3eva
+2r1evid
+rewa4r
+re2wi
+2rewo
+2r1e2x1
+2rezi
+1ré
+4r1f
+r3fam
+r2fent
+r3f2es
+rff2
+rf3fe
+rfi4le.
+r4fland
+r3f4lä
+rf3lic
+rf4lö
+r3flü
+r2fo2b
+rfolg4s
+r3fot
+r4frauc
+rf4ru
+rf4rü
+rf4sam
+rf2s1ä
+rf2su
+rf2ta
+rft4r
+rf2u
+rfzu3
+4r1g
+r2g1a2d
+r2g1ah
+r2g1ak
+rga4ner
+r2g1ap
+r2garb
+rg3art.
+r2g1ask
+rgas4ta
+rga3su
+rgd2
+rge4an
+rge2bl
+r2g1e2c
+r3g2el
+rge4l3er
+rgen6sem
+rgen4z3w
+r4ge4tap
+r2geto
+r7gie
+rgi4sel
+r2glan
+r2gleu
+r2glig
+rg2log
+rg2lu
+r2g3na
+r2gne
+r2g3ni
+r2g3no
+r2g3oa
+r2go4b
+r3gog
+rg3op
+r2g1or
+rgö2
+r2g1öd
+r2g3ral
+rg4rau
+r2greg
+r2g3res
+r2gret
+rg3rin
+r3grun
+rg3rüs
+rg3sä
+rg3se
+rgs2ei
+rg4sel
+rg3s4i
+rg3sp
+rgs2pe
+rgs2po
+rgs2ti
+rgs4tr
+rgs2tu
+rg3su
+r1h4
+2rh.
+2rha
+r2ha.
+r4haltb
+r3han
+2rhä
+r2he.
+r5hea
+2rheb
+2rhef
+2rheit
+2rher
+2rhi
+2rhof
+rho2i3
+2rhol
+2rhot
+2rhöl
+2rhs
+rhu2s
+2rhü
+1ri
+ria3ne
+ri2ano
+ria1s
+ri2ast
+ri3at
+ri4atr
+rib2bl
+ri1ce
+ri1cha
+richt8spo
+3richtu
+ri2con
+ri2dau
+ri3de.
+4ridee
+ri2de2l
+ri4ds
+r2ie
+rief1a
+4riefm
+rie2f3r
+ri2e1i
+riein1
+ri1el
+rie3l2a
+ri3els
+ri4enä
+riene2
+ri3eni
+rien3s
+rie4nu
+ri1er.
+rie3re
+riere4n
+ri3ers.
+rie3sa
+ri1eu
+ri2f1a
+ri2fä
+ri2fei
+ri2fer
+rif6f5end
+rif4fer
+ri2f1o
+ri2fr
+rif3s
+rif4ter
+3rig
+4riga
+4r3i2gel
+ri4gene
+5rigj
+rig1l
+4rigr
+4rij
+ri2kar
+ri2kä
+ri2kin
+ri2kn
+ri4kone
+ri2kor
+2rima
+ri2mag
+ri2mau
+ri2me.
+2rimm
+2rimp
+rim2s
+rim4sc
+rim4st
+rin2c
+r1ind
+rin4dex
+rin6dize
+2rindu
+ri3n2e
+rine1i
+2r1inf
+rin2fo
+3r2infr
+rin2ga
+ring3le
+rin2gr
+2r1inh
+2rinit
+4rinj
+4rink
+rin2kl
+rin2ko
+rin2kr
+2rinl
+6r5innenm
+4r3inner
+2r1innr
+r1innu
+2r1inq
+2r1ins
+3r2ins.
+rin4sek
+rin2so
+r4inspi
+3r2insy
+2rint
+4rinte
+rin4t5re
+2r1inv
+ri2ob
+4r1ir
+r2is
+ris2a
+ri3san
+ri4sch3o
+ri4schw
+3risik
+ri3s2ko
+rismu2
+r3iso
+2risol
+ri4s3p
+r3isr
+3riss
+ri4s3t
+ris6t5ers
+ris4t3r
+r2it
+rit2a
+r3i2tal
+rit3ant
+2ri3t4r
+rits2
+rit2t3a
+3ritter
+rit4to
+rit2t1r
+5ritu
+rix1
+1rí
+2r1j
+4r1k
+rka2b3l
+r2k1ak
+rk1all
+rk2am
+rk1are
+rk1asp
+rkauf4s
+r2k1äh
+r2kef
+r3kel
+r4kelem
+rke2n1
+rken3s4t
+rk5ersta
+r2k1erw
+r3ket
+r2k1im
+rk4las
+rk4lau
+rk4lim
+r2klis
+rk2lo
+rk2lu
+rk4n
+rk5nu
+r2kob
+r3kol
+r3kon
+rk1o4ri
+r2kou
+rk2ö
+rk3räu
+r3kri
+rk3rin
+r2k3rom
+r2krou
+rk2sei
+rk2sel
+rk2ser
+rk3shi
+rk2so
+rk2sp
+rkstati6
+rk4stec
+rk4stoc
+rk2ta
+rk2tel
+rk4t3eng
+rk4tent
+rk4t3erf
+rk4terg
+rk4t3erl
+rkt3ers
+rk6tersc
+rk4t3erw
+rk4t3erz
+rk4teta
+rk2tin
+rk4t1o2
+rkto4b
+rk2t3r
+rk4tri
+rk2tum
+rk2um
+rku2n
+rku2sa
+r2küb
+2r1l
+rl2ab
+r3lag
+r5land
+rlan4d3i
+r2l1ar
+r2l1a2sc
+r2l3aug
+rle2a
+r3lec
+r3lep
+r3lex
+rlg4
+r3l2i
+rli4ne.
+rli2s
+r3l2o
+rlou1
+rl2ö
+rlös3s
+rls2a
+rl2spr
+rl3ste
+rl2s5to
+rl3t
+r3l2u
+r3ly
+rlz2
+4r1m
+r2mab
+r2m1ad
+rma2la
+rm1ald
+rm1ami
+r2m1ank
+r4mantr
+rm1anz
+r2m3aph
+r2marc
+r2marz
+rma4s3pe
+rmat2o
+rm2är
+rm3d2
+rm1ef
+r4m3einh
+rme4na
+rm2ene
+r2ment
+r2meo
+r2m1erh
+r2m1erl
+r2m1erp
+rm2es
+rme1st
+rmes4z
+rmeta2
+r2mide
+rmi6nanz
+rminen4
+rmi6neng
+rmon3s4
+rm1o2ri
+rmo1s
+rm3p2
+rm3sa
+rm3s2k
+rm3t2
+rmu2n
+r4muna
+r2muni
+4rn
+rna2b
+r3nad
+rn4ade
+r3nage
+r2n1all
+rna4n
+rn4and
+rn3ani
+r2nanz
+rna2r
+rn3are
+r4n3ari
+r4n1ast
+r4n3att
+r2nau
+rn3aug
+rnd4
+rn3de
+rn3dr
+r4nef
+rn2eid
+r4neif
+r4neis
+rn1ema
+rne2n
+rn1ene
+rn2eng
+r2n1ep
+r4n1erg
+rn4erhi
+r4n1erl
+r4n1ert
+r4n1erw
+r4nerz
+r5nes
+rn2e2t
+rne4tem
+rne4to
+rn2eu
+rne3uf
+r4nex
+rn3f
+rn3g2
+r2nid
+r2nin
+r3nit
+rnk2
+rnn2
+r3nod
+rn2oh
+rn3oly
+r2n1op
+r2n1or
+rn1ö
+rnö2d
+rn3s2a
+rn3s2ä
+rn3s4p
+rns2u
+rn3s2z
+rn3t2a
+rn3t2e
+rn1ur
+r1nü
+r1ny
+rnz2
+2robj
+rob2l
+1robo
+ro2bo2r
+ro2bre
+2robs
+ro1c
+roch2a
+3rock.
+r2o3de
+ro3e4
+2roff
+ro3fl
+4rog.
+rog2a
+3rogg
+roh1l
+4rohn
+ro2hö
+3rohr
+3roi
+ro3in
+ro1ir
+rok2l
+ro3le
+ro2liv
+rol4lan
+rolle4
+rol6lerg
+rolls2
+rol3s
+2roly
+4rom.
+ro2mad
+ro2mal
+3roman.
+2romb
+romen3e
+ro2m1er2
+2romn
+rom3s
+4romt
+r2on
+ro3n4ab
+ro2nan
+3rond
+4ronk
+3ronn
+rons2
+ron4tan
+ron6tend
+ron4t3r
+ron2t1u
+ro1ny
+ro1o2f
+ro1pe
+2ropf
+1ropl
+2ropt
+r1or
+ro2r3al
+ro2rat
+2rorc
+ro2rel
+ro2ro
+ror3th
+rort2s
+ror2ü
+ro3sh
+ro3s2i
+ro5s2k
+ros4sal
+ros4san
+ros2s1c
+ros4st
+ro1sta
+ros6t1r
+ro2sum
+4r3osz
+4roß
+ro2ßi
+ro2tan
+ro4tas
+ro4t3au
+ro2tä
+ro3te
+ro2tei
+ro2t3ho
+ro2tru
+rot3s
+rots2o
+rot2ta
+ro3tu
+3roul
+ro3unt
+5rout
+4roy
+rö2b3l
+rö2du
+2rö2f
+3röh
+2r1ök
+1röl
+2röl.
+rö3le
+röl2l
+r1ölp
+3römi
+r1ör
+r2ös.
+rös1c
+r2öse
+1rösl
+4röß
+3rötu
+4r1p2
+r3pa
+r3pe
+rper3in
+rpf4
+r2pli
+rp4lu
+rpo2st
+rpro1
+rp3se
+rps3t
+r4pt
+r3pu
+2r1q
+2r1r
+rr2ab
+rrat2s
+rr1auf
+rr1äm
+rrb2
+rr1c
+r5rega
+r5regi
+rr2ei
+rre2le
+rre2pa
+rr2er
+rrer4s
+r3res
+rre2ve
+rr2hen
+rr2hos
+rr2i
+rri3k2
+rrm2
+rrn3au
+rr2o
+rr3obs
+rro3m
+rro2re
+rrr2
+rr2st
+rr3str
+rr3stu
+rr2th
+r3r2u
+r3r2ü
+rrz2
+4r1s
+r3sabo
+r2s1a2d
+rs2al
+r4samp
+r4s1amt
+rs2an
+r4sanf
+r4s3ang
+rs3anm
+r4sanp
+rs3ant
+rs3anz
+rs3ar
+rs4ark
+r4sarm
+r4sch3e4b
+r6scherl
+r3schu
+r2s1ebe
+rse2e
+r2s1ef
+r2sein
+rse2n
+rs2end
+rse4ne
+r2sepi
+rs1ere
+r2serh
+rs1ers
+r2serz
+rse2t
+rs1eta
+rs2ext
+r3s2hav
+r3shir
+r3sho
+rs2hor
+r4shu
+rs2il
+rs2ka
+rs2kel
+rs2ki
+rs2kl
+r4skor
+r3s4kri
+r4sky
+rs4mog
+r3s4no
+r3so
+r4sob
+r4s1op
+r4sord
+r4sorie
+r4s3ort.
+rs2p
+r4spara
+r3spe
+r4s3ph
+rs4por
+r4sput
+rss2
+rst3abl
+rst3ala
+r4stale
+r4stans
+r4stant
+r2stas
+r7stati
+r7statu
+r3stä
+rst5eing
+r6st5eint
+rs4temp
+rster2
+rs4t4erb
+rst3erl
+r3s4tern
+rst3erw
+rs2tev
+rs2t3h
+rs2ti
+r3stie
+r2stin
+rst3ing
+r3stink
+r2stip
+r2stit
+r3sto
+rs4tol
+rs4tor
+r4stot
+rs4tr
+r3stra
+rst3ran
+r6strang
+rs2tu
+rs4tuc
+r3s4tü
+rsuch4s
+r3suf
+r3sy
+r1ß
+4r1t
+r2tabo
+rt1abs
+rta2ck
+r2t1ad
+r2t3ae
+r3taf
+rt3akr
+r4t3albe
+rta3l2e
+r2t1all
+rt1am
+rt2ame
+r3t2anb
+r2t1ang
+rt1ann
+rt1ant
+r2t1ar
+rt3att
+r3taufe
+rt3äh
+rt1änd
+rt1ärm
+rte1e2
+r3teh
+rt1ein
+rt4eind
+r4t3einh
+rtei1s4
+r2telf
+rtels4t
+r2temo
+rte2n1
+rte4na
+rten3s4
+r4t3ents
+rten3z
+rteo2
+rt3erei
+r6tereig
+r4terfa
+r4ter4fo
+rt1erh
+rt1erk
+r4t3erla
+rter8löse
+rter6mit
+r4t3ernä
+r2terö
+rter4re
+rt1ers
+rt4ersp
+rt1erz
+rte3s2k
+r2texa
+rt3he
+r2t3hi
+rt3hol
+rt2hum
+r3tic
+r2tid
+rtik2
+r2t1ima
+r4t3inf
+rt2is
+r2t1o4b
+r5top.
+rto1pf
+rt1or
+r4torg
+r4trak
+rt3rams
+rt3rand
+rt3rati
+rt3rec
+r3tre1s
+r4t3ris
+rt3rol
+rt3roma
+r3trop
+r2trou
+rtrü2c
+r4ts
+rt4seh
+rts2el
+rt3sex
+rts3ing
+rt2s1o
+rt2spa
+rt2spr
+rt4s3tan
+rts4tie
+rt3t4
+rt1umb
+rt2u3na
+r2t1up
+r2t1urt
+rtu4t
+r2t3ute
+r3tü
+rt3z2
+1ru
+ru1a
+ru4ale
+ru3a2r3
+rube4
+ruben3
+rubens4
+rub2i
+ru6ckerl
+ru2cku
+rude2a
+ru2dr
+3ruf
+ru2fa
+ruff4
+ruf2s
+rufs1p
+ruf4ter
+ru2g3r
+3ruhm
+2r1uhr
+3ruin
+ru1ins
+ru1is
+2rum
+4r3umd
+4r3umf
+4r3umg
+ru2mi
+4r3uml
+4r3umsa
+4r3umw
+4rumz
+2r1una
+2rund
+run4d1a
+runden5e
+run4d3er
+runds2
+run2e
+runei2
+4r1unf
+run2ga
+2rungl
+4r1u2ni
+r3unio
+ru4nis.
+run2kr
+4r1unl
+2r1unm
+4runn
+4runr
+r1unse
+4r3unt
+4runw
+2rupd
+ru3pr
+4r3u2r
+rur1e
+5ru3ro
+ru2si
+rus2p
+rus2s1p
+rus4st
+ru2st
+ru2tab
+rute4
+ru4tei
+ru4t1el
+rut3h
+ru4t1o4
+ru2t3r
+rut6scha
+4ruz
+ru2z1w
+1rü
+2rüb
+4rübu
+rü1ch
+rü4ckel
+rücks4
+rü2hel
+rüher2
+rüh1l
+4rümm
+rün3z
+2r1v
+rv2el
+rve4n1e
+rvenen4
+r4ventz
+rve3s
+r3v2o
+2r1w
+rwe4gel
+r3wei
+rwelt4s
+r5werk
+r5wert
+r2wo.
+r3woh
+r3wort
+rwun3s
+4r1x
+1ry
+ry2c
+ry3sth
+rysti1
+2r1z
+rz2ans
+r2zant
+r2zar
+r2zat
+r3zähn
+rz2än
+r5zene
+rz1eng
+r4z3ents
+rze2p
+rze2ra
+r2z1erd
+r2z1erf
+r2z1erg
+rz1erk
+r2z1erl
+r2z1erw
+r2z1ess
+rz1id
+rz1int
+rzir3
+rz2of
+r2z3ot
+rz2tan
+rz3te
+rz2th
+rzu4g3l
+r2zwä
+r3z2wec
+r2zwir
+1sa
+3sa.
+3s2aa
+2s1ab
+sab2ä
+4sabd
+sa2be
+3sabet
+s3abi
+sa2bit
+sa2bl
+4sabm
+sa2bor
+sa2br
+4s3abs
+4s1acc
+5s2ache
+sa2cho
+sach3t
+s2ack
+2s1ada
+2s1adm
+2s1a2dr
+3safa
+sa4fe
+4s3aff
+sa1f4r
+s2aft
+saf4tr
+3saga
+sag2e
+5sagen.
+4s3agent
+2s1agg
+sa2gio
+sa2git
+sag4n
+s1a2gr
+s2ahs
+3s2ai
+sa3i2k1
+sail2
+sai4r
+2s1ak
+sa2ka
+sak2e
+3saki
+4sakk
+4sakt
+3s2al.
+s2al2a
+sa2l3an
+sa2lar
+sa3lat
+3salb
+sal3bl
+3sald
+sa4lerk
+3sali
+sa2l1id
+s1all
+sal4le.
+3salo
+sal2se
+s1alt
+s2al3t4h
+3salz
+3sam
+4s1a2mat
+4s1a2mei
+s3ameri
+5samm
+6s1amma
+4s1amn
+s1am3p4
+4samph
+sam4ta
+sam4to
+samt3st
+s1an
+s2an.
+2s3a2na
+sa4nä
+2s3anb
+s2an2c
+3s2and
+san4dan
+san4dri
+sand3s
+sa2ner
+3sang.
+2s3anh
+3sani
+3sanken
+2s3anl
+2sa2no
+2s3anp
+2s3ans
+s4anse
+san4sk
+san3sp
+4santei
+4s3antr
+4s3anw
+2sanz
+2s1ap
+sa2pe
+sa2po
+sap3p
+3sapr
+2s1aq
+2s1ar
+3s4ar.
+3sara
+4s3arb
+3s2ard
+s2are
+s3area
+sar2ga
+sa3rin
+s2ark
+4sarm.
+sa2rom
+s3arr
+s2ars
+4sart
+sa4r1u2
+sas2a
+2s1asc
+2s1a4si
+2s1a4sp
+sas2tu
+4s1asy
+sat2a
+sa4t3ant
+sat1ei
+2s3a4tem
+s3ath
+3sat2i
+2s3atl
+2satm
+sat2o
+sa4tol
+sa2tom
+sa2tr
+s3atta
+4s3attr
+3satz
+5satza
+sat4zel
+sat4z3en
+s1au
+3sau.
+3sauc
+3sau2e
+2sauf
+4s3aufb
+saug3le
+sau2gr
+3saum
+sauri1
+2saus
+3saus.
+4s3ausb
+4sausf
+4sausg
+sau2sp
+4sauss
+3sauste
+4s3ausw
+2sauß
+s1av
+sa2ve
+sa2xi
+sa2y
+1sä
+3s2äb
+3s2äc
+3s2äg
+s1äh
+4s3ähn
+3säl
+4s1ält
+2s1äm
+4s3änd
+4s3äp
+2säq
+2s1är
+3s2ärg
+3s2ät
+3säul
+4säuß
+4s3b4
+sba4ne
+sbau6men
+sbe3r2e
+1sc
+2sc.
+2scab
+2scac
+2scal
+2scam
+2scar
+2s1ce
+4s3cei
+sc4h
+4sch.
+3schaf
+3s2chal
+sch3ana
+4schanc
+4schang
+4schao
+4schara
+4sch3ar5m
+s2chä
+2schäq
+4schb
+4schc
+2schd
+sch2e
+4schech
+6schef.
+6schefi
+6schefs
+s4chei
+4sch3ei.
+sch6ein.
+4schemp
+s4cher
+sch5erfü
+3sches
+4schess
+s2cheu
+4schex
+2schf
+2schg
+2schh
+schi4d
+schi4e
+s4chif
+4schiru
+3schis
+2schk
+s4chl
+sch4lac
+4schle.
+6schlein
+4schloc
+4schlöc
+4schmas
+4schmed
+2schmö
+4schmüh
+2schmy
+2schn.
+4schneb
+4schnut
+4schobj
+4schorc
+2schox
+4schör
+4schp
+2schq
+4schrad
+4schre.
+4schrin
+4s3chris
+sch3rom
+4schron
+4schrou
+4schs
+schs2e
+sch3s2k
+schs4ti
+4sch3t
+scht2a
+scht2i
+scht2o
+s4chu
+4schunt
+2schv
+sch4web
+4schweg
+6schwerk
+4schwet
+4schwid
+3schwu
+2schz
+2scj
+4s3cl
+2sco
+3s2cop
+s2cr
+2scs
+2scu
+4s3d2
+sda3me
+sde1s2
+sdien4e
+sdi1st
+sd4r
+1se
+se3ar
+se3at.
+seb2
+5sebä
+2s1e2ben
+2s1echo
+sech4st
+2s1echt
+4s1e2ck
+se2dik
+3see
+see1i4
+se2e3ig
+se2el
+see3len
+se3en.
+seen2e
+se3er.
+see1ra
+seer2e
+se3e2r1i
+se1ers
+see3s4
+see3t
+4s3eff
+sef4l
+3s2eg
+4s3e2gal
+se2gl
+seg4r
+3seh
+seh1a
+se2hag
+se2hel
+seher4e
+se4herk
+se2h1in
+seh3l
+se2h3ö
+seh3re
+seh5r2i
+seh1s
+seh3t
+se2hüb
+2sei.
+2s1eic
+2s1eid.
+sei3da
+4s3eifer
+4s1eig
+sei3le
+s2eim
+s1ein
+5s4ein.
+2seinb
+sein4du
+2sei3n2e
+seine3i
+4seinfl
+sein4fo
+4seing
+2s3einh
+2seini
+2seink
+2seinl
+2seinn
+4seinr
+s4eins.
+4seinsc
+4seinsp
+sein8stit
+sein6str
+4seintr
+2seinw
+2s3einz
+2s1eis
+3s2eit
+seit2s
+3sek
+4s1e2kel
+4sekz
+s2el.
+se2l1a
+se3lad
+3s2elb
+sel1ec
+se2lef
+2s3e2leg
+4selem
+se2ler
+sel3ers
+2self.
+s3e2lit
+2s1elix
+s2ell
+se2lob
+s2els
+sel3sz
+selz2
+sem2a
+sem2e
+2s1emis
+4s3emp
+s4en.
+3sena
+se4nad
+se3nal
+se4nas
+sen3au
+s2enb
+2s1endl
+sen3d4r
+senen1
+se4nene
+4senerg
+se4ners
+se4ness
+s2enf
+3s4eni
+se2n1im
+3s2enk
+se2no
+se4nott
+se4noz
+3sens
+s2ensa
+sen4s3e4h
+4sensem
+s4ensi
+s2enso
+senst2
+sen8s7turm
+sent2a
+sen3tä
+2sentd
+4sentf
+4s1entg
+4sentla
+4sentn
+sen3tr
+4s1ents
+2sentw
+4sentwu
+4sentwü
+2sentz
+se4n3u
+sen4zer
+sen3zw
+seo2r
+se2pen
+3seq
+s4er.
+se2r3a2d
+ser3al
+ser3ass
+ser3äus
+serb2
+s3erbe.
+se2re2b
+6sereign
+se4r3eim
+5s4eren
+se4r3enk
+s4erfe
+s2erfr
+s1erfü
+4serfül
+ser3g2
+s2ergr
+s1erh
+2serhö
+3seri
+5serie
+ser3k4
+4s3ermit
+s2ern.
+s3erneu
+4s3ernt
+2s1e2ros
+s1erot
+s1erö
+4seröf
+3s2ers.
+2sersa
+4serseh
+ser6sehn
+4ser4set
+se3ru
+se4ruh
+ser2um
+se4rup
+5s4er3v
+s1erz
+5s4es.
+se3s4a
+se2sel
+se3sk
+2s1essa
+se1sta
+se3stec
+se3stei
+se5stemp
+sest3ri
+set2a
+2s3e4tap
+se2tat
+s1e2th
+4s1e2tik
+se3tun
+se2ty
+3setz
+3seuc
+4s1eul
+seum4sc
+se1u2n
+s1ex
+5sex.
+2sexa
+se2x3en
+s2exi
+s2exo
+4sexp
+sex3t4r
+4sexz
+1sé
+4s3f4
+sfal6l5er
+4s3g4
+sgang4
+sga3su
+sge3s4a
+2s1h
+4sh.
+sh2a
+3s2ha.
+shal4li
+shalt2
+shalt4s
+4shan
+s2has.
+s3hä
+sh2e
+3shi.
+3shid
+s2hip
+shi4r
+sh3n
+4s3hoc
+4s3hof
+4shom
+3s2hop
+sho4re
+3s4how
+4s3hö
+sh4r2
+4shs
+s3hu
+1si
+si2ad
+2siat
+5s4i1c
+si2cha
+sid2
+s2ide.
+s2i3do
+2sidy
+3s4ie
+sie2bu
+sieh1e
+sie4hes
+si3e2n3
+si1err
+si1f4
+3s4ig
+si2g1a2
+si2gei
+sig4n
+si2g3r
+sig4st
+si2k1ab
+si2kak
+si2kar
+si2k1ä
+si2k1el
+siken2
+sik3erl
+si2ket
+si2k3i
+sikin1
+si2k3n
+siko3
+si2k3r
+sik3s
+sik3t4
+si2ku
+sil2br
+sil2e
+3sili
+s1ill
+3silo
+2s1imm
+sim4st
+3simu
+si3n4a
+2s1ind
+2s1inf
+s3infor
+sing1a
+sin3g4le
+sin2g3r
+sings2
+sing3sa
+sing3so
+2s1inh
+s1in1i
+sini1e
+sinner4
+2s1inno
+2s1inq
+2s1ins
+s2ins.
+2s1int
+2s1inv
+3sio
+sion4
+sirn4
+2sirr
+3siru
+si2sa
+si4sam
+3s2isc
+si4schu
+si2s1e2
+si2sis
+s1i2so
+si2s3p
+sis3s4
+3s4ist
+si2su
+3s2it
+si2tal
+si2tau
+si2tra
+sit2u
+si2va
+sive3
+si4v3erf
+siv1o4
+si2vor
+siz2
+1sí
+2s3j
+2s1k2
+4sk.
+sk4a
+4s3kab
+s3kad
+4skalk
+4s3kam
+4s3kana
+4skanä
+3skanda
+4s3kap
+4s3kar
+4s3kas
+ska4te.
+4skateg
+ska4tes
+ska4to
+4skä
+4skb
+ske2li
+4sken
+3skep
+4sker
+s3kh
+3s2ki.
+3s2kif
+3s2kik
+s3kin
+4skir
+ski1s
+s2kis.
+3skiz
+sk4l
+4s3klas
+3s2klav
+4s3klu
+4sk4n
+4skoh
+4skol
+4skom
+4s3kon
+3skop.
+sko2pr
+4skos
+4skow
+4skö
+4s3kra
+s3kre
+4s3kro
+4sk3s
+4sk3t2
+skto2
+3skulp
+4skun
+sku2s1
+4skü
+4skv
+2s1l2
+sl4a
+s3lab
+3slal
+sla2ve
+s2law
+s3lä
+sl3b
+4s3le
+sler3s
+s3li
+3s4lip
+s3lo.
+slo3be
+s3loc
+s3loe
+s3lof
+3s2low
+s3ly
+2s3m2
+sma3b4
+sma3sc
+sme3na
+smi2t
+2s3n2
+snab4
+sni4a
+sni3er.
+sni3ers
+4s5not
+1so
+3so.
+2s3oas
+2s1o2b
+3s2o3ba
+4sobj
+4s3obo
+so1c
+so3et
+s1o2fe
+3soft
+3sog
+sog4l
+s1o2he
+3sohl
+sohle2
+2s3ohng
+2s1ohr
+3soi
+2s3ok
+3sol.
+so3la
+so4lau
+3sold
+3sole
+so2l1ei
+so3li
+sol2la
+sol4ler
+so3l2o
+4s3o2ly
+som2e
+3son
+son2a
+sone4
+son3sä
+son4s1o
+so3o
+2sope
+2s1opf
+3sopr
+sop3s
+s1orc
+2s3ord
+sore2
+so2rei
+so2rel
+4s1orga
+so1rh
+2s1o2rie
+so2ro
+3sorp
+3s2orti
+so4ru
+3sos
+s2os.
+4so4sk
+4sosm
+4s1ost
+4s1osz
+3so3ß
+soth1o
+3sott
+soun2
+sound1
+so3unds
+so3unt
+s1out
+3sov
+3sow
+2s1ox
+3soz
+s3o4ze
+1sö
+sö2c
+s1ö2d
+2sö2f
+2s1ök
+2s1öl
+2s1ös
+1sp2
+2sp.
+4spaa
+s2pace
+2spack
+2spag
+2spak
+2spala
+2spalä
+3spalt
+spa2m
+s2pan.
+3spannu
+3spant
+2spanz
+2spap
+2s3para
+s4parka
+2sparo
+5s6parten
+4spartn
+4sparty
+3spaß
+3spat.
+2spati
+4spatr
+2spau
+3s2paz
+s2pä
+2späd
+3späh
+2spär
+2späs
+2s3pe.
+2speg
+3speic
+4spein
+4spensi
+spe3p4
+s2pera
+3s2perg
+s1peri
+4sperle
+2spero
+s2perr
+2spers
+2sperü
+4spet
+3s4pez
+4s3pf4
+2spha
+s2phä
+3sphär
+s3phe
+s4phin
+3s2pi4e
+4spier
+spier4r
+s3pi2k
+4s3pil
+3spio
+2spip
+4s3pis
+2sp4l
+4spla
+4splä
+4sple
+sp5le.
+3s2pli
+4s3plu
+2s3pn
+2spod
+4spoe
+2spog
+s2poi
+4s3pok
+4spol
+s2pons
+2spop
+s2pore
+s2porn
+spor6tag
+4s3pos
+4spote
+4spr.
+3s2prac
+2sprak
+s2pran
+2sprax
+3spräc
+2spräm
+s2prän
+4spräs
+3s4prec
+4spred
+4spreis
+5s2pren
+2s3pres
+s2pric
+3spring
+4sprinz
+s2prit
+2sprob
+4sprog
+4sproj
+4sprop
+3spross
+2sproz
+3sprö
+3s2pru
+3sprüc
+2sprüf
+3sprün
+4s3ps
+2s4pt
+2spub
+2spud
+3spuk
+3s2pule
+2spun
+4spunk
+2spup
+3s4pur
+spu4rer
+2sput
+4spy
+2s1q
+4s3r4
+srat2s
+sre3cha
+sreli1
+sre4th
+srö2s
+srücker6
+6s1s
+ssa3bl
+ssa3bo
+s5sack
+ss4agi
+s2s1aj
+ss3alba
+s2sall
+s4samt
+s2sanf
+s4sang
+ss2ann
+s4sano
+s4sans
+ss2ant
+s4sanz
+ss2ara
+s3sars
+ssa1s
+ss3att
+ssau3e
+ssau4r
+s3s2ä
+s4sce
+ssch2
+s3schw
+s4sco
+s2scr
+s4seben
+ss1ec
+sse1e
+sseh2a
+ss4eind
+sse3int
+s4seis
+s3sel
+sse2lö
+s3sen.
+ssen6sem
+ss1epe
+sse6ratt
+ss2erf
+ss3erfü
+ss4ergr
+sser4hö
+sser6mit
+sser4öf
+ss3erse
+ss4eru
+sser6wei
+sses4sa
+s4s3estr
+sse3ta
+ss3i2ko
+s2sill
+s2simp
+ssing3s
+s2s1isr
+s3skala
+ss3l
+ss1off
+ssoi4
+s3sol
+s4sop
+ss2orc
+ss2phi
+s3spi
+ss2pot
+s3sprä
+s3spri
+s2spro
+ssquet4
+ss3s4
+sssau4
+sst2a
+s4stag
+ss3tak
+s3stä
+sst2e
+s3stel
+s3s2tep
+s3s4tern
+ss4teu
+ss2ti
+s3sto
+ss4tör
+s3stran
+s3s4tras
+s3s4trat
+s3strä
+s3strec
+s3strom
+s3strö
+ss2tur
+s3stü
+s2sumg
+s2sumr
+ss1ums
+ss2ur
+s3sy
+s1t
+4st.
+s2ta
+2sta.
+3staa
+3stab.
+2stabb
+4stabel
+4stabit
+2stabl
+st2ac
+3s4tad
+4stadm
+3staff
+2stag
+3stagl
+3s4tagr
+3s4tah
+2stak
+3staks
+2stala
+sta3lak
+2s3talb
+s4talg
+s3ta3l2i
+2stalk
+st1alp
+st1alr
+st1a2mi
+1stamm
+1stan
+2stanb
+s4tand
+2stanf
+s4tanh
+2stanl
+s4tanm
+4st1ann
+st3ansp
+2stanw
+stapo1
+4stapol
+4s3tapos4
+4s3tapot
+st1app
+s4tar.
+s4tarb
+sta6rens
+4stari
+s4tark
+s4tarm
+s4t2ars
+s4tart
+s4tase
+s4tasi
+stast4
+s3tat.
+2statb
+3stati
+7statth
+s4tau.
+2stauf
+2staug
+3s4taur
+4stausb
+4stausg
+4stausr
+4stauss
+s4taut
+s4t1a2ve
+4stax
+1s2tä
+3stäb
+3städ
+4stäg
+4stäp
+5s4tär
+3stätt
+2s3täus
+2stb
+2st3c
+2std
+4ste.
+4steam
+4stechn
+s2te2d
+st1edi
+2stee
+3s2teg
+ste2g3r
+1steh
+s2tei
+2steic
+st1eid
+3steig
+stei4gr
+2steil
+6steinga
+s4teins
+stein6sp
+s2tel
+2stel.
+s3tele
+s3telf
+st2ell
+stel6l5än
+2steln
+2stels
+2stem
+ste4mar
+ste6ment
+3stemm
+2sten
+s5ten.
+ste4na
+s4t3ends
+st2ens4
+s4tentf
+s4tents
+st1e2po
+2ster
+4s5ter.
+ste2r3a
+s6terben
+3sterbo
+3s4tereo
+st3erfü
+6sterinf
+6sterinh
+4sterm
+3s4ternb
+4ste2s1
+ste3sc
+stes4se
+s4testn
+stes5tr
+2s3tet
+ste4tag
+3s4teti
+3s4tett
+3s2teu
+1steue
+4steuf
+st1eun
+st1ev
+s2tew
+4stex
+s2texa
+2stf
+2stg
+2sth
+st4hen
+s2t3hi
+st3ho
+s2thu
+2stia
+2stib
+1stich
+2stie.
+4stief.
+4stiefl
+s2tieg
+s2tiel
+2stien
+1s2tif
+2stig
+3s4tigm
+2s3tik
+s2t2il
+1s2tim
+4stimma
+2stimp
+st1inb
+s4tinf
+s3tinn
+s2tins
+2s2tint
+2stio
+2stip.
+s4tipe
+4stipp.
+s2ti2r
+st1ira
+st1iri
+4stis
+s4tisl
+st1ita
+2stite
+1stitu
+2stiv
+2stj
+2stk
+4stl
+2stm
+2stn
+s2to
+2sto.
+sto2bl
+4stocht
+2stod
+4stod.
+1stof
+s4toff
+2stok
+4s5tole
+sto3mi
+4ston
+s4to4ne
+4stoo
+2stopo
+4stor.
+s4torb
+2store
+2s4torg
+2stori
+2storp
+2stors
+2stort
+s4tory
+sto3s2t
+1stoß
+4stote
+2stotr
+4stou
+2stow
+2stoz
+1s2tö
+4stöch
+2s3töl
+2stön
+3stör
+2stöt
+2stp
+2stq
+s2tr
+2strac
+4s3trad
+st4rade
+stra4fa
+4s5trag
+3strah
+4strahi
+4strai
+4strak
+2stral
+s5trank
+4strans
+1strap
+1stras
+3straß
+4straum
+4sträc
+4s5träg
+4sträne
+2stre.
+s4trea
+4stref
+4streib
+3st6reif
+2strep
+2stret
+4streuh
+2strib
+strie3s4
+2s4trig
+1s4trik
+2s5tris
+2striu
+s3troc
+s3trog
+3s4troh
+3strom.
+s4trome
+4stropf
+2stros
+st4ross
+1strö
+2ströp
+1stru
+2strua
+2strub
+s4trud
+2strug
+3struk
+2strun
+4strup
+1strü
+4s4t3s2
+sts4t
+2st3t4
+st2u
+1stub
+4stuch
+3s4tud
+2stue
+3stuf
+2stug
+st3uga
+3stuh
+s2t3uk
+2stumo
+2stum2s
+stum4sc
+2stumt
+2stun.
+st3una
+1stund
+2stune
+2stung
+s2t3uni
+4stunn
+2stuns
+2stunt
+2stuö
+stu3ra
+stu5re
+2st3url
+4sturn
+2st3urt
+3s2turz
+2stus
+1s2tut
+1stüc
+4stüch
+3s4tück
+3stüh
+4stür.
+4stüre
+3stürz
+1stüt
+2stütc
+2stv
+2stw
+stwor2
+2sty
+4sty.
+1s2tyl
+4styp
+4stys
+2st3z2
+1su
+su1an
+3su2b3
+su4ba2
+4subi
+su4br
+3su1c
+su2cha
+su2cho
+suchs3p
+3sud
+su2eb
+2s1u2f
+su3fi
+2s1uh
+3sui
+su1is
+su1it.
+su2k
+su3l2i
+sul3t
+3sulta
+su2m1a
+s2ume
+su2mei
+su2mel
+sument4
+su6ments
+2sumf
+s3umfa
+s3umfe
+su2min
+3summ
+sum1o2
+su2mor
+3s2ump
+s3umsa
+2sumse
+s2umsp
+2s3umst
+2s3umwa
+su2n
+3sun.
+2s1una
+sunder4
+sun6d5erh
+sunds4
+su4ne
+4s1unf
+6sungena
+s1ungl
+sung4s
+4s1uni
+2s1unm
+2s1uns
+s4uns.
+s4unst
+2sunt
+2sunw
+s4unwa
+3s2up
+sup3p4
+su2ra
+sure4
+su2rer
+3surf
+2s1urk
+s1url
+su2r1o
+s1urt
+su2s1
+su3s2a
+s3u2t
+su4te
+su3tr
+3suv
+1sü
+2sü4b
+3süc
+sü2d1
+süden4
+3sün
+3s2üs
+3süß
+4s3v2
+svoran4
+2s1w
+4s3we
+swe6gers
+sweh2
+4swie
+4swil
+4swis
+4swit
+1s4y
+2sy2l1
+sym3
+sy2n3
+sy4nä
+3sy4s3
+2s1z2
+4s3za
+4szä
+4s3zei
+4szel
+3s2zena
+3s2ze3n2e
+4s3zent
+4s3zer
+s2zes
+4szet
+4szeu
+3s2zew
+4s3zie
+4s3zo
+4s3zu
+4s3zü
+4s3zw
+2ß3a4
+2ß1ä
+2ß1b4
+2ß1c
+2ß1d2
+1ße
+2ß1e2b
+2ß1ec
+2ß1ef
+2ß1e2g
+2ß1ei
+ße2la
+ße2le
+2ßelek
+2ß1emp
+ße4n3a2
+4ßenerg
+ße2ni
+ße2no
+ßens4t
+2ß1entl
+2ßentz
+2ß1e2p
+ßer3b
+ßer2ei
+ß2ers.
+2ßer4se
+ßer3t
+ß1erw
+2ß1es2s
+2ß1est3r
+2ß1ex
+2ß1f4
+2ß3g2
+ßge2bl
+2ß1h
+1ßi
+ßi2g1a2
+ßig4s
+2ß3i2k
+2ß1il
+2ß1im
+2ß1in
+2ß1j
+2ß3k4
+2ß1l
+ßler3
+2ß1m
+2ß1n2
+2ß3o2
+ßos2
+2ß1ö2
+2ß1p2
+ß1q
+2ß3r2
+ßrö2
+2ß3s4
+ßsau4
+ßsch2
+2ß1t
+ßt1in
+ß3tü
+2ß1um
+ß1unf
+2ßunt
+2ß1ü4
+2ß1v
+2ß1w
+2ß1z2
+1ta
+3ta.
+4taa
+5taan
+4tab.
+ta2b3an
+2t1abb
+2tabd
+3tabel
+2taben
+4tabf
+2tabg
+4tabh
+2t1a2bit
+2tabk
+2tabla
+4tabm
+2t3abn
+2ta4br
+4tabs
+t1abst
+2t3abt
+4tabw
+4tabz
+2t1ac
+4tachs
+3tacu
+t1ada
+2tadd
+ta2der
+tadi3
+t1adm
+ta2dol
+t1a2dr
+ta3d2s
+tad6t3
+ta2er
+3taf.
+3tafe
+4tafet
+4taff
+t1afg
+t1afr
+3tag
+ta2ga
+ta2g1e2i
+tagen1
+t3agent
+4t1agg
+4ta3gl
+4t1a2go
+tag4san
+tags3c
+tag4st
+tah2
+tahls4t
+ta3i2k
+tai2l1
+ta1ins
+tai4r
+ta1ir.
+ta1i2s
+2t1a2ka
+ta3kes
+2t1akk
+ta2kro
+tak4t1o2
+t2aktu
+2takz
+3t2al.
+ta2la
+ta3lag
+tal1an
+ta3lat
+tal3au
+4talb.
+4talbk
+tal3d4
+3tale
+ta4l3end
+tal3eng
+ta4lens
+tal6ents
+ta4lerg
+ta2let
+tal2ga
+tali6ene
+tal4l3ac
+tall3ei
+tal2l1ö2
+tall3s2
+2t1alm.
+3talo
+ta2lop
+ta2l1o2r
+tal2se
+tals3en
+t1alta
+tal3th
+talt4r
+ta2lu
+2tam
+3tam.
+3tame
+5t2amen
+t1a2mer
+tamm1a
+tam4m3er
+t1ampl
+3tams
+t1amt
+2t1a2na
+tan3ab
+4tanal
+ta4nat
+2t1a4nä
+2tanb
+3tanc
+tan3da
+tand4ar
+tan2dr
+tand4st
+ta4nerf
+4tanf
+4tangeb
+tan4gra
+2tanh
+t2anho
+t4ani
+3tanj
+tan2kl
+4t3anl
+t1anm
+4t1anna
+3t2anne
+t1ano
+2tanp
+t1ans
+t2ans.
+4tansi
+tan4tan
+t4ante.
+4tantei
+2tantr
+2tanwa
+2tanwä
+t2anz.
+t1anza
+4tanzei
+2t1anzu
+4tanzü
+tan2z1w
+tao2
+ta3or
+t4ape
+ta2pes
+2tapf
+ta2pl
+ta4poka
+3tapol
+t2appe
+ta2ra
+2tarab
+3tarabb
+ta3rak
+2taram
+tar3ap
+t2arau
+2tarb
+3tarba
+3tarbek
+3tarber
+3tarbi
+3tar3bl
+2tarc
+3tarchr
+t2ard
+t2arei
+ta2rel
+ta2r1er
+tar3g
+ta1r2h
+3tari
+tark4l
+t2arko
+4tarkt
+t2arl
+2t1arm
+t2armä
+ta2rom
+2tart
+t2ar2ta
+tar6ter6e
+3t2arth
+t1arti
+3t4artis
+tar4to
+tar2tr
+ta2ru
+2t1arz
+3tarzu
+3t2as.
+ta3sa
+3tasc
+ta5se
+4t1asp
+2t3assi
+3tast
+tas4tem
+tas4to
+t4at.
+ta2ta2b
+ta2tan
+3tatb
+t4ate
+tat1ei
+t5a2tel
+ta2tem
+3taten
+ta2t1er
+t3atl
+ta2tom
+ta2tr
+3tatsa
+2tatt
+tau2b1a
+3taubh
+tau2bl
+tau2br
+tauchs4
+tauch5sp
+4taud
+2t1auf
+3taufe.
+4taufg
+4taufl
+tau3f4li
+t3aufo
+taufs4
+3taug
+4t3auge
+t1auk
+3taum
+2t1ausb
+3tausc
+tau6scha
+tau6schm
+tau6schr
+tau6schw
+2tausd
+t2ause
+4tausf
+4t3ausg
+t1ausk
+4tausl
+2tausr
+4t3auss
+2t5ausw
+4tausz
+4tauu
+3tav
+4tava
+ta2van
+3tax
+4t1axt
+3taz
+1tä
+2tää
+4täb
+tä1c
+4täd
+t2äf
+3täg
+4tägä
+4tägy
+2täh
+4täll
+2t1ält
+4tä2m
+t1ämt
+t1ängs
+3tänz
+4t1äp
+2täq
+tä4reng
+tä2ru
+2tärz
+tä2s
+t2ät
+3tätigk
+4tätt
+2täug
+2täuß
+2täx
+1tà
+4t3b4
+tbauer4
+tbe3r2e
+tblock5e
+tblocken8
+tby4t
+4t1c
+t3cha
+t3che
+tch2i
+tch3l
+t3chr
+t2ch1u
+tch1w
+t4ck
+t3cl
+tcor2
+t3cr
+4t5d4
+tdar2m1
+tdun2
+1te
+3te.
+te2a2
+tea3c
+te3ad
+te3ag
+2teak
+te3al
+3team
+te3an
+te3ar
+tea4s
+3teba
+t4ebb
+2t1e2ben
+t2ech
+2teche
+3techn
+te2chu
+2teck
+te2cki
+tecks4
+2t1ecu
+te2dit
+te1em
+teen1
+te2er.
+te1erw
+tee3t
+3tefa
+2teff
+2t1egg
+2teh
+3teha
+te2hac
+3tehä
+3tehi
+te2him
+3tehö
+t1ehr
+3tei.
+3teic
+tei1fl
+teik2
+3t2eil
+tei2la
+tei6lent
+teim2
+2tein
+t2ein.
+t2eine
+teinen4
+tei6nens
+tein6hab
+t3einkü
+te2is
+t1eis.
+t1eisb
+te5isch.
+t1eiw
+tei3z
+te2kel
+tekt4
+3tel.
+3te2la
+tel3ab
+tel1ac
+te3lan
+te4lant
+tel1au
+te2lä
+3telb4
+3teld4
+tel1ec
+tel3ehr
+2telem
+tel3eng
+te2ler
+tele3s
+te2leu
+4t3elf.
+3telg
+tel1in
+te2lit
+3telk
+tel6lant
+tel3le
+tel6lein
+tel3li
+4tellu
+3teln
+te2lob
+te4lost
+te2l1ö
+3telp
+3tels
+tel3s2k
+3telt4
+tel3ta
+3tem.
+3tema
+te2map
+te2mau
+t2emb
+te2m1ei
+te2m1er
+te2mi
+tem3i2m
+tem3ing
+2temm
+te2m1o2r
+3temper
+2tempf
+4tempfi
+tem3s
+te2mu
+te4mun
+3ten
+t6en.
+ten1a2
+te4nad
+te4n3an
+te4nas
+te4nat
+ten3au
+ten3ä
+ten3da
+4t3endal
+tend4an
+4tendap
+4t5endf
+4t1endl
+t6endo
+4t5endp
+ten3d4r
+te2n1e2b
+te2nef
+te2neh
+ten3ei
+te3n4ei.
+tene4m
+tenen1
+te4n3end
+te4nene
+te4neng
+te4nens
+4t3energ
+te4n3ern
+te4ness
+tenf4
+4t1eng.
+teng2a
+ten4gag
+4t3engla
+te2ni
+te4nil
+ten1im
+te4n3in
+tenk4
+ten3n2
+te2nol
+te3nö
+ten3se
+4t3ensem
+ten6serg
+tens2p
+tens3th
+t1entb
+4tentd
+ten3te
+4t3entl
+4t3entn
+ten6tric
+4t3en4tro
+2t1ents
+4t5entw
+4tentz
+te2ny
+teo2f
+2tep.
+2t1e2pi
+2teppu
+tept2
+3t4er.
+t4era
+tera2b
+ter3a2c
+te2rad
+te1ral
+tera2m
+ter4ane
+te2r3ap
+ter3a2s
+4terbos
+2t1erbs
+2t1erbt
+3terc
+ter3d
+4t3erde.
+terd2s
+3tere.
+te2re2b
+te2rec
+t3ereig
+3tere2m
+te4r3emi
+3teren
+te4r3end
+te4rene
+te4reng
+te4r3ent
+3terer
+terer3k
+terer3l
+te4r3erp
+te4rers
+te4rerw
+3teres
+te2ret
+t4erfr
+terg2
+ter3ga
+6tergebn
+t6ergem
+t6erges
+t6ergew
+ter3gl
+6tergrei
+t4ergru
+t6erhall
+t4erhan
+t4erhau
+t4erhäu
+t4erhei
+7t2erhi
+t2erho
+6terhöhu
+t2erhu
+te3ria
+ter3iko
+2teril
+terin5d
+3terinf
+3terinh
+ter3k
+4terklä
+t4erlä
+t4erli
+3term
+t2ern.
+ter4nar
+2t6ernc
+ter4obe
+2teros
+t1e2r1ö
+t4erp
+t4erra
+ter4re.
+t4erro
+t4ers.
+t2erse
+terst4
+t4erst.
+t6erstad
+ter6stat
+t4erstä
+t4ersti
+t4erstr
+t4erstu
+t4erstü
+tert4
+ter3ta
+t4eru2
+te4r1uf
+t4erv
+4t3erwäh
+4tery
+ter3z2a
+2t1erzb
+t4erzei
+4terzeu
+ter5zo
+ter3zw
+3tes
+tes3a2c
+tesa2k
+tes2c
+tes4pen
+te2spr
+2t1essa
+tes3si
+tes3tan
+tes4tel
+tes6terg
+tes6terh
+tes6terk
+t3est3ri
+te2su
+tet2
+3t2et.
+te4tabl
+2te2tap
+te2tat
+4tetl
+3teuf
+3teum
+3te1u2n
+4teunu
+2t1eup
+3teur.
+te2va
+te2vi
+tewa2s
+3tewo
+t1e1xa
+2t1e2xe
+te3xel
+2t1e2xi
+4texp
+tex4ta
+2t1exz
+6t3f6
+4t1g2
+tga4s3er
+t3ge
+tgenen3
+tger2a
+tger2i
+tg4r
+t1h
+4th.
+2th2a
+3t4ha.
+3t2hag
+4thak
+3thal.
+t2hali
+3thalp
+t2han.
+t3hand
+t3hap
+4t3hau
+2thä
+4thäl
+2thb
+t2h2e
+1the.
+3thea
+2t3heb
+2t3hef
+2t3hei
+t4he1in
+t4hek
+3t4hema
+2themd
+t4heme
+2themm
+1then
+t4hene
+t4heni
+3theo
+t3herd
+t4herm
+thero3
+t3herr
+2t3herz
+4t3hess
+2thf
+1t2hi
+3thi.
+thic3k4
+t3hiel
+thi3er.
+2t3hil
+2t3him
+t3hin
+thi3nu
+2t3hir
+2thk
+2th3l
+4th3m2
+thmu2
+2th3n
+1t2ho
+2t3hob
+t3hoc
+tho3chr
+t3hof
+2t3hoh
+t4hol.
+t4holo
+2tholz
+tho1s
+2t3hot
+3thotr
+2thou4
+t3hov
+4t3hö
+2thp
+1th2r2
+2ths
+2tht2
+2thub
+2thuh
+4t5hun
+2thut
+2thü
+2thv
+t2hy
+1ti
+ti2ad
+ti3ag
+tial2l
+ti3a2m
+ti2are
+3tib
+2tic
+3ticc
+ti1ce
+t1id
+t2id.
+4tidee
+ti4d3en4d
+tie3br
+3tief.
+4tiefel
+3tiefl
+tie2fr
+tieg4
+2tieh
+ti2e1i
+ti1el
+ti2el.
+tiel3a
+ti3e4n1
+tien3s
+3tiera
+tie4rei
+tie4reu
+ti2ern
+tie3s2t
+4tieß
+ti1eu
+3tif.
+ti3fe
+ti1f4r
+3tig
+ti2gan
+4t3i2gel
+ti4gerz
+ti2git
+tih2
+ti2kam
+ti2kar
+ti4kau
+ti3k2en
+tik4ere
+ti2kin
+ti4klu
+ti2kn
+tik1r
+ti2kra
+ti2krä
+ti4k3rei
+ti4lant
+ti2lar
+ti2lei
+ti2lel
+3tilg
+2tillu
+ti3lo
+ti2lö
+tilt4
+ti2lu
+ti2ma2g
+4timm
+timm1a
+tim4man
+t3immat
+timmer4
+tim6merg
+3timo
+2timp
+tim2s
+3tin.
+ti3naf
+ti3nak
+ti2nam
+ti2n3an
+4t3ind
+ti5n2e
+tine1i
+2t1inf
+tin2g1a
+tin4g3l
+ting3s
+t1inh
+3tinis
+t1in1it
+4tinj
+2t1inka
+tin2k1l
+tin2kn
+tin2kr
+2t1inku
+t2inn
+ti2nor
+t1ins
+3t2ins.
+t3insa
+t2insä
+4t3inse
+tin4spa
+tin4sum
+t1int
+ti3nu
+tin2um
+4t1inv
+3tio
+ti2osk
+tioxi3
+3tip
+ti3p4l
+ti4que.
+3tirad
+ti1rh
+ti4ron
+3tis
+ti6schei
+tisch3l
+tisch3w
+ti2sei
+tis2el
+ti3sk
+2t1isl
+ti2sp
+2t1isr
+tiss4
+ti3s2th
+tis3ti
+ti1s4tr
+ti2su
+tit2a
+ti2tal
+3ti3te
+ti1th
+ti3ti
+2ti3tu
+tium4s
+3tiv
+ti2van
+ti2vel
+ti4vene
+tiver2
+ti4verh
+ti4verk
+ti4verl
+ti2v1o
+ti4v3r
+ti2za
+ti2zir
+2t1j
+4t3k4
+4t3l2
+6tla
+tlan2g
+tl4e
+t2lef
+tlei6der
+tle2ra
+6tli
+tlings5
+tlit1
+t5lö
+tlung4
+4t3m4
+tma2st
+tmen8schl
+tmen6t5
+tmo4des
+4t3n4
+t5na
+tnes2
+tnes4s
+1to
+3to.
+to4as
+to5at
+t2oba
+to3be
+2tobj
+tob2l
+t1obs
+3tobt
+to1c
+t3ochs
+3tocht
+to6ck5ent
+3t4od
+tod1er2
+to4d1un
+tof4fa
+tof6f5ent
+tof4f3er
+2toffi
+toff3s
+3tog
+2t3ohr
+3toi
+toi4r
+4toiz
+3toj
+3tok4
+3tol
+to3le
+4tolp
+4tolz
+tomar4b
+2tomg
+to2min
+2tomk
+3tomo
+to2m1u
+to4mun
+3ton
+to2nan
+tond2
+to2n2eh
+toner6ke
+to4n3ig
+to3ny
+3too
+3top.
+to2pak
+to2pan
+to2pat
+to4pfe
+top1hi
+3topo
+2to4pt
+3tor
+t4or.
+to4rän
+4torc
+t1ord
+t2ordi
+4t3ordn
+t4ore
+to4rein
+to2rel
+to2rem
+to3ren
+tor4fan
+t1or3g
+4torga
+t5orient
+tor3int
+5tork
+to2rop
+to2rö
+t4ors
+4t1ort.
+tor3ta
+t1orth
+4tortn
+4tort2s
+to4ru
+t2orw
+tos2e
+to3s2h
+tos2p
+4toss
+3tost
+4toß
+to1ßu
+to2tä
+3tote
+to2tho
+3totr
+tots2
+5t2ou
+touil2
+to3un
+3tow
+3toz
+1tö
+3töch
+4töck
+2t1ö2d
+2tö2f
+4t1ök
+2töl.
+3tön
+t1öst
+3töt
+2t3p4
+tpf4
+tpi2n
+2t1q
+1t2r4
+2tr.
+5tra.
+3trac
+tra3cha
+tra3chl
+2t3rad.
+5trade
+tra4dem
+t3radie
+2tradp
+tra4fah
+tra4far
+3t4rag
+3trahi
+6trahl
+2trahm
+5t4rai
+3trak
+4t3rake
+5t4rakt
+5tral
+tra4leb
+tral3l
+3t4ran.
+4trand
+4trang
+t3rann
+5t4rans
+tra2st
+6traß
+4traub.
+4trauc
+t4raue
+t4rauf
+2traup
+5träc
+2träd
+3träg
+5träne
+4träng
+4träs
+4träß
+t1räts
+2träuc
+4träus
+4träuß
+4t5re.
+2trea
+t3reak
+4treb
+tre2br
+4trec
+t3rech
+t4reck
+5treck.
+tre5cke
+2t3red
+3tref
+4trefe
+5treff
+4trefl
+4trefo
+4treg
+2t3reh
+t4rei.
+3t4reib
+4treic
+4treif
+2t3reig
+2t3reih
+t4reik
+4t3rein
+2t3reis
+tre7isch.
+4treit
+t3reiz
+4t3rel
+t4rem
+t4ren.
+5trend
+6trendi
+5trennu
+t3rent
+2trepe
+2t3repo
+3trepp
+t3repr
+t4rer
+t4res.
+tre2ta
+t4rete
+tret3r
+tre4tri
+2t3rett
+3treuh
+4t3rev
+2t3rez
+5t4ré
+2t3rh
+3tri
+t4rib
+t4rick
+t4rid2
+5trieb
+trie3fr
+tri4ena
+tri2er
+tri4ers
+4trig.
+2trige
+5t4rigg
+tri3gl
+t4rik
+tri4ke.
+tri4kes
+5triko
+t3rind
+4tring
+tri3ni
+4t3rinn
+t4rip
+4tript
+4t5riv
+tri2x
+trizi1
+3tro.
+tro3b4
+4trock.
+3troe
+t4roi
+tro4kes
+trol4la
+6trom.
+tro6mans
+4tromb
+tro4men
+tro2mi
+4tromk
+4troml
+4troms
+4tromt
+3tron
+tro3na
+t4rop
+3tropf
+tro3sm
+3trost
+2trout
+5troy
+4t3röc
+2tröh
+6tröm
+3tröp
+3trös
+4t3röss
+3tröt
+3trua
+3trub
+2t3ruc
+4truf
+4truk
+trum2
+t3rumä
+trums1
+t3rund
+5trunk
+5t4rup
+t3russ
+2t3rut
+tru2th
+4truw
+trü1be
+trü1bu
+2t3rüc
+trücker6
+t4rüg
+3trümm
+try1
+2ts
+4ts.
+ts3ab
+t3sac
+t4sachs
+t2s1a2d
+ts1ahn
+ts5alben
+t2sall
+ts2ame
+t4samp
+t4s1amt
+t2san
+ts3ane
+ts3a2r
+t2s1a2s3
+t2sau
+ts2av
+t2säh
+ts1än
+ts1äus
+t4sch3am
+t6schart
+t3sche
+t4schef
+t3schl
+tsch4li
+t4schro
+t3schü
+ts2cor
+t2s1e2b
+tse2e
+t2sef
+ts1eh
+tse4he.
+t3seil
+t3seme
+ts1eng
+ts2ens
+t2s1ent
+t2s1ep
+t2s1er
+t6s5essen
+tse2t
+ts1eta
+t2seth
+t2s1eti
+t2s1e2v
+t2sex
+t3sexi
+t2s1i2d
+t2si2k
+ts3iko
+tsing4
+t2sini
+ts1ir
+4tsk
+t3skala
+ts4kele
+t4s3ko
+ts1off
+t3sol
+t3som
+t2s1op
+tso2r
+t2s1ori
+ts3ort.
+t3s2ouv
+t2sö
+t2spac
+t2spal
+ts1par
+ts4pare
+ts1pas
+t2spat
+ts3pate
+t2spä
+t3sped
+t3spei
+t3s2pek
+t2sph
+t3s2pi
+t4s3pic
+t4spins
+t2spo
+t3s2pon
+t3s2por
+t2spro
+ts2pul
+ts4put
+ts5s4
+t1st4
+t4stabe
+t2staf
+t4stag
+ts3tak
+t4stale
+t4s3tanz
+t4stas
+t4stat.
+t4s3täti
+t2stea
+t3stein
+ts4terb
+t3s4tern
+t3s4tero
+t4s5th
+t3stif
+t3stim
+t4stit
+t4stoch
+t4stoi
+ts4tol
+t4stren
+ts4tric
+t4strie
+ts2tu
+t5stub
+ts4tüm
+t4sty
+t2s1u
+5tsubi
+ts3un
+t4sw
+tswa2s
+t3sy
+4t1t
+tt1ab
+tt2ac
+tt3achs
+tt1ad
+tt2ag
+tta6g5ess
+t4t1ah
+tta2ke
+tt2al
+tta4n
+t4tana
+t2tanm
+tt2ant
+t4t1ap
+tt1art
+tt1äh
+tt1ebe
+tt1eif
+tt1ein
+t2t1eis
+t3tel
+tte4la
+tte4l3e4b
+tte4len
+tte4lin
+ttel1o
+t2temu
+tte4na
+t4tentb
+t4tentf
+t4tents
+t2teo
+tt4ere
+tte4rik
+tte2ro
+tt2erö
+tt2es1
+tte4sa
+tte4s3ä2
+tte2so
+tt2häu
+tt3hi
+t2t3ho
+t3ti
+t4tid
+t4t3igi
+t4tinf
+t4tins
+tt2int
+tt4lef
+t4torg
+tto1s
+t2trou
+tt3rü
+tt2sal
+tt2sen
+tts1p
+tt2spe
+tt2spr
+tt4s3tät
+tt3s2z
+tt1u2f
+t3tü
+tt3z2
+1tu
+3tua
+tu4ale
+tu1alm
+tu1alv
+tu3an
+2tub2
+tuba3b
+3tuc
+tu2chi
+tu1cho
+2tud
+tudie4n3
+3tue
+tu2ere
+2tuf
+tuf2e
+tu3fen
+t3u2fer
+3tuff
+tu2gan
+4tuh
+tuh4ler
+tu1ist
+tu2kr
+tul2i
+3tum.
+tum2b5l
+3tume
+4t3umf
+2t3umg
+2t1umh
+2t3umk
+2tuml
+3t2umo
+2t3umr
+4t3umsat
+2t1umsc
+tum2si
+tum2so
+tum4s5tr
+2t3umt
+2t1umw
+2t3umz
+3tun.
+2t1una
+2t1und
+tund2e
+3tune
+tun2en
+2t3unf
+3tung.
+t3unga
+3tunge
+tung4s
+2tunif
+2tu2nio
+2tuniv
+2t1unm
+3tunn
+t1u2no
+t3uns
+3tuns.
+4t3unt
+2t1unv
+2t1up.
+tu2r1ag
+tu2ran
+turan4l
+tu2ras
+tu2rä
+tur1c
+tu2r1e2b
+tu2rei
+tur3eis
+tu4rene
+tu2r1er
+tu4res
+tu2re4t
+tu2r3e2v
+tur3f4
+turg2
+tu2rid
+turin1
+tur4mun
+3turn
+tu2r3o
+turo2p
+tu4ru
+3tus
+tu2sa
+tu4schl
+tu2se
+tu2so
+tu3ta
+2tü
+4tüb
+tü3ber.
+3tüch
+tück2s
+3tüf
+4tüh
+3tüm
+3tür.
+tür1c
+3türe
+3türg
+3tür3s
+3türw
+4türz
+3tütc
+3tüte
+4tütz
+4t1v2
+t3vo
+tvoran4
+4t3w
+t5wa2
+twi4e
+t4wist
+1ty1
+2t1y2a
+3typ
+ty2pa
+tys2
+2t1z
+t2za2
+tz1ag
+tz3ar
+tz1au
+t2z1ä
+t3zäh
+tz1ec
+t2z1e2d
+tz1ehr
+t2z1eie
+t4z1eis
+tze4n1
+tz2ene
+tzen5s4t
+t4z3entg
+t4zentl
+t4z3ents
+tz2ere
+tzer6gre
+tz1erw
+t3zer3z
+t3ze2s3
+tze2t
+tz1eti
+t2z1i2d
+tzig4s
+tz1int
+t2z3om
+tz2th
+tz2tin
+tzu2gu
+t2zuni
+tzwan4d3
+tz1wä
+tz1wi
+t3zwie
+tz1wu
+2ua
+u3a2b
+u1a2c
+uad4r
+ua2g
+u1al.
+u1a2l1a
+u1a2l1ä
+u1alb
+u1ald
+uale2
+u3a2leb
+u3a4lent
+u3aler2
+ua4lerg
+ual3erk
+u3a2let
+u1alf
+u1alg
+u1alh
+u3a2lid
+u1aln
+ua2lo
+u1alp
+u1alr
+u1als
+u1al5t4
+ua2lu
+u1alw
+u1alz
+u1am
+uan2a
+u1ans
+uant2
+uan3ta
+u3ar.
+uara2b
+u1ars
+uar4t3an
+ua3sa
+uasi1
+ua2th
+uat2i
+uat2o
+u3au
+u1ay
+u1äm
+uä2s
+u1äu
+2u1b
+ubb2l
+ube2be
+u8be8cken.
+ube2e
+u2b1ehe
+u4b3eins
+ube4n1a
+uben3o
+ub2er
+u4b3erde
+ubert4
+ub4es
+ub1eul
+u3bit
+ub2l
+ub3läu
+ub3lic
+ub3lu
+ub4lut
+u2bob
+u2bop
+u2b3oz
+ub3ric
+u2b3rit
+ub4rü
+ub2san
+ubsau2
+ub4sche
+ub2s1o
+ub2sp
+ubst2
+ub3t4h
+4uc
+uc1c
+uch1a
+u1cha.
+uch1ä
+u1che
+uch1ec
+u2ched
+uch1ei
+ucherin8t
+u3ches
+u1chi
+uch3im
+uch1in
+uch3l
+uch3m
+uch3n
+uch1op
+u2ch3r
+uch4sel
+uch2so
+uch2sp
+uchst2
+uch6t5erf
+uch6t5ert
+ucht3re
+u1chu
+uch3ü
+uch1w
+u1ci
+uck3elf
+u2ckem
+u4ckent
+uck2er
+ucker8geb
+u2ck3i
+uck4sti
+u1cl
+2u1d
+u3d2a
+ud2e
+ude3i4
+udein7
+udel3se
+ude2n1
+uden3e
+uden3s2
+udert4
+udes2
+udi3en
+uditi4
+ud2ob
+u2don
+ud3ra
+u3dru
+2u1e
+ue2ck
+u2ed
+ue2en4
+u2eg
+u2eh
+ue2k
+u4ela
+ue2le
+ueli4
+uel4lau
+ue2mi
+uen1
+u3en.
+ue4n3a2
+u3end
+uene2
+ue2ner
+uen4gag
+uenge2
+uen2gl
+u3e2ni
+uenk4
+ue2no
+uen6zene
+uen2zu
+uen2zw
+u2ep
+ue2r3a2
+uera4t
+ue2r1ä
+uerb2
+uer6baut
+uer3d2
+uere2
+ue2rec
+uer4ei.
+ue4rein
+ue4r3emi
+u3eremp
+u3e4r3ent
+ue3r4erb
+u3ererf
+ue4rer4g
+uerer4h
+uerer4l
+uerer4m
+ue6rersc
+uerer6sp
+ue6rerst
+uer3esk
+ue2ret
+u3erex
+uer3g2
+u3erin4t
+u3erl.
+u3ern
+uer4nan
+uer4ne
+uern3s4t
+ue2r3o4
+uer2ö
+u3errü
+uer3sc
+uerst6
+uer3t4
+u3eruh
+u3erum
+u3erunf
+u3erunt
+u3erwi
+uer3z2
+ue2ta
+ue4tek
+ue2ti
+u2ev
+ue2x1
+uf1ab
+u3fac
+ufa2ck
+u3fah
+uf1ak
+u3fal
+ufall4
+u3fam
+ufa2n
+uf3ane
+u2f3a2r
+u3fas
+uf1aß
+ufa2t
+uf1au
+u2f1än
+u2f1äs
+u2f1ä2ß
+u2f1ei
+ufel4s3a
+u2f1em
+u3fen.
+u2fent
+u2ferf
+u2f1erh
+u4ferla
+u4ferle
+u4ferne
+u2f1et
+2uff
+uf3fe
+uff4l
+uf2fro
+u2f1id
+u2fim
+u2f1ins
+uf3l
+u2fob
+ufo2r
+uf1ori
+uf3r
+uf5sä
+uf2spo
+uf4stab
+uf4s3tic
+2uft
+ufta2b
+uft1eb
+uft3erd
+uft3er4g
+ufter4l
+uf4tin
+uft3s2
+u2fum
+2u1g
+ug2abe
+u4gabte
+u2g1a2d
+u2g1ak
+u2gani
+u2g1ans
+u2ganz
+u2g1ap
+ug1ar
+ug1au
+ug3d4
+u3ge.
+ug1ei
+u2geig
+u2gein
+uge4lob
+ugen3s2
+u2g1erf
+u2g1erl
+u2gerr
+u2gerv
+u2g1esk
+ug2et
+ugg2
+ugge4st
+ug2gl
+ug3g4t
+ug3hu
+u2g1i2d
+u2gim
+ug1in
+u2gl
+u4g1lä
+u6gleitb
+u6gleitu
+u4glic
+u4glis
+ug3liz
+u4g3lo
+u4glu
+u4g3n
+ugo3
+ugo4b
+ug3oc
+ug3om
+u3gon
+ugo4p
+ug1or
+u3gos
+u2gö
+u2g3rä
+u2greg
+u4g3reis
+u2gres
+ug3rie
+ug3ro
+u2grou
+ug3rüs
+ug3sei
+ug3span
+ugs4por
+ug4spr
+ug4spu
+ugs4tan
+ug3stä
+ugs4to
+ug3s4tr
+ug3stu
+ug4stur
+ug3s4tü
+u2gum
+ug4unge
+ug2uns
+ugu3te
+u2gü
+u1h
+uh2a
+2u5he
+uhe3a2
+uhe1s
+2uhi
+2uhl
+uh1la
+uh2lar
+uh1lä
+uh4l3ent
+uhl3erb
+uh2li
+2uhm
+uhr1a
+uhrei4s
+uh2r3er3
+2uh3ri
+uh4rin
+uh2r3o
+uh2ru
+uh4rü
+uhs4
+u2hu
+2uhü
+uh1w
+2ui
+ui1ch
+ui2che
+ui4cker
+u1ie
+ui1em
+u3ig
+u4ige
+uil4les
+u1im
+u3in.
+u3isch.
+u3ischs
+uis2e
+uisi4n
+ui4s5t
+uit3s
+u1j
+uk2a
+ukä2
+uk1äh
+u3käu
+u1k2e
+uke2n1
+u1ki
+2u1k2l
+ukle1i
+uk4n
+uko2m1
+uk2ö
+u1kr
+uk2ta
+uk2t1el
+uk4tent
+uk2t1er
+uk2tin
+uk4t3o4ri
+uk4t3r
+ukts2
+uk2tum
+u1ku
+uku2s
+uk2ü
+u1l
+ul1am
+ulan2e
+ul2ar
+ula2s
+ul1äm
+ulb4l
+ul4dan
+ul2dei
+ul2dr
+uld2se
+2ule
+u2l1el
+ul1emb
+ule4n
+ul1er2h
+ule2t
+ul1eta
+2ul3f4
+ul1id
+uli2k
+ul1ins
+ul3ka
+ul2kn
+ull1au
+ul3le
+ul4lerk
+ul3l2i
+ul2lo
+ull3s2
+ulm2e
+ulni2
+ulo2i
+u2lop
+u2l1or
+ulp1h
+ul2pha
+ul2sa
+ul4sam
+ul2s1ec
+ul2sei
+ul2ser
+uls2th
+ul2sum
+4ult2a
+ult3ar
+ul4tri
+ult3s
+u2lü
+ul2vr
+ulz2w
+u2mab
+u2m1ad
+u2m1a2k
+um1all
+um1ang
+um1anz
+u2m1ap
+um1a2r
+u2marc
+u2marm
+u2mart
+u3mat
+u4matl
+u4matm
+u2m1aus
+u2maut
+u2m1äh
+1umd2
+u3me.
+u2m1ef
+u2m1ein
+umen1e
+um5engel
+umer2a
+u2m1erf
+um1erg
+u3merk
+u2m1erl
+um1erw
+umes2t
+1umf
+1umg
+um1ide
+um1ind
+um1inh
+um1ir
+1umk
+1uml
+2umm
+um2mei
+u2m3ot
+ump2fa
+ump4fin
+umpf4li
+um2pho
+1umr
+um4sam
+um4s3an
+1umsat
+um4s1er
+um2sim
+um2s1pe
+um2sum
+um3t4
+u2m3um
+u2m1u2r
+1umz
+un1
+4un.
+2una.
+1unab
+un2a3br
+un2ag
+un2al
+u3n2am
+u2n3an
+u2nap
+u2narb
+2un2a1s4
+un3at
+un2är
+2und.
+un2da
+unda2b
+und3ak
+un4dap
+1undd
+2unde
+un3de.
+underer6
+und3erf
+und3erö
+underten8
+under8tend
+und3erz
+un2dex
+1undf
+2undg
+un2dim
+1undn
+undo2b
+un2dop
+un2dor
+4un2d3r
+4unds.
+2undsc
+und3sp
+und3st
+un2d1um
+undü4
+1undv
+1undz
+u3ne
+une2b
+une2d
+un3eid
+un3ein
+un3eis
+un2emi
+une4n1
+unen2t
+u4nerk
+u4n3erz.
+un2es4
+unf2
+un3fa
+unft4s
+un2gam
+un2gat
+3ungena
+unge3r4e
+1unget
+1ungew
+ung5h
+un2glu
+1unglü
+un2go
+un2gr
+ung3ri
+ungs3
+ung4sa
+ungs5tr
+u3nic
+3u2nif
+uni3k4
+un2im
+1unio
+un2ir
+un3iro
+un3isl
+u3n2it
+1u2niv
+2unk
+un2k1a2
+un3ker
+un2k1es
+un2ket
+un2kne
+unko2p
+un2kro
+unk3s2
+unk4tit
+unk2tr
+unk4tri
+unlö2
+unna2
+un2n1ad
+unn2e2
+unne4n
+u2nob
+uno4r
+un2os
+1unr
+uns2
+2uns.
+unsch5el
+un3se
+1un3si
+un3sk
+un3sp
+unsta4g
+unste4c
+uns4t1r
+4unsy
+4unsz
+1unt
+un3ta
+un3te
+unte4ri
+4unti
+un3tr
+unt3s
+2untu
+3unty
+2u2nu
+u3nuc
+unvol2
+unvoll3
+1unw
+4unwä
+3unwe
+u2ny
+2unz
+un3z2a
+unz2e
+2uo
+u1o2b
+u3of
+u3or.
+u1or3c
+uore4
+u3o2ret
+u3ors
+u1ort
+u1orw
+uos2
+u1os.
+uote2
+u1o2x
+uö2d
+u1ök
+u1pa
+3upd
+u1pe2
+uper1
+upe4re
+uperer4
+up2fa
+u2pfe
+u2pf1i
+up2fu
+3upg
+u3p4i
+up4lu
+up2pl
+u1pr
+upra3
+u2p3ras
+up4t3a2
+upten1
+up4tene
+upt3erf
+upt3erg
+upt3erk
+upt3ers
+up4tid
+up4tim
+up4t1o
+up4tr
+u1q
+4ur.
+u1ra
+u2rab
+u3raba
+ura2be
+u2r1akt
+u2ral4t
+u2r1a2m
+ura4na
+uran3a4t
+u3rand
+ur1ang
+uran4ge
+ur2anh
+uran5s
+ur1anz
+ur3ap
+u2r3ar
+ura4ri
+u3rasc
+ur3asp
+ura4str
+ur4ate
+ura3to
+u2r3att
+u2r1au
+2u1rä
+ur1äl
+ur1ä2m
+ur1än
+ur3b2a
+2urc
+urch1
+urcht3e
+urd2
+ur3da
+ur3di
+ur1eff
+ur1eig
+u2rele
+ure2n
+ure4na
+uren6gag
+u4rense
+u4rentn
+u2r1ep
+ur1er3h
+urer3k
+ur2ert
+u2rerw
+ur1eta
+ur2eth
+ure3u
+2urf
+ur2f3l
+ur2fro
+urf4spr
+urf3t
+ur6gense
+urg3inn
+urg1l
+ur2gla
+ur2gri
+urgros4
+urg3s4
+uri2c
+ur1ide
+uri3en
+u2rind
+urin8stin
+ur3ku
+ur3l
+ur4mant
+ur4matt
+ur2mau
+urm2ei
+ur4mern
+urmet1
+ur2mum
+ur2mun
+ur3n2e
+4u1ro
+ur1off
+uro1s4
+urost2
+2u1rö
+ur3p4
+2urr
+ur3re
+3ur3sac
+ur2san
+ursau4
+ur2s1er
+ur4s1of
+ur2spa
+urst4r
+ur3sze
+urt2
+2urta
+ur2tai
+urt3ein
+ur3ti
+ur2tro
+urt3sc
+u3ru
+uruf4
+urü2
+ur2z1a2
+ur2zä
+ur2z1ec
+ur2zep
+ur2zi
+ur2z1op
+urzt4
+ur2z1w
+2us
+us3a2b
+u4s3af
+usa2gi
+u4s1amb
+u4samt
+u2sang
+us2ann
+us3ark
+u2s1a2s3
+u2säh
+u4schab
+u4schak
+u3sche.
+u4schef
+usch5eic
+u4sch3eu
+u3schi
+usch3mü
+u3schu
+usch5wer
+u3se.
+u3s2e3b
+u2s1ec
+u2s1ei
+u3seid
+u4sense
+u4sentl
+u3sep
+use3ran
+use4rec
+u2s1erl
+u2serp
+us1erw
+u2s1ese
+u2sex
+u3si.
+u2sid
+usi3er.
+usi5ers.
+us1inn
+us1is.
+us3kl
+us3oc
+us1oh
+u3sol
+u2sop
+us1ou
+u2spac
+us3part
+u2s1pas
+us1pe
+u3s2pec
+u3s2pek
+u2sph
+us1pic
+u3spit
+u3s4piz
+u2spo
+us2por
+u2spu
+usrich7
+us2s1eb
+usse4g
+uss2el
+usse4n
+us2sep
+us5ser.
+uss3erf
+usser4z
+us4sesp
+us2sez
+us2sof
+us2sum
+u1stal
+us3tau
+us4tein
+u1stel
+ust3erl
+us2th
+us3ther
+us3t2in
+us3tr
+u3s4tras
+us6tris
+u1stu
+u2stun
+u2stur
+u2sumd
+u2sumg
+u2sumz
+3usus
+u2sü
+2u1ß
+u2ß1u
+2u1t
+u3taf
+u2t1alt
+u4t1a2m
+ut2ans
+u2t1ap
+u2t1ar
+uta2s
+u2taut
+ut1äh
+u2tär
+ut3c
+ut1e2d
+u3teh
+ut1ei.
+ut1eie
+ut1ein
+u3tek
+ut1ela
+u3tem
+ute2n1
+uten2a
+u2tent
+u4tentf
+uter3a
+ute4ral
+ute5r4er
+ute6ring
+ute4ros
+ut2es
+u3t2et
+u2t2ev
+u2t1ex
+utfi2
+ut3hel
+u2t3hi
+u2t3ho
+u2thu
+u2thy
+u2tid
+uti2vi
+utli4n
+uto3
+uto4ber
+u3tom
+u2tops
+utor2a
+u4tord
+utos4
+u2töl
+4utr
+ut3rea
+u2trou
+ut3rü
+4uts
+ut3sau2
+ut2säu
+ut4schl
+ut4schm
+ut4scho
+ut4schö
+ut3ser
+ut3s2k
+ut3te
+ut5t2l
+utt4le
+utts2
+utu2b
+u2tum
+utu4n
+u4t1une
+utu4re
+utu3ro
+utu5ru
+u3tü
+u4tz
+ut2zeh
+utz3eng
+utz2er
+ut2zet
+ut2z1in
+ut2z1w
+2u3u4
+uufe2
+uum1
+uuma4
+u1ü2
+2u1v4
+u2ve.
+uve3rä
+u1w
+2u1x
+ux2e
+ux2o
+ux3t2
+u1ya
+2u1z
+u2z1ec
+uz2er
+uzo2f
+uz3ot
+uz1we
+uz3z2
+1üb
+üb1ä
+2übc
+2übd
+üb4e2
+übe3c
+übe3le
+übe4na
+übe3ne
+über3
+ü4bet
+üb3l
+üb3r
+üb2s3t
+2üc
+ü1che
+üch3l
+üch2s1c
+ücht4e
+ü3cke4n
+ück1er
+ück3eri
+ücker6ke
+ü4ckers
+ü2ckin
+ü4d3a4
+üde2c
+üde2l
+ü3den.
+üden2g
+ü3d2ens
+üd3o4
+üd3r
+üd3s2
+üd3t4
+üdu2
+üe2
+üeb3
+ü1ei
+ü2f1a
+ü2f1ä
+ü2f1ei
+ü2fent
+üfer2
+ü2f1erg
+üf2fl
+ü2f3i
+üf3l
+ü2fo
+üf3ter
+ü2fum
+ü1g
+üg2e
+üge2l1a2
+üge2lä
+üge4lec
+üge6lei6s
+üge2lo
+ügen3s
+ü2g3l
+ü2gn
+üg3s2
+üg4s3t
+üh3a2
+ü1he
+ü2h1ei
+ü2h1eng
+ü2h1ent
+üh1er
+ü2herf
+ü2her2k
+ü2her2z
+ü2hex
+üh1i4
+ühla2
+üh1lä
+ühl2er
+ühl4sta
+ühl4sti
+üh3mo
+üh3ne
+ühn2s
+üh1o2
+üh3r2e
+ühr3ei.
+ühre2n1
+ühren3s4
+üh1ro
+ühr3ta
+üh1s
+ühs2p
+üh3t2
+üht4r
+ü1hu
+üh1w
+ü1k2
+ül1a
+ül2c
+ü3l2e
+ü4l3ef
+üle2ra
+ül2l1a2
+ül2l1ei
+üll2er
+ül2lid
+ül2lo
+ül2lö
+ülls2
+ü2lö
+ü1lu
+ü2ma
+ü2ment
+üme2ra
+ü2m1id
+ü2m1in
+ü2m1u
+2ün
+ü4n3a2
+ün2da
+ün2dr
+ünd3s
+ü2n1erd
+ünf1
+ünf3li
+ün2g3l
+ün2s
+ün3sc
+ün3se
+ün3sp
+ünster3
+ün3str
+ün2za
+ünzu2
+ün2zun
+ün2zw
+ü1pe
+üpf3l
+ü1pi
+üp2pl
+ür1a
+ü2r1ei
+ü2r1e2l
+ür2fl
+ür2fr
+ür4g3en4g
+ürge4ra
+ürk2e
+ü1r2o3
+ürom2
+üror2
+ürr2
+ür2s
+ür3sc
+ür3se
+ür3si
+ür3sp
+ürte2l3
+ürt4h
+ürz2a
+ür2z1in
+ür2zö
+ür2z1w
+üs2a
+ü2schl
+üs2e
+üse1e2
+üse3l2
+üse4n
+üse1r4
+üse1s
+üse3t
+üs2s3a
+üs2s1c
+üss2e
+üs4s1o
+üs2st
+üst3a2
+üste2n
+2ü1ß
+2üt
+ü2t1al
+üte3m
+üte4n
+üten3s
+ütent4
+üten3z2
+üte2ra
+üte2r1e
+üterich6
+üter3n
+ü2t3h
+ü2t3r
+üt2s1
+ütte4n
+üt2tr
+üt3z2e
+üt2zw
+ü1v
+ü1z
+3va.
+2v1ab
+vab4r
+va1c
+va1f4
+vag2a
+va2la
+2valu
+2vanb
+2vang
+2varb
+v1arm
+va1s2
+2v1ass
+v4at
+va2t1a2
+va2tei
+va4t3eng
+va4tess
+va2t3h
+va4tid
+vatik2
+va4tim
+va4t1in
+vati8ons.
+va4tord
+va4t3r
+vat3s4
+va2t1u
+2v1au
+2v1b
+2v1c
+2v1d2
+1ve2
+ve3an
+ve3ar
+veau1s
+ve3b4
+ve3d
+ve3fa
+ve3g
+ve3h2
+2veig
+v2eil
+2vein
+veit2
+veits3
+ve3la
+2velan
+ve4l1au
+v1ele
+ve3lei
+ve3li
+ve3lo
+ve3ma
+ve3me
+2vemu
+ve3nal
+ve4nas
+ven2c
+ve3ne
+ve3ni
+ve4nin
+ve3nö
+ven6t3ag
+ve3of
+ver1
+ver3a
+ve3rad
+2veral
+ve3rand
+ver4ane
+vera4s
+ver6bart
+ver3b2l
+ver3d2
+vere2
+ve4rek
+verf4
+ver3fa
+ver3g4
+ve3ri
+ve4rin
+ver3k
+vern2
+ver4sep
+vert4
+ver5te
+ver3u4
+ves1
+ve3sa
+2ve3s2c
+2ve3s2e
+ves3ti
+ve3t
+vete1
+vete3r
+2veü
+ve3v
+ve3w
+ve3x
+2v1f4
+2v1g
+2v1h
+vi2ad
+vi3ar
+vi4a3t
+vi2ä
+vi2c
+vi3de
+vid3s2t
+vie2h1a
+vi2el
+viela2
+viele2
+vi2er
+vie4rec
+vie2w1
+vig2
+2vii
+v2il
+vi2l1a
+vi2lä
+vi4l1e2h
+vi2lei
+vi4lers
+vi2l3in
+2v1i2m
+vima2
+vi4na
+2v1in3d
+ving5
+2v1int
+vi3sa
+vise4
+vi3s2i
+vi3s2o
+vi2sp
+vis2u
+viv2
+vi3z
+vize1
+2v1k
+2v1l2
+v3le3
+v2lie
+2v1m
+vm2e
+2v1n2
+1vo
+2v1ob
+vo2be
+vob4l
+vo3ga
+voge2l1
+vo2gu
+vol2a
+vol2l1a
+vollen6
+vol6lend
+vol6lert
+vol2li
+2v1op
+vo2r1
+vor3a
+voran8schl
+vore2
+vor3g
+vo3ri
+vo4rie
+vo5rig
+vorm2
+vormen4
+vor3o
+vort4
+vot2a
+voy1
+vö2c
+2v1p
+vr2
+v1ra
+v2ree
+3v2ri
+v1ro
+2vs
+vs2c
+vs2e
+vs2p
+v1sta
+v1steu
+v3s2z
+2v1t
+vue3
+vu2enu
+vu2et
+2vumf
+2vumg
+2vumk
+2v1ü
+2v1v
+2v1w
+2v1z
+w2a
+1waa
+wab2bl
+wa3che
+wach8stub
+wach4t4r
+1wack
+waffe2
+waffel3
+1wag
+wa5ge
+3wage4n
+wa2g3n
+wa3go
+1wah
+wahl5ent
+wah4ler
+wah2l1i
+1wal
+wala3c
+wa2lar
+2walb
+wal2d3a
+wal4din
+wa2les
+wa3li
+wal2m1
+wals2
+wal2t1a
+wal6tere
+wal6terl
+wal4to
+wal4tur
+3walz
+wa3na
+wan2d1a2
+wandels6
+wan2dr
+w3anf
+2wang
+wan3g2e
+wang4s
+1wann
+wan6z5en6d
+wan4zer
+wa2p
+1war2e
+ware1i
+wa3ren
+1warn
+wart4e
+war2th
+1was
+wa3sa
+was2c
+wa4scha
+wa3sche
+wa4sch3l
+wa4schw
+wa3sh
+was3s
+wass4e2
+wa3su
+w2ä
+1wäh
+1wäl
+2wäng
+1wäs
+wäs2c
+wäss4e
+2w3äu
+2w1b2
+wbu2
+2w1c
+2w1d
+we2a
+we2b1a
+webe1i
+we2b3l
+we2bo
+we2b3r
+webs2c
+we3cke.
+we5cken.
+we3ckes
+we2e2
+weed3
+we2fl
+1weg
+we2g1a
+we4g1ei
+weg5ersc
+we4g3l
+we4gn
+we2g1o2
+we2g3r
+weg3s
+wegs2a
+wegs4t
+1weh
+weh4r3er
+wei2bl
+weib4r
+wei3dr
+2weie
+weifel6d
+wei2gr
+weigs4
+wei3k4
+3weil
+wei3nel
+weins3a
+weinsau6
+wei3sc
+weis6sel
+weis6spi
+wei2t3r
+wei5ze
+wel5le4
+wel6schl
+wel6schr
+wel2t1
+wel4t3a2
+welte2
+wel6t5en6d
+wel4th
+welt3i
+wel4to
+wel4t3r
+wen3a2
+wendes4
+wen2gl
+we3n2i
+wen2ka
+wen4kla
+wen4k3ri
+we2r3a2
+wer5be
+werbe3i
+wer2bl
+werb2s
+1werbu
+werd2
+werde3i
+5werdens
+1werdu
+werer2
+wer2fl
+2werg
+wer6gels
+wer2g3o
+wer2gr
+werin2
+we4r3io
+1werk.
+wer2k1a
+1werke
+wer2ki
+wer2k3l
+wer2kn
+wer2ko
+wer4kre
+wer2ku
+we2rö
+wer2s
+wer2t1a
+wer2tä
+wer3t3ei
+wer6teig
+werter6k
+wer6t5erm
+wer2th
+wer4t1o2
+wer4tre
+wer4t3ri
+wer4tum
+1wes2e
+we2s1p
+we4st
+wes4t1a
+weste2
+west3ei
+wes6ten6d
+wes4tex
+wes4ti
+wes4t1o4
+west3r
+wes2tu
+1wet
+2wets
+wett3s
+2w3ey
+2w1g
+whi4
+w3ho
+w2i
+wicht4s
+wi1cka
+1wid
+wi2e
+2wieb
+1wied
+wie3l
+wie3n2e
+1wild
+wim2ma
+wim4m3u
+win2a
+win4d3e4c
+win4dei
+win6d5erz
+1win2d5r
+2wing
+win2g3r
+win2kl
+win8n7er8sc
+win2no
+win3s
+wint2
+1wi4r
+wire3
+wisch3l
+wi5s2e
+wi2sp
+1wiss
+wiss4z
+wi3th
+1witz.
+1witzl
+wiz2
+2w1k
+2w1l
+2w1m
+2wn
+wns2a
+wn3sh
+1wo1c
+wo2cha
+woch2e4
+1woh
+woh4lei
+1wolf
+wolf2s3
+wol2la
+wol4ler
+wor3a
+wor3d
+wo2r3i
+worn2
+wort1a
+wor4tel
+wor6terh
+wor4t3r
+wort3s2
+wo4r3u
+wor3ü
+wot2
+1wöc
+wöl2fo
+wört4h
+2w1p
+w2r
+w3ro
+4w1s
+ws2e
+w3s2h
+w3s2k
+ws2t
+2w1t
+wti2
+1wuc
+wuch4sc
+wuch4st
+w1u2f
+wul2
+wul3se
+wund4e
+wung3r
+wungs4
+wun2s
+wunsch5l
+4wur.
+wur2fa
+wur2f1o
+wur2fr
+wur2s
+1wurst
+wus2
+wus3te
+1wu4t1
+1wüh
+wül2
+wün3
+1würf
+1würst
+2w1w
+2w1z
+x1a
+1xa.
+2xa2b
+1x2ad
+1xae
+xa1fl
+1x2a3g2
+2xal
+xal2l
+xa2m
+xand4
+x2an3t2
+x2anz
+1x2as
+2x1b4
+2xc
+x1ce
+x1ch
+x1cl
+4x1d
+xda4
+1xe
+2x1e4g
+2xek
+xe2l
+x1ele
+x1em
+3x2em.
+x2ems
+x2en
+xen3s2
+x2er.
+x2ere
+2xerl
+xers2
+2x1eu
+2x1ex
+4x1f
+2x1g
+2x1h
+xi1c
+xich2
+2xid
+xi2dan
+xide2
+xi2dei
+xi2d1em
+x1i2do
+xi4ds
+3x2ie
+xie3l
+xi3g
+xi2ler
+xi2lo
+xi2l1u
+xim2
+xin3s2
+x2is1
+xi2sa
+xis2c
+xi2se
+xi2so2
+xi2sp
+xis3s2
+xis3t
+xis4tä
+xi2su
+x1i4tu
+xive4
+2x1j
+2x1k2
+xkal2
+4x2l2
+x3lä
+x3le
+2x1m
+2x1n
+2xod
+2x3oe4
+x1or
+2x1ö2
+4x1p
+xpor6ter
+xpor4t3r
+x1q
+2x1r
+4x3s2
+4x1t
+xt1a
+x3tan
+xt2ant
+x3tas
+x2t1ä
+x3tät
+xtblo4
+x2t1e2d
+xt1ein
+x2t1el
+x4tent
+x2t1er2f
+x2t1ev
+xtfi2
+x2t3h
+x2tid
+xti2la
+x2til2l
+xt1o2
+x4tor
+xtra3b4
+x2t3ran
+x2trau
+xt3rec
+xt3s2
+x2t1um
+x2t1un
+1xu
+xu1a
+2x1u2n
+xu2s3
+xuss4
+2xv
+2x1w
+2xy
+3xy.
+3xys
+2x1z
+2yab
+1ya2c
+y2ach
+y2ag
+ya1h
+y1al.
+y1a2m
+y2ana
+yan2g
+y1ank
+y2a3ra
+ya2s3
+yat2
+ya3z
+y1ät
+y1b
+y1c
+y2chi
+y3chis
+ych3n
+y1d4
+y3dr
+ydri4
+ydrid1
+y1e
+y2ec
+ye2d
+y2ef
+y2el
+yen4n
+y2ere
+yer2n1
+y2es
+yes2p
+y3est
+ye2th
+y1f2
+y1g
+ygi2
+ygie5
+yg2l
+y1h
+yhr2
+y3i4
+y1j
+y1k2
+yke3n
+yk4l
+yk3s2
+y1l
+yl1a2c
+y2l1a2m
+yla2n
+yl3ane
+y3lant
+yl4ante
+yl4anti
+y4lantr
+y3lat
+ylau2
+yl3c
+yle2
+y2le.
+yl1em
+y2l1es
+y2l1et
+yli4n
+yloi4
+yloid1
+yloni1
+yl1ora
+yl3s2
+ym4a
+ym4e
+ymp4
+ym2pha
+ympi1
+yn2eu
+yn3k2
+y2n1o
+yno4d
+yno4t
+yob2
+yoga3
+yom4
+yon2a
+yon4i
+y1ont
+y1o1s2
+y2ost
+y1ou
+2y1p
+ypa2
+yp1ab3
+yp1an
+yp2e2
+y2pf
+y2p1i2d
+y2p1in
+y2p3l
+ypo3
+y4p3s
+yp3t
+ypu2
+y2p1um
+y1q
+y1r
+yra3k
+y3r2e
+y3ri
+yri2a
+yri1e
+yri3en
+y3ro
+yros3t
+yrr2
+ys2an
+ys2c
+ys2e1
+ysein2
+y3s2h
+y4s3l
+ysme3
+ys4po
+ys1pr
+yst2e
+yst4h
+ys2the
+ys3to
+ys3tr
+ys4tra
+y4stro
+y3s2ty
+ysu2
+y2s1ur
+y3s2z
+y1t2
+y2te.
+y2tes
+yt4h
+ythe1
+y3to1
+ytos2
+y4t3r
+yt3t
+y1u2r
+y1v
+y1w
+y1y
+y1z2
+yze3r2
+2z1a2b
+zab3l
+za1c
+2z1a2d
+2z1af
+za3gr
+3z2ah
+zah3le
+zah4ner4
+2z3ak
+4zakk
+2z1al
+3zali
+2z1a2m
+z1a2n
+z2an.
+4za4na
+2zanb
+za3ne
+2zanf
+2zangs
+3z2ank
+zan2ka
+2zanr
+zans4
+zanti1
+za4pf
+z1aq
+z1ar
+3zar.
+2zarb
+2zarm
+3z2aro
+zar2tr
+2z1as
+za2sc
+zast4
+z3at
+zat2e
+za2to
+3zaub
+z1au2f
+2z3aug
+3zaun
+z3aur
+2z1aut
+zä2
+2z1äc
+z2äh
+zä3hi
+2z1äm
+z1än
+z1äp
+z1är
+2z1äus
+2zäuß
+4z3b4
+zbe3r2e
+zbü1b
+zbübe3
+2z3c
+2z3d2
+zdan2
+zdä1
+zdi1st
+3ze.
+2z1e2ben
+ze1c
+2z1e2cho
+ze1e2
+zeeu3
+2z1eff
+z1e2ga
+zehe4
+zehen1
+zeh2l
+ze3ho
+z2ei1f4
+zeil2
+zei3la
+zeile4
+2z1ein
+ze3in.
+z2e1ind
+zei4ne
+z2eino
+ze3inse
+ze2i1s4
+zei3sk
+zeist4
+3zeit
+zei2t1a
+zei4t3er
+zei4to
+zei2tr
+zei4t3ri
+ze2l1a
+zela2d
+ze2l1ä
+zel3d
+2ze2lek
+2zelem
+ze2len
+ze2l1er
+ze2l1in
+2z1e2lit
+zel3la
+zel4l3ac
+zel6lein
+zel6ler6t
+zell3s2
+zelm4
+ze2l1o
+zels2
+zel3sa
+zel3sz
+zelu2
+zembe2
+2z1emp
+5zen.
+ze4n1ac
+ze4nas
+zen3au
+ze3n2em
+zenen1
+4zenge.
+z4engl
+2zengp
+zen3n
+ze2n3o
+ze4not
+4zensem
+zens2p
+zen4tha
+z2entn
+zent3s
+2zentw
+2zentz
+zen4z3er
+zen2zw
+zeo4r
+3z2er.
+ze2rad
+ze1ral
+ze2re2b
+z2erfe
+2z1ergä
+4z3ergeb
+z4erges
+z4ergl
+zer4gon
+2z1ergu
+z2erhe
+2z3erhö
+zerin6te
+z2erko
+3zerl.
+zer4lau
+zer4le.
+4zerleb
+zer4len
+2zerlö
+3z2ern
+zer4nan
+zer4n3e4b
+zer4nei
+2z1erö
+zer2öf
+2z1erq
+4z3erreg
+zers2
+z2ers.
+2z1er4sa
+zerta2
+zer4t3ag
+zert4an
+zer6teng
+zer6tere
+zer6terl
+zer4tin
+zer4to
+6z5ertrag
+zer6trau
+z1erwe
+2z1erz
+zer2ze
+4z3erzi
+ze2sä
+ze3sch
+zes1e
+ze2sp
+ze4spo
+ze4spr
+zes2sa
+zes4seb
+zes4sei
+zessen4
+zes6s5end
+zes6sent
+zes4ser4
+zes2sp
+zes2st
+ze1sta
+ze3stau
+zes5tr
+zes6tra
+2zeta
+2z1e2th
+ze2tr
+2zetts
+zeu2g3r
+2z1eul
+ze1ur
+2z1e2x1
+4z3f4
+zfeue2
+2z3g4
+zger2a
+zger4s3
+2z1h2
+z2hen
+zhir3
+zi3ar
+zich2o
+zi2dei
+zie4ler
+zie2l1i
+zien3s
+zi1erh
+zi1es
+zi3ess
+z2il
+zil2e
+zill2
+2zimp
+zim4t3
+2z1ind
+zin2e
+zin3ei
+2z1inf
+z1inh
+zi4n3in
+zin1it
+2z1inj
+zin2na
+zin4o
+zin2sa
+zin4ser
+4zinsuf
+2zint
+2z1inv
+zi2o3
+zirk2
+zirk6s
+2z1i2so
+zisse4
+zi3s2z
+zi2tan
+zite4
+zi1th
+zithe2
+zi4t1o4
+ziv2
+2z1j
+4z1k4
+2z1l2
+zlei3ti
+zle1s
+z3ly
+2z1m2
+zme2e
+2z3n2
+z3oas
+2z1ob
+z1of
+zo2gl
+zog4s3
+2z1oh
+zol2la
+zoller4
+zol6lert
+zon3s4
+zon4t3er
+zo2o
+2zope
+2z1o2r
+zo3re
+3z2orn
+zor4ne
+2z1osz
+2z1ou
+2zö2f
+2z1ök
+z1öl
+3z2öll
+2zöls
+2zön
+4z3p4
+2z1q
+4z3r2
+4z1s4
+z3sa
+zsau2
+z3sh
+z3sk
+zspor2
+z3sz
+2z1t
+zta2n
+zt3ane
+z2t1au
+z4tehe
+ztein1
+zt3eins
+zt2el
+z4t1ent
+z4t1erz
+zte3str
+zt3he
+z3t4hem
+z3t4her
+zt3hi
+zt3ho
+z3thr
+z3thy
+z3tic
+zt3rec
+zt3s2
+z3tü
+zu1
+zu3a
+zub4
+3zuc
+zuch2e
+zud4
+zudi4
+zu2el
+zu3e2r1
+zu3f4
+zu2gar
+zu4gent
+zu3g1l
+zu4gla
+zu4glö
+zu2go
+zug1un
+2z1uhr
+zu3hu
+zui2
+zu3k
+zul2
+2z1um.
+zum2a
+2z1umb
+zumen2
+2zumf
+2zumg
+zum2i
+2zuml
+2zumr
+2z1ums
+zum2u
+2zunab
+zun2e
+2z1unem
+zunf4
+zung4
+4zunget
+2z1ungl
+z1uni
+2zu2nio
+2zuniv
+2zunr
+2z1uns
+2zunt
+zuo2
+zup2fi
+zu3pl
+zu3r4a
+2z1urk
+2z1url
+2z1urn
+2z1urs
+2z1urt
+zu3s4
+zusch4
+zu3t2
+zut4r
+zut4u
+zut3z
+zuz2
+2zü4b
+3züc
+zür1c
+2z1v
+zw2
+z1wac
+2zwag
+2zwah
+2zwal
+2zwap
+z1war
+2zwa2s
+2zwäs
+2z1wed
+2zweg
+2zweh
+z2weig
+2zweil
+zweiter6
+2z1wel
+2z1wen
+2z1wer
+2z1wes
+z2wic
+zwi4e
+3zwing
+2zwirt
+z2wisc
+2zwiss
+z2wit
+2z1wo
+z1wör
+z1wur
+2z1wü
+zy1an.
+zy2le
+4z1z
+z3z2a
+zza3b4
+z4z3al
+zz4at
+z2z1id
+zzin1
+zz1ini
+zzi1s4
+zz2ö
+zzug4s
+}
+
+\endinput
+
+% Local Variables:
+% mode: tex
+% coding: latin-1
+% fill-column: 72
+% End:
+% vim: set filetype=tex textwidth=72:
diff --git a/tmac/hyphen.det b/tmac/hyphen.det
new file mode 100644
index 0000000..65a5ca8
--- /dev/null
+++ b/tmac/hyphen.det
@@ -0,0 +1,23515 @@
+% This is the groff hyphenation pattern file 'hyphen.det' for German
+% with hyphenation rules for the traditional orthography.
+%
+% It is based on the file 'dehypht-x-2017-03-31.pat' taken from the
+% 'dehyph-exptl-0.41' package, converted to latin-1 encoding.
+%
+% Below is the original copyright message.
+%
+% -------------------------------------------------------------------------
+%
+% TeX-Trennmuster für die traditionelle deutsche Rechtschreibung
+%
+% Copyright (c) 2013-2017
+% Stephan Hennig, Werner Lemberg, Guenter Milde, Sander van Geloven,
+% Georg Pfeiffer, Gisbert W. Selke, Tobias Wendorf
+%
+% Licensed under the MIT license. Full license text available from
+%
+% http://opensource.org/licenses/mit-license.php
+%
+%
+% The word list is available from
+%
+% http://repo.or.cz/w/wortliste.git?a=commit;h=5fd786fcb1ed48448e058672f1f58d185653d8c6
+%
+% The used patgen parameters are
+%
+% 1 1 | 2 5 | 1 1 1
+% 2 2 | 2 5 | 1 2 1
+% 3 3 | 2 6 | 1 1 1
+% 4 4 | 2 6 | 1 4 1
+% 5 5 | 2 7 | 1 1 1
+% 6 6 | 2 7 | 1 6 1
+% 7 7 | 2 13 | 1 4 1
+% 8 8 | 2 13 | 1 8 1
+
+\patterns{%
+.ab1a
+.ab3l
+.abo2
+.ab3ol
+.ab1or
+.ab3s2
+.ab3u
+.ade3n
+.ae3
+.aft2
+.ag2a
+.ag4r
+.ag2u
+.ai2s
+.akt2a
+.al2e
+.al3k
+.al3lei
+.al5len
+.al3se
+.al4tei
+.alter6s5
+.alt1s
+.al2tu
+.ampe4
+.amt2s
+.ana1c
+.an3d2
+.anden6k
+.and4ri
+.an1er
+.ang2
+.an3gli
+.ang4s2
+.angst3
+.ani2s
+.an3k4
+.an3na
+.an3s2
+.an4si.
+.an3z2
+.aos4
+.ap5p6le.
+.aps2
+.ari1e
+.ar3k2a
+.ar4m3ac
+.ar4mun
+.ar2sc
+.ar4tan
+.ar4t3ei
+.arter4
+.ar6t5erh
+.ar2tr
+.arz2
+.as6sest
+.as2t
+.ata1
+.ate2
+.at4h
+.au3d
+.aue2
+.au4f3
+.aufs2
+.au2s1
+.au6stes
+.auß2
+.ax2
+.äm3
+.är6schl
+.ät2h
+.ät2s
+.äu3
+.bahn3
+.bah6ner
+.baus4
+.be3erb
+.bel2a
+.be3r4a
+.be3r2e
+.ber4g3a
+.ber6g5e6b
+.ber4g3r
+.ber4tr
+.bi4os
+.bi2t
+.bit1a
+.boge2
+.bo4s3k
+.bu4ser
+.bus3se
+.bu7s8ser.
+.bussy8stem.
+.ch4
+.char8mes
+.chi3er
+.dab4
+.da2r1
+.dar3in
+.darm1
+.da4te.
+.da4tes
+.de2al
+.de1i
+.dein2
+.de3lo
+.de8ments
+.den4ka
+.den4kl
+.den4ko
+.de1o2
+.de3r4en
+.derma3
+.dermas6
+.de3sk
+.di3el
+.di4en2
+.dien8sta
+.dienst7a8d
+.do3b
+.do2mo
+.do1pe
+.dor2f1
+.dy2s3
+.ebe2r1
+.edu3s
+.eg2o
+.eh2e
+.ehe1i
+.ei3e2
+.ei3f2e
+.ei3k
+.einbus6
+.ein3d
+.eine2
+.ei4neb
+.ein6erl
+.eise4
+.ei2sp
+.eis3s2
+.ei4s1t
+.ei2tr
+.eke2
+.ek3li
+.el2bi
+.el2bl
+.el4fei
+.el2fl
+.el2i
+.em3m2
+.en1
+.en4da
+.en4d3er4
+.en2d3r
+.en4dü
+.en2gl
+.enn2
+.ent3
+.en2ta
+.en4tei
+.en4tio
+.en2t1r
+.ents2
+.epi1
+.ep3p
+.er4bei
+.er8brecht
+.er2bu
+.er4dan
+.er4dei
+.erden6k
+.er4dep
+.er4d3er
+.er1e
+.ere3c
+.erf4
+.er1i
+.ers2
+.er8stein
+.erster6
+.er8sterb
+.er8stritt.
+.er8stritten.
+.ert2
+.er4z3el
+.er4zen4
+.ese3le
+.es3p
+.es2st
+.es2t
+.est6e
+.est3r
+.et2s
+.eu1
+.eu3g4
+.eu3r4
+.eu3t
+.eve4r
+.ext4
+.fe3la
+.fer4no
+.fe4sta
+.fid2
+.fi4le.
+.fi4len
+.fi2s
+.flö8s7se.
+.flö8s7sen.
+.flö8s7ses
+.flug1
+.fs4
+.fu2sc
+.ga2me
+.gangs4
+.ga4s3e
+.ga6sten
+.ga2t
+.gd2
+.gebe4a
+.geb2l
+.gel4b3r
+.gel2d1
+.ge3lu
+.ge5nar
+.ge3n4e
+.ge3n2o
+.gente4
+.ge3r4a
+.ge3r2e
+.ge3ro
+.ge3s2
+.get4
+.ge3u
+.glan2
+.gla4s3t
+.gol6der
+.grif8fes
+.gus2
+.haft3s
+.hal5le
+.hal2s
+.halt4e
+.hau4sa
+.hau2t1
+.he2
+.he4bei
+.he3fe
+.he3le
+.her3an
+.he3rat
+.her6b5ra
+.he3rer
+.he3ri
+.he6r5inn
+.hin3u
+.hof1e
+.ho4fen
+.ho4met
+.höch2
+.ia2
+.il3
+.im2a
+.ima4ge
+.im5m2
+.in1
+.ind4
+.in3gl
+.ink2
+.in3n2e
+.in3sk
+.inu1
+.ioni1
+.ire3
+.is2a
+.it2h
+.iv2
+.ivo3
+.joni1
+.jor3
+.ka2b5l
+.ka2i
+.ka3le
+.ka3ta
+.ka4t3io
+.ken6num
+.ker3s
+.ki4e
+.klang3
+.ko3b
+.kopf1
+.kor4da
+.kraf2
+.ks4
+.kus2
+.la3be
+.la3ho
+.lase2
+.le4ar
+.le4gas
+.le3n2i
+.len3z
+.lich8t7er8s
+.li2f
+.li3po
+.li4ve.
+.lo4g3in
+.lo2sc
+.los3s2
+.lo3ver
+.lö4ss
+.lus2
+.luster6
+.lu4str
+.lut4h
+.ma3d
+.mal4e
+.mas8sen.
+.ma4str
+.mat4c
+.matu3
+.md2
+.me3l2a
+.me3ne
+.me3no
+.men8schl
+.men8schw
+.ment4
+.mes4sp
+.mi2f
+.mik4
+.mil2z
+.mi2t1
+.mm2
+.na3no
+.na3t
+.nat2h
+.näs5c
+.nebe4n
+.ner2f
+.ne1ro
+.nich2
+.nicht5e
+.ni2e
+.ni3k4l
+.nob4
+.no2c
+.no2s
+.no4th
+.nul2
+.nus4
+.oa5s
+.ob1a
+.obe2
+.ober5ei
+.of2e
+.ohr5s
+.oper4
+.or2a
+.ord4e
+.ort2
+.ort4h
+.orts3e
+.os3s
+.os5t6alg
+.oste2
+.ost3el
+.ost5end
+.osten8de
+.oste6re
+.ost3r
+.ot1
+.ozo4
+.öl3l
+.pab4
+.pa2r1e
+.par3t4h
+.pe2c
+.pe3la
+.pe3le
+.pe4ste
+.pf4
+.ph4
+.poka2
+.po6stei
+.po4str
+.ps2
+.rabe4
+.ra3ch4e
+.ra3me
+.ra4sp
+.ra4s3s
+.rau2m
+.rau8schl
+.re3ale
+.rebs2
+.re3cha
+.re5insz
+.reis6e5i
+.reli1
+.res2t
+.re4stu
+.ri4as
+.richt6e
+.ro4a
+.ro3be
+.ro2ha
+.ro3m4a
+.ro2tr
+.ro3tu
+.rö2sc
+.rö4ss
+.rös3se
+.ruf3s
+.ruh2r1
+.runder6
+.ru5s6ses
+.rü1b
+.rücker6
+.rü4ss
+.sa3br
+.sali1
+.sami1
+.sas2
+.sa3sse
+.sau1c
+.sau5er.
+.sä5s4
+.sch4
+.schaf8t7end
+.scheiner8
+.scho7s8se.
+.scho7s8ses.
+.se2ei
+.se2ha
+.sein2
+.sen4f
+.sen3s
+.se3re
+.se1ro
+.se2t1
+.sha2
+.si3gn
+.si2te
+.ski1e
+.sour2
+.spani7er.
+.spä5s4
+.spiege8lei
+.st4
+.ste2i
+.steiner8k
+.sto4re
+.stras4
+.sucher6
+.tage4s
+.tan4k3a
+.tan4k3l
+.ta3ra
+.tar3t
+.ta2t3h
+.ta2to
+.ta2t1u
+.te2e
+.te2f
+.tehe3
+.teiler8s
+.tei8l7ersc
+.te3l
+.te3no
+.ten3s
+.te1ra
+.te6stei
+.te6stel
+.tester8g
+.tester8h
+.th4
+.ti2e
+.ti2me
+.ti4mes
+.ti2s
+.ti8sch7end
+.tite4
+.tode2
+.to4der
+.to2n
+.to4nat
+.to3nes
+.to4nin
+.to4pl
+.to2pr
+.to2w
+.tras3
+.tra4ss
+.tri3e4s
+.trockenmas8
+.ts4
+.tsa3
+.tse3
+.tu3ra
+.tu3ri
+.turm1
+.tur4ma
+.ub2
+.ufe2
+.ufer1
+.ul2b3
+.um3
+.ume2
+.umo2
+.ums2
+.un3a2
+.un3d
+.une4
+.un3g
+.uni2t
+.ur3a2d
+.ural4
+.uran6fa
+.ur1c
+.ur1e
+.ur4inf
+.ur3o4m
+.ur1o2p
+.ur3s2
+.ut2a
+.ut3r
+.übe4
+.ve5n2e
+.vol2
+.vo4r
+.wah4l
+.wa2s
+.weg5s
+.wei4ta
+.welter8e
+.welter8kl
+.wer6ker
+.wer4kr
+.wer4tr
+.wetterer8s
+.wi4e
+.wor2
+.wort5en6
+.wur2f1
+.xe3
+.ya4l
+.zahn3
+.zeit3s
+.zel4la4
+.zelle4
+.zel6lei
+.zel4li
+.zeug4i
+.zi2e
+.zie4l3u
+.zin4ka
+.zin4s3c
+.zin4st
+.zol2
+.zuch2
+.zucht3
+.zug3l
+.zu4gra
+.zu2pf
+.zweigen8
+.zwei8g7end
+a1ab
+aa2be
+aa1c
+a1a2ce
+aa2gr
+a1akt
+a1a2n
+a2ans
+a1aq
+2a2ar
+aa2r3a
+aar3b
+aar3d
+aa3rea
+aa2rei
+aarf4
+aar3g2
+aar3k4
+aar3t4
+1aas
+aas1t
+aa2th
+aa2t3r
+aat4s1
+2a3au
+a1ä
+a1b
+2aba
+ab1alt
+ab2am
+ab2ant
+ab1au
+ab2aut
+ab1ä
+ab2är
+ab2äu
+2abbat
+2abbin
+1abd
+4a3be.
+4a3bec
+abe1e
+ab1eic
+abe3i4d
+ab1eil
+ab1ein
+4ab2el
+abe2la
+abela4d
+abe2le
+abe4l3in
+1abent
+2aber
+a2berd
+a3beri
+ab1er2k
+ab1er2r
+ab1er2z
+4abes
+abe2s1e
+ab3esse
+abes2t
+ab1eß
+2ab2et
+2abew
+1abf
+1abg
+3abga
+1abh
+2abi
+4abil
+ab1ins
+ab1ir
+3ab1it
+1abk
+ab1l
+1a2bla
+a4blag
+a3blat
+a4blau
+1a2blä
+ab4le.
+3ab3lei
+2ablet
+ab3li
+a2blin
+ab4lit
+2ablo
+1a2blö
+2ablu
+abma3s
+1abn
+2a3bo
+3a4bo.
+ab2of
+3a4bon
+4abot
+2abö
+ab3r
+a4brä
+a2bre
+2abro
+ab4ros
+2abrö
+1absc
+1ab3s2p
+abs2t2
+1abtei
+3abtr
+2abu
+a2bum
+ab1ur
+2abü
+1abw
+2aby
+3abz
+2a3ca
+ac1c
+a1cem
+a1cen
+a1cet
+ach1a
+a1chal
+a3chari
+ach3as
+ach3au
+2achb
+a1che
+a2ch1e2c
+ach1ei
+ach4ei.
+a2chep
+a4cherf
+ach5erfa
+a4ch3erh
+a4ch3erl
+a4cherö
+a4ch3erw
+2achf
+2a1chi
+a2chim
+ach3l
+2ach3m
+ach3n
+a1cho
+a3cho.
+ach1ob
+a2cho2r
+ach3ö
+2ach3r
+2achsc
+achs4el
+ach3s4i
+ach3skr
+achs4or
+ach3su
+a4cht
+ach4tak
+ach8tersp
+ach6t5erw
+ach4tin
+ach2t1o
+ach8traum
+ach8träume.
+ach8träumen.
+ach6trit
+ach4tum
+a1chu
+ach1u2f
+ach3ü
+2achv
+4ach1w
+a2chy
+2a1ci
+4ack.
+ackmu4
+ackmus3
+ack2sp
+acksta4
+2a1cl
+a3co
+acon4n
+2acu
+a1ç
+a1d
+2ad.
+2ada.
+4adab
+a2dac
+a2dad
+ad2ag
+adai4
+ad1ama
+a2d1an
+3adap
+4a3d2a2r3
+2adat
+a2d1au
+a3dau.
+1a2dä
+ad1c
+1add
+2ade.
+ade2al
+a3dec
+a3dee
+adefi4
+2adeg
+4aden
+a3dena
+ade1ra
+4ades2
+ade3sp
+ades4s
+2adf
+4adh
+4adi
+adi3en
+adi3er.
+adie4sc
+3adj
+2adli
+4admu
+ad2ob
+1a2dop
+2adp
+2adq
+2ad3rec
+ad3rei
+ad3run
+2ads2
+ad3sz
+2ad2t1
+adte2
+adt3h
+1adv
+2a1e1
+ae2b
+a2ec
+ae2d
+ae2i
+a2ek
+a3el.
+a2ela
+a2ele
+a2eli
+a3els
+ae2m
+ae2o3
+ae2p
+a3er.
+3a2er2o
+aes2a
+ae4sc
+ae2ta
+a2ew
+ae2x
+2afa
+af1ab
+a2f1a2n
+a3far
+a2f1au4
+2afä
+a2f1än
+2afe
+a2f1ec
+a4fentl
+a4f1ep
+aff4a
+af2f3l
+af4flu
+2afi
+afi2e1i
+afi6kanz
+afi4kat
+afi2t
+2af3l
+af1la
+a1flu
+2afo
+a2f3oc
+a2ford
+2afra
+af3rau
+af3rä
+af3re
+2afro
+af3rö
+af4rü
+af3s2a
+af3sh
+af2si
+af2sp
+af2t1a
+af2tei
+af2te2l
+aft4erk
+af2t1o
+af2tö
+aft3r
+af2tra
+af2t5re
+af2tur
+a2f3ur
+2afü
+a1g
+2ag.
+2aga
+ag1a2b
+ag1a2d
+ag1am
+ag1ar
+a2g1au
+agd1
+ag2del
+ag2di
+ag2dr
+ag2du
+4age.
+age1i
+agein4s
+age4ler
+ag2em
+2agen.
+age4neb
+a4gentu
+2ages
+age4sam
+age4s3i
+age2s3p
+ages5s
+ages6sen
+age4s3ti
+3aggr
+a2g1id
+a2gim
+2a2g1l
+ag4lan
+ag4las
+a4glö
+2agm
+ag2n
+ag4nat
+a4gnä
+ag4ne.
+ag4nu
+ag3rat
+a2g3re
+a2g3ri
+ag4ro
+2ags
+ag3sah
+ag4sam
+ag3s4eid
+ags8porta
+ag2s1tr
+2agt
+ag2th
+2agu
+a2gund
+2ah.
+a1ha
+ah2an
+ah4at
+a1hä
+2a1he
+ahe1in
+a2h1er2h
+ahe1u
+a1h2i
+ahin3
+ah2l3a2
+ah2l1ä
+ah4l1ei
+ah2lel
+ahle4na
+ah4l3erd
+ah4l3erh
+ahl1o2
+ah2lö
+ahl3sz
+ahme1i
+ah3mu
+ah4n3a
+ah2nä
+ah3nee
+ahn3el
+ah4nerd
+ahner4e
+ahner6le
+ahner4n
+ah2nin
+ah2no
+1a2hor
+ah1os
+a2h3ö
+4ahr
+ahr1a
+ah3r2e
+ahren6sc
+ahre4s3
+ah3ri
+ahrta2
+ahr2ti
+ahr4tri
+ahr4tro
+ahr4tun
+ah2ta
+ah2te2l
+ah2t1ex
+ah2t5r
+aht1s2
+a1hu
+ah1w
+a1hy
+2ai.
+ai3a4
+a1ia.
+2aib
+ai2bl
+aid4s
+aids1t
+ai1e4
+ai3en1
+aif4
+ai1fr
+ai3g4
+a3ik.
+ai3ke
+ai2lar
+ail3d4
+ai2lei
+ail3g
+ai2lo
+4ain
+ain2a
+a1ind
+ai5n4e
+ain3s
+ains2p
+3airb
+ai2sa
+a3isch.
+ai5schw
+ai3s2e
+ais3sen
+ais5st
+ait4
+a3iv.
+a3ivl
+a3ivs
+a1j
+a2jat
+ajekt4o
+2ak.
+2aka3b4
+a2ka3d2
+2akal
+2a3kam
+2akar
+ak4at
+aka4tak
+1akaz
+4akä
+2akb
+2akc
+2akd
+2a1ke
+a2kef
+a2k1em
+a2k1ent
+a2kes
+a2keu
+4a1ki
+ak1ins
+1akku
+2ak3l
+ak4li
+a1kna
+2ako
+2a1kr
+ak4ri
+3akro3
+2aks
+ak3sh
+ak2t1a2b
+ak4tag
+ak3tan
+2aktb
+ak2tel
+ak3ten
+akt2er
+2aktik
+2aktis
+2aktm
+ak2tö
+ak2t3r
+ak3t4ri
+2aktsi
+2aktsp
+2aktst
+2aktw
+a1ku
+2akun
+a2kup
+2akur
+4a3kü
+1akz
+3akze
+a1la
+2ala.
+4alabo
+al2abr
+al1af
+al1age
+2alai
+al1akr
+al1am
+al1ana
+4aland
+a2lang
+al1anz
+al1app
+a3lar.
+al3arc
+a3lare
+al2arm
+2al3arr
+a2lart
+ala2s
+al1asi
+al1ass
+ala2t1a
+al4atm
+alat3z
+al1au
+al3aug
+a1lä
+a2l1äm
+al1än
+al1äu
+3albat
+al2bär
+alber4e
+al4berh
+al4b3er4w
+al2b3l
+al2boh
+alb3ru
+alb5st
+al2dä
+al4d3erl
+al4d3ern
+alde2s
+ald3inn
+al2dr
+alds2
+2ale
+4ale.
+ale4ar
+al1eb
+ale2be
+al1ec
+a4l3ef
+a2l1ei
+a3l2eic
+a4l3ein
+a2l1el
+5a2lema
+alen1
+4a3len.
+3alenc
+alende4
+al3endr
+a4l3ends
+a2leng
+al2enn
+ale2p
+al1epo
+4aler.
+a2l1erb
+a2l1erf
+a2l1erh
+aler4kl
+a2l3erl
+al1erm
+aler4mi
+a2l1er4r
+a2l1ert
+3a4l3erwä
+4ales
+a2l1e4sk
+a2less
+a2l1eu
+al3exi
+alf4r
+2alg.
+3algi
+al2gli
+al3glo
+1algo
+3algor
+2ali
+al2imb
+al1imm
+ali4nal
+al1ind
+a2l1inq
+al1ins
+alken1
+al2klö
+al2kne
+1alkoh
+alk3s
+al2lab
+alla3d
+alla2m
+al2lan
+al2l1ap
+al2l1a2r
+al6later
+al2lä
+al3läu
+al4lec
+3allee
+alle4gi
+al4leh
+al3lend
+all3erk
+al3les
+alle3se
+al2leu
+al2lid
+alli5er.
+alli7ers.
+al2lob
+al2lo2c
+al2lop
+al2lo2s
+al2lö2
+all3öse
+al2luf
+allu4s
+al2lü4s
+al2map
+al3mas
+al4m3ast
+almo6de.
+a2l1ob
+3aloe
+a2lof
+4alog
+alo2ga
+alo2gr
+al1ont
+al1ort
+a2l1ö
+al2ös
+3alp.
+3alpe.
+1alph
+al2pho
+alp4r
+alrat2
+al3sak
+al6schei
+al3ses
+al4sh
+al3skl
+al2stu
+al2sum
+al2t1ak
+al2t1an
+1altä
+al4temu
+al4t3er5f
+al2teu
+al2tin
+alt1op
+al2tö
+al4t3rat
+al2tre
+al2t3ri
+al2t3ro
+alt4stü
+2altu
+a1lu
+alu3b4
+al2u3f
+alu3g
+al1u2k
+a2lum
+al1umb
+al1ur
+a3lus
+4aly
+al2zar
+al2zau
+alz4erk
+al2zw
+2am.
+am2a
+ama3d2
+ama3g
+2amah
+a2malg
+2a3m4an
+a2m3ap
+2amar
+ama4sta
+a2maz
+2amä
+4ame.
+a2meb
+2amel
+am4e4n1
+amen6s5pr
+ame3r2a
+a2m1erf
+a2meri
+ame5r2u
+a4mesh
+a3met
+2amf
+am4ing
+2amir
+2amis
+2amit
+2amk
+2aml
+2amm.
+am2ma2c
+2ammal
+amma2n
+am2mar
+am2mas
+amma4sc
+am2maß
+am4ma4te
+ammen8ge.
+ammes3
+am2mid
+ammi2e
+am2min
+am2mit
+am4mo2d
+am2mö
+ammu2
+amm3unt
+am4mus
+am4mü
+amni1
+a2mö
+2ampe.
+2ampen
+am4pf
+amp2f1a2
+ampf1o
+2am2ple
+2ampo
+am3pr
+4amsc
+am4schl
+am3sh
+1amt.
+am2t1a2
+am2t1ä
+am2tei
+amt3eig
+am2tel
+2amtem
+am4t3ern
+am2t1ex
+am2tis
+am2tit
+am2to4
+am2tö
+am2t3r
+am2t1u
+2amu
+3a2mul
+2ana.
+2anab
+ana3c
+anadi1
+an2ag
+2a3nak
+an1alg
+ana4lin
+ana3ma
+2anan
+an4and
+2anas
+a5nat.
+ana4th
+a5n4atm
+ana2tr
+an3aug
+1an1äs
+1anb
+2anbas
+2anbu
+an3ch
+2and.
+3an3d2ac
+and3arm
+and3ei
+anden6ga
+an4d3ent
+and5erob
+ande2s
+an2d1ex
+and4sas
+and2so
+and6spar
+and6spas
+and6s5paß
+and2su
+4andu2
+an2d1ur
+2ane
+4ane.
+an3ec
+a3nee
+an2ei.
+an3eif
+3aneig
+a4neis
+3a2n1e4k
+ane2mi
+4anen
+aner4fa
+an2erh
+a4nerke
+4anern
+a4nerz.
+an4erze
+an1eth
+1anf
+2anf.
+2anfab
+3anfä
+an3fe
+2anfi
+an4fj
+anf3le
+4anfors
+anf5rau
+2anfs
+an3f2u
+4ang.
+1angab
+an2gan
+an2g1ar
+2ange.
+1angeb
+1angeh
+an2g1ei
+an4g3erf
+an4g3er4w
+an4g3erz
+2angh
+2angie
+ang1l
+an2gla
+ang3n
+ang1r
+ang3ra
+1an3gri
+4angs.
+angt4
+1anh
+2a3n2i
+ani3d
+4anie
+ani3els
+ani5ers.
+ani3g2
+ani3ke
+3a4nim
+a4n3ind
+a4n3ins
+ani2o
+an3i4on
+a4niso
+anis2t
+2anj
+2ank.
+an2kab
+an2k1ak
+an2kan
+an2kei
+2anken
+ank5erfa
+2anki
+an2klö
+an2klu
+ank3no
+an4k3opf
+an2ko4r
+ank1r
+ank3ra
+an4kras
+ank3rä
+an2kro
+2anks2
+ank3se
+2ankt
+3ankü
+1anl
+2anlad
+3anlag
+anma3s2
+2anmo
+1anmu
+2ann.
+1annah
+an2nar
+an3ne
+an4nef
+2anns
+ann4s3p
+2annt
+2ano.
+ano3b
+an1od
+2anof
+2anog
+anoi3
+a3nol
+ano2la
+1a2nom
+a3nom.
+a2n1or
+2a3nos
+2a1nö
+2anpu
+1anr
+2anrö
+an3s4ar
+1an3s2ä
+1ansc
+an3skr
+ans1pa
+ans3pon
+1anspr
+1anst
+an3s2z
+2ant.
+an2t3ar
+anta4re
+an3t2ä
+1antá
+3antei
+an3tha
+2antie
+3antise
+2anto
+anton2
+3antr
+ant3rin
+1antw
+2anu
+anus3s
+an4ut
+a1nü
+1anw
+2anwi
+an2zä
+2anzb
+2anzd
+1anzei
+anze2n
+2anzes
+2anzg
+2anzh
+an2zid
+an2z1i4n
+2anzk
+2anzm
+2anzr
+2anzs
+2anzt
+1anzü
+3anzün
+2anzv
+2anzw
+an2zwa
+an2zwi
+2anzy
+2ao
+aof4
+ao3i4
+a1op
+aopf4
+a1or
+a1os3
+aost2
+a3ot.
+aot4r
+ao3t2s
+2a1ö4
+a1p
+4ap.
+2apa
+a2pe.
+a3pel
+a2pé
+a2pf
+ap2fa
+1apfel
+2apfes
+a3pfl
+a2pht
+2api
+2ap3l
+ap4la
+ap4lä
+ap4lo
+ap2n
+a2pot
+2apr
+4apro
+ap4ster
+ap2sto
+ap2str
+ap3t2
+2a3pu
+2ar.
+a1ra
+a3ra.
+ar2ab
+2ar3abb
+ar3abf
+ar3abt
+ara3d2
+ar3adr
+a2r3al
+a3rale
+a3ra3li
+a3ralo
+2aran
+a2r1ang
+a2r1anz
+2arap
+a2r3app
+2arar
+a3ras
+a2r1au
+a1rä
+1arb
+2arb.
+2arba
+ar2bak
+ar2b3at
+ar2bau
+2arbef
+ar4b3ein
+2arbek
+2arben
+2arber
+4arbi
+2ar2bl
+2arbo
+2arb1r
+ar2bre
+2arbs2
+arb3se
+arb3sk
+arb3so
+2arb3t4
+2arbu
+1ar1c
+2archl
+2archr
+ar2dau
+arde2l
+ar2dob
+ar2dop
+ar2d3r
+ar2du
+a2rea
+are5aler
+a2reb4
+aree2
+ar1eff
+ar1ehr
+ar1eid
+a3reih
+areim3
+a2rein
+arein4b
+arein4s
+arein4t
+a2rele
+4arem
+4a5ren.
+a5reni
+aren6sem
+are3r2a
+arer2e
+a4r3erei
+a2rerg
+a2r1er3h
+a2reri
+a2rerk
+a2rerl
+ar2erw
+are3u
+arf1r
+arf3ra
+arf2sp
+4arg.
+ar3gan
+ar2gl
+ar2gn
+2arg4o
+ar3g4r
+2arh
+2ari
+ar2ia
+a2rid
+ari3e2n
+ari3erd
+ari3erg
+ari5ers.
+ar3inf
+arin3it
+ar1int
+a3rio
+ar2ir
+ar4is
+ari2su
+a3riu
+ar2kal
+ar2k1ar
+ark3aue
+ar2kil
+2ark3l
+ar4klag
+ar2kle
+ar2klo
+ark4lö
+ar2kor
+ark3s2a
+ark2se
+ark3she
+arku2
+ar2les
+ar3mad
+ar2mau
+ar3m2ä
+3armee
+ar2m1eg
+ar2m1ei
+ar4merk
+arm2or
+ar2mum
+4armü
+ar2nan
+arn2el
+ar3ni
+ar4nin
+a1ro
+4aroc
+ar1o2d
+ar1of
+aro2fe
+a3rol
+aro3m
+aron2
+a2r1op
+a2ror
+a2r1ö
+2arp
+arp3fe
+2arr
+ar2r3ad
+ar2r3as
+ar2rek
+arre4n1
+ar2r3or
+2arsa
+ar3s2h
+2ar3s2i
+ar3sse
+ar2tau
+2artb
+ar3t2e
+2artei
+artel6li6
+arter6la
+ar2the
+art3ho
+art2i
+2arto
+art3r
+art4res
+2arts
+art3ske
+2artuc
+2aru
+a2r1uh
+ar1um
+a3rumm
+a2rü
+2arv
+arwa2
+2ary
+ar2zau
+ar2zä
+2arze
+2arzi
+ar2zö
+1arzt
+arz2t3r
+2arzu
+ar2z1w
+2asa
+a4s3aa
+as2ad
+a4s3af
+as2al
+as1am
+as3art
+asa2s2
+asa3sse
+as3at
+asau4f
+a2s3aug
+asau2s1
+as3ät
+a2sca
+a4schec
+a4schef
+a4sch3ei
+a6scherg
+as4chi
+a2schm
+2ascht
+a3schu
+a4schum
+4a3se
+a4seb
+a4sec
+a4s1ef
+as1eie
+as1emi
+a5sen.
+ase4na
+ase4n3o
+asens2
+as1ent
+as2er
+a4s3erke
+as4es
+ase2t
+as1eta
+a4sex
+a4s3ha
+as2hi
+as3hir
+a2s3i2k
+2asim
+asin2g
+as1inn
+2asis
+a4s3l
+a4sm
+a4sn
+a1so
+as3ob
+as1o2f
+a3sol
+a3som
+aso2p
+as1or
+a4soz
+as1p
+as3pe
+aspek6to
+a4spel
+as4pen
+a4s2ph
+as2pi
+as4pin
+as3pio
+a4spir
+a4spl
+as3sa
+ass2ab
+ass6aus.
+ass2e
+ass3ein
+as3sel
+asse3le
+as3ser
+asserma6
+a4ss2i
+as3sin
+as3ski
+as3so
+as2spo
+as2spr
+as4st
+as5sta
+as5stei
+as5sti
+as5str
+as5stu
+2asta
+a4stab
+a3stä
+a4s1tec
+as2tee
+ast2el
+a4stemp
+a4s3tep
+ast2er
+a4st3ese
+as2tex
+a4s2th
+a2stoc
+ast3orc
+as4trau
+a2st3re
+ast4ren
+a3stro
+a4strol
+ast5roll
+a4s1tub
+a4stuf
+a2stum
+2a1su
+as2ur
+a3sus
+a4sw
+aswa2s
+2asy.
+3a4syl
+as3z
+aße4
+aß2en3
+a2ß1er
+aß2th
+2a1t
+4ata
+at1abe
+at1abr
+at2a1f
+a3t2a3g
+a3tah
+at1akt
+ata3l
+a3tam
+at3ank
+at1apf
+at2asc
+at3att
+a2t1au
+a3tau.
+at1än
+4atb
+at2c
+4ate.
+a2teb
+ateien6d
+at1eig
+3a2teli
+a3tell
+3atemg
+at2en
+ate4na
+atens4
+a2tep
+ate3r4al
+ate3ran
+atern2
+ate2ru
+4ates
+at2eu
+a2tew
+at2ex
+at3hag
+a3t4heb
+a2th3in
+3athl
+a4thr
+at2hu
+4a3ti
+ati3ka
+ati4kab
+ati6k5erw
+a4tinf
+at2is
+ati2sa
+ati2se
+atis3s
+3atla
+4atli
+4atlo
+3atm
+4atma
+4atmä
+4atmus
+ato4man
+ato4men
+3atomk
+ato2mo
+at1ort
+a3tra.
+atra2t
+a2trau
+a2t3rä
+at3re
+4atri
+at3rin
+a2t3rom
+a3t4ron
+at3rot
+at3rü
+at2sa
+at4schn
+at2se
+at2si
+ats1o
+ats1p
+ats3tät
+at3ta
+3attac
+at4tad
+at2ta2g
+at4t1ak
+at2ta2l
+at4tang
+at4tar
+at4tau
+at2tä
+4atte.
+at2tec
+at2tei
+at3t2el
+at4temp
+at5ter
+attes2
+at3thä
+4atto
+at2t3rä
+att3s2
+at3t2u
+at2ty2
+atu2n
+atze4l
+atz3ela
+atz3elt
+at2z1er
+a3tzere
+at2z1i
+at2zo
+atz3t4
+at2z1w
+a2u
+2au.
+2au1a2
+2aub
+au2bab
+au2ban
+au2bau
+au2bei
+aube4n
+au2beu
+au2blä
+au2bli
+au2blo
+au2blu
+aub2si
+aubu4s
+4auc
+aude4r3i
+au2dr
+2aue
+aue2b
+au2ere
+aue3rei
+au5erein
+auer3ö
+au5erst.
+au3ert
+au2fa
+auf1an
+aufas2
+3aufber
+2aufe.
+2aufeh
+4aufen.
+3aufent
+auf1er
+au4ferk
+au2feu
+auff4
+auf3ind
+1aufla
+1aufn
+2aufo
+auf3ski
+auf3t4
+2auft.
+5aufzeic
+3aufzug
+1aufzü
+2aug
+aug2ar
+4augeb
+4augeh
+4augel
+aug2er
+4augl
+4augr
+au3gu
+2auh
+au3ha
+auh1u
+2au1i
+au3in
+au2is
+2auj
+auk3t
+aule2s
+aul4les
+au3lü
+4aum
+au2mal
+au4m3ent
+au2m1e2r1
+aum3eri
+au2mid
+au2mil
+aum1o
+au2mor
+aum3p2
+aum3s2
+au4mun
+4aun
+au3n2a
+aun2e
+au4nei
+au2nio
+au2no
+au3nu
+a4unz
+2aup2
+aup4ter
+2aur2
+au3ra
+au1rh
+au4sag
+au2s1ah
+ausan8ne.
+au2sau
+2ausc
+au6schmi
+1ausd
+2ause.
+au4s1eh
+2ausen
+au4s3erb
+au4s3erf
+aus3erk
+aus3erp
+au4serw
+1ausf
+1ausg
+au2sin
+au4sis
+1ausl
+au2so
+aus1or
+au2spr
+1ausr
+1auss2
+au3sse
+aus4se.
+au8ssende
+aus4ser
+aus4ses
+au2st2a
+aus3tau
+2auste
+au4stec
+aus3tie
+aust2o
+au2stö
+aus3tri
+3ausü
+1ausw
+1ausz
+auße2
+au3ßen
+a4ut
+au2t1äu
+2autb
+au2t1e2l
+auten4g
+au4t3erh
+2autg
+1auto
+au2trö
+2auts2
+2auu
+2auv
+auve4
+2auw
+2aux
+2auz
+au3ze
+auz2w
+2a1ü
+a1v
+av2a
+a3vang
+ava3t2
+avener4
+2avi
+a2vr
+av2s
+2a1w
+awi3e
+a1x
+ax2am
+a2xans
+ax2e
+a3xid
+a2xio
+axi2s
+ay1
+2a1ya
+ay2al
+ay2as
+a1yeu
+ayma2
+aysi1
+ay3t
+ay2u
+2a1z
+a3z4a
+aza3d
+3a4zal
+az2i
+az2o3
+a3z2u
+az2zen
+az2z1in
+az2zw
+ä1a
+1ää
+ä1b
+ä2b3l
+äb2s
+ä1ce
+ä1che
+äche1e
+äche4n
+ächenma5
+ächenmas8
+ä1chi
+äch3l
+ä2chr
+äch4s3a
+äch2s1o
+äch2sp
+ächt4e
+ä1chu
+ä1d
+ä2da
+ä2d1ia
+ä2dr
+äd2s
+äd3te
+2ä1e
+äe2x
+äfe4n
+äf2f3l
+äf3l
+äf3r
+äf4ro
+äf2s
+äft2
+äft4s
+ä1g
+ä2g1a
+1ä2gä
+ägd2
+ä5ge
+äge1i
+äge2r3a
+ä2g3l
+äg2n
+ä2g3r
+äg4ra
+äg2s
+äg3sc
+äg3sta
+äg3str
+1ä2gy
+äh1a
+2ä1he
+äh1ein
+äher8gebn
+äher3t
+ä1hi
+äh1in
+ähl1a
+äh3l2e
+äh4l3e4be
+äh5ler
+4ähm
+äh3na
+äh3ne
+1ähnl
+2ähr
+äh2rel
+äh3ri
+2äh2s
+2äht
+ä1hu
+äh1w
+2äi
+ä1im
+ä1is.
+ä3isch.
+ä1isk
+ä1j
+ä1k
+äka2la
+äk3l
+ä2kle
+äk4li
+ä2k3r
+ä1la
+älbe2
+äl2bl
+älk3
+älks2
+äl2l1a
+äl2p3
+äl4schl
+ä1lu
+2äma
+ämer2s
+ämi3en
+2äml
+äm2ma4
+ämmas2
+ämoni3e
+2ämp
+ämp7f4e
+äm2s
+ämt2e
+2än.
+änd2e
+än2dr
+2än2e
+äne2n1
+2än2f3
+änft2
+2än3g2e
+änge4ra
+2än2g3l
+än2gr
+ängs2
+äng3se
+2ä3n2i
+än3k2e
+än2k3l
+än2kr
+än3n4e4
+2äns
+än4s1a
+än2s1c
+äns2e
+änte3le
+2änz
+ä1on
+äo3s2
+ä1pa
+1äpfel
+äp2pl
+äp2pr
+äp2s1c
+1äq
+ä2r3a4
+är4af
+är1ä
+är2b3le
+är1c
+2ärd
+ärde4s
+2äre
+ä2r1ei
+ä2r1e2l
+är2em
+äre2n
+ä2rene
+är2er
+är2es
+är3ge
+ä2rind
+är1int
+är3ke
+ärm3arm
+ärme1e
+ärm3ent
+är1ob
+är1of
+ä1rö
+är3re
+ärse2
+är2seb
+är4seh
+ärs1er
+är2si
+är3spu
+2ärt
+ärt4e
+är2th
+ärt4s1
+ä2rü
+1ärz
+ärz3te
+är2zu
+är2zw
+ä1s
+äs4c
+2ä3s2e
+äse3g
+äse1i4
+äse5ref
+äser4ei
+äse4ren
+äser2i
+äse3t
+ä5si
+ä3s2kr
+ä2s1p
+ä3s2s
+2äs4s1c
+äss2e
+äss5erkr
+äss5ersa
+äss3erw
+ä5sses
+äs4sh
+äs4s1t
+äs4t2e
+1ästh
+ä2str
+ä1ß
+2äßc
+äß1erk
+äß1ers
+ä2t3a4
+2ä3te
+äte3a
+äte1e
+äte1i
+äte3l2
+äte2n
+äteo2
+äte3se
+ä2th
+ä1ti
+ä1to
+ät1ob
+ät3r
+ät2sa
+äts3au
+ät2sä
+ät4schl
+ät4schr
+ät2s1i2
+äts3l
+äts1or
+äts1p
+ät4s1t
+äts3te
+ät2tei
+ätte4n
+ät2tr
+ä1tu
+ätze3l
+ät2zw
+äu2b3l
+äu2br
+äu1c
+äu3d
+äude3
+äuder2
+äu3el
+2ä2uf
+1äug
+äu4g3l
+2äul
+2äum
+äu2ma
+äum3p
+äumpf4
+äum2s1
+2ä2un
+äun2e
+äu3nu
+2äu3r2
+äure1
+äu1s
+2ä3us.
+2äusc
+äu4schi
+äu4schm
+äu6schü
+äu3s2e
+äuse1i
+ä3usg
+ä3usk
+ä3usn
+äu2s1p
+äu3s2s
+äuss1c
+1äuß
+äut2e
+äu2tr
+ä1v
+1äx
+ä1z
+â1t
+á1n
+5ba.
+b3a2ba
+2babf
+2babg
+ba2bl
+ba2br
+2b1abs
+bach7t4e
+back3er
+back3s2
+ba3d2e
+bade1i
+2b1adel
+2b1adl
+2b1adm
+b1a2dr
+ba2du
+2b1af
+bah6nene
+bais2
+b2ak
+ba2ka
+ba2k1er
+ba2k1i
+bak1l
+bak3r
+ba2kra
+ba2kre
+ba2lab
+ba2l1ak
+ba3lal
+ba2lau
+ba4l3erk
+balk4a
+balke4
+bal4lan
+balle4b
+bal4l3ei
+baller6e
+bal6ler6g
+ball6erk
+bal4li4g
+bal4lo4k
+ballö3s
+bal3ti
+2b1am
+b2ama
+ba2me
+ban2a
+3b2and
+band1a
+ban4dal
+ban4dan
+ban4dar
+ban6deng
+ban2dr
+ba3n2e
+2banf
+b1ang
+ban3gl
+ban4k1a
+banker4
+ban2kl
+ban2kn
+ban2kr
+ban2ku
+2banl
+b1anna
+ban2o
+2b1ans
+b1an3t
+2banw
+b1anz
+ba2r3ab
+ba2rad
+bar3ast
+ba2r3at
+bar3de
+ba2rei
+ba3r2en
+barer5ei
+bar3n
+b2aro
+3bars
+b1arz
+bar3zw
+3bas
+ba3sa
+ba2sc
+bas2i
+bas4sa
+bas4sei
+bas6st
+bas4t
+ba2str
+ba2ß1
+ba4t3ent
+bat2o
+3bau.
+bau3b
+bauer4l
+bauer4s
+bau3fa
+bau1fl
+bau1fr
+bau3g2
+b2auk
+bau3r
+bau3s2k
+bau3sta
+b1a2x
+ba1yo
+3b2äc
+bä1ch
+3b2äd
+2b1äh
+b2äl
+2bärz
+b2ä4s3
+2bäug
+4b1b
+bbe4n
+bbe4p
+b4be2se
+bb3ler
+bb2lö
+b3brec
+b3bru
+bbru2c
+bb2s
+bbu1
+2b1c
+bch2
+2b5d4
+bdome4
+1be.
+3bea
+be3an
+be3ar
+3beb
+b1ebb
+1bec
+be1ch
+2becht
+2b1e2del
+bedi4
+be1e2h
+bee2l
+be1ela
+bee4rei
+be1erl
+be1ert
+be1eta
+bef4
+2b1eff
+be3g2
+begas1
+be2he.
+beh5ri
+bei3b
+2b1eier
+bei1f4
+bei4ge.
+bei3k4
+bei3l2a
+2b1eime
+be1ind
+be1inh
+bein6hal
+bein4hi
+bei3s2
+bei5st
+beit2s
+3bek
+3bel
+be3lag
+be3las
+be3lec
+4be2lek
+be2l1en
+bel3ere
+be2let
+bel3f
+be3l2i
+beli4e
+bel3la
+belle4n3
+bel3li
+be2l3om
+be2löf
+bel3sz
+bel3t
+bel4un
+1bem4
+2b1emp
+2bemul
+1ben
+3ben.
+be5nabe
+ben3ar
+be4nas
+be4nat
+benä4
+bend3s2
+b2ene
+be3nei
+be4n3end
+be4ners
+ben2eu
+3beng
+be4nis
+ben3n
+5benp
+b2ens
+ben4s3pa
+ben4spr
+benst4
+3bensv
+3bensz
+2b1entb
+2bentd
+4benteu
+2bentf
+ben3th
+ben6thei
+bent4r
+2b1ents
+2b3entw
+be2nu
+ben3un
+ben3z2
+be1o
+2b1epi
+be1ra
+be2r3am
+be2ran
+ber3a4s
+berb2
+ber3d
+b4ere
+be2re2b
+ber2ec
+ber4ei.
+be4r3eiw
+be4rene
+ber4erg
+ber4erw
+bere4sc
+berf4
+3berg.
+ber4g3af
+ber4gal
+berg3a4s
+ber4hab
+ber4in.
+be5r6inne
+berin4s
+ber3iss
+ber3kr
+bermas4
+berma7sse
+ber3n2a
+b1ernt
+be2rö4
+3bers.
+ber5se
+ber3st4a
+ber3t2a
+bert2e
+bert2i
+b4eru
+ber3ze
+ber2zö
+3b2es
+be3sa
+bes4abb
+bes2am
+be4sap
+be4sar
+bes2au
+be2s1er
+be2s1id
+be5s4lo
+bes2po
+bes3sa
+bess4e
+b3esst.
+bes3sz
+beste2
+be6stein
+bester4
+be6sterh
+best2i
+bes3tin
+be4s3tol
+be4sto4r
+best4r
+be4strä
+be4s3tur
+be3s2ze
+3bet
+be3tam
+bet2to
+be1un
+be1ur
+3bev
+3b2ew
+2b3e2x
+3b2ez
+2b5f4
+bfal2
+bflö4
+bflös3
+2b1g4
+b5ga
+bgas1
+bga4st
+bge3
+bgel2e
+bge5n
+bges2
+2b1h2
+b5hä
+1bi
+3bib2
+bibe2
+biber1
+bi2c
+bieres4
+bie4str
+biet4s
+3bietu
+bik2a
+bi2ke.
+bi2kes
+bi2k3re
+3bil
+bi3la
+bi4lans
+bi4lau
+bil4deb
+bi2lei
+4billu
+bi2lu
+2bimp
+2b1inb
+3bin2e
+b1inf
+2b1inh
+bi2nok
+2b1int
+2b1inv
+bi2o3
+biri1
+3bis
+bis2a
+b1iso
+bi2sp
+bis4s1c
+bist4
+bi3sta
+bi2s1to
+bi2stu
+bi2stü
+3b2it.
+b2ita
+bit2an
+b2ite
+bit2ta2
+bi2tu
+bi3tum
+bi3tus
+bi3z2
+4b1j
+bjek4to
+2b5k4
+bl4
+2bl.
+bla3b4
+2b3lac
+b3lad
+b5lag
+b2lanc
+b3late
+b2latt
+b4lau.
+b3laus
+2b3law
+2b1län
+b2läse
+3blät
+b2le
+3ble2a
+b3leb
+3blec
+b3lee
+b3leg
+2bleh
+2b3leid
+2bleih
+b3lein
+blei3s
+2bleit
+ble3l
+2b3lenk
+b3lese
+2blesu
+ble3sz
+b4let
+b3leu
+2blich
+3blick
+b2lie
+2blief
+2blig
+bling4
+b2lis
+2blis.
+b2lit
+3blitz
+b2lo
+3b4loc
+b3los2
+blo3sse
+3b4lum
+2blun
+b2lus
+3blut
+blut1o
+3blü
+2b1m
+bmas2
+4b5n2
+bnas4
+bni2
+bnis1
+bo4a
+bo5as
+b1o2b
+bo3ben
+bob3r
+bo1ch2
+bo3d2
+boe1
+bo2e3i
+2b1of
+bo3fe
+boh3re
+boh4rei
+boh2u
+bo1is
+bo2lan
+bo2lau
+bol3le
+5bon.
+bon2an
+bon2da
+bon2d1e
+bo2ne
+2b1onk
+5bons
+boo4l
+boo2ti
+b1op
+bo1r2an
+bo2r3as
+bo4rä
+bor2da
+bor2d3r
+bo2rei
+bo4rig
+b1ort
+bor4ter
+bor6t5rat
+bo4ruh
+bo2sc
+bo3se
+bo4s3p
+3bot
+bote3n4e
+bo3th
+bot2st
+bot3t
+3b2ox
+bo2xo
+bö2b3
+2böf
+2b1ö4l
+2b1p4
+bpa2g
+2b1q
+b2r4
+2br.
+b4ra.
+2b3rad
+2b4rah
+b4ra3k
+bra4ss
+brast4
+2b3rat.
+bra4t3er4
+2b3ratg
+3brä
+4bräd
+brä4u
+2bre.
+6b5rechte
+2b3red
+2b3ref
+2breg
+b3reif
+2b3rek
+breli1
+3b4rem
+2b3rent
+2breo
+2b3rep
+b4rer
+bret6t5en
+bri2da
+brie4fa
+2b3riem
+b4rien
+bri2er
+b3ries
+2brigk
+b4rina
+2b3rind
+b4rio
+b4risc
+2briß
+b3ritt
+2b3roh
+2b3rol
+b4ron
+2b3rost
+bro2tr
+brot3t4
+2b3rou
+3b4rö
+b4ruc
+2bruf
+b4rum
+2b3rund
+bru4s
+brust3
+bru2th
+3brü
+4b3rüb
+brü4ss
+2b1s
+b2sad
+bs1amb
+b4samt
+bsas2
+bsa3sse
+bsau2r
+bs1än
+b4s3är
+b3säu
+b5sc
+bsch2a
+b6schan
+b6schef
+b6sco
+bs2cu
+b3se.
+bs1e2b
+b3sel.
+bse2n1
+b3sen.
+b2s1ent
+bs1er
+bs3e4r3in
+b3ses
+b3set
+b2sim
+bsi2t
+b4ski
+bs3ko
+bs2ku
+b2s1of
+b3s2oh
+b4sop
+bso2r
+b2sö
+b3s2pi
+bs2pl
+bs2pu
+bs3s2
+bst1a2b
+bs2t1ak
+bst3ank
+bs2t1a4s
+bs2tau
+b3stä
+bs1tät
+bst1er
+b4stern
+bst3h
+b3stic
+bst3ink
+b2stip
+b3sto
+b4stob
+b4stod
+b4stor
+b3stö
+b3stra
+b2s1trä
+b4s3treu
+bst3ro
+bs2tu
+b3stü
+b4stüb
+bs1ums
+b2s1un
+b3sz
+bs2zep
+bs2zi
+4b1t
+bta4st3r
+b5te
+b2t3h
+bti2s
+bt4r
+btran2
+bts2
+btü1
+bu4chec
+bucher6
+bu6ch5ers
+bu3ches
+bu2chi
+buch3s4p
+bu2e3
+bu2f
+bull3a
+2bumf
+2b3umk
+2buml
+2b3umr
+bun4d3er
+bunde4s
+b1une
+b3un3gn
+2b1unh
+bur1c
+b2urg
+burg1a
+bur4gan
+bur4gar
+bur4gin
+bur2gr
+bu3r2i
+2burn
+b3ursa
+burt4s
+bu2sa
+bu2sc
+bus3cha
+bu3sche
+bu6schei
+busch3w
+bu2si
+bu2s1p
+bu4sses
+bu6s5term
+bu2s1tr
+bu2su
+bus1un
+2büb
+bü1c
+bügel3e
+bü3s4
+2b1v
+4b5w
+3b2y1
+by3p2
+bys2
+2b1z4
+b5ze
+bzeit1
+bzu1
+1c2a
+cab4
+ca3bl
+ca2c
+ca2e3
+ca3g2
+ca1h
+cal2a
+cal2f3
+cal3t
+2can
+cana3
+ca2pe
+car3b
+car3n
+carri1
+ca3s2a3
+ca3t2h
+ca1y2
+cä3
+cäs2
+c1b
+2cc
+c1ce
+c1ch2
+cchi1
+c2d2
+c3do
+2cec
+1ced
+ce2dr
+ce1e
+2cef
+ce1i
+ce3in
+2cek
+3cels
+cen3a
+ce3nu
+ceo2
+1ce1r
+cere1
+cere3u
+ce3r2i
+ce3s4h
+cet1am
+ce1u
+1cé
+c1f
+c1g
+c2h
+4ch.
+2chab
+ch3a2b3i
+2chac
+2ch1a2g
+2ch1ak
+3chanc
+chan3f
+ch1ang
+4chanl
+2chanz
+1chao
+2char.
+1chara
+3chard
+3charta
+cha2sc
+chasi1
+1chato
+2chatt
+2chatu
+ch5austr
+chau3t
+ch1äh
+ch1ärm
+ch1äs
+1châ
+2chb
+6chc
+2chd
+che3b
+ch3e4ben
+ch3echt
+ch1edi
+1chef
+3chef.
+che4fer
+3chefs
+2chei
+ch1eim
+4chelem
+che4ler
+1chemi
+3chemik
+2chemp
+che4neb
+che2no
+4chents
+4chentw
+cher3a
+4ch3erbs
+6chergeb
+4cherke
+cher6zie
+ch3es2s
+2ch1e2ta
+2ch3e4x
+1ché
+2chf
+2chg
+2chh
+1chia
+2chic
+chi3na
+4chind
+3chines
+2chinf
+2chinh
+2ch1ins
+2ch1int
+2ch1inv
+1chip.
+1chiru
+2chiso
+2chj
+2chk
+2chl4
+ch2le
+chle2i
+ch2lu
+4ch2m4
+2chn4
+chner8ei.
+ch2neu
+c4ho
+2chob
+cho2f
+ch1off
+chof2s
+ch1oh
+cho3l2a
+ch1orc
+ch1ori
+ch2os
+ch3öl
+2chön
+3chör
+2chp
+ch2r4
+2chra
+ch3rad
+chra3g
+2chre
+chre3s
+ch3rh
+2chrit
+3chromo
+3chron
+4chs
+ch4stal
+2cht
+ch2tru
+2chuf
+2chuh
+2ch1unf
+2chunm
+2chunt
+2chur
+ch1urs
+2chut
+2chü
+2chv
+2chw
+1chy
+2chz
+ci2ak
+ci1c
+ci1es
+cill2
+ci2na2
+c1int
+ci2s1
+cisch2
+1cit
+c1j
+4c2k
+c4k1a
+cka2b
+ck2ad
+ck2ag
+cka2m
+cka4r1
+ck1ä
+ck1eh
+ck1ei
+cke4na
+cken6sem
+cke2ra
+ck2ere
+ck3er4hö
+ckerk4
+ck2ern
+cke2ro
+ck1err
+cket2t
+ck1id
+ck1in
+ck4is
+ck3l
+ck3n
+ck1o2
+ck3ot
+ck3ö2
+ck3r
+cks2al
+ck3sc
+ck4spen
+ck3te
+ckt2i
+ck1uh
+ck1um3
+ck1up
+c2l2
+c4le
+cle4a
+clet2
+clin2g
+cli2p1
+clip3a
+clo1c
+1clu
+clu4b
+c2m2
+c3me
+c3mu
+1c2o
+co1ch
+co2d2
+co4de.
+co3di
+cof3f2
+coi2
+co1it
+co2ke
+co3la1
+co2leu
+co5l2o
+com4te.
+comtes4
+con2ne
+co2pe
+co1ra
+cor2da
+co4re
+cor3t
+cos4
+co2te
+coti2
+2cp
+c1q
+1c2r2
+cra4s
+c3rä
+3cre2
+4cree
+cre4mes
+cros4
+cry2
+2c1s2
+cs4f
+c2si
+cs3so
+4c1t
+cti4
+ctio2
+ction5
+ctur6
+1c2u
+2cua
+cu2e
+cu2p3
+cussi4
+c1w
+3cy
+c1z
+3da.
+da1a
+2d1ab
+d3a2bak
+d2abä
+d2abe
+d3a2ben
+d3a2bi
+d3a4bo
+dab4ra
+da2bri
+da3brie
+d2ab4rü
+d1ac
+d2ac.
+dach3a
+da2cho
+4d3achse
+d1ad
+da2de
+dad4r
+d1af
+2daff
+dafo4n
+d1ag
+dagi4o
+dag2o
+dah3l
+da1h2o
+dai2
+dail5
+da1in
+2d1air
+da1is
+da2kro
+dal2a
+2d1a2lar
+dal3b4
+4d1all
+da3lö
+2d1alp
+d1al3t2
+2dalte
+da1lü
+3dam
+d1amma
+4d1ammä
+damo3
+d2amp
+damp7f8erf
+4d1amt
+3d2an.
+d1ana
+da2nan
+da4nat
+2danb
+dan4ce.
+d1and2
+2danda
+d2andy
+3dane
+4d3anei
+2danf
+d1ang
+2danh
+d2ank
+dan2kl
+dan2k1o
+dan2kr
+2danna
+d1a2no
+2d1ans
+2danw
+d2anz.
+2danzi
+2danzü
+2d1ap
+d2aph
+da2por
+4dapp
+2daq
+da2r1a
+2darb2
+2d3arc
+dar2da
+dar2d1e
+dare2
+daren1
+dar3g
+3darl
+dar2m1a
+dar2m1i
+dar4mu
+da2r3o
+3dars4
+2d1art
+dar2th
+dar2tr
+da2ru
+d1arz
+das2
+da3sh
+d1asp
+das3s
+d1asy
+dat2e2
+da3tei
+date4n
+4d3atl
+4datm
+da2tom
+dat2st
+2d3atta
+3daub
+2daud
+dau3e2
+dauer3e
+2d3au2f
+2d3aug
+2dauk
+da3unt
+2d1aus
+3daw
+d1ax
+3däc
+2d1äg
+2d1äh
+2d1ämt
+2d1änd
+2d1äng
+2d1äp
+2däq
+2därz
+2d1ä2u
+dä3us
+2däx
+2d1b4
+dbe2e
+dbu2c
+dbu3s
+2dc
+d3ch
+4d1d2
+d3da
+d3dä
+d3de
+d3dh
+d5do
+1de
+dea2d
+de3alo
+de3ar
+de3a2t
+d2eb4
+3debü
+de1ch
+deco3
+de2del
+de2dit
+2de3e4
+de2fa.
+2d1eff
+def4l
+deg2
+de3gl
+deh2a
+dehe2
+3dehn
+2d1ehr
+d1ei
+3d2eic
+2deid
+de3i4den
+4deie
+2deig
+de3il
+3d2eim
+4deime
+4deinb
+dein2d
+de3inse
+dein6sta
+4deinw
+2deise
+d4e1ism
+dei2sp
+2dekz
+de2l1ac
+del4ade
+de3lak
+de4l3aug
+del3änd
+del3b2
+del1ec
+delei4g
+de3lein
+2delek
+2delem
+de2len
+deler2
+deler4r
+2delf.
+2delfm
+3delik
+del4lan
+del4lar
+dell3au
+del2l1ä
+dell3eb
+del4lei
+del4ler
+del2lö2
+de2l1ob
+del2se
+del2so
+del2s1p
+del3t
+dem2ar
+2d1emb
+dement4
+de6mentg
+dem5ents
+de3min
+2d1emot
+2d1emp
+d2en.
+den2am
+de2n1e2d
+de4n3end
+4denerg
+de3n2es
+4d3en4ge.
+de2ni
+denk3li
+de2nos
+dens4am
+den6s5cho
+4den4sem
+den6sere
+den6s5tau
+2dentd
+den3te
+4dentf
+2d1entg
+den3th
+2dentn
+2dentw
+2dentz
+den6zers
+de2ob
+2deol
+de1on
+depi4so
+dep4l
+2depoc
+dep5t
+d4er.
+dera2b
+der3af
+dera2n
+de3rand
+de2r3ap
+de1ras
+de4r3asi
+der2bl
+4d1erbs
+2derdb
+de2re2b
+de4reck
+de3reie
+de4r3ei4s
+d4eren
+de4r3end
+de3r4erb
+de3r4erf
+derer3n
+der3ero
+derer4t
+de2r1eu
+derf4
+d4erfl
+d2erhü
+derin4f
+de6rinnu
+derin8teg
+der3k2
+4derklä
+d4erlan
+d2erm
+de1ro
+de2rop
+derö4
+der3r
+derst2
+der3sta
+dert7ende.
+dert4ra
+6dertrag
+der8trage
+3de3ru
+de4ruh
+de4rum
+2d1erz.
+2d1erzv
+d2es.
+de2sa
+de4s1a2g
+des1ah
+de4s1am
+des3an
+de2s1än
+de2seb
+de4s1e2h
+de2sei
+des3eil
+2d1esel
+des3elt
+de3sem
+des4end
+desen3e
+de3sens
+des3erm
+de2set
+de4s1in
+3desk
+des1o
+de2sor
+de2s1p
+de3spe
+dess2
+des3se
+des5st
+de6st5alt
+de6stant
+de8steige
+de8steins
+des4tex
+de4stit
+de6st5rat
+de4stre
+de2su
+des1un
+3desw
+de3ta
+deten4t
+de2thi
+2d3etw
+2d1eul
+deum3
+de1un
+de1url
+de3us
+2d1e2vid
+devil4
+de2xer
+de2xis
+2d1f6
+2d1g2
+dgas3tr
+d2ge.
+dge3r
+dger2e
+dge3s
+d2gesh
+dge2t3a
+dge4t1e
+2d1h2
+4dho
+d3hu
+1di
+di2a
+di3ar
+dia3s
+diat4
+di4ath
+dib4
+3dic
+di1ce
+di3chl
+dicht6er
+4d3i2co
+d2ida
+2d1ide
+2didy
+di2e
+di3e4d
+di3enb
+di3end
+die4neb
+diener6l
+di3e2ni
+dienst5r
+dien3z
+di3ers.
+dies3c
+di3e2th
+3dif
+3dig
+dige4s
+dig4n
+dik2a
+dil2s1
+2d1imb
+2dimp
+din4a
+2d1ind
+di3n2e
+2d1inf
+3ding
+2d1inh
+2d1in1it
+2d1inj
+2d1ins
+2d3int
+2d1inv
+di2o3b
+dio4n3i
+dion5s2
+di3ora
+dio5s2
+di2osk
+di1p4
+di3pt
+d1i2ra
+di4re.
+di2ren
+di2rin
+di2ris
+2d1irl
+2d1irr
+di4s1a2
+2diso
+di2sp
+di3s4per
+2d1isr
+dist2
+distel3
+di2s1to
+di4s3tra
+di4sz
+di2ta
+dite1c
+di4t3erl
+di4t3erm
+di4t3ers
+di2tin
+di2tob
+di2t3r
+dit3s
+di2t1u
+di5v2
+diz2
+2d1j
+2d1k4
+4d1l2
+dlap4
+d3le
+dle2ra
+dli4f
+dl3m
+dl3s
+2d3m2
+4d3n2
+d5ne
+dni2
+dnis1
+dni3v
+do5a
+d1ob
+3d2oba
+dob4l
+do1chi
+d1of
+do2fe
+2d1oh
+doll2
+d3o2ly
+do2mal
+do2mar
+domen1
+do4ming
+do2mu
+don2a
+do5nan
+doni1
+2dope
+2d1opf
+do1r4a
+2d1orc
+2d1ord
+dor2f1a
+dor2fä
+dor2f1i
+dor2fl
+dor2fo
+dor2fr
+dor2f3u
+2d1org
+dori1
+d2orn
+2dort
+dor4ter
+dor2tr
+d2os.
+dose4
+do5s2k
+2dosm
+do2st1
+dost3a
+do3ta
+do2t3o
+do2tre
+do3un
+dow2s
+dox2
+d1ö
+dö2d
+dö2f
+4dö4l3
+dölla3
+d2ön
+3d2ör
+dö2s1c
+2d3p2
+dpass3
+dpo4st
+2d1q
+d2r4
+3d4ra.
+3d4rab
+2d3rad
+2drahm
+2d3rak
+3d4ral
+d3ramp
+d3rand
+dran3k
+dra4s3s
+2d3rast
+2draub
+2d3rauc
+d4rauf
+2draum
+2draup
+2dräd
+d4räh
+2d3rät
+2d3räu
+4dre.
+2d3rea
+d4rea.
+d4reas
+3d4reck
+2d3ref
+2dreg
+3d4reh
+dre2ha
+2d3reic
+3d4reie
+d4reiv
+d4rej
+2drek
+dreli1
+4drem
+4d3ren
+4d3rep
+4d3rer
+4dres.
+d4resc
+2drese
+dres6sei
+d4rew
+2d3rez
+2d3rh
+d3ri
+3d4ri.
+3d4ria
+d4rib
+2d5ric
+d4rid
+d4rie
+d5rieg
+3drif
+4driff
+d4rift
+d4rik
+d4ril
+d4rin.
+2d5rind
+2drip
+3d4risc
+2drisi
+2driss
+2driß
+3d4rit
+4dritu
+2d3rob
+d3roc
+d3rod
+d4rog
+2drohr
+3d4rohu
+d4roi
+2d3roll
+2d3rose
+d4ross
+2d3rost
+2d3rot
+2d3rou
+2d3rov
+d3row
+drö2sc
+d5rub
+3d4ruc
+2d3rud
+2d3ruh
+4d5rut
+drü1b
+3d4rüs
+2d1s
+ds3ab
+d2s1alk
+d4s1amt
+d2san
+ds3ane
+ds3assi
+dsau2
+d2saut
+ds1än
+ds2äu
+4dsb
+d4schef
+d4schin
+dsch4r
+d3s2co
+d2scr
+d2s1e2b
+dse2e
+d2s1ef
+ds1eh
+d4sehe
+ds4eign
+d2sein
+d2s1emb
+dsen3er
+d2s1eng
+d2s1ent
+d2s1erf
+d2serh
+d2s1erk
+ds1err
+d2s1ers
+d2s1ert
+d2serz
+dse2t
+d2s1eta
+d2s1ev
+d2sex
+d3sha2
+ds2hak
+d4shal
+d3sho
+d4shor
+d2sid
+d2s1im
+d3s2inf
+d3s2kal
+d3s2kel
+4dsl
+d4sli
+d3soh
+d2sop
+dso2r
+ds1ori
+d2sö
+ds3part
+ds1pa4s3
+d2s1pat
+d2spä
+d2s1pec
+ds2pen
+d4speri
+d2s3ph
+d3s2pi
+ds2por
+d6sporto
+d3spri
+d2spro
+ds2pu
+dss2
+dst2
+d4stabe
+d2stas
+ds3tauf
+d4s3täti
+d4stea
+d4stele
+ds2til
+d2s1tis
+d4stoch
+d2stod
+dstras4
+d4stren
+d3s2tro
+ds1ums
+d2sun
+ds2zen
+2d1t
+dta2be
+d3t2ac
+dtach3
+dta2d
+d3t2ag
+dtam3m
+dta2n
+d3t2as
+d3tea
+d2th
+d4thei
+dt3hi
+dt3ho
+dt4hy
+d3to2
+d4to4b
+dt2op
+d3tö
+dt3r
+dtran2
+dt1s2
+dt3sa
+dt5st
+dtt4
+dt2un
+d3t2ur
+d3ty
+1du
+du1alv
+du1ar
+dub3l
+du2bli
+du1ce
+du2f
+2d1ufe
+duf4ter
+duf2to
+duf2tr
+2d1uh
+du1i
+du2kr
+du4l3art
+dult4
+2d1umb
+2dumd
+2d1u2m1e
+2dumf
+2dumg
+4d3umk
+2duml
+d2ump
+2dumr
+2d1ums
+d2ums.
+2d1umv
+du2n
+2d3un3d
+dund2a
+dun4de
+2d1unf
+2d1ungl
+2d1uni
+dun3ke
+dun2kl
+2dunr
+2dunsi
+dun4st3r
+2dunt
+2dunw
+2d3unz
+du1os
+dur2c
+durch3
+2d1urk
+2d1url
+2d1urn
+2d1ursa
+2d1urt
+du4schn
+du4schr
+du4sch3w
+dus2t
+2düb
+d3über
+2d1v2
+4d1w
+dwa2
+dwa4r
+dwe2s
+dwest1
+1d2y
+4dyl
+3dyn
+dys1
+dy2sp
+4d3z2
+2e1a
+e3ab
+ea2be
+e4abi
+ea2b3l
+ea4bo
+ea4br
+eadli4
+ea2dr
+ea2g
+ea3ga2
+ea3g4l
+eakt2
+e2akta
+e3akto
+ea2la
+e3alei
+e4alem
+ea4l3ent
+ealer2
+e3a4lerg
+e3alex
+e3a2lin
+eal5le
+eal3lö
+eallö3s
+e2alo
+e2alti2
+eal3tr
+ea2l3u2
+eam3
+e2am4e
+eam1o
+eams2
+eamt2
+ea4na
+ean3a2r
+e3anf
+e2ano
+e3ar.
+ea2ra
+e2are
+e4are.
+ea2r1ei
+ea4rene
+e4arer
+e4ares
+ea2ro
+e3arz
+e3a4sc
+easin4
+ea2sp
+eas5s
+eate2
+eater1
+e3ath
+eat3s
+e3at3t4
+eatu3
+e3aue
+e3auf
+eau2fe
+e4aufo
+eau3g
+eau3n
+eaus3s
+e2av
+e3ä4
+e1b
+2eba
+e3bak
+eba2p
+e3bän
+2ebea
+2ebec
+2ebed
+ebe1er
+2ebeg
+eb2el
+ebe4ler
+ebe2lo
+ebenen3
+2e3ber
+ebe4ras
+ebert4
+4ebes
+ebese2
+ebe4s3eh
+2ebet
+ebet4s
+2ebew
+2ebh
+2ebi
+2ebl
+eb2laß
+e3blä
+eb3ler
+eb4leu
+e3blie
+eb3lo
+eb2lö
+2ebo
+e2bob
+ebö2s
+2ebr
+eb4rea
+2eb2s
+eb6sche
+ebse2
+ebs3in
+ebs1o
+ebs1p
+ebs3pa
+ebs3tau
+eb4stät
+ebst4h
+ebs1ti
+eb4stot
+eb3str
+eb4sz
+2ebu
+e2bunt
+ebus3s
+ebu2t1
+2eca
+2e1ce
+ech1am
+ech1ä
+2e1che
+ech1ei
+ech2en1
+e6ch5erzi
+e1chi
+ech3l
+ech3m
+ech3n
+e2cho.
+ech1ob
+ech3ö2
+ech3r
+ech4ri
+ech3ser
+echst5re
+ech3t4ei
+ech6terh
+echter8ha
+e1chu
+ech1w
+e1ci
+eci4a
+ec4k
+ecke4n1
+eck3ser
+eck4sta
+2eckt
+3eckty
+2e1cl
+2eco
+2ect
+e1d
+ed2a
+ed2dr
+ed2e
+ede2al
+ede3n4er
+eden4s3e
+eden4s3p
+edeo2
+ede2r
+eder3a
+ede4ran
+ederer4
+edert2
+ed2i
+e3di.
+edi3an
+2edip
+edma3
+edmas2
+e3d2o
+ed2ö
+e3drei
+ed4seh
+ed2s1es
+ed2si
+ed2s1o
+ed2s1p
+ed2s1tr
+ed2s1u
+edu2s
+e3dy
+edys2
+2ee
+ee3a2
+eeb2l
+ee1c
+ee2ce
+ee2cho
+e1eck
+e2ed
+eed3s2
+ee3e2
+e1eff
+eef4l
+eeg4
+e1ei
+ee3ing
+eein4se
+eei5se
+eeis3s
+eel2e
+e3e2lek
+eele4n
+eel2ö
+e2e3m2a
+eemas3s
+ee3mä
+e1emb
+e1emp
+e1en
+eena2g
+e2e3nä
+e2enc
+e2e3ne
+een1er
+e2eno
+een3s
+een2z
+ee3o
+e2ep
+ee3po
+eer3as
+e1erbt
+e1erd
+ee3re
+eer1ei
+ee4r3en4g
+eer2e4s1
+eer3k
+ee1ro
+ee1rö
+eer2ös
+eers2
+eerst4
+eert2
+ee3r2un
+e1erz
+e2es
+ee3sh
+ee3sp
+ees2t
+e2et.
+eet2a
+ee2tat
+ee2th
+eet2i
+eet4r
+ee2tu
+ee1u2
+e2ew
+eewa4r
+eeweis4
+e1e2x
+e1f
+e2f1ad
+ef1ana
+ef1ar
+e2farc
+e2fat
+2efä
+efäs4
+efä5sse
+e2fäu
+2efe
+e2f1e2b
+e3fef
+efe4l3ei
+ef1em
+e2femi
+efe2n1
+3e2f1ene
+e2fent
+efer5f
+efer5r
+efeuil4
+ef2fä2
+3effek
+1effi
+ef2fl
+2efi
+ef1id
+e2f1ins
+efi2s
+2efl
+ef4le
+e3f4lu
+e3flü
+2e3f2o
+2efr
+ef4reih
+ef3rol
+ef3rom
+ef4ru
+ef4rü
+efs2
+ef3sc
+ef3so
+ef3sp
+ef2tan
+ef2tei
+2efu
+e2fum
+2efü
+e1g
+eg1a2m
+eg2anz
+egd4
+e3ge
+ege4l3au
+ege8l7ei8er
+ege4ler
+ege2lo
+eg2en
+ege4n1a2
+ege6nero
+ege2ra
+ege4s3to
+ege4s3tr
+ege1u
+2egi
+2egl
+e2glo
+e2glu
+e2gn
+eg3nä
+eg3ni
+ego1p
+egro5sse
+eg4rö
+eg4run
+eg4sal
+eg4s3an
+eg3sau
+egsau3g
+eg3se
+eg4sei
+egs2e3l
+egs2pe
+egst2
+eg2th
+2e1ha
+eh1ach
+e3h2ah
+eh2al
+ehalt4s
+e3hand
+eh1arm
+e2harz
+e3haut
+e1hä
+ehäs3
+e1he
+eh1eff
+eh1ein
+e3helf
+eh1elt
+e4hense
+e4h3ente
+ehen4tr
+1e2hep
+2eher
+ehe1ra
+e2h1erf
+e2h1er2l
+2e1hi
+eh3im
+ehis4
+ehl1a
+eh1lam
+eh2l3au
+eh1lä
+ehl3ein
+eh4lent
+eh5l2er
+ehlo2
+ehl1or
+ehl2se
+2ehm
+eh2mab
+eh4mant
+eh3mu
+2ehn
+eh3na
+eh3no
+2e1ho
+eho2f
+eho2l
+eh3oly
+ehö4rer
+eh2r1a4
+ehr1ä
+ehr1ec
+eh2rei
+eh2rel
+ehr6erle
+ehr4ern
+ehre3s
+eh4rin
+ehr1ob
+eh1roc
+ehr1of
+eh1rö
+eh2s2
+eh3sa
+eh3se
+eh3sh
+eh3si
+eh3so
+eh3sp
+ehst2
+eh3sta
+eh3sto
+eh3str
+2eht2
+eh3ta3
+eht4r
+2e1hu
+eh1unf
+e2huni
+e3hur
+e1hü
+eh3üb
+eh1w
+e1hy
+2ei3a4
+ei2bar
+ei2bli
+ei4blu
+eibu2t
+ei4b3ute
+ei1ce
+ei2cho
+e2id
+ei2d1a
+ei3de
+eid4ein
+ei4deis
+eid5erre
+2eidn
+ei3do
+ei4ds
+ei1e
+eie2b
+ei3e2l
+eie2m
+4ei3e2n
+eienge4
+eie4s
+eie2t
+4eif.
+ei1flo
+1eifr
+2eig.
+2eiga
+eig2ar
+2eigä
+2eigeb
+2eigeh
+4eigeno
+5eigensc
+2eig2er
+2eiges
+2eigew
+2eigi
+ei3gl
+ei4glo
+1ei2g3n
+ei4g3rat
+2eigre
+2eigrö
+2eigru
+2eigrü
+2eigs
+2eigt
+2eigu
+4eih
+ei2hum
+ei2kak
+eik4am
+eik2ar
+eik2i
+eik2l
+ei3k4la
+ei3klä
+e2il
+2eil.
+ei2lam
+eila2n
+eil3ane
+ei4lant
+ei4l3anz
+ei2lar
+2eilb
+eil3d4
+ei4lein
+eile2n1
+ei2let
+eil3f4
+eilm2
+ei2lob
+eil2ö
+2eim.
+ei2mab
+ei2m1a2g
+eim3all
+eim3alp
+ei2m1or
+2eimp
+eim2p4l
+eim3sa
+ei2mur
+e4i2n1a
+ei4nac
+eina2d
+ei4n3an
+ei4na4s
+ei4n3at
+ei2n3ä
+ein6derk
+ein3ebe
+ei2nel
+ei4n3en4g
+ei6nen6se
+ein5erbe
+ei4nerf
+ei4nerk
+einer6sc
+ei2neu
+ein4fiz
+5einflus
+5einfluß
+2einfo
+ein4fo.
+ein4fos
+ein3g2
+3einger
+e4ingr
+e2inhä
+ei2n3ie
+e1init
+ein3k4
+ein6karn
+3einkä
+e2inl
+ein3n2
+ein4nen
+ei2n1o4
+1einri
+e4insa
+einsas6s
+einsa7sse
+3einsat
+e2insc
+5einschä
+ein6stal
+ein6terv
+3eintö
+3einträ
+1einu
+ei3o2
+ei1p
+eip2f
+2eir
+eir2c
+ei3re
+e1irr
+e4is.
+ei2sa
+ei3sas
+ei6schwu
+ei4serg
+ei4s3erl
+ei6s5erst
+ei4s3erw
+1eisho
+ei3s2ky
+eis2pe
+e2i3s2s
+eisser6s
+ei2str
+eistra6s
+ei2sum
+ei2sur
+1eiswo
+e2it
+ei2t1a2b
+ei2tal
+ei2tan
+ei2tap
+ei2tar
+ei4tat
+2eitä
+ei2tän
+ei3tei
+eite4ra
+ei2t3h
+ei2tin
+ei2tor
+ei4trau
+ei2tro
+eit4sag
+eit3t4
+ei2t1um
+ei2t1ur
+eit3z2
+eiv2
+eive4
+ei2zar
+ei2z1in
+2e3j
+e1k
+e3k2a
+2ekä
+1ekd
+ek2e
+e3ke.
+e3ke4n
+e3kes
+e3key
+e3k2l
+ek4n
+e3k2o
+ekor4da
+e3kr
+ek4s1p
+2ekt
+ek5t6ante
+ek2t3at
+ek2tä
+ek2te2l
+ekt3erf
+ekt3erk
+ek4t3er4z
+ekt2o
+ek2t3o4b
+2e3ku
+ekur2a
+e3k2w
+1ekz
+e1la
+ela2br
+el2abt
+el3abu
+el3ader
+el1af
+2elai
+e2l1ak
+el1a2m
+el2a3mi
+e3lamp
+el1ana
+e4landa
+e2l3a2ne
+e2lanm
+e4lans
+e2l1ant
+e4lanw
+e2l1anz
+2elao
+e2l1ap
+e2l1ar
+ela2re
+el3a2ri
+el3arr
+el1a4si
+el1asp
+2elat
+el3aufw
+2e1lä
+e3läd
+2eld
+el4d3erf
+eld3erl
+elder4p
+elder4s
+eld5erst
+el3des
+el3dri
+eld3s2
+4ele.
+e3lea
+elea2r
+el3echt
+4eleh
+el3ehe.
+2elei
+e6l5ei6ern
+e2l1ein
+e3leine
+1elek
+e2l1el
+1e2lem
+2e3lem.
+e3lema
+ele2mi
+2el1emp
+2e3len.
+elen1e
+elen4k3l
+e4lense
+e2l1ent
+e3lep
+2eler
+e3ler.
+eler2a
+el1erd
+e6lereig
+el1erf
+e4ler4fa
+e4lerfi
+e2lerg
+el1erh
+el1erk
+e2l1erl
+e4l3ernä
+eler2ö
+e2l1err
+el1eru
+el1erw
+eles2
+e2l1ess
+e2l1e2ta
+ele2ti
+elet4ta
+el1evo
+el1ex
+e3lex.
+1elf.
+elf2er
+1elfm
+1elft
+elgi5er.
+elgi5ers
+el3g2l
+eli4are
+e2l1id
+2e3lie
+eli3ef.
+2elig
+e2lim
+elin3a
+eli3no
+el1ita
+2elk
+elks2
+elk3sc
+ella3d
+el2lap
+el4larb
+el4lart
+ella2s
+ell2ei
+ell3ein
+el4lel
+ellenen5
+ell2er
+el3lie
+el2lil
+1ellip
+el2lo2g
+el2lor
+el2lot
+ell2ö
+ell3sp
+el2lu2m
+el2lü
+elm2a
+elm2e
+elm3ein
+2eln
+2elo
+e2l3oa
+el1obe
+e2lof
+e2lol
+e2lonk
+e2l1or
+e3lore
+elo2ri
+e3lot
+e3l2ov
+2elö
+el3p4
+el4s5ein
+el2sum
+el4tans
+el3te.
+elte4m
+el5ten.
+el4t3ent
+elter4b
+elter4f
+elter6le
+3elter4n
+elter6sc
+el3the
+elt3se
+2e1lu
+el1uf
+e2l1um
+el1ur
+el3use
+elu2t
+el3uto
+e1lü
+2ely
+e2lya
+el3z2ac
+el2zar
+el4zene
+el2zwa
+2elzy
+e1m
+e2m3a2b
+em1alk
+e2manf
+e2m1ano
+e2m1ans
+em1app
+e4m1a2sp
+emas2s
+ema3sse
+e3maß
+2emä
+em2äh
+emb6
+1emba
+1embo
+3embry
+em2dä
+emd1r
+em2dra
+2eme
+e2m1e2b
+e2mef
+e2mele
+e3m2en
+emen6gel
+emen3ta
+emen4t3h
+e2m1erl
+em1erw
+e4mesu
+3e2meti
+e2m1i2d
+2emie
+emi2ei
+e2mig
+emi3k2
+em1im
+2emin
+emi3n2a
+e3mind
+em1int
+1e2mir
+e3misc
+1emiss
+em2map
+emma3u
+em2mec
+e2moa
+e2mof
+e2mop
+emo3s
+1empf4
+em3pfl
+em3po
+empo5s
+em2sa
+em4scha
+em2sim
+em2spr
+em3t4
+1e2mul
+e3mur
+e3mus
+2emü
+emü3s2
+e2na
+4ena.
+e4n3a2b
+4enac
+e4n3ack
+2e3nad
+enadi4
+e4naf
+4enah
+en3ak
+en1al
+e4nalb
+e3nale
+en2alg
+ena3l2i
+e4nalk
+e4nalm
+e4nalo
+enal3p
+4en1am
+ena4n
+e4nand
+en3ane
+e4nant
+e4nanz
+e4n3a2p
+en3a2re
+en3ark
+en3aro
+en1a2s
+ena4sc
+e4na4st
+2enat
+4e5nati
+e4natl
+enat2s
+e4n3att
+4enatu
+e4nau2f
+en3aug
+e4n3aur
+e4naut
+en1a2x
+en3a2z
+e2n1ä
+e4när
+enbu4s3
+en2ce.
+1ency
+end2ac
+en2dal
+en4dang
+2endel
+ende4lä
+endermas8
+en4d3es4s
+en2dex
+en3d4ort
+end3rom
+end3s2l
+end3s2p
+end3sz
+en3d2um
+en3d2ü
+2ene.
+ene4ben
+en1ec
+e2neff
+en2eid
+e3neien
+e4neige
+4eneigu
+e4nein
+e4neis
+en1e4kl
+e2n1el
+ene4le
+2ene2m
+e2nemi
+2enen
+e4nense
+e4n1ent
+en4entr
+e2n1ep
+4e3ner.
+en2era
+e2n1erd
+e4n3erei
+e2nerf
+en4erfr
+1energ
+e2nerh
+e2nerk
+e2n1erl
+e4nermi
+e4n3ermo
+4enern
+e4n3erne
+ene2ro
+e2n1err
+en1ers
+4eners.
+e2n1ert
+en4ert.
+e2n1eru
+e2n1erw
+2enes
+e2n1e4sc
+e2n1ess
+en1eta
+e2neth
+en1eul
+e2n1ev
+e4ne2x
+en3f
+enf2a
+enf2u
+1engad
+1engag
+en3g2al
+enge3r4a
+en3g2i
+en3gn
+eng2o
+1engp
+eng4ra
+eng3s2
+2eni
+e3ni.
+e3nic
+e2nid
+4e3nie
+eni3er.
+eni3erp
+eni5ers.
+en3i2ko
+en3ill
+eni4m
+en1ima
+en1imi
+e2nin
+e3nio
+eni2ö
+e2nir
+e4n3iso
+e3nit2
+e3niv
+enk3aus
+enk3erg
+en4k3erk
+en3k2ü
+en2nef
+en2nel
+en4ner4f
+enn3erg
+en4n3erl
+enni6ger
+2enniv
+e2n3oa
+e2n1ob
+e3nobel
+enob4le
+eno2br
+e2n3oc
+e2nof
+en3ol
+eno2ma
+e2n1op
+e2n1o2r
+en2ora
+eno4ri
+4enorm
+eno4s
+en1ost
+4e3not
+eno2w
+2e1nö
+en1ö2d
+en3sabb
+en2san
+ensas4s
+ensa5sse
+en5sche
+en2seb
+1ensem
+en4sen3e
+ens3ere
+en2sid
+en3spo
+ens4por
+ens4tak
+enst5alt
+en4s3tät
+ens4tel
+en6stele
+en6s5test
+2ensto
+enst2ü
+ens3umf
+en2sun
+en3t2ag
+2entan
+en4tanm
+en4tanw
+ent4ark
+1entd
+en3t2el
+ente2n
+en4terb
+1entf
+2entfo
+2entfö
+1entga
+3entgeg
+en2thi
+1enthu
+1enthü
+en2tid
+1entla
+1entn
+en2t1os
+2entö
+en4t3rol
+1entsc
+1entso
+ent4sto
+1entw
+4entwet
+3entwic
+1entz
+en1u
+e2nuf
+e2num
+2enu2t
+e4nuto
+e1nü
+4enwü
+2e1ny2
+enz2äp
+1enzep
+enz3erg
+en4z3erk
+en4zerl
+en4z3erm
+enz5ersc
+enzlan4
+enzo2l
+e1ñ
+4eo
+e1o2b1
+eo3ben
+eo3bl
+eo3br
+eo1c
+eoch2
+eo3dr
+e1of
+eo3g2
+e1oh
+eo3la
+e3o2ly
+e1on.
+e1ond
+e1onf
+e1onh
+e1onl
+e1onp
+e1onr
+e1ons
+eo1o
+e1opf
+e1or
+e3or.
+eo1ra
+e3orb
+e3ord
+e3ors
+eort4
+e3orw
+eos2
+e3os.
+eo3se
+e1o4ste
+eot2e
+eo1ul
+e1ö4
+e1p
+2ep2a
+epa2g
+epas6ser
+2eper
+e3p2f4
+eph2
+1e2pid
+e2pig
+e2pik
+1e2pile
+e3pio
+1epis
+2epist
+1e2pit
+ep3le
+1e2poc
+eport4
+1e2pos.
+ep2pa
+ep2pei
+eppe3l
+ep2pin
+ep4p3l
+ep2pr
+2epr
+ep3sh
+ep2tal
+ept2an
+ep2tau
+e3pu
+epu2s
+2e3q
+er1a
+e3ra.
+e2rach
+e3rad.
+e3radi
+e2radj
+e2r3adm
+e4radmi
+e4r3adr
+eraf4a
+era2g
+e1rah
+e1rai
+er3aic
+e2rak
+e3rake
+e1rald
+eral4eb
+er3alke
+e2r3all
+er2an.
+era4na
+eran3d4
+e3rand.
+e4rangr
+e2ranh
+e2rano
+e1rap
+er3apf
+er3apr
+e2rar
+er3are
+e3rari
+er3arr
+e3ras.
+er3asc
+era4sie
+era2sp
+era4s3s
+e1rast
+era2ß
+era3te.
+e3rati
+er3att
+e1raub
+e1rauc
+er3aue
+erau2f
+er3aug
+e2ra2v
+e1raw
+e2r3ax
+e1raz
+e1rä
+er1äf
+er1äh
+er1ä2m
+er1äp
+e2r1ä4s
+er1ätz
+3erbarm
+erb2au
+erb2e
+erb2sp
+er1c
+er3chl
+erch2o
+erda3me
+1erdb
+er3de
+2erdec
+2erdel
+er4d3en4g
+erd3erw
+erdeu2
+1erdg
+er2dob
+2erdy
+4ere.
+er1eb
+ere4ben
+e3r2ech
+er3echs
+er1eck
+er1edi
+ere4dit
+er1eff
+er1e2h
+ere4i
+6e3rei.
+6e3reib
+er1eig
+4ereih
+e3reik
+e4r3eime
+e2rein
+er3eis.
+er5eisar
+er3eisb
+er3eisf
+er3eisr
+erei5str
+er1e2l
+e2rele
+ere3lev
+ereli1
+2e3rem
+e4r1ema
+er1emb
+e2remp
+e4remu
+2eren
+e3ren.
+e3rena
+eren1e
+e4rense
+e4rentn
+e4rents
+e3renz
+eren8z7en8d
+er1epe
+2erer.
+2ererb
+er3erf
+e4rerfo
+e2r1erh
+e2rerk
+erer4kl
+e2rerl
+4erern.
+e4rerne
+e2rer2o
+erer4ri
+er1ers
+4erers.
+e8rersche
+e2rert
+2ererv
+2ererw
+2eres
+er1ess
+eres3sk
+er1eß
+er1eta
+ere2th
+e4r1e2ti
+3er1eul
+ere4vid
+erf2e
+er3for
+erf4r
+4erfür
+er4g3are
+4ergebi
+3ergebn
+4ergebü
+4ergeha
+4ergehä
+erg5elst
+4ergeni
+3ergiee
+er2gop
+4ergrem
+erg1s2o
+ergs2p
+e4rh
+1erhab
+2erhai
+4erhals
+2erham
+2erhas
+3erhebu
+er3hei
+2erher
+er3hu
+2eri
+e2riat
+e3rib
+4e3ric
+e4r3ico
+e2r1id
+eri2de
+4e3rie
+eri3e2n1
+eri5ers.
+e3ri3k
+erik4l
+4e3rin.
+er1inb
+e2rind
+e2r1ini
+er1ink
+er1inl
+er1int
+e3rio
+4eris
+e2risr
+3eritr
+e3riv
+2erk.
+2erkaj
+er3ker
+1erklä
+2erkm
+2erkre
+erk3t4
+2erl.
+2erlag
+3erlaub
+3erlebn
+4erleh
+erm2
+er3mag
+er3me
+ermen4s
+er4m3ers
+er3mi
+er4n3alt
+er3ne
+er4nene
+er4nerf
+er4nerk
+3erneue
+ern1os
+2e1ro.
+e1roa
+er1ob
+ero2bl
+ero2br
+e2r1o2f
+e1rog
+e1roh
+4e1rok
+e1rol
+er3oly
+e1rom
+er3omb
+2e3ron
+er3onk
+e2roo
+er1op
+e4ro4r
+eror2a
+e1ros
+1erosi
+e3rosit
+e1rou
+e1row
+er1ox
+e1roz
+erö2d
+2eröh
+erö4l
+er1ö2s
+er3p
+er4rade
+er3rä
+2erren
+erri3er
+er3ror
+2errü
+er3s2a
+ers4ana
+ersch4
+erse4h3u
+ers2el
+er5s2i
+er3sk
+ersma3s4
+4ersted
+er6st5ers
+4erstil
+er3swi
+er3sz
+er2t1ab
+erta2d
+er3tat
+4erteig
+er4t3erf
+er4t3er4g
+er4ter4h
+er4terk
+er4ters
+er2tho
+4ertö
+4ertru
+ert3s2e
+ert1s2p
+2eru
+eruf4s
+e4r3uhr
+er1u2m1
+er1und
+e4rundu
+3erup
+er3use
+e2r3uz
+erü4b
+3erweck
+er4zerk
+er4z3ers
+e1s
+es3ab
+es2abb
+e4sabe
+e3sac
+esa2d
+e3saf
+e2sall
+es2an
+es4and
+es3anf
+es3ant
+esa2ra
+e3sarg
+e3sa1s2
+esa3ss
+es3ato
+esa2v
+es1ax
+esäs4
+es2äu
+2esb
+esbi5er.
+e3s2ce
+es2chi
+esch2l
+esch2n
+e4sco
+e3se.
+es1ebe
+e2s1ec
+es1ehr
+e2sein
+ese3in4s
+es2el
+ese4nal
+ese4neu
+e3senk
+esen3o
+esen3sk
+eser4at
+ese4r1u2
+eses2k
+es1eta
+es3e2x
+2esf
+2esh
+es3ha
+es4ham
+es4har
+es3he
+2esi
+esi3er.
+e2s1il
+e4s3ins
+e4siso
+es2kat
+e4s3ke
+e4skl
+e4sky
+e4s3l
+2e4sm
+e4sn
+es2oh
+es2opa
+eso2r
+eso3re
+es2ort
+e3s2ö
+e3spal
+e3s4pan
+es4park
+es2pek
+e2spel
+e4spers
+e4sph
+e3s2pi
+e3s2por
+e3spra
+e3s2pu
+2esr
+2ess.
+es4s1a2g
+essali3
+essau4s
+1essay
+2essä
+2essc
+e4ssel
+e4ssent
+ess4erf
+e4ss3erg
+es4serh
+2essk
+2esso
+es2sof
+2essp
+es2s1pa
+es2spu
+es4stab
+es4ste
+estab4b
+e4stabs
+esta5ge
+est1ak
+e3s2tan
+e4starb
+es2t1a4s
+e3stat
+es2tau
+e4staum
+es2te.
+este2c
+est5eing
+e6st5eink
+e6st5einl
+e4st3eng
+est5erha
+ester6ke
+e4ster4ö
+e4st3erz
+estes2
+e4st3ess
+e3sti
+e4stid
+e4stip
+estmo6de
+1estni
+es2t1ob
+e2stod
+est3ori
+e4strad
+e5strec
+e5strick
+es2tu
+est3ums
+e3s2tü
+e3s2ty
+e3suh
+es1um
+e2sums
+es1ur
+2e4sw
+e3sy
+e2ß1el
+e2ßent
+eße3re
+e2ß1erg
+e1t
+e3ta.
+etab4
+et2abl
+et2a2c
+2e3taf
+2etal
+etal4la4
+etal6li6n
+et1a2mi
+e3t4an.
+et1ant
+etari1
+et4at
+etat3r
+et1äh
+2etb
+2e3te
+ete2e
+e4t1ein
+ete3ke
+et2en
+eten3d2
+ete2o
+eter4hö
+eter4tr
+ete4sp
+2etg
+et2h
+2eth.
+e3tha
+e4t3hal
+et3hä
+1et4hi
+e2thik
+1ethn
+e4thot
+et3hü
+e2tid
+eti2m
+etin1
+e2tinh
+et1ini
+eti2ta
+eti2th
+e4tl
+2eto
+e2t1o2f
+et2on
+eto4n3al
+etons4
+e2torg
+2etr
+e4traum
+et3rec
+e2t3res
+et4ros
+ets2c
+etscher7e
+etsch3w
+et4sh
+et1so
+ets1p
+et1su
+ett1a
+et2ta2b
+et2tad
+et2tak
+etta2m
+ett2as
+et2tau
+et2tä
+et2tei
+ette4n1
+et4th
+et2tö4
+et2t3r
+et2t1um
+et2tur
+et2tü4
+3e2tui
+e3tur
+2e4tw
+etwa4r
+1etym
+e3typ
+2etz
+etze4s
+et2zw
+eu1a2
+eu3b4
+2euc
+euch4ta
+2eud
+eudi4e
+eu2eb
+euer3ei
+eue6reif
+eue6reis
+eueren4
+euerer6s
+euerer6t
+eu3eri
+eu3erk
+eu3err
+eue3s
+eu2e5sc
+4euf
+euf2a
+eu2fer
+eu2g1a
+eu6gense
+eu3g2er
+eu4g3ing
+eu2gre
+eu2gri
+eug1s2
+eu3h
+eu1id
+eu1in1
+1e4uk
+eu2kä
+eulan2
+euland3
+eu3l2e
+eul2i
+2e1um
+e3um.
+eu3ma
+euma3s2
+e3umb
+e3umf
+e3uml
+e3um2s
+eums1p
+eum3st
+e3umw
+2euna
+eun2e
+eu4nei
+e3un2g
+eu2nio
+eu4nis
+eunk2
+eun3ka
+eu1o2
+eu1p
+eup2f
+eu2ral
+eu4r1an
+eu4r3ast
+e2ure
+euren2
+eu4rens
+eur4er
+eur3f4
+1euro
+eu1s4
+e3usar
+eu4sis
+eus5k
+eu3sp
+eu3ss
+eust4
+eut2e
+eu5ted
+eut2h
+1eu3tha
+eu3t2o
+eut6scha
+eut6schn
+eut6schr
+2eux
+eu2za
+eu2zo
+eu2z1w
+e3ü
+e1v
+e2vak
+e3var
+eva2s3
+2ev2e
+eve5ri
+evie3le
+2evor
+ev2s
+e1w
+ewä4
+ewä6s
+e2we.
+ewei4sc
+ewert4
+e3wir
+ewi2s
+e3wit
+2ex.
+e2xam
+2exas
+ex3at
+2exc
+2exd
+e2xel
+e2xem
+ex1er
+2exes
+e1xi
+e3xie
+2exik
+e2xil
+e2x1in
+1exis
+ex3l
+3exp
+2exs
+2ext.
+2ex2ta
+ex2tin
+1extr
+2extu
+2extv
+2exu
+e2xum
+2e3xy
+ey2n
+ey3no
+eys2
+e1z
+e3z2a
+ez2ä
+e2z1enn
+e3zi
+ezi2s
+ez2o
+e3zoh
+ez2w
+é1b
+é1c
+é1g
+égi2
+é1h
+é1l
+élu2
+é1o
+é1p
+é1r
+é1s
+é1t2
+é1u2
+é1v
+é1z2
+è1c4
+è1m
+è1n
+è1r
+1ën
+ê1p
+1fa
+fab4
+2f1ab5b
+fa2ben
+2fabf
+2f1a2bl
+2fabn
+f2abr
+2f1ab5s
+fa4cheb
+fa4chel
+fa2ch3i
+fa2cho
+fachs2
+fach3sp
+fa2ci
+fa2del
+f1ader
+fa2di
+fa2dr
+fa3ec
+fah6l5ent
+fai3b4
+f1a2ka
+fa2ke
+f3aktio
+f2akto
+3f2aku
+fa3la
+fa3le
+fal2kl
+falla2
+fal4lei
+fal6lenk
+fall5ent
+fal6lerk
+faller6s
+fal2li4
+fal6scha
+fal6schl
+fal6schm
+fal3te
+fal2tr
+3fam
+4famp
+f1amt
+3f2an.
+fa2nar
+2fanb
+fand2a
+fan2gr
+2f1an3k
+2fanl
+4fann
+f1anp
+2fanr
+2fanw
+2f1an3z
+2f1a2p
+f2ar
+far2b1a
+far4bel
+far4b3er
+far4bin
+farb3l
+far2bo
+far2b3r
+far2b3u
+f3arc
+3fa5ri
+far2r1a
+farre2
+far4rec
+far4reg
+far2rh
+2f3art
+2f3arz
+3fas.
+fa3s4a
+fa3sh
+f1assi
+fas2t
+2f1a4str
+fa2ß
+f1aße
+f3at
+f4at.
+fa2to
+f4ats
+2f1auf
+f3aug
+fau2s
+f1ausb
+faust3r
+3f4av
+fa2xa
+1fä
+fä1c
+fäh4rin
+fäh2r1u
+f1älte
+2fäq
+2f1ärm
+2färz
+fä4s
+fä6s3ser4
+3fäßc
+fä2ßer
+2f1ätz
+2fäug
+2fäx
+4f1b2
+fbau1
+fber2
+2f1c
+f3ch
+2f3d4
+fdien4e
+1fe
+3fe.
+featu4
+f2ech
+fe2dr
+fe2e1i
+feein5
+fe1em
+2f1e2he
+feh4lei
+f2eie
+f2eind
+2f1eing
+fe3ins.
+2f1einw
+f1ei3s
+5fek
+fe2l1a
+fel3au
+fe2l1ä
+fel2da
+felde4m
+feld6erh
+fel2dr
+fel4d5ri
+2fe2lek
+2felem
+fe2l1er
+fe2les
+fel3la
+fel4lan
+fel2lä
+fe2l1o
+fel4s3oh
+6fel6tern
+felt4r
+fel3tu
+f2em.
+fem4m
+2f1emp
+fen1a
+fena2g
+fen3au
+4fenerg
+fe2ni
+fe2no
+fen3s2a
+fen5s2c
+fenst2
+fen6stri
+f1ent
+2f3entf
+f2enti
+4f3entla
+f2ento
+2f3entw
+2f3entz
+fe2nu
+3fep
+fe2pi
+f2er.
+fe1ra
+fe2rab
+fe2ral
+fe4rang
+fer4ant
+fe4ranz
+fe2rau
+fe2r1ä
+2ferd.
+fer3da
+ferd2e3
+f2ere
+fe2re2b
+fe2rec
+3ferei
+4f3ereig
+fe4r3eis
+f4erel
+fer3ell
+fe4rer4g
+fer4fah
+ferg4
+f4ergr
+ferie4n3
+4fer4leb
+f2ern.
+fer4nei
+fe2rö
+f4erpa
+f4erpf
+f4erpl
+f4erra
+fer4reg
+ferri2
+f2ers.
+f2ert
+fert4r
+f2erz
+fess2e
+fes2t
+fe2sta
+fest3a4b
+fest3an
+fe4st3ei
+fe4stin
+fe2st1o
+fe2st3r
+2f1e2ta
+3fete
+fet4t3a
+fetti3s
+2feu.
+feuer3ö
+3few
+2f1ex
+3fez
+1fé
+4f1f
+f3fa.
+f2fa2b
+ffa2ce
+ff1a2d
+f3fak
+f3fal
+ff1alt
+ff1ans
+ff3ar
+ff4arb
+ffa4s
+ff1au
+ffa2z
+f2f1e2b
+ffe2e
+f2f1ef
+f2f1ei
+ffe3in.
+ffe5inha
+ffel3l
+ffe2m
+f2f1emi
+ff2en
+ff3erle
+f2fetz
+fff4
+ffi3k
+f2fil
+f2fim
+ffi2xi
+ff1lag
+ff3li
+f3flu
+f3flü
+ffo2
+ff1ox
+f2fö
+ff1rak
+f3f4rä
+ff3ro
+ffs2am
+ff3sch
+ff2s1p
+ffs4tau
+ffs1ti
+ff3stü
+fft2
+ffus3s
+4f3g2
+fgeb2
+fge3s2
+4f3h2
+1fi
+3fi.
+fi2ar
+fi3at
+fiden2
+fi2do
+fi1er2f
+fi2k1as
+fi2kel
+fi2kin
+fi2kn
+fi2k1o4
+fi2k3r
+f2il
+fi2l3an
+fil3d
+fi2les
+fi3li
+fi4lin
+fil2ip
+fil2ma
+fil2mä
+fil4med
+fil4mei
+fi2lo
+2fimp
+3f2ina
+2f1inf
+fing2
+fing4e
+fings2
+fi3ni
+f2ink
+2f1int
+fi2o
+fi3ol
+fi2r
+fi3ra
+fi4re
+fir3me
+fi3s4a
+fi4sch3a
+fi6schei
+fisch3l
+fisch3o
+fi4schr
+fi4sch3w
+fi3s2h
+2f1i2so
+fis2p
+fite2
+fi2tin
+fit1o2
+fi2tor
+five4
+fi2xel
+2f1j
+3f2jo
+4f1k4
+fka4t3
+f2l2
+2fl.
+f3lad
+f5land
+f4lans
+f3lap
+f4lasc
+f3lats
+flauma4
+3f4läc
+4f3läd
+f3län
+f3läu
+fl4e
+f5le.
+2f3leb
+2f5lein
+flek3
+flekt2
+f3ler
+f4lex
+f3li.
+3f4lim
+fli4ne
+f3ling
+2flins
+2f5lon
+1f4lop
+f4lor
+flo7s8ses.
+1f4loß
+1f4lot
+flo2w
+f3lö
+4flöf
+1f4luc
+1f4lug
+flu4gen
+flu4ger
+1f4luss
+1fluß
+f4lut
+flut1o
+f4lü
+f5lüd
+f5lüm
+4f3m2
+fma5che
+fma2d
+fmas2s
+fma3sse
+2f3n2
+fni2s
+1fo
+f1ob
+fo2be
+2fober
+fob2l
+2f1o2f
+foli3
+fol2k3
+fo2na
+fo4nan
+fon3au
+fon3dr
+fo3n2er
+fo4nin
+fo2nop
+fons2
+fo2nu
+2f1op
+4f3org
+fo3rin
+for4m3a4g
+for4mas
+for4m3ei
+forni7er.
+for6schl
+for4sta
+for4sti
+for4t3ei
+for4ter
+for2th
+for2t3r
+fort3s2
+for3tu
+for2u
+fot4r
+fo2x
+1fö
+2fö2f
+2f1ök
+4f1ö4l
+4f3p4
+2f1q
+f2r2
+f3ra.
+frach6tr
+2f3rad
+2f3rah
+fra4m
+f3rand
+f5rap
+f3rat
+1frau.
+f3rauc
+2fräd
+1f4rän
+2fre.
+f3rec
+f3red
+2fref
+2freg
+f4rei.
+f3reic
+f4reie
+frei1f
+f4reig
+frei3k2
+2freim
+2frein
+2f3rek
+2f3rep
+2frest
+3f4reu
+2f3ric
+fricht6e
+fri3d
+fri2e
+2frig
+f4ri3k
+f3rip
+1fris
+f4risc
+f4rist
+fri6ster
+2f3roc
+2frol
+1f4ro2n
+fro4n1a
+f4rop
+fro2sc
+f3rot
+frös2
+f3ru
+f4ruc
+f3rü
+4f1s
+f2s1al
+f2sa2n
+fs3ane
+fs3ar
+f2s1a4s
+f2saut
+fs2än
+f2sca
+f4sce
+f4schan
+f4schef
+f4schro
+f2scr
+f2s1e2b
+f4sehr
+fse2n
+fs1en1e
+f2s1ent
+f2s1er
+fse2t
+f2s1eta
+f2s1i2d
+f3s2ky
+f2s1o2
+f3soh
+f3sol
+f3s2on
+fsp4
+f3spann
+f2s1pas
+f2sph
+fs2pie
+f3s2pl
+f3s2por
+f2spre
+f2spro
+fs2pul
+fs3s2
+fs2tal
+f2stas
+f3s2tat
+f4s3täti
+f2stip
+f2s1tis
+fst4r
+f4s3tres
+fs1trü
+fs1tut
+f4stüte
+fs1ums
+f2s1un
+f3sy
+4f1t
+f2ta.
+ft1a2be
+ft1abl
+ft1af
+f3t2ag
+ft1ala
+ft1an
+ft1a2r
+f3tat
+ft3att
+f2t1äu
+ft1eck
+ft1edi
+ft1eh
+fte2he
+ft1eig
+ft1ein
+ft1eis
+ft1eli
+ft1emi
+f2t1ent
+ft3erfü
+ft1erk
+f2t1erl
+f2t1erz
+f2t1e2ti
+f2t1ex
+f2t3h
+f4t5hei
+f3ti
+f4tid
+ft1in
+f4tinf
+f4tins
+fto2
+f2t1of
+ft3om
+f3tor.
+f2t3ot
+f3t4ran
+ft3ro
+ft3ruh
+fts1
+ft2sa
+ft4sa2g
+ft4sam
+fts2c
+ft2se2
+ft4seh
+ftsen1
+ft2s3i
+ft4stem
+ft4ster
+ft4stes
+ft3stie
+ft6stier
+ft3stri
+fttra4
+f2tum
+ft1urk
+ft1url
+ftwa4
+ft3z2
+ftze3d
+1fu
+3fuc
+3fug
+f2uh
+fuku3
+f1um
+fun6derg
+2f1unf
+2f1ungl
+2f1u2ni
+fun2kl
+fun2ko
+fun2k3r
+fun2ku
+2f1unm
+2funr
+2funt
+f2ur
+furch2
+fu4re.
+2f3url
+fus2
+fu3sse
+fus6sen
+fu4sser
+fuss1p
+fuss1t
+fus4ste
+fu2ß1er
+3fut
+1fü
+2füb
+fühl4sc
+fün2
+fü2r
+fü3s2
+2f1v
+4f1w
+f1ya
+4f1z
+fz2a
+fzeiten6
+fzei8t7end
+fz2ö
+fzu2ga
+fz2w
+3ga.
+2gabf
+2gabg
+g4abi
+ga2b5l
+gab2o
+g1abr
+gab4ri
+2gabsc
+2gabtr
+ga3bu
+2gabw
+2gabz
+gade2r
+ga3di
+gadi4e
+2gadl
+2ga2dr
+gae2
+ga1fl
+5gag.
+ga1k
+ga2ka
+ga2ku
+gal2a
+ga3laf
+ga2lar
+2g1alau
+2g1alg
+gall4e
+gal3lo
+2g1alp
+2g1alta
+2g1altd
+g1a2lu
+ga2mec
+ga3mel
+gam3ma
+5g4amo
+2g1amt
+g1ana
+2ganb
+gan3d2
+2ganf
+gan2g1a
+4gangeb
+gan2gr
+gang4sp
+gan2g1u
+2g1ank
+2ganl
+2ganmu
+3g2ano
+2ganr
+gans2
+2g1ansi
+2ganst
+2ganw
+ga1ny
+g1anz
+ga3pe
+2g1app
+ga1q
+3gar.
+g2ara
+2garc
+3g2ard
+ga3r2i
+2g1arm
+ga3r2o
+2g1arti
+ga3ru
+2g1arz
+ga2s
+g2as.
+gas3al
+ga4sam
+gase2
+ga5se.
+ga4sei
+ga4sel
+ga4se4m
+ga5ses
+ga4set
+gas5s2
+5g4asse.
+g4assen
+6gassess
+ga5ssest
+ga4st3el
+ga3sti
+ga4stin
+gastra4
+gastras5
+gas4t3rä
+ga3stri
+ga6strom
+gas1tu
+ga3t2a
+gat2h
+2gatm
+gat4r
+gau1c
+2g1auf
+2g3aug
+g2auk
+gau5ne
+2g1au4s
+2g1aut
+2g1äp
+gär3th
+2gärz
+gäs2
+gä4u
+2g3b4
+gbau5s
+gber2
+gbi2
+gbon2
+2g1c
+2gd
+g1da
+gd2ad
+gda3de
+g2dak
+g2dan
+g2dar
+g2dau
+g1dä1
+g2dei4
+gd2en
+g2d3ent
+g2der
+gd2es
+g1do
+g2dop
+gd2or
+g1dö
+g1d3r
+gd3s2
+gdt4
+1ge
+ge3a2
+geb2a
+ge3ble
+geb4lin
+gebot2
+3gebü
+ge1c
+ged4
+ge1e2
+ge3ec
+geest3
+3gefä
+4g1eff
+gef4l
+gef4r
+ge3fu
+gegen1
+ge3g2l
+ge3hei
+2g1eid
+ge4ie2
+2g1eif
+ge4ig
+g2eil
+gein1
+ge1ini
+ge1inn
+2g1einr
+gein5sti
+gein2v
+ge1ir
+ge2is4
+2g1eise
+gei3sh
+gei4sta
+2gek.
+gelb1r
+gel4b3ra
+gelb5s
+gelder4
+gel6derh
+gel6ders
+ge3lec
+2ge2lek
+2gelem
+ge4lene
+gel3ere
+ge4lerk
+geler3ö
+ge4l3ers
+ge2lev
+gel3f
+gel1i4m
+gel3l2a
+gel3le
+gell2i
+gel2ö
+gel3s2a
+gels2p
+gel3sz
+gel3ta
+gelt4r
+gel3z2
+gem2
+ge4ma.
+gem6e
+4g1emp
+gem3s
+ge3mu
+ge3na
+ge4n1ac
+ge4nak
+ge4n3al
+ge4nam
+ge4nar
+ge4nat
+gen4aug
+ge3nä
+ge4näu
+g2enc
+4genda.
+4g3endmo
+gen2dr
+gen3eid
+gener4f
+4generg
+ge4n3ern
+gen6erwe
+gener4z
+ge3nid
+ge2nim
+gen3k4
+genma7sse.
+gen3n
+gen3sk
+gen3sz
+gen3tä
+2gentf
+gen3t4h
+gen3tr
+2gentw
+ge2nun
+genzma3
+genzmas6
+geo2ri
+ge1ou
+g2e3p4
+ge1ra
+ge2ra2b
+ge2r3al
+ge3rann
+ge4rant
+ge4r3a2r
+2gerdg
+ge4rene
+ge4reng
+ge4ren4s
+ge4r3ent
+ger2er
+gerin4f
+ger4inn
+gerin4t
+4ger4klä
+g3erlas
+germas6s
+ger5me
+ger3no
+2g1ernt
+ge1ro
+ge2rob
+ge2rop
+ge1r2ö
+ger4sat
+4ger4seh
+ge3r2u
+g1erzä
+g6es.
+3ges2c
+ge6sche.
+ge2seb
+4g3e4sel.
+ge4s3elt
+ge2s1er
+ge3sha
+ge3s2i
+ges2p
+ges4pi
+gess2t
+gest2
+gest4a
+gest6e
+ge4s3tur
+get2a
+g1etap
+get3s
+ge3t4u
+2g1e1ul
+ge3u2t
+ge3wa
+4g1e2x
+2g3f4
+gfi4l
+2g1g
+gga2t
+g5ge
+gge2ne
+gg2l
+g3gla
+g3glo
+g2g3n
+gg4r
+2g1h
+4gh.
+gh2a
+3ghale
+gh2e
+3g2het
+3g2hie
+gh1l
+3gh2r
+ghs2
+g2hu
+gh1w
+gia2s
+gich2
+gicht1
+gi2eb
+gie3g
+gi2e1i
+gi2e3l
+giel2a
+gie3n
+gien2e
+gi4eno
+gie3re
+gies4
+giet2
+gif2tr
+gift5s
+gi2gu
+gi2kel
+2g1ill
+3gime
+gi2me.
+gi4mes
+gi2met
+2gimp
+2gind
+gi3ne
+2g1inf
+gin2ga
+2ginh
+2g1ins
+2g1int
+2ginv
+gi2ob
+2giok
+2g3isel
+git2a
+gi4us
+2g1j
+4g3k4
+gl2
+4gl.
+4g1lab
+2g1lac
+2gladu
+2g1lag
+2g1lam
+2gland
+3glanz1
+gla2s1c
+glast4
+gla4str
+gla4stu
+3g2laub
+2g1lauf
+g1läd
+g1läß
+2gläuf
+gl3b
+g2l4e
+2gle.
+3glea
+2g3leb
+g3lec
+4g3led
+g3lee
+2g3leg
+2gleh
+g4leic
+4g3lein
+gleiter8s
+glei4t5r
+g3len
+4glenk
+4g3ler
+glerei4
+2gles
+3gles.
+g3lese
+g3lev
+g2lia
+2glib
+3g2lid
+g2lie
+2g3lieb
+2glif
+g2lik
+4glil
+g2lim
+4glin
+g2lio
+2glis
+3g2lit
+g3lite
+g2liz
+g3lize
+g2loa
+g2lob
+g2loc
+2g3loch
+g2lok
+g2lom
+g2lop
+g2lor
+2glos
+g2lot
+2glöch
+2glös
+2glöw
+2gls
+g1lu
+2g3luf
+2gluk
+4g3lun
+g2lut
+3glü
+g1lüg
+2glw
+3g2ly
+2g1m2
+g1n
+2gn.
+g2n2a
+g4na.
+2gnac
+2g5nah
+gn4al
+gna4l3er
+2gnanl
+3g2nä
+2gnb
+2gnc
+2gnd
+gn2e
+g3neh
+2gn3ent
+gne2tr
+2gnf
+2gng
+2gnh
+g2nie
+g2nif
+g4nin
+2gnint
+2gni2s3
+gnise2
+2gnk
+2gnl
+2gnm
+g2no1
+g4non
+g3not
+2gnp
+2gnr
+2gns
+2gnt
+2gnu
+3g2num.
+g2nü
+2gnv
+2gnw
+g2ny
+2gnz
+go4a
+goa3li
+g1ob
+go3be
+2gobj
+gob2l
+go4c
+2g1o2f
+2gog
+2g1oh2
+goh3ren
+go1i2
+go3in
+gol2a
+gol2fr
+3gon.
+gon2e
+3gons
+goo2
+2gope
+gopf4
+go2pos
+2gopt
+gor2a
+2gord
+2g1org
+go2si
+go2sp
+gost2
+2g1osz
+go3t2h
+got6terb
+got6t5erg
+3gou
+go1y
+gö2f
+g1ö4l
+3göt
+2g3p4
+2g1q
+g2r4
+g4rab
+gra2ba
+gra2bi
+gra4bl
+2g3radl
+2g3rah
+2g3rak
+gram1
+gram8m7en8d
+gram6mer
+g3rand.
+2gra2r
+grar1e
+gra4s3a
+gra4sh
+gra4sp
+gra4str
+2g3raub
+grau3f
+2graum
+grau3sk
+2gräd
+gräs5c
+g3räu
+2g5re.
+g4reb
+2g3rec
+g3rede
+g4re2e
+2g3ref
+2grege
+2g3reic
+grei4fr
+2g3reih
+g3rein
+g3reit
+g3rek
+g4rem
+2g3renn
+gre3no
+gren6z5ei
+grenz3w
+g4rer
+gres6ser6
+g3ret
+g3rev
+2g3ric
+gri2e
+2g3riem
+g3riese
+g4rif
+2grig
+gril4la
+4g3ring
+4g3rinn
+g4rip
+gro2ba
+gro3ber
+gro2bl
+gro2b3r
+2groc
+2groh
+2g3rol
+gron4
+gros2
+2g3rose
+g4ross
+gro5sse.
+gro7ssen.
+gro7sser.
+gro7sses.
+2g3rost
+g4roß
+g4rot
+2gröh
+2gruf.
+g4ruft
+2g3ruh
+g3rui
+2g3rum
+grun2g
+3g4rup
+3grus
+grus2s
+gru3sse
+3gruß
+2g3rut
+2g3rüc
+g4rün
+grüs2
+4gs
+g2sa
+g4s3ab
+gs3ach
+g3sack
+g4sa2d
+g4s3a2k
+g3s1al
+g4salb
+g4sall
+g4salm
+g4salt
+g4sama
+gs1amb
+g4samp
+gs3ane
+g4sant
+gsa4p
+gs3a2r
+gs1as
+g3sat
+gs3ato
+gsau2g
+g3sau4r
+gsa2v
+gs1ä
+g3sch4
+g4schef
+gs2chi
+gs3d
+g2s1e2
+gs2e3h
+g3s2eil
+g3s2eis
+gse4kl
+g3sel.
+g4s3ela
+g3seln
+gs3em
+gsen1
+gs2enk
+g4sent
+g4ser
+g3sere
+gs3er1i
+g4se4s
+g4seu
+gsfi4l
+gsh4
+gs3ha
+g2s1i
+gsi2d
+g3sig
+gs3i2k
+g3sil
+gs3in
+g4sis
+g4sita
+gs2ki1e
+gsmas8sen
+gs1o2
+gso4b
+g3son
+g2s3op
+g5s4orge
+g5soz
+gs1p4
+gs2pac
+gs4pant
+g3s2pek
+g3s2pi
+g5spie
+gs3pl
+g3spor
+gs6port.
+g6sporto
+g4s3pru
+gs3s2
+g2s1tab
+g2s1tät
+gs2te.
+gs4tem.
+g4stemp
+gs4ten.
+gste2r
+gs4ter.
+gs4tere
+g6sterei
+g4sterm
+gst3err
+gs4tes.
+g4stest
+gs2thy
+g3s2ti
+gs3tie
+gs3tis
+gs1tot
+gst4ra
+g3stras
+gst5reit
+gst4res
+g4s3treu
+gst3rit
+gst3ros
+g2stru
+gs1trü
+gs1tur
+gs1u
+gsü3s
+g3sy
+4g1t
+g3te
+gt3h
+gt4hy
+gt2i
+gti2m
+g3to
+gt4r
+1gu
+gu4ale
+gu3am
+gu1an.
+gu1ant
+gu1as
+gu4d3r
+gu2e
+2gued
+guet2
+2g1u2f
+2g1uh
+guil3
+gu1ins
+gu1i4s
+gum2e
+3gumm
+gummi1
+gun2e
+2g1unf
+g2ung.
+gunge2
+4gungew
+2g1ungl
+2g1u2ni
+2g3unk
+2gunr
+2gunt
+3gur
+gure4
+4g1url
+gur2th
+gur2tr
+gurt3s
+gu2s3a
+gu2sä
+guschi5
+gus3se.
+gus3ses
+guss1o
+gus2sp
+gus4st
+gust3a4b
+gu4stap
+gu6stein
+gust3en
+gu3sti
+gu2str
+gu2ß1
+gußt4
+gu2t
+gut1a
+gu3te
+gu4t3er4h
+gut3h
+gut4sa
+gut2s3p
+2güb
+3gür3
+gü3st
+2g3v
+2g1w
+gy3n
+gyp2a
+2g3z2
+gzeu4gi
+hab2a
+hab2e
+hab2i
+2habn
+h1a2br
+h1abs
+2habw
+ha4ch3en
+ha2cho
+ha2del
+hade2n
+h1adle
+hado2
+h1a2dr
+2hae
+ha4far
+haf2e
+h1affä
+haf3f4l
+h2aft
+haf2tr
+haft2s
+hafts3p
+h2agg
+h1ah
+h2ahs
+h2ai
+3hai.
+h2aj
+2haka
+ha1k4l
+2h2al.
+halan4c
+h1a2lar
+ha2lau
+hal2ba
+hal4bel
+hal4bin
+hal2b3r
+hal2bu
+2hale
+2halk
+hal4lei
+hal6lere
+hal6lerf
+hal6lerg
+hal4leu
+hal4lo4k
+ha3lo
+4halp
+hal2sp
+hal4tal
+hal4tei
+hal2t5r
+h2ame
+2h1amt
+ham3te
+h2an.
+2hana
+ha2nal
+ha2nan
+2hanb
+h2anbe
+h2and
+han2da
+han2d3r
+ha2nem
+han2f1
+han6g5end
+hang3s
+2hani
+han2kr
+2hanl
+2hano
+2hanr
+2hanz
+hao2s
+2h1ap
+3h2ape
+ha2pl
+ha2po
+ha2pr
+h2a3ra
+ha4rab
+2harb
+h2ard
+har2fr
+h1arm.
+har3ma
+h2arme
+har4me.
+har4ne
+ha2rom
+hart4e
+har2th
+h1arti
+har2tr
+har2za
+h2as
+4ha3sa
+has2c
+has4h3
+has4sa
+hasser4
+has6s1t
+ha4str
+ha2ß1
+h1aße
+ha2ta
+h3atl
+ha2t3r
+2hats
+hatt2
+h3attr
+h1audi
+h1aufb
+hau5f6lie
+hau3f4lo
+2h1aufm
+h1aufs
+h3au3g
+h1aukt
+hau2sa
+hau4san
+hau2sc
+h2ause
+hau4sel
+hau6s5ent
+hau4spa
+hau4spe
+hau4ss
+haus5sen6
+hau4s3ti
+hau4sto
+hau4sur
+h2aut.
+hau2ta
+4hauto
+hau2t3r
+ha2ve.
+3hax
+häde2
+h1äff
+hä2kl
+2härz
+hä4s
+hä5sc
+hä6s5chen
+2häug
+häu2s1c
+hä3usp
+2h1b4
+hba4ras
+hbe3r2e
+2h1c
+2h3d4
+hdan2
+4hea
+he3be
+heb3eis
+he2bl
+he3br
+he3bu
+he3ch2e
+he3chi
+he1cho
+h3echs
+hed2g
+he2dit
+he2el
+hee3le
+he1e4m
+hee2s
+he1e2t
+h2ef.
+he2fan
+he2fau
+he2f1ei
+he3f2em
+hef3erm
+2heff
+he2fid
+he4f3ing
+he2f5l
+2hefr
+hef4ra
+he2fre
+3heft
+he2fu
+he3gu
+he2hel
+h4eib
+h1eie
+h1eif
+h1eig
+he2im
+hei4mal
+hei4mar
+hei4mei
+heim3p
+hei4mu
+2hein
+heine2
+hei4neb
+hei6nene
+hei4n3er
+h3eintr
+4heio
+he1ism
+heis4s
+he1i4st
+heit4s1
+h1eiw
+hekt3a
+he2l1an
+he2l3au
+hel1ec
+he2lek
+h3elem
+he2len
+h2elf
+he3li
+hell3au
+hel4lic
+hel4mei
+he3lo
+he4lof
+hel2or
+he2lö
+2helt
+hema4s3
+2h1emb
+3hemd
+he3mi
+he4mia
+h3e4miss
+3hemm
+2h3emp
+h2en.
+hen3a2
+he4nas
+he4nat
+hen3ebe
+henen1
+hen3end
+he4nene
+he4nens
+hen3erg
+he4nerm
+he2n1e4t
+henfal4
+2henga
+hen4gag
+hen4kan
+hen4kau
+hen3st2
+hent2a
+hen3te
+hen3tr
+h1ents
+2h3entw
+h3entz
+he4n3u
+hen3z2
+4he2o
+he3on
+he3op
+he3pa
+he3ph
+h1e2pi
+hept2
+h2er.
+her3a2b
+he2rad
+4herap
+he4r3a2r
+he2rat
+herau2
+herb2
+h2ere
+he2re2b
+he4reck
+her4eif
+4he3reig
+he6reis.
+her7eises
+he2rel
+he4rene
+he6rersc
+he4rerw
+h1er2fo
+6hergebn
+2herif
+herin4d
+herin4f
+he6rin6nu
+herin4s
+h1erke
+her4klä
+h5erkran
+her3la
+herma3s
+h2ern
+he3ro
+he4r3o4b
+he4rof
+he4rop
+he4rot
+h1erör
+her3sta
+hert4
+her3th
+her3um
+her4zap
+h3erzeu
+her2z1w
+he3sa
+4hese
+he3si
+he3s2p
+hes2t
+he2tap
+he3tä
+heter2
+he3th
+het2i
+he3t2s
+h2eu
+heu3g
+he2um
+3heusc
+he3x
+he1x2a
+2hexp
+he1y2
+1hè
+4h1f4
+hfaller6
+hfan2
+hfel2l3
+hfi2s
+hflei2
+2h3g4
+hgas1
+hga4sen
+hget4
+2h1h2
+hhoh2
+4hi.
+4hia
+hi2ac
+hi2ang
+h1iat
+4hic
+hi1ce
+hich6t5er
+hicht6sp
+2hid
+hi3d2e
+hi2e
+hi3ens
+hier3i
+hie4rin
+hiers2
+hif3f4r
+hi2k3r
+hi2l3a4
+hile3n2
+hil2fr
+h2im
+2hima
+h1imb
+h3i4mit
+h4imm
+h3impe
+hi2n
+hi3nak
+hi3nam
+hi3nap
+hi5nas
+h2inde
+hi3nel
+hin2en1
+h1inf
+h1inh
+2hi3n2i
+hin3n2
+hi3no
+hin2t1a
+2hio
+hi3ob
+hi4on
+hi3or
+hi2p1
+hip3f
+hi4pl
+hip3o
+hi2r
+hi3ra
+hi3re
+hi3ri
+hir2m1a
+hir2mi
+hirn1
+hir4ner
+hir2s
+1hirt
+2his.
+his2a
+hi2se
+h1i2so
+hi2spa
+hi3tac
+hi2tan
+hi2tel
+hit2i
+hit3z2e
+hi2v1o
+2h1j
+2h1k4
+hkamp2
+h2keu
+hklo3s
+4hl
+hl2ag
+hla2gr
+hla2l
+hlam8meng
+hlan4d3a
+h1las
+h1lat
+h3laus.
+h1laut
+h1lay
+h3läche
+h3läd
+h1läs
+h1läß
+h1läu
+hl3d4
+hle3a
+h3leb
+h3led
+hle3e4
+h3lein
+h2leis
+h3leist
+h5len.
+hle4nas
+hlenen3
+hl2enn
+h4l3entr
+h4lents
+hl2enz
+h3ler
+hle2r3a
+hl4ere
+h2lerg
+hl2erk
+h6l3er4nä
+hle3run
+hl1erw
+h4lerz
+h3les
+h4lesi
+hlf4
+h2lie
+h3lied
+h2lif
+h2lim
+hl1ind
+h2lip
+h2lis
+h3list
+h2lit1
+hl3l2
+hlle3b
+hlm2
+hlma3s2
+h2lo
+hl1ob
+h3loc
+h3log
+hlo2re
+h4lorm
+h3los.
+h3losi
+hlos4st
+hlo2ß1
+hl2ö
+h2lös3
+hlö4ss
+hl4sar
+hl2ser
+hls3ka
+hl3s2lo
+hls3tie
+hl3str
+hl2su
+hl3t4
+h3luf
+h3luk
+h3lumpe
+h1lüf
+hlz2
+2h1m
+h3mad
+h3mag
+h3mak
+h3man
+h2mant
+h3mar
+h4marc
+h3mas
+hma3sse
+h3maß
+h3mä
+h4mäc
+h4mäh
+h4mäl
+hm2e
+h3me.
+h3med
+hme1e4
+hmeer4s
+h3mein
+h3meist
+h3meld
+hme3le
+h3men
+hmen2s
+hme2ra
+h3mex
+hmi2e
+h3mil
+h3mind
+h3mini
+h3minz
+h3mirr
+h2mo
+h3mop
+h3mot
+h3m2ö
+h4möl
+hm3p2
+hm2s1p
+h2mu
+h3mul
+h3musi
+2hn
+h2na
+h3nag
+h3nam
+h4nar
+h4natt
+h3nau.
+hn1äh
+hn3d4
+hn2e
+hne3b
+hne2e3
+h2n3ef
+hn3eig
+hn3ein
+h2nel
+hne4n1
+hn4eng
+hne4pf
+h3ner
+hner4de
+hner3ei
+h4n3e2ro
+h4n3ersa
+hn4es
+hn3ex
+hn3f4
+hnflei4
+hnhof8stra8s
+h2nic
+h2nid
+h2nie
+hn1im
+h2nip
+hnk4
+h2nor
+hn3sa
+hn3s2p
+hns2t
+hnsuch4
+hntra4
+hnts2
+h2nul
+h2n1unf
+hn3z2
+ho4ar
+ho3bern
+ho2bl
+ho2c
+hoch3
+hoche2
+hocker4
+hock3t
+4hocy
+2hod
+2ho2e
+hoe3n
+ho4f1a4
+ho2fä
+ho2feu
+hof3f4a
+ho2f3l
+ho2f1o
+ho2f3r
+ho2fu
+2hoi
+ho2l1a
+hol3ar
+4holdy
+3hole
+ho2l1ei
+hol3g4
+hol3k
+holl2
+ho2l1op
+holt4
+2holy
+h3olym
+3holz
+hol6zene
+hom2e
+ho2me.
+ho2mec
+ho2med
+h2on
+4hon.
+hond4
+4hone
+hon2er
+4hong
+4honh
+4honk
+4hons
+4hony
+ho1on
+hoo2r
+2hope
+ho1ra
+ho2rak
+h1o2r2an
+ho2rar
+ho2rau
+h1or3d
+2hore
+ho4rens
+ho3ret
+2h1org
+ho2rop
+hor3ta
+hor4ter
+hort3s
+h1ortu
+hos3a
+ho3se2
+ho4sei
+ho3sl
+ho4sla
+4hosö
+ho2str
+ho4ßene
+2hot.
+ho3th
+4hotr
+2hot1s2
+2ho2w1
+h1o2x
+ho1y2
+4hoz
+hô1
+1h2ö
+2hö.
+hö2c
+h4öh
+5höhe
+hö4l
+hö4s
+hös1c
+hös3se
+h3öst
+2h3p2
+h1q
+4hr
+hra2b
+hr3ac
+hr3ad
+hr1a2g
+h1r4ah
+h1rai
+h1rane
+hr3ap
+hr3as3s
+h3rat
+h3räu
+hrb4
+hr1c
+hr3d
+h2rec
+h3r2ech
+h3red
+h3ref
+hr1eh
+h4rei.
+hrei4ba
+hrei4br
+h3reic
+h3reif
+h4r3eig
+hr4eini
+h4reinl
+h4reins
+hrei3th
+hreli1
+h3rep
+hrer6geb
+hr2erk
+h4rerla
+h6rer6leb
+hr2erm
+hrer4sa
+hrer5st
+hrer6tüc
+hr2erw
+hr2erz
+h3re2s1
+hres5s2
+hrest2
+hre4t
+h2r1eta
+h2r1eu
+h2rev
+h3rez
+hrg2
+hrga4
+hrgu4
+h2ri
+h3ric
+h4rick
+hri4e
+h3riesl
+h3rin
+hr1int
+h4rist
+hrk4
+hr3l
+hrm2
+h3rog
+h3roh
+h1ro2l
+h4romat
+h4rome
+h4romi
+h4romo
+h4ron
+h1ropa
+hro4r
+h3rou
+h3rö2s
+hr2s1ac
+hr4s3and
+hr3sch
+hr2sen
+hr2s1er
+hr2set
+hr4sh
+hr2sin
+hrs3k
+hrs3l
+hr2s1of
+hr3spa
+hrst2
+hr4stec
+hr6stele
+hr2su
+hr2tab
+hr2tan
+hr2te2l
+hr2th
+hr2top
+hrt3ric
+hrt2sa
+hrt2se
+hrt4sin
+hrt2sp
+hrt4ste
+h3ruh
+hr1ums
+h3rut
+h3rü
+h4rüb
+h4ry
+hrz2
+4h1s
+h4s3acht
+h2sa2d
+h2s1alk
+h2sall
+h4samt
+h2san
+h2s1as
+h2sath
+h2saud
+h2s3aur
+h2saut
+h2säh
+h2säug
+h3sc
+h4schan
+hs4cr
+h2s3ec
+hse2e
+h4s1ehr
+h2s1eie
+h4seind
+h6seinst
+hsela2
+h3sele
+hse4lin
+hse4mis
+h4s3endw
+h2s1erf
+h2s1erg
+h2serh
+h2s1erk
+h2s1erl
+hs1ern
+hs4erne
+h2serö
+h2s1erw
+h2serz
+h2seth
+h2sex
+h3s2ext
+hsha2k
+h2s1i2d
+hs2im
+h2s3ing
+h3s4inni
+h4s1ita
+hs2kal
+h3skand
+hs1of
+h2sofe
+h2sop
+hs1org
+h2spac
+h4s3pani
+h2s1par
+h2s1pat
+h3spec
+h3spei
+h2sper
+h2sph
+h2spo
+h3spoi
+h2sprä
+h2spro
+hss2
+h2staf
+hst3alt
+hst2an
+h2stau
+h2stäl
+h2stäu
+h4stea
+h4stele
+h4sterm
+hs1tie
+h2stin
+h2stit
+h2s1tol
+h2s1tor
+h3stö
+hst3ran
+h4s3treu
+hstro2
+h2stu
+h3stun
+h3stü
+h2s1u
+hs2ung
+h3sy
+4h1t
+ht1a
+h2ta2d
+ht2ag
+ht4akt.
+ht4akte
+h2tall
+h2talo
+h2talt
+hta2m
+h2ta2n
+ht3ane
+h3tank
+h3tanz
+h2tap
+h2ta2r
+ht3arr
+ht2as
+h2t3asi
+h2tasy
+h2t3a2t
+h3tat.
+h3ta3te
+h2tau
+h3taug
+h4t3ax
+ht1ä
+h2tär
+h3te.
+ht3e4ber
+ht1ec
+hte3cha
+h2t1e2d
+ht1eff
+ht1e2he
+h2teif
+h2t1eig
+h4t3eilz
+h2t1eim
+ht1ein
+h2t1eis
+h2t1eke
+ht3elas
+hte6l5ei.
+h4telek
+h4t3elfe
+h4t3elit
+hte4m
+h2t1emi
+h2temp
+h3ten.
+ht3engl
+ht3enta
+h4tentf
+hter6de.
+hterer6s
+ht3erfü
+h6terfül
+h6tergeb
+ht3ergr
+hter6gri
+ht1erh
+hter6häl
+hter8höhu
+h6terleb
+h6t5erleu
+h6terneu
+ht5erspa
+hter8spar
+ht3erst
+h6tersta
+ht3erwä
+ht3erze
+h2t1ese
+h2t1ess
+h2t1e2th
+h2t1eu
+h3teum
+h3teun
+h4textr
+h2t3h2
+h4thei
+h3thera
+h3thes
+ht4heu
+h4tho
+h2ti2d
+h3tig
+h2t1im
+ht1i6n3
+h2t3ine
+h2tins
+h2tisr
+htni2
+hto2
+h2t1ob
+htod1
+h2t1of
+h2t3oly
+h2tope
+ht1or
+h2tord
+ht3rak
+h3tran
+ht3rand
+h2t3ras
+ht3rat
+ht6rates
+ht3rau
+h4traub
+ht6raume
+ht3rec
+h3treck
+ht3rei
+h2trek
+h2t3res
+ht4ri
+ht5ric
+h4t5rieg
+h2t5rin
+h3trit
+h2t3rol
+h2t3ros
+h2t3roß
+ht3röm
+ht3ru
+h2t3rü
+ht2sah
+ht2sal
+ht4s3a4n
+ht2scr
+ht4sein
+ht2sel
+ht4s3end
+ht4seng
+htse2r1
+hts3eri
+htsha2
+ht3s4hak
+hts3k
+ht3skal
+hts1o
+hts3tät
+ht4s3tem
+hts2ti
+ht4s3tur
+ht4s3tür
+htt4
+htti2
+htu2e
+h2t1urs
+ht3z2
+hu2a
+hu2b1a
+hu2bei
+hu4bel
+hu2b1en2
+hu2bi
+hu2b3l
+hu4b5r
+hu2bu
+hu2fa
+hu2h3a
+hu2h1i
+h1uhr
+h1uhu
+hu2kä
+hu2k1i
+huk3t2
+hu2l3a2
+hu2lä
+hule2
+hu2l1eb
+hu2l1ei
+hu2lem
+hu4l3eng
+hu4lent
+hu2l1er
+hu2let
+hu2lid
+hu2l3in
+hul3l2
+hu2lo
+hu2lö
+hul3s
+hu3m2a
+h1umh
+2h1ums
+hu2n
+h1una
+h2und
+hun3d2e
+hunde3i
+2hunf
+hung2
+hun3ge
+h1uni
+h1unm
+2hunt
+h1ups
+2hur
+hur3g2
+hur2th
+hu3sa
+hus3h
+hu2so
+hus2s3a
+hus3sen
+husser4
+hus2s1o
+hus2sp
+hus4st
+hu2ß1
+hu2tab
+hu2ti
+hu2t1o4
+hu2t3r
+hut2t
+hut4zen
+hut4z3er
+hut2zu
+h2ü
+hübe4
+h3über
+h4übs
+h3übu
+hüf2
+hühne4
+2h1v
+hvil4
+2hw2
+h2wall
+hwe1c
+h1weib
+h1weih
+hwein6sa
+hweis4s
+h2wirr
+hyle4
+hyl4l
+hy2lor
+3hym
+h1yo
+3hyp
+hy2pe.
+2hy2t
+2h1z
+hz2a
+h3z2o
+hzug4
+h3z2w
+i1a
+i2aa
+i2ab
+iab4l
+i2ache
+i3ad.
+ia3do
+i2af
+iaf4l
+i2ag
+i4ago
+i2a1h2
+i2aj
+ia2kei
+ia2kr
+i2aku
+i3al.
+i3a2l1a2
+ial3ar
+ial3as
+ia2lä
+i3al3b4
+i3alc
+i3al3d4
+i3a2leb
+i3alef
+i3alei
+ia3lek
+i3alel
+i3aleng
+i3alent
+i3alerb
+i3alerf
+i3alerh
+i3a4lerm
+i3a2l1et
+i3alex
+i3alf
+i3alg
+i3a2lia
+i3alim
+i3a2lin
+i3alj
+i3alk
+i5al3l
+ial4ler
+iall2i
+i3alm
+i3aln
+ia2lon
+ia2l1o2r
+ial3p
+i3alr
+i3al3s
+i3al3t4
+ia2l3u2
+i3alv
+i3al3z2
+i2am
+i3am.
+i3amp
+iampe4
+i3an.
+ian2a
+ia2nal
+ian3alt
+ia2nau
+i3and2
+ia2n1e2b
+ian2er
+i3anl
+i3ans
+ian2s1p
+i3ant
+i3anw
+i3anz
+ia1o
+i2ap
+ia3pf
+i2a1q
+i3ar.
+i2a2ra
+i4ari
+i3as.
+ia3sh
+i2asi
+ia1s2p
+ias5s
+iast4
+i3at.
+i4ate
+i3at2h
+i4athe
+1iatr
+i3ats
+i3au
+ia3un
+iau2s1
+i2av
+2iä
+i1ä2m
+i1äp
+i1är.
+i1ärs
+i1ät
+i3ä4tem
+iä2ti
+iät3s2
+2i1b
+ib1art
+i2b1auf
+i2b1aus
+i2baut
+ib3be
+ib2bli
+i2b1eig
+i2b1eis
+ibe4n1
+i2b1ep
+i6ber6geb
+ibe1ro
+i2bim
+i2b1in
+i2blad
+i2bleu
+i3blu
+ib2o
+i2bö
+i2b3rau
+i2b3ren
+ib3ric
+i2b3roc
+ib2ser
+ib4ste
+ib2un
+i2b3unk
+i2b3unt
+ibus1c
+ibus3s
+2ic
+i3ca
+ic1c
+ich1a
+ich6art.
+ich1ä
+i1che
+ich1ei
+ich2er
+icherin5
+ichermas8
+ichgro3
+i1chi
+ich1l
+ich3le
+ich3li
+i3ch4lo
+ich5m
+ichmas4
+ich3n
+i1cho
+ich3ort
+i2ch3r
+ich6sele
+ichsen3
+ich2s1i
+ich6stie
+ich4tab
+ich4tan
+ich4tin
+ich2tr
+i1chu
+ich1w
+i1ci
+ic1in
+ickt2
+i1cl
+ic3la
+i5cu
+i1d
+id2ab4
+i3d2ac
+id1a2n
+i3d2ans
+i3dat
+id1au
+id2ax
+idä1
+idbu4
+i2dea
+1idee
+2idel
+idel4ä
+i4demu
+ide4n1o
+iden4se
+ide2on
+i3der
+4ider.
+iderin8nu
+ide1rö
+ider6reg
+ide3so
+ides2p
+2idia
+1i2dio
+idni3
+id2o
+i2dol
+2idoo
+i2dö
+2i2dr
+i3dsc
+id2set
+id2s1p
+idt4
+2idu
+1i2dy
+ie3a2
+ie2bä
+ie2bl
+ie2b3re
+ie2bri
+ie4b3rü
+ieb4sto
+ie1c
+ie2cho
+iech3t
+ie2d3an
+ie3de
+ie2dr
+ie1e2
+ie2f1an
+ie2fau
+ie2fäh
+ief1ei
+iefe2m
+ief3f4
+ief2i
+ie2f3l
+ie4fonk
+ief1r
+ie2fro
+ie2gl
+ie4g5li
+ie3g4n
+ieg3r
+ieg4ra
+ie2gre
+ieg2s
+ieg4s3c
+ieg4se
+ieg4s1t
+ie2h1in
+ieh3r4
+i1ei
+ie1ind
+i2e2l1a
+iel3d4
+i2ele
+ie2l1e2b
+iel1ec
+iel3eid
+ie2lek
+i4elen
+ie4lene
+ie4leng
+ieler4e
+ieler6fi
+ieler8geb
+ieler6ke
+ieler6la
+ieler8lebn
+iel4erw
+ieles4
+ielf4
+ieli2d
+i1ell
+ie2lo4b
+ie4lor
+i2els2
+iel3sz
+ielt2
+iel3ta
+iem2e
+2i1en
+i3en.
+i3ena
+ien1a2g
+ien2am
+ie4nas
+i3enä
+i2ene
+ien1eb
+i3enec
+i3e2nek
+iener6fo
+ien3er4g
+iener6la
+i3enex
+i3enf
+i3eng4
+ienge4f
+ienge4z
+i3enh
+ie2nim
+ie4n3in
+i3enj
+i3enk
+i3enla
+i3enle
+i3enm
+ienma3s4
+i3enn
+i3e2no
+i3enö
+i3enp
+i3enr
+i3ens.
+i3ensa
+i3ensc
+i3ens2e
+ien3s2k
+i3ens2p
+ien6st5er
+ien6stop
+iens4tr
+ienst5rä
+i3en3sz
+ien4tar
+i3enth
+i3enty
+i3env
+i3enw
+i3enz
+ie1o4
+ier3a2
+ie2rad
+ie2rap
+i2ere
+ie4reck
+ie4r3eis
+ie3r2er
+ierer3k
+ie4r3erz
+ie2ret
+ierf4
+ierg4
+i1ergi
+ierk4
+ierken4
+ierma6ss
+i1ern
+i3ern.
+i2erni
+ie1ro
+ie2rö
+ier4re.
+ier4s3eh
+ier3sei
+ier3sta
+ier3te
+ier3z2
+ie3s2
+ie4san
+i2esc
+i2ese
+ie4sh
+ie4s3k
+ie4spu
+iesser6g
+iess3ti
+iest6e
+ie4stin
+ießer4g
+iet1a
+ie2ta2g
+ie2tan
+ie2tap
+ie2tat
+ie2tau
+ie4t3ent
+ie4t3erh
+ie4t3ert
+ie4tha
+i4ethe
+iet3her
+ie2t3ho
+ie2thy
+ie2t1o4b
+ie2t1ö2s
+ie2t3ri
+ie2t3ru
+iet2se
+i1ett
+iet3zw
+ieu2e
+i2e1un
+ie2w1u
+i1e2x
+2if
+if1ab
+if1ar
+i2f3arm
+if4at
+i2f1au
+if1än
+i2fec
+i2f1ef
+if1ein
+if2e4n
+i2f1erg
+if1erh
+if2fa
+iffe4s
+if6feste
+if2f3l
+if4form
+if2fro
+iff2s
+iff4ste
+if3l
+if1lac
+i1f4lä
+iflo4
+if4los
+i1flü
+if3r
+i1fre
+if4rev
+ifrü4
+if3sa
+if4t3a
+if2ted
+if2t3ef
+if2t1ei
+if2te2l
+if2tep
+if4terk
+ifte4s
+if4t3esc
+if2t1op
+ift1r
+if2tra
+if2t3ri
+if2tro
+ift1sp
+ifts2t
+ift3sz
+if2tur
+i1fy
+2i1g
+iga1i
+i2garb
+ig1art
+iga3s
+i2g3att
+igd4
+i6gebrau
+i4gefar
+ig1ein
+ige4na
+ige6nene
+ige4nid
+igen5s
+ige2ra
+igerma3
+ig5erwer
+ig1erz
+iger4ze
+i2g1ess
+i2gim
+i2gl
+i4glag
+i4g3lim
+ig4na
+i4gnä
+i3g4neu
+ig4no
+i3g2o
+igo1p
+ig3rad
+ig3re
+ig4ren
+igro3
+i2grou
+ig3sa
+ig4sal
+ig3sä
+ig4schr
+ig1s2o
+ig1sp
+ig2spa
+ig4sti
+ig2s1to
+ig2stö
+ig6stra6s
+ig4stur
+2i1h
+i2har
+i5hea
+ihe1e
+ih1elt
+ihe4n
+ihe1u
+ih3m
+ih3n
+ih3r
+ih2s
+ih3sp
+ih3sti
+ih1um.
+ih1w
+ii2
+ii3a4
+i1ie
+i3ig
+ii3h
+i1im
+i3in
+i1i4s
+i2is.
+ii3t
+i1it.
+i1j
+1i2js
+2i1k
+ika2ge
+ik1ak
+ikaken3
+i2kakt
+ik3amt
+i4k1ang
+i6kantei
+ikanten8n
+ik1art
+ik3att
+i2k1au
+i3kaz
+ik1äh
+i2k1än
+i2kär
+4ike
+i2keb
+ik1ebe
+i2k1ed
+i2kef
+i2k1ei
+ike4l1
+ike2n1
+i2k1ens
+ike2ra
+i2k1e4r2e
+i2k1er2f
+i5kerfam
+i2k1er2h
+i2ker2l
+i2kero
+i2ke3ru
+i2k1eta
+i3ki.
+i3kie
+ik1in
+i2kins
+i2k3l
+ik4län
+i3k4leri
+i3k4let
+ik4lim
+i3klu
+i2kne
+i2k1off
+iko1p2
+ik1o4ri
+ikot3t
+i2köl
+ik3rä
+i2kres
+ik4ris
+i2krö
+ik3sa
+ik3s2z
+ik3ta
+ikt3erk
+ik4t3esk
+ik2t3re
+ikt2u
+i2k1uh
+i2kup
+i3kus
+i2kü
+i1la
+i2lab
+ila2br
+i4labs
+i2l1ac
+i2l1ak
+il3a2ma
+il1anm
+il2anz
+ilan6zer
+i2larb
+il1asp
+i2l1au
+i3laub
+i3l4aufb
+ilau2s1
+i1lä1
+i2lär
+2ilb
+il2c
+il5chen
+il2da
+ild3ebe
+il4d3en4t
+il3der
+ild4erp
+ildi2
+ild1o
+il2dor
+il2dr
+ildwe4
+2ile
+il1ec
+ileid4
+il1ein
+il1el
+i2lemb
+il1ent
+i4lentl
+i4lents
+i2l1erd
+iler4ei
+i6lereig
+il1erf
+iler4fo
+i2ler2g
+i2l1er2h
+i4lerkl
+il1err
+i4lerri
+il2erz
+ile4th
+il1ex
+ilf2
+il2f3l
+il2f3re
+ilf4s1
+il2gl
+2ilh
+2ili
+ili3e4n3
+iliga2
+ili4g3ab
+ilik4
+i2l1ind
+i4l3init
+il1ins
+i2l1ip
+i3lip.
+i3lips
+il2lad
+ill2an
+ill4ant
+il2lä2
+il2leg
+ille4ge
+il4lenn
+il3l2er
+1illu
+il2mak
+il2m1ap
+il2mau
+ilm1ei
+il2min
+il2mor
+2ilo
+il1ob
+il2of
+il2oh
+il4on
+il2op
+i2l1or
+i3lou
+il1ox
+il4sein
+ils2to
+ilt2
+il3t4h
+i1lu
+i2lum
+il1ur
+i3lus
+ilü4
+2ilv4
+il2zar
+il2zau
+ilz1er
+il2zwa
+imad2
+ima3i
+im2al
+i2m3anh
+i2mans
+i2marc
+im3aren
+i2m1arm
+i2m1art
+im4at
+imat5sc
+ima4tur
+i2maus
+i2maut
+i2meg
+im1ein
+i2mej
+i2mek
+i2mele
+i2melf
+im2en
+i2m1erf
+i2m1erl
+i2m1erz
+i4me3sh
+imes3s
+i2meti
+i2mew
+i2m1i2d
+i2mim
+i2m1ind
+i2minf
+i2m1ins
+3immatr
+immen1
+imm3ent
+im6menth
+im2mit
+1immo
+im4mo2d
+im2mö
+imni2
+2imo
+i2m1ob
+i2mo2p
+i2mö
+1imp
+imp2fa
+im3pfo
+imp2s
+im3pse
+2imt
+imt2e
+im3t2i
+imts2
+imtu2
+2imu
+im2um
+im1urk
+2in.
+in3ab
+ina2be
+in1ac
+in1ad
+i4n3ae
+i3nald
+inaler4
+ina6lere
+in2alp
+in1am
+in2an
+in3ana
+in3ann
+i2narb
+i2narm
+in2ars
+in3att
+i2n3au2
+inaus1
+2inä
+i2n1äh
+in2är
+in1äs
+2ind.
+inda2
+ind2ac
+in2dal
+in2dan
+2indä
+in3de
+2inde.
+ind4eid
+2inden
+ind5erke
+inde3sp
+indes4t
+1index
+ind2i
+1indik
+in3dö
+2indr
+ind4ri
+ind3se
+1indus
+in3d2ü
+2ine
+i4ne4ben
+in1ec
+i3nee
+i2neff
+in4elen
+in2em
+ine3nä
+i2neng
+i4n3enzy
+i5ner.
+i4n3erbi
+in2erh
+in3erle
+i6ner6leb
+iner4lö
+i4n3er4tr
+i3nes
+in2et
+in1eu
+ine3un
+ine2x
+in3f4
+1infiz
+1info
+2ing
+4inga
+in2g1af
+in2g1a2g
+in2g1al
+in2gam
+ing1ar
+in2g3at
+3ingeni
+in3g2er
+in4g3erw
+in2gl
+in3gla
+in3glä
+ingmas4
+in2gor
+ing4sam
+ings6por
+ing4s3pr
+1inhab
+2inhar
+2inhau
+2inhe
+in2i3d
+2inie
+2inig
+ini3k4r
+2inis
+ini3se
+init2
+i3nitz
+3inkarn
+1inkas
+in4k3ent
+ink4er
+inks1t
+ink4ste
+in3k2ü
+inma4le
+4inn.
+inne4n
+in4ner4m
+in2neu
+in4ni2v
+4innl
+in2nor
+1innta
+2ino
+in1od
+in3ols
+in1or
+inost2
+i3no3t
+i2n1ou
+i1nö
+in1ö2d
+2inri
+ins2am
+in6samt.
+insch2
+2inse.
+in2seb
+2insed
+2insen
+ins2i
+2insk
+in4sm
+3instal
+in4s3tät
+2inst2e
+3instit
+4instra
+in4strü
+1insuf
+ins3umz
+in2sur
+in3s2z
+2inta
+in3te
+2inte.
+1integ
+2inth
+inthi1
+in3ti
+int2o
+2intö
+2in3t4r
+4inträ
+3intrig
+int3s
+i2n1u
+i4nuh
+in3unz
+inu3t
+4inverm
+invil4
+i1ny2
+in3z2e
+inz2i
+inz2u
+in3zwä
+i1ñ
+2i1o
+ioa4
+io1c
+io2d
+io3du
+io3e4
+i2of
+iof4l
+i2oh
+io3k6r
+i3ol.
+i3om.
+io3me
+i3oms
+ion2
+i3on.
+ion3an
+io2n3au
+ion3d2
+io4nee
+i3onn
+io2nor
+i3on4s1
+ions3a
+ions3el
+i2ony
+i2oo
+i2o1p
+i3o4pf
+i3opt
+i2or
+i3or.
+i3orc
+ior2e
+iore4n
+io1r2h
+i3orp
+i3ors
+i3ort
+i3os.
+io3sh
+io5ska
+i2ost
+ios2u
+i2o3sz
+io3t
+i3ot.
+iot4r
+i3ots
+i2ou
+i2ov
+i3o2x
+i3oz.
+i1ö2k
+i1ön
+i1ös.
+i1ö4st
+2ip.
+i1pa
+ip2an
+i1pe
+i3per
+2ipf2
+i3pfan
+iph2
+2i1pi
+ipi3el
+ipi3en
+i2poi
+ip2pan
+ip3pe
+ipp1f
+ip4pl
+i1pr
+2ips
+ip2sa
+ip2sei
+ip2sp
+ip2sta
+ip2stü
+ipt2a
+ipt2u
+2ipu
+2i1q
+i1r4a
+i3ra.
+2i3rad
+i3ras
+irat2
+i1rä
+ir1äh
+ir2bl
+ir1c
+ir2ch1o
+ir4e
+i3ree
+2irek
+ire4na
+i3ré
+irg2
+irg4s
+ir2he
+ir2i
+iri3a
+2i5rig
+2irk
+irke4n
+ir4kene
+ir2k3l
+irli4n
+ir2m1a2g
+ir2mak
+ir2mau
+ir2mä
+ir2m1ei
+irme4n1
+ir2m1o2
+irm4th
+ir2mum
+ir4munt
+2irn
+ir2n3a
+ir4nat
+ir2no
+i3ro
+1iron
+i1rö
+irpla2
+ir2rei
+irre4l
+ir4reli
+ir2rh
+irs2
+ir4schl
+ir4schm
+ir4sch3r
+ir4sch3w
+ir3se3
+ir3sh
+irt2s1t
+2iru
+ir1u2m
+iru2s1
+i3r2ü
+i1s
+i3sac
+i4samp
+i4s1amt
+is2ap
+isa2r
+is3are
+i3sat
+i2sau
+is3auf
+isau2g
+i2säh
+i2s1än
+2isb
+i2sca
+i2sce
+i4schar
+i3s2che
+i4schef
+i4sch3e4h
+isch3ei
+i6schemi
+i6scher6z
+i4schin
+i5sching
+i2schl
+i2schm
+isch3ma
+i4schna
+i4sch3re
+isch3ru
+i6schüb
+i4schwa
+i6schwir
+i4schwo
+isch3wu
+i4schwü
+i2scr
+2ise
+ise3a
+ise1e
+iseh2a
+ise3hi
+is4eind
+i4seint
+is2el
+ise3li
+i6sel6ter
+ise2n1
+ise4n3a2
+is2end
+isen3s
+ise4r3ei
+is1erg
+i2serh
+i2s1erm
+i2s1es2s
+is2et
+i4s3etat
+i3s2eu
+2isf
+4ish
+isi2a
+i2s1i2d
+i3sin3g4
+i4ski
+i4sku
+is3la
+3islam
+2isma
+2ismi
+i2s1of
+1i2sol
+3isom
+is2o2n3
+isonen4
+iso6nend
+i2sop
+is1org
+is1ort
+3i2sot
+2isp
+is1pa
+i2spar
+is1pe
+is1pic
+is2por
+i2spro
+is3sa
+is4s1ac
+is4sau
+is3sc
+iss3che
+is3senk
+iss3erf
+issermas8
+is3so
+is3sp
+iss2po
+is2st
+is3sta
+is4ste
+is3strä
+is3stu
+is2su
+i2stab
+ist3ac
+is4tal
+i4stam
+ist2an
+i4s3tang
+ist4e
+i4stea
+i4s1tec
+iste4n
+ist2id
+ist6o
+ist4ra
+is3tras3
+ist3rei
+i3stro
+i2stur
+is1tüm
+i3suf
+isum3p
+i2sü
+i1ß
+iß1er4s
+i1ta
+it1ab.
+it1abs
+i3tag
+ital3a
+ital5l
+it1alt
+it1a2m
+it1an
+ita3ne
+it3anr
+ita2po
+it1app
+it1a2re
+it1art
+i3tat
+it1au
+i3tauc
+i2tauf
+i2taut
+4i1tä
+it1änd
+i2t1äs
+ität2
+i1te
+it1eff
+i2t1ei
+it2eic
+i4teig
+i4tein
+i4teis
+2itel
+ite4l1a
+i4telek
+i2temp
+ite2n
+i3ten.
+i2tepo
+i6tereig
+it2erö
+i8t7ersche
+i2t1esk
+i2t1ex
+i3text
+i3thr
+i1ti
+i3tic
+i2tid
+i3tig
+1itii
+iti3ker
+it1in1
+i3tis
+i4tiso
+iti3sp
+i4tiss
+i3tiv
+iti2v5a
+itmen2
+4i1to
+i3to.
+it1ob
+ito4be
+i3toc
+i2t1of
+it1o2p
+it2os
+i1tö
+2i1tr
+it3raf
+it3ras
+it3rau
+it3räu
+it3re
+i2tref
+it4ret
+it3rob
+it3rom
+i2t3run
+it2sa
+its1a2g
+it2s1e
+it4se2h
+its3e2r1
+its1o
+it4stec
+it4s3tem
+it4sten
+it4s3tes
+itstra6s
+2itt
+it2teb
+it4temp
+itt3hä
+it2t1o4b
+it2top
+it2tri
+itt3rol
+itt6schi
+itt4seh
+itt4sei
+itt4sti
+i1tu
+it1uh
+it1ums
+it2ung
+i2tuns
+ituran4
+it1urg
+itut4
+i1tü
+2itz
+it2zec
+itz2er
+itz3erg
+it6zergr
+it4z3erl
+it2z1w
+2i3u2
+ium1
+iuma4
+ium2se
+iun2
+iungs3
+ius1t
+i1ü4
+2i1v
+i2v1ad
+i2v1ak
+i2v1am
+iv1an
+i2v1ä
+i2veb
+i2v1ef
+iv1ei
+iv1elt
+ive4n
+iv1ene
+i2v1ent
+ive3re
+iver8folge
+iv1erh
+iver4kl
+iv1erl
+iver3s
+i2v1e4x
+iv1ins
+i3vol
+i2vr
+i2vun
+i2v1ur
+2i1w
+2i1x
+i2xa
+ix2em
+ixt2
+4i1z
+i2z1ag
+i2zan
+i2z1ap
+i3z2as
+iz1au
+i2zaus
+i2zän
+izei3c
+izeit3s4
+i2zele
+ize2n
+i4zener
+iz1erg
+i2z1erl
+iz1ir
+i2zo2f
+i2zö
+i2zuna
+i2z1w
+i3z2wi
+izz4a
+í1l
+j2a
+jab4
+jah4r3ei
+jahr4s
+ja3l2a
+ja3ne
+jani1
+jani3t4
+ja5ru
+jas2o
+jat2
+je2a
+jean2s
+je2g
+jek2t3a
+jek4ter
+jek4tin
+jekt3o2
+jektor4
+jek2t3r
+je2p
+je2t1a
+je4t3h
+je2tin
+je2tor
+je2t3r
+jet3t
+je2t1u2
+ji2a
+ji2v
+joa3
+jo2b1
+job3r
+jo4da
+jo2i
+jong2
+jo1r2a
+jord2
+jo2sc
+3jou
+jou4l
+j2u
+ju2bl
+jude2
+jugen6
+jugend3
+ju1i
+ju2k
+ju3l2
+jung5s2
+ju3ni
+ju3r4a
+jur2o
+ju3t2e1
+2j1v
+1ka
+3ka.
+ka3ar
+2k1abb
+kab2bl
+2kabd
+2k1a2ben
+2kabf
+2kabg
+2kabh
+2kabn
+2k3a4bo
+2k1abs
+2k1abt
+2kabw
+2kabz
+ka1c
+kade2r
+2k1adm
+2k3a2dr
+3kadu
+2kadv
+ka1f4l
+ka1fr
+kaf3t2
+kag2
+2k1age
+3kah
+ka1ho
+ka1in
+kaken2
+ka1k4l
+2k1akt.
+4kala.
+kala3b4
+ka2lan
+kal3d
+ka2leb
+ka4l1eh
+ka4lens
+kal3eri
+3k2alk
+kal2k1a
+kal4kan
+kal2k3l
+kal3l
+kall2i
+kallö3
+2k1allt
+ka2lop
+ka2l1os
+kals2
+kal4tex
+kal4th
+ka2lu
+k2amt
+3kana
+kan4al
+ka4n1a4s
+ka2nau
+3kanä
+2kanb
+kan3d4
+2kanda
+2kandä
+kan2e
+2kanf
+3kani
+4kanim
+kank4
+2kanl
+2kanom
+2k1anor
+2k1ans
+k2ans.
+kan4tar
+6k5antenn
+2k1anth
+ka3nu
+4kanw
+2k1anzu
+2kanzü
+ka2o1
+3kara
+2karbe
+2karc
+k2ard
+kar3d2a
+k1area
+k2arg
+ka3r2i
+kari3es
+k2ark
+2k1arm
+kar2pf
+k2ars
+k2ar3ta
+k2arte
+k1arti
+4kartik
+karu2
+k2arw
+3k2asc
+kasi1
+kas2o
+ka2sp
+kas2t
+2k1ast.
+ka3sta
+ka4ster
+3kasu
+ka3sz
+ka2tan
+3kateg
+ka3t2h
+ka2t3r
+kat3se
+2katt4
+kau4fer
+kau2f1o
+kauf4s3a
+kauf4sp
+kauf8s7tem
+k2aus.
+2kauss
+2kausw
+kau3t2
+2kauto
+2kaz
+1kä
+k1ä2mi
+kär2
+2k1ärg
+kä2s5c
+käse3
+kä3th
+4k3b4
+kbe1
+kbo4n
+kby2
+2k3c
+2k3d4
+ke2ben
+2k1ec
+ke2di
+k1ef
+2keff
+kefi4
+kege2
+ke2gl
+ke2he.
+ke2hen
+kehr2s
+kehrs3o
+2k1eic
+2k1eig
+kei2li
+2k1ein
+ke1in2d
+kein4e
+k1eis
+2keise
+keit2s
+ke2la
+kel1ac
+ke3lade
+ke3lag
+ke4l3am
+kel1au
+ke2lä
+kel3b
+keld4
+kel3eis
+2ke2lek
+ke2l1en
+ke2l1er
+kel3la
+kel7l4e
+kell2i
+ke2l1o2
+ke2lö
+kel3sk
+k4elt
+ke2mi
+2k1emp
+k2en.
+ken1a
+ken3au
+kenbu5s4
+ken3dr
+ke2n1e2b
+kenen1
+ke4nene
+ke4nens
+kener4n
+4ken4gag
+k5en6gel.
+ke2nim
+ken3in
+4kenlad
+4kenläd
+kenmas8sen
+kenn2a
+kenn2e
+ke2no
+4kensem
+ken3s2i
+ken3s2k
+ken5s4te
+ken3sz
+k3en4te.
+ken6ten.
+4kentf
+2k1entg
+ken3th
+2k1entl
+2k1ents
+2kentw
+2kentz
+ken3z2
+2ke1o2
+2kep
+ke2pl
+k2er.
+ke1ra
+ke2ran
+ke2rau
+ke2r1ä
+ker4ble
+k2erc
+4kerd
+ke2re2b
+ke3reig
+ker3ein
+4kerfah
+k4erfam
+ker2fo
+ker5g
+k3ergeb
+2kergu
+ke6rin6nu
+kerin6st
+kerin4t
+k3erken
+k2erko
+k2erl
+k3er4lau
+k3erleb
+k6erlebe
+ker2na
+ker4nei
+4k3erneu
+ker6n5eur
+k1ero
+ker8oberung.
+ke1rod
+2k3eros
+ker4reg
+k2ers.
+2kersa
+kerz2
+k1erz.
+ker4zeu
+2k1er2zi
+k6es.
+ke2s3a
+k1ese
+ke2sel
+kes2sa
+ke2t1a
+ket2ag
+kete4
+ke4t1eb
+ke4tel
+ke4th
+ket3ha
+ket3s
+ketta4s
+kett3h
+ke2tu
+ke1up
+keu6schl
+2k1e2va
+2k1e2x
+4k3f4
+2k3g2
+kga4s1
+kge3s2
+2k1h4
+kho3m
+k3hu
+ki3a
+ki4ad
+kia2r
+ki1ch
+2ki2de
+ki3dr
+k2ids
+2kidy
+ki2el
+kie4lei
+kiel3o
+2kiern
+kier2s
+kie4sa
+kie2z
+ki1f4l
+ki1f4r
+ki3k4
+2ki3l2a
+2kilä
+ki3lo
+3kin.
+4kindex
+2k1indi
+2k1indu
+2k1inf
+king3s
+2kinh
+k2ini
+kini3k2
+k2inn
+ki3n4o
+kin3s
+2k1inse
+2k1inst
+2k1int
+ki3or
+kio4s
+3kir
+2k1i2so
+kis2p
+kis5s
+kist2
+kiv2
+kive4
+2kiz
+2k3j
+2k1k4
+kkab4
+kl4
+4kl.
+4kla.
+2k1lac
+klan2
+2kland
+klan3du
+k4lar
+k1last
+k1lauf
+k3laug
+2k1läd
+k2lär
+k2le
+4kle.
+kle2br
+k3leg
+2kleh
+k3leit
+k3lem.
+2k3ler
+kle2ra
+2k3leu
+kle3us
+2klic
+k2lien
+k2lif
+2klig
+3k2lim
+k2lin
+k3lin.
+3k4lina
+k4link
+k2lip
+k2lir
+k2lisc
+2klist
+klit2s
+2k3liz
+2k3loc
+klo2i3
+2klok
+3k4lop
+k3lor
+klos2
+2klose
+klo3sse
+klost6
+2klöc
+2klöf
+k2löst
+k4löt
+k1lu
+klu4b
+k2lud
+k2lug
+k2lum
+2klux
+2k1lüc
+2kly
+2k1m2
+4kma
+kma2la
+kmas2
+kma3sse
+k2n2
+2k5nach
+2k3nad
+2knah
+2k5nam
+2k3näp
+k3ne
+k4nec
+kne1e
+2knes
+2knetz
+2k5neu
+2kney
+kni4e
+2k5niv
+kno2bl
+k4nol
+2knorm
+2knov
+k3nu
+2knum
+k6nur
+1ko
+ko5ad
+ko2al
+2k3oas
+kobal2
+2kobj
+kob4s
+2k1o2fe
+kof3f2
+koh4a
+kohl2e
+kohle3i
+koh3lu
+ko3l2a
+ko3le
+kol2k3
+3kom
+4k3omn
+ko4mu
+k2on
+ko2nem
+kon2i
+kon3s4
+kont6e
+ko2nu
+2kop.
+2ko1pe
+kopfa2
+kop4fen
+kop6f5err
+2kops
+ko3pte
+2kopz
+ko3r2a
+kor2ba
+kor2bl
+kor2br
+2k1orc
+korden3
+korder4
+kor6derg
+ko2rel
+2k1org
+ko3ri
+kor3m
+kor4nac
+kor2n3ä
+kor4no2
+2korpi
+k2os
+ko4sk
+ko2s1p
+3kost
+k3osz
+ko2ter
+ko3ti
+kot4r
+kot1s2
+kot4tak
+k1ou
+ko3un
+3kow
+ko2we
+2k1o2x
+1kö
+k2öf
+k1ö4l
+2k1p2
+2k3q
+k2r2
+2k3rad
+2k3rah
+k4ral
+kras3
+kra4ss
+k3rats
+2kraum
+k4raw
+k4raz
+k4räc
+2kräd
+k4rän
+2k3räum
+2k5re.
+2k3reak
+2k3real
+2k3rec
+2kred.
+2k3rede
+2kredn
+2kredu
+2k3ref
+4kreg
+2k3reic
+kre1i2e4
+kreier4
+k3reif
+2k3reih
+2kreim
+krei6sei
+kreli1
+k3ren
+k3res
+2kresu
+k3rev
+2k3rh
+2krib
+2k3ric
+2k3ries
+2krip
+k3risi
+krob4
+k4roch
+4k3roh
+k4roi
+k4rok
+k4ron
+k4rop
+kro4ss
+kro3st
+2krot
+3kroth
+k3rou
+2kröh
+2kruf
+2k3run
+4k1s
+ks3ab
+k3sac
+ksa2k
+k4s1amt
+k2san
+ks3a2r
+k2sau
+k2sav
+k2säh
+ksch4
+ks2chi
+k2s1e2b
+k2s1ec
+ks1ei
+ks2eid
+ks2eif
+k4seind
+ks2end
+k2s1eng
+k2s1ent
+ks1er
+ks2ere
+k2serf
+k2serg
+k2serk
+k2serl
+k2sers
+k2serw
+k2s1e2v
+k2sex
+k2s1i2d
+k2s1in
+k4s1is
+ks3kl
+k4sm
+kso2
+k3s2on
+k2sop
+k2s1or
+k2sö
+ks1pa
+k2spal
+k3s2pat
+k2spä
+k3spe
+ks2pel
+ks2pen
+k2sph
+ks2por
+ks2pul
+ks5s2
+kst2
+k2stal
+k4s3tanz
+kstat4
+ks3tat.
+k3stäl
+ks4tel
+ks1tie
+k4stier
+k2s1tis
+k2stit
+k2s1tor
+k4strop
+k2stuc
+k2stum
+k2s1tur
+k2stüt
+k2s1u
+k3sul
+ks2zen
+4k1t
+kt1abr
+kt1abs
+k2t1ad
+k3tag
+kt1akt
+k3tal
+kt1am
+k2t1an
+kt2and
+k2t1a2r
+kta4re
+kta3ri
+k2t1au
+kt3aug
+ktau2s
+ktä3s
+kt1äu
+kt1ein
+k2t1ela
+kte3li
+kte4n1
+k2t1ent
+k4tentl
+kten3z
+kte1ra
+kt4ere
+k4t3erfo
+kt1erg
+k2t1erh
+k2terö
+kte3ru
+kt1eta
+k2tex
+k2t3h
+k2ti2d
+kti2me
+kt3ing
+kt1ini
+kt3inn
+k2tins
+kt2is
+kti2s1e
+kti2st
+kti4ter
+k2t1of
+k3t4ran
+kt3ras
+k2t3rau
+kt4ro
+ktro3me
+kt3run
+kt3rü
+kt1s
+kt3s4a
+kt3sä
+kt3se
+kts2el
+ktsen1
+kts1o
+kt2sor
+kts2pa
+kt3s2z
+ktt2
+kt1ums
+k2tuns
+kturen4
+kt3z
+ku2al
+ku1c
+kud4r
+3kug
+ku2h
+2k1uhr
+kuh3s
+ku3la
+ku3l2e2
+ku3l2i
+2kulp
+kul2to
+kul2tr
+kum2e
+2kumg
+2k3uml
+kum2s
+k2u3n2a
+kun3da
+kun4s
+kunst3
+2kunt
+2kunw
+2k1up.
+kur2bl
+ku2rei
+kuri2e
+2k1urk
+ku2ro
+kurs1c
+kur2sp
+kur4ste
+kur4str
+2k1urt
+kus3a2r
+ku4schl
+ku2sp
+kus3ses
+kus1ta
+ku2su
+ku2ß
+2kut.
+1kü
+kü1c
+3küne
+3kür
+kür2s
+2k3v
+2k1w
+k3wa
+2k3z2
+kze3l
+3la.
+la3ar
+l1ab
+3l2ab.
+la3b2a
+l2abä
+2labb
+lab2br
+2labd
+2la2ben
+4labf
+4labg
+2labh
+3labil
+la2bit
+2la2b3l
+2labn
+3lab2o
+4labo.
+la3b4ra
+2labs
+la2bus
+2labw
+2labz
+la1ceb
+l2ache
+lacks2
+1lad
+2l1ada
+2ladd
+la3de.
+la3d2i
+2ladj
+2l1adl
+2ladm
+2l1a4dr
+3l2adu
+2laf
+la2fa
+la2f1ei
+laf1r
+laf3t4
+la2fu
+3lafü
+la2ga
+lag3d
+l2ager
+4lagg
+la2gio
+lag3l
+la4g3n
+lago4
+la2gob
+2la1ho
+3lai
+lai4s1t
+lake2
+la2kin
+l2akk
+la1k4l
+la2kro
+lak3t
+2l1al
+3lala.
+la2lar
+3lali
+4lalt
+l2ama
+lami3t
+lam2m1a
+lammen8ge
+1lammf
+2lamn
+la2mor
+l2amp
+l3ampu
+2l1amt
+lamt2s
+la4mun
+la2na
+la3nad
+l1anal
+la3nan
+la4nat
+la4nau
+2la2nä
+3l2and
+lan2da
+lan4dam
+land3au
+lan6d5erw
+lan6d5erz
+lan6d5inn
+lan2d3r
+la2nem
+lan3erd
+laner4f
+2lanf
+lan6g5esc
+lang3s2
+2lanha
+l2anhe
+2lanl
+2l1ann
+l1ano
+la2nof
+2l1anp
+2lans2
+l1ansi
+l4ant.
+2lantw
+2lanw
+lan2z1w
+3lao
+2l1apf
+la2ph
+l1a2po
+lap2pl
+la2r1an
+2larc
+lar1e2b
+la2r1ei
+la2rel
+la4rene
+larf4
+lar3g
+lar3ini
+la2ro
+2l1arom
+l1ar3t
+lart4h
+l3arti
+3laru
+l2as.
+la4sam
+la4sä
+4lasd
+la5seb
+la4sei
+la4s1e2l
+l2asg
+2lash
+la2sin
+la4sis
+2lask
+la2so
+2la2sp
+3lasser
+l2ast
+la2sta
+last3an
+la4steu
+las2to
+la2str
+last3ri
+las3tro
+las3tur
+la2stü
+1la2ß3
+lat2ak
+la3t2e
+la4tel
+la5t4i
+2l3atl
+2latm
+lat2o
+la2tö
+la2t3ra
+lat4ri
+lat6schm
+2lat4ta
+lat4tex
+lat2th
+lat4t3in
+lat2t3r
+latzer4
+1laub.
+lauben6s5
+lau2b3r
+laub4se
+laub4st
+lau4fin
+lau2fo
+lau4fri
+1laug
+lau3gl
+3laun
+4laun.
+la4us
+2l1ausb
+lau6scha
+2lausd
+2lausf
+2lausg
+2lausl
+2lausr
+2lauss
+2lausz
+2lauto
+lau2tr
+la3va
+lave4n
+1law
+lawa4
+l2ay
+lä1c
+2l1ähn
+1länd
+l1äpf
+2läq
+lär4mar
+l1ärme
+2lärz
+lä2s5c
+lä4s3s
+2lät
+2läub
+2läuc
+2läue
+1läuf
+2läug
+2läx
+1là
+4l1b
+l3bac
+l2bant
+lb3a2ri
+lbau1c
+lb1ärm
+lbb4
+l4b3eink
+l4b3eise
+lbe4ral
+lbe3rei
+lberin5
+lbe7s
+l4b1e2ta
+l2b1id
+l2b1ins
+l3b4lat
+l3b4lä
+l2b3led
+l2bli
+l3b4lo
+l3b4lö
+l3b4lu
+l2b1o2ra
+lb3rea
+lb2s2
+lb3sa
+lb3se
+lb3si
+lb3so
+lb3sp
+lbst3ac
+lb4ste
+lbst3ei
+lbst1u
+l2b1uf
+l3bum
+lbu4n
+lbus3s
+lbzei2
+2l1c
+l3ca
+lch2au
+l3che
+l4chei
+l4chent
+lchermas8
+l3chi
+lch3le
+lch3li
+l3chlo
+lch3n
+lch1ob
+lch3r
+lch3s2
+lch3ü
+lch1w
+l3cl
+l3co
+4l1d
+ld3a2b1
+ld2ac
+ld3ack
+l2dad
+l2daf
+lda2g
+l2d1ah
+l2d1ak
+l2d1al
+l2d1a4n
+ld3ane
+lda2r
+l2d3ari
+ld1arm
+ld1ass
+l3dat
+l4d3ato
+l2d1au
+ld3au4s
+l3däm
+ld1är
+ld1ät
+ldbus2
+l3de.
+lde4ben
+l2dein7
+l2deis
+l2d1elf
+l2d1e2mi
+l2d1ems
+lde4na
+lden5erg
+l4dentl
+l3der.
+l4d3erfa
+l6der6geb
+ld1erh
+l4der4he
+l3d2erl
+l6derlas
+l6derlaß
+l3d2ern
+l2d1er2p
+lder4tr
+lde3sa
+lde4sel
+l2d1es2s
+l2dex
+ldi2c
+ld1id
+ld1i4mi
+l2dob
+l2dop
+ldo2r
+l2d1ori
+ld2os
+ld2ö2
+ld3r
+ld4ram
+l2dran
+l2drec
+ld5rie
+ld4ris
+l3d4ru
+l2drüc
+ld3sa
+ldt4
+ld3th
+ldt5s
+ld3tu
+l2d1ul
+l2d1um
+ldy2
+1le
+3le.
+le2ad
+le3ar
+le2as
+3le3ba
+leben4s3
+le2bl
+le2b3re
+2lec
+lech1a
+le2chi
+lech7t6e
+le2er
+le3f2a
+2l1eff
+le2g1ab
+leg1as
+le2gä
+lege1i
+le2gl
+3leg4r
+3leh
+4lehe.
+leh3r2e
+4lehs
+4leht
+lei4ble
+l2eid
+leif1a
+lei4fan
+lei4fei
+leifer6g
+2l1eig
+3leih
+lei3l2
+leim3p
+l2ein.
+leinbu4
+leinbus5
+l2eind
+lein4du
+l4eine
+lei6nerb
+le2inf
+le2ini
+4leink
+4l1einn
+l3einsa
+2leint
+l2einu
+le4is
+leisch5a
+lei8schei
+lei6scho
+lei6sern
+l1eisf
+lei6ss5er
+leis3st
+lei4ßer
+l2eit
+lei2ta
+leit3sk
+leits4t
+3leko
+2lektr
+2lekz
+3l2ela
+le2le
+le3lei
+2lelek
+6leleme
+le3len
+le3les
+2lelf.
+l2eli
+lel3s
+l2em.
+le2m1au
+le2m1ei
+3lemes
+3lemet
+lem1o2
+le2mor
+2lemp
+le2mu
+le4mun
+l4en.
+len1a
+le4na2d
+le4n3an
+le4n3a2t
+2lency
+l1endp
+4lendun
+l4endur
+le2n1ed
+4lenerg
+le4neur
+4leneuv
+len4gag
+len4kau
+len4k3lo
+len4klu
+l1enni
+len6sein
+4len4sem
+len6serk
+len3ska
+len3sz
+2l1entk
+4lentla
+2lentn
+4l3en4tro
+4l3entw
+lent4wä
+5lentwet
+2lentz
+2l1enzy
+leo2f
+le1os
+2lep
+3lepa
+3lepf
+4l1e2pi
+lep4pi
+3lepr
+lep5t
+l2er.
+l2e1ra
+le2rag
+le2rap
+le2ra4s
+le2rau
+le2r1ä
+le2re2b
+ler2ec
+l3ereig
+le4r3ei4m
+le4r3eis
+le2rel
+le4reng
+le4rerg
+lerer5k
+le4rers
+l3erfas
+2l1erfo
+l2erfr
+l2erfü
+l1erg
+l2erga
+l4ergef
+3lergeh
+6lergen.
+l4erger
+l4erges
+3l4ergew
+2lergi
+l2ergl
+l2ergr
+lergro3
+4l3erhol
+lerin4s
+lerk2
+l2erka
+2lerke
+l1erkl
+4lerklä
+l4erkle
+l2erko
+ler3kr
+ler3l
+5l6erlebe
+3l4erlei
+2lermä
+ler4nal
+3l4erne
+ler4nei
+2l1erö
+3l2erra
+ler4ric
+l4ers.
+l1ersa
+ler4sto
+le2rup
+l4erwa
+ler4wer
+2ler2wo
+2l1erz
+ler2zä
+l3erzeu
+ler2zo
+l4es.
+les2am
+les2e
+le3seb
+le3sei
+2l1esel
+le3s4h
+lesi1
+le3sk
+les4ki
+les2ko
+le2spo
+les3se
+les3si
+lest6
+leste3r
+lester6i
+3lesu
+4lesw
+2lesy
+2le2tap
+2le2tat
+le2thi
+let2i
+letsche6
+let2to2
+lett1r
+lett1s2
+le2u
+4leue
+3le3u2f
+l2euk
+2l1eul
+le3unt
+3l2eut
+le2vol
+2lex
+3lexik
+le2xis
+3ley
+4l1f
+l3fah
+lfäs3
+l2f1ec
+lfe1e
+lf3einh
+l2feis
+lf2en
+l4ferei
+lfe4rel
+lf1erl
+l3fi
+l3f4lä
+lf3led
+lf3lo
+l3f4lu
+lf3ram
+lf3res
+lf4ru
+lf4rü
+lf2spe
+lf2s1ti
+lf2su
+lfun2
+lfur1
+2l1g
+l3gas
+lga3t
+lgd4
+lgen2a
+lgeräu3
+l2geti
+l3g2i
+lg2lö
+l3go
+lgoa3
+lg4p
+l3g4ra
+l3g4ro
+lgro3s
+lg2s
+lg4s3t
+2l3h2
+4lhe
+3lhi.
+1li
+l4ia
+li2ad
+li4am.
+lian2g
+li2ast
+3lib4
+libi3
+li1c
+lich4ta
+lich4to
+4lick
+li2cl
+li3d2a
+2l1ido
+li4ds
+liebe4s3
+li1efa
+3liefer
+li1efk
+li3efl
+lie4n1a2
+li3ene
+lie4rei
+lie4s3c
+lie4sta
+lif4fes
+lif2fo
+3lig
+li4g3ers
+lig4n
+lig4ra
+li2gre
+ligs2
+li3ker
+li3k2o
+likop4
+lik2sp
+lik4tau
+lik4ter
+lik2t1o2
+lik2u
+li3l
+lil2a
+li3m2a
+lima1c
+limat4
+2l1imb
+2limm
+3limo
+2limp
+lin2a
+li3nar
+2l1indu
+li2nef
+li2neh
+li2nep
+li5ner
+li2nes
+2l1inf
+2l1inh
+lin1it
+2l1inj
+lin4kan
+lin4kar
+link2s
+li2nol
+l2ins.
+l2insa
+4linsel
+2linsp
+2linst
+2l1insu
+2linsz
+2l1int
+li3nu
+2l1inv
+2linz
+li2o
+li4om
+lion5s
+3li1pf
+3lipt
+3lis.
+li3s2a
+li3schm
+li4schu
+4lis2h
+li3shi
+2l1isl
+2lisol
+2lisot
+li2sp
+liss4
+2liß
+lit4a
+li2tal
+li3t2ä
+l2i3t2e
+li1th
+li2t3r
+lit1s2
+lit3se
+lit3sz
+li4tun
+li2tur
+litz4er
+3liu
+liv2e
+li2vea
+li2ves
+livi3e
+li3vr
+4lixi
+li2zau
+li2z3ä
+lizei3
+4l3j
+2l1k
+l3kale
+lk1alp
+l3k2an
+l3kap
+l3kar.
+l3ke
+lk1erd
+lke3r2e
+lk2l
+lk3lad
+l3k4las
+lk3lic
+l3k4lu
+lk2men
+lk4ne
+lk5ner
+lkor2b
+l2k3ru
+lk2s1
+lkse2
+lk4spe
+lkt2
+lk2ü
+4l1l
+lla2be
+l2labk
+ll2abr
+l2labt
+l3labu
+ll3acht
+lla2de
+ll1aff
+lla3gl
+l2l1am
+ll3a2ma
+ll2anb
+lla4ner
+l2lani
+l3lans.
+ll4anwa
+ll1anz
+ll3appr
+ll1arm
+lla6tern
+l2lath
+l4latm
+l2l3att
+l2lau
+ll3aufg
+ll3aufk
+llau2s1
+l4lausf
+ll3aust
+l2la2w
+l2l1äm
+l3läs
+l2läu
+llb2
+llch4
+lld4
+l2le2b
+ll5ebene
+l3lec
+ll1ech
+lle3er
+l2l1ef
+lle2gu
+lle2he
+l2leib
+ll1eic
+ll1eim
+l4l3eise
+lle2la
+l3len.
+lle4na
+ll3endl
+llen3dr
+ll3endu
+llen6dun
+llen5se
+l4lentf
+l4lents
+l3lep
+l3ler.
+lle2ra
+l3lere
+l6lereig
+ller4fo
+l8lergene
+l4lergo
+l4l3ermi
+l4l3ernt
+ll3ertr
+ll6erwei
+ll2es
+l3les.
+l2le2se
+l2leuc
+l3leur.
+ll1exe
+llf4
+llg2
+l2lieb
+l2lieg
+lli4gan
+l3lik
+lli4la
+l2l1ind
+l4linf
+ll1ins
+llin6sen
+l2lipo
+ll3k4
+ll5m2
+ll3n2
+ll1ob
+l2lobe
+l2lo2d
+l2lof
+llo2ge
+ll3ol
+ll1opf
+ll1or
+l4lorb
+l2lo2ri
+llo2te
+l2l1ou
+l3low
+llö2g
+l3löh
+ll2säu
+ll2s1es
+ll3ska
+ll2spr
+ll4stor
+ll3t
+llt2e
+llt2i
+llti2m
+llt4r
+llts2
+llu2d
+llu2me
+l3lung
+l2lu2p
+ll1ur
+llust6
+l3lut
+l2lüc
+llü2d
+l2lü2g
+l3ly
+ll3z2
+4l1m
+l2m3a2b
+l2m1ad
+lm1a2ge
+lm1aka
+l2m1a2m
+l3mana
+lm1apf
+lm1art
+lm3att
+lmä2s
+lm1ä4st
+lm1c
+lmd2
+lm3e4dit
+l2m1ef
+l2m1e2p
+lmer2
+l2m1erf
+l2m1erl
+l2m1erz
+l4messa
+l2m1id
+lm1ind
+lm1ins
+lm3m
+l2mof
+lm1orc
+lm3p2
+lmpf4
+lm3s2k
+lms2t
+lm3str
+lm3s2z
+lm3t4
+l2mum
+l4munt
+4ln
+lna2r
+ln3are
+l3n2e
+lnes2
+l2nin
+lnus2
+l1nü
+l1ny
+1lo
+lo4ak
+3lob.
+l2oba
+3lobb
+lobe4s
+2lobj
+l1o2bl
+l2obr
+lob4ri
+lo4chel
+3lodr
+2loe
+l1of
+lo2fe
+lo4gh
+lo2gl
+lo2gor
+lo2gre
+lo3h2e
+4l1ohr
+loi4r
+3lok
+4l3okk
+lo2k3r
+5loks
+l4ole
+2l3o2ly
+lomä3
+lo2min
+lo4nin
+lo2n1o
+lo2o
+2lope
+lop2p1a
+lop2pr
+2lopt
+lor3am
+lor2an
+lo4rä
+3lorb
+2l1orc
+2l1ord
+lo3r2en
+4l1or3g2
+4lork
+4lorp
+2lort4
+lo4sa
+3lose
+lo4ske
+lo2spe
+lo2s1pr
+los3ta
+lo4stel
+lo4steu
+lo2s3to
+lo2s3t4r
+lo2ßu
+lo2t1a
+lot4e
+lot2h
+lo3tha
+loti4o
+lots2
+2l1ov
+lo2ve
+2lox
+1lö
+lö2b3
+2löck
+2löd
+lö2f
+2l3öfe
+4lög
+2l1öhr
+2lök
+2l1ö4l
+2löp
+3lösc
+4löß
+4löz
+2l1p
+lp2ar
+l4p1är
+lp2f
+lph4
+l3phä
+l2phir
+lp1ho
+l3phr
+lpt4
+l3pu
+2l1q
+2l3r2
+lra4ss
+lrau2s
+lrebs2
+lrö4
+lrös3
+lrut4
+4l1s
+ls3a4b
+l3sac
+l2sa2d
+l3s2al
+l4s1amb
+l4samp
+l2san
+ls3ane
+l3sare
+l3sarg
+l3sark
+lsau2
+lsau4m
+lsau4r
+l3s2äm
+lsä6s
+ls2äug
+ls1äus
+l4schin
+l4schmü
+l3se.
+l2s1e2b
+l3seil
+ls2ele
+ls1eli
+ls1er
+l2serf
+l2serg
+l2serh
+l2serk
+l2serl
+l2sers
+l2serw
+lse2t
+ls1eta
+ls3ha
+l2s1id
+l2simp
+ls2kal
+l3s4kele
+l4skla
+l4sko
+ls2ky
+l2sop
+l4s3ort.
+l3sos
+l3s2öl
+l2spac
+ls2pe
+l2s3ph
+l2s1pir
+ls2po
+l3spri
+ls2pu
+l3spul
+l2spun
+l4s3s2
+lst2a
+lstab6
+ls2taf
+l2stas
+l4s3tat.
+l4state
+l3stau
+l4s3täti
+l4st3erk
+l4s3terr
+l2s1tis
+l2stit
+l4stoch
+ls1tor
+l4stor.
+l4store
+l4stors
+ls2tra
+l2s1trü
+l3suf
+ls1um
+l2s1un
+ls2und
+ls3unk
+4l1t
+l3ta.
+l2tab
+lt1abs
+ltag4
+lt1alg
+lt1am
+l3tami
+ltampe4
+l3t2an.
+ltan3d
+l2t1ap
+lt1ara
+lt1art
+l3tarta
+l3tartu
+l2t3ato
+l2t1au
+lt3aut
+lt1äh
+ltbau1
+lt1eh
+lt1eig
+l4t1ein
+l2t1eis
+l2t1elt
+lte3mi
+l3t2en
+lten6gel
+lten4sp
+l4tentl
+lt3ents
+lte4ral
+lter4fa
+l3t2erg
+lter6ken
+lter4nä
+lt2erö
+lter4se
+l2t1esk
+l3t2est
+l3tet.
+l2t3h
+l3thas
+l4thei
+lt4hem
+l3t4hu
+l2ti2d
+ltimo4
+l3tine
+lti3t
+l2t1o4b
+l2t1o2f
+l2tord
+l2torg
+l2t1o2ri
+lto2w
+lt1öl
+l3tön
+lt1ös
+lt1öt
+ltra3l
+lt3räu
+lt3re
+lt3ris
+lt3rol
+l2t3rö
+l4ts
+lts2eh
+lt2se2l
+lts3ort
+lts1pe
+lt1s2ph
+lt4stec
+lt2sti
+lt3t
+lt1uh
+l2t1um
+lt2um.
+lturan4
+ltu2r1i
+lu1an
+4lu2b3
+luba2
+lub5s2
+lu2dr
+lu2es
+1lu2f2
+2l1ufe
+2luff
+lu3fo
+luf4t1a
+luft3e
+luft3r
+lu2g1a
+lu2g1e2b
+lu2gei
+lugen1
+lu2g3i
+lug3l
+lu2go
+lu2g3r
+lug3se
+lu2gu
+2l1uh
+lu1id
+lu1is.
+lul2ö
+lumbi1
+lume4
+2lumf
+2lumg
+l1umh
+2lumk
+2luml
+l2ump
+1lumpe
+lum2ph
+2lumr
+2l1ums
+lu3mu
+2l1umw
+2lumz
+1lu2n
+2l1una
+2l1unf
+2l1uni
+2lunr
+2l1uns
+2lunt
+2lunw
+4lu2o
+lu2pf
+2lur
+l2ura
+lu2r1an
+lu2rei
+lu2ri
+l1urn
+lu2ro
+l1urt
+lu4ru
+lu2san
+2luse
+lu2sp
+lus4s3a
+lus2s1c
+lus4sei
+lus3sen
+luss3er6
+lus2s1o
+lus2s1p
+lus4s1t
+1lust
+lu2sta
+lu2stä
+lu6sterl
+lu2st1o2
+lu3str
+lust3re
+lu2s1u
+4lu2ß1
+lu2t3a4
+lu2tä
+lu2t1e4g
+lu2tel
+luter2
+lut3erg
+luter4s
+lu6t5ersa
+2luto
+lu2t1o2f
+lu2top
+lu2t1or
+lu2t3r
+lut5schl
+3lux
+2lüb
+3lübd
+lück4e2
+lücker3
+2lüd
+2lüh
+lü2hel
+lüh1l
+2l1v2
+lva3
+l3vl
+l3vo
+lv3r
+4l3w
+lweis4s
+2lx
+1ly
+ly1a
+ly3c
+2lymp
+3lyn
+ly3no
+ly1o
+ly3onn
+3lys4
+ly3t
+2l1z
+lza2
+l2z1ac
+l2z1ag
+l2zan
+l2z1ap
+l2zat
+lz1aus
+l2zäp
+l2zär
+lze2l
+l2zele
+l4z3enth
+l2z1er2h
+l2z1id
+lzi4m
+lz1imi
+lz3l
+l2zo2f
+l2zö
+lz3t2
+l2z1u4fe
+lzug4s
+l2z1ur
+lzvol2
+lz1w
+lz2wec
+l2zwu
+1ma
+3ma.
+maa2
+m1ab
+m3a2bar
+m2abä
+2mabb
+m2abe
+2m3abf
+2mabg
+2mabk
+m2abli
+2mabm
+m2ab4ra
+ma2bri
+2mabs
+2mabt
+ma3chan
+mach2e
+mach8terh
+mach8t7ers
+mach4tr
+ma2ci
+mack2s
+ma3dac
+mada2m
+m2adä
+ma2del
+2m1adm
+2m1a2d4r
+ma4d2s
+ma2es
+ma1f4
+mag2a
+ma2ge.
+ma2geb
+ma2gef
+ma2geg
+ma2gek
+ma2gep
+ma4ges.
+ma2get
+ma2gev
+ma2gew
+2m1agg
+magi5er.
+magi5ers
+ma3gl
+2magm
+ma3g4n
+2m1ago
+mahl2s
+ma1ho
+mai4s3e
+ma2ke.
+2m1akt
+mal2ag
+mal1ak
+ma4lakt
+ma2lan
+ma2l3at
+ma2lau
+2mal2de
+m2aldi
+ma3l2e
+ma4lex
+mali1
+mal3lo
+mal3lö3
+2mallt
+m2alp
+mal3t4
+malu2
+ma2l3ut
+3malv
+ma2mid
+mam3m
+2m1a2nal
+ma2nar
+2m1a4nat
+ma2nau
+2m1anä
+2manb
+man2ce
+man3d4
+man3ers
+ma2net
+m2anfr
+man3g2
+m4angel
+man4gl
+2m1angr
+m2anh
+3manip
+2manl
+m2anle
+man3s
+2m1ansa
+2mansä
+man4sh
+man2th
+mant3he
+2mantw
+manu3
+2manw
+2manz
+m1anza
+ma2or
+ma1q
+4marag
+mar2an
+2marb
+mar3g2
+3ma1rh
+ma3r2i
+m2ark
+mar2kr
+4mar2o
+maro3d
+4marr
+mar6schl
+mar6schm
+mar6schr
+mar2sp
+mar2su
+2m1arti
+ma3r2u
+m1arz
+ma3s4a
+mas2e
+3ma1s2p
+ma3sses
+mas6ses.
+mas6sest
+mass1t
+ma3s2su
+3mas2t
+ma2sti
+ma4sz
+ma2ta2b
+ma2tan
+ma2tä
+m3a2tel
+ma4t3erd
+ma4t3erz
+m4atme
+2matmo
+ma4tort
+3matr
+mat3se
+mat1sp
+matta3g
+matt4r
+mat3url
+2m1au2f
+3maul
+3ma3un
+mau3r
+2mausd
+mau4ss
+mau2ta
+m4ay
+ma1yo
+1mä
+3mäc
+2m1ähn
+mäh1r
+4m1änd
+3männ
+2mäo
+2m1äp
+mär1
+mär2kl
+mär2z
+mä1t4r
+mäu2s1c
+2m1b4
+mbe2e
+mbera2
+mbe3r2e
+mbert4
+mble1i
+m3br
+mbu3sc
+mbut2
+2mc
+m3ch
+2m1d
+m2dan
+m2d1a4s
+md3ato
+md1är
+mde2a
+m2dei
+mder2
+m2d1erl
+md3ras
+md3s2e
+mdt4
+m2d1um
+1me
+me3a
+meau2
+meb4
+me2ben
+3mebr
+me1c
+medi3e4
+me1ef
+me3e4n1
+mee4rei
+2m1eff
+meg4
+mega3
+me4gel
+3meh
+meh6l3er
+meh6rert
+2m1eif
+2m1eig
+m2ei3l2
+mein4da
+meiner6k
+3m2einu
+m2eist
+me3l4ant
+me2l1au
+melb2
+mel3d2
+melde3i
+me2lek
+2melem
+me2ler
+melet2
+2melf.
+3melk
+mel4k3ei
+mell2i
+3melo
+me2lob
+mel2se
+mel3t4
+6mel6tern
+2m1e2mis
+2m1emp
+2m1e2mu
+m2en.
+me3nage
+me4n3an
+men3ar
+me4nas
+men3au
+2mendl
+menen1
+4men4gag
+men3ge
+me2nim
+men3k4
+men2on
+men4se.
+6mensemb
+men4sen
+men4ser
+men4ses
+men2so
+menst4
+m4enta
+men4t3ak
+ment5eig
+men6t5ers
+2mentn
+ment4sp
+me1o
+2meou
+2meö
+2mepa
+2m1e2pi
+3m4er.
+me1ra
+me3rak
+mer4as
+mera3um
+me2re2b
+me4rens
+mer4err
+mer4erw
+mer3f
+4m3ergän
+me3rid
+merin4d
+merin4t
+4merklä
+m4ersh
+mer3sm
+mert4r
+merz6eng
+3mes
+me2sal
+me2sä
+mes2e
+4meser
+mes2po
+2mes2sa
+mess3an
+mes6ser6g
+mes2s1o
+mes2sp
+mes2st
+me2str
+me3sze
+3me2ß3
+me3ta
+me3th
+met6t5en6d
+meu1
+2m1ex
+me2xe
+1mé
+2m1f4
+mfi4le
+2m1g2
+2m1h4
+1mi
+mi3a2b
+mia2n
+mi1ä
+mibi1
+mic1e
+mi1ch
+mi2ci
+mi3da
+mi2di.
+mi3dr
+2midy
+mie3dr
+mi3ele
+mi4e3no
+mierer4
+mie4rob
+mie2ti
+mie2to
+mie2tr
+mi1f4
+3mige
+mi3h
+mi2k1an
+mi2kar
+mi2kel
+mi2kin
+mi3k4l
+mi3kr
+mi2ku
+mi3la
+milch1
+mil4che
+mi3l2i
+mil3le
+4milz
+m2im2a
+2m1imm
+2mimp
+min2ac
+min5anze
+m2inde
+2m1indu
+mi2nef
+miner1
+mi4n3e4ri
+min2eu
+2minfo
+min2ga
+mings2
+2minh
+mi3ni
+mini3k4
+mi3n2o
+mi4n3of
+2m1inse
+mi3nu
+mioni1
+mi1p
+3mir.
+3miri
+3mirs
+3mirw
+3mirz
+3mis.
+mi2sa
+mi3sau
+mi4scha
+mi4schr
+mi4sch3w
+mise1
+mis2p
+mis5sar
+mis4ser
+mis4s1t
+mi2sta
+mi2ß1
+3mit
+mi2ta
+mite2
+mi2t3h
+mi2to
+mi2tr
+mi3tra
+mit3s2
+mit5sa
+mit3ta
+mit3t2e
+mi2t1u
+4mitz
+mi3v2
+2m1j
+2m1k4
+m3kn
+2m1l2
+ml3c
+m3le
+ml3f
+ml3k
+m3lo
+ml3p
+ml3s
+2m1m
+mma3a
+m2mab
+m2m1ak
+m2m1al
+m2mans
+mm1anz
+mm1art
+mm2as
+mmas4p
+mma2ß
+m2m1au
+m2mä4
+mm1äu
+m2m1e2b
+mme2c
+m2m1ef
+m4meh
+m2mei
+mm1ein
+mm3eise
+mme4lin
+mme4na
+mm2ene
+m4mentl
+m4mentw
+m2me2nü
+mme4r3a2
+mme4rec
+mme2s1
+mmes3a
+mme3sc
+mme4sz
+m2me4te
+m2m1eu
+mmi3el
+mmi3k
+mmi3m
+mm1inb
+mm1inh
+m2m1ins
+mm1int
+mmi3sc
+m4mita
+mmi3tw
+m2mo2l
+m2mor
+mm3p2
+mmpf4
+mms2
+mm3sa
+mm3si
+mmt2
+mm3te
+m2mum
+mm2un
+mmu3r
+m2mus
+mmül2
+2m3n2
+m4nesi
+1mo
+mo2be
+2mobj
+2m1obs
+3m2od
+mo3de
+mode3s
+mo2dr
+m1of
+mo2fe
+3mog
+2mog.
+mo2g1al
+3m2oh
+moh2a
+moi3r
+mo2k1l
+2mol.
+mol3d
+3mom
+mom2e
+3m2on
+mo2nä
+mon4dac
+mon4del
+mon2do
+mo2ner
+mon2i
+mon3s2
+mont2a
+mon3th
+mo1ny
+3m2o2o
+2mo1pe
+mo2per
+2m1opf
+2mopt
+mo1ra
+mo2rak
+mor2an
+mo2rar
+mor2d3a
+mor2dr
+morf4
+mor3g
+mor3t2
+3mos
+moster4
+mo2sto
+mot4r
+mous2
+2m1o2x
+mo1y
+1mö
+möbe2
+mö2c
+2mö2f
+4mök
+2m1ö4l
+m1ört
+4m1p
+mpa3ne
+mpe4lin
+mpe2n1
+m2p1ene
+m2pf
+mpf1ef
+mp4f3erf
+mpf3erg
+mp6fer6ge
+mpf3erp
+mp6ferpr
+mp4f3err
+mp4f3er4z
+mpf3l
+mp2fr
+mp1haf
+mp1hos
+mp3lei
+m4p3lem.
+m2p3len
+m2ples
+m3pon
+mpor6ter6
+mpot2
+mps2
+mp3sh
+m3pu
+2m1q
+2m3r2
+4m1s
+m2san
+ms1as
+m3sat
+msau3e
+m2s1än
+msch2
+m3se.
+m2s1e2d
+m2s1ef
+m2sein
+m2se2le
+mse2n
+m2s1ene
+m2sent
+ms1erf
+ms2erh
+m3set
+m2s1eu
+m2sex
+mso2r
+ms1ori
+m2spä
+m2sped
+ms2por
+m2spot
+m2spro
+ms2pu
+ms3s4
+m4stag
+m2stal
+m2stit
+ms1ums
+m2sü
+2m1t
+mt1ab
+mt1ak
+mta2m
+mt1ar
+mt3arr
+mt3aug
+m2t1e2d
+m3tei.
+mt1ein
+mt1eis
+mt1elt
+m4tenga
+m4t3engl
+mt1ent
+m4tentf
+m4tentg
+m4tentr
+m2t1erb
+m4t3erei
+m2t1erf
+m2t1erg
+m2t3e2r1i
+m2t1erk
+m2t1erl
+m2t1ers
+m2t1ert
+m2t1eta
+m2t1eu
+m2t1ev
+m2t3h
+m2ti2d
+m2tim
+m2t1in
+m2t1i2r
+mti2s
+mt1ita
+mtmen2
+mt1ob
+mt1op
+m2t1öl
+mt1ös
+mtra4s3
+m2t3ro
+m2trö
+m4ts
+mt2sa
+mts3chi
+mt3sco
+mt2s1e
+mt3send
+mt3s2ka
+mt3s4kel
+mt1sor
+mts3tät
+mt1um
+mtu3re
+mt3z
+1mu
+mu1a
+2m1uh
+mu3la
+3muld
+3mult
+m4umb
+3mumi
+m1ums
+mum2s1p
+3mun
+mun6derf
+mu2ner2
+4m1unf
+4m3ungeb
+mu3ni
+mu4nin
+4mu4niv
+4munw
+4munz
+muru2
+mu4r1uf
+m4us
+3mus.
+mu4s1a
+3musc
+mu2s1o
+mu2sp
+mu3s4se.
+mu3s4ses
+mus4ste
+must4e
+mu2s1to
+mu2str
+mu2su
+muße3
+mut4str
+1mü
+2müb
+3müh
+mü2her
+mühl1a
+mül4len
+3mün
+mü3s2si
+3müt
+2m1v
+mvoll1
+2m1w2
+mwa2
+mwa4r
+mweg2
+mwel4t3
+mwu1
+3my
+my1al
+my3l2
+2m1z2
+mzel4li
+mzu1
+mzug4
+1na
+3na.
+2n1ab
+na2bä
+n3abh
+3nabi
+na2b3l
+na4bor
+na4bos
+na2br
+nab4rü
+4n3abs2
+na2b3u
+3na2c
+nach1
+nachen4
+na5chen.
+n3achse
+nach3sp
+nach8t7ersc
+nacht8raum
+5nachw
+na3dab
+4nadd
+nade4l1
+na2der
+4n1adl
+4n1adm
+4n1a2dr
+4nadv
+3nae
+2n1af
+na1fra
+nag2a
+na2gem
+4n1agg
+n1a2gi
+na3gin
+na3g4r
+3n2ah
+na2h1a
+4n3ahn
+4n3aho2
+3nai
+nai2e
+n1aig
+4n1air
+nai4re
+n2ais
+2n1ak
+na2ka
+3nakä
+3nako
+na2kro
+4nakt
+n4al.
+na2l1a2
+nal3am
+na4lar
+na2lä
+2n1albk
+n2ald
+nal3da
+n4ale
+na2leb
+nal3ei
+na4l3ent
+na6lerei
+na4ler4g
+na4lerm
+na4l3erw
+nales2
+nal1et
+nal1ex
+nalf4
+nalg2
+nal3gl
+na2lid
+nal3la
+nal2ph
+nal3s
+n2als.
+nal3t2
+n2alty
+na2lu
+2naly
+na2mat
+3name
+na3me.
+4na2mei
+n4a3men
+4n1a2mer
+na2mid
+na3m4n
+3n2amo
+n1amp
+nam2sp
+2n1amt
+namt2s
+n1an
+2n3an.
+4na2na
+na4nat
+n3a2nä
+4n3anb
+n3and2
+nan1eu
+4n3anf
+4n3ang
+4nanh
+2nani
+4n3ank
+4n3anl
+3n2ann
+4n3anna
+4nano
+4n3anp
+2nanr
+4n3ans
+2nantr
+2nanw
+n2anz.
+nanzen4
+nan6zene
+nan6zeng
+na3ot
+na2per
+n1apfe
+4napfel
+na2pos
+na2pr
+nap2si
+n1aq
+n1ar
+3nar.
+na2r1a
+2narc
+n2ard
+n2are
+3nar2i
+n2ark
+n2arle
+n2aro
+na2rom
+nar2rh
+2nart
+n2arta
+n2arth
+na3r2u
+3nas
+n4as.
+na4schw
+n2asf
+4n1a2sp
+nas2s1c
+4n1assi
+4nasy
+nasyl4
+3naß
+3nat
+nat3au
+nat1ei
+na2th
+4natm
+nat2o
+4natom
+5nats1
+nat4sa
+n1au
+nauf4fr
+nau2fr
+5naui
+3n2aul
+4nausb
+4nausd
+4nausf
+4nausg
+4nausl
+n2auso
+4nausr
+4n3auss
+4nausw
+4nausz
+nau3te
+3nav
+nave4
+navi5er.
+navi5ers
+1nä
+4näb
+3n4äc
+3näe
+n1äf
+3näg
+3nähe
+nä2hi
+3nähm
+4n1ähn
+nä2hu
+3näi
+2n1ä2m
+4n1än
+2näp
+2näq
+nä2sc
+n2ä6s3s
+2näu
+3nä1um
+4näuß
+2n3b4
+nbe2in
+nbe3r2e
+nbu3s
+nby2
+2n1c
+n2c3ab
+n3can
+n3ce4n3
+n3ces.
+nch2a
+n3chl
+nch3m
+ncor2
+n3cu
+4n1d
+n2da2d
+nda1f
+nd2ag
+n3dai
+n2d1ak
+n4dakt
+n2dana
+n2dani
+n2danl
+nd1ann
+n2d1anz
+n3dap
+nd3arr
+n3dat
+nd3att
+nd1au
+n2daut
+n2dax
+nd1c
+nde4al.
+n2d1ede
+n3dee
+n2dei
+n4dei.
+nd3elfe
+ndel3l
+ndel4sa
+ndels5en
+nde4mot
+nden3sk
+n4dentl
+n4dents
+nde3o
+n5der.
+n5deren
+nderer3
+nd2erh
+n5deri
+nder6läs
+nde4rob
+n4de4ros
+n6der6sat
+n3d2es
+nde2se
+ndes3s
+n2deth
+ndia3
+nd1imm
+n2dob
+n2dof
+ndo2n3a
+n2dopt
+nd1or
+n2do2ri
+ndo3st
+n2d3ott
+n2dö
+nd2ös
+nd4ram
+n2d3rat
+nd3rau
+n2d3re
+n2drif
+n2droc
+n2drod
+n2d3rö
+n2drui
+n2d3run
+nd4sene
+nd2spr
+nd3th
+ndt4r
+n2duns
+ndwa5re
+ndy3
+1ne
+3ne.
+ne2ap
+3nea4s
+ne3at
+ne3au
+ne2bl
+2n1ebn
+neb4r
+2nec
+3neca
+3nece
+neck2a
+ne2dit
+2nee
+neei2
+ne3e4in
+ne3eis
+neema4
+neen2
+nee1r2
+nee3t
+n1ef
+n2ef.
+n2e3f2a
+2nefr
+2n1egg
+neg4l
+n1e2go
+neg4r
+n1e2he
+2nehe.
+2nehem
+2nehen2
+ne3her
+3nehm
+4n3ehr
+2n1ei
+3neia
+4neic
+nei4dei
+4neier
+3neigt
+3neigu
+4neing
+4neinh
+4neinl
+4neinz
+4neip
+neiss4
+ne2ke
+2n1eks
+nek3t2
+ne2l
+3ne3lä
+nel3b
+n1ele
+4nelek
+4nelem
+ne3len
+ne3l2i
+ne4lim
+ne4lit
+3nelk
+n2ell
+nel2la4
+nel4lei
+nel4lif
+3ne3l2o
+3nelu
+n2em.
+ne3mas
+4n1emb
+n1emi
+4n3emp
+2n1ems
+4nemu
+3nen
+n4en.
+n2e4n3a4
+ne5nac
+n2enb
+n2enc
+nen4dar
+4n1endb
+4n1endd
+4n1endf
+n1endg
+4n1endh
+4n1endk
+n1endl
+4n1endp
+4n1endt
+4n1endw
+ne2n1e2b
+nen3ei
+nene4m
+nenen1
+ne4nene
+ne2neu
+n2enf
+4n1engb
+nen4gen
+4n1engs
+4n1engt
+n1engu
+nen4gun
+n2enh
+ne4n3i
+n2enj
+n2enk4
+n2enm
+nen4nar
+ne2no4
+nen3s2e
+nen3sk
+nen3s2p
+5n2en3t2a
+4n1entb
+4nentd
+4nentf
+5n2enti
+4n1entl
+4nentn
+nen3to
+5nentr
+4n1ents
+4n3entw
+4nentz
+ne4n3u
+n2env
+n2enw
+nen5z2e
+ne2o3b
+ne2oh
+ne2or
+3nepa
+ne2pen
+2nepf
+ne2pi
+ne2pos
+nept4
+n4er.
+ne1ra
+ne2ra2b
+ne2rac
+ne2r3af
+ne2rag
+ne3r4al
+ne2ram
+ne2ran
+ne2r3ap
+n2erat
+ne2rau
+nerb2a
+4n3erbe.
+4n3erben
+2nerdb
+ne2re2b
+ne2rec
+5nerei.
+n1erf
+4nerfas
+3nerfr
+2nerfü
+2ner3g4
+3nergr
+n1erh
+4n3erhö
+3neri
+n2erj
+n1erk4
+5nerka
+n2erkö
+n2erli
+2n1erlö
+nerma3
+nermas4
+n1ermi
+n2ern.
+2n1ernä
+4n3erneu
+2n1ernt
+n1eros
+n1eröf
+ne1rös
+n2ers.
+2n1ersa
+4n3ersts
+nert4
+3nert.
+ne2rup
+n2erv
+4nerwar
+2n1erz
+nerz2a
+n2es.
+ne2sei
+ne2s1ev
+2ne3sh
+nesi1
+ne3ska
+ne2s1of
+ne2s1or
+ne2s1pa
+4n1es2si
+2n1e2st3r
+4nesyn
+3n2eß
+ne2tab
+2ne2tag
+net1ak
+ne2t1an
+2ne2tap
+2n1e2tat
+ne2tau
+ne4te2l
+ne2th
+ne4t3ha
+ne3the
+ne3ti
+ne4tin
+net1s2
+n4ett
+net3ta
+net3te
+net3tr
+2n1e2tu
+net4zer
+net2z1i
+ne2u
+neu1c
+neu4ere
+neuer4f
+neuer4k
+neuer4r
+neuer4s
+neuer4w
+neu3g4
+n2eun
+2n1eup
+neur2
+3n2evi
+ne2vol
+n2ew
+2n1ex
+5ney
+3nez
+3né
+2n1f
+n3f2al
+nfalt2
+n3f2ang
+nf4ar
+n3f2ä
+n3f2en
+n3f2er
+nf2es
+n4fex
+nff4
+n3fi
+nfi4le.
+nf4le
+nf2o
+nf4r
+nf3s2
+nf2tan
+nf3tei
+nf2t3r
+nft2st
+nft4ste
+n2f1u
+4n1g
+n2g1ac
+ng1ad
+n2g1ak
+ng1a2me
+ng1ams
+nga2n
+ng1and
+ngang6st
+n2gans
+ng1ant
+n3g2ars
+n2g1a2v
+n2g1äl
+ng3d4
+n2g1ein
+nge3l4ei
+n3g4en
+n5gene
+nge5nerw
+ngenmas6
+ngen3s2
+nge4ram
+n2g1erg
+ng3erse
+nger4zä
+n3g4es
+nge3s2a
+nge3sp
+ng3hu
+n2g1id
+ng2lad
+ng2läs
+n2glic
+ng4lok
+n3glot
+ngma7sse.
+n2gn
+ng3ne
+n4g3ni
+ng4nom
+ng2nu
+ng2ob
+ng1opf
+ng1or
+n2gö
+n2g3rai
+ng4ran
+n2g3rat
+ng3roc
+ngro3s
+ng2s1
+ngsa2g
+ngs3an
+ngs3au
+ng5schr
+ng4s3e4h
+ngs3pa
+ng4stec
+ngt2
+ng3ts
+n2gum
+ngzei4t
+4n3h2
+n7halts
+n5he
+nhe2r
+1ni
+3n2ia
+ni3ak
+nibb4
+nib4l
+ni1ce
+n1id
+3n2id.
+ni2de
+3n2i3de.
+4nidee
+n2idi
+ni3dr
+2n3idy
+n2ie
+nie3b
+ni1el
+nie3l2a
+nie4n
+ni3ene
+ni3eni
+nie4rei
+ni4erna
+nie4sa
+ni2eu
+ni1fl
+ni2g1a2
+2n3i2gel
+2niget
+nig3li
+ni2gn
+ni2gre
+nig4san
+nig4sp
+nihi3
+ni2kar
+3nike
+ni2kel
+ni3k4erh
+ni2ki
+nik3ing
+ni2kor
+ni2k3r
+nik3t4
+3n2il
+ni3l2a
+ni3l2i
+nil3l
+4n3imp
+n1in1
+3nin.
+n2ina
+nin2ac
+ni2nal
+3n2inb
+2nind
+2ninf
+3ning
+2ninh
+4nink2
+3nino
+ni2nor
+3n2inp
+2nins
+n2ins.
+4n3int
+n2i3nu
+4n3inv
+3n2inw
+ni2ob
+ni3ok
+ni3ol
+ni3ora
+n2ip
+ni4ron
+n1irr
+3n2is
+ni4sam
+ni2san
+ni2sä
+nis3cha
+ni4schw
+ni2s1e
+ni3se.
+nis3el
+ni2som
+4nisot
+ni2sp
+ni3spi
+nis5s4
+ni2stu
+ni3stun
+ni2s1u
+2nit
+3nita
+ni1th
+ni2ti
+nit2o
+3nitr
+nit3s4
+nit4tec
+nit6tell
+nit6ter6g
+nit6t5er6k
+nit4tie
+nit4tra
+nitt3ri
+nitt4sa
+niv2
+3nix
+2n1j
+4n1k
+nk1abr
+n2k1ac
+nka2ge
+n3kal
+n4kalg
+nk1ang
+nk1apf
+nk3art.
+nka3sc
+n2katm
+nk1aus
+n2kaut
+n2k1äh
+n2k1äp
+nk1ei.
+nke4lei
+n4kelem
+nkelma3
+nkelmas6
+nke4na
+nken4te
+nk2er
+n4k3erle
+nke4ros
+nk3ersa
+nke2t
+nk1eti
+n2ketu
+nk1id
+n2kim
+nk1inh
+n2k1ins
+n4klade
+n3klag
+nk3leis
+n2k3len
+nk3les
+n3klin
+nk2lo
+nk4nac
+nk4neb
+n2knis
+n2knit
+n2k1o4be
+n2kopt
+nko2r
+nkord2
+nk1ori
+nko4rie
+n2k1ort
+n2köl
+nk4rab
+nk3rät
+n4kre.
+n2k3rel
+n2kren
+nk3rep
+n2k3rez
+nk3ro
+n2krol
+nk2sal
+nk2se
+nk3sen
+nk2so
+nks2ti
+nk3s2z
+nk2tak
+nk4terg
+nk4t3ern
+nkte3sk
+nkt2et
+nk2tin
+nkt1it
+nk2top
+nkt1r
+nkt3ric
+nk2tro
+nk2tru
+nkt4sen
+n2kum
+nk1ums
+nku2n
+nk1urh
+n2küb
+2n3l2
+nle2ga
+nle3x
+nli4ne
+2n1m2
+n3ma
+n3mä
+nmen2s
+n5mi
+4n1n
+nna2be
+n2nada
+n2nalg
+n2n1all
+n2nan
+n2nau
+n3nä
+n3nec
+nn2ei.
+n4nein
+n3nelb
+nne4le
+nne3lu
+nn2ens
+nner4ei
+n6n5ereig
+nner4fü
+nner6geb
+nn4ergr
+nn2erh
+nn2erk
+nner4la
+nn2ero
+nne2rö4
+nn3erwa
+nner6war
+nner2z
+nne4s1e
+n2ness
+nn2eu
+nn2ex
+nn3f
+nng4
+n3n2i
+n4n3iso
+nno2b
+nno3be
+n2nof
+n2nop
+nno2r
+nn1ori
+nn4sam
+nn3se
+nn3s2p
+nnst4
+nns3tat
+nn4stoc
+nn2stö
+nn3t2a
+nn2th
+n2n1uf
+n2n1unf
+nn1ur
+1no
+3no.
+no5at
+n2obel
+2nobj
+no2bla
+n2oble
+3noblo
+3noblö
+2n1obs
+no1c
+noche4
+noch4r
+2no2d
+no3dr
+no2ed
+n1of
+no2fe
+2noff
+2n1oh
+n2ohe
+no3id.
+2n3okk
+nok2l
+n4ol.
+n3ole
+no2leu
+no4lig
+no2liv
+2no2ly
+3nome3
+3nomp
+non2e
+n1onk
+n1ont
+2nony
+3n2opa
+no2per
+no2pi
+n1ops
+3nor.
+nor2a
+no2rad
+n2o1rak
+no3ral
+no3r4ar
+2norc
+nor4da
+3nordb
+nor4des
+nor2d5r
+no3r2e
+2n1org
+3norh
+3n2orl
+5norm
+norm2a
+nor3mal
+3norö
+3nors
+2n1ort
+3n2os.
+nos2e1
+no3sh
+no5sk
+no2sp
+2nosti
+nost1r
+2nostv
+nos2u
+no2tan
+no3tart
+no2tä
+not1e4i
+no6tentr
+no2ter2
+noterb3
+no2tex
+not3h
+no2tho
+no2t3in
+no2t3op
+no2tr
+3nov
+2n1o2x
+3noz
+2nöd
+4nö2f
+4n1ök
+4n1ö4l
+n2ör
+nö4s3s
+1n2öt
+4n3p4
+npa2ge
+npf4
+npsy3
+2n1q
+6n3r2
+nran2
+nra4s3s
+nräu3s
+nrebe2
+nreli1
+nre3sz
+nrö2s
+nrücker6
+4n1s
+n3sabo
+n2sa2d
+n4s1agi
+ns3a2k
+n2sall
+nsa2r
+ns3are
+n3s2arg
+ns3ari
+n3sark
+nsa4s
+ns4ath
+nsau4r
+nsau4se
+n2saut
+ns2av
+ns2ax
+n2s1än
+ns2äug
+n2s1äus
+n4schef
+nsch5eul
+n4schl.
+nscht4
+n3schu
+nsch7werd
+ns4cr
+ns1eb
+ns2eh
+nse2ha2
+nseh5ere
+nsei4n
+n4seinf
+n4seint
+ns2ele
+ns3elem
+n2sem.
+nsen4sp
+n2sepo
+n2s1erf
+ns1erg
+n2serh
+n3seri
+ns1erk
+ns3erle
+n4s3erne
+n2serö
+ns1ers
+n4sersc
+ns3ertr
+n2s1erw
+n2serz
+n2seth
+n2s1eu
+nsfi4l
+ns3hor
+ns1id
+nsi4den
+n2simp
+n2sini
+nsinn2
+ns3int
+nsi2te
+nsi2tr
+n3s2kal
+n3s2kel
+ns2kis
+n3skle
+n3s2ky
+n3smara
+n2s1o2d
+ns1of
+n2soff
+ns4om
+n2s1ont
+n2sop
+ns2orc
+n4s3ort.
+nsp4
+ns2pac
+n3s2pek
+ns2pel
+n5s4pen
+n4speri
+n2sph
+ns2pi
+n5spie
+n2spo
+n2sprä
+n4s3prie
+n2spro
+n4s3s2
+nst1ak
+n4stale
+nsta2n1
+nst3ane
+n2stas
+n4s3tat.
+n6staten
+n4stats
+ns2tau
+n5s2te.
+n4steif
+nst5eife
+nst7einhe
+ns4tem.
+ns4ten.
+n4stent
+ns4ter.
+nst5erge
+n7stern
+ns4tes.
+n5steu
+n5s2tic
+n4stilg
+n2stob
+n4stole
+nst5opfe
+n4strac
+n4strad
+n6strieb
+n4strik
+ns4trun
+ns2tum
+nst3u2t
+n3suf
+ns2um
+ns1un
+ns2ung
+n2s1urs
+n2sut
+n3sy
+ns2zin
+4n1t
+n3t2a3c
+ntak4ta
+nta4lin
+n4t1all
+nta2lo
+nt2alp
+nta3ne
+n4tansp
+nt1ant
+n4tanza
+n3t2arb
+nt1ark
+n3t2arm
+n3taro
+nt1art
+n4tarti
+nt3artu
+n3t2arz
+n2tath
+n2tauf
+nt1äm
+n2t1äu
+n3te.
+nte3au
+nte1e
+nte3g6
+n2t1eh
+n3tehe
+n2teig
+n4t1ein
+n2t1eis
+nt1e2mo
+nt4en
+n3ten.
+nte4na
+nten6te.
+ntera4
+nte6r5eis
+nt4erh
+nt4erk
+nt4erm
+nt4ern
+nt4ers
+nt4ert
+n3tes2
+nte3sa
+n4t1ess
+n6testri
+n3tet.
+n2t1e2ta
+nteu3
+nteu6eri
+nte3v
+ntge4n
+nt3hel
+nt3ho
+nt4hos
+n3thr
+nt4hu
+n2t5hum
+nt4hy
+nt2i
+ntim3p
+nt3inf
+n2t3inh
+ntini1
+n3t4lem
+ntmen2
+ntmo4
+ntni2
+ntnis1
+ntopf3e
+n2torg
+n4t3o4rie
+nt4ral
+ntras3s
+nt1rau
+nt4raum
+nt3rea
+nt3rec
+n3t4ree
+nt3reif
+n3trep
+nt4repr
+nt3rich
+n4t3rieg
+nt4rig
+n2troh
+n3trop
+n2t3rü
+n4t1s
+nts2ah
+nts2p
+nt4s3par
+nt5spe
+nts2ti
+nt2sur
+ntt2
+nttü3
+ntu4re.
+n4tw
+nt3z
+1nu
+3nu1a
+nu4ale
+nu3a2r3
+nubi1
+2nuc
+nude2
+3nue
+nu2es
+nuf2
+nu2fe
+2n1uh
+3nuhi
+3nui
+nuk4
+nu3kl
+nu2kr
+null3eb
+nul4lin
+n2um.
+nu2ma
+2n3umb
+2numf
+2numg
+2numl
+3numm
+2numr
+2n1ums
+2n1umv
+2n3umz
+nu4n
+2nuna
+2n1une
+3n2ung
+4n3ungl
+4n1uni
+n3unk
+2nunr
+2nunt
+2nunv
+2nunw
+3nuo
+2nup
+2nur
+nu2ra
+nu4r2i
+nurs2
+nur2z
+3nu2s
+nu3sc
+nu3se
+nus1p
+nu3spo
+nuss3er4
+nu4s1t
+nu2ß1
+3nut
+nu2t1a
+n3uto
+nu2t3r
+3nuu
+3nux
+3nuz
+2nü4b
+nür1c
+1nüt
+2n1v2
+n3ver
+n3vl
+nvoran4
+2n3w
+nwei4st
+1ny.
+1nyh
+nyle4
+n1yo
+1nyr
+1nys
+1nyw
+4n1z
+n2z1ach
+n2z1a2g
+nza2k
+n2zan
+nz3a4ne
+n3zani
+n2zar
+nza4s
+n2zat
+n2z1au
+n2zän
+n2zär
+nze4l3a
+nzel3l
+n6zenerg
+n4zen4se
+n4zentl
+nz3erem
+n2z1erh
+nz1erl
+nzer4lö
+nz5erste
+nzer6tra
+n4zerwe
+n3z2es
+nze3sk
+nze3str
+nze2t
+nz1eta
+nze3u2t
+nz1id
+nzi2ga
+n2zinh
+n2z1ini
+nz1int
+nz3le
+nzlei3
+n2zof
+n2z1op
+n2zöl
+nzug2s
+nz1wa
+n2z1wä
+n2zwet
+n2zwir
+n2zwö
+n2z1wu
+ño1
+2o3a2
+o4a3bi
+o4ac
+oa3che
+oa3chi
+o4ad
+oa3de
+oa3in
+oa3k2e
+oak1l
+o4a3la
+o4a3mi
+oa4n
+o2a4r
+o2a3s
+oa4si
+o5ass
+o4at
+oa3te
+o5au
+o1ä
+o1b
+2ob.
+o3b2al
+obal3l
+ob2am
+ob2as
+ob1auf
+2o3b2ä
+2obb
+ob2e
+2obe.
+2obea
+2o3bec
+2obef
+o2b3ein
+2oben
+obe4na
+oben3d4
+o2ber
+o3ber.
+o4berb
+ober5eis
+1oberf
+ober3in
+oberin6g
+obe4ris
+7oberungs
+2obev
+2obez
+2o3b2i
+obi2t
+ob3ite
+3obj
+ob1la
+ob3lei
+1ob3li
+2oblo
+2ob2lö
+ob2lu
+2obo
+ob1or
+2obö
+ob3rei
+2obrü
+ob3s2h
+ob3sk
+obs2p
+2o3bu
+o4bunt
+obus3s
+obu2t3
+2o3bü
+o4büb
+2oby
+2oc
+o3ca
+oc1c
+o1ce
+och1a
+ocha2b
+ocha2r
+o1che
+oche4b
+o2ch1ec
+och1eh
+och1ei
+oche2l
+ocher4k
+ochi4d
+och3l
+och3m
+och1o
+och3ö2
+och3r
+ocht4
+o1chu
+ochu2f
+och3u2t
+och1w
+o3ci
+ock5ersc
+ock3sz
+ock3ta
+o1cl
+o3co
+o1ç
+o1d
+2o3d2a
+od3ak
+od2dr
+o3de2c
+o3d2e3i
+odein3
+ode4l3ag
+ode2n1
+ode2s1e
+ode3sp
+o3dex
+2o3dia
+odi3c
+2odif
+2o3dir
+2odn
+o2don
+odo4s
+2odr
+o2dre
+odt4
+2odu
+o3dy
+2o1e2
+oe4b
+oe3di
+oe4m
+oen1e
+o3er
+o4e3s
+oe4sc
+o2e3t
+o3et.
+oet4h
+o3ets
+2ofa
+of1a2d
+of1a2g
+of2ang
+of1au
+2ofä
+o2f1e2b
+o2f1ec
+o2f1e2d
+o2f1ei
+o2fent
+2o3fer
+o4f1erb
+2o3f2es
+o2f1e2t
+of1eun
+of2fa2
+of4fal
+of4fam
+off1an
+off3erz
+of2f1in
+of2fir
+of2fix
+1offiz
+of2f3l
+of2fo
+of2f3r
+offs2
+off3sh
+off3si
+off3sp
+off3t4
+of2fu
+of2fü
+2ofi
+ofi3k4l
+2o1fl
+of3le
+of3li
+of4lö
+2ofo
+2ofö
+2o1fr
+of3rä
+of4rü
+ofs1
+of2sa
+of4sam
+ofs2ch
+of2se
+of2si
+of2sp
+of4staf
+of2sto
+ofs2tr
+ofstra8ssen
+of2su
+2oft
+oft2a
+of2tei
+of3th
+2ofu
+of3ur
+2o1g
+o2g1ab
+o2g1ac
+oga3d
+og1ang
+o2g1ei
+ogeld2
+oge2l1i
+ogener4
+ogeni3
+ogen4id
+ogenmas6
+ogerätein8
+og2gl
+o3gh
+ogi2er
+ogin1
+o2g1ini
+o3gis
+og1l
+og2lo
+o3g4n
+ogo4i3
+og1o2ri
+og2s
+og3sc
+og3si
+og3s2p
+ogs1t
+2o1ha
+oh1alk
+o1hä
+o1he
+o2h1eis
+o2h1er2t
+o2h1er2z
+2o1hi
+2ohl
+ohl1a
+oh2la2d
+oh2lä
+oh3lec
+ohl1ei
+oh3lep
+ohler2
+oh4lerg
+oh4l3erh
+oh4lerw
+oh3lo2
+oh4l1or
+ohls2
+oh2lu
+ohm2a
+1ohmi
+oh3mu
+oh4n1ac
+ohn1ap
+oh3nee
+oh2ni
+1ohnm
+oh2n1o
+ohn3sk
+2o1ho
+ohol1e
+oho4len
+o2h1o2p
+2ohö
+oh3öl
+ohr3a2
+oh4rat
+oh2rel
+oh2rem
+ohren3s
+ohrer2
+oh4rerg
+oh3rie
+oh4rin
+oh2rol
+ohrt4r
+o1hu
+oh1w
+2o1hy
+2oi
+o1i2d
+oi4da
+o3ie
+o1im
+o1in
+o4ine
+oi2r
+o2isc
+o3isch.
+oi3se
+o1ism
+oiss2
+oi4st
+o1i2tu
+2o1j
+2o1k
+ok2a
+oka3b2
+ok3ac
+oka3i
+oka2la
+okale2
+oka6lere
+ok2e
+3o2kel
+oki4o
+ok1lä
+ok2li
+ok2o
+oko4pt
+ok2so
+ok2s1p
+oks2t
+ok3t2
+3okw
+2ol
+o1la
+ol3abu
+olaf4
+ol1ant
+ol2ar
+ol4arm
+o3l2a3s
+olast4
+ol1a2v
+4o1lä
+ol1ät
+4olc
+ol2chr
+ol4d1am
+ol2dä
+ol2d1ed
+ol2dei
+ol4d3eng
+old5ersa
+ol2deu
+ol2dim
+ol2d3o
+ol4dr
+4ole.
+o2l1ef
+ol1eie
+o2l1eis
+oler2
+o2l1er3t
+ol2e3u2
+ol1exz
+o1lé
+ol2fa
+ol2fem
+olf3ere
+ol2f3l
+olf1r
+ol2f3ra
+olft4
+olge4ne
+ol2gl
+ol2g3r
+ol2i
+olie4n1
+oli2er
+oli3k4
+oli3tu
+3oliv
+oli3ze
+ol2kl
+olk3re
+oll1ac
+ol4la4d
+ol2l1ak
+ollä2
+ol2läd
+oll1eb
+ol4l1ec
+ol2lei
+oll3ein
+ol3lem
+oller6ge
+ol4ler4k
+oll3erw
+oll3ess
+ol2lic
+ol4li4st
+ol2lo2c
+ol2lo2g
+ol2lö2
+olls2
+oll3sa
+oll3sp
+ol2lu
+ol3lus
+4olo
+ol2of
+olo1p
+ol1ort
+ol3s2k
+ol3te
+ol3t4h
+ol3ti
+o1lu
+olu2th
+ol2y
+ol2z1a
+ol3zan
+ol4z3ern
+ol2zim
+ol2zo
+ol2zw
+2om
+o2mab
+oma2bl
+o2m1a2ge
+om1alg
+om1all
+oma4ner
+o4mante
+o2m1ap
+o2m1ars
+o2m1art
+omar4te
+o2m1a2sy
+o3mat
+o2m1au
+o2meb
+om1ebe
+o2m1ef
+o2m1ei
+o2mel
+o3meld
+o5men.
+o4mep
+om1er2h
+omer2s
+o2meru
+om1er2z
+omi2c3
+omiet1
+o3mig
+om1ind
+om3ing
+om1ins
+o2m1int
+om3ma
+om3mä
+om3m2e
+om3mu
+o4mn
+3omni
+4omo
+o2m3oa
+o2m1org
+om1o2ri
+om3pf
+omp4l
+oms2
+om3sk
+om3t4
+o2mum
+o4munt
+o3mus
+2ona
+on3a2b
+ona3g
+o3nal
+onaler6e
+on3ann
+onan6z5ei
+on1ap
+o2narb
+ona3th
+onat2s
+on2au
+2onä
+on1äh
+2onc
+on2dan
+onderer5
+onde8rers
+ond1r
+on2dra
+on4drin
+ond3sk
+2one
+on1ec
+o3nee
+o2nef
+one3h
+on3ein
+one2m
+on1ema
+one2n1
+o4n3ends
+on2eng
+o3ner.
+o2n1erb
+on1erd
+oner4fa
+on1erg
+o2nerh
+on4erka
+on1erö
+on1ers
+o3nett
+on2eu
+on3f2
+on3gla
+ong4r
+ong3s
+on2gue
+2o3ni
+on2i3d
+onie3g
+o4nikr
+o4nim
+o4nind
+on3ing
+o4ninh
+on2inn
+o4nins
+on3k2
+1onke
+3onkel
+onli2
+onli6n
+onlo2c
+2onn
+on3n2an
+on3n2e
+ono1
+o3nod
+o2nof
+o2noke
+on1orc
+on3ord
+ono3s
+onot4
+ons1a2
+on2seb
+onsen1
+onse2t
+on4sho
+onsi2d
+ons3ing
+on4s3l
+ons1p
+onst2a
+ons3tie
+onst4r
+on3ta
+on2t1eb
+on2te2l
+ont5end
+on4t3erl
+on2th
+on4t3rat
+2onuk
+o3nur
+2onut
+on3v
+1ony
+on3z2
+onze3in
+o1ñ
+oofs2
+1oog
+oo2ka
+oo2k3l
+oo2kn
+oo2mo
+o1op
+o1or
+oor3d
+oo4sk
+oo2su
+oo2t1a
+oot1ei
+oo4t3h
+oo2tr
+oot2s1t
+oo2tur
+2o1ö4
+2op.
+o1pa
+opab4
+op1akt
+opa2le
+o3pas
+1ope
+2ope.
+o1pec
+2o1ped
+op1ef
+2o1pei
+o1pek
+2opel
+ope3l4a3
+2open
+o2pera
+op1erh
+o1pes
+2opf.
+op2f3a
+op3fah
+op2fä
+o2pfe
+op2fin
+opf3la
+op1flü
+op2fo
+op3for
+4oph2
+o3phe
+o1p2i
+opi5a2
+opi3er.
+opi5ers.
+opie4r3u
+opin2
+2opl
+op3lag
+o2p3le
+op3li
+o3p2n
+2opo
+opo2la
+op2pan
+op4pl
+1oppo
+2oppt
+2o1pr
+3o4psi
+ops2t
+op3sz
+1op3t4
+o2pum
+2opy
+2o1q
+2or.
+or1a
+2ora.
+o1raa
+2or3a2b
+o2rabb
+o2r3add
+or3adr
+o1r2ag
+1orake
+o1ral
+oral5l
+o4r3alm
+or4alt
+or2am
+or3a2mi
+o1ran3d4
+oran2f
+oran2m
+oran4ze
+or3ap
+2orar
+or3arr
+o1ras
+o2r3att
+2orau4
+orau2s
+oraus6wa
+2o1raw
+o3rä
+or1änd
+or1ät
+orb2l
+or1c
+2orca
+or2ce
+2ord.
+2orda
+ord1am
+or2dar
+or2dau
+2ordb
+ord3eng
+orde4s
+or2deu
+or4d3ing
+or2d1ir
+or2dit
+1ordn
+or2do4
+2ordr
+ord3t
+2ordu
+2ordw
+2ore
+ore2a
+o2r1e2b
+o2r1eck
+o5ree
+or1eff
+ore2h
+or1eig
+oreli1
+orems2
+o2r1er
+o3r2ere
+orer1i
+o3r2ero
+or1e2th
+o2r1eu
+2orf
+or2far
+orf3li
+or3g4a
+2orget
+or3ghi
+2orgia
+orgi1e
+or2gl
+or3gla
+or3gle
+or2gn
+2orgr
+2orh
+2oria
+2oric
+4o3rie.
+o3rien.
+o6rienti
+o3rier
+4oril
+or1ima
+ori4mi
+4orin1
+o2rind
+2oris
+2oriu
+2ork
+or3k2a
+or4k3ar
+ork4r
+ork3s
+2orm
+or2mam
+or4mans
+orm3asp
+or2m1eb
+or4m3erf
+or4m3er4g
+or2mor
+orm3ord
+or2mum
+ormu4n
+or4muni
+or4munt
+ormvol4
+ormwa5
+or2n1ac
+or2nal
+or2nar
+or5ne.
+or3ni
+or4nin
+or3no
+2o1ro
+o2r1ob
+or3oly
+oro3n2a
+or1opf
+o2ro2r
+o3rou
+o2r1ox
+2o1rö
+2orp
+2orq
+2orr
+orr4a
+or3r2e
+or3rh
+2ors2
+or3s4a
+or3sh
+or3si
+or3sk
+or3sz
+or2t1ak
+or2tan
+orta2r
+or2tau
+or2tef
+orte4n
+or4ten5g
+ort3erb
+or4t3ere
+ort3erf
+orter6fa
+ort3erg
+or4terk
+or4t3erl
+orter6sc
+or2t3e2v
+or2the
+or2tin
+or4t3off
+or2to2r
+or2tö
+or4trau
+or4t3räu
+ort3re
+or2t1um
+2o3ru
+or2uf
+or1uh
+orum4s
+o4r3un
+o5rus3
+o2rü
+o2rya
+or3z2e
+o1s
+2o3s2a
+osa3b
+os3ad
+osal2
+2osc
+o4s3ca
+osch3ar
+o3sche
+osch3le
+2ose
+ose1e
+ose1in2
+os2el
+ose2n
+osens2
+o2s1er4k
+os2ex
+2osh
+o3s2hi
+os4hu
+2osi
+o3sk
+o4ska
+os2kal
+o4ski
+2os2kl
+2os2ko
+o4skr
+os2lo
+1osm
+os4mog
+2os2o
+osol1
+o2sö
+2osp
+os1pec
+o3s2po
+2oss
+os6s3ac
+oss3ala
+oss3and
+os4sä
+o6ssel
+o3ssem.
+oss3en4k
+o3ssent
+oss3enz
+oss1ep
+oss2er
+oss3er4b
+osser4e
+oss5erei
+oss3er4f
+o4ssi
+os2s1o2
+os2sp
+oss1pa
+os2s1t
+os2su
+os2t
+ost1a
+o2stab
+o3stal.
+osta4s
+ost1ei
+oste2n
+o4s3tep
+o4sterd
+oster3e
+ost5erwe
+oster8wei
+ost3eur
+ost3h
+o2stid
+o2stin
+ost1o4b
+os3ton
+o2st1or
+ost3ran
+o2st3rä
+ost3re
+ost3rot
+ost3uf
+2osu4
+os1um
+2osy
+o3s4ze
+2oß
+o2ß1el
+o2ß1en2k
+o2ß1enz
+oßer2
+o2ß1erb
+o2ß1ere
+o2ß1erf
+oß1is
+oß1u
+2o1t
+o2t1abi
+ot1ah
+o2t1ak
+o3tal
+o3tam
+ot1ant
+ota4s
+ot1ast
+o2t1au
+o3tau.
+ot1ä
+o2teb
+ote1i
+o4t1eib
+o4t1eic
+ote3i4n
+o4t1eis
+ote4l1a
+o3tem
+o4t1emi
+ot2em3p2
+ote4na
+o4tentb
+ot3entr
+ot1erb
+o4t1er4l
+o4t1erw
+o3the
+o4them
+o2t3hi
+o2thr
+4oti
+ot2id
+o2til
+o2t1i2m
+ot2in
+ot3inh
+o4tl
+otli4
+ot2o
+otob4
+ot3opf
+oto4rei
+o2t1ö
+o3tran
+otra4s3
+ot3rat
+ot4rau
+ot3re
+ot3rin
+ot3roc
+ot3ru
+ot2s3at
+ots1o
+ots1p
+ots2pe
+ot3s4tra
+ott3akt
+ott3an
+ot2t1a4s
+ot2tau
+ot2teb
+ot4terh
+ot4terk
+ot3te4s3
+ot2t3h
+ott2o
+ot2t3r
+ot3t4ra
+ot3t4ru
+ot1url
+oub4
+ouff6
+ou1f4l
+ou4ge
+ou3gl
+o1uh
+ou1is.
+ou4le.
+ou2les
+2o1um
+2o2u2n
+oung5
+oun4ge.
+oungs2
+o4up
+4our
+oure2
+ou2ret
+ouri2e4
+ourme4
+our4ne.
+ou3s2i
+ou3s2t
+o4ut
+3outp
+out3s2
+outu4
+2o1ü
+o1v
+ov2a
+2ovel
+o3ven
+2ovi
+oviso3
+2ovo
+2o1w
+o3wec
+owe2r1
+o2wh
+o3wi
+o2wu
+o1x
+2ox.
+ox2a
+2oxk
+ox3l
+o2xu
+1oxy
+o1yo
+2o3z2
+3o4zea
+ozen4ta
+ozes4sc
+ozir3
+ozon1a
+oz3z
+órd2
+ö1b
+öbe4l3i
+öb2l
+ö2ble
+ö2b3r
+ö1ch
+öch3l
+ö2chr
+öchs2t
+öch6st5ei
+öchst3r
+ö1d
+öde1r
+ödi3
+ödin3
+1ödu
+ö1e
+1öf
+öf2fa
+öf2fl
+öf3l
+öge3le
+ögen4s1
+ög3l
+ög3r
+ög2s
+ö1he
+öhe4n1
+öhl2e4
+öhre4
+öh3ri
+öh2s
+ö1hu
+ö3ig.
+ö3isch.
+ö1ke
+1ö2ko3
+ök3r
+ök2s
+ö2l
+3öl.
+öl1a2
+öl1ei
+öl1em
+öl2f1ei
+ölf2er
+öl1in
+ölk4e
+öl2k3l
+öl2la2
+öll1an
+3ölm
+öl2nar
+ölo2
+öls2
+öl3sa
+öl3sz
+öl3tu
+1ölu
+ölz2w
+ö1m
+öm2s
+ön2e
+ö3ni
+önizi1
+önn2e
+öo1
+öo2ta
+öoti1
+2öp
+ö1pe
+öpf3l
+ör3a2
+örb2e
+ör2b3l
+ör1c
+ör2dr
+ör3dra
+ö2r1ec
+ö2r1ei
+ö2r1e2l
+ö2r1em
+öre2n1
+ö2r1ene
+ö2rent
+ö3r2erb
+ö2r1er2e
+örer2f
+ö2rer2g
+ö2rer2l
+ör2err
+ör2erw
+ö3r2erz
+ör1ess
+ör2f3l
+ör2gl
+ö2rim
+ör2kl
+örn2e
+örner4v
+ör1o
+örpe2
+örs2e
+ör3sk
+ört2e
+öru4
+ö2r1une
+ö1s
+ö2sa
+2ösc
+ö2sch3a
+ösche2
+ö4sch3ei
+öscher3
+ö6sch5erf
+ö6sch5eri
+ö2schi
+ö2sch1l
+ö2sch3m
+ö2schn
+ö2schw
+ös1ei
+ö2sein
+ös4en
+ös4es
+2ösl
+ös2o
+ö2sp
+ö3s2s
+ös4s1c
+ö4s3set
+ös4st
+ös4t
+ö2st1a2
+ös4u
+ö1ß
+ößen3
+öß2ti
+ö1t
+ö2t3a
+öte4n1
+ö2t3r
+öt2sc
+öt2tr
+ö1v2
+ö1w
+ö1z
+öze3
+özes4
+1pa.
+1paa
+1pac
+p2ad
+pa3da
+2p3a2dr
+pa1fr
+1pag4
+pa3gh
+pa1ho
+1pak
+pa1k4l
+pak2to
+3pala
+pala3t2
+3palä
+3pal2e
+pa3l2i
+1palm
+pal2ma
+pal2mä
+pal2m1o
+2palt
+pal2ta
+pal4tei
+pal2tr
+pa2m3a
+pa2nar
+pa4n3at
+pan3d
+pan4ds
+pa2neu
+panf4
+pang4
+pa4nisl
+pank4
+2panl
+2pann
+panne2
+pan4n3eb
+4pannu
+1pa2no
+pan3sl
+pan3t4h
+1panto
+2pantr
+panz2
+pan5ze
+1pap
+papi2
+papieren8
+papie8r7end
+pap2pr
+pa1q
+1para
+pa4r3aff
+par3akt
+pa4rant
+2parb
+1p2arc
+par3d
+2parer
+parer8geb
+1parf
+2parfö
+2parg
+pargel6d
+1park.
+par4k3am
+par4kau
+par4kr
+1parks
+par3m2
+par3ne
+1pa2ro
+2parp4
+2parr
+4parta
+1parti
+1partn
+3party
+par3z
+pas2e
+pa1s2p
+pas6sein
+passer4
+pas6serg
+pas2s1p
+pas2t
+pa2ßu
+pat1a
+pat4c
+pa3t4e2
+2patel
+1pat4h
+1pati
+1pat4r
+1pau
+2p1auf
+pa3uni
+2pausz
+1pav
+pay2
+1pä
+3päc
+päck3er
+3päd
+päde2
+pä2d1er
+3pär
+3pä4s3
+pä4t1e2h
+pä4tent
+pä4tep
+pä4t3erb
+pät3h
+pä2to
+pä2tr
+pät5s
+2p1b
+pbe1
+2p3c
+2p1d2
+pda2
+1pe.
+pe2a2
+pea4r
+pea4s
+p1e2b
+pech1
+1peda
+1peel
+pe2en
+2pef
+4p1eff
+1peg
+pei1
+2peic
+1peil
+p2eim
+2peis
+1peit
+pekt4i
+1p2el
+3pel.
+pe2l1a2
+pe4lai
+pe2l1ä
+peld4
+3pele
+pe4l1e2h
+pe2l1er
+pe2let
+pe2leu
+peli2d
+peli4n
+pe4l3ink
+pel3inn
+pel3k
+pel3l2a
+pel3lä
+pel3l4e
+pell2i
+pe2lob
+3pels4
+pel3sp
+1pem
+1pen
+pe3nal
+pe4nas
+pen3d2a
+pe4nen1
+pe4ni2t
+pe2n1o
+pens2
+3pen3si
+pen3so3
+pen3sz
+pent2a
+2pentw
+penty2
+pe2nu
+1pep
+pe3pi
+pept2
+pe1ra
+per2am
+per3as
+pe2r1ä
+pere2b
+perer4f
+pe3r2i3d
+3perio
+1perle
+1perlh
+3pero
+perra2
+per4r3an
+per4rä2
+per4ric
+per6rieg
+1pers
+2perse
+2persi
+3perso
+3persp
+peru2
+pe3run
+1perü
+perwa4r
+pe3s2a
+pes2e
+pese2n
+1pes5s2
+pes2t
+pest1o
+pe4stop
+3pet
+pet4r
+1pé
+2pf.
+p2f1ab
+p2fad
+p2faf
+pf1ai
+p2f1ak
+pf1am
+pf1ans
+p2fa2r
+pf3are
+p2f1au
+1pfä
+p2fär
+p2f1äu
+4pfe.
+p2fef
+p2fei
+pf1eim
+pf1ein
+pfe2l
+p3fen.
+p4fener
+p2fent
+p4f1ep
+pfe2r5a
+p4ferde
+pfer6pro
+pf4es
+pf3f4
+pffa3
+p2f1i2d
+pf1inn
+p2f1ins
+pf1lam
+pf4lan
+pf3lä
+pf4leg
+pf3lei
+pf3lo
+p2f3om
+p2for
+pf3r
+pf1ra
+pf4rü
+pfs2
+pf3sa
+pf3se
+pf3sl
+pf3so
+pf3sz
+pf3t4
+p2fum
+2p3g2
+pgra2
+1ph
+2ph.
+phal4te
+p1hand
+3phas
+p1hau
+phä1
+3phän
+2phb
+2phd
+2p1hei
+phen3d2
+phe4n1e
+phen3s
+2ph1ers
+2phf
+2phg
+phik1a
+phi4kan
+2phk
+ph2l
+2phm
+2phn
+p2ho.
+p2hob
+pho2s
+2phö
+ph4r
+2phro
+2phs
+ph3t4
+2phthe
+phu4s
+phu3t
+2p1hü
+3phy
+2phz
+pi2a1
+piab4
+pia3k4
+pi4ali
+pia3n
+piap2
+pia3s
+pi1ce
+pi2el
+piel3a2
+1pier
+pie2ra
+pie4reb
+pies4
+1pig
+pi3gl
+1pil
+pi3le
+3pilo
+pil4zer
+pil2zw
+p2im
+3pin.
+pi2nad
+3ping
+pingen4
+ping3s
+3pins.
+3pinse
+pin3s2p
+pi2o
+pi3o2i3
+pi3onu
+pi3os
+3pip
+pi2pe
+3pirate
+pi3ri
+3pirin
+1pis
+2piso
+pis2t
+pi3sto
+pit2a
+pi3t2h
+pit2s
+pitz2e
+pi2z1in
+2p1j
+2p1k2
+pku2
+1p2l2
+2pl.
+3pla
+p3lab
+4p3lad
+p3lah
+pla3na
+pla2y
+3plä
+2ple.
+ple1c
+ple2e
+p4leg
+ple3n2
+2p3ler
+p3les
+p3lic
+2plig
+3plik
+2p3lu
+2p3m2
+2p1n2
+1p2o
+pob2
+po1c
+3pock
+3pod
+3poe
+po2el
+2poh
+po2i
+po3id
+3poin
+3pol
+po2lan
+po2l1au
+pold2e
+po3li
+pol3lo
+polo3p
+pol3z2
+pom2ph
+2pond
+pont2
+po1ob
+po2p1ak
+po2p1ar
+po2pl
+po3pt
+po1rau
+porf4
+3portal
+por2th
+3porti
+3porto.
+3portos
+3portr
+por4tre
+por6tric
+pos3s2
+pos4t
+po2sta
+po4stad
+po2stä
+po4stei
+po4stem
+post3ra
+po2ta
+pot1ar
+3potä
+3pote
+pot2h
+po2t3in
+pott1r
+po2t1u
+po3un
+po2w4
+po3x
+pö2bl
+pö2c
+2p1p
+p2p1ab
+pp1ang
+pp1ans
+ppa2p
+p2pat
+pp1au
+ppe3e
+pp1ei
+ppeli5ne
+pp2e2n1
+ppe4na
+p2p1erz
+p2pf4
+pp1fr
+p2p1h2
+p2p1i4a
+p4p3lac
+p4plan
+pp3lä
+p2p3le
+pp3lis
+pp3oh
+p2p1ö2
+pp3p2
+p2p3ra
+p2p5rä
+pp3ren
+p2pri
+pp3rol
+pp3rot
+p2p3ru
+p4ps2
+pp3sa
+pp3sy
+ppt4
+pp5te
+p3puc
+p2pul
+p2p1um
+p2punk
+p3pur
+p2r2
+1prak
+pra4s3
+pra5sp
+1prax
+p4rä
+1präd
+1präf
+1präg
+1präl
+3präm
+1präp
+3präs
+1präv
+2pre.
+2prec
+3pred
+2pree1
+pre2ei
+2preg
+1prei
+3preis
+prei4s3c
+prei6sei
+prei4ss
+2preiz
+1prem
+pren4ga
+2p3rer
+1pres
+press4e
+1preß
+pri4e
+2prig
+pri2l1
+2pring
+prings4
+1prinz
+pri2t1
+prit3a
+priter4
+prit3t
+1priv
+1pro1
+3prob
+pro3be
+2proc
+7prod
+3prog
+3proj
+2pross
+2proß
+prot2e
+3proto
+2prott
+2prö
+1prüf
+1prüg
+2prüh
+2prün
+2p1s
+4ps.
+p3sat
+ps1id
+ps3k
+p2sö
+ps4pi
+pss2
+p2st1au
+pst3erh
+p2stu
+3p2sy
+4psys
+ps2ze
+2p1t
+pt1a
+pt2ab
+pta2g
+pt3a2t
+pt3ax
+p3te
+p4t1e2b
+p4t3ec
+p4t1ei
+p4tele
+p4temp
+4pten
+p4t1en2g
+p4t1ent
+p4t1ep
+pt3erei
+p4t1erw
+p4t1erz
+p4t1e2ti
+p2t3h
+p3ti
+p4t1in1
+pt3ing
+pto2mo
+pto2p
+p4tos
+pto2w
+ptpo4
+pt3r
+pt1s2
+pts4t
+pt1uh
+pt1um
+p3tung
+pt1urs
+p2tü4
+3p2ty
+pt3z2
+1pu
+pu1a
+pub4
+2puc
+pu2dr
+2p1uh
+2puk
+pu2kl
+pu2k1o
+pu2lin
+pul2sp
+pul2s1t
+3pulv
+2pulw
+pum2pl
+4pund
+pun2e
+pun2s
+2punt
+2pur
+pu2ra
+pu2rei
+pus2h
+pu3she
+3put
+pu5t2e
+put2s
+puzi3
+1püf
+pül3l
+2p1v
+2p1w
+pwa4r
+3py1
+py3t
+2p1z2
+qu4
+quel4la
+que3rel
+quer5n
+que4te.
+1queu
+1ra.
+r1aa
+ra2ab
+2raac
+2raal
+ra3ar
+r2a1as
+r1ab
+ra2b1ar
+r2abä
+1rabbi
+rab2bl
+2rabd
+ra2bei
+rab2er
+rab3erd
+2rabf
+2rabg
+2rabh
+1r4abi
+2rabk
+r2able
+ra2bli
+ra4b5lo
+2ra2br
+2rabs2
+2rabt
+2r3abw
+1raby
+2rabz
+r2ac.
+ra2ce
+2r1acet
+ra4cheb
+ra2cho
+4racht
+rach6t5rä
+ra2chu
+r2ack
+1r2ad
+r4ad.
+rada2
+ra4dam
+2radap
+3radar
+ra2dei
+rade5s
+3radf
+3radh
+3radio
+4radit
+3rado
+3radp
+ra4d1r
+rad5ri
+rad3t4
+ra2el
+r2af
+raf3ahn
+raf3ar
+rafe2
+ra2f1er
+raf3r
+rages4
+2ragg
+ra3gle
+4ragm
+ra2gn
+r2ago
+rag4sta
+1rah.
+rahle4n
+5r4ahm
+r1ahn
+2ra1ho
+ra3hö
+4raht
+r2ai
+2raic
+rail4l
+2r3air
+ra3ke
+2rakk
+3ra1k4l
+ra2kre
+ra2kro
+2rakti
+ra2kus
+3rakü
+2rakz
+r2al
+r4al.
+ra2la2
+ra4l3ab
+ral1ak
+ra3lamp
+rala4s
+ra2lä
+ral3b4
+3r4ald
+r4ale
+ra4l3end
+ra4lent
+ra4l5ern
+ra3lex
+r4ali
+ra2lid
+rali1e
+ra4lind
+ra4l3ing
+2r3alk.
+2r3alm.
+2ralp.
+4ralpe
+r4als
+ral3su
+r3alt
+3r4al3t4h
+ra2l3u
+3raly
+ra2mei
+ra2mer
+r2ami
+r2amm
+ram4man
+ram6mens
+ram6m5ers
+ram4mit
+ram4mu
+2ramn
+3ramsc
+2r1amt
+ramt2s
+ran3ade
+r1a2nal
+ra2nan
+ra2nar
+ra2nau
+2ranb
+r2anbe
+r4anda
+r4ande
+ran4dep
+ran4d3er
+3r2andi
+rand3s
+3raner
+2ranf
+2ranga
+ran6g5e6be
+1rangi
+r2angl
+rangs2
+rani1e
+r3a4nil
+ran2kr
+ran2kü
+4ranl
+2r1anm
+r2anmi
+r2anmu
+2ranna
+rano2i
+2r1anp
+2ranr
+2rans
+r2ans.
+ran4spa
+4r5antei
+r1anth
+2rantr
+1ranu
+2ranw
+r2anz.
+r2ap
+2rapf
+2rapo
+ra2pok
+ra2pos
+rap2pr
+2ra2pri
+2r1aq
+r1ar
+r2ar1a
+2rarc
+r2are
+3r4arei
+raren1
+r2arf4
+ra3rie
+rar3in
+ra3ris
+r3a4rist
+4r3arit
+r2ark
+raro2
+ra2rom
+2rart
+2rarz
+rar3zw
+r2a3s2
+r4as.
+ra4schl
+ra4sk
+ras3si
+ras3sp
+r4aste
+ra4st3ei
+r3asth
+ra4sto
+ras3tri
+2rasyl
+2raß
+1rat
+r4at.
+rat1a
+rat2ak
+ra2tan
+ra2t1ei
+r3atel
+ra3tes
+ra4tid
+2ratla
+2ratm
+rat2o
+2r3a2tom
+ra3tor
+rat4r
+r4ats
+2ratta
+2rattr
+4ratz
+rat3ze
+4rau.
+3raub.
+4raue
+rau3e4n
+2rauf
+rau3fä
+2rau3g
+3raum
+rau4m3ag
+rau4man
+rau5mes
+rau2m1i
+3raup
+4raur
+2rausb
+3raus2c
+2rausd
+2rausf
+2rausg
+raus8gewä
+2raush
+2rausl
+rau2sp
+2rauss
+raus8scheidu
+raus3tr
+2rausv
+2rausw
+2raut
+raut1r
+rau4tra
+rau4tro
+raut5s
+1raü
+r2ax
+raxe3
+raxi4s1
+r3axt
+4räb
+räch4s
+3r2äd
+4räf
+rä1fr
+4räg
+2räh
+4räm
+3rän.
+3räni
+3räns
+2räp
+2räq
+2r1är
+r2är.
+rä3ra
+rä1ro
+rä4sc
+räse2
+rä2st
+3rätse
+4rätz
+rä2u
+4räue
+räu2s
+räus2c
+räu7schen.
+2räuss
+2räuß
+4räut
+2räx
+4r1b
+r2b1ab
+r3bac
+rba4del
+rb2al
+r2bang
+r2bant
+rba3re
+rb1art
+r2barz
+rb1auf
+rbb2
+rb1ech
+rbe3erf
+rbei5d2
+rbe3inf
+rb3einh
+rbe3int
+r4belä
+rbel2o
+rbe3r2e
+rber6gin
+rb1erl
+rbe3rum
+r2bim
+r2binf
+rbit2a
+rbi3tu
+rb2la
+rb4la2d
+r2blan
+r8blasser
+r4b3last
+r3blat
+r3blau
+r2ble.
+r3blen
+rb3ler
+r2bleu
+rb2lin
+rb2lö
+rb3lös
+rbmas3
+rb2ob
+rb3ras
+rb3rea
+r8b7rechts
+rb4sam
+rb2sei
+rb2ser
+rb2s1o
+rb4stä
+rb2su
+rb4sz
+rb2u
+rbü4b
+4rc
+r1ce
+rce4n
+r1che.
+r1chen
+r1ch2i
+rch3l
+r3ch4lo
+rch3m
+rch3r
+rchs2
+rch3sp
+rch3t2a
+rchter6r
+rch1w
+r1ci
+r1cl
+r1ç
+4r1d
+rd2ac
+r2daf
+r2d1ak
+r2d1a2l
+rd2amm
+rd1an
+rdani1
+rd1ara
+rd1ark
+r2darz
+rdär2
+r3de.
+r2dei
+rd2ei.
+r4deis
+r2d1elb
+r2delf
+rdels2
+rdem6
+rden3d2
+r4dengl
+rde3ob
+rde3r4er
+rderin6s
+r4d3ernt
+r3des
+rde3sp
+r4d1ex
+r2d1inn
+rd1iri
+rd1ita
+r2dof
+r3don
+rd1os
+rd3oss
+r2dö
+rd3rat
+r2drau
+rd4ri
+rd5ris
+rd4rö
+r3d4rü
+rd2sän
+rd3s2k
+rd3s2z
+rd3th
+rdt4r
+rdt2s
+r2d1uk
+1re
+3re.
+rea2d
+rea6l5erw
+4re2am
+re3at.
+re3ats
+2reä
+re2b1a
+re2b1l
+reb1r
+reb3ra
+reb3so
+rech3ar
+4rechs
+2reck.
+2recki
+3red.
+4redd
+2redi
+re2dik
+3redn
+3redu
+re1e
+3refe
+4reff
+r2eff.
+3refl
+3refo
+3reg
+rege4l3ä
+4r1egg
+2reh
+re2hac
+re2har
+rehen1
+re4hene
+re4h3ent
+re2hi
+reh1l4
+re2h1o
+re3hol
+re2hü
+r2ei.
+r2eib
+rei4bel
+rei4ble
+2reid
+r2eie
+4reier.
+rei4fei
+4reifel
+2reig
+3reigä
+3reigeh
+r4eigel
+6reigens
+3reigi
+4reign
+3reigru
+rei3l2a
+rei3l2i
+2r1eilt
+3reim
+reim2p
+r1ein
+rein2a
+rei5nac
+rei3nal
+2reinb
+rein4du
+rei3n4ec
+reinen5
+2reinf
+re4info
+4reinn
+4r3einr
+rein8s7tre
+rein4sz
+rein6teg
+re1in2v
+4reisar
+4reisb
+2reisf
+2reish
+2reisr
+reister6
+rei6s5tro
+2reisw
+4reiti
+reit3s2
+re2ke
+4rekk
+r2el.
+re3lat
+2relb
+rel2e
+relea4
+re5lei
+re2lek
+4relem
+r2elev
+2relf
+2relit
+2relix
+r2ell
+rel4lar
+rel4lei
+re3lo
+r2els
+2relt
+relu2
+r4em.
+4remb
+rem2da
+re2m1ei
+r2emi
+re3mig
+2remis
+4remit
+4rempf
+rems1c
+rem4str
+2rem2u
+r4en.
+r2ena
+2rena.
+re4nac
+re3nal
+re4n3an
+r1endg
+3rendi
+ren3dr
+ren2eu
+5renf
+4rengag
+2rengp
+3renh
+re2ni
+3renl
+3renm
+ren4nar
+ren6nene
+ren6sein
+ren6serg
+rens2p
+2rentd
+2rentf
+3rentfo
+2r1entg
+r3enthä
+2r1entl
+2r1ents
+2rentw
+2rentz
+r2enz
+ren6z5er6f
+renzer6l
+ren6z5er6s
+renzer6w
+ren4z3in
+ren2zw
+re2ob
+re1on
+re3or
+3repe
+4re2pen
+2repi
+re2pis
+2repoc
+2r1e2pos
+4repp
+3repu
+3r4er.
+rera2
+2r1erb
+rer2bi
+3r2erbr
+2r1erd
+rere2
+4r3ereig
+r1erek
+re2r1ep
+r2erer
+2r1erf
+4rerfah
+r4erfe
+3r2erfr
+rer2fü
+r1erg
+4r3ergeb
+5rergebü
+r4ergen
+3r4erges
+2rergo
+rer2gr
+r4ergru
+rer2hö
+re3rin
+r1erk
+rer4kan
+rer2ke
+4r3erken
+3r2erki
+3r2erko
+r1erl
+2r3er2la
+5r4erlag
+r3erleb
+r2erli
+2rerlö
+2r1erm
+rer2n
+2r1ernä
+r1erne
+2r1erni
+4r3erns
+4r1ernt
+re1ro
+re2rob
+re4rosi
+2r1er2ö
+r1erre
+rer4reg
+rer4rei
+r1erri
+5r2ers.
+2r1ersa
+rer5sc
+r6erschi
+r2erse
+2rersp
+rer4sta
+r6erstad
+r1ert4
+r2erte
+4rerträ
+r1erw
+rer4wac
+rer4wec
+r4erwes
+2r1erz
+rer2zä
+3r2erzy
+3r4es.
+re2sa
+re4sam
+re3sar
+re4schw
+3rese
+re4se2h
+3reson
+res2po
+2ress
+4resse
+res6s5erw
+res4sto
+4ressu
+3rest
+re6stent
+re4stra
+4restu
+3resu
+2re2ß1
+re2t1ak
+re2tau
+re2thy
+re4trol
+re2u
+reu4eri
+reu3g2
+2reul
+re3uni
+2r1eur
+2reü
+4r3eva
+2r1evid
+rewa4r
+re2wi
+2rewo
+2r1e2x1
+2rezi
+1ré
+4r1f
+r5fahrt
+rfall4s
+rfäs3
+r2fent
+r3f2es
+rff2
+rf3fe
+rfi4le.
+r4fland
+r3f4lä
+rf3lic
+rf4lö
+r3flü
+r2fo2b
+rfolg4s
+r3foli
+r3fot
+r4frauc
+rf4ru
+rf4rü
+rf4sam
+rf2s1ä
+rf2su
+rf2ta
+rf4tin
+rft4r
+rf2u
+rfzu3
+2r1g
+r2g1a2d
+r2g1ah
+r2g1ak
+rga4ner
+r2g1ap
+r2garb
+rg3art.
+r2g1ask
+rgas2t
+rga5stes
+rga3su
+rgd2
+rge4an
+rge2bl
+r2g1e2c
+r3g2el
+rge4l3er
+rgen6sem
+rgen4z3w
+r4ge4tap
+r2geto
+r7gie
+rgi4sel
+r2glan
+rgleich8s7
+r2gleu
+r2glig
+rg2log
+rg2lu
+r2g3na
+r2gne
+r2g3ni
+r2g3no
+r2g3oa
+r2go4b
+r3gog
+rg3op
+r2g1or
+rgö2
+r2g1öd
+r2g3ral
+rg4rau
+r2greg
+r2gres
+r2gret
+rg3rin
+rgro5sse
+r3grun
+rg3rüs
+rg3se
+rgs2ei
+rg4sel
+rg3s4i
+rg1sp
+rgs2pe
+rgs2po
+rgs4ti
+rgs2tu
+rg1su
+r1h4
+2rh.
+2rha
+r2ha.
+r4haltb
+r3han
+2rhä
+r2he.
+r5hea
+2rheb
+2rhef
+2rheit
+2rher
+2rhi
+2rhof
+rho2i3
+2rhol
+2rhot
+2rhöl
+2rhs
+2rhü
+1ri
+ria3ne
+ri2ano
+ri2ast
+ri3at
+ri4atr
+rib2bl
+ri1ce
+ri1cha
+richt8spo
+3richtu
+ri2con
+ri2dau
+ri3de.
+4ridee
+ri2de2l
+rid3r
+ri4ds
+r2ie
+rieb6ste
+rief1a
+4riefm
+rie2f3r
+rieg4s
+ri2e1i
+riein1
+ri1el
+rie3l2a
+ri3els
+ri4enä
+riene2
+ri3eni
+rie2nu
+ri1er.
+rie3re
+riere4n
+ri1eu
+ri2f1a
+ri2fä
+ri2fei
+ri2fer
+rif6f5end
+rif4fer
+ri2f1o
+ri2fr
+rif4ter
+3rig
+4riga
+4r3i2gel
+ri4gene
+5rigj
+rig1l
+4rigr
+4rij
+ri2kar
+ri2kä
+ri2kin
+ri2kn
+ri4kone
+ri2kor
+2rima
+ri2mag
+ri2mau
+ri2me.
+2rimm
+2rimp
+rim2s
+rin2c
+r1ind
+rin4dex
+rin6dize
+2rindu
+ri3n2e
+rine1i
+2r1inf
+rin2fo
+3r2infr
+rin2ga
+ring3le
+rin2gr
+2r1inh
+2rinit
+4rinj
+4rink
+rin2kl
+rin2ko
+rin2kr
+2rinl
+6r5innenm
+4r3inner
+2r1innr
+r1innu
+4r1inq
+2r1ins2
+3r2ins.
+rin4sek
+rin2so
+r4inspi
+3r2insy
+2rint
+4rinte
+rin4t5re
+2r1inv
+ri2ob
+4r1ir
+r2is
+ris2a
+ri3s4an
+ri4sch3o
+ri4schw
+3risik
+ri3s2ko
+rismu2
+r3iso
+2risol
+ri4s3p
+r3isr
+3riss
+rist5ers
+ristes4
+ri6stess
+ri4st3r
+3ri2ß1
+r2it
+rit2a
+r3i2tal
+rit3ant
+2ri3t4r
+rit1s2
+rit4t3au
+rit4tei
+3ritter
+rit2to
+rit2t1r
+5ritu
+rix1
+ri3xi
+1rí
+2r1j
+4r1k
+rka2b5l
+r2k1ak
+rk1all
+rk2am
+rk1are
+rk1asp
+rkauf4s
+r2k1äh
+r2kef
+r3kel
+r4kelem
+rke2n1
+rk5ersta
+r2k1erw
+r3ket
+r2k1im
+rk4las
+rk4lau
+rk4lim
+r2klis
+rk2lo
+rk2lu
+rk4n
+rk5nu
+r2kob
+r3kol
+r3kon
+rk1o4ri
+r2kou
+rk2ö
+rk3räu
+r3kri
+rk3rin
+r2k3rom
+r2krou
+rk2sei
+rk2sel
+rk2ser
+rk2so
+rk2sp
+rk3spi
+rkstati6
+rk4stec
+rk4stoc
+rk2ta
+rk2tel
+rk4t3eng
+rk4t3erf
+rk4terg
+rk4t3erl
+rkt3ers
+rk6tersc
+rk4t3erw
+rk4t3erz
+rk4teta
+rk2tin
+rk2t1o2
+rkto4b
+rk2t3r
+rk2tum
+rk2um
+rku2n
+rku2sa
+rkus3s
+rku2s1t
+r2küb
+2r1l
+rl2ab
+r3lag
+r5land
+rlan4d3i
+r2l1ar
+r2l1a4sc
+rlas2t
+r2l3aug
+rle2a
+r3lec
+r3lep
+r3lex
+rlg4
+r3l2i
+rli4ne.
+r3l2o
+rlou1
+rl2ö
+rlös5s
+rls2a
+rl2spr
+rl2sto
+rl3t
+r3l2u
+rlus2t
+rlu6ster
+rlu4str
+r3ly
+rlz2
+4r1m
+r2mab
+r2m1ad
+rma2la
+rm1ald
+rm1ami
+r2m1ank
+r4mantr
+rm1anz
+r2m3aph
+r2marc
+r2marz
+rma4spe
+rma5ssen
+rmas8sens
+rmat2o
+rm2är
+rm3d2
+r4m3einh
+rme4na
+rm2ene
+r2ment
+r2meo
+r2m1erh
+r2m1erl
+r2m1erp
+rm2es
+rme3sa
+rme3st
+rmeta2
+r2mide
+rmi6nanz
+rminen4
+rmi6neng
+rm3m
+rm1o2ri
+rm3p2
+rms2
+rm3sa
+rm3sk
+rm3sta
+rm3t2
+rmu2n
+r4muna
+r2muni
+2rn
+rna2b
+r3nad
+rn4ade
+r3nage
+r2n1all
+rna4n
+rn4and
+rn3ani
+r2nanz
+rna2r
+rn3are
+r4n3ari
+r4n1a4st
+r4n3att
+r2nau
+rn3aug
+rn3de
+rn3d4r
+r4nef
+rn2eid
+r4neif
+r4neis
+rn1ema
+rne2n
+rn1ene
+rn2eng
+r2n1ep
+r4n1erg
+rn4erhi
+r4n1erl
+r4n1ert
+r4n1erw
+r4nerz
+r5nes
+rn2e2t
+rne4tem
+rn2eu
+rne3uf
+r4nex
+rn3f
+rn3g2
+r2nid
+r2nin
+r3nit
+rnk2
+rnn2
+r3nod
+rn2oh
+rn3oly
+r2n1op
+r2n1or
+rn1ö
+rnö2d
+rn3s2a
+rn3s2ä
+rn3s4p
+rns2u
+rn3s2z
+rn3t2a
+rn3t2e
+rn1ur
+r1nü
+r1ny
+rnz2
+2robj
+rob2l
+1robo
+ro2bo2r
+ro2bre
+2robs
+ro1ch
+roch2a
+3rock.
+r2o3de
+ro3e4
+2roff
+ro3fl
+4rog.
+rog2a
+3rogg
+roh1l
+4rohn
+ro2hö
+3rohr
+3roi
+ro3in
+rok2l
+ro3le
+ro2liv
+rol4lan
+rolle4
+roll4en
+rol6lerg
+rol6lerw
+rolli4n
+rol6lini
+2roly
+4rom.
+ro2mad
+ro2mal
+3roman.
+2romb
+romen3e
+ro2m1er2
+2romn
+4romt
+r2on
+ro3n4ab
+ro2nan
+3rond
+4ronk
+3ronn
+rons2
+ron4tan
+ron6tend
+ron2t3r
+ron2t1u
+ro1ny
+ro1o2f
+2ro2pf
+1ropl
+2ropt
+r1or
+ro2r3al
+ro2rat
+2rorc
+ro2rel
+ro2ro
+ror3th
+rort4s
+ror2ü
+ro3sh
+ro3s2i
+ro5s2k
+ros2p
+ros4san
+ross1c
+ros4st
+ro3sta
+ros3tel
+ro2st1r
+ro2sum
+4r3osz
+ro2ßi
+ro2ßu
+ro2tan
+rot3au
+ro2tä
+ro3te
+ro2tei
+ro2t3ho
+ro2tru
+rot1s
+rots2o
+3roul
+ro3unt
+5rout
+4roy
+rö2b3l
+rö2du
+2rö2f
+3röh
+2r1ök
+1röl
+2röl.
+rö3le
+r1ölp
+3römi
+r1ör
+r2ös.
+rös1c
+r2ö3se
+1rösl
+4röß
+3rötu
+2r1p2
+r3pa
+r3pe
+rperer5
+rper3in
+rpf4
+r2pli
+rp4lu
+rpo4str
+rp3se
+rps1t
+r4pt
+r3pu
+2r1q
+2r1r
+rr2ab
+rra4s3s
+rrat2s
+rr1auf
+rr1äm
+rrb2
+rr1c
+r5rega
+rr2ei
+rre2le
+rre2pa
+rr2er
+rrer2s
+r3res
+rres2t
+rre2ve
+rr2hen
+rr2hos
+rr2i
+rri3k2
+rrm2
+rrn3au
+rr2o
+rr3obs
+rro3m
+rro2re
+rr2th
+r3r2u
+r3r2ü
+rrz2
+4r1s
+r3sabo
+r2sa2d
+rs2al
+r4samp
+r4s1amt
+rs2an
+rs3ana
+r4sanf
+r4s3ang
+rs3anm
+r4sanp
+rs3ar
+rs4ark
+r4sarm
+rsch3e4b
+r3schen
+r6scherl
+r3schu
+r2s1ebe
+rse2e
+r2s1ef
+r2sein
+rse2n
+r3sena
+rs2end
+rse4ne
+r2sepi
+rs1ere
+r2serh
+rs1ers
+r2serz
+rse2t
+rs1eta
+rs2ext
+r3s2hav
+r3shir
+r3sho
+rs2hor
+r4shu
+rs2il
+rs2ka
+rs2kel
+rs2ki
+rs2kl
+r4skor
+r3s4kri
+r4sky
+rs4mog
+r3s4no
+r2sop
+r4s3ort.
+rs2p4
+rspa3s
+r2s3ph
+r3spi
+r3spl
+rs4por
+r2spun
+rs3s2
+rst3abl
+r5stad
+rst3ala
+r4stale
+r4stans
+r4stant
+r2stas
+rs2tau
+rs2tea
+rs2tee
+rst5eing
+r6st5eint
+rster2
+rst4erb
+r6sterbt
+r4st3erl
+r4sterö
+r4st3erw
+rs2t3h
+rst3ing
+r2stip
+r2stit
+rs2tob
+r2s1tot
+rs2tra
+rst3ran
+r6strang
+r4stris
+rs2tu
+rsuch4s
+r3suf
+rsü3s
+r3sy
+rs2zin
+r1ß
+4r1t
+rt1abs
+r2t1ad
+r2t3ae
+rt1akr
+r4t3albe
+rta3l2e
+r2t1all
+rt1am
+r3t2ame
+rt1an
+rt2anb
+r2tang
+r2tanw
+r2t1ar
+rt3att
+r4tauft
+rt3äh
+rt1änd
+rt1ärm
+r3te.
+rte1e2
+rt1ein
+rt4eind
+r4t3einh
+r2telf
+rte3li
+rtel6lei
+rte2n1
+r3ten.
+rte4na
+rten3s2
+r4t3ents
+rten3z
+rteo2
+rt3erei
+r6tereig
+r4terfa
+r4ter4fo
+rt1erh
+rt1erk
+r4t3erla
+rter8löse
+rter6mit
+r4t3ernä
+r2terö
+rter4re
+rt1ers
+rt4ersp
+rt1erz
+r3tes2
+rte3sk
+r2texa
+rt3he
+r2t3hi
+rt3hol
+rt2hum
+r2tid
+rtik2
+r2t1ima
+rt3inf
+rt2is
+r2t1o4b
+r3top.
+rto1pf
+rt1or
+r2torg
+r3tork
+rt3rams
+rt3rand
+rtra4s3
+rt3rati
+rt3rec
+r3tres
+rt3ris
+rt3rol
+rt3roma
+r3trop
+r2trou
+r4ts
+rt3sän
+rt3sch
+rt4seh
+rts2el
+rt3sex
+rts3ing
+rts1o
+rt1spe
+rt4s3tan
+rts4tie
+rt3t4
+rt1umb
+rt2u3na
+r4tunt
+r2t1up
+r2t1urt
+rtu2t
+r2t3ute
+rt3z2
+1ru
+ru1a
+ru4ale
+ru3a2r3
+rube4
+rub2i
+ru3ches
+rucht3s
+rude2a
+ru2dr
+3ruf
+ru2fa
+ruff4
+ruf2s1
+ruf4ter
+ru2g3r
+3ruhm
+2r1uhr
+3ruin
+ru1ins
+ru1is
+2rum
+4r3umd
+4r3umf
+4r3umg
+ru2mi
+4r3uml
+4r3umsa
+4r3umw
+4rumz
+2r1una
+2rund
+run4d1a
+runden5e
+run4d3er
+run2e
+runei2
+4r1unf
+run2ga
+2rungl
+4r1u2ni
+r3unio
+ru4nis.
+run2kr
+4r1unl
+2r1unm
+4runn
+4runr
+r1unse
+4r3unt
+4runw
+2rupd
+ru3pr
+4r3u2r
+rur1e
+5ru3ro
+ru2si
+rus2p
+rus3sen
+rus2s1p
+rus6st
+rus2t
+ru2tab
+rute4
+ru2tei
+ru2t1el
+rut3h
+ru2t1o2
+ru2t3r
+rut6scha
+4ruz
+ru2z1w
+1rü
+2rüb
+4rübu
+rü1ch
+rücks2
+rück5sta
+rü2hel
+rüher2
+rüh1l
+4rümm
+rün3z
+rü3ss
+rü4ssi
+2r1v
+rv2el
+rve4n1e
+rvenen4
+r4ventz
+rve5s
+r3v2o
+rv2s
+2r1w
+rwe4gel
+r3wei
+rwelt4s
+r5werk
+r5wert
+r2wo.
+r3woh
+r3wort
+rwun3s
+4r1x
+1ry
+ry2c
+ry3s2t
+rysti1
+2r1z
+rz2ans
+r2zant
+r2zar
+r2zat
+r3zähn
+rz2än
+rzell4a
+r5zene
+rz1eng
+r4z3ents
+rze2p
+rze2ra
+r2z1erd
+r2z1erf
+r2z1erg
+rz1erk
+r2z1erl
+r2z1erw
+rzes2
+r2z1ess
+rz1id
+rz1int
+rzir3
+rz2of
+r2z3ot
+rz2tan
+rz2th
+rzu4g3l
+r2zwä
+r3z2wec
+r2zwir
+1sa
+3sa.
+3s2aa
+2s1a2b
+sa3b2ä
+4sabd
+3sabet
+s3abi
+4sabm
+sa4bor
+4s3abs
+4s1acc
+5s2ache
+sa2cho
+sachs2
+sach3t
+s2ack
+s1ad
+2s3ada
+2s3adm
+2s3a2dr
+sa4fe
+4s1aff
+sa1f4r
+3saft
+saf2tr
+3sag
+sag2e
+sa3ge.
+5sa3gen.
+4s3a4gent
+4s1agg
+sa2git
+sag4n
+4s1a2gr
+3sahs
+3s2ai
+sa3i2k1
+sail4
+sai4r
+2s1ak
+sa2ka
+sak2e
+3saki
+4sakk
+4sakt
+3s2al.
+s2al2a
+sa2l3an
+sa2lar
+sa3lat
+sal3bl
+3sald
+sa4lerk
+3sali
+sa2l1id
+s1all
+sal4le.
+sallo3
+3salo
+sal2se
+2s1alt
+s2al3t4h
+3salz
+3sam
+s1ama
+4sa2mat
+s2ame
+4s3a2mei
+s3ameri
+5s2amm
+6s3amma
+4s1amn
+s1am3p4
+4samph
+s2ams
+s1an
+s2an.
+2sa2na
+sa2nä
+2s3anb
+s2an2c
+3s2and
+san4dan
+san4dri
+sand3s
+sa2ner
+3sang.
+2s3anh
+3sani
+3sanken
+2s3anl
+2sanm
+2sa2no
+2s3anp
+2s3ans
+s4anse
+san4sk
+san3sp
+4santei
+4santr
+4s3anw
+2s3anz
+s4anz.
+2s1ap
+sa2pe
+sa2po
+sap3p
+3sapr
+2s1aq
+2s1ar
+3s4ar.
+3sara
+4sarb
+3s2ard
+s2are
+s3area
+sar2ga
+sa3rin
+s2ark
+sa2rom
+s3arr
+s2ars
+4sart
+sa4r1u2
+2s1asc
+2s1a4si
+2s1a2sp
+4s1asy
+3saß
+sat2a
+sa4t3ant
+sat1ei
+2s3a2tem
+s3ath
+3sat2i
+2s3atl
+2satm
+sat2o
+sa2tol
+sa2tom
+sa2tr
+s3atta
+4s3attr
+3satz
+5satza
+sat4zel
+sat4z3en
+s1au
+3sau.
+3sauc
+3sau2e
+2sauf
+4s3aufb
+saug3le
+sau2gr
+sau3h
+3saum
+sauri1
+2saus
+3saus.
+4s3ausb
+4sausf
+4sausg
+sau2sp
+4sauss
+3sauste
+4s3ausw
+2sauß
+s1av
+sa2ve
+sa2xi
+sa3xo
+sa2y
+1s2äb
+3s2äc
+3s2äg
+s1äh
+4s3ähn
+2s1ält
+2s1äm
+4s3änd
+3sänf
+4s3äp
+2säq
+2s1är
+3s2ärg
+sä4s3
+sä5sse
+3s2ät
+1säu
+2säuß
+4s3b4
+sba4ne
+sbau6men
+sbe3r2e
+sbus3
+1sc
+2sc.
+2scab
+2scac
+2scaf
+2scal
+2scam
+2scar
+s1ce
+4s3cei
+sc4h
+6sch.
+s2chal
+sch3ana
+4schanc
+4schang
+5schanz
+4schao
+4s3chara
+4sch3ar5m
+s2chä
+2schäq
+2schb
+2schc
+2schd
+sch2e
+3sche.
+4schech
+6schef.
+6schefi
+6schefs
+4sch3ei.
+sch6ein.
+4schemp
+s4cher
+sch5erfü
+3sches
+4schess
+s2cheu
+4schex
+2schf
+2schg
+2schh
+schi4d
+schi4e
+5schif
+4schiru
+3schis
+2schk
+sch4lac
+4schle.
+6schlein
+4schloc
+4schlöc
+4schmas
+4schmed
+4schmoh
+2schmö
+4schmüh
+2schmy
+2schn.
+4schneb
+4schnut
+4schobj
+4schorc
+2schox
+4schör
+4schp
+2schq
+4schrad
+4schre.
+4schrep
+4schrin
+s3chris
+sch3rom
+4schron
+4schrou
+6schs2
+sch3sk
+6scht
+sch3t2a
+sch3te
+scht2i
+scht2o
+scht1s
+s4chu
+4schunt
+5schü
+2schv
+sch4web
+4schweg
+6schwerk
+4schwet
+4schwid
+s5chy
+2schz
+2scj
+6s1cl
+2sco
+3s2cop
+s2cr
+2scs
+2scu
+4s1d2
+sda3me
+sdien4e
+s3do
+sd4r
+1se
+se3ar
+se3at.
+seau4
+seb2
+5sebä
+2s1e2ben
+2s1echo
+sech6str
+2s1echt
+2s1eck
+se2dik
+3see
+see1i4
+se2e3ig
+se2el
+see3len
+se3en.
+seen2e
+se3er.
+see1ra
+seer2e
+se3e2r1i
+se1ers
+see5s2
+see3t
+2s3eff
+sef4l
+3s2eg
+s3e2gal
+se2gl
+seg4r
+3seh
+seh1a
+se2ha2g
+se2hel
+seher4e
+se4herk
+se2h1in
+seh3l
+se2h3ö
+seh3re
+seh5r2i
+seh3s
+seh3t
+se2hüb
+2sei.
+2s1eic
+2s1eid.
+sei3da
+4s3eifer
+2s1eig
+sei3le
+s2eim
+s1ein
+5s2ein.
+2seinb
+seinbus6
+sein4du
+2sei3ne
+seine3i
+4seinfl
+sein4fo
+2seing
+2s3einh
+2seini
+2seink
+2seinl
+2seinn
+2seinr
+s4eins.
+4seinsc
+4seinsp
+sein8stit
+sein6str
+4seintr
+2seinw
+2s3einz
+2s1eis
+3s2eit
+seits1
+3sek
+4s1e2kel
+4sekz
+s2el.
+se2l1a
+se3lad
+3s2elb
+sel1ec
+se2lef
+2s3e2leg
+2selem
+se2ler
+sel3ers
+2self.
+s1e2lit
+2s1elix
+s2ell
+sel3le
+se2lob
+s2els
+sel3sz
+selz2
+sem2a
+sem2e
+2s1emis
+2s3emp
+s4en.
+se4nad
+se3nal
+se4nas
+sen3au
+s2enb
+3sendet
+4s1endl
+sen3d4r
+senen1
+se4nene
+4senerg
+se4ners
+s2enf
+5seni
+se2n1im
+3senku
+se2no
+se4nott
+se4noz
+s2ensa
+sen4s3e4h
+4sensem
+s2enso
+senst2
+sen8s7turm
+sent2a
+sen3tä
+2sentd
+2sentf
+4sentg
+4sentn
+sen3tr
+2s1ents
+2sentw
+2sentz
+se4n3u
+3senva
+sen4zer
+sen3zw
+seo2r
+se2pen
+5seq
+s4er.
+se2r3a2d
+ser3al
+ser3ass
+ser3äus
+serb2
+s3erbe.
+se2re2b
+se4r3eim
+s4eren
+se4r3enk
+s4erfe
+s2erfr
+s1erfü
+4serfül
+ser3g2
+s1ergä
+s2ergr
+s1erh
+5serie
+ser3k4
+3serl.
+4s3ermit
+s2ern.
+2s1ernä
+s3erneu
+4s3ernt
+s1e2ros
+s1erot
+s1erö
+s2ers.
+2sersa
+ser6sehn
+4ser4set
+se3ru
+se4ruh
+ser2um
+s1e4rup
+3s4er3v
+s1erz
+s4es.
+se3s2a
+se2sel
+2sesh
+se3sk
+s1essa
+sest3ri
+set2a
+2s1e4tap
+se2tat
+s1e2th
+2s1e2tik
+set1s
+se3tun
+2se2ty
+3setz
+3seuc
+4s3eul
+se1u2n
+s1ex
+5sex.
+2sexa
+se2x3en
+s2exi
+s2exo
+4sexp
+sex3t4r
+2sexz
+6s3f4
+sfal6l5er
+4s3g4
+sgang4
+sga3su
+sge3s2
+sgro3
+2s1h
+4sh.
+sh2a
+3s2ha.
+s3hac
+shal4li
+shalt2
+4shan
+4shc
+sh2e
+1shen
+4shf
+3shi.
+3shid
+s4hig
+s2hip
+s2hi4r
+4shk
+sh3n
+4shoc
+4shof
+4shom
+3s2hop
+sho4re
+5show
+4shö
+sh4r2
+4shs
+4sht
+s3hu
+4s3hü
+1si
+si2ad
+sial5l
+sia4s
+2siat
+sib4
+5s4i1c
+si2cha
+sid2
+s2ide.
+s2i3do
+2sidy
+3s4ie
+sie2bu
+sieh1
+sie4hes
+si3e2n
+si1err
+si1f4
+si2g1a
+si2gei
+sig4n
+si2g3r
+sigs2
+si2k1ab
+si2kak
+si2kar
+si2k1ä
+si2k1el
+siken2
+sik3erl
+si2ket
+si2k3i
+sikin1
+si2k3n
+siko3
+si2k3r
+sik3s2
+sik3t4
+si2ku
+sil2br
+sil2e
+3sili
+s1ill
+3silo
+3sim.
+2s1imm
+sim2st
+3simu
+si3n4a
+2s1ind
+2s1inf
+sing1a
+sin3g4le
+sin2g3r
+sing3s2
+2s1inh
+s1in1i1
+sinner4
+2s1inno
+2s1inq
+2s1ins
+s2ins.
+2s1int
+2s1inv
+3sio
+sirn4
+2sirr
+3siru
+3sis
+si2sa
+si4sam
+si4schu
+si2s1e2
+si4sis
+s1i2so
+si2s3p
+sis3s
+s2ist
+si4star
+si3sto
+si2stu
+si2su
+3sit
+si2tal
+si2tau
+si2tra
+s2it2u
+3siu
+si2va
+sive3
+si4v3erf
+siv1o4
+si2vor
+siz2
+1sí
+4s3j
+2s1k2
+4sk.
+sk4a
+4s3kab
+s3kad
+1skala
+4skalk
+4s3kam
+4skana
+4skanä
+3skanda
+4s3kap
+4s3kar
+4s3kas
+ska4te.
+4skateg
+ska4tes
+ska2to
+4skä
+4skb
+ske2li
+4sken
+3skep
+4sker
+s3kh
+3s2ki.
+3s2kif
+3s2kik
+s3kin
+4skir
+s2kis.
+3skiz
+sk4l
+4s3klas
+3s2klav
+4s3klu
+4sk4n
+4skoh
+4skol
+4skom
+4skon
+3skop.
+sko2pr
+4skos
+4skow
+4skö
+4skra
+4skro
+4sk3s
+4sk3t2
+skto2
+3skulp
+4skun
+sku2s3
+4skü
+4skv
+2s1l2
+4sl.
+s3lab
+3slal
+sla2ve
+s2law
+sl3b
+4s5le
+s3li
+3s4lip
+4sln
+s3lo.
+slo3be
+s3loc
+s3loe
+s3lof
+3s2low
+s3lu
+s3ly
+2s3m4
+sma3b4
+sma3sc
+sme3na
+smi2t3
+2s3n2
+snab4
+sni4a
+sni3er.
+sni3ers
+4s5not
+3so.
+2s3oas
+2s1o2b
+3s2o3ba
+4sobj
+4s3obo
+so1ch
+so3et
+s1ofe
+so2fen
+3soft
+3sog
+s1o2he
+3sohl
+sohle2
+2s3ohng
+2s1ohr
+3soi
+2s3ok
+1sol
+3sol.
+so3la
+so4lau
+3sold
+3sole
+so2l1ei
+so3li
+sol2la2
+sol4ler
+so3l2o
+4s3o2ly
+1som
+1son
+son2a
+sone4
+son3sä
+son4s1o
+so3o
+s1op
+2sope
+2sopf
+3sopr
+1sorb
+s1orc
+2s1ord
+sore2
+so2rei
+so2rel
+2s1orga
+so1rh
+2s1o2rie
+so2ro
+3sorp
+3s2orti
+so4ru
+1so3s2
+3s2os.
+3sosc
+so4sk
+2so4sm
+2s1o4st
+s1o4sz
+3so3ß
+soth1o
+3sott
+soun2
+sound1
+so3unds
+so3unt
+s1out
+3sov
+3sow
+2s1ox
+3soz
+s3o4ze
+s1ö2d
+2sö2f
+2s1ök
+2s1ö4l
+2s1ö4s
+sp2
+2sp.
+2spaa
+s2pace
+2spack
+2spag
+spa2ge
+2spak
+2spala
+2spalä
+3spalt
+spa2m
+1span
+s2pan.
+3spannu
+2spano
+3spant
+2spanz
+4spap
+2s3para
+1spare
+s4parka
+2sparo
+1sparr
+5s6parten
+4spartn
+4sparty
+spas2
+spa3sse
+spa5ssi
+1spat.
+2spati
+2spatr
+2spau
+3s2paz
+s2pä
+2späd
+3späh
+2spär
+2späs
+2spe.
+2speg
+1spei
+3speic
+4spein
+1spend
+4spensi
+spe3p4
+s2pera
+3sperb
+3s2perg
+s1peri
+4sperle
+2spero
+s2perr
+sper4ra
+2spers
+4spet
+3s4pez
+2s3pf4
+4spha
+s2phä
+3sphär
+s3phe
+1spi
+3spi4e
+4s3pier
+spier4r
+s3pi2k
+4s3pil
+2spip
+4s3pis
+3s2pit
+3s2piz
+2spl
+4spla
+4splä
+3s2pli
+4s3p4lu
+2s3pn
+2spod
+4spoe
+s2poi
+2s3pok
+4spol
+1spon
+s2pons
+2spop
+1spor
+s2pore
+s2porn
+4s3pos
+4spote
+4spr.
+3s2prac
+s2pran
+2sprax
+3spräc
+2spräm
+s2prän
+2spräs
+3sprec
+2spred
+4spreis
+5s2pren
+2s3pres
+3spring
+4sprinz
+s2prit
+4sprob
+4sprod
+2sprog
+4sproj
+2sprop
+5spross
+2sproz
+3sprö
+3s2pru
+3sprüc
+2sprüf
+1sprün
+2s3ps
+2spt
+2spub
+2spud
+1spuk
+3s2pule
+s3pun
+2spup
+3spur
+spu4rer
+2sput
+1spü
+2spy
+2s1q
+4s3r4
+sra4s3s
+srat2s
+sre3cha
+sreli1
+sre4th
+sro3tu
+srö2s
+srücker6
+2s1s
+6ss.
+4ssa
+s3sa3ba
+ssa3bl
+ssa5bo
+s5sack
+ss2ad
+ss4agi
+s2s1aj
+ss3alba
+s2sall
+s4samt
+s2sanf
+s4sang
+s4sano
+s4sans
+ss2ant
+s4sanz
+ss2ara
+s3sars
+ss3att
+ssau3e
+ssau4r
+4s3s2ä
+4ssb
+6ssc
+s2sce
+ssch2
+s2scr
+4ssd
+4ss1ec
+4sse1e
+4ssef
+4sseg
+4sseh
+sseh2a
+4ssei
+ss4eind
+sse3int
+4ssek
+4sselek
+sse2lö
+4ssemp
+6ssendet
+4s3sendu
+6ssenerg
+ssenmas6
+ssen6sem
+4ssentl
+4ssentz
+ss1epe
+sse6ratt
+ss2erf
+ss3erfü
+ss4ergr
+sser4hö
+sser6mit
+s2serö
+sser4öf
+4ss3erse
+ss4eru
+sser6wei
+4ssesc
+3ssesh
+sses4sa
+4ss3e4str
+sse3ta
+s3sety
+4ssez
+4ssf
+4ssg
+4ssh
+ss3hi
+4ssic
+ss3i2ko
+s2simp
+6ssio
+s4s1isr
+4ssit
+4ssj
+4ssk
+s3skala
+4s4s3l
+4ssm
+4ssn
+4sso
+sso2f
+ss1off
+ssoi4
+s3sol
+s4sop
+ss2orc
+4ssö
+4ssp
+ss2pen
+ss2phi
+s3sprä
+s3spri
+ssquet4
+4ssr
+4s4s3s4
+sssau4
+4sst
+sst2a
+s5stad
+s6stag
+s3stä
+ss1t2e
+s4ste.
+s5stel
+s5s2tep
+s5stern
+s4stes
+s4stet
+s5steu
+ss1tis
+s3sto
+s5stop
+ss1tor
+s3stras
+s3strat
+s3strö
+s3stü
+4ssum
+s2sumg
+s2sumr
+ss1ums
+4ssunt
+4ssup
+ss2ur
+s3sus
+4ssü
+4ssv
+4ssw
+4s3sy
+4ssz
+1st
+6st.
+3s4ta.
+5staa
+5stab.
+2stabb
+4stabel
+2stabg
+2stabh
+4stabit
+2stabl
+2stabn
+2stabt
+2stabz
+st2ac
+3s2tad
+4stada
+4stadm
+4stadr
+2stag
+3s2tagr
+3stah
+2stak
+2stala
+sta3lak
+2stalb
+2stalg
+3sta3l2i
+2stalk
+st1alp
+st1alr
+3stam
+st1a2mi
+4stampl
+4stamt
+4stanb
+s2tand
+4stanf
+6stangeh
+4stanh
+4stanl
+4stanm
+4st1ann
+st3ansp
+4stanst
+2stanw
+4stanza
+2st1app
+s2tar.
+sta6rens
+s2t2ars
+2stasc
+stast4
+2statb
+7s2tati
+7statth
+7statu
+2stauf
+2staug
+5staur
+2staus
+st1a2ve
+2stax
+3stäb
+3städ
+2stäg
+2stält
+2stämt
+3ständ
+4stäp
+5s2tär
+3stätt
+2stäus
+4stb
+2st3c
+4std
+3ste
+4steam
+s2tean
+4stechn
+4stecu
+ste2d
+st1edi
+ste2g3r
+s2teh
+4stehr
+4steic
+4st1eid
+5s2teig
+stei4gr
+4steil
+6steinga
+6steinhe
+stein6sp
+s2tel
+s3tele
+5st2ell
+stel6l5än
+ste4mar
+ste6ment
+6stemper
+4stempf
+ste4na
+4st3ends
+st2ens
+4stentf
+4stentl
+4stents
+4stentw
+4stepi
+st1e2po
+ste2r3a
+s2terb
+4sterbs
+6stereig
+s2terf
+st3erfü
+st2erg
+s2terh
+s2terj
+s2terk
+sterma7sse
+s2tern
+6sterras
+s2ters
+ste4s1e
+stes3ta
+4stestb
+4stestn
+stes3tr
+4stests
+ste4tag
+s2teu
+4steuf
+st1eun
+st1ev
+4stex
+s2texa
+4stf
+2stg
+2sth
+st4hen
+st3hi
+st3ho
+4stief.
+4stiefl
+3s4tiel
+3stif
+st2il
+4stimma
+2stimp
+2st1inb
+2stinf
+3sting
+2stins
+4stint
+s4tio
+2stip.
+sti2r
+st1ira
+st1iri
+st1ita
+2stite
+2stj
+2stk
+4stl
+4stm
+stma3s2
+2stn
+sto2bl
+4stocht
+s2tode
+3s2tof
+stof8fens
+6stoffiz
+3stoj
+sto3mi
+2stomn
+2ston
+s2to4ne
+2stope
+2stopo
+2stord
+2storg
+s2tory
+3stos
+4stou
+4stöch
+2stöl
+5s2tör
+2stöst
+2stöt
+4stp
+2stq
+st4rade
+3straf
+stra4fa
+2strag
+3s2trah
+2strai
+3s2tral
+4strans
+s2tras
+3straß
+4straum
+2sträc
+2s3träg
+4sträne
+2stre.
+4strech
+2stref
+2streg
+4streib
+5st6reif
+2strep
+2stret
+2strev
+3s4tria
+2strib
+4strig
+4strisi
+2striu
+4stroc
+3s2trof
+3stroh
+3s2trok
+4stropf
+3s4tropo
+st4ross
+4strost
+3stroy
+2ströp
+2strub
+3struk
+s2trum
+2strun
+4strup
+4st3s2
+stsas2
+2st3t4
+st2u
+3stub
+4stuch
+3stud
+2stue
+3stuf
+2stug
+st3uga
+3stuh
+2stuk
+2stumo
+2stumr
+2stum2s
+s3tumsc
+2stumt
+2stumz
+2stun.
+2st3una
+2stune
+2stunf
+2st3uni
+2stuns
+2stunt
+3stuö
+stu3ra
+stu5re
+2st3url
+2s3turn
+2st3urt
+3s2turz
+4stüch
+3s2tück
+3stüh
+2stür.
+2stüre
+2stürg
+2stürs
+2stürw
+2stütc
+2stv
+2stw
+stwor2
+2sty
+4sty.
+4s3typ
+4stys
+2st3z2
+1su.
+su1an
+3su2b3
+su4ba2
+4subi
+su4br
+5su1c
+su2cha
+su2cho
+3sud
+su2eb
+2s1u2f
+su3fi
+2s1uh
+1sui
+su1is
+su1it.
+su2k
+su3l2i
+su2m1a
+s2ume
+su2mei
+su2mel
+sument4
+su6ments
+2sumf
+s3umfa
+s3umfe
+su2min
+3summ
+sum1o2
+su2mor
+s2ump
+s3umsa
+2sumse
+s2umsp
+2s3umst
+2s3umwa
+su2n
+2s1una
+sunder4
+sun6d5erh
+sunds4
+su4ne
+4s1unf
+6sungena
+s3ungl
+4s1uni
+2s1unm
+s1uns
+2sunt
+3s2up
+sup3p4
+su2ra
+sure4
+su2rer
+3surf
+2s1urk
+s1url
+su2r1o
+s1urt
+su2s
+su3s2a
+sus1e
+sus1i
+s3u2t
+su3tr
+2sü4b
+3süc
+sü2d1
+süden4
+sü3den.
+3sün
+1süs4
+sü3sse
+sü3ssi
+1süß
+4s3v2
+svoran4
+2s1w
+s3we
+swe6gers
+sweh2
+4swie
+4swil
+4swis
+4swit
+s3wö
+s3wu
+1s2y
+2sy2l3
+sym3
+sy2n3
+3sy5s
+2s1z2
+4s3za
+4szä
+4s3zei
+4szel
+3s2zena
+3s2ze3n2e
+4s3zent
+4s3zer
+s2zes
+s2zeß
+s4zew
+4s3zie
+s3zins
+4s3zo
+sz3ta
+4s3zu
+4s3zü
+4s3zw
+4szy
+2ß3a4
+ßan1
+ßat3
+2ß1ä
+2ß1b4
+ßbus3
+2ß1c
+2ß1d4
+1ße
+2ß1e2b
+2ß1ec
+2ß1ef
+2ß1e2g
+2ß1ei
+ße2l
+2ßelek
+ße3lu
+2ß1emp
+ße4n3a4
+4ßenerg
+ße2ni
+ße2no
+2ß1entl
+2ßentz
+ße2nu
+2ß1e2p
+3ß2er.
+ßer3b
+ßer2ei
+ße2ro
+ß2ers.
+2ßerse
+ßer3t
+ß1erw
+ße2s
+2ß1es2s
+2ß1est3r
+ße2t
+2ß1ex
+2ß1f4
+2ß3g2
+ßge2bl
+2ß1h2
+1ßi
+ßi2g1a
+2ß3i2k
+2ß1il
+2ß1im
+2ß1in
+ß1j
+2ß3k4
+2ß1l2
+2ß1m2
+2ß3n2
+2ß3o2
+ß1ö4
+2ß1p2
+2ß1q
+ßquet2
+4ß3r2
+ßreli1
+ßrö2
+ßrus3
+2ß3s4
+ßsau4
+ßsch2
+2ß1t
+ßt3h
+ßt1in
+ßts2
+1ßu2
+ß1uf
+2ß1uh
+2ß1um
+ß2ung
+ß1uni
+2ßunt
+ß1ü4
+2ß1v
+2ß1w
+2ß1z2
+2taa
+2tab.
+ta2b3an
+2t1abb
+2tabd
+1tabel
+2tabf
+2tabg
+2tabh
+2t1a2bit
+2tabk
+2tabla
+1table
+4tabm
+2t3abn
+2ta4br
+4tabs
+t1abst
+2t3abt
+4tabw
+4tabz
+2t1ac
+3tacu
+t1ada
+2tadd
+ta2der
+tadi3
+tadi4s
+t1adm
+ta2dol
+t1a2dr
+ta3d2s
+tad4t3
+ta2er
+1tafe
+2tafet
+t1afg
+t1afr
+1tag
+ta2ga
+ta2g1e2i
+tagen1
+4t3a4gent
+2t1agg
+ta3gl
+2t1a2go
+tag2s1
+tag4san
+tag4st
+2tah
+tah2li
+3tai
+ta3i2k
+tai2l1
+ta1ins
+tai4r
+ta1ir.
+ta1i2s
+1tak
+2t1a2ka
+ta3kes
+2t1akk
+ta2kro
+2taks
+tak2t1o2
+t2aktu
+2takz
+3t2al.
+ta2la
+ta3lag
+tal1an
+ta3lat
+tal3au
+1talb
+tal3d4
+1tale
+ta4l3end
+tal3eng
+ta4lens
+tal6ents
+ta4lerg
+ta2let
+tal2ga
+tali6ene
+tal4l3ac
+tal4leg
+tal4lei
+tal4let
+tal6leut
+tal6lin6s
+tal4los
+tall2ö
+tall3s
+tal4lus
+2t1alm.
+ta2lop
+ta2l1o2r
+tal2se
+tals3en
+t1al3ta
+tal3th
+talt4r
+ta2lu
+2tam
+3tam.
+t2amen
+t1a2mer
+tam2ma2
+tam4m3er
+tam4mi
+tam4mut
+t1ampl
+3t2ams
+t1amt
+t1a2na
+tan3ab
+4tanal
+ta4nat
+2t1a2nä
+tan3da
+tand4ar
+tan2dr
+ta4nerf
+4tanf
+4tangeb
+tan4gra
+2tanh
+t2anho
+t4ani
+3tanj
+1t2ank
+tan2kl
+2t3anl
+t1anm
+4t1anna
+3t2anne
+t1ano
+t1ans
+t2ans.
+4tansi
+tan4tan
+t4ante.
+4tantei
+2tantr
+2tanwa
+2tanwä
+t2anz.
+t1anza
+4tanzei
+t1anzu
+4tanzü
+tan2z1w
+tao2
+ta3or
+t4ape
+ta2pes
+2tapf
+ta2pl
+ta4poka
+t2appe
+ta2ra
+2tarab
+3tarabb
+ta3rak
+2taram
+tar3ap
+t2arau
+2tarb
+3tarba
+3tarbek
+3tarber
+3tarbi
+3tar3bl
+2tarc
+3tarchr
+t2ard
+t2arei
+ta2rel
+ta2r1er
+tar3g
+ta1r2h
+3tari
+tark4l
+t2arko
+4tarkt
+t2arl
+2t1arm
+t2armä
+ta2rom
+2tart
+t2arta
+tar6ter6e
+3t2arth
+t1arti
+3t4artis
+tar2to
+tar2tr
+ta2ru
+2t1arz
+3tarzu
+t2as.
+ta3sa
+1tasc
+ta5se
+4t1asp
+2t3assi
+1tast
+ta4stem
+ta2sto
+ta3str
+t4at.
+ta2ta2b
+ta2tan
+3tatb
+t4ate
+tat1ei
+t5a2tel
+ta2tem
+1taten
+ta2t1er
+t3atl
+ta2tom
+ta2tr
+1tatsa
+2tatt
+tau2b1a
+1taubh
+tau2bl
+tau2br
+tauchs4
+tauch5sp
+2taud
+t1auf
+3taufe.
+4taufg
+tau3f4li
+2taufn
+t3aufo
+taufs2
+2taufw
+1taug
+4t3auge
+t1auk
+3taum
+1taume
+1taus
+2t1ausb
+tau6scha
+tau6schm
+tau6schr
+tau6schw
+2tausd
+t2ause
+2tausf
+t3ausg
+t1ausk
+2tausl
+2tausr
+2t3auss
+2t5ausw
+2tausz
+ta2van
+3t2ax
+taxi3s
+4t3axt
+2tää
+2täb
+tä1c
+2täd
+t2äf
+1täg
+2tägy
+2täh
+3täle
+2täll
+2t1ält
+4tä2m
+t1ämt
+t1ängs
+1tänz
+2t1äp
+2täq
+tä4reng
+tä2ru
+2tärz
+tä2s
+t2ät
+3tätigk
+4tätt
+2täug
+1täus
+2täuß
+2täx
+1tà
+4t3b4
+tbauer4
+tbe3r2e
+tblock5e
+tblocken8
+tbus3
+2t1c
+t3cha
+t3che
+tch2i
+tch3l
+t3chr
+t2ch1u
+tch1w
+t3cl
+tcor2
+t3cr
+4t5d4
+tdar2m1
+tdun2
+1te2a2
+tea3c
+te3ad
+te3ag
+2teak
+te3al
+teamma3
+te3an
+te3ar
+tea4s
+3teba
+t4ebb
+2t1e2ben
+t2ech
+1techn
+te2chu
+2teck
+t1ecu
+te2dit
+1tee
+te1em
+teen1
+te2er.
+te1erw
+tee3t
+3tefa
+2teff
+2t1egg
+te2hac
+2tehe
+te2him
+2t1ehr
+1teic
+tei1fl
+teik2
+1t2eil
+tei2la
+tei6lent
+teim2
+2tein
+t2ein.
+teinbus6
+t2eine
+teinen4
+tei6nens
+tein6hab
+t3einkü
+te2i3s
+t1eis.
+t1eisb
+te5isch.
+tei3t
+t1eiw
+tei3z
+te2kel
+tek3t4
+te2la
+tel3ab
+tel1ac
+te3lan
+te4lant
+tel1au
+te2lä
+teld4
+tel1ec
+1telef
+1teleg
+tel3ehr
+2telem
+tel3eng
+te2ler
+te2leu
+4t3elf.
+te4lim
+te2l1in
+te2lit
+tel6lant
+tel3le
+tel6lein
+tel3li
+tel6li6st
+te2lob
+te4lost
+te2l1ö
+tel3s2k
+tel3ta
+telt4r
+te2map
+te2m1au
+te3mä
+t2emb
+te2m1ei
+te2m1er
+2temg
+te2mi
+tem3i2m
+tem3ing
+2teml
+2temn
+2temo
+te2m1o2r
+3temper
+2tempf
+1tempo
+te2mu
+te4mun
+t6en.
+ten1a2
+te4nad
+te4n3an
+te4nas
+te4nat
+ten3au
+ten3ä4
+ten3da
+t3endal
+tend4an
+4tendap
+2t5endf
+2t1endl
+t6endo
+2t5endp
+ten3d4r
+te2n1e2b
+te2nef
+te2neh
+ten3ei
+te3n4ei.
+tene4m
+tenen1
+te4n3end
+te4nene
+te4neng
+te4nens
+4t3energ
+te4n3ern
+tenf4
+t1eng.
+teng2a
+4ten4gag
+t3engla
+te2ni
+te4nil
+ten1im
+te4n3in
+tenk4
+ten3n2
+te2nol
+te3nö
+4t3ensem
+ten6serg
+1tenso
+tens2p
+t2enta
+t1entb
+2tentd
+ten3te
+2t3entl
+2t3entn
+ten6tric
+t3en4tro
+2t1ents
+4t5entw
+2tentz
+te2nu
+te2ny
+teo2f
+2t1e2pi
+tept2
+t4er.
+t4era
+tera2b
+ter3ac
+te2rad
+te1ral
+tera2m
+ter4ane
+te2r3ap
+ter3as
+2t1erbs
+2t1erbt
+ter3d
+4t3erde.
+terd2s
+te2re2b
+te2rec
+t3ereig
+tere2m
+te4r3emi
+te4r3end
+te4rene
+te4reng
+te4r3ent
+terer3k
+terer3l
+te4r3erp
+te4rers
+te4rerw
+te2ret
+t4erfr
+terg2
+ter3ga
+6tergebn
+t6ergem
+t6erges
+t6ergew
+ter3gl
+6tergrei
+t4ergru
+2t1ergu
+2tergü
+t6erhall
+t4erhan
+t4erhau
+t4erhäu
+t4erhei
+t2erhi
+t2erho
+6terhöhu
+t2erhu
+te3ria
+ter3iko
+terin5d
+ter3k
+4terklä
+t4erlä
+t4erli
+termas4
+1termi
+t2ern.
+ter4nar
+t6ernc
+ter4obe
+2teros
+t1e2r1ö
+t4erp
+t4erra
+3terras
+ter4re.
+t4erro
+t4ers.
+t2erse
+terst4
+t4erst.
+t6erstad
+ter6stat
+t4erstä
+t4ersti
+t4erstr
+t4erstu
+t4erstü
+ter3t4a
+tert2o
+t4eru2
+te4r1uf
+t4erv
+4t3erwäh
+4tery
+ter3z2a
+2t1erzb
+t4erzei
+4terzeu
+ter5zo
+ter3zw
+te2s
+tes3ac
+tesa2k
+te3sä
+te3sc
+tes3eli
+te3ser
+te3si
+te3so
+te3sp
+tes1pe
+te4spr
+2t1essa
+3tesse.
+tes3si
+tes2t
+tes3tät
+1testb
+te6sterg
+te6sterh
+te6sterk
+test3r
+t3estri
+1tests
+t2et.
+te4tabl
+2te2tap
+te2tat
+4tetl
+3teuf
+te1u2n
+2t1eup
+te2va
+te2vi
+tewa2s
+3tewo
+1tex
+t1e1xa
+2t1e2xe
+te3xel
+2t1e2xi
+4texp
+tex4ta
+2t1exz
+2t3f6
+tfäs3
+2t1g2
+tga4s3er
+t3ge
+tgenen3
+tger2a
+tger2i
+tg4r
+tgro3
+t1h
+4th.
+2th2a
+3t4ha.
+3t2hag
+4thak
+3thal.
+t2hali
+3thalp
+t2han.
+t3hand
+t3hap
+4t3hau
+2thä
+4thäl
+2thb
+4thc
+1t2h2e
+3thea
+2t3heb
+2t3hef
+2t3hei
+t4he1in
+3t4hek
+t4hema
+2themd
+t4heme
+2themm
+t4hene
+t4heni
+3theo
+t3herd
+t4herm
+thero3
+2t3herr
+2t3herz
+4t3hess
+2thf
+t2hi
+3thi.
+thic3k4
+t3hiel
+thi3er.
+2t3hil
+2t3him
+t3hin
+thi3nu
+2t3hir
+2thk
+2th3l
+4th3m2
+thmu2
+2th3n
+t2ho
+2t3hob
+t3hoc
+tho3chr
+t3hof
+2t3hoh
+t4hol.
+t4holo
+2tholz
+2t3hot
+3thotr
+2thou4
+t3hov
+2t3hö
+2thp
+1th2r2
+2ths
+2tht2
+2thub
+2thuh
+4t5hun
+2thut
+2thü
+2thv
+t2hy
+ti2ad
+ti3ag
+tial2l
+ti3a2m
+ti2are
+tib4
+ti1ce
+ti3chr
+t1id
+t2id.
+4tidee
+ti4d3en4d
+tie3br
+1tief.
+4tiefel
+1tiefl
+tie2fr
+tieg4
+ti2e1i
+ti1el
+ti2el.
+tiel3a
+ti3e2n1
+tie4rei
+tie4reu
+tiermas6
+ti2ern
+1tierr
+2tieß
+ti1eu
+1tif.
+ti3fe
+tif3f
+ti1f4r
+ti2gan
+2t3i2gel
+ti4gerz
+ti2git
+tih2
+tihi4
+ti2kam
+ti2kar
+ti4kau
+ti3k2en
+tik4ere
+ti2kin
+ti4klu
+ti2kn
+tik1r
+ti2kra
+ti2krä
+ti4k3rei
+tiks2
+ti4lant
+ti2lar
+ti2lei
+ti2lel
+1tilg
+3tilgu
+tille4b
+2tillu
+ti3lo
+ti2lö
+tilt4
+ti2lu
+ti2ma2g
+2timm
+tim2ma
+timma6te
+timmer4
+tim6merg
+tim4mit
+2timp
+ti3naf
+ti3nak
+ti2nam
+ti2n3an
+2t3ind
+ti5n2e
+tine1i
+2t1inf
+tin2g1a
+tin4g3l
+ting3s2
+t1inh
+3tinis
+t1in1it
+4tinj
+t1inka
+tin2k1l
+tin2kn
+tin2kr
+t1inku
+t2inn
+ti2nor
+t1ins
+t2ins.
+t3insa
+t2insä
+4t3inse
+tin4spa
+tin4sum
+t1int
+ti3nu
+tin2um
+4t1inv
+3tio
+ti2osk
+tioxi3
+1tip.
+ti3p4l
+3tips
+ti4que.
+1tirad
+ti1rh
+ti4ron
+ti6schei
+tisch3l
+tisch3w
+ti2sei
+ti3sk
+t1isl
+ti2sp
+t1isr
+ti3s2th
+ti4s3tic
+ti2su
+2t1iß
+tit2a
+ti2tal
+3ti3te
+tium2s
+ti2van
+ti2vel
+ti4vene
+tiver2
+ti4verh
+ti4verk
+ti4verl
+ti2v1o
+ti4v3r
+ti2za
+ti2zir
+2t1j
+4t3k4
+2t3l2
+4tla
+tlan2g
+tl4e
+tlei6der
+tle2ra
+4tli
+tlings3
+tli5ni
+tlit1
+t5lö
+2t1m2
+tmen8schl
+tmen4t5
+tmo4des
+t3mu
+4t3n4
+t5na
+tnes4
+tni3v
+to4as
+to5a4t
+t2oba
+1to3be
+2tobj
+tob2l
+t1obs
+1tobt
+to1ch
+2t3ochs
+1tocht
+2tock
+tock5ent
+1t4od
+tod1er2
+todes3t
+to2d1un
+toffen8st
+tof6f5ent
+tof4f3er
+2toffi
+2t3ohr
+toi4r
+tok4
+to3le
+1toler
+tomar4b
+tom1en
+2tomg
+to2min
+2tomk
+1tomo
+to2m1u
+to4mun
+1ton
+to2nan
+ton3au
+tond2
+to2n2eh
+toner6ke
+to4n3ig
+to3ny
+3too
+to3om
+to2pak
+to2pan
+to2pat
+top1hi
+1topo
+2to4pt
+t4or.
+to4rän
+t1ord
+t2ordi
+2t3ordn
+t4ore
+to4rein
+to2rel
+to2rem
+to3ren
+tor4fan
+t1or3g
+2torga
+6t5orient
+tor3int
+to2rop
+to2rö
+1torp
+t4ors
+2t1ort.
+tor3ta
+1torte
+t1orth
+tort4s
+to4ru
+to3rü
+to4rüb
+t2orw
+to3s2
+tos4s
+to2tä
+1toten
+to2tho
+1t2ou
+touil4
+to3un
+tö2c
+1töch
+2töck
+2t1ö2d
+2tö2f
+4t1ök
+1tö4l
+2töl.
+1tön
+t1ö4st
+1töt
+2t3p4
+tpf4
+tpi2n
+2t1q
+t2r4
+2tr.
+t4rab
+1trac
+tra3cha
+tra3chl
+2t3rad.
+tra4dem
+1tradi
+t3radie
+2tradp
+tra4fah
+tra4far
+1t4rag
+tra5gen
+2trahm
+3t4rai
+2t3rake
+t4rakt
+tra4leb
+tral3l
+1tram
+3t4ran.
+4trand
+1trank
+t3rann
+5t4rans
+1trapp
+tra4sta
+tra4str
+2traß
+1trau
+4traub.
+4trauc
+t4rauf
+2traup
+traus2
+2trauß
+1träc
+2träd
+1träg
+1träne
+t1räts
+2träuc
+1träum
+4t5re.
+2trea
+t3reak
+2treb
+tre2br
+2trec
+t3rech
+t4reck
+3treck.
+2t3red
+1tref
+2trefe
+2trefl
+2trefo
+2treg
+2t3reh
+t4rei.
+1t4reib
+2treif
+2t3reig
+2t3reih
+t4reik
+2t3rein
+2t3reis
+tre7isch.
+2treit
+t3reiz
+t3rek
+2t3rel
+t4rem
+t4ren.
+1trend
+1trenn
+t3rent
+2trepe
+2t3repo
+1trepp
+t3repr
+t4rer
+t4res.
+1tret
+tre2ta
+t4rete
+tret3r
+tre4tri
+2t3rett
+t4reu
+2t3rev
+2t3rez
+3t4ré
+2t3rh
+3t4rib
+t4rick
+t4rid2
+1trieb
+1trief
+trie3fr
+tri4ena
+tri2er
+2trig.
+2trige
+t4rigg
+tri3gl
+t4rik
+tri4ke.
+tri4kes
+1triko
+1tril
+1trin
+t3rind
+2tring
+tri3ni
+t3rinn
+3trio
+t4rip
+2triß
+1triu
+2t5riv
+tri2x
+trizi1
+tro3b4
+1troc
+4trock.
+t4roi
+tro4kes
+trol4la
+2trom.
+tro6mans
+tro4men
+tro2mi
+1tromp
+tro3na
+t4rop
+tro1pe
+3tropf
+tro3sm
+1trost
+2trout
+4t3röc
+2tröh
+2tröm
+1tröp
+2t3rö4s3s
+1tröt
+1trub
+2t3ruc
+4truf
+1trug
+4t4ruk
+trum2
+t3rumä
+trums1
+t3rund
+1trunk
+3t4rup
+t3russ
+2t3ruß
+2t3rut
+tru2th
+trü1be
+trü1bu
+2t3rüc
+trücker6
+t4rüg
+3trümm
+try1
+2ts
+4ts.
+ts3ab
+t3sac
+t4sachs
+t2sa2d
+ts1ahn
+ts5alben
+t2sall
+t4samp
+t4s1amt
+t2san
+ts3ane
+ts3a2r
+t2s1a4s
+tsa5ssen
+t2sau
+ts2av
+t1sä
+t2säh
+t2s1än
+ts1äus
+t2sce
+t4sch3am
+t6schart
+t4schef
+t3schl
+tsch4li
+t3schra
+t4schro
+ts2cor
+t2s1e2b
+tse2e
+t2sef
+ts1eh
+tse4he.
+t3seil
+t3seme
+ts1eng
+t3s2ens
+t2s1ent
+t2s1ep
+t2s1er
+t6s5essen
+tse2t
+ts1eta
+t2seth
+t2s1eti
+t2s1e2v
+t2sex
+t3sexi
+t2s1i2d
+t2si2k
+ts3iko
+tsing4
+t2sini
+ts1ir
+4tsk
+t1skal
+t3skala
+ts4kele
+t4s3ko
+tsmas4s
+tsma5sse
+ts1off
+tso2r
+ts1ori
+ts3ort.
+t3sos
+t1s2ouv
+ts1par
+ts4pare
+ts1pas
+ts3pate
+t1sped
+t1s2pek
+ts4pend
+ts2pi
+t2s3pic
+t4spins
+ts3ple
+ts2pon
+ts2por
+ts4put
+ts5s4
+tst4
+t4stabe
+t2staf
+t4stale
+ts3tanz
+t2stas
+t4s3tat.
+t4s3täti
+t2stea
+t4stee
+t4s1tep
+t4sterm
+t4s3terr
+ts1tie
+t3s2til
+t3stim
+t2s1tis
+t2stit
+t4stoch
+t2stoi
+t2stor
+t4strac
+t4strad
+ts4traf
+t4stren
+ts4tric
+t4strie
+ts2tro2
+ts2tub
+ts2tüm
+ts1u
+3tsubi
+t2sumz
+ts3un
+t1sü
+tsü3s
+tswa2s
+4t1t
+tt1ab
+tt2ac
+tt3achs
+t5tack
+tt1ad
+tt2ag
+tta6g5ess
+t4t1ah
+tta2ke
+tt2al
+t2ta4n
+tt4anke
+t3t2ant
+t4t1ap
+tt1art
+tt1äh
+t2tän
+tt1ebe
+tt3echs
+tt1eif
+tt1ein
+t2t1eis
+tte4la
+tte4l3e4b
+t4te4leg
+tte4len
+ttel3l
+ttel1o
+t2temu
+tte4na
+ttens2
+t4tentb
+t4tentf
+t2teo
+t3ter
+tt4ere
+tt2erg
+tte4rik
+ttermas7s
+tter3nä
+tte2ro
+tt2erö
+tt2es
+tte4sa
+tte4s3ä
+tte4s1o
+t4teuf
+tt2häu
+tt3hi
+t2t3ho
+t2tid
+t2t3igi
+t2tins
+tt2int
+tt4lef
+t3to.
+t2torg
+t3tos
+ttras3s
+t2trou
+tt3rü1
+tt2sen
+tts1p
+tt4s3tät
+tt4s3tem
+tt4ster
+tt3s2z
+ttu2
+ttu3b
+t2tuc
+tt1uf
+t4tunt
+t2tu4s
+ttü2
+tt3z2
+3tua
+tu4ale
+tu1alm
+tu1alv
+tu3an
+tub2
+tuba3b
+1tuc
+tu2chi
+tu1cho
+tudie4n3
+3tue
+tu3en
+tu2ere
+2tuf
+tuf2e
+tu3fen
+t3u2fer
+3tuff
+tuf4fel
+tu2gan
+3tuge
+2tuh
+tuh4ler
+tu1ist
+t3u2kr
+tul2i
+1tum
+tum2b5l
+4t3umf
+2t3umg
+2t1umh
+2t3umk
+2tuml
+3t2umo
+2tump
+2t3umr
+4t3umsat
+2t1umsc
+tum2si
+tum2so
+2t3umt
+2t1umw
+t3umz
+1tun.
+2t1una
+2t1und
+tund2e
+1tune
+tun2en
+2t3unf
+t3unga
+2tunif
+2tu2nio
+2tuniv
+2t1unm
+3tunn
+t1u2no
+t3uns
+1tuns.
+2t3unt
+2t1unv
+2t1up.
+tu2r1a2g
+tu2ran
+turan4l
+tu2ras
+tu2rä
+tur1c
+tu2r1e2b
+tu2rei
+tur3eis
+tu4rene
+tu2r1er
+tu4res
+tu2re2t
+tu2r3e2v
+tur3f4
+turg2
+tu2rid
+turin1
+tur4mun
+1turn
+tu2r3o
+tur3s2
+tu4ru
+tu2sa
+tu4schl
+tu2se
+tu2so
+tu3ta
+2tüb
+tü3ber.
+1tüch
+tück2s
+1tüf
+2tüh
+1tür.
+tür1c
+1türe
+1türg
+1türs
+1türw
+2türz
+1tütc
+1tüte
+2tütz
+2t1v2
+t3vo
+tvoran4
+2t3w
+twa2
+twä4
+twi4e
+t4wist
+1ty
+3ty.
+2t1ya
+ty2pa
+3tys
+2t1z
+t2za2
+tz1ag
+tz3ar
+tz1au
+t2z1ä
+t3zäh
+tz1ec
+t2z1e2d
+tz1ehr
+t2z1eie
+t4z1eis
+tze4n1
+tz2ene
+t4z3entg
+t4zentl
+t4z3ents
+tz2ere
+tzer6gre
+tz1erw
+t3zer3z
+tzes1
+tze2t
+tz1eti
+tz1i2d
+tz1int
+t2z3om
+tz2th
+tz2tin
+tzu2gu
+t2zuni
+tzwan4d3
+tz1wä
+tz1wi
+t3zwie
+tz1wu
+2ua
+u3a4b
+u1a2c
+uad4r
+u1a2g
+u1ah
+u1al.
+u1a2l1a
+u1a2l1ä
+u1alb
+u1ald
+uale2
+u3a2leb
+u3a4lent
+u3aler2
+ua4lerg
+ual3erk
+u3a2let
+u1alf
+u1alg
+u1alh
+u3a2lid
+ual3l
+ualle2
+u1aln
+ua2lo
+u1alp
+u1alr
+u1als
+u1al3t4
+ua2lu
+u1alw
+u1alz
+u1am
+uan2a
+u1ans
+uant2
+u3ar.
+uara2b
+u1ars
+uar4t3an
+ua3sa
+ua2th
+uat2i
+uat2o
+u3au
+uau2s
+u1ay
+u1äm
+u1än
+uäs4
+u1äu
+2u1b
+ubb2l
+ube2be
+u8becken.
+ube2e
+u2b1ehe
+ub1ein
+ube4n1a
+uben3o
+ub2er
+u4b3erde
+ubert4
+ub4es
+ub1eul
+u3bit
+ub2l
+ub3läu
+ub3lic
+ub3lu
+ub4lut
+u2bob
+u2bop
+u2b3oz
+ub3ric
+u2b3rit
+ub4rü
+ub2san
+ubsau2
+ub6s3che
+ub2s1o
+ub2sp
+ubst2
+ub4sz
+ub3t4h
+ubu3s
+2uc
+uc1c
+uch1a
+u1cha.
+uch1ä
+u1che
+uch1ec
+u2ched
+uch1ei
+ucherin8t
+ucherma8s
+u1chi
+uch3im
+uch1in
+uch3l
+uch3m
+uchma6ss
+uch3n
+uch1op
+u2ch3r
+uch4sel
+uch2so
+uch2sp
+uchst2
+uch6t5erf
+uch6t5ert
+ucht3re
+u1chu
+u2chum
+uch3ü
+uch1w
+u1ci
+uck3elf
+uck2er
+ucker8geb
+uck3i
+uck4sti
+uck3t
+u1cl
+2u1d
+u3d2a
+ud2e
+ude3i4
+udein7
+udel3se
+uden1
+uden3e
+udert4
+udi3en
+uditi4
+ud2ob
+u2don
+ud3ra
+u3dru
+2u1e
+u2ed
+ue2en4
+u2eg
+u2eh
+ue2k
+u4ela
+ue2le
+ueli4
+uel2la
+uel3lan
+uel2lä
+ue2mi
+uen1
+u3en.
+ue4n3a2
+u3end
+uene2
+ue2ner
+uen4gag
+uenge2
+uenge4m
+uen2gl
+u3e2ni
+uenk4
+ue2no
+ue2nu
+uen6zene
+uen2zu
+uen2zw
+u2ep
+ue2r3a2
+ue2r1ä
+uerb2
+uer6baut
+uer3d2
+uere2
+ue2rec
+uer4ei.
+ue4rein
+ue4r3emi
+u3eremp
+u3e4r3ent
+ue3r4erb
+u3ererf
+ue4rer4g
+uerer4h
+uerer4l
+uerer4m
+ue6rersc
+uerer6sp
+ue6rerst
+uer3esk
+ue2ret
+u3erex
+uer3g2
+u3erin4t
+u3erl.
+uerma6s
+u3ern
+uer4nan
+uer4ne
+ue2r3o4
+uer2ö
+uer3r
+u3errü
+uer3sc
+uerst6
+uer3t4
+u3eruh
+u3erum
+u3erunf
+u3erunt
+u3erwi
+uer3z2
+ue4s
+ue5se
+ue5sp
+ue2ta
+ue4tek
+ue2ti
+u2ev
+ue2x1
+uf1ab
+u3fac
+u3fah
+uf1ak
+u3fal
+ufall4
+ufa2n
+uf3ane
+u2f3a2r
+ufa2t
+uf1au
+u2f1än
+u2f1ä6s
+u2f1ä2ß
+u2f1ei
+ufel4s3a
+u2f1em
+u3fen.
+u2fent
+u2ferf
+u2f1erh
+u4ferla
+u4ferle
+u4ferne
+u2f1eß
+u2f1et
+2uff
+uf3fe
+uffel2
+uff4l
+uf2fro
+u2f1id
+u2fim
+u2f1ins
+uf3l
+u2fob
+ufo2r
+uf1ori
+uf3r
+uf5sä
+uf3sc
+uf2spo
+uf4stab
+uf4ster
+uf4s3tic
+2uft
+ufta2b
+uft1eb
+uf3ten
+uft3erd
+uft3er4g
+ufter4l
+uf4tin
+uft3s2
+u2fum
+2u1g
+ug2abe
+u4gabte
+u2g1a2d
+u2g1ak
+ugang4
+u2gani
+u2gans
+u2ganz
+u2g1ap
+ug1ar
+uga4s
+ug1au
+ug3d4
+u3ge.
+ug1ei
+u2geig
+u2gein
+uge4lob
+ugenma3
+ugenmas6
+u2g1erf
+u2g1erl
+u2gerr
+u2gerv
+u2g1esk
+ug2et
+ugg2
+ug2gl
+ug5g4t
+ug3hu
+u2g1i2d
+u2gim
+ug1in
+u2gl
+u4g1lä
+u6gleitb
+u6gleitu
+u4glic
+u4glis
+ug3liz
+u4g3lo
+u4glu
+u4g3n
+ugo3
+u2go4b
+u2g3oc
+u2g3om
+ugo4p
+u2g1or
+u2gö
+u2g3rä
+u2greg
+u4g3reis
+u2gres
+ug3rie
+ug3ro
+ugro3s
+u2grou
+ug3rüs
+ug3sei
+ugsma3
+ugsmas4
+ug2spe
+ugs4por
+ug3stä
+ugs1te
+ug4stur
+u2gum
+ug4unge
+ug2uns
+ugu6sten
+ugu6ster
+u2gü
+u1h
+uh2a
+2u5he
+uhe3a
+2uhi
+2uhl
+uh1la
+uh2lar
+uh1lä
+uh4l3ent
+uhl3erb
+uh2li
+2uhm
+uhr1a
+uhrei4s
+uh2r3er5
+2uh3ri
+uh4rin
+uh2r3o
+uh2ru
+uh4rü
+uhs4
+u2hu
+2uhü
+uh1w
+2ui
+ui1ch
+ui2che
+u1ie
+ui1em
+u3ig
+u4ige
+uil4les
+u1im
+u3in.
+uin3n
+u3isch.
+u3ischs
+uis2e
+uisi4n
+ui2st
+uit3s
+u1j
+uk2a
+uk1äh
+u3käu
+u1k2e
+uke2n1
+u1ki
+2u1k2l
+ukle1i
+u1k4n
+uko2m1
+uk2ö
+u1kr
+uk2ta
+uk2t1el
+uk2t1er
+uk2tin
+uk4t3o4ri
+uk2t3r
+ukts2
+uk2tum
+u1ku
+uku2s
+uk2ü
+u1l
+ul1am
+ulan2e
+ul2ar
+ula2sc
+ul1äm
+ul4dan
+ul2dei
+ul2dr
+uld2se
+2ule
+u2l1el
+ul1emb
+ule4n
+ul1er2h
+ule4s1t
+ule2t
+ul1eta
+2ulf4
+ul1id
+uli2k
+ul1ins
+ul3ka
+ul2kn
+ulla2g
+ull1au
+ul2lä
+ul3len
+ul3l2i
+ulli2n
+ul2lo
+ul2lö2
+ull3s2
+ulm2e
+ulni2
+ulo2i
+u2lop
+u2l1or
+ulp1h
+ul2pha
+ul2sa
+ul4sam
+ul2s1ec
+ul2sei
+ul2ser
+ul2sum
+2ult2a
+ult3ar
+ul2tri
+ult3s
+u2lü
+ul2vr
+ulz2w
+u2mab
+u2m1ad
+u2m1a2k
+um1all
+um1ang
+u5mann
+um1anz
+u2m1ap
+um1a2r
+u2marc
+u2marm
+u2mart
+u3mat
+u4matl
+u4matm
+u2maus
+u2maut
+u2m1äh
+1umd2
+u3me.
+u2m1ef
+u2m1ein
+umen1e
+um5engel
+umens2
+umer2a
+u2m1erf
+um1erg
+u3merk
+u2m1erl
+um1erw
+ume4s
+1umf
+1umg
+um1ide
+um1ind
+um1inh
+um1ir
+1umk
+1uml
+2umm
+um3mä
+um4mess
+u2m3ot
+ump2fa
+ump4fin
+umpf4li
+um2pho
+1umr
+um4sam
+um4s3an
+1umsat
+um2s1er
+um2sim
+um2s1pe
+um4stem
+um2sum
+um3t4
+u2m3um
+u2m1u2r
+1umz
+un1
+2un.
+2una.
+1unab
+3unabh
+un2a3br
+un2ag
+un2al
+u3n2am
+u2n3an
+u2nap
+u2narb
+2un2as
+un3at
+unau2s
+un2är
+2und.
+un2da
+unda2b
+un4dap
+1undd
+2unde
+un3de.
+underer6
+und3erf
+und3erö
+underten8
+under8tend
+und3erz
+un2dex
+1undf
+2undg
+un2dim
+1undn
+undo2b
+un2dop
+un2dor
+2un2d3r
+4unds.
+2undsc
+und3sp
+un2d1um
+undü4
+1undv
+1undz
+u3ne
+une2b
+une2d
+un3eid
+un3ein
+un3eis
+un2emi
+une4n1
+unen2t
+u4nerk
+u4n3erz.
+un2es2
+unf2
+un3fa
+unft2s
+un2gam
+un2gat
+3ungena
+unge3r4e
+1unget
+1ungew
+un2glu
+1unglü
+un2go
+un2gr
+ung3ri
+ung4s
+ungs3tr
+ungstra8s7
+u3nic
+3u2nif
+uni3k4
+un2im
+1unio
+un2ir
+un3iro
+un3isl
+u3n2it
+1u2niv
+2unk
+un2k1a2
+un3ker
+un2k1es
+un2ket
+un2kne
+unko2p
+un2kro
+unk3s2
+unk4tit
+unk2tr
+unlö2
+un2n1ad
+unn2e2
+unne4n
+u2nob
+uno4r
+un2os
+1unr
+uns2
+2uns.
+unsch5el
+1unsi
+un3sk
+un3sp
+uns4t
+unsta4g
+unst1r
+2unsy
+2unsz
+1unt
+un3ta
+un3te
+unte4ri
+2unti
+un3tr
+unt3s
+2untu
+3unty
+2u2nu
+u3nuc
+u1nü
+unvol2
+unvoll3
+1unw
+2unwä
+u2ny
+2unz
+un3z2a
+unz2e
+2uo
+u1o2b
+u3of
+u1op
+u1or
+u3or.
+u3or3c
+uore4
+u3o2ret
+u3ors
+u3ort
+u3orw
+u1os.
+uote2
+u3o2x
+u1ö2d
+u1ök
+u1pa
+3upd
+u1pe2
+uper1
+upe4re
+uperer4
+up2fa
+upf1i
+u1pfl
+u1p2fu
+3upg
+u3p4i
+up4lu
+up2pl
+u1pr
+upra3
+u2p3ras
+up4t3a2
+upten1
+up4tene
+upt3erf
+upt3erg
+upt3erk
+upt3ers
+up4tid
+up4tim
+upt1o
+u1q
+4ur.
+u1ra
+u2rab
+u3raba
+ura2be
+u2r1akt
+u2ral2t
+u2r1a2m
+ura4na
+uran3a4t
+u3rand
+ur1ang
+uran4ge
+ur2anh
+uran5s
+ur1anz
+ur3ap
+u2r3ar
+ura4ri
+u3rasc
+ur3a4sp
+ura4str
+ur4ate
+ura3to
+u2r3att
+u2r1au
+2u1rä
+ur1äl
+ur1ä2m
+ur1än
+ur3b2a
+2urc
+urch1
+urchas4
+urcht3e
+ur3d2a
+ur3d2i
+ur1eff
+ur1eig
+u2rele
+ure2n
+ure4na
+uren6gag
+u4rense
+u4rentn
+u2r1ep
+ur1er3h
+urer3k
+ur2ert
+u2rerw
+ur1eta
+ur2eth
+ure3u
+2urf
+ur2f3l
+ur2fro
+urf4spr
+urf3t
+ur6gense
+urg3inn
+urg1l
+ur2gla
+ur2gri
+uri2c
+ur1ide
+uri3en
+u2rind
+urin8stin
+ur4mant
+ur4matt
+ur2mau
+urm2ei
+ur4mern
+urmet1
+ur2mum
+ur2mun
+ur3n2e
+4u1ro
+ur1off
+urost2
+2u1rö
+ur3p4
+2urr
+ur3re
+3ursac
+ur2san
+ursau4
+ur2s1er
+ur2s1of
+ur2spa
+urst4r
+ur2sun
+urt2
+2urta
+ur4tai
+urt3ein
+ur2tro
+u3ru
+ur2z1a
+ur2zä
+ur2z1ec
+ur2zep
+ur2zi
+ur2z1op
+urzt4
+ur2z1w
+2us
+us3a4b
+u4s3af
+usa2gi
+u3sal
+u4sall
+u4s1amb
+u4samt
+u2sang
+us2ann
+us3ark
+us5art
+u2s1a4s
+us3ate
+u1sä
+u2säh
+u2sce
+u4schab
+u4schak
+u4schef
+usch5eic
+u4sch3eu
+u3schi
+usch3mü
+u3schu
+usch5wer
+u3se.
+u3s2e3b
+u2s1ec
+u2s1ei
+u3seid
+u4sense
+u4sentl
+u3sep
+use3ran
+use4rec
+u2s1erl
+u2serp
+us1erw
+u2s1ese
+u2sex
+u3si.
+u2sid
+usi3er.
+usi5ers.
+u3sig
+us1inn
+us5is.
+us3kl
+usmas2
+usma5sse
+u1so
+us3oc
+us1oh
+u3sol
+u2sop
+us1ou
+u1sö
+u1sp
+u2spac
+us3part
+u2s1pas
+u3spec
+u3spek
+u2sph
+us1pic
+u2spo
+us2por
+u2spu
+usrich7
+us2s3eb
+usse4g
+u4s3sel
+us2se4n
+us5sende
+us6seni
+us2sep
+us2ser
+us3ser.
+uss3erf
+usser4z
+u4sset
+us2sez
+u3s2sig
+uss3k
+us2sof
+us2sum
+u2stab
+u3stal
+us2ten
+us2ter
+ust3erl
+ust2in
+u3stis
+u2s1tor
+u3stras
+u2s3trä
+u4strit
+u2s1tur
+us3ty
+u1su
+u2sumd
+u2sumg
+u2sumz
+3usus
+2uß
+u2ß1u
+2u1t
+u3ta.
+u3taf
+u2t1alt
+ut1a2m
+ut2ans
+u2t1ap
+u2t1ar
+u2taut
+ut1äh
+u2tär
+ut3c
+u3te.
+u4t1e2d
+ut1ei.
+ut1eie
+ut1ein
+ut1ela
+ute2n1
+u3ten.
+uten2a
+u2tent
+uter3a
+ute4ral
+ute5r4er
+ute6ring
+ute4ros
+u3t2es
+u3t2et
+u2t2ev
+u2t1ex
+utfi4
+ut3hel
+u2t3hi
+u2t3ho
+u2thu
+u2thy
+u2tid
+uti2vi
+utli4n
+utmas2
+utma5sse
+u3to.
+uto4ber
+uto3c
+u5to3m
+uto1p
+uto3pa
+u2tops
+utor2a
+u2tord
+u2töl
+4utr
+ut3rea
+u2trou
+ut3rü
+ut3sau2
+ut2säu
+ut3sche
+ut4schl
+ut4schm
+ut4scho
+ut4schö
+ut3ser
+ut3s2k
+ut1so
+ut1s2p
+ut3sto
+ut3tan
+ut3t2l
+utt4le
+utt1s2
+utu2b
+u2tum
+utu4n
+u2t1une
+utu4re
+utu3ro
+utu5ru
+u4tz
+utze2
+ut2zeh
+utz3eng
+utz2er
+ut2zet
+ut2z1in
+ut2z1w
+2u3u4
+uum1
+uuma2
+uungsma5
+uungsmas8
+u1ü4
+u1v4
+u2ve.
+uve3rä
+u1w
+2u1x
+ux2e
+ux2o
+uxt2
+u1ya
+2u1z
+u2z1ec
+uz2er
+uzo2f
+uz3ot
+uz1we
+uz3z2
+uzz4l
+1üb
+üb1ä
+2übc
+2übd
+üb4e2
+übe3le
+übe4na
+übe3ne
+über3
+überas4
+ü4bet
+üb3l
+üb3r
+2üc
+ü1che
+üch3l
+üch4s1c
+ücht4e
+ücke4n
+ück1er
+ück3eri
+ücker6ke
+ü4d3a4
+üde2l
+üden2g
+ü3d2ens
+üd3o4
+üdö4
+üd3r
+üd3s2
+üd3t4
+üdu2
+üdwe4
+üe2
+üeb3
+ü1ei
+ü4f1a
+ü2f1ä
+ü2f1ei
+ü2fent
+üfer2
+ü2f1erg
+üf2fl
+ü2f3i
+üf3l
+ü2fo
+üf3te
+üf4tei
+ü2fum
+ü1g
+üg2e
+üge2l1a2
+üge2lä
+üge4lec
+üge6lei6s
+üge2lo
+ügen3s
+ü2g3l
+ü2gn
+üg3s
+üh3a4
+ü1he
+ü2h1ei
+ü2h1eng
+ü2h1ent
+üh1er
+ü2herf
+ü2her2k
+ü2her2z
+ü2hex
+üh1i4
+üh1lä
+ühl2er
+ühl4sta
+ühl4sti
+üh3mo
+üh3ne
+üh1o2
+üh3r2e
+ühr3ei.
+ühre2n1
+üh1ro
+ühr3ta
+ühs2
+üh3sp
+üh3stu
+üh3t2
+üht4r
+ü1hu
+üh1w
+ü1k2
+ül1a
+ül2c
+ü3l2e
+ü4l3ef
+üle2ra
+ül2la4
+üll1ad
+üll1au
+ül2lei
+üll2er
+ül4leu
+ül2lic
+ül2lid
+ül2li2n
+ül2lo
+ül2lö
+ülls2
+ü2lö
+ü1lu
+ü2ma
+ü2ment
+üme2ra
+ü2m1id
+ü2m1in
+ü2m1u
+2ün
+ü4n3a
+ün2da
+ün2dr
+ü2n1erd
+ünf1
+ünf3li
+ün2g3l
+üngs2
+ünster3
+ün2za
+ünzu2
+ün2zun
+ün2zw
+ü1pe
+üpf3l
+ü1pi
+üp2p3l
+ür1a
+ü2r1ei
+ü2r1e2l
+ür2fl
+ür2fr
+ür4g3en4g
+ürge4ra
+ürk2e
+ü1r2o3
+ürom2
+üror2
+ür4ster
+ürte2l1
+ürt4h
+ürz2a
+ür2z1in
+ür2zö
+ür2z1w
+üs2a
+ü2schl
+üs2e
+üse1e2
+üse3l2
+üse4n
+üse1r4
+üse3t
+ü1sp
+üs2s3a
+üs2s1c
+üss2e
+ü4s3sel
+üs2s1o
+üs4st
+üs2su
+üs4t
+ü2st3a2
+ü4stei
+üste2n
+ü2str
+ü1su
+ü1ß
+2üt
+ü1ta
+ü2t1al
+ü1te
+üte3m
+üte4n
+üten3s
+ütent4
+üten3z2
+üte2ra
+üte2r1e
+üterich6
+üter3n
+ü2t3h
+ü1ti
+üt3r
+üt2s1
+ütte4n
+üt2tr
+ü1tu
+üt3z2e
+üt2zw
+ü1v
+ü1z
+3va.
+2v1ab
+vab4r
+va1c
+va1f4
+vag2a
+va2la
+2valu
+2vanb
+2vang
+2varb
+v1arm
+vas2
+2v1ass
+v4at
+va2t1a2
+va2tei
+va4t3eng
+vates2
+va2t3h
+va4tid
+vatik2
+va4tim
+va4t1in
+vati8ons.
+va4tord
+va2t3r
+vat3s2
+va2t1u
+vat3z
+2v1au
+vä1
+2v1b
+2v1c
+2v1d2
+1ve2
+ve3an
+ve3ar
+veau3s
+ve3b4
+ve3c
+ve3d
+ve3fa
+ve3g
+ve3h2
+2veig
+v2eil
+2vein
+veit2
+veits1
+ve3la
+2velan
+ve4l1au
+v1ele
+ve3lei
+ve3li
+ve3lo
+ve3ma
+ve3me
+2ve3mu
+ve3nal
+ve4nas
+ven2c
+ve3ne
+ve3ni
+ve4nin
+ve3nö
+ven5st
+ven4t3ag
+ve3nü
+ve3of
+ver1
+ver3a
+ve3rad
+2veral
+ve3rand
+ver4ane
+vera4s
+ver6bart
+ver3b2l
+ver3d2
+vere2
+verf4
+ver3fa
+ver3g4
+vergas6
+verga7sse
+ve3ri
+ve4rin
+ver3k
+vermas8sen
+vern2
+ver4sep
+ver3sta
+vert4
+ver5te
+ver3u4
+ve3s
+2vesc
+2vese
+ve4sh
+ve4s1p
+ves4t
+ve3t
+vete1
+vete3r
+2veü
+ve3v
+ve3w
+ve3x
+2v1f4
+2v1g
+2v1h
+vi2ad
+vi3ar
+vi4a3t
+vi2ä
+vi3de
+vie2ha
+vi2el
+viela2
+viele2
+vi2er
+vie4rec
+vie2w1
+vig2
+2vii
+v2il
+vi2l1a
+vi2lä
+vi4l1e2h
+vi2lei
+vi4lers
+vi2l3in
+vil3l
+2v1i2m
+vima2
+vi4na
+2v1in3d
+ving3
+2v1int
+vi3sa
+vise4
+vi3s2i
+vi3s2o
+vi2sp
+vis2u
+viv2
+vi3z
+vize3
+2v1k
+2v1l2
+v3le3
+v2lie
+2v1m
+vm2e
+2v1n2
+1vo
+2v1ob
+vo2be
+vob4l
+vo3ga
+voge2l1
+vo2gu
+vol2a
+voll3ar
+voll7auf.
+vollen6
+voll5end
+2v1op
+vo2r1
+vor3a
+voran8schl
+vore4
+vor3g
+vo3ri
+vo4rie
+vo5rig
+vorm2
+vormen4
+vor3o
+vorö4
+vort4
+vot2a
+voy1
+2v1p
+vr2
+v1ra
+v2ree
+3v2ri
+v1ro
+2v1s2
+v3sz
+2v1t
+vue3
+vu2enu
+vu2et
+2vumf
+2vumg
+2vumk
+2v1ü
+2v1v
+2v1w
+2v1z
+w2a
+1waa
+wab2bl
+wa3che
+wach8stub
+wach4t4r
+1wack
+waffe2
+waffel3
+1wag
+wa5ge
+wage4n
+wa2g3n
+wa3go
+1wah
+wahl5ent
+wah4ler
+wah2l1i
+1wal
+wala3c
+wa2lar
+2walb
+wal2d3a
+wal4din
+wa2les
+wa3li
+wal4li4n
+wal2m1
+wals2
+walt1a
+wal6tere
+wal6terl
+wal2to
+wal4tur
+wa3na
+wan2d1a2
+wan2dr
+w3anf
+2wang
+wan3g2e
+wang4s
+1wann
+wan6z5en6d
+wan4zer
+wa2p
+1war2e
+ware1i
+wa3ren
+1warn
+wart4e
+war2th
+1was
+wa3sa
+was2c
+wa4scha
+wa3sche
+wa3schi
+wa4sch3l
+wa4schw
+wa3sh
+wass4e2
+wa3su
+w2ä
+1wäh
+1wäl
+wäm3
+2wäng
+1wäs3
+wä5sc
+wä4ss
+wäss4e
+2w3äu3
+2w1b2
+wbu2
+2w1c
+2w1d
+we2a
+we2b1a
+webe1i
+we2b3l
+we2bo
+we2b3r
+we2e2
+weed3
+we2fl
+1weg
+we2g1a
+we4g1ei
+weg5ersc
+we4g3l
+we4gn
+we2g1o2
+we2g3r
+weg1s
+wegs2a
+1weh
+weh4r3er
+wei2bl
+weib4r
+wei3dr
+2weie
+weifel6d
+wei2gr
+wei3k4
+1weil
+wei3nel
+weins3a
+weinsau6
+wei3sc
+wei2t3r
+weit1s
+wei5ze
+welle4
+wel6schl
+wel6schr
+wel2t1
+welt3a2
+welte4
+wel6t5en6d
+wel4th
+welt3i
+welt3r
+wem2ma2
+wen3a2
+wen2gl
+we3n2i
+wen2ka
+wen4kla
+wen4k3ri
+we2r3a2
+wer5be
+werbe3i
+wer2bl
+werb2s
+1werbu
+werd2
+werde3i
+5werdens
+1werdu
+werer2
+wer2fl
+2werg
+wer6gels
+wer2g3o
+wer2gr
+werin2
+we4r3io
+1werk.
+wer4k1a
+1werke
+wer2ki
+wer2k3l
+wer2kn
+wer2ko
+wer4kre
+wer2ku
+we2rö
+wer4sta
+wer2ta
+wer2tä
+wer3t3ei
+wer6teig
+werter6k
+wer6t5erm
+wer2th
+wer2t1o2
+wer4tre
+wer4t3ri
+wer4tum
+1we3s2e
+wesen4s3
+we2sp
+wes4t
+we4st1a
+we4stec
+we4st3ei
+we5sten.
+we6sten6d
+we5stens
+we4steu
+we4sti
+we4st1o4
+we2st3r
+we4stu
+1wet
+2wets
+wett3s
+2w1ey
+2w1g
+whi2
+w3ho
+w2i
+wicht4s
+1wid
+wi2e
+2wieb
+1wied
+wie3l2
+wie3n2e
+wie4st
+1wild
+wim2ma
+wim4m3u
+win2a
+win4d3ec
+win4dei
+win6d5erz
+1win2d5r
+2wing
+win2g3r
+win2kl
+win8n7er8sc
+win2no
+win4num
+win3s
+wint2
+1wi4r
+wire3
+wisch3l
+wi3s2e
+wi2sp
+1wiss
+wiss4z
+wi3st
+wi3th
+1witz.
+1witzl
+wiz2
+2w1k
+2w1l
+2w1m
+2wn
+wns2a
+wn3sh
+1wo1c
+wo2cha
+woch2e4
+1woh
+woh4lei
+1wolf
+wolf2s
+wol4la
+wol2lä
+wol4ler
+wor3a
+wor3d
+wo2r3i
+worn2
+wort1a
+wor4tel
+wor6terh
+wor2t3r
+worts2
+wo4r3u
+wor3ü
+wot2
+1wöc
+wöl2fo
+wört4h
+2w1p
+w2r
+w3ro
+2w1s
+ws2e
+w3s2h
+w3s2k
+2w1t
+wti2
+1wuc
+wuch4sc
+wuch4st
+w1u2f
+wuls2
+wul3se
+wund4e
+wung3r
+wung5s2
+wun2s
+wunsch5l
+4wur.
+wur2fa
+wur2f1o
+wur2fr
+wurs4
+1wurst
+wus4
+1wu2t1
+1wüh
+1würf
+1würst
+wüs4
+2w1w
+2w1z
+x1a
+1xa.
+2xa2b
+1x2ad
+1xae
+xa1fl
+1x2a3g2
+2xal
+xal2l
+xa2m
+xand4
+x2an3t2
+x2anz
+1x2as
+xau3
+xaus2
+2x1b4
+2xc
+x1ce
+x1ch
+x1cl
+4x1d
+xda2
+xdy2
+1xe
+2x1e4g
+2xek
+xe2l
+x1ele
+x1em
+3x2em.
+x2ems
+x2en
+xen3s2
+x2er.
+x2ere
+2xerl
+xers2
+2x1eu
+2x1ex
+4x1f
+2x1g
+2x1h
+xib4
+xi1c
+xich2
+2xid
+xi2dan
+xide2
+xi2dei
+xi2d1em
+x1i2do
+xi4ds
+x2ie
+xie3l
+xi3g
+xi2ler
+xi2lo
+xi2l1u
+xim2
+xin3s2
+x2is
+xi2sa
+xi2s1e
+xi2s1o2
+xi2sp
+xis5s2
+xi3stä
+xi2su
+x1i2tu
+xive4
+2x1j
+2x1k2
+xkal2
+4x2l2
+x3lä
+x3le
+2x1m
+2x1n
+2xod
+2x3oe4
+x1or
+2x1ö2
+4x1p
+xpor6ter
+xpor4t3r
+x1q
+2x1r
+4x3s2
+4x1t
+xt1a
+x3ta.
+x3tan
+xt2ant
+x3tas
+x2t1ä
+x3tät
+x2t1e2d
+xt1ein
+x2t1el
+x2tent
+x2t1er2f
+x2t1ev
+xtfi4
+x2t3h
+x2tid
+xti2la
+x2til2l
+xt1o2
+x2tor
+xtra3b4
+x2t3ran
+x2trau
+xt3rec
+xt3s2
+x2t1um
+x2t1un
+1xu
+xu1a
+2x1u2n
+xu2s3
+xuss2
+2xv
+2x1w
+2xy
+3xy.
+3xys
+2x1z
+2yab
+1ya2c
+y2ach
+y2ag
+ya1h
+y1al.
+y1a2m
+y2ana
+yan2g
+y1ank
+y2a3ra
+ya4s
+yat2
+y1ät
+y1b
+y1c4
+y2chi
+y3chis
+ych3n
+y1d4
+y3dr
+ydri4
+ydrid1
+y1e
+y2ec
+ye2d
+y2ef
+y2el
+yen4n
+y2ere
+yer2n1
+y2es
+yes2p
+y3e4st
+ye2th
+y1f2
+y1g
+ygi2
+ygie5
+yg2l
+y1h
+yhr2
+y3i4
+y1j
+y1k2
+yke3n
+yk3s
+y1l
+yl1a2c
+y2l1a2m
+yla2n
+y3lant
+yl4ante
+yl4anti
+y4lantr
+y3lat
+ylau2
+yl3c
+yle2
+y4le.
+yl1em
+y2l1es
+y2l1et
+yli4n
+yl2lo2
+yl2lö2
+yloi4
+yloid1
+yloni1
+yl1ora
+ym4a
+ym4e
+ymp2
+ym2pha
+ympi1
+yn2eu
+yn3k2
+y2n1o
+yno4d
+yno2t
+yob2
+yoga3
+yom4
+yon2a
+yon4i
+y1ont
+y1os
+y2ost
+y1ou
+2y1p
+ypa2
+yp1ab3
+yp1an
+yp2e2
+y2pf
+y2p1i2d
+y2p1in
+y2p3l
+ypo3
+y4p3s
+yp3t
+ypu2
+y2p1um
+y1q
+y1r
+yra3k
+y3r2e
+y3ri
+yri2a
+yri1e
+yri3en
+y3ro
+yro6ste
+yrr2
+y1s
+ys2an
+ys2c
+ys2e1
+ysein2
+y3s2h
+y4s3l
+ysme3
+ys2o
+ys2pa
+ys2pi
+yst2e
+yst4h
+ys2tra
+y4stro
+y3s2ty
+ysu2
+y2sur
+y3s2z
+y1t2
+y2te.
+y2tes
+yt4h
+ythe1
+y3to
+y4t3r
+yt3t
+y1u2r
+y1v
+y1w
+y1y
+y1z2
+yzer2
+2z1a2b
+zab3l
+za1cha
+za1chä
+2z1a2d
+2z1af
+za3gr
+3z2ah
+zah3le
+zah4ner4
+2z3ak
+4zakk
+2z1al
+3zali
+2z1a2m
+z1a2n
+z2an.
+4za4na
+2zanb
+za3ne
+2zanf
+2zangs
+3z2ank
+zan2ka
+2zanr
+zanti1
+za4pf
+z1aq
+z1ar
+3zar.
+2zarb
+2zarm
+3z2aro
+zar2tr
+2z1as
+za4sc
+za3st4
+2z1aß
+z3at
+zat2e
+za2to
+3zaub
+z1au2f
+2z3aug
+3zaun
+z3aur
+2z1aut
+2z1äc
+z2äh
+2z1äm
+z1än
+z1äp
+z1är
+2z1äus
+2zäuß
+4z3b4
+zbe3r2e
+zbü1b
+zbübe3
+2z3c
+2z3d2
+zdan2
+zdä1
+3ze.
+zeau3
+zeaus4
+2z1e2ben
+2z1echo
+ze1e2
+zeeu3
+2z1eff
+z1e2ga
+zehe4
+zehen1
+zeh2l
+ze3ho
+z2ei1f4
+zeil2
+zei3la
+zeile4
+2z1ein
+ze3in.
+zeinbus6
+z2e1ind
+zei4ne
+z2eino
+ze3inse
+ze2i3s2
+zeist4
+3zeit
+zei2t1a
+zei4t3er
+zei2tr
+zeit3ri
+ze2l1a
+zela2d
+zelau2
+ze2l1ä
+zel3d
+2ze2lek
+2zelem
+ze2len
+ze2l1er
+ze2l1in
+2z1e2lit
+zel3la
+zel4l3ac
+zel2lä
+zel4leh
+zel6lein
+zel6ler6t
+zelli4n
+zelm4
+ze2l1o
+zels2
+zel3sa
+zel3sz
+zelu2
+zembe2
+2z1emp
+5zen.
+ze4n1ac
+ze4nas
+zen3au
+ze3n2em
+zenen1
+4zenge.
+z4engl
+2zengp
+zen3n
+ze2n3o
+ze4not
+4zensem
+zens2p
+zen4tha
+z2entn
+zent3s
+2zentw
+2zentz
+ze2nu
+zen4z3er
+zen2zw
+zeo4r
+3z2er.
+zer3a
+ze1ral
+zere2b
+z2erfe
+z2erga
+2z1ergä
+4z3ergeb
+z4erges
+z4ergl
+zer4gon
+2zergu
+z2erhe
+2z3erhö
+ze3ri
+zerin6te
+z2erko
+3zerl.
+zer4lau
+zer4le.
+4zerleb
+zer4len
+2zerlö
+3z2ern
+zer4nan
+zer4n3e4b
+zer4nei
+2z1erö
+zer2öf
+2z1erq
+4z3erreg
+z2ers.
+2z1er4sa
+zerta2
+zer4t3ag
+zert4an
+zer6tere
+zer6terl
+zer4tin
+zer2to
+6z5ertrag
+zer6trau
+z1erwe
+2z1erz
+zer2ze
+4z3erzi
+ze2s
+3zes.
+ze3sc
+zes1e
+zes3er
+ze4s3po
+ze4spr
+zes2sa
+zes4sei
+zessen4
+zes6s5end
+zes4ser4
+zes2sp
+ze3sta
+zes2th
+ze2ß1
+2zeta
+2z1e2th
+ze2tr
+2zetts
+zeu2g3r
+2z1eul
+ze1ur
+2z1e2x1
+2z3f4
+zfäs3
+zfeue2
+2z3g4
+zgang5
+zger2a
+zger2s1
+2z1h2
+z2hen
+zhir3
+3zi.
+zial5l
+zi3ar
+zich2o
+zi2dei
+zid3r
+zie4ler
+zie2l1i
+zi1erh
+zi1es
+zi3ess
+3zig
+3z2il
+zil2e
+zill2
+z2imm
+2zimp
+zim2t3
+2z1ind
+zin2e
+zin3ei
+2z1inf
+z1inh
+zi4n3in
+zin1it
+2z1inj
+zin2na
+zin4o
+zin2sa
+zin4ser
+4zinsuf
+z1inv
+zi2o3
+zirk2
+zirk6s
+2z1i2so
+zisse4
+zis4t
+zistras6
+zi3s2z
+zi2tan
+zite4
+zithe2
+zi2t1o4
+ziv2
+2z1j
+4z1k4
+2z1l2
+z3ly
+2z1m2
+zmas6sen
+zme2e
+2z3n2
+z3oas
+2z1ob
+z1of
+zo2gl
+2z1oh
+zolla2
+zol3le
+zol4lei
+zoller4
+zol6lert
+zol2li2
+zon3au
+zon3s4
+zon4t3er
+zo2o
+2zope
+2z1o2r
+zo3re
+3z2orn
+zor4ne
+2z1osz
+2z1ou
+2zö2f
+2z1ök
+z1öl
+zö4le
+3z2öll
+2zöls
+2zön
+2z3p4
+2z1q
+2z3r2
+4z1s2
+z3sa
+zsau2
+z3sh
+z3sk
+zspor2
+z3str
+z3sz
+2z1t
+zta2n
+zt3ane
+z2t1au
+ztein1
+zt3eins
+zt2el
+z2t1ent
+z2t1erz
+z3tes
+zte3str
+zt3he
+z3t4hem
+z3t4her
+zt3hi
+zt3ho
+z3thr
+z3thy
+zt3rec
+zt3s
+zu3a
+zu1ä2
+zub4
+zubus2
+3zuc
+zuch2e
+zud4
+zudi4
+zu2el
+zu3e2r1
+zu3f4
+zu2gar
+zu4gent
+zu3g1l
+zu4gla
+zu4glö
+zug4ste
+zug1un
+2z1uhr
+zu3hu
+zu1i2
+zu3k
+zul2
+2z1um.
+zum2a
+2z1umb
+zumen2
+2zumf
+2zumg
+zum2i
+2zuml
+2zumr
+2z1ums
+zum2u
+2zunab
+zun2e
+2z1unem
+4zunget
+2z1ungl
+z1uni
+2zu2nio
+2zuniv
+2zunr
+2z1uns
+2zunt
+zuo2
+zup2fi
+zu3pl
+zu3r4a
+2z1urk
+2z1url
+2z1urn
+2z1urs
+2z1urt
+zu3s2
+zusch4
+zu3t2
+zut4r
+zut4u
+zut3z
+zuz2
+2zü4b
+3züc
+zür1c
+2z1v
+zw2
+z1wac
+2zwag
+2zwah
+2zwal
+2zwap
+z1war
+2zwa2s
+2zwäs
+2z1wed
+2zweg
+2zweh
+z2weig
+2zweil
+zwei3s
+zweiter6
+2z1wel
+2z1wen
+2z1wer
+2z1wes
+z2wic
+zwi4e
+3zwing
+2zwirt
+z2wisc
+2zwiss
+z2wit
+2z1wo
+z1wör
+z1wur
+2z1wü
+zy1an.
+zy2le4
+4z1z
+z3z2a
+zza3b4
+z4z3al
+zz4at
+zze3s
+z2z1id
+zzin1
+zz1ini
+zz2ö
+zzug4s
+}
+
+\endinput
+
+% Local Variables:
+% mode: tex
+% coding: latin-1
+% fill-column: 72
+% End:
+% vim: set filetype=tex textwidth=72:
diff --git a/tmac/hyphen.en b/tmac/hyphen.en
new file mode 100644
index 0000000..bd9b757
--- /dev/null
+++ b/tmac/hyphen.en
@@ -0,0 +1,5018 @@
+% title: Hyphenation patterns for American English
+% copyright: Copyright (C) 1990, 2004, 2005 Gerard D.C. Kuiken
+% notice: This file is part of the hyph-utf8 package.
+% See http://www.hyphenation.org/tex for more information.
+% language:
+% name: English, American spelling
+% tag: en-us
+% version: 2005-05-30
+% authors:
+% -
+% name: Gerard D.C. Kuiken
+% licence:
+% text: >
+% Copying and distribution of this file, with or without modification,
+% are permitted in any medium without royalty provided the copyright
+% notice and this notice are preserved.
+% hyphenmins:
+% typesetting:
+% left: 2
+% right: 3
+% changes:
+% March 1, 1990 Initial release
+% May 30, 2005 Added copyright notice, no patterns change.
+% texlive:
+% encoding: ascii
+% babelname: usenglishmax
+% legacy_patterns: ushyphmax.tex
+% message: Hyphenation patterns for American English
+% package: english
+% known_bugs:
+% de-mo-c-rat: 'instead of dem-o-crat (see GitHub issue #15)'
+% ==========================================
+%
+% ushyphmax.tex -- patterns for more hyphenation pattern memory (12000+).
+% Also known as ushyphen.max.
+%
+% Needs extended pattern memory.
+% Hyphenation trie becomes 7283 with 377 ops.
+%
+% These patterns are based on the Hyphenation Exception Log
+% published in TUGboat, Volume 10 (1989), No. 3, pp. 337-341,
+% and a large number of incorrectly hyphenated words not yet published.
+% If added to Liang's before the closing bracket } of \patterns,
+% the patterns run errorfree as far as known at this moment.
+%
+% These patterns find all admissible hyphens of the words in
+% the Exception Log. ushyph2.tex is a smaller set.
+%
+% Please send bugs or suggestions to tex-live (at) tug.org.
+%
+% 2005-05-30 (karl): in the past, ushyphmax.tex was a file containing
+% only the additional patterns, without the \patterns command, etc.
+% This turned out not to be very useful, since in practice the TeX
+% distributions need one self-contained file for a language. Therefore,
+% ushyphmax.tex now contains both the additional patterns from
+% Dr. Kuiken, and the original patterns and hyphenations from Knuth's
+% hyphen.tex.
+%
+% The Plain TeX hyphenation tables.
+\patterns{ % just type <return> if you're not using INITEX
+.ach4
+.ad4der
+.af1t
+.al3t
+.am5at
+.an5c
+.ang4
+.ani5m
+.ant4
+.an3te
+.anti5s
+.ar5s
+.ar4tie
+.ar4ty
+.as3c
+.as1p
+.as1s
+.aster5
+.atom5
+.au1d
+.av4i
+.awn4
+.ba4g
+.ba5na
+.bas4e
+.ber4
+.be5ra
+.be3sm
+.be5sto
+.bri2
+.but4ti
+.cam4pe
+.can5c
+.capa5b
+.car5ol
+.ca4t
+.ce4la
+.ch4
+.chill5i
+.ci2
+.cit5r
+.co3e
+.co4r
+.cor5ner
+.de4moi
+.de3o
+.de3ra
+.de3ri
+.des4c
+.dictio5
+.do4t
+.du4c
+.dumb5
+.earth5
+.eas3i
+.eb4
+.eer4
+.eg2
+.el5d
+.el3em
+.enam3
+.en3g
+.en3s
+.eq5ui5t
+.er4ri
+.es3
+.eu3
+.eye5
+.fes3
+.for5mer
+.ga2
+.ge2
+.gen3t4
+.ge5og
+.gi5a
+.gi4b
+.go4r
+.hand5i
+.han5k
+.he2
+.hero5i
+.hes3
+.het3
+.hi3b
+.hi3er
+.hon5ey
+.hon3o
+.hov5
+.id4l
+.idol3
+.im3m
+.im5pin
+.in1
+.in3ci
+.ine2
+.in2k
+.in3s
+.ir5r
+.is4i
+.ju3r
+.la4cy
+.la4m
+.lat5er
+.lath5
+.le2
+.leg5e
+.len4
+.lep5
+.lev1
+.li4g
+.lig5a
+.li2n
+.li3o
+.li4t
+.mag5a5
+.mal5o
+.man5a
+.mar5ti
+.me2
+.mer3c
+.me5ter
+.mis1
+.mist5i
+.mon3e
+.mo3ro
+.mu5ta
+.muta5b
+.ni4c
+.od2
+.odd5
+.of5te
+.or5ato
+.or3c
+.or1d
+.or3t
+.os3
+.os4tl
+.oth3
+.out3
+.ped5al
+.pe5te
+.pe5tit
+.pi4e
+.pio5n
+.pi2t
+.pre3m
+.ra4c
+.ran4t
+.ratio5na
+.ree2
+.re5mit
+.res2
+.re5stat
+.ri4g
+.rit5u
+.ro4q
+.ros5t
+.row5d
+.ru4d
+.sci3e
+.self5
+.sell5
+.se2n
+.se5rie
+.sh2
+.si2
+.sing4
+.st4
+.sta5bl
+.sy2
+.ta4
+.te4
+.ten5an
+.th2
+.ti2
+.til4
+.tim5o5
+.ting4
+.tin5k
+.ton4a
+.to4p
+.top5i
+.tou5s
+.trib5ut
+.un1a
+.un3ce
+.under5
+.un1e
+.un5k
+.un5o
+.un3u
+.up3
+.ure3
+.us5a
+.ven4de
+.ve5ra
+.wil5i
+.ye4
+4ab.
+a5bal
+a5ban
+abe2
+ab5erd
+abi5a
+ab5it5ab
+ab5lat
+ab5o5liz
+4abr
+ab5rog
+ab3ul
+a4car
+ac5ard
+ac5aro
+a5ceou
+ac1er
+a5chet
+4a2ci
+a3cie
+ac1in
+a3cio
+ac5rob
+act5if
+ac3ul
+ac4um
+a2d
+ad4din
+ad5er.
+2adi
+a3dia
+ad3ica
+adi4er
+a3dio
+a3dit
+a5diu
+ad4le
+ad3ow
+ad5ran
+ad4su
+4adu
+a3duc
+ad5um
+ae4r
+aeri4e
+a2f
+aff4
+a4gab
+aga4n
+ag5ell
+age4o
+4ageu
+ag1i
+4ag4l
+ag1n
+a2go
+3agog
+ag3oni
+a5guer
+ag5ul
+a4gy
+a3ha
+a3he
+ah4l
+a3ho
+ai2
+a5ia
+a3ic.
+ai5ly
+a4i4n
+ain5in
+ain5o
+ait5en
+a1j
+ak1en
+al5ab
+al3ad
+a4lar
+4aldi
+2ale
+al3end
+a4lenti
+a5le5o
+al1i
+al4ia.
+ali4e
+al5lev
+4allic
+4alm
+a5log.
+a4ly.
+4alys
+5a5lyst
+5alyt
+3alyz
+4ama
+am5ab
+am3ag
+ama5ra
+am5asc
+a4matis
+a4m5ato
+am5era
+am3ic
+am5if
+am5ily
+am1in
+ami4no
+a2mo
+a5mon
+amor5i
+amp5en
+a2n
+an3age
+3analy
+a3nar
+an3arc
+anar4i
+a3nati
+4and
+ande4s
+an3dis
+an1dl
+an4dow
+a5nee
+a3nen
+an5est.
+a3neu
+2ang
+ang5ie
+an1gl
+a4n1ic
+a3nies
+an3i3f
+an4ime
+a5nimi
+a5nine
+an3io
+a3nip
+an3ish
+an3it
+a3niu
+an4kli
+5anniz
+ano4
+an5ot
+anoth5
+an2sa
+an4sco
+an4sn
+an2sp
+ans3po
+an4st
+an4sur
+antal4
+an4tie
+4anto
+an2tr
+an4tw
+an3ua
+an3ul
+a5nur
+4ao
+apar4
+ap5at
+ap5ero
+a3pher
+4aphi
+a4pilla
+ap5illar
+ap3in
+ap3ita
+a3pitu
+a2pl
+apoc5
+ap5ola
+apor5i
+apos3t
+aps5es
+a3pu
+aque5
+2a2r
+ar3act
+a5rade
+ar5adis
+ar3al
+a5ramete
+aran4g
+ara3p
+ar4at
+a5ratio
+ar5ativ
+a5rau
+ar5av4
+araw4
+arbal4
+ar4chan
+ar5dine
+ar4dr
+ar5eas
+a3ree
+ar3ent
+a5ress
+ar4fi
+ar4fl
+ar1i
+ar5ial
+ar3ian
+a3riet
+ar4im
+ar5inat
+ar3io
+ar2iz
+ar2mi
+ar5o5d
+a5roni
+a3roo
+ar2p
+ar3q
+arre4
+ar4sa
+ar2sh
+4as.
+as4ab
+as3ant
+ashi4
+a5sia.
+a3sib
+a3sic
+5a5si4t
+ask3i
+as4l
+a4soc
+as5ph
+as4sh
+as3ten
+as1tr
+asur5a
+a2ta
+at3abl
+at5ac
+at3alo
+at5ap
+ate5c
+at5ech
+at3ego
+at3en.
+at3era
+ater5n
+a5terna
+at3est
+at5ev
+4ath
+ath5em
+a5then
+at4ho
+ath5om
+4ati.
+a5tia
+at5i5b
+at1ic
+at3if
+ation5ar
+at3itu
+a4tog
+a2tom
+at5omiz
+a4top
+a4tos
+a1tr
+at5rop
+at4sk
+at4tag
+at5te
+at4th
+a2tu
+at5ua
+at5ue
+at3ul
+at3ura
+a2ty
+au4b
+augh3
+au3gu
+au4l2
+aun5d
+au3r
+au5sib
+aut5en
+au1th
+a2va
+av3ag
+a5van
+ave4no
+av3era
+av5ern
+av5ery
+av1i
+avi4er
+av3ig
+av5oc
+a1vor
+3away
+aw3i
+aw4ly
+aws4
+ax4ic
+ax4id
+ay5al
+aye4
+ays4
+azi4er
+azz5i
+5ba.
+bad5ger
+ba4ge
+bal1a
+ban5dag
+ban4e
+ban3i
+barbi5
+bari4a
+bas4si
+1bat
+ba4z
+2b1b
+b2be
+b3ber
+bbi4na
+4b1d
+4be.
+beak4
+beat3
+4be2d
+be3da
+be3de
+be3di
+be3gi
+be5gu
+1bel
+be1li
+be3lo
+4be5m
+be5nig
+be5nu
+4bes4
+be3sp
+be5str
+3bet
+bet5iz
+be5tr
+be3tw
+be3w
+be5yo
+2bf
+4b3h
+bi2b
+bi4d
+3bie
+bi5en
+bi4er
+2b3if
+1bil
+bi3liz
+bina5r4
+bin4d
+bi5net
+bi3ogr
+bi5ou
+bi2t
+3bi3tio
+bi3tr
+3bit5ua
+b5itz
+b1j
+bk4
+b2l2
+blath5
+b4le.
+blen4
+5blesp
+b3lis
+b4lo
+blun4t
+4b1m
+4b3n
+bne5g
+3bod
+bod3i
+bo4e
+bol3ic
+bom4bi
+bon4a
+bon5at
+3boo
+5bor.
+4b1ora
+bor5d
+5bore
+5bori
+5bos4
+b5ota
+both5
+bo4to
+bound3
+4bp
+4brit
+broth3
+2b5s2
+bsor4
+2bt
+bt4l
+b4to
+b3tr
+buf4fer
+bu4ga
+bu3li
+bumi4
+bu4n
+bunt4i
+bu3re
+bus5ie
+buss4e
+5bust
+4buta
+3butio
+b5uto
+b1v
+4b5w
+5by.
+bys4
+1ca
+cab3in
+ca1bl
+cach4
+ca5den
+4cag4
+2c5ah
+ca3lat
+cal4la
+call5in
+4calo
+can5d
+can4e
+can4ic
+can5is
+can3iz
+can4ty
+cany4
+ca5per
+car5om
+cast5er
+cas5tig
+4casy
+ca4th
+4cativ
+cav5al
+c3c
+ccha5
+cci4a
+ccompa5
+ccon4
+ccou3t
+2ce.
+4ced.
+4ceden
+3cei
+5cel.
+3cell
+1cen
+3cenc
+2cen4e
+4ceni
+3cent
+3cep
+ce5ram
+4cesa
+3cessi
+ces5si5b
+ces5t
+cet4
+c5e4ta
+cew4
+2ch
+4ch.
+4ch3ab
+5chanic
+ch5a5nis
+che2
+cheap3
+4ched
+che5lo
+3chemi
+ch5ene
+ch3er.
+ch3ers
+4ch1in
+5chine.
+ch5iness
+5chini
+5chio
+3chit
+chi2z
+3cho2
+ch4ti
+1ci
+3cia
+ci2a5b
+cia5r
+ci5c
+4cier
+5cific.
+4cii
+ci4la
+3cili
+2cim
+2cin
+c4ina
+3cinat
+cin3em
+c1ing
+c5ing.
+5cino
+cion4
+4cipe
+ci3ph
+4cipic
+4cista
+4cisti
+2c1it
+cit3iz
+5ciz
+ck1
+ck3i
+1c4l4
+4clar
+c5laratio
+5clare
+cle4m
+4clic
+clim4
+cly4
+c5n
+1co
+co5ag
+coe2
+2cog
+co4gr
+coi4
+co3inc
+col5i
+5colo
+col3or
+com5er
+con4a
+c4one
+con3g
+con5t
+co3pa
+cop3ic
+co4pl
+4corb
+coro3n
+cos4e
+cov1
+cove4
+cow5a
+coz5e
+co5zi
+c1q
+cras5t
+5crat.
+5cratic
+cre3at
+5cred
+4c3reta
+cre4v
+cri2
+cri5f
+c4rin
+cris4
+5criti
+cro4pl
+crop5o
+cros4e
+cru4d
+4c3s2
+2c1t
+cta4b
+ct5ang
+c5tant
+c2te
+c3ter
+c4ticu
+ctim3i
+ctu4r
+c4tw
+cud5
+c4uf
+c4ui
+cu5ity
+5culi
+cul4tis
+3cultu
+cu2ma
+c3ume
+cu4mi
+3cun
+cu3pi
+cu5py
+cur5a4b
+cu5ria
+1cus
+cuss4i
+3c4ut
+cu4tie
+4c5utiv
+4cutr
+1cy
+cze4
+1d2a
+5da.
+2d3a4b
+dach4
+4daf
+2dag
+da2m2
+dan3g
+dard5
+dark5
+4dary
+3dat
+4dativ
+4dato
+5dav4
+dav5e
+5day
+d1b
+d5c
+d1d4
+2de.
+deaf5
+deb5it
+de4bon
+decan4
+de4cil
+de5com
+2d1ed
+4dee.
+de5if
+deli4e
+del5i5q
+de5lo
+d4em
+5dem.
+3demic
+dem5ic.
+de5mil
+de4mons
+demor5
+1den
+de4nar
+de3no
+denti5f
+de3nu
+de1p
+de3pa
+depi4
+de2pu
+d3eq
+d4erh
+5derm
+dern5iz
+der5s
+des2
+d2es.
+de1sc
+de2s5o
+des3ti
+de3str
+de4su
+de1t
+de2to
+de1v
+dev3il
+4dey
+4d1f
+d4ga
+d3ge4t
+dg1i
+d2gy
+d1h2
+5di.
+1d4i3a
+dia5b
+di4cam
+d4ice
+3dict
+3did
+5di3en
+d1if
+di3ge
+di4lato
+d1in
+1dina
+3dine.
+5dini
+di5niz
+1dio
+dio5g
+di4pl
+dir2
+di1re
+dirt5i
+dis1
+5disi
+d4is3t
+d2iti
+1di1v
+d1j
+d5k2
+4d5la
+3dle.
+3dled
+3dles.
+4dless
+2d3lo
+4d5lu
+2dly
+d1m
+4d1n4
+1do
+3do.
+do5de
+5doe
+2d5of
+d4og
+do4la
+doli4
+do5lor
+dom5iz
+do3nat
+doni4
+doo3d
+dop4p
+d4or
+3dos
+4d5out
+do4v
+3dox
+d1p
+1dr
+drag5on
+4drai
+dre4
+drea5r
+5dren
+dri4b
+dril4
+dro4p
+4drow
+5drupli
+4dry
+2d1s2
+ds4p
+d4sw
+d4sy
+d2th
+1du
+d1u1a
+du2c
+d1uca
+duc5er
+4duct.
+4ducts
+du5el
+du4g
+d3ule
+dum4be
+du4n
+4dup
+du4pe
+d1v
+d1w
+d2y
+5dyn
+dy4se
+dys5p
+e1a4b
+e3act
+ead1
+ead5ie
+ea4ge
+ea5ger
+ea4l
+eal5er
+eal3ou
+eam3er
+e5and
+ear3a
+ear4c
+ear5es
+ear4ic
+ear4il
+ear5k
+ear2t
+eart3e
+ea5sp
+e3ass
+east3
+ea2t
+eat5en
+eath3i
+e5atif
+e4a3tu
+ea2v
+eav3en
+eav5i
+eav5o
+2e1b
+e4bel.
+e4bels
+e4ben
+e4bit
+e3br
+e4cad
+ecan5c
+ecca5
+e1ce
+ec5essa
+ec2i
+e4cib
+ec5ificat
+ec5ifie
+ec5ify
+ec3im
+eci4t
+e5cite
+e4clam
+e4clus
+e2col
+e4comm
+e4compe
+e4conc
+e2cor
+ec3ora
+eco5ro
+e1cr
+e4crem
+ec4tan
+ec4te
+e1cu
+e4cul
+ec3ula
+2e2da
+4ed3d
+e4d1er
+ede4s
+4edi
+e3dia
+ed3ib
+ed3ica
+ed3im
+ed1it
+edi5z
+4edo
+e4dol
+edon2
+e4dri
+e4dul
+ed5ulo
+ee2c
+eed3i
+ee2f
+eel3i
+ee4ly
+ee2m
+ee4na
+ee4p1
+ee2s4
+eest4
+ee4ty
+e5ex
+e1f
+e4f3ere
+1eff
+e4fic
+5efici
+efil4
+e3fine
+ef5i5nite
+3efit
+efor5es
+e4fuse.
+4egal
+eger4
+eg5ib
+eg4ic
+eg5ing
+e5git5
+eg5n
+e4go.
+e4gos
+eg1ul
+e5gur
+5egy
+e1h4
+eher4
+ei2
+e5ic
+ei5d
+eig2
+ei5gl
+e3imb
+e3inf
+e1ing
+e5inst
+eir4d
+eit3e
+ei3th
+e5ity
+e1j
+e4jud
+ej5udi
+eki4n
+ek4la
+e1la
+e4la.
+e4lac
+elan4d
+el5ativ
+e4law
+elaxa4
+e3lea
+el5ebra
+5elec
+e4led
+el3ega
+e5len
+e4l1er
+e1les
+el2f
+el2i
+e3libe
+e4l5ic.
+el3ica
+e3lier
+el5igib
+e5lim
+e4l3ing
+e3lio
+e2lis
+el5ish
+e3liv3
+4ella
+el4lab
+ello4
+e5loc
+el5og
+el3op.
+el2sh
+el4ta
+e5lud
+el5ug
+e4mac
+e4mag
+e5man
+em5ana
+em5b
+e1me
+e2mel
+e4met
+em3ica
+emi4e
+em5igra
+em1in2
+em5ine
+em3i3ni
+e4mis
+em5ish
+e5miss
+em3iz
+5emniz
+emo4g
+emoni5o
+em3pi
+e4mul
+em5ula
+emu3n
+e3my
+en5amo
+e4nant
+ench4er
+en3dic
+e5nea
+e5nee
+en3em
+en5ero
+en5esi
+en5est
+en3etr
+e3new
+en5ics
+e5nie
+e5nil
+e3nio
+en3ish
+en3it
+e5niu
+5eniz
+4enn
+4eno
+eno4g
+e4nos
+en3ov
+en4sw
+ent5age
+4enthes
+en3ua
+en5uf
+e3ny.
+4en3z
+e5of
+eo2g
+e4oi4
+e3ol
+eop3ar
+e1or
+eo3re
+eo5rol
+eos4
+e4ot
+eo4to
+e5out
+e5ow
+e2pa
+e3pai
+ep5anc
+e5pel
+e3pent
+ep5etitio
+ephe4
+e4pli
+e1po
+e4prec
+ep5reca
+e4pred
+ep3reh
+e3pro
+e4prob
+ep4sh
+ep5ti5b
+e4put
+ep5uta
+e1q
+equi3l
+e4q3ui3s
+er1a
+era4b
+4erand
+er3ar
+4erati.
+2erb
+er4bl
+er3ch
+er4che
+2ere.
+e3real
+ere5co
+ere3in
+er5el.
+er3emo
+er5ena
+er5ence
+4erene
+er3ent
+ere4q
+er5ess
+er3est
+eret4
+er1h
+er1i
+e1ria4
+5erick
+e3rien
+eri4er
+er3ine
+e1rio
+4erit
+er4iu
+eri4v
+e4riva
+er3m4
+er4nis
+4ernit
+5erniz
+er3no
+2ero
+er5ob
+e5roc
+ero4r
+er1ou
+er1s
+er3set
+ert3er
+4ertl
+er3tw
+4eru
+eru4t
+5erwau
+e1s4a
+e4sage.
+e4sages
+es2c
+e2sca
+es5can
+e3scr
+es5cu
+e1s2e
+e2sec
+es5ecr
+es5enc
+e4sert.
+e4serts
+e4serva
+4esh
+e3sha
+esh5en
+e1si
+e2sic
+e2sid
+es5iden
+es5igna
+e2s5im
+es4i4n
+esis4te
+esi4u
+e5skin
+es4mi
+e2sol
+es3olu
+e2son
+es5ona
+e1sp
+es3per
+es5pira
+es4pre
+2ess
+es4si4b
+estan4
+es3tig
+es5tim
+4es2to
+e3ston
+2estr
+e5stro
+estruc5
+e2sur
+es5urr
+es4w
+eta4b
+eten4d
+e3teo
+ethod3
+et1ic
+e5tide
+etin4
+eti4no
+e5tir
+e5titio
+et5itiv
+4etn
+et5ona
+e3tra
+e3tre
+et3ric
+et5rif
+et3rog
+et5ros
+et3ua
+et5ym
+et5z
+4eu
+e5un
+e3up
+eu3ro
+eus4
+eute4
+euti5l
+eu5tr
+eva2p5
+e2vas
+ev5ast
+e5vea
+ev3ell
+evel3o
+e5veng
+even4i
+ev1er
+e5verb
+e1vi
+ev3id
+evi4l
+e4vin
+evi4v
+e5voc
+e5vu
+e1wa
+e4wag
+e5wee
+e3wh
+ewil5
+ew3ing
+e3wit
+1exp
+5eyc
+5eye.
+eys4
+1fa
+fa3bl
+fab3r
+fa4ce
+4fag
+fain4
+fall5e
+4fa4ma
+fam5is
+5far
+far5th
+fa3ta
+fa3the
+4fato
+fault5
+4f5b
+4fd
+4fe.
+feas4
+feath3
+fe4b
+4feca
+5fect
+2fed
+fe3li
+fe4mo
+fen2d
+fend5e
+fer1
+5ferr
+fev4
+4f1f
+f4fes
+f4fie
+f5fin.
+f2f5is
+f4fly
+f2fy
+4fh
+1fi
+fi3a
+2f3ic.
+4f3ical
+f3ican
+4ficate
+f3icen
+fi3cer
+fic4i
+5ficia
+5ficie
+4fics
+fi3cu
+fi5del
+fight5
+fil5i
+fill5in
+4fily
+2fin
+5fina
+fin2d5
+fi2ne
+f1in3g
+fin4n
+fis4ti
+f4l2
+f5less
+flin4
+flo3re
+f2ly5
+4fm
+4fn
+1fo
+5fon
+fon4de
+fon4t
+fo2r
+fo5rat
+for5ay
+fore5t
+for4i
+fort5a
+fos5
+4f5p
+fra4t
+f5rea
+fres5c
+fri2
+fril4
+frol5
+2f3s
+2ft
+f4to
+f2ty
+3fu
+fu5el
+4fug
+fu4min
+fu5ne
+fu3ri
+fusi4
+fus4s
+4futa
+1fy
+1ga
+gaf4
+5gal.
+3gali
+ga3lo
+2gam
+ga5met
+g5amo
+gan5is
+ga3niz
+gani5za
+4gano
+gar5n4
+gass4
+gath3
+4gativ
+4gaz
+g3b
+gd4
+2ge.
+2ged
+geez4
+gel4in
+ge5lis
+ge5liz
+4gely
+1gen
+ge4nat
+ge5niz
+4geno
+4geny
+1geo
+ge3om
+g4ery
+5gesi
+geth5
+4geto
+ge4ty
+ge4v
+4g1g2
+g2ge
+g3ger
+gglu5
+ggo4
+gh3in
+gh5out
+gh4to
+5gi.
+1gi4a
+gia5r
+g1ic
+5gicia
+g4ico
+gien5
+5gies.
+gil4
+g3imen
+3g4in.
+gin5ge
+5g4ins
+5gio
+3gir
+gir4l
+g3isl
+gi4u
+5giv
+3giz
+gl2
+gla4
+glad5i
+5glas
+1gle
+gli4b
+g3lig
+3glo
+glo3r
+g1m
+g4my
+gn4a
+g4na.
+gnet4t
+g1ni
+g2nin
+g4nio
+g1no
+g4non
+1go
+3go.
+gob5
+5goe
+3g4o4g
+go3is
+gon2
+4g3o3na
+gondo5
+go3ni
+5goo
+go5riz
+gor5ou
+5gos.
+gov1
+g3p
+1gr
+4grada
+g4rai
+gran2
+5graph.
+g5rapher
+5graphic
+4graphy
+4gray
+gre4n
+4gress.
+4grit
+g4ro
+gruf4
+gs2
+g5ste
+gth3
+gu4a
+3guard
+2gue
+5gui5t
+3gun
+3gus
+4gu4t
+g3w
+1gy
+2g5y3n
+gy5ra
+h3ab4l
+hach4
+hae4m
+hae4t
+h5agu
+ha3la
+hala3m
+ha4m
+han4ci
+han4cy
+5hand.
+han4g
+hang5er
+hang5o
+h5a5niz
+han4k
+han4te
+hap3l
+hap5t
+ha3ran
+ha5ras
+har2d
+hard3e
+har4le
+harp5en
+har5ter
+has5s
+haun4
+5haz
+haz3a
+h1b
+1head
+3hear
+he4can
+h5ecat
+h4ed
+he5do5
+he3l4i
+hel4lis
+hel4ly
+h5elo
+hem4p
+he2n
+hena4
+hen5at
+heo5r
+hep5
+h4era
+hera3p
+her4ba
+here5a
+h3ern
+h5erou
+h3ery
+h1es
+he2s5p
+he4t
+het4ed
+heu4
+h1f
+h1h
+hi5an
+hi4co
+high5
+h4il2
+himer4
+h4ina
+hion4e
+hi4p
+hir4l
+hi3ro
+hir4p
+hir4r
+his3el
+his4s
+hith5er
+hi2v
+4hk
+4h1l4
+hlan4
+h2lo
+hlo3ri
+4h1m
+hmet4
+2h1n
+h5odiz
+h5ods
+ho4g
+hoge4
+hol5ar
+3hol4e
+ho4ma
+home3
+hon4a
+ho5ny
+3hood
+hoon4
+hor5at
+ho5ris
+hort3e
+ho5ru
+hos4e
+ho5sen
+hos1p
+1hous
+house3
+hov5el
+4h5p
+4hr4
+hree5
+hro5niz
+hro3po
+4h1s2
+h4sh
+h4tar
+ht1en
+ht5es
+h4ty
+hu4g
+hu4min
+hun5ke
+hun4t
+hus3t4
+hu4t
+h1w
+h4wart
+hy3pe
+hy3ph
+hy2s
+2i1a
+i2al
+iam4
+iam5ete
+i2an
+4ianc
+ian3i
+4ian4t
+ia5pe
+iass4
+i4ativ
+ia4tric
+i4atu
+ibe4
+ib3era
+ib5ert
+ib5ia
+ib3in
+ib5it.
+ib5ite
+i1bl
+ib3li
+i5bo
+i1br
+i2b5ri
+i5bun
+4icam
+5icap
+4icar
+i4car.
+i4cara
+icas5
+i4cay
+iccu4
+4iceo
+4ich
+2ici
+i5cid
+ic5ina
+i2cip
+ic3ipa
+i4cly
+i2c5oc
+4i1cr
+5icra
+i4cry
+ic4te
+ictu2
+ic4t3ua
+ic3ula
+ic4um
+ic5uo
+i3cur
+2id
+i4dai
+id5anc
+id5d
+ide3al
+ide4s
+i2di
+id5ian
+idi4ar
+i5die
+id3io
+idi5ou
+id1it
+id5iu
+i3dle
+i4dom
+id3ow
+i4dr
+i2du
+id5uo
+2ie4
+ied4e
+5ie5ga
+ield3
+ien5a4
+ien4e
+i5enn
+i3enti
+i1er.
+i3esc
+i1est
+i3et
+4if.
+if5ero
+iff5en
+if4fr
+4ific.
+i3fie
+i3fl
+4ift
+2ig
+iga5b
+ig3era
+ight3i
+4igi
+i3gib
+ig3il
+ig3in
+ig3it
+i4g4l
+i2go
+ig3or
+ig5ot
+i5gre
+igu5i
+ig1ur
+i3h
+4i5i4
+i3j
+4ik
+i1la
+il3a4b
+i4lade
+i2l5am
+ila5ra
+i3leg
+il1er
+ilev4
+il5f
+il1i
+il3ia
+il2ib
+il3io
+il4ist
+2ilit
+il2iz
+ill5ab
+4iln
+il3oq
+il4ty
+il5ur
+il3v
+i4mag
+im3age
+ima5ry
+imenta5r
+4imet
+im1i
+im5ida
+imi5le
+i5mini
+4imit
+im4ni
+i3mon
+i2mu
+im3ula
+2in.
+i4n3au
+4inav
+incel4
+in3cer
+4ind
+in5dling
+2ine
+i3nee
+iner4ar
+i5ness
+4inga
+4inge
+in5gen
+4ingi
+in5gling
+4ingo
+4ingu
+2ini
+i5ni.
+i4nia
+in3io
+in1is
+i5nite.
+5initio
+in3ity
+4ink
+4inl
+2inn
+2i1no
+i4no4c
+ino4s
+i4not
+2ins
+in3se
+insur5a
+2int.
+2in4th
+in1u
+i5nus
+4iny
+2io
+4io.
+ioge4
+io2gr
+i1ol
+io4m
+ion3at
+ion4ery
+ion3i
+io5ph
+ior3i
+i4os
+io5th
+i5oti
+io4to
+i4our
+2ip
+ipe4
+iphras4
+ip3i
+ip4ic
+ip4re4
+ip3ul
+i3qua
+iq5uef
+iq3uid
+iq3ui3t
+4ir
+i1ra
+ira4b
+i4rac
+ird5e
+ire4de
+i4ref
+i4rel4
+i4res
+ir5gi
+ir1i
+iri5de
+ir4is
+iri3tu
+5i5r2iz
+ir4min
+iro4g
+5iron.
+ir5ul
+2is.
+is5ag
+is3ar
+isas5
+2is1c
+is3ch
+4ise
+is3er
+3isf
+is5han
+is3hon
+ish5op
+is3ib
+isi4d
+i5sis
+is5itiv
+4is4k
+islan4
+4isms
+i2so
+iso5mer
+is1p
+is2pi
+is4py
+4is1s
+is4sal
+issen4
+is4ses
+is4ta.
+is1te
+is1ti
+ist4ly
+4istral
+i2su
+is5us
+4ita.
+ita4bi
+i4tag
+4ita5m
+i3tan
+i3tat
+2ite
+it3era
+i5teri
+it4es
+2ith
+i1ti
+4itia
+4i2tic
+it3ica
+5i5tick
+it3ig
+it5ill
+i2tim
+2itio
+4itis
+i4tism
+i2t5o5m
+4iton
+i4tram
+it5ry
+4itt
+it3uat
+i5tud
+it3ul
+4itz.
+i1u
+2iv
+iv3ell
+iv3en.
+i4v3er.
+i4vers.
+iv5il.
+iv5io
+iv1it
+i5vore
+iv3o3ro
+i4v3ot
+4i5w
+ix4o
+4iy
+4izar
+izi4
+5izont
+5ja
+jac4q
+ja4p
+1je
+jer5s
+4jestie
+4jesty
+jew3
+jo4p
+5judg
+3ka.
+k3ab
+k5ag
+kais4
+kal4
+k1b
+k2ed
+1kee
+ke4g
+ke5li
+k3en4d
+k1er
+kes4
+k3est.
+ke4ty
+k3f
+kh4
+k1i
+5ki.
+5k2ic
+k4ill
+kilo5
+k4im
+k4in.
+kin4de
+k5iness
+kin4g
+ki4p
+kis4
+k5ish
+kk4
+k1l
+4kley
+4kly
+k1m
+k5nes
+1k2no
+ko5r
+kosh4
+k3ou
+kro5n
+4k1s2
+k4sc
+ks4l
+k4sy
+k5t
+k1w
+lab3ic
+l4abo
+laci4
+l4ade
+la3dy
+lag4n
+lam3o
+3land
+lan4dl
+lan5et
+lan4te
+lar4g
+lar3i
+las4e
+la5tan
+4lateli
+4lativ
+4lav
+la4v4a
+2l1b
+lbin4
+4l1c2
+lce4
+l3ci
+2ld
+l2de
+ld4ere
+ld4eri
+ldi4
+ld5is
+l3dr
+l4dri
+le2a
+le4bi
+left5
+5leg.
+5legg
+le4mat
+lem5atic
+4len.
+3lenc
+5lene.
+1lent
+le3ph
+le4pr
+lera5b
+ler4e
+3lerg
+3l4eri
+l4ero
+les2
+le5sco
+5lesq
+3less
+5less.
+l3eva
+lev4er.
+lev4era
+lev4ers
+3ley
+4leye
+2lf
+l5fr
+4l1g4
+l5ga
+lgar3
+l4ges
+lgo3
+2l3h
+li4ag
+li2am
+liar5iz
+li4as
+li4ato
+li5bi
+5licio
+li4cor
+4lics
+4lict.
+l4icu
+l3icy
+l3ida
+lid5er
+3lidi
+lif3er
+l4iff
+li4fl
+5ligate
+3ligh
+li4gra
+3lik
+4l4i4l
+lim4bl
+lim3i
+li4mo
+l4im4p
+l4ina
+1l4ine
+lin3ea
+lin3i
+link5er
+li5og
+4l4iq
+lis4p
+l1it
+l2it.
+5litica
+l5i5tics
+liv3er
+l1iz
+4lj
+lka3
+l3kal
+lka4t
+l1l
+l4law
+l2le
+l5lea
+l3lec
+l3leg
+l3lel
+l3le4n
+l3le4t
+ll2i
+l2lin4
+l5lina
+ll4o
+lloqui5
+ll5out
+l5low
+2lm
+l5met
+lm3ing
+l4mod
+lmon4
+2l1n2
+3lo.
+lob5al
+lo4ci
+4lof
+3logic
+l5ogo
+3logu
+lom3er
+5long
+lon4i
+l3o3niz
+lood5
+5lope.
+lop3i
+l3opm
+lora4
+lo4rato
+lo5rie
+lor5ou
+5los.
+los5et
+5losophiz
+5losophy
+los4t
+lo4ta
+loun5d
+2lout
+4lov
+2lp
+lpa5b
+l3pha
+l5phi
+lp5ing
+l3pit
+l4pl
+l5pr
+4l1r
+2l1s2
+l4sc
+l2se
+l4sie
+4lt
+lt5ag
+ltane5
+l1te
+lten4
+ltera4
+lth3i
+l5ties.
+ltis4
+l1tr
+ltu2
+ltur3a
+lu5a
+lu3br
+luch4
+lu3ci
+lu3en
+luf4
+lu5id
+lu4ma
+5lumi
+l5umn.
+5lumnia
+lu3o
+luo3r
+4lup
+luss4
+lus3te
+1lut
+l5ven
+l5vet4
+2l1w
+1ly
+4lya
+4lyb
+ly5me
+ly3no
+2lys4
+l5yse
+1ma
+2mab
+ma2ca
+ma5chine
+ma4cl
+mag5in
+5magn
+2mah
+maid5
+4mald
+ma3lig
+ma5lin
+mal4li
+mal4ty
+5mania
+man5is
+man3iz
+4map
+ma5rine.
+ma5riz
+mar4ly
+mar3v
+ma5sce
+mas4e
+mas1t
+5mate
+math3
+ma3tis
+4matiza
+4m1b
+mba4t5
+m5bil
+m4b3ing
+mbi4v
+4m5c
+4me.
+2med
+4med.
+5media
+me3die
+m5e5dy
+me2g
+mel5on
+mel4t
+me2m
+mem1o3
+1men
+men4a
+men5ac
+men4de
+4mene
+men4i
+mens4
+mensu5
+3ment
+men4te
+me5on
+m5ersa
+2mes
+3mesti
+me4ta
+met3al
+me1te
+me5thi
+m4etr
+5metric
+me5trie
+me3try
+me4v
+4m1f
+2mh
+5mi.
+mi3a
+mid4a
+mid4g
+mig4
+3milia
+m5i5lie
+m4ill
+min4a
+3mind
+m5inee
+m4ingl
+min5gli
+m5ingly
+min4t
+m4inu
+miot4
+m2is
+mis4er.
+mis5l
+mis4ti
+m5istry
+4mith
+m2iz
+4mk
+4m1l
+m1m
+mma5ry
+4m1n
+mn4a
+m4nin
+mn4o
+1mo
+4mocr
+5mocratiz
+mo2d1
+mo4go
+mois2
+moi5se
+4mok
+mo5lest
+mo3me
+mon5et
+mon5ge
+moni3a
+mon4ism
+mon4ist
+mo3niz
+monol4
+mo3ny.
+mo2r
+4mora.
+mos2
+mo5sey
+mo3sp
+moth3
+m5ouf
+3mous
+mo2v
+4m1p
+mpara5
+mpa5rab
+mpar5i
+m3pet
+mphas4
+m2pi
+mpi4a
+mp5ies
+m4p1in
+m5pir
+mp5is
+mpo3ri
+mpos5ite
+m4pous
+mpov5
+mp4tr
+m2py
+4m3r
+4m1s2
+m4sh
+m5si
+4mt
+1mu
+mula5r4
+5mult
+multi3
+3mum
+mun2
+4mup
+mu4u
+4mw
+1na
+2n1a2b
+n4abu
+4nac.
+na4ca
+n5act
+nag5er.
+nak4
+na4li
+na5lia
+4nalt
+na5mit
+n2an
+nanci4
+nan4it
+nank4
+nar3c
+4nare
+nar3i
+nar4l
+n5arm
+n4as
+nas4c
+nas5ti
+n2at
+na3tal
+nato5miz
+n2au
+nau3se
+3naut
+nav4e
+4n1b4
+ncar5
+n4ces.
+n3cha
+n5cheo
+n5chil
+n3chis
+nc1in
+nc4it
+ncour5a
+n1cr
+n1cu
+n4dai
+n5dan
+n1de
+nd5est.
+ndi4b
+n5d2if
+n1dit
+n3diz
+n5duc
+ndu4r
+nd2we
+2ne.
+n3ear
+ne2b
+neb3u
+ne2c
+5neck
+2ned
+ne4gat
+neg5ativ
+5nege
+ne4la
+nel5iz
+ne5mi
+ne4mo
+1nen
+4nene
+3neo
+ne4po
+ne2q
+n1er
+nera5b
+n4erar
+n2ere
+n4er5i
+ner4r
+1nes
+2nes.
+4nesp
+2nest
+4nesw
+3netic
+ne4v
+n5eve
+ne4w
+n3f
+n4gab
+n3gel
+nge4n4e
+n5gere
+n3geri
+ng5ha
+n3gib
+ng1in
+n5git
+n4gla
+ngov4
+ng5sh
+n1gu
+n4gum
+n2gy
+4n1h4
+nha4
+nhab3
+nhe4
+3n4ia
+ni3an
+ni4ap
+ni3ba
+ni4bl
+ni4d
+ni5di
+ni4er
+ni2fi
+ni5ficat
+n5igr
+nik4
+n1im
+ni3miz
+n1in
+5nine.
+nin4g
+ni4o
+5nis.
+nis4ta
+n2it
+n4ith
+3nitio
+n3itor
+ni3tr
+n1j
+4nk2
+n5kero
+n3ket
+nk3in
+n1kl
+4n1l
+n5m
+nme4
+nmet4
+4n1n2
+nne4
+nni3al
+nni4v
+nob4l
+no3ble
+n5ocl
+4n3o2d
+3noe
+4nog
+noge4
+nois5i
+no5l4i
+5nologis
+3nomic
+n5o5miz
+no4mo
+no3my
+no4n
+non4ag
+non5i
+n5oniz
+4nop
+5nop5o5li
+nor5ab
+no4rary
+4nosc
+nos4e
+nos5t
+no5ta
+1nou
+3noun
+nov3el3
+nowl3
+n1p4
+npi4
+npre4c
+n1q
+n1r
+nru4
+2n1s2
+ns5ab
+nsati4
+ns4c
+n2se
+n4s3es
+nsid1
+nsig4
+n2sl
+ns3m
+n4soc
+ns4pe
+n5spi
+nsta5bl
+n1t
+nta4b
+nter3s
+nt2i
+n5tib
+nti4er
+nti2f
+n3tine
+n4t3ing
+nti4p
+ntrol5li
+nt4s
+ntu3me
+nu1a
+nu4d
+nu5en
+nuf4fe
+n3uin
+3nu3it
+n4um
+nu1me
+n5umi
+3nu4n
+n3uo
+nu3tr
+n1v2
+n1w4
+nym4
+nyp4
+4nz
+n3za
+4oa
+oad3
+o5a5les
+oard3
+oas4e
+oast5e
+oat5i
+ob3a3b
+o5bar
+obe4l
+o1bi
+o2bin
+ob5ing
+o3br
+ob3ul
+o1ce
+och4
+o3chet
+ocif3
+o4cil
+o4clam
+o4cod
+oc3rac
+oc5ratiz
+ocre3
+5ocrit
+octor5a
+oc3ula
+o5cure
+od5ded
+od3ic
+odi3o
+o2do4
+odor3
+od5uct.
+od5ucts
+o4el
+o5eng
+o3er
+oe4ta
+o3ev
+o2fi
+of5ite
+ofit4t
+o2g5a5r
+og5ativ
+o4gato
+o1ge
+o5gene
+o5geo
+o4ger
+o3gie
+1o1gis
+og3it
+o4gl
+o5g2ly
+3ogniz
+o4gro
+ogu5i
+1ogy
+2ogyn
+o1h2
+ohab5
+oi2
+oic3es
+oi3der
+oiff4
+oig4
+oi5let
+o3ing
+oint5er
+o5ism
+oi5son
+oist5en
+oi3ter
+o5j
+2ok
+o3ken
+ok5ie
+o1la
+o4lan
+olass4
+ol2d
+old1e
+ol3er
+o3lesc
+o3let
+ol4fi
+ol2i
+o3lia
+o3lice
+ol5id.
+o3li4f
+o5lil
+ol3ing
+o5lio
+o5lis.
+ol3ish
+o5lite
+o5litio
+o5liv
+olli4e
+ol5ogiz
+olo4r
+ol5pl
+ol2t
+ol3ub
+ol3ume
+ol3un
+o5lus
+ol2v
+o2ly
+om5ah
+oma5l
+om5atiz
+om2be
+om4bl
+o2me
+om3ena
+om5erse
+o4met
+om5etry
+o3mia
+om3ic.
+om3ica
+o5mid
+om1in
+o5mini
+5ommend
+omo4ge
+o4mon
+om3pi
+ompro5
+o2n
+on1a
+on4ac
+o3nan
+on1c
+3oncil
+2ond
+on5do
+o3nen
+on5est
+on4gu
+on1ic
+o3nio
+on1is
+o5niu
+on3key
+on4odi
+on3omy
+on3s
+onspi4
+onspir5a
+onsu4
+onten4
+on3t4i
+ontif5
+on5um
+onva5
+oo2
+ood5e
+ood5i
+oo4k
+oop3i
+o3ord
+oost5
+o2pa
+ope5d
+op1er
+3opera
+4operag
+2oph
+o5phan
+o5pher
+op3ing
+o3pit
+o5pon
+o4posi
+o1pr
+op1u
+opy5
+o1q
+o1ra
+o5ra.
+o4r3ag
+or5aliz
+or5ange
+ore5a
+o5real
+or3ei
+ore5sh
+or5est.
+orew4
+or4gu
+4o5ria
+or3ica
+o5ril
+or1in
+o1rio
+or3ity
+o3riu
+or2mi
+orn2e
+o5rof
+or3oug
+or5pe
+3orrh
+or4se
+ors5en
+orst4
+or3thi
+or3thy
+or4ty
+o5rum
+o1ry
+os3al
+os2c
+os4ce
+o3scop
+4oscopi
+o5scr
+os4i4e
+os5itiv
+os3ito
+os3ity
+osi4u
+os4l
+o2so
+os4pa
+os4po
+os2ta
+o5stati
+os5til
+os5tit
+o4tan
+otele4g
+ot3er.
+ot5ers
+o4tes
+4oth
+oth5esi
+oth3i4
+ot3ic.
+ot5ica
+o3tice
+o3tif
+o3tis
+oto5s
+ou2
+ou3bl
+ouch5i
+ou5et
+ou4l
+ounc5er
+oun2d
+ou5v
+ov4en
+over4ne
+over3s
+ov4ert
+o3vis
+oviti4
+o5v4ol
+ow3der
+ow3el
+ow5est
+ow1i
+own5i
+o4wo
+oy1a
+1pa
+pa4ca
+pa4ce
+pac4t
+p4ad
+5pagan
+p3agat
+p4ai
+pain4
+p4al
+pan4a
+pan3el
+pan4ty
+pa3ny
+pa1p
+pa4pu
+para5bl
+par5age
+par5di
+3pare
+par5el
+p4a4ri
+par4is
+pa2te
+pa5ter
+5pathic
+pa5thy
+pa4tric
+pav4
+3pay
+4p1b
+pd4
+4pe.
+3pe4a
+pear4l
+pe2c
+2p2ed
+3pede
+3pedi
+pedia4
+ped4ic
+p4ee
+pee4d
+pek4
+pe4la
+peli4e
+pe4nan
+p4enc
+pen4th
+pe5on
+p4era.
+pera5bl
+p4erag
+p4eri
+peri5st
+per4mal
+perme5
+p4ern
+per3o
+per3ti
+pe5ru
+per1v
+pe2t
+pe5ten
+pe5tiz
+4pf
+4pg
+4ph.
+phar5i
+phe3no
+ph4er
+ph4es.
+ph1ic
+5phie
+ph5ing
+5phisti
+3phiz
+ph2l
+3phob
+3phone
+5phoni
+pho4r
+4phs
+ph3t
+5phu
+1phy
+pi3a
+pian4
+pi4cie
+pi4cy
+p4id
+p5ida
+pi3de
+5pidi
+3piec
+pi3en
+pi4grap
+pi3lo
+pi2n
+p4in.
+pind4
+p4ino
+3pi1o
+pion4
+p3ith
+pi5tha
+pi2tu
+2p3k2
+1p2l2
+3plan
+plas5t
+pli3a
+pli5er
+4plig
+pli4n
+ploi4
+plu4m
+plum4b
+4p1m
+2p3n
+po4c
+5pod.
+po5em
+po3et5
+5po4g
+poin2
+5point
+poly5t
+po4ni
+po4p
+1p4or
+po4ry
+1pos
+pos1s
+p4ot
+po4ta
+5poun
+4p1p
+ppa5ra
+p2pe
+p4ped
+p5pel
+p3pen
+p3per
+p3pet
+ppo5site
+pr2
+pray4e
+5preci
+pre5co
+pre3em
+pref5ac
+pre4la
+pre3r
+p3rese
+3press
+pre5ten
+pre3v
+5pri4e
+prin4t3
+pri4s
+pris3o
+p3roca
+prof5it
+pro3l
+pros3e
+pro1t
+2p1s2
+p2se
+ps4h
+p4sib
+2p1t
+pt5a4b
+p2te
+p2th
+pti3m
+ptu4r
+p4tw
+pub3
+pue4
+puf4
+pul3c
+pu4m
+pu2n
+pur4r
+5pus
+pu2t
+5pute
+put3er
+pu3tr
+put4ted
+put4tin
+p3w
+qu2
+qua5v
+2que.
+3quer
+3quet
+2rab
+ra3bi
+rach4e
+r5acl
+raf5fi
+raf4t
+r2ai
+ra4lo
+ram3et
+r2ami
+rane5o
+ran4ge
+r4ani
+ra5no
+rap3er
+3raphy
+rar5c
+rare4
+rar5ef
+4raril
+r2as
+ration4
+rau4t
+ra5vai
+rav3el
+ra5zie
+r1b
+r4bab
+r4bag
+rbi2
+rbi4f
+r2bin
+r5bine
+rb5ing.
+rb4o
+r1c
+r2ce
+rcen4
+r3cha
+rch4er
+r4ci4b
+rc4it
+rcum3
+r4dal
+rd2i
+rdi4a
+rdi4er
+rdin4
+rd3ing
+2re.
+re1al
+re3an
+re5arr
+5reav
+re4aw
+r5ebrat
+rec5oll
+rec5ompe
+re4cre
+2r2ed
+re1de
+re3dis
+red5it
+re4fac
+re2fe
+re5fer.
+re3fi
+re4fy
+reg3is
+re5it
+re1li
+re5lu
+r4en4ta
+ren4te
+re1o
+re5pin
+re4posi
+re1pu
+r1er4
+r4eri
+rero4
+re5ru
+r4es.
+re4spi
+ress5ib
+res2t
+re5stal
+re3str
+re4ter
+re4ti4z
+re3tri
+reu2
+re5uti
+rev2
+re4val
+rev3el
+r5ev5er.
+re5vers
+re5vert
+re5vil
+rev5olu
+re4wh
+r1f
+rfu4
+r4fy
+rg2
+rg3er
+r3get
+r3gic
+rgi4n
+rg3ing
+r5gis
+r5git
+r1gl
+rgo4n
+r3gu
+rh4
+4rh.
+4rhal
+ri3a
+ria4b
+ri4ag
+r4ib
+rib3a
+ric5as
+r4ice
+4rici
+5ricid
+ri4cie
+r4ico
+rid5er
+ri3enc
+ri3ent
+ri1er
+ri5et
+rig5an
+5rigi
+ril3iz
+5riman
+rim5i
+3rimo
+rim4pe
+r2ina
+5rina.
+rin4d
+rin4e
+rin4g
+ri1o
+5riph
+riph5e
+ri2pl
+rip5lic
+r4iq
+r2is
+r4is.
+ris4c
+r3ish
+ris4p
+ri3ta3b
+r5ited.
+rit5er.
+rit5ers
+rit3ic
+ri2tu
+rit5ur
+riv5el
+riv3et
+riv3i
+r3j
+r3ket
+rk4le
+rk4lin
+r1l
+rle4
+r2led
+r4lig
+r4lis
+rl5ish
+r3lo4
+r1m
+rma5c
+r2me
+r3men
+rm5ers
+rm3ing
+r4ming.
+r4mio
+r3mit
+r4my
+r4nar
+r3nel
+r4ner
+r5net
+r3ney
+r5nic
+r1nis4
+r3nit
+r3niv
+rno4
+r4nou
+r3nu
+rob3l
+r2oc
+ro3cr
+ro4e
+ro1fe
+ro5fil
+rok2
+ro5ker
+5role.
+rom5ete
+rom4i
+rom4p
+ron4al
+ron4e
+ro5n4is
+ron4ta
+1room
+5root
+ro3pel
+rop3ic
+ror3i
+ro5ro
+ros5per
+ros4s
+ro4the
+ro4ty
+ro4va
+rov5el
+rox5
+r1p
+r4pea
+r5pent
+rp5er.
+r3pet
+rp4h4
+rp3ing
+r3po
+r1r4
+rre4c
+rre4f
+r4reo
+rre4st
+rri4o
+rri4v
+rron4
+rros4
+rrys4
+4rs2
+r1sa
+rsa5ti
+rs4c
+r2se
+r3sec
+rse4cr
+rs5er.
+rs3es
+rse5v2
+r1sh
+r5sha
+r1si
+r4si4b
+rson3
+r1sp
+r5sw
+rtach4
+r4tag
+r3teb
+rten4d
+rte5o
+r1ti
+rt5ib
+rti4d
+r4tier
+r3tig
+rtil3i
+rtil4l
+r4tily
+r4tist
+r4tiv
+r3tri
+rtroph4
+rt4sh
+ru3a
+ru3e4l
+ru3en
+ru4gl
+ru3in
+rum3pl
+ru2n
+runk5
+run4ty
+r5usc
+ruti5n
+rv4e
+rvel4i
+r3ven
+rv5er.
+r5vest
+r3vey
+r3vic
+rvi4v
+r3vo
+r1w
+ry4c
+5rynge
+ry3t
+sa2
+2s1ab
+5sack
+sac3ri
+s3act
+5sai
+salar4
+sal4m
+sa5lo
+sal4t
+3sanc
+san4de
+s1ap
+sa5ta
+5sa3tio
+sat3u
+sau4
+sa5vor
+5saw
+4s5b
+scan4t5
+sca4p
+scav5
+s4ced
+4scei
+s4ces
+sch2
+s4cho
+3s4cie
+5scin4d
+scle5
+s4cli
+scof4
+4scopy
+scour5a
+s1cu
+4s5d
+4se.
+se4a
+seas4
+sea5w
+se2c3o
+3sect
+4s4ed
+se4d4e
+s5edl
+se2g
+seg3r
+5sei
+se1le
+5self
+5selv
+4seme
+se4mol
+sen5at
+4senc
+sen4d
+s5ened
+sen5g
+s5enin
+4sentd
+4sentl
+sep3a3
+4s1er.
+s4erl
+ser4o
+4servo
+s1e4s
+se5sh
+ses5t
+5se5um
+5sev
+sev3en
+sew4i
+5sex
+4s3f
+2s3g
+s2h
+2sh.
+sh1er
+5shev
+sh1in
+sh3io
+3ship
+shiv5
+sho4
+sh5old
+shon3
+shor4
+short5
+4shw
+si1b
+s5icc
+3side.
+5sides
+5sidi
+si5diz
+4signa
+sil4e
+4sily
+2s1in
+s2ina
+5sine.
+s3ing
+1sio
+5sion
+sion5a
+si2r
+sir5a
+1sis
+3sitio
+5siu
+1siv
+5siz
+sk2
+4ske
+s3ket
+sk5ine
+sk5ing
+s1l2
+s3lat
+s2le
+slith5
+2s1m
+s3ma
+small3
+sman3
+smel4
+s5men
+5smith
+smol5d4
+s1n4
+1so
+so4ce
+soft3
+so4lab
+sol3d2
+so3lic
+5solv
+3som
+3s4on.
+sona4
+son4g
+s4op
+5sophic
+s5ophiz
+s5ophy
+sor5c
+sor5d
+4sov
+so5vi
+2spa
+5spai
+spa4n
+spen4d
+2s5peo
+2sper
+s2phe
+3spher
+spho5
+spil4
+sp5ing
+4spio
+s4ply
+s4pon
+spor4
+4spot
+squal4l
+s1r
+2ss
+s1sa
+ssas3
+s2s5c
+s3sel
+s5seng
+s4ses.
+s5set
+s1si
+s4sie
+ssi4er
+ss5ily
+s4sl
+ss4li
+s4sn
+sspend4
+ss2t
+ssur5a
+ss5w
+2st.
+s2tag
+s2tal
+stam4i
+5stand
+s4ta4p
+5stat.
+s4ted
+stern5i
+s5tero
+ste2w
+stew5a
+s3the
+st2i
+s4ti.
+s5tia
+s1tic
+5stick
+s4tie
+s3tif
+st3ing
+5stir
+s1tle
+5stock
+stom3a
+5stone
+s4top
+3store
+st4r
+s4trad
+5stratu
+s4tray
+s4trid
+4stry
+4st3w
+s2ty
+1su
+su1al
+su4b3
+su2g3
+su5is
+suit3
+s4ul
+su2m
+sum3i
+su2n
+su2r
+4sv
+sw2
+4swo
+s4y
+4syc
+3syl
+syn5o
+sy5rin
+1ta
+3ta.
+2tab
+ta5bles
+5taboliz
+4taci
+ta5do
+4taf4
+tai5lo
+ta2l
+ta5la
+tal5en
+tal3i
+4talk
+tal4lis
+ta5log
+ta5mo
+tan4de
+tanta3
+ta5per
+ta5pl
+tar4a
+4tarc
+4tare
+ta3riz
+tas4e
+ta5sy
+4tatic
+ta4tur
+taun4
+tav4
+2taw
+tax4is
+2t1b
+4tc
+t4ch
+tch5et
+4t1d
+4te.
+tead4i
+4teat
+tece4
+5tect
+2t1ed
+te5di
+1tee
+teg4
+te5ger
+te5gi
+3tel.
+teli4
+5tels
+te2ma2
+tem3at
+3tenan
+3tenc
+3tend
+4tenes
+1tent
+ten4tag
+1teo
+te4p
+te5pe
+ter3c
+5ter3d
+1teri
+ter5ies
+ter3is
+teri5za
+5ternit
+ter5v
+4tes.
+4tess
+t3ess.
+teth5e
+3teu
+3tex
+4tey
+2t1f
+4t1g
+2th.
+than4
+th2e
+4thea
+th3eas
+the5at
+the3is
+3thet
+th5ic.
+th5ica
+4thil
+5think
+4thl
+th5ode
+5thodic
+4thoo
+thor5it
+tho5riz
+2ths
+1tia
+ti4ab
+ti4ato
+2ti2b
+4tick
+t4ico
+t4ic1u
+5tidi
+3tien
+tif2
+ti5fy
+2tig
+5tigu
+till5in
+1tim
+4timp
+tim5ul
+2t1in
+t2ina
+3tine.
+3tini
+1tio
+ti5oc
+tion5ee
+5tiq
+ti3sa
+3tise
+tis4m
+ti5so
+tis4p
+5tistica
+ti3tl
+ti4u
+1tiv
+tiv4a
+1tiz
+ti3za
+ti3zen
+2tl
+t5la
+tlan4
+3tle.
+3tled
+3tles.
+t5let.
+t5lo
+4t1m
+tme4
+2t1n2
+1to
+to3b
+to5crat
+4todo
+2tof
+to2gr
+to5ic
+to2ma
+tom4b
+to3my
+ton4ali
+to3nat
+4tono
+4tony
+to2ra
+to3rie
+tor5iz
+tos2
+5tour
+4tout
+to3war
+4t1p
+1tra
+tra3b
+tra5ch
+traci4
+trac4it
+trac4te
+tras4
+tra5ven
+trav5es5
+tre5f
+tre4m
+trem5i
+5tria
+tri5ces
+5tricia
+4trics
+2trim
+tri4v
+tro5mi
+tron5i
+4trony
+tro5phe
+tro3sp
+tro3v
+tru5i
+trus4
+4t1s2
+t4sc
+tsh4
+t4sw
+4t3t2
+t4tes
+t5to
+ttu4
+1tu
+tu1a
+tu3ar
+tu4bi
+tud2
+4tue
+4tuf4
+5tu3i
+3tum
+tu4nis
+2t3up.
+3ture
+5turi
+tur3is
+tur5o
+tu5ry
+3tus
+4tv
+tw4
+4t1wa
+twis4
+4two
+1ty
+4tya
+2tyl
+type3
+ty5ph
+4tz
+tz4e
+4uab
+uac4
+ua5na
+uan4i
+uar5ant
+uar2d
+uar3i
+uar3t
+u1at
+uav4
+ub4e
+u4bel
+u3ber
+u4bero
+u1b4i
+u4b5ing
+u3ble.
+u3ca
+uci4b
+uc4it
+ucle3
+u3cr
+u3cu
+u4cy
+ud5d
+ud3er
+ud5est
+udev4
+u1dic
+ud3ied
+ud3ies
+ud5is
+u5dit
+u4don
+ud4si
+u4du
+u4ene
+uens4
+uen4te
+uer4il
+3ufa
+u3fl
+ugh3en
+ug5in
+2ui2
+uil5iz
+ui4n
+u1ing
+uir4m
+uita4
+uiv3
+uiv4er.
+u5j
+4uk
+u1la
+ula5b
+u5lati
+ulch4
+5ulche
+ul3der
+ul4e
+u1len
+ul4gi
+ul2i
+u5lia
+ul3ing
+ul5ish
+ul4lar
+ul4li4b
+ul4lis
+4ul3m
+u1l4o
+4uls
+uls5es
+ul1ti
+ultra3
+4ultu
+u3lu
+ul5ul
+ul5v
+um5ab
+um4bi
+um4bly
+u1mi
+u4m3ing
+umor5o
+um2p
+unat4
+u2ne
+un4er
+u1ni
+un4im
+u2nin
+un5ish
+uni3v
+un3s4
+un4sw
+unt3ab
+un4ter.
+un4tes
+unu4
+un5y
+un5z
+u4ors
+u5os
+u1ou
+u1pe
+uper5s
+u5pia
+up3ing
+u3pl
+up3p
+upport5
+upt5ib
+uptu4
+u1ra
+4ura.
+u4rag
+u4ras
+ur4be
+urc4
+ur1d
+ure5at
+ur4fer
+ur4fr
+u3rif
+uri4fic
+ur1in
+u3rio
+u1rit
+ur3iz
+ur2l
+url5ing.
+ur4no
+uros4
+ur4pe
+ur4pi
+urs5er
+ur5tes
+ur3the
+urti4
+ur4tie
+u3ru
+2us
+u5sad
+u5san
+us4ap
+usc2
+us3ci
+use5a
+u5sia
+u3sic
+us4lin
+us1p
+us5sl
+us5tere
+us1tr
+u2su
+usur4
+uta4b
+u3tat
+4ute.
+4utel
+4uten
+uten4i
+4u1t2i
+uti5liz
+u3tine
+ut3ing
+ution5a
+u4tis
+5u5tiz
+u4t1l
+ut5of
+uto5g
+uto5matic
+u5ton
+u4tou
+uts4
+u3u
+uu4m
+u1v2
+uxu3
+uz4e
+1va
+5va.
+2v1a4b
+vac5il
+vac3u
+vag4
+va4ge
+va5lie
+val5o
+val1u
+va5mo
+va5niz
+va5pi
+var5ied
+3vat
+4ve.
+4ved
+veg3
+v3el.
+vel3li
+ve4lo
+v4ely
+ven3om
+v5enue
+v4erd
+5vere.
+v4erel
+v3eren
+ver5enc
+v4eres
+ver3ie
+vermi4n
+3verse
+ver3th
+v4e2s
+4ves.
+ves4te
+ve4te
+vet3er
+ve4ty
+vi5ali
+5vian
+5vide.
+5vided
+4v3iden
+5vides
+5vidi
+v3if
+vi5gn
+vik4
+2vil
+5vilit
+v3i3liz
+v1in
+4vi4na
+v2inc
+vin5d
+4ving
+vio3l
+v3io4r
+vi1ou
+vi4p
+vi5ro
+vis3it
+vi3so
+vi3su
+4viti
+vit3r
+4vity
+3viv
+5vo.
+voi4
+3vok
+vo4la
+v5ole
+5volt
+3volv
+vom5i
+vor5ab
+vori4
+vo4ry
+vo4ta
+4votee
+4vv4
+v4y
+w5abl
+2wac
+wa5ger
+wag5o
+wait5
+w5al.
+wam4
+war4t
+was4t
+wa1te
+wa5ver
+w1b
+wea5rie
+weath3
+wed4n
+weet3
+wee5v
+wel4l
+w1er
+west3
+w3ev
+whi4
+wi2
+wil2
+will5in
+win4de
+win4g
+wir4
+3wise
+with3
+wiz5
+w4k
+wl4es
+wl3in
+w4no
+1wo2
+wom1
+wo5ven
+w5p
+wra4
+wri4
+writa4
+w3sh
+ws4l
+ws4pe
+w5s4t
+4wt
+wy4
+x1a
+xac5e
+x4ago
+xam3
+x4ap
+xas5
+x3c2
+x1e
+xe4cuto
+x2ed
+xer4i
+xe5ro
+x1h
+xhi2
+xhil5
+xhu4
+x3i
+xi5a
+xi5c
+xi5di
+x4ime
+xi5miz
+x3o
+x4ob
+x3p
+xpan4d
+xpecto5
+xpe3d
+x1t2
+x3ti
+x1u
+xu3a
+xx4
+y5ac
+3yar4
+y5at
+y1b
+y1c
+y2ce
+yc5er
+y3ch
+ych4e
+ycom4
+ycot4
+y1d
+y5ee
+y1er
+y4erf
+yes4
+ye4t
+y5gi
+4y3h
+y1i
+y3la
+ylla5bl
+y3lo
+y5lu
+ymbol5
+yme4
+ympa3
+yn3chr
+yn5d
+yn5g
+yn5ic
+5ynx
+y1o4
+yo5d
+y4o5g
+yom4
+yo5net
+y4ons
+y4os
+y4ped
+yper5
+yp3i
+y3po
+y4poc
+yp2ta
+y5pu
+yra5m
+yr5ia
+y3ro
+yr4r
+ys4c
+y3s2e
+ys3ica
+ys3io
+3ysis
+y4so
+yss4
+ys1t
+ys3ta
+ysur4
+y3thin
+yt3ic
+y1w
+za1
+z5a2b
+zar2
+4zb
+2ze
+ze4n
+ze4p
+z1er
+ze3ro
+zet4
+2z1i
+z4il
+z4is
+5zl
+4zm
+1zo
+zo4m
+zo5ol
+zte4
+4z1z2
+z4zy
+% hyphen.tex patterns end here, and additional patterns begin:
+.con5gr
+.de5riva
+.dri5v4
+.eth1y6l1
+.eu4ler
+.ev2
+.ever5si5b
+.ga4s1om1
+.ge4ome
+.ge5ot1
+.he3mo1
+.he3p6a
+.he3roe
+.in5u2t
+.kil2n3i
+.ko6r1te1
+.le6ices
+.me4ga1l
+.met4ala
+.mim5i2c1
+.mi1s4ers
+.ne6o3f
+.noe1th
+.non1e2m
+.poly1s
+.post1am
+.pre1am
+.rav5en1o
+.semi5
+.sem4ic
+.semid6
+.semip4
+.semir4
+.sem6is4
+.semiv4
+.sph6in1
+.spin1o
+.ta5pes1tr
+.te3legr
+.to6pog
+.to2q
+.un3at5t
+.un5err5
+.vi2c3ar
+.we2b1l
+.re1e4c
+a5bolic
+a2cabl
+af6fish
+am1en3ta5b
+anal6ys
+ano5a2c
+ans5gr
+ans3v
+anti1d
+an3ti1n2
+anti1re
+a4pe5able
+ar3che5t
+ar2range
+as5ymptot
+ath3er1o1s
+at6tes.
+augh4tl
+au5li5f
+av3iou
+back2er.
+ba6r1onie
+ba1thy
+bbi4t
+be2vie
+bi5d2if
+bil2lab
+bio5m
+bi1orb
+bio1rh
+b1i3tive
+blan2d1
+blin2d1
+blon2d2
+bor1no5
+bo2t1u1l
+brus4q
+bus6i2er
+bus6i2es
+buss4ing
+but2ed.
+but4ted
+cad5e1m
+cat1a1s2
+4chs.
+chs3hu
+chie5vo
+cig3a3r
+cin2q
+cle4ar
+co6ph1o3n
+cous2ti
+cri3tie
+croc1o1d
+cro5e2co
+c2tro3me6c
+1cu2r1ance
+2d3alone
+data1b
+dd5a5b
+d2d5ib
+de4als.
+de5clar1
+de2c5lina
+de3fin3iti
+de2mos
+des3ic
+de2tic
+dic1aid
+dif5fra
+3di1methy
+di2ren
+di2rer
+2d1lead
+2d1li2e
+3do5word
+dren1a5l
+drif2t1a
+d1ri3pleg5
+drom3e5d
+d3tab
+du2al.
+du1op1o1l
+ea4n3ies
+e3chas
+edg1l
+ed1uling
+eli2t1is
+e1loa
+en1dix
+eo3grap
+1e6p3i3neph1
+e2r3i4an.
+e3spac6i
+eth1y6l1ene
+5eu2clid1
+feb1rua
+fermi1o
+3fich
+fit5ted.
+fla1g6el
+flow2er.
+3fluor
+gen2cy.
+ge3o1d
+ght1we
+g1lead
+get2ic.
+4g1lish
+5glo5bin
+1g2nac
+gnet1ism
+gno5mo
+g2n1or.
+g2noresp
+2g1o4n3i1za
+graph5er.
+griev1
+g1utan
+hair1s
+ha2p3ar5r
+hatch1
+hex2a3
+hite3sid
+h3i5pel1a4
+hnau3z
+ho6r1ic.
+h2t1eou
+hypo1tha
+id4ios
+ifac1et
+ign4it
+ignit1er
+i4jk
+im3ped3a
+infra1s2
+i5nitely.
+irre6v3oc
+i1tesima
+ith5i2l
+itin5er5ar
+janu3a
+japan1e2s
+je1re1m
+1ke6ling
+1ki5netic
+1kovian
+k3sha
+la4c3i5e
+lai6n3ess
+lar5ce1n
+l3chai
+l3chil6d1
+lead6er.
+lea4s1a
+1lec3ta6b
+le3g6en2dre
+1le1noid
+lith1o5g
+ll1fl
+l2l3ish
+l5mo3nell
+lo1bot1o1
+lo2ges.
+load4ed.
+load6er.
+l3tea
+lth5i2ly
+lue1p
+1lunk3er
+1lum5bia.
+3lyg1a1mi
+ly5styr
+ma1la1p
+m2an.
+man3u1sc
+mar1gin1
+medi2c
+med3i3cin
+medio6c1
+me3gran3
+m2en.
+3mi3da5b
+3milita
+mil2l1ag
+mil5li5li
+mi6n3is.
+mi1n2ut1er
+mi1n2ut1est
+m3ma1b
+5maph1ro1
+5moc1ra1t
+mo5e2las
+mol1e5c
+mon4ey1l
+mono3ch
+mo4no1en
+moro6n5is
+mono1s6
+moth4et2
+m1ou3sin
+m5shack2
+mu2dro
+mul2ti5u
+n3ar4chs.
+n3ch2es1t
+ne3back
+2ne1ski
+n1dieck
+nd3thr
+nfi6n3ites
+4n5i4an.
+nge5nes
+ng1ho
+ng1spr
+nk3rup
+n5less
+5noc3er1os
+nom1a6l
+nom5e1no
+n1o1mist
+non1eq
+non1i4so
+5nop1oly.
+no1vemb
+ns5ceiv
+ns4moo
+ntre1p
+obli2g1
+o3chas
+odel3li
+odit1ic
+oerst2
+oke1st
+o3les3ter
+oli3gop1o1
+o1lo3n4om
+o3mecha6
+onom1ic
+o3norma
+o3no2t1o3n
+o3nou
+op1ism.
+or4tho3ni4t
+orth1ri
+or5tively
+o4s3pher
+o5test1er
+o5tes3tor
+oth3e1o1s
+ou3ba3do
+o6v3i4an.
+oxi6d1ic
+pal6mat
+parag6ra4
+par4a1le
+param4
+para3me
+pee2v1
+phi2l3ant
+phi5lat1e3l
+pi2c1a3d
+pli2c1ab
+pli5nar
+poin3ca
+1pole.
+poly1e
+po3lyph1ono
+1prema3c
+pre1neu
+pres2pli
+pro2cess
+proc3i3ty.
+pro2g1e
+3pseu2d
+pseu3d6o3d2
+pseu3d6o3f2
+pto3mat4
+p5trol3
+pu5bes5c
+quain2t1e
+qu6a3si3
+quasir6
+quasis6
+quin5tes5s
+qui3v4ar
+r1abolic
+3rab1o1loi
+ra3chu
+r3a3dig
+radi1o6g
+r2amen
+3ra4m5e1triz
+ra3mou
+ra5n2has
+ra1or
+r3bin1ge
+re2c3i1pr
+rec5t6ang
+re4t1ribu
+r3ial.
+riv1o1l
+6rk.
+rk1ho
+r1krau
+6rks.
+r5le5qu
+ro1bot1
+ro5e2las
+ro5epide1
+ro3mesh
+ro1tron
+r3pau5li
+rse1rad1i
+r1thou
+r1treu
+r1veil
+rz1sc
+sales3c
+sales5w
+5sa3par5il
+sca6p1er
+sca2t1ol
+s4chitz
+schro1ding1
+1sci2utt
+scrap4er.
+scy4th1
+sem1a1ph
+se3mes1t
+se1mi6t5ic
+sep3temb
+shoe1st
+sid2ed.
+side5st
+side5sw
+si5resid
+sky1sc
+3slova1kia
+3s2og1a1my
+so2lute
+3s2pace
+1s2pacin
+spe3cio
+spher1o
+spi2c1il
+spokes5w
+sports3c
+sports3w
+s3qui3to
+s2s1a3chu1
+ss3hat
+s2s3i4an.
+s5sign5a3b
+1s2tamp
+s2t1ant5shi
+star3tli
+sta1ti
+st5b
+1stor1ab
+strat1a1g
+strib5ut
+st5scr
+stu1pi4d1
+styl1is
+su2per1e6
+1sync
+1syth3i2
+swimm6
+5tab1o1lism
+ta3gon.
+talk1a5
+t1a1min
+t6ap6ath
+5tar2rh
+tch1c
+tch3i1er
+t1cr
+teach4er.
+tele2g
+tele1r6o
+3ter1gei
+ter2ic.
+t3ess2es
+tha4l1am
+tho3don
+th1o5gen1i
+tho1k2er
+thy4l1an
+thy3sc
+2t3i4an.
+ti2n3o1m
+t1li2er
+tolo2gy
+tot3ic
+trai3tor1
+tra1vers
+travers3a3b
+treach1e
+tr4ial.
+3tro1le1um
+trof4ic.
+tro3fit
+tro1p2is
+3trop1o5les
+3trop1o5lis
+t1ro1pol3it
+tsch3ie
+ttrib1ut1
+turn3ar
+t1wh
+ty2p5al
+ua3drati
+uad1ratu
+u5do3ny
+uea1m
+u2r1al.
+uri4al.
+us2er.
+v1ativ
+v1oir5du1
+va6guer
+vaude3v
+1verely.
+v1er1eig
+ves1tite
+vi1vip3a3r
+voice1p
+waste3w6a2
+wave1g4
+w3c
+week1n
+wide5sp
+wo4k1en
+wrap3aro
+writ6er.
+x1q
+xquis3
+y5che3d
+ym5e5try
+y1stro
+yes5ter1y
+z3ian.
+z3o1phr
+z2z3w
+% end of additional patterns.
+}
+% DEK's hyphenation exception list, from hyphen.tex; not changed.
+\hyphenation{
+as-so-ciate
+as-so-ciates
+dec-li-na-tion
+oblig-a-tory
+phil-an-thropic
+present
+presents
+project
+projects
+reci-procity
+re-cog-ni-zance
+ref-or-ma-tion
+ret-ri-bu-tion
+ta-ble
+}
diff --git a/tmac/hyphen.fr b/tmac/hyphen.fr
new file mode 100644
index 0000000..5a71aee
--- /dev/null
+++ b/tmac/hyphen.fr
@@ -0,0 +1,1325 @@
+% This is the file 'hyphen.fr'.
+%
+% It contains the same hyphenation patterns as 'frhyph.tex'. Here is
+% the copyright message:
+%
+% frhyph.tex % French hyphenation patterns
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% This file is available for free and can used and redistributed
+% asis for free. Modified versions should have another name.
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% % \message{frhyph.tex - French hyphenation patterns (V2.11) <2002/01/16>}
+%
+% Please check the original file for more details.
+%
+% To make the patterns workable with groff, all accent macros in the
+% patterns have been converted to use latin-9 characters directly
+% (this is, the oe ligature '½' is used), and everything except the
+% \patterns command has been discarded since it isn't needed (and groff
+% doesn't understand this stuff anyway).
+%
+\patterns{
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%*
+2'2
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%a
+.a4
+'a4
+.â4
+'â4
+ab2h % df-bg 1998/02/07 for abhorrer
+ .ab3réa
+ 'ab3réa
+ad2h % df-bg 1998/02/07 for adh\`esion & co
+ a1è2dre
+ .ae3s4ch
+ 'ae3s4ch
+ 1alcool
+ a2l1algi
+ .amino1a2c
+ 'amino1a2c
+ .ana3s4tr
+ 'ana3s4tr
+ 1a2nesthési
+ .anti1a2
+ 'anti1a2
+ .anti1e2
+ 'anti1e2
+ .anti1é2
+ .anti2enne
+ 'anti2enne
+ 'anti1é2
+ .anti1s2
+ 'anti1s2
+ .apo2s3ta
+ 'apo2s3ta
+ apo2s3tr
+ archi1é2pis
+ .as2ta
+ 'as2ta
+ a2s3tro
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%b
+1ba
+1bâ
+ .bai2se3main % hyphen disappeared from french 5/2/94
+1be
+1bé
+1bè
+1bê
+4be.
+4bes.
+2bent. % mute syllable: tombent (df) 22/02/94
+1bi
+1bî
+ .bi1a2c
+ .bi1a2t % like .tri1a2t for tri-athlon bg 12/27/93
+ .bi1au
+ .bio1a2
+ .bi2s1a2
+ .bi1u2
+1b2l
+4ble.
+4bles.
+2blent. % mute syllable: troublent (df) 28/02/94
+1bo
+1bô
+1b2r
+4bre.
+4bres.
+2brent. % mute syllable: palabrent (df) 28/02/94
+1bu
+1bû
+1by
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%c
+1ç
+1ca
+1câ
+ca3ou3t2 % for caoutchou... added 3/1/94 df-bg
+1ce
+1cé
+1cè
+1cê
+4ce.
+4ces.
+% words ending with -cent (df) 22/02/94
+ 2cent.
+ ja3cent.
+ ac3cent.
+ é3cent.
+ munifi3cent.
+ réti3cent.
+privatdo3cent.
+ inno3cent.
+ es3cent.
+ acquies4cent.
+ is3cent.
+ immis4cent.
+%
+.ch4
+1c2h
+4ch.
+2chb
+4che.
+4ches.
+2chent. % mute syllable: touchent (df) 22/02/94
+ .chè2vre3feuille % hyphen disappeared from french 5/2/94
+2chg
+ch2l
+4chle.
+4chles.
+ chlo2r3a2c
+ chlo2r3é2t
+2chm
+2chn
+2chp
+ch2r
+4chre.
+4chres.
+2chs
+2cht
+2chw
+1ci
+1cî
+ .ci2s1alp
+1c2k
+4ck.
+2ckb
+4cke.
+4ckes.
+2ckent. % mute syllable: stockent (df) 22/02/94
+2ckf
+2ckg
+2ck3h
+2ckp
+2cks
+2ckt
+1c2l
+4cle.
+4cles.
+2clent. % mute syllable: encerclent (df) 28/02/94
+1co
+1cô
+ co1acc
+ co1acq
+ co1a2d
+ co1ap
+ co1ar
+ co1assoc
+ co1assur
+ co1au
+ co1ax
+1c½0 % final zero essential to terminate cs
+ co1é2
+ co1ef
+ co1en
+ co1ex
+ .con4 % missing from nb list
+ .cons4 % missing from nb list
+ .contre1s2c
+ .contre3maître % hyphen disappeared from french 5/2/94
+ co2nurb
+ .co1o2
+ .co2o3lie
+1c2r
+4cre.
+4cres.
+2crent. % mute syllable: massacrent (df) 28/02/94
+1cu
+1cû
+1cy
+.cul4 % -- as .con4 .cons4 (march 92)
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%d
+1d'
+1da
+1dâ
+ .dacryo1a2
+d1d2h
+1de
+1dé
+1dè
+1dê
+4de.
+4des.
+% words ending with -dent (df) 22/02/94
+ 2dent.
+déca3dent.
+ é3dent.
+ cci3dent.
+ inci3dent.
+ confi3dent.
+ tri3dent.
+ dissi3dent.
+ chien3dent.
+ .ar3dent.
+ impu3dent.
+ pru3dent.
+%
+ .dé1a2
+ .dé1io
+ .dé1o2
+ .dé2s % originally in JD file
+ %.d\'e2s1a2 removed 09/17/92 because wrong for the
+ % original JD 500 words test
+ .dé3s2a3cr
+ .dés2a3m % .d\'es2a2mi introduced 09/17/92 bec. i
+ % can't see why d\'esamidonner ran in JD.
+ % Moved to .d\'es2a3m df 12/27/93.
+ .dé3s2a3tell
+ .dé3s2astr
+ .dé3s2c % 1 moved 3 due to .d\'e2s 09/17/92
+ %.d\'e2s1e2 removed 09/17/92 because wrong for the
+ % original JD 500 words test
+ .dé2s1é2
+ .dé3s2é3gr
+ .dé3s2ensib
+ .dé3s2ert
+ .dé3s2exu
+ %.d\'e2s3h removed 09/17/92 because wrong for the
+ % original JD 500 words test
+ .dé2s1i2
+ .dé3s2i3d
+ .dé3s2i3gn
+ .dé3s2i3li
+ .dé3s2i3nen
+ .dé3s2invo
+ .dé3s2i3r
+ .dé3s2ist
+ %.d\'e2s1o2 removed 09/17/92 because wrong for the
+ % original JD 500 words test
+ .dé3s2o3dé
+ .dé2s1½0 % final zero essential to terminate cs
+ .dé3s2o3l
+ .dé3s2o3pil
+ .dé3s2orm
+ .dé3s2orp
+ .dé3s2oufr
+ .dé3s2p % 1 moved 3 due to .d\'e2s 09/17/92
+ .dé3s2t % 1 moved 3 due to .d\'e2s 09/17/92
+ .dé2s1u2n
+ 3d2hal
+ 3d2houd
+1di
+1dî
+ di2s3cop
+ .di1a2cé
+ .di1a2cid
+ .di1ald
+ .di1a2mi
+ .di1a2tom
+ .di1e2n
+ .di2s3h
+2dlent. % mute syllable: jodlent (df) 28/02/94
+1do
+1dô
+1d2r
+4dre.
+4dres.
+2drent. % mute syllable: engendrent (df) 28/02/94
+d1s2
+1du
+1dû
+1dy
+ .dy2s3
+ .dy2s1a2
+ .dy2s1i2
+ .dy2s1o2 % missing from nb list
+ .dy2s1u2
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%e
+.e4
+'e4
+.ê4
+'ê4
+.é4
+'é4
+.è4
+'è4
+éd2hi % df-bg 1998/02/07 for r\'edhibitoire
+ 1é2drie
+ 1é2drique
+ 1é2lectr
+ 1é2lément
+ .en1a2
+ 'en1a2
+ 1é2nerg
+ e2n1i2vr
+ .en1o2
+ 'en1o2
+ épi2s3cop
+ épi3s4cope
+ e2s3cop
+ .eu2r1a2
+ 'eu2r1a2
+ eu1s2tat
+ extra1
+ extra2c
+ extra2i
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%f
+1fa
+1fâ
+1fe
+1fé
+1fè
+1fê
+4fe.
+4fes.
+2fent. % mute syllable: agrafent chauffent (df) 22/02/94
+%
+1fi
+1fî
+1f2l
+4fle.
+4fles.
+2flent. % mute syllable: gonflent (df) 28/02/94
+1fo
+1fô
+1f2r
+4fre.
+4fres.
+2frent. % mute syllable: balafrent (df) 28/02/94
+f1s2
+1fu
+1fû
+1fy
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%g
+1ga
+1gâ
+1ge
+1gé
+1gè
+1gê
+4ge.
+4ges.
+% words ending with -gent (df) 22/02/94
+ 2gent.
+ ré3gent.
+ entre3gent.
+ indi3gent.
+ dili3gent.
+intelli3gent.
+ indul3gent.
+ tan3gent.
+ rin3gent.
+ contin3gent.
+ .ar3gent.
+ 'ar3gent.
+ ser3gent.
+ ter3gent.
+résur3gent.
+%
+1g2ha
+1g2he
+1g2hi
+1g2ho
+1g2hy
+1gi
+1gî
+1g2l
+4gle.
+4gles.
+2glent. % mute syllable: meuglent (df) 28/02/94
+ 1g2n
+ 'a2g3nat % (df) 16/01/02
+ .a2g3nat % (df) 16/01/02
+ a2g3nos % (df) 16/01/02 (pattern dia2g3n deleted)
+ co2g3niti % (df) 16/01/02
+ 'i2g3né % (df) 16/01/02
+ .i2g3né % (df) 16/01/02
+ 'i2g3ni % (df) 16/01/02
+ .i2g3ni % (df) 16/01/02
+ .ma2g3nicide % (df) 16/01/02
+ .ma2g3nificat % (df) 16/01/02
+ .ma2g3num % (df) 16/01/02
+ o2g3nomoni % (df) 16/01/02
+ o2g3nosi % (df) 16/01/02
+.pro2g3nath % (df) 16/01/02
+ pu2g3nable % (df) 16/01/02
+ pu2g3nac % (df) 16/01/02
+.sta2g3n
+.syn2g3nath % (df) 16/01/02
+ wa2g3n
+4gne.
+4gnes.
+2gnent. % mute syllable: accompagnent (df) 28/02/94
+1go
+1gô
+1g2r
+4gre.
+4gres.
+2grent. % mute syllable: immigrent (df) 28/02/94
+1gu
+1gû
+g1s2
+4gue.
+4gues.
+% words ending with -guent (df) 22/02/94
+ 2guent.
+.on3guent.
+'on3guent.
+%
+1gy
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%h
+1ha
+1hâ
+1he
+1hé
+1hè
+1hê
+ hémi1é
+ hémo1p2t
+4he.
+4hes.
+1hi
+1hî
+1ho
+1hô
+1hu
+1hû
+1hy
+ hypera2
+ hypere2
+ hyperé2
+ hyperi2
+ hypero2
+ hypers2
+ hype4r1
+ hyperu2
+ hypo1a2
+ hypo1e2 % missing from nb list
+ hypo1é2
+ hypo1i2
+ hypo1o2
+ hypo1s2
+ hypo1u2
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%i
+.i4
+'i4
+.î4
+'î4
+ i1algi
+ i1arthr
+ i1è2dre
+% ill patterns missing from nb list
+ il2l
+ cil3l
+ rcil4l
+ ucil4l
+ vacil4l
+ gil3l
+ hil3l
+ lil3l
+ l3lion
+ mil3l
+ mil4let
+émil4l
+ semil4l
+ rmil4l
+ armil5l
+ capil3l
+ papil3la
+ papil3le
+ papil3li
+ papil3lom
+ pupil3l
+ piril3l
+ thril3l
+ cyril3l
+ ibril3l
+ pusil3l
+ .stil3l
+distil3l
+instil3l
+fritil3l
+boutil3l
+ vanil3lin
+ vanil3lis
+ vil3l
+ avil4l
+chevil4l
+ uevil4l
+ uvil4l
+ xil3l
+% end of ill patterns
+ 1informat % missing from nb list
+ .in1a2
+ 'in1a2
+ .in2a3nit
+ 'in2a3nit
+ .in2augur
+ 'in2augur
+ .in1e2
+ 'in1e2
+ .in1é2
+ 'in1é2
+ .in2effab % missing from nb list
+ 'in2effab
+ .in2é3lucta
+ 'in2é3lucta
+ .in2é3narra
+ 'in2é3narra
+ .in2ept
+ 'in2ept
+ .in2er
+ 'in2er
+ .in2exora % missing from nb list
+ 'in2exora
+ .in1i2
+ 'in1i2
+ .in2i3miti
+ 'in2i3miti
+ .in2i3q
+ 'in2i3q
+ .in2i3t
+ 'in2i3t
+ .in1o2
+ 'in1o2
+ .in2o3cul
+ 'in2o3cul
+ .in2ond
+ 'in2ond
+ .in1s2tab
+ 'in1s2tab
+ 'inte4r3
+ .intera2
+ 'intera2
+ .intere2
+ 'intere2
+ .interé2
+ 'interé2
+ .interi2
+ 'interi2
+ .intero2
+ 'intero2
+ .inte4r3
+ .interu2
+ 'interu2
+ .inters2
+ 'inters2
+ .in1u2
+ 'in1u2
+ .in2uit
+ 'in2uit
+ .in2u3l
+ 'in2u3l
+ io1a2ct
+ i1oxy
+ i1s2tat
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%j
+1j
+2jk
+4je.
+4jes.
+2jent. % mute syllable: gal\`ejent (df) 22/02/94
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%k
+1ka
+1kâ
+1ke
+1ké
+1kè
+1kê
+4ke.
+4kes.
+2kent. % mute syllable: jerkent (df) 22/02/94
+1k2h
+4kh.
+.kh4
+1ki
+1kî
+1ko
+1kô
+1k2r
+1ku
+1kû
+1ky
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%l
+1la
+1lâ
+1là
+ la2w3re
+1le
+1lé
+1lè
+1lê
+4le.
+4les.
+% words ending with -lent (df) 22/02/94
+ 2lent.
+ .ta3lent.
+ iva3lent.
+équiva4lent.
+ monova3lent.
+ polyva3lent.
+ re3lent.
+ .do3lent.
+ indo3lent.
+ inso3lent.
+ turbu3lent.
+ succu3lent.
+ fécu3lent.
+ trucu3lent.
+ opu3lent.
+ corpu3lent.
+ ru3lent.
+ sporu4lent.
+%
+1li
+1lî
+1lo
+1lô
+l1s2t
+1lu
+1lû
+1ly
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%m
+1ma
+1mâ
+ .ma2c3k
+ .macro1s2c
+ .ma2l1a2dres
+ .ma2l1a2dro
+ .ma2l1aisé
+ .ma2l1ap
+ .ma2l1a2v
+ .ma2l1en
+ .ma2l1int
+ .ma2l1oc
+ .ma2l1o2d
+ .ma2r1x % nb (jbb: ?)
+1me
+1mé
+1mé
+1mé
+ .mé2g1oh
+ .mé2sa % missing from nb list
+ .mé3san % missing from nb list
+ .mé2s1es
+ .mé2s1i
+ .mé2s1u2s
+ .méta1s2ta
+4me.
+4mes.
+% words ending with -ment (df) 22/02/94
+ â2ment.
+ da2ment.
+ fa2ment.
+ amalga2ment.
+ cla2ment.
+ ra2ment.
+tempéra3ment.
+ ta2ment.
+ testa3ment.
+ qua2ment.
+ è2ment.
+ carê2ment.
+ diaphrag2ment.
+ ryth2ment.
+ ai2ment.
+ rai3ment.
+ abî2ment.
+ éci2ment.
+ vidi2ment.
+ subli2ment.
+ éli2ment.
+ reli2ment.
+ mi2ment.
+ ani2ment.
+ veni2ment.
+ ri2ment.
+ détri3ment.
+ nutri3ment.
+ inti2ment.
+ esti2ment.
+ l2ment.
+ flam2ment.
+ gram2ment.
+ .gem2ment.
+ om2ment.
+ .com3ment.
+ ô2ment.
+ slalo2ment.
+ chro2ment.
+ to2ment.
+ ar2ment.
+ .sar3ment.
+ er2ment.
+ antifer3ment.
+ .ser3ment.
+ fir2ment.
+ or2ment.
+ as2ment.
+ au2ment.
+ écu2ment.
+ fu2ment.
+ hu2ment.
+ fichu3ment.
+ llu2ment.
+ plu2ment.
+ bou2ment.
+ bru2ment.
+ su2ment.
+ tu2ment.
+%
+1mi
+1mî
+ .milli1am
+ 1m2némo
+ 1m2nès
+ 1m2nési
+1mo
+1mô
+1m½0 % final zero essential to terminate cs
+ .mono1a2
+ .mono1e2
+ .mono1é2
+ .mono1i2
+ .mono1ï2dé
+ .mono1o2
+ .mono1u2
+ .mono1s2
+ mon2t3réal % missing from nb list
+m1s2
+1mu
+1mû
+1my
+ moye2n1â2g
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%n
+1na
+1nâ
+1ne
+1né
+1nè
+1nê
+4ne.
+4nes.
+% words ending with -nent (df) 22/02/94
+ 2nent. % fric-tionnent - syllable muette - bg 27/12/93
+ réma3nent.
+ imma3nent.
+ perma3nent.
+ .émi3nent.
+préémi3nent.
+ proémi3nent.
+ surémi3nent.
+ immi3nent.
+ conti3nent.
+ perti3nent.
+ absti3nent.
+%
+1ni
+1nî
+1no
+1nô
+1n½0 % final zero essential to terminate cs
+ .no2n1obs
+1nu
+1nû
+ n3s2at.
+ n3s2ats.
+n1x
+1ny
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%o
+.o4
+'o4
+'ô4
+.ô4
+%'\"o2 % mjf % deleted 3/1/94 df-bg
+ o2b3long
+ 1octet % missing from nb list
+ o1d2l
+ o1è2dre
+ o1ioni
+ ombud2s3
+ omni1s2
+ o1s2tas
+ o1s2tat
+ o1s2téro
+ o1s2tim
+ o1s2tom
+ o1s2trad
+ o1s2tratu
+ o1s2triction
+ .oua1ou
+ 'oua1ou
+ .ovi1s2c
+ 'ovi1s2c
+ oxy1a2
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%p
+1pa
+1pâ
+ paléo1é2
+ .pa2n1a2f
+ .pa2n1a2mé
+ .pa2n1a2ra
+ .pa2n1is
+ .pa2n1o2ph
+ .pa2n1opt
+ .pa2r1a2che
+ .pa2r1a2chè
+ .para1s2
+ .pa2r3hé
+1pe
+1pé
+1pè
+1pê
+4pe.
+4pes.
+% words ending with -pent (df) 22/02/94
+ 2pent.
+ re3pent.
+.ar3pent.
+'ar3pent.
+ser3pent.
+%
+ .pen2ta % pent- or penta- but never pen-ta bg 12/27/93
+ per3h
+ pé2nul % p\'e2n1ul moved back 09/17/92 to JD def.
+ .pe4r
+ .per1a2
+ .per1e2
+ .per1é2
+ .per1i2
+ .per1o2
+ .per1u2
+ pé1r2é2q % 2r1 moved 09/17/92 to 1r2(it was a typo)
+ .péri1os
+ .péri1s2
+ .péri2s3s
+ .péri2s3ta
+ .péri1u2
+1p2h
+.ph4
+4ph.
+ .phalan3s2t
+4phe.
+4phes.
+2phent. % mute syllable: triomphent (df) 22/02/94
+ph2l
+4phle.
+4phles.
+2phn
+ photo1s2
+ph2r
+4phre.
+4phres.
+2phs
+2pht
+ 3ph2talé
+ 3ph2tis
+%%%% Here is an example of a pb involving phonetic and etymologic patterns 5/94
+%%%% .phyto3ph2 % originally, but wrong for phy-toph-thora 9/92
+%%%% .phy2topha % for -pharmacie but wrong for phyto-biol.. 5/94
+1pi
+1pî
+1p2l
+4ple.
+4ples.
+2plent. % mute syllable: accouplent (df) 28/02/94
+ .pluri1a
+ 1p2né
+ 1p2neu
+1po
+1pô
+ po1astre
+ poly1a2
+ poly1e2
+ poly1é2
+ poly1è2
+ poly1i2
+ poly1o2
+ poly1s2
+ poly1u2
+ .pon2tet % JD hyphenated it asis 09/17/92, exception
+ .pos2t3h
+ .pos2t1in
+ .pos2t1o2
+ .pos2t3r
+ .post1s2
+1p2r
+4pre.
+4pres.
+2prent. % mute syllable: empourprent (df) 28/02/94
+ .pré1a2
+ .pré2a3la % missing from nb list
+ .pré2au
+ .pré1é2
+ .pré1e2
+ .pré1i2
+ .pré1o2
+ .pré1u2
+ .pré1s2
+ .pro1é2
+ .pro1s2cé
+ pro2s3tat
+ .prou3d2h
+ 1p2sych
+ .psycho1a2n
+ 1p2tèr
+ 1p2tér
+1pu
+ .pud1d2l
+1pû
+1py
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%q
+1q
+4que.
+4ques.
+% words ending with -quent (df) 22/02/94
+ 2quent.
+ é3quent.
+ élo3quent.
+grandilo3quent.
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%r
+1ra
+1râ
+ radio1a2 % missing from nb list
+1re
+1ré
+1rè
+1rê
+ .ré1a2
+ .ré2a3le
+ .ré2a3lis
+ .ré2a3lit
+ .ré2aux
+ .ré1é2
+ .ré1e2
+ .ré2el
+ .ré2er
+ .ré2èr
+ .ré1i2
+ .ré2i3fi
+ .ré1o2
+ .re1s2
+ .re2s3cap
+ .re2s3cisi % for res-cision 09/17/92 (missing from nb)
+ .re2s3ciso % for res-cisoire 09/17/92(missing from nb)
+ .re2s3cou
+ .re2s3cri
+ .re2s3pect
+ .re2s3pir
+ .re2s3plend
+ .re2s3pons
+ .re2s3quil
+ .re2s3s
+ .re2s3t
+ .re3s4tab
+ .re3s4tag
+ .re3s4tand
+ .re3s4tat
+ .re3s4tén
+ .re3s4tér
+ .re3s4tim
+ .re3s4tip
+ .re3s4toc
+ .re3s4top
+ .re3s4tr
+ .re4s5trein
+ .re4s5trict
+ .re4s5trin
+ .re3s4tu
+ .re3s4ty
+ .réu2 %.r\'e1u2 % pattern rejected 12/2/92
+ % (don't hyphenate as r\'e-union nor r\'eu-nion)
+ .ré2uss
+ .rétro1a2
+4re.
+4res.
+% words ending with -rent (df) 22/02/94
+ 2rent. % es-p\`erent - syllable muette - bg 27/12/93
+ .pa3rent.
+ appa3rent.
+transpa3rent.
+ é3rent.
+ tor3rent.
+ cur3rent.
+%
+1r2h
+4rhe.
+4rhes.
+ 2r3heur
+ 2r3hydr
+1ri
+1rî
+1ro
+1rô
+1ru
+1rû
+1ry
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%s
+1sa
+1sâ
+.sch4
+ 1s2caph
+ 1s2clér
+ 1s2cop
+ 1s2ch
+e2s3ch
+i2s3ché
+i2s3chia
+i2s3chio
+4sch.
+4sche.
+4sches.
+2schs
+1se
+1sé
+1sè
+1sê
+ sesqui1a2
+4se.
+4ses.
+% words ending with -sent (df) 22/02/94
+ 2sent. % massent - syllable muette - bg 27/12/93
+ ab3sent.
+pré3sent.
+ .res3sent.
+%
+.seu2le % jbb
+.sh4
+1s2h
+4sh.
+4she.
+4shes.
+2shent. % mute syllable: smashent (df) 22/02/94
+2shm
+ 2s3hom
+2shr
+2shs
+1si
+1sî
+ 1s2lav
+ 1s2lov
+1so
+1sô
+1s½0 % final zero essential to terminate cs
+ 1s2patia
+ 1s2perm
+ 1s2por
+ 1s2phèr
+ 1s2phér
+ 1s2piel
+ 1s2piros
+ 1s2tandard
+ 1s2tein
+ stéréo1s2
+ 1s2tigm
+ 1s2tock
+ 1s2tomos
+ 1s2troph
+ 1s2tructu
+ 1s2tyle
+1su
+1sû
+ .su2b1a2
+ .su3b2alt
+ .su2b1é2
+ .su3b2é3r
+ .su2b1in
+ .su2b3limin
+ .su2b3lin
+ .su2b3lu
+ sub1s2
+ .su2b1ur
+ supero2
+ supe4r1
+ supers2
+ .su2r1a2
+ su3r2ah
+ .su3r2a3t
+ .su2r1e2
+ .su3r2eau
+ .su3r2ell
+ .su3r2et
+ .su2r1é2
+ .su2r3h
+ .su2r1i2m
+ .su2r1inf
+ .su2r1int
+ .su2r1of
+ .su2r1ox
+1sy
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%t
+1ta
+1tâ
+1tà
+ tachy1a2
+ tchin3t2
+1te
+1té
+1tè
+1tê
+ télé1e2
+ télé1i2
+ télé1o2b
+ télé1o2p
+ télé1s2
+4te.
+4tes.
+% words ending with -tent (df) 22/02/94
+ 2tent. % mentent - syllable muette - bg 27/12/93
+ .la3tent.
+ .pa3tent.
+ compé3tent.
+ éni3tent.
+ mécon3tent.
+ omnipo3tent.
+ventripo3tent.
+équipo3tent.
+ impo3tent.
+ mit3tent.
+%
+.th4
+1t2h
+4th.
+4the.
+4thes.
+ thermo1s2
+ 2t3heur
+2thl % th2l was wrong for ...ath-lon (jd said 2thl) df 12/27/93
+2thm
+2thn
+th2r
+4thre.
+4thres.
+2ths
+1ti
+1tî
+1to
+1tô
+1t2r
+ tran2s1a2
+ tran3s2act
+ tran3s2ats
+ tran2s3h
+ tran2s1o2
+ tran2s3p
+ tran2s1u2
+4tre.
+4tres.
+2trent. % mute syllable: infiltrent (df) 28/02/94
+ .tri1a2c
+ .tri1a2n
+ .tri1a2t
+ .tri1o2n
+ t1t2l
+1tu
+1tû
+tung2s3
+1ty
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%u
+.u4
+'u4
+.û4
+'û4
+ uni1o2v
+ uni1a2x
+ u2s3tr
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%v
+1va
+1vâ
+1ve
+1vé
+1vè
+1vê
+ vélo1s2ki
+4ve.
+4ves.
+% words ending with -vent (df) 22/02/94
+ 2vent.
+conni3vent.
+ .sou3vent.
+%
+1vi
+1vî
+1vo
+1vô
+ vol2t1amp
+1v2r
+4vre.
+4vres.
+2vrent. % mute syllable: recouvrent (df) 28/02/94
+1vu
+1vû
+1vy
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%w
+1wa
+1we
+4we.
+4wes.
+2went. % mute syllable: interviewent (df) 22/02/94
+1wi
+1wo
+1wu
+1w2r
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%x
+2xent. % mute syllable: malaxent (df) 22/02/94
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%y
+.y4
+'y4
+ y1asth
+ y1s2tom
+ y1algi
+%-------------------%-----------------------%
+% phonetic patterns % etymological patterns %
+%-------------------%-----------------------%
+%%z
+1za
+1ze
+1zé
+1zè
+4ze.
+4zes.
+% words ending with -zent (df) 22/02/94
+ 2zent.
+privatdo3zent.
+%
+1zi
+1zo
+1zu
+1zy
+}
+
+\endinput
+
+% Local Variables:
+% mode: tex
+% coding: latin-9
+% fill-column: 72
+% End:
+% vim: set filetype=tex textwidth=72:
diff --git a/tmac/hyphen.it b/tmac/hyphen.it
new file mode 100644
index 0000000..552bb5d
--- /dev/null
+++ b/tmac/hyphen.it
@@ -0,0 +1,431 @@
+% title: Hyphenation patterns for Italian
+% copyright: Copyright (C) 2008-2011 Claudio Beccari
+% notice: This file is part of the hyph-utf8 package.
+% See http://www.hyphenation.org/tex for more information.
+% language:
+% name: Italian
+% tag: it
+% version: 4.9 2014/04/22
+% authors:
+% -
+% name: Claudio Beccari
+% contact: claudio.beccari (at) gmail.com
+% licence:
+% - This file is available under any of the following licences:
+% -
+% name: LPPL
+% version: 1.3
+% or_later: true
+% url: http://www.latex-project.org/lppl.txt
+% status: maintained
+% maintainer: Claudio Beccari, e-mail claudio dot beccari at gmail dot com
+% -
+% name: MIT
+% url: https://opensource.org/licenses/MIT
+% text: >
+% Permission is hereby granted, free of charge, to any person
+% obtaining a copy of this software and associated documentation
+% files (the "Software"), to deal in the Software without
+% restriction, including without limitation the rights to use,
+% copy, modify, merge, publish, distribute, sublicense, and/or sell
+% copies of the Software, and to permit persons to whom the
+% Software is furnished to do so, subject to the following
+% conditions:
+%
+% The above copyright notice and this permission notice shall be
+% included in all copies or substantial portions of the Software.
+%
+% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+% HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+% WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+% FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+% OTHER DEALINGS IN THE SOFTWARE.
+% hyphenmins:
+% typesetting:
+% left: 2
+% right: 2
+% changes:
+% - 2014-04-22 - Add few patterns involving `h'
+% - 2011-08-16 - Change the licence from GNU LGPL into LPPL v1.3.
+% - 2010-05-24 - Fix for Italian patterns for proper hyphenation of -ich and Ljubljana.
+% - 2008-06-09 - Import of original ithyph.tex into hyph-utf8 package.
+% - 2008-03-08 - (last change in ithyph.tex)
+% texlive:
+% encoding: ascii
+% babelname: italian
+% legacy_patterns: ithyph.tex
+% message: Italian hyphenation patterns
+% description: |-
+% Hyphenation patterns for Italian in ASCII encoding.
+% Compliant with the Recommendation UNI 6461 on hyphenation
+% issued by the Italian Standards Institution
+% (Ente Nazionale di Unificazione UNI).
+% ==========================================
+%
+% These hyphenation patterns for the Italian language are supposed to comply
+% with the Recommendation UNI 6461 on hyphenation issued by the Italian
+% Standards Institution (Ente Nazionale di Unificazione UNI). No guarantee
+% or declaration of fitness to any particular purpose is given and any
+% liability is disclaimed.
+%
+\patterns{
+.a3p2n % After the Garzanti dictionary: a-pnea, a-pnoi-co,...
+.anti1
+.anti3m2n
+.bio1
+.ca4p3s
+.circu2m1
+.contro1
+.di2s3cine
+.e2x1eu
+.fran2k3
+.free3
+.li3p2sa
+.narco1
+.opto1
+.orto3p2
+.para1
+.ph2l
+.ph2r
+.poli3p2
+.pre1
+.p2s
+.re1i2scr
+.sha2re3
+.tran2s3c
+.tran2s3d
+.tran2s3l
+.tran2s3n
+.tran2s3p
+.tran2s3r
+.tran2s3t
+.su2b3lu
+.su2b3r
+.wa2g3n
+.wel2t1
+2'2
+a1ia
+a1ie
+a1io
+a1iu
+a1uo
+a1ya
+2at.
+e1iu
+e2w
+o1ia
+o1ie
+o1io
+o1iu
+1b
+2bb
+2bc
+2bd
+2bf
+2bm
+2bn
+2bp
+2bs
+2bt
+2bv
+b2l
+b2r
+2b.
+2b'
+1c
+2cb
+2cc
+2cd
+2cf
+2ck
+2cm
+2cn
+2cq
+2cs
+2ct
+2cz
+2chh
+c2h
+2ch.
+2ch'.
+2ch''.
+2chb
+ch2r
+2chn
+c2l
+c2r
+2c.
+2c'
+.c2
+1d
+2db
+2dd
+2dg
+2dl
+2dm
+2dn
+2dp
+d2r
+2ds
+2dt
+2dv
+2dw
+2d.
+2d'
+.d2
+1f
+2fb
+2fg
+2ff
+2fn
+f2l
+f2r
+2fs
+2ft
+2f.
+2f'
+1g
+2gb
+2gd
+2gf
+2gg
+g2h
+g2l
+2gm
+g2n
+2gp
+g2r
+2gs
+2gt
+2gv
+2gw
+2gz
+2gh2t
+2g.
+2g'
+.h2
+1h
+2hb
+2hd
+2hh
+hi3p2n
+h2l
+2hm
+2hn
+2hr
+2hv
+2h.
+2h'
+.j2
+1j
+2j.
+2j'
+.k2
+1k
+2kg
+2kf
+k2h
+2kk
+k2l
+2km
+k2r
+2ks
+2kt
+2k.
+2k'
+1l
+2lb
+2lc
+2ld
+2l3f2
+2lg
+l2h
+l2j
+2lk
+2ll
+2lm
+2ln
+2lp
+2lq
+2lr
+2ls
+2lt
+2lv
+2lw
+2lz
+2l.
+2l'.
+2l''
+1m
+2mb
+2mc
+2mf
+2ml
+2mm
+2mn
+2mp
+2mq
+2mr
+2ms
+2mt
+2mv
+2mw
+2m.
+2m'
+1n
+2nb
+2nc
+2nd
+2nf
+2ng
+2nk
+2nl
+2nm
+2nn
+2np
+2nq
+2nr
+2ns
+n2s3fer
+2nt
+2nv
+2nz
+n2g3n
+2nheit
+2n.
+2n'
+1p
+2pd
+p2h
+p2l
+2pn
+3p2ne
+2pp
+p2r
+2ps
+3p2sic
+2pt
+2pz
+2p.
+2p'
+1q
+2qq
+2q.
+2q'
+1r
+2rb
+2rc
+2rd
+2rf
+r2h
+2rg
+2rk
+2rl
+2rm
+2rn
+2rp
+2rq
+2rr
+2rs
+2rt
+r2t2s3
+2rv
+2rx
+2rw
+2rz
+2r.
+2r'
+1s2
+2shm
+2sh.
+2sh'
+2s3s
+s4s3m
+2s3p2n
+2stb
+2stc
+2std
+2stf
+2stg
+2stm
+2stn
+2stp
+2sts
+2stt
+2stv
+2sz
+4s.
+4s'.
+4s''
+.t2
+1t
+2tb
+2tc
+2td
+2tf
+2tg
+t2h
+2th.
+t2l
+2tm
+2tn
+2tp
+t2r
+t2s
+3t2sch
+2tt
+t2t3s
+2tv
+2tw
+t2z
+2tzk
+tz2s
+2t.
+2t'.
+2t''
+1v
+2vc
+v2l
+v2r
+2vv
+2v.
+2v'.
+2v''
+1w
+w2h
+wa2r
+2w1y
+2w.
+2w'
+1x
+2xb
+2xc
+2xf
+2xh
+2xm
+2xp
+2xt
+2xw
+2x.
+2x'
+y1ou
+y1i
+1z
+2zb
+2zd
+2zl
+2zn
+2zp
+2zt
+2zs
+2zv
+2zz
+2z.
+2z'.
+2z''
+.z2
+} % Pattern end
+
diff --git a/tmac/hyphen.sv b/tmac/hyphen.sv
new file mode 100644
index 0000000..f623901
--- /dev/null
+++ b/tmac/hyphen.sv
@@ -0,0 +1,4765 @@
+% ----------------------------------------------------------------------
+% Swedish hyphenation patterns.
+%
+% Copyright 1994 by Jan Michael Rynning. All rights reserved.
+%
+% This program may be distributed and/or modified under the conditions
+% of the LaTeX Project Public License, either version 1.2 of this
+% license or (at your option) any later version. The latest version of
+% this license is in http://www.latex-project.org/lppl.txt and version
+% 1.2 or later is part of all distributions of LaTeX version 1999/12/01
+% or later.
+%
+% Last update: 1994-03-03 (March 3, 1994).
+% Revision history:
+% 1991-01-08: First version available for anonymous FTP.
+% 1991-08-08: Changed \aa to \aa0 at end of line, to stop TeX from
+% concatenating the patterns.
+% 1991-09-03: Cleaned up lots of inconsistencies in the dictionary.
+% As a consequence, the patterns shrunk a lot. Also
+% added some 4000 one-syllable words, some of which were
+% hyphenated by the old patterns, and some 1500 compound
+% words, about half of which were incorrectly hyphenated
+% by the old patterns.
+% 1991-11-01: Added another some 6200 compound words, all of which were
+% incorrectly hyphenated by the old patterns.
+% 1991-11-13: Added another some 6500 compound words, all of which were
+% incorrectly hyphenated by the old patterns.
+% 1992-01-30: Changed macros to ^^, for use with LaTeX and dc fonts.
+% 1994-03-03: The hyphenated dictionary now contains about 118,000
+% words. The hyphenation now works much better for compound
+% words. Patgen parameters: 1 2 20, 2 1 8, 1 4 7, 3 2 1, 1
+% 10000 4.
+%
+% This file contains Swedish hyphenation patterns for TeX. It assumes
+% that you have fonts with the Swedish letters in the positions where
+% they occur in ISO Latin 1 (ISO 8859/1):
+% Letter: \AA \"A \"O \'E \aa \"a \"o \'e
+% Position: "C5 "C4 "D6 "C9 "E5 "E4 "F6 "E9
+%
+% Load this file into initex after plain.tex (or lplain.tex, splain.tex,
+% or whatever).
+%
+% The patterns were generated in such a way that they will hyphenate
+% correctly if \lefthyphenmin>=1 and \righthyphenmin>=2.
+%
+% These hyphenation patterns work quite well for simple words, but not
+% quite as well for compound words. I'm working on improving the
+% quality, by adding more words. If you know any Swedish words which
+% are not correctly hypheneted using these patterns, or if you have
+% questions or comments, please contact me:
+%
+% Jan Michael Rynning <jmr@incolumitas.se>
+% ----------------------------------------------------------------------
+\message{Swedish hyphenation patterns, Jan Michael Rynning, 1994-03-03.}
+{
+% Set \catcode, \uccode, and \lccode for the Swedish letters.
+% This should be done for all letters, really.
+\catcode`^^c5=11 \catcode`^^c4=11 \catcode`^^d6=11 \catcode`^^c9=11
+\catcode`^^e5=11 \catcode`^^e4=11 \catcode`^^f6=11 \catcode`^^e9=11
+\uccode`^^c5=`^^c5 \uccode`^^c4=`^^c4 \uccode`^^d6=`^^d6 \uccode`^^c9=`^^c9
+\uccode`^^e5=`^^c5 \uccode`^^e4=`^^c4 \uccode`^^f6=`^^d6 \uccode`^^e9=`^^c9
+\lccode`^^c5=`^^e5 \lccode`^^c4=`^^e4 \lccode`^^d6=`^^f6 \lccode`^^c9=`^^e9
+\lccode`^^e5=`^^e5 \lccode`^^e4=`^^e4 \lccode`^^f6=`^^f6 \lccode`^^e9=`^^e9
+\patterns{ % just type <return> if you're not using INITEX
+.a4b
+.ab5i
+.ab5ol
+.ab3r
+.ac3
+.a4d
+.a3dr
+.ad3s
+.a5g4ra
+.a5gre
+.a5kl
+.a5le
+.al4pr
+.a3lu
+.am4br
+.amp3l
+.a5mu
+.and4rar
+.a2n5es
+.ang4er
+.an5go
+.an5s
+.ap1p
+.as2k
+.a3sket
+.as4t
+.a5sten
+.a3sti
+.a5ta
+.at3t
+.au3st
+.a4val
+.av3s4
+.b4
+.bak5s
+.ben5s
+.bild3s
+.bo2k
+.bort1
+.cis4
+.cy5klop
+.d4
+.d^^e4r3
+.ek1v
+.e3l4a
+.e2l5in
+.en5st
+.e4n^^e4
+.e2r3i
+.e2s
+.e5skad
+.es3kal
+.es5kap
+.es4t
+.e5strad
+.e3tr
+.evan5
+.ex3
+.f4
+.feb3r
+.fram3
+.fres5
+.f^^e5gel3
+.f^^f6r1a
+.f^^f6r1en
+.g2
+.gu4l^^e4
+.gus3
+.he2m
+.hu5sa
+.ib4
+.ik4
+.im3p
+.i2n1
+.i4na
+.in3d
+.in4ger
+.ink2
+.in3s2
+.in3t
+.is5ka
+.i3so
+.k4
+.kans4k
+.ko5li
+.kort5s
+.kring3
+.krings2
+.k^^f6p5s
+.l2
+.lak5r
+.lek5tr
+.lu2st
+.m2
+.mas2ke
+.ma5skeri
+.me4re
+.minis4
+.mj^^f6lk5s
+.mon2s
+.m^^e5n3s
+.m^^e54st
+.m^^e4n5sko
+.m^^f6rk5r
+.n4
+.ner1
+.no4n
+.n^^f6d5r
+.oc1ku
+.ok3t
+.o3kv
+.o2ma
+.o2mo
+.om3s4
+.o3mu
+.on4k
+.o3o
+.ord3s
+.o5sc
+.o1s4k
+.o3sl
+.o3stra
+.o3sv
+.o3tr
+.o1u
+.p4
+.papp5s
+.pa3ste
+.pa5sti
+.pi5sti
+.pres2s
+.pub3lika
+.r2
+.re4gr
+.re2ste
+.runs4
+.rym2d
+.r^^f6ve5
+.s4
+.sa2k
+.seg3r
+.si5o
+.sj^^f61
+.sk4
+.skott3s
+.slut3s
+.st4
+.sta2m
+.sten3s
+.string4
+.sup3p
+.t4
+.ta3bl
+.ta4k
+.tak5l
+.tes3ta
+.tig3r
+.til4l
+.ti3o
+.topp5s
+.tred2s
+.tre3s
+.tr^^e45k
+.u3k
+.ult5r
+.ung2e
+.up2
+.u4ra
+.ur3s
+.u2t1
+.u4ta
+.u5trer
+.ut5s
+.v2
+.var4t
+.vatten3
+.ved5s
+.v^^e42g
+.v^^e4g3s
+.x2
+.y2a
+.y4e
+.^^e5ng3
+.^^e5r4s5
+.^^e53st
+.^^e5ter1
+.^^e43ro
+.^^f63ro
+a2b
+ab4bu
+a5be
+abel4s
+abe2s
+ab1l
+ab3la
+ab3ort
+ab5ric
+ab3rio
+ab4sc
+ab4sk
+a5bu
+ac4kes
+ac4kis
+ack3sk
+ack3u4p
+a5dag
+a5dek
+a5del
+ad5ep
+ad3j
+ad3op
+a5dran
+a3dre
+1adres
+ad3ril
+ad3ru
+ad2s
+a5ed
+af4fo
+3aff^^e4
+1af3ri
+af4tor
+a1ga
+aga4ra
+a1ge
+a2ge.
+ag1gr
+ag1l
+ag5ord
+ag3ro
+a4gur
+a4hj
+aib4
+a3iv
+a1j
+a3ka
+a4kart
+a5ke
+a1ki
+ak3n
+a1ko
+ak5ram
+akri5s
+ak3rob
+ak4sta
+1aktig
+ak3tri
+a1ku
+a5kvari
+ak3ve
+a5k^^e5r
+ak5^^e5t
+4ak^^f6
+a1la
+al5adm
+ali2br
+a2lin
+a5lin.
+a3line
+al3ins
+ali5stik
+a4lj
+alk3ak
+al2kv
+al4k^^e4
+all3st
+al3l^^e5
+alms4k
+a1lo
+al5ort
+als5pa
+al3tr
+al4tu
+al4t^^e4
+a1lu
+alu5s
+alv3s
+a1ly
+a4maf
+am4i
+am4pr
+am1s
+am3^^e5t
+a3m^^f6
+ana4bo
+an3alf
+an3ark
+an3c
+anci5
+an5dak
+andel2s
+an4dun
+an4d^^e4n
+a4nef
+ang4es
+an3gi
+an1gr
+aniu4
+ank3r
+ano2i
+a4nok
+a4nop
+an5sce
+ansis3t
+an4sj
+ans5ku
+ans3li
+ans3par
+an1st
+an4sto
+an4sty
+1ansvar
+an4tj
+an4tre
+a1nu
+a5ny
+a3n^^f6
+a1o
+a1pe
+a2pe.
+ape4n3
+a1pi
+ap4lan
+apo3str
+1appara
+apps4k
+ap3ric
+ap3rif
+a5pris
+ap2s
+ap3se
+aps5l
+aps3p
+apu5s
+a5py
+a5p^^e4
+2ara
+a4rann
+a4rarv
+1arb
+4arbi
+2arbo
+4arbr
+ar3dr
+ard5st
+a4rend
+arg5si
+2arh
+a1ri
+a4rigen
+ar3ka
+ark3lan
+ar5kr
+4arl
+4arn.
+ar4nal
+a1ro
+a2rob
+4arp
+ar2sa
+ar5skal
+arsk5l
+ar2sv
+ar4tro
+arts5p
+ar4tur
+4aru
+a4rur
+a5rus
+ar4v^^e4g
+a3ry
+a3r^^e4
+2asa
+asbe4
+a1sc
+as2h
+asis5t
+as3kis
+a2sko
+a4skr
+as3ku
+as5l
+as3pa
+as3pig
+as2sk
+as2s5op
+as2sp
+as2st
+ass5up
+as3ta
+a5stard
+as5ter
+as5tiker
+asti5o
+as3to
+as4tr
+ast5rak
+a5stral
+ast3rol
+as5t^^f6r
+a3su
+a4sul
+a4sund
+as2ut
+as3v
+a1sy
+a2s5^^e5
+a2s^^f6
+a1t
+ata5ra
+a5te
+ati5^^f6
+a4tj
+a2tr
+a3tral
+4atrar
+a4t3re
+at3ria
+a3tric
+at3rie
+a5trik
+a3tris
+a3t4ro
+a4tro.
+at4ska
+1attac
+at2tak
+at4tj
+at4tos
+att3s
+a4tung
+2au
+au5b
+au2t5a
+3autom
+aut5s
+2a1va
+a4vart
+1avg
+2a1vi
+av3r
+4a3v^^e4
+a5^^e5
+1b2
+3ba
+ba4di
+ba4do
+bad3s4
+bak5l
+ba4ko
+ba4ku
+bank5l
+bas4ta
+ba5stu
+4bb
+b4bak
+b4batt
+bbb4
+bb3l
+bb4ler
+b4b3r
+bb4so
+4b3d
+3be
+be3d4r
+be5e
+be1k
+4beld
+be5lu
+be3ly
+be3l^^e5
+be5l^^f6
+beng4
+be3n^^e5
+be1r^^f6
+be1s
+be3sl
+bes5s
+be4sta
+be4ste
+be5su
+be3tr
+be3tv
+be3u
+4bex
+2b3f
+2b5h
+3bi
+bi3d4
+4binv
+bis3ko
+bi5skv
+b3je
+b3k
+b5lar
+b5lat
+ble4mo
+b5len
+5blera
+3bles
+5blid
+3blikr
+3bliks
+4b3m
+2b3n
+3bo
+bo4gr
+bo2kl
+bo1mu
+5bon
+bors5te
+bor4ti
+bort3r
+borts2
+bort3sl
+bo1s
+bo4sc
+boy5
+4b3p
+2b5raf
+4brar
+2b5rati
+3brik.
+b3rika
+3brike
+3briks
+b5rik^^f6
+bru4st
+3bry
+3br^^f6
+4b3s
+b5sce
+bs3ch
+b4slan
+b4sof
+b4sp
+bst4
+b4stj
+4b3t
+3bu
+bund4s
+bus2st
+b3v
+3by
+by5r
+3b^^e5
+b^^e5ng3
+b^^e5t2s
+3b^^e4
+3b^^f6
+b^^f6r2s
+c2
+5cap
+c3c
+1c4e
+cens3t
+3centr
+ceu4s
+4ch.
+3chau
+3chef
+5choc
+4cht
+ch^^e4s3
+ch^^f6r4
+1ci
+ci4lu
+cim2
+cipp4
+4ck
+c3ka
+c3ke
+c3ki
+ck5j
+ck1l
+ck5lis
+ck3n
+c3ko
+c4kordn
+ck3org
+c4kort
+ck3r
+ck4re
+ck3sla
+ckus2
+ck3va
+ck3ve
+ck3v^^e4
+ck5^^e4
+ck3^^f6
+cle2a
+co2a
+co4m
+4cr
+cros2
+4cs
+1cy
+1d
+3da
+5da.
+4dadr
+dags3
+2dak
+5dako
+da3li
+5dam
+da3m^^e5
+4dand.
+4d1ap
+4darb
+4dart
+da4tr
+dat5t
+4dax
+2db
+4dc
+dcen3
+2dd
+ddd4
+ddi4s
+d3dj
+d4dos
+dd3ra
+dd3re
+dd3ri
+d3dr^^e4
+dd2s
+dds3v
+3d2e
+de1k4
+4deko
+4deld
+del2sa
+dels5ti
+de5lut
+d4en
+denti5^^f6
+den2to
+de3pr
+5der
+der1k
+de2ro
+de5rol
+der5sti
+de4ru
+de2s
+de3se
+de3sp
+des3ti
+d4et
+de3tr
+4dex
+2d1f
+df^^f63ra
+2d1g
+d3gl
+2d5h
+3di
+dias4
+di5el
+di2gr
+di3ka
+di5ku
+4dinf
+din3g4o
+4dinr
+4dins
+2dinsp
+4dint
+di1o
+di4od
+di3sc
+di4sj
+dis3ko
+dis1kr
+dis1p
+dis5to
+dis3tra
+di4tre
+2dj
+d3jor
+djup5p
+3djur
+2d3k2
+4d5l
+2d1m
+2d1n
+3do
+d2ol
+do5lo
+4domr
+dom2sk
+5don
+do4pak
+4d5ord
+4dori
+4dort
+d5ost
+do3y
+2d1p
+2d2r2
+d3rad
+3d4rag
+d3rand
+d5rarb
+d5rassera
+d5ratu
+3drej
+d3ren
+5dres
+d3ret
+d4ric
+3drif
+d3rig
+4d5rik
+d3rin
+3d4riv
+d5roc
+3dropp
+d3ror
+4drot
+drotts3
+d3r^^e4kn
+3dr^^e4kt
+5dr^^e4n
+d3r^^e4t
+d5r^^f6d
+4ds
+d2s1an
+d2se
+ds5enh
+d4sf
+d2si
+ds3ins
+d2sj
+dsk2
+d3skef
+ds4ken
+d3ski
+ds3kl
+ds5kn
+ds1l
+ds4lot
+ds4mo
+d4sm^^e5
+ds5n^^e5
+d2so
+ds3pl
+ds3s4
+ds3tal
+d5stat
+ds4te
+dste4a
+d5stig
+ds3tin
+ds5tro
+d2su
+ds1v
+d2s^^f6
+2d3t
+3du
+dub3ble
+4dup
+du1s
+du2sc
+du4ste
+du5s^^f6
+4dut
+du4vu
+2d1v
+d3vr
+2d3w
+3dy
+dy4kan
+dy4ro
+4dz
+5d^^e5g
+2d^^e5s
+4d^^e5t
+4d^^e4g
+d^^e42r
+3d^^f6
+d^^f6ds1
+4d^^f6g
+4d^^f6p
+d5^^f6st
+d^^e94
+e1a
+e2ake
+e4am
+4eb
+e2br
+eb3ril
+4ec
+e3ch
+echiff5
+ecis4
+e3co
+e2d
+e4dans
+edd4r
+edi4u
+ed3j
+e5dral
+ed1sk
+ed2sko
+ed3s2l
+edso4
+e3d^^e5
+e1e
+e2ed
+e4ei
+ee2k5
+e4en.
+e4ene
+e1f
+ef4s
+3efte
+e1g
+e3ga
+e3ge
+ege2l
+eg1l
+eg2ler
+e3glera
+e5gleri
+e4gran
+eg5rat
+eg3rin
+e5gru
+egs3
+e5g^^e5
+eig2
+ei5gn
+e3ik
+e1in
+ei5sh
+e1isk
+e1jo
+e3ju
+e3j^^e4
+e5j^^f6
+e3ka
+e1ki
+e1kl
+ek3lat
+ek4le
+ek3n
+e1ko
+ekord5s
+ek3orr
+ek4ret.
+ek5ro
+e1ku
+e1kve
+ek5vis
+e1ky
+e1k^^e4
+e1la
+el1akt
+el4arb
+3eld.
+eleb3r
+elekt3ri
+el4fra
+eli5ku
+el3k4
+el3li
+ell3s
+el3l^^e4
+e1lo
+e4lob
+el3p
+el2si
+el5ug
+e5luv
+2e1l^^e4
+e1m
+e5mat
+e5mis
+emon1s
+em5ort
+emp5le
+en5art
+e2nav
+en4ce
+e4ned
+e4nek
+ene3r^^f6
+2enj
+en5klo
+en3kn
+en5kr
+en5k^^e4
+enning5
+ennings2
+eno2m
+en3si
+ens5ke
+ens2m
+en2sp
+ens4te
+ens4vin
+en4s^^e5
+ent4ha
+en2t1r
+ent4rat.
+ent3rati
+ent3ri
+ent5ru
+e5nus
+2eny
+2e1n^^e4
+e1o
+e2og
+eo4i
+e5or
+2ep
+e1pe
+e1pi
+e3pla
+ep5le
+epp2s3
+epps5t
+e1pr
+ep3s
+ep4tr
+epu3b
+e3p^^e5
+er1ak
+4eras
+er3d4
+erg4l
+er4gu
+er4g^^e5s
+e1ri
+e5rib
+e4rinf
+erings3
+eri5stik
+erk4lin
+erl^^e44
+er5na
+e1ro
+e3rob
+e2rom
+erp4
+er3ra
+er5sc
+ers4ken
+er3sl
+ers4le
+er4sta
+er2ste
+er3str
+er3sv
+e1ru
+e5rum
+e3ry
+e5r^^e5d
+e1r^^e4
+e2sal
+es5all
+es3arm
+e1sc
+2ese
+es4hi
+esi4u
+es2k
+e4skan
+es5kar
+e4s3ken
+es3ker
+es5kul
+e1sl
+e5slag
+es2mi
+e1sp
+es3pl
+es2sk
+ess5l^^e4
+es2st
+e3stal
+es5ten.
+esti2ge
+es3tin
+es5tor.
+es4tr
+est5rer
+e3stru
+est4r^^f6
+e3st^^e5
+es2u
+e1sy
+eta3b
+e5ti
+eti3^^f6
+e1to
+e5tri.
+et3ris
+e5tr^^e4
+et2s
+ets2ad
+ets3kr
+ets1l
+ets3m
+ets5pa
+et4sv
+ett3r
+e1tu
+etu4ri
+et4va
+et5vu
+e1ty
+2etz
+e1t^^e4
+et^^e4c4
+euk4
+e5um.
+e5up4
+4eur
+eu4se.
+eu5tro
+e1v
+e4varm
+e4vj
+ev3r
+3exp
+ext4r
+4e^^e4
+f2
+3fa
+fac4
+fac5ke
+4fans
+4farb
+fa3sh
+fa4st
+fa4t^^f6
+4fav
+4f3b
+f3d
+3fe
+4fef
+fe2l
+fes5ta
+fe3sto
+4fex
+2f1f
+fff4
+ff3l
+ff3n
+f3fo
+ff3r
+ffs4
+f3f^^e4
+ff^^f65re
+f3g2
+f5h
+3fi
+fi2br
+fib5rig
+fi3li
+fin5sm
+fi3skal
+fisk3r
+fi2ti
+2f3k
+1fl
+flo4da
+4f3m
+fma4
+1fo
+4fof
+fol2
+folk1
+2f5om
+fo2na
+for4mo
+fost3r
+4f3p
+fra2m
+fram5p
+f4rer
+5freri
+fre4s
+f4ri.
+fri5sp
+5frit
+fros5ta
+fru5str
+fr^^e5n5
+2f3s
+fs2k
+f4sl
+f4sm
+f4sn
+f4sp
+f4st
+f4sv
+2ft
+f3ta
+f4taf
+f4tak
+f4tap
+f4tarm
+fte4r
+f4tex
+f3ti
+f4tin
+f3to
+f4t3r
+ft2sa
+ft4set
+ft2s5i
+ft4sj
+fts4t
+fts5v^^e4
+ft5t
+ft1v
+3fu
+furs5te
+fu5ru
+fu3tu
+4fv
+5fy
+fy4ma
+f^^e53t^^f6
+1f^^e4
+f^^e4s5ti
+3f^^f6
+f^^f62ra
+f^^f62ren
+f^^f62ri
+f^^f6r3k
+f^^f6r3sm
+f^^f6r3su
+f^^f6rt4
+f^^f6r1^^f6
+ga5br
+3g2ag
+4gakt
+3g2al
+gall3s
+ga5l^^e4
+ga4no
+2garb
+4garm
+ga2ro
+4gart
+ga4st
+ga4su
+5g2ati
+gaus4
+g4av
+g5avsn
+4gax
+2gb
+2gd
+g3d4r
+ge2a
+ge5b4
+2gef
+2ge4j
+g2eli
+3gelis
+gel5st
+gel5y
+3gel^^e4
+gel5^^e4n
+g4em
+ge4nap
+gen5g
+3g2eni
+3genj
+4genm
+genom5
+gen4sa
+g4ense
+1g2ent
+4genv
+ge5ny
+3gen^^e4
+ge2o
+1g2era
+4gerarb
+3g2eri
+gers5n
+5gese
+ge4to
+get5s
+5g2ett
+2g1f
+2gg
+g1ga
+g4gap
+g1ge
+gg5g
+gg1l
+g4gos
+ggs4la
+ggs4m
+gg3s4t
+gg3s4v
+g4gu
+2gh
+gh4te
+1g2i
+gi1o
+gi5sn
+gi4ste
+gis4tr
+gi5stral
+gi5st4rat
+3giv
+gi2^^f6
+g2jo
+3gjor
+g3j^^e4
+2g3k2
+2gl
+g4lans
+g1lar
+g2las
+5glase
+glas5k
+5glas^^f6
+g4lid
+4glj
+g4l^^f6g
+5gl^^f6m
+2g1m
+2g1n
+g4nag
+g2no
+1g2o
+3go.
+3gol
+gon3s4
+4gont
+2gord
+4gorm
+4gort
+go3sl
+2g1p
+g2r4
+3graf
+5gral
+gra2m5
+5grans
+4gras
+5grec
+5grett
+g3rig
+4g5rik
+5grip
+3gris
+g5roi
+gro2v
+4grum
+grus5t
+g4r^^e5
+5gr^^e5.
+gr^^e44n
+5gr^^e4ns
+2g2s
+gs1an
+g5satt
+g3sel
+g4sf
+gsi4d
+g3sju
+g5skaf
+gs4ki
+gs3kn
+gs4kot
+g3sky
+gs1l
+gs1m
+g4sme
+gs3n
+gs4ni
+gs4n^^f6
+gs1or
+gs3pl
+gs3po
+gs4por
+gs5pre
+gs3pu
+gs3s
+gs3tak
+gs3tal
+g3stark
+gs4ten
+g3stif
+gs3till
+gs3tj
+g3stol
+gs3tra
+gst4re
+g3st^^e4m
+g4sug
+gs1v
+g4s3ve
+gs3vi
+gs3v^^e5
+gs3yt
+gs1^^e4
+2g1t
+g3tr
+1g2u
+4gug
+guld3
+gul4da
+4gul^^e4
+gu2ma
+4gup
+gu5ru
+gus4k
+2gut
+g3utb
+2g1v
+4gw
+3gy
+gytt3j
+1g2^^e5
+g^^e5rds5
+2g5^^e5ri
+g4^^e4l
+g2^^e4r
+g^^e44s
+1g2^^f6
+4g^^f6g
+g^^f65ro
+2g5^^f6rt
+1h
+ha3bl
+ha5ge
+ha4li
+hal4so
+halv3^^e5
+ham4st
+handels3
+hands4l
+han5g2a
+ha5ra
+ha4sc
+ha4sp
+hasp5l
+has3t
+hav2
+havs3
+h5c
+4hd
+he4at
+he4fr
+he4l^^e4
+hets1
+hets3t
+hets3v
+h3g
+h2i
+4hir
+his2sk
+hi4t
+hj^^e4l3s
+h1k
+2hl
+h4le
+2hm
+4hn
+h2na
+h2nit
+ho5nu
+hop5plo
+hop3s
+hos3p
+hos5ti
+4how
+h3p
+h5ru
+h1s
+2ht
+hu2s
+hust5r
+hyg5r
+hys4t
+hys5ta
+hy3ster
+h^^e5rd5s4
+h^^e4ll2
+h^^e4lls1
+h^^e4lso3
+h^^e44ri
+h^^e44s
+h^^e44var
+h2^^f6
+h^^f62g
+h^^f65gen
+h^^f6g5r
+h^^f6rn5s
+h^^f64s
+h^^f6st5r
+i1a
+ia3fr
+ia3g
+ia4lu
+ia4sk
+ia3tr
+i2b3l
+i5bril
+i3ca
+i4ce.
+i5cha
+ic4kord
+ick3u4
+i5co
+i2d
+iden3s
+id4ge
+i4dom
+id1r
+id3ro
+id2s
+ids3v
+i4dun
+i3d^^e5
+i4d^^f6
+2i1e
+ifes4
+i5fn
+i1fr
+3ifr^^e5n
+i1g
+4igan
+i2geb
+ig5ej
+ig1l
+ig3no
+i3i
+i4kart
+i1ki
+i3klo
+ik5l^^e4n
+ik3n
+i1ko
+ik3re
+i5krob
+ik5rof
+ik5ros
+ik5s2h
+ik5skor
+i3kul
+i3kum
+ik5u4t
+ik1v
+i3ky
+i3k^^e5
+i3k^^f6
+i1la
+il4dan
+i2lin
+il1j^^f6
+il5k
+il5lak
+il4lik
+ill3s2
+3illu
+il5l^^e4r
+il2min
+i1lo
+il2tj
+i3lu
+ilufts5
+i4lup
+i5l^^e4
+im2b3r
+im5sm
+im4so
+i1mu
+i5m^^e5
+i3m^^e4
+i5m^^f6
+i4nau
+ind5sk^^e4
+ind5sti
+1indu
+in4ga
+in4ge.
+ing4es.
+ing5is
+in5glas
+ings5te
+i3ni
+i4nif
+in5j
+in5kve
+1inneh
+5inre
+1inri
+3inr^^e4
+in4sem
+in3skr^^e4
+in3sl
+ins4m
+in3sn
+1inspe
+5inspeln
+in5spr
+3instink
+3instru
+in4st^^e5
+in5te
+1intr
+in4tra
+int3s
+i1nu
+i4nun
+in3ym
+i1n^^e4
+i5oc
+i1og
+i3ok
+io4kr
+i1ol
+io5li
+i5om
+ion2
+i3ono
+ions3
+i1op
+i1or
+i1os
+i1ot
+i1pe
+i1pi
+ipos4
+ip5pi
+i3ra
+i4res
+i1ri
+irk5l
+i1ro
+iro3p
+i1ru
+i5sce
+isel4
+is2h
+i2sk
+is5kep
+isk5na
+is3kopa
+is3ku
+is4kun
+is3ky
+i5slam
+is3l^^e4n
+is3m
+is3n
+i2s3p
+is4pri
+is3sa
+is3se
+iss5n
+is4s3tr
+iss3t^^e4
+i1stal
+i1stans
+ist5att
+is5ten.
+i1stent
+is4tes
+is3tig
+is5ting
+is5tor.
+is5tore
+ist5ro
+ist^^e54
+is5v
+i3sy
+i4s^^e5
+i1t
+it5c
+i4tei
+i4tex
+i4tj
+it5ran
+i5trin
+i3tris
+it2t5op
+it4t3r
+it4tu
+i2t5^^e5
+4i1u
+i1va
+i2vak
+i1vi
+i4vin
+iv3r
+iv2s
+i1v^^e5
+ix2t
+ix5tu
+i1^^f6
+1ja
+3jakt.
+4jarb
+jas5p
+2jb
+2jd
+jd3r
+jd4sty
+j4du
+1je
+je2a
+5jef
+je5sta
+2j1f
+4j3g
+4jh
+1ji
+4jin
+4jk
+j4kl
+j3ko
+jk3v
+2j1l
+2jm
+2j1n
+j2o
+3job
+jo4kr
+4jolj
+jo5l^^f6
+jor4din
+jord3s4
+3jou
+4jp
+j5pl
+2j3r
+2j1s
+j5sa
+j4sk
+js4me
+js4te
+2jt
+jts4
+2j2u
+ju4kos
+juk3s
+jul3k
+4jur
+jus5kr
+juss4
+jus4t
+jus5ta
+jut4sta
+j^^e45lo
+j^^e4l4p5r
+j^^e4l4sa
+j^^e4rn3sk
+j^^e4r5s
+j^^f6r2s
+j^^f6s4t
+5j^^e9
+1k2a
+3ka.
+3kad.
+3kade.
+ka4dr
+2kaf
+5kaf^^e4
+ka3i
+ka5ju
+2kak
+k3akti
+4kalf
+4kalg
+kal4lo
+kall3s
+3kamp
+3kamr
+3kan.
+4kand.
+5kano
+2kap
+3kapi
+ka5pla
+kap4pr
+kaps5t
+5kapten
+3kar.
+ka3ra
+4karb
+k5arbet
+ka5ri
+4kark
+3karna
+4karp
+karp5s
+4kart.
+4karte
+4karv
+3kas
+ka4sk
+kas3ti
+3kat.
+3kats.
+4kau
+2kb
+4kc
+2k3d4
+kdom4
+1k2e
+3ke.
+2ked.
+2keda
+ke3dr
+ked4s
+ke4er
+2kefu
+4keld
+kels4
+4kense
+ke5n^^e5
+2kep
+3kern
+ke2s
+kes3s
+4kex
+2k1f
+kf^^f62
+kf^^f63ri
+2k5g4
+2kh4
+kid3s
+4kif
+1kig
+kik4s
+kilt4
+5kim^^e5
+king3r
+4kinne
+4kins
+2kint
+ki4nu
+ki4tr
+kiv3s
+4kj
+5kjol
+k3j^^e4
+2k3k
+kl2
+1klag
+k2lama
+kla4mi
+3klang.
+3klass
+2klat
+5klav
+2kle
+k2lej
+2klig
+k2lim
+3klip
+k2lis
+5klist3r
+k5lock.
+5klocka
+3klos
+1klub
+4kluk
+1kl^^e4d
+2k3l^^e4g
+2k1m
+2k2n
+k4nal
+3k4nap
+5knip
+3k4niv
+3k4nu
+k4ny
+k5nyk
+k2o
+4koc
+ko5de
+k5odl
+kog3n
+ko4gr
+kog4s3
+4kola
+ko2lin
+4kolj
+kol5tr
+5kolv.
+1kom
+3komm
+5komp
+2k3omr
+kom4s
+1kon
+3konf
+3konst
+3kont
+ko3nu
+1kor
+3korg
+ko3ri
+2korr
+3korres
+5kortera
+ko5s4k
+ko3sl
+3kost
+ko4str
+4k3ou
+2k1p
+k2r4
+3kraf
+5kra3ge
+4krang
+5krera
+k4reten
+krid5s2
+1krig
+krigs3
+krings2k
+4kriv
+3kropp
+kropps5
+kru5stad
+k3ryg
+kr^^e5k5s
+kr^^e54pa
+k5r^^e4dd.
+kr^^e4k5l
+4kr^^e4l
+k3r^^e4t
+2ks
+ksaks5
+k2s5as
+ks3ch
+k4ser
+ks2k4
+ks3kl
+ks5kra
+ks5kv
+k3sk^^e4
+k3sk^^f6
+k5slag.
+ks2li
+k5sly
+k2so
+ks3pl
+k1s4t
+kstavs3
+ks5tid
+k2su
+4k1t
+k4tex
+kti5ge
+k4tinn
+k2tins
+k2tod
+k2tom
+k2tr
+kt3re
+kt3rin
+k5trod
+kt5rog
+kt3rol
+kt5r^^e4t
+kt2st
+kt5t4
+k4tug
+k2tut
+k4t^^e4l
+4kug
+k5ugn
+ku5la
+4kuld
+3kul^^f6
+kum5pl
+kungs5
+5kunn
+ku4pen
+ku4ro
+3kurs
+3kus
+kust3a
+kv4
+3kvali
+k5vare
+3kvarn
+kvar3s
+3kvart
+k4vato
+k2ve
+2kvente
+1kvinn
+5kvire
+k4vo
+k1v^^e5
+3kv^^e4ll
+k1v^^e4r
+kydds3
+ky4lin
+3kyrk
+k^^e4l4m
+5k^^e4mp
+5k^^e4nn
+3k^^e4ns
+3k^^e4rl
+4k^^f6g
+k^^f6ks5t
+5k^^f6p.
+k^^f6r4l
+k^^f6r4sl
+3la.
+1lade.
+2ladm
+4ladr
+2laf
+3lagd.
+la4gin
+5lagm
+lag3r
+2lak
+5lakan.
+5laki
+3laktis
+la5lo
+3lande.
+lan4di
+2lappara
+2larb
+1larn
+lar5s
+4lart
+las3h
+4lask
+la4st
+5laste.
+1lat.
+la5tr
+lat4tis
+2lau
+2lav
+la5vu
+2lb4
+4l1c
+2l2d
+lder4s
+l3dj
+ld3ra
+l5dry
+lds4an
+1le
+3le.
+le4ge.
+le5ig
+le2kl
+le4kv
+lem4s^^f6
+2l5enl
+3ler.
+ler5k
+3lern
+ler3ste
+le5s2l
+le5t^^e5
+le3um
+le4vu
+2lex
+2l1f
+2l1g
+l2gj
+l3g2l
+lgs4
+lg5st
+2lh
+1li
+li5ch
+3lif
+3lig
+li4go
+lig3s
+lik2l
+li5kli
+lik3s
+5limer
+2lind
+2linga.
+ling5o
+4lingr
+lings5t
+2lini
+5linj
+2lint
+li1o
+2lip
+lis3c
+li4sta
+li3str^^f6
+li4vo
+livs1
+l2jak
+4l1jo
+1lju
+l5j^^e5
+l1j^^e4
+l3j^^f6r
+2l1k
+l3ke
+l5kju
+l2kl
+lk5lag
+l5kl^^e4
+l2kr
+l3k4ra
+lk3t
+l1la
+lld4
+ll3dr
+lle5b
+ll3k
+ll1l
+l1lo
+llok5v
+ll3p
+ll4san
+ll2se
+ll3ska
+ll2so
+ll4sva
+ll4tig
+ll3tr
+l1lu
+ll5un
+llust3ra
+ll5v
+l5ly
+ll^^e4ggs5
+l5l^^f6d
+ll^^f6r4
+ll5^^f6rt
+4l1m
+l4mol
+lm3st
+l1n
+lo2af
+loc4ku
+4lodl
+lo4do
+lod3st
+lo2ge.
+2lolj
+2lom
+4lord
+2lorg
+lor4s
+lo4vo
+l4pak
+l1pe
+l1pi
+l5pla
+lp5l^^f6
+lp4st
+4l3r
+2l1s
+l2sc
+l4sjo
+l4sj^^e4
+l2sk
+l4skensv
+l3ski
+lsk3n
+l5skot
+l3skr^^e4
+l3sky
+l3sk^^e5
+lsk^^e54p
+l3sk^^e4
+l3slu
+l4sm
+ls4mo
+ls5nyt
+l2sp
+l3spe
+ls3pl
+ls3pol
+ls5s
+l2st
+l3sta
+l4stak
+ls4te
+ls5ter
+l3sto
+l3sty
+l4styg
+l3st^^e5
+l3st^^e4
+l5st^^f6
+l2su
+l5sur
+l2sv
+l4svi
+ls5vid
+l4s^^e5
+4l1t
+lta2tu
+l4tef
+l4tif
+l4tih
+l4tos
+lt5rati
+l4tret
+l4tr^^f6
+lt5sk
+ltu4
+lu5i
+luk4to
+4lull.
+2lun
+lung3
+2lupp
+lu4pu
+lus2s5p
+5lust.
+4lutb
+4luts
+2lv
+l1va
+l4varm
+lvers4
+l1vi
+l4vos
+lv3ri
+lv3sp
+l1v^^e4
+lv^^e4v4
+lycks5t
+ly4gat
+lyg3r
+lyg3s2
+3lyste
+5lystn
+ly4str
+2l^^e5.
+l^^e5g3s
+1l^^e5ng
+l^^e5ng3s
+l^^e54sk
+l^^e5s5te
+l^^e54st^^e5
+4l^^e4c
+l^^e4g5r
+1l^^e4nds
+5l^^e4ngder
+l^^e44san
+l^^e44sp
+l^^e4tt3s
+4l^^f6l
+4l^^f6m
+3l^^f6n
+3l^^f6rer
+1l^^f6s
+l^^f64v^^e4
+3l^^e9
+1ma
+ma5fr
+mag5n
+mag5s
+ma5ju
+mak3r
+ma3li
+mand4
+mang2a
+man5g4o
+ma5ni
+mani1k
+5ma3ri
+mash5
+mas3ko
+mask3ro
+ma5sk^^f6
+mas3ti
+mas4v
+2mb
+mb4sk
+2mc
+2md
+m4dat
+m4di
+m4do
+m3d4r
+1me
+2meds
+me4du
+me4kl
+me4ko
+4meld
+melo5
+me5lu
+men5k
+me5nu
+me5ny
+mer2sko
+me4so
+mes4t
+me3sti
+2meta
+me5trin
+met3ro
+meu4
+2mex
+2m1f
+m4fes
+m4fn
+2m1g4
+2mh
+1mi
+mid3s
+mi4lu
+2mind
+ming4o
+4mink
+min4kr
+4minv
+mi3n^^f6
+mis2
+mi5sf
+mi4sp
+miss3t
+mi4te.
+mi4tr
+mitt3s
+2m1k
+2m3l
+2m1m2
+mme5d
+mm3s4
+m4mul
+2m1n
+m2nam
+mnas3t
+m4nav
+mn5dr
+mn3g4
+mn5st
+mn5tu
+m2n3^^e5
+1mo
+m4od
+mo4i
+2momr
+mo3na
+mos3k
+mo2ta
+mo4tin
+mo4tu
+mot3v
+2m1p
+m2pak
+m4part
+m2pl
+mp3lad
+m5plane
+mp3lat
+mp3lin
+mpos4
+mp5p4
+mps4k
+mp5sp
+m4p^^e5
+2m1r
+4ms
+m4sal
+m4ske
+m3slag
+ms3l^^e4
+ms2m
+mste2
+m1sto
+m2str
+mst3rin
+ms5^^e4p
+2m1t
+4mud
+mulls3
+mult5r
+5mum
+4mun3g4
+mun4ko
+3mur
+3musi
+mu3sta
+mut4sl
+2m3v
+1myn
+mys4te
+m^^e5g4
+1m^^e5l.
+5m^^e5let.
+5m^^e5n.
+4m^^e5r
+m^^e51s
+4m^^e4g
+m^^e4k3
+1m^^e4n
+m^^e4ns4
+3m^^e4rk
+1m^^e4s
+m^^e4s5ta
+1m^^e4t
+m^^f64bl
+m^^f64gen.
+3m^^f6j
+m^^f6r4kl
+3m^^f6s
+4m^^f6v
+1na
+3na.
+3nad
+nads3
+2naf
+na5gr
+2nak
+3nako
+3nakr
+na3kro
+n1akt
+2nalf
+5nalfl
+4nalg
+nal3s
+na2lu
+n5amb
+5namn
+4nand.
+4nanv
+na4rap
+2narb
+2nark
+4narm
+2nart
+nast3r
+2nb4
+2n1c
+n2ch
+n3cha
+n3che
+n3chi
+ncis4
+ncyk3l
+2nd
+n4dak
+n4dav
+nd3d4
+n5de
+nde3s
+n4dil
+nd5rak
+nd5ras
+nd3rat
+nd3ri
+n5dril
+n3drop
+nd5ros
+nd5skal
+nd3sn
+nds3or
+nds5v^^e4
+nd5^^e5s
+1ne
+3ne.
+ne4di
+5nedl
+ne4d3r
+ned3s
+ne4d^^f6
+ne2gr
+ne5gres
+4nek.
+ne5ly
+4nenl
+ner5sm
+nes3s4
+ne4sta
+ne5s4ti
+ne3tre
+ne1ut
+2nex
+2n1f4
+nfalls5
+nfis3
+2ng1
+n4gar
+n4gen.
+n4gend
+n4gens
+n4genti
+n4germ
+n4get
+n2gi
+ng3ig
+ngi4s
+ng4ly
+n2go
+ng5om
+ng3or
+ng3rad
+n4gr^^f6
+ng4ser
+ngs1k
+ngs3pa
+ngs5tim
+ngs3val
+n4g^^f6d
+2nh
+1n2i
+4nid
+ni5ec
+ni4ki
+ni5li
+3nin
+nings1
+nings3k
+nings5v
+ni1o
+4nip
+nip4pr
+ni5steri
+nist3ra
+ni3t4r
+niv5sk
+niv5st
+2n1j
+n4jar
+n3jun
+nju4s
+n3j^^e4
+2nk
+n4kart
+n1ki
+n4kis.
+n3kny
+n1ko
+nkrafts5
+nk3ri
+n1kro
+nkrus4
+nk5sl
+nk3sp
+nk4tin
+n1ku
+n1k^^f6
+2n1l
+2n1m
+2n1n
+nn3d
+n3ne
+nnis4
+nn3k
+nn3s4t
+1no
+2nodl
+no4kl
+2nolj
+2nomr
+nom3s4
+2nord
+2norg
+no5sa
+no5sc
+no4tu
+2n1p
+2n1r
+4ns
+ns2i
+n4sint
+n4sis.
+n4sise
+ns2k
+ns3kan
+n1ski
+ns3kor
+nslags5
+ns5las
+ns5mit
+n4soc
+n1spi
+ns3pl
+ns3po
+ns3s4
+n3stans
+n3stap
+ns4tel
+n3stif
+ns3tig
+ns4tra
+n2strik
+nst5up
+nst5vil
+n3s4ty
+n1sva
+ns3vi
+ns3v^^e4r
+2n1t
+n4tark
+nter5s4
+n4tinf
+n2t5omb
+nt3rad
+n3trah
+n3trak
+n5trala
+nt3rali
+n5tram
+nt3rep
+n3trer
+nt3ria
+nt3rin
+nt3ris
+n4tropin
+n4tror
+n4tr^^f6
+nts3c
+nt4se
+nts5kor
+nt4str
+n4tut
+n3tv^^e5
+nufts4
+4nug
+n5ugn
+3nui
+3num
+nums5
+2nup
+n3upp
+2nutb
+2n1v
+ny5gr
+n5z
+4n^^e5r
+4n^^e4.
+4n^^e4c
+3n^^e4m
+3n^^e4t
+4n^^f6g4
+3n^^f6j
+n^^f62ja
+n^^f65kr
+4n^^f6l
+n^^f6s4
+n^^f6s5ke
+o1a
+o2ard
+o2b
+5o4bj
+o4bli
+oby4
+oc4k5r
+ock3sk
+oc3ku
+o2d
+ode4k
+odi4a
+1odli
+o5dral
+o3dro
+ods4k
+od2st
+ods4ti
+od5stu
+o3d^^e4
+o1e
+offs5t
+o4fl
+o3fr
+of^^f6rm^^e54
+o1g
+o4gav
+og3gr
+o4gj
+o5glo
+o5gly
+ognos4
+ogno5st
+o4gri
+o4gr^^f6
+og3se
+og4s3t
+o4g^^e4
+o1i
+o4il
+o1j
+o1k
+o4kli
+ok3n
+ok3sl
+ok4su
+o2kv
+o1la
+o5lak
+ol5au
+olf^^f64
+1olj
+ol3ka
+olk3r
+ol4ku
+ol4k^^e4
+oll4si
+oll5sl^^e4
+ol3l^^e4
+olm4s
+oln3s
+o1lo
+olo5kv
+ol4sa
+ol4t^^e5
+o1lu
+o4lug
+o4lur
+o1ly
+ol5^^e5r
+o1l^^e4
+om4br^^e4
+o3men
+o4mord
+om5pa
+om3pl
+1omr
+4omra
+om1sk
+om4ste
+3oms^^e4t
+om4tr
+om3tv
+on3c
+on5gi
+on1gr
+ongs4l
+o4nins
+on3j
+on1k4
+ons3c
+onsi3s
+ons3m
+on5stel
+ons4ter
+on3tras
+on4tre
+ont4s
+o1ny
+on5^^e5
+o1n^^e4
+o3n^^f6
+oo4d
+oom5s
+o3or
+o1pe
+o1pi
+o5pline
+op4pl
+opp3le
+op4pr
+op4pu
+o3pri
+op4st
+o3p^^e5
+o5q
+4ora
+o3rak
+oran3g4
+o2rap
+1ordn
+or4d5^^e4
+o4reh
+1orga
+5organi
+or4gr
+or4g^^e5
+o1ri
+3orient
+4ork
+or4m^^f6
+or4nu
+or4n^^e4
+o1ro
+or4pl
+or5pr
+or4spa
+ors5tig
+or5te
+or2tr
+ort3re
+ort3ro
+o1ru
+o3ry
+o1r^^e4
+o1r^^f6
+o3s2f^^e4
+osk4l
+o1skop
+o3som
+os5pig
+os4sk
+os4s4t
+os3tig
+os5tiker
+o5still
+os4tr
+ost5ron
+ost5r^^f6
+os3tul
+ota2lan
+4oti.
+4otie
+4otin
+o1to
+o5tro
+ot5run
+ot3sv
+ot5ti
+ot4tr^^e4
+ott2s
+o1tu
+o5tun
+otvin4
+o1ty
+o5t^^e5
+o3t^^e4
+oun4
+oup4
+4our
+ou3r^^f6
+ou4s
+o3ut3t
+o1va
+ova4n
+o1vi
+ov3r
+ov4si
+ov3sl
+ovs4me
+o1v^^e4
+o3we
+ox5
+oy2
+o3^^e5
+o3^^e4n
+o3^^f6
+1pa
+4paf
+pag4
+paki3
+pakis4
+pa5la
+pals5
+pa5l^^e4
+4pand.
+pan4tr
+3pap
+2parb
+4parm
+par3s
+2pask
+pa5ski
+pa2st
+3patr
+pa3u
+2pb4
+2pc
+2p3d4
+pek5tri
+pekt3ro
+4peld
+pel3s4i
+4pem
+5peng
+3penn
+pent5r
+per4bl
+3perio
+3pers
+per4sl
+pe5tro
+4pex
+2p1f
+4p3g
+2ph
+pi4el
+1pig
+pi1o
+3pip
+pi5so
+pi5sta
+pi5sto
+p2j
+3pj^^e4s
+4p3k2
+p2l
+p4lac
+5plan.
+p4lane
+p3larn
+p3lev
+3plex
+3plic
+1plik
+4plit
+p3lj
+1plom
+p3lop
+2p1m
+4p1n
+p3ni
+1po
+5poa
+2poc
+2pof
+po2i
+3polit
+4polj
+poly3
+2porg
+3pos
+pos4ter
+4pov
+po4v^^e4
+2pp
+p4part
+pp5ask
+p4pax
+p3pe
+p1pi
+p4pins
+pp3j
+pp1l
+pp3la
+pp3lin
+pp5lis
+pp5lu
+pp3ly
+pp3l^^e5n
+pp3l^^e5t
+pp3l^^e4
+pp3l^^f6
+pp5oc
+pp3of
+pp3p4
+pp1r
+pp3ra
+pp3ri
+pp3ru
+pp3ry
+pp3r^^e4
+pp3tr
+p2pu
+p5py
+pp3^^e5
+p2r2
+2pra
+5prax
+1pres
+pres4t
+pre3sta
+pres5to
+p3rig
+p3rik
+5pril
+3princ
+pring3
+p5riol
+3pro
+pro3g
+p3ror
+4pr^^e5
+3pr^^e4s
+3pr^^f6v
+2ps
+p2sal
+3psalm
+p5s2ho
+ps4ken
+ps2li
+p3sna
+4pso
+p3sod
+p1s4t
+p4stak
+p4st^^e4v
+p2s^^f6
+2p1t
+p3tri
+1pu
+4pug
+pul2l5ov
+pul5tr
+5pung
+3punk
+pus3t
+2p1v
+p^^e53dr
+3p^^e4l
+p^^e45ro
+4p^^f6r
+3p^^e9
+qu4
+3que
+1ra
+3ra.
+raci4t
+3rade.
+4radr
+ra4du
+5ra1e
+2raff^^e4
+ra3fr
+ra5is
+2rak
+ra2lo
+r4ande
+3rande.
+4ran4d3r
+rand3s
+2ransv
+ra3pl
+3rar
+r4ar.
+4rarb
+r4are
+4rarg
+r4ark
+4rarm
+r4arn
+r4ars
+4rart
+r3arta
+ra5r^^f6
+r4as
+ras3h
+ra2st
+3raste.
+3rativ
+ra3tri
+2rav
+ra5yo
+2rb
+2r1c
+2r2d
+r4daf
+rda5gr
+r3dj
+r4dos
+rd3ran
+rd3rat
+r4dul
+r3d^^e5
+r3d^^e4
+r4d^^f6s
+1re
+3re.
+4reaus
+re3b
+4rec
+5reco
+re3d4r
+re5du
+4reft
+4regg
+3regn.
+re1kr
+rek5tri
+4reld
+re3lu
+rem5p
+3rems
+r4en.
+2reni
+2renk
+2renl
+re3n^^f6
+re3o
+3rer.
+3rern
+3reso
+ress5k
+re1sti
+3ret.
+4retet
+ret3ro
+4rety
+re5t^^e5
+2revig
+4rex
+2r1f
+rf^^f63ri
+2r1g
+rg3g2
+rgs5top
+2rh
+rhands5
+3rial
+4rib
+3rifi
+2rifr
+r3ifr^^e5
+3rifu
+3rigt
+rik2s
+3riktn
+ri4mo
+2rind
+rind3s
+5ringen.
+ring3r
+2rinr
+2rins
+2rint
+ri1o
+3riot
+ri5ple
+ri2st^^e4
+ri4tut
+ri4vis
+riv3s
+4rj
+r4jis
+r3jo
+r5ju
+r5j^^f6
+2rk
+rk3akt
+r4kek
+rkes3
+r1ki
+r3klas
+rk2le
+r4kl^^f6
+rk3n
+rk4ne
+r1ko
+r4kod
+rk3tr
+r1ku
+r4kup
+r1k^^e4
+r5k^^f6r
+2r1l
+r5laka
+r5lav
+rld2
+rlds3
+rl5sp
+2r1m
+r4marb
+r4mil
+rm2s5j
+rm5tr
+2r1n
+rnal4
+rn3g4
+rn1k
+r2nom
+rns4k
+rns4t
+rn3t
+ro3b
+ro4gro
+ro2kr
+2rolj
+rol4li
+rom4a
+5roman
+5ronau
+5rond.
+ron4v
+ro3pl
+ropp2s
+ro4ra
+2rord
+2rorg
+2rorie
+3rorn
+ro4sin
+ro4sn
+ros3v
+ro5te
+2r1p
+r4pl^^f6
+r4p^^f6
+4r1r
+rra4n
+rrd4
+rreligi5
+rres4
+r5rib
+rr5k4
+r4rob
+r4rom
+rr1s
+rrs2k
+r4rur
+2rs
+r4seld
+r4sex
+r2sin
+r1ski
+r4skid
+rsk3na
+rs5koll
+rs4kos
+rskotts3
+r2sku
+r3sk^^f6
+rslags4v
+r4sle
+r4slo
+r4s5l^^f6
+rs4mo
+rs5nat
+rs5n^^e4
+r1sp
+r2spl
+r2spo
+rs3s4
+rs5tak
+rs4te
+r5stek
+rs5tend
+r5steni
+rs5till
+r1sto
+r4ston
+rst4r
+r3str^^f6
+r3stu
+r1sv
+rs4vag
+r2sv^^e4
+r1sy
+2r1t
+r2taf
+r2takti
+rt4an
+r4tins
+r4tom
+r5trit
+r3tr^^e4
+rt3t
+r4tut
+rubb5l
+ru3br
+ru4dan
+ruks1
+ruks3v
+5rullera
+3rum.
+runn2
+runns5
+4rupp
+rus2h
+ru5sha
+2rut
+5rutig
+rut4ra
+ru4vi
+5ru^^f6
+2r1v
+rv4sj
+rv2s5k^^e4
+r3w
+rydd5s
+ry5o
+r^^e5ge5l
+4r^^e5l
+r^^e5ng3s
+r^^e55ra
+r^^e53st
+r^^e4ck5s
+4r^^e4kt
+4r^^e4m
+r^^e4ng3s
+r^^e4ns5t
+4r^^e4s
+r^^e44san
+r^^e4s3s
+r^^e45sti
+r^^e4v5s
+r^^f6d5el
+r^^f6d5r
+r^^f6d3s
+2r^^f6g
+r3^^f6i
+r^^f6k3s
+r^^f6ns4t
+4r^^f6p
+3r^^f6r
+r^^f6r4s
+r^^f64st
+r^^f6st3r
+r1^^f6vr
+1sa
+3sa.
+3sad.
+3sade
+4sadj
+2sa3dr
+sad5s
+2saf
+sa3i
+sak5ri
+2s1akt
+sa5lo
+3s2am
+sa2ma
+samman3
+sa2mor
+sand3s
+4sang
+2sanl
+s3anl^^e4
+san3sla
+2sap
+3s4ar.
+2sarb
+2sarm
+s5arm.
+3sarn
+2sart
+4sarv
+4sass
+5sat.
+sa4tu
+2sau
+s3auk
+2s1av
+4sb
+s2c
+2sch.
+1scha
+2schau
+4schb
+1schen
+1scher
+1schet
+1schi
+4schk
+4schm
+4schp
+3schy
+3sch^^f6
+sci3p
+4s3d
+1se
+se4at.
+se2g
+2s3egg
+3segl
+seg3ra
+sek5le
+sek3r
+sek5tr
+3sel.
+se5ly
+sem2
+3sen.
+s5ers^^e4
+3set.
+2sexp
+2s1f
+s4f^^e4r.
+sf^^f62
+4s3g2
+2sh
+5s2haw
+shi1s
+s5h^^f6
+1si
+sid5s
+5sie
+si4eri
+si4esk
+si2ett
+3s2ig
+3sik
+sikts3
+5sill.
+silver3
+silv3r
+2s1ind
+2s1inf
+sinne2s3
+3sinni
+4sinr
+2sin1s
+s1inst
+5sint.
+2sintr
+3sio
+sis4t
+siu4
+1s2j
+2sjak
+s3jakt
+4sjn
+4sjt
+s4ju
+5sjuk
+4sjur
+sj^^e4ls3
+3sj^^f6
+4sk.
+2ska.
+3s2kada
+s2kado
+3skaffn
+1skaft
+s4kag
+s2kal
+3skal.
+1skap
+5skap.
+5skapet
+4skapi
+skaps1
+4skar
+s4kara
+5skarv
+4skas
+s2kat
+s4kav
+4ske.
+3sked.
+s4kene
+3skepp
+4skh
+sk4i
+3skif
+5skin
+4skis.
+5skiv
+5skjor
+3skju
+4skl
+sk5lap
+s3klas
+4skn
+3s4ko.
+1s4kog
+4skogsg
+1skol
+3skola
+s4kolo
+s4korp
+skor1st
+1skot
+s5kran.
+3skrat
+sk4ret
+3skrev
+1skri
+3skrif
+s3krig
+5skrin
+3skrip
+s5kris
+3skriv
+s5kron
+s4kru
+5skrub
+3skruv
+5skr^^e4c
+sk3s
+2skt
+3skulp
+s3kup
+2skv
+s4kve
+1s2ky
+s4kyn
+2skyrk
+1sk^^e5
+s4k^^e5l
+5sk^^e5p.
+4sk^^e5r
+5sk^^e4nk
+3sk^^e4rv
+2sl2
+4sla.
+s5lad.
+s3land
+3s2lang
+s4lant
+s3lar.
+4slas
+s1lat
+s2lev
+3slev.
+s4lic
+slins3
+4slis
+s2lit
+s5lor
+slotts3
+s2lu
+s3luc
+s3luf
+4slus
+s3lust
+3slut
+slu4to
+3sl^^e5.
+5s4l^^e5r
+s4l^^e4k
+s5l^^e4m
+s5l^^e4nn
+3s4l^^e4p
+4s3l^^e4r
+s2l^^e4t
+3s2l^^f6j
+2sm
+s2mak
+3smak.
+s3makt
+s2mal
+s2met.
+s2mid
+s2mit
+3smitta
+s3mj
+5smug
+5smyg
+sm^^e55g
+sm^^e53k
+sm^^e53s
+3sm^^e4d
+3sm^^e4l
+4sm^^e4s
+3sm^^f6r
+2s2n4
+3snab
+3s4nac
+s3nam
+s5nare
+s3nast
+s5ner
+3snib
+3snil
+3snit
+1snitt
+s3niv
+3snut
+s4n^^e5
+5sn^^e5r
+5sn^^e4c
+s4n^^e4r
+3sn^^f6.
+sn^^f65g
+3sn^^f6r
+sn^^f63s
+1so
+3soc
+5sock
+2sod
+5soi
+2solj
+sol3s2
+2som
+5somm
+3son
+son4st
+so5pra
+so4pu
+3sor.
+2sord
+s5ord.
+2sorg
+3sorn
+3sot
+4sott
+s2p2
+5spann.
+s4park
+5sparv
+4spas
+s3pass
+spa5tr
+1spe
+4sped
+3s4pek
+3s4pel
+4spelsl
+2spen
+2sper
+5spets
+3spill
+3spir
+4spl
+s1pla
+s3plan
+s3plats
+spli4
+s4plin
+5split
+s5pl^^e4
+4spre
+s3pres
+4s3pris
+3sprit
+2spro
+s3pry
+3spr^^e5
+5spr^^e4n
+s3ps
+1s4p^^e5
+3sp^^e5n
+3sp^^e5r
+5sp^^e4n
+3sp^^f6
+4s1r
+4s1s
+s5sad
+sse4lin
+s5sil
+ss2k
+ss5kl
+ss3kun
+ss1l
+ss2lag.
+ss2l^^e4
+ss2l^^f6
+ss3na
+sss4
+ss3unn
+s2sv
+ss3vi
+s2t
+2st.
+4sta.
+5stac
+3stadi
+s4taf
+5stalgis
+3stalla
+2stalli
+5stam.
+5stamm
+1stant
+5stark.
+5startad
+1state
+3statl
+1stau
+st3c
+2s5te.
+4stea
+5steg.
+s4tek.
+2stekn
+5stekt
+s4tell
+3stem.
+3steme
+5stenar
+3s4tene
+3stense
+5stensm
+1stera
+1stering
+s4teriu
+3sterne
+5stetis
+2stia
+2stib
+3stick
+2stid
+s4tiken
+2stil
+3stil.
+3stink
+3stisc
+1stit
+2stj
+s5tju
+3stj^^e4l
+3stj^^e4r
+2stm
+5stoc
+1stol
+4stolk
+4stom
+stori4eu
+5storis
+stor3s
+3straff
+4strativ
+3strato
+3strec
+3strej
+st3ren
+1strer
+2stria
+1strid
+5stride
+2striel
+st4rif
+1strikt
+st5risk
+1stru
+3struk
+2strumm
+s3tryc
+5stryk
+5str^^e5k
+3str^^e5l
+3str^^e4c
+4str^^e4d
+3str^^e4ng
+5str^^e4v
+3str^^f6m
+2st3s4
+st3t
+4stv
+s3tvis
+1sty
+2styp
+1st^^e5
+4st^^e5g
+5st^^e5l
+1st^^e4
+3st^^e4l
+1st^^f6
+1su
+su4b
+3sug
+su3i
+3sum
+2sun
+5sun.
+s1under
+5sune
+s5ung
+2sup
+5supa
+su2pu
+5sus
+2s1ut
+su4to
+su4tr
+s2v2
+5svag.
+s3vagn
+4s3vak
+5svam
+4svap
+svars3
+3svart
+4svas
+s3vat
+4svec
+3sven
+5svep
+4s3ver
+s5ves
+4s3vil
+s4vine
+4svis
+s5vitt
+s5v^^e5d
+3sv^^e5ri
+3sv^^e4ng
+5sv^^e4rm.
+s3v^^e4s
+s3v^^e4t
+4syk
+5syl
+3syn
+syn3k
+s3yrk
+3sys
+sys4t
+sys5ter
+syt2
+sy5th
+1s^^e5
+5s^^e5g
+4s^^e5k
+2s^^e5lde
+s^^e5ng3
+1s^^e4
+s4^^e4d
+2s5^^e4gg
+s4^^e4l
+2s^^e4p
+5s^^e4s
+3s^^e4t
+4s^^e4ta
+1s^^f6
+4s^^f6d
+2s^^f6g
+s5^^f6ga
+s^^f64ko
+4s^^f6l
+4s^^f6p
+s^^f6r2s
+2s3^^f6rt
+1ta
+3ta.
+ta1ch
+3tade.
+4tadi
+4tads5
+2taff
+3taga
+5tak.
+ta5kre
+2taktig
+tak4to
+4talf
+5tallise
+tall5s
+4talv
+3tame
+3tami
+3tan.
+ta4nab
+3tande.
+2t3anfa
+4tanl
+t4ap3l
+2tappar
+3tar.
+4tarb
+tar4mi
+3tarn
+tars4
+4tart
+5tartavl
+4tarv
+4task
+3tast
+ta1str
+tat2
+ta4tan
+tats3
+2tatt
+2tav
+4tave
+5tavla.
+3tavlan
+3tavlo
+tav2s
+3tax
+2tb4
+2tc
+t3cha
+t3che
+2t3d4
+3t2e
+te4as
+te3b4
+5tec
+4teg
+te2g1r
+te3gre
+te3i
+te4int
+4tej
+tej2s
+te4kl
+5teknik
+5teknis
+4teld
+5te5l^^f6
+5tema
+4temo
+te4mu
+ten3g4
+5tensi
+ten3tr
+te4n^^e4
+te5n^^f6r
+5ter.
+5teri^^f6
+ter3k4
+5term
+5terna
+5ters
+ter3t
+te4ru
+5tes.
+5test
+tes4te
+te5stik
+te5stu
+5tetik
+tets3
+4texa
+2texp
+2t1f4
+2t3g4
+2th
+t4hen
+1ti
+3tial
+5tib
+5tici
+3tid
+5tide
+ti4du
+4tid^^f6
+ti4ed
+tifts5
+ti2gel
+3tigh
+ti4go
+ti2gr
+3tigt
+tik3l
+3tiks
+5tikul
+t2il
+5tilj
+3tillst
+3tillv
+3till^^e4
+5time
+2tind
+2tinr
+2tint
+ti4od
+3tion
+ti2os
+3tis
+4tisc
+5tisk
+3tiva
+ti4van
+5tivite
+ti2^^f6
+t2j
+4tje
+4tjob
+2tjou
+4tj^^e4l
+4tj^^e4m
+3tj^^e4n
+2t3k2
+2t3l
+2t1m
+2t5n4
+tne4r
+4todl
+3tok
+4tol.
+4tolj
+2tomr
+4toms
+t2op
+5torap
+t5ord.
+5toriett
+4torm
+torm3s
+3torn
+tor1st
+4tort.
+tos4k
+t5ost.
+t4ov
+2t1p
+t2r4
+2tra
+t4raf
+3trafi
+3t4ral.
+t4rala
+3t4rale
+5tralo
+3trals
+t4ralt
+3trans
+tran2s5a
+4trar
+t3ras.
+t3rat.
+t4rato
+4treg
+4tren
+4trer.
+4trern
+t3rets.
+2tri
+3tribu
+5trick
+trids3
+t5riel
+t1ring
+t3ring.
+2troc
+t3rock
+t4rog
+t5ronik
+t3rono
+4tropi.
+5tross
+5trotn
+t4rump
+t4rup
+3trupp
+trus5ta
+1tryc
+5tryck.
+5tryggh
+4tr^^e5k
+5tr^^e4.
+3tr^^e4d
+tr^^e4ds4
+3tr^^e4f
+3tr^^e4g
+4tr^^e4k
+t3r^^e4kn
+t4r^^e4n
+5tr^^e4ni
+5tr^^f6ja
+t4r^^f6t
+5tr^^e9
+2ts
+t5s4and
+ts5art
+t3s4at
+t3se
+t4seg
+ts4en
+t4sex
+ts2k
+t5skall
+t3skatt
+t1ski
+ts3kl
+tskotts5
+t5slot
+ts5l^^e4k
+ts3n^^e4
+t3sn^^f6
+t2so
+ts3ord
+ts3pl
+tss4
+t1st
+ts4te
+ts5ter
+ts5tillf
+ts3tj
+t3stol
+t4ston
+t2stra
+t4stry
+t4stur
+t5styr
+t2su
+t3sud
+t5sy
+2tt
+t3tac
+t4tau
+t4ted
+tte5g4
+t4tem
+tte2n
+ttes4
+t4tex
+t4tins
+t4tip
+tt3ja
+t1to
+tt3rad
+tt3rand
+tt3rat
+tt3re
+tt3ri
+tt4ry
+tt4se
+tt2si
+tt4sta
+t3tu
+t4tug
+tt1v
+tt4v^^e5
+t3ty
+t3t^^e4
+t3t^^f6r
+4t5ugn
+2tund
+3tunga
+tung3s
+5tunn
+2tupp
+tu5re
+2tutb
+t3utv
+t3ut^^f6
+tu4vu
+5tu^^f6
+2tv
+t1va
+4tve
+t3vig
+3tving
+t3vit
+3tviv
+t3v^^e5g
+3tv^^e5n
+t3v^^e4n
+tv^^e4r3s
+3tv^^e4tt
+ty5da
+5tyg.
+3tyngd
+3typ
+ty3pi
+5tys
+2tz
+3t^^e5g
+t^^e5s4
+4t^^e5t
+t^^e4c4ko
+4t5^^e4g
+4t^^e4m
+4t^^e4rm
+3t^^e4vl
+4t^^f64d
+t^^f65de
+4t^^f6g
+4t^^f6p
+t^^f64pi
+3t^^f6rer
+t^^f6rs3t
+t^^f64vas
+5t^^e9
+u1a
+u2b
+ub5al
+ubb4le
+ub3lic
+u4bo
+u3cha
+u5cl
+u2d
+u4dak
+u5de
+ud3r
+ud4ret
+uds4a
+u4du
+u4dy
+u1e
+u2es
+uf4f^^e4
+uf4tan
+uf4to
+4u1ga
+u1ge
+ugg3s
+ugn4
+ugns5
+ug3s4
+u5ie
+u1in
+u3is
+u3itet
+u3j
+u2keb
+u5ki
+u4kl
+uk5la
+uk3n
+u1ko
+ukos4
+uk2s
+uks5ko
+uk3tris
+ukt5s
+uk4t^^e4
+u3ku
+uk3v
+u1la
+ul4di
+ulds2m
+ul4du
+ul4d^^f6
+ull3ste
+ull3^^e4n
+u1lo
+uls5ti
+ul2tr
+u3lu
+u1l^^e4
+u1l^^f6
+um4f^^e4
+um4so
+ums4t
+u1mu
+u3m^^f6r
+5underl
+1unders^^f6
+1underv
+un4dom
+und3r
+un4d^^e5
+un5g2ef
+un3gersk
+ung5it
+ung3r
+ungs4p
+3unif
+unk3l
+unk3n
+un4kr
+un1sk
+un4tr
+un5trati
+u5nu
+u1o
+u1pe
+u4pern
+u1pi
+u2pl
+u3plet
+up3lik
+3uppfa
+1uppg
+up4pin
+1uppla
+5uppl^^e4
+up4p3r
+upp3s
+upp5sp
+up5ut
+ur5ak
+ur5arv
+u3re
+u1ri
+u1ro
+u4rob
+u4rom
+urs5tin
+ur4st^^e4
+u5ry
+u2sak
+us5anl
+u3scha
+u3se
+usen3
+u2s1k
+us3ka
+us4kla
+us4kr
+u5sky
+us4k^^e5
+us5l^^e4
+us3n
+u2sp
+us3pen
+us5tat
+us3tig
+u3stik
+us5tin
+ust5ro
+u4st^^e5
+u4st^^e4
+us3v
+u4s^^e5
+u4s^^e4
+u2s^^f6
+u4tak
+1utb
+u4tef
+ute3s
+utik2
+u5til
+uti3^^f6
+ut3j
+3utj^^e4m
+utlands3
+u1to
+u3top
+uto5s
+ut3r
+ut4rer
+ut4ro
+ut5rop
+1utru
+2utsid
+ut3sl
+3utsl^^e4
+2utt
+utt4j
+ut1v
+3utvec
+u5ty
+ut3^^f6v
+u5u
+2u1v
+u2vak
+u4vj
+u4v^^e4
+u5^^e5
+u3^^f6
+va5dro
+1vagn
+2v1akti
+val3k
+val4li
+val4st
+5valv
+5vama
+4vand.
+4vanp
+van4st
+van5tr
+5vap
+2varb
+va4res
+va4ri.
+4vark
+var2s
+vart5r
+va1ru
+vas5ti
+5vattn
+4vau
+4vav
+5vavi
+2vb4
+2v1c
+2v3d4
+1ve
+5vec
+ve2k
+ve3ke
+4veld
+vensk3^^e4
+5ventera
+ve3ny
+ve5n^^f6
+4vep
+ver5g
+3verk
+ves4
+ve2s5p
+ve1st
+3veta
+3vete
+vet5sa
+vett5s
+2v1f
+2v1g
+2vh
+v4i
+vi4c
+vid3s
+vild3s
+vil4t
+3vind.
+ving3s4
+3vinkl
+vi2no
+5vinst.
+5vinste
+vi5ny
+3vis.
+vi5sa
+vis5h
+vis5ko
+vi4st
+vis3ta
+vi2tr
+vi4var
+4vjo
+2v3k2
+2v1l
+2v1m
+vm^^f6rk4
+2v1n4
+1vo
+4vok.
+2vom
+4vord
+2vorg
+vos4
+2v1p
+2v2r
+5vrak
+3vrera
+v3ru
+2vs
+v4sc
+v1s2k
+v2skri
+vs4mi
+v3sni
+v2so
+v1st
+vs4te
+vs5tr^^e5
+v5styc
+vs3v^^e5
+v2s^^f6
+2v1t
+vu4d1
+v1und
+4v5up
+4vut
+2v1v
+3vy
+5v^^e5ld
+v^^e5ngs3
+3v^^e5rd
+4v^^e5ri
+v^^e53ru
+3v^^e4g
+v^^e4gg5s
+v^^e44l
+v^^e4ll4s3
+3v^^e4nl
+3v^^e4rde
+v^^e44ril
+4v^^e4rj
+5v^^e4rk
+3v^^e4rld
+2v^^e4t
+3v^^e4x
+4v^^f6g
+4v^^f6p
+3v^^f6r
+1wa
+we2
+w2h
+whi2
+wi2e
+w4na
+x1
+xan5d4
+xem3pla
+xis4
+xk2
+xli4
+xs4
+xti2
+x4t^^e5
+2y
+y1a
+y4bris
+yb4s
+y2d
+y4da
+y5dan
+y4do
+yd3r
+yds4
+y4du
+y4d^^f6
+y1e
+y1ga
+y1ge
+ygg3r
+yg4g^^e5
+ygs4p
+y1i
+y1ki
+y5klist
+yk5lon
+yk3n
+y1ko
+y1la
+yl4gj
+y3li
+yl5k
+yl5l^^e4
+y1lo
+yl4tr
+ym2fl
+ym4for
+y3m^^e5
+yng3r
+ynk5l
+yn4sa
+yns4t
+y3or
+y5ou
+y1pe
+y5po
+yp3ri
+yre4s
+y1ri
+yr4ku
+yrk5v
+y1ro
+yrs4k
+yr5st
+yr5tu
+y1r^^e53
+y5scho
+ys2st
+ys3ta
+ys3ti
+ys4tik.
+yst3ra
+y2tak
+y4te.
+y4tea
+y1to
+ytt3r
+yt5v
+y3va
+y3vi
+y3v^^e4
+y5w
+y5^^e5
+1za
+1ze
+ze4ro
+1zi
+1zo
+zo4nal
+4zp
+z5s
+3zu
+z4zin
+^^e51a
+^^e53dj
+^^e5ds4l
+^^e51e
+^^e51f
+^^e51ga
+^^e51ge
+^^e5ge2l
+^^e5g3l
+^^e5g3s4k
+^^e5g3st
+^^e5g^^e54
+^^e53i
+^^e51ki
+5^^e5klag
+^^e5k4str^^e4
+^^e51la
+1^^e5lder
+^^e52lin
+^^e5l3k
+^^e5ll4sp
+^^e5l2s5e
+^^e5l3st
+^^e51l^^e4
+^^e51m
+^^e5man4s
+^^e5nd4r
+^^e5n4du
+^^e5ns4t
+^^e5ns4v
+^^e53o
+^^e51p
+^^e52pl
+^^e55pla
+^^e54p^^f6
+^^e5r4do
+^^e5rd4ra
+^^e5rd2s
+^^e5rd4s3t
+^^e54rel
+^^e51ri
+^^e55ror
+5^^e5rsav
+^^e5r5s2li
+^^e5r2sv
+^^e5r5^^f6
+^^e5s4ke
+^^e5s3n
+^^e5ss4
+^^e5s4skr
+^^e5s4t
+^^e5te2
+^^e5t3ri
+^^e53tr^^e5
+^^e5t2sj
+^^e5tt5s
+^^e51v
+^^e41a
+^^e42b
+2^^e4c
+^^e4ck5v
+^^e42d
+^^e4dd3s
+^^e4d4du
+^^e4de4s
+^^e4d3r
+^^e4d5se
+^^e4d3st
+^^e43e
+^^e41ga
+^^e41ge
+^^e4g4go
+^^e4g1l
+^^e4g3r
+^^e4g4re
+^^e4g3se
+^^e43i
+^^e45jo
+4^^e4k
+^^e41ki
+^^e4k3n
+^^e4k3r
+^^e41la
+^^e4l4pap
+^^e4l4seg
+^^e4ls5kog
+^^e4l4slu
+^^e4l2t3r
+^^e4l2tu
+^^e4l4vin
+^^e4mp3l
+4^^e4ndligh
+^^e4nd3r
+^^e4nd1st
+^^e4ng5r
+^^e4nni3s
+^^e4nn3s
+^^e44no
+^^e4ns1l
+^^e4n4st
+^^e4ns5te
+^^e4n4sv
+^^e4n2t3r
+^^e43pe
+^^e4pp3l
+^^e44pr
+^^e4p4st
+^^e44rap
+^^e4r2bre
+^^e4rg5l
+^^e4r4gr
+^^e41ri
+^^e4rib4
+^^e4r4k^^e4
+^^e4r4nis
+^^e4rn3st
+^^e4r2n^^e5
+^^e4r4n^^f6
+^^e4r5ob
+^^e45rol
+^^e43rop
+^^e45ror
+^^e45ros
+^^e4r2si
+^^e4r4sko
+^^e4r2so
+^^e4r4sp
+^^e4r2sv
+^^e4r4tand
+^^e4r2tr
+^^e4rt3s
+4^^e4s
+^^e4s3pa
+^^e4s5pi
+^^e4s4sk
+^^e4s4sp
+^^e4s3ta
+^^e4st3r
+^^e44st^^e4
+^^e44s^^e5
+2^^e4t
+^^e43to
+^^e45tre
+^^e4t4s3k
+^^e4t5te
+^^e4t4top
+^^e4tt3r
+^^e4t4tu
+^^e4t4tv
+^^e41va
+^^e42vak
+^^e43vi
+^^e45vu
+^^f61a
+^^f62d
+^^f64dak
+^^f64dal
+^^f64darv
+^^f6de4s5
+^^f64dis
+^^f6d3ra
+^^f6d2s
+^^f6d3se
+^^f64du
+^^f64d^^f6
+^^f61e
+^^f61ga
+^^f6g5ak
+^^f65gar
+1^^f6gd
+^^f61ge
+^^f65ger
+^^f6gg4
+^^f6g1l
+^^f6g2n
+^^f6gn3e
+1^^f6go
+^^f6g3si
+^^f6g3sk
+^^f61i
+^^f63jo
+^^f6j4sv
+^^f64karm
+^^f61ki
+^^f6k3n
+^^f6k2s
+^^f6k3sl
+^^f61la
+^^f6l4kv
+^^f6l4k^^f6
+^^f6l2p
+^^f65l^^e4
+^^f6man4
+^^f6m2kl
+^^f64nal
+^^f62nom
+^^f6ns3ke
+^^f6n4so
+^^f6nst3r
+^^f63pe
+^^f64pel
+^^f63pi
+^^f6p5li
+^^f65plo
+1^^f6ppn
+^^f64pr
+^^f63rande
+^^f63ras
+^^f64rask
+^^f6rb4
+^^f6r3d4r
+^^f6r1eni
+^^f63res
+^^f64restr
+^^f63ret
+^^f6r5evig
+^^f6r3g
+^^f61ri
+^^f65rig
+^^f63ring
+^^f6r3int
+^^f6r5ir
+^^f6r5iv
+^^f6r4kal
+^^f6r1k2l
+^^f6r5kli
+^^f6r4nis
+^^f6r3ol
+^^f6r1or
+^^f6r2p5la
+^^f6r1s2k
+^^f6r3sl
+^^f6r4sl^^e4
+^^f6r5te
+^^f6rt5s
+^^f6r1u
+^^f6r3vr
+^^f6r3y
+^^f6r1^^e4
+^^f6r^^f64d
+^^f62sak
+^^f6s3n
+^^f6s4sj
+^^f6s2sk
+^^f6s4sp
+^^f6s3ta
+^^f6st3v
+^^f62tak
+^^f6ts5ko
+^^f6t4st
+^^f61v
+^^f6ve4
+^^f6ver1
+5^^f6vere
+^^f62vj
+^^f6v3ra
+^^f6v3ri
+^^f6v4sk
+^^e93e
+}
+}
+
+% Local Variables:
+% mode: tex
+% fill-column: 72
+% End:
+% vim: set filetype=tex textwidth=72:
diff --git a/tmac/hyphenex.cs b/tmac/hyphenex.cs
new file mode 100644
index 0000000..753359c
--- /dev/null
+++ b/tmac/hyphenex.cs
@@ -0,0 +1,18 @@
+% List of exceptions created by Karel Horak
+% (Mathamatical Institute of Czechoslovak Acadamy of Science)
+% Prague, April 1, 1991
+%
+\hyphenation{
+ koe-fi-ci-ent
+ koe-fi-ci-en-ty
+ pro-jek-èní
+ úhlo-pøíè-ka
+ úhlo-pøíè-ky
+}
+
+% Local Variables:
+% mode: tex
+% coding: latin-2
+% fill-column: 72
+% End:
+% vim: set filetype=tex textwidth=72:
diff --git a/tmac/hyphenex.en b/tmac/hyphenex.en
new file mode 100644
index 0000000..768c0af
--- /dev/null
+++ b/tmac/hyphenex.en
@@ -0,0 +1,115 @@
+% Hyphenation exceptions for US English,
+% based on hyphenation exception log articles in TUGboat.
+%
+% Copyright 2008 TeX Users Group.
+% You may freely use, modify and/or distribute this file.
+%
+% Stripped down by the GNU roff project to only include the patterns
+% that hyphenate differently when using the hyph-utf8 project's
+% hyph-en-us.tex file (version 2005-05-30).
+%
+% Please contact the TUGboat editorial staff <tugboat@tug.org>
+% for corrections and omissions.
+%
+\hyphenation{
+ anti-deriv-a-tive
+ anti-deriv-a-tives
+ bathy-scaphe
+ co-designer
+ co-designers
+ electro-mechan-i-cal
+ electro-mechano-acoustic
+ fluoro-car-bon
+ free-loaders
+ grand-uncle
+ grand-uncles
+ griev-ances
+ ignore-spaces
+ im-ped-ances
+ input-enc
+ line-spacing
+ meta-stable
+ meta-table
+ meta-tables
+ micro-eco-nomic
+ micro-eco-nomics
+ micro-econ-omy
+ micro-en-ter-prise
+ micro-en-ter-prises
+ micro-organ-ism
+ micro-organ-isms
+ mid-after-noon
+ mine-sweepers
+ mono-spacing
+ nitro-meth-ane
+ non-euclid-ean
+ ortho-nitro-toluene
+ para-di-methyl-benzene
+ para-fluoro-toluene
+ phe-nol-phthalein
+ phtha-lam-ic
+ phthal-ate
+ phthi-sis
+ pre-proces-sor
+ pre-proces-sors
+ re-imple-ment
+ re-imple-ments
+ re-imple-mented
+ re-imple-men-ta-tion
+ ring-leaders
+ round-table
+ round-tables
+ single-space
+ single-spaced
+ single-spacing
+ sky-scrapers
+ sports-writers
+ sub-tables
+ super-deri-va-tion
+ super-deri-va-tions
+ super-ego
+ super-egos
+ waste-water
+ Bembo
+ Chiang
+ Cohen
+ Duane
+ Engle
+ Engel
+ Hibbs
+ Hoek-water
+ Huber
+ Image-Magick
+ Krishna
+ Krish-na-ism
+ Krish-nan
+ Le-gendre
+ Lucas
+ MacBeth
+ Nietz-sche
+ Noord-wijker-hout
+ Open-Office
+ Pres-by-terian
+ Pres-by-terians
+ Pyong-yang
+ Ra-dha-krish-nan
+ Ravi-kumar
+ Reich-lin
+ Schwert
+ Skoup
+ Thiruv-ananda-puram
+ Vieth
+ viiith
+ viith
+ xviiith
+ xviith
+ xxiiird
+ xxiind
+ Ying-yong Shu-xue Ji-suan
+}
+% Here's an erratum from the aforementioned hyph-en-us.tex.
+\hyphenation{
+ dem-o-crat
+}
+
+% EOF
diff --git a/tmac/hyphenex.pl b/tmac/hyphenex.pl
new file mode 100644
index 0000000..aee5845
--- /dev/null
+++ b/tmac/hyphenex.pl
@@ -0,0 +1,91 @@
+#! /usr/bin/env perl
+#
+#
+# hyphenex.pl
+#
+# This small filter converts a hyphenation exception log article for
+# TUGBoat to a real \hyphenation block.
+#
+# Written by Werner Lemberg <wl@gnu.org>.
+#
+# Version 1.2 (2007/11/16)
+#
+# Public domain.
+#
+#
+# Usage:
+#
+# [perl] hyphenex.pl < tugboat-article > hyphenation-exceptions
+
+# print header
+print "% Hyphenation exceptions for US English,\n";
+print "% based on hyphenation exception log articles in TUGboat.\n";
+print "%\n";
+print "% Copyright 2007 TeX Users Group.\n";
+print "% You may freely use, modify and/or distribute this file.\n";
+print "%\n";
+print "% This is an automatically generated file. Do not edit!\n";
+print "%\n";
+print "% Please contact the TUGboat editorial staff <tugboat\@tug.org>\n";
+print "% for corrections and omissions.\n";
+print "\n";
+print "\\hyphenation{\n";
+
+unshift @ARGV, '-' unless @ARGV;
+foreach my $filename (@ARGV) {
+ my $input;
+ if ($filename eq '-') {
+ $input = \*STDIN;
+ } elsif (not open $input, '<', $filename) {
+ warn $!;
+ next;
+ }
+ while (<$input>) {
+ # retain only lines starting with \1 ... \6 or \tabalign
+ next if not (m/^\\[123456]/ || m/^\\tabalign/);
+ # remove final newline
+ chop;
+ # remove all TeX commands except \1 ... \6
+ s/\\[^123456\s{]+//g;
+ # remove all paired { ... }
+ 1 while s/{(.*?)}/\1/g;
+ # skip lines which now have only whitespace before '&'
+ next if m/^\s*&/;
+ # remove comments
+ s/%.*//;
+ # remove trailing whitespace
+ s/\s*$//;
+ # remove trailing '*' (used as a marker in the document)
+ s/\*$//;
+ # split at whitespace
+ @field = split(' ');
+ if ($field[0] eq "\\1" || $field[0] eq "\\4") {
+ print " $field[2]\n";
+ }
+ elsif ($field[0] eq "\\2" || $field[0] eq "\\5") {
+ print " $field[2]\n";
+ # handle multiple suffixes separated by commata
+ @suffix_list = split(/,/, "$field[3]");
+ foreach $suffix (@suffix_list) {
+ print " $field[2]$suffix\n";
+ }
+ }
+ elsif ($field[0] eq "\\3" || $field[0] eq "\\6") {
+ # handle multiple suffixes separated by commata
+ @suffix_list = split(/,/, "$field[3],$field[4]");
+ foreach $suffix (@suffix_list) {
+ print " $field[2]$suffix\n";
+ }
+ }
+ else {
+ # for '&', split at '&' with trailing whitespace
+ @field = split(/&\s*/);
+ print " $field[1]\n";
+ }
+ }
+}
+
+# print trailer
+print "}\n";
+print "\n";
+print "% EOF\n";
diff --git a/tmac/it.tmac b/tmac/it.tmac
new file mode 100644
index 0000000..0cec529
--- /dev/null
+++ b/tmac/it.tmac
@@ -0,0 +1,194 @@
+.\" Italian localization for groff
+.\"
+.\" Copyright (C) 2021-2022 Free Software Foundation, Inc.
+.\" Written by Edmond Orignac (edmond.orignac@wanadoo.fr)
+.\"
+.\" 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 3 of the License, 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 this program. If not, see
+.\" <http://www.gnu.org/licenses/>.
+.\"
+.\" Please send comments/corrections to edmond.orignac@wanadoo.fr.
+.
+.do nr *groff_it_tmac_C \n[.cp]
+.cp 0
+.
+.
+.\" If changing from an existing locale, we need to preserve the state
+.\" of the "suppress hyphenation before a page location trap" bit.
+.nr locale*use-trap-hyphenation-mode 0
+.if d locale \
+. if \n[.hy]=\n[\*[locale]*hyphenation-mode-trap] \
+. nr locale*use-trap-hyphenation-mode 1
+.
+.
+.ds locale italian\"
+.
+.
+.\" Predefined text translations
+.
+.ds \*[locale]-abstract RIASSUNTO\"
+.ds \*[locale]-app ALLEGATO\"
+.ds \*[locale]-appendix_string Appendice\"
+.ds \*[locale]-april Aprile\"
+.ds \*[locale]-attribute_string da\"
+.ds \*[locale]-august Agosto\"
+.ds \*[locale]-chapter_string Capitolo\"
+.ds \*[locale]-december Dicembre\"
+.ds \*[locale]-draft_string Brutta Copia\"
+.ds \*[locale]-endnote_string ANNOTAZIONI\"
+.ds \*[locale]-february Febbraio\"
+.ds \*[locale]-finis_string FINE\"
+.ds \*[locale]-friday Venerd\[i `]\"
+.ds \*[locale]-january Gennaio\"
+.ds \*[locale]-july Luglio\"
+.ds \*[locale]-june Giugno\"
+.ds \*[locale]-le ELENCO DEI EQUAZIONI\"
+.ds \*[locale]-letapp LETTO E APPROVATO\"
+.ds \*[locale]-letat ALLA CORTESE ATTENZIONE DI:\"
+.ds \*[locale]-letcn CONFIDENZIALE\"
+.ds \*[locale]-letdate Data\"
+.ds \*[locale]-letfc Accolga, signore, l'espressione dei miei sentimenti pi\[u `] distinti.\"
+.ds \*[locale]-letns!0 Copia ad\"
+.ds \*[locale]-letns!1 Esemplare (con destinatario) a\"
+.ds \*[locale]-letns!10 Esemplare (con destinatarie) a\"
+.ds \*[locale]-letns!11 Esemplare (sin destinatarie) a\"
+.ds \*[locale]-letns!12 Riassunto ad\"
+.ds \*[locale]-letns!13 Promemoria completa ad\"
+.ds \*[locale]-letns!14 Cc:\"
+.ds \*[locale]-letns!2 Esemplare (sin destinatario) a\"
+.ds \*[locale]-letns!3 Destinatario\"
+.ds \*[locale]-letns!4 Destinatarie\"
+.ds \*[locale]-letns!5 Allegato\"
+.ds \*[locale]-letns!6 Allegati\"
+.ds \*[locale]-letns!7 In plico a parte\"
+.ds \*[locale]-letns!8 Lettere ad\"
+.ds \*[locale]-letns!9 Promemoria ad\"
+.ds \*[locale]-letns!copy Copia \" (a space is needed)\"
+.ds \*[locale]-letns!to ad\"
+.ds \*[locale]-letrn In relazione a:\"
+.ds \*[locale]-letsa A chiunque riguardate:\"
+.ds \*[locale]-letsj Soggetto:\"
+.ds \*[locale]-lf ELENCO DELLE FIGURE\"
+.ds \*[locale]-licon SOMMARIO\"
+.ds \*[locale]-liec Equatio\"
+.ds \*[locale]-liex Documento\"
+.ds \*[locale]-lifg Figura\"
+.ds \*[locale]-litb Tabella\"
+.ds \*[locale]-lt ELENCO DEI TABELLE\"
+.ds \*[locale]-lx ELENCO DEI DOCUMENTI\"
+.ds \*[locale]-man-section1 Manuale dei comandi generali\"
+.ds \*[locale]-man-section2 Manuale delle chiamate di sistema\"
+.ds \*[locale]-man-section3 Manuale delle funzioni di libreria\"
+.ds \*[locale]-man-section4 Manuale delle interfacce del kernel\"
+.ds \*[locale]-man-section5 Manuale dei formati di file\"
+.ds \*[locale]-man-section6 Manuale dei giochi\"
+.ds \*[locale]-man-section7 Manuale di informazioni varie\"
+.ds \*[locale]-man-section8 Manuale del gestore di sistema\"
+.ds \*[locale]-man-section9 Manuale dello sviluppatore del kernel\"
+.ds \*[locale]-march Marzo\"
+.ds \*[locale]-may Maggio\"
+.ds \*[locale]-monday Luned\[i `]\"
+.ds \*[locale]-november Novembre\"
+.ds \*[locale]-october Ottobre\"
+.ds \*[locale]-paper A4\"
+.ds \*[locale]-qrf Cf. capitulo \\*[Qrfh], pagina \\*[Qrfp].\"
+.ds \*[locale]-references Bibliografia\"
+.ds \*[locale]-revision_string Revisione\"
+.ds \*[locale]-rp BIBLIOGRAFIA\"
+.ds \*[locale]-saturday Sabato\"
+.ds \*[locale]-september Settembre\"
+.ds \*[locale]-sunday Domenica\"
+.ds \*[locale]-thursday Gioved\[i `]\"
+.ds \*[locale]-toc Indice\"
+.ds \*[locale]-toc_header_string Indice\"
+.ds \*[locale]-tuesday Marted\[i `]\"
+.ds \*[locale]-wednesday Mercoled\[i `]\"
+.
+.
+.\" Activate the translations
+.
+.mso trans.tmac
+.
+.
+.\" ms package
+.if r GS \{\
+. \" update the date
+. ds DY \n[dy] \*[MO] \n[year]
+. \" set hyphenation flags
+. nr HY 2
+.\}
+.
+.
+.\" mm package
+.if d PH \{\
+. \" update the date with the new strings
+. ds cov*new-date \\n[dy] \\*[MO\\n[mo]] \\n[year]
+.
+. \" ISODATE and DT update
+. de ISODATE
+. 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 \\n[dy] \\*[MO\\n[mo]] \\n[year]
+. el \
+. ds cov*new-date \\n[year]-\\n[cov*mm]-\\n[cov*dd]
+. .
+.
+. als DT cov*new-date
+.\}
+.
+.
+.ss 12 0
+.
+.\" Set up hyphenation.
+.
+.\" Italian hyphenation (\lefthyphenmin=2, \righthyphenmin=2)
+.nr \*[locale]*hyphenation-mode-base 1
+.nr \*[locale]*hyphenation-mode-trap 2
+.
+.ie \n[locale*use-trap-hyphenation-mode] \
+. hy \n[\*[locale]*hyphenation-mode-trap]
+.el \
+. hy \n[\*[locale]*hyphenation-mode-base]
+.
+.rr locale*use-trap-hyphenation-mode
+.
+.hla it
+.hpf hyphen.it
+.
+.
+.\" man package
+.if d an \
+. an*reset-hyphenation-mode
+.
+.
+.\" me package
+.if d @R \{\
+. ds _td_format \En(dy \E*(mo \En(y4
+. ld
+.\}
+.
+.
+.cp \n[*groff_it_tmac_C]
+.do rr *groff_it_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" coding: latin-1
+.\" fill-column: 72
+.\" End:
+.\" vim: set fileencoding=iso-8859-1 filetype=groff textwidth=72:
diff --git a/tmac/ja.tmac b/tmac/ja.tmac
new file mode 100644
index 0000000..4b1db08
--- /dev/null
+++ b/tmac/ja.tmac
@@ -0,0 +1,62 @@
+.\" Japanese localization for groff
+.\"
+.\" Copyright (C) 2009-2020 Free Software Foundation, Inc.
+.\" Written by Fumitoshi UKAI <ukai@debian.or.jp> and
+.\" Colin Watson <cjwatson@debian.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 3 of the License, 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 this program. If not, see
+.\" <http://www.gnu.org/licenses/>.
+.\"
+.\" Please send comments to groff@gnu.org.
+.
+.do nr *groff_ja_tmac_C \n[.cp]
+.cp 0
+.
+.
+.ds locale japanese\"
+.
+.
+.class [CJKprepunct] \
+ , : ; > } \
+ \[u3001] \[u3002] \[uFF0C] \[uFF0E] \[u30FB] \[uFF1A] \[uFF1B] \[uFF1F] \
+ \[uFF01] \[uFF09] \[u3015] \[uFF3D] \[uFF5D] \[u300D] \[u300F] \[u3011] \
+ \[u3041] \[u3043] \[u3045] \[u3047] \[u3049] \[u3063] \[u3083] \[u3085] \
+ \[u3087] \[u30FC] \
+ \[u30A1] \[u30A3] \[u30A5] \[u30A7] \[u30A9] \[u30C3] \[u30E3] \[u30E5] \
+ \[u30E7]
+.class [CJKpostpunct] \
+ \[uFF08] \[u3014] \[uFF3B] \[uFF5B] \[u300C] \[u300E] \[u3010]
+.
+.\" Hiragana, Katakana, and Kanji glyphs.
+.class [CJKnormal] \
+ \[u3041]-\[u3096] \[u30A0]-\[u30FF] \[u4E00]-\[u9FFF]
+.
+.cflags 128 \C'[CJKprepunct]'
+.cflags 266 \C'[CJKpostpunct]'
+.cflags 512 \C'[CJKnormal]'
+.
+.\" Japanese hyphenation (disabled)
+.nr \*[locale]*hyphenation-mode-base 0
+.nr \*[locale]*hyphenation-mode-trap 0
+.
+.cp \n[*groff_ja_tmac_C]
+.do rr *groff_ja_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/latin1.tmac b/tmac/latin1.tmac
new file mode 100644
index 0000000..3dff03b
--- /dev/null
+++ b/tmac/latin1.tmac
@@ -0,0 +1,114 @@
+.\" latin1.tmac
+.\"
+.do nr *groff_latin1_tmac_C \n[.cp]
+.cp 0
+.\" 0xA0
+.\" char160 (no-break space) is translated on input
+.trin \[char161]\[r!]
+.trin \[char162]\[ct]
+.trin \[char163]\[Po]
+.trin \[char164]\[Cs]
+.trin \[char165]\[Ye]
+.trin \[char166]\[bb]
+.trin \[char167]\[sc]
+.trin \[char168]\[ad]
+.trin \[char169]\[co]
+.trin \[char170]\[Of]
+.trin \[char171]\[Fo]
+.trin \[char172]\[tno]
+.\" char173 (soft hyphen) is translated on input
+.trin \[char174]\[rg]
+.trin \[char175]\[a-]
+.\" 0xB0
+.trin \[char176]\[de]
+.trin \[char177]\[t+-]
+.trin \[char178]\[S2]
+.trin \[char179]\[S3]
+.trin \[char180]\[aa]
+.trin \[char181]\[mc]
+.trin \[char182]\[ps]
+.trin \[char183]\[pc]
+.trin \[char184]\[ac]
+.trin \[char185]\[S1]
+.trin \[char186]\[Om]
+.trin \[char187]\[Fc]
+.trin \[char188]\[14]
+.trin \[char189]\[12]
+.trin \[char190]\[34]
+.trin \[char191]\[r?]
+.\" 0xC0
+.trin \[char192]\[`A]
+.trin \[char193]\['A]
+.trin \[char194]\[^A]
+.trin \[char195]\[~A]
+.trin \[char196]\[:A]
+.trin \[char197]\[oA]
+.trin \[char198]\[AE]
+.trin \[char199]\[,C]
+.trin \[char200]\[`E]
+.trin \[char201]\['E]
+.trin \[char202]\[^E]
+.trin \[char203]\[:E]
+.trin \[char204]\[`I]
+.trin \[char205]\['I]
+.trin \[char206]\[^I]
+.trin \[char207]\[:I]
+.\" 0xD0
+.trin \[char208]\[-D]
+.trin \[char209]\[~N]
+.trin \[char210]\[`O]
+.trin \[char211]\['O]
+.trin \[char212]\[^O]
+.trin \[char213]\[~O]
+.trin \[char214]\[:O]
+.trin \[char215]\[tmu]
+.trin \[char216]\[/O]
+.trin \[char217]\[`U]
+.trin \[char218]\['U]
+.trin \[char219]\[^U]
+.trin \[char220]\[:U]
+.trin \[char221]\['Y]
+.trin \[char222]\[TP]
+.trin \[char223]\[ss]
+.\" 0xE0
+.trin \[char224]\[`a]
+.trin \[char225]\['a]
+.trin \[char226]\[^a]
+.trin \[char227]\[~a]
+.trin \[char228]\[:a]
+.trin \[char229]\[oa]
+.trin \[char230]\[ae]
+.trin \[char231]\[,c]
+.trin \[char232]\[`e]
+.trin \[char233]\['e]
+.trin \[char234]\[^e]
+.trin \[char235]\[:e]
+.trin \[char236]\[`i]
+.trin \[char237]\['i]
+.trin \[char238]\[^i]
+.trin \[char239]\[:i]
+.\" 0xF0
+.trin \[char240]\[Sd]
+.trin \[char241]\[~n]
+.trin \[char242]\[`o]
+.trin \[char243]\['o]
+.trin \[char244]\[^o]
+.trin \[char245]\[~o]
+.trin \[char246]\[:o]
+.trin \[char247]\[tdi]
+.trin \[char248]\[/o]
+.trin \[char249]\[`u]
+.trin \[char250]\['u]
+.trin \[char251]\[^u]
+.trin \[char252]\[:u]
+.trin \[char253]\['y]
+.trin \[char254]\[Tp]
+.trin \[char255]\[:y]
+.cp \n[*groff_latin1_tmac_C]
+.do rr *groff_latin1_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/latin2.tmac b/tmac/latin2.tmac
new file mode 100644
index 0000000..f73f4e8
--- /dev/null
+++ b/tmac/latin2.tmac
@@ -0,0 +1,242 @@
+.\" latin2.tmac
+.\"
+.do nr *groff_latin2_tmac_C \n[.cp]
+.cp 0
+.
+.if '\*[.T]'latin1' \{\
+.\" Replace characters that ISO Latin-1 has but Latin-2 doesn't.
+.char \[r!] \ \" space
+.char \[ct] \ \" space
+.char \[Po] \ \" space
+.char \[Ye] \ \" space
+.char \[bb] \ \" space
+.char \[co] \ \" space
+.char \[Of] \ \" space
+.char \[Fo] \ \" space
+.char \[no] \ \" space
+.char \[rg] \ \" space
+.char \[a-] \ \" space
+.char \[+-] \ \" space
+.char \[S2] \ \" space
+.char \[S3] \ \" space
+.char \[mc] \ \" space
+.char \[ps] \ \" space
+.char \[pc] \ \" space
+.char \[S1] \ \" space
+.char \[Om] \ \" space
+.char \[Fc] \ \" space
+.char \[14] 1/4
+.char \[12] 1/2
+.char \[34] 3/4
+.char \[r?] \ \" space
+.char \[`A] A
+.char \[~A] A
+.char \[oA] A
+.char \[AE] AE
+.char \[`E] E
+.char \[^E] E
+.char \[`I] I
+.char \[:I] I
+.char \[-D] \ \" space
+.char \[~N] N
+.char \[`O] O
+.char \[~O] O
+.char \[/O] O
+.char \[`U] U
+.char \[^U] U
+.char \[TP] \ \" space
+.char \[`a] a
+.char \[~a] a
+.char \[oa] A
+.char \[ae] ae
+.char \[`e] e
+.char \[^e] e
+.char \[`i] i
+.char \[:i] i
+.char \[Sd] \ \" space
+.char \[~n] n
+.char \[`o] o
+.char \[~o] o
+.char \[/o] o
+.char \[`u] u
+.char \[^u] u
+.char \[tp] \ \" space
+.char \[:y] y
+.\" Map characters that ISO Latin-2 has and Latin-1 doesn't to their
+.\" numeric code points.
+.\" 0xA0
+.char \[A ho] \N'161'
+.char \[ab] \N'162'
+.char \[/L] \N'163'
+.char \[L ah] \N'165'
+.char \[S aa] \N'166'
+.char \[vS] \N'169'
+.char \[S ac] \N'170'
+.char \[T ah] \N'171'
+.char \[Z aa] \N'172'
+.char \[vZ] \N'174'
+.char \[Z a.] \N'175'
+.\" 0xB0
+.char \[a ho] \N'177'
+.char \[ho] \N'178'
+.char \[/l] \N'179'
+.char \[l ah] \N'181'
+.char \[s aa] \N'182'
+.char \[ah] \N'183'
+.char \[vs] \N'185'
+.char \[s ac] \N'186'
+.char \[t ah] \N'187'
+.char \[z aa] \N'188'
+.char \[a"] \N'189'
+.char \[vz] \N'190'
+.char \[z a.] \N'191'
+.\" 0xC0
+.char \[R aa] \N'192'
+.char \[A ab] \N'195'
+.char \[L aa] \N'197'
+.char \[C aa] \N'198'
+.char \[C ah] \N'200'
+.char \[E ho] \N'202'
+.char \[E ah] \N'204'
+.char \[D ah] \N'207'
+.\" 0xD0
+.char \[u0110] \N'208'
+.char \[N aa] \N'209'
+.char \[N ah] \N'210'
+.char \[O a"] \N'213'
+.char \[R ah] \N'216'
+.char \[U ao] \N'217'
+.char \[U a"] \N'219'
+.char \[T ac] \N'222'
+.\" 0xE0
+.char \[r aa] \N'224'
+.char \[a ab] \N'227'
+.char \[l aa] \N'229'
+.char \[c aa] \N'230'
+.char \[c ah] \N'232'
+.char \[e ho] \N'234'
+.char \[e ah] \N'236'
+.char \[d ah] \N'239'
+.\" OxF0
+.char \[u0111] \N'240'
+.char \[n aa] \N'241'
+.char \[n ah] \N'242'
+.char \[o a"] \N'245'
+.char \[r ah] \N'248'
+.char \[u ao] \N'249'
+.char \[u a"] \N'251'
+.char \[t ac] \N'254'
+.char \[a.] \N'255'
+.\} \" using -Tlatin1
+.
+.\" Translate eight-bit input characters.
+.\" 0xA0
+.\" char160 (no-break space) is translated on input
+.trin \[char161]\[A ho]
+.trin \[char162]\[ab]
+.trin \[char163]\[/L]
+.trin \[char164]\[Cs]
+.trin \[char165]\[L ah]
+.trin \[char166]\[S aa]
+.trin \[char167]\[sc]
+.trin \[char168]\[ad]
+.trin \[char169]\[vS]
+.trin \[char170]\[S ac]
+.trin \[char171]\[T ah]
+.trin \[char172]\[Z aa]
+.\" char173 (soft hyphen) is translated on input
+.trin \[char174]\[vZ]
+.trin \[char175]\[Z a.]
+.\" 0xB0
+.trin \[char176]\[de]
+.trin \[char177]\[a ho]
+.trin \[char178]\[ho]
+.trin \[char179]\[/l]
+.trin \[char180]\[aa]
+.trin \[char181]\[l ah]
+.trin \[char182]\[s aa]
+.trin \[char183]\[ah]
+.trin \[char184]\[ac]
+.trin \[char185]\[vs]
+.trin \[char186]\[s ac]
+.trin \[char187]\[t ah]
+.trin \[char188]\[z aa]
+.trin \[char189]\[a"]
+.trin \[char190]\[vz]
+.trin \[char191]\[z a.]
+.\" C0
+.trin \[char192]\[R aa]
+.trin \[char193]\['A]
+.trin \[char194]\[^A]
+.trin \[char195]\[A ab]
+.trin \[char196]\[:A]
+.trin \[char197]\[L aa]
+.trin \[char198]\[C aa]
+.trin \[char199]\[,C]
+.trin \[char200]\[C ah]
+.trin \[char201]\['E]
+.trin \[char202]\[E ho]
+.trin \[char203]\[:E]
+.trin \[char204]\[E ah]
+.trin \[char205]\['I]
+.trin \[char206]\[^I]
+.trin \[char207]\[D ah]
+.\" 0xD0
+.trin \[char208]\[u0110]
+.trin \[char209]\[N aa]
+.trin \[char210]\[N ah]
+.trin \[char211]\['O]
+.trin \[char212]\[^O]
+.trin \[char213]\[O a"]
+.trin \[char214]\[:O]
+.trin \[char215]\[tmu]
+.trin \[char216]\[R ah]
+.trin \[char217]\[U ao]
+.trin \[char218]\['U]
+.trin \[char219]\[U a"]
+.trin \[char220]\[:U]
+.trin \[char221]\['Y]
+.trin \[char222]\[T ac]
+.trin \[char223]\[ss]
+.\" 0xE0
+.trin \[char224]\[r aa]
+.trin \[char225]\['a]
+.trin \[char226]\[^a]
+.trin \[char227]\[a ab]
+.trin \[char228]\[:a]
+.trin \[char229]\[l aa]
+.trin \[char230]\[c aa]
+.trin \[char231]\[,c]
+.trin \[char232]\[c ah]
+.trin \[char233]\['e]
+.trin \[char234]\[e ho]
+.trin \[char235]\[:e]
+.trin \[char236]\[e ah]
+.trin \[char237]\['i]
+.trin \[char238]\[^i]
+.trin \[char239]\[d ah]
+.\" 0xF0
+.trin \[char240]\[u0111]
+.trin \[char241]\[n aa]
+.trin \[char242]\[n ah]
+.trin \[char243]\['o]
+.trin \[char244]\[^o]
+.trin \[char245]\[o a"]
+.trin \[char246]\[:o]
+.trin \[char247]\[tdi]
+.trin \[char248]\[r ah]
+.trin \[char249]\[u ao]
+.trin \[char250]\['u]
+.trin \[char251]\[u a"]
+.trin \[char252]\[:u]
+.trin \[char253]\['y]
+.trin \[char254]\[t ac]
+.trin \[char255]\[a.]
+.cp \n[*groff_latin2_tmac_C]
+.do rr *groff_latin2_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/latin5.tmac b/tmac/latin5.tmac
new file mode 100644
index 0000000..63a4871
--- /dev/null
+++ b/tmac/latin5.tmac
@@ -0,0 +1,134 @@
+.\" latin5.tmac
+.\"
+.do nr *groff_latin5_tmac_C \n[.cp]
+.cp 0
+.
+.if '\*[.T]'latin1' \{\
+.\" Replace characters that ISO Latin-1 has but Latin-5 doesn't.
+.char \[-D] \ \" space
+.char \[Sd] \ \" space
+.char \[TP] \ \" space
+.char \[Tp] \ \" space
+.char \['Y] Y
+.char \['y] y
+.\" Map characters that ISO Latin-5 has and Latin-1 doesn't to their
+.\" numeric code points.
+.char \[G ab] \N'208'
+.char \[g ab] \N'240'
+.char \[u0130] \N'221'
+.char \[.i] \N'253'
+.char \[S ac] \N'222'
+.char \[s ac] \N'254'
+.\} \" using -Tlatin1
+.
+.\" Translate eight-bit input characters.
+.\" 0xA0
+.\" char160 (no-break space) is translated on input
+.trin \[char161]\[r!]
+.trin \[char162]\[ct]
+.trin \[char163]\[Po]
+.trin \[char164]\[Cs]
+.trin \[char165]\[Ye]
+.trin \[char166]\[bb]
+.trin \[char167]\[sc]
+.trin \[char168]\[ad]
+.trin \[char169]\[co]
+.trin \[char170]\[Of]
+.trin \[char171]\[Fo]
+.trin \[char172]\[tno]
+.\" char173 (soft hyphen) is translated on input
+.trin \[char174]\[rg]
+.trin \[char175]\[a-]
+.\" 0xB0
+.trin \[char176]\[de]
+.trin \[char177]\[t+-]
+.trin \[char178]\[S2]
+.trin \[char179]\[S3]
+.trin \[char180]\[aa]
+.trin \[char181]\[mc]
+.trin \[char182]\[ps]
+.trin \[char183]\[pc]
+.trin \[char184]\[ac]
+.trin \[char185]\[S1]
+.trin \[char186]\[Om]
+.trin \[char187]\[Fc]
+.trin \[char188]\[14]
+.trin \[char189]\[12]
+.trin \[char190]\[34]
+.trin \[char191]\[r?]
+.\" 0xC0
+.trin \[char192]\[`A]
+.trin \[char193]\['A]
+.trin \[char194]\[^A]
+.trin \[char195]\[~A]
+.trin \[char196]\[:A]
+.trin \[char197]\[oA]
+.trin \[char198]\[AE]
+.trin \[char199]\[,C]
+.trin \[char200]\[`E]
+.trin \[char201]\['E]
+.trin \[char202]\[^E]
+.trin \[char203]\[:E]
+.trin \[char204]\[`I]
+.trin \[char205]\['I]
+.trin \[char206]\[^I]
+.trin \[char207]\[:I]
+.\" 0xD0
+.trin \[char208]\[G ab]
+.trin \[char209]\[~N]
+.trin \[char210]\[`O]
+.trin \[char211]\['O]
+.trin \[char212]\[^O]
+.trin \[char213]\[~O]
+.trin \[char214]\[:O]
+.trin \[char215]\[tmu]
+.trin \[char216]\[/O]
+.trin \[char217]\[`U]
+.trin \[char218]\['U]
+.trin \[char219]\[^U]
+.trin \[char220]\[:U]
+.trin \[char221]\[I .]
+.trin \[char222]\[S ,]
+.trin \[char223]\[ss]
+.\" 0xE0
+.trin \[char224]\[`a]
+.trin \[char225]\['a]
+.trin \[char226]\[^a]
+.trin \[char227]\[~a]
+.trin \[char228]\[:a]
+.trin \[char229]\[oa]
+.trin \[char230]\[ae]
+.trin \[char231]\[,c]
+.trin \[char232]\[`e]
+.trin \[char233]\['e]
+.trin \[char234]\[^e]
+.trin \[char235]\[:e]
+.trin \[char236]\[`i]
+.trin \[char237]\['i]
+.trin \[char238]\[^i]
+.trin \[char239]\[:i]
+.\" 0xF0
+.trin \[char240]\[g ab]
+.trin \[char241]\[~n]
+.trin \[char242]\[`o]
+.trin \[char243]\['o]
+.trin \[char244]\[^o]
+.trin \[char245]\[~o]
+.trin \[char246]\[:o]
+.trin \[char247]\[tdi]
+.trin \[char248]\[/o]
+.trin \[char249]\[`u]
+.trin \[char250]\['u]
+.trin \[char251]\[^u]
+.trin \[char252]\[:u]
+.trin \[char253]\[.i]
+.trin \[char254]\[s ,]
+.trin \[char255]\[:y]
+.cp \n[*groff_latin5_tmac_C]
+.do rr *groff_latin5_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/latin9.tmac b/tmac/latin9.tmac
new file mode 100644
index 0000000..1bedd45
--- /dev/null
+++ b/tmac/latin9.tmac
@@ -0,0 +1,138 @@
+.\" latin9.tmac
+.\"
+.do nr *groff_latin9_tmac_C \n[.cp]
+.cp 0
+.
+.if '\*[.T]'latin1' \{\
+.\" Replace characters that ISO Latin-1 has but Latin-9 doesn't.
+.char \[Cs] \ \" space
+.char \[bb] \ \" space
+.char \[ad] \ \" space
+.char \[aa] \ \" space
+.char \[ac] \ \" space
+.char \[12] 1/2
+.char \[14] 1/4
+.char \[34] 3/4
+.\" Map characters that ISO Latin-9 has and Latin-1 doesn't to their
+.\" numeric code points.
+.char \[Eu] \N'164'
+.char \[vS] \N'166'
+.char \[vs] \N'168'
+.char \[vZ] \N'180'
+.char \[vz] \N'184'
+.char \[OE] \N'188'
+.char \[oe] \N'189'
+.char \[:Y] \N'190'
+.\} \" using -Tlatin1
+.
+.\" Translate eight-bit input characters.
+.\" 0xA0
+.\" char160 (no-break space) is translated on input
+.trin \[char161]\[r!]
+.trin \[char162]\[ct]
+.trin \[char163]\[Po]
+.trin \[char164]\[Eu]
+.trin \[char165]\[Ye]
+.trin \[char166]\[vS]
+.trin \[char167]\[sc]
+.trin \[char168]\[vs]
+.trin \[char169]\[co]
+.trin \[char170]\[Of]
+.trin \[char171]\[Fo]
+.trin \[char172]\[tno]
+.\" char173 (soft hyphen) is translated on input
+.trin \[char174]\[rg]
+.trin \[char175]\[a-]
+.\" 0xB0
+.trin \[char176]\[de]
+.trin \[char177]\[t+-]
+.trin \[char178]\[S2]
+.trin \[char179]\[S3]
+.trin \[char180]\[vZ]
+.trin \[char181]\[mc]
+.trin \[char182]\[ps]
+.trin \[char183]\[pc]
+.trin \[char184]\[vz]
+.trin \[char185]\[S1]
+.trin \[char186]\[Om]
+.trin \[char187]\[Fc]
+.trin \[char188]\[OE]
+.trin \[char189]\[oe]
+.trin \[char190]\[:Y]
+.trin \[char191]\[r?]
+.\" 0xC0
+.trin \[char192]\[`A]
+.trin \[char193]\['A]
+.trin \[char194]\[^A]
+.trin \[char195]\[~A]
+.trin \[char196]\[:A]
+.trin \[char197]\[oA]
+.trin \[char198]\[AE]
+.trin \[char199]\[,C]
+.trin \[char200]\[`E]
+.trin \[char201]\['E]
+.trin \[char202]\[^E]
+.trin \[char203]\[:E]
+.trin \[char204]\[`I]
+.trin \[char205]\['I]
+.trin \[char206]\[^I]
+.trin \[char207]\[:I]
+.\" 0xD0
+.trin \[char208]\[-D]
+.trin \[char209]\[~N]
+.trin \[char210]\[`O]
+.trin \[char211]\['O]
+.trin \[char212]\[^O]
+.trin \[char213]\[~O]
+.trin \[char214]\[:O]
+.trin \[char215]\[tmu]
+.trin \[char216]\[/O]
+.trin \[char217]\[`U]
+.trin \[char218]\['U]
+.trin \[char219]\[^U]
+.trin \[char220]\[:U]
+.trin \[char221]\['Y]
+.trin \[char222]\[TP]
+.trin \[char223]\[ss]
+.\" 0xE0
+.trin \[char224]\[`a]
+.trin \[char225]\['a]
+.trin \[char226]\[^a]
+.trin \[char227]\[~a]
+.trin \[char228]\[:a]
+.trin \[char229]\[oa]
+.trin \[char230]\[ae]
+.trin \[char231]\[,c]
+.trin \[char232]\[`e]
+.trin \[char233]\['e]
+.trin \[char234]\[^e]
+.trin \[char235]\[:e]
+.trin \[char236]\[`i]
+.trin \[char237]\['i]
+.trin \[char238]\[^i]
+.trin \[char239]\[:i]
+.\" 0xF0
+.trin \[char240]\[Sd]
+.trin \[char241]\[~n]
+.trin \[char242]\[`o]
+.trin \[char243]\['o]
+.trin \[char244]\[^o]
+.trin \[char245]\[~o]
+.trin \[char246]\[:o]
+.trin \[char247]\[tdi]
+.trin \[char248]\[/o]
+.trin \[char249]\[`u]
+.trin \[char250]\['u]
+.trin \[char251]\[^u]
+.trin \[char252]\[:u]
+.trin \[char253]\['y]
+.trin \[char254]\[Tp]
+.trin \[char255]\[:y]
+.cp \n[*groff_latin9_tmac_C]
+.do rr *groff_latin9_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/lbp.tmac b/tmac/lbp.tmac
new file mode 100644
index 0000000..ad913a7
--- /dev/null
+++ b/tmac/lbp.tmac
@@ -0,0 +1,103 @@
+.\" -*- nroff -*-
+.\"
+.\" lbp.tmac
+.\"
+.do nr *groff_lbp_tmac_C \n[.cp]
+.cp 0
+.
+.ftr CW CR
+.ftr C CR
+.ftr CO CI
+.ftr H HR
+.ftr HO HI
+.ftr HX HBI
+.ftr Hr HNR
+.ftr Hi HNI
+.ftr Hb HNB
+.ftr Hx HNBI
+.ftr EBI EI
+.ftr CBI CI
+.
+.fchar \[fi] fi
+.fchar \[fl] fl
+.fchar \[ff] ff
+.fchar \[Fi] f\[fi]
+.fchar \[Fl] f\[fl]
+.fchar \[OE] OE
+.fchar \[oe] oe
+.fchar \[IJ] IJ
+.fchar \[ij] ij
+.fchar \[.i] i
+.fchar \[lq] ``
+.fchar \[rq] ''
+.fchar \[fo] \v'-.1m'\s-3<\s+3\v'+.1m'
+.fchar \[fc] \v'-.1m'\s-3>\s+3\v'+.1m'
+.fchar \[em] \v'-.25m'\h'.05m'\D'l .9m 0'
+.
+.char \[or] \h'.1m'\Z'\D'l 0 -.675m''\h'.1m'
+.
+.\" This is designed so that \[ul], \[rn], and \[br] form corners.
+.char \[br] \Z'\v'.25m'\D'R .04m -1m''
+.char \[rn] \Z'\v'-.77m'\D'R .54m .04m''\h'.5m'
+.char \[ul] \Z'\v'.23m'\D'R .54m .04m''\h'.5m'
+.
+.char \[ru] \Z'\v'-.02m'\D'R .54m .04m''\h'.5m'
+.
+.fchar \[|=] \v'.075m'\Z'\[mi]'\v'-.15m'\[ap]\v'.075m'
+.
+.de lbp-achar
+. \" Note that character definitions are always interpreted with
+. \" compatibility mode off.
+. fchar \\$1 \
+\\$3\
+\k[acc]\
+\h'(u;-\w'\\$2'-\w'\\$3'/2+\\En[skw]+(\w'x'*0)-\\En[skw])'\
+\v'(u;\w'x'*0+\\En[rst]+(\w'\\$3'*0)-\\En[rst])'\
+\\$2\
+\v'(u;\w'x'*0-\\En[rst]+(\w'\\$3'*0)+\\En[rst])'\
+\h'|\\En[acc]u'
+. hcode \\$1\\$4
+..
+.
+.lbp-achar \['A] \' A a
+.lbp-achar \[`A] \` A a
+.lbp-achar \[^A] ^ A a
+.lbp-achar \['C] \' C c
+.lbp-achar \['c] \' c c
+.lbp-achar \[`E] \` E e
+.lbp-achar \[:E] \[ad] E e
+.lbp-achar \[^E] ^ E e
+.lbp-achar "\[G ab]" \[ab] G g
+.lbp-achar "\[g ab]" \[ab] g g
+.lbp-achar \['I] \' I i
+.lbp-achar \[`I] \` I i
+.lbp-achar \[:I] \[ad] I i
+.lbp-achar \[^I] ^ I i
+.lbp-achar "\[I .]" \[a.] I i
+.lbp-achar \['O] \' O o
+.lbp-achar \[`O] \` O o
+.lbp-achar \[^O] ^ O o
+.lbp-achar \[~O] ~ O o
+.lbp-achar \[~o] ~ o o
+.lbp-achar \['U] \' U u
+.lbp-achar \[`U] \` U u
+.lbp-achar \[^U] ^ U u
+.lbp-achar \['Y] \' Y y
+.lbp-achar \['y] \' y y
+.lbp-achar \[:Y] \[ad] Y y
+.
+.fchar \[S ,] \o'S\[ac]'
+.hcode \[S ,]s
+.fchar \[s ,] \o's\[ac]'
+.hcode \[s ,]s
+.
+.mso latin1.tmac
+.
+.cp \n[*groff_lbp_tmac_C]
+.do rr *groff_lbp_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/lj4.tmac b/tmac/lj4.tmac
new file mode 100644
index 0000000..60c8c1a
--- /dev/null
+++ b/tmac/lj4.tmac
@@ -0,0 +1,41 @@
+.\" -*- nroff -*-
+.\"
+.\" lj4.tmac
+.\"
+.do nr *groff_lj4_tmac_C \n[.cp]
+.cp 0
+.
+.ftr CW CR
+.ftr C CR
+.ftr CX CBI
+.ftr H UR
+.ftr HR UR
+.ftr HB UB
+.ftr HBI UBI
+.ftr HI UI
+.ftr HO UI
+.ftr HX UBI
+.
+.char \[or] \h'.1m'\Z'\D'l 0 -.675m''\h'.1m'
+.
+.\" This is designed so that \[ul], \[rn], and \[br] form corners.
+.char \[br] \Z'\v'.25m'\D'R .04m -1m''
+.char \[rn] \Z'\v'-.77m'\D'R .54m .04m''\h'.5m'
+.char \[ul] \Z'\v'.23m'\D'R .54m .04m''\h'.5m'
+.
+.char \[ru] \Z'\v'-.02m'\D'R .54m .04m''\h'.5m'
+.
+.fchar \[OK] \s[\En[.s]*6u/10u]\[rs]\s[0]/
+.
+.fchar \[sqrtex] \[radicalex]
+.
+.mso latin1.tmac
+.
+.cp \n[*groff_lj4_tmac_C]
+.do rr *groff_lj4_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/man.local b/tmac/man.local
new file mode 100644
index 0000000..5daa507
--- /dev/null
+++ b/tmac/man.local
@@ -0,0 +1,31 @@
+.\" This file is loaded by an.tmac.
+.\"
+.\" Put local modifications to groff_man(7)'s behavior here.
+.\"
+.\" Change "0" to "1" to enable OSC 8 links on SGR-capable grotty(1)
+.\" output devices.
+.if !'\*[.T]'html' \
+. if !r U \
+. nr U 0
+.\"
+.\" "CW" is not a portable font name, but some man pages use it anyway.
+.\" Uncomment this to suppress warnings produced by such pages. This
+.\" test remaps the font to roman ("R") on nroff (terminal) devices. You
+.\" might prefer to remap it to bold ("B") instead.
+.\" .if n .ftr CW R
+.\"
+.\" A de facto standard URL format for man pages is recognized
+.\" everywhere except Apple, where different macOS applications expect
+.\" different formats.
+.\" 1: man:groff(1) -- package default
+.\" 2: x-man-page://1/groff -- macOS/Mac OS X since 10.3 (Panther)
+.\" 3: man:groff.1 -- Bwana (Mac OS X)
+.\" 4: x-man-doc://1/groff -- ManOpen (Mac OS X pre-2005)
+.\" Set this register to configure which the `MR` macro uses.
+.\" .nr an*MR-URL-format 1
+.\"
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/man.tmac b/tmac/man.tmac
new file mode 100644
index 0000000..b017e5a
--- /dev/null
+++ b/tmac/man.tmac
@@ -0,0 +1,5 @@
+.\" -*- nroff -*-
+.\"
+.\" man.tmac
+.\"
+.do mso an.tmac
diff --git a/tmac/man.ultrix b/tmac/man.ultrix
new file mode 100644
index 0000000..2af9789
--- /dev/null
+++ b/tmac/man.ultrix
@@ -0,0 +1,105 @@
+.\" -*- nroff -*-
+.\"
+.\" Install this as man.local if you're using Ultrix.
+.\" Ultrix specific additions to groff -man macros.
+.\" Written by James Clark from a specification by Martyn.Johnson@cl.cam.ac.uk.
+.\"
+.\" I1 and I2 are unimplemented.
+.de CT
+<CTRL/\\$1>
+..
+.de CW
+.ft CR
+..
+.de Ds
+.br
+.nf
+.ft R
+..
+.de De
+.ce 0
+.fi
+..
+.de EX
+.br
+.if \\n[.$] .in +(n;\\$1)
+.ft CR
+.nf
+..
+.de EE
+.fi
+.ft R
+.in \\n[an-margin]u
+..
+.de G
+.it 1 an-trap
+.ft H
+.if \\n[.$] \&\\$*
+..
+.de GL
+.it 1 an-trap
+.ft HI
+.if \\n[.$] \&\\$*
+..
+.if n .ig
+.de HB
+.ie \\n[.$] .ft HB
+.el \f[HB]\\$*\fP
+..
+.if t .ig
+.de HB
+.ie \\n[.$] .ul 999
+.el .ul
+\\$*
+..
+.als TB HB
+.de MS
+\&\f[CR]\\$1\fR(\\$2)\\$3
+..
+.de NT
+.br
+.ds an-note Note
+.ce 1
+.if \\n[.$] \{\
+. ie '\\$1'C' \{\
+. ce 99
+. if \\n[.$]>1 .ds an-note \\$2
+. \}
+. el \{\
+. ds an-note \\$1
+. if '\\$2'C' .ce 99
+. \}
+.\}
+.in \\n[an-margin]u+5n
+.ll \\n[LL]u-5n
+.sp .5v>?\n[.V]u
+\&\\*[an-note]
+.sp .5v>?\n[.V]u
+.
+..
+.de NE
+.ll \\n[LL]u
+.in \\n[an-margin]u
+.ce 0
+.sp .5v>?\n[.V]u
+..
+.de PN
+\&\f[CR]\\$1\fP\\$2
+..
+.de Pn
+.ie \\n(.$>1 \&\\$1\f[CR]\\$2\fP\\$3
+.el \&\f[CR]\\$1\fP\\$2
+..
+.de R
+.ft R
+.ul 0
+..
+.de RN
+<RETURN>
+..
+.de VS
+.if '\\$1'4' .mc \[br]
+..
+.de VE
+.mc
+..
diff --git a/tmac/mandoc.tmac b/tmac/mandoc.tmac
new file mode 100644
index 0000000..e0a1502
--- /dev/null
+++ b/tmac/mandoc.tmac
@@ -0,0 +1,5 @@
+.\" -*- nroff -*-
+.\"
+.\" mandoc.tmac
+.\"
+.do mso andoc.tmac
diff --git a/tmac/mdoc.local b/tmac/mdoc.local
new file mode 100644
index 0000000..94688ab
--- /dev/null
+++ b/tmac/mdoc.local
@@ -0,0 +1,15 @@
+.\" This file is loaded by mdoc.tmac.
+.\"
+.\" Put local modifications to groff_mdoc(7)'s behavior here.
+.\"
+.\" "CW" is not a portable font name, but some man pages use it anyway.
+.\" Uncomment this to suppress warnings produced by such pages. This
+.\" test remaps the font to roman ("R") on nroff (terminal) devices. You
+.\" might prefer to remap it to bold ("B") instead.
+.\" .if n .ftr CW R
+.\"
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/mdoc.tmac b/tmac/mdoc.tmac
new file mode 100644
index 0000000..2f18a0d
--- /dev/null
+++ b/tmac/mdoc.tmac
@@ -0,0 +1,5 @@
+.\" -*- nroff -*-
+.\"
+.\" mdoc.tmac
+.\"
+.do mso doc.tmac
diff --git a/tmac/mdoc/doc-common b/tmac/mdoc/doc-common
new file mode 100644
index 0000000..53a2565
--- /dev/null
+++ b/tmac/mdoc/doc-common
@@ -0,0 +1,1729 @@
+.\" Copyright (c) 1991, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in
+.\" the documentation and/or other materials provided with the
+.\" distribution.
+.\" 3. [Deleted. See
+.\" ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change]
+.\" 4. Neither the name of the University nor the names of its
+.\" contributors may be used to endorse or promote products derived
+.\" from this software without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS"
+.\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+.\" PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
+.\" CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)doc-common 8.1 (Berkeley) 06/08/93
+.
+.
+.\" Macro Identifiers. For each user macro a corresponding register
+.\" with the same name must exist. Its value must not be zero.
+.
+.nr %A 1
+.nr %B 1
+.nr %C 1
+.nr %D 1
+.nr %I 1
+.nr %J 1
+.nr %N 1
+.nr %O 1
+.nr %P 1
+.nr %Q 1
+.nr %R 1
+.nr %T 1
+.nr %U 1
+.nr %V 1
+.nr Ac 3
+.nr Ad 12n
+.nr An 12n
+.nr Ao 12n
+.nr Ap 2
+.nr Aq 12n
+.nr Ar 12n
+.nr At 1
+.nr Bc 3
+.nr Bf 8n\" ?
+.nr Bk 8n\" ?
+.nr Bl 1
+.nr Bo 12n
+.nr Bq 12n
+.nr Brc 3
+.nr Bro 12n
+.nr Brq 12n
+.nr Bsx 1
+.nr Bt 8n\" ?
+.nr Bx 1
+.nr Cd 12n
+.nr Cm 10n
+.nr D1 8n\" ?
+.nr Dc 3
+.nr Dl 8n\" ?
+.nr Dt 8n\" ?
+.nr Do 12n
+.nr Dq 12n
+.nr Ds 6n\" many manpages still use this as a -width value
+.nr Dv 12n
+.nr Dx 1
+.nr Ec 3
+.nr Ef 8n\" ?
+.nr Ek 8n\" ?
+.nr El 1
+.nr Em 10n
+.nr En 12n
+.nr Eo 12n
+.nr Eq 12n
+.nr Er 17n
+.nr Es 12n
+.nr Ev 15n
+.nr Ex 1
+.nr Fa 12n
+.nr Fc 3
+.nr Fd 12n\" ?
+.nr Fl 10n
+.nr Fn 16n
+.nr Fo 16n
+.nr Fr 12n\" ?
+.nr Ft 8n\" ?
+.nr Fx 1
+.nr Ic 10n
+.nr In 12n
+.nr It 8n\" ?
+.nr Lb 11n
+.nr Li 16n
+.nr Lk 6n\" ?
+.nr Lp 8n\" ?
+.nr Me 6n
+.nr Ms 6n
+.nr Mt 6n\" ?
+.nr Nd 8n\" ?
+.nr Nm 10n
+.nr No 12n
+.nr Ns 2
+.nr Nx 1
+.nr Oc 3
+.nr Oo 10n
+.nr Op 14n
+.nr Os 6n\" ?
+.nr Ox 1
+.nr Pa 32n
+.nr Pc 3
+.nr Pf 12n
+.nr Po 12n
+.nr Pp 8n\" ?
+.nr Pq 12n
+.nr Qc 3
+.nr Ql 16n
+.nr Qo 12n
+.nr Qq 12n
+.nr Rv 1
+.nr Sc 3
+.nr Sh 8n
+.nr Sm 8n\" ?
+.nr So 12n
+.nr Sq 12n
+.nr Ss 8n
+.nr St 8n\" ?
+.nr Sx 16n
+.nr Sy 6n
+.nr Ta 2
+.nr Tn 10n
+.nr Ud 8n\" ?
+.nr Ux 1
+.nr Va 12n
+.nr Vt 8n\" ?
+.nr Xc 3
+.nr Xo 1
+.nr Xr 10n
+.
+.
+.\" macros which must be processed after the closing delimiter of 'Op'
+.\" and friends
+.ds doc-after-Ao
+.ds doc-after-Bo
+.ds doc-after-Bro
+.ds doc-after-Do
+.ds doc-after-Eo
+.ds doc-after-Fo
+.ds doc-after-Ns
+.ds doc-after-Oo
+.ds doc-after-Po
+.ds doc-after-Qo
+.ds doc-after-So
+.ds doc-after-Xo
+.
+.
+.nr doc-display-indent 6n
+.
+.
+.\" space strings
+.
+.ds doc-soft-space " \"
+.ds doc-hard-space \~
+.ds doc-tab \t
+.
+.
+.\" punctuation values (suffix=3, prefix=4)
+.
+.nr doc-punct. 3
+.nr doc-punct, 3
+.nr doc-punct: 3
+.nr doc-punct; 3
+.nr doc-punct( 4
+.nr doc-punct) 3
+.nr doc-punct[ 4
+.nr doc-punct] 3
+.nr doc-punct? 3
+.nr doc-punct! 3
+.
+.
+.\" Define alternate requests to handle continuous rendering.
+.\"
+.\" This .ne replacement avoids page breaks; instead, the page length is
+.\" increased to the necessary amount (this is needed for tables).
+.
+.eo
+.de doc-ne
+. ie \n[.$] .nr doc-amount (v;\$*)
+. el .nr doc-amount 1v
+. if (\n[doc-amount] >= \n[.t]) \
+. pl +(\n[doc-amount]u - \n[.t]u + 1v)
+. rr doc-amount
+..
+.ec
+.
+.\" This .bp replacement for continuous rendering mode adjusts the page
+.\" length to the current position so that no empty lines are inserted.
+.
+.eo
+.de doc-bp
+. pl \n[nl]u
+..
+.ec
+.
+.
+.\" NS doc-set-up-continuous-rendering
+.\" Move macros into place for continuous rendering. An end-of-input
+.\" macro is set up by doc-set-up-titles.
+.de doc-set-up-continuous-rendering
+. rn ne doc-real-ne
+. rn bp doc-real-bp
+. rn doc-ne ne
+. rn doc-bp bp
+..
+.
+.if \n[cR] \
+. doc-set-up-continuous-rendering
+.
+.
+.\" header assembly macros
+.
+.\" NS doc-page-topic global string
+.\" NS the title of the manual page
+.
+.ds doc-page-topic UNTITLED\"
+.
+.
+.\" NS doc-volume global string
+.\" NS the volume to which the manual page belongs
+.
+.ds doc-volume LOCAL\"
+.
+.
+.\" NS doc-section global string
+.\" NS the manual section (1, 2, 3, ..., 3perl, 9)
+.
+.ds doc-section \" empty
+.
+.
+.\" NS doc-set-up-titles macro
+.\" NS install and initialize header and footer support
+.\" NS
+.\" NS local variables:
+.\" NS doc-footer-location
+.
+.eo
+.de doc-set-up-titles
+. br
+.
+. if !\n[cR] \{\
+. wh 0 doc-header
+. ie r FT .nr doc-footer-location \n[FT]
+. el .nr doc-footer-location (-.5i)
+. wh \n[doc-footer-location]u doc-footer
+. wh (\n[doc-footer-location]u - .5i) doc-break-body-text
+. rr doc-footer-location
+. \}
+.
+. e@ doc-end-macro
+..
+.ec
+.
+.
+.\" NS doc-date-string global string
+.\" NS the manual page date as set by 'Dd'
+.
+.ds doc-date-string UNDATED\"
+.
+.
+.\" NS Dd user macro (not parsed, not callable)
+.\" NS set document date
+.\" NS
+.\" NS modifies:
+.\" NS doc-date-string
+.\" NS
+.\" NS width register 'Dd' set above
+.
+.eo
+.de Dd
+. \" If batch processing (rendering multiple) man page documents, we
+. \" must handle the end of a previous document.
+. \"
+. \" If also continuously rendering, cause a page transition to a new
+. \" mdoc(7) document.
+. if \n[doc-need-titles-reset] \{\
+. if \n[cR] .doc-end-macro
+.
+. \" Clear the page header trap so it is not sprung with stale
+. \" information.
+. ch doc-header
+. doc-break-page-with-new-number
+. \}
+. if \n[C] .rr P
+.
+. if !\n[.$] \
+. tm mdoc warning: .Dd directive expects an argument (#\n[.c])
+. if \n[.$] \{\
+. ie "\$1"$Mdocdate:" .ds doc-date-string \$2\~\$3, \$4\"
+. el .ds doc-date-string \$*\"
+. \}
+..
+.ec
+.
+.
+.\" NS Dt user macro (not parsed, not callable)
+.\" NS document title
+.\" NS
+.\" NS modifies:
+.\" NS doc-page-topic
+.\" NS doc-section
+.\" NS doc-volume
+.\" NS
+.\" NS local variables:
+.\" NS doc-volume-as-XXX
+.\" NS doc-volume-ds-XXX
+.\" NS
+.\" NS width register 'Dt' set above
+.
+.\" an alternative, more detailed scheme for naming the manual sections
+.\"
+.ds doc-volume-ds-1 General Commands Manual
+.ds doc-volume-ds-2 System Calls Manual
+.ds doc-volume-ds-3 Library Functions Manual
+.ds doc-volume-ds-4 Kernel Interfaces Manual
+.ds doc-volume-ds-5 File Formats Manual
+.ds doc-volume-ds-6 Games Manual
+.ds doc-volume-ds-7 Miscellaneous Information Manual
+.ds doc-volume-ds-8 System Manager's Manual
+.ds doc-volume-ds-9 Kernel Developer's Manual
+.
+.ds doc-volume-ds-USD User's Supplementary Documents
+.ds doc-volume-ds-PS1 Programmer's Supplementary Documents
+.ds doc-volume-ds-AMD Ancestral Manual Documents
+.ds doc-volume-ds-SMM System Manager's Manual
+.ds doc-volume-ds-URM User's Reference Manual
+.ds doc-volume-ds-PRM Programmer's Manual
+.ds doc-volume-ds-KM Kernel Manual
+.ds doc-volume-ds-IND Manual Master Index
+.ds doc-volume-ds-LOCAL Local Manual
+.ds doc-volume-ds-CON Contributed Software Manual
+.
+.als doc-volume-ds-MMI doc-volume-ds-IND
+.als doc-volume-ds-LOC doc-volume-ds-LOCAL
+.
+.ds doc-volume-as-alpha alpha
+.als doc-volume-as-Alpha doc-volume-as-alpha
+.ds doc-volume-as-acorn26 acorn26
+.ds doc-volume-as-acorn32 acorn32
+.ds doc-volume-as-algor algor
+.ds doc-volume-as-amd64 amd64
+.ds doc-volume-as-amiga amiga
+.ds doc-volume-as-amigappc amigappc
+.ds doc-volume-as-arc arc
+.ds doc-volume-as-arm arm
+.ds doc-volume-as-arm26 arm26
+.ds doc-volume-as-arm32 arm32
+.ds doc-volume-as-armish armish
+.ds doc-volume-as-atari atari
+.ds doc-volume-as-aviion aviion
+.ds doc-volume-as-beagle beagle
+.ds doc-volume-as-bebox bebox
+.ds doc-volume-as-cats cats
+.ds doc-volume-as-cesfic cesfic
+.ds doc-volume-as-cobalt cobalt
+.ds doc-volume-as-dreamcast dreamcast
+.ds doc-volume-as-emips emips
+.ds doc-volume-as-evbarm evbarm
+.ds doc-volume-as-evbmips evbmips
+.ds doc-volume-as-evbppc evbppc
+.ds doc-volume-as-evbsh3 evbsh3
+.ds doc-volume-as-ews4800mips ews4800mips
+.ds doc-volume-as-hp300 hp300
+.ds doc-volume-as-hp700 hp700
+.ds doc-volume-as-hpcarm hpcarm
+.ds doc-volume-as-hpcmips hpcmips
+.ds doc-volume-as-hpcsh hpcsh
+.ds doc-volume-as-hppa hppa
+.ds doc-volume-as-hppa64 hppa64
+.ds doc-volume-as-i386 i386
+.ds doc-volume-as-ia64 ia64
+.ds doc-volume-as-ibmnws ibmnws
+.ds doc-volume-as-iyonix iyonix
+.ds doc-volume-as-landisk landisk
+.ds doc-volume-as-loongson loongson
+.ds doc-volume-as-luna68k luna68k
+.ds doc-volume-as-luna88k luna88k
+.ds doc-volume-as-m68k m68k
+.ds doc-volume-as-mac68k mac68k
+.ds doc-volume-as-macppc macppc
+.ds doc-volume-as-mips mips
+.ds doc-volume-as-mips64 mips64
+.ds doc-volume-as-mipsco mipsco
+.ds doc-volume-as-mmeye mmeye
+.ds doc-volume-as-mvme68k mvme68k
+.ds doc-volume-as-mvme88k mvme88k
+.ds doc-volume-as-mvmeppc mvmeppc
+.ds doc-volume-as-netwinder netwinder
+.ds doc-volume-as-news68k news68k
+.ds doc-volume-as-newsmips newsmips
+.ds doc-volume-as-next68k next68k
+.ds doc-volume-as-ofppc ofppc
+.ds doc-volume-as-palm palm
+.ds doc-volume-as-pc532 pc532
+.ds doc-volume-as-playstation2 playstation2
+.ds doc-volume-as-pmax pmax
+.ds doc-volume-as-pmppc pmppc
+.ds doc-volume-as-powerpc powerpc
+.ds doc-volume-as-prep prep
+.ds doc-volume-as-rs6000 rs6000
+.ds doc-volume-as-sandpoint sandpoint
+.ds doc-volume-as-sbmips sbmips
+.ds doc-volume-as-sgi sgi
+.ds doc-volume-as-sgimips sgimips
+.ds doc-volume-as-sh3 sh3
+.ds doc-volume-as-shark shark
+.ds doc-volume-as-socppc socppc
+.ds doc-volume-as-solbourne solbourne
+.ds doc-volume-as-sparc sparc
+.ds doc-volume-as-sparc64 sparc64
+.ds doc-volume-as-sun2 sun2
+.ds doc-volume-as-sun3 sun3
+.ds doc-volume-as-tahoe tahoe
+.ds doc-volume-as-vax vax
+.ds doc-volume-as-x68k x68k
+.ds doc-volume-as-x86_64 x86_64
+.ds doc-volume-as-xen xen
+.ds doc-volume-as-zaurus zaurus
+.
+.eo
+.de Dt
+. if !\n[.$] \
+. tm mdoc warning: .Dt directive expects one or more arguments \
+(#\n[.c])
+. if !"\$1"" \
+. ds doc-page-topic "\$1
+.
+. if \n[CT] \
+. stringup doc-page-topic
+.
+. if !"\$2"" \{\
+. ds doc-section \$2
+. ie \B'\$2' \{\
+. if ((\$2 >= 1) & (\$2 <= 9)) \{\
+. ds doc-volume \" empty (not "LOCAL")
+. if \A'\$3' \{\
+. if d doc-volume-as-\$3 \
+. as doc-volume "\*[doc-volume-as-\$3]
+. \}
+. as doc-volume " \*[doc-volume-ds-\$2]
+. \}
+. \}
+. el \{\
+. ie "\$2"unass" \
+. ds doc-volume DRAFT
+. el \{ .ie "\$2"draft" \
+. ds doc-volume DRAFT
+. el .if "\$2"paper" \
+. ds doc-volume UNTITLED
+. \}
+. \}
+. if \A'\$3' \{\
+. if d doc-volume-ds-\$3 \
+. ds doc-volume "\*[doc-volume-ds-\$3]
+. \}
+. \}
+.
+. if !"\$3"" \
+. if "\*[doc-volume]"LOCAL" \
+. ds doc-volume \$3
+..
+.ec
+.
+.
+.\" NS doc-default-operating-system global string
+.\" NS the default OS to associate with man pages
+.\" NS
+.\" NS override this in 'mdoc.local', if necessary
+.
+.ds doc-default-operating-system GNU\"
+.
+.
+.\" NS doc-operating-system global string
+.\" NS the OS or software project associated with the man page
+.
+.ds doc-operating-system \" empty
+.
+.
+.\" NS Os user macro (not parsed, not callable)
+.\" NS operating system
+.\" NS
+.\" NS modifies:
+.\" NS doc-operating-system
+.\" NS
+.\" NS local variables:
+.\" NS doc-operating-system-XXX-XXX
+.\" NS
+.\" NS width register 'Os' set above
+.
+.ds doc-operating-system-ATT-7 7th\~Edition
+.als doc-operating-system-ATT-7th doc-operating-system-ATT-7
+.ds doc-operating-system-ATT-3 System\~III
+.als doc-operating-system-ATT-III doc-operating-system-ATT-3
+.ds doc-operating-system-ATT-V System\~V
+.ds doc-operating-system-ATT-V.2 System\~V Release\~2
+.ds doc-operating-system-ATT-V.3 System\~V Release\~3
+.ds doc-operating-system-ATT-V.4 System\~V Release\~4
+.
+.ds doc-operating-system-BSD-3 3rd\~Berkeley Distribution
+.ds doc-operating-system-BSD-4 4th\~Berkeley Distribution
+.ds doc-operating-system-BSD-4.1 4.1\~Berkeley Distribution
+.ds doc-operating-system-BSD-4.2 4.2\~Berkeley Distribution
+.ds doc-operating-system-BSD-4.3 4.3\~Berkeley Distribution
+.ds doc-operating-system-BSD-4.3T 4.3-Tahoe Berkeley Distribution
+.ds doc-operating-system-BSD-4.3R 4.3-Reno Berkeley Distribution
+.als doc-operating-system-BSD-4.3t doc-operating-system-BSD-4.3T
+.als doc-operating-system-BSD-4.3r doc-operating-system-BSD-4.3R
+.ds doc-operating-system-BSD-4.4 4.4BSD
+.
+.ds doc-operating-system-NetBSD-0.8 0.8
+.ds doc-operating-system-NetBSD-0.8a 0.8A
+.ds doc-operating-system-NetBSD-0.9 0.9
+.ds doc-operating-system-NetBSD-0.9a 0.9A
+.ds doc-operating-system-NetBSD-1.0 1.0
+.ds doc-operating-system-NetBSD-1.0a 1.0A
+.ds doc-operating-system-NetBSD-1.1 1.1
+.ds doc-operating-system-NetBSD-1.2 1.2
+.ds doc-operating-system-NetBSD-1.2a 1.2A
+.ds doc-operating-system-NetBSD-1.2b 1.2B
+.ds doc-operating-system-NetBSD-1.2c 1.2C
+.ds doc-operating-system-NetBSD-1.2d 1.2D
+.ds doc-operating-system-NetBSD-1.2e 1.2E
+.ds doc-operating-system-NetBSD-1.3 1.3
+.ds doc-operating-system-NetBSD-1.3a 1.3A
+.ds doc-operating-system-NetBSD-1.4 1.4
+.ds doc-operating-system-NetBSD-1.4.1 1.4.1
+.ds doc-operating-system-NetBSD-1.4.2 1.4.2
+.ds doc-operating-system-NetBSD-1.4.3 1.4.3
+.ds doc-operating-system-NetBSD-1.5 1.5
+.ds doc-operating-system-NetBSD-1.5.1 1.5.1
+.ds doc-operating-system-NetBSD-1.5.2 1.5.2
+.ds doc-operating-system-NetBSD-1.5.3 1.5.3
+.ds doc-operating-system-NetBSD-1.6 1.6
+.ds doc-operating-system-NetBSD-1.6.1 1.6.1
+.ds doc-operating-system-NetBSD-1.6.2 1.6.2
+.ds doc-operating-system-NetBSD-1.6.3 1.6.3
+.ds doc-operating-system-NetBSD-2.0 2.0
+.ds doc-operating-system-NetBSD-2.0.1 2.0.1
+.ds doc-operating-system-NetBSD-2.0.2 2.0.2
+.ds doc-operating-system-NetBSD-2.0.3 2.0.3
+.ds doc-operating-system-NetBSD-2.1 2.1
+.ds doc-operating-system-NetBSD-3.0 3.0
+.ds doc-operating-system-NetBSD-3.0.1 3.0.1
+.ds doc-operating-system-NetBSD-3.0.2 3.0.2
+.ds doc-operating-system-NetBSD-3.0.3 3.0.3
+.ds doc-operating-system-NetBSD-3.1 3.1
+.ds doc-operating-system-NetBSD-3.1.1 3.1.1
+.ds doc-operating-system-NetBSD-4.0 4.0
+.ds doc-operating-system-NetBSD-4.0.1 4.0.1
+.ds doc-operating-system-NetBSD-5.0 5.0
+.ds doc-operating-system-NetBSD-5.0.1 5.0.1
+.ds doc-operating-system-NetBSD-5.0.2 5.0.2
+.ds doc-operating-system-NetBSD-5.1 5.1
+.ds doc-operating-system-NetBSD-5.1.2 5.1.2
+.ds doc-operating-system-NetBSD-5.1.3 5.1.3
+.ds doc-operating-system-NetBSD-5.1.4 5.1.4
+.ds doc-operating-system-NetBSD-5.2 5.2
+.ds doc-operating-system-NetBSD-5.2.1 5.2.1
+.ds doc-operating-system-NetBSD-5.2.2 5.2.2
+.ds doc-operating-system-NetBSD-6.0 6.0
+.ds doc-operating-system-NetBSD-6.0.1 6.0.1
+.ds doc-operating-system-NetBSD-6.0.2 6.0.2
+.ds doc-operating-system-NetBSD-6.0.3 6.0.3
+.ds doc-operating-system-NetBSD-6.0.4 6.0.4
+.ds doc-operating-system-NetBSD-6.0.5 6.0.5
+.ds doc-operating-system-NetBSD-6.0.6 6.0.6
+.ds doc-operating-system-NetBSD-6.1 6.1
+.ds doc-operating-system-NetBSD-6.1.1 6.1.1
+.ds doc-operating-system-NetBSD-6.1.2 6.1.2
+.ds doc-operating-system-NetBSD-6.1.3 6.1.3
+.ds doc-operating-system-NetBSD-6.1.4 6.1.4
+.ds doc-operating-system-NetBSD-6.1.5 6.1.5
+.ds doc-operating-system-NetBSD-7.0 7.0
+.ds doc-operating-system-NetBSD-7.0.1 7.0.1
+.ds doc-operating-system-NetBSD-7.0.2 7.0.2
+.ds doc-operating-system-NetBSD-7.1 7.1
+.ds doc-operating-system-NetBSD-7.1.1 7.1.1
+.ds doc-operating-system-NetBSD-7.1.2 7.1.2
+.ds doc-operating-system-NetBSD-7.2 7.2
+.ds doc-operating-system-NetBSD-8.0 8.0
+.ds doc-operating-system-NetBSD-8.1 8.1
+.
+.ds doc-operating-system-OpenBSD-2.0 2.0
+.ds doc-operating-system-OpenBSD-2.1 2.1
+.ds doc-operating-system-OpenBSD-2.2 2.2
+.ds doc-operating-system-OpenBSD-2.3 2.3
+.ds doc-operating-system-OpenBSD-2.4 2.4
+.ds doc-operating-system-OpenBSD-2.5 2.5
+.ds doc-operating-system-OpenBSD-2.6 2.6
+.ds doc-operating-system-OpenBSD-2.7 2.7
+.ds doc-operating-system-OpenBSD-2.8 2.8
+.ds doc-operating-system-OpenBSD-2.9 2.9
+.ds doc-operating-system-OpenBSD-3.0 3.0
+.ds doc-operating-system-OpenBSD-3.1 3.1
+.ds doc-operating-system-OpenBSD-3.2 3.2
+.ds doc-operating-system-OpenBSD-3.3 3.3
+.ds doc-operating-system-OpenBSD-3.4 3.4
+.ds doc-operating-system-OpenBSD-3.5 3.5
+.ds doc-operating-system-OpenBSD-3.6 3.6
+.ds doc-operating-system-OpenBSD-3.7 3.7
+.ds doc-operating-system-OpenBSD-3.8 3.8
+.ds doc-operating-system-OpenBSD-3.9 3.9
+.ds doc-operating-system-OpenBSD-4.0 4.0
+.ds doc-operating-system-OpenBSD-4.1 4.1
+.ds doc-operating-system-OpenBSD-4.2 4.2
+.ds doc-operating-system-OpenBSD-4.3 4.3
+.ds doc-operating-system-OpenBSD-4.4 4.4
+.ds doc-operating-system-OpenBSD-4.5 4.5
+.ds doc-operating-system-OpenBSD-4.6 4.6
+.ds doc-operating-system-OpenBSD-4.7 4.7
+.ds doc-operating-system-OpenBSD-4.8 4.8
+.ds doc-operating-system-OpenBSD-4.9 4.9
+.ds doc-operating-system-OpenBSD-5.0 5.0
+.ds doc-operating-system-OpenBSD-5.1 5.1
+.ds doc-operating-system-OpenBSD-5.2 5.2
+.ds doc-operating-system-OpenBSD-5.3 5.3
+.ds doc-operating-system-OpenBSD-5.4 5.4
+.ds doc-operating-system-OpenBSD-5.5 5.5
+.ds doc-operating-system-OpenBSD-5.6 5.6
+.ds doc-operating-system-OpenBSD-5.7 5.7
+.ds doc-operating-system-OpenBSD-5.8 5.8
+.ds doc-operating-system-OpenBSD-5.9 5.9
+.ds doc-operating-system-OpenBSD-6.0 6.0
+.ds doc-operating-system-OpenBSD-6.1 6.1
+.ds doc-operating-system-OpenBSD-6.2 6.2
+.ds doc-operating-system-OpenBSD-6.3 6.3
+.ds doc-operating-system-OpenBSD-6.4 6.4
+.ds doc-operating-system-OpenBSD-6.5 6.5
+.ds doc-operating-system-OpenBSD-6.6 6.6
+.
+.ds doc-operating-system-FreeBSD-1.0 1.0
+.ds doc-operating-system-FreeBSD-1.1 1.1
+.ds doc-operating-system-FreeBSD-1.1.5 1.1.5
+.ds doc-operating-system-FreeBSD-1.1.5.1 1.1.5.1
+.ds doc-operating-system-FreeBSD-2.0 2.0
+.ds doc-operating-system-FreeBSD-2.0.5 2.0.5
+.ds doc-operating-system-FreeBSD-2.1 2.1
+.ds doc-operating-system-FreeBSD-2.1.5 2.1.5
+.ds doc-operating-system-FreeBSD-2.1.6 2.1.6
+.ds doc-operating-system-FreeBSD-2.1.7 2.1.7
+.ds doc-operating-system-FreeBSD-2.2 2.2
+.ds doc-operating-system-FreeBSD-2.2.1 2.2.1
+.ds doc-operating-system-FreeBSD-2.2.2 2.2.2
+.ds doc-operating-system-FreeBSD-2.2.5 2.2.5
+.ds doc-operating-system-FreeBSD-2.2.6 2.2.6
+.ds doc-operating-system-FreeBSD-2.2.7 2.2.7
+.ds doc-operating-system-FreeBSD-2.2.8 2.2.8
+.ds doc-operating-system-FreeBSD-2.2.9 2.2.9
+.ds doc-operating-system-FreeBSD-3.0 3.0
+.ds doc-operating-system-FreeBSD-3.1 3.1
+.ds doc-operating-system-FreeBSD-3.2 3.2
+.ds doc-operating-system-FreeBSD-3.3 3.3
+.ds doc-operating-system-FreeBSD-3.4 3.4
+.ds doc-operating-system-FreeBSD-3.5 3.5
+.ds doc-operating-system-FreeBSD-4.0 4.0
+.ds doc-operating-system-FreeBSD-4.1 4.1
+.ds doc-operating-system-FreeBSD-4.1.1 4.1.1
+.ds doc-operating-system-FreeBSD-4.2 4.2
+.ds doc-operating-system-FreeBSD-4.3 4.3
+.ds doc-operating-system-FreeBSD-4.4 4.4
+.ds doc-operating-system-FreeBSD-4.5 4.5
+.ds doc-operating-system-FreeBSD-4.6 4.6
+.ds doc-operating-system-FreeBSD-4.6.2 4.6.2
+.ds doc-operating-system-FreeBSD-4.7 4.7
+.ds doc-operating-system-FreeBSD-4.8 4.8
+.ds doc-operating-system-FreeBSD-4.9 4.9
+.ds doc-operating-system-FreeBSD-4.10 4.10
+.ds doc-operating-system-FreeBSD-4.11 4.11
+.ds doc-operating-system-FreeBSD-5.0 5.0
+.ds doc-operating-system-FreeBSD-5.1 5.1
+.ds doc-operating-system-FreeBSD-5.2 5.2
+.ds doc-operating-system-FreeBSD-5.2.1 5.2.1
+.ds doc-operating-system-FreeBSD-5.3 5.3
+.ds doc-operating-system-FreeBSD-5.4 5.4
+.ds doc-operating-system-FreeBSD-5.5 5.5
+.ds doc-operating-system-FreeBSD-6.0 6.0
+.ds doc-operating-system-FreeBSD-6.1 6.1
+.ds doc-operating-system-FreeBSD-6.2 6.2
+.ds doc-operating-system-FreeBSD-6.3 6.3
+.ds doc-operating-system-FreeBSD-6.4 6.4
+.ds doc-operating-system-FreeBSD-7.0 7.0
+.ds doc-operating-system-FreeBSD-7.1 7.1
+.ds doc-operating-system-FreeBSD-7.2 7.2
+.ds doc-operating-system-FreeBSD-7.3 7.3
+.ds doc-operating-system-FreeBSD-7.4 7.4
+.ds doc-operating-system-FreeBSD-8.0 8.0
+.ds doc-operating-system-FreeBSD-8.1 8.1
+.ds doc-operating-system-FreeBSD-8.2 8.2
+.ds doc-operating-system-FreeBSD-8.3 8.3
+.ds doc-operating-system-FreeBSD-8.4 8.4
+.ds doc-operating-system-FreeBSD-9.0 9.0
+.ds doc-operating-system-FreeBSD-9.1 9.1
+.ds doc-operating-system-FreeBSD-9.2 9.2
+.ds doc-operating-system-FreeBSD-9.3 9.3
+.ds doc-operating-system-FreeBSD-10.0 10.0
+.ds doc-operating-system-FreeBSD-10.1 10.1
+.ds doc-operating-system-FreeBSD-10.2 10.2
+.ds doc-operating-system-FreeBSD-10.3 10.3
+.ds doc-operating-system-FreeBSD-10.4 10.4
+.ds doc-operating-system-FreeBSD-11.0 11.0
+.ds doc-operating-system-FreeBSD-11.1 11.1
+.ds doc-operating-system-FreeBSD-11.2 11.2
+.ds doc-operating-system-FreeBSD-11.3 11.3
+.ds doc-operating-system-FreeBSD-12.0 12.0
+.ds doc-operating-system-FreeBSD-12.1 12.1
+.
+.ds doc-operating-system-Darwin-8.0.0 8.0.0
+.ds doc-operating-system-Darwin-8.1.0 8.1.0
+.ds doc-operating-system-Darwin-8.2.0 8.2.0
+.ds doc-operating-system-Darwin-8.3.0 8.3.0
+.ds doc-operating-system-Darwin-8.4.0 8.4.0
+.ds doc-operating-system-Darwin-8.5.0 8.5.0
+.ds doc-operating-system-Darwin-8.6.0 8.6.0
+.ds doc-operating-system-Darwin-8.7.0 8.7.0
+.ds doc-operating-system-Darwin-8.8.0 8.8.0
+.ds doc-operating-system-Darwin-8.9.0 8.9.0
+.ds doc-operating-system-Darwin-8.10.0 8.10.0
+.ds doc-operating-system-Darwin-8.11.0 8.11.0
+.ds doc-operating-system-Darwin-9.0.0 9.0.0
+.ds doc-operating-system-Darwin-9.1.0 9.1.0
+.ds doc-operating-system-Darwin-9.2.0 9.2.0
+.ds doc-operating-system-Darwin-9.3.0 9.3.0
+.ds doc-operating-system-Darwin-9.4.0 9.4.0
+.ds doc-operating-system-Darwin-9.5.0 9.5.0
+.ds doc-operating-system-Darwin-9.6.0 9.6.0
+.ds doc-operating-system-Darwin-9.7.0 9.7.0
+.ds doc-operating-system-Darwin-9.8.0 9.8.0
+.ds doc-operating-system-Darwin-10.0.0 10.0.0
+.ds doc-operating-system-Darwin-10.1.0 10.1.0
+.ds doc-operating-system-Darwin-10.2.0 10.2.0
+.ds doc-operating-system-Darwin-10.3.0 10.3.0
+.ds doc-operating-system-Darwin-10.4.0 10.4.0
+.ds doc-operating-system-Darwin-10.5.0 10.5.0
+.ds doc-operating-system-Darwin-10.6.0 10.6.0
+.ds doc-operating-system-Darwin-10.7.0 10.7.0
+.ds doc-operating-system-Darwin-10.8.0 10.8.0
+.ds doc-operating-system-Darwin-11.0.0 11.0.0
+.ds doc-operating-system-Darwin-11.1.0 11.1.0
+.ds doc-operating-system-Darwin-11.2.0 11.2.0
+.ds doc-operating-system-Darwin-11.3.0 11.3.0
+.ds doc-operating-system-Darwin-11.4.0 11.4.0
+.ds doc-operating-system-Darwin-11.5.0 11.5.0
+.ds doc-operating-system-Darwin-12.0.0 12.0.0
+.ds doc-operating-system-Darwin-12.1.0 12.1.0
+.ds doc-operating-system-Darwin-12.2.0 12.2.0
+.ds doc-operating-system-Darwin-13.0.0 13.0.0
+.ds doc-operating-system-Darwin-13.1.0 13.1.0
+.ds doc-operating-system-Darwin-13.2.0 13.2.0
+.ds doc-operating-system-Darwin-13.3.0 13.3.0
+.ds doc-operating-system-Darwin-13.4.0 13.4.0
+.ds doc-operating-system-Darwin-14.0.0 14.0.0
+.ds doc-operating-system-Darwin-14.1.0 14.1.0
+.ds doc-operating-system-Darwin-14.2.0 14.2.0
+.ds doc-operating-system-Darwin-14.3.0 14.3.0
+.ds doc-operating-system-Darwin-14.4.0 14.4.0
+.ds doc-operating-system-Darwin-14.5.0 14.5.0
+.ds doc-operating-system-Darwin-15.0.0 15.0.0
+.ds doc-operating-system-Darwin-15.1.0 15.1.0
+.ds doc-operating-system-Darwin-15.2.0 15.2.0
+.ds doc-operating-system-Darwin-15.3.0 15.3.0
+.ds doc-operating-system-Darwin-15.4.0 15.4.0
+.ds doc-operating-system-Darwin-15.5.0 15.5.0
+.ds doc-operating-system-Darwin-15.6.0 15.6.0
+.ds doc-operating-system-Darwin-16.0.0 16.0.0
+.ds doc-operating-system-Darwin-16.1.0 16.1.0
+.ds doc-operating-system-Darwin-16.2.0 16.2.0
+.ds doc-operating-system-Darwin-16.3.0 16.3.0
+.ds doc-operating-system-Darwin-16.4.0 16.4.0
+.ds doc-operating-system-Darwin-16.5.0 16.5.0
+.ds doc-operating-system-Darwin-16.6.0 16.6.0
+.ds doc-operating-system-Darwin-17.0.0 17.0.0
+.ds doc-operating-system-Darwin-17.1.0 17.1.0
+.ds doc-operating-system-Darwin-17.2.0 17.2.0
+.ds doc-operating-system-Darwin-17.3.0 17.3.0
+.ds doc-operating-system-Darwin-17.4.0 17.4.0
+.ds doc-operating-system-Darwin-17.5.0 17.5.0
+.ds doc-operating-system-Darwin-17.6.0 17.6.0
+.ds doc-operating-system-Darwin-17.7.0 17.7.0
+.ds doc-operating-system-Darwin-18.0.0 18.0.0
+.ds doc-operating-system-Darwin-18.1.0 18.1.0
+.ds doc-operating-system-Darwin-18.2.0 18.2.0
+.ds doc-operating-system-Darwin-18.3.0 18.3.0
+.ds doc-operating-system-Darwin-18.4.0 18.4.0
+.ds doc-operating-system-Darwin-18.5.0 18.5.0
+.ds doc-operating-system-Darwin-18.6.0 18.6.0
+.ds doc-operating-system-Darwin-18.7.0 18.7.0
+.ds doc-operating-system-Darwin-19.0.0 19.0.0
+.ds doc-operating-system-Darwin-19.1.0 19.1.0
+.ds doc-operating-system-Darwin-19.2.0 19.2.0
+.
+.ds doc-operating-system-DragonFly-1.0 1.0
+.ds doc-operating-system-DragonFly-1.1 1.1
+.ds doc-operating-system-DragonFly-1.2 1.2
+.ds doc-operating-system-DragonFly-1.3 1.3
+.ds doc-operating-system-DragonFly-1.4 1.4
+.ds doc-operating-system-DragonFly-1.5 1.5
+.ds doc-operating-system-DragonFly-1.6 1.6
+.ds doc-operating-system-DragonFly-1.7 1.7
+.ds doc-operating-system-DragonFly-1.8 1.8
+.ds doc-operating-system-DragonFly-1.8.1 1.8.1
+.ds doc-operating-system-DragonFly-1.9 1.9
+.ds doc-operating-system-DragonFly-1.10 1.10
+.ds doc-operating-system-DragonFly-1.11 1.11
+.ds doc-operating-system-DragonFly-1.12 1.12
+.ds doc-operating-system-DragonFly-1.12.2 1.12.2
+.ds doc-operating-system-DragonFly-1.13 1.13
+.ds doc-operating-system-DragonFly-2.0 2.0
+.ds doc-operating-system-DragonFly-2.1 2.1
+.ds doc-operating-system-DragonFly-2.2 2.2
+.ds doc-operating-system-DragonFly-2.3 2.3
+.ds doc-operating-system-DragonFly-2.4 2.4
+.ds doc-operating-system-DragonFly-2.5 2.5
+.ds doc-operating-system-DragonFly-2.6 2.6
+.ds doc-operating-system-DragonFly-2.7 2.7
+.ds doc-operating-system-DragonFly-2.8 2.8
+.ds doc-operating-system-DragonFly-2.9 2.9
+.ds doc-operating-system-DragonFly-2.9.1 2.9.1
+.ds doc-operating-system-DragonFly-2.10 2.10
+.ds doc-operating-system-DragonFly-2.10.1 2.10.1
+.ds doc-operating-system-DragonFly-2.11 2.11
+.ds doc-operating-system-DragonFly-2.12 2.12
+.ds doc-operating-system-DragonFly-2.13 2.13
+.ds doc-operating-system-DragonFly-3.0 3.0
+.ds doc-operating-system-DragonFly-3.0.1 3.0.1
+.ds doc-operating-system-DragonFly-3.0.2 3.0.2
+.ds doc-operating-system-DragonFly-3.1 3.1
+.ds doc-operating-system-DragonFly-3.2 3.2
+.ds doc-operating-system-DragonFly-3.2.1 3.2.1
+.ds doc-operating-system-DragonFly-3.2.2 3.2.2
+.ds doc-operating-system-DragonFly-3.3 3.3
+.ds doc-operating-system-DragonFly-3.4 3.4
+.ds doc-operating-system-DragonFly-3.4.1 3.4.1
+.ds doc-operating-system-DragonFly-3.4.2 3.4.2
+.ds doc-operating-system-DragonFly-3.4.3 3.4.3
+.ds doc-operating-system-DragonFly-3.5 3.5
+.ds doc-operating-system-DragonFly-3.6 3.6
+.ds doc-operating-system-DragonFly-3.6.1 3.6.1
+.ds doc-operating-system-DragonFly-3.6.2 3.6.2
+.ds doc-operating-system-DragonFly-3.7 3.7
+.ds doc-operating-system-DragonFly-3.8 3.8
+.ds doc-operating-system-DragonFly-3.8.1 3.8.1
+.ds doc-operating-system-DragonFly-3.8.2 3.8.2
+.ds doc-operating-system-DragonFly-4.0 4.0
+.ds doc-operating-system-DragonFly-4.0.1 4.0.1
+.ds doc-operating-system-DragonFly-4.0.2 4.0.2
+.ds doc-operating-system-DragonFly-4.0.3 4.0.3
+.ds doc-operating-system-DragonFly-4.0.4 4.0.4
+.ds doc-operating-system-DragonFly-4.0.5 4.0.5
+.ds doc-operating-system-DragonFly-4.0.6 4.0.6
+.ds doc-operating-system-DragonFly-4.1 4.1
+.ds doc-operating-system-DragonFly-4.2 4.2
+.ds doc-operating-system-DragonFly-4.2.1 4.2.1
+.ds doc-operating-system-DragonFly-4.2.2 4.2.2
+.ds doc-operating-system-DragonFly-4.2.3 4.2.3
+.ds doc-operating-system-DragonFly-4.2.4 4.2.4
+.ds doc-operating-system-DragonFly-4.3 4.3
+.ds doc-operating-system-DragonFly-4.4 4.4
+.ds doc-operating-system-DragonFly-4.4.1 4.4.1
+.ds doc-operating-system-DragonFly-4.4.2 4.4.2
+.ds doc-operating-system-DragonFly-4.4.3 4.4.3
+.ds doc-operating-system-DragonFly-4.5 4.5
+.ds doc-operating-system-DragonFly-4.6 4.6
+.ds doc-operating-system-DragonFly-4.6.1 4.6.1
+.ds doc-operating-system-DragonFly-4.6.2 4.6.2
+.ds doc-operating-system-DragonFly-4.7 4.7
+.ds doc-operating-system-DragonFly-4.8 4.8
+.ds doc-operating-system-DragonFly-4.8.1 4.8.1
+.ds doc-operating-system-DragonFly-4.9 4.9
+.ds doc-operating-system-DragonFly-5.0 5.0
+.ds doc-operating-system-DragonFly-5.0.1 5.0.1
+.ds doc-operating-system-DragonFly-5.0.2 5.0.2
+.ds doc-operating-system-DragonFly-5.1 5.1
+.ds doc-operating-system-DragonFly-5.2 5.2
+.ds doc-operating-system-DragonFly-5.2.1 5.2.1
+.ds doc-operating-system-DragonFly-5.2.2 5.2.2
+.ds doc-operating-system-DragonFly-5.3 5.3
+.ds doc-operating-system-DragonFly-5.4 5.4
+.ds doc-operating-system-DragonFly-5.4.1 5.4.1
+.ds doc-operating-system-DragonFly-5.4.2 5.4.2
+.ds doc-operating-system-DragonFly-5.4.3 5.4.3
+.ds doc-operating-system-DragonFly-5.5 5.5
+.ds doc-operating-system-DragonFly-5.6 5.6
+.ds doc-operating-system-DragonFly-5.6.1 5.6.1
+.ds doc-operating-system-DragonFly-5.6.2 5.6.2
+.
+.eo
+.de Os
+. ie "\$1"" \
+. ds doc-operating-system "\*[doc-default-operating-system]
+. el \{ .ie "\$1"ATT" \{\
+. ds doc-operating-system AT&T
+. if \A'\$2' \{\
+. ie d doc-operating-system-ATT-\$2 \
+. as doc-operating-system " \*[doc-operating-system-ATT-\$2]
+. el \
+. as doc-operating-system " UNIX
+. \}\}
+. el \{ .ie "\$1"BSD" \{\
+. if \A'\$2' \{\
+. ie d doc-operating-system-BSD-\$2 \
+. ds doc-operating-system "\*[doc-operating-system-BSD-\$2]
+. el \
+. tm mdoc warning: .Os: Unknown BSD version '\$2' (#\n[.c])
+. \}\}
+. el \{ .ie "\$1"FreeBSD" \{\
+. ds doc-operating-system FreeBSD
+. if \A'\$2' \{\
+. ie d doc-operating-system-FreeBSD-\$2 \
+. as doc-operating-system \~\*[doc-operating-system-FreeBSD-\$2]
+. el \
+. tm mdoc warning: .Os: Unknown FreeBSD version '\$2' (#\n[.c])
+. \}\}
+. el \{ .ie "\$1"DragonFly" \{\
+. ds doc-operating-system DragonFly
+. if \A'\$2' \{\
+. ie d doc-operating-system-DragonFly-\$2 \
+. as doc-operating-system \~\*[doc-operating-system-DragonFly-\$2]
+. el \
+. tm mdoc warning: .Os: Unknown DragonFly version '\$2' (#\n[.c])
+. \}\}
+. el \{ .ie "\$1"NetBSD" \{\
+. ds doc-operating-system NetBSD
+. if \A'\$2' \{\
+. ie d doc-operating-system-NetBSD-\$2 \
+. as doc-operating-system \~\*[doc-operating-system-NetBSD-\$2]
+. el \
+. tm mdoc warning: .Os: Unknown NetBSD version '\$2' (#\n[.c])
+. \}\}
+. el \{ .ie "\$1"OpenBSD" \{\
+. ds doc-operating-system OpenBSD
+. if \A'\$2' \{\
+. ie d doc-operating-system-OpenBSD-\$2 \
+. as doc-operating-system \~\*[doc-operating-system-OpenBSD-\$2]
+. el \
+. tm mdoc warning: .Os: Unknown OpenBSD version '\$2' (#\n[.c])
+. \}\}
+. el \{ .ie "\$1"Darwin" \{\
+. ds doc-operating-system Darwin
+. if \A'\$2' \{\
+. ie d doc-operating-system-Darwin-\$2 \
+. as doc-operating-system \~\*[doc-operating-system-Darwin-\$2]
+. el \
+. tm mdoc warning: .Os: Unknown Darwin version '\$2' (#\n[.c])
+. \}\}
+. el \{\
+. ds doc-operating-system \$1
+. if !"\$2"" \
+. as doc-operating-system " \$2
+. \}\}\}\}\}\}\}\}
+.
+. doc-set-up-titles
+.
+. if '\*[.T]'pdf' \
+. pdfbookmark 1 "\*[doc-page-topic](\*[doc-section])"
+.
+. doc-header
+. nr doc-need-titles-reset 1
+..
+.ec
+.
+.
+.\" NS doc-hyphen-flags global register
+.\" NS the parameter for the '.hy' request
+.ie \n[HY] \{\
+. ie \n[cR] .nr doc-hyphen-flags \n[\*[locale]*hyphenation-mode-base]
+. el .nr doc-hyphen-flags \n[\*[locale]*hyphenation-mode-trap]
+.\}
+.el .nr doc-hyphen-flags 0
+.
+.
+.\" NS doc-header macro
+.\" NS print page header
+.\" NS
+.\" NS local variables:
+.\" NS doc-xref
+.\" NS doc-abbv
+.\" NS doc-reg-dh
+.\" NS doc-reg-dh1
+.\" NS doc-hs-len
+.\" NS doc-hs-len-prev
+.
+.eo
+.de doc-header
+. ds doc-xref \*[doc-page-topic-font]\*[doc-page-topic]\f[]\"
+. as doc-xref \*[doc-page-section-font](\*[doc-section])\f[]\"
+. ds doc-abbv \*[doc-page-topic]\"
+. ev doc-env-dh
+. doc-setup-page-layout
+. ie \n[cR] .pl +1v
+. el .sp .5i
+. nr doc-reg-dh \w'\*[doc-page-topic-font]\*[doc-xref]\f[]'
+. nr doc-reg-dh1 \w'\*[doc-volume]'
+. if (\n[doc-reg-dh] + \n[doc-reg-dh1] + \n[doc-reg-dh] >= \n[.lt]) \{\
+. while (\n[doc-reg-dh] + \n[doc-reg-dh1] + \n[doc-reg-dh] >= \n[.lt]) \{\
+. ds doc-xref \*[doc-page-topic-font]\*[doc-abbv]\f[]\"
+. as doc-xref \*[doc-page-section-font](\*[doc-section])\f[]\"
+. length doc-abbv-len-prev \*[doc-abbv]
+. substring doc-abbv 0 -2
+. length doc-abbv-len \*[doc-abbv]
+. nr doc-reg-dh \w'\*[doc-page-topic-font]\*[doc-abbv]\|.\|.\|.\f[]'
+. \" If header string didn't actually get shorter, stop trying.
+. if (\n[doc-abbv-len-prev] <= \n[doc-abbv-len]) \
+. break
+. \}
+. rr doc-abbv-len
+. rr doc-abbv-len-prev
+. as doc-abbv \|.\|.\|.
+. \}
+. tl '\*[doc-xref]'\*[doc-volume]\f[]'\*[doc-xref]'
+. ie \n[cR] \{\
+. pl +1v
+. sp 1v
+. \}
+. el .sp |1i
+. ev
+. ns
+. rm doc-xref
+. rm doc-abbv
+..
+.ec
+.
+.
+.\" NS doc-break-body-text
+.\" NS Schedule a page break when the next output line is written (not
+.\" NS called if continuously rendering).
+.de doc-break-body-text
+' bp
+..
+.
+.
+.\" NS doc-footer macro
+.\" NS print page footer
+.\"
+.\" NS local variables:
+.\" NS doc-xref
+.\" NS doc-page-id
+.
+.eo
+.de doc-footer
+. ds doc-xref \*[doc-page-topic-font]\*[doc-page-topic]\f[]\"
+. as doc-xref \*[doc-page-section-font](\*[doc-section])\f[]\"
+. ds doc-page-id \n[%]
+. if r X \{\
+. if (\n[%] > \n[X]) \{\
+. nr doc-page-letter (\n[%] - \n[X])
+. ds doc-page-id \n[X]\n[doc-page-letter]\"
+. \}
+. \}
+. ev doc-caption-enviroment
+. doc-setup-page-layout
+. ie \n[D] \{\
+. ie e \
+. tl '%'\*[doc-date-string]'\*[doc-operating-system]'
+. el \
+. tl '\*[doc-operating-system]'\*[doc-date-string]'\*[doc-page-id]'
+. \}
+. el \{\
+. ie \n[cR] \
+. tl '\*[doc-operating-system]'\*[doc-date-string]'\*[doc-xref]'
+. el \
+. tl '\*[doc-operating-system]'\*[doc-date-string]'\*[doc-page-id]'
+. \}
+. if !\n[cR] .bp
+. ev
+. rm doc-page-id
+. rm doc-xref
+..
+.ec
+.
+.
+.\" NS doc-check-depth macro
+.\" NS check paired macros
+.
+.eo
+.de doc-check-depth
+. if \n[doc-list-depth] \{\
+. tm mdoc warning: A .Bl directive has no matching .El (#\n[.c])
+. nr doc-list-depth 0
+. \}
+. if \n[doc-display-depth] \{\
+. tm mdoc warning: A .Bd directive has no matching .Ed (#\n[.c])
+. nr doc-display-depth 0
+. \}
+. if \n[doc-fontmode-depth] \{\
+. tm mdoc warning: A .Bf directive has no matching .Ef (#\n[.c])
+. nr doc-fontmode-depth 0
+. \}
+..
+.ec
+.
+.
+.\" NS doc-end-macro macro
+.\" NS finish output
+.\" NS
+.\" NS modifies:
+.\" NS doc-need-titles-reset
+.
+.eo
+.de doc-end-macro
+. doc-check-depth
+.
+. if \n[cR] \{\
+. \" We might have a pending output line that is not yet broken, and
+. \" also be 1v from the bottom of the page. If we break (or flush)
+. \" the output line now, the page will get ejected afterward and
+. \" troff will exit because we're in an end-of-input macro--our
+. \" footer will never be output. So, if that is the case, further
+. \" extend the page length by 1v.
+. if ((\n[.p] - \n[nl]) <= \n[.V]) .pl +1v
+. br
+. pl +1v
+. sp 1v
+. doc-footer
+. \" If we're processing multiple documents and have started a new
+. \" one, draw a line between this footer and the next header.
+. if !'\n[.F]'' \{\
+. pl +1v
+. nf
+. ti 0
+\D'l \n[doc-line-length]u 0'
+. fi
+. \}
+. \" suppress empty lines after the footer
+. pl \n[nl]u
+. \}
+. ch doc-header
+. doc-break-page-with-new-number
+.
+. \" Reset strings to reduce info leaks from one man page to the next.
+. ds doc-date-string UNDATED\"
+. ds doc-page-topic UNTITLED\"
+. ds doc-volume LOCAL\"
+. ds doc-section \" empty
+. ds doc-operating-system \" empty
+. ds doc-topic-name \" empty
+..
+.ec
+.
+.
+.\" NS doc-break-page-with-new-number macro
+.\" NS Break the page and update its number depending on the C
+.\" NS (consecutive numbering) register.
+.\" NS
+.\" NS Corner case: if formatting multiple documents and P (starting
+.\" NS page number) is defined but C is not set, start numbering each
+.\" NS document at \n[P]. Not strictly necessary if not switching
+.\" NS macro packages.
+.
+.eo
+.de doc-break-page-with-new-number
+. ie \n[C] .bp (\n[%] + 1) \" argument NOT redundant before page 1
+. el \{\
+. ie r P .bp \n[P]
+. el .bp 1
+. \}
+..
+.ec
+.
+.
+.\" NS doc-paragraph macro
+.\" NS insert a paragraph
+.
+.eo
+.de doc-paragraph
+. sp \n[doc-paragraph-space]u
+. if !\n[cR] \
+. ne 2
+. ns
+..
+.ec
+.
+.
+.\" NS Pp user macro (not parsed, not callable)
+.\" NS new paragraph
+.\" NS
+.\" NS width register 'Pp' set above
+.
+.als Pp doc-paragraph
+.
+.
+.\" NS Lp user macro (not parsed, not callable)
+.\" NS same as .Pp
+.\" NS
+.\" NS width register 'Lp' set above
+.
+.als Lp doc-paragraph
+.
+.
+.eo
+.de LP
+. tm Not a \-mdoc command: .LP (#\n[.c])
+..
+.ec
+.
+.
+.eo
+.de PP
+. tm Not a \-mdoc command: .PP (#\n[.c])
+..
+.ec
+.
+.
+.eo
+.de pp
+. tm Not a \-mdoc command: .pp (#\n[.c])
+..
+.ec
+.
+.
+.eo
+.de SH
+. tm Not a \-mdoc command: .SH (#\n[.c])
+..
+.ec
+.
+.
+.\" NS Nd user macro (not parsed, not callable)
+.\" NS print name description
+.\" NS
+.\" NS width register 'Nd' set above
+.
+.eo
+.de Nd
+. nop \[em] \$*
+..
+.ec
+.
+.
+.\" NS doc-in-name-section global register (bool)
+.\" NS whether we are in the 'name' section
+.
+.nr doc-in-name-section 0
+.
+.
+.\" NS doc-in-synopsis-section global register (bool)
+.\" NS whether we are in the 'synopsis' section
+.
+.nr doc-in-synopsis-section 0
+.
+.
+.\" NS doc-in-library-section global register (bool)
+.\" NS whether we are in the 'library' section
+.
+.nr doc-in-library-section 0
+.
+.
+.\" NS doc-in-see-also-section global register (bool)
+.\" NS whether we are in the 'see also' section
+.
+.nr doc-in-see-also-section 0
+.
+.
+.\" NS doc-in-files-section global register (bool)
+.\" NS whether we are in the 'files' section
+.
+.nr doc-in-files-section 0
+.
+.
+.\" NS doc-in-authors-section global register (bool)
+.\" NS whether we are in the 'authors' section
+.
+.nr doc-in-authors-section 0
+.
+.
+.\" NS doc-need-titles-reset global register (bool)
+.\" NS whether the strings that set header and footer text need to be
+.\" NS reconfigured
+.\" NS
+.\" NS This happens when batch-rendering and starting a new page.
+.
+.nr doc-need-titles-reset 0
+.
+.
+.\" NS doc-first-parameter macro
+.\" NS return first parameter
+.\" NS
+.\" NS local variables:
+.\" NS doc-str-dfp
+.
+.eo
+.de doc-first-parameter
+. ds doc-str-dfp "\$1
+..
+.ec
+.
+.
+.\" NS doc-prepare-section-heading macro
+.\" NS define `doc-sec-head`, `macro` prepared for string matching
+.\"
+.\" NS
+.\" NS local variables:
+.\" NS doc-str-tmp1
+.\" NS doc-str-tmp2
+.\" NS doc-tmp-strlen
+.
+.eo
+.de doc-prepare-section-heading
+. ds doc-str-tmp1 "\$*
+. ds doc-str-tmp2 "\$*
+. length doc-tmp-strlen \$*
+. \" Leave (nonstandard) section headings of length 0 or 1 unchanged.
+. ie \n[doc-tmp-strlen]>1 \{\
+. substring doc-str-tmp1 0 0
+. substring doc-str-tmp2 1
+. stringdown doc-str-tmp2
+. ds doc-sec-head \*[doc-str-tmp1]\*[doc-str-tmp2]\"
+. \}
+. el \
+. ds doc-sec-head "\$*
+. rm doc-str-tmp1
+. rm doc-str-tmp2
+. rr doc-tmp-strlen
+..
+.ec
+.
+.
+.\" NS Sh user macro (not callable)
+.\" NS section headers
+.\" NS
+.\" NS modifies:
+.\" NS doc-func-args-processed
+.\" NS doc-func-count
+.\" NS doc-in-authors-section
+.\" NS doc-in-files-section
+.\" NS doc-in-library-section
+.\" NS doc-in-name-section
+.\" NS doc-in-see-also-section
+.\" NS doc-in-synopsis-section
+.\" NS doc-indent-synopsis
+.\" NS doc-indent-synopsis-active
+.\" NS doc-is-func
+.\" NS doc-num-func-args
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-Sh
+.\" NS doc-reg-Sh1
+.\" NS doc-section-XXX
+.\" NS
+.\" NS width register 'Sh' set in doc-common
+.
+.ds doc-section-name Name\"
+.ds doc-section-synopsis Synopsis\"
+.ds doc-section-library Library\"
+.ds doc-section-description Description\"
+.ds doc-section-see-also See also\"
+.ds doc-section-files Files\"
+.ds doc-section-authors Authors\"
+.
+.eo
+.de Sh
+. \" Tell doc-print-recursive whether to force capitalization.
+. nr doc-do-capitalize \n[CS]
+.
+. \" Normalize capitalization of section heading.
+. doc-prepare-section-heading \$*
+.
+. ie "\*[doc-sec-head]"\*[doc-section-name]" \
+. nr doc-in-name-section 1
+. el \
+. nr doc-in-name-section 0
+.
+. ie \n[doc-arg-count] \{\
+. \" we only allow 'Sh' within 'Sh'; it will change the font back to
+. \" 'doc-Sh-font'
+. ie "\*[doc-macro-name]"Sh" \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-count] >= \n[doc-arg-ptr]) \{\
+. nr doc-curr-font \n[.f]
+. nop \*[doc-Sh-font]\c
+. doc-print-recursive
+. \}
+. el \{\
+. tm Usage: .Sh section_name ... (#\n[.c])
+. doc-reset-args
+. \}\}
+. el \{\
+. tm Usage: .Sh not callable by other macros (#\n[.c])
+. doc-reset-args
+. \}\}
+. el \{\
+. if !\n[.$] \{\
+. tm Usage: .Sh section_name ... (#\n[.c])
+. return
+. \}
+.
+. ds doc-macro-name Sh
+. doc-parse-args \$@
+.
+. ad \*[AD]
+.
+. ie "\*[doc-sec-head]"\*[doc-section-name]" \{\
+. doc-set-up-titles
+. in 0
+. \}
+. el \{\
+. nr doc-in-name-section 0
+. nr doc-in-synopsis-section 0
+. nr doc-in-library-section 0
+. nr doc-in-see-also-section 0
+. nr doc-in-files-section 0
+. nr doc-in-authors-section 0
+.
+. ie "\*[doc-sec-head]"\*[doc-section-synopsis]" \{\
+. if t \
+. na
+. nr doc-in-synopsis-section 1
+. nr doc-indent-synopsis 0
+. nr doc-indent-synopsis-active 0
+. \}
+. el \{ .ie "\*[doc-sec-head]"\*[doc-section-library]" \{\
+. nr doc-in-library-section 1
+. \}
+. el \{ .ie "\*[doc-sec-head]"\*[doc-section-description]" \{\
+. nr doc-is-func 0
+. nr doc-func-count 0
+. nr doc-func-args-processed 0
+. nr doc-num-func-args 0
+. \}
+. el \{ .ie "\*[doc-sec-head]"\*[doc-section-see-also]" \{\
+. if t \
+. na
+. nr doc-in-see-also-section 1
+. \}
+. el \{ .ie "\*[doc-sec-head]"\*[doc-section-files]" \
+. nr doc-in-files-section 1
+. el .if "\*[doc-sec-head]"\*[doc-section-authors]" \
+. nr doc-in-authors-section 1
+. \}\}\}\}
+.
+. in 0
+. nr doc-have-author 0
+. \}
+.
+. doc-setup-page-layout
+. sp \n[doc-paragraph-space]u
+. ns
+. ta T .5i
+. if !\n[cR] \
+. ne 3
+. fi
+.
+. if '\*[.T]'pdf' \
+. pdfbookmark 2 "\*[doc-sec-head]"
+.
+. if t \{\
+. nr doc-reg-Sh \n[.ss]
+. nr doc-reg-Sh1 \n[.sss]
+. ss (\n[.ss] * 5 / 3) (\n[.sss] * 5 / 3)
+. \}
+.
+. if \n[doc-remap-I-style-in-headings] \
+. ftr \*[doc-heading-family]I \*[doc-heading-family]BI
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+. nop \*[doc-Sh-font]\c
+. doc-print-recursive
+.
+. if t \
+. ss \n[doc-reg-Sh] \n[doc-reg-Sh1]
+.
+. in \n[IN]u
+. ns
+.
+. doc-check-depth
+. if \n[doc-remap-I-style-in-headings] \
+. ftr \*[doc-heading-family]I \*[doc-heading-family]I
+. \}
+.
+.
+. \" Don't let doc-print-recursive force caps on anything else.
+. nr doc-do-capitalize 0
+..
+.ec
+.
+.
+.\" NS Ss user macro (not callable)
+.\" NS subsection
+.\" NS
+.\" NS modifies:
+.\" NS doc-subsection-heading
+.\" NS
+.\" NS local variable:
+.\" NS doc-reg-Ss
+.\" NS doc-reg-Ss1
+.\" NS
+.\" NS width register 'Ss' set above
+.
+.eo
+.de Ss
+. ie \n[doc-arg-count] \{\
+. \" we only allow 'Ss' within 'Ss'; it will change the font back to
+. \" 'doc-Sh-font'
+. ie "\*[doc-macro-name]"Ss" \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-count] >= \n[doc-arg-ptr]) \{\
+. nr doc-curr-font \n[.f]
+. nop \*[doc-Sh-font]\c
+. doc-print-recursive
+. \}
+. el \{\
+. tm Usage: .Ss subsection_name ... (#\n[.c])
+. doc-reset-args
+. \}\}
+. el \{\
+. tm Usage: .Ss not callable by other macros (#\n[.c])
+. doc-reset-args
+. \}\}
+. el \{\
+. if !\n[.$] \{\
+. tm Usage: .Ss subsection_name ... (#\n[.c])
+. return
+. \}
+.
+. ds doc-macro-name Ss
+. doc-parse-args \$@
+.
+. ds doc-subsection-heading \$*
+.
+. sp \n[doc-paragraph-space]u
+. if !\n[cR] \
+. ne 3
+. in \n[SN]u
+.
+. if '\*[.T]'pdf' \
+. pdfbookmark 3 "\*[doc-subsection-heading]"
+.
+. nr doc-reg-Ss \n[.ss]
+. nr doc-reg-Ss1 \n[.sss]
+. ss (\n[.ss] * 5 / 4) (\n[.sss] * 5 / 4)
+.
+. if \n[doc-remap-I-style-in-headings] \
+. ftr \*[doc-heading-family]I \*[doc-heading-family]BI
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+. nop \*[doc-Sh-font]\c
+. doc-print-recursive
+.
+. ss \n[doc-reg-Ss] \n[doc-reg-Ss1]
+.
+. ta T .5i
+. in
+. if !\n[cR] \
+. ne 2
+. br
+. ns
+.
+. doc-check-depth
+. if \n[doc-remap-I-style-in-headings] \
+. ftr \*[doc-heading-family]I \*[doc-heading-family]I
+. \}
+.
+..
+.ec
+.
+.
+.\" NS Rd macro (not parsed, not callable)
+.\" NS print global register dump to stderr
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-Rd
+.
+.eo
+.de Rd
+. tm MDOC GLOBAL REGISTER DUMP
+. tm doc-macro-name == '\*[doc-macro-name]'
+. tm doc-arg-count == \n[doc-arg-count]
+. tm doc-num-args == \n[doc-num-args]
+. tm doc-arg-ptr == \n[doc-arg-ptr]
+.
+. nr doc-reg-Rd 1
+. while (\n[doc-reg-Rd] <= \n[doc-arg-count]) \{\
+. tm doc-arg\n[doc-reg-Rd] == '\*[doc-arg\n[doc-reg-Rd]]'
+. tm doc-type\n[doc-reg-Rd] == \n[doc-type\n[doc-reg-Rd]]
+. tm doc-space\n[doc-reg-Rd] == '\*[doc-space\n[doc-reg-Rd]]'
+. nr doc-reg-Rd +1
+. \}
+.
+. tm doc-curr-font == \n[doc-curr-font]
+. tm doc-indent-synopsis == \n[doc-indent-synopsis]
+. tm doc-indent-synopsis-active == \n[doc-indent-synopsis-active]
+. tm doc-have-decl == \n[doc-have-decl]
+. tm doc-have-var == \n[doc-have-var]
+. tm doc-topic-name == '\*[doc-topic-name]'
+. tm doc-quote-left == '\*[doc-quote-left]'
+. tm doc-quote-right == '\*[doc-quote-right]'
+. tm doc-nesting-level == \n[doc-nesting-level]
+. tm doc-in-list == \n[doc-in-list]
+. tm doc-space == '\*[doc-space]'
+. tm doc-saved-space == '\*[doc-saved-space]'
+. tm doc-space-mode == \n[doc-space-mode]
+. tm doc-have-space == \n[doc-have-space]
+. tm doc-have-slot == \n[doc-have-slot]
+. tm doc-keep-type == \n[doc-keep-type]
+. tm doc-display-depth == \n[doc-display-depth]
+. tm doc-is-compact == \n[doc-is-compact]
+.
+. nr doc-reg-Rd 0
+. while (\n[doc-reg-Rd] <= \n[doc-display-depth]) \{\
+. tm doc-display-type-stack\n[doc-reg-Rd] == '\*[doc-display-type-stack\n[doc-reg-Rd]]'
+. tm doc-display-indent-stack\n[doc-reg-Rd] == \n[doc-display-indent-stack\n[doc-reg-Rd]]
+. tm doc-display-ad-stack\n[doc-reg-Rd] == \n[doc-display-ad-stack\n[doc-reg-Rd]]
+. tm doc-display-fi-stack\n[doc-reg-Rd] == \n[doc-display-fi-stack\n[doc-reg-Rd]]
+. tm doc-display-ft-stack\n[doc-reg-Rd] == \n[doc-display-ft-stack\n[doc-reg-Rd]]
+. tm doc-display-ps-stack\n[doc-reg-Rd] == \n[doc-display-ps-stack\n[doc-reg-Rd]]
+. nr doc-reg-Rd +1
+. \}
+.
+. tm doc-fontmode-depth == \n[doc-fontmode-depth]
+.
+. nr doc-reg-Rd 1
+. while (\n[doc-reg-Rd] <= \n[doc-fontmode-depth]) \{\
+. tm doc-fontmode-font-stack\n[doc-reg-Rd] == '\n[doc-fontmode-font-stack\n[doc-reg-Rd]]'
+. tm doc-fontmode-size-stack\n[doc-reg-Rd] == '\n[doc-fontmode-size-stack\n[doc-reg-Rd]]'
+. nr doc-reg-Rd +1
+. \}
+.
+. tm doc-list-depth == \n[doc-list-depth]
+.
+. nr doc-reg-Rd 1
+. while (\n[doc-reg-Rd] <= \n[doc-list-depth]) \{\
+. tm doc-list-type-stack\n[doc-reg-Rd] == '\*[doc-list-type-stack\n[doc-reg-Rd]]'
+. tm doc-list-have-indent-stack\n[doc-reg-Rd] == \n[doc-list-have-indent-stack\n[doc-reg-Rd]]
+. tm doc-list-indent-stack\n[doc-reg-Rd] == \n[doc-list-indent-stack\n[doc-reg-Rd]]
+. tm doc-compact-list-stack\n[doc-reg-Rd] == \n[doc-compact-list-stack\n[doc-reg-Rd]]
+. tm doc-tag-prefix-stack\n[doc-reg-Rd] == '\*[doc-tag-prefix-stack\n[doc-reg-Rd]]'
+. tm doc-tag-width-stack\n[doc-reg-Rd] == '\*[doc-tag-width-stack\n[doc-reg-Rd]]'
+. tm doc-list-offset-stack\n[doc-reg-Rd] == \n[doc-list-offset-stack\n[doc-reg-Rd]]
+. tm doc-enum-list-count-stack\n[doc-reg-Rd] == \n[doc-enum-list-count-stack\n[doc-reg-Rd]]
+. nr doc-reg-Rd +1
+. \}
+.
+. tm doc-saved-Pa-font == '\*[doc-saved-Pa-font]'
+. tm doc-curr-type == \n[doc-curr-type]
+. tm doc-curr-arg == '\*[doc-curr-arg]'
+. tm doc-diag-list-input-line-count == \n[doc-diag-list-input-line-count]
+. tm doc-num-columns == \n[doc-num-columns]
+. tm doc-column-indent-width == \n[doc-column-indent-width]
+. tm doc-is-func == \n[doc-is-func]
+. tm doc-have-old-func == \n[doc-have-old-func]
+. tm doc-func-arg-count == \n[doc-func-arg-count]
+. tm doc-func-arg == '\*[doc-func-arg]'
+. tm doc-num-func-args == \n[doc-num-func-args]
+. tm doc-func-args-processed == \n[doc-func-args-processed]
+. tm doc-have-func == \n[doc-have-func]
+. tm doc-is-reference == \n[doc-is-reference]
+. tm doc-reference-count == \n[doc-reference-count]
+. tm doc-author-count == \n[doc-author-count]
+.
+. nr doc-reg-Rd 0
+. while (\n[doc-reg-Rd] <= \n[doc-author-count]) \{\
+. tm doc-author-name\n[doc-reg-Rd] == '\*[doc-author-name\n[doc-reg-Rd]]'
+. nr doc-reg-Rd +1
+. \}
+.
+. tm doc-book-count == \n[doc-book-count]
+. tm doc-book-name == '\*[doc-book-name]'
+. tm doc-date-count == \n[doc-date-count]
+. tm doc-date == '\*[doc-date]'
+. tm doc-publisher-count == \n[doc-publisher-count]
+. tm doc-publisher-name == '\*[doc-publisher-name]'
+. tm doc-journal-count == \n[doc-journal-count]
+. tm doc-journal-name == '\*[doc-journal-name]'
+. tm doc-issue-count == \n[doc-issue-count]
+. tm doc-issue-name == '\*[doc-issue-name]'
+. tm doc-optional-count == \n[doc-optional-count]
+. tm doc-optional-string == '\*[doc-optional-string]'
+. tm doc-page-number-count == \n[doc-page-number-count]
+. tm doc-page-number-string == '\*[doc-page-number-string]'
+. tm doc-corporate-count == \n[doc-corporate-count]
+. tm doc-corporate-name == '\*[doc-corporate-name]'
+. tm doc-report-count == \n[doc-report-count]
+. tm doc-report-name == '\*[doc-report-name]'
+. tm doc-reference-title-count == \n[doc-reference-title-count]
+. tm doc-reference-title-name == '\*[doc-reference-title-name]'
+. tm doc-reference-title-name-for-book == '\*[doc-reference-title-name-for-book]'
+. tm doc-url-count == \n[doc-url-count]
+. tm doc-url-name == '\*[doc-url-name]'
+. tm doc-volume-count == \n[doc-volume-count]
+. tm doc-volume-name == '\*[doc-volume-name]'
+. tm doc-have-author == \n[doc-have-author]
+.
+. tm doc-page-topic == '\*[doc-page-topic]'
+. tm doc-volume == '\*[doc-volume]'
+. tm doc-section == '\*[doc-section]'
+. tm doc-operating-system == '\*[doc-operating-system]'
+. tm doc-date-string == '\*[doc-date-string]'
+. tm doc-display-vertical == \n[doc-display-vertical]
+. tm doc-in-name-section == \n[doc-in-name-section]
+. tm doc-in-synopsis-section == \n[doc-in-synopsis-section]
+. tm doc-in-library-section == \n[doc-in-library-section]
+. tm doc-in-see-also-section == \n[doc-in-see-also-section]
+. tm doc-in-files-section == \n[doc-in-files-section]
+. tm doc-in-authors-section == \n[doc-in-authors-section]
+.
+. tm END OF GLOBAL REGISTER DUMP
+..
+.ec
+.
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/mdoc/doc-ditroff b/tmac/mdoc/doc-ditroff
new file mode 100644
index 0000000..96cb2f7
--- /dev/null
+++ b/tmac/mdoc/doc-ditroff
@@ -0,0 +1,287 @@
+.\" Copyright (c) 1991, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in
+.\" the documentation and/or other materials provided with the
+.\" distribution.
+.\" 3. [Deleted. See
+.\" ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change]
+.\" 4. Neither the name of the University nor the names of its
+.\" contributors may be used to endorse or promote products derived
+.\" from this software without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS"
+.\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+.\" PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
+.\" CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)doc-ditroff 8.1 (Berkeley) 06/08/93
+.
+.
+.\" Use -rS={11,12} to change the font size from 10pt to 11pt or 12pt.
+.if !r S .nr S 10
+.
+.ie (\n[S] == 11) \{\
+. ps 10.95z
+. vs 13.6p
+.\}
+.el \{ .ie (\n[S] == 12) \{\
+. ps 12z
+. vs 14.5p
+.\}
+.el \{\
+. ps 10z
+. vs 12p
+.\}\}
+.
+.
+.\" the 'doc-xx-font' strings must not be empty!
+.
+.ds doc-page-topic-font \f[I]
+.ds doc-page-section-font \f[R]
+.ds doc-Ad-font \f[I]
+.ds doc-Ar-font \f[CI]
+.ds doc-Cm-font \f[CR]
+.ds doc-Em-font \f[I]
+.ds doc-Er-font \f[CR]
+.ds doc-Ev-font \f[CR]
+.ds doc-Fa-font \f[CI]
+.ds doc-Fd-font \f[CB]
+.ds doc-Fl-font \f[CR]
+.ds doc-Fn-font \f[CB]
+.ds doc-Ft-font \f[CI]
+.ds doc-Ic-font \f[CB]
+.ds doc-Li-font \f[CR]
+.ds doc-Lk-font \f[R]\"
+.ds doc-Me-font \f[B]
+.ds doc-Nm-font \f[CB]
+.ds doc-No-font \f[R]
+.ds doc-Pa-font \f[I]
+.ds doc-Sh-font \f[\*[HF]]\"
+.ds doc-Sy-font \f[B]
+.ds doc-Tn-font \f[R]
+.ds doc-Va-font \f[I]
+.ds doc-Xr-font \f[I]
+.
+.ds doc-left-parenthesis \f[R](\f[]
+.ds doc-right-parenthesis \f[R])\f[]
+.ds lp \f[R](\f[]
+.ds rp \f[R])\f[]
+.ds doc-left-bracket \f[R][\f[]
+.ds doc-right-bracket \f[R]]\f[]
+.
+.tr *\[**]
+.
+.\" miscellaneous
+.nr doc-paragraph-space .4v
+.
+.nr doc-digit-width \w'\0'u
+.nr doc-fixed-width \w'\f[CR]0'
+.
+.
+.\" NS doc-display-vertical global register
+.\" NS vertical space between list elements etc.
+.
+.nr doc-display-vertical 0
+.
+.
+.\" NS doc-setup-page-layout macro
+.\" NS set up page layout
+.\" NS
+.\" NS modifies:
+.\" NS doc-display-vertical
+.\" NS doc-line-length
+.
+.eo
+.de doc-setup-page-layout
+. ie r LL \
+. ll \n[LL]u
+. el \
+. ll \n[.l]u
+.
+. ie r LT \
+. lt \n[LT]u
+. el \
+. lt \n[.l]u
+.
+. po 1i
+.
+. nr doc-display-vertical .5v
+. nr doc-line-length \n[.l]
+..
+.ec
+.
+.
+.ds doc-left-singlequote \[oq]
+.ds doc-right-singlequote \[cq]
+.
+.\" the following strings are 'official'
+.ds <= \[<=]
+.ds >= \[>=]
+.ds Lq \[lq]
+.ds Rq \[rq]
+.ds ua \[ua]
+.ds aa \[aa]
+.ds ga \[ga]
+.ds q \[dq]
+.ds Pi \[*p]
+.ds Ne \[!=]
+.ds Le \[<=]
+.ds Ge \[>=]
+.ds Lt <
+.ds Gt >
+.ds Pm \[+-]
+.ds If \[if]
+.ds Na \f[I]NaN\f[]
+.ds Ba \f[R]|\f[]
+.ds Am &
+.
+.
+.\" NS doc-get-width macro
+.\" NS computes the width of a string as a multiple of
+.\" NS 'doc-fixed-width': '.doc-get-width string'
+.\" NS
+.\" NS modifies:
+.\" NS doc-width
+.
+.eo
+.de doc-get-width
+. nr doc-width \w'\f[CR]\$1'
+. ie (\n[doc-width] >= \n[doc-fixed-width]) \{\
+. ie (\n[doc-width] % \n[doc-fixed-width]) \
+. nr doc-width ((\n[doc-width] / \n[doc-fixed-width]) + 1)
+. el \
+. nr doc-width (\n[doc-width] / \n[doc-fixed-width])
+. \}
+. el \{\
+. ie \n[doc-width] \
+. nr doc-width 1
+. el \
+. nr doc-width 0
+. \}
+..
+.ec
+.
+.
+.\" NS doc-get-arg-width macro
+.\" NS computes the width of an argument as a multiple of
+.\" NS 'doc-fixed-width': '.doc-get-arg-width arg-index'
+.\" NS
+.\" NS modifies:
+.\" NS doc-width
+.
+.eo
+.de doc-get-arg-width
+. nr doc-width \w'\f[CR]\*[doc-arg\$1]'
+. ie (\n[doc-width] >= \n[doc-fixed-width]) \{\
+. ie (\n[doc-width] % \n[doc-fixed-width]) \
+. nr doc-width ((\n[doc-width] / \n[doc-fixed-width]) + 1)
+. el \
+. nr doc-width (\n[doc-width] / \n[doc-fixed-width])
+. \}
+. el \{\
+. ie \n[doc-width] \
+. nr doc-width 1
+. el \
+. nr doc-width 0
+. \}
+..
+.ec
+.
+.
+.\" NS Ql user macro
+.\" NS quoted literal define
+.\" NS
+.\" NS modifies:
+.\" NS doc-argXXX
+.\" NS doc-arg-count
+.\" NS doc-arg-ptr
+.\" NS doc-macro-name
+.\" NS doc-spaceXXX
+.\" NS doc-typeXXX
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-Ql
+.\" NS doc-reg-Ql1
+.\" NS doc-reg-Ql2
+.\" NS
+.\" NS width register 'Ql' set in doc-common
+.
+.eo
+.de Ql
+. if !\n[doc-arg-count] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Ql
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .Ql argument ... (#\n[.c])
+. \}
+.
+. nr doc-reg-Ql (\n[doc-arg-ptr] + 1)
+. doc-get-arg-width \n[doc-reg-Ql]
+.
+. \" don't use quotes if we have more than two succeeding string
+. \" arguments
+. nr doc-reg-Ql +1
+. if (\n[doc-arg-count] >= \n[doc-reg-Ql]) \
+. if (\n[doc-type\n[doc-reg-Ql]] == 2) \
+. nr doc-width 3
+.
+. \" make a difference in quotation style for strings longer
+. \" than two characters
+. ie (\n[doc-width] > 2) \
+. Li
+. el \{\
+. ie \n[doc-arg-ptr] \{\
+. \" we replace 'Ql' with 'Li'
+. ds doc-arg\n[doc-arg-ptr] Li
+. nr doc-arg-ptr -1
+. \}
+. el \{\
+. \" if .Ql has been called directly, we must shift all elements in
+. \" the argument vector to the right so that we can insert 'Li'
+. nr doc-reg-Ql \n[doc-arg-count]
+. nr doc-reg-Ql1 (\n[doc-arg-count] + 1)
+. while \n[doc-reg-Ql] \{\
+. rn doc-arg\n[doc-reg-Ql] doc-arg\n[doc-reg-Ql1]
+. rnn doc-type\n[doc-reg-Ql] doc-type\n[doc-reg-Ql1]
+. rn doc-space\n[doc-reg-Ql] doc-space\n[doc-reg-Ql1]
+. nr doc-reg-Ql -1
+. nr doc-reg-Ql1 -1
+. \}
+. ds doc-arg1 Li
+. nr doc-type1 1
+. ds doc-space1
+. nr doc-arg-count +1
+. \}
+.
+. ds doc-quote-left "\*[doc-left-singlequote]
+. ds doc-quote-right "\*[doc-right-singlequote]
+. doc-enclose-string
+. \}
+..
+.ec
+.
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/mdoc/doc-nroff b/tmac/mdoc/doc-nroff
new file mode 100644
index 0000000..5167af3
--- /dev/null
+++ b/tmac/mdoc/doc-nroff
@@ -0,0 +1,229 @@
+.\" Copyright (c) 1991, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in
+.\" the documentation and/or other materials provided with the
+.\" distribution.
+.\" 3. [Deleted. See
+.\" ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change]
+.\" 4. Neither the name of the University nor the names of its
+.\" contributors may be used to endorse or promote products derived
+.\" from this software without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS"
+.\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+.\" PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
+.\" CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)doc-nroff 8.1 (Berkeley) 06/08/93
+.
+.
+.\" nroff devices can't change the type size; this value is notional.
+.nr S 10
+.
+.\" Map monospaced fonts to standard styles.
+.ftr CR R
+.ftr CI I
+.ftr CB B
+.ftr CBI BI
+.
+.\" the 'doc-xx-font' strings must not be empty!
+.
+.ds doc-page-topic-font \f[I]
+.ds doc-page-section-font \f[R]
+.ds doc-Ad-font \f[I]
+.ds doc-Ar-font \f[I]
+.ds doc-Cm-font \f[B]
+.ds doc-Em-font \f[I]
+.ds doc-Er-font \f[R]
+.ds doc-Ev-font \f[R]
+.ds doc-Fa-font \f[I]
+.ds doc-Fd-font \f[B]
+.ds doc-Fl-font \f[B]
+.ds doc-Fn-font \f[B]
+.ds doc-Ft-font \f[I]
+.ds doc-Ic-font \f[B]
+.ds doc-Li-font \f[B]
+.ds doc-Lk-font \f[R]\"
+.ds doc-Me-font \f[B]
+.ds doc-Nm-font \f[B]
+.ds doc-No-font \f[R]
+.ds doc-Pa-font \f[I]
+.ds doc-Sh-font \f[\*[HF]]\"
+.ds doc-Sy-font \f[B]
+.ds doc-Tn-font \f[R]
+.ds doc-Va-font \f[I]
+.ds doc-Xr-font \f[I]
+.
+.ds doc-left-parenthesis \f[R](\f[]
+.ds doc-right-parenthesis \f[R])\f[]
+.ds lp \f[R](\f[]
+.ds rp \f[R])\f[]
+.ds doc-left-bracket \f[R][\f[]
+.ds doc-right-bracket \f[R]]\f[]
+.
+.\" miscellaneous
+.nr doc-paragraph-space 1v
+.
+.nr doc-digit-width \w'\0\0'u
+.nr doc-fixed-width \w'0'
+.
+.
+.\" NS doc-display-vertical global register
+.\" NS vertical space between list elements etc.
+.
+.nr doc-display-vertical 0
+.
+.
+.\" NS doc-setup-page-layout macro
+.\" NS set up page layout
+.\" NS
+.\" NS modifies:
+.\" NS doc-display-vertical
+.\" NS doc-line-length
+.
+.eo
+.de doc-setup-page-layout
+. ie r LL \
+. ll \n[LL]u
+. el \
+. ll 78n
+.
+. ie r LT \
+. lt \n[LT]u
+. el \
+. lt \n[.l]u
+.
+. po 0i
+.
+. nr doc-display-vertical 1v
+. nr doc-line-length \n[.l]
+..
+.ec
+.
+.ds doc-left-singlequote \[oq]
+.ds doc-right-singlequote \[cq]
+.
+.\" the following strings are 'official'
+.ds <= \[<=]
+.ds >= \[>=]
+.ds aa \[aa]
+.ds ga \[ga]
+.ds q \[dq]
+.ds Lq \[lq]
+.ds Rq \[rq]
+.ds Ne \[!=]
+.ds Le \[<=]
+.ds Ge \[>=]
+.ds Lt <
+.ds Gt >
+.ds Pm \[+-]
+.ds Na \f[I]NaN\f[]
+.ds Ba \f[R]|\f[]
+.ds Am &
+.
+.\" Unicode TTYs have all glyph forms; for other TTY character sets we
+.\" need character representations which are different from GNU troff's
+.\" standard forms.
+.ie '\*[.T]'utf8' \{\
+. ds ua \[ua]
+. ds Pi \[*p]
+. ds If \[if]
+.\}
+.el \{\
+. ds ua ^
+. ds Pi pi
+. ds If infinity
+.\}
+.
+.
+.\" NS doc-get-width macro
+.\" NS computes the width of a string as a multiple of
+.\" NS 'doc-fixed-width': '.doc-get-width string'
+.\" NS
+.\" NS modifies:
+.\" NS doc-width
+.
+.eo
+.de doc-get-width
+. nr doc-width \w'\$1'
+. ie (\n[doc-width] >= \n[doc-fixed-width]) \{\
+. ie (\n[doc-width] % \n[doc-fixed-width]) \
+. nr doc-width ((\n[doc-width] / \n[doc-fixed-width]) + 1)
+. el \
+. nr doc-width (\n[doc-width] / \n[doc-fixed-width])
+. \}
+. el \
+. nr doc-width 0
+..
+.ec
+.
+.
+.\" NS doc-get-arg-width macro
+.\" NS computes the width of an argument as a multiple of
+.\" NS 'doc-fixed-width': '.doc-get-arg-width arg-index'
+.\" NS
+.\" NS modifies:
+.\" NS doc-width
+.
+.eo
+.de doc-get-arg-width
+. nr doc-width \w'\*[doc-arg\$1]'
+. ie (\n[doc-width] >= \n[doc-fixed-width]) \{\
+. ie (\n[doc-width] % \n[doc-fixed-width]) \
+. nr doc-width ((\n[doc-width] / \n[doc-fixed-width]) + 1)
+. el \
+. nr doc-width (\n[doc-width] / \n[doc-fixed-width])
+. \}
+. el \
+. nr doc-width 0
+..
+.ec
+.
+.
+.\" NS Ql user macro
+.\" NS quoted literal define
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register 'Ql' set in doc-common
+.
+.eo
+.de Ql
+. if !\n[doc-arg-count] \{\
+. ie \n[.$] \
+. ds doc-macro-name Ql
+. el \
+. tm Usage: .Ql argument ... (#\n[.c])
+. \}
+.
+. ds doc-quote-left "\*[doc-left-singlequote]
+. ds doc-quote-right "\*[doc-right-singlequote]
+.
+. doc-enclose-string \$@
+..
+.ec
+.
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/mdoc/doc-syms b/tmac/mdoc/doc-syms
new file mode 100644
index 0000000..8f5998c
--- /dev/null
+++ b/tmac/mdoc/doc-syms
@@ -0,0 +1,908 @@
+.\" Copyright (c) 1991, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in
+.\" the documentation and/or other materials provided with the
+.\" distribution.
+.\" 3. [Deleted. See
+.\" ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change]
+.\" 4. Neither the name of the University nor the names of its
+.\" contributors may be used to endorse or promote products derived
+.\" from this software without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS"
+.\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+.\" PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
+.\" CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)doc-syms 8.1 (Berkeley) 06/08/93
+.
+.
+.\" NS Ux user macro
+.\" NS format Unix
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variable:
+.\" NS doc-str-Ux
+.\" NS
+.\" NS width register 'Ux' defined in doc-common
+.
+.eo
+.de Ux
+. nr doc-curr-font \n[.f]
+. ds doc-str-Ux \f[\n[doc-curr-font]]
+.
+. if !\n[doc-arg-count] \
+. if \n[.$] \{\
+. ds doc-macro-name Ux
+. doc-parse-args \$@
+. \}
+.
+. \" replace current argument with result
+. ds doc-arg\n[doc-arg-ptr] Unix\*[doc-str-Ux]
+. rm doc-str-Ux
+. nr doc-type\n[doc-arg-ptr] 2
+. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
+.
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-count] - \n[doc-arg-ptr])
+. nr doc-arg-count \n[doc-arg-ptr]
+. if \n[doc-num-args] \
+. doc-parse-space-vector
+.
+. doc-print-recursive
+..
+.ec
+.
+.
+.\" NS Bx user macro
+.\" NS print BSD (fix smaller nroff version)
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variable:
+.\" NS doc-str-Bx
+.\" NS doc-str-Bx1
+.\" NS doc-str-Bx-XXX
+.\" NS
+.\" NS width register 'Bx' defined in doc-common
+.
+.ds doc-str-Bx-Reno \-Reno
+.ds doc-str-Bx-reno \-Reno
+.ds doc-str-Bx-Tahoe \-Tahoe
+.ds doc-str-Bx-tahoe \-Tahoe
+.ds doc-str-Bx-Lite \-Lite
+.ds doc-str-Bx-lite \-Lite
+.ds doc-str-Bx-Lite2 \-Lite2
+.ds doc-str-Bx-lite2 \-Lite2
+.
+.eo
+.de Bx
+. nr doc-curr-font \n[.f]
+. ds doc-str-Bx \f[\n[doc-curr-font]]
+.
+. \" default value if no argument
+. ds doc-str-Bx1 BSD\*[doc-str-Bx]
+.
+. if !\n[doc-arg-count] \
+. if \n[.$] \{\
+. ds doc-macro-name Bx
+. doc-parse-args \$@
+. \}
+.
+. if (\n[doc-arg-count] > \n[doc-arg-ptr]) \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. ie "\*[doc-arg\n[doc-arg-ptr]]"-alpha" \
+. as doc-str-Bx1 " (currently in alpha test)
+. el \{ .ie "\*[doc-arg\n[doc-arg-ptr]]"-beta" \
+. as doc-str-Bx1 " (currently in beta test)
+. el \{ .ie "\*[doc-arg\n[doc-arg-ptr]]"-devel" \
+. as doc-str-Bx1 " (currently under development)
+. el \{\
+. ds doc-str-Bx1 \&\*[doc-arg\n[doc-arg-ptr]]\^
+. as doc-str-Bx1 BSD\*[doc-str-Bx]
+.
+. if (\n[doc-arg-count] > \n[doc-arg-ptr]) \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. ie (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. ie d doc-str-Bx-\*[doc-arg\n[doc-arg-ptr]] \
+. as doc-str-Bx1 "\*[doc-str-Bx-\*[doc-arg\n[doc-arg-ptr]]]
+. el \
+. nr doc-arg-ptr -1
+. \}
+. el \
+. nr doc-arg-ptr -1
+. \}
+. el \
+. nr doc-arg-ptr -1
+. \}\}\}\}\}
+. el \
+. nr doc-arg-ptr -1
+. \}
+.
+. \" replace current argument with result
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-str-Bx1]
+. nr doc-type\n[doc-arg-ptr] 2
+. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
+.
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-count] - \n[doc-arg-ptr])
+. nr doc-arg-count \n[doc-arg-ptr]
+. if \n[doc-num-args] \
+. doc-parse-space-vector
+.
+. doc-print-recursive
+..
+.ec
+.
+.
+.\" NS Ud user macro (not parsed, not callable)
+.\" NS print "currently under development" (HISTORY section)
+.\" NS
+.\" NS width register 'Ud' defined in doc-common
+.
+.eo
+.de Ud
+. nop \&currently under development.
+..
+.ec
+.
+.
+.\" NS At user macro
+.\" NS print AT&T UNIX
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variable:
+.\" NS doc-str-At
+.\" NS doc-str-At1
+.\" NS doc-str-At-XXX
+.\" NS
+.\" NS width register 'At' defined in doc-common
+.
+.eo
+.ds doc-str-At-32v \&Version\~7
+.as doc-str-At-32v " AT&T UNIX\*[doc-str-At]/32V
+.ds doc-str-At-v1 \&Version\~1
+.as doc-str-At-v1 " AT&T UNIX\*[doc-str-At]
+.ds doc-str-At-v2 \&Version\~2
+.as doc-str-At-v2 " AT&T UNIX\*[doc-str-At]
+.ds doc-str-At-v3 \&Version\~3
+.as doc-str-At-v3 " AT&T UNIX\*[doc-str-At]
+.ds doc-str-At-v4 \&Version\~4
+.as doc-str-At-v4 " AT&T UNIX\*[doc-str-At]
+.ds doc-str-At-v5 \&Version\~5
+.as doc-str-At-v5 " AT&T UNIX\*[doc-str-At]
+.ds doc-str-At-v6 \&Version\~6
+.as doc-str-At-v6 " AT&T UNIX\*[doc-str-At]
+.ds doc-str-At-v7 \&Version\~7
+.as doc-str-At-v7 " AT&T UNIX\*[doc-str-At]
+.ds doc-str-At-III AT&T\*[doc-str-At] System\~III
+.as doc-str-At-III " UNIX\*[doc-str-At]
+.ds doc-str-At-V AT&T\*[doc-str-At] System\~V
+.as doc-str-At-V " UNIX\*[doc-str-At]
+.ds doc-str-At-V.1 AT&T\*[doc-str-At] System\~V Release\~1
+.as doc-str-At-V.1 " UNIX\*[doc-str-At]
+.ds doc-str-At-V.2 AT&T\*[doc-str-At] System\~V Release\~2
+.as doc-str-At-V.2 " UNIX\*[doc-str-At]
+.ds doc-str-At-V.3 AT&T\*[doc-str-At] System\~V Release\~3
+.as doc-str-At-V.3 " UNIX\*[doc-str-At]
+.ds doc-str-At-V.4 AT&T\*[doc-str-At] System\~V Release\~4
+.as doc-str-At-V.4 " UNIX\*[doc-str-At]
+.
+.de At
+. nr doc-curr-font \n[.f]
+. ds doc-str-At \f[\n[doc-curr-font]]
+.
+. \" default value if no argument
+. ds doc-str-At1 AT&T UNIX\*[doc-str-At]
+.
+. if !\n[doc-arg-count] \
+. if \n[.$] \{\
+. ds doc-macro-name At
+. doc-parse-args \$@
+. \}
+.
+. if (\n[doc-arg-count] > \n[doc-arg-ptr]) \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. ie \A'\*[doc-arg\n[doc-arg-ptr]]' \{\
+. ie d doc-str-At-\*[doc-arg\n[doc-arg-ptr]] \
+. ds doc-str-At1 "\*[doc-str-At-\*[doc-arg\n[doc-arg-ptr]]]
+. el \{\
+. tmc mdoc warning: .At: Unknown AT&T UNIX version
+. tm1 " '\*[doc-arg\n[doc-arg-ptr]]' (#\n[.c])
+. nr doc-arg-ptr -1
+. \}\}
+. el \
+. nr doc-arg-ptr -1
+. \}
+. el \
+. nr doc-arg-ptr -1
+. \}
+.
+. \" replace current argument with result
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-str-At1]
+. nr doc-type\n[doc-arg-ptr] 2
+. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
+.
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-count] - \n[doc-arg-ptr])
+. nr doc-arg-count \n[doc-arg-ptr]
+. if \n[doc-num-args] \
+. doc-parse-space-vector
+.
+. doc-print-recursive
+..
+.ec
+.
+.
+.\" NS Dx user macro
+.\" NS print DragonFly
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variable:
+.\" NS doc-str-Dx
+.\" NS doc-str-Dx1
+.\" NS
+.\" NS width register 'Dx' defined in doc-common
+.
+.\" we use the doc-operating-system-DragonFly-* strings defined in
+.\" doc-common
+.
+.eo
+.de Dx
+. nr doc-curr-font \n[.f]
+. ds doc-str-Dx \f[\n[doc-curr-font]]
+.
+. \" default value if no argument
+. ds doc-str-Dx1 \%DragonFly\*[doc-str-Dx]
+.
+. if !\n[doc-arg-count] \
+. if \n[.$] \{\
+. ds doc-macro-name Dx
+. doc-parse-args \$@
+. \}
+.
+. if (\n[doc-arg-count] > \n[doc-arg-ptr]) \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. ie \A'\*[doc-arg\n[doc-arg-ptr]]' \{\
+. ie d doc-operating-system-DragonFly-\*[doc-arg\n[doc-arg-ptr]] \
+. as doc-str-Dx1 \~\*[doc-operating-system-DragonFly-\*[doc-arg\n[doc-arg-ptr]]]
+. el \{\
+. tmc mdoc warning: .Dx: Unknown DragonFly version
+. tm1 " '\*[doc-arg\n[doc-arg-ptr]]' (#\n[.c])
+. as doc-str-Dx1 \~\*[doc-arg\n[doc-arg-ptr]]
+. \}\}
+. el \
+. as doc-str-Dx1 \~\*[doc-arg\n[doc-arg-ptr]]
+. \}
+. el \
+. nr doc-arg-ptr -1
+. \}
+.
+. \" replace current argument with result
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-str-Dx1]
+. nr doc-type\n[doc-arg-ptr] 2
+. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
+.
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-count] - \n[doc-arg-ptr])
+. nr doc-arg-count \n[doc-arg-ptr]
+. if \n[doc-num-args] \
+. doc-parse-space-vector
+.
+. doc-print-recursive
+..
+.ec
+.
+.
+.\" NS Fx user macro
+.\" NS print FreeBSD
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variable:
+.\" NS doc-str-Fx
+.\" NS doc-str-Fx1
+.\" NS
+.\" NS width register 'Fx' defined in doc-common
+.
+.\" we use the doc-operating-system-FreeBSD-* strings defined in
+.\" doc-common
+.
+.eo
+.de Fx
+. nr doc-curr-font \n[.f]
+. ds doc-str-Fx \f[\n[doc-curr-font]]
+.
+. \" default value if no argument
+. ds doc-str-Fx1 \%FreeBSD\*[doc-str-Fx]
+.
+. if !\n[doc-arg-count] \
+. if \n[.$] \{\
+. ds doc-macro-name Fx
+. doc-parse-args \$@
+. \}
+.
+. if (\n[doc-arg-count] > \n[doc-arg-ptr]) \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. ie \A'\*[doc-arg\n[doc-arg-ptr]]' \{\
+. ie d doc-operating-system-FreeBSD-\*[doc-arg\n[doc-arg-ptr]] \
+. as doc-str-Fx1 \~\*[doc-operating-system-FreeBSD-\*[doc-arg\n[doc-arg-ptr]]]
+. el \{\
+. tmc mdoc warning: .Fx: Unknown FreeBSD version
+. tm1 " '\*[doc-arg\n[doc-arg-ptr]]' (#\n[.c])
+. as doc-str-Fx1 \~\*[doc-arg\n[doc-arg-ptr]]
+. \}\}
+. el \
+. as doc-str-Fx1 \~\*[doc-arg\n[doc-arg-ptr]]
+. \}
+. el \
+. nr doc-arg-ptr -1
+. \}
+.
+. \" replace current argument with result
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-str-Fx1]
+. nr doc-type\n[doc-arg-ptr] 2
+. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
+.
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-count] - \n[doc-arg-ptr])
+. nr doc-arg-count \n[doc-arg-ptr]
+. if \n[doc-num-args] \
+. doc-parse-space-vector
+.
+. doc-print-recursive
+..
+.ec
+.
+.
+.\" NS Nx user macro
+.\" NS print NetBSD
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variable:
+.\" NS doc-str-Nx
+.\" NS doc-str-Nx1
+.\" NS
+.\" NS width register 'Nx' defined in doc-common
+.
+.\" we use the doc-operating-system-NetBSD-* strings defined in
+.\" doc-common
+.
+.eo
+.de Nx
+. nr doc-curr-font \n[.f]
+. ds doc-str-Nx \f[\n[doc-curr-font]]
+.
+. \" default value if no argument
+. ds doc-str-Nx1 \%Net
+. as doc-str-Nx1 BSD\*[doc-str-Nx]
+.
+. if !\n[doc-arg-count] \
+. if \n[.$] \{\
+. ds doc-macro-name Nx
+. doc-parse-args \$@
+. \}
+.
+. if (\n[doc-arg-count] > \n[doc-arg-ptr]) \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. ie \A'\*[doc-arg\n[doc-arg-ptr]]' \{\
+. ie d doc-operating-system-NetBSD-\*[doc-arg\n[doc-arg-ptr]] \
+. as doc-str-Nx1 \~\*[doc-operating-system-NetBSD-\*[doc-arg\n[doc-arg-ptr]]]
+. el \{\
+. tmc mdoc warning: .Nx: Unknown NetBSD version
+. tm1 " '\*[doc-arg\n[doc-arg-ptr]]' (#\n[.c])
+. as doc-str-Nx1 \~\*[doc-arg\n[doc-arg-ptr]]
+. \}\}
+. el \
+. as doc-str-Nx1 \~\*[doc-arg\n[doc-arg-ptr]]
+. \}
+. el \
+. nr doc-arg-ptr -1
+. \}
+.
+. \" replace current argument with result
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-str-Nx1]
+. nr doc-type\n[doc-arg-ptr] 2
+. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
+.
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-count] - \n[doc-arg-ptr])
+. nr doc-arg-count \n[doc-arg-ptr]
+. if \n[doc-num-args] \
+. doc-parse-space-vector
+.
+. doc-print-recursive
+..
+.ec
+.
+.
+.\" NS Ox user macro
+.\" NS print OpenBSD
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variable:
+.\" NS doc-str-Ox
+.\" NS doc-str-Ox1
+.\" NS
+.\" NS width register 'Ox' defined in doc-common
+.
+.eo
+.de Ox
+. nr doc-curr-font \n[.f]
+. ds doc-str-Ox \f[\n[doc-curr-font]]
+.
+. \" default value if no argument
+. ds doc-str-Ox1 \%OpenBSD\*[doc-str-Ox]
+.
+. if !\n[doc-arg-count] \
+. if \n[.$] \{\
+. ds doc-macro-name Ox
+. doc-parse-args \$@
+. \}
+.
+. if (\n[doc-arg-count] > \n[doc-arg-ptr]) \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-type\n[doc-arg-ptr]] == 2) \
+. as doc-str-Ox1 \~\*[doc-arg\n[doc-arg-ptr]]
+. el \
+. nr doc-arg-ptr -1
+. \}
+.
+. \" replace current argument with result
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-str-Ox1]
+. nr doc-type\n[doc-arg-ptr] 2
+. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
+.
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-count] - \n[doc-arg-ptr])
+. nr doc-arg-count \n[doc-arg-ptr]
+. if \n[doc-num-args] \
+. doc-parse-space-vector
+.
+. doc-print-recursive
+..
+.ec
+.
+.
+.\" NS Bsx user macro
+.\" NS print BSD/OS
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variable:
+.\" NS doc-str-Bsx
+.\" NS doc-str-Bsx1
+.\" NS
+.\" NS width register 'Bsx' defined in doc-common
+.
+.eo
+.de Bsx
+. nr doc-curr-font \n[.f]
+. ds doc-str-Bsx \f[\n[doc-curr-font]]
+.
+. \" default value if no argument
+. ds doc-str-Bsx1 BSD/OS\*[doc-str-Bsx]
+.
+. if !\n[doc-arg-count] \
+. if \n[.$] \{\
+. ds doc-macro-name Bsx
+. doc-parse-args \$@
+. \}
+.
+. if (\n[doc-arg-count] > \n[doc-arg-ptr]) \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-type\n[doc-arg-ptr]] == 2) \
+. as doc-str-Bsx1 \~\*[doc-arg\n[doc-arg-ptr]]
+. el \
+. nr doc-arg-ptr -1
+. \}
+.
+. \" replace current argument with result
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-str-Bsx1]
+. nr doc-type\n[doc-arg-ptr] 2
+. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
+.
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-count] - \n[doc-arg-ptr])
+. nr doc-arg-count \n[doc-arg-ptr]
+. if \n[doc-num-args] \
+. doc-parse-space-vector
+.
+. doc-print-recursive
+..
+.ec
+.
+.
+.\" The Bt macro should go away now
+.
+.\" NS Bt user macro (not parsed, not callable)
+.\" NS print "is currently in beta test." (HISTORY section)
+.\" NS
+.\" NS width register 'Bt' defined in doc-common
+.
+.eo
+.de Bt
+. nop \&is currently in beta test.
+..
+.ec
+.
+.
+.\" NS Px user macro
+.\" NS print POSIX
+.
+.eo
+.ds Px \%POSIX
+.ec
+.
+.
+.\" NS Ai user macro
+.\" NS print ANSI
+.
+.eo
+.ds Ai \%ANSI
+.ec
+.
+.
+.\" NS St user macro
+.\" NS standards (posix, ansi - formal standard names)
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variable:
+.\" NS doc-reg-St
+.\" NS doc-str-St
+.\" NS doc-str-St1
+.\" NS doc-str-St-XXX
+.\" NS
+.\" NS width register 'St' defined in doc-common
+.
+.\" ANSI/ISO C
+.eo
+.ds doc-str-St--ansiC-89 \*[Ai] \*[doc-str-St]X\^3.159-1989
+.as doc-str-St--ansiC-89 " (\*[Lq]\)\*[Ai]\~C89\*[doc-str-St]\*[Rq])
+.als doc-str-St--ansiC doc-str-St--ansiC-89
+.ds doc-str-St--isoC ISO/IEC\*[doc-str-St] 9899:1990
+.as doc-str-St--isoC " (\*[Lq]ISO\~C\^90\*[doc-str-St]\*[Rq])
+.als doc-str-St--isoC-90 doc-str-St--isoC
+.ds doc-str-St--isoC-2011 ISO/IEC\*[doc-str-St] 9899:2011
+.as doc-str-St--isoC-2011 " (\*[Lq]ISO\~C\^11\*[doc-str-St]\*[Rq])
+.ds doc-str-St--isoC-99 ISO/IEC\*[doc-str-St] 9899:1999
+.as doc-str-St--isoC-99 " (\*[Lq]ISO\~C\^99\*[doc-str-St]\*[Rq])
+.ds doc-str-St--isoC-amd1 ISO/IEC\*[doc-str-St] 9899/AMD1:1995
+.as doc-str-St--isoC-amd1 " (\*[Lq]ISO\~C\^90\*[doc-str-St], Amendment 1\*[Rq])
+.ds doc-str-St--isoC-tcor1 ISO/IEC\*[doc-str-St] 9899/TCOR1:1994
+.as doc-str-St--isoC-tcor1 " (\*[Lq]ISO\~C\^90\*[doc-str-St], Technical Corrigendum 1\*[Rq])
+.ds doc-str-St--isoC-tcor2 ISO/IEC\*[doc-str-St] 9899/TCOR2:1995
+.as doc-str-St--isoC-tcor2 " (\*[Lq]ISO\~C\^90\*[doc-str-St], Technical Corrigendum 2\*[Rq])
+.ec
+.
+.\" POSIX Part 1: System API
+.eo
+.ds doc-str-St--p1003.1 \%IEEE\*[doc-str-St] Std 1003.1
+.as doc-str-St--p1003.1 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq])
+.ds doc-str-St--p1003.1b \%IEEE\*[doc-str-St] Std 1003.1b
+.as doc-str-St--p1003.1b " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq])
+.ds doc-str-St--p1003.1-88 \%IEEE\*[doc-str-St] Std 1003.1-1988
+.as doc-str-St--p1003.1-88 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq])
+.ds doc-str-St--p1003.1-90 ISO/IEC\*[doc-str-St] 9945-1:1990
+.as doc-str-St--p1003.1-90 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq])
+.als doc-str-St--iso9945-1-90 doc-str-St--p1003.1-90
+.ds doc-str-St--p1003.1b-93 \%IEEE\*[doc-str-St] Std 1003.1b-1993
+.as doc-str-St--p1003.1b-93 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq])
+.ds doc-str-St--p1003.1c-95 \%IEEE\*[doc-str-St] Std 1003.1c-1995
+.as doc-str-St--p1003.1c-95 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq])
+.ds doc-str-St--p1003.1i-95 \%IEEE\*[doc-str-St] Std 1003.1i-1995
+.as doc-str-St--p1003.1i-95 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq])
+.ds doc-str-St--p1003.1-96 ISO/IEC\*[doc-str-St] 9945-1:1996
+.as doc-str-St--p1003.1-96 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq])
+.als doc-str-St--iso9945-1-96 doc-str-St--p1003.1-96
+.ds doc-str-St--p1003.1g-2000 \%IEEE\*[doc-str-St] Std 1003.1g-2000
+.as doc-str-St--p1003.1g-2000 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq])
+.ds doc-str-St--p1003.1-2001 \%IEEE\*[doc-str-St] Std 1003.1-2001
+.as doc-str-St--p1003.1-2001 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq])
+.ds doc-str-St--p1003.1-2004 \%IEEE\*[doc-str-St] Std 1003.1-2004
+.as doc-str-St--p1003.1-2004 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq])
+.ds doc-str-St--p1003.1-2008 \%IEEE\*[doc-str-St] Std 1003.1-2008
+.as doc-str-St--p1003.1-2008 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq])
+.ec
+.
+.\" POSIX Part 2: Shell and Utilities
+.eo
+.ds doc-str-St--p1003.2 \%IEEE\*[doc-str-St] Std 1003.2
+.as doc-str-St--p1003.2 " (\*[Lq]\)\*[Px]\*[doc-str-St].2\*[Rq])
+.ds doc-str-St--p1003.2-92 \%IEEE\*[doc-str-St] Std 1003.2-1992
+.as doc-str-St--p1003.2-92 " (\*[Lq]\)\*[Px]\*[doc-str-St].2\*[Rq])
+.ds doc-str-St--p1003.2a-92 \%IEEE\*[doc-str-St] Std 1003.2a-1992
+.as doc-str-St--p1003.2a-92 " (\*[Lq]\)\*[Px]\*[doc-str-St].2\*[Rq])
+.ds doc-str-St--iso9945-2-93 ISO/IEC\*[doc-str-St] 9945-2:1993
+.as doc-str-St--iso9945-2-93 " (\*[Lq]\)\*[Px]\*[doc-str-St].2\*[Rq])
+.ec
+.
+.\" X/Open
+.eo
+.ds doc-str-St--susv1 Version\~1 of the Single UNIX\*[doc-str-St] Specification
+.as doc-str-St--susv1 " (\*[Lq]SUSv1\*[doc-str-St]\*[Rq])
+.ds doc-str-St--susv2 Version\~2 of the Single UNIX\*[doc-str-St] Specification
+.as doc-str-St--susv2 " (\*[Lq]SUSv2\*[doc-str-St]\*[Rq])
+.ds doc-str-St--susv3 Version\~3 of the Single UNIX\*[doc-str-St] Specification
+.as doc-str-St--susv3 " (\*[Lq]SUSv3\*[doc-str-St]\*[Rq])
+.ds doc-str-St--susv4 Version\~4 of the Single UNIX\*[doc-str-St] Specification
+.as doc-str-St--susv4 " (\*[Lq]SUSv4\*[doc-str-St]\*[Rq])
+.ds doc-str-St--svid4 System\~V Interface Definition, Fourth Edition
+.as doc-str-St--svid4 " (\*[Lq]SVID\*[doc-str-St]\^4\*[Rq])
+.ds doc-str-St--xbd5 X/Open\*[doc-str-St] Base Definitions Issue\~5
+.as doc-str-St--xbd5 " (\*[Lq]XBD\*[doc-str-St]\^5\*[Rq])
+.ds doc-str-St--xcu5 X/Open\*[doc-str-St] Commands and Utilities Issue\~5
+.as doc-str-St--xcu5 " (\*[Lq]XCU\*[doc-str-St]\^5\*[Rq])
+.ds doc-str-St--xcurses4.2 X/Open\*[doc-str-St] Curses Issue\~4, Version\~2
+.as doc-str-St--xcurses4.2 " (\*[Lq]XCURSES\*[doc-str-St]\^4.2\*[Rq])
+.ds doc-str-St--xns5 X/Open\*[doc-str-St] Networking Services Issue\~5
+.as doc-str-St--xns5 " (\*[Lq]XNS\*[doc-str-St]\^5\*[Rq])
+.ds doc-str-St--xns5.2 X/Open\*[doc-str-St] Networking Services Issue\~5.2
+.as doc-str-St--xns5.2 " (\*[Lq]XNS\*[doc-str-St]\^5.2\*[Rq])
+.ds doc-str-St--xpg3 X/Open\*[doc-str-St] Portability Guide Issue\~3
+.as doc-str-St--xpg3 " (\*[Lq]XPG\*[doc-str-St]\^3\*[Rq])
+.ds doc-str-St--xpg4 X/Open\*[doc-str-St] Portability Guide Issue\~4
+.as doc-str-St--xpg4 " (\*[Lq]XPG\*[doc-str-St]\^4\*[Rq])
+.ds doc-str-St--xpg4.2 X/Open\*[doc-str-St] Portability Guide Issue\~4, Version\~2
+.as doc-str-St--xpg4.2 " (\*[Lq]XPG\*[doc-str-St]\^4.2\*[Rq])
+.ds doc-str-St--xsh5 X/Open\*[doc-str-St] System Interfaces and Headers Issue\~5
+.as doc-str-St--xsh5 " (\*[Lq]XSH\*[doc-str-St]\^5\*[Rq])
+.ec
+.
+.\" Miscellaneous
+.eo
+.ds doc-str-St--ieee754 \%IEEE\*[doc-str-St] Std 754-1985
+.ds doc-str-St--ieee1275-94 \%IEEE\*[doc-str-St] Std 1275-1994
+.as doc-str-St--ieee1275-94 " (\*[Lq]Open Firmware\*[doc-str-St]\*[Rq])
+.ds doc-str-St--iso8601 ISO\*[doc-str-St] 8601
+.ds doc-str-St--iso8802-3 ISO/IEC\*[doc-str-St] 8802-3:1989
+.ec
+.
+.eo
+.de St
+. if !\n[doc-arg-count] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name St
+. doc-parse-args \$@
+. \}
+. el \
+. doc-St-usage
+. \}
+.
+. if !\n[doc-arg-count] \
+. return
+.
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-count] >= \n[doc-arg-ptr]) \{\
+. nr doc-curr-font \n[.f]
+. ds doc-str-St \f[\n[doc-curr-font]]
+.
+. ds doc-str-St1
+. ie \A'\*[doc-arg\n[doc-arg-ptr]]' \{\
+. ie d doc-str-St-\*[doc-arg\n[doc-arg-ptr]] \
+. ds doc-str-St1 "\*[doc-str-St-\*[doc-arg\n[doc-arg-ptr]]]
+. el \{\
+. tmc "mdoc warning: .St: Unknown standard abbreviation
+. tm1 " '\*[doc-arg\n[doc-arg-ptr]]' (#\n[.c])
+. tm1 " Please refer to the groff_mdoc(7) manpage for a
+. tm1 " list of available standard abbreviations.
+. \}\}
+. el \
+. doc-St-usage
+.
+. \" replacing argument with result
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-str-St1]
+.
+. doc-print-recursive
+. \}
+. el \{\
+. doc-St-usage
+. doc-reset-args
+. \}
+..
+.ec
+.
+.
+.\" NS doc-St-usage macro
+.
+.eo
+.de doc-St-usage
+. tm1 "Usage: .St standard (#\n[.c])
+. tm1 " Please refer to the groff_mdoc(7) manpage for a list of
+. tm1 " available standard abbreviations.
+..
+.ec
+.
+.
+.\" NS Lb user macro
+.\" NS formal library names for LIBRARY sections
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variable:
+.\" NS doc-reg-Lb
+.\" NS doc-str-Lb
+.\" NS doc-str-Lb1
+.\" NS doc-str-Lb-XXX
+.\" NS
+.\" NS width register 'Lb' defined in doc-common
+.
+.eo
+.ds doc-str-Lb-libarchive Reading and Writing Streaming Archives Library (libarchive, \-larchive)
+.ds doc-str-Lb-libarm ARM Architecture Library (libarm, \-larm)
+.ds doc-str-Lb-libarm32 ARM32 Architecture Library (libarm32, \-larm32)
+.ds doc-str-Lb-libbluetooth Bluetooth Library (libbluetooth, \-lbluetooth)
+.ds doc-str-Lb-libbsm Basic Security Module Library (libbsm, \-lbsm)
+.ds doc-str-Lb-libc Standard C\~Library (libc, \-lc)
+.ds doc-str-Lb-libc_r Reentrant C\~Library (libc_r, \-lc_r)
+.ds doc-str-Lb-libcalendar Calendar Arithmetic Library (libcalendar, \-lcalendar)
+.ds doc-str-Lb-libcam Common Access Method User Library (libcam, \-lcam)
+.ds doc-str-Lb-libcdk Curses Development Kit Library (libcdk, \-lcdk)
+.ds doc-str-Lb-libcipher FreeSec Crypt Library (libcipher, \-lcipher)
+.ds doc-str-Lb-libcompat Compatibility Library (libcompat, \-lcompat)
+.ds doc-str-Lb-libcrypt Crypt Library (libcrypt, \-lcrypt)
+.ds doc-str-Lb-libcurses Curses Library (libcurses, \-lcurses)
+.ds doc-str-Lb-libdevinfo Device and Resource Information Utility Library (libdevinfo, \-ldevinfo)
+.ds doc-str-Lb-libdevstat Device Statistics Library (libdevstat, \-ldevstat)
+.ds doc-str-Lb-libdisk Interface to Slice and Partition Labels Library (libdisk, \-ldisk)
+.ds doc-str-Lb-libdwarf DWARF Access Library (libdwarf, \-ldwarf)
+.ds doc-str-Lb-libedit Command Line Editor Library (libedit, \-ledit)
+.ds doc-str-Lb-libelf ELF Access Library (libelf, \-lelf)
+.ds doc-str-Lb-libevent Event Notification Library (libevent, \-levent)
+.ds doc-str-Lb-libfetch File Transfer Library for URLs (libfetch, \-lfetch)
+.ds doc-str-Lb-libform Curses Form Library (libform, \-lform)
+.ds doc-str-Lb-libgeom Userland API Library for kernel GEOM subsystem (libgeom, \-lgeom)
+.ds doc-str-Lb-libgpib General-Purpose Instrument Bus (GPIB) library (libgpib, \-lgpib)
+.ds doc-str-Lb-libi386 i386 Architecture Library (libi386, \-li386)
+.ds doc-str-Lb-libintl Internationalized Message Handling Library (libintl, \-lintl)
+.ds doc-str-Lb-libipsec IPsec Policy Control Library (libipsec, \-lipsec)
+.ds doc-str-Lb-libipx IPX Address Conversion Support Library (libipx, \-lipx)
+.ds doc-str-Lb-libiscsi iSCSI protocol library (libiscsi, \-liscsi)
+.ds doc-str-Lb-libjail Jail Library (libjail, \-ljail)
+.ds doc-str-Lb-libkiconv Kernel side iconv library (libkiconv, \-lkiconv)
+.ds doc-str-Lb-libkse N:M Threading Library (libkse, \-lkse)
+.ds doc-str-Lb-libkvm Kernel Data Access Library (libkvm, \-lkvm)
+.ds doc-str-Lb-libm Math Library (libm, \-lm)
+.ds doc-str-Lb-libm68k m68k Architecture Library (libm68k, \-lm68k)
+.ds doc-str-Lb-libmagic Magic Number Recognition Library (libmagic, \-lmagic)
+.ds doc-str-Lb-libmd Message Digest (MD4, MD5, etc.) Support Library (libmd, \-lmd)
+.ds doc-str-Lb-libmemstat Kernel Memory Allocator Statistics Library (libmemstat, \-lmemstat)
+.ds doc-str-Lb-libmenu Curses Menu Library (libmenu, \-lmenu)
+.ds doc-str-Lb-libnetgraph Netgraph User Library (libnetgraph, \-lnetgraph)
+.ds doc-str-Lb-libnetpgp Netpgp signing, verification, encryption and decryption (libnetpgp, \-lnetpgp)
+.ds doc-str-Lb-libossaudio OSS Audio Emulation Library (libossaudio, \-lossaudio)
+.ds doc-str-Lb-libpam Pluggable Authentication Module Library (libpam, \-lpam)
+.ds doc-str-Lb-libpcap Packet Capture Library (libpcap, \-lpcap)
+.ds doc-str-Lb-libpci PCI Bus Access Library (libpci, \-lpci)
+.ds doc-str-Lb-libpmc Performance Counters Library (libpmc, \-lpmc)
+.ds doc-str-Lb-libposix \*[Px] \*[doc-str-Lb]Compatibility Library (libposix, \-lposix)
+.ds doc-str-Lb-libprop Property Container Object Library (libprop, \-lprop)
+.ds doc-str-Lb-libpthread \*[Px] \*[doc-str-Lb]Threads Library (libpthread, \-lpthread)
+.ds doc-str-Lb-libpuffs puffs Convenience Library (libpuffs, \-lpuffs)
+.ds doc-str-Lb-librefuse File System in Userspace Convenience Library (librefuse, \-lrefuse)
+.ds doc-str-Lb-libresolv DNS Resolver Library (libresolv, \-lresolv)
+.ds doc-str-Lb-librpcsec_gss RPC GSS-API Authentication Library (librpcsec_gss, \-lrpcsec_gss)
+.ds doc-str-Lb-librpcsvc RPC Service Library (librpcsvc, \-lrpcsvc)
+.ds doc-str-Lb-librt \*[Px] \*[doc-str-Lb]Real-time Library (librt, \-lrt)
+.ds doc-str-Lb-libsdp Bluetooth Service Discovery Protocol User Library (libsdp, \-lsdp)
+.ds doc-str-Lb-libssp Buffer Overflow Protection Library (libssp, \-lssp)
+.ds doc-str-Lb-libSystem System Library (libSystem, \-lSystem)
+.ds doc-str-Lb-libtermcap Termcap Access Library (libtermcap, \-ltermcap)
+.ds doc-str-Lb-libterminfo Terminal Information Library (libterminfo, \-lterminfo)
+.ds doc-str-Lb-libthr 1:1 Threading Library (libthr, \-lthr)
+.ds doc-str-Lb-libufs UFS File System Access Library (libufs, \-lufs)
+.ds doc-str-Lb-libugidfw File System Firewall Interface Library (libugidfw, \-lugidfw)
+.ds doc-str-Lb-libulog User Login Record Library (libulog, \-lulog)
+.ds doc-str-Lb-libusbhid USB Human Interface Devices Library (libusbhid, \-lusbhid)
+.ds doc-str-Lb-libutil System Utilities Library (libutil, \-lutil)
+.ds doc-str-Lb-libvgl Video Graphics Library (libvgl, \-lvgl)
+.ds doc-str-Lb-libx86_64 x86_64 Architecture Library (libx86_64, \-lx86_64)
+.ds doc-str-Lb-libz Compression Library (libz, \-lz)
+.ec
+.
+.eo
+.de Lb
+. if !\n[doc-arg-count] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Lb
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .Lb library_name ... (#\n[.c])
+. \}
+.
+. if !\n[doc-arg-count] \
+. return
+.
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-count] >= \n[doc-arg-ptr]) \{\
+. nr doc-curr-font \n[.f]
+. ds doc-str-Lb \f[\n[doc-curr-font]]
+.
+. ie d doc-str-Lb-\*[doc-arg\n[doc-arg-ptr]] \
+. ds doc-str-Lb1 "\*[doc-str-Lb-\*[doc-arg\n[doc-arg-ptr]]]
+. el \{\
+. tmc "mdoc warning: .Lb: no description for library
+. tm1 " '\*[doc-arg\n[doc-arg-ptr]]' available (#\n[.c])
+. ds doc-str-Lb1 library \*[Lq]\*[doc-arg\n[doc-arg-ptr]]\*[Rq]
+. \}
+.
+. \" replacing argument with result
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-str-Lb1]
+.
+. if \n[doc-in-library-section] \
+. br
+. doc-print-recursive
+. if \n[doc-in-library-section] \
+. br
+. \}
+. el \{\
+. tm Usage: .Lb library_name ... (#\n[.c])
+. doc-reset-args
+. \}
+..
+.ec
+.
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/me.tmac b/tmac/me.tmac
new file mode 100644
index 0000000..639ed66
--- /dev/null
+++ b/tmac/me.tmac
@@ -0,0 +1,5 @@
+.\" -*- nroff -*-
+.\"
+.\" me.tmac
+.\"
+.do mso e.tmac
diff --git a/tmac/ms.tmac b/tmac/ms.tmac
new file mode 100644
index 0000000..6d49fdf
--- /dev/null
+++ b/tmac/ms.tmac
@@ -0,0 +1,5 @@
+.\" -*- nroff -*-
+.\"
+.\" ms.tmac
+.\"
+.do mso s.tmac
diff --git a/tmac/papersize.tmac b/tmac/papersize.tmac
new file mode 100644
index 0000000..6d5ad14
--- /dev/null
+++ b/tmac/papersize.tmac
@@ -0,0 +1,167 @@
+.\" Set up GNU troff for various paper sizes.
+.\"
+.\" Usage:
+.\"
+.\" groff ... -dpaper=<format> ...
+.\"
+.\" Possible values for 'format' are the same as the predefined
+.\" 'papersize' values (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 PostScript output on A4 paper in
+.\" landscape orientation:
+.\"
+.\" groff -Tps -dpaper=a4l -P-pa4 -P-l -ms foo.ms > foo.ps
+.
+.do nr *groff_papersize_tmac_C \n[.cp]
+.cp 0
+.
+.if d paper \{\
+. ds paper-a0-length 118.9c
+. ds paper-a0-width 84.1c
+. ds paper-a1-length 84.1c
+. ds paper-a1-width 59.4c
+. ds paper-a2-length 59.4c
+. ds paper-a2-width 42c
+. ds paper-a3-length 42c
+. ds paper-a3-width 29.7c
+. ds paper-a4-length 29.7c
+. ds paper-a4-width 21c
+. ds paper-a5-length 21c
+. ds paper-a5-width 14.8c
+. ds paper-a6-length 14.8c
+. ds paper-a6-width 10.5c
+.
+. ds paper-b0-length 141.4c
+. ds paper-b0-width 100c
+. ds paper-b1-length 100c
+. ds paper-b1-width 70.7c
+. ds paper-b2-length 70.7c
+. ds paper-b2-width 50c
+. ds paper-b3-length 50c
+. ds paper-b3-width 35.3c
+. ds paper-b4-length 35.3c
+. ds paper-b4-width 25c
+. ds paper-b5-length 25c
+. ds paper-b5-width 17.6c
+. ds paper-b6-length 17.6c
+. ds paper-b6-width 12.5c
+.
+. ds paper-c0-length 129.7c
+. ds paper-c0-width 91.7c
+. ds paper-c1-length 91.7c
+. ds paper-c1-width 64.8c
+. ds paper-c2-length 64.8c
+. ds paper-c2-width 45.8c
+. ds paper-c3-length 45.8c
+. ds paper-c3-width 32.4c
+. ds paper-c4-length 32.4c
+. ds paper-c4-width 22.9c
+. ds paper-c5-length 22.9c
+. ds paper-c5-width 16.2c
+. ds paper-c6-length 16.2c
+. ds paper-c6-width 11.4c
+.
+. ds paper-d0-length 109.0c
+. ds paper-d0-width 77.1c
+. ds paper-d1-length 77.1c
+. ds paper-d1-width 54.5c
+. ds paper-d2-length 54.5c
+. ds paper-d2-width 38.5c
+. ds paper-d3-length 38.5c
+. ds paper-d3-width 27.2c
+. ds paper-d4-length 27.2c
+. ds paper-d4-width 19.2c
+. ds paper-d5-length 19.2c
+. ds paper-d5-width 13.6c
+. ds paper-d6-length 13.6c
+. ds paper-d6-width 9.6c
+.
+. ds paper-letter-length 11i
+. ds paper-letter-width 8.5i
+. ds paper-legal-length 14i
+. ds paper-legal-width 8.5i
+. ds paper-tabloid-length 17i
+. ds paper-tabloid-width 11i
+. ds paper-ledger-length 11i
+. ds paper-ledger-width 17i
+. ds paper-statement-length 8.5i
+. ds paper-statement-width 5.5i
+. \" These dimensions for executive paper format are what all printer
+. \" manufacturers use.
+. ds paper-executive-length 10.5i
+. ds paper-executive-width 7.25i
+.
+. ds paper-com10-length 9.5i
+. ds paper-com10-width 4.125i
+. ds paper-monarch-length 7.5i
+. ds paper-monarch-width 3.875i
+. ds paper-dl-length 22c
+. ds paper-dl-width 11c
+.
+. \" Save the input parameter for a later diagnostic.
+. ds paper-arg \*[paper]\"
+. ds paper \*[paper-arg]\"
+. stringdown paper
+. ds paper-p \*[paper]
+. ds paper-l \*[paper]
+. length paper-n \*[paper]
+. if (\n[paper-n] > 1) \{\
+. substring paper-p 0 -2
+. substring paper-l -1 -1
+. if !d paper-\*[paper-p]-length \{\
+. ds paper-p \*[paper]
+. ds paper-l
+. \}
+. \}
+.
+. nr paper-w 0
+.
+. ie d paper-\*[paper-p]-length \{\
+. ie '\*[paper-l]'l' \{\
+. pl \*[paper-\*[paper-p]-width]
+. ll (\*[paper-\*[paper-p]-length] - 2i)
+. \}
+. el \{\
+. ie '\*[paper-l]'' \{\
+. pl \*[paper-\*[paper-p]-length]
+. ll (\*[paper-\*[paper-p]-width] - 2i)
+. \}
+. el \
+. nr paper-w 1
+. \}
+. \}
+. el \
+. nr paper-w 1
+.
+. ie \n[paper-w] \{\
+. tmc papersize.tmac: warning: ignoring unrecognized paper format
+. tm1 " '\*[paper-arg]'
+. \}
+. el \{\
+. if !r LL \
+. nr LL \n[.l]u \" for ms, mdoc, man
+. if !r #R_MARGIN \
+. nr R_MARGIN 1i \" for mom
+. \" for mm
+. if !r W \{\
+. nr W \n[.l]u
+. if !r O \
+. nr O 1i
+. \}
+. \}
+.\}
+.
+.cp \n[*groff_papersize_tmac_C]
+.do rr *groff_papersize_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/pdf.tmac b/tmac/pdf.tmac
new file mode 100644
index 0000000..6a2fa7b
--- /dev/null
+++ b/tmac/pdf.tmac
@@ -0,0 +1,834 @@
+.ig
+
+pdf.tmac
+
+ Copyright (C) 2011-2020 Free Software Foundation, Inc.
+ Written by Deri James <deri@chuzzlewit.myzen.co.uk>
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+Author's Note
+=============
+
+Much of the code in this macro has come from the excellent original work by
+Keith Marshall (see attribution in the pdfmark.tmac file). I, however,
+am solely responsible for any bugs I may have introduced into this file.
+..
+.
+.do nr *groff_pdf_tmac_C \n[.cp]
+.cp 0
+.
+.if d pdfmark .nx
+.
+.mso ps.tmac
+.
+.de pdf:SS
+. fchar \\$1 \\S'16'\\$1\\S'0'
+..
+.pdf:SS \[+h]
+.pdf:SS \[ts]
+.pdf:SS \[*a]
+.pdf:SS \[*b]
+.pdf:SS \[*x]
+.pdf:SS \[*d]
+.pdf:SS \[*e]
+.pdf:SS \[*f]
+.pdf:SS \[*g]
+.pdf:SS \[*y]
+.pdf:SS \[*i]
+.pdf:SS \[+f]
+.pdf:SS \[*k]
+.pdf:SS \[*l]
+.pdf:SS \[*m]
+.pdf:SS \[*n]
+.pdf:SS \[*o]
+.pdf:SS \[*p]
+.pdf:SS \[*h]
+.pdf:SS \[*r]
+.pdf:SS \[*s]
+.pdf:SS \[*t]
+.pdf:SS \[*u]
+.pdf:SS \[+p]
+.pdf:SS \[*w]
+.pdf:SS \[*c]
+.pdf:SS \[*q]
+.pdf:SS \[*z]
+.char \[lh] \X'pdf: xrev'\[rh]\X'pdf: xrev'
+.nr pdf:bm.nl 1
+.de pdfmark
+. nop \!x X ps:exec [\\$* pdfmark
+..
+.
+.ds pdf pdf.tmac\" for use in diagnostic messages
+.
+.de pdf:warn
+. tm \\*[pdf]:\\n[.F]:\\n[.c]: warning: \\$*
+..
+.de pdf:error
+. tm \\*[pdf]:\\n[.F]:\\n[.c]: error: \\$*
+..
+.de pdfinfo
+.\" -------------------------------------------------------------------
+.\" Usage:
+.\" .pdfinfo /FieldName field content ...
+.\" Examples:
+.\" .pdfinfo /Title A PDF Document
+.\" .pdfinfo /Author Keith Marshall
+.\" -------------------------------------------------------------------
+.\"
+.ds pdf:meta.field \\$1
+.shift
+.ie '\\n(.z'' .pdfmark \\*[pdf:meta.field] (\\$*) /DOCINFO
+.el \!.pdfmark \\*[pdf:meta.field] (\\$*) /DOCINFO
+.rm pdf:meta.field
+..
+.de pdfview
+.\" -------------------------------------------------------------------
+.\" Usage:
+.\" .pdfview view parameters ...
+.\" Examples:
+.\" .pdfview /PageMode /UseOutlines
+.\" .pdfview /Page 2 /View [/FitH \n(.p u]
+.\" -------------------------------------------------------------------
+.\"
+.ie '\\n(.z'' .pdfmark \\$* /DOCVIEW
+.el \!.pdfmark \\$* /DOCVIEW
+..
+.\" =====================================================================
+.\" Module PDFNOTE: Insert "Sticky Note" Style Comments in a PDF Document
+.\" =====================================================================
+.\"
+.\" "PDFNOTE.WIDTH" and "PDFNOTE.HEIGHT" set the preferred size for
+.\" display of the "sticky note" pane, when opened. Acrobat Reader
+.\" seems not to honour these -- perhaps GhostScript doesn't encode
+.\" them correctly! Anyway, let's set some suitable default values,
+.\" in case the user has a set up which does work as advertised.
+.\"
+.nr PDFNOTE.WIDTH 3.5i
+.nr PDFNOTE.HEIGHT 2.0i
+.\"
+.\" "pdf:bbox" defines the expression used to set the size and location
+.\" of the bounding rectangle for display of notes and link "hot-spots".
+.\" This is defined, such that a note is placed at troff's current text
+.\" position on the current page, with its displayed image size defined
+.\" by the "PDFNOTE.WIDTH" and "PDFNOTE.HEIGHT" registers, while the
+.\" bounds for a link "hot-spot" are matched to the text region which
+.\" defines the "hot-spot".
+.\"
+.ds pdf:bbox \\n[pdf:llx] u \\n[pdf:lly] u \\n[pdf:urx] u \\n[pdf:ury] u
+.\"
+.\" Getting line breaks into the text of a PDFNOTE is tricky -- we need
+.\" to get a "\n" into the Postscript stream, but three levels of "\" are
+.\" swallowed, when we invoke "pdfnote". The following definition of "PDFLB",
+.\" (for LineBreak), is rather ugly, but does allow us to use
+.\"
+.\" .pdfnote Some text.\*[PDFLB]Some more text, on a new line.
+.\"
+.ds PDFLB \\\\\\\\\\\\\\\\n
+.\"
+.de pdfnote
+.\" ----------------------------------------------------------------------
+.\" Usage:
+.\" .pdfnote [-T "Text for Title"] Text of note ...
+.\" ----------------------------------------------------------------------
+.\"
+.\" First, compute the bounding rectangle,
+.\" for this PDFNOTE instance
+.\"
+. mk pdf:ury
+. nr pdf:llx \\n(.k+\\n(.o+\\n[.in]
+. nr pdf:lly \\n[pdf:ury]-\\n[PDFNOTE.HEIGHT]
+. nr pdf:urx \\n[pdf:llx]+\\n[PDFNOTE.WIDTH]
+. ds pdf:note.instance /Rect [\\*[pdf:bbox]]
+.\"
+.\" Parse any specified (recognisable) PDFNOTE options
+.\"
+. while dpdf:note\\$1 \{\
+. pdf:note\\$1 \\$@
+. shift \\n[pdf:note.argc]
+. \}
+.\"
+.\" Emit the note, and clean up
+.\"
+. pdfmark \\*[pdf:note.instance] /Subtype /Text /Contents (\\$*) /ANN
+. rm pdf:note.instance
+. rr pdf:note.argc
+..
+.de pdf:note-T
+.nr pdf:note.argc 2
+.as pdf:note.instance " /Title (\\$2)
+..
+.\" =====================================================================
+.\" Module PDFBOOKMARK: Add an Outline Reference in the PDF Bookmark Pane
+.\" =====================================================================
+.\"
+.\" "PDFBOOKMARK.VIEW" controls how the document will be displayed,
+.\" when the user selects a bookmark. This default setting will fit
+.\" the page width to the viewing window, with the bookmarked entry
+.\" located at the top of the viewable area.
+.\"
+.ds PDFBOOKMARK.VIEW /FitH \\n[PDFPAGE.Y] u
+.\"
+.\" "PDFOUTLINE.FOLDLEVEL" controls how the document outline will be
+.\" displayed. It is a number, defining the maximum heading level
+.\" which will be visible, without outline expansion by the user, in
+.\" the initial view of the document outline. Assuming that no sane
+.\" document will ever extend to 10,000 levels of nested headings,
+.\" this initial default value causes outlines to be fully expanded.
+.\"
+.nr PDFOUTLINE.FOLDLEVEL 10000
+.\"
+.\" The actual job of creating an outline reference
+.\" is performed by the "pdfbookmark" macro.
+.\"
+.de pdfbookmark
+.\" ------------------------------------------------------------------
+.\" Usage:
+.\" .pdfbookmark [-T tag] level "Text of Outline Entry"
+.\"
+.\" $1 = nesting level for bookmark (1 is top level)
+.\" $2 = text for bookmark, (in PDF viewer bookmarks list)
+.\" ------------------------------------------------------------------
+.\"
+.ie '\\n(.z'' \{\
+.\"
+.\" When we are at the top diversion level, i.e. actually emitting text
+.\" to the output device stream, then we compute the location of, and
+.\" plant this bookmark immediately.
+.\"
+. \" Make the bookmark name "untagged" by default,
+. \" then parse any specified options, to set a "tag", if required
+. \"
+. ds pdf:href-T
+. while dpdf:href.opt\\$1 \{\
+. pdf:href.opt\\$1 \\$@
+. shift \\n[pdf:href.argc]
+. \}
+. rr pdf:href.argc
+. \"
+. \" If we found "--" to mark the end of the options, discard it
+. \"
+. if '\\$1'--' .shift
+. \"
+. nr pdf:bm.lev 0+\\$1
+. if \\n[pdf:bm.lev]==0 .nr pdf:bm.lev 1
+. if \\n[pdf:bm.lev]-1==\\n[PDFOUTLINE.FOLDLEVEL] .nr pdf:bm.lev \\n[pdf:bm.lev]*-1
+. nr pdf:bm.abslev 0+\\n[pdf:bm.lev]
+. if \\n[pdf:bm.lev]<0 .nr pdf:bm.abslev 0+\\n[pdf:bm.abslev]*-1
+. if \\n[pdf:bm.abslev]>\\n[pdf:bm.nl] .nr pdf:bm.nl \\n[pdf:bm.nl]+1
+. ie \\n[pdf:bm.abslev]>\\n[pdf:bm.nl] \{\
+. pdf:warn adjusted level \\n[pdf:bm.abslev] bookmark; should be <= \\n[pdf:bm.nl]
+. nr pdf:bm.abslev 0+\\n[pdf:bm.nl]
+. if \\n[pdf:bm.abslev]-1==\\n[PDFOUTLINE.FOLDLEVEL] .nr pdf:bm.lev \\n[pdf:bm.abslev]*-1
+. \}
+. el .nr pdf:bm.nl \\n[pdf:bm.abslev]
+. if \\n[pdf:bm.lev]<0 .nr pdf:bm.abslev \\n[pdf:bm.abslev]*-1
+. nr pdf:bm.lev 0+\\n[pdf:bm.abslev]
+. rr pdf:bm.abslev
+. shift
+. \"
+. \" Increment the bookmark serialisation index
+. \" in order to generate a uniquely serialised bookmark name,
+. \" ( which we return in the string "PDFBOOKMARK.NAME" ),
+. \"
+. nr pdf:bm.nr +1
+. ie '\\*[pdf:href-T]'' .ds PDFBOOKMARK.NAME pdf:bm\\n[pdf:bm.nr]
+. el .ds PDFBOOKMARK.NAME \\*[pdf:href-T]
+. pdf:href.sety
+. ds pdf:cleaned \\$*
+. ev pdfcln
+. tr \[em]-
+. nf
+. box pdf:clean
+. nop \\$*
+. fl
+. box
+. chop pdf:clean
+. asciify pdf:clean
+. length pdf:clean:len \\*[pdf:clean]
+. ds pdf:cleaned \\*[pdf:clean]
+. rm pdf:clean
+. ev
+. tr \[em]\[em]
+. ds pdf:look(\\*[PDFBOOKMARK.NAME]) \\*[pdf:cleaned]
+. if dPDF.EXPORT .tm .ds pdf:look(\\*[PDFBOOKMARK.NAME]) \\*[pdf:cleaned]
+. pdfmark /Dest /\\*[PDFBOOKMARK.NAME] /View [\\*[PDFBOOKMARK.VIEW]] /DEST
+. nop \!x X ps:exec [/Dest /\\*[PDFBOOKMARK.NAME] /Title (\\*[pdf:cleaned]) /Level \\n[pdf:bm.lev] /OUT pdfmark
+.\". pdfmark /Dest /\\*[PDFBOOKMARK.NAME] /Title "(\\*[pdf:cleaned])" /Level \\n[pdf:bm.lev] /OUT
+. pdf:href.options.clear
+. rr PDFPAGE.Y
+. rm pdf:cleaned
+. rm pdf:clean
+. \}
+. \}
+.el \{\
+.\"
+.\" But when we are collecting a diversion which will be written out later,
+.\" then we must defer bookmark placement, until we emit the diversion.
+.\" (don't rely on $0 == pdfbookmark here; it may be a volatile alias).
+.\"
+. nop \!.pdfbookmark \\$@
+. \}
+..
+.
+.de pdfclean
+. ie '\\n(.z'' \{\
+. ds pdfcleaned \\$*
+. ev pdfcln
+. tr \[em]-
+. nf
+. box pdf:clean
+. nop \\*[\\*[pdfcleaned]]
+. fl
+. box
+. chop pdf:clean
+. asciify pdf:clean
+. ev
+. ds \\*[pdfcleaned] "\\*[pdf:clean]
+. rm pdf:clean
+. tr \[em]\[em]
+. el .nop \!.pdfclean \\$@
+..
+.\"
+.\" =============================================================
+.\" Module PDFHREF: Create Hypertext References in a PDF Document
+.\" =============================================================
+.\"
+.\" "PDFHREF.VIEW" controls how the document will be displayed,
+.\" when the user follows a link to a named reference.
+.\"
+.ds PDFHREF.VIEW /FitH \\n[PDFPAGE.Y] u
+.\"
+.\" This default setting will fit the page width to the viewing
+.\" window, with the bookmarked entry located close to the top
+.\" of the viewable area. "PDFHREF.VIEW.LEADING" controls the
+.\" actual distance below the top of the viewing window, where
+.\" the reference will be positioned; 5 points is a reasonable
+.\" default offset.
+.\"
+.nr PDFHREF.VIEW.LEADING 5.0p
+.\"
+.\" Yuk!!!
+.\" PDF view co-ordinates are mapped from the bottom left corner,
+.\" of the page, whereas page printing co-ordinates are mapped
+.\" conventionally, from top left.
+.\"
+.\" Macro "pdf:href.sety" transforms the vertical position of the
+.\" last printed baseline, from the printing co-ordinate domain to
+.\" the PDF view domain.
+.\"
+.de pdf:href.sety
+.\" ----------------------------------------------------------------
+.\" Usage:
+.\" .pdf:href.sety
+.\" ----------------------------------------------------------------
+.\"
+.\" This computation yields the vertical view co-ordinate
+.\" in groff's basic units; don't forget to append grops' "u"
+.\" conversion operator, when writing the pdfmark!
+.\"
+.nr PDFPAGE.Y (\\n[PDFHREF.VIEW.LEADING]-\\n(nl)
+..
+.\" When we create a link "hot-spot" ...
+.\" "PDFHREF.LEADING" sets the distance above the top of the glyph
+.\" bounding boxes, in each line of link text, over which the link
+.\" hot-spot will extend, while "PDFHREF.HEIGHT" sets the hot-spot
+.\" height, PER LINE of text occupied by the reference.
+.\"
+.\" Since most fonts specify some leading space within the bounding
+.\" boxes of their glyphs, a better appearance may be achieved when
+.\" NEGATIVE leading is specified for link hot-spots; indeed, when
+.\" the default 10pt Times font is used, -1.0 point seems to be a
+.\" reasonable default value for "PDFHREF.LEADING" -- it may be
+.\" changed, if desired.
+.\"
+.\" "PDFHREF.HEIGHT" is initially set as one vertical spacing unit;
+.\" note that it is defined as a string, so it will adapt to changes
+.\" in the vertical spacing. Changing it is NOT RECOMMENDED.
+.\"
+.nr PDFHREF.LEADING 2.0p
+.ds PDFHREF.HEIGHT 1.0v
+.\"
+.\" PDF readers generally place a rectangular border around link
+.\" "hot-spots". Within text, this looks rather ugly, so we set
+.\" "PDFHREF.BORDER" to suppress it -- the three zeroes represent
+.\" the border parameters in the "/Border [0 0 0]" PDFMARK string,
+.\" and may be changed to any valid form, as defined in Adobe's
+.\" PDFMARK Reference Manual.
+.\"
+.ds PDFHREF.BORDER 0 0 0
+.\"
+.\" "PDFHREF.COLOUR" (note British spelling) defines the colour to
+.\" be used for display of link "hot-spots". This will apply both
+.\" to borders, if used, and, by default to text; however, actual
+.\" text colour is set by "PDFHREF.TEXT.COLOUR", which may be reset
+.\" independently of "PDFHREF.COLOUR", to achieve contrasting text
+.\" and border colours.
+.\"
+.\" "PDFHREF.COLOUR" must be set to a sequence of three values,
+.\" each in the range 0.0 .. 1.0, representing the red, green, and
+.\" blue components of the colour specification in the RGB colour
+.\" domain, which is shared by "groff" and the PDF readers.
+.\"
+.ds PDFHREF.COLOUR 0.35 0.00 0.60
+.defcolor pdf:href.colour rgb \*[PDFHREF.COLOUR]
+.\"
+.\" "PDFHREF.TEXT.COLOUR", on the other hand, is simply defined
+.\" using any "groff" colour name -- this default maps it to the
+.\" same colour value as "PDFHREF.COLOUR".
+.\"
+.ds PDFHREF.TEXT.COLOUR pdf:href.colour
+.\"
+.\" Accommodate users who prefer the American spelling, COLOR, to
+.\" the British spelling, COLOUR.
+.\"
+.als PDFHREF.COLOR PDFHREF.COLOUR
+.als PDFHREF.TEXT.COLOR PDFHREF.TEXT.COLOUR
+.\"
+.\" All PDF "Hypertext" reference capabilities are accessed
+.\" through the "pdfhref" macro
+.\"
+.de pdfhref
+.\" -----------------------------------------------------------------
+.\" Usage:
+.\" .pdfhref <subcommand [options ...] [parameters ...]> ...
+.\" -----------------------------------------------------------------
+.\"
+.\"
+.\" Loop over all subcommands specified in the argument list
+.\"
+. while \\n(.$ \{\
+. \"
+. \" Initially, assume each subcommand will complete successfully
+. \"
+. nr pdf:href.ok 1
+. \"
+. \" Initialise -E and -X flags in the OFF state
+. \"
+. nr pdf:href-E 0
+. nr pdf:href-X 0
+. \"
+. \" Handle the case where subcommand is specified as "-class",
+. \" setting up appropriate macro aliases for subcommand handlers.
+. \"
+. if dpdf*href\\$1 .als pdf*href pdf*href\\$1
+. if dpdf*href\\$1.link .als pdf*href.link pdf*href\\$1.link
+. if dpdf*href\\$1.file .als pdf*href.file pdf*href\\$1.file
+. \"
+. \" Repeat macro alias setup
+. \" for the case where the subcommand is specified as "class",
+. \" (without a leading hyphen)
+. \"
+. if dpdf*href-\\$1 .als pdf*href pdf*href-\\$1
+. if dpdf*href-\\$1.link .als pdf*href.link pdf*href-\\$1.link
+. if dpdf*href-\\$1.file .als pdf*href.file pdf*href-\\$1.file
+. \"
+. \" Process one subcommand ...
+. \"
+. ds pdf*href.class \\$1
+. ie dpdf*href \{\
+. \"
+. \" Subcommand "class" is recognised ...
+. \" discard the "class" code from the argument list,
+. \" set the initial argument count to swallow all arguments,
+. \" and invoke the selected subcommand handler.
+. \"
+. shift
+. nr pdf:argc \\n(.$
+. pdf*href \\$@
+. \"
+. \" When done,
+. \" discard all arguments actually consumed by the handler,
+. \" before proceeding to the next subcommand (if any).
+. \"
+. shift \\n[pdf:argc]
+. \}
+. el \{\
+. \"
+. \" Subcommand "class" is not recognised ...
+. \" issue a warning, and discard the entire argument list,
+. \" so aborting this "pdfhref" invocation
+. \"
+. pdf:warn \\$0: undefined reference class '\\$1' ignored
+. shift \\n(.$
+. \}
+. \"
+. \" Clean up temporary reference data,
+. \" to ensure it doesn't propagate to any future reference
+. \"
+. rm pdf*href pdf:href.link pdf:href.files
+. rr pdf:href-E
+. pdf:href.options.clear
+. \}
+. rr pdf:href.ok
+..
+.\"
+.\" Macros "pdf:href.flag" and "pdf:href.option"
+.\" provide a generic mechanism for switching on flag type options,
+.\" and for decoding options with arguments, respectively
+.\"
+.de pdf:href.flag
+.\" ----------------------------------------------------------------------
+.\" ----------------------------------------------------------------------
+.nr pdf:href\\$1 1
+.nr pdf:href.argc 1
+..
+.de pdf:href.option
+.\" ----------------------------------------------------------------------
+.\" ----------------------------------------------------------------------
+.ds pdf:href\\$1 \\$2
+.nr pdf:href.argc 2
+..
+.\"
+.\" Valid PDFHREF options are simply declared
+.\" by aliasing option handlers to "pdf:href.option",
+.\" or to "pdf:href.flag", as appropriate
+.\"
+.als pdf:href.opt-A pdf:href.option \" affixed text
+.als pdf:href.opt-D pdf:href.option \" destination name
+.als pdf:href.opt-E pdf:href.flag \" echo link descriptor
+.als pdf:href.opt-F pdf:href.option \" remote file specifier
+.als pdf:href.opt-N pdf:href.option \" reference name
+.als pdf:href.opt-P pdf:href.option \" prefixed text
+.als pdf:href.opt-T pdf:href.option \" bookmark "tag"
+.als pdf:href.opt-X pdf:href.flag \" cross reference
+.\"
+.\" For references to another document file
+.\" we also need to support OS dependent file name specifiers
+.\"
+.als pdf:href.opt-DF pdf:href.option \" /DOSFile specifier
+.als pdf:href.opt-MF pdf:href.option \" /MacFile specifier
+.als pdf:href.opt-UF pdf:href.option \" /UnixFile specifier
+.als pdf:href.opt-WF pdf:href.option \" /WinFile specifier
+.\"
+.\" Macro "pdf:href.options.clear" ensures that ALL option
+.\" argument strings are deleted, after "pdfhref" has completed
+.\" all processing which depends on them
+.\"
+.de pdf:href.options.clear
+.\" -----------------------------------------------------------------
+.\" Usage:
+.\" .pdf:href.options.clear [option ...]
+.\" -----------------------------------------------------------------
+.\"
+.\" When an option list is specified ...
+.\"
+.ie \\n(.$ \{\
+. \"
+. \" then loop through the list,
+. \" deleting each specified option argument string in turn
+. \"
+. while \\n(.$ \{\
+. if dpdf:href-\\$1 .rm pdf:href-\\$1
+. shift
+. \}
+. \}
+.\"
+.\" ... but when no list is specified,
+.\" then recurse, to clear all known option argument strings
+.\"
+.el .pdf:href.options.clear A D F N P T DF MF UF WF
+..
+.\"
+.\" Macro "pdf*href-M" is the handler invoked by "pdfhref", when
+.\" called with the "M" reference class specifier, to create a
+.\" named cross reference mark, and to emit a cross reference
+.\" data record, as specified by "PDFHREF.INFO".
+.\"
+.de pdf*href-M
+.\" -----------------------------------------------------------------
+.\" Usage:
+.\" .pdfhref M [-N name | -D name] [-E] descriptive text ...
+.\" -----------------------------------------------------------------
+.\"
+.\" Initially, declare the -D and -N string options as empty,
+.\" so we avoid warning messages when we try to use them, and find
+.\" that they are undefined.
+.\"
+.ds pdf:href-D
+.ds pdf:href-N
+.\"
+.\" Parse, interpret, and strip any specified options from the
+.\" argument list. (Note that only options with a declared handler
+.\" will be processed; there is no provision for detecting invalid
+.\" options -- anything which is not recognised is assumed to start
+.\" the "descriptive text" component of the argument list).
+.\"
+.while dpdf:href.opt\\$1 \{\
+. pdf:href.opt\\$1 \\$@
+. shift \\n[pdf:href.argc]
+. \}
+.\"
+.\" If we found "--", to mark the end of the options,
+.\" then we should discard it.
+.\"
+.if '\\$1'--' .shift
+.\"
+.\" All PDF reference markers MUST be named. The name may have been
+.\" supplied using the "-N Name" option, (or the "-D Name" option);
+.\" if not, deduce it from the first "word" in the "descriptive text",
+.\" if any, and set the marker -- if we still can't identify the name
+.\" for the destination, then this marker will not be created.
+.\"
+.ds PDFBOOKMARK.NAME "\\*[pdf:href-N]\\*[pdf:href-D]
+.pdf*href.set \\*[PDFBOOKMARK.NAME] \\$1
+.ds pdf:look(\\*[PDFBOOKMARK.NAME]) \\$*
+.if dPDF.EXPORT .tm .ds pdf:look(\\*[PDFBOOKMARK.NAME]) \\$*
+.\"
+.\"
+.\" Irrespective of whether this marker is created, or not,
+.\" the descriptive text will be copied to the groff output stream,
+.\" provided the "-E" option was specified
+.\"
+.if \\n[pdf:href-E] \&\\$*
+..
+.de pdf*href-F
+.\"do nothing
+..
+.\"
+.de pdf*href.set
+.\" ----------------------------------------------------------------------
+.\" ----------------------------------------------------------------------
+.ie \\n(.$ \{\
+. \"
+. \" a marker name has been supplied ...
+. \" if we are formatting for immediate output,
+. \" emit PDFMARK code to establish the associated view
+. \"
+. ie '\\n(.z'' \{\
+. pdf:href.sety
+. pdfmark /Dest /\\$1 /View [\\*[PDFHREF.VIEW]] /DEST
+. ds PDFHREF.NAME \\$1
+. rr PDFPAGE.Y
+. \}
+. \"
+. \" but, when formatting a diversion ...
+. \" delay output of the PDFMARK code, until the diversion
+. \" is eventually written out
+. \"
+. el \!.\\$0 \\$@
+. \"
+. \}
+.el \{\
+. \" marker is unnamed ...
+. \" issue error message; do not emit reference data
+. \"
+. pdf:warn pdfhref destination marker must be named
+. \}
+..
+.\"
+.de pdf*href
+.\" ------------------------------------------------------------------
+.\" Usage:
+.\" .pdf*href class [options ...] [link text ...]
+.\" ------------------------------------------------------------------
+.\"
+.\" First, we initialise an empty string, which will be affixed to
+.\" the end of the "link text". (This is needed to cancel the effect
+.\" of a "\c" escape, which is placed at the end of the "link text"
+.\" to support the "-A" option -- any text supplied by the user, when
+.\" the "-A" option is specified, will replace this empty string).
+.\"
+.ds pdf:href-A
+.\"
+.\" Now we interpret, and remove any specified options from the
+.\" argument list. (Note that only options with a declared handler
+.\" will be processed; there is no provision for detecting invalid
+.\" options -- anything which is not recognised is assumed to start
+.\" the "link text" component of the argument list).
+.\"
+.while dpdf:href.opt\\$1 \{\
+. pdf:href.opt\\$1 \\$@
+. shift \\n[pdf:href.argc]
+. \}
+.\"
+.\" If we found "--", to mark the end of the options, then we should
+.\" discard it.
+.\"
+.if '\\$1'--' .shift
+.\"
+.\" All PDF link classes REQUIRE a named destination. This may have
+.\" been supplied using the "-D Name" option, but, if not, deduce it
+.\" from the first "word" in the "link text", if any -- if we still
+.\" can't identify the destination, then set "pdf:href.ok" to zero,
+.\" so this link will not be created.
+.\"
+.if !dpdf:href-D .pdf:href.option -D \\$1
+.if '\\*[pdf:href-D]'' \{\
+. pdf:error pdfhref has no destination
+. nr pdf:href.ok 0
+. \}
+.\"
+.\" Now, initialise a string, defining the PDFMARK code sequence
+.\" to create the reference, using the appropriate type indicators.
+.\"
+.ds pdf:href.link /Subtype /Link \\*[pdf*href.link]
+.\"
+.\" And now, we have no further use for "pdf*href.link".
+.\"
+.rm pdf*href.link
+.\"
+.\" If the user specified any "link prefix" text, (using the "-P text"
+.\" option), then emit it BEFORE processing the "link text" itself.
+.\"
+.if dpdf:href-P \&\\*[pdf:href-P]\c
+.ie \\n[pdf:href.ok] \{\
+. \"
+. \" This link is VALID (so far as we can determine) ...
+. \" Modify the "link text" argument specification, as required,
+. \" to include any pre-formatted cross reference information
+. \"
+. ie \\n(.$ \{\
+. \"
+. \" One or more "link text" argument(s) are present,
+. \" so, set the link description from the argument(s) ...
+. \"
+. ds PDFHREF.DESC \\\\$*
+. \}
+. el \{\
+. ie dpdf:look(\\*[pdf:href-D]) .ds PDFHREF.DESC \\*[pdf:look(\\*[pdf:href-D])]
+. el .ds PDFHREF.DESC Unknown
+. \}
+. \" Apply border and colour specifications to the PDFMARK string
+. \" definition, as required.
+. \"
+. if dPDFHREF.BORDER .as pdf:href.link " /Border [\\*[PDFHREF.BORDER]]
+. if dPDFHREF.COLOUR .as pdf:href.link " /Color [\\*[PDFHREF.COLOUR]]
+. \"
+. \" Emit the "link text", in its appropriate colour, marking the
+. \" limits of its bounding box(es), as the before and after output
+. \" text positions.
+. \"
+\#. if dPDFHREF.COLOUR .defcolor pdf:href.colour rgb \\*[PDFHREF.COLOUR]
+. nr pdf:bm.width \\w'\\*[PDFHREF.DESC]'
+. nop \&\m[\\*[PDFHREF.TEXT.COLOUR]]\c
+. device pdf: markstart \\n[rst] \\n[rsb] \\n[PDFHREF.LEADING] \\*[pdf:href.link]
+. nop \&\\*[PDFHREF.DESC]\X'pdf: markend'\m[]\c
+. \"
+. \" Clean up the temporary registers and strings, used to
+. \" compute the "hot-spot" bounds, and format the reference,
+. \"
+. rm PDFHREF.DESC
+. \}
+.\"
+.\" But when we identify an INVALID link ...
+.\" We simply emit the "link text", with no colour change, no border,
+.\" and no associated "hot-spot".
+.\"
+.el \&\\$*\c
+.\"
+.\" And then, if the user specified any affixed text, (using the
+.\" "-A text" option), we tack it on at the end.
+.\"
+.nop \&\\*[pdf:href-A]
+..
+.\" Macro "pdf*href-I" is used for one time initialisation of special
+.\" "pdfhref" features; (currently, only the above page trap hook is
+.\" supported, but it is implemented with one level of indirection, to
+.\" accommodate possible future expansion).
+.
+.de pdf*href-I
+.\" ----------------------------------------------------------------------
+.\" Usage:
+.\" .pdfhref I -<option> <optarg> [-<option> <optarg>] ...
+.\" ----------------------------------------------------------------------
+.\"
+.\" Loop over all arguments, in pairs ...
+.
+.while \\n(.$ \{\
+. \"
+. \" handing them off to their respective initialisers,
+. \" when suitable initialisers exist, or complaining otherwise.
+. \"
+. ie dpdf*href\\$1.init .pdf*href\\$1.init \\$2
+. el .pdf:error pdfhref:init: unknown feature '\\$1'
+. shift 2
+. \}
+..
+.\" Before we can use the page break "hook", we need to initialise it
+.\" as an addendum to a regular page break trap. To ensure that we don't
+.\" compromise the user's page trap setup, we leave the onus for this
+.\" initialisation with the user, but we provide the "pdf*href-PT.init"
+.\" macro, (invoked by ".pdfhref I -PT <macro-name>"), to implement a
+.\" suitable initialisation action.
+.\"
+.\"
+.\" "pdf*href-L" is the generic handler for creating references to
+.\" named destinations in PDF documents. It supports both local
+.\" references, to locations within the same document, through its
+.\" "pdf*href-L.link" attribute, and also references to locations
+.\" in any other PDF document, through "pdf*href-L.file".
+.\"
+.als pdf*href-L pdf*href
+.ds pdf*href-L.link /Dest /\\\\*[pdf:href-D]
+.ds pdf*href-L.file /Action /GoToR \\\\*[pdf:href.files] \\*[pdf*href-L.link]
+.\"
+.\" "pdf*href-O" is the "official" handler for creating PDF
+.\" document outlines. It is simply an alias to "pdfbookmark",
+.\" which may also be invoked directly, if preferred. Neither
+.\" a "pdf*href-O.link" nor a "pdf*href-O.file" attribute is
+.\" required.
+.\"
+.als pdf*href-O pdfbookmark
+.\"
+.\" "pdf*href-W" is the generic handler for creating references to
+.\" web resources, (or any resource specified by a uniform resource
+.\" identifier). Such resource links are fully specified by the
+.\" "pdf*href-W.link" attribute.
+.\"
+.als pdf*href-W pdf*href
+.ds pdf*href-W.link /Action << /Subtype /URI /URI (\\\\*[pdf:href-D]) >>
+.nr pdf:bm.nl 0
+.\"
+.\" "pdfmarksuspend" and "pdfmarkrestart" should be used in any page trap
+.\" macros to prevent output from the page trap macro being considered part
+.\" of a 'hot spot' when it crosses a page boundary.
+.de pdfmarksuspend
+.nop \!x X pdf: marksuspend
+..
+.de pdfmarkrestart
+.nop \!x X pdf: markrestart
+..
+.de pdfpagename
+.nop \!x X pdf: pagename \\$1
+..
+.de pdfswitchtopage
+.nop \!x X pdf: switchtopage \\$*
+..
+.de pdfpause
+.nop \!x X ps: exec %%%%PAUSE
+..
+.de pdftransition
+.nop \!x X pdf: transition \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
+..
+.de pdfbackground
+.\" $1=Page|Fill|Box|off
+.\" $2=left
+.\" $3=top
+.\" $4=right
+.\" $5=bottom
+.\" $6=line weight (if box)
+.device pdf: background \\$*
+..
+.
+.cp \n[*groff_pdf_tmac_C]
+.do rr *groff_pdf_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/pdfpic.tmac b/tmac/pdfpic.tmac
new file mode 100644
index 0000000..f81b66e
--- /dev/null
+++ b/tmac/pdfpic.tmac
@@ -0,0 +1,287 @@
+.\" Define the PDFPIC macro.
+.\"
+.\" When used with output devices other than `pdf`, convert image to
+.\" encapsulated PostScript and process it with PSPIC.
+.\"
+.\" Usage:
+.\"
+.\" .PDFPIC [-L|-R|-C|-I <indentation>] <file> [<width> [<height>]]
+.\"
+.\" Requires the poppler-utils package (for pdfinfo(1) and pdftops(1)).
+.\" Requires running troff(1) in unsafe mode.
+.
+.do if d PDFPIC .nx
+.
+.do nr *groff_pdfpic_tmac_C \n[.cp]
+.cp 0
+.
+.\" Locate a directory to house temporary files. Check each argument
+.\" in turn, confirming its existence, writability, and searchability.
+.\"
+.\" `pdfpic*temporary-directory` contains its name if one is found, and
+.\" is empty otherwise.
+.de pdfpic@get-temporary-directory
+. ds pdfpic*temporary-directory \" empty
+. while !'\\$1'' \{\
+. sy test -d \\$1 && test -w \\$1 && test -x \\$1
+. if \\n[systat]=0 .ds pdfpic*temporary-directory \\$1
+. ie '\\*[pdfpic*temporary-directory]'' .shift
+. el .break
+. \}
+..
+.
+.\" A user may wish to append an 'ab' to this macro using 'am'. That
+.\" is why we don't 'return X' from here to return from two scopes.
+.de pdfpic@error
+. tm pdfpic.tmac:\\n[.F]:\\n[.c]: error: \\$*
+..
+.
+.de pdfpic@cleanup
+. rm pdfpic*pspic-args
+. rm pdfpic*file-extension
+. rm pdfpic*file-name-base
+. rm pdfpic*temporary-directory
+. rm pdfpic*temporary-file
+. rr pdfpic*do-conversion
+. rr pdfpic*offset-mode
+. rr pdfpic*indentation
+. rr pdfpic*width
+. rr pdfpic*height
+. rr pdfpic*did-pdfinfo-work
+. rr pdfpic*desired-width
+. rr pdfpic*desired-height
+..
+.
+.de PDFPIC
+. if !\\n[.U] \{\
+. pdfpic@error use of \\$0 requires GNU troff's unsafe mode \
+(-U option)
+. return
+. \}
+.
+. \" Dispose of junk from any previous early return.
+. pdfpic@cleanup
+.
+. nr pdfpic*do-conversion 0
+. if !'\\*[.T]'pdf' .nr pdfpic*do-conversion 1
+.
+. nr pdfpic*offset-mode 0
+.
+. \" Preserve the trailing space in definitions of pdfpic*pspic-args.
+.
+. \" left-aligned?
+. ie '\\$1'-L' \{\
+. nr pdfpic*offset-mode 1
+. if \\n[pdfpic*do-conversion] .ds pdfpic*pspic-args \\$1 \"
+. shift
+. \}
+. el \{\
+. \" right-aligned?
+. ie '\\$1'-R' \{\
+. nr pdfpic*offset-mode 2
+. if \\n[pdfpic*do-conversion] .ds pdfpic*pspic-args \\$1 \"
+. shift
+. \}
+. el \{\
+. \" indented?
+. ie '\\$1'-I' \{\
+. nr pdfpic*offset-mode 3
+. nr pdfpic*indentation (m;\\$2)
+. if \\n[pdfpic*do-conversion] .ds pdfpic*pspic-args \\$1 \\$2 \"
+. shift 2
+. \}
+. el \{\
+. \" centered is the default
+. ie '\\$1'-C' \{\
+. if \\n[pdfpic*do-conversion] .ds pdfpic*pspic-args \\$1 \"
+. shift
+. \}
+. el .nr pdfpic*offset-mode 0
+. \}
+. \}
+. \}
+. br
+.
+. ds pdfpic*file-extension \\$1\"
+. substring pdfpic*file-extension -4
+. stringdown pdfpic*file-extension
+. if !'\\*[pdfpic*file-extension]'.pdf' \{\
+. pdfpic@error '\\$1' lacks a '.pdf' extension; skipping
+. return
+. \}
+.
+. \" Ensure the file exists and is readable.
+. \"
+. \" This test is subject to a time-of-check-to-time-of-use (TOCTTOU)
+. \" attack (or a simple race with a concurrent `rm` command, for
+. \" instance).
+. sy test -r \\$1
+. if \\n[systat]!=0 \{\
+. pdfpic@error '\\$1' does not exist or is not readable; skipping
+. return
+. \}
+.
+. \" if driver is not gropdf, convert image to .eps
+. if \\n[pdfpic*do-conversion] \{\
+. ds pdfpic*file-name-base \\$1
+. substring pdfpic*file-name-base 0 -5
+.
+. sy pdftops -eps \\$1
+. shift
+.
+. as pdfpic*pspic-args \\*[pdfpic*file-name-base].eps \\$*
+.
+. PSPIC \\*[pdfpic*pspic-args]
+. return
+. \}
+.
+. pdfpic@get-temporary-directory \\V[GROFF_TMPDIR] \\V[TMPDIR]
+.
+. if 'pdfpic*temporary-directory'' \{\
+. \" Figure out if we're on a Windows system (with a Unix shell).
+. nr pdfpic*is-on-windows 0
+.
+. sy expr $(uname -s) : "CYGWIN.*" > /dev/null
+. if \\n[systat]=0 .nr pdfpic*is-on-windows 1
+. sy expr $(uname -s) : "MINGW.*" > /dev/null
+. if \\n[systat]=0 .nr pdfpic*is-on-windows 1
+.
+. if \\n[pdfpic*is-on-windows] \
+. pdfpic@get-temporary-directory \\V[TEMP] \\V[TMP]
+.
+. rr pdfpic*is-on-windows
+. \}
+.
+. if '\\*[pdfpic*temporary-directory]'' \
+. pdfpic@get-temporary-directory /tmp
+.
+. if '\\*[pdfpic*temporary-directory]'' \{\
+. pdfpic@error cannot locate a usable temporary directory; \
+skipping '\\$1'
+. return
+. \}
+. ds pdfpic*temporary-file \\*[pdfpic*temporary-directory]/pdfpic\n[$$]
+.
+. \" Get image dimensions. The `tr` command to strip null bytes is
+. \" distasteful, but its necessity is imposed on us. See
+. \" <https://gitlab.freedesktop.org/poppler/poppler/-/issues/776>.
+. ec @
+. sy pdfinfo @$1 | \
+tr -d '\000' | \
+grep "Page *size" | \
+sed -e 's/Page *size: *\\([[:digit:].]*\\) *x *\\([[:digit:].]*\\).*$/\
+.nr pdfpic*width (p;\\1)\\n\
+.nr pdfpic*height (p;\\2)/' \
+> @*[pdfpic*temporary-file]
+. ec
+. if \\n[systat] \{\
+. pdfpic@error retrieval of '\\$1' image dimensions failed with \
+exit status \\n[systat]; skipping
+. return
+. \}
+. so \\*[pdfpic*temporary-file]
+. sy rm \\*[pdfpic*temporary-file]
+.
+. nr pdfpic*did-pdfinfo-work 1
+. if !r pdfpic*width .nr pdfpic*did-pdfinfo-work 0
+. if !r pdfpic*height .nr pdfpic*did-pdfinfo-work 0
+. if !\\n[pdfpic*did-pdfinfo-work] \{\
+. pdfpic@error retrieval of '\\$1' image dimensions failed; skipping
+. return
+. \}
+. rr pdfpic*did-pdfinfo-work
+.
+. \" reject nonsense dimensions <= 0 (and avoid zero divide later)
+. if !\\n[pdfpic*width] \{\
+. pdfpic@error '\\$1' reports image width of \\n[pdfpic*width]u; \
+skipping
+. return
+. \}
+. if !\\n[pdfpic*height] \{\
+. pdfpic@error '\\$1' reports image height of \\n[pdfpic*height]u; \
+skipping
+. return
+. \}
+.
+. \" if we have a <width> parameter, use it as the final
+. \" image width; otherwise we use the image's natural width
+. \" or the current line length, whatever is smaller
+. ie (\\n[.$] >= 2) \{\
+. nr pdfpic*desired-width (i;\\$2)
+. if !\\n[pdfpic*desired-width] \{\
+. pdfpic@error rejecting desired image width of \
+\\n[pdfpic*desired-width]u; skipping '\\$1'
+. return
+. \}
+. \}
+. el \
+. nr pdfpic*desired-width ((\\n[.l] - \\n[.i]) <? \\n[pdfpic*width])
+.
+. if (\\n[.$] >= 3) \{\
+. nr pdfpic*desired-height (i;\\$3)
+. if !\\n[pdfpic*desired-height] \{\
+. pdfpic@error rejecting desired image height of \
+\\n[pdfpic*desired-height]u; skipping '\\$1'
+. return
+. \}
+. \}
+. \" We have no else clause; pdfpic*desired-height will get clobbered
+. \" anyway.
+.
+. \" compute the final image height (with proper rounding),
+. \" based on the image's aspect ratio
+. nr pdfpic*desired-height (\\n[pdfpic*desired-width] * 1000 \
+ + (\\n[pdfpic*width] / 2) \
+ / \\n[pdfpic*width] * \\n[pdfpic*height] \
+ + 500 / 1000)
+.
+. \" if we have a <height> parameter, use it as the final
+. \" image height in case it is smaller than the height
+. \" value we have just computed
+. if ((\\n[.$] >= 3) & (\\n[pdfpic*desired-height] > (i;0\\$3))) \{\
+. nr pdfpic*desired-height (i;\\$3)
+. \" recompute the final image width since we always
+. \" keep the correct image aspect
+. nr pdfpic*desired-width (\\n[pdfpic*desired-height] * 1000 \
+ + (\\n[pdfpic*height] / 2) \
+ / \\n[pdfpic*height] * \\n[pdfpic*width] \
+ + 500 / 1000)
+. \}
+.
+. \" reserve vertical space for image
+. ne (\\n[pdfpic*desired-height]u + 1v)
+.
+. \" compute image offset w.r.t. the current left margin
+. if (\\n[pdfpic*offset-mode] == 0) \
+. nr pdfpic*indentation \
+ (\\n[.l] - \\n[.i] - \\n[pdfpic*desired-width] / 2)
+. if (\\n[pdfpic*offset-mode] == 1) \
+. nr pdfpic*indentation 0
+. if (\\n[pdfpic*offset-mode] == 2) \
+. nr pdfpic*indentation \
+ (\\n[.l] - \\n[.i] - \\n[pdfpic*desired-width])
+.
+\h'\\n[pdfpic*indentation]u'\
+\X'pdf: pdfpic \\$1 -L \\n[pdfpic*desired-width]z \
+\\n[pdfpic*desired-height]z'
+. if !r PDFPIC_NOSPACE \{\
+. nr PDFPIC_NOSPACE 0
+. if \B'\\V[GROFF_PDFPIC_NOSPACE]' \
+. nr PDFPIC_NOSPACE \\V[GROFF_PDFPIC_NOSPACE]
+. \}
+. if \\n[PDFPIC_NOSPACE]=0 \{\
+. br
+. sp \\n[pdfpic*desired-height]u
+. \}
+.
+. pdfpic@cleanup
+..
+.
+.cp \n[*groff_pdfpic_tmac_C]
+.do rr *groff_pdfpic_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set expandtab filetype=groff tabstop=2 textwidth=72:
diff --git a/tmac/pic.tmac b/tmac/pic.tmac
new file mode 100644
index 0000000..d4aaaa4
--- /dev/null
+++ b/tmac/pic.tmac
@@ -0,0 +1,24 @@
+.\" pic.tmac
+.\"
+.de PS
+.br
+.sp .3v
+.ne 0\\$1+1v+\n(.Vu
+.in \\n(.lu-\\n(.iu-0\\$2/2u>?0
+..
+.de PF
+.in
+..
+.de PE
+.PF
+.sp .3v+.5m
+..
+.de PY
+.in
+..
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=nroff textwidth=72:
diff --git a/tmac/ps.tmac b/tmac/ps.tmac
new file mode 100644
index 0000000..9e59c57
--- /dev/null
+++ b/tmac/ps.tmac
@@ -0,0 +1,698 @@
+.\" -*- nroff -*-
+.\"
+.\" ps.tmac
+.\"
+.do nr *groff_ps_tmac_C \n[.cp]
+.cp 0
+.
+.ftr AX ABI
+.ftr KR BMR
+.ftr KI BMI
+.ftr KB BMB
+.ftr KX BMBI
+.ftr CW CR
+.ftr CO CI
+.ftr CX CBI
+.ftr H HR
+.ftr HO HI
+.ftr HX HBI
+.ftr Hr HNR
+.ftr Hi HNI
+.ftr Hb HNB
+.ftr Hx HNBI
+.ftr NX NBI
+.ftr PA PR
+.ftr PX PBI
+.ftr ZI ZCMI
+.ftr C CR
+.
+.cflags 8 \[an]
+.
+.char \[radicalex] \h'-\w'\[sr]'u'\[radicalex]\h'\w'\[sr]'u'
+.fchar \[sqrtex] \[radicalex]
+.char \[mo] \h'.08m'\[mo]\h'-.08m'
+.char \[nm] \h'.08m'\[nm]\h'-.08m'
+.char \[parenlefttp] \[parenlefttp]\h'.016m'
+.char \[parenleftbt] \[parenleftbt]\h'.016m'
+.char \[parenleftex] \[parenleftex]\h'.016m'
+.char \[parenrighttp] \[parenrighttp]\h'.016m'
+.char \[parenrightbt] \[parenrightbt]\h'.016m'
+.char \[parenrightex] \[parenrightex]\h'.016m'
+.
+.char \[or] \h'.1m'\Z'\D'l 0 -.675m''\h'.1m'
+.
+.\" This is designed so that \(ul, \(rn and \(br form corners.
+.char \[ul] \v'.25m'\D'l .5m 0'\v'-.25m'
+.char \[br] \Z'\v'.25m'\D'l 0 -1m''
+.char \[rn] \v'-.75m'\D'l .5m 0'\v'.75m'
+.
+.char \[ru] \D'l .5m 0'
+.
+.schar \[va] \o'\[ua]\[da]'
+.schar \[ci] \v'-.25m'\h'.05m'\D'c .5m'\h'.05m'\v'.25m'
+.schar \[sq] \h'.05m'\D'l .5m 0'\D'l 0 -.5m'\D'l -.5m 0'\D'l 0 .5m'\h'.55m'
+.fchar \[Fi] f\[fi]
+.fchar \[Fl] f\[fl]
+.fchar \[ff] ff
+.fchar \[fi] fi
+.fchar \[fl] fl
+.fchar \[ij] ij
+.fchar \[IJ] IJ
+.schar \[tm] \s-3\v'-.3m'TM\v'+.3m'\s+3
+.
+.schar \[<<] <\h'-.2m'<
+.schar \[>>] >\h'-.2m'>
+.schar \[|=] \v'.075m'\Z'\[mi]'\v'-.15m'\[ap]\v'.075m'
+.schar \[nc] \v'.1m'\Z'\h'.15m'\F[T]\f[R]/'\v'-.1m'\[sp]
+.schar \[ne] \v'.07m'\Z'\h'.13m'\F[T]\f[R]/'\v'-.07m'\[==]
+.schar \[-h] \F[T]\f[I]\v'-.53m'\Z'\h'.05m'\D'l .3m 0''\v'.53m'h
+.schar \[hbar] \[-h]
+.
+.de ps-achar
+. \" Note that character definitions are always interpreted with
+. \" compatibility mode off.
+. fchar \\$1 \
+\\$3\
+\k[acc]\
+\h'(u;-\w'\\$2'-\w'\\$3'/2+\\En[skw]+(\w'x'*0)-\\En[skw])'\
+\v'(u;\w'x'*0+\\En[rst]+(\w'\\$3'*0)-\\En[rst])'\
+\\$2\
+\v'(u;\w'x'*0-\\En[rst]+(\w'\\$3'*0)+\\En[rst])'\
+\h'|\\En[acc]u'
+. hcode \\$1\\$4
+..
+.
+.ps-achar \['C] \' C c
+.ps-achar \['c] \' c c
+.ps-achar "\[G ab]" \[ab] G g
+.ps-achar "\[g ab]" \[ab] g g
+.ps-achar "\[I .]" \[a.] I i
+.
+.fchar \[S ,] \o'S\[ac]'
+.hcode \[S ,]s
+.fchar \[s ,] \o's\[ac]'
+.hcode \[s ,]s
+.
+.de ps-frac
+. schar \[\\$1\\$2] \
+\v'-.28m'\s[\\En[.s]*6u/10u]\\$1\s0\v'.28m'\
+\[f/]\
+\s[\\En[.s]*6u/10u]\\$2
+..
+.
+.de ps-frac-mono
+. fschar \\$1 \[\\$2\\$3] \
+\Z'\v'-.28m'\s[\\En[.s]*5u/10u]\\$2\s0\v'.28m''\
+\Z'\h'.35m'\s[\\En[.s]*5u/10u]\\$3\s0'\
+\h'.02m'\[f/]\h'-.02m'
+..
+.
+.ps-frac 1 8
+.ps-frac 3 8
+.ps-frac 5 8
+.ps-frac 7 8
+.
+.ps-frac-mono CR 1 8
+.ps-frac-mono CR 3 8
+.ps-frac-mono CR 5 8
+.ps-frac-mono CR 7 8
+.ps-frac-mono CI 1 8
+.ps-frac-mono CI 3 8
+.ps-frac-mono CI 5 8
+.ps-frac-mono CI 7 8
+.ps-frac-mono CB 1 8
+.ps-frac-mono CB 3 8
+.ps-frac-mono CB 5 8
+.ps-frac-mono CB 7 8
+.ps-frac-mono CBI 1 8
+.ps-frac-mono CBI 3 8
+.ps-frac-mono CBI 5 8
+.ps-frac-mono CBI 7 8
+.
+.\" pic tests this register to see whether it should use \X'ps:...'
+.nr 0p 1
+.
+.\" now for color definitions
+.\"
+.\" this is a composite of MIT's X Consortium red/green/blue (rgb) color
+.\" specifications, X Consortium version 10.41, 1994.
+.defcolor black rgb #000000
+.defcolor grey rgb #bebebe
+.defcolor dimgrey rgb #696969
+.defcolor lightgray rgb #d3d3d3
+.defcolor lightslategrey rgb #778899
+.defcolor slategray rgb #708090
+.defcolor slategray1 rgb #c6e2ff
+.defcolor slategray2 rgb #b9d3ee
+.defcolor slategray3 rgb #9fb6cd
+.defcolor slategray4 rgb #6c7b8b
+.defcolor slategrey rgb #708090
+.defcolor grey0 rgb #000000
+.defcolor grey1 rgb #030303
+.defcolor grey2 rgb #050505
+.defcolor grey3 rgb #080808
+.defcolor grey4 rgb #0a0a0a
+.defcolor grey5 rgb #0d0d0d
+.defcolor grey6 rgb #0f0f0f
+.defcolor grey7 rgb #121212
+.defcolor grey8 rgb #141414
+.defcolor grey9 rgb #171717
+.defcolor grey10 rgb #1a1a1a
+.defcolor grey11 rgb #1c1c1c
+.defcolor grey12 rgb #1f1f1f
+.defcolor grey13 rgb #212121
+.defcolor grey14 rgb #242424
+.defcolor grey15 rgb #262626
+.defcolor grey16 rgb #292929
+.defcolor grey17 rgb #2b2b2b
+.defcolor grey18 rgb #2e2e2e
+.defcolor grey19 rgb #303030
+.defcolor grey20 rgb #333333
+.defcolor grey21 rgb #363636
+.defcolor grey22 rgb #383838
+.defcolor grey23 rgb #3b3b3b
+.defcolor grey24 rgb #3d3d3d
+.defcolor grey25 rgb #404040
+.defcolor grey26 rgb #424242
+.defcolor grey27 rgb #454545
+.defcolor grey28 rgb #474747
+.defcolor grey29 rgb #4a4a4a
+.defcolor grey30 rgb #4d4d4d
+.defcolor grey31 rgb #4f4f4f
+.defcolor grey32 rgb #525252
+.defcolor grey33 rgb #545454
+.defcolor grey34 rgb #575757
+.defcolor grey35 rgb #595959
+.defcolor grey36 rgb #5c5c5c
+.defcolor grey37 rgb #5e5e5e
+.defcolor grey38 rgb #616161
+.defcolor grey39 rgb #636363
+.defcolor grey40 rgb #666666
+.defcolor grey41 rgb #696969
+.defcolor grey42 rgb #6b6b6b
+.defcolor grey43 rgb #6e6e6e
+.defcolor grey44 rgb #707070
+.defcolor grey45 rgb #737373
+.defcolor grey46 rgb #757575
+.defcolor grey47 rgb #787878
+.defcolor grey48 rgb #7a7a7a
+.defcolor grey49 rgb #7d7d7d
+.defcolor grey50 rgb #7f7f7f
+.defcolor grey51 rgb #828282
+.defcolor grey52 rgb #858585
+.defcolor grey53 rgb #878787
+.defcolor grey54 rgb #8a8a8a
+.defcolor grey55 rgb #8c8c8c
+.defcolor grey56 rgb #8f8f8f
+.defcolor grey57 rgb #919191
+.defcolor grey58 rgb #949494
+.defcolor grey59 rgb #969696
+.defcolor grey60 rgb #999999
+.defcolor grey61 rgb #9c9c9c
+.defcolor grey62 rgb #9e9e9e
+.defcolor grey63 rgb #a1a1a1
+.defcolor grey64 rgb #a3a3a3
+.defcolor grey65 rgb #a6a6a6
+.defcolor grey66 rgb #a8a8a8
+.defcolor grey67 rgb #ababab
+.defcolor grey68 rgb #adadad
+.defcolor grey69 rgb #b0b0b0
+.defcolor grey70 rgb #b3b3b3
+.defcolor grey71 rgb #b5b5b5
+.defcolor grey72 rgb #b8b8b8
+.defcolor grey73 rgb #bababa
+.defcolor grey74 rgb #bdbdbd
+.defcolor grey75 rgb #bfbfbf
+.defcolor grey76 rgb #c2c2c2
+.defcolor grey77 rgb #c4c4c4
+.defcolor grey78 rgb #c7c7c7
+.defcolor grey79 rgb #c9c9c9
+.defcolor grey80 rgb #cccccc
+.defcolor grey81 rgb #cfcfcf
+.defcolor grey82 rgb #d1d1d1
+.defcolor grey83 rgb #d4d4d4
+.defcolor grey84 rgb #d6d6d6
+.defcolor grey85 rgb #d9d9d9
+.defcolor grey86 rgb #dbdbdb
+.defcolor grey87 rgb #dedede
+.defcolor grey88 rgb #e0e0e0
+.defcolor grey89 rgb #e3e3e3
+.defcolor grey90 rgb #e5e5e5
+.defcolor grey91 rgb #e8e8e8
+.defcolor grey92 rgb #ebebeb
+.defcolor grey93 rgb #ededed
+.defcolor grey94 rgb #f0f0f0
+.defcolor grey95 rgb #f2f2f2
+.defcolor grey96 rgb #f5f5f5
+.defcolor grey97 rgb #f7f7f7
+.defcolor grey98 rgb #fafafa
+.defcolor grey99 rgb #fcfcfc
+.defcolor grey100 rgb #ffffff
+.defcolor aliceblue rgb #f0f8ff
+.defcolor blueviolet rgb #8a2be2
+.defcolor cadetblue rgb #5f9ea0
+.defcolor cadetblue1 rgb #98f5ff
+.defcolor cadetblue2 rgb #8ee5ee
+.defcolor cadetblue3 rgb #7ac5cd
+.defcolor cadetblue4 rgb #53868b
+.defcolor cornflowerblue rgb #6495ed
+.defcolor darkslateblue rgb #483d8b
+.defcolor darkturquoise rgb #00ced1
+.defcolor deepskyblue rgb #00bfff
+.defcolor deepskyblue1 rgb #00bfff
+.defcolor deepskyblue2 rgb #00b2ee
+.defcolor deepskyblue3 rgb #009acd
+.defcolor deepskyblue4 rgb #00688b
+.defcolor dodgerblue rgb #1e90ff
+.defcolor dodgerblue1 rgb #1e90ff
+.defcolor dodgerblue2 rgb #1c86ee
+.defcolor dodgerblue3 rgb #1874cd
+.defcolor dodgerblue4 rgb #104e8b
+.defcolor lightblue rgb #add8e6
+.defcolor lightblue1 rgb #bfefff
+.defcolor lightblue2 rgb #b2dfee
+.defcolor lightblue3 rgb #9ac0cd
+.defcolor lightblue4 rgb #68838b
+.defcolor lightcyan rgb #e0ffff
+.defcolor lightcyan1 rgb #e0ffff
+.defcolor lightcyan2 rgb #d1eeee
+.defcolor lightcyan3 rgb #b4cdcd
+.defcolor lightcyan4 rgb #7a8b8b
+.defcolor lightskyblue rgb #87cefa
+.defcolor lightskyblue1 rgb #b0e2ff
+.defcolor lightskyblue2 rgb #a4d3ee
+.defcolor lightskyblue3 rgb #8db6cd
+.defcolor lightskyblue4 rgb #607b8b
+.defcolor lightslateblue rgb #8470ff
+.defcolor lightsteelblue rgb #b0c4de
+.defcolor lightsteelblue1 rgb #cae1ff
+.defcolor lightsteelblue2 rgb #bcd2ee
+.defcolor lightsteelblue3 rgb #a2b5cd
+.defcolor lightsteelblue4 rgb #6e7b8b
+.defcolor mediumaquamarine rgb #66cdaa
+.defcolor mediumblue rgb #0000cd
+.defcolor mediumslateblue rgb #7b68ee
+.defcolor mediumturquoise rgb #48d1cc
+.defcolor midnightblue rgb #191970
+.defcolor navyblue rgb #000080
+.defcolor paleturquoise rgb #afeeee
+.defcolor paleturquoise1 rgb #bbffff
+.defcolor paleturquoise2 rgb #aeeeee
+.defcolor paleturquoise3 rgb #96cdcd
+.defcolor paleturquoise4 rgb #668b8b
+.defcolor powderblue rgb #b0e0e6
+.defcolor royalblue rgb #4169e1
+.defcolor royalblue1 rgb #4876ff
+.defcolor royalblue2 rgb #436eee
+.defcolor royalblue3 rgb #3a5fcd
+.defcolor royalblue4 rgb #27408b
+.defcolor skyblue rgb #87ceeb
+.defcolor skyblue1 rgb #87ceff
+.defcolor skyblue2 rgb #7ec0ee
+.defcolor skyblue3 rgb #6ca6cd
+.defcolor skyblue4 rgb #4a708b
+.defcolor slateblue rgb #6a5acd
+.defcolor slateblue1 rgb #836fff
+.defcolor slateblue2 rgb #7a67ee
+.defcolor slateblue3 rgb #6959cd
+.defcolor slateblue4 rgb #473c8b
+.defcolor steelblue rgb #4682b4
+.defcolor steelblue1 rgb #63b8ff
+.defcolor steelblue2 rgb #5cacee
+.defcolor steelblue3 rgb #4f94cd
+.defcolor steelblue4 rgb #36648b
+.defcolor aquamarine rgb #7fffd4
+.defcolor aquamarine1 rgb #7fffd4
+.defcolor aquamarine2 rgb #76eec6
+.defcolor aquamarine3 rgb #66cdaa
+.defcolor aquamarine4 rgb #458b74
+.defcolor azure rgb #f0ffff
+.defcolor azure1 rgb #f0ffff
+.defcolor azure2 rgb #e0eeee
+.defcolor azure3 rgb #c1cdcd
+.defcolor azure4 rgb #838b8b
+.defcolor blue rgb #0000ff
+.defcolor blue1 rgb #0000ff
+.defcolor blue2 rgb #0000ee
+.defcolor blue3 rgb #0000cd
+.defcolor blue4 rgb #00008b
+.defcolor cyan rgb #00ffff
+.defcolor cyan1 rgb #00ffff
+.defcolor cyan2 rgb #00eeee
+.defcolor cyan3 rgb #00cdcd
+.defcolor cyan4 rgb #008b8b
+.defcolor navy rgb #000080
+.defcolor turquoise rgb #40e0d0
+.defcolor turquoise1 rgb #00f5ff
+.defcolor turquoise2 rgb #00e5ee
+.defcolor turquoise3 rgb #00c5cd
+.defcolor turquoise4 rgb #00868b
+.defcolor darkslategray rgb #2f4f4f
+.defcolor darkslategray1 rgb #97ffff
+.defcolor darkslategray2 rgb #8deeee
+.defcolor darkslategray3 rgb #79cdcd
+.defcolor darkslategray4 rgb #528b8b
+.defcolor rosybrown rgb #bc8f8f
+.defcolor rosybrown1 rgb #ffc1c1
+.defcolor rosybrown2 rgb #eeb4b4
+.defcolor rosybrown3 rgb #cd9b9b
+.defcolor rosybrown4 rgb #8b6969
+.defcolor saddlebrown rgb #8b4513
+.defcolor sandybrown rgb #f4a460
+.defcolor beige rgb #f5f5dc
+.defcolor brown rgb #a52a2a
+.defcolor brown1 rgb #ff4040
+.defcolor brown2 rgb #ee3b3b
+.defcolor brown3 rgb #cd3333
+.defcolor brown4 rgb #8b2323
+.defcolor burlywood rgb #deb887
+.defcolor burlywood1 rgb #ffd39b
+.defcolor burlywood2 rgb #eec591
+.defcolor burlywood3 rgb #cdaa7d
+.defcolor burlywood4 rgb #8b7355
+.defcolor chocolate rgb #d2691e
+.defcolor chocolate1 rgb #ff7f24
+.defcolor chocolate2 rgb #ee7621
+.defcolor chocolate3 rgb #cd661d
+.defcolor chocolate4 rgb #8b4513
+.defcolor peru rgb #cd853f
+.defcolor tan rgb #d2b48c
+.defcolor tan1 rgb #ffa54f
+.defcolor tan2 rgb #ee9a49
+.defcolor tan3 rgb #cd853f
+.defcolor tan4 rgb #8b5a2b
+.defcolor darkgreen rgb #006400
+.defcolor darkkhaki rgb #bdb76b
+.defcolor darkolivegreen rgb #556b2f
+.defcolor darkolivegreen1 rgb #caff70
+.defcolor darkolivegreen2 rgb #bcee68
+.defcolor darkolivegreen3 rgb #a2cd5a
+.defcolor darkolivegreen4 rgb #6e8b3d
+.defcolor darkseagreen rgb #8fbc8f
+.defcolor darkseagreen1 rgb #c1ffc1
+.defcolor darkseagreen2 rgb #b4eeb4
+.defcolor darkseagreen3 rgb #9bcd9b
+.defcolor darkseagreen4 rgb #698b69
+.defcolor forestgreen rgb #228b22
+.defcolor greenyellow rgb #adff2f
+.defcolor lawngreen rgb #7cfc00
+.defcolor lightseagreen rgb #20b2aa
+.defcolor limegreen rgb #32cd32
+.defcolor mediumseagreen rgb #3cb371
+.defcolor mediumspringgreen rgb #00fa9a
+.defcolor mintcream rgb #f5fffa
+.defcolor olivedrab rgb #6b8e23
+.defcolor olivedrab1 rgb #c0ff3e
+.defcolor olivedrab2 rgb #b3ee3a
+.defcolor olivedrab3 rgb #9acd32
+.defcolor olivedrab4 rgb #698b22
+.defcolor palegreen rgb #98fb98
+.defcolor palegreen1 rgb #9aff9a
+.defcolor palegreen2 rgb #90ee90
+.defcolor palegreen3 rgb #7ccd7c
+.defcolor palegreen4 rgb #548b54
+.defcolor seagreen rgb #2e8b57
+.defcolor seagreen1 rgb #54ff9f
+.defcolor seagreen2 rgb #4eee94
+.defcolor seagreen3 rgb #43cd80
+.defcolor seagreen4 rgb #2e8b57
+.defcolor springgreen rgb #00ff7f
+.defcolor springgreen1 rgb #00ff7f
+.defcolor springgreen2 rgb #00ee76
+.defcolor springgreen3 rgb #00cd66
+.defcolor springgreen4 rgb #008b45
+.defcolor yellowgreen rgb #9acd32
+.defcolor chartreuse rgb #7fff00
+.defcolor chartreuse1 rgb #7fff00
+.defcolor chartreuse2 rgb #76ee00
+.defcolor chartreuse3 rgb #66cd00
+.defcolor chartreuse4 rgb #458b00
+.defcolor green rgb #00ff00
+.defcolor green1 rgb #00ff00
+.defcolor green2 rgb #00ee00
+.defcolor green3 rgb #00cd00
+.defcolor green4 rgb #008b00
+.defcolor khaki rgb #f0e68c
+.defcolor khaki1 rgb #fff68f
+.defcolor khaki2 rgb #eee685
+.defcolor khaki3 rgb #cdc673
+.defcolor khaki4 rgb #8b864e
+.defcolor darkorange rgb #ff8c00
+.defcolor darkorange1 rgb #ff7f00
+.defcolor darkorange2 rgb #ee7600
+.defcolor darkorange3 rgb #cd6600
+.defcolor darkorange4 rgb #8b4500
+.defcolor darksalmon rgb #e9967a
+.defcolor lightcoral rgb #f08080
+.defcolor lightsalmon rgb #ffa07a
+.defcolor lightsalmon1 rgb #ffa07a
+.defcolor lightsalmon2 rgb #ee9572
+.defcolor lightsalmon3 rgb #cd8162
+.defcolor lightsalmon4 rgb #8b5742
+.defcolor peachpuff rgb #ffdab9
+.defcolor peachpuff1 rgb #ffdab9
+.defcolor peachpuff2 rgb #eecbad
+.defcolor peachpuff3 rgb #cdaf95
+.defcolor peachpuff4 rgb #8b7765
+.defcolor bisque rgb #ffe4c4
+.defcolor bisque1 rgb #ffe4c4
+.defcolor bisque2 rgb #eed5b7
+.defcolor bisque3 rgb #cdb79e
+.defcolor bisque4 rgb #8b7d6b
+.defcolor coral rgb #ff7f50
+.defcolor coral1 rgb #ff7256
+.defcolor coral2 rgb #ee6a50
+.defcolor coral3 rgb #cd5b45
+.defcolor coral4 rgb #8b3e2f
+.defcolor honeydew rgb #f0fff0
+.defcolor honeydew1 rgb #f0fff0
+.defcolor honeydew2 rgb #e0eee0
+.defcolor honeydew3 rgb #c1cdc1
+.defcolor honeydew4 rgb #838b83
+.defcolor orange rgb #ffa500
+.defcolor orange1 rgb #ffa500
+.defcolor orange2 rgb #ee9a00
+.defcolor orange3 rgb #cd8500
+.defcolor orange4 rgb #8b5a00
+.defcolor salmon rgb #fa8072
+.defcolor salmon1 rgb #ff8c69
+.defcolor salmon2 rgb #ee8262
+.defcolor salmon3 rgb #cd7054
+.defcolor salmon4 rgb #8b4c39
+.defcolor sienna rgb #a0522d
+.defcolor sienna1 rgb #ff8247
+.defcolor sienna2 rgb #ee7942
+.defcolor sienna3 rgb #cd6839
+.defcolor sienna4 rgb #8b4726
+.defcolor deeppink rgb #ff1493
+.defcolor deeppink1 rgb #ff1493
+.defcolor deeppink2 rgb #ee1289
+.defcolor deeppink3 rgb #cd1076
+.defcolor deeppink4 rgb #8b0a50
+.defcolor hotpink rgb #ff69b4
+.defcolor hotpink1 rgb #ff6eb4
+.defcolor hotpink2 rgb #ee6aa7
+.defcolor hotpink3 rgb #cd6090
+.defcolor hotpink4 rgb #8b3a62
+.defcolor indianred rgb #cd5c5c
+.defcolor indianred1 rgb #ff6a6a
+.defcolor indianred2 rgb #ee6363
+.defcolor indianred3 rgb #cd5555
+.defcolor indianred4 rgb #8b3a3a
+.defcolor lightpink rgb #ffb6c1
+.defcolor lightpink1 rgb #ffaeb9
+.defcolor lightpink2 rgb #eea2ad
+.defcolor lightpink3 rgb #cd8c95
+.defcolor lightpink4 rgb #8b5f65
+.defcolor mediumvioletred rgb #c71585
+.defcolor mistyrose rgb #ffe4e1
+.defcolor mistyrose1 rgb #ffe4e1
+.defcolor mistyrose2 rgb #eed5d2
+.defcolor mistyrose3 rgb #cdb7b5
+.defcolor mistyrose4 rgb #8b7d7b
+.defcolor orangered rgb #ff4500
+.defcolor orangered1 rgb #ff4500
+.defcolor orangered2 rgb #ee4000
+.defcolor orangered3 rgb #cd3700
+.defcolor orangered4 rgb #8b2500
+.defcolor palevioletred rgb #db7093
+.defcolor palevioletred1 rgb #ff82ab
+.defcolor palevioletred2 rgb #ee799f
+.defcolor palevioletred3 rgb #cd6889
+.defcolor palevioletred4 rgb #8b475d
+.defcolor violetred rgb #d02090
+.defcolor violetred1 rgb #ff3e96
+.defcolor violetred2 rgb #ee3a8c
+.defcolor violetred3 rgb #cd3278
+.defcolor violetred4 rgb #8b2252
+.defcolor firebrick rgb #b22222
+.defcolor firebrick1 rgb #ff3030
+.defcolor firebrick2 rgb #ee2c2c
+.defcolor firebrick3 rgb #cd2626
+.defcolor firebrick4 rgb #8b1a1a
+.defcolor pink rgb #ffc0cb
+.defcolor pink1 rgb #ffb5c5
+.defcolor pink2 rgb #eea9b8
+.defcolor pink3 rgb #cd919e
+.defcolor pink4 rgb #8b636c
+.defcolor red rgb #ff0000
+.defcolor red1 rgb #ff0000
+.defcolor red2 rgb #ee0000
+.defcolor red3 rgb #cd0000
+.defcolor red4 rgb #8b0000
+.defcolor tomato rgb #ff6347
+.defcolor tomato1 rgb #ff6347
+.defcolor tomato2 rgb #ee5c42
+.defcolor tomato3 rgb #cd4f39
+.defcolor tomato4 rgb #8b3626
+.defcolor darkorchid rgb #9932cc
+.defcolor darkorchid1 rgb #bf3eff
+.defcolor darkorchid2 rgb #b23aee
+.defcolor darkorchid3 rgb #9a32cd
+.defcolor darkorchid4 rgb #68228b
+.defcolor darkviolet rgb #9400d3
+.defcolor lavenderblush rgb #fff0f5
+.defcolor lavenderblush1 rgb #fff0f5
+.defcolor lavenderblush2 rgb #eee0e5
+.defcolor lavenderblush3 rgb #cdc1c5
+.defcolor lavenderblush4 rgb #8b8386
+.defcolor mediumorchid rgb #ba55d3
+.defcolor mediumorchid1 rgb #e066ff
+.defcolor mediumorchid2 rgb #d15fee
+.defcolor mediumorchid3 rgb #b452cd
+.defcolor mediumorchid4 rgb #7a378b
+.defcolor mediumpurple rgb #9370db
+.defcolor mediumpurple1 rgb #ab82ff
+.defcolor mediumpurple2 rgb #9f79ee
+.defcolor mediumpurple3 rgb #8968cd
+.defcolor mediumpurple4 rgb #5d478b
+.defcolor lavender rgb #e6e6fa
+.defcolor magenta rgb #ff00ff
+.defcolor magenta1 rgb #ff00ff
+.defcolor magenta2 rgb #ee00ee
+.defcolor magenta3 rgb #cd00cd
+.defcolor magenta4 rgb #8b008b
+.defcolor maroon rgb #b03060
+.defcolor maroon1 rgb #ff34b3
+.defcolor maroon2 rgb #ee30a7
+.defcolor maroon3 rgb #cd2990
+.defcolor maroon4 rgb #8b1c62
+.defcolor orchid rgb #da70d6
+.defcolor orchid1 rgb #ff83fa
+.defcolor orchid2 rgb #ee7ae9
+.defcolor orchid3 rgb #cd69c9
+.defcolor orchid4 rgb #8b4789
+.defcolor plum rgb #dda0dd
+.defcolor plum1 rgb #ffbbff
+.defcolor plum2 rgb #eeaeee
+.defcolor plum3 rgb #cd96cd
+.defcolor plum4 rgb #8b668b
+.defcolor purple rgb #a020f0
+.defcolor purple1 rgb #9b30ff
+.defcolor purple2 rgb #912cee
+.defcolor purple3 rgb #7d26cd
+.defcolor purple4 rgb #551a8b
+.defcolor thistle rgb #d8bfd8
+.defcolor thistle1 rgb #ffe1ff
+.defcolor thistle2 rgb #eed2ee
+.defcolor thistle3 rgb #cdb5cd
+.defcolor thistle4 rgb #8b7b8b
+.defcolor violet rgb #ee82ee
+.defcolor antiquewhite rgb #faebd7
+.defcolor antiquewhite1 rgb #ffefdb
+.defcolor antiquewhite2 rgb #eedfcc
+.defcolor antiquewhite3 rgb #cdc0b0
+.defcolor antiquewhite4 rgb #8b8378
+.defcolor floralwhite rgb #fffaf0
+.defcolor ghostwhite rgb #f8f8ff
+.defcolor navajowhite rgb #ffdead
+.defcolor navajowhite1 rgb #ffdead
+.defcolor navajowhite2 rgb #eecfa1
+.defcolor navajowhite3 rgb #cdb38b
+.defcolor navajowhite4 rgb #8b795e
+.defcolor oldlace rgb #fdf5e6
+.defcolor whitesmoke rgb #f5f5f5
+.defcolor gainsboro rgb #dcdcdc
+.defcolor ivory rgb #fffff0
+.defcolor ivory1 rgb #fffff0
+.defcolor ivory2 rgb #eeeee0
+.defcolor ivory3 rgb #cdcdc1
+.defcolor ivory4 rgb #8b8b83
+.defcolor linen rgb #faf0e6
+.defcolor seashell rgb #fff5ee
+.defcolor seashell1 rgb #fff5ee
+.defcolor seashell2 rgb #eee5de
+.defcolor seashell3 rgb #cdc5bf
+.defcolor seashell4 rgb #8b8682
+.defcolor snow rgb #fffafa
+.defcolor snow1 rgb #fffafa
+.defcolor snow2 rgb #eee9e9
+.defcolor snow3 rgb #cdc9c9
+.defcolor snow4 rgb #8b8989
+.defcolor wheat rgb #f5deb3
+.defcolor wheat1 rgb #ffe7ba
+.defcolor wheat2 rgb #eed8ae
+.defcolor wheat3 rgb #cdba96
+.defcolor wheat4 rgb #8b7e66
+.defcolor white rgb #ffffff
+.defcolor blanchedalmond rgb #ffebcd
+.defcolor darkgoldenrod rgb #b8860b
+.defcolor darkgoldenrod1 rgb #ffb90f
+.defcolor darkgoldenrod2 rgb #eead0e
+.defcolor darkgoldenrod3 rgb #cd950c
+.defcolor darkgoldenrod4 rgb #8b6508
+.defcolor lemonchiffon rgb #fffacd
+.defcolor lemonchiffon1 rgb #fffacd
+.defcolor lemonchiffon2 rgb #eee9bf
+.defcolor lemonchiffon3 rgb #cdc9a5
+.defcolor lemonchiffon4 rgb #8b8970
+.defcolor lightgoldenrod rgb #eedd82
+.defcolor lightgoldenrod1 rgb #ffec8b
+.defcolor lightgoldenrod2 rgb #eedc82
+.defcolor lightgoldenrod3 rgb #cdbe70
+.defcolor lightgoldenrod4 rgb #8b814c
+.defcolor lightgoldenrodyellow rgb #fafad2
+.defcolor lightyellow rgb #ffffe0
+.defcolor lightyellow1 rgb #ffffe0
+.defcolor lightyellow2 rgb #eeeed1
+.defcolor lightyellow3 rgb #cdcdb4
+.defcolor lightyellow4 rgb #8b8b7a
+.defcolor palegoldenrod rgb #eee8aa
+.defcolor papayawhip rgb #ffefd5
+.defcolor cornsilk rgb #fff8dc
+.defcolor cornsilk1 rgb #fff8dc
+.defcolor cornsilk2 rgb #eee8cd
+.defcolor cornsilk3 rgb #cdc8b1
+.defcolor cornsilk4 rgb #8b8878
+.defcolor gold rgb #ffd700
+.defcolor gold1 rgb #ffd700
+.defcolor gold2 rgb #eec900
+.defcolor gold3 rgb #cdad00
+.defcolor gold4 rgb #8b7500
+.defcolor goldenrod rgb #daa520
+.defcolor goldenrod1 rgb #ffc125
+.defcolor goldenrod2 rgb #eeb422
+.defcolor goldenrod3 rgb #cd9b1d
+.defcolor goldenrod4 rgb #8b6914
+.defcolor moccasin rgb #ffe4b5
+.defcolor yellow rgb #ffff00
+.defcolor yellow1 rgb #ffff00
+.defcolor yellow2 rgb #eeee00
+.defcolor yellow3 rgb #cdcd00
+.defcolor yellow4 rgb #8b8b00
+.
+.ie '\[char97]'a' \
+. mso latin1.tmac
+.el \
+. mso cp1047.tmac
+.
+.mso europs.tmac
+.
+.cp \n[*groff_ps_tmac_C]
+.do rr *groff_ps_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/psatk.tmac b/tmac/psatk.tmac
new file mode 100644
index 0000000..ba256e7
--- /dev/null
+++ b/tmac/psatk.tmac
@@ -0,0 +1,78 @@
+.\" -*- nroff -*-
+.\"
+.\" psatk.tmac
+.\"
+.\" Implementation of the ATK PB and PE macros for use with groff and grops.
+.\" Load this after atk.tmac.
+.
+.do nr *groff_psatk_tmac_C \n[.cp]
+.cp 0
+.
+.nr zT 0
+.if '\*(.T'ps' .nr zT 1
+.nr psatk-unit 1p
+.de psatk-defs
+ps: mdef 5
+/PB {
+ /saved save def
+ currentpoint translate
+ \n[psatk-unit] u -\n[psatk-unit] u scale
+ userdict begin
+ /showpage {} def
+} bind def
+/PE {
+ end
+ saved restore
+} bind def
+/troffadjust {
+ pop 0
+} bind def
+..
+.de PB
+.ne \\$1p
+.nr zT \\n(zT>0
+\\*[PB\\n(zT]\\
+..
+.de PE
+\\*[PE\\n(zT]\\
+..
+.ds PB0
+.\" The last line before the "'PE" is "\}" rather than ".\}". This
+.\" would cause a spurious space to be introduced before any picture
+.\" that was the first thing on a line. So we have to catch that and
+.\" remove it.
+.de PB1
+.ev psatk
+.fi
+.di psatk-mac
+\!ps: exec PB
+..
+.de PE0
+\v'-.75m'\
+\D'l \\$1p 0'\D'l 0 \\$2p'\D'l -\\$1p 0'\D'l 0 -\\$2p'\
+\h'\\$1p'\v'.75m'\x'\\$2p-1m>?0'\c
+..
+.ds psatk-init \Y[psatk-defs]
+.de PE1
+\!PE
+.di
+.di null
+.br
+.di
+.rm null
+.ev
+\v'-.75m'\
+\\*[psatk-init]\Y[psatk-mac]\
+\h'\\$1p'\v'.75m'\x'\\$2p-1m>?0'\c
+.rm psatk-mac
+.if \\n(.P .ds psatk-init
+..
+.
+.cp \n[*groff_psatk_tmac_C]
+.do rr *groff_psatk_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/psfig.tmac b/tmac/psfig.tmac
new file mode 100644
index 0000000..3df5fe3
--- /dev/null
+++ b/tmac/psfig.tmac
@@ -0,0 +1,104 @@
+.\" -*- nroff -*-
+.\"
+.\" psfig.tmac
+.\"
+.\" These are macros to make psfig work with groff.
+.\" They require that psfig be patched as described in ../grops/psfig.diff.
+.
+.do nr *groff_psfig_tmac_C \n[.cp]
+.cp 0
+.
+.de psfig-defs
+ps: mdef 100
+
+% wid ht llx lly urx ury psfigstart -
+
+/psfigstart {
+ /level1 save def
+ /ury exch def
+ /urx exch def
+ /lly exch def
+ /llx exch def
+ /ht exch u def
+ /wid exch u def
+ currentpoint ht add translate
+ wid urx llx sub div ht ury lly sub div neg scale
+ llx neg lly neg translate
+
+ % set the graphics state to default values
+ 0 setgray
+ 0 setlinecap
+ 1 setlinewidth
+ 0 setlinejoin
+ 10 setmiterlimit
+ [] 0 setdash
+ newpath
+ /showpage {} def
+} bind def
+
+% psfigclip -
+
+/psfigclip {
+ currentpoint newpath
+ llx lly moveto
+ urx lly lineto
+ urx ury lineto
+ llx ury lineto
+ closepath clip
+ newpath moveto
+} bind def
+
+% psfigend -
+
+/psfigend {
+ level1 restore
+} bind def
+
+% globalstart -
+
+/globalstart {
+ % save the current space code on the stack
+ SC
+ level0 restore
+} bind def
+
+% globalend -
+
+/globalend {
+ end
+ BP
+ /SC exch def
+ DEFS begin
+} bind def
+..
+.de psfig-init
+.if \\n[.P] \{\
+\Y[psfig-defs]
+. br
+. sp -1
+. ds psfig-init\" empty
+. rm psfig-defs
+.\}
+..
+.de F+
+.br
+.psfig-init
+.nr psfig-fill \\n[.u]
+.nf
+.sp -.5
+.if !\\n[.$] .ce 9999
+..
+.de F-
+.br
+.ce 0
+.if \\n[psfig-fill] .fi
+..
+.
+.cp \n[*groff_psfig_tmac_C]
+.do rr *groff_psfig_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/psold.tmac b/tmac/psold.tmac
new file mode 100644
index 0000000..d390412
--- /dev/null
+++ b/tmac/psold.tmac
@@ -0,0 +1,70 @@
+.\" -*- nroff -*-
+.\"
+.\" psold.tmac
+.\"
+.\" In newer PostScript printers, text fonts contain all ISO Latin-1
+.\" characters. The font description files that comes with groff match
+.\" these fonts. The text fonts in older PostScript printers are missing
+.\" some of these characters. This file prevents those characters from
+.\" being used. This will allow the PostScript output to be printed on
+.\" such old printers.
+.do nr *groff_psold_tmac_C \n[.cp]
+.cp 0
+.\" Define an accented character.
+.de ps-achar
+.\" Note that character definitions are always interpreted with
+.\" compatibility mode off.
+.char \\$1 \\$3\
+\k[acc]\
+\h'(u;-\w'\\$2'-\w'\\$3'/2+\\\\n[skw]+(\w'x'*0)-\\\\n[skw])'\
+\v'(u;\w'x'*0+\\\\n[rst]+(\w'\\$3'*0)-\\\\n[rst])'\
+\\$2\
+\v'(u;\w'x'*0-\\\\n[rst]+(\w'\\$3'*0)+\\\\n[rst])'\
+\h'|\\\\n[acc]u'
+.ie '\\$3'\(.i' .hcode \\$1i
+.el .hcode \\$1\\$3
+..
+.ps-achar \['y] \(aa y
+.ps-achar \['Y] \(aa Y
+.char \[12] \v'-.7m\s[\\n(.s*6u/10u]+.7m'1\v'-.7m\s0+.7m'\
+\(f/\s[\\n(.s*6u/10u]2\s0
+.char \[14] \v'-.7m\s[\\n(.s*6u/10u]+.7m'1\v'-.7m\s0+.7m'\
+\(f/\s[\\n(.s*6u/10u]4\s0
+.char \[34] \v'-.7m\s[\\n(.s*6u/10u]+.7m'3\v'-.7m\s0+.7m'\
+\(f/\s[\\n(.s*6u/10u]4\s0
+.char \[S1] \v'-.2m'\s-31\s+3\v'+.2m'
+.char \[S2] \v'-.2m'\s-32\s+3\v'+.2m'
+.char \[S3] \v'-.2m'\s-33\s+3\v'+.2m'
+.char \[bb] |
+.char \[de] \fS\(de
+.char \[-D] \Z'\v'-.1m'-'D
+.char \[TP] \
+I\h'-.25m'\v'-.33m'\s'\En(.s*6u/10u'\v'.33m'D\v'-.33m'\s0\v'.33m'
+.char \[Sd] \Z'\v'-.3m'\h'.2m'-'\(pd
+.char \[Tp] \zlp
+.tr \[char166]\[bb]
+.tr \[char176]\[de]
+.tr \[char177]\[+-]
+.tr \[char178]\[S2]
+.tr \[char179]\[S3]
+.tr \[char181]\[mc]
+.tr \[char185]\[S1]
+.tr \[char188]\[14]
+.tr \[char189]\[12]
+.tr \[char190]\[34]
+.tr \[char208]\[-D]
+.tr \[char215]\[mu]
+.tr \[char221]\['Y]
+.tr \[char222]\[TP]
+.tr \[char240]\[Sd]
+.tr \[char247]\[di]
+.tr \[char253]\['y]
+.tr \[char254]\[Tp]
+.cp \n[*groff_psold_tmac_C]
+.do rr *groff_psold_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/pspic.tmac b/tmac/pspic.tmac
new file mode 100644
index 0000000..98f9ba4
--- /dev/null
+++ b/tmac/pspic.tmac
@@ -0,0 +1,178 @@
+.\" Define the PSPIC macro.
+.\"
+.\" When used with output devices other than ps, dvi, html, or xhtml,
+.\" draw a box where the picture would go.
+.\"
+.\" Usage:
+.\"
+.\" .PSPIC [-L|-R|-C|-I <indentation>] <file> [<width> [<height>]]
+.
+.do if d PSPIC .nx
+.
+.do nr *groff_pspic_tmac_C \n[.cp]
+.cp 0
+.
+.\" This is called if the `psbb` request returned a bounding box of all
+.\" zeroes. It already issues a diagnostic; one can append `ab` to this
+.\" macro if that should be a fatal error, or redefine it for some other
+.\" purpose.
+.de pspic*error-hook
+..
+.
+.de PSPIC
+. nr ps-offset-mode 0
+. \" left-aligned?
+. ie '\\$1'-L' \{\
+. nr ps-offset-mode 1
+. shift
+. HTML-DO-IMAGE \\$1 l
+. \}
+. el \{\
+. \" right-aligned?
+. ie '\\$1'-R' \{\
+. nr ps-offset-mode 2
+. shift
+. HTML-DO-IMAGE \\$1 r
+. \}
+. el \{\
+. \" indented?
+. ie '\\$1'-I' \{\
+. nr ps-offset-mode 3
+. nr ps-offset (m;\\$2)
+. shift 2
+. HTML-DO-IMAGE \\$1 i
+. \}
+. el \{\
+. \" centered is the default
+. if '\\$1'-C' \
+. shift
+. HTML-DO-IMAGE \\$1 c
+. \}
+. \}
+. \}
+.
+. br
+.
+. \" get bounding box
+. psbb \\$1
+. ie (\\n[llx] : \\n[lly] : \\n[urx] : \\n[ury]) \{\
+. nr ps-wid (\\n[urx] - \\n[llx])
+. nr ps-ht (\\n[ury] - \\n[lly])
+. if (\\n[ps-wid] < 0) \
+. nr ps-wid (-\\n[ps-wid])
+. if (\\n[ps-ht] < 0) \
+. nr ps-ht (-\\n[ps-ht])
+.
+. \" if we have a <width> parameter, use it as the final
+. \" image width; otherwise we use the image's natural width
+. \" or the current line length, whatever is smaller
+. ie (\\n[.$] >= 2) \
+. nr ps-deswid (i;\\$2)
+. el \
+. nr ps-deswid ((\\n[.l] - \\n[.i]) <? \\n[ps-wid]p)
+.
+. \" compute the final image height (with proper rounding),
+. \" based on the image's aspect
+. nr ps-desht (\\n[ps-deswid] * 1000 + (\\n[ps-wid] / 2) \
+ / \\n[ps-wid] * \\n[ps-ht] \
+ + 500 / 1000)
+.
+. \" if we have a <height> parameter, use it as the final
+. \" image height in case it is smaller than the height
+. \" value we have just computed
+. if ((\\n[.$] >= 3) & (\\n[ps-desht] > (i;0\\$3))) \{\
+. nr ps-desht (i;\\$3)
+. \" recompute the final image width since we always
+. \" keep the correct image aspect
+. nr ps-deswid (\\n[ps-desht] * 1000 + (\\n[ps-ht] / 2) \
+ / \\n[ps-ht] * \\n[ps-wid] \
+ + 500 / 1000)
+. \}
+.
+. \" reserve vertical space for image
+. ne (\\n[ps-desht]u + 1v)
+.
+. \" compute image offset w.r.t. the current left margin
+. if (\\n[ps-offset-mode] == 0) \
+. nr ps-offset (\\n[.l] - \\n[.i] - \\n[ps-deswid] / 2)
+. if (\\n[ps-offset-mode] == 1) \
+. nr ps-offset 0
+. if (\\n[ps-offset-mode] == 2) \
+. nr ps-offset (\\n[.l] - \\n[.i] - \\n[ps-deswid])
+.
+. ie '\*[.T]'dvi' \{\
+. \" prepare values for \special{psfile=...} as needed by dvips
+. ie (\\n[ps-wid]p == \\n[ps-deswid]) \{\
+. ds ps-scale \" empty
+. ds ps-hoffset hoffset=-\\n[llx]
+. ds ps-voffset voffset=-\\n[lly]
+. \}
+. el \{\
+. nr ps-scale (\\n[ps-deswid] * 100 / \\n[ps-wid]p)
+. nr ps-hoffset (-\\n[llx] * \\n[ps-scale] / 100)
+. nr ps-voffset (-\\n[lly] * \\n[ps-scale] / 100)
+. ds ps-scale hscale=\\n[ps-scale] vscale=\\n[ps-scale]
+. ds ps-hoffset hoffset=\\n[ps-hoffset]
+. ds ps-voffset voffset=\\n[ps-voffset]
+. \}
+.
+\h'\\n[ps-offset]u'\
+\v'\\n[ps-desht]u'\
+\X'psfile=\\$1 \\*[ps-hoffset] \\*[ps-voffset] \\*[ps-scale]'
+. \}
+. el \{\
+. ie '\*[.T]'ps' \{\
+. \" prepare values for grops; the 'ps-invis' and 'ps-endinvis'
+. \" escapes are for groff's -X switch to provide a PS preview
+. \" with xditview: it uses -Tps for formatting but xditview
+. \" can't handle EPS files, thus alternative code is enclosed
+. \" between those two escapes
+. ds ps-invis \X'ps: invis'
+. ds ps-endinvis \X'ps: endinvis'
+. ds ps-import \X'ps: import \E$1 \En[llx] \En[lly] \En[urx] \En[ury] \
+ \En[ps-deswid] \E*[ps-desht]'
+. \}
+. el \{\
+. ds ps-invis
+. ds ps-endinvis
+. ds ps-import
+. \}
+.
+. ie (\\n[.$] >= 3) \
+. ds ps-desht \\n[ps-desht]
+. el \
+. ds ps-desht \" empty
+.
+\h'\\n[ps-offset]u'\
+\\*[ps-invis]\
+\# horizontally, the rectangle is slightly smaller than the image
+\# to compensate the line thickness (especially needed for TTY devices)
+\Z'\D'p 0 \\n[ps-desht]u \
+ (\\n[ps-deswid]u - \\n[.H]u) 0 \
+ 0 -\\n[ps-desht]u''\
+\# for convenience we also display the image file name (centered
+\# vertically);
+\Z'\v'((\\n[ps-desht]u / 2u) \
+ + (\w'\\$1'u * 0) \
+ + ((\\n[rst]u + \\n[rsb]u) / 2u))'\h'1m'\\$1'\
+\\*[ps-endinvis]\
+\v'\\n[ps-desht]u'\
+\\*[ps-import]
+. \}
+.
+. br
+. sp \\n[ps-desht]u
+. \}
+. el \
+. pspic*error-hook \\$@
+. HTML-IMAGE-END
+..
+.
+.cp \n[*groff_pspic_tmac_C]
+.do rr *groff_pspic_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set expandtab filetype=groff tabstop=2 textwidth=72:
diff --git a/tmac/ptx.tmac b/tmac/ptx.tmac
new file mode 100644
index 0000000..2235610
--- /dev/null
+++ b/tmac/ptx.tmac
@@ -0,0 +1,50 @@
+.\" ptx.tmac
+.\"
+.\" Provide '.xx' macro to format permuted index entries as created
+.\" by GNU ptx.
+.\"
+.\" Written 2008 by Werner Lemberg (wl@gnu.org)
+.\"
+.\" Public domain.
+.
+.do nr *groff_ptx_tmac_C \n[.cp]
+.cp 0
+.
+.nr ptx-ref-pos (\n[.l] - .65i)
+.nr ptx-head-pos (\n[ptx-ref-pos] / 2)
+.
+.ds ptx-sep-2 " \"
+.ds ptx-sep-4 " \"
+.ds ptx-sep-5 " \"
+.
+.
+.de xx
+. ds ptx-sep-1
+. if \w\\$2 \
+. ds ptx-sep-1 " \|\"
+.
+. ds ptx-sep-3
+. if \w\\$4 \
+. ds ptx-sep-3 " \|\"
+.
+. ds ptx-filler \\*[ptx-sep-4]\f3\a\fP\\*[ptx-sep-5]
+. ta (\\n[ptx-ref-pos]u - \w\\*[ptx-sep-5]u)
+.
+\h(\\n[ptx-head-pos]u - \w\\$1\\*[ptx-sep-1]\\$2\\*[ptx-sep-2]u)\
+\\$1\\*[ptx-sep-1]\
+\\$2\\*[ptx-sep-2]\
+\\$3\\*[ptx-sep-3]\
+\\$4\\*[ptx-filler]\
+\\$5
+..
+.
+.nf
+.
+.cp \n[*groff_ptx_tmac_C]
+.do rr *groff_ptx_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/refer-me.tmac b/tmac/refer-me.tmac
new file mode 100644
index 0000000..5de5061
--- /dev/null
+++ b/tmac/refer-me.tmac
@@ -0,0 +1,107 @@
+.\" refer-me.tmac
+.\"
+.\" Refer support for me macros.
+.\"
+.\" Copyright (C) 2011-2020 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 3 of the License, 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 this program. If not, see
+.\" <http://www.gnu.org/licenses/>.
+.\"
+.\" Please send comments to groff@gnu.org.
+.
+.do if d ref*error .nx
+.
+.do nr *groff_refer-me_tmac_C \n[.cp]
+.cp 0
+.
+.als ref*error tm
+.
+.de ref*text-label-start
+. (f
+. ip "\\$1"
+..
+.de ref*text-label-end
+. )f
+..
+.
+.de ref*biblio-item-start
+. ip "\\$1"
+..
+.de ref*biblio-item-start-nolabel
+. ip \&
+..
+.de ref*biblio-item-end
+..
+.
+.ds ref*refnum-start \" empty
+.ds ref*refnum-end .\0\"
+.
+.ie \n(.V<1v \{\
+. ds [. \s-2\v'-.4m'\f1
+. ds .] \v'.4m'\s+2\fP
+.\}
+.el \{\
+. ds [. " [
+. ds .] ]
+.\}
+.
+.ds ref*spec!0 Q A T S V N P I C O D
+.ds ref*spec!1 Q A T J S V N P I C D O
+.ds ref*spec!2 Q A T S V P I C D G O
+.ds ref*spec!3 Q A T P B E S V I C D O
+.ds ref*spec!4 Q A T R G P I C D O
+.\" style #5 (Bell Laboratories internal memorandum) is not supported
+.\" by GNU refer
+.
+.ds ref*spec!A ", " "
+.ds ref*spec!B ", " " "in \f2" "" "\f1"
+.ds ref*spec!B:3 ", " " "in \f2" "\f1"
+.ds ref*spec!D """ " " "(" ")"
+.ds ref*spec!D:0 """ " "
+.ds ref*spec!E ", " " "ed. "
+.ds ref*spec!G """ " " "(" ")"
+.ds ref*spec!G:2 ". " " "Gov't. ordering no.\~"
+.ds ref*spec!J ", " " "\f2" "\f1"
+.ds ref*spec!N """ "(" "" ")"
+.ds ref*spec!O ". " "
+.ds ref*spec!O:0 ", " "
+.ds ref*spec!O:2 """ " "
+.ds ref*spec!P ", " " "p.\~"
+.ds ref*spec!PP ", " " "pp.\~"
+.ds ref*spec!T ", " " "\\*(lq" "" "\\*(rq"
+.ds ref*spec!T:0 ", " " "\f2" "\f1"
+.ds ref*spec!T:2 ", " " "\f2" "" "\f1"
+.ds ref*spec!V """ " " "\f3" "\f1"
+.ds ref*spec!dflt ", " "
+.
+.de ref*biblio-start-hook
+. $p References
+. lp
+..
+.
+.de ref*biblio-end-hook
+. sp
+..
+.
+.mso refer.tmac
+.cp \n[*groff_refer-me_tmac_C]
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/refer-ms.tmac b/tmac/refer-ms.tmac
new file mode 100644
index 0000000..07203f5
--- /dev/null
+++ b/tmac/refer-ms.tmac
@@ -0,0 +1,94 @@
+.\" refer-ms.tmac
+.\"
+.\" Refer support for ms macros.
+.\"
+.\" Copyright (C) 2011-2020 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 3 of the License, 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 this program. If not, see
+.\" <http://www.gnu.org/licenses/>.
+.\"
+.\" Please send comments to groff@gnu.org.
+.
+.do nr *groff_refer-ms_tmac_C \n[.cp]
+.cp 0
+.
+.als ref*error @error
+.
+.de ref*text-label-start
+. FS "\\$1"
+..
+.de ref*text-label-end
+. FE
+..
+.
+.de ref*biblio-item-start
+. IP "\\$1"
+..
+.de ref*biblio-item-start-nolabel
+. XP
+..
+.de ref*biblio-item-end
+..
+.
+.als ref*refnum-start fn@mark-start
+.als ref*refnum-end fn@mark-end
+.
+.ds [. \E*[ref*refnum-start]\"
+.ds .] \E*[ref*refnum-end]\"
+.
+.ds ref*spec!0 Q A T S V N P I C D O
+.ds ref*spec!1 Q A T J S V N P I C D O
+.ds ref*spec!2 Q A T S V P I C D O
+.ds ref*spec!3 Q A T B E S V P I C D O
+.ds ref*spec!4 Q A T R G P I C D O
+.
+.ds ref*spec!A ", " "
+.ds ref*spec!B """ " " "in \fI" "" "\fP"
+.ds ref*spec!D """ " " "(" ")"
+.ds ref*spec!E ", " " "ed. "
+.ds ref*spec!G """ " " "(" ")"
+.ds ref*spec!J ", " " "\fI" "" "\fP"
+.ds ref*spec!N """ "(" "" ")"
+.ds ref*spec!O ". " "
+.ds ref*spec!P ", " " "p.\~"
+.ds ref*spec!PP ", " " "pp.\~"
+.ds ref*spec!T ", " " "\\*Q" "" "\\*U"
+.ds ref*spec!T:0 ", " " "\fI" "" "\fP"
+.ds ref*spec!T:2 ", " " "\fI" "" "\fP"
+.ds ref*spec!V """ " " "\fB" "\fR"
+.ds ref*spec!dflt ", " "
+.
+.de ref*biblio-start-hook
+. SH
+. nop \&\\*[REFERENCES]
+. par@reset
+..
+.
+.de ref*biblio-end-hook
+. par@finish
+..
+.
+.mso refer.tmac
+.
+.cp \n[*groff_refer-ms_tmac_C]
+.do rr *groff_refer-ms_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/refer.tmac b/tmac/refer.tmac
new file mode 100644
index 0000000..a5df6da
--- /dev/null
+++ b/tmac/refer.tmac
@@ -0,0 +1,362 @@
+.\" refer.tmac
+.\"
+.\" This is an interface to 'refer', originally part of 's.tmac'.
+.\"
+.\" Copyright (C) 2011-2020 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 3 of the License, 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 this program. If not, see
+.\" <http://www.gnu.org/licenses/>.
+.\"
+.\" Please send comments to groff@gnu.org.
+.
+.do nr *groff_refer_tmac_C \n[.cp]
+.cp 0
+.
+.
+.\" The following macros must be defined:
+.\"
+.\" ref*error -- print an error message (in $1)
+.\"
+.\" ref*text-label-start -- start a reference in text
+.\" (formatted reference # in $1)
+.\" ref*text-label-end -- end a reference in text
+.\"
+.\" ref*biblio-item-start -- a reference item with label
+.\" (in $1) in the bibliography block
+.\" ref*biblio-item-start-nolabel -- a reference item without label in
+.\" the bibliography block
+.\" ref*biblio-item-end -- end a reference item in the
+.\" bibliography block
+.\"
+.\" The following macros are optional:
+.\"
+.\" ref*item-start-hook -- stuff appended to the ]- macro
+.\" ref*item-end-hook -- stuff prepended to the ][ macro
+.\" ref*biblio-start-hook -- stuff appended to the ]< macro
+.\" ref*biblio-end-hook -- stuff appended to the ]> macro
+.\"
+.\" The following strings must be defined:
+.\"
+.\" ref*refnum-start -- start reference number formatting
+.\" in footnote
+.\" ref*refnum-end -- end reference number formatting
+.\" in footnote
+.\"
+.\" [. -- start reference number in text
+.\" (directly inserted by 'refer')
+.\" .] -- end reference number in text
+.\" (directly inserted by 'refer')
+.\"
+.\" Here is the specification of the five possible reference styles
+.\" provided by 'refer'. The example entries are taken from the ms
+.\" macro package.
+.\"
+.\" ref*spec!0 Q A T S V N P I C D O -- other
+.\" ref*spec!1 Q A T J S V N P I C D O -- journal article
+.\" ref*spec!2 Q A T S V P I C D O -- book
+.\" ref*spec!3 Q A T B E S V P I C D O -- article within book
+.\" ref*spec!4 Q A T R G P I C D O -- technical report
+.\"
+.\" Now the setup for the formatting of reference entries. The given
+.\" example entries for the various strings are taken from the ms macro
+.\" package.
+.\"
+.\" Each string defines five arguments which are passed to a macro, with
+.\" the meaning as below. Please refer to the man page of 'refer' for
+.\" more details on the fields. To allow fine-tuning, two levels are
+.\" implemented: For the refer field X and style Y the string
+.\" 'ref*spec!X:Y' is looked up. If it doesn't exist, the string
+.\" 'ref*spec!X' is used instead.
+.\"
+.\" arg 1 the punctuation character to use to separate this field
+.\" from the previous field
+.\" arg 2 a string to insert after the punctuation character of the
+.\" previous field (normally a space)
+.\" arg 3 a string with which to prefix this field
+.\" arg 4 a string with which to postfix this field
+.\" arg 5 a string to add after the punctuation character supplied
+.\" by the next field
+.\"
+.\" 1 2 3 4 5
+.\" ------------------------------------------------------------------
+.\" ref*spec!A , " " -- author name
+.\" ref*spec!B "" " " "in \fI" "" "\fP" -- bk title of article
+.\" ref*spec!D "" " " "(" ")" -- date of publication
+.\" ref*spec!E , " " "ed. " -- editor
+.\" ref*spec!G "" " " "(" ")" -- US Gov. ordering #
+.\" ref*spec!J , " " "\fI" "" "\fP" -- journal name
+.\" ref*spec!N "" "(" "" ")" -- issue number
+.\" ref*spec!O . " " -- other information
+.\" ref*spec!P , " " "p.\~" -- page
+.\" ref*spec!PP , " " "pp.\~" -- page range
+.\" ref*spec!T , " " "\\*Q" "" "\\*U" -- journal title
+.\" ref*spec!T:0 , " " "\fI" "" "\fP" -- book title (other)
+.\" ref*spec!T:2 , " " "\fI" "" "\fP" -- book title (book)
+.\" ref*spec!V "" " " "\fB" "\fR" -- volume number
+.\"
+.\" ref*spec!dflt , " " -- all other entries
+.
+.
+.if d ref*normal-print .nx
+.
+.\" start of reference
+.de ]-
+. ref*reset
+. if d ref*item-start-hook \
+. ref*item-start-hook
+..
+.
+.
+.\" end of reference
+.de ][
+. if d ref*item-end-hook \
+. ref*item-end-hook
+. ie d ref*spec!\\$1 \
+. ref*build \\$1 \\*[ref*spec!\\$1]
+. el \{\
+. ref*error "unknown reference type '\\$1'"
+. ref*build 0 \\*[ref*spec!0]
+. \}
+. ref*print
+. rm ref*string
+. rm [F
+..
+.
+.
+.\" period before reference
+.ds <. .\"
+.
+.\" period after reference
+.ds >. \" empty
+.
+.\" comma before reference
+.ds <, ,\"
+.
+.\" comma after reference
+.ds >, \" empty
+.
+.
+.\" start collected references
+.de ]<
+. als ref*print ref*end-print
+. if d ref*biblio-start-hook \
+. ref*biblio-start-hook
+..
+.
+.
+.\" end collected references
+.de ]>
+. als ref*print ref*normal-print
+. if d ref*biblio-end-hook \
+. ref*biblio-end-hook
+..
+.
+.
+.de ref*reset
+. rm [A [B [C [D [E [G [I [J [N [O [P [Q [R [S [T [V
+. rm ref*string
+..
+.
+.
+.de ref*normal-print
+. ie d [F \
+. ref*text-label-start \
+ "\\*[ref*refnum-start]\\*([F\\*[ref*refnum-end]"
+. el \
+. ref*text-label-start \&
+. nop \\*[ref*string]
+. ref*text-label-end
+..
+.
+.
+.de ref*end-print
+. ie d [F \
+. ref*biblio-item-start "\\*([F."
+. el \
+. ref*biblio-item-start-nolabel
+. nop \\*[ref*string]
+. ref*biblio-item-end
+..
+.
+.
+.als ref*print ref*normal-print
+.
+.de ref*build
+. rm ref*string ref*post-punct
+. nr ref*suppress-period 1
+. nr ref*style \\$1
+. shift
+. while \\n[.$] \{\
+. if d [\\$1 \{\
+. ie d ref*add-\\$1 \
+. ref*add-\\$1 \\n[ref*style]
+. el \
+. ref*add-dflt \\$1 \\n[ref*style]
+. \}
+. shift
+. \}
+. \" now add a final period
+. ie d ref*string \{\
+. if !\\n[ref*suppress-period] \
+. as ref*string .
+. if d ref*post-punct \{\
+. as ref*string "\\*[ref*post-punct]
+. rm ref*post-punct
+. \}
+. \}
+. el \
+. ds ref*string
+..
+.
+.
+.de ref*add-T
+. ie d ref*spec!T:\\$1 \
+. ref*field T \\*[ref*spec!T:\\$1]
+. el \
+. ref*field T \\*[ref*spec!T]
+. if r [T \
+. nr ref*suppress-period \\n([T
+..
+.
+.de ref*add-P
+. ie \\n([P>0 \{\
+. ie d ref*spec!PP:\\$1 \
+. ref*field P \\*[ref*spec!PP:\\$1]
+. el \
+. ref*field P \\*[ref*spec!PP]
+. \}
+. el \{\
+. ie d ref*spec!P:\\$1 \
+. ref*field P \\*[ref*spec!P:\\$1]
+. el \
+. ref*field P \\*[ref*spec!P]
+. \}
+..
+.
+.de ref*add-J
+. ie ref*spec!J:\\$1 \
+. ref*field J \\*[ref*spec!J:\\$1]
+. el \
+. ref*field J \\*[ref*spec!J]
+..
+.
+.de ref*add-D
+. ie ref*spec!D:\\$1 \
+. ref*field D \\*[ref*spec!D:\\$1]
+. el \
+. ref*field D \\*[ref*spec!D]
+..
+.
+.de ref*add-E
+. ie ref*spec!E:\\$1 \
+. ref*field E \\*[ref*spec!E:\\$1]
+. el \
+. ref*field E \\*[ref*spec!E]
+..
+.
+.de ref*add-G
+. ie ref*spec!G:\\$1 \
+. ref*field G \\*[ref*spec!G:\\$1]
+. el \
+. ref*field G \\*[ref*spec!G]
+..
+.
+.de ref*add-B
+. ie ref*spec!B:\\$1 \
+. ref*field B \\*[ref*spec!B:\\$1]
+. el \
+. ref*field B \\*[ref*spec!B]
+..
+.
+.de ref*add-O
+. ie ref*spec!O:\\$1 \
+. ref*field O \\*[ref*spec!O:\\$1]
+. el \
+. ref*field O \\*[ref*spec!O]
+. if r [O \
+. nr ref*suppress-period \\n([O
+.\" XXX
+.\" el \
+.\" nr ref*suppress-period 1
+..
+.
+.de ref*add-A
+. ie ref*spec!A:\\$1 \
+. ref*field A \\*[ref*spec!A:\\$1]
+. el \
+. ref*field A \\*[ref*spec!A]
+. if r [A \
+. nr ref*suppress-period \\n([A
+..
+.
+.de ref*add-V
+. ie ref*spec!V:\\$1 \
+. ref*field V \\*[ref*spec!V:\\$1]
+. el \
+. ref*field V \\*[ref*spec!V]
+..
+.
+.de ref*add-N
+. ie ref*spec!N:\\$1 \
+. ref*field N \\*[ref*spec!N:\\$1]
+. el \
+. ref*field N \\*[ref*spec!N]
+..
+.
+.de ref*add-dflt
+. ie ref*spec!dflt:\\$2 \
+. ref*field \\$1 \\*[ref*spec!dflt:\\$2]
+. el \
+. ref*field \\$1 \\*[ref*spec!dflt]
+..
+.
+.
+.\" First argument is the field letter.
+.\" Second argument is the punctuation character to use to separate this
+.\" field from the previous field.
+.\" Third argument is a string to insert after the punctuation character
+.\" of the previous field (normally a space).
+.\" Fourth argument is a string with which to prefix this field.
+.\" Fifth argument is a string with which to postfix this field.
+.\" Sixth argument is a string to add after the punctuation character
+.\" supplied by the next field.
+.de ref*field
+. if d ref*string \{\
+. ie d ref*post-punct \{\
+. if !\\n[ref*suppress-period] \
+. as ref*string "\\$2\"
+. as ref*string "\\*[ref*post-punct]\\$3\"
+. rm ref*post-punct
+. \}
+. el \
+. as ref*string "\\$2\\$3\"
+. \}
+. as ref*string "\\$4\\*([\\$1\\$5
+. if \\n[.$]>5 \
+. ds ref*post-punct "\\$6\"
+. nr ref*suppress-period 0
+..
+.
+.
+.cp \n[*groff_refer_tmac_C]
+.do rr *groff_refer_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/s.tmac b/tmac/s.tmac
new file mode 100644
index 0000000..bdf36b8
--- /dev/null
+++ b/tmac/s.tmac
@@ -0,0 +1,2177 @@
+.ig
+
+s.tmac
+
+Copyright (C) 1989-2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+..
+.if !\n(.g \
+. ab groff ms macros require groff extensions; aborting
+.
+.if \n(.C \
+. ab groff ms macros do not work in compatibility mode; aborting
+.
+.\" See if already loaded.
+.if r GS .nx
+.nr GS 1
+.
+.mso devtag.tmac
+.nr s@devtag-needs-end-of-heading 0
+.nr s@devtag-needs-end-of-title 0
+.
+.\" Define a string for use in diagnostic messages.
+.ds @s s.tmac\"
+.
+.de @diag
+. ds *file \" empty
+. ds *line \" empty
+. if !'\\n[.F]'' .ds *file \\n[.F]:\"
+. if !'\\n[.c]'0' .ds *line \\n[.c]:\"
+. tm \*[@s]:\\*[*file]\\*[*line] \\$*
+. rm *file
+. rm *line
+..
+.
+.de @error
+. @diag error: \\$*
+..
+.
+.de @warning
+. @diag warning: \\$*
+..
+.
+.de @nop
+..
+.
+.de @not-implemented
+.@error sorry, .\\$0 not implemented
+.als \\$0 @nop
+..
+.
+.\" documented Unix Version 7 ms macros that we don't implement
+.als EG @not-implemented \" engineer's notes
+.als IM @not-implemented \" internal memorandum
+.als MF @not-implemented \" memorandum for file
+.als MR @not-implemented \" memorandum for record
+.als TM @not-implemented \" technical memorandum
+.als TR @not-implemented \" technical report
+.als AT @not-implemented \" attachments
+.als CS @not-implemented \" cover sheet info for `TM` documents
+.als CT @not-implemented \" copies to
+.als OK @not-implemented \" "other keywords" for `TM` documents
+.als SG @not-implemented \" signatures for `TM` documents
+.als HO @not-implemented \" Holmdel
+.als IH @not-implemented \" Naperville (Indian Hill)
+.als MH @not-implemented \" Murray Hill
+.als PY @not-implemented \" Piscataway
+.als WH @not-implemented \" Whippany
+.als UX @not-implemented \" Unix w/ footnote trademark
+.
+.\" 4.2BSD ms macros documented by Tuthill 1983 that we don't implement
+.\"als TM @not-implemented \" thesis mode (already handled)
+.\"als CT @not-implemented \" chapter title for thesis (already handled)
+.
+.\" Wrap the .di request to save the name of the file being processed
+.\" when a diversion is started. This aids diagnostics when diversions
+.\" are still open after input has been processed and \n[.F] is empty.
+.als @divert di
+.de di
+. if \\n[.$] .ds @last-file-seen \\n[.F]\"
+. @divert \\$*
+..
+.
+.de @init
+.if !rPO .nr PO \\n(.o
+.\" a non-empty environment
+.ev ne
+\c
+.ev
+.ev nf
+'nf
+.ev
+..
+.ds REFERENCES References
+.ds ABSTRACT ABSTRACT
+.ds TOC Table of Contents
+.ds MONTH1 January
+.ds MONTH2 February
+.ds MONTH3 March
+.ds MONTH4 April
+.ds MONTH5 May
+.ds MONTH6 June
+.ds MONTH7 July
+.ds MONTH8 August
+.ds MONTH9 September
+.ds MONTH10 October
+.ds MONTH11 November
+.ds MONTH12 December
+.ds MO \E*[MONTH\n[mo]]
+.ds DY \n[dy] \*[MO] \n[year]
+.de ND
+.if \\n[.$] .ds DY "\\$*
+..
+.de DA
+.if \\n[.$] .ds DY "\\$*
+.ds CF \\*[DY]
+..
+.\" print an error message and then try to recover
+.de @error-recover
+.@error \\$@ (recovering)
+.nr *pop-count 0
+.while !'\\n(.z'' \{\
+. \"@warning automatically terminating diversion \\n(.z
+. ie d @div-end!\\n(.z .@div-end!\\n(.z
+. el .*div-end-default
+. nr *pop-count +1
+. \" ensure that we don't loop forever
+. if \\n[*pop-count]>20 .ab \*[@s]: fatal error: recovery failed
+.\}
+.while !'\\n[.ev]'0' .ev
+.par@reset-env
+.par@reset
+..
+.de *div-end-default
+.ds *last-div \\n(.z
+.br
+.di
+.ev nf
+.\\*[*last-div]
+.ev
+..
+.\" ****************************
+.\" ******** module cov ********
+.\" ****************************
+.\" Cover sheet and first page.
+.de cov*err-not-after-first-page
+.@error .\\$0 is not allowed after the first page has started
+..
+.de cov*err-not-before-tl
+.@error .\\$0 is not allowed before .TL
+..
+.de cov*err-not-again
+.@error .\\$0 is not allowed more than once
+..
+.de cov*err-not-after-ab
+.@error .\\$0 is not allowed after first .AB, .LP, .PP, .IP, .SH or .NH
+..
+.als AU cov*err-not-before-tl
+.als AI cov*err-not-before-tl
+.als AB cov*err-not-before-tl
+.de cov*first-page-init
+.\" Invoked by '.wh 0' trap on first page.
+.\" We should not come here again, but at short page length,
+.\" recursion may occur; remove trap and macro to avoid it.
+.ch cov*first-page-init
+.rm cov*first-page-init
+.if !'\\n[.ev]'0' \{\
+. ds cov*msg must be in top-level environment, not '\\n[.ev]',\"
+. as cov*msg " when first page is started\"
+. @error \\*[cov*msg]
+. rm cov*msg
+.\}
+.par@init
+.als RP cov*err-not-after-first-page
+.@init
+.ie \\n[cov*use-rp-format] \{\
+. pg@cs-top
+. als FS cov*FS
+. als FE cov*FE
+.\}
+.el \{\
+. pg@top
+. als FS @FS
+. als FE @FE
+.\}
+.wh 0 pg@top
+.CHECK-FOOTER-AND-KEEP
+..
+.wh 0 cov*first-page-init
+.\" This handles the case where FS occurs before TL or LP.
+.de FS
+.br
+\\*[FS]\\
+..
+.nr cov*use-rp-format 0
+.\" If we add more cover page formats, these behaviors and names could
+.\" be generalized.
+.nr cov*rp-no-repeat-info 0
+.nr cov*rp-no-renumber 0
+.\" report (AT&T: "released paper") document type
+.de RP
+.nr cov*use-rp-format 1
+.while \\n[.$] \{\
+. if '\\$1'no' .nr cov*rp-no-repeat-info 1
+. if '\\$1'no-repeat-info' .nr cov*rp-no-repeat-info 1
+. if '\\$1'no-renumber' .nr cov*rp-no-renumber 1
+. shift
+.\}
+.if rPO .po \\n(POu
+..
+.de TL
+.br
+.als TL cov*err-not-again
+.rn @AB AB
+.rn @AU AU
+.rn @AI AI
+.di cov*tl-div
+.par@reset
+.ft B
+.ps +2
+.vs +3p
+.ll (u;\\n[LL]*5/6)
+.nr cov*n-au 0
+.DEVTAG-TL
+..
+.de @AU
+.par@reset
+.if !'\\n(.z'' \{\
+. br
+. di
+.\}
+.nr cov*n-au +1
+.di cov*au-div!\\n[cov*n-au]
+.nf
+.ft I
+.ie (\\n[PS] >= 1000) \
+. ps (\\n[PS]z / 1000u)
+.el \
+. ps \\n[PS]
+..
+.de @AI
+.par@reset
+.if !'\\n(.z'' \{\
+. br
+. di
+.\}
+.ie !\\n[cov*n-au] .@error .AI before .AU
+.el \{\
+. di cov*ai-div!\\n[cov*n-au]
+. nf
+. ft R
+. ie (\\n[PS] >= 1000) \
+. ps (\\n[PS]z / 1000u)
+. el \
+. ps \\n[PS]
+.\}
+..
+.
+.de LP
+.if !'\\n[.z]'' \{\
+. br
+. di
+.\}
+.br
+.cov*ab-init
+.cov*print
+.nop \\*[\\$0]\\
+..
+.
+.als IP LP
+.als PP LP
+.als XP LP
+.als QP LP
+.als RS LP
+.als NH LP
+.als SH LP
+.als MC LP
+.als RT LP
+.als XS LP
+.
+.de cov*ab-init
+.als cov*ab-init @nop
+.als LP @LP
+.als IP @IP
+.als PP @PP
+.als XP @XP
+.als RT @RT
+.als XS @XS
+.als SH @SH
+.als NH @NH
+.als QP @QP
+.als RS @RS
+.als RE @RE
+.als QS @QS
+.als QE @QE
+.als MC @MC
+.als EQ @EQ
+.als EN @EN
+.als PS @PS
+.als TS @TS
+.als AB cov*err-not-after-ab
+.als AU par@AU
+.als AI par@AI
+.als TL par@TL
+..
+.
+.de @AB
+.if !'\\n(.z'' \{\
+. br
+. di
+.\}
+.cov*ab-init
+.ie '\*(.T'html' \{\
+. cov*tl-au-print
+. als cov*tl-au-print @nop
+.\}
+.el .di cov*ab-div
+.par@ab-indent
+.par@reset
+.if !'\\$1'no' \{\
+. if '\*(.T'html' \{\
+. nf
+. sp
+. \}
+. ft I
+. ce 1
+\\*[ABSTRACT]
+. sp
+. ft R
+.\}
+.ns
+.@PP
+.if '\*(.T'html' \{\
+. cov*tl-au-print
+. als cov*tl-au-print @nop
+. par@reset-env
+. par@reset
+. cov*print
+.\}
+..
+.de AE
+.ie '\*(.T'html' \{\
+. als AE cov*err-not-again
+.\}
+.el \{\
+. ie '\\n(.z'cov*ab-div' \{\
+. als AE cov*err-not-again
+. br
+. di
+.\" nr cov*ab-height \\n[dn]
+. par@reset-env
+. par@reset
+. cov*print
+. \}
+. el .@error .AE without .AB
+.\}
+..
+.de @div-end!cov*ab-div
+.AE
+..
+.de cov*break-page
+.ie \\n[cov*rp-no-renumber] .bp
+.el .bp 1
+..
+.de cov*print
+.als cov*print @nop
+.ie d cov*tl-div \{\
+. ie \\n[cov*use-rp-format] .cov*rp-print
+. el .cov*draft-print
+.\}
+.el \{\
+. if \\n[cov*use-rp-format] \{\
+. @warning .RP format but no .TL
+. .cov*break-page
+. als FS @FS
+. als FE @FE
+. CHECK-FOOTER-AND-KEEP
+. \}
+. br
+.\}
+..
+.de cov*rp-print
+.nr cov*page-length \\n[.p]
+.pl 1000i
+.cov*tl-au-print
+.sp 3
+.if d cov*ab-div \{\
+. if !'\*(.T'html' .nf
+. cov*ab-div
+.\}
+.sp 3
+.par@reset
+\\*[DY]
+.br
+.if \\n[cov*fn-height] \{\
+. sp |(u;\\n[cov*page-length]-\\n[FM]\
+-\\n[cov*fn-height]-\\n[fn@sep-dist]>?\\n[nl])
+. fn@print-sep
+. ev nf
+. cov*fn-div
+. ev
+. ie \\n[cov*rp-no-repeat-info] .rm cov*fn-div
+. el \{\
+. rn cov*fn-div fn@overflow-div
+. nr fn@have-overflow 1
+. \}
+.\}
+.als FS @FS
+.als FE @FE
+.CHECK-FOOTER-AND-KEEP
+.\" If anything was printed below where the footer line is normally
+.\" printed, then that's an overflow.
+.if -\\n[FM]/2+1v+\\n[cov*page-length]<\\n[nl] \
+. @error cover sheet overflow
+.pl \\n[cov*page-length]u
+.cov*break-page
+.if !\\n[cov*rp-no-repeat-info] .cov*tl-au-print
+.rs
+.sp 1
+..
+.de cov*draft-print
+.cov*tl-au-print
+.if d cov*ab-div \{\
+. nf
+. sp 2
+. cov*ab-div
+.\}
+.sp 1
+..
+.de cov*tl-au-print
+.par@reset
+.nf
+.rs
+.sp 3
+.ce 9999
+.if d cov*tl-div \{\
+. cov*tl-div
+. DEVTAG-EO-TL
+.\}
+.nr cov*i 1
+.nr cov*sp 1v
+.while \\n[cov*i]<=\\n[cov*n-au] \{\
+. ie '\*(.T'html' .br
+. el .sp \\n[cov*sp]u
+. cov*au-div!\\n[cov*i]
+. ie d cov*ai-div!\\n[cov*i] \{\
+. sp .5v
+. cov*ai-div!\\n[cov*i]
+. nr cov*sp 1v
+. \}
+. el .nr cov*sp .5v
+. nr cov*i +1
+.\}
+.ce 0
+..
+.nr cov*fn-height 0
+.nr cov*in-fn 0
+.\" start of footnote on cover
+.de cov*FS
+.if \\n[cov*in-fn] \{\
+. @error nested .FS
+. FE
+.\}
+.nr cov*in-fn 1
+.ev fn
+.par@reset-env
+.da cov*fn-div
+.if !\\n[cov*fn-height] .ns
+.ie \\n[.$] .FP "\\$1" no
+.el .@LP
+..
+.de @div-end!cov*fn-div
+.cov*FE
+..
+.\" end of footnote on cover
+.de cov*FE
+.ie '\\n(.z'cov*fn-div' \{\
+. br
+. ev
+. di
+. nr cov*in-fn 0
+. nr cov*fn-height +\\n[dn]
+.\}
+.el .@error .FE without matching .FS
+..
+.\" ***************************
+.\" ******** module pg ********
+.\" ***************************
+.\" Page-level formatting.
+.\" > 0 if we have a footnote on the current page
+.nr pg@fn-flag 0
+.nr pg@colw 0
+.nr pg@fn-colw 0
+.nr HM 1i
+.nr FM 1i
+.ds LF
+.ds CF
+.ds RF
+.ds LH
+.ds CH -\En[%]-\"
+.ds RH
+.ds pg*OH '\E*[LH]'\E*[CH]'\E*[RH]'
+.ds pg*EH '\E*[LH]'\E*[CH]'\E*[RH]'
+.ds pg*OF '\E*[LF]'\E*[CF]'\E*[RF]'
+.ds pg*EF '\E*[LF]'\E*[CF]'\E*[RF]'
+.de OH
+.ds pg*\\$0 "\\$*
+..
+.als EH OH
+.als OF OH
+.als EF OH
+.aln PN % \" Lesk 1978 documents PN.
+.de PT
+.\" To compare the page number to 1, we need it in Arabic format.
+.ds pg*saved-page-number-format \\g%\"
+.af % 0
+.nr pg*page-number-in-decimal \\n%
+.af % \\*[pg*saved-page-number-format]
+.fam \\*[pg@titles-font-family]
+.ie \\n[pg*page-number-in-decimal]=1 .if \\n[pg*P1] .tl \\*[pg*OH]
+.el \{\
+. ie o .tl \\*[pg*OH]
+. el .tl \\*[pg*EH]
+.\}
+.rm pg*saved-page-number-format
+..
+.de BT
+.fam \\*[pg@titles-font-family]
+.ie o .tl \\*[pg*OF]
+.el .tl \\*[pg*EF]
+..
+.nr pg*P1 0
+.de P1
+.nr pg*P1 1
+..
+.wh -\n[FM]u pg@bottom
+.wh -\n[FM]u/2u pg*footer
+.nr MINGW 2n
+.nr pg@ncols 1
+.de @MC
+.if !'\\n(.z'' .@error-recover .MC while diversion open
+.br
+.ie \\n[pg@ncols]>1 .pg@super-eject
+.el \{\
+. \" flush out any floating keeps
+. while \\n[kp@tail]>\\n[kp@head] \{\
+. rs
+. bp
+. \}
+.\}
+.ie !\\n(.$ \{\
+. nr pg*gutw \\n[MINGW]
+. nr pg@colw \\n[LL]-\\n[pg*gutw]/2u
+. nr pg@ncols 2
+.\}
+.el \{\
+. nr pg@colw (n;\\$1)<?\\n[LL]
+. ie \\n[.$]<2 .nr pg*gutw \\n[MINGW]
+. el .nr pg*gutw (n;\\$2)
+. nr pg@ncols \\n[LL]-\\n[pg@colw]/(\\n[pg@colw]+\\n[pg*gutw])+1
+. ie \\n[pg@ncols]>1 \
+. nr pg*gutw \\n[LL]-(\\n[pg@ncols]*\\n[pg@colw])/(\\n[pg@ncols]-1)
+. el .nr pg*gutw 0
+.\}
+.DEVTAG ".mc \\n[pg@ncols] \\n[pg@colw] \\n[pg*gutw]"
+.nr pg*col-num 0
+.nr pg@fn-colw \\n[pg@colw]*\\*[FR]
+.par@reset
+.ns
+.mk pg*col-top
+..
+.de 2C
+.MC
+..
+.de 1C
+.MC \\n[LL]u
+..
+.de pg@top
+.\" invoked by '.wh 0' trap at the top of every page
+.\"
+.\" At short page lengths, footers may get truncated or recursion may
+.\" occur; ensure that the page length suffices to avoid these problems.
+.if (u;\\n[HM]+\\n[FM]+\n[.V]>=\\n[.p]) \{\
+. @error insufficient page length; aborting\"
+. pl \\n[nl]u
+. ab
+.\}
+.ch pg*footer -\\n[FM]u/2u
+.nr pg*col-num 0
+.nr pg@fn-bottom-margin 0
+.po \\n[PO]u
+.ev h
+.par@reset
+.sp (u;\\n[HM]/2)
+.PT
+.sp |\\n[HM]u
+.if d HD .HD
+.mk pg@header-bottom
+.ev
+.mk pg*col-top
+.pg*start-col
+..
+.de pg*start-col
+.\" Handle footnote overflow before floating keeps, because the keep
+.\" might contain an embedded footnote.
+.fn@top-hook
+.kp@top-hook
+.tbl@top-hook
+.ns
+..
+.de pg@cs-top
+.sp \\n[HM]u
+.\" move pg@bottom and pg*footer out of the way
+.ch pg@bottom \\n[.p]u*2u
+.ch pg*footer \\n[.p]u*2u
+.ns
+..
+.de pg@bottom
+.tbl@bottom-hook
+.if \\n[pg@fn-flag] .fn@bottom-hook
+.nr pg*col-num +1
+.ie \\n[pg*col-num]<\\n[pg@ncols] .pg*end-col
+.el .pg*end-page
+..
+.de pg*end-col
+'sp |\\n[pg*col-top]u
+.po (u;\\n[PO]+(\\n[pg@colw]+\\n[pg*gutw]*\\n[pg*col-num]))
+.\"po +(u;\\n[pg@colw]+\\n[pg*gutw])
+.pg*start-col
+..
+.de pg*end-page
+.po \\n[PO]u
+.\" Make sure we don't exit if there are still floats or footnotes
+.\" left-over.
+.ie \\n[kp@head]<\\n[kp@tail]:\\n[fn@have-overflow] \{\
+. \" Switching environments ensures that we don't get an unnecessary
+. \" blank line at the top of the page.
+. ev ne
+' bp
+. ev
+.\}
+.el \{\
+. \" If the text has ended and there are no more footnotes or
+. \" keeps, exit.
+. if \\n[pg@text-ended] .ex
+. if r pg*next-number \{\
+. pn \\n[pg*next-number]
+. rr pg*next-number
+. if d pg*next-format \{\
+. af % \\*[pg*next-format]
+. rm pg*next-format
+. \}
+. \}
+' bp
+.\}
+..
+.\" pg@begin number format
+.de pg@begin
+.ie \\n[.$]>0 \{\
+. nr pg*next-number (;\\$1)
+. ie \\n[.$]>1 .ds pg*next-format \\$2
+. el .rm pg*next-format
+.\}
+.el .rr pg*next-number
+.pg@super-eject
+..
+.\" print the footer line
+.de pg*footer
+.ev h
+.par@reset
+.BT
+.ev
+..
+.\" flush out any keeps or footnotes
+.de pg@super-eject
+.br
+.if !'\\n(.z'' \{\
+. ds @msg diversion open while ejecting page\"
+. as @msg " (last file seen: \\*[@last-file-seen])\"
+. @error-recover \\*[@msg]
+. rm @msg
+.\}
+.\" Make sure we stay in the end macro while there is still footnote
+.\" overflow left, or floating keeps.
+.while \\n[kp@tail]>\\n[kp@head]:\\n[pg@fn-flag] \{\
+. rs
+. bp
+.\}
+.bp
+..
+.nr pg@text-ended 0
+.de pg@end-text
+.br
+.nr pg@text-ended 1
+.pg@super-eject
+..
+.em pg@end-text
+.\" ***************************
+.\" ******** module fn ********
+.\" ***************************
+.\" Footnotes.
+.nr fn@sep-dist 8p
+.ev fn
+.\" Round it vertically
+.vs \n[fn@sep-dist]u
+.nr fn@sep-dist \n[.v]
+.ev
+.nr fn*text-num 0 1
+.nr fn*note-num 0 1
+.nr fn*open 0
+.\" Handle initialition tasks deferred until par module is set up.
+.de fn@init
+.ie t .als fn@mark-start par@sup-start
+.el .ds fn@mark-start [
+.ie t .als fn@mark-end par@sup-end
+.el .ds fn@mark-end ]
+.ds * \E*[fn@mark-start]\En+[fn*text-num]\E*[fn@mark-end]
+..
+.\" normal FS
+.\" FS-MARK is a user definable hook, which may be used to perform
+.\" any set-up actions, (e.g. planting an HREF link as the footnote
+.\" mark, in the document text); passed the same arguments as have
+.\" been passed to FS itself, unless redefined, it is a no-op.
+.de @FS
+.FS-MARK \\$@
+.ie \\n[.$] .fn*do-FS "\\$1" no
+.el \{\
+. ie \\n[fn*text-num]>\\n[fn*note-num] .fn*do-FS \\n+[fn*note-num]
+. el .fn*do-FS
+.\}
+..
+.\" Default no-op fallback for FS-MARK
+.de FS-MARK
+..
+.\" Second argument of 'no' means don't embellish the first argument.
+.de fn*do-FS
+.if \\n[fn*open] .@error-recover nested .FS
+.nr fn*open 1
+.if \\n[.u] \{\
+. \" Ensure that the first line of the footnote is on the same page
+. \" as the reference. I think this is minimal.
+. ev fn
+. nr fn*need 1v
+. ev
+. ie \\n[pg@fn-flag] .nr fn*need +\\n[fn:PD]
+. el .nr fn*need +\\n[fn@sep-dist]
+. ne \\n[fn*need]u+\\n[.V]u>?0
+.\}
+.ev fn
+.par@reset-env
+.fn*start-div
+.par@reset
+.fam \\*[fn@font-family]
+.ie \\n[.$] .FP \\$@
+.el .@LP
+..
+.de @FE
+.ie !\\n[fn*open] .@error .FE without .FS
+.el \{\
+. nr fn*open 0
+. br
+. ev
+. fn*end-div
+.\}
+..
+.nr fn@have-overflow 0
+.\" called at the top of each column
+.de fn@top-hook
+.nr fn*max-width 0
+.nr fn*page-bottom-pos 0-\\n[FM]-\\n[pg@fn-bottom-margin]
+.ch pg@bottom \\n[fn*page-bottom-pos]u
+.if \\n[fn@have-overflow] \{\
+. nr fn@have-overflow 0
+. fn*start-div
+. ev nf
+. fn@overflow-div
+. ev
+. fn*end-div
+.\}
+..
+.\" This is called at the bottom of the column if pg@fn-flag is set.
+.de fn@bottom-hook
+.nr pg@fn-flag 0
+.nr fn@have-overflow 0
+.nr fn@bottom-pos \\n[.p]-\\n[FM]-\\n[pg@fn-bottom-margin]+\\n[.v]
+.ev fn
+.nr fn@bottom-pos -\\n[.v]
+.ev
+.ie \\n[nl]+\\n[fn@sep-dist]+\n[.V]>\\n[fn@bottom-pos] \{\
+. rn fn@div fn@overflow-div
+. nr fn@have-overflow 1
+.\}
+.el \{\
+. if \\n[pg@ncols]>1 \
+. if \\n[fn*max-width]>\\n[pg@fn-colw] \
+. nr pg@fn-bottom-margin \\n[.p]-\\n[FM]-\\n[nl]+1v
+. wh \\n[fn@bottom-pos]u fn*catch-overflow
+. fn@print-sep
+. ev nf
+. fn@div
+. rm fn@div
+. ev
+. if '\\n(.z'fn@overflow-div' \{\
+. di
+. nr fn@have-overflow \\n[dn]>0
+. \}
+. ch fn*catch-overflow
+.\}
+..
+.de fn*catch-overflow
+.di fn@overflow-div
+..
+.nr fn*embed-count 0
+.de @div-end!fn@div
+.br
+.if '\\n[.ev]'fn' .ev
+.fn*end-div
+.nr fn*open 0
+..
+.als @div-end!fn*embed-div @div-end!fn@div
+.de fn*start-div
+.ie '\\n(.z'' \{\
+. da fn@div
+. if !\\n[pg@fn-flag] .ns
+.\}
+.el .di fn*embed-div
+..
+.de fn*end-div
+.ie '\\n(.z'fn@div' \{\
+. di
+. nr fn*page-bottom-pos -\\n[dn]
+. nr fn*max-width \\n[fn*max-width]>?\\n[dl]
+. if !\\n[pg@fn-flag] .nr fn*page-bottom-pos -\\n[fn@sep-dist]
+. nr pg@fn-flag 1
+. nr fn*page-bottom-pos \\n[nl]-\\n[.p]+\n[.V]>?\\n[fn*page-bottom-pos]
+. ch pg@bottom \\n[fn*page-bottom-pos]u
+.\}
+.el \{\
+. ie '\\n(.z'fn*embed-div' \{\
+. di
+. rn fn*embed-div fn*embed-div!\\n[fn*embed-count]
+\!. fn*embed-start \\n[fn*embed-count]
+. rs
+' sp (u;\\n[dn]+\\n[fn@sep-dist]+\\n[.V])
+\!. fn*embed-end
+. nr fn*embed-count +1
+. \}
+. el \{\
+. ev fn
+. @error-recover unclosed diversion within footnote
+. \}
+.\}
+..
+.de fn*embed-start
+.ie '\\n(.z'' \{\
+. fn*start-div
+. ev nf
+. fn*embed-div!\\$1
+. rm fn*embed-div!\\$1
+. ev
+. fn*end-div
+. di fn*null
+.\}
+.el \{\
+\!. fn*embed-start \\$1
+. rs
+.\}
+..
+.de fn*embed-end
+.ie '\\n(.z'fn*null' \{\
+. di
+. rm fn*null
+.\}
+.el \!.fn*embed-end
+..
+.\" It's important that fn@print-sep use up exactly fn@sep-dist vertical
+.\" space.
+.de fn@print-sep
+.ev fn
+.in 0
+.vs \\n[fn@sep-dist]u
+\D'l 1i 0'
+.br
+.ev
+..
+.\" ***************************
+.\" ******** module kp ********
+.\" ***************************
+.\" Keeps.
+.de KS
+.br
+.di kp@div
+..
+.de KF
+.if !'\\n(.z'' .@error-recover .KF while diversion open
+.di kp@fdiv
+.ev k
+.par@reset-env
+.par@reset
+..
+.de KE
+.ie '\\n(.z'kp@div' .kp*end
+.el \{\
+. ie '\\n(.z'kp@fdiv' .kp*fend
+. el .@error .KE without .KS or .KF
+.\}
+..
+.de @div-end!kp@div
+.kp*end
+..
+.de @div-end!kp@fdiv
+.kp*fend
+..
+.de kp*need
+.ie '\\n(.z'' .ds@need \\$1
+.el \!.kp*need \\$1
+..
+.\" end non-floating keep
+.de kp*end
+.br
+.di
+.kp*need \\n[dn]
+.ev nf
+.kp@div
+.ev
+.rm kp@div
+..
+.\" Floating keeps.
+.nr kp@head 0
+.nr kp@tail 0
+.\" end floating keep
+.de kp*fend
+.br
+.ev
+.di
+.ie \\n[.t]-(\\n[.k]>0*1v)>\\n[dn] \{\
+. br
+. ev nf
+. kp@fdiv
+. rm kp@fdiv
+. ev
+.\}
+.el \{\
+. rn kp@fdiv kp@div!\\n[kp@tail]
+. nr kp*ht!\\n[kp@tail] 0\\n[dn]
+. nr kp@tail +1
+.\}
+..
+.\" top of page processing for KF
+.nr kp*doing-top 0
+.de kp@top-hook
+.if !\\n[kp*doing-top] \{\
+. nr kp*doing-top 1
+. kp*do-top
+. nr kp*doing-top 0
+.\}
+..
+.de kp*do-top
+.\" If the first keep won't fit, only force it out if we haven't had a
+.\" footnote and we're at the top of the page.
+.nr kp*force \\n[pg@fn-flag]=0&(\\n[nl]<=\\n[pg@header-bottom])
+.nr kp*fits 1
+.while \\n[kp@tail]>\\n[kp@head]&\\n[kp*fits] \{\
+. ie \\n[.t]>\\n[kp*ht!\\n[kp@head]]:\\n[kp*force] \{\
+. nr kp*force 0
+. \" It's important to advance kp@head before bringing
+. \" back the keep, so that if the last line of the
+. \" last keep springs the bottom of page trap, a new
+. \" page will not be started unnecessarily.
+. rn kp@div!\\n[kp@head] kp*temp
+. nr kp@head +1
+. ev nf
+. kp*temp
+. ev
+. rm kp*temp
+. \}
+. el .nr kp*fits 0
+.\}
+..
+.\" ***************************
+.\" ******** module ds ********
+.\" ***************************
+.\" Displays and non-floating keeps.
+.de DE
+.ds*end!\\n[\\n[.ev]:ds-type]
+.nr \\n[.ev]:ds-type 0
+.ns
+..
+.de ds@auto-end
+.if \\n[\\n[.ev]:ds-type] \{\
+. @error automatically terminating display
+. DE
+.\}
+..
+.de @div-end!ds*div
+.ie \\n[\\n[.ev]:ds-type] .DE
+.el .ds*end!2
+..
+.de ds*end!0
+.@error .DE without .DS, .ID, .CD, .LD, .RD, or .BD
+..
+.de LD
+.br
+.nr \\n[.ev]:ds-type 1
+.par@reset
+.nf
+.sp \\n[DD]u
+..
+.de ID
+.LD
+.ie \\n[.$] .in +(n;\\$1)
+.el .in +\\n[DI]u
+..
+.de CD
+.LD
+.ce 9999
+..
+.de RD
+.LD
+.rj 9999
+..
+.de ds*common-end
+.par@reset
+.sp \\n[DD]u
+..
+.als ds*end!1 ds*common-end
+.de BD
+.LD
+.nr \\n[.ev]:ds-type 2
+.di ds*div
+..
+.de ds*end!2
+.br
+.ie '\\n(.z'ds*div' \{\
+. di
+. nf
+. in (u;\\n[.l]-\\n[dl]/2>?0)
+. ds*div
+. rm ds*div
+. ds*common-end
+.\}
+.el .@error-recover mismatched .DE
+..
+.de DS
+.if '\\n(.z'ds*div' .@error-recover cannot begin display within display
+.nr ds*badarg 0
+.di ds*div
+.ie '\\$1'B' \{\
+. LD
+. nr \\n[.ev]:ds-type 4
+.\}
+.el \{\
+. ie '\\$1'L' .LD
+. el \{\
+. ie '\\$1'C' .CD
+. el \{\
+. ie '\\$1'R' .RD
+. el \{\
+. ie '\\$1'I' .ID \\$2
+. el \{\
+. ie '\\$1'' .ID
+. el .nr ds*badarg 1
+. \}
+. \}
+. \}
+. \}
+. ie \\n[ds*badarg] \{\
+. ds ds*msg unrecognized argument '\\$1' to .\\$0;\"
+. as ds*msg " did you mean '.\\$0 I \\$1'?\"
+. @error \\*[ds*msg]
+. rm ds*msg
+. di
+. \}
+. el .nr \\n[.ev]:ds-type 3
+.\}
+.rr ds*badarg
+..
+.de ds@need
+.if '\\n(.z'' \{\
+. while \\n[.t]<=(\\$1)&(\\n[nl]>\\n[pg@header-bottom]) \{\
+. rs
+' sp \\n[.t]u
+. \}
+.\}
+..
+.de ds*end!3
+.br
+.ie '\\n(.z'ds*div' \{\
+. di
+. ds@need \\n[dn]
+. ev nf
+. ds*div
+. ev
+. rm ds*div
+. ds*common-end
+.\}
+.el .@error-recover mismatched .DE
+..
+.de ds*end!4
+.ie '\\n(.z'ds*div' \{\
+. br
+. di
+. nf
+. in (u;\\n[.l]-\\n[dl]/2>?0)
+. ds@need \\n[dn]
+. ds*div
+. rm ds*div
+. ds*common-end
+.\}
+.el .@error-recover mismatched .DE
+..
+.\" ****************************
+.\" ******** module par ********
+.\" ****************************
+.\" Paragraph-level formatting.
+.\" Load time initialization.
+.de par@load-init
+.\" PS and VS might have been set on the command line
+.if !rPS .nr PS 10
+.if !rLL .nr LL 6.5i
+.ll \\n[LL]u
+.\" don't set LT so that it can be defaulted from LL
+.ie rLT .lt \\n[LT]u
+.el .lt \\n[LL]u
+.ie (\\n[PS] >= 1000) \
+. ps (\\n[PS]z / 1000u)
+.el \
+. ps \\n[PS]
+.\" don't set VS so that it can be defaulted from PS
+.ie rVS \{\
+. ie (\\n[VS] >= 1000) \
+. par*vs "(\\n[VS]p / 1000u)"
+. el \
+. par*vs \\n[VS]
+.\}
+.el \{\
+. ie (\\n[PS] >= 1000) \
+. par*vs "((\\n[PS]p / 1000u) + 2p)"
+. el \
+. par*vs "(\\n[PS] + 2)"
+.\}
+.if dFAM .fam \\*[FAM]
+.if !rHY .nr HY 6
+.hy \\n[HY]
+.TA
+.CHECK-FOOTER-AND-KEEP
+..
+.de par*vs
+.\" If it's too big to be in points, treat it as units.
+.ie (p;\\$1)>=40p .vs (u;\\$1)
+.el .vs (p;\\$1)
+..
+.de par@ab-indent
+.nr 0:li (u;\\n[LL]/12)
+.nr 0:ri \\n[0:li]
+..
+.de par*env-init
+.aln \\n[.ev]:PS PS
+.aln \\n[.ev]:VS VS
+.aln \\n[.ev]:LL LL
+.aln \\n[.ev]:MCLL LL
+.aln \\n[.ev]:LT LT
+.aln \\n[.ev]:MCLT LT
+.aln \\n[.ev]:PI PI
+.aln \\n[.ev]:PD PD
+.ad \\n[par*adj]
+.par@reset-env
+..
+.\" happens when the first page begins
+.de par@init
+.if !rLT .nr LT \\n[LL]
+.if !rFL .nr FL \\n[LL]*\\*[FR]
+.if !rVS \{\
+. ie (\\n[PS] >= 1000) \
+. nr VS (\\n[PS] + 2000)
+. el \
+. nr VS (\\n[PS] + 2)
+.\}
+.if !rDI .nr DI .5i
+.if !rFPS \{\
+. ie (\\n[PS] >= 1000) \
+. nr FPS (\\n[PS] - 2000)
+. el \
+. nr FPS (\\n[PS] - 2)
+.\}
+.if !rFVS \{\
+. ie (\\n[FPS] >= 1000) \
+. nr FVS (\\n[FPS] + 2000)
+. el \
+. nr FVS (\\n[FPS] + 2)
+.\}
+.\" don't change environment 0
+.ev h
+.ie (\\n[PS] >= 1000) \
+. ps (\\n[PS]z / 1000u)
+.el \
+. ps \\n[PS]
+.if !rQI .nr QI 5n
+.if !rPI .nr PI 5n
+.ie (\\n[VS] >= 1000) \
+. par*vs "(\\n[VS]p / 1000u)"
+.el \
+. par*vs \\n[VS]
+.if !rPD .nr PD .3v>?\n(.V
+.if !rDD .nr DD .5v>?\n(.V
+.if !rFI .nr FI 2n
+.if !rFPD .nr FPD \\n[PD]/2
+.ev
+.if !dFAM .ds FAM \\n[.fam]
+.ds pg@titles-font-family \\*[FAM]
+.ds fn@font-family \\*[FAM]
+.nr par*adj \\n[.j]
+.par*env-init
+.ev h
+.par*env-init
+.ev
+.ev fn
+.par*env-init
+.ev
+.ev k
+.par*env-init
+.ev
+.aln 0:MCLL pg@colw
+.aln 0:MCLT pg@colw
+.aln k:MCLL pg@colw
+.aln k:MCLT pg@colw
+.aln fn:PS FPS
+.aln fn:VS FVS
+.aln fn:LL FL
+.aln fn:LT FL
+.aln fn:PI FI
+.aln fn:PD FPD
+.aln fn:MCLL pg@fn-colw
+.aln fn:MCLT pg@fn-colw
+..
+.de par@reset-env
+.nr \\n[.ev]:il 0
+.nr \\n[.ev]:li 0
+.nr \\n[.ev]:ri 0
+.nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
+.nr \\n[.ev]:pli 0
+.nr \\n[.ev]:pri 0
+.nr \\n[.ev]:ds-type 0
+..
+.\" par@reset
+.de par@reset
+.br
+.if \\n[s@devtag-needs-end-of-title] .DEVTAG-EO-TL
+.nr s@devtag-needs-end-of-title 0
+.if \\n[s@devtag-needs-end-of-heading] .DEVTAG-EO-H
+.nr s@devtag-needs-end-of-heading 0
+.ce 0
+.rj 0
+.ul 0
+.fi
+.ft 1
+.ie '\\n[.ev]'fn' .fam \\*[fn@font-family]
+.el .fam \\*[FAM]
+.ie (\\n[\\n[.ev]:PS] >= 1000) \
+. ps (\\n[\\n[.ev]:PS]z / 1000u)
+.el \
+. ps \\n[\\n[.ev]:PS]
+.ie (\\n[\\n[.ev]:VS] >= 1000) \
+. par*vs "(\\n[\\n[.ev]:VS]p / 1000u)"
+.el \
+. par*vs \\n[\\n[.ev]:VS]
+.ls 1
+.if !'\\$1'' .nr \\n[.ev]:pli (n;\\$1)
+.if !'\\$2'' .nr \\n[.ev]:pri (n;\\$2)
+.ie \\n[pg@ncols]>1 \{\
+. ll (u;\\n[\\n[.ev]:MCLL]-\\n[\\n[.ev]:ri]-\\n[\\n[.ev]:pri])
+. lt \\n[\\n[.ev]:MCLT]u
+.\}
+.el \{\
+. ll (u;\\n[\\n[.ev]:LL]-\\n[\\n[.ev]:ri]-\\n[\\n[.ev]:pri])
+. lt \\n[\\n[.ev]:LT]u
+.\}
+.in (u;\\n[\\n[.ev]:li]+\\n[\\n[.ev]:pli])
+.TA
+.hy \\n[HY]
+..
+.\" This can be redefined by the user.
+.de TA
+.ta T 5n
+..
+.\" \n[PORPHANS] sets number of initial lines of any paragraph,
+.\" which must be kept together, without any included page break.
+.\" Initialise to reproduce original behaviour; user may adjust it.
+.if !rPORPHANS .nr PORPHANS 1
+.
+.de par*start
+.ds@auto-end
+.par@reset \\$1 \\$2
+.sp \\n[\\n[.ev]:PD]u
+.ne \\n[PORPHANS]v+\\n(.Vu
+..
+.de par@finish
+.nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
+.nr \\n[.ev]:pli 0
+.nr \\n[.ev]:pri 0
+.par@reset 0 0
+..
+.als @RT par@finish
+.\" normal LP
+.de @LP
+.par*start 0 0
+.nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
+..
+.de @PP
+.par*start 0 0
+.nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
+.if !'\*(.T'html' .ti +\\n[\\n[.ev]:ai]u
+..
+.de @QP
+.nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
+.par*start \\n[QI]u \\n[QI]u
+..
+.de @XP
+.par*start \\n[\\n[.ev]:PI]u 0
+.ti -\\n[\\n[.ev]:PI]u
+..
+.de @IP
+.ie \\n[.$]>1 \{\
+.par*start \\$2 0
+.nr \\n[.ev]:ai \\n[\\n[.ev]:pli]
+.\}
+.el .par*start \\n[\\n[.ev]:ai]u 0
+.if !'\\$1'' \{\
+. \" Divert the label so as to freeze any spaces.
+. di par*label
+. par*push-tag-env
+\&\\$1
+. par*pop-tag-env
+. di
+. chop par*label
+. ti -\\n[\\n[.ev]:ai]u
+. ie \\n[dl]+1n<=\\n[\\n[.ev]:ai] \{\
+. DEVTAG-COL 1
+\\*[par*label]\h'|\\n[\\n[.ev]:ai]u'\c
+. DEVTAG-COL 2
+. \}
+. el \{\
+. DEVTAG-COL 1
+\\*[par*label]
+. DEVTAG-COL-NEXT 2
+. br
+. \}
+. rm par*label
+.\}
+..
+.\" We don't want margin characters to be attached when we divert
+.\" the tag. Since there's no way to save and restore the current
+.\" margin character, we have to switch to a new environment, taking
+.\" what we need of the old environment with us.
+.de par*push-tag-env
+.nr par*saved-font \\n[.f]
+.nr par*saved-size \\n[.s]z
+.nr par*saved-ss \\n[.ss]
+.nr par*saved-sss \\n[.sss]
+.ds par*saved-fam \\n[.fam]
+.ev par
+.nf
+.TA
+.ft \\n[par*saved-font]
+.ps \\n[par*saved-size]u
+.ss \\n[par*saved-ss] \\n[par*saved-sss]
+.fam \\*[par*saved-fam]
+..
+.de par*pop-tag-env
+.ev
+..
+.de @RS
+.br
+.nr \\n[.ev]:li!\\n[\\n[.ev]:il] \\n[\\n[.ev]:li]
+.nr \\n[.ev]:ri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ri]
+.nr \\n[.ev]:ai!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ai]
+.nr \\n[.ev]:pli!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pli]
+.nr \\n[.ev]:pri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pri]
+.nr \\n[.ev]:il +1
+.nr \\n[.ev]:li +\\n[\\n[.ev]:ai]
+.nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
+.par@reset
+..
+.de @RE
+.br
+.ie \\n[\\n[.ev]:il] \{\
+. nr \\n[.ev]:il -1
+. nr \\n[.ev]:ai \\n[\\n[.ev]:ai!\\n[\\n[.ev]:il]]
+. nr \\n[.ev]:li \\n[\\n[.ev]:li!\\n[\\n[.ev]:il]]
+. nr \\n[.ev]:ri \\n[\\n[.ev]:ri!\\n[\\n[.ev]:il]]
+. nr \\n[.ev]:pli \\n[\\n[.ev]:pli!\\n[\\n[.ev]:il]]
+. nr \\n[.ev]:pri \\n[\\n[.ev]:pri!\\n[\\n[.ev]:il]]
+.\}
+.el .@error unbalanced .\\$0
+.ie '\\$0'QE' .par*start 0 0
+.el .par@reset
+..
+.de @QS
+.br
+.nr \\n[.ev]:li!\\n[\\n[.ev]:il] \\n[\\n[.ev]:li]
+.nr \\n[.ev]:ri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ri]
+.nr \\n[.ev]:ai!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ai]
+.nr \\n[.ev]:pli!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pli]
+.nr \\n[.ev]:pri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pri]
+.nr \\n[.ev]:il +1
+.nr \\n[.ev]:li +\\n[QI]
+.nr \\n[.ev]:ri +\\n[QI]
+.nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
+.par*start 0 0
+..
+.als @QE @RE
+.\" start boxed text
+.de B1
+.br
+.HTML-IMAGE
+.di par*box-div
+.nr \\n[.ev]:li +1n
+.nr \\n[.ev]:ri +1n
+.nr par*box-in \\n[.in]
+.\" remember what 1n is, just in case the point size changes
+.nr par*box-n 1n
+.in +1n
+.ll -1n
+.lt -1n
+.ti \\n[par*box-in]u+1n
+..
+.de @div-end!par*box-div
+.B2
+..
+.\" end boxed text
+.\" Postpone the drawing of the box until we're in the top-level
+.\" diversion, in case there's a footnote inside the box.
+.de B2
+.ie '\\n(.z'par*box-div' \{\
+. br
+. if \n[.V]>.25m .sp
+. di
+. if \n[.V]>.25m .sp
+. ds@need \\n[dn]
+. par*box-mark-top
+. ev nf
+. par*box-div
+. ev
+. nr \\n[.ev]:ri -\\n[par*box-n]
+. nr \\n[.ev]:li -\\n[par*box-n]
+. in -\\n[par*box-n]u
+. ll +\\n[par*box-n]u
+. lt +\\n[par*box-n]u
+. par*box-draw \\n[.i]u \\n[.l]u-(\\n[.H]u==1n*1n)
+.\}
+.el .@error .B2 without .B1
+.HTML-IMAGE-END
+..
+.de par*box-mark-top
+.ie '\\n[.z]'' \{\
+. rs
+. mk par*box-top
+.\}
+.el \!.par*box-mark-top
+..
+.de par*box-draw
+.ie '\\n[.z]'' \{\
+. nr par*box-in \\n[.i]
+. nr par*box-ll \\n[.l]
+. nr par*box-vpt \\n[.vpt]
+. nr par*box-ad \\n[.j]
+. ad l
+. vpt 0
+. in \\$1
+. ll \\$2
+\v'-1v+.25m'\
+\D'l (u;\\n[.l]-\\n[.i]) 0'\
+\D'l 0 |\\n[par*box-top]u'\
+\D'l -(u;\\n[.l]-\\n[.i]) 0'\
+\D'l 0 -|\\n[par*box-top]u'
+. br
+. sp -1
+. in \\n[par*box-in]u
+. ll \\n[par*box-ll]u
+. vpt \\n[par*box-vpt]
+. ad \\n[par*box-ad]
+.\}
+.el \!.par*box-draw \\$1 \\$2
+..
+.\" \n[HORPHANS] sets how many lines of the following paragraph must be
+.\" kept together, with a preceding section header. Initialise it,
+.\" to reproduce original behaviour; user may change it.
+.if !rHORPHANS .nr HORPHANS 1
+.
+.\" \n[GROWPS] and \n[PSINCR] cause auto-increment of header point size.
+.\" Initialise them, so they have no effect, unless explicitly set by
+.\" the user.
+.if !rGROWPS .nr GROWPS 0
+.if !rPSINCR .nr PSINCR 1p
+.
+.de SH-NO-TAG
+.par@finish
+.\" Keep the heading and the first few lines of the next paragraph
+.\" together. (\n[HORPHANS] defines "first few" -- default = 1; user
+.\" may redefine it).
+.nr sh*minvs \\n[HORPHANS]v
+.if \\n[sh*psincr]<0 .nr sh*psincr 0
+.ie \\n(VS<1000 .par*vs \\n(VSp+\\n[sh*psincr]u
+.el .par*vs \\n(VSp/1000u+\\n[sh*psincr]u
+.ne 2v+\\n[sh*minvs]u+\\n[\\n[.ev]:PD]u+\\n(.Vu
+.\" Adjust point size for heading text, as specified by \n[GROWPS] and
+.\" \n[PSINCR].
+.ie \\n(PS<1000 .ps \\n(PS+\\n[sh*psincr]u
+.el .ps \\n(PSz/1000u+\\n[sh*psincr]u
+.sp 1
+.ft B
+..
+.de @SH
+.\" Standard ms implementation does not expect an argument,
+.\" but allow ".SH n" to make heading point size match ".NH n",
+.\" for same "n", when \n[GROWPS] and \n[PSINCR] are set.
+. nr sh*psincr 0
+. if 0\\$1>0 .nr sh*psincr (\\n[GROWPS]-0\\$1)*\\n[PSINCR]
+. SH-NO-TAG
+. DEVTAG-SH 1
+. if '\*(.T'html' .nr s@devtag-needs-end-of-heading 1
+..
+.\" TL, AU, and AI are aliased to these in cov*ab-init.
+.de par@TL
+.par@finish
+.sp 1
+.ft B
+.ps +2
+.vs +3p
+.ce 9999
+.DEVTAG-TL
+.nr s@devtag-needs-end-of-title 1
+..
+.de par@AU
+.par@finish
+.sp 1
+.ft I
+.ce 9999
+..
+.de par@AI
+.par@finish
+.sp .5
+.ce 9999
+..
+.\" In paragraph macros.
+.de NL
+.if \En[.$] .@warning arguments to .NL ignored
+.ie (\\n[\\n[.ev]:PS] >= 1000) \
+. ps (\\n[\\n[.ev]:PS]z / 1000u)
+.el \
+. ps \\n[\\n[.ev]:PS]
+..
+.de SM
+.if \En[.$] .@warning arguments to .SM ignored
+.ps -2
+..
+.de LG
+.if \En[.$] .@warning arguments to .LG ignored
+.ps +2
+..
+.\" par*define-font-macro macro font apply-italic-corrections
+.de par*define-font-macro
+.de \\$1
+.ds par*lic \" empty
+.ds par*ic \" empty
+.if \\n[.$]>2 \{\
+. as par*lic \,\"
+. as par*ic \/\"
+.\}
+.if \En[.$]>3 .@warning excess arguments to .\\$1 ignored
+.ie \En[.$] \{\
+. nr par*prev-font \En[.f]
+\&\E$3\E*[par*lic]\f[\\$2]\E$1\f[\En[par*prev-font]]\E*[par*ic]\E$2
+.\}
+.el .ft \\$2
+\\..
+..
+.par*define-font-macro R R
+.par*define-font-macro B B
+.par*define-font-macro I I yes
+.par*define-font-macro BI BI yes
+.ie n .par*define-font-macro CW R
+.el .par*define-font-macro CW CR
+.\" underline a word
+.de UL
+.if \En[.$]>2 .@warning excess arguments to .UL ignored
+. ie t .do nop \Z'\\$1'\v'.25m'\D'l \w'\\$1'u 0'\v'-.25m'\\$2
+. el \(ul\\$1\(ul\\$2
+..
+.\" box a word
+.de BX
+.if \En[.$]>1 .@warning excess arguments to .BX ignored
+.nr par*bxw \w'\\$1'
+.ie t \{\
+.nr par*bxw +.4m
+\Z'\v'.25m'\
+\D'l 0 -1m'\D'l \\n[par*bxw]u 0'\D'l 0 1m'\D'l -\\n[par*bxw]u 0''\
+\Z'\h'.2m'\\$1'\h'\\n[par*bxw]u'
+.\}
+.el \m[black]\M[white]\Z'\\$1'\h'\\n[par*bxw]u'\m[]\M[]
+..
+.\" superscript
+.ds par@sup-start \v'-.9m\s'\En[.s]*7u/10u'+.7m'
+.als { par@sup-start
+.ds par@sup-end \v'-.7m\s0+.9m'
+.als } par@sup-end
+.\" subscript
+.ds par@sub-start \v'+.3m\s'\En[.s]*7u/10u'-.1m'
+.als < par@sub-start
+.ds par@sub-end \v'+.1m\s0-.3m'
+.als > par@sub-end
+.\" footnote paragraphs
+.fn@init
+.\" FR is the ratio of footnote (horizontal) length to the line length
+.ds FR 11/12
+.\" FF is the footnote format
+.nr FF 0
+.\" This can be redefined. It gets a second argument of 'no' if the
+.\" first argument was supplied by the user, rather than automatically.
+.de FP
+.br
+.if !d par*fp!\\n[FF] \{\
+. @error unknown footnote format '\\n[FF]'
+. nr FF 0
+.\}
+.ie '\\$2'no' .par*fp!\\n[FF]-no "\\$1"
+.el .par*fp!\\n[FF] "\\$1"
+..
+.de par*fp!0
+.@PP
+\&\\*[fn@mark-start]\\$1\\*[fn@mark-end]\ \c
+..
+.de par*fp!0-no
+.@PP
+\&\\$1\ \c
+..
+.de par*fp!1
+.@PP
+\&\\$1.\ \c
+..
+.de par*fp!1-no
+.@PP
+\&\\$1\ \c
+..
+.de par*fp!2
+.@LP
+\&\\$1.\ \c
+..
+.de par*fp!2-no
+.@LP
+\&\\$1\ \c
+..
+.de par*fp!3
+.@IP "\\$1." (u;\\n[\\n[.ev]:PI]*2)
+..
+.de par*fp!3-no
+.@IP "\\$1" (u;\\n[\\n[.ev]:PI]*2)
+..
+.\" ***************************
+.\" ******** module nh ********
+.\" ***************************
+.\" Numbered headings.
+.\" nh*hl is the level of the last heading
+.nr nh*hl 0
+.\" SN-DOT and SN-NO-DOT represent the section number of
+.\" the current heading, with and without a terminating dot.
+.ds SN-DOT
+.ds SN-NO-DOT
+.\" SN-STYLE sets the statement numbering style used in headings
+.\" (either SN-DOT or SN-NO-DOT); for backward compatibility with
+.\" earlier ms versions, the default is SN-DOT
+.als SN-STYLE SN-DOT
+.\" Also for backward compatibility, let SN represent SN-DOT.
+.als SN SN-DOT
+.\" numbered heading
+.de @NH
+.ie '\\$1'S' \{\
+. shift
+. nr nh*hl 0
+. while \\n[.$] \{\
+. nr nh*hl +1
+. nr H\\n[nh*hl] 0\\$1
+. shift
+. \}
+. if !\\n[nh*hl] \{\
+. nr H1 1
+. nr nh*hl 1
+. @error missing arguments to .NH S
+. \}
+.\}
+.el \{\
+. nr nh*ohl \\n[nh*hl]
+. ie \\n[.$] \{\
+. nr nh*hl 0\\$1
+. ie \\n[nh*hl]<=0 \{\
+. nr nh*ohl 0
+. nr nh*hl 1
+. \}
+. el \{\
+. if \\n[nh*hl]-\\n[nh*ohl]>1 \{\
+. ds nh*msg .NH \\n[nh*ohl] followed by\"
+. as nh*msg " .NH \\n[nh*hl]\"
+. @warning \\*[nh*msg]
+. rm nh*msg
+. \}
+. \}
+. \}
+. el .nr nh*hl 1
+. while \\n[nh*hl]>\\n[nh*ohl] \{\
+. nr nh*ohl +1
+. nr H\\n[nh*ohl] 0
+. \}
+. nr H\\n[nh*hl] +1
+.\}
+.ds SN-NO-DOT \\n(H1
+.nr nh*i 1
+.while \\n[nh*i]<\\n[nh*hl] \{\
+. nr nh*i +1
+. as SN-NO-DOT .\\n[H\\n[nh*i]]
+.\}
+.ds SN-DOT \\*[SN-NO-DOT].
+.nr sh*psincr (\\n[GROWPS]-\\n[nh*hl])*\\n[PSINCR]
+.SH-NO-TAG
+.DEVTAG-NH "\\$1"
+.if '\*(.T'html' .nr s@devtag-needs-end-of-heading 1
+\\*[SN-STYLE]
+..
+.\" ****************************
+.\" ******** module toc ********
+.\" ****************************
+.\" Table of contents generation.
+.de @XS
+.da toc*div
+.ev h
+.ie \\n[.$] .XA "\\$1"
+.el .XA
+..
+.de @div-end!toc*div
+.XE
+..
+.de XA
+.ie '\\n(.z'toc*div' \{\
+. if d toc*num .toc*end-entry
+. ie \\n[.$] \{\
+. ie '\\$1'no' .ds toc*num \" empty
+. el .ds toc*num "\\$1
+. \}
+. el .ds toc*num \\n[%]\"
+. br
+. par@reset
+. na
+. in (n;0\\$2)
+.\}
+.el .@error .XA without .XS
+..
+.de XE
+.ie '\\n(.z'toc*div' \{\
+. if d toc*num .toc*end-entry
+. ev
+. di
+.\}
+.el .@error .XE without .XS
+..
+.\" Rudimentary integration of TOC generation with SH and NH;
+.\" (called by XH and XN respectively, to capture heading text
+.\" for reuse as TOC entry); may be redefined, to achieve more
+.\" sophisticated TOC layout effects.
+.\"
+.\" No-op initializers are called by XH and XN respectively,
+.\" before XH-UPDATE-TOC is called; if XH-UPDATE-TOC has been
+.\" redefined, then it may also be necessary to redefine either,
+.\" or both of these, to perform any initialization specific
+.\" to use after SH and NH respectively.
+.de XH-INIT de
+.de XN-INIT
+..
+.de XH-UPDATE-TOC
+.\" .XH-UPDATE-TOC <outline-level> <text>
+.XS
+.in (\\$1u - 1u * 2n)
+.shift
+\&\\$*
+.XE
+..
+.\" Rudimentary integration hook, to be called (nominally)
+.\" after SH, but acceptable in any body-text context
+.de XH de
+.\" .XH <outline-level> <text>
+.rn XH-REPLACEMENT XH
+.XH \\$@
+.de XH-REPLACEMENT
+.XH-INIT
+.XH-UPDATE-TOC \\$@
+.shift
+\&\\$*
+..
+.\" Rudimentary integration hook, to be called after NH
+.de XN de
+.\" .XN <text>
+.ie \\n[nh*hl] .toc*xn-init \\$@
+.el \{\
+. @error .XN is not allowed before .NH
+. nop \&\\$*
+.\}
+.de toc*xn-init de
+.rn XN-REPLACEMENT XN
+.XN \\$@
+.rm \\$0
+.de XN-REPLACEMENT
+.XN-INIT
+.XH-UPDATE-TOC \\n[nh*hl] \\$@
+\&\\$*
+..
+.de toc*end-entry
+.if !'\\*[toc*num]'' \\a\\t\\*[toc*num]
+.br
+.rm toc*num
+..
+.de PX
+.1C
+.if !'\\$1'no' \{\
+. ce 1
+. ie (\\n[PS] >= 1000) \
+. ps ((\\n[PS]z / 1000u) + 2z)
+. el \
+. ps \\n[PS]+2
+. ft B
+\\*[TOC]
+. ft
+. ps
+.\}
+.nf
+.if !r TC-MARGIN .nr TC-MARGIN \w'000'
+.if !c \[TC-LEADER] .char \[TC-LEADER] .\h'1m'
+.ta (u;\\n[.l]-\\n[.i]-\\n[TC-MARGIN]) (u;\\n[.l]-\\n[.i])R
+.lc \[TC-LEADER]
+.sp 2
+.toc*div
+.par@reset
+..
+.\" print the table of contents on page i
+.de TC
+.P1
+.pg@begin 1 i
+.PX \\$1
+..
+.\" ****************************
+.\" ******** module eqn ********
+.\" ****************************
+.\" Eqn support.
+.de EQ
+..
+.de EN
+..
+.de @EQ
+.if \\n[tbl@within-table] \
+. @error .EQ is not allowed within a .TS/.TE table
+.br
+.ds eqn*num "\\$2
+.ie '\\$1'L' .nr eqn*type 0
+.el \{\
+. ie '\\$1'I' .nr eqn*type 1
+. el \{\
+. nr eqn*type 2
+. if !'\\$1'C' .ds eqn*num "\\$1
+. \}
+.\}
+.di eqn*div
+.in 0
+.if '\*(.T'html' \{\
+. nr eqn*ll \\n[.l]
+. ll 1000n
+.\}
+.if \\n[eqn*type]=0 .EQN-HTML-IMAGE-LEFT
+.if \\n[eqn*type]=1 \{\
+. if '\*(.T'html' .RS
+.EQN-HTML-IMAGE-INLINE
+.\}
+.if \\n[eqn*type]=2 .EQN-HTML-IMAGE
+.nf
+..
+.de @div-end!eqn*div
+.@EN
+..
+.\" Note that geqn mark and lineup work correctly in centered equations.
+.de @EN
+.ie !'\\n(.z'eqn*div' .@error-recover mismatched .EN
+.el \{\
+. br
+. di
+. nr eqn*have-num 0
+. if !'\\*[eqn*num]'' .nr eqn*have-num 1
+. ie \\n[dl]:\\n[eqn*have-num] \{\
+. sp \\n[DD]u
+. ns
+. par@reset
+. ds eqn*tabs \\n[.tabs]
+. nf
+. ie \\n[dl] \{\
+.\" XXX: This really should not be necessary and
+.\" indicates that there is extra space creeping
+.\" into an equation when ps4html is enabled.
+. ie r ps4html .ds@need \\n[dn]u-1v+\n[.V]u+1i
+. el .ds@need \\n[dn]u-1v+\n[.V]u
+. chop eqn*div
+. ie \\n[eqn*type]=0 \{\
+. ta (u;\\n[.l]-\\n[.i])R
+\\*[eqn*div]\t\\*[eqn*num]
+. \}
+. el \{\
+. ie \\n[eqn*type]=1 .ta \\n[DI]u \
+(u;\\n[.l]-\\n[.i])R
+. el .ta (u;\\n[.l]-\\n[.i]/2)C \
+(u;\\n[.l]-\\n[.i])R
+\t\\*[eqn*div]\t\\*[eqn*num]
+. \}
+. \}
+. el \{\
+. ta (u;\\n[.l]-\\n[.i])R
+\t\\*[eqn*num]
+. \}
+.\". if !'\*(.T'html' .sp \\n[DD]u
+. sp \\n[DD]u
+. ns
+. ta \\*[eqn*tabs]
+. \}
+. el \{\
+.\" must terminate empty equations in html and ps4html as they contain
+.\" the EQN-HTML-IMAGE-END suppression nodes
+. if \\n[dl] .chop eqn*div
+. if '\*(.T'html' \\*[eqn*div]
+. if r ps4html \\*[eqn*div]
+. \}
+. if !'\*(.T'html' .fi
+. if \\n[eqn*type]=0 .EQN-HTML-IMAGE-END
+. if \\n[eqn*type]=1 \{\
+. EQN-HTML-IMAGE-END
+. if '\*(.T'html' .RE
+. \}
+. if \\n[eqn*type]=2 .EQN-HTML-IMAGE-END
+. if '\*(.T'html' \
+. ll \\n[eqn*ll]u
+.\}
+..
+.
+.\" ****************************
+.\" ******** module tbl ********
+.\" ****************************
+.\" Tbl support.
+.nr tbl@within-table 0
+.nr tbl*have-header 0
+.\" This gets called if TS occurs before the first paragraph.
+.de TS
+.LP
+.\" cov*ab-init, called by LP, aliases TS to @TS.
+\\*[TS]\\
+..
+.de @TS
+.nr tbl@within-table 1
+.sp \\n[DD]u
+.if '\\$1'H' \{\
+. ds tbl*stem .TS H table inside\"
+. ie '\\n[.z]'kp@div' .@warning \\*[tbl*stem] .KS/.KE keep
+. el .if '\\n[.z]'kp@fdiv' \
+. @warning \\*[tbl*stem] .KF/.KE floating keep
+. rm tbl*stem
+. di tbl*header-div
+.\}
+.if '\*(.T'html' \{\
+. nr tbl*ll \\n[.l]
+. ll 1000n
+.\}
+.HTML-IMAGE
+..
+.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*print-header
+.ev nf
+.tbl*header-div
+.ev
+.mk #T
+..
+.de TH
+.ie '\\n[.z]'tbl*header-div' \{\
+. nr T. 0
+. T#
+. br
+. di
+. \" A table with repeating headings requires enough room for them
+. \" and then at least one more vee for a row of data.
+. ie \\n[dn]+1v>=(\\n[.p]-\\n[FM]-\\n[HM]) \{\
+. ds tbl*err .TH repeating table heading(s) do not fit in
+. as tbl*err " page area; formatting only once
+. @error \\*[tbl*err]
+. rm tbl*err
+. ds@need \\n[dn]
+. tbl*print-header
+. \}
+. el \{\
+. nr tbl*header-ht \\n[dn]
+. ds@need \\n[dn]u+1v
+. tbl*print-header
+. nr tbl*have-header 1
+. \}
+.\}
+.el .@error-recover .TH without .TS H
+..
+.de @div-end!tbl*header-div
+.TH
+.TE
+..
+.de TE
+.ie '\\n(.z'tbl*header-div' .@error-recover .TS H but no .TH before .TE
+.el \{\
+. nr tbl*have-header 0
+. if !'\*(.T'html' \{\
+. sp \\n[DD]u
+. ns
+. \}
+.\}
+.HTML-IMAGE-END
+.if '\*(.T'html' \
+. ll \\n[tbl*ll]u
+.\" reset tabs
+.TA
+.nr tbl@within-table 0
+..
+.de tbl@bottom-hook
+.if \\n[tbl*have-header] \{\
+. nr T. 1
+. T#
+.\}
+..
+.de T&
+..
+.\" ****************************
+.\" ******** module pic ********
+.\" ****************************
+.\" Pic support.
+.\" This gets called if PS occurs before the first paragraph.
+.de PS
+.LP
+.\" cov*ab-init, called by LP, aliases PS to @PS.
+\\*[PS]\\
+..
+.\" @PS height width
+.de @PS
+.br
+.sp \\n[DD]u
+.ie !\\n[.$]=2 \{\
+. ds pic*msg .PS: expected 2 arguments, got \\n[.$]\"
+. as pic*msg ; not preprocessed with pic?\"
+. @error \\*[pic*msg]
+. rm pic*msg
+.\}
+.el \{\
+. ds@need (u;\\$1)+1v
+. in +(u;\\n[.l]-\\n[.i]-\\$2/2>?0)
+.\}
+.HTML-IMAGE
+..
+.de PF
+.HTML-IMAGE-END
+.par@reset
+..
+.de PE
+.PF
+.sp \\n[DD]u+.5m
+..
+.\" ****************************
+.\" ******** module ref ********
+.\" ****************************
+.\" Refer support.
+.mso refer-ms.tmac
+.\" ****************************
+.\" ******** module acc ********
+.\" ****************************
+.\" Accents and special characters.
+.ds Q \(lq
+.ds U \(rq
+.ds - \(em
+.\" Characters
+.\" Accents
+.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'
+..
+.de acc*slash-def
+.ds \\$1 \Z'\h'(u;-\En[.w]-\w'\\$2'/2)'\
+\v'(u;\En[.cdp]-\En[.cht]+\En[rst]+\En[rsb]/2)'\\$2'
+..
+.de acc*prefix-def
+.ds \\$1 \Z'\h'(u;\w'x'-\w'\\$2'/2)'\\$2'
+..
+.acc*prefix-def ' \'
+.acc*prefix-def ` \`
+.acc*prefix-def ^ ^
+.acc*prefix-def , \(ac
+.acc*prefix-def : \(ad
+.acc*prefix-def ~ ~
+.\" improved accent marks
+.de AM
+.acc*over-def ' \'
+.acc*over-def ` \`
+.acc*over-def ^ ^
+.acc*over-def ~ ~
+.acc*over-def : \(ad
+.acc*over-def v \(ah
+.acc*over-def _ \(a-
+.acc*over-def o \(ao
+.acc*under-def , \(ac
+.acc*under-def . \s[\En[.s]*8u/10u]\v'.2m'.\v'-.2m'\s0
+.acc*under-def hook \(ho
+.acc*slash-def / /
+.char \[hooko] o\E*[hook]
+.ds q \[hooko]
+.\" The idea of this definition is for the top of the 3 to be at the
+.\" x-height.
+.if !c\[yogh] .char \[yogh] \Z'\v'\w'x'*0-\En[rst]u'\s[\En[.s]*8u/10u]\
+\v'\w'3'*0+\En[rst]u'3\s0'\h'\w'\s[\En[.s]*8u/10u]3'u'
+.ds 3 \[yogh]
+.ds D- \(-D\" Icelandic uppercase eth
+.ds d- \(Sd\" Icelandic lowercase eth
+.ds Th \(TP\" Icelandic uppercase thorn
+.ds th \(Tp\" Icelandic lowercase thorn
+.ds 8 \(ss\" German double s
+.ds Ae \(AE\" AE ligature
+.ds ae \(ae\" ae ligature
+.ds Oe \(OE\" OE ligature
+.ds oe \(oe\" oe ligature
+.ds ? \(r?\" upside down ?
+.ds ! \(r!\" upside down !
+..
+.de CHECK-FOOTER-AND-KEEP
+.if '\*(.T'html' \{\
+. rm KF
+. als KF KS
+.
+. rm FS
+. de FS
+. sp
+. HTML-NS <cite>
+\\..
+. rm FE
+. de FE
+. HTML-NS </cite>
+. sp
+\\..
+.\}
+..
+.par@load-init
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/sv.tmac b/tmac/sv.tmac
new file mode 100644
index 0000000..f2fbef4
--- /dev/null
+++ b/tmac/sv.tmac
@@ -0,0 +1,184 @@
+.\" Swedish localization for groff
+.\"
+.\" Copyright (C) 2006-2022 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 3 of the License, 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 this program. If not, see
+.\" <http://www.gnu.org/licenses/>.
+.\"
+.\" Please send comments to groff@gnu.org.
+.
+.do nr *groff_sv_tmac_C \n[.cp]
+.cp 0
+.
+.
+.\" If changing from an existing locale, we need to preserve the state
+.\" of the "suppress hyphenation before a page location trap" bit.
+.nr locale*use-trap-hyphenation-mode 0
+.if d locale \
+. if \n[.hy]=\n[\*[locale]*hyphenation-mode-trap] \
+. nr locale*use-trap-hyphenation-mode 1
+.
+.
+.ds locale swedish\"
+.
+.
+.\" Predefined text translations
+.
+.ds \*[locale]-abstract ABSTRAKT\"
+.ds \*[locale]-app Bilaga\"
+.ds \*[locale]-appendix_string Bilaga\"
+.ds \*[locale]-april april\"
+.ds \*[locale]-attribute_string av\"
+.ds \*[locale]-august augusti\"
+.ds \*[locale]-chapter_string Kapitel\"
+.ds \*[locale]-december december\"
+.ds \*[locale]-draft_string Utkast\"
+.ds \*[locale]-endnote_string NOTER\"
+.ds \*[locale]-february februari\"
+.ds \*[locale]-finis_string SLUT\"
+.ds \*[locale]-friday fredag\"
+.ds \*[locale]-january januari\"
+.ds \*[locale]-july juli\"
+.ds \*[locale]-june juni\"
+.ds \*[locale]-le Ekvationer\"
+.ds \*[locale]-letapp Godk\[a :]nd av:\"
+.ds \*[locale]-letat ATTENTION:\"
+.ds \*[locale]-letcn KONFIDENTIELLT\"
+.ds \*[locale]-letdate datum\"
+.ds \*[locale]-letfc V\[a :]nliga h\[a :]lsningar\"
+.ds \*[locale]-letns!0 Kopia till\"
+.ds \*[locale]-letns!1 Kopia (med att.) till\"
+.ds \*[locale]-letns!10 Kopia (med atts.) till\"
+.ds \*[locale]-letns!11 Kopia (utan atts.) till\"
+.ds \*[locale]-letns!12 Endast abstract till\"
+.ds \*[locale]-letns!13 Hela dokumentet till\"
+.ds \*[locale]-letns!14 CC:
+.ds \*[locale]-letns!2 Kopia (utan att.) till\"
+.ds \*[locale]-letns!3 Att.\"
+.ds \*[locale]-letns!4 Atts.\"
+.ds \*[locale]-letns!5 Enc.\"
+.ds \*[locale]-letns!6 Encs.\"
+.ds \*[locale]-letns!7 Annat f\[o :]rs\[a :]ttsblad\"
+.ds \*[locale]-letns!8 Brev till\"
+.ds \*[locale]-letns!9 Dokument till\"
+.ds \*[locale]-letns!copy Kopia \" space!
+.ds \*[locale]-letns!to " till\"
+.ds \*[locale]-letrn Refererande till:\"
+.ds \*[locale]-letsa Till vederb\[o :]rande:\"
+.ds \*[locale]-letsj Inneh\[a ao]ll:\"
+.ds \*[locale]-lf Figurer\"
+.ds \*[locale]-licon Inneh\[a ao]llsf\[o :]rteckning\"
+.ds \*[locale]-liec \Ekvation\"
+.ds \*[locale]-liex Uppst\[a :]llning\"
+.ds \*[locale]-lifg Figur\"
+.ds \*[locale]-litb Tabell\"
+.ds \*[locale]-lt Tabeller\"
+.ds \*[locale]-lx Uppst\[a :]llningar\"
+.ds \*[locale]-man-section1 Handbok för allmänna kommandon\"
+.ds \*[locale]-man-section2 Handbok för systemsamtal\"
+.ds \*[locale]-man-section3 Handbok för biblioteksfunktioner\"
+.ds \*[locale]-man-section4 Handbok för kärngränssnitt\"
+.ds \*[locale]-man-section5 Handbok för filformat\"
+.ds \*[locale]-man-section6 Spelhandbok\"
+.ds \*[locale]-man-section7 Handbok för diverse information\"
+.ds \*[locale]-man-section8 Systemchefens handbok\"
+.ds \*[locale]-man-section9 Handbok för kärnutvecklare\"
+.ds \*[locale]-march mars\"
+.ds \*[locale]-may maj\"
+.ds \*[locale]-monday m\[a ao]ndag\"
+.ds \*[locale]-november november\"
+.ds \*[locale]-october oktober\"
+.ds \*[locale]-paper A4\"
+.ds \*[locale]-qrf Se kapitel \\*[Qrfh], sidan \\*[Qrfp].\"
+.ds \*[locale]-references Referenser\"
+.ds \*[locale]-revision_string Ver.\"
+.ds \*[locale]-rp Referenser\"
+.ds \*[locale]-saturday l\[o :]rdag\"
+.ds \*[locale]-september september\"
+.ds \*[locale]-sunday s\[o :]ndag\"
+.ds \*[locale]-thursday torsdag\"
+.ds \*[locale]-toc Inneh\[a ao]ll\"
+.ds \*[locale]-toc_header_string Inneh\[a ao]ll\"
+.ds \*[locale]-tuesday tisdag\"
+.ds \*[locale]-wednesday onsdag\"
+.
+.
+.\" Activate the translations
+.
+.mso trans.tmac
+.
+.
+.\" ms package
+.if r GS \{\
+. \" update the date
+. ds DY \n[dy] \*[MO] \n[year]
+. \" set hyphenation flags
+. nr HY 34
+.\}
+.
+.
+.\" mm package -- additional Swedish localization is done in mse.tmac
+.
+.
+.\" Default encoding
+.mso latin1.tmac
+.
+.ss 12 0
+.
+.\" Set up hyphenation.
+.
+.\" Swedish hyphenation (\lefthyphenmin=1, \righthyphenmin=2)
+.nr \*[locale]*hyphenation-mode-base 32
+.nr \*[locale]*hyphenation-mode-trap 34
+.
+.ie \n[locale*use-trap-hyphenation-mode] \
+. hy \n[\*[locale]*hyphenation-mode-trap]
+.el \
+. hy \n[\*[locale]*hyphenation-mode-base]
+.
+.rr locale*use-trap-hyphenation-mode
+.
+.hcode å å Å å
+.hcode ä ä Ä ä
+.hcode ö ö Ö ö
+.hcode é é É é
+.
+.hla sv
+.hpf hyphen.sv
+.
+.
+.\" man package
+.if d an \
+. an*reset-hyphenation-mode
+.
+.
+.\" me package
+.if d @R \{\
+. ds _td_format \En(dy \E*(mo \En(y4
+. ld
+.\}
+.
+.
+.cp \n[*groff_sv_tmac_C]
+.do rr *groff_sv_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" coding: latin-1
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/tests/an-ext_MR-works.sh b/tmac/tests/an-ext_MR-works.sh
new file mode 100755
index 0000000..c922ba2
--- /dev/null
+++ b/tmac/tests/an-ext_MR-works.sh
@@ -0,0 +1,61 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Keep preconv from being run.
+unset GROFF_ENCODING
+
+fail=
+
+wail () {
+ echo ...FAILED >&2
+ fail=YES
+}
+
+input='.TH foo 1 2021-10-06 "groff test suite"
+.SH Name
+.ec @
+foo @- a command with a very short name
+.ec
+.SH Description
+The real work is done by
+.MR bar 1 .'
+
+output=$(echo "$input" | "$groff" -rmG=0 -Tascii -man -Z | nl)
+echo "$output"
+
+# Expected:
+# 88 wf2
+# 89 h24
+# 90 tbar
+# 91 f1
+# 92 t(1).
+
+echo "checking for correct man page topic font style" >&2
+echo "$output" | grep -Eq '88[[:space:]]+wf2' || wail
+echo "$output" | grep -Eq '90[[:space:]]+tbar' || wail
+echo "checking for correct man page section font style" >&2
+echo "$output" | grep -Eq '91[[:space:]]+f1' || wail
+echo "$output" | grep -Eq '92[[:space:]]+t\(1\)' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an-ext_MT-works.sh b/tmac/tests/an-ext_MT-works.sh
new file mode 100755
index 0000000..1bb7699
--- /dev/null
+++ b/tmac/tests/an-ext_MT-works.sh
@@ -0,0 +1,55 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail() {
+ echo ...FAILED >&2
+ fail=yes
+}
+
+input='.TH foo 1 2022-11-22 "groff test suite"
+.SH Name
+foo \- frobnicate a bar
+.SH Description
+Mail
+.MT modok@\:example\:.com
+the boss
+.ME .
+.
+Complaints to
+.MT nobody@\:example\:.com
+.ME .'
+
+output=$(printf "%s\n" "$input" \
+ | "$groff" -rmG=0 -Tascii -P-cbou -man -rU0)
+echo "$output"
+
+echo "checking formatting of mail URI with link text" >&2
+echo "$output" | grep -Fq 'Mail the boss <modok@example.com>.' || wail
+
+echo "checking formatting of mail URI with no link text" >&2
+echo "$output" | grep -Fq 'Complaints to <nobody@example.com>.' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an-ext_UR-works.sh b/tmac/tests/an-ext_UR-works.sh
new file mode 100755
index 0000000..bf5a1ab
--- /dev/null
+++ b/tmac/tests/an-ext_UR-works.sh
@@ -0,0 +1,56 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail() {
+ echo ...FAILED >&2
+ fail=yes
+}
+
+input='.TH foo 1 2022-11-22 "groff test suite"
+.SH Name
+foo \- frobnicate a bar
+.SH Description
+See
+.UR http://\:foo\:.example\:.com
+figure 1
+.UE .
+.
+Or
+.UR http://\:bar\:.example\:.com
+.UE .'
+
+output=$(printf "%s\n" "$input" \
+ | "$groff" -rmG=0 -Tascii -P-cbou -man -rU0)
+echo "$output"
+
+echo "checking formatting of web URI with link text" >&2
+echo "$output" | grep -Fq 'See figure 1 <http://foo.example.com>.' \
+ || wail
+
+echo "checking formatting of web URI with no link text" >&2
+echo "$output" | grep -Fq 'Or <http://bar.example.com>.' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_AT-and-UC-footer-saved-and-restored.sh b/tmac/tests/an_AT-and-UC-footer-saved-and-restored.sh
new file mode 100755
index 0000000..fd3164f
--- /dev/null
+++ b/tmac/tests/an_AT-and-UC-footer-saved-and-restored.sh
@@ -0,0 +1,106 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #57416.
+#
+# The (deprecated) macros .AT and .UC, intended only for rendering of
+# legacy man pages, alter strings used in man page footers. Verify that
+# they modify and restore these strings correctly.
+
+EXAMPLE_ATT_PAGE='.TH att 1 2020-01-16 "groff test suite"
+.AT
+.SH Name
+att \- aim Death Star at planet'
+
+EXAMPLE_FSF_PAGE='.TH fsf 1 2020-01-16 "groff test suite"
+.SH Name
+fsf \- liberate laser printer firmware'
+
+EXAMPLE_WFJ_PAGE='.TH wfj 1 2020-01-16 "groff test suite"
+.UC
+.SH Name
+wfj \- call 1-800-ITS-UNIX'
+
+EXAMPLE_GNU_PAGE='.TH gnu 1 2020-01-16 "groff test suite"
+.SH Name
+gnu \- join us now and share the software'
+
+EXAMPLE_UCB_PAGE='.TH ucb 1 2020-01-16 "groff test suite"
+.UC 7
+.SH Name
+ucb \- blow up Death Star'
+
+# We turn off continuous rendering (-rcR=0) so that the page footers are
+# numbered. We turn on continuous page numbering (-rC1) so we can tell
+# that the footers are on the expected pages.
+INPUT=$(printf "%s\n" \
+ "$EXAMPLE_ATT_PAGE" \
+ "$EXAMPLE_FSF_PAGE" \
+ "$EXAMPLE_WFJ_PAGE" \
+ "$EXAMPLE_GNU_PAGE" \
+ "$EXAMPLE_UCB_PAGE" \
+ "$EXAMPLE_GNU_PAGE" \
+)
+
+OUTPUT=$(echo "$INPUT" | "$groff" -Tascii -P-cbou -man -rcR=0 -rC1)
+
+FAIL=
+
+if ! echo "$OUTPUT" | grep -qE '7th Edition +2020-01-16 +1'
+then
+ FAIL=yes
+ echo "AT&T (.AT) footer test failed" >&2
+fi
+
+if ! echo "$OUTPUT" | grep -qE 'groff test suite +2020-01-16 +2'
+then
+ FAIL=yes
+ echo "FSF test footer failed" >&2
+fi
+
+if ! echo "$OUTPUT" | grep -qE '3rd Berkeley Distribution +2020-01-16 +3'
+then
+ FAIL=yes
+ echo "WFJ (.UC) footer test failed" >&2
+fi
+
+if ! echo "$OUTPUT" | grep -qE 'groff test suite +2020-01-16 +4'
+then
+ FAIL=yes
+ echo "1st GNU footer test failed" >&2
+fi
+
+if ! echo "$OUTPUT" | grep -qE '4.4 Berkeley Distribution +2020-01-16 +5'
+then
+ FAIL=yes
+ echo "UCB (.UC) footer test failed" >&2
+fi
+
+if ! echo "$OUTPUT" | grep -qE 'groff test suite +2020-01-16 +6'
+then
+ FAIL=yes
+ echo "2nd GNU footer test failed" >&2
+fi
+
+test -z "$FAIL"
+
+# vim:set ai et sw=4 ts=4 tw=80:
diff --git a/tmac/tests/an_CS-register-off.sh b/tmac/tests/an_CS-register-off.sh
new file mode 100755
index 0000000..0b615da
--- /dev/null
+++ b/tmac/tests/an_CS-register-off.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+#
+# Copyright (C) 2019-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+"$groff" -rCS=0 -Tascii -P-cbou -man <<EOF | grep -q Name
+.TH sample 1 2019-09-09 "groff test suite"
+.SH Name
+sample \- test subject for groff
+EOF
diff --git a/tmac/tests/an_CS-register-on.sh b/tmac/tests/an_CS-register-on.sh
new file mode 100755
index 0000000..34628a4
--- /dev/null
+++ b/tmac/tests/an_CS-register-on.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+#
+# Copyright (C) 2019-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+"$groff" -rCS=1 -Tascii -P-cbou -man <<EOF | grep -q NAME
+.TH sample 1 2019-09-09 "groff test suite"
+.SH Name
+sample \- test subject for groff
+EOF
diff --git a/tmac/tests/an_CS-register-unspecified.sh b/tmac/tests/an_CS-register-unspecified.sh
new file mode 100755
index 0000000..71b27b9
--- /dev/null
+++ b/tmac/tests/an_CS-register-unspecified.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+#
+# Copyright (C) 2019-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+"$groff" -Tascii -P-cbou -man <<EOF | grep -q Name
+.TH sample 1 2019-09-09 "groff test suite"
+.SH Name
+sample \- test subject for groff
+EOF
diff --git a/tmac/tests/an_CT-register-off.sh b/tmac/tests/an_CT-register-off.sh
new file mode 100755
index 0000000..9920543
--- /dev/null
+++ b/tmac/tests/an_CT-register-off.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+#
+# Copyright (C) 2019-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+"$groff" -rCT=0 -Tascii -P-cbou -man <<EOF | grep -q 'sample(1)'
+.TH sample 1 2019-09-09 "groff test suite"
+.SH Name
+sample \- test subject for groff
+EOF
diff --git a/tmac/tests/an_CT-register-on.sh b/tmac/tests/an_CT-register-on.sh
new file mode 100755
index 0000000..33861ab
--- /dev/null
+++ b/tmac/tests/an_CT-register-on.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+#
+# Copyright (C) 2019-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+"$groff" -rCT=1 -Tascii -P-cbou -man <<EOF | grep -q 'SAMPLE(1)'
+.TH sample 1 2019-09-09 "groff test suite"
+.SH Name
+sample \- test subject for groff
+EOF
diff --git a/tmac/tests/an_CT-register-unspecified.sh b/tmac/tests/an_CT-register-unspecified.sh
new file mode 100755
index 0000000..cc94b3f
--- /dev/null
+++ b/tmac/tests/an_CT-register-unspecified.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+#
+# Copyright (C) 2019-2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+"$groff" -Tascii -P-cbou -man <<EOF | grep -q 'sample(1)'
+.TH sample 1 2019-09-09 "groff test suite"
+.SH Name
+sample \- test subject for groff
+EOF
diff --git a/tmac/tests/an_FT-bad-value-should-not-trash-titles.sh b/tmac/tests/an_FT-bad-value-should-not-trash-titles.sh
new file mode 100755
index 0000000..e14109f
--- /dev/null
+++ b/tmac/tests/an_FT-bad-value-should-not-trash-titles.sh
@@ -0,0 +1,93 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #60612.
+#
+# Bad values of FT should not trash headers and footers.
+EXAMPLE_PAGE_1='.TH foo 1 2021-05-17 "groff foo test"
+.SH Name
+foo \- frobnicate bits'
+
+EXAMPLE_PAGE_2='.TH bar 1 2021-05-17 "groff bar test"
+.SH Name
+bar \- what they say north of Macedonia'
+
+# We turn off continuous rendering (-rcR=0) so that FT influences where the page
+# footer is output.
+INPUT=$(printf "%s\n" \
+ "$EXAMPLE_PAGE_1" \
+ "$EXAMPLE_PAGE_2" \
+)
+
+# FT tells our man(7) where to write the page footer.
+#
+# -0.5i is the default and should always work.
+#
+# 0 (in any units) is not sane. It would step on ("hide") the header trap among
+# other problems.
+#
+# 0.5i (positive) is a likely input from a confused user (I've done it).
+#
+# "Reasonable" positive values are conceivable but there may not be any user
+# demand for them. ("Always break for the footer at 3i [or 3c] regardless of
+# the page length"?)
+#
+# Somewhere between -0.51v (bad) and -0.55v (okay) a problem gets caused.
+#
+# Traps that aren't in the page area (-20i, 500c for conventional paper sizes)
+# don't get sprung.
+
+for FT in -0.5i -1i 0i 0.5i -0.51v -0.55v 10i -20i
+do
+ OUTPUT=$(echo "$INPUT" | "$groff" -Tascii -P-cbou -man -rcR=0 -rFT=$FT)
+ FAIL=
+
+ if ! echo "$OUTPUT" | grep -qE 'foo\(1\) +General Commands Manual +foo\(1\)'
+ then
+ FAIL=yes
+ echo "first page header test failed (FT=$FT)" >&2
+ fi
+
+ if ! echo "$OUTPUT" | grep -qE 'groff foo test +2021-05-17 +1'
+ then
+ FAIL=yes
+ echo "first page footer test failed (FT=$FT)" >&2
+ fi
+
+ if ! echo "$OUTPUT" | grep -qE 'bar\(1\) +General Commands Manual +bar\(1\)'
+ then
+ FAIL=yes
+ echo "second page header test failed (FT=$FT)" >&2
+ fi
+
+ test -z "$FAIL"
+
+ if ! echo "$OUTPUT" | grep -qE 'groff bar test +2021-05-17 +1'
+ then
+ FAIL=yes
+ echo "second page footer test failed (FT=$FT)" >&2
+ fi
+done
+
+test -z "$FAIL"
+
+# vim:set ai et sw=4 ts=4 tw=80:
diff --git a/tmac/tests/an_HY-register-works.sh b/tmac/tests/an_HY-register-works.sh
new file mode 100755
index 0000000..2e8ddc0
--- /dev/null
+++ b/tmac/tests/an_HY-register-works.sh
@@ -0,0 +1,78 @@
+#!/bin/sh
+#
+# Copyright (C) 2023 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ fail=YES
+}
+
+input='.TH foo 1 2023-01-08 "groff test suite"
+.SH Name
+foo \- frobinicate a bar
+.SH Synopsis
+.SY foo
+.YS
+.SH Description
+Now is the time for all good citizens to disestablish
+antidisestablishmentarianism.'
+
+output=$(printf "%s\n" "$input" | "$groff" -man -Tascii -P-cbou)
+echo "$output"
+
+echo "checking hyphenation when HY is default" >&2
+echo "$output" | grep -q "antidisestablish-$" || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -rHY=0 -man -Tascii -P-cbou)
+echo "$output"
+
+echo "checking hyphenation when HY is 0" >&2
+echo "$output" | grep -Eq "to +disestablish$" || wail
+
+input='.TH foo 1 2023-01-08 "groff test suite"
+.SH Name
+foo \- frobinicate a bar
+.SH Synopsis
+.SY foo
+.SY foo
+.I arbitrary-argument
+.YS
+.SH Description
+Now is the time for all good citizens to disestablish
+antidisestablishmentarianism.'
+
+output=$(printf "%s\n" "$input" | "$groff" -man -Tascii -P-cbou)
+echo "$output"
+
+echo "checking hyphenation when HY is default and .SY nested" >&2
+echo "$output" | grep -q "antidisestablish-$" || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -rHY=0 -man -Tascii -P-cbou)
+echo "$output"
+
+echo "checking hyphenation when HY is 0 and .SY nested" >&2
+echo "$output" | grep -Eq "to +disestablish$" || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_LL-init-sanely.sh b/tmac/tests/an_LL-init-sanely.sh
new file mode 100755
index 0000000..12b24b1
--- /dev/null
+++ b/tmac/tests/an_LL-init-sanely.sh
@@ -0,0 +1,48 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #58992.
+#
+# Our man macros should no longer attempt to read the .l register on
+# nroff devices to set the line length. That register may or may not
+# have been set by a user .ll request; we can't tell whether a value of
+# 65n came from nroff or the user.
+#
+# Instead, the LL register must be used to set the line length.
+#
+# In this test we _expect_ the .ll request to be ignored and overridden.
+# We choose a value that is not nroff's default nor man's default.
+
+EXAMPLE='
+.ll 70n
+.TH ll\-hell 1 2020-08-22 "groff test suite"
+.SH Name
+ll\-hell \- see how long the lines are
+.SH Description
+LL=\n[LL]u
+.PP
+\&.l=\n[.l]u'
+
+printf "%s\n" "$EXAMPLE" | "$groff" -Tascii -P-cbou -man \
+ | grep -q 'LL=1872u'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_ME-punct-hyphenates.sh b/tmac/tests/an_ME-punct-hyphenates.sh
new file mode 100755
index 0000000..1274c46
--- /dev/null
+++ b/tmac/tests/an_ME-punct-hyphenates.sh
@@ -0,0 +1,55 @@
+#!/bin/sh
+#
+# Copyright (C) 2020, 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo ...FAILED >&2
+ fail=YES
+}
+
+input='.TH me\-punct 1 2020-08-15 "groff test suite"
+.SH Name
+me\-punct \- mailto: trailing material is subject to hyphenation
+.SH Description
+Do not try to
+.MT groff+morestuff@gnu.org
+hyphenate a ridiculous word* without machine assistance
+.ME (*pneumonoultramicroscopicsilicovolcanoconiosis).'
+
+# Turn off break warnings; we expect an adjustment problem.
+# I kind of wish adjustment warnings were a different category from
+# break warnings.
+echo "testing hyphenation of trailing text by an.tmac's ME macro"
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -Wbreak -P-cbou -man)
+echo "$output"
+echo "$output" | grep -qE 'pn.*-'
+
+echo "testing hyphenation of trailing text by an-ext.tmac's ME macro"
+output=$(printf "%s\n" "$input" \
+ | "$groff" -rmG=0 -Tascii -Wbreak -P-cbou -man)
+echo "$output"
+echo "$output" | grep -qE 'pn.*-'
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_MR-works.sh b/tmac/tests/an_MR-works.sh
new file mode 100755
index 0000000..3a84e62
--- /dev/null
+++ b/tmac/tests/an_MR-works.sh
@@ -0,0 +1,75 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Keep preconv from being run.
+unset GROFF_ENCODING
+
+INPUT='.TH foo 1 2021-10-06 "groff test suite"
+.SH Name
+foo \\- a command with a very short name
+.SH Description
+The real work is done by
+.MR bar 1 .'
+
+OUTPUT=$(echo "$INPUT" | "$groff" -Tascii -rU1 -man -Z | nl)
+echo "$OUTPUT"
+
+# Expected:
+# 91 x X tty: link man:bar(1)
+# 92 f2
+# 93 tbar
+# 94 f1
+# 95 t(1)
+# 96 V280
+# 97 H912
+# 98 x X tty: link
+
+set -e
+echo "checking for opening 'link' device control command" >&2
+echo "$OUTPUT" | grep -Eq '91[[:space:]]+x X tty: link man:bar\(1\)$'
+echo "checking for correct man page title font style" >&2
+echo "$OUTPUT" | grep -Eq '92[[:space:]]+f2'
+echo "$OUTPUT" | grep -Eq '93[[:space:]]+tbar'
+echo "checking for correct man page section font style" >&2
+echo "$OUTPUT" | grep -Eq '94[[:space:]]+f1'
+echo "$OUTPUT" | grep -Eq '95[[:space:]]+t\(1\)'
+echo "checking for closing 'link' device control command" >&2
+echo "$OUTPUT" | grep -Eq '98[[:space:]]+x X tty: link$'
+
+set +e
+
+fail=
+
+wail () {
+ echo ...FAILED >&2
+ fail=yes
+}
+
+output=$(echo "$INPUT" | "$groff" -man -Thtml)
+echo "$output"
+
+echo "checking for correctly formatted man URI in HTML output" >&2
+echo "$output" | grep -Fq '<a href="man:bar(1)"><i>bar</i>(1)</a>.'
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_MT-body-hyphenates.sh b/tmac/tests/an_MT-body-hyphenates.sh
new file mode 100755
index 0000000..3ccbf59
--- /dev/null
+++ b/tmac/tests/an_MT-body-hyphenates.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+EXAMPLE='.TH mt\-body 1 2020-08-15 "groff test suite"
+.SH Name
+mt\-body \- mailto: link text is subject to hyphenation
+.SH Description
+Do not try to
+.MT groff@gnu.org
+hyphenate the word
+pneumonoultramicroscopicsilicovolcanoconiosis
+without machine assistance
+.ME .'
+
+printf "%s\n" "$EXAMPLE" | "$groff" -rmG=0 -Tascii -P-cbou -man \
+ | grep -qE 'pn.*-'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_MT-works.sh b/tmac/tests/an_MT-works.sh
new file mode 100755
index 0000000..d4ebf60
--- /dev/null
+++ b/tmac/tests/an_MT-works.sh
@@ -0,0 +1,86 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail() {
+ echo ...FAILED >&2
+ fail=yes
+}
+
+input='.TH foo 1 2022-11-22 "groff test suite"
+.SH Name
+foo \- frobnicate a bar
+.SH Description
+Mail
+.MT modok@\:example\:.com
+the boss
+.ME .
+.
+Complaints to
+.MT nobody@\:example\:.com
+.ME .'
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -man -rU0)
+echo "$output"
+
+echo "checking formatting of mail URI with link text" \
+ "(hyperlinks disabled)" >&2
+echo "$output" | grep -Fq 'Mail the boss <modok@example.com>.' || wail
+
+echo "checking formatting of mail URI with no link text" \
+ "(hyperlinks disabled)" >&2
+echo "$output" | grep -Fq 'Complaints to <nobody@example.com>.' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -man -rU1)
+echo "$output"
+
+echo "checking formatting of mail URI with link text" \
+ "(hyperlinks enabled)" >&2
+echo "$output" | grep -Fq 'Mail the boss.' || wail
+
+echo "checking formatting of mail URI with no link text" \
+ "(hyperlinks enabled)" >&2
+echo "$output" | grep -Fq 'Complaints to nobody@example.com.' || wail
+
+input='.TH foo 1 2022-12-04 "groff test suite"
+.SH Name
+foo \- frobnicate a bar
+.SH Authors
+The GNU version of
+.I foo
+was written by
+.MT q@\:example\:.com
+Quiller
+.ME .'
+
+output=$(printf "%s\n" "$input" | "$groff" -man -Thtml)
+echo "$output"
+
+echo "checking HTML output of mail URI" >&2
+echo "$output" \
+ | grep -Fqx '<a href="mailto:q@example.com">Quiller</a>.</p>' \
+ || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_P-register-works.sh b/tmac/tests/an_P-register-works.sh
new file mode 100755
index 0000000..12f5341
--- /dev/null
+++ b/tmac/tests/an_P-register-works.sh
@@ -0,0 +1,51 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ fail=YES
+}
+
+input='.TH foo 1 2022-12-11 "groff test suite"
+.SH Name
+foo \- frobinicate a bar
+.bp
+.SH Description
+It took a while to get here.'
+
+output=$(printf "%s\n" "$input" | "$groff" -rcR=0 -rP13 -man -Tascii \
+ -P-cbou)
+echo "$output"
+
+echo "checking first page footer" >&2
+echo "$output" | grep -En "^groff test suite +2022-12-11 +13$" \
+ | grep '^64:' || wail
+
+echo "checking second page footer" >&2
+echo "$output" | grep -En "^groff test suite +2022-12-11 +14$" \
+ | grep '^130:' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_TH-repairs-ad-damage.sh b/tmac/tests/an_TH-repairs-ad-damage.sh
new file mode 100755
index 0000000..7b2c849
--- /dev/null
+++ b/tmac/tests/an_TH-repairs-ad-damage.sh
@@ -0,0 +1,41 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+EXAMPLE='.TH mal 1 2020-08-21 "groff test suite"
+.SH Name
+mal \- malevolent man page
+.SH Description
+.ad l
+Wicked page changes adjustment.
+Wicked page changes adjustment.
+Wicked page changes adjustment.
+.TH ino 1 2020-08-21 "groff test suite"
+.SH Name
+ino \- innocent man page
+.SH Description
+Innocent, unoffending man page enjoys adjustment to both margins.
+Innocent, unoffending man page enjoys adjustment to both margins.'
+
+OUTPUT=$(printf "%s\n" "$EXAMPLE" | "$groff" -Tascii -P-cbou -man)
+echo "$OUTPUT" | grep -qE 'margins\. In' # two spaces
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_TH-repairs-hy-damage.sh b/tmac/tests/an_TH-repairs-hy-damage.sh
new file mode 100755
index 0000000..43f3471
--- /dev/null
+++ b/tmac/tests/an_TH-repairs-hy-damage.sh
@@ -0,0 +1,41 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+EXAMPLE='.TH mal 1 2020-08-21 "groff test suite"
+.SH Name
+mal \- malevolent man page
+.SH Description
+.nh
+Wicked page disables hyphenation.
+Wicked page disables hyphenation.
+Wicked page disables hyphenation.
+.TH ino 1 2020-08-21 "groff test suite"
+.SH Name
+ino \- innocent man page
+.SH Description
+Innocent, unoffending man page enjoys hyphenation.
+Innocent, unoffending man page enjoys hyphenation.'
+
+printf "%s\n" "$EXAMPLE" | "$groff" -Tascii -P-cbou -man \
+ | grep -qE 'unoffend-'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_TS-adds-no-vertical-space.sh b/tmac/tests/an_TS-adds-no-vertical-space.sh
new file mode 100755
index 0000000..d6e790a
--- /dev/null
+++ b/tmac/tests/an_TS-adds-no-vertical-space.sh
@@ -0,0 +1,47 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+input='.TH foo 1 2022-07-30 "groff test suite"
+.SH Name
+foo \- frobnicate a bar
+.SH Description
+Foo.
+.TS
+L.
+bar
+.TE
+'
+
+# Bash strips out an empty line, but that's what we're looking for.
+output=$(printf "%s" "$input" | "$groff" -t -man -Tascii \
+ | sed -n \
+ -e '/Foo\./{n;s/^$/FAILURE/;tA;' \
+ -e 's/.*/SUCCESS/;:A;' \
+ -e 'p;}')
+ # Here's a tidier version accepted by GNU sed but rejected
+ # contemptuously by macOS sed. (POSIX doesn't say you _have_ to
+ # accept semicolons after label ':' and branch 't' commands, so it
+ # doesn't.)
+ # sed -n '/Foo\./{n;s/^$/FAILURE/;tA;s/.*/SUCCESS/;:A;p}'
+test "$output" = SUCCESS
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh b/tmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh
new file mode 100755
index 0000000..3c30cd4
--- /dev/null
+++ b/tmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh
@@ -0,0 +1,51 @@
+#!/bin/sh
+#
+# Copyright (C) 2020-2023 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #57665.
+#
+# The interior of this text is fragile with respect to line count.
+
+EXAMPLE='
+.TH ts\-hell 1 2020-10-09 "groff test suite"
+.SH Name
+ts\-hell \- turn off tbl keeps when continuous rendering
+.SH Description
+A long table should not get spurious blank lines inserted into it when
+continuously rendering.
+.
+This arises from
+.IR tbl (1)
+using \[lq]keeps\[rq].
+.
+We do not need those when
+.B cR
+is set.
+.
+.TS
+l.
+'$(n=1; while [ $n -le 53 ]; do echo $n; n=$(( n + 1 )); done)'
+.TE'
+
+OUTPUT=$(printf "%s\n" "$EXAMPLE" | "$groff" -Tascii -P-cbou -t -man)
+test -n "$(echo "$OUTPUT" | sed -n '/52/{N;/53/p;}')"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_UE-breaks-before-long-URIs.sh b/tmac/tests/an_UE-breaks-before-long-URIs.sh
new file mode 100755
index 0000000..0b151fd
--- /dev/null
+++ b/tmac/tests/an_UE-breaks-before-long-URIs.sh
@@ -0,0 +1,68 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+input=$(cat <<EOF
+.TH ridonk 1 2021-10-31 "groff test suite"
+.SH Name
+ridonk \- check the typesetting of absurdly long URIs
+.SH Description
+.UR https://\:www\:.adobe\:.com/\:content/\:dam/\:acom/\:en/\:devnet/\:\
+actionscript/\:articles/\:5001\:.DSC_Spec\:.pdf
+Commerce
+.UE ,
+n.:
+A kind of transaction in which A plunders from B the goods of C,
+and for compensation B picks the pocket of D of money belonging to E.
+.P
+.UR https://1\:2\:3\:4\:5\:6\:7\:8\:9\:1\:1\:2\:3\:4\:5\:6\:7\:8\:9\:\
+2\:1\:2\:3\:4\:5\:6\:7\:8\:9\:3\:1\:2\:3\:4\:5\:6\:7\:8\:9\:4\:1\:2\:\
+3\:4\:5\:6\:7\:8\:9\:5\:1\:2\:3\:4\:5\:6\:7\:8\:9\:6\:1\:2\:3\:4\:5\:\
+6\:7\:8\:9\:7\:1\:2\:3\:4\:5\:6\:7\:8\:9\:8\:1\:2\:3\:4\:5\:6\:7\:8\:\
+9\:9\:1\:2\:3\:4\:5\:6\:7\:8\:9\:0
+.UE
+EOF
+)
+
+fail=
+
+wail () {
+ echo "...$* FAILED" >&2
+ fail=yes
+}
+
+output=$(printf "%s" "$input" | "$groff" -Tascii -P-cbou -man)
+echo "$output"
+error=$(printf "%s" "$input" \
+ | "$groff" -Tascii -P-cbou -man -ww -z 2>&1)
+
+echo "testing that no diagnostic messages are produced" >&2
+test -z "$error" || wail
+echo "testing that lines break where expected" >&2
+break1=$(echo "$output" | grep -x " *Commerce *<https.*devnet/")
+break2=$(echo "$output" | grep -x " *actionscript/.* transaction *in")
+break3=$(echo "$output" | grep -x " *<https.*612")
+test -n "$break1" || wail "first break"
+test -n "$break2" || wail "second break"
+test -n "$break3" || wail "third break"
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_UE-punct-hyphenates.sh b/tmac/tests/an_UE-punct-hyphenates.sh
new file mode 100755
index 0000000..e438078
--- /dev/null
+++ b/tmac/tests/an_UE-punct-hyphenates.sh
@@ -0,0 +1,53 @@
+#!/bin/sh
+#
+# Copyright (C) 2020, 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo ...FAILED >&2
+ fail=YES
+}
+
+input='.TH ue\-punct 1 2020-08-15 "groff test suite"
+.SH Name
+ue\-punct \- URL trailing material is subject to hyphenation
+.SH Description
+Do not try to
+.UR https://www.gnu.org/software/groff/
+hyphenate a ridiculous word* without machine assistance
+.UE (*pneumonoultramicroscopicsilicovolcanoconiosis).'
+
+# Turn off break warnings; we expect an adjustment problem.
+echo "testing hyphenation of trailing text by an.tmac's UE macro"
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -Wbreak -P-cbou -man)
+echo "$output"
+echo "$output" | grep -qE 'pn.*-'
+
+echo "testing hyphenation of trailing text by an-ext.tmac's UE macro"
+output=$(printf "%s\n" "$input" \
+ | "$groff" -rmG=0 -Tascii -Wbreak -P-cbou -man)
+echo "$output"
+echo "$output" | grep -qE 'pn.*-'
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_UR-body-hyphenates.sh b/tmac/tests/an_UR-body-hyphenates.sh
new file mode 100755
index 0000000..ecc57b6
--- /dev/null
+++ b/tmac/tests/an_UR-body-hyphenates.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+EXAMPLE='.TH ur\-body 1 2020-08-15 "groff test suite"
+.SH Name
+ur\-body \- URL link text is subject to hyphenation
+.SH Description
+Do not try to
+.UR https://www.gnu.org/software/groff/
+hyphenate the word
+pneumonoultramicroscopicsilicovolcanoconiosis
+without machine assistance
+.UE .'
+
+printf "%s\n" "$EXAMPLE" | "$groff" -Tascii -P-cbou -man \
+ | grep -qE 'pn.*-'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_UR-works.sh b/tmac/tests/an_UR-works.sh
new file mode 100755
index 0000000..6100e62
--- /dev/null
+++ b/tmac/tests/an_UR-works.sh
@@ -0,0 +1,86 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail() {
+ echo ...FAILED >&2
+ fail=yes
+}
+
+input='.TH foo 1 2022-11-22 "groff test suite"
+.SH Name
+foo \- frobnicate a bar
+.SH Description
+See
+.UR http://\:foo\:.example\:.com
+figure 1
+.UE .
+.
+Or
+.UR http://\:bar\:.example\:.com
+.UE .'
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -man -rU0)
+echo "$output"
+
+echo "checking formatting of web URI with link text" \
+ "(hyperlinks disabled)" >&2
+echo "$output" | grep -Fq 'See figure 1 <http://foo.example.com>.' \
+ || wail
+
+echo "checking formatting of web URI with no link text" \
+ "(hyperlinks disabled)" >&2
+echo "$output" | grep -Fq 'Or <http://bar.example.com>.' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -man -rU1)
+echo "$output"
+
+echo "checking formatting of web URI with link text" \
+ "(hyperlinks enabled)" >&2
+echo "$output" | grep -Fq 'See figure 1.' || wail
+
+echo "checking formatting of web URI with no link text" \
+ "(hyperlinks enabled)" >&2
+echo "$output" | grep -Fq 'Or http://bar.example.com.' || wail
+
+input='.TH foo 1 2022-12-04 "groff test suite"
+.SH Name
+foo \- frobnicate a bar
+.SH "See also"
+For our SOSP presentation,
+check our
+.UR https://\:example\:.com
+website
+.UE .'
+
+output=$(printf "%s\n" "$input" | "$groff" -man -Thtml)
+echo "$output"
+
+echo "checking HTML output of web URI" >&2
+echo "$output" \
+ | grep -Fqx '<a href="https://example.com">website</a>.</p>' \
+ || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_X-register-works.sh b/tmac/tests/an_X-register-works.sh
new file mode 100755
index 0000000..9db3272
--- /dev/null
+++ b/tmac/tests/an_X-register-works.sh
@@ -0,0 +1,62 @@
+#!/bin/sh
+#
+# Copyright (C) 2020-2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Ensure the X register takes effect on the right page and looks right.
+
+INPUT='.TH foo 1 2021-05-19 "groff foo test suite"
+.TH bar 1 2021-05-19 "groff bar test suite"'
+
+FAIL=
+
+OUTPUT=$(printf "%s\n" "$INPUT" \
+ | "$groff" -Tascii -P-cbou -rcR=0 -rC1 -rX1 -man)
+
+if ! echo "$OUTPUT" | grep -Eqx 'groff foo test suite +2021-05-19 +1'
+then
+ FAIL=yes
+ echo "first page footer test failed" >&2
+fi
+
+if ! echo "$OUTPUT" | grep -Eqx 'groff bar test suite +2021-05-19 +1a'
+then
+ FAIL=yes
+ echo "second page footer test failed" >&2
+fi
+
+INPUT='.TH baz 1 2021-05-19 "groff baz test suite"
+.SH Name
+baz \- neglect third stepchild
+.SH Description
+This program is the lowly third in line.'
+
+OUTPUT=$(printf "%s\n" "$INPUT" \
+ | "$groff" -Thtml -rcR=0 -rC1 -rX1 -man)
+
+if echo "$OUTPUT" | grep -q 'groff baz test suite'
+then
+ FAIL=yes
+ echo "HTML output unexpectedly contains footer text" >&2
+fi
+
+test -z "$FAIL"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_adjust-link-text-correctly.sh b/tmac/tests/an_adjust-link-text-correctly.sh
new file mode 100755
index 0000000..da3359d
--- /dev/null
+++ b/tmac/tests/an_adjust-link-text-correctly.sh
@@ -0,0 +1,40 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Ensure that link text (when the hyperlink itself is not formatted
+# because the device supports hyperlinking) uses the correct line length
+# and is adjusted.
+
+input='.TH foo 1 2022-11-08 "groff test suite"
+.SH "See also"
+.
+.UR http://\:www\:.hp\:.com/\:ctg/\:Manual/\:bpl13210\:.pdf
+.I HP PCL/PJL Reference:
+.I PCL\~5 Printer Language Technical Reference Manual,
+.I Part I
+.UE'
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -man -rU1)
+echo "$output"
+echo "$output" | grep -q 'HP PCL/PJL Reference:.*Reference Manu-'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_avoid-two-font-denial-of-service.sh b/tmac/tests/an_avoid-two-font-denial-of-service.sh
new file mode 100755
index 0000000..2ba1822
--- /dev/null
+++ b/tmac/tests/an_avoid-two-font-denial-of-service.sh
@@ -0,0 +1,36 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# That's six pairs of parentheses below.
+"$groff" -Tascii -P-cbou -man <<EOF | grep -q '( ) ( ) ( ) ( ) ( ) ( )'
+.TH sample 1 2020-09-16 "groff test suite"
+.SH Name
+sample \- test subject for groff
+.PP
+Don't DoS me, bro!
+.BI ( \\ )
+.BR ( \\ )
+.IB ( \\ )
+.IR ( \\ )
+.RB ( \\ )
+.RI ( \\ )
+EOF
diff --git a/tmac/tests/an_do-not-abbreviate-escape-using-TH-arguments.sh b/tmac/tests/an_do-not-abbreviate-escape-using-TH-arguments.sh
new file mode 100755
index 0000000..fd50211
--- /dev/null
+++ b/tmac/tests/an_do-not-abbreviate-escape-using-TH-arguments.sh
@@ -0,0 +1,51 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savanah #62257.
+#
+# Do not attempt to abbreviate page titles or inner footers (the 4th
+# argument to `TH` that contain non-trivial escape sequences. See
+# Savannah #62264 for why doing so is difficult.
+
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ fail=yes
+}
+
+input='.TH f\-b 1 2022-04-08 "Bletcherous Glorfinking Dungr'\
+'\[u ad]ndel Hoppabotch Greebstank 2.21"'
+
+# The u with dieresis will not be output on the 'ascii' device.
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -man)
+
+echo "checking that title with escaped hyphen-minus is preserved" >&2
+echo "$output" | grep -q '^f-b(1)' || wail
+
+pattern='Bletcherous Glorfinking Dungrndel 2022-04-08 Greebstank 2.21'
+pattern="$pattern f-b(1)" # 12 spaces
+echo "checking for insanely long 4th TH argument" >&2
+echo "$output" | grep -Fqx "$pattern" || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_font-remapping-does-not-affect-titles.sh b/tmac/tests/an_font-remapping-does-not-affect-titles.sh
new file mode 100755
index 0000000..3332cc1
--- /dev/null
+++ b/tmac/tests/an_font-remapping-does-not-affect-titles.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #61279.
+#
+# If a SH or SS (sub)section heading was about to be output at the
+# bottom of a page but wasn't because of the vertical space .ne-eded,
+# we want to ensure that font remapping for the headings doesn't affect
+# page footers and headers.
+
+# Keep preconv from being run.
+unset GROFF_ENCODING
+
+input='.TH \\fIfoo\\fP 1 2021-10-04 "groff test suite"
+.SH Name
+foo \\- a command with a very short name
+.sp 50v
+.SH "\\fIgroff\\fP integration"
+A complicated situation.'
+
+output=$(echo "$input" | "$groff" -Tascii -man -rcR=0)
+echo "$output"
+output=$(echo "$input" | "$groff" -Tascii -man -rcR=0 -Z | nl)
+echo "$output"
+
+# Expected:
+# 74 V2640
+# 75 p2
+# 76 x font 2 I
+# 77 f2
+# 78 s10
+# 79 V160
+# 80 H0
+# 81 tfoo
+# 82 x font 1 R
+# 83 f1
+# 84 t(1)
+
+echo "$output" | grep -E '77[[:space:]]+f2'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_handle-degenerate-input-quietly.sh b/tmac/tests/an_handle-degenerate-input-quietly.sh
new file mode 100755
index 0000000..a8df013
--- /dev/null
+++ b/tmac/tests/an_handle-degenerate-input-quietly.sh
@@ -0,0 +1,29 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #61402.
+#
+# Don't spew a lot of diagnostics if we have only empty lines as input.
+
+test -z "$(echo | "$groff" -man -ww -Tascii -P-cbou 2>&1 > /dev/null)"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_inner-footer-abbreviation-works.sh b/tmac/tests/an_inner-footer-abbreviation-works.sh
new file mode 100755
index 0000000..2d16b7d
--- /dev/null
+++ b/tmac/tests/an_inner-footer-abbreviation-works.sh
@@ -0,0 +1,70 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #61386.
+#
+# Excessively long "extra2" arguments to 'TH' (we recommend using this
+# for project name and version information) can overrun other parts of
+# the titles, such as a date in the center footer.
+
+FAIL=
+
+INPUT='.TH foo 1 2021-10-26 "groff 1.23.0.rc1.1449-84949"
+.SH Name
+foo \- a command with a very short name'
+
+echo 'testing long inner footer with sufficient space to set it' >&2
+OUTPUT=$(echo "$INPUT" | "$groff" -Tascii -P-cbou -man)
+PATTERN='groff 1\.23\.0\.rc1\.1449-84949 +2021-10-26 +foo\(1\)'
+
+if ! echo "$OUTPUT" | grep -Eq "$PATTERN"
+then
+ FAIL=yes
+ echo "...FAILED" >&2
+fi
+
+echo 'testing long inner footer with insufficient space to set it' >&2
+OUTPUT=$(echo "$INPUT" | "$groff" -Tascii -P-cbou -man -rLL=60n)
+PATTERN='groff 1\.23\.0\.rc1\.1449\.\.\. +2021-10-26 +foo\(1\)'
+
+if ! echo "$OUTPUT" | grep -Eq "$PATTERN"
+then
+ FAIL=yes
+ echo "...FAILED" >&2
+fi
+
+# Regression-test Savannah #61408.
+#
+# Don't spew diagnostics if the page doesn't supply a 3rd .TH argument.
+echo 'testing for graceful behavior when TH has no 3rd argument' >&2
+INPUT='.TH patch 1 "" GNU'
+OUTPUT=$(echo "$INPUT" | "$groff" -Tascii -P-cbou -man -ww -z 2>&1)
+
+if [ -n "$OUTPUT" ]
+then
+ FAIL=yes
+ echo "...FAILED" >&2
+fi
+
+test -z "$FAIL"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_link-macros-work-in-paragraph-tags.sh b/tmac/tests/an_link-macros-work-in-paragraph-tags.sh
new file mode 100755
index 0000000..c5aee64
--- /dev/null
+++ b/tmac/tests/an_link-macros-work-in-paragraph-tags.sh
@@ -0,0 +1,88 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+input=$(cat <<EOF
+.TH foo 1 2021-11-05 "groff test suite"
+.TP
+.UR https://\:github.com/\:Alhadis/\:Roff\:.js/
+.I Roff.js
+.UE
+is a viewer for intermediate output written in JavaScript.
+EOF
+)
+
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ fail=YES
+}
+
+# Check for regressions when OSC 8 disabled
+uflag=-rU0
+
+output=$(printf "%s" "$input" \
+ | "$groff" -bww -Tascii -P-cbou $uflag -man)
+
+echo "checking for paragraph tag on line by itself ($uflag)" >&2
+echo "$output" | grep -qx ' Roff\.js' || wail # 7 spaces
+
+echo "checking for presence of typeset URI ($uflag)" >&2
+echo "$output" \
+ | grep -q '^ <https://github\.com/Alhadis/Roff\.js/>' \
+ || wail # 14 spaces
+
+output=$(printf "%s" "$input" \
+ | "$groff" -bww -Tascii -P-cbou -rU0 -rLL=130n -man)
+
+# Sloppy handling of UE, ME macro arguments can cause unwanted space.
+echo "checking for normative (no extra) spacing after URI ($uflag)" >&2
+echo "$output" | grep -q '> is a viewer for intermediate' || wail
+
+# Now check for good formatting when URIs are hyperlinked.
+uflag=-rU1
+
+output=$(printf "%s" "$input" \
+ | "$groff" -bww -Tutf8 -P-cbou $uflag -man)
+
+echo "checking for paragraph tag on line by itself ($uflag)" >&2
+echo "$output" | grep -qx ' Roff\.js' || wail # 7 spaces
+
+# Hyperlinking paragraph tags was not supported in groff 1.22.4 and
+# still isn't.
+#echo "checking for absence of typeset URI" >&2
+#! echo "$output" | grep -q https || wail
+
+output=$(printf "%s" "$input" \
+ | "$groff" -bww -Tascii -P-cbou $uflag -rLL=130n -man)
+
+echo "checking for normative (no extra) spacing after URI ($uflag)" >&2
+# This is what we expect when linking the tag works.
+#echo "$output" \
+# | grep -q '^ is a viewer for intermediate' \
+# || wail # 14 spaces
+# ...but in the meantime...
+echo "$output" | grep -q '[^[:space:]] is a viewer for' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_link-trailing-text-hugs-previous.sh b/tmac/tests/an_link-trailing-text-hugs-previous.sh
new file mode 100755
index 0000000..e3e5a1d
--- /dev/null
+++ b/tmac/tests/an_link-trailing-text-hugs-previous.sh
@@ -0,0 +1,52 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ fail=YES
+}
+
+input='.TH foo 1 2022-12-04 "groff test suite"
+.SH Name
+foo \- frobnicate a bar
+.SH Authors
+.I foo
+was written by
+.MT jp@\:example\:.com
+J.\& Ponderous
+.ME (deceased).'
+
+output=$(printf "%s\n" "$input" | "$groff" -rU0 -man -Tascii -P-cbou)
+echo "$output"
+echo "checking that trailing text hugs link URI (-rU0)"
+echo "$output" | grep -q '\.com>(deceased)\.$' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -rU1 -man -Tascii -P-cbou)
+echo "$output" | od -c
+echo "checking that trailing text hugs link text (-rU1)"
+echo "$output" | grep -q 'Ponderous(deceased).$' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_no-break-after-short-paragraph-tags.sh b/tmac/tests/an_no-break-after-short-paragraph-tags.sh
new file mode 100755
index 0000000..0d75f9c
--- /dev/null
+++ b/tmac/tests/an_no-break-after-short-paragraph-tags.sh
@@ -0,0 +1,43 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #60624.
+#
+# A page break should not follow the tag in a tagged paragraph when the
+# tag can fit within the indentation.
+
+FAIL=
+
+INPUT='.TH foo 1 2021-05-18 "groff test suite"
+.SH Name
+foo \- frobnicate a thingamajig
+.rs \" force spacing on
+.sp 50
+.TP
+3
+7th edition'
+
+OUTPUT=$(echo "$INPUT" | "$groff" -Tascii -P-cbou -man -rcR=0)
+
+echo "$OUTPUT" | grep -Eqx ' +3 +7th edition'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_output-footer-when-continuously-rendering.sh b/tmac/tests/an_output-footer-when-continuously-rendering.sh
new file mode 100755
index 0000000..4cf476b
--- /dev/null
+++ b/tmac/tests/an_output-footer-when-continuously-rendering.sh
@@ -0,0 +1,41 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Ensure that the page footer is printed even when a pending output line
+# is 1v from the page bottom. (A page ejection inside an end of input
+# trap exits the formatter.)
+
+input='.TH foo 1 2022-11-02 "groff test suite"
+.SH Name
+foo \\- frobnicate a bar
+.SH Description
+.rs
+.sp 60v
+line 61
+.br
+line 62'
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -man)
+echo "$output"
+echo "$output" | grep -Eqx 'groff test suite +2022-11-02 +foo\(1\)'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_page-footers-present.sh b/tmac/tests/an_page-footers-present.sh
new file mode 100755
index 0000000..2ce1650
--- /dev/null
+++ b/tmac/tests/an_page-footers-present.sh
@@ -0,0 +1,68 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #60609.
+
+INPUT='.TH foo 1 2021-05-16 "groff test suite" "Volume 1"
+.SH Name
+foo \- a frobnicating thing
+.TH bar 1 2021-05-16 "groff test suite" "Volume 2"
+.SH Name
+bar \- a wretched hive of scum and villainy'
+
+OUTPUT=$(echo "$INPUT" | "$groff" -Tascii -P-cbou -man)
+
+FAIL=
+
+if ! echo "$OUTPUT" | grep -Eqx 'groff test suite +2021-05-16 +foo\(1\)'
+then
+ FAIL=yes
+ echo "first page footer test failed (continuous rendering on)" >&2
+fi
+
+if ! echo "$OUTPUT" | grep -Eqx 'groff test suite +2021-05-16 +bar\(1\)'
+then
+ FAIL=yes
+ echo "second page footer test failed (continuous rendering on)" >&2
+fi
+
+OUTPUT=$(echo "$INPUT" | "$groff" -Tascii -P-cbou -man -rcR=0)
+
+if ! echo "$OUTPUT" | grep -Eqx 'groff test suite +2021-05-16 +1'
+then
+ FAIL=yes
+ echo "first page footer test failed (continuous rendering off)" >&2
+fi
+
+OUTPUT=$(echo "$INPUT" | "$groff" -Tascii -P-cbou -man -rcR=0 -rC1)
+
+if ! echo "$OUTPUT" | sed '1,/^groff test suite/d' \
+ | grep -Eqx 'groff test suite +2021-05-16 +2'
+then
+ FAIL=yes
+ echo "second page footer test failed (continuous rendering off," \
+ " cotinuous numbering on)" >&2
+fi
+
+test -z "$FAIL"
+
+# vim:set ai et sw=4 ts=4 tw=80:
diff --git a/tmac/tests/an_page-header-has-current-data.sh b/tmac/tests/an_page-header-has-current-data.sh
new file mode 100755
index 0000000..90e3b59
--- /dev/null
+++ b/tmac/tests/an_page-header-has-current-data.sh
@@ -0,0 +1,70 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Misconfiguration of traps or our man(7) implementation's page-flushing macros,
+# or poor ordering of logic in its TH macro, can cause page headers to render
+# with incorrect information.
+
+INPUT='.TH foo 1 2021-05-16 "groff test suite" "Volume 1"
+.SH Name
+foo \- a frobnicating thing
+.TH bar 1 2021-05-16 "groff test suite" "Volume 2"
+.SH Name
+bar \- a wretched hive of scum and villainy'
+
+OUTPUT=$(echo "$INPUT" | "$groff" -Tascii -P-cbou -man)
+echo "$OUTPUT"
+
+FAIL=
+
+if ! echo "$OUTPUT" | grep -Eqx 'foo\(1\) +Volume 1 +foo\(1\)'
+then
+ FAIL=yes
+ echo "first page header test failed (continuous rendering on)" >&2
+fi
+
+if ! echo "$OUTPUT" | sed '1,/^groff test suite/d' \
+ | grep -Eqx 'bar\(1\) +Volume 2 +bar\(1\)'
+then
+ FAIL=yes
+ echo "second page header test failed (continuous rendering on)" >&2
+fi
+
+OUTPUT=$(echo "$INPUT" | "$groff" -Tascii -P-cbou -man -rcR=0)
+echo "$OUTPUT"
+
+if ! echo "$OUTPUT" | grep -Eqx 'foo\(1\) +Volume 1 +foo\(1\)'
+then
+ FAIL=yes
+ echo "first page header test failed (continuous rendering off)" >&2
+fi
+
+if ! echo "$OUTPUT" | sed '1,/^groff test suite/d' \
+ | grep -Eqx 'bar\(1\) +Volume 2 +bar\(1\)'
+then
+ FAIL=yes
+ echo "second page header test failed (continuous rendering off)" >&2
+fi
+
+test -z "$FAIL"
+
+# vim:set ai et sw=4 ts=4 tw=80:
diff --git a/tmac/tests/an_reset-hyphenation-correctly.sh b/tmac/tests/an_reset-hyphenation-correctly.sh
new file mode 100755
index 0000000..7191419
--- /dev/null
+++ b/tmac/tests/an_reset-hyphenation-correctly.sh
@@ -0,0 +1,63 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Fix problem observed while implementing Savannah #61734. Using a
+# hyphenation of "en" (English) with the hyphenation mode for Swedish
+# produces bad breaks.
+
+input='.TH foo 1 2022-02-21 "groff test suite"
+xx
+glyph
+glyph
+glyph
+glyph
+glyph
+glyph
+glyph
+glyph
+glyph
+glyph
+glyph
+glyph
+glyph
+glyph
+'
+
+fail=
+
+wail () {
+ echo "...$* FAILED" >&2
+ fail=yes
+}
+
+echo "checking continuous rendering mode" >&2
+output=$(printf "%s" "$input" \
+ | "$groff" -Tascii -P-cbou -man -msv -men)
+echo "$output" | grep -q 'g-$' && wail
+
+echo "checking discontinuous (paginated) rendering mode" >&2
+output=$(printf "%s" "$input" \
+ | "$groff" -Tascii -P-cbou -man -rcR=0 -msv -men)
+echo "$output" | grep -q 'g-$' && wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_title-abbreviation-works.sh b/tmac/tests/an_title-abbreviation-works.sh
new file mode 100755
index 0000000..86ec8d1
--- /dev/null
+++ b/tmac/tests/an_title-abbreviation-works.sh
@@ -0,0 +1,61 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #43532.
+#
+# Excessively long man page titles can overrun other parts of the titles
+# (headers and footers). Verify abbreviation of ones that would.
+
+FAIL=
+
+INPUT='.TH foo 1 2021-05-31 "groff test suite"
+.SH Name
+foo \- a command with a very short name'
+
+OUTPUT=$(echo "$INPUT" | "$groff" -Tascii -P-cbou -man)
+
+if ! echo "$OUTPUT" \
+ | grep -Eq 'foo\(1\) +General Commands Manual +foo\(1\)'
+then
+ FAIL=yes
+ echo "short page title test failed" >&2
+fi
+
+INPUT='.TH CosNotifyChannelAdmin_StructuredProxyPushSupplier 3erl \
+2021-05-31 "groff test suite" "Erlang Module Definition"
+.SH Name
+CosNotifyChannelAdmin_StructuredProxyPushSupplier \- OMFG'
+
+OUTPUT=$(echo "$INPUT" | "$groff" -Tascii -P-cbou -man)
+
+TITLE_ABBV="CosNotif...hSupplier(3erl)"
+PATTERN="$TITLE_ABBV Erlang Module Definition $TITLE_ABBV"
+
+if ! echo "$OUTPUT" | grep -Fq "$PATTERN"
+then
+ FAIL=yes
+ echo "long page title test failed" >&2
+fi
+
+test -z "$FAIL"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_use-input-traps-correctly.sh b/tmac/tests/an_use-input-traps-correctly.sh
new file mode 100755
index 0000000..4ad76e6
--- /dev/null
+++ b/tmac/tests/an_use-input-traps-correctly.sh
@@ -0,0 +1,113 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ fail=YES
+}
+
+# Ensure that input trap-using macros employ the correct request. B, I,
+# SH, SS, SM, and SB need `it`; TP needs `itc`.
+
+# B
+
+input=".TH foo 1 2022-06-07 \"groff test suite\"
+.B \\\\n[.fn]\c
+\\n[.fn]"
+
+output=$(printf "%s\n" "$input" | "$groff" -man -Tascii -P-cbou 2>&1)
+
+echo "checking that B macro uses correct input trap 'it'" >&2
+echo "$output" | grep -Fqx 'BR' || wail
+
+# I
+
+input=".TH foo 1 2022-06-07 \"groff test suite\"
+.I \\\\n[.fn]\c
+\\n[.fn]"
+
+output=$(printf "%s\n" "$input" | "$groff" -man -Tascii -P-cbou 2>&1)
+
+echo "checking that I macro uses correct input trap 'it'" >&2
+echo "$output" | grep -Fqx 'IR' || wail
+
+# SH
+
+input=".TH foo 1 2022-06-07 \"groff test suite\"
+.SH Name\c
+foo \- frobnicate a bar"
+
+output=$(printf "%s\n" "$input" | "$groff" -man -Tascii -P-cbou 2>&1)
+
+echo "checking that SH macro uses correct input trap 'it'" >&2
+echo "$output" | grep -Fqx 'Name' || wail
+
+# SS
+
+input=".TH foo 1 2022-06-07 \"groff test suite\"
+.SS Limitations\c
+Lorem ipsum gitsum voluptatem."
+
+output=$(printf "%s\n" "$input" | "$groff" -man -Tascii -P-cbou 2>&1)
+
+echo "checking that SS macro uses correct input trap 'it'" >&2
+echo "$output" | grep -Fqx ' Limitations' || wail # 3 spaces
+
+# SM
+
+input=".TH foo 1 2022-06-07 \"groff test suite\"
+.SM \\\\n[.s]\c
+\\n[.s]"
+
+output=$(printf "%s\n" "$input" | "$groff" -man -a -Tps 2>&1)
+
+echo "checking that SM macro uses correct input trap 'it'" >&2
+echo "$output" | grep -Fqx '910' || wail
+
+# SB
+
+input=".TH foo 1 2022-06-07 \"groff test suite\"
+.SB \\\\n[.fn]\\\\n[.s]\c
+\\n[.fn]\\n[.s]"
+
+output=$(printf "%s\n" "$input" | "$groff" -man -a -Tps 2>&1)
+
+echo "checking that SB macro uses correct input trap 'it'" >&2
+echo "$output" | grep -Fqx 'TB9TR10' || wail
+
+# TP
+
+input=".TH foo 1 2022-06-07 \"groff test suite\"
+.TP
+.BR \-\-bar [ =\c
+.IR baz ]"
+
+output=$(printf "%s\n" "$input" | "$groff" -man -Tascii -P-cbou 2>&1)
+
+echo "checking that TP macro uses correct input trap 'itc'" >&2
+echo "$output" | grep -Fqx ' --bar[=baz]' || wail # 7 spaces
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/an_works-with-ec.sh b/tmac/tests/an_works-with-ec.sh
new file mode 100755
index 0000000..2ddb8e8
--- /dev/null
+++ b/tmac/tests/an_works-with-ec.sh
@@ -0,0 +1,40 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #63194. Use of '-man -mec -Tdvi' should not
+# make the italic font unavailable in ordinary text.
+#
+# The per mille sign is available only in the EC fonts, so if we
+# failed to switch them in, we'll get an undefined special character
+# warning.
+
+input=$(
+ printf '.TH foo 1 2022-10-10 "groff test suite"\n';
+ printf '.SH N\\['"'"'E]V \\f[BI]groff\\f[] \\fBGNU\\fP\n';
+ printf 'foo \\- \\[%%0]\\fIgroff\n';
+)
+
+output=$(printf "%s\n" "$input" | "$groff" -man -mec -Tdvi -z 2>&1)
+echo "$output"
+test -z "$output"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/andoc_P-register-works.sh b/tmac/tests/andoc_P-register-works.sh
new file mode 100755
index 0000000..e4e8f77
--- /dev/null
+++ b/tmac/tests/andoc_P-register-works.sh
@@ -0,0 +1,117 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ fail=YES
+}
+
+# Test going back and forth from man(7) to mdoc(7).
+
+input='.TH foo 1 2022-12-11 "groff test suite"
+.SH Name
+foo \- frobinicate a bar
+.bp
+.SH Description
+It took a while to get here.
+.Dd 2022-12-11
+.Dt bar 1
+.Os "groff test suite"
+.Sh Name
+.Nm bar
+.Nd erect something for people to walk into
+.bp
+.Sh Description
+It took a while to get here.
+.TH baz 7 2022-12-11 "groff test suite"
+.SH Name
+baz \- what they do not play at Mos Eisley spaceport cantina
+.bp
+.SH Description
+It took a while to get here.'
+
+# First, check without continuous numbering. Each page starts at P.
+
+output=$(printf "%s\n" "$input" | "$groff" -rcR=0 -rP13 -mandoc \
+ -Tascii -P-cbou)
+echo "$output"
+
+echo "checking first document, first page footer (discontinuous)" >&2
+echo "$output" | grep -En "^groff test suite +2022-12-11 +13$" \
+ | grep '^64:' || wail
+
+echo "checking first document, second page footer (discontinuous)" >&2
+echo "$output" | grep -En "^groff test suite +2022-12-11 +14$" \
+ | grep '^130:' || wail
+
+echo "checking second document, first page footer (discontinuous)" >&2
+echo "$output" | grep -En "^groff test suite +2022-12-11 +13$" \
+ | grep '^196:' || wail
+
+echo "checking second document, second page footer (discontinuous)" >&2
+echo "$output" | grep -En "^groff test suite +2022-12-11 +14$" \
+ | grep '^262:' || wail
+
+echo "checking third document, first page footer (discontinuous)" >&2
+echo "$output" | grep -En "^groff test suite +2022-12-11 +13$" \
+ | grep '^328:' || wail
+
+echo "checking third document, second page footer (discontinuous)" >&2
+echo "$output" | grep -En "^groff test suite +2022-12-11 +14$" \
+ | grep '^394:' || wail
+
+# Now, check _with_ continuous numbering. Only the first page is
+# numbered P.
+
+output=$(printf "%s\n" "$input" | "$groff" -rcR=0 -rC1 -rP13 -mandoc \
+ -Tascii -P-cbou)
+echo "$output"
+
+echo "checking first document, first page footer (continuous)" >&2
+echo "$output" | grep -En "^groff test suite +2022-12-11 +13$" \
+ | grep '^64:' || wail
+
+echo "checking first document, second page footer (continuous)" >&2
+echo "$output" | grep -En "^groff test suite +2022-12-11 +14$" \
+ | grep '^130:' || wail
+
+echo "checking second document, first page footer (continuous)" >&2
+echo "$output" | grep -En "^groff test suite +2022-12-11 +15$" \
+ | grep '^196:' || wail
+
+echo "checking second document, second page footer (continuous)" >&2
+echo "$output" | grep -En "^groff test suite +2022-12-11 +16$" \
+ | grep '^262:' || wail
+
+echo "checking third document, first page footer (continuous)" >&2
+echo "$output" | grep -En "^groff test suite +2022-12-11 +17$" \
+ | grep '^328:' || wail
+
+echo "checking third document, second page footer (continuous)" >&2
+echo "$output" | grep -En "^groff test suite +2022-12-11 +18$" \
+ | grep '^394:' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/andoc_check-an-to-doc-transition.sh b/tmac/tests/andoc_check-an-to-doc-transition.sh
new file mode 100755
index 0000000..42dc2ee
--- /dev/null
+++ b/tmac/tests/andoc_check-an-to-doc-transition.sh
@@ -0,0 +1,68 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ fail=YES
+}
+
+input='.TH foo 1 2022-12-11 "groff test suite"
+.SH Name
+foo \- frobinicate a bar
+.Dd 2022-12-11
+.Dt bar 1
+.Os "groff test suite"
+.Sh Name
+.Nm bar
+.Nd erect a thing to be walked into'
+
+output=$(printf "%s\n" "$input" | "$groff" -mandoc -Tascii -P-cbou)
+echo "$output"
+
+echo "checking for one foo(1) header" >&2
+test $(echo "$output" \
+ | grep -Ec "foo\(1\) +General Commands Manual +foo\(1\)") \
+ -eq 1 || fail
+
+echo "checking for one foo(1) footer" >&2
+test $(echo "$output" \
+ | grep -Ec "groff test suite +2022-12-11 +foo\(1\)") -eq 1 \
+ || fail
+
+echo "checking for one bar(1) header" >&2
+test $(echo "$output" \
+ | grep -Ec "bar\(1\) +General Commands Manual +bar\(1\)") \
+ -eq 1 || fail
+
+echo "checking for one bar(1) barter" >&2
+test $(echo "$output" \
+ | grep -Ec "groff test suite +2022-12-11 +bar\(1\)") -eq 1 \
+ || fail
+
+echo "checking for uninitialized header and footer fields"
+echo "$output" | grep -E "(UNTITLED|UNDATED|LOCAL)" && fail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/andoc_clear-doc-traps.sh b/tmac/tests/andoc_clear-doc-traps.sh
new file mode 100755
index 0000000..9a754e6
--- /dev/null
+++ b/tmac/tests/andoc_clear-doc-traps.sh
@@ -0,0 +1,47 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #59246.
+#
+# andoc should remove mdoc(7) traps before rendering a man(7) page.
+# Continuous rendering has to be _off_ to catch this.
+
+EXAMPLE=\
+'.Dd October 11, 2020
+.Dt mdoc\-test 7
+.Os
+.Sh Name
+.Nm mdoc\-test
+.Nd lay mine
+.Sh Description
+Just testing.
+.TH man\-test 7 2020-10-11
+.SH Name
+man-test \- drive sheep across minefield
+.SH Description
+\[lq]doc\-footer\[rq] should definitely not be sprung by this document.'
+
+! printf "%s\n" "$EXAMPLE" \
+ | "$groff" -Tascii -P-cbou -mandoc -rcR=0 \
+ | grep -E '^BSD +October 11, 2020 +3$'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/andoc_flush-between-packages.sh b/tmac/tests/andoc_flush-between-packages.sh
new file mode 100755
index 0000000..6b24f84
--- /dev/null
+++ b/tmac/tests/andoc_flush-between-packages.sh
@@ -0,0 +1,77 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #59016.
+#
+# Ensure that a partially-collected line at the end of a file gets
+# flushed, and page footers written, before proceeding to the next
+# document. Check going from man(7) to mdoc(7) documents and back.
+
+EXAMPLE=\
+'.TH man\-flush\-test 7 2020-10-11 "groff test page 1"
+.SH Name
+man\-flush-test \- a sanity test for groff_man(7)
+.SH Description
+This gratuitously loquacious sentence should end up with a
+partially-collected output line.
+.Dd October 11, 2020
+.Dt mdoc\-test 7
+.Os "groff test page 2"
+.Sh Name
+.Nm mdoc\-test
+.Nd a sanity test for groff_mdoc(7)
+.Sh Description
+This additional gratuitously loquacious sentence should end up with a
+partially-collected output line.
+.TH man\-flush\-test2 7 2020-10-11 "groff test page 3"
+.SH Name
+man\-flush-test2 \- a second sanity test for groff_man(7)
+.SH Description
+This supernumerary loquacious sentence should end up with a
+partially-collected output line.'
+
+OUTPUT=$(printf "%s\n" "$EXAMPLE" | "$groff" -Tascii -P-cbou -mandoc)
+
+FAIL=
+
+# Strip blank lines from the output first; all we care about for this
+# test is the presence, adjacency, and ordering of non-blank lines.
+
+if [ -z "$(echo "$OUTPUT" \
+ | sed '/^$/d' \
+ | sed -n '/collected/{N;/test page 1/p;}')" ]
+then
+ FAIL=yes
+ echo "man to mdoc transition failed" >&2
+fi
+
+if [ -z "$(echo "$OUTPUT" \
+ | sed '/^$/d' \
+ | sed -n '/partially-collected/{N;/test page 2/p;}')" ]
+then
+ FAIL=yes
+ echo "mdoc to man transition failed" >&2
+fi
+
+test -z "$FAIL"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/doc_CS-works.sh b/tmac/tests/doc_CS-works.sh
new file mode 100755
index 0000000..dfcc0f0
--- /dev/null
+++ b/tmac/tests/doc_CS-works.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+DOCUMENT=\
+'.Dd 2020-10-31
+.Dt sample 1
+.Os
+.Sh Name
+.Nm sample
+.Nd test subject for groff'
+
+echo "testing -rCS=0" >&2
+echo "$DOCUMENT" | "$groff" -rCS=0 -Tascii -P-cbou -mdoc \
+ | grep -q Name || exit 1
+
+echo "testing -rCS=1" >&2
+echo "$DOCUMENT" | "$groff" -rCS=1 -Tascii -P-cbou -mdoc \
+ | grep -q NAME || exit 1
+
+echo "testing default (no -rCS argument)" >&2
+echo "$DOCUMENT" | "$groff" -Tascii -P-cbou -mdoc \
+ | grep -q Name || exit 1
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/doc_CT-works.sh b/tmac/tests/doc_CT-works.sh
new file mode 100755
index 0000000..04c4db7
--- /dev/null
+++ b/tmac/tests/doc_CT-works.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+DOCUMENT=\
+'.Dd 2020-10-31
+.Dt sample 1
+.Os
+.Sh Name
+.Nm sample
+.Nd test subject for groff'
+
+echo "testing -rCT=0" >&2
+echo "$DOCUMENT" | "$groff" -rCT=0 -Tascii -P-cbou -mdoc \
+ | grep -q 'sample(1)' || exit 1
+
+echo "testing -rCT=1" >&2
+echo "$DOCUMENT" | "$groff" -rCT=1 -Tascii -P-cbou -mdoc \
+ | grep -q 'SAMPLE(1)' || exit 1
+
+echo "testing default (no -rCT argument)" >&2
+echo "$DOCUMENT" | "$groff" -Tascii -P-cbou -mdoc \
+ | grep -q 'sample(1)' || exit 1
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/doc_D-places-page-numbers-correctly.sh b/tmac/tests/doc_D-places-page-numbers-correctly.sh
new file mode 100755
index 0000000..15e377f
--- /dev/null
+++ b/tmac/tests/doc_D-places-page-numbers-correctly.sh
@@ -0,0 +1,45 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+DOCUMENT=\
+'.Dd 2020-11-17
+.Dt sample 1
+.Os "groff test suite"
+.Sh Name
+.Nm sample
+.Nd test subject for groff
+.bp
+.Sh Description
+This program does many things.'
+
+# Regression-test Debian #919890.
+#
+# Put page numbers in the correct places when double-sided rendering.
+
+echo "confirming page number on right on recto (odd-numbered) pages" >&2
+echo "$DOCUMENT" | "$groff" -rcR=0 -rD1 -Tascii -P-cbou -mdoc \
+ | grep -q '^groff test suite *2020-11-17 *1$' || exit 1
+
+echo "confirming page number on left on verso (even-numbered) pages" >&2
+echo "$DOCUMENT" | "$groff" -rcR=0 -rD1 -Tascii -P-cbou -mdoc \
+ | grep -q '^2 *2020-11-17 *groff test suite$' || exit 1
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/doc_Lk-respect-sentence-ending-punctuation.sh b/tmac/tests/doc_Lk-respect-sentence-ending-punctuation.sh
new file mode 100755
index 0000000..7f2cc22
--- /dev/null
+++ b/tmac/tests/doc_Lk-respect-sentence-ending-punctuation.sh
@@ -0,0 +1,40 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #59738. The processing of arguments after
+# the link text should not break end-of-sentence detection.
+
+input='.Dd 2022-09-15
+.Dt foo 1
+.Os "groff test suite"
+.Sh Name
+.Nm foo
+.Nd frobnicate a bar
+.Sh Description
+Click
+.Lk http://example.com here .
+Follow instructions.'
+
+output=$(echo "$input" | "$groff" -Tascii -P-cbou -mdoc)
+echo "$output" | grep -Fq 'com. Follow' # 2 spaces
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/doc_Mt-works.sh b/tmac/tests/doc_Mt-works.sh
new file mode 100755
index 0000000..d779084
--- /dev/null
+++ b/tmac/tests/doc_Mt-works.sh
@@ -0,0 +1,48 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+set -e
+
+# Regression-test Savannah #60025.
+#
+# Ensure .Mt renders correctly.
+
+input='.Dd 2021-02-10
+.Dt mandoc 1
+.Os groff test suite
+.Sh Authors
+.An -nosplit
+The
+.Nm mandoc
+utility was written by
+.An Kristaps Dzonsons Aq Mt kristaps@bsd.lv
+and is maintained by
+.An Ingo Schwarze Aq Mt schwarze@openbsd.org .'
+
+output=$(echo "$input" | "$groff" -Tascii -P-cbou -mdoc)
+
+echo "$output" \
+ | grep -Fq 'written by Kristaps Dzonsons <kristaps@bsd.lv>'
+
+echo "$output" \
+ | grep -Fq 'is maintained by Ingo Schwarze <schwarze@openbsd.org>.'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/doc_Nm-works.sh b/tmac/tests/doc_Nm-works.sh
new file mode 100755
index 0000000..a27e931
--- /dev/null
+++ b/tmac/tests/doc_Nm-works.sh
@@ -0,0 +1,74 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ fail=yes
+}
+
+# Unit test `Nm` macro (and regression-test Savannah #63377).
+
+input='.Dd 2022-11-17
+.Dt foo 1
+.Os "groff test suite"
+.Sh Name
+.Nm foo
+.Nd frobnicate a bar
+.Sh Description
+.Nm
+is a program.'
+
+echo "checking Nm's interpolation of text after initial call" >&2
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -mdoc)
+echo "$output"
+echo "$output" | grep -q 'foo is a program\.' || wail
+
+# Handle multiple declarations in "Name" section.
+
+input='.Dd 2022-11-17
+.Dt trig.h 3
+.Os "groff test suite"
+.Sh Name
+.Nm sin ,
+.Nm cos ,
+.Nm tan
+.Nd trigonometric functions
+.Sh Description
+.Nm
+returns the sine of its argument,
+an angle
+.Ms theta .'
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -mdoc)
+echo "$output"
+
+echo "checking Nm behavior when called multiple times (Name)" >&2
+echo "$output" | grep -q 'sin, cos, tan -- trigonometric' || wail
+
+echo "checking Nm behavior when called multiple times (Description)" >&2
+echo "$output" | grep -q 'sin returns the sine' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/doc_P-register-works.sh b/tmac/tests/doc_P-register-works.sh
new file mode 100755
index 0000000..a3fe817
--- /dev/null
+++ b/tmac/tests/doc_P-register-works.sh
@@ -0,0 +1,54 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ fail=YES
+}
+
+input='.Dd 2022-12-11
+.Dt foo 1
+.Os "groff test suite"
+.Sh Name
+.Nm foo
+.Nd frobnicate a bar
+.bp
+.Sh Description
+It took a while to get here.'
+
+output=$(printf "%s\n" "$input" | "$groff" -rcR=0 -rP13 -mdoc -Tascii \
+ -P-cbou)
+echo "$output"
+
+echo "checking first page footer" >&2
+echo "$output" | grep -En "^groff test suite +2022-12-11 +13$" \
+ | grep '^64:' || wail
+
+echo "checking second page footer" >&2
+echo "$output" | grep -En "^groff test suite +2022-12-11 +14$" \
+ | grep '^130:' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/doc_X-register-works.sh b/tmac/tests/doc_X-register-works.sh
new file mode 100755
index 0000000..d09d93b
--- /dev/null
+++ b/tmac/tests/doc_X-register-works.sh
@@ -0,0 +1,70 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo ...FAILED >&2
+ fail=yes
+}
+
+# Ensure the X register takes effect on the right page and looks right.
+
+input='.Dd 2022-12-14
+.Dt foo 1
+.Os "groff foo test suite"
+.Dd 2022-12-14
+.Dt bar 1
+.Os "groff bar test suite"'
+
+output=$(printf "%s\n" "$input" \
+ | "$groff" -Tascii -P-cbou -rcR=0 -rC1 -rX1 -mdoc)
+echo "$output"
+
+echo "checking first page footer" >&2
+echo "$output" | grep -Eqx 'groff foo test suite +2022-12-14 +1' || wail
+
+echo "checking second page footer" >&2
+echo "$output" | grep -Eqx 'groff bar test suite +2022-12-14 +1a' \
+ || wail
+
+# XXX: mdoc output does not yet suppress headers and footers.
+#
+#input='.Dd 2022-12-14
+#.Dt baz 1
+#.Os "groff baz test suite"
+#.Sh Name
+#.Nm baz
+#.Nd what you will not hear at the Mos Eisley spaceport cantina
+#.Sh Description
+#This program is a fifth wheel.'
+#
+#output=$(printf "%s\n" "$input" \
+# | "$groff" -Thtml -rcR=0 -rC1 -rX1 -mdoc)
+#echo "$output"
+#
+#echo "checking for absence of footer text in HTML output" >&2
+#echo "$OUTPUT" | grep -q 'groff baz test suite' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/doc_accept-mixed-case-section-headings.sh b/tmac/tests/doc_accept-mixed-case-section-headings.sh
new file mode 100755
index 0000000..a38afd6
--- /dev/null
+++ b/tmac/tests/doc_accept-mixed-case-section-headings.sh
@@ -0,0 +1,76 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Ensure we recognize mixed-case section headings ("Name" as well as
+# "NAME").
+
+EXAMPLE='\
+.Dd September 14, 2020
+.Dt mdoc\-test 7
+.Os
+.Sh Name
+.Nm mdoc\-test
+.Nd a smoke test for groff'"'"'s mdoc implementation
+.Sh Description
+This page has mixed-case section headings.
+.Pp
+This paragraph works around Savannah #59106.
+.Dd September 14, 2020
+.Dt mdoc\-test 7
+.Os
+.Sh NAME
+.Nm mdoc\-test
+.Nd a smoke test for groff'"'"'s mdoc implementation
+.Sh DESCRIPTION
+This page has fully-capitalized section headings.\
+'
+
+OUTPUT=$(printf "%s\n" "$EXAMPLE" | "$groff" -Tascii -P-cbou -mdoc)
+FAIL=
+
+if [ -z "$(echo "$OUTPUT" | sed -n '/Name/{N;/smoke/p;}')" ]
+then
+ FAIL=yes
+ echo "section \"Name\" check failed" >&2
+fi
+
+if [ -z "$(echo "$OUTPUT" | sed -n '/Description/{N;/mixed-case/p;}')" ]
+then
+ FAIL=yes
+ echo "section \"Description\" check failed" >&2
+fi
+
+if [ -z "$(echo "$OUTPUT" | sed -n '/NAME/{N;/smoke/p;}')" ]
+then
+ FAIL=yes
+ echo "section \"NAME\" check failed" >&2
+fi
+
+if [ -z "$(echo "$OUTPUT" | sed -n '/DESCRIPTION/{N;/fully-cap/p;}')" ]
+then
+ FAIL=yes
+ echo "section \"DESCRIPTION\" check failed" >&2
+fi
+
+test -z "$FAIL"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/doc_do-not-loop-infinitely-when-shortening-headers.sh b/tmac/tests/doc_do-not-loop-infinitely-when-shortening-headers.sh
new file mode 100755
index 0000000..6d06f0d
--- /dev/null
+++ b/tmac/tests/doc_do-not-loop-infinitely-when-shortening-headers.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+DOCUMENT=\
+'.Dd 2020-11-17
+.Dt ftp 1
+.Os "groff test suite"
+.Sh Name
+.Nm ftp
+.Nd transfer files insecurely'
+
+# Regression-test Debian #411227.
+#
+# Don't loop infinitely when trying to shorten page header and we can't
+# shrink it any further.
+
+echo "$DOCUMENT" | "$groff" -z -rLT=35n -Tascii -P-cbou -mdoc
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/doc_heading-font-remapping-works.sh b/tmac/tests/doc_heading-font-remapping-works.sh
new file mode 100755
index 0000000..27f5196
--- /dev/null
+++ b/tmac/tests/doc_heading-font-remapping-works.sh
@@ -0,0 +1,58 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo ...FAILED >&2
+ fail=yes
+}
+
+# Ensure that italics in a section heading get remapped to bold italics
+# (if the heading font is bold).
+
+input='.Dd 2022-12-26
+.Dt foo 1
+.Os "groff test suite"
+.Sh Name
+.Nm foo
+.Nd frobnicate a bar
+.Sh Hacking Xr groff
+Have fun!'
+
+output=$(printf "%s\n" "$input" | "$groff" -mdoc -Tascii -Z)
+echo "$output"
+
+echo "$output" | sed -n '/tHacking/{n
+/x font 4 BI/{n
+/f4/{n
+/h/{n
+/tgroff/{n
+/n/{n
+/f1/p;}
+}
+}
+}
+}
+}' | grep -Fqx f1
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/doc_indents-correctly.sh b/tmac/tests/doc_indents-correctly.sh
new file mode 100755
index 0000000..216e9c2
--- /dev/null
+++ b/tmac/tests/doc_indents-correctly.sh
@@ -0,0 +1,89 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Debian #1022179.
+#
+# Ensure that subsection headings are indent correctly even if they
+# break across output lines.
+
+input='.Dd 2022-10-28
+.Dt foo 1
+.Os
+.Sh "A long section heading that wraps to illustrate the fact that the\
+ indentation of said title is consistent even if it breaks across lines"
+Discussion should be indented as ordinary paragraph.
+.Ss "A long subsection heading that wraps to illustrate the fact that\
+ the indentation of said title is consistent even if it breaks across\
+ lines"
+Further discussion should be indented as ordinary paragraph.'
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -mdoc)
+fail=
+
+# Verify that default `Sh` indentation is zero.
+if ! echo "$output" | grep -Eq '^A +long +section +heading'
+then
+ fail=yes
+ echo "default 'Sh' indentation check failed on 1st line" >&2
+fi
+
+if ! echo "$output" | grep -Eq '^of said title is consistent'
+then
+ fail=yes
+ echo "default 'Sh' indentation check failed on 2nd line" >&2
+fi
+
+# Verify that paragraph indentation after section heading is correct.
+# 7 spaces in string literal.
+if ! echo "$output" | grep -Eq '^ Discussion should be indented'
+then
+ fail=yes
+ echo "'Pp' indentation after 'Sh' check failed" >&2
+fi
+
+# Verify that default `Ss` indentation is three ens.
+# 3 spaces in string literal.
+if ! echo "$output" | grep -Eq '^ A +long +subsection +heading'
+then
+ fail=yes
+ echo "default 'Ss' indentation check failed on 1st line" >&2
+fi
+
+# 3 spaces in string literal.
+if ! echo "$output" | grep -Eq '^ indentation of said title is'
+then
+ fail=yes
+ echo "default 'Ss' indentation check failed on 2nd line" >&2
+fi
+
+# Verify that paragraph indentation after subsection heading is correct.
+# 7 spaces in string literal.
+if ! echo "$output" | grep -Eq '^ Further discussion should be'
+then
+ fail=yes
+ echo "'Pp' indentation after 'Ss' check failed" >&2
+fi
+
+test -z "$fail"
+exit
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/doc_output-footer-when-continuously-rendering.sh b/tmac/tests/doc_output-footer-when-continuously-rendering.sh
new file mode 100755
index 0000000..3303071
--- /dev/null
+++ b/tmac/tests/doc_output-footer-when-continuously-rendering.sh
@@ -0,0 +1,43 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Ensure that the page footer is printed even when a pending output line
+# is 1v from the page bottom. (A page ejection inside an end of input
+# trap exits the formatter.)
+
+input='.Dd 2022-11-02
+.Dt foo 1
+.Os "groff test suite"
+.Sh Name
+.Nm foo
+.Nd frobnicate a bar
+.Sh Description
+.rs
+.sp 60v
+line 61
+.br
+line 62'
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -mdoc)
+echo "$output" | grep -Eqx 'groff test suite +2022-11-02 +foo\(1\)'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/doc_smoke-test.sh b/tmac/tests/doc_smoke-test.sh
new file mode 100755
index 0000000..09d1ad0
--- /dev/null
+++ b/tmac/tests/doc_smoke-test.sh
@@ -0,0 +1,66 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo ...FAILED >&2
+ fail=yes
+}
+
+# Regression-test Savannah #51003.
+#
+# Ensure we can render mdoc man pages from a build tree.
+
+input='.Dd August 25, 2020
+.Dt mdoc\-test 7
+.Os
+.Sh Name
+.Nm mdoc\-test
+.Nd a smoke test for groff'"'"'s mdoc implementation
+.Sh Description
+If you can read this without a hailstorm of warnings,
+things are probably working.'
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -mdoc)
+echo "$output"
+fail=
+
+echo "checking header for correct content" >&2
+echo "$output" | grep -qE '^mdoc-test\(7\) +Miscellaneous' || wail
+
+echo "checking for section heading \"Name\"" >&2
+echo "$output" | grep -qE '^Name$' || wail
+
+echo "checking for section heading \"Description\"" >&2
+echo "$output" | grep -qE '^Description$' || wail
+
+echo "checking paragraph body for correct content" >&2
+echo "$output" | grep -qE 'you can read this' || wail
+
+echo "checking footer for correct content" >&2
+echo "$output" | grep -qE '^GNU +August 25, 2020 +mdoc-test\(7\)' \
+ || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/e_chapter-titles-work.sh b/tmac/tests/e_chapter-titles-work.sh
new file mode 100755
index 0000000..3c7c6c1
--- /dev/null
+++ b/tmac/tests/e_chapter-titles-work.sh
@@ -0,0 +1,68 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Ensure that chapter (and appendix) titles aren't broken by
+# localization rigamarole.
+
+input='.de $C
+. tm $C: \\$@
+..
+.++ C
+.+c "The Boy Sickens"
+.+c "The Boy Dies"
+.++ A
+.+c "Pathology of Boy Aged 11 Years"'
+
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ fail=YES
+}
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -me 2>&1)
+
+echo "checking for correct arguments given to \$C hook macro (1)" >&2
+echo "$output" | grep -Fqx '$C: "Chapter" "1" "The Boy Sickens"' || wail
+
+# Ensure that the chapter number got incremented.
+echo "checking for correct arguments given to \$C hook macro (2)" >&2
+echo "$output" | grep -Fqx '$C: "Chapter" "2" "The Boy Dies"' || wail
+
+# Ensure that an appendix chapter uses uppercase alphabetical numbers.
+echo "checking for correct arguments given to \$C hook macro (3)" >&2
+echo "$output" \
+ | grep -Fqx '$C: "Appendix" "A" "Pathology of Boy Aged 11 Years"' \
+ || wail
+
+echo "checking formatted chapter heading output (1)" >&2
+echo "$output" | grep -Fq "Chapter 1" || wail
+
+echo "checking formatted chapter heading output (2)" >&2
+echo "$output" | grep -Fq "Chapter 2" || wail
+
+echo "checking formatted appendix heading output" >&2
+echo "$output" | grep -Fq "Appendix A" || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/e_columns-work-on-long-pages.sh b/tmac/tests/e_columns-work-on-long-pages.sh
new file mode 100755
index 0000000..2ee9144
--- /dev/null
+++ b/tmac/tests/e_columns-work-on-long-pages.sh
@@ -0,0 +1,38 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #55081.
+#
+# Ensure that long page lengths don't break columnation.
+
+EXAMPLE=\
+'.pl 159v
+.2c
+Column 1.
+.bc
+Column 2.'
+
+echo "$EXAMPLE" \
+ | "$groff" -Tascii -P-cbou -me \
+ | grep -Eqx 'Column 1\. +Column 2\.'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/e_delayed-text-marks-work.sh b/tmac/tests/e_delayed-text-marks-work.sh
new file mode 100755
index 0000000..71845ad
--- /dev/null
+++ b/tmac/tests/e_delayed-text-marks-work.sh
@@ -0,0 +1,55 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+set -e
+
+# Ensure that delayed text marks increment and reset as they should.
+
+input='.pp
+paragraph 1
+.(d
+\*# foo
+.)d
+.(d
+\*# bar
+.)d
+.pd
+.(d
+\*# baz
+.)d
+.pp
+paragraph 2
+.(d
+\*# qux
+.)d
+.pd
+.pp
+paragraph 3'
+
+output=$(echo "$input" | "$groff" -Tascii -P-cbou -me)
+
+echo "$output" | grep -Fx '[1] foo'
+echo "$output" | grep -Fx '[2] bar'
+echo "$output" | grep -Fx '[1] baz'
+echo "$output" | grep -Fx '[2] qux'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/e_footnote-marks-work.sh b/tmac/tests/e_footnote-marks-work.sh
new file mode 100755
index 0000000..38f1d9f
--- /dev/null
+++ b/tmac/tests/e_footnote-marks-work.sh
@@ -0,0 +1,74 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+set -e
+
+# Ensure that footnote marks increment as they should.
+
+input='.pp
+Jackdaws*
+.(f
+* foo
+.)f
+love my big\**
+.(f
+\** bar
+.)f
+sphinx**
+.(f
+** baz
+.)f
+of quartz.\**
+.(f
+\** qux
+.)f
+.+c
+.pp
+Pack my box with five dozen liquor jugs.\**
+.(f
+\** ogg
+.)f'
+
+output=$(echo "$input" | "$groff" -Tascii -P-cbou -me)
+
+echo "$output" \
+ | grep -F 'Jackdaws* love my big[1] sphinx** of quartz.[2]'
+
+echo "$output" \
+ | grep -F '* foo'
+
+echo "$output" \
+ | grep -F '[1] bar'
+
+echo "$output" \
+ | grep -F '** baz'
+
+echo "$output" \
+ | grep -F '[2] qux'
+
+echo "$output" \
+ | grep -F 'Pack my box with five dozen liquor jugs.[1]'
+
+echo "$output" \
+ | grep -F '[1] ogg'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/e_footnotes-work-with-columns.sh b/tmac/tests/e_footnotes-work-with-columns.sh
new file mode 100755
index 0000000..fbf3238
--- /dev/null
+++ b/tmac/tests/e_footnotes-work-with-columns.sh
@@ -0,0 +1,43 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #58736.
+#
+# Returning to single columnation shouldn't break if footnotes are used.
+
+EXAMPLE=\
+'foo
+.(f
+footnote
+.)f
+.2c
+bar
+.bc
+baz
+.1c
+qux'
+
+test -n "$(echo "$EXAMPLE" \
+ | "$groff" -Tascii -P-cbou -me \
+ | sed -n '/foo/{N;/bar *baz/{N;/qux/p;};}')"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/e_ld-works.sh b/tmac/tests/e_ld-works.sh
new file mode 100755
index 0000000..1c315a8
--- /dev/null
+++ b/tmac/tests/e_ld-works.sh
@@ -0,0 +1,131 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Test the `ld` macro.
+
+input='.nr yr 108
+.nr mo 12
+.nr dy 15
+.nr dw 2
+.ld
+.++ C
+.+c "Fleeing the Impoverished, Drunken Countryside for Dublin"
+.pp
+The day was \*(dw, \*(td.
+.++ A
+.+c "How to Write for The Toast"
+.pp
+Submit it on spec.'
+
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ fail=YES
+}
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -me)
+output_cs=$(printf "%s\n" "$input" | "$groff" -Tutf8 -P-cbou -me -mcs)
+output_de=$(printf "%s\n" "$input" | "$groff" -Tutf8 -P-cbou -me -mde)
+output_fr=$(printf "%s\n" "$input" | "$groff" -Tutf8 -P-cbou -me -mfr)
+output_it=$(printf "%s\n" "$input" | "$groff" -Tutf8 -P-cbou -me -mit)
+output_sv=$(printf "%s\n" "$input" | "$groff" -Tutf8 -P-cbou -me -msv)
+
+echo 'checking that `td` string updated correctly for English' >&2
+echo "$output" | grep -q 'The day was Monday, December 15, 2008\.$' \
+ || wail
+
+echo 'checking for correct English "Chapter" string' >&2
+echo "$output" | grep -Eqx ' +Chapter 1' || wail
+
+echo 'checking for correct English "Appendix" string' >&2
+echo "$output" | grep -Eqx ' +Appendix A' || wail
+
+# POSIX grep (as of Issue 7) does not provide any locale-independent
+# mechanism for matching 8-bit characters--they do not even match "any"
+# character ('.'). When checking the date strings, we therefore skip
+# them. (Fortunately, at present, none of the translations of "Chapter"
+# or "Appendix" require non-Basic Latin letters.)
+
+# Czech localization
+echo 'checking that `td` string updated correctly for Czech (1)' >&2
+echo "$output_cs" | grep -q 'The day was Pond' || wail
+
+echo 'checking that `td` string updated correctly for Czech (2)' >&2
+echo "$output_cs" | grep -q ', 15 Prosinec 2008\.$' || wail
+
+echo 'checking for correct Czech "Chapter" string' >&2
+echo "$output_cs" | grep -Eqx ' +Kapitola 1' || wail
+
+echo 'checking for correct Czech "Appendix" string' >&2
+echo "$output_cs" | grep -Eqx ' +Dodatek A' || wail
+
+# German localization
+echo 'checking that `td` string updated correctly for German' >&2
+echo "$output_de" \
+ | grep -q 'The day was Montag, 15\. Dezember\. 2008\.$' || wail
+
+echo 'checking for correct German "Chapter" string' >&2
+echo "$output_de" | grep -Eqx ' +Kapitel 1' || wail
+
+echo 'checking for correct German "Appendix" string' >&2
+echo "$output_de" | grep -Eqx ' +Anhang A' || wail
+
+# French localization
+echo 'checking that `td` string updated correctly for French (1)' >&2
+echo "$output_fr" | grep -q 'The day was Lundi, 15 D'
+
+echo 'checking that `td` string updated correctly for French (2)' >&2
+echo "$output_fr" | grep -q 'cembre 2008\.$' || wail
+
+echo 'checking for correct French "Chapter" string' >&2
+echo "$output_fr" | grep -Eqx ' +Chapitre 1' || wail
+
+echo 'checking for correct French "Appendix" string' >&2
+echo "$output_fr" | grep -Eqx ' +Annexe A' || wail
+
+# Italian localization
+echo 'checking that `td` string updated correctly for Italian' >&2
+echo "$output_it" | grep -q 'The day was Lunedì, 15 Dicembre 2008\.$'
+
+echo 'checking for correct Italian "Chapter" string' >&2
+echo "$output_it" | grep -Eqx ' +Capitolo 1' || wail
+
+echo 'checking for correct Italian "Appendix" string' >&2
+echo "$output_it" | grep -Eqx ' +Appendice A' || wail
+
+# Swedish localization
+echo 'checking that `td` string updated correctly for Swedish (1)' >&2
+echo "$output_sv" | grep -q 'The day was m'
+
+echo 'checking that `td` string updated correctly for Swedish (2)' >&2
+echo "$output_sv" | grep -q 'ndag, 15 december 2008\.$' || wail
+
+echo 'checking for correct Swedish "Chapter" string' >&2
+echo "$output_sv" | grep -Eqx ' +Kapitel 1' || wail
+
+echo 'checking for correct Swedish "Appendix" string' >&2
+echo "$output_sv" | grep -Eqx ' +Bilaga A' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/e_line-numbering-works.sh b/tmac/tests/e_line-numbering-works.sh
new file mode 100755
index 0000000..427840e
--- /dev/null
+++ b/tmac/tests/e_line-numbering-works.sh
@@ -0,0 +1,141 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Test the line numbering feature.
+
+input='.nr pp 18 \\" to make troff output consistent with nroff
+.if r mypo .po \\n[mypo]u
+.if !d C .ds C\\" empty
+.pp
+Feck, vex loping bad jazz: quench my thirst.
+Feck, vex loping bad jazz: quench my thirst.
+.pp
+.n1 \\*C
+Jackdaws love my big sphinx of quartz.
+Jackdaws love my big sphinx of quartz.
+Jackdaws love my big sphinx of quartz.
+.pp
+How vexingly quick daft zebras jump!
+.pp
+.n2 +6
+Waltz, bad nymph, for quick jigs vex.
+Waltz, bad nymph, for quick jigs vex.
+.pp
+.n2 99
+Pack my box with five dozen liquor jugs.
+Pack my box with five dozen liquor jugs.
+Pack my box with five dozen liquor jugs.
+.pp
+.n2
+The five boxing wizards jump quickly.
+The five boxing wizards jump quickly.'
+
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ fail=YES
+}
+
+echo '*** basic output (line number field prepended)' >&2
+output=$(echo "$input" | "$groff" -Tascii -P-cbou -me)
+
+echo "$output"
+
+# We expect the foregoing to produce a me(7) diagnostic complaining of a
+# negative page offset but we're not testing for that.
+
+echo 'checking for 0 page offset and 5n paragraph indentation (1)' >&2
+echo "$output" | grep -q '^ Feck.*vex$' || wail # 5 spaces
+
+# troff uses backspaces to emit the line number, so we can't anchor the
+# matches to the beginning of the line with '^'.
+
+# These patterns have 6 embedded spaces until further notice.
+echo 'checking for line number field plus 60n line length' >&2
+echo "$output" | grep -q '1 Jackdaws.*love$' || wail
+
+echo 'checking for non-numbering of blank lines' >&2
+echo "$output" | grep -q '4 How.*jump!$' || wail
+
+echo 'checking offset-advanced two-digit line number' >&2
+echo "$output" | grep -q '^10 Waltz,.*bad nymph$'
+
+echo 'checking three-digit line number' >&2
+echo "$output" | grep -q '^100 with.*dozen$'
+
+echo 'checking for 0 page offset and 5n paragraph indentation (2)' >&2
+echo "$output" | grep -q '^ The.*boxing$' || wail # 5 spaces
+
+echo '*** roff(1)-compatible output (shorter line length)' >&2
+output=$(echo "$input" | "$groff" -dCC -Tascii -P-cbou -me)
+
+echo "$output"
+
+echo 'checking for 0 page offset and 5n paragraph indentation (1)' >&2
+echo "$output" | grep -q '^ Feck.*vex' || wail # 5 spaces
+
+echo 'checking for line number field plus 56n line length' >&2
+echo "$output" \
+ | grep -q ' 1 Jackdaws.*Jackdaws$' || wail # 2, then 6 spaces
+
+# These patterns have 6 embedded spaces until further notice.
+echo 'checking for non-numbering of blank lines' >&2
+echo "$output" | grep -q '4 How.*jump!$' || wail
+
+echo 'checking offset-advanced two-digit line number' >&2
+echo "$output" | grep -q ' 10 Waltz,.*bad$' || wail
+
+echo 'checking three-digit line number' >&2
+echo "$output" | grep -q '^100 box.*dozen$'
+
+echo 'checking for 0 page offset and 5n paragraph indentation (2)' >&2
+echo "$output" | grep -q '^ The.*boxing$' || wail # 5 spaces
+
+echo '*** output with 4n page offset' >&2
+output=$(echo "$input" | "$groff" -rmypo=4n -Tascii -P-cbou -me)
+
+echo "$output"
+
+echo 'checking for 4n page offset and 5n paragraph indentation (1)' >&2
+echo "$output" | grep -q '^ Feck.*vex' || wail # 9 spaces
+
+echo 'checking for line number field plus 60n line length' >&2
+echo "$output" \
+ | grep -q ' 1 Jackdaws.*love$' || wail # 2, then 6 spaces
+
+# These patterns have 6 embedded spaces until further notice.
+echo 'checking for non-numbering of blank lines' >&2
+echo "$output" | grep -q '4 How.*jump!$' || wail
+
+echo 'checking offset-advanced two-digit line number' >&2
+echo "$output" | grep -q ' 10 Waltz,.*bad$' || wail
+
+echo 'checking three-digit line number' >&2
+echo "$output" | grep -q '^100 box.*dozen$'
+
+echo 'checking for 4n page offset and 5n paragraph indentation (2)' >&2
+echo "$output" | grep -q '^ The.*boxing$' || wail # 9 spaces
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/e_rejects-too-short-page-lengths.sh b/tmac/tests/e_rejects-too-short-page-lengths.sh
new file mode 100755
index 0000000..526f640
--- /dev/null
+++ b/tmac/tests/e_rejects-too-short-page-lengths.sh
@@ -0,0 +1,61 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Page lengths that are too short cause loss of header/footer text and
+# infinite trap recursion in extreme cases.
+#
+# As of the time of this writing, bad behavior (a superfluous page
+# break) sets in at 14v, and we start to lose headers/footers at a
+# length of 13v. Get down to 7v and the traps infinitely recurse.
+
+input='.pl 7v
+.he "A"B"C"
+.fo "D"E"F"
+.lp
+foobar
+'
+
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ fail=YES
+}
+
+output=$(printf '%s\n' "$input" | "$groff" -Tascii -P-cbou -me 2>&1)
+status=$?
+
+echo "checking for nonzero exit status" >&2
+test $status -ne 0 || wail
+
+# grepping diagnostic messages is a tar pit. I hope I don't come to
+# regret this.
+
+echo "checking for lack of diagnostic about infinite loop" >&2
+echo "$output" | grep -q 'troff.*fatal.*infinite' && wail
+
+echo "checking for diagnostic about page length" >&2
+echo "$output" | grep -q 'e\.tmac.*page length' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/ec_works.sh b/tmac/tests/ec_works.sh
new file mode 100755
index 0000000..42ce59b
--- /dev/null
+++ b/tmac/tests/ec_works.sh
@@ -0,0 +1,45 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Verify that the EC fonts get loaded by using their Euro and per mille
+# glyphs (which aren't in the CM fonts) to detect them.
+input='.ec @
+.de EM
+. ft @@$1
+. nop @[Eu] @[%0]
+..
+.nf
+.EM TR
+.EM TI
+.EM TB
+.EM TBI
+.EM HR
+.EM HI
+.EM HB
+.EM HBI
+.EM CW
+.EM CWI'
+
+output=$(printf "%s\n" "$input" | "$groff" -mec -Tdvi -z 2>&1)
+test -z "$output"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/latin2_works.sh b/tmac/tests/latin2_works.sh
new file mode 100755
index 0000000..9cadf55
--- /dev/null
+++ b/tmac/tests/latin2_works.sh
@@ -0,0 +1,76 @@
+#!/bin/sh
+#
+# Copyright (C) 2022-2023 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo "...FAILED $*"
+ fail=yes
+}
+
+input=$(\
+ printf '\\[A ho]\\[ab]\\[/L]\\[S aa]';
+ printf '\\[vS]\\[S ac]\\[T ah]\\[Z aa]\\[vZ]\\[Z a.]\n';
+ printf '\\[a ho]\\[ho]\\[/l]\\[s aa]';
+ printf '\\[vs]\\[s ac]\\[t ah]\\[z aa]\\[a"]\\[vZ]\\[z a.]\n';
+ printf '\\[R aa]\\[A ab]\\[L aa]\\[C aa]';
+ printf '\\[C ah]\\[E ho]\\[E ah]\\[D ah]\n';
+ printf '\\[u0110]\\[N aa]\\[N ah]\\[O a"]';
+ printf '\\[R ah]\\[U ao]\\[U a"]\\[T ac]\n';
+ printf '\\[r aa]\\[a ab]\\[l aa]\\[c aa]';
+ printf '\\[c ah]\\[e ho]\\[e ah]\\[d ah]\n';
+ printf '\\[u0111]\\[n aa]\\[n ah]\\[o a"]';
+ printf '\\[r ah]\\[u ao]\\[u a"]\\[t ac]\\[a.]\n';
+)
+
+output=$(printf "%s\n" "$input" | "$groff" -Tlatin1 -mlatin2 \
+ | LC_ALL=C od -t o1)
+printf "%s\n" "$output"
+printf "$output" \
+ | grep -Eq '^0000000 +241 242 243 246 251 252 253 254 256 257 +' \
+ || wail "in block 0xA0"
+printf "$output" \
+ | grep -Eq '^0000000 +.* 261 262 263 266 271$' \
+ || wail "in block 0xB0 (address 0..017)"
+printf "$output" \
+ | grep -Eq '^0000020 +272 273 274 275 256 277 +' \
+ || wail "in block 0xB0 (address 020..037)"
+printf "$output" \
+ | grep -Eq '^0000020 +.* 300 303 305 306 310 312 314 317 040$' \
+ || wail "in block 0xC0"
+printf "$output" \
+ | grep -Eq '^0000040 +320 321 322 325 330 331 333 336 +' \
+ || wail "in block 0xD0"
+printf "$output" \
+ | grep -Eq '^0000040 +.* 340 343 345 346 350 352 354$' \
+ || wail "in block 0xE0 (address 040..057)"
+printf "$output" \
+ | grep -Eq '^0000060 +357 +' \
+ || wail "in block 0xE0 (address 060..077)"
+printf "$output" \
+ | grep -Eq \
+ '^0000060 +.* 360 361 362 365 370 371 373 376 377( 012)+$' \
+ || wail "in block 0xF0"
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/latin5_works.sh b/tmac/tests/latin5_works.sh
new file mode 100755
index 0000000..62e1c11
--- /dev/null
+++ b/tmac/tests/latin5_works.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+#
+# Copyright (C) 2022-2023 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+input=$(printf '\\[G ab]\\[g ab]\\[u0130]\\[.i]\\[S ac]\\[s ac]')
+output=$(printf "%s\n" "$input" | "$groff" -Tlatin1 -mlatin5 \
+ | LC_ALL=C od -t o1)
+printf "%s\n" "$output"
+printf "$output" \
+ | grep -Eq '^0000000 +320 360 335 375 336 376 +'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/latin9_works.sh b/tmac/tests/latin9_works.sh
new file mode 100755
index 0000000..ca5e23b
--- /dev/null
+++ b/tmac/tests/latin9_works.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+#
+# Copyright (C) 2022-2023 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+input=$(printf '\\[Eu]\\[vS]\\[vs]\\[vZ]\\[vz]\\[OE]\\[oe]\\[:Y]\n')
+output=$(printf "%s\n" "$input" | "$groff" -Tlatin1 -mlatin9 \
+ | LC_ALL=C od -t o1)
+printf "%s\n" "$output"
+printf "$output" \
+ | grep -Eq '^0000000 +244 246 250 264 270 274 275 276 +'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/localization-works.sh b/tmac/tests/localization-works.sh
new file mode 100755
index 0000000..d807018
--- /dev/null
+++ b/tmac/tests/localization-works.sh
@@ -0,0 +1,189 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ fail=YES
+}
+
+input='.tm .hy=\n[.hy]'
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -mcs 2>&1)
+echo 'checking raw troff with -mcs' >&2
+echo "$output" | grep -Fqx '.hy=1' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -mde 2>&1)
+echo 'checking raw troff with -mde' >&2
+echo "$output" | grep -Fqx '.hy=1' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -men 2>&1)
+echo 'checking raw troff with -men' >&2
+echo "$output" | grep -Fqx '.hy=4' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -mfr 2>&1)
+echo 'checking raw troff with -mfr' >&2
+echo "$output" | grep -Fqx '.hy=4' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -mit 2>&1)
+echo 'checking raw troff with -mit' >&2
+echo "$output" | grep -Fqx '.hy=1' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -msv 2>&1)
+echo 'checking raw troff with -msv' >&2
+echo "$output" | grep -Fqx '.hy=32' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -me -mcs 2>&1)
+echo 'checking -me with -mcs' >&2
+echo "$output" | grep -Fqx '.hy=2' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -me -mde 2>&1)
+echo 'checking -me with -mde' >&2
+echo "$output" | grep -Fqx '.hy=2' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -me -men 2>&1)
+echo 'checking -me with -men' >&2
+echo "$output" | grep -Fqx '.hy=6' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -me -mfr 2>&1)
+echo 'checking -me with -mfr' >&2
+echo "$output" | grep -Fqx '.hy=6' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -me -mit 2>&1)
+echo 'checking -me with -mit' >&2
+echo "$output" | grep -Fqx '.hy=2' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -me -msv 2>&1)
+echo 'checking -me with -msv' >&2
+echo "$output" | grep -Fqx '.hy=34' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -ms -mcs 2>&1)
+echo 'checking -ms with -mcs' >&2
+echo "$output" | grep -Fqx '.hy=2' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -ms -mde 2>&1)
+echo 'checking -ms with -mde' >&2
+echo "$output" | grep -Fqx '.hy=2' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -ms -men 2>&1)
+echo 'checking -ms with -men' >&2
+echo "$output" | grep -Fqx '.hy=6' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -ms -mfr 2>&1)
+echo 'checking -ms with -mfr' >&2
+echo "$output" | grep -Fqx '.hy=6' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -ms -mit 2>&1)
+echo 'checking -ms with -mit' >&2
+echo "$output" | grep -Fqx '.hy=2' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -ms -msv 2>&1)
+echo 'checking -ms with -msv' >&2
+echo "$output" | grep -Fqx '.hy=34' || wail
+
+input='.TH foo 1 2022-01-06 "groff test suite"
+.tm .hy=\n[.hy]'
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -rcR=0 -man -mcs 2>&1)
+echo 'checking -man with -rcR=0 -mcs' >&2
+echo "$output" | grep -Fqx '.hy=2' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -rcR=0 -man -mde 2>&1)
+echo 'checking -man with -rcR=0 -mde' >&2
+echo "$output" | grep -Fqx '.hy=2' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -rcR=0 -man -men 2>&1)
+echo 'checking -man with -rcR=0 -men' >&2
+echo "$output" | grep -Fqx '.hy=6' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -rcR=0 -man -mfr 2>&1)
+echo 'checking -man with -rcR=0 -mfr' >&2
+echo "$output" | grep -Fqx '.hy=6' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -rcR=0 -man -mit 2>&1)
+echo 'checking -man with -rcR=0 -mit' >&2
+echo "$output" | grep -Fqx '.hy=2' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -rcR=0 -man -msv 2>&1)
+echo 'checking -man with -rcR=0 -msv' >&2
+echo "$output" | grep -Fqx '.hy=34' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -rcR=1 -man -mcs 2>&1)
+echo 'checking -man with -rcR=1 -mcs' >&2
+echo "$output" | grep -Fqx '.hy=1' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -rcR=1 -man -mde 2>&1)
+echo 'checking -man with -rcR=1 -mde' >&2
+echo "$output" | grep -Fqx '.hy=1' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -rcR=1 -man -men 2>&1)
+echo 'checking -man with -rcR=1 -men' >&2
+echo "$output" | grep -Fqx '.hy=4' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -rcR=1 -man -mfr 2>&1)
+echo 'checking -man with -rcR=1 -mfr' >&2
+echo "$output" | grep -Fqx '.hy=4' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -rcR=1 -man -mit 2>&1)
+echo 'checking -man with -rcR=1 -mit' >&2
+echo "$output" | grep -Fqx '.hy=1' || wail
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -rcR=1 -man -msv 2>&1)
+echo 'checking -man with -rcR=1 -msv' >&2
+echo "$output" | grep -Fqx '.hy=32' || wail
+
+# Ensure that the 'trap bit' (hyphenation value 2, which has nothing to
+# do with any language) is preserved when switching locales back from a
+# CJK language, since those languages' modes unconditionally clear it.
+
+input='.TH foo 1 2022-04-09 "groff test suite"
+.SH åå‰
+foo \- APT 用é¸æŠžåˆ¶å¾¡ãƒ•ã‚¡ã‚¤ãƒ«
+.mso en.tmac
+.TH bar 1 2022-04-09 "groff test suite"
+.SH Name
+bar \- three subjects walk into this
+.tm .hy=\n[.hy]'
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -rcR=0 -man -mja \
+ -men 2>&1)
+echo 'checking -man with -rcR=0 -mja -men' >&2
+echo "$output" | grep -Fqx '.hy=6' || wail
+
+input='.TH foo 1 2022-04-09 "groff test suite"
+.SH å称
+foo \- è§£æž man 手册页的头部信æ¯
+.mso en.tmac
+.TH bar 1 2022-04-09 "groff test suite"
+.SH Name
+bar \- three subjects walk into this
+.tm .hy=\n[.hy]'
+
+output=$(printf "%s\n" "$input" | "$groff" -Tascii -P-cbou -rcR=0 -man -mzh \
+ -men 2>&1)
+echo 'checking -man with -rcR=0 -mzh -men' >&2
+echo "$output" | grep -Fqx '.hy=6' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh b/tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh
new file mode 100755
index 0000000..7e58849
--- /dev/null
+++ b/tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh
@@ -0,0 +1,83 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+# Give the output a name that won't collide with another test.
+gnu_pdf="${abs_top_builddir:-.}/doc/gnu-no-choke-on-pdfinfo.pdf"
+
+# Regression-test Savannah #58206.
+
+# We need gs(1) and pdfpic.tmac needs pdfinfo(1).
+for cmd in gs pdfinfo
+do
+ if ! command -v $cmd >/dev/null
+ then
+ echo "cannot locate '$cmd' command" >&2
+ exit 77 # skip
+ fi
+done
+
+# Locate directory containing our test artifacts.
+artifact_dir=
+
+for buildroot in . .. ../..
+do
+ d=$buildroot/doc
+ if [ -f $d/gnu.eps ]
+ then
+ artifact_dir=$d
+ gnu_eps=$artifact_dir/gnu.eps
+ break
+ fi
+done
+
+# If we can't find it, we can't test.
+test -z "$artifact_dir" && exit 77 # skip
+
+if [ -e "$gnu_pdf" ]
+then
+ echo "temporary output file '$gnu_pdf' already exists" >&2
+ exit 77 # skip
+fi
+
+fail=
+
+input='.am pdfpic@error
+. ab
+..
+Here is a picture of a wildebeest.
+.PDFPIC '"$gnu_pdf"
+
+if ! gs -q -o - -sDEVICE=pdfwrite -f "$gnu_eps" \
+ -c "[ /Title (\000B\000U\000S\000T\000E\000D) /DOCINFO pdfmark" \
+ > "$gnu_pdf"
+then
+ echo "gs command failed" >&2
+ rm -f "$gnu_pdf"
+ exit 77 # skip
+fi
+
+test -z "$fail" \
+ && printf '%s\n' "$input" | "$groff" -Tpdf -U -z || fail=YES
+
+rm -f "$gnu_pdf"
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/pdfpic_falls-back-to-PSPIC.sh b/tmac/tests/pdfpic_falls-back-to-PSPIC.sh
new file mode 100755
index 0000000..a77f431
--- /dev/null
+++ b/tmac/tests/pdfpic_falls-back-to-PSPIC.sh
@@ -0,0 +1,77 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+# Give the output a name that won't collide with another test.
+gnu_base="${abs_top_builddir:-.}/doc/gnu-fallback-pspic"
+gnu_fallback_eps="$gnu_base.eps"
+gnu_pdf="$gnu_base.pdf"
+
+if ! command -v gs >/dev/null
+then
+ echo "cannot locate 'gs' command" >&2
+ exit 77 # skip
+fi
+
+# Locate directory containing our test artifacts.
+artifact_dir=
+
+for buildroot in . .. ../..
+do
+ d=$buildroot/doc
+ if [ -f $d/gnu.eps ]
+ then
+ artifact_dir=$d
+ gnu_eps=$artifact_dir/gnu.eps
+ break
+ fi
+done
+
+# If we can't find it, we can't test.
+test -z "$artifact_dir" && exit 77 # skip
+
+if [ -e "$gnu_pdf" ]
+then
+ echo "temporary output file '$gnu_pdf' already exists" >&2
+ exit 77 # skip
+fi
+
+fail=
+
+input='.am pdfpic@error
+. ab
+..
+Here is a picture of a wildebeest.
+.PDFPIC '"$gnu_pdf"
+
+if ! gs -q -o - -sDEVICE=pdfwrite -f "$gnu_eps" > "$gnu_pdf"
+then
+ echo "gs command failed" >&2
+ rm -f "$gnu_fallback_eps" "$gnu_pdf"
+ exit 77 # skip
+fi
+
+test -z "$fail" \
+ && printf '%s\n' "$input" | "$groff" -Tps -U -z || fail=YES
+
+rm -f "$gnu_fallback_eps" "$gnu_pdf"
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/s_IP-indents-using-paragraph-type-size.sh b/tmac/tests/s_IP-indents-using-paragraph-type-size.sh
new file mode 100755
index 0000000..0973107
--- /dev/null
+++ b/tmac/tests/s_IP-indents-using-paragraph-type-size.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+export GROFF_TYPESETTER=
+
+# Regression-test Savannah #59604.
+#
+# Ensure that the indentation amount used by IP is based on the type
+# size of the _paragraph_, not a preceding heading (which might have
+# been affected by GROWPS).
+
+EXAMPLE=\
+'.nr PSINCR 3p
+.nr GROWPS 3
+.SH 1
+Text
+.IP 1. 4
+Filling
+.IP 2. 4
+Sentences'
+
+OUTPUT=$(echo "$EXAMPLE" | "$groff" -ms -Z \
+ | sed -n '/^H92000$/{
+ N
+ /\ntFilling$/{
+ p
+ b
+ }
+ }')
+test -n "$OUTPUT"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/s_IP-respects-inter-sentence-space-in-tags.sh b/tmac/tests/s_IP-respects-inter-sentence-space-in-tags.sh
new file mode 100755
index 0000000..70ca4d0
--- /dev/null
+++ b/tmac/tests/s_IP-respects-inter-sentence-space-in-tags.sh
@@ -0,0 +1,40 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #59742.
+#
+# Ensure that a non-default inter-sentence space setting is respected
+# inside a multi-sentence tag to an indented paragraph.
+
+EXAMPLE=\
+'.ss 12 24
+.LP
+Foo. Bar.
+.IP "Baz. Qux."
+Foo. Bar.
+'
+
+echo "$EXAMPLE" \
+ | "$groff" -Tascii -P-cbou -ms \
+ | grep -qx 'Baz\. Qux\.' # 3 spaces.
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/s_PN-works.sh b/tmac/tests/s_PN-works.sh
new file mode 100755
index 0000000..1c72634
--- /dev/null
+++ b/tmac/tests/s_PN-works.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #59823.
+#
+# Ensure retention of superfluous but fossilized register PN.
+
+EXAMPLE=\
+'.bp 2
+.LP
+This is page \n[PN].
+'
+
+printf "%s" "$EXAMPLE" \
+ | "$groff" -Tascii -P-cbou -ms \
+ | grep -Fqx 'This is page 2.'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/s_R-handles-its-arguments.sh b/tmac/tests/s_R-handles-its-arguments.sh
new file mode 100755
index 0000000..23380d9
--- /dev/null
+++ b/tmac/tests/s_R-handles-its-arguments.sh
@@ -0,0 +1,41 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #59348.
+#
+# Ensure that .R actually handles its arguments.
+
+EXAMPLE=\
+'.LP
+of the form
+.I
+.R * id\\c module
+.R
+\&.
+'
+
+# That \c's a killer. Can't use echo.
+printf "%s" "$EXAMPLE" \
+ | "$groff" -Tascii -P-cbou -ms \
+ | grep -Fqx 'of the form module*id.'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/s_SH-resets-IP-indentation-amount.sh b/tmac/tests/s_SH-resets-IP-indentation-amount.sh
new file mode 100755
index 0000000..71aa6c9
--- /dev/null
+++ b/tmac/tests/s_SH-resets-IP-indentation-amount.sh
@@ -0,0 +1,40 @@
+#!/bin/sh
+#
+# Copyright (C) 2021 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #60222.
+#
+# SH should reset IP indentation amount as other paragraphing macros do.
+
+EXAMPLE=\
+'.IP @ 3n
+3n indentation
+.SH
+Section heading
+.IP
+default indentation
+'
+
+echo "$EXAMPLE" \
+ | "$groff" -Tascii -P-cbou -ms \
+ | grep -qx ' default indentation' # 5 spaces
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/s_TC-works-with-percent-in-custom-titles.sh b/tmac/tests/s_TC-works-with-percent-in-custom-titles.sh
new file mode 100755
index 0000000..6939619
--- /dev/null
+++ b/tmac/tests/s_TC-works-with-percent-in-custom-titles.sh
@@ -0,0 +1,52 @@
+#!/bin/sh
+#
+# Copyright (C) 2020 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #59345.
+#
+# Ensure that .TC succeeds in assigning the 'i' format to the page
+# number register when '%' is used in a custom header or footer.
+
+EXAMPLE=\
+'.OH ##%##
+.NH 1
+Foo
+.XS
+Foo
+.XE
+.LP
+Bar.
+.TC
+'
+
+OUTPUT=$(echo "$EXAMPLE" | "$groff" -Tascii -P-cbou -ms)
+# Strip blank lines from the output first; all we care about for this
+# test is the presence, adjacency, and ordering of non-blank lines.
+FILTERED_OUTPUT=$(echo "$OUTPUT" \
+ | sed '/^$/d' \
+ | sed -n '/i/{
+N;/Table of Contents/{
+N;/Foo[. ][. ]*1/p;
+};
+}')
+test -n "$FILTERED_OUTPUT"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/s_XA-literal-no-argument-suppresses-leader.sh b/tmac/tests/s_XA-literal-no-argument-suppresses-leader.sh
new file mode 100755
index 0000000..a5099a1
--- /dev/null
+++ b/tmac/tests/s_XA-literal-no-argument-suppresses-leader.sh
@@ -0,0 +1,59 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #61853.
+#
+# The word "no" as the first argument to the `XA` macro should suppresss
+# not just the page number, but the leader before it as well.
+
+input='.PP
+.XS
+This is my TOC entry
+.XA no
+There are many like it
+.XE
+But this one is mine.
+.TC
+'
+
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ fail=YES
+}
+
+# Be aware of
+# <https://unix.stackexchange.com/questions/383217/\
+# shell-keep-trailing-newlines-n-in-command-substitution> when comparing
+# this to interactive output.
+output=$(printf '%s\n' "$input" | "$groff" -Tascii -P-cbou -ms)
+
+echo "checking for presence of supplemental TOC entry" >&2
+echo "$output" | grep -q 'There are many like it' || wail
+
+echo "checking for suppressed leader in supplemental TOC entry" >&2
+echo "$output" | grep -qx 'There are many like it' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/s_honor-MINGW-when-two-columns.sh b/tmac/tests/s_honor-MINGW-when-two-columns.sh
new file mode 100755
index 0000000..b7e142b
--- /dev/null
+++ b/tmac/tests/s_honor-MINGW-when-two-columns.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #62687.
+
+input='.nr MINGW 5n
+.pl 16v
+.2C
+.PP
+Sed ut perspiciatis, unde omnis iste natus error sit voluptatem
+accusantium doloremque laudantium, totam rem aperiam eaque ipsa,'
+
+output=$(printf '%s\n' "$input" | "$groff" -Tascii -P-cbou -ms)
+echo "$output"
+
+echo "$output" | grep -Eq 'Sed +ut +perspiciatis, +unde {5}[a-z]'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/s_mark-column-start-correctly.sh b/tmac/tests/s_mark-column-start-correctly.sh
new file mode 100755
index 0000000..f37be3b
--- /dev/null
+++ b/tmac/tests/s_mark-column-start-correctly.sh
@@ -0,0 +1,38 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #62686.
+
+input='.pl 15v
+.2C
+.PP
+Sed ut perspiciatis, unde omnis iste natus error sit voluptatem
+accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab
+illo inventore veritatis et quasi architecto beatae vitae dicta sunt,
+explicabo.'
+
+output=$(printf '%s\n' "$input" | "$groff" -Tascii -P-cbou -ms)
+echo "$output"
+
+echo "$output" | grep -Eq 'Sed +ut +perspiciatis, unde +voluptatem'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/s_no-excess-space-around-displays.sh b/tmac/tests/s_no-excess-space-around-displays.sh
new file mode 100755
index 0000000..a2193fe
--- /dev/null
+++ b/tmac/tests/s_no-excess-space-around-displays.sh
@@ -0,0 +1,39 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Regression-test Savannah #62688.
+
+input='.pl 19v
+.LP
+This is my first paragraph.
+.LD
+This is my block display.
+.DE
+.LP
+This is my second paragraph.'
+
+output=$(printf '%s\n' "$input" | "$groff" -Tascii -P-cbou -ms \
+ | awk '{print NR, $0}')
+
+echo "$output" | grep -Fqx '11 This is my second paragraph.'
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tests/s_rejects-too-short-page-lengths.sh b/tmac/tests/s_rejects-too-short-page-lengths.sh
new file mode 100755
index 0000000..3869838
--- /dev/null
+++ b/tmac/tests/s_rejects-too-short-page-lengths.sh
@@ -0,0 +1,61 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+groff="${abs_top_builddir:-.}/test-groff"
+
+# Page lengths that are too short cause loss of header/footer text and
+# infinite trap recursion in extreme cases.
+#
+# As of the time of this writing, bad behavior (a superfluous page
+# break) sets in at 14v, and we start to lose headers/footers at a
+# length of 13v. Get down to 7v and the traps infinitely recurse.
+
+input='.pl 7v
+.ds CF footer
+.P1 \" ensure header on page 1
+.LP
+foobar
+'
+
+fail=
+
+wail () {
+ echo "...FAILED" >&2
+ fail=YES
+}
+
+output=$(printf '%s\n' "$input" | "$groff" -Tascii -P-cbou -ms 2>&1)
+status=$?
+
+echo "checking for nonzero exit status" >&2
+test $status -ne 0 || wail
+
+# grepping diagnostic messages is a tar pit. I hope I don't come to
+# regret this.
+
+echo "checking for lack of diagnostic about infinite loop" >&2
+echo "$output" | grep -q 'troff.*fatal.*infinite' && wail
+
+echo "checking for diagnostic about page length" >&2
+echo "$output" | grep -q 's\.tmac.*page length' || wail
+
+test -z "$fail"
+
+# vim:set ai et sw=4 ts=4 tw=72:
diff --git a/tmac/tmac.am b/tmac/tmac.am
new file mode 100644
index 0000000..437297a
--- /dev/null
+++ b/tmac/tmac.am
@@ -0,0 +1,385 @@
+# Copyright (C) 1989-2020 Free Software Foundation, Inc.
+# Written by James Clark <jjc@jclark.com>
+# Automake migration by Bertrand Garrigues
+# <bertrand.garrigues@laposte.net>
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+tmac_srcdir = $(top_srcdir)/tmac
+tmac_builddir = $(top_builddir)/tmac
+
+man7_MANS += \
+ tmac/groff_ms.7 \
+ tmac/groff_man.7 \
+ tmac/groff_man_style.7 \
+ tmac/groff_me.7 \
+ tmac/groff_mdoc.7 \
+ tmac/groff_trace.7 \
+ tmac/groff_www.7
+
+TMACNORMALFILES = \
+ tmac/man.tmac \
+ tmac/mandoc.tmac \
+ tmac/andoc.tmac \
+ tmac/an-ext.tmac \
+ tmac/ms.tmac \
+ tmac/e.tmac \
+ tmac/me.tmac \
+ tmac/doc-old.tmac \
+ tmac/doc.tmac \
+ tmac/mdoc.tmac \
+ tmac/pic.tmac \
+ tmac/papersize.tmac \
+ tmac/62bit.tmac \
+ tmac/ec.tmac \
+ tmac/trace.tmac \
+ tmac/ps.tmac \
+ tmac/psold.tmac \
+ tmac/pdfpic.tmac \
+ tmac/pspic.tmac \
+ tmac/psatk.tmac \
+ tmac/ptx.tmac \
+ tmac/pdf.tmac \
+ tmac/dvi.tmac \
+ tmac/tty.tmac \
+ tmac/tty-char.tmac \
+ tmac/latin1.tmac \
+ tmac/latin2.tmac \
+ tmac/latin5.tmac \
+ tmac/latin9.tmac \
+ tmac/cp1047.tmac \
+ tmac/X.tmac \
+ tmac/Xps.tmac \
+ tmac/lj4.tmac \
+ tmac/lbp.tmac \
+ tmac/html.tmac \
+ tmac/html-end.tmac \
+ tmac/devtag.tmac \
+ tmac/europs.tmac \
+ tmac/composite.tmac \
+ tmac/fallbacks.tmac \
+ tmac/eqnrc \
+ tmac/refer.tmac \
+ tmac/refer-me.tmac \
+ tmac/refer-ms.tmac \
+ tmac/troffrc \
+ tmac/troffrc-end \
+ tmac/trans.tmac \
+ tmac/en.tmac \
+ tmac/hyphen.en \
+ tmac/hyphenex.en \
+ tmac/fr.tmac \
+ tmac/hyphen.fr \
+ tmac/it.tmac \
+ tmac/hyphen.it \
+ tmac/sv.tmac \
+ tmac/hyphen.sv \
+ tmac/de.tmac \
+ tmac/den.tmac \
+ tmac/hyphen.det \
+ tmac/hyphen.den \
+ tmac/cs.tmac \
+ tmac/hyphen.cs \
+ tmac/hyphenex.cs \
+ tmac/ja.tmac \
+ tmac/zh.tmac
+
+# files installed in tmacdir
+#
+# "s" and "an" are not "NORMAL" because they may use compatibility
+# wrappers; see install_tmac_wrap_hook.
+dist_tmac_DATA = \
+ $(TMACNORMALFILES) \
+ tmac/an.tmac \
+ tmac/s.tmac
+nodist_tmac_DATA = tmac/www.tmac
+
+TMACMDOCFILES = \
+ tmac/mdoc/doc-common \
+ tmac/mdoc/doc-ditroff \
+ tmac/mdoc/doc-nroff \
+ tmac/mdoc/doc-syms
+mdocdir=$(tmacdir)/mdoc
+# Files installed in mdocdir
+dist_mdoc_DATA = $(TMACMDOCFILES)
+
+# Installed in localtmacdir
+dist_localtmac_DATA = tmac/man.local tmac/mdoc.local
+
+MOSTLYCLEANFILES += \
+ tmac/groff_man.7.man \
+ tmac/groff_man_style.7.man \
+ tmac/www.tmac \
+ tmac/*-stamp \
+ tmac/stamp-wrap \
+ tmac/*-wrap
+
+EXTRA_DIST += \
+ tmac/fixmacros.sed \
+ tmac/groff_ms.7.man \
+ tmac/groff_man.7.man.in \
+ tmac/groff_me.7.man \
+ tmac/groff_mdoc.7.man \
+ tmac/groff_trace.7.man \
+ tmac/groff_www.7.man \
+ tmac/hyphenex.pl \
+ tmac/LOCALIZATION \
+ tmac/man.ultrix \
+ tmac/psfig.tmac \
+ tmac/ptx.tmac \
+ tmac/TESTING-HINTS \
+ tmac/TODO \
+ tmac/www.tmac.in
+
+tmac_TESTS = \
+ tmac/tests/an-ext_MR-works.sh \
+ tmac/tests/an-ext_MT-works.sh \
+ tmac/tests/an-ext_UR-works.sh \
+ tmac/tests/an_AT-and-UC-footer-saved-and-restored.sh \
+ tmac/tests/an_CS-register-off.sh \
+ tmac/tests/an_CS-register-on.sh \
+ tmac/tests/an_CS-register-unspecified.sh \
+ tmac/tests/an_CT-register-off.sh \
+ tmac/tests/an_CT-register-on.sh \
+ tmac/tests/an_CT-register-unspecified.sh \
+ tmac/tests/an_FT-bad-value-should-not-trash-titles.sh \
+ tmac/tests/an_HY-register-works.sh \
+ tmac/tests/an_LL-init-sanely.sh \
+ tmac/tests/an_ME-punct-hyphenates.sh \
+ tmac/tests/an_MR-works.sh \
+ tmac/tests/an_MT-body-hyphenates.sh \
+ tmac/tests/an_MT-works.sh \
+ tmac/tests/an_P-register-works.sh \
+ tmac/tests/an_TH-repairs-ad-damage.sh \
+ tmac/tests/an_TH-repairs-hy-damage.sh \
+ tmac/tests/an_TS-adds-no-vertical-space.sh \
+ tmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh \
+ tmac/tests/an_UE-breaks-before-long-URIs.sh \
+ tmac/tests/an_UE-punct-hyphenates.sh \
+ tmac/tests/an_UR-body-hyphenates.sh \
+ tmac/tests/an_UR-works.sh \
+ tmac/tests/an_X-register-works.sh \
+ tmac/tests/an_adjust-link-text-correctly.sh \
+ tmac/tests/an_avoid-two-font-denial-of-service.sh \
+ tmac/tests/an_do-not-abbreviate-escape-using-TH-arguments.sh \
+ tmac/tests/an_font-remapping-does-not-affect-titles.sh \
+ tmac/tests/an_handle-degenerate-input-quietly.sh \
+ tmac/tests/an_inner-footer-abbreviation-works.sh \
+ tmac/tests/an_link-macros-work-in-paragraph-tags.sh \
+ tmac/tests/an_link-trailing-text-hugs-previous.sh \
+ tmac/tests/an_no-break-after-short-paragraph-tags.sh \
+ tmac/tests/an_output-footer-when-continuously-rendering.sh \
+ tmac/tests/an_page-footers-present.sh \
+ tmac/tests/an_page-header-has-current-data.sh \
+ tmac/tests/an_reset-hyphenation-correctly.sh \
+ tmac/tests/an_title-abbreviation-works.sh \
+ tmac/tests/an_use-input-traps-correctly.sh \
+ tmac/tests/an_works-with-ec.sh \
+ tmac/tests/andoc_P-register-works.sh \
+ tmac/tests/andoc_check-an-to-doc-transition.sh \
+ tmac/tests/andoc_clear-doc-traps.sh \
+ tmac/tests/andoc_flush-between-packages.sh \
+ tmac/tests/doc_CS-works.sh \
+ tmac/tests/doc_CT-works.sh \
+ tmac/tests/doc_D-places-page-numbers-correctly.sh \
+ tmac/tests/doc_Lk-respect-sentence-ending-punctuation.sh \
+ tmac/tests/doc_Mt-works.sh \
+ tmac/tests/doc_Nm-works.sh \
+ tmac/tests/doc_P-register-works.sh \
+ tmac/tests/doc_X-register-works.sh \
+ tmac/tests/doc_accept-mixed-case-section-headings.sh \
+ tmac/tests/doc_do-not-loop-infinitely-when-shortening-headers.sh \
+ tmac/tests/doc_heading-font-remapping-works.sh \
+ tmac/tests/doc_indents-correctly.sh \
+ tmac/tests/doc_output-footer-when-continuously-rendering.sh \
+ tmac/tests/doc_smoke-test.sh \
+ tmac/tests/e_chapter-titles-work.sh \
+ tmac/tests/e_columns-work-on-long-pages.sh \
+ tmac/tests/e_delayed-text-marks-work.sh \
+ tmac/tests/e_footnote-marks-work.sh \
+ tmac/tests/e_footnotes-work-with-columns.sh \
+ tmac/tests/e_ld-works.sh \
+ tmac/tests/e_line-numbering-works.sh \
+ tmac/tests/e_rejects-too-short-page-lengths.sh \
+ tmac/tests/ec_works.sh \
+ tmac/tests/latin2_works.sh \
+ tmac/tests/latin5_works.sh \
+ tmac/tests/latin9_works.sh \
+ tmac/tests/localization-works.sh \
+ tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh \
+ tmac/tests/pdfpic_falls-back-to-PSPIC.sh \
+ tmac/tests/s_IP-indents-using-paragraph-type-size.sh \
+ tmac/tests/s_IP-respects-inter-sentence-space-in-tags.sh \
+ tmac/tests/s_PN-works.sh \
+ tmac/tests/s_R-handles-its-arguments.sh \
+ tmac/tests/s_SH-resets-IP-indentation-amount.sh \
+ tmac/tests/s_TC-works-with-percent-in-custom-titles.sh \
+ tmac/tests/s_XA-literal-no-argument-suppresses-leader.sh \
+ tmac/tests/s_honor-MINGW-when-two-columns.sh \
+ tmac/tests/s_mark-column-start-correctly.sh \
+ tmac/tests/s_no-excess-space-around-displays.sh \
+ tmac/tests/s_rejects-too-short-page-lengths.sh
+TESTS += $(tmac_TESTS)
+EXTRA_DIST += $(tmac_TESTS)
+
+tmac_XFAIL_TESTS = \
+ tmac/tests/an-ext_ME-punct-hyphenates.sh \
+ tmac/tests/an-ext_UE-punct-hyphenates.sh \
+ tmac/tests/an-ext_UE-breaks-before-long-URIs.sh \
+ tmac/tests/e_footnotes-work-with-columns.sh
+XFAIL_TESTS += $(tmac_XFAIL_TESTS)
+
+tmac/www.tmac: tmac/www.tmac.in
+ $(AM_V_at)$(MKDIR_P) $(top_builddir)/tmac
+ $(AM_V_GEN)sed -e \
+ "s;[@]PNMTOPS_NOSETPAGE[@];$(pnmtops_nosetpage);g" \
+ $(tmac_srcdir)/www.tmac.in > $(top_builddir)/tmac/www.tmac
+
+
+# Check input file for bare m4 keywords.
+M4WORDS = define|divert|include|index|shift|undefine|undivert
+M4CHECK = tmac/groff_man-passed-check-for-m4-keywords-stamp
+
+$(M4CHECK): tmac/groff_man.7.man.in
+ $(AM_V_at)! $(EGREP) \
+ '(^|[[:space:]])($(M4WORDS))($$|[[:space:]])' \
+ $(tmac_srcdir)/groff_man.7.man.in > $@
+
+tmac/groff_man.7.man: tmac/groff_man.7.man.in $(M4CHECK)
+ $(AM_V_GEN)$(M4) -D_groff_man_not_style \
+ $(tmac_srcdir)/groff_man.7.man.in > $@
+
+tmac/groff_man_style.7.man: tmac/groff_man.7.man.in $(M4CHECK)
+ $(AM_V_GEN)$(M4) -D_groff_man_style \
+ $(tmac_srcdir)/groff_man.7.man.in > $@
+
+# The installation of groff compatibility wrappers for vendor-provided
+# non-GNU macro sets is controlled by 'compatibility_wrappers' (see the
+# commentary surrounding m4/groff.m4's
+# GROFF_WITH_COMPATIBILITY_WRAPPERS). Collision detection variables of
+# the form 'tmac_<macro>_prefix' are defined in Makefile.am, to assist
+# in the installation of groff-provided macro sets.
+#
+# When 'compatibility_wrappers' is 'no', one step is performed:
+# - the groff-provided macro set implementations are installed in
+# <prefix>/share/groff/<version>/tmac/ with the original macro set
+# name
+#
+# When 'compatibility_wrappers' is 'yes', two steps are performed:
+# - the groff-provided macro set implementations are installed in
+# <prefix>/share/groff/<version>/tmac/ with a prefix of
+# $(tmac_prefix) (which is usually 'g', via the appropriate
+# collision detection variable)
+# - the generated compatibility wrappers are installed in
+# <prefix>/lib/groff/site-tmac, with the original macro set name
+#
+# When 'compatibility_wrappers' is 'manual', two steps are performed:
+# - the groff-provided macro set implementations are installed in
+# <prefix>/share/groff/<version>/tmac/ with the original macro set
+# name
+# - the generated compatibility wrappers are installed in
+# <prefix>/lib/groff/site-tmac, with a name of
+# <macro><wrapper_suffix>, (which is usually '-os', see
+# 'wrapper_suffix_default' in Makefile.am)
+
+
+all: tmac/stamp-wrap
+
+# Generate compatibility wrappers for non-GNU OS-provided macro packages
+# for which groff provides an alternative implementation.
+tmac/stamp-wrap:
+ $(AM_V_at)$(MKDIR_P) $(top_builddir)/tmac;
+ $(AM_V_at)if test -n "$(tmac_wrap)"; then \
+ for m in ""$(tmac_wrap); do \
+ $(RM) $(top_builddir)/tmac/$$m-wrap; \
+ if test "$$m" = an; then \
+ echo .do mso an.tmac >>$(top_builddir)/tmac/$$m-wrap; \
+ fi; \
+ echo .cp 1 >>$(top_builddir)/tmac/$$m-wrap; \
+ echo .so $(sys_tmac_prefix)$$m \
+ >>$(top_builddir)/tmac/$$m-wrap; \
+ done; \
+ fi
+ $(AM_V_at)touch $@
+
+# Install groff compatibility wrappers into
+# <prefix>/lib/groff/site-tmac.
+install-data-local: install_tmac_wrap
+install_tmac_wrap:
+ $(MKDIR_P) $(DESTDIR)$(systemtmacdir);
+ if test "$(compatibility_wrappers)" != "no"; then \
+ if test -n "$(tmac_wrap)"; then \
+ for m in ""$(tmac_wrap); do \
+ $(INSTALL_DATA) $(tmac_builddir)/$$m-wrap \
+ $(DESTDIR)$(systemtmacdir)/$$m$(wrapper_suffix).tmac; \
+ done; \
+ fi; \
+ fi
+
+# Rename the groff implementations of colliding macro sets to have a
+# prefix.
+install-data-hook: install_tmac_wrap_hook
+install_tmac_wrap_hook:
+ if test "$(compatibility_wrappers)" = "yes"; then \
+ if test -n "$(tmac_wrap)"; then \
+ if test -f $(DESTDIR)$(tmacdir)/s.tmac -a -n "$(tmac_s_prefix)"; \
+ then \
+ mv $(DESTDIR)$(tmacdir)/s.tmac \
+ $(DESTDIR)$(tmacdir)/$(tmac_s_prefix)s.tmac; \
+ fi; \
+ if test -f $(DESTDIR)$(tmacdir)/an.tmac -a -n "$(tmac_an_prefix)"; \
+ then \
+ mv $(DESTDIR)$(tmacdir)/an.tmac \
+ $(DESTDIR)$(tmacdir)/$(tmac_an_prefix)an.tmac; \
+ fi; \
+ fi; \
+ fi
+
+# Uninstall groff compatibility wrappers & renamed groff implementation
+# macro sets.
+uninstall_groffdirs: uninstall_tmac_hook
+uninstall_tmac_hook:
+ if test -n "$(tmac_wrap)"; then \
+ if test "$(compatibility_wrappers)" != "no"; then \
+ for m in ""$(tmac_wrap); do \
+ $(RM) $(DESTDIR)$(systemtmacdir)/$$m$(wrapper_suffix).tmac; \
+ done; \
+ fi; \
+ $(RM) -f $(DESTDIR)$(tmacdir)/$(tmac_an_prefix)an.tmac; \
+ $(RM) -f $(DESTDIR)$(tmacdir)/$(tmac_s_prefix)s.tmac; \
+ fi
+ if test -d $(DESTDIR)$(mdocdir); then \
+ rmdir $(DESTDIR)$(mdocdir); \
+ fi
+ if test -d $(DESTDIR)$(tmacdir); then \
+ rmdir $(DESTDIR)$(tmacdir); \
+ fi
+ if test -d $(DESTDIR)$(localtmacdir); then \
+ rmdir $(DESTDIR)$(localtmacdir); \
+ fi
+
+# Define convenience macros for in-tree documents to depend on. Don't
+# use these above.
+TMAC_PACKAGE_MAN = tmac/an.tmac tmac/an-ext.tmac
+TMAC_PACKAGE_MDOC = tmac/doc.tmac tmac/mdoc/doc-common \
+ tmac/mdoc/doc-ditroff tmac/mdoc/doc-nroff tmac/mdoc/doc-syms
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/tmac/trace.tmac b/tmac/trace.tmac
new file mode 100644
index 0000000..a119ae7
--- /dev/null
+++ b/tmac/trace.tmac
@@ -0,0 +1,346 @@
+.\" trace.tmac
+.\"
+.\" Load this before a macro package that you want to trace.
+.\"
+.\"
+.\" Copyright (C) 1989-2020 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 3 of the License, 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 this program. If not, see
+.\" <http://www.gnu.org/licenses/>.
+.\"
+.
+.
+.\" Tracing within groff means replacing the original macros or requests
+.\" with special versions which act as wrappers to emit tracing
+.\" information. A natural consequence of creating such wrappers is
+.\" that arguments must be expanded once more. In most cases it doesn't
+.\" matter, however, sometimes it makes a difference.
+.\"
+.\" To limit side effects, only macros are traced by default, together
+.\" with some requests like '.return' which don't take (user) arguments.
+.\" If you want more tracing, especially of number and string register
+.\" assignments, add the '-r trace-full=1' command-line option.
+.
+.
+.\" Regarding the usage of '.do': All lines of macros which should work
+.\" in compatibility mode must be protected if they contain GNU troff
+.\" extensions and are defined with '.de'. Example: '.ds', but not
+.\" '.ds1', since the latter can't be called in compatibility mode.
+.
+.
+.do if d !!!sp \
+. nx
+.
+.do nr *groff_trace_tmac_C \n[.cp]
+.cp 0
+.
+.ds !!!sp " \"
+.
+.de !!c
+..
+.
+.
+.eo
+.
+.rn return !!return
+.
+.de1 return
+. tm1 "\*[!!!sp]*** return
+. !!return twice
+..
+.
+.ec
+.
+.ie r trace-full \{\
+. eo
+.
+. rn nr !!nr
+.
+. de nr
+. do ecs
+. ec
+. do !!nr \$*
+. do tm1 "\*[!!!sp]*** .nr \$* (-> \n[\$1])
+. do ecr
+. .
+.
+. rn ds !!ds
+. rn ds1 !!ds1
+. rn as !!as
+. rn as1 !!as1
+.
+. de ds
+. do ecs
+. ec
+. do tm1 "\*[!!!sp]*** .ds \$^
+. do !!ds \$^\"
+. do ecr
+. .
+.
+. de1 ds1
+. ecs
+. ec
+. tm1 "\*[!!!sp]*** .ds1 \$^
+. !!ds1 \$^\"
+. ecr
+. .
+.
+. de as
+. do ecs
+. ec
+. do tm1 "\*[!!!sp]*** .as \$^
+. do !!as \$^\"
+. do ecr
+. .
+.
+. de1 as1
+. ecs
+. ec
+. tm1 "\*[!!!sp]*** .as1 \$^
+. !!as1 \$^\"
+. ecr
+. .
+.
+. rn substring !!substring
+.
+. de1 substring
+. ecs
+. ec
+. !!substring \$*
+. tm1 "\*[!!!sp]*** .substring \$* (-> '\*[\$1]')
+. ecr
+. .
+.
+. rn so !!so
+.
+. de so
+. do ecs
+. ec
+. do tm1 "\*[!!!sp]*** .so \$* {
+. do !!as !!!sp " \"
+. do ecr
+. do !!so \$*
+. do ecs
+. ec
+. do !!substring !!!sp 1
+. do tm1 "\*[!!!sp]*** }
+. do ecr
+. .
+.
+. !!c We must use '.de' for the redefinition of .mso to avoid
+. !!c side effects; for example, it might be called with
+. !!c '.do mso ...'.
+.
+. rn mso !!mso
+.
+. de mso
+. do ecs
+. ec
+. do tm1 "\*[!!!sp]*** .mso \$* {
+. do !!as !!!sp " \"
+. do ecr
+. do !!mso \$*
+. do ecs
+. ec
+. do !!substring !!!sp 1
+. do tm1 "\*[!!!sp]*** }
+. do ecr
+. .
+.
+. ec
+.\}
+.el \{\
+. als !!ds ds
+. als !!as as
+. als !!substring substring
+.\}
+.
+.
+.eo
+.
+.rn als !!als
+.
+.de1 als
+. ecs
+. ec
+. !!als \$*
+. if d !!\$2 \
+. !!als !!\$1 !!\$2
+. tm1 "\*[!!!sp]*** .als \$*
+. ecr
+..
+.
+.rn rm !!rm
+.
+.de1 rm
+. ecs
+. ec
+. !!rm \$*
+. if d !!\$1 \
+. !!rm !!\$1
+. tm1 "\*[!!!sp]*** .rm \$*
+. ecr
+..
+.
+.rn rn !!rn
+.
+.de rn
+. do ecs
+. ec
+. do !!rn \$*
+. do if d !!\$1 \
+. !!rn !!\$1 !!\$2
+. do tm1 "\*[!!!sp]*** .rn \$*
+. do ecr
+..
+.
+.!!c Now the central tracing macros. The redefined 'de' macros
+.!!c create wrapper macros 'foo' which emit tracing messages
+.!!c before and after the call to the traced macro '!!foo'.
+.!!c
+.!!c Note that we define '!!foo' in advance so that an alias to
+.!!c '!!!!foo' is possible. The latter occurs if 'foo' is
+.!!c called as \\[foo].
+.!!c
+.!!c The call to 'dei' must be the last instruction in the macro
+.!!c (since it continues the definition of the macro to trace).
+.
+.!!rn de !!de
+.!!rn de1 !!de1
+.
+.!!de de
+. do ecs
+. ec
+. do !!de \$1
+. do ie \\n[.br] .do !!ds !!!br .\"
+. el .do !!ds !!!br '\"
+. ie "\$1"\\$0" .do tm1 "\\*[!!!sp]*** de trace enter: \\*[!!!br]\\$0 \\$@
+. el .do tm1 "\\*[!!!sp]*** de trace enter \$1: \\*[!!!br]\\$0 \\$@
+. do !!as !!!sp " \"
+.
+. do nop \\*[!!\\$0]\\
+.
+. do !!substring !!!sp 1
+. do ie \\n[.br] .do !!ds !!!br .\"
+. el .do !!ds !!!br '\"
+. ie "\$1"\\$0" .do tm1 "\\*[!!!sp]*** trace exit: \\*[!!!br]\\$0 \\$@
+. el .do tm1 "\\*[!!!sp]*** trace exit \$1: \\*[!!!br]\\$0 \\$@
+\..
+.
+. do tm1 "\*[!!!sp]*** .de \$*
+.
+. do !!ds !!d1 !!\$1\"
+. do !!ds !!d2 \$2\"
+. do ecr
+. do dei !!d1 !!d2
+..
+.
+.!!de1 de1
+. ecs
+. ec
+. !!de1 \$1
+. ie \\n[.br] .!!ds !!!br .\"
+. el .!!ds !!!br '\"
+. ie "\$1"\\$0" .tm1 "\\*[!!!sp]*** de1 trace enter: \\*[!!!br]\\$0 \\$@
+. el .tm1 "\\*[!!!sp]*** de1 trace enter \$1: \\*[!!!br]\\$0 \\$@
+. !!as !!!sp " \"
+.
+. nop \\*[!!\\$0]\\
+.
+. !!substring !!!sp 1
+. ie \\n[.br] .!!ds !!!br .\"
+. el .!!ds !!!br '\"
+. ie "\$1"\\$0" .tm1 "\\*[!!!sp]*** trace exit: \\*[!!!br]\\$0 \\$@
+. el .tm1 "\\*[!!!sp]*** trace exit \$1: \\*[!!!br]\\$0 \\$@
+\..
+.
+. tm1 "\*[!!!sp]*** .de1 \$*
+.
+. !!ds !!d1 !!\$1\"
+. !!ds !!d2 \$2\"
+. ecr
+. dei1 !!d1 !!d2
+..
+.
+.!!rn am !!am
+.!!rn am1 !!am1
+.
+.!!de am
+. do ecs
+. ec
+. do !!de \$1
+. do ie \\n[.br] .do !!ds !!!br .\"
+. el .do !!ds !!!br '\"
+. ie "\$1"\\$0" .do tm1 "\\*[!!!sp]*** am trace enter: \\*[!!!br]\\$0 \\$@
+. el .do tm1 "\\*[!!!sp]*** am trace enter \$1: \\*[!!!br]\\$0 \\$@
+. do !!as !!!sp " \"
+.
+. do nop \\*[!!\\$0]\\
+.
+. do !!substring !!!sp 1
+. do ie \\n[.br] .do !!ds !!!br .\"
+. el .do !!ds !!!br '\"
+. ie "\$1"\\$0" .do tm1 "\\*[!!!sp]*** trace exit: \\*[!!!br]\\$0 \\$@
+. el .do tm1 "\\*[!!!sp]*** trace exit \$1: \\*[!!!br]\\$0 \\$@
+\..
+.
+. do tm1 "\*[!!!sp]*** .am \$*
+.
+. do !!ds !!a1 !!\$1\"
+. do !!ds !!a2 \$2\"
+. do ecr
+. do ami !!a1 !!a2
+..
+.
+.!!de1 am1
+. ecs
+. ec
+. !!de1 \$1
+. ie \\n[.br] .!!ds !!!br .\"
+. el .!!ds !!!br '\"
+. ie "\$1"\\$0" .tm1 "\\*[!!!sp]*** am1 trace enter: \\*[!!!br]\\$0 \\$@
+. el .tm1 "\\*[!!!sp]*** am1 trace enter \$1: \\*[!!!br]\\$0 \\$@
+. !!as !!!sp " \"
+.
+. nop \\*[!!\\$0]\\
+.
+. !!substring !!!sp 1
+. ie \\n[.br] .!!ds !!!br .\"
+. el .!!ds !!!br '\"
+. ie "\$1"\\$0" .tm1 "\\*[!!!sp]*** trace exit: \\*[!!!br]\\$0 \\$@
+. el .tm1 "\\*[!!!sp]*** trace exit \$1: \\*[!!!br]\\$0 \\$@
+\..
+.
+. tm1 "\*[!!!sp]*** .am1 \$*
+.
+. !!ds !!a1 !!\$1\"
+. !!ds !!a2 \$2\"
+. ecr
+. ami1 !!a1 !!a2
+..
+.
+.
+.ec
+.
+.cp \n[*groff_trace_tmac_C]
+.do rr *groff_trace_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/trans.tmac b/tmac/trans.tmac
new file mode 100644
index 0000000..5da114c
--- /dev/null
+++ b/tmac/trans.tmac
@@ -0,0 +1,176 @@
+.\" Localization for groff
+.\"
+.\" Copyright (C) 2006-2020 Free Software Foundation, Inc.
+.\" Written by Fabrice Ménard (menard.fabrice@wanadoo.fr)
+.\"
+.\" 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 3 of the License, 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 this program. If not, see
+.\" <http://www.gnu.org/licenses/>.
+.\"
+.\" Please send comments to menard.fabrice@wanadoo.fr.
+.
+.do nr *groff_trans_tmac_C \n[.cp]
+.cp 0
+.
+.
+.\" This file translates some predefined strings used in the packages
+.\" distributed with groff. The translations are actually done in
+.\" locale specific files (for example, fr.tmac for French) which are
+.\" also responsible for defining the string locale ('.ds locale
+.\" french').
+.\"
+.\" trans.tmac should stay locale-independent.
+.
+.\" man package
+.\"
+.\" Either an.tmac or andoc.tmac may already be loaded.
+.nr trans*is-man 0
+.
+.if d an .nr trans*is-man 1
+.if d reload-man .nr trans*is-man 1
+.
+.if \n[trans*is-man] \{\
+. als an*section1 \*[locale]-man-section1
+. als an*section2 \*[locale]-man-section2
+. als an*section3 \*[locale]-man-section3
+. als an*section4 \*[locale]-man-section4
+. als an*section5 \*[locale]-man-section5
+. als an*section6 \*[locale]-man-section6
+. als an*section7 \*[locale]-man-section7
+. als an*section8 \*[locale]-man-section8
+. als an*section9 \*[locale]-man-section9
+.\}
+.
+.rr trans*is-man
+.
+.\" ms package
+.if r GS \{\
+. als ABSTRACT \*[locale]-abstract
+. als MONTH1 \*[locale]-january
+. als MONTH10 \*[locale]-october
+. als MONTH11 \*[locale]-november
+. als MONTH12 \*[locale]-december
+. als MONTH2 \*[locale]-february
+. als MONTH3 \*[locale]-march
+. als MONTH4 \*[locale]-april
+. als MONTH5 \*[locale]-may
+. als MONTH6 \*[locale]-june
+. als MONTH7 \*[locale]-july
+. als MONTH8 \*[locale]-august
+. als MONTH9 \*[locale]-september
+. als REFERENCES \*[locale]-references
+. als TOC \*[locale]-toc
+.\}
+.
+.\" mm package
+.if d PH \{\
+. als App \*[locale]-app
+. als cov*abs-name \*[locale]-abstract
+. als Le \*[locale]-le
+. als LetAT \*[locale]-letat
+. als LetCN \*[locale]-letcn
+. als LetRN \*[locale]-letrn
+. als LetSA \*[locale]-letsa
+. als LetSJ \*[locale]-letsj
+. als Letapp \*[locale]-letapp
+. als Letdate \*[locale]-letdate
+. als Letfc \*[locale]-letfc
+. als Letns!0 \*[locale]-letns!0
+. als Letns!1 \*[locale]-letns!1
+. als Letns!10 \*[locale]-letns!10
+. als Letns!11 \*[locale]-letns!11
+. als Letns!12 \*[locale]-letns!12
+. als Letns!13 \*[locale]-letns!13
+. als Letns!14 \*[locale]-letns!14
+. als Letns!2 \*[locale]-letns!2
+. als Letns!3 \*[locale]-letns!3
+. als Letns!4 \*[locale]-letns!4
+. als Letns!5 \*[locale]-letns!5
+. als Letns!6 \*[locale]-letns!6
+. als Letns!7 \*[locale]-letns!7
+. als Letns!8 \*[locale]-letns!8
+. als Letns!9 \*[locale]-letns!9
+. als Letns!copy \*[locale]-letns!copy
+. als Letns!to \*[locale]-letns!to
+. als Lf \*[locale]-lf
+. als Licon \*[locale]-licon
+. als Liec \*[locale]-liec
+. als Liex \*[locale]-liex
+. als Lifg \*[locale]-lifg
+. als Litb \*[locale]-litb
+. als Lt \*[locale]-lt
+. als Lx \*[locale]-lx
+. als MO1 \*[locale]-january
+. als MO10 \*[locale]-october
+. als MO11 \*[locale]-november
+. als MO12 \*[locale]-december
+. als MO2 \*[locale]-february
+. als MO3 \*[locale]-march
+. als MO4 \*[locale]-april
+. als MO5 \*[locale]-may
+. als MO6 \*[locale]-june
+. als MO7 \*[locale]-july
+. als MO8 \*[locale]-august
+. als MO9 \*[locale]-september
+. als Qrf \*[locale]-qrf
+. als Rp \*[locale]-rp
+.\}
+.
+.\" me package
+.if d @R \{\
+. als wa \*[locale]-appendix_string
+. als wc \*[locale]-chapter_string
+. als _dw1 \*[locale]-sunday
+. als _dw2 \*[locale]-monday
+. als _dw3 \*[locale]-tuesday
+. als _dw4 \*[locale]-wednesday
+. als _dw5 \*[locale]-thursday
+. als _dw6 \*[locale]-friday
+. als _dw7 \*[locale]-saturday
+. als _mo1 \*[locale]-january
+. als _mo2 \*[locale]-february
+. als _mo3 \*[locale]-march
+. als _mo4 \*[locale]-april
+. als _mo5 \*[locale]-may
+. als _mo6 \*[locale]-june
+. als _mo7 \*[locale]-july
+. als _mo8 \*[locale]-august
+. als _mo9 \*[locale]-september
+. als _mo10 \*[locale]-october
+. als _mo11 \*[locale]-november
+. als _mo12 \*[locale]-december
+.\}
+.
+.\" mom package
+.if d ALIAS \{\
+. ATTRIBUTE_STRING "\*[\*[locale]-attribute_string]"
+. CHAPTER_STRING "\*[\*[locale]-chapter_string]"
+. DRAFT_STRING "\*[\*[locale]-draft_string]"
+. ENDNOTE_STRING "\*[\*[locale]-endnote_string]"
+. FINIS_STRING "\*[\*[locale]-finis_string]"
+. PAPER "\*[\*[locale]-paper]"
+. REVISION_STRING "\*[\*[locale]-revision_string]"
+. TOC_HEADER_STRING "\*[\*[locale]-toc_header_string]"
+.\}
+.
+.cp \n[*groff_trans_tmac_C]
+.do rr *groff_trans_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" coding: latin-1
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/troffrc b/tmac/troffrc
new file mode 100644
index 0000000..a2784d7
--- /dev/null
+++ b/tmac/troffrc
@@ -0,0 +1,71 @@
+.\" startup file for GNU troff
+.\"
+.\" Use .do for any groff extensions so that this file works with -C.
+.
+.\" This is tested by pic.
+.nr 0p 0
+.
+.\" Load composite mappings.
+.do mso composite.tmac
+.
+.\" Load generic fallback mappings.
+.do mso fallbacks.tmac
+.
+.\" The groff command defines the .X register if -X was given.
+.do ie r .X \
+. do ds troffrc!ps Xps.tmac
+.el \
+. do ds troffrc!ps ps.tmac
+.do ds troffrc!pdf pdf.tmac
+.do ds troffrc!dvi dvi.tmac
+.do ds troffrc!X75 X.tmac
+.do ds troffrc!X75-12 X.tmac
+.do ds troffrc!X100 X.tmac
+.do ds troffrc!X100-12 X.tmac
+.do ds troffrc!ascii tty.tmac
+.do ds troffrc!latin1 tty.tmac
+.do ds troffrc!utf8 tty.tmac
+.do ds troffrc!cp1047 tty.tmac
+.do ds troffrc!lj4 lj4.tmac
+.do ds troffrc!lbp lbp.tmac
+.do ds troffrc!html html.tmac
+.do if d troffrc!\*[.T] \
+. do mso \*[troffrc!\*[.T]]
+.do rm \
+troffrc!ps \
+troffrc!pdf \
+troffrc!dvi \
+troffrc!X75 \
+troffrc!X75-12 \
+troffrc!X100 \
+troffrc!X100-12 \
+troffrc!ascii \
+troffrc!latin1 \
+troffrc!utf8 \
+troffrc!cp1047 \
+troffrc!lj4 \
+troffrc!lbp \
+troffrc!html
+.
+.\" Test whether we work under EBCDIC and map the no-break space
+.\" character accordingly.
+.do ie '\[char97]'a' \
+. do tr \[char160]\~
+.el \
+. do tr \[char65]\~
+.
+.\" Set the input localization to English.
+.do mso en.tmac
+.
+.\" Handle paper formats on typesetting devices.
+.if t .do mso papersize.tmac
+.
+.\" Handle Encapsulated PostScript images.
+.do mso pspic.tmac
+.do mso pdfpic.tmac
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/troffrc-end b/tmac/troffrc-end
new file mode 100644
index 0000000..31b90b8
--- /dev/null
+++ b/tmac/troffrc-end
@@ -0,0 +1,34 @@
+.\" final startup file for GNU troff
+.\"
+.\" This file is parsed after all -m file arguments have been read.
+.\"
+.\" Use .do for any groff extensions so that this file works with -C.
+.
+.do if '\*[.T]'html' \
+. do mso html-end.tmac
+.
+.\" Load www if we are running the PostScript driver for HTML images.
+.do if r ps4html \
+. do mso www.tmac
+.
+.\" For all other devices, make these macros no-ops.
+.do if !d HTML-IMAGE-INLINE .do ds HTML-IMAGE-INLINE \" empty
+.do if !d HTML-IMAGE .do ds HTML-IMAGE \" empty
+.do if !d HTML-IMAGE-RIGHT .do ds HTML-IMAGE-RIGHT \" empty
+.do if !d HTML-IMAGE-LEFT .do ds HTML-IMAGE-LEFT \" empty
+.do if !d HTML-IMAGE-END .do ds HTML-IMAGE-END \" empty
+.do if !d DEVTAG .do ds DEVTAG \" empty
+.do if !d HTML-DO-IMAGE .do ds HTML-DO-IMAGE \" empty
+.do if !d EQN-HTML-IMAGE-END .do ds EQN-HTML-IMAGE-END \" empty
+.do if !d EQN-HTML-IMAGE .do ds EQN-HTML-IMAGE \" empty
+.do if !d EQN-HTML-IMAGE-RIGHT .do ds EQN-HTML-IMAGE-RIGHT \" empty
+.do if !d EQN-HTML-IMAGE-LEFT .do ds EQN-HTML-IMAGE-LEFT \" empty
+.do if !d EQN-HTML-IMAGE-INLINE .do ds EQN-HTML-IMAGE-INLINE \" empty
+.do if !d EQN-HTML-DO-IMAGE .do ds EQN-HTML-DO-IMAGE \" empty
+.do if !d EQN-HTML-IMAGE-END .do ds EQN-HTML-IMAGE-END \" empty
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/tty-char.tmac b/tmac/tty-char.tmac
new file mode 100644
index 0000000..f1443c9
--- /dev/null
+++ b/tmac/tty-char.tmac
@@ -0,0 +1,251 @@
+.\" tty-char.tmac
+.\"
+.\" This file defines standard troff characters and some groff
+.\" characters for use with -Tascii, -Tlatin1, -Tutf8, and -Tcp1047.
+.\"
+.\" These definitions are chosen so that, as far as possible, they:
+.\" - work with all of -Tascii, -Tlatin1, -Tutf8, and -Tcp1047.
+.\" - work on devices that display only the last overstruck character
+.\" as well as on devices that support overstriking
+.\" - help understanding the character's meaning, only aiming to imitate
+.\" a particular graphical shape when that doesn't hinder
+.\" understanding
+.\"
+.\" Note that the optical appearance of the definitions contained in
+.\" this file is inferior compared to those of the replacement
+.\" characters defined in the file tty.tmac.
+.\"
+.do nr *groff_tty-char_tmac_C \n[.cp]
+.cp 0
+.
+.de tty-char
+. if !c\\$1 .char \\$1 "\\$2
+..
+.
+.ie c\[a-] \
+. ds tty-rn \[a-]
+.el \
+. ds tty-rn \v'-1m'_\v'+1m'
+.tty-char \[tm] tm
+.tty-char \[rn] \*[tty-rn]
+.tty-char \[ua] \z|^
+.tty-char \[da] \z|v
+.tty-char \[sc] <section>
+.tty-char \[ct] \z/c
+.tty-char \[dg] <*>
+.tty-char \[dd] <**>
+.tty-char \[ib] <subset\~or\~equal>
+.tty-char \[ip] <superset\~or\~equal>
+.tty-char \[sb] <proper\~subset>
+.tty-char \[sp] <proper\~superset>
+.tty-char \[nb] <not\~subset>
+.tty-char \[nc] <not\~superset>
+.tty-char \[if] <infinity>
+.tty-char \[pt] <proportional\~to>
+.tty-char \[es] {}
+.tty-char \[ca] <intersection>
+.tty-char \[cu] <union>
+.tty-char \[de] <degree>
+.tty-char \[di] /
+.tty-char \[tdi] /
+.tty-char \[no] ~
+.tty-char \[tno] ~
+.tty-char \[gr] <nabla>
+.tty-char \[is] <integral>
+.tty-char \[integral] <integral>
+.tty-char \[sum] <sum>
+.tty-char \[product] <product>
+.tty-char \[coproduct] <coproduct>
+.tty-char \[mo] <element\~of>
+.tty-char \[pd] <del>
+.tty-char \[sr] <sqrt>
+.tty-char \[sqrt] <sqrt>
+.tty-char \[*C] <Xi>
+.tty-char \[*D] <Delta>
+.tty-char \[*F] <Phi>
+.tty-char \[*G] <Gamma>
+.tty-char \[*H] <Theta>
+.tty-char \[*L] <Lambda>
+.tty-char \[*P] <Pi>
+.tty-char \[*Q] <Psi>
+.tty-char \[*S] <Sigma>
+.tty-char \[*W] <Omega>
+.tty-char \[*b] <beta>
+.tty-char \[*a] <alpha>
+.tty-char \[*c] <xi>
+.tty-char \[*d] <delta>
+.tty-char \[*e] <epsilon>
+.tty-char \[+e] <epsilon>
+.tty-char \[*f] <phi>
+.tty-char \[+f] <phi>
+.tty-char \[*g] <gamma>
+.tty-char \[*h] <theta>
+.tty-char \[+h] <theta>
+.tty-char \[*i] <iota>
+.tty-char \[*k] <kappa>
+.tty-char \[*l] <lambda>
+.tty-char \[*m] <mu>
+.tty-char \[*n] <nu>
+.tty-char \[*p] <pi>
+.tty-char \[+p] <pi>
+.tty-char \[*q] <psi>
+.tty-char \[*r] <rho>
+.tty-char \[*s] <sigma>
+.tty-char \[*t] <tau>
+.tty-char \[*u] <upsilon>
+.tty-char \[*w] <omega>
+.tty-char \[*x] <chi>
+.tty-char \[*y] <eta>
+.tty-char \[*z] <zeta>
+.tty-char \[ts] <sigma>
+.tty-char \[ss] ss
+.tty-char \[c*] \zO\[mu]
+.tty-char \[c+] \zO+
+.tty-char \[AN] ^
+.tty-char \[OR] v
+.tty-char \[uA] \z=^
+.tty-char \[dA] \z=v
+.if c\[md] .tty-char \[pc] \[md]
+.if c\[pc] .tty-char \[md] \[pc]
+.ie c\[pc] .tty-char \[a.] \[pc]
+.el .tty-char \[a.] .
+.tty-char \[Im] <Im>
+.tty-char \[Re] <Re>
+.tty-char \[/L] \z/L
+.tty-char \[/l] \z/l
+.tty-char \[%0] <permille>
+.tty-char \[ao] o
+.tty-char \[a"] """"
+.tty-char \[ab] \z'`
+.tty-char \[ah] v
+.tty-char \[ho] \[ac]
+.tty-char \[/_] <angle>
+.tty-char \[=~] =~
+.tty-char \[|=] -~
+.tty-char \[Ah] <Aleph>
+.tty-char \[CR] <cr>
+.tty-char \[fa] <for\~all>
+.tty-char \[nm] <not\~element\~of>
+.tty-char \[pp] <perpendicular>
+.tty-char \[st] <such\~that>
+.tty-char \[te] <there\~exists>
+.if c\[md] .tty-char \[tf] .\[md].
+.tty-char \[tf] <therefore>
+.if c\[md] .tty-char \[3d] .\[md].
+.tty-char \[3d] <therefore>
+.tty-char \[wp] p
+.tty-char \[~~] ~~
+.tty-char \[Fn] \z,f
+.tty-char \[Bq] ,,
+.tty-char \[lz] <>
+.tty-char \[lf] |_
+.tty-char \[rf] _|
+.tty-char \[lc] |~
+.tty-char \[rc] ~|
+.tty-char \[lb] `-
+.tty-char \[rb] -'
+.tty-char \[lk] {
+.tty-char \[rk] }
+.tty-char \[lt] ,-
+.tty-char \[rt] -.
+.tty-char \[CL] C
+.tty-char \[SP] S
+.tty-char \[HE] H
+.tty-char \[DI] D
+.\" Latin characters
+.tty-char \[r!] !
+.tty-char \[Po] \z-L
+.tty-char \[Cs] \zox
+.tty-char \[Ye] \z=Y
+.tty-char \[bb] |
+.tty-char \[ad] """"
+.tty-char \[Of] \z_a
+.tty-char \[Fo] <<
+.tty-char \[a-] \*[tty-rn]
+.tty-char \[S2] ^2
+.tty-char \[S3] ^3
+.tty-char \[ps] <paragraph>
+.tty-char \[md] .
+.tty-char \[pc] .
+.tty-char \[ac] ,
+.tty-char \[S1] ^1
+.tty-char \[Om] \z_o
+.tty-char \[Fc] >>
+.tty-char \[r?] ?
+.tty-char \[`A] \z`A
+.tty-char \['A] \z'A
+.tty-char \[^A] \z^A
+.tty-char \[~A] \z~A
+.tty-char \[:A] \z"A
+.tty-char \[oA] \zoA
+.tty-char \[,C] \z,C
+.tty-char "\[S ,]" \z,S
+.tty-char \[`E] \z`E
+.tty-char \['E] \z'E
+.tty-char \[^E] \z^E
+.tty-char \[:E] \z"E
+.tty-char \[`I] \z`I
+.tty-char \['I] \z'I
+.tty-char \[^I] \z^I
+.tty-char \[:I] \z"I
+.tty-char \[-D] Dh
+.tty-char \[~N] \z~N
+.tty-char \[`O] \z`O
+.tty-char \['O] \z'O
+.tty-char \[^O] \z^O
+.tty-char \[~O] \z~O
+.tty-char \[:O] \z"O
+.tty-char \[/O] \z/O
+.tty-char \[`U] \z`U
+.tty-char \['U] \z'U
+.tty-char \[^U] \z^U
+.tty-char \[:U] \z"U
+.tty-char \['Y] \z'Y
+.tty-char \[TP] Th
+.tty-char \[`a] \z`a
+.tty-char \['a] \z'a
+.tty-char \[^a] \z^a
+.tty-char \[~a] \z~a
+.tty-char \[:a] \z"a
+.tty-char \[oa] \zoa
+.tty-char \[,c] \z,c
+.tty-char "\[s ,]" \z,s
+.tty-char \[`e] \z`e
+.tty-char \['e] \z'e
+.tty-char \[^e] \z^e
+.tty-char \[:e] \z"e
+.tty-char \[`i] \z`i
+.tty-char \['i] \z'i
+.tty-char \[^i] \z^i
+.tty-char \[:i] \z"i
+.tty-char \[Sd] dh
+.tty-char \[~n] \z~n
+.tty-char \[`o] \z`o
+.tty-char \['o] \z'o
+.tty-char \[^o] \z^o
+.tty-char \[~o] \z~o
+.tty-char \[:o] \z"o
+.tty-char \[/o] \z/o
+.tty-char \[`u] \z`u
+.tty-char \['u] \z'u
+.tty-char \[^u] \z^u
+.tty-char \[:u] \z"u
+.tty-char \['y] \z'y
+.tty-char \[Tp] th
+.tty-char \[:y] \z"y
+.\" for Turkish
+.tty-char "\[G ab]" G
+.tty-char "\[g ab]" g
+.tty-char "\[I .]" I
+.\"tty-char \[:y] \ij
+.tty-char \[arrowvertex] |
+.tty-char \[mc] <micro>
+.
+.cp \n[*groff_tty-char_tmac_C]
+.do rr *groff_tty-char_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/tty.tmac b/tmac/tty.tmac
new file mode 100644
index 0000000..35a527c
--- /dev/null
+++ b/tmac/tty.tmac
@@ -0,0 +1,100 @@
+.\" tty.tmac
+.\"
+.do nr *groff_tty_tmac_C \n[.cp]
+.cp 0
+.
+.nroff
+.ta T 0.8i
+.
+.po 0
+.
+.if !'\*[.T]'utf8' \{\
+. ie c\[pc] \
+. tr \[bu]\[pc]
+. el \
+. if c\[md] \
+. tr \[bu]\[md]
+.\}
+.
+.fchar \[bu] \z+o
+.fchar \[14] 1/4
+.fchar \[12] 1/2
+.fchar \[34] 3/4
+.fchar \[18] 1/8
+.fchar \[38] 3/8
+.fchar \[58] 5/8
+.fchar \[78] 7/8
+.fchar \[ff] ff
+.fchar \[fi] fi
+.fchar \[fl] fl
+.fchar \[Fi] f\[fi]
+.fchar \[Fl] f\[fl]
+.fchar \[<-] <-
+.fchar \[->] ->
+.fchar \[<>] <->
+.fchar \[em] --
+.fchar \[+-] +-
+.fchar \[t+-] +-
+.fchar \[-+] -+
+.fchar \[co] (C)
+.fchar \[<=] <=
+.fchar \[>=] >=
+.fchar \[<<] <<
+.fchar \[>>] >>
+.fchar \[!=] !=
+.fchar \[==] ==
+.fchar \[ne] !==
+.fchar \[~=] ~=
+.fchar \[sq] []
+.fchar \[lh] <=
+.fchar \[rh] =>
+.fchar \[lA] <=
+.fchar \[rA] =>
+.fchar \[hA] <=>
+.fchar \[rg] (R)
+.fchar \[OE] OE
+.fchar \[oe] oe
+.fchar \[AE] AE
+.fchar \[ae] ae
+.fchar \[IJ] IJ
+.fchar \[ij] ij
+.fchar \[an] -
+.fchar \[eu] EUR
+.fchar \[Eu] EUR
+.fchar \[.i] i
+.fchar \[.j] j
+.fchar \[bq] ,
+.fchar \[fm] \[aq]
+.fchar \[sd] \[dq]
+.fchar \[bs] \~
+.fchar \[radicalex] \[rn]
+.fchar \[sqrtex] \[rn]
+.
+.\" color definitions
+.defcolor black rgb #000000
+.defcolor red rgb #ff0000
+.defcolor green rgb #00ff00
+.defcolor blue rgb #0000ff
+.defcolor yellow rgb #ffff00
+.defcolor magenta rgb #ff00ff
+.defcolor cyan rgb #00ffff
+.defcolor white rgb #ffffff
+.
+.ie '\*(.T'cp1047' \
+. mso cp1047.tmac
+.el \
+. if !'\*(.T'ascii' \
+. mso latin1.tmac
+.
+.\" If you want the character definitions in tty-char.tmac to be loaded
+.\" automatically, remove the '\"' from the next line.
+.\"mso tty-char.tmac
+.
+.cp \n[*groff_tty_tmac_C]
+.do rr *groff_tty_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/www.tmac.in b/tmac/www.tmac.in
new file mode 100644
index 0000000..658d231
--- /dev/null
+++ b/tmac/www.tmac.in
@@ -0,0 +1,1638 @@
+.ig
+www.tmac - macro package for adding HTML elements to roff documents.
+
+------------------------------------------------------------------------
+ Legalese
+------------------------------------------------------------------------
+
+This file is part of groff, the GNU roff type-setting system.
+
+Copyright (C) 2001-2020 Free Software Foundation, Inc.
+written by Gaius Mulley <gaius@glam.ac.uk>, with additions by
+Werner Lemberg <wl@gnu.org> and
+Bernd Warken <groff-bernd.warken-72@web.de>.
+
+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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+------------------------------------------------------------------------
+ Description
+------------------------------------------------------------------------
+
+A simple set of macros to provide HTML (or XHTML) documents with basic
+www functionality. It should work with any macro set. In the
+following, HTML always denotes XHTML also.
+..
+.
+.
+.\" --------------------------------------------------------------------
+.\" Setup
+.\" --------------------------------------------------------------------
+.
+.do if d www:lenstr .nx
+.
+.do nr *groff_www_tmac_in_C \n[.cp]
+.cp 0
+.
+.mso devtag.tmac
+.
+.
+.\" Taken from tmac/an-ext.tmac
+.\" Map mono-width fonts to standard fonts for groff's TTY device.
+.if n \{\
+. do ftr CR R
+. do ftr CW R
+. do ftr CI I
+. do ftr CB B
+.\}
+.
+.ie r xhtml \
+. ds www-> />\"
+.el \
+. ds www-> >\"
+.
+.nr www-html 0
+.if '\*[.T]'html' \
+. nr www-html 1
+.
+.\" set up www-image-template
+.
+.if !d www-image-template \
+. ds www-image-template
+.
+.if r ps4html \{\
+. \" remove the title command when we are generating images for HTML
+. \" (stops a title accidentally appearing inside an image)
+. di www-notitle
+. tl ''''
+. di
+. rm tl
+. de tl
+. .
+.\}
+.
+.
+.\" --------------------------------------------------------------------
+.\" Test for '.substring'; result in register 'www.substring_ok'.
+.\" The automated break points in .URL addresses are only added if
+.\" this register is non-zero.
+.\"
+.nr www:substring_ok 0
+.de www:@test_substring
+. if !d substring \
+. return
+. ds \\$0:s abcdefg\"
+. substring \\$0:s 1 1
+. if !'\\*[\\$0:s]'b' \{\
+. rm \\$0:s
+. return
+. \}
+. ds \\$0:s abcdefg\"
+. substring \\$0:s 0 0
+. if !'\\*[\\$0:s]'a' \{\
+. rm \\$0:s
+. return
+. \}
+. ds \\$0:s abcdefg\"
+. substring \\$0:s 1 -1
+. if !'\\*[\\$0:s]'bcdefg' \{\
+. rm \\$0:s
+. return
+. \}
+. nr www:substring_ok 1
+. rm \\$0:s
+..
+.www:@test_substring
+.rm www:@test_substring
+.
+.
+.\" --------------------------------------------------------------------
+.\" Local Macros
+.\" --------------------------------------------------------------------
+.
+.\" --------------------------------------------------------------------
+.\" www:paraspace
+.\"
+.\" Space before paragraph. Use \n[PD] if it exists.
+.\"
+.nr www:pd 0.5v
+.
+.de www:paraspace
+. ie r PD \
+. sp \\n[PD]u
+. el \
+. sp \\n[www:pd]u
+..
+.
+.\" --------------------------------------------------------------------
+.\" www:error (<test>...)
+.\"
+.\" Print error message.
+.\"
+.de www-error
+. tm \\n[.F]:\\n[.c]: macro error: \\$*
+..
+.
+.als www:error www-error
+.
+.\" --------------------------------------------------------------------
+.\" www:fatal (<test>...)
+.\"
+.\" Print fatal error message and abort.
+.\"
+.de www-fatal
+. ab \\n[.F]:\\n[.c]: fatal macro error: \\$*
+..
+.
+.als www:fatal www-fatal
+.
+.\" --------------------------------------------------------------------
+.\" www:lenstr (<register_name> <string_name>)
+.\"
+.\" Store length of string named <string_name> into register named
+.\" <register_name>.
+.\"
+.de www:lenstr
+. if !(\\n[.$] == 2) \
+. www:fatal .\\$0 expects 2 arguments, got \\n[.$]
+. length \\$0:n x\\*[\\$2]
+. nr \\$1 (\\n[\\$0:n] - 1)
+. rr \\$0:n
+..
+.
+.\" --------------------------------------------------------------------
+.\" www:splitstr (<name>)
+.\"
+.\" Add a space character between any two adjacent characters in string
+.\" <name> and restore result into the string variable <name>; space
+.\" characters are first replaced by the word 'space'.
+.\"
+.de www:splitstr
+. if !(\\n[.$] == 1) \
+. www:error .\\$0 expects 1 argument, got \\n[.$]
+. if '\\*[\\$1]'' \
+. return
+. ds \\$0:r "\\*[\\$1]\"
+. ds \\$0:s
+. while 1 \{\
+. ds \\$0:c "\\*[\\$0:r]\"
+. substring \\$0:c 0 0
+. ie '\\*[\\$0:c]' ' \
+. as \\$0:s " space\"
+. el \
+. as \\$0:s " \\*[\\$0:c]\"
+. www:lenstr \\$0:n \\$0:r
+. if (\\n[\\$0:n] <= 1) \
+. break
+. substring \\$0:r 1 -1
+. \}
+. if !'\\*[\\$0:s]'' \
+. substring \\$0:s 1 -1
+. ds \\$1 \\*[\\$0:s]\"
+. rm \\$0:c
+. rr \\$0:n
+. rm \\$0:r
+. rm \\$0:s
+..
+.
+.\" --------------------------------------------------------------------
+.\" www:url_breaks (<string_name>)
+.\"
+.\" Add '\:' (possible break point) within URL strings after '/'.
+.\"
+.\" Smart about multiple '/', existing '\:', and space characters;
+.\" does not set a break point if less than 5 characters would go to
+.\" the next line.
+.\"
+.de www:url_breaks
+. if !(\\n[.$] == 1) \
+. www:error .\\$0 expects 1 argument, got \\n[.$]
+. if !\n[www:substring_ok] \
+. return
+. ds \\$0:s "\\*[\\$1]\"
+. www:splitstr \\$0:s
+. www:url_breaks_split \\$0:s \\*[\\$0:s]
+. ds \\$1 "\\*[\\$0:s]\"
+. rm \\$0:s
+..
+.
+.\" --------------------------------------------------------------------
+.\" www:url_breaks_split (<result> <char> [<char>...])
+.\"
+.\" Add '\:' within URL strings, but arguments are a split string.
+.\"
+.\" Arguments: >=2: <result> <char> [<char>...]
+.\"
+.de www:url_breaks_split
+. nr \\$0:min 5 \" minimal number of characters for next line
+. if (\\n[.$] < 2) \
+. www:error .\\$0 expects at least 2 arguments, got \\n[.$]
+. ds \\$0:res \\$1\"
+. shift
+. ds \\$0:s
+. nr \\$0:done 0
+. while !\\n[\\$0:done] \{\
+. if (\\n[.$] <= 0) \
+. break
+. if '\\$1'space' \{\
+. as \\$0:s " \"
+. shift
+. continue
+. \}
+. if (\\n[.$] < \\n[\\$0:min]) \{\
+. as \\$0:s "\\$1\"
+. shift
+. continue
+. \}
+. if !'\\$1'/' \{\
+. as \\$0:s "\\$1\"
+. shift
+. continue
+. \}
+. \" we are at a '/' character
+. while '\\$1'/' \{\
+. as \\$0:s /\"
+. if (\\n[.$] == 0) \{\
+. nr \\$0:done 1
+. break
+. \}
+. shift
+. \}
+. if \\n[\\$0:done] \
+. break
+. if (\\n[.$] < \\n[\\$0:min]) \
+. continue
+. if '\\$1'\:' \
+. shift
+. as \\$0:s \:\"
+. \}
+. ds \\*[\\$0:res] \\*[\\$0:s]\"
+. rm \\$0:res
+. rm \\$0:s
+..
+.
+.
+.\" --------------------------------------------------------------------
+.\" User Interface
+.\" --------------------------------------------------------------------
+.
+.\" --------------------------------------------------------------------
+.\" HTML
+.\"
+.\" The main auxiliary macro for the HTML interface.
+.\"
+.de HTML
+. if \\n[www-html] \{\
+. \" was implemented via .nop \&\X^html:\\$*^ but
+. \" is now implemented using HTML-NS to utilize code factoring.
+. \"
+. \" the '\&' makes the vertical mode leave, so to say
+. \"
+. nop \&\c
+. HTML-NS \\$*
+. nop \&
+. \}
+..
+.
+.\"
+.\" An auxiliary macro for HTML (without following space).
+.\"
+.de HTML-NS
+. nop \X^html:\\$*^\c
+..
+.
+.\"
+.\" Emit an HTML tag after shutting down a (possibly open) paragraph.
+.\"
+.de HTML</p>
+. ie \\n[www-html] \{\
+. \" the '\&' makes the vertical mode leave, so to say
+. nop \&\X^html</p>:\\$*^
+. \}
+. el \
+. www:paraspace
+..
+.
+.\"
+.\" Emit an HTML tag. If text has been written in the paragraph
+.\" then do not shut the paragraph down.
+.\" If text was not written, remove the empty
+.\" paragraph tag and emit the desired HTML tag.
+.\"
+.de HTML<?p>
+. if \\n[www-html] \
+. nop \&\X^html<?p>:\\$*^
+..
+.
+.\"
+.\" Emit a MATH tag. If text has been written in the paragraph
+.\" then do not shut the paragraph down.
+.\" If text was not written, remove the empty
+.\" paragraph tag and emit the desired math tag.
+.\"
+.de MATH<?p>
+. if \\n[www-html] \
+. nop \&\X^math<?p>:\\$*^
+..
+.
+.\" --------------------------------------------------------------------
+.\" HX n
+.\"
+.\" Automatic heading level cut off.
+.\"
+.\" N is the depth limit of automatically linked headings. So a depth
+.\" of 2 would cause grohtml to generate a list of links for '.NH 1'
+.\" and '.NH 2' but not for '.NH 3'.
+.\"
+.de HX
+. if \\n[www-html] \
+. nop \X^index:\\$*^
+..
+.
+.\" --------------------------------------------------------------------
+.\" BCL foreground background active not-visited visited
+.\"
+.de BCL
+. HTML <body "text=""\\$1""" \
+ "bgcolor=""\\$2""" \
+ "link=""\\$3""" \
+ "alink=""\\$4""" \
+ "vlink=""\\$5"">"
+..
+.
+.\" --------------------------------------------------------------------
+.\" BGIMG imagefile
+.\"
+.de BGIMG
+. HTML <body "background=""\\$1"">"
+..
+.
+.\" www:url_check_tag str
+.\" If url named by \*[str] is internal (starts with #),
+.\" redefine \*[str] to be the value of the string TAG_url.
+.
+.de www:url_check_tag
+. ds \\$0:tmp \\*[\\$1]\"
+. substring \\$0:tmp 0 0
+. if '\\*[\\$0:tmp]'#' \{\
+. ds \\$0:tmp \\*[\\$1]\"
+. substring \\$0:tmp 1
+. ds \\$0:tmp TAG_\\*[\\$0:tmp]\"
+.
+. ie d \\*[\\$0:tmp] \
+. ds \\$1 \\*[\\*[\\$0:tmp]]\"
+. el \
+. ds \\$1 see below\"
+. \}
+. rm \\$0:tmp
+..
+.
+.\" --------------------------------------------------------------------
+.\" URL url [description] [after]
+.\"
+.\" If description is absent then the url becomes the anchor text.
+.\"
+.de URL
+. if !'\\$1'' \{\
+. ds \\$0:adr \\$1\"
+. www:url_check_tag \\$0:adr
+. if !\\n[www-html] \
+. www:url_breaks \\$0:adr
+. \}
+. ie \\n[www-html] \{\
+. ie '\\$3'' \
+. ds \\$0:after \&\"
+. el \
+. ds \\$0:after \&\\$3\"
+.
+. ie '\\$2'' \
+. HTML-NS <a "href=""\\$1"">\\*[\\$0:adr]</a>"
+. el \
+. HTML-NS <a "href=""\\$1"">\\$2</a>"
+.
+. nop \\*[\\$0:after]
+. rm \\$0:after
+. \}
+. el \{\
+. if !r ps4html \
+. ad l
+.
+. ie '\\$2'' \{\
+. ie '\\$1'' \{\
+. if !'\\$3'' \
+. nop \\$3
+. \}
+. el \{\
+. ie \\n[.color] \
+. nop \%\\*[www:open]\m[\\*[www:color]]\f[\\*[www:fontstyle]]\\*[\\$0:adr]\f[]\m[]\\*[www:close]\\$3
+. el \
+. nop \%\\*[www:open]\f[\\*[www:fontstyle]]\\*[\\$0:adr]\f[]\\*[www:close]\\$3
+. \}
+. \}
+. el \{\
+. ie '\\$1'' \{\
+. ie \\n[.color] \
+. nop \m[\\*[www:color]]\\$2\m[]\\$3
+. el \
+. nop \f[\\*[www:fontstyle]]\\$2\f[]\\$3
+. \}
+. el \{\
+. ie \\n[.color] \{\
+. nop \m[\\*[www:color]]\\$2\m[]
+. nop \%\\*[www:open]\f[\\*[www:fontstyle]]\\*[\\$0:adr]\f[]\\*[www:close]\\$3
+. \}
+. el \{\
+. nop \f[\\*[www:fontstyle]]\\$2\f[]
+. nop \%\\*[www:open]\f[\\*[www:fontstyle]]\\*[\\$0:adr]\f[]\\*[www:close]\\$3
+. \}
+. \}
+. \}
+.
+. if !r ps4html \
+. ad
+. \}
+. rm \\$0:adr
+..
+.
+.\" --------------------------------------------------------------------
+.\" FTP url description [after]
+.\"
+.\" Same as URL.
+.\"
+.als FTP URL
+.
+.\" --------------------------------------------------------------------
+.\" MTO address description [after]
+.\"
+.\" ADDRESS is the email address (without the 'mailto:' prefix).
+.\"
+.\" DESCRIPTION is the optional name. If an empty argument is given,
+.\" ADDRESS is used instead.
+.\"
+.\" AFTER is optional stuff printed immediately after ADDRESS
+.\" (resp. DESCRIPTION).
+.\"
+.\" Example:
+.\"
+.\" Foobar has been written by
+.\" .MTO fred@foo.bar "Fredrick Bloggs" .
+.\"
+.de MTO
+. ie \\n[www-html] \{\
+. ie '\\$2'' \
+. URL mailto:\\$1 \\$1 "\\$3"
+. el \
+. URL mailto:\\$1 "\\$2" "\\$3"
+. \}
+. el \{\
+. ie '\\$2'' \{\
+. ie '\\$1'' \{\
+. ie !'\\$3'' \
+. nop \\$3
+. \}
+. el \{\
+. ie \\n[.color] \
+. nop \%\m[\\*[www:color]]\f[\\*[www:fontstyle]]\\$1\f[]\m[]\\$3
+. el \
+. nop \%\f[\\*[www:fontstyle]]\\$1\f[]\\$3
+. \}
+. \}
+. el \{\
+. ie '\\$1'' \{\
+. ie \\n[.color] \
+. nop \m[\\*[www:color]]\\$2\m[]\\$3
+. el \
+. nop \f[\\*[www:fontstyle]]\\$2\f[]\\$3
+. \}
+. el \{\
+. ie \\n[.color] \{\
+. nop \m[\\*[www:color]]\\$2\m[]
+. nop \%\\*[www:open]\f[\\*[www:fontstyle]]\\$1\f[]\\*[www:close]\\$3
+. \}
+. el \{\
+. nop \f[\\*[www:fontstyle]]\\$2\f[]
+. nop \%\\*[www:open]\f[\\*[www:fontstyle]]\\$1\f[]\\*[www:close]\\$3
+. \}
+. \}
+. \}
+. \}
+..
+.
+.\" --------------------------------------------------------------------
+.\" TAG name [text]
+.\"
+.\" Generate an HTML name NAME.
+.\" Define string TAG_NAME to TEXT, if present, otherwise to \n[PN].
+.\" Register PN is the current page number.
+.\"
+.de TAG
+. HTML <a "name=""\\$1""></a>"
+. ie '\\$2'' \
+. if !rPN \
+. nr PN \\n%
+. ds TAG_\\$1 \\n[PN]\"
+. el \
+. ds TAG_\\$1 \\$2\"
+..
+.
+.\" --------------------------------------------------------------------
+.\" IMG [-R|-L|-C] filename [width] [height]
+.\"
+.\" Include an image of any type (only works for -Thtml).
+.\"
+.\" Alignment is centered by default (-C).
+.\" Default value for WIDTH is 1i.
+.\" If HEIGHT is not given, WIDTH is used as the height.
+.\"
+.de IMG
+. ie \\n[www-html] \{\
+. ie '\\$2'-R' \
+. DEVTAG .right-image
+. el \{\
+. ie '\\$2'-L' \
+. DEVTAG .left-image
+. el \
+. DEVTAG .centered-image
+. \}
+. nr www-width 100
+. if !'\\$3'' \
+. nr www-width \\$3
+. nr www-height \\n[www-width]
+. if !'\\$4'' \
+. nr www-height \\$4
+. HTML <img "src=""\\$1""" \
+ "alt=""Image \\$1""" \
+ "width=""\\n[www-width]""" \
+ "height=""\\n[www-height]""\\*[www->]"
+. \}
+. el \
+. nop \\*[www:open]\f[\\*[www:fontstyle]]\\$1\f[]\\*[www:close]
+..
+.
+.\" --------------------------------------------------------------------
+.\" PIMG [-R|-L|-C] filename [width] [height]
+.\"
+.\" Include a PNG image. It works for -Tps and -Thtml.
+.\" The default value for WIDTH and HEIGHT is zero; the default
+.\" alignment is centering (-C).
+.\"
+.\" Note: This macro can only be used with the '-U' option of groff,
+.\" activating unsafe mode, if not used with -Thtml; the PNG image
+.\" is then converted to the EPS format using netpbm utilities.
+.\"
+.de PIMG
+. ds www-pic-align -C\"
+. ie '\\$1'-R' \{\
+. ds www-pic-align -R\"
+. shift
+. \}
+. el \{\
+. if '\\$1'-L' \{\
+. ds www-pic-align -L\"
+. shift
+. \}
+. \}
+. if '\\$1'-C' \
+. shift
+.
+. ie \\n[www-html] \{\
+. ds www-htmlalign align="center"\"
+. if '\\*[www-pic-align]'-R' \
+. ds www-htmlalign align="right"\"
+. if '\\*[www-pic-align]'-L' \
+. ds www-htmlalign align="left"\"
+.
+. nr www-width 0
+. nr www-height 0
+. if !'\\$2'' \
+. nr www-width (\\$3 * 100 / 240)
+. if !'\\$3'' \
+. nr www-height (\\$4 * 100 / 240)
+. ie (\\n[www-width] == 0) \{\
+. ie (\\n[www-height] == 0) \
+. HTML</p> <p \\*[www-htmlalign]><img "src=""\\$1""" \
+ "alt=""Image \\$1""\\*[www->]</p>"
+. el \
+. HTML</p> <p \\*[www-htmlalign]><img "src=""\\$1""" \
+ "alt=""Image \\$1""" \
+ "height=""\\n[www-height]""\\*[www->]</p>"
+. \}
+. el \{\
+. ie (\\n[www-height] == 0) \
+. HTML</p> <p \\*[www-htmlalign]><img "src=""\\$1""" \
+ "alt=""Image \\$1""" \
+ "width=""\\n[www-width]""\\*[www->]</p>"
+. el \
+. HTML</p> <p \\*[www-htmlalign]><img "src=""\\$1""" \
+ "alt=""Image \\$1""" \
+ "width=""\\n[www-width]""" \
+ "height=""\\n[www-height]""\\*[www->]</p>"
+. \}
+. \}
+. el \{\
+. if !r ps4html \{\
+. www-make-unique-name
+. sy pngtopnm \\$1 \
+ | pnmcrop -white \
+ | @PNMTOPS_NOSETPAGE@ -noturn \
+ > \\*[www-unique-name].eps
+. shift
+. PSPIC \\*[www-pic-align] \\*[www-unique-name].eps \\$*
+. \}
+. \}
+..
+.
+.\" --------------------------------------------------------------------
+.\" auxiliary definitions for MPIMG
+.\"
+.nr www-left-ll-trap 0
+.nr www-left-po-trap 0
+.nr www-right-ll-trap 0
+.
+.de www-finish-left-po
+. po -(\\n[www-left-indent]u + \\n[www-image-gap]u)
+. wh \\n[www-left-po-trap]u
+. nr www-left-indent 0
+..
+.
+.\" called when the -R picture is finished
+.de www-finish-right-ll
+. ll +(\\n[www-right-indent]u + \\n[www-image-gap]u)
+.
+. \" now check whether we need to inline www-finish-left-ll
+. if (\\n[www-left-ll-trap]u > 0) \
+. if ((\\n[www-right-ll-trap]u + 1v) >= \\n[www-left-ll-trap]u) \{\
+. mk www-left-po-trap
+. nr www-left-po-trap +1v
+. wh \\n[www-left-po-trap]u www-finish-left-po
+. ll +\\n[www-left-indent]u
+. wh \\n[www-left-ll-trap]u
+. nr www-left-ll-trap 0
+. \}
+.
+. \" and check whether we need to inline www-finish-left-po
+. if (\\n[www-left-po-trap]u > 0) \
+. if ((\\n[www-right-ll-trap]u + 1v) >= \\n[www-left-po-trap]u) \{\
+. po -\\n[www-left-indent]u
+. wh \\n[www-left-po-trap]u
+. nr www-left-indent 0
+. \}
+.
+. wh \\n[www-right-ll-trap]u
+. nr www-right-ll-trap 0
+..
+.
+.de www-finish-left-ll
+. if (\\n[www-right-ll-trap] > 0) \
+. if ((\\n[www-left-ll-trap] + 1v) >= \\n[www-right-ll-trap]) \{\
+. ll +\\n[www-right-indent]u
+. nr www-right-ll-trap 0
+. \}
+.
+. mk www-left-po-trap
+. nr www-left-po-trap +1v
+. wh \\n[www-left-po-trap]u www-finish-left-po
+. ll +(\\n[www-left-indent]u + \\n[www-image-gap]u)
+. wh \\n[www-left-ll-trap]u
+. nr www-left-ll-trap 0
+..
+.
+.\" www-handle-percent arg N1 N2 S1
+.\" arg - input string (number or number%)
+.\" output parameters:
+.\" N1 - name of number register 1=absolute 0=percentage
+.\" N2 - number register name for absolute value
+.\" S1 - string register name for percentage value
+.\"
+.de www-handle-percent
+. ds www-percent \\$1\"
+. substring www-percent -1 -1
+.
+. ie '\\*[www-percent]'%' \{\
+. ds www-abs \\$1\"
+. substring www-abs 0 -2
+. nr \\$2 0
+. nr \\$3 \\*[www-abs]
+. ds \\$4 \\$1\"
+. \}
+. el \{\
+. nr \\$2 1
+. nr \\$3 \\$1
+. ds \\$4 none\"
+. \}
+..
+.
+.\" --------------------------------------------------------------------
+.\" MPIMG [-R|-L] [-G gap] filename [width [height]]
+.\"
+.\" Include a PNG image and wrap text around it. It works for
+.\" -Tps and -Thtml. The default value for WIDTH is 1i; default value
+.\" for HEIGHT is WIDTH; the default alignment is left (-L).
+.\" -G is used to insert a gap between the text and the image.
+.\" The height and width can also be given as a percentage.
+.\" The PostScript device converts the percentage width into an
+.\" absolute value by using \\n[.l], and the height by using \\n[.p].
+.\"
+.\"
+.\" Note: This macro can only be used with the '-U' option of groff,
+.\" activating unsafe mode, if not used with -Thtml; the PNG image
+.\" is then converted to the EPS format using netpbm utilities.
+.\"
+.nr www-htmlimage-gap 0
+.
+.de MPIMG
+. nr www-image-just 1
+. nr www-image-gap 0
+. while (\\n[.$] > 0) \{\
+. if '-L'\\$1' \{\
+. nr www-image-just 1
+. shift
+. continue
+. \}
+. if '-R'\\$1' \{\
+. nr www-image-just 0
+. shift
+. continue
+. \}
+. if '-G'\\$1' \{\
+. nr www-image-gap \\$2
+. nr www-htmlimage-gap (\\$2 * 100 / 240)
+. shift 2
+. continue
+. \}
+. break
+. \}
+.
+. nr www-width 1i
+. nr www-height 1i
+. ds www-size-specs width="\\n[www-width]" height="\\n[www-height]"\"
+. ie !'\\$2'' \{\
+. nr www-is-absolute 0
+. nr www-absolute 0
+. ds www-percentage none\"
+. www-handle-percent \\$2 www-is-absolute www-absolute www-percentage
+. ie !\\n[www-is-absolute] \{\
+. \" percentage of linelength requested
+. nr www-width (\\n[www-absolute] * \\n[.l] / 100)
+. if \\n[www-html] \
+. nr www-width (\\n[www-width] * 100 / 240)
+. ds www-size-specs width="\\*[www-percentage]"\"
+. \}
+. el \{\
+. nr www-width \\n[www-absolute]
+. if \\n[www-html] \
+. nr www-width (\\n[www-width] * 100 / 240)
+. ds www-size-specs width="\\n[www-width]"\"
+. \}
+.
+. nr www-height \\n[www-width]
+. ie !'\\$3'' \{\
+. nr www-is-absolute 0
+. nr www-absolute 0
+. ds www-percentage none\"
+. www-handle-percent \\$3 www-is-absolute www-absolute www-percentage
+. ie !\\n[www-is-absolute] \{\
+. \" percentage of pagelength requested
+. nr www-height (\\n[www-absolute] * \\n[.p] / 100)
+. if \\n[www-html] \
+. nr www-height (\\n[www-height] * 100 / 240)
+. ds www-size-specs "\\*[www-size-specs] height="\\*[www-percentage]"\"
+. \}
+. el \{\
+. nr www-height \\n[www-absolute]
+. if \\n[www-html] \
+. nr www-height (\\n[www-height] * 100 / 240)
+. ds www-size-specs "\\*[www-size-specs] height="\\*[www-height]"\"
+. \}
+. \}
+. \}
+. el \{\
+. \" height not specified; use width value
+. ie !\\n[www-is-absolute] \{\
+. \" percentage value
+. ds www-size-specs "\\*[www-size-specs] height="\\*[www-percentage]"\"
+. nr www-height \\n[www-width]
+. \}
+. el \{\
+. ds www-size-specs "\\*[www-size-specs] height="\\*[www-width]"\"
+. nr www-height \\n[www-width]
+. \}
+. \}
+.
+. ie \\n[www-html] \{\
+. ie !\\n[www-image-just] \
+. HTML <img "src=""\\$1""" \
+ "alt=""Image \\$1""" \
+ "hspace=""\\n[www-htmlimage-gap]""" \
+ "align=""right""" \
+ "\\*[www-size-specs]\\*[www->]"
+. el \
+. HTML <img "src=""\\$1""" \
+ "alt=""Image \\$1""" \
+ "hspace=""\\n[www-htmlimage-gap]""" \
+ "align=""left""" \
+ "\\*[www-size-specs]\\*[www->]"
+. \}
+. el \{\
+. tm www-width is \\n[www-width]
+. tm www-height is \\n[www-height]
+. if !r ps4html \{\
+. www-make-unique-name
+. sy pngtopnm \\$1 \
+ | pnmcrop -white \
+ | @PNMTOPS_NOSETPAGE@ -noturn \
+ > \\*[www-unique-name].eps
+. ie !\\n[www-image-just] \{\
+. \" we must now disable a possible left image trap
+. sp -1
+. if (\\n[www-left-ll-trap] > 0) \
+. wh \\n[www-left-ll-trap]u
+. if (\\n[www-left-po-trap] > 0) \
+. wh \\n[www-left-po-trap]u
+. PSPIC -R \\*[www-unique-name].eps \\n[www-width]u \\n[www-height]u
+. sp -\\n[ps-desht]u
+.
+. nr www-right-indent \\n[ps-deswid]u
+. \" we want to have some space between text and image,
+. \" so the line length must be shorter
+. ll -(\\n[www-right-indent]u + \\n[www-image-gap]u)
+. mk www-right-ll-trap
+. nr www-right-ll-trap +(\\n[ps-desht]u - 1v)
+. wh \\n[www-right-ll-trap]u www-finish-right-ll
+.
+. \" now restore possible left trap
+. if (\\n[www-left-ll-trap] > 0) \
+. wh \\n[www-left-ll-trap]u www-finish-left-ll
+. if (\\n[www-left-po-trap] > 0) \
+. wh \\n[www-left-po-trap]u
+. \}
+. el \{\
+. \" we must now disable a possible right image trap
+. if (\\n[www-right-ll-trap] > 0) \
+. wh \\n[www-right-ll-trap]u
+. PSPIC -L \\*[www-unique-name].eps \\n[www-width]u \\n[www-height]u
+. sp -\\n[ps-desht]u
+.
+. nr www-left-indent \\n[ps-deswid]u
+. \" increase offset by gap
+. po +(\\n[www-left-indent]u + \\n[www-image-gap]u)
+. \" decrease line length by gap
+. ll -(\\n[www-left-indent]u + \\n[www-image-gap]u)
+. mk www-left-ll-trap
+. nr www-left-ll-trap +(\\n[ps-desht]u - 1v)
+. wh \\n[www-left-ll-trap]u www-finish-left-ll
+.
+. \" now restore possible right trap
+. if (\\n[www-right-ll-trap] > 0) \
+. wh \\n[www-right-ll-trap]u www-finish-right-ll
+. \}
+. \}
+. \}
+..
+.
+.\" --------------------------------------------------------------------
+.\" HnS n
+.\"
+.\" Begin heading. Heading level is N.
+.\"
+.\" HnE
+.\"
+.\" End heading.
+.\"
+.\" If your heading contains URL, FTP, MTO macros you might wish to
+.\" disable automatic links to headings. This can be done via '-P-l'
+.\" from the command line or by using a cakk to '.HX 0'.
+.\"
+.nr www-heading-no -1
+.
+.de HnS
+. ie '\\$1'' \
+. nr www-heading-no 1
+. el \
+. nr www-heading-no \\$1
+. DEVTAG-NH \\n[www-heading-no]
+..
+.
+.de HnE
+. if (\\n[www-heading-no] == -1) \
+. www-error HnE found without a corresponding HnS
+. DEVTAG-EO-H
+..
+.
+.\" --------------------------------------------------------------------
+.\" LK
+.\"
+.\" Emit the automatically collected links derived from
+.\" section/numbered headings at this position.
+.\"
+.de LK
+. DEVTAG .links
+..
+.
+.\" --------------------------------------------------------------------
+.\" HR
+.\"
+.\" Produce a horizontal line.
+.\"
+.de HR
+. HTML</p> <hr\\*[www->]
+..
+.
+.\" --------------------------------------------------------------------
+.\" NHR
+.\"
+.\" Suppress the generation of the top and bottom rules which grohtml
+.\" emits by default.
+.\"
+.de NHR
+. DEVTAG .no-auto-rule
+..
+.
+.\"
+.\" www-end-nowhere - end of input trap called to finish diversion.
+.\"
+.de www-end-nowhere
+. if !\\n[www-html] \
+. di
+. DEVTAG-EO-TL
+..
+.
+.\" --------------------------------------------------------------------
+.\" HTL
+.\"
+.\" Generate an HTML title only. This differs from the -ms .TL macro
+.\" which generates both an HTML title and an H1 heading.
+.\"
+.\" This is useful when an author wishes to use an HTML title as
+.\" search engine fodder but a graphic title in the document.
+.\"
+.\" The macro terminates when a space or break is seen (.sp, .br).
+.\"
+.de HTL
+. DEVTAG .html-tl
+. if !\\n[www-html] \
+. di www-nowhere
+. it 2 www-end-nowhere
+..
+.
+.\" --------------------------------------------------------------------
+.\" auxiliary definitions for lists
+.\"
+.ds www-ul-level1 \[bu]\ \ \"
+.ds www-ul-level2 \[sq]\ \ \"
+.ds www-ul-level3 \[ci]\ \ \"
+.nr www-ul-level 0
+.
+.ds www-ol-level1 decimal\"
+.ds www-ol-level2 lower-alpha\"
+.ds www-ol-level3 lower-roman\"
+.ds www-ol-tmp 00\ \ \"
+.nr www-ol-ctr1 0 1
+.nr www-ol-ctr2 0 1
+.nr www-ol-ctr3 0 1
+.af www-ol-ctr2 a
+.af www-ol-ctr3 i
+.nr www-ol-level 0
+.
+.nr www-dl-level 0
+.nr www-dl-shift 5n
+.
+.\"
+.\" allow nested lists
+.\"
+.nr www-depth 0
+.nr www-li-indent \n[.i]
+.ds www-level0 nop\"
+.ds www-level1
+.ds www-level2
+.ds www-level3
+.ds www-level4
+.ds www-level5
+.ds www-level6
+.ds www-level7
+.ds www-level8
+.ds www-level9
+.
+.\" which macro to use for LI
+.de www-push-li
+. nr www-li-indent \\n[.i]
+. nr www-depth +1
+. ds www-level\\n[www-depth] \\$1\"
+. ds www-ltag\\n[www-depth]
+. als LI \\$1
+..
+.
+.de www-pop-li
+. nr www-depth -1
+. als LI \\*[www-level\\n[www-depth]]
+..
+.
+.\" www-emit-ltag - shut down a previous open list tag
+.\" before issuing a new tag \\$1.
+.\" It then records tag \\$1 is open.
+.
+.de www-emit-ltag
+. if !'\\*[www-ltag\\n[www-depth]]'' \
+. HTML-NS </\\*[www-ltag\\n[www-depth]]>
+. if !'\\$1'' \
+. HTML-NS <\\$1>
+. ds www-ltag\\n[www-depth] \\$1\"
+..
+.
+.\"
+.\" Auxiliary macro for ULS.
+.\"
+.de www-push-ul-level
+. nr www-ul-level +1
+. if (\\n[www-ul-level] > 3) \
+. www-error ULS: too many levels of indentation (\\n[www-ul-level])
+..
+.\"
+.\" Auxiliary macro for ULE.
+.\"
+.de www-pop-ul-level
+. if !\\n[www-ul-level] \
+. www-error ULE: trying to terminate a list which does not exist
+. nr www-ul-level -1
+..
+.
+.\"
+.\" Auxiliary macro for OLS.
+.\"
+.de www-push-ol-level
+. nr www-ol-level +1
+. if (\\n[www-ol-level] > 3) \
+. www-error OLS: too many levels of indentation (\\n[www-ol-level])
+..
+.
+.\"
+.\" Auxiliary macro for OLE.
+.\"
+.de www-pop-ol-level
+. if !\\n[www-ol-level] \
+. www-error OLE: trying to terminate a list which does not exist
+. nr www-ol-level -1
+..
+.
+.\" --------------------------------------------------------------------
+.\" ULS
+.\"
+.\" Start an unordered list.
+.\"
+.de ULS
+. www-push-li www-li-ul
+. www-push-ul-level
+. ie \\n[www-html] \{\
+. www-emit-ltag
+. HTML</p> <ul>
+. \}
+. el \
+. nr www-li-indent +\w'\\*[www-ul-level\\n[www-ul-level]]'u
+..
+.
+.\" --------------------------------------------------------------------
+.\" ULE
+.\"
+.\" End an unordered list.
+.\"
+.de ULE
+. ie \\n[www-html] \{\
+. www-emit-ltag
+. HTML</p> </ul>
+. \}
+. el \{\
+. nr www-li-indent -\w'\\*[www-ul-level\\n[www-ul-level]]'u
+. in \\n[www-li-indent]u
+. \}
+. www-pop-ul-level
+. www-pop-li
+..
+.
+.\" --------------------------------------------------------------------
+.\" OLS
+.\"
+.\" Start an ordered list.
+.\"
+.de OLS
+. www-push-li www-li-ol
+. www-push-ol-level
+. ie \\n[www-html] \{\
+. www-emit-ltag
+. HTML</p> <ol "style=""list-style-type:" \
+ "\\*[www-ol-level\\n[www-ol-level]]"">"
+. \}
+. el \
+. nr www-li-indent +\w'\\*[www-ol-tmp]'u
+..
+.
+.\" --------------------------------------------------------------------
+.\" OLE
+.\"
+.\" End an ordered list.
+.\"
+.de OLE
+. ie \\n[www-html] \{\
+. www-emit-ltag
+. HTML </ol>
+. \}
+. el \{\
+. nr www-li-indent -\w'\\*[www-ol-tmp]'u
+. in \\n[www-li-indent]u
+. nr www-ol-ctr\\n[www-ol-level] 0 1
+. \}
+. www-pop-ol-level
+. www-pop-li
+..
+.
+.\" --------------------------------------------------------------------
+.\" DLS
+.\"
+.\" Start a definition list.
+.\"
+.de DLS
+. www-push-li www-li-dl
+. nr www-dl-level +1
+. ie \\n[www-html] \{\
+. www-emit-ltag
+. HTML</p> <dl>
+. \}
+. el \{\
+. nr www-li-indent +\\n[www-dl-shift]u
+. in \\n[www-li-indent]u
+. \}
+..
+.
+.\" --------------------------------------------------------------------
+.\" DLE
+.\"
+.\" End a definition list.
+.\"
+.de DLE
+. ie \\n[www-html] \{\
+. www-emit-ltag
+. HTML </dl>
+. \}
+. el \{\
+. nr www-li-indent -\\n[www-dl-shift]u
+. in \\n[www-li-indent]u
+. \}
+. nr www-dl-level -1
+. www-pop-li
+..
+.
+.\" --------------------------------------------------------------------
+.\" LI
+.\"
+.\" Insert a list item.
+.\"
+.
+.\" ********
+.\" www-li-ul - bulleted list item
+.\"
+.de www-li-ul
+. ie \\n[www-html] \
+. www-emit-ltag li
+. el \{\
+. www:paraspace
+. if rPORPHANS \
+. ne \\n[PORPHANS]v
+. in \\n[www-li-indent]u
+. ti -\w'\\*[www-ul-level\\n[www-ul-level]]'u
+. nop \\*[www-ul-level\\n[www-ul-level]]\c
+. \}
+..
+.
+.\" ********
+.\" www-li-ol - numbered list item
+.\"
+.de www-li-ol
+. ie \\n[www-html] \
+. www-emit-ltag li
+. el \{\
+. www:paraspace
+. if rPORPHANS \
+. ne \\n[PORPHANS]v
+. in \\n[www-li-indent]u
+. ti -\w'\\n+[www-ol-ctr\\n[www-ol-level]]\ \ 'u
+. nop \\n[www-ol-ctr\\n[www-ol-level]]\ \ \c
+. \}
+..
+.
+.\" ********
+.\" www-li-dl - definition list item
+.\"
+.de www-li-dl
+. ie \\n[www-html] \{\
+. HTML <dt>\\$1</dt>
+. www-emit-ltag dd
+. \}
+. el \{\
+. www:paraspace
+. if rPORPHANS \
+. ne \\n[PORPHANS]v
+. in \\n[www-li-indent]u
+. ti -\\n[www-dl-shift]u
+. nop \&\\$1
+. br
+. \}
+..
+.
+.\" --------------------------------------------------------------------
+.\" DC l text [color]
+.\"
+.\" L is the letter to be dropped and enlarged.
+.\"
+.\" TEXT is the following text whose height the first letter should
+.\" not exceed.
+.\"
+.\" COLOR is the optional color of the dropped letter (default black).
+.\"
+.de DC
+. ds www-dropcolor black\"
+. if !'\\$3'' \
+. ds www-dropcolor \\$3\"
+. ie '\*[.T]'html' \{\
+. www-make-unique-name
+. nr www-drop-width (100u * \\n[.v]u * 3u / \\n[.l]u)
+. MPIMG -L \\*[www-unique-name].png \\n[www-drop-width]%
+. \}
+. el \{\
+. ie r ps4html \{\
+. www-make-unique-name
+. \" To avoid interferences with another DC macro call which is
+. \" located very near to the current one, we draw the glyph on a
+. \" separate page. Otherwise it could theoretically happen that
+. \" the dropped capital glyphs overlap.
+. bp
+. ev www-DC
+. vs 320p
+. nop \O[5i\\*[www-unique-name].png]\O[1]
+. nop \m[\\*[www-dropcolor]]\s[160]\O[3]\\$1\O[4]
+. nop \O[2]\O[0]
+. br
+. ev
+. bp
+. \}
+. el \{\
+. ie n \
+. nop \\$1\c
+. el \{\
+. nr dummy \w'\\$1'u
+. nr dcht ((\\n[.v] + \\n[rst]) * \\n[.ps] / \\n[rst])
+. char \[dcap] \m[\\*[www-dropcolor]]\s'\\n[dcht]u'\\$1
+. nop \v'\\n[.v]u'\\[dcap]\v'-\\n[.v]u'\c
+' ti \w'\\[dcap]'u
+. \}
+. \}
+. \}
+. nop \\$2
+..
+.
+.\"
+.\" supplementary macros used by other macro sets
+.\"
+.\" here are some tags specially for -Tps or -Thtml when invoked by
+.\" pre-html to generate PNG images from postscript.
+.
+.\" --------------------------------------------------------------------
+.\" HTML-DO-IMAGE - tell troff to issue an image marker which can be
+.\" read back by pre-html
+.\"
+.de HTML-DO-IMAGE
+. if r ps4html \
+. nop \O[5\\$2\\$1.png]\O[1]\O[3]
+. if \\n[www-html] \
+. nop \O[5\\$2\\$1.png]\O[0]\O[3]
+..
+.
+.\" --------------------------------------------------------------------
+.\" HTML-IMAGE-END - terminate an image for HTML
+.\"
+.de HTML-IMAGE-END
+. if r ps4html \
+. nop \O[4]\O[2]\O[0]
+. if \\n[www-html] \
+. nop \O[4]\O[2]\O[1]
+..
+.
+.nr www-png-no 0
+.
+.\" --------------------------------------------------------------------
+.\" www-make-unique-name - generate another unique name in string
+.\" 'www-unique-name'
+.\"
+.de www-make-unique-name
+. nr www-png-no +1
+. ds www-unique-name \\*[www-image-template]\\n[www-png-no]\"
+..
+.
+.\" --------------------------------------------------------------------
+.\" HTML-IMAGE and friends tell grohtml that this region of text needs
+.\" to be rendered as an image.
+.\"
+.de HTML-IMAGE
+. \" generates a centered image
+. www-make-unique-name
+. HTML-DO-IMAGE \\*[www-unique-name] c
+..
+.
+.de HTML-IMAGE-RIGHT
+. www-make-unique-name
+. HTML-DO-IMAGE \\*[www-unique-name] r
+..
+.
+.de HTML-IMAGE-LEFT
+. www-make-unique-name
+. HTML-DO-IMAGE \\*[www-unique-name] l
+..
+.
+.de HTML-IMAGE-INLINE
+. www-make-unique-name
+. HTML-DO-IMAGE \\*[www-unique-name] i
+..
+.
+.\" EQN-HTML-IMAGE and friends check to see whether the equation is
+.\" not in an image, in which case it allows HTML
+.\" (mathml) to be generated (if -Txhtml was specified).
+.
+.de EQN-HTML-IMAGE
+. \" generates a centered image
+. www-make-unique-name
+. EQN-HTML-DO-IMAGE \\*[www-unique-name] c
+..
+.
+.de EQN-HTML-IMAGE-RIGHT
+. www-make-unique-name
+. EQN-HTML-DO-IMAGE \\*[www-unique-name] r
+..
+.
+.de EQN-HTML-IMAGE-LEFT
+. www-make-unique-name
+. EQN-HTML-DO-IMAGE \\*[www-unique-name] l
+..
+.
+.de EQN-HTML-IMAGE-INLINE
+. www-make-unique-name
+. EQN-HTML-DO-IMAGE \\*[www-unique-name] i
+..
+.
+.\" --------------------------------------------------------------------
+.\" EQN-HTML-DO-IMAGE - tell troff to issue an image marker which can be
+.\" read back by pre-html
+.\"
+.de EQN-HTML-DO-IMAGE
+. ie r xhtml \{\
+. if !(\\n[.O] == 0) \{\
+. if r ps4html \
+. nop \O[5\\$2\\$1.png]\O[1]\O[3]
+. if \\n[www-html] \
+. nop \O[5\\$2\\$1.png]\O[0]\O[3]
+. \}
+. \}
+. el \
+. HTML-DO-IMAGE \\$*
+..
+.
+.\" --------------------------------------------------------------------
+.\" EQN-HTML-IMAGE-END - terminate an image for HTML
+.\"
+.de EQN-HTML-IMAGE-END
+. ie r xhtml \{\
+. if !(\\n[.O] == 0) \{\
+. if r ps4html \
+. nop \O[4]\O[2]\O[0]
+. if \\n[www-html] \
+. nop \O[4]\O[2]\O[1]
+. \}
+. \}
+. el \
+. HTML-IMAGE-END
+..
+.
+.\" --------------------------------------------------------------------
+.\" Setup around HTML-IMAGE and friends
+.\"
+.\" now set up TS, TE, EQ, EN default macros
+.\"
+.\" we must not use '.als': the definition of .TE in s.tmac, for
+.\" example, calls .HTML-IMAGE-END, which would refer to itself due to
+.\" the alias, causing an endless loop
+.\"
+.if !d TS \{\
+. de TS
+. HTML-IMAGE \\$@
+. if \\n[www-html] \{\
+. nr www-TS-ll \\n[.l]
+. ll 1000n
+. \}
+. .
+.\}
+.if !d TE \{\
+. de TE
+. if \\n[www-html] \
+. ll \\n[www-TS-ll]u
+. HTML-IMAGE-END \\$@
+. .
+.\}
+.if !d EQ \{\
+. de EQ
+. EQN-HTML-IMAGE \\$@
+. if \\n[www-html] \{\
+. nr www-EQ-ll \\n[.l]
+. ll 1000n
+. \}
+. .
+.\}
+.if !d EN \{\
+. de EN
+. if \\n[www-html] \
+. ll \\n[www-EQ-ll]u
+. EQN-HTML-IMAGE-END \\$@
+. .
+.\}
+.
+.\" --------------------------------------------------------------------
+.\" JOBNAME
+.\"
+.\" Generate multiple output files containing the HTML.
+.\" A file is split whenever a .SH or .NH 1 is encountered.
+.\" The argument to JOBNAME is the file stem for future output files.
+.\"
+.de JOBNAME
+. DEVTAG .job-name \\$1
+..
+.
+.\" --------------------------------------------------------------------
+.\" HEAD
+.\"
+.\" Add information to the <head> </head> section of the HTML
+.\" document
+.\"
+.de HEAD
+. DEVTAG .head "\\$*"
+..
+.
+.\" --------------------------------------------------------------------
+.\" start of some code
+.\"
+.de CDS
+. ft CR
+. nf
+..
+.
+.\" --------------------------------------------------------------------
+.\" end of some code
+.\"
+.de CDE
+. fi
+. ft P
+..
+.
+.ds www-nav-colour #eeeeee\"
+.nr www-nav-width-left 30
+.nr www-nav-width-right 70
+.
+.\" --------------------------------------------------------------------
+.\" LNS - left navigation start
+.\"
+.de LNS
+. HTML</p> <table><tr><td "valign=""top""" \
+ "width=""\\n[www-nav-width-left]%""" \
+ "bgcolor=""\\*[www-nav-colour]"">"
+. LK
+. HTML</p> </td><td "valign=""top""" \
+ "width=""\\n[www-nav-width-right]%"">"
+. nr SH-open 1
+..
+.
+.\" --------------------------------------------------------------------
+.\" LNE - left navigation end
+.\"
+.de LNE
+. HTML</p> </td></tr></table>
+. HR
+..
+.
+.nr SH-open 0
+.nr needs-begin 0
+.
+.\"
+.\" some auxiliary macros for left navigation lists
+.\"
+.de www-SH
+. if (0\\$1 == 0) \{\
+. if (\\n[SH-open] == 1) \
+. LNE
+. nr needs-begin 1
+. @SH-old
+. \}
+..
+.
+.de www-NH
+. if (0\\$1 <= 1) \{\
+. if (\\n[SH-open] == 1) \
+. LNE
+. nr needs-begin 1
+. @NH-old
+. \}
+..
+.
+.de www-LP
+. @LP-old
+. if (\\n[needs-begin] == 1) \{\
+. HR
+. LNS
+. \}
+. nr needs-begin 0
+..
+.
+.\" --------------------------------------------------------------------
+.\" ALN [colour] [left width percentage]
+.\"
+.\" Turn on automatic left navigation. This macro should only be
+.\" called once (normally at the start of the document) as it
+.\" indicates that all top-level section headings form a navigation
+.\" list on the left of the main text.
+.\"
+.de ALN
+. if '\*[.T]'html' \{\
+. if !'\\$1'' \
+. ds www-nav-colour \\$1\"
+. if (0\\$2 > 0) \{\
+. nr www-nav-width-left \\$2
+. nr www-nav-width-right (100 - \\$2)
+. \}
+. rn @SH @SH-old
+. rn www-SH @SH
+. rn @NH @NH-old
+. rn www-NH @NH
+. rn @LP @LP-old
+. rn www-LP @LP
+. \}
+..
+.
+.\" --------------------------------------------------------------------
+.\" LINKSTYLE color [fontstyle [openglyph closeglyph]]
+.\"
+.\" Initialize www.tmac so that when this macro set is used with
+.\" non-HTML devices the urls are rendered the user defined
+.\" attributes. For example:
+.\"
+.\" LINKSTYLE blue CR < >
+.\"
+.de LINKSTYLE
+. if (\\n[.$] < 1) \
+. www:error .\\$0 expects at least 1 argument, got \\n[.$]
+. ds www:color \\$1\"
+. shift
+. if (\\n[.$] < 1) \
+. return
+. ds www:fontstyle \\$1\"
+. shift
+. if (\\n[.$] < 1) \
+. www:error .\\$0 expects both open and close glyphs to be specified
+. ds www:open \\$1\"
+. ds www:close \\$2\"
+..
+.
+.\" MATHML - enable eqn mathml output to pass through to the device
+.\" driver
+.
+.de MATHML
+. if (\\n[.O] == 0) \
+. MATH<?p> \\$*
+..
+.
+.\" --------------------------------------------------------------------
+.\" final setup
+.\" --------------------------------------------------------------------
+.
+.LINKSTYLE blue CR \[la] \[ra]
+.
+.if \n[www-html] \{\
+. nh
+. nr HY 0
+.\}
+.
+.if r ps4html .nop \O[0]
+.cp \n[*groff_www_tmac_in_C]
+.do rr *groff_www_tmac_in_C
+.
+.\" now set
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/tmac/zh.tmac b/tmac/zh.tmac
new file mode 100644
index 0000000..3b34724
--- /dev/null
+++ b/tmac/zh.tmac
@@ -0,0 +1,61 @@
+.\" Chinese localization for groff
+.\"
+.\" Copyright (C) 2015-2020 Free Software Foundation, Inc.
+.\" Written by Darcy SHEN <sadhen1992@gmail.com>
+.\" using 'ja.tmac' as a template
+.\"
+.\" 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 3 of the License, 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 this program. If not, see
+.\" <http://www.gnu.org/licenses/>.
+.\"
+.\" Please send comments to groff@gnu.org.
+.
+.do nr *groff_zh_tmac_C \n[.cp]
+.cp 0
+.
+.
+.\" The following rules work for both zh_CN and zh_TW.
+.
+.ds locale chinese\"
+.
+.
+.class [CJKprepunct] \
+ , : ; > } \
+ \[u2026] \[u201D] \
+ \[u3001] \[u3002] \[u3009] \[u300B] \[u300D] \[u300F] \[u3011] \
+ \[uFF01] \[uFF09] \[uFF0C] \[uFF1A] \[uFF1B] \[uFF1F]
+.class [CJKpostpunct] \
+ \[u201C] \[u3008] \[u300A] \[u300C] \[u300E] \[u3010] \[uFF08]
+.
+.\" Chinese glyphs.
+.class [CJKnormal] \
+ \[u4E00]-\[u9FFF]
+.
+.cflags 128 \C'[CJKprepunct]'
+.cflags 266 \C'[CJKpostpunct]'
+.cflags 512 \C'[CJKnormal]'
+.
+.\" Chinese hyphenation (disabled)
+.nr \*[locale]*hyphenation-mode-base 0
+.nr \*[locale]*hyphenation-mode-trap 0
+.
+.cp \n[*groff_zh_tmac_C]
+.do rr *groff_zh_tmac_C
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" fill-column: 72
+.\" End:
+.\" vim: set filetype=groff textwidth=72: